ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjMjlmZQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEwIEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdC4gSXQgaXMgY29uc2lkZXJlZAorIyAgICBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLgorIworIyAgICBUaGlzIGRvY3VtZW50IG1heSBub3QgYmUgcmVwcm9kdWNlZCBvciB0cmFuc21pdHRlZCBpbiBhbnkgZm9ybSwKKyMgICAgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YKKyMgICAgTmVzdC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlZmlsZSBmb3IgYy1rZXJtaXQsIGEgY29tYmluZWQgc2VyaWFsIGFuZAorIyAgICAgIG5ldHdvcmsgY29tbXVuaWNhdGlvbiBzb2Z0d2FyZSBwYWNrYWdlLgorIworCitCdWlsZENvbmZpZ1NwZWNpYWxpemVkCTo9IE5vCitCdWlsZFByb2R1Y3RTcGVjaWFsaXplZAk6PSBObworCitpbmNsdWRlIHByZS5tYWsKKworUGFja2FnZU5hbWUJCTo9IGNrZXJtaXQKKworUGFja2FnZUV4dGVuc2lvbgk6PSB0YXIuZ3oKK1BhY2thZ2VTZXBhcmF0b3IJOj0gLQorCitQYWNrYWdlUGF0Y2hBcmdzCTo9CisKK1BhY2thZ2VBcmNoaXZlCQk6PSAkKFBhY2thZ2VOYW1lKS4kKFBhY2thZ2VFeHRlbnNpb24pCitQYWNrYWdlU291cmNlRGlyCTo9ICQoUGFja2FnZU5hbWUpJChQYWNrYWdlU2VwYXJhdG9yKSQoUGFja2FnZVZlcnNpb24pCisKK1BhY2thZ2VCdWlsZE1ha2VmaWxlCT0gJChjYWxsIEdlbmVyYXRlQnVpbGRQYXRocyxtYWtlZmlsZSkKKworQ2xlYW5QYXRocwkJKz0gJChQYWNrYWdlTGljZW5zZUZpbGUpCisKK05DdXJzZXNEaXIJCTo9IHN3L3Rwcy9uY3Vyc2VzCitOQ3Vyc2VzSW5jRGlyCQk6PSAkKGNhbGwgR2VuZXJhdGVSZXN1bHRQYXRocywkKE5DdXJzZXNEaXIpLHVzci9pbmNsdWRlKQorTkN1cnNlc0xpYkRpcgkJOj0gJChjYWxsIEdlbmVyYXRlUmVzdWx0UGF0aHMsJChOQ3Vyc2VzRGlyKSx1c3IvbGliKQorCithbGw6ICQoUGFja2FnZURlZmF1bHRHb2FsKQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGxpY2Vuc2UgY29udGVudHMuCisKKyQoUGFja2FnZVNvdXJjZURpcikvQ09QWUlORy5UWFQ6IHNvdXJjZQorCiskKFBhY2thZ2VMaWNlbnNlRmlsZSk6ICQoUGFja2FnZVNvdXJjZURpcikvQ09QWUlORy5UWFQKKwkkKGNvcHktcmVzdWx0KQorCisjIEV4dHJhY3QgdGhlIHNvdXJjZSBmcm9tIHRoZSBhcmNoaXZlIGFuZCBhcHBseSBwYXRjaGVzLCBpZiBhbnkuCisKKyQoUGFja2FnZVNvdXJjZURpcik6ICQoUGFja2FnZUFyY2hpdmUpICQoUGFja2FnZVBhdGNoUGF0aHMpCisJJChjcmVhdGUtZGlyZWN0b3J5KQorCSQoY2FsbCBleHBhbmQtYXJjaGl2ZSwkKFBhY2thZ2VBcmNoaXZlKSwkKEApKQorCSQoVmVyYm9zZSl0b3VjaCAkKEApCisJJChjYWxsIHBhdGNoLWRpcmVjdG9yeSwkKEApLCQoUGFja2FnZVBhdGNoQXJncyksJChQYWNrYWdlUGF0Y2hQYXRocykpCisKKyMgUHJlcGFyZSB0aGUgc291cmNlcy4KKworLlBIT05ZOiBzb3VyY2UKK3NvdXJjZTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpCisKKyMgUGF0Y2ggdGhlIHNvdXJjZXMsIGlmIG5lY2Vzc2FyeS4KKworLlBIT05ZOiBwYXRjaAorcGF0Y2g6IHNvdXJjZQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGJ1aWxkIG1ha2VmaWxlLgorCiskKFBhY2thZ2VCdWlsZE1ha2VmaWxlKTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpICQoQnVpbGREaXJlY3RvcnkpCisJJChjYWxsIGNyZWF0ZS1saW5rcywkKENVUkRJUikvJChQYWNrYWdlU291cmNlRGlyKSwkKEJ1aWxkRGlyZWN0b3J5KSkKKworIyBDb25maWd1cmUgdGhlIHNvdXJjZSBmb3IgYnVpbGRpbmcuCisKKy5QSE9OWTogY29uZmlndXJlCitjb25maWd1cmU6IHNvdXJjZSAkKFBhY2thZ2VCdWlsZE1ha2VmaWxlKQorCisjIEJ1aWxkIHRoZSBzb3VyY2UuCisjCisjIFdlIGhhdmUgdG8gdW5zZXQgTUFLRUZMQUdTIHNpbmNlIHRoZXkgY29uZnVzZSB0aGUgcGFja2FnZSBidWlsZCBvdGhlcndpc2UuCisKKy5QSE9OWTogYnVpbGQKK2J1aWxkOiBjb25maWd1cmUKKwkkKFZlcmJvc2UpdW5zZXQgTUFLRUZMQUdTICYmIFwKKwkkKE1BS0UpICQoSk9CU0ZMQUcpIC1DICQoQnVpbGREaXJlY3RvcnkpIFwKKwlJTlNUQUxMPSIkKElOU1RBTEwpICQoSU5TVEFMTEZMQUdTKSIgXAorCUNDPSIkKENDKSIgQ1hYPSIkKENYWCkiIEFSPSQoQVIpIE5NPSQoTk0pIFJBTkxJQj0kKFJBTkxJQikgU1RSSVA9JChTVFJJUCkgXAorCU5DVVJTRVNfQ1BQRkxBR1M9JChjYWxsIFRvb2xHZW5lcmF0ZUluY2x1ZGVBcmd1bWVudCwkKE5DdXJzZXNJbmNEaXIpKSBcCisJTkNVUlNFU19MREZMQUdTPSQoY2FsbCBUb29sR2VuZXJhdGVMaWJyYXJ5UGF0aEFyZ3VtZW50LCQoTkN1cnNlc0xpYkRpcikpIFwKKwlsaW51eC1jcm9zcworCisjIFN0YWdlIHRoZSBidWlsZCB0byBhIHRlbXBvcmFyeSBpbnN0YWxsYXRpb24gYXJlYS4KKyMKKyMgV2UgaGF2ZSB0byB1bnNldCBNQUtFRkxBR1Mgc2luY2UgdGhleSBjb25mdXNlIHRoZSBwYWNrYWdlIGJ1aWxkIG90aGVyd2lzZS4KKworLlBIT05ZOiBzdGFnZQorc3RhZ2U6IGJ1aWxkIHwgJChSZXN1bHREaXJlY3RvcnkpCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKEJ1aWxkRGlyZWN0b3J5KSBcCisJSU5TVEFMTD0iJChJTlNUQUxMKSAkKElOU1RBTExGTEFHUykiIFwKKwlERVNURElSPSQoUmVzdWx0RGlyZWN0b3J5KSBcCisJcHJlZml4PS91c3IgXAorCU1BTkRJUj0iIiBcCisJaW5zdGFsbAorCitjbGVhbjoKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKFBhY2thZ2VTb3VyY2VEaXIpCisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgLXIgJChCdWlsZERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKFJlc3VsdERpcmVjdG9yeSkKKworaW5jbHVkZSBwb3N0Lm1hawpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL0NPUFlJTkcuVFhUIGIvY2tlcm1pdC04LjAuMjExL0NPUFlJTkcuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNWQzOWUKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvQ09QWUlORy5UWFQKQEAgLTAsMCArMSwxMDYgQEAKK1RIRSBDLUtFUk1JVCA3LjAgQU5EIDguMCBMSUNFTlNFCisKKyAgTGFzdCB1cGRhdGU6IFRodSBNYXkgIDEgMTM6NTI6MTUgMjAwMworCitUaGlzIGlzIHRoZSBuZXcgQy1LZXJtaXQgNy4wIGFuZCA4LjAgbGljZW5zZS4gIFRoZSBpbnRlbnRpb24gaXMgdG8gYWxsb3cKK0MtS2VybWl0IHRvIGJlIGRpc3RyaWJ1dGVkIHdpdGggImZyZWUiIG9wZXJhdGluZyBzeXN0ZW1zIHN1Y2ggYXMgR05VL0xpbnV4LAorRnJlZUJTRCwgTmV0QlNELCBPcGVuQlNELCBUaGUgSHVyZCwgZXRjLCBldmVuIHdoZW4gdGhlIGRpc3RyaWJ1dGlvbnMKK3RoZW1zZWx2ZXMgKHN1Y2ggYXMgUmVkIEhhdCBvciBDYWxkZXJhKSBtaWdodCBiZSBzb2xkIGFuZC9vciBtaWdodCBpbmNsdWRlCithcHBsaWNhdGlvbnMgdGhhdCBhcmUgbm90IGZyZWUsIGFuZCB5ZXQgc3RpbGwgcmVxdWlyZSBhIGxpY2Vuc2UgdG8gaW5jbHVkZQorQy1LZXJtaXQgaW4gb3Igd2l0aCAibm9uLWZyZWUiIHByb2R1Y3RzIHN1Y2ggYXMgY29tbWVyY2lhbCBPUydzLCBjb21tZXJjaWFsCitzb2Z0d2FyZSBwYWNrYWdlcywgZW1iZWRkZWQgc3lzdGVtcywgYW5kIGhhcmR3YXJlIChvdGhlciB0aGFuIGdlbmVyYWwtcHVycG9zZQorY29tcHV0ZXJzIHByZWxvYWRlZCB3aXRoICJmcmVlIiBvcGVyYXRpbmcgc3lzdGVtcyksIHNpbmNlIHRoZXNlIGxpY2Vuc2VzCitmdXJuaXNoIGEgbGFyZ2UgcG9ydGlvbiBvZiB0aGUgS2VybWl0IFByb2plY3QncyBmdW5kaW5nLgorCitUaGVyZSBoYXZlIGJlZW4gc29tZSBxdWVzdGlvbnMgYWJvdXQgdGhlIHByb3Zpc2lvbiBpbiBDbGF1c2UgKEEpIHRoYXQ6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZQorICAgIEMtS2VybWl0IHNvdXJjZSBjb2RlIG1heSBub3QgYmUgY2hhbmdlZCB3aXRob3V0IHRoZSBjb25zZW50IG9mIHRoZQorICAgIEtlcm1pdCBQcm9qZWN0LCB3aGljaCB3aWxsIG5vdCBiZSB1bnJlYXNvbmFibHkgd2l0aGhlbGQgKHRoaXMgaXMKKyAgICBzaW1wbHkgYSBtYXR0ZXIgb2Yga2VlcGluZyBhIGNvbnNpc3RlbnQgYW5kIHN1cHBvcnRhYmxlIGNvZGUgYmFzZSkuCisKK1RoZSBpbnRlbnRpb24gb2YgdGhpcyBjbGF1c2UgaXMgcHJpbWFyaWx5IHRvIG1ha2Ugc3VyZSB0aGF0IGFueWJvZHkgd2hvCittYWtlcyBtb2RpZmljYXRpb25zIHNlbmRzIHRoZW0gYmFjayB0byB1cywgc2luY2Ugd2UgYXJlIHRoZSBvbmVzIGhhdmUgdG8KK3N1cHBvcnQgQy1LZXJtaXQsIGFuZCBzbyB3ZSBjYW4gY2FycnkgdGhlbSB0aHJvdWdoIHRvIGZ1dHVyZSByZWxlYXNlcyAoc28KK3lvdSBkb24ndCBoYXZlIHRvIG1ha2UgdGhlIHNhbWUgY2hhbmdlcyBhZ2FpbiBhbmQgYWdhaW4pLgorCitTZWNvbmRhcmlseSBpdCBpcyB0byBwcm90ZWN0IENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIHVubGlrZWx5IGV2ZW50IG9mCittb2RpZmljYXRpb25zIG1hZGUgd2l0aCBkZWxpYmVyYXRlIGludGVudCB0byBvZmZlbmQgb3IgY2F1c2UgZGFtYWdlLgorCitBbnkgcmVkaXN0cmlidXRvciBvZiBDLUtlcm1pdCB1bmRlciBDbGF1c2UgKEEpIGJlbG93IHNob3VsZCByZXN0IGFzc3VyZWQKK3RoZXJlIGlzIG5vIGludGVudGlvbiBvZiBwcmV2ZW50aW5nIHRoZW0gZnJvbSBjb25zdHJ1Y3RpbmcgYSBkaXN0cmlidXRpb24gaW4KK3RoZSBhcHByb3ByaWF0ZSBmb3JtYXQgKFJQTSBvciB3aGF0ZXZlcikgZm9yIHRoZWlyIHByb2R1Y3Qgb3IgZnJvbSBpc3N1aW5nCithbnkgcGF0Y2hlcyByZXF1aXJlZCBmb3IgdGhlaXIgcHJvZHVjdHM7IHdlIHNpbXBseSB3YW50IHRvIGJlIGluZm9ybWVkIHNvIHdlCitjYW4gbWFpbnRhaW4gYSBjb25zaXN0ZW50IGNvZGUgYmFzZSBhbmQgYSBzb2xpZCwgc3VwcG9ydGFibGUgc29mdHdhcmUKK3BhY2thZ2UuICBXZSBhcmUgaGFwcHkgdG8gd29yayB3aXRoIGFueSByZWRpc3RyaWJ1dG9yIGFuIGFueSBpc3N1ZXMgdGhhdAorY29uY2VybiB0aGVtLiAgSWYgeW91IGhhdmUgcXVlc3Rpb25zLCBzZW5kIHRoZW0gdG8ga2VybWl0QGNvbHVtYmlhLmVkdS4KKworTm90ZTogQWxsIGNoYW5nZXMgdG8gdGhpcyBmaWxlIHNpbmNlIDEgSmFudWFyeSAyMDAwICh0aGUgQy1LZXJtaXQgNy4wCityZWxlYXNlIGRhdGUpIGFyZSBhYm92ZTsgdGhlIGxpY2Vuc2UgaXRzZWxmIGhhcyBub3QgY2hhbmdlZCwgZXhjZXB0IHRvCit1cGRhdGUgdGhlIG1vc3QgcmVjZW50IGNvcHlyaWdodCBkYXRlLgorCisoQmVnaW4pCisKK0NvcHlyaWdodCAoQykgMTk4NSwgMjAwMywKKyAgVGhlIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1BFUk1JU1NJT05TOgorCitUaGUgQy1LZXJtaXQgc29mdHdhcmUgbWF5IGJlIG9idGFpbmVkIGRpcmVjdGx5IGZyb20gdGhlIEtlcm1pdCBQcm9qZWN0IGF0CitDb2x1bWJpYSBVbml2ZXJzaXR5IChvciBmcm9tIGFueSBzb3VyY2UgZXhwbGljaXRseSBsaWNlbnNlZCBieSB0aGUgS2VybWl0CitQcm9qZWN0IG9yIGltcGxpY2l0bHkgbGljZW5zZWQgYnkgQ2xhdXNlIChBKSBiZWxvdykgYnkgYW55IGluZGl2aWR1YWwgZm9yCitoaXMgb3IgaGVyIE9XTiBVU0UsIGFuZCBieSBhbnkgY29tcGFueSBvciBvdGhlciBvcmdhbml6YXRpb24gZm9yIGl0cyBvd24KK0lOVEVSTkFMIERJU1RSSUJVVElPTiBhbmQgdXNlLCBpbmNsdWRpbmcgaW5zdGFsbGF0aW9uIG9uIHNlcnZlcnMgdGhhdCBhcmUKK2FjY2Vzc2VkIGJ5IGN1c3RvbWVycyBvciBjbGllbnRzLCBXSVRIT1VUIEVYUExJQ0lUIExJQ0VOU0UuCisKK0NvbmRpdGlvbnMgZm9yIFJFRElTVFJJQlVUSU9OIGFyZSBhcyBmb2xsb3dzOgorCisoQSkgVGhlIEMtS2VybWl0IHNvZnR3YXJlLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeSBmb3JtLCBtYXkgYmUKKyAgICBpbmNsdWRlZCBXSVRIT1VUIEVYUExJQ0lUIExJQ0VOU0UgaW4gZGlzdHJpYnV0aW9ucyBvZiBPUEVSQVRJTkcKKyAgICBTWVNURU1TIHRoYXQgaGF2ZSBPU0kgKE9wZW4gU291cmNlIEluaXRpYXRpdmUsIHd3dy5vcGVuc291cmNlLm9yZykKKyAgICBhcHByb3ZlZCBsaWNlbnNlcywgZXZlbiBpZiBub24tT3Blbi1Tb3VyY2UgYXBwbGljYXRpb25zIChidXQgbm90CisgICAgb3BlcmF0aW5nIHN5c3RlbXMpIGFyZSBpbmNsdWRlZCBpbiB0aGUgc2FtZSBkaXN0cmlidXRpb24uICBTdWNoCisgICAgZGlzdHJpYnV0aW9ucyBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBDRC1ST00sIEZUUCBzaXRlLAorICAgIFdlYiBzaXRlLCBvciBwcmVpbnN0YWxsZWQgc29mdHdhcmUgb24gYSBuZXcgR0VORVJBTC1QVVJQT1NFCisgICAgY29tcHV0ZXIsIGFzIGxvbmcgYXMgdGhlIHByaW1hcnkgY2hhcmFjdGVyIG9mIHRoZSBkaXN0cmlidXRpb24gaXMKKyAgICBhbiBPcGVuIFNvdXJjZSBvcGVyYXRpbmcgc3lzdGVtIHdpdGggYWNjb21wYW55aW5nIHV0aWxpdGllcy4gIFRoZQorICAgIEMtS2VybWl0IHNvdXJjZSBjb2RlIG1heSBub3QgYmUgY2hhbmdlZCB3aXRob3V0IHRoZSBjb25zZW50IG9mIHRoZQorICAgIEtlcm1pdCBQcm9qZWN0LCB3aGljaCB3aWxsIG5vdCBiZSB1bnJlYXNvbmFibHkgd2l0aGhlbGQgKHRoaXMgaXMKKyAgICBzaW1wbHkgYSBtYXR0ZXIgb2Yga2VlcGluZyBhIGNvbnNpc3RlbnQgYW5kIHN1cHBvcnRhYmxlIGNvZGUgYmFzZSkuCisKKyhCKSBJbmNsdXNpb24gb2YgQy1LZXJtaXQgc29mdHdhcmUgaW4gd2hvbGUgb3IgaW4gcGFydCwgaW4gYW55IGZvcm0sIGluCisgICAgb3Igd2l0aCBhbnkgcHJvZHVjdCBub3QgY292ZXJlZCBieSBDbGF1c2UgKEEpLCBvciBpdHMgZGlzdHJpYnV0aW9uCisgICAgYnkgYW55IGNvbW1lcmNpYWwgZW50ZXJwcmlzZSB0byBpdHMgYWN0dWFsIG9yIHBvdGVudGlhbCBjdXN0b21lcnMKKyAgICBvciBjbGllbnRzIGV4Y2VwdCBhcyBpbiBDbGF1c2UgKEEpLCByZXF1aXJlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKKyAgICBLZXJtaXQgUHJvamVjdCwgQ29sdW1iaWEgVW5pdmVyc2l0eTsgY29udGFjdCBrZXJtaXRAY29sdW1iaWEuZWR1LgorCitUaGUgbmFtZSBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKK3Byb2R1Y3RzIGRlcml2ZWQgZnJvbSBvciBpbmNsdWRpbmcgdGhlIEMtS2VybWl0IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworRElTQ0xBSU1FUjoKKworICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEFTIElTLCBXSVRIT1VUIFJFUFJFU0VOVEFUSU9OIEZST00gVEhFCisgIFRSVVNURUVTIE9GIENPTFVNQklBIFVOSVZFUlNJVFkgSU4gVEhFIENJVFkgT0YgTkVXIFlPUksgQVMgVE8gSVRTCisgIEZJVE5FU1MgRk9SIEFOWSBQVVJQT1NFLCBBTkQgV0lUSE9VVCBXQVJSQU5UWSBCWSBUSEUgVFJVU1RFRVMgT0YKKyAgQ09MVU1CSUEgVU5JVkVSU0lUWSBJTiBUSEUgQ0lUWSBPRiBORVcgWU9SSyBPRiBBTlkgS0lORCwgRUlUSEVSCisgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRAorICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgIFRIRSBUUlVTVEVFUyBPRiBDT0xVTUJJQSBVTklWRVJTSVRZIElOIFRIRSBDSVRZIE9GIE5FVyBZT1JLIFNIQUxMIE5PVAorICBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTLCBJTkNMVURJTkcgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTSBBUklTSU5HIE9VVCBPRiBPUgorICBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPRiBUSEUgU09GVFdBUkUsIEVWRU4gSUYgSVQgSEFTIEJFRU4gT1IgSVMKKyAgSEVSRUFGVEVSIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gIFlPVSBTSEFMTAorICBJTkRFTU5JRlkgQU5EIEhPTEQgSEFSTUxFU1MgVEhFIFRSVVNURUVTIE9GIENPTFVNQklBIFVOSVZFUlNJVFkgSU4KKyAgVEhFIENJVFkgT0YgTkVXIFlPUkssIElUUyBFTVBMT1lFRVMgQU5EIEFHRU5UUyBGUk9NIEFORCBBR0FJTlNUIEFOWQorICBBTkQgQUxMIENMQUlNUywgREVNQU5EUywgTE9TUywgREFNQUdFIE9SIEVYUEVOU0UgKElOQ0xVRElORworICBBVFRPUk5FWVMnIEZFRVMpIEFSSVNJTkcgT1VUIE9GIFlPVVIgVVNFIE9GIFRISVMgU09GVFdBUkUuCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCBwZXJtaXNzaW9ucyBub3RpY2UsIGFuZCBkaXNjbGFpbWVyIG1heSBub3QgYmUKK3JlbW92ZWQsIGFsdGVyZWQsIG9yIG9ic2N1cmVkIGFuZCBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorQy1LZXJtaXQgc29mdHdhcmUuICBUaGUgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZgorTmV3IFlvcmsgcmVzZXJ2ZSB0aGUgcmlnaHQgdG8gcmV2b2tlIHRoaXMgcGVybWlzc2lvbiBpZiBhbnkgb2YgdGhlIHRlcm1zCitvZiB1c2Ugc2V0IGZvcnRoIGFib3ZlIGFyZSBicmVhY2hlZC4KKworKEVuZCkKZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja19jcnAuYyBiL2NrZXJtaXQtOC4wLjIxMS9ja19jcnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzVhZmQwCi0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrX2NycC5jCkBAIC0wLDAgKzEsNTU5MCBAQAorY2hhciAqY2tjcnB2ID0gIkVuY3J5cHRpb24gRW5naW5lLCA4LjAuMTE0LCAgOSBPY3QgMjAwMyI7CisvKgorICBDIEsgXyBDIFIgUCAuIEMgIC0gIENyeXB0b2dyYXBoeSBmb3IgQy1LZXJtaXQiCisKKyAgQ29weXJpZ2h0IChDKSAxOTk4LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKworICBBdXRob3I6CisgIEplZmZyZXkgRSBBbHRtYW4gKGphbHRtYW5Ac2VjdXJlLWVuZHBvaW50cy5jb20pCisgIFNlY3VyZSBFbmRwb2ludHMgSW5jLiwgTmV3IFlvcmsgQ2l0eQorKi8KKworI2RlZmluZSBDS19DUlBfQworI2lmZGVmIENLX0RFUworI2lmZGVmIENLX1NTTAorI2lmbmRlZiBMSUJERVMKKyNkZWZpbmUgTElCREVTCisjZW5kaWYgLyogTElCREVTICovCisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogQ0tfREVTICovCisKKyNpZmRlZiBDUllQVF9ETEwKKyNkZWZpbmUgQ0tfQVVUSEVOVElDQVRJT04KKyNkZWZpbmUgQ0tfRU5DUllQVElPTgorI2RlZmluZSBDS19ERVMKKyNkZWZpbmUgQ0tfQ0FTVAorI2lmbmRlZiBMSUJERVMKKyNkZWZpbmUgTElCREVTCisjZW5kaWYgLyogTElCREVTICovCisKKyNkZWZpbmUgVEVMQ01EUyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0byBkZWZpbmUgbmFtZSBhcnJheSAqLworI2RlZmluZSBURUxPUFRTICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvIGRlZmluZSBuYW1lIGFycmF5ICovCisjZGVmaW5lIEVOQ1JZUFRfTkFNRVMKKyNlbmRpZiAvKiBDUllQVF9ETEwgKi8KKworI2luY2x1ZGUgImNrY3N5bS5oIgorI2luY2x1ZGUgImNrY2RlYi5oIgorI2luY2x1ZGUgImNrY25ldC5oIgorCisjaWZkZWYgREVCVUcKKyN1bmRlZiBERUJVRworI2VuZGlmIC8qIERFQlVHICovCisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorI2lmZGVmIENLX0VOQ1JZUFRJT04KKyNkZWZpbmUgRU5DUllQVElPTgorI2lmZGVmIENLX0RFUworI2RlZmluZSBERVNfRU5DUllQVElPTgorI2VuZGlmIC8qIENLX0RFUyAqLworI2lmZGVmICBDS19DQVNUCisjZGVmaW5lIENBU1RfRU5DUllQVElPTgorI2VuZGlmIC8qIENLX0NBU1QgKi8KKyNpZmRlZiBDT01NRU5UCisjZGVmaW5lIENBU1RfRVhQT1JUX0VOQ1JZUFRJT04KKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisKKyNpbmNsdWRlICJja3VjbWQuaCIgICAgICAgICAgICAgICAgICAgICAvKiBGb3Igc3RydWN0IGtleXRhYiBkZWZpbml0aW9uICovCisjaW5jbHVkZSAiY2t1YXRoLmgiCisjaW5jbHVkZSAiY2t1YXQyLmgiCisjaWZkZWYgTUlUX0NVUlJFTlQKKyNpbmNsdWRlIDxrcmI1Lmg+CisjZW5kaWYgLyogTUlUX0NVUlJFTlQgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIE9TMgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmZGVmIE9TMk9OTFkKKyNpbmNsdWRlIDxvczIuaD4KKyNlbmRpZiAvKiBPUzJPTkxZICovCisjaW5jbHVkZSAiY2tvc3luLmgiCisjZWxzZSAvKiBPUzIgKi8KK3N0YXRpYyBjaGFyICogdG1wc3RyaW5nID0gTlVMTDsKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBDQVNUX09SX0VYUE9SVAorI2lmZGVmIENBU1RfRU5DUllQVElPTgorI2RlZmluZSBDQVNUX09SX0VYUE9SVAorI2VuZGlmIC8qIENBU1RfRU5DUllQVElPTiAqLworI2lmZGVmIENBU1RfRVhQT1JUX0VOQ1JZUFRJT04KKyNkZWZpbmUgQ0FTVF9PUl9FWFBPUlQKKyNlbmRpZiAvKiBDQVNUX0VYUE9SVF9FTkNSWVBUSU9OICovCisjZW5kaWYgLyogQ0FTVF9PUl9FWFBPUlQgKi8KKworI2lmZGVmIENSWVBUX0RMTAoraW50IGNtZF9xdW90aW5nID0gMDsKKworI2lmbmRlZiBURUxPUFRfTUFDUk8KK2ludAordGVsb3B0X2luZGV4KG9wdCkgaW50IG9wdDsgeworICAgIGlmICggb3B0ID49IDAgJiYgb3B0IDw9IFRFTE9QVF9TRU5EX1VSTCApCisgICAgICAgIHJldHVybihvcHQpOworICAgIGVsc2UgaWYgKCBvcHQgPj0gVEVMT1BUX1BSQUdNQV9MT0dPTiAmJiBvcHQgPD0gVEVMT1BUX1BSQUdNQV9IRUFSVEJFQVQgKQorICAgICAgICByZXR1cm4ob3B0LTg5KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihOVEVMT1BUUyk7Cit9CisKK2ludAordGVsb3B0X29rKG9wdCkgaW50IG9wdDsgeworICAgIHJldHVybigob3B0ID49IFRFTE9QVF9CSU5BUlkgJiYgb3B0IDw9IFRFTE9QVF9TRU5EX1VSTCkgfHwKKyAgICAgICAgKG9wdCA+PSBURUxPUFRfUFJBR01BX0xPR09OICYmIG9wdCA8PSBURUxPUFRfUFJBR01BX0hFQVJUQkVBVCkpOworfQorCitDSEFSICoKK3RlbG9wdChvcHQpIGludCBvcHQ7IHsKKyAgICBpZiAoIHRlbG9wdF9vayhvcHQpICkKKyAgICAgICAgcmV0dXJuKHRlbG9wdHNbdGVsb3B0X2luZGV4KG9wdCldKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybigiVU5LTk9XTiIpOworfQorI2VuZGlmIC8qIFRFTE9QVF9NQUNSTyAqLworCitzdGF0aWMgaW50ICgqcF90dG9sKShjaGFyICosaW50KT1OVUxMOworc3RhdGljIGludCAoKnBfZG9kZWJ1ZykoaW50LGNoYXIgKixjaGFyICosbG9uZyk9TlVMTDsKK3N0YXRpYyBpbnQgKCpwX2RvaGV4ZHVtcCkoY2hhciAqLGNoYXIgKixpbnQpPU5VTEw7CitzdGF0aWMgdm9pZCAoKnBfdG5fZGVidWcpKGNoYXIgKik9TlVMTDsKK3N0YXRpYyBpbnQgKCpwX3ZzY3JucHJpbnRmKShjaGFyICosIC4uLik9TlVMTDsKK3N0YXRpYyB2b2lkICogcF9rNV9jb250ZXh0PU5VTEw7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAoKnBfcmVxdGVsbXV0ZXgpKHVuc2lnbmVkIGxvbmcpPU5VTEw7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAoKnBfcmVsdGVsbXV0ZXgpKHZvaWQpPU5VTEw7CisKK3Vuc2lnbmVkIGxvbmcKK1JlcXVlc3RUZWxuZXRNdXRleCh1bnNpZ25lZCBsb25nIHgpCit7CisgICAgaWYgKCBwX3JlcXRlbG11dGV4ICkKKyAgICAgICAgcmV0dXJuIHBfcmVxdGVsbXV0ZXgoeCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcKK1JlbGVhc2VUZWxuZXRNdXRleCh2b2lkKQoreworICAgIGlmICggcF9yZWx0ZWxtdXRleCApCisgICAgICAgIHJldHVybiBwX3JlbHRlbG11dGV4KCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludAordHRvbChjaGFyICogcywgaW50IG4pCit7CisgICAgaWYgKCBwX3R0b2wgKQorICAgICAgICByZXR1cm4ocF90dG9sKHMsbikpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKC0xKTsKK30KKworaW50Citkb2RlYnVnKGludCBmbGFnLCBjaGFyICogczEsIGNoYXIgKiBzMiwgbG9uZyBuKQoreworICAgIGlmICggcF9kb2RlYnVnICkKKyAgICAgICAgcmV0dXJuKHBfZG9kZWJ1ZyhmbGFnLHMxLHMyLG4pKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybigtMSk7Cit9CisKK2ludAorZG9oZXhkdW1wKCBjaGFyICogczEsIGNoYXIgKiBzMiwgaW50IG4gKQoreworICAgIGlmICggcF9kb2hleGR1bXAgKQorICAgICAgICBwX2RvaGV4ZHVtcChzMSxzMixuKTsKKyAgICByZXR1cm4oMCk7Cit9CisKK3ZvaWQKK3RuX2RlYnVnKCBjaGFyICogcyApCit7CisgICAgaWYgKCBwX3RuX2RlYnVnICkKKyAgICAgICAgcF90bl9kZWJ1ZyhzKTsKK30KKworc3RhdGljIGNoYXIgbXlwcnRmc3RyWzQwOTZdOworaW50CitWc2NybnByaW50Zihjb25zdCBjaGFyICogZm9ybWF0LCAuLi4pIHsKKyAgICBpbnQgaSwgbGVuLCByYz0wOworICAgIGNoYXIgKmNwOworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyNpZmRlZiBOVAorICAgIHJjID0gX3ZzbnByaW50ZihteXBydGZzdHIsIHNpemVvZihteXBydGZzdHIpLTEsIGZvcm1hdCwgYXApOworI2Vsc2UgLyogTlQgKi8KKyAgICByYyA9IHZzcHJpbnRmKG15cHJ0ZnN0ciwgZm9ybWF0LCBhcCk7CisjZW5kaWYgLyogTlQgKi8KKyAgICB2YV9lbmQoYXApOworCisgICAgaWYgKCBwX3ZzY3JucHJpbnRmICkKKyAgICAgICAgcmV0dXJuKHBfdnNjcm5wcmludGYobXlwcnRmc3RyKSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oLTEpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5faGV4KENIQVIgKiBidWYsIGludCBidWZsZW4sIENIQVIgKiBkYXRhLCBpbnQgZGF0YWxlbikKKyNlbHNlIC8qIENLX0FOU0lDICovCit0bl9oZXgoYnVmLCBidWZsZW4sIGRhdGEsIGRhdGFsZW4pCisgICAgQ0hBUiAqIGJ1ZjsKKyAgICBpbnQgYnVmbGVuOworICAgIENIQVIgKiBkYXRhOworICAgIGludCBkYXRhbGVuOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaW50IGkgPSAwLCBqID0gMCwgayA9IDA7CisgICAgQ0hBUiB0bXBbOF07CisjaWZkZWYgQ09NTUVOVAorICAgIGludCB3YXNfaGV4ID0gMTsKKworICAgIGZvciAoaz0wOyBrIDwgZGF0YWxlbjsgaysrKSB7CisgICAgICAgIGlmIChkYXRhW2tdIDwgMzIgfHwgZGF0YVtrXSA+PSAxMjcpIHsKKyAgICAgICAgICAgIHNwcmludGYodG1wLCIlcyUwMlggIix3YXNfaGV4PyIiOiJcIiAiLGRhdGFba10pOworICAgICAgICAgICAgd2FzX2hleCA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcHJpbnRmKHRtcCwiJXMlYyIsd2FzX2hleD8iXCIiOiIiLGRhdGFba10pOworICAgICAgICAgICAgd2FzX2hleCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY2tzdHJuY2F0KGJ1Zix0bXAsYnVmbGVuKTsKKyAgICB9CisgICAgaWYgKCF3YXNfaGV4KQorICAgICAgICBja3N0cm5jYXQoYnVmLCJcIiAiLGJ1Zmxlbik7CisjZWxzZSAvKiBDT01NRU5UICovCisgICAgaWYgKGRhdGFsZW4gPD0gMCB8fCBkYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybigwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhbGVuOyBpKyspIHsKKyAgICAgICAgY2tzdHJuY2F0KGJ1ZiwiXHJcbiAgIixidWZsZW4pOworICAgICAgICBmb3IgKGogPSAwIDsgKGogPCAxNik7IGorKykgeworICAgICAgICAgICAgaWYgKChpICsgaikgPCBkYXRhbGVuKQorICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMlMDJ4ICIsCisgICAgICAgICAgICAgICAgICAgICAgKGogPT0gOCA/ICJ8ICIgOiAiIiksCisgICAgICAgICAgICAgICAgICAgICAgKENIQVIpIGRhdGFbaSArIGpdCisgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgc3ByaW50Zih0bXAsCisgICAgICAgICAgICAgICAgICAgICAgIiVzICAgIiwKKyAgICAgICAgICAgICAgICAgICAgICAoaiA9PSA4ID8gInwgIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBja3N0cm5jYXQoYnVmLHRtcCxidWZsZW4pOworICAgICAgICB9CisgICAgICAgIGNrc3RybmNhdChidWYsIiAiLGJ1Zmxlbik7CisgICAgICAgIGZvciAoayA9IDA7IChrIDwgMTYpICYmICgoaSArIGspIDwgZGF0YWxlbik7IGsrKykgeworICAgICAgICAgICAgc3ByaW50Zih0bXAsCisgICAgICAgICAgICAgICAgICAgICAiJXMlYyIsCisgICAgICAgICAgICAgICAgICAgICAoayA9PSA4ID8gIiAiIDogIiIpLAorICAgICAgICAgICAgICAgICAgICAgaXNwcmludChkYXRhW2kgKyBrXSkgPyBkYXRhW2kgKyBrXSA6ICcuJworICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNrc3RybmNhdChidWYsdG1wLGJ1Zmxlbik7CisgICAgICAgIH0KKyAgICAgICAgaSArPSBqIC0gMTsKKyAgICB9IC8qIGVuZCBmb3IgKi8KKyAgICBja3N0cm5jYXQoYnVmLCJcclxuICAiLGJ1Zmxlbik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHJldHVybihzdHJsZW4oYnVmKSk7Cit9CisKKyNpZmRlZiBDT01NRU5UCisjZGVmaW5lIHR0b2wgICAgICAgIGRsbF90dG9sCisjZGVmaW5lIGRvZGVidWcgICAgIGRsbF9kb2RlYnVnCisjZGVmaW5lIGRvaGV4ZHVtcCAgIGRsbF9kb2hleGR1bXAKKyNkZWZpbmUgdG5fZGVidWcgICAgZGxsX3RuX2RlYnVnCisjZGVmaW5lIFZzY3JucHJpbnRmIGRsbF92c2NybnByaW50ZgorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworY2hhciB0bl9tc2dbVE5fTVNHX0xFTl0sIGhleGJ1ZltUTl9NU0dfTEVOXTsgICAvKiBmcm9tIGNrY25ldC5jICovCitpbnQgZGVibG9nPTEsIGRlYnNlcz0xLCB0bl9kZWI9MTsKKyNlbHNlIC8qIENSWVBUX0RMTCAqLworZXh0ZXJuIGNoYXIgdG5fbXNnW10sIGhleGJ1ZltdOyAgICAgICAgIC8qIGZyb20gY2tjbmV0LmMgKi8KK2V4dGVybiBpbnQgZGVibG9nLCBkZWJzZXMsIHRuX2RlYjsKKyNpZmRlZiBNSVRfQ1VSUkVOVAorZXh0ZXJuIGtyYjVfY29udGV4dCBrNV9jb250ZXh0OworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisjZW5kaWYgLyogQ1JZUFRfRExMICovCisKKyNpZmRlZiBMSUJERVMKKyNpZm5kZWYgVU5JWAorI2RlZmluZSBkZXNfbmV3X3JhbmRvbV9rZXkgICAgICAgICAgICBkZXNfcmFuZG9tX2tleQorI2RlZmluZSBkZXNfc2V0X3JhbmRvbV9nZW5lcmF0b3Jfc2VlZCBkZXNfcmFuZG9tX3NlZWQKKyNlbmRpZiAvKiBVTklYICovCisjZGVmaW5lIGRlc19maXh1cF9rZXlfcGFyaXR5ICAgICAgICAgIGRlc19zZXRfb2RkX3Bhcml0eQorI2lmZGVmIE9QRU5TU0xfMDk3CisjZGVmaW5lIE9QRU5TU0xfRU5BQkxFX09MRF9ERVNfU1VQUE9SVAorI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisjZW5kaWYgLyogT1BFTlNTTF8wOTcgKi8KKyNlbHNlIC8qIExJQkRFUyAqLworI2lmZGVmIFVOSVgKKyNkZWZpbmUgZGVzX3NldF9yYW5kb21fZ2VuZXJhdG9yX3NlZWQoeCkgZGVzX2luaXRfcmFuZG9tX251bWJlcl9nZW5lcmF0b3IoeCkKKyNlbmRpZiAvKiBVTklYICovCisjaWZkZWYgT1MyCisjZGVmaW5lIGRlc19uZXdfcmFuZG9tX2tleSAgICAgICAgICAgIGNrX2Rlc19uZXdfcmFuZG9tX2tleQorI2RlZmluZSBkZXNfc2V0X3JhbmRvbV9nZW5lcmF0b3Jfc2VlZCBja19kZXNfc2V0X3JhbmRvbV9nZW5lcmF0b3Jfc2VlZAorI2RlZmluZSBkZXNfa2V5X3NjaGVkICAgICAgICAgICAgICAgICBja19kZXNfa2V5X3NjaGVkCisjZGVmaW5lIGRlc19lY2JfZW5jcnlwdCAgICAgICAgICAgICAgIGNrX2Rlc19lY2JfZW5jcnlwdAorI2RlZmluZSBkZXNfc3RyaW5nX3RvX2tleSAgICAgICAgICAgICBja19kZXNfc3RyaW5nX3RvX2tleQorI2RlZmluZSBkZXNfZml4dXBfa2V5X3Bhcml0eSAgICAgICAgICBja19kZXNfZml4dXBfa2V5X3Bhcml0eQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIExJQkRFUyAqLworCisjaWZkZWYgQ0tfREVTCisvKiBUaGlzIGNvZGUgY29tZXMgZnJvbSBFcmljIFlvdW5nJ3MgbGliZGVzIHBhY2thZ2UgYW5kIGlzIG5vdCBwYXJ0ICAgKi8KKy8qIG9mIHRoZSBzdGFuZGFyZCBNSVQgREVTIGxpYnJhcnkgdGhhdCBpcyBwYXJ0IG9mIEtlcmJlcm9zLiBIb3dldmVyLCAqLworLyogaXQgaXMgZXh0cmVtZWx5IHVzZWZ1bC4gIFNvIHdlIGFkZCBpdCBoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworLyogV2VhayBhbmQgc2VtaSB3ZWVrIGtleXMgYXMgdGFrZSBmcm9tCisgKiAlQSBELlcuIERhdmllcworICogJUEgVy5MLiBQcmljZQorICogJVQgU2VjdXJpdHkgZm9yIENvbXB1dGVyIE5ldHdvcmtzCisgKiAlSSBKb2huIFdpbGV5ICYgU29ucworICogJUQgMTk4NAorICogTWFueSB0aGFua3MgdG8gc21iQHVseXNzZXMuYXR0LmNvbSAoU3RldmVuIEJlbGxvdmluKSBmb3IgdGhlIHJlZmVyZW5jZQorICogKGFuZCBhY3R1YWwgY2Jsb2NrIHZhbHVlcykuCisgKi8KKyNkZWZpbmUgTlVNX1dFQUtfS0VZICAgIDE2CitzdGF0aWMgQmxvY2sgd2Vha19rZXlzW05VTV9XRUFLX0tFWV09eworICAgICAgICAvKiB3ZWFrIGtleXMgKi8KKyAgICAgICAgezB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMX0sCisgICAgICAgIHsweEZFLDB4RkUsMHhGRSwweEZFLDB4RkUsMHhGRSwweEZFLDB4RkV9LAorICAgICAgICB7MHgxRiwweDFGLDB4MUYsMHgxRiwweDFGLDB4MUYsMHgxRiwweDFGfSwKKyAgICAgICAgezB4RTAsMHhFMCwweEUwLDB4RTAsMHhFMCwweEUwLDB4RTAsMHhFMH0sCisgICAgICAgIC8qIHNlbWktd2VhayBrZXlzICovCisgICAgICAgIHsweDAxLDB4RkUsMHgwMSwweEZFLDB4MDEsMHhGRSwweDAxLDB4RkV9LAorICAgICAgICB7MHhGRSwweDAxLDB4RkUsMHgwMSwweEZFLDB4MDEsMHhGRSwweDAxfSwKKyAgICAgICAgezB4MUYsMHhFMCwweDFGLDB4RTAsMHgwRSwweEYxLDB4MEUsMHhGMX0sCisgICAgICAgIHsweEUwLDB4MUYsMHhFMCwweDFGLDB4RjEsMHgwRSwweEYxLDB4MEV9LAorICAgICAgICB7MHgwMSwweEUwLDB4MDEsMHhFMCwweDAxLDB4RjEsMHgwMSwweEYxfSwKKyAgICAgICAgezB4RTAsMHgwMSwweEUwLDB4MDEsMHhGMSwweDAxLDB4RjEsMHgwMX0sCisgICAgICAgIHsweDFGLDB4RkUsMHgxRiwweEZFLDB4MEUsMHhGRSwweDBFLDB4RkV9LAorICAgICAgICB7MHhGRSwweDFGLDB4RkUsMHgxRiwweEZFLDB4MEUsMHhGRSwweDBFfSwKKyAgICAgICAgezB4MDEsMHgxRiwweDAxLDB4MUYsMHgwMSwweDBFLDB4MDEsMHgwRX0sCisgICAgICAgIHsweDFGLDB4MDEsMHgxRiwweDAxLDB4MEUsMHgwMSwweDBFLDB4MDF9LAorICAgICAgICB7MHhFMCwweEZFLDB4RTAsMHhGRSwweEYxLDB4RkUsMHhGMSwweEZFfSwKKyAgICAgICAgezB4RkUsMHhFMCwweEZFLDB4RTAsMHhGRSwweEYxLDB4RkUsMHhGMX19OworCitpbnQKK2NrX2Rlc19pc193ZWFrX2tleShrZXkpCitCbG9jayBrZXk7Cit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaTxOVU1fV0VBS19LRVk7IGkrKykgeworICAgICAgICAvKiBBZGRlZCA9PSAwIHRvIGNvbXBhcmlzaW9uLCBJIG9idmlvdXNseSBkb24ndCBydW4KKyAgICAgICAgKiB0aGlzIHNlY3Rpb24gdmVyeSBvZnRlbiA6LSgsIHRoYW5rcyB0bworICAgICAgICAqIGVuZ2luZWVyaW5nQE1vcm5pbmdTdGFyLkNvbSBmb3IgdGhlIGZpeAorICAgICAgICAqIGVheSA5My8wNi8yOQorICAgICAgICAqIEFub3RoZXIgcHJvYmxlbSwgSSB3YXMgY29tcGFyaW5nIG9ubHkgdGhlIGZpcnN0IDQKKyAgICAgICAgKiBieXRlcywgOTcvMDMvMTggKi8KKyAgICAgICAgaWYgKG1lbWNtcCh3ZWFrX2tleXNbaV0sa2V5LHNpemVvZihCbG9jaykpID09IDApCisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworI2lmZGVmIFVOSVgKKyNpZmRlZiBMSUJERVMKKy8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgRXJpYyBZb3VuZydzIERFUyBsaWJyYXJ5ICovCisvKiBfdW5peF90aW1lX2dtdF91bml4c2VjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBfZGVzX3NldF9yYW5kb21fZ2VuZXJhdG9yX3NlZWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBfZGVzX2ZpeHVwX2tleV9wYXJpdHkgICAoYWRkZWQgaW4gMC45LjUpICAgICAgICAgICAgICAgICovCisvKiBfZGVzX25ld19yYW5kb21fa2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKwordW5zaWduZWQgbG9uZwordW5peF90aW1lX2dtdF91bml4c2VjICh1c2VjcHRyKQorICAgIHVuc2lnbmVkIGxvbmcgICp1c2VjcHRyOworeworICAgIHN0cnVjdCB0aW1ldmFsICBub3c7CisKKyAgICAodm9pZCkgZ2V0dGltZW9mZGF5ICgmbm93LCAoc3RydWN0IHRpbWV6b25lICopMCk7CisgICAgaWYgKHVzZWNwdHIpCisgICAgICAgICp1c2VjcHRyID0gbm93LnR2X3VzZWM7CisgICAgcmV0dXJuIG5vdy50dl9zZWM7Cit9CisKK3ZvaWQKK2Rlc19zZXRfcmFuZG9tX2dlbmVyYXRvcl9zZWVkKEJsb2NrIEIpCit7CisgICAgZGVzX3JhbmRvbV9zZWVkKEIpOworICAgIHJldHVybjsKK30KKworI2lmZGVmIENPTU1FTlQKKy8qIGFkZGVkIHRvIG9wZW5zc2wgaW4gMC45LjUgKi8KK3ZvaWQKK2Rlc19maXh1cF9rZXlfcGFyaXR5KEJsb2NrIEIpCit7CisgICAgZGVzX3NldF9vZGRfcGFyaXR5KEIpOworICAgIHJldHVybjsKK30KKyNlbmRpZiAvKiBDT01NRU5UICovCitpbnQKK2Rlc19uZXdfcmFuZG9tX2tleShCbG9jayBCKQoreworICAgIGludCByYz0wOworICAgIHJjID0gZGVzX3JhbmRvbV9rZXkoQik7CisgICAgcmV0dXJuKHJjKTsKK30KKworI2VuZGlmIC8qIExJQkRFUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBDS19ERVMgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAgICAgIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiBiYXNlZCBvbiBAKCMpZW5jcnlwdC5jICAgICAgIDguMSAoQmVya2VsZXkpIDYvNC85MyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAxOTkwIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogRXhwb3J0IG9mIHRoaXMgc29mdHdhcmUgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIG1heQorICogcmVxdWlyZSBhIHNwZWNpZmljIGxpY2Vuc2UgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50LgorICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uIGNvbnRlbXBsYXRpbmcKKyAqIGV4cG9ydCB0byBvYnRhaW4gc3VjaCBhIGxpY2Vuc2UgYmVmb3JlIGV4cG9ydGluZy4KKyAqCisgKiBXSVRISU4gVEhBVCBDT05TVFJBSU5ULCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZAorICogd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdAorICogdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nCisgKiB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IKKyAqIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcworICogb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAqIFRoZXNlIGZ1bmN0aW9uIHBvaW50ZXJzIHBvaW50IHRvIHRoZSBjdXJyZW50IHJvdXRpbmVzCisgKiBmb3IgZW5jcnlwdGluZyBhbmQgZGVjcnlwdGluZyBkYXRhLgorICovCitzdGF0aWMgVk9JRCAgICAgKCplbmNyeXB0X291dHB1dCkgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgICAgICAoKmRlY3J5cHRfaW5wdXQpIFAoKGludCkpOworCisjaWZkZWYgREVCVUcKK3N0YXRpYyBpbnQgZW5jcnlwdF9kZWJ1Z19tb2RlID0gMTsKK3N0YXRpYyBpbnQgZW5jcnlwdF92ZXJib3NlID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IGVuY3J5cHRfdmVyYm9zZSA9IDE7CitzdGF0aWMgaW50IGVuY3J5cHRfZGVidWdfbW9kZSA9IDA7CisjZW5kaWYKKworc3RhdGljIGNoYXIgZGJnYnVmIFsxNjM4NF07CisKK3N0YXRpYyBpbnQgZGVjcnlwdF9tb2RlID0gMDsKK3N0YXRpYyBpbnQgZW5jcnlwdF9tb2RlID0gMDsKK3N0YXRpYyBpbnQgYXV0b2VuY3J5cHQgPSAxOworc3RhdGljIGludCBhdXRvZGVjcnlwdCA9IDE7CitzdGF0aWMgaW50IGhhdmVzZXNzaW9ua2V5ID0gMDsKKworc3RhdGljIGtzdHJlYW0gRW5jcnlwdEtTR2xvYmFsSGFjayA9IE5VTEw7CitzdGF0aWMgaW50ICAgICBFbmNyeXB0VHlwZSA9IEVOQ1RZUEVfQU5ZOworCisjZGVmaW5lIHR5cGVtYXNrKHgpICAgICAoKHgpID4gMCA/IDEgPDwgKCh4KS0xKSA6IDApCisKK3N0YXRpYyBsb25nIGlfc3VwcG9ydF9lbmNyeXB0ID0KKyAgICAgICAgdHlwZW1hc2soRU5DVFlQRV9ERVNfQ0ZCNjQpIHwgdHlwZW1hc2soRU5DVFlQRV9ERVNfT0ZCNjQpOworc3RhdGljIGxvbmcgaV9zdXBwb3J0X2RlY3J5cHQgPQorICAgICAgICB0eXBlbWFzayhFTkNUWVBFX0RFU19DRkI2NCkgfCB0eXBlbWFzayhFTkNUWVBFX0RFU19PRkI2NCk7CitzdGF0aWMgbG9uZyBpX3dvbnRfc3VwcG9ydF9lbmNyeXB0ID0gMDsKK3N0YXRpYyBsb25nIGlfd29udF9zdXBwb3J0X2RlY3J5cHQgPSAwOworI2RlZmluZSBJX1NVUFBPUlRfRU5DUllQVCAgICAgICAoaV9zdXBwb3J0X2VuY3J5cHQgJiB+aV93b250X3N1cHBvcnRfZW5jcnlwdCkKKyNkZWZpbmUgSV9TVVBQT1JUX0RFQ1JZUFQgICAgICAgKGlfc3VwcG9ydF9kZWNyeXB0ICYgfmlfd29udF9zdXBwb3J0X2RlY3J5cHQpCisKK3N0YXRpYyBsb25nIHJlbW90ZV9zdXBwb3J0c19lbmNyeXB0ID0gMDsKK3N0YXRpYyBsb25nIHJlbW90ZV9zdXBwb3J0c19kZWNyeXB0ID0gMDsKKworLyogTWFrZSBzdXJlIHRoYXQgdGhpcyBsaXN0IGlzIGluIG9yZGVyIG9mIGFsZ29yaXRobSBzdHJlbmd0aCAgICAgKi8KKy8qIGFzIGl0IGRldGVybWluZXMgdGhlIHNlYXJjaCBvcmRlciBmb3Igc2VsZWN0aW5nIHNwZWNpZmljICAgICAgICovCisvKiBlbmNyeXB0aW9uIGNob2ljZXMuICBBbGwgQ0ZCIG1vZGVzIG11c3QgY29tZSBiZWZvcmUgT0ZCIG1vZGVzLiAqLworc3RhdGljIEVuY3J5cHRpb25zIGVuY3J5cHRpb25zW10gPSB7CisjaWZkZWYgREVTX0VOQ1JZUFRJT04KKyAgICB7ICJERVMzX0NGQjY0IiwKKyAgICAgICAgICBFTkNUWVBFX0RFUzNfQ0ZCNjQsCisgICAgICAgICAgZGVzM19jZmI2NF9lbmNyeXB0LAorICAgICAgICAgIGRlczNfY2ZiNjRfZGVjcnlwdCwKKyAgICAgICAgICBkZXMzX2NmYjY0X2luaXQsCisgICAgICAgICAgZGVzM19jZmI2NF9zdGFydCwKKyAgICAgICAgICBkZXMzX2NmYjY0X2lzLAorICAgICAgICAgIGRlczNfY2ZiNjRfcmVwbHksCisgICAgICAgICAgZGVzM19jZmI2NF9zZXNzaW9uLAorICAgICAgICAgIGRlczNfY2ZiNjRfa2V5aWQsCisgICAgICAgICAgTlVMTCB9LAorI2VuZGlmIC8qIERFU19FTkNSWVBUSU9OICovCisjaWZkZWYgQ0FTVF9FTkNSWVBUSU9OCisjaWZuZGVmIENBU1RfRVhQT1JUX0VOQ1JZUFRJT04KKyAgICB7ICJDQVNUMTI4X0NGQjY0IiwgIEVOQ1RZUEVfQ0FTVDEyOF9DRkI2NCwKKyAgICAgICAgICBjYXN0X2NmYjY0X2VuY3J5cHQsCisgICAgICAgICAgY2FzdF9jZmI2NF9kZWNyeXB0LAorICAgICAgICAgIGNhc3RfY2ZiNjRfaW5pdCwKKyAgICAgICAgICBjYXN0X2NmYjY0X3N0YXJ0LAorICAgICAgICAgIGNhc3RfY2ZiNjRfaXMsCisgICAgICAgICAgY2FzdF9jZmI2NF9yZXBseSwKKyAgICAgICAgICBjYXN0X2NmYjY0X3Nlc3Npb24sCisgICAgICAgICAgY2FzdF9jZmI2NF9rZXlpZCwKKyAgICAgICAgICBOVUxMIH0sCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIERFU19FTkNSWVBUSU9OCisgICAgeyAiREVTX0NGQjY0IiwKKyAgICAgICAgICBFTkNUWVBFX0RFU19DRkI2NCwKKyAgICAgICAgICBjZmI2NF9lbmNyeXB0LAorICAgICAgICAgIGNmYjY0X2RlY3J5cHQsCisgICAgICAgICAgY2ZiNjRfaW5pdCwKKyAgICAgICAgICBjZmI2NF9zdGFydCwKKyAgICAgICAgICBjZmI2NF9pcywKKyAgICAgICAgICBjZmI2NF9yZXBseSwKKyAgICAgICAgICBjZmI2NF9zZXNzaW9uLAorICAgICAgICAgIGNmYjY0X2tleWlkLAorICAgICAgICAgIE5VTEwgfSwKKyNlbmRpZiAgLyogREVTX0VOQ1JZUFRJT04gKi8KKyNpZiBkZWZpbmVkIChDQVNUX0VYUE9SVF9FTkNSWVBUSU9OKSB8fCBkZWZpbmVkKENBU1RfRU5DUllQVElPTikKKyAgICB7ICJDQVNUNV80MF9DRkI2NCIsIEVOQ1RZUEVfQ0FTVDVfNDBfQ0ZCNjQsCisgICAgICAgICAgY2FzdGV4cF9jZmI2NF9lbmNyeXB0LAorICAgICAgICAgIGNhc3RleHBfY2ZiNjRfZGVjcnlwdCwKKyAgICAgICAgICBjYXN0ZXhwX2NmYjY0X2luaXQsCisgICAgICAgICAgY2FzdGV4cF9jZmI2NF9zdGFydCwKKyAgICAgICAgICBjYXN0ZXhwX2NmYjY0X2lzLAorICAgICAgICAgIGNhc3RleHBfY2ZiNjRfcmVwbHksCisgICAgICAgICAgY2FzdGV4cF9jZmI2NF9zZXNzaW9uLAorICAgICAgICAgIGNhc3RleHBfY2ZiNjRfa2V5aWQsCisgICAgICAgICAgTlVMTCB9LAorI2VuZGlmIC8qIENBU1RfRU5DUllQVElPTiAqLworI2lmZGVmIERFU19FTkNSWVBUSU9OCisgICAgeyAiREVTM19PRkI2NCIsCisgICAgICAgICAgRU5DVFlQRV9ERVMzX09GQjY0LAorICAgICAgICAgIGRlczNfb2ZiNjRfZW5jcnlwdCwKKyAgICAgICAgICBkZXMzX29mYjY0X2RlY3J5cHQsCisgICAgICAgICAgZGVzM19vZmI2NF9pbml0LAorICAgICAgICAgIGRlczNfb2ZiNjRfc3RhcnQsCisgICAgICAgICAgZGVzM19vZmI2NF9pcywKKyAgICAgICAgICBkZXMzX29mYjY0X3JlcGx5LAorICAgICAgICAgIGRlczNfb2ZiNjRfc2Vzc2lvbiwKKyAgICAgICAgICBkZXMzX29mYjY0X2tleWlkLAorICAgICAgICAgIE5VTEwgfSwKKyNlbmRpZiAvKiBERVNfRU5DUllQVElPTiAqLworI2lmZGVmIENBU1RfRU5DUllQVElPTgorI2lmbmRlZiBDQVNUX0VYUE9SVF9FTkNSWVBUSU9OCisgICAgeyAiQ0FTVDEyOF9PRkI2NCIsICBFTkNUWVBFX0NBU1QxMjhfT0ZCNjQsCisgICAgICAgICAgY2FzdF9vZmI2NF9lbmNyeXB0LAorICAgICAgICAgIGNhc3Rfb2ZiNjRfZGVjcnlwdCwKKyAgICAgICAgICBjYXN0X29mYjY0X2luaXQsCisgICAgICAgICAgY2FzdF9vZmI2NF9zdGFydCwKKyAgICAgICAgICBjYXN0X29mYjY0X2lzLAorICAgICAgICAgIGNhc3Rfb2ZiNjRfcmVwbHksCisgICAgICAgICAgY2FzdF9vZmI2NF9zZXNzaW9uLAorICAgICAgICAgIGNhc3Rfb2ZiNjRfa2V5aWQsCisgICAgICAgICAgTlVMTCB9LAorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBERVNfRU5DUllQVElPTgorICAgIHsgIkRFU19PRkI2NCIsCisgICAgICAgICAgRU5DVFlQRV9ERVNfT0ZCNjQsCisgICAgICAgICAgb2ZiNjRfZW5jcnlwdCwKKyAgICAgICAgICBvZmI2NF9kZWNyeXB0LAorICAgICAgICAgIG9mYjY0X2luaXQsCisgICAgICAgICAgb2ZiNjRfc3RhcnQsCisgICAgICAgICAgb2ZiNjRfaXMsCisgICAgICAgICAgb2ZiNjRfcmVwbHksCisgICAgICAgICAgb2ZiNjRfc2Vzc2lvbiwKKyAgICAgICAgICBvZmI2NF9rZXlpZCwKKyAgICAgICAgICBOVUxMIH0sCisjZW5kaWYgIC8qIERFU19FTkNSWVBUSU9OICovCisjaWYgZGVmaW5lZCAoQ0FTVF9FWFBPUlRfRU5DUllQVElPTikgfHwgZGVmaW5lZChDQVNUX0VOQ1JZUFRJT04pCisgICAgeyAiQ0FTVDVfNDBfT0ZCNjQiLCBFTkNUWVBFX0NBU1Q1XzQwX09GQjY0LAorICAgICAgICAgIGNhc3RleHBfb2ZiNjRfZW5jcnlwdCwKKyAgICAgICAgICBjYXN0ZXhwX29mYjY0X2RlY3J5cHQsCisgICAgICAgICAgY2FzdGV4cF9vZmI2NF9pbml0LAorICAgICAgICAgIGNhc3RleHBfb2ZiNjRfc3RhcnQsCisgICAgICAgICAgY2FzdGV4cF9vZmI2NF9pcywKKyAgICAgICAgICBjYXN0ZXhwX29mYjY0X3JlcGx5LAorICAgICAgICAgIGNhc3RleHBfb2ZiNjRfc2Vzc2lvbiwKKyAgICAgICAgICBjYXN0ZXhwX29mYjY0X2tleWlkLAorICAgICAgICAgIE5VTEwgfSwKKyNlbmRpZiAvKiBDQVNUX0VOQ1JZUFRJT04gKi8KKyAgICB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCAgfQorfTsKKworaW50CitnZXRfY3J5cHRfdGFibGUoIHN0cnVjdCBrZXl0YWIgKiogcFRhYmxlLCBpbnQgKiBwTiApCit7CisgICAgaW50IGk9MCxuPTA7CisKKyAgICBpZiAoICpwVGFibGUgKQorICAgIHsKKyAgICAgICAgZm9yICggaT0wIDsgaSA8ICpwTiA7IGkrKyApCisgICAgICAgICAgICBmcmVlKCAoKnBUYWJsZSlbaV0ua3dkICkgOworICAgICAgICBmcmVlICggKnBUYWJsZSApICA7CisgICAgfQorICAgICpwVGFibGUgPSBOVUxMOworICAgICpwTiA9IDA7CisKKyAgICAvKiBIb3cgbWFueSBlbmNyeXB0aW9uIHR5cGVzIGRvIHdlIGhhdmU/ICovCisgICAgd2hpbGUgKCBlbmNyeXB0aW9uc1tuXS5uYW1lICkKKyAgICAgICAgbisrOworCisgICAgaWYgKCBuICkKKyAgICB7CisgICAgICAgICpwVGFibGUgPSBtYWxsb2MoIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSAqIChuKzIpICkgOworICAgICAgICBpZiAoICEoKnBUYWJsZSkgKQorICAgICAgICAgICAgcmV0dXJuKDApOworCisjaWZkZWYgT1MyCisgICAgICAgICgqcFRhYmxlKVswXS5rd2QgPXN0cmR1cCgiYXV0b21hdGljIik7CisjZWxzZSAvKiBPUzIgKi8KKyAgICAgICAgbWFrZXN0cigmdG1wc3RyaW5nLCJhdXRvbWF0aWMiKTsKKyAgICAgICAgKCpwVGFibGUpWzBdLmt3ZCA9IHRtcHN0cmluZzsKKyAgICAgICAgdG1wc3RyaW5nID0gTlVMTDsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgKCpwVGFibGUpWzBdLmt3dmFsID0gRU5DVFlQRV9BTlk7CisgICAgICAgICgqcFRhYmxlKVswXS5mbGdzID0gMDsKKyNpZmRlZiBPUzIKKyAgICAgICAgKCpwVGFibGUpWzFdLmt3ZCA9c3RyZHVwKCJub25lIik7CisjZWxzZSAvKiBPUzIgKi8KKyAgICAgICAgbWFrZXN0cigmdG1wc3RyaW5nLCJub25lIik7CisgICAgICAgICgqcFRhYmxlKVsxXS5rd2QgPSB0bXBzdHJpbmc7CisgICAgICAgIHRtcHN0cmluZyA9IE5VTEw7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICgqcFRhYmxlKVsxXS5rd3ZhbCA9IDk5OTsKKyAgICAgICAgKCpwVGFibGUpWzFdLmZsZ3MgPSAwOworICAgICAgICAoKnBOKSA9IDI7CisKKyAgICAgICAgZm9yICggaT0wIDsgaSA8IG4gOyBpKysgKSB7CisgICAgICAgICAgICBjaGFyICogbmV3c3RyID0gTlVMTCwgKiBwOworICAgICAgICAgICAgaW50IG5ld3ZhbCA9IGVuY3J5cHRpb25zW2ldLnR5cGU7CisgICAgICAgICAgICBpbnQgaiA9IDAsIGxlbiA9IDA7CisKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIG5ld3N0ciA9IHN0cmR1cChlbmNyeXB0aW9uc1tpXS5uYW1lKTsKKyAgICAgICAgICAgIHN0cmx3cihuZXdzdHIpOworI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgICBtYWtlc3RyKCZ0bXBzdHJpbmcsZW5jcnlwdGlvbnNbaV0ubmFtZSk7CisgICAgICAgICAgICBuZXdzdHIgPSB0bXBzdHJpbmc7CisgICAgICAgICAgICB0bXBzdHJpbmcgPSBOVUxMOworICAgICAgICAgICAgZm9yIChwID0gbmV3c3RyOyAqcDsgcCsrKSBpZiAoaXN1cHBlcigqcCkpICpwID0gdG9sb3dlcigqcCk7CisjZW5kaWYgLyogT1MyICovCisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoKnBOKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IHRlbXB2YWwgPSAwOworICAgICAgICAgICAgICAgIGNoYXIgKiB0ZW1wc3RyID0gTlVMTDsKKworICAgICAgICAgICAgICAgIGlmICggc3RyY21wKCAoKnBUYWJsZSlbal0ua3dkLCBuZXdzdHIgKSA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcHZhbCA9ICgqcFRhYmxlKVtqXS5rd3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgdGVtcHN0ciA9ICgqcFRhYmxlKVtqXS5rd2Q7CisgICAgICAgICAgICAgICAgICAgICgqcFRhYmxlKVtqXS5rd2QgPSBuZXdzdHIgOworICAgICAgICAgICAgICAgICAgICAoKnBUYWJsZSlbal0ua3d2YWwgPSBuZXd2YWw7CisgICAgICAgICAgICAgICAgICAgIG5ld3ZhbCA9IHRlbXB2YWw7CisgICAgICAgICAgICAgICAgICAgIG5ld3N0ciA9IHRlbXBzdHI7CisgICAgICAgICAgICAgICAgICAgICgqcFRhYmxlKVtqXS5mbGdzID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKnBUYWJsZSlbKnBOXS5rd2QgPSBuZXdzdHIgOworICAgICAgICAgICAgKCpwVGFibGUpWypwTl0ua3d2YWwgPSBuZXd2YWw7CisgICAgICAgICAgICAoKnBUYWJsZSlbKnBOXS5mbGdzID0gMCA7CisgICAgICAgICAgICAoKnBOKSsrIDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICpwVGFibGUgPSBtYWxsb2MoIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSAqIDIgKSA7CisgICAgICAgIGlmICggISgqcFRhYmxlKSApCisgICAgICAgICAgICByZXR1cm4oMCk7CisKKyNpZmRlZiBPUzIKKyAgICAgICAgKCpwVGFibGUpWzBdLmt3ZCA9c3RyZHVwKCJhdXRvbWF0aWMiKTsKKyNlbHNlIC8qIE9TMiAqLworICAgICAgICBtYWtlc3RyKCZ0bXBzdHJpbmcsImF1dG9tYXRpYyIpOworICAgICAgICAoKnBUYWJsZSlbMF0ua3dkID0gdG1wc3RyaW5nOworICAgICAgICB0bXBzdHJpbmcgPSBOVUxMOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAoKnBUYWJsZSlbMF0ua3d2YWwgPSBFTkNUWVBFX0FOWTsKKyAgICAgICAgKCpwVGFibGUpWzBdLmZsZ3MgPSAwOworI2lmZGVmIE9TMgorICAgICAgICAoKnBUYWJsZSlbMV0ua3dkID1zdHJkdXAoIm5vbmUiKTsKKyNlbHNlIC8qIE9TMiAqLworICAgICAgICBtYWtlc3RyKCZ0bXBzdHJpbmcsIm5vbmUiKTsKKyAgICAgICAgKCpwVGFibGUpWzFdLmt3ZCA9IHRtcHN0cmluZzsKKyAgICAgICAgdG1wc3RyaW5nID0gTlVMTDsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgKCpwVGFibGUpWzFdLmt3dmFsID0gOTk5OworICAgICAgICAoKnBUYWJsZSlbMV0uZmxncyA9IDA7CisgICAgICAgICgqcE4pID0gMjsKKyAgICB9CisgICAgcmV0dXJuKCpwTik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHN0cl9zZW5kWzY0XSA9IHsgSUFDLCBTQiwgVEVMT1BUX0VOQ1JZUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQ1JZUFRfU1VQUE9SVCB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgc3RyX3N1cGxlbiA9IDA7CitzdGF0aWMgdW5zaWduZWQgY2hhciBzdHJfc3RhcnRbNzJdID0geyBJQUMsIFNCLCBURUxPUFRfRU5DUllQVElPTiB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgc3RyX2VuZFtdID0geyBJQUMsIFNCLCBURUxPUFRfRU5DUllQVElPTiwgMCwgSUFDLCBTRSB9OworCitfUFJPVE9UWVAoaW50ICBlbmNyeXB0X3JlcXVlc3RfZW5kLCAoVk9JRCkpOworX1BST1RPVFlQKGludCAgZW5jcnlwdF9yZXF1ZXN0X3N0YXJ0LCAoVk9JRCkpOworX1BST1RPVFlQKGludCAgZW5jcnlwdF9lbmNfa2V5aWQsICh1bnNpZ25lZCBjaGFyICosIGludCkpOworX1BST1RPVFlQKGludCAgZW5jcnlwdF9kZWNfa2V5aWQsICh1bnNpZ25lZCBjaGFyICosIGludCkpOworX1BST1RPVFlQKGludCAgZW5jcnlwdF9zdXBwb3J0LCAodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK19QUk9UT1RZUChpbnQgIGVuY3J5cHRfc3RhcnQsICh1bnNpZ25lZCBjaGFyICosIGludCkpOworX1BST1RPVFlQKGludCAgZW5jcnlwdF9lbmQsIChWT0lEKSk7CisKK19QUk9UT1RZUChpbnQgZW5jcnlwdF9rc19zdHJlYW0sKHN0cnVjdCBrc3RyZWFtX2RhdGFfYmxvY2sgKiwgLyogb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBrc3RyZWFtX2RhdGFfYmxvY2sgKikpOyAvKiBpbnB1dCAqLworCitfUFJPVE9UWVAoaW50IGRlY3J5cHRfa3Nfc3RyZWFtLChzdHJ1Y3Qga3N0cmVhbV9kYXRhX2Jsb2NrICosIC8qIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga3N0cmVhbV9kYXRhX2Jsb2NrICopKTsgLyogaW5wdXQgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2VuY3J5cHRfa3Nfc3RyZWFtKHN0cnVjdCBrc3RyZWFtX2RhdGFfYmxvY2sgKmksCisgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga3N0cmVhbV9kYXRhX2Jsb2NrICpvKQorI2Vsc2UKK2VuY3J5cHRfa3Nfc3RyZWFtKGksbykKKyAgICBzdHJ1Y3Qga3N0cmVhbV9kYXRhX2Jsb2NrICppOyBzdHJ1Y3Qga3N0cmVhbV9kYXRhX2Jsb2NrICpvOworI2VuZGlmCit7CisgICAgLyoKKyAgICAqIHRoaXMgaXMgcmVhbGx5IHF1aXRlIGJvZ3VzLCBzaW5jZSBpdCBkb2VzIGFuIGluLXBsYWNlIGVuY3J5cHRpb24uLi4KKyAgICAqLworICAgIGlmIChlbmNyeXB0X291dHB1dCkgeworICAgICAgICBlbmNyeXB0X291dHB1dChpLT5wdHIsIGktPmxlbmd0aCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitpbnQKKyNpZmRlZiBDS19BTlNJQworZGVjcnlwdF9rc19zdHJlYW0oc3RydWN0IGtzdHJlYW1fZGF0YV9ibG9jayAqaSwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBrc3RyZWFtX2RhdGFfYmxvY2sgKm8pCisjZWxzZQorZGVjcnlwdF9rc19zdHJlYW0oaSxvKQorICAgIHN0cnVjdCBrc3RyZWFtX2RhdGFfYmxvY2sgKmk7IHN0cnVjdCBrc3RyZWFtX2RhdGFfYmxvY2sgKm87CisjZW5kaWYKK3sKKyAgICB1bnNpZ25lZCBpbnQgbGVuOworICAvKgorICAgKiB0aGlzIGlzIHJlYWxseSBxdWl0ZSBib2d1cywgc2luY2UgaXQgZG9lcyBhbiBpbi1wbGFjZSBkZWNyeXB0aW9uLi4uCisgICAqLworICAgIGlmIChkZWNyeXB0X2lucHV0KSB7CisgICAgICAgIGZvciAobGVuID0gMCA7IGxlbiA8IGktPmxlbmd0aCA7IGxlbisrKQorICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopaS0+cHRyKVtsZW5dCisgICAgICAgICAgICAgICAgPSBkZWNyeXB0X2lucHV0KCgodW5zaWduZWQgY2hhciAqKWktPnB0cilbbGVuXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2RlY3J5cHRfa3NfaGFjayh1bnNpZ25lZCBjaGFyICpidWYsIGludCBjbnQpCisjZWxzZQorZGVjcnlwdF9rc19oYWNrKGJ1ZixjbnQpIHVuc2lnbmVkIGNoYXIgKmJ1ZjsgaW50IGNudDsKKyNlbmRpZgoreworICAgIGludCBsZW47CisgIC8qCisgICAqIHRoaXMgaXMgcmVhbGx5IHF1aXRlIGJvZ3VzLCBzaW5jZSBpdCBkb2VzIGFuIGluLXBsYWNlIGRlY3J5cHRpb24uLi4KKyAgICovCisgICAgZm9yIChsZW4gPSAwIDsgbGVuIDwgY250IDsgbGVuKyspCisgICAgICAgIGJ1ZltsZW5dID0gZGVjcnlwdF9pbnB1dChidWZbbGVuXSk7CisKKyNpZmRlZiBERUJVRworICAgIGhleGR1bXAoImRlY3J5cHQga3MgaGFjayIsIGJ1ZiwgY250KTsKKyNlbmRpZgorICAgIHJldHVybiAxOworfQorCisKKy8qCisgKiBwYXJzZWRhdFswXSA9PSB0aGUgc3Vib3B0aW9uIHdlIG1pZ2h0IGJlIG5lZ290aWF0aW5nLAorICovCitpbnQKKyNpZmRlZiBDS19BTlNJQworZW5jcnlwdF9wYXJzZSh1bnNpZ25lZCBjaGFyICpwYXJzZWRhdCwgaW50IGVuZF9zdWIpCisjZWxzZQorZW5jcnlwdF9wYXJzZShwYXJzZWRhdCxlbmRfc3ViKSB1bnNpZ25lZCBjaGFyICpwYXJzZWRhdDsgaW50IGVuZF9zdWI7CisjZW5kaWYKK3sKKyAgICBpbnQgcmMgPSAwOworCisgICAgc3dpdGNoKHBhcnNlZGF0WzFdKSB7CisgICAgY2FzZSBFTkNSWVBUX1NUQVJUOgorICAgICAgICByYyA9IGVuY3J5cHRfc3RhcnQocGFyc2VkYXQgKyAyLCBlbmRfc3ViIC0gMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRU5DUllQVF9FTkQ6CisgICAgICAgIHJjID0gZW5jcnlwdF9lbmQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFTkNSWVBUX1NVUFBPUlQ6CisgICAgICAgIHJjID0gZW5jcnlwdF9zdXBwb3J0KHBhcnNlZGF0ICsgMiwgZW5kX3N1YiAtIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVOQ1JZUFRfUkVRU1RBUlQ6CisgICAgICAgIHJjID0gZW5jcnlwdF9yZXF1ZXN0X3N0YXJ0KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRU5DUllQVF9SRVFFTkQ6CisgICAgICAgIC8qCisgICAgICAgICogV2UgY2FuIGFsd2F5cyBzZW5kIGFuIFJFUUVORCBzbyB0aGF0IHdlIGNhbm5vdAorICAgICAgICAqIGdldCBzdHVjayBlbmNyeXB0aW5nLiAgV2Ugc2hvdWxkIG9ubHkgZ2V0IHRoaXMKKyAgICAgICAgKiBpZiB3ZSBoYXZlIGJlZW4gYWJsZSB0byBnZXQgaW4gdGhlIGNvcnJlY3QgbW9kZQorICAgICAgICAqIGFueWhvdy4KKyAgICAgICAgKi8KKyAgICAgICAgcmMgPSBlbmNyeXB0X3JlcXVlc3RfZW5kKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRU5DUllQVF9JUzoKKyAgICAgICAgcmMgPSBlbmNyeXB0X2lzKHBhcnNlZGF0ICsgMiwgZW5kX3N1YiAtIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVOQ1JZUFRfUkVQTFk6CisgICAgICAgIHJjID0gZW5jcnlwdF9yZXBseShwYXJzZWRhdCArIDIsIGVuZF9zdWIgLSAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFTkNSWVBUX0VOQ19LRVlJRDoKKyAgICAgICAgcmMgPSBlbmNyeXB0X2VuY19rZXlpZChwYXJzZWRhdCArIDIsIGVuZF9zdWIgLSAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFTkNSWVBUX0RFQ19LRVlJRDoKKyAgICAgICAgcmMgPSBlbmNyeXB0X2RlY19rZXlpZChwYXJzZWRhdCArIDIsIGVuZF9zdWIgLSAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybihyYyk7Cit9CisKKy8qIFhYWCAqLworRW5jcnlwdGlvbnMgKgorI2lmZGVmIENLX0FOU0lDCitmaW5kZW5jcnlwdGlvbihpbnQgdHlwZSkKKyNlbHNlCitmaW5kZW5jcnlwdGlvbih0eXBlKSBpbnQgdHlwZTsKKyNlbmRpZgoreworICAgIEVuY3J5cHRpb25zICplcCA9IGVuY3J5cHRpb25zOworCisgICAgaWYgKCEoSV9TVVBQT1JUX0VOQ1JZUFQgJiByZW1vdGVfc3VwcG9ydHNfZGVjcnlwdCAmIHR5cGVtYXNrKHR5cGUpKSkKKyAgICAgICAgcmV0dXJuKDApOworICAgIHdoaWxlIChlcC0+dHlwZSAmJiBlcC0+dHlwZSAhPSB0eXBlKQorICAgICAgICArK2VwOworICAgIHJldHVybihlcC0+dHlwZSA/IGVwIDogMCk7Cit9CisKK0VuY3J5cHRpb25zICoKKyNpZmRlZiBDS19BTlNJQworZmluZGRlY3J5cHRpb24oaW50IHR5cGUpCisjZWxzZQorZmluZGRlY3J5cHRpb24odHlwZSkgaW50IHR5cGU7CisjZW5kaWYKK3sKKyAgICBFbmNyeXB0aW9ucyAqZXAgPSBlbmNyeXB0aW9uczsKKworICAgIGlmICghKElfU1VQUE9SVF9ERUNSWVBUICYgcmVtb3RlX3N1cHBvcnRzX2VuY3J5cHQgJiB0eXBlbWFzayh0eXBlKSkpCisgICAgICAgIHJldHVybigwKTsKKyAgICB3aGlsZSAoZXAtPnR5cGUgJiYgZXAtPnR5cGUgIT0gdHlwZSkKKyAgICAgICAgKytlcDsKKyAgICByZXR1cm4oZXAtPnR5cGUgPyBlcCA6IDApOworfQorCisjZGVmaW5lIE1BWEtFWUxFTiA2NAorCitzdGF0aWMgc3RydWN0IGtleV9pbmZvIHsKKyAgICB1bnNpZ25lZCBjaGFyIGtleWlkW01BWEtFWUxFTl07CisgICAgaW50IGtleWxlbjsKKyAgICBpbnQgZGlyOworICAgIGludCAqbW9kZXA7CisgICAgRW5jcnlwdGlvbnMgKigqZ2V0Y3J5cHQpKCk7Cit9IGtpWzJdID0geworICAgIHsgeyAwIH0sIDAsIERJUl9FTkNSWVBULCAmZW5jcnlwdF9tb2RlLCBmaW5kZW5jcnlwdGlvbiB9LAorICAgIHsgeyAwIH0sIDAsIERJUl9ERUNSWVBULCAmZGVjcnlwdF9tb2RlLCBmaW5kZGVjcnlwdGlvbiB9LAorfTsKKworVk9JRAorI2lmZGVmIENLX0FOU0lDCitlbmNyeXB0X2luaXQoa3N0cmVhbSBpa3MsIGludCB0eXBlKQorI2Vsc2UKK2VuY3J5cHRfaW5pdChpa3MsIHR5cGUpIGtzdHJlYW0gaWtzOyBpbnQgdHlwZTsKKyNlbmRpZgoreworICAgIEVuY3J5cHRpb25zICplcCA9IGVuY3J5cHRpb25zOworCisgICAgaV9zdXBwb3J0X2VuY3J5cHQgPSBpX3N1cHBvcnRfZGVjcnlwdCA9IDA7CisgICAgcmVtb3RlX3N1cHBvcnRzX2VuY3J5cHQgPSByZW1vdGVfc3VwcG9ydHNfZGVjcnlwdCA9IDA7CisgICAgaV93b250X3N1cHBvcnRfZW5jcnlwdCA9IGlfd29udF9zdXBwb3J0X2RlY3J5cHQgPSAwOworICAgIGVuY3J5cHRfbW9kZSA9IDA7CisgICAgZGVjcnlwdF9tb2RlID0gMDsKKyAgICBlbmNyeXB0X291dHB1dCA9IE5VTEw7CisgICAgZGVjcnlwdF9pbnB1dCA9IE5VTEw7CisgICAga2lbMF0ua2V5bGVuID0gMDsKKyAgICBtZW1zZXQoa2lbMF0ua2V5aWQsMCxNQVhLRVlMRU4pOworICAgIGtpWzFdLmtleWxlbiA9IDA7CisgICAgbWVtc2V0KGtpWzFdLmtleWlkLDAsTUFYS0VZTEVOKTsKKyAgICBoYXZlc2Vzc2lvbmtleSA9IDA7CisgICAgYXV0b2VuY3J5cHQgPSAxOworICAgIGF1dG9kZWNyeXB0ID0gMTsKKworICAgIEVuY3J5cHRLU0dsb2JhbEhhY2sgPSBpa3M7CisgICAgRW5jcnlwdFR5cGUgPSB0eXBlOworCisgICAgc3RyX3NlbmRbMF0gPSBJQUM7CisgICAgc3RyX3NlbmRbMV0gPSBTQjsKKyAgICBzdHJfc2VuZFsyXSA9IFRFTE9QVF9FTkNSWVBUSU9OOworICAgIHN0cl9zZW5kWzNdID0gRU5DUllQVF9TVVBQT1JUOworICAgIHN0cl9zdXBsZW4gPSA0OworCisgICAgd2hpbGUgKGVwLT50eXBlKSB7CisgICAgICAgIGlmICggRW5jcnlwdFR5cGUgPT0gRU5DVFlQRV9BTlkgfHwKKyAgICAgICAgICAgICBFbmNyeXB0VHlwZSA9PSBlcC0+dHlwZSApIHsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgaWYgKGVuY3J5cHRfZGVidWdfbW9kZSkgeworICAgICAgICAgICAgICAgIHNwcmludGYoZGJnYnVmLCAiPj4+SSB3aWxsIHN1cHBvcnQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRU5DVFlQRV9OQU1FKGVwLT50eXBlKSk7ICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJlbmNyeXB0X2luaXQiLGRiZ2J1ZiwwKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaV9zdXBwb3J0X2VuY3J5cHQgfD0gdHlwZW1hc2soZXAtPnR5cGUpOworICAgICAgICAgICAgaV9zdXBwb3J0X2RlY3J5cHQgfD0gdHlwZW1hc2soZXAtPnR5cGUpOworICAgICAgICAgICAgaWYgKChpX3dvbnRfc3VwcG9ydF9kZWNyeXB0ICYgdHlwZW1hc2soZXAtPnR5cGUpKSA9PSAwKQorICAgICAgICAgICAgICAgIGlmICgoc3RyX3NlbmRbc3RyX3N1cGxlbisrXSA9IGVwLT50eXBlKSA9PSBJQUMpCisgICAgICAgICAgICAgICAgICAgIHN0cl9zZW5kW3N0cl9zdXBsZW4rK10gPSBJQUM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVwLT5pbml0KQorICAgICAgICAgICAgKCplcC0+aW5pdCkoMCk7CisgICAgICAgICsrZXA7CisgICAgfQorICAgIHN0cl9zZW5kW3N0cl9zdXBsZW4rK10gPSBJQUM7CisgICAgc3RyX3NlbmRbc3RyX3N1cGxlbisrXSA9IFNFOworfQorCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2VuY3J5cHRfc2VuZF9zdXBwb3J0KFZPSUQpCisjZWxzZQorZW5jcnlwdF9zZW5kX3N1cHBvcnQoKQorI2VuZGlmCit7CisgICAgRW5jcnlwdGlvbnMgKmVwID0gZW5jcnlwdGlvbnM7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKQorICAgICAgICByZXR1cm47CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBzdHJfc2VuZFswXSA9IElBQzsKKyAgICBzdHJfc2VuZFsxXSA9IFNCOworICAgIHN0cl9zZW5kWzJdID0gVEVMT1BUX0VOQ1JZUFRJT047CisgICAgc3RyX3NlbmRbM10gPSBFTkNSWVBUX1NVUFBPUlQ7CisgICAgc3RyX3N1cGxlbiA9IDQ7CisKKyAgICB3aGlsZSAoZXAtPnR5cGUpIHsKKyAgICAgICAgaWYgKCBFbmNyeXB0VHlwZSA9PSBFTkNUWVBFX0FOWSB8fAorICAgICAgICAgICAgIEVuY3J5cHRUeXBlID09IGVwLT50eXBlICkgeworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihkYmdidWYsICI+Pj5JIHdpbGwgc3VwcG9ydCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFTkNUWVBFX05BTUUoZXAtPnR5cGUpKTsgICAgICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZW5jcnlwdF9zZW5kX3N1cHBvcnQiLGRiZ2J1ZiwwKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKChpX3dvbnRfc3VwcG9ydF9kZWNyeXB0ICYgdHlwZW1hc2soZXAtPnR5cGUpKSA9PSAwKQorICAgICAgICAgICAgICAgIGlmICgoc3RyX3NlbmRbc3RyX3N1cGxlbisrXSA9IGVwLT50eXBlKSA9PSBJQUMpCisgICAgICAgICAgICAgICAgICAgIHN0cl9zZW5kW3N0cl9zdXBsZW4rK10gPSBJQUM7CisgICAgICAgIH0KKyAgICAgICAgKytlcDsKKyAgICB9CisgICAgc3RyX3NlbmRbc3RyX3N1cGxlbisrXSA9IElBQzsKKyAgICBzdHJfc2VuZFtzdHJfc3VwbGVuKytdID0gU0U7CisKKyAgICAvKgorICAgICogSWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0aGF0IGRlY3J5cHRpb24gc3RhcnQKKyAgICAqIGltbWVkaWF0bHksIHRoZW4gc2VuZCBhICJSRVFVRVNUIFNUQVJUIiBiZWZvcmUKKyAgICAqIHdlIG5lZ290aWF0ZSB0aGUgdHlwZS4KKyAgICAqLworICAgIGlmIChhdXRvZGVjcnlwdCkKKyAgICAgICAgZW5jcnlwdF9zZW5kX3JlcXVlc3Rfc3RhcnQoKTsKKworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgc3ByaW50Zih0bl9tc2csIlRFTE5FVCBTRU5UIFNCICVzIFNVUFBPUlQgIiwKKyAgICAgICAgICAgICAgICAgVEVMT1BUKFRFTE9QVF9FTkNSWVBUSU9OKSk7ICAgICAgICAgICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgIGZvciAoIGk9NDtpPHN0cl9zdXBsZW4tMjtpKysgKSB7CisgICAgICAgICAgICBpZiAoIHN0cl9zZW5kW2ldID09IElBQyApIHsKKyAgICAgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnLCJJQUMgIixUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnLEVOQ1RZUEVfTkFNRShzdHJfc2VuZFtpXSksVE5fTVNHX0xFTik7CisgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnLCIgIixUTl9NU0dfTEVOKTsKKyAgICAgICAgfQorICAgICAgICBja3N0cm5jYXQodG5fbXNnLCJJQUMgU0UiLFROX01TR19MRU4pOworICAgICAgICBkZWJ1ZyhGMTAwLHRuX21zZywiIiwwKTsKKyAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZyk7CisgICAgfQorI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisgICAgdHRvbChzdHJfc2VuZCwgc3RyX3N1cGxlbik7CisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKworICAgIHN0cl9zdXBsZW4gPSAwOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gRU5DUllQVCBTVVBQT1JUIGlzIHJlY2VpdmVkLgorICovCitpbnQKKyNpZmRlZiBDS19BTlNJQworZW5jcnlwdF9zdXBwb3J0KHVuc2lnbmVkIGNoYXIgKl90eXBlbGlzdCwgaW50IF9jbnQpCisjZWxzZQorZW5jcnlwdF9zdXBwb3J0KF90eXBlbGlzdCwgX2NudCkgdW5zaWduZWQgY2hhciAqIF90eXBlbGlzdDsgaW50IF9jbnQ7CisjZW5kaWYKK3sKKyAgICByZWdpc3RlciBpbnQgdHlwZSwgdXNlX3R5cGUgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgKiB0eXBlbGlzdCA9IF90eXBlbGlzdDsKKyAgICBpbnQgY250ID0gX2NudDsKKyAgICBFbmNyeXB0aW9ucyAqZXA7CisKKyAgICBkZWJ1ZyhGMTExLCJlbmNyeXB0X3N1cHBvcnQiLCJjbnQiLGNudCk7CisKKyAgLyoKKyAgICogRm9yZ2V0IGFueXRoaW5nIHRoZSBvdGhlciBzaWRlIGhhcyBwcmV2aW91c2x5IHRvbGQgdXMuCisgICAqLworICAgIHJlbW90ZV9zdXBwb3J0c19kZWNyeXB0ID0gMDsKKworICAgIHdoaWxlIChjbnQtLSA+IDApIHsKKyAgICAgICAgdHlwZSA9ICp0eXBlbGlzdCsrOworICAgICAgICBpZiAoIEVuY3J5cHRUeXBlID09IEVOQ1RZUEVfQU5ZIHx8CisgICAgICAgICAgICAgRW5jcnlwdFR5cGUgPT0gdHlwZSApIHsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgaWYgKGVuY3J5cHRfZGVidWdfbW9kZSkgeworICAgICAgICAgICAgICAgIHNwcmludGYoZGJnYnVmLCAiPj4+UmVtb3RlIHN1cHBvcnRzICVzICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRU5DVFlQRV9OQU1FKHR5cGUpLCB0eXBlKTsgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImVuY3J5cHRfc3VwcG9ydCIsZGJnYnVmLDApOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAoKHR5cGUgPCBFTkNUWVBFX0NOVCkgJiYKKyAgICAgICAgICAgICAgICAgKElfU1VQUE9SVF9FTkNSWVBUICYgdHlwZW1hc2sodHlwZSkpKSB7CisgICAgICAgICAgICAgICAgcmVtb3RlX3N1cHBvcnRzX2RlY3J5cHQgfD0gdHlwZW1hc2sodHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKHVzZV90eXBlID09IDApCisgICAgICAgICAgICAgICAgICAgIHVzZV90eXBlID0gdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodXNlX3R5cGUpIHsKKyAgICAgICAgZXAgPSBmaW5kZW5jcnlwdGlvbih1c2VfdHlwZSk7CisgICAgICAgIGlmICghZXApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImVuY3J5cHRfc3VwcG9ydCIsImZpbmRlbmNyeXB0aW9uID09IE5VTEwiLHVzZV90eXBlKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgdHlwZSA9IGVwLT5zdGFydCA/ICgqZXAtPnN0YXJ0KShESVJfRU5DUllQVCwgMCkgOiAwOworI2lmZGVmIERFQlVHCisgICAgICAgIGlmIChlbmNyeXB0X2RlYnVnX21vZGUpIHsKKyAgICAgICAgICAgIHNwcmludGYoZGJnYnVmLCAiPj4+KCplcC0+c3RhcnQpKCkgJXMgcmV0dXJuZWQgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIEVOQ1RZUEVfTkFNRSh1c2VfdHlwZSksIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICBFTkNSWVBUX05BTUUodHlwZSkpOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgZGVidWcoRjExMCwiZW5jcnlwdF9zdXBwb3J0IixkYmdidWYsMCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAodHlwZSA8IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImVuY3J5cHRfc3VwcG9ydCIsInR5cGUgPCAwIix0eXBlKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgZW5jcnlwdF9tb2RlID0gdXNlX3R5cGU7CisgICAgICAgIGlmICh0eXBlID09IDApCisgICAgICAgICAgICBlbmNyeXB0X3N0YXJ0X291dHB1dCh1c2VfdHlwZSk7CisgICAgICAgIGRlYnVnKEYxMTEsImVuY3J5cHRfc3VwcG9ydCIsInN1Y2Nlc3MiLHR5cGUpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsImVuY3J5cHRfc3VwcG9ydCIsImZhaWxlZCIsdXNlX3R5cGUpOworICAgIHJldHVybigtMSk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitlbmNyeXB0X2lzKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBjbnQpCisjZWxzZQorZW5jcnlwdF9pcyhkYXRhLCBjbnQpIHVuc2lnbmVkIGNoYXIgKmRhdGE7IGludCBjbnQ7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBFbmNyeXB0aW9ucyAqZXA7CisgICAgcmVnaXN0ZXIgaW50IHR5cGUsIHJldDsKKworICAgIGlmICgtLWNudCA8IDApCisgICAgICAgIHJldHVybigtMSk7CisgICAgdHlwZSA9ICpkYXRhKys7CisgICAgaWYgKHR5cGUgPCBFTkNUWVBFX0NOVCkKKyAgICAgICAgcmVtb3RlX3N1cHBvcnRzX2VuY3J5cHQgfD0gdHlwZW1hc2sodHlwZSk7CisgICAgaWYgKCEoZXAgPSBmaW5kZGVjcnlwdGlvbih0eXBlKSkpIHsKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICAgICAgICBzcHJpbnRmKGRiZ2J1ZiwgIj4+PmVuY3J5cHRfaXM6ICAiCisgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZmluZCB0eXBlICVzICglZCkgZm9yIGluaXRpYWwgbmVnb3RpYXRpb25cbiIsCisgICAgICAgICAgICAgICAgICAgICBFTkNUWVBFX05BTUVfT0sodHlwZSkKKyAgICAgICAgICAgICAgICAgICAgID8gRU5DVFlQRV9OQU1FKHR5cGUpIDogIih1bmtub3duKSIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgZGVidWcoRjExMCwiZW5jcnlwdF9pcyIsZGJnYnVmLDApOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgaWYgKCFlcC0+aXMpIHsKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICAgICAgICBzcHJpbnRmKGRiZ2J1ZiwgIj4+PmVuY3J5cHRfaXM6ICAiCisgICAgICAgICAgICAgICAgICAgICAiTm8gaW5pdGlhbCBuZWdvdGlhdGlvbiBuZWVkZWQgZm9yIHR5cGUgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIEVOQ1RZUEVfTkFNRV9PSyh0eXBlKQorICAgICAgICAgICAgICAgICAgICAgPyBFTkNUWVBFX05BTUUodHlwZSkgOiAiKHVua25vd24pIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJlbmNyeXB0X2lzIixkYmdidWYsMCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICByZXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9ICgqZXAtPmlzKShkYXRhLCBjbnQpOworI2lmZGVmIERFQlVHCisgICAgICAgIGlmIChlbmNyeXB0X2RlYnVnX21vZGUpIHsKKyAgICAgICAgICAgIHNwcmludGYoZGJnYnVmLCAiZW5jcnlwdF9pczogICIKKyAgICAgICAgICAgICAgICAgICAgICIoKmVwLT5pcykoJXgsICVkKSByZXR1cm5lZCAlcyglZClcbiIsIGRhdGEsIGNudCwKKyAgICAgICAgICAgICAgICAgICAgIChyZXQgPCAwKSA/ICJGQUlMICIgOgorICAgICAgICAgICAgICAgICAgICAgKHJldCA9PSAwKSA/ICJTVUNDRVNTICIgOiAiTU9SRV9UT19ETyAiLCByZXQpOyAvKiBzYWZlICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJlbmNyeXB0X2lzIixkYmdidWYsMCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdXRvZGVjcnlwdCA9IDA7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVjcnlwdF9tb2RlID0gdHlwZTsKKyAgICAgICAgaWYgKHJldCA9PSAwICYmIGF1dG9kZWNyeXB0KSB7CisgICAgICAgICAgICBlbmNyeXB0X3NlbmRfcmVxdWVzdF9zdGFydCgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2VuY3J5cHRfcmVwbHkodW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGNudCkKKyNlbHNlCitlbmNyeXB0X3JlcGx5KGRhdGEsIGNudCkgdW5zaWduZWQgY2hhciAqZGF0YTsgaW50IGNudDsKKyNlbmRpZgoreworICAgIEVuY3J5cHRpb25zICplcDsKKyAgICByZWdpc3RlciBpbnQgcmV0LCB0eXBlOworCisgICAgaWYgKC0tY250IDwgMCkKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB0eXBlID0gKmRhdGErKzsKKyAgICBpZiAoIShlcCA9IGZpbmRlbmNyeXB0aW9uKHR5cGUpKSkgeworI2lmZGVmIERFQlVHCisgICAgICAgIGlmIChlbmNyeXB0X2RlYnVnX21vZGUpIHsKKyAgICAgICAgICAgIHNwcmludGYoZGJnYnVmLAorICAgICAgICAgICAgICAgICAgICAiPj4+Q2FuJ3QgZmluZCB0eXBlICVzICglZCkgZm9yIGluaXRpYWwgbmVnb3RpYXRpb25cbiIsCisgICAgICAgICAgICAgICAgICAgICBFTkNUWVBFX05BTUVfT0sodHlwZSkKKyAgICAgICAgICAgICAgICAgICAgID8gRU5DVFlQRV9OQU1FKHR5cGUpIDogIih1bmtub3duKSIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgZGVidWcoRjExMCwiZW5jcnlwdF9yZXBseSIsZGJnYnVmLDApOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgaWYgKCFlcC0+cmVwbHkpIHsKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICBzcHJpbnRmKGRiZ2J1ZiwgIj4+Pk5vIGluaXRpYWwgbmVnb3RpYXRpb24gbmVlZGVkIGZvciB0eXBlICVzICglZClcbiIsCisgICAgICAgICAgICAgICBFTkNUWVBFX05BTUVfT0sodHlwZSkKKyAgICAgICAgICAgICAgID8gRU5DVFlQRV9OQU1FKHR5cGUpIDogIih1bmtub3duKSIsCisgICAgICAgICAgICAgICB0eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgZGVidWcoRjExMCwiZW5jcnlwdF9yZXBseSIsZGJnYnVmLDApOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSAoKmVwLT5yZXBseSkoZGF0YSwgY250KTsKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICAgICAgICBzcHJpbnRmKGRiZ2J1ZiwgIigqZXAtPnJlcGx5KSgleCwgJWQpIHJldHVybmVkICVzKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGNudCwKKyAgICAgICAgICAgICAgICAgICAgIChyZXQgPCAwKSA/ICJGQUlMICIgOgorICAgICAgICAgICAgICAgICAgICAgKHJldCA9PSAwKSA/ICJTVUNDRVNTICIgOiAiTU9SRV9UT19ETyAiLCByZXQpOyAvKiBzYWZlICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJlbmNyeXB0X3JlcGx5IixkYmdidWYsMCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyNpZmRlZiBERUJVRworICAgIGlmIChlbmNyeXB0X2RlYnVnX21vZGUpIHsKKyAgICAgICAgc3ByaW50ZihkYmdidWYsICI+Pj5lbmNyeXB0X3JlcGx5IHJldHVybmVkICVkXG4iLCByZXQpOyAvKiBzYWZlICovCisgICAgICAgIGRlYnVnKEYxMTAsImVuY3J5cHRfcmVwbHkiLGRiZ2J1ZiwwKTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdXRvZW5jcnlwdCA9IDA7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW5jcnlwdF9tb2RlID0gdHlwZTsKKyAgICAgICAgaWYgKHJldCA9PSAwICYmIGF1dG9lbmNyeXB0KQorICAgICAgICAgICAgZW5jcnlwdF9zdGFydF9vdXRwdXQodHlwZSk7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIGEgRU5DUllQVCBTVEFSVCBjb21tYW5kIGlzIHJlY2VpdmVkLgorICovCitpbnQKKyNpZmRlZiBDS19BTlNJQworZW5jcnlwdF9zdGFydCh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgY250KQorI2Vsc2UKK2VuY3J5cHRfc3RhcnQoZGF0YSwgY250KSB1bnNpZ25lZCBjaGFyICpkYXRhOyBpbnQgY250OworI2VuZGlmCit7CisgICAgRW5jcnlwdGlvbnMgKmVwOworCisgICAgaWYgKCFkZWNyeXB0X21vZGUpIHsKKyAgICAgICAgLyoKKyAgICAgICAgKiBTb21ldGhpbmcgaXMgd3JvbmcuICBXZSBzaG91bGQgbm90IGdldCBhIFNUQVJUCisgICAgICAgICogY29tbWFuZCB3aXRob3V0IGhhdmluZyBhbHJlYWR5IHBpY2tlZCBvdXIKKyAgICAgICAgKiBkZWNyeXB0aW9uIHNjaGVtZS4gIFNlbmQgYSBSRVFVRVNULUVORCB0bworICAgICAgICAqIGF0dGVtcHQgdG8gY2xlYXIgdGhlIGNoYW5uZWwuLi4KKyAgICAgICAgKi8KKyAgICAgICAgZW5jcnlwdF9zZW5kX3JlcXVlc3RfZW5kKCk7CisgICAgICAgIHByaW50ZigiQXV0aGVudGljYXRpb24gZXJyb3IhXG4lc1xuIiwKKyAgICAgICAgICAgICAgICAiV2FybmluZywgQ2Fubm90IGRlY3J5cHQgaW5wdXQgc3RyZWFtISEhIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgaWYgKGVwID0gZmluZGRlY3J5cHRpb24oZGVjcnlwdF9tb2RlKSkgeworICAgICAgICBpZiAoIGRlY3J5cHRfaW5wdXQgIT0gZXAtPmlucHV0ICkgeworICAgICAgICAgICAgZGVjcnlwdF9pbnB1dCA9IGVwLT5pbnB1dDsKKyAgICAgICAgICAgIEVuY3J5cHRLU0dsb2JhbEhhY2stPmRlY3J5cHQgPSBkZWNyeXB0X2tzX3N0cmVhbTsKKyAgICAgICAgICAgIEVuY3J5cHRLU0dsb2JhbEhhY2stPmRlY3J5cHRfdHlwZSA9IGVwLT50eXBlOworCisgICAgICAgICAgICBpZiAoZW5jcnlwdF92ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihkYmdidWYsICJJbnB1dCBpcyBub3cgZGVjcnlwdGVkIHdpdGggdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRU5DVFlQRV9OQU1FKGRlY3J5cHRfbW9kZSkpOyAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImVuY3J5cHRfc3RhcnQiLGRiZ2J1ZiwwKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzXG4iLGRiZ2J1Zik7CisgICAgICAgICAgICB9CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGlmIChlbmNyeXB0X2RlYnVnX21vZGUpIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGRiZ2J1ZiwgIj4+PlN0YXJ0IHRvIGRlY3J5cHQgaW5wdXQgd2l0aCB0eXBlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFTkNUWVBFX05BTUUoZGVjcnlwdF9tb2RlKSk7ICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfY3JwIixkYmdidWYsMCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgYnVmWzEwMjRdOworICAgICAgICBzcHJpbnRmKGJ1ZiwgIldhcm5pbmcsIENhbm5vdCBkZWNyeXB0IHR5cGUgJXMgKCVkKSEhISIsCisgICAgICAgICAgICAgICAgICBFTkNUWVBFX05BTUVfT0soZGVjcnlwdF9tb2RlKQorICAgICAgICAgICAgICAgICAgPyBFTkNUWVBFX05BTUUoZGVjcnlwdF9tb2RlKSA6ICIodW5rbm93bikiLAorICAgICAgICAgICAgICAgICAgZGVjcnlwdF9tb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgcHJpbnRmKCJBdXRoZW50aWNhdGlvbiBlcnJvciFcbiVzXG4iLGJ1Zik7CisgICAgICAgIGVuY3J5cHRfc2VuZF9yZXF1ZXN0X2VuZCgpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitlbmNyeXB0X2RvbnRfc3VwcG9ydChpbnQgdHlwZSkKKyNlbHNlCitlbmNyeXB0X2RvbnRfc3VwcG9ydCh0eXBlKSBpbnQgdHlwZTsKKyNlbmRpZgoreworICAgIGlfd29udF9zdXBwb3J0X2VuY3J5cHQgfD0gdHlwZW1hc2sodHlwZSk7CisgICAgaV93b250X3N1cHBvcnRfZGVjcnlwdCB8PSB0eXBlbWFzayh0eXBlKTsKKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitlbmNyeXB0X3Nlc3Npb25fa2V5KFNlc3Npb25fS2V5ICprZXksIGludCBzZXJ2ZXIpCisjZWxzZQorZW5jcnlwdF9zZXNzaW9uX2tleShrZXksIHNlcnZlcikgU2Vzc2lvbl9LZXkgKmtleTsgaW50IHNlcnZlcjsKKyNlbmRpZgoreworICAgIEVuY3J5cHRpb25zICplcCA9IGVuY3J5cHRpb25zOworCisgICAgaWYgKGhhdmVzZXNzaW9ua2V5KQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICBoYXZlc2Vzc2lvbmtleSA9IDE7CisKKyAgICB3aGlsZSAoZXAtPnR5cGUpIHsKKyAgICAgICAgZGVidWcoRjExMSwiZW5jcnlwdF9zZXNzaW9uX2tleSIsZXAtPm5hbWUsZXAtPnR5cGUpOworICAgICAgICBpZiAoZXAtPnNlc3Npb24pIHsKKyAgICAgICAgICAgIGlmICgoKmVwLT5zZXNzaW9uKShrZXksIHNlcnZlcikgPCAwKSB7CisgICAgICAgICAgICAgICAgaV93b250X3N1cHBvcnRfZW5jcnlwdCB8PSB0eXBlbWFzayhlcC0+dHlwZSk7CisgICAgICAgICAgICAgICAgaV93b250X3N1cHBvcnRfZGVjcnlwdCB8PSB0eXBlbWFzayhlcC0+dHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytlcDsKKyAgICB9CisgICAgZGVidWcoRjExMSwiZW5jcnlwdF9zZXNzaW9uX2tleSAoZG9uZSkiLGVwLT5uYW1lLGVwLT50eXBlKTsKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBFTkNSWVBUIEVORCBpcyByZWNlaXZlZC4KKyAqLworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2VuY3J5cHRfZW5kKFZPSUQpCisjZWxzZQorZW5jcnlwdF9lbmQoKQorI2VuZGlmCit7CisgICAgZGVjcnlwdF9pbnB1dCA9IE5VTEw7CisgICAgRW5jcnlwdEtTR2xvYmFsSGFjay0+ZGVjcnlwdCA9IE5VTEw7CisgICAgRW5jcnlwdEtTR2xvYmFsSGFjay0+ZGVjcnlwdF90eXBlID0gRU5DVFlQRV9BTlk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICAgIHNwcmludGYoZGJnYnVmLCAiPj4+SW5wdXQgaXMgYmFjayB0byBjbGVhciB0ZXh0Iik7ICAgICAgLyogc2FmZSAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJlbmNyeXB0X2VuZCIsZGJnYnVmLDApOworICAgIH0KKyNlbmRpZgorICAgIGlmIChlbmNyeXB0X3ZlcmJvc2UpIHsKKyAgICAgICAgc3ByaW50ZihkYmdidWYsICJJbnB1dCBpcyBub3cgY2xlYXIgdGV4dCIpOyAgICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgIGRlYnVnKEYxMTAsImVuY3J5cHRfZW5kIixkYmdidWYsMCk7CisgICAgICAgIHByaW50ZigiJXNcbiIsZGJnYnVmKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gRU5DUllQVCBSRVFVRVNULUVORCBpcyByZWNlaXZlZC4KKyAqLworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2VuY3J5cHRfcmVxdWVzdF9lbmQoVk9JRCkKKyNlbHNlCitlbmNyeXB0X3JlcXVlc3RfZW5kKCkKKyNlbmRpZgoreworICAgIGVuY3J5cHRfc2VuZF9lbmQoKTsKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBFTkNSWVBUIFJFUVVFU1QtU1RBUlQgaXMgcmVjZWl2ZWQuICBJZiB3ZSByZWNlaXZlCisgKiB0aGlzIGJlZm9yZSBhIHR5cGUgaXMgcGlja2VkLCB0aGVuIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlCisgKiBvdGhlciBzaWRlIHdhbnRzIHVzIHRvIHN0YXJ0IGVuY3J5cHRpbmcgZGF0YSBhcyBzb29uIGFzIHdlCisgKiBjYW4uCisgKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCitlbmNyeXB0X3JlcXVlc3Rfc3RhcnQoVk9JRCkKKyNlbHNlCitlbmNyeXB0X3JlcXVlc3Rfc3RhcnQoKQorI2VuZGlmCit7CisgICAgaWYgKGVuY3J5cHRfbW9kZSAhPSAwKQorICAgICAgICBlbmNyeXB0X3N0YXJ0X291dHB1dChlbmNyeXB0X21vZGUpOworICAgIHJldHVybigwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc3RyX2tleWlkWyhNQVhLRVlMRU4qMikrNV0gPSB7CisgICAgSUFDLCBTQiwgVEVMT1BUX0VOQ1JZUFRJT04KK307CitfUFJPVE9UWVAoaW50IGVuY3J5cHRfa2V5aWQsKHN0cnVjdCBrZXlfaW5mbyAqLHVuc2lnbmVkIGNoYXIgKixpbnQpKTsKKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2VuY3J5cHRfZW5jX2tleWlkKHVuc2lnbmVkIGNoYXIgKmtleWlkLCBpbnQgbGVuKQorI2Vsc2UKK2VuY3J5cHRfZW5jX2tleWlkKGtleWlkLCBsZW4pIHVuc2lnbmVkIGNoYXIgKmtleWlkOyBpbnQgbGVuOworI2VuZGlmCit7CisgICAgcmV0dXJuKGVuY3J5cHRfa2V5aWQoJmtpWzFdLCBrZXlpZCwgbGVuKSk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitlbmNyeXB0X2RlY19rZXlpZCh1bnNpZ25lZCBjaGFyICprZXlpZCwgaW50IGxlbikKKyNlbHNlCitlbmNyeXB0X2RlY19rZXlpZChrZXlpZCwgbGVuKSB1bnNpZ25lZCBjaGFyICprZXlpZDsgaW50IGxlbjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHJldHVybihlbmNyeXB0X2tleWlkKCZraVswXSwga2V5aWQsIGxlbikpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworZW5jcnlwdF9rZXlpZChzdHJ1Y3Qga2V5X2luZm8gKmtwLCB1bnNpZ25lZCBjaGFyICprZXlpZCwgaW50IGxlbikKKyNlbHNlCitlbmNyeXB0X2tleWlkKGtwLCBrZXlpZCwgbGVuKQorICAgIHN0cnVjdCBrZXlfaW5mbyAqa3A7IHVuc2lnbmVkIGNoYXIgKmtleWlkOyBpbnQgbGVuOworI2VuZGlmCit7CisgICAgRW5jcnlwdGlvbnMgKmVwOworICAgIGludCBkaXIgPSBrcC0+ZGlyOworICAgIHJlZ2lzdGVyIGludCByZXQgPSAwOworCisgICAgaWYgKCEoZXAgPSAoKmtwLT5nZXRjcnlwdCkoKmtwLT5tb2RlcCkpKSB7CisgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGtwLT5rZXlsZW4gPSAwOworICAgIH0gZWxzZSBpZiAobGVuID09IDAgfHwgbGVuID4gTUFYS0VZTEVOKSB7CisgICAgICAgIC8qCisgICAgICAgICogRW1wdHkgb3B0aW9uIG9yIEtleSB0b28gbG9uZywgaW5kaWNhdGVzIGEgZmFpbHVyZS4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGtwLT5rZXlsZW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGtwLT5rZXlsZW4gPSAwOworICAgICAgICBpZiAoZXAtPmtleWlkKQorICAgICAgICAgICAgKHZvaWQpKCplcC0+a2V5aWQpKGRpciwga3AtPmtleWlkLCAma3AtPmtleWxlbik7CisKKyAgICB9IGVsc2UgaWYgKChsZW4gIT0ga3AtPmtleWxlbikgfHwgKG1lbWNtcChrZXlpZCwga3AtPmtleWlkLCBsZW4pICE9IDApKSB7CisgICAgICAgIC8qCisgICAgICAgICogTGVuZ3RoIG9yIGNvbnRlbnRzIGFyZSBkaWZmZXJlbnQKKyAgICAgICAgKi8KKyAgICAgICAga3AtPmtleWxlbiA9IGxlbjsKKyAgICAgICAgbWVtY3B5KGtwLT5rZXlpZCwga2V5aWQsIGxlbik7ICAgICAgICAgIC8qIGxlbmd0aCA8IE1BWEtFWUxFTiAqLworICAgICAgICBpZiAoZXAtPmtleWlkKQorICAgICAgICAgICAgKHZvaWQpKCplcC0+a2V5aWQpKGRpciwga3AtPmtleWlkLCAma3AtPmtleWxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGVwLT5rZXlpZCkKKyAgICAgICAgICAgIHJldCA9ICgqZXAtPmtleWlkKShkaXIsIGtwLT5rZXlpZCwgJmtwLT5rZXlsZW4pOworICAgICAgICBpZiAoKHJldCA9PSAwKSAmJiAoZGlyID09IERJUl9FTkNSWVBUKSAmJiBhdXRvZW5jcnlwdCkKKyAgICAgICAgICAgIGVuY3J5cHRfc3RhcnRfb3V0cHV0KCprcC0+bW9kZXApOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgZW5jcnlwdF9zZW5kX2tleWlkKGRpciwga3AtPmtleWlkLCBrcC0+a2V5bGVuLCAwKTsKKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitlbmNyeXB0X3NlbmRfa2V5aWQoaW50IGRpciwgdW5zaWduZWQgY2hhciAqa2V5aWQsIGludCBrZXlsZW4sIGludCBzYXZlaXQpCisjZWxzZQorZW5jcnlwdF9zZW5kX2tleWlkKGRpciwga2V5aWQsIGtleWxlbiwgc2F2ZWl0KQorICAgICBpbnQgZGlyOyB1bnNpZ25lZCBjaGFyICprZXlpZDsgaW50IGtleWxlbjsgaW50IHNhdmVpdDsKKyNlbmRpZgoreworICAgIHVuc2lnbmVkIGNoYXIgKnN0cnA7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKQorICAgICAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBzdHJfa2V5aWRbM10gPSAoZGlyID09IERJUl9FTkNSWVBUKQorICAgICAgICA/IEVOQ1JZUFRfRU5DX0tFWUlEIDogRU5DUllQVF9ERUNfS0VZSUQ7CisgICAgaWYgKHNhdmVpdCAmJiBrZXlsZW4gPD0gTUFYS0VZTEVOKSB7CisgICAgICAgIHN0cnVjdCBrZXlfaW5mbyAqa3AgPSAma2lbKGRpciA9PSBESVJfRU5DUllQVCkgPyAwIDogMV07CisgICAgICAgIG1lbWNweShrcC0+a2V5aWQsIGtleWlkLCBrZXlsZW4pOworICAgICAgICBrcC0+a2V5bGVuID0ga2V5bGVuOworICAgIH0KKworICAgIGZvciAoc3RycCA9ICZzdHJfa2V5aWRbNF07IGtleWxlbiA+IDA7IC0ta2V5bGVuKSB7CisgICAgICAgIGlmICgoKnN0cnArKyA9ICprZXlpZCsrKSA9PSBJQUMpCisgICAgICAgICAgICAqc3RycCsrID0gSUFDOworICAgIH0KKyAgICAqc3RycCsrID0gSUFDOworICAgICpzdHJwKysgPSBTRTsKKworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgc3ByaW50Zih0bl9tc2csIlRFTE5FVCBTRU5UIFNCICVzICVzICIsCisgICAgICAgICAgICAgICAgIFRFTE9QVChURUxPUFRfRU5DUllQVElPTiksCisgICAgICAgICAgICAgICAgIChkaXIgPT0gRElSX0VOQ1JZUFQpID8gIkVOQy1LRVlJRCIgOiAiREVDLUtFWUlEIik7IC8qIHNhZmUgKi8KKyAgICAgICAgdG5faGV4KHRuX21zZyxUTl9NU0dfTEVOLCZzdHJfa2V5aWRbNF0sc3RycC1zdHJfa2V5aWQtMi00KTsKKyAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiSUFDIFNFIixUTl9NU0dfTEVOKTsKKyAgICAgICAgZGVidWcoRjEwMCx0bl9tc2csIiIsMCk7CisgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgIH0KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorICAgIHR0b2woc3RyX2tleWlkLCBzdHJwIC0gc3RyX2tleWlkKTsKKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIHJldHVybigwKTsKK30KKworVk9JRAorI2lmZGVmIENLX0FOU0lDCitlbmNyeXB0X2F1dG8oaW50IG9uKQorI2Vsc2UKK2VuY3J5cHRfYXV0byhvbikgaW50IG9uOworI2VuZGlmCit7CisgICAgaWYgKG9uIDwgMCkKKyAgICAgICAgYXV0b2VuY3J5cHQgXj0gMTsKKyAgICBlbHNlCisgICAgICAgIGF1dG9lbmNyeXB0ID0gb24gPyAxIDogMDsKK30KKworVk9JRAorI2lmZGVmIENLX0FOU0lDCitkZWNyeXB0X2F1dG8oaW50IG9uKQorI2Vsc2UKK2RlY3J5cHRfYXV0byhvbikgaW50IG9uOworI2VuZGlmCit7CisgICAgaWYgKG9uIDwgMCkKKyAgICAgICAgYXV0b2RlY3J5cHQgXj0gMTsKKyAgICBlbHNlCisgICAgICAgIGF1dG9kZWNyeXB0ID0gb24gPyAxIDogMDsKK30KKworVk9JRAorI2lmZGVmIENLX0FOU0lDCitlbmNyeXB0X3N0YXJ0X291dHB1dChpbnQgdHlwZSkKKyNlbHNlCitlbmNyeXB0X3N0YXJ0X291dHB1dCh0eXBlKSBpbnQgdHlwZTsKKyNlbmRpZgoreworICAgIEVuY3J5cHRpb25zICplcDsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOworICAgIHJlZ2lzdGVyIGludCBpOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykKKyAgICAgICAgcmV0dXJuOworI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgaWYgKCEoZXAgPSBmaW5kZW5jcnlwdGlvbih0eXBlKSkpIHsKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICAgICAgICBzcHJpbnRmKGRiZ2J1ZiwgIj4+PkNhbid0IGVuY3J5cHQgd2l0aCB0eXBlICVzICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICBFTkNUWVBFX05BTUVfT0sodHlwZSkKKyAgICAgICAgICAgICAgICAgICAgID8gRU5DVFlQRV9OQU1FKHR5cGUpIDogIih1bmtub3duKSIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgZGVidWcoRjExMCwiZW5jcnlwdF9zdGFydF9vdXRwdXQiLGRiZ2J1ZiwwKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGVwLT5zdGFydCkgeworICAgICAgICBpID0gKCplcC0+c3RhcnQpKERJUl9FTkNSWVBULCAwKTsKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICAgICAgICBzcHJpbnRmKGRiZ2J1ZiwgIj4+PkVuY3J5cHQgc3RhcnQ6ICVzICglZCkgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAoaSA8IDApID8gImZhaWxlZCIgOgorICAgICAgICAgICAgICAgICAgICAgImluaXRpYWwgbmVnb3RpYXRpb24gaW4gcHJvZ3Jlc3MiLAorICAgICAgICAgICAgICAgICAgICAgaSwgRU5DVFlQRV9OQU1FKHR5cGUpKTsgICAgICAgICAgICAgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImVuY3J5cHRfc3RhcnRfb3V0cHV0IixkYmdidWYsMCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoaSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIGVuY3J5cHRfb3V0cHV0ICE9IGVwLT5vdXRwdXQgKSB7CisgICAgICAgIHAgPSBzdHJfc3RhcnQ7CisgICAgICAgICpwKysgPSBJQUM7CisgICAgICAgICpwKysgPSBTQjsKKyAgICAgICAgKnArKyA9IFRFTE9QVF9FTkNSWVBUSU9OOworICAgICAgICAqcCsrID0gRU5DUllQVF9TVEFSVDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGtpWzBdLmtleWxlbjsgKytpKSB7CisgICAgICAgICAgICBpZiAoKCAqcCsrID0ga2lbMF0ua2V5aWRbaV0pID09IElBQykKKyAgICAgICAgICAgICAgICAqcCsrID0gSUFDOworICAgICAgICB9CisgICAgICAgICpwKysgPSBJQUM7CisgICAgICAgICpwKysgPSBTRTsKKworICAgICAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgc3ByaW50Zih0bl9tc2csIlRFTE5FVCBTRU5UIFNCICVzIFNUQVJUICIsCisgICAgICAgICAgICAgICAgICAgICBURUxPUFQoVEVMT1BUX0VOQ1JZUFRJT04pKTsgICAgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgdG5faGV4KHRuX21zZyxUTl9NU0dfTEVOLCZzdHJfc3RhcnRbNF0scC1zdHJfc3RhcnQtMi00KTsKKyAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csIklBQyBTRSIsVE5fTVNHX0xFTik7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLHRuX21zZywiIiwwKTsKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgICAgICB9CisjaWZkZWYgT1MyCisgICAgICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisgICAgICAgIHR0b2woc3RyX3N0YXJ0LCBwIC0gc3RyX3N0YXJ0KTsKKyNpZmRlZiBPUzIKKyAgICAgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKworICAvKgorICAgKiBJZiB3ZSBhcmUgYWxyZWFkeSBlbmNyeXB0aW5nIGluIHNvbWUgbW9kZSwgdGhlbgorICAgKiBlbmNyeXB0IHRoZSByaW5nICh3aGljaCBpbmNsdWRlcyBvdXIgcmVxdWVzdCkgaW4KKyAgICogdGhlIG9sZCBtb2RlLCBtYXJrIGl0IGFsbCBhcyAiY2xlYXIgdGV4dCIgYW5kIHRoZW4KKyAgICogc3dpdGNoIHRvIHRoZSBuZXcgbW9kZS4KKyAgICovCisgICAgICAgIGVuY3J5cHRfb3V0cHV0ID0gZXAtPm91dHB1dDsKKyAgICAgICAgRW5jcnlwdEtTR2xvYmFsSGFjay0+ZW5jcnlwdCA9IGVuY3J5cHRfa3Nfc3RyZWFtOworICAgICAgICBFbmNyeXB0S1NHbG9iYWxIYWNrLT5lbmNyeXB0X3R5cGUgPSB0eXBlOworICAgICAgICBlbmNyeXB0X21vZGUgPSB0eXBlOworI2lmZGVmIERFQlVHCisgICAgICAgIGlmIChlbmNyeXB0X2RlYnVnX21vZGUpIHsKKyAgICAgICAgICAgIHNwcmludGYoZGJnYnVmLCAiPj4+U3RhcnRlZCB0byBlbmNyeXB0IG91dHB1dCB3aXRoIHR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgRU5DVFlQRV9OQU1FKHR5cGUpKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImVuY3J5cHRfc3RhcnRfb3V0cHV0IixkYmdidWYsMCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoZW5jcnlwdF92ZXJib3NlKSB7CisgICAgICAgICAgICBzcHJpbnRmKGRiZ2J1ZiwgIk91dHB1dCBpcyBub3cgZW5jcnlwdGVkIHdpdGggdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICBFTkNUWVBFX05BTUUodHlwZSkpOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgZGVidWcoRjExMCwiZW5jcnlwdF9zdGFydF9vdXRwdXQiLGRiZ2J1ZiwwKTsKKyAgICAgICAgICAgIHByaW50ZigiJXNcbiIsZGJnYnVmKTsKKyAgICAgICAgfQorICAgIH0KK30KKworVk9JRAorI2lmZGVmIENLX0FOU0lDCitlbmNyeXB0X3NlbmRfZW5kKFZPSUQpCisjZWxzZQorZW5jcnlwdF9zZW5kX2VuZCgpCisjZW5kaWYKK3sKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKQorICAgICAgICByZXR1cm47CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBpZiAoIWVuY3J5cHRfb3V0cHV0KQorICAgICAgICByZXR1cm47CisKKyAgICBzdHJfZW5kWzBdID0gSUFDOworICAgIHN0cl9lbmRbMV0gPSBTQjsKKyAgICBzdHJfZW5kWzJdID0gVEVMT1BUX0VOQ1JZUFRJT047CisgICAgc3RyX2VuZFszXSA9IEVOQ1JZUFRfRU5EOworICAgIHN0cl9lbmRbNF0gPSBJQUM7CisgICAgc3RyX2VuZFs1XSA9IFNFOworCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGludCBpOworICAgICAgICBzcHJpbnRmKHRuX21zZywiVEVMTkVUIFNFTlQgU0IgJXMgRU5EIElBQyBTRSIsCisgICAgICAgICAgICAgICAgIFRFTE9QVChURUxPUFRfRU5DUllQVElPTikpOyAgICAgICAgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICBkZWJ1ZyhGMTAwLHRuX21zZywiIiwwKTsKKyAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZyk7CisgICAgfQorI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisgICAgdHRvbChzdHJfZW5kLCBzaXplb2Yoc3RyX2VuZCkpOworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisKKyAgICBlbmNyeXB0X291dHB1dCA9IDA7CisgICAgRW5jcnlwdEtTR2xvYmFsSGFjay0+ZW5jcnlwdCA9IE5VTEw7CisgICAgRW5jcnlwdEtTR2xvYmFsSGFjay0+ZW5jcnlwdF90eXBlID0gRU5DVFlQRV9BTlk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICAgIHNwcmludGYoZGJnYnVmLCAiPj4+T3V0cHV0IGlzIGJhY2sgdG8gY2xlYXIgdGV4dCIpOyAgICAgLyogc2FmZSAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJlbmNyeXB0X3NlbmRfZW5kIixkYmdidWYsMCk7CisgICAgfQorI2VuZGlmCisgICAgaWYgKGVuY3J5cHRfdmVyYm9zZSkgeworICAgICAgICBzcHJpbnRmKGRiZ2J1ZiwgIk91dHB1dCBpcyBub3cgY2xlYXIgdGV4dCIpOyAgICAgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgZGVidWcoRjExMCwiZW5jcnlwdF9zZW5kX2VuZCIsZGJnYnVmLDApOworICAgICAgICBwcmludGYoIiVzXG4iLGRiZ2J1Zik7CisgICAgfQorfQorCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2VuY3J5cHRfc2VuZF9yZXF1ZXN0X3N0YXJ0KFZPSUQpCisjZWxzZQorZW5jcnlwdF9zZW5kX3JlcXVlc3Rfc3RhcnQoKQorI2VuZGlmCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDsKKyAgICByZWdpc3RlciBpbnQgaTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpCisgICAgICAgIHJldHVybjsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIHAgPSBzdHJfc3RhcnQ7CisgICAgKnArKyA9IElBQzsKKyAgICAqcCsrID0gU0I7CisgICAgKnArKyA9IFRFTE9QVF9FTkNSWVBUSU9OOworICAgICpwKysgPSBFTkNSWVBUX1JFUVNUQVJUOworICAgIGZvciAoaSA9IDA7IGkgPCBraVsxXS5rZXlsZW47ICsraSkgeworICAgICAgICBpZiAoKCAqcCsrID0ga2lbMV0ua2V5aWRbaV0pID09IElBQykKKyAgICAgICAgICAgICpwKysgPSBJQUM7CisgICAgfQorICAgICpwKysgPSBJQUM7CisgICAgKnArKyA9IFNFOworCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGludCBpOworICAgICAgICBzcHJpbnRmKHRuX21zZywiVEVMTkVUIFNFTlQgU0IgJXMgUkVRVUVTVC1TVEFSVCAiLAorICAgICAgICAgICAgICAgICBURUxPUFQoVEVMT1BUX0VOQ1JZUFRJT04pKTsgICAgICAgICAgICAgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgdG5faGV4KHRuX21zZyxUTl9NU0dfTEVOLCZzdHJfc3RhcnRbNF0scC1zdHJfc3RhcnQtMi00KTsKKyAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiSUFDIFNFIixUTl9NU0dfTEVOKTsKKyAgICAgICAgZGVidWcoRjEwMCx0bl9tc2csIiIsMCk7CisgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgIH0KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorICAgIHR0b2woc3RyX3N0YXJ0LCBwIC0gc3RyX3N0YXJ0KTsKKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorCisgICAgaWYgKGVuY3J5cHRfZGVidWdfbW9kZSkgeworICAgICAgICBzcHJpbnRmKGRiZ2J1ZiwgIj4+PlJlcXVlc3QgaW5wdXQgdG8gYmUgZW5jcnlwdGVkXG4iKTsgIC8qIHNhZmUgKi8KKyAgICAgICAgZGVidWcoRjExMCwiZW5jcnlwdF9zZW5kX3JlcXVlc3Rfc3RhcnQiLGRiZ2J1ZiwwKTsKKyAgICB9Cit9CisKK1ZPSUQKKyNpZmRlZiBDS19BTlNJQworZW5jcnlwdF9zZW5kX3JlcXVlc3RfZW5kKFZPSUQpCisjZWxzZQorZW5jcnlwdF9zZW5kX3JlcXVlc3RfZW5kKCkKKyNlbmRpZgoreworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpCisgICAgICAgIHJldHVybjsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIHN0cl9lbmRbMF0gPSBJQUM7CisgICAgc3RyX2VuZFsxXSA9IFNCOworICAgIHN0cl9lbmRbMl0gPSBURUxPUFRfRU5DUllQVElPTjsKKyAgICBzdHJfZW5kWzNdID0gRU5DUllQVF9SRVFFTkQ7CisgICAgc3RyX2VuZFs0XSA9IElBQzsKKyAgICBzdHJfZW5kWzVdID0gU0U7CisKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHNwcmludGYodG5fbXNnLCJURUxORVQgU0VOVCBTQiAlcyBSRVFFTkQgSUFDIFNFIiwKKyAgICAgICAgICAgICAgICAgVEVMT1BUKFRFTE9QVF9FTkNSWVBUSU9OKSk7ICAgICAgICAgICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgIGRlYnVnKEYxMDAsdG5fbXNnLCIiLDApOworICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnKTsKKyAgICB9CisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyAgICB0dG9sKHN0cl9lbmQsIHNpemVvZihzdHJfZW5kKSk7CisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKworICAgIGlmIChlbmNyeXB0X2RlYnVnX21vZGUpIHsKKyAgICAgICAgc3ByaW50ZihkYmdidWYsICI+Pj5SZXF1ZXN0IGlucHV0IHRvIGJlIGNsZWFyIHRleHRcbiIpOyAvKiBzYWZlICovCisgICAgICAgIGRlYnVnKEYxMTAsImVuY3J5cHRfc2VuZF9yZXF1ZXN0X2VuZCIsZGJnYnVmLDApOworICAgIH0KK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2VuY3J5cHRfaXNfZW5jcnlwdGluZyhWT0lEKQorI2Vsc2UKK2VuY3J5cHRfaXNfZW5jcnlwdGluZygpCisjZW5kaWYKK3sKKyAgICBpZiAoZW5jcnlwdF9vdXRwdXQpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworZW5jcnlwdF9pc19kZWNyeXB0aW5nKFZPSUQpCisjZWxzZQorZW5jcnlwdF9pc19kZWNyeXB0aW5nKCkKKyNlbmRpZgoreworICAgIGlmIChkZWNyeXB0X2lucHV0KQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIERFQlVHCit2b2lkCitlbmNyeXB0X2RlYnVnKG1vZGUpCisgICAgIGludCBtb2RlOworeworICAgIGVuY3J5cHRfZGVidWdfbW9kZSA9IG1vZGU7Cit9CisjZW5kaWYKKworI2lmZGVmIENLX0RFUworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICogICAgICBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogYmFzZWQgb24gQCgjKWVuY19kZXMuYyAgICAgICA4LjEgKEJlcmtlbGV5KSA2LzQvOTMgKi8KKworI2RlZmluZSBDRkIgICAgIDAKKyNkZWZpbmUgT0ZCICAgICAxCisKKyNkZWZpbmUgTk9fU0VORF9JViAgICAgIDEKKyNkZWZpbmUgTk9fUkVDVl9JViAgICAgIDIKKyNkZWZpbmUgTk9fS0VZSUQgICAgICAgIDQKKyNkZWZpbmUgSU5fUFJPR1JFU1MgICAgIChOT19TRU5EX0lWfE5PX1JFQ1ZfSVZ8Tk9fS0VZSUQpCisjZGVmaW5lIFNVQ0NFU1MgICAgICAgICAwCisjZGVmaW5lIHhGQUlMRUQgICAgICAgICAtMQorCitTY2hlZHVsZSB0ZXN0X3NjaGVkOworCitzdHJ1Y3QgZGVzX3N0aW5mbyB7CisgICAgQmxvY2sgICAgICAgICAgICAgICBzdHJfb3V0cHV0OworICAgIEJsb2NrICAgICAgICAgICAgICAgc3RyX2ZlZWQ7CisgICAgQmxvY2sgICAgICAgICAgICAgICBzdHJfaXY7CisgICAgQmxvY2sgICAgICAgICAgICAgICBzdHJfaWtleTsKKyNpZmRlZiBNSVRfQ1VSUkVOVAorICAgIHVuc2lnbmVkIGNoYXIgICAgICAgc3RyX2tleWJ5dGVzWzhdOworICAgIGtyYjVfa2V5YmxvY2sgICAgICAgc3RyX2tleTsKKyNlbHNlIC8qIE1JVF9DVVJSRU5UICovCisgICAgU2NoZWR1bGUgICAgICAgICAgICBzdHJfc2NoZWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBzdHJfaW5kZXg7CisjZW5kaWYgLyogTUlUX0NVUlJFTlQgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0cl9mbGFnc2hpZnQ7Cit9OworCitzdHJ1Y3QgZGVzX2ZiIHsKKyNpZm5kZWYgTUlUX0NVUlJFTlQKKyAgICBCbG9jayBrcmJkZXNfa2V5OworICAgIFNjaGVkdWxlIGtyYmRlc19zY2hlZDsKKyNlbmRpZiAvKiBNSVRfQ1VSUkVOVCAqLworICAgIEJsb2NrIHRlbXBfZmVlZDsKKyAgICB1bnNpZ25lZCBjaGFyIGZiX2ZlZWRbNjRdOworICAgIGludCBuZWVkX3N0YXJ0OworICAgIGludCBzdGF0ZVsyXTsKKyAgICBpbnQga2V5aWRbMl07CisgICAgaW50IG9uY2U7CisjaWZkZWYgTUlUX0NVUlJFTlQKKyAgICBpbnQgdmFsaWRrZXk7CisjZW5kaWYgLyogTUlUX0NVUlJFTlQgKi8KKyAgICBzdHJ1Y3QgZGVzX3N0aW5mbyAgc3RyZWFtc1syXTsKK307CitzdGF0aWMgc3RydWN0IGRlc19mYiBkZXNfZmJbMl07CisKK3N0cnVjdCBkZXMzX3N0aW5mbyB7CisgICAgQmxvY2sgICAgICAgICAgICAgICBzdHJfb3V0cHV0OworICAgIEJsb2NrICAgICAgICAgICAgICAgc3RyX2ZlZWQ7CisgICAgQmxvY2sgICAgICAgICAgICAgICBzdHJfaXY7CisgICAgQmxvY2sgICAgICAgICAgICAgICBzdHJfaWtleVszXTsKKyAgICBTY2hlZHVsZSAgICAgICAgICAgIHN0cl9zY2hlZFszXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0cl9pbmRleDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0cl9mbGFnc2hpZnQ7Cit9OworCitzdHJ1Y3QgZGVzM19mYiB7CisjaWZuZGVmIE1JVF9DVVJSRU5UCisgICAgQmxvY2sga3JiZGVzX2tleVszXTsKKyAgICBTY2hlZHVsZSBrcmJkZXNfc2NoZWRbM107CisjZW5kaWYgLyogTUlUX0NVUlJFTlQgKi8KKyAgICBCbG9jayB0ZW1wX2ZlZWQ7CisgICAgdW5zaWduZWQgY2hhciBmYl9mZWVkWzY0XTsKKyAgICBpbnQgbmVlZF9zdGFydDsKKyAgICBpbnQgc3RhdGVbMl07CisgICAgaW50IGtleWlkWzJdOworICAgIGludCBvbmNlOworI2lmZGVmIE1JVF9DVVJSRU5UCisgICAgaW50IHZhbGlka2V5OworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisgICAgc3RydWN0IGRlczNfc3RpbmZvIHN0cmVhbXNbMl07Cit9Oworc3RhdGljIHN0cnVjdCBkZXMzX2ZiIGRlczNfZmJbMl07CisKK3N0cnVjdCBrZXlpZGxpc3QgeworICAgIGNoYXIgICAgICAgICprZXlpZDsKKyAgICBpbnQga2V5aWRsZW47CisgICAgY2hhciAgICAgICAgKmtleTsKKyAgICBpbnQga2V5bGVuOworICAgIGludCBmbGFnczsKK30ga2V5aWRsaXN0IFtdID0geworICAgIHsgIlwwIiwgMSwgMCwgMCwgMCB9LCAgICAgICAgICAgICAgIC8qIGRlZmF1bHQga2V5IG9mIHplcm8gKi8KKyAgICB7IDAsIDAsIDAsIDAsIDAgfQorfTsKKworI2RlZmluZSBLRVlGTEFHX01BU0sgICAgMDMKKworI2RlZmluZSBLRVlGTEFHX05PSU5JVCAgMDAKKyNkZWZpbmUgS0VZRkxBR19JTklUICAgIDAxCisjZGVmaW5lIEtFWUZMQUdfT0sgICAgICAwMgorI2RlZmluZSBLRVlGTEFHX0JBRCAgICAgMDMKKworI2RlZmluZSBLRVlGTEFHX1NISUZUICAgMgorCisjZGVmaW5lIFNISUZUX1ZBTChhLGIpICAoS0VZRkxBR19TSElGVCooKGEpKygoYikqMikpKQorCisjZGVmaW5lIEZCNjRfSVYgICAgICAgICAxCisjZGVmaW5lIEZCNjRfSVZfT0sgICAgICAyCisjZGVmaW5lIEZCNjRfSVZfQkFEICAgICAzCisjZGVmaW5lIEZCNjRfQ0hBTExFTkdFICA0CisjZGVmaW5lIEZCNjRfUkVTUE9OU0UgICA1CisKK3ZvaWQgZmI2NF9zdHJlYW1faXYgUCgoQmxvY2ssIHN0cnVjdCBkZXNfc3RpbmZvICopKTsKK3ZvaWQgZmI2NF9pbml0IFAoKHN0cnVjdCBkZXNfZmIgKikpOworc3RhdGljIGludCBmYjY0X3N0YXJ0IFAoKHN0cnVjdCBkZXNfZmIgKiwgaW50LCBpbnQpKTsKK2ludCBmYjY0X2lzIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBzdHJ1Y3QgZGVzX2ZiICopKTsKK2ludCBmYjY0X3JlcGx5IFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBzdHJ1Y3QgZGVzX2ZiICopKTsKK3N0YXRpYyBpbnQgZmI2NF9zZXNzaW9uIFAoKFNlc3Npb25fS2V5ICosIGludCwgc3RydWN0IGRlc19mYiAqKSk7Cit2b2lkIGZiNjRfc3RyZWFtX2tleSBQKChCbG9jaywgc3RydWN0IGRlc19zdGluZm8gKikpOworaW50IGZiNjRfa2V5aWQgUCgoaW50LCB1bnNpZ25lZCBjaGFyICosIGludCAqLCBzdHJ1Y3QgZGVzX2ZiICopKTsKKworI2lmZGVmIE1JVF9DVVJSRU5UCitzdGF0aWMgdm9pZAorI2lmZGVmIENLX0FOU0lDCitlY2JfZW5jcnlwdChzdHJ1Y3QgZGVzX3N0aW5mbyAqc3RwLCBCbG9jayBpbiwgQmxvY2sgb3V0KQorI2Vsc2UgLyogQ0tBTlNJQyAqLworZWNiX2VuY3J5cHQoc3RwLCBpbiwgb3V0KQorICAgIHN0cnVjdCBkZXNfc3RpbmZvICpzdHA7CisgICAgQmxvY2sgaW47CisgICAgQmxvY2sgb3V0OworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAga3JiNV9lcnJvcl9jb2RlIGNvZGU7CisgICAga3JiNV9kYXRhIGRpbjsKKyAgICBrcmI1X2VuY19kYXRhIGRvdXQ7CisKKyAgICBkaW4ubGVuZ3RoID0gODsKKyAgICBkaW4uZGF0YSA9IGluOworCisgICAgZG91dC5jaXBoZXJ0ZXh0Lmxlbmd0aCA9IDg7CisgICAgZG91dC5jaXBoZXJ0ZXh0LmRhdGEgPSBvdXQ7CisgICAgZG91dC5lbmN0eXBlID0gRU5DVFlQRV9VTktOT1dOOworCisjaWZkZWYgQ1JZUFRfRExMCisgICAgY29kZSA9IGtyYjVfY19lbmNyeXB0KCpwX2s1X2NvbnRleHQsICZzdHAtPnN0cl9rZXksIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGluLCAmZG91dCk7CisjZWxzZSAvKiBDUllQVF9ETEwgKi8KKyAgICBjb2RlID0ga3JiNV9jX2VuY3J5cHQoazVfY29udGV4dCwgJnN0cC0+c3RyX2tleSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaW4sICZkb3V0KTsKKyNlbmRpZiAvKiBDUllQVF9ETEwgKi8KKyAgICAvKiBYWFggSSdtIG5vdCBzdXJlIHdoYXQgdG8gZG8gaWYgdGhpcyBmYWlscyAqLworICAgIGlmIChjb2RlKQorICAgICAgICBjb21fZXJyKCJsaWJ0ZWxuZXQiLCBjb2RlLCAiZW5jcnlwdGluZyBzdHJlYW0gZGF0YSIpOworfQorI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisKK3ZvaWQKK2NmYjY0X2luaXQoc2VydmVyKQorICAgIGludCBzZXJ2ZXI7Cit7CisgICAgZmI2NF9pbml0KCZkZXNfZmJbQ0ZCXSk7CisgICAgZGVzX2ZiW0NGQl0uZmJfZmVlZFs0XSA9IEVOQ1RZUEVfREVTX0NGQjY0OworICAgIGRlc19mYltDRkJdLnN0cmVhbXNbMF0uc3RyX2ZsYWdzaGlmdCA9IFNISUZUX1ZBTCgwLCBDRkIpOworICAgIGRlc19mYltDRkJdLnN0cmVhbXNbMV0uc3RyX2ZsYWdzaGlmdCA9IFNISUZUX1ZBTCgxLCBDRkIpOworfQorCit2b2lkCitvZmI2NF9pbml0KHNlcnZlcikKKyAgICBpbnQgc2VydmVyOworeworICAgIGZiNjRfaW5pdCgmZGVzX2ZiW09GQl0pOworICAgIGRlc19mYltPRkJdLmZiX2ZlZWRbNF0gPSBFTkNUWVBFX0RFU19PRkI2NDsKKyAgICBkZXNfZmJbQ0ZCXS5zdHJlYW1zWzBdLnN0cl9mbGFnc2hpZnQgPSBTSElGVF9WQUwoMCwgT0ZCKTsKKyAgICBkZXNfZmJbQ0ZCXS5zdHJlYW1zWzFdLnN0cl9mbGFnc2hpZnQgPSBTSElGVF9WQUwoMSwgT0ZCKTsKK30KKwordm9pZAorZmI2NF9pbml0KGZicCkKKyAgICByZWdpc3RlciBzdHJ1Y3QgZGVzX2ZiICpmYnA7Cit7CisgICAgbWVtc2V0KCh2b2lkICopZmJwLCAwLCBzaXplb2YoKmZicCkpOworICAgIGZicC0+c3RhdGVbMF0gPSBmYnAtPnN0YXRlWzFdID0geEZBSUxFRDsKKyAgICBmYnAtPmZiX2ZlZWRbMF0gPSBJQUM7CisgICAgZmJwLT5mYl9mZWVkWzFdID0gU0I7CisgICAgZmJwLT5mYl9mZWVkWzJdID0gVEVMT1BUX0VOQ1JZUFRJT047CisgICAgZmJwLT5mYl9mZWVkWzNdID0gRU5DUllQVF9JUzsKK30KKworLyoKKyAqIFJldHVybnM6CisgKiAgICAgIC0xOiBzb21lIGVycm9yLiAgTmVnb3RpYXRpb24gaXMgZG9uZSwgZW5jcnlwdGlvbiBub3QgcmVhZHkuCisgKiAgICAgICAwOiBTdWNjZXNzZnVsLCBpbml0aWFsIG5lZ290aWF0aW9uIGFsbCBkb25lLgorICogICAgICAgMTogc3VjY2Vzc2Z1bCwgbmVnb3RpYXRpb24gbm90IGRvbmUgeWV0LgorICogICAgICAgMjogTm90IHlldC4gIE90aGVyIHRoaW5ncyAobGlrZSBnZXR0aW5nIHRoZSBrZXkgZnJvbQorICogICAgICAgICAgS2VyYmVyb3MpIGhhdmUgdG8gaGFwcGVuIGJlZm9yZSB3ZSBjYW4gY29udGludWUuCisgKi8KK2ludAorY2ZiNjRfc3RhcnQoZGlyLCBzZXJ2ZXIpCisgICAgaW50IGRpcjsKKyAgICBpbnQgc2VydmVyOworeworICAgIHJldHVybihmYjY0X3N0YXJ0KCZkZXNfZmJbQ0ZCXSwgZGlyLCBzZXJ2ZXIpKTsKK30KK2ludAorb2ZiNjRfc3RhcnQoZGlyLCBzZXJ2ZXIpCisgICAgaW50IGRpcjsKKyAgICBpbnQgc2VydmVyOworeworICAgIHJldHVybihmYjY0X3N0YXJ0KCZkZXNfZmJbT0ZCXSwgZGlyLCBzZXJ2ZXIpKTsKK30KKworc3RhdGljIGludAorZmI2NF9zdGFydChmYnAsIGRpciwgc2VydmVyKQorICAgIHN0cnVjdCBkZXNfZmIgKmZicDsKKyAgICBpbnQgZGlyOworICAgIGludCBzZXJ2ZXI7Cit7CisgICAgaW50IHg7CisgICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICByZWdpc3RlciBpbnQgc3RhdGU7CisKKyAgICBzd2l0Y2ggKGRpcikgeworICAgIGNhc2UgRElSX0RFQ1JZUFQ6CisgICAgICAgIC8qCisgICAgICAgICogVGhpcyBpcyBzaW1wbHkgYSByZXF1ZXN0IHRvIGhhdmUgdGhlIG90aGVyIHNpZGUKKyAgICAgICAgKiBzdGFydCBvdXRwdXQgKG91ciBpbnB1dCkuICBIZSB3aWxsIG5lZ290aWF0ZSBhbgorICAgICAgICAqIElWIHNvIHdlIG5lZWQgbm90IGxvb2sgZm9yIGl0LgorICAgICAgICAqLworICAgICAgICBzdGF0ZSA9IGZicC0+c3RhdGVbZGlyLTFdOworICAgICAgICBpZiAoc3RhdGUgPT0geEZBSUxFRCkKKyAgICAgICAgICAgIHN0YXRlID0gSU5fUFJPR1JFU1M7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBESVJfRU5DUllQVDoKKyAgICAgICAgc3RhdGUgPSBmYnAtPnN0YXRlW2Rpci0xXTsKKyAgICAgICAgaWYgKHN0YXRlID09IHhGQUlMRUQpCisgICAgICAgICAgICBzdGF0ZSA9IElOX1BST0dSRVNTOworICAgICAgICBlbHNlIGlmICgoc3RhdGUgJiBOT19TRU5EX0lWKSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBNSVRfQ1VSUkVOVAorICAgICAgICBpZiAoIWZicC0+dmFsaWRrZXkpIHsKKyAgICAgICAgICAgIGZicC0+bmVlZF9zdGFydCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2Vsc2UgLyogTUlUX0NVUlJFTlQgKi8KKyAgICAgICAgaWYgKCFWQUxJREtFWShmYnAtPmtyYmRlc19rZXkpKSB7CisgICAgICAgICAgICBmYnAtPm5lZWRfc3RhcnQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbmRpZiAvKiBNSVRfQ1VSUkVOVCAqLworICAgICAgICBzdGF0ZSAmPSB+Tk9fU0VORF9JVjsKKyAgICAgICAgc3RhdGUgfD0gTk9fUkVDVl9JVjsKKyAgICAgICAgLyoKKyAgICAgICAgKiBDcmVhdGUgYSByYW5kb20gZmVlZCBhbmQgc2VuZCBpdCBvdmVyLgorICAgICAgICAqLworI2lmZGVmIE1JVF9DVVJSRU5UCisgICAgICAgIHsKKyAgICAgICAgICAgIGtyYjVfZGF0YSBkOworICAgICAgICAgICAga3JiNV9lcnJvcl9jb2RlIGNvZGU7CisKKyAgICAgICAgICAgIGQuZGF0YSA9IGZicC0+dGVtcF9mZWVkOworICAgICAgICAgICAgZC5sZW5ndGggPSBzaXplb2YoZmJwLT50ZW1wX2ZlZWQpOworCisjaWZkZWYgQ1JZUFRfRExMCisgICAgICAgICAgICBpZiAoY29kZSA9IGtyYjVfY19yYW5kb21fbWFrZV9vY3RldHMoKnBfazVfY29udGV4dCwmZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuKHhGQUlMRUQpOworI2Vsc2UgLyogQ1JZUFRfRExMICovCisgICAgICAgICAgICBpZiAoY29kZSA9IGtyYjVfY19yYW5kb21fbWFrZV9vY3RldHMoazVfY29udGV4dCwmZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuKHhGQUlMRUQpOworI2VuZGlmIC8qIENSWVBUX0RMTCAqLworICAgICAgICB9CisKKyNlbHNlIC8qIE1JVF9DVVJSRU5UICovCisgICAgICAgIGRlc19uZXdfcmFuZG9tX2tleShmYnAtPnRlbXBfZmVlZCk7CisgICAgICAgIGRlc19lY2JfZW5jcnlwdChmYnAtPnRlbXBfZmVlZCwgZmJwLT50ZW1wX2ZlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmJwLT5rcmJkZXNfc2NoZWQsIDEpOworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisgICAgICAgIHAgPSBmYnAtPmZiX2ZlZWQgKyAzOworICAgICAgICAqcCsrID0gRU5DUllQVF9JUzsKKyAgICAgICAgcCsrOworICAgICAgICAqcCsrID0gRkI2NF9JVjsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNpemVvZihCbG9jayk7ICsreCkgeworICAgICAgICAgICAgaWYgKCggKnArKyA9IGZicC0+dGVtcF9mZWVkW3hdKSA9PSBJQUMpCisgICAgICAgICAgICAgICAgKnArKyA9IElBQzsKKyAgICAgICAgfQorICAgICAgICAqcCsrID0gSUFDOworICAgICAgICAqcCsrID0gU0U7CisKKyAgICAgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIHNwcmludGYodG5fbXNnLAorICAgICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICVzIElTICVzIEZCNjRfSVYgIiwKKyAgICAgICAgICAgICAgICAgICAgIFRFTE9QVChmYnAtPmZiX2ZlZWRbMl0pLAorICAgICAgICAgICAgICAgICAgICAgZW5jdHlwZV9uYW1lc1tmYnAtPmZiX2ZlZWRbNF1dKTsgICAgICAgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgdG5faGV4KHRuX21zZyxUTl9NU0dfTEVOLCZmYnAtPmZiX2ZlZWRbNl0sKHAtZmJwLT5mYl9mZWVkKS0yLTYpOworICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiSUFDIFNFIixUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsdG5fbXNnLCIiLDApOworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZyk7CisgICAgICAgIH0KKyNpZmRlZiBPUzIKKyAgICAgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyAgICAgICAgdHRvbChmYnAtPmZiX2ZlZWQsIHAgLSBmYnAtPmZiX2ZlZWQpOworI2lmZGVmIE9TMgorICAgICAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4oeEZBSUxFRCk7CisgICAgfQorICAgIHJldHVybihmYnAtPnN0YXRlW2Rpci0xXSA9IHN0YXRlKTsKK30KKworLyoKKyAqIFJldHVybnM6CisgKiAgICAgIC0xOiBzb21lIGVycm9yLiAgTmVnb3RpYXRpb24gaXMgZG9uZSwgZW5jcnlwdGlvbiBub3QgcmVhZHkuCisgKiAgICAgICAwOiBTdWNjZXNzZnVsLCBpbml0aWFsIG5lZ290aWF0aW9uIGFsbCBkb25lLgorICogICAgICAgMTogc3VjY2Vzc2Z1bCwgbmVnb3RpYXRpb24gbm90IGRvbmUgeWV0LgorICovCitpbnQKK2NmYjY0X2lzKGRhdGEsIGNudCkKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIGludCBjbnQ7Cit7CisgICAgcmV0dXJuKGZiNjRfaXMoZGF0YSwgY250LCAmZGVzX2ZiW0NGQl0pKTsKK30KKworaW50CitvZmI2NF9pcyhkYXRhLCBjbnQpCisgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICBpbnQgY250OworeworICAgIHJldHVybihmYjY0X2lzKGRhdGEsIGNudCwgJmRlc19mYltPRkJdKSk7Cit9CisKK2ludAorZmI2NF9pcyhkYXRhLCBjbnQsIGZicCkKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIGludCBjbnQ7CisgICAgc3RydWN0IGRlc19mYiAqZmJwOworeworICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgcmVnaXN0ZXIgaW50IHN0YXRlID0gZmJwLT5zdGF0ZVtESVJfREVDUllQVC0xXTsKKworICAgIGlmIChjbnQtLSA8IDEpCisgICAgICAgIGdvdG8gZmFpbHVyZTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmICghVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgIHN3aXRjaCAoKmRhdGErKykgeworICAgIGNhc2UgRkI2NF9JVjoKKyAgICAgICAgaWYgKGNudCAhPSBzaXplb2YoQmxvY2spKSB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGlmIChlbmNyeXB0X2RlYnVnX21vZGUpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJDRkI2NDogaW5pdGlhbCB2ZWN0b3IgZmFpbGVkIG9uIHNpemVcclxuIik7CisjZW5kaWYKKyAgICAgICAgICAgIHN0YXRlID0geEZBSUxFRDsKKyAgICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgfQorCisjaWZkZWYgREVCVUcKKyAgICAgICAgaWYgKGVuY3J5cHRfZGVidWdfbW9kZSkgeworICAgICAgICAgICAgcHJpbnRmKCJDRkI2NDogaW5pdGlhbCB2ZWN0b3IgcmVjZWl2ZWRcclxuIik7CisgICAgICAgICAgICBwcmludGYoIkluaXRpYWxpemluZyBEZWNyeXB0IHN0cmVhbVxyXG4iKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGZiNjRfc3RyZWFtX2l2KCh2b2lkICopZGF0YSwgJmZicC0+c3RyZWFtc1tESVJfREVDUllQVC0xXSk7CisKKyAgICAgICAgcCA9IGZicC0+ZmJfZmVlZCArIDM7CisgICAgICAgICpwKysgPSBFTkNSWVBUX1JFUExZOworICAgICAgICBwKys7CisgICAgICAgICpwKysgPSBGQjY0X0lWX09LOworICAgICAgICAqcCsrID0gSUFDOworICAgICAgICAqcCsrID0gU0U7CisKKyAgICAgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIHNwcmludGYodG5fbXNnLAorICAgICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICVzIFJFUExZICVzIEZCNjRfSVZfT0sgIiwKKyAgICAgICAgICAgICAgICAgICAgIFRFTE9QVChmYnAtPmZiX2ZlZWRbMl0pLAorICAgICAgICAgICAgICAgICAgICAgZW5jdHlwZV9uYW1lc1tmYnAtPmZiX2ZlZWRbNF1dKTsgICAgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgICAgIHRuX2hleCh0bl9tc2csVE5fTVNHX0xFTiwmZmJwLT5mYl9mZWVkWzZdLChwLWZicC0+ZmJfZmVlZCktMi02KTsKKyAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csIklBQyBTRSIsVE5fTVNHX0xFTik7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLHRuX21zZywiIiwwKTsKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgICAgICB9CisjaWZkZWYgT1MyCisgICAgICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisgICAgICAgIHR0b2woZmJwLT5mYl9mZWVkLCBwIC0gZmJwLT5mYl9mZWVkKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICAgICAgc3RhdGUgPSBJTl9QUk9HUkVTUzsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorI2lmIDAKKyAgICAgICAgaWYgKGVuY3J5cHRfZGVidWdfbW9kZSkgeworICAgICAgICAgICAgcHJpbnRmKCJVbmtub3duIG9wdGlvbiB0eXBlOiAlZFxyXG4iLCAqKGRhdGEtMSkpOworICAgICAgICAgICAgcHJpbnRmKCJcclxuIik7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKyAgICAgIGZhaWx1cmU6CisgICAgICAgIC8qCisgICAgICAgICogV2UgZmFpbGVkLiAgU2VuZCBhbiBGQjY0X0lWX0JBRCBvcHRpb24KKyAgICAgICAgKiB0byB0aGUgb3RoZXIgc2lkZSBzbyBpdCB3aWxsIGtub3cgdGhhdAorICAgICAgICAqIHRoaW5ncyBmYWlsZWQuCisgICAgICAgICovCisgICAgICAgIHAgPSBmYnAtPmZiX2ZlZWQgKyAzOworICAgICAgICAqcCsrID0gRU5DUllQVF9SRVBMWTsKKyAgICAgICAgcCsrOworICAgICAgICAqcCsrID0gRkI2NF9JVl9CQUQ7CisgICAgICAgICpwKysgPSBJQUM7CisgICAgICAgICpwKysgPSBTRTsKKworICAgICAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgc3ByaW50Zih0bl9tc2csCisgICAgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgJXMgUkVQTFkgJXMgRkI2NF9JVl9CQUQgIiwKKyAgICAgICAgICAgICAgICAgICAgIFRFTE9QVChmYnAtPmZiX2ZlZWRbMl0pLAorICAgICAgICAgICAgICAgICAgICAgZW5jdHlwZV9uYW1lc1tmYnAtPmZiX2ZlZWRbNF1dKTsgICAgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgICAgIHRuX2hleCh0bl9tc2csVE5fTVNHX0xFTiwmZmJwLT5mYl9mZWVkWzZdLChwLWZicC0+ZmJfZmVlZCktMi02KTsKKyAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csIklBQyBTRSIsVE5fTVNHX0xFTik7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLHRuX21zZywiIiwwKTsKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgICAgICB9CisjaWZkZWYgT1MyCisgICAgICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisgICAgICAgIHR0b2woZmJwLT5mYl9mZWVkLCBwIC0gZmJwLT5mYl9mZWVkKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybihmYnAtPnN0YXRlW0RJUl9ERUNSWVBULTFdID0gc3RhdGUpOworfQorCisvKgorICogUmV0dXJuczoKKyAqICAgICAgLTE6IHNvbWUgZXJyb3IuICBOZWdvdGlhdGlvbiBpcyBkb25lLCBlbmNyeXB0aW9uIG5vdCByZWFkeS4KKyAqICAgICAgIDA6IFN1Y2Nlc3NmdWwsIGluaXRpYWwgbmVnb3RpYXRpb24gYWxsIGRvbmUuCisgKiAgICAgICAxOiBzdWNjZXNzZnVsLCBuZWdvdGlhdGlvbiBub3QgZG9uZSB5ZXQuCisgKi8KK2ludAorY2ZiNjRfcmVwbHkoZGF0YSwgY250KQorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgaW50IGNudDsKK3sKKyAgICByZXR1cm4oZmI2NF9yZXBseShkYXRhLCBjbnQsICZkZXNfZmJbQ0ZCXSkpOworfQoraW50CitvZmI2NF9yZXBseShkYXRhLCBjbnQpCisgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICBpbnQgY250OworeworICAgIHJldHVybihmYjY0X3JlcGx5KGRhdGEsIGNudCwgJmRlc19mYltPRkJdKSk7Cit9CisKKworaW50CitmYjY0X3JlcGx5KGRhdGEsIGNudCwgZmJwKQorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgaW50IGNudDsKKyAgICBzdHJ1Y3QgZGVzX2ZiICpmYnA7Cit7CisgICAgcmVnaXN0ZXIgaW50IHN0YXRlID0gZmJwLT5zdGF0ZVtESVJfRU5DUllQVC0xXTsKKworICAgIGlmIChjbnQtLSA8IDEpCisgICAgICAgIGdvdG8gZmFpbHVyZTsKKworICAgIHN3aXRjaCAoKmRhdGErKykgeworICAgIGNhc2UgRkI2NF9JVl9PSzoKKyAgICAgICAgZmI2NF9zdHJlYW1faXYoZmJwLT50ZW1wX2ZlZWQsICZmYnAtPnN0cmVhbXNbRElSX0VOQ1JZUFQtMV0pOworICAgICAgICBpZiAoc3RhdGUgPT0geEZBSUxFRCkKKyAgICAgICAgICAgIHN0YXRlID0gSU5fUFJPR1JFU1M7CisgICAgICAgIHN0YXRlICY9IH5OT19SRUNWX0lWOworICAgICAgICBlbmNyeXB0X3NlbmRfa2V5aWQoRElSX0VOQ1JZUFQsICh1bnNpZ25lZCBjaGFyICopIlwwIiwgMSwgMSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBGQjY0X0lWX0JBRDoKKyAgICAgICAgbWVtc2V0KGZicC0+dGVtcF9mZWVkLCAwLCBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgZmI2NF9zdHJlYW1faXYoZmJwLT50ZW1wX2ZlZWQsICZmYnAtPnN0cmVhbXNbRElSX0VOQ1JZUFQtMV0pOworICAgICAgICBzdGF0ZSA9IHhGQUlMRUQ7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyNpZiAwCisgICAgICAgIGlmIChlbmNyeXB0X2RlYnVnX21vZGUpIHsKKyAgICAgICAgICAgIHByaW50ZigiVW5rbm93biBvcHRpb24gdHlwZTogJWRcclxuIiwgZGF0YVstMV0pOworICAgICAgICAgICAgcHJpbnRmKCJcclxuIik7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKyAgICAgIGZhaWx1cmU6CisgICAgICAgIHN0YXRlID0geEZBSUxFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybihmYnAtPnN0YXRlW0RJUl9FTkNSWVBULTFdID0gc3RhdGUpOworfQorCitpbnQKK2NmYjY0X3Nlc3Npb24oa2V5LCBzZXJ2ZXIpCisgICAgU2Vzc2lvbl9LZXkgKmtleTsKKyAgICBpbnQgc2VydmVyOworeworICAgIHJldHVybihmYjY0X3Nlc3Npb24oa2V5LCBzZXJ2ZXIsICZkZXNfZmJbQ0ZCXSkpOworfQorCitpbnQKK29mYjY0X3Nlc3Npb24oa2V5LCBzZXJ2ZXIpCisgICAgU2Vzc2lvbl9LZXkgKmtleTsKKyAgICBpbnQgc2VydmVyOworeworICAgIHJldHVybihmYjY0X3Nlc3Npb24oa2V5LCBzZXJ2ZXIsICZkZXNfZmJbT0ZCXSkpOworfQorCitzdGF0aWMgaW50CitmYjY0X3Nlc3Npb24oa2V5LCBzZXJ2ZXIsIGZicCkKKyAgICBTZXNzaW9uX0tleSAqa2V5OworICAgIGludCBzZXJ2ZXI7CisgICAgc3RydWN0IGRlc19mYiAqZmJwOworeworICAgIGludCByYz0wOworICAgIGludCB1c2Uya2V5czsKKyAgICBzdHJ1Y3QgZGVzX3N0aW5mbyAqIHNfc3RyZWFtOworICAgIHN0cnVjdCBkZXNfc3RpbmZvICogY19zdHJlYW07CisKKyAgICBpZihzZXJ2ZXIpIHsKKyAgICAgICAgc19zdHJlYW0gPSAmZmJwLT5zdHJlYW1zW0RJUl9FTkNSWVBULTFdOworICAgICAgICBjX3N0cmVhbSA9ICZmYnAtPnN0cmVhbXNbRElSX0RFQ1JZUFQtMV07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzX3N0cmVhbSA9ICZmYnAtPnN0cmVhbXNbRElSX0RFQ1JZUFQtMV07CisgICAgICAgIGNfc3RyZWFtID0gJmZicC0+c3RyZWFtc1tESVJfRU5DUllQVC0xXTsKKyAgICB9CisKKyAgICBpZiAoIWtleSB8fCBrZXktPmxlbmd0aCA8IHNpemVvZihCbG9jaykpIHsKKyAgICAgICAgQ0hBUiBidWZbODBdOworICAgICAgICBzcHJpbnRmKGJ1ZiwiQ2FuJ3Qgc2V0IERFUyBzZXNzaW9uIGtleSAoJWQgPCAlZCkiLAorICAgICAgICAgICAgICAgIGtleSA/IGtleS0+bGVuZ3RoIDogMCwgc2l6ZW9mKEJsb2NrKSk7ICAgICAgICAgIC8qIHNhZmUgKi8KKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKQorICAgICAgICAgICAgcHJpbnRmKCIlc1xyXG4iLGJ1Zik7CisjZW5kaWYKKyAgICAgICAgZGVidWcoRjExMCwiZmI2NF9zZXNzaW9uIixidWYsMCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIHVzZTJrZXlzID0gKGtleS0+dHlwZSA9PSBTS19ERVMgfHwKKyAgICAgICAgICAgICAgICAga2V5LT5sZW5ndGggPCAyICogc2l6ZW9mKEJsb2NrKSkgPyAwIDogMTsKKyNpZmRlZiBNSVRfQ1VSUkVOVAorICAgIGlmKHVzZTJrZXlzKSB7CisgICAgICAgIG1lbWNweSgodm9pZCAqKSBmYnAtPmtleWJ5dGVzLAorICAgICAgICAgICAgICAgICAodm9pZCAqKSAoa2V5LT5kYXRhICsgc2l6ZW9mKEJsb2NrKSksIHNpemVvZihCbG9jaykpOworICAgICAgICBkZXNfZml4dXBfa2V5X3Bhcml0eShmYnAtPik7CisgICAgICAgIGZiNjRfc3RyZWFtX2tleShmYnAtPmtyYmRlc19rZXksIHNfc3RyZWFtKTsKKyAgICB9CisKKyAgICBtZW1jcHkoKHZvaWQgKilmYnAtPmtyYmRlc19rZXksICh2b2lkICopa2V5LT5kYXRhLCBzaXplb2YoQmxvY2spKTsKKyAgICBpZiAoa2V5LT50eXBlICE9IFNLX0RFUykKKyAgICAgICAgZGVzX2ZpeHVwX2tleV9wYXJpdHkoZmJwLT5rcmJkZXNfa2V5KTsKKworICAgIGlmKCF1c2Uya2V5cykKKyAgICAgICAgZmI2NF9zdHJlYW1fa2V5KGZicC0+a3JiZGVzX2tleSwgc19zdHJlYW0pOworICAgIGZiNjRfc3RyZWFtX2tleShmYnAtPmtyYmRlc19rZXksIGNfc3RyZWFtKTsKKyAgICBmYnAtPnZhbGlka2V5ID0gMTsKKworICAgIGZiNjRfc3RyZWFtX2tleShrZXktPmRhdGEsICZmYnAtPnN0cmVhbXNbRElSX0VOQ1JZUFQtMV0pOworICAgIGZiNjRfc3RyZWFtX2tleShrZXktPmRhdGEsICZmYnAtPnN0cmVhbXNbRElSX0RFQ1JZUFQtMV0pOworI2Vsc2UgLyogTUlUX0NVUlJFTlQgKi8KKyAgICBpZih1c2Uya2V5cykgeworICAgICAgICBtZW1jcHkoKHZvaWQgKikgZmJwLT5rcmJkZXNfa2V5LAorICAgICAgICAgICAgICAgICAodm9pZCAqKSAoa2V5LT5kYXRhICsgc2l6ZW9mKEJsb2NrKSksIHNpemVvZihCbG9jaykpOworICAgICAgICBkZXNfZml4dXBfa2V5X3Bhcml0eShmYnAtPmtyYmRlc19rZXkpOworICAgICAgICBmYjY0X3N0cmVhbV9rZXkoZmJwLT5rcmJkZXNfa2V5LCBzX3N0cmVhbSk7CisgICAgfQorCisgICAgbWVtY3B5KCh2b2lkICopZmJwLT5rcmJkZXNfa2V5LCAodm9pZCAqKWtleS0+ZGF0YSwgc2l6ZW9mKEJsb2NrKSk7CisgICAgaWYgKGtleS0+dHlwZSAhPSBTS19ERVMpCisgICAgICAgIGRlc19maXh1cF9rZXlfcGFyaXR5KGZicC0+a3JiZGVzX2tleSk7CisKKyAgICBpZighdXNlMmtleXMpCisgICAgICAgIGZiNjRfc3RyZWFtX2tleShmYnAtPmtyYmRlc19rZXksIHNfc3RyZWFtKTsKKyAgICBmYjY0X3N0cmVhbV9rZXkoZmJwLT5rcmJkZXNfa2V5LCBjX3N0cmVhbSk7CisKKyAgICBpZiAoZmJwLT5vbmNlID09IDApIHsKKyAgICAgICAgZGVzX3NldF9yYW5kb21fZ2VuZXJhdG9yX3NlZWQoZmJwLT5rcmJkZXNfa2V5KTsKKyAgICAgICAgZmJwLT5vbmNlID0gMTsKKyAgICB9CisKKyAgICBtZW1zZXQoZmJwLT5rcmJkZXNfc2NoZWQsMCxzaXplb2YoU2NoZWR1bGUpKTsKKyAgICBoZXhkdW1wKCJmYjY0X3Nlc3Npb25fa2V5IixmYnAtPmtyYmRlc19rZXksOCk7CisKKyAgICByYyA9IGRlc19rZXlfc2NoZWQoZmJwLT5rcmJkZXNfa2V5LCBmYnAtPmtyYmRlc19zY2hlZCk7CisgICAgaWYgKCByYyA9PSAtMSApIHsKKyAgICAgICAgcHJpbnRmKCI/SW52YWxpZCBERVMga2V5IHNwZWNpZmllZCBmb3IgZW5jcnlwdGlvblxuIik7CisgICAgICAgIGRlYnVnKEYxMTAsImZiNjRfc2Vzc2lvbl9rZXkiLAorICAgICAgICAgICAgICAgImludmFsaWQgREVTIEtleSBzcGVjaWZpZWQgZm9yIGVuY3J5cHRpb24iLDApOworICAgIH0gZWxzZSBpZiAoIHJjID09IC0yICkgeworICAgICAgICBwcmludGYoIj9XZWFrIERFUyBrZXkgc3BlY2lmaWVkIGZvciBlbmNyeXB0aW9uXG4iKTsKKyAgICAgICAgZGVidWcoRjExMCwiZmI2NF9zZXNzaW9uX2tleSIsCisgICAgICAgICAgICAgICAid2VhayBERVMgS2V5IHNwZWNpZmllZCBmb3IgZW5jcnlwdGlvbiIsMCk7CisgICAgfSBlbHNlIGlmICggcmMgIT0gMCApIHsKKyAgICAgICAgcHJpbnRmKCI/S2V5IFNjaGVkdWxlIG5vdCBjcmVhdGVkIGJ5IGVuY3J5cHRpb25cbiIpOworICAgICAgICBkZWJ1ZyhGMTEwLCJmYjY0X3Nlc3Npb25fa2V5IiwKKyAgICAgICAgICAgICAgICJLZXkgU2NoZWR1bGUgbm90IGNyZWF0ZWQgYnkgZW5jcnlwdGlvbiIsMCk7CisgICAgfQorCisgICAgaGV4ZHVtcCgiZmI2NF9zZXNzaW9uX2tleSBzY2hlZHVsZSIsZmJwLT5rcmJkZXNfc2NoZWQsOCoxNik7CisjZW5kaWYgLyogTUlUX0NVUlJFTlQgKi8KKyAgICAvKgorICAgICogTm93IGxvb2sgdG8gc2VlIGlmIGtyYmRlc19zdGFydCgpIHdhcyB3YXMgd2FpdGluZyBmb3IKKyAgICAqIHRoZSBrZXkgdG8gc2hvdyB1cC4gIElmIHNvLCBnbyBhaGVhZCBhbiBjYWxsIGl0IG5vdworICAgICogdGhhdCB3ZSBoYXZlIHRoZSBrZXkuCisgICAgKi8KKyAgICBpZiAoZmJwLT5uZWVkX3N0YXJ0KSB7CisgICAgICAgIGZicC0+bmVlZF9zdGFydCA9IDA7CisgICAgICAgIGZiNjRfc3RhcnQoZmJwLCBESVJfRU5DUllQVCwgc2VydmVyKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisvKgorICogV2Ugb25seSBhY2NlcHQgYSBrZXlpZCBvZiAwLiAgSWYgd2UgZ2V0IGEga2V5aWQgb2YKKyAqIDAsIHRoZW4gbWFyayB0aGUgc3RhdGUgYXMgU1VDQ0VTUy4KKyAqLworaW50CitjZmI2NF9rZXlpZChkaXIsIGtwLCBsZW5wKQorICAgIGludCBkaXIsICpsZW5wOworICAgIHVuc2lnbmVkIGNoYXIgKmtwOworeworICAgIHJldHVybihmYjY0X2tleWlkKGRpciwga3AsIGxlbnAsICZkZXNfZmJbQ0ZCXSkpOworfQorCitpbnQKK29mYjY0X2tleWlkKGRpciwga3AsIGxlbnApCisgICAgaW50IGRpciwgKmxlbnA7CisgICAgdW5zaWduZWQgY2hhciAqa3A7Cit7CisgICAgcmV0dXJuKGZiNjRfa2V5aWQoZGlyLCBrcCwgbGVucCwgJmRlc19mYltPRkJdKSk7Cit9CisKK2ludAorZmI2NF9rZXlpZChkaXIsIGtwLCBsZW5wLCBmYnApCisgICAgaW50IGRpciwgKmxlbnA7CisgICAgdW5zaWduZWQgY2hhciAqa3A7CisgICAgc3RydWN0IGRlc19mYiAqZmJwOworeworICAgIHJlZ2lzdGVyIGludCBzdGF0ZSA9IGZicC0+c3RhdGVbZGlyLTFdOworCisgICAgaWYgKCpsZW5wICE9IDEgfHwgKCprcCAhPSAnXDAnKSkgeworICAgICAgICAqbGVucCA9IDA7CisgICAgICAgIHJldHVybihzdGF0ZSk7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IHhGQUlMRUQpCisgICAgICAgIHN0YXRlID0gSU5fUFJPR1JFU1M7CisKKyAgICBzdGF0ZSAmPSB+Tk9fS0VZSUQ7CisKKyAgICByZXR1cm4oZmJwLT5zdGF0ZVtkaXItMV0gPSBzdGF0ZSk7Cit9CisKKyNpZiAwCit2b2lkCitmYjY0X3ByaW50c3ViKGRhdGEsIGNudCwgYnVmLCBidWZsZW4sIHR5cGUpCisgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgKmJ1ZiwgKnR5cGU7CisgICAgaW50IGNudCwgYnVmbGVuOworeworICAgIGNoYXIgbGJ1Zls2NF07CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgY2hhciAqY3A7CisKKyAgICBidWZbYnVmbGVuLTFdID0gJ1wwJzsgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgaXQncyBOVUxMIHRlcm1pbmF0ZWQgKi8KKyAgICBidWZsZW4gLT0gMTsKKworICAgIHN3aXRjaChkYXRhWzJdKSB7CisgICAgY2FzZSBGQjY0X0lWOgorICAgICAgICBzcHJpbnRmKGxidWYsICIlc19JViIsIHR5cGUpOworICAgICAgICBjcCA9IGxidWY7CisgICAgICAgIGdvdG8gY29tbW9uOworCisgICAgY2FzZSBGQjY0X0lWX09LOgorICAgICAgICBzcHJpbnRmKGxidWYsICIlc19JVl9PSyIsIHR5cGUpOworICAgICAgICBjcCA9IGxidWY7CisgICAgICAgIGdvdG8gY29tbW9uOworCisgICAgY2FzZSBGQjY0X0lWX0JBRDoKKyAgICAgICAgc3ByaW50ZihsYnVmLCAiJXNfSVZfQkFEIiwgdHlwZSk7CisgICAgICAgIGNwID0gbGJ1ZjsKKyAgICAgICAgZ290byBjb21tb247CisKKyAgICBjYXNlIEZCNjRfQ0hBTExFTkdFOgorICAgICAgICBzcHJpbnRmKGxidWYsICIlc19DSEFMTEVOR0UiLCB0eXBlKTsKKyAgICAgICAgY3AgPSBsYnVmOworICAgICAgICBnb3RvIGNvbW1vbjsKKworICAgIGNhc2UgRkI2NF9SRVNQT05TRToKKyAgICAgICAgc3ByaW50ZihsYnVmLCAiJXNfUkVTUE9OU0UiLCB0eXBlKTsKKyAgICAgICAgY3AgPSBsYnVmOworICAgICAgICBnb3RvIGNvbW1vbjsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHNwcmludGYobGJ1ZiwgIiAlZCAodW5rbm93bikiLCBkYXRhWzJdKTsKKyAgICAgICAgY3AgPSBsYnVmOworICAgICAgY29tbW9uOgorICAgICAgICBmb3IgKDsgKGJ1ZmxlbiA+IDApICYmICgqYnVmID0gKmNwKyspOyBidWYrKykKKyAgICAgICAgICAgIGJ1Zmxlbi0tOworICAgICAgICBmb3IgKGkgPSAzOyBpIDwgY250OyBpKyspIHsKKyAgICAgICAgICAgIHNwcmludGYobGJ1ZiwgIiAlZCIsIGRhdGFbaV0pOworICAgICAgICAgICAgZm9yIChjcCA9IGxidWY7IChidWZsZW4gPiAwKSAmJiAoKmJ1ZiA9ICpjcCsrKTsgYnVmKyspCisgICAgICAgICAgICAgICAgYnVmbGVuLS07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkCitjZmI2NF9wcmludHN1YihkYXRhLCBjbnQsIGJ1ZiwgYnVmbGVuKQorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsICpidWY7CisgICAgaW50IGNudCwgYnVmbGVuOworeworICAgIGZiNjRfcHJpbnRzdWIoZGF0YSwgY250LCBidWYsIGJ1ZmxlbiwgIkNGQjY0Iik7Cit9CisKK3ZvaWQKK29mYjY0X3ByaW50c3ViKGRhdGEsIGNudCwgYnVmLCBidWZsZW4pCisgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgKmJ1ZjsKKyAgICBpbnQgY250LCBidWZsZW47Cit7CisgICAgZmI2NF9wcmludHN1YihkYXRhLCBjbnQsIGJ1ZiwgYnVmbGVuLCAiT0ZCNjQiKTsKK30KKyNlbmRpZgorCit2b2lkCitmYjY0X3N0cmVhbV9pdihzZWVkLCBzdHApCisgICAgQmxvY2sgc2VlZDsKKyAgICByZWdpc3RlciBzdHJ1Y3QgZGVzX3N0aW5mbyAqc3RwOworeworICAgIGludCByYz0wOworCisgICAgbWVtY3B5KHN0cC0+c3RyX2l2LCAgICAgc2VlZCwgc2l6ZW9mKEJsb2NrKSk7CisgICAgbWVtY3B5KHN0cC0+c3RyX291dHB1dCwgc2VlZCwgc2l6ZW9mKEJsb2NrKSk7CisKKyAgICBtZW1zZXQoc3RwLT5zdHJfc2NoZWQsMCxzaXplb2YoU2NoZWR1bGUpKTsKKworICAgIGhleGR1bXAoImZiNjRfc3RyZWFtX2l2IixzdHAtPnN0cl9pa2V5LDgpOworCisjaWZuZGVmIE1JVF9DVVJSRU5UCisgICAgcmMgPSBkZXNfa2V5X3NjaGVkKHN0cC0+c3RyX2lrZXksIHN0cC0+c3RyX3NjaGVkKTsKKyAgICBpZiAoIHJjID09IC0xICkgeworICAgICAgICBwcmludGYoIj9JbnZhbGlkIERFUyBrZXkgc3BlY2lmaWVkIGZvciBlbmNyeXB0aW9uXHJcbiIpOworICAgICAgICBkZWJ1ZyhGMTEwLCJmYjY0X3N0cmVhbV9pdiIsCisgICAgICAgICAgICAgICAiaW52YWxpZCBERVMgS2V5IHNwZWNpZmllZCBmb3IgZW5jcnlwdGlvbiIsMCk7CisgICAgfSBlbHNlIGlmICggcmMgPT0gLTIgKSB7CisgICAgICAgIHByaW50ZigiP1dlYWsgREVTIGtleSBzcGVjaWZpZWQgZm9yIGVuY3J5cHRpb25cclxuIik7CisgICAgICAgIGRlYnVnKEYxMTAsImZiNjRfc3RyZWFtX2l2IiwKKyAgICAgICAgICAgICAgICJ3ZWFrIERFUyBLZXkgc3BlY2lmaWVkIGZvciBlbmNyeXB0aW9uIiwwKTsKKyAgICB9IGVsc2UgaWYgKCByYyAhPSAwICkgeworICAgICAgICBwcmludGYoIj9LZXkgU2NoZWR1bGUgbm90IGNyZWF0ZWQgYnkgZW5jcnlwdGlvblxyXG4iKTsKKyAgICAgICAgZGVidWcoRjExMCwiZmI2NF9zdHJlYW1faXYiLAorICAgICAgICAgICAgICAgIktleSBTY2hlZHVsZSBub3QgY3JlYXRlZCBieSBlbmNyeXB0aW9uIiwwKTsKKyAgICB9CisgICAgaGV4ZHVtcCgiZmI2NF9zdHJlYW1faXYgc2NoZWR1bGUiLHN0cC0+c3RyX3NjaGVkLDgqMTYpOworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisKKyAgICBzdHAtPnN0cl9pbmRleCA9IHNpemVvZihCbG9jayk7Cit9CisKK3ZvaWQKK2ZiNjRfc3RyZWFtX2tleShrZXksIHN0cCkKKyAgICBCbG9jayBrZXk7CisgICAgcmVnaXN0ZXIgc3RydWN0IGRlc19zdGluZm8gKnN0cDsKK3sKKyAgICBpbnQgcmMgPSAwOworCisjaWZkZWYgTUlUX0NVUlJFTlQKKyAgICBtZW1jcHkoc3RwLT5zdHJfa2V5Ynl0ZXMsIGtleSwgc2l6ZW9mKEJsb2NrKSk7CisgICAgc3RwLT5zdHJfa2V5Lmxlbmd0aCA9IDg7CisgICAgc3RwLT5zdHJfa2V5LmNvbnRlbnRzID0gc3RwLT5zdHJfa2V5Ynl0ZXM7CisgICAgLyogdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBjb2RlIHVzZXMgZGVzIGVjYiBtb2RlLCBidXQKKyAgICBpdCBvbmx5IGV2ZXIgZG9lcyBvbmUgYmxvY2sgYXQgYSB0aW1lLiAgY2JjIHdpdGggYSB6ZXJvIGl2CisgICAgaXMgaWRlbnRpY2FsICovCisgICAgc3RwLT5zdHJfa2V5LmVuY3R5cGUgPSBFTkNUWVBFX0RFU19DQkNfUkFXOworI2Vsc2UgLyogTUlUX0NVUlJFTlQgKi8KKyAgICBtZW1jcHkoc3RwLT5zdHJfaWtleSwga2V5LCBzaXplb2YoQmxvY2spKTsKKworICAgIG1lbXNldChzdHAtPnN0cl9zY2hlZCwwLHNpemVvZihTY2hlZHVsZSkpOworCisgICAgaGV4ZHVtcCgiZmI2NF9zdHJlYW1fa2V5IixrZXksOCk7CisKKyAgICByYyA9IGRlc19rZXlfc2NoZWQoa2V5LCBzdHAtPnN0cl9zY2hlZCk7CisgICAgaWYgKCByYyA9PSAtMSApIHsKKyAgICAgICAgcHJpbnRmKCI/SW52YWxpZCBERVMga2V5IHNwZWNpZmllZCBmb3IgZW5jcnlwdGlvblxyXG4iKTsKKyAgICAgICAgZGVidWcoRjExMCwiZmI2NF9zdHJlYW1fa2V5IiwKKyAgICAgICAgICAgICAgICJpbnZhbGlkIERFUyBLZXkgc3BlY2lmaWVkIGZvciBlbmNyeXB0aW9uIiwwKTsKKyAgICB9IGVsc2UgaWYgKCByYyA9PSAtMiApIHsKKyAgICAgICAgcHJpbnRmKCI/V2VhayBERVMga2V5IHNwZWNpZmllZCBmb3IgZW5jcnlwdGlvblxyXG4iKTsKKyAgICAgICAgZGVidWcoRjExMCwiZmI2NF9zdHJlYW1fa2V5IiwKKyAgICAgICAgICAgICAgICJ3ZWFrIERFUyBLZXkgc3BlY2lmaWVkIGZvciBlbmNyeXB0aW9uIiwwKTsKKyAgICB9IGVsc2UgaWYgKCByYyAhPSAwICkgeworICAgICAgICBwcmludGYoIj9LZXkgU2NoZWR1bGUgbm90IGNyZWF0ZWQgYnkgZW5jcnlwdGlvblxyXG4iKTsKKyAgICAgICAgZGVidWcoRjExMCwiZmI2NF9zdHJlYW1fa2V5IiwKKyAgICAgICAgICAgICAgICJLZXkgU2NoZWR1bGUgbm90IGNyZWF0ZWQgYnkgZW5jcnlwdGlvbiIsMCk7CisgICAgfQorICAgIGhleGR1bXAoImZiNjRfc3RyZWFtX2tleSBzY2hlZHVsZSIsc3RwLT5zdHJfc2NoZWQsOCoxNik7CisjZW5kaWYgLyogTUlUX0NVUlJFTlQgKi8KKworICAgIG1lbWNweShzdHAtPnN0cl9vdXRwdXQsIHN0cC0+c3RyX2l2LCBzaXplb2YoQmxvY2spKTsKKworICAgIHN0cC0+c3RyX2luZGV4ID0gc2l6ZW9mKEJsb2NrKTsKK30KKworLyoKKyAqIERFUyA2NCBiaXQgQ2lwaGVyIEZlZWRiYWNrCisgKgorICogICAgIGtleSAtLS0+Ky0tLS0tKworICogICAgICAgICAgKy0+fCBERVMgfC0tKworICogICAgICAgICAgfCAgKy0tLS0tKyAgfAorICogICAgICAgICAgfCAgICAgICAgICAgdgorICogIElOUFVUIC0tKC0tLS0tLS0tLT4oKykrLS0tPiBEQVRBCisgKiAgICAgICAgICB8ICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICstLS0tLS0tLS0tLS0tKworICoKKyAqCisgKiBHaXZlbjoKKyAqICAgICAgaVY6IEluaXRpYWwgdmVjdG9yLCA2NCBiaXRzICg4IGJ5dGVzKSBsb25nLgorICogICAgICBEbjogdGhlIG50aCBjaHVuayBvZiA2NCBiaXRzICg4IGJ5dGVzKSBvZiBkYXRhIHRvIGVuY3J5cHQgKGRlY3J5cHQpLgorICogICAgICBPbjogdGhlIG50aCBjaHVuayBvZiA2NCBiaXRzICg4IGJ5dGVzKSBvZiBlbmNyeXB0ZWQgKGRlY3J5cHRlZCkgb3V0cHV0LgorICoKKyAqICAgICAgVjAgPSBERVMoaVYsIGtleSkKKyAqICAgICAgT24gPSBEbiBeIFZuCisgKiAgICAgIFYobisxKSA9IERFUyhPbiwga2V5KQorICovCisKK3ZvaWQKK2NmYjY0X2VuY3J5cHQocywgYykKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzOworICAgIGludCBjOworeworICAgIHJlZ2lzdGVyIHN0cnVjdCBkZXNfc3RpbmZvICpzdHAgPSAmZGVzX2ZiW0NGQl0uc3RyZWFtc1tESVJfRU5DUllQVC0xXTsKKyAgICByZWdpc3RlciBpbnQgaW5kZXg7CisKKyAgICBpbmRleCA9IHN0cC0+c3RyX2luZGV4OworICAgIHdoaWxlIChjLS0gPiAwKSB7CisgICAgICAgIGlmIChpbmRleCA9PSBzaXplb2YoQmxvY2spKSB7CisgICAgICAgICAgICBCbG9jayBiOworI2lmZGVmIE1JVF9DVVJSRU5UCisgICAgICAgICAgICBlY2JfZW5jcnlwdChzdHAsIHN0cC0+c3RyX291dHB1dCwgYik7CisjZWxzZSAvKiBNSVRfQ1VSUkVOVCAqLworICAgICAgICAgICAgZGVzX2VjYl9lbmNyeXB0KHN0cC0+c3RyX291dHB1dCwgYiwgc3RwLT5zdHJfc2NoZWQsIDEpOworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisgICAgICAgICAgICBtZW1jcHkoc3RwLT5zdHJfZmVlZCxiLHNpemVvZihCbG9jaykpOworICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogT24gZW5jcnlwdGlvbiwgd2Ugc3RvcmUgKGZlZWQgXiBkYXRhKSB3aGljaCBpcyBjeXBoZXIgKi8KKyAgICAgICAgKnMgPSBzdHAtPnN0cl9vdXRwdXRbaW5kZXhdID0gKHN0cC0+c3RyX2ZlZWRbaW5kZXhdIF4gKnMpOworICAgICAgICBzKys7CisgICAgICAgIGluZGV4Kys7CisgICAgfQorICAgIHN0cC0+c3RyX2luZGV4ID0gaW5kZXg7Cit9CisKK2ludAorY2ZiNjRfZGVjcnlwdChkYXRhKQorICAgIGludCBkYXRhOworeworICAgIHJlZ2lzdGVyIHN0cnVjdCBkZXNfc3RpbmZvICpzdHAgPSAmZGVzX2ZiW0NGQl0uc3RyZWFtc1tESVJfREVDUllQVC0xXTsKKyAgICBpbnQgaW5kZXg7CisKKyAgICBpZiAoZGF0YSA9PSAtMSkgeworICAgICAgICAvKgorICAgICAgICAqIEJhY2sgdXAgb25lIGJ5dGUuICBJdCBpcyBhc3N1bWVkIHRoYXQgd2Ugd2lsbAorICAgICAgICAqIG5ldmVyIGJhY2sgdXAgbW9yZSB0aGFuIG9uZSBieXRlLiAgSWYgd2UgZG8sIHRoaXMKKyAgICAgICAgKiBtYXkgb3IgbWF5IG5vdCB3b3JrLgorICAgICAgICAqLworICAgICAgICBpZiAoc3RwLT5zdHJfaW5kZXgpCisgICAgICAgICAgICAtLXN0cC0+c3RyX2luZGV4OworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgaW5kZXggPSBzdHAtPnN0cl9pbmRleCsrOworICAgIGlmIChpbmRleCA9PSBzaXplb2YoQmxvY2spKSB7CisgICAgICAgIEJsb2NrIGI7CisjaWZkZWYgTUlUX0NVUlJFTlQKKyAgICAgICAgZWNiX2VuY3J5cHQoc3RwLCBzdHAtPnN0cl9vdXRwdXQsIGIpOworI2Vsc2UgLyogTUlUX0NVUlJFTlQgKi8KKyAgICAgICAgZGVzX2VjYl9lbmNyeXB0KHN0cC0+c3RyX291dHB1dCwgYiwgc3RwLT5zdHJfc2NoZWQsIDEpOworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisgICAgICAgIG1lbWNweShzdHAtPnN0cl9mZWVkLCBiLCBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgc3RwLT5zdHJfaW5kZXggPSAxOyAgICAgLyogTmV4dCB0aW1lIHdpbGwgYmUgMSAqLworICAgICAgICBpbmRleCA9IDA7ICAgICAgICAgICAgICAvKiBCdXQgbm93IHVzZSAwICovCisgICAgfQorCisgICAgLyogT24gZGVjcnlwdGlvbiB3ZSBzdG9yZSAoZGF0YSkgd2hpY2ggaXMgY3lwaGVyLiAqLworICAgIHN0cC0+c3RyX291dHB1dFtpbmRleF0gPSBkYXRhOworICAgIHJldHVybihkYXRhIF4gc3RwLT5zdHJfZmVlZFtpbmRleF0pOworfQorCisvKgorICogREVTIDY0IGJpdCBPdXRwdXQgRmVlZGJhY2sKKyAqCisgKiBrZXkgLS0tPistLS0tLSsKKyAqICAgICAgKy0+fCBERVMgfC0tKworICogICAgICB8ICArLS0tLS0rICB8CisgKiAgICAgICstLS0tLS0tLS0tLSsKKyAqICAgICAgICAgICAgICAgICAgdgorICogIElOUFVUIC0tLS0tLS0tPigrKSAtLS0tPiBEQVRBCisgKgorICogR2l2ZW46CisgKiAgICAgIGlWOiBJbml0aWFsIHZlY3RvciwgNjQgYml0cyAoOCBieXRlcykgbG9uZy4KKyAqICAgICAgRG46IHRoZSBudGggY2h1bmsgb2YgNjQgYml0cyAoOCBieXRlcykgb2YgZGF0YSB0byBlbmNyeXB0IChkZWNyeXB0KS4KKyAqICAgICAgT246IHRoZSBudGggY2h1bmsgb2YgNjQgYml0cyAoOCBieXRlcykgb2YgZW5jcnlwdGVkIChkZWNyeXB0ZWQpIG91dHB1dC4KKyAqCisgKiAgICAgIFYwID0gREVTKGlWLCBrZXkpCisgKiAgICAgIFYobisxKSA9IERFUyhWbiwga2V5KQorICogICAgICBPbiA9IERuIF4gVm4KKyAqLwordm9pZAorb2ZiNjRfZW5jcnlwdChzLCBjKQorICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnM7CisgICAgaW50IGM7Cit7CisgICAgcmVnaXN0ZXIgc3RydWN0IGRlc19zdGluZm8gKnN0cCA9ICZkZXNfZmJbT0ZCXS5zdHJlYW1zW0RJUl9FTkNSWVBULTFdOworICAgIHJlZ2lzdGVyIGludCBpbmRleDsKKworICAgIGluZGV4ID0gc3RwLT5zdHJfaW5kZXg7CisgICAgd2hpbGUgKGMtLSA+IDApIHsKKyAgICAgICAgaWYgKGluZGV4ID09IHNpemVvZihCbG9jaykpIHsKKyAgICAgICAgICAgIEJsb2NrIGI7CisjaWZkZWYgTUlUX0NVUlJFTlQKKyAgICAgICAgICAgIGVjYl9lbmNyeXB0KHN0cCwgc3RwLT5zdHJfZmVlZCwgYik7CisjZWxzZSAvKiBNSVRfQ1VSUkVOVCAqLworICAgICAgICAgICAgZGVzX2VjYl9lbmNyeXB0KHN0cC0+c3RyX2ZlZWQsIGIsIHN0cC0+c3RyX3NjaGVkLCAxKTsKKyNlbmRpZiAvKiBNSVRfQ1VSUkVOVCAqLworICAgICAgICAgICAgbWVtY3B5KHN0cC0+c3RyX2ZlZWQsYixzaXplb2YoQmxvY2spKTsKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgfQorICAgICAgICAqcysrIF49IHN0cC0+c3RyX2ZlZWRbaW5kZXhdOworICAgICAgICBpbmRleCsrOworICAgIH0KKyAgICBzdHAtPnN0cl9pbmRleCA9IGluZGV4OworfQorCitpbnQKK29mYjY0X2RlY3J5cHQoZGF0YSkKKyAgICBpbnQgZGF0YTsKK3sKKyAgICByZWdpc3RlciBzdHJ1Y3QgZGVzX3N0aW5mbyAqc3RwID0gJmRlc19mYltPRkJdLnN0cmVhbXNbRElSX0RFQ1JZUFQtMV07CisgICAgaW50IGluZGV4OworCisgICAgaWYgKGRhdGEgPT0gLTEpIHsKKyAgICAgICAgLyoKKyAgICAgICAgKiBCYWNrIHVwIG9uZSBieXRlLiAgSXQgaXMgYXNzdW1lZCB0aGF0IHdlIHdpbGwKKyAgICAgICAgKiBuZXZlciBiYWNrIHVwIG1vcmUgdGhhbiBvbmUgYnl0ZS4gIElmIHdlIGRvLCB0aGlzCisgICAgICAgICogbWF5IG9yIG1heSBub3Qgd29yay4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHN0cC0+c3RyX2luZGV4KQorICAgICAgICAgICAgLS1zdHAtPnN0cl9pbmRleDsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIGluZGV4ID0gc3RwLT5zdHJfaW5kZXgrKzsKKyAgICBpZiAoaW5kZXggPT0gc2l6ZW9mKEJsb2NrKSkgeworICAgICAgICBCbG9jayBiOworI2lmZGVmIE1JVF9DVVJSRU5UCisgICAgICAgIGVjYl9lbmNyeXB0KHN0cCwgc3RwLT5zdHJfZmVlZCwgYik7CisjZWxzZSAvKiBNSVRfQ1VSUkVOVCAqLworICAgICAgICBkZXNfZWNiX2VuY3J5cHQoc3RwLT5zdHJfZmVlZCwgYiwgc3RwLT5zdHJfc2NoZWQsIDEpOworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisgICAgICAgIG1lbWNweShzdHAtPnN0cl9mZWVkLCBiLCBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgc3RwLT5zdHJfaW5kZXggPSAxOyAgICAgLyogTmV4dCB0aW1lIHdpbGwgYmUgMSAqLworICAgICAgICBpbmRleCA9IDA7ICAgICAgICAgICAgICAvKiBCdXQgbm93IHVzZSAwICovCisgICAgfQorCisgICAgcmV0dXJuKGRhdGEgXiBzdHAtPnN0cl9mZWVkW2luZGV4XSk7Cit9CisKKwordm9pZCBkZXMzX2ZiNjRfc3RyZWFtX2l2IFAoKEJsb2NrLCBzdHJ1Y3QgZGVzM19zdGluZm8gKikpOwordm9pZCBkZXMzX2ZiNjRfaW5pdCBQKChzdHJ1Y3QgZGVzM19mYiAqKSk7CitzdGF0aWMgaW50IGRlczNfZmI2NF9zdGFydCBQKChzdHJ1Y3QgZGVzM19mYiAqLCBpbnQsIGludCkpOworaW50IGRlczNfZmI2NF9pcyBQKCh1bnNpZ25lZCBjaGFyICosIGludCwgc3RydWN0IGRlczNfZmIgKikpOworaW50IGRlczNfZmI2NF9yZXBseSBQKCh1bnNpZ25lZCBjaGFyICosIGludCwgc3RydWN0IGRlczNfZmIgKikpOworc3RhdGljIGludCBkZXMzX2ZiNjRfc2Vzc2lvbiBQKChTZXNzaW9uX0tleSAqLCBpbnQsIHN0cnVjdCBkZXMzX2ZiICopKTsKK3ZvaWQgZGVzM19mYjY0X3N0cmVhbV9rZXkgUCgoQmxvY2sgKiwgc3RydWN0IGRlczNfc3RpbmZvICopKTsKK2ludCBkZXMzX2ZiNjRfa2V5aWQgUCgoaW50LCB1bnNpZ25lZCBjaGFyICosIGludCAqLCBzdHJ1Y3QgZGVzM19mYiAqKSk7CisKK3ZvaWQKK2RlczNfY2ZiNjRfaW5pdChzZXJ2ZXIpCisgICAgaW50IHNlcnZlcjsKK3sKKyAgICBkZXMzX2ZiNjRfaW5pdCgmZGVzM19mYltDRkJdKTsKKyAgICBkZXMzX2ZiW0NGQl0uZmJfZmVlZFs0XSA9IEVOQ1RZUEVfREVTM19DRkI2NDsKKyAgICBkZXMzX2ZiW0NGQl0uc3RyZWFtc1swXS5zdHJfZmxhZ3NoaWZ0ID0gU0hJRlRfVkFMKDAsIENGQik7CisgICAgZGVzM19mYltDRkJdLnN0cmVhbXNbMV0uc3RyX2ZsYWdzaGlmdCA9IFNISUZUX1ZBTCgxLCBDRkIpOworfQorCit2b2lkCitkZXMzX29mYjY0X2luaXQoc2VydmVyKQorICAgIGludCBzZXJ2ZXI7Cit7CisgICAgZGVzM19mYjY0X2luaXQoJmRlczNfZmJbT0ZCXSk7CisgICAgZGVzM19mYltPRkJdLmZiX2ZlZWRbNF0gPSBFTkNUWVBFX0RFUzNfT0ZCNjQ7CisgICAgZGVzM19mYltDRkJdLnN0cmVhbXNbMF0uc3RyX2ZsYWdzaGlmdCA9IFNISUZUX1ZBTCgwLCBPRkIpOworICAgIGRlczNfZmJbQ0ZCXS5zdHJlYW1zWzFdLnN0cl9mbGFnc2hpZnQgPSBTSElGVF9WQUwoMSwgT0ZCKTsKK30KKwordm9pZAorZGVzM19mYjY0X2luaXQoZmJwKQorICAgIHJlZ2lzdGVyIHN0cnVjdCBkZXMzX2ZiICpmYnA7Cit7CisgICAgbWVtc2V0KCh2b2lkICopZmJwLCAwLCBzaXplb2YoKmZicCkpOworICAgIGZicC0+c3RhdGVbMF0gPSBmYnAtPnN0YXRlWzFdID0geEZBSUxFRDsKKyAgICBmYnAtPmZiX2ZlZWRbMF0gPSBJQUM7CisgICAgZmJwLT5mYl9mZWVkWzFdID0gU0I7CisgICAgZmJwLT5mYl9mZWVkWzJdID0gVEVMT1BUX0VOQ1JZUFRJT047CisgICAgZmJwLT5mYl9mZWVkWzNdID0gRU5DUllQVF9JUzsKK30KKworLyoKKyAqIFJldHVybnM6CisgKiAgICAgIC0xOiBzb21lIGVycm9yLiAgTmVnb3RpYXRpb24gaXMgZG9uZSwgZW5jcnlwdGlvbiBub3QgcmVhZHkuCisgKiAgICAgICAwOiBTdWNjZXNzZnVsLCBpbml0aWFsIG5lZ290aWF0aW9uIGFsbCBkb25lLgorICogICAgICAgMTogc3VjY2Vzc2Z1bCwgbmVnb3RpYXRpb24gbm90IGRvbmUgeWV0LgorICogICAgICAgMjogTm90IHlldC4gIE90aGVyIHRoaW5ncyAobGlrZSBnZXR0aW5nIHRoZSBrZXkgZnJvbQorICogICAgICAgICAgS2VyYmVyb3MpIGhhdmUgdG8gaGFwcGVuIGJlZm9yZSB3ZSBjYW4gY29udGludWUuCisgKi8KK2ludAorZGVzM19jZmI2NF9zdGFydChkaXIsIHNlcnZlcikKKyAgICBpbnQgZGlyOworICAgIGludCBzZXJ2ZXI7Cit7CisgICAgcmV0dXJuKGRlczNfZmI2NF9zdGFydCgmZGVzM19mYltDRkJdLCBkaXIsIHNlcnZlcikpOworfQoraW50CitkZXMzX29mYjY0X3N0YXJ0KGRpciwgc2VydmVyKQorICAgIGludCBkaXI7CisgICAgaW50IHNlcnZlcjsKK3sKKyAgICByZXR1cm4oZGVzM19mYjY0X3N0YXJ0KCZkZXMzX2ZiW09GQl0sIGRpciwgc2VydmVyKSk7Cit9CisKK3N0YXRpYyBpbnQKK2RlczNfZmI2NF9zdGFydChmYnAsIGRpciwgc2VydmVyKQorICAgIHN0cnVjdCBkZXMzX2ZiICpmYnA7CisgICAgaW50IGRpcjsKKyAgICBpbnQgc2VydmVyOworeworICAgIGludCB4OworICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgcmVnaXN0ZXIgaW50IHN0YXRlOworCisgICAgc3dpdGNoIChkaXIpIHsKKyAgICBjYXNlIERJUl9ERUNSWVBUOgorICAgICAgICAvKgorICAgICAgICAqIFRoaXMgaXMgc2ltcGx5IGEgcmVxdWVzdCB0byBoYXZlIHRoZSBvdGhlciBzaWRlCisgICAgICAgICogc3RhcnQgb3V0cHV0IChvdXIgaW5wdXQpLiAgSGUgd2lsbCBuZWdvdGlhdGUgYW4KKyAgICAgICAgKiBJViBzbyB3ZSBuZWVkIG5vdCBsb29rIGZvciBpdC4KKyAgICAgICAgKi8KKyAgICAgICAgc3RhdGUgPSBmYnAtPnN0YXRlW2Rpci0xXTsKKyAgICAgICAgaWYgKHN0YXRlID09IHhGQUlMRUQpCisgICAgICAgICAgICBzdGF0ZSA9IElOX1BST0dSRVNTOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRElSX0VOQ1JZUFQ6CisgICAgICAgIHN0YXRlID0gZmJwLT5zdGF0ZVtkaXItMV07CisgICAgICAgIGlmIChzdGF0ZSA9PSB4RkFJTEVEKQorICAgICAgICAgICAgc3RhdGUgPSBJTl9QUk9HUkVTUzsKKyAgICAgICAgZWxzZSBpZiAoKHN0YXRlICYgTk9fU0VORF9JVikgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICghVkFMSURLRVkoZmJwLT5rcmJkZXNfa2V5WzBdKSB8fAorICAgICAgICAgICAgIVZBTElES0VZKGZicC0+a3JiZGVzX2tleVsxXSkgfHwKKyAgICAgICAgICAgICFWQUxJREtFWShmYnAtPmtyYmRlc19rZXlbMl0pICkgeworICAgICAgICAgICAgZmJwLT5uZWVkX3N0YXJ0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN0YXRlICY9IH5OT19TRU5EX0lWOworICAgICAgICBzdGF0ZSB8PSBOT19SRUNWX0lWOworICAgICAgICAvKgorICAgICAgICAqIENyZWF0ZSBhIHJhbmRvbSBmZWVkIGFuZCBzZW5kIGl0IG92ZXIuCisgICAgICAgICovCisgICAgICAgIGRlc19uZXdfcmFuZG9tX2tleShmYnAtPnRlbXBfZmVlZCk7CisjaWZkZWYgTElCREVTCisgICAgICAgIGRlc19lY2IzX2VuY3J5cHQoZmJwLT50ZW1wX2ZlZWQsIGZicC0+dGVtcF9mZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZicC0+a3JiZGVzX3NjaGVkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZicC0+a3JiZGVzX3NjaGVkWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZicC0+a3JiZGVzX3NjaGVkWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworI2Vsc2UgLyogTElCREVTICovCisgICAgICAgIGRlc19lY2JfZW5jcnlwdChmYnAtPnRlbXBfZmVlZCwgZmJwLT50ZW1wX2ZlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmJwLT5rcmJkZXNfc2NoZWRbMF0sIDEpOworICAgICAgICBkZXNfZWNiX2VuY3J5cHQoZmJwLT50ZW1wX2ZlZWQsIGZicC0+dGVtcF9mZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZicC0+a3JiZGVzX3NjaGVkWzFdLCAwKTsKKyAgICAgICAgZGVzX2VjYl9lbmNyeXB0KGZicC0+dGVtcF9mZWVkLCBmYnAtPnRlbXBfZmVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYnAtPmtyYmRlc19zY2hlZFsyXSwgMSk7CisjZW5kaWYgLyogTElCREVTICovCisKKyAgICAgICAgcCA9IGZicC0+ZmJfZmVlZCArIDM7CisgICAgICAgICpwKysgPSBFTkNSWVBUX0lTOworICAgICAgICBwKys7CisgICAgICAgICpwKysgPSBGQjY0X0lWOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZW9mKEJsb2NrKTsgKyt4KSB7CisgICAgICAgICAgICBpZiAoKCAqcCsrID0gZmJwLT50ZW1wX2ZlZWRbeF0pID09IElBQykKKyAgICAgICAgICAgICAgICAqcCsrID0gSUFDOworICAgICAgICB9CisgICAgICAgICpwKysgPSBJQUM7CisgICAgICAgICpwKysgPSBTRTsKKworICAgICAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgc3ByaW50Zih0bl9tc2csCisgICAgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgJXMgSVMgJXMgRkI2NF9JViAiLAorICAgICAgICAgICAgICAgICAgICAgVEVMT1BUKGZicC0+ZmJfZmVlZFsyXSksCisgICAgICAgICAgICAgICAgICAgICBlbmN0eXBlX25hbWVzW2ZicC0+ZmJfZmVlZFs0XV0pOyAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgdG5faGV4KHRuX21zZyxUTl9NU0dfTEVOLCZmYnAtPmZiX2ZlZWRbNl0sKHAtZmJwLT5mYl9mZWVkKS0yLTYpOworICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiSUFDIFNFIixUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsdG5fbXNnLCIiLDApOworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZyk7CisgICAgICAgIH0KKyNpZmRlZiBPUzIKKyAgICAgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyAgICAgICAgdHRvbChmYnAtPmZiX2ZlZWQsIHAgLSBmYnAtPmZiX2ZlZWQpOworI2lmZGVmIE9TMgorICAgICAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4oeEZBSUxFRCk7CisgICAgfQorICAgIHJldHVybihmYnAtPnN0YXRlW2Rpci0xXSA9IHN0YXRlKTsKK30KKworLyoKKyAqIFJldHVybnM6CisgKiAgICAgIC0xOiBzb21lIGVycm9yLiAgTmVnb3RpYXRpb24gaXMgZG9uZSwgZW5jcnlwdGlvbiBub3QgcmVhZHkuCisgKiAgICAgICAwOiBTdWNjZXNzZnVsLCBpbml0aWFsIG5lZ290aWF0aW9uIGFsbCBkb25lLgorICogICAgICAgMTogc3VjY2Vzc2Z1bCwgbmVnb3RpYXRpb24gbm90IGRvbmUgeWV0LgorICovCitpbnQKK2RlczNfY2ZiNjRfaXMoZGF0YSwgY250KQorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgaW50IGNudDsKK3sKKyAgICByZXR1cm4oZGVzM19mYjY0X2lzKGRhdGEsIGNudCwgJmRlczNfZmJbQ0ZCXSkpOworfQorCitpbnQKK2RlczNfb2ZiNjRfaXMoZGF0YSwgY250KQorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgaW50IGNudDsKK3sKKyAgICByZXR1cm4oZGVzM19mYjY0X2lzKGRhdGEsIGNudCwgJmRlczNfZmJbT0ZCXSkpOworfQorCitpbnQKK2RlczNfZmI2NF9pcyhkYXRhLCBjbnQsIGZicCkKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIGludCBjbnQ7CisgICAgc3RydWN0IGRlczNfZmIgKmZicDsKK3sKKyAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIHJlZ2lzdGVyIGludCBzdGF0ZSA9IGZicC0+c3RhdGVbRElSX0RFQ1JZUFQtMV07CisKKyAgICBpZiAoY250LS0gPCAxKQorICAgICAgICBnb3RvIGZhaWx1cmU7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoIVRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICBzd2l0Y2ggKCpkYXRhKyspIHsKKyAgICBjYXNlIEZCNjRfSVY6CisgICAgICAgIGlmIChjbnQgIT0gc2l6ZW9mKEJsb2NrKSkgeworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKQorICAgICAgICAgICAgICAgIHByaW50ZigiREVTM19GQjY0OiBpbml0aWFsIHZlY3RvciBmYWlsZWQgb24gc2l6ZVxyXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgc3RhdGUgPSB4RkFJTEVEOworICAgICAgICAgICAgZ290byBmYWlsdXJlOworICAgICAgICB9CisKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICAgICAgICBwcmludGYoIkRFUzNfRkI2NDogaW5pdGlhbCB2ZWN0b3IgcmVjZWl2ZWRcclxuIik7CisgICAgICAgICAgICBwcmludGYoIkluaXRpYWxpemluZyBEZWNyeXB0IHN0cmVhbVxyXG4iKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGRlczNfZmI2NF9zdHJlYW1faXYoKHZvaWQgKilkYXRhLCAmZmJwLT5zdHJlYW1zW0RJUl9ERUNSWVBULTFdKTsKKworICAgICAgICBwID0gZmJwLT5mYl9mZWVkICsgMzsKKyAgICAgICAgKnArKyA9IEVOQ1JZUFRfUkVQTFk7CisgICAgICAgIHArKzsKKyAgICAgICAgKnArKyA9IEZCNjRfSVZfT0s7CisgICAgICAgICpwKysgPSBJQUM7CisgICAgICAgICpwKysgPSBTRTsKKworICAgICAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgc3ByaW50Zih0bl9tc2csCisgICAgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgJXMgUkVQTFkgJXMgRkI2NF9JVl9PSyAiLAorICAgICAgICAgICAgICAgICAgICAgVEVMT1BUKGZicC0+ZmJfZmVlZFsyXSksCisgICAgICAgICAgICAgICAgICAgICBlbmN0eXBlX25hbWVzW2ZicC0+ZmJfZmVlZFs0XV0pOyAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgdG5faGV4KHRuX21zZyxUTl9NU0dfTEVOLCZmYnAtPmZiX2ZlZWRbNl0sKHAtZmJwLT5mYl9mZWVkKS0yLTYpOworICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiSUFDIFNFIixUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsdG5fbXNnLCIiLDApOworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZyk7CisgICAgICAgIH0KKyNpZmRlZiBPUzIKKyAgICAgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyAgICAgICAgdHRvbChmYnAtPmZiX2ZlZWQsIHAgLSBmYnAtPmZiX2ZlZWQpOworI2lmZGVmIE9TMgorICAgICAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgICAgICBzdGF0ZSA9IElOX1BST0dSRVNTOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisjaWYgMAorICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICAgICAgICBwcmludGYoIlVua25vd24gb3B0aW9uIHR5cGU6ICVkXHJcbiIsICooZGF0YS0xKSk7CisgICAgICAgICAgICBwcmludGYoIlxyXG4iKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworICAgICAgZmFpbHVyZToKKyAgICAgICAgLyoKKyAgICAgICAgKiBXZSBmYWlsZWQuICBTZW5kIGFuIEZCNjRfSVZfQkFEIG9wdGlvbgorICAgICAgICAqIHRvIHRoZSBvdGhlciBzaWRlIHNvIGl0IHdpbGwga25vdyB0aGF0CisgICAgICAgICogdGhpbmdzIGZhaWxlZC4KKyAgICAgICAgKi8KKyAgICAgICAgcCA9IGZicC0+ZmJfZmVlZCArIDM7CisgICAgICAgICpwKysgPSBFTkNSWVBUX1JFUExZOworICAgICAgICBwKys7CisgICAgICAgICpwKysgPSBGQjY0X0lWX0JBRDsKKyAgICAgICAgKnArKyA9IElBQzsKKyAgICAgICAgKnArKyA9IFNFOworCisgICAgICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBzcHJpbnRmKHRuX21zZywKKyAgICAgICAgICAgICAgICAgICAgICJURUxORVQgU0VOVCBTQiAlcyBSRVBMWSAlcyBGQjY0X0lWX0JBRCAiLAorICAgICAgICAgICAgICAgICAgICAgVEVMT1BUKGZicC0+ZmJfZmVlZFsyXSksCisgICAgICAgICAgICAgICAgICAgICBlbmN0eXBlX25hbWVzW2ZicC0+ZmJfZmVlZFs0XV0pOyAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgdG5faGV4KHRuX21zZyxUTl9NU0dfTEVOLCZmYnAtPmZiX2ZlZWRbNl0sKHAtZmJwLT5mYl9mZWVkKS0yLTYpOworICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiSUFDIFNFIixUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsdG5fbXNnLCIiLDApOworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZyk7CisgICAgICAgIH0KKyNpZmRlZiBPUzIKKyAgICAgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyAgICAgICAgdHRvbChmYnAtPmZiX2ZlZWQsIHAgLSBmYnAtPmZiX2ZlZWQpOworI2lmZGVmIE9TMgorICAgICAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuKGZicC0+c3RhdGVbRElSX0RFQ1JZUFQtMV0gPSBzdGF0ZSk7Cit9CisKKy8qCisgKiBSZXR1cm5zOgorICogICAgICAtMTogc29tZSBlcnJvci4gIE5lZ290aWF0aW9uIGlzIGRvbmUsIGVuY3J5cHRpb24gbm90IHJlYWR5LgorICogICAgICAgMDogU3VjY2Vzc2Z1bCwgaW5pdGlhbCBuZWdvdGlhdGlvbiBhbGwgZG9uZS4KKyAqICAgICAgIDE6IHN1Y2Nlc3NmdWwsIG5lZ290aWF0aW9uIG5vdCBkb25lIHlldC4KKyAqLworaW50CitkZXMzX2NmYjY0X3JlcGx5KGRhdGEsIGNudCkKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIGludCBjbnQ7Cit7CisgICAgcmV0dXJuKGRlczNfZmI2NF9yZXBseShkYXRhLCBjbnQsICZkZXMzX2ZiW0NGQl0pKTsKK30KK2ludAorZGVzM19vZmI2NF9yZXBseShkYXRhLCBjbnQpCisgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICBpbnQgY250OworeworICAgIHJldHVybihkZXMzX2ZiNjRfcmVwbHkoZGF0YSwgY250LCAmZGVzM19mYltPRkJdKSk7Cit9CisKKworaW50CitkZXMzX2ZiNjRfcmVwbHkoZGF0YSwgY250LCBmYnApCisgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICBpbnQgY250OworICAgIHN0cnVjdCBkZXMzX2ZiICpmYnA7Cit7CisgICAgcmVnaXN0ZXIgaW50IHN0YXRlID0gZmJwLT5zdGF0ZVtESVJfRU5DUllQVC0xXTsKKworICAgIGlmIChjbnQtLSA8IDEpCisgICAgICAgIGdvdG8gZmFpbHVyZTsKKworICAgIHN3aXRjaCAoKmRhdGErKykgeworICAgIGNhc2UgRkI2NF9JVl9PSzoKKyAgICAgICAgZGVzM19mYjY0X3N0cmVhbV9pdihmYnAtPnRlbXBfZmVlZCwgJmZicC0+c3RyZWFtc1tESVJfRU5DUllQVC0xXSk7CisgICAgICAgIGlmIChzdGF0ZSA9PSB4RkFJTEVEKQorICAgICAgICAgICAgc3RhdGUgPSBJTl9QUk9HUkVTUzsKKyAgICAgICAgc3RhdGUgJj0gfk5PX1JFQ1ZfSVY7CisgICAgICAgIGVuY3J5cHRfc2VuZF9rZXlpZChESVJfRU5DUllQVCwgKHVuc2lnbmVkIGNoYXIgKikiXDAiLCAxLCAxKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZCNjRfSVZfQkFEOgorICAgICAgICBtZW1zZXQoZmJwLT50ZW1wX2ZlZWQsIDAsIHNpemVvZihCbG9jaykpOworICAgICAgICBkZXMzX2ZiNjRfc3RyZWFtX2l2KGZicC0+dGVtcF9mZWVkLCAmZmJwLT5zdHJlYW1zW0RJUl9FTkNSWVBULTFdKTsKKyAgICAgICAgc3RhdGUgPSB4RkFJTEVEOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisjaWYgMAorICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICAgICAgICBwcmludGYoIlVua25vd24gb3B0aW9uIHR5cGU6ICVkXHJcbiIsIGRhdGFbLTFdKTsKKyAgICAgICAgICAgIHByaW50ZigiXHJcbiIpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisgICAgICBmYWlsdXJlOgorICAgICAgICBzdGF0ZSA9IHhGQUlMRUQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4oZmJwLT5zdGF0ZVtESVJfRU5DUllQVC0xXSA9IHN0YXRlKTsKK30KKworaW50CitkZXMzX2NmYjY0X3Nlc3Npb24oa2V5LCBzZXJ2ZXIpCisgICAgU2Vzc2lvbl9LZXkgKmtleTsKKyAgICBpbnQgc2VydmVyOworeworICAgIHJldHVybihkZXMzX2ZiNjRfc2Vzc2lvbihrZXksIHNlcnZlciwgJmRlczNfZmJbQ0ZCXSkpOworfQorCitpbnQKK2RlczNfb2ZiNjRfc2Vzc2lvbihrZXksIHNlcnZlcikKKyAgICBTZXNzaW9uX0tleSAqa2V5OworICAgIGludCBzZXJ2ZXI7Cit7CisgICAgcmV0dXJuKGRlczNfZmI2NF9zZXNzaW9uKGtleSwgc2VydmVyLCAmZGVzM19mYltPRkJdKSk7Cit9CisKK3N0YXRpYyBpbnQKK2RlczNfZmI2NF9zZXNzaW9uKGtleSwgc2VydmVyLCBmYnApCisgICAgU2Vzc2lvbl9LZXkgKmtleTsKKyAgICBpbnQgc2VydmVyOworICAgIHN0cnVjdCBkZXMzX2ZiICpmYnA7Cit7CisgICAgaW50IHJjPTAsaT0wOworICAgIGludCBrZXlzMnVzZT0wOworICAgIHN0cnVjdCBkZXMzX3N0aW5mbyAqIHNfc3RyZWFtOworICAgIHN0cnVjdCBkZXMzX3N0aW5mbyAqIGNfc3RyZWFtOworCisgICAgaWYoc2VydmVyKSB7CisgICAgICAgIHNfc3RyZWFtID0gJmZicC0+c3RyZWFtc1tESVJfRU5DUllQVC0xXTsKKyAgICAgICAgY19zdHJlYW0gPSAmZmJwLT5zdHJlYW1zW0RJUl9ERUNSWVBULTFdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc19zdHJlYW0gPSAmZmJwLT5zdHJlYW1zW0RJUl9ERUNSWVBULTFdOworICAgICAgICBjX3N0cmVhbSA9ICZmYnAtPnN0cmVhbXNbRElSX0VOQ1JZUFQtMV07CisgICAgfQorCisgICAga2V5czJ1c2UgPSBrZXktPmxlbmd0aCAvIHNpemVvZihCbG9jayk7CisgICAgaWYgKCFrZXkgfHwgKGtleS0+dHlwZSA9PSBTS19ERVMpIHx8IChrZXlzMnVzZSA8IDIpKSB7CisgICAgICAgIENIQVIgYnVmWzgwXTsKKyAgICAgICAgc3ByaW50ZihidWYsIkNhbid0IHNldCAzREVTIHNlc3Npb24ga2V5ICglZCA8ICVkKSIsCisgICAgICAgICAgICAgICAga2V5ID8ga2V5LT5sZW5ndGggOiAwLCAyICogc2l6ZW9mKEJsb2NrKSk7ICAgICAgLyogc2FmZSAqLworI2lmZGVmIERFQlVHCisgICAgICAgIGlmIChlbmNyeXB0X2RlYnVnX21vZGUpCisgICAgICAgICAgICBwcmludGYoIiVzXHJcbiIsYnVmKTsKKyNlbmRpZgorICAgICAgICBkZWJ1ZyhGMTEwLCJkZXMzX2ZiNjRfc2Vzc2lvbiIsYnVmLDApOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIGRlYnVnKEYxMTEsImRlczNfZmI2NF9zZXNzaW9uIiwia2V5czJ1c2UiLGtleXMydXNlKTsKKyAgICAvKiBDb21wdXRlIHRoZSBmaXJzdCBzZXQgb2Yga2V5cyAvIGtleSBvcmRlciAqLworICAgIHN3aXRjaCAoIGtleXMydXNlICkgeworICAgIGNhc2UgMjoKKyAgICAgICAgbWVtY3B5KCh2b2lkICopZmJwLT5rcmJkZXNfa2V5WzBdLCAodm9pZCAqKWtleS0+ZGF0YSwgc2l6ZW9mKEJsb2NrKSk7CisgICAgICAgIG1lbWNweSgodm9pZCAqKSBmYnAtPmtyYmRlc19rZXlbMV0sKHZvaWQgKikoa2V5LT5kYXRhICsgc2l6ZW9mKEJsb2NrKSksCisgICAgICAgICAgICAgICAgIHNpemVvZihCbG9jaykpOworICAgICAgICBtZW1jcHkoKHZvaWQgKilmYnAtPmtyYmRlc19rZXlbMl0sICh2b2lkICopa2V5LT5kYXRhLCBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgIGRlZmF1bHQ6CisgICAgICAgIG1lbWNweSgodm9pZCAqKWZicC0+a3JiZGVzX2tleVswXSwgKHZvaWQgKilrZXktPmRhdGEsIHNpemVvZihCbG9jaykpOworICAgICAgICBtZW1jcHkoKHZvaWQgKikgZmJwLT5rcmJkZXNfa2V5WzFdLCh2b2lkICopKGtleS0+ZGF0YSArIHNpemVvZihCbG9jaykpLAorICAgICAgICAgICAgICAgICBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopIGZicC0+a3JiZGVzX2tleVsyXSwKKyAgICAgICAgICAgICAgICAgKHZvaWQgKikgKGtleS0+ZGF0YSArIDIqc2l6ZW9mKEJsb2NrKSksIHNpemVvZihCbG9jaykpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaGV4ZHVtcCgiZGVzM19zZXNzaW9uX2tleSBrZXktPmRhdGEiLGtleS0+ZGF0YSxzaXplb2YoQmxvY2spKTsKKyAgICBoZXhkdW1wKCJkZXMzX3Nlc3Npb25fa2V5IGZicC0+a3JiZGVzX2tleVswXSIsCisgICAgICAgICAgICBmYnAtPmtyYmRlc19rZXlbMF0sCisgICAgICAgICAgICBzaXplb2YoQmxvY2spCisgICAgICAgICAgICApOworICAgIGlmIChmYnAtPm9uY2UgPT0gMCkgeworICAgICAgICBkZXNfc2V0X3JhbmRvbV9nZW5lcmF0b3Jfc2VlZChmYnAtPmtyYmRlc19rZXlbMF0pOworICAgICAgICBmYnAtPm9uY2UgPSAxOworICAgIH0KKworICAgIGZvciAoIGk9MDtpPDM7aSsrICkKKyAgICAgICAgZGVzX2ZpeHVwX2tleV9wYXJpdHkoZmJwLT5rcmJkZXNfa2V5W2ldKTsKKyAgICBkZXMzX2ZiNjRfc3RyZWFtX2tleShmYnAtPmtyYmRlc19rZXksIHNfc3RyZWFtKTsKKworCisgICAgLyogQ29tcHV0ZSB0aGUgc2Vjb25kIHNldCBvZiBrZXlzIC8ga2V5IG9yZGVyICovCisgICAgc3dpdGNoICgga2V5czJ1c2UgKSB7CisgICAgY2FzZSAyOgorICAgICAgICBtZW1jcHkoKHZvaWQgKikgZmJwLT5rcmJkZXNfa2V5WzBdLCh2b2lkICopKGtleS0+ZGF0YSArIHNpemVvZihCbG9jaykpLAorICAgICAgICAgICAgICAgICBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopZmJwLT5rcmJkZXNfa2V5WzFdLCAodm9pZCAqKWtleS0+ZGF0YSwgc2l6ZW9mKEJsb2NrKSk7CisgICAgICAgIG1lbWNweSgodm9pZCAqKSBmYnAtPmtyYmRlc19rZXlbMl0sKHZvaWQgKikoa2V5LT5kYXRhICsgc2l6ZW9mKEJsb2NrKSksCisgICAgICAgICAgICAgICAgIHNpemVvZihCbG9jaykpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIG1lbWNweSgodm9pZCAqKSBmYnAtPmtyYmRlc19rZXlbMF0sKHZvaWQgKikoa2V5LT5kYXRhICsgc2l6ZW9mKEJsb2NrKSksCisgICAgICAgICAgICAgICAgIHNpemVvZihCbG9jaykpOworICAgICAgICBtZW1jcHkoKHZvaWQgKikgZmJwLT5rcmJkZXNfa2V5WzFdLAorICAgICAgICAgICAgICAgICAodm9pZCAqKSAoa2V5LT5kYXRhICsgMipzaXplb2YoQmxvY2spKSwgc2l6ZW9mKEJsb2NrKSk7CisgICAgICAgIG1lbWNweSgodm9pZCAqKWZicC0+a3JiZGVzX2tleVsyXSwgKHZvaWQgKilrZXktPmRhdGEsIHNpemVvZihCbG9jaykpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIG1lbWNweSgodm9pZCAqKSBmYnAtPmtyYmRlc19rZXlbMF0sKHZvaWQgKikoa2V5LT5kYXRhICsgc2l6ZW9mKEJsb2NrKSksCisgICAgICAgICAgICAgICAgIHNpemVvZihCbG9jaykpOworICAgICAgICBtZW1jcHkoKHZvaWQgKikgZmJwLT5rcmJkZXNfa2V5WzFdLAorICAgICAgICAgICAgICAgICAodm9pZCAqKSAoa2V5LT5kYXRhICsgMypzaXplb2YoQmxvY2spKSwgc2l6ZW9mKEJsb2NrKSk7CisgICAgICAgIG1lbWNweSgodm9pZCAqKWZicC0+a3JiZGVzX2tleVsyXSwgKHZvaWQgKilrZXktPmRhdGEsIHNpemVvZihCbG9jaykpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIG1lbWNweSgodm9pZCAqKSBmYnAtPmtyYmRlc19rZXlbMF0sKHZvaWQgKikoa2V5LT5kYXRhICsgc2l6ZW9mKEJsb2NrKSksCisgICAgICAgICAgICAgICAgIHNpemVvZihCbG9jaykpOworICAgICAgICBtZW1jcHkoKHZvaWQgKikgZmJwLT5rcmJkZXNfa2V5WzFdLAorICAgICAgICAgICAgICAgICAodm9pZCAqKSAoa2V5LT5kYXRhICsgMypzaXplb2YoQmxvY2spKSwgc2l6ZW9mKEJsb2NrKSk7CisgICAgICAgIG1lbWNweSgodm9pZCAqKWZicC0+a3JiZGVzX2tleVsyXSwKKyAgICAgICAgICAgICAgICAgKHZvaWQgKikoa2V5LT5kYXRhICsgNCpzaXplb2YoQmxvY2spKSwgc2l6ZW9mKEJsb2NrKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgbWVtY3B5KCh2b2lkICopIGZicC0+a3JiZGVzX2tleVswXSwKKyAgICAgICAgICAgICAgICAgKHZvaWQgKikgKGtleS0+ZGF0YSArIDMqc2l6ZW9mKEJsb2NrKSksIHNpemVvZihCbG9jaykpOworICAgICAgICBtZW1jcHkoKHZvaWQgKilmYnAtPmtyYmRlc19rZXlbMV0sCisgICAgICAgICAgICAgICAgICh2b2lkICopKGtleS0+ZGF0YSArIDQqc2l6ZW9mKEJsb2NrKSksIHNpemVvZihCbG9jaykpOworICAgICAgICBtZW1jcHkoKHZvaWQgKikgZmJwLT5rcmJkZXNfa2V5WzJdLAorICAgICAgICAgICAgICAgICAodm9pZCAqKSAoa2V5LT5kYXRhICsgNSAqc2l6ZW9mKEJsb2NrKSksICBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZm9yICggaT0wO2k8MztpKysgKQorICAgICAgICBkZXNfZml4dXBfa2V5X3Bhcml0eShmYnAtPmtyYmRlc19rZXlbaV0pOworICAgIGRlczNfZmI2NF9zdHJlYW1fa2V5KGZicC0+a3JiZGVzX2tleSwgY19zdHJlYW0pOworCisgICAgLyogbm93IHVzZSB0aGUgc2Vjb25kIHNldCBvZiBrZXlzIHRvIGJ1aWxkIHRoZSBkZWZhdWx0IEtleSBTY2hlZHVsZSAqLworICAgIC8qIHdoaWNoIGlzIHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhlIElWLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmb3IgKCBpPTA7aTwzO2krKyApIHsKKyAgICAgICAgbWVtc2V0KGZicC0+a3JiZGVzX3NjaGVkW2ldLDAsc2l6ZW9mKFNjaGVkdWxlKSk7CisKKyAgICAgICAgcmMgPSBkZXNfa2V5X3NjaGVkKGZicC0+a3JiZGVzX2tleVtpXSwgZmJwLT5rcmJkZXNfc2NoZWRbaV0pOworICAgICAgICBpZiAoIHJjID09IC0xICkgeworICAgICAgICAgICAgcHJpbnRmKCI/SW52YWxpZCBERVMga2V5IHNwZWNpZmllZCBmb3IgZW5jcnlwdGlvbiBbREVTMywlc11cclxuIiwKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyPyJzZXJ2ZXIiOiJjbGllbnQiKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImRlczNfZmI2NF9zdHJlYW1faXYiLAorICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIERFUyBLZXkgc3BlY2lmaWVkIGZvciBlbmNyeXB0aW9uIiwwKTsKKyAgICAgICAgfSBlbHNlIGlmICggcmMgPT0gLTIgKSB7CisgICAgICAgICAgICBwcmludGYoIj9XZWFrIERFUyBrZXkgc3BlY2lmaWVkIGZvciBlbmNyeXB0aW9uXHJcbiIpOworICAgICAgICAgICAgZGVidWcoRjExMCwiZGVzM19mYjY0X3N0cmVhbV9pdiIsCisgICAgICAgICAgICAgICAgICAgIndlYWsgREVTIEtleSBzcGVjaWZpZWQgZm9yIGVuY3J5cHRpb24iLDApOworICAgICAgICB9IGVsc2UgaWYgKCByYyAhPSAwICkgeworICAgICAgICAgICAgcHJpbnRmKCI/S2V5IFNjaGVkdWxlIG5vdCBjcmVhdGVkIGJ5IGVuY3J5cHRpb25cclxuIik7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJkZXMzX2ZiNjRfc3RyZWFtX2l2IiwKKyAgICAgICAgICAgICAgICAgICAiS2V5IFNjaGVkdWxlIG5vdCBjcmVhdGVkIGJ5IGVuY3J5cHRpb24iLDApOworICAgICAgICB9CisgICAgICAgIGhleGR1bXAoImRlczNfZmI2NF9zZXNzaW9uX2tleSBzY2hlZHVsZSIsZmJwLT5rcmJkZXNfc2NoZWRbaV0sOCoxNik7CisgICAgfQorICAgIC8qCisgICAgKiBOb3cgbG9vayB0byBzZWUgaWYga3JiZGVzX3N0YXJ0KCkgd2FzIHdhcyB3YWl0aW5nIGZvcgorICAgICogdGhlIGtleSB0byBzaG93IHVwLiAgSWYgc28sIGdvIGFoZWFkIGFuIGNhbGwgaXQgbm93CisgICAgKiB0aGF0IHdlIGhhdmUgdGhlIGtleS4KKyAgICAqLworICAgIGlmIChmYnAtPm5lZWRfc3RhcnQpIHsKKyAgICAgICAgZmJwLT5uZWVkX3N0YXJ0ID0gMDsKKyAgICAgICAgZGVzM19mYjY0X3N0YXJ0KGZicCwgRElSX0VOQ1JZUFQsIHNlcnZlcik7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworLyoKKyAqIFdlIG9ubHkgYWNjZXB0IGEga2V5aWQgb2YgMC4gIElmIHdlIGdldCBhIGtleWlkIG9mCisgKiAwLCB0aGVuIG1hcmsgdGhlIHN0YXRlIGFzIFNVQ0NFU1MuCisgKi8KK2ludAorZGVzM19jZmI2NF9rZXlpZChkaXIsIGtwLCBsZW5wKQorICAgIGludCBkaXIsICpsZW5wOworICAgIHVuc2lnbmVkIGNoYXIgKmtwOworeworICAgIHJldHVybihkZXMzX2ZiNjRfa2V5aWQoZGlyLCBrcCwgbGVucCwgJmRlczNfZmJbQ0ZCXSkpOworfQorCitpbnQKK2RlczNfb2ZiNjRfa2V5aWQoZGlyLCBrcCwgbGVucCkKKyAgICBpbnQgZGlyLCAqbGVucDsKKyAgICB1bnNpZ25lZCBjaGFyICprcDsKK3sKKyAgICByZXR1cm4oZGVzM19mYjY0X2tleWlkKGRpciwga3AsIGxlbnAsICZkZXMzX2ZiW09GQl0pKTsKK30KKworaW50CitkZXMzX2ZiNjRfa2V5aWQoZGlyLCBrcCwgbGVucCwgZmJwKQorICAgIGludCBkaXIsICpsZW5wOworICAgIHVuc2lnbmVkIGNoYXIgKmtwOworICAgIHN0cnVjdCBkZXMzX2ZiICpmYnA7Cit7CisgICAgcmVnaXN0ZXIgaW50IHN0YXRlID0gZmJwLT5zdGF0ZVtkaXItMV07CisKKyAgICBpZiAoKmxlbnAgIT0gMSB8fCAoKmtwICE9ICdcMCcpKSB7CisgICAgICAgICpsZW5wID0gMDsKKyAgICAgICAgcmV0dXJuKHN0YXRlKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGUgPT0geEZBSUxFRCkKKyAgICAgICAgc3RhdGUgPSBJTl9QUk9HUkVTUzsKKworICAgIHN0YXRlICY9IH5OT19LRVlJRDsKKworICAgIHJldHVybihmYnAtPnN0YXRlW2Rpci0xXSA9IHN0YXRlKTsKK30KKworI2lmIDAKK3ZvaWQKK2RlczNfZmI2NF9wcmludHN1YihkYXRhLCBjbnQsIGJ1ZiwgYnVmbGVuLCB0eXBlKQorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsICpidWYsICp0eXBlOworICAgIGludCBjbnQsIGJ1ZmxlbjsKK3sKKyAgICBjaGFyIGxidWZbNjRdOworICAgIHJlZ2lzdGVyIGludCBpOworICAgIGNoYXIgKmNwOworCisgICAgYnVmW2J1Zmxlbi0xXSA9ICdcMCc7ICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIGl0J3MgTlVMTCB0ZXJtaW5hdGVkICovCisgICAgYnVmbGVuIC09IDE7CisKKyAgICBzd2l0Y2goZGF0YVsyXSkgeworICAgIGNhc2UgRkI2NF9JVjoKKyAgICAgICAgc3ByaW50ZihsYnVmLCAiJXNfSVYiLCB0eXBlKTsKKyAgICAgICAgY3AgPSBsYnVmOworICAgICAgICBnb3RvIGNvbW1vbjsKKworICAgIGNhc2UgRkI2NF9JVl9PSzoKKyAgICAgICAgc3ByaW50ZihsYnVmLCAiJXNfSVZfT0siLCB0eXBlKTsKKyAgICAgICAgY3AgPSBsYnVmOworICAgICAgICBnb3RvIGNvbW1vbjsKKworICAgIGNhc2UgRkI2NF9JVl9CQUQ6CisgICAgICAgIHNwcmludGYobGJ1ZiwgIiVzX0lWX0JBRCIsIHR5cGUpOworICAgICAgICBjcCA9IGxidWY7CisgICAgICAgIGdvdG8gY29tbW9uOworCisgICAgY2FzZSBGQjY0X0NIQUxMRU5HRToKKyAgICAgICAgc3ByaW50ZihsYnVmLCAiJXNfQ0hBTExFTkdFIiwgdHlwZSk7CisgICAgICAgIGNwID0gbGJ1ZjsKKyAgICAgICAgZ290byBjb21tb247CisKKyAgICBjYXNlIEZCNjRfUkVTUE9OU0U6CisgICAgICAgIHNwcmludGYobGJ1ZiwgIiVzX1JFU1BPTlNFIiwgdHlwZSk7CisgICAgICAgIGNwID0gbGJ1ZjsKKyAgICAgICAgZ290byBjb21tb247CisKKyAgICBkZWZhdWx0OgorICAgICAgICBzcHJpbnRmKGxidWYsICIgJWQgKHVua25vd24pIiwgZGF0YVsyXSk7CisgICAgICAgIGNwID0gbGJ1ZjsKKyAgICAgIGNvbW1vbjoKKyAgICAgICAgZm9yICg7IChidWZsZW4gPiAwKSAmJiAoKmJ1ZiA9ICpjcCsrKTsgYnVmKyspCisgICAgICAgICAgICBidWZsZW4tLTsKKyAgICAgICAgZm9yIChpID0gMzsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgICAgICBzcHJpbnRmKGxidWYsICIgJWQiLCBkYXRhW2ldKTsKKyAgICAgICAgICAgIGZvciAoY3AgPSBsYnVmOyAoYnVmbGVuID4gMCkgJiYgKCpidWYgPSAqY3ArKyk7IGJ1ZisrKQorICAgICAgICAgICAgICAgIGJ1Zmxlbi0tOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZAorZGVzM19jZmI2NF9wcmludHN1YihkYXRhLCBjbnQsIGJ1ZiwgYnVmbGVuKQorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsICpidWY7CisgICAgaW50IGNudCwgYnVmbGVuOworeworICAgIGRlczNfZmI2NF9wcmludHN1YihkYXRhLCBjbnQsIGJ1ZiwgYnVmbGVuLCAiQ0ZCNjQiKTsKK30KKwordm9pZAorZGVzM19vZmI2NF9wcmludHN1YihkYXRhLCBjbnQsIGJ1ZiwgYnVmbGVuKQorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsICpidWY7CisgICAgaW50IGNudCwgYnVmbGVuOworeworICAgIGRlczNfZmI2NF9wcmludHN1YihkYXRhLCBjbnQsIGJ1ZiwgYnVmbGVuLCAiT0ZCNjQiKTsKK30KKyNlbmRpZgorCit2b2lkCitkZXMzX2ZiNjRfc3RyZWFtX2l2KHNlZWQsIHN0cCkKKyAgICBCbG9jayBzZWVkOworICAgIHJlZ2lzdGVyIHN0cnVjdCBkZXMzX3N0aW5mbyAqc3RwOworeworICAgIGludCByYz0wLCBpID0gMDs7CisKKyAgICBtZW1jcHkoc3RwLT5zdHJfaXYsICAgICBzZWVkLCBzaXplb2YoQmxvY2spKTsKKyAgICBtZW1jcHkoc3RwLT5zdHJfb3V0cHV0LCBzZWVkLCBzaXplb2YoQmxvY2spKTsKKyAgICBmb3IgKCBpPTA7aTwzO2krKyApIHsKKyAgICAgICAgbWVtc2V0KHN0cC0+c3RyX3NjaGVkW2ldLDAsc2l6ZW9mKFNjaGVkdWxlKSk7CisKKyAgICAgICAgaGV4ZHVtcCgiZGVzM19mYjY0X3N0cmVhbV9pdiIsc3RwLT5zdHJfaWtleVtpXSw4KTsKKworICAgICAgICByYyA9IGRlc19rZXlfc2NoZWQoc3RwLT5zdHJfaWtleVtpXSwgc3RwLT5zdHJfc2NoZWRbaV0pOworICAgICAgICBpZiAoIHJjID09IC0xICkgeworICAgICAgICAgICAgcHJpbnRmKCI/SW52YWxpZCBERVMga2V5IHNwZWNpZmllZCBmb3IgZW5jcnlwdGlvbiBbREVTMyBpdl1cclxuIik7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJkZXMzX2ZiNjRfc3RyZWFtX2l2IiwKKyAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBERVMgS2V5IHNwZWNpZmllZCBmb3IgZW5jcnlwdGlvbiIsMCk7CisgICAgICAgIH0gZWxzZSBpZiAoIHJjID09IC0yICkgeworICAgICAgICAgICAgcHJpbnRmKCI/V2VhayBERVMga2V5IHNwZWNpZmllZCBmb3IgZW5jcnlwdGlvblxyXG4iKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImRlczNfZmI2NF9zdHJlYW1faXYiLAorICAgICAgICAgICAgICAgICAgICJ3ZWFrIERFUyBLZXkgc3BlY2lmaWVkIGZvciBlbmNyeXB0aW9uIiwwKTsKKyAgICAgICAgfSBlbHNlIGlmICggcmMgIT0gMCApIHsKKyAgICAgICAgICAgIHByaW50ZigiP0tleSBTY2hlZHVsZSBub3QgY3JlYXRlZCBieSBlbmNyeXB0aW9uXHJcbiIpOworICAgICAgICAgICAgZGVidWcoRjExMCwiZGVzM19mYjY0X3N0cmVhbV9pdiIsCisgICAgICAgICAgICAgICAgICAgIktleSBTY2hlZHVsZSBub3QgY3JlYXRlZCBieSBlbmNyeXB0aW9uIiwwKTsKKyAgICAgICAgfQorICAgICAgICBoZXhkdW1wKCJkZXMzX2ZiNjRfc3RyZWFtX2l2IHNjaGVkdWxlIixzdHAtPnN0cl9zY2hlZFtpXSw4KjE2KTsKKyAgICB9CisgICAgc3RwLT5zdHJfaW5kZXggPSBzaXplb2YoQmxvY2spOworfQorCit2b2lkCitkZXMzX2ZiNjRfc3RyZWFtX2tleShrZXksIHN0cCkKKyAgICBCbG9jayAqIGtleTsKKyAgICByZWdpc3RlciBzdHJ1Y3QgZGVzM19zdGluZm8gKnN0cDsKK3sKKyAgICBpbnQgcmMgPSAwLCBpID0gMDsKKworICAgIGZvciAoIGk9MDtpPDM7aSsrICkgeworICAgICAgICBtZW1jcHkoc3RwLT5zdHJfaWtleVtpXSwga2V5W2ldLCBzaXplb2YoQmxvY2spKTsKKworICAgICAgICBtZW1zZXQoc3RwLT5zdHJfc2NoZWRbaV0sMCxzaXplb2YoU2NoZWR1bGUpKTsKKworICAgICAgICBoZXhkdW1wKCJkZXMzX2ZiNjRfc3RyZWFtX2tleSIsa2V5W2ldLDgpOworCisgICAgICAgIHJjID0gZGVzX2tleV9zY2hlZChrZXlbaV0sIHN0cC0+c3RyX3NjaGVkW2ldKTsKKyAgICAgICAgaWYgKCByYyA9PSAtMSApIHsKKyAgICAgICAgICAgIHByaW50ZigiP0ludmFsaWQgREVTIGtleSBzcGVjaWZpZWQgZm9yIGVuY3J5cHRpb24gW0RFUzMga2V5XVxyXG4iKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImRlczNfZmI2NF9zdHJlYW1fa2V5IiwKKyAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBERVMgS2V5IHNwZWNpZmllZCBmb3IgZW5jcnlwdGlvbiIsMCk7CisgICAgICAgIH0gZWxzZSBpZiAoIHJjID09IC0yICkgeworICAgICAgICAgICAgcHJpbnRmKCI/V2VhayBERVMga2V5IHNwZWNpZmllZCBmb3IgZW5jcnlwdGlvblxyXG4iKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImRlczNfZmI2NF9zdHJlYW1fa2V5IiwKKyAgICAgICAgICAgICAgICAgICAid2VhayBERVMgS2V5IHNwZWNpZmllZCBmb3IgZW5jcnlwdGlvbiIsMCk7CisgICAgICAgIH0gZWxzZSBpZiAoIHJjICE9IDAgKSB7CisgICAgICAgICAgICBwcmludGYoIj9LZXkgU2NoZWR1bGUgbm90IGNyZWF0ZWQgYnkgZW5jcnlwdGlvblxyXG4iKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImRlczNfZmI2NF9zdHJlYW1fa2V5IiwKKyAgICAgICAgICAgICAgICAgICAiS2V5IFNjaGVkdWxlIG5vdCBjcmVhdGVkIGJ5IGVuY3J5cHRpb24iLDApOworICAgICAgICB9CisgICAgICAgIGhleGR1bXAoImRlczNfZmI2NF9zdHJlYW1fa2V5IHNjaGVkdWxlIixzdHAtPnN0cl9zY2hlZFtpXSw4KjE2KTsKKyAgICB9CisKKyAgICBtZW1jcHkoc3RwLT5zdHJfb3V0cHV0LCBzdHAtPnN0cl9pdiwgc2l6ZW9mKEJsb2NrKSk7CisgICAgc3RwLT5zdHJfaW5kZXggPSBzaXplb2YoQmxvY2spOworfQorCisvKgorICogREVTMyA2NCBiaXQgQ2lwaGVyIEZlZWRiYWNrCisgKgorICogICAgICAgICAgICAgICAga2V5MSAgICAgICBrZXkyICAgICAgIGtleTMKKyAqICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgIHYgICAgICAgICAgdiAgICAgICAgICB2CisgKiAgICAgICAgICAgICArLS0tLS0tLSsgICstLS0tLS0tKyAgKy0tLS0tLS0rCisgKiAgICAgICAgICArLT58IERFUy1lIHwtPnwgREVTLWQgfC0+fCBERVMtZSB8LS0gKworICogICAgICAgICAgfCAgKy0tLS0tLS0rICArLS0tLS0tLSsgICstLS0tLS0tKyAgIHwKKyAqICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2CisgKiAgSU5QVVQgLS0oLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+KCspKy0tLT4gREFUQQorICogICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICoKKyAqIEdpdmVuOgorICogICAgICBpVjogSW5pdGlhbCB2ZWN0b3IsIDY0IGJpdHMgKDggYnl0ZXMpIGxvbmcuCisgKiAgICAgIERuOiB0aGUgbnRoIGNodW5rIG9mIDY0IGJpdHMgKDggYnl0ZXMpIG9mIGRhdGEgdG8gZW5jcnlwdCAoZGVjcnlwdCkuCisgKiAgICAgIE9uOiB0aGUgbnRoIGNodW5rIG9mIDY0IGJpdHMgKDggYnl0ZXMpIG9mIGVuY3J5cHRlZCAoZGVjcnlwdGVkKSBvdXRwdXQuCisgKgorICogICAgICBWMCA9IERFUy1lKERFUy1kKERFUy1lKGlWLCBrZXkxKSxrZXkyKSxrZXkzKQorICogICAgICBPbiA9IERuIF4gVm4KKyAqICAgICAgVihuKzEpID0gREVTLWUoREVTLWQoREVTLWUoT24sIGtleTEpLGtleTIpLGtleTMpCisgKi8KKwordm9pZAorZGVzM19jZmI2NF9lbmNyeXB0KHMsIGMpCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqczsKKyAgICBpbnQgYzsKK3sKKyAgICByZWdpc3RlciBzdHJ1Y3QgZGVzM19zdGluZm8gKnN0cCA9ICZkZXMzX2ZiW0NGQl0uc3RyZWFtc1tESVJfRU5DUllQVC0xXTsKKyAgICByZWdpc3RlciBpbnQgaW5kZXg7CisKKyAgICBpbmRleCA9IHN0cC0+c3RyX2luZGV4OworICAgIHdoaWxlIChjLS0gPiAwKSB7CisgICAgICAgIGlmIChpbmRleCA9PSBzaXplb2YoQmxvY2spKSB7CisgICAgICAgICAgICBCbG9jayBiOworI2lmZGVmIExJQkRFUworICAgICAgICAgICAgZGVzX2VjYjNfZW5jcnlwdChzdHAtPnN0cl9vdXRwdXQsIGIsIHN0cC0+c3RyX3NjaGVkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwLT5zdHJfc2NoZWRbMV0sIHN0cC0+c3RyX3NjaGVkWzJdLCAxKTsKKyNlbHNlIC8qIExJQkRFUyAqLworICAgICAgICAgICAgZGVzX2VjYl9lbmNyeXB0KHN0cC0+c3RyX291dHB1dCwgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwLT5zdHJfc2NoZWRbMF0sIDEpOworICAgICAgICAgICAgZGVzX2VjYl9lbmNyeXB0KHN0cC0+c3RyX291dHB1dCwgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwLT5zdHJfc2NoZWRbMV0sIDApOworICAgICAgICAgICAgZGVzX2VjYl9lbmNyeXB0KHN0cC0+c3RyX291dHB1dCwgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwLT5zdHJfc2NoZWRbMl0sIDEpOworI2VuZGlmIC8qIExJQkRFUyAqLworICAgICAgICAgICAgbWVtY3B5KHN0cC0+c3RyX2ZlZWQsYixzaXplb2YoQmxvY2spKTsKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE9uIGVuY3J5cHRpb24sIHdlIHN0b3JlIChmZWVkIF4gZGF0YSkgd2hpY2ggaXMgY3lwaGVyICovCisgICAgICAgICpzID0gc3RwLT5zdHJfb3V0cHV0W2luZGV4XSA9IChzdHAtPnN0cl9mZWVkW2luZGV4XSBeICpzKTsKKyAgICAgICAgcysrOworICAgICAgICBpbmRleCsrOworICAgIH0KKyAgICBzdHAtPnN0cl9pbmRleCA9IGluZGV4OworfQorCitpbnQKK2RlczNfY2ZiNjRfZGVjcnlwdChkYXRhKQorICAgIGludCBkYXRhOworeworICAgIHJlZ2lzdGVyIHN0cnVjdCBkZXMzX3N0aW5mbyAqc3RwID0gJmRlczNfZmJbQ0ZCXS5zdHJlYW1zW0RJUl9ERUNSWVBULTFdOworICAgIGludCBpbmRleDsKKworICAgIGlmIChkYXRhID09IC0xKSB7CisgICAgICAgIC8qCisgICAgICAgICogQmFjayB1cCBvbmUgYnl0ZS4gIEl0IGlzIGFzc3VtZWQgdGhhdCB3ZSB3aWxsCisgICAgICAgICogbmV2ZXIgYmFjayB1cCBtb3JlIHRoYW4gb25lIGJ5dGUuICBJZiB3ZSBkbywgdGhpcworICAgICAgICAqIG1heSBvciBtYXkgbm90IHdvcmsuCisgICAgICAgICovCisgICAgICAgIGlmIChzdHAtPnN0cl9pbmRleCkKKyAgICAgICAgICAgIC0tc3RwLT5zdHJfaW5kZXg7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICBpbmRleCA9IHN0cC0+c3RyX2luZGV4Kys7CisgICAgaWYgKGluZGV4ID09IHNpemVvZihCbG9jaykpIHsKKyAgICAgICAgQmxvY2sgYjsKKyNpZmRlZiBMSUJERVMKKyAgICAgICAgZGVzX2VjYjNfZW5jcnlwdChzdHAtPnN0cl9vdXRwdXQsIGIsIHN0cC0+c3RyX3NjaGVkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHAtPnN0cl9zY2hlZFsxXSwgc3RwLT5zdHJfc2NoZWRbMl0sIDEpOworI2Vsc2UgLyogTElCREVTICovCisgICAgICAgICAgICBkZXNfZWNiX2VuY3J5cHQoc3RwLT5zdHJfb3V0cHV0LCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHAtPnN0cl9zY2hlZFswXSwgMSk7CisgICAgICAgICAgICBkZXNfZWNiX2VuY3J5cHQoc3RwLT5zdHJfb3V0cHV0LCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHAtPnN0cl9zY2hlZFsxXSwgMCk7CisgICAgICAgICAgICBkZXNfZWNiX2VuY3J5cHQoc3RwLT5zdHJfb3V0cHV0LCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHAtPnN0cl9zY2hlZFsyXSwgMSk7CisjZW5kaWYgLyogTElCREVTICovCisgICAgICAgIG1lbWNweShzdHAtPnN0cl9mZWVkLCBiLCBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgc3RwLT5zdHJfaW5kZXggPSAxOyAgICAgLyogTmV4dCB0aW1lIHdpbGwgYmUgMSAqLworICAgICAgICBpbmRleCA9IDA7ICAgICAgICAgICAgICAvKiBCdXQgbm93IHVzZSAwICovCisgICAgfQorCisgICAgLyogT24gZGVjcnlwdGlvbiB3ZSBzdG9yZSAoZGF0YSkgd2hpY2ggaXMgY3lwaGVyLiAqLworICAgIHN0cC0+c3RyX291dHB1dFtpbmRleF0gPSBkYXRhOworICAgIHJldHVybihkYXRhIF4gc3RwLT5zdHJfZmVlZFtpbmRleF0pOworfQorCisvKgorICogREVTMyA2NCBiaXQgT3V0cHV0IEZlZWRiYWNrCisgKgorICoKKyAqICAgICAgICAgICAgICAgIGtleTEgICAgICAga2V5MiAgICAgICBrZXkzCisgKiAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICB2ICAgICAgICAgIHYgICAgICAgICAgdgorICogICAgICAgICAgICAgKy0tLS0tLS0rICArLS0tLS0tLSsgICstLS0tLS0tKworICogICAgICAgICAgKy0+fCBERVMtZSB8LT58IERFUy1kIHwtPnwgREVTLWUgfC0tICsKKyAqICAgICAgICAgIHwgICstLS0tLS0tKyAgKy0tLS0tLS0rICArLS0tLS0tLSsgICB8CisgKiAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKKyAqICBJTlBVVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPigrKSAtLS0tPiBEQVRBCisgKgorICogR2l2ZW46CisgKiAgICAgIGlWOiBJbml0aWFsIHZlY3RvciwgNjQgYml0cyAoOCBieXRlcykgbG9uZy4KKyAqICAgICAgRG46IHRoZSBudGggY2h1bmsgb2YgNjQgYml0cyAoOCBieXRlcykgb2YgZGF0YSB0byBlbmNyeXB0IChkZWNyeXB0KS4KKyAqICAgICAgT246IHRoZSBudGggY2h1bmsgb2YgNjQgYml0cyAoOCBieXRlcykgb2YgZW5jcnlwdGVkIChkZWNyeXB0ZWQpIG91dHB1dC4KKyAqCisgKiAgICAgIFYwID0gREVTLWUoREVTLWQoREVTLWUoaVYsIGtleTEpLGtleTIpLGtleTMpCisgKiAgICAgIFYobisxKSA9IERFUy1lKERFUy1kKERFUy1lKFZuLCBrZXkxKSxrZXkyKSxrZXkzKQorICogICAgICBPbiA9IERuIF4gVm4KKyAqLwordm9pZAorZGVzM19vZmI2NF9lbmNyeXB0KHMsIGMpCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqczsKKyAgICBpbnQgYzsKK3sKKyAgICByZWdpc3RlciBzdHJ1Y3QgZGVzM19zdGluZm8gKnN0cCA9ICZkZXMzX2ZiW09GQl0uc3RyZWFtc1tESVJfRU5DUllQVC0xXTsKKyAgICByZWdpc3RlciBpbnQgaW5kZXg7CisKKyAgICBpbmRleCA9IHN0cC0+c3RyX2luZGV4OworICAgIHdoaWxlIChjLS0gPiAwKSB7CisgICAgICAgIGlmIChpbmRleCA9PSBzaXplb2YoQmxvY2spKSB7CisgICAgICAgICAgICBCbG9jayBiOworI2lmZGVmIExJQkRFUworICAgICAgICAgICAgZGVzX2VjYjNfZW5jcnlwdChzdHAtPnN0cl9mZWVkLCBiLCBzdHAtPnN0cl9zY2hlZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwLT5zdHJfc2NoZWRbMV0sIHN0cC0+c3RyX3NjaGVkWzJdLCAxKTsKKyNlbHNlIC8qIExJQkRFUyAqLworICAgICAgICAgICAgZGVzX2VjYl9lbmNyeXB0KHN0cC0+c3RyX291dHB1dCwgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwLT5zdHJfc2NoZWRbMF0sIDEpOworICAgICAgICAgICAgZGVzX2VjYl9lbmNyeXB0KHN0cC0+c3RyX291dHB1dCwgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwLT5zdHJfc2NoZWRbMV0sIDApOworICAgICAgICAgICAgZGVzX2VjYl9lbmNyeXB0KHN0cC0+c3RyX291dHB1dCwgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwLT5zdHJfc2NoZWRbMl0sIDEpOworI2VuZGlmIC8qIExJQkRFUyAqLworICAgICAgICAgICAgbWVtY3B5KHN0cC0+c3RyX2ZlZWQsYixzaXplb2YoQmxvY2spKTsKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgfQorICAgICAgICAqcysrIF49IHN0cC0+c3RyX2ZlZWRbaW5kZXhdOworICAgICAgICBpbmRleCsrOworICAgIH0KKyAgICBzdHAtPnN0cl9pbmRleCA9IGluZGV4OworfQorCitpbnQKK2RlczNfb2ZiNjRfZGVjcnlwdChkYXRhKQorICAgIGludCBkYXRhOworeworICAgIHJlZ2lzdGVyIHN0cnVjdCBkZXMzX3N0aW5mbyAqc3RwID0gJmRlczNfZmJbT0ZCXS5zdHJlYW1zW0RJUl9ERUNSWVBULTFdOworICAgIGludCBpbmRleDsKKworICAgIGlmIChkYXRhID09IC0xKSB7CisgICAgICAgIC8qCisgICAgICAgICogQmFjayB1cCBvbmUgYnl0ZS4gIEl0IGlzIGFzc3VtZWQgdGhhdCB3ZSB3aWxsCisgICAgICAgICogbmV2ZXIgYmFjayB1cCBtb3JlIHRoYW4gb25lIGJ5dGUuICBJZiB3ZSBkbywgdGhpcworICAgICAgICAqIG1heSBvciBtYXkgbm90IHdvcmsuCisgICAgICAgICovCisgICAgICAgIGlmIChzdHAtPnN0cl9pbmRleCkKKyAgICAgICAgICAgIC0tc3RwLT5zdHJfaW5kZXg7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICBpbmRleCA9IHN0cC0+c3RyX2luZGV4Kys7CisgICAgaWYgKGluZGV4ID09IHNpemVvZihCbG9jaykpIHsKKyAgICAgICAgQmxvY2sgYjsKKyNpZmRlZiBMSUJERVMKKyAgICAgICAgZGVzX2VjYjNfZW5jcnlwdChzdHAtPnN0cl9mZWVkLCBiLCBzdHAtPnN0cl9zY2hlZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwLT5zdHJfc2NoZWRbMV0sIHN0cC0+c3RyX3NjaGVkWzJdLCAxKTsKKyNlbHNlIC8qIExJQkRFUyAqLworICAgICAgICAgICAgZGVzX2VjYl9lbmNyeXB0KHN0cC0+c3RyX291dHB1dCwgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwLT5zdHJfc2NoZWRbMF0sIDEpOworICAgICAgICAgICAgZGVzX2VjYl9lbmNyeXB0KHN0cC0+c3RyX291dHB1dCwgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwLT5zdHJfc2NoZWRbMV0sIDApOworICAgICAgICAgICAgZGVzX2VjYl9lbmNyeXB0KHN0cC0+c3RyX291dHB1dCwgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwLT5zdHJfc2NoZWRbMl0sIDEpOworI2VuZGlmIC8qIExJQkRFUyAqLworICAgICAgICBtZW1jcHkoc3RwLT5zdHJfZmVlZCwgYiwgc2l6ZW9mKEJsb2NrKSk7CisgICAgICAgIHN0cC0+c3RyX2luZGV4ID0gMTsgICAgIC8qIE5leHQgdGltZSB3aWxsIGJlIDEgKi8KKyAgICAgICAgaW5kZXggPSAwOyAgICAgICAgICAgICAgLyogQnV0IG5vdyB1c2UgMCAqLworICAgIH0KKworICAgIHJldHVybihkYXRhIF4gc3RwLT5zdHJfZmVlZFtpbmRleF0pOworfQorI2VuZGlmIC8qIENLX0RFUyAqLworCisjaWZkZWYgQ0tfQ0FTVAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICogICAgICBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBTdGFuZm9yZCBVbml2ZXJzaXR5CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTVEFORk9SRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLAorICogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSCisgKiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUCisgKiBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmICBfX1NURENfXworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKy8qCisgKiBjYXN0LmgKKyAqIEF1dGhvcjogVG9tIFd1CisgKgorICogVHlwZSBhbmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGZvciBDQVNULgorICovCisKKyNpZm5kZWYgX0NBU1RfSF8KKyNkZWZpbmUgX0NBU1RfSF8KKworI2lmbmRlZiBQCisjaWZkZWYgX19TVERDX18KKyNkZWZpbmUgUCh4KSB4CisjZWxzZQorI2RlZmluZSBQKHgpICgpCisjZW5kaWYgLyogX19TVERDX18gKi8KKyNlbmRpZiAvKiBQICovCisKKyNpZm5kZWYgTElUVExFX0VORElBTgorI2lmbmRlZiBCSUdfRU5ESUFOCisjaWZuZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBMSVRUTEVfRU5ESUFOIDEKKyNlbmRpZiAvKiBXT1JEU19CSUdFTkRJQU4gKi8KKyNlbmRpZiAvKiBCSUdfRU5ESUFOICovCisjZW5kaWYgLyogTElUVExFX0VORElBTiAqLworCit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzI7ICAgIC8qIE11c3QgYmUgMzIgYml0cyAqLwordHlwZWRlZiB1aW50MzIgKiB1aW50MzJwOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4OwordHlwZWRlZiB1aW50OCAqIHVpbnQ4cDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgQ2FzdFN1YmtleVBhaXIgeworICAgIHVpbnQzMiBLbTsKKyAgICB1aW50MzIgS3I7CisgIH0gS1sxNl07CisgIGludCBrc2l6ZTsKK30gQ2FzdEtleVNjaGVkOworCisvKgorICogY2FzdCpfa2V5X3NjaGVkKHNjaGVkdWxlLCBrZXkpCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIENBU1Qga2V5IHNjaGVkdWxlICJzY2hlZHVsZSIgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBrZXkuCisgKiBUaGUgZGlmZmVyZW50IHNldHVwIHJvdXRpbmVzIGFjY2VwdCBkaWZmZXJlbnQgbGVuZ3RoIGtleXM6CisgKgorICogICBja19jYXN0NV80MF9rZXlfc2NoZWQ6IDQwLWJpdC81LWJ5dGUgKDEyIHJvdW5kKSBrZXlzCisgKiAgIGNrX2Nhc3Q1XzY0X2tleV9zY2hlZDogNjQtYml0LzgtYnl0ZSAoMTIgcm91bmQpIGtleXMKKyAqICAgY2tfY2FzdDVfODBfa2V5X3NjaGVkOiA4MC1iaXQvMTAtYnl0ZSAoMTIgcm91bmQpIGtleXMKKyAqICAgY2tfY2FzdDEyOF9rZXlfc2NoZWQ6IDEyOC1iaXQvMTYtYnl0ZSAoMTYgcm91bmQpIGtleXMKKyAqLworCitleHRlcm4gdm9pZCBja19jYXN0NV80MF9rZXlfc2NoZWQgUCgoQ2FzdEtleVNjaGVkICosIHVpbnQ4ICopKTsKK2V4dGVybiB2b2lkIGNrX2Nhc3Q1XzY0X2tleV9zY2hlZCBQKChDYXN0S2V5U2NoZWQgKiwgdWludDggKikpOworZXh0ZXJuIHZvaWQgY2tfY2FzdDVfODBfa2V5X3NjaGVkIFAoKENhc3RLZXlTY2hlZCAqLCB1aW50OCAqKSk7CitleHRlcm4gdm9pZCAgY2tfY2FzdDEyOF9rZXlfc2NoZWQgUCgoQ2FzdEtleVNjaGVkICosIHVpbnQ4ICopKTsKKworLyoKKyAqIGNrX2Nhc3RfZWNiX2VuY3J5cHQob3V0cHV0LCBpbnB1dCwgc2NoZWR1bGUsIG1vZGUpCisgKiBja19jYXN0X2VjYl9jcnlwdChkYXRhLCBzY2hlZHVsZSwgbW9kZSkKKyAqCisgKiBFbmNyeXB0cyB0aGUgNjQtYml0ICJpbnB1dCIgYWNjb3JkaW5nIHRvIHRoZSBDQVNUIGtleSBzY2hlZHVsZQorICogInNjaGVkdWxlIiBhbmQgcGxhY2VzIHRoZSByZXN1bHQgaW4gIm91dHB1dCIuICBJZiAibW9kZSIgaXMgMCwKKyAqIGNrX2Nhc3RfZWNiX2VuY3J5cHQgd2lsbCBlbmNyeXB0LCBvdGhlcndpc2UgaXQgd2lsbCBkZWNyeXB0LgorICogIk91dHB1dCIgYW5kICJpbnB1dCIgY2FuIHBvaW50IHRvIHRoZSBzYW1lIG1lbW9yeSwgaW4gd2hpY2ggY2FzZQorICogZW4vZGVjcnlwdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBpbiBwbGFjZS4KKyAqCisgKiBja19jYXN0X2VjYl9jcnlwdCBhY2NlcHRzIGlucHV0IGluIHRoZSBmb3JtIG9mIGFuIGFycmF5IG9mIHR3bworICogMzItYml0IHdvcmRzIGFuZCBwZXJmb3JtcyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gaW4gcGxhY2UuCisgKi8KKworZXh0ZXJuIHZvaWQgY2tfY2FzdF9lY2JfZW5jcnlwdCBQKCh1aW50OCAqLCB1aW50OCAqLCBDYXN0S2V5U2NoZWQgKiwgaW50KSk7CitleHRlcm4gdm9pZCBja19jYXN0X2VjYl9jcnlwdCBQKCh1aW50MzIgKiwgQ2FzdEtleVNjaGVkICosIGludCkpOworCisjZW5kaWYgLyogQ0FTVF9IICovCisKK2V4dGVybiBlbmNyeXB0X2RlYnVnX21vZGU7CisKKyNkZWZpbmUgQ0ZCXzQwICAwCisjZGVmaW5lIE9GQl80MCAgMQorI2lmZGVmIENBU1RfRVhQT1JUX0VOQ1JZUFRJT04KKyNkZWZpbmUgRkJfQ05UICAyCisjZWxzZQorI2RlZmluZSBDRkJfMTI4IDIKKyNkZWZpbmUgT0ZCXzEyOCAzCisjZGVmaW5lIEZCX0NOVCAgNAorI2VuZGlmCisKKyNkZWZpbmUgTk9fU0VORF9JViAgICAgIDEKKyNkZWZpbmUgTk9fUkVDVl9JViAgICAgIDIKKyNkZWZpbmUgTk9fS0VZSUQgICAgICAgIDQKKyNkZWZpbmUgSU5fUFJPR1JFU1MgICAgIChOT19TRU5EX0lWfE5PX1JFQ1ZfSVZ8Tk9fS0VZSUQpCisjZGVmaW5lIFNVQ0NFU1MgICAgICAgICAwCisjZGVmaW5lIGNGQUlMRUQgICAgICAgICAtMQorCisKK3N0cnVjdCBjYXN0X2ZiIHsKKyAgICAgICAgQmxvY2sgdGVtcF9mZWVkOworICAgICAgICB1bnNpZ25lZCBjaGFyIGZiX2ZlZWRbNjRdOworICAgICAgICBpbnQga2V5X2lzc2V0OworICAgICAgICBpbnQgbmVlZF9zdGFydDsKKyAgICAgICAgaW50IHN0YXRlWzJdOworICAgICAgICBzdHJ1Y3QgY2FzdF9zdGluZm8geworICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICBzdHJfb3V0cHV0OworICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICBzdHJfZmVlZDsKKyAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgc3RyX2l2OworICAgICAgICAgICAgICAgIENhc3RLZXlTY2hlZCAgICBzdHJfc2NoZWQ7CisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHN0cl9pbmRleDsKKyAgICAgICAgfSBzdHJlYW1zWzJdOworfTsKKworc3RhdGljIHN0cnVjdCBjYXN0X2ZiIGNhc3RfZmJbRkJfQ05UXTsKKworI2RlZmluZSBGQjY0X0lWICAgICAgICAgMQorI2RlZmluZSBGQjY0X0lWX09LICAgICAgMgorI2RlZmluZSBGQjY0X0lWX0JBRCAgICAgMworCisKK3N0YXRpYyB2b2lkIGNhc3RfZmI2NF9zdHJlYW1faXYgUCgoQmxvY2ssIHN0cnVjdCBjYXN0X3N0aW5mbyAqKSk7CitzdGF0aWMgdm9pZCBjYXN0X2ZiNjRfaW5pdCBQKChzdHJ1Y3QgY2FzdF9mYiAqKSk7CitzdGF0aWMgaW50IGNhc3RfZmI2NF9zdGFydCBQKChzdHJ1Y3QgY2FzdF9mYiAqLCBpbnQsIGludCkpOworc3RhdGljIGludCBjYXN0X2ZiNjRfaXMgUCgodW5zaWduZWQgY2hhciAqLCBpbnQsIHN0cnVjdCBjYXN0X2ZiICopKTsKK3N0YXRpYyBpbnQgY2FzdF9mYjY0X3JlcGx5IFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBzdHJ1Y3QgY2FzdF9mYiAqKSk7CitzdGF0aWMgaW50IGNhc3RfZmI2NF9zZXNzaW9uIFAoKFNlc3Npb25fS2V5ICosIGludCwgc3RydWN0IGNhc3RfZmIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBjYXN0X2ZiNjRfc3RyZWFtX2tleSBQKChCbG9jaywgc3RydWN0IGNhc3Rfc3RpbmZvICosIGludCkpOworc3RhdGljIGludCBjYXN0X2ZiNjRfa2V5aWQgUCgoaW50LCB1bnNpZ25lZCBjaGFyICosIGludCAqLCBzdHJ1Y3QgY2FzdF9mYiAqKSk7CitzdGF0aWMgdm9pZCBfY2FzdF9jZmI2NF9lbmNyeXB0IFAoKHVuc2lnbmVkIGNoYXIgKixpbnQsIHN0cnVjdCBjYXN0X3N0aW5mbyAqKSk7CitzdGF0aWMgaW50IF9jYXN0X2NmYjY0X2RlY3J5cHQgUCgoaW50LCBzdHJ1Y3QgY2FzdF9zdGluZm8gKikpOworc3RhdGljIHZvaWQgX2Nhc3Rfb2ZiNjRfZW5jcnlwdCBQKCh1bnNpZ25lZCBjaGFyICosaW50LCBzdHJ1Y3QgY2FzdF9zdGluZm8gKikpOworc3RhdGljIGludCBfY2FzdF9vZmI2NF9kZWNyeXB0IFAoKGludCwgc3RydWN0IGNhc3Rfc3RpbmZvICopKTsKKworI2lmbmRlZiBDQVNUX0VYUE9SVF9FTkNSWVBUSU9OCit2b2lkCitjYXN0X2NmYjY0X2luaXQoc2VydmVyKQorICAgICAgICBpbnQgc2VydmVyOworeworICAgICAgICBjYXN0X2ZiNjRfaW5pdCgmY2FzdF9mYltDRkJfMTI4XSk7CisgICAgICAgIGNhc3RfZmJbQ0ZCXzEyOF0uZmJfZmVlZFs0XSA9IEVOQ1RZUEVfQ0FTVDEyOF9DRkI2NDsKK30KKwordm9pZAorY2FzdF9vZmI2NF9pbml0KHNlcnZlcikKKyAgICAgICAgaW50IHNlcnZlcjsKK3sKKyAgICAgICAgY2FzdF9mYjY0X2luaXQoJmNhc3RfZmJbT0ZCXzEyOF0pOworICAgICAgICBjYXN0X2ZiW09GQl8xMjhdLmZiX2ZlZWRbNF0gPSBFTkNUWVBFX0NBU1QxMjhfT0ZCNjQ7Cit9CisjZW5kaWYKKwordm9pZAorY2FzdGV4cF9jZmI2NF9pbml0KHNlcnZlcikKKyAgICAgICAgaW50IHNlcnZlcjsKK3sKKyAgICAgICAgY2FzdF9mYjY0X2luaXQoJmNhc3RfZmJbQ0ZCXzQwXSk7CisgICAgICAgIGNhc3RfZmJbQ0ZCXzQwXS5mYl9mZWVkWzRdID0gRU5DVFlQRV9DQVNUNV80MF9DRkI2NDsKK30KKwordm9pZAorY2FzdGV4cF9vZmI2NF9pbml0KHNlcnZlcikKKyAgICAgICAgaW50IHNlcnZlcjsKK3sKKyAgICAgICAgY2FzdF9mYjY0X2luaXQoJmNhc3RfZmJbT0ZCXzQwXSk7CisgICAgICAgIGNhc3RfZmJbT0ZCXzQwXS5mYl9mZWVkWzRdID0gRU5DVFlQRV9DQVNUNV80MF9PRkI2NDsKK30KKworc3RhdGljIHZvaWQKK2Nhc3RfZmI2NF9pbml0KGZicCkKKyAgICByZWdpc3RlciBzdHJ1Y3QgY2FzdF9mYiAqZmJwOworeworICAgIG1lbXNldCgodm9pZCAqKWZicCwgMCwgc2l6ZW9mKCpmYnApKTsKKyAgICBmYnAtPmtleV9pc3NldCA9IDA7CisgICAgZmJwLT5zdGF0ZVswXSA9IGZicC0+c3RhdGVbMV0gPSBjRkFJTEVEOworICAgIGZicC0+ZmJfZmVlZFswXSA9IElBQzsKKyAgICBmYnAtPmZiX2ZlZWRbMV0gPSBTQjsKKyAgICBmYnAtPmZiX2ZlZWRbMl0gPSBURUxPUFRfRU5DUllQVElPTjsKKyAgICBmYnAtPmZiX2ZlZWRbM10gPSBFTkNSWVBUX0lTOworfQorCisvKgorICogUmV0dXJuczoKKyAqICAgICAgLTE6IHNvbWUgZXJyb3IuICBOZWdvdGlhdGlvbiBpcyBkb25lLCBlbmNyeXB0aW9uIG5vdCByZWFkeS4KKyAqICAgICAgIDA6IFN1Y2Nlc3NmdWwsIGluaXRpYWwgbmVnb3RpYXRpb24gYWxsIGRvbmUuCisgKiAgICAgICAxOiBzdWNjZXNzZnVsLCBuZWdvdGlhdGlvbiBub3QgZG9uZSB5ZXQuCisgKiAgICAgICAyOiBOb3QgeWV0LiAgT3RoZXIgdGhpbmdzIChsaWtlIGdldHRpbmcgdGhlIGtleSBmcm9tCisgKiAgICAgICAgICBLZXJiZXJvcykgaGF2ZSB0byBoYXBwZW4gYmVmb3JlIHdlIGNhbiBjb250aW51ZS4KKyAqLworI2lmbmRlZiBDQVNUX0VYUE9SVF9FTkNSWVBUSU9OCitpbnQKK2Nhc3RfY2ZiNjRfc3RhcnQoZGlyLCBzZXJ2ZXIpCisgICAgaW50IGRpcjsKKyAgICBpbnQgc2VydmVyOworeworICAgIHJldHVybihjYXN0X2ZiNjRfc3RhcnQoJmNhc3RfZmJbQ0ZCXzEyOF0sIGRpciwgc2VydmVyKSk7Cit9CisKK2ludAorY2FzdF9vZmI2NF9zdGFydChkaXIsIHNlcnZlcikKKyAgICBpbnQgZGlyOworICAgIGludCBzZXJ2ZXI7Cit7CisgICAgcmV0dXJuKGNhc3RfZmI2NF9zdGFydCgmY2FzdF9mYltPRkJfMTI4XSwgZGlyLCBzZXJ2ZXIpKTsKK30KKyNlbmRpZgorCitpbnQKK2Nhc3RleHBfY2ZiNjRfc3RhcnQoZGlyLCBzZXJ2ZXIpCisgICAgaW50IGRpcjsKKyAgICBpbnQgc2VydmVyOworeworICAgIHJldHVybihjYXN0X2ZiNjRfc3RhcnQoJmNhc3RfZmJbQ0ZCXzQwXSwgZGlyLCBzZXJ2ZXIpKTsKK30KKworaW50CitjYXN0ZXhwX29mYjY0X3N0YXJ0KGRpciwgc2VydmVyKQorICAgIGludCBkaXI7CisgICAgaW50IHNlcnZlcjsKK3sKKyAgICByZXR1cm4oY2FzdF9mYjY0X3N0YXJ0KCZjYXN0X2ZiW09GQl80MF0sIGRpciwgc2VydmVyKSk7Cit9CisKK3N0YXRpYyBpbnQKK2Nhc3RfZmI2NF9zdGFydChmYnAsIGRpciwgc2VydmVyKQorICAgIHN0cnVjdCBjYXN0X2ZiICpmYnA7CisgICAgaW50IGRpcjsKKyAgICBpbnQgc2VydmVyOworeworICAgIEJsb2NrIGI7CisgICAgaW50IHg7CisgICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICByZWdpc3RlciBpbnQgc3RhdGU7CisKKyAgICBzd2l0Y2ggKGRpcikgeworICAgIGNhc2UgRElSX0RFQ1JZUFQ6CisgICAgICAgIC8qCisgICAgICAgICAqIFRoaXMgaXMgc2ltcGx5IGEgcmVxdWVzdCB0byBoYXZlIHRoZSBvdGhlciBzaWRlCisgICAgICAgICAqIHN0YXJ0IG91dHB1dCAob3VyIGlucHV0KS4gIEhlIHdpbGwgbmVnb3RpYXRlIGFuCisgICAgICAgICAqIElWIHNvIHdlIG5lZWQgbm90IGxvb2sgZm9yIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGUgPSBmYnAtPnN0YXRlW2Rpci0xXTsKKyAgICAgICAgaWYgKHN0YXRlID09IGNGQUlMRUQpCisgICAgICAgICAgICBzdGF0ZSA9IElOX1BST0dSRVNTOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRElSX0VOQ1JZUFQ6CisgICAgICAgIHN0YXRlID0gZmJwLT5zdGF0ZVtkaXItMV07CisgICAgICAgIGlmIChzdGF0ZSA9PSBjRkFJTEVEKQorICAgICAgICAgICAgc3RhdGUgPSBJTl9QUk9HUkVTUzsKKyAgICAgICAgZWxzZSBpZiAoKHN0YXRlICYgTk9fU0VORF9JVikgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICghZmJwLT5rZXlfaXNzZXQpIHsKKyAgICAgICAgICAgIGZicC0+bmVlZF9zdGFydCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZSAmPSB+Tk9fU0VORF9JVjsKKyAgICAgICAgc3RhdGUgfD0gTk9fUkVDVl9JVjsKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKQorICAgICAgICAgICAgcHJpbnRmKCJDcmVhdGluZyBuZXcgZmVlZFxyXG4iKTsKKyNlbmRpZgorICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGUgYSByYW5kb20gZmVlZCBhbmQgc2VuZCBpdCBvdmVyLgorICAgICAgICAgKi8KKyAgICAgICAgY2tfY2FzdF9lY2JfZW5jcnlwdChmYnAtPnRlbXBfZmVlZCwgZmJwLT50ZW1wX2ZlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmYnAtPnN0cmVhbXNbZGlyLTFdLnN0cl9zY2hlZCwgMCk7CisKKyAgICAgICAgcCA9IGZicC0+ZmJfZmVlZCArIDM7CisgICAgICAgICpwKysgPSBFTkNSWVBUX0lTOworICAgICAgICBwKys7CisgICAgICAgICpwKysgPSBGQjY0X0lWOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZW9mKEJsb2NrKTsgKyt4KSB7CisgICAgICAgICAgICBpZiAoKCpwKysgPSBmYnAtPnRlbXBfZmVlZFt4XSkgPT0gSUFDKQorICAgICAgICAgICAgICAgICpwKysgPSBJQUM7CisgICAgICAgIH0KKyAgICAgICAgKnArKyA9IElBQzsKKyAgICAgICAgKnArKyA9IFNFOworCisgICAgICAgIHR0b2woZmJwLT5mYl9mZWVkLCBwIC0gZmJwLT5mYl9mZWVkKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKGNGQUlMRUQpOworICAgIH0KKyAgICByZXR1cm4oZmJwLT5zdGF0ZVtkaXItMV0gPSBzdGF0ZSk7Cit9CisKKy8qCisgKiBSZXR1cm5zOgorICogICAgICAtMTogc29tZSBlcnJvci4gIE5lZ290aWF0aW9uIGlzIGRvbmUsIGVuY3J5cHRpb24gbm90IHJlYWR5LgorICogICAgICAgMDogU3VjY2Vzc2Z1bCwgaW5pdGlhbCBuZWdvdGlhdGlvbiBhbGwgZG9uZS4KKyAqICAgICAgIDE6IHN1Y2Nlc3NmdWwsIG5lZ290aWF0aW9uIG5vdCBkb25lIHlldC4KKyAqLworI2lmbmRlZiBDQVNUX0VYUE9SVF9FTkNSWVBUSU9OCitpbnQKK2Nhc3RfY2ZiNjRfaXMoZGF0YSwgY250KQorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgaW50IGNudDsKK3sKKyAgICByZXR1cm4oY2FzdF9mYjY0X2lzKGRhdGEsIGNudCwgJmNhc3RfZmJbQ0ZCXzEyOF0pKTsKK30KKworaW50CitjYXN0X29mYjY0X2lzKGRhdGEsIGNudCkKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIGludCBjbnQ7Cit7CisgICAgcmV0dXJuKGNhc3RfZmI2NF9pcyhkYXRhLCBjbnQsICZjYXN0X2ZiW09GQl8xMjhdKSk7Cit9CisjZW5kaWYKKworaW50CitjYXN0ZXhwX2NmYjY0X2lzKGRhdGEsIGNudCkKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIGludCBjbnQ7Cit7CisgICAgcmV0dXJuKGNhc3RfZmI2NF9pcyhkYXRhLCBjbnQsICZjYXN0X2ZiW0NGQl80MF0pKTsKK30KKworaW50CitjYXN0ZXhwX29mYjY0X2lzKGRhdGEsIGNudCkKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIGludCBjbnQ7Cit7CisgICAgcmV0dXJuKGNhc3RfZmI2NF9pcyhkYXRhLCBjbnQsICZjYXN0X2ZiW09GQl80MF0pKTsKK30KKworc3RhdGljIGludAorY2FzdF9mYjY0X2lzKGRhdGEsIGNudCwgZmJwKQorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgaW50IGNudDsKKyAgICBzdHJ1Y3QgY2FzdF9mYiAqZmJwOworeworICAgIGludCB4OworICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgQmxvY2sgYjsKKyAgICByZWdpc3RlciBpbnQgc3RhdGUgPSBmYnAtPnN0YXRlW0RJUl9ERUNSWVBULTFdOworCisgICAgaWYgKGNudC0tIDwgMSkKKyAgICAgICAgZ290byBmYWlsdXJlOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKCFURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgc3dpdGNoICgqZGF0YSsrKSB7CisgICAgY2FzZSBGQjY0X0lWOgorICAgICAgICBpZiAoY250ICE9IHNpemVvZihCbG9jaykpIHsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgaWYgKGVuY3J5cHRfZGVidWdfbW9kZSkKKyAgICAgICAgICAgICAgICBwcmludGYoIkZCNjQ6IGluaXRpYWwgdmVjdG9yIGZhaWxlZCBvbiBzaXplXHJcbiIpOworI2VuZGlmCisgICAgICAgICAgICBzdGF0ZSA9IGNGQUlMRUQ7CisgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgICAgIH0KKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKQorICAgICAgICAgICAgcHJpbnRmKCJGQjY0OiBpbml0aWFsIHZlY3RvciByZWNlaXZlZFxyXG4iKTsKKworICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKQorICAgICAgICAgICAgcHJpbnRmKCJJbml0aWFsaXppbmcgRGVjcnlwdCBzdHJlYW1cclxuIik7CisjZW5kaWYKKyAgICAgICAgY2FzdF9mYjY0X3N0cmVhbV9pdigodm9pZCAqKWRhdGEsICZmYnAtPnN0cmVhbXNbRElSX0RFQ1JZUFQtMV0pOworCisgICAgICAgIHAgPSBmYnAtPmZiX2ZlZWQgKyAzOworICAgICAgICAqcCsrID0gRU5DUllQVF9SRVBMWTsKKyAgICAgICAgcCsrOworICAgICAgICAqcCsrID0gRkI2NF9JVl9PSzsKKyAgICAgICAgKnArKyA9IElBQzsKKyAgICAgICAgKnArKyA9IFNFOworCisgICAgICAgIHR0b2woZmJwLT5mYl9mZWVkLCBwIC0gZmJwLT5mYl9mZWVkKTsKKyAgICAgICAgc3RhdGUgPSBJTl9QUk9HUkVTUzsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiB1bmtub3duIG9wdGlvbiB0eXBlICovCisgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworICAgICAgZmFpbHVyZToKKyAgICAgICAgLyoKKyAgICAgICAgKiBXZSBmYWlsZWQuICBTZW5kIGFuIEZCNjRfSVZfQkFEIG9wdGlvbgorICAgICAgICAqIHRvIHRoZSBvdGhlciBzaWRlIHNvIGl0IHdpbGwga25vdyB0aGF0CisgICAgICAgICogdGhpbmdzIGZhaWxlZC4KKyAgICAgICAgKi8KKyAgICAgICAgcCA9IGZicC0+ZmJfZmVlZCArIDM7CisgICAgICAgICpwKysgPSBFTkNSWVBUX1JFUExZOworICAgICAgICBwKys7CisgICAgICAgICpwKysgPSBGQjY0X0lWX0JBRDsKKyAgICAgICAgKnArKyA9IElBQzsKKyAgICAgICAgKnArKyA9IFNFOworCisgICAgICAgIHR0b2woZmJwLT5mYl9mZWVkLCBwIC0gZmJwLT5mYl9mZWVkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybihmYnAtPnN0YXRlW0RJUl9ERUNSWVBULTFdID0gc3RhdGUpOworfQorCisvKgorICogUmV0dXJuczoKKyAqICAgICAgLTE6IHNvbWUgZXJyb3IuICBOZWdvdGlhdGlvbiBpcyBkb25lLCBlbmNyeXB0aW9uIG5vdCByZWFkeS4KKyAqICAgICAgIDA6IFN1Y2Nlc3NmdWwsIGluaXRpYWwgbmVnb3RpYXRpb24gYWxsIGRvbmUuCisgKiAgICAgICAxOiBzdWNjZXNzZnVsLCBuZWdvdGlhdGlvbiBub3QgZG9uZSB5ZXQuCisgKi8KKyNpZm5kZWYgQ0FTVF9FWFBPUlRfRU5DUllQVElPTgoraW50CitjYXN0X2NmYjY0X3JlcGx5KGRhdGEsIGNudCkKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIGludCBjbnQ7Cit7CisgICAgcmV0dXJuKGNhc3RfZmI2NF9yZXBseShkYXRhLCBjbnQsICZjYXN0X2ZiW0NGQl8xMjhdKSk7Cit9CisKK2ludAorY2FzdF9vZmI2NF9yZXBseShkYXRhLCBjbnQpCisgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICBpbnQgY250OworeworICAgIHJldHVybihjYXN0X2ZiNjRfcmVwbHkoZGF0YSwgY250LCAmY2FzdF9mYltPRkJfMTI4XSkpOworfQorI2VuZGlmCisKK2ludAorY2FzdGV4cF9jZmI2NF9yZXBseShkYXRhLCBjbnQpCisgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICBpbnQgY250OworeworICAgIHJldHVybihjYXN0X2ZiNjRfcmVwbHkoZGF0YSwgY250LCAmY2FzdF9mYltDRkJfNDBdKSk7Cit9CisKK2ludAorY2FzdGV4cF9vZmI2NF9yZXBseShkYXRhLCBjbnQpCisgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICBpbnQgY250OworeworICAgIHJldHVybihjYXN0X2ZiNjRfcmVwbHkoZGF0YSwgY250LCAmY2FzdF9mYltPRkJfNDBdKSk7Cit9CisKK3N0YXRpYyBpbnQKK2Nhc3RfZmI2NF9yZXBseShkYXRhLCBjbnQsIGZicCkKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIGludCBjbnQ7CisgICAgc3RydWN0IGNhc3RfZmIgKmZicDsKK3sKKyAgICBpbnQgeDsKKyAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIEJsb2NrIGI7CisgICAgcmVnaXN0ZXIgaW50IHN0YXRlID0gZmJwLT5zdGF0ZVtESVJfRU5DUllQVC0xXTsKKworICAgIGlmIChjbnQtLSA8IDEpCisgICAgICAgIGdvdG8gZmFpbHVyZTsKKworICAgIHN3aXRjaCAoKmRhdGErKykgeworICAgIGNhc2UgRkI2NF9JVl9PSzoKKyAgICAgICAgY2FzdF9mYjY0X3N0cmVhbV9pdihmYnAtPnRlbXBfZmVlZCwgJmZicC0+c3RyZWFtc1tESVJfRU5DUllQVC0xXSk7CisgICAgICAgIGlmIChzdGF0ZSA9PSBjRkFJTEVEKQorICAgICAgICAgICAgc3RhdGUgPSBJTl9QUk9HUkVTUzsKKyAgICAgICAgc3RhdGUgJj0gfk5PX1JFQ1ZfSVY7CisgICAgICAgIGVuY3J5cHRfc2VuZF9rZXlpZChESVJfRU5DUllQVCwgKHVuc2lnbmVkIGNoYXIgKikiXDAiLCAxLCAxKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZCNjRfSVZfQkFEOgorICAgICAgICBtZW1zZXQoZmJwLT50ZW1wX2ZlZWQsIDAsIHNpemVvZihCbG9jaykpOworICAgICAgICBjYXN0X2ZiNjRfc3RyZWFtX2l2KGZicC0+dGVtcF9mZWVkLCAmZmJwLT5zdHJlYW1zW0RJUl9FTkNSWVBULTFdKTsKKyAgICAgICAgc3RhdGUgPSBjRkFJTEVEOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisjaWYgMAorICAgICAgICBpZiAoZW5jcnlwdF9kZWJ1Z19tb2RlKSB7CisgICAgICAgICAgICBwcmludGYoIlVua25vd24gb3B0aW9uIHR5cGU6ICVkXHJcbiIsIGRhdGFbLTFdKTsKKyAgICAgICAgICAgIHByaW50ZChkYXRhLCBjbnQpOworICAgICAgICAgICAgcHJpbnRmKCJcclxuIik7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKyAgICAgIGZhaWx1cmU6CisgICAgICAgIHN0YXRlID0gY0ZBSUxFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybihmYnAtPnN0YXRlW0RJUl9FTkNSWVBULTFdID0gc3RhdGUpOworfQorCisjaWZuZGVmIENBU1RfRVhQT1JUX0VOQ1JZUFRJT04KK2ludAorY2FzdF9jZmI2NF9zZXNzaW9uKGtleSwgc2VydmVyKQorICAgIFNlc3Npb25fS2V5ICprZXk7CisgICAgaW50IHNlcnZlcjsKK3sKKyAgICByZXR1cm4oY2FzdF9mYjY0X3Nlc3Npb24oa2V5LCBzZXJ2ZXIsICZjYXN0X2ZiW0NGQl8xMjhdLCAxKSk7Cit9CisKK2ludAorY2FzdF9vZmI2NF9zZXNzaW9uKGtleSwgc2VydmVyKQorICAgIFNlc3Npb25fS2V5ICprZXk7CisgICAgaW50IHNlcnZlcjsKK3sKKyAgICByZXR1cm4oY2FzdF9mYjY0X3Nlc3Npb24oa2V5LCBzZXJ2ZXIsICZjYXN0X2ZiW09GQl8xMjhdLCAxKSk7Cit9CisjZW5kaWYKKworaW50CitjYXN0ZXhwX2NmYjY0X3Nlc3Npb24oa2V5LCBzZXJ2ZXIpCisgICAgU2Vzc2lvbl9LZXkgKmtleTsKKyAgICBpbnQgc2VydmVyOworeworICAgIHJldHVybihjYXN0X2ZiNjRfc2Vzc2lvbihrZXksIHNlcnZlciwgJmNhc3RfZmJbQ0ZCXzQwXSwgMCkpOworfQorCitpbnQKK2Nhc3RleHBfb2ZiNjRfc2Vzc2lvbihrZXksIHNlcnZlcikKKyAgICBTZXNzaW9uX0tleSAqa2V5OworICAgIGludCBzZXJ2ZXI7Cit7CisgICAgcmV0dXJuKGNhc3RfZmI2NF9zZXNzaW9uKGtleSwgc2VydmVyLCAmY2FzdF9mYltPRkJfNDBdLCAwKSk7Cit9CisKKyNkZWZpbmUgQ0FTVDEyOF9LRVlMRU4gIDE2ICAgICAgLyogMTI4IGJpdHMgKi8KKyNkZWZpbmUgQ0FTVDVfNDBfS0VZTEVOICA1ICAgICAgLyogIDQwIGJpdHMgKi8KKworc3RhdGljIGludAorY2FzdF9mYjY0X3Nlc3Npb24oa2V5LCBzZXJ2ZXIsIGZicCwgZnMpCisgICAgU2Vzc2lvbl9LZXkgKmtleTsKKyAgICBpbnQgc2VydmVyOworICAgIHN0cnVjdCBjYXN0X2ZiICpmYnA7CisgICAgaW50IGZzOworeworICAgIGludCBrbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKiBrcHRyOworCisgICAgaWYoZnMpCisgICAgICAgIGtsZW4gPSBDQVNUMTI4X0tFWUxFTjsKKyAgICBlbHNlCisgICAgICAgIGtsZW4gPSBDQVNUNV80MF9LRVlMRU47CisKKyAgICBpZiAoIWtleSB8fCBrZXktPmxlbmd0aCA8IGtsZW4pIHsKKyAgICAgICAgQ0hBUiBidWZbODBdOworICAgICAgICBzcHJpbnRmKGJ1ZiwiQ2FuJ3Qgc2V0IENBU1Qgc2Vzc2lvbiBrZXkgKCVkIDwgJWQpIiwKKyAgICAgICAgICAgICAgICBrZXkgPyBrZXktPmxlbmd0aCA6IDAsIGtsZW4pOyAgICAgICAgICAgICAgICAgICAvKiBzYWZlICovCisjaWZkZWYgREVCVUcKKyAgICAgICAgaWYgKGVuY3J5cHRfZGVidWdfbW9kZSkKKyAgICAgICAgICAgIHByaW50ZigiJXNcclxuIixidWYpOworI2VuZGlmCisgICAgICAgIGRlYnVnKEYxMTAsImNhc3RfZmI2NF9zZXNzaW9uIixidWYsMCk7CisgICAgICAgIHJldHVybihjRkFJTEVEKTsKKyAgICB9CisgICAgaWYoa2V5LT5sZW5ndGggPCAyICoga2xlbikKKyAgICAgICAga3B0ciA9IGtleS0+ZGF0YTsKKyAgICBlbHNlCisgICAgICAgIGtwdHIgPSBrZXktPmRhdGEgKyBrbGVuOworCisgICAgaWYoc2VydmVyKSB7CisgICAgICAgIGNhc3RfZmI2NF9zdHJlYW1fa2V5KGtwdHIsICZmYnAtPnN0cmVhbXNbRElSX0VOQ1JZUFQtMV0sIGZzKTsKKyAgICAgICAgY2FzdF9mYjY0X3N0cmVhbV9rZXkoa2V5LT5kYXRhLCAmZmJwLT5zdHJlYW1zW0RJUl9ERUNSWVBULTFdLCBmcyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjYXN0X2ZiNjRfc3RyZWFtX2tleShrcHRyLCAmZmJwLT5zdHJlYW1zW0RJUl9ERUNSWVBULTFdLCBmcyk7CisgICAgICAgIGNhc3RfZmI2NF9zdHJlYW1fa2V5KGtleS0+ZGF0YSwgJmZicC0+c3RyZWFtc1tESVJfRU5DUllQVC0xXSwgZnMpOworICAgIH0KKworICAgIC8qIFN0dWZmIGxlZnRvdmVycyBpbnRvIHRoZSBmZWVkICovCisgICAgaWYoa2V5LT5sZW5ndGggPj0gMiAqIGtsZW4gKyBzaXplb2YoQmxvY2spKQorICAgICAgICBtZW1jcHkoZmJwLT50ZW1wX2ZlZWQsIGtleS0+ZGF0YSArIDIgKiBrbGVuLCBzaXplb2YoQmxvY2spKTsKKyAgICBlbHNlIHsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIC8qIFRoaXMgaXMgYSBiZXR0ZXIgd2F5IG9mIGVyYXNpbmcgdGhlIHBhc3N3b3JkICovCisgICAgICAgIC8qIGJ1dCB3ZSBkbyBub3Qgd2FudCB0byBsaW5rIGluIGxpYnNycCAgICAgICAgICovCisgICAgICAgIHRfcmFuZG9tKGZicC0+dGVtcF9mZWVkLCBzaXplb2YoQmxvY2spKTsKKyNlbHNlCisgICAgICAgIG1lbXNldChmYnAtPnRlbXBfZmVlZCwgMCwgc2l6ZW9mKEJsb2NrKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBmYnAtPmtleV9pc3NldCA9IDE7CisgICAgLyoKKyAgICAqIE5vdyBsb29rIHRvIHNlZSBpZiBjYXN0X2ZiNjRfc3RhcnQoKSB3YXMgd2FzIHdhaXRpbmcgZm9yCisgICAgKiB0aGUga2V5IHRvIHNob3cgdXAuICBJZiBzbywgZ28gYWhlYWQgYW4gY2FsbCBpdCBub3cKKyAgICAqIHRoYXQgd2UgaGF2ZSB0aGUga2V5LgorICAgICovCisgICAgaWYgKGZicC0+bmVlZF9zdGFydCkgeworICAgICAgICBmYnAtPm5lZWRfc3RhcnQgPSAwOworICAgICAgICBjYXN0X2ZiNjRfc3RhcnQoZmJwLCBESVJfRU5DUllQVCwgc2VydmVyKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisvKgorICogV2Ugb25seSBhY2NlcHQgYSBrZXlpZCBvZiAwLiAgSWYgd2UgZ2V0IGEga2V5aWQgb2YKKyAqIDAsIHRoZW4gbWFyayB0aGUgc3RhdGUgYXMgU1VDQ0VTUy4KKyAqLworI2lmbmRlZiBDQVNUX0VYUE9SVF9FTkNSWVBUSU9OCitpbnQKK2Nhc3RfY2ZiNjRfa2V5aWQoZGlyLCBrcCwgbGVucCkKKyAgICBpbnQgZGlyLCAqbGVucDsKKyAgICB1bnNpZ25lZCBjaGFyICprcDsKK3sKKyAgICByZXR1cm4oY2FzdF9mYjY0X2tleWlkKGRpciwga3AsIGxlbnAsICZjYXN0X2ZiW0NGQl8xMjhdKSk7Cit9CisKK2ludAorY2FzdF9vZmI2NF9rZXlpZChkaXIsIGtwLCBsZW5wKQorICAgIGludCBkaXIsICpsZW5wOworICAgIHVuc2lnbmVkIGNoYXIgKmtwOworeworICAgIHJldHVybihjYXN0X2ZiNjRfa2V5aWQoZGlyLCBrcCwgbGVucCwgJmNhc3RfZmJbT0ZCXzEyOF0pKTsKK30KKyNlbmRpZgorCitpbnQKK2Nhc3RleHBfY2ZiNjRfa2V5aWQoZGlyLCBrcCwgbGVucCkKKyAgICBpbnQgZGlyLCAqbGVucDsKKyAgICB1bnNpZ25lZCBjaGFyICprcDsKK3sKKyAgICByZXR1cm4oY2FzdF9mYjY0X2tleWlkKGRpciwga3AsIGxlbnAsICZjYXN0X2ZiW0NGQl80MF0pKTsKK30KKworaW50CitjYXN0ZXhwX29mYjY0X2tleWlkKGRpciwga3AsIGxlbnApCisgICAgaW50IGRpciwgKmxlbnA7CisgICAgdW5zaWduZWQgY2hhciAqa3A7Cit7CisgICAgcmV0dXJuKGNhc3RfZmI2NF9rZXlpZChkaXIsIGtwLCBsZW5wLCAmY2FzdF9mYltPRkJfNDBdKSk7Cit9CisKK3N0YXRpYyBpbnQKK2Nhc3RfZmI2NF9rZXlpZChkaXIsIGtwLCBsZW5wLCBmYnApCisgICAgaW50IGRpciwgKmxlbnA7CisgICAgdW5zaWduZWQgY2hhciAqa3A7CisgICAgc3RydWN0IGNhc3RfZmIgKmZicDsKK3sKKyAgICByZWdpc3RlciBpbnQgc3RhdGUgPSBmYnAtPnN0YXRlW2Rpci0xXTsKKworICAgIGlmICgqbGVucCAhPSAxIHx8ICgqa3AgIT0gJ1wwJykpIHsKKyAgICAgICAgKmxlbnAgPSAwOworICAgICAgICByZXR1cm4oc3RhdGUpOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBjRkFJTEVEKQorICAgICAgICBzdGF0ZSA9IElOX1BST0dSRVNTOworCisgICAgc3RhdGUgJj0gfk5PX0tFWUlEOworCisgICAgcmV0dXJuKGZicC0+c3RhdGVbZGlyLTFdID0gc3RhdGUpOworfQorCitzdGF0aWMgdm9pZAorY2FzdF9mYjY0X3ByaW50c3ViKGRhdGEsIGNudCwgYnVmLCBidWZsZW4sIHR5cGUpCisgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgKmJ1ZiwgKnR5cGU7CisgICAgaW50IGNudCwgYnVmbGVuOworeworICAgIGNoYXIgbGJ1Zls2NF07CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgY2hhciAqY3A7CisKKyAgICBidWZbYnVmbGVuLTFdID0gJ1wwJzsgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgaXQncyBOVUxMIHRlcm1pbmF0ZWQgKi8KKyAgICBidWZsZW4gLT0gMTsKKworICAgIHN3aXRjaChkYXRhWzJdKSB7CisgICAgY2FzZSBGQjY0X0lWOgorICAgICAgICBzcHJpbnRmKGxidWYsICIlc19JViIsIHR5cGUpOworICAgICAgICBjcCA9IGxidWY7CisgICAgICAgIGdvdG8gY29tbW9uOworCisgICAgY2FzZSBGQjY0X0lWX09LOgorICAgICAgICBzcHJpbnRmKGxidWYsICIlc19JVl9PSyIsIHR5cGUpOworICAgICAgICBjcCA9IGxidWY7CisgICAgICAgIGdvdG8gY29tbW9uOworCisgICAgY2FzZSBGQjY0X0lWX0JBRDoKKyAgICAgICAgc3ByaW50ZihsYnVmLCAiJXNfSVZfQkFEIiwgdHlwZSk7CisgICAgICAgIGNwID0gbGJ1ZjsKKyAgICAgICAgZ290byBjb21tb247CisKKyAgICBkZWZhdWx0OgorICAgICAgICBzcHJpbnRmKGxidWYsICIgJWQgKHVua25vd24pIiwgZGF0YVsyXSk7CisgICAgICAgIGNwID0gbGJ1ZjsKKyAgICAgIGNvbW1vbjoKKyAgICAgICAgZm9yICg7IChidWZsZW4gPiAwKSAmJiAoKmJ1ZiA9ICpjcCsrKTsgYnVmKyspCisgICAgICAgICAgICBidWZsZW4tLTsKKyAgICAgICAgZm9yIChpID0gMzsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgICAgICBzcHJpbnRmKGxidWYsICIgJWQiLCBkYXRhW2ldKTsKKyAgICAgICAgICAgIGZvciAoY3AgPSBsYnVmOyAoYnVmbGVuID4gMCkgJiYgKCpidWYgPSAqY3ArKyk7IGJ1ZisrKQorICAgICAgICAgICAgICAgIGJ1Zmxlbi0tOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZAorY2FzdF9jZmI2NF9wcmludHN1YihkYXRhLCBjbnQsIGJ1ZiwgYnVmbGVuKQorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsICpidWY7CisgICAgaW50IGNudCwgYnVmbGVuOworeworICAgIGNhc3RfZmI2NF9wcmludHN1YihkYXRhLCBjbnQsIGJ1ZiwgYnVmbGVuLCAiQ0ZCNjQiKTsKK30KKwordm9pZAorY2FzdF9vZmI2NF9wcmludHN1YihkYXRhLCBjbnQsIGJ1ZiwgYnVmbGVuKQorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsICpidWY7CisgICAgaW50IGNudCwgYnVmbGVuOworeworICAgIGNhc3RfZmI2NF9wcmludHN1YihkYXRhLCBjbnQsIGJ1ZiwgYnVmbGVuLCAiT0ZCNjQiKTsKK30KKworc3RhdGljIHZvaWQKK2Nhc3RfZmI2NF9zdHJlYW1faXYoc2VlZCwgc3RwKQorICAgIEJsb2NrIHNlZWQ7CisgICAgcmVnaXN0ZXIgc3RydWN0IGNhc3Rfc3RpbmZvICpzdHA7Cit7CisgICAgbWVtY3B5KCh2b2lkICopc3RwLT5zdHJfaXYsICh2b2lkICopc2VlZCwgc2l6ZW9mKEJsb2NrKSk7CisgICAgbWVtY3B5KCh2b2lkICopc3RwLT5zdHJfb3V0cHV0LCAodm9pZCAqKXNlZWQsIHNpemVvZihCbG9jaykpOworCisgICAgc3RwLT5zdHJfaW5kZXggPSBzaXplb2YoQmxvY2spOworfQorCitzdGF0aWMgdm9pZAorY2FzdF9mYjY0X3N0cmVhbV9rZXkoa2V5LCBzdHAsIGZzKQorICAgIHVuc2lnbmVkIGNoYXIgKiBrZXk7CisgICAgcmVnaXN0ZXIgc3RydWN0IGNhc3Rfc3RpbmZvICpzdHA7CisgICAgaW50IGZzOworeworI2lmbmRlZiBDQVNUX0VYUE9SVF9FTkNSWVBUSU9OCisgICAgaWYoZnMpCisgICAgICAgIGNrX2Nhc3QxMjhfa2V5X3NjaGVkKCZzdHAtPnN0cl9zY2hlZCwga2V5KTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgY2tfY2FzdDVfNDBfa2V5X3NjaGVkKCZzdHAtPnN0cl9zY2hlZCwga2V5KTsKKworICAgIG1lbWNweSgodm9pZCAqKXN0cC0+c3RyX291dHB1dCwgKHZvaWQgKilzdHAtPnN0cl9pdiwgc2l6ZW9mKEJsb2NrKSk7CisKKyAgICBzdHAtPnN0cl9pbmRleCA9IHNpemVvZihCbG9jayk7Cit9CisKKy8qCisgKiBDQVNUIDY0IGJpdCBDaXBoZXIgRmVlZGJhY2sKKyAqCisgKiAgICAga2V5IC0tLT4rLS0tLS0tKworICogICAgICAgICAgKy0+fCBDQVNUIHwtLSsKKyAqICAgICAgICAgIHwgICstLS0tLS0rICB8CisgKiAgICAgICAgICB8ICAgICAgICAgICAgdgorICogIElOUFVUIC0tKC0tLS0tLS0tLS0+KCspKy0tLT4gREFUQQorICogICAgICAgICAgfCAgICAgICAgICAgICAgfAorICogICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKworICoKKyAqCisgKiBHaXZlbjoKKyAqICAgICAgaVY6IEluaXRpYWwgdmVjdG9yLCA2NCBiaXRzICg4IGJ5dGVzKSBsb25nLgorICogICAgICBEbjogdGhlIG50aCBjaHVuayBvZiA2NCBiaXRzICg4IGJ5dGVzKSBvZiBkYXRhIHRvIGVuY3J5cHQgKGRlY3J5cHQpLgorICogICAgICBPbjogdGhlIG50aCBjaHVuayBvZiA2NCBiaXRzICg4IGJ5dGVzKSBvZiBlbmNyeXB0ZWQgKGRlY3J5cHRlZCkgb3V0cHV0LgorICoKKyAqICAgICAgVjAgPSBDQVNUKGlWLCBrZXkpCisgKiAgICAgIE9uID0gRG4gXiBWbgorICogICAgICBWKG4rMSkgPSBDQVNUKE9uLCBrZXkpCisgKi8KKyNpZm5kZWYgQ0FTVF9FWFBPUlRfRU5DUllQVElPTgordm9pZAorY2FzdF9jZmI2NF9lbmNyeXB0KHMsIGMpCisgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnM7CisgICAgICAgIGludCBjOworeworICAgIF9jYXN0X2NmYjY0X2VuY3J5cHQocywgYywgJmNhc3RfZmJbQ0ZCXzEyOF0uc3RyZWFtc1tESVJfRU5DUllQVC0xXSk7Cit9CisjZW5kaWYKKwordm9pZAorY2FzdGV4cF9jZmI2NF9lbmNyeXB0KHMsIGMpCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqczsKKyAgICBpbnQgYzsKK3sKKyAgICBfY2FzdF9jZmI2NF9lbmNyeXB0KHMsIGMsICZjYXN0X2ZiW0NGQl80MF0uc3RyZWFtc1tESVJfRU5DUllQVC0xXSk7Cit9CisKK3N0YXRpYyB2b2lkCitfY2FzdF9jZmI2NF9lbmNyeXB0KHMsIGMsIHN0cCkKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzOworICAgIGludCBjOworICAgIHJlZ2lzdGVyIHN0cnVjdCBjYXN0X3N0aW5mbyAqc3RwOworeworICAgIHJlZ2lzdGVyIGludCBpbmRleDsKKworICAgIGluZGV4ID0gc3RwLT5zdHJfaW5kZXg7CisgICAgd2hpbGUgKGMtLSA+IDApIHsKKyAgICAgICAgaWYgKGluZGV4ID09IHNpemVvZihCbG9jaykpIHsKKyAgICAgICAgICAgIEJsb2NrIGI7CisgICAgICAgICAgICBja19jYXN0X2VjYl9lbmNyeXB0KGIsIHN0cC0+c3RyX291dHB1dCwgJnN0cC0+c3RyX3NjaGVkLCAwKTsKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXN0cC0+c3RyX2ZlZWQsICh2b2lkICopYiwgc2l6ZW9mKEJsb2NrKSk7CisgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBPbiBlbmNyeXB0aW9uLCB3ZSBzdG9yZSAoZmVlZCBeIGRhdGEpIHdoaWNoIGlzIGN5cGhlciAqLworICAgICAgICAqcyA9IHN0cC0+c3RyX291dHB1dFtpbmRleF0gPSAoc3RwLT5zdHJfZmVlZFtpbmRleF0gXiAqcyk7CisgICAgICAgIHMrKzsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgc3RwLT5zdHJfaW5kZXggPSBpbmRleDsKK30KKworI2lmbmRlZiBDQVNUX0VYUE9SVF9FTkNSWVBUSU9OCitpbnQKK2Nhc3RfY2ZiNjRfZGVjcnlwdChkYXRhKQorICAgIGludCBkYXRhOworeworICAgIHJldHVybiBfY2FzdF9jZmI2NF9kZWNyeXB0KGRhdGEsICZjYXN0X2ZiW0NGQl8xMjhdLnN0cmVhbXNbRElSX0RFQ1JZUFQtMV0pOworfQorI2VuZGlmCisKK2ludAorY2FzdGV4cF9jZmI2NF9kZWNyeXB0KGRhdGEpCisgICAgaW50IGRhdGE7Cit7CisgICAgcmV0dXJuIF9jYXN0X2NmYjY0X2RlY3J5cHQoZGF0YSwgJmNhc3RfZmJbQ0ZCXzQwXS5zdHJlYW1zW0RJUl9ERUNSWVBULTFdKTsKK30KKworc3RhdGljIGludAorX2Nhc3RfY2ZiNjRfZGVjcnlwdChkYXRhLCBzdHApCisgICAgaW50IGRhdGE7CisgICAgcmVnaXN0ZXIgc3RydWN0IGNhc3Rfc3RpbmZvICpzdHA7Cit7CisgICAgaW50IGluZGV4OworCisgICAgaWYgKGRhdGEgPT0gLTEpIHsKKyAgICAgICAgLyoKKyAgICAgICAgKiBCYWNrIHVwIG9uZSBieXRlLiAgSXQgaXMgYXNzdW1lZCB0aGF0IHdlIHdpbGwKKyAgICAgICAgKiBuZXZlciBiYWNrIHVwIG1vcmUgdGhhbiBvbmUgYnl0ZS4gIElmIHdlIGRvLCB0aGlzCisgICAgICAgICogbWF5IG9yIG1heSBub3Qgd29yay4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHN0cC0+c3RyX2luZGV4KQorICAgICAgICAgICAgLS1zdHAtPnN0cl9pbmRleDsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIGluZGV4ID0gc3RwLT5zdHJfaW5kZXgrKzsKKyAgICBpZiAoaW5kZXggPT0gc2l6ZW9mKEJsb2NrKSkgeworICAgICAgICBCbG9jayBiOworICAgICAgICBja19jYXN0X2VjYl9lbmNyeXB0KGIsIHN0cC0+c3RyX291dHB1dCwgJnN0cC0+c3RyX3NjaGVkLCAwKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopc3RwLT5zdHJfZmVlZCwgKHZvaWQgKiliLCBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgc3RwLT5zdHJfaW5kZXggPSAxOyAgICAgLyogTmV4dCB0aW1lIHdpbGwgYmUgMSAqLworICAgICAgICBpbmRleCA9IDA7ICAgICAgICAgICAgICAvKiBCdXQgbm93IHVzZSAwICovCisgICAgfQorCisgICAgLyogT24gZGVjcnlwdGlvbiB3ZSBzdG9yZSAoZGF0YSkgd2hpY2ggaXMgY3lwaGVyLiAqLworICAgIHN0cC0+c3RyX291dHB1dFtpbmRleF0gPSBkYXRhOworICAgIHJldHVybihkYXRhIF4gc3RwLT5zdHJfZmVlZFtpbmRleF0pOworfQorCisvKgorICogQ0FTVCA2NCBiaXQgT3V0cHV0IEZlZWRiYWNrCisgKgorICoga2V5IC0tLT4rLS0tLS0tKworICogICAgICArLT58IENBU1QgfC0tKworICogICAgICB8ICArLS0tLS0tKyAgfAorICogICAgICArLS0tLS0tLS0tLS0tKworICogICAgICAgICAgICAgICAgICAgdgorICogIElOUFVUIC0tLS0tLS0tLT4oKykgLS0tLT4gREFUQQorICoKKyAqIEdpdmVuOgorICogICAgICBpVjogSW5pdGlhbCB2ZWN0b3IsIDY0IGJpdHMgKDggYnl0ZXMpIGxvbmcuCisgKiAgICAgIERuOiB0aGUgbnRoIGNodW5rIG9mIDY0IGJpdHMgKDggYnl0ZXMpIG9mIGRhdGEgdG8gZW5jcnlwdCAoZGVjcnlwdCkuCisgKiAgICAgIE9uOiB0aGUgbnRoIGNodW5rIG9mIDY0IGJpdHMgKDggYnl0ZXMpIG9mIGVuY3J5cHRlZCAoZGVjcnlwdGVkKSBvdXRwdXQuCisgKgorICogICAgICBWMCA9IENBU1QoaVYsIGtleSkKKyAqICAgICAgVihuKzEpID0gQ0FTVChWbiwga2V5KQorICogICAgICBPbiA9IERuIF4gVm4KKyAqLworI2lmbmRlZiBDQVNUX0VYUE9SVF9FTkNSWVBUSU9OCit2b2lkCitjYXN0X29mYjY0X2VuY3J5cHQocywgYykKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzOworICAgIGludCBjOworeworICAgIF9jYXN0X29mYjY0X2VuY3J5cHQocywgYywgJmNhc3RfZmJbT0ZCXzEyOF0uc3RyZWFtc1tESVJfRU5DUllQVC0xXSk7Cit9CisjZW5kaWYKKwordm9pZAorY2FzdGV4cF9vZmI2NF9lbmNyeXB0KHMsIGMpCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqczsKKyAgICBpbnQgYzsKK3sKKyAgX2Nhc3Rfb2ZiNjRfZW5jcnlwdChzLCBjLCAmY2FzdF9mYltPRkJfNDBdLnN0cmVhbXNbRElSX0VOQ1JZUFQtMV0pOworfQorCitzdGF0aWMgdm9pZAorX2Nhc3Rfb2ZiNjRfZW5jcnlwdChzLCBjLCBzdHApCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqczsKKyAgICBpbnQgYzsKKyAgICByZWdpc3RlciBzdHJ1Y3QgY2FzdF9zdGluZm8gKnN0cDsKK3sKKyAgICByZWdpc3RlciBpbnQgaW5kZXg7CisKKyAgICBpbmRleCA9IHN0cC0+c3RyX2luZGV4OworICAgIHdoaWxlIChjLS0gPiAwKSB7CisgICAgICAgIGlmIChpbmRleCA9PSBzaXplb2YoQmxvY2spKSB7CisgICAgICAgICAgICBCbG9jayBiOworICAgICAgICAgICAgY2tfY2FzdF9lY2JfZW5jcnlwdChiLCBzdHAtPnN0cl9mZWVkLCAmc3RwLT5zdHJfc2NoZWQsIDApOworICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopc3RwLT5zdHJfZmVlZCwgKHZvaWQgKiliLCBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgfQorICAgICAgICAqcysrIF49IHN0cC0+c3RyX2ZlZWRbaW5kZXhdOworICAgICAgICBpbmRleCsrOworICAgIH0KKyAgICBzdHAtPnN0cl9pbmRleCA9IGluZGV4OworfQorCisjaWZuZGVmIENBU1RfRVhQT1JUX0VOQ1JZUFRJT04KK2ludAorY2FzdF9vZmI2NF9kZWNyeXB0KGRhdGEpCisgICAgaW50IGRhdGE7Cit7CisgICAgcmV0dXJuIF9jYXN0X29mYjY0X2RlY3J5cHQoZGF0YSwgJmNhc3RfZmJbT0ZCXzEyOF0uc3RyZWFtc1tESVJfREVDUllQVC0xXSk7Cit9CisjZW5kaWYKKworaW50CitjYXN0ZXhwX29mYjY0X2RlY3J5cHQoZGF0YSkKKyAgICBpbnQgZGF0YTsKK3sKKyAgICByZXR1cm4gX2Nhc3Rfb2ZiNjRfZGVjcnlwdChkYXRhLCAmY2FzdF9mYltPRkJfNDBdLnN0cmVhbXNbRElSX0RFQ1JZUFQtMV0pOworfQorCitzdGF0aWMgaW50CitfY2FzdF9vZmI2NF9kZWNyeXB0KGRhdGEsIHN0cCkKKyAgICBpbnQgZGF0YTsKKyAgICByZWdpc3RlciBzdHJ1Y3QgY2FzdF9zdGluZm8gKnN0cDsKK3sKKyAgICBpbnQgaW5kZXg7CisKKyAgICBpZiAoZGF0YSA9PSAtMSkgeworICAgICAgICAvKgorICAgICAgICAqIEJhY2sgdXAgb25lIGJ5dGUuICBJdCBpcyBhc3N1bWVkIHRoYXQgd2Ugd2lsbAorICAgICAgICAqIG5ldmVyIGJhY2sgdXAgbW9yZSB0aGFuIG9uZSBieXRlLiAgSWYgd2UgZG8sIHRoaXMKKyAgICAgICAgKiBtYXkgb3IgbWF5IG5vdCB3b3JrLgorICAgICAgICAqLworICAgICAgICBpZiAoc3RwLT5zdHJfaW5kZXgpCisgICAgICAgICAgICAtLXN0cC0+c3RyX2luZGV4OworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgaW5kZXggPSBzdHAtPnN0cl9pbmRleCsrOworICAgIGlmIChpbmRleCA9PSBzaXplb2YoQmxvY2spKSB7CisgICAgICAgIEJsb2NrIGI7CisgICAgICAgIGNrX2Nhc3RfZWNiX2VuY3J5cHQoYiwgc3RwLT5zdHJfZmVlZCwgJnN0cC0+c3RyX3NjaGVkLCAwKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopc3RwLT5zdHJfZmVlZCwgKHZvaWQgKiliLCBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgc3RwLT5zdHJfaW5kZXggPSAxOyAgICAgLyogTmV4dCB0aW1lIHdpbGwgYmUgMSAqLworICAgICAgICBpbmRleCA9IDA7ICAgICAgICAgICAgICAvKiBCdXQgbm93IHVzZSAwICovCisgICAgfQorCisgICAgcmV0dXJuKGRhdGEgXiBzdHAtPnN0cl9mZWVkW2luZGV4XSk7Cit9CisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgU3RhbmZvcmQgVW5pdmVyc2l0eQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgU1RBTkZPUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwKKyAqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorICogUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBBUklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogY2FzdC5jCisgKiBBdXRob3I6IFRvbSBXdQorICoKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDQVNULTEyOCBlbmNyeXB0aW9uIGFsZ29yaXRobSwgYXMKKyAqIHNwZWNpZmllZCBpbiBSRkMgMjE0NC4KKyAqLworCisvKiBUaGUgZmlyc3QgZm91ciBTLWJveGVzIGFyZSBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uICovCisKK3N0YXRpYyB1aW50MzIgUzFbXSA9IHsKKyAgMHgzMGZiNDBkNCwgMHg5ZmEwZmYwYiwgMHg2YmVjY2QyZiwgMHgzZjI1OGM3YSwgMHgxZTIxM2YyZiwgMHg5YzAwNGRkMywKKyAgMHg2MDAzZTU0MCwgMHhjZjlmYzk0OSwgMHhiZmQ0YWYyNywgMHg4OGJiYmRiNSwgMHhlMjAzNDA5MCwgMHg5OGQwOTY3NSwKKyAgMHg2ZTYzYTBlMCwgMHgxNWMzNjFkMiwgMHhjMmU3NjYxZCwgMHgyMmQ0ZmY4ZSwgMHgyODY4M2I2ZiwgMHhjMDdmZDA1OSwKKyAgMHhmZjIzNzljOCwgMHg3NzVmNTBlMiwgMHg0M2MzNDBkMywgMHhkZjJmODY1NiwgMHg4ODdjYTQxYSwgMHhhMmQyYmQyZCwKKyAgMHhhMWM5ZTBkNiwgMHgzNDZjNDgxOSwgMHg2MWI3NmQ4NywgMHgyMjU0MGYyZiwgMHgyYWJlMzJlMSwgMHhhYTU0MTY2YiwKKyAgMHgyMjU2OGUzYSwgMHhhMmQzNDFkMCwgMHg2NmRiNDBjOCwgMHhhNzg0MzkyZiwgMHgwMDRkZmYyZiwgMHgyZGI5ZDJkZSwKKyAgMHg5Nzk0M2ZhYywgMHg0YTk3YzFkOCwgMHg1Mjc2NDRiNywgMHhiNWY0MzdhNywgMHhiODJjYmFlZiwgMHhkNzUxZDE1OSwKKyAgMHg2ZmY3ZjBlZCwgMHg1YTA5N2ExZiwgMHg4MjdiNjhkMCwgMHg5MGVjZjUyZSwgMHgyMmIwYzA1NCwgMHhiYzhlNTkzNSwKKyAgMHg0YjZkMmY3ZiwgMHg1MGJiNjRhMiwgMHhkMjY2NDkxMCwgMHhiZWU1ODEyZCwgMHhiNzMzMjI5MCwgMHhlOTNiMTU5ZiwKKyAgMHhiNDhlZTQxMSwgMHg0YmZmMzQ1ZCwgMHhmZDQ1YzI0MCwgMHhhZDMxOTczZiwgMHhjNGY2ZDAyZSwgMHg1NWZjODE2NSwKKyAgMHhkNWIxY2FhZCwgMHhhMWFjMmRhZSwgMHhhMmQ0Yjc2ZCwgMHhjMTliMGM1MCwgMHg4ODIyNDBmMiwgMHgwYzZlNGYzOCwKKyAgMHhhNGU0YmZkNywgMHg0ZjViYTI3MiwgMHg1NjRjMWQyZiwgMHhjNTljNTMxOSwgMHhiOTQ5ZTM1NCwgMHhiMDQ2NjlmZSwKKyAgMHhiMWI2YWI4YSwgMHhjNzEzNThkZCwgMHg2Mzg1YzU0NSwgMHgxMTBmOTM1ZCwgMHg1NzUzOGFkNSwgMHg2YTM5MDQ5MywKKyAgMHhlNjNkMzdlMCwgMHgyYTU0ZjZiMywgMHgzYTc4N2Q1ZiwgMHg2Mjc2YTBiNSwgMHgxOWE2ZmNkZiwgMHg3YTQyMjA2YSwKKyAgMHgyOWY5ZDRkNSwgMHhmNjFiMTg5MSwgMHhiYjcyMjc1ZSwgMHhhYTUwODE2NywgMHgzODkwMTA5MSwgMHhjNmI1MDVlYiwKKyAgMHg4NGM3Y2I4YywgMHgyYWQ3NWEwZiwgMHg4NzRhMTQyNywgMHhhMmQxOTM2YiwgMHgyYWQyODZhZiwgMHhhYTU2ZDI5MSwKKyAgMHhkNzg5NDM2MCwgMHg0MjVjNzUwZCwgMHg5M2IzOWUyNiwgMHgxODcxODRjOSwgMHg2YzAwYjMyZCwgMHg3M2UyYmIxNCwKKyAgMHhhMGJlYmMzYywgMHg1NDYyMzc3OSwgMHg2NDQ1OWVhYiwgMHgzZjMyOGI4MiwgMHg3NzE4Y2Y4MiwgMHg1OWEyY2VhNiwKKyAgMHgwNGVlMDAyZSwgMHg4OWZlNzhlNiwgMHgzZmFiMDk1MCwgMHgzMjVmZjZjMiwgMHg4MTM4M2YwNSwgMHg2OTYzYzVjOCwKKyAgMHg3NmNiNWFkNiwgMHhkNDk5NzRjOSwgMHhjYTE4MGRjZiwgMHgzODA3ODJkNSwgMHhjN2ZhNWNmNiwgMHg4YWMzMTUxMSwKKyAgMHgzNWU3OWUxMywgMHg0N2RhOTFkMCwgMHhmNDBmOTA4NiwgMHhhN2UyNDE5ZSwgMHgzMTM2NjI0MSwgMHgwNTFlZjQ5NSwKKyAgMHhhYTU3M2IwNCwgMHg0YTgwNWQ4ZCwgMHg1NDgzMDBkMCwgMHgwMDMyMmEzYywgMHhiZjY0Y2RkZiwgMHhiYTU3YTY4ZSwKKyAgMHg3NWM2MzcyYiwgMHg1MGFmZDM0MSwgMHhhN2MxMzI3NSwgMHg5MTVhMGJmNSwgMHg2YjU0YmZhYiwgMHgyYjBiMTQyNiwKKyAgMHhhYjRjYzlkNywgMHg0NDljY2Q4MiwgMHhmN2ZiZjI2NSwgMHhhYjg1YzVmMywgMHgxYjU1ZGI5NCwgMHhhYWQ0ZTMyNCwKKyAgMHhjZmE0YmQzZiwgMHgyZGVhYTNlMiwgMHg5ZTIwNGQwMiwgMHhjOGJkMjVhYywgMHhlYWRmNTViMywgMHhkNWJkOWU5OCwKKyAgMHhlMzEyMzFiMiwgMHgyYWQ1YWQ2YywgMHg5NTQzMjlkZSwgMHhhZGJlNDUyOCwgMHhkODcxMGY2OSwgMHhhYTUxYzkwZiwKKyAgMHhhYTc4NmJmNiwgMHgyMjUxM2YxZSwgMHhhYTUxYTc5YiwgMHgyYWQzNDRjYywweDdiNWE0MWYwLCAweGQzN2NmYmFkLAorICAweDFiMDY5NTA1LCAweDQxZWNlNDkxLCAweGI0YzMzMmU2LCAweDAzMjI2OGQ0LCAweGM5NjAwYWNjLCAweGNlMzg3ZTZkLAorICAweGJmNmJiMTZjLCAweDZhNzBmYjc4LCAweDBkMDNkOWM5LCAweGQ0ZGYzOWRlLCAweGUwMTA2M2RhLCAweDQ3MzZmNDY0LAorICAweDVhZDMyOGQ4LCAweGIzNDdjYzk2LCAweDc1YmIwZmMzLCAweDk4NTExYmZiLCAweDRmZmJjYzM1LCAweGI1OGJjZjZhLAorICAweGUxMWYwYWJjLCAweGJmYzVmZTRhLCAweGE3MGFlYzEwLCAweGFjMzk1NzBhLDB4M2YwNDQ0MmYsIDB4NjE4OGIxNTMsCisgIDB4ZTAzOTdhMmUsIDB4NTcyN2NiNzksIDB4OWNlYjQxOGYsIDB4MWNhY2Q2OGQsIDB4MmFkMzdjOTYsIDB4MDE3NWNiOWQsCisgIDB4YzY5ZGZmMDksIDB4Yzc1YjY1ZjAsIDB4ZDlkYjQwZDgsIDB4ZWMwZTc3NzksIDB4NDc0NGVhZDQsIDB4YjExYzMyNzQsCisgIDB4ZGQyNGNiOWUsIDB4N2UxYzU0YmQsIDB4ZjAxMTQ0ZjksIDB4ZDIyNDBlYjEsIDB4OTY3NWIzZmQsIDB4YTNhYzM3NTUsCisgIDB4ZDQ3YzI3YWYsIDB4NTFjODVmNGQsIDB4NTY5MDc1OTYsIDB4YTViYjE1ZTYsMHg1ODAzMDRmMCwgMHhjYTA0MmNmMSwKKyAgMHgwMTFhMzdlYSwgMHg4ZGJmYWFkYiwgMHgzNWJhM2U0YSwgMHgzNTI2ZmZhMCwgMHhjMzdiNGQwOSwgMHhiYzMwNmVkOSwKKyAgMHg5OGE1MjY2NiwgMHg1NjQ4ZjcyNSwgMHhmZjVlNTY5ZCwgMHgwY2VkNjNkMCwgMHg3YzYzYjJjZiwgMHg3MDBiNDVlMSwKKyAgMHhkNWVhNTBmMSwgMHg4NWE5Mjg3MiwgMHhhZjFmYmRhNywgMHhkNDIzNDg3MCwgMHhhNzg3MGJmMywgMHgyZDNiNGQ3OSwKKyAgMHg0MmUwNDE5OCwgMHgwY2QwZWRlNywgMHgyNjQ3MGRiOCwgMHhmODgxODE0YywweDQ3NGQ2YWQ3LCAweDdjMGM1ZTVjLAorICAweGQxMjMxOTU5LCAweDM4MWI3Mjk4LCAweGY1ZDJmNGRiLCAweGFiODM4NjUzLCAweDZlMmYxZTIzLCAweDgzNzE5YzllLAorICAweGJkOTFlMDQ2LCAweDlhNTY0NTZlLCAweGRjMzkyMDBjLCAweDIwYzhjNTcxLCAweDk2MmJkYTFjLCAweGUxZTY5NmZmLAorICAweGIxNDFhYjA4LCAweDdjY2E4OWI5LCAweDFhNjllNzgzLCAweDAyY2M0ODQzLCAweGEyZjdjNTc5LCAweDQyOWVmNDdkLAorICAweDQyN2IxNjljLCAweDVhYzlmMDQ5LCAweGRkOGYwZjAwLCAweDVjODE2NWJmCit9OworCitzdGF0aWMgdWludDMyIFMyW10gPSB7CisgIDB4MWYyMDEwOTQsIDB4ZWYwYmE3NWIsIDB4NjllM2NmN2UsIDB4MzkzZjQzODAsIDB4ZmU2MWNmN2EsIDB4ZWVjNTIwN2EsCisgIDB4NTU4ODljOTQsIDB4NzJmYzA2NTEsIDB4YWRhN2VmNzksIDB4NGUxZDcyMzUsIDB4ZDU1YTYzY2UsIDB4ZGUwNDM2YmEsCisgIDB4OTljNDMwZWYsIDB4NWYwYzA3OTQsIDB4MThkY2RiN2QsIDB4YTFkNmVmZjMsIDB4YTBiNTJmN2IsIDB4NTllODM2MDUsCisgIDB4ZWUxNWIwOTQsIDB4ZTlmZmQ5MDksIDB4ZGM0NDAwODYsIDB4ZWY5NDQ0NTksIDB4YmE4M2NjYjMsIDB4ZTBjM2NkZmIsCisgIDB4ZDFkYTQxODEsIDB4M2IwOTJhYjEsIDB4Zjk5N2YxYzEsIDB4YTVlNmNmN2IsIDB4MDE0MjBkZGIsIDB4ZTRlN2VmNWIsCisgIDB4MjVhMWZmNDEsIDB4ZTE4MGY4MDYsIDB4MWZjNDEwODAsIDB4MTc5YmVlN2EsIDB4ZDM3YWM2YTksIDB4ZmU1ODMwYTQsCisgIDB4OThkZThiN2YsIDB4NzdlODNmNGUsIDB4Nzk5MjkyNjksIDB4MjRmYTlmN2IsIDB4ZTExM2M4NWIsIDB4YWNjNDAwODMsCisgIDB4ZDc1MDM1MjUsIDB4ZjdlYTYxNWYsIDB4NjIxNDMxNTQsIDB4MGQ1NTRiNjMsIDB4NWQ2ODExMjEsIDB4Yzg2NmMzNTksCisgIDB4M2Q2M2NmNzMsIDB4Y2VlMjM0YzAsIDB4ZDRkODdlODcsIDB4NWM2NzJiMjEsIDB4MDcxZjYxODEsIDB4MzlmNzYyN2YsCisgIDB4MzYxZTMwODQsIDB4ZTRlYjU3M2IsIDB4NjAyZjY0YTQsIDB4ZDYzYWNkOWMsIDB4MWJiYzQ2MzUsIDB4OWU4MTAzMmQsCisgIDB4MjcwMWY1MGMsIDB4OTk4NDdhYjQsIDB4YTBlM2RmNzksIDB4YmE2Y2YzOGMsIDB4MTA4NDMwOTQsIDB4MjUzN2E5NWUsCisgIDB4ZjQ2ZjZmZmUsIDB4YTFmZjNiMWYsIDB4MjA4Y2ZiNmEsIDB4OGY0NThjNzQsIDB4ZDllMGEyMjcsIDB4NGVjNzNhMzQsCisgIDB4ZmM4ODRmNjksIDB4M2U0ZGU4ZGYsIDB4ZWYwZTAwODgsIDB4MzU1OTY0OGQsIDB4OGE0NTM4OGMsIDB4MWQ4MDQzNjYsCisgIDB4NzIxZDliZmQsIDB4YTU4Njg0YmIsIDB4ZTgyNTYzMzMsIDB4ODQ0ZTgyMTIsIDB4MTI4ZDgwOTgsIDB4ZmVkMzNmYjQsCisgIDB4Y2UyODBhZTEsIDB4MjdlMTliYTUsIDB4ZDVhNmMyNTIsIDB4ZTQ5NzU0YmQsIDB4YzVkNjU1ZGQsIDB4ZWI2NjcwNjQsCisgIDB4Nzc4NDBiNGQsIDB4YTFiNmE4MDEsIDB4ODRkYjI2YTksIDB4ZTBiNTY3MTQsIDB4MjFmMDQzYjcsIDB4ZTVkMDU4NjAsCisgIDB4NTRmMDMwODQsIDB4MDY2ZmY0NzIsIDB4YTMxYWExNTMsIDB4ZGFkYzQ3NTUsIDB4YjU2MjVkYmYsIDB4Njg1NjFiZTYsCisgIDB4ODNjYTZiOTQsIDB4MmQ2ZWQyM2IsIDB4ZWNjZjAxZGIsIDB4YTZkM2QwYmEsIDB4YjY4MDNkNWMsIDB4YWY3N2E3MDksCisgIDB4MzNiNGEzNGMsIDB4Mzk3YmM4ZDYsIDB4NWVlMjJiOTUsIDB4NWYwZTUzMDQsIDB4ODFlZDZmNjEsIDB4MjBlNzQzNjQsCisgIDB4YjQ1ZTEzNzgsIDB4ZGUxODYzOWIsIDB4ODgxY2ExMjIsIDB4Yjk2NzI2ZDEsIDB4ODA0OWE3ZTgsIDB4MjJiN2RhN2IsCisgIDB4NWU1NTJkMjUsIDB4NTI3MmQyMzcsIDB4NzlkMjk1MWMsIDB4YzYwZDg5NGMsIDB4NDg4Y2I0MDIsIDB4MWJhNGZlNWIsCisgIDB4YTRiMDlmNmIsIDB4MWNhODE1Y2YsIDB4YTIwYzMwMDUsIDB4ODg3MWRmNjMsIDB4YjlkZTJmY2IsIDB4MGNjNmM5ZTksCisgIDB4MGJlZWZmNTMsIDB4ZTMyMTQ1MTcsIDB4YjQ1NDI4MzUsIDB4OWY2MzI5M2MsIDB4ZWU0MWU3MjksIDB4NmUxZDJkN2MsCisgIDB4NTAwNDUyODYsIDB4MWU2Njg1ZjMsIDB4ZjMzNDAxYzYsIDB4MzBhMjJjOTUsIDB4MzFhNzA4NTAsIDB4NjA5MzBmMTMsCisgIDB4NzNmOTg0MTcsIDB4YTEyNjk4NTksIDB4ZWM2NDVjNDQsIDB4NTJjODc3YTksIDB4Y2RmZjMzYTYsIDB4YTAyYjE3NDEsCisgIDB4N2NiYWQ5YTIsIDB4MjE4MDAzNmYsIDB4NTBkOTljMDgsIDB4Y2IzZjQ4NjEsIDB4YzI2YmQ3NjUsIDB4NjRhM2Y2YWIsCisgIDB4ODAzNDI2NzYsIDB4MjVhNzVlN2IsIDB4ZTRlNmQxZmMsIDB4MjBjNzEwZTYsIDB4Y2RmMGI2ODAsIDB4MTc4NDRkM2IsCisgIDB4MzFlZWY4NGQsIDB4N2UwODI0ZTQsIDB4MmNjYjQ5ZWIsIDB4ODQ2YTNiYWUsIDB4OGZmNzc4ODgsIDB4ZWU1ZDYwZjYsCisgIDB4N2FmNzU2NzMsIDB4MmZkZDVjZGIsIDB4YTExNjMxYzEsIDB4MzBmNjZmNDMsIDB4YjNmYWVjNTQsIDB4MTU3ZmQ3ZmEsCisgIDB4ZWY4NTc5Y2MsIDB4ZDE1MmRlNTgsIDB4ZGIyZmZkNWUsIDB4OGYzMmNlMTksIDB4MzA2YWY5N2EsIDB4MDJmMDNlZjgsCisgIDB4OTkzMTlhZDUsIDB4YzI0MmZhMGYsIDB4YTdlM2ViYjAsIDB4YzY4ZTQ5MDYsIDB4YjhkYTIzMGMsIDB4ODA4MjMwMjgsCisgIDB4ZGNkZWYzYzgsIDB4ZDM1ZmIxNzEsIDB4MDg4YTFiYzgsIDB4YmVjMGM1NjAsIDB4NjFhM2M5ZTgsIDB4YmNhOGY1NGQsCisgIDB4YzcyZmVmZmEsIDB4MjI4MjJlOTksIDB4ODJjNTcwYjQsIDB4ZDhkOTRlODksIDB4OGIxYzM0YmMsIDB4MzAxZTE2ZTYsCisgIDB4MjczYmU5NzksIDB4YjBmZmVhYTYsIDB4NjFkOWI4YzYsIDB4MDBiMjQ4NjksIDB4YjdmZmNlM2YsIDB4MDhkYzI4M2IsCisgIDB4NDNkYWY2NWEsIDB4ZjdlMTk3OTgsIDB4NzYxOWI3MmYsIDB4OGYxYzliYTQsIDB4ZGM4NjM3YTAsIDB4MTZhN2QzYjEsCisgIDB4OWZjMzkzYjcsIDB4YTcxMzZlZWIsIDB4YzZiY2M2M2UsIDB4MWE1MTM3NDIsIDB4ZWY2ODI4YmMsIDB4NTIwMzY1ZDYsCisgIDB4MmQ2YTc3YWIsIDB4MzUyN2VkNGIsIDB4ODIxZmQyMTYsIDB4MDk1YzZlMmUsIDB4ZGI5MmYyZmIsIDB4NWVlYTI5Y2IsCisgIDB4MTQ1ODkyZjUsIDB4OTE1ODRmN2YsIDB4NTQ4MzY5N2IsIDB4MjY2N2E4Y2MsIDB4ODUxOTYwNDgsIDB4OGM0YmFjZWEsCisgIDB4ODMzODYwZDQsIDB4MGQyM2UwZjksIDB4NmMzODdlOGEsIDB4MGFlNmQyNDksIDB4YjI4NDYwMGMsIDB4ZDgzNTczMWQsCisgIDB4ZGNiMWM2NDcsIDB4YWM0YzU2ZWEsIDB4M2ViZDgxYjMsIDB4MjMwZWFiYjAsIDB4NjQzOGJjODcsIDB4ZjBiNWIxZmEsCisgIDB4OGY1ZWEyYjMsIDB4ZmMxODQ2NDIsIDB4MGEwMzZiN2EsIDB4NGZiMDg5YmQsIDB4NjQ5ZGE1ODksIDB4YTM0NTQxNWUsCisgIDB4NWMwMzgzMjMsIDB4M2U1ZDNiYjksIDB4NDNkNzk1NzIsIDB4N2U2ZGQwN2MsIDB4MDZkZmRmMWUsIDB4NmM2Y2M0ZWYsCisgIDB4NzE2MGE1MzksIDB4NzNiZmJlNzAsIDB4ODM4Nzc2MDUsIDB4NDUyM2VjZjEKK307CisKK3N0YXRpYyB1aW50MzIgUzNbXSA9IHsKKyAgMHg4ZGVmYzI0MCwgMHgyNWZhNWQ5ZiwgMHhlYjkwM2RiZiwgMHhlODEwYzkwNywgMHg0NzYwN2ZmZiwgMHgzNjlmZTQ0YiwKKyAgMHg4YzFmYzY0NCwgMHhhZWNlY2E5MCwgMHhiZWIxZjliZiwgMHhlZWZiY2FlYSwgMHhlOGNmMTk1MCwgMHg1MWRmMDdhZSwKKyAgMHg5MjBlODgwNiwgMHhmMGFkMDU0OCwgMHhlMTNjOGQ4MywgMHg5MjcwMTBkNSwgMHgxMTEwN2Q5ZiwgMHgwNzY0N2RiOSwKKyAgMHhiMmUzZTRkNCwgMHgzZDRmMjg1ZSwgMHhiOWFmYTgyMCwgMHhmYWRlODJlMCwgMHhhMDY3MjY4YiwgMHg4MjcyNzkyZSwKKyAgMHg1NTNmYjJjMCwgMHg0ODlhZTIyYiwgMHhkNGVmOTc5NCwgMHgxMjVlM2ZiYywgMHgyMWZmZmNlZSwgMHg4MjViMWJmZCwKKyAgMHg5MjU1YzVlZCwgMHgxMjU3YTI0MCwgMHg0ZTFhODMwMiwgMHhiYWUwN2ZmZiwgMHg1MjgyNDZlNywgMHg4ZTU3MTQwZSwKKyAgMHgzMzczZjdiZiwgMHg4YzlmODE4OCwgMHhhNmZjNGVlOCwgMHhjOTgyYjVhNSwgMHhhOGMwMWRiNywgMHg1NzlmYzI2NCwKKyAgMHg2NzA5NGYzMSwgMHhmMmJkM2Y1ZiwgMHg0MGZmZjdjMSwgMHgxZmI3OGRmYywgMHg4ZTZiZDJjMSwgMHg0MzdiZTU5YiwKKyAgMHg5OWIwM2RiZiwgMHhiNWRiYzY0YiwgMHg2MzhkYzBlNiwgMHg1NTgxOWQ5OSwgMHhhMTk3YzgxYywgMHg0YTAxMmQ2ZSwKKyAgMHhjNTg4NGEyOCwgMHhjY2MzNmY3MSwgMHhiODQzYzIxMywgMHg2YzA3NDNmMSwgMHg4MzA5ODkzYywgMHgwZmVkZGQ1ZiwKKyAgMHgyZjdmZTg1MCwgMHhkN2MwN2Y3ZSwgMHgwMjUwN2ZiZiwgMHg1YWZiOWEwNCwgMHhhNzQ3ZDJkMCwgMHgxNjUxMTkyZSwKKyAgMHhhZjcwYmYzZSwgMHg1OGMzMTM4MCwgMHg1Zjk4MzAyZSwgMHg3MjdjYzNjNCwgMHgwYTBmYjQwMiwgMHgwZjdmZWY4MiwKKyAgMHg4Yzk2ZmRhZCwgMHg1ZDJjMmFhZSwgMHg4ZWU5OWE0OSwgMHg1MGRhODhiOCwgMHg4NDI3ZjRhMCwgMHgxZWFjNTc5MCwKKyAgMHg3OTZmYjQ0OSwgMHg4MjUyZGMxNSwgMHhlZmJkN2Q5YiwgMHhhNjcyNTk3ZCwgMHhhZGE4NDBkOCwgMHg0NWY1NDUwNCwKKyAgMHhmYTVkNzQwMywgMHhlODNlYzMwNSwgMHg0ZjkxNzUxYSwgMHg5MjU2NjljMiwgMHgyM2VmZTk0MSwgMHhhOTAzZjEyZSwKKyAgMHg2MDI3MGRmMiwgMHgwMjc2ZTRiNiwgMHg5NGZkNjU3NCwgMHg5Mjc5ODViMiwgMHg4Mjc2ZGJjYiwgMHgwMjc3ODE3NiwKKyAgMHhmOGFmOTE4ZCwgMHg0ZTQ4Zjc5ZSwgMHg4ZjYxNmRkZiwgMHhlMjlkODQwZSwgMHg4NDJmN2Q4MywgMHgzNDBjZTVjOCwKKyAgMHg5NmJiYjY4MiwgMHg5M2I0YjE0OCwgMHhlZjMwM2NhYiwgMHg5ODRmYWYyOCwgMHg3NzlmYWY5YiwgMHg5MmRjNTYwZCwKKyAgMHgyMjRkMWUyMCwgMHg4NDM3YWE4OCwgMHg3ZDI5ZGM5NiwgMHgyNzU2ZDNkYywgMHg4YjkwN2NlZSwgMHhiNTFmZDI0MCwKKyAgMHhlN2MwN2NlMywgMHhlNTY2YjRhMSwgMHhjM2U5NjE1ZSwgMHgzY2Y4MjA5ZCwgMHg2MDk0ZDFlMywgMHhjZDljYTM0MSwKKyAgMHg1Yzc2NDYwZSwgMHgwMGVhOTgzYiwgMHhkNGQ2Nzg4MSwgMHhmZDQ3NTcyYywgMHhmNzZjZWRkOSwgMHhiZGE4MjI5YywKKyAgMHgxMjdkYWRhYSwgMHg0MzhhMDc0ZSwgMHgxZjk3YzA5MCwgMHgwODFiZGI4YSwgMHg5M2EwN2ViZSwgMHhiOTM4Y2ExNSwKKyAgMHg5N2IwM2NmZiwgMHgzZGMyYzBmOCwgMHg4ZDFhYjJlYywgMHg2NDM4MGU1MSwgMHg2OGNjN2JmYiwgMHhkOTBmMjc4OCwKKyAgMHgxMjQ5MDE4MSwgMHg1ZGU1ZmZkNCwgMHhkZDdlZjg2YSwgMHg3NmEyZTIxNCwgMHhiOWE0MDM2OCwgMHg5MjVkOTU4ZiwKKyAgMHg0YjM5ZmZmYSwgMHhiYTM5YWVlOSwgMHhhNGZmZDMwYiwgMHhmYWY3OTMzYiwgMHg2ZDQ5ODYyMywgMHgxOTNjYmNmYSwKKyAgMHgyNzYyNzU0NSwgMHg4MjVjZjQ3YSwgMHg2MWJkOGJhMCwgMHhkMTFlNDJkMSwgMHhjZWFkMDRmNCwgMHgxMjdlYTM5MiwKKyAgMHgxMDQyOGRiNywgMHg4MjcyYTk3MiwgMHg5MjcwYzRhOCwgMHgxMjdkZTUwYiwgMHgyODViYTFjOCwgMHgzYzYyZjQ0ZiwKKyAgMHgzNWMwZWFhNSwgMHhlODA1ZDIzMSwgMHg0Mjg5MjlmYiwgMHhiNGZjZGY4MiwgMHg0ZmI2NmE1MywgMHgwZTdkYzE1YiwKKyAgMHgxZjA4MWZhYiwgMHgxMDg2MThhZSwgMHhmY2ZkMDg2ZCwgMHhmOWZmMjg4OSwgMHg2OTRiY2MxMSwgMHgyMzZhNWNhZSwKKyAgMHgxMmRlY2E0ZCwgMHgyYzNmOGNjNSwgMHhkMmQwMmRmZSwgMHhmOGVmNTg5NiwgMHhlNGNmNTJkYSwgMHg5NTE1NWI2NywKKyAgMHg0OTRhNDg4YywgMHhiOWI2YTgwYywgMHg1YzhmODJiYywgMHg4OWQzNmI0NSwgMHgzYTYwOTQzNywgMHhlYzAwYzlhOSwKKyAgMHg0NDcxNTI1MywgMHgwYTg3NGI0OSwgMHhkNzczYmM0MCwgMHg3YzM0NjcxYywgMHgwMjcxN2VmNiwgMHg0ZmViNTUzNiwKKyAgMHhhMmQwMmZmZiwgMHhkMmJmNjBjNCwgMHhkNDNmMDNjMCwgMHg1MGI0ZWY2ZCwgMHgwNzQ3OGNkMSwgMHgwMDZlMTg4OCwKKyAgMHhhMmU1M2Y1NSwgMHhiOWU2ZDRiYywgMHhhMjA0ODAxNiwgMHg5NzU3MzgzMywgMHhkNzIwN2Q2NywgMHhkZTBmOGYzZCwKKyAgMHg3MmY4N2IzMywgMHhhYmNjNGYzMywgMHg3Njg4YzU1ZCwgMHg3YjAwYTZiMCwgMHg5NDdiMDAwMSwgMHg1NzAwNzVkMiwKKyAgMHhmOWJiODhmOCwgMHg4OTQyMDE5ZSwgMHg0MjY0YTVmZiwgMHg4NTYzMDJlMCwgMHg3MmRiZDkyYiwgMHhlZTk3MWI2OSwKKyAgMHg2ZWEyMmZkZSwgMHg1ZjA4YWUyYiwgMHhhZjdhNjE2ZCwgMHhlNWM5ODc2NywgMHhjZjFmZWJkMiwgMHg2MWVmYzhjMiwKKyAgMHhmMWFjMjU3MSwgMHhjYzgyMzljMiwgMHg2NzIxNGNiOCwgMHhiMWU1ODNkMSwgMHhiN2RjM2U2MiwgMHg3ZjEwYmRjZSwKKyAgMHhmOTBhNWMzOCwgMHgwZmYwNDQzZCwgMHg2MDZlNmRjNiwgMHg2MDU0M2E0OSwgMHg1NzI3YzE0OCwgMHgyYmU5OGExZCwKKyAgMHg4YWI0MTczOCwgMHgyMGUxYmUyNCwgMHhhZjk2ZGEwZiwgMHg2ODQ1ODQyNSwgMHg5OTgzM2JlNSwgMHg2MDBkNDU3ZCwKKyAgMHgyODJmOTM1MCwgMHg4MzM0YjM2MiwgMHhkOTFkMTEyMCwgMHgyYjZkOGRhMCwgMHg2NDJiMWUzMSwgMHg5YzMwNWEwMCwKKyAgMHg1MmJjZTY4OCwgMHgxYjAzNTg4YSwgMHhmN2JhZWZkNSwgMHg0MTQyZWQ5YywgMHhhNDMxNWMxMSwgMHg4MzMyM2VjNSwKKyAgMHhkZmVmNDYzNiwgMHhhMTMzYzUwMSwgMHhlOWQzNTMxYywgMHhlZTM1Mzc4MworfTsKKworc3RhdGljIHVpbnQzMiBTNFtdID0geworICAweDlkYjMwNDIwLCAweDFmYjZlOWRlLCAweGE3YmU3YmVmLCAweGQyNzNhMjk4LCAweDRhNGY3YmRiLCAweDY0YWQ4YzU3LAorICAweDg1NTEwNDQzLCAweGZhMDIwZWQxLCAweDdlMjg3YWZmLCAweGU2MGZiNjYzLCAweDA5NWYzNWExLCAweDc5ZWJmMTIwLAorICAweGZkMDU5ZDQzLCAweDY0OTdiN2IxLCAweGYzNjQxZjYzLCAweDI0MWU0YWRmLCAweDI4MTQ3ZjVmLCAweDRmYTJiOGNkLAorICAweGM5NDMwMDQwLCAweDBjYzMyMjIwLCAweGZkZDMwYjMwLCAweGMwYTUzNzRmLCAweDFkMmQwMGQ5LCAweDI0MTQ3YjE1LAorICAweGVlNGQxMTFhLCAweDBmY2E1MTY3LCAweDcxZmY5MDRjLCAweDJkMTk1ZmZlLCAweDFhMDU2NDVmLCAweDBjMTNmZWZlLAorICAweDA4MWIwOGNhLCAweDA1MTcwMTIxLCAweDgwNTMwMTAwLCAweGU4M2U1ZWZlLCAweGFjOWFmNGY4LCAweDdmZTcyNzAxLAorICAweGQyYjhlZTVmLCAweDA2ZGY0MjYxLCAweGJiOWU5YjhhLCAweDcyOTNlYTI1LCAweGNlODRmZmRmLCAweGY1NzE4ODAxLAorICAweDNkZDY0YjA0LCAweGEyNmYyNjNiLCAweDdlZDQ4NDAwLCAweDU0N2VlYmU2LCAweDQ0NmQ0Y2EwLCAweDZjZjNkNmY1LAorICAweDI2NDlhYmRmLCAweGFlYTBjN2Y1LCAweDM2MzM4Y2MxLCAweDUwM2Y3ZTkzLCAweGQzNzcyMDYxLCAweDExYjYzOGUxLAorICAweDcyNTAwZTAzLCAweGY4MGViMmJiLCAweGFiZTA1MDJlLCAweGVjOGQ3N2RlLCAweDU3OTcxZTgxLCAweGUxNGY2NzQ2LAorICAweGM5MzM1NDAwLCAweDY5MjAzMThmLCAweDA4MWRiYjk5LCAweGZmYzMwNGE1LCAweDRkMzUxODA1LCAweDdmM2Q1Y2UzLAorICAweGE2Yzg2NmM2LCAweDVkNWJjY2E5LCAweGRhZWM2ZmVhLCAweDlmOTI2ZjkxLCAweDlmNDYyMjJmLCAweDM5OTE0NjdkLAorICAweGE1YmY2ZDhlLCAweDExNDNjNDRmLCAweDQzOTU4MzAyLCAweGQwMjE0ZWViLCAweDAyMjA4M2I4LCAweDNmYjYxODBjLAorICAweDE4Zjg5MzFlLCAweDI4MTY1OGU2LCAweDI2NDg2ZTNlLCAweDhiZDc4YTcwLCAweDc0NzdlNGMxLCAweGI1MDZlMDdjLAorICAweGYzMmQwYTI1LCAweDc5MDk4YjAyLCAweGU0ZWFiYjgxLCAweDI4MTIzYjIzLCAweDY5ZGVhZDM4LCAweDE1NzRjYTE2LAorICAweGRmODcxYjYyLCAweDIxMWM0MGI3LCAweGE1MWE5ZWY5LCAweDAwMTQzNzdiLCAweDA0MWU4YWM4LCAweDA5MTE0MDAzLAorICAweGJkNTllNGQyLCAweGUzZDE1NmQ1LCAweDRmZTg3NmQ1LCAweDJmOTFhMzQwLCAweDU1N2JlOGRlLCAweDAwZWFlNGE3LAorICAweDBjZTVjMmVjLCAweDRkYjRiYmE2LCAweGU3NTZiZGZmLCAweGRkMzM2OWFjLCAweGVjMTdiMDM1LCAweDA2NTcyMzI3LAorICAweDk5YWZjOGIwLCAweDU2YzhjMzkxLCAweDZiNjU4MTFjLCAweDVlMTQ2MTE5LCAweDZlODVjYjc1LCAweGJlMDdjMDAyLAorICAweGMyMzI1NTc3LCAweDg5M2ZmNGVjLCAweDViYmZjOTJkLCAweGQwZWMzYjI1LCAweGI3ODAxYWI3LCAweDhkNmQzYjI0LAorICAweDIwYzc2M2VmLCAweGMzNjZhNWZjLCAweDljMzgyODgwLCAweDBhY2UzMjA1LCAweGFhYzk1NDhhLCAweGVjYTFkN2M3LAorICAweDA0MWFmYTMyLCAweDFkMTY2MjVhLCAweDY3MDE5MDJjLCAweDliNzU3YTU0LCAweDMxZDQ3N2Y3LCAweDkxMjZiMDMxLAorICAweDM2Y2M2ZmRiLCAweGM3MGI4YjQ2LCAweGQ5ZTY2YTQ4LCAweDU2ZTU1YTc5LCAweDAyNmE0Y2ViLCAweDUyNDM3ZWZmLAorICAweDJmOGY3NmI0LCAweDBkZjk4MGE1LCAweDg2NzRjZGUzLCAweGVkZGEwNGViLCAweDE3YTliZTA0LCAweDJjMThmNGRmLAorICAweGI3NzQ3ZjlkLCAweGFiMmFmN2I0LCAweGVmYzM0ZDIwLCAweDJlMDk2YjdjLCAweDE3NDFhMjU0LCAweGU1YjZhMDM1LAorICAweDIxM2Q0MmY2LCAweDJjMWM3YzI2LCAweDYxYzJmNTBmLCAweDY1NTJkYWY5LCAweGQyYzIzMWY4LCAweDI1MTMwZjY5LAorICAweGQ4MTY3ZmEyLCAweDA0MThmMmM4LCAweDAwMWE5NmE2LCAweDBkMTUyNmFiLCAweDYzMzE1YzIxLCAweDVlMGE3MmVjLAorICAweDQ5YmFmZWZkLCAweDE4NzkwOGQ5LCAweDhkMGRiZDg2LCAweDMxMTE3MGE3LCAweDNlOWI2NDBjLCAweGNjM2UxMGQ3LAorICAweGQ1Y2FkM2I2LCAweDBjYWVjMzg4LCAweGY3MzAwMWUxLCAweDZjNzI4YWZmLCAweDcxZWFlMmExLCAweDFmOWFmMzZlLAorICAweGNmY2JkMTJmLCAweGMxZGU4NDE3LCAweGFjMDdiZTZiLCAweGNiNDRhMWQ4LCAweDhiOWIwZjU2LCAweDAxMzk4OGMzLAorICAweGIxYzUyZmNhLCAweGI0YmUzMWNkLCAweGQ4NzgyODA2LCAweDEyYTNhNGUyLCAweDZmN2RlNTMyLCAweDU4ZmQ3ZWI2LAorICAweGQwMWVlOTAwLCAweDI0YWRmZmMyLCAweGY0OTkwZmM1LCAweDk3MTFhYWM1LCAweDAwMWQ3Yjk1LCAweDgyZTVlN2QyLAorICAweDEwOTg3M2Y2LCAweDAwNjEzMDk2LCAweGMzMmQ5NTIxLCAweGFkYTEyMWZmLCAweDI5OTA4NDE1LCAweDdmYmI5NzdmLAorICAweGFmOWViM2RiLCAweDI5YzllZDJhLCAweDVjZTJhNDY1LCAweGE3MzBmMzJjLCAweGQwYWEzZmU4LCAweDhhNWNjMDkxLAorICAweGQ0OWUyY2U3LCAweDBjZTQ1NGE5LCAweGQ2MGFjZDg2LCAweDAxNWYxOTE5LCAweDc3MDc5MTAzLCAweGRlYTAzYWY2LAorICAweDc4YTg1NjVlLCAweGRlZTM1NmRmLCAweDIxZjA1Y2JlLCAweDhiNzVlMzg3LCAweGIzYzUwNjUxLCAweGI4YTVjM2VmLAorICAweGQ4ZWViNmQyLCAweGU1MjNiZTc3LCAweGMyMTU0NTI5LCAweDJmNjllZmRmLCAweGFmZTY3YWZiLCAweGY0NzBjNGIyLAorICAweGYzZTBlYjViLCAweGQ2Y2M5ODc2LCAweDM5ZTQ0NjBjLCAweDFmZGE4NTM4LCAweDE5ODc4MzJmLCAweGNhMDA3MzY3LAorICAweGE5OTE0NGY4LCAweDI5NmIyOTllLCAweDQ5MmZjMjk1LCAweDkyNjZiZWFiLCAweGI1Njc2ZTY5LCAweDliZDNkZGRhLAorICAweGRmN2UwNTJmLCAweGRiMjU3MDFjLCAweDFiNWU1MWVlLCAweGY2NTMyNGU2LCAweDZhZmNlMzZjLCAweDAzMTZjYzA0LAorICAweDg2NDQyMTNlLCAweGI3ZGM1OWQwLCAweDc5NjUyOTFmLCAweGNjZDZmZDQzLCAweDQxODIzOTc5LCAweDkzMmJjZGY2LAorICAweGI2NTdjMzRkLCAweDRlZGZkMjgyLCAweDdhZTUyOTBjLCAweDNjYjk1MzZiLCAweDg1MWUyMGZlLCAweDk4MzM1NTdlLAorICAweDEzZWNmMGIwLCAweGQzZmZiMzcyLCAweDNmODVjNWMxLCAweDBhZWY3ZWQyCit9OworCisvKiBFbmNyeXB0L2RlY3J5cHQgb25lIDY0LWJpdCBibG9jayBvZiBkYXRhICovCisKK3ZvaWQKK2NrX2Nhc3RfZWNiX2VuY3J5cHQob3V0LCBpbiwgc2NoZWQsIG1vZGUpCisgICAgdWludDhwIG91dDsKKyAgICB1aW50OHAgaW47CisgICAgQ2FzdEtleVNjaGVkICogc2NoZWQ7CisgICAgaW50IG1vZGU7ICAgICAgICAgICAvKiB6ZXJvIG1lYW5zIGVuY3J5cHQgKi8KK3sKKyAgICB1aW50MzIgdFsyXTsKKworI2lmZGVmIExJVFRMRV9FTkRJQU4KKyAgICB0WzBdID0gKGluWzBdIDw8IDI0KSB8IChpblsxXSA8PCAxNikgfCAoaW5bMl0gPDwgOCkgfCBpblszXTsKKyAgICB0WzFdID0gKGluWzRdIDw8IDI0KSB8IChpbls1XSA8PCAxNikgfCAoaW5bNl0gPDwgOCkgfCBpbls3XTsKKyNlbHNlCisgICAgdFswXSA9ICoodWludDMycCkgaW47CisgICAgdFsxXSA9ICoodWludDMycCkgKGluICsgNCk7CisjZW5kaWYKKworICAgIGNrX2Nhc3RfZWNiX2NyeXB0KHQsIHNjaGVkLCBtb2RlKTsKKworI2lmZGVmIExJVFRMRV9FTkRJQU4KKyAgICBvdXRbMF0gPSAodFswXSA+PiAyNCkgJiAweGZmOworICAgIG91dFsxXSA9ICh0WzBdID4+IDE2KSAmIDB4ZmY7CisgICAgb3V0WzJdID0gKHRbMF0gPj4gOCkgJiAweGZmOworICAgIG91dFszXSA9IHRbMF0gJiAweGZmOworICAgIG91dFs0XSA9ICh0WzFdID4+IDI0KSAmIDB4ZmY7CisgICAgb3V0WzVdID0gKHRbMV0gPj4gMTYpICYgMHhmZjsKKyAgICBvdXRbNl0gPSAodFsxXSA+PiA4KSAmIDB4ZmY7CisgICAgb3V0WzddID0gdFsxXSAmIDB4ZmY7CisjZWxzZQorICAgICoodWludDMycCkgb3V0ID0gdFswXTsKKyAgICAqKHVpbnQzMnApIChvdXQgKyA0KSA9IHRbMV07CisjZW5kaWYKK30KKwordm9pZAorY2tfY2FzdF9lY2JfY3J5cHQoZGF0YSwgc2NoZWQsIG1vZGUpCisgICAgdWludDMycCBkYXRhOworICAgIENhc3RLZXlTY2hlZCAqIHNjaGVkOworICAgIGludCBtb2RlOworeworICAgIHJlZ2lzdGVyIHVpbnQzMiBMLCBSLCB0ZW1wOworICAgIHJlZ2lzdGVyIHN0cnVjdCBDYXN0U3Via2V5UGFpciAqIGtwOworICAgIHJlZ2lzdGVyIHVpbnQ4cCBJYSwgSWIsIEljLCBJZDsKKyAgICB1aW50MzIgSTsKKworI2lmZGVmIExJVFRMRV9FTkRJQU4KKyAgICBJZCA9ICh1aW50OHApICZJOworICAgIEljID0gSWQgKyAxOworICAgIEliID0gSWMgKyAxOworICAgIElhID0gSWIgKyAxOworI2Vsc2UKKyAgICBJYSA9ICh1aW50OHApICZJOworICAgIEliID0gSWEgKyAxOworICAgIEljID0gSWIgKyAxOworICAgIElkID0gSWMgKyAxOworI2VuZGlmCisKKyAgICBMID0gZGF0YVswXTsKKyAgICBSID0gZGF0YVsxXTsKKworI2RlZmluZSB0eXBlMChsZWZ0LHJpZ2h0KSAgICAgICBcCisgICAgICB0ZW1wID0ga3AtPkttICsgcmlnaHQ7XAorICAgICAgSSA9ICh0ZW1wIDw8IGtwLT5LcikgfCAodGVtcCA+PiAoMzIgLSBrcC0+S3IpKTtcCisgICAgICBsZWZ0IF49ICgoUzFbKklhXSBeIFMyWypJYl0pIC0gUzNbKkljXSkgKyBTNFsqSWRdOworCisjZGVmaW5lIHR5cGUxKGxlZnQscmlnaHQpICAgICAgIFwKKyAgICAgIHRlbXAgPSBrcC0+S20gXiByaWdodDtcCisgICAgICBJID0gKHRlbXAgPDwga3AtPktyKSB8ICh0ZW1wID4+ICgzMiAtIGtwLT5LcikpO1wKKyAgICAgIGxlZnQgXj0gKChTMVsqSWFdIC0gUzJbKkliXSkgKyBTM1sqSWNdKSBeIFM0WypJZF07CisKKyNkZWZpbmUgdHlwZTIobGVmdCxyaWdodCkgICAgICAgXAorICAgICAgdGVtcCA9IGtwLT5LbSAtIHJpZ2h0O1wKKyAgICAgIEkgPSAodGVtcCA8PCBrcC0+S3IpIHwgKHRlbXAgPj4gKDMyIC0ga3AtPktyKSk7XAorICAgICAgbGVmdCBePSAoKFMxWypJYV0gKyBTMlsqSWJdKSBeIFMzWypJY10pIC0gUzRbKklkXTsKKworICAgIGlmKG1vZGUpIHsKKyNpZm5kZWYgQ0FTVF9FWFBPUlRfRU5DUllQVElPTgorICAgICAgICBpZihzY2hlZC0+a3NpemUgPiAxMCkgeworICAgICAgICAgICAga3AgPSAmc2NoZWQtPktbMTVdOworICAgICAgICAgICAgdHlwZTAoTCwgUik7IC0ta3A7CisgICAgICAgICAgICB0eXBlMihSLCBMKTsgLS1rcDsKKyAgICAgICAgICAgIHR5cGUxKEwsIFIpOyAtLWtwOworICAgICAgICAgICAgdHlwZTAoUiwgTCk7IC0ta3A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIGtwID0gJnNjaGVkLT5LWzExXTsKKyAgICAgICAgdHlwZTIoTCwgUik7IC0ta3A7CisgICAgICAgIHR5cGUxKFIsIEwpOyAtLWtwOworICAgICAgICB0eXBlMChMLCBSKTsgLS1rcDsKKyAgICAgICAgdHlwZTIoUiwgTCk7IC0ta3A7CisgICAgICAgIHR5cGUxKEwsIFIpOyAtLWtwOworICAgICAgICB0eXBlMChSLCBMKTsgLS1rcDsKKyAgICAgICAgdHlwZTIoTCwgUik7IC0ta3A7CisgICAgICAgIHR5cGUxKFIsIEwpOyAtLWtwOworICAgICAgICB0eXBlMChMLCBSKTsgLS1rcDsKKyAgICAgICAgdHlwZTIoUiwgTCk7IC0ta3A7CisgICAgICAgIHR5cGUxKEwsIFIpOyAtLWtwOworICAgICAgICB0eXBlMChSLCBMKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGtwID0gJnNjaGVkLT5LWzBdOworICAgICAgICB0eXBlMChMLCBSKTsgKytrcDsKKyAgICAgICAgdHlwZTEoUiwgTCk7ICsra3A7CisgICAgICAgIHR5cGUyKEwsIFIpOyArK2twOworICAgICAgICB0eXBlMChSLCBMKTsgKytrcDsKKyAgICAgICAgdHlwZTEoTCwgUik7ICsra3A7CisgICAgICAgIHR5cGUyKFIsIEwpOyArK2twOworICAgICAgICB0eXBlMChMLCBSKTsgKytrcDsKKyAgICAgICAgdHlwZTEoUiwgTCk7ICsra3A7CisgICAgICAgIHR5cGUyKEwsIFIpOyArK2twOworICAgICAgICB0eXBlMChSLCBMKTsgKytrcDsKKyAgICAgICAgdHlwZTEoTCwgUik7ICsra3A7CisgICAgICAgIHR5cGUyKFIsIEwpOyArK2twOworI2lmbmRlZiBDQVNUX0VYUE9SVF9FTkNSWVBUSU9OCisgICAgICAgIGlmKHNjaGVkLT5rc2l6ZSA+IDEwKSB7CisgICAgICAgICAgICB0eXBlMChMLCBSKTsgKytrcDsKKyAgICAgICAgICAgIHR5cGUxKFIsIEwpOyArK2twOworICAgICAgICAgICAgdHlwZTIoTCwgUik7ICsra3A7CisgICAgICAgICAgICB0eXBlMChSLCBMKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgZGF0YVswXSA9IFI7CisgICAgZGF0YVsxXSA9IEw7Cit9CisKKy8qIFRoZSBsYXN0IGZvdXIgUy1ib3hlcyBhcmUgZm9yIGtleSBzY2hlZHVsZSBzZXR1cCAqLworCitzdGF0aWMgdWludDMyIFM1W10gPSB7CisgIDB4N2VjOTBjMDQsIDB4MmM2ZTc0YjksIDB4OWIwZTY2ZGYsIDB4YTYzMzc5MTEsIDB4Yjg2YTdmZmYsIDB4MWRkMzU4ZjUsCisgIDB4NDRkZDlkNDQsIDB4MTczMTE2N2YsIDB4MDhmYmYxZmEsIDB4ZTdmNTExY2MsIDB4ZDIwNTFiMDAsIDB4NzM1YWJhMDAsCisgIDB4MmFiNzIyZDgsIDB4Mzg2MzgxY2IsIDB4YWNmNjI0M2EsIDB4NjliZWZkN2EsIDB4ZTZhMmU3N2YsIDB4ZjBjNzIwY2QsCisgIDB4YzQ0OTQ4MTYsIDB4Y2NmNWMxODAsIDB4Mzg4NTE2NDAsIDB4MTViMGE4NDgsIDB4ZTY4YjE4Y2IsIDB4NGNhYWRlZmYsCisgIDB4NWY0ODBhMDEsIDB4MDQxMmIyYWEsIDB4MjU5ODE0ZmMsIDB4NDFkMGVmZTIsIDB4NGU0MGI0OGQsIDB4MjQ4ZWI2ZmIsCisgIDB4OGRiYTFjZmUsIDB4NDFhOTliMDIsIDB4MWE1NTBhMDQsIDB4YmE4ZjY1Y2IsIDB4NzI1MWY0ZTcsIDB4OTVhNTE3MjUsCisgIDB4YzEwNmVjZDcsIDB4OTdhNTk4MGEsIDB4YzUzOWI5YWEsIDB4NGQ3OWZlNmEsIDB4ZjJmM2Y3NjMsIDB4NjhhZjgwNDAsCisgIDB4ZWQwYzllNTYsIDB4MTFiNDk1OGIsIDB4ZTFlYjVhODgsIDB4ODcwOWU2YjAsIDB4ZDdlMDcxNTYsIDB4NGUyOWZlYTcsCisgIDB4NjM2NmU1MmQsIDB4MDJkMWMwMDAsIDB4YzRhYzhlMDUsIDB4OTM3N2Y1NzEsIDB4MGMwNTM3MmEsIDB4NTc4NTM1ZjIsCisgIDB4MjI2MWJlMDIsIDB4ZDY0MmEwYzksIDB4ZGYxM2EyODAsIDB4NzRiNTViZDIsIDB4NjgyMTk5YzAsIDB4ZDQyMWU1ZWMsCisgIDB4NTNmYjNjZTgsIDB4YzhhZGVkYjMsIDB4MjhhODdmYzksIDB4M2Q5NTk5ODEsIDB4NWMxZmY5MDAsIDB4ZmUzOGQzOTksCisgIDB4MGM0ZWZmMGIsIDB4MDYyNDA3ZWEsIDB4YWEyZjRmYjEsIDB4NGZiOTY5NzYsIDB4OTBjNzk1MDUsIDB4YjBhOGE3NzQsCisgIDB4ZWY1NWExZmYsIDB4ZTU5Y2EyYzIsIDB4YTZiNjJkMjcsIDB4ZTY2YTQyNjMsIDB4ZGY2NTAwMWYsIDB4MGVjNTA5NjYsCisgIDB4ZGZkZDU1YmMsIDB4MjlkZTA2NTUsIDB4OTExZTczOWEsIDB4MTdhZjg5NzUsIDB4MzJjNzkxMWMsIDB4ODlmODk0NjgsCisgIDB4MGQwMWU5ODAsIDB4NTI0NzU1ZjQsIDB4MDNiNjNjYzksIDB4MGNjODQ0YjIsIDB4YmNmM2YwYWEsIDB4ODdhYzM2ZTksCisgIDB4ZTUzYTc0MjYsIDB4MDFiM2Q4MmIsIDB4MWE5ZTc0NDksIDB4NjRlZTJkN2UsIDB4Y2RkYmIxZGEsIDB4MDFjOTQ5MTAsCisgIDB4Yjg2OGJmODAsIDB4MGQyNmYzZmQsIDB4OTM0MmVkZTcsIDB4MDRhNWMyODQsIDB4NjM2NzM3YjYsIDB4NTBmNWI2MTYsCisgIDB4ZjI0NzY2ZTMsIDB4OGVjYTM2YzEsIDB4MTM2ZTA1ZGIsIDB4ZmVmMTgzOTEsIDB4ZmI4ODdhMzcsIDB4ZDZlN2Y3ZDQsCisgIDB4YzdmYjdkYzksIDB4MzA2M2ZjZGYsIDB4YjZmNTg5ZGUsIDB4ZWMyOTQxZGEsIDB4MjZlNDY2OTUsIDB4Yjc1NjY0MTksCisgIDB4ZjY1NGVmYzUsIDB4ZDA4ZDU4YjcsIDB4NDg5MjU0MDEsIDB4YzFiYWNiN2YsIDB4ZTVmZjU1MGYsIDB4YjYwODMwNDksCisgIDB4NWJiNWQwZTgsIDB4ODdkNzJlNWEsIDB4YWI2YTZlZTEsIDB4MjIzYTY2Y2UsIDB4YzYyYmYzY2QsIDB4OWUwODg1ZjksCisgIDB4NjhjYjNlNDcsIDB4MDg2YzAxMGYsIDB4YTIxZGU4MjAsIDB4ZDE4YjY5ZGUsIDB4ZjNmNjU3NzcsIDB4ZmEwMmMzZjYsCisgIDB4NDA3ZWRhYzMsIDB4Y2JiM2Q1NTAsIDB4MTc5MzA4NGQsIDB4YjBkNzBlYmEsIDB4MGFiMzc4ZDUsIDB4ZDk1MWZiMGMsCisgIDB4ZGVkN2RhNTYsIDB4NDEyNGJiZTQsIDB4OTRjYTBiNTYsIDB4MGY1NzU1ZDEsIDB4ZTBlMWU1NmUsIDB4NjE4NGI1YmUsCisgIDB4NTgwYTI0OWYsIDB4OTRmNzRiYzAsIDB4ZTMyNzg4OGUsIDB4OWY3YjU1NjEsIDB4YzNkYzAyODAsIDB4MDU2ODc3MTUsCisgIDB4NjQ2YzZiZDcsIDB4NDQ5MDRkYjMsIDB4NjZiNGYwYTMsIDB4YzBmMTY0OGEsIDB4Njk3ZWQ1YWYsIDB4NDllOTJmZjYsCisgIDB4MzA5ZTM3NGYsIDB4MmNiNjM1NmEsIDB4ODU4MDg1NzMsIDB4NDk5MWY4NDAsIDB4NzZmMGFlMDIsIDB4MDgzYmU4NGQsCisgIDB4Mjg0MjFjOWEsIDB4NDQ0ODk0MDYsIDB4NzM2ZTRjYjgsIDB4YzEwOTI5MTAsIDB4OGJjOTVmYzYsIDB4N2Q4NjljZjQsCisgIDB4MTM0ZjYxNmYsIDB4MmU3NzExOGQsIDB4YjMxYjJiZTEsIDB4YWE5MGI0NzIsIDB4M2NhNWQ3MTcsIDB4N2QxNjFiYmEsCisgIDB4OWNhZDkwMTAsIDB4YWY0NjJiYTIsIDB4OWZlNDU5ZDIsIDB4NDVkMzQ1NTksIDB4ZDlmMmRhMTMsIDB4ZGJjNjU0ODcsCisgIDB4ZjNlNGY5NGUsIDB4MTc2ZDQ4NmYsIDB4MDk3YzEzZWEsIDB4NjMxZGE1YzcsIDB4NDQ1ZjczODIsIDB4MTc1NjgzZjQsCisgIDB4Y2RjNjZhOTcsIDB4NzBiZTAyODgsIDB4YjNjZGNmNzIsIDB4NmU1ZGQyZjMsIDB4MjA5MzYwNzksIDB4NDU5YjgwYTUsCisgIDB4YmU2MGUyZGIsIDB4YTljMjMxMDEsIDB4ZWJhNTMxNWMsIDB4MjI0ZTQyZjIsIDB4MWM1YzE1NzIsIDB4ZjY3MjFiMmMsCisgIDB4MWFkMmZmZjMsIDB4OGMyNTQwNGUsIDB4MzI0ZWQ3MmYsIDB4NDA2N2I3ZmQsIDB4MDUyMzEzOGUsIDB4NWNhM2JjNzgsCisgIDB4ZGMwZmQ2NmUsIDB4NzU5MjIyODMsIDB4Nzg0ZDZiMTcsIDB4NThlYmIxNmUsIDB4NDQwOTRmODUsIDB4M2Y0ODFkODcsCisgIDB4ZmNmZWFlN2IsIDB4NzdiNWZmNzYsIDB4OGMyMzAyYmYsIDB4YWFmNDc1NTYsIDB4NWY0NmIwMmEsIDB4MmIwOTI4MDEsCisgIDB4M2QzOGY1ZjcsIDB4MGNhODFmMzYsIDB4NTJhZjRhOGEsIDB4NjZkNWU3YzAsIDB4ZGYzYjA4NzQsIDB4OTUwNTUxMTAsCisgIDB4MWI1YWQ3YTgsIDB4ZjYxZWQ1YWQsIDB4NmNmNmU0NzksIDB4MjA3NTgxODQsIDB4ZDBjZWZhNjUsIDB4ODhmN2JlNTgsCisgIDB4NGEwNDY4MjYsIDB4MGZmNmY4ZjMsIDB4YTA5YzdmNzAsIDB4NTM0NmFiYTAsIDB4NWNlOTZjMjgsIDB4ZTE3NmVkYTMsCisgIDB4NmJhYzMwN2YsIDB4Mzc2ODI5ZDIsIDB4ODUzNjBmYTksIDB4MTdlM2ZlMmEsIDB4MjRiNzk3NjcsIDB4ZjVhOTZiMjAsCisgIDB4ZDZjZDI1OTUsIDB4NjhmZjFlYmYsIDB4NzU1NTQ0MmMsIDB4ZjE5ZjA2YmUsIDB4ZjllMDY1OWEsIDB4ZWViOTQ5MWQsCisgIDB4MzQwMTA3MTgsIDB4YmIzMGNhYjgsIDB4ZTgyMmZlMTUsIDB4ODg1NzA5ODMsIDB4NzUwZTYyNDksIDB4ZGE2MjdlNTUsCisgIDB4NWU3NmZmYTgsIDB4YjE1MzQ1NDYsIDB4NmQ0N2RlMDgsIDB4ZWZlOWU3ZDQKK307CisKK3N0YXRpYyB1aW50MzIgUzZbXSA9IHsKKyAgMHhmNmZhOGY5ZCwgMHgyY2FjNmNlMSwgMHg0Y2EzNDg2NywgMHhlMjMzN2Y3YywgMHg5NWRiMDhlNywgMHgwMTY4NDNiNCwKKyAgMHhlY2VkNWNiYywgMHgzMjU1NTNhYywgMHhiZjlmMDk2MCwgMHhkZmExZTJlZCwgMHg4M2YwNTc5ZCwgMHg2M2VkODZiOSwKKyAgMHgxYWI2YTZiOCwgMHhkZTVlYmUzOSwgMHhmMzhmZjczMiwgMHg4OTg5YjEzOCwgMHgzM2YxNDk2MSwgMHhjMDE5MzdiZCwKKyAgMHhmNTA2YzZkYSwgMHhlNDYyNWU3ZSwgMHhhMzA4ZWE5OSwgMHg0ZTIzZTMzYywgMHg3OWNiZDdjYywgMHg0OGExNDM2NywKKyAgMHhhMzE0OTYxOSwgMHhmZWM5NGJkNSwgMHhhMTE0MTc0YSwgMHhlYWEwMTg2NiwgMHhhMDg0ZGIyZCwgMHgwOWE4NDg2ZiwKKyAgMHhhODg4NjE0YSwgMHgyOTAwYWY5OCwgMHgwMTY2NTk5MSwgMHhlMTk5Mjg2MywgMHhjOGYzMGM2MCwgMHgyZTc4ZWYzYywKKyAgMHhkMGQ1MTkzMiwgMHhjZjBmZWMxNCwgMHhmN2NhMDdkMiwgMHhkMGE4MjA3MiwgMHhmZDQxMTk3ZSwgMHg5MzA1YTZiMCwKKyAgMHhlODZiZTNkYSwgMHg3NGJlZDNjZCwgMHgzNzJkYTUzYywgMHg0YzdmNDQ0OCwgMHhkYWI1ZDQ0MCwgMHg2ZGJhMGVjMywKKyAgMHgwODM5MTlhNywgMHg5ZmJhZWVkOSwgMHg0OWRiY2ZiMCwgMHg0ZTY3MGM1MywgMHg1YzNkOWMwMSwgMHg2NGJkYjk0MSwKKyAgMHgyYzBlNjM2YSwgMHhiYTdkZDljZCwgMHhlYTZmNzM4OCwgMHhlNzBiYzc2MiwgMHgzNWYyOWFkYiwgMHg1YzRjZGQ4ZCwKKyAgMHhmMGQ0OGQ4YywgMHhiODgxNTNlMiwgMHgwOGExOTg2NiwgMHgxYWUyZWFjOCwgMHgyODRjYWY4OSwgMHhhYTkyODIyMywKKyAgMHg5MzM0YmU1MywgMHgzYjNhMjFiZiwgMHgxNjQzNGJlMywgMHg5YWVhMzkwNiwgMHhlZmU4YzM2ZSwgMHhmODkwY2RkOSwKKyAgMHg4MDIyNmRhZSwgMHhjMzQwYTRhMywgMHhkZjdlOWMwOSwgMHhhNjk0YTgwNywgMHg1YjdjNWVjYywgMHgyMjFkYjNhNiwKKyAgMHg5YTY5YTAyZiwgMHg2ODgxOGE1NCwgMHhjZWIyMjk2ZiwgMHg1M2MwODQzYSwgMHhmZTg5MzY1NSwgMHgyNWJmZTY4YSwKKyAgMHhiNDYyOGFiYywgMHhjZjIyMmViZiwgMHgyNWFjNmY0OCwgMHhhOWE5OTM4NywgMHg1M2JkZGI2NSwgMHhlNzZmZmJlNywKKyAgMHhlOTY3ZmQ3OCwgMHgwYmE5MzU2MywgMHg4ZTM0MmJjMSwgMHhlOGExMWJlOSwgMHg0OTgwNzQwZCwgMHhjODA4N2RmYywKKyAgMHg4ZGU0YmY5OSwgMHhhMTExMDFhMCwgMHg3ZmQzNzk3NSwgMHhkYTVhMjZjMCwgMHhlODFmOTk0ZiwgMHg5NTI4Y2Q4OSwKKyAgMHhmZDMzOWZlZCwgMHhiODc4MzRiZiwgMHg1ZjA0NDU2ZCwgMHgyMjI1ODY5OCwgMHhjOWM0YzgzYiwgMHgyZGMxNTZiZSwKKyAgMHg0ZjYyOGRhYSwgMHg1N2Y1NWVjNSwgMHhlMjIyMGFiZSwgMHhkMjkxNmViZiwgMHg0ZWM3NWI5NSwgMHgyNGYyYzNjMCwKKyAgMHg0MmQxNWQ5OSwgMHhjZDBkN2ZhMCwgMHg3YjZlMjdmZiwgMHhhOGRjOGFmMCwgMHg3MzQ1YzEwNiwgMHhmNDFlMjMyZiwKKyAgMHgzNTE2MjM4NiwgMHhlNmVhODkyNiwgMHgzMzMzYjA5NCwgMHgxNTdlYzZmMiwgMHgzNzJiNzRhZiwgMHg2OTI1NzNlNCwKKyAgMHhlOWE5ZDg0OCwgMHhmMzE2MDI4OSwgMHgzYTYyZWYxZCwgMHhhNzg3ZTIzOCwgMHhmM2E1ZjY3NiwgMHg3NDM2NDg1MywKKyAgMHgyMDk1MTA2MywgMHg0NTc2Njk4ZCwgMHhiNmZhZDQwNywgMHg1OTJhZjk1MCwgMHgzNmY3MzUyMywgMHg0Y2ZiNmU4NywKKyAgMHg3ZGE0Y2VjMCwgMHg2YzE1MmRhYSwgMHhjYjAzOTZhOCwgMHhjNTBkZmU1ZCwgMHhmY2Q3MDdhYiwgMHgwOTIxYzQyZiwKKyAgMHg4OWRmZjBiYiwgMHg1ZmUyYmU3OCwgMHg0NDhmNGYzMywgMHg3NTQ2MTNjOSwgMHgyYjA1ZDA4ZCwgMHg0OGI5ZDU4NSwKKyAgMHhkYzA0OTQ0MSwgMHhjODA5OGY5YiwgMHg3ZGVkZTc4NiwgMHhjMzlhMzM3MywgMHg0MjQxMDAwNSwgMHg2YTA5MTc1MSwKKyAgMHgwZWYzYzhhNiwgMHg4OTAwNzJkNiwgMHgyODIwNzY4MiwgMHhhOWE5ZjdiZSwgMHhiZjMyNjc5ZCwgMHhkNDViNWI3NSwKKyAgMHhiMzUzZmQwMCwgMHhjYmIwZTM1OCwgMHg4MzBmMjIwYSwgMHgxZjhmYjIxNCwgMHhkMzcyY2YwOCwgMHhjYzNjNGExMywKKyAgMHg4Y2Y2MzE2NiwgMHgwNjFjODdiZSwgMHg4OGM5OGY4OCwgMHg2MDYyZTM5NywgMHg0N2NmOGU3YSwgMHhiNmM4NTI4MywKKyAgMHgzY2MyYWNmYiwgMHgzZmMwNjk3NiwgMHg0ZThmMDI1MiwgMHg2NGQ4MzE0ZCwgMHhkYTM4NzBlMywgMHgxZTY2NTQ1OSwKKyAgMHhjMTA5MDhmMCwgMHg1MTMwMjFhNSwgMHg2YzViNjhiNywgMHg4MjJmOGFhMCwgMHgzMDA3Y2QzZSwgMHg3NDcxOWVlZiwKKyAgMHhkYzg3MjY4MSwgMHgwNzMzNDBkNCwgMHg3ZTQzMmZkOSwgMHgwYzVlYzI0MSwgMHg4ODA5Mjg2YywgMHhmNTkyZDg5MSwKKyAgMHgwOGE5MzBmNiwgMHg5NTdlZjMwNSwgMHhiN2ZiZmZiZCwgMHhjMjY2ZTk2ZiwgMHg2ZmU0YWM5OCwgMHhiMTczZWNjMCwKKyAgMHhiYzYwYjQyYSwgMHg5NTM0OThkYSwgMHhmYmExYWUxMiwgMHgyZDRiZDczNiwgMHgwZjI1ZmFhYiwgMHhhNGYzZmNlYiwKKyAgMHhlMjk2OTEyMywgMHgyNTdmMGMzZCwgMHg5MzQ4YWY0OSwgMHgzNjE0MDBiYywgMHhlODgxNmY0YSwgMHgzODE0ZjIwMCwKKyAgMHhhM2Y5NDA0MywgMHg5YzdhNTRjMiwgMHhiYzcwNGY1NywgMHhkYTQxZTdmOSwgMHhjMjVhZDMzYSwgMHg1NGY0YTA4NCwKKyAgMHhiMTdmNTUwNSwgMHg1OTM1N2NiZSwgMHhlZGJkMTVjOCwgMHg3Zjk3YzVhYiwgMHhiYTVhYzdiNSwgMHhiNmY2ZGVhZiwKKyAgMHgzYTQ3OWMzYSwgMHg1MzAyZGEyNSwgMHg2NTNkN2U2YSwgMHg1NDI2OGQ0OSwgMHg1MWE0NzdlYSwgMHg1MDE3ZDU1YiwKKyAgMHhkN2QyNWQ4OCwgMHg0NDEzNmM3NiwgMHgwNDA0YThjOCwgMHhiOGU1YTEyMSwgMHhiODFhOTI4YSwgMHg2MGVkNTg2OSwKKyAgMHg5N2M1NWI5NiwgMHhlYWVjOTkxYiwgMHgyOTkzNTkxMywgMHgwMWZkYjdmMSwgMHgwODhlOGRmYSwgMHg5YWI2ZjZmNSwKKyAgMHgzYjRjYmY5ZiwgMHg0YTVkZTNhYiwgMHhlNjA1MWQzNSwgMHhhMGUxZDg1NSwgMHhkMzZiNGNmMSwgMHhmNTQ0ZWRlYiwKKyAgMHhiMGU5MzUyNCwgMHhiZWJiOGZiZCwgMHhhMmQ3NjJjZiwgMHg0OWM5MmY1NCwgMHgzOGI1ZjMzMSwgMHg3MTI4YTQ1NCwKKyAgMHg0ODM5MjkwNSwgMHhhNjViMWRiOCwgMHg4NTFjOTdiZCwgMHhkNjc1Y2YyZgorfTsKKworc3RhdGljIHVpbnQzMiBTN1tdID0geworICAweDg1ZTA0MDE5LCAweDMzMmJmNTY3LCAweDY2MmRiZmZmLCAweGNmYzY1NjkzLCAweDJhOGQ3ZjZmLCAweGFiOWJjOTEyLAorICAweGRlNjAwOGExLCAweDIwMjhkYTFmLCAweDAyMjdiY2U3LCAweDRkNjQyOTE2LCAweDE4ZmFjMzAwLCAweDUwZjE4YjgyLAorICAweDJjYjJjYjExLCAweGIyMzJlNzVjLCAweDRiMzY5NWYyLCAweGIyODcwN2RlLCAweGEwNWZiY2Y2LCAweGNkNDE4MWU5LAorICAweGUxNTAyMTBjLCAweGUyNGVmMWJkLCAweGIxNjhjMzgxLCAweGZkZTRlNzg5LCAweDVjNzliMGQ4LCAweDFlOGJmZDQzLAorICAweDRkNDk1MDAxLCAweDM4YmU0MzQxLCAweDkxM2NlZTFkLCAweDkyYTc5YzNmLCAweDA4OTc2NmJlLCAweGJhZWVhZGY0LAorICAweDEyODZiZWNmLCAweGI2ZWFjYjE5LCAweDI2NjBjMjAwLCAweDc1NjViZGU0LCAweDY0MjQxZjdhLCAweDgyNDhkY2E5LAorICAweGMzYjNhZDY2LCAweDI4MTM2MDg2LCAweDBiZDhkZmE4LCAweDM1NmQxY2YyLCAweDEwNzc4OWJlLCAweGIzYjJlOWNlLAorICAweDA1MDJhYThmLCAweDBiYzAzNTFlLCAweDE2NmJmNTJhLCAweGViMTJmZjgyLCAweGUzNDg2OTExLCAweGQzNGQ3NTE2LAorICAweDRlN2IzYWZmLCAweDVmNDM2NzFiLCAweDljZjZlMDM3LCAweDQ5ODFhYzgzLCAweDMzNDI2NmNlLCAweDhjOTM0MWI3LAorICAweGQwZDg1NGMwLCAweGNiM2E2Yzg4LCAweDQ3YmMyODI5LCAweDQ3MjViYTM3LCAweGE2NmFkMjJiLCAweDdhZDYxZjFlLAorICAweDBjNWNiYWZhLCAweDQ0MzdmMTA3LCAweGI2ZTc5OTYyLCAweDQyZDJkODE2LCAweDBhOTYxMjg4LCAweGUxYTVjMDZlLAorICAweDEzNzQ5ZTY3LCAweDcyZmMwODFhLCAweGIxZDEzOWY3LCAweGY5NTgzNzQ1LCAweGNmMTlkZjU4LCAweGJlYzNmNzU2LAorICAweGMwNmViYTMwLCAweDA3MjExYjI0LCAweDQ1YzI4ODI5LCAweGM5NWUzMTdmLCAweGJjOGVjNTExLCAweDM4YmM0NmU5LAorICAweGM2ZTZmYTE0LCAweGJhZTg1ODRhLCAweGFkNGViYzQ2LCAweDQ2OGY1MDhiLCAweDc4Mjk0MzVmLCAweGYxMjQxODNiLAorICAweDgyMWRiYTlmLCAweGFmZjYwZmY0LCAweGVhMmM0ZTZkLCAweDE2ZTM5MjY0LCAweDkyNTQ0YThiLCAweDAwOWI0ZmMzLAorICAweGFiYTY4Y2VkLCAweDlhYzk2Zjc4LCAweDA2YTViNzlhLCAweGIyODU2ZTZlLCAweDFhZWMzY2E5LCAweGJlODM4Njg4LAorICAweDBlMDgwNGU5LCAweDU1ZjFiZTU2LCAweGU3ZTUzNjNiLCAweGIzYTFmMjVkLCAweGY3ZGViYjg1LCAweDYxZmUwMzNjLAorICAweDE2NzQ2MjMzLCAweDNjMDM0YzI4LCAweGRhNmQwYzc0LCAweDc5YWFjNTZjLCAweDNjZTRlMWFkLCAweDUxZjBjODAyLAorICAweDk4ZjhmMzVhLCAweDE2MjZhNDlmLCAweGVlZDgyYjI5LCAweDFkMzgyZmUzLCAweDBjNGZiOTlhLCAweGJiMzI1Nzc4LAorICAweDNlYzZkOTdiLCAweDZlNzdhNmE5LCAweGNiNjU4YjVjLCAweGQ0NTIzMGM3LCAweDJiZDE0MDhiLCAweDYwYzAzZWI3LAorICAweGI5MDY4ZDc4LCAweGEzMzc1NGY0LCAweGY0MzBjODdkLCAweGM4YTcxMzAyLCAweGI5NmQ4YzMyLCAweGViZDRlN2JlLAorICAweGJlOGI5ZDJkLCAweDc5NzlmYjA2LCAweGU3MjI1MzA4LCAweDhiNzVjZjc3LCAweDExZWY4ZGE0LCAweGUwODNjODU4LAorICAweDhkNmI3ODZmLCAweDVhNjMxN2E2LCAweGZhNWNmN2EwLCAweDVkZGEwMDMzLCAweGYyOGViZmIwLCAweGY1YjljMzEwLAorICAweGEwZWFjMjgwLCAweDA4Yjk3NjdhLCAweGEzZDlkMmIwLCAweDc5ZDM0MjE3LCAweDAyMWE3MThkLCAweDlhYzYzMzZhLAorICAweDI3MTFmZDYwLCAweDQzODA1MGUzLCAweDA2OTkwOGE4LCAweDNkN2ZlZGM0LCAweDgyNmQyYmVmLCAweDRlZWI4NDc2LAorICAweDQ4OGRjZjI1LCAweDM2YzlkNTY2LCAweDI4ZTc0ZTQxLCAweGMyNjEwYWNhLCAweDNkNDlhOWNmLCAweGJhZTNiOWRmLAorICAweGI2NWY4ZGU2LCAweDkyYWVhZjY0LCAweDNhYzdkNWU2LCAweDllYTgwNTA5LCAweGYyMmIwMTdkLCAweGE0MTczZjcwLAorICAweGRkMWUxNmMzLCAweDE1ZTBkN2Y5LCAweDUwYjFiODg3LCAweDJiOWY0ZmQ1LCAweDYyNWFiYTgyLCAweDZhMDE3OTYyLAorICAweDJlYzAxYjljLCAweDE1NDg4YWE5LCAweGQ3MTZlNzQwLCAweDQwMDU1YTJjLCAweDkzZDI5YTIyLCAweGUzMmRiZjlhLAorICAweDA1ODc0NWI5LCAweDM0NTNkYzFlLCAweGQ2OTkyOTZlLCAweDQ5NmNmZjZmLCAweDFjOWY0OTg2LCAweGRmZTJlZDA3LAorICAweGI4NzI0MmQxLCAweDE5ZGU3ZWFlLCAweDA1M2U1NjFhLCAweDE1YWQ2ZjhjLCAweDY2NjI2YzFjLCAweDcxNTRjMjRjLAorICAweGVhMDgyYjJhLCAweDkzZWIyOTM5LCAweDE3ZGNiMGYwLCAweDU4ZDRmMmFlLCAweDllYTI5NGZiLCAweDUyY2Y1NjRjLAorICAweDk4ODNmZTY2LCAweDJlYzQwNTgxLCAweDc2Mzk1M2MzLCAweDAxZDY2OTJlLCAweGQzYTBjMTA4LCAweGExZTcxNjBlLAorICAweGU0ZjJkZmE2LCAweDY5M2VkMjg1LCAweDc0OTA0Njk4LCAweDRjMmIwZWRkLCAweDRmNzU3NjU2LCAweDVkMzkzMzc4LAorICAweGExMzIyMzRmLCAweDNkMzIxYzVkLCAweGMzZjVlMTk0LCAweDRiMjY5MzAxLCAweGM3OWYwMjJmLCAweDNjOTk3ZTdlLAorICAweDVlNGY5NTA0LCAweDNmZmFmYmJkLCAweDc2ZjdhZDBlLCAweDI5NjY5M2Y0LCAweDNkMWZjZTZmLCAweGM2MWU0NWJlLAorICAweGQzYjVhYjM0LCAweGY3MmJmOWI3LCAweDFiMDQzNGMwLCAweDRlNzJiNTY3LCAweDU1OTJhMzNkLCAweGI1MjI5MzAxLAorICAweGNmZDJhODdmLCAweDYwYWViNzY3LCAweDE4MTQzODZiLCAweDMwYmNjMzNkLCAweDM4YTBjMDdkLCAweGZkMTYwNmYyLAorICAweGMzNjM1MTliLCAweDU4OWRkMzkwLCAweDU0NzlmOGU2LCAweDFjYjhkNjQ3LCAweDk3ZmQ2MWE5LCAweGVhNzc1OWY0LAorICAweDJkNTc1MzlkLCAweDU2OWE1OGNmLCAweGU4NGU2M2FkLCAweDQ2MmUxYjc4LCAweDY1ODBmODdlLCAweGYzODE3OTE0LAorICAweDkxZGE1NWY0LCAweDQwYTIzMGYzLCAweGQxOTg4ZjM1LCAweGI2ZTMxOGQyLCAweDNmZmE1MGJjLCAweDNkNDBmMDIxLAorICAweGMzYzBiZGFlLCAweDQ5NThjMjRjLCAweDUxOGYzNmIyLCAweDg0YjFkMzcwLCAweDBmZWRjZTgzLCAweDg3OGRkYWRhLAorICAweGYyYTI3OWM3LCAweDk0ZTAxYmU4LCAweDkwNzE2ZjRiLCAweDk1NGI4YWEzCit9OworCitzdGF0aWMgdWludDMyIFM4W10gPSB7CisgIDB4ZTIxNjMwMGQsIDB4YmJkZGZmZmMsIDB4YTdlYmRhYmQsIDB4MzU2NDgwOTUsIDB4Nzc4OWY4YjcsIDB4ZTZjMTEyMWIsCisgIDB4MGUyNDE2MDAsIDB4MDUyY2U4YjUsIDB4MTFhOWNmYjAsIDB4ZTU5NTJmMTEsIDB4ZWNlNzk5MGEsIDB4OTM4NmQxNzQsCisgIDB4MmE0MjkzMWMsIDB4NzZlMzgxMTEsIDB4YjEyZGVmM2EsIDB4MzdkZGRkZmMsIDB4ZGU5YWRlYjEsIDB4MGEwY2MzMmMsCisgIDB4YmUxOTcwMjksIDB4ODRhMDA5NDAsIDB4YmIyNDNhMGYsIDB4YjRkMTM3Y2YsIDB4YjQ0ZTc5ZjAsIDB4MDQ5ZWVkZmQsCisgIDB4MGIxNWExNWQsIDB4NDgwZDMxNjgsIDB4OGJiYmRlNWEsIDB4NjY5ZGVkNDIsIDB4YzdlY2U4MzEsIDB4M2Y4Zjk1ZTcsCisgIDB4NzJkZjE5MWIsIDB4NzU4MDMzMGQsIDB4OTQwNzQyNTEsIDB4NWM3ZGNkZmEsIDB4YWJiZTZkNjMsIDB4YWE0MDIxNjQsCisgIDB4YjMwMWQ0MGEsIDB4MDJlN2QxY2EsIDB4NTM1NzFkYWUsIDB4N2EzMTgyYTIsIDB4MTJhOGRkZWMsIDB4ZmRhYTMzNWQsCisgIDB4MTc2ZjQzZTgsIDB4NzFmYjQ2ZDQsIDB4MzgxMjkwMjIsIDB4Y2U5NDlhZDQsIDB4Yjg0NzY5YWQsIDB4OTY1YmQ4NjIsCisgIDB4ODJmM2QwNTUsIDB4NjZmYjk3NjcsIDB4MTViODBiNGUsIDB4MWQ1YjQ3YTAsIDB4NGNmZGUwNmYsIDB4YzI4ZWM0YjgsCisgIDB4NTdlODcyNmUsIDB4NjQ3YTc4ZmMsIDB4OTk4NjVkNDQsIDB4NjA4YmQ1OTMsIDB4NmMyMDBlMDMsIDB4MzlkYzVmZjYsCisgIDB4NWQwYjAwYTMsIDB4YWU2M2FmZjIsIDB4N2U4YmQ2MzIsIDB4NzAxMDhjMGMsIDB4YmJkMzUwNDksIDB4Mjk5OGRmMDQsCisgIDB4OTgwY2Y0MmEsIDB4OWI2ZGY0OTEsIDB4OWU3ZWRkNTMsIDB4MDY5MTg1NDgsIDB4NThjYjdlMDcsIDB4M2I3NGVmMmUsCisgIDB4NTIyZmZmYjEsIDB4ZDI0NzA4Y2MsIDB4MWM3ZTI3Y2QsIDB4YTRlYjIxNWIsIDB4M2NmMWQyZTIsIDB4MTliNDdhMzgsCisgIDB4NDI0Zjc2MTgsIDB4MzU4NTYwMzksIDB4OWQxN2RlZTcsIDB4MjdlYjM1ZTYsIDB4YzlhZmY2N2IsIDB4MzZiYWY1YjgsCisgIDB4MDljNDY3Y2QsIDB4YzE4OTEwYjEsIDB4ZTExZGJmN2IsIDB4MDZjZDFhZjgsIDB4NzE3MGM2MDgsIDB4MmQ1ZTMzNTQsCisgIDB4ZDRkZTQ5NWEsIDB4NjRjNmQwMDYsIDB4YmNjMGM2MmMsIDB4M2RkMDBkYjMsIDB4NzA4ZjhmMzQsIDB4NzdkNTFiNDIsCisgIDB4MjY0ZjYyMGYsIDB4MjRiOGQyYmYsIDB4MTVjMWI3OWUsIDB4NDZhNTI1NjQsIDB4ZjhkN2U1NGUsIDB4M2UzNzgxNjAsCisgIDB4Nzg5NWNkYTUsIDB4ODU5YzE1YTUsIDB4ZTY0NTk3ODgsIDB4YzM3YmM3NWYsIDB4ZGIwN2JhMGMsIDB4MDY3NmEzYWIsCisgIDB4N2YyMjliMWUsIDB4MzE4NDJlN2IsIDB4MjQyNTlmZDcsIDB4ZjhiZWY0NzIsIDB4ODM1ZmZjYjgsIDB4NmRmNGMxZjIsCisgIDB4OTZmNWIxOTUsIDB4ZmQwYWYwZmMsIDB4YjBmZTEzNGMsIDB4ZTI1MDZkM2QsIDB4NGY5YjEyZWEsIDB4ZjIxNWYyMjUsCisgIDB4YTIyMzczNmYsIDB4OWZiNGM0MjgsIDB4MjVkMDQ5NzksIDB4MzRjNzEzZjgsIDB4YzQ2MTgxODcsIDB4ZWE3YTZlOTgsCisgIDB4N2NkMTZlZmMsIDB4MTQzNjg3NmMsIDB4ZjE1NDQxMDcsIDB4YmVkZWVlMTQsIDB4NTZlOWFmMjcsIDB4YTA0YWE0NDEsCisgIDB4M2NmN2M4OTksIDB4OTJlY2JhZTYsIDB4ZGQ2NzAxNmQsIDB4MTUxNjgyZWIsIDB4YTg0MmVlZGYsIDB4ZmRiYTYwYjQsCisgIDB4ZjE5MDdiNzUsIDB4MjBlMzAzMGYsIDB4MjRkOGMyOWUsIDB4ZTEzOTY3M2IsIDB4ZWZhNjNmYjgsIDB4NzE4NzMwNTQsCisgIDB4YjZmMmNmM2IsIDB4OWYzMjY0NDIsIDB4Y2IxNWE0Y2MsIDB4YjAxYTQ1MDQsIDB4ZjFlNDdkOGQsIDB4ODQ0YTFiZTUsCisgIDB4YmFlN2RmZGMsIDB4NDJjYmRhNzAsIDB4Y2Q3ZGFlMGEsIDB4NTdlODViN2EsIDB4ZDUzZjVhZjYsIDB4MjBjZjRkOGMsCisgIDB4Y2VhNGQ0MjgsIDB4NzlkMTMwYTQsIDB4MzQ4NmViZmIsIDB4MzNkM2NkZGMsIDB4Nzc4NTNiNTMsIDB4MzdlZmZjYjUsCisgIDB4YzUwNjg3NzgsIDB4ZTU4MGIzZTYsIDB4NGU2OGI4ZjQsIDB4YzVjOGIzN2UsIDB4MGQ4MDllYTIsIDB4Mzk4ZmViN2MsCisgIDB4MTMyYTRmOTQsIDB4NDNiNzk1MGUsIDB4MmZlZTdkMWMsIDB4MjIzNjEzYmQsIDB4ZGQwNmNhYTIsIDB4MzdkZjkzMmIsCisgIDB4YzQyNDgyODksIDB4YWNmM2ViYzMsIDB4NTcxNWY2YjcsIDB4ZWYzNDc4ZGQsIDB4ZjI2NzYxNmYsIDB4YzE0OGNiZTQsCisgIDB4OTA1MjgxNWUsIDB4NWU0MTBmYWIsIDB4YjQ4YTI0NjUsIDB4MmVkYTdmYTQsIDB4ZTg3YjQwZTQsIDB4ZTk4ZWEwODQsCisgIDB4NTg4OWU5ZTEsIDB4ZWZkMzkwZmMsIDB4ZGQwN2QzNWIsIDB4ZGI0ODU2OTQsIDB4MzhkN2U1YjIsIDB4NTc3MjAxMDEsCisgIDB4NzMwZWRlYmMsIDB4NWI2NDMxMTMsIDB4OTQ5MTdlNGYsIDB4NTAzYzJmYmEsIDB4NjQ2ZjEyODIsIDB4NzUyM2QyNGEsCisgIDB4ZTA3Nzk2OTUsIDB4ZjljMTdhOGYsIDB4N2E1YjIxMjEsIDB4ZDE4N2I4OTYsIDB4MjkyNjNhNGQsIDB4YmE1MTBjZGYsCisgIDB4ODFmNDdjOWYsIDB4YWQxMTYzZWQsIDB4ZWE3YjU5NjUsIDB4MWEwMDcyNmUsIDB4MTE0MDMwOTIsIDB4MDBkYTZkNzcsCisgIDB4NGEwY2RkNjEsIDB4YWQxZjQ2MDMsIDB4NjA1YmRmYjAsIDB4OWVlZGMzNjQsIDB4MjJlYmU2YTgsIDB4Y2VlN2QyOGEsCisgIDB4YTBlNzM2YTAsIDB4NTU2NGE2YjksIDB4MTA4NTMyMDksIDB4YzdlYjhmMzcsIDB4MmRlNzA1Y2EsIDB4ODk1MTU3MGYsCisgIDB4ZGYwOTgyMmIsIDB4YmQ2OTFhNmMsIDB4YWExMmU0ZjIsIDB4ODc0NTFjMGYsIDB4ZTBmNmEyN2EsIDB4M2FkYTQ4MTksCisgIDB4NGNmMTc2NGYsIDB4MGQ3NzFjMmIsIDB4NjdjZGIxNTYsIDB4MzUwZDgzODQsIDB4NTkzOGZhMGYsIDB4NDIzOTllZjMsCisgIDB4MzY5OTdiMDcsIDB4MGU4NDA5M2QsIDB4NGFhOTNlNjEsIDB4ODM2MGQ4N2IsIDB4MWZhOThiMGMsIDB4MTE0OTM4MmMsCisgIDB4ZTk3NjI1YTUsIDB4MDYxNGQxYjcsIDB4MGUyNTI0NGIsIDB4MGM3NjgzNDcsIDB4NTg5ZThkODIsIDB4MGQyMDU5ZDEsCisgIDB4YTQ2NmJiMWUsIDB4ZjhkYTBhODIsIDB4MDRmMTkxMzAsIDB4YmE2ZTRlYzAsIDB4OTkyNjUxNjQsIDB4MWVlNzIzMGQsCisgIDB4NTBiMmFkODAsIDB4ZWFlZTY4MDEsIDB4OGRiMmEyODMsIDB4ZWE4YmY1OWUKK307CisKKy8qIEluaXRpYWxpemUgYSBrZXkgc2NoZWR1bGUgZnJvbSBhIDEyOC1iaXQga2V5ICovCisKK3N0YXRpYyB2b2lkCitjYXN0X2tleV9zY2hlZChzY2hlZCwga2V5KQorICAgICBDYXN0S2V5U2NoZWQgKiBzY2hlZDsKKyAgICAgdWludDhwIGtleTsKK3sKKyAgICB1aW50OHAgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4OCwgeDksIHhBLCB4QiwgeEMsIHhELCB4RSwgeEY7CisgICAgdWludDhwIHowLCB6MSwgejIsIHozLCB6NCwgejUsIHo2LCB6NywgejgsIHo5LCB6QSwgekIsIHpDLCB6RCwgekUsIHpGOworICAgIHVpbnQzMiBYMDMsIFg0NywgWDhCLCBYQ0YsIFowMywgWjQ3LCBaOEIsIFpDRjsKKworI2lmZGVmIExJVFRMRV9FTkRJQU4KKyAgICB4MyA9ICh1aW50OHApICZYMDM7ICB4MiA9IHgzICsgMTsgIHgxID0geDIgKyAxOyAgeDAgPSB4MSArIDE7CisgICAgeDcgPSAodWludDhwKSAmWDQ3OyAgeDYgPSB4NyArIDE7ICB4NSA9IHg2ICsgMTsgIHg0ID0geDUgKyAxOworICAgIHhCID0gKHVpbnQ4cCkgJlg4QjsgIHhBID0geEIgKyAxOyAgeDkgPSB4QSArIDE7ICB4OCA9IHg5ICsgMTsKKyAgICB4RiA9ICh1aW50OHApICZYQ0Y7ICB4RSA9IHhGICsgMTsgIHhEID0geEUgKyAxOyAgeEMgPSB4RCArIDE7CisgICAgejMgPSAodWludDhwKSAmWjAzOyAgejIgPSB6MyArIDE7ICB6MSA9IHoyICsgMTsgIHowID0gejEgKyAxOworICAgIHo3ID0gKHVpbnQ4cCkgJlo0NzsgIHo2ID0gejcgKyAxOyAgejUgPSB6NiArIDE7ICB6NCA9IHo1ICsgMTsKKyAgICB6QiA9ICh1aW50OHApICZaOEI7ICB6QSA9IHpCICsgMTsgIHo5ID0gekEgKyAxOyAgejggPSB6OSArIDE7CisgICAgekYgPSAodWludDhwKSAmWkNGOyAgekUgPSB6RiArIDE7ICB6RCA9IHpFICsgMTsgIHpDID0gekQgKyAxOworI2Vsc2UKKyAgICB4MCA9ICh1aW50OHApICZYMDM7ICB4MSA9IHgwICsgMTsgIHgyID0geDEgKyAxOyAgeDMgPSB4MiArIDE7CisgICAgeDQgPSAodWludDhwKSAmWDQ3OyAgeDUgPSB4NCArIDE7ICB4NiA9IHg1ICsgMTsgIHg3ID0geDYgKyAxOworICAgIHg4ID0gKHVpbnQ4cCkgJlg4QjsgIHg5ID0geDggKyAxOyAgeEEgPSB4OSArIDE7ICB4QiA9IHhBICsgMTsKKyAgICB4QyA9ICh1aW50OHApICZYQ0Y7ICB4RCA9IHhDICsgMTsgIHhFID0geEQgKyAxOyAgeEYgPSB4RSArIDE7CisgICAgejAgPSAodWludDhwKSAmWjAzOyAgejEgPSB6MCArIDE7ICB6MiA9IHoxICsgMTsgIHozID0gejIgKyAxOworICAgIHo0ID0gKHVpbnQ4cCkgJlo0NzsgIHo1ID0gejQgKyAxOyAgejYgPSB6NSArIDE7ICB6NyA9IHo2ICsgMTsKKyAgICB6OCA9ICh1aW50OHApICZaOEI7ICB6OSA9IHo4ICsgMTsgIHpBID0gejkgKyAxOyAgekIgPSB6QSArIDE7CisgICAgekMgPSAodWludDhwKSAmWkNGOyAgekQgPSB6QyArIDE7ICB6RSA9IHpEICsgMTsgIHpGID0gekUgKyAxOworI2VuZGlmCisKKyNpZmRlZiBMSVRUTEVfRU5ESUFOCisgICAgKngwID0ga2V5WzBdOworICAgICp4MSA9IGtleVsxXTsKKyAgICAqeDIgPSBrZXlbMl07CisgICAgKngzID0ga2V5WzNdOworICAgICp4NCA9IGtleVs0XTsKKyAgICAqeDUgPSBrZXlbNV07CisgICAgKng2ID0ga2V5WzZdOworICAgICp4NyA9IGtleVs3XTsKKyAgICAqeDggPSBrZXlbOF07CisgICAgKng5ID0ga2V5WzldOworICAgICp4QSA9IGtleVsxMF07CisgICAgKnhCID0ga2V5WzExXTsKKyAgICAqeEMgPSBrZXlbMTJdOworICAgICp4RCA9IGtleVsxM107CisgICAgKnhFID0ga2V5WzE0XTsKKyAgICAqeEYgPSBrZXlbMTVdOworI2Vsc2UKKyAgICBYMDMgPSAqKHVpbnQzMnApIGtleTsKKyAgICBYNDcgPSAqKHVpbnQzMnApIChrZXkgKyA0KTsKKyAgICBYOEIgPSAqKHVpbnQzMnApIChrZXkgKyA4KTsKKyAgICBYQ0YgPSAqKHVpbnQzMnApIChrZXkgKyAxMik7CisjZW5kaWYKKworICAvKiBGaXJzdCBoYWxmIG9mIGtleSBzY2hlZHVsZSAqLworCisgICAgWjAzID0gWDAzIF4gUzVbKnhEXSBeIFM2Wyp4Rl0gXiBTN1sqeENdIF4gUzhbKnhFXSBeIFM3Wyp4OF07CisgICAgWjQ3ID0gWDhCIF4gUzVbKnowXSBeIFM2Wyp6Ml0gXiBTN1sqejFdIF4gUzhbKnozXSBeIFM4Wyp4QV07CisgICAgWjhCID0gWENGIF4gUzVbKno3XSBeIFM2Wyp6Nl0gXiBTN1sqejVdIF4gUzhbKno0XSBeIFM1Wyp4OV07CisgICAgWkNGID0gWDQ3IF4gUzVbKnpBXSBeIFM2Wyp6OV0gXiBTN1sqekJdIF4gUzhbKno4XSBeIFM2Wyp4Ql07CisKKyAgICBzY2hlZC0+S1swXS5LbSA9IFM1Wyp6OF0gXiBTNlsqejldIF4gUzdbKno3XSBeIFM4Wyp6Nl0gXiBTNVsqejJdOworICAgIHNjaGVkLT5LWzFdLkttID0gUzVbKnpBXSBeIFM2Wyp6Ql0gXiBTN1sqejVdIF4gUzhbKno0XSBeIFM2Wyp6Nl07CisgICAgc2NoZWQtPktbMl0uS20gPSBTNVsqekNdIF4gUzZbKnpEXSBeIFM3Wyp6M10gXiBTOFsqejJdIF4gUzdbKno5XTsKKyAgICBzY2hlZC0+S1szXS5LbSA9IFM1Wyp6RV0gXiBTNlsqekZdIF4gUzdbKnoxXSBeIFM4Wyp6MF0gXiBTOFsqekNdOworCisgICAgWDAzID0gWjhCIF4gUzVbKno1XSBeIFM2Wyp6N10gXiBTN1sqejRdIF4gUzhbKno2XSBeIFM3Wyp6MF07CisgICAgWDQ3ID0gWjAzIF4gUzVbKngwXSBeIFM2Wyp4Ml0gXiBTN1sqeDFdIF4gUzhbKngzXSBeIFM4Wyp6Ml07CisgICAgWDhCID0gWjQ3IF4gUzVbKng3XSBeIFM2Wyp4Nl0gXiBTN1sqeDVdIF4gUzhbKng0XSBeIFM1Wyp6MV07CisgICAgWENGID0gWkNGIF4gUzVbKnhBXSBeIFM2Wyp4OV0gXiBTN1sqeEJdIF4gUzhbKng4XSBeIFM2Wyp6M107CisKKyAgICBzY2hlZC0+S1s0XS5LbSA9IFM1Wyp4M10gXiBTNlsqeDJdIF4gUzdbKnhDXSBeIFM4Wyp4RF0gXiBTNVsqeDhdOworICAgIHNjaGVkLT5LWzVdLkttID0gUzVbKngxXSBeIFM2Wyp4MF0gXiBTN1sqeEVdIF4gUzhbKnhGXSBeIFM2Wyp4RF07CisgICAgc2NoZWQtPktbNl0uS20gPSBTNVsqeDddIF4gUzZbKng2XSBeIFM3Wyp4OF0gXiBTOFsqeDldIF4gUzdbKngzXTsKKyAgICBzY2hlZC0+S1s3XS5LbSA9IFM1Wyp4NV0gXiBTNlsqeDRdIF4gUzdbKnhBXSBeIFM4Wyp4Ql0gXiBTOFsqeDddOworCisgICAgWjAzID0gWDAzIF4gUzVbKnhEXSBeIFM2Wyp4Rl0gXiBTN1sqeENdIF4gUzhbKnhFXSBeIFM3Wyp4OF07CisgICAgWjQ3ID0gWDhCIF4gUzVbKnowXSBeIFM2Wyp6Ml0gXiBTN1sqejFdIF4gUzhbKnozXSBeIFM4Wyp4QV07CisgICAgWjhCID0gWENGIF4gUzVbKno3XSBeIFM2Wyp6Nl0gXiBTN1sqejVdIF4gUzhbKno0XSBeIFM1Wyp4OV07CisgICAgWkNGID0gWDQ3IF4gUzVbKnpBXSBeIFM2Wyp6OV0gXiBTN1sqekJdIF4gUzhbKno4XSBeIFM2Wyp4Ql07CisKKyAgICBzY2hlZC0+S1s4XS5LbSA9IFM1Wyp6M10gXiBTNlsqejJdIF4gUzdbKnpDXSBeIFM4Wyp6RF0gXiBTNVsqejldOworICAgIHNjaGVkLT5LWzldLkttID0gUzVbKnoxXSBeIFM2Wyp6MF0gXiBTN1sqekVdIF4gUzhbKnpGXSBeIFM2Wyp6Q107CisgICAgc2NoZWQtPktbMTBdLkttID0gUzVbKno3XSBeIFM2Wyp6Nl0gXiBTN1sqejhdIF4gUzhbKno5XSBeIFM3Wyp6Ml07CisgICAgc2NoZWQtPktbMTFdLkttID0gUzVbKno1XSBeIFM2Wyp6NF0gXiBTN1sqekFdIF4gUzhbKnpCXSBeIFM4Wyp6Nl07CisKKyAgICBYMDMgPSBaOEIgXiBTNVsqejVdIF4gUzZbKno3XSBeIFM3Wyp6NF0gXiBTOFsqejZdIF4gUzdbKnowXTsKKyAgICBYNDcgPSBaMDMgXiBTNVsqeDBdIF4gUzZbKngyXSBeIFM3Wyp4MV0gXiBTOFsqeDNdIF4gUzhbKnoyXTsKKyAgICBYOEIgPSBaNDcgXiBTNVsqeDddIF4gUzZbKng2XSBeIFM3Wyp4NV0gXiBTOFsqeDRdIF4gUzVbKnoxXTsKKyAgICBYQ0YgPSBaQ0YgXiBTNVsqeEFdIF4gUzZbKng5XSBeIFM3Wyp4Ql0gXiBTOFsqeDhdIF4gUzZbKnozXTsKKworICAgIHNjaGVkLT5LWzEyXS5LbSA9IFM1Wyp4OF0gXiBTNlsqeDldIF4gUzdbKng3XSBeIFM4Wyp4Nl0gXiBTNVsqeDNdOworICAgIHNjaGVkLT5LWzEzXS5LbSA9IFM1Wyp4QV0gXiBTNlsqeEJdIF4gUzdbKng1XSBeIFM4Wyp4NF0gXiBTNlsqeDddOworICAgIHNjaGVkLT5LWzE0XS5LbSA9IFM1Wyp4Q10gXiBTNlsqeERdIF4gUzdbKngzXSBeIFM4Wyp4Ml0gXiBTN1sqeDhdOworICAgIHNjaGVkLT5LWzE1XS5LbSA9IFM1Wyp4RV0gXiBTNlsqeEZdIF4gUzdbKngxXSBeIFM4Wyp4MF0gXiBTOFsqeERdOworCisgIC8qIFNlY29uZCBoYWxmIG9mIGtleSBzY2hlZHVsZSAtIGp1c3QgbGlrZSBmaXJzdCBoYWxmICovCisKKyAgICBaMDMgPSBYMDMgXiBTNVsqeERdIF4gUzZbKnhGXSBeIFM3Wyp4Q10gXiBTOFsqeEVdIF4gUzdbKng4XTsKKyAgICBaNDcgPSBYOEIgXiBTNVsqejBdIF4gUzZbKnoyXSBeIFM3Wyp6MV0gXiBTOFsqejNdIF4gUzhbKnhBXTsKKyAgICBaOEIgPSBYQ0YgXiBTNVsqejddIF4gUzZbKno2XSBeIFM3Wyp6NV0gXiBTOFsqejRdIF4gUzVbKng5XTsKKyAgICBaQ0YgPSBYNDcgXiBTNVsqekFdIF4gUzZbKno5XSBeIFM3Wyp6Ql0gXiBTOFsqejhdIF4gUzZbKnhCXTsKKworICAgIHNjaGVkLT5LWzBdLktyID0gKFM1Wyp6OF0gXiBTNlsqejldIF4gUzdbKno3XSBeIFM4Wyp6Nl0gXiBTNVsqejJdKSAmIDB4MWY7CisgICAgc2NoZWQtPktbMV0uS3IgPSAoUzVbKnpBXSBeIFM2Wyp6Ql0gXiBTN1sqejVdIF4gUzhbKno0XSBeIFM2Wyp6Nl0pICYgMHgxZjsKKyAgICBzY2hlZC0+S1syXS5LciA9IChTNVsqekNdIF4gUzZbKnpEXSBeIFM3Wyp6M10gXiBTOFsqejJdIF4gUzdbKno5XSkgJiAweDFmOworICAgIHNjaGVkLT5LWzNdLktyID0gKFM1Wyp6RV0gXiBTNlsqekZdIF4gUzdbKnoxXSBeIFM4Wyp6MF0gXiBTOFsqekNdKSAmIDB4MWY7CisKKyAgICBYMDMgPSBaOEIgXiBTNVsqejVdIF4gUzZbKno3XSBeIFM3Wyp6NF0gXiBTOFsqejZdIF4gUzdbKnowXTsKKyAgICBYNDcgPSBaMDMgXiBTNVsqeDBdIF4gUzZbKngyXSBeIFM3Wyp4MV0gXiBTOFsqeDNdIF4gUzhbKnoyXTsKKyAgICBYOEIgPSBaNDcgXiBTNVsqeDddIF4gUzZbKng2XSBeIFM3Wyp4NV0gXiBTOFsqeDRdIF4gUzVbKnoxXTsKKyAgICBYQ0YgPSBaQ0YgXiBTNVsqeEFdIF4gUzZbKng5XSBeIFM3Wyp4Ql0gXiBTOFsqeDhdIF4gUzZbKnozXTsKKworICAgIHNjaGVkLT5LWzRdLktyID0gKFM1Wyp4M10gXiBTNlsqeDJdIF4gUzdbKnhDXSBeIFM4Wyp4RF0gXiBTNVsqeDhdKSAmIDB4MWY7CisgICAgc2NoZWQtPktbNV0uS3IgPSAoUzVbKngxXSBeIFM2Wyp4MF0gXiBTN1sqeEVdIF4gUzhbKnhGXSBeIFM2Wyp4RF0pICYgMHgxZjsKKyAgICBzY2hlZC0+S1s2XS5LciA9IChTNVsqeDddIF4gUzZbKng2XSBeIFM3Wyp4OF0gXiBTOFsqeDldIF4gUzdbKngzXSkgJiAweDFmOworICAgIHNjaGVkLT5LWzddLktyID0gKFM1Wyp4NV0gXiBTNlsqeDRdIF4gUzdbKnhBXSBeIFM4Wyp4Ql0gXiBTOFsqeDddKSAmIDB4MWY7CisKKyAgICBaMDMgPSBYMDMgXiBTNVsqeERdIF4gUzZbKnhGXSBeIFM3Wyp4Q10gXiBTOFsqeEVdIF4gUzdbKng4XTsKKyAgICBaNDcgPSBYOEIgXiBTNVsqejBdIF4gUzZbKnoyXSBeIFM3Wyp6MV0gXiBTOFsqejNdIF4gUzhbKnhBXTsKKyAgICBaOEIgPSBYQ0YgXiBTNVsqejddIF4gUzZbKno2XSBeIFM3Wyp6NV0gXiBTOFsqejRdIF4gUzVbKng5XTsKKyAgICBaQ0YgPSBYNDcgXiBTNVsqekFdIF4gUzZbKno5XSBeIFM3Wyp6Ql0gXiBTOFsqejhdIF4gUzZbKnhCXTsKKworICAgIHNjaGVkLT5LWzhdLktyID0gKFM1Wyp6M10gXiBTNlsqejJdIF4gUzdbKnpDXSBeIFM4Wyp6RF0gXiBTNVsqejldKSAmIDB4MWY7CisgICAgc2NoZWQtPktbOV0uS3IgPSAoUzVbKnoxXSBeIFM2Wyp6MF0gXiBTN1sqekVdIF4gUzhbKnpGXSBeIFM2Wyp6Q10pICYgMHgxZjsKKyAgICBzY2hlZC0+S1sxMF0uS3IgPSAoUzVbKno3XSBeIFM2Wyp6Nl0gXiBTN1sqejhdIF4gUzhbKno5XSBeIFM3Wyp6Ml0pICYgMHgxZjsKKyAgICBzY2hlZC0+S1sxMV0uS3IgPSAoUzVbKno1XSBeIFM2Wyp6NF0gXiBTN1sqekFdIF4gUzhbKnpCXSBeIFM4Wyp6Nl0pICYgMHgxZjsKKworICAgIFgwMyA9IFo4QiBeIFM1Wyp6NV0gXiBTNlsqejddIF4gUzdbKno0XSBeIFM4Wyp6Nl0gXiBTN1sqejBdOworICAgIFg0NyA9IFowMyBeIFM1Wyp4MF0gXiBTNlsqeDJdIF4gUzdbKngxXSBeIFM4Wyp4M10gXiBTOFsqejJdOworICAgIFg4QiA9IFo0NyBeIFM1Wyp4N10gXiBTNlsqeDZdIF4gUzdbKng1XSBeIFM4Wyp4NF0gXiBTNVsqejFdOworICAgIFhDRiA9IFpDRiBeIFM1Wyp4QV0gXiBTNlsqeDldIF4gUzdbKnhCXSBeIFM4Wyp4OF0gXiBTNlsqejNdOworCisgICAgc2NoZWQtPktbMTJdLktyID0gKFM1Wyp4OF0gXiBTNlsqeDldIF4gUzdbKng3XSBeIFM4Wyp4Nl0gXiBTNVsqeDNdKSAmIDB4MWY7CisgICAgc2NoZWQtPktbMTNdLktyID0gKFM1Wyp4QV0gXiBTNlsqeEJdIF4gUzdbKng1XSBeIFM4Wyp4NF0gXiBTNlsqeDddKSAmIDB4MWY7CisgICAgc2NoZWQtPktbMTRdLktyID0gKFM1Wyp4Q10gXiBTNlsqeERdIF4gUzdbKngzXSBeIFM4Wyp4Ml0gXiBTN1sqeDhdKSAmIDB4MWY7CisgICAgc2NoZWQtPktbMTVdLktyID0gKFM1Wyp4RV0gXiBTNlsqeEZdIF4gUzdbKngxXSBeIFM4Wyp4MF0gXiBTOFsqeERdKSAmIDB4MWY7Cit9CisKKy8qIEluaXRpYWxpemUgd2l0aCBhIGZ1bGwtc3RyZW5ndGggMTI4LWJpdCBrZXkgKi8KKworI2lmbmRlZiBDQVNUX0VYUE9SVF9FTkNSWVBUSU9OCit2b2lkCitja19jYXN0MTI4X2tleV9zY2hlZChzY2hlZCwga2V5KQorICAgIENhc3RLZXlTY2hlZCAqIHNjaGVkOworICAgIHVpbnQ4ICoga2V5OworeworICAgIHNjaGVkLT5rc2l6ZSA9IDE2OworICAgIGNhc3Rfa2V5X3NjaGVkKHNjaGVkLCBrZXkpOworfQorI2VuZGlmCisKKy8qIEhhbmRsZSByZWR1Y2VkLWtleXNpemUgdmFyaWFudHMgKi8KKworc3RhdGljIHZvaWQKK2Nhc3Q1X2tleV9zY2hlZChzY2hlZCwga2V5LCBzeikKKyAgICBDYXN0S2V5U2NoZWQgKiBzY2hlZDsKKyAgICB1aW50OCAqIGtleTsKKyAgICBpbnQgc3o7Cit7CisgICAgdWludDggYnVmWzE2XTsKKworICAgIHNjaGVkLT5rc2l6ZSA9IHN6OworICAgIG1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKyAgICBtZW1jcHkoYnVmLCBrZXksIHN6KTsKKyAgICBjYXN0X2tleV9zY2hlZChzY2hlZCwgYnVmKTsKK30KKworLyogNDAsIDY0LCBhbmQgODAtYml0IGtleXMgLSBhbGwgdXNlIDEyIHJvdW5kcyAqLworCit2b2lkCitja19jYXN0NV80MF9rZXlfc2NoZWQoc2NoZWQsIGtleSkKKyAgICBDYXN0S2V5U2NoZWQgKiBzY2hlZDsKKyAgICB1aW50OCAqIGtleTsKK3sKKyAgICBjYXN0NV9rZXlfc2NoZWQoc2NoZWQsIGtleSwgNSk7Cit9CisKKyNpZm5kZWYgQ0FTVF9FWFBPUlRfRU5DUllQVElPTgordm9pZAorY2tfY2FzdDVfNjRfa2V5X3NjaGVkKHNjaGVkLCBrZXkpCisgICAgIENhc3RLZXlTY2hlZCAqIHNjaGVkOworICAgICB1aW50OCAqIGtleTsKK3sKKyAgICBjYXN0NV9rZXlfc2NoZWQoc2NoZWQsIGtleSwgOCk7Cit9CisKK3ZvaWQKK2NrX2Nhc3Q1XzgwX2tleV9zY2hlZChzY2hlZCwga2V5KQorICAgICBDYXN0S2V5U2NoZWQgKiBzY2hlZDsKKyAgICAgdWludDggKiBrZXk7Cit7CisgICAgY2FzdDVfa2V5X3NjaGVkKHNjaGVkLCBrZXksIDEwKTsKK30KKyNlbmRpZiAvKiBDQVNUX0VYUE9SVF9FTkNSWVBUSU9OICovCisjZW5kaWYgLyogQ0tfQ0FTVCAqLworCisjaWZkZWYgQ1JZUFRfRExMCitzdGF0aWMgY2hhciAqCitja19jcnlwdF9kbGxfdmVyc2lvbigpCit7CisgICAgcmV0dXJuKGNrY3Jwdik7Cit9CisKK2ludAorY3J5cHRfZGxsX2luaXQoIHN0cnVjdCBfY3J5cHRfZGxsX2luaXQgKiBpbml0ICkKK3sKKyNpZmRlZiBMSUJERVMKKyAgICBleHRlcm4gaW50IGRlc19jaGVja19rZXk7CisgICAgZXh0ZXJuIHZvaWQgbGliZGVzX2RsbF9pbml0KHN0cnVjdCBfY3J5cHRfZGxsX2luaXQgKik7CisgICAgZGVzX2NoZWNrX2tleSA9IDE7CisjZW5kaWYgLyogTElCREVTICovCisKKyAgICBpZiAoIGluaXQtPnZlcnNpb24gPj0gMSApIHsKKyAgICAgICAgcF90dG9sID0gaW5pdC0+cF90dG9sOworICAgICAgICBwX2RvZGVidWcgPSBpbml0LT5wX2RvZGVidWc7CisgICAgICAgIHBfZG9oZXhkdW1wID0gaW5pdC0+cF9kb2hleGR1bXA7CisgICAgICAgIHBfdG5fZGVidWcgPSBpbml0LT5wX3RuX2RlYnVnOworICAgICAgICBwX3ZzY3JucHJpbnRmID0gaW5pdC0+cF92c2NybnByaW50ZjsKKyAgICAgICAgaWYgKCBpbml0LT52ZXJzaW9uID09IDEgKQorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKyAgICBpZiAoIGluaXQtPnZlcnNpb24gPj0gMiApIHsKKyAgICAgICAgLyogVGhpcyBpcyBhIGs1X2NvbnRleHQgYnV0IHdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSBrcmI1LmggKi8KKyAgICAgICAgcF9rNV9jb250ZXh0ID0gKHZvaWQgKikgaW5pdC0+cF9rNV9jb250ZXh0OworICAgICAgICBpZiAoIGluaXQtPnZlcnNpb24gPT0gMiApCisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgfQorICAgIGlmICggaW5pdC0+dmVyc2lvbiA+PSAzICkgeworICAgICAgICBpbml0LT5wX2luc3RhbGxfZnVuY3MoImVuY3J5cHRfcGFyc2UiLGVuY3J5cHRfcGFyc2UpOworICAgICAgICBpbml0LT5wX2luc3RhbGxfZnVuY3MoImVuY3J5cHRfaW5pdCIsZW5jcnlwdF9pbml0KTsKKyAgICAgICAgaW5pdC0+cF9pbnN0YWxsX2Z1bmNzKCJlbmNyeXB0X3Nlc3Npb25fa2V5IixlbmNyeXB0X3Nlc3Npb25fa2V5KTsKKyAgICAgICAgaW5pdC0+cF9pbnN0YWxsX2Z1bmNzKCJlbmNyeXB0X3NlbmRfcmVxdWVzdF9zdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0X3NlbmRfcmVxdWVzdF9zdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgaW5pdC0+cF9pbnN0YWxsX2Z1bmNzKCJlbmNyeXB0X3JlcXVlc3Rfc3RhcnQiLGVuY3J5cHRfcmVxdWVzdF9zdGFydCk7CisgICAgICAgIGluaXQtPnBfaW5zdGFsbF9mdW5jcygiZW5jcnlwdF9zZW5kX3JlcXVlc3RfZW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRfc2VuZF9yZXF1ZXN0X2VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgaW5pdC0+cF9pbnN0YWxsX2Z1bmNzKCJlbmNyeXB0X3JlcXVlc3RfZW5kIixlbmNyeXB0X3JlcXVlc3RfZW5kKTsKKyAgICAgICAgaW5pdC0+cF9pbnN0YWxsX2Z1bmNzKCJlbmNyeXB0X3NlbmRfZW5kIixlbmNyeXB0X3NlbmRfZW5kKTsKKyAgICAgICAgaW5pdC0+cF9pbnN0YWxsX2Z1bmNzKCJlbmNyeXB0X3NlbmRfc3VwcG9ydCIsZW5jcnlwdF9zZW5kX3N1cHBvcnQpOworICAgICAgICBpbml0LT5wX2luc3RhbGxfZnVuY3MoImVuY3J5cHRfaXNfZW5jcnlwdGluZyIsZW5jcnlwdF9pc19lbmNyeXB0aW5nKTsKKyAgICAgICAgaW5pdC0+cF9pbnN0YWxsX2Z1bmNzKCJlbmNyeXB0X2lzX2RlY3J5cHRpbmciLGVuY3J5cHRfaXNfZGVjcnlwdGluZyk7CisgICAgICAgIGluaXQtPnBfaW5zdGFsbF9mdW5jcygiZ2V0X2NyeXB0X3RhYmxlIixnZXRfY3J5cHRfdGFibGUpOworICAgICAgICBpbml0LT5wX2luc3RhbGxfZnVuY3MoImRlc19pc193ZWFrX2tleSIsY2tfZGVzX2lzX3dlYWtfa2V5KTsKKyAgICAgICAgbGliZGVzX2RsbF9pbml0KGluaXQpOworICAgICAgICBpZiAoaW5pdC0+dmVyc2lvbiA9PSAzKQorICAgICAgICAgIHJldHVybigxKTsKKyAgICB9CisgICAgaWYgKCBpbml0LT52ZXJzaW9uID49IDQgKSB7CisgICAgICAgIGluaXQtPnBfaW5zdGFsbF9mdW5jcygiY3J5cHRfZGxsX3ZlcnNpb24iLGNrX2NyeXB0X2RsbF92ZXJzaW9uKTsKKyAgICAgICAgaWYgKGluaXQtPnZlcnNpb24gPT0gNCkKKyAgICAgICAgICByZXR1cm4oMSk7CisgICAgfQorCisgICAgaWYgKCBpbml0LT52ZXJzaW9uID49IDUgKSB7CisgICAgICAgIHBfcmVxdGVsbXV0ZXggPSBpbml0LT5wX3JlcXRlbG11dGV4OworICAgICAgICBwX3JlbHRlbG11dGV4ID0gaW5pdC0+cF9yZWx0ZWxtdXRleDsKKyAgICAgICAgaWYgKGluaXQtPnZlcnNpb24gPT0gNSkKKyAgICAgICAgICByZXR1cm4oMSk7CisgICAgfQorCisgICAgaWYgKCBpbml0LT52ZXJzaW9uID49IDYgKSB7CisgICAgICAgIGluaXQtPnBfaW5zdGFsbF9mdW5jcygiZW5jcnlwdF9kb250X3N1cHBvcnQiLGVuY3J5cHRfZG9udF9zdXBwb3J0KTsKKyAgICAgICAgaWYgKCBpbml0LT52ZXJzaW9uID09IDYgKQorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAvKiB3aGVuIGFkZGluZyBuZXcgdmVyc2lvbnM7IG1pZ3JhdGUgdGhlIG5leHQgdHdvIGxpbmVzICovCisgICAgICAgIGluaXQtPnZlcnNpb24gPSA2OworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworI3VuZGVmIG1hbGxvYworI3VuZGVmIHJlYWxsb2MKKyN1bmRlZiBmcmVlCisjdW5kZWYgc3RyZHVwCisKK3N0YXRpYyB2b2lkCitmYXRhbChjaGFyICptc2cpIHsKKyAgICBpZiAoIW1zZykgbXNnID0gIiI7CisKKyAgICBwcmludGYobXNnKTsKKyAgICBleGl0KDEpOyAgICAgICAgLyogRXhpdCBpbmRpY2F0aW5nIGZhaWx1cmUgKi8KK30KKwordm9pZCAqCitrbWFsbG9jKHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnB0cjsKKworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgZmF0YWwoImttYWxsb2M6IHplcm8gc2l6ZSIpOworICAgIH0KKyAgICBwdHIgPSBtYWxsb2Moc2l6ZSk7CisgICAgaWYgKHB0ciA9PSBOVUxMKSB7CisgICAgICAgIGZhdGFsKCJrbWFsbG9jOiBvdXQgb2YgbWVtb3J5Iik7CisgICAgfQorICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKgora3JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3QgbmV3X3NpemUpCit7CisgICAgdm9pZCAqbmV3X3B0cjsKKworICAgIGlmIChuZXdfc2l6ZSA9PSAwKSB7CisgICAgICAgIGZhdGFsKCJrcmVhbGxvYzogemVybyBzaXplIik7CisgICAgfQorICAgIGlmIChwdHIgPT0gTlVMTCkKKyAgICAgICAgbmV3X3B0ciA9IG1hbGxvYyhuZXdfc2l6ZSk7CisgICAgZWxzZQorICAgICAgICBuZXdfcHRyID0gcmVhbGxvYyhwdHIsIG5ld19zaXplKTsKKyAgICBpZiAobmV3X3B0ciA9PSBOVUxMKSB7CisgICAgICAgIGZhdGFsKCJrcmVhbGxvYzogb3V0IG9mIG1lbW9yeSIpOworICAgIH0KKyAgICByZXR1cm4gbmV3X3B0cjsKK30KKwordm9pZAora2ZyZWUodm9pZCAqcHRyKQoreworICAgIGlmIChwdHIgPT0gTlVMTCkgeworICAgICAgICBwcmludGYoImtmcmVlOiBOVUxMIHBvaW50ZXIgZ2l2ZW4gYXMgYXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmcmVlKHB0cik7Cit9CisKK2NoYXIgKgora3N0cmR1cChjb25zdCBjaGFyICpzdHIpCit7CisgICAgc2l6ZV90IGxlbjsKKyAgICBjaGFyICpjcDsKKworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICBmYXRhbCgia3N0cmR1cDogTlVMTCBwb2ludGVyIGdpdmVuIGFzIGFyZ3VtZW50Iik7CisgICAgfQorICAgIGxlbiA9IHN0cmxlbihzdHIpICsgMTsKKyAgICBjcCA9IGttYWxsb2MobGVuKTsKKyAgICBpZiAoY3ApCisgICAgICAgIG1lbWNweShjcCwgc3RyLCBsZW4pOworICAgIHJldHVybiBjcDsKK30KKyNlbmRpZiAvKiBDUllQVF9ETEwgKi8KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2tfZGVzLmMgYi9ja2VybWl0LTguMC4yMTEvY2tfZGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzNDY1MgotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja19kZXMuYwpAQCAtMCwwICsxLDk4IEBACisvKgorICBDIEsgXyBEIEUgUyAuIEMgIC0gIGxpYkRFUyBpbnRlcmZhY2UgZm9yIEtlcm1pdCA5NSIKKworICBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDEsIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3CisgIFlvcmsuICBUaGUgQy1LZXJtaXQgc29mdHdhcmUgbWF5IG5vdCBiZSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgbGljZW5zZWQgb3IKKyAgc29sZCBmb3IgcHJvZml0IGFzIGEgc29mdHdhcmUgcHJvZHVjdCBpdHNlbGYsIG5vciBtYXkgaXQgYmUgaW5jbHVkZWQgaW4gb3IKKyAgZGlzdHJpYnV0ZWQgd2l0aCBjb21tZXJjaWFsIHByb2R1Y3RzIG9yIG90aGVyd2lzZSBkaXN0cmlidXRlZCBieSBjb21tZXJjaWFsCisgIGNvbmNlcm5zIHRvIHRoZWlyIGNsaWVudHMgb3IgY3VzdG9tZXJzIHdpdGhvdXQgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZQorICBPZmZpY2Ugb2YgS2VybWl0IERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24sIENvbHVtYmlhIFVuaXZlcnNpdHkuICBUaGlzCisgIGNvcHlyaWdodCBub3RpY2UgbXVzdCBub3QgYmUgcmVtb3ZlZCwgYWx0ZXJlZCwgb3Igb2JzY3VyZWQuCisKKyAgQXV0aG9yOgorICBKZWZmcmV5IEUgQWx0bWFuIChqYWx0bWFuQHNlY3VyZS1lbmRwb2ludHMuY29tKQorKi8KKworLyoKKyAgIFRoaXMgZmlsZSBjb250YWlucyB3cmFwcGVycyBzbyB0aGF0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdpbGwgYmUgaW1wb3J0ZWQKKyAgIGludG8gdGhlIGs5NWNyeXB0LmRsbC9rMmNyeXB0LmRsbCBmaWxlcyBpbiBzdWNoIGEgZm9ybSB0aGF0IHRoZXkgY2FuIGJlCisgICByZS1leHBvcnRlZCB0byBrOTUuZXhlL2syLmV4ZS4gIFRoaXMgc3Vic2V0IG9mIHRoZSBERVMgbGlicmFyeSBpcyBuZWVkZWQgdG8KKyAgIHByb3ZpZGUgREVTIGJhc2VkIEtlcmJlcm9zIGF1dGhlbnRpY2F0aW9uLgorKi8KKworCisjaWZkZWYgTElCREVTCisvKiBUaGUgZm9sbG93aW5nIGlzIHNwZWNpZmljIHRvIG15IGluc3RhbGxhdGlvbiwgYnV0IHNpbmNlIEknbSB0aGUgb25seSBvbmUgKi8KKy8qIHRoYXQgdXNlcyB0aGlzIGZpbGUgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2luY2x1ZGUgImNrY2RlYi5oIgorI2luY2x1ZGUgImNrdWF0aC5oIgorI2RlZmluZSBDS19ERVNfQworI2luY2x1ZGUgImNrdWF0Mi5oIgorI2lmZGVmIE5UCisjaWZkZWYgX01fQUxQSEEKKyNpbmNsdWRlIDxjOlxzcnBcZGVzXGRlcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxjOlxzcmNcc3JwXGRlc1xkZXMuaD4KKyNlbmRpZgorI2Vsc2UKKyNpbmNsdWRlIDxjOlxzcnBcZGVzXGRlcy5oPgorI2VuZGlmCisKK2ludAorbGliZGVzX3JhbmRvbV9rZXkoZGVzX2NibG9jayBCKQoreworICAgIGRlc19yYW5kb21fa2V5KEIpOworICAgIHJldHVybigwKTsKK30KKwordm9pZAorbGliZGVzX3JhbmRvbV9zZWVkKGRlc19jYmxvY2sgQikKK3sKKyAgICBkZXNfcmFuZG9tX3NlZWQoQik7Cit9CisKK3ZvaWQKK2xpYmRlc19rZXlfc2NoZWQoZGVzX2NibG9jayAqIEIsIGRlc19rZXlfc2NoZWR1bGUgUykKK3sKKyAgICBkZXNfa2V5X3NjaGVkKEIsUyk7Cit9CisKK3ZvaWQKK2xpYmRlc19lY2JfZW5jcnlwdChkZXNfY2Jsb2NrICogQjEsIGRlc19jYmxvY2sgKiBCMiwgZGVzX2tleV9zY2hlZHVsZSBTLCBpbnQgbikKK3sKKyAgICBkZXNfZWNiX2VuY3J5cHQoQjEsQjIsUyxuKTsKK30KKworaW50CitsaWJkZXNfc3RyaW5nX3RvX2tleShjaGFyICogcywgZGVzX2NibG9jayAqIEIpCit7CisgICAgZGVzX3N0cmluZ190b19rZXkocyxCKTsKKyAgICByZXR1cm4oMCk7Cit9CisKK3ZvaWQKK2xpYmRlc19maXh1cF9rZXlfcGFyaXR5KGRlc19jYmxvY2sgKiBCKQoreworICAgIGRlc19zZXRfb2RkX3Bhcml0eShCKTsKK30KKwordm9pZAorbGliZGVzX3BjYmNfZW5jcnlwdChkZXNfY2Jsb2NrICppbnB1dCwgZGVzX2NibG9jayAqb3V0cHV0LCBsb25nIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIGRlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUsIGRlc19jYmxvY2sgKml2ZWMsIGludCBlbmMpCit7CisgICAgZGVzX3BjYmNfZW5jcnlwdChpbnB1dCxvdXRwdXQsbGVuZ3RoLHNjaGVkdWxlLGl2ZWMsZW5jKTsKK30KKwordm9pZAorbGliZGVzX2RsbF9pbml0KHN0cnVjdCBfY3J5cHRfZGxsX2luaXQgKiBpbml0KQoreworICAgIGluaXQtPnBfaW5zdGFsbF9mdW5jcygibGliZGVzX3JhbmRvbV9rZXkiLGxpYmRlc19yYW5kb21fa2V5KTsKKyAgICBpbml0LT5wX2luc3RhbGxfZnVuY3MoImxpYmRlc19yYW5kb21fc2VlZCIsbGliZGVzX3JhbmRvbV9zZWVkKTsKKyAgICBpbml0LT5wX2luc3RhbGxfZnVuY3MoImxpYmRlc19rZXlfc2NoZWQiLGxpYmRlc19rZXlfc2NoZWQpOworICAgIGluaXQtPnBfaW5zdGFsbF9mdW5jcygibGliZGVzX2VjYl9lbmNyeXB0IixsaWJkZXNfZWNiX2VuY3J5cHQpOworICAgIGluaXQtPnBfaW5zdGFsbF9mdW5jcygibGliZGVzX3N0cmluZ190b19rZXkiLGxpYmRlc19zdHJpbmdfdG9fa2V5KTsKKyAgICBpbml0LT5wX2luc3RhbGxfZnVuY3MoImxpYmRlc19maXh1cF9rZXlfcGFyaXR5IixsaWJkZXNfZml4dXBfa2V5X3Bhcml0eSk7CisgICAgaW5pdC0+cF9pbnN0YWxsX2Z1bmNzKCJsaWJkZXNfcGNiY19lbmNyeXB0IixsaWJkZXNfcGNiY19lbmNyeXB0KTsKKworfQorI2VuZGlmIC8qIExJQkRFUyAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrX3NzbC5jIGIvY2tlcm1pdC04LjAuMjExL2NrX3NzbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNTM3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2tfc3NsLmMKQEAgLTAsMCArMSw0MjQyIEBACitjaGFyICpja3NzbHYgPSAiU1NML1RMUyBzdXBwb3J0LCA4LjAuMjIxLCAyNiBGZWIgMjAwNCI7CisvKgorICBDIEsgXyBTIFMgTCAuIEMgLS0gIE9wZW5TU0wgSW50ZXJmYWNlIGZvciBDLUtlcm1pdAorCisgIENvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisKKyAgICBBdXRob3I6ICBKZWZmcmV5IEUgQWx0bWFuIChqYWx0bWFuQHNlY3VyZS1lbmRwb2ludHMuY29tKQorICAgICAgICAgICAgICAgU2VjdXJlIEVuZHBvaW50cyBJbmMuLCBOZXcgWW9yayBDaXR5CisKKyAgUHJvdmlkZXM6CisKKyAgLiBUZWxuZXQgQXV0aCBTU0wgb3B0aW9uIGNvbXBhdGlibGUgd2l0aCBUaW0gSHVkc29uJ3MgaGFjay4KKyAgLiBUZWxuZXQgU1RBUlRfVExTIG9wdGlvbgorICAuIENvbmZpZ3VyYXRpb24gb2YgY2VydGlmaWNhdGUgYW5kIGtleSBmaWxlcworICAuIENlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhbmQgcmV2b2NhdGlvbiBsaXN0IGNoZWNrcworICAuIENsaWVudCBjZXJ0aWZpY2F0ZSB0byB1c2VyIGlkIHJvdXRpbmUKKworICBOb3RlOiBUaGlzIGNvZGUgaXMgd3JpdHRlbiB0byBiZSBjb21wYXRpYmxlIHdpdGggT3BlblNTTCAwLjkuNlthYmNkZWZnaF0KKyAgYW5kIDAuOS43IGJldGEgNS4KKyAgSXQgd2lsbCBhbHNvIGNvbXBpbGUgd2l0aCB2ZXJzaW9uIDAuOS41IGFsdGhvdWdoIHRoYXQgaXMgZGlzY291cmFnZWQKKyAgZHVlIHRvIHNlY3VyaXR5IHdlYWtuZXNzZXMgaW4gdGhhdCByZWxlYXNlLgorKi8KKworI2luY2x1ZGUgImNrY3N5bS5oIgorI2luY2x1ZGUgImNrY2RlYi5oIgorCisjaWZkZWYgQ0tfU1NMCisjaW5jbHVkZSAiY2tjbmV0LmgiCisjaW5jbHVkZSAiY2t1YXRoLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBVTklYCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2lmbmRlZiBGUkVFQlNENAorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2VuZGlmIC8qIEZSRUVCU0Q0ICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZkZWYgREVDX1RDUElQCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGluZXQuaD4KKyNlbmRpZiAvKiBERUNfVENQSVAgKi8KKworI2lmZGVmIE9TMgorZXh0ZXJuIGNoYXIgZXhlZGlyW107CisjaWZkZWYgTlQKK2NoYXIgKiBHZXRBcHBEYXRhKGludCk7CisjZW5kaWYKKyNlbmRpZiAvKiBPUzIgKi8KKworc3RhdGljIGludCBzc2xfaW5zdGFsbGVkID0gMTsKKyNlbmRpZiAvKiBDS19TU0wgKi8KK2ludAorY2tfc3NoX2lzX2luc3RhbGxlZCgpCit7CisjaWZkZWYgU1NIQlVJTFRJTgorI2lmZGVmIFNTTERMTAorI2lmZGVmIE5UCisgICAgZXh0ZXJuIEhJTlNUQU5DRSBoQ1JZUFRPOworI2Vsc2UgLyogTlQgKi8KKyAgICBleHRlcm4gSE1PRFVMRSBoQ1JZUFRPOworI2VuZGlmIC8qIE5UICovCisgICAgZGVidWcoRjExMSwiY2tfc3NoX2lzX2luc3RhbGxlZCIsImhDUllQVE8iLGhDUllQVE8pOworICAgIHJldHVybihzc2xfaW5zdGFsbGVkICYmIChoQ1JZUFRPICE9IE5VTEwpKTsKKyNlbHNlIC8qIFNTTERMTCAqLworICAgIHJldHVybihzc2xfaW5zdGFsbGVkKTsKKyNlbmRpZiAvKiBTU0xETEwgKi8KKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2NrX3NzbGVheV9pc19pbnN0YWxsZWQodm9pZCkKKyNlbHNlCitja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkKKyNlbmRpZgoreworI2lmZGVmIENLX1NTTAorI2lmZGVmIFNTTERMTAorI2lmZGVmIE5UCisgICAgZXh0ZXJuIEhJTlNUQU5DRSBoU1NMLCBoQ1JZUFRPOworI2Vsc2UgLyogTlQgKi8KKyAgICBleHRlcm4gSE1PRFVMRSBoU1NMLCBoQ1JZUFRPOworI2VuZGlmIC8qIE5UICovCisgICAgZGVidWcoRjExMSwiY2tfc3NsZWF5X2lzX2luc3RhbGxlZCIsImhTU0wiLGhTU0wpOworICAgIGRlYnVnKEYxMTEsImNrX3NzbGVheV9pc19pbnN0YWxsZWQiLCJoQ1JZUFRPIixoQ1JZUFRPKTsKKyAgICByZXR1cm4oc3NsX2luc3RhbGxlZCAmJiAoaFNTTCAhPSBOVUxMKSAmJiAoaENSWVBUTyAhPSBOVUxMKSk7CisjZWxzZSAvKiBTU0xETEwgKi8KKyAgICByZXR1cm4oc3NsX2luc3RhbGxlZCk7CisjZW5kaWYgLyogU1NMRExMICovCisjZWxzZSAvKiBDS19TU0wgKi8KKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogQ0tfU1NMICovCit9CisKKyNpZmRlZiBDS19TU0wKKyNpbmNsdWRlICJja2NrZXIuaCIKKyNpbmNsdWRlICJja3VjbWQuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBzdHJ1Y3Qga2V5dGFiICovCisjaW5jbHVkZSAiY2tjdGVsLmgiCisjaW5jbHVkZSAiY2tfc3NsLmgiCisjaWZkZWYgVU5JWAorI2luY2x1ZGUgPHB3ZC5oPiAgICAgICAgICAgICAgICAgICAgLyogUGFzc3dvcmQgZmlsZSBmb3IgaG9tZSBkaXJlY3RvcnkgKi8KKyNlbmRpZiAvKiBVTklYICovCisjaWZkZWYgT1MyCisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIE9TMk9OTFkKKyNpbmNsdWRlICJja290Y3AuaCIKKyNlbmRpZiAvKiBPUzJPTkxZICovCisKKyNpZmRlZiBTU0xETEwKK2ludCBzc2xfZmluaXNoZWRfbWVzc2FnZXMgPSAwOworI2Vsc2UgLyogU1NMRExMICovCisjaWZkZWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUgoraW50IHNzbF9maW5pc2hlZF9tZXNzYWdlcyA9IChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDU4MWZMKTsKKyNlbHNlCishRVJST1IgVGhpcyBtb2R1bGUgcmVxdWlyZXMgT3BlblNTTCAwLjkuNWEgb3IgaGlnaGVyCisjZW5kaWYgLyogT1BFTlNTTF9WRVJTSU9OX05VTUJFUiAqLworI2VuZGlmIC8qIFNTTERMTCAqLworCitzdGF0aWMgaW50IGF1dGhfc3NsX3ZhbGlkID0gMDsKK3N0YXRpYyBjaGFyICphdXRoX3NzbF9uYW1lID0gMDsgICAgLyogdGhpcyBob2xkcyB0aGUgb25lbGluZSBuYW1lICovCitjaGFyIHNzbF9lcnJbU1NMX0VSUl9CRlNaXT0iIjsKKworQklPICpiaW9fZXJyPU5VTEw7CitYNTA5X1NUT1JFICpjcmxfc3RvcmUgPSBOVUxMOworCisjaWZuZGVmIE5PRlRQCisjaWZuZGVmIFNZU0ZUUAorU1NMICpzc2xfZnRwX2NvbiAgICAgICAgICAgICA9IE5VTEw7CitTU0xfQ1RYICpzc2xfZnRwX2N0eCAgICAgICAgID0gTlVMTDsKK1NTTCAqc3NsX2Z0cF9kYXRhX2NvbiAgICAgICAgPSBOVUxMOworaW50IHNzbF9mdHBfYWN0aXZlX2ZsYWcgICAgICA9IDA7CitpbnQgc3NsX2Z0cF9kYXRhX2FjdGl2ZV9mbGFnID0gMDsKKyNlbmRpZiAvKiBTWVNGVFAgKi8KKyNlbmRpZiAvKiBOT0ZUUCAqLworCisjaWZuZGVmIE5PSFRUUAorU1NMICp0bHNfaHR0cF9jb24gICAgICAgICAgICA9IE5VTEw7CitTU0xfQ1RYICp0bHNfaHR0cF9jdHggICAgICAgID0gTlVMTDsKK2ludCB0bHNfaHR0cF9hY3RpdmVfZmxhZyAgICAgPSAwOworaW50IHNzbF9odHRwX2luaXRpYWxpemVkID0gMDsKKyNlbmRpZiAvKiBOT0hUVFAgKi8KKworU1NMX0NUWCAqc3NsX2N0eCA9IE5VTEw7CitTU0wgKnNzbF9jb24gPSBOVUxMOworaW50IHNzbF9kZWJ1Z19mbGFnID0gMDsKK2ludCBzc2xfdmVyYm9zZV9mbGFnID0gMDsKK2ludCBzc2xfb25seV9mbGFnID0gMDsKK2ludCBzc2xfYWN0aXZlX2ZsYWcgPSAwOworaW50IHNzbF92ZXJpZnlfZmxhZyA9IFNTTF9WRVJJRllfUEVFUjsKK2ludCBzc2xfY2VydHNva19mbGFnID0gMDsKK2NoYXIgKnNzbF9yc2FfY2VydF9maWxlID0gTlVMTDsKK2NoYXIgKnNzbF9yc2FfY2VydF9jaGFpbl9maWxlID0gTlVMTDsKK2NoYXIgKnNzbF9yc2Ffa2V5X2ZpbGUgPSBOVUxMOworY2hhciAqc3NsX2RzYV9jZXJ0X2ZpbGUgPSBOVUxMOworY2hhciAqc3NsX2RzYV9jZXJ0X2NoYWluX2ZpbGUgPSBOVUxMOworY2hhciAqc3NsX2RoX2tleV9maWxlID0gTlVMTDsKK2NoYXIgKnNzbF9jcmxfZmlsZSA9IE5VTEw7CitjaGFyICpzc2xfY3JsX2RpciA9IE5VTEw7CitjaGFyICpzc2xfdmVyaWZ5X2ZpbGUgPSBOVUxMOworY2hhciAqc3NsX3ZlcmlmeV9kaXIgPSBOVUxMOworY2hhciAqc3NsX2RoX3BhcmFtX2ZpbGUgPSBOVUxMOworY2hhciAqc3NsX2NpcGhlcl9saXN0ID0gTlVMTDsKK2NoYXIgKnNzbF9ybmRfZmlsZSA9IE5VTEw7CisKK1NTTF9DVFggKnRsc19jdHggPSBOVUxMOworU1NMICp0bHNfY29uID0gTlVMTDsKK2ludCB0bHNfb25seV9mbGFnID0gMDsKK2ludCB0bHNfYWN0aXZlX2ZsYWcgPSAwOworCitpbnQgc3NsX2luaXRpYWxpemVkID0gMDsKK2ludCBzc2xfdmVyaWZ5X2RlcHRoID0gLTE7IC8qIHVzZWQgdG8gdHJhY2sgZGVwdGggaW4gdmVyaWZ5IHJvdXRpbmVzICovCisKKy8qIGNvbXBpbGUgdGhpcyBzZXQgdG8gMSB0byBuZWdvdGlhdGUgU1NML1RMUyBidXQgbm90IGFjdHVhbGx5IHN0YXJ0IGl0ICovCitpbnQgc3NsX2R1bW15X2ZsYWc9MDsKKworZXh0ZXJuIGludCBpbnNlcnZlcjsKK2V4dGVybiBpbnQgZGVic2VzOworZXh0ZXJuIGludCBhY2NlcHRfY29tcGxldGU7CitleHRlcm4gY2hhciBzekhvc3ROYW1lW10sIHN6VXNlck5hbWVSZXF1ZXN0ZWRbXSwgc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWRbXTsKKworX1BST1RPVFlQKGludCBYNTA5X3RvX3VzZXIsKFg1MDkgKiwgY2hhciAqLCBpbnQpKTsKKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3NzbF9zZXJ2ZXJfdmVyaWZ5X2NhbGxiYWNrKGludCBvaywgWDUwOV9TVE9SRV9DVFggKiBjdHgpCisjZWxzZSAvKiBDS19BTlNJQyAqLworc3NsX3NlcnZlcl92ZXJpZnlfY2FsbGJhY2sob2ssIGN0eCkKK2ludCBvazsKK1g1MDlfU1RPUkVfQ1RYICpjdHg7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBzdGF0aWMgY2hhciAqc2F2ZWRfc3ViamVjdD1OVUxMOworICAgIGNoYXIgKnN1YmplY3Q9TlVMTCwgKmlzc3Vlcj1OVUxMOworICAgIGludCBkZXB0aCxlcnJvcjsKKyAgICBYNTA5ICp4cyA9IE5VTEw7CisKKyAgICBpZiAoIHNzbF9jZXJ0c29rX2ZsYWcgKQorICAgICAgICByZXR1cm4oMSk7CisKKyAgICBlcnJvcj1YNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoY3R4KTsKKyAgICBkZXB0aD1YNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoY3R4KTsKKyAgICB4cz1YNTA5X1NUT1JFX0NUWF9nZXRfY3VycmVudF9jZXJ0KGN0eCk7CisKKyAgICBpZiAoZGVwdGg9PTApIHsKKyAgICAgICAgLyogY2xlYXIgdGhpbmdzICovCisgICAgICAgIGlmIChzYXZlZF9zdWJqZWN0IT1OVUxMKSB7CisgICAgICAgICAgICBmcmVlKHNhdmVkX3N1YmplY3QpOworICAgICAgICAgICAgc2F2ZWRfc3ViamVjdD1OVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChhdXRoX3NzbF9uYW1lIT1OVUxMKSB7CisgICAgICAgICAgICBmcmVlKGF1dGhfc3NsX25hbWUpOworICAgICAgICAgICAgYXV0aF9zc2xfbmFtZT1OVUxMOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpZiAoc3NsX2RlYnVnX2ZsYWcgJiYgIWluc2VydmVyKSB7CisgICAgICAgIHByaW50Zigic3NsOnNlcnZlcl92ZXJpZnlfY2FsbGJhY2s6ZGVwdGg9JWQgb2s9JWQgZXJyPSVkLSVzXHJcbiIsCisgICAgICAgICAgICBkZXB0aCxvayxlcnJvcixYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnJvcikpOworICAgIH0KKworICAgIC8qIGZpcnN0IHRoaW5nIGlzIHRvIGhhdmUgYSBtZWFuaW5nZnVsIG5hbWUgZm9yIHRoZSBjdXJyZW50CisgICAgICogY2VydGlmaWNhdGUgdGhhdCBpcyBiZWluZyB2ZXJpZmllZCAuLi4gYW5kIGlmIHdlIGNhbm5vdAorICAgICAqIGRldGVybWluZSB0aGF0IHRoZW4gc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZyEKKyAgICAgKi8KKyAgICBtYWtlc3RyKCZzdWJqZWN0LAorICAgICAgICAgICAgKGNoYXIgKilYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoeHMpLE5VTEwsMCkpOworICAgIG1ha2VzdHIoJmlzc3VlciwKKyAgICAgICAgICAgIChjaGFyICopWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfaXNzdWVyX25hbWUoeHMpLE5VTEwsMCkpOworICAgIGlmICghc3ViamVjdCB8fCAhc3ViamVjdFswXSB8fCAhaXNzdWVyIHx8ICFpc3N1ZXJbMF0pIHsKKyAgICAgICAgb2sgPSAwOworICAgICAgICBnb3RvIHJldHVybl90aW1lOworICAgIH0KKworICAgIGlmIChzc2xfdmVyYm9zZV9mbGFnICYmICFpbnNlcnZlciAmJiBkZXB0aCAhPSBzc2xfdmVyaWZ5X2RlcHRoKSB7CisgICAgICAgIHByaW50ZigiWyVkXSBDZXJ0aWZpY2F0ZSBTdWJqZWN0OlxyXG4lc1xyXG4iLGRlcHRoLHN1YmplY3QpOworICAgICAgICBwcmludGYoIlslZF0gQ2VydGlmaWNhdGUgSXNzdWVyOlxyXG4lc1xyXG4iLGRlcHRoLGlzc3Vlcik7CisgICAgICAgIHNzbF92ZXJpZnlfZGVwdGggPSBkZXB0aDsKKyAgICB9CisKKyAgICAvKiBtYWtlIHN1cmUgdGhhdCB0aGUgY2VydGlmaWNhdGUgdGhhdCBoYXMgYmVlbiBwcmVzZW50ZWQgKi8KKyAgICAvKiBoYXMgbm90IGJlZW4gcmV2b2tlZCAoaWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGEgQ1JMLiAgICAgKi8KKyAgICBvayA9ICBzc2xfdmVyaWZ5X2NybChvaywgY3R4KTsKKworICAgIC8qIGlmIHdlIGhhdmUgYW55IGZvcm0gb2YgZXJyb3IgaW4gc2VjdXJlIG1vZGUgd2UgcmVqZWN0IHRoZSBjb25uZWN0aW9uICovCisgICAgaWYgKGVycm9yIT1YNTA5X1ZfT0spIHsKKyAgICAgICAgaWYgKGluc2VydmVyKSB7CisjaWZkZWYgQ0tTWVNMT0cKKyAgICAgICAgICAgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfTEkgJiYgY2t4bG9nZ2luZykgeworICAgICAgICAgICAgICAgIGNrc3lzbG9nKFNZU0xHX0xJLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiWC41MDkgQ2VydGlmaWNhdGUgdmVyaWZ5IGZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBzdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKVg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVycm9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggc3NsX3ZlcmlmeV9mbGFnICYKKyAgICAgICAgICAgICAgICAgKFNTTF9WRVJJRllfUEVFUiB8IFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpKQorICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3I6ICIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiV2FybmluZzogIik7CisgICAgICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgICAgICBjYXNlIFg1MDlfVl9FUlJfREVQVEhfWkVST19TRUxGX1NJR05FRF9DRVJUOgorICAgICAgICAgICAgICAgIHByaW50ZigiQ2VydGlmaWNhdGUgaXMgc2VsZiBzaWduZWQuXHJcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBYNTA5X1ZfRVJSX0NFUlRfSEFTX0VYUElSRUQ6CisgICAgICAgICAgICAgICAgcHJpbnRmKCJDZXJ0aWZpY2F0ZSBoYXMgZXhwaXJlZC5cclxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVF9MT0NBTExZOgorICAgICAgICAgICAgICAgIHByaW50ZigKKyAgIkNlcnRpZmljYXRlIGlzc3VlcidzIGNlcnRpZmljYXRlIGlzbid0IGF2YWlsYWJsZSBsb2NhbGx5LlxyXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fVkVSSUZZX0xFQUZfU0lHTkFUVVJFOgorICAgICAgICAgICAgICAgIHByaW50ZigiVW5hYmxlIHRvIHZlcmlmeSBsZWFmIHNpZ25hdHVyZS5cclxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFg1MDlfVl9FUlJfQ0VSVF9SRVZPS0VEOgorICAgICAgICAgICAgICAgIHByaW50ZigiQ2VydGlmaWNhdGUgcmV2b2tlZC5cclxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3IgJWQgd2hpbGUgdmVyaWZ5aW5nIGNlcnRpZmljYXRlLlxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmVycm9yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvayA9ICEoc3NsX3ZlcmlmeV9mbGFnICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogaWYgd2UgZ290IGFsbCB0aGUgd2F5IHRvIHRoZSB0b3Agb2YgdGhlIHRyZWUgdGhlbgorICAgICAgICAgKiB3ZSAqY2FuKiB1c2UgdGhpcyBjZXJ0aWZpY2F0ZSBmb3IgYSB1c2VybmFtZSB0bworICAgICAgICAgKiBtYXRjaCAuLi4gaW4gYWxsIG90aGVyIGNhc2VzIHdlIG11c3Qgbm90IQorICAgICAgICAgKi8KKyAgICAgICAgYXV0aF9zc2xfbmFtZSA9IHNhdmVkX3N1YmplY3Q7CisgICAgICAgIHNhdmVkX3N1YmplY3QgPSBOVUxMOworICAgIH0KKworICByZXR1cm5fdGltZToKKworICAgIC8qIHNhdmUgdGhlIG5hbWUgaWYgYXQgbGVhc3QgdGhlIGZpcnN0IGxldmVsIGlzIG9rYXkgKi8KKyAgICBpZiAoZGVwdGggPT0gMCAmJiBvaykKKyAgICAgICAgbWFrZXN0cigmc2F2ZWRfc3ViamVjdCxzdWJqZWN0KTsKKworICAgIC8qIGNsZWFuIHVwIHRoaW5ncyAqLworICAgIGlmIChzdWJqZWN0IT1OVUxMKQorICAgICAgICBmcmVlKHN1YmplY3QpOworICAgIGlmIChpc3N1ZXIhPU5VTEwpCisgICAgICAgIGZyZWUoaXNzdWVyKTsKKworICAgIHJldHVybiBvazsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3NzbF9jbGllbnRfdmVyaWZ5X2NhbGxiYWNrKGludCBvaywgWDUwOV9TVE9SRV9DVFggKiBjdHgpCisjZWxzZQorc3NsX2NsaWVudF92ZXJpZnlfY2FsbGJhY2sob2ssIGN0eCkKK2ludCBvazsKK1g1MDlfU1RPUkVfQ1RYICpjdHg7CisjZW5kaWYKK3sKKyAgICBjaGFyIHN1YmplY3RbMjU2XT0iIiwgaXNzdWVyWzI1Nl09IiI7CisgICAgaW50IGRlcHRoLCBlcnJvciwgbGVuOworICAgIFg1MDkgKnhzOworCisgICAgeHM9WDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChjdHgpOworICAgIGVycm9yPVg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcihjdHgpOworICAgIGRlcHRoPVg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcl9kZXB0aChjdHgpOworCisgICAgaWYgKCBzc2xfZGVidWdfZmxhZyApCisgICAgICAgIHByaW50Zigic3NsOmNsaWVudF92ZXJpZnlfY2FsbGJhY2s6ZGVwdGg9JWQgb2s9JWQgZXJyPSVkLSVzXHJcbiIsCisgICAgICAgICAgICAgICAgZGVwdGgsb2ssZXJyb3IsWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoZXJyb3IpKTsKKworICAgIGlmICggc3NsX2NlcnRzb2tfZmxhZyApIHsKKyAgICAgICAgb2sgPSAxOworICAgIH0KKworICAgIC8qIGZpcnN0IHRoaW5nIGlzIHRvIGhhdmUgYSBtZWFuaW5nZnVsIG5hbWUgZm9yIHRoZSBjdXJyZW50CisgICAgICogY2VydGlmaWNhdGUgdGhhdCBpcyBiZWluZyB2ZXJpZmllZCAuLi4gYW5kIGlmIHdlIGNhbm5vdAorICAgICAqIGRldGVybWluZSB0aGF0IHRoZW4gc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZyEKKyAgICAgKi8KKyNpZmRlZiBYTl9GTEFHX1NFUF9NVUxUSUxJTkUKKyAgICBYNTA5X05BTUVfcHJpbnRfZXgoYmlvX2VycixYNTA5X2dldF9zdWJqZWN0X25hbWUoeHMpLDQsCisgICAgICAgICAgICAgICAgICAgICAgICBYTl9GTEFHX1NFUF9NVUxUSUxJTkUpOworICAgIGxlbiA9IEJJT19yZWFkKGJpb19lcnIsc3ViamVjdCwyNTYpOworICAgIHN1YmplY3RbbGVuIDwgMjU2ID8gbGVuIDogMjU1XSA9ICdcMCc7CisgICAgaWYgKCFzdWJqZWN0WzBdKSB7CisgICAgICAgIEVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisgICAgICAgIGxlbiA9IEJJT19yZWFkKGJpb19lcnIsc3NsX2VycixTU0xfRVJSX0JGU1opOworICAgICAgICBzc2xfZXJyW2xlbiA8IFNTTF9FUlJfQkZTWiA/IGxlbiA6IFNTTF9FUlJfQkZTWl0gPSAnXDAnOworICAgICAgICB1cV9vaygiWC41MDkgU3ViamVjdCBOYW1lIHVuYXZhaWxhYmxlIiwgc3NsX2VyciwgMSwgTlVMTCwgMCk7CisgICAgICAgIG9rPTA7CisgICAgICAgIGdvdG8gcmV0dXJuX3RpbWU7CisgICAgfQorCisgICAgWDUwOV9OQU1FX3ByaW50X2V4KGJpb19lcnIsWDUwOV9nZXRfaXNzdWVyX25hbWUoeHMpLDQsCisgICAgICAgICAgICAgICAgICAgICAgICBYTl9GTEFHX1NFUF9NVUxUSUxJTkUpOworICAgIGxlbiA9IEJJT19yZWFkKGJpb19lcnIsaXNzdWVyLDI1Nik7CisgICAgaXNzdWVyW2xlbiA8IDI1NiA/IGxlbiA6IDI1NV0gPSAnXDAnOworICAgIGlmICghaXNzdWVyWzBdKSB7CisgICAgICAgIEVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisgICAgICAgIGxlbiA9IEJJT19yZWFkKGJpb19lcnIsc3NsX2VycixTU0xfRVJSX0JGU1opOworICAgICAgICBzc2xfZXJyW2xlbiA8IFNTTF9FUlJfQkZTWiA/IGxlbiA6IFNTTF9FUlJfQkZTWl0gPSAnXDAnOworICAgICAgICB1cV9vaygiWC41MDkgSXNzdWVyIE5hbWUgdW5hdmFpbGFibGUiLCBzc2xfZXJyLCAxLCBOVUxMLCAwKTsKKyAgICAgICAgb2s9MDsKKyAgICAgICAgZ290byByZXR1cm5fdGltZTsKKyAgICB9CisjZWxzZSAvKiBYTl9GTEFHX1NFUF9NVUxUSUxJTkUgKi8KKyAgICBYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoeHMpLHN1YmplY3QsMjU2KTsKKyAgICBpZiAoIXN1YmplY3RbMF0pIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKyAgICAgICAgbGVuID0gQklPX3JlYWQoYmlvX2Vycixzc2xfZXJyLFNTTF9FUlJfQkZTWik7CisgICAgICAgIHNzbF9lcnJbbGVuIDwgU1NMX0VSUl9CRlNaID8gbGVuIDogU1NMX0VSUl9CRlNaXSA9ICdcMCc7CisgICAgICAgIHVxX29rKCJYLjUwOSBTdWJqZWN0IE5hbWUgdW5hdmFpbGFibGUiLCBzc2xfZXJyLCAxLCBOVUxMLCAwKTsKKyAgICAgICAgb2s9MDsKKyAgICAgICAgZ290byByZXR1cm5fdGltZTsKKyAgICB9CisKKyAgICBYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9pc3N1ZXJfbmFtZSh4cyksaXNzdWVyLDI1Nik7CisgICAgaWYgKCFpc3N1ZXJbMF0pIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKyAgICAgICAgbGVuID0gQklPX3JlYWQoYmlvX2Vycixzc2xfZXJyLFNTTF9FUlJfQkZTWik7CisgICAgICAgIHNzbF9lcnJbbGVuIDwgU1NMX0VSUl9CRlNaID8gbGVuIDogU1NMX0VSUl9CRlNaXSA9ICdcMCc7CisgICAgICAgIHVxX29rKCJYLjUwOSBJc3N1ZXIgTmFtZSB1bmF2YWlsYWJsZSIsIHNzbF9lcnIsIDEsIE5VTEwsIDApOworICAgICAgICBvaz0wOworICAgICAgICBnb3RvIHJldHVybl90aW1lOworICAgIH0KKyNlbmRpZiAvKiBYTl9GTEFHX1NFUF9NVUxUSUxJTkUgKi8KKworICAgIGlmIChzc2xfdmVyYm9zZV9mbGFnICYmIGRlcHRoICE9IHNzbF92ZXJpZnlfZGVwdGgpIHsKKyAgICAgICAgcHJpbnRmKCJbJWRdIENlcnRpZmljYXRlIFN1YmplY3Q6XHJcbiVzXHJcbiIsZGVwdGgsc3ViamVjdCk7CisgICAgICAgIHByaW50ZigiWyVkXSBDZXJ0aWZpY2F0ZSBJc3N1ZXI6XHJcbiVzXHJcbiIsZGVwdGgsaXNzdWVyKTsKKyAgICAgICAgc3NsX3ZlcmlmeV9kZXB0aCA9IGRlcHRoOworICAgIH0KKworICAgIG9rID0gc3NsX3ZlcmlmeV9jcmwob2ssIGN0eCk7CisKKyAgICBpZiAoICFvayApIHsKKyAgICAgICAgY2hhciBwcmVmaXhbMTAyNF07CisgICAgICAgIC8qIGlmIHRoZSBzZXJ2ZXIgaXMgdXNpbmcgYSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSB0aGVuCisgICAgICAgICAqIHdlIG5lZWQgdG8gZGVjaWRlIGlmIHRoYXQgaXMgZ29vZCBlbm91Z2ggZm9yIHVzIHRvCisgICAgICAgICAqIGFjY2VwdCAuLi4KKyAgICAgICAgICovCisKKyAgICAgICAgc3dpdGNoICggZXJyb3IgKSB7CisgICAgICAgIGNhc2UgWDUwOV9WX0VSUl9ERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQ6IHsKKyAgICAgICAgICAgIGlmIChzc2xfdmVyaWZ5X2ZsYWcgJiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKSB7CisgICAgICAgICAgICAgICAgLyogbWFrZSAxMDAlIHN1cmUgdGhhdCBpbiBzZWN1cmUgbW9yZSB3ZSBkcm9wIHRoZQorICAgICAgICAgICAgICAgICAqIGNvbm5lY3Rpb24gaWYgdGhlIHNlcnZlciBkb2VzIG5vdCBoYXZlIGEKKyAgICAgICAgICAgICAgICAgKiByZWFsIGNlcnRpZmljYXRlIQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNrbWFreG1zZyhwcmVmaXgsMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvcjogU2VydmVyIGhhcyBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlsiLGNraXRvYShkZXB0aCksIl0gQ2VydGlmaWNhdGUgU3ViamVjdD1cbiIsc3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblsiLGNraXRvYShkZXB0aCksIl0gQ2VydGlmaWNhdGUgSXNzdWVyPVxuIixpc3N1ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCk7CisKKyAgICAgICAgICAgICAgICB1cV9vayhwcmVmaXgsICJSZWplY3RpbmcgQ29ubmVjdGlvbiIsIDEsIE5VTEwsIDApOworCisgICAgICAgICAgICAgICAgLyogc29tZXRpbWVzIGl0IGlzIHJlYWxseSBoYW5keSB0byBiZSBhYmxlIHRvIGRlYnVnIHRoaW5ncworICAgICAgICAgICAgICAgICogYW5kIHN0aWxsIGdldCBhIGNvbm5lY3Rpb24hCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJTU0w6IGRlYnVnIC0+IGlnbm9yaW5nIGNlcnQgcmVxdWlyZWQhXHJcbiIpOworICAgICAgICAgICAgICAgICAgICBvaz0xOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9rPTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3RpbWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNzbF92ZXJpZnlfZmxhZyAhPSBTU0xfVkVSSUZZX05PTkUpIHsKKyAgICAgICAgICAgICAgICBja21ha3htc2cocHJlZml4LDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogU2VydmVyIGhhcyBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlsiLGNraXRvYShkZXB0aCksIl0gQ2VydGlmaWNhdGUgU3ViamVjdD1cbiIsc3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblsiLGNraXRvYShkZXB0aCksIl0gQ2VydGlmaWNhdGUgSXNzdWVyPVxuIixpc3N1ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCk7CisKKyAgICAgICAgICAgICAgICBvayA9IHVxX29rKHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250aW51ZT8gKFkvTikgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIGlmICggb2sgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgb2sgPSAwOworICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3RpbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlQ6CisgICAgICAgICAgICBpZiAoc3NsX3ZlcmlmeV9mbGFnICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgeworICAgICAgICAgICAgICAgIC8qIG1ha2UgMTAwJSBzdXJlIHRoYXQgaW4gc2VjdXJlIG1vcmUgd2UgZHJvcCB0aGUKKyAgICAgICAgICAgICAgICAgKiBjb25uZWN0aW9uIGlmIHRoZSBzZXJ2ZXIgZG9lcyBub3QgaGF2ZSBhCisgICAgICAgICAgICAgICAgICogcmVhbCBjZXJ0aWZpY2F0ZSEKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBja21ha3htc2cocHJlZml4LDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3I6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKVg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbkNlcnRpZmljYXRlIElzc3Vlcj1cbiIsaXNzdWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgICAgICB1cV9vayhwcmVmaXgsICJSZWplY3RpbmcgQ29ubmVjdGlvbiIsIDEsIE5VTEwsIDApOworCisgICAgICAgICAgICAgICAgLyogc29tZXRpbWVzIGl0IGlzIHJlYWxseSBoYW5keSB0byBiZSBhYmxlIHRvIGRlYnVnIHRoaW5ncworICAgICAgICAgICAgICAgICogYW5kIHN0aWxsIGdldCBhIGNvbm5lY3Rpb24hCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJTU0w6IGRlYnVnIC0+IGlnbm9yaW5nIGNlcnQgcmVxdWlyZWQhXHJcbiIpOworICAgICAgICAgICAgICAgICAgICBvaz0xOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9rPTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX3RpbWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNzbF92ZXJpZnlfZmxhZyAhPSBTU0xfVkVSSUZZX05PTkUpIHsKKyAgICAgICAgICAgICAgICBja21ha3htc2cocHJlZml4LDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuQ2VydGlmaWNhdGUgSXNzdWVyPVxuIixpc3N1ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgIG9rID0gdXFfb2socHJlZml4LCAiQ29udGludWUgKFkvTikiLCAzLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl90aW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWDUwOV9WX0VSUl9DRVJUX05PVF9ZRVRfVkFMSUQ6CisgICAgICAgIGNhc2UgWDUwOV9WX0VSUl9FUlJPUl9JTl9DRVJUX05PVF9CRUZPUkVfRklFTEQ6CisgICAgICAgICAgICBpZiAoc3NsX3ZlcmlmeV9mbGFnICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgeworICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgLyogbWFrZSAxMDAlIHN1cmUgdGhhdCBpbiBzZWN1cmUgbW9yZSB3ZSBkcm9wIHRoZQorICAgICAgICAgICAgICAgICAqIGNvbm5lY3Rpb24gaWYgdGhlIHNlcnZlciBkb2VzIG5vdCBoYXZlIGEKKyAgICAgICAgICAgICAgICAgKiByZWFsIGNlcnRpZmljYXRlIQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEFTTjFfVElNRV9wcmludChiaW9fZXJyLFg1MDlfZ2V0X25vdEJlZm9yZSh4cykpOworICAgICAgICAgICAgICAgIGxlbiA9IEJJT19yZWFkKGJpb19lcnIsc3NsX2VycixTU0xfRVJSX0JGU1opOworICAgICAgICAgICAgICAgIHNzbF9lcnJbbGVuIDwgU1NMX0VSUl9CRlNaID8gbGVuIDogU1NMX0VSUl9CRlNaXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgY2ttYWt4bXNnKHByZWZpeCwxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5DZXJ0aWZpY2F0ZSBTdWJqZWN0PVxuIixzdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxubm90QmVmb3JlPSIsc3NsX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgICAgICB1cV9vayhwcmVmaXgsICJSZWplY3RpbmcgQ29ubmVjdGlvbiIsIDEsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIC8qIHNvbWV0aW1lcyBpdCBpcyByZWFsbHkgaGFuZHkgdG8gYmUgYWJsZSB0byBkZWJ1ZyB0aGluZ3MKKyAgICAgICAgICAgICAgICAqIGFuZCBzdGlsbCBnZXQgYSBjb25uZWN0aW9uIQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiU1NMOiBkZWJ1ZyAtPiBpZ25vcmluZyBjZXJ0IHJlcXVpcmVkIVxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgb2s9MTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvaz0wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl90aW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChzc2xfdmVyaWZ5X2ZsYWcgIT0gU1NMX1ZFUklGWV9OT05FKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICAgICAgICBBU04xX1RJTUVfcHJpbnQoYmlvX2VycixYNTA5X2dldF9ub3RCZWZvcmUoeHMpKTsKKyAgICAgICAgICAgICAgICBsZW4gPSBCSU9fcmVhZChiaW9fZXJyLHNzbF9lcnIsU1NMX0VSUl9CRlNaKTsKKyAgICAgICAgICAgICAgICBzc2xfZXJyW2xlbiA8IFNTTF9FUlJfQkZTWiA/IGxlbiA6IFNTTF9FUlJfQkZTWl0gPSAnXDAnOworICAgICAgICAgICAgICAgIGNrbWFreG1zZyhwcmVmaXgsMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5DZXJ0aWZpY2F0ZSBTdWJqZWN0PVxuIixzdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuICAgIG5vdEJlZm9yZT0iLHNzbF9lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgb2sgPSB1cV9vayhwcmVmaXgsICJDb250aW51ZSAoWS9OKSIsIDMsIE5VTEwsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWDUwOV9WX0VSUl9DRVJUX0hBU19FWFBJUkVEOgorICAgICAgICBjYXNlIFg1MDlfVl9FUlJfRVJST1JfSU5fQ0VSVF9OT1RfQUZURVJfRklFTEQ6CisgICAgICAgICAgICBpZiAoc3NsX3ZlcmlmeV9mbGFnICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgeworICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgLyogbWFrZSAxMDAlIHN1cmUgdGhhdCBpbiBzZWN1cmUgbW9yZSB3ZSBkcm9wIHRoZQorICAgICAgICAgICAgICAgICAqIGNvbm5lY3Rpb24gaWYgdGhlIHNlcnZlciBkb2VzIG5vdCBoYXZlIGEKKyAgICAgICAgICAgICAgICAgKiByZWFsIGNlcnRpZmljYXRlIQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEFTTjFfVElNRV9wcmludChiaW9fZXJyLFg1MDlfZ2V0X25vdEFmdGVyKHhzKSk7CisgICAgICAgICAgICAgICAgbGVuID0gQklPX3JlYWQoYmlvX2Vycixzc2xfZXJyLFNTTF9FUlJfQkZTWik7CisgICAgICAgICAgICAgICAgc3NsX2VycltsZW4gPCBTU0xfRVJSX0JGU1ogPyBsZW4gOiBTU0xfRVJSX0JGU1pdID0gJ1wwJzsKKworICAgICAgICAgICAgICAgIGNrbWFreG1zZyhwcmVmaXgsMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvcjogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuQ2VydGlmaWNhdGUgU3ViamVjdD1cbiIsc3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAgICBub3RBZnRlcj0iLHNzbF9lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgdXFfb2socHJlZml4LCAiUmVqZWN0aW5nIENvbm5lY3Rpb24iLCAxLCBOVUxMLCAwKTsKKyAgIAorICAgICAgICAgICAgICAgIC8qIHNvbWV0aW1lcyBpdCBpcyByZWFsbHkgaGFuZHkgdG8gYmUgYWJsZSB0byBkZWJ1ZyB0aGluZ3MKKyAgICAgICAgICAgICAgICAqIGFuZCBzdGlsbCBnZXQgYSBjb25uZWN0aW9uIQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiU1NMOiBkZWJ1ZyAtPiBpZ25vcmluZyBjZXJ0IHJlcXVpcmVkIVxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgb2s9MTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvaz0wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl90aW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChzc2xfdmVyaWZ5X2ZsYWcgIT0gU1NMX1ZFUklGWV9OT05FKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICAgICAgICBBU04xX1RJTUVfcHJpbnQoYmlvX2VycixYNTA5X2dldF9ub3RBZnRlcih4cykpOworICAgICAgICAgICAgICAgIGxlbiA9IEJJT19yZWFkKGJpb19lcnIsc3NsX2VycixTU0xfRVJSX0JGU1opOworICAgICAgICAgICAgICAgIHNzbF9lcnJbbGVuIDwgU1NMX0VSUl9CRlNaID8gbGVuIDogU1NMX0VSUl9CRlNaXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgY2ttYWt4bXNnKHByZWZpeCwxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKVg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbkNlcnRpZmljYXRlIFN1YmplY3Q9XG4iLHN1YmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gICAgbm90QWZ0ZXI9Iixzc2xfZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgIG9rID0gdXFfb2socHJlZml4LCAiQ29udGludWUgKFkvTikiLCAzLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFg1MDlfVl9FUlJfU0VMRl9TSUdORURfQ0VSVF9JTl9DSEFJTjoKKyAgICAgICAgY2FzZSBYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlRfTE9DQUxMWToKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBXaGVuIGFuIFNTTCBzZXJ2ZXIgc2VuZHMgaXRzIGNlcnRpZmljYXRlcyB0byB0aGUgY2xpZW50IHRoZXJlCisgICAgICAgICAgICAgKiBhcmUgdHdvIiBjb252ZW50aW9ucyI6IG9uZSBpcyB0byBzZW5kIHRoZSBjb21wbGV0ZSBjZXJ0aWZpY2F0ZQorICAgICAgICAgICAgICogY2hhaW4gYW5kIHRoZSBvdGhlciBpcyB0byBzZW5kIHRoZSB3aG9sZSBjaGFpbiBhcGFydCBmcm9tIHRoZQorICAgICAgICAgICAgICogcm9vdC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBZb3UgZG9uJ3QgdXN1YWxseSBuZWVkIHRoZSByb290IGJlY2F1c2UgdGhlIHJvb3QgaXMgbm9ybWFsbHkKKyAgICAgICAgICAgICAqIHN0b3JlZCBhbmQgdHJ1c3RlZCBsb2NhbGx5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFNvIGlmIHlvdSBnZXQgdGhlIHdob2xlIGNoYWluIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgdGhlIHNlbGYKKyAgICAgICAgICAgICAqIHNpZ25lZCBjZXJ0aWZpY2F0ZSB3aGVyZWFzIGlmIHRoZSByb290IGlzIG1pc3NpbmcgaXQgc2F5cyBpdAorICAgICAgICAgICAgICogY2FuJ3QgZmluZCB0aGUgaXNzdWVyIGNlcnRpZmljYXRlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoc3NsX3ZlcmlmeV9mbGFnICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgeworICAgICAgICAgICAgICAgIC8qIG1ha2UgMTAwJSBzdXJlIHRoYXQgaW4gc2VjdXJlIG1vcmUgd2UgZHJvcCB0aGUKKyAgICAgICAgICAgICAgICAgKiBjb25uZWN0aW9uIGlmIHRoZSBzZXJ2ZXIgZG9lcyBub3QgaGF2ZSBhCisgICAgICAgICAgICAgICAgICogcmVhbCBjZXJ0aWZpY2F0ZSEKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBja21ha3htc2cocHJlZml4LDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3I6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKVg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbkNlcnRpZmljYXRlIElzc3Vlcj1cbiIsaXNzdWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgICAgICB1cV9vayhwcmVmaXgsICJSZWplY3RpbmcgQ29ubmVjdGlvbiIsIDEsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIC8qIHNvbWV0aW1lcyBpdCBpcyByZWFsbHkgaGFuZHkgdG8gYmUgYWJsZSB0byBkZWJ1ZyB0aGluZ3MKKyAgICAgICAgICAgICAgICAqIGFuZCBzdGlsbCBnZXQgYSBjb25uZWN0aW9uIQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiU1NMOiBkZWJ1ZyAtPiBpZ25vcmluZyBjZXJ0IHJlcXVpcmVkIVxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgb2s9MTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvaz0wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl90aW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChzc2xfdmVyaWZ5X2ZsYWcgIT0gU1NMX1ZFUklGWV9OT05FKSB7CisgICAgICAgICAgICAgICAgY2ttYWt4bXNnKHByZWZpeCwxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKVg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbkNlcnRpZmljYXRlIElzc3Vlcj1cbiIsaXNzdWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgICAgICBvayA9IHVxX29rKHByZWZpeCwgIkNvbnRpbnVlIChZL04pIiwgMywgTlVMTCwgMCk7CisjaWZkZWYgTlQKKyAgICAgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIHVzZXIgZGVjaWRlcyB0byBhY2NlcHQgdGhlIGNlcnRpZmljYXRlCisgICAgICAgICAgICAgICAgICAgICAqIG9mZmVyIHRvIHN0b3JlIGl0IGZvciBmdXR1cmUgY29ubmVjdGlvbnMgaW4gCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSB1c2VyJ3MgcHJpdmF0ZSBzdG9yZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgb2sgPSB1cV9vaygKKyAgIkRvIHlvdSB3aXNoIHRvIHN0b3JlIHRoZSBjZXJ0aWZpY2F0ZSB0byB2ZXJpZnkgZnV0dXJlIGNvbm5lY3Rpb25zPyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRpbnVlIChZL04pIiwgMywgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrX1g1MDlfc2F2ZV9jZXJ0X3RvX3VzZXJfc3RvcmUoeHMpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fVkVSSUZZX0xFQUZfU0lHTkFUVVJFOgorICAgICAgICBjYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9DUkw6CisgICAgICAgIGNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fREVDUllQVF9DRVJUX1NJR05BVFVSRToKKyAgICAgICAgY2FzZSBYNTA5X1ZfRVJSX1VOQUJMRV9UT19ERUNSWVBUX0NSTF9TSUdOQVRVUkU6CisgICAgICAgIGNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fREVDT0RFX0lTU1VFUl9QVUJMSUNfS0VZOgorICAgICAgICBjYXNlIFg1MDlfVl9FUlJfQ0VSVF9TSUdOQVRVUkVfRkFJTFVSRToKKyAgICAgICAgY2FzZSBYNTA5X1ZfRVJSX0NSTF9TSUdOQVRVUkVfRkFJTFVSRToKKyAgICAgICAgY2FzZSBYNTA5X1ZfRVJSX0NSTF9OT1RfWUVUX1ZBTElEOgorICAgICAgICBjYXNlIFg1MDlfVl9FUlJfQ1JMX0hBU19FWFBJUkVEOgorICAgICAgICBjYXNlIFg1MDlfVl9FUlJfRVJST1JfSU5fQ1JMX0xBU1RfVVBEQVRFX0ZJRUxEOgorICAgICAgICBjYXNlIFg1MDlfVl9FUlJfRVJST1JfSU5fQ1JMX05FWFRfVVBEQVRFX0ZJRUxEOgorICAgICAgICBjYXNlIFg1MDlfVl9FUlJfT1VUX09GX01FTToKKyAgICAgICAgY2FzZSBYNTA5X1ZfRVJSX0NFUlRfQ0hBSU5fVE9PX0xPTkc6CisgICAgICAgIGNhc2UgWDUwOV9WX0VSUl9DRVJUX1JFVk9LRUQ6CisgICAgICAgIGNhc2UgWDUwOV9WX0VSUl9BUFBMSUNBVElPTl9WRVJJRklDQVRJT046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoc3NsX3ZlcmlmeV9mbGFnICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgeworICAgICAgICAgICAgICAgIC8qIG1ha2UgMTAwJSBzdXJlIHRoYXQgaW4gc2VjdXJlIG1vZGUgd2UgZHJvcCB0aGUKKyAgICAgICAgICAgICAgICAgKiBjb25uZWN0aW9uIGlmIHRoZSBzZXJ2ZXIgZG9lcyBub3QgaGF2ZSBhCisgICAgICAgICAgICAgICAgICogcmVhbCBjZXJ0aWZpY2F0ZSEKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBja21ha3htc2cocHJlZml4LDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3I6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKVg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbkNlcnRpZmljYXRlIFN1YmplY3Q9XG4iLHN1YmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgIHVxX29rKHByZWZpeCwgIlJlamVjdGluZyBDb25uZWN0aW9uIiwgMSwgTlVMTCwgMCk7CisKKyAgICAgICAgICAgICAgICAvKiBzb21ldGltZXMgaXQgaXMgcmVhbGx5IGhhbmR5IHRvIGJlIGFibGUgdG8gZGVidWcgdGhpbmdzCisgICAgICAgICAgICAgICAgKiBhbmQgc3RpbGwgZ2V0IGEgY29ubmVjdGlvbiEKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlNTTDogZGVidWcgLT4gaWdub3JpbmcgY2VydCByZXF1aXJlZCFcclxuIik7CisgICAgICAgICAgICAgICAgICAgIG9rPTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb2s9MDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byByZXR1cm5fdGltZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3NsX3ZlcmlmeV9mbGFnICE9IFNTTF9WRVJJRllfTk9ORSkgeworICAgICAgICAgICAgICAgIGNrbWFreG1zZyhwcmVmaXgsMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5DZXJ0aWZpY2F0ZSBTdWJqZWN0PVxuIixzdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgICAgICBvayA9IHVxX29rKHByZWZpeCwgIkNvbnRpbnVlIChZL04pIiwgMywgTlVMTCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm5fdGltZToKKyAgICBpZiAoIHNzbF9kZWJ1Z19mbGFnICkKKyAgICAgICAgcHJpbnRmKCJzc2w6Y2xpZW50X3ZlcmlmeV9jYWxsYmFjayA9PiBvazogJWRcclxuIixvayk7CisgICAgcmV0dXJuIG9rOworfQorCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK3NzbF9jbGllbnRfaW5mb19jYWxsYmFjayhjb25zdCBTU0wgKnMsIGludCB3aGVyZSwgaW50IHJldCkKKyNlbHNlCitzc2xfY2xpZW50X2luZm9fY2FsbGJhY2socyx3aGVyZSxyZXQpCitjb25zdCBTU0wgKnM7CitpbnQgd2hlcmU7CitpbnQgcmV0OworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGluc2VydmVyIHx8ICFzc2xfZGVidWdfZmxhZykKKyAgICAgICAgcmV0dXJuOworCisgICAgc3dpdGNoICggd2hlcmUgKSB7CisgICAgY2FzZSBTU0xfQ0JfQ09OTkVDVF9MT09QOgorICAgICAgICBwcmludGYoIlNTTF9jb25uZWN0OiVzICVzXHJcbiIsCisgICAgICAgICAgICAgICAgU1NMX3N0YXRlX3N0cmluZygoU1NMICopcyksU1NMX3N0YXRlX3N0cmluZ19sb25nKChTU0wgKilzKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1NMX0NCX0NPTk5FQ1RfRVhJVDoKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICBwcmludGYoIlNTTF9jb25uZWN0OmZhaWxlZCBpbiAlcyAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICBTU0xfc3RhdGVfc3RyaW5nKChTU0wgKilzKSxTU0xfc3RhdGVfc3RyaW5nX2xvbmcoKFNTTCAqKXMpKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBwcmludGYoIlNTTF9jb25uZWN0OmVycm9yIGluICVzICVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgIFNTTF9zdGF0ZV9zdHJpbmcoKFNTTCAqKXMpLFNTTF9zdGF0ZV9zdHJpbmdfbG9uZygoU1NMICopcykpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1NMX0NCX0FDQ0VQVF9MT09QOgorICAgICAgICBwcmludGYoIlNTTF9hY2NlcHQ6JXMgJXNcclxuIiwKKyAgICAgICAgICAgICAgICBTU0xfc3RhdGVfc3RyaW5nKChTU0wgKilzKSxTU0xfc3RhdGVfc3RyaW5nX2xvbmcoKFNTTCAqKXMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTU0xfQ0JfQUNDRVBUX0VYSVQ6CisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCJTU0xfYWNjZXB0OmZhaWxlZCBpbiAlcyAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICBTU0xfc3RhdGVfc3RyaW5nKChTU0wgKilzKSxTU0xfc3RhdGVfc3RyaW5nX2xvbmcoKFNTTCAqKXMpKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBwcmludGYoIlNTTF9hY2NlcHQ6ZXJyb3IgaW4gJXMgJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgU1NMX3N0YXRlX3N0cmluZygoU1NMICopcyksU1NMX3N0YXRlX3N0cmluZ19sb25nKChTU0wgKilzKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTU0xfQ0JfUkVBRF9BTEVSVDoKKyAgICAgICAgcHJpbnRmKCJTU0xfcmVhZF9hbGVydFxyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTU0xfQ0JfV1JJVEVfQUxFUlQ6CisgICAgICAgIHByaW50ZigiU1NMX3dyaXRlX2FsZXJ0XHJcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNTTF9DQl9IQU5EU0hBS0VfU1RBUlQ6CisgICAgICAgIHByaW50ZigiU1NMX2hhbmRzaGFrZTolcyAlc1xyXG4iLAorICAgICAgICAgICAgICAgIFNTTF9zdGF0ZV9zdHJpbmcoKFNTTCAqKXMpLFNTTF9zdGF0ZV9zdHJpbmdfbG9uZygoU1NMICopcykpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNTTF9DQl9IQU5EU0hBS0VfRE9ORToKKyAgICAgICAgcHJpbnRmKCJTU0xfaGFuZHNoYWtlOiVzICVzXHJcbiIsCisgICAgICAgICAgICAgICAgU1NMX3N0YXRlX3N0cmluZygoU1NMICopcyksU1NMX3N0YXRlX3N0cmluZ19sb25nKChTU0wgKilzKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworI2lmZGVmIFVTRV9DRVJUX0NCCisvKiBSZXR1cm4gMSwgY2xpZW50IGNlcnQgaXMgYXZhaWxhYmxlICovCisvKiBSZXR1cm4gMCwgbm8gY2xpZW50IGNlcnQgaXMgYXZhaWxhYmxlICovCisvKiBSZXR1cm4gLTEsIGNhbGxiYWNrIG11c3QgYmUgY2FsbGVkIGFnYWluLiBTU0xfd2FudF94NTA5X2xvb2t1cCgpID09IDEgKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCitzc2xfY2xpZW50X2NlcnRfY2FsbGJhY2soU1NMICogcywgWDUwOSAqKiB4NTA5LCBFVlBfUEtFWSAqKiBwa2V5KQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK3NzbF9jbGllbnRfY2VydF9jYWxsYmFjayhzLCB4NTA5LCBwa2V5KQorICAgIFNTTCAqIHM7CisgICAgWDUwOSAqKiB4NTA5OworICAgIEVWUF9QS0VZICoqIHBrZXk7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoIHNzbF9kZWJ1Z19mbGFnICkgeworICAgICAgICBjb25zdCBjaGFyICogY2lwaGVyX2xpc3Q9U1NMX2dldF9jaXBoZXIocyk7CisgICAgICAgIHByaW50Zigic3NsX2NsaWVudF9jZXJ0X2NhbGxiYWNrIGNhbGxlZCAoJXMpXHJcbiIsCisgICAgICAgICAgICAgICAgY2lwaGVyX2xpc3Q/Y2lwaGVyX2xpc3Q6IlVOS05PV04iKTsKKyAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgIGlmICggcyA9PSB0bHNfY29uICkgeworICAgICAgICBpZiAodGxzX2xvYWRfY2VydHModGxzX2N0cyx0bHNfY29uLDApKSB7CisgICAgICAgICAgICAqeDUwOSA9IFNTTF9nZXRfY2VydGlmaWNhdGUocyk7CisgICAgICAgICAgICAqcGtleSA9IFNTTF9nZXRfcHJpdmF0ZWtleShzKTsKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIHMgPT0gc3NsX2NvbiApIHsKKyAgICAgICAgaWYgKHRsc19sb2FkX2NlcnRzKHNzbF9jdHgsc3NsX2NvbiwwKSkgeworICAgICAgICAgICAgKng1MDkgPSBTU0xfZ2V0X2NlcnRpZmljYXRlKHMpOworICAgICAgICAgICAgKnBrZXkgPSBTU0xfZ2V0X3ByaXZhdGVrZXkocyk7CisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKDApOworI2Vsc2UgLyogQ09NTUVOVCAqLworICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCit9CisjZW5kaWYgLyogVVNFX0NFUlRfQ0IgKi8KKworI2lmbmRlZiBNU19DQUxMQkFDSworI2RlZmluZSBNU19DQUxMQkFDSworI2VuZGlmIC8qIE1TX0NBTExCQUNLICovCisKK3N0YXRpYyBSU0EgTVNfQ0FMTEJBQ0sgKgorI2lmZGVmIENLX0FOU0lDCit0bXBfcnNhX2NiKFNTTCAqIHMsIGludCBleHBvcnQsIGludCBrZXlsZW5ndGgpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG1wX3JzYV9jYihzLGV4cG9ydCxrZXlsZW5ndGgpCitTU0wgKnM7CitpbnQgZXhwb3J0OworaW50IGtleWxlbmd0aDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHN0YXRpYyBSU0EgKnJzYV90bXA9TlVMTDsKKyAgICBleHRlcm4gaW50IHF1aWV0OworCisjaWZuZGVmIE5PX1JTQQorICAgIGlmIChyc2FfdG1wID09IE5VTEwpCisgICAgeworICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICBwcmludGYoIkdlbmVyYXRpbmcgdGVtcG9yYXJ5ICglZCBiaXQpIFJTQSBrZXkuLi5cclxuIixrZXlsZW5ndGgpOworCisgICAgICAgIHJzYV90bXA9UlNBX2dlbmVyYXRlX2tleShrZXlsZW5ndGgsUlNBX0Y0LE5VTEwsTlVMTCk7CisKKyAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgcHJpbnRmKCJcclxuIik7CisgICAgfQorI2Vsc2UgLyogTk9fUlNBICovCisgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICBwcmludGYoIlVuYWJsZSB0byBnZW5lcmF0ZSB0ZW1wb3JhcnkgUlNBIGtleS4uLlxyXG4iKTsKKyNlbmRpZgorICAgIHJldHVybihyc2FfdG1wKTsKK30KKworCisjaWZuZGVmIE5PX0RICitzdGF0aWMgdW5zaWduZWQgY2hhciBkaDUxMl9wW109eworICAgIDB4RTksMHg0RSwweDNBLDB4NjQsMHhGQSwweDY1LDB4NUYsMHhBNiwweDQ0LDB4QzcsMHhGQywweEYxLAorICAgIDB4MTYsMHg4QiwweDExLDB4MTEsMHg3QSwweEYwLDB4QjIsMHg0OSwweDgwLDB4NTYsMHhBMywweEY4LAorICAgIDB4MEYsMHg3RCwweDAxLDB4NjgsMHg1RCwweEY2LDB4OEEsMHhFQSwweDhDLDB4REQsMHgwMSwweERDLAorICAgIDB4NDMsMHgxOCwweEUwLDB4QzQsMHg4OSwweDgwLDB4RTYsMHgyRCwweDQ0LDB4NzcsMHg0NSwweEZELAorICAgIDB4QkEsMHhGQywweDQzLDB4MzUsMHgxMiwweEMwLDB4RUQsMHgzMiwweEQzLDB4MTYsMHhFRiwweDUxLAorICAgIDB4MDksMHg0NCwweEEyLDB4REIsCit9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGg1MTJfZ1tdPXsKKyAgICAweDA1LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGg3NjhfcFtdPXsKKyAgICAweDhCLDB4MkEsMHg4QywweDZDLDB4MEYsMHg4NywweEM3LDB4MzQsMHhFRSwweDJFLDB4RkIsMHg2MCwKKyAgICAweDk0LDB4QjMsMHhCRiwweDk1LDB4QkEsMHg4NCwweDc0LDB4ODYsMHhFQSwweEUwLDB4QTQsMHgzMywKKyAgICAweEUwLDB4OEYsMHg3QywweDc5LDB4NUMsMHg2MiwweEUyLDB4OTEsMHhDNSwweDZELDB4NjgsMHhCOSwKKyAgICAweDZDLDB4NUUsMHg0RSwweDk0LDB4MEMsMHg4RSwweDU2LDB4OEUsMHhFQiwweDk4LDB4N0MsMHg2RSwKKyAgICAweDBFLDB4RjIsMHhENSwweEFBLDB4MjIsMHgyNywweDNGLDB4MEYsMHhBRiwweDEwLDB4QjUsMHgwQiwKKyAgICAweDE2LDB4Q0MsMHgwNSwweDI3LDB4QkIsMHg1OCwweDZELDB4NjEsMHg0QiwweDJCLDB4QUIsMHhEQywKKyAgICAweDZBLDB4MTUsMHhCQywweDM2LDB4NzUsMHg0RCwweEVDLDB4QUIsMHhGQSwweEI2LDB4RTEsMHhCMSwKKyAgICAweDEzLDB4NzAsMHhEOCwweDc3LDB4Q0QsMHg1RSwweDUxLDB4NzcsMHg4MSwweDBELDB4NzcsMHg0MywKK307CitzdGF0aWMgdW5zaWduZWQgY2hhciBkaDc2OF9nW109eworICAgIDB4MDUsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBkaDEwMjRfcFtdPXsKKyAgICAweEE0LDB4NzUsMHhDRiwweDM1LDB4MDAsMHhBRiwweDNDLDB4MTcsMHhDRSwweEIwLDB4RDAsMHg1MiwKKyAgICAweDQzLDB4QTAsMHgwRSwweEZBLDB4QTIsMHhDOSwweEJFLDB4MEIsMHg3NiwweDdBLDB4RDksMHgyRSwKKyAgICAweEY0LDB4OTcsMHhBQywweDAyLDB4MjQsMHg2OSwweEY2LDB4MzYsMHg0RiwweEFCLDB4Q0MsMHg0MywKKyAgICAweEMxLDB4NzQsMHhGRiwweEEzLDB4RDQsMHgwNCwweDBGLDB4MTEsMHgyQiwweDZELDB4OEMsMHg0NywKKyAgICAweEM5LDB4Q0YsMHg0MCwweDkzLDB4OUIsMHg3RCwweDFFLDB4NTIsMHg4NSwweEIyLDB4MTcsMHg1NSwKKyAgICAweDlDLDB4RjIsMHg0MSwweDAyLDB4MkEsMHg5RCwweDVGLDB4MjQsMHgyMiwweEM2LDB4MDQsMHhDNCwKKyAgICAweEFCLDB4OTIsMHg2RCwweEM3LDB4QzgsMHhGMywweDQxLDB4NTgsMHg2QywweDg2LDB4RkQsMHhCOCwKKyAgICAweDBGLDB4MkQsMHhERCwweEJGLDB4QTgsMHg0MCwweDBDLDB4NTgsMHhDOCwweEYyLDB4M0YsMHgxOCwKKyAgICAweEVGLDB4RjEsMHg5MywweDNFLDB4QkEsMHgxNiwweDQxLDB4QkUsMHgzMiwweDZDLDB4QzUsMHg2MywKKyAgICAweEZGLDB4OEEsMHgwMiwweDNELDB4QUMsMHhENSwweDVBLDB4NDksMHg2NCwweDM0LDB4MTQsMHgyRSwKKyAgICAweEZCLDB4MkUsMHhFNywweDM5LDB4MUEsMHgwRiwweDNDLDB4MzMsCit9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGgxMDI0X2dbXT17CisgICAgMHgwNSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRoMTUzNl9wW109eworICAgIDB4QTMsMHgyQiwweDc1LDB4MEUsMHg3QiwweDMxLDB4ODIsMHhDQSwweEYyLDB4RkMsMHhGMywweDNELAorICAgIDB4Q0UsMHg1RiwweENELDB4NUIsMHg5NSwweEY2LDB4MkYsMHhBNCwweDVELDB4MDgsMHgyNiwweEQyLAorICAgIDB4NUYsMHhDMCwweDNGLDB4QzUsMHhEOCwweEEyLDB4RkUsMHg4MywweDI2LDB4QkMsMHhFQiwweDdELAorICAgIDB4RjAsMHg0RSwweEQyLDB4QTYsMHhCQiwweDNDLDB4ODgsMHg2MywweENFLDB4OTgsMHhERSwweDA4LAorICAgIDB4RTIsMHhFMSwweEFGLDB4RTIsMHgzOCwweEE4LDB4RkEsMHg2OCwweDc2LDB4OEQsMHhCRiwweERGLAorICAgIDB4QkIsMHgzMCwweDE1LDB4RkUsMHhCRCwweDIyLDB4Q0MsMHgwMywweDRFLDB4NUUsMHgzMywweEEzLAorICAgIDB4NkQsMHhENiwweDY4LDB4MTIsMHg5NywweDE3LDB4NEIsMHhCNSwweDg0LDB4NUYsMHg1RiwweEEzLAorICAgIDB4NUMsMHgyRiwweEE0LDB4MTAsMHhDMSwweEFELDB4QkYsMHhBQywweDMwLDB4Q0EsMHg0NywweDY0LAorICAgIDB4NjMsMHhGRSwweEVFLDB4RUUsMHhBMSwweDY0LDB4NzMsMHg3MCwweEFBLDB4RjksMHhGRSwweEM2LAorICAgIDB4QUQsMHg1RSwweEY2LDB4RjMsMHg5QywweERGLDB4MzQsMHg1MywweDM0LDB4NzIsMHhBNiwweEE0LAorICAgIDB4QkIsMHg4MSwweDVBLDB4NDMsMHg0MSwweEZELDB4NDEsMHgwNSwweDVCLDB4NzcsMHg3QiwweDg0LAorICAgIDB4MDMsMHhGQSwweDhBLDB4RkEsMHhGNywweDhFLDB4MEYsMHhDQiwweDUxLDB4QTIsMHhCOCwweDQ1LAorICAgIDB4RkYsMHg1OSwweDQyLDB4RUYsMHhDRiwweEY2LDB4MjUsMHgzNywweEUyLDB4NkQsMHhGRiwweDY5LAorICAgIDB4MTEsMHhGNSwweDc3LDB4NTksMHg3OSwweDFDLDB4NUYsMHgwNSwweEZDLDB4N0EsMHg2NSwweDgxLAorICAgIDB4MDMsMHg0QSwweDc4LDB4QzYsMHhFOSwweDQ4LDB4NzMsMHhGNiwweDEwLDB4QkMsMHg5OSwweDFDLAorICAgIDB4RUUsMHg0NCwweDJGLDB4OEIsMHg3MCwweENBLDB4QTgsMHhCNiwweDAyLDB4ODMsMHgzRSwweDBCLAorfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRoMTUzNl9nW109eworICAgIDB4MDUsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBkaDIwNDhfcFtdPXsKKyAgICAweEZBLDB4NEUsMHhFNCwweDNCLDB4RkEsMHhDMSwweDg3LDB4REQsMHhFNywweEM2LDB4OEIsMHhFNiwKKyAgICAweDEzLDB4ODUsMHhCQywweDlCLDB4MkIsMHg4QiwweDVCLDB4NDYsMHhCQiwweDhCLDB4ODYsMHg2RCwKKyAgICAweEQ3LDB4QjYsMHhENSwweDQ5LDB4QzUsMHg1NCwweEYyLDB4M0UsMHhEMiwweDM5LDB4NjQsMHg5QiwKKyAgICAweDBFLDB4MzMsMHgzOSwweDhGLDB4RkEsMHhGQSwweEQ5LDB4NzgsMHhFRCwweDM0LDB4ODIsMHgyOSwKKyAgICAweDM3LDB4NTgsMHg0RCwweDVELDB4NDAsMHhDQiwweDY5LDB4RTMsMHg4QSwweDlGLDB4MTcsMHgwQywKKyAgICAweDAxLDB4MjMsMHg2QiwweDA1LDB4MDEsMHhBRiwweDMzLDB4REUsMHhERiwweDFBLDB4QkIsMHg3QiwKKyAgICAweDZBLDB4OUYsMHhEOCwweEVELDB4OEQsMHg1RSwweDQ0LDB4MTksMHg1QiwweEUwLDB4QjYsMHgyMywKKyAgICAweEY5LDB4N0EsMHg5NiwweDZFLDB4OTQsMHgzMywweDMxLDB4NDksMHhCQSwweDg0LDB4RDUsMHgxMiwKKyAgICAweEQ3LDB4NkQsMHhEQywweDM1LDB4NTQsMHg2NCwweEEzLDB4RDgsMHgwNCwweDI2LDB4QzUsMHhBRiwKKyAgICAweDdGLDB4RTMsMHhGRSwweDZGLDB4QkUsMHhENSwweDE3LDB4NzIsMHg0QiwweEE2LDB4RDAsMHhBNywKKyAgICAweDVGLDB4MTgsMHhGNSwweEYwLDB4MkQsMHgxMSwweDlBLDB4RjYsMHhENSwweDNCLDB4NkMsMHg2MSwKKyAgICAweDNDLDB4NkYsMHg4RSwweDA5LDB4NEYsMHgyQywweEUxLDB4MjYsMHgwNiwweDUxLDB4QjMsMHgxOSwKKyAgICAweDg1LDB4ODUsMHgxMywweEY5LDB4QzIsMHg2RSwweDgwLDB4MjgsMHg5RSwweDhBLDB4QTAsMHgwMSwKKyAgICAweDQ2LDB4RDEsMHg4NSwweDQ0LDB4OEMsMHhFNiwweEVFLDB4N0UsMHgxRSwweDE3LDB4M0QsMHhCQSwKKyAgICAweDU0LDB4RkYsMHhFOCwweDBFLDB4REQsMHg1MSwweEYzLDB4NzQsMHg3RiwweDBELDB4MEIsMHhBQiwKKyAgICAweENBLDB4ODQsMHg4RCwweDI0LDB4NUQsMHg1NiwweEQ0LDB4NDcsMHgwMiwweEZDLDB4OTMsMHg5RiwKKyAgICAweEFFLDB4OUIsMHg1QywweERCLDB4NjMsMHhFQiwweDY1LDB4MDEsMHgzOCwweEMyLDB4N0IsMHgzMCwKKyAgICAweDFFLDB4MTcsMHgxQywweDc1LDB4RjUsMHgxNiwweDNCLDB4NEYsMHg1RiwweDQxLDB4MzIsMHhCNSwKKyAgICAweEZGLDB4OUUsMHg2MSwweEZELDB4RDIsMHg2MiwweDZFLDB4RkQsMHg4QSwweDI4LDB4OTMsMHg1OSwKKyAgICAweDJELDB4NzAsMHgxNCwweDRELDB4RTEsMHg4NiwweEQ1LDB4OTAsMHhCNCwweERGLDB4NzIsMHg3MSwKKyAgICAweEUwLDB4QjQsMHhEMCwweEQ2LDB4ODIsMHgzQSwweDRBLDB4MDQsMHg1OCwweDMyLDB4MEIsMHhEMywKKyAgICAweDUxLDB4MTMsMHgzMiwweDYzLAorfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRoMjA0OF9nW109eworICAgIDB4MDIsCit9OworCitzdGF0aWMgREggKgorZ2V0X2RoNTEyKCkKK3sKKyAgICBESCAqZGg9TlVMTDsKKworICAgIGlmICgoZGg9REhfbmV3KCkpID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICBkaC0+cD1CTl9iaW4yYm4oZGg1MTJfcCxzaXplb2YoZGg1MTJfcCksTlVMTCk7CisgICAgZGgtPmc9Qk5fYmluMmJuKGRoNTEyX2csc2l6ZW9mKGRoNTEyX2cpLE5VTEwpOworICAgIGlmICgoZGgtPnAgPT0gTlVMTCkgfHwgKGRoLT5nID09IE5VTEwpKQorICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgcmV0dXJuKGRoKTsKK30KKworc3RhdGljIERIICoKK2dldF9kaDc2OCgpCit7CisgICAgREggKmRoPU5VTEw7CisKKyAgICBpZiAoKGRoPURIX25ldygpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgZGgtPnA9Qk5fYmluMmJuKGRoNzY4X3Asc2l6ZW9mKGRoNzY4X3ApLE5VTEwpOworICAgIGRoLT5nPUJOX2JpbjJibihkaDc2OF9nLHNpemVvZihkaDc2OF9nKSxOVUxMKTsKKyAgICBpZiAoKGRoLT5wID09IE5VTEwpIHx8IChkaC0+ZyA9PSBOVUxMKSkKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIHJldHVybihkaCk7Cit9CisKK3N0YXRpYyBESCAqCitnZXRfZGgxMDI0KCkKK3sKKyAgICBESCAqZGg9TlVMTDsKKworICAgIGlmICgoZGg9REhfbmV3KCkpID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICBkaC0+cD1CTl9iaW4yYm4oZGgxMDI0X3Asc2l6ZW9mKGRoMTAyNF9wKSxOVUxMKTsKKyAgICBkaC0+Zz1CTl9iaW4yYm4oZGgxMDI0X2csc2l6ZW9mKGRoMTAyNF9nKSxOVUxMKTsKKyAgICBpZiAoKGRoLT5wID09IE5VTEwpIHx8IChkaC0+ZyA9PSBOVUxMKSkKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIHJldHVybihkaCk7Cit9CisKK3N0YXRpYyBESCAqCitnZXRfZGgxNTM2KCkKK3sKKyAgICBESCAqZGg9TlVMTDsKKworICAgIGlmICgoZGg9REhfbmV3KCkpID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICBkaC0+cD1CTl9iaW4yYm4oZGgxNTM2X3Asc2l6ZW9mKGRoMTUzNl9wKSxOVUxMKTsKKyAgICBkaC0+Zz1CTl9iaW4yYm4oZGgxNTM2X2csc2l6ZW9mKGRoMTUzNl9nKSxOVUxMKTsKKyAgICBpZiAoKGRoLT5wID09IE5VTEwpIHx8IChkaC0+ZyA9PSBOVUxMKSkKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIHJldHVybihkaCk7Cit9CisKK3N0YXRpYyBESCAqCitnZXRfZGgyMDQ4KCkKK3sKKyAgICBESCAqZGg9TlVMTDsKKworICAgIGlmICgoZGg9REhfbmV3KCkpID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICBkaC0+cD1CTl9iaW4yYm4oZGgyMDQ4X3Asc2l6ZW9mKGRoMjA0OF9wKSxOVUxMKTsKKyAgICBkaC0+Zz1CTl9iaW4yYm4oZGgyMDQ4X2csc2l6ZW9mKGRoMjA0OF9nKSxOVUxMKTsKKyAgICBpZiAoKGRoLT5wID09IE5VTEwpIHx8IChkaC0+ZyA9PSBOVUxMKSkKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIHJldHVybihkaCk7Cit9CisjZW5kaWYgLyogTk9fREggKi8KKworc3RhdGljIERIIE1TX0NBTExCQUNLICoKKyNpZmRlZiBDS19BTlNJQwordG1wX2RoX2NiKFNTTCAqIHMsIGludCBleHBvcnQsIGludCBrZXlsZW5ndGgpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG1wX2RoX2NiKHMsZXhwb3J0LGtleWxlbmd0aCkKK1NTTCAqczsKK2ludCBleHBvcnQ7CitpbnQga2V5bGVuZ3RoOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgc3RhdGljIERIICpkaF90bXA9TlVMTDsKKyAgICBCSU8gKmJpbz1OVUxMOworICAgIGV4dGVybiBpbnQgcXVpZXQ7CisKKyNpZm5kZWYgTk9fREgKKyAgICBpZiAoZGhfdG1wID09IE5VTEwpCisgICAgeworICAgICAgICBpZiAoc3NsX2RoX3BhcmFtX2ZpbGUgICYmCisgICAgICAgICAgICAgKGJpbz1CSU9fbmV3X2ZpbGUoc3NsX2RoX3BhcmFtX2ZpbGUsInIiKSkgIT0gTlVMTCkKKyAgICAgICAgICAgIGRoX3RtcD1QRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKGJpbyAhPSBOVUxMKQorICAgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKKworICAgICAgICBpZiAoIGRoX3RtcCA9PSBOVUxMICkgeworICAgICAgICAgICAgaWYgKCBrZXlsZW5ndGggPCA3NjggKQorICAgICAgICAgICAgICAgIGRoX3RtcCA9IGdldF9kaDUxMigpOworICAgICAgICAgICAgZWxzZSBpZiAoIGtleWxlbmd0aCA8IDEwMjQgKQorICAgICAgICAgICAgICAgIGRoX3RtcCA9IGdldF9kaDc2OCgpOworICAgICAgICAgICAgZWxzZSBpZiAoIGtleWxlbmd0aCA8IDE1MzYgKQorICAgICAgICAgICAgICAgIGRoX3RtcCA9IGdldF9kaDEwMjQoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlsZW5ndGggPCAyMDQ4ICkKKyAgICAgICAgICAgICAgICBkaF90bXAgPSBnZXRfZGgxNTM2KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGhfdG1wID0gZ2V0X2RoMjA0OCgpOworICAgICAgICB9CisgICAgfQorI2Vsc2UgLyogTk9fREggKi8KKyAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgIHByaW50ZigiREggbm90IHN1cHBvcnRlZC4uLlxyXG4iKTsKKyNlbmRpZiAvKiBOT19ESCAqLworICAgIHJldHVybihkaF90bXApOworfQorCitzdGF0aWMgdm9pZAorc3NsX2Rpc3BsYXlfY29tcChTU0wgKiBzc2wpCit7CisgICAgaWYgKCAhY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHNzbCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoc3NsLT5leHBhbmQgPT0gTlVMTCB8fCBzc2wtPmV4cGFuZC0+bWV0aCA9PSBOVUxMKQorICAgICAgICBwcmludGYoIkNvbXByZXNzaW9uOiBOb25lXHJcbiIpOworICAgIGVsc2UgeworICAgICAgICBwcmludGYoIkNvbXByZXNzaW9uOiAlc1xyXG4iLHNzbC0+ZXhwYW5kLT5tZXRoLT5uYW1lKTsKKyAgICB9Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitzc2xfZGlzcGxheV9jb25uZWN0X2RldGFpbHMoU1NMICogc3NsX2NvbiwgaW50IHNlcnZlciwgaW50IHZlcmJvc2UpCisjZWxzZSAvKiBDS19BTlNJQyAqLworc3NsX2Rpc3BsYXlfY29ubmVjdF9kZXRhaWxzKHNzbF9jb24sc2VydmVyLHZlcmJvc2UpCitTU0wgKnNzbF9jb247CitpbnQgc2VydmVyOworaW50IHZlcmJvc2U7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBYNTA5ICpwZWVyOworICAgIFNTTF9DSVBIRVIgKiBjaXBoZXI7CisgICAgY29uc3QgY2hhciAqY2lwaGVyX2xpc3Q7CisgICAgY2hhciBidWZbNTEyXT0iIjsKKworICAgIGlmICggIWNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSApCisgICAgICAgIHJldHVybigwKTsKKworICAgIGlmICggaW5zZXJ2ZXIgJiYgIXRuX2RlYiApCisgICAgICAgIHJldHVybigwKTsKKworICAgIC8qIHRoZSBjaXBoZXIgbGlzdCAqY2FuKiBiZSBOVUxMIC4uLiB1c2VsZXNzIGJ1dCBpdCBoYXBwZW5zISAqLworICAgIGNpcGhlciA9IFNTTF9nZXRfY3VycmVudF9jaXBoZXIoc3NsX2Nvbik7CisgICAgY2lwaGVyX2xpc3QgPSBTU0xfQ0lQSEVSX2dldF9uYW1lKGNpcGhlcik7CisgICAgU1NMX0NJUEhFUl9kZXNjcmlwdGlvbihjaXBoZXIsYnVmLHNpemVvZihidWYpKTsKKyAgICBpZiAoY2lwaGVyX2xpc3Q9PU5VTEwpCisgICAgICAgIGNpcGhlcl9saXN0PSI8TlVMTD4iOworICAgIHByaW50ZigiW1RMUyAtICVzIixidWYpOworICAgIHNzbF9kaXNwbGF5X2NvbXAoc3NsX2Nvbik7CisKKyAgICBpZiAoIHNlcnZlciApIHsKKyAgICAgICAgY2lwaGVyX2xpc3Q9U1NMX2dldF9zaGFyZWRfY2lwaGVycyhzc2xfY29uLGJ1Ziw1MTIpOworICAgICAgICBpZiAoY2lwaGVyX2xpc3Q9PU5VTEwpCisgICAgICAgICAgICBjaXBoZXJfbGlzdD0iPE5VTEw+IjsKKyAgICAgICAgcHJpbnRmKCJbVExTIC0gc2hhcmVkIGNpcGhlcnM9JXNdXHJcbiIsCisgICAgICAgICAgICAgICAgY2lwaGVyX2xpc3QpOworICAgICAgICB9ICAgICAgIAorICAgIGlmICggc2VydmVyIHx8IHRuX2RlYiApIHsKKyAgICAgICAgcGVlcj1TU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsX2Nvbik7CisgICAgICAgIGlmIChwZWVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShwZWVyKSxidWYsNTEyKTsKKyAgICAgICAgICAgIHByaW50ZigiW1RMUyAtIHN1YmplY3Q9JXNdXHJcbiIsYnVmKTsKKyAgICAgICAgICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHBlZXIpLGJ1Ziw1MTIpOworICAgICAgICAgICAgcHJpbnRmKCJbVExTIC0gaXNzdWVyPSVzXVxyXG4iLGJ1Zik7CisgICAgICAgICAgICAvKiBYNTA5X2ZyZWUocGVlcik7ICovCisgICAgICAgIH0gZWxzZSBpZiAoIXRsc19pc19rcmI1KDApKSB7CisgICAgICAgICAgICBpZiAoICFzc3RlbG5ldCAmJiAhdGNwX2luY29taW5nICkgeworICAgICAgICAgICAgICAgIHByaW50ZigiW1RMUyAtIE5vIGNlcnRpZmljYXRlIHByb3ZpZGVkLl1cclxuIik7CisgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAiW1RMUyAtIFRoZSBpZGVudGl0eSBvZiB0aGUgaG9zdCBjb3VsZCBub3QgYmUgdmVyaWZpZWQuXVxyXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qCisgKiBVc2UgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoU1NMX0NUWCAqLCB2b2lkICogdXNlcmRhdGEpCisgKiB0byBzZXQgdGhlIHZhbHVlIG9mIHRoZSB1c2VyZGF0YS4gIFdlIGFyZSBnb2luZyB0byB1c2UgaXQgdG8gc3RvcmUgdGhlCisgKiBwcm9tcHQuCisgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3NzbF9wYXNzd2RfY2FsbGJhY2soY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgcndmbGFnLCBWT0lEICogdXNlcmRhdGEpCisjZWxzZSAvKiBDS19BTlNJQyAqLworc3NsX3Bhc3N3ZF9jYWxsYmFjayhidWYsbGVuLHJ3ZmxhZyx1c2VyZGF0YSkKKyAgICBjaGFyICogYnVmOyBpbnQgbGVuOyBpbnQgcndmbGFnOyBWT0lEICp1c2VyZGF0YTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGV4dGVybiBjaGFyIHB3YnVmW107CisgICAgZXh0ZXJuIGludCAgcHdmbGcsIHB3Y3J5cHQ7CisgICAgaW50ICAgb2s7CisgICAgY2hhciAqcHJvbXB0PU5VTEw7CisKKyAgICBpZiAoIHB3YnVmWzBdICYmIHB3ZmxnICkgeworICAgICAgICBpbnQgbjsKKyAgICAgICAgbiA9IGNrc3RybmNweShidWYscHdidWYsbGVuKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgaWYgKCBwd2NyeXB0ICkKKyAgICAgICAgICAgIGNrX2VuY3J5cHQoKGNoYXIgKilidWYpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICByZXR1cm4obik7CisgICAgfQorCisgICAgaWYgKCB1c2VyZGF0YSA9PSBOVUxMICkKKyAgICAgICAgcHJvbXB0PSJFbnRlciBjZXJ0aWZpY2F0ZSBwYXNzcGhyYXNlOiAiOworICAgIGVsc2UKKyAgICAgICAgcHJvbXB0PShjaGFyKil1c2VyZGF0YTsKKyAgICBvayA9IHVxX3R4dChOVUxMLHByb21wdCwyLE5VTEwsYnVmLGxlbixOVUxMLERFRkFVTFRfVVFfVElNRU9VVCk7CisgICAgcmV0dXJuKG9rID4gMCA/IHN0cmxlbihidWYpIDogMCk7Cit9CisKKworLyogQXR0ZW1wdHMgdG8gbG9hZCBjZXJ0aWZpY2F0ZSBkYXRhIGludG8gdGhlIFRMUyBjb250ZXh0IHN0cnVjdHVyZXMgKi8KKy8qIFJldHVybnMgMSBvbiBzdWNjZXNzOyAwIG9uIGZhaWx1cmUgKi8KK2ludAordGxzX2xvYWRfY2VydHMoU1NMX0NUWCAqIGN0eCwgU1NMICogY29uLCBpbnQgc2VydmVyKQoreworICAgIGludCByYyA9IDE7CisgICAgZXh0ZXJuIGludCBxdWlldDsKKworICAgIGlmICggIWNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSApCisgICAgICAgIHJldHVybigwKTsKKworICAgIGRlYnVnKEYxMTEsInRsc19sb2FkX2NlcnRzIiwiU1NMX0NUWCIsY3R4KTsKKyAgICBkZWJ1ZyhGMTExLCJ0bHNfbG9hZF9jZXJ0cyIsIlNTTCIsY29uKTsKKyAgICBkZWJ1ZyhGMTExLCJ0bHNfbG9hZF9jZXJ0cyIsInNlcnZlciIsc2VydmVyKTsKKworICAgIGlmICggY29uICkgeworICAgICAgICBpZiAoc3NsX3JzYV9jZXJ0X2ZpbGUpIHsKKyAgICAgICAgICAgIGlmICggc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgIHByaW50ZigiTG9hZGluZyBSU0EgY2VydGlmaWNhdGUgaW50byBTU0xcclxuIik7CisKKyAgICAgICAgICAgIHJjID0gU1NMX3VzZV9jZXJ0aWZpY2F0ZV9maWxlKGNvbiwgc3NsX3JzYV9jZXJ0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfRklMRVRZUEVfUEVNKTsKKyAgICAgICAgICAgIGlmICghcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAhcXVpZXQgfHwgc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIGxvYWRpbmcgY2VydGlmaWNhdGUgZnJvbSAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9yc2FfY2VydF9maWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFzc2xfcnNhX2tleV9maWxlIHx8ICFzc2xfcnNhX2tleV9maWxlWzBdKQorICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2xfcnNhX2tleV9maWxlLHNzbF9yc2FfY2VydF9maWxlKTsKKworICAgICAgICAgICAgICAgIHJjID0gU1NMX3VzZV9Qcml2YXRlS2V5X2ZpbGUoY29uLCBzc2xfcnNhX2tleV9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5X0ZJTEVUWVBFX1BFTSk7CisgICAgICAgICAgICAgICAgaWYgKCFyYykKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBTU0xfdXNlX1ByaXZhdGVLZXlfZmlsZShjb24sIHNzbF9yc2FfY2VydF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9GSUxFVFlQRV9QRU0pOworICAgICAgICAgICAgICAgIGlmICghcmMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICFxdWlldCB8fCBzc2xfZGVidWdfZmxhZyApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIGxvYWRpbmcga2V5IGZyb20gJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3JzYV9rZXlfZmlsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBTU0xfY2hlY2tfcHJpdmF0ZV9rZXkoY29uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyYykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzc2xfZGVidWdfZmxhZyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICJQcml2YXRlIGtleSBkb2VzIG5vdCBtYXRjaCB0aGUgY2VydGlmaWNhdGUgcHVibGljIGtleVxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzc2xfZHNhX2NlcnRfZmlsZSkgeworICAgICAgICAgICAgaWYgKCBzc2xfZGVidWdfZmxhZyApCisgICAgICAgICAgICAgICAgcHJpbnRmKCJMb2FkaW5nIERTQSBjZXJ0aWZpY2F0ZSBpbnRvIFNTTFxyXG4iKTsKKworICAgICAgICAgICAgcmMgPSBTU0xfdXNlX2NlcnRpZmljYXRlX2ZpbGUoY29uLCBzc2xfZHNhX2NlcnRfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9GSUxFVFlQRV9QRU0pOworICAgICAgICAgICAgaWYgKCFyYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNzbF9kZWJ1Z19mbGFnICkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIGxvYWRpbmcgY2VydGlmaWNhdGUgZnJvbSAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9kc2FfY2VydF9maWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghc3NsX2RoX2tleV9maWxlIHx8ICFzc2xfZGhfa2V5X2ZpbGVbMF0pCisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzbF9kaF9rZXlfZmlsZSxzc2xfZHNhX2NlcnRfZmlsZSk7CisgICAgICAgICAgICAgICAgcmMgPSBTU0xfdXNlX1ByaXZhdGVLZXlfZmlsZShjb24sIHNzbF9kaF9rZXlfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9GSUxFVFlQRV9QRU0pOworICAgICAgICAgICAgICAgIGlmICghcmMpCisgICAgICAgICAgICAgICAgICAgIHJjID0gU1NMX3VzZV9Qcml2YXRlS2V5X2ZpbGUoY29uLCBzc2xfZHNhX2NlcnRfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfRklMRVRZUEVfUEVNKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJjKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhcXVpZXQgfHwgc3NsX2RlYnVnX2ZsYWcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIGxvYWRpbmcga2V5IGZyb20gJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX2RoX2tleV9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gU1NMX2NoZWNrX3ByaXZhdGVfa2V5KGNvbik7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAgICAiUHJpdmF0ZSBrZXkgZG9lcyBub3QgbWF0Y2ggdGhlIGNlcnRpZmljYXRlIHB1YmxpYyBrZXlcbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNzbF9yc2FfY2VydF9maWxlKSB7CisgICAgICAgICAgICBpZiAoIHNzbF9kZWJ1Z19mbGFnICkKKyAgICAgICAgICAgICAgICBwcmludGYoIkxvYWRpbmcgUlNBIGNlcnRpZmljYXRlIGludG8gU1NMXHJcbiIpOworCisgICAgICAgICAgICByYyA9IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2ZpbGUoY3R4LCBzc2xfcnNhX2NlcnRfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfRklMRVRZUEVfUEVNKTsKKyAgICAgICAgICAgIGlmICghcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAhcXVpZXQgfHwgc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIGxvYWRpbmcgY2VydGlmaWNhdGUgZnJvbSAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9yc2FfY2VydF9maWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFzc2xfcnNhX2tleV9maWxlIHx8ICFzc2xfcnNhX2tleV9maWxlWzBdKQorICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2xfcnNhX2tleV9maWxlLHNzbF9yc2FfY2VydF9maWxlKTsKKworICAgICAgICAgICAgICAgIHJjID0gU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKGN0eCwgc3NsX3JzYV9rZXlfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9GSUxFVFlQRV9QRU0pOworICAgICAgICAgICAgICAgIGlmICghcmMpCisgICAgICAgICAgICAgICAgICByYyA9IFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShjdHgsIHNzbF9yc2FfY2VydF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9GSUxFVFlQRV9QRU0pOworICAgICAgICAgICAgICAgIGlmICghcmMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzc2xfZGVidWdfZmxhZyApCisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBsb2FkaW5nIGtleSBmcm9tICVzXHJcbiIsc3NsX3JzYV9rZXlfZmlsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBTU0xfQ1RYX2NoZWNrX3ByaXZhdGVfa2V5KGN0eCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgIlByaXZhdGUga2V5IGRvZXMgbm90IG1hdGNoIHRoZSBjZXJ0aWZpY2F0ZSBwdWJsaWMga2V5XHJcbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzc2xfZHNhX2NlcnRfZmlsZSkgeworICAgICAgICAgICAgaWYgKCBzc2xfZGVidWdfZmxhZyApCisgICAgICAgICAgICAgIHByaW50ZigiTG9hZGluZyBEU0EgY2VydGlmaWNhdGUgaW50byBTU0xcclxuIik7CisKKyAgICAgICAgICAgIHJjID0gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZShjdHgsIHNzbF9kc2FfY2VydF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfRklMRVRZUEVfUEVNKTsKKyAgICAgICAgICAgIGlmICghcmMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNzbF9kZWJ1Z19mbGFnICkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIGxvYWRpbmcgY2VydGlmaWNhdGUgZnJvbSAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX2RzYV9jZXJ0X2ZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFzc2xfZGhfa2V5X2ZpbGUgfHwgIXNzbF9kaF9rZXlfZmlsZVswXSkKKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NsX2RoX2tleV9maWxlLHNzbF9kc2FfY2VydF9maWxlKTsKKyAgICAgICAgICAgICAgICByYyA9IFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShjdHgsIHNzbF9kaF9rZXlfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9GSUxFVFlQRV9QRU0pOworICAgICAgICAgICAgICAgIGlmICghcmMpCisgICAgICAgICAgICAgICAgICByYyA9IFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShjdHgsIHNzbF9kc2FfY2VydF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9GSUxFVFlQRV9QRU0pOworICAgICAgICAgICAgICAgIGlmICghcmMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzc2xfZGVidWdfZmxhZyApCisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBsb2FkaW5nIGtleSBmcm9tICVzXHJcbiIsc3NsX2RoX2tleV9maWxlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByYyA9IFNTTF9DVFhfY2hlY2tfcHJpdmF0ZV9rZXkoY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyYykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzc2xfZGVidWdfZmxhZyApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAgICAiUHJpdmF0ZSBrZXkgZG9lcyBub3QgbWF0Y2ggdGhlIGNlcnRpZmljYXRlIHB1YmxpYyBrZXlcbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNzbF9yc2FfY2VydF9jaGFpbl9maWxlICYmIHNlcnZlcikgeworICAgICAgICBpbnQgc2tpcDFzdCA9IDA7CisgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgIHByaW50ZigiTG9hZGluZyBSU0EgQ2VydGlmaWNhdGUgQ2hhaW4gaW50byBTU0xcclxuIik7CisgICAgICAgIGlmICghY2tzdHJjbXAoc3NsX3JzYV9jZXJ0X2NoYWluX2ZpbGUsc3NsX3JzYV9jZXJ0X2ZpbGUsLTEsCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgICAgIDAKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgIHNraXAxc3QgPSAxOworICAgICAgICByYyA9IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoY3R4LHNzbF9yc2FfY2VydF9jaGFpbl9maWxlKTsKKyAgICAgICAgaWYgKCFyYyAmJiBzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIGxvYWRpbmcgUlNBIENlcnRpZmljYXRlIENoYWluIGludG8gU1NMXHJcbiIpOworICAgIH0KKyAgICBpZiAoc3NsX2RzYV9jZXJ0X2NoYWluX2ZpbGUgJiYgc2VydmVyKSB7CisgICAgICAgIGludCBza2lwMXN0ID0gMDsKKyAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgcHJpbnRmKCJMb2FkaW5nIERTQSBDZXJ0aWZpY2F0ZSBDaGFpbiBpbnRvIFNTTFxyXG4iKTsKKyAgICAgICAgaWYgKCFja3N0cmNtcChzc2xfZHNhX2NlcnRfY2hhaW5fZmlsZSxzc2xfZHNhX2NlcnRfZmlsZSwtMSwKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAgICAgMAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgMQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgc2tpcDFzdCA9IDE7CisgICAgICAgIHJjID0gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShjdHgsc3NsX2RzYV9jZXJ0X2NoYWluX2ZpbGUpOworICAgICAgICBpZiAoIXJjICYmIHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3IgbG9hZGluZyBEU0EgQ2VydGlmaWNhdGUgQ2hhaW4gaW50byBTU0xcclxuIik7CisgICAgfQorICAgIHJldHVybihyYyk7Cit9CisKK1ZPSUQKKyNpZmRlZiBDS19BTlNJQworc3NsX29uY2VfaW5pdCh2b2lkKQorI2Vsc2UKK3NzbF9vbmNlX2luaXQoKQorI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgQ09NUF9NRVRIT0QgKiBjbTsKKworICAgIGlmICggIWNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSApCisgICAgICAgIHJldHVybjsKKworICAgIGRlYnVnKEYxMTEsIktlcm1pdCBidWlsdCBmb3IgT3BlblNTTCIsT1BFTlNTTF9WRVJTSU9OX1RFWFQsU1NMRUFZX1ZFUlNJT05fTlVNQkVSKTsKKyNpZm5kZWYgT1MyT05MWQorICAgIGRlYnVnKEYxMTEsIk9wZW5TU0wgTGlicmFyeSIsU1NMZWF5X3ZlcnNpb24oU1NMRUFZX1ZFUlNJT04pLAorICAgICAgICAgICBTU0xlYXkoKSk7CisgICAgZGVidWcoRjExMCwiT3BlblNTTCBMaWJyYXJ5IixTU0xlYXlfdmVyc2lvbihTU0xFQVlfQlVJTFRfT04pLDApOworICAgIGRlYnVnKEYxMTAsIk9wZW5TU0wgTGlicmFyeSIsU1NMZWF5X3ZlcnNpb24oU1NMRUFZX0NGTEFHUyksMCk7CisgICAgZGVidWcoRjExMCwiT3BlblNTTCBMaWJyYXJ5IixTU0xlYXlfdmVyc2lvbihTU0xFQVlfUExBVEZPUk0pLDApOworCisgICAgLyogVGhlIGZvbGxvd2luZyB0ZXN0IGlzIHN1Z2dlc3RlZCBieSBSaWNoYXJkIExldml0dGUgKi8KKyAgICBpZiAoKChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIF4gU1NMZWF5KCkpICYgMHhmZmZmZmYwZikgCisjaWZkZWYgT1MyCisgICAgICAgICB8fCBja3N0cmNtcChPUEVOU1NMX1ZFUlNJT05fVEVYVCwoY2hhciAqKVNTTGVheV92ZXJzaW9uKFNTTEVBWV9WRVJTSU9OKSwtMSwxKQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgKSB7CisgICAgICAgIHNzbF9pbnN0YWxsZWQgPSAwOworICAgICAgICBkZWJ1ZyhGMTExLCJPcGVuU1NMIFZlcnNpb24gZG9lcyBub3QgbWF0Y2guICBCdWlsdCB3aXRoIiwKKyAgICAgICAgICAgICAgIFNTTGVheV92ZXJzaW9uKFNTTEVBWV9WRVJTSU9OKSxTU0xFQVlfVkVSU0lPTl9OVU1CRVIpOworICAgICAgICBwcmludGYoIj9PcGVuU1NMIGxpYnJhcmllcyBkbyBub3QgbWF0Y2ggcmVxdWlyZWQgdmVyc2lvbi4iKTsKKyAgICAgICAgcHJpbnRmKCIgIFNTTFxcVExTIHN1cHBvcnQgZGlzYWJsZWRcclxuXHJcbiIpOworICAgICAgICBibGVlcChCUF9GQUlMKTsKKyNpZmRlZiBTU0xETEwKKyAgICAgICAgY2tfc3NsX3VubG9hZGRsbCgpOworICAgICAgICBja19jcnlwdG9fdW5sb2FkZGxsKCk7CisjZW5kaWYgLyogU1NMRExMICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogT1MyT05MWSAqLworCisgICAgLyogaW5pdCB0aGluZ3Mgc28gd2Ugd2lsbCBnZXQgbWVhbmluZ2Z1bCBlcnJvciBtZXNzYWdlcworICAgICogcmF0aGVyIHRoYW4gbnVtYmVycworICAgICovCisgICAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworCisjaWZkZWYgU1NIQlVJTFRJTgorICAgIE9QRU5TU0xfYWRkX2FsbF9hbGdvcml0aG1zX25vY29uZigpOworI2Vsc2UKKyAgICAvKiBTU0xfbGlicmFyeV9pbml0KCkgb25seSBsb2FkcyB0aG9zZSBjaXBoZXJzIG5lZWRzIGZvciBTU0wgICovCisgICAgLyogVGhlc2UgaGFwcGVuIHRvIGJlIGEgc2ltaWxhciBzZXQgdG8gdGhvc2UgcmVxdWlyZWQgZm9yIFNTSCAqLworICAgIC8qIGJ1dCB0aGV5IGFyZSBub3QgYSBjb21wbGV0ZSBzZXQgb2YgY2lwaGVycyBwcm92aWRlZCBieSB0aGUgKi8KKyAgICAvKiBjcnlwdG8gbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgU1NMX2xpYnJhcnlfaW5pdCgpOworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKworI2lmZGVmIFpMSUIKKyAgICBjbSA9IENPTVBfemxpYigpOworICAgIGlmIChjbSAhPSBOVUxMICYmIGNtLT50eXBlICE9IE5JRF91bmRlZikgeworICAgICAgICBTU0xfQ09NUF9hZGRfY29tcHJlc3Npb25fbWV0aG9kKDB4ZTAsIGNtKTsgLyogRUFZJ3MgWkxJQiBJRCAqLworICAgIH0KKyNlbmRpZiAvKiBaTElCICovCisgICAgY20gPSBDT01QX3JsZSgpOworICAgIGlmIChjbSAhPSBOVUxMICYmIGNtLT50eXBlICE9IE5JRF91bmRlZikKKyAgICAgICAgU1NMX0NPTVBfYWRkX2NvbXByZXNzaW9uX21ldGhvZCgweGUxLCBjbSk7IC8qIEVBWSdzIFJMRSBJRCAqLworCisgICAgLyogRW5zdXJlIHRoZSBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBoYXMgZW5vdWdoIGVudHJvcHkgKi8KKyAgICBpZiAoICFSQU5EX3N0YXR1cygpICkgeworICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdPSIiOworICAgICAgICBjaGFyIHJhbmRvbWJ5dGVzWzI1Nl07CisgICAgICAgIGludCByYzEgPSAtMSwgcmMyID0gMTsgIC8qIGFzc3VtZSBmYWlsdXJlIGFuZCBzdWNjZXNzICovCisKKyAgICAgICAgZGVidWcoRjExMCwic3NsX29uY2VfaW5pdCIsIiFSQU5EX3N0YXR1cygpIiwwKTsKKworICAgICAgICBpZiAoIHNzbF9ybmRfZmlsZSA9PSBOVUxMICkgeworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX3JuZF9maWxlIiwic3NsX3JuZF9maWxlIGlzIE5VTEwiLDApOworICAgICAgICAgICAgUkFORF9maWxlX25hbWUoYnVmZmVyLDI1Nik7CisgICAgICAgICAgICBpZiAoIGJ1ZmZlclswXSApCisgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NsX3JuZF9maWxlLCBidWZmZXIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzbF9ybmRfZmlsZSwiLnJuZCIpOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTAsInNzbF9ybmRfZmlsZSIsc3NsX3JuZF9maWxlLDApOworCisgICAgICAgIHJjMSA9IFJBTkRfZWdkKHNzbF9ybmRfZmlsZSk7CisgICAgICAgIGRlYnVnKEYxMTEsInNzbF9vbmNlX2luaXQiLCJSQU5EX2VnZCgpIixyYzEpOworICAgICAgICBpZiAoIHJjMSA8PSAwICkgeworICAgICAgICAgICAgcmMyID0gUkFORF9sb2FkX2ZpbGUoc3NsX3JuZF9maWxlLCAtMSk7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJzc2xfb25jZV9pbml0IiwiUkFORF9sb2FkX2ZpbGUoKSIscmMxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcmMxIDw9IDAgJiYgIXJjMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpbWVfdCB0ID0gdGltZShOVUxMKTsKKyAgICAgICAgICAgIGludCB0bGVuID0gc2l6ZW9mKHRpbWVfdCk7CisgICAgICAgICAgICBpbnQgcGlkID0gZ2V0cGlkKCk7CisgICAgICAgICAgICBpbnQgcGxlbiA9IHNpemVvZihpbnQpOworICAgICAgICAgICAgaW50IG47CisjaWZuZGVmIFJBTkRfTUFYCisjZGVmaW5lIFJBTkRfTUFYIDB4N0ZGRgorI2VuZGlmCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfb25jZV9pbml0IiwiY2FsbGluZyBSQU5EX3NlZWQoKSIsMCk7CisKKyAgICAgICAgICAgIFJBTkRfc2VlZCgodW5zaWduZWQgY2hhciAqKSZ0LCB0bGVuKTsKKyAgICAgICAgICAgIFJBTkRfc2VlZCgodW5zaWduZWQgY2hhciAqKSZwaWQsIHBsZW4pOworCisgICAgICAgICAgICBzcmFuZCgodW5zaWduZWQgaW50KXQpOworICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlLjBmIiwgKCgoZG91YmxlKShyYW5kKCklUkFORF9NQVgpL1JBTkRfTUFYKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihyYW5kb21ieXRlcyktMTI4LTEpKSk7CisgICAgICAgICAgICBuID0gKGF0b2koYnVmZmVyKSsxKSUoc2l6ZW9mKHJhbmRvbWJ5dGVzKS0xMjgtMSk7CisgICAgICAgICAgICBSQU5EX3NlZWQocmFuZG9tYnl0ZXMsIDEyOCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICFSQU5EX3N0YXR1cygpICkgeworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX29uY2VfaW5pdCIsIlVuYWJsZSB0byBpbml0aWFsaXplIFBSTkciLDApOworICAgICAgICAgICAgcHJpbnRmKCIgVW5hYmxlIHRvIGxvYWQgJ3JhbmRvbSBzdGF0ZSdcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgU1NMIGFuZCBUTFMgYXJlIHVuYXZhaWxibGUuXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiIFVzZSBTRVQgQVVUSCBTU0wgUkFORE9NLUZJTEUgPGZpbGU+IGNvbW1hbmQgdG8gcHJvdmlkZSByYW5kb20gZGF0YS5cbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgU3BlY2lmaWVkIGZpbGUgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIG5ldyByYW5kb20gZGF0YSBhZnRlciB1c2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggc3NsX3JuZF9maWxlICkgeworICAgICAgICAgICAgaW50IHJjID0gUkFORF93cml0ZV9maWxlKHNzbF9ybmRfZmlsZSk7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJzc2xfb25jZV9pbml0IiwiUkFORF93cml0ZV9maWxlKCkiLHJjKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIE5UCisgICAgLy8gSW5pdGlhbGl6ZSBhZGRpdGlvbmFsIE9JRCB0eXBlcyBmb3IgdXNlIHdoZW4gc2F2aW5nIGNlcnRzIHRvIGEgZmlsZQorICAgIE9CSl9jcmVhdGUoIjIuOTk5OTkuMyIsIlNFVC5leDMiLCJTRVQgeDUwOXYzIGV4dGVuc2lvbiAzIik7CisjZW5kaWYgLyogTlQgKi8KKworICAgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV3aGVyZSB3ZSBjYW4gbG9nIGVycm9ycyB0byAqLworICAgIGJpb19lcnI9QklPX25ldyhCSU9fc19tZW0oKSk7CisKKyAgICBkZWJ1ZyhGMTAwLCJzc2xfb25jZV9pbml0KCkgY29tcGxldGUiLCIiLDApOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworc3NsX3RuX2luaXQoaW50IG1vZGUpCisjZWxzZQorc3NsX3RuX2luaXQobW9kZSkgaW50IG1vZGU7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyNpZmRlZiBLUkI1CisgICAgZXh0ZXJuIGNoYXIgKiBrNV9rZXl0YWI7CisgICAgZXh0ZXJuIGNoYXIgKiBrcmI1X2Rfc3J2OworI2VuZGlmIC8qIEtSQjUgKi8KKyAgICBzdGF0aWMgaW50IGxhc3Rfc3NsX21vZGUgPSAtMTsKKyAgICBTU0wgKiBzc2xfY29ueD1OVUxMLCAqIHRsc19jb254PU5VTEw7CisKKyAgICBzc2xfaW5pdGlhbGl6ZWQgPSAwOworCisgICAgaWYgKCAhY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgZGVidWcoRjExMSwic3NsX3RuX2luaXQiLCJtb2RlIixtb2RlKTsKKworICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgcHJpbnRmKCJTU0xfREVCVUdfRkxBRyBvblxyXG4iKTsKKworICAgIGlmIChsYXN0X3NzbF9tb2RlICE9IG1vZGUpIHsKKyAgICAgICAgaWYgKHNzbF9jdHgpIHsKKyAgICAgICAgICAgIFNTTF9DVFhfZnJlZShzc2xfY3R4KTsKKyAgICAgICAgICAgIHNzbF9jdHggPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICh0bHNfY3R4KSB7CisgICAgICAgICAgICBTU0xfQ1RYX2ZyZWUodGxzX2N0eCk7CisgICAgICAgICAgICB0bHNfY3R4ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggKGxhc3Rfc3NsX21vZGUgIT0gbW9kZSkgfHwgIXNzbF9jdHggfHwgIXRsc19jdHggKSB7CisgICAgICAgIGlmICggbW9kZSA9PSBTU0xfQ0xJRU5UICkgeworICAgICAgICAgICAgc3NsX2N0eD0oU1NMX0NUWCAqKVNTTF9DVFhfbmV3KFNTTHYyM19jbGllbnRfbWV0aG9kKCkpOworICAgICAgICAgICAgLyogVGhpcyBjYW4gZmFpbCBiZWNhdXNlIHdlIGRvIG5vdCBoYXZlIFJTQSBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgIGlmICggIXNzbF9jdHggKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX3RuX2luaXQiLCJTU0x2MjNfY2xpZW50X21ldGhvZCBmYWlsZWQiLDApOworICAgICAgICAgICAgICAgIHNzbF9jdHg9KFNTTF9DVFggKilTU0xfQ1RYX25ldyhTU0x2M19jbGllbnRfbWV0aG9kKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCAhc3NsX2N0eCApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfdG5faW5pdCIsIlNTTHYzX2NsaWVudF9tZXRob2QgZmFpbGVkIiwwKTsKKyAgICAgICAgICAgICAgICBsYXN0X3NzbF9tb2RlID0gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgfQorI2lmbmRlZiBDT01NRU5UCisgICAgICAgICAgICB0bHNfY3R4PShTU0xfQ1RYICopU1NMX0NUWF9uZXcoVExTdjFfY2xpZW50X21ldGhvZCgpKTsKKyNlbHNlIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIHRsc19jdHg9KFNTTF9DVFggKilTU0xfQ1RYX25ldyhTU0x2MjNfY2xpZW50X21ldGhvZCgpKTsKKyAgICAgICAgICAgIC8qIFRoaXMgY2FuIGZhaWwgYmVjYXVzZSB3ZSBkbyBub3QgaGF2ZSBSU0EgYXZhaWxhYmxlICovCisgICAgICAgICAgICBpZiAoICF0bHNfY3R4ICkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IiwiU1NMdjIzX2NsaWVudF9tZXRob2QgZmFpbGVkIiwwKTsKKyAgICAgICAgICAgICAgICB0bHNfY3R4PShTU0xfQ1RYICopU1NMX0NUWF9uZXcoU1NMdjNfY2xpZW50X21ldGhvZCgpKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICBpZiAoICF0bHNfY3R4ICkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IiwiVExTdjFfY2xpZW50X21ldGhvZCBmYWlsZWQiLDApOworICAgICAgICAgICAgICAgIGxhc3Rfc3NsX21vZGUgPSAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9CisjaWZkZWYgVVNFX0NFUlRfQ0IKKyAgICAgICAgICAgIFNTTF9DVFhfc2V0X2NsaWVudF9jZXJ0X2NiKHNzbF9jdHgsc3NsX2NsaWVudF9jZXJ0X2NhbGxiYWNrKTsKKyAgICAgICAgICAgIFNTTF9DVFhfc2V0X2NsaWVudF9jZXJ0X2NiKHRsc19jdHgsc3NsX2NsaWVudF9jZXJ0X2NhbGxiYWNrKTsKKyNlbmRpZiAvKiBVU0VfQ0VSVF9DQiAqLworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gU1NMX1NFUlZFUikgeworICAgICAgICAgICAgLyogV2UgYXJlIGEgc2VydmVyICovCisgICAgICAgICAgICBzc2xfY3R4PShTU0xfQ1RYICopU1NMX0NUWF9uZXcoU1NMdjIzX3NlcnZlcl9tZXRob2QoKSk7CisgICAgICAgICAgICAvKiBUaGlzIGNhbiBmYWlsIGJlY2F1c2Ugd2UgZG8gbm90IGhhdmUgUlNBIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgaWYgKCAhc3NsX2N0eCApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfdG5faW5pdCIsIlNTTHYyM19zZXJ2ZXJfbWV0aG9kIGZhaWxlZCIsMCk7CisgICAgICAgICAgICAgICAgc3NsX2N0eD0oU1NMX0NUWCAqKVNTTF9DVFhfbmV3KFNTTHYzX3NlcnZlcl9tZXRob2QoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoICFzc2xfY3R4ICkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IiwiU1NMdjNfc2VydmVyX21ldGhvZCBmYWlsZWQiLDApOworICAgICAgICAgICAgICAgIGxhc3Rfc3NsX21vZGUgPSAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgdGxzX2N0eD0oU1NMX0NUWCAqKVNTTF9DVFhfbmV3KFRMU3YxX3NlcnZlcl9tZXRob2QoKSk7CisjZWxzZSAvKiBDT01NRU5UICovCisgICAgICAgICAgICB0bHNfY3R4PShTU0xfQ1RYICopU1NMX0NUWF9uZXcoU1NMdjIzX3NlcnZlcl9tZXRob2QoKSk7CisgICAgICAgICAgICAvKiBUaGlzIGNhbiBmYWlsIGJlY2F1c2Ugd2UgZG8gbm90IGhhdmUgUlNBIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgaWYgKCAhdGxzX2N0eCApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfdG5faW5pdCIsIlNTTHYyM19zZXJ2ZXJfbWV0aG9kIGZhaWxlZCIsMCk7CisgICAgICAgICAgICAgICAgdGxzX2N0eD0oU1NMX0NUWCAqKVNTTF9DVFhfbmV3KFRMU3YxX3NlcnZlcl9tZXRob2QoKSk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgaWYgKCAhdGxzX2N0eCApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfdG5faW5pdCIsIlRMU3YxX3NlcnZlcl9tZXRob2QgZmFpbGVkIiwwKTsKKyAgICAgICAgICAgICAgICBsYXN0X3NzbF9tb2RlID0gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgLyogVW5rbm93biBtb2RlICovCisgICAgICAgICAgICByZXR1cm4oMCk7CisKKyAgICAgICAgaWYgKCAhaW5zZXJ2ZXIgKSB7CisgICAgICAgICAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihzc2xfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGVtX3Bhc3N3b3JkX2NiICopc3NsX3Bhc3N3ZF9jYWxsYmFjayk7CisgICAgICAgICAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYih0bHNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGVtX3Bhc3N3b3JkX2NiICopc3NsX3Bhc3N3ZF9jYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICAvKiBmb3IgU1NMIHN3aXRjaCBvbiBhbGwgdGhlIGludGVyb3BlcmFiaWxpdHkgYW5kIGJ1ZworICAgICAgICAgKiB3b3JrYXJvdW5kcyBzbyB0aGF0IHdlIHdpbGwgY29tbXVuaWNhdGUgd2l0aCBwZW9wbGUKKyAgICAgICAgICogdGhhdCBjYW5ub3QgcmVhZCBwb29ybHkgd3JpdHRlbiBzcGVjcyA6LSkKKyAgICAgICAgICogZm9yIFRMUyBiZSBzdXJlIHRvIHByZXZlbnQgdXNlIG9mIFNTTHYyCisgICAgICAgICAqLworICAgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKHNzbF9jdHgsU1NMX09QX0FMTHxTU0xfT1BfTk9fU1NMdjIpOworICAgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKHRsc19jdHgsCisgICAgICAgICAgICAgICAgIFNTTF9PUF9OT19TU0x2MnxTU0xfT1BfU0lOR0xFX0RIX1VTRXxTU0xfT1BfRVBIRU1FUkFMX1JTQSk7CisKKyAgICAgICAgU1NMX0NUWF9zZXRfaW5mb19jYWxsYmFjayhzc2xfY3R4LHNzbF9jbGllbnRfaW5mb19jYWxsYmFjayk7CisgICAgICAgIFNTTF9DVFhfc2V0X2luZm9fY2FsbGJhY2sodGxzX2N0eCxzc2xfY2xpZW50X2luZm9fY2FsbGJhY2spOworCisjaWZuZGVmIENPTU1FTlQKKyAgICAgICAgLyogU2V0IHRoZSBwcm9wZXIgY2FjaGluZyBtb2RlICovCisgICAgICAgIGlmICggbW9kZSA9PSBTU0xfU0VSVkVSICkgeworICAgICAgICAgICAgU1NMX0NUWF9zZXRfc2Vzc2lvbl9jYWNoZV9tb2RlKHNzbF9jdHgsU1NMX1NFU1NfQ0FDSEVfU0VSVkVSKTsKKyAgICAgICAgICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZSh0bHNfY3R4LFNTTF9TRVNTX0NBQ0hFX1NFUlZFUik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTU0xfQ1RYX3NldF9zZXNzaW9uX2NhY2hlX21vZGUoc3NsX2N0eCxTU0xfU0VTU19DQUNIRV9DTElFTlQpOworICAgICAgICAgICAgU1NMX0NUWF9zZXRfc2Vzc2lvbl9jYWNoZV9tb2RlKHRsc19jdHgsU1NMX1NFU1NfQ0FDSEVfQ0xJRU5UKTsKKyAgICAgICAgfQorICAgICAgICBTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQoc3NsX2N0eCwoQ0hBUiAqKSIxIiwxKTsKKyAgICAgICAgU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KHRsc19jdHgsKENIQVIgKikiMiIsMSk7CisjZWxzZSAvKiBDT01NRU5UICovCisgICAgICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZShzc2xfY3R4LFNTTF9TRVNTX0NBQ0hFX09GRik7CisgICAgICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZSh0bHNfY3R4LFNTTF9TRVNTX0NBQ0hFX09GRik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIH0KKworICAgIC8qIFRoZSBzZXJ2ZXIgdXNlcyBkZWZhdWx0cyBmb3IgdGhlIGNlcnRpZmljYXRlIGZpbGVzLiAqLworICAgIC8qIFRoZSBjbGllbnQgZG9lcyBub3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChtb2RlID09IFNTTF9TRVJWRVIpIHsKKyAgICAgICAgY2hhciBjZXJ0X2ZpbGVwYXRoWzEwMjRdOworICAgICAgICBjb25zdCBjaGFyICogZGVmZGlyID0gTlVMTDsKKyAgICAgICAgREggKiBkaCA9IE5VTEw7CisKKyAgICAgICAgZGVmZGlyID0gZ2V0ZW52KCJTU0xfQ0VSVF9ESVIiKTsKKyAgICAgICAgaWYgKCAhZGVmZGlyICkgeworI2lmZGVmIE9TMgorICAgICAgICAgICAgZGVmZGlyID0gZXhlZGlyOworI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgICBkZWZkaXIgPSBYNTA5X2dldF9kZWZhdWx0X2NlcnRfZGlyKCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfdG5faW5pdCAtIHNldHRpbmcgZGVmYXVsdCBkaXJlY3RvcnkgdG8iLGRlZmRpciwwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICFkZWZkaXIgKQorICAgICAgICAgICAgZGVmZGlyID0gIiI7CisKKyAgICAgICAgaWYgKCFzc2xfcnNhX2NlcnRfZmlsZSkgeworICAgICAgICAgICAgLyogd2UgbmVlZCB0byBrbm93IHRoZSBmdWxscGF0aCB0byB0aGUgbG9jYXRpb24gb2YgdGhlCisgICAgICAgICAgICAqIGNlcnRpZmljYXRlIHRoYXQgd2Ugd2lsbCBiZSBydW5uaW5nIHdpdGggYXMgd2UgY2Fubm90CisgICAgICAgICAgICAqIGJlIHN1cmUgb2YgdGhlIGN3ZCB3aGVuIHdlIGFyZSBsYXVuY2hlZAorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNwcmludGYoY2VydF9maWxlcGF0aCwiJXMvJXMiLGRlZmRpciwidGVsbmV0ZC1yc2EucGVtIik7CisgICAgICAgICAgICBpZiAoemNoa2koY2VydF9maWxlcGF0aCkgPiAwKQorICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzbF9yc2FfY2VydF9maWxlLGNlcnRfZmlsZXBhdGgpOworICAgICAgICB9CisgICAgICAgIGlmIChzc2xfcnNhX2NlcnRfZmlsZSAmJiAhc3NsX3JzYV9rZXlfZmlsZSkgeworICAgICAgICAgICAgLyogd2UgbmVlZCB0byBrbm93IHRoZSBmdWxscGF0aCB0byB0aGUgbG9jYXRpb24gb2YgdGhlCisgICAgICAgICAgICAqIGNlcnRpZmljYXRlIHRoYXQgd2Ugd2lsbCBiZSBydW5uaW5nIHdpdGggYXMgd2UgY2Fubm90CisgICAgICAgICAgICAqIGJlIHN1cmUgb2YgdGhlIGN3ZCB3aGVuIHdlIGFyZSBsYXVuY2hlZAorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNwcmludGYoY2VydF9maWxlcGF0aCwiJXMvJXMiLGRlZmRpciwidGVsbmV0ZC1yc2Eta2V5LnBlbSIpOworICAgICAgICAgICAgaWYgKHpjaGtpKGNlcnRfZmlsZXBhdGgpID4gMCkKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2xfcnNhX2tleV9maWxlLGNlcnRfZmlsZXBhdGgpOworICAgICAgICB9CisgICAgICAgIGlmICghc3NsX2RzYV9jZXJ0X2ZpbGUpIHsKKyAgICAgICAgICAgIC8qIHdlIG5lZWQgdG8ga25vdyB0aGUgZnVsbHBhdGggdG8gdGhlIGxvY2F0aW9uIG9mIHRoZQorICAgICAgICAgICAgKiBjZXJ0aWZpY2F0ZSB0aGF0IHdlIHdpbGwgYmUgcnVubmluZyB3aXRoIGFzIHdlIGNhbm5vdAorICAgICAgICAgICAgKiBiZSBzdXJlIG9mIHRoZSBjd2Qgd2hlbiB3ZSBhcmUgbGF1bmNoZWQKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBzcHJpbnRmKGNlcnRfZmlsZXBhdGgsIiVzLyVzIixkZWZkaXIsInRlbG5ldGQtZHNhLnBlbSIpOworICAgICAgICAgICAgaWYgKHpjaGtpKGNlcnRfZmlsZXBhdGgpID4gMCkKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2xfZHNhX2NlcnRfZmlsZSxjZXJ0X2ZpbGVwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3NsX2RzYV9jZXJ0X2ZpbGUgJiYgIXNzbF9kaF9rZXlfZmlsZSkgeworICAgICAgICAgICAgLyogd2UgbmVlZCB0byBrbm93IHRoZSBmdWxscGF0aCB0byB0aGUgbG9jYXRpb24gb2YgdGhlCisgICAgICAgICAgICAqIGNlcnRpZmljYXRlIHRoYXQgd2Ugd2lsbCBiZSBydW5uaW5nIHdpdGggYXMgd2UgY2Fubm90CisgICAgICAgICAgICAqIGJlIHN1cmUgb2YgdGhlIGN3ZCB3aGVuIHdlIGFyZSBsYXVuY2hlZAorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNwcmludGYoY2VydF9maWxlcGF0aCwiJXMvJXMiLGRlZmRpciwidGVsbmV0ZC1kc2Eta2V5LnBlbSIpOworICAgICAgICAgICAgaWYgKHpjaGtpKGNlcnRfZmlsZXBhdGgpID4gMCkKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2xfZGhfa2V5X2ZpbGUsY2VydF9maWxlcGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzc2xfY3JsX2RpcikgeworICAgICAgICAgICAgLyogd2UgbmVlZCB0byBrbm93IHRoZSBmdWxscGF0aCB0byB0aGUgbG9jYXRpb24gb2YgdGhlCisgICAgICAgICAgICAqIGNlcnRpZmljYXRlIHRoYXQgd2Ugd2lsbCBiZSBydW5uaW5nIHdpdGggYXMgd2UgY2Fubm90CisgICAgICAgICAgICAqIGJlIHN1cmUgb2YgdGhlIGN3ZCB3aGVuIHdlIGFyZSBsYXVuY2hlZAorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNwcmludGYoY2VydF9maWxlcGF0aCwiJXMvY3JsIixkZWZkaXIpOworICAgICAgICAgICAgaWYgKHpjaGtpKGNlcnRfZmlsZXBhdGgpID4gMCkKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2xfY3JsX2RpcixjZXJ0X2ZpbGVwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzc2xfb25seV9mbGFnICYmICF0bHNfbG9hZF9jZXJ0cyhzc2xfY3R4LHNzbF9jb24sMSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IiwiVW5hYmxlIHRvIGxvYWQgU1NMIGNlcnRzIiwwKTsKKyAgICAgICAgICAgIGxhc3Rfc3NsX21vZGUgPSAtMTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGxzX29ubHlfZmxhZyAmJiAhdGxzX2xvYWRfY2VydHModGxzX2N0eCx0bHNfY29uLDEpKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfdG5faW5pdCIsIlVuYWJsZSB0byBsb2FkIFRMUyBjZXJ0cyIsMCk7CisgICAgICAgICAgICBsYXN0X3NzbF9tb2RlID0gLTE7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIChsYXN0X3NzbF9tb2RlICE9IG1vZGUpIHx8ICFzc2xfY3R4IHx8ICF0bHNfY3R4ICkgeworICAgICAgICAgICAgLyogd2UgbWF5IHJlcXVpcmUgYSB0ZW1wIDUxMiBiaXQgUlNBIGtleSBiZWNhdXNlIG9mIHRoZQorICAgICAgICAgICAgICogd29uZGVyZnVsIHdheSBleHBvcnQgdGhpbmdzIHdvcmsgLi4uIGlmIHNvIHdlIGdlbmVyYXRlCisgICAgICAgICAgICAgKiBvbmUgbm93IQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIFNTTF9DVFhfc2V0X3RtcF9yc2FfY2FsbGJhY2soc3NsX2N0eCwgdG1wX3JzYV9jYik7CisgICAgICAgICAgICBTU0xfQ1RYX3NldF90bXBfZGhfY2FsbGJhY2soIHNzbF9jdHgsIHRtcF9kaF9jYik7CisgICAgICAgICAgICBTU0xfQ1RYX3NldF90bXBfcnNhX2NhbGxiYWNrKHRsc19jdHgsIHRtcF9yc2FfY2IpOworICAgICAgICAgICAgU1NMX0NUWF9zZXRfdG1wX2RoX2NhbGxiYWNrKCB0bHNfY3R4LCB0bXBfZGhfY2IpOworCisgICAgICAgICAgICBkaCA9IHRtcF9kaF9jYihOVUxMLDAsNTEyKTsKKyAgICAgICAgICAgIFNTTF9DVFhfc2V0X3RtcF9kaChzc2xfY3R4LGRoKTsKKyAgICAgICAgICAgIFNTTF9DVFhfc2V0X3RtcF9kaCh0bHNfY3R4LGRoKTsKKworICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGlzIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSB1c2luZyBhCisgICAgICAgICAgICAgKiBjZXJ0aWZpY2F0ZSB3aXRoIGFuIFJTQSBwdWJsaWMga2V5IGFuZCB3aGVyZSB0aGUKKyAgICAgICAgICAgICAqIGNlcnRpZmljYXRlIGhhcyBhIGtleSBsZW5ndGggbGVzcyB0aGFuIDUxMiBiaXRzIG9yIGlzCisgICAgICAgICAgICAgKiBtYXJrZWQgZm9yIHNpZ25pbmcgb25seS4gIFRoaXMgaXMgc28gd2UgY2FuIHN1cHBvcnQKKyAgICAgICAgICAgICAqIHRoZSBncmVhdGVzdCBsZWdhbCBwcml2YWN5IGxldmVsIHdpdGggZXhwb3J0YWJsZSBjbGllbnRzLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGlmIChTU0xfQ1RYX25lZWRfdG1wX1JTQShzc2xfY3R4KSB8fAorICAgICAgICAgICAgICAgICBTU0xfQ1RYX25lZWRfdG1wX1JTQSh0bHNfY3R4KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSU0EgKnJzYTsKKworICAgICAgICAgICAgICAgIGlmICggc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIkdlbmVyYXRpbmcgdGVtcCAoNTEyIGJpdCkgUlNBIGtleSAuLi5cclxuIik7CisgICAgICAgICAgICAgICAgcnNhPVJTQV9nZW5lcmF0ZV9rZXkoNTEyLFJTQV9GNCxOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgIGlmICggc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIkdlbmVyYXRpb24gb2YgdGVtcCAoNTEyIGJpdCkgUlNBIGtleSBkb25lXHJcbiIpOworCisgICAgICAgICAgICAgICAgaWYgKFNTTF9DVFhfbmVlZF90bXBfUlNBKHNzbF9jdHgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghU1NMX0NUWF9zZXRfdG1wX3JzYShzc2xfY3R4LHJzYSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyAgIkZhaWxlZCB0byBhc3NpZ24gZ2VuZXJhdGVkIHRlbXAgUlNBIGtleSB0byBTU0whXHJcbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChTU0xfQ1RYX25lZWRfdG1wX1JTQSh0bHNfY3R4KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIVNTTF9DVFhfc2V0X3RtcF9yc2EodGxzX2N0eCxyc2EpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHNzbF9kZWJ1Z19mbGFnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoCisgICJGYWlsZWQgdG8gYXNzaWduIGdlbmVyYXRlZCB0ZW1wIFJTQSBrZXkgdG8gVExTIVxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBSU0FfZnJlZShyc2EpOworICAgICAgICAgICAgICAgIGlmICggc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIkFzc2lnbmVkIHRlbXAgKDUxMiBiaXQpIFJTQSBrZXlcclxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBtYWtlIHN1cmUgd2Ugd2lsbCBmaW5kIGNlcnRpZmljYXRlcyBpbiB0aGUgc3RhbmRhcmQKKyAgICAgKiBsb2NhdGlvbiAuLi4gb3RoZXJ3aXNlIHdlIGRvbid0IGxvb2sgYW55d2hlcmUgZm9yCisgICAgICogdGhlc2UgdGhpbmdzIHdoaWNoIGlzIGdvaW5nIHRvIG1ha2UgY2xpZW50IGNlcnRpZmljYXRlCisgICAgICogZXhjaGFuZ2UgcmF0aGVyIHVzZWxlc3MgOi0pCisgICAgICogSW4gT1MyLCBkZWZhdWx0IHZhbHVlcyBmb3Igc3NsX3ZlcmlmeV9maWxlIGFuZCBzc2xfdmVyaWZ5X3BhdGguCisgICAgICovCisKKyNpZmRlZiBPUzIKKyNpZmRlZiBOVAorICAgIHsKKyAgICAgICAgLyogVGhlIGRlZmF1bHRzIGluIHRoZSBTU0wgY3J5cHRvIGxpYnJhcnkgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgT1MvMiAqLworICAgICAgICBjaGFyIHBhdGhbQ0tNQVhQQVRIXTsKKworICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxleGVkaXIsImNlcnRzIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoaXNkaXIocGF0aCkgJiYgCisgICAgICAgICAgICBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyh0bHNfY3R4LE5VTEwscGF0aCkgPT0gMSkgIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IGNlcnRpZmljYXRlIHZlcmlmeSBkaXIiLHBhdGgsMCk7CisgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgIENlcnRpZmljYXRlIFZlcmlmaWNhdGlvbiBEaXJlY3Rvcnk6ICVzXHJcbiIscGF0aCk7CisgICAgICAgICAgICBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzc2xfY3R4LE5VTEwscGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsR2V0QXBwRGF0YSgxKSwia2VybWl0IDk1L2NlcnRzIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoaXNkaXIocGF0aCkgJiYKKyAgICAgICAgICAgIFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHRsc19jdHgsTlVMTCxwYXRoKSA9PSAxKSAgeworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX3RuX2luaXQgY2VydGlmaWNhdGUgdmVyaWZ5IGRpciIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgQ2VydGlmaWNhdGUgVmVyaWZpY2F0aW9uIERpcmVjdG9yeTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgICAgIFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNzbF9jdHgsTlVMTCxwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxHZXRBcHBEYXRhKDApLCJrZXJtaXQgOTUvY2VydHMiLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChpc2RpcihwYXRoKSAmJgorICAgICAgICAgICAgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnModGxzX2N0eCxOVUxMLHBhdGgpID09IDEpICB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfdG5faW5pdCBjZXJ0aWZpY2F0ZSB2ZXJpZnkgZGlyIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiICBDZXJ0aWZpY2F0ZSBWZXJpZmljYXRpb24gRGlyZWN0b3J5OiAlc1xyXG4iLHBhdGgpOworICAgICAgICAgICAgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc3NsX2N0eCxOVUxMLHBhdGgpOworICAgICAgICB9CisgICAgICAgIGNrbWFrbXNnKHBhdGgsQ0tNQVhQQVRILGV4ZWRpciwiY2FfY2VydHMucGVtIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoemNoa2kocGF0aCkgPiAwICYmIAorICAgICAgICAgICAgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnModGxzX2N0eCxwYXRoLE5VTEwpID09IDEpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IGNlcnRpZmljYXRlIHZlcmlmeSBmaWxlIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiICBDZXJ0aWZpY2F0ZSBWZXJpZmljYXRpb24gRmlsZTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgICAgIFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNzbF9jdHgscGF0aCxOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxHZXRBcHBEYXRhKDEpLCJrZXJtaXQgOTUvY2FfY2VydHMucGVtIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoemNoa2kocGF0aCkgPiAwICYmIAorICAgICAgICAgICAgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnModGxzX2N0eCxwYXRoLE5VTEwpID09IDEpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IGNlcnRpZmljYXRlIHZlcmlmeSBmaWxlIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiICBDZXJ0aWZpY2F0ZSBWZXJpZmljYXRpb24gRmlsZTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgICAgIFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNzbF9jdHgscGF0aCxOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxHZXRBcHBEYXRhKDApLCJrZXJtaXQgOTUvY2FfY2VydHMucGVtIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoemNoa2kocGF0aCkgPiAwICYmIAorICAgICAgICAgICAgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnModGxzX2N0eCxwYXRoLE5VTEwpID09IDEpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IGNlcnRpZmljYXRlIHZlcmlmeSBmaWxlIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiICBDZXJ0aWZpY2F0ZSBWZXJpZmljYXRpb24gRmlsZTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgICAgIFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNzbF9jdHgscGF0aCxOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlIC8qIE5UICovCisgICAgeworICAgICAgICAvKiBUaGUgZGVmYXVsdHMgaW4gdGhlIFNTTCBjcnlwdG8gbGlicmFyeSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBPUy8yICovCisgICAgICAgIGNoYXIgcGF0aFtDS01BWFBBVEhdOworCisgICAgICAgIGNrbWFrbXNnKHBhdGgsQ0tNQVhQQVRILGV4ZWRpciwiY2VydHMiLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChpc2RpcihwYXRoKSAmJiAKKyAgICAgICAgICAgIFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHRsc19jdHgsTlVMTCxwYXRoKSA9PSAxKSAgeworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX3RuX2luaXQgY2VydGlmaWNhdGUgdmVyaWZ5IGRpciIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgQ2VydGlmaWNhdGUgVmVyaWZpY2F0aW9uIERpcmVjdG9yeTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgICAgIFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNzbF9jdHgsTlVMTCxwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxleGVkaXIsImNhX2NlcnRzLnBlbSIsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKHpjaGtpKHBhdGgpID4gMCAmJiAKKyAgICAgICAgICAgIFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHRsc19jdHgscGF0aCxOVUxMKSA9PSAxKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfdG5faW5pdCBjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmlsZSIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgQ2VydGlmaWNhdGUgVmVyaWZpY2F0aW9uIEZpbGU6ICVzXHJcbiIscGF0aCk7CisgICAgICAgICAgICBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzc2xfY3R4LHBhdGgsTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTlQgKi8KKyNlbHNlIC8qIE9TMiAqLworICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKHNzbF9jdHgpOworICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKHRsc19jdHgpOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgaWYgKHNzbF92ZXJpZnlfZmlsZSkgeworICAgICAgICBpZiAoemNoa2koc3NsX3ZlcmlmeV9maWxlKSA+IDAgJiYgCisgICAgICAgICAgICBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyh0bHNfY3R4LHNzbF92ZXJpZnlfZmlsZSxOVUxMKSA9PSAxKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfdG5faW5pdCBjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmlsZSIsc3NsX3ZlcmlmeV9maWxlLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiICBDZXJ0aWZpY2F0ZSBWZXJpZmljYXRpb24gRmlsZTogJXNcclxuIixzc2xfdmVyaWZ5X2ZpbGUpOworICAgICAgICAgICAgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc3NsX2N0eCxzc2xfdmVyaWZ5X2ZpbGUsTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNzbF92ZXJpZnlfZGlyICYmIGlzZGlyKHNzbF92ZXJpZnlfZGlyKSkgeworICAgICAgICBpZiAoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnModGxzX2N0eCxOVUxMLHNzbF92ZXJpZnlfZGlyKSA9PSAxKSAgeworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX3RuX2luaXQgY2VydGlmaWNhdGUgdmVyaWZ5IGRpciIsc3NsX3ZlcmlmeV9kaXIsMCk7CisgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgIENlcnRpZmljYXRlIFZlcmlmaWNhdGlvbiBEaXJlY3Rvcnk6ICVzXHJcbiIsc3NsX3ZlcmlmeV9kaXIpOworICAgICAgICAgICAgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc3NsX2N0eCxOVUxMLHNzbF92ZXJpZnlfZGlyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobW9kZSA9PSBTU0xfU0VSVkVSKSB7CisgICAgICAgIFNTTF9DVFhfc2V0X3ZlcmlmeShzc2xfY3R4LAorICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcmlmeV9mbGFnP3NzbF92ZXJpZnlfZmxhZ3xTU0xfVkVSSUZZX0NMSUVOVF9PTkNFOjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfc2VydmVyX3ZlcmlmeV9jYWxsYmFjayk7CisgICAgICAgIFNTTF9DVFhfc2V0X3ZlcmlmeSh0bHNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcmlmeV9mbGFnP3NzbF92ZXJpZnlfZmxhZ3xTU0xfVkVSSUZZX0NMSUVOVF9PTkNFOjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfc2VydmVyX3ZlcmlmeV9jYWxsYmFjayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU1NMX0NUWF9zZXRfdmVyaWZ5KHNzbF9jdHgsc3NsX3ZlcmlmeV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX2NsaWVudF92ZXJpZnlfY2FsbGJhY2spOworICAgICAgICBTU0xfQ1RYX3NldF92ZXJpZnkodGxzX2N0eCxzc2xfdmVyaWZ5X2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfY2xpZW50X3ZlcmlmeV9jYWxsYmFjayk7CisgICAgfQorCisgICAgLyogRnJlZSB0aGUgZXhpc3RpbmcgQ1JMIFN0b3JlICovCisgICAgaWYgKGNybF9zdG9yZSkgeworICAgICAgICBYNTA5X1NUT1JFX2ZyZWUoY3JsX3N0b3JlKTsKKyAgICAgICAgY3JsX3N0b3JlID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBzZXQgdXAgdGhlIG5ldyBDUkwgU3RvcmUgKi8KKyAgICBjcmxfc3RvcmUgPSBYNTA5X1NUT1JFX25ldygpOworICAgIGlmIChjcmxfc3RvcmUpIHsKKyNpZmRlZiBPUzIKKyAgICAgICAgY2hhciBwYXRoW0NLTUFYUEFUSF07CisKKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsZXhlZGlyLCJjcmxzIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoaXNkaXIocGF0aCkgJiYKKyAgICAgICAgICAgIFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMoY3JsX3N0b3JlLE5VTEwscGF0aCkgPT0gMSkgeworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX3RuX2luaXQgY3JsIGRpciIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgQ1JMIERpcmVjdG9yeTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorI2lmZGVmIE5UCisgICAgICAgIGNrbWFrbXNnKHBhdGgsQ0tNQVhQQVRILEdldEFwcERhdGEoMSksImtlcm1pdCA5NS9jcmxzIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoaXNkaXIocGF0aCkgJiYgCisgICAgICAgICAgICBYNTA5X1NUT1JFX2xvYWRfbG9jYXRpb25zKGNybF9zdG9yZSxOVUxMLHBhdGgpID09IDEpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IGNybCBkaXIiLHBhdGgsMCk7CisgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgIENSTCBEaXJlY3Rvcnk6ICVzXHJcbiIscGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsR2V0QXBwRGF0YSgwKSwia2VybWl0IDk1L2NybHMiLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChpc2RpcihwYXRoKSAmJiAKKyAgICAgICAgICAgIFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMoY3JsX3N0b3JlLE5VTEwscGF0aCkgPT0gMSkgeworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX3RuX2luaXQgY3JsIGRpciIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgQ1JMIERpcmVjdG9yeTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5UICovCisgICAgICAgIAorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxleGVkaXIsImNhX2NybHMucGVtIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoemNoa2kocGF0aCkgPiAwICYmIAorICAgICAgICAgICAgWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhjcmxfc3RvcmUscGF0aCxOVUxMKSA9PSAxKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfdG5faW5pdCBjcmwgZmlsZSIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgQ1JMIEZpbGU6ICVzXHJcbiIscGF0aCk7CisgICAgICAgIH0KKyNpZmRlZiBOVAorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxHZXRBcHBEYXRhKDEpLCJrZXJtaXQgOTUvY2FfY3Jscy5wZW0iLE5VTEwsTlVMTCk7CisgICAgICAgIGlmICh6Y2hraShwYXRoKSA+IDAgJiYgCisgICAgICAgICAgICBYNTA5X1NUT1JFX2xvYWRfbG9jYXRpb25zKGNybF9zdG9yZSxwYXRoLE5VTEwpID09IDEpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IGNybCBmaWxlIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiICBDUkwgRmlsZTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxHZXRBcHBEYXRhKDApLCJrZXJtaXQgOTUvY2FfY3Jscy5wZW0iLE5VTEwsTlVMTCk7CisgICAgICAgIGlmICh6Y2hraShwYXRoKSA+IDAgJiYgCisgICAgICAgICAgICBYNTA5X1NUT1JFX2xvYWRfbG9jYXRpb25zKGNybF9zdG9yZSxwYXRoLE5VTEwpID09IDEpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IGNybCBmaWxlIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiICBDUkwgRmlsZTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogT1MyICovCisKKyAgICAgICAgaWYgKHNzbF9jcmxfZmlsZSB8fCBzc2xfY3JsX2RpcikgeworICAgICAgICAgICAgaWYgKHNzbF9jcmxfZmlsZSAmJiB6Y2hraShzc2xfY3JsX2ZpbGUpID4gMCAmJiAKKyAgICAgICAgICAgICAgICBYNTA5X1NUT1JFX2xvYWRfbG9jYXRpb25zKGNybF9zdG9yZSxzc2xfY3JsX2ZpbGUsTlVMTCkgPT0gMSkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IGNybCBmaWxlIixzc2xfY3JsX2ZpbGUsMCk7CisgICAgICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgQ1JMIEZpbGU6ICVzXHJcbiIsc3NsX2NybF9maWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzc2xfY3JsX2RpciAmJiBpc2Rpcihzc2xfY3JsX2RpcikgJiYKKyAgICAgICAgICAgICAgICBYNTA5X1NUT1JFX2xvYWRfbG9jYXRpb25zKGNybF9zdG9yZSxOVUxMLHNzbF9jcmxfZGlyKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX3RuX2luaXQgY3JsIGRpciIsc3NsX2NybF9kaXIsMCk7CisgICAgICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgQ1JMIERpcmVjdG9yeTogJXNcclxuIixzc2xfY3JsX2Rpcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gCisjaWZuZGVmIE9TMgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFg1MDlfU1RPUkVfc2V0X2RlZmF1bHRfcGF0aHMoY3JsX3N0b3JlKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE9TMiAqLworICAgIH0KKworI2lmbmRlZiBDT01NRU5UCisgICAgc3NsX2NvbnggPSBzc2xfY29uOworICAgIHNzbF9jb249KFNTTCAqKVNTTF9uZXcoc3NsX2N0eCk7CisgICAgaWYgKCAhc3NsX2NvbiApIHsKKyAgICAgICAgZGVidWcoRjExMCwic3NsX3RuX2luaXQiLCJTU0xfbmV3KHNzbF9jb24pIGZhaWxlZCIsMCk7CisgICAgICAgIGxhc3Rfc3NsX21vZGUgPSAtMTsKKyAgICAgICAgc3NsX2NvbiA9IHNzbF9jb254OworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGlmIChzc2xfY29ueCkgeworICAgICAgICBpZiAoIG1vZGUgPT0gU1NMX0NMSUVOVCApIHsKKyAgICAgICAgICAgIFNTTF9zZXRfc2Vzc2lvbihzc2xfY29uLCBTU0xfZ2V0X3Nlc3Npb24oc3NsX2NvbngpKTsKKyAgICAgICAgfQorI2lmZGVmIFNTTF9LUkI1CisJCWlmIChzc2xfY29ueC0+a3NzbF9jdHgpIHsKKwkJCWtzc2xfY3R4X2ZyZWUoc3NsX2NvbngtPmtzc2xfY3R4KTsKKwkJCXNzbF9jb254LT5rc3NsX2N0eCA9IE5VTEw7CisJCX0KKyNlbmRpZiAvKiBTU0xfS1JCNSAqLworICAgICAgICBTU0xfZnJlZShzc2xfY29ueCk7CisgICAgICAgIHNzbF9jb254ID0gTlVMTDsKKyAgICB9CisgICAgdGxzX2NvbnggPSB0bHNfY29uOworICAgIHRsc19jb249KFNTTCAqKVNTTF9uZXcodGxzX2N0eCk7CisgICAgaWYgKCAhdGxzX2NvbiApIHsKKyAgICAgICAgZGVidWcoRjExMCwic3NsX3RuX2luaXQiLCJTU0xfbmV3KHRsc19jb24pIGZhaWxlZCIsMCk7CisgICAgICAgIGxhc3Rfc3NsX21vZGUgPSAtMTsKKyAgICAgICAgdGxzX2NvbiA9IHRsc19jb254OworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGlmICh0bHNfY29ueCkgeworICAgICAgICBpZiAoIG1vZGUgPT0gU1NMX0NMSUVOVCApCisgICAgICAgICAgICBTU0xfc2V0X3Nlc3Npb24odGxzX2NvbiwgU1NMX2dldF9zZXNzaW9uKHRsc19jb254KSk7CisjaWZkZWYgU1NMX0tSQjUKKwkJaWYgKHRsc19jb254LT5rc3NsX2N0eCkgeworCQkJa3NzbF9jdHhfZnJlZSh0bHNfY29ueC0+a3NzbF9jdHgpOworCQkJdGxzX2NvbngtPmtzc2xfY3R4ID0gTlVMTDsKKwkJfQorI2VuZGlmIC8qIFNTTF9LUkI1ICovCisgICAgICAgIFNTTF9mcmVlKHRsc19jb254KTsKKyAgICAgICAgdGxzX2NvbnggPSBOVUxMOworICAgIH0KKyNlbHNlIC8qIENPTU1FTlQgKi8KKyAgICAvKiBJIGRvbid0IGtub3cgd2h5IHRoaXMgZG9lcyBub3Qgd29yayB0byByZXVzZSB0aGUgY29ubmVjdGlvbi4gKi8KKyAgICBpZiAoIHNzbF9jb24gKSB7CisgICAgICAgIFNTTF9jbGVhcihzc2xfY29uKTsKKyAgICAgICAgU1NMX3NldF9zZXNzaW9uKHNzbF9jb24sTlVMTCk7CisgICAgICAgIFNTTF9zZXRfYWNjZXB0X3N0YXRlKHNzbF9jb24pIDsKKyAgICB9IGVsc2UgeworICAgICAgICBzc2xfY29uPShTU0wgKilTU0xfbmV3KHNzbF9jdHgpOworICAgICAgICBpZiAoIXNzbF9jb24pIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IiwiU1NMX25ldyhzc2xfY3R4KSBmYWlsZWQiLDApOworICAgICAgICAgICAgbGFzdF9zc2xfbW9kZSA9IC0xOworICAgICAgICAgICAgc3NsX2NvbiA9IHNzbF9jb254OworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCB0bHNfY29uICkgeworICAgICAgICBTU0xfY2xlYXIodGxzX2Nvbik7CisgICAgICAgIFNTTF9zZXRfc2Vzc2lvbih0bHNfY29uLE5VTEwpOworICAgICAgICBTU0xfc2V0X2FjY2VwdF9zdGF0ZSh0bHNfY29uKSA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGxzX2Nvbj0oU1NMICopU1NMX25ldyh0bHNfY3R4KTsKKyAgICAgICAgaWYgKCAhdGxzX2NvbiApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF90bl9pbml0IiwiU1NMX25ldyh0bHNfY3R4KSBmYWlsZWQiLDApOworICAgICAgICAgICAgbGFzdF9zc2xfbW9kZSA9IC0xOworICAgICAgICAgICAgdGxzX2NvbiA9IHRsc19jb254OworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIFNTTF9LUkI1CisjaWZuZGVmIEtSQjVfU0VSVklDRV9OQU1FCisjZGVmaW5lIEtSQjVfU0VSVklDRV9OQU1FICAgICJob3N0IgorI2VuZGlmCisKKyAgICBpZiAoc3NsX2Nvbi0+a3NzbF9jdHggPT0gTlVMTCkKKyAgICAgICAgc3NsX2Nvbi0+a3NzbF9jdHggPSBrc3NsX2N0eF9uZXcoKTsKKyAgICBpZiAodGxzX2Nvbi0+a3NzbF9jdHggPT0gTlVMTCkKKyAgICB0bHNfY29uLT5rc3NsX2N0eCA9IGtzc2xfY3R4X25ldygpOworICAgIGlmIChtb2RlID09IFNTTF9TRVJWRVIpIHsKKyAgICAgICAgaWYgKHNzbF9jb24tPmtzc2xfY3R4ICE9IE5VTEwpCisgICAgICAgICAgICBrc3NsX2N0eF9zZXRzdHJpbmcoc3NsX2Nvbi0+a3NzbF9jdHgsIEtTU0xfS0VZVEFCLCBrNV9rZXl0YWIpOworICAgICAgICBpZiAodGxzX2Nvbi0+a3NzbF9jdHggIT0gTlVMTCkKKyAgICAgICAgICAgIGtzc2xfY3R4X3NldHN0cmluZyh0bHNfY29uLT5rc3NsX2N0eCwgS1NTTF9LRVlUQUIsIGs1X2tleXRhYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNzbF9jb24tPmtzc2xfY3R4ICE9IE5VTEwpCisgICAgICAgICAgICBrc3NsX2N0eF9zZXRzdHJpbmcoc3NsX2Nvbi0+a3NzbF9jdHgsIEtTU0xfU0VSVkVSLCBzekhvc3ROYW1lKTsKKyAgICAgICAgaWYgKHRsc19jb24tPmtzc2xfY3R4ICE9IE5VTEwpCisgICAgICAgICAgICBrc3NsX2N0eF9zZXRzdHJpbmcodGxzX2Nvbi0+a3NzbF9jdHgsIEtTU0xfU0VSVkVSLCBzekhvc3ROYW1lKTsKKyAgICB9CisgICAga3NzbF9jdHhfc2V0c3RyaW5nKHNzbF9jb24tPmtzc2xfY3R4LCBLU1NMX1NFUlZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2Rfc3J2ID8ga3JiNV9kX3NydiA6IEtSQjVfU0VSVklDRV9OQU1FKTsKKyAgICBrc3NsX2N0eF9zZXRzdHJpbmcodGxzX2Nvbi0+a3NzbF9jdHgsIEtTU0xfU0VSVklDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfZF9zcnYgPyBrcmI1X2Rfc3J2IDogS1JCNV9TRVJWSUNFX05BTUUpOworI2VuZGlmIC8qIFNTTF9LUkI1ICovCisKKyAgICBpZiAoc3NsX2NpcGhlcl9saXN0KSB7CisgICAgICAgIFNTTF9zZXRfY2lwaGVyX2xpc3Qoc3NsX2Nvbixzc2xfY2lwaGVyX2xpc3QpOworICAgICAgICBTU0xfc2V0X2NpcGhlcl9saXN0KHRsc19jb24sc3NsX2NpcGhlcl9saXN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyICogcDsKKyAgICAgICAgaWYgKHAgPSBnZXRlbnYoIlNTTF9DSVBIRVIiKSkgeworICAgICAgICAgICAgU1NMX3NldF9jaXBoZXJfbGlzdChzc2xfY29uLHApOworICAgICAgICAgICAgU1NMX3NldF9jaXBoZXJfbGlzdCh0bHNfY29uLHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU1NMX3NldF9jaXBoZXJfbGlzdChzc2xfY29uLERFRkFVTFRfQ0lQSEVSX0xJU1QpOworICAgICAgICAgICAgU1NMX3NldF9jaXBoZXJfbGlzdCh0bHNfY29uLERFRkFVTFRfQ0lQSEVSX0xJU1QpOworICAgICAgICB9CisgICAgfQorCisgICAgc3NsX3ZlcmlmeV9kZXB0aCA9IC0xOworCisgICAgaWYgKCBzc2xfZGVidWdfZmxhZyApCisgICAgICAgIHByaW50ZigiU1NML1RMUyBpbml0IGRvbmUhXHJcbiIpOworCisgICAgc3NsX2luaXRpYWxpemVkID0gMTsKKyAgICBsYXN0X3NzbF9tb2RlID0gbW9kZTsKKyAgICBkZWJ1ZyhGMTEwLCJzc2xfdG5faW5pdCIsImRvbmUiLDApOworICAgIHJldHVybigxKTsKK30KKworI2lmbmRlZiBOT0hUVFAKK2ludAorI2lmZGVmIENLX0FOU0lDCitzc2xfaHR0cF9pbml0KGNoYXIgKiBob3N0bmFtZSkKKyNlbHNlCitzc2xfaHR0cF9pbml0KGhvc3RuYW1lKSBjaGFyICogaG9zdG5hbWU7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyNpZmRlZiBLUkI1CisgICAgZXh0ZXJuIGNoYXIgKiBrNV9rZXl0YWI7CisgICAgZXh0ZXJuIGNoYXIgKiBrcmI1X2Rfc3J2OworI2VuZGlmIC8qIEtSQjUgKi8KKyAgICBTU0wgKiB0bHNfY29ueD1OVUxMOworCisgICAgc3NsX2h0dHBfaW5pdGlhbGl6ZWQgPSAwOworCisgICAgaWYgKCAhY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuKDApOworICAgIGRlYnVnKEYxMTAsInNzbF9odHRwX2luaXQiLGhvc3RuYW1lLDApOworCisgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICBwcmludGYoIlNTTF9ERUJVR19GTEFHIG9uXHJcbiIpOworCisgICAgaWYgKCF0bHNfaHR0cF9jdHggKSB7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAvKiB0b28gbWFueSB3ZWIgc2VydmVycyBzdGlsbCBkbyBub3Qgc3VwcG9ydCBUTFN2MSAqLworICAgICAgICB0bHNfaHR0cF9jdHg9KFNTTF9DVFggKilTU0xfQ1RYX25ldyhUTFN2MV9jbGllbnRfbWV0aG9kKCkpOworI2Vsc2UgLyogQ09NTUVOVCAqLworICAgICAgICB0bHNfaHR0cF9jdHg9KFNTTF9DVFggKilTU0xfQ1RYX25ldyhTU0x2MjNfY2xpZW50X21ldGhvZCgpKTsKKyAgICAgICAgLyogVGhpcyBjYW4gZmFpbCBiZWNhdXNlIHdlIGRvIG5vdCBoYXZlIFJTQSBhdmFpbGFibGUgKi8KKyAgICAgICAgaWYgKCAhdGxzX2h0dHBfY3R4ICkgeworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX2h0dHBfaW5pdCIsIlNTTHYyM19jbGllbnRfbWV0aG9kIGZhaWxlZCIsMCk7CisgICAgICAgICAgICB0bHNfaHR0cF9jdHg9KFNTTF9DVFggKilTU0xfQ1RYX25ldyhTU0x2M19jbGllbnRfbWV0aG9kKCkpOworICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBpZiAoICF0bHNfaHR0cF9jdHggKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfaHR0cF9pbml0IiwiVExTdjFfY2xpZW50X21ldGhvZCBmYWlsZWQiLDApOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisjaWZkZWYgVVNFX0NFUlRfQ0IKKyAgICAgICAgU1NMX0NUWF9zZXRfY2xpZW50X2NlcnRfY2IodGxzX2h0dHBfY3R4LHNzbF9jbGllbnRfY2VydF9jYWxsYmFjayk7CisjZW5kaWYgLyogVVNFX0NFUlRfQ0IgKi8KKyAgICB9CisKKyAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYih0bHNfaHR0cF9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBlbV9wYXNzd29yZF9jYiAqKXNzbF9wYXNzd2RfY2FsbGJhY2spOworCisgICAgLyogZm9yIFNTTCBzd2l0Y2ggb24gYWxsIHRoZSBpbnRlcm9wZXJhYmlsaXR5IGFuZCBidWcKKyAgICAgKiB3b3JrYXJvdW5kcyBzbyB0aGF0IHdlIHdpbGwgY29tbXVuaWNhdGUgd2l0aCBwZW9wbGUKKyAgICAgKiB0aGF0IGNhbm5vdCByZWFkIHBvb3JseSB3cml0dGVuIHNwZWNzIDotKQorICAgICAqIGZvciBUTFMgYmUgc3VyZSB0byBwcmV2ZW50IHVzZSBvZiBTU0x2MgorICAgICAqLworICAgIFNTTF9DVFhfc2V0X29wdGlvbnModGxzX2h0dHBfY3R4LAorICAgICAgICAgICAgU1NMX09QX05PX1NTTHYyfFNTTF9PUF9TSU5HTEVfREhfVVNFfFNTTF9PUF9FUEhFTUVSQUxfUlNBKTsKKworICAgIFNTTF9DVFhfc2V0X2luZm9fY2FsbGJhY2sodGxzX2h0dHBfY3R4LHNzbF9jbGllbnRfaW5mb19jYWxsYmFjayk7CisKKyNpZm5kZWYgQ09NTUVOVAorICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZSh0bHNfaHR0cF9jdHgsU1NMX1NFU1NfQ0FDSEVfQ0xJRU5UKTsKKyAgICBTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQodGxzX2h0dHBfY3R4LChDSEFSICopIjMiLDEpOworI2Vsc2UgLyogQ09NTUVOVCAqLworICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZSh0bHNfaHR0cF9jdHgsU1NMX1NFU1NfQ0FDSEVfT0ZGKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAvKiBtYWtlIHN1cmUgd2Ugd2lsbCBmaW5kIGNlcnRpZmljYXRlcyBpbiB0aGUgc3RhbmRhcmQKKyAgICAgKiBsb2NhdGlvbiAuLi4gb3RoZXJ3aXNlIHdlIGRvbid0IGxvb2sgYW55d2hlcmUgZm9yCisgICAgICogdGhlc2UgdGhpbmdzIHdoaWNoIGlzIGdvaW5nIHRvIG1ha2UgY2xpZW50IGNlcnRpZmljYXRlCisgICAgICogZXhjaGFuZ2UgcmF0aGVyIHVzZWxlc3MgOi0pCisgICAgICovCisKKyNpZmRlZiBPUzIKKyNpZmRlZiBOVAorICAgIHsKKyAgICAgICAgLyogVGhlIGRlZmF1bHRzIGluIHRoZSBTU0wgY3J5cHRvIGxpYnJhcnkgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgT1MvMiAqLworICAgICAgICBjaGFyIHBhdGhbQ0tNQVhQQVRIXTsKKworICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxleGVkaXIsImNlcnRzIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnModGxzX2h0dHBfY3R4LE5VTEwscGF0aCkgPT0gMCkgIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF9odHRwX2luaXQgdW5hYmxlIHRvIGxvYWQgcGF0aCIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gbG9hZCB2ZXJpZnktZGlyOiAlc1xyXG4iLHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsR2V0QXBwRGF0YSgxKSwia2VybWl0IDk1L2NlcnRzIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnModGxzX2h0dHBfY3R4LE5VTEwscGF0aCkgPT0gMCkgIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF9odHRwX2luaXQgdW5hYmxlIHRvIGxvYWQgcGF0aCIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gbG9hZCB2ZXJpZnktZGlyOiAlc1xyXG4iLHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsR2V0QXBwRGF0YSgwKSwia2VybWl0IDk1L2NlcnRzIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnModGxzX2h0dHBfY3R4LE5VTEwscGF0aCkgPT0gMCkgIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF9odHRwX2luaXQgdW5hYmxlIHRvIGxvYWQgcGF0aCIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gbG9hZCB2ZXJpZnktZGlyOiAlc1xyXG4iLHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsZXhlZGlyLCJjYV9jZXJ0cy5wZW0iLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyh0bHNfaHR0cF9jdHgscGF0aCxOVUxMKSA9PSAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfaHR0cF9pbml0IHVuYWJsZSB0byBsb2FkIHBhdGgiLHBhdGgsMCk7CisgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGxvYWQgdmVyaWZ5LWZpbGU6ICVzXHJcbiIscGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxHZXRBcHBEYXRhKDEpLCJrZXJtaXQgOTUvY2FfY2VydHMucGVtIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnModGxzX2h0dHBfY3R4LHBhdGgsTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX2h0dHBfaW5pdCB1bmFibGUgdG8gbG9hZCBwYXRoIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byBsb2FkIHZlcmlmeS1maWxlOiAlc1xyXG4iLHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsR2V0QXBwRGF0YSgwKSwia2VybWl0IDk1L2NhX2NlcnRzLnBlbSIsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHRsc19odHRwX2N0eCxwYXRoLE5VTEwpID09IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF9odHRwX2luaXQgdW5hYmxlIHRvIGxvYWQgcGF0aCIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gbG9hZCB2ZXJpZnktZmlsZTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlIC8qIE5UICovCisgICAgeworICAgICAgICAvKiBUaGUgZGVmYXVsdHMgaW4gdGhlIFNTTCBjcnlwdG8gbGlicmFyeSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBPUy8yICovCisgICAgICAgIGNoYXIgcGF0aFtDS01BWFBBVEhdOworCisgICAgICAgIGNrbWFrbXNnKHBhdGgsQ0tNQVhQQVRILGV4ZWRpciwiY2VydHMiLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyh0bHNfaHR0cF9jdHgsTlVMTCxwYXRoKSA9PSAwKSAgeworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX2h0dHBfaW5pdCB1bmFibGUgdG8gbG9hZCBwYXRoIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byBsb2FkIHZlcmlmeS1kaXI6ICVzXHJcbiIscGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsZXhlZGlyLCJjYV9jZXJ0cy5wZW0iLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyh0bHNfaHR0cF9jdHgscGF0aCxOVUxMKSA9PSAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfaHR0cF9pbml0IHVuYWJsZSB0byBsb2FkIHBhdGgiLHBhdGgsMCk7CisgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGxvYWQgdmVyaWZ5LWZpbGU6ICVzXHJcbiIscGF0aCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTlQgKi8KKyNlbHNlIC8qIE9TMiAqLworICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKHRsc19odHRwX2N0eCk7CisjZW5kaWYgLyogT1MyICovCisKKyAgICBpZiAoc3NsX3ZlcmlmeV9maWxlICYmCisgICAgICAgIFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHRsc19odHRwX2N0eCxzc2xfdmVyaWZ5X2ZpbGUsTlVMTCkgPT0gMCkgIHsKKyAgICAgICAgZGVidWcoRjExMCwic3NsX2h0dHBfaW5pdCB1bmFibGUgdG8gbG9hZCBzc2xfdmVyaWZ5X2ZpbGUiLHNzbF92ZXJpZnlfZmlsZSwwKTsKKyAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGxvYWQgdmVyaWZ5LWZpbGU6ICVzXHJcbiIsc3NsX3ZlcmlmeV9maWxlKTsKKyAgICB9CisgICAgaWYgKHNzbF92ZXJpZnlfZGlyICYmCisgICAgICAgIFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHRsc19odHRwX2N0eCxOVUxMLHNzbF92ZXJpZnlfZGlyKSA9PSAwKSAgeworICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfaHR0cF9pbml0IHVuYWJsZSB0byBsb2FkIHNzbF92ZXJpZnlfZGlyIixzc2xfdmVyaWZ5X2RpciwwKTsKKyAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGxvYWQgdmVyaWZ5LWRpcjogJXNcclxuIixzc2xfdmVyaWZ5X2Rpcik7CisgICAgfQorCisgICAgU1NMX0NUWF9zZXRfdmVyaWZ5KHRsc19odHRwX2N0eCxzc2xfdmVyaWZ5X2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfY2xpZW50X3ZlcmlmeV9jYWxsYmFjayk7CisKKyAgICAvKiBGcmVlIHRoZSBleGlzdGluZyBDUkwgU3RvcmUgKi8KKyAgICBpZiAoY3JsX3N0b3JlKSB7CisgICAgICAgIFg1MDlfU1RPUkVfZnJlZShjcmxfc3RvcmUpOworICAgICAgICBjcmxfc3RvcmUgPSBOVUxMOworICAgIH0KKworICAgIC8qIHNldCB1cCB0aGUgbmV3IENSTCBTdG9yZSAqLworICAgIGNybF9zdG9yZSA9IFg1MDlfU1RPUkVfbmV3KCk7CisgICAgaWYgKGNybF9zdG9yZSkgeworI2lmZGVmIE9TMgorICAgICAgICBjaGFyIHBhdGhbQ0tNQVhQQVRIXTsKKworICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxleGVkaXIsImNybHMiLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChYNTA5X1NUT1JFX2xvYWRfbG9jYXRpb25zKGNybF9zdG9yZSxOVUxMLHBhdGgpID09IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF9odHRwX2luaXQgdW5hYmxlIHRvIGxvYWQgZGlyIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byBsb2FkIGNybC1kaXI6ICVzXHJcbiIscGF0aCk7CisgICAgICAgIH0KKyNpZmRlZiBOVAorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxHZXRBcHBEYXRhKDEpLCJrZXJtaXQgOTUvY3JscyIsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMoY3JsX3N0b3JlLE5VTEwscGF0aCkgPT0gMCkgeworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX2h0dHBfaW5pdCB1bmFibGUgdG8gbG9hZCBkaXIiLHBhdGgsMCk7CisgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGxvYWQgY3JsLWRpcjogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxHZXRBcHBEYXRhKDApLCJrZXJtaXQgOTUvY3JscyIsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMoY3JsX3N0b3JlLE5VTEwscGF0aCkgPT0gMCkgeworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX2h0dHBfaW5pdCB1bmFibGUgdG8gbG9hZCBkaXIiLHBhdGgsMCk7CisgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGxvYWQgY3JsLWRpcjogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5UICovCisgICAgICAgIAorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxleGVkaXIsImNhX2NybHMucGVtIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhjcmxfc3RvcmUscGF0aCxOVUxMKSA9PSAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfaHR0cF9pbml0IHVuYWJsZSB0byBsb2FkIGZpbGUiLHBhdGgsMCk7CisgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGxvYWQgY3JsLWZpbGU6ICVzXHJcbiIscGF0aCk7CisgICAgICAgIH0KKyNpZmRlZiBOVAorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxHZXRBcHBEYXRhKDEpLCJrZXJtaXQgOTUvY2FfY3Jscy5wZW0iLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChYNTA5X1NUT1JFX2xvYWRfbG9jYXRpb25zKGNybF9zdG9yZSxwYXRoLE5VTEwpID09IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF9odHRwX2luaXQgdW5hYmxlIHRvIGxvYWQgZmlsZSIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gbG9hZCBjcmwtZmlsZTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxHZXRBcHBEYXRhKDApLCJrZXJtaXQgOTUvY2FfY3Jscy5wZW0iLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChYNTA5X1NUT1JFX2xvYWRfbG9jYXRpb25zKGNybF9zdG9yZSxwYXRoLE5VTEwpID09IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF9odHRwX2luaXQgdW5hYmxlIHRvIGxvYWQgZmlsZSIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gbG9hZCBjcmwtZmlsZTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogT1MyICovCisKKyAgICAgICAgaWYgKHNzbF9jcmxfZmlsZSB8fCBzc2xfY3JsX2RpcikgeworICAgICAgICAgICAgaWYgKHNzbF9jcmxfZmlsZSAmJgorICAgICAgICAgICAgICAgIFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMoY3JsX3N0b3JlLHNzbF9jcmxfZmlsZSxOVUxMKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX2h0dHBfaW5pdCB1bmFibGUgdG8gbG9hZCBzc2xfY3JsX2ZpbGUiLHNzbF9jcmxfZmlsZSwwKTsKKyAgICAgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byBsb2FkIGNybC1maWxlOiAlc1xyXG4iLHNzbF9jcmxfZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3NsX2NybF9kaXIgJiYKKyAgICAgICAgICAgICAgICBYNTA5X1NUT1JFX2xvYWRfbG9jYXRpb25zKGNybF9zdG9yZSxOVUxMLHNzbF9jcmxfZGlyKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX2h0dHBfaW5pdCB1bmFibGUgdG8gbG9hZCBzc2xfY3JsX2RpciIsc3NsX2NybF9kaXIsMCk7CisgICAgICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gbG9hZCBjcmwtZGlyOiAlc1xyXG4iLHNzbF9jcmxfZGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFg1MDlfU1RPUkVfc2V0X2RlZmF1bHRfcGF0aHMoY3JsX3N0b3JlKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmbmRlZiBDT01NRU5UCisgICAgdGxzX2NvbnggPSB0bHNfaHR0cF9jb247CisgICAgdGxzX2h0dHBfY29uPShTU0wgKilTU0xfbmV3KHRsc19odHRwX2N0eCk7CisgICAgaWYgKCAhdGxzX2h0dHBfY29uICkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfaHR0cF9pbml0IiwiU1NMX25ldyh0bHNfaHR0cF9jb24pIGZhaWxlZCIsMCk7CisgICAgICAgIHRsc19odHRwX2NvbiA9IHRsc19jb254OworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGlmICh0bHNfY29ueCkgeworICAgICAgICBTU0xfc2V0X3Nlc3Npb24odGxzX2h0dHBfY29uLCBTU0xfZ2V0X3Nlc3Npb24odGxzX2NvbngpKTsKKyNpZmRlZiBTU0xfS1JCNQorCQlpZiAodGxzX2NvbngtPmtzc2xfY3R4KSB7CisJCQlrc3NsX2N0eF9mcmVlKHRsc19jb254LT5rc3NsX2N0eCk7CisJCQl0bHNfY29ueC0+a3NzbF9jdHggPSBOVUxMOworCQl9CisjZW5kaWYgLyogU1NMX0tSQjUgKi8KKyAgICAgICAgU1NMX2ZyZWUodGxzX2NvbngpOworICAgICAgICB0bHNfY29ueCA9IE5VTEw7CisgICAgfQorI2Vsc2UgLyogQ09NTUVOVCAqLworICAgIC8qIEkgZG9uJ3Qga25vdyB3aHkgdGhpcyBkb2VzIG5vdCB3b3JrIHRvIHJldXNlIHRoZSBjb25uZWN0aW9uLiAqLworICAgIGlmICggdGxzX2h0dHBfY29uICkgeworICAgICAgICBTU0xfY2xlYXIodGxzX2h0dHBfY29uKTsKKyAgICAgICAgU1NMX3NldF9zZXNzaW9uKHRsc19odHRwX2NvbixOVUxMKTsKKyAgICAgICAgU1NMX3NldF9hY2NlcHRfc3RhdGUodGxzX2h0dHBfY29uKSA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGxzX2h0dHBfY29uPShTU0wgKilTU0xfbmV3KHRsc19odHRwX2N0eCk7CisgICAgICAgIGlmICggIXRsc19odHRwX2NvbiApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF9odHRwX2luaXQiLCJTU0xfbmV3KHRsc19odHRwX2N0eCkgZmFpbGVkIiwwKTsKKyAgICAgICAgICAgIHRsc19odHRwX2NvbiA9IHRsc19jb254OworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIFNTTF9LUkI1CisjaWZuZGVmIEtSQjVfU0VSVklDRV9OQU1FCisjZGVmaW5lIEtSQjVfU0VSVklDRV9OQU1FICAgICJob3N0IgorI2VuZGlmCisKKyAgICBpZiAodGxzX2h0dHBfY29uLT5rc3NsX2N0eCA9PSBOVUxMKQorICAgIHRsc19odHRwX2Nvbi0+a3NzbF9jdHggPSBrc3NsX2N0eF9uZXcoKTsKKyAgICBpZiAodGxzX2h0dHBfY29uLT5rc3NsX2N0eCAhPSBOVUxMKQorICAgICAgICBrc3NsX2N0eF9zZXRzdHJpbmcodGxzX2h0dHBfY29uLT5rc3NsX2N0eCwgS1NTTF9TRVJWRVIsIGhvc3RuYW1lKTsKKworICAgIGtzc2xfY3R4X3NldHN0cmluZyh0bHNfaHR0cF9jb24tPmtzc2xfY3R4LCBLU1NMX1NFUlZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2Rfc3J2ID8ga3JiNV9kX3NydiA6IEtSQjVfU0VSVklDRV9OQU1FKTsKKyNlbmRpZiAvKiBTU0xfS1JCNSAqLworCisgICAgaWYgKHNzbF9jaXBoZXJfbGlzdCkKKyAgICAgICAgU1NMX3NldF9jaXBoZXJfbGlzdCh0bHNfaHR0cF9jb24sc3NsX2NpcGhlcl9saXN0KTsKKyAgICBlbHNlIHsKKyAgICAgICAgY2hhciAqIHA7CisgICAgICAgIGlmIChwID0gZ2V0ZW52KCJTU0xfQ0lQSEVSIikpIHsKKyAgICAgICAgICAgIFNTTF9zZXRfY2lwaGVyX2xpc3QodGxzX2h0dHBfY29uLHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU1NMX3NldF9jaXBoZXJfbGlzdCh0bHNfaHR0cF9jb24sREVGQVVMVF9DSVBIRVJfTElTVCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzc2xfdmVyaWZ5X2RlcHRoID0gLTE7CisKKyAgICBpZiAoIHNzbF9kZWJ1Z19mbGFnICkKKyAgICAgICAgcHJpbnRmKCJTU0wvVExTIGluaXQgZG9uZSFcclxuIik7CisKKyAgICBzc2xfaHR0cF9pbml0aWFsaXplZCA9IDE7CisgICAgcmV0dXJuKDEpOworfQorI2VuZGlmIC8qIE5PSFRUUCAqLworCitjaGFyICoKK3NzbF9nZXRfZE5TTmFtZShzc2wpIFNTTCAqIHNzbDsKK3sKKyAgICBzdGF0aWMgY2hhciAqZG5zID0gTlVMTDsKKyAgICBYNTA5ICpzZXJ2ZXJfY2VydCA9IE5VTEw7CisgICAgaW50IGk7CisgICAgWDUwOV9FWFRFTlNJT04gKmV4dCA9IE5VTEw7CisgICAgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqaWFsdCA9IE5VTEw7CisgICAgR0VORVJBTF9OQU1FICpnZW4gPSBOVUxMOworCisgICAgaWYgKCBkbnMgKSB7CisgICAgICAgIGZyZWUoZG5zKTsKKyAgICAgICAgZG5zID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoc2VydmVyX2NlcnQgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsKSkgeworICAgICAgICBpZiAoKGkgPSBYNTA5X2dldF9leHRfYnlfTklEKHNlcnZlcl9jZXJ0LCBOSURfc3ViamVjdF9hbHRfbmFtZSwgLTEpKTwwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghKGV4dCA9IFg1MDlfZ2V0X2V4dChzZXJ2ZXJfY2VydCwgaSkpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFg1MDlWM19hZGRfc3RhbmRhcmRfZXh0ZW5zaW9ucygpOworICAgICAgICBpZiAoIShpYWx0ID0gWDUwOVYzX0VYVF9kMmkoZXh0KSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oaWFsdCk7IGkrKykgeworICAgICAgICAgICAgZ2VuID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGlhbHQsIGkpOworICAgICAgICAgICAgaWYgKGdlbi0+dHlwZSA9PSBHRU5fRE5TKSB7CisgICAgICAgICAgICAgICAgaWYoIWdlbi0+ZC5pYTUgfHwgIWdlbi0+ZC5pYTUtPmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZG5zID0gbWFsbG9jKGdlbi0+ZC5pYTUtPmxlbmd0aCArIDEpOworICAgICAgICAgICAgICAgIGlmIChkbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRucywgZ2VuLT5kLmlhNS0+ZGF0YSwgZ2VuLT5kLmlhNS0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgZG5zW2dlbi0+ZC5pYTUtPmxlbmd0aF0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBYNTA5VjNfRVhUX2NsZWFudXAoKTsKKyAgICB9CitjbGVhbnVwOgorICAgIGlmIChpYWx0KSAgICAgICAgICAgc2tfR0VORVJBTF9OQU1FX2ZyZWUoaWFsdCk7CisgICAgaWYgKHNlcnZlcl9jZXJ0KSAgICBYNTA5X2ZyZWUoc2VydmVyX2NlcnQpOworICAgIHJldHVybiBkbnM7Cit9CisKK2NoYXIgKgorc3NsX2dldF9jb21tb25OYW1lKHNzbCkgU1NMICogc3NsOworeworICAgIHN0YXRpYyBjaGFyIG5hbWVbMjU2XTsKKyAgICBpbnQgZXJyOworICAgIFg1MDkgKnNlcnZlcl9jZXJ0OworCisgICAgaWYgKHNlcnZlcl9jZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbCkpIHsKKyAgICAgICAgZXJyID0gWDUwOV9OQU1FX2dldF90ZXh0X2J5X05JRChYNTA5X2dldF9zdWJqZWN0X25hbWUoc2VydmVyX2NlcnQpLAorICAgICAgICAgICAgICAgIE5JRF9jb21tb25OYW1lLCBuYW1lLCBzaXplb2YobmFtZSkpOworICAgICAgICBYNTA5X2ZyZWUoc2VydmVyX2NlcnQpOworICAgIH0KKyAgICBpZiAoZXJyID4gMCkKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKworY2hhciAqCitzc2xfZ2V0X2lzc3Vlcl9uYW1lKHNzbCkgU1NMICogc3NsOworeworICAgIHN0YXRpYyBjaGFyIG5hbWVbMjU2XTsKKyAgICBYNTA5ICpzZXJ2ZXJfY2VydDsKKworICAgIG5hbWVbMF0gPSAnXDAnOworICAgIGlmIChzZXJ2ZXJfY2VydCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzc2wpKSB7CisgICAgICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHNlcnZlcl9jZXJ0KSxuYW1lLHNpemVvZihuYW1lKSk7CisgICAgICAgIFg1MDlfZnJlZShzZXJ2ZXJfY2VydCk7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKyAgICBlbHNlIHsKKyNpZmRlZiBDT01NRU5UCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IE5vIGNlcnRpZmljYXRlIGZyb20gc2VydmVyIVxyXG4iKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworY2hhciAqCitzc2xfZ2V0X3N1YmplY3RfbmFtZShzc2wpIFNTTCAqIHNzbDsKK3sKKyAgICBzdGF0aWMgY2hhciBuYW1lWzI1Nl07CisgICAgWDUwOSAqc2VydmVyX2NlcnQ7CisKKyAgICBuYW1lWzBdID0gJ1wwJzsKKyAgICBpZiAoc2VydmVyX2NlcnQgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsKSkgeworICAgICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShzZXJ2ZXJfY2VydCksbmFtZSxzaXplb2YobmFtZSkpOworICAgICAgIFg1MDlfZnJlZShzZXJ2ZXJfY2VydCk7CisgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZiBDT01NRU5UCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICAmJiAhKGNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSAmJgorICAgICAgICAgICAgICAgKHRsc19hY3RpdmVfZmxhZyB8fCBzc2xfYWN0aXZlX2ZsYWcpICYmCisgICAgICAgICAgICAgICBzc2xfYW5vbnltb3VzX2NpcGhlcih0bHNfYWN0aXZlX2ZsYWc/dGxzX2Nvbjpzc2xfY29uKSkKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworaW50Citzc2xfYW5vbnltb3VzX2NpcGhlcihzc2wpIFNTTCAqIHNzbDsKK3sKKyAgICBYNTA5ICogY2VydDsKKworICAgIGlmIChzc3RlbG5ldCkKKyAgICAgICAgY2VydCA9IFNTTF9nZXRfY2VydGlmaWNhdGUoc3NsKTsKKyAgICBlbHNlCisgICAgICAgIGNlcnQgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsKTsKKworICAgIGlmICggY2VydCApIHsKKyAgICAgICAgWDUwOV9mcmVlKGNlcnQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisvKgorICBUaGlzIG9uZSBpcyAodmVyeSBtdWNoISkgYmFzZWQgb24gd29yayBieQorICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPi4KKyAgQ29tbWVudHMgYnkgUmFsZi4KKyovCitpbnQKK3NzbF92ZXJpZnlfY3JsKGludCBvaywgWDUwOV9TVE9SRV9DVFggKmN0eCkKK3sKKyAgICBYNTA5X09CSkVDVCBvYmo7CisgICAgWDUwOV9OQU1FICpzdWJqZWN0ID0gTlVMTDsKKyAgICBYNTA5X05BTUUgKmlzc3VlciA9IE5VTEw7CisgICAgWDUwOSAqeHMgPSBOVUxMOworICAgIFg1MDlfQ1JMICpjcmwgPSBOVUxMOworICAgIFg1MDlfUkVWT0tFRCAqcmV2b2tlZCA9IE5VTEw7CisgICAgWDUwOV9TVE9SRV9DVFggKiBzdG9yZV9jdHggPSBOVUxMOworICAgIGxvbmcgc2VyaWFsOworICAgIEJJTyAqYmlvID0gTlVMTDsKKyAgICBpbnQgaSwgbiwgcmM7CisgICAgY2hhciAqY3A7CisgICAgY2hhciAqY3AyOworCisgICAgLyoKKyAgICAgKiBVbmxlc3MgYSByZXZvY2F0aW9uIHN0b3JlIGZvciBDUkxzIHdhcyBjcmVhdGVkIHdlCisgICAgICogY2Fubm90IGRvIGFueSBDUkwtYmFzZWQgdmVyaWZpY2F0aW9uLCBvZiBjb3Vyc2UuCisgICAgICovCisgICAgaWYgKCFjcmxfc3RvcmUpCisgICAgICAgIHJldHVybiBvazsKKworICAgIHN0b3JlX2N0eCA9IFg1MDlfU1RPUkVfQ1RYX25ldygpOworICAgIGlmICggIXN0b3JlX2N0eCApCisgICAgICAgIHJldHVybihvayk7CisKKyAgICAvKgorICAgICAqIERldGVybWluZSBjZXJ0aWZpY2F0ZSBpbmdyZWRpZW50cyBpbiBhZHZhbmNlCisgICAgICovCisgICAgeHMgICAgICA9IFg1MDlfU1RPUkVfQ1RYX2dldF9jdXJyZW50X2NlcnQoY3R4KTsKKyAgICBzdWJqZWN0ID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKHhzKTsKKyAgICBpc3N1ZXIgID0gWDUwOV9nZXRfaXNzdWVyX25hbWUoeHMpOworCisgICAgLyoKKyAgICAgKiBPcGVuU1NMIHByb3ZpZGVzIHRoZSBnZW5lcmFsIG1lY2hhbmlzbSB0byBkZWFsIHdpdGggQ1JMcyBidXQgZG9lcyBub3QKKyAgICAgKiB1c2UgdGhlbSBhdXRvbWF0aWNhbGx5IHdoZW4gdmVyaWZ5aW5nIGNlcnRpZmljYXRlcywgc28gd2UgZG8gaXQKKyAgICAgKiBleHBsaWNpdGx5IGhlcmUuIFdlIHdpbGwgY2hlY2sgdGhlIENSTCBmb3IgdGhlIGN1cnJlbnRseSBjaGVja2VkCisgICAgICogY2VydGlmaWNhdGUsIGlmIHRoZXJlIGlzIHN1Y2ggYSBDUkwgaW4gdGhlIHN0b3JlLgorICAgICAqCisgICAgICogV2UgY29tZSB0aHJvdWdoIHRoaXMgcHJvY2VkdXJlIGZvciBlYWNoIGNlcnRpZmljYXRlIGluIHRoZSBjZXJ0aWZpY2F0ZQorICAgICAqIGNoYWluLCBzdGFydGluZyB3aXRoIHRoZSByb290LUNBJ3MgY2VydGlmaWNhdGUuIEF0IGVhY2ggc3RlcCB3ZSd2ZSB0bworICAgICAqIGJvdGggdmVyaWZ5IHRoZSBzaWduYXR1cmUgb24gdGhlIENSTCAodG8gbWFrZSBzdXJlIGl0J3MgYSB2YWxpZCBDUkwpCisgICAgICogYW5kIGl0J3MgcmV2b2NhdGlvbiBsaXN0ICh0byBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgY2VydGlmaWNhdGUgaXNuJ3QKKyAgICAgKiByZXZva2VkKS4gIEJ1dCBiZWNhdXNlIHRvIGNoZWNrIHRoZSBzaWduYXR1cmUgb24gdGhlIENSTCB3ZSBuZWVkIHRoZQorICAgICAqIHB1YmxpYyBrZXkgb2YgdGhlIGlzc3VpbmcgQ0EgY2VydGlmaWNhdGUgKHdoaWNoIHdhcyBhbHJlYWR5IHByb2Nlc3NlZAorICAgICAqIG9uZSByb3VuZCBiZWZvcmUpLCB3ZSd2ZSBhIGxpdHRsZSBwcm9ibGVtLiBCdXQgd2UgY2FuIGJvdGggc29sdmUgaXQgYW5kCisgICAgICogYXQgdGhlIHNhbWUgdGltZSBvcHRpbWl6ZSB0aGUgcHJvY2Vzc2luZyBieSB1c2luZyB0aGUgZm9sbG93aW5nCisgICAgICogdmVyaWZpY2F0aW9uIHNjaGVtZSAoaWRlYSBhbmQgY29kZSBzbmlwcGV0cyBib3Jyb3dlZCBmcm9tIHRoZSBHTE9CVVMKKyAgICAgKiBwcm9qZWN0KToKKyAgICAgKgorICAgICAqIDEuIFdlJ2xsIGNoZWNrIHRoZSBzaWduYXR1cmUgb2YgYSBDUkwgaW4gZWFjaCBzdGVwIHdoZW4gd2UgZmluZCBhIENSTAorICAgICAqICAgIHRocm91Z2ggdGhlIF9zdWJqZWN0XyBuYW1lIG9mIHRoZSBjdXJyZW50IGNlcnRpZmljYXRlLiBUaGlzIENSTAorICAgICAqICAgIGl0c2VsZiB3aWxsIGJlIG5lZWRlZCB0aGUgZmlyc3QgdGltZSBpbiB0aGUgbmV4dCByb3VuZCwgb2YgY291cnNlLgorICAgICAqICAgIEJ1dCB3ZSBkbyB0aGUgc2lnbmF0dXJlIHByb2Nlc3Npbmcgb25lIHJvdW5kIGJlZm9yZSB0aGlzIHdoZXJlIHRoZQorICAgICAqICAgIHB1YmxpYyBrZXkgb2YgdGhlIENBIGlzIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIDIuIFdlJ2xsIGNoZWNrIHRoZSByZXZvY2F0aW9uIGxpc3Qgb2YgYSBDUkwgaW4gZWFjaCBzdGVwIHdoZW4KKyAgICAgKiAgICB3ZSBmaW5kIGEgQ1JMIHRocm91Z2ggdGhlIF9pc3N1ZXJfIG5hbWUgb2YgdGhlIGN1cnJlbnQgY2VydGlmaWNhdGUuCisgICAgICogICAgVGhpcyBDUkxzIHNpZ25hdHVyZSB3YXMgdGhlbiBhbHJlYWR5IHZlcmlmaWVkIG9uZSByb3VuZCBiZWZvcmUuCisgICAgICoKKyAgICAgKiBUaGlzIHZlcmlmaWNhdGlvbiBzY2hlbWUgYWxsb3dzIGEgQ0EgdG8gcmV2b2tlIGl0cyBvd24gY2VydGlmaWNhdGUgYXMKKyAgICAgKiB3ZWxsLCBvZiBjb3Vyc2UuCisgICAgICovCisKKyAgICAvKgorICAgICAqIFRyeSB0byByZXRyaWV2ZSBhIENSTCBjb3JyZXNwb25kaW5nIHRvIHRoZSBfc3ViamVjdF8gb2YKKyAgICAgKiB0aGUgY3VycmVudCBjZXJ0aWZpY2F0ZSBpbiBvcmRlciB0byB2ZXJpZnkgaXQncyBpbnRlZ3JpdHkuCisgICAgICovCisgICAgbWVtc2V0KChjaGFyICopJm9iaiwgMCwgc2l6ZW9mKG9iaikpOworICAgIFg1MDlfU1RPUkVfQ1RYX2luaXQoc3RvcmVfY3R4LCBjcmxfc3RvcmUsIE5VTEwsIE5VTEwpOworICAgIHJjID0gWDUwOV9TVE9SRV9nZXRfYnlfc3ViamVjdChzdG9yZV9jdHgsIFg1MDlfTFVfQ1JMLCBzdWJqZWN0LCAmb2JqKTsKKyAgICBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKHN0b3JlX2N0eCk7CisgICAgY3JsID0gb2JqLmRhdGEuY3JsOworICAgIGlmIChyYyA+IDAgJiYgY3JsICE9IE5VTEwpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVmVyaWZ5IHRoZSBzaWduYXR1cmUgb24gdGhpcyBDUkwKKyAgICAgICAgICovCisgICAgICAgIGlmIChYNTA5X0NSTF92ZXJpZnkoY3JsLCBYNTA5X2dldF9wdWJrZXkoeHMpKSA8PSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgc2lnbmF0dXJlIG9uIENSTCFcbiIpOworICAgICAgICAgICAgWDUwOV9TVE9SRV9DVFhfc2V0X2Vycm9yKGN0eCwgWDUwOV9WX0VSUl9DUkxfU0lHTkFUVVJFX0ZBSUxVUkUpOworICAgICAgICAgICAgWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cygmb2JqKTsKKyAgICAgICAgICAgIFg1MDlfU1RPUkVfQ1RYX2ZyZWUoc3RvcmVfY3R4KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgZGF0ZSBvZiBDUkwgdG8gbWFrZSBzdXJlIGl0J3Mgbm90IGV4cGlyZWQKKyAgICAgICAgICovCisgICAgICAgIGkgPSBYNTA5X2NtcF9jdXJyZW50X3RpbWUoWDUwOV9DUkxfZ2V0X25leHRVcGRhdGUoY3JsKSk7CisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRm91bmQgQ1JMIGhhcyBpbnZhbGlkIG5leHRVcGRhdGUgZmllbGQuXG4iKTsKKyAgICAgICAgICAgIFg1MDlfU1RPUkVfQ1RYX3NldF9lcnJvcihjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NSTF9ORVhUX1VQREFURV9GSUVMRCk7CisgICAgICAgICAgICBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOworICAgICAgICAgICAgWDUwOV9TVE9SRV9DVFhfZnJlZShzdG9yZV9jdHgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyJGb3VuZCBDUkwgaXMgZXhwaXJlZCAtIHJldm9raW5nIGFsbCBjZXJ0aWZpY2F0ZXMgdW50aWwgeW91IGdldCB1cGRhdGVkIENSTC5cbiIKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIFg1MDlfU1RPUkVfQ1RYX3NldF9lcnJvcihjdHgsIFg1MDlfVl9FUlJfQ1JMX0hBU19FWFBJUkVEKTsKKyAgICAgICAgICAgIFg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJm9iaik7CisgICAgICAgICAgICBYNTA5X1NUT1JFX0NUWF9mcmVlKHN0b3JlX2N0eCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOworICAgIH0KKworICAgIC8qCisgICAgICogVHJ5IHRvIHJldHJpZXZlIGEgQ1JMIGNvcnJlc3BvbmRpbmcgdG8gdGhlIF9pc3N1ZXJfIG9mCisgICAgICogdGhlIGN1cnJlbnQgY2VydGlmaWNhdGUgaW4gb3JkZXIgdG8gY2hlY2sgZm9yIHJldm9jYXRpb24uCisgICAgICovCisgICAgbWVtc2V0KChjaGFyICopJm9iaiwgMCwgc2l6ZW9mKG9iaikpOworICAgIFg1MDlfU1RPUkVfQ1RYX2luaXQoc3RvcmVfY3R4LCBjcmxfc3RvcmUsIE5VTEwsIE5VTEwpOworICAgIHJjID0gWDUwOV9TVE9SRV9nZXRfYnlfc3ViamVjdChzdG9yZV9jdHgsIFg1MDlfTFVfQ1JMLCBpc3N1ZXIsICZvYmopOworICAgIFg1MDlfU1RPUkVfQ1RYX2ZyZWUoc3RvcmVfY3R4KTsJCS8qIGNhbGxzIFg1MDlfU1RPUkVfQ1RYX2NsZWFudXAoKSAqLworICAgIGNybCA9IG9iai5kYXRhLmNybDsKKyAgICBpZiAocmMgPiAwICYmIGNybCAhPSBOVUxMKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIGlmIHRoZSBjdXJyZW50IGNlcnRpZmljYXRlIGlzIHJldm9rZWQgYnkgdGhpcyBDUkwKKyAgICAgICAgICovCisgICAgICAgIG4gPSBza19YNTA5X1JFVk9LRURfbnVtKFg1MDlfQ1JMX2dldF9SRVZPS0VEKGNybCkpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICByZXZva2VkID0gc2tfWDUwOV9SRVZPS0VEX3ZhbHVlKFg1MDlfQ1JMX2dldF9SRVZPS0VEKGNybCksIGkpOworICAgICAgICAgICAgaWYgKEFTTjFfSU5URUdFUl9jbXAocmV2b2tlZC0+c2VyaWFsTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9nZXRfc2VyaWFsTnVtYmVyKHhzKSkgPT0gMCkgeworCisgICAgICAgICAgICAgICAgc2VyaWFsID0gQVNOMV9JTlRFR0VSX2dldChyZXZva2VkLT5zZXJpYWxOdW1iZXIpOworICAgICAgICAgICAgICAgIGNwID0gWDUwOV9OQU1FX29uZWxpbmUoaXNzdWVyLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBmcmVlKGNwKTsKKworICAgICAgICAgICAgICAgIFg1MDlfU1RPUkVfQ1RYX3NldF9lcnJvcihjdHgsIFg1MDlfVl9FUlJfQ0VSVF9SRVZPS0VEKTsKKyAgICAgICAgICAgICAgICBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJm9iaik7CisgICAgfQorICAgIHJldHVybiBvazsKK30KKworY2hhciAqCit0bHNfdXNlcmlkX2Zyb21fY2xpZW50X2NlcnQoc3NsKSBTU0wgKiBzc2w7Cit7CisgICAgc3RhdGljIGNoYXIgY25bMjU2XTsKKyAgICBzdGF0aWMgY2hhciAqciA9IGNuOworICAgIGludCBlcnI7CisgICAgWDUwOSAqY2xpZW50X2NlcnQ7CisKKyAgICBpZiAoY2xpZW50X2NlcnQgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsKSkgeworICAgICAgICAvKiBjYWxsIHRoZSBjdXN0b20gZnVuY3Rpb24gKi8KKyAgICAgICAgZXJyID0gWDUwOV90b191c2VyKGNsaWVudF9jZXJ0LCBjbiwgc2l6ZW9mKGNuKSk7CisgICAgICAgIFg1MDlfZnJlZShjbGllbnRfY2VydCk7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR1cm4gciA9IE5VTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiByID0gTlVMTDsKK30KKwordW5zaWduZWQgY2hhciAqKgordGxzX2dldF9TQU5fb2JqcyhTU0wgKiBzc2wsIGludCB0eXBlKQorLyogcmV0dXJucyBOVUxMIG9yIGFuIGFycmF5IG9mIG1hbGxvYydlZCBvYmplY3RzIG9mIHR5cGUgYHR5cGUnIGZyb20gdGhlIHNlcnZlcidzCisgKiBzdWJqZWN0QWx0TmFtZSwgcmVtZW1iZXIgdG8gZnJlZSgpIHRoZW0gYWxsIQorICovCit7CisjZGVmaW5lIE5VTV9TQU5fT0JKUyA2NAorICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpvYmpzW05VTV9TQU5fT0JKU107CisgICAgdW5zaWduZWQgY2hhciAqKnJ2ID0gTlVMTDsKKyAgICBYNTA5ICpzZXJ2ZXJfY2VydCA9IE5VTEw7CisgICAgaW50IGksIGo7CisgICAgWDUwOV9FWFRFTlNJT04gKmV4dCA9IE5VTEw7CisgICAgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqaWFsdCA9IE5VTEw7CisgICAgR0VORVJBTF9OQU1FICpnZW4gPSBOVUxMOworCisgICAgbWVtc2V0KG9ianMsIDAsIHNpemVvZihvYmpzKSk7CisgICAgaWYgKHNlcnZlcl9jZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbCkpIHsKKyAgICAgICAgaWYgKChpID0gWDUwOV9nZXRfZXh0X2J5X05JRChzZXJ2ZXJfY2VydCwgTklEX3N1YmplY3RfYWx0X25hbWUsIC0xKSkgPCAwKQorICAgICAgICAgICAgZ290byBlamVjdDsKKyAgICAgICAgaWYgKCEoZXh0ID0gWDUwOV9nZXRfZXh0KHNlcnZlcl9jZXJ0LCBpKSkpCisgICAgICAgICAgICBnb3RvIGVqZWN0OworICAgICAgICBYNTA5VjNfYWRkX3N0YW5kYXJkX2V4dGVuc2lvbnMoKTsKKyAgICAgICAgaWYgKCEoaWFsdCA9IFg1MDlWM19FWFRfZDJpKGV4dCkpKQorICAgICAgICAgICAgZ290byBlamVjdDsKKyAgICAgICAgcnYgPSBvYmpzOworICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oaWFsdCkgJiYgaiA8IE5VTV9TQU5fT0JKUyAtIDI7IGkrKykgeworICAgICAgICAgICAgZ2VuID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGlhbHQsIGkpOworICAgICAgICAgICAgLyogVGhlIHVzZSBvZiBWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyBpcyBiZWNhdXNlIE9wZW5TU0wgMC45LjYgZGVmaW5lZCBpdHMKKyAgICAgICAgICAgICAqIHR5cGVzIHwgVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMuICAwLjkuNyBkb2VzIG5vdC4gIEluIGNhc2UsIHdlIGFyZSBidWlsdAorICAgICAgICAgICAgICogd2l0aCBvbmUgYW5kIGxpbmtlZCB0byB0aGUgb3RoZXIgd2UgdXNlIHRoaXMgaGFjay4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChnZW4tPnR5cGUgfCBWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQykgPT0gKHR5cGUgfCBWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQykpIHsKKyAgICAgICAgICAgICAgICBpZighZ2VuLT5kLmlhNSB8fCAhZ2VuLT5kLmlhNS0+bGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBvYmpzW2pdID0gbWFsbG9jKGdlbi0+ZC5pYTUtPmxlbmd0aCArIDEpOworICAgICAgICAgICAgICAgIGlmIChvYmpzW2pdKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShvYmpzW2pdLCBnZW4tPmQuaWE1LT5kYXRhLCBnZW4tPmQuaWE1LT5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBvYmpzW2pdW2dlbi0+ZC5pYTUtPmxlbmd0aF0gPSAwOworICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFg1MDlWM19FWFRfY2xlYW51cCgpOworICAgIH0KK2VqZWN0OgorICAgIGlmIChpYWx0KSAgICAgICAgICAgc2tfR0VORVJBTF9OQU1FX2ZyZWUoaWFsdCk7CisgICAgaWYgKHNlcnZlcl9jZXJ0KSAgICBYNTA5X2ZyZWUoc2VydmVyX2NlcnQpOworICAgIHJldHVybiBydjsKK30KKworCitzdGF0aWMgaW50CitkTlNOYW1lX2NtcChjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpkTlNOYW1lKQoreworICAgIGludCBjMSA9IDAsIGMyID0gMCwgbnVtX2NvbXAsIHJ2ID0gLTE7CisgICAgY2hhciAqcCwgKnAxLCAqcDIsICpob3N0X2NvcHk9TlVMTCwgKmROU05hbWVfY29weT1OVUxMOworCisgICAgLyogZmlyc3Qgd2UgY291bnQgdGhlIG51bWJlciBvZiBkb21haW4gbmFtZSBjb21wb25lbnRzIGluIGJvdGggcGFyYW1ldGVycy4KKyAgICAgKiB0aGV5IHNob3VsZCBiZSBlcXVhbCBtYW55LCBvciBpdCdzIG5vdCBhIG1hdGNoCisgICAgICovCisgICAgcCA9IChjaGFyICopIGhvc3Q7CisgICAgd2hpbGUgKHAgPSBzdHJzdHIocCwgIi4iKSkgeworICAgICAgICBjMSsrOworICAgICAgICBwKys7CisgICAgfQorICAgIHAgPSAoY2hhciAqKSBkTlNOYW1lOworICAgIHdoaWxlIChwID0gc3Ryc3RyKHAsICIuIikpIHsKKyAgICAgICAgYzIrKzsKKyAgICAgICAgcCsrOworICAgIH0KKyAgICBpZiAoYzEgIT0gYzIpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBudW1fY29tcCA9IGMxOworCisgICAgbWFrZXN0cigmaG9zdF9jb3B5LGhvc3QpOworICAgIG1ha2VzdHIoJmROU05hbWVfY29weSxkTlNOYW1lKTsKKyAgICBpZiAoaG9zdF9jb3B5ID09IE5VTEwgfHwgZE5TTmFtZV9jb3B5ID09IE5VTEwpCisgICAgICAgIGdvdG8gZWplY3Q7CisgICAgLyogbWFrZSBzdWJzdHJpbmdzIGJ5IHJlcGxhY2luZyAnLicgd2l0aCAnXDAnICovCisgICAgcCA9IGROU05hbWVfY29weTsKKyAgICB3aGlsZSAocCA9IHN0cnN0cihwLCAiLiIpKSB7CisgICAgICAgICpwID0gJ1wwJzsKKyAgICAgICAgcCsrOworICAgIH0KKyAgICBwID0gaG9zdF9jb3B5OworICAgIHdoaWxlIChwID0gc3Ryc3RyKHAsICIuIikpIHsKKyAgICAgICAgKnAgPSAnXDAnOworICAgICAgICBwKys7CisgICAgfQorCisgICAgLyogY29tcGFyZSBlYWNoIGNvbXBvbmVudCAqLworICAgIHAxID0gaG9zdF9jb3B5OworICAgIHAyID0gZE5TTmFtZV9jb3B5OworICAgIGZvciAoOyBudW1fY29tcDsgbnVtX2NvbXAtLSkgeworICAgICAgICBpZiAoIWNrbWF0Y2gocDIsIHAxLDAsMSkpCisgICAgICAgICAgICAvKiBmYWlsZWQgbWF0Y2ggKi8KKyAgICAgICAgICAgIGdvdG8gZWplY3Q7CisgICAgICAgIHAxICs9IHN0cmxlbihwMSkgKyAxOworICAgICAgICBwMiArPSBzdHJsZW4ocDIpICsgMTsKKyAgICB9CisgICAgLyogbWF0Y2ggb2sgKi8KKyAgICBydiA9IDA7CisKKyAgZWplY3Q6CisgICAgaWYgKGROU05hbWVfY29weSkgICBmcmVlKGROU05hbWVfY29weSk7CisgICAgaWYgKGhvc3RfY29weSkgICAgICBmcmVlKGhvc3RfY29weSk7CisgICAgcmV0dXJuIHJ2OworfQorCisKKworc3RhdGljIGludAorc2hvd19ob3N0bmFtZV93YXJuaW5nKGNoYXIgKnMxLCBjaGFyICpzMikKK3sKKyAgICBjaGFyIHByZWZpeFsxMDI0XTsKKyAgICBpbnQgb2sgPSAxOworICAgIGNrbWFreG1zZyhwcmVmaXgsMTAyNCwKKyAgICAgICAgICAgICAgIldhcm5pbmc6IEhvc3RuYW1lIChcIiIsIHMxLCAKKyAgICAgICAgICAgICAgIlwiKSBkb2VzIG5vdCBtYXRjaCBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZSAoXCIiLCBzMiwgIlwiKSIsCisgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIGlmIChzc2xfdmVyaWZ5X2ZsYWcpCisgICAgICAgIG9rID0gdXFfb2socHJlZml4LAorICAgICAgICAgICAgICAgICAgICAiQ29udGludWU/IChZL04pICIsCisgICAgICAgICAgICAgICAgICAgIDMsIE5VTEwsIDApOworICAgIGVsc2UgaWYgKHNzbF92ZXJib3NlX2ZsYWcpCisgICAgICAgIHByaW50ZihwcmVmaXgpOworICAgIHJldHVybihvayk7Cit9CisKKyNpZm5kZWYgSFBVWDEwCisjaWZuZGVmIEhQVVgxMTAwCisjaWZuZGVmIFNDT19PU1I1MDUKKyNpZm5kZWYgT3BlbkJTRAorI2lmbmRlZiBGUkVFQlNENAorI2lmbmRlZiBMSU5VWAorI2lmbmRlZiBBSVg0MQorI2lmbmRlZiBVVzcKKyNpZm5kZWYgU09MQVJJUzkKKyNpZm5kZWYgU09MQVJJUzgKKyNpZm5kZWYgU09MQVJJUzcKKyNpZmRlZiBERUNfVENQSVAKKyNkZWZpbmUgaW5ldF9hdG9uIElORVRfQVRPTgorI2VuZGlmIC8qIERFQ19UQ1BJUCAqLworc3RhdGljIGludAoraW5ldF9hdG9uKGNoYXIgKiBpcGFkZHJlc3MsIHN0cnVjdCBpbl9hZGRyICogaWEpIHsKKyAgICBzdHJ1Y3Qgc3RyaW5nYXJyYXkgKiBxOworICAgIHVuaW9uIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsOworICAgICAgICB1bnNpZ25lZCBjaGFyIGJbNF07CisgICAgfSBkdW1teTsKKworICAgIHEgPSBja3NwbGl0KDEsMCxpcGFkZHJlc3MsIi4iLCIwMTIzNDU2Nzg5YWJjZGVmQUNERUYiLDgsMCwwKTsKKyAgICBpZiAocS0+YV9zaXplID09IDQpIHsKKyAgICAgICAgZHVtbXkuYlswXSA9IGF0b2kocS0+YV9oZWFkWzFdKTsKKyAgICAgICAgZHVtbXkuYlsxXSA9IGF0b2kocS0+YV9oZWFkWzJdKTsKKyAgICAgICAgZHVtbXkuYlsyXSA9IGF0b2kocS0+YV9oZWFkWzNdKTsKKyAgICAgICAgZHVtbXkuYlszXSA9IGF0b2kocS0+YV9oZWFkWzRdKTsKKyAgICAgICAgaWEtPnNfYWRkciA9IGR1bW15Lmw7CisgICAgICAgIHJldHVybihpYS0+c19hZGRyICE9IDApOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogU09MQVJJUzcgKi8KKyNlbmRpZiAvKiBTT0xBUklTOCAqLworI2VuZGlmIC8qIFNPTEFSSVM5ICovCisjZW5kaWYgLyogVVc3ICovCisjZW5kaWYgLyogQUlYNDEgKi8KKyNlbmRpZiAvKiBMSU5VWCAqLworI2VuZGlmIC8qIEZSRUVCU0Q0ICovCisjZW5kaWYgLyogT3BlbkJTRCAqLworI2VuZGlmIC8qIFNDT19PU1I1MDUgKi8KKyNlbmRpZiAvKiBIUFVYMTEwMCAqLworI2VuZGlmIC8qIEhQVVgxMCAqLworCitpbnQKK3NzbF9jaGVja19zZXJ2ZXJfbmFtZShTU0wgKiBzc2wsIGNoYXIgKiBob3N0bmFtZSkKKy8qIHJldHVybnMgMCBpZiBob3N0bmFtZSBhbmQgc2VydmVyJ3MgY2VydCBtYXRjaGVzLCBlbHNlIC0xICovCit7CisgICAgY2hhciAqIGNvbW1vbk5hbWU7CisgICAgdW5zaWduZWQgY2hhciAqKiBkTlNOYW1lOworICAgIHVuc2lnbmVkIGNoYXIgKiogaXBBZGRyZXNzOworICAgIHN0cnVjdCBpbl9hZGRyIGlhOworICAgIGludCBydjsKKworICAgIGlmIChzc2xfdmVyYm9zZV9mbGFnICYmICFpbnNlcnZlcikgeworICAgICAgICBpZiAoZE5TTmFtZSA9IHRsc19nZXRfU0FOX29ianMoc3NsLEdFTl9ETlMpKSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBkTlNOYW1lW2ldOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkNlcnRpZmljYXRlWzBdIGFsdFN1YmplY3ROYW1lIEROUz0lc1xyXG4iLGROU05hbWVbaV0pOworICAgICAgICAgICAgICAgIGZyZWUoZE5TTmFtZVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlwQWRkcmVzcyA9IHRsc19nZXRfU0FOX29ianMoc3NsLEdFTl9JUEFERCkpIHsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIGNoYXIgKnNlcnZlcl9pcDsKKyAgICAgICAgICAgIHN0cnVjdCBpbl9hZGRyIGlhOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpcEFkZHJlc3NbaV07IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpcEFkZHJlc3NbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWEuc19hZGRyID0gKih1bnNpZ25lZCBsb25nICopaXBBZGRyZXNzW2ldOworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaXAgPSBpbmV0X250b2EoaWEpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIkNlcnRpZmljYXRlWzBdIGFsdFN1YmplY3ROYW1lIElQQWRkcj0lc1xyXG4iLHNlcnZlcl9pcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyZWUoaXBBZGRyZXNzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGlwQWRkcmVzcyBwb2ludHMgdG8gYSBzdGF0aWMgLSBkb24ndCBmcmVlICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGROU05hbWUgPSB0bHNfZ2V0X1NBTl9vYmpzKHNzbCxHRU5fRU1BSUwpKSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBkTlNOYW1lW2ldOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkNlcnRpZmljYXRlWzBdIGFsdFN1YmplY3ROYW1lIEVtYWlsPSVzXHJcbiIsZE5TTmFtZVtpXSk7CisgICAgICAgICAgICAgICAgZnJlZShkTlNOYW1lW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZE5TTmFtZSA9IHRsc19nZXRfU0FOX29ianMoc3NsLEdFTl9VUkkpKSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBkTlNOYW1lW2ldOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkNlcnRpZmljYXRlWzBdIGFsdFN1YmplY3ROYW1lIFVSST0lc1xyXG4iLGROU05hbWVbaV0pOworICAgICAgICAgICAgICAgIGZyZWUoZE5TTmFtZVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGROU05hbWUgPSB0bHNfZ2V0X1NBTl9vYmpzKHNzbCxHRU5fT1RIRVJOQU1FKSkgeworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgZE5TTmFtZVtpXTsgaSsrKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJDZXJ0aWZpY2F0ZVswXSBhbHRTdWJqZWN0TmFtZSBPdGhlcj0lc1xyXG4iLGROU05hbWVbaV0pOworICAgICAgICAgICAgICAgIGZyZWUoZE5TTmFtZVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmaXJzdCB3ZSBjaGVjayBpZiBgaG9zdG5hbWUnIGlzIGluIGZhY3QgYW4gaXAgYWRkcmVzcyAqLworICAgIGlmIChpbmV0X2F0b24oaG9zdG5hbWUsICZpYSkpIHsKKyAgICAgICAgaXBBZGRyZXNzID0gdGxzX2dldF9TQU5fb2Jqcyhzc2wsR0VOX0lQQUREKTsKKyAgICAgICAgaWYgKGlwQWRkcmVzcykgeworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgY2hhciAqc2VydmVyX2lwID0gIlVOS05PV04iOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpcEFkZHJlc3NbaV07IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoKih1bnNpZ25lZCBsb25nICopaXBBZGRyZXNzW2ldID09IGlhLnNfYWRkcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIGlmIChpcEFkZHJlc3NbaSAtIDFdKSB7CisgICAgICAgICAgICAgICAgaWEuc19hZGRyID0gKih1bnNpZ25lZCBsb25nICopaXBBZGRyZXNzW2kgLSAxXTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJfaXAgPSBpbmV0X250b2EoaWEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnYgPSBzaG93X2hvc3RuYW1lX3dhcm5pbmcoaG9zdG5hbWUsIHNlcnZlcl9pcCkgPyAwIDogLTE7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpcEFkZHJlc3NbaV07IGkrKykKKyAgICAgICAgICAgICAgICBmcmVlKGlwQWRkcmVzc1tpXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydiA9IHNob3dfaG9zdG5hbWVfd2FybmluZyhob3N0bmFtZSwgIk5PIElQIElOIENFUlQiKSA/IDAgOiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ocnYpOworICAgIH0KKworICAgIC8qIGxvb2sgZm9yIGROU05hbWUocykgaW4gc3ViamVjdEFsdE5hbWUgaW4gdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlICovCisgICAgZE5TTmFtZSA9IHRsc19nZXRfU0FOX29ianMoc3NsLEdFTl9ETlMpOworICAgIGlmIChkTlNOYW1lKSB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgZE5TTmFtZVtpXTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWROU05hbWVfY21wKGhvc3RuYW1lLChjaGFyICopZE5TTmFtZVtpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcnYgPSBzaG93X2hvc3RuYW1lX3dhcm5pbmcoaG9zdG5hbWUsCisJCQkJICAgKGNoYXIgKikoKGROU05hbWVbaSAtIDFdID09IE5VTEwpID8gCisJCQkgICAgICAgICAgIChjaGFyICopIlVOS05PV04iIDogKGNoYXIgKilkTlNOYW1lW2kgLSAxXSkpCisJICAgICA/IDAgOiAtMTsKKyAgICAgICAgZm9yIChpID0gMDsgZE5TTmFtZVtpXTsgaSsrKQorICAgICAgICAgICAgZnJlZShkTlNOYW1lW2ldKTsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0gZWxzZSBpZiAoKGNvbW1vbk5hbWUgPSBzc2xfZ2V0X2NvbW1vbk5hbWUoc3NsKSkpIHsKKyAgICAgICAvKiBzbyB0aGUgc2VydmVyIGRpZG4ndCBoYXZlIGFueSBkTlNOYW1lJ3MsIGNoZWNrIHRoZSBjb21tb25OYW1lICovCisgICAgICAgaWYgKCFkTlNOYW1lX2NtcChob3N0bmFtZSwgY29tbW9uTmFtZSkpCisgICAgICAgICAgIHJldHVybiAwOworICAgICAgIGVsc2UKKyAgICAgICAgICAgcmV0dXJuIChzaG93X2hvc3RuYW1lX3dhcm5pbmcoaG9zdG5hbWUsIGNvbW1vbk5hbWUpID8gMCA6IC0xKTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisvKiBJcyAndXNlcicgYXV0aG9yaXplZCB0byBhY2Nlc3MgdGhlIHN5c3RlbSB3aXRob3V0IGEgbG9naW4gKi8KK2ludAordGxzX2lzX3VzZXJfdmFsaWQoU1NMICogc3NsLCBjb25zdCBjaGFyICp1c2VyKQoreworICAgIFg1MDkgKmNsaWVudF9jZXJ0OworICAgIGludCByID0gMDsKKworICAgIGlmICggIXNzbCB8fCAhdXNlciB8fCAhdXNlclswXSApCisgICAgICAgIHJldHVybigwKTsKKworICAgIGlmICghKGNsaWVudF9jZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbCkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIFVzZSB1c2VyIHN1cHBsaWVkIGZ1bmN0aW9uICovCisgICAgciA9IFg1MDlfdXNlcm9rKGNsaWVudF9jZXJ0LHVzZXIpOworCisgICAgWDUwOV9mcmVlKGNsaWVudF9jZXJ0KTsKKyAgICByZXR1cm4gcjsKK30KKworaW50Cit0bHNfaXNfYW5vbihpbnQgeCkKK3sKKyAgICBjaGFyIGJ1ZlsxMjhdOworICAgIFNTTF9DSVBIRVIgKiBjaXBoZXI7CisgICAgU1NMICogc3NsID0gTlVMTDsKKworICAgIHN3aXRjaCAoIHggKSB7CisjaWZuZGVmIE5PRlRQCisjaWZuZGVmIFNZU0ZUUAorICAgIGNhc2UgMTogICAgIC8qIGZ0cCBjb21tYW5kICovCisgICAgICAgIGlmICggc3NsX2Z0cF9hY3RpdmVfZmxhZyApCisgICAgICAgICAgICBzc2wgPSBzc2xfZnRwX2NvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6ICAgICAvKiBmdHAgZGF0YSAqLworICAgICAgICBpZiAoIHNzbF9mdHBfZGF0YV9hY3RpdmVfZmxhZyApCisgICAgICAgICAgICBzc2wgPSBzc2xfZnRwX2RhdGFfY29uOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFNZU0ZUUCAqLworI2VuZGlmIC8qIE5PRlRQICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHRsc19hY3RpdmVfZmxhZykKKyAgICAgICAgICAgIHNzbCA9IHRsc19jb247CisgICAgICAgIGVsc2UgaWYgKHNzbF9hY3RpdmVfZmxhZykKKyAgICAgICAgICAgIHNzbCA9IHNzbF9jb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICBjaXBoZXIgPSBTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKHNzbCk7CisgICAgaWYgKFNTTF9DSVBIRVJfZGVzY3JpcHRpb24oY2lwaGVyLGJ1ZixzaXplb2YoYnVmKSkpIHsKKyAgICAgICAgaWYgKGNraW5kZXgoIkF1PU5vbmUiLGJ1ZiwwLDAsMCkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybigxKTsgICAgICAgICAgICAgICAgICAvKiBhbm9ueW1vdXMgKi8KKyAgICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgIC8qIGtub3duICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogY291bGQgbm90IGdldCBjaXBoZXIgZGVzY3JpcHRpb24uICBBc3N1bWUgYW5vbnltb3VzICovCisgICAgICAgIHJldHVybigxKTsKKyAgICB9Cit9CisKK2ludAordGxzX2lzX2tyYjUoaW50IHgpCit7CisgICAgY2hhciBidWZbMTI4XTsKKyAgICBTU0xfQ0lQSEVSICogY2lwaGVyOworICAgIFNTTCAqIHNzbCA9IE5VTEw7CisKKyAgICBzd2l0Y2ggKCB4ICkgeworI2lmbmRlZiBOT0ZUUAorI2lmbmRlZiBTWVNGVFAKKyAgICBjYXNlIDE6ICAgICAvKiBmdHAgY29tbWFuZCAqLworICAgICAgICBpZiAoIHNzbF9mdHBfYWN0aXZlX2ZsYWcgKQorICAgICAgICAgICAgc3NsID0gc3NsX2Z0cF9jb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAgICAgLyogZnRwIGRhdGEgKi8KKyAgICAgICAgaWYgKCBzc2xfZnRwX2RhdGFfYWN0aXZlX2ZsYWcgKQorICAgICAgICAgICAgc3NsID0gc3NsX2Z0cF9kYXRhX2NvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBTWVNGVFAgKi8KKyNlbmRpZiAvKiBOT0ZUUCAqLworI2lmbmRlZiBOT0hUVFAKKyAgICBjYXNlIDM6CisgICAgICAgIGlmICggdGxzX2h0dHBfYWN0aXZlX2ZsYWcgKQorICAgICAgICAgICAgc3NsID0gdGxzX2h0dHBfY29uOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT0hUVFAgKi8KKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAodGxzX2FjdGl2ZV9mbGFnKQorICAgICAgICAgICAgc3NsID0gdGxzX2NvbjsKKyAgICAgICAgZWxzZSBpZiAoc3NsX2FjdGl2ZV9mbGFnKQorICAgICAgICAgICAgc3NsID0gc3NsX2NvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIGNpcGhlciA9IFNTTF9nZXRfY3VycmVudF9jaXBoZXIoc3NsKTsKKyAgICBpZiAoY2lwaGVyICYmIFNTTF9DSVBIRVJfZGVzY3JpcHRpb24oY2lwaGVyLGJ1ZixzaXplb2YoYnVmKSkpIHsKKyAgICAgICAgaWYgKGNraW5kZXgoIkF1PUtSQjUiLGJ1ZiwwLDAsMCkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybigxKTsgICAgICAgICAgICAgICAgICAvKiBrcmI1ICovCisgICAgfQorICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCAqLworfQorCitpbnQKK3NzbF9nZXRfY2xpZW50X2ZpbmlzaGVkKGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworI2lmZGVmIE5PX0dFVF9GSU5JU0hFRAorICAgIHJldHVybigwKTsKKyNlbHNlCisgICAgaWYgKHNzdGVsbmV0IHx8IHRjcF9pbmNvbWluZykgeworICAgICAgICByZXR1cm4oU1NMX2dldF9wZWVyX2ZpbmlzaGVkKHNzbF9hY3RpdmVfZmxhZz9zc2xfY29uOnRsc19jb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zixjb3VudCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybihTU0xfZ2V0X2ZpbmlzaGVkKHNzbF9hY3RpdmVfZmxhZz9zc2xfY29uOnRsc19jb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zixjb3VudCkpOworICAgIH0KKyNlbmRpZiAvKiBOT19HRVRfRklOSVNIRUQgKi8KK30KKworaW50Citzc2xfZ2V0X3NlcnZlcl9maW5pc2hlZChjaGFyICpidWYsIGludCBjb3VudCkKK3sKKyNpZmRlZiBOT19HRVRfRklOSVNIRUQKKyAgICByZXR1cm4oMCk7CisjZWxzZQorICAgIGlmIChzc3RlbG5ldCB8fCB0Y3BfaW5jb21pbmcpIHsKKyAgICAgICAgcmV0dXJuKFNTTF9nZXRfZmluaXNoZWQoc3NsX2FjdGl2ZV9mbGFnP3NzbF9jb246dGxzX2NvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLGNvdW50KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuKFNTTF9nZXRfcGVlcl9maW5pc2hlZChzc2xfYWN0aXZlX2ZsYWc/c3NsX2Nvbjp0bHNfY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsY291bnQpKTsKKyAgICB9CisjZW5kaWYgLyogTk9fR0VUX0ZJTklTSEVEICovCit9CisKKworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCitpbnQKKyNpZmRlZiBDS19BTlNJQworc3NsX3JlcGx5KGludCBob3csIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBjbnQpCisjZWxzZQorc3NsX3JlcGx5KGhvdyxkYXRhLGNudCkgaW50IGhvdzsgdW5zaWduZWQgY2hhciAqZGF0YTsgaW50IGNudDsKKyNlbmRpZgoreworICAgIGNoYXIgKiBzdHI9TlVMTDsKKworICAgIGRhdGEgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIHN0YXR1cyBieXRlICovCisgICAgY250ICAtPSA0OworCisgICAgaWYoY250LS0gPCAxKSB7CisgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworICAgIH0KKworICAgIHN3aXRjaCgqZGF0YSsrKSB7CisgICAgY2FzZSBTU0xfQUNDRVBUOgorICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgIHRuX2RlYnVnKCJbU1NMIC0gaGFuZHNoYWtlIHN0YXJ0aW5nXSIpOworICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICBwcmludGYoIltTU0wgLSBoYW5kc2hha2Ugc3RhcnRpbmddXHJcbiIpOworICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfcmVwbHkiLCJbU1NMIC0gaGFuZHNoYWtlIHN0YXJ0aW5nXSIsMCk7CisKKyAgICAgICAgLyogcmlnaHQgLi4uIG5vdyB3ZSBkcm9wIGludG8gdGhlIFNTTCBsaWJyYXJ5ICovCisgICAgICAgIGlmICghc3NsX29ubHlfZmxhZykgeworICAgICAgICAgICAgaWYgKHNzbF9kdW1teV9mbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgICAgIHRuX2RlYnVnKCJbU1NMIC0gRHVtbXkgQ29ubmVjdGVkXSIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIltTU0wgLSBEdW1teSBDb25uZWN0ZWRdXHJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfcmVwbHkiLCJbU1NMIC0gRHVtbXkgQ29ubmVjdGVkXSIsMCk7CisgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1VOS05PV04pOworICAgICAgICAgICAgICAgIGFjY2VwdF9jb21wbGV0ZSA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVVEhfU1VDQ0VTUzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFNTTF9jb25uZWN0KHNzbF9jb24pIDw9IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgICAgICAgICAgICAgIHRuX2RlYnVnKCJbU1NMIC0gRkFJTEVEXSIpOworICAgICAgICAgICAgICAgICAgICBFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworICAgICAgICAgICAgICAgICAgICBsZW4gPSBCSU9fcmVhZChiaW9fZXJyLHNzbF9lcnIsU1NMX0VSUl9CRlNaKTsKKyAgICAgICAgICAgICAgICAgICAgc3NsX2VycltsZW4gPCBTU0xfRVJSX0JGU1ogPyBsZW4gOiBTU0xfRVJSX0JGU1pdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKHNzbF9lcnIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHNzbF92ZXJib3NlX2ZsYWcgKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiW1NTTCAtIEZBSUxFRF1cclxuIik7CisgICAgICAgICAgICAgICAgICAgIEVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IEJJT19yZWFkKGJpb19lcnIsc3NsX2VycixTU0xfRVJSX0JGU1opOworICAgICAgICAgICAgICAgICAgICBzc2xfZXJyW2xlbiA8IFNTTF9FUlJfQkZTWiA/IGxlbiA6IFNTTF9FUlJfQkZTWl0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgICBwcmludGYoc3NsX2Vycik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF9yZXBseSIsIltTU0wgLSBGQUlMRURdIiwwKTsKKyAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgICAgICB0dGNsb3MoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgICAgIHRuX2RlYnVnKCJbU1NMIC0gT0tdIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNzbF92ZXJib3NlX2ZsYWcgKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiW1NTTCAtIE9LXVxyXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX3JlcGx5IiwiW1NTTCAtIE9LXSIsMCk7CisKKyAgICAgICAgICAgICAgICBzc2xfYWN0aXZlX2ZsYWcgPSAxOworICAgICAgICAgICAgICAgIHNzbF9kaXNwbGF5X2Nvbm5lY3RfZGV0YWlscyhzc2xfY29uLDAsc3NsX3ZlcmJvc2VfZmxhZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1VOS05PV04pOworICAgICAgICBhY2NlcHRfY29tcGxldGUgPSAxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU1NMX1JFSkVDVDoKKyAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgICAgIHRuX2RlYnVnKAorICAgICAgICAgICAgICAgICAiW1NTTCAtIGZhaWxlZCB0byBzd2l0Y2ggb24gU1NMIC0gdHJ5aW5nIHBsYWludGV4dCBsb2dpbl0iKTsKKyAgICAgICAgfSBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApIHsKKyAgICAgICAgICAgIHByaW50ZigiW1NTTCAtIGZhaWxlZCB0byBzd2l0Y2ggb24gU1NMXVxyXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiVHJ5aW5nIHBsYWludGV4dCBsb2dpbjpcclxuIik7CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjExMCwic3NsX3JlcGx5IiwiW1NTTCAtIGZhaWxlZCB0byBzd2l0Y2ggb24gU1NMXSIsMCk7CisgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyAgICB9CisgICAgcmV0dXJuIEFVVEhfU1VDQ0VTUzsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3NzbF9pcyh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgY250KQorI2Vsc2UKK3NzbF9pcyhkYXRhLGNudCkgdW5zaWduZWQgY2hhciAqZGF0YTsgaW50IGNudDsKKyNlbmRpZgoreworICAgIGlmICgoY250IC09IDQpIDwgMSkKKyAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKworICAgIGRhdGEgKz0gNDsKKyAgICBzd2l0Y2goKmRhdGErKykgeworICAgIGNhc2UgU1NMX1NUQVJUOgorICAgICAgICAvKiBzZXJ2ZXIgc3RhcnRzIHRoZSBTU0wgc3R1ZmYgbm93IC4uLiAqLworICAgICAgICBpZiAoIXNzbF9vbmx5X2ZsYWcpIHsKKyAgICAgICAgICAgIGlmICggIXRsc19sb2FkX2NlcnRzKHNzbF9jdHgsc3NsX2NvbiwxKSApIHsKKyAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1NTTCAtIGhhbmRzaGFrZSBzdGFydGluZ10iKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkKKyAgICAgICAgICAgICAgICBwcmludGYoIltTU0wgLSBoYW5kc2hha2Ugc3RhcnRpbmddXHJcbiIpOworICAgICAgICAgICAgZGVidWcoRjExMCwic3NsX2lzIiwiW1NTTCAtIGhhbmRzaGFrZSBzdGFydGluZ10iLDApOworCisgICAgICAgICAgICBTZW5kU1NMQXV0aFNCKFNTTF9BQ0NFUFQsICh2b2lkICopMCwgMCk7CisKKyAgICAgICAgICAgIGF1dGhfc3NsX3ZhbGlkID0gMTsKKworICAgICAgICAgICAgaWYgKHNzbF9kdW1teV9mbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgICAgIHRuX2RlYnVnKCJbU1NMIC0gRHVtbXkgQ29ubmVjdGVkXSIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIltTU0wgLSBEdW1teSBDb25uZWN0ZWRdXHJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfaXMiLCJbU1NMIC0gRHVtbXkgQ29ubmVjdGVkXSIsMCk7CisgICAgICAgICAgICAgICAgYWNjZXB0X2NvbXBsZXRlID0gMTsKKyAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVVEhfU1VDQ0VTUzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFNTTF9hY2NlcHQoc3NsX2NvbikgPD0gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgZXJyYnVmWzEwMjRdOworCisgICAgICAgICAgICAgICAgc3ByaW50ZihlcnJidWYsIltTU0wgLSBTU0xfYWNjZXB0IGVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX2Vycm9yX3N0cmluZyhFUlJfZ2V0X2Vycm9yKCksTlVMTCkpOworCisgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgICAgIHRuX2RlYnVnKGVycmJ1Zik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNzbF9kZWJ1Z19mbGFnICkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlc1xyXG4iLGVycmJ1Zik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNzbF92ZXJib3NlX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIltTU0wgLSBTU0xfYWNjZXB0IGVycm9yXVxyXG4iKTsKKworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF9pcyIsZXJyYnVmLDApOworCisgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICAgICAgdHRjbG9zKDApOworICAgICAgICAgICAgICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgICAgIHRuX2RlYnVnKCJbU1NMIC0gT0tdIik7CisgICAgICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIltTU0wgLSBPS11cclxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfaXMiLCJbU1NMIC0gT0tdIiwwKTsKKyAgICAgICAgICAgIHNzbF9hY3RpdmVfZmxhZyA9IDE7CisgICAgICAgICAgICBzc2xfZGlzcGxheV9jb25uZWN0X2RldGFpbHMoc3NsX2NvbiwxLHNzbF92ZXJib3NlX2ZsYWcpOworCisgICAgICAgICAgICAvKiBub3cgY2hlY2sgdG8gc2VlIHRoYXQgd2UgZ290IGV4YWN0bHkgd2hhdCB3ZQorICAgICAgICAgICAgKiB3YW50ZWQgZnJvbSB0aGUgY2FsbGVyIC4uLiBpZiBhIGNlcnRpZmljYXRlIGlzCisgICAgICAgICAgICAqIHJlcXVpcmVkIHRoZW4gd2UgbWFrZSAxMDAlIHN1cmUgdGhhdCB3ZSB3ZXJlCisgICAgICAgICAgICAqIGdpdmVuIG9uZSBkdXJpbmcgdGhlIGhhbmRzaGFrZSAoYXMgaXQgaXMgYW4gb3B0aW9uYWwKKyAgICAgICAgICAgICogcGFydCBvZiBTU0wpCisgICAgICAgICAgICAqLworCisjaWZkZWYgU1NMX0tSQjUKKyAgICAgICAgICAgIGlmICggdGxzX2lzX2tyYjUoMCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKHNzbF9jb24tPmtzc2xfY3R4LT5jbGllbnRfcHJpbmMpCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF9pcyBLUkI1Iixzc2xfY29uLT5rc3NsX2N0eC0+Y2xpZW50X3ByaW5jLDApOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogU1NMX0tSQjUgKi8KKyAgICAgICAgICAgIGlmIChzc2xfdmVyaWZ5X2ZsYWcgJiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKSB7CisgICAgICAgICAgICAgICAgWDUwOSAqIHBlZXIgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsX2Nvbik7CisgICAgICAgICAgICAgICAgaWYgKHBlZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRuX2RlYnVnKCJbU1NMIC0gcGVlciBjaGVjayBmYWlsZWRdIik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJbU1NMIC0gcGVlciBjaGVjayBmYWlsZWRdXHJcbiIpOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfaXMiLCJbU1NMIC0gcGVlciBjaGVjayBmYWlsZWRdIiwwKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBMT0dHSU5HIFJFUVVJUkVEIEhFUkUhICovCisgICAgICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9VTktOT1dOKTsKKyAgICAgICAgICAgIGFjY2VwdF9jb21wbGV0ZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBTZW5kU1NMQXV0aFNCKFNTTF9SRUpFQ1QsICh2b2lkICopICJVbmtub3duIG9wdGlvbiByZWNlaXZlZCIsIC0xKTsKKyAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICB0bl9kZWJ1ZygiW1NTTCAtIFVua25vd24gb3B0aW9uIHJlY2VpdmVkXSIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoIlVua25vd24gU1NMIG9wdGlvbiAlZFxyXG4iLCBkYXRhWy0xXSk7CisgICAgICAgIGRlYnVnKEYxMTEsInNzbF9pcyIsIltTU0wgLSBVbmtub3duIG9wdGlvbiByZWNlaXZlZF0iLGRhdGFbLTFdKTsKKyAgICAgICAgYXV0aF9zc2xfdmFsaWQgPSAwOworICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgfQorICAgIHJldHVybiBBVVRIX1NVQ0NFU1M7Cit9CisKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworCitpbnQKK2NrX3RuX3Rsc19uZWdvdGlhdGUoVk9JRCkKK3sKKyAgICBYNTA5ICogcGVlciA9IE5VTEw7CisgICAgY2hhciBzdHJbMjU2XSwgKnVpZD1OVUxMOworICAgIGV4dGVybiBpbnQgc3N0ZWxuZXQ7CisKKyAgICBpZiAoICFja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkgKQorICAgICAgICByZXR1cm4oLTEpOworCisgICAgaWYgKHNzdGVsbmV0KSB7CisgICAgICAgIC8qIHNlcnZlciBzdGFydHMgdGhlIFRMUyBzdHVmZiBub3cgLi4uICovCisgICAgICAgIGlmICghdGxzX29ubHlfZmxhZykgeworICAgICAgICAgICAgaWYgKCAhdGxzX2xvYWRfY2VydHModGxzX2N0eCx0bHNfY29uLDEpICkgeworICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgdG5fZGVidWcoIltUTFMgLSBoYW5kc2hha2Ugc3RhcnRpbmddIik7CisgICAgICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICAgICAgcHJpbnRmKCJbVExTIC0gaGFuZHNoYWtlIHN0YXJ0aW5nXVxyXG4iKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX3RuX3Rsc19uZWdvdGlhdGUiLCJbVExTIC0gaGFuZHNoYWtlIHN0YXJ0aW5nXSIsMCk7CisKKyAgICAgICAgICAgIGlmIChzc2xfZHVtbXlfZmxhZykgeworICAgICAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1RMUyAtIER1bW15IENvbm5lY3RlZF0iKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJbVExTIC0gRHVtbXkgQ29ubmVjdGVkXVxyXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfdG5fdGxzX25lZ290aWF0ZSIsIltUTFMgLSBEdW1teSBDb25uZWN0ZWRdIiwwKTsKKyAgICAgICAgICAgICAgICBhY2NlcHRfY29tcGxldGUgPSAxOworICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoU1NMX2FjY2VwdCh0bHNfY29uKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciBlcnJidWZbMTAyNF07CisKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGVycmJ1ZiwiW1RMUyAtIFNTTF9hY2NlcHQgZXJyb3I6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfZXJyb3Jfc3RyaW5nKEVSUl9nZXRfZXJyb3IoKSxOVUxMKSk7CisKKyAgICAgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICAgICAgdG5fZGVidWcoZXJyYnVmKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzXHJcbiIsZXJyYnVmKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiW1RMUyAtIFNTTF9hY2NlcHQgZXJyb3JdXHJcbiIpOworCisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfdG5fdGxzX25lZ290aWF0ZSIsZXJyYnVmLDApOworICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgdG5fZGVidWcoIltUTFMgLSBPS10iKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkgeworICAgICAgICAgICAgICAgIHByaW50ZigiW1RMUyAtIE9LXVxyXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfdG5fdGxzX25lZ290aWF0ZSIsIltUTFMgLSBPS10iLDApOworICAgICAgICAgICAgdGxzX2FjdGl2ZV9mbGFnID0gMTsKKyAgICAgICAgICAgIHNzbF9kaXNwbGF5X2Nvbm5lY3RfZGV0YWlscyh0bHNfY29uLDEsc3NsX3ZlcmJvc2VfZmxhZyk7CisKKworI2lmZGVmIFNTTF9LUkI1CisgICAgICAgICAgICBpZiAoIHRsc19pc19rcmI1KDApICkgeworICAgICAgICAgICAgICAgIGlmICh0bHNfY29uLT5rc3NsX2N0eC0+Y2xpZW50X3ByaW5jKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnA7CisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShzelVzZXJOYW1lQXV0aGVudGljYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bHNfY29uLT5rc3NsX2N0eC0+Y2xpZW50X3ByaW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJREJVRkxFTik7CisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShzelVzZXJOYW1lUmVxdWVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsc19jb24tPmtzc2xfY3R4LT5jbGllbnRfcHJpbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlEQlVGTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggcCA9IHN6VXNlck5hbWVSZXF1ZXN0ZWQ7ICpwIDsgcCsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqcCA9PSAnQCcgfHwgKnAgPT0gJy8nICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN6VXNlck5hbWVSZXF1ZXN0ZWRbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgICBzelVzZXJOYW1lQXV0aGVudGljYXRlZFswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgICAgICAgaWYgKHp2dXNlcihzelVzZXJOYW1lUmVxdWVzdGVkKSkKKyAgICAgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1ZBTElEKTsKKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1VTRVIpOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogU1NMX0tSQjUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5vdyBjaGVjayB0byBzZWUgdGhhdCB3ZSBnb3QgZXhhY3RseSB3aGF0IHdlCisgICAgICAgICAgICAqIHdhbnRlZCBmcm9tIHRoZSBjYWxsZXIgLi4uIGlmIGEgY2VydGlmaWNhdGUgaXMKKyAgICAgICAgICAgICogcmVxdWlyZWQgdGhlbiB3ZSBtYWtlIDEwMCUgc3VyZSB0aGF0IHdlIHdlcmUKKyAgICAgICAgICAgICogZ2l2ZW4gb25lIGR1cmluZyB0aGUgaGFuZHNoYWtlIChhcyBpdCBpcyBhbiBvcHRpb25hbAorICAgICAgICAgICAgKiBwYXJ0IG9mIFRMUykKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBwZWVyPVNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZSh0bHNfY29uKTsKKyAgICAgICAgICAgIGlmIChwZWVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoKSA9PSBOVUxMIiwiIiwwKTsKKyAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgICAgICBpZiAoc3NsX3ZlcmlmeV9mbGFnICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRuX2RlYnVnKCJbVExTIC0gcGVlciBjaGVjayBmYWlsZWRdIik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNzbF9kZWJ1Z19mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIltUTFMgLSBwZWVyIGNoZWNrIGZhaWxlZF1cclxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJja190bl90bHNfbmVnb3RpYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJbVExTIC0gcGVlciBjaGVjayBmYWlsZWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIC8qIExPR0dJTkcgUkVRVUlSRUQgSEVSRSEgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKCkgIT0gTlVMTCIsIiIsMCk7CisgICAgICAgICAgICAgICAgWDUwOV9OQU1FX2dldF90ZXh0X2J5X05JRChYNTA5X2dldF9zdWJqZWN0X25hbWUocGVlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklEX2NvbW1vbk5hbWUsc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJbVExTIC0gY29tbW9uTmFtZT0lc11cclxuIixzdHIpOworCisgICAgICAgICAgICAgICAgWDUwOV9OQU1FX2dldF90ZXh0X2J5X05JRChYNTA5X2dldF9zdWJqZWN0X25hbWUocGVlciksCisjaWZuZGVmIE5JRF94NTAwVW5pcXVlSWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JRF91bmlxdWVJZGVudGlmaWVyLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSURfeDUwMFVuaXF1ZUlkZW50aWZpZXIsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBpZiAoIHNzbF92ZXJib3NlX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIltUTFMgLSB1bmlxdWVJZGVudGlmaWVyPSVzXVxyXG4iLHN0cik7CisKKyAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZGV0ZXJtaW5lIHVzZXIgbmFtZSAqLworICAgICAgICAgICAgICAgIHVpZCA9IHRsc191c2VyaWRfZnJvbV9jbGllbnRfY2VydCh0bHNfY29uKTsKKyAgICAgICAgICAgICAgICBpZiAoIHVpZCApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBjb2RlIGlzIHZlcnkgcXVlc3Rpb25hYmxlLgorICAgICAgICAgICAgICAgICAgICAgKiBIb3cgc2hvdWxkIGl0IGJlaGF2ZT8KKyAgICAgICAgICAgICAgICAgICAgICogVGhlIGNsaWVudCBoYXMgcHJlc2VudGVkIGEgY2VydGlmaWNhdGUgdGhhdAorICAgICAgICAgICAgICAgICAgICAgKiBjb250YWlucyBhIHVzZXJuYW1lLiAgV2UgaGF2ZSB2YWxpZGF0ZWQgdGhlCisgICAgICAgICAgICAgICAgICAgICAqIGNlcnRpZmljYXRlIGJ1dCB3ZSBkbyBub3QgYXV0b21hdGljYWxseQorICAgICAgICAgICAgICAgICAgICAgKiBsb2cgdGhlIHVzZXIgaW4gdW5sZXNzIHRoZXJlIGlzIGEgLnRsc2xvZ2luCisgICAgICAgICAgICAgICAgICAgICAqIGZpbGUuCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShzelVzZXJOYW1lUmVxdWVzdGVkLHVpZCxVSURCVUZMRU4pOworI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgICAgICAgICAgIGlmICh6dnVzZXIodWlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9WQUxJRCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1VTRVIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3pVc2VyTmFtZVJlcXVlc3RlZFswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgKiBzdHI9TlVMTDsKKworICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgIHRuX2RlYnVnKCJbVExTIC0gaGFuZHNoYWtlIHN0YXJ0aW5nXSIpOworICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICBwcmludGYoIltUTFMgLSBoYW5kc2hha2Ugc3RhcnRpbmddXHJcbiIpOworICAgICAgICBkZWJ1ZyhGMTEwLCJja190bl90bHNfbmVnb3RpYXRlIiwiW1RMUyAtIGhhbmRzaGFrZSBzdGFydGluZ10iLDApOworCisgICAgICAgIC8qIHJpZ2h0IC4uLiBub3cgd2UgZHJvcCBpbnRvIHRoZSBTU0wgbGlicmFyeSAqLworICAgICAgICBpZiAoIXRsc19vbmx5X2ZsYWcpIHsKKyAgICAgICAgICAgIGNoYXIgKnN1YmplY3Q9TlVMTCwgKmlzc3Vlcj1OVUxMLCAqY29tbW9uTmFtZT1OVUxMLCAqZE5TTmFtZT1OVUxMOworCisgICAgICAgICAgICBpZiAoc3NsX2R1bW15X2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICAgICAgdG5fZGVidWcoIltUTFMgLSBEdW1teSBDb25uZWN0ZWRdIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNzbF92ZXJib3NlX2ZsYWcgKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiW1RMUyAtIER1bW15IENvbm5lY3RlZF1cclxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX3RuX3Rsc19uZWdvdGlhdGUiLCJbVExTIC0gRHVtbXkgQ29ubmVjdGVkXSIsMCk7CisgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICAgICAgYWNjZXB0X2NvbXBsZXRlID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworI2lmbmRlZiBVU0VfQ0VSVF9DQgorICAgICAgICAgICAgaWYgKCF0bHNfbG9hZF9jZXJ0cyh0bHNfY3R4LHRsc19jb24sMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBVU0VfQ0VSVF9DQiAqLworICAgICAgICAgICAgaWYgKFNTTF9jb25uZWN0KHRsc19jb24pIDw9IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgICAgICAgICAgICAgIHRuX2RlYnVnKCJbVExTIC0gRkFJTEVEXSIpOworICAgICAgICAgICAgICAgICAgICBFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworICAgICAgICAgICAgICAgICAgICBsZW4gPSBCSU9fcmVhZChiaW9fZXJyLHNzbF9lcnIsU1NMX0VSUl9CRlNaKTsKKyAgICAgICAgICAgICAgICAgICAgc3NsX2VycltsZW4gPCBTU0xfRVJSX0JGU1ogPyBsZW4gOiBTU0xfRVJSX0JGU1pdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKHNzbF9lcnIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHNzbF92ZXJib3NlX2ZsYWcgKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiW1RMUyAtIEZBSUxFRF1cclxuIik7CisgICAgICAgICAgICAgICAgICAgIEVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IEJJT19yZWFkKGJpb19lcnIsc3NsX2VycixTU0xfRVJSX0JGU1opOworICAgICAgICAgICAgICAgICAgICBzc2xfZXJyW2xlbiA8IFNTTF9FUlJfQkZTWiA/IGxlbiA6IFNTTF9FUlJfQkZTWl0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgICBwcmludGYoc3NsX2Vycik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX3RuX3Rsc19uZWdvdGlhdGUiLCJbVExTIC0gRkFJTEVEXSIsMCk7CisgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0bHNfYWN0aXZlX2ZsYWcgPSAxOworICAgICAgICAgICAgaWYgKCAhc3NsX2NlcnRzb2tfZmxhZyAmJiAoc3NsX3ZlcmlmeV9mbGFnICYgU1NMX1ZFUklGWV9QRUVSKQorICAgICAgICAgICAgICAgICAmJiAhdGxzX2lzX2tyYjUoMCkpIHsKKyAgICAgICAgICAgICAgICBjaGFyIHBybXB0WzEwMjRdOworICAgICAgICAgICAgICAgIHN1YmplY3QgPSBzc2xfZ2V0X3N1YmplY3RfbmFtZSh0bHNfY29uKTsKKworICAgICAgICAgICAgICAgIGlmICghc3ViamVjdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3NsX3ZlcmlmeV9mbGFnICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5fZGVidWcoIltUTFMgLSBGQUlMRURdIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJbVExTIC0gRkFJTEVEXVxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX3RuX3Rsc19uZWdvdGlhdGUiLCJbVExTIC0gRkFJTEVEXSIsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvazsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gdXFfb2soIldhcm5pbmc6IFNlcnZlciBkaWRuJ3QgcHJvdmlkZSBhIGNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRpbnVlPyAoWS9OKSIsIDMsIE5VTEwsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1RMUyAtIEZBSUxFRF0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiW1RMUyAtIEZBSUxFRF1cclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNrX3RuX3Rsc19uZWdvdGlhdGUiLCJbVExTIC0gRkFJTEVEXSIsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzc2xfY2hlY2tfc2VydmVyX25hbWUodGxzX2Nvbiwgc3pIb3N0TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1RMUyAtIEZBSUxFRF0iKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNzbF92ZXJib3NlX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJbVExTIC0gRkFJTEVEXVxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJja190bl90bHNfbmVnb3RpYXRlIiwiW1RMUyAtIEZBSUxFRF0iLDApOworICAgICAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzc2xfZGVidWdfZmxhZyAmJiBzc2xfZmluaXNoZWRfbWVzc2FnZXMpIHsKKyAgICAgICAgICAgICAgICBjaGFyIG1zZ1szMl07CisgICAgICAgICAgICAgICAgaW50IGksIGxlbj0zMjsKKyAgICAgICAgICAgICAgICBleHRlcm4gY2hhciB0bl9tc2dbXSwgaGV4YnVmW107CisKKyAgICAgICAgICAgICAgICB0bl9tc2dbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgIGxlbiA9IHNzbF9nZXRfY2xpZW50X2ZpbmlzaGVkKG1zZyxsZW4pOworICAgICAgICAgICAgICAgIGlmICggbGVuID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggaT0wO2k8bGVuO2krKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoaGV4YnVmLCIlMDJYICIsbXNnW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csaGV4YnVmLFROX01TR19MRU4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiVExTIGNsaWVudCBmaW5pc2hlZDogJXNcclxuIix0bl9tc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0bl9tc2dbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgIGxlbiA9IHNzbF9nZXRfc2VydmVyX2ZpbmlzaGVkKG1zZyxsZW4pOworICAgICAgICAgICAgICAgIGlmICggbGVuID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggaT0wO2k8bGVuO2krKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoaGV4YnVmLCIlMDJYICIsbXNnW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csaGV4YnVmLFROX01TR19MRU4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiVExTIHNlcnZlciBmaW5pc2hlZDogJXNcclxuIix0bl9tc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgdG5fZGVidWcoIltUTFMgLSBPS10iKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkKKyAgICAgICAgICAgICAgICBwcmludGYoIltUTFMgLSBPS11cclxuIik7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJja190bl90bHNfbmVnb3RpYXRlIiwiW1RMUyAtIE9LXSIsMCk7CisKKyAgICAgICAgICAgIHNzbF9kaXNwbGF5X2Nvbm5lY3RfZGV0YWlscyh0bHNfY29uLDAsc3NsX3ZlcmJvc2VfZmxhZyk7CisgICAgICAgIH0KKyAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgfQorICAgIGFjY2VwdF9jb21wbGV0ZSA9IDE7CisgICAgYXV0aF9zc2xfdmFsaWQgPSAxOworICAgIHJldHVybigwKTsKK30KKworaW50Citja19zc2xfaW5jb21pbmcoZmQpIGludCBmZDsKK3sKKyAgICAvKiBpZiB3ZSBhcmUgbm90IHJ1bm5pbmcgaW4gZGVidWcgdGhlbiBhbnkgZXJyb3IKKyAgICAqIHN0dWZmIGZyb20gU1NMIGRlYnVnICptdXN0KiBub3QgZ28gZG93bgorICAgICogdGhlIHNvY2tldCAod2hpY2ggMCwxLDIgYXJlIGFsbCBwb2ludGluZyB0byBieQorICAgICogZGVmYXVsdCkKKyAgICAqLworCisgICAgaW50IHRpbW8gPSAyMDAwOworCisgICAgaWYgKCAhY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIC8qIGRvIHRoZSBTU0wgc3R1ZmYgbm93IC4uLiBiZWZvcmUgd2UgcGxheSB3aXRoIHB0eSdzICovCisgICAgU1NMX3NldF9mZChzc2xfY29uLGZkKTsKKyAgICBTU0xfc2V0X2ZkKHRsc19jb24sZmQpOworCisgICAgaWYgKHRsc19vbmx5X2ZsYWcpIHsKKyAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICB0bl9kZWJ1ZygiW1RMUyAtIGhhbmRzaGFrZSBzdGFydGluZ10iKTsKKyAgICAgICAgZWxzZSBpZiAoIHNzbF92ZXJib3NlX2ZsYWcgKQorICAgICAgICAgICAgcHJpbnRmKCJbVExTIC0gaGFuZHNoYWtlIHN0YXJ0aW5nXVxyXG4iKTsKKyAgICAgICAgZGVidWcoRjExMCwiY2tfc3NsX2luY29taW5nIiwiW1RMUyAtIGhhbmRzaGFrZSBzdGFydGluZ10iLDApOworCisgICAgICAgIC8qIGhtbSAuLi4gb25seSB3aGVuIHJ1bm5pbmcgdGFsa2luZyB0byB0aGluZ3MgbGlrZQorICAgICAgICAqIGh0dHBzIHNlcnZlcnMgc2hvdWxkIHdlIGhpdCB0aGlzIGNvZGUgYW5kIHRoZW4KKyAgICAgICAgKiB3ZSByZWFsbHkgZG9uJ3QgY2FyZSAqd2hvKiB3ZSB0YWxrIHRvIDotKQorICAgICAgICAqLworICAgICAgICBpZiAoU1NMX2FjY2VwdCh0bHNfY29uKSA8PSAwKSB7CisgICAgICAgICAgICBjaGFyIGVycmJ1ZlsxMDI0XTsKKworICAgICAgICAgICAgc3ByaW50ZihlcnJidWYsIltUTFMgLSBTU0xfYWNjZXB0IGVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICBFUlJfZXJyb3Jfc3RyaW5nKEVSUl9nZXRfZXJyb3IoKSxOVUxMKSk7CisKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgICAgIHRuX2RlYnVnKGVycmJ1Zik7CisgICAgICAgICAgICBlbHNlIGlmICggc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgIHByaW50ZigiJXNcclxuIixlcnJidWYpOworICAgICAgICAgICAgZWxzZSBpZiAoIHNzbF92ZXJib3NlX2ZsYWcgKQorICAgICAgICAgICAgICAgIHByaW50ZigiW1RMUyAtIFNTTF9hY2NlcHQgZXJyb3JdXHJcbiIpOworCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJja19zc2xfaW5jb21pbmciLGVycmJ1ZiwwKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1RMUyAtIE9LXSIpOworICAgICAgICAgICAgZWxzZSBpZiAoIHNzbF92ZXJib3NlX2ZsYWcgKQorICAgICAgICAgICAgICAgIHByaW50ZigiW1RMUyAtIE9LXVxyXG4iKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX3NzbF9pbmNvbWluZyIsIltUTFMgLSBPS10iLDApOworICAgICAgICAgICAgdGxzX2FjdGl2ZV9mbGFnID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3NsX29ubHlfZmxhZykgeworICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgIHRuX2RlYnVnKCJbU1NMIC0gaGFuZHNoYWtlIHN0YXJ0aW5nXSIpOworICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICBwcmludGYoIltTU0wgLSBoYW5kc2hha2Ugc3RhcnRpbmddXHJcbiIpOworICAgICAgICBkZWJ1ZyhGMTEwLCJja19zc2xfaW5jb21pbmciLCJbU1NMIC0gaGFuZHNoYWtlIHN0YXJ0aW5nXSIsMCk7CisKKyAgICAgICAgLyogaG1tIC4uLiBvbmx5IHdoZW4gcnVubmluZyB0YWxraW5nIHRvIHRoaW5ncyBsaWtlCisgICAgICAgICAqIGh0dHBzIHNlcnZlcnMgc2hvdWxkIHdlIGhpdCB0aGlzIGNvZGUgYW5kIHRoZW4KKyAgICAgICAgICogd2UgcmVhbGx5IGRvbid0IGNhcmUgKndobyogd2UgdGFsayB0byA6LSkKKyAgICAgICAgICovCisgICAgICAgIGlmIChTU0xfYWNjZXB0KHNzbF9jb24pIDw9IDApIHsKKyAgICAgICAgICAgIGNoYXIgZXJyYnVmWzEwMjRdOworCisgICAgICAgICAgICBzcHJpbnRmKGVycmJ1ZiwiW1NTTCAtIFNTTF9hY2NlcHQgZXJyb3I6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIEVSUl9lcnJvcl9zdHJpbmcoRVJSX2dldF9lcnJvcigpLE5VTEwpKTsKKworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgdG5fZGVidWcoZXJyYnVmKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBzc2xfZGVidWdfZmxhZyApCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlc1xyXG4iLGVycmJ1Zik7CisgICAgICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICAgICAgcHJpbnRmKCJbU1NMIC0gU1NMX2FjY2VwdCBlcnJvcl1cclxuIik7CisKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX3NzbF9pbmNvbWluZyIsZXJyYnVmLDApOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgICAgIHRuX2RlYnVnKCJbU1NMIC0gT0tdIik7CisgICAgICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICBwcmludGYoIltTU0wgLSBPS11cclxuIik7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfaXMiLCJbU1NMIC0gT0tdIiwwKTsKKyAgICAgICAgICAgIHNzbF9hY3RpdmVfZmxhZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNzbF9hY3RpdmVfZmxhZyB8fCB0bHNfYWN0aXZlX2ZsYWcpIHsKKyAgICAgICAgWDUwOSAqcGVlcjsKKyAgICAgICAgY2hhciBzdHJbMjU2XSwgKnVpZD1OVUxMOworCisgICAgICAgIC8qIG5vdyBjaGVjayB0byBzZWUgdGhhdCB3ZSBnb3QgZXhhY3RseSB3aGF0IHdlCisgICAgICAgICAqIHdhbnRlZCBmcm9tIHRoZSBjYWxsZXIgLi4uIGlmIGEgY2VydGlmaWNhdGUgaXMKKyAgICAgICAgICogcmVxdWlyZWQgdGhlbiB3ZSBtYWtlIDEwMCUgc3VyZSB0aGF0IHdlIHdlcmUKKyAgICAgICAgICogZ2l2ZW4gb24gZHVyaW5nIHRoZSBoYW5kc2hha2UgKGFzIGl0IGlzIGFuIG9wdGlvbmFsCisgICAgICAgICAqIHBhcnQgb2YgU1NMIGFuZCBUTFMpCisgICAgICAgICAqLworCisgICAgICAgIGlmICggdGxzX2FjdGl2ZV9mbGFnICkgeworICAgICAgICAgICAgcGVlcj1TU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUodGxzX2Nvbik7CisgICAgICAgIH0gZWxzZSBpZiAoIHNzbF9hY3RpdmVfZmxhZyApIHsKKyAgICAgICAgICAgIHBlZXI9U1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbF9jb24pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBlZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwiU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKCkgPT0gTlVMTCIsIiIsMCk7CisgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKworICAgICAgICAgICAgaWYgKHNzbF92ZXJpZnlfZmxhZyAmIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIHsKKyAgICAgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICAgICAgdG5fZGVidWcoIltTU0wvVExTIC0gcGVlciBjaGVjayBmYWlsZWRdIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3NsX2RlYnVnX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJbU1NML1RMUyAtIHBlZXIgY2hlY2sgZmFpbGVkXVxyXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImNrX3RuX3Rsc19uZWdvdGlhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAiW1NTTC9UTFMgLSBwZWVyIGNoZWNrIGZhaWxlZF0iLAorICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgLyogTE9HR0lORyBSRVFVSVJFRCBIRVJFISAqLworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWcoRjEwMCwiU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKCkgIT0gTlVMTCIsIiIsMCk7CisgICAgICAgICAgICBYNTA5X05BTUVfZ2V0X3RleHRfYnlfTklEKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShwZWVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JRF9jb21tb25OYW1lLHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHByaW50ZigiW1RMUyAtIGNvbW1vbk5hbWU9JXNdXHJcbiIsc3RyKTsKKworICAgICAgICAgICAgWDUwOV9OQU1FX2dldF90ZXh0X2J5X05JRChYNTA5X2dldF9zdWJqZWN0X25hbWUocGVlciksCisjaWZuZGVmIE5JRF94NTAwVW5pcXVlSWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklEX3VuaXF1ZUlkZW50aWZpZXIsCisjZWxzZSAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklEX3g1MDBVbmlxdWVJZGVudGlmaWVyLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsMjU2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgcHJpbnRmKCJbVExTIC0gdW5pcXVlSWRlbnRpZmllcj0lc11cclxuIixzdHIpOworCisgICAgICAgICAgICAvKiBUcnkgdG8gZGV0ZXJtaW5lIHVzZXIgbmFtZSAqLworICAgICAgICAgICAgdWlkID0gdGxzX3VzZXJpZF9mcm9tX2NsaWVudF9jZXJ0KHRsc19jb24pOworICAgICAgICAgICAgaWYgKCB1aWQgKSB7CisgICAgICAgICAgICAgICAgLyogVGhpcyBjb2RlIGlzIHZlcnkgcXVlc3Rpb25hYmxlLgorICAgICAgICAgICAgICAgICogSG93IHNob3VsZCBpdCBiZWhhdmU/CisgICAgICAgICAgICAgICAgKiBUaGUgY2xpZW50IGhhcyBwcmVzZW50ZWQgYSBjZXJ0aWZpY2F0ZSB0aGF0CisgICAgICAgICAgICAgICAgKiBjb250YWlucyBhIHVzZXJuYW1lLiAgV2UgaGF2ZSB2YWxpZGF0ZWQgdGhlCisgICAgICAgICAgICAgICAgKiBjZXJ0aWZpY2F0ZSBidXQgd2UgZG8gbm90IGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAgICAgICAqIGxvZyB0aGUgdXNlciBpbiB1bmxlc3MgdGhlcmUgaXMgYSAudGxzbG9naW4KKyAgICAgICAgICAgICAgICAqIGZpbGUuCisgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIGNrc3RybmNweShzelVzZXJOYW1lUmVxdWVzdGVkLHVpZCxVSURCVUZMRU4pOworI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgICAgICAgaWYgKHp2dXNlcih1aWQpKQorICAgICAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfVkFMSUQpOworICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgICAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfVVNFUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzelVzZXJOYW1lUmVxdWVzdGVkWzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oMCk7ICAvKiBzdWNjZXNzICovCit9CisKK2ludAorY2tfc3NsX291dGdvaW5nKGZkKSBpbnQgZmQ7Cit7CisgICAgaW50IHRpbW8gPSAyMDAwOworCisgICAgaWYgKCAhY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIC8qIGJpbmQgaW4gdGhlIG5ldHdvcmsgZGVzY3JpcHRvciAqLworICAgIFNTTF9zZXRfZmQoc3NsX2NvbixmZCk7CisgICAgU1NMX3NldF9mZCh0bHNfY29uLGZkKTsKKworICAgIC8qIElmIHdlIGFyZSBkb2luZyByYXcgVExTIHRoZW4gc3RhcnQgaXQgbm93IC4uLiAqLworICAgIGlmICh0bHNfb25seV9mbGFnKSB7CisjaWZuZGVmIFVTRV9DRVJUX0NCCisgICAgICAgIGlmICghdGxzX2xvYWRfY2VydHModGxzX2N0eCx0bHNfY29uLDApKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJja19zc2xfb3V0Z29pbmciLCJ0bHNfbG9hZF9jZXJ0cygpIGZhaWxlZCIsMCk7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX0NFUlRfQ0IgKi8KKyAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICB0bl9kZWJ1ZygiW1RMUyAtIGhhbmRzaGFrZSBzdGFydGluZ10iKTsKKyAgICAgICAgZWxzZSBpZiAoc3NsX3ZlcmJvc2VfZmxhZykKKyAgICAgICAgICAgIHByaW50ZigiW1RMUyAtIGhhbmRzaGFrZSBzdGFydGluZ11cclxuIik7CisgICAgICAgIGRlYnVnKEYxMTAsImNrX3NzbF9vdXRnb2luZyIsIltUTFMgLSBoYW5kc2hha2Ugc3RhcnRpbmddIiwwKTsKKyAgICAgICAgaWYgKFNTTF9jb25uZWN0KHRsc19jb24pIDw9IDApIHsKKyAgICAgICAgICAgIGNoYXIgZXJyYnVmWzEwMjRdOworCisgICAgICAgICAgICBzcHJpbnRmKGVycmJ1ZiwiW1RMUyAtIFNTTF9jb25uZWN0IGVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICBFUlJfZXJyb3Jfc3RyaW5nKEVSUl9nZXRfZXJyb3IoKSxOVUxMKSk7CisKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgICAgIHRuX2RlYnVnKGVycmJ1Zik7CisgICAgICAgICAgICBlbHNlIGlmICggc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgIHByaW50ZigiJXNcclxuIixlcnJidWYpOworCisgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1RMUyAtIEZBSUxFRF0iKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkKKyAgICAgICAgICAgICAgICBwcmludGYoIltUTFMgLSBGQUlMRURdXHJcbiIpOworICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfc3NsX291dGdvaW5nIiwiW1RMUyAtIEZBSUxFRF0iLDApOworICAgICAgICAgICAgbmV0Y2xvcygpOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRsc19hY3RpdmVfZmxhZyA9IDE7CisgICAgICAgICAgICBpZiAoICFzc2xfY2VydHNva19mbGFnICYmIChzc2xfdmVyaWZ5X2ZsYWcgJiBTU0xfVkVSSUZZX1BFRVIpICYmIAorICAgICAgICAgICAgICAgICAhdGxzX2lzX2tyYjUoMCkgKSB7CisgICAgICAgICAgICAgICAgY2hhciAqc3ViamVjdCA9IHNzbF9nZXRfc3ViamVjdF9uYW1lKHRsc19jb24pOworCisgICAgICAgICAgICAgICAgaWYgKCFzdWJqZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzc2xfdmVyaWZ5X2ZsYWcgJiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1RMUyAtIEZBSUxFRF0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIltUTFMgLSBGQUlMRURdXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfdG5fdGxzX25lZ290aWF0ZSIsIltUTFMgLSBGQUlMRURdIiwwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHBybXB0WzEwMjRdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9rOworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSB1cV9vaygiV2FybmluZzogU2VydmVyIGRpZG4ndCBwcm92aWRlIGEgY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGludWU/IChZL04pIiwgMywgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuX2RlYnVnKCJbVExTIC0gRkFJTEVEXSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJbVExTIC0gRkFJTEVEXVxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2tfdG5fdGxzX25lZ290aWF0ZSIsIltUTFMgLSBGQUlMRURdIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNzbF9jaGVja19zZXJ2ZXJfbmFtZSh0bHNfY29uLCBzekhvc3ROYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRuX2RlYnVnKCJbVExTIC0gRkFJTEVEXSIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIltUTFMgLSBGQUlMRURdXHJcbiIpOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImNrX3RuX3Rsc19uZWdvdGlhdGUiLCJbVExTIC0gRkFJTEVEXSIsMCk7CisgICAgICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmludGYoIltUTFMgLSBPS11cclxuIik7CisgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1RMUyAtIE9LXSIpOworICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfc3NsX291dGdvaW5nIiwiW1RMUyAtIE9LXSIsMCk7CisgICAgICAgICAgICBzc2xfZGlzcGxheV9jb25uZWN0X2RldGFpbHModGxzX2NvbiwwLHNzbF92ZXJib3NlX2ZsYWcpOworICAgICAgICB9CisgICAgfQorICAgIC8qIGlmIHdlIGFyZSBkb2luZyByYXcgU1NMIHRoZW4gc3RhcnQgaXQgbm93IC4uLiAqLworICAgIGVsc2UgaWYgKHNzbF9vbmx5X2ZsYWcpIHsKKyNpZm5kZWYgVVNFX0NFUlRfQ0IKKyAgICAgICAgaWYgKCF0bHNfbG9hZF9jZXJ0cyhzc2xfY3R4LHNzbF9jb24sMCkpCisgICAgICAgICAgICByZXR1cm4oLTEpOworI2VuZGlmIC8qIFVTRV9DRVJUX0NCICovCisgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgdG5fZGVidWcoIltTU0wgLSBoYW5kc2hha2Ugc3RhcnRpbmddIik7CisgICAgICAgIGVsc2UgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkKKyAgICAgICAgICAgIHByaW50ZigiW1NTTCAtIGhhbmRzaGFrZSBzdGFydGluZ11cclxuIik7CisgICAgICAgIGRlYnVnKEYxMTAsImNrX3NzbF9vdXRnb2luZyIsIltTU0wgLSBoYW5kc2hha2Ugc3RhcnRpbmddIiwwKTsKKyAgICAgICAgaWYgKFNTTF9jb25uZWN0KHNzbF9jb24pIDw9IDApIHsKKyAgICAgICAgICAgIGlmICggc3NsX2RlYnVnX2ZsYWcgKSB7CisgICAgICAgICAgICAgICAgY2hhciBlcnJidWZbMTAyNF07CisKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGVycmJ1ZiwiW1NTTCAtIFNTTF9jb25uZWN0IGVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX2Vycm9yX3N0cmluZyhFUlJfZ2V0X2Vycm9yKCksTlVMTCkpOworICAgICAgICAgICAgICAgIHByaW50ZigiJXNcclxuIixlcnJidWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgdG5fZGVidWcoIltTU0wgLSBGQUlMRURdIik7CisgICAgICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICAgICAgcHJpbnRmKCJbU1NMIC0gRkFJTEVEXVxyXG4iKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX3NzbF9vdXRnb2luZyIsIltTU0wgLSBGQUlMRURdIiwwKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzc2xfYWN0aXZlX2ZsYWcgPSAxOworCisgICAgICAgICAgICBpZiAoICFzc2xfY2VydHNva19mbGFnICYmIChzc2xfdmVyaWZ5X2ZsYWcgJiBTU0xfVkVSSUZZX1BFRVIpICYmCisgICAgICAgICAgICAgICAgICF0bHNfaXNfa3JiNSgwKSkgeworICAgICAgICAgICAgICAgIGNoYXIgKnN1YmplY3QgPSBzc2xfZ2V0X3N1YmplY3RfbmFtZShzc2xfY29uKTsKKworICAgICAgICAgICAgICAgIGlmICghc3ViamVjdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3NsX3ZlcmlmeV9mbGFnICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5fZGVidWcoIltTU0wgLSBGQUlMRURdIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJbU1NMIC0gRkFJTEVEXVxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX3RuX3Rsc19uZWdvdGlhdGUiLCJbU1NMIC0gRkFJTEVEXSIsMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBwcm1wdFsxMDI0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvazsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gdXFfb2soIldhcm5pbmc6IFNlcnZlciBkaWRuJ3QgcHJvdmlkZSBhIGNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRpbnVlPyAoWS9OKSIsIDMsIE5VTEwsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1NTTCAtIEZBSUxFRF0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggc3NsX3ZlcmJvc2VfZmxhZyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiW1NTTCAtIEZBSUxFRF1cclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNrX3RuX3Rsc19uZWdvdGlhdGUiLCJbU1NMIC0gRkFJTEVEXSIsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzc2xfY2hlY2tfc2VydmVyX25hbWUoc3NsX2Nvbiwgc3pIb3N0TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1NTTCAtIEZBSUxFRF0iKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNzbF92ZXJib3NlX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJbU1NMIC0gRkFJTEVEXVxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwgImNrX3RuX3Rsc19uZWdvdGlhdGUiLCJbU1NMIC0gRkFJTEVEXSIsMCk7CisgICAgICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmludGYoIltTU0wgLSBPS11cclxuIik7CisgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1NTTCAtIE9LXSIpOworICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfc3NsX291dGdvaW5nIiwiW1NTTCAtIE9LXSIsMCk7CisgICAgICAgICAgICBzc2xfZGlzcGxheV9jb25uZWN0X2RldGFpbHMoc3NsX2NvbiwwLHNzbF92ZXJib3NlX2ZsYWcpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybigwKTsgIC8qIHN1Y2Nlc3MgKi8KK30KKworI2lmbmRlZiBOT0hUVFAKK2ludAorY2tfc3NsX2h0dHBfY2xpZW50KGZkLCBob3N0bmFtZSkgaW50IGZkOyBjaGFyICogaG9zdG5hbWU7Cit7CisgICAgaW50IHRpbW8gPSAyMDAwOworCisgICAgaWYgKCAhY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIC8qIGJpbmQgaW4gdGhlIG5ldHdvcmsgZGVzY3JpcHRvciAqLworICAgIFNTTF9zZXRfZmQodGxzX2h0dHBfY29uLGZkKTsKKworICAgIC8qIElmIHdlIGFyZSBkb2luZyByYXcgVExTIHRoZW4gc3RhcnQgaXQgbm93IC4uLiAqLworICAgIGlmICgxKSB7CisjaWZuZGVmIFVTRV9DRVJUX0NCCisgICAgICAgIGlmICghdGxzX2xvYWRfY2VydHModGxzX2h0dHBfY3R4LHRsc19odHRwX2NvbiwwKSkgeworICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfc3NsX2h0dHBfY2xpZW50IiwidGxzX2xvYWRfY2VydHMoKSBmYWlsZWQiLDApOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9DRVJUX0NCICovCisgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgdG5fZGVidWcoIltUTFMgLSBoYW5kc2hha2Ugc3RhcnRpbmddIik7CisgICAgICAgIGVsc2UgaWYgKHNzbF92ZXJib3NlX2ZsYWcpCisgICAgICAgICAgICBwcmludGYoIltUTFMgLSBoYW5kc2hha2Ugc3RhcnRpbmddXHJcbiIpOworICAgICAgICBkZWJ1ZyhGMTEwLCJja19zc2xfb3V0Z29pbmciLCJbVExTIC0gaGFuZHNoYWtlIHN0YXJ0aW5nXSIsMCk7CisgICAgICAgIGlmIChTU0xfY29ubmVjdCh0bHNfaHR0cF9jb24pIDw9IDApIHsKKyAgICAgICAgICAgIGNoYXIgZXJyYnVmWzEwMjRdOworCisgICAgICAgICAgICBzcHJpbnRmKGVycmJ1ZiwiW1RMUyAtIFNTTF9jb25uZWN0IGVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICBFUlJfZXJyb3Jfc3RyaW5nKEVSUl9nZXRfZXJyb3IoKSxOVUxMKSk7CisKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgICAgIHRuX2RlYnVnKGVycmJ1Zik7CisgICAgICAgICAgICBlbHNlIGlmICggc3NsX2RlYnVnX2ZsYWcgKQorICAgICAgICAgICAgICAgIHByaW50ZigiJXNcclxuIixlcnJidWYpOworCisgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1RMUyAtIEZBSUxFRF0iKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkKKyAgICAgICAgICAgICAgICBwcmludGYoIltUTFMgLSBGQUlMRURdXHJcbiIpOworICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfc3NsX2h0dHBfY2xpZW50IiwiW1RMUyAtIEZBSUxFRF0iLDApOworICAgICAgICAgICAgaHR0cF9jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRsc19odHRwX2FjdGl2ZV9mbGFnID0gMTsKKyAgICAgICAgICAgIGlmICggIXNzbF9jZXJ0c29rX2ZsYWcgJiYgKHNzbF92ZXJpZnlfZmxhZyAmIFNTTF9WRVJJRllfUEVFUikgJiYKKyAgICAgICAgICAgICAgICAgIXRsc19pc19rcmI1KDMpICkgeworICAgICAgICAgICAgICAgIGNoYXIgKnN1YmplY3QgPSBzc2xfZ2V0X3N1YmplY3RfbmFtZSh0bHNfaHR0cF9jb24pOworCisgICAgICAgICAgICAgICAgaWYgKCFzdWJqZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzc2xfdmVyaWZ5X2ZsYWcgJiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiW1RMUyAtIEZBSUxFRF0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIltUTFMgLSBGQUlMRURdXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfdG5fdGxzX25lZ290aWF0ZSIsIltUTFMgLSBGQUlMRURdIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcHJtcHRbMTAyNF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2s7CisgICAgICAgICAgICAgICAgICAgICAgICBvayA9IHVxX29rKCJXYXJuaW5nOiBTZXJ2ZXIgZGlkbid0IHByb3ZpZGUgYSBjZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250aW51ZT8gKFkvTikiLCAzLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5fZGVidWcoIltUTFMgLSBGQUlMRURdIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNzbF92ZXJib3NlX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIltUTFMgLSBGQUlMRURdXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJja190bl90bHNfbmVnb3RpYXRlIiwiW1RMUyAtIEZBSUxFRF0iLDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3NsX2NoZWNrX3NlcnZlcl9uYW1lKHRsc19odHRwX2NvbiwgaG9zdG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgdG5fZGVidWcoIltUTFMgLSBGQUlMRURdIik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzc2xfdmVyYm9zZV9mbGFnICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiW1RMUyAtIEZBSUxFRF1cclxuIik7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2tfdG5fdGxzX25lZ290aWF0ZSIsIltUTFMgLSBGQUlMRURdIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpbnRmKCJbVExTIC0gT0tdXHJcbiIpOworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgdG5fZGVidWcoIltUTFMgLSBPS10iKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX3NzbF9vdXRnb2luZyIsIltUTFMgLSBPS10iLDApOworICAgICAgICAgICAgc3NsX2Rpc3BsYXlfY29ubmVjdF9kZXRhaWxzKHRsc19odHRwX2NvbiwwLHNzbF92ZXJib3NlX2ZsYWcpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybigwKTsgIC8qIHN1Y2Nlc3MgKi8KK30KKyNlbmRpZiAvKiBOT0hUVFAgKi8KK2ludAorY2tfc3NsX3JlbmVnb3RpYXRlX2NpcGhlcnMoKQoreworCisgICAgaWYgKCAhY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgaWYgKCAhc3N0ZWxuZXQgKQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAoIHNzbF9hY3RpdmVfZmxhZyApCisgICAgICAgIHJldHVybiBTU0xfcmVuZWdvdGlhdGUoc3NsX2Nvbik7CisgICAgZWxzZSBpZiAoIHRsc19hY3RpdmVfZmxhZyApCisgICAgICAgIHJldHVybiBTU0xfcmVuZWdvdGlhdGUodGxzX2Nvbik7CisgICAgcmV0dXJuKDApOworfQorCisjaWZkZWYgTlQKK2ludCAKK2NrX1g1MDlfc2F2ZV9jZXJ0X3RvX3VzZXJfc3RvcmUoWDUwOSAqY2VydCkKK3sKKyNpZmRlZiBYNTA5VjNfRVhUX0RVTVBfVU5LTk9XTgorICAgIGNoYXIgcGF0aFtDS01BWFBBVEhdOworICAgIGNoYXIgaGFzaFsxNl07CisgICAgY2hhciAqIEdldEFwcERhdGEoaW50KTsKKyAgICBCSU8gKiBvdXQ9TlVMTDsKKworICAgIGlmICggY2VydCA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgc3ByaW50ZihoYXNoLCIlMDhseCIsWDUwOV9zdWJqZWN0X25hbWVfaGFzaChjZXJ0KSk7CisgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsR2V0QXBwRGF0YSgwKSwia2VybWl0IDk1L2NlcnRzLyIsCisgICAgICAgICAgICAgaGFzaCwiLjAiKTsKKworICAgIAorICAgIG91dD1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisgICAgaWYgKG91dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBpZiAoQklPX3dyaXRlX2ZpbGVuYW1lKG91dCxwYXRoKSA8PSAwKSB7CisgICAgICAgIHBlcnJvcihwYXRoKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIFg1MDlfcHJpbnRfZXgob3V0LCBjZXJ0LCBYTl9GTEFHX1NFUF9NVUxUSUxJTkUsIFg1MDlWM19FWFRfRFVNUF9VTktOT1dOKTsKKyAgICBpZiAoIVBFTV93cml0ZV9iaW9fWDUwOShvdXQsY2VydCkpIHsKKyAgICAgICAgQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gd3JpdGUgY2VydGlmaWNhdGVcbiIpOworICAgICAgICBFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworICAgICAgICBCSU9fZnJlZV9hbGwob3V0KTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBCSU9fZnJlZV9hbGwob3V0KTsKKyAgICByZXR1cm4oMSk7CisjZWxzZSAvKiBYNTA5VjNfRVhUX0RVTVBfVU5LTk9XTiAqLworICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBYNTA5VjNfRVhUX0RVTVBfVU5LTk9XTiAqLworfQorI2VuZGlmIC8qIE5UICovCisKKyNpZm5kZWYgT1MyCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHNob3VsZCBiZSByZXBsYWNlZCBieSBpbnN0aXR1dGlvbiBzcGVjaWZpYyAqLworLyogY29kZSB0aGF0IHdpbGwgY29udmVydCBhbiBYNTA5IGNlcnQgc3RydWN0dXJlIHRvIGEgdXNlcmlkIGZvciB0aGUgKi8KKy8qIHB1cnBvc2VzIG9mIGNsaWVudCB0byBob3N0IGxvZ2luLiAgVGhlIGV4YW1wbGUgY29kZSBpbmNsdWRlZCAgICAgICovCisvKiBzaW1wbHkgcmV0dXJucyB0aGUgVUlEIGZpZWxkIG9mIHRoZSBTdWJqZWN0IGlmIGl0IGV4aXN0cy4gICAgICAgICAqLworCisvKiBYNTA5X3RvX3VzZXIoKSByZXR1cm5zIDAgaWYgdmFsaWQgdXNlcmlkIGluICd1c2VyaWQnLCBlbHNlIC0xICovCitpbnQKK1g1MDlfdG9fdXNlcihYNTA5ICpwZWVyX2NlcnQsIGNoYXIgKnVzZXJpZCwgaW50IGxlbikKK3sKKyNpZmRlZiBYNTA5X1VJRF9UT19VU0VSCisgICAgLyogQkVHSU4gRVhBTVBMRSAqLworICAgIGludCBlcnI7CisKKyAgICBpZiAoIShwZWVyX2NlcnQgJiYgdXNlcmlkKSB8fCBsZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgdXNlcmlkWzBdID0gJ1wwJzsKKyAgICBkZWJ1ZyhGMTEwLCJYNTA5X3RvX3VzZXIoKSBzdWJqZWN0IiwKKyAgICAgICAgICAgWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfc3ViamVjdF9uYW1lKHBlZXJfY2VydCksTlVMTCwwKSwwKTsKKworICAgIC8qIHVzZXJpZCBpcyBpbiBjZXJ0IHN1YmplY3QgL1VJRCAqLworICAgIGVyciA9IFg1MDlfTkFNRV9nZXRfdGV4dF9ieV9OSUQoWDUwOV9nZXRfc3ViamVjdF9uYW1lKHBlZXJfY2VydCksCisjaWZuZGVmIE5JRF94NTAwVW5pcXVlSWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JRF91bmlxdWVJZGVudGlmaWVyLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSURfeDUwMFVuaXF1ZUlkZW50aWZpZXIsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyaWQsIGxlbik7CisKKyAgICBkZWJ1ZyhGMTExLCJYNTA5X3RvX3VzZXIoKSB1c2VyaWQiLHVzZXJpZCxlcnIpOworICAgIGlmIChlcnIgPiAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIEVORCBFWEFNUExFICovCisjZWxzZSAvKiBYNTA5X1VJRF9UT19VU0VSICovCisjaWZkZWYgWDUwOV9TVUJKRUNUX0FMVF9OQU1FX1RPX1VTRVIKKyAgICAvKiBCRUdJTiBFWEFNUExFICovCisgICAgaW50IGk7CisgICAgWDUwOV9FWFRFTlNJT04gKmV4dCA9IE5VTEw7CisgICAgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqaWFsdCA9IE5VTEw7CisgICAgR0VORVJBTF9OQU1FICpnZW4gPSBOVUxMOworICAgIGNoYXIgZW1haWxbMjU2XTsKKworICAgIGlmICghKHBlZXJfY2VydCAmJiB1c2VyaWQpIHx8IGxlbiA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICB1c2VyaWRbMF0gPSAnXDAnOworICAgIGVtYWlsWzBdID0gJ1wwJzsKKyAgICBkZWJ1ZyhGMTEwLCJYNTA5X3RvX3VzZXIoKSBzdWJqZWN0IiwKKyAgICAgICAgICAgWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfc3ViamVjdF9uYW1lKHBlZXJfY2VydCksTlVMTCwwKSwwKTsKKworICAgIGlmICgoaSA9IFg1MDlfZ2V0X2V4dF9ieV9OSUQocGVlcl9jZXJ0LCBOSURfc3ViamVjdF9hbHRfbmFtZSwgLTEpKTwwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCEoZXh0ID0gWDUwOV9nZXRfZXh0KHBlZXJfY2VydCwgaSkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgWDUwOVYzX2FkZF9zdGFuZGFyZF9leHRlbnNpb25zKCk7CisgICAgaWYgKCEoaWFsdCA9IFg1MDlWM19FWFRfZDJpKGV4dCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oaWFsdCk7IGkrKykgeworICAgICAgICBnZW4gPSBza19HRU5FUkFMX05BTUVfdmFsdWUoaWFsdCwgaSk7CisgICAgICAgIGlmIChnZW4tPnR5cGUgPT0gR0VOX0ROUykgeworICAgICAgICAgICAgaWYoIWdlbi0+ZC5pYTUgfHwgIWdlbi0+ZC5pYTUtPmxlbmd0aCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICggZ2VuLT5kLmlhNS0+bGVuZ3RoICsgMSA+IHNpemVvZihlbWFpbCkgKSB7CisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KGVtYWlsLCBnZW4tPmQuaWE1LT5kYXRhLCBnZW4tPmQuaWE1LT5sZW5ndGgpOworICAgICAgICAgICAgZW1haWxbZ2VuLT5kLmlhNS0+bGVuZ3RoXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgY2xlYW51cDoKKyAgICBYNTA5VjNfRVhUX2NsZWFudXAoKTsKKyAgICBpZiAoaWFsdCkKKyAgICAgICAgc2tfR0VORVJBTF9OQU1FX2ZyZWUoaWFsdCk7CisKKyAgICBkZWJ1ZyhGMTEwLCJYNTA5X3RvX3VzZXIoKSBlbWFpbCIsZW1haWwsMCk7CisKKyAgICBpZiAoIGVtYWlsWzBdICkgeworICAgICAgICBjaGFyICogZG9tYWluID0gTlVMTDsKKworICAgICAgICAvKiBGaW5kIGRvbWFpbiAqLworICAgICAgICBmb3IgKCBpPTAgOyBlbWFpbFtpXSA7IGkrKyApIHsKKyAgICAgICAgICAgIGlmICggZW1haWxbaV0gPT0gJ0AnICkgeworICAgICAgICAgICAgICAgIGVtYWlsW2ldID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBkb21haW4gPSAmZW1haWxbaSsxXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggZG9tYWluICkgeworICAgICAgICAgICAgLyogWFhYIC0gUHV0IGNvZGUgdG8gVmVyaWZ5IGRvbWFpbiBoZXJlICovCisKKyAgICAgICAgICAgIGlmICggLyogZG9tYWluIGlzIG9rYXkgKi8gMSApCisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHVzZXJpZCxlbWFpbCxsZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKHVzZXJpZFswXSA/IDAgOiAtMSk7CisgICAgLyogRU5EIEVYQU1QTEUgKi8KKyNlbmRpZiAvKiBYNTA5X1NVQkpFQ1RfQUxUX05BTUVfVE9fVVNFUiAqLworI2VuZGlmIC8qIFg1MDlfVUlEX1RPX1VTRVIgKi8KKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGluc3RpdHV0aW9uIHNwZWNpZmljICovCisvKiBjb2RlIHRoYXQgd2lsbCBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSAgICAqLworLyogcHJvdmlkZWQgWDUwOSBjZXJ0aWZpY2F0ZSBhbmQgdXNlcm5hbWUgaXMgdmFsaWQgZm9yIGF1dG9tYXRpYyAgICAgKi8KKy8qIGxvZ2luLiAgIFdoZXJlYXMgWDUwOV90b191c2VyKCkgaXMgdXNlZCB0byBwcm92aWRlIGF1dGhlbnRpY2F0aW9uICovCisvKiBvZiB0aGUgdXNlciwgdGhlIFg1MDlfdXNlcm9rKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBwcm92aWRlICAgICAgICAqLworLyogYXV0aG9yaXphdGlvbi4gIFRoZSBjZXJ0aWZpY2F0ZSBwYXNzZWQgaW50byBYNTA5X3VzZXJvaygpIGRvZXMgICAgKi8KKy8qIG5lZWQgdG8gbWFwIHRvIGEgdXNlcmlkOyBub3Igd291bGQgdGhlIHVzZXJpZCBpdCB3b3VsZCBtYXAgdG8gICAgICovCisvKiBuZWVkIHRvIG1hdGNoIHRoZSB1c2VyaWQgcHJvdmlkZWQgdG8gdGhlIGZ1bmN0aW9uLiAgVGhlcmUgYXJlICAgICAqLworLyogbnVtZXJvdXMgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyBiZW5lZmljaWFsIHRvIGhhdmUgdGhlIGFiaWxpdHkgKi8KKy8qIGZvciBtdWx0aXBsZSB1c2VycyB0byBnYWluIGFjY2VzcyB0byBhIGNvbW1vbiBhY2NvdW50IHN1Y2ggYXMgICAgICovCisvKiAncm9vdCcgb24gVW5peDsgb3IgYSBjbGFzcyBhY2NvdW50IG9uIGEgd2ViIHNlcnZlci4gIEluIFVuaXggd2UgICAqLworLyogaW1wbGVtZW50IHRoaXMgY2FwYWJpbGl0eSB3aXRoIHRoZSB+dXNlcmlkLy50bHNsb2dpbiBmaWxlIHdoaWNoICAgKi8KKy8qIGEgbGlzdCBvZiBYNTA5IGNlcnRpZmljYXRlcyB3aGljaCBtYXkgYmUgdXNlZCB0byBhY2Nlc3MgdGhlICAgICAgICovCisvKiBhY2NvdW50ICd1c2VyaWQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBYNTA5X3RvX3VzZXIoKSByZXR1cm5zIDAgaWYgYWNjZXNzIGlzIGRlbmllZDsgMSBpcyBhY2Nlc3MgaXMgcGVybWl0dGVkICovCitpbnQKK1g1MDlfdXNlcm9rKFg1MDkgKiBwZWVyX2NlcnQsIGNvbnN0IGNoYXIgKiB1c2VyaWQpCit7CisjaWZuZGVmIFZNUworICAgIC8qIGNoZWNrIGlmIGNsaWVudHMgY2VydCBpcyBpbiAidXNlciIncyB+Ly50bHNsb2dpbiBmaWxlICovCisgICAgY2hhciBidWZbNTEyXTsKKyAgICBpbnQgciA9IDA7CisgICAgRklMRSAqZnA7CisgICAgc3RydWN0IHBhc3N3ZCAqcHdkOworICAgIFg1MDkgKmZpbGVfY2VydDsKKworICAgIGlmICggcGVlcl9jZXJ0ID09IE5VTEwgKQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAoIShwd2QgPSBnZXRwd25hbSh1c2VyaWQpKSkKKyAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoc3RybGVuKHB3ZC0+cHdfZGlyKSA+IDUwMCkKKyAgICAgICByZXR1cm4oMCk7CisgICAgc3ByaW50ZihidWYsICIlcy8udGxzbG9naW4iLCBwd2QtPnB3X2Rpcik7CisKKyAgICBpZiAoIShmcCA9IGZvcGVuKGJ1ZiwgInIiKSkpCisgICAgICAgIHJldHVybiAwOworICAgIHdoaWxlICghciAmJiAoZmlsZV9jZXJ0ID0gUEVNX3JlYWRfWDUwOShmcCwgTlVMTCwgTlVMTCwgTlVMTCkpKSB7CisgICAgICAgIGlmICghQVNOMV9TVFJJTkdfY21wKHBlZXJfY2VydC0+c2lnbmF0dXJlLCBmaWxlX2NlcnQtPnNpZ25hdHVyZSkpCisgICAgICAgICAgICByID0gMTsKKyAgICAgICAgWDUwOV9mcmVlKGZpbGVfY2VydCk7CisgICAgfQorICAgIGZjbG9zZShmcCk7CisgICAgcmV0dXJuKHIpOworI2Vsc2UgLyogVk1TICovCisgICAgLyogTmVlZCB0byBpbXBsZW1lbnQgYW4gYXBwcm9wcmlhdGUgZnVuY3Rpb24gZm9yIFZNUyAqLworICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBWTVMgKi8KK30KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19TU0wgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja19zc2wuaCBiL2NrZXJtaXQtOC4wLjIxMS9ja19zc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGRkOGEzCi0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrX3NzbC5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICBDIEsgXyBTIFMgTCAuIEggLS0gIE9wZW5TU0wgSW50ZXJmYWNlIEhlYWRlciBmb3IgQy1LZXJtaXQKKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorCisgICAgQXV0aG9yOiAgSmVmZnJleSBFIEFsdG1hbiAoamFsdG1hbkBzZWN1cmUtZW5kcG9pbnRzLmNvbSkKKyAgICAgICAgICAgICAgIFNlY3VyZSBFbmRwb2ludHMgSW5jLiwgTmV3IFlvcmsgQ2l0eQorKi8KKworI2lmZGVmIENLX1NTTAorI2lmbmRlZiBDS19BTlNJQworI2RlZmluZSBOT1BST1RPCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKworI2lmZGVmIENPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBmb3IgQy1LZXJtaXQgNy4xICovCisjaWZkZWYgS1JCNQorI2lmbmRlZiBOT1NTTEs1CisjaWZuZGVmIFNTTF9LUkI1CisjZGVmaW5lIFNTTF9LUkI1CisjZW5kaWYgLyogU1NMX0tSQjUgKi8KKyNlbmRpZiAvKiBOT1NTTEs1ICovCisjZW5kaWYgLyogS1JCNSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIE9TMgorI2lmbmRlZiBaTElCCisjZGVmaW5lIFpMSUIKKyNlbmRpZiAvKiBaTElCICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBaTElCCisjaW5jbHVkZSA8b3BlbnNzbC9jb21wLmg+CisjZW5kaWYgLyogWkxJQiAqLworLyogV2UgcGxhY2UgdGhlIGZvbGxvd2luZyB0byBhdm9pZCBsb2FkaW5nIG9wZW5zc2wvbWRjMi5oIHNpbmNlIGl0IAorICogcmVsaWVzIG9uIHRoZSBPcGVuU1NMIGRlcy5oLiAgU2luY2Ugd2UgZG8gbm90IG5lZWQgdGhlIE1EQzIgCisgKiBkZWZpbml0aW9ucyB0aGVyZSBpcyBubyByZWFzb24gdG8gaGF2ZSBpdCBpbmNsdWRlZCBieSBvcGVuc3NsL2V2cC5oCisgKi8KKyNkZWZpbmUgT1BFTlNTTF9OT19NREMyCisjaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5X3ZmeS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibG93ZmlzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JjNC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY2FzdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KKyNpZmRlZiBTU0xfS1JCNQorI2luY2x1ZGUgPG9wZW5zc2wva3NzbC5oPgorI2VuZGlmIC8qIFNTTF9LUkI1ICovCisKK2V4dGVybiBCSU8gKmJpb19lcnI7CitleHRlcm4gU1NMICpzc2xfY29uOworZXh0ZXJuIFNTTF9DVFggKnNzbF9jdHg7CitleHRlcm4gaW50IHNzbF9kZWJ1Z19mbGFnOworZXh0ZXJuIGludCBzc2xfb25seV9mbGFnOworZXh0ZXJuIGludCBzc2xfYWN0aXZlX2ZsYWc7CitleHRlcm4gaW50IHNzbF92ZXJpZnlfZmxhZzsKK2V4dGVybiBpbnQgc3NsX3ZlcmJvc2VfZmxhZzsKK2V4dGVybiBpbnQgc3NsX2NlcnRzb2tfZmxhZzsKK2V4dGVybiBpbnQgc3NsX2R1bW15X2ZsYWc7CitleHRlcm4gaW50IHNzbF92ZXJpZnlfZGVwdGg7CisKK2V4dGVybiBjaGFyICpzc2xfcnNhX2NlcnRfZmlsZTsKK2V4dGVybiBjaGFyICpzc2xfcnNhX2NlcnRfY2hhaW5fZmlsZTsKK2V4dGVybiBjaGFyICpzc2xfcnNhX2tleV9maWxlOworZXh0ZXJuIGNoYXIgKnNzbF9kc2FfY2VydF9maWxlOworZXh0ZXJuIGNoYXIgKnNzbF9kc2FfY2VydF9jaGFpbl9maWxlOworZXh0ZXJuIGNoYXIgKnNzbF9kaF9rZXlfZmlsZTsKK2V4dGVybiBjaGFyICpzc2xfY2lwaGVyX2xpc3Q7CitleHRlcm4gY2hhciAqc3NsX2NybF9maWxlOworZXh0ZXJuIGNoYXIgKnNzbF9jcmxfZGlyOworZXh0ZXJuIGNoYXIgKnNzbF92ZXJpZnlfZmlsZTsKK2V4dGVybiBjaGFyICpzc2xfdmVyaWZ5X2RpcjsKK2V4dGVybiBjaGFyICpzc2xfZGhfcGFyYW1fZmlsZTsKK2V4dGVybiBjaGFyICpzc2xfcm5kX2ZpbGU7CisKK2V4dGVybiBTU0xfQ1RYICp0bHNfY3R4OworZXh0ZXJuIFNTTCAqdGxzX2NvbjsKK2V4dGVybiBpbnQgdGxzX29ubHlfZmxhZzsKK2V4dGVybiBpbnQgdGxzX2FjdGl2ZV9mbGFnOworZXh0ZXJuIGludCB4NTA5X2NlcnRfdmFsaWQ7CitleHRlcm4gWDUwOV9TVE9SRSAqY3JsX3N0b3JlOworCisjaWZuZGVmIE5PSFRUUAorZXh0ZXJuIFNTTF9DVFggKnRsc19odHRwX2N0eDsKK2V4dGVybiBTU0wgKnRsc19odHRwX2NvbjsKK2V4dGVybiBpbnQgdGxzX2h0dHBfYWN0aXZlX2ZsYWc7CisjZW5kaWYgLyogTk9IVFRQICovCisKK2V4dGVybiBpbnQgc3NsX2luaXRpYWxpemVkOworCitfUFJPVE9UWVAoVk9JRCBzc2xfb25jZV9pbml0LCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IHNzbF90bl9pbml0LChpbnQpKTsKK19QUk9UT1RZUChpbnQgc3NsX2h0dHBfaW5pdCwoY2hhciAqKSk7CitfUFJPVE9UWVAoaW50IGNrX3NzbF9odHRwX2NsaWVudCwoaW50LGNoYXIgKikpOworX1BST1RPVFlQKGludCBzc2xfZGlzcGxheV9jb25uZWN0X2RldGFpbHMsKFNTTCAqLGludCxpbnQpKTsKK19QUk9UT1RZUChpbnQgc3NsX3NlcnZlcl92ZXJpZnlfY2FsbGJhY2ssKGludCwgWDUwOV9TVE9SRV9DVFggKikpOworX1BST1RPVFlQKGludCBzc2xfY2xpZW50X3ZlcmlmeV9jYWxsYmFjaywoaW50LCBYNTA5X1NUT1JFX0NUWCAqKSk7CitfUFJPVE9UWVAoaW50IHNzbF9yZXBseSwoaW50LCB1bnNpZ25lZCBjaGFyICosIGludCkpOworX1BST1RPVFlQKGludCBzc2xfaXMsKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CitfUFJPVE9UWVAoaW50IGNrX3NzbF9pbmNvbWluZywoaW50KSk7CitfUFJPVE9UWVAoaW50IGNrX3NzbF9vdXRnb2luZywoaW50KSk7CitfUFJPVE9UWVAoaW50IHRsc19pc191c2VyX3ZhbGlkLChTU0wgKiwgY29uc3QgY2hhciAqKSk7CitfUFJPVE9UWVAoY2hhciAqIHNzbF9nZXRfZG5zTmFtZSwoU1NMICopKTsKK19QUk9UT1RZUChjaGFyICogc3NsX2dldF9jb21tb25OYW1lLChTU0wgKikpOworX1BST1RPVFlQKGNoYXIgKiBzc2xfZ2V0X2lzc3Vlcl9uYW1lLChTU0wgKikpOworX1BST1RPVFlQKGNoYXIgKiBzc2xfZ2V0X3N1YmplY3RfbmFtZSwoU1NMICopKTsKK19QUk9UT1RZUChpbnQgc3NsX2dldF9jbGllbnRfZmluaXNoZWQsKGNoYXIgKiwgaW50KSk7CitfUFJPVE9UWVAoaW50IHNzbF9nZXRfc2VydmVyX2ZpbmlzaGVkLChjaGFyICosIGludCkpOworX1BST1RPVFlQKGludCBzc2xfcGFzc3dkX2NhbGxiYWNrLChjaGFyICosIGludCwgaW50LCBWT0lEICopKTsKK19QUk9UT1RZUChWT0lEIHNzbF9jbGllbnRfaW5mb19jYWxsYmFjaywoY29uc3QgU1NMICosaW50LCBpbnQpKTsKK19QUk9UT1RZUChpbnQgc3NsX2Fub255bW91c19jaXBoZXIsKFNTTCAqIHNzbCkpOworX1BST1RPVFlQKGludCB0bHNfbG9hZF9jZXJ0cywoU1NMX0NUWCAqIGN0eCwgU1NMICogY29uLCBpbnQgc2VydmVyKSk7CitfUFJPVE9UWVAoaW50IHNzbF92ZXJpZnlfY3JsLChpbnQsIFg1MDlfU1RPUkVfQ1RYICopKTsKK19QUk9UT1RZUChpbnQgdGxzX2lzX2tyYjUsKGludCkpOworX1BST1RPVFlQKGludCBYNTA5X3VzZXJvaywoWDUwOSAqLGNvbnN0IGNoYXIgKikpOworX1BST1RPVFlQKGludCBja19YNTA5X3NhdmVfY2VydF90b191c2VyX3N0b3JlLChYNTA5ICopKTsKKyNpZmRlZiBPUzIKKyNpbmNsdWRlICJja29zc2xjLmgiCisjaW5jbHVkZSAiY2tvc3NsLmgiCisjZW5kaWYgLyogT1MyICovCisKKyNkZWZpbmUgU1NMX0NMSUVOVCAwCisjZGVmaW5lIFNTTF9TRVJWRVIgMQorI2RlZmluZSBTU0xfSFRUUCAgIDIKKworI2RlZmluZSBTU0xfRVJSX0JGU1ogNDA5NgorCisjaWZkZWYgU1NMX0tSQjUKKyNkZWZpbmUgREVGQVVMVF9DSVBIRVJfTElTVCAiSElHSDpNRURJVU06TE9XOitLUkI1OitBREg6K0VYUCIKKyNlbHNlCisjZGVmaW5lIERFRkFVTFRfQ0lQSEVSX0xJU1QgIkhJR0g6TUVESVVNOkxPVzorQURIOitFWFAiCisjZW5kaWYgLyogU1NMX0tSQjUgKi8KKyNlbmRpZiAvKiBDS19TU0wgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja2FhYWEudHh0IGIvY2tlcm1pdC04LjAuMjExL2NrYWFhYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhODNhNQotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja2FhYWEudHh0CkBAIC0wLDAgKzEsMzg1IEBACitja2FhYWEudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCBBcHIgMjAwNAorCisJCQkgICBDLUtFUk1JVCBWRVJTSU9OIDguMC4yMTEKKwkJCSAgICAgIE9WRVJWSUVXIE9GIEZJTEVTCisKKwkgICAgICAgQ29tbXVuaWNhdGlvbnMgc29mdHdhcmUgZm9yIFVOSVggYW5kIChPcGVuKVZNUy4KKworCQkgICAgICAgQW5kIGluIGZvcm1lciB2ZXJzaW9ucyBhbHNvIGZvcjoKKwkJCSAgU3RyYXR1cyBWT1MsIEFPUy9WUywgUU5YLAorCSAgICAgUGxhbiA5LCBPUy05LCBBcG9sbG8gQWVnaXMsIGFuZCB0aGUgQ29tbW9kb3JlIEFtaWdhLgorCQkgICAgICBUaGUgQXBwbGUgTWFjaW50b3NoLCB0aGUgQXRhcmkgU1QuCisKKwkJICBUaGUgS2VybWl0IFByb2plY3QgLSBDb2x1bWJpYSBVbml2ZXJzaXR5CisKKwkgICAgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LyAtIGtlcm1pdEBjb2x1bWJpYS5lZHUKKworCisgIENvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisKKworRE9DVU1FTlRBVElPTgorCisgIEMtS2VybWl0IGlzIGRvY3VtZW50ZWQgaW4gdGhlIGJvb2sgIlVzaW5nIEMtS2VybWl0IiwgU2Vjb25kIEVkaXRpb24sIGJ5CisgIEZyYW5rIGRhIENydXogYW5kIENocmlzdGluZSBNLiBHaWFub25lLCBEaWdpdGFsIFByZXNzLCBJU0JOIDEtNTU1NTgtMTY0LTEsCisgIHN1cHBsZW1lbnRhdGVkIGJ5IFdlYi1iYXNlZCB1cGRhdGVzIGZvciBDLUtlcm1pdCA3LjAgYW5kIDguMC4KKworUExBVEZPUk1TCisgICAgICAgICAgICAgICAgICAgU2VjdXJpdHkKKyAgIE5hbWUgICAgICAgICAgICBJbmNsdWRlZCAgIExhc3QgVXBkYXRlZAorCisgICBVbml4ICAgICAgICAgICAgICAgWWVzICAgICA4LjAuMjExICAxMCBBcHIgMjAwNAorICAgKE9wZW4pVk1TICAgICAgICAgIE5vICAgICAgOC4wLjIwOCAgMTAgQXByIDIwMDQKKyAgIFdpbmRvd3MgKEs5NSkgICAgICBZZXMgICAgIDguMC4yMDggIDE0IE1hciAyMDAzICAoSzk1IDIuMSkKKyAgIE9TLzIgKEs5NSkgICAgICAgICBZZXMgICAgIDguMC4yMDggIDE0IE1hciAyMDAzICAoSzk1IDIuMSkKKyAgIERHIEFPUy9WUyAgICAgICAgICBObyAgICAgIDcuMC4xOTYgICAxIEphbiAyMDAwCisgICBTdHJhdHVzIFZPUyAgICAgICAgTm8gICAgICA3LjAuMTk2ICAgMSBKYW4gMjAwMAorICAgQmVsbCBQbGFuIDkgICAgICAgIE5vICAgICAgNy4wLjE5NiAgIDEgSmFuIDIwMDAKKyAgIE1pY3Jvd2FyZSBPUy05ICAgICBObyAgICAgIDcuMC4xOTYgICAxIEphbiAyMDAwCisgICBDb21tb2RvcmUgQW1pZ2EgICAgTm8gICAgICA3LjAuMTk2ICAgMSBKYW4gMjAwMAorICAgTWFjaW50b3NoICAgICAgICAgIE5vICAgICAgNUEoMTkwKSAgMTYgQXVnIDE5OTQgIChNYWMgS2VybWl0IDAuOTkxKQorICAgQXRhcmkgU1QgICAgICAgICAgIE5vICAgICAgNUEoMTg5KSAgMzAgSnVuIDE5OTMKKworUVVJQ0sgU1RBUlQgRk9SIEZUUCBVU0VSUworCisgIElmIHlvdSBoYXZlIGEgV2ViIGJyb3dzZXIsIGdvIHRvOgorCisgICAgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorCisgIEFuZCB0YWtlIGl0IGZyb20gdGhlcmUuICBPdGhlcndpc2UuLi4KKworICBUaGUgZGVmaW5pdGl2ZSBGVFAgc291cmNlIGZvciBLZXJtaXQgc29mdHdhcmUgaXMga2VybWl0LmNvbHVtYmlhLmVkdS4KKyAgS2VybWl0IHNvZnR3YXJlIG9idGFpbmVkIGZyb20gb3RoZXIgRlRQIHNpdGVzIGlzIG5vdCBuZWNlc3NhcmlseSBjb21wbGV0ZQorICBvciB1cCB0byBkYXRlLCBhbmQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZC4KKworQy1LZXJtaXQgZm9yIFVOSVggY29tcHV0ZXJzIHRoYXQgaGF2ZSBhIEMgY29tcGlsZXIgYW5kICdtYWtlJyBwcm9ncmFtOgorCisgIERpcmVjdG9yeSBrZXJtaXQvYXJjaGl2ZXMsIGJpbmFyeSBtb2RlLCBmaWxlIGNrdTIxMS50YXIuWiBvciBja3UyMTEudGFyLmd6CisKKyAgVGhpcyBpcyBhIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUgb2YgVU5JWCBDLUtlcm1pdCBzb3VyY2UgY29kZSwgbWFrZWZpbGUsIGFuZAorICBvdGhlciBmaWxlcy4gIEl0IHVucGFja3MgaW50byBpdHMgY3VycmVudCBkaXJlY3RvcnksIHNvIGRvd25sb2FkIGl0IGludG8gYQorICBmcmVzaCBkaXJlY3RvcnkuICBUcmFuc2ZlciBpbiBiaW5hcnkgbW9kZSwgdW5jb21wcmVzcyAob3IgZ3VuemlwKSwgdW50YXIgKHRhcgorICB4dmYgY2t1MjExLnRhciksIGFuZCB0aGVuIGdpdmUgdGhlIGFwcHJvcHJpYXRlICJtYWtlIiBjb21tYW5kIHRvIGJ1aWxkIGZvcgorICB5b3VyIFVOSVggc3lzdGVtOyByZWFkIHRoZSBjb21tZW50cyBpbiB0aGUgbWFrZWZpbGUgYW5kIGNrdWlucy50eHQgZm9yCisgIGZ1cnRoZXIgaW5mby4KKworQy1LZXJtaXQgZm9yIFZNUzoKKworICBJZiB5b3UgaGF2ZSBWTVMgVU5aSVAsIGdldCB0aGUgZmlsZSBrZXJtaXQvYXJjaGl2ZXMvY2t2MjExLnppcCBpbiBiaW5hcnkKKyAgbW9kZSwgdW56aXAsIGFuZCBidWlsZCB3aXRoIENLVktFUi5DT00uCisKK090aGVyczogIEluIHRoZSBrZXJtaXQvZiBvciBrZXJtaXQvdGVzdCBkaXJlY3RvcmllcyB1bmRlciB0aGUgYXBwcm9wcmlhdGUKK3ByZWZpeGVzLCBleHBsYWluZWQgYmVsb3cuCisKKworSU5TVEFMTEFUSU9OCisKK0luc3RhbGxhdGlvbiBwcm9jZWR1cmVzIGRlcGVuZCBvbiB0aGUgc3lzdGVtLiAgUGxlYXNlIHJlYWQgdGhlIENLP0lOUy5UWFQsCitpZiBhbnksIGZpbGUgZm9yIHlvdXIgc3lzdGVtICg/PVUgZm9yIFVOSVgsIFYgZm9yIFZNUywgZXRjKS4gIFBsZWFzZSBub3RlCit0aGUgbmFtaW5nIGFuZCBwbGFjZW1lbnQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmaWxlczoKKworICBDS0VSTUlULklOSQorICAgIFRoZSBzdGFuZGFyZCBpbml0aWFsaXphdGlvbiBmaWxlLiAgUGxlYXNlIGxlYXZlIGl0IGFzIGlzIHVubGVzcyB5b3UKKyAgICBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBhbmQgKGlmIHlvdSBhcmUgY2hhbmdpbmcgaXQgb3IgcmVwbGFjaW5nIGl0CisgICAgZm9yIG90aGVycyB0byB1c2UpIHlvdSBhcmUgcHJlcGFyZWQgdG8gc3VwcG9ydCBpdC4gIFJlbmFtZSB0aGlzIGZpbGUKKyAgICB0byAua2VybXJjIGluIFVOSVgsIE9TLTksIEJlQm94LCBvciBQbGFuIDkuICBJbiBTdHJhdHVzIFZPUywgcmVuYW1lCisgICAgaXQgY2tlcm1pdC5pbmkgKGxvd2VyY2FzZSkuICBPbiBtdWx0aXVzZXIgc3lzdGVtcywgaXQgZ29lcyBlaXRoZXIgaW4gdGhlCisgICAgKG9yIEVBQ0gpIHVzZXIncyBob21lIChsb2dpbikgZGlyZWN0b3J5LCBvciBlbHNlIGluIGEgY29tbW9uIHNoYXJlZAorICAgIHBsYWNlIGlmIEMtS2VybWl0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gbG9vayBpbiB0aGF0IHBsYWNlIChzZWUKKyAgICBja2NjZmcudHh0IGZvciBkZXRhaWxzKS4KKworICBDS0VSTU9ELklOSQorICAgIEEgKnNhbXBsZSogY3VzdG9taXphdGlvbiBmaWxlLiAgT24gbXVsdGl1c2VyIE9TJ3MsIGEgY29weSBvZiB0aGlzIGZpbGUKKyAgICBnb2VzIGluIGVhY2ggdXNlcidzIGhvbWUgZGlyZWN0b3J5LCBhbmQgdGhlbiBlYWNoIHVzZXIgZWRpdHMgaXQgdG8gc3VpdAorICAgIGhlciBuZWVkcyBhbmQgcHJlZmVyZW5jZXM7IGUuZy4gYnkgZGVmaW5pbmcgbWFjcm9zIGZvciB0aGVpciBjb21tb24KKyAgICBjb25uZWN0aW9ucy4KKworICBESUFMSU5HIERJUkVDVE9SSUVTCisgICAgRGlhbGluZyBkaXJlY3RvcnkgZmlsZXMgY2FuIGJlIHN5c3RlbS13aWRlLCBwZXItZ3JvdXAsIG9yIHBlci11c2VyLCBvcgorICAgIGFueSBjb21iaW5hdGlvbi4gIEZvciBleGFtcGxlLCB0aGVyZSBjYW4gYmUgYSBjb3Jwb3JhdGUgd2lkZSBkaXJlY3RvcnkKKyAgICBzaGFyZWQgYnkgYWxsIHVzZXJzLCBhIHN1cHBsZW1lbnRhbCBkaXJlY3RvcnkgZm9yIGVhY2ggZGl2aXNpb24gb3IKKyAgICBkZXBhcnRtZW50LCBhbmQgYSBwZXJzb25hbCBkaXJlY3RvcnkgZm9yIGVhY2ggdXNlci4gIFNpbXBseSBiZSBzdXJlIHRoZQorICAgIGRpYWxpbmcgZGlyZWN0b3J5IGZpbGVzIGFyZSBpZGVudGlmaWVkIGEgU0VUIERJQUwgRElSRUNUT1JZIGNvbW1hbmQgaW4KKyAgICB0aGUgdXNlcidzIChvciB0aGUgc3lzdGVtLXdpZGUpIEMtS2VybWl0IGluaXRpYWxpemF0aW9uIGZpbGUsIG9yIGluIHRoZQorICAgIGVudmlyb25tZW50IHZhcmlhYmxlIChsb2dpY2FsIG5hbWUsIHN5bWJvbCkgS19ESUFMX0RJUkVDVE9SWS4gIChUaGUKKyAgICBzdGFuZGFyZCBpbml0aWFsaXphdGlvbiBmaWxlIGxvb2tzIGJ5IGRlZmF1bHQgaW4gdGhlIHVzZXIncyBob21lIG9yIGxvZ2luCisgICAgZGlyZWN0b3J5LikgIFdoZW4gaW5zdGFsbGluZyBDLUtlcm1pdCBvbiBtdWx0aXVzZXIgcGxhdGZvcm1zIGZyb20gd2hpY2gKKyAgICB1c2VycyB3aWxsIGRpYWwgb3V0LCB5b3UgY2FuIGFsc28gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgYXJlYQorICAgIGNvZGUsIGNvdW50cnkgY29kZSwgYW5kIHRoZSB2YXJpb3VzIGRpYWxpbmcgcHJlZml4ZXMgYXMgZGVzY3JpYmVkIG9uIHBhZ2UKKyAgICA0Nzggb2YgIlVzaW5nIEMtS2VybWl0IiAoc2Vjb25kIGVkaXRpb24pLCBzbyB1c2VycyBkb24ndCBoYXZlIHRvIHdvcnJ5CisgICAgYWJvdXQgZGVmaW5pbmcgdGhlc2UgaXRlbXMgdGhlbXNlbHZlcy4gICBOZXR3b3JrIGRpcmVjdG9yaWVzIGFuZCBzZXJ2aWNlCisgICAgZGlyZWN0b3JpZXMgY2FuIGFsc28gYmUgc2V0IHVwIGluIGEgc2ltaWxhciBtYW5uZXIuCisKKyAgRE9DVU1FTlRBVElPTgorICAgIEluIFVOSVgsIHRoZSBnZW5lcmFsIEMtS2VybWl0IG1hbiBwYWdlIChvciBvbmUgb2YgdGhlIHZlcnNpb25zIHRhaWxvcmVkCisgICAgZm9yIGEgc3BlY2lmaWMgcGxhdGZvcm0sIGxpa2UgSFAtVVggb3IgU29sYXJpcykgc2hvdWxkIGJlIGluc3RhbGxlZCBpbgorICAgIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4gIEluIFZNUywgdGhlIFZNUyBoZWxwIHRvcGljIChDS1ZLRVIuSExQKSBzaG91bGQKKyAgICBiZSBpbnN0YWxsZWQgYXMgZGVzY3JpYmVkIGluIENLVklOUy5UWFQuICBQbGFpbi10ZXh0IGRvY3VtZW50YXRpb24gc3VjaAorICAgIGFzIENLRVJNSVQyLlRYVCBzaG91bGQgYmUgcHV0IGluIHdoYXRldmVyIHBsYWNlIHBlb3BsZSBhcmUgYWNjdXN0b21lZAorICAgIHRvIGxvb2tpbmcuCisKK0ZJTEVTIEFORCBGSUxFIE5BTUlORyBDT05WRU5USU9OUworCitDLUtlcm1pdCBpcyBhIGZhbWlseSBvZiBLZXJtaXQgcHJvZ3JhbXMgZm9yIG1hbnkgZGlmZmVyZW50IGNvbXB1dGVyIHN5c3RlbXMuCitUaGUgcHJvZ3JhbSBzaGFyZXMgYSBjb21tb24gc2V0IG9mIHN5c3RlbS1pbmRlcGVuZGVudCBmaWxlIHRyYW5zZmVyIHByb3RvY29sCittb2R1bGVzLCB3cml0dGVuIGluIHRoZSBDIGxhbmd1YWdlLiAgU3lzdGVtLWRlcGVuZGVudCBvcGVyYXRpb25zIGFyZSBjb2xsZWN0ZWQKK2ludG8gc3lzdGVtLXNwZWNpZmljIG1vZHVsZXMgZm9yIGVhY2ggc3lzdGVtLgorCitDLUtlcm1pdCBmaWxlIG5hbWVzIGFsbCBzdGFydCB3aXRoIHRoZSBsZXR0ZXJzICJDSyIsIGZvbGxvd2VkIGJ5IGEgc2luZ2xlCitsZXR0ZXIgaW5kaWNhdGluZyB0aGUgc3ViZ3JvdXAuICBXaGVuIHJlZmVycmluZyB0byB0aGVzZSBmaWxlcyBpbiB0aGUgVU5JWCwKK0FPUy9WUywgb3IgVk9TIGVudmlyb25tZW50cywgdXNlIGxvd2VyY2FzZSBsZXR0ZXJzLCByYXRoZXIgdGhhbiB0aGUgdXBwZXJjYXNlCitsZXR0ZXJzIHNob3duIGhlcmUuICBTdWJncm91cHM6CisKKyAgXzogU2VjdXJpdHkvQXV0aGVudGljYXRpb24vRW5jcnlwdGlvbiBjb2RlLCBwb3NzaWJseSByZWd1bGF0ZWQgYnkgbGF3CisgIGE6IEdlbmVyYWwgZGVzY3JpcHRpdmUgbWF0ZXJpYWwgYW5kIGRvY3VtZW50YXRpb24KKyAgYjogQk9PIGZpbGUgZW5jb2RlcnMgYW5kIGRlY29kZXJzIChvYnNvbGV0ZSkKKyAgYzogQWxsIHBsYXRmb3JtcyB3aXRoIEMgY29tcGlsZXJzCisgIGQ6IERhdGEgR2VuZXJhbCBBT1MvVlMKKyAgZTogUmVzZXJ2ZWQgZm9yICJja2VybWl0IiBmaWxlcywgbGlrZSBDS0VSTUlULklOSSwgQ0tFUk1JVDgwLlRYVAorICBmOiAocmVzZXJ2ZWQpCisgIGc6IChyZXNlcnZlZCkKKyAgaDogKHJlc2VydmVkKQorICBpOiBDb21tb2RvcmUgQW1pZ2EgKEludHVpdGlvbikKKyAgajogKHVudXNlZCkKKyAgazogKHVudXNlZCkKKyAgbDogU3RyYXR1cyBWT1MKKyAgbTogTWFjaW50b3NoIHdpdGggTWFjIE9TCisgIG46IE1pY3Jvc29mdCBXaW5kb3dzIE5UCisgIG86IE9TLzIgYW5kL29yIE1pY3Jvc29mdCBXaW5kb3dzIDk1Lzk4L01FL05ULzIwMDAvWFAvLi4uCisgIHA6IEJlbGwgTGFicyBQbGFuIDkKKyAgcTogKHJlc2VydmVkKQorICByOiBERUMgUERQLTExIHdpdGggUlNUUy9FIChyZXNlcnZlZCkKKyAgczogQXRhcmkgU1QgR0VNRE9TIChsYXN0IHN1cHBvcnRlZCBpbiB2ZXJzaW9uIDVBKDE4OSkpCisgIHQ6IERFQyBQRFAtMTEgd2l0aCBSVC0xMSAocmVzZXJ2ZWQpCisgIHU6IFVOSVggb3IgZW52aXJvbm1lbnRzIHdpdGggVU5JWC1saWtlIEMgbGlicmFyaWVzCisgIHY6IFZNUyBhbmQgT3BlblZNUworICB3OiBXYXJ0IChMZXgtbGlrZSBwcmVwcm9jZXNzb3IsIHVzZWQgd2l0aCBhbGwgc3lzdGVtcykKKyAgeDogKHJlc2VydmVkKQorICB5OiAocmVzZXJ2ZWQpCisgIHo6IChyZXNlcnZlZCkKKyAgMC0zOiAocmVzZXJ2ZWQpCisgIDQ6IElCTSBBUy80MDAgKHJlc2VydmVkKQorICA1LTg6IChyZXNlcnZlZCkKKyAgOTogTWljcm93YXJlIE9TLTkKKworRXhhbXBsZXM6CisKKyAgY2thYWFhLnR4dCAtIFRoaXMgZmlsZQorICBja3VmaW8uYyAgIC0gRmlsZSBpL28gZm9yIFVOSVgKKyAgY2tzdGlvLmMgICAtIENvbW11bmljYXRpb25zIGkvbyBmb3IgdGhlIEF0YXJpIFNUCisgIG1ha2VmaWxlICAgLSBtYWtlZmlsZSBmb3IgYnVpbGRpbmcgVU5JWCBDLUtlcm1pdAorICBja3BrZXIubWsgIC0gbWFrZWZpbGUgZm9yIGJ1aWxkaW5nIFBsYW4gOSBDLUtlcm1pdAorICBja3ZrZXIuY29tIC0gYnVpbGQgcHJvY2VkdXJlIGZvciBWTVMgQy1LZXJtaXQKKworSU1QT1JUQU5UIEZJTEVTICh1c2UgbG93ZXJjYXNlIG5hbWVzIG9uIFVOSVgsIFZPUywgb3IgQU9TL1ZTKToKKworICBja2FhYWEudHh0ICAtIFRoaXMgZmlsZSAob3ZlcnZpZXcgb2YgdGhlIEMtS2VybWl0IGZpbGVzKS4KKyAgICAgICAgICAgICAgICBGb3Igc3lzdGVtLXNwZWNpZmljIGRpc3RyaWJ1dGlvbnMsIHRoaXMgd2lsbCBub3JtYWxseQorICAgICAgICAgICAgICAgIGJlIHJlcGxhY2VkIGJ5IGEgc3lzdGVtLXNwZWNpZmljIFJFQUQuTUUgZmlsZS4KKworICBja2VybWl0NzAudHh0IC0gVXBkYXRlczogU3VwcGxlbWVudCB0byAiVXNpbmcgQy1LZXJtaXQiLCAybmQgRWQsIGZvciA3LjAuCisgIGNrZXJtaXQ4MC50eHQgLSBVcGRhdGVzOiBTdXBwbGVtZW50IHRvICJVc2luZyBDLUtlcm1pdCIsIDJuZCBFZCwgZm9yIDguMC4KKyAgY2t1dHV0b3IudHh0ICAtIEMtS2VybWl0IFR1dG9yaWFsIGZvciBVbml4IChwbGFpbiB0ZXh0KQorICBja2Nid3IudHh0ICAtICJCZXdhcmUgZmlsZSIgKGxpbWl0YXRpb25zLCBrbm93biBidWdzLCBoaW50cyksIGdlbmVyYWwuCisgIGNrZXJtaXQuaW5pIC0gU3RhbmRhcmQgaW5pdGlhbGl6YXRpb24gZmlsZSAocmVuYW1lIHRvIC5rZXJtcmMgaW4gVU5JWCwgT1MtOSkKKyAgY2tlcm1vZC5pbmkgLSBTYW1wbGUgY3VzdG9taXphdGlvbiBmaWxlIChyZW5hbWUgdG8gLm15a2VybXJjIGluIFVOSVgsIE9TLTkpCisKK1RoZSBmb2xsb3dpbmcgY2FuIGJlIGZvdW5kIGF0IHRoZSBLZXJtaXQgRlRQIHNpdGU6CisKKyAgY2tlcm1pdC5rZGQgLSBTYW1wbGUgZGlhbGluZyBkaXJlY3RvcnkgZmlsZSAocmVuYW1lIHRvIC5rZGQgaW4gVU5JWCwgT1MtOSkKKyAgY2tlcm1pdC5rbmQgLSBTYW1wbGUgZGlhbGluZyBkaXJlY3RvcnkgZmlsZSAocmVuYW1lIHRvIC5rbmQgaW4gVU5JWCwgT1MtOSkKKyAgY2tlcm1pdC5rc2QgLSBTYW1wbGUgc2VydmljZXMgZGlyZWN0b3J5IGZpbGUgKHJlbmFtZSB0byAua3NkIGluIFVOSVgsIE9TLTkpCisgIGNrZWRlbW8ua3NjIC0gRGVtb25zdHJhdGlvbiBtYWNyb3MgZnJvbSAiVXNpbmcgQy1LZXJtaXQiCisgIGNrZXBhZ2Uua3NjIC0gRGl0dG8KKyAgY2tldnQua3NjICAgLSBEaXR0bworCitVTklYLXNwZWNpZmljIGZpbGVzOgorCisgIGNrdWlucy50eHQgLSBVTklYLXNwZWNpZmljIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCisgIGNrdWJ3ci50eHQgLSBVTklYLXNwZWNpZmljIGJld2FyZSBmaWxlLgorICBja3VrZXIubnIgIC0gIm1hbiBwYWdlIiBmb3IgVU5JWC4KKworVk1TLXNwZWNpZmljIGZpbGVzOgorCisgIGNrdmlucy50eHQgLSBWTVMtc3BlY2lmaWMgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KKyAgY2t2YndyLnR4dCAtIFZNUy1zcGVjaWZpYyBiZXdhcmUgZmlsZQorICBja3ZrZXIuaGxwIC0gVk1TIEMtS2VybWl0IEhFTFAgdG9waWMgKG5lZWRzIHVwZGF0aW5nKS4KKworREcgQU9TL1ZTLXNwZWNpZmljIGZpbGVzOgorCisgIGNrZGlucy50eHQgLSBEYXRhIEdlbmVyYWwgQU9TL1ZTIEMtS2VybWl0IGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMKKyAgY2tkYndyLnR4dCAtIEFPUy9WUyAiYmV3YXJlIiBmaWxlCisgIGNrZCouY2xpICAgLSBQcm9jZWR1cmVzIGZvciBidWlsZGluZyBBT1MvVlMgQy1LZXJtaXQKKworVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgb2YgaW50ZXJlc3QgbWFpbmx5IHRvIHByb2dyYW1tZXJzIGFuZCBoaXN0b3JpYW5zCisoZmluZCB0aGVtIGF0IHRoZSBLZXJtaXQgZnRwIHNpdGUpOgorCisgIGNrY2tlci5hbm4gLSBSZWxlYXNlIGFubm91bmNlbWVudHMuCisgIGNrY2NmZy50eHQgLSBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIChmZWF0dXJlIHNlbGVjdGlvbiksIGdlbmVyYWwuCisgIGNrY3BsbS50eHQgLSBQcm9ncmFtIGxvZ2ljIG1hbnVhbCAoZm9yIHByb2dyYW1tZXJzKS4KKyAgY2tjMjExLnR4dCAtIFByb2dyYW0gdXBkYXRlIGhpc3RvcnkgZm9yIGVkaXQgMjAxLTIxMS4KKyAgY2tjMjAwLnR4dCAtIFByb2dyYW0gdXBkYXRlIGhpc3RvcnkgZm9yIGVkaXQgMTk4LTIwMCAoYmlnKQorICBja2MxOTcudHh0IC0gUHJvZ3JhbSB1cGRhdGUgaGlzdG9yeSBmb3IgZWRpdCAxOTUtMTk3IChiaWcpCisgIGNrYzE5MC50eHQgLSBQcm9ncmFtIHVwZGF0ZSBoaXN0b3J5IGZvciBlZGl0cyAxODktMTkwIChiaWcpLgorICBja2MxODgudHh0IC0gUHJvZ3JhbSB1cGRhdGUgaGlzdG9yeSwgZWRpdHMgMTc5LTE4OCAoYmlnKS4KKyAgY2tjMTc4LnR4dCAtIFByb2dyYW0gZWRpdCBoaXN0b3J5LCA1QSBlZGl0cyB0aHJvdWdoIDE3OCAodmVyeSBiaWcpLgorICBja2N2NGYudHh0IC0gUHJvZ3JhbSBlZGl0IGhpc3RvcnksIHZlcnNpb24gNEYuCisgIGNrY3Y0ZS50eHQgLSBQcm9ncmFtIGVkaXQgaGlzdG9yeSwgdmVyc2lvbiA0RS4KKworQklOQVJJRVMKKworSWYgeW91IGhhdmUgRlRQIGFjY2VzcyB0byBrZXJtaXQuY29sdW1iaWEuZWR1IChhbHNvIGtub3duIGFzCitrZXJtaXQuY2MuY29sdW1iaWEuZWR1LCBmdHAuY2MuY29sdW1iaWEuZWR1KSwgeW91IGNhbiBhbHNvIHJldHJpZXZlIHZhcmlvdXMKK0MtS2VybWl0IGJpbmFyaWVzIGZyb20gdGhlIGRpcmVjdG9yeSBrZXJtaXQvYmluL2NrKi4qLCBvciBtb3JlIGNvbnZlbnRpZW50bHkKK2Zyb20gdGhlIHdlYiBwYWdlOgorCisgIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9jazgwYmluYXJpZXMuaHRtbAorCitUZXN0IHZlcnNpb25zIHdvdWxkIGJlIGluIGtlcm1pdC90ZXN0L2Jpbi9jayouKi4gIEJlIHN1cmUgdG8gdHJhbnNmZXIgdGhlc2UKK2ZpbGVzIGluIGJpbmFyeSBtb2RlLiAgVGhlIFJFQUQuTUUgZmlsZSBpbiB0aGF0IGRpcmVjdG9yeSBleHBsYWlucyB3aGF0J3MKK3doYXQuCisKK1NPVVJDRSBGSUxFUworCitUaGUgc291cmNlIGZpbGVzIGZvciB0aGUgVU5JWCB2ZXJzaW9uIChhbGwgVU5JWCB2ZXJzaW9ucykgYXJlIGF2YWlsYWJsZSBpbgora2VybWl0L2FyY2hpdmVzL2NrdU5OTi50YXIuWiwgYXBwcm94aW1hdGVseSAxTUIgaW4gc2l6ZS4gIFRyYW5zZmVyIHRoaXMgZmlsZQoraW4gYmluYXJ5IG1vZGUuICBUaGlzIGlzIGEgY29tcHJlc3NlZCB0YXIgYXJjaGl2ZS4gIFRoZXJlIGlzIGFsc28gYSBnemlwJ2QKK3ZlcnNpb24sIGNrdTIxMS50YXIuZ3ouICBUbyBnZXQgdGhlIGJpbmFyeSB0YXIgYXJjaGl2ZToKKworICBta2RpciBrZXJtaXQgICAgICAgICAgICAgICAgICAgKGF0IHNoZWxsIHByb21wdCwgbWFrZSBhIEtlcm1pdCBkaXJlY3RvcnkpCisgIGNkIGtlcm1pdCAgICAgICAgICAgICAgICAgICAgICAobWFrZSBpdCB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5KQorCisgIGZ0cCBrZXJtaXQuY29sdW1iaWEuZWR1ICAgICAgICAobWFrZSBhbiBmdHAgY29ubmVjdGlvbikKKyAgdXNlcjogYW5vbnltb3VzICAgICAgICAgICAgICAgIChsb2cgaW4gYXMgdXNlciAiYW5vbnltb3VzIiwgbG93ZXIgY2FzZSEpCisgIHBhc3N3b3JkOiAgICAgICAgICAgICAgICAgICAgICAodXNlIHlvdXIgZW1haWwgaWQgYXMgYSBwYXNzd29yZCkKKyAgY2Qga2VybWl0L2FyY2hpdmVzICAgICAgICAgICAgIChnbyB0byB0aGUgYXJjaGl2ZXMgZGlyZWN0b3J5KQorICB0eXBlIGJpbmFyeSAgICAgICAgICAgICAgICAgICAgKHNwZWNpZnkgYmluYXJ5IGZpbGUgdHJhbnNmZXIpCisgIGdldCBja3UyMTEudGFyLlogICAgICAgICAgICAgICAoZ2V0IHRoZSB0YXIgYXJjaGl2ZSkgKG9yIGdldCBja3UxOTIudGFyLmd6KQorICBieWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpc2Nvbm5lY3QgYW5kIGV4aXQgZnJvbSBmdHApCisKKyAgdW5jb21wcmVzcyBja3UyMTEudGFyLlogICAgICAgIChhdCB0aGUgc2hlbGwgcHJvbXB0LCB1bmNvbXByZXNzIHRoZSBhcmNoaXZlKQorICB0YXIgeHZmIGNrdTIxMS50YXIgICAgICAgICAgICAgKGV4dHJhY3QgdGhlIGZpbGVzIGZyb20gdGhlIHRhciBhcmNoaXZlKQorICBtYWtlIHh4eCAgICAgICAgICAgICAgICAgICAgICAgKGJ1aWxkIEMtS2VybWl0IGZvciB5b3VyIHN5c3RlbSkKKworKHdoZXJlICJ4eHgiIGlzIHRoZSBtYWtlZmlsZSBlbnRyeSBhcHByb3ByaWF0ZSBmb3IgeW91ciBzeXN0ZW0uKQorCitBbGwgQy1LZXJtaXQgc291cmNlIGFuZCBvdGhlciB0ZXh0IGZpbGVzIGFyZSBhbHNvIGtlcHQgc2VwYXJhdGVseSBpbiB0aGUKK2tlcm1pdC9mIGRpcmVjdG9yeS4gIFRoZSBmaWxlcyBuZWNlc3NhcnkgdG8gYnVpbGQgYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uCitvZiBDLUtlcm1pdCBhcmUgbGlzdGVkIGluIHRoZSBhcHByb3ByaWF0ZSBtYWtlZmlsZSBvciBlcXVpdmFsZW50OgorCisgICAgICAgVU5JWDogbWFrZWZpbGUgKG9yIHJlbmFtZSBja3VrZXIubWFrIHRvIG1ha2VmaWxlKQorICAgMi4xMSBCU0Q6IGNrdWJzMi5tYWsgKHJlbmFtZSB0byBtYWtlZmlsZSksIGNrdXN0ci5zZWQKKyAgICAgUGxhbiA5OiBja3BrZXIubWsgIChyZW5hbWUgdG8gbWtmaWxlKQorICBNYWNpbnRvc2g6IGNrbWtlci5tYWsgKHJlbmFtZSB0byBrZXJtaXQubWFrZSwgdXNlIE1QVyBDIDMuMikKKyAgICAgICAgVk1TOiBDS1ZLRVIuQ09NIChEQ0wpIChhbmQgb3B0aW9uYWxseSBhbHNvIENLVktFUi5NTVMpCisgICAgICAgICAgICAgb3IgQ0tWT0xELkNPTSAoZm9yIFZNUyA0LngpCisgICAgICBBbWlnYTogQ0tJS0VSLk1BSyAoQXp0ZWMgQykgb3IgQ0tJU0FTLk1BSyAoU0FTIEMpCisgICBBdGFyaSBTVDogQ0tTS0VSLk1BSworICAgICAgIE9TLTk6IGNrOWtlci5tYWsgb3IgY2s5a2VyLmdjYworICAgICBBT1MvVlM6IGNrZG1hay5jbGksIGNrZGNjLmNsaSwgY2tkbG5rLmNsaQorU3RyYXR1cyBWT1M6IGNrbG1hay5jbQorCitNaW5pbWFsIHNvdXJjZSBmaWxlcyBmb3IgYnVpbGRpbmcgc2VsZWN0ZWQgdmVyc2lvbnMgKHRoZXNlIHBhdHRlcm5zIGdldCBhbGwKK3RoZSBmaWxlcyB5b3UgbmVlZCwgYW5kIGluIHNvbWUgY2FzZXMgbWF5YmUgYSBmZXcgZXh0cmEpOgorCisgICBVTklYOiAgIGNrW2N1d10qLltjd2hdICAoaW5jbHVkaW5nIFFOWCwgUGxhbiA5LCBhbmQgQmVCb3gpCisgICBVTklYOiAgIGNrW2N1d19dKi5bY3doXSAoVW5peCB3aXRoIHNlY3VyaXR5IG1vZHVsZXMpCisgICBWTVM6ICAgIGNrW2N1d3ZdKi5bY3doXQorICAgTWFjOiAgICBja1tjdXdtXSouW2N3aHJdCisgICBBT1MvVlM6IGNrW2N1d2RdKi5bY3doXQorICAgVk9TOiAgICBja1tjd2hsXSouW2N3aF0KKyAgIEFtaWdhOiAgY2tbY3V3aV0qLltjd2hdCisgICBBdGFyaTogIGNrW2N1d3NdKi5bY3doXQorICAgT1MtOTogICBja1tjdXc5XSouW2N3aGFdCisKK0ZvciBhIGRldGFpbGVkLCBzcGVjaWZpYyBzb3VyY2UgZmlsZSBsaXN0IGZvciB0aGlzIEMtS2VybWl0IHJlbGVhc2UsIHNlZSB0aGUKK2ZpbGUgY2tjeHh4LnR4dCwgd2hlcmUgeHh4IGlzIHRoZSBjdXJyZW50IEMtS2VybWl0IGVkaXQgbnVtYmVyLCBzdWNoIGFzIDIxMS4KKworRmluYWxseSwgaGVyZSBpcyBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIEMtS2VybWl0IGZpbGUgbmFtaW5nCitjb252ZW50aW9ucy4gIEEgQy1LZXJtaXQgZmlsZW5hbWUgaGFzIHRoZSBmb3JtOgorCisgIENLPHN5c3RlbT48d2hhdD4uPHR5cGU+CisKK3doZXJlOgorCis8c3lzdGVtPiBpcyBkZXNjcmliZWQgZWFybGllciBpbiB0aGlzIGZpbGU7CisKKzx0eXBlPiBpcyB0aGUgZmlsZSB0eXBlICh1c2UgbG93ZXJjYXNlIG9uIFVOSVgsIFZPUywgb3IgQU9TL1ZTKToKKworICBjOiAgIEMgbGFuZ3VhZ2Ugc291cmNlCisgIGg6ICAgSGVhZGVyIGZpbGUgZm9yIEMgbGFuZ3VhZ2Ugc291cmNlCisgIHc6ICAgV2FydCBwcmVwcm9jZXNzb3Igc291cmNlLCBjb252ZXJ0ZWQgYnkgV2FydCAob3IgTGV4KSB0byBhIEMgcHJvZ3JhbQorICByOiAgIE1hY2ludG9zaCByZXNvdXJjZSBmaWxlICg4LWJpdCB0ZXh0KQorICBhOiAgIEFzc2VtYmxlciBzb3VyY2UKKworICB0eHQ6IFBsYWluIHRleHQuCisgIG5yOiAgTnJvZmYvVHJvZmYgdGV4dCBmb3JtYXR0ZXIgc291cmNlIGZvciBVTklYICJtYW4gcGFnZSIKKyAgbXNzOiBTY3JpYmUgdGV4dCBmb3JtYXR0ZXIgc291cmNlCisgIHBzOiAgVHlwZXNldCBtYXRlcmlhbCB0byBiZSBwcmludGVkIG9uIGEgUG9zdFNjcmlwdCBwcmludGVyCisgIGhscDogQSBWTVMgSGVscCB0b3BpYworCisgIGluaTogSW5pdGlhbGl6YXRpb24gZmlsZQorICBrc2M6IEEgS2VybWl0IFNjcmlwdCB0byBiZSBleGVjdXRlZCBieSB0aGUgVEFLRSBjb21tYW5kCisgIGtkZDogQSBLZXJtaXQgRGlhbGluZyBEaXJlY3RvcnkKKyAga25kOiBBIEtlcm1pdCBOZXR3b3JrIERpcmVjdG9yeQorICBrc2Q6IEEgS2VybWl0IFNlcnZpY2VzIERpcmVjdG9yeQorCisgIG1hazogQSBNYWtlZmlsZSBvciBvdGhlciBidWlsZCBwcm9jZWR1cmUgKG9mdGVuIG5lZWRzIHJlbmFtaW5nKQorICBjb206IChWTVMgb25seSkgYSBEQ0wgY29tbWFuZCBwcm9jZWR1cmUKKyAgY2xpOiAoQU9TL1ZTIG9ubHkpIGEgY29tbWFuZCBwcm9jZWR1cmUKKyAgY21kOiAoT1MvMiBvbmx5KSBhIFJleHggY29tbWFuZCBwcm9jZWR1cmUKKworICBib286ICJib28iLWVuY29kZWQgZXhlY3V0YWJsZSBwcm9ncmFtLCBkZWNvZGUgd2l0aCBDS0JVTkIgcHJvZ3JhbS4KKyAgaGV4OiAiaGV4Ii1lbmNvZGVkIGV4ZWN1dGFibGUgcHJvZ3JhbSwgZGVjb2RlIHdpdGggQ0tWREVIIHByb2dyYW0gKFZNUyBvbmx5KS4KKyAgaHF4OiBCaW5IZXgnZCBNYWNpbnRvc2ggS2VybWl0IHByb2dyYW0sIGRlY29kZSB3aXRoIEJpbkhleCB2ZXJzaW9uIDQuMC4KKyAgdXVlOiBBIHV1ZW5jb2RlZCBiaW5hcnkgZmlsZSwgZGVjb2RlIHdpdGggdXVkZWNvZGUgb3IgKERHIG9ubHkpIENLREVDTy4KKworICBkZWY6IEFuIE9TLzIgbGlua2VyIGRlZmluaXRpb25zIGZpbGUuCisgIHNoOiAgQSBVTklYIHNoZWxsIHNjcmlwdC4KKyAgc2VkOiBBIFVOSVggc2VkIChlZGl0b3IpIHNjcmlwdC4KKyAgc3RyOiBBIGZpbGUgb2YgY2hhcmFjdGVyIHN0cmluZ3MgZXh0cmFjdGVkIGZyb20gQy1LZXJtaXQgKEJTRCAyLjF4IG9ubHkpLgorCis8d2hhdD4gaXMgbW5lbW9uaWMgKHVwIHRvIDMgY2hhcmFjdGVycykgZm9yIHdoYXQncyBpbiB0aGUgZmlsZToKKworTk9URTogQWZ0ZXIgQy1LZXJtaXQgNi4wLCB0ZXh0IGZpbGV0eXBlcyBzdWNoIGFzIC5ET0MgYW5kIC5ITFAgd2VyZSBjaGFuZ2VkCit0byAuVFhUIHRvIGF2b2lkIGNvbmZ1c2lvbiBpbiBXaW5kb3dzLWJhc2VkIFdlYiBicm93c2Vycywgd2hpY2ggd291bGQKK290aGVyd2lzZSBtaXN0YWtlIHRoZW0gZm9yIE1pY3Jvc29mdCBXb3JkIG9yIFdpbmRvd3MgSGVscCBkb2N1bWVudHMuCisKKyAgYWFhOiBBICJyZWFkLW1lIiBmaWxlLCBsaWtlIHRoaXMgb25lCisgIGluczogSW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBvciBwcm9jZWR1cmVzCisgIGJ3cjogIkJld2FyZSIgZmlsZSAtLSB0aGluZ3MgdG8gd2F0Y2ggb3V0IGZvciwgaGludHMgYW5kIHRpcHMKKyAgcGxtOiBQcm9ncmFtIExvZ2ljIE1hbnVhbAorICBrZXI6IEdlbmVyYWwgQy1LZXJtaXQgZGVmaW5pdGlvbnMsIGluZm9ybWF0aW9uLCBkb2N1bWVudGF0aW9uCisKKyAgbm5uOiBEaWdpdHM6IEMtS2VybWl0IGVkaXQgbnVtYmVyIChlLmcuIGNrdTIxMS50YXIuZ3opCisgIGNtZDogQ29tbWFuZCBwYXJzaW5nCisgIGNvbjogQ09OTkVDVCBjb21tYW5kCisgIGNuczogQ09OTkVDVCBjb21tYW5kIChVTklYIG9ubHkgLSB2ZXJzaW9uIHRoYXQgdXNlcyBzZWxlY3QoKSwgbm90IGZvcmsoKSkKKyAgZGViOiBEZWJ1Zy9UcmFuc2FjdGlvbiBMb2cgZm9ybWF0cywgVHlwZWRlZnMKKyAgZGlhOiBNb2RlbS9EaWFsZXIgY29udHJvbAorICBmaW86IFN5c3RlbS1kZXBkZW5kZW50IEZpbGUgSS9PCisgIGZuczogUHJvdG9jb2wgc3VwcG9ydCBmdW5jdGlvbnMKKyAgZm4yOiBNb3JlIHByb3RvY29sIHN1cHBvcnQgZnVuY3Rpb25zIChhbmQgRk4zLCAuLi4pCisgIGxpYjogQ29tbW9uIGxpYnJhcnkgcm91dGluZXMgbW9kdWxlCisgIG1haTogTWFpbiBwcm9ncmFtCisgIG5ldDogTmV0d29yayBpL28gbW9kdWxlCisgIHBybzogUHJvdG9jb2wKKyAgc2NyOiBTQ1JJUFQgY29tbWFuZAorICB0ZWw6IFRlbG5ldCBwcm90b2NvbCBtb2R1bGUKKyAgdGlvOiBTeXN0ZW0tZGVwZW5kZW50IGNvbW11bmljYXRpb25zIGkvbyAmIGNvbnRyb2wgYW5kIGludGVycnVwdCBoYW5kaW5nCisgIHNpZzogU2lnbmFsIGhhbmRsaW5nIG1vZHVsZQorICB1c3I6IEludGVyYWN0aXZlL3NjcmlwdCB1c2VyIGludGVyZmFjZQorICB1czI6IE1vcmUgdXNlciBpbnRlcmZhY2UgKG1haW5seSBoZWxwIHRleHQpCisgIHVzMzogU3RpbGwgbW9yZSB1c2VyIGludGVyZmFjZSAoYW5kIFVTUjQsIFVTUjUsIFVTUjYsIFVTUjcpCisgIHVzeDogQ29tbW9uIHVzZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucworICB1c3k6IENvbW1hbmQtbGluZSBwYXJzaW5nCisgIHhsYTogQ2hhcmFjdGVyIHNldCB0cmFuc2xhdGlvbiBtb2R1bGUKKyAgdW5pOiBVbmljb2RlIHN1cHBvcnQKKyAgcHR5OiBQc2V1ZG90ZXJtaW5hbCBzdXBwb3J0CisgIG1kYjogTWFsbG9jLWRlYnVnZ2luZyBtb2R1bGUgKG5vdCBpbmNsdWRlZCBpbiByZWFsIGJ1aWxkcykKKyAgc3RyOiBTdHJpbmdzIG1vZHVsZSAob25seSBmb3IgMi54QlNEKQorCisoRW5kIG9mIGNrYWFhYS50eHQpCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2tjMjExLnR4dCBiL2NrZXJtaXQtOC4wLjIxMS9ja2MyMTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODY3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2tjMjExLnR4dApAQCAtMCwwICsxLDM1OTUgQEAKK0MtS0VSTUlUIENIQU5HRSBMT0cgKENoYW5nZXMgc2luY2UgOC4wLjIwMCBvZiAxMiBEZWMgMjAwMSkKKworQ2hyb25vbG9naWNhbCBvcmRlcjogR28gdG8gdGhlIGJvdHRvbSB0byBmaW5kIHRoZSBuZXdlc3QgZWRpdHMuCisKKy0tLTguMC4yMDAtLS0KKworS25vd24gYnVncyAoKyA9IGZpeGVkIGFmdGVyIHJlbGVhc2UpOgorCisgKyAxLiB0aWxkZV9leHBhbmQoKSBjYW4gY2FsbCBnZXRjd2QoKSB3aXRoIE5VTEwgYXJnLgorICsgMi4gZ2V0ZXhlZGlyKCkgY2FsbGVkIHRvbyBlYXJseSAoZmF0YWwgaW4gY29tYmluYXRpb24gd2l0aCAoMSkpLgorICsgMy4gS2VybWl0ICJnZXQgYmxhaCIgd2hlcmUgYmxhaCBpcyBhIHN5bWxpbms7IHNlcnZlciByZWZ1c2VzIHRvIHNlbmQgaXQuCisgICAgICBTaG91bGQgbm90IGRvIHRoaXMgaWYgR0VUIG5vdCByZWN1cnNpdmUuCisgPyA0LiBEYXZlIFNuZWRkb24ncyByZXBvcnQgYWJvdXQgVk1TIGZvcmUvYmFja2dyb3VuZCBjb25mdXNpb24uCisgKyA1LiBGVFAgR0VUIHBhdGgvZmlsZSBkb2Vzbid0IHdvcmsgLSBwYXRoIG5vdCBzdHJpcHBlZCAtIGJ1dCBNR0VUIHdvcmtzLgorICsgNi4gSVJJWCA1LjMgY29tcGlsYXRpb24gcHJvYmxlbXMgKGhhdmUgcGF0Y2hlcyBmcm9tIE1hcmN1cyBIZXJiZXJ0KQorIFggNy4gRmlsZW5hbWUgY29tcGxldGlvbiBidWcgKHNlZSBiZWxvdykgKGRlZmVycmVkKS4KKyArIDguIFFOWDYgaGVyYWxkIGFuZCBvdGhlciBwcm9ibGVtcy4KKworLS0tLS0tLS0tLS0tLQorCitNZXJnZWQgSmVmZidzIGNoYW5nZXMsIDIwIERlYyAyMDAxOgorCisgLiBDaGFuZ2VkIGFsbCBvY2N1cnJlbmNlcyBvZiAidHRucHJvdG8gPT0gTlBfVEVMTkVUIiB0byAiSVNfVEVMTkVUKCkiIHRvCisgICBhY2NvdW50IGZvciB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFNTSCBhbmQgVGVsbmV0LiAgY2t1c2NyLmMsCisgICBja3V1c1szNDU3XS5jLCBja2NuZXQuaCwgY2tjZm5zLmMsIGNrdWRpYS5jLCBja3V0aW8uYywgY2t1Y29uLmMsIGNrdWNucy5jLgorCisgLiBNb3ZlZCBTU0ggcHR5IGZhaWx1cmUgd2FybmluZ3MuICBja3V1c3IuYy4KKworIC4gU2VjdXJpdHkgYWRqdXN0bWVudHMgdG8gRlRQIG1vZHVsZSwgcGx1cyBmaXggYW4gZXJyb3IgbWVzc2FnZS4gIGNrY2Z0cC5jLgorCisgLiBBZGp1c3RtZW50IG9mIHNvbWUgc2VjdXJpdHktcmVsYXRlZCAjaWZkZWZzLiBja2NkZWIuaCwgY2t1dXMyLmMsIGNrY3RlbC5jLgorCisgLiBHdWFyZCBhZ2FpbnN0IGNhbGxpbmcgZ2V0cHduYW0oKSB3aXRoIGEgTlVMTCBhcmcgaW4gdGlsZGVfZXhwYW5kKCkgY2t1ZmlvLmMuCisgCisgLiBNb3ZlZCBnZXRleGVkaXIoKSBjYWxsIHRvIGxhdGVyLCB3aGVyZSBpdCdzIHNhZmUuICBja2NtYWkuYy4KKworQWRkZWQgU1NIIEFERCBhbmQgbWFueSBTU0ggU0VUIGNvbW1hbmRzIGZyb20gSmVmZidzIHNwZWMuICBGaXhlZCBTSE9XIFNTSAordG8gbm90IGR1bXAgY29yZSBpZiB2YXJpYWJsZXMgd2VyZW4ndCBzZXQuICBja2NrZXIuaCwgY2t1dXNbcjNdLmMsIDIwIERlYyAyMDAxLgorCitDLUtlcm1pdCBpbiBzZXJ2ZXIgbW9kZSwgY2xpZW50IHNheXMgImdldCBmb28iIHdoZXJlIGZvbyBpcyBhIHN5bWxpbmsuCitTZXJ2ZXIgc2F5cyAibm8gZmlsZXMgbWVldCBzZWxlY3Rpb24gY3JpdGVyaWEiIGluc3RlYWQgb2Ygc2VuZGluZyB0aGUgZmlsZS4KK0l0IHNob3VsZCBvbmx5IHJlZnVzZSB0byBmb2xsb3cgc3ltbGlua3MgaWYgaXQncyBhIHJlY3Vyc2l2ZSBnZXQuICBGaXhlZAoraW4gc2dldGluaXQoKTogY2tjcHJvLncsIDIxIERlYyAyMDAxLgorCitNb3JlIHdvcmsgb24gU1NIIGFuZCBTRVQvU0hPVyBTU0ggY29tbWFuZHMuICBja3V1c1tyM10uYywgMjEgRGVjIDIwMDEuCisKK1VuZGlkIEplZmYncyByZXBsYWNlbWVudCBvZiB0aGUgU1NIIHBzZXVkb3Rlcm1pbmFsIGFsbG9jYXRpb24gZmFpbHVyZQorbWVzc2FnZSwgYmVjYXVzZSBub3cgaXQgY29tZXMgb3V0IGFueSB0aW1lIGFuIFNTSCBjb21tYW5kIGhhcyB0byBiZQorcmVwYXJzZWQgKGluIHRoZSBub24tU1NIQlVJTFRJTiBjYXNlKS4gIGNrdXVzci5jLCAyMSBEZWMgMjAwMS4KKworTW9yZSBTU0ggYW5kIFNFVCBTU0ggY29tbWFuZCB3b3JrIGJhY2sgJiBmb3J0aCB3aXRoIEplZmYsIHBsdXMgSmVmZiBhZGRlZAorU0VUIEhPU1QgL05FVDpTU0guICBja2NtYWkuYywgY2t1dXNbcjM3XS5jLCBja2NkZWIuaCwgY2t1dXNyLmgsIDIyIERlYyAyMDAxLgorCitBZGRlZCBTU0ggT1BFTiBzd2l0Y2hlcy4gIGNrdXVzci5jLCAyMiBEZWMgMjAwMS4KKworQWRkZWQgU1NIIENMRUFSLCBIRUxQIFNTSCwgYW5kIEhFTFAgU0VUIFNTSC4gIGNrdXVzW3IyXS5jLCAyMyBEZWMgMjAwMS4KKworRnJvbSBKZWZmOgorIC4gU0VUIFRDUCBjb21tYW5kcyBub3cgYXBwbHkgdG8gU1NICisgLiBTU0ggVjIgUkVLRVkgYW5kIEZPUldSRC17TE9DQUwsUkVNT1RFfS1QT1JUICBjb21tYW5kcyBub3cgaW1wbGVtZW50ZWQKKyAuIE1pc3NpbmcgRExMcyBhdXRvbWF0aWNhbGx5IGRpc2FibGUgYXBwcm9wcmlhdGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcy4KK2NrdXVzci5jIGNrY25ldC5jIGNrdXVzMy5jIGNrY21haS5jIGNrY25ldC5oIGNrdXVzNC5jLCAyNiBEZWMgMjAwMS4KKworRnJvbSBKZWZmOgorIC4gUmVtb3ZlIFNFVCBTU0ggS0VFUEFMSVZFUy4KKyAuIEFkZCBoZWxwIHRleHQgZm9yIFNTSCBBR0VOVCB7IEFERCwgREVMRVRFLCBMSVNUIH0uCitja3V1c1syM10uYywgMjggRGVjIDIwMDEuCisKK0FkZGVkIHBhcnNpbmcgZm9yIFNTSCBBR0VOVCB7IEFERCwgREVMRVRFLCBMSVNUIH0uICBja3V1c3IuYywgMjggRGVjIDIwMDEuCisKK0Zyb20gSmVmZjoKKyAuIEZpeGVkIGEgY3Jhc2ggdGhhdCBjYW4gaGFwcGVuIHdoZW4gbWFraW5nIGFuIFNTSCBjb25uZWN0aW9uLgorIC4gRmlsbGVkIGluIFNTSCBBR0VOVCBhY3Rpb25zLgorIC4gQ2hhbmdlZCBkZWZhdWx0IGZvciBzdHJpY3QgaG9zdCBrZXkgY2hlY2sgKHRvIEFTSykgYW5kIGhlbHAgdGV4dC4KKyAuIHVwbG9hZGVkIG5ldyBiaW5hcmllcyBpbmNsdWRlIH5rZXJtaXQvb3MydGVzdC9iZXRhL3NzaC1hZ2VudC5leGUKKyAuIFJlYWQgbWFuIHNzaC1hZ2VudCBvbiBmdHAua2VybWl0LmNvbHVtYmlhLmVkdSBmb3IgZGV0YWlscyBvbiB3aGF0IGl0IGRvZXMuCitja3V1c1tyMjNdLmMsIDI4IERlYyAyMDAxLgorCisiZnRwIGdldCBwYXRoL2ZpbGVuYW1lIiBkaWRuJ3Qgd29yazsgdGhlIEZUUCBjbGllbnQgZGlkIG5vdCBzdHJpcCB0aGUgcGF0aAorZnJvbSB0aGUgbG9jYWwgY29weSBvZiB0aGUgZmlsZW5hbWUgd2hlbiBkb2luZyBhIEdFVCwgZXZlbiB0aG91Z2ggaXQgZGlkCitmb3IgTUdFVC4gIERpYWdub3NpczogaW4gZG9mdHBnZXQoKSwgdGhlICJpZiAoIWdldG9uZSAmJiAhc2tpcHRoaXMpIiBzdGF0ZW1lbnQKK2xhY2tlZCBhbiAiZWxzZSIgcGFydCBmb3IgdGhlIGdldG9uZSBjYXNlLiAgY2tjZnRwLmMsIDI4IERlYyAyMDAxLgorCitBIHdoaWxlIGJhY2sgSmVmZiByZXBvcnRlZCB0aGF0IGluIEZUUCBNR0VULCBpZiB5b3UgY2FuY2VsIGEgZmlsZSB3aXRoICd4JywKK2FsbCB0aGUgcmVzdCBvZiB0aGUgZmlsZXMgYXJyaXZlIHRydW5jYXRlZCB0byAwIGJ5dGVzLiAgSSB0cmllZCB0aGlzIG9uIGJvdGgKK1VuaXggYW5kIFdpbmRvd3MgYW5kIGNvdWxkbid0IHJlcHJvZHVjZSBpdC4KKworSW4gdGhlIGxhc3QtbWludXRlIGZsdXJyeSB0byByZWxlYXNlIEMtS2VybWl0IDguMCwgSSB0aG91Z2h0IEkgbm90aWNlZCB0aGUgRlRQCitjbGllbnQgZmFpbGluZyB0byB1cGRhdGUgdGhlIGZ1bGxzY3JlZW4gZmlsZS10cmFuc2ZlciBkaXNwbGF5LiAgQnV0IGl0IHNlZW1zCit0byB3b3JrIHJpZ2h0LCBhdCBsZWFzdCBpbiBVbml4LiAgV2hlbiBkb3dubG9hZGluZyBhIGJpZyBmaWxlIHdpdGggRlRQLCBhbGwKK3RoZSBkaXNwbGF5IGZpZWxkcyBhcmUgdXBkYXRlZCBhcyBleHBlY3RlZC4gIEJ1dCBzbWFsbGVyIGZpbGVzIG1pZ2h0IGdvIGJ5IHRvbworZmFzdCBmb3IgdGhlIGRpc3BsYXkgdG8gZG8gYW55dGhpbmcuICBIT1dFVkVSLCBpbiBLOTUgdGhlIGZpbGUgdHJhbnNmZXIKK2Rpc3BsYXkgZG9lcyBub3QgdXBkYXRlIGl0c2VsZiB1bnRpbCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBldmVuIGlmIHRoZSBmaWxlCit0YWtlcyBhIGxvbmcgdGltZSB0byB0cmFuc2Zlci4gIFRoaXMgaGFwcGVucyBpbiBib3RoIHRoZSBDb25zb2xlIGFuZCBHVUkKK3ZlcnNpb25zLiAgQSB0aHJlYWQgdGhpbmc/ICAoSmVmZiBzYXlzIG5vLikgIFlldCB0aGUgc2FtZSBkaXNwbGF5IHdvcmtzIGZpbmUKK29uIFRlbG5ldCBjb25uZWN0aW9ucy4KKworSW4gSVJJWCA1LjMsIHRoZSBzZWxlY3QoKS1iYXNlZCBDT05ORUNUIG1vZHVsZSBoYWQgdG8gaW5jbHVkZSA8c3lzL3RpbWUuaD4KK29yIGVsc2UgaXQgYmxldyB1cCB3aXRoICJzdHJ1Y3QgdGltZXZhbCIgdW5rbm93bi4gIFNpbmNlIHRoZXJlIGFscmVhZHkgd2FzCithIFNZU1RJTUVIIENGTEFHLCBJIGFkZGVkIHRoZSAjaW5jbHVkZSB3aXRoaW4gI2lmZGVmIFNZU1RJTUVILi4jZW5kaWYgYW5kCityZWJ1aWx0IHdpdGggS0ZMQUdTPS1EU1lTVElNRUgsIG9ubHkgdG8gZGlzY292ZXIgdGhhdCB0aGUgaXJpeDUqIHRhcmdldHMKK2RpZG4ndCBib3RoZXIgdG8gcHJvcG9nYXRlIEtGTEFHUy4gIEZpeGVkIGluIGNrdWNucy5jLCBtYWtlZmlsZSwgMzAgRGVjIDIwMDEuCisKK0luY3JlYXNlZCBJUklYNXggT2xpbWl0IGZyb20gMjQwMCB0byAzMDAwIGJlY2F1c2Ugb2YgY2t1dXNbMzRdLmMuICBBZGRlZAorLWFuc2ksIHNpbmNlIChNYXJjdXMgSGVyYmVydCByZXBvcnRlZCkgd2Ugd2VyZSBub3QgYWN0dWFsbHkgZ2V0dGluZyBBTlNJLUMKK2NvbXBpbGF0aW9uIGV2ZW4gdGhvdWdoIENLX0FOU0lDIHdhcyBkZWZpbmVkLiAgQnV0IG5vdyB0aGF0IHdlIGFyZSwgd2UgZ2V0Cit3YXJuaW5ncyBpbiA8bmV0aW5ldC90Y3AuaD4sIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IGNrY25ldC5oOgorCisgIGJpdC1maWVsZCAndGhfb2ZmJyB0eXBlIHJlcXVpcmVkIHRvIGJlIGludCwgdW5zaWduZWQgaW50LCBvciBzaWduZWQgaW50LgorICAoMy41LjIuMSgzMCkpCisJICB1X2NoYXIgIHRoX29mZjo0LAorCSAgLS0tLS0tICBeCitUb3VnaC4gIG1ha2VmaWxlLCAzMCBEZWMgMjAwMS4KKworQnV0IGFkZGluZyAtYW5zaSB0byB0aGUgSVJJWCA1eCB0YXJnZXRzIGFsc28gbWFrZSBjb21waWxhdGlvbiBib21iIHdoZW5ldmVyIHdlCityZWZlcmVuY2VkIGZkb3BlbigpIG9yIHBvcGVuKCksIHdoaWNoIGV2aWRlbnRseSBkb24ndCBoYXZlIHByb3RvdHlwZXMgaW4gYW55CitvZiB0aGUgaGVhZGVyIGZpbGVzLiAgTHVja2lseSB3ZSBhbHJlYWR5IGhhdmUgQ0ZMQUdTIGZvciB0aGlzIG9jY2FzaW9uIHRvbzoKK0RDTEZET1BFTiBhbmQgRENMUE9QRU4uICBBZGRlZCB0aGVzZSB0byB0aGUgaXJpeDUxIHRhcmdldC4gIEFsc28gaGFkIHRvIGNvcHkKK3RoZSBmZG9wZW4oKS1wb3BlbigpIHByb3RvdHlwZSBzZWN0aW9uIHRvIGNrdXVzeC5jLCB3aGljaCBoYXMgYSBuZXcgcmVmZXJlbmNlCit0byBmZG9wZW4oKSBpbiBhIHdvcmthcm91bmQgZm9yIHRoZSBjdXJzZXMgY29uc29sZSBidWZmZXJpbmcgYnVnLiAgbWFrZWZpbGUsCitja3V1c3guYywgMzAgRGVjIDIwMDEuCisKK1RoZSBRTlg2IHZlcnNpb24gZGlkIG5vdCByZWNlaXZlIGEgcHJvcGVyIGhlcmFsZCAoaXQgYW5ub3VuY2VkIGl0c2VsZiBhcworInVua25vd24gdmVyc2lvbiIuICBSZXNodWZmbGVkICNpZmRlZnMgaW4gY2t1dmVyLmgsIGFkZGVkIGRpc3BsYXkgb2YgUU5YNgorYW5kIE5FVVRSSU5PIHN5bWJvbHMgdG8gY2t1dXM1LmMsIDMwIERlYyAyMDAxLgorCitMdWNhcyBIYXJ0IHNlbnQgaW4gYSBwYXRjaCBmb3IgdGhlIFZNUyBwcm9ibGVtLiAgQXBwYXJlbnRseSBpdCB3YXMgZXZlbiB3b3JzZQordGhhbiBEYXZlIFNuZWRkb24gaGFkIHJlcG9ydGVkOiA4LjAgY291bGRuJ3QgcnVuIGF0IGFsbCB1bmRlciBCYXRjaC4gIGNrdnRpby5jLAorMzEgRGVjIDIwMDEuCisKK0EgbWFqb3Igb2JzdGFjbGUgdG8gdGhlIHVzYWJpbGl0eSBvZiB0aGUgRlRQIGNsaWVudCBpcyB0aGF0IGNlcnRhaW4gY29tbWFuZHMKK2Rvbid0IGJlaGF2ZSBhcyBGVFAgdXNlcnMgZXhwZWN0OiBDRCwgRElSLCBERUxFVEUsIE1LRElSLCBldGMsIHdoaWNoIGFyZSBsb2NhbAorcmF0aGVyIHJlbW90ZSwgYW5kIHRoZXJlIGFyZSBubyBMQ0QgKGV0YyksIFVTRVIsIG9yIEFDQ09VTlQgY29tbWFuZHMuICBXZQorY291bGQgZml4IHRoaXMgYnkgYWRkaW5nIGFuIEZUUCBjb21tYW5kLWxhbmd1YWdlIHBlcnNvbmFsaXR5LCBidXQgZmlsZQorbWFuYWdlbWVudCBjb21tYW5kcyBjYW4gYWxzbyBiZSByZW1vdGUgb3IgbG9jYWwgb24gY29ubmVjdGlvbnMgdG8gS2VybWl0CitzZXJ2ZXJzIHRvby4gIFNvOgorCitTRVQgTE9DVVMgeyBMT0NBTCwgUkVNT1RFLCBBVVRPIH0KKyAgU2V0cyB0aGUgbG9jdXMgZm9yIHVucHJlZml4ZWQgZmlsZSBtYW5hZ2VtZW50IGNvbW1hbmRzLgorICBXaGVuIExPQ0FMLCBhIFJFTU9URSAob3IgUikgcHJlZml4IGlzIHJlcXVpcmVkIGZvcgorICB0byBzZW5kIGZpbGUgbWFuYWdlbWVudCBjb21tYW5kcyB0byBhIHJlbW90ZSBzZXJ2ZXIgKGUuZy4gUkNELCBSRElSKS4KKyAgV2hlbiBSRU1PVEUsIGFuIEwgcHJlZml4IGlzIHJlcXVpcmVkIHRvIGlzc3VlIGxvY2FsIGZpbGUgbWFuYWdlbWVudAorICBjb21tYW5kcyAoZS5nLiBMQ0QsIExESVIpLiAgVGhlIHdvcmQgTE9DQUwgY2FuJ3QgYmUgdXNlZCBhcyBhIHByZWZpeAorICBzaW5jZSBpdCBpcyB1c2VkIGZvciBkZWNsYXJpbmcgbG9jYWwgdmFyaWFibGVzLgorCitUaGlzIGFwcGxpZXMgdG8gYWxsIHR5cGVzIG9mIGNvbm5lY3Rpb25zLCBhbmQgdGh1cyBpcyBvcnRob2dvbmFsIHRvIFNFVAorR0VULVBVVC1SRU1PVEUsIHdoaWNoIHNlbGVjdHMgYmV0d2VlbiBLZXJtaXQgYW5kIEZUUCBmb3IgcmVtb3RlIGZpbGUtdHJhbnNmZXIKK2FuZCBtYW5hZ2VtZW50IGNvbW1hbmRzLgorCitUaGUgZGVmYXVsdCBMT0NVUyBpcyBBVVRPLCB3aGljaCBtZWFucyB3ZSBzd2l0Y2ggdG8gUkVNT1RFIHdoZW5ldmVyIGFuIEZUUAorY29ubmVjdGlvbiBpcyBtYWRlLCBhbmQgdG8gTE9DQUwgd2hlbmV2ZXIgYSBub24tRlRQIGNvbm5lY3Rpb24gaXMgbWFkZSwKK2FuZCBzd2l0Y2ggYmFjayBhY2NvcmRpbmdseSB3aGVuZXZlciBhIGNvbm5uZWN0aW9uIGlzIGNsb3NlZC4KKworSW1wbGVtZW50YXRpb24gKDMxIERlYyAyMDAxKToKKyAuIE5vbmUgb2YgdGhpcyBpcyBjb21waWxlZCBpZiBMT0NVUyBpcyBub3QgZGVmaW5lZC4KKyAuIEFkZGVkIFhZTE9DVVMgKFNFVCBMT0NVUykgYW5kIExPQ1VTIGRlZmluaXRpb25zOiBja3V1c3IuaC4KKyAuIE92ZXJyaWRlIGJ5IGRlZmluaW5nIE5PTE9DVVMgKHdoaWNoIGluaGliaXRzIGRlZmluaXRpb24gb2YgTE9DVVMpLgorIC4gQWRkZWQgTE9DVVMgdG8gU0VUIGtleXdvcmQgdGFibGU6IGNrdXVzci5jLgorIC4gQWRkZWQgbG9jdXMgJiBhdXRvbG9jdXMgdmFyaWFibGVzOiBja3V1c3IuYy4KKyAuIEFkZGVkIFNFVCBMT0NVUyBwYXJzaW5nIGFuZCB2YXJpYWJsZSBzZXR0aW5nOiBja3V1czMuYy4KKyAuIEFkZGVkIGRpc3BsYXkgb2YgTE9DVVMgc2V0dGluZyB0byBTSE9XIENPTU1BTkQ6IGNrdXVzNS5jLgorIC4gQWRkZWQgYXV0b21hdGljIGxvY3VzIHNldHRpbmcgdG8gc2V0bGluKCk6IGNrdXVzNy5jLgorIC4gQWRkZWQgYXV0b21hdGljIGxvY3VzIHNldHRpbmcgdG8gZnRwb3BlbigpIGFuZCBmdHBjbG9zZSgpOiBja2NmdHAuYy4KKworSG93IHRvIGNhdGNoIGFsbCB0aGUgcGxhY2VzIHdoZXJlIGEgS2VybWl0IGNvbm5lY3Rpb24gaXMgY2xvc2VkPyAgVHVybnMgb3V0Cit3ZSd2ZSBkb25lIHRoaXMgYmVmb3JlLCB3aGVuIHdlIGFkZGVkIHRoZSBjb25uZWN0aW9uIGxvZy4gIFNvIEkgbWFkZQorZG9sb2dlbmQoKSB0YWtlIGNhcmUgb2YgbG9jdXMgc3dpdGNoaW5nLiAgQnV0IGRvbG9nZW5kKCkgd2FzIG5vdCBjb21waWxlZCBpbgoraWYgY2VydGFpbiBzeW1ib2xzIHdlcmUgZGVmaW5lZCwgc3VjaCBhcyBOT0xPQ0FMLCBvciBub3QgZGVmaW5lZCwgc3VjaCBhcworQ0tMT0dESUFMLiAgU28gSSAoYSkgcmVhcnJhbmdlZCB0aGUgI2lmZGVmcyBzbyB0aGF0IGV2ZW4gaWYgdGhlc2Ugd291bGQKK290aGVyd2lzZSBoYXZlIG9ibGl2aWF0ZWQgZG9sb2dlbmQoKSwgbm93IHRoZXkgbGVhdmUgYSBwaWVjZSBvZiBpdCBmb3IKK2xvY3VzLXNldHRpbmc7IChiKSBtb3ZlZCB0aGUgcHJvdG90eXBlIG91dCBvZiAjaWZkZWZzOyBhbmQgKGMpIHRvb2sgYWxsIGNhbGxzCit0byBpdCBvdXQgb2YgI2lmZGVmcy4gIGNrY2tlci5oLCBja2NmbjIuYywgY2tjbWFpLmMsIGNrdWNucy5jLCBja3Vjb24uYywKK2NrdXVzW3IzNDd4XS5jLCAzMSBEZWMgMjAwMS4KKworQWRkZWQgbG9jdXMgY2hlY2tpbmcgdG8gdGhlIGZvbGxvd2luZyBjb21tYW5kczogRElSRUNUT1JZLCBDRC9DV0QsIENEVVAsCitERUxFVEUsIFBXRCwgTUtESVIsIFJNRElSLCBSRU5BTUUuICBja3V1c3IuYywgMzEgRGVjIDIwMDEuCisKK0FkZGVkIExESVJFQ1RPUlksIExDRC9MQ1dELCBMQ0RVUCwgTERFTEVURSwgTFBXRCwgTE1LRElSLCBMUk1ESVIsCitMUkVOQU1FLiAgY2t1dXNyLltjaF0sIDMxIERlYyAyMDAxLgorCitBZGRlZCBVU0VSIGFuZCBBQ0NPVU5UIGNvbW1hbmRzLCB3aGljaCBhcmUgdGhlIHNhbWUgYXMgRlRQIFVTRVIgYW5kIEZUUAorQUNDT1VOVC4gIGNrdXVzci5bY2hdLCBja2NmdHAuYywgMzEgRGVjIDIwMDEuCisKK1NpbmNlIGF1dG9tYXRpYyBsb2N1cyBzd2l0Y2hpbmcgY291bGQgYmUgYSBiaWcgc3VycHJpc2UgZm9yIG1vc3QgcGVvcGxlLCBJCitwcmludGVkIG1lc3NhZ2UgYW55IHRpbWUgaXQgY2hhbmdlZC4gIGNrY2Z0cC5jLCBja3V1c1szN10uYywgMzEgRGVjIDIwMDEuCisKK0FkZGVkIGhlbHAgdGV4dCBmb3IgdGhlIG5ldyBMIGNvbW1hbmRzIGFuZCBmaWxsZWQgaW4gbWlzc2luZyBIRUxQIHRleHQgZm9yCitTRVQgR0VULVBVVC1SRU1PVEUsIENEVVAsIE1LRElSLCBhbmQgUk1ESVIuICBja3V1czIuYywgMzEgRGVjIDIwMDEuCisKK0NoYW5nZWQgaGVscCB0ZXh0IG9mIENELCBESVIsIGV0YywgZm9yIExPQ1VTLiAgQ2hhbmdlZCB0aGUgaGVscCB0ZXh0IGZvcgorUkNELCBSUFdELCBSREVMLCBSRElSLCBldGMsIHRvIG1lbnRpb24gdGhhdCB0aGV5IGFsc28gd29yayB3aXRoIEZUUCBzZXJ2ZXJzLgorVXBkYXRlZCBIRUxQIFJFTU9URSBmb3IgdGhpcyB0b28uICBja3V1czIuYywgMzEgRGVjIDIwMDEuCisKK01hZGUgc3VyZSBjb2RlIGJ1aWxkcyB3aXRoIE5PTE9DQUwsIE5PTE9HRElBTCwgYW5kIE5PTE9DVVMgKGl0IGRvZXMpLgorCitUaGUgSUtTRCBjb21tYW5kLCB3aGVuIGdpdmVuIHdpdGggYSAvVVNFUjogc3dpdGNoLCBzZW5kcyB0aGUgdXNlciBJRCB0byB0aGUKK0lLU0QuICBCdXQgdGhlIFNFVCBIT1NUIC9VU0VSOiBjb21tYW5kIGRvZXMgbm90LCB3aGVuIG1ha2luZyBhIGNvbm5lY3Rpb24gdG8gYQorS2VybWl0IHNlcnZpY2UuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gc2NyaXB0IElLU0QgaW50ZXJhY3Rpb25zIHVzaW5nCitvbmx5IGNsaWVudCBjb21tYW5kcy4gIEZ1cnRoZXJtb3JlLCBldmVuIGlmIHlvdSBpbmNsdWRlIGEgL1BBU1NXT1JEIHN3aXRjaAord2l0aCB0aGUgSUtTRCBjb21tYW5kLCBpdCBkb2VzIG5vdCBzZW5kIHRoZSBwYXNzd29yZC4gIEkgYWRkZWQgY29kZSBuZWFyIHRoZQorYm90dG9tIG9mIHNldGxpbigpIHRvIGRvIHRoaXMuICBJZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiB0byBhIEtlcm1pdCBzZXJ2aWNlCithbmQgYSAvVVNFUjogc3dpdGNoIHdhcyBnaXZlbiwgdGhlbiB3ZSBhdHRlbXB0IGEgUkVNT1RFIExPR0lOLiAgSWYgYQorL1BBU1NXT1JEOiBzd2l0Y2ggd2FzIG5vdCBnaXZlbiB0aGVuIGlmIHRoZSB1c2VybmFtZSBpcyAiZnRwIiBvciAiYW5vbnltb3VzIiwKK3dlIGF1dG9tYXRpY2FsbHkgc3VwcGx5IGEgcGFzc3dvcmQgb2YgdXNlckBob3N0OyBvdGhlcndpc2Ugd2UgcHJvbXB0IGZvciBhCitwYXNzd29yZC4gIElmIGEgL1VTRVI6IHN3aXRjaCB3YXMgbm90IGdpdmVuLCBpdCBhY3RzIGxpa2UgYmVmb3JlLiAgSXQgYWxsCit3b3JrcywgYnV0IGl0IG1pZ2h0IG5vdCBiZSB0aGUgYmVzdCB3YXkgKG9yIHBsYWNlKSB0byBkbyBpdC4gIHNldGxpbigpOgorY2t1dXM3LmMsIDMxIERlYyAyMDAxLgorCisgIE5PVEU6IFRoZSBhYm92ZSBjaGFuZ2UgZG9lc24ndCBoZWxwIHdpdGggSUtTRCAvVVNFUjphbm9ueW1vdXMsCisgIHRoZSBzZXJ2ZXIgcHJvbXB0cyBmb3IgcGFzc3dvcmQgYW55d2F5LCBub3Qgc3VyZSB3aHkuCisKKyAgTk9URSAyOiBXaGF0IGFib3V0IHNlY3VyZSBhdXRoZW50aWNhdGlvbj8gIFdlIGhhdmUgdG8gdGVzdCB0byBzZWUKKyAgaWYgdXNlciB3YXMgYWxyZWFkeSBhdXRoZW50aWNhdGVkIGJlZm9yZSBzZW5kaW5nIHRoZSBsb2dpbiBwYWNrZXQuCisKK0FkZGVkIC9vcHQva2VybWl0IGFuZCAvb3B0L2tlcm1pdC9kb2MgdG8gaW5mb19kaXJbXSBsaXN0IChmb3IgU29sYXJpcykuCitja3V1czUuYywgMzEgRGVjIDIwMDEuCisKK0Zyb20gSmVmZjogbmV3IEhlbHAgdGV4dCBmb3IgU0VUIFRFUk0gRk9OVCAoSzk1IEdVSSkuICBja3V1czIuYywgMSBKYW4gMjAwMi4KKworTW9yZSB3b3JrIG9uIGhlbHAgdGV4dCBmb3IgZmlsZSBtYW5hZ2VtZW50IGNvbW1hbmRzIC0tIGUuZy4gd2UgY2FuJ3QgbHVtcAordGhlIEwtY29tbWFuZHMgdG9nZXRoZXIgd2l0aCB0aGUgdW5wcmVmaXhlZCBvbmVzOyB0aGV5IG5lZWQgc2VwYXJhdGUgZW50cmllcy4KK0Fsc286IGFkZGVkIG1pc3NpbmcgSEVMUCBSRU1PVEUgUFdELCBpbXByb3ZlZCB0aGUgZGVmYXVsdCBjYXNlIChpbiB3aGljaAoraGVscCB0ZXh0IGhhZCBiZWVuIG9taXR0ZWQgZm9yIGEgdmFsaWQgY29tbWFuZCkuICBja3V1czIuYywgMSBKYW4gMjAwMi4KKworSXQgc2VlbXMgVk1TIEMtS2VybWl0IHdhcyBwcmV0dHkgbXVjaCBpZ25vcmluZyB0aGUgLUIgKGZvcmNlIGJhY2tncm91bmQpIGFuZAorLXogKGZvcmNlIGZvcmVncm91bmQpIGNvbW1hbmQtbGluZSBvcHRpb25zLiAgRml4ZWQgaW4gY29uZ20oKTogY2t2dGlvLmMsCisxIEphbiAyMDAyLgorCitUZXN0ZWQgdGhlIFNFVCBMT0NVUyBidXNpbmVzcyB3aXRoIFZNUyBDLUtlcm1pdCwgd2hpY2ggZG9lcyBub3QgaGF2ZSBhCitidWlsdC1pbiBGVFAgY2xpZW50LiAgT2YgY291cnNlIGluIHRoaXMgY2FzZSB0aGVyZSBpcyBubyBhdXRvbWF0aWMgbG9jdXMKK3N3aXRjaGluZywgYnV0IFNFVCBMT0NVUyBSRU1PVEUgd29ya3MgbmljZWx5IG9uIElLU0QgY29ubmVjdGlvbnMuCisKK0Zyb20gSmVmZjoKKyAuICNpZmRlZiBhZGp1c3RtZW50cyBmb3IgTE9DVVMgY2hhbmdlcy4KKyAuIFNTSCBLRVkgQ1JFQVRFIC9UWVBFOlNSUC4KKyAuIEZpeCBcdihzZXJpYWwpIHRvIG5vdCBiZSA4TjIgYnkgZGVmYXVsdCBpZiBzcGVlZCBpcyAwLgorIC4gRG9uJ3QgbGV0IGRvZXhpdCgpIHJ1biBpZiBzeXNpbml0KCkgaGFzbid0IGJlZW4gY2FsbGVkIGZpcnN0LgorY2t1dXNbcjI0N3hdLmMsIDIgSmFuIDIwMDIuCisKK01hZGUgU0VUIEJBQ0tHUk9VTkQgeyBPTiwgT0ZGIH0gZG8gZXhhY3RseSB0aGUgc2FtZSBhcyAtQiBhbmQgLXogb3B0aW9ucy4KK2NrdXVzMy5jLCAyIEphbiAyMDAyLgorCitVcGRhdGVkIHVzZXItdmlzaWJsZSBjb3B5cmlnaHQgZGF0ZXMgdG8gMjAwMiAoYnV0IHN0aWxsIG5lZWQgdG8gZG8gYWxsIHRoZQorc291cmNlLW1vZHVsZSBjb21tZW50cykuICBja2NtYWkuYywgY2t1dXNbMjVdLmMsIDIgSmFuIDIwMDIuCisKK1JlYXJyYW5nZWQgI2luY2x1ZGUgPHN5cy90aW1lLmg+IGluIGNrdWNucy5jIHRoYXQgd2FzIGRvbmUgZm9yIElSSVggNS4zLAordG8gYXZvaWQgY29uZmxpY3RzIGluIFNWLzY4IFIzdjYuICAzIEphbiAyMDAyLgorCitGcm9tIERhdmUgU25lZGRvbjogQ29kZSBjaGFuZ2VzIGluIFZNUyBzeXNpbml0KCkgYW5kIGNvbmdtKCkgdG8gd29yayBhcm91bmQKK3Byb2JsZW1zIGluIGJhdGNoLCBTUEFXTidkLCBldGMsIGFuZCBjaGFuZ2UgQ1RUTkFNIGZyb20gVFQ6IHRvIFNZUyRJTlBVVDouCitja2NkZWIuaCwgY2t2dGlvLmMsIDMgSmFuIDIwMDIuCisKK0Zyb20gSmVmZjoKKyAuIEZpeGVkIHR5cG8gaW4gZGVmaW5pdGlvbiBvZiBDVFROQU0gZm9yIFZNUy4gIGNrY2RlYi5oCisgLiBNb3ZlZCBtYWNybyBkZWZpbml0aW9ucyBmb3IgU1NIQlVJTFRJTiBmcm9tIGNrdXVzMy5jIHRvIGNrdXVzci5oCisgICBzbyB0aGV5IGNhbiBiZSByZWZlcmVuY2VkIGluIGNrdXVzNy5jCisgLiBBZGRlZCBTU0ggZnVuY3Rpb25hbGl0eSB0byBTRVQgSE9TVDoKKyAgICAgU0VUIEhPU1QgL05FVDpTU0ggL0NPTk5FQ1QgaG9zdG5hbWUgW3BvcnRdIC9zd2l0Y2hlcworIC4gRml4ZWQgU0VUIE5FVCBUWVBFIHNvIGl0IHdvbid0IHJlamVjdCBTU0ggaWYgU1NIIGlzIGluc3RhbGxlZC4KKyAuIENoYW5nZXMgdG8gYWxsb3cgSUtTRCB0byBjb250aW51ZSBmdW5jdGlvbmluZy4gIFNvbWVob3cgdGhpcyBtaW5vciBjaGFuZ2UKKyAgIHRvIGNrY21haS5jIGdvdCBsb3N0IGluIG9uZSBvZiB0aGUgYmFjayBhbmQgZm9ydGggZXhjaGFuZ2VzLgorIC4gSEVMUCBURVhUIGZvciBVQ1MyIGt2ZXJiCisgLiBGaXggYSBwcm9ibGVtIGluIEs5NSB3aGVyZSBtdWx0aXBsZSB0aHJlYWRzIGNvdWxkIGJlIGF0dGVtcHRpbmcgdG8KKyAgIHNlbmQgYSB0ZWxuZXQgbmVnb3RpYXRpb24gc2ltdWx0YW5lb3VzbHkuCitja2NtYWkuYyBja2NkZWIuaCBja3V1czIuYyBja3V1czMuYyBja3V1c3IuYyBja3V1c3IuaCBja3V1czcuYyBja2N0ZWwuYworY2tfY3JwLmMgY2t1YXQyLmggY2t1YXRoLmMsIDQgSmFuIDIwMDIuCisKK0Zyb20gSmVmZjoKKworICBQZXRlciBSdW5lc3RpZyBjb21wbGFpbmluZyB0aGF0IHRoZSBUZWxuZXQgRm9yd2FyZCBYIGNvZGUgd2FzIGNvcnJ1cHRpbmcKKyAgZGF0YS4gIFRoaXMgcmVzdWx0ZWQgaW4gYSB2ZXJ5IHRob3JvdWdoIGV4YW1pbmF0aW9uIG9mIHRoZSB0ZWxuZXQgbW9kdWxlCisgIGNvZGUgYW5kIGEgZGlzY292ZXJ5IG9mIHNvbWUgcmF0aGVyIHNpZ25pZmljYW50IHByb2JsZW1zLiAgVGhlIHJvb3Qgb2YgdGhlCisgIHByb2JsZW1zIGlzIHRoZSBsYWNrIG9mIHRocmVhZCBzYWZldHkuICBUbyBjb3JyZWN0IHRoaXMgcHJvYmxlbSB0aGUKKyAgZm9sbG93aW5nIHdhcyBkb25lLgorCisgIEFsbCBjb2RlIChyZWdhcmRsZXNzIG9mIG1vZHVsZSkgd2hpY2ggb3V0cHV0cyB0ZWxuZXQgY29tbWFuZHMgaXMgcGxhY2VkCisgIGludG8gYSBtdXRleCByZWdpb24gdG8gZW5zdXJlIHRoYXQgY29tcGV0aW5nIG91dHB1dCB0aHJlYWRzIGRvIG5vdCByZXN1bHQKKyAgaW4gaW50ZXJsZWF2aW5nIHRoZWlyIG91dHB1dC4gIFRoaXMgY291bGQgaGFwcGVuIGZvciBpbnN0YW5jZSB3aGVuIHRoZQorICBmb3J3YXJkLXggdGhyZWFkIGlzIGZvcndhcmRpbmcgZGF0YSBhbmQgdGhlIHVzZXIgY2hhbmdlcyB0aGUgd2luZG93IHNpemUKKyAgb3Igc2VuZHMgYW4gQVlUIG9yIEJSRUFLLiAgTmV4dCB0aGUgYnVmZmVyIHVzZWQgZm9yIGlucHV0IGFuZCBvdXRwdXQKKyAgcHJvY2Vzc2luZyB3ZXJlIGlkZW50aWNhbC4gIFRoaXMgbWVhbnMgdGhhdCBvdXRwdXQgZGF0YSBjb3VsZCBiZSB0cmVhdGVkCisgIGFzIGlucHV0IG9yIHZpY2UgdmVyc2EuICBVZ2guLi4uCisKKyAgSSBhbHNvIHNwZW50IHNvbWUgbW9yZSB0aW1lIGNsZWFuaW5nIHVwIHNldGxpbigpLiAgTW9zdGx5IHJlb3JnYW5pemluZyB0aGUKKyAgY29kZSBpbnRvIHNpbmdsZSBpZiAoLi4uKSBibG9ja3Mgc28gdGhhdCBicmVha2luZyBpdCB1cCB3aWxsIGJlIGVhc2llci4KKworY2tjdGVsLmMgY2t1dXM3LmMsIDQgSmFuIDIwMDIuCisKK1VwZGF0ZWQgaW50ZXJuYWwgY29weXJpZ2h0IG5vdGljZXMuICBBbGwgbW9kdWxlcywgNSBKYW4gMjAwMi4KKworRnJvbSBKZWZmOgorICBNb3JlIG9mIHNhbWUsIHBsdXMgbmV3IG1ha2VmaWxlIHRhcmdldCBhbmQgY2hhbmdlcyBmcm9tIFNwaWtlIEdyb25pbQorICBmb3IgZnJlZWJzZDQ0K3NycCtvcGVuc3NsLgorY2tjZGViLmggY2tjbmV0LmMgY2tjdGVsLmMgY2t1dXM3LmMgY2tfc3NsLmMgbWFrZWZpbGUsIDUgSmFuIDIwMDIuCisKK1NvbWUgbWlub3IgdXBkYXRlcyBhbmQgZml4ZXMgdG8gU1NIIGFuZCBTRVQgU1NIIGhlbHAgdGV4dC4KK2NrdXVzMi5jLCA2IEphbiAyMDAyLgorCitBZGRlZCBTRVQgUkdCLUNPTE9SUyBmb3IgR1VJLiAgY2t1dXNyLltjaF0sIGNrdXVzMy5jLCA2IEphbiAyMDAyLgorCitGcm9tIEplZmY6IE1vcmUgVGVsbmV0IGNoYW5nZXMsIERlYnVnIHNlbWFwaG9yZXMgZm9yIEs5NSwgZXRjOiBja2NkZWIuaCwKK2NrdXVzci5oLCBja3V1c1tyMzV4XS5jLCBja2N0ZWwuW2NoXSwgY2t1YXRoLmMsIDcgSmFuIDIwMDIuCisKK0FkZGVkIC0teHBvczpuIC0teXBvczpuLCBTRVQgR1VJIFdJTkRPVyBQT1NJVElPTiB4IHksIGFuZCBjaGFuZ2VkIFNFVAorUkdCLUNPTE9SUyB0byBTRVQgR1VJIFJHQkNPTE9SLiAgQWN0aW9uIG5lZWRzIHRvIGJlIGZpbGxlZCBpbiAoaW4gc2V0Z3Vpd2luKCkKK2luIGNrdXVzMy5jKSwgYW5kIGd1aV94cG9zIGFuZCBndWlfeXBvcyBuZWVkIHRvIGJlIGRlZmluZWQgaW4gY2tvPz8/LmMuCitja3V1c3IuaCwgY2t1dXNbcjN5XS5jLCA3IEphbiAyMDAyLgorCitBZGRlZCAtLWZvbnRuYW1lOm5hbWUgLS1mb250c2l6ZTpuYW1lIChhbmQgZmFjZW5hbWUgYXMgc3lub255bSBmb3IgZm9udG5hbWUpLgorY2t1dXNyLmgsIGNrdXVzWzd5XS5jLCA3IEphbiAyMDAyLgorCitNb3ZlZCBHVUkgKG5vdCBPUy8yKSBTRVQgVEVSTSBGT05UIGNvZGUgaW4gY2t1dXM3LmMgdG8gaXRzIG93biByb3V0aW5lLAorc2V0Z3VpZm9udCgpLCBpbiBja3V1czMuYywgYW5kIG1hZGUgR1VJIFNFVCBURVJNIEZPTlQgY2FsbCB0aGlzIHJvdXRpbmUsCithbmQgYWxzbyBtYWRlIFNFVCBHVUkgRk9OVCBjYWxsIHRoZSBzYW1lIHJvdXRpbmUuICBja3V1c1szN10uYywgNyBKYW4gMjAwMi4KKworQWRkZWQgLS10ZXJtdHlwZTosIC0taGVpZ2h0OiwgLS13aWR0aDosIC0tdXNlcjouICBBbHNvIGFkZGVkIHN5bWJvbHMgZm9yCistLXRlbG5ldDosIC0tc3NoOiwgLS1mdHA6LCAtLVtyZW1vdGUtXWNoYXJzZXQsIGFuZCAtLXBhc3N3b3JkOiwgYnV0IGRpZG4ndAorZmlsbCB0aGVtIGluLiAgLS1wYXNzd29yZDogaXMgcHJvYmFibHkgbm90IGEgZ29vZCBpZGVhIChidXQgd2UgYWxsb3cgaXQgZm9yCitGVFApOyB0aGUgb3RoZXJzIGludm9sdmUgYSBsb3Qgb2YgY29kZS1zaHVmZmxpbmcgYW5kIHJlY29uY2lsaWF0aW9uLCB3aGljaAorSSdsbCB0cnkgdG8gZG8gd2hlbiBJIGdldCBhIGNoYW5jZSAoZXNwZWNpYWxseSB0aGUgY29ubmVjdGlvbiBvbmVzLCB3aGljaAorY2FuIGJlIGRvbmUgYXMgcGFydCBvZiB0aGUgc2V0bGluKCkgcmVzdHJ1Y3R1cmluZykuICBja3V1c3IuaCwgY2t1dXN5LmMsCis4IEphbiAyMDAyLgorCitBbHNvIEkgdHJpZWQgY29tbWVudGluZyBvdXQgdGhlICNpZm5kZWYgS1VJLi4jZW5kaWYncyBhcm91bmQgU0VUIFRFUk1JTkFMCitDSEFSQUNURVItU0VUIChlYXNpZXIgc2FpZCB0aGFuIGRvbmUgYmVjYXVzZSBhIGNydWNpYWwgI2VuZGlmIHdhcyBtaXNsYWJlbGVkKS4KK0xldCdzIHNlZSBpZiBpdCBjb21waWxlcyAmIHdvcmtzLi4uICBja3V1czcuYywgOCBKYW4gMjAwMgorCitBZGRlZCBGVFAgWyBPUEVOIF0gL05PSU5JVCwgbWVhbmluZyBkb24ndCBzZW5kIFJFU1QsIFNUUlUsIGFuZCBNT0RFIGNvbW1hbmRzCit1cG9uIG1ha2luZyBhbiBGVFAgY29ubmVjdGlvbi4gIFRoaXMgYWxsb3dzIGNvbm5lY3Rpb24gdG8gc2VydmVycyB0aGF0IGNsb3NlCit0aGUgY29ubmVjdGlvbiAob3Igd29yc2UpIHdoZW4gZ2l2ZW4gdGhlc2UgY29tbWFuZHMgKGUuZy4gTGludXggMi40IFRVWCAyLjAKK0ZUUCBzZXJ2ZXIpLiAgY2tjZnRwLmMsIDggSmFuIDIwMDIuCisKK0xvb2tlZCBhdCBhZGRpbmcgY2FsbGVyIElEIHN1cHBvcnQgZm9yIHRoZSBBTlNXRVIgY29tbWFuZDoKKworIC4gU0VUIEFOU1dFUiBDQUxMRVItSUQgeyBPTiwgT0ZGIH0KKyAuIFNFVCBBTlNXRVIgUklOR1MgPG51bWJlcj4KKyAuIFx2KGNhbGxpZF94eHgpIHh4eCA9IHsgZGF0ZSwgdGltZSwgbmFtZSwgbm1iciwgbWVzZyB9CisgLiBDS0RfQ0lEIG1vZGVtIGNhcGFiaWxpdHkKKyAuIFNldCBDS0RfQ0lEIGZvciBtb2RlbXMgdGhhdCBoYXZlIGl0LgorIC4gQSBxdWljayBzdXJ2ZXkgc2hvd3M6CisgICAtIFVTUiBWLjkwOiAgICAgIE5vIChidXQgSmVmZiBzYXlzIHNvbWUgVVNScyBoYXZlIGl0KS4KKyAgIC0gVi4yNTA6ICAgICAgICAgTm8KKyAgIC0gTHVjZW50IFZlbnVzOiAgTm8KKyAgIC0gVVNSOiAgICAgICAgICAgI0NJRD0xICh0aGUgb25lcyB0aGF0IGhhdmUgaXQgLS0gWDI/KQorICAgLSBEaWFtb25kIFN1cHJhOiAjQ0lEPTEKKyAgIC0gUm9ja3dlbGwgNTZLOiAgI0NJRD0xCisgICAtIFBDVEVMOiAgICAgICAgICNDSUQ9MQorICAgLSBab2x0cml4OiAgICAgICArVkNJRD0xCisgICAtIENvbmV4YW50OiAgICAgICtWQ0lEPTEKKyAuIFNpbmNlIHRoZXJlIGFyZSBkaWZmZXJlbnQgY29tbWFuZHMgdG8gZW5hYmxlIGNhbGxlciBJRCByZXBvcnRpbmcsCisgICB3ZSBuZWVkIGEgbmV3IGZpZWxkIGluIHN0cnVjdCBNRE1JTkYuCisgLiBTSE9XIE1PREVNIGFuZCBTSE9XIERJQUwgd291bGQgbmVlZCB1cGRhdGluZy4KKyAuIGV0YyBldGMuLi4KKworVGhpcyBpcyBhbGwgd2F5IHRvbyBtdWNoIGZvciBub3cgc28gSSBqdXN0IGRpZCB0aGUgc2V0dGluZyBvZiB0aGUgXHYoY2FsbGlkXyopCit2YXJpYWJsZXMuICBUaGVzZSBhcmUgcmVzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbiBBTlNXRVIgY29tbWFuZCwgYW5kIHRoZW4KK3NldCBieSB0aGUgQU5TV0VSIGNvbW1hbmQgaWYgdGhleSBjb21lIGluOyB0aHVzIHRoZXkgcGVyc2lzdCBmcm9tIHRoZSB0aW1lCit0aGV5IGFyZSBjb2xsZWN0ZWQgdW50aWwgYW5vdGhlciBBTlNXRVIgY29tbWFuZCBpcyBnaXZlbi4gIFRvIHRha2UgYWR2YW50YWdlCitvZiBhdXRvYW5zd2VyLCB0aGUgdXNlciBoYXMgdG8gZW5hYmxlIGl0IGluIHRoZSBtb2RlbSAoYWxsIHRoZSBtb2RlbXMgSSBmb3VuZAordGhhdCBzdXBwb3J0IGl0IGhhdmUgaXQgZGlzYWJsZWQgYnkgZGVmYXVsdCksIGFuZCBhbHNvIGhhcyB0byBzZXQgdGhlIG51bWJlcgorb2YgcmluZ3MgdG8gYXQgbGVhc3QgMi4gIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCAoZGVwZW5kaW5nIG9uIHRoZSBtb2RlbSk6CisKKyAgc2V0IG1vZGVtIGNvbW1hbmQgYXV0b2Fuc3dlciBvbiBBVFMwPTIjQ0lEPTFcezEzfQorICBzZXQgbW9kZW0gY29tbWFuZCBhdXRvYW5zd2VyIG9uIEFUUzA9MitWQ0lEPTFcezEzfQorCithbmQgdW5kb25lIHdpdGg6CisKKyAgc2V0IG1vZGVtIGNvbW1hbmQgYXV0b2Fuc3dlciBvbiBBVFMwPTEjQ0lEPTBcezEzfQorICBzZXQgbW9kZW0gY29tbWFuZCBhdXRvYW5zd2VyIG9uIEFUUzA9MStWQ0lEPTBcezEzfQorCitUaGUgdmFyaWFibGVzIGNhbiBiZSBhY2Nlc3NlZCBvbmx5IGFmdGVyIHRoZSBjYWxsIGlzIGFuc3dlcmVkLiAgVGhlcmVmb3JlIHRoZQorb25seSB3YXkgdG8gcmVmdXNlIGEgY2FsbCBpcyB0byBhbnN3ZXIgaXQsIGluc3BlY3QgdGhlIHZhcmlhYmxlcywgYW5kIHRoZW4KK2hhbmcgaXQgdXAgaWYgZGVzaXJlZC4gIEZ1dHVyZSBLZXJtaXQgcmVsZWFzZXMgY2FuIGRvIHRoaXMgbW9yZSBuaWNlbHkgKGFzCitza2V0Y2hlZCBvdXQgYWJvdmUuKSAgQWxzbyB3aGlsZSBJIHdhcyBpbiB0aGUgZGlhbGluZyBjb2RlLCBJIGFkZGVkIHJlc3VsdAorY29kZSBWQ09OICg9IFZPSUNFKSwgdXNlZCBieSBzZXZlcmFsIG9mIHRoZSBuZXdlciBtb2RlbXMuICBUaGVzZSBjaGFuZ2VzIGFyZQordW50ZXN0ZWQuICBUaGUgU0VUIEFOU1dFUiBjb21tYW5kIGlzIHdyaXR0ZW4gYnV0IGNvbW1lbnRlZCBvdXQuICBja3V1c3IuaCwKK2NrY2tlci5oLCBja3V1c1tyM10uYywgY2t1ZGlhLmMsIDggSmFuIDIwMDIuCisKK0Zyb20gSmVmZjogZml4ZXMgdG8gLS10ZXJtdHlwZTosIC0taGVpZ2h0OiwgLS13aWR0aDosIC0tdXNlcjosIGFuZCBmaWxsaW5nIGluCitvZiAtLXJjaGFyc2V0Oiwgd2hpY2ggcmVxdWlyZWQgZXh0cmFjdGluZyBjb2RlIGZyb20gc2V0dHJtKCkgaW50byBhIHNlcGFyYXRlCitwYXJzZS1tZXRob2QtaW5kZXBlbmRlbnQgcmVtb3RlIGNoYXJhY3Rlci1zZXQgc2V0dGluZyByb3V0aW5lLiAgY2t1dXNbN3ldLmMsCis4IEphbiAyMDAyLgorCitGcm9tIEplZmY6IE1vcmUgd29yayBvbiBURVJNSU5BTCBDSEFSQUNURVItU0VUIGNvZGUgcmVvcmdhbml6YXRpb24sIGFuZAorcmVpbnN0YXRlbWVudCBvZiBTRVQgVEVSTUlOQUwgQ0hBUkFDVEVSLVNFVCBpbiBLOTVHLiAgQWxzbywgZml4IGNoYXIvQ0hBUgord2FybmluZ3MgaW4gVGVsbmV0IG1vZHVsZS4gIGNrdXVzNy5jLCBja2N0ZWwuYywgOSBKYW4gMjAwMi4KKworTWFkZSBTRVQgVEVSTSBDSEFSQUNURVItU0VUIHZpc2libGUgZm9yIGFsbCBidWlsZHMsIGluY2x1ZGluZyBLOTVHLCBhbmQgZmlsbGVkCitpbiBIRUxQIHRleHQgZm9yIGl0LiAgY2t1dXNbMjddLmMsIDkgSmFuIDIwMDIuCisKK0FkZGVkIGhlbHAgdGV4dCBmb3IgbmV3IGV4dGVuZGVkIG9wdGlvbnMuICBja3V1c3kuYywgOSBKYW4gMjAwMi4KKworQ29tbWVudGVkIG91dCB0aGUgcmV0dXJuKC0yKSBzdGF0ZW1lbnQgYXQgdGhlIGVuZCBvZiB4Z25ieXRlKCkgdG8gbWFrZSB0aGUKKyJTdGF0ZW1lbnQgbm90IHJlYWNoZWQiIGVycm9ycyBnbyBhd2F5LCBhZnRlciBjaGVja2luZyB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZQord2FzIG5vIHBhdGggdGhhdCBjb3VsZCBmYWxsIHRocm91Z2ggdG8gdGhlIGVuZC4gIEknbSA5OS45OSUgc3VyZSB0aGVyZSBpc24ndCwKK2J1dCB0aGF0IGRvZXNuJ3QgbWVhbiB0aGF0IHNvbWUgY29tcGlsZXJzIG1pZ2h0IG5vdCBzdGlsbCBjb21wbGFpbi4gIGNrY2Zucy5jLAorOSBKYW4gMjAwMi4KKworRnJvbSBKZWZmOiBmaXggdHlwbyBpbiB0aGUgSzk1IGV4dGVuZGVkLW9wdGlvbiBoZWxwIHRleHQ7IGFkZCBtb3JlCitzZW1hcGhvcmVzIHRvIG5ldHdvcmsgaS9vLiAgY2t1dXN5LmMsIGNrY25ldC5jLCAxMCBKYW4gMjAwMi4KKworVW5kaWQgYW5zaWlzbXMgaW4gc2V0e2xjbCxyZW19Y2hhcnNldCgpIGRlY2xhcmF0aW9ucy4gIGNrdXVzNy5jLCAxMCBKYW4gMjAwMi4KKworUmVtb3ZlZCBhIGR1cGxpY2F0ZWQgY2xhdXNlIGZyb20gdGhlIGluc3RhbGwgdGFyZ2V0LiAgbWFrZWZpbGUsIDEwIEphbiAyMDAyLgorCitGcm9tIEplZmY6IG1vcmUgc2VtYXBob3Jlcy4gIGNrY25ldC5jLCAxMSBKYW4gMjAwMi4KKworTW92ZWQgcmVmZXJlbmNlcyB0byB0bXB1c3JpZCBhbmQgdG1wc3RyaW5nIG91dCBvZiBOT1NQTCAjaWZkZWZzIC0tIHRoZXkgY2FuCitiZSB1c2VkIHdpdGggTk9TUEwuICBzZXRsaW4oKTogY2t1dXM3LmMsIDEzIEphbiAyMDAyLgorCitNYWRlIGEgZHVtbXkgZG9sb2dlbmQoKSByb3V0aW5lIG91dHNpZGUgb2YgI2lmbmRlZiBOT0lDUCwgc28gd2UgZG9uJ3QgaGF2ZQordG8gZW5jbG9zZSBldmVyeSByZWZlcmVuY2UgdG8gZG9sb2dlbmQgaW4gI2lmZGVmcy4gIChJIGhhZCBhZGRlZCBhIGJ1bmNoIG9mCitjYWxscyB0byBkb2xvZ2VuZCgpIHRocm91Z2hvdXQgdGhlIGNvZGUgdG8gaGFuZGxlIGF1dG9tYXRpYyBMT0NVUyBzd2l0Y2hpbmcuKQorY2t1dXMzLmMsIDEzIEphbiAyMDAyLgorCitNb3ZlZCAiZXh0ZXJuIGludCBuZXR0eXBlIiBvdXRzaWRlIG9mIE5PSUNQICNpZmRlZnMgaW4gY2t1dXM0LmMgZm9yIE5PSUNQCitidWlsZHMuICAxMyBKYW4gMjAwMi4KKworTW92ZWQgYSBtaXNwbGFjZWQgI2lmZGVmIGluIHRoZSBWRVJTSU9OIGNvbW1hbmQuICBja3V1c3IuYywgMTMgSmFuIDIwMDIuCisKK0RpZCA4MSBkaWZmZXJlbnQgZmVhdHVyZS1zZWxlY3Rpb24gYnVpbGRzIG9uIExpbnV4IChSSCA3LjApLCBhbGwgT0sgYWZ0ZXIgdGhlCitjaGFuZ2VzIGxpc3RlZCBhYm92ZSBmb3IgdG9kYXkuICAxMyBKYW4gMjAwMi4KKworQWRkZWQgcHJvdG90eXBlcyBmb3Igc2V0e3JlbSxsY2x9Y2hhcnNldCgpLiAgY2tjeGxhLmgsIDEzIEphbiAyMDAyLgorCitBZGRlZCBja2N4bGEuaCB0byBkZXBlbmRlbmNpZXMgZm9yIGNrdXVzeS5jLiAgY2t2a2VyLmNvbSwgMTMgSmFuIDIwMDIuCisKK01hZGUgYSBjb3JyZWN0aW9uIHRvIHRoZSBIRUxQIFNFVCBMT0NVUyB0ZXh0IGFuZCBzdXBwbGllZCBhIG1pc3NpbmcgY29tbWEKK2ZvciBIRUxQIFJFTU9URS4gIGNrdXVzMi5jLCAxMyBKYW4gMjAwMi4KKworQnVpbHQgT0sgb24gSFAtVVggMTEuMTEgKEsmUiBhbmQgQU5TSSksIFNvbGFyaXMgOCAoY2MpLCBTb2xhcmlzIDIuNS4xIChnY2MpLAorU3VuT1MgNC4xLjMgKGNjIGFuZCBnY2MpLCBWTVMgNy4xIChERUMgQywgbmV0IGFuZCBub25ldCksIFVuaXh3YXJlIDcuMS4xLAorVHJ1NjQgNC4wRywgSFAtVVggMTAuMjAgKEsmUiksIEFJWCA0LjMuMywgRnJlZUJTRCAyLjIuOCwgU2xhY2t3YXJlIDguMCwgSVJJWAorNi41LjEzZiwgSVJJWCA1LjMgKD8/PyBDYW4ndCB0ZWxsIC0tIHRoZSBjb21wdXRlciByYW4gb3V0IG9mIHN3YXAgc3BhY2UgLS0gYnV0CitpdCB3YXMgT0sgYSBmZXcgZGF5cyBhZ28pLCBWTVMgNS41LTIgKFZBWCBDLCBVQ1ggKyBub25ldCkuLi4gIEhQLVVYIDkuMDUsIC4uLgorCitTb21lIGNvcnJlY3Rpb25zIHRvIGNvbW1lbnRzIGluIEhQIHRhcmdldHMgZnJvbSBQZXRlckUuICBtYWtlZmlsZSwgMTQgSmFuIDIwMDIuCisKK0NvcnJlY3Rpb25zIHRvIHByb3RvdHlwZXMgZm9yIHNldHtyZW0sbGNsfWNoYXJzZXQoKSAoVk9JRCwgbm90IHZvaWQpIGZyb20gSmVmZi4KK2NrY3hsYS5oLCAxNCBKYW4gMjAwMi4KKworQnVpbGRzLCBjb250J2QuLi4gIFNJTklYIDUuNDIsIFJlZCBIYXQgTGludXggNS4yIG9uIGkzODYsIFN1U0UgNy4wIG9uIFMvMzkwLCAKK1JlZCBIYXQgNy4xIG9uIElBNjQsIFFOWCA0LjI1LCBIUC1VWCA1LjIxL1dpblRDUCwgLi4uLCAKKworRGVsbCBDb2xlbWFuIDxkZWxsQGFsZXBoLnR1bS5jb20+IG5vdGljZWQgdGhhdCBpbiBBSVgsIHRoZSBDT1BZIGNvbW1hbmQgYWx3YXlzCitzYXlzICJTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSB0aGUgc2FtZSBmaWxlIiB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlCitkb2Vzbid0IGV4aXN0LiAgVGhpcyBpcyBiZWNhdXNlIGluIEFJWCwgcmVhbHBhdGgoKSBmYWlscyB3aXRoIEVOT0VOVCAoZXJybm8KKzIpLiAgVGhlIHpmbnFmcCgpIGNvZGUgYWxyZWFkeSBhY2NvdW50cyBmb3IgdGhpcywgYnV0IGV2aWRlbnRseSBub3Qgd2VsbAorZW5vdWdoLiAgU28gSSBkaWQgd2hhdCBJIHNob3VsZCBoYXZlIGRvbmUgbG9uZyBhZ28uICB6Zm5xZnAoKSB3YXMgb3JpZ2luYWxseQorYWNjb21wbGlzaGVkIHdpdGggZG8taXQteW91cnNlbGYgY29kZS4gIExhdGVyIEkgYWRkZWQgc3VwcG9ydCBmb3IgcmVhbHBhdGgoKSwKK2FuZCBwYXJ0aXRpb25lZCB0aGUgcm91dGluZSBpbnRvIG11dHVhbGx5IGV4Y2x1c2l2ZSBjb21waWxlLXRpbWUgc2VjdGlvbnM6CisjaWZkZWYgQ0tSRUFMUEFUSCByZWFscGF0aCgpLi4uICNlbHNlIGRvLWl0LXlvdXJzZWxmLi4uICNlbmRpZi4gIEJ1dCBpZgorcmVhbHBhdGgoKSBmYWlsZWQsIHRoZXJlIHdhcyBubyByZWNvdXJzZSB0byB0aGUgZG8taXQteW91cnNlbGYgY29kZS4gIFRvZGF5IEkKK3JlcGxhY2VkIHRoZSAjZWxzZSB3aXRoIHRoZSAjZW5kaWYsIHNvIHRoZSBkby1pdC15b3Vyc2VsZiBwYXJ0IGlzIGFsd2F5cworaW5jbHVkZWQgYW5kIGlzIGV4ZWN1dGVkIGlmIHRoZSByZWFscGF0aCgpIGNhbGwgZmFpbHMuICBCdWlsdCBhbmQgdGVzdGVkIG9uCitBSVggNC4zLjMgYW5kIFNvbGFyaXMgMi41LjEsIGFzIHdlbGwgYXMgb24gTGludXggd2l0aCBhbmQgd2l0aG91dCB0aGUKK3JlYWxwYXRoKCkgY29kZSBpbmNsdWRlZC4gIHpmbnFmcCgpOiBja3VmaW8uYywgMTYgSmFuIDIwMDIuCisKK1NlcGFyYXRlZCBLOTUgYW5kIEMtS2VybWl0IHRlc3QgdmVyc2lvbiBudW1iZXJzLCBzbyBDLUtlcm1pdCBjYW4gYmUgUkMuMDIKK3doaWxlIEs5NSBpcyBCZXRhLjAxLiAgY2tjbWFpLmMsIDE2IEphbiAyMDAyLgorCitJbmhpYml0ZWQgMC1sZW5ndGggd3JpdGVzIGJ5IGNvbm9sKCkgYW5kIGNvbm9sbCgpLCBzaW5jZSB0aGV5IGNhdXNlIGJpZwordHJvdWJsZSB3aXRoIHRoZSBBSVggNC4zLjMgcHR5IGRyaXZlciwgZS5nLiB3aGVuIHlvdSBoYXZlIGFuIFNTSCBjb25uZWN0aW9uCitpbnRvIEFJWCBhbmQgcnVuIEMtS2VybWl0IHRoZXJlLiAgY2t1dGlvLmMsIDE2IEphbiAyMDAyLgorCitTdXBwcmVzc2VkICJTd2l0Y2hpbmcgTE9DVVMuLi4iIG1lc3NhZ2VzIGZyb20gRlRQIGNsaWVudCB3aGVuIGl0IHdhcyBpbnZva2VkCitmcm9tIHRoZSBjb21tYW5kIGxpbmUuICBja2NmbnMuYywgMTcgSmFuIDIwMDIuCisKK0RhdmUgU25lZGRvbiBub3RpY2VkIHRoYXQgRk9QRU4gL0FQUEVORCBnZXRzICI/V3JpdGUgYWNjZXNzIGRlbmllZCIgaW4gVk1TCitpZiB0aGUgZmlsZSBleGlzdHMuICBUaGlzIGlzIGFwcGFyZW50bHkgYmVjYXVzZSBWTVMgemNoa28oKSBkb2VzIHRoZSB3cm9uZwordGhpbmcuICBDb21tZW50aW5nIG91dCB0aGUgY2FsbCB6Y2hrbygpIGluIHRoZSBWTVMgY2FzZSBnZXRzIHBhc3QgdGhpcyBidXQKK3RoZW4gdGhlIGFwcGVuZGVkIHBhcnQgb2YgdGhlIGZpbGUgaGFzIGRpZmZlcmVudCBhdHRyaWJ1dGVzIHRoYW4gdGhlIG9yaWduYWwKK3BhcnQsIGUuZy46CisKKyAgYWJjICA8LSBvcmlnaW5hbCBsaW5lIChob3Jpem9udGFsLCBub3JtYWwpCisgIGQgICAgPC0gYXBwZW5kZWQgbGluZSAodmVydGljYWwpCisgIGUKKyAgZgorCitWTVMgZm9wZW4oKSB0YWtlcyBhbiBvcHRpb25hbCA0dGggYXJndW1lbnQ6IGEgc2VyaWVzIG9mIFJNUyBrZXl3b3JkPXZhbHVlCitwYWlycy4gIEtlcm1pdCBkb2Vzbid0IGdpdmUgYW55LiAgRXhwZXJpbWVudGF0aW9uIHNob3dzIHRoYXQgYXBwZW5kaW5nIHRvCithIFN0cmVhbV9MRiB3b3JrcyBmaW5lLiAgVGhhdCdsbCBiZSBhIHJlc3RyaWN0aW9uIGZvciBub3csIHVudGlsIHNvbWVib2R5CitzZW5kcyBpbiBjb2RlIHRvIGdldCB0aGUgUk1TIGF0dHJpYnV0ZXMgb2YgdGhlIG9yaWdpbmFsIGZpbGUgYW5kIGZlZWQgdGhlbQordG8gZm9wZW4oKS4gIEFsc28gbmVlZCBjb2RlIHRvIGZpeCBWTVMgemhja28oKSB0byBzYXkgd2hldGhlciBpdCdzIE9LIHRvCithcHBlbmQgdG8gYSBmaWxlLiAgY2t1dXM3LmMsIDE3IEphbiAyMDAyLgorCitTb21lYm9keSBzdWdnZXN0ZWQgSSBjb3VsZCBnZXQgYSB3b3JraW5nIEtlcm1pdCBmb3IgTmV1dHJpbm8gMisgYnkgZG9pbmcgdGhlCitRTlg2IGJ1aWxkIG9uIE5ldXRyaW5vIGl0c2VsZi4gIEkgdmVyaWZpZWQgdGhhdCB0aGlzIGNhbid0IGJlIGRvbmUgLS0gYXQgbGVhc3QKK25vdCBieSBtZSAtLSBzaW5jZSBOZXR1dHJpbm8gMisgZG9lc24ndCBoYXZlIGEgY29tcGlsZXIsIGFuZCB3ZSBhbHJlYWR5IGtub3cKK3RoZSB2ZXJzaW9uIGNyb3NzLWJ1aWx0IGZvciBpdCBvbiBRTlg0IGRvZXNuJ3Qgd29yay4gIDE3IEphbiAyMDAyLgorCitGcm9tIEplZmY6IFNFVCBTU0ggR1NTQVBJIEtFWS1FWENIQU5HRSB7IE9OLCBPRkYgfSBwYXJzaW5nLCBTSE9XIFNTSC4KK2NrdXVzMy5jLCAxOCBKYW4gMjAwMi4KKworUGV0ZXJFIHN1Z2dlc3RlZCB0aGF0IFNFVCBFU0NBUEUgYWxsb3cgOC1iaXQgZXNjYXBlIGNoYXJhY3RlcnMgYmVjYXVzZSBvZiB0aGUKK2RpZmZpY3VsdHkgaW4gZW50ZXJpbmcgQ3RybC1cIG9uIEV1cm9wZWFuIGtleWJvYXJkcyBhbmQgdGhlIGhhcmRzaGlwIChlLmcuIHRvCitFTUFDUyBhbmQgVkkgdXNlcnMpIG9mIHNhY3JpZmljaW5nIGFub3RoZXIgQzAgY29udHJvbCBjaGFyYWN0ZXIuICBMaWtlCitldmVyeXRoaW5nIHRoZXNlIGRheXMsIHRoaXMgdHVybnMgb3V0IHRvIGJlIHJhdGhlciBhIGJpZ2dlciBkZWFsIHRoYW4gaXQgd291bGQKK3NlZW0uICBUaGUgU0VUIEVTQ0FQRSBwYXJzZXIgY2FsbHMgc2V0Y2MoKSwgd2hpY2ggYWNjZXB0cyBjb250cm9sIGNoYXJhY3RlcnMKK2luIHZhcmlvdXMgZm9ybWF0cyAobGl0ZXJhbCwgXlggbm90YXRpb24sIG9yIG51bWJlcnMpLCBhbmQgZ2l2ZXMgYW4gZXJyb3IKK3JldHVybiBpZiB0aGUgdmFsdWUgaXMgbm90IDAtMzEgb3IgMTI3LiAgVGhpcyBpcyBjaGFuZ2VkIGVhc2lseSBlbm91Z2ggdG8gYWxzbworYWxsb3cgbnVtYmVycyBiZXR3ZWVuIDEyOCBhbmQgMjU1LiAgQnV0IHdobyBlbHNlIGNhbGxzIHNldGNjKCk/ICBUaGUgY29tbWFuZHMKK2ZvciBzZXR0aW5nIEtlcm1pdCBwYWNrZXQgc3RhcnQgYW5kIGVuZCBjaGFyYWN0ZXJzLiAgTm8gYmlnIGRlYWwsIHRoaXMgZ2l2ZXMKK3Blb3BsZSBhIGJpdCBtb3JlIGZsZXhpYmlsaXR5IGluIGNhc2UgdGhleSBuZWVkIGl0LCBidXQgaXQgd29uJ3QgYmUKK2RvY3VtZW50ZWQuICBzZXRjYygpOiBja3V1czcuYywgMTggSmFuIDIwMDIuCisKK1NpbmNlIGNvZGUgdG8gZGlzcGxheSB0aGUgZXNjYXBlIGNoYXJhY3RlciBpcyBzY2F0dGVyZWQgYWxsIG92ZXIgdGhlIHBsYWNlLAorYW5kIHNvbWUgb2YgaXQgaW5kZXhlcyBpbnRvIGFuIGFycmF5IGJhc2VkIG9uIHRoZSBjaGFyYWN0ZXIgdmFsdWUgKHdoaWNoIHdvdWxkCitub3cgZHVtcCBjb3JlIGlmIHRoZSBlc2NhcGUgY2hhcmFjdGVyIHdhcyA+IDEyOCksIEkgcHV0IHRoZSBjb2RlIGluIG9uZSBwbGFjZSwKK2EgbmV3IHNob2VzYygpIHJvdXRpbmUgaW4gY2t1dXN4LmMgKHdoaWNoIG5lZWRzIHRvIGJlIG91dHNpZGUgI2lmbmRlZiBOT0lDUCwKK3NpbmNlIHRoZSBDT05ORUNUIG1vZHVsZXMgdXNlIGl0IGV2ZW4gaW4gY29tbWFuZC1saW5lIG9ubHkgYnVpbGRzKS4gIEFsc28KK2Rpc2NvdmVyZWQgdGhhdCB0aGlzIGNvZGUgd2FzIGluZGV4aW5nIGludG8gdGhlIG5tW10gYXJyYXkgd2l0aCB0dF9lc2NhcGUgdG8KK2dldCAiZW5hYmxlZCIgb3IgImRpc2FibGVkIiwgd2hpY2ggaXMgbm8gbG9uZ2VyIGFwcHJvcHJpYXRlLCBzbyBmaXhlZCB0aGlzCit0b28uICBja3V1c3IuaCwgY2t1dXNbNXhdLmMsIDE4IEphbiAyMDAyLgorCitNYWRlIFNIT1cgRVNDQVBFLCBTSE9XIFRFUk0sIGFuZCB0aGUgdmFyaW91cyBDT05ORUNUIG1vZHVsZXMgY2FsbCBzaG9lc2MoKSwKK2FuZCB1cGRhdGVkIEhFTFAgU0VUIEVTQy4gIGNrdXVzWzI1XS5jLCBja3VjbnMuYywgY2tbY3V2ZDldY29uLmMsIDE4IEphbiAyMDAyLgorCitBZnRlciBhbGwgdGhhdCwgaXQgb2NjdXJyZWQgdG8gbWUgdGhhdCB0aGlzIGlzIGEgcmVhbGx5IGJhZCBpZGVhIGZvciBLOTUsCit3aXRoIGFsbCB0aGUgY29uZnVzaW9uIGFib3V0IENvbnNvbGUgY29kZSBwYWdlcywgT0VNIGNvZGUgcGFnZXMsIFdpbmRvd3MKK2NvZGUgcGFnZXMsIGFuZCBVbmljb2RlLiAgQnV0IEkgdHJpZWQgImVjaG8gXDE2MSIgYXQgdGhlIEs5NSBwcm9tcHQgYW5kIGdvdAordGhlIGV4cGVjdGVkIDgtYml0IGNoYXJhY3RlciBpbiBib3RoIHRoZSBDb25zb2xlIHZlcnNpb24gYW5kIHRoZSBHVUksIHNvCittYXliZSBpdCdzIE9LIGFmdGVyIGFsbC4KKworUmVtb3ZlZCB0aGUgYXV0b21hdGljIElLU0QgbG9naW4gY29kZSBmcm9tIHNldGxpbigpIHNpbmNlIGl0IGNvbXBsaWNhdGVzCitpbnRlcmFjdGl2ZSBhbm9ueW1vdXMgbG9naW4uICBja3V1czcuYywgMjAgSmFuIDIwMDIuCisKK0FuICNpZmRlZiBjbGF1c2UgZnJvbSBNYXR0aGV3IENsYXJrZSB0byBhdm9pZCAicmVkZWNsYXJhdGlvbiBvZiBmcmVlIiBlcnJvcgord2hlbiBidWlsZGluZyBhIGN1cnNlcyB2ZXJzaW9uIG9mIEMtS2VybWl0IGZvciBBSVggMi4yLjEgb24gUlQgUEMuICBja3V1c3guYywKKzIyIEphbiAyMDAyLgorCitUb29rIGNhcmUgb2Ygb25lIGRldGFpbCBJIG9taXR0ZWQgd2hlbiBhZGRpbmcgdGhlIDgtYml0IGVzY2FwZSBjaGFyYWN0ZXI6Citub3Qgc3RyaXBwaW5nIHRoZSA4dGggYml0IGJlZm9yZSBjb21wYXJpbmcgdGhlIGtleWJvYXJkIGNoYXIgd2l0aCB0aGUgZXNjYXBlCitjaGFyLiAgY2tbdXZdY29uLmMsIGNrdWNucy5jLCAyNCBKYW4gMjAwMi4KKworU3RhcnRlZCB0byBnbyB0aHJvdWdoIEplZmYncyBjaGFuZ2VzIG9mIHRoZSBsYXN0IHdlZWsgYnV0IGhlIGhhZCBydW4gdHJpbSAtdAorb24gdGhlbSwgd2hpY2ggdW50YWJpZmllcywgc28gdGhlIGRpZmZzIHdlcmUgaHVnZS4gIFJldGFiaWZ5aW5nIEplZmYncyBmaWxlcworb25seSBtYWtlcyBtYXR0ZXJzIHdvcnNlLiAgU28gaW5zdGVhZCBvZiBjb21wYXJpbmcgZWFjaCBvbGQgYW5kIG5ldyBzb3VyY2UKK2ZpbGUgaW4gRU1BQ1Mgd2luZG93cyB3aXRoIE0tWCBDb21wYXJlLVdpbmRvd3MgbGlrZSBJIHVzdWFsbHkgZG8gKHdoaWNoIGNhbid0CitiZSB0b2xkIHRvIGlnbm9yZSB3aGl0ZXNwYWNlKSwgSSBoYWQgdG8gd29yayBmcm9tIHRoZSBkaWZmIC1jIC1iIGxpc3RpbmdzLgorSW4gYXNjZW5kaW5nIG9yZGVyIG9mIHNpemUgb2YgZGlmZnM6CisKK2NrY2tlci5oOiBBZGQgSV9BTV9TU0hTVUIgZGVmaW5pdGlvbi4KK2NrdXVzci5oOiBYWExJTksgYW5kIFZOX1BFUlNPTkFMLCBldGMsIGRlZmluaXRpb25zLgorY2t1dXN5LmM6IFN1cHBvcnQgZm9yICJJIEFtIFNTSFNVQiIgaW52b2NhdGlvbi4KK2NrdXVzNS5jOiBTdXBwb3J0IGZvciBuZXcgSzk1IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCitja2NtYWkuYzogSW5pdCBlbmRpYW5uZXNzIGVhcmxpZXIgKEs5NSBUWVBFIHdhcyBicm9rZW4pLCAiSSBBbSBTU0hTVUIiIHN1cHBvcnQuCitja3V1czcuYzogU2VjdXJpdHkgI2lmZGVmcywgU1NIIE9QRU4gL1BBU1NXT1JELCBTU0hTVUIgc3VwcG9ydAorY2tjZnRwLmM6IDwtLSBTQVZFIFRJTCBMQVNUCitja3V1czYuYzogQWRkIExJTksgY29tbWFuZCBmb3IgSzk1IG9uIE5ULgorY2t1dXM0LmM6IFN1cHBvcnQgZm9yIG5ldyBLOTUgZGlyZWN0b3J5IHN0cnVjdHVyZTsgU1NIU1VCIHN1cHBvcnQKK2NrdXVzMy5jOiBTdXBwb3J0IGZvciBuZXcgSzk1IGRpcmVjdG9yeSBzdHJ1Y3R1cmU7IHNvbWUgU1NIIGNoYW5nZXMKK2NrdXVzMi5jOiBDaGFuZ2VzIHRvIFNTSCByZWxhdGVkIGhlbHAgdGV4dCwgYWRkIEhFTFAgTElOSyB0ZXh0Citja3V1c3IuYzogTElOSyBjb21tYW5kLCBTU0ggT1BFTiAvUEFTU1dPUkQ6IC9TVUJTWVNURU06IHN3aXRjaGVzLAorICBQYXR0ZXJuLW1hbmFnZW1lbnQgZml4ZXMuCitja2N0ZWwuYywgY2tfc3NsLmMsIGNrdWF0aC5jLCBja2NuZXQuYzoKKyBUb29rIEplZmYncyB3aXRob3V0IGxvb2tpbmcuCitja3V1c3guYywgY2t1Y25zLmMsIGNrdWNvbi5jLCBja3dhcnQuYzoKKyAgTXkgY2hhbmdlcyBmcm9tIHdlZWtzIGFnbyB0aGF0IHdlcmUgbmV2ZXIgcGlja2VkIHVwLgorCitCdWlsdCBPSyBvbiBTb2xhcmlzIHdpdGggZ2NjIGFuZCBvbiBTdW5PUyB3aXRoIChLJlIgbm9uLUFOU0kpIGNjLgorMzEgSmFuIDIwMDIuCisKK01lYW53aGlsZSwgSmVmZiBoYWQgbWFkZSB2YXJpb3VzIGNoYW5nZXMgaW4gcmVzcG9uc2UgdG8gSmF5YSBOYXRhcmFqYW4gYXQgSUJNLAord2hvc2UgYmFzaWMgY29tcGxhaW50IHdhcyB0aGF0IG51bWVyb3VzIGZhaWx1cmUgY29uZGl0aW9ucyB3ZXJlIG5vdCBiZWluZworZGV0ZWN0ZWQgaWYgdGhlIGZ1bGxzY3JlZW4gZmlsZS10cmFuc2ZlciBkaXNwbGF5IHdhcyBhY3RpdmUuICBKZWZmIGZvdW5kIHRoYXQKK3RoaXMgd2FzIGJlY2F1c2UgYmlnIGJsb2NrcyBvZiBjb2RlIHdlcmUgc2tpcHBlZCBpbiB0aGF0IGNhc2UgYW5kIGNoYW5nZWQgdGhlCitjb2RlIG5vdCB0byBkbyB0aGF0LCB3aGljaCBmaXhlZCB0aGUgcmVwb3J0ZWQgcHJvYmxlbXMuICBCdXQgbGF0ZXIgSmF5YSBzYWlkCit0aGF0ICJmdHAgbWdldCBmaWxlMSBmaWxlMiIgYWN0ZWQgbGlrZSAiZnRwIG1nZXQgKiIsIHNvIGl0IHNlZW1lZCB0aGF0IEplZmYncworZml4ZXMgYnJva2UgZmlsZSBzZWxlY3Rpb24uICBBZnRlciB0YWtpbmcgSmVmZidzIGZpeGVzIGZvciBja2NmdHAuYywgaG93ZXZlciwKK0kgc3RpbGwgY291bGQgbm90IHJlcHJvZHVjZSB0aGUgcHJvYmxlbS4gIGNrY2Z0cC5jLCAzMSBKYW4gMjAwMi4gIDwtLSBMYXRlciwKK2l0IHR1cm5lZCBvdXQgdGhlIHByb2JsZW0gd2FzIHdpdGggSUJNJ3MgY3VzdG9tIEZUUCBzZXJ2ZXIuCisKK0ZpeGVkIHVwZGF0ZXMgdGhhdCBJIG1pc3NlZCB5ZXN0ZXJkYXkgaW4gY2tjZnRwLmMsIGNrdXVzci5jLiAgTW92ZWQgbWlzcGxhY2VkCisjaWZkZWYgaW4gY2t1dXN5LmMgYnJlYWtpbmcgbm9uZXQgYnVpbGRzLiAgQWRkZWQgI2lmZGVmcyB0byBzeXNpbml0KCkgZm9yCitub25ldCBidWlsZHMgaW4gY2t1dGlvLmMuICBSYW4gdGhyb3VnaCBidWlsZC1pbi1tYW55LWNvbmZpZ3VyYXRpb25zIHNjcmlwdAoraW4gTGludXgsIGFsbCBidWlsZHMgT0suICAxIEZlYiAyMDAyLgorCitNb3ZlZCBzaG9lc2MoKSBkZWZpbml0aW9uIG91dHNpZGUgb2YgTk9YRkVSIHRvIGZpeCBOT1hGRVIgYnVpbGRzLgorY2t1dXN4LmMsIDEgRmViIDIwMDIuCisKK0FkZGVkIE1ZQ1VTVE9NIGRlZmluaXRpb24gYWxvbmdzaWRlIEtFUk1SQyBhbmQgY2hhbmdlZCBLRVJNQ0wgdG8gYmUgdGhlCitzYW1lIGFzIENLTUFYUEFUSCwgaW5zdGVhZCBvZiBzb21lIHJhbmRvbSBoYXJkd2lyZWQgbnVtYmVyLiAgY2t1dXNyLmgsCisxIEZlYiAyMDAyLgorCitDaGFuZ2VkIGNrY2RlYi5oIHRvIGRlZmluZSBESVJTRVAgYW5kIElTRElSU0VQKCksIGFuZCBwdXQgI2lmbmRlZgorW0lTXURJUlNFUC4uI2VuZGlmIGFyb3VuZCBhbGwgW0lTXURJUlNFUCBkZWZpbml0aW9ucyBpbiBja1t1ZHNvXWZpby5jLCBzbyB3ZQorY2FuIGZpbmFsbHkgcHV0IGF3YXkgdGhlIG1hbnkgcmVwZWF0ZWQgI2lmZGVmIGNoYWlucyB3aGVuIHdlIGdldCBhcm91bmQgdG8gaXQuCisxIEZlYiAyMDAyLgorCitNYWtlIFZNUyB6a2VybWluaSgpIHJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZSwgcmF0aGVyIHRoYW4gMCBhbHdheXMuCitja3ZmaW8uYywgMSBGZWIgMjAwMi4KKworQWRkZWQgY29kZSB0byBkb2luaXQoKSwganVzdCBiZWZvcmUgaXQgZ29lcyB0byBleGVjdXRlIHRoZSBpbml0IGZpbGUuICBJZiB0aGUKK2luaXQgZmlsZSBuYW1lIHdlIGFyZSBhYm91dCB0byBvcGVuIGlzIGVtcHR5IG9yIGZhaWxzIHpjaGtpKCksIHN1YnN0aXR1dGUgdGhlCitjdXN0b21pemF0aW9uIGZpbGVuYW1lLiAgRm9yIG5vdyB0aGlzIGNvZGUgaXMgaW4gI2lmZGVmIFVTRV9DVVNUT00uLiNlbmRpZiwKK3doaWNoIGlzIG5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQuICBJdCBkb2VzIHRoZSB0cmljayBpbiBVbml4IGFuZCBWTVMuICBBbHNvCitpbmNsdWRlZCBjb2RlIGZyb20gSmVmZiBmb3IgSzk1LCBidXQgdGhpcyBuZWVkcyB2ZXJpZmljYXRpb24gYW5kIHRlc3RpbmcuCitBbHNvIHVzZWQgRElSU0VQIGFuZCBJU0RJUlNFUCgpIHRocm91Z2hvdXQgZG9pbml0KCkgaW5zdGVhZCBvZiB0aGUgbG9uZyAjaWZkZWYKK2NoYWlucy4gIGNrdXVzNS5jLCAxIEZlYiAyMDAyLgorCitNb3ZlZCBzaG9lc2MoKSBwcm90b3R5cGUgZnJvbSBja3V1c3IuaCB0byBja2NrZXIuaCBzbyBtb2R1bGVzIHRoYXQgbmVlZCBpdAorZG9uJ3QgaGF2ZSB0byBpbmNsdWRlIGNrdXVzci5oIGp1c3QgZm9yIHRoaXMgb25lIHRoaW5nIChleGFtcGxlOiBja3Zjb24uYykuCisxIEZlYiAyMDAyLgorCitEZWZpbmVkIFVTRV9DVVNUT00gYnkgZGVmYXVsdCwgZXhjZXB0IGlmIE5PQ1VTVE9NIGlzIGRlZmluZWQuICBja3V1c3IuaCwKKzEgRmViIDIwMDIuCisKK0ZpeGVkIGtlcm1pdC1zc2hzdWIgY29kZSB0byByZWFsbHkgZW50ZXIgc2VydmVyIG1vZGUsIGFuZCB0byBwcmludAorIktFUk1JVCBSRUFEWSBUTyBTRVJWRS4uLiIgc28gc2NyaXB0cyBjYW4gd2FpdCBmb3IgaXQuICBBbHNvIGJ1bXBlZCB0aGUKK0MtS2VybWl0IHRlc3QgSUQgdG8gUkMuMDMgYW5kIHRoZSBLOTUgb25lIHRvIEJldGEuMDIuICBja2Nwcm8udywgY2tjbWFpLmMsCisyIEZlYiAyMDAyLgorCitJIHdhcyB0aGlua2luZyBhYm91dCBhZGRpbmcgU0VUIENPTU1BTkQgQlVGRkVSLVNJWkUgdG8gbGV0IHBlb3BsZSBhbGxvY2F0ZQorYXMgYmlnIGEgYnVmZmVyIGFzIHRoZXkgd2FudGVkIGF0IHJ1bnRpbWUsIG1haW5seSBmb3IgZGVmaW5pbmcgaHVnZSBtYWNyb3MuCitNb3ZlZCB0aGUgU0NNRF9ibGFoIGRlZmluaXRpb25zIGZyb20gY2t1dXNyLmggdG8gY2t1dXMzLmMsIHNpbmNlIHRoZXkgYXJlbid0Cit1c2VkIGFueXdoZXJlIGVsc2UuICBCdXQgc3RvcHBlZCB0aGVyZSBzaW5jZSB0aGUgcmVzdCB0dXJucyBvdXQgdG8gYmUgYSByYXRoZXIKK2JpZyBkZWFsLiAgY2t1dXNyLmgsIGNrdXVzMy5jLCAyIEZlYiAyMDAyLgorCitGcm9tIEplZmYsIDMgRmViIDIwMDI6CisgLiBGaXggYW4gb3V0LW9mLW9yZGVyIG1vZGVtIG5hbWUgaW4gdGhlIFNFVCBNT0RFTSBUWVBFIHRhYmxlOiBja3VkaWEuYy4KKyAuIFVzZSBTRVQgTE9HSU4gVVNFUiBhbmQgUEFTU1dPUkQgaWYgcHJlc2VudC4gY2tjZnRwLmMuCisKK0NvZHkgR291bGQgbm90aWNlZCB0aGF0IGFycmF5IGRlY2xhcmF0aW9ucyBoYWQgYmVjb21lIGNhc2Ugc2Vuc2l0aXZlLCBhbmQKK3VwcGVyIGNhc2UgZGlkbid0IHdvcmsuICBEaWFnbm9zaXM6IG1pc3BsYWNlZCBjYXNlIGNvbnZlcnNpb24gaW4geGFycmF5KCkuCitGaXhlZCBpbiBja3V1czUuYywgNCBGZWIgMjAwMi4KKworU0hPVyBWQVIgZHVtcHMgY29yZSBvbiBcdihzZXhwcmVzc2lvbikgb3IgXHYoc3ZhbHVlKSAtLSBmYWlsdXJlIHRvIGNoZWNrIGZvcgorTlVMTCBwb2ludGVyLiAgSSB3b25kZXIgd2h5IHRoaXMgZGlkbid0IGhhcHBlbiBiZWZvcmUgKGFuc3dlcjogYmVjYXVzZSBJIHdhcworZG9pbmcgaXQgb24gU3VuT1M7IG5vdyBJJ20gZG9pbmcgaXQgb24gU29sYXJpcykuICBja3V1czQuYywgNiBGZWIgMjAwMi4KKworSSd2ZSBoYWQgc2V2ZXJhbCByZXF1ZXN0cyBmb3IgInNob3cgdmFyIG5hbWUgbmFtZSBuYW1lLi4uIi4gIEkgYWRkZWQgdGhpcyB0bworZG9zaG93KCksIHN1Y2ggdGhhdCBTSE9XIFZBUiB3b3JrcyBleGFjdGx5IGFzIGl0IGRpZCBiZWZvcmUgKGlmIHlvdSBkb24ndCBnaXZlCitpdCBhbiBhcmcsIGl0IGxpc3RzIGFsbCB2YXJpYWJsZXM7IGlmIHlvdSBnaXZlIGl0IGFuIGFyZywgaXQgYXBwZW5kcyAiKiIgdG8gaXQKK2FuZCBsaXN0cyBhbGwgbWF0Y2hpbmcgdmFyaWFibGVzKSBidXQgbm93IHlvdSBjYW4gYWxzbyBnaXZlIG1vcmUgdGhhbiBvbmUgYXJnCithbmQgaXQgd29ya3MgdGhlIHNhbWUgd2F5IHdpdGggZWFjaCBvbmUgYXMgaXQgZGlkIGJlZm9yZSBpZiB5b3UgZ2F2ZSBpdCBhCitzaW5nbGUgaXRlbSAoaS5lLiwgIioiIGlzIGFwcGVuZGVkLCBzbyAic2hvdyB2YXIgb3MgY21kIiBzaG93cyBhbGwgdmFyaWFibGVzCit3aG9zZSBuYW1lcyBiZWdpbiB3aXRoICJvcyIgb3IgImNtZCIuICBZb3UgY2FuIGFsc28gZnJlZWx5IHVzZSBwYXR0ZXJuCitub3RhdGlvbiwgaW5jbHVkaW5nIGFuY2hvcnMuICBIbW1tLCBubywgYWN0dWFsbHkgaXQncyBkaWZmZXJlbnQgaW4gdGhhdCBub3cKK2VhY2ggaW5jbHVkZXMgYW4gaW1wbGllZCAqIGJlZm9yZSBBTkQgYWZ0ZXIsIHNvICJzaG93IHZhciB2ZXJzaW9uIiBzaG93cyBhbGwKK3ZhcmlhYmxlcyB3aG9zZSBuYW1lIGNvbnRhaW4gInZlcnNpb24iIHJhdGhlciB0aGFuIGFsbCB2YXJpYWJsZXMgd2hvc2UgbmFtZXMKK3N0YXJ0IHdpdGggaXQuICBja3V1czUuYywgNiBGZWIgMjAwMi4KKworQ29keSBHb3VsZCByZXBvcnRlZCB0aGF0IFdSSVRFIEZJTEUgYmxhaCBibGFoIFxmZXhlYyhhbnl0aGluZykgLi4uIGdvdCBhCitzcHVyaW91cyAiRmlsZSBvciBMb2cgbm90IG9wZW4iIGVycm9yLiAgVGhpcyB0dXJucyBvdXQgdG8gYmUgYSByYXRoZXIKK3BlcnZhc2l2ZSBwcm9ibGVtIC0tIHdoZW5ldmVyIHlvdSB1c2UgXGZleGVjKCkgaXQgY2FsbHMgdGhlIHBhcnNlciByZWN1cnNpdmVseQorYW5kIHRoaXMgY2FuIHJ1biByb3VnaHNob2Qgb3ZlciBnbG9iYWwgdmFyaWFibGVzLCBzdWNoIGFzIG91ciBpbm5vY2VudCBsaXR0bGUKK3gsIHksIGFuZCBzLiAgVGhlIGZpeCBpbiB0aGlzIGNhc2Ugd2FzIHRvIHB1dCB4IGFuZCB5IG9uIHRoZSBzdGFjay4gIFRoZSBzYW1lCit0aGluZyBwcm9iYWJseSBuZWVkcyBkb2luZyBpbiBhYm91dCAxMCwwMDAgb3RoZXIgcGxhY2VzLiAgVG9vIGJhZCBDIGlzbid0CitBbGdvbC4gIGNrdXVzci5jLCA2IEZlYiAyMDAyLgorCitNaW5vciBmaXggdG8gU0hPIFZBUiAtLSB0aGUgIl4iIGFuY2hvciB3YXNuJ3Qgd29ya2luZyAoZS5nLiAic2hvdyB2YXIgXm9zIikuCitja3V1czUuYywgNiBGZWIgMjAwMi4KKworRml4ZXMgZnJvbSBKZWZmIGZvciBGVFAgZmlsZS10cmFuc2ZlciBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGluIEs5NSBhbmQKK2luIFdJS1NELCBwbHVzIHVwZGF0ZWQgSzk1IFNTSCBoZWxwIHRleHQuICBja2NmdHAuYywgY2tjZm5zLmMsIGNrdXVzMi5jLAorNyBGZWIgMjAwMi4KKworU2VydmVyIGhhcyBpdHMgZGF0ZSBzZXQgaW4gdGhlIHBhc3QuICBDbGllbnQgc2F5cyAicmVtb3RlIGRpciIuICBTZXJ2ZXIgc2VuZHMKK0EgcGFja2V0IGNvbnRhaW5pbmcgb2xkIGRhdGUuICBJZiBjbGllbnQgaGFzIEZJTEUgQ09MTElTSU9OIFVQREFURSwgaXQKK3JlamVjdHMgdGhlIGRpcmVjdG9yeSBsaXN0aW5nLiAgQ2hhbmdlZCBnYXR0cigpIHRvIG9ubHkgcmVqZWN0IHJlYWwgZmlsZXMKKyhpbnRyb2R1Y2VkIGJ5IEYgcGFja2V0KSwgbm90IFgtcGFja2V0IG1hdGVyaWFsIGxpa2UgZGlyZWN0b3J5IGxpc3RpbmdzLgorY2tjZm4zLmMsIDcgRmViIDIwMDIuCisKK1VwLWRvd24gYXJyb3cga2V5cyBmb3IgY29tbWFuZCByZWNhbGwuICBQZW9wbGUgaGF2ZSBiZWVuIGFza2luZyBmb3IgaXQgZm9yCit5ZWFycyBidXQgbm93IGl0J3MgYWN0dWFsbHkgaW1wb3J0YW50IGJlY2F1c2Ugb2YgUERBcyB0aGF0IGRvbid0IGhhdmUgQ3RybAora2V5cy4gIFdvdWxkIGhhdmUgYmVlbiB0cml2aWFsIGV4Y2VwdCB0aGF0IHdlIHVzZSBnZXRjaGFyKCkgcmF0aGVyIHRoYW4KK2NvbmluYygpIGZvciByZWFkaW5nIGZyb20gdGhlIGtleWJvYXJkIGluIFVuaXggc28gY29uY2hrKCkgZG9lc24ndCBoZWxwLiAgSW4KK2ZhY3QgdGhlcmUgYXJlIGxvdHMgb2Ygb3RoZXIgcGxhY2VzIHdoZXJlIGNvbmNoaygpIGlzIHVzZWQgdGhpcyB3YXkgYW5kIHdvcmtzCitvbmx5IGJ5IGFjY2lkZW50LiAgVGhlIG9ubHkgcmVhc29uIHdlIG5ldmVyIG5vdGljZWQgYSBwcm9ibGVtIGJlZm9yZSBpcyB0aGF0CitjaGFyYWN0ZXJzIGRvbid0IHVzdWFsbHkgYXJyaXZlIGZyb20gdGhlIGtleWJvYXJkIHRoYXQgZmFzdC4gIEJ1dCB3aGVuIGFuCithcnJvdyBrZXkgc2VuZHMgIkVTQyBbIEEiIGFsbCBvbmNlLCB0aGUgc3RkaW4gYnVmZmVyIGdldHMgc29tZSBleHRyYSBzdHVmZiBpbgoraXQsIHdoaWNoIGdldGNoYXIoKSB3aWxsIHJldHVybiBuZXh0IHRpbWUsIGJ1dCB3aGljaCBjb25pbmMoKS9jb25jaGsoKSB3aWxsCituZXZlciBzZWUuICBTbyBJIGFkZGVkIGEgbmV3IGNtZGNvbmNoaygpIHJvdXRpbmUgd2hpY2gsIGlmIHRoZSBrZXlib2FyZCBpcworYmVpbmcgcmVhZCB3aXRoIGdldGNoYXIoKSByYXRoZXIgdGhhbiBjb25pbmMoKSwgbG9va3MgYXQgdGhlIHN0ZGluIGJ1ZmZlci4KK1VuZm9ydHVuYXRlbHksIGhvd2V2ZXIsIHRoZXJlIGlzIG5vIEFQSSBmb3IgdGhpcywgbm9yIGlzIHRoZXJlIGFueSBzdGFuZGFyZAord2F5IHRvIGFjY2VzcyB0aGUgc3RkaW4gYnVmZmVyIGRpcmVjdGx5LiAgU28gZmlyc3QgSSBkaWQgaXQgZm9yIFNvbGFyaXMuICBUaGVuCit0byBtYWtlIGl0IHBvcnRhYmxlIHJlcXVpcmVzIGEgc3VydmV5IG9mIHRoZSBoZWFkZXJzIGZvciBldmVyeSBwbGF0Zm9ybS4gIEkKK2ZvdW5kIGZvdXIgbWFqb3IgdmFyaWF0aW9uczoKKworICBzdGRpbi0+X3I6CisgICAge0ZyZWUsT3BlbixOZXR9QlNELCBCU0RJCisgIHN0ZGluLT5fY250OgorICAgIFN1bk9TLCBTb2xhcmlzLCBIUC1VWCA1LTYsIEFJWCwgVk1TLCBTSU5JWCwgSVJJWCA1LjMtNi41LCBER1VYCisgICAgNC4yQlNELCA0LjNCU0QsIE9TRi8xLi5UcnU2NCwgUU5YNCwgVW5peHdhcmUgMS4wLTIuMS4wCisgIHN0ZGluLT5fX2NudDoKKyAgICBIUC1VWCA3LTExLCBTQ086IE9TUjUuMC42YSwgVW5peHdhcmUgMi4xLjMtNy54LCBPVTgsIFVOSVggMy4ydjQueAorICBTdWJ0cmFjdCByZWFkIGZyb20gZW5kIHBvaW50ZXIgKF9JT19maWxlX2ZsYWdzIGRlZmluZWQpOgorICAgIExpbnV4ICh0ZXN0ZWQgb24gUkggNS4yIHRocnUgNy4xKQorCitUaGUgTGludXggbWV0aG9kIGlzIG5ldyBhbmQgZGlmZmVyZW50IHRvIGFjY291bnQgZm9yIG11bHRpYnl0ZSBjaGFyYWN0ZXJzLgorQWxsIHRoZSBvdGhlcnMgYXNzdW1lIGNoYXJhY3RlciA9PSBieXRlLgorCitGb3IgZG9jczogQU5TSSBvbmx5LCA3LWJpdCBvbmx5OyBib3RoIGFwcGxpY2F0aW9uIGFuZCBjdXJzb3IgbW9kZXMgYXJlCithY2NlcHRlZC4gIE9ubHkgdXAgYW5kIGRvd24gYXJyb3cgYXJlIGhhbmRsZWQ7IGxlZnQgYW5kIHJpZ2h0IGFycm93cyBjYXVzZQorYSBiZWVwLiAgY2t1Y21kLmMsIDggRmViIDIwMDIuCisKK0J1aWxkLWFsbDogRGlzY292ZXJlZCB0aGF0IGNoYW5naW5nIENUVE5BTSBmcm9tIFRUOiB0byBTWVMkSU5QVVQ6IGluIFZNUworKHdoaWNoIHdhcyBkb25lIG9uIDMgSmFuIDIwMDIgdG8gd29yayBhcm91bmQgcHJvYmxlbXMgc3RhcnRpbmcgS2VybWl0IGluCitiYXRjaCwgc3Bhd24nZCwgZXRjKSBicmVha3MgS2VybWl0IG9uIFZNUyA1LjUvVkFYIChjb25jYigpIGZhaWxzIHdpdGggImxhY2tzCitzdWZmaWNpZW50IHByaXZpbGVnZSI7IGlmIHlvdSBlbmFibGUgYWxsIHByaXZzIEtlcm1pdCBzdGFydHMgYnV0IHRoZW4gc3Bld3MKK291dCBhIGNvbnN0YW50IHN0cmVhbSBvZiBCRUwgY2hhcmFjdGVycykuICBJZiB5b3UgcHV0IGRmdHR5IGJhY2sgdG8gIlRUOiIsCitldmVyeXRoaW5nIGlzIGZpbmUgLS0gSSBoYXZlIG5vIGlkZWEgd2h5LCBzbyBJIHVzZWQgI2lmZGVmIFZNU1Y3MCB0byBkZWNpZGUsCit3aGljaCBpcyB0b3RhbGx5IGNydWRlLiAgTmV4dCBJIGhhZCB0byBmaW5kIHdoZXJlIHRoZSBib3VuZGFyeSByZWFsbHkgaXM6IFZBWAordnMgQWxwaGE/ICBWQVggQyB2cyBERUMgQz8gIE9yIGJldHdlZW4gVk1TIHJlbGVhc2VzPyAgQnVpbHQgb246CisgLiBWTVMgNi4yIEFscGhhIChERUMgQykgLSBPSyB3aXRoIFRUOgorIC4gVk1TIDYuMiBBbHBoYSAoREVDIEMpIC0gT0sgd2l0aCBTWVMkSU5QVVQ6IDwtLSBrZWVwIHRoaXMgb25lCisgLiBWTVMgNy4xIFZBWCAgIChERUMgQykKK1NvIHRoZSBmaW5hbCBjb25kaXRpb24gaXMgI2lmZGVmIFZNU1Y2MC4gIGNrdmtlci5jb20sIGNrdnRpby5jLCBja3V1czUuYy4KKworUU5YIDYgbmVlZGVkIHNvbWUgYXR0ZW50aW9uIHRvbzoKKyAuIFdob2V2ZXIgZGlkIHRoZSBtYWtlZmlsZSB0YXJnZXQgbWFkZSB0aGUgZGVmYXVsdCBwb3J0ICIvZGV2L3NlcjEiLgorIC4gQXJyb3cga2V5cy4uLgorQnV0IEkgZ2F2ZSB1cCBvbiBnZXR0aW5nIGFycm93IGtleXMgdG8gd29yayAtLSBpdCBzaG91bGQgYmUganVzdCBsaWtlICpCU0QsCitidXQgZm9yIHNvbWUgcmVhc29uIGdjYyBjb21wbGFpbnMgdGhhdCBzdHJ1Y3QgRklMRSBoYXMgbm8gX3IgbWVtYmVyLCBldmVuCit0aG91Z2ggaXQgZG9lcyAoZ2V0Y2hhciB1c2VzIGl0KS4KKworQ2hlY2tlZCBzdGRpby5oIG9uIE1hYyBPUyBYIGFuZCBpdCBsb29rcyBsaWtlIHRoZSAqQlNEcy4KKworLS0tIEMtS2VybWl0IDguMC4yMDEgLS0tCisKK1JlbW92ZWQgLWcgZnJvbSBzb2xhcmlzMnhnK2tyYjUra3JiNCtvcGVuc3NsK3NoYWRvdyBtYWtlZmlsZSB0YXJnZXQgLS0gaXQKK3dhcyBwcm9kdWNpbmcgYSAxNU1CIGJpbmFyeSEgIG1ha2VmaWxlLCAxNCBGZWIgMjAwMi4KKworRml4ZWQgYSBjb3VwbGUgdGhpbmtvcyBpbiAibWFrZSBpbnN0YWxsIjogJChERVNURElSKSBzaG91bGQgbm90IGhhdmUgYmVlbgoraW5jbHVkZWQgaW4gdGhlIHRlc3RzIGZvciB3aGV0aGVyIElORk9ESVIgb3IgU1JDRElSIHdlcmUgZGVzaXJlZC4gIG1ha2VmaWxlLAorMTQgRmViIDIwMDIuCisKKyh0YXJiYWxsIHJlZnJlc2hlZCAxNiBGZWIgMjAwMikKKworLS0tIEMtS2VybWl0IDguMC4yMDEgLS0tCisKK0Zyb20gSmVmZjogQmV0dGVyIHNlZWRpbmcgb2YgXGZyYW5kb20oKTogY2tjbWFpLmMsIGNrdXVzNC5jLCAxOCBGZWIgMjAwMi4KKworRnJvbSBKZWZmOiBNYWtlIGFycm93IGtleXMgd29yayBpbiBXSUtTRCwgYnV0IG5vdyBhbHNvIHVuY29uZGl0aW9uYWxseQorY29tcGlsZSBhcnJvdy1rZXkgY29kZSBpbiBhbGwgdmVyc2lvbnMuICBja3VjbWQuYywgMTggRmViIDIwMDIuCisKK0Zyb20gSmVmZjogY2t1YXRoLmMsIGNrX3NzbC5jLCBja2NuZXQuYyAoZGlkbid0IGxvb2spLiAgMTggRmViIDIwMDIuCisKK0FkZGVkIE9SSUVOVEFUSU9OIGNvbW1hbmQsIHRoYXQgbGlzdHMgdGhlIHZhcmlvdXMgaW1wb3J0YW50IGRpcmVjdG9yaWVzLCBhbmQKK1xmbG9uZ3BhdGhuYW1lKCkgYW5kIFxmc2hvcnRwYXRobmFtZSgpLCB3aGljaCBkbyBwYXRoIGZvcm1hdCBjb252ZXJzaW9ucyBpbgorV2luZG93cywgYW5kIGFyZSBqdXN0IHN5bm9ueW55bXMgZm9yIFxmcGF0aG5hbWUoKSBlbHNld2hlcmUuICBUaGUgbmV3IGZ1bmN0aW9ucworbmVlZCBidWlsZGluZyBhbmQgdGVzdGluZyBpbiBXaW5kb3dzLiAgY2t1dXNyLmgsIGNrdXVzW3IyNF0uYywgMTggRmViIDIwMDIuCisKK0NoYW5nZWQgUFdEIGZvciBXaW5kb3dzIG9ubHkgdG8gc2hvdyBib3RoIHNob3J0IGFuZCBsb25nIHBhdGhzIChidXQgb25seSBpZgordGhleSBhcmUgZGlmZmVyZW50OyBvdGhlcndpc2UgaXQgYmVoYXZlcyBhcyBiZWZvcmUpLiAgY2t1dXNyLmMsIDE4IEZlYiAyMDAyLgorCitDaGFuZ2VkIGRlZmF1bHQgV2luZG93cyBwcm9tcHQgdG8gc2hvdyBsb25nIHBhdGhuYW1lLiBja3V1czUuYywgMTggRmViIDIwMDIuCisKK1VwZGF0ZWQgSU5UUk8gY29tbWFuZCB0byBtZW50aW9uIEZUUCwgSFRUUCwgYW5kIFNTSC4gIGNrdXVzMi5jLCAxOCBGZWIgMjAwMi4KKworRnJvbSBKZWZmOiBmaXhlcyBmb3IgdHlwb3MgaW4gR2V0TG9uZ1BhdGhOYW1lKCkgY29kZTogY2t1dXNbcjRdLmMsIDIyIEZlYiAyMDAyLgorCitGcm9tIEplZmY6IG5ldC9hdXRoIHVwZGF0ZXM6IGNrY25ldC5jLCBja3VhdGguYywgMjIgRmViIDIwMDIuCisKK0FkZGVkIC1EVVNFX0ZJTEVfX0NOVCB0byBOQ1IgTVBSQVMgdGFyZ2V0cywgR2VvcmdlIEdpbG1lcjogbWFrZWZpbGUsCisyNCBGZWIgMjAwMi4KKworRnJvbSBKZWZmOiBBZGQgc3VwcG9ydCBmb3IgR2V0TG9uZ1BhdGhOYW1lKCkgaW4gV2luOTUgYW5kIE5UOiBja2NkZWIuaCwKK2NrdXVzW3I0XS5jLCAyNCBGZWIgMjAwMi4KKworRnJvbSBKZWZmOiBNb3JlIGZpeGVzIGZvciBGVFAgU0lHSU5ULCBwbHVzIGZpeCBbTV1QVVQgL01PVkUuICBja2NmdHAuYywKKzI0IEZlYiAyMDAyLgorCitGaXhlZCBhbiB1bmd1YXJkZWQgcmVmZXJlbmNlIHRvIGluc2VydmVyLCBndHdvcmQoKTogY2t1Y21kLmMsIDI0IEZlYiAyMDAyLgorCitBZGFwdGVkIFJFVFJJRVZFIGZvciB1c2Ugd2l0aCBGVFAgY29ubmVjdGlvbnM7IHRoaXMgb25lIHdhcyBtaXNzZWQgd2hlbgorYWRhcHRpbmcgR0VULCBSRUdFVCwgTU9WRSwgZXRjLiAgY2t1dXM2LmMsIGNrY2Z0cC5jLCAyNCBGZWIgMjAwMi4KKworQWRkZWQgc3BlY2lhbCBDT1BZUklHSFQgY29tbWFuZCB0ZXh0IGZvciB0aGUgZnJlZSB2ZXJzaW9uIG9mIFdJS1NELgorY2tjbWFpLmMsIGNrdXVzci5jLCAyNCBGZWIgMjAwMi4KKworQy1LZXJtaXQsIHdoZW4gaW4gQ09OTkVDVCBtb2RlIGFuZCBnaXZlbiB0aGUgPEVzYy1DaGFyPlUgc2VxdWVuY2UsIHdvdWxkCit1bmNvbmRpdGlvbmFsbHkgY2xvc2UgdGhlIGNvbm5lY3Rpb24gaWYgaXQgd2FzIGEgbmV0d29yayBjb25uZWN0aW9uLiAgVGhpcworaXMgYmFkIHdoZW4gVGVsbmV0dGluZyB0byBhIG1vZGVtIHNlcnZlci4gIEkgYWRkZWQgdG8gY29kZSB0byBwcmV2ZW50IHRoaXMKK2luIHRoZSBSRkMyMTE3IFRFTE5FVCBDT01QT1JUIGNhc2UgYnV0IEknbSBub3Qgc3VyZSBob3cgdG8gZXhlbmQgdGhpcyB0byB0aGUKK2dlbmVyYWwgY2FzZSAob3Igd2hldGhlciBpdCB3b3VsZCBiZSBhIGdvb2QgaWRlYSkuICBja3VjbnMuYywgMjQgRmViIDIwMDIuCisKK0R1cmluZyBmaWxlIHRyYW5zZmVyLCBjaGt0aW1vKCkgY2FsbHMgdHRnc3BkKCkgZm9yIGV2ZXJ5IHBhY2tldCwgd2hpY2ggY2xlYXJseQorZG9lc24ndCBtYWtlIHNlbnNlIG9uIG5ldHdvcmsgY29ubmVjdGlvbnMsIGVzcGVjaWFsbHkgc2luY2Ugb24gVGVsbmV0IENPTVBPUlQKK2Nvbm5lY3Rpb25zIGl0IHJlc3VsdHMgaW4gYSBuZXR3b3JrIHNwZWVkIHF1ZXJ5IGZvciBldmVyeSBwYWNrZXQuICBSZWFycmFuZ2VkCit0aGUgY29kZSBzbyB0aGlzIGhhcHBlbnMgb25seSBvbiB0cnVlIHNlcmlhbC1wb3J0IGNvbm5lY3Rpb25zLiAgY2tjZm4yLmMsCisyNCBGZWIgMjAwMi4KKworRnJvbSBKZWZmOiBGaXggcmV2ZXJzZWQgQU5TSS9ub24tQU5TSSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgY2xhdXNlcyBpbgorY2tjZnRwLmMsIDI2IEZlYiAyMDAyLgorCitDaGFuZ2VkIFVuaXggQ09OTkVDVCBtb2R1bGUgdG8gY2FsbCBrc3RhcnQoKSBvbmx5IHdoZW4gaXQgaGFzIGEgY2hhbmNlIG9mCitkb2luZyBhbnl0aGluZyAoaS5lLiBhIEtlcm1pdCBwYWNrZXQgaGFzIGJlZW4gcGFydGlhbGx5IGRldGVjdGVkLCBvciB0aGUKK3BhY2tldCBzdGFydCBjaGFyYWN0ZXIganVzdCBjYW1lIGluKSwgcmF0aGVyIHRoYW4gdW5jb25kaXRpb25hbGx5IG9uIGV2ZXJ5CitpbmNvbWluZyBjaGFyYWN0ZXIuICBja3VjbnMuYywgOCBNYXIgMjAwMi4KKworRlRQIFBVVCAvU0VSVkVSLVJFTkFNRTosIC9SRU5BTUUtVE86LCAvTU9WRS1UTzogd2VyZSBzdGlja3kuICBQYXRjaDogSW4KK2NrY2Z0cC5jLCBuZWFyIHRoZSB0b3Agb2YgZG9mdHBwdXQoKSwgYWRkIHRoZSBsaW5lcyBtYXJrZWQgd2l0aCAiKyI6CisKKyAgICBtYWtlc3RyKCZmaWxlZmlsZSxOVUxMKTsgICAgICAgICAgICAvKiBObyBmaWxlbmFtZSBsaXN0IGZpbGUgeWV0LiAqLworKyAgIG1ha2VzdHIoJnNydl9yZW5hbSxOVUxMKTsJCS8qIENsZWFyIC9TRVJWRVItUkVOQU1FOiAqLworKyAgIG1ha2VzdHIoJnNuZF9yZW5hbWUsTlVMTCk7CQkvKiAgUFVUIC9SRU5BTUUgKi8KKysgICBtYWtlc3RyKCZzbmRfbW92ZSxOVUxMKTsJCS8qICBQVVQgL01PVkUgKi8KKyAgICBwdXRwYXRoWzBdID0gTlVMOyAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGZvciBzeW5jZGlyKCkuICovCisKK2NrY2Z0cC5jLCAyNiBNYXIgMjAwMi4KKworXGZkYXkoKSBhbmQgXGZuZGF5KCkgd2VyZSBicm9rZW4gZm9yIGRhdGVzIHByaW9yIHRvIDE3IE5vdiAxODU4LiAgRml4ZWQgaW4KK2ZuZXZhbCgpOiBja3V1czQuYywgMjggTWFyIDIwMDIuCisKK0Zyb20gSmVmZjoKKyAuIE5ldyBjYWxsaW5nIGNvbnZlbmlvbiBmb3IgZGVtb3Njcm4oKTogY2t1Y21kLmMsIGNrdXVzeC5jCisgLiBGaXggZm9yIGhvc3QtaW5pdGlhdGVkIDgwLzEzMiBjb2wgc2NyZWVuIG1vZGUgY2hhbmdlLiAgY2t1dXM3LmMuCisgLiBOZXcgXHYoZGVza3RvcCkgdmFyaWFibGU6IEs5NSB1c2VyIGRlc2t0b3AgZGlyZWN0b3J5LCBja3V1c3IuaCwgY2t1dXM0LmMKKyAuIE5ldyBcdihyZmMyNzE3X3NpZ25hdHVyZSkgdmFyOiBUZWxuZXQgQ29tIFBvcnQsIGNrdXVzci5oLCBja3V1czQuYworIC4gVW5jb21tZW50ICJub3QtcmVhY2hlZCIgcmV0dXJuKC0yKSBpbiB4Z25ieXRlKCk6IGNrY2Zucy5jCisgLiBOZXcgZGF0ZXM6IGNrY21haS5jLgorIC4gVGVsbmV0IENvbSBQb3J0IGZpeGVzOiBja3V0aW8uYworIC4gU0VUIFBSSU5URVIgZml4ZXMgZm9yIEs5NTogY2t1dXMzLmMKKyAuIFNlc3Npb24gbGltaXQgYWRqdXN0bWVudHM6IGNrdXVzMy5jCisgLiBOZXcgZGlyZWN0b3J5IGxheW91dCBmb3IgSzk1IChUQUtFLCBPUklFTlQpOiBja3V1c3IuYworIC4gRml4ZXMgZm9yIFRlbG5ldCBDb20gUG9ydCwgcmVjeWNsaW5nIFNTSCBjb25uZWN0aW9uczogY2t1dXNyLmMKKworRnJvbSBtZSwgbm90IHBpY2tlZCB1cCBieSBKZWZmIHByZXZpb3VzbHk6CisgLiBrc3RhcnQoKSBzcGVlZHVwOiBja3VjbnMuYy4KKworMSBBcHIgMjAwMi4KKworLS0tSzk1IDEuMS4yMS0tLQorCitGcm9tIEplZmYsIDQgQXByIDIwMDI6CisgLiBNb3JlIGZpeGVzIGZvciBUZWxuZXQgQ29tIFBvcnQ6IGNrdXVzNC5jLCBja3VkaWEuYywgY2t1dGlvLmMsIGNrY25ldC5jOgorICAgLiBuZXR3b3JrIGNvbm5lY3Rpb25zIHdpbGwgY2hlY2sgZm9yIGNhcnJpZXIgZGV0ZWN0IGlmIFNFVAorICAgICBDQVJSSUVSLVdBVENIIGlzIE9OLiAgIFRoaXMgY291bGQgaGF2ZSBhIHBvdGVudGlhbCBjb25mbGljdCBpZgorICAgICB0aGUgb3B0aW9uIGlzIG5lZ290aWF0ZWQgYW5kIHRoZSBjYXJyaWVyIGlzIG9mZiwgYnV0IHRoZSBzaXRlCisgICAgIHJlcXVpcmVzIGxvZ2luLgorICAgLiBtb2RlbSBoYW5ndXAgbWVzc2FnZSBnZW5lcmF0ZWQgc2luY2UgdGhlIGRpYWwgbW9kdWxlIGRpZCBub3QKKyAgICAgYmVsaWV2ZSB0aGF0IG5ldHdvcmsgbW9kZW1zIGNvdWxkIGJlIHJlc2V0IHdpdGggYSBEVFIgZHJvcC4KKyAuIFZlcnNpb24gbnVtYmVyIGFkanVzdG1lbnRzOiA4LjAuMjAzLCAxLjEuOTk6IGNrY21haS5jLgorIC4gU2VjdXJpdHk6IGNrX3NzbC5bY2hdLCBja3VhdGguYy4KKworLS0tQy1LZXJtaXQgOC4wLjIwMy0tLQorCitGcm9tIEplZmYsIDYgQXByIDIwMDI6CisgLiBGaXggdHlwbyBpbiBIRUxQIFJFTU9URSBIT1NUOiBja3V1czIuYy4KKyAuIE1vcmUgVGVsbmV0IENvbSBQb3J0IGZpeGVzOiBja2N0ZWwuYywgY2tjbmV0LmMsIGNrdWRpYS5jLCBja3V0aW8uYworCitGcm9tIEplZmYsIDkgQXByIDIwMDI6CisgLiBGaXggYXV0b2Rvd25sb2FkIHByb2JsZW06IGNrY2ZuWzJzXS5jLgorCitDaGlha2kgSXNoaWthd2EgcmVwb3J0ZWQgdGhhdCBpbiBMaW51eCAodHdvIGRpZmZlcmVudCBraW5kcyksIGlmIHlvdSBjaG9vc2UKK2hhcmR3YXJlIHBhcml0eSwgQ09OTkVDVCwgdGhlbiBlc2NhcGUgYmFjaywgdGhlIHNwZWVkIGNhbiBjaGFuZ2UuICBJIHRyYWNrZWQKK3RoaXMgZG93biB0byB0aGUgZm9sbG93aW5nIHN0YXRlbWVudCBpbiB0dHZ0KCk6CisKKwl0dHR2dC5jX2NmbGFnICY9IH4oSUdOUEFSKTsJLyogRG9uJ3QgZGlzY2FyZCBpbmNvbWluZyBieXRlcyAqLworCitTb21laG93IGV4ZWN1dGlvbiBvZiB0aGlzIHN0YXRlbWVudCBjb3JydXB0ZWQgdGhlIHNwZWVkIHdvcmRzIG9mIHRoZSB0ZXJtaW9zCitzdHJ1Y3QsIHdoaWNoIGFyZSBlbnRpcmVseSBzZXBhcmF0ZSB3b3JkcyB0aGF0IGFyZSBub3doZXJlIG5lYXIgdGhlIGNfY2ZsYWcKK21lbWJlci4gIEFueXdheSwgdGhlIHN0YXRlbWVudCBpcyB3cm9uZzsgaXQgc2hvdWxkIGJlOgorCisJdHR0dnQuY19jZmxhZyB8PSBJR05QQVI7CS8qIERvbid0IGRpc2NhcmQgaW5jb21pbmcgYnl0ZXMgKi8KKworRml4aW5nIGl0IGN1cmVkIHRoZSBwcm9ibGVtOyBkb24ndCBhc2sgbWUgd2h5LiAgY2t1dGlvLmMsIDkgQXByIDIwMDIuCisKK0Zyb20gSmVmZjoKKyAgZml4ZXMgdGhlIHByb2JsZW0gcmVwb3J0ZWQgYnkgcm9iaUBoYXN0ZGVlci5jb20uYXUuICBUaGUgcmVxdWVzdCB0bworICBlbnRlciBzZXJ2ZXIgbW9kZSB3YXMgcmVjZWl2ZWQgd2hpbGUgd2Ugd2VyZSBlbnRlcmluZyBzZXJ2ZXIgbW9kZS4KKyAgQnV0IHRoZSBzZXJ2ZXIgd2FzIHdhaXRpbmcgZm9yIHRoZSByZXNwb25zZSB0byBSRVFfU1RPUCBzZW50IHRvIHRoZQorICBjbGllbnQuICBUaGVyZWZvcmUsIHdlIHdlcmVuJ3QgcXVpdGUgaW4gc2VydmVyIG1vZGUgeWV0IGFuZCB0aGUKKyAgcmVxdWVzdCB0byBlbnRlciBzZXJ2ZXIgbW9kZSB3YXMgcmVqZWN0ZWQuICBBIGNoZWNrIGZvciB0aGUgc3N0YXRlCisgIHZhbHVlIHNvbHZlcyB0aGUgcHJvYmxlbS4gIGNrY3RlbC5jLCAxMCBBcHIgMjAwMi4KKworQ2hpYWtpIElzaGlrYXdhIChDSSkgZGlzY292ZXJlZCB0aGUgcmVhbCBjYXVzZSBmb3IgdGhlIHNwZWVkIGNoYW5naW5nIHByb2JsZW0uCitJIHdhcyBzZXR0aW5nIHRoZSBJR05QQVIgYml0IGluIHRoZSB3cm9uZyBmbGFnIHdvcmQ6IGl0IHNob3VsZCBoYXZlIGJlZW4KK2NfaWZsYWcgaW5zdGVhZCBvZiBjX29mbGFnLCBzaWxseSBtZS4gIEZpeGVkIGluIHR0dnQoKSBhbmQgdHRwa3QoKTogY2t1dGlvLmMuCitJIGFsc28gZGlkIGEgdGhvcm91Z2ggY2Vuc3VzIG9mIGFsbCB0aGUgdGVybWlvW3NdIGZsYWdzIHRvIGVuc3VyZSBlYWNoIHdhcworYXBwbGllZCB0byB0aGUgcmlnaHQgZmxhZyB3b3JkIC0tIHRoZXkgd2VyZSwgSUdOUEFSIGluIHRoZSBIV1BBUklUWSBjYXNlIHdhcwordGhlIG9ubHkgbWlzdGFrZS4gIENJIGFsc28gZGlzY292ZXJlZCB0aGF0IHRoZSBzcGVlZCB3b3JkcyBpbiB0aGUgTGludXgKK3Rlcm1pb3Mgc3RydWN0IGFyZSBub3QgdXNlZCBhdCBhbGwgLS0gdGhlIHNwZWVkcyBhcmUgZW5jb2RlZCBpbiBhbgordW5kb2N1bWVudGVkIGZpZWxkIG9mIGNfY2ZsYWcsIHdoaWNoIGV4cGxhaW5zIHRoZSBwcm9ibGVtLiAgMTAgQXByIDIwMDIuCisKK0FueSB1c2Ugb2YgXHtubm59IGNoYXJhY3RlciBub3RhdGlvbiBpbiBhIG1hY3JvIGRlZmluaXRpb24sIGxvb3AsIG9yIG90aGVyCiticmFjZWQgYmxvY2sgY2F1c2VkIGFuICJ1bmJhbGFuY2VkIGJyYWNlcyIgcGFyc2UgZXJyb3IuICBUaGUgYmFja3NsYXNoIGluIHRoaXMKK2Nhc2UgaXMgbm90IHF1b3RpbmcgdGhlIG9wZW4gYnJhY2U7IGl0J3MgaW50cm9kdWNpbmcgYSBiYWxhbmNlZCBicmFjZWQKK3F1YW50aXR5LiAgU3BlY2lhbC1jYXNlZCBpbiBnZXRuY20oKTogY2t1dXM1LmMsIDEyIEFwciAyMDAyLgorCitUaGUgc2VtYW50aWNzIG9mICJpZiBkZWZpbmVkIFx2KHh4eCkiIHdlcmUgY2hhbmdlZCBpbiA4LjAgdG8gYXZvaWQgb2Jub3hpb3VzCitlcnJvciBtZXNzYWdlcyB3aGVuIHh4eCB3YXMgbm90IGEgYnVpbHQtaW4gdmFyaWFibGUgKHNlZSBub3RlcyBvZiAxOSBOb3YKKzIwMDApLCBzdWNoIHRoYXQgImlmIGRlZmluZWQgXHYoeHh4KSIgd291bGQgYWx3YXlzIHN1Y2NlZWQgaWYgdGhlcmUgd2VyZSBzdWNoCithIHZhcmlhYmxlLCBldmVuIGlmIGl0IGhhZCBubyB2YWx1ZS4gIFRoZSBiZWhhdmlvciB0aGF0IGlzIGRvY3VtZW50ZWQgaW4gdGhlCitib29rIChhbmQgYWxzbyBpbiBja2VybWl0NzAuaHRtbCkgYW5kIHRoYXQgd2UgaGFkIGluIHZlcnNpb25zIDYgYW5kIDcsIHdhcwordGhhdCBJRiBERUZJTkVEIFx2KHh4eCkgd291bGQgZmFpbCBpZiBcdih4eHgpIHdhcyBkZWZpbmVkIGJ1dCBoYWQgYW4gZW1wdHkKK3ZhbHVlIE9SIGlmIGl0IHdhcyBub3QgZGVmaW5lZCwgYW5kIHdvdWxkIHN1Y2NlZWQgb25seSBpZiBpdCB3YXMgZGVmaW5lZCBhbmQKK2hhZCBhIHZhbHVlLiAgRml4ZWQgaW4gYm9vbGV4cCgpOiBja3V1czYuYywgMTIgQXByIDIwMDIuCisKK1doYXQgYWJvdXQgXGZ1bmN0aW9uKClzPyAgSUYgREVGIFxmYmxhaCgpIHByZXNlbnRseSBzdWNjZWVkcyBpZiB0aGUgZnVuY3Rpb24KK2V4aXN0czsgeW91IGRvbid0IGV2ZW4gaGF2ZSB0byBnaXZlIGFyZ3VtZW50cy4gIEkgdGhpbmsgdGhpcyBiZWhhdmlvciBpcyBtb3JlCit1c2VmdWwgdGhhbiBpZiBJIHJlcXVpcmVkIHZhbGlkIGFyZ3VtZW50cyBhbmQgdGhlbiBldmFsdWF0ZWQgdGhlIGZ1bmN0aW9uIC0tCit5b3UgY2FuIGRvIHRoYXQgYW55d2F5IHdpdGggJ2lmIG5vdCBlcSAiXGZ4eHgoYSxiKSIgIiIgLi4uJyAgT2YgY291cnNlIHRoaXMKK2FyZ3VtZW50IGFwcGxpZXMgdG8gImlmIGRlZiBcdih4eHgpIiB0b28sIGV4Y2VwdCB0aGF0IHRoZSBjdXJyZW50IGJlaGF2aW9yIGlzCitjb25zaXN0ZW50IHdpdGggdGhlIDcuMCBiZWhhdmlvciwgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBjaGFuZ2UuCisKK0tlbnQgTWFydGluIGRpc2NvdmVyZWQgdGhhdCBpZiBhIG1hY3JvIGNvbnRhaW5zIGEgTE9DQUwgc3RhdGVtZW50IGZvciBhCit2YXJpYWJsZSB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzLCBvciBhIHVuaXF1ZSBsZWZ0IHN1YnN0cmluZyBvZiwgdGhlIG1hY3JvJ3MKK25hbWUsIHRoZW4gdW5kZWZpbmluZyB0aGUgbG9jYWwgdmFyaWFibGUgbWFrZXMgdGhlIG1hY3JvIGRpc2FwcGVhcjoKKworICBkZWZpbmUgRGF0ZURpZmYgeworICAgIGVjaG8ge0RhdGVEaWZmKFwlMSkgZXhlY3V0aW5nLi4ufQorICB9CisgIGRlZmluZSBLZW50IHsKKyAgICBkbyBEYXRlRGlmZiB7Mn0KKyAgICBsb2NhbCBkYXRlCisgICAgYXNzaWduIGRhdGUge30KKyAgICBkbyBEYXRlRGlmZiB7M30gIDwtLSBUaGlzIGZhaWxzIChBKQorICB9CisgIGRvIERhdGVEaWZmIHsxfQorICBkbyBLZW50CisgIGRvIERhdGVEaWZmIHs0fSAgICA8LS0gU28gZG9lcyB0aGlzIChCKQorCitUaGUgZmlyc3QgcGFydCBvZiB0aGUgcHJvYmxlbSBpcyB0aGF0ICJhc3NpZ24gZGF0ZSB7fSIgY2FsbGVkIGRlbG1hYyB3aXRoCitleGFjdD0wLCBzbyBkZWxtYWMgZXZpZGVudGx5IGRlbGV0ZWQgZmlyc3QgbWFjcm8gd2hvc2UgbmFtZSBzdGFydGVkIHdpdGgKKyJkYXRlIiAtLSBhbmQgc2luY2UgdGhlIG9ubHkgb25lIHdhcyBEYXRlRGlmZiwgdGhhdCdzIHRoZSBvbmUgdGhhdCB3YXMKK2RlbGV0ZWQuICBGaXhpbmcgdGhpcyAoY2hhbmdlICJkZWxtYWModm5wLDApIiB0byAiZGVsbWFjKHZucCwxKSIgaW4gZG9kZWYoKSkKK2dvdCB1cyBwYXN0IEEuICBUaGUgc2Vjb25kIHBhcnQgd2FzIG1ha2luZyB0aGUgc2FtZSBmaXggdG8gdGhlIGRlbG1hYygpCitjYWxsIGluIHBvcGNsdmwoKS4gIGNrdXVzWzU2XS5jLCAxMyBBcHIgMjAwMi4KKworVGhlIElOUFVUIGNvbW1hbmQgaWdub3JlZCB0aGUgcGFyaXR5IHNldHRpbmcsIHRodXMgU0VUIFBBUklUWSBFVkVOLAorSU5QVVQgMTAgImxvZ2luOiIgZGlkbid0IHdvcmsuICBGaXhlZCBpbiBkb2lucHV0KCk6IGNrdXVzNC5jLiAgQWxzbyBmaXhlZCBhCitib2d1cyAjaWZkZWYgQ09NTUVOVCBzZWN0aW9uIHRoYXQgbWVzc2VkIHVwIHRoZSBibG9jayBzdHJ1Y3R1cmUgb2YgdGhlIG1vZHVsZQorYW5kIHRoZXJlZm9yZSBFTUFDUydzIGluZGVudGluZy4gIDE4IEFwciAyMDAyLgorCitBZGRlZCBzY28zMnY1MDBuZXQrc3NsIGFuZCBBZGRlZCBzY28zMnY1MDVuZXQrc3NsIHRhcmdldHMsIGZyb20gU2NvdHQgUm9jaGZvcmQKK2F0IERlbGwgKG5vdCBzdXJlIHlldCBpZiB0aGV5IHdvcmspLiAgTWFrZWZpbGUsIDE5IEFwciAyMDAyLgorCitGcm9tIEplZmYsIDIyIEFwciAyMDAyOgorIC4gQWRkZWQgImRhcmtncmF5IiBjb2xvciBhbmQgbWFkZSAiZGdyYXkiIGFuIGludmlzaWJsZSBzeW5vbnltOiBja3V1czMuYy4KKyAuIEZpeCBjYXJyaWVyIHNlbnNlIG9uIFRlbG5ldCBDb20gUG9ydCBpbW1lZGlhdGVseSBhZnRlciBkaWFsOiBja3VkaWEuYy4KKyAuIENoYW5nZSBrcmI1X2Rlc19ibGFoKCkgYXJnIGxpc3Q6IGNrdXRpby5jLgorIC4gRml4IHR0Z21kbSgpIGZvciBUZWxuZXQgQ29tIFBvcnQ6IGNrdXRpby5jLgorIC4gRml4IHR0aGFuZygpIHJldHVybiBjb2RlOiBja3V0aW8uYy4KKyAuIEFkZCBhaXg0M2djYytvcGVuc3NsIHRhcmdldDogbWFrZWZpbGUuCisKK0Zyb20gSmVmZiwgMjUgQXByIDIwMDI6CisgLiBGaXggU0VUIEdVSSBrZXl3b3JkIHRhYmxlOiBja3V1c1szN10uYy4KKyAuIEEgZmluYWwgZml4IHRvIFRlbG5ldCBDb20gUG9ydDogY2tjdGVsLmMsIGNrY25ldC5jLgorCitGcm9tIEplZmYsIDI2IEFwciAyMDAyOgorIC4gQW5vdGhlciBmaW5hbCBmaXggdG8gVGVsbmV0IENvbSBQb3J0OiBja2N0ZWwuYywgY2t1ZGlhLmMuCisKK0Zyb20gSmVmZiwgMjcgQXByIDIwMDI6CisgLiBzZXBhcmF0ZSB0aGUgd2FpdCBtZWNoYW5pc20gZm9yIFRFTE5FVCBTQiBDT01QT1JUIHN5bmNocm9ub3VzIG1lc3NhZ2VzCisgICBmcm9tIHRoZSBhc3luY2hyb25vdXMgVEVMTkVUIFNCIENPTVBPUlQgTU9ERU1TVEFUVVMgbWVzc2FnZXM6IGNrY3RlbC5bY2hdCisgLiBmaXggZGVidWcgbWVzc2FnZXMgaW4gQ2VydGlmaWNhdGUgdmVyaWZ5IGZ1bmN0aW9uczogY2tfc3NsLmMsIGNrY2Z0cC5jLmEKKworRnJhbmssIDI3IEFwciAyMDAyOgorIC4gRml4ZWQgVk1TIHpnZXRmcygpIHRvIGZhaWwgd2hlbiBmaWxlIGRvZXNuJ3QgZXhpc3Q6IGNrdmZpby5jLgorIC4gRml4ZWQgVU5JWCB6Z2V0ZnMoKSB0byBjaGVjayBmb3IgbnVsbCBvciBlbXB0eSBhcmc6IGNrdWZpby5jLgorIC4gQWRkZWQgI2luY2x1ZGUgPHRpbWUuaD4gZm9yIHRpbWUoKSBjYWxsOiBja2NtYWkuYy4KKyAuIEFkZCBjYXN0cyB0byBhcmdzIGluIHRuX3dhaXQoKSBjYWxsczogY2tjdGVsLmMuCisKK1NJTklYLVAgNS40MiAoUHlyYW1pZCBhcmNoaXRlY3R1cmUpIG1ha2VmaWxlIHRhcmdldCBmcm9tIElnb3IgU29icmFkby4KK21ha2VmaWxlIChubyBzb3VyY2UtY29kZSBjaGFuZ2VzKSwgMSBNYXkgMjAwMi4KKworRnJvbSBKZWZmLCA1IE1heSAyMDAyLAorIC4gRml4IHNvbWUgInVua25vd24gaG9zdCIgbWVzc2FnZXM6IGNrY2Z0cC5jLgorIC4gQWRkIG1vcmUgY2FzdHMgdG8gdG5jX3dhaXQoKSBjYWxsczogY2t1ZGlhLmMuCisgLiBJbXByb3ZlbWVudHMgdG8gU0hPVyBTU0gsIFNIT1cgR1VJOiBja3V1czMuYy4KKyAuIEZpeGVzIHRvIFNFVCBDT01NQU5EIHsgV0lEVEgsIEhFSUdIVCB9OiBja3V1czMuYy4KKyAuIFVwZGF0ZXMgdG8gY2tfc3NsLltjaF0sIGNrY3RlbC5jLCBja2NuZXQuYy4KKworRml4ZWQgdGhlIGVycm9uZW91cyBzZXR0aW5nIG9mIHNzaF9jYXMgZHVyaW5nIHN3aXRjaCBwYXJzaW5nIHJhdGhlciB0aGFuCithZnRlciBjbWNmbSgpIGluIHNldGxpbigpOiBja3V1czcuYywgNSBNYXkgMjAwMi4KKworc2V0bGluKCkgZGVjb21wb3NpdGlvbiAoMjMwMCBsaW5lcyksIFBhcnQgT25lOiAKKworIC4gQ29waWVkIGEgYmlnIGNodW5rIGZyb20gdGhlIGVuZCBvZiBzZXRsaW4oKSwgYmVnaW5uaW5nIHdpdGggbmV0IGRpcmVjdG9yeQorICAgbG9va3VwLCBidXQgb25seSB0aGUgbmV0d29yay1zcGVjaWZpYyBhbmQgY29tbW9uIHBhcnRzLCB0byBhIG5ldyByb3V0aW5lLAorICAgY3hfbmV0KCksIDkwMCBsaW5lcy4KKworIC4gRXh0cmFjdGVkIG1hbnkgcmVwZXRpdGlvdXMgbGluZXMgb2YgZXJyb3ItbWVzc2FnZSBjb2RlIGZyb20gY3hfbmV0KCkKKyAgIHRvIGEgbmV3IHJvdXRpbmUsIGN4X2ZhaWwoKS4gIEVycm9yIG1lc3NhZ2VzIGFyZSBzdG9yZWQgaW4gc2xtc2csIGFuZAorICAgYWxzbyBwcmludGVkIGJ1dCBvbmx5IGlmIHdlIHdlcmUgbm90IGNhbGxlZCBmcm9tIGEgR1VJIGRpYWxvZyAoYW5kCisgICBRVUlFVCB3YXNuJ3Qgc2V0LCBldGMgZXRjKS4gIEFueSBhZGp1dG1lbnRzIGluIHRoaXMgcG9saWN5IGNhbiBub3cgYmUKKyAgIG1hZGUgaW4gb25lIHBsYWNlLgorCisgLiBJIHB1dCBhIGNhbGwgdG8gY3hfbmV0KCkgaW4gc2V0bGluKCkganVzdCBiZWZvcmUgYWxsIHRoZSBjb2RlIGl0IHJlcGxhY2VkLgorICAgSXQgd29ya3MgZm9yIFRFTE5FVCBhbmQgU0VUIEhPU1QgL1RFTE5FVC4KKworIC4gQnVpbHQgd2l0aCBta3dhdHNvbC1rNWs0c3NsOyBhZnRlciBhIGNvdXBsZSBmaXhlcyBpdCBidWlsZHMgT0sgYW5kIG1ha2VzCisgICBLZXJiZXJpemVkIGNvbm5lY3Rpb25zIE9LLgorCisgLiBDb3BpZWQgdGhlIHNlcmlhbC1wb3J0IGFuZCBjb21tb24gcGFydHMgb2YgdGhlIHNldGxpbigpIHBvc3QtY21jZm0oKQorICAgY29kZSB0byBhbm90aGVyIG5ldyByb3V0aW5lLCBjeF9zZXJpYWwoKSwgYWJvdXQgMjc1IGxpbmVzLiAgRml4ZWQKKyAgIG1lc3NhZ2VzIG5vdCB0byBjb21lIG91dCB3aGVuIGNhbGxlZCBmcm9tIEdVSSBkaWFsb2csIGV0Yy4gIEluc2VydGVkCisgICBhIGNhbGwgdG8gY3hfc2VyaWFsKCkgYXQgdGhlIGFwcHJvcHJpYXRlIHNwb3QgaW4gc2V0bGluKCkuICBUZXN0ZWQKKyAgIHNlcmlhbCBjb25uZWN0aW9ucyBvbiB3YXRzdW4gd2l0aCAic2V0IGxpbmUgL2Rldi90dHloNiIsIHdvcmtzIE9LLgorCisgLiBSZW1vdmVkIGFsbCB0aGUgY29kZSBmcm9tIHNldGxpbigpIHRoYXQgd2FzIGNvcGllZCB0byBjeF8qKCkuICBUaGlzIHNsaW1zCisgICBzZXRsaW4oKSBkb3duIHRvIDExMjAgbGluZXMuICBUZXN0ZWQgcmVndWxhciBUZWxuZXQsIEtlcmJlcml6ZWQgVGVsbmV0LCBhbmQKKyAgIHNlcmlhbCBjb25uZWN0aW9ucyBhZ2FpbiwgYWxsIE9LLiAgVGhlIFVuaXggdmVyc2lvbiBvZiB0aGUgU1NIIGNvbW1hbmQgaXMKKyAgIE9LIHRvby4KKworc2V0bGluKCkgZGVjb25zdHJ1Y3Rpb24sIFBhcnQgVHdvOgorCitOb3cgdGhhdCB3ZSBoYXZlIHRoZSBjb21tb24gbmV0d29yayBhbmQgc2VyaWFsIGNvbm5lY3Rpb24gcGllY2VzIG1vdmVkIG91dCBvZgorc2V0bGluKCksIHdlIHN0aWxsIG5lZWQgdG8gbW92ZSBvdXQgdGhlIGxpdHRsZSBjb2RlIHNuaXBwZXRzIGZvciBlYWNoIG5ldHdvcmsKK3R5cGUgdGhhdCB0YWtlIHBsYWNlIGJldHdlZW4gY29tbWFuZCBjb25maXJtYXRpb24gYW5kIHRoZSBjb21tb24gY29kZSB3ZSBqdXN0CityZXBsYWNlZC4gICBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhpcyBuZWVkcyBkb2luZyBvbmx5IGZvciBTU0guICBUaGUgY29kZQorbGFiZWxlZCAiU3Rhc2ggZXZlcnl0aGluZyIgY29waWVkIHRvIGN4X3NzaCgpIGJ1dCBJIGRpZG4ndCByZW1vdmUgdGhlIG9yaWdpbmFsCitjb2RlIHNpbmNlIEkgY2FuJ3QgdGVzdCB0aGlzLiAgSSB0aGluayBJJ20gZG9uZSAtLSBtYXliZSBJJ20gb3Zlcmxvb2tpbmcKK3NvbWV0aGluZyBidXQgSSBkb24ndCBrbm93IHdoYXQuLi4gIEZpcnN0IHdlIG5lZWQgdG8gdGVzdCB0aGUgaGVjayBvdXQgb2YgaXQKK2luIGFsbCBjb21tYW5kLWxpbmUgdmVyc2lvbnMgKEs5NSBhbmQgQy1LZXJtaXQpLiAgVGhlbiB0byB1c2UgdGhpcyBmcm9tCit0aGUgR1VJLCBzZWUgdGhlIGNhbGxpbmcgc2VxdWVuY2VzIGZvciBjeF9zZXJpYWwoKSwgY3hfbmV0KCksIGFuZCBjeF9zc2goKToKKworIC4gRm9yIHNlcmlhbCBvciBUQVBJIGNvbm5lY3Rpb25zLCB0aGUgR1VJIHNob3VsZCBjYWxsIGN4X3NlcmlhbCgpLgorIC4gRm9yIFNTSCBjb25uZWN0aW9ucywgaXQgc2hvdWxkIGNhbGwgY3hfc3NoKCkgYW5kIHRoZW4gY3hfbmV0KCkuCisgLiBGb3IgYWxsIG90aGVyIG5ldHdvcmsgY29ubmVjdGlvbnMsIGp1c3QgY2FsbHMgY3hfbmV0KCkuCisKK2NrdXVzNy5jLCBDaW5jbyBkZSBNYXlvIGRlIDIwMDIuCisKK05ldyBja3V1czcuYyBmcm9tIEplZmYsIDggTWF5IDIwMDIuICBNZXJnZSBjeF9zc2goKSBpbnRvIGN4X25ldCgpLiAgQWxzbzogSQoraGFkIG1hZGUgbGluZVtdIGFuIGF1dG9tYXRpYyB2YXJpYWJsZSwgc2luY2UgdGhlIGdsb2JhbCBsaW5lW10gYnVmZmVyIGlzIHVzZWQKK2J5IGFsbW9zdCBldmVyeSBwYXJzaW5nIHJvdXRpbmUgaW4gQy1LZXJtaXQgdG8gaG9sZCBzdHJpbmcgZmllbGRzIGJldHdlZW4KK3BhcnNpbmcgYW5kIGV4ZWN1dGlvbiBidXQgSmVmZiBzYXlzIGhlIGZvdW5kIHRoYXQgc29tZSBjb2RlIHNvbWV3aGVyZSBkZXBlbmRlZAorb24gbGluZVtdIGNvbnRhaW5pbmcgdGhlIGhvc3RuYW1lIGFmdGVyIHNldGxpbigpIHdhcyBmaW5pc2hlZC4KKworRnJvbSBKZWZmLCAxMCBNYXkgMjAwMjoKKyAuIEZpeCBTRVQgU1NIIFNUUklDVC1IT1NULUNIRUNLSU5HIHBhcnNlOiBja3V1czMuYy4KKyAuIEFkZCBwcm90b3R5cGVzIGZvciBjeF9uZXQoKSBhbmQgY3hfc2VyaWFsKCk6IGNrdXVzci5oLgorIC4gQWRkIEFOU0kgdmVyc2lvbnMgb2YgY3hfbmV0KCkgYW5kIGN4X3NlcmlhbCgpIGRlY2xhcmF0aW9ucyBhbmQgc3VwcGx5IGEKKyAgIG1pc3NpbmcgcGFyYW1ldGVyIGluIHRoZSBjeF9zZXJpYWwoKSBpbnZvY2F0aW9uLCBjaGFuZ2UgU1NIQ01EIGN4X25ldCgpCisgICBpbnZvY2F0aW9uIHRvIG5ldyBmb3JtLgorCitGcm9tIEplZmYsIDE2IE1heSAyMDAyOgorIC4gQU5TSSBzdHJpY3RuZXNzIGNoYW5nZXM6IGNrX3NzbC5bY2hdCisgLiBOZXcgRElBTEVSIGNvbW1hbmQ6IGNrdXVzci5bY2hdCisgLiBDb3JyZWN0aW9uIHRvIGhvdyAtMCB0dXJucyBvZmYgYXV0b2Rvd25sb2FkOiBja3V1c3kuYworIC4gUHJvdG90eXBlcyBmb3IgR1VJIG1lbnUgYWN0aW9uIGZ1bmN0aW9uczogY2t1dXNyLmguCisgLiBSZXBsYWNlIHNldHRpbmcgb2YgR1VJLWFjdGlvbiB2YXJpYWJsZXMgYnkgZnVuY3Rpb24gY2FsbHM6IGNrdXVzWzM0NTd4XS5jCisgLiBGaXggRlRQIC16IHN3aXRjaCBwYXJzaW5nOiBja2NmdHAuYy4KKyAuIEZpeCBTRVQgSE9TVCB0ZXN0aW5nIG9mIHNldGxpbigpIHJldHVybiBjb2RlOiBja3V1czMuYworCitGcm9tIEplZmYsIDE4IE1heSAyMDAyOgorIC4gQWxsb3cgaGFsZi1zaXplIEdVSSBmb250czogY2t1dXNbMzV5XS5jLgorCitGaXhlZCBzZXRndWlmb250KCkgdG8gcGFyc2UgZnJhY3Rpb25hbCBmb250IHNpemVzIGFuZCByb3VuZCB0byBuZWFyZXN0IGhhbGYKK3BvaW50LiAgY2t1dXMzLmMsIDE4IE1heSAyMDAyLgorCitGb3IgR1VJLCB3cm90ZSBmcm9udCBlbmRzIGZvciBnZXR5ZXNubygpLCByZWFkdGV4dCgpLCBhbmQgcmVhZHBhc3MoKToKKworIC4gdXFfb2soKSBwcmludHMgdGV4dCBhbmQgZ2V0cyBZZXMvTm8sIE9LL0NhbmNlbCwgb3IganVzdCBPSyByZXNwb25zZS4KKyAgIFRoaXMgcmVwbGFjZXMgZ2V0eWVzbm8oKSBhbmQgY2FuIGFsc28gYmUgdXNlZCBmb3IgYWxlcnQgb3IgaGVscCBib3hlcy4KKworIC4gdXFfdHh0KCkgcHJpbnRzIHRleHQgYW5kIGdldHMgYSBzaW5nbGUgdGV4dCByZXNwb25zZS4gIFJlcGxhY2VzCisgICByZWFkdGV4dCgpIGFuZCByZWFkcGFzcygpLgorCisgLiB1cV9tdHh0KCkgaXMgbGlrZSB1cV90eHQoKSBidXQgYWxsb3dzIG11bHRpcGxlIHRleHQgZmllbGRzLiAgUmVwbGFjZXMKKyAgIGFueSBjb21iaW5hdGlvbiBvZiByZWFkdGV4dCgpIGFuZCByZWFkcGFzcygpLgorCitPYnZpb3VzbHkgdGhlICNpZmRlZiBLVUkgcG9ydGlvbnMgb2YgdGhlIHVxX2JsYWgoKSByb3V0aW5lcyBuZWVkIGZpbGxpbmcgaW4uCitja3V1c3IuaCwgY2t1dXMzLmMsIDE4IE1heSAyMDAyLgorCitDb252ZXJ0ZWQgc2VsZWN0ZWQgZ2V0eWVzbm8oKSBjYWxscyB0byB1cV9vaygpOiBja2NmdHAuYywgY2t1dXMzLmMsIGNrdXVzNi5jLgorU29tZSB3ZXJlIG5vdCBjb252ZXJ0ZWQgYmVjYXVzZSBpdCB3YXMgaW5hcHByb3ByaWF0ZSwgZS5nLiBERUxFVEUgL0FTSzsgb3RoZXJzCitiZWNhdXNlIHRoZXkncmUgaW4gSmVmZidzIGNvZGUuICBUaGUgbW9zdCBpbnRlcmVzdGluZyBjb252ZXJzaW9ucyBhcmUgaW4gdGhlCitESUFMIGNvbW1hbmQgd2hlbiBESUFMIENPTkZJUk1BVElPTiBpcyBPTi4gIEhlcmUgdGhlcmUgaXMgYSBkaWFsb2cgZm9yIGVhY2gKK3Bob25lIG51bWJlciBhc2tpbmcgaWYgaXQncyBPSyAodWdfb2soKSkgYW5kIGlmIG5vdCwgYXNraW5nIGZvciBhIHJlcGxhY2VtZW50CisodXFfdHh0KCkpOyBzZWVtcyB0byB3b3JrIGZpbmUgaW4gQy1LZXJtaXQuICBBbGwgdGhlIGNhbmRpZGF0ZXMgZm9yIHVxX210eHQoKQorYXJlIGluIEplZmYncyBjb2RlLiAgMTggTWF5IDIwMDIuCisKK0Zyb20gSmVmZjogQ29udmVydCByZW1haW5pbmcgZ2V0eWVzbm8vcmVhZHRleHQvcmVhZHBhc3MgY2FsbHMgdG8gdXFfYmxhaCgpCitzbyB0aGV5IGNhbiBiZSBHVUkgZGlhbG9ncy4gIGNrdXVzWzM3XS5jLCBja2NmdHAuYywgY2t1YXRoLmMsIGNrX3NzbC5jLAorMjEgTWF5IDIwMDIuCisKK0FkZGVkIEtDRCBjb21tYW5kID0gQ0QgdG8gc3ltYm9saWMgZGlyZWN0b3J5IG5hbWUgKEVYRURJUiwgQ09NTU9OLCBBUFBEQVRBLAorVE1QRElSLCBldGMgZXRjKS4gIGNrdXVzci5oLCBja3V1c1tyMjVdLmMsIDIxIE1heSAyMDAyLgorCitGcm9tIEplZmYsIDI4IE1heSAyMDAyOgorIC4gLS10aXRsZTogY29tbWFuZGxpbmUgb3B0aW9uOiBja3V1c3IuaCwgY2t1dXN5LmMKKyAuIEZpeCBzb21lICNpbmNsdWRlcywgbW92ZSBzb21lIGRlY2xhcmF0aW9uczogY2tjZm5zLmMKKyAuIENoYW5nZSBLOTUgdmVyc2lvbiBmcm9tIERldi4wMCB0byBCZXRhLjAxCisgLiBBU0tbUV0gL0dVSTogY2t1dXM2LmMuCisgLiBWYXJpb3VzIEdVSSBzY3JlZW4gdXBkYXRlcyBhbmQgI2lmZGVmczogY2t1dXM3LmMKKyAuIEFkZCBtaXNzaW5nIGN4X25ldCgpIGNhbGxzIHRvIG5ldyBzZXRsaW4oKSBmb3IgZmlsZSBTdXBlckxBVC4uOiBja3V1czcuYworIC4gVXBkYXRlZCB1cV8qKCkgcm91dGluZXMgZm9yIEdVSSBkaWFsb2dzOiBja3V1czMuYy4KKworQWRkZWQgR0VUT0sgc3dpdGNoZXMgKC9USU1FT1VUIGZvciBhbGw7IC9QT1BVUCBhbmQgL0dVSSBmb3IgSzk1Ryk6Citja3V1czYuYywgMjkgTWF5IDIwMDIuCisKK0FkZGVkIEhFTFAgU0VUIEdVSSB0ZXh0LiAgY2t1dXMyLmMsIDI5IE1heSAyMDAyLgorCitGcm9tIEplZmY6CisgLiBBbm90aGVyIEs5NS1zcGVjaWZpYyAjaW5jbHVkZSBmb3IgY2tjZm5zLmMuCisgLiBNb3JlIGl0ZW1zIGZvciBLOTVHIEFjdGlvbnMgbWVudS4KKyAuIENoYW5nZSBLOTVHIExvY3VzIHN3aXRjaGluZyB0byBjYWxsIHNldGxvY3VzKCkgcmF0aGVyIHRoYW4gc2V0IHZhcmlhYmxlLgorIC4gRGl0dG8gZm9yIHNldmVyYWwgb3RoZXIgdmFyaWFibGVzIG5vdyBzZXR0YWJsZSBmcm9tIEFjdGlvbnMgbWVudS4KKyAuIEZpeCBTRVQgSE9TVCAvTkVUOlNTSCBzdGF0dXMgY29kZSBzbyBJRiBTVUNDRVNTIHdvcmtzLgorIC4gRml4IFNIT1cgU1NIIHBvcnQtZm9yd2FyZGluZy4KK2NrY2Zucy5jLCBja3V1c1tyMzY3XS5jLCBja2NmdHAuYywgY2tjbWFpLmMsIDMwIE1heSAyMDAyLgorCitDaGFuZ2VkIFNFVCBMT0NVUyB0byBoYXZlIGEgbmV3IHZhbHVlLCBBU0ssIGNvcnJlc3BvbmRpbmcgdG8gbmV3IGF1dG9sb2N1cwordmFsdWUgb2YgMiwgSzk1RyBvbmx5LiAgQ2hhbmdlZCBzZXRsb2N1cygpIHRvIG5vdCBkbyBhbnl0aGluZyBpZiB0aGUgbmV3IGFuZAorb2xkIGxvY2kgYXJlIHRoZSBzYW1lLCBvdGhlcndpc2UgdG8gaW52b2tlIGEgR1VJIGRpYWxvZyBpbiBLOTVHIGlmIGF1dG9sb2N1cworaXMgMiwgYW5kIGFsc28gdG8gaGFuZGxlIGFueSB0ZXh0IG1lc3NhZ2VzLiAgQ2hhbmdlZCBTSE9XIENPTU1BTkQgdG8gc2hvdyBBU0sKK3ZhbHVlIGZvciBTRVQgTE9DVVMuICBSZXdyb3RlIEhFTFAgU0VUIExPQ1VTLiAgY2t1dXNyLltjaF0sIGNrdXVzWzIzXS5jLAorY2tjZnRwLmMsIDMwIE1heSAyMDAyLgorCitBZGQgYSBtaXNzaW5nIHNwYWNlIHRvIExvY3VzIHBvcHVwLCBhbmQgZml4IEplZmYncyB2ZXJzaW9uIG9mIHRoZSBjb2RlIHRvCitjb21waWxlIGluIEMtS2VybWl0LiAgY2t1dXNyLmMsIDMxIE1heSAyMDAyLgorCitGcm9tIEplZmYsIGZvciBLOTUgR1VJLCA2IEp1bmUgMjAwMjoKKyAuIEZvcmNlIHNvbWUgR1VJIHBvcHVwcyB0byBiZSBpbiBmb3JlZ3JvdW5kOiBja3V1czMuYy4KKyAuIEZpeCBTSE9XIFRFUk0gZm9udCBkaXNwbGF5OiBja3V1czUuYy4KKyAuIFVwZGF0ZSBLOTUgdmVyc2lvbiBudW1iZXJzIGFuZCBkYXRlICg0IEp1bmUgMjAwMik6IGNrY21haS5jLgorIC4gQWRkIG5vdGUgYWJvdXQgZW5jcnlwdGVkIHByaXZhdGUga2V5cyB2cyBzY3JpcHRzIHRvIEhFTFAgU0VUIEFVVEg6IGNrdXVzMi5jLgorIC4gRml4IFNFVCBIT1NUIGZvciBERUNuZXQ6IGNrdXVzNy5jLgorCistLS0gSzk1IDIuMCAtLS0KKworRnJvbSBKZWZmLCA3IEp1bmUgMjAwMjoKKyAuIEZpeCBzb21lICNpZmRlZnMgZm9yIFVuaXggYnVpbGRzIChsb2N1cywgZGlhbCwgZXRjKTogY2t1dXM3LmMKKyAuIEFkZCBndWlfcmVzaXplX3NjYWxlX2ZvbnQoKSBwcm90b3R5cGU6IGNrdXVzMy5jCisgLiBBZGQgc29tZSBtaXNzaW5nIFNFVCBHVUkgY29tbWFuZHM6IGNrdXVzMy5jCisgLiBVcGRhdGUgdmVyc2lvbiBudW1iZXJzOiBja2NtYWkuYworCistLS0gSzk1IDIuMC4xIC0tLQorCitGcm9tIEplZmYsIDExIEp1bmUgMjAwMjoKKyAuIENvbmRpdGlvbmFsaXplIExvY3VzLXN3aXRjaGluZyBwb3B1cCB0ZXh0IGZvciBHVUkvQ29uc29sZTogY2t1dXNyLmMuCisgLiBGaXggdGhlIFNSUF9pbnN0YWxsZWRfYXNfc2VydmVyKCkgZnVuY3Rpb24uICBUaGUgbmV3IEFQSSByZXR1cm5zIFRSVUUgZXZlbgorICAgaWYgdGhlIFNSUCBjb25maWcgYW5kIHBhc3N3b3JkIGZpbGVzIGNhbm5vdCBiZSBmb3VuZC4gIFdlbnQgYmFjayB0byB0aGUgb2xkCisgICBBUEkuICBUaGlzIGJ1ZyBhZmZlY3RzIEMtS2VybWl0IDggd2hlbiBidWlsdCB3aXRoIFNSUCBhcyB3ZWxsIGFzIDEuMS4yMQorICAgdGhyb3VnaCAyLjAuMS4gIFNpbmNlIGlrc2RudC5leGUgaGFzIG5vdCBiZWVuIHNoaXBwZWQgeWV0IEkgZml4ZWQgaXQgYW5kCisgICB1cGxvYWRlZCBhIG5ldyBub24tYmV0YSBidWlsZCBvZiBpdC4gIGNrdWF0aC5jLgorCitGcm9tIEplZmYsIDEyIEp1bmUgMjAwMjoKKyAuIEZpeCBTU0ggQUdFTlQgQUREOiBja3V1c3IuYy4KKyAuIEZpeCAtLWZhY2VuYW1lOiBvcHRpb24gdG8gbm90IGZhaWwgaWYgbmFtZSB1bmtub3duOiBja3V1c3kuYy4KKyAuIEZpeGVzIGZvciBPcGVuU1NMIDAuOS43IGFuZCBPcGVuQlNEIDMuMTogY2tfc3NsLmMuCisgLiBGaXggU0VUIEFVVEggVExTIFZFUklGWSBOTyB0byBwcmV2ZW50IGEgZGlhbG9nIGJ1dCBzdGlsbCBhIHdhcm5pbmcgaWYKKyAgIFNFVCBBVVRIIFRMUyBWRVJCT1NFIE9OIGlzIHNldDogY2tfc3NsLmMuCisgLiBGaXggRlRQIGNvZGUgdG8gdmVyaWZ5IHRoZSBob3N0bmFtZSBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgYW5kIG5vdAorICAgdGhlIGhvc3RuYW1lIGRpc2NvdmVyZWQgYnkgdGhlIHJldmVyc2UgRE5TIGxvb2t1cC4gIEZvciBleGFtcGxlLAorICAgICBGVFAgT1BFTiBrZXJtaXQuY29sdW1iaWEuZWR1CisgICBzaG91bGQgcHJvZHVjZSBhIGRpYWxvZyBiZWNhdXNlIHRoYXQgbmFtZSBpcyBub3QgaW4gdGhlIGNlcnRpZmljYXRlCisgICBldmVuIHRob3VnaCBmdHAua2VybWl0LmNvbHVtYmlhLmVkdSAodGhlIHJldmVyc2UgRE5TIG5hbWUpIGlzOiAgY2tjZnRwLmMuCisKK0FkZCBzdXBwb3J0IGZvciBTb2xhcmlzIDkgYW5kIE5ldEJTRCAxLjYuICBtYWtlZmlsZSwgY2t1dmVyLmgsIGNrY2RlYi5oLAorMTMgSnVuIDIwMDIuCisKK0Rpc2NvdmVyZWQgdGhhdCBTb2xhcmlzIDkgd2FudHMgdG8gaGlkZSB0aGUgbWVtYmVycyBvZiBzdHJ1Y3QgRklMRSwgYW5kCitlbmZvcmNlcyB0aGlzIGZvciA2NC1iaXQgYnVpbGRzLiAgVGhleSBvZmZlciBzb21lIGZ1bmN0aW9ucyBsaWtlIF9fZmJ1ZnNpemUoKQordG8gZ2V0IHRoZSBpbmZvLCBidXQgbm90IHRoZSBpbmZvIHdlIG5lZWQgZm9yIHJlYWRpbmcgZXNjYXBlIHNlcXVlbmNlcyAodGhlCitfY250IG1lbWJlcikuICBMZXQncyBoZWFyIGl0IGZvciBwb2xpdGljYWwgY29ycmVjdG5lc3MuICBDcmVhdGVkIG5ldyBzb2xhcmlzOWcKKygzMi1iaXQpIGFuZCBzb2xhcmlzOWc2NCAoNjQtYml0KSB0YXJnZXRzLiAgU29ycnksIG5vIGFycm93IGtleXMgaW4gNjQtYml0Cittb2RlLiAgQWxzbyBubyBtb3JlIGRpcmVjdCBhY2Nlc3MgdG8gc3lzX2Vycmxpc3RbXTsgbXVzdCB1c2Ugc3RyZXJyb3IoKS4KK21ha2VmaWxlLCBja3VjbWQuYywgMTMgSnVuIDIwMDIuCisKK0FkZGVkIHNvbGFyaXM5ZytvcGVuc3NsK3psaWIrcGFtK3NoYWRvdywgd2hpY2ggaW4gdHVybiByZXF1aXJlZCBhZGRpbmcKK3NvbGFyaXMyeGczMitvcGVuc3NsK3psaWIrcGFtK3NoYWRvdywgbmVlZGVkIGZvciBnY2MgMy4xIGluIHdoaWNoIHlvdSBoYXZlCit0byBzcGVjaWZ5IDMyLWJpdC4gIEZhaWxzIGZvciBzb21lIG15c3RlcmlvdXMgcmVhc29uIGluIGxpbmsgc3RlcAorKGNhbid0IGZpbmQgbGlic3NsLnNvLjAuOS42IGV2ZW4gdGhvdWdoIGl0J3MgdGhlcmUpLiAgbWFrZWZpbGUsIDEzIEp1biAyMDAyLgorCitTb2xhcmlzIDggZW1wdHkgc29ja2V0IHByb2JsZW1zIGFnYWluIC0tIHR0aGFuZygpIHRpbWVzIG91dCwgc3Vic2VxdWVudAordGNzZXRhdHRyKCkgY2FsbHMgZG8gaG9ycmlibGUgdGhpbmdzLiAgQWRkZWQgYSBiYW5kYWlkIHRvIHR0Y2xvcygpOiBkb24ndAorY2FsbCB0Y3NldGF0dHIoKSBhbnkgbW9yZSBpZiBoYW5ndXAgdGltZWQgb3V0LiAgY2t1dGlvLmMsIDE0IEp1bmUgMjAwMi4KKworR2VycnkgQiByZXBvcnRlZCB0aGUgYmFuZGFpZCBnb3QgdXMgYml0IGZhcnRoZXIgYnV0IEtlcm1pdCBzdGlsbCBkaXNhcHBlYXJzLgorQWRkZWQgY29kZSB0byByZWFzc2VydCB0aGUgYWxhcm0gc2lnbmFsIGhhbmRsZXIsIHNpbmNlIGl0IGlzIGxpa2VseSB0aGF0CitTb2xhcmlzIGhhcyBiZWNvbWUgc3RyaWN0ZXIgYWJvdXQgdGhpcyBzaW5jZSBsYXN0IHRpbWUgSSBsb29rZWQuICAoTGF0ZXIKK0dlcnJ5IHJlcG9ydGVkIGJhY2sgdGhhdCB0aGlzIGRpZCB0aGUgdHJpY2sgLS0gQy1LZXJtaXQgbm93IGV4aXRzIG5vcm1hbGx5CithbmQgcmVsZWFzZXMgdGhlIGxvY2tmaWxlKS4gIHR0Y2xvcygpOiBja3V0aW8uYywgMTcgSnVuIDIwMDIuCisKK0lmIHlvdSB1c2UgS2VybWl0IHRvIGNvcHkgYSBmaWxlIHRvIGEgZGVzdGluYXRpb24gZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzIGFuZAoraXMgbG9uZ2VyIHRoYW4gdGhlIHNvdXJjZSBmaWxlLCB0aGUgZGVzdGluYXRpb24gZmlsZSBpcyBub3QgdHJ1bmNhdGVkLiAgSSBoYWQKK21pc3Rha2VubHkgYXNzdW1lZCB0aGF0IHNldHRpbmcgT19DUkVBVCBpbiB0aGUgb3BlbigpIGNhbGwgaW4gemNvcHkoKSB3b3VsZAorY3JlYXRlIGEgbmV3IGNvcHkgb2YgdGhlIGZpbGUuICBGaXhlZCBieSBhbHNvIHNldHRpbmcgT19UUlVOQy4gIGNrdWZpby5jLAorMTcgSnVuIDIwMDIuCisKK1VwZGF0ZWQgSEVMUCBJTlBVVCBhbmQgTUlOUFVUIHRleHQgdG8gZXhwbGFpbiAwIGFuZCAtMSB0aW1lb3V0IHZhbHVlcywgYW5kCitIRUxQIERJQUwgdG8gZXhwbGFpbiBhYm91dCBlbnRlcmluZyBDT05ORUNUIG1vZGUgYXV0b21hdGljYWxseS4gIGNrdXVzMi5jLAorMTcgSnVuIDIwMDIuCisKK0dvdCByaWQgb2YgY2xpZW50LXNpZGUgIlByZXNzIHRoZSBYIG9yIEUga2V5IHRvIGNhbmNlbCIgbWVzc2FnZSB3aGVuIGdpdmluZworYSBSRU1PVEUgY29tbWFuZCBpZiBRVUlFVCBpcyBzZXQgb3IgaWYgWEZFUiBESVNQTEFZIGlzIE5PTkUuICBja3V1czcuYywKKzE3IEp1biAyMDAyLgorCitGcm9tIEplZmYgMjUgSnVuIDIwMDI6CisgLiBBZGQgU1VOIHRlcm1pbmFsIHR5cGU6IGNrdXVzci5oLCBja3V1c1s1N10uYy4KKyAuIEFkZCBHVUkgZmlsZSB0cmFuc2ZlciBkaXNwbGF5OiBja2NrZXIuaCwgY2t1dXNbNDd4XS5jLgorIC4gQ2hhbmdlcyB0byBhbGxvdyBDLUtlcm1pdCB0byBidWlsZCB3aXRoIE9wZW5TU0wgMC45LjcuICBDdXJyZW50CisgICBDLUtlcm1pdCBjb2RlIGlzIGRlc2lnbmVkIHRvIGNvbXBpbGUgd2l0aCAwLjkuNiBhbmQgZWFybGllci4gIFRvCisgICBjb21waWxlIHdpdGggMC45LjcgeW91IG11c3Qgc3BlY2lmeSAtRE9QRU5TU0xfMDk3LiAgVGhpcyBhdm9pZHMKKyAgIG1pc3Npbmcgc3ltYm9scyBpbiB0aGUgREVTIGxpYnJhcnkuICBUaGUgZnVuY3Rpb25zIGluIE9wZW5TU0wgd2VyZQorICAgcmVuYW1lZCBpbiAwLjkuNyB0byBhdm9pZCBsaW5rIHRpbWUgY29uZmxpY3RzIHdpdGggS2VyYmVyb3MgNC4KKyAgIGNrdWZpby5jIGNrX2NycC5jIGNrdWF0aC5jIGNrX3NzbC5oIGNrX3NzbC5jLCBtYWtlZmlsZS4KKworRnJvbSBKZWZmIDI2IEp1biAyMDAyOgorIC4gYXBwYXJlbnRseSB0aGUgU1NMIFBhc3NwaHJhc2UgQ2FsbGJhY2sgZnVuY3Rpb24gd2FzIG5vdCBjb252ZXJ0ZWQKKyAgIGZyb20gcmVhZHBhc3MoKSB0byB1cV90eHQoKQorIC4gRlRQIEF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgZXJyb3JzIHdlcmUgbm90IGJlaW5nIHJlcG9ydGVkIHRvIHRoZQorICAgdXNlci4gIFNvIGEgZmFpbHVyZSB3b3VsZCBhcHBlYXIgdG8gYmUgYSBzdWNjZXNzZnVsIGNvbXBsZXRpb24KKyAgIHVubGVzcyBGVFAgREVCVUcgd2FzIE9OLiAgTm93IHRoZSBtZXNzYWdlIGlzIHJlcG9ydGVkIHVubGVzcworICAgdGhlIFFVSUVUIGZsYWcgaXMgc2V0LgorY2tfc3NsLmMsIGNrY2Z0cC5jLgorCitTRVQgVFJBTlNGRVIgTU9ERSBNQU5VQUwgZGlkbid0IHdvcmsgZm9yIEZUUDsgZml4ZWQgaW4gcHV0ZmlsZSgpIGFuZCBnZXRmaWxlKCk6Citja2NmdHAuYywgMSBKdWwgMjAwMi4KKworQ2hhbmdlZCBkZWJ1ZyBsb2cgZm9yIEZUUCB0byBsb2cgIkZUUCBTRU5UIiBhbmQgIkZUUCBSRUNEIiBmb3IgcHJvdG9jb2wKK21lc3NhZ2VzLCBqdXN0IGxpa2Ugd2UgZG8gZm9yIFRlbG5ldCwgdG8gbWFrZSBpdCBlYXN5IHRvIGdyZXAgdGhlbSBvdXQgb2YKK3RoZSBsb2cuICBja2NmdHAuYywgMSBKdWwgMjAwMi4KKworSW4gRlRQIE1HRVQgL1VQREFURSwgZXF1YWwgdGltZXMgc3B1cmlvdXNseSBjYXVzZWQgZG93bmxvYWQuICBkb2Z0cGdldCgpIHdhcworbWlzaW50ZXJwcmV0aW5nIGNoa21vZHRpbWUoKSdzIHJldHVybiBjb2RlLiAgY2tjZnRwLmMsIDMgSnVsIDIwMDIuCisKK0luIEZUUCBNR0VUIC9SRUNPVkVSLCByZWNvdmVyeSBpcyBza2lwcGVkIGlmIHRoZSBsb2NhbCBmaWxlIGlzIG5ld2VyIHRoYW4KK3RoZSByZW1vdGUuICBUaGlzIHdvdWxkIHNlZW0gdG8gbWFrZSBzZW5zZSwgYnV0IHdoZW4gYSBkb3dubG9hZCBpcworaW50ZXJydXB0ZWQsIHRoZSBwYXJ0aWFsIGZpbGUgbmV2ZXIgZ2V0cyB0aGUgZGF0ZSBvZiB0aGUgcmVtb3RlIGZpbGUsIHNvCit0aGUgcGFydGlhbCBmaWxlIGlzIGFsd2F5cyBuZXdlciwgYW5kIHJlY292ZXJ5IG5ldmVyIHdvcmtzLiAgRml4ZWQgaW4KK3JlY3ZyZXF1ZXN0KCkgYnkgY29tbWVudGluZyBvdXQgdGhlIGRhdGUgY2hlY2suICBja2NmdHAuYywgMyBKdWwgMjAwMi4KKworQSBiZXR0ZXIgd2F5IHRvIGZpeCB0aGUgcHJldmlvdXMgcHJvYmxlbSBpcyB0byBhbHdheXMgc2V0IHRoZSBmaWxlIGRhdGUgZnJvbQordGhlIHNlcnZlciBhbmQgdGhlbiBvbmx5IGFsbG93IC9SRUNPVkVSIHRvIHdvcmsgd2hlbiB0aGUgZGF0ZXMgYXJlIGVxdWFsLgorQnV0IHRoYXQncyBub3QgcG9zc2libGUgYmVjYXVzZSBNRFRNIGlzIG5vdCBpbXBsZW1lbnRlZCB1bml2ZXJzYWxseSwgYW5kIGl0Citjb25mbGljdHMgd2l0aCBob3cgS2VybWl0IGN1cnJlbnRseSB3b3JrcywgbmFtZWx5IHRoYXQgRlRQIERBVEVTIGFyZSBPRkYgYnkKK2RlZmF1bHQuICBBbHNvLCBjaGVja2luZyBkYXRlcyBwcmV2ZW50cyBbTV1HRVQgL1JFQ09WRVIgZnJvbSB3b3JraW5nIHdpdGgKK2ZpbGVzIHRoYXQgd2VyZSBpbmNvbXBsZXRlbHkgZG93bmxvYWRlZCBieSBzb21lIG90aGVyIEZUUCBjbGllbnQuCisKK0luIEZUUCBNR0VUIC9SRUNPVkVSIDx3aWxkY2FyZD4gPHdpbGRjYXJkPiAuLi4sIHRoZSBmaXJzdCBmaWxlIGluIGVhY2ggZ3JvdXAKK2lzIGFsd2F5cyBkb3dubG9hZGVkLiAgRGlhZ25vc2lzOiBLZXJtaXQgc2VuZHMgIlRZUEUgQSIgcHJpb3IgdG8gTkxTVCAoYXMgaXQKK211c3QpLiAgVGhlbiB3aGVuIGl0IHNlbmRzIGl0cyBmaXJzdCBTSVpFIGNvbW1hbmQsIGl0J3Mgc3RpbGwgaW4gQVNDSUkgbW9kZSwKK3NvIHRoZSBzZXJ2ZXIgc2VuZHMgdGhlICJBU0NJSSBzaXplIiByYXRoZXIgdGhhbiB0aGUgYmluYXJ5IHNpemUsIHdoaWNoIGRvZXMKK25vdCBhZ3JlZSB3aXRoIHRoZSBzaXplIG9mIHRoZSBsb2NhbCBmaWxlICh3aGljaCB3YXMgZG93bmxvYWRlZCBpbiBiaW5hcnkKK21vZGUpLCBzbyByZWNvdmVyeSBpcyBhbHdheXMgYXR0ZW1wdGVkIGV2ZW4gd2hlbiB0aGUgZmlsZXMgYXJlIGlkZW50aWNhbC4gIFRoZQorVFlQRSBBIGNvbW1hbmQgaXMgc2VudCBieSBpbml0Y29ubigpLiAgQWZ0ZXIgdGhlIHJlbW90ZV9maWxlcygpIGNhbGwsIHdlIGhhdmUKK3RvIGNoYW5nZSB0aGUgdHlwZSBiYWNrIHRvIHRoZSBwcmV2YWlsaW5nIHR5cGUgYmVmb3JlIHNlbmRpbmcgdGhlIGZpcnN0IFNJWkUKK2NvbW1hbmQuICBGaXhlZCBpbiBjbWRsaW5nZXQoKSBhbmQgZG9mdHBnZXQoKTogY2tjZnRwLmMsIDMgSnVsIDIwMDIuCisKK0luIEZUUCBNR0VUIC9FWENFUFQ6PHBhdHRlcm4+IHVzZWQgd2l0aCBTRVQgWEZFUiBESVNQTEFZIGJyaWVmLCBmaWxlcyB0aGF0CithcmUgc2tpcHBlZCBqdXN0IHNheSBFUlJPUiBpbnN0ZWFkIG9mIHNheWluZyB3aHkgdGhleSB3ZXJlIHNraXBwZWQuICBGaXhlZAoraW4gZG9mdHBnZXQoKTogY2tjZnRwLmMsIDMgSnVsIDIwMDIuCisKK0FkZGVkIEVYSVQgdG8gdG9wLWxldmVsIEhFTFAgdGV4dC4gIGNrdXVzMi5jLCAxMyBKdWwgMjAwMi4KKworU3RyaXAgYnJhY2VzIGluIFJFSU5QVVQgbiB7c3RyaW5nfS4gIGNrdXVzci5jLCAxMyBKdWwgMjAwMi4KKworQWRkZWQgL1FVSUVUIHN3aXRjaCB0byBBU0stY2xhc3MgY29tbWFuZHMuICBUaGlzIG1lYW5zIG5vdCB0byBwcmludCBhbnkgZXJyb3IKK21lc3NhZ2VzIHdoZW4gYW4gQVNLLWNsYXNzIGNvbW1hbmQgdGltZXMgb3V0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UuICBNYWRlCitzdXJlIHRoYXQgd2hlbiBhIHRpbWVvdXQgb2NjdXJzLCB0aGUgY29tbWFuZCBmYWlscy4gIEFsc28gbWFkZSBzdXJlIHRoZQorYy1LZXJtaXQgcHJvbXB0IGRvZXNuJ3Qgd3JpdGUgb3ZlciB0aGUgQVNLIHByb21wdCBpZiBBU0sgdGltZXMgb3V0LiAgQWxzbworZml4ZWQgQVNLLCB3aGVuIGl0IHRpbWVzIG91dCwgbm90IHRvIHJldHVybiAtOSwgd2hpY2ggaXQgZGlkIGluIG9uZSBjYXNlLAord2hpY2ggY2F1c2VzIGEgY29tbWFuZC1zdGFjayBkdW1wLiAgY2t1dXNbMjY3XS5jLCBja3VjbWQuYywgMTMgSnVsIDIwMDIuCisKK0ZpeGVkIFNFVCBGSUxFIElOQ09NUExFVEUgaGVscCB0ZXh0LCB3aGljaCBzYWlkIHRoYXQgYm90aCBLRUVQIGFuZCBBVVRPIHdlcmUKK3RoZSBkZWZhdWx0LiAgY2t1dXMyLmMsIDEzIEp1bCAyMDAyLgorCitJZiB5b3UgU0VUIEZUUCBERUIgT04gYW5kIHRoZW4gdHVybiBpdCBPRkYsIHRoZSBNR0VUIHRlbXAgZmlsZSBpcyBzdGlsbCBrZXB0LgorRml4ZWQgYnkgZ2V0dGluZyByaWQgb2YgZnRwX2tuZiB2YXJpYWJsZSBhbmQgdXNpbmcgZnRwX2RlYiB0byBjb250cm9sIHdoZXRoZXIKK3RlbXAgZmlsZSBpcyBkZWxldGVkIChmdHBfa25mIHdhcyBiZWluZyBzZXQgZnJvbSBmdHBfZGViIGFueXdheSwgYnV0IHRoZW4KK3dhc24ndCBiZWluZyByZXNldCBieSBTRVQgRlRQIERFQiBPRkYpLiAgY2tjZnRwLmMsIDEzIEp1bCAyMDAyLgorCitJZiBhbiBGVFAgdHJhbnNmZXIgd2FzIGluIHByb2dyZXNzIGJ1dCB0aGUgRlRQIGNvbm5lY3Rpb24gZHJvcHMgYW5kIGF1dG9tYXRpYworbG9jdXMgc3dpdGNoaW5nIGlzIGVuYWJsZWQsIHRoZSBsb2N1cyBkb2VzIG5vdCBjaGFuZ2U7IHRodXMgKGZvciBleGFtcGxlKSBhCitzdWJzZXF1ZW50IERFTEVURSBjb21tYW5kIG1ha2VzIEtlcm1pdCBzZW5kIGEgUkVNT1RFIERFTEVURSBwYWNrZXQgb24gc3Rkb3V0LgorRml4ZWQgaW4gbG9zdHBlZXIoKTogY2tjZnRwLmMsIDEzIEp1bCAyMDAyLgorCitGb3IgZG9jczogRlRQIENEIHdpdGggbm8gYXJnIG1pZ2h0IG5vdCBiZSBhY2NlcHRlZCBieSB0aGUgc2VydmVyOyBlLmcuIHRoZQorS2VybWl0IEZUUCBzZXJ2ZXIgc2F5cyAiNTAxIEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIuCisKK1RoZSBGVFAgbW9kdWxlIG5ldmVyIGhhbmRsZWQgU0VUIElOQ09NUExFVEUuICBGaXhlZCBpbiBkb2Z0cHJlY3YyKCkuICBja2NmdHAuYywKKzEzIEp1bCAyMDAyLgorCitXaGVuIEZUUCBEQVRFUyBpcyBPTiwgd2Ugc2V0IGFuIGluY29taW5nIGZpbGUncyBkYXRlIG9ubHkgaWYgdGhlIGZpbGUgd2FzCityZWNlaXZlZCBzdWNjZXNzZnVsbHkuICBDaGFuZ2VkIHRoZSBjb2RlIHRvIHNldCB0aGUgZmlsZSdzIGRhdGUgZXZlbiBpZiBpdCB3YXMKK3JlY2VpdmVkIG9ubHkgcGFydGlhbGx5IChhc3N1bWluZyB3ZSBjYW4gZ2V0IHRoZSBkYXRlIGZyb20gc2VydmVyKS4gIGNrY2Z0cC5jLAorMTMgSnVsIDIwMDIuCisKK1N1cHBvc2Ugd2Ugd2VyZSBkb2luZyBGVFAgTUdFVCAvVVBEQVRFIGZyb20gYSBzZXJ2ZXIgZGlyZWN0b3J5IG9mIDEwMCwwMDAKK2ZpbGVzLiAgS2VybWl0IHdvdWxkIHNlbmQgYSBTSVpFIGNvbW1hbmQgZm9yIGV2ZXJ5IGZpbGUgdW5jb25kaXRpb25hbGx5LiAgT24KK3NvbWUgY29ubmVjdGlvbnMsIGUuZy4gdG8gdGhlIFJlZCBIYXQgUmF3aGlkZSBzZXJ2ZXIsIGVhY2ggb25lIGNvdWxkIHRha2UgdXAKK3RvIDMwIHNlY29uZHMuICBUaGF0IHdvdWxkIGJlIDMgbWlsbGlvbiBzZWNvbmRzID0gMzQgZGF5cy4gIERvbid0IHNlbmQgYSBTSVpFCitjb21tYW5kIGR1cmluZyB0aGUgc2VsZWN0aW9uIHBoYXNlIHVubGVzcyBhIC9TTUFMTEVSIG9yIC9MQVJHRVIgc2VsZWN0b3Igd2FzCitnaXZlbi4gIE9uY2UgdGhlIGZpbGUgaXMgc2VsZWN0ZWQsIHNlbmQgYSBTSVpFIGNvbW1hbmQgb25seSBpZiBvbmUgaGFkbid0IGJlZW4KK3NlbnQgZm9yIHRoYXQgZmlsZSBhbHJlYWR5LiAgY2tjZnRwLmMsIDEzIEp1bCAyMDAyLgorCitNYWRlIFtNXUdFVCBhbmQgW01dUFVUIC9VUERBVEUgc3dpdGNoIGltcGx5IEZUUCBEQVRFUyBPTiwgc2luY2UgdGhleSBkaWRuJ3QKK3dvcmsgdW5sZXNzIGl0IHdhcy4gIGNrY2Z0cC5jLCAxMyBKdWwgMjAwMi4KKworQWRkZWQgRlRQIFtNXUdFVCAvREFURVMtRElGRkVSLCB3aGljaCBpcyBsaWtlIC9VUERBVEUgZXhjZXB0IGl0IHNlbGVjdHMgZmlsZXMKK3RoYXQgYXJlIG5ld2VyIG9yIG9sZGVyLCByYXRoZXIgdGhhbiBvbmx5IG5ld2VyLiAgVGhpcyBhbGxvd3MgdXBkYXRlcyBmcm9tCitzb3VyY2VzIHdoZXJlIGZpbGVzIG1pZ2h0IGJlIHJvbGxlZCBiYWNrIHRvIGVhcmxpZXIgdmVyc2lvbnMuICBJdCdzIGEgYml0CitkYW5nZXJvdXMgaWYgeW91IHVzZSBpdCB3aXRob3V0IGtub3dpbmcgd2hhdCBpdCdzIGZvciwgc2luY2UgaXQgYWxsb3dzIG9sZGVyCitmaWxlcyB0byBvdmVyd3JpdGUgbmV3ZXIgb25lcy4gIChDb2RlIGlzIGFsc28gaW4gcGxhY2UgZm9yIFtNXVBVVAorL0RBVEVTLURJRkZFUiwgYW5kIGl0IHdvcmtzLCBidXQgSSBjb21tZW50ZWQgaXQgb3V0IGJlY2F1c2UgaXQncyBlaXRoZXIKK3VzZWxlc3Mgb3IgZGFuZ2Vyb3VzIHNpbmNlIHdoZW4gdXBsb2FkaW5nLCB5b3UgY2FuJ3Qgc2V0IHRoZSB0aGUgZmlsZSBkYXRlcword2hlbiB0aGV5IGFyZSBhcnJpdmUgb24gdGhlIHNlcnZlci4pICBja2NmdHAuYywgMTMgSnVsIDIwMDIuCisKK0NoYW5nZWQgY2hrbW9kdGltZSgpIHRvIHJlbWVtYmVyIGlmIE1EVE0gZmFpbHMgb24gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24KK2JlY2F1c2UgaXQncyBhbiB1bmtub3duIGNvbW1hbmQgKDUwMCwgNTAyLCBvciAyMDIpLCBhbmQgaWYgc28sIG5vdCB0byBhc2sKK2FnYWluLiAgY2tjZnRwLmMsIDEzIEp1bCAyMDAyLgorCitXaXRoIHRoaXMgbGFzdCBjaGFuZ2UsIEkgdGhpbmsgaXQncyBzYWZlIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBmb3IgRlRQIERBVEVTCitmcm9tIE9GRiB0byBPTi4gIGNrY2Z0cC5jLCAxMyBKdWwgMjAwMi4gCisKK0luY3JlYXNlZCBtYXggbnVtYmVyIG9mIC9FWENFUFQ6IHBhdHRlcm5zIGZyb20gOCB0byA2NCBmb3IgZmlsZSB0cmFuc2ZlciAobm90CituZWNlc3NhcmlseSBmb3Igb3RoZXIgdGhpbmdzKS4gIFRoaXMgaXMgbm93IGEgY29tcGlsZS10aW1lIHN5bWJvbCBOU05ERVhDRVBULgorY2tja2VyLmgsIGNrY21haS5jLCBja2NsaWIuYywgY2tjZm5zLmMsIGNrY2Z0cC5jLCBja3V1c1tyeF0uYy4gIDEzIEp1bCAyMDAyLgorCitGaXhlZCBGVFAgTUdFVCB0byBub3Qgc2VuZCBTSVpFIGNvbW1hbmQgd2hlbiB0aGVyZSBpcyBhIG5hbWUgY29sbGlzaW9uIGFuZAorRklMRSBDT0xMSVNJT04gaXMgRElTQ0FSRCwgZXZlbiBpZiAvU01BTExFUiBvciAvTEFSR0VSIHdlcmUgYWxzbyBzcGVjaWZpZWQuCitja2NmdHAuYywgMTUgSnVsIDIwMDIuCisKK01HRVQgZmFpbHMgaWYgbm8gZmlsZXMgd2VyZSB0cmFuc2ZlcnJlZCwgZXZlbiBpZiB0aGUgcmVhc29uIGlzIHRoYXQgbm8gZmlsZXMKK21ldCB0aGUgc2VsZWN0aW9uIGNyaXRpZXJpYTogL0NPTExJU0lPTjpESVNDQVJELCAvVVBEQVRFLCAvU01BTExFUiwgZXRjLgorQ2hhbmdlZCBNR0VUIHRvIHN1Y2NlZWQgaW4gdGhhdCBjYXNlLiAgZG9tZ2V0KCk6IGNrY2Z0cC5jLCAxNiBKdWwgMjAwMi4KKworQmlnIHByb2JsZW1zIHdpdGggY2FuY2VsaW5nIE1HRVQ7IEN0cmwtQyBjYW5jZWxzIHRoZSBjdXJyZW50IGZpbGUsIGJ1dCB3ZQorZG9uJ3QgYnJlYWsgb3V0IG9mIHRoZSBmaWxlIGxvb3AsIHdlIGp1c3QgZ28gb24gdG8gdGhlIG5leHQgZmlsZS4gIFdvcnNlLCBpZgord2UncmUgZXhlY3V0aW5nIGEgY29tbWFuZCBmaWxlIHRoYXQgaGFzIGEgc2VyaWVzIG9mIE1HRVRzLCBDdHJsLUMgZG9lc24ndAorYnJlYWsgdXMgb3V0IG9mIHRoZSBjb21tYW5kIGZpbGUuICBGaXhlZCBieSBtYWtpbmcgZmFpbGZ0cHJlY3YoKSBhbmQKK2ZhaWxmdHByZWN2MigpICJjaGFpbiIgdG8gdGhlIG1haW4gU0lHSU5UIGhhbmRsZXIsIHRyYXAoKS4gIFRoaXMgaXMgZmluZSBpbgorVW5peCwgYnV0IEknZCBiZSByZWFsbHkgc3VycHJpc2VkIGlmIGl0IHdvcmtzIGluIEs5NSBzbyBJIHB1dCBpdCBpbiAjaWZuZGVmCitPUzIuICBEaXR0byBmb3IgTVBVVDogQWRkZWQgdGhlIHNhbWUgdHJlYXRtZW50IHRvIGZhaWxmdHBzZW5kKCkgYW5kCitmYWlsZnRwc2VuZDIoKS4gIERpdHRvIGZvciBjbWRjYW5jZWwoKS4gIFRvIGFkYXB0IHRvIEs5NSwgc2VhcmNoIGZvciAiVEVTVCBNRQorSU4gSzk1IiAoNSBwbGFjZXMpLiAgY2tjZnRwLmMsIDE2IEp1bCAyMDAyLgorIAorRml4ZWQgcHJldmlvdXMgZml4IHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgZmFpbGZ0cGJsYWgoKSBjYW4gYmUgY2FsbGVkCitub3Qgb25seSB1cG9uIEN0cmwtQywgYnV0IGFsc28gaWYgdHJhbnNmZXIgaW50ZXJydXB0ZWQgd2l0aCBYIG9yIFouCitja2NmdHAuYywgMTYgSnVsIDIwMDIuCisKK1llc3RlcmRheSdzIGZpeGVzIHJldmVhbGVkIGFub3RoZXIgcHJvYmxlbTogSW50ZXJydXB0IE1HRVQgd2l0aCBDdHJsLUMsIHN0YXJ0Cithbm90aGVyIE1HRVQsIGFuZCB0aGUgZmlsZSBsaXN0IGlzIHRvdGFsIGdhcmJhZ2UuICBEaWFnbm9zaXM6IHNlY3VyZV9nZXRjKCkKK2FuZCBzZWN1cmVfZ2V0Ynl0ZSgpIHVzZSBpbnRlcm5hbCBzdGF0aWMgYnVmZmVyIHBvaW50ZXJzLiAgVGhlIG9ubHkgd2F5IHRoZXkKK2V2ZXIgZ2V0IHJlc2V0IGlzIHdoZW4gdGhlIGRhdGEgY29ubmVjdGlvbiBpcyBjbG9zZWQgYnkgdGhlIHNlcnZlciwgc28gaWYgeW91CitpbnRlcnJ1cHQgYSBHRVQsIHRoZSBwb2ludGVycyBhcmUgbm90IHJlc2V0IGFuZCB0aGUgbmV4dCBuZXR3b3JrIHJlYWQgKGUuZy4gb2YKK2FuIE5MU1QgcmVzcG9uc2UpIHJldHVybnMgd2hhdGV2ZXIganVuayB3YXMgbHlpbmcgYXJvdW5kIGluIHRoZSBvbGQgYnVmZmVyLgorY2tjZnRwLmMsIDE3IEp1bCAyMDAyLgorCitGVFAgTUdFVCB0ZW1wIGZpbGUgaXMga2VwdCBvbmx5IGlmIEZUUCBERUJVRyBpcyBPTi4gIENoYW5nZWQgRlRQIG1vZHVsZSB0bworYWxzbyBrZWVwIGl0IGlmIHRoZSByZWd1bGFyIGRlYnVnIGxvZyBpcyBhY3RpdmUuICBja2NmdHAuYywgMTcgSnVsIDIwMDIuCisKK0ZpeGVkIHZlcnNpb24gdGVzdCBpbiBja2VybWl0LmluaTogc2hvdWxkIGJlIDYgZGlnaXRzLCBub3QgNS4gIDE3IEp1bCAyMDAyLgorCitDaGFuZ2VkIEMtS2VybWl0IHZlcnNpb24gbnVtYmVyIHRvIDguMC4yMDUgc28gc2NyaXB0cyBjYW4gdGVzdCBmb3IgdGhlCityZWNlbnQgY2hhbmdlcy4gIGNrY21haS5jLCAxOCBKdWwgMjAwMi4KKworLS0tOC4wLjIwNS0tLQorCitTRVQgRklMRSBDT0xMSVNJT04gVVBEQVRFIHdvdWxkIHVuc2V0IEZUUCBEQVRFUyBkdWUgdG8gYSB0eXBvIGluIHRoZSByZWNlbnQKK2NoYW5nZXMuICBja2NmdHAuYywgMjEgSnVsIDIwMDIuCisKK0ZUUCBbTV1HRVQgL0RBVEVTLURJRkZFUiByZWFsbHkgc2hvdWxkIGhhdmUgYmVlbiBhIGNvbGxpc2lvbiBvcHRpb24uICBBZGRlZAordGhpcyBvcHRpb24gKGltcGxlbWVudGVkIGZvciBGVFAgb25seSkgdG8gYm90aCBTRVQgRlRQIENPTExJU0lPTiBhbmQgdGhlCitGVFAgW01dR0VUIC9DT0xMSVNJT046IHRhYmxlLCBzbyB0aGlzIHdheSBpZiB5b3UgaGF2ZSBsb3RzIG9mIFtNXUdFVHMsIHlvdQorZG9uJ3QgaGF2ZSB0byBwdXQgL0RBVEVTLURJRkZFUiBvbiBlYWNoIG9uZS4gIGNrY2tlci5oLCBja2NmdHAuYywgMjEgSnVsIDIwMDIuCisKKyJGVFAgTUdFVCBhKiBiKiBjKiIgd291bGQgZmFpbCB0byBnZXQgYW55IGMqJ3MgaWYgbm8gYioncyBleGlzdGVkLgorY2tjZnRwLmMsIDIxIEp1bCAyMDAyLgorCitGcm9tIEplZmYsIDIyIEp1bCAyMDAyOgorIC4gQmVnaW5uaW5ncyBvZiBBbm4gQXJib3IgQW1iYXNzYWRvciB0ZXJtaW5hbCBlbXVsYXRpb24gZm9yIEs5NTsKKyAgIGNrdXVzWzU3XS5jLCBja3V1c3IuaC4KKyAuIEJ1bXAgSzk1IHZlcnNpb24gbnVtYmVyIHRvIDIuMC4yOiBja2NtYWkuYworCitBZGRlZCAtRENLX1BBTSAtRENLX1NIQURPVyB0byBhbGwgU29sYXJpcyB0YXJnZXRzLCAyLjYgYW5kIGFib3ZlLiAgbWFrZWZpbGUsCisyMyBKdWwgMjAwMi4KKworRGlzY292ZXJlZCB0aGF0IENLX1NDUklQVFMgcGF0aCBzZWFyY2ggZm9yIFRBS0UgZmlsZXMgd2FzICNpZmRlZidkIG91dAorZXhjZXB0IGZvciBLOTUuICBGaXhlZCBpbiBja3V1c3IuYywgMjUgSnVsIDIwMDIuCisKK0Zyb20gSmVmZjogY2hhbmdlcyB0byBzdXBwb3J0IEs5NSBpdGFsaWNzOiBja3V1c1s1N10uYywgIDI1IEp1bCAyMDAyLgorCitGaXhlZCBwYXRoIHNlYXJjaCBmb3IgVEFLRSB0byBub3Qgc2VhcmNoIHRoZSBDS19TQ1JJUFRTIHBhdGggaWYgdGhlIGZpbGVzcGVjCitjb250YWlucyBhbnkgZGlyZWN0b3J5IG9yIHBhdGggcGFydHMuICBBZGRlZCBhIG5ldyBmdW5jdGlvbiB0byBjaGVjayBmb3IKK3RoaXM6ICBpbnQgaGFzbm9wYXRoKGZpbGVzcGVjKSBpbiBja3VjbWQuYzogMjYgSnVsIDIwMDIuCisKK1VwZGF0ZSBIUC1VWCBidWlsZCBpbnN0cnVjdGlvbnMgZnJvbSBQZXRlckU6IG1ha2VmaWxlLCAyNiBKdWwgMjAwMi4KKworQ29tbWVudGVkIG91dCAiY29uc3QiIGZyb20gc3RydWN0IHBhbV9tZXNzYWdlIGRlY2xhcmF0aW9ucyBiZWNhdXNlIGl0CitjYXVzZXMgImluaXRpYWxpemF0aW9uIHR5cGUgbWlzbWF0Y2giIHdhcm5pbmdzLiAgY2t1ZmlvLmMsIDI2IEp1bCAyMDAyLgorCitTdXBwb3NlIHlvdSBoYXZlIGEgbmV0d29yayBkaXJlY3RvcnkgY29udGFpbmluZyBhIGxpc3RpbmcgZm9yIGhvc3QgImZvbyI6CisKKyAgZm9vIHRjcC9pcCBmb28uYmFyLmNvbQorCitUaGVuIGluIEs5NSB5b3UgZ2l2ZSBhIGNvbW1hbmQgInNldCBob3N0IC9uZXR3b3JrLXR5cGU6c3NoIGZvbyIuICBUaGlzCityZXN1bHRzIGluIHRoZSBkaXJlY3RvcnkgbG9va3VwIHJlcGxhY2luZyB0aGUgInNzaCIgbmV0d29yayB0eXBlIHdpdGggVENQL0lQLAorYW5kIG1ha2luZyBhIFRlbG5ldCBjb25uZWN0aW9uLiAgRml4IGF0dGVtcHRlZCBhdCBhYm91dCBsaW5lIDg2MjUgb2YgY2t1dXM3LmMKK2luIGN4X25ldCgpOyBuZWVkcyB0ZXN0aW5nIGluIEs5NS4gIDI2IEp1bCAyMDAyLgorCitGVFAgUGFzc3dvcmQ6IHByb21wdCBpbiBVbml4IHdhcyBub3QgYWxsb3dpbmcgZWRpdGluZy4gIFRoZSBjb2RlIGxvb2tlZCByaWdodDsKK0kgcHV0IGluIHNvbWUgZGVidWdnaW5nIGFuZCBzdWRkZW5seSBpdCB3b3JrZWQuICBUb29rIG91dCB0aGUgZGVidWdnaW5nIGFuZAoraXQgc3RpbGwgd29ya2VkLiAgTWF5YmUgSSBkcmVhbWVkIGl0LiAgQW55d2F5LCBJIGZpeGVkIHRoZSAiRlRQIFNFTlQiIGRlYnVnCitsb2cgZW50cnkgdG8gbm90IHJlY29yZCB0aGUgcGFzc3dvcmQsIGFuZCByZW1vdmVkIGEgcmVkdW5kYW50IHNlY3Rpb24gYWJvdmUKK3RvIGxvZyB0aGUgc2FtZSB0aGluZywgYnV0IHByaW9yIHRvIGFueSBjaGFyc2V0IGNvbnZlcnNpb24uICBja2NmdHAuYywKKzI3IEp1bCAyMDAyLgorCitGcm9tIEplZmYsIDI4IEp1bCAyMDAyOgorIC4gRml4IHR5cG8gaW4gaW5pdHhsaXN0KCk6IGNrY21haS5jLgorIC4gRml4IHR5cG8gaW4gRnJpZGF5J3Mgc2V0LWhvc3QgZml4OiBja3V1czcuYy4KKyAuIE1vdmUgcGFyc2luZyBvZiAtLWhlaWdodC93aWR0aCBjb21tYW5kLWxpbmUgYXJncyBhZnRlciBwcmVzY2FuKCk6IGNrdXVzeS5jLgorCitBZGRlZCBpbnZpc2libGUgdG9wLWxldmVsIFNJVEUgYW5kIFBBU1NJVkUgY29tbWFuZHMgZm9yIEZUUCBhcyBhIGNvbnZlbmllbmNlCitmb3IgaGFiaXR1YXRlZCBGVFAgY2xpZW50IHVzZXJzLiAgY2t1dXNyLltjaF0sIGNrY2Z0cC5jLCAyOCBKdWwgMjAwMi4KKworQSB3aGlsZSBiYWNrIGEgdXNlciBhc2tlZCBpZiBpdCB3YXMgcG9zc2libGUgdG8gTUdFVCBhIGJ1bmNoIG9mIGZpbGVzIGZyb20KK2FuIEZUUCBzZXJ2ZXIgYW5kIGhhdmUgdGhlbSBhbGwgYXBwZW5kZWQgdG8gZWFjaCBvdGhlciB1cG9uIGFycml2YWwuICBUaGUKK29idmlvdXMgd2F5IHRvIGRvIHRoaXMgd291bGQgaGF2ZSBiZWVuOgorCisgIG1nZXQgL2NvbGxpc2lvbjphcHBlbmQgL2FzLW5hbWU6YmlnZmlsZSAqLioKKworQnV0IHRvIG1ha2UgdGhpcyB3b3JrLCBJIGhhZCB0byBnZXQgcmlkIG9mIHRoZSAiYXMtbmFtZSBtdXN0IGNvbnRhaW4KK3ZhcmlhYmxlcyIgY2hlY2sgaW4gdGhlIE1HRVQgcGFyc2VyLiAgZG9mdHBnZXQoKTogY2tjZnRwLmMsIDI4IEp1bCAyMDAyLiAgCisKK1ZlcmlmaWVkIHRoYXQgaXQgd2FzIHBvc3NpYmxlIHRvIGRvIHRoZSBzYW1lIHRoaW5nIChHRVQgYSBidW5jaCBvZiBmaWxlcworYW5kIGFwcGVuZCB0aGVtIGFsbCBpbnRvIG9uZSByZXN1bHQgZmlsZSkgd2l0aCBLZXJtaXQgcHJvdG9jb2wuICBJdCB3b3JrcworZmluZSBidXQgaW4gdGhpcyBjYXNlIHRoZXJlIGlzIG5vIC9DT0xMSVNJT04gc3dpdGNoOyB5b3UgaGF2ZSB0byBTRVQgRklMRQorQ09MTElTSU9OIEFQUEVORCBmaXJzdC4gIDMwIEp1bCAyMDAyLgorCitDaGFuZ2VkIENPUFkgL0FQUEVORCB0byBhbGxvdyB3aWxkIHNvdXJjZSB0byBzaW5nbGUgZGVzdGluYXRpb24gZmlsZSwgZS5nLgorImNvcHkgL2FwcGVuZCAqLiogYmlnZmlsZSIuICBja3V1czYuYywgMzAgSnVsIDIwMDIuCisKK0Zyb20gTWFyayBCZXJyeW1hbjogYSByZXBsYWNlbWVudCBmb3IgemNoa3BhdGgoKSwgdGhlIFZNUyByb3V0aW5lIHRoYXQgY2hlY2tzCit3aGV0aGVyIGEgZmlsZSBpcyBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnk7IHRoZSBvbGQgb25lICh0aGF0IEkgd3JvdGUpIHdhcworYSBoYWNrIHRoYXQgb25seSB3b3JrZWQgc29tZXRpbWVzLiAgTWFydGluIFZvcmxhZW5kZXIgdmVyaWZpZWQgTWFyaydzIGNvZGUgaW4KK3RoZSBzaXR1YXRpb24gd2hlcmUgbWluZSB3YXMgYnJlYWtpbmcgKHNlcnZlciBydW5uaW5nIGluIGNhcHRpdmUgYWNjb3VudCkuCitja3ZmaW8uYywgMzAgSnVsIDIwMDIuCisKK1BldGVyRSByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBTV0lUQ0ggY2FzZSBsYWJlbHMgdGhhdCBzdGFydCB3aXRoICcjJzoKK1RoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIFNXSVRDSCB2YXJpYWJsZSBjb250ZW50cyBpbiB0aGlzIGNhc2UgaGFwcGVucyB0byBiZQorYSBjb21tZW50LCBlLmcuOgorCisgIENNRChNKVtfZm9yd2FyZCAjIFN0YW5kOiAyNC4wNy4yMDAyPENSPl0KKworc28gdGhlIEdPVE8gdGFyZ2V0IGlzIG51bGwuICBUaGUgc29sdXRpb24gd291bGQgYmUgZm9yIFNXSVRDSCB0byBwdXQgdGhlIEdPVE8KKyhfRk9SV0FSRCkgdGFyZ2V0IGluIHF1b3Rlcy4gIEJ1dCBHT1RPIGRvZXMgbm90IHN0cmlwIHF1b3RlcyBvciBicmFjZXMgZnJvbQorYXJvdW5kIGl0cyB0YXJnZXQuICBGaXhlZCBpbiBja3V1c3IuYywgMzAgSnVsIDIwMDIuCisKK0ZpeGVkIHRoZSBTV0lUQ0ggbWFjcm8gZGVmaW5pdGlvbiB0byBwdXQgdGhlIF9GT1JXQVJEIHRhcmdldCBpbiBxdW90ZXMuCitja3V1czUuYywgMzAgSnVsIDIwMDIuCisKK1BldGVyRSBhbHNvIHJlcG9ydGVkIHRoYXQgYW4gZW1wdHkgU1dJVENIIGNhc2UgbGFiZWwgZGlkIG5vdCB3b3JrLiAgVGhlcmUncyBubworcGFydGljdWxhciByZWFzb24gd2h5IGl0IHNob3VsZCwgYnV0IGFmdGVyIGEgYnJpZWYgbG9vaywgaXQgd2Fzbid0IHRoYXQgaGFyZAorc28gSSBkaWQgaXQuICBJdCByZXF1aXJlZCBjb21tZW50aW5nIG91dCB0aGUgY2hlY2sgZm9yIGVtcHR5IGxhYmVscyBhbmQgZml4aW5nCit0aGUgY29tcGFyaXNvbiBpbiBkb2dvdG8oKS4gIE5vdyBpdCdzIHBvc3NpYmxlIHRvIHJlYWQgbGluZXMgZnJvbSBhIGZpbGUgYW5kCit1c2UgZWFjaCBsaW5lIGFzIGEgU1dJVENIIHZhcmlhYmxlLCB3aXRoIHBhdHRlcm5zIGFzIGNhc2UgbGFiZWxzLCBpbmNsdWRpbmcgYW4KK2VtcHR5IGxhYmVsIHRvIG1hdGNoIGVtcHR5IGxpbmVzLCAjKiBsYWJlbHMgdG8gbWF0Y2ggY29tbWVudCBsaW5lcywgZXRjLgorY2t1dXNbcjZdLmMsIDMwIEp1bCAyMDAyLgorCitQZXRlckUgYWxzbyByZXBvcnRlZCB0aGUgdmFsdWUgb2YgXCUqIGFjcXVpcmluZyBhIHRyYWlsaW5nIGJsYW5rIHdoZW4KK3JlZmVyZW5jZWQgaW5zaWRlIGEgU1dJVENIIHN0YXRtZW50LiAgVGhpcyBoYXBwZW5zIGJlY2F1c2UgXCUqIGlzIGZvcm1lZCB1c2luZworXGZqb2luKCkgb24gdGhlIFwmX1tdIGFycmF5IGJhc2VkIG9uIGl0cyBkaW1lbnNpb24sIGFuZCBhdCBzb21lIHBvaW50IHRoZQorZGltZW5zaW9uIGlzIHNwdXJpb3VzbHkgaW5jcmVhc2VkIGJ5IG9uZS4gIEFzIGEgd29ya2Fyb3VuZCwgSSBtYWRlIFxmam9pbigpCitpZ25vcmUgdHJhaWxpbmcgZW1wdHkgXCZfW10gYXJyYXkgZWxlbWVudHMgYW5kIG9kZGx5IGVub3VnaCB0aGlzIGFsc28gZml4ZWQKK3RoZSBncm93aW5nIGRpbWVuc2lvbnMgcHJvYmxlbS4gIFRoZSBtYW55IHNjcmlwdCB0b3J0dXJlIHRlc3RzIHJldmVhbCBubyBpbGwKK2VmZmVjdHMsIHNvIGl0IHNlZW1zIGxpa2UgYSBrZWVwZXIuICBja3V1czQuYywgMzAgSnVsIDIwMDIuCisKK1NvbWUgb2YgUGV0ZXIncyBzYW1wbGUgc2NyaXB0cyBtYWRlIEMtS2VybWl0IDguMC4yMDEgZHVtcCBjb3JlLCBidXQgbm8gbW9yZS4KKworRml4ZWQgImRlbGV0ZSB4eHgiIHRvIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGZhaWwgaWYgaWYgeHh4IGRvZXMgbm90IGV4aXN0LgorRGl0dG8gZm9yIHdoZW4geHh4IGlzIGEgZGlyZWN0b3J5LiAgY2t1dXM2LmMsIDMwIEp1bCAyMDAyLgorCitQYXRjaGVzIHRvIFNTTCBtb2R1bGVzIGZyb20gSmVmZiBiYXNlZCBvbiB5ZXN0ZXJkYXkncyBhZHZpc29yeS4gIGNrX3NzbC5bY2hdLAorMzEgSnVsIDIwMDIuCisKK0ZpeGVkIHNvbWUgdHlwb3MgYWZmZWN0aW5nIHRoZSBmaWxlbmFtZSBjb2xsaXNpb24gYWN0aW9uIGR1cmluZyBjb21tYW5kLWxpbmUKK0ZUUCBbTV1HRVQuICBja2NmdHAuYywgMzEgSnVsIDIwMDIuCisKK0ZpeGVkIFNIT1cgRlRQIHRvIGhhbmRsZSBGVFAgQ09MTElTSU9OIERBVEVTLURJRkZFUi4gIGNrY2Z0cC5jLCAzMSBKdWwgMjAwMi4KKworQSB3aGlsZSBiYWNrIHNvbWVvbmUgcG9pbnRlZCBvdXQgdGhhdCBTRVQgQ09OVFJPTCBVTlBSRUZJWCBBTEwgYW5kIFNFVAorUFJFRklYSU5HIE5PTkUgZ2F2ZSBkaWZmZXJlbnQgcmVzdWx0cy4gIEZpeGVkIHRoZW0gdG8gdXNlIHRoZSBzYW1lIGNvZGUuCitBbHNvIG1hZGUgInNldCBwcmVmaXhpbmcgbm9uZSIgdmlzaWJsZS4gIGNrdXVzMy5jLCA0IEF1ZyAyMDAyLgorCitBZGRlZCBTRVQgQ0QgSE9NRSA8cGF0aD4sIHRvIGxldCB0aGUgdXNlciBzcGVjaWZ5IHdoaWNoIGRpcmVjdG9yeSBpcyBpbnRlbmRlZAord2hlbiAiQ0QiIG9yICJLQ0QiIGlzIGdpdmVuIGJ5IGl0c2VsZi4gIFRoaXMgaXMgYmVjYXVzZSBpbiBXaW5kb3dzLCBzb21lCithcHBsaWNhdGlvbnMgc2V0IHVwIHRoZWlyIG93biBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgaXNuJ3QgbmVjZXNzYXJpbHkKK3doZXJlIHRoZSB1c2VyIHdhbnRzICJjZCIgdG8gZ28sIGJ1dCByZWRlZmluaW5nIEhPTUUgY2FuIGludGVyZmVyZSB3aXRoIHRoZQorYXBwbGljYXRpb24gKGV4YW1wbGU6IFdpbmRvd3MgRU1BQ1MpLiAgU0VUIENEIEhPTUUgd2FzIGRvbmUgYnkgYWRkaW5nIGEgbXlob21lCit2YXJpYWJsZSwgaW5pdGlhbGx5IGEgTlVMTCBwb2ludGVyLCBhbmQgdGhlbiBjaGFuZ2luZyBob21lcGF0aCgpIHRvIHVzZSBpdCBpZgoraXQgaXMgc2V0LiAgemhvbWUoKSBpcyBub3QgYWZmZWN0ZWQuICBBbHNvIHRoZSBob21lcGF0aCgpIHByb3RvdHlwZSBoYWQgYmVlbgorbWlzc2luZyBmcm9tIGhlYWRlciBmaWxlcy4gIGNrY21haS5jLCBja3V1c3IuaCwgY2t1dXNbMjM0NV0uYywgNCBBdWcgMjAwMi4KKworUGV0ZXJFIGdvdCBhbm90aGVyIGNvcmUgZHVtcCB3aXRoIGhpcyBTV0lUQ0ggc3RhdGVtZW50LiAgRm91bmQgYSBwbGFjZSB3aGVyZQorYW4gb3V0LW9mLWJvdW5kcyBhcnJheSByZWZlcmVuY2UgY291bGQgb2NjdXIgaWYgdGhlIHN3aXRjaCB2YXJpYWJsZSB3YXMKK2VtcHR5LiAgY2t1dXM2LmMsIDUgQXVnIDIwMDIuCisKK1BldGVyRSBub3RpY2VkIHRoYXQgaWYgdGhlIHN3aXRjaCB2YXJpYWJsZSBjb250YWluZWQgYSBjb21tYSwgc3B1cmlvdXMgbWF0Y2hlcworY291bGQgb2NjdXIgd2l0aCB0aGUgbGFiZWwgcGF0dGVybi4gIFRoZSByZWFsIHByb2JsZW0gdHVybnMgb3V0IHRvIGJlIHdoYXQKK2hhcHBlbnMgd2hlbiB0aGUgU1dJVENIIHZhcmlhYmxlIGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRoZSBjYXNlIGxhYmVscyBhbmQKK3RoZXJlIGlzIG5vIERFRkFVTFQgbGFiZWwuICBGaXhlZCBieSBoYXZpbmcgZG9nb3RvKCkgaW4gdGhlIFNXSVRDSCAoX0ZPUldBUkQpCitjYXNlIHBvcCB0aGUgY29tbWFuZCBzdGFjayBiZWZvcmUgcmV0dXJuaW5nIGZhaWx1cmUsIGkuZS4gYnkgbW92aW5nIHRoZQorImlmIChzdG9wZmxnKSByZXR1cm4oMCk7IiBzdGF0ZW1lbnQgZG93biBhIGZldyBsaW5lcy4gIGNrdXVzNi5jLCA1IEF1ZyAyMDAyLgorCitQZXRlckUgbm90aWNlZCB0aGF0IGEgU1dJVENIIGNhc2UgbGFiZWwgb2YgOiogZGlkIG5vdCBtYXRjaCBhbiBlbXB0eSBTV0lUQ0gKK3ZhcmlhYmxlLiAgRml4ZWQgaW4gZG9zd2l0Y2goKTogY2t1dXM2LmMsIDYgQXVnIDIwMDIuCisKK0luIHRlc3RpbmcgdGhlIHByZXZpb3VzIGZpeCwgSSBmb3VuZCBpdCBvbmx5IHdvcmtlZCBzb21ldGltZXMuICBJbnNwZWN0aW9uCitvZiB0aGUgZGVidWcgbG9nIHNob3dlZCB0aGF0IGEgc3RhdGVtZW50IGxpa2U6CisKKyAgaWYgKHkgPT0gLTMpIHMgPSAie30iOworCit3YXMgYXNzaWduaW5nICJ7IiByYXRoZXIgdGhhbiAie30iIHRvIHMuICBSZXBsYWNpbmcgdGhlIHN0cmluZyBjb25zdGFudCBieSBhCitidWZmZXIgY29udGFpbmluZyB0aGUgc2FtZSBzdHJpbmcgZml4ZWQgaXQuICBUaGUgcmVhc29uIChndWVzc2VkIGNvcnJlY3RseSBieQorUGV0ZXJFKSB3YXMgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToKKworICB5ID0gY21mbGQoIlZhcmlhYmxlIG5hbWUiLCIiLCZzLHh4c3RyaW5nKTsKKyAgaWYgKHkgPT0gLTMpIHMgPSAie30iOworICBsZW4gPSBja3N0cm5jcHkodG1wYnVmLGJyc3RyaXAocyksVE1QQlVGU0laKTsKKworYnJzdHJpcCgpIChieSBkZXNpZ24gYW5kIGFzIGRvY3VtZW50ZWQpIGFmZmVjdHMgdGhlIHN0cmluZyBpbiBwbGFjZS4gIEJ1dCBpbgordGhpcyBjYXNlIHRoZSBzdHJpbmcgaXMgYSBjb25zdGFudCwgbm90IGRhdGEgaW4gYSBidWZmZXIsIHNvIGFsbCBmdXJ0aGVyIHVzZXMKK29mICJ7fSIgZ2V0IHRoZSB3cm9uZyBzdHJpbmcgKGF0IGxlYXN0IGluIG9wdGltaXplZCBidWlsZHMpLiAgVGhlIG9ubHkgcmVhbAorY3VyZSBpcyB0byBjaGFuZ2UgYnJzdHJpcCgpIHRvIG1ha2UgYSBjb3B5IG9mIGl0cyBhcmd1bWVudCBpZiBpdCBoYXMgdG8gZG8KK2FueXRoaW5nIHRvIGl0LiAgVGhpcyB3aWxsIHNsb3cgZG93biBzb21lIHNjcmlwdHMsIGJ1dCBpdCdzIHRvbyByaXNreSB0bworbGVhdmUgaXQgYXMgaXQgd2FzLiAgY2tjbGliLmMsIDYgQXVnIDIwMDIuCisKK1RoZSBwcmV2aW91cyBjaGFuZ2UgcmVxdWlyZWQgYW4gYXVkaXQgb2YgdGhlIEMtS2VybWl0IGNvZGUgdG8gbWFrZSBzdXJlIHRoYXQKK25vIHJlZmVyZW5jZXMgdG8gYnJzdHJpcCgpIGRlcGVuZGVkIHRoZSByZXN1bHQgYnVmZmVyIGJlaW5nIHBlcnNpc3RlbnQsIG9yIHRoZQorcmVzdWx0IHBvaW50ZXIgaW5kaWNhdGluZyBhIHBvc2l0aW9uIGluIHRoZSBzb3VyY2UgYnVmZmVyLiAgT29wcywgaXQgdHVybnMgb3V0Cit0aGF0IHRob3VzYW5kcyBvZiBwbGFjZXMgcmVseSBvbiBicnN0cmlwKCkgd29ya2luZyBpbiBwbGFjZS4gIFRoZXJlZm9yZSB0aGUKK2NoYW5nZSBoYWQgdG8gYmUgdW5kb25lLiAgVGhlcmUncyBubyBnb29kIHdheSB0byB3cml0ZSBhIGR1bW15LXByb29mIGJyc3RyaXAoKTsKK3Byb2dyYW1tZXJzIGVpdGhlciBoYXZlIGJlIHN1cmUgdGhleSdyZSBub3QgY2FsbGluZyBpdCB3aXRoIGEgcG9pbnRlciB0byBhCitzdHJpbmcgY29uc3RhbnQsIG9yIGVsc2UgdGhleSBoYXZlIHRvIGNvcHkgdGhlIHJlc3VsdCBiYWNrIHRvIHRoZSByaWdodCBwbGFjZQorZWFjaCB0aW1lLiAgQmV0dGVyIHRvIGxlYXZlIGl0IGFzIGl0IHdhcyBhbmQgYXVkaXQgdGhlIGNvZGUgdG8gZml4IGFueSBjYWxscwordGhhdCByZWZlciB0byBzdHJpbmcgY29uc3RhbnRzICh0dXJucyBvdXQgdGhlcmUgd2VyZSBvbmx5IHR3bykuICBSZXN0b3JlZCB0aGUKK29yaWdpbmFsIGZpeCB0byBkb3N3aXRjaCgpIChyZXBsYWNpbmcgdGhlIHN0cmluZyBjb25zdGFudCBieSBhIGJ1ZmZlciBob2xkaW5nCit0aGUgc2FtZSBzdHJpbmcpLCBwbHVzIG1pbm9yIGZpeGVzIHRvIGNrY2Z0cC5jLCBja3V1c1tyMzZdLmMsIDYgQXVnIDIwMDIuCisKK1dlIG5lZWQgZmlsZSBkaWFsb2dzIGluIHNldmVyYWwgc2l0dWF0aW9ucyBpbiB0aGUgSzk1IEdVSS4gIEkgYWRkZWQgYSAidXNlcgorcXVlcnkiIHJvdXRpbmUgZm9yIHRoaXMsIHVxX2ZpbGUoKSwgaW4gY2t1dXMzLmMsIGZpbGxpbmcgaXQgaW4gb25seSBmb3IgVW5peC4KK1RoZW4gSSBhZGRlZCBjb2RlIHRvIGNhbGwgaXQgZnJvbSByY3ZmaWwoKSB3aGVuIChhKSBpdCdzIGFuIGF1dG9kb3dubG9hZCwgYW5kCisoYikgU0VUIFRFUk0gQVVUT0RPV05MT0FEIGlzIEFTSyAoSSBqdXN0IGFkZGVkIHRoaXMgb3B0aW9uOyBpdCBuZWVkcyB0byBiZSBzZXQKK3RvIHNlZSBpdCBpbiBhY3Rpb24gLS0gbWF5YmUgaXQgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGZvciBLVUksIGluIHdoaWNoIGNhc2UKK2luaXRpYWxpemUgImludCBhdXRvZGwgPSA/IiB0byBUQURfQVNLIGluIGNrY21haS5jKS4gIFdvcmtzIGZpbmUsIGV4Y2VwdCBvZgorY291cnNlIGl0IGludGVyZmVyZXMgd2l0aCB0aGUgZmlsZS10cmFuc2ZlciBkaXNwbGF5LCBidXQgdGhhdCB3b24ndCBiZSBhCitwcm9ibGVtIGluIEs5NUcuICBja3V1c3IuaCwgY2t1dXNbMzddLmMsIGNrY2Zucy5jLCBja3VjbnMuYywgNiBBdWcgMjAwMi4KKworQW5vdGhlciBwbGFjZSB3ZSBuZWVkIGEgZmlsZSBkaWFsb2cgaXMgd2hlbiBLZXJtaXQgaXMgYSBVUkwgaW50ZXJwcmV0ZXIuICBUaGUKK3Byb2JsZW0gaXM6IGhvdyBjYW4gd2UgbGV0IHRoZSB1c2VyIGRlY2lkZSB3aGV0aGVyIEtlcm1pdCBzaG91bGQgYXNrPyAgVGhlcmUKK3JlYWxseSBpc24ndCBhbnkgd2F5LiAgRWl0aGVyIGl0IGFsd2F5cyBhc2tzIG9yIGl0IG5ldmVyIGRvZXMuICBJbiB0aGlzIGNhc2UgSQordGhpbmsgaXQgbWFrZXMgc2Vuc2UgdG8gYWx3YXlzIGFzayBpZiBpdCdzIEtVSSwgb3RoZXJ3aXNlIG5ldmVyLiAgSSBhZGRlZCB0aGUKK2NvZGUgZm9yIGZ0cDogVVJMcyB0byB0byBkb2Z0cHJlY3YyKCksIHdoaWNoIEkgdGVzdGVkIHN1Y2Nlc3NmdWxseSBpbiBVbml4CitiZWZvcmUgcHV0dGluZyBpdCBpbnRvICNpZmRlZiBLVUkuLiNlbmRpZi4gIEFsc28gYWRkZWQgY29kZSBmb3IgaHR0cFtzXSB0bworY2t1dXN5LmMgaW4gI2lmZGVmIEtVSS4uI2VuZGlmLCBub3QgdGVzdGVkLgorCitTdGlsbCBuZWVkIHRoaXMgYWRkZWQgZm9yIEs5NUcgQWN0aW9ucy0+Q2FwdHVyZS4gIFRoZSBjbGVhcmVzdCBleGFtcGxlIGlzIHRoZQorRlRQIG9uZS4gIEp1c3Qgc2VhcmNoIGZvciBLVUkgaW4gdGhlIEZUUCBtb2R1bGUuCisKK1NvbWUgbWlub3IgYWRqdXN0bWVudHMgdG8geWVzdGVyZGF5J3Mgd29yaywgbWFpbmx5IGp1c3QgY29tbWVudHMsIHBsdXMKK2dlbmVyYXRlIHRoZSBmdWxsIHBhdGhuYW1lIGZvciB0aGUgZGVmYXVsdCBmaWxlLiAgY2t1dXMzLmMsIGNrY2Z0cC5jLAorNyBBdWcgMjAwMi4KKworTm90ZTogZm9yIHNvbWUgcmVhc29uIGNtb2ZpKCkgaXMgbm90IHN1cHBseWluZyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB1c2VyCitlbnRlcnMgYW4gZW1wdHkgbmFtZS4uLiAoYnV0IHRoYXQgd29uJ3QgYWZmZWN0IHRoZSBXaW5kb3dzIHZlcnNpb24pLgorCitBZGRlZCAvVVNFUjogYW5kIC9QQVNTV09SRDogc3dpdGNoZXMgdG8gU0VUIFRDUCB7IEhUVFAtUFJPWFksIFNPQ0tTLVNFUlZFUiB9LgorY2t1dXMzLmMsIDcgQXVnIDIwMDIuCisKK05ldyAndW5pbnN0YWxsJyB0YXJnZXQgZnJvbSBQZXRlckUsIHdvcmtzIGJ5IGhhdmluZyB0aGUgJ2luc3RhbGwnIHRhcmdldAord3JpdGUgYW4gVU5JTlNUQUxMIHNoZWxsIHNjcmlwdC4gIG1ha2VmaWxlLCA4IEF1ZyAyMDAyLgorCitBZGRlZCBzb21lIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIHRvIHRoZSBWTVMgY29tbXVuaWNhdGlvbnMgaS9vIG1vZHVsZSB0byB0cnkKK3RvIHRyYWNrIGRvd24gYSBwcm9ibGVtIHRoYXQgb2NjdXJzIHdoZW4gdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIGlzIGEgTEFUCitkZXZpY2UuICBja3Z0aW8uYywgMTAgQXVnIDIwMDIuCisKK0ZpeGVkIHRoZSBub24tSzk1IHVxX2ZpbGUoKSB0byByZXNwZWN0IHRoZSBnaXZlbiBkZWZhdWx0IG5hbWUsIGJ1dCBzdGlsbCBzaG93Cit0aGUgZnVsbHkgcXVhbGlmaWVkIGFic29sdXRlIHBhdGhuYW1lIGZvciB0aGUgZGVmYXVsdCBpbiB0aGUgZGlhbG9nLiAgVGhlCityZWFzb24gdG8gbm90IHVzZSB0aGUgZnVsbHkgcXVhbGlmZWQgbmFtZSBhcyB0aGUgZGVmYXVsdCBpbiB0aGUgY214eHgoKSBjYWxscworaXMgdGhhdCB0aGlzIGNhbiBlYXNpbHkgcmVzdWx0IGluIGEgd2hvbGUgZGlyZWN0b3J5IHRyZWUgYmVpbmcgY3JlYXRlZCBkdWUgdG8KK2RpcmVjdG9yeSBhbGlhc2VzLCBzeW1saW5rcywgZXRjLiAgU28gd2hlbiB5b3UgZ2V0IGEgZmlsZSBieSByZWZlcnJpbmcgdG8gaXRzCitVUkwgKGUuZy4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvUkVBRC5NRSksIHVxX2ZpbGUoKSBjb252ZXJ0cyB0aGUKK1JFQUQuTUUgcGFydCB0byAoZS5nLikgL2hvbWUvZmRjL3RtcC9SRUFELk1FIGJ1dCBnaXZlcyBqdXN0ICJSRUFELk1FIiBhcyB0aGUKK2RlZmF1bHQgd2hlbiBwYXJzaW5nIHRoZSBuYW1lLiAgVGhpcyB3YXkgdGhlIHVzZXIga25vd3Mgd2hlcmUgaXQgd2lsbCBnbyBhbmQKK2dldHMgYW4gb3Bwb3J0dW5pdHkgdG8gY2hhbmdlIGl0LCBhbmQgaWYgdGhlIGRlZmF1bHQgaXMgYWNjZXB0ZWQsIGl0IGdvZXMgaW50bwordGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgdXFfZmlsZSgpOiBja3V1czMuYywgMTAgQXVnIDIwMDIuCisKK0ZvdW5kIHRoZSBzcG90IGZvciBjYWxsaW5nIHVxX2ZpbGUoKSBmb3Iga2VybWl0Oi8vIFVSTCBkb3dubG9hZHMuICBBZGRlZAorcHJlZmF0b3J5IHRleHQgdG8gZmlsZW5hbWUgcHJvbXB0cyBmb3IgS2VybWl0IGFuZCBGVFAgZG93bmxvYWRzLiAgY2tjZm5zLmMsCitja2NmdHAuYywgMTAgQXVnIDIwMDIuCisKK05vdyB3aXRoIGtlcm1pdDovLyBvciBmdHA6Ly8gVVJMIGRvd25sb2FkcyB0aGVyZSdzIG5vIHdheSB0byBkaXNhYmxlIHRoZQorcHJvbXB0aW5nLiAgSSBjb3VsZCBlYXNpbHkgbWFrZSBTRVQgVEVSTUlOQUwgQVVUT0RPV05MT0FEIEFTSyBjb3ZlciB0aGVzZQorY2FzZXMgdG9vIChldmVuIHRob3VnaCAidGVybWluYWwiIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRlRQIG9yIFVSTAorZG93bmxvYWRzKS4gIE9LLCBJIGRpZCB0aGlzLCBidXQgbm93IHByb21wdGluZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorY2tjZnRwLmMsIGNrY2Zucy5jLiAgMTAgQXVnIDIwMDIuCisKK0VuYWJsZWQgZmlsZSBwcm9tcHRpbmcgKGFkbF9hc2spIGJ5IGRlZmF1bHQgaW4gSzk1RywgZGlzYWJsZWQgaXQgYnkgZGVmYXVsdAorZXZlcnl3aGVyZSBlbHNlLiAgU28gbm93IEZUUCBhbmQgS2VybWl0IFVSTCBkb3dubG9hZHMgYXMgd2VsbCBhcyB0ZXJtaW5hbC1tb2RlCitLZXJtaXQgKGJ1dCBub3QgWm1vZGVtKSBkb3dubG9hZHMgYXJlIHByb21wdGVkIGZvciBpZiBURVJNSU5BTCBBVVRPRE9XTkxPQUQgaXMKK0FTSywgd2hpY2ggaXMgaXQgYnkgZGVmYXVsdCBvbmx5IGluIEs5NUcuICBCdXQgdGhpcyB3aWxsIGhhcHBlbiBvbmx5IGlmCit1cV9maWxlKCkgaXMgZmlsbGVkIGluIGZvciBLOTVHOyBvdGhlcndpc2UgZXZlcnl0aGluZyBzaG91bGQgd29yayBhcyBiZWZvcmUuCitja2NtYWkuYywgMTAgQXVnIDIwMDIuCisKK05vdGVzOgorIC4gTmVlZCBhIGJldHRlciBjb21tYW5kIHRvIGNvbnRyb2wgdGhpcy4KKyAuIEZUUCBVUkwgZG93bmxvYWRzIGFyZSBhbG1vc3QgaW5zdGFudGFuZW91cywgd2hlcmVhcyBLZXJtaXQgVVJMIGRvd25sb2FkcworICAgdGFrZSBhIHJlYWxseSBsb25nIHRpbWUgdG8gc2V0IHVwIChsb2dnaW5nIGluIHRha2VzIGF0IGxlYXN0IDEwIHNlY29uZHMpLgorCitGcm9tIEplZmYsIDEzIEF1ZyAyMDAyOgorIC4gSW5jcmVhc2UgSzk1IHZlcnNpb24gdG8gMi4xLjA6IGNrY21haS5jLgorIC4gU0VUIFRDUCB7IEhUVFAtUFJPWFksIFNPQ0tTLVNFUlZFUiB9IC9VU0VSOiAvUEFTU1dPUkQ6IGFjdGlvbnM6IGNrdXVzMy5jLgorCitGcm9tIFBldGVyRTogYSBuZXcgaW5zdGFsbCB0YXJnZXQgdGhhdCdzIG9ubHkgYWJvdXQgaGFsZiBhcyBhIGJpZyBhcyB0aGUKK3ByZXZpb3VzIG9uZSwgeWV0IHN0aWxsIGdlbmVyYXRlcyBhbiBVTklOU1RBTEwgc2NyaXB0LiAgbWFrZWZpbGUsIDEzIEF1ZyAyMDAyLgorCitWYWNlIHdhbnRlZCB0byBiZSBhYmxlIHRvIGdpdmUgdGhlIEZUUCBjbGllbnQgYW4gb2Zmc2V0IGZvciB0aGUgc2VydmVyIHRpbWUsCitpbiBjYXNlIHRoZSBzZXJ2ZXIncyB0aW1lIChvciB0aW1lem9uZSkgaXMgc2V0IGluY29ycmVjdGx5LiAgSSBhZGRlZCB0aGlzIGJ5CitidWlsZGluZyBvbiBhbGwgdGhlIGRhdGUvdGltZSBwYXJzaW5nL2FyaXRobWV0aWMgY29kZSAtLSBub3RhYmx5IGRlbHRhIHRpbWVzCistLSB0aGF0IHdhcyBkb25lIGZvciBDLUtlcm1pdCA4LjAuICBUaGUgbmV3IGNvbW1hbmQgaXMgU0VUIEZUUAorU0VSVkVSLVRJTUUtT0ZGU0VUIGRlbHRhLXRpbWU7IHNob3dzIHVwIGluIFNIT1cgRlRQIGFuZCBIRUxQIFNFVCBGVFAuCitja2NmdHAuYywgMTMgQXVnIDIwMDIuCisKK0ZpeGVkIEhFTFAgQVNLIGFuZCBIRUxQIEdFVE9LIHRleHQuICBja3V1czIuYywgMTQgQXVnIDIwMDIuCisKK0ZpeGVkIEdFVE9LIHRvIGFjY2VwdCAvR1VJIHN3aXRjaCBldmVuIGluIEs5NS5FWEUgYW5kIEMtS2VybWl0LCBqdXN0IGxpa2UgQVNLCitkb2VzIChpbiB3aGljaCBjYXNlLCBpdCBqdXN0IGlnbm9yZXMgaXQpLiAgY2t1dXM2LmMsIDE0IEF1ZyAyMDAyLgorCitTRVQgWEZFUiBDSEFSIFRSQU5TUEFSRU5UIG5vIGxvbmdlciBkaXNhYmxlcyBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGJlY2F1c2UKK2ZpbGUtc2Nhbm5pbmcgdHVybnMgaXQgYmFjayBvbi4gIFRoZSAibmV3IHdheSIgdG8gZGlzYWJsZSBjaGFyYWN0ZXItc2V0Cit0cmFuc2xhdGlvbiBpcyBTRVQgWEZFUiBUUkFOU0xBVElPTiBPRkYuICBUaGlzIG5lZWRsZXNzbHkgY29uZnVzZXMgdXNlcnMgd2hvCitleHBlY3QgdGhlIG9sZCB3YXkgdG8gc3RpbGwgd29yay4gIFNvIEkgZml4ZWQgU0VUIFhGRVIgQ0hBUiBUUkFOU1BBUkVOVCB0byBzZXQKK1hGRVIgVFJBTlNMQVRJT04gT0ZGLCBhbmQgU0VUIFhGRVIgQ0hBUiBhbnl0aGluZy1lbHNlIHRvIHNldCBpdCBiYWNrIE9OLgorY2t1dXMzLmMsIDE1IEF1ZyAyMDAyLgorCitGaXhlZCBTRVQgVEVSTSBBVVRPRE9XTkxPQUQgeyBPTiwgT0ZGIH0gdG8gdHVybiBvZmYgdGhlIEFTSyBmbGFnIChhZGxfYXNrKS4KK2NrdXVzNy5jLCAxNiBBdWcgMjAwMi4KKworQWRkZWQgRkVBVCBxdWVyeSB0byBGVFAgY2xpZW50IGZyb20gZHJhZnQtaWV0Zi1mdHBleHQtbWxzdC0xMy50eHQuICBGRUFUIGlzCitzZW50IGFsb25nIHdpdGggUkVTVCAwLCBNT0RFIFMsIGFuZCBTVFJVIEYgaWYgL05PSU5JVCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlCitGVFAgT1BFTiBjb21tYW5kLiAgUGFyc2luZyB0aGUgRkVBVCByZXN1bHQgaXMgaGFuZGxlZCBieSB0dXJuaW5nIHRoZSAiYXV0aCIKK2FyZ3VtZW50IHRvIGdldHJlcGx5KCkgaW50byBhIGZ1bmN0aW9uIGNvZGU6IEdSRl9BVVRIIHRvIHBhcnNlIEFVVEggcmVwbHk7CitHUkZfRkVBVCB0byBwYXJzZSBGRUFUIHJlcGx5LiAgRm9yIEdSRl9GRUFULCBnZXRyZXBseSgpIGZpbGxzIGluIGEgZmxhZyBhcnJheSwKK3NmdHRhYltdIChzZXJ2ZXIgZmVhdHVyZSB0YWJsZSk7IHNmdHRhYlswXSA+IDAgbWVhbnMgc2VydmVyIHJlc3BvbmRlZCB0byB0aGUKK0ZFQVQgcXVlcnksIGluIHdoaWNoIGNhc2UgaW5kaXZpZHVhbCBlbGVtZW50cyBhcmUgc2V0ID4gMCBmb3IgZWFjaCBzdXBwb3J0ZWQKK2ZlYXR1cmUuICBja2NmdHAuYywgMTggQXVnIDIwMDIuCisKK0lmIHNlcnZlciBzZW5kcyBhIGZlYXR1cmUgbGlzdCwgZGlzcGxheSBpdCBpZiBGVFAgREVCVUcgaXMgb24sIHRoZW4gc2V0IG1kdG1vaworYW5kIHNpemVvayAodGhlIGZsYWdzIHRoYXQgc2F5IHdoZXRoZXIgaXQncyBPSyB0byBzZW5kIE1EVE0gYW5kIFNJWkUgY29tbWFuZHMpCithY2NvcmRpbmdseS4gIElmIHVzZXIgZ2l2ZXMgYW4gW01dUFVUIC9SRUNPVkVSIGNvbW1hbmQgYW5kIHNlcnZlciBoYXMKK2Fubm91bmNlZCBpdCBkb2Vzbid0IHN1cHBvcnQgUkVTVCwgcHJpbnQgYSB3YXJuaW5nIGJ1dCB0cnkgYW55d2F5IChtYXliZQorY2hhbmdlIHRoaXMgbGF0ZXIpLiAgUmVzcG9uc2VzIGFib3V0IG90aGVyIGZlYXR1cmVzIHRoYXQgd2UgdXNlIHN1Y2ggYXMgQVVUSAorYW5kIFBCU1ogYXJlIGlnbm9yZWQgZm9yIG5vdyAtLSBpLmUuIHdlIHRyeSB0aGVtIGFueXdheS4gIEFuZCBvZiBjb3Vyc2UKK3Jlc3BvbnNlcyBmb3IgZmVhdHVyZXMgd2UgZG9uJ3QgY2FyZSBhYm91dCAoTEFORywgVFZGUywgUFJPVCkgYXJlIGlnbm9yZWQuCitja2NmdHAuYywgMTggQXVnIDIwMDIuCisKK0lmIHRoZSBzZXJ2ZXIgc2F5cyBpdCBzdXBwb3J0cyBNTFNULCB1c2UgTUxTRCBpbnN0ZWFkIG9mIE5MU1QgdG8gZ2V0IHRoZSBmaWxlCitsaXN0LiAgVGhpcyBpcyBkb25lIGluIHJlbW90ZV9maWxlcygpIHdpdGggc29tZSBzaW1wbGUgc3RyaW5nLXR3aWRkbGluZy4gIFRoZW4KK3JlcGxhY2UgdGhlIHJlbGV2YW50IChidXQgbm90IGFsbCkgU0laRSBjb21tYW5kcyB3aXRoIGNvZGUgdG8gZmlyc3QgY2hlY2sgaWYKK3dlIGFscmVhZHkgZ290IHRoZSBzaXplIGZyb20gdGhlIE1MU0QgcmVzcG9uc2UgYW5kIHVzZSB0aGF0IGluc3RlYWQgcmF0aGVyCit0aGFuIGFza2luZyBhZ2Fpbi4gIFNhbWUgZGVhbCBmb3IgTURUTS4gIGNrY2Z0cC5jLCAxOCBBdWcgMjAwMi4KKworQ2hlY2tlZCB0aGF0IHRoaXMgd29ya3Mgd2hlbiBnaXZpbmcgcGF0aG5hbWVzIGluIHRoZSBNR0VUIGZpbGVzcGVjLiAgQ2hlY2tlZAordG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgd29ya3MgYXMgYmVmb3JlIHdpdGggc2VydmVycyB0aGF0IGRvbid0IHN1cHBvcnQgRkVBVAorb3IgTUxTRC4gIENoZWNrZWQgdG8gbWFrZSBzdXJlIEZUUCBPUEVOIGJsYWggL05PSU5JVCB3b3JrZWQgd2l0aCBzZXJ2ZXJzIHRoYXQKK2RvIHN1cHBvcnQgRkVBVCBhbmQgTUxTRC4gIENoZWNrZWQgdGhhdCBGVFAgQ0hFQ0sgd29ya3MuICBJdCdzIGFsbCBPSy4KKworVGVzdGVkIG9ubHkgd2l0aCBJcHN3aXRjaCBzZXJ2ZXI7IG5lZWQgdG8gZmluZCBhbmQgdGVzdCB3aXRoIG90aGVycy4KKworVGhlIHN0YWNrIG9mIHRlbXAgZmlsZXMgbmVlZGVkIGZvciBNR0VUIC9SRUNVUlNJVkUgaXMgYW5ub3lpbmcgYmVjYXVzZSB3aGF0CitpZiB3ZSBydW4gb3V0IG9mIGZpbGUgZGVzY3JpcHRvcnMuLi4gIEJ1dCB0aGUgc3BlYyBkb2Vzbid0IHByb3ZpZGUgYSB3YXkgdG8KK3JlcXVlc3QgYSByZWN1cnNpdmUgbGlzdGluZy4KKworU3VwcGxpZWQgYSBtaXNzaW5nIGNvbW1hIGluIEhFTFAgU0VUIENEIHRleHQuICBja3V1czIuYywgMTkgQXVnIDIwMDIuCisKK0dlbmVyYWxpemVkIHBhcnNpbmcgb2YgTUxTVC9NTFNEIGZpbGUgZmFjdHMgYW5kIHZhbHVlcy4gIEdvdCBmaWxlIHR5cGUgZnJvbQorc2VydmVyIGFuZCBoYWQgTUdFVCBza2lwIG5vbi1yZWd1bGFyIGZpbGVzLiAgY2tjZnRwLmMsIDE5IEF1ZyAyMDAyLgorCitLaXJrIFR1cm5lci1SdXN0aW4gPGt0cnVzdGluQG93dS5lZHU+IHJlcG9ydGVkIHRoYXQgaWYgVW5peCBDLUtlcm1pdCBoYXMgYSBTRVQKK0hPU1QgUFRZIGNvbm5lY3Rpb24gKGUuZy4gU1NIKSBvcGVuLCBsb2NhbCB3aW5kb3cgc2l6ZSBjaGFuZ2VzIGFyZSBub3QKK3Byb3BvZ2F0ZWQgdGhyb3VnaCB0aGUgY29ubmVjdGlvbiB0byB0aGUgaG9zdC4gIEkgaW1hZ2luZSB0aGF0IG11c3QgYmUgYmVjYXVzZQordGhlIFNJR1dJTkNIIHNpZ25hbCBpcyBjYXVnaHQgYnkgS2VybWl0IGFuZCBpdHMgY2hpbGRyZW4gZG9uJ3Qgc2VlIGl0OyBtYXliZQoraWYgSSBwYXNzIGl0IGFsb25nIHRvIHRoZSBjaGlsZCBmb3JrLCBhbGwgd2lsbCBiZSBPSy4gIEJlZ2FuIGJ5IGV4cG9ydGluZworInNsYXZlcGlkIiBmcm9tIHRoZSBwdHkgbW9kdWxlIGFuZCBjaGFuZ2luZyBpdHMgbmFtZSB0byBwdHlfZm9ya19waWQuICBNb3ZlZAordGhlIFNJR1dJTkNIIGhhbmRsZXIsIHdpbmNoaCgpLCBmcm9tIGNrY3RlbC5jIHRvIGNrdXRpby5jLiAgQXJtZWQgaXQgZnJvbSBVbml4CitzeXNpbml0KCkgc28gaXQncyBhbHdheXMgYXJtZWQuICBUaGlzIHdheSB3aW5kb3cgY2hhbmdlcyBhZmZlY3QgVW5peCBDLUtlcm1pdAorbm8gbWF0dGVyIHdoYXQgbW9kZSBpdCdzIGluOiB0dF9yb3dzLCB0dF9jb2xzLCBjbWRfcm93cywgYW5kIGNtZF9jb2xzIGFyZSBhbGwKK2tlcHQgaW4gc3luYy4gIFRoZW4gaWYgd2UncmUgbm90IGluIHJlbW90ZSBtb2RlIChpLmUuIHdlIGhhdmUgYSB0dHlmZCksIHdlCitjYWxsIHRuX3NuYXdzKCkgYW5kIHJsb2dfc25hd3MoKSAod2hpY2ggc2hvdWxkIGJlIG9rIHNpbmNlIHRoZXkgcmV0dXJuIHJpZ2h0Cithd2F5IGlmIHRoZSBhcHByb3ByaWF0ZSBraW5kIG9mIGNvbm5lY3Rpb24gaXMgbm90IG9wZW4pIGFuZCB0aGVuIGlmCisocHR5X2ZvcmtfcGlkID4gLTEpLCBhIFNJR1dJTkNIIHNpZ25hbCBpcyBzZW50IHRvIGl0LiAgY2t1cHR5LmMsIGNrY3RlbC5jLAorY2t1dGlvLmMsIDIwIEF1ZyAyMDAyLgorCitBbGwgdGhpcyB3b3JrcyBmaW5lIGV4Y2VwdCB0aGUgUFRZIHBhcnQ7IGluIG90aGVyIHdvcmRzLCB0aGUgb3JpZ2luYWwgcHJvYmxlbQoraXMgbm90IGZpeGVkLiAgVGhlICJraWxsKHB0eV9mb3JrX3BpZCxTSUdXSU5DSCkiIGNhbGwgZXhlY3V0ZXMgd2l0aG91dCBlcnJvcgorYnV0IGhhcyBubyBlZmZlY3QgYmVjYXVzZSB0aGUgc2l6ZSBvZiB0aGUgUFRZIG5ldmVyIGNoYW5nZWQuICBUbyBtYWtlIHRoaXMKK3dvcmsgSSBoYWQgdG8gYWRkIGFuIGlvY3RsKCkgdG8gY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBQVFkgYmVmb3JlIHNlbmRpbmcgaXQKK3RoZSBTSUdXSU5DSC4gIENvbXBpbGVzIGFuZCB3b3JrcyBvayBvbiBMaW51eCBhbmQgU29sYXJpczsgS2lyayBhbHNvIGNvbmZpcm1lZAoraXQgZm9yIEFJWCA0LjMuMy4gIGNrdXRpby5jLCAyMCBBdWcgMjAwMi4KKworRml4ZWQgeGxvb2t1cCgpIHRvIHdvcmsgZm9yIHVwcGVyY2FzZSBrZXl3b3Jkcy4gIGNrdWNtZC5jLCAyMCBBdWcgMjAwMi4KKworRml4ZWQgRlRQIHBhcnNlZmVhdCgpIGFuZCBwYXJzZWZhY3RzKCkgdG8gdXNlIHhsb29rdXAoKSBpbnN0ZWFkIG9mIGxvb2t1cCgpLAorc2luY2UgYWJicmV2aWF0ZWQga2V5d29yZHMgYXJlIG5vdCBhbGxvd2VkLiAgY2tjZnRwLmMsIDIwIEF1ZyAyMDAyLgorCitBZGp1c3RlZCBzb21lIGxpbmVzIGZyb20geWVzdGVyZGF5J3Mgd2luZG93LXNpemUgY29kZSBmb3IgcGxhdGZvcm1zIEkgaGFkbid0Cit0cmllZCB5ZXQuICBja3V0aW8uYywgMjEgQXVnIDIwMDIuCisKK0VYSVQgZnJvbSBLOTUgd2hlbiBpdCBoYXMgYW4gRlRQIGNvbm5lY3Rpb24gb3BlbiBhbmQgaXQgcG9wcyB1cCB0aGUKK0xvY3VzIGRpYWxvZy4gIE1hZGUgaXQgbm90IGRvIHRoaXMgaWYgaXQga25vd3MgaXQncyBpbiB0aGUgYWN0IG9mIEVYSVRpbmcuCitja3V1c1tyeF0uYywgMjIgQXVnIDIwMDIuCisKK0luIEs5NSwgRlRQIEdFVCBpbiBBU0NJSSBtb2RlIHJlc3VsdHMgaW4gYSBmaWxlIHdpdGggVW5peCBsaW5lIHRlcm1pbmF0b3JzCitldmVuIHRob3VnaCB0aGUgcHJvdG9jb2wgaXMgY29ycmVjdDoKKworICBSRVRSIHNtanVsaWUudHh0CisgIDE1MCBPcGVuaW5nIEFTQ0lJIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciBzbWp1bGllLnR4dCAoMTg3OCBieXRlcykuCisKK1RoZSBzb3VyY2UgZmlsZSBpcyBhIHJlZ3VsYXIgVW5peCB0ZXh0IGZpbGUgd2l0aCBMRiBhdCB0aGUgZW5kIG9mIGVhY2ggbGluZS4KK0l0J3MgaW5jcmVkaWJsZSB0aGF0IG5vYm9keSBub3RpY2VkIHRoaXMgYmVmb3JlLiAgSXQgb25seSBjYW1lIHRvIGxpZ2h0IHdoZW4KK3NvbWVib2R5IHRyaWVkIHRvIG9wZW4gYSBkb3dubG9hZGVkIHRleHQgZmlsZSB3aXRoIE5vdGVwYWQsIHdoaWNoIGRvZXNuJ3QKK2hhbmRsZSBVbml4LWZvcm1hdCBmaWxlcyAoV29yZHBhZCBhbmQgRW1hY3MgaGF2ZSBubyBwcm9ibGVtcyB3aXRoIHRoZW0pLiAgVGhlCitwcm9ibGVtIHdhcyBpbiBkb2Z0cHJlY3YyKCkgaW4gdGhlIEZUVF9BU0Mgc2VjdGlvbi4gIFRoZXJlIHdhcyBubyBjb25kaXRpb25hbAorY29kZSBmb3IgVW5peCB2cyBXaW5kb3dzLiAgSW4gYWxsIGNhc2VzLCB0aGUgY29kZSBkaXNjYXJkZWQgaW5jb21pbmcgQ1IncyBpbgorQVNDSUkgbW9kZS4gIEkgcHV0IHRoZSBDUi1kaXNjYXJkaW5nIGNvZGUgaW4gI2lmZGVmIFVOSVguLiNlbmRpZi4gIGNrY2Z0cC5jLAorMjIgQXVnIDIwMDIuCisKK1JlbW92ZWQgc3VwZXItdmVyYm9zZSBkZWJ1Z2dpbmcgZnJvbSBndHdvcmQoKTogY2t1Y21kLmMsIDIzIEF1ZyAyMDAyLgorCitHcmVnb3J5IEJvbmQgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggImlmIGRlZmluZWQgXCQoQkxBSCkgLi4uIiBpbnNpZGUgb2YgYQorU1dJVENIIHN0YXRlbWVudC4gIEl0IHdhc24ndCByZWFsbHkgdGhlIFNXSVRDSCB0aGF0IHdhcyBkb2luZyBpdCwgaXQgd2FzIHRoZQorZmFjdCB0aGF0IGhlIGhhZCBlbmNsb3NlZCB0aGUgU1dJVENIIGNhc2UgaW4gYnJhY2VzLCB3aGljaCBtYWRlIGl0IGFuCisiaW1tZWRpYXRlIG1hY3JvIiAoWFhNQUNSTykuICBUaGUgWFhNQUNSTyBjb2RlIHBhcnNlZCB0aGUgbWFjcm8gZGVmaW5pdGlvbgorKHRoZSBwYXJ0IGluc2lkZSB0aGUgYnJhY2VzKSB3aXRoIGNtdHh0KC4uLix4eHN0cmluZyksIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4KK2NtdHh0KC4uLixOVUxMKSB0byBkZWZlciB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgaW50ZXJpb3Igb2YgdGhlIG1hY3JvIHVudGlsIGl0Cit3YXMgZXhlY3V0ZWQuICBUaGlzIGlzIGJldHRlciBpbGx1c3RyYXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKworICB7IGVjaG8gU1RBUlQsIGZvciBcJWkgMSAzIDEgeyBlY2hvIFwlaSB9LCBlY2hvIFNUT1AgfQorCit3aGljaCB0b3RhbGx5IGZlbGwgb24gaXRzIGZhY2UgcHJpb3IgdG8gdGhlIGZpeC4gIEFsc28gZml4ZWQgPy1oZWxwIGZvcgoraW1tZWRpYXRlIG1hY3Jvcywgd2hpY2ggd2FzIGJyb2tlbiB0b28uICBja3V1c3IuYywgMjMgQXVnIDIwMDIuCisKK1JGQzk1OSBzYXlzIFNUT1UgZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudC4gIEJ1dCBldmVyeSBGVFAgc2VydmVyIEkndmUKK2VuY291bnRlcmVkIGJ1dCBvbmUgYWNjZXB0cyB0aGUgYXJnIGFuZCBjb25zdHJ1Y3RzIHRoZSB1bmlxdWUgbmFtZSBmcm9tIGl0LAord2hpY2ggaXMgYmV0dGVyIHRoYW4gbWFraW5nIHVwIGEgdG90YWxseSByYW5kb20gbmFtZSBmb3IgdGhlIGZpbGUsIHdoaWNoIGlzCit3aGF0IFJGQzk1OSBjYWxscyBmb3IuICBFc3BlY2lhbGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gd2F5IGZvciB0aGUgY2xpZW50IHRvCitmaW5kIG91dCB0aGUgbmFtZSBjaG9zZW4gYnkgdGhlIHNlcnZlciAoYmVjYXVzZSBSRkMgOTU5IGFuZCAxMTIzIGFyZQorY29udHJhZGljdG9yeSwgcGx1cyBubyBzZXJ2ZXJzIGZvbGxvdyBlaXRoZXIgb25lIG9mIHRoZW0gZm9yIHRoaXMgYW55d2F5KS4gIFNvCit3ZSB0cnkgU1RPVSB3aXRoIHRoZSBhcmd1bWVudCBmaXJzdCwgd2hpY2ggd29ya3Mgd2l0aCBtb3N0IHNlcnZlcnMsIGFuZCBpZiBpdAorZmFpbHMsIHdlIHJldHJ5IGl0IHdpdGhvdXQgdGhlIGFyZywgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBvbmUgcGlja3kgc2VydmVyCit0aGF0IGlzIG5vdCAibGliZXJhbCBpbiB3aGF0IGl0IGFjY2VwdHMiIFVOTEVTUyB0aGUgZmlyc3QgU1RPVSBnb3QgYSA1MDIgY29kZQorKCJub3QgaW1wbGVtZW50ZWQiKSB3aGljaCBtZWFucyBTVE9VIGlzIG5vdCBhY2NlcHRlZCwgcGVyaW9kICh3aGljaCBoYXBwZW5zCit3aXRoIFByb0ZUUEQpLiAgY2tjZnRwLmMsIDI1IEF1ZyAyMDAyLgorCitBZGRlZCBTRVQgRlRQIEFOT05ZTU9VUy1QQVNTV09SRCAocGx1cyBoZWxwIHRleHQgYW5kIHNob3cgdmFsdWUpLiAgY2tjZnRwLmMsCisyNSBBdWcgMjAwMi4KKworTWFkZSBGVFAgY29tbWFuZCAibm90IGF2YWlsYWJsZSIgaWYgTk9GVFAgaXMgZGVmaW5lZC4gIGNrdXVzci5jLCAyNSBBdWcgMjAwMi4KKworRm9yY2VkIGNsaWVudCB0byBzZW5kIGEgVFlQRSBjb21tYW5kIHVwb24gaW5pdGlhbCBjb25uZWN0aW9uLCBzaW5jZSBnaXZlbgordGhlIHZhcmlhYmxlIHF1YWxpdHkgb2YgRlRQIHNlcnZlcnMsIGl0J3Mgbm90IHNhZmUgdG8gYXNzdW1lIHRoZSBzZXJ2ZXIgaXMKK2luIEFTQ0lJIG9yIGFueSBvdGhlciBwYXJ0aWN1bGFyIG1vZGUuICBja2NmdHAuYywgMjUgQXVnIDIwMDIuCisKK1NFVCBGVFAgQ0hBUkFDVEVSLVNFVC1UUkFOU0xBVElPTiBPTiBpcyBjb21wbGV0ZWx5IGJyb2tlbiBpbiBLOTUsIGFsdGhvdWdoIGl0Cit3b3JrcyBmaW5lIGluIEMtS2VybWl0LiAgRnVydGhlcm1vcmUgaXQgaXMgYnJva2VuIGluIGJvdGggdGhlIEdVSSBhbmQgQ29uc29sZQordmVyc2lvbnMsIHNvIGl0J3Mgbm90IGEgVW5pY29kZSB2cyBPRU0gY29uc29sZS1jaGFyYWN0ZXItc2V0IGlzc3VlLgorCitBZGRlZCBDb25jdXJyZW50IFBvd2VyTUFYIE9TIHRhcmdldCBmcm9tIFRvbSBIb3JzbGV5LiAgbWFrZWZpbGUsIGNrdXZlci5oLAorMjcgQXVnIDIwMDIuCisKK01pbm9yIGZpeGVzIHRvIEZUUCBtb2R1bGUgZnJvbSBKZWZmLiAgY2tjZnRwLmMsIDI3IEF1ZyAyMDAyLgorCitOZXcgTWFrZWZpbGUgdGFyZ2V0IGZvciBNYWMgT1MgWCAxMC4yLCBuZWVkcyAtRE5EU1lTRVJSTElTVCBhZGRlZCwgZnJvbQorV2lsbGlhbSBCYWRlci4gIDIgU2VwIDIwMDIuCisKK1NFVCBPUFQgRElSIC9ET1RGSUxFUyBkaWRuJ3Qgd29yayBmb3Igc2VydmVyIGxpc3RpbmdzLiAgQSBmZXcgeWVhcnMgYWdvIHdoZW4KK0kgZnJvbnQtZW5kZWQgenhwYW5kKCkgd2l0aCBuenhwYW5kKCksIEkgbWlzc2VkIGEgY291cGxlIHBsYWNlcyB3aGVyZQordHJhdmVyc2UoKSBuZWVkZWQgdG8gcmVmZXIgdG8geG1hdGNoZG90IChuenhwYW5kJ3MgYXJndW1lbnQgZmxhZykgcmF0aGVyIHRoYW4KK2dsb2JhbCBtYXRjaGRvdC4gIEZpeGVkIGluIHRyYXZlcnNlKCk6IGNrdWZpby5jLCAyIFNlcCAyMDAyLgorCitGcm9tIEplZmYsIDQgU2VwIDIwMDI6CisgLiBzZXRhdXRvZGwoeCkgLT4gc2V0YXV0b2RsKHgseSk6IGNrdXVzci5oLCBja3V1c1s3eV0uYworIC4gQWRkIGFub3RoZXIgcGFyYW1ldGVyIHRvIHBvcHVwX3JlYWRibGFoKCk6IGNrdXVzNi5jCisgLiBTb3J0IG91dCBzb21lIGNvbmZ1c2lvbiBpbiBzY2FuZmlsZSgpIHdoZXJlIGEgcGFyYW1ldGVyIHdhcyBhbHNvIHVzZWQgYXMgYQorICAgbG9jYWwgZmxhZy4gIGNrdXVzeC5jLgorIC4gUHJvdGVjdCByZXN0b3Jpbmcgb2Ygc2F2ZWQgdGVybWluYWwgaWRsZSBwYXJhbWV0ZXJzIHdpdGggYSBmbGFnIHRoYXQgc2F5cworICAgdGhleSB3ZXJlIGFjdHVhbGx5IHNhdmVkLiAgY2t1dXNyLmMuCisgLiBSZXdvcmsgdXFfdGV4dCgpIGFuZCB1cV9tdHh0KCkuICBja3V1czMuYy4KKyAuIEZpeCBGVFAgY2hhcnNldCB0cmFuc2xhdGlvbiBmb3IgbGl0dGxlLWVuZGlhbiBoYXJkd2FyZTogY2tjZnRwLmMuCisKK1RoZSBsYXR0ZXIgc3RpbGwgZG9lc24ndCB3b3JrIGluIExpbnV4OgorCisgICgvaG9tZS9mZGMva2VybWl0LykgQy1LZXJtaXQ+c2V0IGZ0cCBzZXJ2ZXItY2hhcmFjdGVyLXNldCBsYXRpbjEtaXNvCisgICgvaG9tZS9mZGMva2VybWl0LykgQy1LZXJtaXQ+c2V0IGZpbGUgY2hhcmFjdGVyLXNldCB1dGY4CisgICgvaG9tZS9mZGMva2VybWl0LykgQy1LZXJtaXQ+Z2V0IGxhdGluMS50eHQKKworUmVzdWx0cyBpbiAiPz8/Pz8/Pz86IGZpbGUgbm90IGZvdW5kIi4gIEJ1dCBpdCB3b3JrcyBmaW5lIG9uIHRoZSBTdW4uCisKK0plZmYncyBwYXRjaCByZW1vdmVkIGEgbGl0dGxlLWVuZGlhbiBieXRlLXN3YXAgKExFQlMpIGZyb20gZG9mdHBzZW5kMigpLiAgQnV0Cit0aGUgcmVhbCBwcm9ibGVtIHdhcyB0aGF0IExFQlMgd2FzIG5vdCBiZWluZyBkb25lIGNvbnNpc3RlbnRseSB0aHJvdWdob3V0IHRoZQorbW9kdWxlLiAgVGhlcmUgd2VyZSBzaW1pbGFyIHhnbmJ5dGUoKS94cG5ieXRlKCkgbG9vcHMgZWxzZXdoZXJlIGluIHRoZSBjb2RlLAorYW5kIGFsbCBvZiB0aGVtIG5lZWRlZCB0byB3b3JrIHRoZSBzYW1lIHdheS4gIFVuZG9pbmcgSmVmZidzIGZpeCBhbmQgdGhlbgorYWRkaW5nIHRoZSBMRUJTIHRvIHRoZSBsb29wIGluIGdldHJlcGx5KCkgbWFrZXMgZG93bmxvYWRzIHdvcmsgcmlnaHQsIGJ1dCB0aGUKK21lc3NhZ2VzIGFyZSBzdGlsbCBtZXNzZWQgdXAgKHRoZXkgY29tZSBvdXQgaW4gQ2hpbmVzZSA6LSkgIEJlZ2luIGJ5IG1vdmluZyBhbGwKK2J5dGUtc3dhcHBpbmcgb3BlcmF0aW9ucyB0aGF0IG9jY3VyIGluIGNrY2Z0cC5jIGl0c2VsZiBpbnRvIGEgbmV3IGZ1bmN0aW9uLAorYnl0c3dhcCgpLiAgSXQncyBlaXRoZXIgcmlnaHQgdG8gZG8gaXQgYWxsIHRoZSB0aW1lLCBvciB0byBkbyBpdCBuZXZlcjsgdGhpcword2F5IHdlIGNhbiB0dXJuIGl0IG9uIGFuZCBvZmYgaW4gb25lIHBsYWNlLgorCit4cC9nbmJ5dGUoKSBpbmNsdWRlIGJlaGF2aW9yIHRoYXQgZGVwZW5kcyBvbiB3aGF0IEtlcm1pdCBpcyBkb2luZzogV19TRU5ELAorZXRjLiAgeHBuYnl0ZSgpIHRlc3RzIFdfS0VSTUlULCB3aGljaCBpcyBhIGNvbWJpbmF0aW9uIG9mIFdfU0VORCwgV19SRUNWLCBldGMuCitEZWZpbmVkIGEgbmV3IHN5bWJvbCBXX1hGRVIsIHdoaWNoIGlzIGxpa2UgV19LRVJNSVQgYnV0IGluY2x1ZGVzIFdfRlRQLiAgVGhlc2UKK2FyZSBhbGwgdGhlICJ3aGF0cyIgaW4gd2hpY2ggY2hhcmFjdGVyIHNldHMgbWlnaHQgbmVlZCB0byBiZSBjb252ZXJ0ZWQuCitDaGFuZ2VkIHRoZSBXX0tFUk1JVCByZWZlcmVuY2UgaW4geHBuYnl0ZSgpIHRvIFdfWEZFUi4gIEZpeGVkIHRoZSBpbmRlcm1pbmF0ZQorIndoYXQiIHN0YXRlIGFmdGVyIGFuIEZUUCBjb21tYW5kIGJ5IG1vdmluZyAid2hhdCA9IFdfQ09NTUFORDsiIGZyb20gYmVmb3JlCit0aGUgbWFpbiBwYXJzZSBsb29wIHRvIGluc2lkZSBpdCAodGhpcyBkaWRuJ3QgbWF0dGVyIGJlZm9yZSB0aGUgYWRkaXRpb24gb2YKK0ZUUCBidXQgbm93IGl0IGRvZXMpLiAgY2tja2VyLmgsIGNrY2Z0cC5jLCBja3V1czUuYywgNiBTZXAgMjAwMi4KKworRmluYWxseSBJIGNoYW5nZWQgeGxhdGVjKCkgdG8gYmUgY29uc2lzdGVudCB3aXRoIGFsbCB0aGUgb3RoZXIgeGduYnl0ZSgpIC8KK3hwbmJ5dGUoKSB1c2FnZSB0aHJvdWdob3V0IHRoZSBGVFAgbW9kdWxlIGFuZCwgcG9vZiwgZXZlcnl0aGluZyB3b3JrZWQgaW4KK0xpbnV4IChhbmQgc3RpbGwgd29ya3Mgb24gdGhlIFN1bikuICBXZSBzdGlsbCBuZWVkIHNvbWUgd29yayBpbiBXaW5kb3dzICh3aGVyZQordGhlIGZpbGUgY2hhcmFjdGVyLXNldCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGNvbnNvbGUgY2hhcmFjdGVyIHNldCBmb3IKK21lc3NhZ2VzKSBidXQgd2UgY2FuIHRhY2tsZSB0aGF0IG5leHQuICBja2NmdHAuYywgNiBTZXAgMjAwMi4KKworQ2hlY2tpbmcgeWVzdGVyZGF5J3Mgd29yazoKKworS2VybWl0IGZpbGUgdHJhbnNmZXJzIHdpdGggY2hhcnNldCB0cmFuc2xhdGlvbiB3b3JrIGZpbmUgaW4gYm90aCBkaXJlY3Rpb25zLgorCitGVFAgR0VUIHdpdGggY2hhcnNldCB0cmFuc2xhdGlvbiB3b3JrcyBmaW5lIG9uIGJvdGggQkUgYW5kIExFCisKK0ZpeGVkIGEgdHlwbyBpbiB5ZXN0ZXJkYXkncyBjaGFuZ2VzIHRoYXQgbWFkZSBGVFAgUFVUIHdpdGggY2hhcnNldCB0cmFuc2xhdGlvbgorYWx3YXlzIHVwbG9hZCAwLWxlbmd0aCBmaWxlcy4gIGNrY2Z0cC5jLCA3IFNlcCAyMDAyLgorCitGVFAgUFVUIChhZnRlciB0aGUgdHlwbyB3YXMgZml4ZWQpIHdpdGggY2hhcnNldCB0cmFuc2xhdGlvbiB3b3JrcyBmaW5lIG9uIEJFLAorYnV0IG9uIExFIHRoZSBtZXNzYWdlIGNvbWVzIG91dCBpbiBDaGluZXNlIGFuZCB0aGUgcmVzdWx0aW5nIGZpbGUgZ2V0cyA/IG9yCitub3RoaW5nIGZvciBhbGwgZm9yIHRoZSBhY2NlbnRlZCBsZXR0ZXJzOgorCisgICAgICBGVFAuLi4gIEtlcm1pdCAKKyAgICAgIFVwICBEbiAgVXAgIERuICBUZXJtCisgIEJFICBPSyAgT0sgIE9LICBPSyAgIHh4CisgIExFICBubyAgT0sgIE9LICBPSyAgIHh4CisKK3h4ID0gQy1LZXJtaXQgQ09OTkVDVCBtb2RlIHdpdGggdHJhbnNsYXRpb24gZG9lc24ndCBzZWVtIHRvIGRvIGFueXRoaW5nLCBub3QKK29ubHkgaW4gdG9kYXkncyBjb2RlLCBidXQgYWxzbyBpbiB0aGUgOC4wIHJlbGVhc2UgdmVyc2lvbjogInNldCB0ZXJtIGNoYXIKK2xhdGluMSB1dGY4IiAtLSBTSE9XIENIQVIgc2hvd3MgdGhlIHJpZ2h0IHN0dWZmLCBidXQgbm8gdHJhbnNsYXRpb24gaXMgZG9uZS4KK0RpdHRvIGZvciB0aGUgNy4wIHJlbGVhc2UuICBUaGF0IGNhbid0IGJlIHJpZ2h0Li4uCisKK0J1dCBvbmUgcHJvYmxlbSBhdCBhIHRpbWUgLS0gd2hhdCdzIHdyb25nIHdpdGggTEUgRlRQIHVwbG9hZHM/ICBOb3RlIHRoYXQKK1hMQVRFIHdvcmtzIG9uIHRoZSBzYW1lIG1hY2hpbmUsIHNvIGl0J3Mgb2J2aW91c2x5IGNvbmZ1c2lvbiBpbiB4Z25ieXRlKCkKK2Fib3V0ICJ3aGF0Ii4gIFN1cHBvc2Ugd2UgbWFrZSB4Z25ieXRlKCkgQUxXQVlTIHJldHVybiBieXRlcyBpbiBCRSBvcmRlci4KK1RoaXMgbWFrZXMgc2Vuc2UgYmVjYXVzZSB4Z25ieXRlKCkgaXMgYWxtb3N0IGFsd2F5cyB1c2VkIHRvIGZlZWQgeHBuYnl0ZSgpLAorYW5kIHhwbmJ5dGUoKSByZXF1aXJlcyBpdHMgYnl0ZXMgdG8gY29tZSBpbiBCRSBvcmRlci4gIFRoaXMgbWVhbnMgdGhhdCBhbGwKK2NvZGUgdGhhdCB1c2VzIHhnbmJ5dGUoKS94cG5ieXRlKCkgbG9vcHMgY2FuIGJlIHNpbXBsaWZlZCwgd2hpY2ggSSBkaWQgZm9yCit0aGUgRlRQIG1vZHVsZS4gIGNrY2Zucy5jLCBja2NmdHAuYywgNyBTZXAgMjAwMi4KKworT2YgY291cnNlIEtlcm1pdCBwcm90b2NvbCB1c2VzIHhnbmJ5dGUoKSB0b28sIGJ1dCBvbmx5IGZvciBmaWxsaW5nCitwYWNrZXRzLCBhbmQgcGFja2V0cyBuZXZlciBjb250YWluIFVDUzIgYW5kIGV2ZW4gaWYgdGhleSBkaWQsIGl0IHdvdWxkIGhhdmUKK3RvIGJlIGJpZy1lbmRpYW4sIHNvIG5vIGNoYW5nZXMgbmVlZGVkIGZvciBnZXRwa3QoKS4gIE5vdyB3ZSBoYXZlOgorCisgICAgICBGVFAuLi4gIEtlcm1pdCAKKyAgICAgIFVwICBEbiAgVXAgIERuCisgIEJFICBPSyAgT0sgIE9LICBPSworICBMRSAgT0sgIE9LICBPSyAgT0sKKworTm93IGxldCdzIGxvb2sgYXQgdGhlIHJlbWFpbmluZyB4Z25ieXRlKCkgY2FsbHMgaW4gdGhlIHJlc3Qgb2YgdGhlIGNvZGU6CisKK2NrdXVzNC5jOgorICB4bGF0ZSgpIHVzZXMgaXQgb2YgY291cnNlLiAgSSBzaW1wbGlmaWVkIHRoZSBnZW5lcmFsLWNhc2UgbG9vcC4KKyAgV29ya3MgT0sgb24gYm90aCBTdW4gYW5kIExpbnV4LgorCitja3V1czYuYzoKKyAgdHlwZWdldGxpbmUoKSB1c2VzIGl0LiAgSSBjb21tZW50ZWQgb3V0IHRoZSBieXRlIHN3YXAuICBTZWVtcyBPSy4KKworQnVpbHQgYW5kIHRlc3RlZCBvbiBMaW51eCwgU29sYXJpcywgYW5kIFN1bk9TLiAgSSdtIHN1cmUgSSBtdXN0IGhhdmUgYnJva2VuCitzb21ldGhpbmcsIGJ1dCB0aGUgbWFpbiB0aGluZ3MgYXJlIGJldHRlciB0aGFuIHRoZXkgd2VyZS4gIEtlcm1pdCBhbmQgRlRQCit0cmFuc2ZlcnMgbmVlZCB0ZXN0aW5nIGluIEs5NSwgYXMgd2VsbCBhcyB0aGUgVFlQRSBjb21tYW5kICh0aGVyZSdzIGEgYnVuY2ggb2YKK3NwZWNpYWwgSzk1IGNvZGUgaW4gdGhlcmUpLiAgQy1LZXJtaXQgY2hhcnNldCB0cmFuc2xhdGlvbiBkdXJpbmcgQ09OTkVDVCBpcworc3RpbGwgYnJva2VuLCBvciBlbHNlIEkgZm9yZ290IGhvdyB0byB1c2UgaXQsIGJ1dCB0aGF0J3MgYSBzZXBhcmF0ZSBpc3N1ZQorc2luY2UgeGduYnl0ZSgpL3hwbmJ5dGUoKSBhcmUgbm90IGludm9sdmVkLiAgQW5kIHdlIHN0aWxsIG5lZWQgdG8gZG8gc29tZXRoaW5nCitpbiBGVFAgZ2V0cmVwbHkoKSBmb3IgSzk1IHRvIGNvbnZlcnQgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGUgY2hhcmFjdGVyIHNldCBmb3IKK2Rpc3BsYXksIHJhdGhlciB0aGFuIHRoZSBmaWxlIGNoYXJhY3RlciBzZXQgKHNob3VsZCBiZSB0cml2aWFsKS4gIEFsc28gdGhlcmUncworc3RpbGwgYSBsb3Qgb2YgZXh0cmEgZGVidWdnaW5nIGFuZCBjb21tZW50ZWQtb3V0IGp1bmsgaW4gY2tjZnRwLmMgdG8gYmUKK2NsZWFuZWQgdXAgYWZ0ZXIgbW9yZSB0ZXN0aW5nLgorCitEdXJpbmcgeWVzdGVyZGF5J3MgdGVzdGluZywgSSBub3RpY2VkIHRoYXQgUkVNT1RFIFNFVCB7IEZJTEUsIFhGRVIgfQorQ0hBUkFDVEVSLVNFVCBkaWRuJ3Qgd29yay4gIFRoZSBzZXJ2ZXIgYWNjZXB0ZWQgdGhlc2UgY29tbWFuZHMgYnV0IHRoZXkgZGlkbid0CitzZWVtIHRvIGRvIGFueXRoaW5nLiAgSW4gZmFjdCwgdGhleSBkaWQgd29yaywgYnV0IHRoZXkgd2VyZSB1bmRvbmUgbGF0ZXIgYnkKK2NvZGUgaW4gc2ZpbGUoKSB0aGF0IHJlc3RvcmVkIHRoZSBnbG9iYWwgc2V0dGluZ3MgaW4gY2FzZSB0aGV5IGhhZCBiZWVuCit0ZW1wb3JhcmlseSBvdmVycmlkZGVuIGJ5IGF1dG9zd2l0Y2hpbmcgb3Igd2hhdGV2ZXIuICBUaGUgc29sdXRpb24gaXMgdG8KKyJ1bnNhdmUiIHRoZSBzYXZlZCB2YWx1ZXMgd2hlbmV2ZXIgYSBnbG9iYWwgc2V0dGluZyBpcyBwZXJmb3JtZWQgZXhwbGljaXRseS4KK1Rlc3RlZCBzdWNjZXNzZnVsbHkgYWdhaW5zdCBTdW4gYW5kIExpbnV4IHNlcnZlcnMuICBBbHNvIHRoZSBzZXJ2ZXIgZW5kIG9mCitSRU1PVEUgU0VUIG5lZWRlZCB1cGRhdGluZyBmb3IgVW5pY29kZS4gIGNrY2ZuW3MzXS5jLCBja3V1czMuYywgOCBTZXAgMjAwMi4KKworQ2xlYW5lZCBjb21tZW50ZWQtb3V0IGNydWZ0IGFuZCBleHRyYSBkZWJ1Z2dpbmcgZnJvbSBja2NmdHAuYy4gIDggU2VwIDIwMDIuCisKK0tlcm1pdCBhdXRvZG93bmxvYWQgd2l0aCBBU0sgZmlsZSBkaWFsb2c6IGlmIHVzZXIgc3VwcGxpZWQgYW4gYWJzb2x1dGUKK3BhdGhuYW1lLCBpdCB3YXMgdHJlYXRlZCBsaWtlIGEgcmVsYXRpdmUgb25lLiAgRml4ZWQgdGhlIGludm9jYXRpb24gb2YKK3VxX2ZpbGUoKSBpbiByY3ZmaWwoKSB0byB0ZW1wb3JhcmlseSBvdmVycmlkZSB0aGUgUkVDRUlWRSBQQVRITkFNRVMgc2V0dGluZy4KK2NrY2Zucy5jLCAxMCBTZXAgMjAwMi4KKworQWRkZWQgU0VUIFRFUk1JTkFMIFJPTEwgS0VZU1RST0tFUyB7IFNFTkQsIFJFU1RPUkUtQU5ELVNFTkQsIElHTk9SRSB9LCBwYXJzZQorb25seS4gIE5lZWRzIGltcGxlbWVudGF0aW9uIChzZWFyY2ggZm9yIHR0X3JrZXlzIGFuZCByb2xsa2V5dGFiIGluIGNrdXVzNy5jKS4KK2NrdXVzci5oLCBja3V1c1syN10uYywgMTAgU2VwIDIwMDIuCisKK0lmIEZJTEUgSU5DT01QTEVURSBpcyBESVNDQVJEIGFuZCBhIGZpbGUgaXMgYmVpbmcgcmVjZWl2ZWQgYnkgSUtTRCBidXQgSUtTRAorZ2V0cyBhIFRlbG5ldCBMT0dPVVQgY29tbWFuZCwgdGhlIHBhcnRpYWwgZmlsZSBpcyBub3QgZGVsZXRlZC4gIEluIGZhY3QgdGhpcworaGFwcGVucyBhbnkgdGltZSBkb2V4aXQoKSBpcyBjYWxsZWQgZm9yIGFueSByZWFzb24gZHVyaW5nIGZpbGUgcmVjZXB0aW9uLAorZS5nLiBiZWNhdXNlIG9mIFNJR0hVUC4gIEFkZGVkIGNvZGUgdG8gZG9jbGVhbigpIHRvIGNoZWNrIGlmIGEgZG93bmxvYWQKK291dHB1dCBmaWxlIHdhcyBvcGVuLCBhbmQgaWYgc28sIHRvIGRlbGV0ZSBpdCBhZnRlciBjbG9zaW5nIGl0IGlmIGtlZXA9PTAuCitja3V1c3guYywgMTAgU2VwIDIwMDIuCisKK0FkZGVkIGEgYnJpZWYgb25lLWxpbmUgbWVzc2FnZSBhZnRlciByZW1vdGUtbW9kZSBmaWxlIHRyYW5zZmVyIHNheWluZword2hhdCAob3IgaG93IG1hbnkpIGZpbGUocykgd2VyZSB0cmFuc2ZlcnJlZCwgd2hlcmUgdGhleSB3ZW50LCBhbmQgd2hldGhlcgordGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsIC0tIGtpbmQgb2YgYW4gYXV0b21hdGljIFdIRVJFIGNvbW1hbmQsIHVzZWZ1bAord2l0aCBhdXRvZG93bmxvYWRzIHNvIHlvdSBrbm93IHdoYXQgaGFwcGVuZWQuICBja2Nwcm8udywgMTEgU2VwIDIwMDIuCisKK1RoZSBVbml4IGFuZCBWTVMgQy1LZXJtaXQgQ09OTkVDVCBtb2R1bGVzIGhhdmUgYm90Y2hlZCByZW1vdGUtY2hhcnNldCB0bworbG9jYWwtVVRGOCB0cmFuc2xhdGlvbiBldmVyIHNpbmNlIHRoZSBVbmljb2RlIHdhcyBmaXJzdCBhZGRlZCBpbiB2Ny4wLiAgRml4ZWQKK2luIGNrdWNucy5jLCBja3Vjb24uYywgY2t2Y29uLmMsIDExIFNlcCAyMDAyLgorCitPbiB0byBwYXR0ZXJuLW1hdGNoaW5nLi4uICBUaGUgbWF0Y2hkb3QgYnVzaW5lc3Mgc2hvdWxkIGFwcGx5IG9ubHkgZm9yIChVbml4KQorZmlsZW5hbWUgbWF0Y2hpbmcsIG5vdCBmb3IgZ2VuZXJhbCBzdHJpbmcgbWF0Y2hpbmcuICBGaXhlZCBpbiBja21hdGNoKCk6Citja2NsaWIuYywgMTEgU2VwIDIwMDIuCisKK0EgYmlnZ2VyIHByb2JsZW0gb2NjdXJzIGluIGZpbGVuYW1lIG1hdGNoaW5nLiAgU29tZWhvdyB0aGUgZGlyc2VwID09IGZlbmNlCitidXNpbmVzcyBpbnRlcmZlcmVzIHdpdGggbWF0Y2hpbmcge2ZvbyxiYXIsYmF6fSBzZWdtZW50cy4gIEZvciBleGFtcGxlLCBJIGhhdmUKK2EgZmlsZW5hbWUgImZvbyIgYW5kIEkgd2FudCB0byBtYXRjaCBpdCB3aXRoIHRoZSBwYXR0ZXJuICJ7Zm9vLGJhcn0iLiAgU29tZWhvdwordGhlIHNlZ21lbnQgcGF0dGVybiBiZWNvbWVzICIqL2ZvbyIgYW5kIGRvZXNuJ3QgbWF0Y2ggdGhlIHN0cmluZy4gIFdoZXJlIGRvZXMKK3RoZSAnLycgZ2V0IHRhY2tlZCBvbj8gIEkgZG9uJ3QgZXZlbiBrbm93IGhvdyB0byBleHBsYWluIHRoaXMsIGJ1dCB0aGUgc2hvcnQKK3N0b3J5IHdhcyB0aGF0IGNrbWF0Y2goKSwgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCB3b3VsZCBiYWNrIHVwIHRvIGJlZm9yZQordGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZW5hbWUgc3RyaW5nLCB3aGljaCBqdXN0IGhhcHBlbmVkIHRvIGNvbnRhaW4gYSAiLyIKKyhhbmQgYmVmb3JlIHRoYXQgYSAiLiIpIGJlY2F1c2Ugb2Ygd2hvIHdhcyBjYWxsaW5nIGl0LiAgT2J2aW91c2x5IHRoaXMgaXMgbm90Citob3cgdG8gd3JpdGUgYSBwYXR0ZXJuIG1hdGNoaW5nIGZ1bmN0aW9uLi4uICBFbnN1cmluZyB0aGF0IGl0IG5ldmVyIGJhY2tzIHVwCitiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmluZyBmaXhlZCB0aGUgaW1tZWRpYXRlIHByb2JsZW0gYW5kIGRvZXMgbm90IHNlZW0KK3RvIGhhdmUgYnJva2VuIGFueSBvdGhlciBtYXRjaGluZyBzY2VuYXJpb3MgKEkgaGF2ZSAxNTAgb2YgdGhlbSBpbiBteSB0ZXN0CitzY3JpcHQpLiAgY2tjbGliLmMsIDExIFNlcCAyMDAyLgorCitUaGVyZSdzIHN0aWxsIGEgcHJvYmxlbSB0aG91Z2guICBTdXBwb3NlIHRoZSBhIGNsaWVudCBzZW5kcyAiZGlyIHt7LiosKn19IiB0bworYSBzZXJ2ZXIuICBUaGlzIGFza3MgZm9yIGEgZGlyZWN0b3J5IGxpc3Rpbmcgb2YgYWxsIGZpbGVzIHRoYXQgYmVnaW4gd2l0aAorZG90IGFzIHdlbGwgYXMgYWxsIGZpbGVzLiAgU3RpbGwgZG9lc24ndCB3b3JrIGJlY2F1c2Ugd2UgZG9uJ3Qgbm9ybWFsbHkgc2hvdworZG90LWZpbGVzLCBidXQgaW4gdGhpcyBjYXNlIGl0IFNIT1VMRCB3b3JrIGJlY2F1c2UgIi4qIiB3YXMgZXhwbGljaXRseQorcmVxdWVzdGVkLiAgU3RhcmluZyBhdCB0aGUgY2ttYXRjaCgpIGNvZGUgcmV2ZWFsZWQgaG93IHRvIGZpeCB0aGlzLCBhbmQgSSBkaWQsCitidXQgdGhhdCB3YXMgb25seSBoYWxmIHRoZSBwcm9ibGVtLiAgVGhlIG90aGVyIGhhbGYgd2FzIHRoYXQgdGhlIGxpc3Qgb2YKK2ZpbGVzIGJlaW5nIGZlZCB0byBja21hdGNoKCkgZGlkIG5vdCBpbmNsdWRlIHRoZSBkb3RmaWxlcyBpbiB0aGUgZmlyc3QgcGxhY2UuCitUaGUgY3VyZSBoZXJlIGlzIHRvIGNoYW5nZSBuenhwYW5kKCkgdG8gcHJlc2NhbiB0aGUgcGF0dGVybiB0byBzZWUgaWYgaXQKK2luY2x1ZGVzIGEgbGVhZGluZyBkb3QsIGFuZCBpZiBzbyB0byBzZXQgdGhlICJ4bWF0Y2hkb3QiIGZsYWcgaXRzZWxmLCBldmVuCitpZiBpdCB3YXNuJ3Qgc2V0IGJ5IHRoZSBjYWxsZXIuICBja2NsaWIuYywgY2t1ZmlvLmMsIDExIFNlcCAyMDAyLgorCitOb3cgdGhhdCB7Zm9vLGJhciwuLi59IHBhdHRlcm5zIHdvcmsgYmV0dGVyLCBJIGFkZGVkIGEgcXVpY2sgaGFjayB0byB0aGUKK0RJUkVDVE9SWSBjb21tYW5kIHRvIGFsbG93IG11bHRpcGxlIGZpbGVzcGVjcyB0byBiZSBnaXZlbiwgaW4gd2hpY2ggY2FzZSB3ZQorY29tYmluZSB0aGVtIGludG8gYSB7ZmlsZTEsZmlsZTIsLi4ufSBwYXR0ZXJuIGJlZm9yZSBjYWxsaW5nIG56eHBhbmQoKS4gIFdvcmtzCitmaW5lIGJ1dCBpdCdzIGEgaGFjayBiZWNhdXNlIHlvdSBkb24ndCBnZXQgZmlsZSBsaXN0cyB1cG9uICI/IiBpbiB0aGUgc2Vjb25kCithbmQgc3Vic2VxdWVudCBmaWxlc3BlYyBmaWVsZHMsIGJ1dCBJIGRvdWJ0IGFueW9uZSB3aWxsIG5vdGljZS4gIFNvIG5vdywKK2ZpbmFsbHksIHBlb3BsZSBjYW4gZG8gImRpciAuKiAqIiBsaWtlIHRoZXkgZG8gaW4gVW5peCAoZXhjZXB0IHdpdGggbHMpIHRvIGdldAorYSBsaXN0aW5nIG9mIGFsbCBmaWxlcyBpbiBhIGRpcmVjdG9yeSB3aXRob3V0IGhhdmluZyB0byBrbm93IGFib3V0IG9yIHVzZSB0aGUKKy9ET1RGSUxFUyBzd2l0Y2guICBUaGlzIHdhcyBOT1QgZG9uZSBmb3IgdGhlIHNlcnZlciBlbmQgb2YgUkRJUiBiZWNhdXNlIG9mCithbWJpZ3VpdHkgb2Ygc3BhY2VzIGFzIHNlcGFyYXRvcnMgdmVyc3VzIGZpbGVuYW1lIGNoYXJhY3RlcnMuKSAgZG9teWRpcigpOgorY2t1dXM2LmMsIGNrdXVzW3IyXS5jLCAxMSBTZXAgMjAwMi4KKworQWRkZWQgYSBDT05USU5VRSBjb21tYW5kLiAgSW4gYSBzY3JpcHQsIHRoaXMgZG9lcyB3aGF0ZXZlciBDT05USU5VRSBkaWQgYmVmb3JlCisoZS5nLiBpbiBhIEZPUiBvciBXSElMRSBsb29wKS4gIEF0IHRoZSBwcm9tcHQsIGl0IGNhbGxzIHBvcGNsdmwoKSwgd2hpY2ggZ2l2ZXMKK2EgbW9yZSBuYXR1cmFsIHdheSB0byBjb250aW51ZSBhIHNjcmlwdCB0aGF0IGhhcyAic2hlbGxlZCBvdXQiIHRvIHRoZSBwcm9tcHQuCitja3V1c3IuW2NoXSwgMTEgU2VwIDIwMDIuCisKK0FkZGVkIGhlbHAgdGV4dCBmb3IgQ09OVElOVUUuICBja3V1czIuYywgMTIgU2VwIDIwMDIuCisKK0Zyb20gSmVmZiwgMTYgU2VwIDIwMDI6CisgLiBTRVQgVEVSTSBST0xMIEtFWVNUUk9LRVMgZm9yIEs5NTogY2t1dXNyLmgsIGNrdXVzNy5jCisgLiBSZW1vdmUgdGhlIGRvZXhpdCgpIGNhbGwgZnJvbSB0aGUgVGVsbmV0IFRFTE9QVF9MT0dPVVQgaGFuZGxlcjogY2tjdGVsLmMKKworRml4ZWQgYW4gRlRQIGRlYnVnIG1lc3NhZ2UgdG8gYmUgY29uc2lzdGVudCB3aXRoIEtlcm1pdCBvbmVzLgorY2tjZnRwLmMsIDE2IFNlcCAyMDAyLgorCitBZGRlZCBTRVQvU0hPVyBUUkFOU0ZFUiBSRVBPUlQgdG8gdHVybiB0aGUgcG9zdC10cmFuc2ZlciByZXBvcnQgb2ZmIGFuZCBvbi4KK2NrdXVzci5oLCBja3V1c1syMzRdLmMsIDE2IFNlcCAyMDAyLgorCitGaXhlZCBTb2xhcmlzIChhbmQgbWF5YmUgc29tZSBvdGhlciBTVk9SUE9TSVggYnVpbGRzKSB0byBmaW5kIG91dCB0aGVpciBmdWxsCitob3N0bmFtZSByYXRoZXIgdGhhbiBqdXN0IHNob3J0IGZvcm0gKGUuZy4gd2F0c29sLmNjLmNvbHVtYmlhLmVkdSByYXRoZXIgdGhhbgoranVzdCB3YXRzb2wpLiAgY2tob3N0KCk6IGNrdXVzeC5jLCAxNiBTZXAgMjAwMi4KKworImNhdCBzb21lZmlsZSB8IGtlcm1pdCAtVHMgLSIgaXMgc3VwcG9zZWQgdG8gc2VuZCBzdGRpbiBpbiB0ZXh0IG1vZGUsIGJ1dAorSzk1J3MgZmlsZSB0cmFuc2ZlciBkaXNwbGF5IHJlcG9ydHMgQklOQVJZLiAgTG9va2VkIGF0IEMtS2VybWl0IGNvZGU7IGl0IHNlZW1zCitmaW5lLiAgTG9va2VkIGF0IHBhY2tldCBhbmQgZGVidWcgbG9nczsgQy1LZXJtaXQgd2FzIGluZGVlZCBzZW5kaW5nIGluIHRleHQKK21vZGUgYW5kIGFubm91bmNpbmcgaXQgY29ycmVjdGx5LiAgSzk1IGdhdHRyKCkgaXMgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nOgorCisgIGdhdHRyIGZpbGUgdHlwZVtBTUpdPTMKKyAgZ2F0dHIgYXR0cmlidXRlIEE9dGV4dD0wCisgIGdhdHRyIHNldHMgdGNoYXJzZXQgVENfVFJBTlNQW0FdCisKK1NhbWUgdGhpbmcgaGFwcGVucyB3aGVuIEMtS2VybWl0IGlzIHJlY2VpdmluZy4gIFlldCB3aGVuIEkgc2VuZCBhbiBhY3R1YWwKK2ZpbGUsIHJhdGhlciB0aGFuIHN0ZGluLCBpdCdzIHJlY2VpdmVkIGluIHRleHQgbW9kZS4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMKK3RoYXQgc3RkaW4gZG9lcyBub3QgaGF2ZSBhIExlbmd0aCBhdHRyaWJ1dGUgaW4gaXRzIEEtcGFja2V0LCBzbyBpbiB0aGlzIGNhc2UKK3RoZSByZWNlaXZlciBza2lwcyBhbnkgY2FsbHMgdG8gc2NyZWVuKCkgdGhhdCBzaG93IHRoZSBsZW5ndGggb3IgcGVyY2VudCBkb25lLgorQWhhLCBzbyBtYXliZSBpdCdzIGp1c3QgYSBkaXNwbGF5IHByb2JsZW0gLS0gc2NyZnQoKSBpcyBub3QgYmVpbmcgY2FsbGVkIHRvCityZXBhaW50IHRoZSBmaWxlIHR5cGUgaWYgdGhlIHNpemUgd2FzIG5vdCBrbm93bi4gIEZpeGVkIGluIG9wZW5hKCkgYnkKK3JlbW92aW5nIHRoZSBJRiBjbGF1c2UgZnJvbSAiaWYgKGZzaXplID4gLTFMKSB4eHNjcmVlbihTQ1JfRlMsMCxmc2l6ZSwiIik7Ii4KK2NrY2ZuMy5jLCAxOCBTZXAgMjAwMi4KKworSzk1IHVzZXIgaGFzIGEgbGlzdGZpbGUgY29udGFpbmluZyBzb21lIHJlZ3VsYXIgZmlsZW5hbWVzIGFuZCB0aGVuIHNvbWUKK2ZpbGVuYW1lcyB0aGF0IGluY2x1ZGUgcGF0aHMgYW5kIGhhcyBhbGwga2luZHMgb2YgcHJvYmxlbXMgd2l0aCBNR0VUIC9MSVNURklMRQorKHBpZWNlcyBvZiBkaWZmZXJlbnQgbmFtZXMgY29uY2F0ZW5hdGVkIHRvIGVhY2ggb3RoZXIsIGV0YykuICBTZXR0aW5nIHVwIHRoZQorc2FtZSBzY2VuYXJpbyBoZXJlLCBJIGRvbid0IHNlZSB0aGUgc2FtZSBwcm9ibGVtcyBidXQgSSBkbyBzZWUgIlJlZnVzZWQ6IE5hbWUiCit3aGVuIHdlIGdvIHRvIGdldCBhIHBhdGgvbmFtZSBmaWxlLiAgVGhpcyBoYXBwZW5zIGJlY2F1c2UgKGEpIHdlIGhhZCBhbHJlYWR5Citnb3QgYSB0b3AtbGV2ZWwgZmlsZSB3aXRoIGEgY2VydGFpbiBuYW1lLCAoYikgYSBmaWxlIGluIGEgc3ViZGlyZWN0b3J5IGhhcyB0aGUKK3NhbWUgbmFtZSwgKGMpIHdlIGFyZSBzdHJpcHBpbmcgdGhlIHBhdGggYmVmb3JlIGNhbGxpbmcgemNoa2koKSwgYW5kIChkKQorRlRQIENPTExJU0lPTiBpcyBzZXQgdG8gRElTQ0FSRC4gIEhvdyBkbyB3ZSBtYWtlIEZUUCBub3Qgc3RyaXAgdGhlIHBhdGg/CisKK1RoaXMgaXMgYW4gaW50ZXJlc3RpbmcgcXVlc3Rpb24uLi4gIFRoZSBhbnN3ZXIgZGVwZW5kcyBvbiB3aGVyZSB0aGUgdXNlcgord2FudHMgdGhlIGZpbGUgdG8gZ28uICBOb3JtYWxseSBpZiB5b3UgdGVsbCBhbiBGVFAgY2xpZW50IHRvICJnZXQgZm9vL2JhciIsCit5b3Ugd2FudCB0aGUgZmlsZSAiYmFyIiB0byBiZSBkb3dubG9hZGVkIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworQW55d2F5LCBpdCB0dXJucyBvdXQgdGhlIEZUUCBtb2R1bGUgdXNlcyBwYXRocyBsb2NhbGx5IGR1cmluZyBNR0VUIG9ubHkgaWYKKy9SRUNVUlNJVkUgd2FzIHNwZWNpZmllZC4gIFNvOgorCisgIG1nZXQgL2xpc3RmaWxlOmJsYWggL3JlY3Vyc2l2ZQorCitzaG91bGQgaGF2ZSBtYWRlIHRoaXMgd29yaywgYnV0IGl0IGRpZG4ndCBiZWNhdXNlIGluIHRoZSAvTElTVEZJTEUgY2FzZSwKK3dlIGhhdmUgZWZmZWN0aXZlbHkgdHVybmVkIGFuIE1HRVQgaW50byBhIHNlcmllcyBvZiBHRVRzLCB3aGVyZSB0aGUgY29kZSB0bworY2hlY2sgd2hldGhlciB0byBzdHJpcCB0aGUgcGF0aCBkaWRuJ3QgY2hlY2sgdGhlIHJlY3Vyc2l2ZSBmbGFnIGJlY2F1c2UgaG93Citjb3VsZCBhIEdFVCAoYXMgb3Bwb3NlZCB0byBhbiBNR0VUKSBiZSByZWN1cnNpdmU/ICBBZGRpbmcgdGhpcyBleGNlcHRpb24gdG8KK3RoZSBpZi1jb25kaXRpb24gZ290IHVzIGEgYml0IGZhcnRoZXIgYnV0IG5vdyB3aGVuIHdlIHRyeSB0byBvcGVuIHRoZSBvdXRwdXQKK2ZpbGUgaW4gZG9mdHByZWN2MigpLCB6b3Blbm8oKSBmYWlscyBiZWNhdXNlIHRoZSBuYW1lIGNvbnRhaW5zIGEgZGlyc2VwLgorV2UgaGF2ZSB0byBjYWxsIHpta2RpcigpIGZpcnN0IGJ1dCB0aGF0IHdhc24ndCBoYXBwZW5pbmcgYmVjYXVzZSBzb21lIG90aGVyCitmbGFnIHdhc24ndCBzZXQgcmlnaHQgaW4gdGhpcyBjYXNlLiAgRmluYWxseSB6bWtkaXIgd2FzIGNhbGxlZCwgYnV0IHdpdGgKK3RoZSB3cm9uZyBzdHJpbmcuICBBZnRlciBmaXhpbmcgdGhhdCwgaXQgd29ya3MuICBOb3cgd2Ugc2hvdWxkIGJlIGFibGUKK3RvIHVzZSAvUkVDVVJTSVZFIHRvIGZvcmNlIHRoZSBwYXRobmFtZSB0byBiZSB1c2VkIG9uIHRoZSBsb2NhbCBlbmQuCitja2NmdHAuYywgMTkgU2VwIDIwMDIuCisKK0NoZWNrZWQgRlRQIGZpbGVuYW1lIGNvbnZlcnNpb24gaXNzdWVzLiAgRlRQIEZJTEVOQU1FUyBBVVRPIGlzIHN1cHBvc2VkIHRvCittZWFuIExJVEVSQUwgaWYgIndlYXJlYWxpa2UiIE9SIHNlcnZlciBpcyBVTklYIG9yIFdpbmRvd3MsIG90aGVyd2lzZQorQ09OVkVSVEVELCBidXQgdGhlcmUgd2VyZSBwbGFjZXMgd2hlcmUgdGhpcyBydWxlIHdhcyBub3QgYXBwbGllZCBjb25zaXN0ZW50bHksCitmaXhlZCBub3cuICBja2NmdHAuYywgMjEgU2VwIDIwMDIuCisKK0FkZGVkIFNFVCBGVFAgRElTUExBWSwgd2hpY2ggaXMgbGlrZSBTRVQgVFJBTlNGRVIgRElTUExBWSBidXQgYXBwbGllcyBvbmx5IHRvCitGVFAsIG1haW5seSBiZWNhdXNlIEkgdGVuZGVkIHRvIHR5cGUgaXQgYWxsIHRoZSB0aW1lLiAgTm93IGlmIHlvdSBoYXZlIGR1YWwKK3Nlc3Npb25zLCBlYWNoIHNlc3Npb24gY2FuIGhhdmUgaXRzIG93biB0cmFuc2ZlciBkaXNwbGF5IHN0eWxlLiAgY2tjZnRwLmMsCitja3V1c3IuaCwgY2t1dXNbMzQ3XS5jLCAyMSBTZXAgMjAwMi4KKworQmFjayB0byBGVFAgTUxTRC4gIFdlJ3JlIHN1cHBvc2VkIHRvIG1hdGNoIHRoZSBwYXR0ZXJuIGxvY2FsbHksIG5vdCByZWx5IG9uCit0aGUgc2VydmVyIHRvIGZpbHRlciBpdHMgbGlzdCBhY2NvcmRpbmcgdG8gdGhlIGNsaWVudCdzIHBhdHRlcm4uICBUaHVzIHdlIG11c3QKK2Fsc28gYWxsb3cgYW4gZW1wdHkgYXJndW1lbnQgdG8gTUdFVCBhbmQgbXVzdCBub3Qgc2VuZCBhIGZpbGVzcGVjIHdpdGggTUxTRC4KK0FjdHVhbGx5IHRoaXMgaXMgdHJpY2t5IC0tIGhvdyBpcyB0aGUgY2xpZW50IHN1cHBvc2VkIHRvIGtub3cgd2hldGhlciB0byBzZW5kCithIGZpbGVzcGVjLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSB1c2VyJ3MgY29tbWFuZCBpcyAibWdldCBmb28qYmFyIiwgYW5kIHRoZQorc2VydmVyIHN1cHBvcnRzIE1MU0QsIHRoZW4gd2hhdCBzaG91bGQgdGhlIGNsaWVudCBkbz8gIFRoZSBjbGllbnQgZG9lcyBub3QKK2tub3cgdGhlIHdpbGRjYXJkIHN5bnRheCBvbiB0aGUgc2VydmVyLCBzbyBmb3IgYWxsIHRoZSBjbGllbnQga25vd3MsIHRoaXMKK21pZ2h0IGJlIGEgdmFsaWQgZGlyZWN0b3J5IG5hbWUsIGluIHdoaWNoIGNhc2UgaXQgc2hvdWxkIGJlIHNlbnQuICBPbiB0aGUKK290aGVyIGhhbmQsIHRoZSB1c2VyIG1pZ2h0IGludGVuZCBpdCBhcyBhIHdpbGRjYXJkLCBpbiB3aGljaCBjYXNlIGl0IHNob3VsZAorTk9UIGJlIHNlbnQuICBCdXQgdGhlIEZUUCBjbGllbnQgY2FuJ3QgcmVhZCB0aGUgdXNlcidzIG1pbmQuICBUaGlzIGlzIGFub3RoZXIKK3NlcmlvdXMgZmxhdyBpbiB0aGUgRWx6L0hldGhtb24gZHJhZnQuICBBbnl3YXksIEkgZ290IHRoZSBsb2NhbCBtYXRjaGluZworYnVzaW5lc3Mgd29ya2luZyBmb3IgTUxTRCBhcyBsb25nIGFzIHRoZSB1c2VyJ3MgTUdFVCBhcmcgaXMgcmVhbGx5IGEgcGF0dGVybgorYW5kIG5vdCBhIGRpcmVjdG9yeSBuYW1lLiAgVG8gYmUgY29udGludWVkLi4uICBja2NmdHAuYywgMjEgU2VwIDIwMDIuCisKK0FkZGVkIEZUUCB7IEVOQUJMRSwgRElTQUJMRSB9IHsgRkVBVCwgTUxTVCB9LiAgSWYgd2UgYWx3YXlzIHNlbmQgRkVBVCwgd2UKK3VzdWFsbHkgZ2V0IGEgY29tcGxhaW50LiAgSWYgd2Ugc2VuZCBGRUFUIGFuZCBNTFNUIGlzIG5lZ290aWF0ZWQsIHRoZXJlIGlzIGEKK2dvb2QgY2hhbmNlIGl0IGlzIG1pc2ltcGxlbWVudGVkIG9yIHdpbGwgaGF2ZSB1bmRlc2lyYWJsZSBzaWRlIGVmZmVjdHMsIHN1Y2gKK2FzIHNlbmRpbmcgaHVnZSBmaWxlIGxpc3RzLiAgTk9URTogL05PSU5JVCBvbiB0aGUgRlRQIE9QRU4gY29tbWFuZCBhbHNvCitkaXNhYmxlcyBib3RoIG9mIHRoZXNlLiAgY2tjZnRwLmMsIDIyIFNlcCAyMDAyLgorCitGaXhlZCBta3N0ZW1wKCkgY29kZSBpbiBGVFAgcmVtb3RlX2ZpbGVzKCkuICBta3RlbXAoKSBkb2VzIG5vdCBvcGVuIHRoZSBmaWxlLAorbWtzdGVtcCgpIGRvZXMgb3BlbiBpdDsgcHJldmlvdXNseSB3ZSBoYWQgYmVlbiBvcGVuaW5nIGl0IGFnYWluIGFuZCBuZXZlcgorY2xvc2luZyB0aGUgZmlyc3QgaW5zdGFuY2Ugc28gZXZlcnkgTUdFVCB3b3VsZCBjcmVhdGUgYW5vdGhlciBvcGVuIGZpbGUKK2Rlc2NyaXB0b3IuICBja2NmdHAuYywgMjIgU2VwIDIwMDIuCisKK0FkZGVkIGRlYnVnIG1lc3NhZ2VzIGZvciB0ZW1wLWZpbGUgY3JlYXRpb24gYW5kIGxpbmVzIHJlYWQgZnJvbSB0aGUgdGVtcCBmaWxlLgorY2tjZnRwLmMsIDIyIFNlcCAyMDAyLgorCitFbGltaW5hdGVkIHNlbmRpbmcgb2Ygc29tZSBleHRyYW5lb3VzIFRZUEUgY29tbWFuZHMsIGJ1dCB0aGVyZSdzIHN0aWxsIHJvb20KK2ZvciBpbXByb3ZlbWVudC4gIGNrY2Z0cC5jLCAyMiBTZXAgMjAwMi4KKworTW92ZWQgZGVmaW5pdGlvbiBvZiBidWlsZCBkYXRlIHRvIHRvcCBvZiBja2NtYWkuYy4gIDIyIFNlcCAyMDAyLgorCitBZGRlZCByZWN1cnNpb24gdG8gTUdFVCB3aXRoIE1MU0QuLi4gIEl0J3MgYWxsIGRvbmUgaW4gcmVtb3RlX2ZpbGVzKCkuCitUZW1wLWZpbGUgcG9pbnRlcnMgYXJlIG9uIGEgc3RhY2sgKG1heCBzaXplIDEyOCkuICBXaGVuIHBhcnNpbmcgTUxTRCBsaW5lcworZnJvbSB0aGUgdGVtcCBmaWxlIGFuZCB3ZSBzZWUgInR5cGU9ZGlyIiwgd2UgY3JlYXRlIHRoZSBsb2NhbCBkaXJlY3RvcnkgYnkKK2NhbGxpbmcgem1rZGlyKCksIGNoYW5nZSB0byB0aGUgcmVtb3RlIGJ5IHNlbmRpbmcgQ1dELCBpbmNyZW1lbnQgdGhlIGRlcHRoLAorYW5kIGNhbGwgb3Vyc2VsdmVzLiAgV2hlbiByZWFkaW5nIGZyb20gYSB0ZW1wIGZpbGUsIHVwb24gRU9GIHdlIGNsb3NlIGFuZAorZGlzcG9zZSBvZiB0aGUgdGVtcCBmaWxlLCByZXR1cm4gLTMgaWYgY3VycmVudGx5IGF0IHRvcCBsZXZlbCwgb3RoZXJ3aXNlIHdlCitmcmVlIHRoZSB0bXBmaWxlIG5hbWUsIGRlY3JlbWVudCB0aGUgZGVwdGgsIHNlbmQgQ0RVUCB0byB0aGUgc2VydmVyLCAiY2QgLi4iCitsb2NhbGx5LCBhbmQgZ28gYmFjayBhbmQgcmVhZCB0aGUgbmV4dCBsaW5lIGZyb20gdGhlIHByZXZpb3VzIGJ1dCBub3cgY3VycmVudAordGVtcCBmaWxlLiAgQ29uY2VwdHVhbGx5IHNpbXBsZSBidXQgbmVlZGVkIGhvdXJzIG9mIGRlYnVnZ2luZyAtLSB3aGF0IG11c3QKK2JlIHN0YXRpYywgd2hhdCBtdXN0IGJlIG9uIHRoZSBzdGFjay4uLiAgU2VlbXMgT0sgbm93IGJ1dCBzdGlsbCBuZWVkcyBzb21lCitoZWF2eSB0ZXN0aW5nLiAgY2tjZnRwLmMsIDIyIFNlcCAyMDAyLgorCitBZGRlZCBGVFAgeyBFTkFCTEUsIERJU0FCTEUgfSB7IFNJWkUsIE1EVE0gfSBhbmQgYWRkIGhlbHAgdGV4dCBmb3IgRlRQCitFTkFCTEUgYW5kIERJU0FCTEUuICBja2NmdHAuYywgMjMgU2VwIDIwMDIuCisKK0Rvbid0IGFsbG93IHJlc3RhcnQgaWYgU0laRSBkaXNhYmxlZC4gIGNrY2Z0cC5jLCAyMyBTZXAgMjAwMi4KKworTWFrZSBzdXJlIGFsbCBpbXBsaWNpdCBTSVpFIGNvbW1hbmRzIGFyZSBzdXJwcmVzc2VkIGlmIFNJWkUgZGlzYWJsZWQuCitja2NmdHAuYywgMjMgU2VwIDIwMDIuCisKK0lmIGFuIGV4cGxpY2l0IEZUUCBNT0RUSU1FIGNvbW1hbmQgaXMgc2VudCB3aGVuIE1EVE0gaXMgRElTQUJMRUQsIGFuZCBpdAorc3VjY2VlZHMsIHJlLUVOQUJMRSBNRFRNLiAgRGl0dG8gZm9yIFNJWkUuICBja2NmdHAuYywgMjMgU2VwIDIwMDIuCisKK0lmIGFuIGV4cGxpY2l0IEZUUCBGRUFUVVJFUyBjb21tYW5kIGlzIHNlbnQgZHVyaW5nIGFuIEZUUCBzZXNzaW9uLCByZWRvIHRoZQorZmVhdHVyZXMgZGF0YWJhc2UgZnJvbSBpdC4gIGNrY2Z0cC5jLCAyMyBTZXAgMjAwMi4KKworQWZ0ZXIgZnVydGhlciBkaXNjdXNzaW9uIHdpdGggUm9iZXJ0IEVseiwgSSByZWFsaXplZCBJIGhhZCB0byBleHBvc2UgdGhlCit1bmRlcmx5aW5nIE1HRVQgbWVjaGFuaXNtcyB0byB0aGUgdXNlcjsgdGhlIGRyYWZ0IGlzbid0IGdvaW5nIHRvIGNoYW5nZSwgYW5kCit0aGUgbmV3IHNwZWMgd2lsbCByZXN1bHQgaW4gdW5kZXNpcmFibGUgZWZmZWN0cyBpZiB0aGUgY2xpZW50IHRyaWVzIHRvICJkbyB0aGUKK3JpZ2h0IHRoaW5nIiBieSBtYWdpYyBpbiBhbGwgc2l0dWF0aW9uczsgdGh1cyB0aGUgdXNlciBtdXN0IGhhdmUgc29tZSBuZXcKK2NvbnRyb2xzOgorCisgIE1HRVQgWyAvTUxTVCwgL05MU1QsIC9NQVRDSDp4eHggXSBbIGZpbGVzcGVjIFsgZmlsZXNwZWMgWyAuLi4gXSBdIF0KKworVGhlc2Ugc3dpdGNoZXMgbGV0IHRoZSB1c2VyIGZvcmNlIHRoZSB1c2Ugb2YgTUxTRCBvciBOTFNUIHdoZW4gdGhlcmUncyBhCitjaG9pY2UsIGFuZCB0byBmb3JjZSBsb2NhbCB1c2Ugb2YgYSBwYXR0ZXJuIHJhdGhlciB0aGFuIHNlbmRpbmcgaXQgdG8gdGhlCitzZXJ2ZXIsIGFuZCBldmVuIHRvIHNlbmQgYSBkaXJlY3RvcnkgbmFtZSB0byB0aGUgc2VydmVyIGF0IHRoZSBzYW1lIHRpbWUgYXMKK3NwZWNpZnlpbmcgYSBwYXR0ZXJuIGZvciBsb2NhbCBtYXRjaGluZywgYW5kIG9mIGNvdXJzZSBieSBkZWZhdWx0IHdlIHRyeSB0byBkbwordGhlIHJpZ2h0IHRoaW5nIGluIGFsbCBzY2VuYXJpb3MuICBTeW1ib2xzIG9ubHk7IG5vdCBjb2RlZCB5ZXQuICBja3V1c3IuaCwKKzIzIFNlcCAyMDAyLgorCitBZGRlZCB0aGUgdGhyZWUgbmV3IHN3aXRjaGVzIHRvIE1HRVQsIHBsdXMgL01MU1QgaXMgYW4gaW52aXNpYmxlIHN5bm9ueW0gZm9yCisvTUxTRC4gIElmIC9OTFNUIG9yIC9NTFNEIGlzIGdpdmVuIGl0LCBpdCBmb3JjZXMgdGhlIGNvcnJlc3BvbmRpbmcgRlRQIHByb3RvY29sCitkaXJlY3RpdmUuICBja2NmdHAuYywgMjUgU2VwIDIwMDIuCisKK05vdyBmb3IgdGhlIHRyaWNreSBwYXJ0OiBub3cgd2UgaGF2ZSB0d28gc2VwYXJhdGUgY29uY2VwdHMgZm9yIHdoYXQgdG8gc2VuZCB0bwordGhlIHNlcnZlcjogYSBmaWxlbmFtZSBvciB3aWxkY2FyZCB0byBiZSBpbnRlcnByZXRlZCBieSB0aGUgc2VydmVyIChOTFNUIG9ubHkpCitvciBhIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGdldCBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyAoTkxTVCBvciBNTFNEKSwKK3Bvc3NpYmx5IHRvZ2V0aGVyIHdpdGggYSBwYXR0ZXJuIHRvIGJlIHVzZWQgYnkgdGhlIGNsaWVudCB0byBtYXRjaCBmaWxlbmFtZXMKK3JldHVybmVkIGJ5IHRoZSBzZXJ2ZXIuICBUaGlzIHJlcXVpcmVkIGdpdmluZyByZW1vdGVfZmlsZXMoKSBhbiBhZGRpdGlvbmFsCithcmd1bWVudC4gIE5vdyBpdCB1c2VzICJwYXR0ZXJuIiAoaWYgYW55KSBzdHJpY3RseSBmb3IgbG9jYWwgcGF0dGVybiBtYXRjaGluZworKGJlY2F1c2Ugbm93IGl0IGlzIHRoZSAvTUFUQ0g6IHN3aXRjaCBhcmd1bWVudCwgbm90IHRoZSBNR0VUIGZpbGVzcGVjKSwgYW5kCisiYXJnIiAodGhlIE1HRVQgZmlsZXNwZWMpIGlzIHdoYXQgaXQgc2VuZHMgdG8gdGhlIHNlcnZlciwgbWF5YmUgKHNlZSB0aGUKK2NvbW1lbnRzIGluIHRoZSBjb2RlIGZvciB0aGUgYWN0dWFsIGRldGFpbHMpOyBlaXRoZXIgb3IgYm90aCB0aGVzZSBjYW4gYmUKK251bGwuICBja2NmdHAuYywgMjUgU2VwIDIwMDIuCisKK0Rpc2NvdmVyZWQgdGhhdCAibWdldCBmb28iLCB3aGVyZSBmb28gaXMgYSBkaXJlY3RvcnkgbmFtZSwgbmV2ZXIgd29ya2VkLgorRml4ZWQgaW4gcmVtb3RlX2ZpbGVzKCk6IGNrY2Z0cC5jLCAyNSBTZXAgMjAwMi4KKworR29pbmcgdGhyb3VnaCBldmVyeSBjb21iaW5hdGlvbiBvZiBOTFNULCBNTFNELCAvTUFUQ0g6LCBhbmQgTUdFVCBhcmcgYW5kCitkZWJ1Z2dpbmcgZWFjaCBjYXNlIHVudGlsIE9LLi4uICBUaGVuIGFsc28gd2l0aCB0aGUgcGFuaXguY29tIE5ldEJTRCBzZXJ2ZXIKKyhsdWtlbWZ0cGQgMS4wKSB3aGljaCBhbHNvIHN1cHBvcnRzIE1MU0QuLi4uICAxMSB0ZXN0IGNhc2VzIGFsbCBkZWJ1Z2dlZCBhbmQKK3Rlc3RlZCBPSy4gIGNrY2Z0cC5jLCAyNiBTZXAgMjAwMi4KKworQWRkZWQgL05PRE9URklMRVMgc3dpdGNoIHRvIEZUUCBNR0VULCB0byBjb250cm9sIHdoYXQgaGFwcGVucyB3aXRoIGRvdC1maWxlcworaWYgdGhlIHNlcnZlciBpbmNsdWRlcyB0aGVpciBuYW1lcyBpbiB0aGUgbGlzdCAoYXMgbHVrZW1mdHBkIGRvZXMpLiAgVGhlcmUncworbm8gcG9pbnQgaW4gYWRkaW5nIGEgL0RPVEZJTEVTIHN3aXRjaCBiZWNhdXNlIHdoYXQgY291bGQgaXQgcG9zc2libHkgZG8/Citja2NmdHAuYywgMjYgU2VwIDIwMDIuCisKK0NoYW5nZWQgYSBidW5jaCBvZiAic2tpcHRoaXMrKyIgdG8gImNvbnRpbnVlIiBpbiBkb2Z0cGdldCgpLCB0byBhdm9pZAorZXJyb3IgbWVzc2FnZXMgd2hlbiBza2lwcGluZyBmaWxlcyB0aGF0IHVzZXIgc2FpZCBzaGUgd2FudGVkIHRvIHNraXAuCitja2NmdHAuYywgMjYgU2VwIDIwMDIuCisKK0FkZGVkIGhlbHAgdGV4dCBmb3IgdGhlIG5ldyBNR0VUIHN3aXRjaGVzLiAgY2tjZnRwLmMsIDI2IFNlcCAyMDAyLgorCitEb24ndCBzd2l0Y2ggTE9DVVMgd2hlbiBtYWtpbmcgYW4gRlRQIGNvbm5lY3Rpb24gdW50aWwgbG9nZ2VkIGluLgorY2tjZnRwLmMsIDI2IFNlcCAyMDAyLgorCitGaXhlZCBMRElSIHRvIHJ1biBLZXJtaXQncyBidWlsdC1pbiBESVJFQ1RPUlkgY29kZSByYXRoZXIgdGhhbiB0aGUgZXh0ZXJuYWwKK2RpcmVjdG9yeSBwcm9ncmFtLiAgY2t1dXNyLmMsIDI2IFNlcCAyMDAyLgorCitQcm90ZWN0IGlzd2lsZCgpIGFnYWluc3QgTlVMTCBhcmdzLiAgY2t1ZmlvLmMsIDI2IFNlcCAyMDAyLgorCitGcm9tIEplZmY6IFNFVCBHVUkgV0lORE9XIFJVTi1NT0RFIHsgTUFYSU1JWkUsIE1JTklNSVpFLCBSRVNUT1JFIH0sCitwbHVzIHZhcmlhYmxlcyBmb3IgR1VJIFdpbmRvdyBYIHBvc2l0aW9uLCBHVUkgV2luZG93IFkgcG9zaXRpb24sIEdVSQorV2luZG93IFggcmVzb2x1dGlvbiwgR1VJIFdpbmRvdyBZIHJlc29sdXRpb24sIEdVSSBXaW5kb3cgUnVuIG1vZGUuCitja3V1c3IuaCwgY2t1dXNbMjRdLmMsIDI3IFNlcCAyMDAyLgorCitGcm9tIFJvbmFuIEZsb29kOiB1cGRhdGVkIEZyZWVCU0QgMS4wIG1ha2VmaWxlIGVudHJ5LCBwbHVzIGFuICNpZmRlZiB0byBwcm90ZWN0CitzeXNjb25mKCkgY2FsbHMuICBtYWtlZmlsZSwgY2t1dGlvLmMsIDI4IFNlcCAyMDAyLgorCitDaGFuZ2UgZnRwX2F1dGgoKSB0byByZXR1cm4oMCkgaWYgYW4gQVVUSCBjb21tYW5kIGdldHMgYSA1MDAgcmVzcG9uc2UsIHNvIGl0Citkb2Vzbid0IGtlZXAgc2VuZGluZyBvdGhlciBraW5kcyBvZiBBVVRIIGNvbW1hbmRzLiAgY2tjZnRwLmMsIDI5IFNlcCAyMDAyLgorCitDaGFuZ2VzIGZyb20gSmVmZiB0byB5ZXN0ZXJkYXkncyBjaGFuZ2VzLiAgY2tjZnRwLmMsIDMwIFNlcCAyMDAyLgorCitGcm9tIEplZmY6IFNTSCBjb21tYW5kLWxpbmUgcGVyc29uYWxpdHkuICBVc2VzIHNhbWUgY29tbWFuZCBsaW5lIGFzIHRoZSBUZWxuZXQKK3BlcnNvbmFsaXR5LiAgY2tja2VyLmgsIGNrY21haS5jLCBja3V1c1s0eV0uYywgMyBPY3QgMjAwMi4KKworRnJvbSBKZWZmLCA3IE9jdCAyMDAyOgorIC4gU0VUIFBSSU5URVIgQ0hBUkFDVEVSLVNFVC4gIGNrdXhsYS5jLCBja3V1c3IuaCwgY2t1dXNbMjVdLmMKKyAuIFByb21vdGlvbiBvZiBLOTUgdG8gQmV0YS4wMS4gIGNrY21haS5jCisgLiBQcm9tb3Rpb24gb2YgU0VUIEdVSSB7IE1FTlVCQVIsIFRPT0xCQVIgfSB0byB2aXNpYmxlLiAgY2t1dXMzLmMKKworQ2hhbmdlZCB0aGUgVVJMIHBhcnNlciBhcyBmb2xsb3dzOiBpZiB0aGUgdXNlcm5hbWUgYW5kL29yIHBhc3N3b3JkIGZpZWxkcyBhcmUKK3ByZXNlbnQgYnV0IGVtcHR5LCBhcyBpbjoKKworICAgICAgICAgICBmdHA6Ly9AZnRwLnh5emNvcnAuY29tL3NvbWVwYXRoCisgIG9yOiAgICAgIGZ0cDovLzpAZnRwLnh5emNvcnAuY29tL3NvbWVwYXRoCisgIGJ1dCBub3Q6IGZ0cDovLzpmdHAueHl6Y29ycC5jb20vc29tZXBhdGgKKwordGhlIHBvaW50ZXIgZm9yIHRoZXNlIGl0ZW1zIGJlY29tZXMgYSBwb2ludGVyIHRvIGFuIGVtcHR5IHN0cmluZywgcmF0aGVyIHRoYW4KK2EgTlVMTCBwb2ludGVyLiAgVGhlbiB3aGVuIHdlIGdvIHRvIG9wZW4gdGhlIGNvbm5lY3Rpb24sIGlmIHRoZSB1c2VybmFtZQorc3RyaW5nIHBvaW50ZXIgcG9pbnRzIHRvIGFuIGVtcHR5IHN0cmluZywgd2UgcHJvbXB0IGZvciB0aGUgdXNlcm5hbWUgKGFuZC9vcgorcGFzc3dvcmQpLiAgY2t1dXN5LmMgOSBPY3QgMjAwMi4KKworSmFzb24gSGVza2V0dCByZXBvcnRlZCBhbiBpbnRlcmVzdGluZyBidWcgaW52b2x2aW5nIGEgY29yZSBkdW1wIHdoZW4gYW4KK09OX0VYSVQgbWFjcm8gaXMgZGVmaW5lZCB0aGF0IGV4ZWN1dGVzIGFub3RoZXIgbWFjcm8uICBTb21ldGltZXMuICBIZSB3YXMgYWJsZQordG8gc2VuZCBhIHNob3J0IGNvbW1hbmQgZmlsZSB0aGF0IGFsd2F5cyBjcmFzaGVkLiAgRGlhZ25vc2lzOiBPTl9FWElULCB3aGVuIGl0CitpcyBjYWxsZWQsIHBva2VzIGl0c2VsZiBvdXQgb2YgdGhlIG1hY3JvIHRhYmxlIGJ5IHNldHRpbmcgaXRzIG93biBlbnRyeSBpbiB0aGUKK21hY3JvIG5hbWUgbGlzdCB0byBhbiBlbXB0eSBzdHJpbmcuICBCdXQgdGhpcyBpbnRlcmZlcmVzIHdpdGggYW55IG1hY3JvCitsb29rdXBzIHRoYXQgYXJlIGRvbmUgd2hpbGUgZXhlY3V0aW5nIE9OX0VYSVQncyBib2R5IGFuZCBhbHNvIGV2aWRlbnRseSBzb21lCitjb2RlIGlzIG5vdCBoYXBweSB3aXRoIGVtcHR5IG1hY3JvIG5hbWVzLi4uICBUbyBmaXg6IHJlcGxhY2UgIm9uX2V4aXQiIHdpdGgKKyJvbl9leHh4Iiwgc28gdGhlIHJlcGxhY2VtZW50IGtleXdvcmQgaXMgKGEpIG5vbmVtcHR5LCBhbmQgKGIpIGRvZXNuJ3Qgd3JlY2sKK3RoZSBhbHBoYWJldGljYWwgc29ydGluZyBvZiB0aGUgdGFibGUuICBja3V1c3guYywgOSBPY3QgMjAwMi4KKworQWRkZWQgbWFrZWZpbGUgdGFyZ2V0cyBmb3IgRnJlZUJTRCA0LjYgYW5kIDUuMC4gIEJ1aWx0IGFuZCB0ZXN0ZWQgb24gNC42OworZG9uJ3Qga25vdyBhYm91dCA1LjAuICBja3V2ZXIuaCwgbWFrZWZpbGUsIDkgT2N0IDIwMDIuCisKK0FkZGVkIHRhcmdldHMgZm9yIEFJWCA1LjIgYW5kIDUuMzsgdG90YWxseSB1bnRlc3RlZC4gIGNrdXZlci5oLCBtYWtlZmlsZSwKKzkgT2N0IDIwMDIuCisKK0J1aWx0IGN1cnJlbnQgc291cmNlIG9uIFVuaXh3YXJlIDcuMS4zIChtYWtlIHV3Nyk7IGl0J3MgZmluZS4gIDkgT2N0IDIwMDIuCisKK1Byb21vdGVkIEMtS2VybWl0IHRvIDguMC4yMDYgQmV0YS4wMSBpbiBob3BlcyBvZiBhIHNpbXVsdGFuZW91cyByZWxlYXNlCit3aXRoIEs5NSAyLjEuICBja2NtYWkuYywgOSBPY3QgMjAwMi4KKworRnJvbSBKZWZmOiBDaGFuZ2UgS0VSTUlURk9OVCBkZWZpbml0aW9ucyB0byB1c2UgdGhlIG5ldyAoVW5pY29kZSAzLjEpIGNvZGUKK3BvaW50cyBmb3IgdGhlIHRlcm1pbmFsIGdyYXBoaWNzIGNoYXJhY3RlcnMgKHN1Y2ggYXMgVlQxMDAgaG9yaXpvbnRhbCBzY2FuCitsaW5lcyksIHJhdGhlciB0aGFuIHByaXZhdGUtdXNlIGNvZGVzLiAgY2tjdW5pLmMsIDEwIE9jdCAyMDAyLgorCitKYXNvbiBIZXNrZXR0IGFsc28gY29tcGxhaW5lZCB0aGF0IFJFTU9URSBDRCB3b3VsZCBwcmludCB0aGUgbmFtZSBvZiB0aGUgbmV3CitkaXJlY3RvcnkgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciBldmVuIGlmIGhlIFNFVCBRVUlFVCBPTi4gIFRoaXMgaXMgYSB0cmlja3kKK29uZS4gIFdoaWNoIHNlcnZlciByZXBsaWVzIHNob3VsZCB0aGUgUVVJRVQgc2V0dGluZ3MgYXBwbHkgdG8/ICBJZiBJIGdpdmUgYQorUkVNT1RFIERJUkVDVE9SWSBjb21tYW5kLCBpdCBtZWFucyBJIHdhbnQgdG8gc2VlIHRoZSBkaXJlY3RvcnkgbGlzdGluZywKK3BlcmlvZC4gIEJ1dCBpZiBJIGdpdmUgYSBSRU1PVEUgQ0QgY29tbWFuZCwgSSBnZXQgYW4gInVuc29saWNpdGVkIiByZXNwb25zZQorbWVzc2FnZSB0aGF0IFNFVCBRVUlFVCBPTiBzaG91bGQgc3VwcHJlc3MuICBBZGRpbmcgbWVzc2FnZSBzdXBwcmVzc2lvbiB0byAKK3Jjdl9zaG9ydHJlcGx5KCkgaXMgY2xvc2UsIGJ1dCBub3QgdG90YWxseSByaWdodDsgZm9yIGV4YW1wbGUsIGl0IGFsc28KK3N1cHByZXNzZXMgdGhlIHJlc3BvbnNlIHRvIFJFTU9URSBQV0QsIHdoaWNoIGlzIG5vdCBoZWxwZnVsLiAgVGhlIG9ubHkgcmlnaHQKK3dheSB0byBkbyB0aGlzIGlzIHRvIHN1cHByZXNzIGZvciBSRU1PVEUgQ0Qgb25seSwgd2hpY2ggY2FuIGJlIGRvbmUgb25seSBieQorc2V0dGluZyBhIChuZXcpIGdsb2JhbCBmbGFnLCByY2RhY3RpdmUuICBja3V1c1tyNTddLmMsIGNrY3Byby53LCAxMCBPY3QgMjAwMi4KKworRGl0dG8gZm9yIFJFTU9URSBMT0dJTiByZXNwb25zZSBtZXNzYWdlICgiTG9nZ2VkIGluIikuICBja3V1czcuYywgMTEgT2N0IDIwMDIuCisKK0Zyb20gSmVmZjogU0VUIEdVSSBXSU5ET1cgRk9OVCB7IE5BTUUsIFNJWkUgfS4gY2t1dXNyLmgsIGNrdXVzNC5jLCAxMSBPY3QgMjAwMi4KKworUXVpY2sgcHJlbGltaW5hcnkgOC4wLjIwNiBidWlsZC1hbGw6CisKKyBPSyBTdW5PUyA0LjEuMworIE9LIFNvbGFyaXMgMi41LjEKKyBPSyBTb2xhcmlzIDkKKyBPSyBBSVggNC4zLjMKKyBPSyBIUC1VWCAxMC4yMAorIE9LIFZNUyA3LjEgQWxwaGEgKyBUQ1AvSVAKKyBPSyBWTVMgNy4xIEFscGhhIG5vbmV0CisgT0sgVk1TIDUuNSBWQVggKyBUQ1AvSVAKKyBPSyBWTVMgNS41IFZBWCBub25ldAorIE9LIFVuaXh3YXJlIDcuMS4zCisgT0sgRnJlZUJTRCAzLjEKKyBPSyBGcmVlQlNEIDQuNgorIE9LIE5ldEJTRCAxLjUuMiBNVk1FIChHZXJyeSBCKQorIE9LIFNpbml4IDUuNDIKKworU2luaXggYnVpbGQgZ290IHN0dWNrIG9uIGNrdXVzci5jIGV2ZW4gdGhvdWdoIHdlJ3JlIG5vdCBvcHRpbWl6aW5nIG9uIFNpbml4CithbnkgbW9yZS4gIFJlYm9vdGluZyB0aGUgbWFjaGluZSBmaXhlZCBpdC4KKworRml4ZWQgc29tZSAjaWZkZWZzIGZvciBWTVMgaW4gbmV3IGluY29tcGxldGUtZmlsZSBkZWxldGlvbiBjb2RlIGluIGRvY2xlYW4oKS4KK2NrdXVzeC5jLCAxMSBPY3QgMjAwMi4KKworTW92ZWQgdXFfYmxhaCgpIHByb3RvdHlwZXMgZnJvbSBja3V1c3IuaCB0byBja2NrZXIuaCBiZWNhdXNlIHRoZXNlIHJvdXRpbmVzCithcmUgY2FsbGVkIGluIG1vZHVsZXMgdGhhdCBkb24ndCAoYW5kIHNob3VsZG4ndCBoYXZlIHRvKSBpbmNsdWRlIGNrdXVzci5oLgorMTEgT2N0IDIwMDIuCisKK0plZmYgdmVyaWZpZWQgc2VjdXJlIGJ1aWxkcyBvbiBMaW51eCBhbmQgU29sYXJpcy4KKworQ3VzdG9tLWJ1aWxkIHdvcmtvdXQ6IDgwIGRpZmZlcmVudCBmZWF0dXJlLXNlbGVjdGlvbiBjb21iaW5hdGlvbnM6CisgLiBGaXhlZCB5ZXN0ZXJkYXkncyBjaGFuZ2UgZm9yIE5PU1BMOiBja2NmbnMuYy4KKyAuIEZpeGVkIGNvbmZsaWN0IGJldHdlZW4gTk9SRUNBTEwgYW5kIFVTRV9BUlJPV0tFWVM6IGNrdWNtZC5jLgorIC4gTW92ZWQgc2V0c2VzbG9nKCkgZnJvbSBja3V1czUuYyB0byBja3V1c3guYyB0byBhdm9pZCBsaW5rLXRpbWUgZm91bHVwcy4KKyAuIEZpeGVkIGFuIHVuZ3VhcmRlZCByZWZlcmVuY2UgdG8gem1rZGlyKCkgaW4gY2tjZnRwLmMuCisgLiBQcm90ZWN0ZWQgcm1zZygpIGJ5ICNpZm5kZWYgTk9YRkVSOiBja3V1czcuYy4KKyAuIFByb3RlY3RlZCBpbml0eGxpc3QoKSBieSAjaWZuZGVmIE5PWEZFUjogY2tjbWFpLmMuCisgLiBGaXhlZCB1bmd1YXJkZWQgcmVmZXJlbmNlcyB0byBnX3VybCBzdHJ1Y3QgaW4geHhfZnRwKCk6IGNrdXVzeS5jLgorIC4gRml4ZWQgdW5ndWFyZGVkIHJlZmVyZW5jZXMgdG8gdHRfc25hd3MoKSBpbiB3aW5jaGgoKTogY2t1dGlvLmMuCisKKy0tLSA4LjAuMjA2IEJldGEuMDEgMTEgT2N0IDIwMDIgLS0tCisKK0Zyb20gSmVmZiwgMTYgT2N0IDIwMDI6CisgLiBGaXggSzk1IFJNRElSOiBja2NmbjMuYy4KKyAuIE1ha2VmaWxlIHRhcmdldHMgZm9yIFJlZCBIYXQgNy4yLCA3LjMsIDguMDogY2t1dmVyLmgsIG1ha2VmaWxlLgorIC4gQWRkZWQgXHYobG9nX3h4eCkgZm9yIGVhY2gga2luZCBvZiBsb2cgZm9yIFBldGVyRTogY2t1dXNyLmgsIGNrdXVzNC5jLgorIC4gQWRkZWQgU0VUIFRFUk0gQVRUUklCVVRFIERJTSB7IE9OLCBPRkYgfTogY2t1dXNbMjddLmMuCisgLiBDaGFuZ2UgImNvbnN0IiB0byAiQ09OU1QiIGluIHNvbWUgUEFNIGRlY2xhcmF0aW9ucy4gIGNrdWZpby5jLgorCitBZGRlZCBTRVQgTUFUQ0ggeyBET1RGSUxFLCBGSUZPIH0geyBPTiwgT0ZGIH0uICBBIEZJRk8gc3BlY2lhbCBmaWxlIGlzIGEgbmFtZWQKK3BpcGUsIHVzZWQgZm9yIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uLiAgSXQgbXVzdCBiZSBvcGVuZWQgYXQgYm90aCBlbmRzLCBzbworaXQncyBzaWxseSB0byBtYXRjaCB0aGVtIGJ5IGRlZmF1bHQ7IG9wZW5pbmcgYSBGSUZPIGFuZCBhdHRlbXB0aW5nIHRvIHJlYWQKK3dpbGwgYmxvY2sgZm9yZXZlciB1bmxlc3Mgc29tZWJvZHkgaXMgd3JpdGluZyBpbnRvIHRoZSBvdGhlciBlbmQuICBNYWRlIHRoZQorTUFUQ0ggRklGTyBkZWZhdWx0IE9GRiBpbiBhbGwgY2FzZXMuICBUaGUgZG90ZmlsZSBkZWZhdWx0IGlzIHRoZSBzYW1lIGFzCithbHdheXMgKE9GRiBmb3IgVU5JWCwgT04gZWxzZXdoZXJlKTsgU0VUIE1BVENIIERPVEZJTEUgaXMgc2ltcGx5IGEgbW9yZQordW50dWl0aXZlIGFuZCBmaW5kYWJsZSBjb21tYW5kIHRoYW4gU0VUIFdJTEQgS0VSTUlUIC9NQVRDSC1ET1QtRklMRVMuICBOb3RlCit0aGF0IFNFVCBNQVRDSCBET1RGSUxFIHVuZG9lcyBTRVQgT1BUSU9OUyBESVJFQ1RPUlkgL1tOT11ET1RGSUxFUywgYW5kIHZpY2UKK3ZlcnNhLiAgY2tjbWFpLmMsIGNrdXVzci5oLCBja3V1c1syM10uYywgY2t1ZmlvLmMuIDE3IE9jdCAyMDAyLgorCitBZGRlZCBjbGllbnQgYW5kIHNlcnZlciBlbmQgb2YgUkVNT1RFIFNFVCBNQVRDSCB7IERPVEZJTEUsIEZJRk8gfSB7IE9OLCBPRkYgfS4KK1RoZSBuZXcgcHJvdG9jb2wgY29kZXMgYXJlIDMzMCBhbmQgMzMxLCByZXNwZWN0aXZlbHkuICBja3V1c1szNjddLmMsIGNrY2Zucy5jLAorMTcgT2N0IDIwMDIuCisKK0FkanVzdGVkIHRoZSAibWF0Y2ggZG90IGlmIHBhdHRlcm4gc3RhcnRzIHdpdGggZG90IiBoZXVyaXN0aWMgaW4gbnp4cGFuZCgpCit0byBub3Qga2ljayBpbiBpZiB0aGUgZmlsZXNwZWMgaXMgIi4vZm9vIi4gIFRoaXMgcHJvYmFibHkgbmVlZHMgbW9yZSB3b3JrLgorY2t1ZmlvLmMsIDE3IE9jdCAyMDAyLgorCitGaXhlZCB0eXBvIGluIHRyYW5zY3JpYmluZyBKZWZmJ3MgY2tjZm4zLmMgY29kZSBmcm9tIHllc3RlcmRheS4gIDE4IE9jdCAyMDAyLgorCitNb3ZlZCBzb21lIGhlbHAgdGV4dCBvdXQgb2YgI2lmZGVmIEFOWVNTSCB0aGF0IGhhZCBub3RoaW5nIHRvIGRvIHdpdGggU1NILgorKElkZWEgZm9yIGEgbmV3IEVNQUNTIGZlYXR1cmU6IE0tWCBsaXN0LWlmZGVmLWVudmlyb25tZW50LikKK2NrdXVzMi5jLCAxOCBPY3QgMjAwMi4KKworUmVtb3ZlZCAic2V0IGZpbGUgeyBwZXJtaXNzaW9uLCBwcm90ZWN0aW9uIH0iIGtleXdvcmRzLCB3aGljaCBsZWQgbm93aGVyZS4KK2NrdXVzNy5jLCAxOCBPY3QgMjAwMi4KKworQWRkZWQgLURTVjY4IHRvIGFsbCBTVi82OCB0YXJnZXRzLiAgTWFrZSBja2dldGZxaG9zdG5hbWUoKSBqdXN0IHJldHVybiBpdHMKK2FyZ3VtZW50IGluIFNWLzY4OyBpdCBkdW1wcyBjb3JlIG90aGVyd2lzZS4gIEluIGNhc2UgdGhpcyBoYXBwZW5zIGFueXdoZXJlCitlbHNlLCBhZGQgLUROT0NLR0VURlFIT1NUIHRvIENGTEFHUy4gIG1ha2VmaWxlLCBja2NuZXQuYywgMTggT2N0IDIwMDIuCisKK0ZvciBQZXRlckUsIGFkZGVkIFNFVCB7IFNFTkQsIFJFQ0VJVkUgfSBQRVJNSVNTSU9OUyB7IE9OLCBPRkYgfSBzbyBpbmNvbWluZyBhbmQKK291dGJvdW5kIHBlcm1pc3Npb24gYXR0cmlidXRlcyBjYW4gYmUgc2V0IHNlcGFyYXRlbHkuIGNrdXVzWzI3XS5jLCAxOCBPY3QgMjAwMi4KKworQ2hhbmdlZCBTSE9XIEFUVFJJQlVURVMgdG8gc2hvdyBJbiBhbmQgT3V0IHBlcm1pc3Npb25zIHNlcGFyYXRlbHkuCitja3V1czUuYywgMTggT2N0IDIwMDIuCisKK0ZpeGVkIFJFRE8gdG8gZGlzcGxheSB0aGUgY29tbWFuZCBpdCdzIHJlZG9pbmcgYW5kIHRvIGFkZCBpdCB0byB0aGUgYm90dG9tCitvZiB0aGUgcmVjYWxsIGJ1ZmZlci4gIGNrdXVzci5jLCAxOCBPY3QgMjAwMi4KKworRGlzY292ZXJlZCB0aGF0IERBVEUgU0FUVVJEQVkgZHVtcHMgY29yZS4uLiAgQXBwYXJlbnRseSBpdCBhbHdheXMgZGlkOyB0aGlzCitjYXNlIHdhcyBub3QgaW5jbHVkZWQgaW4gdGhlIGRhdGUtdGltZSB0b3J0dXJlIHRlc3Qgc2NyaXB0LiAgVGhlIGNyYXNoIGhhcHBlbnMKK2JlY2F1c2UgdGhlIERBVEUgcGFyc2luZyBjb2RlIGRvZXNuJ3QgY2hlY2sgZm9yIGEgTlVMTCBkYXRlLWNvbnZlcmlvbgorZXJyb3ItbWVzc2FnZSBwb2ludGVyLiAgRml4ZWQgaW4gY2t1dXNyLmMsIDE4IE9jdCAyMDAyLgorCitUaGUgcmVhc29uIERBVEUgU0FUVVJEQVkgZ290IGEgZGF0ZS1jb252ZXJzaW9uIGVycm9yIHdhcyB0aGF0IHRoaXMgcGF0aCB0aHJ1Cit0aGUgY29kZSBsZWZ0IGEgcmVzdWx0IHBvaW50ZXIgdW5zZXQuICBGaXhlZCBpbiBjbWN2dGRhdGUoKTogY2t1Y21kLmMsCisxOSBPY3QgMjAwMi4KKworREFURSBTVU5EQVkgKzFEQVkgcmV0dXJuZWQgaW5jb3JyZWN0IHJlc3VsdHMgKGZvciBhbnkgZGF5LW9mLXdlZWsgbmFtZSwgYW55CitkZWx0YSB0aW1lKSwgZXZlbiB0aG91Z2ggREFURSBUT0RBWSArMURBWSB3b3JrZWQgZmluZS4gIEZpeGVkIGluIGNtY3Z0ZGF0ZSgpOgorY2t1Y21kLmMsIDE5IE9jdCAyMDAyLgorCitTRVQgVEFLRSBFQ0hPIE9OIGNvdW50ZWQgZWFjaCBsaW5lIHR3aWNlIHdoZW4gR09UTyB3YXMgYWN0aXZlLiAgRml4ZWQgaW4KK2RvZ290bygpOiBja3V1czYuYywgMTkgT2N0IDIwMDIuCisKK0plZmYgbm90aWNlZDoKKyJLRVJNSVQgUkVBRFkgVE8gR0VULi4uCisgUkNWRDogKDIgZmlsZXMpIExhc3Q6IFsvYW1kL3Byb3N0L3Ava2QvamFsdG1hbi8uc3JjL2Nrb25ldC5jXSAoT0spCit0aGUgbGFzdCBmaWxlIGF0dGVtcHRlZCBtYXkgaGF2ZSBiZWVuIGNrb25ldC5jIGJ1dCBpdCBjZXJ0YWlubHkgd2FzCitub3QgdGhlIGxhc3QgZmlsZSByZWNlaXZlZCIgKHNpbWlsYXJseSBmb3Igc2VuZGluZykuICBGaXhlZCBieSBoYXZpbmcgdHdvCitwb2ludGVycyBmb3IgZWFjaCBuYW1lOyBhIHByZWxpbWluYXJ5IHBvaW50ZXIsIHdoaWNoIGlzIHNldCBmb3IgZWFjaCBmaWxlIGF0Cit0aGUgYmVnaW5uaW5nIG9mIHRoZSB0cmFuc2ZlciAod2hlbiB3ZSBoYXZlIGFsbCB0aGUgbmVlZGVkIGluZm8pLCBhbmQgYSBmaW5hbAorb25lIHRoYXQgaXMgc2V0IGZyb20gdGhlIHByZWxpbWluYXJ5IG9uZSBvbmx5IGFmdGVyIHRoZSBmaWxlIHdhcyB0cmFuc2ZlcnJlZAorc3VjY2Vzc2Z1bGx5LiAgVGhpcyBjb3JyZWN0cyBub3Qgb25seSB0aGUgYXV0b21hdGljICJ3aGVyZW1lc3NhZ2UiIGF0IHRoZSBlbmQKK29mIGEgcmVtb3RlLW1vZGUgdHJhbnNmZXIsIGJ1dCBhbHNvIHRoZSBXSEVSRSBhbmQgU0hPVyBGSUxFIGNvbW1hbmQgcmVzdWx0cy4KK2NrdXVzeC5jLCBja2NmbltzM10uYywgY2tjcHJvLncsIDE5IE9jdCAyMDAyLgorCitGcm9tIEplZmY6IEltcHJvdmUgT1JJRU5UQVRJT04gbWVzc2FnZSBmb3IgSzk1IHRvIHNheSB3aGljaCBkaXJlY3RvcmllcyBhcmUKK2ZvciB3aGljaCBJTkkgZmlsZXMuICBja3V1c3IuYywgMjMgT2N0IDIwMDIuCisKK1JlbW92ZWQgQmV0YSBkZXNpZ25hdGlvbiBmcm9tIGhlcmFsZC4gIGNrY21haS5jLCAyMyBPY3QgMjAwMi4KKworUHV0IGZpbmFsIGRhdGVzIGFuZCBJRCBzdHJpbmdzIGluIFVuaXggYW5kIFZNUyBidWlsZCBwcm9jZWR1cmVzLgorTWFrZWZpbGUsIGNrdmtlci5jb20sIDIzIE9jdCAyMDAyLgorCitCdWlsZC1hbGwuLi4gICNpZmRlZiBhZGp1c3RtZW50czogY2tjZm5zLmMuLi4gIDgzIGRpZmZlcmVudCBmZWF0dXJlLXNldAorY29tYmluYXRpb25zIGJ1aWxkIE9LIG9uIExpbnV4LiAgMjMgT2N0IDIwMDIuCisKK0Zyb20gSmVmZjogU0VUIFdJTjk1IEhPUklaT05UQUwtU0NBTi1MSU5FLVNVQlNUSVRVVElPTlMuICBja3V1c3IuaCwgY2t1dXM3LmMsCisyNCBPY3QgMjAwMi4KKworRml4ZWQgSGVhdGgtMTkgZ3JhcGhpYyBjaGFyYWN0ZXItc2V0IHRhYmxlIHRvIHVzZSBuZXcgVW5pY29kZSAzLjEgdmFsdWVzCitpZiBXSU45NSBIT1JJWiBPRkYuICBja2N1bmkuYywgMjQgT2N0IDIwMDIuCisKK0NoYW5nZWQgdHhfdXN1YigpIHRvIHJldHVybiBVbmljb2RlIDMuMSB2YWx1ZXMgaWYgV0lOOTUgSE9SSVogT0ZGLgorY2tjdW5pLmMsIDI0IE9jdCAyMDAyLiA8LS0gTm8gYmFja2VkIG9mZiBvbiB0aGlzLgorCitTb21lIHByb2JsZW1zIGR1cmluZyBidWlsZC1hbGw6CisKKyAuIFZNUyA3LjEgVEdWIDQuMjogSWYgSSBtYWtlIGEgVGVsbmV0IGNvbm5lY3Rpb24gd2l0aCBpdCwgdGhlbiB0cnkgdG8gc2VuZAorICAgYSBmaWxlIChpdHNlbGYuIHdlcm1pdC5leGUpIG92ZXIgdGhlIGNvbm5lY3Rpb24sIHRoZSBjb25uZWN0aW9uIGRyb3BzCisgICBhZnRlciBhYm91dCAyMCUsIHRoZSB0aGVybW9tZXRlciB6b29tcyBvdXQgdG8gMTAwJSBhbmQgU1VDQ0VTUyBpcyByZXBvcnRlZC4KKyAgIFRoaXMgZG9lc24ndCBoYXBwZW4gd2l0aCBVQ1guCisKKyAuIFZNUyA3LjMgVEdWIDQuMzogY2tjbWFpLmMgd29uJ3QgY29tcGlsZSBiZWNhdXNlIG9mIGEgY29tcGxhaW50IGFib3V0IHRoZQorICAgZGVjbGFyYXRpb24gb2Ygc2VsZWN0KCkgKHdoaWNoIGNrY21haS5jIGRvZXNuJ3QgdXNlKSBpbgorICAgU1lTJENPTU1PTjpbU1lTTElCXURFQ0MkUlRMREVGLlRMQi4gIERpdHRvIGluIFZNUyA3LjIgVEdWIDQuMy4KKyAgIEFkZGluZyBOT1NFTEVDVCB0byBDRkxBR1MgZG9lc24ndCBoZWxwLiAgSSBkb24ndCB0aGluayB0aGUgVk1TIHZlcnNpb24KKyAgIGV2ZW4gdXNlcyBzZWxlY3QoKS4gIEJ1dCB0aGUgVEdWIDQuMyBidWlsZHMgd2VyZSBPSyBpbiA4LjAuMjAxLCBzbyB3aGF0CisgICBjaGFuZ2VkPyAgSSBkb24ndCBzZWUgYW55dGhpbmcgaW4gY2tjbmV0LmggdGhhdCB3b3VsZCBoYXZlIGRvbmUgaXQuCisKK0l0IGJ1aWxkcyBPSyB3aXRoIFZNUyA3LjEgLyBUR1YgNC4yIGJ1dCBzZW5kaW5nIGZpbGVzIG9uIFRlbG5ldCBjb25uZWN0aW9ucworZmFpbHMgaW4gYSBzdHJhbmdlIHdheTogdGhlIGNvbm5lY3Rpb24gZHJvcHMsIGJ1dCB0aGUgdGhlcm1vbW90ZXIgZ29lcyB0byAxMDAlCithbmQgc3VjY2VzcyBpcyByZXBvcnRlZC4gIEkgZG9uJ3Qga25vdyB3aHkgdGhlIGNvbm5lY3Rpb24gaXMgZHJvcHBpbmcgKHNfZXJybm8KK2lzIDMyID09ICJicm9rZW4gcGlwZSIpLCBidXQgdGhlIHNwdXJpb3VzIHN1Y2Nlc3MgaW5kaWNhdGlvbiBpcyBiZWNhdXNlIG9mCithIGRvdWJsZSBmYWlsdXJlIGluIHNkYXRhKCk6ICgxKSBUaGUgcGFja2V0LXNlbmRpbmcgbG9vcCBpbmRleCBjb3VsZCBnbworbmVnYXRpdmUgd2l0aG91dCBicmVha2luZyB0aGUgbG9vcCB3aGVuIHN0cmVhbWluZzsgKDIpIGlmIHNwYWNrKCkgZmFpbHMsCitzZGF0YSgpIHNob3VsZCByZXR1cm4gLTIsIG5vdCAtMSAod2hpY2ggbWVhbnMgRU9GKS4gIEFsc28gaWYgYW55IHR0Y2hrKCkgaW4KK3NkYXRhKCkgcmV0dXJucyA8IDAsIHNkYXRhIHNob3VsZCByZXR1cm4gLTIuICBJIGZpeGVkIHRoaXMgY29kZSAod2hpY2ggaGFzCitiZWVuIHRoaXMgd2F5IGZvciBZRUFSUykgYW5kIG5vdyBWTVMgQy1LZXJtaXQgcHJvcGVybHkgZmFpbHMgd2hlbiBpdCBnZXRzCit0aGUgc3BhY2soKSBlcnJvciwgYnV0IHR0Y2hrKCkgaW4gdGhpcyBjYXNlIHN0aWxsIGRvZXNuJ3QgdGhpbmsgdGhlIGNvbm5lY3Rpb24KK2lzIGxvc3QsIGJ1dCB0aGF0IG11c3QgYmUgb3VyIG5ldyBwcm9ibGVtIHdpdGggTXVsdGlOZXQuICBja2NmbnMuYywKKzI3IE9jdCAyMDAyLgorCitUaGUgY29tcGlsYXRpb24gZmFpbHVyZSBpbiBja2NtYWkuYyBpcyBhIGNsdWUuLi4gIFRoZSBwcm9ibGVtIHdhcyB0aGF0IEkgYWRkZWQKKyNpZmRlZiBWTVMgLyAjaW5jbHVkZSA8dGltZS5oPiAvICNlbmRpZiB0byBzaHV0IHVwIGNvbXBsYWludHMgYWJvdXQgdGhlIHRpbWUoKQorY2FsbC4gIEV2aWRlbnRseSBzb21ldGhpbmcgaW4gVk1TIDx0aW1lLmg+IGdpdmVzIE11bHRpTmV0IGEgYmFkIGNhc2Ugb2YKK2luZGlnZXN0aW9uOyByZW1vdmluZyBpdCBmaXhlcyB0aGUgY29tcGlsYXRpb24gYW5kIHRoZSByZXN1bHQgd29ya3MgZmluZS4gIFRoZQordHJhbnNtaXNzaW9uIGZhaWx1cmVzIGluIHRoZSBvdGhlciBjYXNlIHNlZW0gdG8gYmUgYSBjb2luY2lkZW5jZSAtLSBzb21ldGhpbmcKK3RvIGRvIHdpdGggdGhlIFUgb2YgQXJpem9uYSAocHJvYmFibHkgc29tZSBvYnNjdXJlIFZNUyBxdW90YSBvbiBteSBJRHMgdGhlcmUsCitvciBzb21lIGtpbmQgb2YgbmV0d29yayBjb25uZWN0aW9uIHRocm90dGxpbmcpLCBzaW5jZSBpdCBkb2Vzbid0IGhhcHBlbgorYW55d2hlcmUgZWxzZS4gIGNrY21haS5jLCAyNyBPY3QgMjAwMi4KKworQ2hhbmdlZCBmb3VyIG9jY3VycmVuY2VzIG9mICJ2b2lkIiB0byAiVk9JRCIgaW4gY2tjZnRwLmMsIDI3IE9jdCAyMDAyLgorCitEZWZpbmVkIE5PQ0tGUUhPU1ROQU1FIGZvciBIUFVYUFJFNjUuICBNaWdodCBhbHNvIG5lZWQgdGhpcyBmb3IgSFAtVVggNworYW5kIG1heWJlIDguICBja2NuZXQuYywgMjcgT2N0IDIwMDIuCisKK0Zyb20gSmVmZjogUEFNX0NPTlNUIGRlZmluaXRpb24gdG8gY2xlYXIgdXAgd2FybmluZ3MgY2F1c2VkIGJ5IGRpZmZlcmVudAordmVuZG9ycycgZGVmaW5pdGlvbnMgb2YgUEFNIHN0cnVjdHMuICBja3VmaW8uYywgMjggT2N0IDIwMDIuCisKK1VuaXh3YXJlIDIuMS4wIGJ1aWxkIGJvbWJzIGltbWVkaWF0ZWx5IHdpdGggIlVYOm1ha2U6IEVSUk9SOiBsaW5lIHRvbyBsb25nIgorKHdoaWNoIGxpbmU/KSAgTm90IHdvcnRoIGNob3BwaW5nIHVwIHRoZSBtYWtlZmlsZSB0byBmaXggYnV0IGluIGEgcGluY2ggaXQKK2NvdWxkIGJlIGRvbmUuICAyLjEuMyBidWlsZHMgT0suCisKK0RpZCBhbm90aGVyIDIwLXNvbWUgcGxhdGZvcm0gYnVpbGRzLCBicmluZ2luZyB0aGUgdG90YWwgdG8gODMsIHBsdXMgYSBmaW5hbAorcnVudGhyb3VnaCBvZiB0aGUgYnVpbGQtd2l0aC04NC1kaWZmZXJlbnQtZmVhdHVyZS1zZXQtY29tYmluYXRpb25zIHNjcmlwdCBvbgorTGludXguICBTaG91bGQgYmUgZ29vZCB0byBnbyEKKworLS0tIDguMC4yMDYgMjQgT2N0IDIwMDIgLS0tCisKK0ZpbmFsbHkgZ290IGFjY2VzcyB0byBMaW51eCBvbiBJQTY0IGFnYWluLiAgQnVpbGRzIE9LIGJ1dCBkdW1wcyBjb3JlCitpbW1lZGlhdGVseSBvbiBzdGFydHVwLiAgQWRkaW5nIC1ETk9DS0dFVEZRSE9TVCB3YXMgbmVjZXNzYXJ5IGJ1dCBub3QKK3N1ZmZpY2llbnQuICBJbiB0aGlzIGNhc2UsIHRoZSB2ZXJ5IGNhbGwgdG8gY2tnZXRmcWhvc3RuYW1lKCkgZnJvbSBja2hvc3QoKQorKHdoaWNoIGlzIGluIGNrdXVzeC5jKSB3YXMgZHVtcGluZyBjb3JlOyB0aHVzIEkgaGFkIHRvIG1vdmUgdGhlIGRlZmluaXRpb24gb2YKK05PQ0tHRVRGUUhPU1QgZnJvbSBja2NuZXQuYyB0byBja2NkZWIuaCwgYWRkIGFuICNpZmRlZiBfX2lhNjRfXyBjbGF1c2UgdG8gaXQsCithbmQgcHJvdGVjdCB0aGUgY2FsbCB0byBja2dldGZxaG9zdG5hbWUoKSB3aXRoIGl0LiAgT2J2aW91c2x5IHRoZXJlIGhhcyB0byBiZQorYSBiZXR0ZXIgZml4IGJ1dCB0aGlzIHdpbGwgaGF2ZSB0byBmb3Igbm93LiAgY2tjbmV0LmMsIGNrdXVzeC5jLCBja2NkZWIuaCwKKzMxIE9jdCAyMDAyLgorCitMaW5rIHN0ZXAgZmFpbHMgaW4gTWFuZHJha2UgOS4wIHdpdGggdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gcmVzX3NlYXJjaCwKK2RuX2V4cGFuZCwgYW5kIGNyeXB0LiAgVHVybnMgb3V0IHRoZSBsaW51eCBtYWtlZmlsZSB0YXJnZXQgdGVzdHMgZm9yIHRoZQorZXhpc3RlbmNlIG9mIGxpYmNyeXB0LmEgYW5kIGxpYnJlc29sdi5hLCBidXQgaW4gTWFuZHJha2UgOS4wIHRoZXkgZXhpc3QKK29ubHkgYXMgKi5zby4gIENoYW5nZWQgbGludXggdGFyZ2V0IHRvIGxvb2sgZm9yIGJvdGguICBtYWtlZmlsZSwgMSBOb3YgMjAwMi4KKworVmFjZSByZXBvcnRlZCB0aGF0ICJmdHAgbWdldCBhIGIgYyIgd291bGQgZ2V0IEFMTCBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIncworZGlyZWN0b3J5IGlmIGMgZGlkIG5vdCBleGlzdC4gIERpYWdub3Npczogb2ZmLWJ5LW9uZSBlcnJvciBpbiBjb3VudGluZyBNR0VUCithcmdzIHByb2Nlc3NlZC4gIE5hdHVyYWxseSBmaXhpbmcgdGhpcyBidWcgcmV2ZWFsZWQgYW5vdGhlciAodGhpcyB0aW1lCitjb3NtZXRpYykgb25lLCB3aGljaCByZXN1bHRlZCBpbiBzcHVyaW91cyBlcnJvciBtZXNzYWdlcyB3aGVuIGhpdHRpbmcgTUdFVAorYXJncyB0aGF0IGhhdmUgbm8gbWF0Y2ggb24gdGhlIHNlcnZlci4gIEZpeGVkIGluIGNrY2Z0cC5jLCAxIE5vdiAyMDAyLgorCitSZWJ1aWx0IGFib3V0IDYwIG9mIHRoZSBtb3N0IGltcG9ydGFudCBVbml4IGJpbmFyaWVzIHRvIHBpY2sgdXAgdGhlIGZpeGVzCiszMSBPY3QgLSAxIE5vdiAyMDAyLCBhbmQgcmVmcmVzaGVkIHRoZSBGVFAgc2l0ZSB3aXRoIG5ldyBzb3VyY2VzLCB0YXJiYWxscywKK1pJUCBmaWxlcywgZXRjLiAgU2F0IE5vdiAgMiAxOToxMTozMCAyMDAyCisKK0Zyb20gTWFydGluIFZvcmxhZW5kZXIgYW5kIEplZmYsIFNTTC9UTFMgc3VwcG9ydCBmb3IgVk1TOgorY2t1dXNyLmgsIGNrdWF0aC5oLCBja2NuZXQuYywgY2tjdGVsLmMsIGNrdWF0aC5jLCAxMCBOb3YgMjAwMi4KKworQWRkZWQgUEFTViBhcyBpbnZpc2libGUgc3lub255bSBmb3IgUEFTU0lWRS4gIGNrY2Z0cC5jLCAxMCBOb3YgMjAwMi4KKworLS0tIDguMC4yMDYgMjQgT2N0IDIwMDIgIzIgLS0tCisKK01vcmUgd29yayBvbiBTU0wgaW4gVk1TOiBKZWZmICsgTWFydGluIFZvcmxhZW5kZXI6IGNrX3NzbC5jIGNrY21haS5jIGNrY25ldC5jCitja2N0ZWwuYyBja3VhdGguaCBja3Zjb24uYyBja3Z0aW8uYyBja3ZrZXIuY29tIDEwLTE1IE5vdiAyMDAyLgorCitEaXNjb3ZlcmVkIHRoYXQgY2t2ZmlvLmMgd291bGQgbm90IGNvbXBpbGUgb24gVk1TIDYuMSB3aXRoIFVDWCA0LjEgYmVjYXVzZSAKKzxjb252JHJvdXRpbmVzLmg+IHdhcyBtaXNzaW5nLCB3aGljaCBpcyBleHBsaWNpdGx5IGluY2x1ZGVkLiAgRW5jbG9zZWQgdGhlCisjaW5jbHVkZSBpbiAjaWZkZWYgTk9DT05WUk9VVElORVMuLiNlbmRpZiBhbmQgcmVidWlsdCB3aXRoCitAW3VzZXJzLmZkYy5zcmNdY2t2a2VyLmNvbSAiIiAiIiAiTk9DT05WUk9VVElORVMiLiAgMTYgTm92IDIwMDIuCisKK0ZpeGVkIHRoZSAiZnRwIG1nZXQgKi9kYXRhLyoiIHByb2JsZW0gd2l0aCB0d28gc21hbGwgY2hhbmdlcyB0byBkb2Z0cGdldCgpOgorY2tjZnRwLmMsIDE2IE5vdiAyMDAyLiAgUGxhY2VkIGEgY29weSBvZiBja2NmdHAucGF0Y2ggaW4gfmtlcm1pdC9mLgorCitGcm9tIEx1Y2FzIEhhcnQ6IEZpeGVzIGZvciBWQVggQyAyLnggYW5kIENNVSBUQ1AvSVAuICAiQ2FuJ3QgZ3VhcmFudGVlIHRoYXQKK3RoZSByZXZpc2VkIENLVk9MRCB3aWxsIHdvcmsgZm9yIGFsbCBjb21iaW5hdGlvbnMgb2YgbW9yZSByZWNlbnQKK1ZNUy9jb21waWxlci9UQ1BJUCByZWxlYXNlcywgYnV0IEkndmUgdGVzdGVkIGl0IGZvciBjb21wYXRpYmlsaXR5IG9uIG91ciBBWFAKK1ZNUyA2LjIsIFVDWCA0LjAsIERFQ0MgNS42LCB5b3VyIEFYUCBWTVMgNy4xLCBERUMgVENQSVAgNS4xLCBERUNDIDYuMCBhcyB3ZWxsCithcyB3aXRoIFZBWCBWTVMgNS40LCBWQVggQyAzLjIsIENNVTEyIGFuZCBWQVggVk1TIDQuNywgVkFYIEMgMi40LiIgIGNrdmZpby5jLAorY2t2dGlvLmMsIGNrdXVzNS5jLCBja3ZrZXIuY29tLCBja3ZvbGQuY29tLCAxNyBOb3YgMjAwMi4KKworRnJvbSBKZWZmOiBNb3JlIHdvcmsgb24gVk1TIFNTTC4gIE5vdyBpdCBhY3R1YWxseSB3b3JrcywgZXZlbiBpbiBDT05ORUNUIG1vZGUsCitleGNlcHQgaXQgaGFuZ3Mgd2hlbiBpdCBnZXRzIGFuIGVycm9yIGFsZXJ0IG9yIHRoZSByZW1vdGUgY2xvc2VzIHRoZQorY29ubmVjdGlvbi4gIGNrY25ldC5jLiBja3Z0aW8uYywgMTcgTm92IDIwMDIuCisKK05PVEU6IEx1Y2FzJ3MgY2hhbmdlcyBzaG91bGQgZ28gaW50byB0aGUgOC4wLjIwNiBzb3VyY2UgY29kZSBidXQgaXQncyB0b28KK2xhdGUgc2luY2UgY2t2dGlvLmMgKHVwb24gd2hpY2ggaGUgYmFzZWQgaGlzIGNoYW5nZXMpIGlzIGFscmVhZHkgZnVsbCBvZgorU1NMIGNvZGUuCisKK01HRVQgaW4gSzk1IGluIHRvdGFsbHkgYnJva2VuIEZPUiBTT01FIFBFT1BMRSAobWFpbmx5IG1lKSBpZiB0aGUgVE1QIChvciBURU1QKQordmFsdWUgaXMgdG9vIGxvbmcuICBJdCB3b3JrcyBmaW5lIGlmIHlvdSBzZXQgdGhlc2UgdG8gQzpcVE1QLiAgRGlhZ25vc2lzOiAoMSkKK3dlIHdlcmUgbWFsbG9jJ2luZyBvbmx5IDE2IGJ5dGVzIGZvciB0aGUgdGVtcCBmaWxlIG5hbWUgKEkgdGhpbmsgdGhpcyB3YXMgbXkKK2ZhdWx0IC0tIEkgd2FzIG9ubHkgbG9va2luZyBhdCB0aGUgImNrWFhYWFhYIiBwYXJ0IGFuZCBmb3JnZXR0aW5nIHRoYXQgdGhpcword2FzIGFwcGVuZGVkIHRvIHRoZSBUTVAgcGF0aCk7ICgyKSB0aGUgV2luZG93cyB2ZXJzaW9uIG9mIG1rdGVtcCgpIHdhbnRzIHlvdQordG8gdXNlIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IHRoZSBwb2ludGVyIGl0IHJldHVybnMsIHJhdGhlciB0aGFuIGFzc3VtaW5nCit0aGUgbWt0ZW1wKCkgYXJnIHdpbGwgYmUgbW9kaWZpZWQgaW4gcGxhY2UuICBUaGUgY29kZSB3YXMgY2hhbmdlZCB0byBtYWxsb2MgYQorbG9uZ2VyIHN0cmluZyBhbmQgdG8gdXNlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBta3RlbXAoKSAoaWYgYW55KSByYXRoZXIgdGhhbgorYXNzdW1pbmcgdGhhdCBta3RlbXAoKSBtb2RpZmllZCBpdHMgYXJndW1lbnQgc3RyaW5nIChpbiBLOTUgb25seSAtLSBub3Qgc3VyZQorYWJvdXQgVW5peCBwbGF0Zm9ybXM7IHRoZSBtYW4gcGFnZXMgZGlmZmVyIG9uIHRoaXMsIGJ1dCBhdCBsZWFzdCB0aGlzIHdheSBpZgorc29tZSBta3RlbXAoKSB2ZXJzaW9uIGRvZXMgTk9UIGFsdGVyIGl0cyBhcmd1bWVudCwgd2Ugc3RpbGwgaGF2ZSBhIHVzYWJsZQorZmlsZW5hbWUgKGxpa2UgL3RtcC9ja1hYWFhYWCkpLiAgT2YgY291cnNlIHRoaXMgd29uJ3QgYmUgZ29vZCBmb3IgcmVjdXJzaXZlCitNTFNEIGRvd25sb2FkcywgYnV0IHdlIGNhbiBhbHdheXMgaXNzdWUgcGF0Y2hlcyBmb3IgdGhlIFVuaXggdmVyc2lvbiBsYXRlciBpZgorbmVlZGVkLiAgVGhlIExpbnV4IGFuZCBCU0QgdmVyc2lvbnMgdXNlIG1rc3RlbXAoKSBhbnl3YXkuICBUaGVyZSBpcywgaG93ZXZlciwKK2EgZGFuZ2VyIG9mIGEgbWVtb3J5IGxlYWsgaW4gdGhlIFVuaXggdmVyc2lvbiBpZiB0aGUgdXNlciBoYXMgZGVmaW5lZCBhIFRNUERJUgorb3IgQ0tfVE1QIGVudmlyb25tZW50IHZhcmlhYmxlIHdob3NlIHZhbHVlIGlzIGxvbmdlciB0aGFuIDkgYnl0ZXMuICBBbGwgdGhpcworaXMgaGlnaGx5IHVubGlrZWx5IHNvIHdlIHNob3VsZCBiZSBPSy4gIGNrY2Z0cC5jLCAxNyBOb3YgMjAwMi4KKworLS0tIEs5NSAyLjEuMSBhbmQgdXBkYXRlZCBja1t1dl0yMDYue3Rhcix6aXB9IGJ1dCBub3QgQy1LZXJtaXQgYmluYXJpZXMgLS0tCisKK0Zyb20gSmVmZjogRml4ZXMgZm9yIFRlbG5ldCBDb20gUG9ydCBDb250cm9sLCB1cGRhdGUgdG8gYSBuZXdlciByZWxlYXNlIG9mCitPcGVuU1NMOiBja19zc2wuYyBja19zc2wuaCBja2NkZWIuaCBja2NmdHAuYyBja2NtYWkuYyBja2NuZXQuYyBja2N0ZWwuYworY2t1YXRoLmMgY2t1YXRoLmggY2t1Y25zLmMgY2t1dXM0LmMgY2t1dXM1LmMgY2t1dXNyLmMgY2t1dXNyLmggY2t2Y29uLmMKK2NrdmZpby5jIGNrdmtlci5jb20gY2t2dGlvLmMgY2t2dm1zLmgsIDI1IE5vdiAyMDAyLgorCistLS0gSzk1IDIuMS4yIGFuZCBDLUtlcm1pdCA4LjAgQ0RST00gLS0tCisKK0Zyb20gSmVmZiwgMjggTm92IDIwMDI6CisgLiBVcGRhdGVkIFNTTCBtb2R1bGVzOiBja19zc2wuW2NoXS4KKyAuIEZpeGVkIGNpcGhlci1saXN0IGRpc3BsYXkgaW4gU0hPVyBBVVRIICYgRlRQIHNzbF9hdXRoKCk6IGNrdXVzNy5jLiBja2NmdHAuYworIC4gU29tZSBtaW5vciB0bl93YWl0KCkgZml4ZXM6IGNrY3RlbC5jLgorIC4gUHJlbGltaW5hcnkgU1NMIHN1cHBvcnQgZm9yIFZNUyBDT05ORUNUOiBja3Zjb24uYy4KKworQnVtcGVkIEMtS2VybWl0IGVkaXQgbnVtYmVyIHRvIDIwNy4KKworRnJvbSBKZWZmLCAyOSBOb3YgMjAwMjogIltDLUtlcm1pdCB3YXMgZHVtcGluZyBjb3JlIG9uIFNDTyBPU1I1IFRlbG5ldCBDb20gUG9ydAorY29ubmVjdGlvbnMgYmVjYXVzZV0gdGhlIFNDTyBjb21waWxlciB0cmVhdHMgYWxsIGNoYXJhY3RlcnMgYXMgc2lnbmVkLiAgVGhpcword2FzIGNhdXNpbmcgJ3NwcmludGYoYnVmLCIwMnggIixjaCk7JyB0byBwcm9kdWNlIHN0cmluZ3Mgc3VjaCBhcyAiZmZmZmZmYzIiCitpbnN0ZWFkIG9mICJjMiIgZm9yIHZhbHVlcyBiZXR3ZWVuIDEyOCBhbmQgMjU1LiAgVGhpcyB3cm90ZSBiZXlvbmQgdGhlIGVuZCBvZgorYSBidWZmZXIgYW5kIGJsZXcgYXdheSB0aGUgc3RhY2suICBIYXZpbmcgZml4ZWQgdGhpcyBJIGFsc28gbm90aWNlZCB0aGF0Citjb25lY3QoKSBkaWQgbm90IHByb3Blcmx5IGNoZWNrIGZvciBjYXJyaWVyIHdoZW4gVE4gQ1BDIHdhcyBuZWdvdGlhdGVkLiAgVGhpcworaGFzIG5vdyBiZWVuIGZpeGVkIGFzIHdlbGwuIiAgY2t1Y25zLmMsIGNrdWNvbi5jLCBja2N0ZWwuYywgMjkgTm92IDIwMDIuCisKK0Zyb20gSmVmZiwgMzAgTm92IDIwMDI6IEZpeCBTU0wgZm9yIFZNUyBhbmQgYWxzbyBjYXJyeSBmb3J3YXJkIHRoZSBDUEMgZml4ZXMKK3RvIFZNUy4gIGNrY25ldC5jLCBja3Z0aW8uYywgY2t2Y29uLmMsIDMwIE5vdiAyMDAyLgorCitDaGFuZ2VkIGNvcHlyaWdodCBkYXRlcyB0aGF0IGFyZSBkaXNwbGF5ZWQgKGJ1dCBub3QgeWV0IGFsbCB0aGUgaW50ZXJuYWwKK29uZXMpIGZyb20gMjAwMiB0byAyMDAzLiAgY2tjbWFpLmMsIDMgSmFuIDIwMDMuCisKK0ZpeGVkIHRoZSBGVFAgbW9kdWxlJ3MgYnJpZWYtZm9ybWF0IHRyYW5zYWN0aW9uIGxvZywgd2hpY2ggaGFkIHRoZSBzdGF0dXMKK2ludmVydGVkOiBPSyBmb3IgRkFJTEVEIGFuZCB2LnYuICBja2NmdHAuYyAzIEphbiAyMDAzLgorCitGcm9tIEplZmYsIDQgSmFuIDIwMDM6CisgLiBNYWtlIC9NT1ZFLVRPOnh4eCBjb252ZXJ0IHh4eCB0byBmdWxsIHBhdGhuYW1lOiBja3V1c1tyNjddLmMsCisgLiBNYWtlIFNIT1cgT1BUSU9OUyBBTEwgc2hvdyBib3RoIGtpbmRzIG9mIG9wdGlvbnM6IGNrdXVzMi5jLgorIC4gTW9yZSBjb21tYW5kLWxpbmUgcGVyc29uYWxpdGllczogY2tjbWFpLmMsIGNrdXVzeS5jLgorIC4gTmV3IE5PU0NST0xMIGNvbW1hbmQgZm9yIEs5NTogY2t1dXNyLltjaF0sIGNrdXVzMi5jLgorIC4gTmV3IGxvY2tkb3duIGFuZCBvdGhlciBjb21tYW5kLWxpbmUgb3B0aW9uczogY2t1dXNyLmgsIGNrdXVzeS5jLgorIC4gU1NMIGludGVyZmFjZSB1cGRhdGVkIHRvIE9wZW5TU0wgMC45Ljc6IGNrX3NzbC5jLgorIC4gU0VUIFRFUk0gTElORS1TUEFDSU5HIGFuZCBDVVJTT1IgeHh4IE5PQkxJTks6IGNrdXVzWzI3XWMuCisgLiBFeHBhbmRlZCBTSE9XIEdVSSBjb21tYW5kOiBja3V1czMuYworIC4gTmV3IFNIT1cgVEFCUyBjb2RlOiBja3V1czUuYy4KKworVXBkYXRlZCBTVVBQT1JUIChCVUcpLCBORVdTLCBhbmQgSU5UUk8gdGV4dHMuICBja3V1c1syNl0uYy4gNSBKYW4gMjAwMy4KKworRml4ZWQgRlRQIG1vZHVsZSB0byBzdXBwcmVzcyAiJ0ZFQVQnOiBDb21tYW5kIG5vdCB1bmRlcnN0b29kIiBtZXNzYWdlCit1bmxlc3MgRlRQIERFQlVHIGlzIE9OLiAgY2tjZnRwLmMsIDYgSmFuIDIwMDMuCisKK0dvdCBhIHJlcG9ydCB0aGF0IEMtS2VybWl0IGR1bXBzIGNvcmUgb24gU29sYXJpcyB3aGVuIGV4ZWN1dGluZyBhIGNlcnRhaW4KK3NjcmlwdC4gIFNlZW1zIHRvIGJlIHJlbGF0ZWQgdG8gY2hhbmdpbmcgdm5hbWJ1ZltdIGluIHp6c3RyaW5nKCkgZnJvbSBhbgorYXV0b21hdGljIGFycmF5IHRvIGEgbWFsbG9jJ2QgYnVmZmVyIChzZWUgbm90ZXMgZnJvbSAyOSBKdW4gMjAwMCkuICBDaGFuZ2VkCitpdCB0byBhbiBhdXRvbWF0aWMgYnVmZmVyIGV4Y2VwdCBmb3IgSzk1LiAgY2t1dXM0LmMsIDYgSmFuIDIwMDMuCisKK05vcGUsIHRoYXQncyBub3QgaXQuICBJdCBldmlkZW50bHkgaGFwcGVucyBvbmx5IGFmdGVyIEZUUCBQVVQgaGFzIGJlZW4gdXNlZC4KK0ZpeGVkIHNvbGFyaXM5ZyBtYWtlZmlsZSB0YXJnZXQgdG8gaW5jbHVkZSAtZnVuc2lnbmVkLWNoYXIgYW5kIGJ1aWx0IGEgbmV3CitiaW5hcnkuICBEZXRlcm1pbmVkIHRoYXQgYnVpbGRpbmcgd2l0aCBnY2MgYW5kIC1mdW5zaWduZWQtY2hhciBtYWtlcyBubworZGlmZmVyZW5jZS4gIG1ha2VmaWxlLCA3IEphbiAyMDAzLgorCitJIGRpZCBhIHByZWxpbWluYXJ5IGF1ZGl0LCBsb29raW5nIGF0IHRoZSBpdGVtcyBpbiB0aGUgbGVmdCBjb2x1bW46IGlmIHVzZWQgaW4KK2EgZ2l2ZW4gcm91dGluZSwgYXJlIHRoZXJlIGFueSBvYnZpb3VzIG1pc3Rha2VzOgorCisgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgIDIgICAgICAgICAgMyAgICAgICAgICAgNCAgICAgICAgICAgICAgNQorICAgICAgICAgICAgICAgICAgIGRvZnRwcHV0LT5wdXRmaWxlLT5zZW5kcmVxdWVzdC0+ZG9mdHBzZW5kMi0+c2VjdXJlX3dyaXRlCittYWxsb2MgICAgICAgICAgICAgICAgT0sgICAgICAgT0sgICAgICAgICBPSyAgICAgICAgICBPSyAgICAgICAgICAgICBPSworbWFrZXN0ciAgICAgICAgICAgICAgIE9LICAgICAgIE9LICAgICAJICBPSyAgICAgICAgICBPSyAgICAJICAgICBPSworYXV0b21hdGljIGFycmF5cyAgICAgIE9LICAgICAgIE9LICAgICAJICBPSyAgICAgICAgICBPSyAgICAJICAgICBPSworW2NrXXN0cltuXWNweSAgICAgICAgIE9LICAgICAgIE9LICAgICAJICBPSyAgICAgICAgICBPSyAgICAJICAgICBPSworW2NrXXN0cltuXWNhdCAgICAgICAgIE9LICAgICAgIE9LICAgICAJICBPSyAgICAgICAgICBPSyAgICAJICAgICBPSworc3ByaW50ZiAgICAgICAgICAgICAgIE9LICAgICAgIE9LICAgICAJICBPSyAgICAgICAgICBPSyAgICAJICAgICBPSworbnpsdG9yICAgICAgICAgICAgICAgIE9LICAgICAgIE9LICAgICAJICBPSyAgICAgICAgICBPSyAgICAJICAgICBPSworemZucWZwICAgICAgICAgICAgICAgIE9LICAgICAgIE9LICAgICAJICBPSyAgICAgICAgICBPSyAgICAJICAgICBPSworbWVtY3B5ICAgICAgICAgICAgICAgIE9LICAgICAgIE9LICAgICAJICBPSyAgICAgICAgICBPSyAgICAJICAgICBPSworYmNvcHkgICAgICAgICAgICAgICAgIE9LICAgICAgIE9LICAgICAJICBPSyAgICAgICAgICBPSyAgICAJICAgICBPSworCitzZWN1cmVfd3JpdGUgc2VuZHMgdGhlIGRhdGEgZGlyZWN0bHkgb24gY2xlYXItdGV4dCBjb25uZWN0aW9ucy4gIE9uIHNlY3VyZQorY29ubmVjdGlvbnMsIGl0IGNhbGxzIHNlY3VyZV9wdXRidWYoKSwgd2hpY2ggY2FsbHMgc2VjdXJlX3B1dGJ5dGUoKSwgYnV0IHdlCithcmVuJ3QgdXNpbmcgdGhvc2UsIHNvIHNlY3VyZV93cml0ZSgpIGlzIHRoZSBlbmQgb2YgdGhlIGNhbGwgY2hhaW4gZm9yIEZUUAorUFVULiAgZG9mdHBzZW5kMiBoYXMgYnVmW10gYXMgYW4gYXV0b21hdGljIGFycmF5LCB3aGljaCBpdCByZWFkcyBmaWxlIGRhdGEKK2ludG8gdXNpbmcgenhpbiAoYmluYXJ5IG1vZGUgb25seSksIGJ1dCB0aGlzIGxvb2tzIE9LLiAgU3RpbGwsIEkgY2hhbmdlZCBpdAorcmVhZCAxIGxlc3MgdGhhbiB0aGUgYnVmZmVyIHNpemUgKGZyZWFkKSBqdXN0IGluIGNhc2UuICBBbHNvIHRoZXJlIHdhcyBvbmUKK2RlYnVnKCkgc3RhdGVtZW50IHRoYXQgcmVmZXJyZWQgdG8gYW4gYXV0b21hdGljIGFycmF5IChmdWxsbmFtZVtdKSBiZWZvcmUgaXQKK3dhcyBpbml0aWFsaXplZCAoYnV0IG5vdCB1c2VkIGluIHRoaXMgY2FzZSksIHdoaWNoIEkgZml4ZWQuICBja2NmdHAuYywKKzcgSmFuIDIwMDMuCisKK0ZUUCBHRVQgL1JFQ1VSU0lWRSBzb21lcGF0aC9zb21lZmlsZSBzdGlsbCBkaWRuJ3Qgd29yaywgZGVzcGl0ZSB3aGF0IHRoZQorbm90ZXMgb2YgMTkgU2VwIDIwMDEgc2F5LiAgVGhlcmUgYXJlIHNvIG1hbnkgcGF0aHMgdGhyb3VnaCB0aGUgY29kZSwKK2RlcGVuZGluZyBvbiBzd2l0Y2ggdmFsdWVzLCBHRVQgdnMgTUdFVCwgZXRjLCB0aGF0IGEgY3J1Y2lhbCBzcG90IHdhcyBtaXNzZWQuCitGaXhlZCBpbiBkb2Z0cGdldCgpOiBja2NmdHAuYywgNyBKYW4gMjAwMy4KKworQmFjayB0byB0aGUgY29yZSBkdW1wLi4uICBhZnRlciB0d28gZGF5cyBvZiBmdWxsLXRpbWUgZGVidWdnaW5nLCBJIGZvdW5kIHRoZQorY3VscHJpdDogdGhlIGJ1ZmZlci1mdWxsIHRlc3QgaW4gdGhlIHp6b3V0KCkgbWFjcm8gc2hvdWxkIGhhdmUgYmVlbiAiPj0iCityYXRoZXIgdGhhbiBqdXN0ICI+IiwgdGh1cyBLZXJtaXQgd3JvdGUgMSBieXRlIHBhc3QgdGhlIGVuZCBvZiB0aGUgbWFsbG9jJ2QKK0ZUUCBQVVQgb3V0cHV0IGJ1ZmZlciwgdWNidWYuICBXaHkgZGlkIGl0IG5ldmVyIGhhcHBlbiBpbiBLOTU/ICBCZWNhdXNlLCBzaW5jZQoraXQncyBhIHNlY3VyZSBidWlsZCwgRlVER0VfRkFDVE9SIGlzIGRlZmluZWQgdGhlcmUuICBCdXQgaXQncyBub3QgZGVmaW5lZCBpbgorU29sYXJpcyBvciBvdGhlciBjbGVhci10ZXh0IGJ1aWxkcy4gIEFsdGhvdWdoIHRoZSBjcmFzaCB3b3VsZG4ndCBoYXBwZW4gaW4KK3NlY3VyZSBidWlsZHMsIHRoZSAxLWJ5dGUgbGVhayBtaWdodCBoYXZlIGNhdXNlZCBlcnJvcnMgaW4gdGhlIGRhdGEgdHJhbnNmZXIuCitJbiBub24tU29sYXJpcyBjbGVhci10ZXh0IGJ1aWxkcywgbGlrZSBMaW51eCwgSSBzdXNwZWN0IHRoYXQgbWFsbG9jKCkgdGVuZHMKK2FkZCBzb21ldGhpbmcgZm9yIHNhZmV0eSAoZXNwZWNpYWxseSBnaXZlbiB0aGUgbWFuIHBhZ2Ugc3RhdGVtZW50IHRoYXQgaXQKK2FsbG9jYXRlcyAiYXQgbGVhc3QiIHdoYXQgeW91IGFza2VkIGZvcikuICBBbm90aGVyIHJlYXNvbiB0aGUgcHJvYmxlbSBlc2NhcGVkCitub3RpY2UgaXMgdGhhdCB6em91dCgpIGlzIHVzZWQgb25seSBmb3IgdGV4dC1tb2RlIFBVVHMgKGFuZCB0aGVuIG9ubHkgd2hlbgordGhlcmUgaXMgbm8gY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiksIGJ1dCBtb3N0IHRyYW5zZmVycyB0aGVzZSBkYXlzIGFyZQorYmluYXJ5IGFuZC9vciBkb3dubG9hZHMuICBBbnl3YXksIGluIHRoZSBjb3Vyc2Ugb2YgZGVidWdnaW5nLCBhIGxvdCBvZiBzbWFsbAorY2xlYW51cHMgd2VyZSBkb25lOiBzaXplb2YoYmxhaCkgZm9yIGFsbCBhcnJheXMgd2FzIHJlcGxhY2VkIGJ5IHRoZSBzYW1lCitzeW1ib2xpYyBzaXplIHRoYXQgd2FzIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGFycmF5LCBudW1lcmljIGFycmF5IHNpemVzIHdlcmUKK3JlcGxhY2VkIHdpdGggc3ltYm9saWMgb25lcywgZXRjLiAgVGhlIHJlYWwgZml4IGlzIG9uZSBjaGFyYWN0ZXIgbG9uZy4KK2NrY2Z0cC5jLCA5IEphbiAyMDAzLgorCitHb3QgYSByZXBvcnQgdGhhdCAibWdldCAvcmVjdXJzaXZlICovc29tZWRpci8qIiBkb3dubG9hZGVkIHRoZSBmaWxlcyBpbnRvCit0aGUgY3VycmVudCBkaXJlY3RvcnksIHJhdGhlciB0aGFuIHJlLWNyZWF0aW5nIHRoZSByZW1vdGUgZGlyZWN0b3J5IHN0cnVjdHVyZS4KK0ZpeGVkIGluIGRvZnRwZ2V0KCk6IGNrY2Z0cC5jLCAxMCBKYW4gMjAwMy4KKworVW5peCBDLUtlcm1pdCBkaWQgbm90IGFsbG93IGZpbGUgdHJhbnNmZXIgaWYgc3RhcnRlZCB1bmRlciBpbmV0ZCBhbmQgYWNjZXNzZWQKK3ZpYSBJbnRlcm5ldCByYXcgc29ja2V0IChvciB3aGF0ZXZlcikuICBEaWFnbm9zaXM6IGlzYXR0eSgpIGFuZCBmcmllbmRzIHdvdWxkCitmYWlsIGNhdXNpbmcgdHRvcGVuKCkgdG8gZmFpbC4gIEZpeGVkIGJ5IGFkZGluZyBlc2NhcGUgY2xhdXNlcyBmb3IgIi1sIDAiCitzaXR1YXRpb25zIChpLmUuIEtlcm1pdCBpbnZva2VkIHdpdGggYW4gYWxyZWFkeS1vcGVuIGZpbGUgZGVzY3JpcHRvcikgYXQgdGhlCithcHByb3ByaWF0ZSBwbGFjZXMuICBja2NtYWkuYywgY2t1dGlvLmMsIDE0IEphbiAyMDAzLgorCitGcm9tIEplZmYgZm9yIEs5NSAyLjEuMworIC4gQWRkIHRlc3QgZm9yIHN0YXJ0ZmxhZ3MgJiAxMjggdG8gdHJhcCgpIGZvciBpZ25vcmluZyBCUkVBSy4KKyAuIEZpeCBmb3IgU0hPVyBUUkFOU01JVC4KKworLS0tIEs5NSAyLjEuMyAtLS0KKworRlRQIFVTRVIsIEZUUCBBQ0NPVU5ULCBwbHVzIHRoZSB2YXJpb3VzIHByb21wdHMgYW5kIHN3aXRjaGVzIGZvciBGVFAgdXNlcm5hbWUsCitwYXNzd29yZCwgYW5kIGFjY291bnQgYWxsIG5lZ2xlY3RlZCB0byBzdHJpcCBxdW90ZXMsIGFuZCBpbiBtb3N0IGNhc2VzIHF1b3RlcworYXJlIG5lY2Vzc2FyeSB0byBzcGVjaWZ5IGEgdXNlcm5hbWUgdGhhdCBjb250YWlucyBzcGFjZXMuICBja2NmdHAuYywKKzE1IEphbiAyMDAzLgorCitGVFAgTVBVVCBmMSBmMiBmMy4uLiBnZXRzIGEgcGFyc2UgZXJyb3IgaWYgYW55IG9mIHRoZSBmbidzIGRvIG5vdCBtYXRjaCBhbgorZXhpc3RpbmcgZmlsZS4gIFRoaXMgaXMgYmFkIGZvciBzY3JpcHRzLiAgSW4gZG9mdHBwdXQoKSwgY21mZGIoKSBsb29rcyBmb3IKK2tleXdvcmRzIChzd2l0Y2hlcykgb3IgQ01JRkkuICBXaGVuIGl0IGhpdHMgQ01JRkksIGl0IGV4aXRzIGZyb20gdGhlIGluaXRpYWwKK3BhcnNlIGxvb3AgYW5kIHRoZW4gZG9lcyBhZGRpdGlvbmFsIGNtaWZpKClzIGluIGEgbG9vcCB1bnRpbCBkb25lLiAgVGhlIG1vc3QKK29idmlvdXMgZml4IGlzIHRvIHBhcnNlIGVhY2ggZmllbGQgd2l0aCBjbWZkYihDTUlGSSxDTUZMRCksIGkuZS4gZmFsbCBiYWNrIHRvCitDTUZMRCBpZiBDTUlGSSBkb2Vzbid0IG1hdGNoIGFueXRoaW5nLiAgVGhlbiBpZiBDTUZMRCB3YXMgdXNlZCwgd2UgZG9uJ3QgYWRkCit0aGUgZmlsZXNwZWMgdG8gdGhlIGxpc3QuICBUaGlzIGlzIGEgcmF0aGVyIGJpZyBjaGFuZ2UgYnV0IGl0IHNlZW1zIHRvIHdvcmsuCitObyBlcnJvciBtZXNzYWdlcyBvciBmYWlsdXJlcyBoYXBwZW4gZm9yIG5vbi1tYXRjaGluZyBmaWVsZHMsIGJ1dCBhbiBlcnJvcgorbWVzc2FnZSBpcyBwcmludGVkIChhbmQgdGhlIE1QVVQgY29tbWFuZCBmYWlscykgaWYgbm9uZSBvZiB0aGUgZmllbGRzIG1hdGNoCithbnkgZmlsZXMuICBUaGlzIGZpeCBnb3QgaW4gdG9vIGxhdGUgZm9yIDIuMS4zOyB3b3JrYXJvdW5kOiB1c2UgQy1TaGVsbAorbGlrZSB3aWxkY2FyZCBsaXN0IChmdHAgbXB1dCAieyouYWJjLGZvby4qfSIpLiAgY2tjZnRwLmMsIDE2IEphbiAyMDAzLgorCitHUkVQIGRpZCBub3QgcGFzcyBpdHMgcGF0dGVybiB0aHJvdWdoIHRoZSBleHBhbmRlciwgdGh1cyB2YXJpYWJsZXMgY291bGQKK25vdCBiZSB1c2VkIGZvciBwYXR0ZXJucy4gIFRoaXMgbXVzdCBoYXZlIGJlZW4gYW4gb3ZlcnNpZ2h0IC0tIEkgY2FuJ3QgZmluZAorYW55dGhpbmcgaW4gbXkgbm90ZXMgYWJvdXQgaXQuICBGaXhlZCBpbiBkb2dyZXAoKTogY2t1dXM2LmMsIDI0IEphbiAyMDAzLgorCitOZXcgbWFrZWZpbGUgdGFyZ2V0IGZvciBIUC1VWCAxMS54eCB3aXRoIE9wZW5TU0wgZnJvbSBUYXBhbmkgVGFydmFpbmVuLgorbWFrZWZpbGUsIDMxIEphbiAyMDAzLgorCitGcm9tIEplZmY6CisgLiBBdm9pZCBjb3JlIGR1bXAgd2hlbiBkZXJlZmVyZW5jaW5nIHRuY19nZXRfc2lnbmF0dXJlKCk6IGNrdXVzNC5jLgorIC4gQnVtcCB2ZXJzaW9uIG51bWJlcnMgdG8gOC4wLjIwOCwgMi4xLjQ6IGNrY21haS5jLgorCitBZGRlZCAvTk9MT0dJTiB0byBGVFAgW09QRU5dLiAgY2tjZnRwLmMsIDEwIEZlYiAyMDAzLgorCitEb24ndCBkdW1wIGNvcmUgaWYgRlRQIERFQlVHIGlzIE9OIGFuZCBGVFAgT1BFTiBkb2VzIG5vdCBpbmNsdWRlIGEgc2VydmljZS4KK29wZW5mdHAoKTogY2tjZnRwLmMsIDEwIEZlYiAyMDAzLgorCitIRUxQIFBBVFRFUk4gdGV4dCBpbmNvcnJlY3RseSBpZGVudGlmaWVkIGNvbW1hbmRzIGFuZCBmdW5jdGlvbnMgd2l0aAorZmxvYXRpbmcgYW5kIGFuY2hvcmVkIHBhdHRlcm5zLiAgVGhlIGNvcnJlY3RlZCBsaXN0cyBhcmU6CitGbG9hdGluZzogR1JFUCwgVFlQRSAvTUFUQ0g6LCAvRVhDRVBUOiBwYXR0ZXJucywgXGZhcnJheWxvb2soKSwKK0FuY2hvcmVkOiBJRiBNQVRDSCwgZmlsZS1tYXRjaGluZyB3aWxkY2FyZHMsIFxmc2VhcmNoKCksIFxmcnNlYXJjaCgpCitja3V1czIuYywgMTAgRmViIDIwMDMuICAgICAKKworSU5QVVQgbiBcZnBhdHRlcm4oeHh4KSBkaWQgbm90IHdvcmsgZm9yIGNhc2UtaW5kZXBlbmRlbnQgY29tcGFyaXNvbnMuCitGaXhlZCBpbiBkb2lucHV0KCk6IGNrdXVzNC5jLCAxMCBGZWIgMjAwMy4KKworSXQgc2VlbXMgXGZwYXR0ZXJuKCkgZGlkbid0IHdvcmsgd2l0aCBNSU5QVVQgYXQgYWxsLiAgVGhlcmUgd2FzIG5vIGNvZGUgdG8KK2hhbmRsZSBcZnBhdHRlcm4oKSBpbiB0aGUgTUlOUFVUIHBhcnNlIGxvb3AsIHNvIGl0IG5ldmVyIHdvcmtlZC4gIFRoZSBjb2RlCitoYWQgdG8gYmUgdG90YWxseSByZXdyaXR0ZW4gdG8gdXNlIGNtZmxkKCkgaW4gYSBsb29wLCByYXRoZXIgdGhhbiBjbXR4dCgpCithbmQgdGhlbiBja3NwbGl0KCkuICBGdXJ0aGVybW9yZSwgd2hlbmV2ZXIgYW55IG9mIHRoZSBmaWVsZHMgd2FzIGFuCitcZmpvaW4oKSwgdGhpcyBoYWQgdG8gYmUgc3BsaXQuICBja3V1c3IuYywgMTAgRmViIDIwMDMuCisKK01hY3JvIHJlcGxhY2VtZW50IHZpYSBcbSgpIGFuZCBcZmRlZmluaXRpb24oKSBkb2VzIG5vdCB3b3JrIGFzIGFkdmVydGlzZWQKKyhpLmUuIGNhc2Ugc2Vuc2l0aXZlbHkpIGZvciBhc3NvY2lhdGl2ZSBhcnJheSBlbGVtZW50czsgZS5nLiBcbSh4eHg8YWJjPikgaXMKK3RyZWF0ZWQgdGhlIHNhbWUgYXMgXG0oeHh4PEFCQz4pLCBjb250cmFyeSB0byBzZWN0aW9uIDcuMTAuMTAgb2YgdGhlIEMtS2VybWl0Cis3LjAgdXBkYXRlIG5vdGVzLCBhbmQgdG8gdGhlIGZhY3QgdGhhdCB0aGUgdHdvIHJlYWxseSBkbyBleGlzdCBzZXBhcmF0ZWx5LgorRml4ZWQgYnkgYWRkaW5nIGEgc3RhdGljIGZ1bmN0aW9uIGlzYWFycmF5KHMpIHdoaWNoIHN1Y2NlZWRzIGlmIHMgaXMgYW4KK2Fzc29jaWF0aXZlIGFycmF5IHJlZmVyZW5jZSBhbmQgZmFpbHMgb3RoZXJ3aXNlLCBhbmQgdGhlbiBoYXZpbmcgXG0oKQorYW5kIFxmZGVmKCkgY2FsbCBteHhsb29rKCkgKGNhc2Utc2Vuc2l0aXZlIGxvb2t1cCkgaWYgaXNhYXJyYXkoKSwgb3RoZXJ3aXNlCisoYXMgYmVmb3JlKSBteGxvb2soKSkuICBja3V1czQuYywgMTEgRmViIDIwMDMuCisKK0ZpeGVkIEZUUCBPUEVOIHRvIGFsbG93IHRoZSAvVVNFUiBzd2l0Y2ggdG8gb3ZlcnJpZGUgU0VUIEZUUCBBVVRPTE9HSU4gT0ZGLAoranVzdCBhcyAvTk9MT0dJTiBvdmVycmlkZXMgU0VUIEZUUCBBVVRPTE9HSU4gT04uICBja2NmdHAuYywgMTEgRmViIDIwMDMuCisKK0luIEs5NSwgInNldCBrZXkgXDEyMzQgXDI3SCIgKGFueSBTRVQgS0VZIGNvbW1hbmQgaW4gd2hpY2ggdGhlIGZpcnN0IGNoYXIgb2YKK3RoZSBkZWZpbml0aW9uIHdhcyBiYWNrc2xhc2gsIGFuZCB0aGUgT05MWSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGJhY2tzbGFzaAorcXVhbnRpdHkgd2FzIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIHRoYXQgbGV0dGVyIHdvdWxkIGJlIGxvd2VyY2FzZWQpLiAgRGlhZ25vc2lzOgoreGxvb2t1cCgpIHBva2luZyBpdHMgYXJndW1lbnQgKHNlZSBub3RlcyBmcm9tIEp1bHkgMjAwMCkuICBKZWZmIHNlbnQgYSBmaXguCitja3VjbWQuYywgMTUgRmViIDIwMDMuCisKK1JhbiBteSBTLUV4cHJlc3Npb24gdG9ydHVyZSB0ZXN0IHRvIG1ha2Ugc3VyZSBTZXhwcyBzdGlsbCB3b3JrZWQuICBUaGV5IGRvLAorZXhjZXB0IHRoZSBiaXR3aXNlICYgYW5kIHwgb3BlcmF0b3JzIHdlcmUgYnJva2VuLCBlLmcuICgmIDcgMikgYW5kICh8IDEgMiA0KQorZ2V0ICJJbnZhbGlkIG9wZXJhbmQiIGVycm9ycy4gIEplZmYncyBjb2RlIGhhZCBhZGRlZCBhbiBlYXJseSBmYWlsdXJlIHJldHVybgorZnJvbSB0aGUgbG9va3VwIGxvb3Agd2hlbiB3aGVuIGEgc2luZ2xlLWJ5dGUga2V5d29yZCBtYXRjaGVkIGEga2V5d29yZCB0aGF0CitzdGFydGVkIHdpdGggdGhlIHNhbWUgYnl0ZSBidXQgd2FzIG1vcmUgdGhhbiBvbmUgYnl0ZSBsb25nLiAgU28gIiYiIHdvdWxkIGhpdAorIiYmIiBhbmQgZmFpbCBpbnN0ZWFkIG9mIGNvbnRpbnVpbmcgaXRzIHNlYXJjaCAoeGxvb2t1cCB0YWJsZXMgYXJlbid0IHNvcnRlZAorc28gdGhlcmUgY2FuIGJlIG5vIGVhcmx5IHJldHVybikuICBGaXhlZCBpbiB4bG9va3VwKCk6IGNrdWNtZC5jLCAxNiBGZWIgMjAwMy4KKworR290IHJpZCBvZiAia3JibWl0IiB0YXJnZXQgZnJvbSBtYWtlZmlsZS4gIEl0J3Mgc3RpbGwgdGhlcmUsIGJ1dCB3ZSBkb24ndAordXNlIGl0IGFueSBtb3JlLiAgQWxsIHNlY3VyZSB0YXJnZXRzIG5vdyB1c2UgInhlcm1pdCIsIGFuZCBwcm9kdWNlIGEgYmluYXJ5CitjYWxsZWQgd2VybWl0LCBqdXN0IGxpa2UgdGhlIHJlZ3VsYXIgb25lcyBkbyAoZXhjZXB0IHRoZSBvbGQgY2t1Y29uLmMgb25lcykuCitOb24tc2VjdXJlIHRhcmdldHMsIHNpbmNlIHRoZXkgZG9uJ3QgZGVmaW5lIGFueSBvZiB0aGUgc2VjdXJpdHkgc3ltYm9scywKK3dpbmQgdXAgY29tcGlsaW5nIGFuZCBsaW5raW5nIHRvIChtb3N0bHkpIGVtcHR5IHNlY3VyaXR5IG1vZHVsZXMuICBtYWtlZmlsZSwKKzE1IEZlYiAyMDAzLgorCitBZGRlZCBcZmN2dGRhdGUoeHh4LDMpIHRvIGZvcm1hdCBpdHMgcmVzdWx0IGluIE1EVE0gZm9ybWF0ICh5eXl5bW1kZGhobW1zcywKK2FsbCBudW1lcmljLCBubyBzcGFjZXMgb3IgcHVuY3R1YXRpb24pLiAgT2YgY291cnNlIHRoZXNlIG51bWVyaWMgc3RyaW5ncworYXJlIHRvbyBiaWcgdG8gYmUgMzItYml0IG51bWJlcnMgYW5kIGFyZSB1c2VsZXNzIGZvciBhcml0aG1ldGljLCBidXQgdGhleSdyZQordXNlZnVsIGZvciBsZXhpY2FsIGNvbXBhcmlzb24sIGV0Yy4gIGNrdXVzWzI0XS5jLCAxNiBGZWIgMjAwMy4KKworVGhlIGZvbGxvd2luZyBGVFAgY29tbWFuZHMgZGlkIG5vdCBzZXQgRkFJTFVSRSB3aGVuIHRoZXkgZmFpbGVkOiBSTURJUiwKK0NELCBDRFVQLCBGaXhlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBkb2Z0cGJsYWgoKSByb3V0aW5lcy4gIGNrY2Z0cC5jLAorMTYgRmViIDIwMDMuCisKK1JFTkFNRSB3b3VsZCBzb21ldGltZXMgbm90IHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBpdCBmYWlsZWQsIGUuZy4gaW4gSzk1Cit3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGFscmVhZHkgZXhpc3RlZC4gIGNrdXVzNi5jLCAxNyBGZWIgMjAwMy4KKworRml4ZWQgQ09QWSBlcnJvciBtZXNzYWdlcywgd2hpY2ggZGlkIG5vdCBjb21lIG91dCBpbiBzdGFuZGFyZCBmb3JtYXQgd2hlbgorL0xJU1Qgd2FzIG5vdCBpbmNsdWRlZC4gIGNrdXVzNi5jLCAxNyBGZWIgMjAwMy4KKworRml4ZWQgI2lmZGVmcyBpbiBja19jcnAuYyB0byBhbGxvdyBub25zZWN1cmUgYnVpbGRzIG9uIG9sZCBwbGF0Zm9ybXMgbGlrZQorU3lzdGVtIFYvNjggUjMuICAxOSBGZWIgMjAwMy4KKworU2ltaWxhciB0cmVhdG1lbnQgZm9yIGNrX3NzbC5jLiAgMjAgRmViIDIwMDMuCisKK0Zyb20gSmVmZiwgMjEgRmViIDIwMDM6CisgLiBBSVg1MyBhbmQgQUlYNTIgc3ltYm9scyBmb3IgY2tjZGViLmgsIG1ha2VmaWxlLgorIC4gTmV3IGdjYyB0YXJnZXRzIGZvciB2YXJpb3VzIEFJWCA0LngvNS54IHZlcnNpb25zOiBtYWtlZmlsZS4KKyAuIENvcHlyaWdodCBkYXRlIHVwZGF0ZXM6IGNrX2NycC5jLCBja19zc2wuYy4KKyAuIEVOQUJMRS9ESVNBQkxFIFFVRVJZIGJyb2tlbiBiZWNhdXNlIGtleXdvcmQgdGFibGUgb3V0IG9mIG9yZGVyOiBja3V1c3IuYy4KKyAuIEZpeGVkIHRoZSB1c2Ugb2YgSFRUUCBwcm94aWVzIGZvciBIVFRQIFtSRV1PUEVOIGZvciBVbml4OiBja2NuZXQuYy4KKworQWxzbyBmb3IgSzk1IG9ubHk6IEFsbG93IGZpbGUgdHJhbnNmZXIgd2hlbiBLOTUgaXMgaW52b2tlZCBvbiB0aGUgcmVtb3RlIGVuZAorb2YgYSBjb25uZWN0aW9uIHRvIGEgUHJhZ21hIFN5c3RlbXMgVGVybWluYWwgU2VydmVyIGNvbm5lY3Rpb247IGF1dG9tYXRpY2FsbHkKK1NFVCBFWElUIEhBTkdVUCBPRkYgd2hlbiBpbnZva2VkIHdpdGggb3BlbiBwb3J0IGhhbmRsZSAoIms5NSAtbCBubm5uIikuCisKKyJjZCBhKiIgZmFpbGVkIGV2ZW4gd2hlbiAiYSoiIG1hdGNoZWQgb25seSBvbmUgZGlyZWN0b3J5LiAgRml4ZWQgaW4gY21pZmkoKToKK2NrdWNtZC5jLCAyMSBGZWIgMjAwMy4KKworSW4gdGhlIFVuaXggdmVyc2lvbiwgcmVwbGFjZSAiZXh0ZXJuIGludCBlcnJubzsiIHdpdGggIiNpbmNsdWRlIDxlcnJuby5oPiIKK2lmIF9fR0xJQkNfXyBpcyBkZWZpbmVkLCBzaW5jZSBnbGliYyBub3cgZGVmaW5lcyBhIHRocmVhZC1zcGVjaWZpYyBlcnJuby4KK2NrY2RlYi5oLCAyNiBGZWIgMjAwMy4KKworQWRkZWQgI2lmZGVmcyB0byBza2lwIGNvbXBpbGF0aW9uIG9mIGNrdWF0aC5jIGluIG5vbnNlY3VyZSBidWlsZHMuICBUZXN0ZWQKK2J5IGJ1aWxkaW5nIGJvdGggc2VjdXJlIGFuZCByZWd1bGFyIHZlcnNpb25zIGluIExpbnV4LiAgY2t1YXRoLmMsIDI2IEZlYiAyMDAzLgorCitSYW4gdGhlIGJ1aWxkLWluLTg0LWRpZmZlcmVudC1jb25maWd1cmF0aW9ucyBzY3JpcHQgb24gTGludXggdG8gbWFrZSBzdXJlIGl0CitzdGlsbCBidWlsZHMgd2l0aCBhbGwgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBmZWF0dXJlIHNlbGVjdGlvbiBvcHRpb25zLgorQWxsIE9LLiAgMjYgRmViIDIwMDMuCisKK0J1aWx0IG9uIFZNUy4gIE5lZWRlZCB0byBhZGQgYSBwcm90b3R5cGUgZm9yIG14eGxvb2sqKCkgdG8gY2t1dXNyLmg7IGJ1aWx0CitPSyBvdGhlcndpc2UuICAyNiBGZWIgMjAwMy4KKworRnJvbSBKZWZmOiBNb3JlICNpZmRlZiBzaHVmZmxpbmcgZm9yIG5vbnNlY3VyZSBidWlsZHM6IGNrdWF0aC5jLCBja19zc2wuYywKKzI3IEZlYiAyMDAzLgorCitBZGRlZCBjb2RlIHRvIGVuc3VyZSBcdihkb3dubG9hZCkgZW5kcyBpbiBhIGRpcmVjdG9yeSBzZXBhcmF0b3IgaW4gVW5peCwKK1dpbmRvd3MsIGFuZCBPUy8yLiAgY2t1dXM3LmMsIDI3IEZlYiAyMDAzLgorCitBZGRlZCBjb2RlIHRvIEs5NSB6Zm5xZnAoKSB0byB0YWNrIG9uIGRpcmVjdG9yeSBzZXBhcmF0b3Igd2hlbiByZXR1cm5pbmcKK2EgZGlyZWN0b3J5IG5hbWUuICBja29maW8uYywgMjcgRmViIDIwMDMuCisKK1NvbWVob3cgYW4gb2xkIGNvcHkgb2YgY2t1YXRoLmMgcG9wcGVkIHRvIHJlcGxhY2UgdGhlIG5ldyBvbmUuICBQdXQgdGhlIG5ldworb25lIGJhY2suICAyOCBGZWIgMjAwMy4KKworRnJvbSBKZWZmOiBGaXggdHlwbyBpbiBteSBLOTUgemZucWZwKCkgY29kZSBmcm9tIHllc3RlcmRheTsgZml4ZXMgZm9yIGhhbmRsaW5nCitVTkNzIHVuaWZvcm1seSwgbm8gbWF0dGVyIHdoaWNoIHdheSB0aGVpciBzbGFzaGVzIGFyZSBsZWFuaW5nLiAgY2tvZmlvLmMsCisyOCBGZWIgMjAwMy4KKworQXQgSmVmZiBNZXplaSdzIHN1Z2dlc3Rpb24sIHNlcGFyYXRlIHRleHQgYW5kIGJpbmFyeSBtb2RlIG9wZW4gc2VxdWVuY2VzCitmb3IgVk1TIHNlc3Npb24gbG9nLiAgY2t2ZmlvLmMsIDI4IEZlYiAyMDAzLgorCitBZGRlZCBmcmVlYnNkNDggdGFyZ2V0IGZvciBGcmVlQlNEIDQuOC4gIG1ha2VmaWxlLCAxIE1hciAyMDAzLgorCitDaGFuZ2VkIE1hYyBPUyBYIGVudHJpZXMgdG8gaW5jbHVkZSAtRFVTRV9TVFJFUlJPUi4gIG1ha2VmaWxlLCAyIE1hciAyMDAzLgorCitGaXhlZCBHRVRPSyAvR1VJIHRvIGV2YWx1YXRlIGl0cyB0ZXh0IGFyZ3VtZW50LiAgY2t1dXM2LmMsIDMgTWFyIDIwMDMuCisKK0plZmYgZml4ZWQgdGhlIEs5NSBEaWFsZXIgUVVJQ0sgZGlhbG9nIHRvIChhKSBhbGxvdyB0ZW1wbGF0ZXMsIGFuZCAoYikgaGF2ZQorYSBTYXZlLUFzIG9wdGlvbi4gIDMgTWFyIDIwMDMuCisKK0plZmYgZml4ZWQgYSBwcm9ibGVtIHdpdGggdGhlIFhtb2RlbS1DUkMgY2hlY2tzdW0gYmVpbmcgY3J1bmNoZWQgd2hlbmV2ZXIKK3RoZXJlIHdhcyBhIHJldHJhbnNtaXNzaW9uLiAgNyBNYXIgMjAwMy4KKworQWRkZWQgdGFyZ2V0L2Jhbm5lciBmb3IgVHJ1NjQgNS4xQi4gIG1ha2VmaWxlLCBja3V2ZXIuaCwgNSBNYXIgMjAwMy4KKworSW4gVW5peCwgdGhlIHpjb3B5KCkgcm91dGluZSAodXNlZCBieSB0aGUgQ09QWSBjb21tYW5kKSByZXNldCB0aGUgdXNlcidzIHVtYXNrCit0byAwIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBLZXJtaXQgcHJvY2VzcyBsaWZldGltZS4gIFRoZSBidWcgd2FzIGluCitja3VmaW8uYyA4LjAuMTk0LCAyNCBPY3QgMjAwMiwgYW5kIGlzIGZpeGVkIGluIGNrdWZpby5jIDguMC4xOTUsIDYgTWFyIDIwMDMuCitPZiBjb3Vyc2UgdGhpcyBoYXBwZW5lZCBhZnRlciBidWlsZGluZyAxNTUgQy1LZXJtaXQgOC4wLjIwOCBiaW5hcmllcy4gIChCdXQKK2JlZm9yZSBvZmZpY2lhbGx5IHJlbGVhc2luZyA4LjAuMjA4LikKKworSW4gdGhlIFZNUyB2ZXJzaW9uLCBjaGFuZ2VkOgorCisgICAgICAgIHdoaWxlICgobi0tKSAmJiB4eF9pbmMoMikgPiAtMSkgOwordG86CisgICAgICAgIHdoaWxlICgobi0tKSAmJiB4eF9pbmMoMikgPj0gMCkgOworCit0byBzdXBwcmVzcyB0aGUgIi4uLmlzIGJlaW5nIGNvbXBhcmVkIHdpdGggYSByZWxhdGlvbmFsIG9wZXJhdG9yIHRvIGEgY29uc3RhbnQKK3dob3NlIHZhbHVlIGlzIG5vdCBncmVhdGVyIHRoYW4gemVybyIgd2FybmluZy4gIGNrdnRpby5jLCA3IE1hciAyMDAyLgorCitBZGRlZCBhIGRlYnVnIGNhbGwgdG8gZG9sb2dlbmQgaW4gaG9wZXMgb2YgY2F0Y2hpbmcgb3ZlcnplYWxvdXMgTG9jdXMKK3N3aXRjaGluZywgd2hpY2ggc2VlbXMgdG8gaGFwcGVuIG9ubHkgaW4gSzk1LiAgY2t1dXMzLmMsIDcgTWFyIDIwMDIuCisKK1JlYnVpbHQgYmluYXJpZXMgZm9yIHNvbWUgb2YgdGhlIG1vcmUgY3VycmVudCBVbml4IHJlbGVhc2VzOiBBSVggNC4zLjMtNS4xLAorU29sYXJpcyA3LTkgLCBSZWQgSGF0IDcuMC04LjAsIFNsYWNrd2FyZSA4LjEsIEZyZWVic2QgNC43LTQuOCwgTmV0QlNEIDEuNiwKK09wZW5CU0QgMy4yLCBVbml4d2FyZSA3LjEuMywgT3BlbiBVbml4IDgsIE9TUjUuMC42YSwgZXRjLiAgQSBVbml4IGJpbmFyeSB3aXRoCitDT1BZIHVtYXNrIGZpeCBzaG93cyBhIDYgTWFyIDIwMDMgZGF0ZSBmb3IgIlVOSVggRmlsZSBzdXBwb3J0IiBpbiBTSE9XCitWRVJTSU9OUzsgYSBiaW5hcnkgd2l0aG91dCB0aGUgZml4IHNob3dzIDI0IE9jdCAyMDAyLgorCitDLUtlcm1pdCA4LjAuMjA4IGRhdGVkIDE0IE1hcmNoIDIwMDMgcmVsZWFzZWQgb24gMTAgTWFyY2ggMjAwMy4KKworLS0tOC4wLjIwOC0tLQorCitGcm9tIEplZmYgMTMgTWFyIDIwMDM6CisgLiBVcGRhdGVkIFNTTCBtb2R1bGUgYWxsb3dzIGltcG9ydGF0aW9uIG9mIHRpY2tldHMgZnJvbSBob3N0LgorIC4gZnJlZWJzZDUwK29wZW5zc2wgdGFyZ2V0OiBtYWtlZmlsZS4KKyAuIEZUUCBQVVQgL1BFUk1JU1NJT05TIGVycm9yIG1lc3NhZ2UgZm9yIEs5NTogY2tjZnRwLmMuCisgCitGaXhlZCBNSU5QVVQgdG8gc3RyaXAgcXVvdGVzIG9yIGJyYWNlcyBmcm9tIGFyb3VuZCB0YXJnZXRzICh0aGlzIHdhcyBicm9rZW4KK29uIEZlYiAxMHRoKS4gIFRoYW5rcyB0byBKYXNvbiBIZXNrZXR0IGZvciBkaXNjb3ZlcmluZyBhbmQgcmVwb3J0aW5nIHRoaXMKKyhraWxsZXIpIGJ1Zy4gIGNrdXVzci5jLCAxNCBNYXIgMjAwMy4KKworQ2hhbmdlZCB2ZXJzaW9uIG51bWJlciB0byAyMDkgRGV2LjAwLiAgY2tjbWFpLmMsIDE0IE1hciAyMDAzLgorCitXaGlsZSBkZWJ1Z2dpbmcgdGhlIGFscGhhcGFnZSBzY3JpcHQsIEkgZm91bmQgdGhhdCB0aGUgY29tbWFuZCAibWlucHV0IDggXDZcMTMKK1wyMVwxMyBcMTNcMjdcNFwxMyBcMzBcMTMiIGdldHMgIj9Ob3QgY29uZmlybWVkIiBpbiA4LjAuMjA4IGFuZCA4LjAuMjA5LCBidXQKK25vdCBpbiAyMDYgYW5kIGVhcmxpZXIuICBUaGlzIHByb2JsZW0gdG9vIHdhcyBpbnRyb2R1Y2VkIG9uIEZlYiAxMHRoIGJ5CitjaGFuZ2luZyBNSU5QVVQgcGFyc2luZyBmcm9tIGNtdHh0KCkgZm9sbG93ZWQgYnkgY2tzcGxpdCgpIHRvIGNtZmxkKCkgaW4gYQorbG9vcC4gIGNtZmxkKCkgdXNlcyBzZXRhdG0oKSB0byByZXR1cm4gaXRzIHJlc3VsdCBhbmQgb2YgY291cnNlIHNldGF0bSgpCiticmVha3Mgb24gXDEzLiAgQ2hhbmdpbmcgc2V0YXRtKCkgbm90IHRvIGRvIHRoaXMgd291bGQgYnJlYWsgZXZlcnl0aGluZyBlbHNlLgorQnV0IGNtZmxkKCkgaGFzIG5vIGFyZ3VtZW50cyB0aGF0IGxldCB1cyB0ZWxsIGl0IHRvIGRvIGFueXRoaW5nIGRpZmZlcmVudCBpbgordGhpcyBjYXNlLiAgQ2hhbmdpbmcgdGhlIEFQSSB3b3VsZCBiZSBhIGRpc2FzdGVyLiAgVGhlIG9ubHkgc29sdXRpb24gaXMgdG8gYWRkCithbiAiTUlOUFVUIEFDVElWRSIgKG1pbnB1dGFjdGl2ZSkgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgdGVsbHMgY21mbGQoKSB0byB0ZWxsCitzZXRhdG0oKSBub3QgdG8gYnJlYWsgb24gQ1IuICBOb3cgTUlOUFVUIHdpdGggYnJhY2VkIHRhcmdldHMgY29udGFpbmluZyBDUgorYW5kL29yIExGIHdvcmtzIGluIDIwOSwgMjA2LCBhbmQgMjAxIChidXQgbm90IDIwOCkuICBja3VjbWQuYywgY2t1dXNyLmMsCitja3V1czUuYywgMTUgTWFyIDIwMDMuCisKK01JTlBVVCBuIFxmam9pbigmYSkgd29ya3MgT0sgaWYgYWxsIHRoZSBtZW1iZXJzIG9mIFwmYVtdIGFyZSB0ZXh0IHN0cmluZ3MsIGJ1dAoraWYgdGhleSBhcmUgc3RyaW5ncyBvZiBjb250cm9sIGNoYXJzIChhcyBhYm92ZSksIHRoZXkgZG9uJ3QgZ2V0IHNlcGFyYXRlZCBieQordGhlIHNwYWNlcy4gIEZvciBleGFtcGxlIGluOgorCisgIGRjbCBcJmFbXSA9ICJcNFw1IiAiXDZcNyIgeHh4CisgIG1pbnB1dCAxMCBcZmpvaW4oJmEpCisKK01JTlBVVCBnZXRzIHR3byB0YXJnZXRzOiAiYWFhIiBhbmQgIlw0XDUgXDZcNyB4eHgiLiAgVGhlIGJ1ZyB3YXMgaW4gdGhlCitja3NwbGl0KCkgY2FsbCBpbiB0aGUgXGZqb2luKCkgY2FzZSBvZiBNSU5QVVQ6IGl0IG5lZWRlZCB0byBzcGVjaWZ5IGFuCitpbmNsdWRlIHNldCBjb25zaXN0aW5nIG9mIGFsbCB0aGUgY29udHJvbCBjaGFyYWN0ZXJzIGV4Y2VwdCBOVUwuICBja3V1c3IuYywKKzE2IE1hciAyMDAzLgorCitCdXQgdGhlcmUncyBzdGlsbCBhIHByb2JsZW06CisKKyAgZGNsIFwmYVtdID0gIlw0XDVcMTNcMTAiICJcNlw3IiAieHh4IgorCitjcmVhdGVzIGFuIGFycmF5IHdob3NlIGZpcnN0IG1lbWJlciBpcyAiXkReRSAob25lIGRvdWJsZXF1b3RlIGluY2x1ZGVkKS4gIEJ1dAoraWYgYnJhY2VzIGFyZSB1c2VkIGluc3RlYWQsIHRoZXJlJ3Mgbm8gcHJvYmxlbS4gIFNhbWUgZGVhbCBhcyBNSU5QVVQ6IGNtZmxkKCkKK2JyZWFrcyBvbiBDUiBvciBMRiwgdGh1cyB0aGUgZW5kIHF1b3RlIGlzIGxvc3QuICBJZiBJIHNldCBtaW5wdXRhY3RpdmUgZm9yCitERUNMQVJFIGluaXRpYWxpemVycyB0b28sIHRoYXQgZml4ZXMgaXQuICBJcyB0aGVyZSBhbnkgcmVhc29uIG5vdCB0byBkbyB0aGlzPworQ2FuJ3QgdGhpbmsgb2YgYW55IChmYW1vdXMgbGFzdCB3b3JkcykuLi4gIGNrdXVzci5jLCAxNiBNYXIgMjAwMy4KKworU2luY2UgaXQgaGFzIG11bHRpcGxlIGFwcGxpY2F0aW9ucywgY2hhbmdlZCB0aGUgZmxhZydzIG5hbWUgZnJvbSBtaW5wdXRhY3RpdmUKK3RvIGtlZXBhbGxjaGFycy4gIGNrdWNtZC5jLCBja3V1c1tyNV0uYywgMTYgTWFyIDIwMDMuCisKK1x2KGV4ZWRpcikgd2Fzbid0IGJlaW5nIHNldCBjb3JyZWN0bHkgKGl0IGluY2x1ZGVkIHRoZSBwcm9ncmFtIG5hbWUgYXMgd2VsbAorYXMgdGhlIGRpcmVjdG9yeSkuICBGaXhlZCBpbiBnZXRleGVkaXIoKTogY2t1dXM0LmMsIDE2IE1hciAyMDAzLgorCitTRVQgQ0FSUklFUi1XQVRDSCA8RXNjPiAiYXV0byBtYXRpYyIgKHNwdXJpb3VzIHNwYWNlIGluIHN1cHBsaWVkIGtleXdvcmQpLgorQ29zbWV0aWMgb25seTsgaXQgc3RpbGwgd29ya2VkLiAgRml4ZWQgaW4gc2V0ZGNkKCk6IGNrdXVzMy5jLCAxNiBNYXIgMjAwMy4KKworImRpcmVjdG9yeSBhIGIgYyIgbGlzdGVkIHRvbyBtYW55IGZpbGVzIC0tIGFsbCBmaWxlcyB3aG9zZSBuYW1lcyBFTkQgV0lUSCBhLAorYiwgb3IgYywgcmF0aGVyIHRoYW4gdGhlIGZpbGVzIHdob3NlIG5hbWVzIFdFUkUgYSwgYiwgb3IgYy4gIERpYWdub3NpczogVGhlCitmaWxlc3BlYyBpcyBjaGFuZ2VkIGludG8gYSBwYXR0ZXJuOiB7YSxiLGN9LCB3aGljaCBpcyB0aGUgY29ycmVjdCBmb3JtLiAgSXQgaXMKK3Bhc3NlZCB0byBuenhwYW5kKCksIHdoaWNoIGdvZXMgdGhyb3VnaCB0aGUgZGlyZWN0b3J5IGdldHRpbmcgZmlsZW5hbWVzIGFuZAorc2VuZGluZyBlYWNoIG9uZSB0byBja21hdGNoKCkgd2l0aCB0aGUgZ2l2ZW4gcGF0dGVybi4gIGNrbWF0Y2goKSByZWNlaXZlcyB0aGUKK2NvcnJlY3QgcGF0dGVybiBidXQgdGhlbiBwcmVwZW5kcyBhICIqIiAtLSB0aGF0J3Mgbm90IHJpZ2h0LiAgSXQncyBub3QganVzdAoraW4gZmlsZW5hbWUgbWF0Y2hpbmcgZWl0aGVyLiAgVGhlIGZvbGxvd2luZyBzdWNjZWVkcyB3aGVuIGl0IHNob3VsZG4ndDoKKworICBpZiBtYXRjaCB4eHh4YyB7e2EsYixjfX0gPGNvbW1hbmQ+CisKK0NoYW5naW5nIGNrbWF0Y2goKSB0byBub3QgcHJlcGVuZCB0aGUgIioiIHRvIGVhY2ggc2VnbWVudCBmaXhlcyB0aGUgY29tbWFuZAorYWJvdmUgYnV0IGJyZWFrcyBsb3RzIG9mIG90aGVycy4gIFJ1bm5pbmcgdGhyb3VnaCB0aGUgIm1hdGNoIiB0b3J0dXJlLXRlc3QKK3NjcmlwdCBzaG93cyB0aGUgcHJvYmxlbSBvY2N1cnMgb25seSB3aGVuIHRoZSB7YSxiLGN9IGxpc3QgaXMgdGhlIGVudGlyZQorcGF0dGVybiwgYW5kIG5vdCBlbWJlZGRlZCB3aXRoaW4gYSBsYXJnZXIgcGF0dGVybi4gIFRlc3RpbmcgZm9yIHRoaXMgY2FzZQorZml4ZWQgdGhlIHByb2JsZW0uICBja21hdGNoKCk6IGNrY2xpYi5jLCAxNiBNYXIgMjAwMy4KKworRml4ZWQgRlRQIE1PRFRJTUUgdG8gbm90IHByaW50IGFueXRoaW5nIGlmIFFVSUVUIE9OLiAgY2tjZnRwLmMsIDE2IE1hciAyMDAzLgorCitQaWNrZWQgdXAgYSBuZXcgY2t1YXRoLmMgZnJvbSBKZWZmLCBub3Qgc3VyZSB3aGF0IHRoZSBjaGFuZ2VzIGFyZS4gMTYgTWFyIDIwMDMuCisKK0RpZCBhIGZldyByZWd1bGFyIGFuZCBzZWN1cmUgYnVpbGRzIHRvIG1ha2Ugc3VyZSBJIGRpZG4ndCB3cmVjayBhbnl0aGluZy4KKworQ2hhbmdlZCB2ZXJzaW9uIG51bWJlciB0byAyMDkgKGZpbmFsKS4gIGNrY21haS5jLCAxNiBNYXIgMjAwMy4KKworSmFzb24gSGVza2V0dCBmb3VuZCBhbm90aGVyIGJ1ZzogaWYgeW91IGRlZmluZSBhIG1hY3JvIEZPTyBpbnNpZGUgdGhlCitkZWZpbml0aW9uIG9mIGFub3RoZXIgbWFjcm8gQkFSLCBhbmQgRk9PJ3MgZGVmaW5pdGlvbiBpbmNsdWRlcyBhbiBvZGQgbnVtYmVyCitvZiBkb3VibGVxdW90ZXMgKHN1Y2ggYXMgMSksIEZPTydzIGRlZmluaXRpb24gYWJzb3JicyB0aGUgcmVzdCBvZiBCQVIncworZGVmaW5pdGlvbi4gIEV4YW1wbGU6CisKKyAgZGVmIFRFU1QgeworICAgIC5mb28gPSB7WCJ9CisgICAgc2hvIG1hYyBmb28KKyAgfQorICBkbyB0ZXN0CisgIHNobyBtYWMgZm9vCisKK1Jlc3VsdHMgaW46CisKKyAgZm9vID0ge1gifSwgc2hvIG1hYyBmb28KKworRGlhZ25vc2lzOiB0aGUgVEVTVCBkZWZpbml0aW9uIGJlY29tZXM6CisKKyAgZGVmIFRFU1QgLmZvbyA9IHtYIn0sIHNobyBtYWMgZm9vCisKK2FuZCB0aGUgbWFjcm8gcmVhZGVyIGlzIGVycm9uZW91c2x5IHRyZWF0aW5nIHRoZSBkb3VibGVxdW90ZSBhcyBhbiBvcGVuCitxdW90ZSwgYW5kIHRoZW4gYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHF1b3RlIGF0IHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24uCitUaGUgZXJyb3IgaXMgdGhhdCBhIGRvdWJsZXF1b3RlIHNob3VsZCBiZSBzaWduaWZpY2FudCBvbmx5IGF0IHRoZSBiZWdpbm5pbmcgb2YKK2EgZmllbGQuICBCdXQgdGhlIG1hY3JvIHJlYWRlciBpc24ndCBhIGNvbW1hbmQgcGFyc2VyOyBpdCBkb2Vzbid0IGtub3cgd2hhdAorYSBmaWVsZCBpcyAtLSBpdCdzIGp1c3QgbG9va2luZyBmb3IgY29tbWFzIGFuZCBza2lwcGluZyBvdmVyIHF1b3RlZCBvbmVzLgorRmlyc3Qgd2UgaGF2ZSB0byBmaXggYW4gb3ZlcnNpZ2h0OiBTRVQgQ09NTUFORCBET1VCTEVRVU9USU5HIE9GRiBzaG91bGQgaGF2ZQord29ya2VkIGhlcmUsIGJ1dCBpdCB3YXNuJ3QgdGVzdGVkIGluIHRoaXMgY2FzZS4gIEZpeGVkIGluIGdldG5jbSgpOiBja3V1czUuYywKKzE3IE1hciAyMDAzLgorCitUaGVyZSBhcmUgb25seSBjZXJ0YWluIGNhc2VzIHdoZXJlIGl0IG1ha2VzIHNlbnNlIHRvIHRyZWF0IGRvdWJsZXF1b3RlcyBhcworc2lnbmljYW50OgorCisgLiBBbiBvcGVuIHF1b3RlIG11c3QgYmUgYXQgdGhlIGJlZ2lubmluZyBvciBwcmVjZWRlZCBieSBhIHNwYWNlLgorIC4gQSBjbG9zZSBxdW90ZSBpcyBvbmx5IGF0IHRoZSBlbmQgb3IgZWxzZSBmb2xsb3dlZCBieSBhIHNwYWNlLgorCitUaGlzIHRvbyB3YXMgZml4ZWQgaW4gZ2V0bmNtKCk6IGNrdXVzNS5jLCAxNyBNYXIgMjAwMy4KKworQSBmaXggZnJvbSBKZWZmIFNTTC9UTFMgRlRQIGRhdGEgZGVjb2RpbmcuICBja2NmdHAuYywgMTggTWFyIDIwMDMuCisKK1RyaWVkIGJ1aWxkaW5nIEMtS2VybWl0IG9uIGEgQ3JheSBZLU1QIHdpdGggVU5JQ09TIDkuMC4gICJpbnQgc3VzcGVuZCIsCitkZWNsYXJlZCBpbiBja2NtYWkuYyBhbmQgdXNlZCBpbiBtYW55IG1vZHVsZXMsIGNvbmZsaWN0cyB3aXRoOgorCisgIHVuaXN0ZC5oOmV4dGVybiBpbnQgc3VzcGVuZCBfXygoaW50IF9DYXRlZ29yeSwgaW50IF9JZCkpOworCitUaGUgIj1Ec3VzcGVuZD14c3VzcGVuZCIgdHJpY2sgZG9lc24ndCB3b3JrIGZvciB0aGlzOyB0aGVyZSBpcyBubyB3YXkgYXJvdW5kCit0aGUgY29uZmxpY3Qgb3RoZXIgdGhhbiB0byByZW5hbWUgdGhlIHZhcmlhYmxlOiBja2NtYWkuYywgY2t1dGlvLmMsCitja3V1c1szNXh5XS5jLiAgMjYgTWFyIDIwMDMuICBWTVMgYW5kIEs5NSBub3QgYWZmZWN0ZWQuCisKK09LIHRoYXQgZ2V0cyB1cyBwYXN0IGNrY21haS5jLi4uICBUaGVuIGluIGNrdXRpby5jIEkgaGFkIHRvIGFkZCBhIG5ldyAjaWZkZWYKK2Fyb3VuZCB0aGUgTEZERVZOTyBzZXR0aW5nLCBiZWNhdXNlIHRoZSBDcmF5IGRpZG4ndCBoYXZlIG1rZGV2LmguICBDb3VsZCBub3QKK2ZpbmQgYSBDcmF5LXNwZWNpZmljIG1hbmlmZXN0IHN5bWJvbCwgc28gSSBtYWRlIGEgbmV3IG1ha2VmaWxlIHRhcmdldCAoY3JheTkpCit0aGF0IHNldHMgdGhpcyBzeW1ib2wuICBIYXZpbmcgZG9uZSB0aGlzIEkgaGF2ZSBubyBpZGVhIHdoYXQga2luZCBvZiBsb2NrZmlsZQord291bGQgYmUgY3JlYXRlZCwgYnV0IEkgYWxzbyBkb3VidCBpZiBhbnlib2R5IGRpYWxzIG91dCBmcm9tIGEgQ3JheS4gIFRoZQorYmluYXJ5IHNob3VsZCBydW4gYSBDOTAsIEo5MCwgb3IgWS1NUC4gIG1ha2VmaWxlLCAyNiBNYXIgMjAwMy4KKworQWRkZWQgYSB0YXJnZXQgZm9yIFNDTyBPU1I1LjAuNy4gIG1ha2VmaWxlLCBja3V2ZXIuaCwgMzAgTWFyIDIwMDMuCisKK0NoYW5nZWQgc2luY2UgMjA4OgorbWFrZWZpbGUgY2t1dmVyLmggY2tjbWFpLmMgY2tjbGliLmMgY2tjZnRwLmMgY2t1Y21kLmMgY2t1dXMqLmMgY2t1dGlvLmMuCisKKy0tLTguMC4yMDktLS0KKworRnJvbSBNYXJrIFNhcGlybywgYSBmaXggZm9yIHRoZSBNYXJjaCAxN3RoIGRvdWJsZXFvdGUgZml4LCBnZXRuY20oKTogY2t1dXM1LmMsCis0IEFwciAyMDAzLgorCitGcm9tIEplZmYsIDI5IEFwciAyMDAzOgorIC4gQ29ycmVjdGVkIHRhcmdldCBmb3IgSFAtVVggMTEuMDAgKyBPcGVuU1NMOiBtYWtlZmlsZSwgCisgLiBEbyBub3QgYWxsb3cgV0lMTCBBVVRIIGJlZm9yZSBXT05UIFNUQVJUX1RMUzogY2tjdGVsLmggY2tjdGVsLmMKKyAuIEFkZCBob29rcyBmb3IgU0ZUUCBhbmQgU0VUL1NIT1cgU0ZUUDogY2tjZGViLmggY2t1dXNyLmggY2t1dXNyLmMgY2t1dXMzLmMKKyAuIEFkZCBTS0VSTUlUIGNrdXVzci5oIGNrdXVzci5jCisgLiBBZGQgQURNLTUgdGVybWluYWwgZW11bGF0aW9uOiBja3V1czcuYywgY2t1dXM1LmMKKyAuIFVuY29tbWVudCBhbmQgdXBkYXRlIEhFTFAgU0VUIFNTSCBWMiBBVVRPLVJFS0VZOiBja3V1czIuYworIC4gRW5hYmxlIElGIFRFUk1JTkFMLU1BQ1JPIGFuZCBJRiBTVEFSVEVELUZST00tRElBTEVSIGZvciBDLUtlcm1pdDogY2t1dXM2LmMKKyAuIEZpeCBjb25mbGljdGluZyBOT1NDUk9MTCBrZXl3b3JkIGRlZmluaXRpb246IGNrdXVzci5oCisgLiBTZXQgdHRuYW1lIHdoZW4gSV9BTV9TU0g6IGNrdXVzeS5jCisgLiBBZGQgZXh0ZW5kZWQgYXJnIHBhcnNpbmcgZm9yIFNTSCwgUmxvZ2luLCBUZWxuZXQ6IGNrdXVzeS5jLCBja3V1czQuYworIC4gU2VjdXJpdHkgdXBkYXRlczogY2t1YXRoLmMsIGNrX3NzbC5jCisgLiBDaGFuZ2UgSzk1IHZlcnNpb24gbnVtYmVyIHRvIDIuMi4wOiBja2NtYWkuYworIC4gU2F2ZSBLOTUgdGVybSBpL28gc3RhdGUgYmVmb3JlIGV4ZWN1dGluZyBrZXlib2FyZCBtYWNybzogY2t1dXM0LmMKKyAuIEFkZCB0ZXN0cyBmb3IgU1NIIFN1YnN5c3RlbSBhY3RpdmUgZHVyaW5nIElOUFVUL09VVFBVVC9DT05ORUNUOiBja3V1c1s0NV0uYworIC4gRW5hYmxlIEs5NSBTRVQgU1NIIFYyIEFVVE8tUkVLRVk6IGNrdXVzMy5jCisKK1NGVFAgYW5kIFNFVCBTRlRQIHN1YmNvbW1hbmRzIGFyZSBpbXBsZW1lbnRlZCB1cCB0byB0aGUgY2FzZSBzdGF0ZW1lbnRzLgorCitGaWxlcyBvZiBtaW5lIHRoYXQgSmVmZiBoYWRuJ3QgcGlja2VkIHVwOgorICBja3V2ZXIuaCBja2NmdHAuYyBja3V0aW8uYyBja3V1c3guYyAoanVzdCBtaW5vciBjaGFuZ2VzIGZvciBsYXN0IGJ1aWxkLWFsbCkKKworT24gNCBKYW4gMjAwMywgU0VUIFJFQ0VJVkUgTU9WRS1UTyB3YXMgY2hhbmdlZCB0byBjb252ZXJ0IGlzIGFyZ3VtZW50IHRvIGFuCithYnNvbHV0ZSBwYXRoLCB3aGljaCBtYWRlIGl0IGltcG9zc2libGUgdG8gc3BlY2lmeSBhIHJlbGF0aXZlIHBhdGgsIHRoZW4KK21vdmUgdG8gZGlmZmVyZW50IGRpcmVjdG9yaWVzIGFuZCBoYXZlIGl0IGFwcGx5IHJlbGF0aXZlbHkgdG8gZWFjaCBkaXJlY3RvcnkuCitDaGFuZ2VkIHRoaXMgYXMgZm9sbG93czoKKworIC4gUGFyc2VyIHVzZXMgY210eHQoKSByYXRoZXIgdGhhbiBjbWRpcigpIHNvIGl0IHdvbid0IGZhaWwgYXQgcGFyc2UgdGltZS4KKyAuIElmIHBhdGggaXMgYWJzb2x1dGUsIHdlIGZhaWwgYXQgcGFyc2UgdGltZSBpZiBkaXJlY3RvcnkgZG9lc24ndCBleGlzdC4KKyAuIEluIHJlb2YoKSB3ZSBydW4gdGhlIHRoZSBwYXRoIHRocm91Z2ggeHhzdHJpbmcgKGFnYWluLCBpbiBjYXNlIGRlZmVycmVkCisgICBldmFsdWF0aW9uIG9mIHZhcmlhYmxlcyBpcyBkZXNpcmVkKSBhbmQgdGhlbiwgaWYgbm90IG51bGwsIHVzZSBpdC4KKyAuIElmIHRoZSBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCwgcmVuYW1lKCkgZmFpbHMgYW5kIHJlb2YoKSByZXR1cm5zIC00LAorICAgcmVzdWx0aW5nIGluIGEgcHJvdG9jb2wgZXJyb3IgKHRoaXMgaXMgbm90IGEgY2hhbmdlKS4gIFdlIGRvIE5PVCBjcmVhdGUKKyAgIHRoZSBkaXJlY3Rvcnkgb24gdGhlIGZseS4gCisKK0kgYWxzbyBmaXhlZCBTRVQgU0VORC9SRUNFSVZFIFJFTkFNRS1UTyB0byBwYXJzZSB3aXRoIGNtdHh0KCkgcmF0aGVyIHRoYW4KK2NtZGlyKCksIHNpbmNlIGl0J3MgcGFyc2luZyBhIHRleHQgdGVtcGxhdGUsIG5vdCBhIGRpcmVjdG9yeSBuYW1lLCBlLmcuCisic2V0IHJlY2VpdmUgcmVuYW1lLXRvIGZpbGUtXHYodGltZSktdihkYXRlKS1cdihwaWQpIi4gIFRoaXMgd2FzIHRvdGFsbHkKK2Jyb2tlbiwgc2luY2Ugd2hlbiBJIGRvbid0IGtub3cuICBXZSBkb24ndCBjYWxsIHh4c3RyaW5nKCkgaW4gdGhpcyBwYXJzZSwgc28KK2V2YWx1YXRpb24gaXMgYWx3YXlzIGRlZmVycmVkIC0tIEknZCBiZXR0ZXIgbm90IGNoYW5nZSB0aGlzLiAgY2t1dXM3LmMsCitja2NmbnMuYywgMSBNYXkgMjAwMy4KKworRnJvbSBKZWZmLCBTYXQgTWF5ICAzIDE0OjE1OjIzIDIwMDM6CisgLiBQaWNrIHVwIHRoZSByaWdodCBpc2FzY2lpIGRlZmluaXRpb24gZm9yIEs5NTogY2tjdGVsLmMKKyAuIG1hbGxvYy4uLiAgY2t1YXRoLmMgKG5ldyBzYWZlIG1hbGxvYyByb3V0aW5lcyBmb3IgSzk1KQorIC4gQWRkIGF1dGhvciBsaXN0aW5nOiBja3V1czUuYworIC4gU1NIIEhlYXJ0YmVhdCBzdXBwb3J0IChLOTUgb25seSk6IGNrdXVzWzIzXS5jCisgLiBQcmVzY2FuIC0taGVpZ2h0IGFuZCAtLXdpZHRoIHRvIGF2b2lkIHdpbmRvdyByZXNpemluZyBhdCBzdGFydHVwOiBja3V1c3kuYworIC4gQWRkIGNoZWNrcyBmb3IgZmF0YWwoKSBvciBkb2V4aXQoKSBjYWxsZWQgZnJvbSBzeXNpbml0KCk6IGNrdXVzeC5jCisgLiBNb3ZlIHNvbWUgSzk1LXNwZWNpZmljIGRlZmluaXRpb25zIHRvIGNrb2tlci5oOiBja2NkZWIuaAorIC4gQWRkIHN1cHBvcnQgZm9yIE9OX0NEIG1hY3JvIGluIHpjaGRpcigpOiBja3VmaW8uYworIC4gQWRkIGEgY29tbWFuZCB0byBsZXQgRlRQIGNsaWVudCBhdXRoZW50aWNhdGUgd2l0aCBTU0x2MjogY2tjZnRwLmMKKyAuIEZpeCBwYXJzaW5nIG9mIEZUUCBmaWxlIGZhY3RzIGxpa2UgIlVOSVgubW9kZSI6IGNrY2Z0cC5jCisKK09OX0NEIHdpbGwgbmVlZCBzb21lIGV4cGxhaW5pbmcgKHRvIGJlIGRvbmUpLiAgSXQncyBpbXBsZW1lbnRlZCBmb3IgVW5peCwKK1ZNUywgV0luZG93cywgYW5kIE9TLzIuCisKK1RoZSBGVFAgZmlsZSBmYWN0cyBmaXggY2FtZSBmcm9tIGZpcnN0IGV4cG9zdXJlIHRvIHRoZSBuZXcgT3BlbkJTRCBGVFAKK3NlcnZlcjogZnRwOi8vZnRwNy51c2Eub3BlbmJzZC5vcmcvcHViL29zL09wZW5CU0QvMy4zL2kzODYvCitUaGUgcGVyaW9kIGluICJVTklYLm1vZGUiIGNhdXNlZCBhbiBlcnJvbmVvdXMgd29yZCBicmVhaywgYWRkaW5nIGp1bmsgdG8KK3RoZSBmaWxlbmFtZS4KKworQWJvdXQgdGhlIG1hbGxvYyBjaGFuZ2VzLCBKZWZmIHNheXMgIks5NSBpcyBub3QgYmVoYXZpbmcgd2VsbCBpbiBsb3cgbWVtb3J5CitlbnZpcm9ubWVudHMuICBJJ20gbm90IHN1cmUgdGhhdCBDLUtlcm1pdCBkb2VzIG11Y2ggYmV0dGVyLiAgVGhlIHByb2dyYW0gZG9lcworbm90IGNyYXNoIGJ1dCBpdCBjZXJ0YWlubHkgZG9lcyBub3QgYmVoYXZlIHRoZSB3YXkgdGhlIHVzZXIgZXhwZWN0cyBpdCB0by4KK0knbSBiZWdpbm5pbmcgdG8gdGhpbmsgdGhhdCBhbnkgbWFsbG9jKCkgZXJyb3Igc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZmF0YWwuIgorCitOb3QgdmlzaWJsZSBpbiB0aGVzZSBjaGFuZ2VzIGJlY2F1c2UgaXQncyBpbiBLOTUtc3BlY2lmaWMgbW9kdWxlczogSmVmZiBtYWRlCitTRVQgQVRUUklCVVRFUyBPRkYgYW5kIFNFVCBBVFRSSUJVVEVTIERBVEUgT0ZGIGFwcGx5IHRvIFhZWk1PREVNIHRyYW5zZmVycy4KKworRnJvbSBKZWZmLCAxMSBNYXkgMjAwMzoKKyAuIEFkZCBzdXBwb3J0IGZvciBTU0ggS2VlcGFsaXZlIHRvIHJlbGV2YW50IFNFVCBjb21tYW5kIChLOTUpOiBja3V1czMuYworIC4gUmVkdWNlIG1heCBvdmVybGFwcGVkIGkvbyByZXF1ZXN0cyBmcm9tIDMwIHRvIDcgKEs5NSk6IGNrdXVzNy5jCisgLiBEb24ndCBjYWxsIHN5c2luaXQoKSBpbiBmYXRhbCgpOiBja3V1c3guYy4KKyAuIFNvbWUgbmV3IGNvbmRpdGlvbmFsaXphdGlvbnMgZm9yIFNTTCBtb2R1bGU6IGNrX3NzbC5jCisKK1RoZSBkb3VibGVxdW90ZS1wYXJzaW5nIGZpeGVzIGZyb20gTWFyY2ggYW5kIEFwcmlsIGJyb2tlIHRoZSBTV0lUQ0ggc3RhdGVtZW50LAord2hpY2ggaXMgaW1wbGVtZW50ZWQgYnkgaW50ZXJuYWxseSBkZWZpbmluZywgdGhlbiBleGVjdXRpbmcsIGEgbWFjcm8uICBJZiBJCitkcm9wIGJhY2sgdG8gdGhlIG9sZCBkdW1iIGhhbmRsaW5nIG9mIGRvdWJsZXF1b3RlcywgZXZlcnl0aGluZyBpcyBmaXhlZCBleGNlcHQKK3RoZSBwcm9ibGVtIG9mIE1hcmNoIDE3dGguICBCdXQgY2FuIHdlIHJlYWxseSBleHBlY3QgZ2V0bmNtKCkgdG8gcHJlLWd1ZXNzCit3aGF0IHRoZSBwYXJzZXIgaXMgZ29pbmcgdG8gZG8/ICBnZXRuY20oKSdzIG9ubHkgam9iIGlzIHRvIGZpbmQgY29tbWFuZAorYm91bmRhcmllcywgd2hpY2ggYXJlIHJlcHJlc2VudGVkIGJ5IGNvbW1hcy4gIENvbW1hcywgaG93ZXZlciwgaXMgbmVlZGVkIElOCitjb21tYW5kcyB0b28uICBXZSB0YWtlIGEgY29tbWEgbGl0ZXJhbGx5IGlmIGl0IGlzIHF1b3RlZCB3aXRoIFwsIG9yIGlzIGluc2lkZQorYSBtYXRjaGVkIHBhaXIgb2YgYnJhY2VzLCBwYXJlbnMsIG9yIGRvdWJsZXF1b3Rlcy4gIEl0IGlzIG5vdCB1bnJlYXNvbmFibGUgdG8KK3JlcXVpcmUgYSBkb3VibGVxdW90ZSBpbiBhIG1hY3JvIGRlZmluaXRpb24gdG8gYmUgcHJlZml4ZWQgYnkgXCB3aGVuIGl0IGlzIHRvCitiZSB0YWtlbiBsaXRlcmFsbHkuICBUaGUgcHJvcGVyIHJlc3BvbnNlIHRvIEphc29uIEhlc2tldHQncyBjb21wbGFpbnQgb2YgTWFyY2gKKzE3dGggc2hvdWxkIGhhdmUgYmVlbiB0byBsZWF2ZSB0aGUgY29kZSBhbG9uZSBhbmQgcmVjb21tYW5kIGFuIGFwcHJvcHJpYXRlCitmb3JtIG9mIHF1b3Rpbmc6CisKKyAgZGVmIFRFU1QgeworICAgICAgLmZvbyA9IHtYXCJ9CisgICAgICBzaG8gbWFjIGZvbworICB9CisKK0FuZCB0aGlzIGlzIHdoYXQgSSBoYXZlIGRvbmUuICBBbm90aGVyIHJlYXNvbiBmb3Igc3RpY2tpbmcgd2l0aCB0aGUgb2xkIG1ldGhvZAoraXMgdGhhdCBpdCdzIGV4cGxhaW5hYmxlLiAgVGhlICJpbXByb3ZlZCIgbWV0aG9kLCBldmVuIGlmIGl0IHdvcmtlZCwgd291bGQgYmUKK2JlIGltcG9zc2libGUgdG8gZXhwbGFpbi4gIEJ0dywgaW4gdGVzdGluZyB0aGlzIEkgbm90aWNlZCB0aGF0IHRoZSBzd2l0Y2gtdGVzdAorc2NyaXB0IG1hZGUgOC4wLjIwMSBkdW1wIGNvcmUuICBUb2RheSdzIHZlcnNpb24gaXMgZmluZS4gIFRoZSBwcm9ibGVtIHdpdGgKK3F1b3RlZCBzdHJpbmdzIGluc2lkZSBvZiBJRiB7Li4ufSBjbGF1c2VzIGFuZCBGT1IgYW5kIFdISUxFIGxvb3BzIGlzIGZpeGVkCit0b28uICBQZXJoYXBzICJ1bmJyb2tlbiIgd291bGQgYmUgYSBiZXR0ZXIgd29yZC4gIGNrdXVzNS5jLCAxMSBNYXkgMjAwMy4KKworVmFjZSBkaXNjb3ZlcmVkIHRoYXQgRlRQIE1HRVQgL0VYQ0VQVDp7Li4uICh3aXRoIGFuIHVudGVybWluYXRlZCAvRVhDRVBUIGxpc3QpCitjb3VsZCBjcmFzaCBLZXJtaXQuICBGaXhlZCBpbiBja2NmdHAuYywgMTEgTWF5IDIwMDMuCisKK0NPTlRJTlVFIHNob3VsZCBub3QgYWZmZWN0IFNVQ0NFU1MvRkFJTFVSRSBzdGF0dXMuICBja3V1c3IuYywgMTEgTWF5IDIwMDMuCisKK0ZpeGVkIGFuIG92ZXJzaWdodCB0aGF0IGdvZXMgYmFjayAxNSB5ZWFycy4gIFdoaWxlIFx7MTIzfSBpcyBhbGxvd2VkIGZvcgorZGVjaW1hbCBjb2RlcywgXHh7MTJ9IGFuZCBcb3sxMjN9IHdlcmUgbmV2ZXIgaGFuZGxlZC4gIGNrdWNtZC5jLCAxMSBNYXkgMjAwMy4KKworQWRkZWQgc3VwcG9ydCBmb3IgUmVkIEhhdCA8YmF1ZGJveS5oPiBhbmQgL3Vzci9zYmluL2xvY2tkZXYuICBTdXBwb3NlZGx5IHRoaXMKK2FsbG93cyBLZXJtaXQgdG8gYmUgaW5zdGFsbGVkIHdpdGhvdXQgc2V0dWlkIG9yIHNldGdpZCBiaXRzIGFuZCBzdGlsbCBiZSBhYmxlCit0byBsb2NrIGFuZCB1c2UgdGhlIHNlcmlhbCBkZXZpY2UuICBDb21waWxlcyBhbmQgc3RhcnRzLCBidXQgbm90IHRlc3RlZC4KK2NrY2RlYi5oLCBtYWtlZmlsZSwgY2t1dGlvLmMsIGNrdXVzNS5jLCAxNiBNYXkgMjAwMy4KKworRnJvbSBKZWZmOiBGVFAgQVNDSUkgc2VuZCBkYXRhIHRvIGhvc3Qgd2hlbiBGVFAgL1NTTCB3YXMgaW4gdXNlIHdhcyBicm9rZW4uCitmdHBfZHBsIGlzIHNldCB0byBDbGVhciB3aGVuIEZUUCAvU1NMIGlzIGluIHVzZS4gIFRoaXMgd2FzIGNhdXNpbmcgdGhlIGRhdGEgdG8KK2JlIHdyaXR0ZW4gdG8gdGhlIHNvY2tldCB3aXRoIHNlbmQoKSBpbnN0ZWFkIG9mIHRoZSBPcGVuU1NMIHJvdXRpbmVzLgorY2tjZnRwLmMsIGNrdWF0aC5jLCAyMSBNYXkgMjAwMy4KKworRnJvbSBKZWZmOiBTdHVmZiBmb3IgS2VyYmVyb3MgNTI0OiBja2NkZWIuaC4gIEZpeGVzIGZvciBGVFA7ICJGVFAgQVNDSUkgc2VuZAorZGF0YSBkaWQgbm90IHByb3Blcmx5IGNvbXB1dGUgdGhlIGVuZCBvZiBsaW5lIHRyYW5zbGF0aW9ucy4gIE9uIFVuaXggKGFuZAorc2ltaWxhciBwbGF0Zm9ybXMpIHRoZSBlbmQgb2YgbGluZSB3YXMgY29ycmVjdCBmb3Igbm8gY2hhcmFjdGVyIHNldHMgYnV0CitpbmNvcnJlY3Qgd2hlbiBjaGFyYWN0ZXIgc2V0cyB3ZXJlIHNwZWNpZmllZC4gIE9uIFdpbmRvd3MvT1MyLCB0aGUgZW5kIG9mIGxpbmUKK3dhcyBjb3JyZWN0IHdoZW4gY2hhcmFjdGVyIHNldHMgd2VyZSBzcGVjaWZpZWQgYW5kIGluY29ycmVjdCB3aGVuIHRoZXkgd2VyZQorbm90LiAgT24gTUFDLCBib3RoIHdlcmUgYnJva2VuLiAgQWxzbywgRlRQIFNlbmQgQnl0ZSBjb3VudHMgd2VyZSBpbmNvcnJlY3QKK3doZW4gY2hhcmFjdGVyIHNldHMgd2VyZSBzcGVjaWZpZWQuIiAgY2tjZnRwLmMuICAxNyBKdW4gMjAwMy4KKworRnJvbSBKZWZmOiBmaXhlcyB0byBIVFRQIC9BR0VOVDogYW5kIC9VU0VSOiBzd2l0Y2ggYWN0aW9uOiBja2NuZXQuYyBja3V1czMuYworY2tfY3JwLmMgY2tjZnRwLmMgY2t1dXMyLmMgY2t1dXN5LmMgY2t1dXNyLmMgY2tjbmV0LmgsIDIxIEp1biAyMDAzLgorCitGcm9tIEplZmY6IEZpeCBTRVQgRElBTEVSIEJBQ0tTUEFDRSBzbyBpdCBjYW4gb3ZlcnJpZGUgYSBwcmV2aW91cyBTRVQgS0VZCisoZS5nLiBmcm9tIElOSSBmaWxlKTogY2t1dXM3LmMuICBTb21lIFNTTC9UTFMgdXBkYXRlczogY2tfc3NsLmMuICBIVFRQIHN1cHBvcnQKK2ZvciBWTVMgYW5kIG90aGVyIFZNUyBpbXByb3ZlbWVudHMgKGUuZy4gYSB3YXkgdG8gbm90IGhhdmUgdG8gaGFyZHdpcmUgdGhlCitDLUtlcml0IHZlcnNpb24gbnVtYmVyIGludG8gdGhlIGJ1aWxkIHNjcmlwdCkgZnJvbSBNYXJ0aW4gVm9ybGFlbmRlcjoKK2NrY25ldC5oLCBja3V1c1tyM10uYywgY2tjZGViLmgsIGNrdnRpby5jLCBja2NuZXQuYywgY2t2a2VyLmNvbS4gIEJ1aWx0IG9uCitTb2xhcmlzIChnY2MvYW5zaSkgYW5kIFN1bk9TIChjYy9rJnIpLiAgVGhlIG5ldyBWTVMgc2NyaXB0IHRlc3RzIHRoZSBWTVMKK3ZlcnNpb24gYW5kIGluY2x1ZGVzIEhUVFAgc3VwcG9ydCBvbmx5IGZvciBWTVMgNi4yIG9yIGxhdGVyLiAgMiBKdWwgMjAwMy4KKworVHJpZWQgdG8gYnVpbGQgb24gb3VyIGxhc3QgVk1TIHN5c3RlbSBidXQgaXQgc2VlbXMgdG8gYmUgZGVhZC4gIExvb2tzIGxpa2UgYQoraGVhZCBjcmFzaCAobWFrZXMgcmVhbGx5IGxvdWQgbm9pc2VzLCBib290IHNheXMgREtBMCBub3QgcmVjb2duaXplZCkgKGZvb2V5LCBJCitqdXN0IHBhaWQgZ29vZCBtb25leSB0byByZW5ldyB0aGUgVk1TIGxpY2Vuc2UpLiAgVHJpZWQgYnVpbGRpbmcgYXQgYW5vdGhlcgorc2l0ZSB3aXRoOgorCisgIFByb2Nlc3MgU29mdHdhcmUgTXVsdGlOZXQgVjQuMyBSZXYgQS1YLAorICBDb21wYXEgQWxwaGFTZXJ2ZXIgRVM0MCwgT3BlblZNUyBBWFAgVjcuMworICBDb21wYXEgQyBWNi40LTAwOCBvbiBPcGVuVk1TIEFscGhhIFY3LjMKKworSGFkIHRvIG1ha2UgYSBmZXcgY29ycmVjdGlvbnMgdG8gY2t2a2VyLmNvbS4gIEJ1dCBzdGlsbCwgY29tcGlsYXRpb24gb2YKK2NrY25ldC5jIGJvbWJzLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFNFTEVDVCBkZWZpbml0aW9uIHNvbWVob3cgZ290IGxvc3QKK3NvbWV3aGVyZSBzaW5jZSB0aGUgMjA5IHJlbGVhc2UgKGkuZS4gbm8gU0VMRUNUIHR5cGUgaXMgZGVmaW5lZCBzbyBpdCBmYWxscwordGhydSB0byAiU0VMRUNUIGlzIHJlcXVpcmVkIGZvciB0aGlzIGNvZGUiKS4gIEJ1dCBJIGRvbid0IHNlZSBhbnl0aGluZyBpbgorY2tjZGViLmggb3IgY2tjbmV0LltjaF0gdGhhdCB3b3VsZCBleHBsYWluIHRoaXMuICBOb3QgY2t2a2VyLmNvbSBlaXRoZXIKKyhwdXR0aW5nIHRoZSBvbGQgb25lIGJhY2sgZ2l2ZXMgdGhlIHNhbWUgcmVzdWx0KS4gIE9LLCBJIGdpdmUgdXAsIG1heWJlIGl0J3MKK2p1c3QgdGhhdCBJIGhhdmVuJ3QgdHJpZWQgYnVpbGRpbmcgaXQgb24gTXVsdGlOZXQgcmVjZW50bHkuICBXaGF0IGFib3V0IFVDWD8KK0FoYSwgYnVpbGRzIGZpbmUgdGhlcmUgZXhjZXB0IGZvciB3YXJuaW5ncyBhYm91dCBtbG9vaywgZG9kbywgYW5kIHBhcnNlciBpbgorY2t2ZmlvLmMgKGJlY2F1c2Ugb2YgT05fQ0QpIC0tIEkgc3VwcG9zZSBJIGhhdmUgI2luY2x1ZGUgPGNrdWNtZC5oPi4uLiAoZG9uZSkKK0FueWhvdyBpdCBidWlsZHMgT0sgYW5kIHRoZSBIVFRQIGNvZGUgaXMgYWN0aXZlIGFuZCBhbG1vc3Qgd29ya3MgKEhUVFAgT1BFTgord29ya3M7IEhUVFAgR0VUIHNlZW1zIHRvIHN1Y2NlZWQgYnV0IGNyZWF0ZXMgYW4gZW1wdHkgZmlsZSBldmVyeSB0aW1lKS4gIFRyaWVkCitidWlsZGluZyB1bmRlciBNdWx0aU5ldCBhdCBhbm90aGVyIGluc3RhbGxhdGlvbjsgc2FtZSBiYWQgcmVzdWx0LgorCitPSyBzbyB3aHkgd29uJ3QgaXQgYnVpbGQgZm9yIE11bHRpTmV0PyAgQ29tcGFyaW5nIGNrY25ldC5jIHdpdGggdGhlIDIwOQordmVyc2lvbiwgbm90IGEgc2luZ2xlICNpZmRlZiBvciAjaW5jbHVkZSBpcyBjaGFuZ2VkLiAgVHJpZWQgYnVpbGRpbmcgd2l0aAorcDM9Ik5PSFRUUCIgLS0gYnVpbGRzIE9LLCBhaGEuICBXaGVyZSdzIHRoZSBwcm9ibGVtPyAgTm90IGNrY25ldC5oLi4uCitOb3QgY2tjZGViLmguLi4gIE9LIEkgZ2l2ZSB1cCwgd2lsbCByZXZpc2l0IHRoaXMgbmV4dCB0aW1lIEkgZ2V0IHRpbWUgdG8KK2RvIGFueXRoaW5nIHdpdGggdGhlIGNvZGUuCisKK0xhdGVyIEplZmYgc2FpZCAiTWFydGluIGRpZCBub3QgaW1wbGVtZW50IFZNUyBuZXR3b3JraW5nIGZvciB0aGUgSFRUUCBjb2RlLgorQWxsIGhlIGRpZCB3YXMgYWN0aXZhdGUgdGhlICNkZWZpbmUgSFRUUCB3aGljaCBoYXBwZW5zIHRvIHdvcmsgYmVjYXVzZSBoaXMKK2Nvbm5lY3Rpb25zIGFyZSB1c2luZyBTU0wvVExTIGNvbm5lY3Rpb25zLiAgaHR0cF9pbmMoKSwgaHR0cF90b2woKSwgZXRjIGhhdmUKK25vIHN1cHBvcnQgZm9yIFZNUyBuZXR3b3JraW5nIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBVQ1ggb3IgTVVMVElORVQuCitUaGUgdmFzdCBtYWpvcml0eSBvZiBIVFRQIGNvbm5lY3Rpb25zIGFyZSBub3Qgc2VjdXJlZCBieSBTU0wvVExTLiAgSXQgbWFrZXMgbm8KK3NlbnNlIHRvIHN1cHBvcnQgSFRUUCBvbiBWTVMgdW50aWwgc29tZW9uZSBpcyB3aWxsaW5nIHRvIGVpdGhlciBkbyB0aGUgd29yayBvcgorcGF5IGhhdmUgdGhlIHdvcmsgZG9uZSB0byBpbXBsZW1lbnQgVk1TIG5ldHdvcmtpbmcgaW4gdGhhdCBjb2RlIGJhc2UuIiAgU28gdGhlCitmaXggaXMgdG8gbm90IGVuYWJsZSBIVFRQIGZvciBWTVMgYWZ0ZXIgYWxsLiAgUmVtb3ZlZCB0aGUgQ0tIVFRQIGRlZmluaXRpb24KK2ZvciBWTVMgZnJvbSBja2NkZWIuaCwgNiBKdWwgMjAwMy4KKworRml4ZWQgY2t2ZmlvLmMgdG8gI2luY2x1ZGUgPGNrdXVzci5oPiAoaW5zdGVhZCBvZiA8Y2t1Y21kLmg+KSB0byBwaWNrIHVwIAorbWlzc2luZyBwcm90b3R5cGVzLiAgNiBKdWwgMjAwMy4KKworRnJvbSBBcnRodXIgTWFyc2g6IHNvbGFyaXMyeGcrb3BlbnNzbCt6bGliK3NycCtwYW0rc2hhZG93IGFuZCB0aGUgY29ycmVzcG9uZGluZworU29sYXJpcyA3IHRhcmdldC4gIG1ha2VmaWxlLCA2IEp1bCAyMDAzLgorCitSZW1vdmUgZHVwbGljYXRlICNpbmNsdWRlcyBmb3IgPHN5cy9zdGF0Lmg+LCA8ZXJybm8uaD4sIGFuZCA8Y3R5cGUuaD4gZnJvbQorY2tjZnRwLmMuICA2IEp1bCAyMDAzLgorCitBZGQgLURVU0VfTUVNQ1BZIHRvIE1vdG9yb2xhIFNWLzY4IHRhcmdldHMgYmVjYXVzZSBvZiBzaHVmZmxlZCAjaW5jbHVkZXMgaW4gCitja2NmdHAuYy4gIDggSnVsIDIwMDMuCisKK0Zyb20gSmVmZjogRml4IHByb2JsZW1zIG1peGluZyBTU0wgYW5kIFNSUCB3aXRob3V0IEtlcmJlcm9zLiAgUGx1cyBhIGZldyBtaW5vcgorI2RlZmluZSBjb21tZW50IGNoYW5nZXMgYW5kIGEgcmVzaHVmZmxpbmcgb2YgI2RlZmluZXMgaW4gY2tjZGViLmggdG8gYWxsb3cgbWUKK3RvIGJ1aWxkIG9uIFg4NiBXaW5kb3dzIHdpdGhvdXQgS2VyYmVyb3MuICBja2NkZWIuaCwgY2tfY3JwLmMsIGNrdWF0aC5jLAorMTAgSnVsIDIwMDMuCisKK0Zyb20gSmVmZjogdXBkYXRlZCBja3VhdDIuaCBhbmQgY2t1YXRoLmMsIDI5IEp1bCAyMDAzLgorCitNYXRzIFBldGVyc29uIG5vdGljZWQgdGhhdCBhIHZlcnkgc21hbGwgTGF0aW4tMSBmaWxlIHdvdWxkIGJlIGluY29ycmVjdGx5CitpZGVudGlmaWVkIGFzIFVDUy0yIGJ5IHNjYW5maWxlKCkuICBGaXhlZCBpbiBja3V1c3guYywgMjkgSnVsIDIwMDMuCisKK0ZpeGVkIEFDQ0VTUyBtYWNybyBkZWZpbml0aW9uIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgRklORCBpcyBub3cgYQorYnVpbHQtaW4gY29tbWFuZC4gIGNrZXJtaXQuaW5pLCAzMCBKdWwgMjAwMy4KKworRnJvbSBKZWZmOiBGaXggZm9yIHR5cG8gaW4gdXJscGFyc2UoKSAoc3ZjL2hvcyk6IGNrdXVzeS5jLCAxOCBBdWcgMjAwMy4KKworRnJvbSBKZWZmOiBSZWRoYXQ5IG1ha2VmaWxlIHRhcmdldHMgKG5lZWRlZCBmb3IgZm9yIE9wZW5TU0wgMC45LjcpOgorbWFrZWZpbGUsIDE5IEF1ZyAyMDAzLgorCitHUkVQIC9OT0xJU1QgYW5kIC9DT1VOVCBkaWQgdG9vIG11Y2ggbWFnaWMsIHdpdGggc29tZSB1bmRlc2lyYWJsZSBmYWxsb3V0OgorIkdSRVAgL05PTElTVCAvQ09VTlQ6eCBhcmdzIiBwcmludGVkICJmaWxlOmNvdW50IiBmb3IgZWFjaCBmaWxlLiAgIkdSRVAKKy9DT1VOVDp4IC9OT0xJU1QgYXJncyIgZGlkIG5vdCBwcmludCAiZmlsZTpjb3VudCIsIGJ1dCBuZWl0aGVyIGRpZCBpdCBzZXQgdGhlCitjb3VudCB2YXJpYWJsZS4gIFJlbW92ZWQgdGhlIG1hZ2ljLiAgQWxzbyBvbmUgb2YgdGhlIEdSRVAgc3dpdGNoZXMsCisvTElORU5VTUJFUlMsIHdhcyBvdXQgb2Ygb3JkZXIuICBGaXhlZCBpbiBja3V1czYuYywgMjAgQXVnIDIwMDMuCisKK0Zyb20gSmVmZjogIlJlb3JnYW5pemluZyBjb2RlIHRvIGVuYWJsZSBidWlsZGluZyB3aXRoIGRpZmZlcmVudCBzdWJzZXRzIG9mCitvcHRpb25zOyBhIGZldyB0eXBvcyBjb3JyZWN0ZWQgYXMgd2VsbC4iICBja2NkZWIuaCwgY2t1dmVyLmggKGZvciBSSDkpLAorY2tjbmV0LmMsIGNrdXVzNy5jLCBja3V1czMuYzogMjQgQXVnIDIwMDMuCisKK1NjYW5maWxlIG1pc2lkZW50aWZpZWQgYSBiaWcgUERGIGZpbGUgYXMgdGV4dCBiZWNhdXNlIHRoZSBmaXJzdCA4MDBLIG9mIGl0Cisqd2FzKiB0ZXh0IChtb3N0IG90aGVyIFBERiBmaWxlcyB3ZXJlIGNvcnJlY3RseSB0YWdnZWQgYXMgYmluYXJ5KS4gIEZpeGVkCitieSBhZGRpbmcgYSBjaGVjayBmb3IgdGhlIFBERiBzaWduYXR1cmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KK3NjYW5maWxlKCk6IGNrdXVzeC5jLCAyNSBBdWcgMjAwMy4KKworRGl0dG8gZm9yIFBvc3RTY3JpcHQgZmlsZXMsIGJ1dCBjb25zZXJ2YXRpdmVseS4gIFNpZ25hdHVyZSBhdCBiZWdpbm5pbmcgb2YKK2ZpbGUgbXVzdCBiZWdpbiB3aXRoICIlIVBTLUFkbyIuICBJZiBpdCdzIGp1c3QgIiUhIiAob3Igc29tZXRoaW5nIG5vbnN0YW5kYXJkCitsaWtlICIlJUNyZWF0b3I6IFdpbmRvd3MgUFNDUklQVCIpIHdlIGRvIGEgcmVndWxhciBzY2FuLiAgQWxzbyBhZGRlZCAiKi5wcyIKK3RvIGFsbCBiaW5hcnkgZmlsZW5hbWUgcGF0dGVybnMuICBja3V1c3guYywgNCBTZXAgMjAwMy4KKworRGl0dG8gKGJ1dCB3aXRoaW4gI2lmbmRlZiBOT1BDTFNDQU4pIGZvciBQQ0wgKDxFU0M+RSkgYW5kIFBKTCAoPEVTQz4lKSBmaWxlcywKK2J1dCBubyBiaW5wYXR0ZXJucyAobm90ZTogIi5QQ0wiIGlzIHRoZSBleHRlbnNpb24gZm9yIFRPUFMtMjAgRVhFQyBzY3JpcHRzKS4KK2NrdXVzeC5jLCA0IFNlcCAyMDAzLgorCitBZGRlZCBjb21tZW50cyBhYm91dCBPcGVuU1NMIDAuOS43IHRvIGFsbCBsaW51eCtvcGVuc3NsIHRhcmdldHMuCittYWtlZmlsZSwgNCBTZXAgMjAwMy4KKworRnJvbSBKZWZmOiBBZGRlZCAtICNkZWZpbmUgQUxMT1dfS1JCXzNERVNfRU5DUllQVC4gIFdoZW4gdGhpcyBzeW1ib2wgaXMgZGVmaW5lZAorYXQgY29tcGlsYXRpb24gS2VybWl0IHdpbGwgYWxsb3cgbm9uLURFUyBzZXNzaW9uIGtleXMgdG8gYmUgdXNlZCBkdXJpbmcgVGVsbmV0CitBdXRoLiAgVGhlc2Ugc2Vzc2lvbiBrZXlzIGNhbiB0aGVuIGJlIHVzZWQgZm9yIFRlbG5ldCBFbmNyeXB0LiAgVGhlIHJlYXNvbgordGhpcyBpcyBub3QgY29tcGlsZWQgb24gYnkgZGVmYXVsdCBpcyB0aGF0IHRoZSBNSVQgS2VyYmVyb3MgVGVsbmV0IGRvZXMgbm90Citmb2xsb3cgdGhlIFJGQyBmb3IgY29uc3RydWN0aW5nIGtleXMgZm9yIEVOQ1JZUFQgREVTIHdoZW4gdGhlIGtleXMgYXJlIGxvbmdlcgordGhhbiA4IGJ5dGVzIGluIGxlbmd0aC4gIGNrdWF0aC5jLCBja3V1czUuYywgNCBTZXAgMjAwMy4KKworImZ0cCBtZ2V0IGEgYiBjIiBzdWNjZWVkZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIGZpbGVzIGRpZCBub3QgZXhpc3QsIGV2ZW4KK3dpdGggInNldCBmdHAgZXJyb3ItYWN0aW9uIHByb2NlZWQiLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBzZXJ2ZXIncyBOTFNUIGZpbGUKK2xpc3QgZG9lcyBub3QgaW5jbHVkZSBhbnkgZmlsZXMgdGhhdCBkb24ndCBleGlzdCwgc28gdGhlIGNsaWVudCBuZXZlciBldmVuCit0cmllcyB0byBnZXQgdGhlbS4gIEZvcnR1bmF0ZWx5LCB0aGUgd2F5IHRoZSBjb2RlIGlzIHN0cnVjdHVyZWQsIHRoaXMgb25lIHdhcworZWFzeSB0byBmaXguICBja2NmdHAuYywgMTQgU2VwIDIwMDMuCisKK0Zyb20gSmVmZjogQ29ycmVjdGVkIGNvZGUgaW4gY2tjbmV0LmMgdG8gZW5zdXJlIHRoYXQgUmV2ZXJzZSBETlMgTG9va3VwcyBhcmUKK25vdCBwZXJmb3JtZWQgaWYgdGNwX3JkbnMgaXMgT0ZGLiAgRml4ZWQgY2tfa3JiNV9nZXRyZWFsbSgpIHRvIGFjdHVhbGx5IHJldHVybgordGhlIHJlYWxtIG9mIHRoZSBjcmVkZW50aWFscyBjYWNoZSBhbmQgbm90IHRoZSBkZWZhdWx0IHJlYWxtIHNwZWNpZmllZCBpbiB0aGUKK2tyYjUuY29uZiBmaWxlLiAgUHJldmlvdXNseSBrcmI1X2NjX2dldF9wcmluY2lwYWwoKSB3YXMgbm90IGJlaW5nIGNhbGxlZC4KK0ZpeGVkIGNrX2tyYjVfaXNfdGd0X3ZhbGlkKCkgdG8gdGVzdCB0aGUgVEdUIGluIHRoZSBjdXJyZW50IGNjYWNoZSBhbmQgbm90IHRoZQorVEdUIGNvbnN0cnVjdGVkIGZyb20gdGhlIGRlZmF1bHQgcmVhbG0uICBja2NuZXQuYywgY2t1YXRoLmMsIDE0IFNlcCAyMDAzLgorCitNYXJjbyBCZXJuYXJkaSBub3RpY2VkIHRoYXQgSUYgRElSRUNUT1JZIGNvdWxkIHByb2R1Y2UgYSBmYWxzZSBwb3NpdGl2ZSBpZgordGhlIGFyZ3VtZW50IGRpcmVjdG9yeSBoYWQgcHJldmlvdXNseSBiZWVuIHJlZmVyZW5jZWQgYnV0IHRoZW4gcmVtb3ZlZC4gIFRoaXMKK2lzIGJlY2F1c2Ugb2YgdGhlIGNsZXZlciBpc2RpcigpIGNhY2hlIHRoYXQgd2FzIGFkZGVkIHRvIHNwZWVkIHVwIHJlY3Vyc2lvbgordGhyb3VnaCBiaWcgZGlyZWN0b3J5IHRyZWVzLiAgQ2hhbmdlZCBJRiBESVJFQ1RPUlkgdG8gbWFrZSBhIHNlY29uZCBjaGVjaworKGRlZmluaXRpdmUgYnV0IG1vcmUgZXhwZW5zaXZlKSBpZiBpc2RpcigpIHN1Y2NlZWRzLCBhbmQgY2hhbmdlZCB0aGUKK2RpcmVjdG9yeS1kZWxldGluZyByb3V0aW5lLCBja21rZGlyKCksIHRvIGZsdXNoIHRoZSBkaXJlY3RvcnkgY2FjaGUgKFVOSVgKK29ubHkgLS0gdGhpcyBhbHNvIHNob3VsZCBiZSBkb25lIGluIEs5NSBidXQgaXQncyBub3QgY3JpdGljYWwpLiAgVGhpcyB3YXMKK2RvbmUgYnkgYWRkaW5nIGEgcm91dGluZSwgY2xyZGlyY2FjaGUoKSB0byBja3VmaW8uYywgd2hpY2ggc2V0cyBwcmV2c3RhdAordG8gLTEgYW5kIHByZXZwYXRoWzBdIHRvIE5VTC4gIGNrY2ZuMy5jLCBja3V1czYuYywgY2t1ZmlvLmMsIDE4IFNlcCAyMDAzLgorCitNYXJjbyByZXBvcnRlZCB0aGUgc2Vjb25kIGZpeCBzdGlsbCBkaWRuJ3Qgd29yayBmb3IgaGltIChldmVuIHRob3VnaCBpdCBkaWQKK2ZvciBtZSkuICBSYXRoZXIgdGhhbiB0cnkgdG8gZmlndXJlIG91dCB3aHksIEkgY29uY2x1ZGVkIHRoYXQgdGhlIGRpcmVjdG9yeQorY2FjaGUgaXMganVzdCBub3Qgc2FmZTogYSBkaXJlY3RvcnkgZm91bmQgYSBzZWNvbmQgYWdvIG1pZ2h0IGhhdmUgYmVlbiBkZWxldGVkCitvciByZW5hbWVkIG5vdCBvbmx5IGJ5IEtlcm1pdCBidXQgYnkgc29tZSBvdGhlciBwcm9jZXNzLiAgV2h5IGRpZCBJIGFkZCB0aGlzCitpbiB0aGUgZmlyc3QgcGxhY2U/ICBUaGUgbG9nIHNheXM6CisKKyAgU29tZSBkZWJ1ZyBsb2dzIHNob3dlZCB0aGF0IGlzZGlyKCkgaXMgb2Z0ZW4gY2FsbGVkIHR3aWNlIGluIGEgcm93IG9uIHRoZQorICBzYW1lIGZpbGUuICBSYXRoZXIgdGhhbiB0cnkgdG8gc29ydCBvdXQgY2xpZW50cywgSSBhZGRlZCBhIDEtZWxlbWVudCBjYWNoZQorICB0byBVbml4IGlzZGlyKCkuICBja3VmaW8uYywgMjQgQXByIDIwMDAuCisKK0V4cGVyaW1lbnRhdGlvbiB3aXRoIERJUiBhbmQgRElSIC9SRUNVUlNJVkUgZG9lcyBub3Qgc2hvdyB0aGlzIGhhcHBlbmluZyBhdAorYWxsLiAgU28gSSAjaWZkZWYnZCBvdXQgdGhlIGRpcmVjdG9yeSBjYWNoZSAoc2VlICNpZmRlZiBJU0RJUkNBQ0hFIGluIGNrdWZpby5jOworSVNESVJDQUNIRSBpcyBub3QgZGVmaW5lZCkgYW5kIGJhY2tlZCBvZmYgdGhlIHByZXZpb3VzIGNoYW5nZXM6IGNrdWZpby5jLAorY2tjZm4zLmMsIGNrdXVzNi5jLCAyOCBTZXAgMjAwMy4KKworRnJvbSBKZWZmOiBSZXBsYWNlIHRoZSBjb21waWxlIHRpbWUgQUxMT1dfS1JCXzNERVNfRU5DUllQVCB3aXRoIGEgcnVuLXRpbWUKK2NvbW1hbmQgU0VUIFRFTE5FVCBCVUcgQVVUSC1LUkI1LURFUyB3aGljaCBkZWZhdWx0cyB0byBPTjogY2tjdGVsLltjaF0sCitja3V1c1syMzRdLmMsIGNrX2NycC5jLCBja3VhdGguYy4gIDQgT2N0IDIwMDMuCisKK0FsbG93IERJQUwgUkVUUklFUyB0byBiZSBhbnkgcG9zaXRpdmUgbnVtYmVyLCBhbmQgY2F0Y2ggbmVnYXRpdmUgb25lcy4KK0Fsc28gYWRkZWQgY29kZSB0byBjaGVjayBmb3IgYXRvaSgpIGVycm9ycyAoZS5nLiB0cnVuY2F0aW9uKS4gIEF0IGxlYXN0IG9uCitzb21lIHBsYXRmb3JtcyAoZS5nLiBTb2xhcmlzKSBhdG9pKCkgaXMgc3VwcG9zZWQgdG8gc2V0IGVycm5vLCBidXQgaXQKK2RvZXNuJ3QuICBja3V1czMuYywgY2t1Y21kLmMsIDQgT2N0IDIwMDMuCisKK0FkZGVkIC9ERUZBVUxUOiB0byBBU0stY2xhc3MgY29tbWFuZHMgKEFTSywgQVNLUSwgR0VUT0spOgorCisgLiBGb3IgcG9wdXBzOiBubyB3YXkgdG8gc2VuZCBkZWZhdWx0cyB0byBwb3B1cF9yZWFkdGV4dCgpIG9yIHBvcHVwX3JlYWRwYXNzKCkuCisgLiBGb3IgR1VJIEFTS1tRXSwgcGFzcyBkZWZhdWx0IHRvIGd1aV90eHRfZGlhbG9nKCkuCisgLiBGb3IgR1VJIEdFVE9LLCBjb252ZXJ0ICJ5ZXMiICJvayIgb3IgIm5vIiBkZWZhdWx0IHRvIG51bWJlciBmb3IgdXFfb2soKS4KKyAuIEZvciBUZXh0IEdFVE9LLCBhZGQgZGVmYXVsdCB0byBjbWtleSgpLgorIC4gRm9yIFRleHQgQVNLW1FdLCBhZGQgZGVmYXVsdCB0byBjbXR4dCgpLgorIC4gRm9yIEdFVEMsIEdFVEtFWSwgYW5kIFJFQUQ6IG5vIGNoYW5nZXMuCisKK0dFVE9LLCBBU0ssIGFuZCBBU0tRIHdpdGggL1RJTUVPVVQ6IG5vIGxvbmdlciBmYWlsIHdoZW4gdGhlIHRpbWVyIGdvZXMgb2ZmCitpZiBhIC9ERUZBVUxUIHdhcyBzdXBwbGllZC4gIFRoZSBHVUkgZnVuY3Rpb25zICh1cV9ibGFoKSBkb24ndCBzZWVtIHRvCitzdXBwb3J0IHRpbWVvdXRzLiAgT25seSB0aGUgdGV4dCB2ZXJzaW9uIGhhcyBiZWVuIHRlc3RlZC4gIGNrdXVzWzI2XS5jLAorNCBPY3QgMjAwMy4KKworRnJvbSBKZWZmOiBhZGQgL0RFRkFVTFQ6IGZvciBwb3B1cHMuICBja3V1czYuYy4gNiBPY3QgMjAwMy4KKworQ2hhbmdlIFNFVCBESUFMIElOVEVSVkFMIHRvIGJlIGxpa2UgU0VUIERJQUwgUkVUUklFUy4gIGNrdXVzWzM0XS5jLCA2IE9jdCAyMDAzLgorCitBZGRlZCB0YXJnZXQgZm9yIEhQLVVYIDEwLzExICsgT3BlblNTTCBidWlsdCB3aXRoIGdjYywgZnJvbSBDaHJpcyBDaGVuZXkuCitNYWtlZmlsZSwgMTIgT2N0IDIwMDMuCisKK0Zyb20gSmVmZiwgNiBOb3YgMjAwMzoKKyAuICNpZmRlZiBhZGp1c3RtZW50czogY2tjZnRwLmMsIGNrY2RlYi5oCisgLiBGaXggc3B1cmlvdXMgY29uc3VtcHRpb24gb2YgZmlyc3QgYnl0ZShzKSBvbiBUZWxuZXQgY29ubmVjdGlvbjogY2tjdGVsLmMKKyAuIEFub3RoZXIgSFAgUEpMIHRlc3QgZm9yIHNjYW5maWxlOiBja3V1c3guYy4KKyAuIEs5NTogUmVjb2duaXplIERHNHh4IHByb3RlY3RlZCBmaWVsZHMgaW4gREcyeHggZW11bGF0aW9uOiBja3V1czcuYy4KKyAuIEFkZCBTU0xlYXkgdmVyc2lvbiBkaXNwbGF5IHRvIFNIT1cgQVVUSCBjb21tYW5kOiBja3V1czcuYworIC4gSW1wcm92ZWQgU0VUIE1PVVNFIENMRUFSIGhlbHAgdGV4dDogY2t1dXMyLmMuCisgLiBJbXByb3ZlZCBLdmVyYnMgaGVscCB0ZXh0OiBja3V1czIuYyAoKyBuZXcgSUJNLTMxNTEgS3ZlcmJzKS4KKyAuIFNvbWUgY2hhbmdlcyB0byBja19zc2wuYywgY2t1YXRoLmMuCisKK0Zyb20gUGV0ZXJFLCAxMCBOb3YgMjAwMzoKKyAuIEltcHJvdmVkIEhQLVVYIDEwLzExIG1ha2VmaWxlIHRhcmdldHMgZm9yIE9wZW5TU0wuCisgLiAjaWZkZWYgZml4IGZvciBPcGVuU1NMIG9uIEhQLVVYOiBja19zc2wuYy4KKworQW5vdGhlciBuZXcgbWFrZWZpbGUgZnJvbSBQZXRlckUgd2l0aCBpbXByb3ZlZCBhbmQgaW50ZWdyYXRlZCBIUC1VWCB0YXJnZXRzLgorMTIgTm92IDIwMDMuCisKK0EgY291cGxlIGZpeGVzIHRvIHRoZSBzb2xhcmlzOWcra3JiNStrcmI0K29wZW5zc2wrc2hhZG93K3BhbSt6bGliIHRhcmdldAorZnJvbSBKZWZmLiAgQWRkZWQgYSBzb2xhcmlzOWcrb3BlbnNzbCtzaGFkb3crcGFtK3psaWIgdGFyZ2V0LiAgbWFrZWZpbGUsCisyMSBOb3YgMjAwMy4KKworRnJvbSBKZWZmLCAzMCBOb3YgMjAwMzoKKyAuIEZpeCBTRU5EIC9NT1ZFLVRPOiBja3V1c3IuYy4KKyAuIEZpeCBLOTUgU0VUIFRJVExFIHRvIGFsbG93IHF1b3Rlcy9icmFjZXMgYXJvdW5kIHRleHQ6IGNrdXVzNy5jLgorIC4gSW1wcm92ZWQgInNldCB0ZXJtIGF1dG9kb3dubG9hZCA/IiByZXNwb25zZTogY2t1dXM1LmMuCisgLiBGaXggU0hPVyBGRUFUVVJFUyB0byBzcGVjaWZ5IHRoZSBwcm90b2NvbCBmb3IgZW5jcnlwdGlvbjogY2t1dXM1LmMKKyAuIE1ha2Uge1NFTkQsIFJFQ0VJVkV9IHtNT1ZFLVRPLCBSRU5BTUUtVE99IHdvcmsgZm9yIFhZWk1PREVNIChLOTUgb25seSkuCisKK0Zyb20gSmVmZjogNyBKYW4gMjAwNDoKKyAuIEF0IG9uZSBwb2ludCBGcmFuayBzdGFydGVkIHRvIGFkZCBhIHRpbWVyIHBhcmFtZXRlciB0byB0aGUKKyAgIHVxX3R4dCgpIGZ1bmN0aW9uIGJ1dCBoZSBvbmx5IGRpZCBpdCBmb3IgdGhlIG5vbi1BTlNJCisgICBjb21waWxlcnMuICBJIGFkZGVkIGl0IGZvciB0aGUgQU5TSSBjb21waWxlcnMsIGZpeGVkIHRoZQorICAgcHJvdG90eXBlcyBhbmQgcHJvdmlkZWQgYSBkZWZhdWx0IHZhbHVlIGVhc2lseSBjaGFuZ2VkCisgICBERUZBVUxUX1VRX1RJTUVPVVQ6IGNrY2tlci5oLCBja3V1c1szNl0uYywgY2tfc3NsLmMsIGNrY2Z0cC5jLCBja3VhdGguYy4KKyAuIEZpeGVkIFNFVCBURVJNSU5BTCBERUJVRyBPTiAodHlwbyBpbiB2YXJpYWJsZSBuYW1lKTogY2t1dXM3LmMuCisgLiBGaXhlZCBCRUVQIElORk9STUFUSU9OOyBwcmV2aW91c2x5IGl0IG1hZGUgbm8gc291bmQsIG5vdyB1c2VzCisgICBNQl9JQ09OUVVFU1RJT04uICBja3V1c3guYy4KKworRnJvbSBJYW4gQmVja3dpdGggPGlhbkBuZXNzaWUubWNjLmFjLnVrPiAoRGViaWFuaXphdGlvbiksIDcgSmFuIDIwMDQ6CisgLiBTZWFyY2ggZGlyL2NrZXJtaXQgZm9yIGRvY3MsIGFzIHdlbGwgYXMgZGlyL2tlcm1pdCBpbiBjbWRpbmkoKTogY2t1dXM1LmMuCisgLiBOZXcgbGludXgra3JiNStrcmI0K29wZW5zc2wrc2hhZG93K3BhbSB0YXJnZXQgKGtpdGNoZW4gc2luayBtaW51cyBTUlAsCisgICB3aGljaCBEZWJpYW4gZG9lcyBub3QgZGlzdHJpYnV0ZSk6IG1ha2VmaWxlLgorID8gTWFuZ2xlcyB0aGUgREVTVERJUiBzdXBwb3J0IGluIG1ha2VmaWxlIHRvIGluc3RhbGwgaW50byBhIHN0YWdpbmcgYXJlYToKKyAgIG1ha2VmaWxlIChJIGRpZG4ndCB0YWtlIHRoaXMgb25lIHlldCkuCisKK1VwZGF0ZWQgY29weXJpZ2h0IG5vdGljZXMgZm9yIDIwMDQsIGFsbCBtb2R1bGVzLiAgNyBKYW4gMjAwNC4KKworQWRkZWQgSU5QVVQgL05PTUFUQ0gsIGFsbG93aW5nIElOUFVUIHRvIGJlIHVzZWQgZm9yIGEgZml4ZWQgYW1vdW50IG9mIHRpbWUKK3dpdGhvdXQgYXR0ZW1wdGluZyB0byBtYXRjaCBhbnkgdGV4dCBvciBwYXR0ZXJucywgc28gaXQncyBubyBsb25nZXIKK25lY2Vzc2FyeSB0byAiaW5wdXQgNjAwIFNUUklOR19USEFUX1dJTExfTkVWRVJfQ09NRSIuICBJZiAvTk9NQVRDSCBpcworaW5jbHVkZWQsIElOUFVUIHN1Y2NlZWRzIGlmIHRoZSB0aW1lb3V0IGV4cGlyZXMsIHdpdGggXHYoaW5zdGF0dXMpID0gMQorKG1lYW5pbmcgInRpbWVkIG91dCIpOyBmYWlscyB1cG9uIGludGVycnVwdGlvbiBvciBpL28gZXJyb3IuICBja3V1c3IuaCwKK2NrdXVzW3IyNF0uYywgNyBKYW4gMjAwNC4KKworQWRkZWQgU0VUIElOUFVUIFNDQUxFLUZBQ1RPUiA8ZmxvYXQ+LiAgVGhpcyBzY2FsZXMgYWxsIElOUFVUIHRpbWVvdXRzIGJ5IHRoZQorZ2l2ZW4gZmFjdG9yLCBhbGxvd2luZyB0aW1lLXNlbnNpdGl2ZSBzY3JpcHRzIHRvIGJlIGFkanVzdGVkIHRvIGNoYW5naW5nCitjb25kaXRpb25zIHN1Y2ggYXMgY29uZ2VzdGVkIG5ldHdvcmtzIG9yIGRpZmZlcmVudC1zcGVlZCBtb2RlbXMgd2l0aG91dAoraGF2aW5nIHRvIGNoYW5nZSBlYWNoIElOUFVULWNsYXNzIGNvbW1hbmQuICBUaGlzIGFmZmVjdHMgb25seSB0aG9zZSB0aW1lb3V0cwordGhhdCBhcmUgZ2l2ZW4gaW4gc2Vjb25kcywgbm90IGFzIHdhbGwtY2xvY2sgdGltZXMuICBBbHRob3VnaCB0aGUgc2NhbGUKK2ZhY3RvciBjYW4gaGF2ZSBhIGZyYWN0aW9uYWwgcGFydCwgdGhlIElOUFVUIHRpbWVvdXQgaXMgc3RpbGwgYW4gaW50ZWdlci4KK0FkZGVkIHRoaXMgdG8gU0hPVyBJTlBVVCwgYW5kIGFkZGVkIGEgXHYoaW5zY2FsZSkgdmFyaWFibGUgZm9yIGl0LgorY2t1dXNyLmgsIGNrdXVzW3IyNTddLmMsIDcgSmFuIDIwMDQuCisKK3VuZGVmIFwlYSwgXGZ2ZXJpZnkoYWJjLFwlYSkgcmV0dXJucyAwLCB3aGljaCBtYWtlcyBpdCBsb29rIGFzIGlmIFwlYSBpcyBhCitzdHJpbmcgY29tcG9zZWQgb2YgYSdzLCBiJ3MsIGFuZC9vciBjJ3MsIHdoZW4gaW4gZmFjdCBpdCBjb250YWlucyBub3RoaW5nLgorQ2hhbmdlZCBcZnZlcmlmeSgpIHRvIHJldHVybiAtMSBpbiB0aGlzIGNhc2UuICBja3V1czQuYywgMTIgSmFuIDIwMDQuCisKK1xmY29kZSh4eHgpIHJldHVybmVkIGFuIGVtcHR5IHN0cmluZyBpZiBpdHMgYXJndW1lbnQgc3RyaW5nIHdhcyBlbXB0eS4gIFRoaXMKK21ha2VzIGl0IHVuc2FmZSB0byB1c2UgaW4gYXJpdGhtZXRpYyBvciBib29sZWFuIGV4cHJlc3Npb25zLiAgQ2hhbmdlZCBpdCB0bworcmV0dXJuIDAgaWYgaXRzIGFyZ3VtZW50IHdhcyBtaXNzaW5nLCBudWxsLCBvciBlbXB0eS4gIGNrdXVzNC5jLCAxMiBKYW4gMjAwNC4KKworVXBkYXRlZCBcdmVyaWZ5KCkgYW5kIFxmY29kZSgpIGhlbHAgdGV4dC4gIGNrdXVzMi5jLCAxMiBKYW4gMjAwNC4KKworV2hpbGUgc2V0dGluZyB1cCBJS1NELCBJYW4gQmVja3dpdGggbm90aWNlZCB0aGF0IGluY2x1ZGluZyB0aGUgLS1pbml0ZmlsZToKK29wdGlvbiBjYXVzZWQgS2VybWl0IHRvIHN0YXJ0IHBhcnNpbmcgaXRzIG93biBDb3B5cmlnaHQgc3RyaW5nIGFzIGlmIGl0IHdlcmUKK3RoZSBjb21tYW5kIGxpbmUsIGFuZCBldmVudHVhbGx5IGNyYXNoLiAgSSBjb3VsZG4ndCByZXByb2R1Y2Ugb24gU29sYXJpcyAvCitTcGFyYyBidXQgSSBjb3VsZCBpbiBMaW51eCAvIGkzODYgKHdoYXQgSWFuIGlzIHVzaW5nKSAtLSBhIGNoYW5nZSBmcm9tIEplZmYKK29uIDI4IEFwciAyMDAzIHNldCB0aGUgY29tbWFuZC1saW5lIGFyZyBwb2ludGVyIHRvIGEgbGl0ZXJhbCBlbXB0eSBzdHJpbmcgaW4KK3ByZXNjYW4oKSBhYm91dCBsaW5lIDE3NDAgb2Ygb2YgY2t1dXM0LmM7IHRoZSBwb2ludGVyIGlzIGluY3JlbWVudGVkIG5leHQKK3RpbWUgdGhydSB0aGUgbG9vcCwgcmVzdWx0aW5nIGluIHJhbmRvbSBtZW1vcnkgYmVpbmcgcmVmZXJlbmNlZC4gIEZpeGVkIGJ5CitzZXR0aW5nIHRoZSBwb2ludGVyIHRvIE5VTEwgaW5zdGVhZCBvZiAiIi4gIGNrdXVzNC5jLCAxMiBKYW4gMjAwNC4KKworZGVjbGFyZSBcJmFbOTk5OTk5OTk5OTk5OTk5XSB3b3VsZCBkdW1wIGNvcmUgb24gc29tZSBwbGF0Zm9ybXMuICBhdG9pKCkKK29yIHdoYXRldmVyIHdvdWxkIHRydW5jYXRlIHRoZSBkaW1lbnNpb24gdG8gbWF4aW50LiAgV2hlbiB3ZSBhZGQgMSB0byB0aGUKK3Jlc3VsdCwgd2UgZ2V0IGEgbmVnYXRpdmUgbnVtYmVyLCB3aGljaCBpcyB1c2VkIGFzIGFuIGluZGV4LCBsb29wIHRlc3QsIGV0Yy4KK0ZpeGVkIGJvdGggZG9kY2woKSBhbmQgZGNsYXJyYXkoKSB0byBjaGVjayBmb3IgKG4rMSA8IDApLiAgY2t1dXNbcjVdLmMsCisxMiBKYW4gMjAwNC4KKworVW5peCB6Y2hraSgpIHdvdWxkIGZhaWwgb24gL2Rldi90dHksIHdoaWNoIGlzIHVucmVhc29uYWJsZS4gIFRoaXMgcHJldmVudGVkCitGT1BFTiAvUkVBRCBmcm9tIHJlYWRpbmcgZnJvbSB0aGUgdGVybWluYWwuICB6Y2hraSgpIGFscmVhZHkgYWxsb3dlZCBmb3IKKy9kZXYvbnVsbCwgc28gSSBhZGRlZCAvZGV2L3R0eSB0byB0aGUgbGlzdCBvZiBzcGVjaWFscy4gIERpdHRvIGZvciBGT1BFTgorL1dSSVRFIGFuZCB6Y2hrbygpLiAgY2t1ZmlvLmMgMTMgSmFuIDIwMDQuCisKK0FkZGVkIHVudGFiaWZ5KCkgcm91dGluZSB0byBja2NsaWIuW2NoXSwgMTMgSmFuIDIwMDQuCitBZGRlZCBGUkVBRCAvVFJJTSBhbmQgL1VOVEFCSUZZLiAgY2t1dXNbMjddLmMsIDEzIEphbiAyMDA0LgorQWRkZWQgXGZ1bnRhYmlmeSgpLiAgY2t1dXNyLmgsIGNrdXVzWzI0XS5jLCAxMyBKYW4gMjAwNC4KKworRGF0IE5ndXllbiBub3RpY2VkIHRoYXQgKHNldHEgdSAncCcpIGZvbGxvd2VkIGJ5ICh1KSBkdW1wZWQgY29yZS4gIFRoaXMgd2FzCitjYXVzZWQgYnkgYW4gb3Zlci1jbGV2ZXIgb3B0aW1pemF0aW9uIHRoYXQgc2tpcHBlZCBtYWxsb2NzIGZvciBzaG9ydAorbGl0ZXJhbHMsIGJ1dCB0aGVuIHdlbnQgb24gbGF0ZXIgdG8gdHJ5IHRvIGZyZWUgb25lIHRoYXQgaGFkbid0IGJlZW4KK21hbGxvYydkLiAgRml4ZWQgaW4gZG9zZXhwKCk6IGNrdXVzMy5jLCAxNCBKYW4gMjAwNC4KKworQ2F0Y2ggYW5vdGhlciBjb3B5cmlnaHQgZGF0ZS4gIGNrdXVzNS5jLCAxNCBKYW4gMjAwNC4KKworRml4ZWQgU1dJVENIIHRvIHdvcmsgZXZlbiB3aGVuIFNFVCBDT01NQU5EIERPVUJMRVFVT1RFIE9GRiAoZnJvbSBNYXJrCitTYXBpcm8pLiAgY2t1dXM1LmMsIDE1IEphbiAyMDA0LgorCitDaGFuZ2VkIHZlcnNpb24gdG8gOC4wLjIxMSBzbyBzY3JpcHRzIGNhbiB0ZXN0IGZvciByZWNlbnRseSBhZGRlZCBmZWF0dXJlcy4KK2NrY21haS5jLCAxNSBKYW4gMjAwNC4KKworRml4ZWQgYSBnbGl0Y2ggaW4gSzk1ICJoZWxwIHNldCBwb3J0Ii4gIGNrdXVzMi5jLCAyMCBKYW4gMjAwNC4KKworRml4IGZyb20gSmVmZjogQ29ubmVjdGlvbnMgdG8gYSBUTFMtYXdhcmUgcHJvdG9jb2wgd2hpY2ggcmVxdWlyZSBhIHJlY29ubmVjdAordXBvbiBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gZmFpbHVyZSBjb3VsZCBub3QgcmVjb25uZWN0IGlmIHRoZSBjb25uZWN0aW9uCit3YXMgaW5pdGlhdGVkIGZyb20gdGhlIGNvbW1hbmQgbGluZSBvciB2aWEgYSBVUkwuICBja2N0ZWwuYyBja2NtYWkuYworY2t1dXNyLmMgY2t1dXM3LmMgY2t1dXN5LmMsIDIwIEphbiAyMDA0LgorCitGcm9tIEFsZXggTGV3aW46IG1ha2VmaWxlIHRhcmdldCBhbmQgI2lmZGVmIGZvciBNYWMgT1MgWCAxMC4zIChQYW50aGVyKToKK21ha2VmaWxlLCBja2NuZXQuYywgNyBGZWIgMjAwNC4KKworQWRkZWQgS0ZMQUdTIHRvIHNjbzMydjUwNyB0YXJnZXRzIHRvIG1ha2UgUFRZIGFuZCBTU0ggY29tbWFuZHMgd29yay4gIFRoZQorc2FtZSBmbGFncyBjb3VsZCBwcm9iYWJseSBhbHNvIGJlIGFkZGVkIHRvIGVhcmxpZXIgT1NSNSB0YXJnZXRzIGJ1dCB0aGV5CitoYXZlIG5vdCBiZWVuIHRlc3RlZCB0aGVyZS4gIG1ha2VmaWxlLCA3IEZlYiAyMDA0LgorCitDaGVja2VkIGEgY29tcGxhaW50IHRoYXQgIkxPQ0FMICZhIiBkaWQgbm90IG1ha2UgYXJyYXkgXCZhW10gbG9jYWwuICBJbmRlZWQKK2l0IGRpZCBub3QsIGFuZCBjYW4gbm90LiAgWW91IGhhdmUgdG8gdXNlIHRoZSBmdWxsIHN5bnRheCBpbiB0aGUgTE9DQUwKK2NvbW1hbmQsICJMT0NBTCBcJmFbXSIsIG9yIGVsc2UgaXQgZG9lc24ndCBrbm93IGl0J3Mgbm90IGEgbWFjcm8gbmFtZWQgJmEuCis3IEZlYiAyMDA0LgorCitGaXhlZCBzb21lIGNvbmZ1c2lvbiBpbiBjcmVhdGluZyBJS1NEIGRhdGFiYXNlIGZpbGUgYW5kIHRlbXAtZmlsZSBuYW1lcy4KK0kgd2FzIGNhbGxpbmcgemZucWZwKCkgd2l0aG91dCByZW1lbWJlcmluZyB0aGF0IHRoZSBwYXRoIG1lbWJlciBvZiB0aGUKK3JldHVybmVkIHN0cnVjdCBpbmNsdWRlZCB0aGUgZmlsZW5hbWUsIHNvIHRvIGdldCBqdXN0IHRoZSBkaXJlY3RvcnkgbmFtZSwKK0kgbmVlZGVkIHRvIHN0cmlwIHRoZSBmaWxlbmFtZSBmcm9tIHRoZSByaWdodC4gIGNrdXVzeS5jLCAyIE1hciAyMDA0LgorCitOZXcgY2t1YXRoLmMsIGNrX3NzbC5jIGZyb20gSmVmZi4gIDIgTWFyIDIwMDQuCisKK1VwZGF0ZWQgSmVmZidzIGFmZmlsaWF0aW9uIGluIFZFUlNJT04gY29tbWFuZCB0ZXh0LiAgY2t1dXNyLmMsIDIgTWFyIDIwMDQuCisKK0Rlc2lnbmF0aW9uIGNoYW5nZWQgZnJvbSBEZXYuMDAgdG8gQmV0YS4wMS4gIGNrY21haS5jLCAyIE1hciAyMDA0LgorCitGaXhlZCB6cmVuYW1lKCkgc3lzbG9nZ2luZyAtLSBpdCBoYWQgc3VjY2VzcyBhbmQgZmFpbHVyZSByZXZlcnNlZC4KK0JldGEuMDI6IGNrdWZpby5jLCA0IE1hciAyMDA0LgorCitQcm9ibGVtOiB3aGVuIGFjY2Vzc2luZyBJS1NEIHZpYSBhIGtlcm1pdDovLyBvciBpa3NkOi8vIFVSTCwgYW5kIGEgdXNlciBJRAoraXMgZ2l2ZW4gYnV0IG5vIHBhc3N3b3JkLCBkb3hhcmcoKSBzZXQgdGhlIHBhc3N3b3JkIHRvICIiIGluc3RlYWQgb2YgbGVhdmluZworaXQgTlVMTCwgYnV0IGFsbCB0aGUgdGVzdHMgaW4gZG91cmwoKSBhcmUgZm9yIE5VTEwuICBGaXhlZCBpbiBkb3hhcmcoKToKK2NrdXVzeS5jLCA1IE1hciAyMDA0LgorCitUaGUgbG9naWMgaW4gZG91cmwoKSBhYm91dCB3aGljaCBtYWNybyB0byBjb25zdHJ1Y3QgKGxvZ2luIGFuZCBjb25uZWN0LAorbG9naW4gYW5kIGdldCBkaXJlY3RvcnkgbGlzdGluZywgb3IgbG9naW4gYW5kIGZldGNoIGEgZmlsZSkgd2FzIGEgYml0IG9mZiwKK3NvIGFsbCB0aHJlZSBjYXNlcyB3ZXJlIG5vdCBoYW5kbGVkLiAgY2tjbWFpLmMsIDUgTWFyIDIwMDQuCisKK1RyaWFsIEJldGEgYnVpbGRzOgorIC4gSFAtVVggQi4xMS4xMSBQQS1SSVNDCisgLiBIUC1VWCBCLjExLjIzIElBNjQKKyAuIFRydTY0IDQuMEcgQWxwaGEKKyAuIFRydTY0IDUuMUIgQWxwaGEKKyAuIERlYmlhbiAzLjAgaTM4NgorIC4gUmVkIEhhdCBFUyAyLjEgaTM4NgorIC4gU2xhY2t3YXJlIDkuMSBpMzg2CisgLiBWTVMgNy4zLTEgQWxwaGEgKyBVQ1ggNS4zCisgLiBWTVMgNy4zLTEgQWxwaGEgbm8gVENQL0lQCisgLiBWTVMgNy4zIEFscGhhIE11bHRpTmV0IDQuMyBBLVgKKyAuIFNDTyBVbml4V2FyZSA3LjEuNCBpMzg2CisgLiBTQ08gT1NSNS4wLjcgaTM4NgorIC4gU29sYXJpcyA5IFNwYXJjCisKK0ZpeGVkIGNvbXBpbGVyIHdhcm5pbmcgaW4gZG94YXJnKCkgY2F1c2VkIGJ5IHR5cG8gKE5VTEwgaW5zdGVhZCBvZiBOVUwpIGluCit0aGUgNSBNYXJjaCBkb3hhcmcoKSBlZGl0LiAgY2t1dXN5LmMsIDkgTWFyIDIwMDQuCisKK0lLU0QgKGtlcm1pdDovLykgY29tbWFuZC1saW5lIFVSTHMgZGlkIG5vdCB3b3JrIHJpZ2h0IGlmIHRoZSBjbGllbnQgaGFkCithbHJlYWR5IHByZWF1dGhlbnRpY2F0ZWQgd2l0aCBLZXJiZXJvcyBvciBzb21lc3VjaCBiZWNhdXNlIHRoZXkgdHJpZWQgdG8gbG9nCitpbiBhZ2FpbiB3aXRoIFJFTU9URSBMT0dJTi4gIFRoZSBtYWNyb3MgY29uc3RydWN0ZWQgaW4gZG94YXJnKCkgbmVlZGVkIHRvCitjaGVjayBcdihhdXRoc3RhdGUpIGJlZm9yZSBhdHRlbXB0aW5nIFJFTU9URSBMT0dJTi4gIGNrY21haS5jLCAxMCBNYXIgMjAwNC4KKworQWRkZWQgY2t1a2VyLm5yIHRvIHguc2ggKGNrZGFpbHkgdXBsb2FkKSBhbmQgdXBkYXRlZCBja3VrZXIubnIgd2l0aCBjdXJyZW50Cit2ZXJzaW9uIG51bWJlciBhbmQgZGF0ZXMuICAxMCBNYXIgMjAwNC4KKworUmVwbGFjZWQgaGFyZHdpcmVkIHJlZmVyZW5jZXMgdG8gL3Vzci9sb2NhbCBpbiBtYWtlZmlsZSB3aXRoICQocHJlZml4KQorKHdoaWNoIGRlZmF1bHRzIHRvIC91c3IvbG9jYWwsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBvbiB0aGUgY29tbWFuZCBsaW5lKSwKK3N1Z2dlc3RlZCBieSBOZWxzb24gQmVlYmUgZm9yIHVzZSB3aXRoIENvbmZpZ3VyZS4gIDEwIE1hciAyMDA0LgorCitGcm9tIE5lbHNvbiBCZWViZTogSW4gdGhlIEtlcm1pdCBtYWtlZmlsZSBpbiB0aGUgaW5zdGFsbCB0YXJnZXQgY29tbWFuZHMsCitsaW5lIDk4MSByZWFkczoKKworICAgICAgICBjcCAkKEJJTkFSWSkgJChERVNURElSKSQoQklORElSKS9rZXJtaXQgfHwgZXhpdCAxO1wKKworQ291bGQgeW91IHBsZWFzZSBhZGQgdGhpcyBsaW5lIGJlZm9yZSBpdDoKKworICAgICAgICBybSAtZiAkKERFU1RESVIpJChCSU5ESVIpL2tlcm1pdDtcCisKK1NvbWUgc2l0ZXMgKG1pbmUgaW5jbHVkZWQpIGtlZXAgbXVsdGlwbGUgdmVyc2lvbnMgb2Ygc29mdHdhcmUgYXJvdW5kLAord2l0aCBoYXJkIGxpbmtzIGJldHdlZW4gJChwcmVmaXgpL3Byb2duYW1lIGFuZCAkKHByZWZpeCkvcHJvZ25hbWUteC55LnouCitGYWlsdXJlIHRvIHJlbW92ZSB0aGUgJChwcmVmaXgpL3Byb2duYW1lIGF0ICJtYWtlIGluc3RhbGwiIHRpbWUgdGhlbgorcmVwbGFjZXMgdGhlIG9sZCAkKHByZWZpeCkvcHJvZ25hbWUteC55Lnogd2l0aCB0aGUgbmV3IG9uZSwgZGVzdHJveWluZworYW4gb2xkIHZlcnNpb24gdGhhdCB0aGUgc2l0ZSB3YW50ZWQgdG8gYmUgcHJlc2VydmVkLiAgbWFrZWZpbGUsIDEwIE1hciAyMDA0LgorCitNaW5vciBzeW50YXggYW5kIHR5cG8gZml4ZXMgKG1vc3RseSBwcm90b3R5cGVzKTogY2tjZGViLmgsIGNrY2Zucy5jLAorY2tjbGliLmMsIGNrdWZpby5jLCBja3V1c3IuaCwgY2t1dXN4LmMsIDEwIE1hciAyMDA0LiAgKEkgc3RpbGwgaGF2ZSBhIGZldworbW9yZSB0byBkby4pCisKK0FkZGVkIENDPSQoQ0MpIENDMj0kKENDMikgdG8gbWFueSAoYnV0IG5vdCBhbGwpIG1ha2VmaWxlIHRhcmdldHMgdGhhdAorcmVmZXJlbmNlIG90aGVyIG1ha2VmaWxlIHRhcmdldHMuICBPbiBzb21lIHBsYXRmb3JtcyAobm90YWJseSBBSVgsIFNvbGFyaXMsCitTdW5PUykgdGhlcmUgYXJlIHNwZWNpZmljIHRhcmdldHMgZm9yIGRpZmZlcmVudCBjb21waWxlcnMsIHNvIEkgc2tpcHBlZAordGhvc2UuICBtYWtlZmlsZSwgMTAgTWFyIDIwMDQuCisKK0FkZGVkIGVycm9yIGNoZWNraW5nIHRvIGtlcm1pdDovLyBVUkwgbWFjcm9zLCBzbyB0aGV5IGRvbid0IHBsb3cgYWhlYWQKK2FmdGVyIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4gIGNrY21haS5jLCAxMSBNYXIgMjAwNC4KKworQWRkZWQgRnJlZUJTRCA0LjkgYW5kIDUuMSB0YXJnZXRzIChvbmx5IHRoZSBoZXJhbGQgaXMgYWZmZWN0ZWQpLgorbWFrZWZpbGUsIGNrdXZlci5oLCAxMSBNYXIgMjAwNC4KKworQWRkZWQgIkxJQlM9LWxjcnlwdCIgdG8gYnNkNDQgdGFyZ2V0cyBzaW5jZSBub3dhZGF5cyBjcnlwdCBpcyBhbG1vc3QgYWx3YXlzCit1bmJ1bmRsZWQgZnJvbSBsaWJjLiAgQWxzbyBhZGRlZCBleHBsYW5hdG9yeSBub3Rlcy4gIG1ha2VmaWxlLCAxMSBNYXIgMjAwNC4KKworQ2hhbmdlZCBNQU5ESVIgdG8gZGVmYXVsdCB0byAkKG1hbnJvb3QpL21hbi9tYW4xLCBhbmQgbWFucm9vdCB0byBkZWZhdWx0Cit0byAkKHByZWZpeCkuICBNb3JlIGFkZGluZyBvZiBDQz0kKENDKSBjbGF1c2VzOiB7RnJlZSxOZXQsT3Blbn1CU0QsIDQuNEJTRC4KK21ha2VmaWxlLCAxMSBNYXIgMjAwNC4KKworTWlzY2VsbGFuZW91cyBjbGVhbnVwczogY2t1dXN4LmMsIGNrY25ldC5jLCBja3VmaW8uYywgMTEgTWFyIDIwMDQuCisKK0NvcnJlY3RlZCB0aGUgY2hlY2sgaW4gdGhlIGxpbnV4IHRhcmdldCB0byBzZWUgaWYgL3Vzci9pbmNsdWRlL2NyeXB0LmgKK2V4aXN0cywgYW5kIGlmIHNvIHRvIGRlZmluZSBIQVZFX0NSWVBUX0gsIHdoaWNoIGlzIHVzZWQgaW4gY2tjZGViLmggdG8KKyNpbmNsdWRlIDxjcnlwdC5oPiB0byBnZXQgdGhlIHByb3RvdHlwZSBmb3IgY3J5cHQoKSBhbmQgcHJldmVudCBib2d1cworY29udmVyc2lvbnMgb24gaXRzIHJldHVybiB0eXBlIG9uIDY0LWJpdCBwbGF0Zm9ybXMgKHRoZSBwcmV2aW91cyB0ZXN0IHdhc24ndAorcXVpdGUgcmlnaHQgYW5kIHRoZSByZXN1bHRpbmcgc3ltYm9sIHdhc24ndCBzcGVsbGVkIHJpZ2h0KS4gIG1ha2VmaWxlLAorMTIgTWFyIDIwMDQuCisKK0Zyb20gSmVmZiwgMTQgTWFyIDIwMDQ6CisgLiBJbml0aWFsaXplIGxvY2FsdWlkYnVmW10gaW4gdG5fc25lbnYoKTogY2tjdGVsLmMuCisgLiBSZW1vdmUgcmVtb3RlLW1vZGUgY2hlY2tzIGluIGh1cG9rKCkgZm9yIEs5NUcgb25seSAod2h5Pyk6IGNrdXVzMy5jLgorIC4gQWRkIGhlbHAgdGV4dCBmb3IgbmV3IEs5NS1vbmx5IFRZUEUgL0dVSSBzd2l0Y2hlczogY2t1dXMyLmMuCisgLiBUWVBFIC9HVUkgcGFyc2luZywgLi4uOiBja3V1c3IuYy4KKyAuIFRZUEUgL0dVSSBhY3Rpb24sIGRvdHlwZSgpOiBja3V1czYuYworIC4gQ2hhbmdlIEplZmYncyBhZmZpbGlhdGlvbjogbW9zdCBtb2R1bGVzLgorCisyMCBNYXIgMjAwNDogTG9va2VkIGludG8gYWRkaW5nIGxvbmcgZmlsZSBzdXBwb3J0LCBpLmUuIGhhbmRsaW5nIGZpbGVzIG1vcmUKK3RoYW4gMkdCIChvciA0R0IpIGxvbmcuICBEaXNjb3ZlcmVkIHZlcnkgcXVpY2tseSB0aGlzIHdvdWxkIGJlIGEgbWFqb3IKK3Byb2plY3QuICBFYWNoIHBsYXRmb3JtIGhhcyBhIGRpZmZlcmVudCBBUEksIG9yIGVudmlyb25tZW50LCBvciB0cmFuc2l0aW9uCitwbGFuLCBvciB3aGF0ZXZlciAtLSBhIG5pZ2h0bWFyZSB0byBoYW5kbGUgaW4gcG9ydGFibGUgY29kZS4gIEF0IHRoZSB2ZXJ5CitsZWFzdCB3ZSdsbCBuZWVkIHRvIGNvbnZlcnQgYSBsb3Qgb2YgS2VybWl0IHZhcmlhYmxlcyBmcm9tIGxvbmcgb3IgdW5zaWduZWQKK2xvbmcgdG8gc29tZSBuZXcgS2VybWl0IHR5cGUsIHdoaWNoIGluIHR1cm4gaXMgI2RlZmluZWQgb3IgdHlwZWRlZidkCithcHByb3ByaWF0ZWx5IGZvciBlYWNoIHBsYXRmb3JtICh0byBvZmZfdCBvciBzaXplX3Qgb3Igd2hhdGV2ZXIpLiAgVGhlbiB3ZQoraGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgZGV0YWlscyBvZiBvcGVuKCkgdnMgZm9wZW4oKTsgcHJpbnRmKCkgZm9ybWF0cyAoJWxsZAordnMgJUxkIHZzICUiUFJJZDY0Ii4uLiksIHBsYXRmb3JtcyBsaWtlIEhQLVVYIHdoZXJlIHlvdSBtaWdodCBoYXZlIHRvIHVzZQorZGlmZmVyZW50IEFQSXMgZm9yIGRpZmZlcmVudCBmaWxlIHN5c3RlbXMgb24gdGhlIHNhbWUgY29tcHV0ZXIsIGV0Yy4gIFdlJ2xsCituZWVkIHRvIGNvbmZyb250IHRoaXMgc29vbiwgYnV0IGxldCdzIGdldCBhIGdvb2Qgc3RhYmxlIDguMC4yMTEgcmVsZWFzZSBvdXQKK2ZpcnN0ISAgTWVhbndoaWxlLCBmb3IgZnV0dXJlIHJlZmVyZW5jZSwgaGVyZSBhcmUgYSBmZXcgYXJ0aWNsZXM6CisKK0dlbmVyYWw6IGh0dHA6Ly9mcmVzaG1lYXQubmV0L2FydGljbGVzL3ZpZXcvNzA5LworTGludXg6ICAgaHR0cDovL3d3dy5lY2UudXRleGFzLmVkdS9+bHVvL2xpbnV4X2xmcy5odG1sCitIUC1VWDogICBodHRwOi8vZGV2cnNyYzEuZXh0ZXJuYWwuaHAuY29tL1NUSy9wYXJ0bmVyL2xnX2ZpbGVzLnBkZgorU29sYXJpczogaHR0cDovL3d3d3Muc3VuLmNvbS9zb2Z0d2FyZS93aGl0ZXBhcGVycy93cC1sYXJnZWZpbGVzL2xhcmdlZmlsZXMucGRmCisKK0xvb2tlZCBpbnRvIEZUUCB0aW1lb3V0cy4gIEl0IGFwcGVhcnMgSSBjYW4ganVzdCBjYWxsIGVtcHR5KCkgKHdoaWNoIGlzCitub3RoaW5nIG1vcmUgdGhhbiBhIGZyb250IGVuZCBmb3Igc2VsZWN0KCkpIHdpdGggdGhlIGRlc2lyZWQgdGltZW91dCBiZWZvcmUKK2FueSBraW5kIG9mIG5ldHdvcmsgcmVhZC4gIElmIGl0IHJldHVybnMgPD0gMCwgd2UgaGF2ZSBhIHRpbWVvdXQuICBUaGlzIGlzCitub3QgcXVpdGUgdGhlIHNhbWUgYXMgdXNpbmcgYWxhcm0oKSAvIHNpZ25hbCgpIGFyb3VuZCBhIHJlY3YoKSAod2hpY2ggY291bGQKK2dldCBzdHVjaykgYnV0IGFsYXJtKCkgLyBzaWduYWwoKSBhcmUgbm90IG5vdCB1c2VkIGluIHRoZSBGVFAgbW9kdWxlIGFuZCBhcmUKK25vdCBuYXR1cmFsbHkgcG9ydGFibGUgdG8gV2luZG93cywgYnV0IHNlbGVjdCgpIGlzIGFscmVhZHkgaW4gdXNlIGluIHRoZSBGVFAKK21vZHVsZSBmb3IgYm90aCBVbml4IGFuZCBXaW5kb3dzLiAgVGhpcyBmb3JtIG9mIHRpbWVvdXQgY291bGQgYmUgdXNlZAorcG9ydGFibHkgZm9yIGJvdGggY29tbWFuZCByZXNwb25zZSBhbmQgZGF0YSByZWFkcy4gIFdoYXQgYWJvdXQgd3JpdGVzIHRvIHRoZQorY29tbWFuZCBvciBkYXRhIHNvY2tldD8gIFRoZXkgY2FuIGdldCBzdHVjayBmb3IgaG91cnMgYW5kIGhvdXJzIHdpdGhvdXQKK3JldHVybmluZyB0b28sIGJ1dCB0aGUgc2VsZWN0KCkgYXBwcm9hY2ggd29uJ3QgaGVscCBoZXJlIC0tIHdlIG5lZWQgdGhlCithY3R1YWwgc2VuZCgpIG9yIHJlY3YoKSB0byB0aW1lIG91dCwgb3IgYmUgd3JhcHBlZCBpbiBhbiBhbGFybSgpL3NpZ25hbCgpCitraW5kIG9mIG1lY2hhbmlzbS4gIEJ1dCBpZiB3ZSBjYW4gZG8gdGhhdCBmb3Igc2VuZHMsIHdlIGNhbiBhbHNvIGRvIGl0IGZvcgorcmVjZWl2ZXMuICBCZXR0ZXIgY2hlY2sgd2l0aCBKZWZmIGJlZm9yZSBJIHN0YXJ0IHByb2dyYW1taW5nIGFueXRoaW5nLgorMjAgTWFyIDIwMDQuCisKK0xhdGVyOiBEZWNpZGVkIHRvIHBvc3Rwb25lIHRoZSBhYm92ZSB0d28gcHJvamVjdHMgKGRpdHRvIElQdjYpIHVudGlsIGFmdGVyCis4LjAuMjExIGlzIHJlbGVhc2VkIGJlY2F1c2UgYm90aCB3aWxsIGhhdmUgbWFqb3IgaW1wYWN0cyBvbiBwb3J0YWJpbGl0eS4KK0dydW1ibGU6IGFsbCBpL28gQVBJcyBzaG91bGQgaGF2ZSBiZWVuIGRlc2lnbmVkIGZyb20gdGhlIGJlZ2lubmluZyB3aXRoIGEKK3RpbWVvdXQgcGFyYW1ldGVyLiAgVG8gdGhpcyBkYXksIGhhcmRseSBhbnkgaGF2ZSB0aGlzIGZlYXR1cmUuCisKKzMtNCBBcHIgMjAwNDogTW9yZSA4LjAuMjExIEJldGEuMDIrIHRlc3QgYnVpbGRzOgorCisgLiBGcmVlQlNEIDMuMworIC4gRnJlZUJTRCA0LjQKKyAuIExpbnV4IERlYmlhbiAyLjEKKyAuIExpbnV4IFJIIDYuMQorIC4gTGludXggUkggNy4xCisgLiBMaW51eCBSSCA3LjIKKyAuIExpbnV4IFJIIDkgKHdpdGggODQgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBmZWF0dXJlIHNlbGVjdGlvbikKKyAuIExpbnV4IFN1U0UgNi40CisgLiBMaW51eCBTdVNFIDcuMAorIC4gTmV0QlNEIDEuNC4xCisgLiBOZXRCU0QgMS41LjIKKyAuIE9wZW5CU0QgMi41CisgLiBPcGVuQlNEIDMuMAorIC4gUU5YIDQuMjUKKyAuIFNDTyBVbml4V2FyZSAyLjEuMworIC4gU0NPIFVuaXhXYXJlIDcuMS40CisgLiBTQ08gT3BlblNlcnZlciA1LjAuNworIC4gU0NPIFhFTklYIDIuMy40IChubyBUQ1ApCisKK0NoYW5nZXMgbmVlZGVkOiBOb25lLgorCitQcm9ibGVtOiBTQ08gWEVOSVggMi4zLjQgbmV0d29yayBidWlsZCBmYWlsZWQgaW4gdGhlIEZUUCBtb2R1bGUgd2l0aAoraGVhZGVyLWZpbGUgc3ludGF4IGFuZCBjb25mbGljdGluZy1kZWZpbml0aW9ucyB0cm91YmxlLiAgSSdtIG5vdCBnb2luZyB0bwordHJ5IHRvIGZpeCBpdDsgOC4wLjIwOSBidWlsdCBPSyB3aXRoIEZUUCwgc28gd2UnbGwganVzdCBrZWVwIHRoYXQgb25lCithdmFpbGFibGUuCisKK0dvdCBhY2Nlc3MgdG8gVk1TIDguMSBvbiBJQTY0LiAgQnVpbGRpbmcgdGhlIG5vbmV0IHZlcnNpb24gb2YgQy1LZXJtaXQKK3JlcXVpcmVkIG1pbm9yIG1vZGlmaWNhdGlvbnMgdG8gY2t2dm1zLmgsIGNrdltmdF1pby5jLCBhbmQgY2t2Y29uLmMsIHRvCithY2NvdW50IGZvciBhIHRoaXJkIGFyY2hpdGVjdHVyZS4gIEFsc28gdG8gU0hPVyBGRUFUVVJFUyBpbiBja3V1czUuYy4gIE9uY2UKK3RoYXQgd2FzIGRvbmUsIHRoZSBVQ1ggNS41IHZlcnNpb24gYnVpbHQgT0sgdG9vLiAgU3RhcnRzIE9LLCBtYWtlcyBUZWxuZXQKK2Nvbm5lY3Rpb24gT0ssIHNlbmRzIGZpbGVzLiAgSGFzIHNvbWUgb2J2aW91cyBnbGl0Y2hlcyB0aG91Z2ggLS0gInN0YXQiCithZnRlciBhIGZpbGUgdHJhbnNmZXIgcmVwb3J0cyAwIGVsYXBzZWQgdGltZSAoaW4gZmFjdCBpdCB3YXMgMDA6MDk6NDgpIGFuZAorMTIxOTE3NDQwMCBjcHMgKHdoZW4gaW4gZmFjdCBpdCB3YXMgMTAzNjQpLiAgVGhpcyBkb2Vzbid0IGhhcHBlbiBvbiB0aGUKK0FscGhhLiAgQnR3LCB0aGUgSUE2NCBiaW5hcnkgaXMgdHdpY2UgYXMgYmlnIGFzIHRoZSBBbHBoYSBvbmUuICBDaGFuZ2VkCit0byBCZXRhLjAzLiAgNSBBcHIgMjAwNC4KKworRml4ZWQgdGhlIGNrZGFpbHkgc2NyaXB0IHRvIGluY2x1ZGUgdGhlIG1ha2VmaWxlIGFuZCBtYW4gcGFnZSBpbiB0aGUgWmlwCitmaWxlICh0aGV5IHdlcmUgbm90IGluY2x1ZGVkIGJlY2F1c2UgdGhlIFppcCBmaWxlIHdhcyBpbnRlbmRlZCBtYWlubHkgZm9yCitWTVMgdXNlcnMsIGJ1dCBzb21lIFVuaXggdXNlcnMgcHJlZmVyIFppcCB0byB0YXIuZ3opLiAgNiBBcHIgMjAwNC4KKworVHJhY2VkIHByb2JsZW1zIGluIFZNUy9JQTY0IHN0YXRpc3RpY3MgcmVwb3J0IHRvIHJmdGltZXIoKS9nZnRpbWVyKCkgaW4KK2NrdnRpby5jLCB3aGljaCB1c2Ugc3lzJCBhbmQgbGliJCBjYWxscyB0byBmaWd1cmUgZWxhcHNlZCB0aW1lLiAgVGhlc2Ugd29yaworb24gVkFYIGFuZCBBbHBoYSBidXQgbm90IElBNjQuICBTZW50IGEgcmVwb3J0IHRvIHRoZSBjaGllZiBlbmdpbmVlciBvZiB0aGUKK0lBNjQgVk1TIHBvcnQ7IGhlIHNheXMgaXQncyBwcm9iYWJseSBhIGJ1ZyBpbiBWTVMgOC4xICh3aGljaCBpcyBub3QgYSByZWFsCityZWxlYXNlKTsgaGUnbGwgbWFrZSBzdXJlIGl0J3MgZml4ZWQgaW4gOC4yLiAgQXMgYW4gZXhwZXJpbWVudCwgdHJpZWQKK3N3YXBwaW5nIGluIHRoZSBVbml4IHZlcnNpb25zIG9mIHRoZXNlIHJvdXRpbmVzICh3aGljaCBjYWxsIGdldHRpbWVvZmRheSgpCitldGMpLiAgVGhleSBzZWVtIHdvcmsganVzdCBmaW5lIChpdCBodW5nIGEgY291cGxlIHRpbWVzIGJ1dCBJIHRoaW5rIHRoYXQncworYmVjYXVzZSB0aGUgdW5kZXJseWluZyBzeXN0ZW0gaHVuZyB0b287IHRyeWluZyBpdCBsYXRlciBvbiBhIG5ldyBjb25uZWN0aW9uLAoraXQgd2FzIGZpbmU7IGhvd2V2ZXIgSSBub3RpY2VkIGEgQklHIGRpc2NyZXBhbmN5IGluIHRocm91Z2hwdXQgYmV0d2Vlbgorc2VuZGluZyBhbmQgcmVjZWl2aW5nKS4gIE1vdmVkIGRlZmluaXRpb25zIGZvciBWTVM2NEJJVCBhbmQgVk1TSTY0IHRvCitja2NkZWIuaCBzbyBhbGwgbW9kdWxlcyBjYW4gdXNlIHRoZW0gYW5kIGFkZGVkIHRoZW0gdG8gdGhlIFNIT1cgRkVBVFVSRVMKK2Rpc3BsYXkuICBBZGRlZCBWTVNWODAgZGVmaW5pdGlvbiB0byBidWlsZCBwcm9jZWR1cmUuICBCZXRhLjAzKy4gIGNrY2RlYi5oLAorY2tjdXVzNS5jLCBja2N2dm1zLmgsIGNrdnRpby5jLCBja3ZrZXIuY29tLCA2IEFwciAyMDA0LgorCitXaGlsZSBkb2luZyB0aGUgYnVpbGQtYWxsLCBJIG5vdGljZWQgdGhlIFZNUyB2ZXJzaW9uIGRpZCBub3QgYnVpbGQgd2l0aAorTXVsdGluZXQgb3Igb2xkZXIgVUNYIHZlcnNpb25zLCBhbHdheXMgd2l0aCB0aGUgc2FtZSBlcnJvcnMgLS0gdW5kZWNsYXJlZAordmFyaWFibGVzLCB1bmRlZmluZWQgc3ltYm9scywgYWxsIFRDUC9JUCByZWxhdGVkLiAgVGhpcyBkaWRuJ3QgaGFwcGVuIGEKK2NvdXBsZSB3ZWVrcyBhZ28uLi4gIFNvbWVob3cgdGhlIG9yZGVyIG9mICNpbmNsdWRlcyB3YXMgbWVzc2VkIHVwIC0tCitja3V1c3IuaCBkZXBlbmRlZCBvbiBzeW1ib2xzIHRoYXQgYXJlIGRlZmluZWQgaW4gY2tjbmV0LmgsIGJ1dCBja2NuZXQuaAord2FzIGJlaW5nIGluY2x1ZGVkIGFmdGVyIGNrdXVzci5oLi4uICB0aGlzIHdhcyBjb21wb3VuZGVkIGJ5IHR3byBtaXNzaW5nCitjb21tYXMgaW4gY2t2a2VyLmNvbS4gIDExIEFwciAyMDA0LgorCitSZW1vdmVkIEJldGEgZGVzaWduYXRpb24sIHJlbGVhc2VkIGFzIDguMC4yMTEsIDEwIEFwciAyMDA0LgorCistLS04LjAuMjExLS0tCisKK0kgaGFkIHNvbWVob3cgbG9zdCB0aGUgZWRpdCB0byBja3V0aW8uYyB0aGF0IGNoYW5nZWQgdGhlIFVVQ1AgbG9ja2ZpbGUgZm9yCitNYWMgT1MgWCBmcm9tIC92YXIvc3Bvb2wvdXVjcCB0byAvdmFyL3Nwb29sL2xvY2suICBTbyBJIHNsaXBwZWQgaXQgaW4gYW5kCityZS11cGxvYWRlZCB2ZXJzaW9uIDguMC4yMTEuICBZb3UgY2FuIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmVjYXVzZSBTSE9XCitWRVJTSU9OUyBoYXMgYSAxNyBBcHIgMjAwNCBmb3IgdGhlIENvbW11bmljYXRpb25zIEkvTyBtb2R1bGUuICBBbHNvIHRoZSAxMC4zCitleGVjdXRhYmxlIG5vdyBoYXMgYSBkZXNpZ25lciBiYW5uZXI6ICJNYWMgT1MgWCAxMC4zIi4gIG1ha2VmaWxlLCBja3V2ZXIuaCwKK2NrdXRpby5jLCBja3V1c1s0NV0uYywgMTcgQXByIDIwMDQuCisKKyoqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2tjYXNjLmggYi9ja2VybWl0LTguMC4yMTEvY2tjYXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjMzJjYwotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja2Nhc2MuaApAQCAtMCwwICsxLDY5IEBACisvKgorICBGaWxlIENLQ0FTQy5ICisgIE1uZW1vbmljcyBmb3IgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJzIChhbmQgU3BhY2UpIGZvciB1c2Ugd2l0aCBDLUtlcm1pdC4KKyovCisvKgorICBBdXRob3I6IEZyYW5rIGRhIENydXogKGZkY0Bjb2x1bWJpYS5lZHUpLgorICBDb2x1bWJpYSBVbml2ZXJzaXR5IEFjYWRlbWljIEluZm9ybWF0aW9uIFN5c3RlbXMsIE5ldyBZb3JrIENpdHkuCisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisjaWZuZGVmIENLQ0FTQ19ICisjZGVmaW5lIENLQ0FTQ19ICisKKyNkZWZpbmUgTlVMICAnXDAnICAgICAgIC8qIE51bGwgQ3RybC1AKi8KKyNkZWZpbmUgU09IICAgIDEgICAgICAgIC8qIFN0YXJ0IG9mIGhlYWRlciBDdHJsLUEgKi8KKyNkZWZpbmUgU1RYICAgIDIgICAgICAgIC8qIEN0cmwtQiAqLworI2RlZmluZSBFVFggICAgMyAgICAgICAgLyogQ3RybC1DICovCisjZGVmaW5lIEVPVCAgICA0ICAgICAgICAvKiBDdHJsLUQgKi8KKyNkZWZpbmUgRU5RICAgIDUgICAgICAgIC8qIEVOUSBDdHJsLUUgKi8KKyNkZWZpbmUgQUNLICAgIDYgICAgICAgIC8qIEN0cmwtRiAqLworI2RlZmluZSBCRUwgICAgNyAgICAgICAgLyogQmVsbCAoQmVlcCkgQ3RybC1HICovCisjZGVmaW5lIEJTICAgICA4ICAgICAgICAvKiBCYWNrc3BhY2UgQ3RybC1IICovCisjZGVmaW5lIEhUICAgICA5ICAgICAgICAvKiBIb3Jpem9udGFsIFRhYiBDdHJsLUkgKi8KKyNkZWZpbmUgTEYgICAgMTAgICAgICAgIC8qIExpbmVmZWVkIEN0cmwtSiAqLworI2RlZmluZSBWVCAgICAxMSAgICAgICAgLyogVmVydGljYWwgVGFiIEN0cmwtSyAqLworI2RlZmluZSBOTCAgICdcbicgICAgICAgLyogTmV3bGluZSAqLworI2RlZmluZSBGRiAgICAxMiAgICAgICAgLyogRm9ybWZlZWQgQ3RybC1MICovCisjZGVmaW5lIENSICAgIDEzICAgICAgICAvKiBDYXJyaWFnZSBSZXR1cm4gQ3RybC1NICovCisjZGVmaW5lIFNPICAgIDE0ICAgICAgICAvKiBTaGlmdCBPdXQgQ3RybC1OICovCisjZGVmaW5lIFNJICAgIDE1ICAgICAgICAvKiBTaGlmdCBJbiBDdHJsLU8gKi8KKyNkZWZpbmUgRExFICAgMTYgICAgICAgIC8qIERhdGFsaW5rIEVzY2FwZSBDdHJsLVAgKi8KKyNkZWZpbmUgWE9OICAgMTcgICAgICAgIC8qIFhPTiBDdHJsLVEgKi8KKyNkZWZpbmUgREMxICAgMTcKKyNkZWZpbmUgREMyICAgMTggICAgICAgIC8qIEN0cmwtUiAqLworI2RlZmluZSBYT0ZGICAxOSAgICAgICAgLyogWE9GRiBDdHJsLVMgKi8KKyNkZWZpbmUgREMzICAgMTkKKyNkZWZpbmUgREM0ICAgMjAgICAgICAgIC8qIEN0cmwtVCAqLworI2RlZmluZSBOQUsgICAyMSAgICAgICAgLyogQ3RybC1VICovCisjZGVmaW5lIFNZTiAgIDIyICAgICAgICAvKiBTWU4sIEN0cmwtViAqLworI2RlZmluZSBFVEIgICAyMyAgICAgICAgLyogQ3RybC1XICovCisjZGVmaW5lIENBTiAgIDI0ICAgICAgICAvKiBDQU4sIEN0cmwtWCAqLworI2RlZmluZSBFTSAgICAyNSAgICAgICAgLyogQ3RybC1ZICovCisjZGVmaW5lIFNVQiAgIDI2ICAgICAgICAvKiBTVUIgQ3RybC1aICovCisjZGVmaW5lIEVTQyAgIDI3ICAgICAgICAvKiBFc2NhcGUgQ3RybC1bICovCisjZGVmaW5lIFhGUyAgIDI4ICAgICAgICAvKiBGaWVsZCBTZXBhcmF0b3IsICBDdHJsLUJhY2tzbGFzaCAqLworI2RlZmluZSBYR1MgICAyOSAgICAgICAgLyogR3JvdXAgU2VwYXJhdG9yLCAgQ3RybC1SaWdodGJyYWNrZXQgKi8KKyNkZWZpbmUgWFJTICAgMzAgICAgICAgIC8qIFJlY29yZCBTZXBhcmF0b3IsIEN0cmwtQ2lyY3VtZmxleCAqLworI2RlZmluZSBVUyAgICAzMSAgICAgICAgLyogVW5pdCBTZXBhcmF0b3IsICAgQ3RybC1VbmRlcnNjb3JlICovCisjZGVmaW5lIFNQICAgIDMyICAgICAgICAvKiBTcGFjZSAqLworI2RlZmluZSBERUwgIDEyNyAgICAgICAgLyogRGVsZXRlIChSdWJvdXQpICovCisjZGVmaW5lIFJVQiAgMTI3ICAgICAgICAvKiBEZWxldGUgKFJ1Ym91dCkgKi8KKworI2lmZGVmIE9TMgorLyoKKyAgVGhlc2UgYXJlIG5lZWRlZCBpbiBPUy8yLCBzbyBsZXQncyBub3QgY2F1c2UgYW55IHVubmVjZXNzYXJ5IGNvbmZsaWN0cy4KKyovCisjZGVmaW5lIF9DU0kgIDAyMzMgICAgICAvKiA4LWJpdCBDb250cm9sIFNlcXVlbmNlIEludHJvZHVjZXIgKi8KKyNkZWZpbmUgX1NTMiAgMDIxNiAgICAgIC8qIDgtYml0IFNpbmdsZSBTaGlmdCAyICovCisjZGVmaW5lIF9TUzMgIDAyMTcgICAgICAvKiA4LWJpdCBTaW5nbGUgU2hpZnQgMyAqLworI2RlZmluZSBfRENTICAwMjIwICAgICAgLyogOC1iaXQgRGV2aWNlIENvbnRyb2wgU3RyaW5nIEludHJvZHVjZXIgKi8KKyNkZWZpbmUgX1NUOCAgMDIzNCAgICAgIC8qIDgtYml0IFN0cmluZyBUZXJtaW5hdG9yICovCisjZGVmaW5lIF9PU0MgIDAyMzUgICAgICAvKiA4LWJpdCBPcGVyYXRpbmcgU3lzdGVtIENvbW1hbmQgKi8KKyNkZWZpbmUgX1BNOCAgMDIzNiAgICAgIC8qIDgtYml0IFByaXZhY3kgTWVzc2FnZSAqLworI2RlZmluZSBfQVBDICAwMjM3ICAgICAgLyogOC1iaXQgQXBwbGljYXRpb24gUHJvZ3JhbSBDb21tYW5kICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogQ0tDQVNDX0ggKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja2Nid3IudHh0IGIvY2tlcm1pdC04LjAuMjExL2NrY2J3ci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3MGU2NQotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja2Nid3IudHh0CkBAIC0wLDAgKzEsMTQ2NyBAQAorCisgICAgICAgICAgICAgICAgICAgICAgQy1LZXJtaXQgOC4wIEdlbmVyYWwgSGludHMgYW5kIFRpcHMKKworICAgICBGcmFuayBkYSBDcnV6CisgICAgIFsxXVRoZSBLZXJtaXQgUHJvamVjdCwgWzJdQ29sdW1iaWEgVW5pdmVyc2l0eQorCisgICBBcyBvZjogQy1LZXJtaXQgOC4wLjIxMSwgMTcgTWFyY2ggMjAwMworICAgVGhpcyBwYWdlIGxhc3QgdXBkYXRlZDogU2F0IEFwciAxMCAxNjozNzozNyAyMDA0IChOZXcgWW9yayBVU0EgVGltZSkKKworICAgICBJRiBZT1UgQVJFIFJFQURJTkcgQSBQTEFJTi1URVhUIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCwgaXQgaXMgYQorICAgICBwbGFpbi10ZXh0IGR1bXAgb2YgYSBXZWIgcGFnZS4gWW91IGNhbiB2aXNpdCB0aGUgb3JpZ2luYWwgKGFuZAorICAgICBwb3NzaWJseSBtb3JlIHVwLXRvLWRhdGUpIFdlYiBwYWdlIGhlcmU6CisKKyAgWzNdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sCisKKyAgIFRoaXMgZG9jdW1lbnQgY29udGFpbnMgcGxhdGZvcm0taW5kZXBlbmRlbnQgQy1LZXJtaXQgaGludHMgYW5kIHRpcHMuCisgICBBbHNvIHNlZSB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgQy1LZXJtaXQgaGludHMgYW5kIHRpcHMgZG9jdW1lbnQgZm9yCisgICB5b3VyIHBsYXRmb3JtLCBmb3IgZXhhbXBsZToKKworICBbNF1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwKKworICAgZm9yIFVuaXguIFRoaXMgZG9jdW1lbnQgYWxzbyBhcHBsaWVzIHRvIFs1XUtlcm1pdCA5NSBmb3IgV2luZG93cywKKyAgIHdoaWNoIGlzIGJhc2VkIG9uIEMtS2VybWl0LgorCisgICBbIFs2XUMtS2VybWl0IF0gWyBbN11UVVRPUklBTCBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgQ09OVEVOVFMKKworICAgMC4gWzhdUEFUQ0hFUworICAgMS4gWzldSU5DT01QQVRJQkxFIENIQU5HRVMKKyAgIDIuIFsxMF1USEUgQy1LRVJNSVQgQ09NTUFORCBQQVJTRVIKKyAgIDMuIFsxMV1NVUxUSVBMRSBTRVNTSU9OUworICAgNC4gWzEyXU5FVFdPUksgQ09OTkVDVElPTlMKKyAgIDUuIFsxM11NT0RFTVMgQU5EIERJQUxJTkcKKyAgIDYuIFsxNF1ESUFMSU5HIEhJTlRTIEFORCBUSVBTCisgICA3LiBbMTVdVEVSTUlOQUwgU0VSVkVSUworICAgOC4gWzE2XVRFUk1JTkFMIEVNVUxBVElPTgorICAgOS4gWzE3XUtFWSBNQVBQSU5HCisgIDEwLiBbMThdRklMRSBUUkFOU0ZFUgorICAxMS4gWzE5XVNDUklQVCBQUk9HUkFNTUlORworICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDAuIFBBVENIRVMKKworICAgWyBbMjBdVG9wIF0gWyBbMjFdQ29udGVudHMgXSBbIFsyMl1OZXh0IF0KKworICAgU291cmNlLWxldmVsIHBhdGNoZXMgZm9yIEMtS2VybWl0IDguMC4yMTE6CisKKyAgICAgKE5vbmUpCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMS4gSU5DT01QQVRJQkxFIENIQU5HRVMKKworICAgWyBbMjNdVG9wIF0gWyBbMjRdQ29udGVudHMgXSBbIFsyNV1OZXh0IF0KKworICAgVGhlc2UgYXJlIG5vdCBuZWNlc3NhcmlseSBleGhhdXN0aXZlIGxpc3RzLgorCisgIDEuMS4gQy1LZXJtaXQgNi4wCisKKyAgIEMtS2VybWl0IDYuMCB3YXMgcmVsZWFzZWQgNiBTZXB0ZW1iZXIgMTk5NiBhbmQgaXMgY29tcGxldGVseQorICAgZG9jdW1lbnRlZCBpbiBbMjZdVXNpbmcgQy1LZXJtaXQsIDJuZCBFZGl0aW9uLiBUaGUgZm9sbG93aW5nCisgICBpbmNvbXBhdGlibGUgY2hhbmdlcyB3ZXJlIG1hZGUgaW4gQy1LZXJtaXQgNi4wOgorCisgICAgICogVW5sZXNzIHlvdSB0ZWxsIEMtS2VybWl0IG90aGVyd2lzZSwgaWYgYSBzZXJpYWwgb3IgbmV0d29yaworICAgICAgIGNvbm5lY3Rpb24gc2VlbXMgdG8gYmUgb3BlbiwgYW5kIHlvdSBhdHRlbXB0IHRvIEVYSVQgb3IgdG8gb3BlbiBhCisgICAgICAgbmV3IGNvbm5lY3Rpb24sIEMtS2VybWl0IHdhcm5zIHlvdSB0aGF0IGFuIGFjdGl2ZSBjb25uZWN0aW9uCisgICAgICAgYXBwZWFycyB0byBiZSBvcGVuIGFuZCBhc2tzIHlvdSBpZiB5b3UgcmVhbGx5IHdhbnQgdG8gY2xvc2UgaXQuIElmCisgICAgICAgeW91IGRvIG5vdCB3YW50IHRoZXNlIHdhcm5pbmdzLCBhZGQgU0VUIEVYSVQgV0FSTklORyBPRkYgdG8geW91cgorICAgICAgIGN1c3RvbWl6YXRpb24gZmlsZSBvciBzY3JpcHQsIG9yIGdpdmUgdGhpcyBjb21tYW5kIGF0IHRoZSBwcm9tcHQuCisgICAgICogVGhlIGRlZmF1bHQgZm9yIFNFVCB7IFNFTkQsIFJFQ0VJVkUgfSBQQVRITkFNRVMgd2FzIGNoYW5nZWQgZnJvbQorICAgICAgIE9OIHRvIE9GRiwgdG8gcHJldmVudCB1bmV4cGVjdGVkIGNyZWF0aW9uIG9mIGRpcmVjdG9yaWVzIGFuZAorICAgICAgIGRlcG9zaXRpbmcgb2YgaW5jb21pbmcgZmlsZXMgaW4gcGxhY2VzIHlvdSBtaWdodCBub3Qga25vdyB0byBsb29rLgorICAgICAqIFRoZSBkZWZhdWx0IGZvciBTRVQgRklMRSBJTkNPTVBMRVRFIHdhcyBjaGFuZ2VkIGZyb20gRElTQ0FSRCB0bworICAgICAgIEtFRVAgdG8gYWxsb3cgZm9yIGZpbGUgdHJhbnNmZXIgcmVjb3ZlcnkuCisgICAgICogVGhlIGRlZmF1bHQgZmlsZS10cmFuc2ZlciBibG9jay1jaGVjayBpcyBub3cgMywgcmF0aGVyIHRoYW4gMS4gSWYKKyAgICAgICB0aGUgb3RoZXIgS2VybWl0IGRvZXMgbm90IHN1cHBvcnQgdGhpcywgdGhlIHR3byB3aWxsIGRyb3AgYmFjayB0bworICAgICAgIHR5cGUgMSBhdXRvbWF0aWNhbGx5IHVubGVzcyB0aGUgb3RoZXIgS2VybWl0IGZhaWxzIHRvIGZvbGxvdyB0aGUKKyAgICAgICBwcm90b2NvbCBzcGVjaWZpY2F0aW9uLgorICAgICAqIFRoZSBkZWZhdWx0IGZsb3ctY29udHJvbCBpcyBub3cgImF1dG8iICgiZG8gdGhlIHJpZ2h0IHRoaW5nIGZvcgorICAgICAgIGVhY2ggdHlwZSBvZiBjb25uZWN0aW9uIiksIG5vdCBYb24vWG9mZi4KKyAgICAgKiBCYWNrc2xhc2ggKFwpIGlzIG5vIGxvbmdlciBhIGNvbW1hbmQgY29udGludWF0aW9uIGNoYXJhY3Rlci4gT25seQorICAgICAgIC0gKGh5cGhlbiwgZGFzaCkgbWF5IGJlIHVzZWQgZm9yIHRoaXMgaW4gQy1LZXJtaXQgNi4wIGFuZCBsYXRlci4KKyAgICAgKiBOZWdhdGl2ZSBJTlBVVCB0aW1lb3V0IG5vdyByZXN1bHRzIGluIGluZmluaXRlIHdhaXQsIHJhdGhlciB0aGFuIDEKKyAgICAgICBzZWNvbmQuCisKKyAgMS4yLiBDLUtlcm1pdCA3LjAKKworICAgQy1LZXJtaXQgNy4wIHdhcyByZWxlYXNlZCAxIEphbnVhcnkgMjAwMC4gSXRzIG5ldyBmZWF0dXJlcyBhcmUKKyAgIGRvY3VtZW50ZWQgaW4gdGhlIEMtS2VybWl0IDcuMCBTdXBwbGVtZW50LAorICAgWzI3XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Mi5odG1sLiBUaGUgZm9sbG93aW5nCisgICBpbmNvbXBhdGlibGUgY2hhbmdlcyB3ZXJlIG1hZGUgaW4gQy1LZXJtaXQgNy4wOgorICAgICAqIFRoZSAibXVsdGlsaW5lIEdFVCIgY29tbWFuZCBpcyBnb25lLiBOb3cgdXNlIGVpdGhlciBvZiB0aGUKKyAgICAgICBmb2xsb3dpbmcgZm9ybXMgaW5zdGVhZDoKKyAgZ2V0IHJlbW90ZS1uYW1lIGxvY2FsLW5hbWUKKyAgZ2V0IC9hcy1uYW1lOmxvY2FsLW5hbWUgcmVtb3RlLW5hbWUKKyAgICAgICBJZiBlaXRoZXIgbmFtZSBjb250YWlucyBzcGFjZXMsIGVuY2xvc2UgaXQgaW4gYnJhY2VzIChvciwgaW4KKyAgICAgICBDLUtlcm1pdCA4LjAsIGRvdWJsZXF1b3RlcykuCisgICAgICogVG8gaW5jbHVkZSBtdWx0aXBsZSBmaWxlIHNwZWNpZmljYXRpb25zIGluIGEgR0VUIGNvbW1hbmQsIHlvdSBtdXN0CisgICAgICAgbm93IHVzZSBNR0VUIHJhdGhlciB0aGFuIEdFVDoKKyAgbWdldCBmaWxlMSBmaWxlMiBmaWxlMyAuLi4KKyAgICAgKiBDLUtlcm1pdCA3LjAgYW5kIGxhdGVyIHVzZSBGQVNUIEtlcm1pdCBwcm90b2NvbCBzZXR0aW5ncyBieQorICAgICAgIGRlZmF1bHQuIFRoaXMgaW5jbHVkZXMgInVucHJlZml4aW5nIiBvZiBjZXJ0YWluIGNvbnRyb2wKKyAgICAgICBjaGFyYWN0ZXJzLiBCZWNhdXNlIG9mIHRoaXMsIGZpbGUgdHJhbnNmZXJzIHRoYXQgd29ya2VkIHdpdGgKKyAgICAgICBwcmV2aW91cyByZWxlYXNlcyBtaWdodCBub3Qgd29yayBpbiB0aGUgbmV3IHJlbGVhc2UgZXNwZWNpYWxseQorICAgICAgIGFnYWluc3QgYSBub24tS2VybWl0LVByb2plY3QgS2VybWl0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIChidXQKKyAgICAgICBpdCBpcyBtb3JlIGxpa2VseSB0aGF0IHRoZXkgd2lsbCB3b3JrLCBhbmQgbXVjaCBmYXN0ZXIpLiBJZiBhCisgICAgICAgdHJhbnNmZXIgZmFpbHMsIHlvdSdsbCBnZXQgYSBjb250ZXh0LXNlbnNpdGl2ZSBoaW50IHN1Z2dlc3RpbmcKKyAgICAgICBwb3NzaWJsZSBjYXVzZXMgYW5kIGN1cmVzLiBVc3VhbGx5IFNFVCBQUkVGSVhJTkcgQUxMIGRvZXMgdGhlCisgICAgICAgdHJpY2suCisgICAgICogQnkgZGVmYXVsdCBDLUtlcm1pdCA3LjAgYW5kIGxhdGVyIHNlbmQgZmlsZXMgaW4gdGV4dCBvciBiaW5hcnkKKyAgICAgICBtb2RlIGJ5IGxvb2tpbmcgYXQgZWFjaCBmaWxlIHRvIHNlZSB3aGljaCBpcyB0aGUgYXBwcm9wcmlhdGUgbW9kZS4KKyAgICAgICBUbyByZXN0b3JlIHRoZSBwcmV2aW91cyBiZWhhdmlvciwgcHV0IFNFVCBUUkFOU0ZFUiBNT0RFIE1BTlVBTCBhbmQKKyAgICAgICB0aGUgZGVzaXJlZCBTRVQgRklMRSBUWVBFIChURVhUIG9yIEJJTkFSWSkgaW4geW91ciBDLUtlcm1pdAorICAgICAgIGluaXRpYWxpemF0aW9uIGZpbGUuCisgICAgICogVGhlIFJFU0VORCBhbmQgUkVHRVQgY29tbWFuZHMgYXV0b21hdGljYWxseSBzd2l0Y2ggdG8gYmluYXJ5IG1vZGU7CisgICAgICAgcHJldmlvdXNseSBpZiBSRVNFTkQgb3IgUkVHRVQgd2VyZSBhdHRlbXB0ZWQgd2hlbiBGSUxFIFRZUEUgd2FzCisgICAgICAgVEVYVCwgdGhlc2UgY29tbWFuZHMgd291bGQgZmFpbCBpbW1lZGlhdGVseSwgd2l0aCBhIG1lc3NhZ2UKKyAgICAgICB0ZWxsaW5nIHlvdSB0aGV5IHdvcmsgb25seSB3aGVuIHRoZSBGSUxFIFRZUEUgaXMgQklOQVJZLiBOb3cgdGhleQorICAgICAgIHNpbXBseSBkbyB0aGlzIGZvciB5b3UuCisgICAgICogU0VUIFBSRUZJWElORyBDQVVUSU9VUyBhbmQgTUlOSU1BTCBub3cgYm90aCBwcmVmaXggbGluZWZlZWQgKDEwCisgICAgICAgYW5kIDEzOCkgaW4gY2FzZSBybG9naW4sIHNzaCwgb3IgY3UgYXJlICJpbiB0aGUgbWlkZGxlIiwgc2luY2UKKyAgICAgICBvdGhlcndpc2UgPExGPn4gbWlnaHQgYXBwZWFyIGluIEtlcm1pdCBwYWNrZXRzLCBhbmQgdGhpcyB3b3VsZAorICAgICAgIGNhdXNlIHJsb2dpbiwgc3NoLCBvciBjdSB0byBkaXNjb25uZWN0LCBzdXNwZW5kLGVzY2FwZSBiYWNrLCBvcgorICAgICAgIG90aGVyd2lzZSB3cmVjayB0aGUgZmlsZSB0cmFuc2Zlci4gWG9uIGFuZCBYb2ZmIGFyZSBub3cgYWx3YXlzCisgICAgICAgcHJlZml4ZWQgdG9vLCBldmVuIHdoZW4gWG9uL1hvZmYgZmxvdyBjb250cm9sIGlzIG5vdCBpbiBlZmZlY3QsCisgICAgICAgc2luY2UgdW5wcmVmaXhpbmcgdGhlbSBoYXMgcHJvdmVuIGRhbmdlcm91cyBvbiBUQ1AvSVAgY29ubmVjdGlvbnMuCisgICAgICogSW4gVU5JWCwgVk1TLCBXaW5kb3dzLCBhbmQgT1MvMiwgdGhlIERJUkVDVE9SWSBjb21tYW5kIGlzIGJ1aWx0CisgICAgICAgaW50byBDLUtlcm1pdCBpdHNlbGYgcmF0aGVyIHRoYW4gaW1wbGVtZW50ZWQgYnkgcnVubmluZyBhbgorICAgICAgIGV4dGVybmFsIGNvbW1hbmQgb3IgcHJvZ3JhbS4gVGhlIGJ1aWx0LWluIGNvbW1hbmQgbWlnaHQgbm90IGJlaGF2ZQorICAgICAgIHRoZSB3YXkgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGV4dGVybmFsIG9uZSBkaWQsIGJ1dCBtYW55IG9wdGlvbnMKKyAgICAgICBhcmUgYXZhaWxhYmxlIGZvciBjdXN0b21pemF0aW9uLiBPZiBjb3Vyc2UgdGhlIHVuZGVybHlpbmcKKyAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIGNhbiBzdGlsbCBiZSBhY2Nlc3NlZCB3aXRoICIhIiwgIkAiLCBvcgorICAgICAgICJSVU4iIHdoZXJldmVyIHRoZSBpbnN0YWxsYXRpb24gZG9lcyBub3QgZm9yYmlkLiBJbiBVTklYLCB0aGUgImxzIgorICAgICAgIGNvbW1hbmQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGFzICJscyIgaW4gQy1LZXJtaXQuCisgICAgICogU0VORCA/IHByaW50cyBhIGxpc3Qgb2Ygc3dpdGNoZXMgcmF0aGVyIHRoYW4gYSBsaXN0IG9mIGZpbGVuYW1lcy4KKyAgICAgICBJZiB5b3Ugd2FudCB0byBzZWUgYSBsaXN0IG9mIGZpbGVuYW1lcywgdXNlIGEgKHN5c3RlbS1kZXBlbmRlbnQpCisgICAgICAgY29uc3RydWN0aW9uIHN1Y2ggYXMgU0VORCAuLz8gKGZvciBVTklYLCBXaW5kb3dzLCBvciBPUy8yKSwgU0VORAorICAgICAgIFtdPyAoVk1TKSwgZXRjLgorICAgICAqIEluIFVOSVgsIE9TLTksIGFuZCBLZXJtaXQgOTUsIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXJzIGluIHByZXZpb3VzCisgICAgICAgdmVyc2lvbnMgd2VyZSAqIGFuZCA/LiBJbiBDLUtlcm1pdCA3LjAgdGhleSBhcmUgKiwgPywgWywgXSwgeywgYW5kCisgICAgICAgfSwgd2l0aCBkYXNoIHVzZWQgaW5zaWRlIFtdJ3MgdG8gZGVub3RlIHJhbmdlcyBhbmQgY29tbWEgdXNlZAorICAgICAgIGluc2lkZSB7fSB0byBzZXBhcmF0ZSBsaXN0IGVsZW1lbnRzLiBJZiB5b3UgbmVlZCB0byBpbmNsdWRlIGFueSBvZgorICAgICAgIHRoZXNlIGNoYXJhY3RlcnMgbGl0ZXJhbGx5IGluIGEgZmlsZW5hbWUsIHByZWNlZGUgZWFjaCBvbmUgd2l0aAorICAgICAgIGJhY2tzbGFzaCAoXCkuCisgICAgICogU0VUIFFVSUVUIHsgT04sIE9GRiB9IGlzIG5vdyBvbiB0aGUgY29tbWFuZCBzdGFjaywganVzdCBsaWtlIFNFVAorICAgICAgIElOUFVUIENBU0UsIFNFVCBDT1VOVCwgU0VUIE1BQ1JPIEVSUk9SLCBldGMsIGFzIGRlc2NyaWJlZCBvbiBwLjQ1OAorICAgICAgIG9mIFsyOF1Vc2luZyBDLUtlcm1pdCwgMm5kIEVkaXRpb24uIFRoaXMgYWxsb3dzIGFueSBtYWNybyBvcgorICAgICAgIGNvbW1hbmQgZmlsZSB0byBTRVQgUVVJRVQgT04gb3IgT0ZGIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgc2F2aW5nCisgICAgICAgYW5kIHJlc3RvcmluZyB0aGUgZ2xvYmFsIFFVSUVUIHZhbHVlLiBGb3IgZXhhbXBsZSwgdGhpcyBsZXRzIHlvdQorICAgICAgIHdyaXRlIGEgc2NyaXB0IHRoYXQgdHJpZXMgU0VUIExJTkUgb24gbG90cyBvZiBkZXZpY2VzIHVudGlsIGl0CisgICAgICAgZmluZHMgb25lIGZyZWUgd2l0aG91dCBzcGV3aW5nIG91dCBsb2FkcyBvZiBlcnJvciBtZXNzYWdlcywgYW5kCisgICAgICAgYWxzbyB3aXRob3V0IGRpc3R1cmJpbmcgdGhlIGdsb2JhbCBRVUlFVCBzZXR0aW5nLCB3aGF0ZXZlciBpdCB3YXMuCisgICAgICogQmVjYXVzZSBvZiB0aGUgbmV3ICIuIiBvcGVyYXRvciAod2hpY2ggaW50cm9kdWNlcyBhc3NpZ25tZW50cyksCisgICAgICAgbWFjcm9zIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggIi4iIGNhbiBub3QgYmUgaW52b2tlZCAiYnkgbmFtZSIuCisgICAgICAgSG93ZXZlciwgdGhleSBzdGlsbCBjYW4gYmUgaW52b2tlZCB3aXRoIERPIG9yIFxmZXhlY3V0ZSgpLgorICAgICAqIFRoZSBzeW50YXggb2YgdGhlIEVWQUxVQVRFIGNvbW1hbmQgaGFzIGNoYW5nZWQuIFRvIHJlc3RvcmUgdGhlCisgICAgICAgcHJldmlvdXMgc3ludGF4LCB1c2UgU0VUIEVWQUxVQVRFIE9MRC4KKyAgICAgKiBUaGUgXHYoZGlyZWN0b3J5KSB2YXJpYWJsZSBub3cgaW5jbHVkZXMgdGhlIHRyYWlsaW5nIGRpcmVjdG9yeQorICAgICAgIHNlcGFyYXRvcjsgaW4gcHJldmlvdXMgcmVsZWFzZXMgaXQgZGlkIG5vdC4gVGhpcyBpcyB0byBhbGxvdworICAgICAgIGNvbnN0cnVjdGlvbnMgc3VjaCBhczoKKyAgY2QgXHYoZGlyKWRhdGEudG1wCisgICAgICAgdG8gd29yayBhY3Jvc3MgcGxhdGZvcm1zIHRoYXQgbWlnaHQgaGF2ZSBkaWZmZXJlbnQgZGlyZWN0b3J5CisgICAgICAgbm90YXRpb24sIHN1Y2ggYXMgVU5JWCwgV2luZG93cywgYW5kIFZNUy4KKyAgICAgKiBQcmlvciB0byBDLUtlcm1pdCA3LjAsIHRoZSBGTE9XLUNPTlRST0wgc2V0dGluZyB3YXMgZ2xvYmFsIGFuZAorICAgICAgIHN0aWNreS4gSW4gQy1LZXJtaXQgNy4wLCB0aGVyZSBpcyBhbiBhcnJheSBvZiBkZWZhdWx0IGZsb3ctY29udHJvbAorICAgICAgIHZhbHVlcyBmb3IgZWFjaCBraW5kIG9mIGNvbm5lY3Rpb24sIHRoYXQgYXJlIGFwcGxpZWQgYXV0b21hdGljYWxseQorICAgICAgIGF0IFNFVCBMSU5FL1BPUlQvSE9TVCB0aW1lLiBUaHVzIGEgU0VUIEZMT1cgY29tbWFuZCBnaXZlbiBiZWZvcmUKKyAgICAgICBTRVQgTElORS9QT1JUL0hPU1QgaXMgbGlrZWx5IHRvIGJlIHVuZG9uZS4gVGhlcmVmb3JlIFNFVCBGTE9XIGNhbgorICAgICAgIGJlIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3Qgb25seSBpZiBnaXZlbiBhZnRlciB0aGUKKyAgICAgICBTRVQgTElORS9QT1JUL0hPU1QgY29tbWFuZC4KKyAgICAgKiBDaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIHdvcmtzIGRpZmZlcmVudGx5IGluIHRoZSBUUkFOU01JVAorICAgICAgIGNvbW1hbmQgd2hlbiAoYSkgdGhlIGZpbGUgY2hhcmFjdGVyLXNldCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlCisgICAgICAgbG9jYWwgZW5kIG9mIHRoZSB0ZXJtaW5hbCBjaGFyYWN0ZXItc2V0LCBvciAoYikgd2hlbiB0aGUgdGVybWluYWwKKyAgICAgICBjaGFyYWN0ZXItc2V0IGlzIFRSQU5TUEFSRU5ULgorCisgIDEuMy4gQy1LZXJtaXQgOC4wCisKKyAgIFRoZSBmb2xsb3dpbmcgaW5jb21wYXRpYmxlIGNoYW5nZXMgd2VyZSBtYWRlIGluIEMtS2VybWl0IDguMDoKKyAgICAgKiBDLUtlcm1pdCBub3cgYWNjZXB0cyBkb3VibGVxdW90ZXMgaW4gbW9zdCBjb250ZXh0cyB3aGVyZSB5b3UKKyAgICAgICBwcmV2aW91c2x5IGhhZCB0byB1c2UgYnJhY2VzIHRvIGdyb3VwIG11bHRpcGxlIHdvcmRzIGludG8gYSBzaW5nbGUKKyAgICAgICBmaWVsZCwgb3IgdG8gZm9yY2UgaW5jbHVzaW9uIG9mIGxlYWRpbmcgb3IgdHJhaWxpbmcgYmxhbmtzLiBUaGlzCisgICAgICAgbWlnaHQgY2F1c2UgcHJvYmxlbXMgaW4gY29udGV4dHMgd2hlcmUgeW91IHdhbnRlZCB0aGUgZG91YmxlcXVvdGUKKyAgICAgICBjaGFyYWN0ZXJzIHRvIGJlIHRha2VuIGxpdGVyYWxseS4gQ29uc3VsdCBbMjldU2VjdGlvbiA1IG9mIHRoZQorICAgICAgIFszMF1DLUtlcm1pdCA4LjAgVXBkYXRlIE5vdGVzIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorICAgICAqIFVzaW5nIHRoZSBTRVQgSE9TVCBjb21tYW5kIHRvIG1ha2UgSFRUUCBjb25uZWN0aW9ucyBpcyBubyBsb25nZXIKKyAgICAgICBzdXBwb3J0ZWQuIEluc3RlYWQsIHVzZSB0aGUgbmV3IFszMV1IVFRQIE9QRU4gY29tbWFuZC4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAyLiBUSEUgQy1LRVJNSVQgQ09NTUFORCBQQVJTRVIKKworICAgWyBbMzJdVG9wIF0gWyBbMzNdQ29udGVudHMgXSBbIFszNF1OZXh0IF0gWyBbMzVdUHJldmlvdXMgXQorCisgICBWYXJpb3VzIGNvbW1hbmQtcmVsYXRlZCBsaW1pdHMgYXJlIHNob3duIGluIHRoZSBmb2xsb3dpbmcgdGFibGUsIGluCisgICB3aGljaCB0aGUgc2FtcGxlIHZhbHVlcyBhcmUgZm9yIGEgImxhcmdlIG1lbW9yeSBtb2RlbCIgYnVpbGQgb2YKKyAgIEMtS2VybWl0LCB0eXBpY2FsIGZvciBtb2Rlcm4gcGxhdGZvcm1zIChMaW51eCwgU29sYXJpcywgQUlYLCBWTVMsCisgICBldGMpLiBZb3UgY2FuIHNlZSB0aGUgdmFsdWVzIGZvciB5b3VyIHZlcnNpb24gb2YgS2VybWl0IGJ5IGdpdmluZyB0aGUKKyAgIFNIT1cgRkVBVFVSRVMgY29tbWFuZC4gVGhlIG1heGltdW0gbGVuZ3RoIGZvciBhIEtlcm1pdCBjb21tYW5kIChDTURCTCkKKyAgIGFsc28gZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBsZW5ndGggZm9yIGEgbWFjcm8gZGVmaW5pdGlvbiwgc2luY2UKKyAgIERFRklORSBpcyBpdHNlbGYgYSBjb21tYW5kLiBUaGUgbWF4aW11bSBsZW5ndGggZm9yIGEgdmFyaWFibGUgbmFtZSBpcworICAgYmV0d2VlbiAyNTYgYW5kIDQwOTYgY2hhcmFjdGVycywgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybTsgZm9yIGFycmF5CisgICBkZWNsYXJhdGlvbnMgYW5kIHJlZmVyZW5jZXMsIHRoYXQgaW5jbHVkZXMgdGhlIHN1YnNjcmlwdC4KKyAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICBJdGVtIFN5bWJvbCBTYW1wbGUKKyAgIFZhbHVlIERlZmluaXRpb24KKyAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgY29tbWFuZCBDTURCTCAzMjc2MyBja3VjbWQuaAorICAgTnVtYmVyIG9mIGNoYXJzIGluIGEgZmllbGQgb2YgYSBjb21tYW5kICAgIEFUTUJMIDEwMjM4IGNrdWNtZC5oCisgICBOZXN0aW5nIGxldmVsIGZvciBjb21tYW5kIGZpbGVzIE1BWFRBS0UgNTQgICBja3V1c3IuaAorICAgTmVzdGluZyBsZXZlbCBmb3IgbWFjcm9zIE1BQ0xFVkVMIDEyOCBja3V1c3IuaAorICAgTmVzdGluZyBsZXZlbCBmb3IgRk9SIC8gV0hJTEUgbG9vcHMgRk9SREVQVEggMzIgY2t1dXNyLmgKKyAgIE51bWJlciBvZiBtYWNyb3MgTUFDX01BWCAxNjM4NCBja3V1c3IuaAorICAgU2l6ZSBvZiBJTlBVVCBidWZmZXIgSU5QQlVGU0laIDQwOTYgY2t1dXNyLmgKKyAgIE1heGltdW0gZmlsZXMgdG8gbWF0Y2ggYSB3aWxkY2FyZCBNQVhXTEQgICAgMTAyNDAwIGNrY2RlYi5oCisgICBGaWxlc3BlY3MgaW4gTVNFTkQgY29tbWFuZCBNU0VORE1BWCAxMDI0IGNrdXVzci5oCisgICBMZW5ndGggZm9yIEdPVE8gdGFyZ2V0IGxhYmVsIExCTFNJWiA1MCBja3V1c3IuaAorICAgXGZleGVjdXRlKCkgcmVjdXJzaW9uIGRlcHRoIGxpbWl0IENNRERFUCA2NCBja3VjbWQuaAorICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgIElmIHlvdSBuZWVkIHRvIGRlZmluZSBhIG1hY3JvIHRoYXQgaXMgbG9uZ2VyIHRoYW4gQ01EQkwsIHlvdSBjYW4gYnJlYWsKKyAgIHRoZSBtYWNybyB1cCBpbnRvIHN1Yi1tYWNyb3Mgb3IgcmV3cml0ZSB0aGUgbWFjcm8gYXMgYSBjb21tYW5kIGZpbGUuCisgICBJbiBhIHBpbmNoIHlvdSBjYW4gYWxzbyByZWRlZmluZSBDTURCTCBhbmQgcmVjb21waWxlIEMtS2VybWl0LiBBbGwgb2YKKyAgIHRoZXNlIG51bWJlcnMgcmVwcmVzZW50IHRyYWRlb2ZmczogdGhlIGJpZ2dlciB0aGUgbnVtYmVyLCB0aGUgbW9yZQorICAgInBvd2VyZnVsIiBLZXJtaXQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgYXJlYSwgYnV0IGFsc28gdGhlIGJpZ2dlciB0aGUKKyAgIHByb2dyYW0gaW1hZ2UgYW5kIHBvc3NpYmx5IGRpc2sgZm9vdHByaW50LCBhbmQgdGhlIGxvbmdlciBpdCB0YWtlcyB0bworICAgbG9hZCBhbmQgaW5pdGlhbGl6ZS4KKworICAgSW4gdGhlIGludGVyYWN0aXZlIGNvbW1hbmQgcGFyc2VyOgorCisgICAgICogRU1BQ1MtIG9yIFZJLXN0eWxlIGNvbW1hbmQgbGluZSBlZGl0aW5nIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogRWRpdGluZyBrZXlzIGFyZSBoYXJkd2lyZWQgKEN0cmwtVSwgQ3RybC1XLCBldGMpLgorCisgICBJZiB5b3UgaW50ZXJydXB0IEMtS2VybWl0IGJlZm9yZSBpdCBoYXMgaXNzdWVkIGl0cyBmaXJzdCBwcm9tcHQsIGl0CisgICB3aWxsIGV4aXQuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2Fubm90IGludGVycnVwdCBleGVjdXRpb24gb2YgdGhlCisgICBpbml0aWFsaXphdGlvbiBmaWxlLCBvciBvZiBhbiAiYXBwbGljYXRpb24gZmlsZSIgKGZpbGUgd2hvc2UgbmFtZSBpcworICAgZ2l2ZW4gYXMgdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudCksIG9yIG9mIGFuIGFsdGVybmF0aXZlCisgICBpbml0aWFsaXphdGlvbiBmaWxlICgiLXkgZmlsZW5hbWUiKSwgYW5kIGdldCB0byB0aGUgcHJvbXB0LiBUaGVyZSBpcywKKyAgIGhvd2V2ZXIsIG9uZSBleGNlcHRpb24gdG8gdGhpcyBydWxlOiB5b3UgKmNhbiogaW50ZXJydXB0IGNvbW1hbmRzIC0tCisgICBpbmNsdWRpbmcgVEFLRSBjb21tYW5kcyAtLSBnaXZlbiBpbiB0aGUgJy1DICJjb21tYW5kIGxpc3QiJworICAgY29tbWFuZC1saW5lIGFyZ3VtZW50IGFuZCAtLSBpZiB0aGVyZSB3ZXJlIG5vIGFjdGlvbiBjb21tYW5kcyBhbW9uZworICAgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgLS0geW91IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIEMtS2VybWl0CisgICBwcm9tcHQuIFNvLCBmb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gc3RhcnQgQy1LZXJtaXQgaW4gc3VjaCBhIHdheQorICAgdGhhdCBpdCBleGVjdXRlcyBhIGNvbW1hbmQgZmlsZSBiZWZvcmUgaXNzdWluZyBpdHMgZmlyc3QgcHJvbXB0LCBhbmQKKyAgIHlvdSBhbHNvIHdhbnQgdG8gYmUgYWJsZSB0byBpbnRlcnJ1cHQgdGhlIGNvbW1hbmQgZmlsZSBhbmQgZ2V0IHRvIHRoZQorICAgcHJvbXB0LCBpbmNsdWRlIGEgVEFLRSBjb21tYW5kIGZvciB0aGUgZGVzaXJlZCBjb21tYW5kIGluIHRoZSAtQworICAgYXJndW1lbnQsIGZvciBleGFtcGxlOgorCisgIGtlcm1pdCAtQyAidGFrZSBkaWFsLnNjciIKKworICAgQXQgdGhlIGNvbW1hbmQgcHJvbXB0LCBpZiB5b3UgdXNlIHRoZSBiYWNrc2xhc2ggKFwpIHByZWZpeCB0byBlbnRlciBhCisgICBjb250cm9sIGNoYXJhY3Rlciwgc3BhY2UsIG9yIHF1ZXN0aW9uIG1hcmsgaW50byBhIGNvbW1hbmQgbGl0ZXJhbGx5LAorICAgdGhlIGJhY2tzbGFzaCBkaXNhcHBlYXJzIGFuZCBpcyByZXBsYWNlZCBieSB0aGUgcXVvdGVkIGNoYXJhY3Rlci4gSWYKKyAgIGl0IHdhcyBhIGNvbnRyb2wgY2hhcmFjdGVyLCBpdCBpcyBzaG93biBhcyBhIGNpcmN1bWZsZXggKF4pLiBUaGlzCisgICBhbGxvd3MgZWRpdGluZyAoYmFja3NwYWNlLCBkZWxldGUsIEN0cmwtVykgdG8gd29yayBjb3JyZWN0bHkgZXZlbiBmb3IKKyAgIGNvbnRyb2wgY2hhcmFjdGVycy4KKworICAgUHJpb3QgdG8gQy1LZXJtaXQgOC4wLCB0aGUgb25seSB3YXkgdG8gaW5jbHVkZSBhIGNvbW1hIGxpdGVyYWxseSBpbiBhCisgICBtYWNybyBkZWZpbml0aW9uIC0tIGFzIG9wcG9zZWQgdG8gaGF2aW5nIGl0IHNlcGFyYXRlIGNvbW1hbmRzIHdpdGhpbgorICAgdGhlIGRlZmluaXRpb24gLS0gaXMgdG8gZW50ZXIgaXRzIEFTQ0lJIHZhbHVlICg0NCkgaW4gYmFja3NsYXNoCisgICBub3RhdGlvbiwgZS5nLjoKKworICBERUZJTkUgUk9XUyBSVU4gTU9ERSBDTzgwXHs0NH1cJTEKKworICAgSW4gQy1LZXJtaXQgOC4wIHlvdSBjYW4gdXNlIGNvbnN0cnVjdGlvbnMgbGlrZSB0aGlzOgorCisgIERFRklORSBST1dTIFJVTiBNT0RFICJDTzgwLFwlMSIKKworICAgSWYgeW91IHF1b3RlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBhIGZpbGVuYW1lIChlLmcuIGluIHRoZSBTRU5ECisgICBjb21tYW5kKSwgZmlsZW5hbWUgY29tcGxldGlvbiBtYXkgc2VlbSB0byB3b3JrIGluY29ycmVjdGx5LiBGb3IKKyAgIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZmlsZSB3aG9zZSBuYW1lIGlzIGEqYiAodGhlIG5hbWUgcmVhbGx5CisgICBjb250YWlucyBhbiBhc3RlcmlzayksIGFuZCB5b3UgdHlwZSAic2VuZCBhXFwqPEVTQz4iLCB0aGUgImIiIGRvZXMgbm90CisgICBhcHBlYXIsIG5vciB3aWxsIEN0cmwtUiByZWRpc3BsYXkgdGhlIGNvbXBsZXRlZCBuYW1lIGNvcnJlY3RseS4gQnV0CisgICBpbnRlcm5hbGx5IHRoZSBmaWxlIG5hbWUgaXMgcmVjb2duaXplZCBhbnl3YXkuCisKKyAgIFF1ZXN0aW9uLW1hcmsgaGVscCBkb2VzIG5vdCB3b3JrIGR1cmluZyBleGVjdXRpb24gb2YgYW4gQVNLUSBjb21tYW5kLgorICAgVGhlIHF1ZXN0aW9uIG1hcmtzIGFyZSBzaW1wbHkgYWNjZXB0ZWQgYXMgdGV4dC4KKworICAgSW4gT1VUUFVUIGNvbW1hbmRzIG9ubHksIFxCIHNlbmRzIGEgQlJFQUsgc2lnbmFsLCBcTCBzZW5kcyBhIExvbmcKKyAgIEJSRUFLIHNpZ25hbCwgYW5kIFxOIHNlbmRzIGEgTlVMIChBU0NJSSAwKS4gQlJFQUsgYW5kIExvbmcgQlJFQUsgYXJlCisgICBzcGVjaWFsIHNpZ25hbHMsIG5vdCBjaGFyYWN0ZXJzLCBhbmQgTlVMIGlzIGEgY2hhcmFjdGVyIHRoYXQgbm9ybWFsbHkKKyAgIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBhIEMgc3RyaW5nLCBzaW5jZSBpdCBpcyB0aGUgQyBzdHJpbmcgdGVybWluYXRvci4KKyAgIElmIHlvdSByZWFsbHkgd2FudCB0byBvdXRwdXQgYSBiYWNrc2xhc2ggZm9sbG93ZWQgYnkgYSBCLCBhbiBMLCBvciBhbgorICAgTiAoYXMgaXMgbmVlZGVkIHRvIGNvbmZpZ3VyZSBjZXJ0YWluIG1vZGVtcywgZXRjKSwgZG91YmxlIHRoZQorICAgYmFja3NsYXNoLCBlLmcuICJvdXRwdXQgXFxCIi4gSW4gQy1LZXJtaXQgNy4wIG9yIGxhdGVyLCB5b3UgY2FuIGRpc2FybQorICAgYW5kIHJlLWFybSB0aGUgc3BlY2lhbCBPVVRQVVQtY29tbWFuZCBlc2NhcGVzIChcQiwgXEwsIGFuZCBcTikgd2l0aAorICAgU0VUIE9VVFBVVCBTUEVDSUFMLUVTQ0FQRVMgeyBPRkYsIE9OIH0uCisKKyAgIFdoZW4gdXNpbmcgdGhlIGNvbW1hbmQtbGluZSBwcm9jZXNzb3IgKCJrZXJtaXQgLWwgL2Rldi90dHkwMCAtYgorICAgMTkyMDAiLCBldGMpLCBub3RlIHRoYXQgaW4gc29tZSBjYXNlcyB0aGUgb3JkZXIgb2YgdGhlIGNvbW1hbmQtbGluZQorICAgb3B0aW9ucyBtYWtlcyBhIGRpZmZlcmVuY2UsIGNvbnRyYXJ5IHRvIHRoZSBleHBlY3RhdGlvbiB0aGF0IG9yZGVyIG9mCisgICBjb21tYW5kLWxpbmUgb3B0aW9ucyBzaG91bGQgbm90IG1hdHRlci4gRm9yIGV4YW1wbGUsIHRoZSAtYiBvcHRpb24KKyAgIG11c3QgYmUgZ2l2ZW4gYWZ0ZXIgdGhlIC1sIG9wdGlvbiBpZiBpdCBpcyB0byBhZmZlY3QgdGhlIGRldmljZQorICAgc3BlY2lmaWVkIGluIHRoZSAtbCBvcHRpb24uCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4gTVVMVElQTEUgU0VTU0lPTlMKKworICAgWyBbMzZdVG9wIF0gWyBbMzddQ29udGVudHMgXSBbIFszOF1OZXh0IF0gWyBbMzldUHJldmlvdXMgXQorCisgICBDLUtlcm1pdCA3LjAgYW5kIGVhcmxpZXIgZG8gbm90IHN1cHBvcnQgbXVsdGlwbGUgc2Vzc2lvbnMuIFdoZW4geW91CisgICBTRVQgTElORSAob3IgU0VUIFBPUlQsIHNhbWUgdGhpbmcpIHRvIGEgbmV3IGRldmljZSwgb3IgU0VUIEhPU1QgdG8gYQorICAgbmV3IGhvc3QsIHRoZSBwcmV2aW91cyBTRVQgTElORSBkZXZpY2Ugb3IgbmV0d29yayBob3N0IGNvbm5lY3Rpb24gaXMKKyAgIGNsb3NlZCwgcmVzdWx0aW5nIGluIGhhbmd1cCBvZiB0aGUgbW9kZW0gb3IgdGVybWluYXRpb24gb2YgdGhlIG5ldHdvcmsKKyAgIGNvbm5lY3Rpb24uIEluIHdpbmRvd2luZyBlbnZpcm9ubWVudHMgbGlrZSBIUC1WVUUsIE5lWFRTVEVQLCBXaW5kb3dzLAorICAgT1MvMiwgZXRjLCB5b3UgY2FuIHJ1biBzZXBhcmF0ZSBjb3BpZXMgb2YgS2VybWl0IGluIGRpZmZlcmVudCB3aW5kb3dzCisgICB0byBhY2hpZXZlIG11bHRpcGxlIHNlc3Npb25zLgorCisgICBUbyBhY2hpZXZlIG11bHRpcGxlIHNlc3Npb25zIHRocm91Z2ggYSBzaW5nbGUgc2VyaWFsIHBvcnQgKGUuZy4gd2hlbgorICAgZGlhbGluZyB1cCksIHlvdSBjYW4gaW5zdGFsbCBTTElQIG9yIFBQUCBvbiB5b3VyIGNvbXB1dGVyIGFuZCB0aGVuIHVzZQorICAgQy1LZXJtaXQncyBUQ1AvSVAgc3VwcG9ydCBvdmVyIHRoZSBTTElQIG9yIFBQUCBjb25uZWN0aW9uLCBhc3N1bWluZworICAgeW91IGFsc28gaGF2ZSBUQ1AvSVAgbmV0d29ya2luZyBpbnN0YWxsZWQgb24geW91ciBjb21wdXRlci4KKworICAgQy1LZXJtaXQgOC4wIGhhcyB0aGUgc2FtZSByZXN0cmljdGlvbiBvbiBTRVQgTElORSBhbmQgU0VUIEhPU1QKKyAgIHNlc3Npb25zOiBvbmx5IG9uZSByZWd1bGFyIHNlc3Npb24gKGRpYWxvdXQsIFRlbG5ldCwgZXRjKSBjYW4gYmUgb3BlbgorICAgYXQgYSB0aW1lLiBIb3dldmVyLCB2ZXJzaW9uIDguMCBhZGRzIHR3byBuZXcga2luZHMgb2Ygc2Vzc2lvbnM6IEZUUAorICAgYW5kIEhUVFA7IG9uZSBvciBib3RoIG9mIHRoZXNlIGNhbiBiZSBvcGVuIGF0IHRoZSBzYW1lIGFzIGEgcmVndWxhcgorICAgc2Vzc2lvbi4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LiBORVRXT1JLIENPTk5FQ1RJT05TCisKKyAgIFsgWzQwXVRvcCBdIFsgWzQxXUNvbnRlbnRzIF0gWyBbNDJdTmV4dCBdIFsgWzQzXVByZXZpb3VzIF0KKworICBGVFAgQ2xpZW50IEJ1Z3MKKworICAgVGhlIFVuaXggQy1LZXJtaXQgOC4wLjIwNiBGVFAgY2xpZW50IGhhZCB0aGUgZm9sbG93aW5nIGJ1Z3MgYXQgdGhlCisgICB0aW1lIG1vc3Qgb2YgdGhlIDguMC4yMDYgYmluYXJpZXMgd2VyZSBidWlsdCBmb3IgdGhlIEMtS2VybWl0IDguMAorICAgQ0RST006CisKKyAgICAxLiBGVFAgTUdFVCBmYWlscyB3aGVuIGRpcmVjdG9yeSBzZWdtZW50cyBjb250YWluIHdpbGRjYXJkcywgYXMgaW4KKyAgICAgICAiZnRwIG1nZXQgKi9kYXRhLyouZGF0Ii4gV29yayBhcm91bmQgYnkgZG9pbmcgYSBzZXBhcmF0ZSBNR0VUIGZvcgorICAgICAgIGVhY2ggc291cmNlIGRpcmVjdG9yeS4KKyAgICAyLiBGVFAgTUdFVCBjYW4gZmFpbCBvciBwcm9kdWNlIHJhbmRvbSBzaWRlIGVmZmVjdHMgaWYgeW91IGhhdmUgYQorICAgICAgIFRNUERJUiBvciBDS19UTVAgZW52aXJvbm1lbnQgdmFyaWFibGUgZGVmaW5pdGlvbiBpbiBlZmZlY3QsIG9yIGEKKyAgICAgICBTRVQgVEVNUC1ESVJFQ1RPUlkgdmFsdWUsIGxvbmdlciB0aGFuIDcgY2hhcmFjdGVycy4gV29yayBhcm91bmQgYnkKKyAgICAgICBnaXZpbmcgYSBTRVQgVEVNUC1ESVJFQ1RPUlkgY29tbWFuZCB3aXRoIGEgc2hvcnQgdmFsdWUsIHN1Y2ggYXMKKyAgICAgICAiL3RtcCIuCisKKyAgIFRoZXNlIHR3byBidWdzIGFyZSBmaXhlZCBpbiB0aGUgc291cmNlIGNvZGUgdGhhdCBpcyBpbmNsdWRlZCBvbiB0aGUKKyAgIENEUk9NLCBhbmQgYWxzbyBpbiBLZXJtaXQgOTUgMi4xLjEuIFlvdSBjYW4gdGVsbCBpZiBhIEMtS2VybWl0IDguMC4yMDYKKyAgIGJpbmFyeSBoYXMgdGhlc2UgZml4ZXMgYnkgdHlwaW5nIFNIT1cgVkVSU0lPTjsgaWYgaXQgc2F5cyAiRlRQIENsaWVudCwKKyAgIDguMC4yMDAsIDI0IE9jdCAyMDAyIiBpdCBoYXMgdGhlIGZpeGVzOyBpZiB0aGUgZWRpdCBudW1iZXIgaXMgbGVzcworICAgdGhhdCAyMDAsIGl0IGRvZXNuJ3QsIGluIHdoaWNoIGNhc2UgY2FuIGJ1aWxkIGEgbmV3IGJpbmFyeSBmcm9tIHRoZQorICAgc291cmNlIGNvZGUgKG9yIGNvbnRhY3QgdXMgYW5kIHdlJ2xsIHRyeSB0byBnZXQgZ2V0IG9uZSBmb3IgeW91KS4KKworICBNYWtpbmcgVENQL0lQIENvbm5lY3Rpb25zIENhbiBUYWtlIGEgTG9uZyBUaW1lCisKKyAgIFRoZSBtb3N0IGZyZXF1ZW50bHkgYXNrZWQgcXVlc3Rpb24gaW4gbWFueSBuZXdzZ3JvdXBzIGlzICJXaHkgZG9lcyBpdAorICAgdGFrZSBzdWNoIGEgbG9uZyB0aW1lIHRvIG1ha2UgYSBUZWxuZXQgY29ubmVjdGlvbiB0byAob3IgZnJvbSkgbXkKKyAgIChlLmcuKSBMaW51eCBQQz8iICh0aGlzIGFwcGxpZXMgdG8gS2VybWl0IGFzIHdlbGwgYXMgdG8gcmVndWxhciBUZWxuZXQKKyAgIGNsaWVudHMpOgorCisgICAgMS4gTW9zdCBUZWxuZXQgc2VydmVycyBwZXJmb3JtIHJldmVyc2UgRE5TIGxvb2t1cHMgb24gdGhlIGNsaWVudCBmb3IKKyAgICAgICBzZWN1cml0eSBhbmQvb3IgbG9nZ2luZyByZWFzb25zLiBJZiB0aGUgVGVsbmV0IGNsaWVudCdzIGhvc3QKKyAgICAgICBjYW5ub3QgYmUgZm91bmQgYnkgdGhlIHNlcnZlcidzIGxvY2FsIEROUyBzZXJ2ZXIsIHRoZSBETlMgcmVxdWVzdAorICAgICAgIGdvZXMgb3V0IHRvIHRoZSBJbnRlcm5ldCBhdCBsYXJnZSwgYW5kIHRoaXMgY2FuIHRha2UgcXVpdGUgc29tZQorICAgICAgIHRpbWUuIFRoZSBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0gaXMgdG8gbWFrZSBzdXJlIHRoYXQgYm90aAorICAgICAgIGNsaWVudCBhbmQgaG9zdCBhcmUgcmVnaXN0ZXJlZCBpbiBETlMuCisgICAgMi4gQy1LZXJtaXQgaXRzZWxmIHBlcmZvcm1zIHJldmVyc2UgRE5TIGxvb2t1cHMgdW5sZXNzIHlvdSB0ZWxsIGl0CisgICAgICAgbm90IHRvLiBUaGlzIGlzIHRvIGFsbG93IEMtS2VybWl0IHRvIGxldCB5b3Uga25vdyB3aGljaCBob3N0IGl0IGlzCisgICAgICAgYWN0dWFsbHkgY29ubmVjdGVkIHRvIGluIGNhc2UgeW91IGhhdmUgbWFkZSBhIGNvbm5lY3Rpb24gdG8gYQorICAgICAgICJob3N0IHBvb2wiIChtdWx0aWhvbWVkIGhvc3QpLiBZb3UgY2FuIGRpc2FibGUgQy1LZXJtaXQncyByZXZlcnNlCisgICAgICAgRE5TIGxvb2t1cCB3aXRoIFNFVCBUQ1AgUkVWRVJTRS1ETlMtTE9PS1VQIE9GRi4KKyAgICAzLiBDLUtlcm1pdCA3LjAgYW5kIGxhdGVyIHN0cmljdGx5IGVuZm9yY2UgVGVsbmV0IHByb3RvY29sIHJ1bGVzLiBPbmUKKyAgICAgICBzdWNoIHJ1bGUgaXMgdGhhdCBjZXJ0YWluIG5lZ290aWF0aW9ucyBtdXN0IGJlIHJlc3BvbmRlZCB0by4gSWYKKyAgICAgICBDLUtlcm1pdCBzZW5kcyBhIHN1Y2ggYSBuZWdvdGlhdGlvbiBhbmQgdGhlIGhvc3QgZG9lcyBub3QgcmVzcG9uZCwKKyAgICAgICBDLUtlcm1pdCB3YWl0cyBhIGxvbmcgdGltZSBmb3IgdGhlIHJlcGx5IChpbiBjYXNlIHRoZSBuZXR3b3JrIGlzCisgICAgICAgY29uZ2VzdGVkIG9yIHRoZSBob3N0IGlzIHNsb3cpLCBidXQgZXZlbnR1YWxseSB3aWxsIHRpbWUgb3V0LiBUbworICAgICAgIGVsaW1pbmF0ZSB0aGUgd2FpdHMgKGFuZCB0aGVyZWZvcmUgcmlzayBwb3NzaWJsZSBwcm90b2NvbAorICAgICAgIG1pc21hdGNoZXMgLS0gb3Igd29yc2UgLS0gYmV0d2VlbiBUZWxuZXQgY2xpZW50IGFuZCBzZXJ2ZXIpLCB0ZWxsCisgICAgICAgQy1LZXJtaXQgdG8gU0VUIFRFTE5FVCBXQUlUIE9GRiAob3IgaW5jbHVkZSB0aGUgL05PV0FJVCBzd2l0Y2gKKyAgICAgICB3aXRoIHRoZSBURUxORVQgY29tbWFuZCkuCisKKyAgVGhlIFJsb2dpbiBDbGllbnQKKworICAgSW4gbXVsdGl1c2VyIG9wZXJhdGluZyBzeXN0ZW1zIHN1Y2ggYXMgVU5JWCBhbmQgVk1TLCBUQ1AvSVAgUmxvZ2luCisgICBjb25uZWN0aW9ucyBhcmUgYXZhaWxhYmxlIG9ubHkgdG8gcHJpdmlsZWdlZCB1c2Vycywgc2luY2UgImxvZ2luIiBpcyBhCisgICBwcml2aWxlZ2VkIHNvY2tldC4gQXNzdW1pbmcgeW91IGFyZSBhbGxvd2VkIHRvIHVzZSBpdCBpbiB0aGUgZmlyc3QKKyAgIHBsYWNlLCBpdCBpcyBsaWtlbHkgdG8gYmVoYXZlIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB3aGF0IHR5cGUgb2YKKyAgIGhvc3QgeW91IGFyZSBybG9nZ2luZyBpbiB0bywgZHVlIHRvIHRlY2huaWNhbCByZWFzb25zIGhhdmluZyB0byBkbworICAgd2l0aCBjb25mbGljdGluZyBpbnRlcnByZXRhdGlvbnMgb2YgUkZDNzkzIChPdXQtT2YtQmFuZCBEYXRhKSBhbmQKKyAgIFJsb2dpbiAoUkZDMTEyMikuLi4gIlNwZWNpZmljYWxseSwgdGhlIFRDUCB1cmdlbnQgcG9pbnRlciBpbiBCU0QKKyAgIHBvaW50cyB0byB0aGUgYnl0ZSBhZnRlciB0aGUgdXJnZW50IGRhdGEgYnl0ZSwgYW5kIGFuIFJGQy1jb21wbGlhbnQKKyAgIFRDUCB1cmdlbnQgcG9pbnRlciBwb2ludHMgdG8gdGhlIHVyZ2VudCBkYXRhIGJ5dGUuIEFzIGEgcmVzdWx0LCBpZiBhbgorICAgYXBwbGljYXRpb24gc2VuZHMgdXJnZW50IGRhdGEgZnJvbSBhIEJTRC1jb21wYXRpYmxlIGltcGxlbWVudGF0aW9uIHRvCisgICBhbiBbNDRdUkZDLTExMjIgY29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbiB0aGVuIHRoZSByZWNlaXZlciB3aWxsIHJlYWQKKyAgIHRoZSB3cm9uZyB1cmdlbnQgZGF0YSBieXRlIChpdCB3aWxsIHJlYWQgdGhlIGJ5dGUgbG9jYXRlZCBhZnRlciB0aGUKKyAgIGNvcnJlY3QgYnl0ZSBpbiB0aGUgZGF0YSBzdHJlYW0gYXMgdGhlIHVyZ2VudCBkYXRhIGJ5dGUpLiIgUmxvZ2luCisgICByZXF1aXJlcyB0aGUgdXNlIG9mIE9PQiBkYXRhIHdoaWxlIFRlbG5ldCBkb2VzIG5vdC4gVGhlcmVmb3JlLCBpdCBpcworICAgcG9zc2libGUgZm9yIFRlbG5ldCB0byB3b3JrIGJldHdlZW4gYWxsIHN5c3RlbXMgd2hpbGUgQlNEIGFuZCBTeXN0ZW0gVgorICAgVENQL0lQIGltcGxlbWVudGF0aW9ucyBhcmUgYWxtb3N0IGFsd2F5cyBhIGJhZCBtaXguCisKKyAgVGhlIFRlbG5ldCBDbGllbnQKKworICAgT24gYSBUQ1AvSVAgVEVMTkVUIGNvbm5lY3Rpb24sIHlvdSBzaG91bGQgbm9ybWFsbHkgaGF2ZSBQQVJJVFkgc2V0IHRvCisgICBOT05FIGFuZCAoZXhjZXB0IGluIFZNUyBDLUtlcm1pdCkgRkxPVy1DT05UUk9MIGFsc28gc2V0IHRvIE5PTkUuIElmCisgICBmaWxlIHRyYW5zZmVyIGRvZXMgbm90IHdvcmsgd2l0aCB0aGVzZSBzZXR0aW5ncyAoZm9yIGV4YW1wbGUsIGJlY2F1c2UKKyAgIHRoZSByZW1vdGUgVEVMTkVUIHNlcnZlciBvbmx5IGdpdmVzIGEgNy1iaXQgZGF0YSBwYXRoKSwgdXNlIFNFVCBQQVJJVFkKKyAgIFNQQUNFLiBEbyBub3QgdXNlIFNFVCBQQVJJVFkgTUFSSywgRVZFTiwgb3IgT0REIG9uIGEgVEVMTkVUIGNvbm5lY3Rpb24KKyAgIC0tIGl0IGludGVyZmVyZXMgd2l0aCBURUxORVQgcHJvdG9jb2wuCisKKyAgIElmIGVjaG9pbmcgZG9lcyBub3Qgd29yayByaWdodCBhZnRlciBjb25uZWN0aW5nIHRvIGEgbmV0d29yayBob3N0IG9yCisgICBhZnRlciBkaWFsaW5nIHRocm91Z2ggYSBUQ1AvSVAgbW9kZW0gc2VydmVyLCBpdCBwcm9iYWJseSBtZWFucyB0aGF0CisgICB0aGUgVEVMTkVUIHNlcnZlciBvbiB0aGUgZmFyIGVuZCBvZiB0aGUgY29ubmVjdGlvbiBpcyBleGVjdXRpbmcgdGhlCisgICBURUxORVQgcHJvdG9jb2wgaW5jb3JyZWN0bHkuIEFmdGVyIGluaXRpYWxseSBjb25uZWN0aW5nIGFuZAorICAgZGlzY292ZXJpbmcgaW5jb3JyZWN0IGVjaG9pbmcgKGNoYXJhY3RlcnMgYXJlIGVjaG9lZCB0d2ljZSwgb3Igbm90IGF0CisgICBhbGwpLCBlc2NhcGUgYmFjaywgZ2l2ZSB0aGUgYXBwcm9wcmlhdGUgU0VUIERVUExFWCBjb21tYW5kIChGVUxMIG9yCisgICBIQUxGKSwgYW5kIHRoZW4gQ09OTkVDVCBhZ2Fpbi4gRm9yIGEgY29uc2lzdGVudGx5IG1pc2JlaGF2aW5nCisgICBjb25uZWN0aW9uLCB5b3UgY2FuIGF1dG9tYXRlIHRoaXMgcHJvY2VzcyBpbiBhIG1hY3JvIG9yIFRBS0UgZmlsZS4KKworICAgVEVMTkVUIHNlc3Npb25zIGFyZSB0cmVhdGVkIGp1c3QgbGlrZSBzZXJpYWwgY29tbXVuaWNhdGlvbnMgc2Vzc2lvbnMKKyAgIGFzIGZhciBhcyAidGVybWluYWwgYnl0ZXNpemUiIGFuZCAiY29tbWFuZCBieXRlc2l6ZSIgYXJlIGNvbmNlcm5lZC4gSWYKKyAgIHlvdSBuZWVkIHRvIHZpZXcgYW5kL29yIGVudGVyIDgtYml0IGNoYXJhY3RlcnMgZHVyaW5nIGEgVEVMTkVUCisgICBzZXNzaW9uLCB5b3UgbXVzdCB0ZWxsIEMtS2VybWl0IHRvIFNFVCBURVJNSU5BTCBCWVRFU0laRSA4LCBTRVQKKyAgIENPTU1BTkQgQllURVNJWkUgOCwgYW5kIFNFVCBQQVJJVFkgTk9ORS4KKworICAgSWYgeW91IFNFVCBURUxORVQgREVCVUcgT04gcHJpb3IgdG8gbWFraW5nIGEgY29ubmVjdGlvbiwgcHJvdG9jb2wKKyAgIG5lZ290aWF0aW9ucyB3aWxsIGJlIGRpc3BsYXllZCBvbiB5b3VyIHNjcmVlbi4gWW91IGNhbiBhbHNvIGNhcHR1cmUKKyAgIHRoZW0gaW4gdGhlIGRlYnVnIGxvZyAoYWxvbmcgd2l0aCBldmVyeXRoaW5nIGVsc2UpIGFuZCB0aGVuIGV4dHJhY3QKKyAgIHRoZW0gZWFzaWx5LCBzaW5jZSBhbGwgVGVsbmV0IG5lZ290aWF0aW9ucyBsaW5lcyBiZWdpbiB3aXRoCisgICAodXBwZXJjYXNlKSAiVEVMTkVUIi4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA1LiBNT0RFTVMgQU5EIERJQUxJTkcKKworICAgWyBbNDVdVG9wIF0gWyBbNDZdQ29udGVudHMgXSBbIFs0N11OZXh0IF0gWyBbNDhdUHJldmlvdXMgXQorCisgICBFeHRlcm5hbCBtb2RlbXMgYXJlIHJlY29tbWVuZGVkIGJlY2F1c2U6CisKKyAgICAgKiBUaGV5IGRvbid0IG5lZWQgYW55IHNwZWNpYWwgZHJpdmVycy4KKyAgICAgKiBUaGV5IGFyZSBsZXNzIGxpa2VseSB0byBpbnRlcmZlcmUgd2l0aCBub3JtYWwgb3BlcmF0aW9uIG9mIHlvdXIKKyAgICAgICBjb21wdXRlci4KKyAgICAgKiBZb3UgY2FuIHVzZSB0aGUgbGlnaHRzIGFuZCBzcGVha2VyIHRvIHRyb3VibGVzaG9vdCBkaWFsaW5nLgorICAgICAqIFlvdSBjYW4gc2hhcmUgdGhlbSBhbW9uZyBhbGwgdHlwZXMgb2YgY29tcHV0ZXJzLgorICAgICAqIFlvdSBjYW4gZWFzaWx5IHR1cm4gdGhlbSBvZmYgYW5kIG9uIHdoZW4gcG93ZXItY3ljbGluZyBzZWVtcworICAgICAgIHdhcnJhbnRlZC4KKyAgICAgKiBUaGV5IGFyZSBtb3JlIGxpa2VseSB0byBoYXZlIG1hbnVhbHMuCisKKyAgIE1vZGVtcyBjYW4gYmUgdXNlZCBieSBDLUtlcm1pdCBvbmx5IHdoZW4gdGhleSBhcmUgdmlzaWJsZSBhcyBvcgorICAgdGhyb3VnaCBhIHJlZ3VsYXIgc2VyaWFsIHBvcnQgZGV2aWNlLiBDZXJ0YWluIG1vZGVtcyBjYW4gbm90IGJlIHVzZWQKKyAgIGluIHRoaXMgbm9ybWFsIHdheSBvbiBtYW55IGtpbmRzIG9mIGNvbXB1dGVyczogV2lubW9kZW1zLCBSUEkgbW9kZW1zLAorICAgQ29udHJvbGxlcmxlc3MgbW9kZW1zLCB0aGUgSUJNIE13YXZlLCBldGM7IGFsbCBvZiB0aGVzZSByZXF1aXJlCisgICBzcGVjaWFsIGRyaXZlcnMgdGhhdCBwZXJmb3JtIHNvbWUsIG1vc3QsIG9yIGFsbCBvZiB0aGUgbW9kZW0ncworICAgZnVuY3Rpb25zIGluIHNvZnR3YXJlLiBTdWNoIGRyaXZlcnMgYXJlIGdlbmVyYWxseSBOT1QgYXZhaWxhYmxlIGluCisgICBVTklYIG9yIG90aGVyIG5vbi1XaW5kb3dzIChvciBub24tT1MvMiwgaW4gdGhlIGNhc2Ugb2YgdGhlIE13YXZlKQorICAgcGxhdGZvcm1zLgorCisgICBJbiBvcmRlciB0byBkaWFsIGEgbW9kZW0sIEMtS2VybWl0IG11c3Qga25vdyBpdHMgcmVwZXJ0b2lyZSBvZgorICAgY29tbWFuZHMgYW5kIHJlc3BvbnNlcy4gRWFjaCBtb2RlbSBtYWtlIGFuZCBtb2RlbCBpcyBsaWtlbHkgdG8gaGF2ZSBhCisgICBkaWZmZXJlbnQgcmVwZXJ0b2lyZS4gU2luY2UgS2VybWl0IGhhcyBubyB3YXkgb2Yga25vd2hpbmcgd2hpY2gga2luZAorICAgb2YgbW9kZW0gd2lsbCBiZSBkaWFsZWQsIG5vcm1hbGx5IHlvdSBoYXZlIHRvIHRlbGwgaXQgd2l0aCBhIFNFVCBNT0RFTQorICAgVFlQRSBjb21tYW5kLCBlLmcuOgorCisgIHNldCBtb2RlbSB0eXBlIHVzcm9ib3RpY3MKKyAgc2V0IGxpbmUgL2Rldi9jdWEwCisgIHNldCBzcGVlZCA1NzYwMAorICBkaWFsIDc2NTQzMjEKKworICAgSW4gdGhlIGVhcmx5IGRheXMsIHRoZXJlIHdhcyBhIHdpZGUgdmFyaWV0eSBvZiBtb2RlbXMgYW5kIGNvbW1hbmQKKyAgIGxhbmd1YWdlcy4gTm93YWRheXMsIGFsbW9zdCBldmVyeSBtb2RlbSB1c2VzIHRoZSBIYXllcyBBVCBjb21tYW5kIHNldAorICAgKGJ1dCB3aXRoIHNvbWUgZGlmZmVyZW5jZXMgaW4gdGhlIGRldGFpbHMpIGFuZCBpdHMgc3RhcnR1cAorICAgY29uZmlndXJhdGlvbiBpbmNsdWRlcyBlcnJvciBjb3JyZWN0aW9uLCBkYXRhIGNvbXByZXNzaW9uLCBhbmQKKyAgIGhhcmR3YXJlIChSVFMvQ1RTKSBmbG93IGNvbnRyb2wuIEFzIGxvbmcgYXMgQy1LZXJtaXQgaXMgY2FwYWJsZSBvZgorICAgaGFyZHdhcmUgZmxvdyBjb250cm9sIChhcyBpdCBpcyBvbiBtYW55LCBidXQgbm90IGFsbCwgdGhlIHBsYXRmb3JtcworICAgd2hlcmUgaXQgcnVucywgc2luY2Ugc29tZSBvcGVyYXRpbmcgc3lzdGVtcyBkb24ndCBzdXBwb3J0IGl0KSwgdGhlCisgICBtb2RlbSBjYW4gYmUgZGFpbGVkIGltbWVkaWF0ZWx5LCB3aXRob3V0IGxlbmd0aHkgY29uZmlndXJhdGlvbgorICAgZGlhbG9ncywgYW5kIGluIGZhY3QgdGhpcyBpcyB3aGF0IFNFVCBNT0RFTSBUWVBFIEdFTkVSSUMtSElHSC1TUEVFRAorICAgZG9lcy4gSW4gQy1LZXJtaXQgOC4wLCBHRU5FUklDLUhJR0gtU1BFRUQgaGFzIGJlY29tZSB0aGUgZGVmYXVsdCBtb2RlbQorICAgdHlwZSwgc28gbm93IGl0IGlzIHVzdWFsbHkgcG9zc2libGUgdG8gU0VUIExJTkUsIFNFVCBTUEVFRCwgYW5kIERJQUwKKyAgIHdpdGhvdXQgaGF2aW5nIHRvIGlkZW50aWZ5IHlvdXIgbW9kZW0uIElmIHRoaXMgZG9lc24ndCB3b3JrLCBvZgorICAgY291cnNlLCB0aGVuIHlvdSBtaWdodCBoYXZlIHRvIGZhbGwgYmFjayB0byB0aGUgdHJhZGlhdGlvbmFsIG1ldGhvZDoKKyAgIEdpdmUgYSBTRVQgTU9ERU0gVFlQRSBmb3IgYSBzcGVjaWZpYyBtb2RlbSBmaXJzdCwgdGhlbiBTRVQgTElORSwgU0VUCisgICBTUEVFRCwgYW5kIERJQUwuCisKKyAgIEFuIGltcG9ydGFudCBjaGFuZ2UgaW4gQy1LZXJtaXQgNi4wIGlzIHRoYXQgd2hlbiB5b3UgZ2l2ZSBhIFNFVCBNT0RFTQorICAgVFlQRSBjb21tYW5kIHRvIHRlbGwgS2VybWl0IHdoYXQga2luZCBvZiBtb2RlbSB5b3UgaGF2ZSwgS2VybWl0IGFsc28KKyAgIHNldHMgYSBudW1iZXIgb2Ygb3RoZXIgbW9kZW0tcmVsYXRlZCBwYXJhbWV0ZXJzIGF1dG9tYXRpY2FsbHkgZnJvbSBpdHMKKyAgIGludGVybmFsIG1vZGVtIGRhdGFiYXNlLiBUaHVzLCB0aGUgb3JkZXIgaW4gd2hpY2ggeW91IGdpdmUKKyAgIG1vZGVtLXJlbGF0ZWQgY29tbWFuZHMgaXMgc2lnbmlmaWNhbnQsIHdoZXJlYXMgaW4gcHJpb3IgcmVsZWFzZXMgdGhleQorICAgY291bGQgYmUgZ2l2ZW4gaW4gYW55IG9yZGVyLgorCisgICBJbiBwYXJ0aWN1bGFyLCBNT0RFTSBTUEVFRC1NQVRDSElORyBpcyBzZXQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlCisgICBtb2RlbSBpcyBrbm93biB0byBiZSBjYXBhYmxlIG9mIHNwZWVkIGJ1ZmZlcmluZy4gU0VUIE1PREVNIFRZUEUKKyAgIEhBWUVTLTI0MDAgYXV0b21hdGljYWxseSB0dXJucyBTUEVFRC1NQVRDSElORyBPTiwgYmVjYXVzZSB3aGVuIHRoZQorICAgSGF5ZXMgMjQwMCByZXBvcnRzIGEgcGFydGljdWxhciBzcGVlZCBpbiBpdHMgQ09OTkVDVCBtZXNzYWdlLCB0aGF0CisgICBtZWFucyBpdHMgaW50ZXJmYWNlIHNwZWVkIGhhcyBjaGFuZ2VkIHRvIHRoYXQgc3BlZWQsIGFuZCBDLUtlcm1pdCdzCisgICBtdXN0IGNoYW5nZSBhY2NvcmRpbmdseSBpZiBpdCBpcyB0byBjb250aW51ZSBjb21tdW5pY2F0aW5nLiBUaGlzIG1pZ2h0CisgICBjYXVzZSBzb21lIGNvbmZ1c2lvbiBpZiB5b3UgdXNlICJzZXQgbW9kZW0gdHlwZSBoYXllcyIgZm9yIGRpYWxpbmcgYQorICAgbW9yZSBhZHZhbmNlZCB0eXBlIG9mIG1vZGVtLgorCisgICBUaGUgbmV3IGRlZmF1bHQgZm9yIGZsb3cgY29udHJvbCBpcyAiYXV0byIsIG1lYW5pbmcgImRvIHRoZSByaWdodAorICAgdGhpbmcgZm9yIGVhY2ggdHlwZSBvZiBjb25uZWN0aW9uIi4gU28gKGZvciBleGFtcGxlKSBpZiB5b3VyIHZlcnNpb24KKyAgIG9mIEMtS2VybWl0IHN1cHBvcnRzIFNFVCBGTE9XIFJUUy9DVFMgYW5kIHlvdXIgbW9kZW0gYWxzbyBzdXBwb3J0cworICAgUlRTL0NUUywgdGhlbiBLZXJtaXQgYXV0b21hdGljYWxseSBzZXRzIGl0cyBmbG93IGNvbnRyb2wgdG8gUlRTL0NUUworICAgYW5kIHNldCBtb2RlbSdzIGZsb3cgY29udHJvbCB0byBSVFMvQ1RTIHRvbyBiZWZvcmUgYXR0ZW1wdGluZyB0byB1c2UKKyAgIHRoZSBtb2RlbS4KKworICAgRm9yIHRoZXNlIHJlYXNvbnMsIGRvbid0IGFzc3VtZSB0aGF0ICJzZXQgbW9kZW0gdHlwZSBoYXllcyIgc2hvdWxkIGJlCisgICB1c2VkIGZvciBhbGwgbW9kZW1zIHRoYXQgdXNlcyB0aGUgSGF5ZXMgQVQgY29tbWFuZCBzZXQuICJzZXQgbW9kZW0KKyAgIHR5cGUgaGF5ZXMiIHJlYWxseSBkb2VzIG1lYW4gSGF5ZXMgMTIwMCBvciAyNDAwLCB3aGljaCBpbiB0dXJuIG1lYW5zCisgICBubyBoYXJkd2FyZSBmbG93IGNvbnRyb2wsIGFuZCBubyBzcGVlZCBidWZmZXJpbmcuIFRoaXMgY2hvaWNlIHdpbGwKKyAgIHJhcmVseSB3b3JrIHdpdGggYSBtb2Rlcm4gaGlnaC1zcGVlZCBtb2RlbS4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA2LiBESUFMSU5HIEhJTlRTIEFORCBUSVBTCisKKyAgIFsgWzQ5XVRvcCBdIFsgWzUwXUNvbnRlbnRzIF0gWyBbNTFdTmV4dCBdIFsgWzUyXVByZXZpb3VzIF0KKworICAgSWYgeW91IGhhdmUgYSBoaWdoLXNwZWVkLCBlcnJvci1jb3JyZWN0aW5nLCBkYXRhLWNvbXByZXNzaW5nLAorICAgc3BlZWQtYnVmZmVyaW5nIG1vZGVtLCB5b3Ugc2hvdWxkIGZpeCB0aGUgbW9kZW0ncyBpbnRlcmZhY2Ugc3BlZWQgYXMKKyAgIGhpZ2ggYXMgcG9zc2libGUsIHByZWZlcmFibHkgKGF0IGxlYXN0KSBmb3VyIHRpbWVzIGhpZ2hlciB0aGFuIGl0cworICAgbWF4aW11bSBjb25uZWN0aW9uIChtb2R1bGF0aW9uKSBzcGVlZCB0byBhbGxvdyBjb21wcmVzc2lvbiB0byB3b3JrIGF0CisgICBmdWxsIGFkdmFudGFnZS4gSW4gdGhpcyB0eXBlIG9mIHNldHVwLCB5b3UgbXVzdCBhbHNvIGhhdmUgYW4gZWZmZWN0aXZlCisgICBtZWFucyBvZiBmbG93IGNvbnRyb2wgZW5hYmxlZCBiZXR3ZWVuIEMtS2VybWl0IGFuZCB0aGUgbW9kZW0sCisgICBwcmVmZXJhYmx5IGhhcmR3YXJlIChSVFMvQ1RTKSBmbG93IGNvbnRyb2wuIE9uIHBsYXRmb3JtcyB0aGF0IGRvIG5vdAorICAgc3VwcG9ydCBoYXJkd2FyZSBmbG93IGNvbnRyb2wsIGl0IGlzIHVzdWFsbHkgcG9zc2libGUgdG8gc2VsZWN0CisgICBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgKFhvbi9Yb2ZmKSwgYW5kIEMtS2VybWl0IHdpbGwgZG8gaXRzIGJlc3QgdG8gc2V0CisgICB0aGUgbW9kZW0gZm9yIGxvY2FsIFhvbi9Yb2ZmIGZsb3cgY29udHJvbCB0b28gKGJ1dCB0aGVuLCBvZiBjb3Vyc2UsCisgICBDdHJsLVMgYW5kIEN0cmwtUSBjaGFyYWN0ZXJzIGNhbiBub3QgYmUgdHJhbnNtaXR0ZWQgb24gdGhlCisgICBjb25uZWN0aW9uKS4KKworICAgSWYgeW91IGFyZSBoYXZpbmcgdHJvdWJsZSBkaWFsaW5nIHlvdXIgbW9kZW0sIFNFVCBESUFMIERJU1BMQVkgT04gdG8KKyAgIHdhdGNoIHRoZSBkaWFsaW5nIGludGVyYWN0aW9ucyBiZXR3ZWVuIEMtS2VybWl0IGFuZCB5b3VyIG1vZGVtLgorICAgQ29uc3VsdCBDaGFwdGVycyAzLTQgb2YgWzUzXVVzaW5nIEMtS2VybWl0ICgybmQgRWQpIGZvciBtb2RlbS1kaWFsaW5nCisgICB0cm91Ymxlc2hvb3RpbmcgaW5zdHJ1Y3Rpb25zLiBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIG9mZmVyIHNvbWUKKyAgIGFkZHRpb25hbCBoaW50cyBhbmQgdGlwcy4KKworICA2LjEuIFN5bnRheAorCisgICBJZiB5b3Ugd2FudCB0byBkaWFsIGEgbnVtYmVyIHRoYXQgc3RhcnRzIHdpdGggIywgeW91J2xsIG5lZWQgdG8gcXVvdGUKKyAgIHRoZSAiIyIgY2hhcmFjdGVyIChhcyBcIyBvciBcezM1fSksIHNpbmNlIGl0IGlzIGFsc28gYSBjb21tZW50CisgICBpbnRyb2R1Y2VyOgorCisgIEMtS2VybWl0PmRpYWwgIzk4NzY1NDIxLTEtMjEyLTU1NTEyMTIgICA7IExvb2tzIGxpa2UgYSBjb21tZW50CisgID9Zb3UgbXVzdCBzcGVjaWZ5IGEgbnVtYmVyIHRvIGRpYWwKKyAgQy1LZXJtaXQ+ZGlhbCBcIzk4NzY1NDIxLTEtMjEyLTU1NTEyMTIgIDsgV29ya3MgT0sKKyAgQy1LZXJtaXQ+ZGlhbCA9Izk4NzY1NDIxLTEtMjEyLTU1NTEyMTIgIDsgVGhpcyB3b3JrcyB0b28KKworICAgV2hlbiB1c2luZyBhIGRpYWxpbmcgZGlyZWN0b3J5LCByZW1lbWJlciB3aGF0IGhhcHBlbnMgaWYgYSBuYW1lIGlzIG5vdAorICAgZm91bmQ6CisKKyAgQy1LZXJtaXQ+ZGlhbCB4eXpjb3JwCisgIExvb2t1cDogInh5emNvcnAiIC0gbm90IGZvdW5kIC0gZGlhbGluZyBhcyBnaXZlbgorCisgICBUaGlzIG5vcm1hbGx5IGRvZXMgbm8gaGFybSwgYnV0IHNvbWUgbW9kZW1zIG1pZ2h0IGJlaGF2ZSBzdHJhbmdlbHkKKyAgIHdoZW4gZ2l2ZW4gZGlhbCBzdHJpbmdzIHRoYXQgY29udGFpbiBjZXJ0YWluIGxldHRlcnMuIEZvciBleGFtcGxlLCBhCisgICBjZXJ0YWluIEdlcm1hbiBtb2RlbSB0cmVhdHMgYW55IGRpYWwgc3RyaW5nIHRoYXQgY29udGFpbnMgdGhlIGxldHRlcgorICAgInMiIGFzIGEgY29tbWFuZCB0byBmZXRjaCBhIG51bWJlciBmcm9tIGl0cyBpbnRlcm5hbCBsaXN0LCBhbmQgcmVwbGllcworICAgT0sgdG8gdGhlIEFURCBjb21tYW5kLCB3aGljaCBpcyBub3JtYWxseSBub3QgYSB2YWxpZCByZXNwb25zZSBleGNlcHQKKyAgIGZvciBwYXJ0aWFsIGRpYWxpbmcuIFRvIGF2b2lkIHRoaXMgc2l0dWF0aW9uLCB1c2U6CisKKyAgbG9va3VwIHh5emNvcnAKKyAgaWYgc3VjY2VzcyBkaWFsCisKKyAgNi4yLiBUaGUgQ2FycmllciBTaWduYWwKKworICAgUmVtZW1iZXI6IEluIG1hbnkgQy1LZXJtaXQgaW1wbGVtZW50YXRpb25zIChkZXBlbmRpbmcgb24gdGhlCisgICB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0gLS0gbW9zdGx5IFdpbmRvd3MsIE9TLzIsIGFuZAorICAgU3lzdGVtLVYtYmFzZWQgVU5JWCB2ZXJzaW9ucywgYW5kIGluIEMtS2VybWl0IDcuMCwgYWxzbyBWTVMpLCB5b3UKKyAgIGNhbid0IENPTk5FQ1QgdG8gYSBtb2RlbSBhbmQgdHlwZSB0aGUgbW9kZW0ncyBkaWFsaW5nIGNvbW1hbmQgKGxpa2UKKyAgICJBVERUNzY1NDMyMSIpIG1hbnVhbGx5LCB1bmxlc3MgeW91IGZpcnN0IHRlbGwgQy1LZXJtaXQgdG86CisKKyAgU0VUIENBUlJJRVItV0FUQ0ggT0ZGCisKKyAgIFRoaXMgaXMgYmVjYXVzZSAoaW4gdGhlc2UgaW1wbGVtZW50YXRpb25zKSwgdGhlIENPTk5FQ1QgY29tbWFuZAorICAgcmVxdWlyZXMgdGhlIG1vZGVtJ3MgQ2FycmllciBEZXRlY3QgKENEKSBzaWduYWwgdG8gYmUgb24sIGJ1dCB0aGUgQ0QKKyAgIHNpZ25hbCBkb2Vzbid0IGNvbWUgb24gdW50aWwgYWZ0ZXIgZGlhbGluZyBpcyBjb21wbGV0ZS4gVGhpcworICAgcmVxdWlyZW1lbnQgaXMgd2hhdCBhbGxvd3MgQy1LZXJtaXQgdG8gcG9wIGJhY2sgdG8gaXRzIHByb21wdAorICAgYXV0b21hdGljYWxseSB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGh1bmcgdXAuIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YKKyAgIFNFVCBDQVJSSUVSLVdBVENIIGluICJVc2luZyBDLUtlcm1pdCIuCisKKyAgIFNpbWlsYXJseSwgaWYgeW91ciBkaWFsZWQgY29ubmVjdGlvbiBkcm9wcyB3aGVuIENBUlJJRVItV0FUQ0ggaXMgc2V0CisgICB0byBBVVRPIG9yIE9OLCB5b3UgY2FuJ3QgQ09OTkVDVCBiYWNrIHRvIHRoZSAobm93IGRpc2Nvbm5lY3RlZCkgc2NyZWVuCisgICB0byBzZWUgd2hhdCBtaWdodCBoYXZlIGhhcHBlbmVkIHVubGVzcyB5b3UgZmlyc3QgU0VUIENBUlJJRVItV0FUQ0gKKyAgIE9GRi4gQnV0IHNvbWV0aW1lcyBub3QgZXZlbiBTRVQgQ0FSUklFUi1XQVRDSCBPRkYgd2lsbCBoZWxwIGluIHRoaXMKKyAgIHNpdHVhdGlvbjogY2VydGFpbiBwbGF0Zm9ybXMgKGZvciBleGFtcGxlIFVuaXh3YXJlIDIuMSksIG9uY2UgY2FycmllcgorICAgZHJvcHMsIHdvbid0IGxldCB0aGUgYXBwbGljYXRpb24gZG8gaS9vIHdpdGggdGhlIGRldmljZSBhbnkgbW9yZS4gSW4KKyAgIHRoYXQgY2FzZSwgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkZXZpY2UgYWdhaW4sIHlvdSBoYXZlIHRvIENMT1NFIGl0CisgICBhbmQgT1BFTiBpdCBhZ2Fpbi4gT3IgeW91IGNhbiBoYXZlIEtlcm1pdCBkbyB0aGlzIGZvciB5b3UKKyAgIGF1dG9tYXRpY2FsbHkgYnkgdGVsbGluZyBpdCB0byBTRVQgQ0xPU0UtT04tRElTQ09OTkVDVCBPTi4KKworICA2LjMuIERpYWxpbmcgYW5kIEZsb3cgQ29udHJvbAorCisgICBEb24ndCBTRVQgRkxPVyBSVFMvQ1RTIGlmIHlvdXIgbW9kZW0gaXMgdHVybmVkIG9mZiwgb3IgaWYgaXQgaXMgbm90CisgICBwcmVzZW50aW5nIHRoZSBDVFMgc2lnbmFsLiBPdGhlcndpc2UsIHRoZSBzZXJpYWwgZGV2aWNlIGRyaXZlciBjYW4gZ2V0CisgICBzdHVjayB3YWl0aW5nIGZvciB0aGlzIHNpZ25hbCB0byBhcHBlYXIuCisKKyAgIE1vc3QgbW9kZXJuIG1vZGVtcyBzdXBwb3J0IFJUUy9DVFMgKGlmIHRoZXkgc3VwcG9ydCBhbnkgaGFyZHdhcmUgZmxvdworICAgY29udHJvbCBhdCBhbGwpLCBidXQgc29tZSBjb21wdXRlcnMgdXNlIGRpZmZlcmVudCBSUy0yMzIgY2lyY3VpdHMgZm9yCisgICB0aGUgc2FtZSBwdXJwb3NlcywgZS5nLiBEVFIgYW5kIENELCBvciBEVFIgYW5kIENUUy4gSW4gc3VjaCBjYXNlcywgeW91CisgICBtaWdodCBiZSBhYmxlIHRvIG1ha2UgeW91ciBjb21wdXRlciB3b3JrIHdpdGggeW91ciBtb2RlbSBieQorICAgYXBwcm9wcmlhdGVseSBjcm9zcy13aXJpbmcgdGhlIGNpcmN1aXRzIGluIHRoZSBjYWJsZSBjb25uZWN0b3IsIGZvcgorICAgZXhhbXBsZSB0aGUgY29tcHV0ZXIncyBEVFIgdG8gdGhlIG1vZGVtJ3MgUlRTLCBhbmQgbW9kZW0ncyBDRCB0byB0aGUKKyAgIGNvbXB1dGVyJ3MgQ1RTLiBIT1dFVkVSLCBDLUtlcm1pdCBkb2VzIG5vdCBrbm93IHlvdSBoYXZlIGRvbmUgdGhpcy4gU28KKyAgIGlmIHlvdSBoYXZlIChzYXkpIFNFVCBGTE9XIERUUi9DRCwgQy1LZXJtaXQgd2lsbCBtYWtlIG5vIGF0dGVtcHQgdG8KKyAgIHRlbGwgdGhlIG1vZGVtIHRvIHVzZSBSVFMvQ1RTLiBZb3UgcHJvYmFibHkgZGlkIHRoaXMgeW91cnNlbGYgd2hlbiB5b3UKKyAgIGNvbmZpZ3VyZWQgdGhlIG1vZGVtLgorCisgIDYuNC4gVGhlIERpYWwgVGltZW91dAorCisgICBJZiBpdCB0YWtlcyB5b3VyIGNhbGwgbG9uZ2VyIHRvIGJlIGNvbXBsZXRlZCB0aGFuIHRoZSB0aW1lb3V0IGludGVydmFsCisgICB0aGF0IEMtS2VybWl0IGNhbGN1bGF0ZXMsIHlvdSBjYW4gdXNlIHRoZSBTRVQgRElBTCBUSU1FT1VUIGNvbW1hbmQgdG8KKyAgIG92ZXJyaWRlIEMtS2VybWl0J3MgdmFsdWUuIEJ1dCBiZXdhcmU6IHRoZSBtb2RlbSBoYXMgaXRzIG93biB0aW1lb3V0CisgICBmb3IgY29tcGxldGluZyB0aGUgY2FsbC4gSWYgaXQgaXMgYSBIYXllcy1saWtlIG1vZGVtLCBDLUtlcm1pdCBhZGp1c3RzCisgICB0aGUgbW9kZW0ncyB2YWx1ZSB0b28gYnkgc2V0dGluZyByZWdpc3RlciBTNy4gQnV0IHRoZSBtYXhpbXVtIHZhbHVlCisgICBmb3IgUzcgbWlnaHQgYmUgc21hbGxlciB0aGFuIHRoZSB0aW1lIHlvdSBuZWVkISBJbiB0aGF0IGNhc2UsIEMtS2VybWl0CisgICBzZXRzIFM3IHRvIDAsIDI1NSwgb3Igb3RoZXIgKG1vZGVtLXNwZWNpZmljKSB2YWx1ZSB0byBzaWduaWZ5ICJubworICAgdGltZW91dCIuIElmIEtlcm1pdCBhdHRlbXB0cyB0byBzZXQgcmVnaXN0ZXIgUzcgdG8gYSB2YWx1ZSBoaWdoZXIgdGhhbgorICAgeW91ciBtb2RlbSdzIG1heGltdW0sIHRoZSBtb2RlbSB3aWxsIHNheSAiRVJST1IiIGFuZCB5b3Ugd2lsbCBnZXQgYQorICAgIkZhaWx1cmUgdG8gaW5pdGlhbGl6ZSBtb2RlbSIgZXJyb3IuIEluIHRoYXQgY2FzZSwgdXNlIFNFVCBESUFMCisgICBUSU1FT1VUIHRvIG92ZXJyaWRlIEMtS2VybWl0J3MgY2FsY3VsYXRpb24gb2YgdGhlIHRpbWVvdXQgdmFsdWUgd2l0aAorICAgdGhlIGhpZ2hlc3QgdmFsdWUgdGhhdCBpcyBsZWdhbCBmb3IgeW91ciBtb2RlbSwgZS5nLiA2MC4KKworICA2LjUuIEVzY2FwZSBTZXF1ZW5jZSBHdWFyZCBUaW1lCisKKyAgIEEgIlRJRVMiIChUaW1lLUluZGVwZW5kZW50IEVzY2FwZSBTZXF1ZW5jZSkgbW9kZW0gZG9lcyBub3QgcmVxdWlyZSBhbnkKKyAgIGd1YXJkIHRpbWUgYXJvdW5kIGl0cyBlc2NhcGUgc2VxdWVuY2UuIFRoZSBmb2xsb3dpbmcgdGV4dDoKKworICArKytBVEgwCisKKyAgIGlmIHNlbnQgdGhyb3VnaCBhIFRJRVMgbW9kZW0sIGZvciBleGFtcGxlIGJlY2F1c2UgeW91IHdlcmUgdXBsb2FkaW5nCisgICB0aGlzIGZpbGUgdGhyb3VnaCBpdCwgY291bGQgcG9wIHRoZSBtb2RlbSBiYWNrIGludG8gY29tbWFuZCBtb2RlIGFuZAorICAgbWFrZSBpdCBoYW5nIHVwIHRoZSBjb25uZWN0aW9uLiBMYXRlciB2ZXJzaW9ucyBvZiB0aGUgVGVsZWJpdCBUMTYwMAorICAgYW5kIFQzMDAwICh2ZXJzaW9uIExBMy4wMUUgZmlybXdhcmUgYW5kIGxhdGVyKSwgYW5kIGFsbCBXb3JsZEJsYXplcnMsCisgICB1c2UgVElFUy4KKworICAgQWx0aG91Z2ggdGhlIHByb2JhYmlsaXR5IG9mICIrKysiIGFwcGVhcmluZyBpbiBhIEtlcm1pdCBwYWNrZXQgaXMKKyAgIG1hcmtlZGx5IGxvd2VyIHRoYW4gd2l0aCBtb3N0IG90aGVyIHByb3RvY29scyAoc2VlIHRoZSBbNTRdRmlsZQorICAgVHJhbnNmZXIgc2VjdGlvbiBiZWxvdyksIGl0IGNhbiBzdGlsbCBoYXBwZW4gdW5kZXIgY2VydGFpbgorICAgY2lyY3Vtc3RhbmNlcy4gSXQgY2FuIGFsc28gaGFwcGVuIHdoZW4gdXNpbmcgQy1LZXJtaXQncyBUUkFOU01JVAorICAgY29tbWFuZC4gSWYgeW91IGFyZSB1c2luZyBhIFRlbGViaXQgVElFUyBtb2RlbSwgeW91IGNhbiBjaGFuZ2UgdGhlCisgICBtb2RlbSdzIGVzY2FwZSBzZXF1ZW5jZSB0byBhbiBvdGhlcndpc2UgbGl0dGxlLXVzZWQgY29udHJvbCBjaGFyYWN0ZXIKKyAgIHN1Y2ggYXMgQ3RybC1fIChDb250cm9sLVVuZGVyc2NvcmUpOgorCisgIEFUIFMyPTMxCisKKyAgIEEgc2VxdWVuY2Ugb2YgdGhyZWUgY29uc2VjdXRpdmUgQ3RybC1fIGNoYXJhY3RlcnMgd2lsbCBub3QgYXBwZWFyIGluIGEKKyAgIEtlcm1pdCBwYWNrZXQgdW5sZXNzIHlvdSBnbyB0byBleHRyYW9yZGluYXJ5IGxlbmd0aHMgdG8gZGVmZWF0IG1vcmUKKyAgIHRoYW4gYSBmZXcgb2YgS2VybWl0J3MgYnVpbHQtaW4gc2FmZXR5IG1lY2hhbmlzbXMuIEFuZCBpZiB5b3UgZG8gdGhpcywKKyAgIHRoZW4geW91IHNob3VsZCBhbHNvIHR1cm4gb2ZmIHRoZSBtb2RlbSdzIGVzY2FwZS1zZXF1ZW5jZSByZWNvZ25pdGlvbgorICAgYWx0b2dldGhlcjoKKworICBBVCBTNDg9MCBTMj0yNTUKKworICAgQnV0IHdoZW4gZXNjYXBlIHNlcXVlbmNlIHJlY29nbml0aW9uIGlzIHR1cm5lZCBvZmYsICJtb2RlbSBoYW5ndXAiCisgICAoPHBhdXNlPisrKzxwYXVzZT5BVEgwPENSPikgd2lsbCBub3Qgd29yaywgc28geW91IHNob3VsZCBhbHNvIFNFVAorICAgTU9ERU0gSEFOR1VQIFJTMjMyLVNJR05BTCAocmF0aGVyIHRoZW4gTU9ERU0tQ09NTUFORCkuCisKKyAgNi42LiBBZGFwdGl2ZSBEaWFsaW5nCisKKyAgIFNvbWUgbW9kZW1zIGhhdmUgYSBmZWF0dXJlIGNhbGxlZCBhZGFwdGl2ZSBkaWFsaW5nLiBXaGVuIHRoZXkgYXJlIHRvbGQKKyAgIHRvIGRpYWwgYSBudW1iZXIgdXNpbmcgVG9uZSBkaWFsaW5nLCB0aGV5IGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0CisgICBkaWFsdG9uZSBoYXMgZ29uZSBhd2F5IGFmdGVyIGRpYWxpbmcgdGhlIGZpcnN0IGRpZ2l0LiBJZiBpdCBoYXMgbm90LAorICAgdGhlIG1vZGVtIGFzc3VtZXMgdGhlIHBob25lIGxpbmUgZG9lcyBub3QgYWNjZXB0IFRvbmUgZGlhbGluZyBhbmQgc28KKyAgIHN3aXRjaGVzIHRvIFB1bHNlLiBXaGVuIGRpYWxpbmcgb3V0IGZyb20gYSBQQlgsIHRoZXJlIGlzIGFsbW9zdCBhbHdheXMKKyAgIGEgc2Vjb25kYXJ5IGRpYWx0b25lLiBUeXBpY2FsbHkgeW91IHRha2UgdGhlIHBob25lIG9mZi1ob29rLCBnZXQgdGhlCisgICBQQlggZGlhbHRvbmUsIGRpYWwgIjkiIHRvIGdldCBhbiBvdXRzaWRlIGxpbmUsIGFuZCB0aGVuIGdldCB0aGUgcGhvbmUKKyAgIGNvbXBhbnkncyBkaWFsdG9uZS4gSW4gYSBzaXR1YXRpb24gbGlrZSB0aGlzLCB5b3UgbmVlZCB0byB0ZWxsIHRoZQorICAgbW9kZW0gdG8gZXhwZWN0IHRoZSBzZWNvbmRhcnkgZGlhbHRvbmUuIE9uIEhheWVzIGFuZCBjb21wYXRpYmxlCisgICBtb2RlbXMsIHRoaXMgaXMgZG9uZSBieSBwdXR0aW5nIGEgIlciIGluIHRoZSBkaWFsIHN0cmluZyBhdCB0aGUKKyAgIGFwcHJvcHJpYXRlIHBsYWNlLiBGb3IgZXhhbXBsZSwgdG8gZGlhbCA5IGZvciBhbiBvdXRzaWRlIGxpbmUsIGFuZAorICAgdGhlbiA3NjU0MzIxLCB1c2UgQVREVDlXNzY1NDMyMToKKworICBTRVQgUEJYLU9VVFNJREUtUFJFRklYIDlXCisKKyAgIChyZXBsYWNlICI5IiB3aXRoIHdoYXRldmVyIHlvdXIgUEJYJ3Mgb3V0c2lkZS1saW5lIHByZWZpeCBpcykuCisKKyAgNi43LiBUaGUgQnVzeSBTaWduYWwKKworICAgU29tZSBwaG9uZSBjb21wYW5pZXMgYXJlIGVsaW1pbmF0aW5nIHRoZSBidXN5IHNpZ25hbC4gSW5zdGVhZCwgdGhleQorICAgaXNzdWUgYSB2b2ljZSBtZXNzYWdlIHN1Y2ggYXMgInByZXNzIDEgdG8gYXV0b21hdGljYWxseSByZWRpYWwgdW50aWwKKyAgIHRoZSBudW1iZXIgYW5zd2Vycywgb3IuLi4iLiBPYnZpb3VzbHkgdGhpcyBpcyBhIGRpc2FzdGVyIGZvciBtb2RlbQorICAgY2FsbHMuIElmIHlvdXIgc2VydmljZSBoYXMgdGhpcyBmZWF0dXJlLCB0aGVyZSdzIG5vdGhpbmcgS2VybWl0IGNhbiBkbworICAgYWJvdXQgaXQuIFlvdXIgbW9kZW0gd2lsbCByZXNwb25kIHdpdGggTk8gQ0FSUklFUiAoYWZ0ZXIgYSBsb25nIHRpbWUpCisgICByYXRoZXIgdGhhbiBCVVNZIChpbW1lZGlhdGVseSksIGFuZCBLZXJtaXQgd2lsbCBkZWNsYXJlIHRoZSBjYWxsIGEKKyAgIGZhaWx1cmUsIHJhdGhlciB0aGFuIHRyeWluZyB0byByZWRpYWwgdGhlIHNhbWUgbnVtYmVyLgorCisgIDYuOC4gSGFuZ2luZyBVcAorCisgICBUaGVyZSBhcmUgdHdvIHdheXMgdG8gaGFuZyB1cCBhIG1vZGVtOiBieSB0dXJuaW5nIG9mZiB0aGUgc2VyaWFsCisgICBwb3J0J3MgRFRSIHNpZ25hbCAoU0VUIE1PREVNIEhBTkdVUC1NRVRIT0QgUlMyMzItU0lHTkFMKSBvciBzZW5kaW5nCisgICB0aGUgbW9kZW0gaXRzIGVzY2FwZSBzZXF1ZW5jZSBmb2xsb3dlZCBieSBpdHMgaGFuZ3VwIGNvbW1hbmQgKFNFVAorICAgTU9ERU0gSEFOR1VQLU1FVEhPRCBNT0RFTS1DT01NQU5EKS4gSWYgb25lIGRvZXNuJ3Qgd29yaywgdHJ5IHRoZQorICAgb3RoZXIuIElmIHRoZSBhdXRvbWF0aWMgaGFuZ3VwIHBlcmZvcm1lZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgRElBTAorICAgY29tbWFuZCBjYXVzZXMgdHJvdWJsZSwgdGhlbiBTRVQgRElBTCBIQU5HVVAgT0ZGLgorCisgICBUaGUgSEFOR1VQIGNvbW1hbmQgaGFzIG5vIGVmZmVjdCB3aGVuIEMtS2VybWl0IGlzIGluIHJlbW90ZSBtb2RlLiBUaGlzCisgICBpcyBvbiBwdXJwb3NlLiBJZiBDLUtlcm1pdCBjb3VsZCBoYW5nIHVwIGl0cyBvd24gY29udHJvbGxpbmcgdGVybWluYWwsCisgICB0aGlzIHdvdWxkIChhKSBtb3N0IGxpa2VseSBsZWF2ZSBiZWhpbmQgem9tYmllIHByb2Nlc3NlcywgYW5kIChiKSBwb3NlCisgICBhIHNlY3VyaXR5IHJpc2suCisKKyAgIElmIHlvdSBESUFMIGEgbW9kZW0sIGRpc2Nvbm5lY3QsIHRoZW4gU0VUIEhPU1Qgb3IgVEVMTkVULCBhbmQgdGhlbgorICAgSEFOR1VQLCBLZXJtaXQgc2VuZHMgdGhlIG1vZGVtJ3MgaGFuZ3VwIGNvbW1hbmQsIHN1Y2ggYXMgIisrK0FUSE8iLgorICAgVGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gYXZvaWQgdGhpcywgYmVjYXVzZSB0aGlzIGNhc2UgY2FuJ3QgcmVsaWFibHkKKyAgIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSB0aGUgY2FzZSBpbiB3aGljaCB0aGUgdXNlciBkb2VzIFNFVCBIT1NUCisgICB0ZXJtaW5hbC1zZXJ2ZXIsIFNFVCBNT0RFTSBUWVBFIG5hbWUsIERJQUwuIEluIGJvdGggY2FzZXMgd2UgaGF2ZSBhCisgICB2YWxpZCBtb2RlbSB0eXBlIHNlbGVjdGVkIGFuZCB3ZSBoYXZlIGEgbmV0d29yayBjb25uZWN0aW9uLiBJZiB5b3UKKyAgIHdhbnQgdG8gRElBTCBhbmQgdGhlbiBsYXRlciBtYWtlIGEgcmVndWxhciBuZXR3b3JrIGNvbm5lY3Rpb24sIHlvdQorICAgd2lsbCBoYXZlIHRvIFNFVCBNT0RFTSBUWVBFIE5PTkUgb3IgU0VUIERJQUwgSEFOR1VQIE9GRiB0byBhdm9pZCB0aGlzCisgICBwaGVub21lbm9uLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDcuIFRFUk1JTkFMIFNFUlZFUlMKKworICAgWyBbNTVdVG9wIF0gWyBbNTZdQ29udGVudHMgXSBbIFs1N11OZXh0IF0gWyBbNThdUHJldmlvdXMgXQorCisgICBXYXRjaCBvdXQgZm9yIHRlcm1pbmFsIHNlcnZlcidzIGVzY2FwZSBjaGFyYWN0ZXIgLS0gdXN1YWxseSBhIGNvbnRyb2wKKyAgIGNoYXJhY3RlciBzdWNoIGFzIEN0cmwtQ2lyY3VtZmxleCAoQ3RybC1eKS4gRG9uJ3QgdW5wcmVmaXggaXQgaW4KKyAgIEtlcm1pdCEKKworICAgQ2lzY29zIC0tIG11c3Qgb2Z0ZW4gYmUgdG9sZCB0byAidGVybWluYWwgZG93bmxvYWQiLi4uIENpc2NvIEFTTQorICAgbW9kZWxzIGRvbid0IGhhdmUgaGFyZHdhcmUgZmxvdyBjb250cm9sIGluIGJvdGggZGlyZWN0aW9ucy4KKworICAgTWFueSB0ZXJtaW5hbCBzZXJ2ZXJzIG9ubHkgZ2l2ZSB5b3UgYSA3LWJpdCBjb25uZWN0aW9uLCBzbyBpZiB5b3UKKyAgIGNhbid0IG1ha2UgaXQgOC1iaXQsIHRlbGwgS2VybWl0IHRvICJzZXQgcGFyaXR5IHNwYWNlIi4KKworICAgVGhlIGZvbGxvd2luZyBzdG9yeSwgcmVnYXJkaW5nIHRyb3VibGUgdHJhbnNmZXJyaW5nIDgtYml0IGZpbGVzCisgICB0aHJvdWdoIGEgcmV2ZXJzZSB0ZXJtaW5hbCBzZXJ2ZXIsIHdhcyBjb250cmlidXRlZCBieSBhbiBBbm5leAorICAgdGVybWluYWwgc2VydmVyIHVzZXI6CisKKyAgICAgVXNpbmcgQy1LZXJtaXQgb24gYW4gSFAgOTAwMCA3MTIvODAgcnVubmluZyB0aGUgSFAtVVggMTAuMAorICAgICBvcGVyYXRpbmcgc3lzdGVtLiBUaGUgSFAgd2FzIGNvbm5lY3RlZCB0byBhIFh5bG9naWNzIEFubmV4CisgICAgIE1JQ1JPLUVMUy1VWCBSNy4xIDggcG9ydCB0ZXJtaW5hbCBzZXJ2ZXIgdmlhIGV0aGVybmV0LiBPbiB0aGUKKyAgICAgc2Vjb25kIHBvcnQgb2YgdGhlIHRlcm1pbmFsIHNlcnZlciBpcyBhbiBBVCZUIFBhcmFkeW5lIDM4MTAgbW9kZW0sCisgICAgIHdoaWNoIGlzIGNvbm5lY3RlZCB0byBhIHRlbGVwaG9uZSBsaW5lLiBUaGVyZSBpcyBhIHByb2dyYW0gd2hpY2gKKyAgICAgcnVucyBvbiB0aGUgSFAgdG8gZXN0YWJsaXNoIGEgVGVsbmV0IGNvbm5lY3Rpb24gYmV0d2VlbiBhIHNlcmlhbAorICAgICBsaW5lIG9uIHRoZSBBbm5leCBhbmQgYSBjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIG9uIHRoZSBIUCAoL2RldgorICAgICBmaWxlKS4gVGhpcyBpcyBhbiBBbm5leCBzcGVjaWZpYyBwcm9ncmFtIGNhbGxlZCBydGVsbmV0IChyZXZlcnNlCisgICAgIHRlbG5ldCkgYW5kIGlzIHByb3ZpZGVkIHdpdGggdGhlIHRlcm1pbmFsIHNlcnZlciBzb2Z0d2FyZS4gVGhlCisgICAgIHJ0ZWxuZXQgdXRpbGl0eSBydW5zIG9uIHRvcCBvZiB0aGUgcHNldWRvLXRlcm1pbmFsIGZhY2lsaXR5CisgICAgIHByb3ZpZGVkIGJ5IFVOSVguIEl0IGNyZWF0ZXMgaG9zdC1vcmlnaW5pYXRlZCBjb25uZWN0aW9ucyB0bworICAgICBkZXZpY2VzIGF0dGFjaGVkIG90IEFubmV4IHNlcmlhbCBwb3J0cy4gVGhlcmUgYXJlIHNldmVyYWwgY29tbWFuZAorICAgICBsaW5lIGFyZ3VtZW50cyB0byBiZSBzcGVjaWZpZWQgd2l0aCB0aGlzIHByb2dyYW06IHRoZSBJUCBhZGRyZXNzIG9mCisgICAgIHRoZSB0ZXJtaW5hbCBzZXJ2ZXIsIHRoZSBudW1iZXIgb2YgdGhlIHBvcnQgdG8gYXR0YWNoIHRvLCBhbmQgdGhlCisgICAgIG5hbWUgb2YgdGhlIHBzZXVkby1kZXZpY2UgdG8gY3JlYXRlLiBJbiBhZGRpdGlvbiB0byB0aGVzZSB0aGVyZSBhcmUKKyAgICAgb3B0aW9ucyB0byB0ZWxsIHJ0ZWxuZXQgaG93IHRvIG9wZXJhdGUgb24gdGhlIGNvbm5lY3Q6IC1iIHJlcXVlc3RzCisgICAgIG5lZ290aWF0aW9uIGZvciBUZWxuZXQgYmluYXJ5IG1vZGUsIC1kIHR1cm5zIG9uIHNvY2tldC1sZXZlCisgICAgIGRlYnVnZ2luZywgLWYgZW5hYmxlcyAiY29ubmVjdCBvbiB0aGUgZmx5IiBtb2RlLCAtciByZW1vdmVzIHRoZQorICAgICBkZXZpY2UtbmFtZSBpZiBpdCBhbHJlYWR5IGV4aXN0cywgZXRjLiBUaGUgbW9zdCBpbXBvcnRhbnQgb2YgdGhlc2UKKyAgICAgdG8gYmUgc3BlY2lmaWVkIHdoZW4gdXNpbmcgOCBkYXRhIGJpdHMgYW5kIG5vIHBhcml0eSwgYXMgd2UgZm91bmQKKyAgICAgb3V0LCB3YXMgdGhlIC10IG9wdGlvbi4gVGhpcyBjcmVhdGVzIGEgdHJhbnNwYXJlbnQgVENQIGNvbm5lY3Rpb24KKyAgICAgdG8gdGhlIHRlcm1pbmFsIHNlcnZlci4gQWdhaW4sIHdoYXQgd2UgYXNzdW1lZCB0byBiZSBoYXBwZW5pbmcgd2FzCisgICAgIHRoYXQgdGhlIHJ0ZWxuZXQgcHJvZ3JhbSBlbmNvdW50ZXJlZCBhIGNoYXJhY3RlciBzZXF1ZW5jZSBzcGVjaWFsCisgICAgIHRvIGl0c2VsZiBhbmQgdGhlbiAiZWF0aW5nIiB0aG9zZSBrZXJtaXQgcGFja2V0cy4gSSB0aGluayB0aGlzIGlzCisgICAgIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gSSBjYW4gZ2l2ZSB5b3Ugb24gdGhlIGNvbmZpZ3VyYXRpb24sIHNob3J0CisgICAgIG9mIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3J0IG9uIHRoZSB0ZXJtaW5hbCBzZXJ2ZXIuCisKKyAgIEhvdyB0byBESUFMIGZyb20gYSBUQ1AvSVAgcmV2ZXJzZSB0ZXJtaW5hbCBzZXJ2ZXIgKG1vZGVtIHNlcnZlcik6CisKKyAgICAxLiAob25seSBpZiBuZWNlc3NhcnkpIFNFVCBURUxORVQgRUNITyBSRU1PVEUKKyAgICAyLiBTRVQgSE9TVCB0ZXJtaW5hbC1zZXJ2ZXItaXAtbmFtZS1vci1hZGRyZXNzIFsgcG9ydCBdCisgICAgMy4gU0VUIE1PREVNIFRZUEUgbW9kZW0tdHlwZQorICAgIDQuIChvbmx5IGlmIG5lY2Vzc2FyeSkgU0VUIERJQUwgSEFOR1VQIE9GRgorICAgIDUuIChmb3IgdHJvdWJsZXNob290aW5nKSBTRVQgRElBTCBESVNQTEFZIE9OCisgICAgNi4gRElBTCBwaG9uZS1udW1iZXIKKworICAgVGhlIG9yZGVyIGlzIGltcG9ydGFudDogU0VUIEhPU1QgYmVmb3JlIFNFVCBNT0RFTSBUWVBFLiBTaW5jZSB0aGlzIGlzCisgICBhIFRlbG5ldCBjb25uZWN0aW9uLCBzZXJpYWwtcG9ydCByZWxhdGVkIGNvbW1hbmRzIHN1Y2ggYXMgU0VUIFNQRUVELAorICAgU0VUIFNUT1AtQklUUywgSEFOR1VQICh3aGVuIE1PREVNIEhBTkdVUC1NRVRIT0QgaXMgUlMyMzIpLCBldGMsIGhhdmUKKyAgIG5vIGVmZmVjdC4gSG93ZXZlciwgaW4gQy1LZXJtaXQgOC4wLCBpZiB0aGUgbW9kZW0gc2VydmVyIHN1cHBvcnRzCisgICBbNTldUkZDLTIyMTcgVGVsbmV0IENvbS1Qb3J0IENvbnRyb2wgcHJvdG9jb2wsIHRoZXNlIGNvbW1hbmRzIGRvCisgICBpbmRlZWQgdGFrZSBlZmZlY3QgYXQgdGhlIHNlcnZlcidzIHNlcmlhbCBwb3J0LgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDguIFRFUk1JTkFMIEVNVUxBVElPTgorCisgICBbIFs2MF1Ub3AgXSBbIFs2MV1Db250ZW50cyBdIFsgWzYyXU5leHQgXSBbIFs2M11QcmV2aW91cyBdCisKKyAgIEV4Y2VwdCBmb3IgdGhlIFdpbmRvd3MsIE9TLzIsIGFuZCBNYWNpbnRvc2ggdmVyc2lvbnMsIEMtS2VybWl0IGRvZXMKKyAgIG5vdCBlbXVsYXRlIGFueSBraW5kIG9mIHRlcm1pbmFsLiBSYXRoZXIsIGl0IGFjdHMgYXMgYQorICAgInNlbWl0cmFuc3BhcmVudCBwaXBlIiwgcGFzc2luZyB0aGUgY2hhcmFjdGVycyB5b3UgdHlwZSBkdXJpbmcgYQorICAgQ09OTkVDVCBzZXNzaW9uIHRvIHRoZSByZW1vdGUgaG9zdCwgYW5kIHNlbmRpbmcgdGhlIGNoYXJhY3RlcnMKKyAgIHJlY2VpdmVkIGZyb20gdGhlIHJlbW90ZSBob3N0IHRvIHlvdXIgc2NyZWVuLiBXaGF0ZXZlciBpcyBjb250cm9sbGluZworICAgeW91ciBrZXlib2FyZCBhbmQgc2NyZWVuIHByb3ZpZGVzIHRoZSBzcGVjaWZpYyB0ZXJtaW5hbCBlbXVsYXRpb246IGEKKyAgIHJlYWwgdGVybWluYWwsIGEgUEMgcnVubmluZyBhIHRlcm1pbmFsIGVtdWxhdG9yLCBldGMsIG9yIChpbiB0aGUgY2FzZQorICAgb2YgYSBzZWxmLWNvbnRhaW5lZCB3b3Jrc3RhdGlvbikgeW91ciBjb25zb2xlIGRyaXZlciwgYSB0ZXJtaW5hbAorICAgd2luZG93LCB4dGVybSwgZXRjLgorCisgICBLZXJtaXQgaXMgc2VtaXRyYW50c3BhcmVudCByYXRoZXIgdGhhbiBmdWxseSB0cmFuc3BhcmVudCBpbiB0aGUKKyAgIGZvbGxvd2luZyB3YXlzOgorCisgICAgICogRHVyaW5nIGEgVEVMTkVUICgic2V0IGhvc3QiKSBzZXNzaW9uLCBDLUtlcm1pdCBpdHNlbGYgZXhlY3V0ZXMgdGhlCisgICAgICAgVEVMTkVUIHByb3RvY29sIGFuZCBwZXJmb3JtcyBURUxORVQgbmVnb3RpYXRpb25zLiAoQnV0IGl0IGRvZXMgbm90CisgICAgICAgcGVyZm9ybSBUTjMyNzAgcHJvdG9jb2wgb3IgYW55IG90aGVyIHR5cGUgb2YgMzI3MCB0ZXJtaW5hbAorICAgICAgIGVtdWxhdGlvbi4pCisgICAgICogSWYgeW91IGhhdmUgY2hhbmdlZCB5b3VyIGtleWJvYXJkIG1hcHBpbmcgdXNpbmcgU0VUIEtFWSwgQy1LZXJtaXQKKyAgICAgICByZXBsYWNlcyB0aGUgY2hhcmFjdGVycyB5b3UgdHlwZSB3aXRoIHRoZSBjaGFyYWN0ZXJzIG9yIHN0cmluZ3MKKyAgICAgICB0aGV5IGFyZSBtYXBwZWQgdG8uCisgICAgICogSWYgeW91IFNFVCB5b3VyIFRFUk1JTkFMIENIQVJBQ1RFUi1TRVQgdG8gYW55dGhpbmcgYnV0CisgICAgICAgVFJBTlNQQVJFTlQsIEMtS2VybWl0IHRyYW5zbGF0ZXMgeW91ciBrZXlzdHJva2VzIChhZnRlciBhcHBseWluZworICAgICAgIGFueSBTRVQgS0VZIGRlZmluaXRpb25zKSBiZWZvcmUgdHJhbnNtaXR0aW5nIHRoZW0sIGFuZCB0cmFuc2xhdGVzCisgICAgICAgcmVjZWl2ZWQgY2hhcmFjdGVycyBiZWZvcmUgc2hvd2luZyB0aGVtIG9uIHlvdXIgc2NyZWVuLgorICAgICAqIElmIHlvdXIgcmVtb3RlIGFuZC9vciBsb2NhbCBURVJNSU5BTCBDSEFSQUNURVItU0VUIGlzIGFuIElTTyA2NDYKKyAgICAgICA3LWJpdCBuYXRpb25hbCBjaGFyYWN0ZXIgc2V0LCBzdWNoIGFzIEdlcm1hbiwgRnJlbmNoLCBJdGFsaWFuLAorICAgICAgIFN3ZWRpc2gsIGV0Yywgb3IgU2hvcnQgS09JIHVzZWQgZm9yIEN5cmlsbGljLCBDLUtlcm1pdCdzIENPTk5FQ1QKKyAgICAgICBjb21tYW5kIGF1dG9tYXRpY2FsbHkgc2tpcHMgb3ZlciBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgdG8gYXZvaWQKKyAgICAgICB0cmFuc2xhdGluZyB0aGVpciBjaGFyYWN0ZXJzLiBPbmx5IEFOU0kvSVNPIHN0YW5kYXJkCisgICAgICAgKFZUMTAwLzIwMC8zMDAtbGlrZSkgNy1iaXQgZXNjYXBlIHNlcXVlbmNlIGZvcm1hdHMgYXJlIHN1cHBvcnRlZAorICAgICAgIGZvciB0aGlzIHB1cnBvc2UsIG5vIHByb3ByaWV0YXJ5IHNjaGVtZXMgbGlrZSBILVAsIFRlbGV2aWRlbywKKyAgICAgICBUZWt0cm9uaXgsIGV0Yy4KKyAgICAgKiBJZiB5b3VyIHZlcnNpb24gb2YgQy1LZXJtaXQgaW5jbHVkZXMgU0VUIFRFUk1JTkFMIEFQQyBjb21tYW5kLAorICAgICAgIHRoZW4gQy1LZXJtaXQncyBDT05ORUNUIGNvbW1hbmQgd2lsbCBoYW5kbGUgQVBDIGVzY2FwZSBzZXF1ZW5jZXMKKyAgICAgICBpZiBURVJNSU5BTCBBUEMgaXMgbm90IHNldCB0byBPRkYgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KS4KKworICAgWW91IGNhbiBtYWtlIEMtS2VybWl0IGZ1bGx5IHRyYW5zcGFyZW50IGJ5IHN0YXJ0aW5nIGl0IHdpdGggdGhlIC0wCisgICAoZGFzaCB6ZXJvKSBjb21tYW5kLWxpbmUgb3B0aW9uLgorCisgICBJZiB5b3UgYXJlIHJ1bm5pbmcgQy1LZXJtaXQgdW5kZXIgYSBjb25zb2xlIGRyaXZlciwgb3IgaW4gYSB0ZXJtaW5hbAorICAgd2luZG93LCB0aGF0IGVtdWxhdGVzIHRoZSBWVDEwMCwgYW5kIHVzZSBDLUtlcm1pdCB0byBsb2cgaW4gdG8gYSBWTVMKKyAgIHN5c3RlbSwgdGhlIGNvbnNvbGUgZHJpdmVyIG9yIHRlcm1pbmFsIHdpbmRvdyAobm90IEtlcm1pdCkgaXMgc3VwcG9zZWQKKyAgIHRvIHJlcGx5IHRvIHRoZSAid2hhdCBhcmUgeW91PyIgcXVlcnkgKEVTQyBaKSBmcm9tIHRoZSBWQVguIElmIGl0CisgICBkb2Vzbid0LCBhbmQgeW91IGNhbid0IG1ha2UgaXQgZG8gc28sIHRoZW4geW91IGNhbiAoYSkgbGl2ZSB3aXRoIHRoZQorICAgInVua25vd24gdGVybWluYWwiIHByb2JsZW07IChiKSB0ZWxsIFZNUyB0byBTRVQgVEVSTUlOQUwvREVWSUNFPVZUMTAwOworICAgKGMpIHByb2dyYW0gYSBrZXkgdXNpbmcgU0VUIEtFWSB0byBzZW5kIHRoZSBhcHByb3ByaWF0ZSBzZXF1ZW5jZSBhbmQKKyAgIHRoZW4gcHVuY2ggdGhlIGtleSBhdCB0aGUgcmlnaHQgdGltZTsgb3IgKGQpIHVzZSB0aGUgVk1TTE9HSU4gbWFjcm8KKyAgIHRoYXQgaXMgZGVmaW5lZCBpbiBDS0VSTUlULklOSSB0byBkbyB0aGlzIGZvciB5b3UgYXV0b21hdGljYWxseS4KKworICAgU0VUIFNFU1NJT04tTE9HIHsgVEVYVCwgQklOQVJZIH0sIHdoaWNoIGlzIGVmZmVjdGl2ZSBpbiBVTklYIGFuZAorICAgQU9TL1ZTIGJ1dCBub3Qgb3RoZXIgQy1LZXJtaXQgdmVyc2lvbnMsIHJlbW92ZXMgQ1IsIERFTCwgTlVMLCBYT04sIGFuZAorICAgWE9GRiBjaGFyYWN0ZXJzIChVc2luZyBDLUtlcm1pdCBuZWdsZWN0cyB0byBtZW50aW9uIHRoYXQgWE9OIGFuZCBYT0ZGCisgICBhcmUgcmVtb3ZlZCkuIFRoZSBURVhULW1vZGUgc2V0dGluZyBpcyBpbmVmZmVjdGl2ZSBkdXJpbmcgU0NSSVBUCisgICBjb21tYW5kIGV4ZWN1dGlvbiwgYXMgd2VsbCBhcyBvbiBYLjI1IGNvbm5lY3Rpb25zLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDkuIEtFWSBNQVBQSU5HCisKKyAgIFsgWzY0XVRvcCBdIFsgWzY1XUNvbnRlbnRzIF0gWyBbNjZdTmV4dCBdIFsgWzY3XVByZXZpb3VzIF0KKworICAgRXhjZXB0IGluIHRoZSB0ZXJtaW5hbC1lbXVsYXRpbmcgdmVyc2lvbnMsIEMtS2VybWl0J3Mga2V5IG1hcHBpbmcKKyAgIGZhY2lsaXRpZXMgYXJlIGxpbWl0ZWQgdG8gbm9ybWFsICJBU0NJSSIga2V5cywgYW5kIGNhbm5vdCBiZSB1c2VkIHdpdGgKKyAgIGZ1bmN0aW9uIGtleXMsIGFycm93IGtleXMsIGFyY2FuZSBrZXkgY29tYmluYXRpb25zLCBldGMuIFNpbmNlCisgICBDLUtlcm1pdCBydW5zIG9uIHN1Y2ggYSB3aWRlIHZhcmlldHkgb2YgaGFyZHdhcmUgcGxhdGZvcm1zIChpbmNsdWRpbmcsCisgICBmb3IgZXhhbXBsZSwgbW9yZSB0aGFuIDM2MCBkaWZmZXJlbnQgVU5JWCBwbGF0Zm9ybXMpLCBpdCBpcyBub3QKKyAgIHBvc3NpYmxlIGZvciBDLUtlcm1pdCB0byBzdXBwb3J0IGV2ZXJ5IGNvbmNlaXZhYmxlIGtleWJvYXJkIHVuZGVyCisgICBldmVyeSByZWxlYXNlIG9mIGV2ZXJ5IFVOSVggKG9yIFZNUywgb3IgLi4uKSBwcm9kdWN0IG9uIGV2ZXJ5CisgICBkaWZmZXJlbnQga2luZCBvZiBjb21wdXRlciBwb3NzaWJseSB1bmRlciBhbGwgbWFubmVyIG9mIGRpZmZlcmVudAorICAgY29uc29sZSBkcml2ZXJzLCBldmVuIGlmIGl0IGhhZCB0aGUgbWVhbnMgdG8gZG8gc28uCisKKyAgIEluIHRlY2huaWNhbCB0ZXJtcywgQy1LZXJtaXQgdXNlcyB0aGUgcmVhZCgpIGZ1bmN0aW9uIHRvIHJlYWQKKyAgIGtleXN0cm9rZXMsIGFuZCByZWFkKCkgcmV0dXJucyBhIHNpbmdsZSBieXRlICh2YWx1ZSAwIHRocm91Z2ggMjU1KS4KKyAgIEMtS2VybWl0J3MgU0VUIEtFWSBmdW5jdGlvbiBhcHBsaWVzIHRvIHRoZXNlIHNpbmdsZS1ieXRlIGNvZGVzLgorICAgIkV4dGVuZGVkIGZ1bmN0aW9uIiBrZXlzLCBzdWNoIGFzIEYta2V5cywgYXJyb3cga2V5cywgZXRjLCB1c3VhbGx5CisgICByZXR1cm4gZWl0aGVyIGEgMi1ieXRlICJzY2FuIGNvZGUiIG9yIGVsc2UgYSBjaGFyYWN0ZXIgc3RyaW5nIChzdWNoIGFzCisgICBhbiBlc2NhcGUgc2VxdWVuY2UgbGlrZSAiPEVTQz4gTyBwIikuIEluIGJvdGggY2FzZXMsIEMtS2VybWl0IGhhcyBubworICAgd2F5IHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdWNoIG11bHRpYnl0ZSBrZXkgdmFsdWVzLCBhbmQgdGhlCisgICBjb3JyZXNwb25kaW5nIHNlcmllcyBvZiBzaW5nbGUtYnl0ZSBrZXkgdmFsdWVzLiBUaGlzIGNvdWxkIG9ubHkgYmUKKyAgIGRvbmUgYnkgYWNjZXNzaW5nIHRoZSBrZXlib2FyZCBhdCBhIG11Y2ggbG93ZXIgbGV2ZWwgaW4gYSBoaWdobHkKKyAgIHBsYXRmb3JtLWRlcGVuZGVudCBtYW5uZXIsIHByb2JhYmx5IHJlcXVpcmluZyB0ZW5zIG9mIHRob3VzYW5kcyBvZgorICAgbGluZXMgb2YgY29kZSB0byBzdXBwb3J0IGV2ZW4gYSBzYW1wbGluZyBvZiB0aGUgbW9zdCBwb3B1bGFyCisgICB3b3Jrc3RhdGlvbiAvIE9TIGNvbWJpbmF0aW9ucy4KKworICAgSG93ZXZlciwgbW9zdCB3b3Jrc3RhdGlvbiBjb25zb2xlIGRyaXZlcnMgKHRlcm1pbmFsIGVtdWxhdGlvbiB3aW5kb3dzLAorICAgZXRjKSBpbmNsdWRlIHRoZWlyIG93biBrZXktbWFwcGluZyBmYWNpbGl0eS4gRm9yIGV4YW1wbGUgaW4gQUlYLCB0aGUKKyAgIEFJWHRlcm0gcHJvZ3JhbSAoaW4gd2hvc2Ugd2luZG93IHlvdSB3b3VsZCBydW4gQy1LZXJtaXQpIGFsbG93cworICAgcmViaW5kaW5nIG9mIHRoZSBGMS1GMTIga2V5cyB0byBhcmJpdHJhcnkgc3RyaW5ncy4gVGhlIHNhbWUgaXMgdHJ1ZSBvZgorICAgWHRlcm0gYW5kIERFQ3Rlcm0gd2luZG93cywgZXRjLiBDb25zdWx0IHRoZSB0ZWNobmljYWwgZG9jdW1lbnRhdGlvbgorICAgZm9yIHlvdXIgd29ya3N0YXRpb24gb3IgZW11bGF0b3IuIFNlZSBzYW1wbGUgWHRlcm0gKFhtb2RtYXApIG1hcHBpbmdzCisgICBpbiB0aGUgWzY4XVVuaXggQy1LZXJtaXQgSGludHMgYW5kIFRpcHMgZG9jdW1lbnQuCisKKyAgIFRoZSBTRVQgS0VZIGNvbW1hbmQgKGV4Y2VwdCBpbiBLZXJtaXQgOTUpIGRvZXMgbm90IGFsbG93IGEga2V5CisgICBkZWZpbml0aW9uIHRvIGJlIChvciBjb250YWluKSB0aGUgTlVMIChcMCkgY2hhcmFjdGVyLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEwLiBGSUxFIFRSQU5TRkVSCisKKyAgIFsgWzY5XVRvcCBdIFsgWzcwXUNvbnRlbnRzIF0gWyBbNzFdTmV4dCBdIFsgWzcyXVByZXZpb3VzIF0KKworICAgQy1LZXJtaXQgNy4wIGlzIHRoZSBmaXJzdCByZWxlYXNlIG9mIEMtS2VybWl0IHRvIHVzZSBmYXN0IChyYXRoZXIgdGhhbgorICAgcm9idXN0IGFuZCB0aGVyZWZvcmUgc2xvdykgcHJvdG9jb2wgZGVmYXVsdHM6IGxvbmcgcGFja2V0cywgc2xpZGluZworICAgd2luZG93cywgY29udHJvbC1jaGFyYWN0ZXIgdW5wcmVmaXhpbmcsIGFuZCBzdHJlYW1pbmcgd2hlcmUgcG9zc2libGUuCisgICBUaGlzIG1ha2VzIG1vc3QgdHJhbnNmZXJzIChwYXJ0bmVyIHdpbGxpbmcpIGRyYW1hdGljYWxseSBmYXN0ZXIgIm91dAorICAgb2YgdGhlIGJveCIgYnV0IG1pZ2h0IGJyZWFrIHNvbWUgY29tYmluYXRpb25zIHRoYXQgd29ya2VkIGJlZm9yZS4gSWYKKyAgIHRyYW5zZmVycyB3aXRoIEMtS2VybWl0IDcuMCBvciBsYXRlciBmYWlsIHdoZXJlIHRyYW5zZmVycyB3b3JrZWQgd2l0aAorICAgZWFybGllciBDLUtlcm1pdCB2ZXJzaW9ucywgdHJ5IHRoZSBmb2xsb3dpbmcgKG9uZSBhdCBhIHRpbWUsIGluIHRoaXMKKyAgIG9yZGVyKToKKworICAgIDEuIFNFVCBQUkVGSVhJTkcgQUxMOiBEaXNhYmxlcyBjb250cm9sLWNoYXJhY3RlciB1bnByZWZpeGluZy4KKyAgICAyLiBTRVQgU1RSRUFNSU5HIE9GRjogRGlzYWJsZXMgc3RyZWFtaW5nLgorICAgIDMuIENBVVRJT1VTOiBTZWxlY3RzIG1lZGl1bSBidXQgY2F1dGlvdXMgcHJvdG9jb2wgc2V0dGluZ3MuCisgICAgNC4gUk9CVVNUOiB0aGlzIGNvbW1hbmQgcmV2ZXJ0cyB0byB0aGUgbW9zdCBjb25zZXJ2YXRpdmUgcHJvdG9jb2wKKyAgICAgICBzZXR0aW5ncy4KKworICAgRXhlY3V0aW9uIG9mIG11bHRpcGxlIGZpbGUgdHJhbnNmZXJzIGJ5IEMtS2VybWl0IGZyb20gYSBjb21tYW5kIGZpbGUKKyAgIHdoZW4gaW4gcmVtb3RlIG1vZGUgbWlnaHQgZXhoaWJpdCBsb25nIGRlbGF5cyBiZXR3ZWVuIGVhY2ggdHJhbnNmZXIuCisgICBUbyBhdm9pZCB0aGlzLCBqdXN0IGluY2x1ZGUgdGhlIGNvbW1hbmQgIlNFVCBERUxBWSAwIiBpbiB5b3VyIGNvbW1hbmQKKyAgIGZpbGUgYmVmb3JlIGFueSBvZiB0aGUgZmlsZS10cmFuc2ZlciBjb21tYW5kcy4KKworICAgRmlsZSB0cmFuc2ZlciBmYWlsdXJlcyBjYW4gb2NjdXIgZm9yIGFsbCBzb3J0cyBvZiByZWFzb25zLCBtb3N0IG9mCisgICB0aGVtIGxpc3RlZCBpbiBDaGFwdGVyIDEwIG9mIFs3M11Vc2luZyBDLUtlcm1pdC4gVGhlIGZvbGxvd2luZworICAgc2VjdGlvbnMgdG91Y2ggb24gc29tZSB0aGF0IGFyZW4ndC4KKworICAgVGhlIFs3NF1DLUtlcm1pdCA3LjAgUmVsZWFzZSBOb3RlcyBkb2N1bWVudCBTRU5EIC9DT01NQU5EIGFzIHRha2luZyBhbgorICAgYXJndW1lbnQsIGJ1dCBpdCBkb2Vzbid0LiBJbnN0ZWFkIG9mIFNFTkQgL0NPTU1BTkQ6e3NvbWUgY29tbWFuZH0sCisgICB1c2U6CisKK1NFTkQgL0NPTU1BTkQgWyBvdGhlciBzd2l0Y2hlcyBzdWNoIGFzIC9BUy1OQU1FOiBdIGNvbW1hbmQgWyBhcmd1bWVudHMuLi4gXQorCisgIDEwLjEuIExhcHRvcHMKKworICAgV2F0Y2ggb3V0IGZvciBsYXB0b3BzIGFuZCB0aGVpciBhc3NvcnRlZCBwb3dlci1zYXZlciBmZWF0dXJlczsgZm9yCisgICBleGFtcGxlLCBhIGJ1aWx0LWluIG1vZGVtJ3MgImF1dG8gdGltZW91dCBkZWxheSIgaGFuZ2luZyB1cCB0aGUKKyAgIGNvbm5lY3Rpb24gaW4gdGhlIG1pZGRsZSBvZiBhIGZpbGUgdHJhbnNmZXIuIE1vc3QgbW9kZW1zLCBldmVuIGlmIHRoZXkKKyAgIGhhdmUgdGhpcyBmZWF0dXJlLCBkbyBub3QgaGF2ZSBpdCBlbmFibGVkIGJ5IGRlZmF1bHQuIEJ1dCBpZiB5b3UKKyAgIGV4cGVyaWVuY2Ugb3RoZXJ3aXNlIGluZXhwbGljYWJsZSBkaXNjb25uZWN0aW9ucyBpbiB0aGUgbWlkc3Qgb2YgeW91cgorICAgS2VybWl0IHNlc3Npb25zLCBjaGVjayB0aGUgbW9kZW0gbWFudWFsIGZvciBzdWNoIHRoaW5ncyBhcyAiaWRsZQorICAgdGltZW91dCIsICJhdXRvIHRpbWVvdXQiLCBldGMsIGFuZCBhZGQgdGhlIGNvbW1hbmQgdG8gZGlzYWJsZSB0aGlzCisgICBmZWF0dXJlIHRvIEtlcm1pdCdzIGluaXQgc3RyaW5nIGZvciB0aGlzIG1vZGVtLgorCisgIDEwLjIuIE5GUworCisgICBJZiB1cGxvYWRpbmcgYSBsYXJnZSBmaWxlIHRvIGFuIE5GUy1tb3VudGVkIGRpc2sgZmFpbHMgKG9yIGlzCisgICBwYWluZnVsbHkgc2xvdyksIHRyeSB1cGxvYWRpbmcgaXQgdG8gYSBsb2NhbCBkaXNrIChlLmcuIC90bXAgb24gVW5peCkKKyAgIGFuZCB0aGVuIGNvcHlpbmcgdG8gdGhlIE5GUyBkaXNrIGxhdGVyLgorCisgIDEwLjMuIE1vZGVtcworCisgICBJZiB5b3UgYXJlIGRpYWxpbmcgb3V0IGFuZCBmaW5kIHRoYXQgZG93bmxvYWRzIHdvcmsgYnV0IHVwbG9hZHMgZG9uJ3QsCisgICB0cnkgYWdhaW4gd2l0aCBhIGxvd2VyIHNlcmlhbC1wb3J0IHNwZWVkLiBDYXNlIGluIHBvaW50OiBkaWFsaW5nIG91dAorICAgb24gYSBjZXJ0YWluIFBDIGZyb20gTGludXggYXQgMTE1MjAwIGJwcyB1c2luZyBhIFVTUiBDb3VyaWVyIDU2SworICAgIlYuRXZlcnl0aGluZyIgZXh0ZXJuYWwgbW9kZW0gYW5kIFJUUy9DVFMgZmxvdyBjb250cm9sLiBEb3dubG9hZHMKKyAgIHdvcmtlZCBmbGF3bGVzc2x5LCB1cGxvYWRzIHN0b3BwZWQgZGVhZCBhZnRlciB0aGUgZmlyc3QgZmV3IHBhY2tldHMKKyAgIHdlcmUgc2VudC4gVGhlIG1vZGVtIGxpZ2h0cyBzaG93ZWQgY29uc3RhbnQgcmV0cmFpbmluZyAoQVJRIGxpZ2h0CisgICBibGlua3Mgc2xvd2x5KSwgYW5kIHRoZSBDVFMgbGlnaHQgd2FzIG9mZiA5NSUgb2YgdGhlIHRpbWUsIGFsbG93aW5nCisgICBub3RoaW5nIHRvIGdldCB0aHJvdWdoLiBSZWR1Y2luZyB0aGUgc2VyaWFsIHBvcnQgc3BlZWQgdG8gNTc2MDAgYnBzCisgICBtYWRlIHRoZSBwcm9ibGVtcyBnbyBhd2F5LiBFdmlkZW50bHkgdGhlIFBDIGluIHF1ZXN0aW9uIGhhcyBhIHZlcnkKKyAgIGZhc3Qgc2VyaWFsIHBvcnQsIHNpbmNlIGRpYWxpbmcgdGhlIHNhbWUgbW9kZW0gd2l0aCBhIGRpZmZlcmVudCBQQyBhdAorICAgMTE1MjAwIGJwcyB3b3JrcyB3aXRob3V0IGluY2lkZW50LgorCisgIDEwLjQuIFRDUC9JUCBDb25uZWN0aW9ucworCisgICBJZiB5b3UgaGF2ZSB0cm91YmxlIHRyYW5zZmVycmluZyBmaWxlcyBvdmVyIGEgVENQL0lQIGNvbm5lY3Rpb24sIHRlbGwKKyAgIEtlcm1pdCB0byBTRVQgUEFSSVRZIFNQQUNFIGFuZCB0cnkgYWdhaW4uIElmIHRoYXQgZG9lc24ndCB3b3JrLCBhbHNvCisgICB0cnkgYSBzaG9ydGVyIHBhY2tldCBsZW5ndGggb3Igc21hbGxlciB3aW5kb3cgc2l6ZSAodG8gY29tcGVuc2F0ZSBmb3IKKyAgIGNlcnRhaW4gd2VsbC1rbm93biBicm9rZW4gVGVsbmV0IHNlcnZlcnMpLCBhbmQvb3IgU0VUIFJFTElBQkxFIE9GRi4KKworICAxMC41LiBNdWx0aWhvcCBDb25uZWN0aW9ucworCisgICBJZiB5b3UgaGF2ZSBhIG11bHRpaG9wIGNvbm5lY3Rpb24sIHdpdGggdGhlIGludGVyaW9yIG5vZGVzIGluIENPTk5FQ1QKKyAgIG1vZGUgKEtlcm1pdCwgVGVsbmV0LCBSbG9naW4sIG9yIGFueSBvdGhlciksIHlvdSBjYW4gZXhwZWN0IChhKSBmaWxlCisgICB0cmFuc2ZlciB0byBiZSBzbG93ZXIsIGFuZCAoYikgdGhlIGNvbm5lY3Rpb24gdG8gYmUgbGVzcyB0cmFuc3BhcmVudAorICAgKHRvIGNvbnRyb2wgY2hhcmFjdGVycywgcGVyaGFwcyB0byB0aGUgOHRoIGJpdCkgdGhhbiBhIG1vcmUgZGlyZWN0CisgICBjb25uZWN0aW9uLiBDLUtlcm1pdCA3LjAgYW5kIGxhdGVyIGhhdmUgYSAiLTAiIChkYXNoLXplcm8pCisgICBjb21tYW5kLWxpbmUgb3B0aW9uIHRvIG1ha2UgaXQgMTAwJSB0cmFuc3BhcmVudCBpbiBjYXNlcyB3aGVyZSBpdCBpcworICAgdG8gYmUgdXNlZCBpbiB0aGUgbWlkZGxlLgorCisgIDEwLjYuIFJlY292ZXJ5CisKKyAgIFRoZSByZWNvdmVyeSBmZWF0dXJlIChSRVNFTkQgY29tbWFuZCkgdGhhdCB3YXMgYWRkZWQgaW4gdmVyc2lvbgorICAgNUEoMTkwKSB3b3JrcyBvbmx5IGZvciBiaW5hcnktbW9kZSB0cmFuc2ZlcnMuIEluIG9yZGVyIGZvciB0aGlzCisgICBmZWF0dXJlIHRvIGJlIHVzZWZ1bCBhdCBhbGwsIHRoZSBkZWZhdWx0IGZvciBTRVQgRklMRSBJTkNPTVBMRVRFIHdhcworICAgY2hhbmdlZCBmcm9tIERJU0NBUkQgdG8gS0VFUC4gT3RoZXJ3aXNlIGFuIGludGVycnVwdGVkIHRyYW5zZmVyIHdvdWxkCisgICBsZWF2ZSBubyBwYXJ0aWFsIGZpbGUgYmVoaW5kIHVubGVzcyB5b3UgaGFkIHJlbWVtYmVyZWQgdG8gY2hhbmdlIHRoZQorICAgZGVmYXVsdC4gQnV0IG5vdyB5b3UgaGF2ZSB0byBwYXkgY2xvc2VyIGF0dGVudGlvbiB0byBLZXJtaXQncyBtZXNzYWdlcworICAgdG8ga25vdyB3aGV0aGVyIGEgdHJhbnNmZXIgc3VjY2VlZGVkIG9yIGZhaWxlZCAtLSBwcmV2aW91c2x5LCBpZiBpdAorICAgZmFpbGVkLCB0aGUgZmlsZSB3b3VsZCBub3Qgc2hvdyB1cCBvbiB0aGUgcmVjZWl2aW5nIGVuZCBhdCBhbGw7IGluCisgICA1QSgxOTApIGFuZCBsYXRlciwgeW91J2xsIGdldCBhIHBhcnRpYWwgZmlsZSB3aGljaCBjb3VsZCBlYXNpbHkgYmUKKyAgIG1pc3Rha2VuIGZvciB0aGUgY29tcGxldGUgZmlsZSB1bmxlc3MgeW91IGNoYW5nZSB0aGUgZGVmYXVsdCBiYWNrIHRvCisgICBESVNDQVJEIG9yIHJlYWQgdGhlIHNjcmVlbiBtZXNzYWdlcywgb3Iga2VlcCBhIHRyYW5zYWN0aW9uIGxvZy4KKworICAxMC43LiBGaWxlbmFtZSBDb2xsaXNpb25zCisKKyAgIFNFVCBGSUxFIENPTExJU0lPTiBCQUNLVVAgaXMgdGhlIGRlZmF1bHQuIFRoaXMgbWVhbnM6CisKKyAgICAgKiBJZiB5b3Ugc2VuZCB0aGUgc2FtZSBmaWxlIGxvdHMgb2YgdGltZXMsIHRoZXJlIHdpbGwgYmUgbWFueSBiYWNrdXAKKyAgICAgICBmaWxlcy4gVGhlcmUgaXMgbm8gYXV0b21hdGljIG1lY2hhbmlzbSB3aXRoaW4gS2VybWl0IHRvIGRlbGV0ZQorICAgICAgIHRoZW0sIG5vIG5vdGlvbiBvZiBhICJ2ZXJzaW9uIHJldGVudGlvbiBjb3VudCIsIGV0YywgYnV0IHlvdSBjYW4KKyAgICAgICB1c2UgdGhlIFBVUkdFIGNvbW1hbmQgdG8gY2xlYW4gdGhlbSB1cC4KKyAgICAgKiBJZiBhIGZpbGUgYXJyaXZlcyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgZGlyZWN0b3J5LCB0aGUgZmlsZQorICAgICAgIHRyYW5zZmVyIGZhaWxzIGJlY2F1c2UgS2VybWl0IHdpbGwgbm90IHJlbmFtZSBhIGRpcmVjdG9yeS4gU2VuZAorICAgICAgIHRoZSBmaWxlIHdpdGggYW5vdGhlciBuYW1lLCBvciB1c2UgU0VUIEZJTEUgQ09MTElTSU9OIFJFTkFNRS4KKyAgICAgKiBJZiB0aGUgZGlyZWN0b3J5IGxhY2tzIHdyaXRlIHBlcm1pc3Npb24sIHRoZSBmaWxlIHRyYW5zZmVyIGZhaWxzCisgICAgICAgZXZlbiBpZiB5b3UgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhlIGZpbGUgdGhhdCBpcyBiZWluZyBiYWNrZWQgdXA7CisgICAgICAgaW4gdGhhdCBjYXNlLCBzd2l0Y2ggdG8gU0VUIEZJTEUgQ09MTElTSU9OIE9WRVJXUklURSBvciBBUFBFTkQsIG9yCisgICAgICAgc2VuZCB0byBhIGRpZmZlcmVudCBkaXJlY3RvcnkuCisKKyAgIFNFVCBGSUxFIENPTExJU0lPTiBVUERBVEUgZGVwZW5kcyBvbiB0aGUgZGF0ZS90aW1lIHN0YW1wIGluIHRoZQorICAgYXR0cmlidXRlIHBhY2tldC4gSG93ZXZlciwgdGhpcyBpcyByZWNvcmRlZCBpbiBsb2NhbCB0aW1lLCBub3QKKyAgIFVuaXZlcnNhbCBUaW1lIChHTVQpLCBhbmQgdGhlcmUgaXMgbm8gaW5kaWNhdGlvbiBvZiB0aW1lIHpvbmUuIFRoZQorICAgdGltZSBpcyBleHByZXNzZWQgdG8gdGhlIHByZWNpc2lvbiBvZiAxIHNlY29uZCwgYnV0IHNvbWUgZmlsZSBzeXN0ZW1zCisgICBkbyBub3QgcmVjb3JkIHdpdGggdGhpcyBwcmVjaXNpb24gLS0gZm9yIGV4YW1wbGUsIE1TLURPUyByZWNvcmRzIHRoZQorICAgZmlsZSBkYXRlL3RpbWUgb25seSB0byB0aGUgbmVhcmVzdCAyIHNlY29uZHMuIFRoaXMgbWlnaHQgY2F1c2UgdXBkYXRlCisgICBvcGVyYXRpb25zIHRvIHNlbmQgbW9yZSBmaWxlcyB0aGFuIG5lY2Vzc2FyeS4KKworICAgKFRoaXMgcGFyYWdyYXBoIGRvZXMgTk9UIGFwcGx5IHRvIFVOSVgsIHdoZXJlLCBhcyBvZiBDLUtlcm1pdCA3LjAsCisgICBDLUtlcm1pdCBwaXBlcyBpbmNvbWluZyBtYWlsIGFuZCBwcmludCBtYXRlcmlhbCBkaXJlY3RseSB0aGUgbWFpbCBvcgorICAgcHJpbnQgcHJvZ3JhbSk6IFdoZW4gQy1LZXJtaXQgaXMgcmVjZWl2aW5nIGZpbGVzIGZyb20gYW5vdGhlciBLZXJtaXQKKyAgIHByb2dyYW0gdGhhdCBoYXMgYmVlbiBnaXZlbiB0aGUgTUFJTCBvciBSRU1PVEUgUFJJTlQgY29tbWFuZCwgQy1LZXJtaXQKKyAgIGZvbGxvd3MgdGhlIGN1cnJlbnQgZmlsZW5hbWUgY29sbGlzaW9uIGFjdGlvbi4gVGhpcyBjYW4gYmUKKyAgIGRpc2NvbmNlcnRpbmcgaWYgdGhlIGFjdGlvbiB3YXMgKGZvciBleGFtcGxlKSBCQUNLVVAsIGJlY2F1c2UgdGhlCisgICBleGlzdGluZyBmaWxlIHdpbGwgYmUgcmVuYW1lZCwgYW5kIHRoZSBuZXcgZmlsZSB3aWxsIGJlIG1haWxlZCAob3IKKyAgIHByaW50ZWQpIGFuZCB0aGVuIGRlbGV0ZWQuIEtlcm1pdCBjYW5ub3QgdGVtcG9yYXJpbHkgY2hhbmdlIHRvIFJFTkFNRQorICAgYmVjYXVzZSB0aGUgZmlsZSBjb2xsaXNpb24gYWN0aW9uIG9jY3VycyB3aGVuIHRoZSBmaWxlbmFtZSBwYWNrZXQgaXMKKyAgIHJlY2VpdmVkLCBhbmQgdGhlIFBSSU5UIG9yIE1BSUwgZGlzcG9zaXRpb24gb25seSBjb21lcyBsYXRlciwgaW4gdGhlCisgICBBdHRyaWJ1dGUgcGFja2V0LgorCisgICBXYXRjaCBvdXQgZm9yIFNFVCBGSUxFIENPTExJU0lPTiBSRU5BTUUsIGVzcGVjaWFsbHkgd2hlbiB1c2VkIGluCisgICBjb25qdW5jdGlvbiB3aXRoIHJlY292ZXJ5LiBSZWNhbGwgdGhhdCB0aGlzIG9wdGlvbiAod2hpY2ggaXMgTk9UIHRoZQorICAgZGVmYXVsdCkgcmVuYW1lcyB0aGUgaW5jb21pbmcgZmlsZSBpZiBhIGZpbGUgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUKKyAgIHNhbWUgbmFtZSAodGhlIGRlZmF1bHQgaXMgdG8gcmVuYW1lIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nIGZpbGUsIGFuZAorICAgc3RvcmUgdGhlIGluY29taW5nIGZpbGUgd2l0aCBpdHMgb3duIG5hbWUpLiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZAorICAgdGhhdCB5b3UgZG8gbm90IHVzZSBTRVQgRklMRSBDT0xMSVNJT04gUkVOQU1FIGlmIHlvdSBldmVyIGludGVuZCB0bworICAgdXNlIHRoZSByZWNvdmVyeSBmZWF0dXJlOgorCisgICAgICogV2hlbiB0aGUgZmlsZSBpcyBmaXJzdCByZWNlaXZlZCBieSBDLUtlcm1pdCwgaXRzIG5hbWUgaXMgY2hhbmdlZAorICAgICAgIGlmIGFub3RoZXIgZmlsZSBhbHJlYWR5IGhhcyB0aGUgc2FtZSBuYW1lLiBXaGVuIHlvdSBSRVNFTkQgdGhlCisgICAgICAgc2FtZSBmaWxlIGFmdGVyIGEgZmFpbHVyZSwgQy1LZXJtaXQgd2lsbCBwcm9iYWJseSB0cnkgdG8gYXBwZW5kCisgICAgICAgdGhlIHJlLXNlbnQgcG9ydGlvbiB0byB0aGUgd3JvbmcgZmlsZS4KKyAgICAgKiBBc3N1bWluZyB0aGF0IHlvdSBnZXQgUkVTRU5EIHRvIHdvcmsgd2l0aCBGSUxFIENPTExJU0lPTiBSRU5BTUUsCisgICAgICAgQy1LZXJtaXQsIHdoZW4gcmVjZWl2aW5nIHRoZSByZW1haW5kZXIgb2YgdGhlIGZpbGUgZHVyaW5nIGEgUkVTRU5ECisgICAgICAgb3BlcmF0aW9uLCB3aWxsIHJlcG9ydCBiYWNrIHRoZSB3cm9uZyBuYW1lLiBOb3RoaW5nIGNhbiBiZSBkb25lCisgICAgICAgYWJvdXQgdGhpcyBiZWNhdXNlIHRoZSBuYW1lIGlzIHJlcG9ydGVkIGJhY2sgYmVmb3JlIHRoZSByZWNlaXZpbmcKKyAgICAgICBLZXJtaXQgcHJvZ3JhbSBmaW5kcyBvdXQgdGhhdCBpdCBpcyBhIHJlY292ZXJ5IG9wZXJhdGlvbi4KKworICAgQWxzbyB3YXRjaCBvdXQgZm9yIERJU0FCTEUgREVMRVRFLCBzaW5jZSB0aGlzIGltcGxpY2l0bHkgc2V0cyBGSUxFCisgICBDT0xMSVNJT04gdG8gUkVOQU1FLiBBbmQgbm90ZSB0aHQgREVMRVRFIGlzIERJU0FCTEVkIGF1dG9tYXRpY2FsbHkgYW55CisgICB0aW1lIHlvdSBLZXJtaXQgaXMgaW4gbG9jYWwgbW9kZSAoaS5lLiBpdCBtYWtlcyBhIGNvbm5lY3Rpb24pLiBBbHNvCisgICBub3RlIHRoYXQgZm9yIHB1cnBvc2VzIG9mIERJU0FCTEUgYW5kIEVOQUJMRSwgInNldCBob3N0ICoiIGNvbm5lY3Rpb25zCisgICBkbyBub3QgY291bnQgYXMgbG9jYWwgbW9kZSBldmVuIHRob3VnaCwgc3RyaWN0bHkgc3BlYWtpbmcsIHRoZXkgYXJlLgorCisgIDEwLjguIERPUyBQYXRobmFtZXMKKworICAgV2hlbiByZWZlcnJpbmcgdG8gZm9yZWlnbiBNUy1ET1MsIFdpbmRvd3MsIEF0YXJpIFNULCBPUy8yLCBvciBvdGhlcgorICAgZmlsZSBzcGVjaWZpY2F0aW9ucyB0aGF0IGNvbnRhaW4gYmFja3NsYXNoIGNoYXJhY3RlcnMgaW4gYSBDLUtlcm1pdAorICAgY29tbWFuZCwgeW91IG1pZ2h0IGhhdmUgdG8gZG91YmxlIGVhY2ggYmFja3NsYXNoLCBmb3IgZXhhbXBsZToKKworICBDLUtlcm1pdD5nZXQgYzpcXGRpcmVjdG9yeVxcZm9vLnR4dAorCisgICBUaGlzIGlzIGJlY2F1c2UgYmFja3NsYXNoIGlzIHVzZWQgaW4gQy1LZXJtaXQgY29tbWFuZHMgZm9yIGludHJvZHVjaW5nCisgICBzcGVjaWFsIGNoYXJhY3RlciBjb2RlcywgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGV0Yy4KKworICAxMC45LiBDYW5jZWxsYXRpb24KKworICAgSWYgYXR0ZW1wdGluZyB0byBjYW5jZWwgbG9jYWwtbW9kZSBmaWxlIHJlY2VwdGlvbiBhdCBhIHZlcnkgZWFybHkKKyAgIHN0YWdlIChpLmUuIGJlZm9yZSBkYXRhIHBhY2tldHMgYXJlIGV4Y2hhbmdlZCkgd2l0aCBYIG9yIFogZG9lcyBub3QKKyAgIHdvcmssIHVzZSBFIG9yIEN0cmwtQyBpbnN0ZWFkLCBvciB3YWl0IHVudGlsIHRoZSBmaXJzdCBkYXRhIHBhY2tldHMKKyAgIGFyZSBzZW50LgorCisgICBJZiB5b3UgY2FuY2VsIGEgdHJhbnNmZXIgdGhhdCBpcyB1bmRlcndheSB1c2luZyBYIG9yIFosIGFuZCBhIGxvdCBvZgorICAgd2luZG93IHNsb3RzIGFyZSBpbiB1c2UsIGl0IG1pZ2h0IHRha2UgYSB3aGlsZSBmb3IgdGhlIGNhbmNlbGxhdGlvbiB0bworICAgdGFrZSBlZmZlY3QsIGVzcGVjaWFsbHkgaWYgeW91IGRvIHRoaXMgb24gdGhlIHJlY2VpdmluZyBlbmQ7IHRoYXQncworICAgYmVjYXVzZSBhIGxvdCBvZiBwYWNrZXRzIG1pZ2h0IGFscmVhZHkgYmUgb24gdGhlaXIgd2F5IHRvIHlvdS4gSW4gdGhhdAorICAgY2FzZSwganVzdCBiZSBwYXRpZW50IGFuZCBsZXQgS2VybWl0ICJkcmFpbiIgdGhlbS4KKworICAgSWYgQy1LZXJtaXQgaXMgc2VuZGluZyBhIGZpbGUsIHJlbW90ZS1tb2RlIHBhY2tldC1tb2RlIGJyZWFrb3V0ICh0aHJlZQorICAgY29uc2VjdXRpdmUgQ3RybC1DJ3MgYnkgZGVmYXVsdCkgaXMgbm90IGVmZmVjdGl2ZSB1bnRpbCBhZnRlciBDLUtlcm1pdAorICAgc2VuZHMgaXRzIGZpcnN0IHBhY2tldC4gSWYgQy1LZXJtaXQgaXMgcmVjZWl2aW5nIGEgZmlsZSBvciBpcyBpbgorICAgc2VydmVyIG1vZGUsIGl0IGlzIGVmZmVjdGl2ZSByaWdodCBhd2F5LiBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSBTRVQKKyAgIERFTEFZIHZhbHVlIGRldGVybWluZXMgdGhlIGVhcmxpZXN0IHRpbWUgYXQgd2hpY2ggeW91IGNhbiBicmVhayBvdXQgb2YKKyAgIHBhY2tldCBtb2RlLgorCisgIDEwLjEwLiBQYXJ0bmVyIFBlY3VsaWFyaXRpZXMKKworICAgV2hlbiBvbmUgb3IgYm90aCBwYXJ0bmVycyBpcyBvbiBhbiBTQ08gb3BlcmF0aW5nIHN5c3RlbSBzdWNoIGFzIE9TUjUsCisgICB5b3UgbWlnaHQgaXNzdWUgdGhlIGNvbW1hbmQ6CisKK21hcGNoYW4gLW4KKworICAgdG8gZGlzYWJsZSBjaGFyYWN0ZXItc2V0IGNvbnZlcnNpb24gYnkgdGhlIHRlcm1pbmFsIGRyaXZlci4gU2ltaWxhcmx5CisgICBmb3IgQUlYOgorCitzZXRtYXBzIC10IE5PTUFQCisKKyAgIFdoZW4gdXNpbmcgQy1LZXJtaXQgdG8gdHJhbnNmZXIgZmlsZXMgd2l0aCB0aGUgSFA0OFNYIGNhbGN1bGF0b3IsIHlvdQorICAgbXVzdCBTRVQgRkxPVyBOT05FLiBUaGUgSFA0OFNYIGRvZXMgbm90IHN1cHBvcnQgZmxvdyBjb250cm9sLCBhbmQKKyAgIGV2aWRlbnRseSBhbHNvIGJlY29tZXMgY29uZnVzZWQgaWYgeW91IGF0dGVtcHQgdG8gdXNlIGl0LiBZb3UgbWlnaHQKKyAgIGFsc28gbmVlZCB0byB1c2UgU0VUIFNFTkQgUEFVU0UgMTAwIChvciBvdGhlciBudW1iZXIpLiBGb3IgZ3JlYXRlcgorICAgZGV0YWlsIGFib3V0IHRyYW5zZmVycmluZyBmaWxlcyB0aGUgdGhlIEhQLTQ4LCBzZWU6CisKKyAgWzc1XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ocDQ4Lmh0bWwKKworICAgU29tZSBjb21tdW5pY2F0aW9uIHByb2dyYW1zIGhhdmUgZXJyb3JzIGluIHRoZWlyIGltcGxlbWVudGF0aW9uIG9mCisgICBLZXJtaXQgYXR0cmlidXRlIHBhY2tldHMuIElmIHlvdSBnZXQgYW4gZXJyb3IgbWVzc2FnZSBmcm9tIHlvdXIKKyAgIGNvbW11bmljYXRpb24gcHJvZ3JhbSBsaWtlICJBdHRyaWJ1dGUgZXJyb3IiLCB0ZWxsIEMtS2VybWl0IHRvIFNFVAorICAgQVRUUklCVVRFUyBPRkYuIEJldHRlciB5ZXQsIHN3aXRjaCB0byBhIHJlYWwgS2VybWl0IHByb2dyYW0uCisKKyAgIFNvbWUgY29tbXVuaWNhdGlvbiBzb2Z0d2FyZSBjbGFpbXMgdG8gaW1wbGVtZW50IEtlcm1pdCBzbGlkaW5nCisgICB3aW5kb3dzLCBidXQgZG9lcyBzbyBpbmNvcnJlY3RseS4gSWYgc2xpZGluZyB3aW5kb3cgdHJhbnNmZXJzIGZhaWwsCisgICBzZXQgQy1LZXJtaXQncyB3aW5kb3cgc2l6ZSB0byB0aGUgc21hbGxlc3Qgb25lIHRoYXQgd29ya3MsIGZvcgorICAgZXhhbXBsZSwgU0VUIFdJTkRPVyAxLgorCisgICBGb3IgbG90cyBtb3JlIGRldGFpbCBhYm91dCBob3cgdG8gY29wZSB3aXRoIGRlZmVjdGl2ZSBLZXJtaXQgcGFydG5lcnMsCisgICBzZWU6CisKKyAgICAgKiBbNzZdQ29waW5nIHdpdGggRmF1bHR5IEtlcm1pdCBJbXBsZW1lbnRhdGlvbnMgKEMtS2VybWl0IDcuMCBhbmQKKyAgICAgICBsYXRlcikuCisgICAgICogWzc3XUNvcGluZyB3aXRoIEJyb2tlbiBLZXJtaXQgUGFydG5lcnMgKEMtS2VybWl0IDguMCBhbmQgbGF0ZXIpLgorCisgICBUaGUgVU5JWCB2ZXJzaW9uIG9mIEMtS2VybWl0IGRpc2NhcmRzIGNhcnJpYWdlIHJldHVybnMgd2hlbiByZWNlaXZpbmcKKyAgIGZpbGVzIGluIHRleHQgbW9kZS4gVGh1cywgImJhcmUiIGNhcnJpYWdlIHJldHVybnMgKHNvbWV0aW1lcyB1c2VkIHRvCisgICBhY2hpZXZlIG92ZXJzdHJpa2luZykgYXJlIGxvc3QuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMTEuIFNDUklQVCBQUk9HUkFNTUlORworCisgICBbIFs3OF1Ub3AgXSBbIFs3OV1Db250ZW50cyBdIFsgWzgwXVByZXZpb3VzIF0KKworICAxMS4xLiBDb21tZW50cyBWZXJzdXMgdGhlIFNDUklQVCBDb21tYW5kCisKKyAgIFJlbWVtYmVyIHRoYXQgIjsiIGFuZCAiIyIgaW50cm9kdWNlIGNvbW1lbnRzIHdoZW4gKGEpIHRoZXkgYXJlIHRoZQorICAgZmlyc3QgY2hhcmFjdGVyIG9uIHRoZSBsaW5lLCBvciAoYikgdGhleSBhcmUgcHJlY2VkZWQgYnkgYXQgbGVhc3Qgb25lCisgICBibGFuayBvciB0YWIgd2l0aGluIGEgbGluZS4gVGh1cyBjb25zdHJ1Y3Rpb25zIGxpa2U6CisKKyAgSU5QVVQgNSA7CisgIFNDUklQVCB+MCAjLS0jLS0jCisKKyAgIG11c3QgYmUgY29kZWQgdXNpbmcgYmFja3NsYXNoIG5vdGF0aW9uIHRvIGtlZXAgdGhlIGRhdGEgZnJvbSBiZWluZworICAgaWdub3JlZDoKKworICBJTlBVVCA1IFw1OSAgICAgICAgICAgICAgICAgICA7IDU5IGlzIHRoZSBkZWNpbWFsIEFTQ0lJIGNvZGUgZm9yICI7IgorICBTQ1JJUFQgfjAgXDM1LS0jLS0jICAgICAgICAgICA7IDQzIGlzIHRoZSBkZWNpbWFsIEFTQ0lJIGNvZGUgZm9yICIjIgorCisgICBvciwgbW9yZSBzaW1wbHk6CisKKyAgSU5QVVQgNSBcOyAgICAgICAgICAgICAgICAgICAgOyBKdXN0IHF1b3RlIHRoZSBzZW1pY29sb24KKyAgU0NSSVBUIH4wIFwjLS0jLS0jICAgICAgICAgICAgOyBKdXN0IHF1b3RlIHRoZSAiIyIKKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxMS4yLiBBbHBoYWJldGljIENhc2UgYW5kIHRoZSBJTlBVVCBDb21tYW5kCisKKyAgIElOUFVUIGFuZCBNSU5QVVQgY2FzZWxlc3Mgc3RyaW5nIGNvbXBhcmlzb25zIGRvIG5vdCB3b3JrIGZvciBub24tQVNDSUkKKyAgIChpbnRlcm5hdGlvbmFsKSBjaGFyYWN0ZXJzLiBXb3JrYXJvdW5kOiBTRVQgSU5QVVQgQ0FTRSBPQlNFUlZFLiBFdmVuCisgICB0aGVuLCB0aGUgImxleGljYWxseSBsZXNzIHRoYW4iIGFuZCAibGV4aWNhbGx5IGdyZWF0ZXIgdGhhbiIKKyAgIG9wZXJhdGlvbnMgKElGIExMVCwgSUYgTEdUKSBwcm9iYWJseSB3b24ndCB3b3JrIGFzIGV4cGVjdGVkLiBUaGUgc2FtZQorICAgaXMgdHJ1ZSBmb3IgdGhlIGNhc2UtY29udmVyc2lvbiBmdW5jdGlvbnMgXEZsb3dlcigpIGFuZCBcRnVwcGVyKCkuCisgICBDLUtlcm1pdCBkb2VzIG5vdCBrbm93IHRoZSBjb2xsYXRpbmcgc2VxdWVuY2UgZm9yIGRpZmZlcmVudCBjaGFyYWN0ZXIKKyAgIHNldHMgYW5kIGxhbmd1YWdlcy4gKE9uIHRoZSBvdGhlciBoYW5kLCBpdCBtaWdodCB3b3JrIGRlcGVuZGluZyBvbgorICAgc3VjaCBpdGVtcyBhcyBob3cgS2VybWl0IHdhcyBsaW5rZWQsIHdoZXRoZXIgeW91ciBvcGVyYXRpbmcgc3VwcG9ydHMKKyAgICJsb2NhbGVzIiwgZXRjKQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDExLjMuIE5VTCAoMCkgQ2hhcmFjdGVycyBpbiBDLUtlcm1pdCBDb21tYW5kcworCisgICBZb3UgY2FuJ3QgaW5jbHVkZSBhIE5VTCBjaGFyYWN0ZXIgKFwwKSBpbiBDLUtlcm1pdCBjb21tYW5kIHRleHQKKyAgIHdpdGhvdXQgdGVybWluYXRpbmcgdGhlIGNoYXJhY3RlciBzdHJpbmcgaW4gd2hpY2ggaXQgYXBwZWFycy4gRm9yCisgICBleGFtcGxlOgorCisgIGVjaG8gSW4gdGhlc2UgYnJhY2tldHMgW1wwXSBpcyBhIE5VTAorCisgICB3aWxsIGVjaG8gIkluIHRoZXNlIGJyYWNrZXRzIFsiLiBUaGlzIGFwcGxpZXMgdG8gRUNITywgSU5QVVQsIE9VVFBVVCwKKyAgIGFuZCBhbGwgb3RoZXIgY29tbWFuZHMgKGJ1dCB5b3UgY2FuIHJlcHJlc2VudCBOVUwgYnkgIlxOIiBpbiBhbiBPVVRQVVQKKyAgIHN0cmluZykuIFRoaXMgaXMgYmVjYXVzZSBDLWxhbmd1YWdlIHN0cmluZ3MgYXJlIHRlcm1pbmF0ZWQgaW50ZXJuYWxseQorICAgYnkgdGhlIE5VTCBjaGFyYWN0ZXIsIGFuZCBpdCBhbGxvd3MgYWxsIG9mIEMtS2VybWl0J3Mgc3RyaW5nCisgICBjb21wYXJpc29uIGFuZCBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIHRvIHdvcmsgaW4gdGhlIG5vcm1hbCAiQyIgd2F5LgorCisgICBUbyBpbGx1c3RyYXRlOgorCisgIElOUFVUIDUgXDAKKworICAgaXMgZXF1aXZhbGVudCB0bzoKKworICBJTlBVVCA1CisKKyAgIGFuZDoKKworICBJTlBVVCA1IEFCQ1wwREVGCisKKyAgIGlzIGVxdWl2YWxlbnQgdG86CisKKyAgSU5QVVQgNSBBQkMKKworICAgSU5QVVQgb3BlcmF0aW9ucyBkaXNjYXJkIGFuZCBpZ25vcmUgTlVMIGNoYXJhY3RlcnMgdGhhdCBhcnJpdmUgZnJvbQorICAgdGhlIGNvbW11bmljYXRpb24gZGV2aWNlLCBtZWFuaW5nIHRoYXQgdGhleSBkbyBub3QgZmlndXJlIGludG8KKyAgIG1hdGNoaW5nIG9wZXJhdGlvbnMgKGUuZy4gQTxOVUw+QiBtYXRjaGVzIEFCKTsgdGhleSBhcmUgbm90IGRlcG9zaXRlZAorICAgaW4gdGhlIElOUFVUIGJ1ZmZlciAoXHYoaW5wdXQpKTsgYW5kIHRoZXkgYXJlIG5vdCBjb3VudGVkIGluCisgICBcdihpbmNvdW50KSwgd2l0aCB0d28gZXhjZXB0aW9uczoKKworICAgIDEuIEFuIGFycml2aW5nIE5VTCBjaGFyYWN0ZXIgcmVzdGFydHMgdGhlIElOUFVUIFNJTEVOQ0UgdGltZXIuCisgICAgMi4gQW4gYXJyaXZpbmcgTlVMIGNoYXJhY3RlciB0ZXJtaW5hdGVzIHRoZSBJTlBVVCBjb21tYW5kIHdpdGggdGhlCisgICAgICAgU1VDQ0VTUyBjb25kaXRpb24gaWYgdGhlIElOUFVUIGNvbW1hbmQgd2FzIGdpdmVuIGFuIGVtcHR5IHNlYXJjaAorICAgICAgIHN0cmluZy4gSW4gdGhpcyBjYXNlIFx2KGluY291bnQpIGlzIHNldCB0byAxLgorCisgICBBbHNvLCB0aGUgXHYoaW5jaGFyKSB2YXJpYWJsZSBpcyBudWxsIChjb21wbGV0ZWx5IGVtcHR5KSBpZiB0aGUgbGFzdAorICAgSU5QVVQgY2hhcmFjdGVyIHdhcyBOVUwuIFRoYXQgaXMsIHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIG9ubHkgYnkKKyAgIGxvb2tpbmcgYXQgXHYoaW5jaGFyKSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgTlVMIHRoYXQgd2FzIElOUFVUIGFuZAorICAgbm8gSU5QVVQgYXQgYWxsLiBJZiB0aGUgSU5QVVQgY29tbWFuZCBzdWNjZWVkZWQgYnV0IFx2KGluY2hhcikgaXMKKyAgIGVtcHR5LCB0aGVuIGEgTlVMIGNoYXJhY3RlciB3YXMgaW5wdXQuIEFsc28sIFx2KGluY291bnQpIHdpbGwgYmUgc2V0CisgICB0byAxLgorCisgICBIZXJlJ3MgYSBzYW1wbGUgc2NyaXB0IGZyYWdtZW50IHRvIHJlYWQgY2hhcmFjdGVycywgcG9zc2libHkgaW5jbHVkaW5nCisgICBOVUwsIGZyb20gdGhlIGNvbW11bmljYXRpb24gY29ubmVjdGlvbiBhbmQgd3JpdGUgdGhlbSB0byBhIGZpbGU6CisKKyAgd2hpbGUgdHJ1ZSB7CisgICAgICBpbnB1dCAxICAgICAgICAgICAgICAgICAgICAgIDsgcmVhZCBvbmUgYnl0ZQorICAgICAgaWYgZmFpbCBicmVhayAgICAgICAgICAgICAgICA7IHRpbWVkIG91dCBvciBjb25uZWN0aW9uIGNsb3NlZAorICAgICAgZndyaXRlIC9jaGFyIFwlYyBcdihpbmNoYXIpICA7IHJlY29yZCB0aGUgYnl0ZQorICB9CisKKyAgIFRoaXMgd29ya3MgYmVjYXVzZSB3aGVuIFx2KGluY2hhcikgaXMgTlVMLCB0aGF0J3MgZXF1aXZhbGVudCB0byBGV1JJVEUKKyAgIC9DSEFSIGhhdmluZyBubyB0ZXh0IGFyZ3VtZW50IGF0IGFsbCwgaW4gd2hpY2ggY2FzZSBpdCB3cml0ZXMgYSBOVUwKKyAgIGNoYXJhY3Rlci4KKworICAgXHYoaW5jb3VudCkgYW5kIFx2KGluY2hhcikgYXJlIE5PVCBhZmZlY3RlZCBieSB0aGUgQ0xFQVIgY29tbWFuZC4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxMS40LiBcZmZpbGVzKCkgYW5kIFxmbmV4dGZpbGUoKSBQZWN1bGlhcml0aWVzCisKKyAgIFRoZSBmb2xsb3dpbmcgc2NyaXB0IHByb2dyYW06CisKKyAgZm9yIFwlaSAxIFxmZmlsZXMob29mYS4qKSAxIHsKKyAgICAgIHNlbmQgXGZuZXh0ZmlsZSgpCisgIH0KKworICAgZGlkIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGluIEMtS2VybWl0IDYuMCBhbmQgZWFybGllciBidXQgZG9lcyB3b3JrIGluCisgICBDLUtlcm1pdCA3LjAgYW5kIGxhdGVyLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDExLjUuIENvbW1hbmRzIFRoYXQgSGF2ZSBPbmx5IExvY2FsIEVmZmVjdAorCisgICBDZXJ0YWluIHNldHRpbmdzIGFyZSBsb2NhbCB0byBlYWNoIGNvbW1hbmQgbGV2ZWwsIG1lYW5pbmcgdGhhdAorICAgc3Vib3JkaW5hdGUgY29tbWFuZCBsZXZlbHMgKG1hY3JvcyBvciBjb21tYW5kIGZpbGVzKSBjYW4gY2hhbmdlIHRoZW0KKyAgIHdpdGhvdXQgYWZmZWN0aW5nIHRoZWlyIHZhbHVlcyBhdCBoaWdoZXIgY29tbWFuZCBsZXZlbHMuIFdoZW4gYSBuZXcKKyAgIGNvbW1hbmQgbGV2ZWwgaXMgaW52b2tlZCwgdGhlIHZhbHVlIGlzIGluaGVyaXRlZCBmcm9tIHRoZSBwcmV2aW91cworICAgbGV2ZWwuIFRoZXNlIHNldHRpbmdzIGFyZToKKworICBDQVNFCisgIENPVU5UIGFuZCBcdihjb3VudCkKKyAgSU5QVVQgQ0FTRQorICBJTlBVVCBUSU1FT1VUCisgIE1BQ1JPIEVSUk9SCisgIFFVSUVUCisgIFRBS0UgRVJST1IKKworICAgVGhpcyBhcnJhbmdlbWVudCBhbGxvd3MgQ0FTRSwgVElNRU9VVCwgYW5kIEVSUk9SIHNldHRpbmdzLCB3aGljaCBhcmUKKyAgIHVzZWQgdG8gY29udHJvbCBhdXRvbWF0aWMgZXhpdCBmcm9tIGEgY29tbWFuZCBmaWxlIG9yIG1hY3JvIHVwb24KKyAgIGVycm9yLCB0byBiZSBhdXRvbWF0aWNhbGx5IHJlc3RvcmVkIHdoZW4gdGhlIGNvbW1hbmQgZmlsZSBvciBtYWNybworICAgZXhpdHMuCisKKyAgIFRoZSBDT1VOVCB2YXJpYWJsZSBmb2xsb3dzIHRoaXMgcnVsZSB0b28sIHdoaWNoIHBlcm1pdHMgbmVzdGVkIFNFVAorICAgQ09VTlQgLyBJRiBDT1VOVCBsb29wcywgYXMgaW4gdGhpcyBleGFtcGxlIGluIHdoaWNoIHRoZSBpbm5lciBsb29wCisgICBjb3VudHMgZG93biBmcm9tIHRoZSBjdXJyZW50IENPVU5UIHZhbHVlIG9mIHRoZSBvdXRlciBsb29wICh0cnkgaXQpOgorCisgIERFRklORSBJTk5FUiBXSElMRSBDT1VOVCB7IFdSSVRFIFNDUkVFTiB7ICAgSW5uZXI6fSwgU0hPVyBDT1VOVCB9CisgIFNFVCBDT1VOVCA1CisgIFdISUxFIENPVU5UIHsgV1JJVEUgU0NSRUVOIE91dGVyOiwgU0hPVyBDT1VOVCwgRE8gSU5ORVIgfQorCisgICBLZWVwIGluIG1pbmQgdGhhdCBhbiBpbmZlcmlvciBjb21tYW5kIGxldmVsIGNhbm5vdCBtYW5pcHVsYXRlIHRoZQorICAgQ09VTlQgdmFsdWUgaGVsZCBieSBhIGhpZ2hlciBsZXZlbC4gRm9yIGV4YW1wbGU6CisKKyAgREVGSU5FIE9PRkEgU0hPVyBDT1VOVCwgSUYgQ09VTlQgR09UTyBMT09QCisgIFNFVCBDT1VOVCA1CisgIDpMT09QCisgIE9PRkEKKyAgRUNITyBEb25lCisKKyAgIHJlc3VsdHMgaW4gYW4gaW5maW5pdGUgbG9vcDsgdGhlIENPVU5UIHZhbHVlIHJlbWFpbnMgYXQgNSBiZWNhdXNlIGl0CisgICBpcyBuZXZlciBkZWNyZW1lbnRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhdCB3aGljaCBpdCB3YXMgc2V0LgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDExLjYuIExpdGVyYWwgQnJhY2VzIGluIEZ1bmN0aW9uIENhbGxzCisKKyAgIFNpbmNlIGJyYWNlcyBhcmUgdXNlZCBpbiBmdW5jdGlvbiBjYWxscyB0byBpbmRpY2F0ZSBncm91cGluZywgdGhlcmUgaXMKKyAgIG5vIHdheSB0byBwYXNzIGxpdGVyYWwgYnJhY2VzIHRvIHRoZSBmdW5jdGlvbiBpdHNlbGYuIFNvbHV0aW9uOiBEZWZpbmUKKyAgIGEgdmFyaWFibGUgY29udGFpbmluZyB0aGUgc3RyaW5nIHRoYXQgaGFzIGJyYWNlcy4gRXhhbXBsZToKKworICBkZWZpbmUgXCVhIGFie2NkCisgIGVjaG8gXGZzdWJzdHJpbmcoXCVhKQorICBhYntjZAorCisgICBJZiB0aGUgc3RyaW5nIGlzIHRvIHN0YXJ0IHdpdGggYSBsZWFkaW5nIGJyYWNlIGFuZCBlbmQgd2l0aCBhIGNsb3NpbmcKKyAgIGJyYWNlLCB0aGVuIGRvdWJsZSBicmFjZXMgbXVzdCBhcHBlYXIgYXJvdW5kIHRoZSBzdHJpbmcgKHdoaWNoIGl0c2VsZgorICAgaXMgZW5jbG9zZWQgaW4gYnJhY2VzKToKKworICBkZWZpbmUgXCVhIHt7e2Zvb319fQorICBlY2hvIFxmc3Vic3RyaW5nKFwlYSkKKyAge2Zvb30KKworICAgVGhpcyBhbHNvIHdvcmtzIGZvciBhbnkgb3RoZXIga2luZCBvZiBzdHJpbmc6CisKKyAgZGVmaW5lIFwlYSB7e2Fie2NkfX0KKyAgZWNobyBcZnN1YnN0cmluZyhcJWEpCisgIGFie2NkCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMTEuNy4gRGVmaW5pbmcgVmFyaWFibGVzIG9uIHRoZSBDLUtlcm1pdCBDb21tYW5kIExpbmUKKworICAgVG8gZGVmaW5lIHZhcmlhYmxlcyBvbiB0aGUgQy1LZXJtaXQgY29tbWFuZCBsaW5lLCB1c2UgdGhlIC1DCisgICBjb21tYW5kLWxpbmUgb3B0aW9uIHdpdGggb25lIG9yIG1vcmUgREVGSU5FIG9yIEFTU0lHTiBjb21tYW5kcy4gTm90ZQorICAgdGhhdCB0aGUgQy1LZXJtaXQgY29tbWFuZCBsaW5lIG11c3QgY29wZSB3aXRoIHRoZSBxdW90aW5nIHJ1bGVzIG9mCisgICB5b3VyIHNoZWxsLiBFeGFtcGxlczoKKworICBrZXJtaXQgLUMgImRlZmluZSBcXCVhIGZvbywgZGVmaW5lIHBob25lbnVtYmVyIDc2NTQzMjEiCisKKyAgIEluIHRoaXMgY2FzZSB3ZSBmb2xsb3cgVU5JWCBxdW90aW5nIHJ1bGVzIGJ5IGRvdWJsaW5nIHRoZSBiYWNrc2xhc2guCisgICBPbmNlIEMtS2VybWl0IHN0YXJ0cywgdGhlIFwlYSBhbmQgXG0ocGhvbmVudW1iZXIpIHZhcmlhYmxlcyBhcmUKKyAgIGRlZmluZWQgYXMgaW5kaWNhdGVkIGFuZCBjYW4gYmUgdXNlZCBpbiB0aGUgbm9ybWFsIHdheS4KKworICAgSW4gRE9TIG9yIFdpbmRvd3Mgb3IgT1MvMiB0aGUgY29tbWFuZCB3b3VsZCBiZToKKworICBrZXJtaXQgLUMgImRlZmluZSBcJSVhIGZvbywgZGVmaW5lIHBob25lbnVtYmVyIDc2NTQzMjEiCisKKyAgIEhlcmUgd2UgbmVlZCB0byBkb3VibGUgdGhlIHBlcmNlbnQgc2lnbiByYXRoZXIgdGhhbiB0aGUgYmFja3NsYXNoCisgICBiZWNhdXNlIG9mIERPUyBzaGVsbCBxdW90aW5nIHJ1bGVzLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDExLjguIFBlci1DaGFyYWN0ZXIgRWNobyBDaGVjayB3aXRoIHRoZSBPVVRQVVQgQ29tbWFuZAorCisgICBTb21ldGltZXMgdGhlIE9VVFBVVCBjb21tYW5kIG11c3QgYmUgdXNlZCB0byBzZW5kIGNvbW1hbmRzIG9yIGRhdGEgdG8KKyAgIGEgZGV2aWNlIGluICJlY2hvcGxleCIgbW9kZSwgbWVhbmluZyB0aGF0IGNoYXJhY3RlcnMgbXVzdCBiZSBzZW50IG9uZQorICAgYXQgYSB0aW1lLCBhbmQgdGhlIG5leHQgY2hhcmFjdGVyIGNhbiBub3QgYmUgc2VudCB1bnRpbCB0aGUgZWNobyBmcm9tCisgICB0aGUgcHJldmlvdXMgb25lIGhhcyBiZWVuIHJlY2VpdmVkLiBGb3IgZXhhbXBsZSwgYSBjZXJ0YWluIFBCWCBtaWdodAorICAgaGF2ZSB0aGlzIGNoYXJhY3RlcmlzdGljLiBMZXQncyBzYXkgYSBLZXJtaXQgc2NyaXB0IGlzIHVzZWQgdG8gcHJvZ3JhbQorICAgdGhlIFBCWC4gSWYgY2hhcmFjdGVycyBhcmUgc2VudCB0b28gZmFzdCwgdGhleSBjYW4gYmUgbG9zdC4gSXQgd291bGQKKyAgIHNlZW0gdGhhdCB0aGUgY29tbWFuZDoKKworICBTRVQgT1VUUFVUIFBBQ0lORyBtaWxsaXNlY29uZHMKKworICAgY291bGQgYmUgdXNlZCB0byB0YWtlIGNhcmUgb2YgdGhpcywgYnV0IHRoZSBwYWNpbmcgaW50ZXJ2YWwgaXMKKyAgIGNvbnN0YW50IGFuZCBtdXN0IGJlIHNldCBsYXJnZSBlbm91Z2ggdG8gYWxsb3cgZXZlbiB0aGUgc2xvd2VzdCBlY2hvCisgICB0byBmaW5pc2guIElmIHRoZSBzY3JpcHQgaXMgbGFyZ2UgKGFuIGFjdHVhbCBleGFtcGxlIGlzIDE0LDAwMCBsaW5lcworICAgbG9uZyksIHRoaXMgY2FuIGNhdXNlIGl0IHRvIHRha2UgaG91cnMgbG9uZ2VyIHRoYW4gaXQgbmVlZHMgdG8uCisKKyAgIEhlcmUgaXMgYSBtYWNybyB5b3UgY2FuIHVzZSB0byBPVVRQVVQgYSBzdHJpbmcgaW4gYW4gRWNob3BsZXgKKyAgIGVudmlyb25tZW50OgorCisgIGRlZmluZSBYT1VUUFVUIHsKKyAgICAgIGxvY2FsIFwlYyBcJWkKKyAgICAgIHNldCBvdXRwdXQgcGFjaW5nIDAKKyAgICAgIGZvciBcJWkgMSBcZmxlbihcJSopIDEgeworICAgICAgICAgIGFzZyBcJWMgXGZzdWJzdHIoXCUqLFwlaSwxKQorICAgICAgICAgIG91dHB1dCBcJWMKKyAgICAgICAgICBpbnB1dCAyIFwlYworICAgICAgfQorICB9CisKKyAgIEMtS2VybWl0IDcuMCBvciBsYXRlciBpcyByZXF1aXJlZC4KKworICAgSXQgc2VuZHMgb25lIGNoYXJhY3RlciBhdCBhIHRpbWUgYW5kIHRoZW4gd2FpdHMgdXAgdG8gMiBzZWNvbmRzIGZvcgorICAgdGhlIGNoYXJhY3RlciB0byBiZSBlY2hvZWQgYmFjaywgYnV0IGNvbnRpbnVlcyB0byB0aGUgbmV4dCBjaGFyYWN0ZXIKKyAgIGFzIHNvb24gYXMgdGhlIGVjaG8gYXBwZWFycywgc28gbm8gdGltZSBpcyB3YXN0ZWQuIFlvdSBjYW4gYWRkIGFuIElGCisgICBGQUlMIGNsYXVzZSBhZnRlciB0aGUgSU5QVVQgaW4gY2FzZSB5b3Ugd2FudCB0byBkbyBzb21ldGhpbmcgc3BlY2lhbAorICAgYWJvdXQgZmFpbHVyZSB0byBkZXRlY3QgYW4gZWNobyB3aXRoaW4gdGhlIHRpbWVvdXQgcGVyaW9kLiBPYnZpb3VzbHkKKyAgIHlvdSBjYW4gYWxzbyBjaGFuZ2UgdGhlIDItc2Vjb25kIGxpbWl0LCBhbmQgYWRqdXN0IHRoZSBzY3JpcHQgaW4gYW55CisgICBvdGhlciBkZXNpcmVkIHdheS4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxMS45LiBTY3JpcHRlZCBGaWxlIFRyYW5zZmVyCisKKyAgIFNvbWV0aW1lcyBhIHVzZXIgY29tcGxhaW5zIHRoYXQgd2hlbiBzaGUgbWFrZXMgYSBjb25uZWN0aW9uIGJ5IGhhbmQsCisgICBsb2dzIGluLCBhbmQgdHJhbnNmZXJzIGEgZmlsZSwgdGhlcmUgYXJlIG5vIHByb2JsZW1zLCBidXQgd2hlbiBzaGUKKyAgIHNjcmlwdHMgdGhlIHRoZSBleGFjdCBzYW1lIHNlcXVlbmNlLCB0aGUgZmlsZSB0cmFuc2ZlciBhbHdheXMgZmFpbHMKKyAgIGFmdGVyIGEgZmV3IHBhY2tldHMuIEhlcmUncyBhIHNjZW5hcmlvIHdoZXJlIHRoaXMgY2FuIGhhcHBlbjoKKworICAgIDEuIFVwb24gbG9nZ2luZyBpbiB0byB0aGUgcmVtb3RlIGNvbXB1dGVyLCBpdCBzZW5kcyBhICJXaGF0IEFyZSBZb3U/IgorICAgICAgIGVzY2FwZSBzZXF1ZW5jZS4KKyAgICAyLiBXaGVuIHlvdSBsb2cgaW4gaW50ZXJhY3RpdmVseSwgeW91ciB0ZXJtaW5hbCBlbXVsYXRvciBzZW5kcyB0aGUKKyAgICAgICByZXNwb25zZS4gVGhpcyBpcyBpbnZpc2libGUgdG8geW91OyB5b3UgZG9uJ3Qga25vdyBpdCdzIGhhcHBlbmluZy4KKyAgICAzLiBXaGVuIHlvdSBzY3JpcHQgdGhlIGxvZ2luLCBhbmQgYmVnaW4gYSBmaWxlIHRyYW5zZmVyIGltbWVkaWF0ZWx5CisgICAgICAgdXBvbiBsb2dnaW5nIGluLCB0aGUgaG9zdCBzdGlsbCBzZW5kcyB0aGUgIldoYXQgQXJlIFlvdT8iCisgICAgICAgc2VxdWVuY2UuIEtlcm1pdCdzIElOUFVUIEVDSE8gc2V0dGluZyBpcyBPTiBieSBkZWZhdWx0LCBzbyB0aGUKKyAgICAgICBlc2NhcGUgc2VxdWVuY2UgcGFzc2VzIHRocm91Z2ggdG8gdGhlIHRlcm1pbmFsLCBhbmQgdGhlIHRlcm1pbmFsCisgICAgICAgc2VuZHMgaXRzIHJlc3BvbnNlLiBCdXQgYnkgdGhpcyB0aW1lIEtlcm1pdCBoYXMgYWxyZWFkeSBzdGFydGVkCisgICAgICAgdGhlIGZpbGUgdHJhbnNmZXIuCisgICAgNC4gQnkgZGVmYXVsdCwgdGhlIGxvY2FsIEtlcm1pdCBwcm9ncmFtIGV4YW1pbmVzIHRoZSBrZXlib2FyZCBmb3IKKyAgICAgICBpbnRlcnJ1cHRpb24gY2hhcmFjdGVycyBiZXR3ZWVuIGV2ZXJ5IHBhY2tldC4gVGhlICJXaGF0IEFyZSBZb3UiCisgICAgICAgcmVzcG9uc2UgaXMgc2l0dGluZyBpbiB0aGUga2V5Ym9hcmQgYnVmZmVyLiBFdmVudHVhbGx5IEtlcm1pdCB3aWxsCisgICAgICAgcmVhZCBhIGNoYXJhY3RlciBzdWNoIGFzICJjIiB0aGF0IGlzIGEgdmFsaWQgaW50ZXJydXB0aW9uCisgICAgICAgY2hhcmFjdGVyLCBhbmQgdGhlIGZpbGUgdHJhbnNmZXIgc3RvcHMgd2l0aCAiVXNlciBjYW5jZWxsZWQiLgorCisgICBUaGUgcmlnaHQgd2F5IHRvIGhhbmRsZSB0aGlzIHNpdHVhdGlvbiBpcyB0byBoYXZlIHlvdXIgbG9vayBmb3IgdGhlCisgICAiV2hhdCBBcmUgWW91PyIgc2VxdWVuY2UgYW5kIHNlbmQgdGhlIHJlc3BvbnNlIGl0c2VsZiwgYXMgZGVzY3JpYmVkIGluCisgICBVc2luZyBDLUtlcm1pdCwgcHAuNDI5LTQzMS4gT3IgeW91IGNhbiB3b3JrIGFyb3VuZCBpdCBieSB0ZWxsaW5nIHRoZQorICAgbG9jYWwgS2VybWl0IHRvICJzZXQgaW5wdXQgZWNobyBvZmYiIGFuZC9vciAic2V0IHRyYW5zZmVyIGludGVycnVwdGlvbgorICAgb2ZmIi4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxMS4xMC4gT3RoZXIuLi4KKworICAgRXNjYXBlIHNlcXVlbmNlcyAob3IgYW55IHN0cmluZ3MgdGhhdCBjb250YWluIGNvbnRyb2wgY2hhcmFjdGVycykKKyAgIGNhbid0IGJlIHVzZWQgYXMgbGFiZWxzLCBHT1RPIHRhcmdldHMsIG9yIFNXSVRDSCBjYXNlcy4KKworICAgWyBbODFdVG9wIF0gWyBbODJdQ29udGVudHMgXSBbIFs4M11DLUtlcm1pdCBIb21lIF0gWyBbODRdQy1LZXJtaXQgOC4wCisgICBPdmVydmlldyBdIFsgWzg1XUtlcm1pdCBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgQy1LZXJtaXQgOC4wIFVuaXggSGludHMgYW5kIFRpcHMgLyBbODZdVGhlIEtlcm1pdCBQcm9qZWN0IC8KKyAgIFs4N11Db2x1bWJpYSBVbml2ZXJzaXR5IC8gWzg4XWtlcm1pdEBjb2x1bWJpYS5lZHUgLyAxMCBBcHJpbCAyMDA0CisKK1JlZmVyZW5jZXMKKworICAgMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworICAgMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUvCisgICAzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwKKyAgIDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbAorICAgNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2s5NS5odG1sCisgICA2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgICA3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbAorICAgOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3gwCisgICA5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDEKKyAgMTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCN4MgorICAxMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3gzCisgIDEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDQKKyAgMTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCN4NQorICAxNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3g2CisgIDE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDcKKyAgMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCN4OAorICAxNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3g5CisgIDE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDEwCisgIDE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDExCisgIDIwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjdG9wCisgIDIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjY29udGVudHMKKyAgMjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCN4MgorICAyMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3RvcAorICAyNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI2NvbnRlbnRzCisgIDI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDIKKyAgMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9jazYwbWFudWFsLmh0bWwKKyAgMjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Mi5odG1sCisgIDI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2s2MG1hbnVhbC5odG1sCisgIDI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDUKKyAgMzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbAorICAzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gyLjIKKyAgMzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCN0b3AKKyAgMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCNjb250ZW50cworICAzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3gzCisgIDM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDEKKyAgMzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCN0b3AKKyAgMzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCNjb250ZW50cworICAzOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3g0CisgIDM5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDIKKyAgNDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCN0b3AKKyAgNDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCNjb250ZW50cworICA0Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3g1CisgIDQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDMKKyAgNDQuIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzExMjIudHh0CisgIDQ1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjdG9wCisgIDQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjY29udGVudHMKKyAgNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCN4NgorICA0OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3g0CisgIDQ5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjdG9wCisgIDUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjY29udGVudHMKKyAgNTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCN4NworICA1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3g1CisgIDUzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2s2MG1hbnVhbC5odG1sCisgIDU0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDEwCisgIDU1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjdG9wCisgIDU2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjY29udGVudHMKKyAgNTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCN4OAorICA1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3g2CisgIDU5LiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMyMjE3LnR4dAorICA2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3RvcAorICA2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI2NvbnRlbnRzCisgIDYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDkKKyAgNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbCN4NworICA2NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3RvcAorICA2NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI2NvbnRlbnRzCisgIDY2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDEwCisgIDY3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDgKKyAgNjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbAorICA2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3RvcAorICA3MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI2NvbnRlbnRzCisgIDcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDExCisgIDcyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDkKKyAgNzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9jazYwbWFudWFsLmh0bWwKKyAgNzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWk3MC5odG0KKyAgNzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ocDQ4Lmh0bWwKKyAgNzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMgorICA3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gxNQorICA3OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI3RvcAorICA3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sI2NvbnRlbnRzCisgIDgwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjeDEwCisgIDgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjdG9wCisgIDgyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwjY29udGVudHMKKyAgODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9jazgwLmh0bWwKKyAgODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgIDg2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorICA4Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUvCisgIDg4LiBtYWlsdG86a2VybWl0QGNvbHVtYmlhLmVkdQpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrY2NmZy50eHQgYi9ja2VybWl0LTguMC4yMTEvY2tjY2ZnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODcwOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrY2NmZy50eHQKQEAgLTAsMCArMSwxNzY2IEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgIEMtS2VybWl0IENvbmZpZ3VyYXRpb24gT3B0aW9ucworCisgICAgIEZyYW5rIGRhIENydXoKKyAgICAgWzFdVGhlIEtlcm1pdCBQcm9qZWN0CisgICAgIFsyXUNvbHVtYmlhIFVuaXZlcnNpdHkKKworICAgQXMgb2Y6IEMtS2VybWl0IDguMC4yMTEsIDEwIEFwcmlsIDIwMDQKKyAgIFRoaXMgcGFnZSBsYXN0IHVwZGF0ZWQ6IFN1biBBcHIgMTEgMTY6NDU6NTUgMjAwNCAoTmV3IFlvcmsgVVNBIFRpbWUpCisKKyAgICAgSUYgWU9VIEFSRSBSRUFESU5HIEEgUExBSU4tVEVYVCB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQsIG5vdGUgdGhhdAorICAgICB0aGlzIGZpbGUgaXMgYSBwbGFpbi10ZXh0IGR1bXAgb2YgYSBXZWIgcGFnZS4gWW91IGNhbiB2aXNpdCB0aGUKKyAgICAgb3JpZ2luYWwgKGFuZCBwb3NzaWJseSBtb3JlIHVwLXRvLWRhdGUpIFdlYiBwYWdlIGhlcmU6CisKKyAgWzNdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sCisKKyAgIFsgWzRdQy1LZXJtaXQgSG9tZSBdIFsgWzVdS2VybWl0IEhvbWUgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIENPTlRFTlRTCisKKyAgMS4gWzZdRklMRSBUUkFOU0ZFUgorICAyLiBbN11TRVJJQUwgQ09NTVVOSUNBVElPTiBTUEVFRFMKKyAgMy4gWzhdRlVMTFNDUkVFTiBGSUxFIFRSQU5TRkVSIERJU1BMQVkKKyAgNC4gWzldQ0hBUkFDVEVSIFNFVFMKKyAgNS4gWzEwXUFQQyBFWEVDVVRJT04KKyAgNi4gWzExXVBST0dSQU0gU0laRQorICA3LiBbMTJdTU9ERU0gRElBTElORworICA4LiBbMTNdTkVUV09SSyBTVVBQT1JUCisgIDkuIFsxNF1FWENFUFRJT04gSEFORExJTkcKKyAxMC4gWzE1XVNFQ1VSSVRZIEZFQVRVUkVTCisgMTEuIFsxNl1FTkFCTElORyBTRUxFQ1QoKQorIDEyLiBbMTddSS9PIFJFRElSRUNUSU9OCisgMTMuIFsxOF1GTE9BVElORy1QT0lOVCBOVU1CRVJTLCBUSU1FUlMsIEFORCBBUklUSE1FVElDCisgMTQuIFsxOV1TUEVDSUFMIENPTkZJR1VSQVRJT05TCisgIEkuIFsyMF1TVU1NQVJZIE9GIENPTVBJTEUtVElNRSBPUFRJT05TCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgT1ZFUlZJRVcKKworICAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBDLUtlcm1pdCAoNUEgYW5kCisgICBsYXRlcikuIFRoZSBtYWpvciB0b3BpY3MgY292ZXJlZCBpbmNsdWRlIHByb2dyYW0gc2l6ZSAoYW5kIGhvdyB0bworICAgcmVkdWNlIGl0KSwgaG93IHRvIGluY2x1ZGUgb3IgZXhjbHVkZSBwYXJ0aWN1bGFyIGZlYXR1cmVzLCBub3RlcyBvbgorICAgc2VyaWFsLXBvcnQsIG1vZGVtLCBhbmQgbmV0d29yayBzdXBwb3J0LCBhbmQgYSBsaXN0IG9mIEMtS2VybWl0J3MKKyAgIGNvbXBpbGUtdGltZSBvcHRpb25zLgorCisgICBGb3IgZGV0YWlscyBhYm91dCB5b3VyIHBhcnRpY3VsYXIgb3BlcmF0aW5nIHN5c3RlbSwgYWxzbyBzZWUgdGhlCisgICBzeXN0ZW0tc3BlY2lmaWMgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBmaWxlLCBzdWNoIGFzIHRoZQorICAgWzIxXUMtS2VybWl0IEluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnMgZm9yIFVuaXguCisKKyAgIFsgWzIyXUMtS2VybWl0IEhvbWUgXSBbIFsyM11LZXJtaXQgSG9tZSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMS4gRklMRSBUUkFOU0ZFUgorCisgICBbIFsyNF1Ub3AgXSBbIFsyNV1Db250ZW50cyBdIFsgWzI2XU5leHQgXSBbIFsyN11QcmV2aW91cyBdCisKKyAgIFByaW9yIHRvIHZlcnNpb24gNy4wLCBDLUtlcm1pdCB3YXMgYWx3YXlzIGJ1aWx0IHdpdGggdGhlIG1vc3QKKyAgIGNvbnNlcnZhdGl2ZSBLZXJtaXQgZmlsZS10cmFuc2ZlciBwcm90b2NvbCBkZWZhdWx0cyBvbiBldmVyeSBwbGF0Zm9ybToKKyAgIG5vIGNvbnRyb2wtY2hhcmFjdGVyIHByZWZpeGluZywgOTQtYnl0ZSBwYWNrZXRzLCBhbmQgYSB3aW5kb3cgc2l6ZSBvZgorICAgMS4KKworICAgU3RhcnRpbmcgaW4gdmVyc2lvbiA3LjAsIGZhc3Qgc2V0dGluZ3MgYXJlIHRoZSBkZWZhdWx0LiBUbyBvdmVycmlkZQorICAgdGhlc2UgYXQgY29tcGlsZSB0aW1lLCBpbmNsdWRlOgorCisgIC1ETk9GQVNUCisKKyAgIGluIHRoZSBDIGNvbXBpbGVyIENGTEFHUy4gRXZlbiB3aXRoIHRoZSBmYXN0IGRlZmF1bHRzLCBDLUtlcm1pdAorICAgYXV0b21hdGljYWxseSBkcm9wcyBkb3duIHRvIHdoYXRldmVyIHdpbmRvdyBhbmQgcGFja2V0IHNpemVzIHJlcXVlc3RlZAorICAgYnkgdGhlIG90aGVyIEtlcm1pdCwgaWYgdGhlc2UgYXJlIHNtYWxsZXIsIHdoZW4gc2VuZGluZyBmaWxlcyAoZXhjZXB0CisgICBmb3IgY29udHJvbC1jaGFyYWN0ZXIgdW5wcmVmaXhpbmcsIHdoaWNoIGlzIG5vdCBuZWdvdGlhdGVkLCBhbmQgd2hpY2gKKyAgIGlzIG5vdyBzZXQgdG8gQ0FVVElPVVMgcmF0aGVyIHRoYW4gTk9ORSBhdCBzdGFydHVwKS4gQy1LZXJtaXQncworICAgc2V0dGluZ3MgcHJldmFpbCB3aGVuIGl0IGlzIHJlY2VpdmluZy4KKworICAgWyBbMjhdQy1LZXJtaXQgSG9tZSBdIFsgWzI5XUtlcm1pdCBIb21lIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAyLiBTRVJJQUwgQ09NTVVOSUNBVElPTiBTUEVFRFMKKworICAgWyBbMzBdVG9wIF0gWyBbMzFdQ29udGVudHMgXSBbIFszMl1OZXh0IF0gWyBbMzNdUHJldmlvdXMgXQorCisgICBBcyBvZiA2IFNlcHRlbWJlciAxOTk3LCBhIG5ldyBzaW1wbGlmaWVkIG1lY2hhbmlzbSBmb3Igb2J0YWluaW5nIHRoZQorICAgbGlzdCBvZiBsZWdhbCBzZXJpYWwgaW50ZXJmYWNlIHNwZWVkcyBpcyBpbiBwbGFjZToKKworICAgICAqIElmIHRoZSBzeW1ib2wgVFRTUERMSVNUIGlzIGRlZmluZWQsIHRoZSBzeXN0ZW0tZGVwZW5kZW50IHJvdXRpbmUKKyAgICAgICB0dHNwZGxpc3QoKSBpcyBjYWxsZWQgYXQgcHJvZ3JhbSBpbml0aWFsaXphdGlvbiB0byBvYnRhaW4gdGhlCisgICAgICAgbGlzdC4KKyAgICAgKiBUaGlzIHN5bWJvbCBzaG91bGQgYmUgZGVmaW5lZCBvbmx5IGZvciBDLUtlcm1pdCBpbXBsZW1lbnRhdGlvbnMKKyAgICAgICB0aGF0IGhhdmUgaW1wbGVtZW50ZWQgdGhlIHR0c3BkbGlzdCgpIGZ1bmN0aW9uLCB0eXBpY2FsbHkgaW4gdGhlCisgICAgICAgY2s/dGlvLmMgbW9kdWxlLiBTZWUgWzM0XWNrdXRpby5jIGZvciBhbiBleGFtcGxlLgorICAgICAqIFRUU1BETElTVCBpcyBhdXRvbWF0aWNhbGx5IGRlZmluZWQgaW4gWzM1XWNrY2RlYi5oIGZvciBVTklYLiBBZGQKKyAgICAgICB0aGUgYXBwcm9wcmlhdGUgI2lmZGVmcyBmb3Igb3RoZXIgcGxhdGZvcm1zIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICB0dHNwZGxpc3QoKSBmdW5jdGlvbnMgYXJlIGZpbGxlZCBpbi4KKyAgICAgKiBJZiBUVFNQRExJU1QgaXMgKG9yIG5vcm1hbGx5IHdvdWxkIGJlKSBkZWZpbmVkLCB0aGUgb2xkIGNvZGUKKyAgICAgICAoZGVzY3JpYmVkIGJlbG93KSBjYW4gc3RpbGwgYmUgc2VsZWN0ZWQgYnkgZGVmaW5pbmcgTk9UVFNQRExJU1QuCisKKyAgIFRoZSB0dHNwZGxpc3QoKSBmdW5jdGlvbiBjYW4gb2J0YWluIHRoZSBzcGVlZHMgaW4gYW55IHdheSB0aGF0IHdvcmtzLgorICAgRm9yIGV4YW1wbGUsIGJhc2VkIHNpbXBseSBvbiAjaWZkZWYgQm5ubm4uLiNlbmRpZiAoaW4gVU5JWCkuIEFsdGhvdWdoCisgICBpdCBtaWdodCBiZSBiZXR0ZXIgdG8gYWN0dWFsbHkgY2hlY2sgZWFjaCBzcGVlZCBhZ2FpbnN0IHRoZSBjdXJyZW50bHkKKyAgIHNlbGVjdGVkIGhhcmR3YXJlIGludGVyZmFjZSBiZWZvcmUgYWxsb3dpbmcgaXQgaW4gdGhlIGFycmF5LCB0aGVyZSBpcworICAgdXN1YWxseSBubyBwYXNzaXZlIGFuZC9vciByZWxpYWJsZSBhbmQgc2FmZSB3YXkgdG8gZG8gdGhpcywgYW5kIHNvCisgICBpdCdzIGJldHRlciB0byBsZXQgc29tZSBzcGVlZHMgaW50byB0aGUgYXJyYXkgdGhhdCBtaWdodCBub3Qgd29yaywKKyAgIHRoYW4gaXQgaXMgdG8gZXJyb25lb3VzbHkgZXhjbHVkZSBvdGhlcnMuIFNwZWVkcyB0aGF0IGRvbid0IHdvcmsgYXJlCisgICBjYXVnaHQgd2hlbiB0aGUgU0VUIFNQRUVEIGNvbW1hbmQgaXMgYWN0dWFsbHkgZ2l2ZW4uCisKKyAgIE5vdGUgdGhhdCB0aGlzIHNjaGVtZSBkb2VzIG5vdCBuZWNlc3NhcmlseSBydWxlIG91dCBzcGxpdCBzcGVlZAorICAgb3BlcmF0aW9uLCBidXQgZWZmZWN0aXZlbHkgaXQgZG9lcyBpbiBDLUtlcm1pdCBhcyBwcmVzZW50bHkKKyAgIGNvbnN0aXR1dGVkIHNpbmNlIHRoZXJlIGFyZSBubyBjb21tYW5kcyB0byBzZXQgaW5wdXQgYW5kIG91dHB1dCBzcGVlZAorICAgc2VwYXJhdGVseSAoZXhjZXB0IHRoZSBzcGVjaWFsIGNhc2UgInNldCBzcGVlZCA3NS8xMjAwIikuCisKKyAgIE5vdGUgdGhhdCBzb21lIHBsYXRmb3Jtcywgbm90YWJseSBBSVggNC4yIGFuZCA0LjMsIGltcGxlbWVudCBoaWdoCisgICBzZXJpYWwgc3BlZWRzIHRyYW5zcGFyZW50bHkgdG8gdGhlIGFwcGxpY2F0aW9uLCBlLmcuIGJ5IG1hcHBpbmcgNTAgYnBzCisgICB0byA1NzYwMCBicHMsIGFuZCBzbyBvbi4KKworICAgVGhhdCdzIHRoZSB3aG9sZSBkZWFsLiBXaGVuIFRUU1BETElTVCBpcyBub3QgZGVmaW5lZCwgdGhlIGZvbGxvd2luZworICAgYXBwbGllczoKKworICAgU3BlZWRzIGFyZSBkZWZpbmVkIGluIHR3byBwbGFjZXM6IHRoZSBTRVQgU1BFRUQga2V5d29yZCBsaXN0IGluIHRoZQorICAgY29tbWFuZCBwYXJzZXIgKGFzIG9mIHRoaXMgd3JpdGluZywgaW4gdGhlIFszNl1ja3V1czMuYyBzb3VyY2UgZmlsZSksCisgICBhbmQgaW4gdGhlIHN5c3RlbS0gZGVwZW5kZW50IGNvbW11bmljYXRpb25zIGkvbyBtb2R1bGUsIGNrP3Rpby5jLAorICAgZnVuY3Rpb25zIHR0c3NwZCgpIChzZXQgc3BlZWQpIGFuZCB0dGdzcGQoKSAoZ2V0IHNwZWVkKS4gVGhlIGZvbGxvd2luZworICAgc3BlZWRzIGFyZSBhc3N1bWVkIHRvIGJlIGF2YWlsYWJsZSBpbiBhbGwgdmVyc2lvbnM6CisKKyAgMCwgMTEwLCAzMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMAorCisgICBJZiBvbmUgb3IgbW9yZSBvZiB0aGVzZSBzcGVlZHMgaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIHN5c3RlbSwgeW91J2xsCisgICBuZWVkIHRvIGNoYW5nZSB0aGUgc291cmNlIGNvZGUgKHRoaXMgaGFzIG5ldmVyIGhhcHBlbmVkIHNvIGZhcikuIE90aGVyCisgICBzcGVlZHMgdGhhdCBhcmUgbm90IGNvbW1vbiB0byBhbGwgc3lzdGVtcyBoYXZlIEtlcm1pdC1zcGVjaWZpYworICAgc3ltYm9sczoKKworICAgICAgICAgICAgICAgU3ltYm9sICAgICAgIFN5bWJvbAorICBTcGVlZCAoYnBzKSAgdG8gZW5hYmxlICAgIHRvIGRpc2FibGUKKyAgICAgICA1MCAgICAgICBCUFNfNTAgICAgICAgTk9CXzUwCisgICAgICAgNzUgICAgICAgQlBTXzc1ICAgICAgIE5PQl83NQorICAgICAgIDc1LzEyMDAgIEJQU183NTEyICAgICBOT0JfNzUxMgorICAgICAgMTM0LjUgICAgIEJQU18xMzQgICAgICBOT0JfMTM0CisgICAgICAxNTAgICAgICAgQlBTXzE1MCAgICAgIE5PQl8xNTAKKyAgICAgIDIwMCAgICAgICBCUFNfMjAwICAgICAgTk9CXzIwMAorICAgICAxODAwICAgICAgIEJQU18xODAwICAgICBOT0JfMTgwMAorICAgICAzNjAwICAgICAgIEJQU18zNjAwICAgICBOT0JfMzYwMAorICAgICA3MjAwICAgICAgIEJQU183MjAwICAgICBOT0JfNzIwMAorICAgIDE0NDAwICAgICAgIEJQU18xNEsgICAgICBOT0JfMTRLCisgICAgMTkyMDAgICAgICAgQlBTXzE5SyAgICAgIE5PQl8xOUsKKyAgICAyODgwMCAgICAgICBCUFNfMjhLICAgICAgTk9CXzI4SworICAgIDM4NDAwICAgICAgIEJQU18zOEsgICAgICBOT0JfMzhLCisgICAgNTc2MDAgICAgICAgQlBTXzU3SyAgICAgIE5PQl81N0sKKyAgICA3NjgwMCAgICAgICBCUFNfNzZLICAgICAgTk9CXzc2SworICAgMTE1MjAwICAgICAgIEJQU18xMTVLICAgICBOT0JfMTU1SworICAgMjMwNDAwICAgICAgIEJQU18yMzBLICAgICBOT0JfMjMwSworICAgNDYwODAwICAgICAgIEJQU180NjBLICAgICBOT0JfNDYwSworICAgOTIxNjAwICAgICAgIEJQU185MjFLICAgICBOT0JfOTIxSworCisgICBUaGUgWzM3XWNrY2RlYi5oIGhlYWRlciBmaWxlIGNvbnRhaW5zIGRlZmF1bHQgc3BlZWQgY29uZmlndXJhdGlvbnMgZm9yCisgICB0aGUgbWFueSBzeXN0ZW1zIHRoYXQgQy1LZXJtaXQgc3VwcG9ydHMuIFlvdSBjYW4gb3ZlcnJpZGUgdGhlc2UKKyAgIGRlZmF1bHRzIGJ5IChhKSBlZGl0aW5nIGNrY2RlYi5oLCBvciAoYikgZGVmaW5pbmcgdGhlIGFwcHJvcHJpYXRlCisgICBlbmFibGluZyBhbmQvb3IgZGlzYWJsaW5nIHN5bWJvbHMgb24gdGhlIENDIGNvbW1hbmQgbGluZSwgZm9yIGV4YW1wbGU6CisKKyAgLURCUFNfMTQ0MDAgLUROT0JfMTE1MjAwCisKKyAgIG9yIHRoZSAibWFrZSIgY29tbWFuZCBsaW5lLCBlLmcuOgorCisgIG1ha2UgYmxhaCAiS0ZMQUdTPS1EQlBTXzE0NDAwIC1ETk9CXzExNTIwMCIKKworICAgTm90ZTogc29tZSBzcGVlZHMgaGF2ZSBubyBzeW1ib2xzIGRlZmluZWQgZm9yIHRoZW0sIGJlY2F1c2UgdGhleSBoYXZlCisgICBuZXZlciBiZWVuIG5lZWRlZDogMTIuNWJwcywgNDUuNWJwcywgMjAwMDBicHMsIGV0Yy4gVGhlc2UgY2FuIGVhc2lseQorICAgYmUgYWRkZWQgaWYgcmVxdWlyZWQgKGJ1dCB0aGV5IHdpbGwgd29yayBvbmx5IGlmIHRoZSBPUyBzdXBwb3J0cworICAgdGhlbSkuCisKKyAgIElNUE9SVEFOVDogQWRkaW5nIG9uZSBvZiB0aGVzZSBmbGFncyBhdCBjb21waWxlIHRpbWUgZG9lcyBub3QKKyAgIG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGF0IHNwZWVkLiBBIHBhcnRpY3VsYXIKKyAgIHNwZWVkIGlzIHVzYWJsZSBvbmx5IGlmIHlvdXIgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtIHN1cHBvcnRzIGl0LgorICAgSW4gcGFydGljdWxhciwgaXQgbmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgYXBwcm9wcmlhdGUgc3lzdGVtIGhlYWRlcgorICAgZmlsZSAoZS5nLiBpbiBVTklYLCBjZCB0byAvdXNyL2luY2x1ZGUgYW5kIGdyZXAgZm9yIEI5NjAwIGluICouaCBhbmQKKyAgIHN5cy8qLmggdG8gZmluZCB0aGUgaGVhZGVyIGZpbGUgdGhhdCBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZQorICAgc3VwcG9ydGVkIHNwZWVkcyksIGFuZCBzdXBwb3J0ZWQgYnkgdGhlIHNlcmlhbCBkZXZpY2UgZHJpdmVyLCBhbmQgb2YKKyAgIGNvdXJzZSBieSB0aGUgcGh5c2ljYWwgZGV2aWNlIGl0c2VsZi4KKworICAgQUxTTyBJTVBPUlRBTlQ6IFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBzcGVlZHMgaXMgaW5kZXBlbmRlbnQgb2YgaG93CisgICB0aGV5IGFyZSBzZXQuIFRoZSBtYW55IFVOSVhlcywgZm9yIGV4YW1wbGUsIG9mZmVyIGEgd2lkZSB2YXJpZXR5IG9mCisgICBBUElzIHRoYXQgYXJlIEJTRC1iYXNlZCwgU1lTVi1iYXNlZCwgUE9TSVgtYmFzZWQsIGFuZCBwdXJlbHkgbWFkZSB1cC4KKyAgIFNlZSB0aGUgdHRzc3BkKCksIHR0Z3NwZCgpLCBhbmQgdHRzcGRsaXN0KCkgcm91dGluZXMgaW4gWzM4XWNrdXRpby5jCisgICBmb3IgaWxsdXN0cmF0aW9ucy4KKworICAgVGhlIGxhdGVzdCBlbnRyaWVzIGluIHRoaXMgaG9yc2VyYWNlIGFyZSB0aGUgdGNnZXRzcGVlZCgpIGFuZAorICAgdHRzZXRzcGVlZCgpIHJvdXRpbmVzIGZvdW5kIGluIFVuaXhXYXJlIDcuIFVubGlrZSBvdGhlciBtZXRob2RzLCB0aGV5CisgICBhY2NlcHQgdGhlIGVudGlyZSByYW5nZSBvZiBpbnRlZ2VycyAobG9uZ3MgcmVhbGx5KSBhcyBzcGVlZCB2YWx1ZXMsCisgICByYXRoZXIgdGhhbiBjZXJ0YWluIGNvZGVzLCBhbmQgcmV0dXJuIGFuIGVycm9yIGlmIHRoZSBudW1iZXIgaXMgbm90LAorICAgaW4gZmFjdCwgYSBsZWdhbCBzcGVlZCBmb3IgdGhlIGRldmljZS9kcml2ZXIgaW4gcXVlc3Rpb24uIEluIHRoaXMKKyAgIGNhc2UsIHRoZXJlIGlzIG5vIHdheSB0byBidWlsZCBhIGxpc3Qgb2YgbGVnYWwgc3BlZWRzIGF0IGNvbXBpbGUgdGltZSwKKyAgIHNpbmNlIG5vIEJubm5uIHN5bWJvbHMgYXJlIGRlZmluZWQgKGV4Y2VwdCBmb3IgImRlcHJhY2F0ZWQsIGxlZ2FjeSIKKyAgIGludGVyZmFjZXMgbGlrZSBpb2N0bCgpKSBhbmQgc28gdGhlIGxlZ2FsIHNwZWVkIGxpc3QgbXVzdCBiZQorICAgZW51bWVyYXRlZCBpbiB0aGUgY29kZSAtLSBzZWUgdHRzcGRsaXN0KCkgaW4gWzM5XWNrdXRpby5jLgorCisgICBbIFs0MF1DLUtlcm1pdCBIb21lIF0gWyBbNDFdS2VybWl0IEhvbWUgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuIEZVTExTQ1JFRU4gRklMRSBUUkFOU0ZFUiBESVNQTEFZCisKKyAgIFsgWzQyXVRvcCBdIFsgWzQzXUNvbnRlbnRzIF0gWyBbNDRdTmV4dCBdIFsgWzQ1XVByZXZpb3VzIF0KKworICAgTmV3IHRvIGVkaXQgMTgwIGlzIHN1cHBvcnQgZm9yIGFuIE1TLURPUy1LZXJtaXQtbGlrZSBsb2NhbC1tb2RlIGZ1bGwKKyAgIHNjcmVlbiBmaWxlIHRyYW5zZmVyIGRpc3BsYXksIGFjY29tcGxpc2hlZCB1c2luZyB0aGUgY3Vyc2VzIGxpYnJhcnksCisgICBvciBzb21ldGhpbmcgZXF1aXZhbGVudCAoZm9yIGV4YW1wbGUsIHRoZSBTY3JlZW4gTWFuYWdlciBvbiBERUMgVk1TKS4KKyAgIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbiB5b3VyIENGTEFHUzoKKworICAtRENLX0NVUlNFUworCisgICBhbmQgdGhlbiBjaGFuZ2UgeW91ciBidWlsZCBwcm9jZWR1cmUgKGlmIG5lY2Vzc2FyeSkgdG8gaW5jbHVkZSB0aGUKKyAgIG5lY2Vzc2FyeSBsaWJyYXJpZXMuIEZvciBleGFtcGxlLCBpbiBVbml4IHRoZXNlIGFyZSB1c3VhbGx5ICJjdXJzZXMiCisgICBvciAibmN1cnNlcyIgKGFuZCBtb3JlIHJlY2VubHR5LCAibmN1cnNlc3ciIGFuZCAic2xhbmciKSwgcGVyaGFwcyBhbHNvCisgICAidGVybWNhcCIsICJ0ZXJtbGliIiwgb3IgInRpbmZvIjoKKworICAiTElCUz0gLWxjdXJzZXMgLWx0ZXJtY2FwIgorICAiTElCUz0gLWxjdXJzZXMgLWx0ZXJtbGliIgorICAiTElCUz0gLWxuY3Vyc2VzIgorICAiTElCUz0gLWx0ZXJtbGliIgorICAiTElCUz0gLWx0aW5mbyIKKworICAgIm1hbiBjdXJzZXMiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBhbmQgc2VhcmNoIHRocm91Z2ggdGhlIFVuaXgKKyAgIFs0Nl1tYWtlZmlsZSBmb3IgIkNLX0NVUlNFUyIgdG8gc2VlIG1hbnkgZXhhbXBsZXMsIGFuZCBhbHNvIHNlZSB0aGUKKyAgIHJlbGV2YW50IHNlY3Rpb25zIG9mIHRoZSBbNDddVW5peCBDLUtlcm1pdCBJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zLAorICAgcGFydGljdWxhcmx5IFNlY3Rpb25zIFs0OF00IGFuZCBbNDldOS4yLgorCisgICBUaGVyZSBtaWdodCBzdGlsbCBiZSBhIGNvbXBsaWNhdGlvbi4gU29tZSBpbXBsZW1lbnRhdGlvbnMgb2YgY3Vyc2VzCisgICByZXNlcnZlIHRoZSByaWdodCB0byBhbHRlciB0aGUgYnVmZmVyaW5nIG9uIHRoZSBvdXRwdXQgZmlsZSB3aXRob3V0CisgICByZXN0b3JpbmcgaXQgYWZ0ZXJ3YXJkcywgd2hpY2ggY2FuIGxlYXZlIEtlcm1pdCdzIGNvbW1hbmQgcHJvY2Vzc2luZworICAgaW4gYSBtZXNzIHdoZW4gdGhlIHByb21wdCBjb21lcyBiYWNrIGFmdGVyIGEgZnVsbHNjcmVlbiBmaWxlIHRyYW5zZmVyCisgICBkaXNwbGF5LiBUaGUgdHlwaWNhbCBzeW1wdG9tIGlzIHRoYXQgY2hhcmFjdGVycyB5b3UgdHlwZSBhdCB0aGUgcHJvbXB0CisgICBhZnRlciBhIGxvY2FsLW1vZGUgZmlsZSB0cmFuc2ZlciAoaS5lLiBhZnRlciBzZWVpbmcgdGhlIGN1cnNlcworICAgZmlsZS10cmFuc2ZlciBkaXNwbGF5KSBkbyBub3QgZWNobyB1bnRpbCB5b3UgcHJlc3MgdGhlIFJldHVybiAoRW50ZXIpCisgICBrZXkuIElmIHRoaXMgaGFwcGVucyB0byB5b3UsIHRyeSBhZGRpbmcKKworICAtRENLX05FV1RFUk0KKworICAgdG8geW91ciBtYWtlZmlsZSB0YXJnZXQgKHNlZSBjb21tZW50cyBpbiBzY3JlZW5jKCkgaW4gWzUwXWNrdXVzeC5jIGZvcgorICAgYW4gZXhwbGFuYXRpb24pLgorCisgICBJZiB0aGF0IGRvZXNuJ3QgZml4IHRoZSBwcm9ibGVtLCB0aGVuIHVzZSBhIGJpZ2dlciBoYW1tZXIgYW5kIHJlcGxhY2UKKyAgIC1EQ0tfTkVXVEVSTSB3aXRoOgorCisgIC1ETk9OT1NFVEJVRgorCisgICB3aGljaCB0ZWxscyBLZXJtaXQgdG8gZm9yY2Ugc3Rkb3V0IHRvIGJlIHVuYnVmZmVyZWQgc28gQ0JSRUFLIG1vZGUgY2FuCisgICB3b3JrLgorCisgICBJbiBTQ08gWGVuaXggYW5kIFNDTyBVTklYLCB0aGVyZSBhcmUgdHdvIHNlcGFyYXRlIGN1cnNlcyBsaWJyYXJpZXMsCisgICBvbmUgYmFzZWQgb24gdGVybWNhcCBhbmQgdGhlIG90aGVyIGJhc2VkIG9uIHRlcm1pbmZvLiBUaGUgZGVmYXVsdAorICAgbGlicmFyeSwgdXN1YWxseSB0ZXJtaW5mbywgaXMgZXN0YWJsaXNoZWQgd2hlbiB0aGUgZGV2ZWxvcG1lbnQgc3lzdGVtCisgICBpcyBpbnN0YWxsZWQuIFRvIG1hbnVhbGx5IHNlbGVjdCB0ZXJtaW5mbyAoYXQgY29tcGlsZSB0aW1lKToKKworICBjb21waWxlIC1ETV9URVJNSU5GTyBhbmQgbGluayAtbHRpbmZvCisKKyAgIGFuZCB0byBtYW51YWxseSBzZWxlY3QgdGVybWNhcDoKKworICBjb21waWxlIC1ETV9URVJNQ0FQIGFuZCBsaW5rIC1sdGNhcCAtbHRlcm1saWIKKworICAgPGN1cnNlcy5oPiBsb29rcyBhdCBNX1RFUk1JTkZPIGFuZCBNX1RFUk1DQVAgdG8gZGVjaWRlIHdoaWNoIGhlYWRlcgorICAgZmlsZXMgdG8gdXNlLiAvdXNyL2xpYi9saWJjdXJzZXMuYSBpcyBhIGxpbmsgdG8gZWl0aGVyIGxpYnRpbmZvLmEgb3IKKyAgIGxpYnRjYXAuYS4gVGhlIEMtS2VybWl0IGNvbXBpbGF0aW9uIG9wdGlvbnMgbXVzdCBhZ3JlZSB3aXRoIHRoZQorICAgdmVyc2lvbiBvZiB0aGUgY3Vyc2VzIGxpYnJhcnkgdGhhdCBpcyBhY3R1YWxseSBpbnN0YWxsZWQuCisKKyAgIE5PVEU6IElmIHlvdSBhcmUgZG9pbmcgYW4gQU5TSS1DIGNvbXBpbGF0aW9uIGFuZCB5b3UgZ2V0IGNvbXBpbGUgdGltZQorICAgd2FybmluZ3MgbGlrZSB0aGUgZm9sbG93aW5nOgorCisgIFdhcm5pbmc6IGZ1bmN0aW9uIG5vdCBkZWNsYXJlZCBpbiBja3V1c3guYzogd21vdmUsIHByaW50dywgd2NscnRvZW9sLAorICB3Y2xlYXIsIHdyZWZyZXNoLCBlbmR3aW4sIGV0Yy4uLgorCisgICBpdCBtZWFucyB0aGF0IHlvdXIgPGN1cnNlcy5oPiBmaWxlIGRvZXMgbm90IGNvbnRhaW4gcHJvdG90eXBlcyBmb3IKKyAgIHRoZXNlIGZ1bmN0aW9ucy4gVGhlIHdhcm5pbmdzIHNob3VsZCBiZSBoYXJtbGVzcy4KKworICAgTmV3IHRvIGVkaXQgMTkwIGlzIHRoZSBhYmlsaXR5IHRvIHJlZnJlc2ggYSBtZXNzZWQtdXAgZnVsbC1zY3JlZW4KKyAgIGRpc3BsYXksIGUuZy4gYWZ0ZXIgcmVjZWl2aW5nIGEgYnJvYWRjYXN0IG1lc3NhZ2UuIFRoaXMgZGVwZW5kcyBvbiB0aGUKKyAgIGN1cnNlcyBwYWNrYWdlIGluY2x1ZGluZyB0aGUgd3JlZnJlc2goKSBhbmQgY2xlYXJvaygpIGZ1bmN0aW9ucyBhbmQKKyAgIHRoZSBjdXJzY3IgdmFyaWFibGUuIElmIHlvdXIgdmVyc2lvbiBoYXMgdGhlc2UsIG9yIGhhcyBjb2RlIHRvCisgICBzaW11bGF0ZSB0aGVtLCB0aGVuIGFkZDoKKworICAtRENLX1dSRUZSRVNICisKKyAgIFRoZSBjdXJzZXMgYW5kIHRlcm1jYXAgbGlicmFyaWVzIGFkZCBjb25zaWRlcmFibGUgc2l6ZSB0byB0aGUgcHJvZ3JhbQorICAgaW1hZ2UgKGUuZy4gYWJvdXQgMjBLIG9uIGEgU1VOLTQsIDQwSyBvbiBhIDM4NikuIE9uIHNvbWUgc21hbGwKKyAgIHN5c3RlbXMsIHN1Y2ggYXMgdGhlIEFUJlQgNjMwMCBQTFVTLCBjdXJzZXMgY2FuIHB1c2ggS2VybWl0IG92ZXIgdGhlCisgICBlZGdlLi4uIGV2ZW4gdGhvdWdoIGl0IGNvbXBpbGVzLCBsb2FkcywgYW5kIHJ1bnMgY29ycmVjdGx5LCBpdHMKKyAgIGluY3JlYXNlZCBzaXplIGFwcGFyZW50bHkgbWFrZXMgaXQgc3dhcCBjb25zdGFudGx5LCBzbG93aW5nIGl0IGRvd24gdG8KKyAgIGEgY3Jhd2wsIGV2ZW4gd2hlbiB0aGUgY3Vyc2VzIGRpc3BsYXkgaXMgbm90IGluIHVzZS4gU29tZSBuZXcgbWFrZWZpbGUKKyAgIHRhcmdldHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRha2UgY2FyZSBvZiB0aGlzIChlLmcuIHN5czN1cGNzaGNjKSwgYnV0CisgICBzaW1pbGFyIHRyaWNrcyBtaWdodCBiZSBuZWNlc3NhcnkgaW4gb3RoZXIgY2FzZXMgdG9vLgorCisgICBPbiB0aGUgY3Vyc2VzIGZpbGUtdHJhbnNmZXIgZGlzcGxheSwganVzdCBiZWxvdyB0aGUgInRoZXJtb21ldGVyIiwgaXMKKyAgIGEgcnVubmluZyBkaXNwbGF5IG9mIHRoZSB0cmFuc2ZlciByYXRlLCBhcyBhIGZsYXQgcXVvdGllbnQgb2YgZmlsZQorICAgY2hhcmFjdGVycyBwZXIgZWxhcHNlZCBzZWNvbmRzIHNvIGZhci4gWW91IGNhbiBjaGFuZ2UgdGhpcyB0byBhbgorICAgYXZlcmFnZSB0aGF0IGdpdmVzIGdyZWF0ZXIgd2VpZ2h0IHRvIHJlY2VudCBoaXN0b3J5ICgwLjI1ICoKKyAgIGluc3RhbnRhbmVvdXMgY3BzICsgMC43NSAqIGhpc3RvcmljYWwgY3BzKSBieSBhZGRpbmcgLURDUFNfV0VJR0hURUQgdG8KKyAgIHlvdXIgQ0ZMQUdTIChzb3JyeSBmb2xrcywgdGhpcyBvbmUgaXMgbm90IHdvcnRoIGEgU0VUIGNvbW1hbmQpLiBZb3UKKyAgIGNhbiBjaG9vc2UgYSBzZWNvbmQgdHlwZSBvZiB3ZWlnaHRlZCBhdmVyYWdlIGluIHdoaWNoIHRoZSB3ZWlnaHRpbmcKKyAgIHNtb290aHMgb3V0IHByb2dyZXNzaXZlbHkgYXMgdGhlIHRyYW5zZmVyIHByb2dyZXNzZXMgYnkgYWRkaW5nCisgICAtRENQU19WSU5DRSB0byAtRENQU19XRUlHSFRFRC4KKworICAgQW4gYWx0ZXJuYXRpdmUgdG8gY3Vyc2VzIGlzIGFsc28gYXZhaWxhYmxlIGF0IGNvbXBpbGUgdGltZSwgYnV0IHNob3VsZAorICAgYmUgc2VsZWN0ZWQgaWYgeW91ciB2ZXJzaW9uIG9mIEtlcm1pdCBpcyB0byBiZSBydW4gaW4gbG9jYWwgbW9kZSBvbmx5CisgICBpbiBhbiBBTlNJIHRlcm1pbmFsIGVudmlyb25tZW50LCBmb3IgZXhhbXBsZSBvbiBhIGRlc2t0b3Agd29ya3N0YXRpb24KKyAgIHRoYXQgaGFzIGFuIEFOU0kgY29uc29sZSBkcml2ZXIuIFRvIHNlbGVjdCB0aGlzIG9wdGlvbiBpbiBwbGFjZSBvZgorICAgY3Vyc2VzLCBkZWZpbmUgdGhlIHN5bWJvbCBNWUNVUlNFUzoKKworICAtRE1ZQ1VSU0VTCisKKyAgIGluc3RlYWQgb2YgQ0tfQ1VSU0VTLiBUaGUgTVlDVVJTRVMgb3B0aW9uIHVzZXMgYnVpbHQtaW4gQU5TSSAoVlQxMDApCisgICBlc2NhcGUgc2VxdWVuY2VzLCBhbmQgZGVwZW5kcyB1cG9uIHlvdXIgdGVybWluYWwgb3IgY29uc29sZSBkcml2ZXIgdG8KKyAgIGludGVycHJldCB0aGVtIGNvcnJlY3RseS4KKworICAgSW4gc29tZSBDLUtlcm1pdCBidWlsZHMsIHdlIHJlcGxhY2UgcHJpbnRmKCkgdmlhICNkZWZpbmUgcHJpbnRmLi4uCisgICBIb3dldmVyLCB0aGlzIGNhbiBjYXVzZSBjb25mbGljdHMgd2l0aCB0aGUgW25dY3Vyc2VzIGhlYWRlciBmaWxlcy4KKyAgIFZhcmlvdXMgaGFja3MgYXJlIHJlcXVpcmVkIHRvIGdldCBhcm91bmQgdGhpcyAtLSBzZWUgWzUxXWNrdXRpby5jLAorICAgWzUyXWNrdWZpby5jLCBbNTNdY2t1dXN4LmMsIFs1NF1ja3VjbWQuYywgZXRjLgorCisgICBbIFs1NV1DLUtlcm1pdCBIb21lIF0gWyBbNTZdS2VybWl0IEhvbWUgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDQuIENIQVJBQ1RFUiBTRVRTCisKKyAgIFsgWzU3XVRvcCBdIFsgWzU4XUNvbnRlbnRzIF0gWyBbNTldTmV4dCBdIFsgWzYwXVByZXZpb3VzIF0KKworICAgU2luY2UgdmVyc2lvbiA1QSwgQy1LZXJtaXQgaGFzIGluY2x1ZGVkIHN1cHBvcnQgZm9yIGNvbnZlcnNpb24gb2YKKyAgIGNoYXJhY3RlciBzZXRzIGZvciBXZXN0ZXJuIEV1cm9wZWFuIGxhbmd1YWdlcyAoaS5lLiBsYW5ndWFnZXMgdGhhdAorICAgb3JpZ2luYXRlZCBpbiBXZXN0ZXJuIEV1cm9wZSwgYnV0IGFyZSBub3cgYWxzbyBzcG9rZW4gaW4gdGhlIFdlc3Rlcm4KKyAgIEhlbWlzcGhlcmUgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSB3b3JsZCksIHZpYSBJU08gODg1OS0xIExhdGluCisgICBBbHBoYWJldCAxLCBmb3IgRWFzdGVybiBFdXJvcGVhbiBsYW5ndWFnZXMgKElTTyBMYXRpbi0yKSwgSGVicmV3IChhbmQKKyAgIFlpZGRpc2gpLCBHcmVlaywgYW5kIEN5cmlsbGljLWFscGhhYmV0IGxhbmd1YWdlcyAoSVNPIExhdGluL0N5cmlsbGljKS4KKyAgIE1hbnkgZmlsZSAobG9jYWwpIGNoYXJhY3RlciBzZXRzIGFyZSBzdXBwb3J0ZWQ6IElTTyA2NDYgNy1iaXQgbmF0aW9uYWwKKyAgIHNldHMsIElCTSBjb2RlIHBhZ2VzLCBBcHBsZSwgREVDLCBERywgTmVYVCwgZXRjLgorCisgICBUbyBidWlsZCBLZXJtaXQgd2l0aCBubyBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGF0IGFsbCwgaW5jbHVkZQorICAgLUROT0NTRVRTIGluIHRoZSBDRkxBR1MuIFRvIGJ1aWxkIHdpdGggbm8gTGF0aW4tMiwgYWRkIC1ETk9MQVRJTjIuIFRvCisgICBidWlsZCB3aXRoIG5vIEN5cmlsbGljLCBhZGQgLUROT0NZUklMLiBUbyBvbWl0IEhlYnJldywgYWRkIC1ETk9IRUJSRVcuCisgICBJZiAtRE5PQ1NFVFMgaXMgKm5vdCogaW5jbHVkZWQsIHlvdSdsbCBhbHdheXMgZ2V0IExBVElOMS4gVG8gYnVpbGQKKyAgIHdpdGggbm8gS0FOSkkgaW5jbHVkZSAtRE5PS0FOSkkuIFRoZXJlIGlzIHByZXNlbnRseSBubyB3YXkgdG8gaW5jbHVkZQorICAgTGF0aW4tMiwgQ3lyaWxsaWMsIEhlYnJldywgb3IgS2Fuamkgd2l0aG91dCBhbHNvIGluY2x1ZGluZyBMYXRpbi0xLgorCisgICBbNjFdVW5pY29kZSBzdXBwb3J0IHdhcyBhZGRlZCBpbiBDLUtlcm1pdCA3LjAsIGFuZCBpdCBhZGRzIGEgZmFpcgorICAgYW1vdW50IG9mIHRhYmxlcyBhbmQgY29kZSAoYW5kIHRoaXMgaXMgb25seSBhICJMZXZlbCAxIiBpbXBsZW1lbnRhdGlvbgorICAgLS0gYSBoaWdoZXIgbGV2ZWwgd291bGQgYWxzbyByZXF1aXJlIGJ1aWxkaW5nIGluIHRoZSBlbnRpcmUgVW5pY29kZQorICAgZGF0YWJhc2UpLiBPbiBhIFBDIHdpdGggUkggNS4yIExpbnV4LCBidWlsZGluZyBDLUtlcm1pdCA3LjAsIHdlIGdldAorICAgdGhlIGZvbGxvd2luZyBzaXplczoKKworICBOT0NTRVRTIE5PVU5JQ09ERSBOT0tBTkpJICAgQmVmb3JlICAgIEFmdGVyICAgICAgICAgICAgICAgICAgCisgICBbICAgXSAgICBbICAgXSAgICBbICAgXSAgICAxMzI5MDE0ICAgKEZ1bGwpCisgICBbICAgXSAgICBbICAgXSAgICBbIFggXSAgICAxMzI1Njg2ICAgKFVuaWNvZGUgYnV0IG5vIEthbmppKQorICAgWyAgIF0gICAgWyBYIF0gICAgWyAgIF0gICAgMTE1ODgzNyAgIChBbGwgY2hhcnNldHMgZXhjZXB0IFVuaWNvZGUpCisgICBbIFggXSAgICBbIHggXSAgICBbIHggXSAgICAxMDkwODQ1ICAgKE5PQ1NFVFMgaW1wbGllcyB0aGUgb3RoZXIgdHdvKQorCisgICBOb3RlLCBieSB0aGUgd2F5LCB0aGF0IE5PS0FOSkkgd2l0aG91dCBOT1VOSUNPREUgb25seSByZW1vdmVzIHRoZQorICAgbm9uLVVuaWNvZGUgS2Fuamkgc2V0cyAoU2hpZnQtSklTLCBFVUMtSlAsIEpJUy03LCBldGMpLiBLYW5qaSBpcyBzdGlsbAorICAgcmVwcmVzZW50YWJsZSBpbiBVQ1MtMiBhbmQgVVRGLTguCisKKyAgIFsgWzYyXUMtS2VybWl0IEhvbWUgXSBbIFs2M11LZXJtaXQgSG9tZSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNS4gQVBDIEVYRUNVVElPTgorCisgICBbIFs2NF1Ub3AgXSBbIFs2NV1Db250ZW50cyBdIFsgWzY2XU5leHQgXSBbIFs2N11QcmV2aW91cyBdCisKKyAgIFRoZSBLZXJtaXQgQ09OTkVDVCBhbmQgSU5QVVQgY29tbWFuZHMgYXJlIGNvZGVkIHRvIGV4ZWN1dGUgQXBwbGljYXRpb24KKyAgIFByb2dyYW0gQ29tbWFuZCBlc2NhcGUgc2VxdWVuY2VzIGZyb20gdGhlIGhvc3Q6CisKKyAgPEVTQz5fPHRleHQ+PEVTQz5cCisKKyAgIHdoZXJlIDx0ZXh0PiBpcyBhIEMtS2VybWl0IGNvbW1hbmQsIG9yIGEgbGlzdCBvZiBDLUtlcm1pdCBjb21tYW5kcworICAgc2VwYXJhdGVkIGJ5IGNvbW1hcywgdXAgdG8gYWJvdXQgMUsgaW4gbGVuZ3RoLgorCisgICBUbyBkYXRlLCB0aGlzIGZlYXR1cmUgaGFzIGJlZW4gaW5jbHVkZWQgaW4gdGhlIE9TLzIsIFdpbmRvd3MsIFZNUywKKyAgIE9TLTksIGFuZCBVbml4IHZlcnNpb25zLCBmb3Igd2hpY2ggdGhlIHN5bWJvbDoKKworICBDS19BUEMKKworICAgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5IGluIFs2OF1ja3V1c3IuaC4gRm9yIE9TLzIsIEFQQyBpcyBlbmFibGVkIGF0CisgICBydW50aW1lIGJ5IGRlZmF1bHQsIGZvciBVTklYIGl0IGlzIGRpc2FibGVkLiBJdCBpcyBjb250cm9sbGVkIGJ5IHRoZQorICAgU0VUIFRFUk1JTkFMIEFQQyBjb21tYW5kLiBDb25maWd1cmluZyBBUEMgY2FwYWJpbGl0eSBpbnRvIGEgdmVyc2lvbgorICAgdGhhdCBnZXRzIGl0IGJ5IGRlZmF1bHQgKGJlY2F1c2UgQ0tfQVBDIGlzIGRlZmluZWQgaW4gWzY5XWNrdXVzci5oKQorICAgY2FuIGJlIG92ZXJyaWRkZW4gYnkgaW5jbHVkaW5nOgorCisgIC1ETk9BUEMKKworICAgb24gdGhlIENDIGNvbW1hbmQgbGluZS4KKworICAgQy1LZXJtaXQncyBhdXRvZG93bmxvYWQgZmVhdHVyZSBkZXBlbmRzIG9uIHRoZSBBUEMgZmVhdHVyZSwgc28KKyAgIGRlY29uZmlndXJpbmcgQVBDIGFsc28gZGlzYWJsZXMgYXV0b2Rvd25sb2FkIChpdCBkb2Vzbid0IHVzZSBBUEMKKyAgIGVzY2FwZSBzZXF1ZW5jZXMsIGJ1dCB1c2VzIHRoZSBBUEMgc3dpdGNoaW5nIG1lY2hhbmlzbSBpbnRlcm5hbGx5KS4KKworICAgWyBbNzBdQy1LZXJtaXQgSG9tZSBdIFsgWzcxXUtlcm1pdCBIb21lIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA2LiBQUk9HUkFNIFNJWkUKKworICAgWyBbNzJdVG9wIF0gWyBbNzNdQ29udGVudHMgXSBbIFs3NF1OZXh0IF0gWyBbNzVdUHJldmlvdXMgXQorCisgICBTRUNUSU9OIENPTlRFTlRTCisKKyAgNi4xLiBbNzZdRmVhdHVyZSBTZWxlY3Rpb24KKyAgNi4yLiBbNzddQ2hhbmdpbmcgQnVmZmVyIFNpemVzCisgIDYuMy4gWzc4XU90aGVyIFNpemUtUmVsYXRlZCBJdGVtcworICA2LjQuIFs3OV1TcGFjZS9UaW1lIFRyYWRlb2ZmcworCisgICAoQWxzbyBzZWUgWzgwXVNlY3Rpb24gNCkKKworICAgRWFjaCByZWxlYXNlIG9mIEMtS2VybWl0IGlzIGxhcmdlciB0aGFuIHRoZSBsYXN0LiBPbiBzb21lIGNvbXB1dGVycworICAgKHVzdWFsbHkgb2xkIG9uZXMpIHRoZSBzaXplIG9mIHRoZSBwcm9ncmFtIHByZXZlbnRzIGl0IGZyb20gYmVpbmcKKyAgIHN1Y2Nlc3NmdWxseSBsaW5rZWQgYW5kIGxvYWRlZC4gT24gc29tZSBvdGhlcnMgKGFsc28gdXN1YWxseSBvbGQKKyAgIG9uZXMpLCBpdCBvY2N1cGllcyBzbyBtdWNoIG1lbW9yeSB0aGF0IGl0IGlzIGNvbnN0YW50bHkgc3dhcHBpbmcgb3IKKyAgIHBhZ2luZy4gSW4gc3VjaCBjYXNlcywgeW91IGNhbiByZWR1Y2UgQy1LZXJtaXQncyBzaXplIGluIHZhcmlvdXMgd2F5cywKKyAgIG91dGxpbmVkIGluIHRoaXMgc2VjdGlvbi4gVGhlIGZvbGxvd2luZyBvcHRpb25zIGNhbiBjdXQgZG93biBvbiB0aGUKKyAgIHByb2dyYW0ncyBzaXplIGF0IGNvbXBpbGUgdGltZSBieSByZW1vdmluZyBmZWF0dXJlcyBvciBjaGFuZ2luZyB0aGUKKyAgIHNpemUgb2Ygc3RvcmFnZSBhcmVhcy4KKworICAgSWYgeW91IGFyZSByZWFkaW5nIHRoaXMgc2VjdGlvbiBiZWNhdXNlIGFsbCB5b3Ugd2FudCBpcyBhIHNtYWxsLCBmYXN0LAorICAgcXVpY2stdG8tbG9hZCBLZXJtaXQgZmlsZS10cmFuc2ZlciBhcHBsaWNhdGlvbiBmb3IgdGhlIHJlbW90ZSBlbmQgb2YKKyAgIHlvdXIgY29ubmVjdGlvbiwgYW5kIHRoZSByZW1vdGUgZW5kIGlzIFVuaXggYmFzZWQsIHRha2UgYSBsb29rIGF0CisgICBHLUtlcm1pdDoKKworICBbODFdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2drZXJtaXQuaHRtbAorCisgIDYuMS4gRmVhdHVyZSBTZWxlY3Rpb24KKworICAgRmVhdHVyZXMgY2FuIGJlIGFkZGVkIG9yIHJlbW92ZWQgYnkgZGVmaW5pbmcgc3ltYm9scyBvbiB0aGUgQ0MgKEMKKyAgIGNvbXBpbGVyKSBjb21tYW5kIGxpbmUuICItRCIgaXMgdGhlIG5vcm1hbCBDQyBkaXJlY3RpdmUgdG8gZGVmaW5lIGEKKyAgIHN5bWJvbCBzbywgZm9yIGV4YW1wbGUsICItRE5PREVCVUciIGRlZmluZXMgdGhlIHN5bWJvbCBOT0RFQlVHLiBTb21lIEMKKyAgIGNvbXBpbGVycyBtaWdodCB1c2UgZGlmZmVyZW50IHN5bnRheCwgZS5nLiAiLWQgTk9ERUJVRyIgb3IKKyAgICIvREVGSU5FPU5PREVCVUciLiBGb3IgQyBjb21waWxlcnMgdGhhdCBkbyBub3QgYWNjZXB0IGNvbW1hbmQtbGluZQorICAgZGVmaW5pdGlvbnMsIHlvdSBjYW4gcHV0IHRoZSBjb3JyZXNwb25kaW5nICNkZWZpbmUgc3RhdGVtZW50cyBpbiB0aGUKKyAgIGZpbGUgY2tjc3ltLmgsIGZvciBleGFtcGxlOgorCisgICNkZWZpbmUgTk9ERUJVRworCisgICBUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSBzYXZpbmdzIGFjaGlldmVkIHdoZW4gYnVpbGRpbmcgQy1LZXJtaXQKKyAgIDguMCAoQmV0YS4wNCkgd2l0aCBzZWxlY3RlZCBmZWF0dXJlLWRlc2VsZWN0aW9uIHN3aXRjaGVzIG9uIGFuCisgICBJbnRlbC1iYXNlZCBQQyB3aXRoIFJlZCBIYXQgTGludXggNy4wIGFuZCBnY2MgMi45Ni4gVGhlIHNpemVzIGFyZSBmb3IKKyAgIG5vbi1zZWN1cml0eSBidWlsZHMuIFRoZSBmdWxseSBjb25maWd1cmVkIG5vbi1zZWN1cml0eSBidWlsZCBpcworICAgMjEyNzQwOCBieXRlcy4KKworICBPcHRpb24gICAgICBTaXplICAgIFNhdmluZ3MgRWZmZWN0CisgIE5PSUNQICAgICAgICA1NDUzMzAgICA3NC40JSBObyBJbnRlcmFjdGl2ZSBDb21tYW5kIFBhcnNlciAoY29tbWFuZC1saW5lIG9ubHkpCisgIE5PTE9DQUwgICAgIDE1Mzk5OTQgICAyNy42JSBObyBtYWtpbmcgY29ubmVjdGlvbnMuCisgIE5PWEZFUiAgICAgIDE1NTExMDggICAyNy4xJSBObyBmaWxlIHRyYW5zZmVyLgorICBJS1NET05MWSAgICAxNTY2NjA4ICAgMjYuNCUgSW50ZXJuZXQgS2VybWl0IFNlcnZlciBvbmx5LgorICBOT0NTRVRTICAgICAxNzUwMDk3ICAgMTcuNyUgTm8gY2hhcmFjdGVyLXNldCBjb252ZXJzaW9uLgorICBOT1NQTCAgICAgICAxODAwMjkzICAgMTUuNCUgTm8gU2NyaXB0IFByb2dyYW1taW5nIExhbmd1YWdlLgorICBOT05FVCAgICAgICAxODA4NTc1ICAgMTUuMCUgTm8gbWFraW5nIG5ldHdvcmsgY29ubmVjdGlvbnMuCisgIE5PVU5JQ09ERSAgIDE4MzQ0MjYgICAxMy44JSBObyBVbmljb2RlIGNoYXJhY3Rlci1zZXQgY29udmVyc2lvbi4KKyAgTk9IRUxQICAgICAgMTgzNzg3NyAgIDEzLjYlIE5vIGJ1aWx0LWluIGhlbHAgdGV4dC4KKyAgTk9ERUJVRyAgICAgMTg5MTY2OSAgIDExLjElIE5vIGRlYnVnIGxvZy4KKyAgTk9GUklMTFMgICAgMTkxODk2NiAgICA5LjglIE5vICJmcmlsbHMiLgorICBOT0ZUUCAgICAgICAxOTcyNDk2ICAgIDcuMyUgTm8gRlRQIGNsaWVudC4KKyAgTk9ESUFMICAgICAgMTk4NDQ4OCAgICA2LjclIE5vIGF1dG9tYXRpYyBtb2RlbSBkaWFsaW5nLgorICBOT1BVU0ggICAgICAyMDcwMTg0ICAgIDIuNyUgTm8gc2hlbGwgYWNjZXNzLCBydW5uaW5nIGV4dGVybmFsIHByb2dyYW1zLCBldGMuCisgIE5PSUtTRCAgICAgIDIwNzQxMjkgICAgMi41JSBObyBJbnRlcm5ldCBLZXJtaXQgU2VydmVyIGNhcGFiaWxpdHkuCisgIE5PSFRUUCAgICAgIDIwODI2MTAgICAgMi4xJSBObyBIVFRQIGNsaWVudC4KKyAgTk9GTE9BVCAgICAgMjA5MTMzMiAgICAxLjclIE5vIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMuCisgIE5PQ0hBTk5FTElPIDIwOTU5NzggICAgMS41JSBObyBGT1BFTi9GUkVBRC9GV1JJVEUvRkNMT1NFLCBldGMuCisgIE1JTklESUFMICAgIDIwOTgwMzUgICAgMS40JSBObyBidWlsdC1pbiBzdXBwb3J0IGZvciBtYW55IGtpbmRzIG9mIG1vZGVtcy4KKyAgTk9TRVJWRVIgICAgMjA5ODk4NyAgICAxLjMlIE5vIHNlcnZlciBtb2RlLgorICBOT1NFWFAgICAgICAyMTA1ODk4ICAgIDEuMCUgTm8gUy1FeHByZXNzaW9ucy4KKyAgTk9QVFkgICAgICAgMjExNzc0MyAgICAwLjUlIE5vIHBzZXVkb3Rlcm1pbmFsIHN1cHBvcnQuCisgIE5PUkxPR0lOICAgIDIxMjEwODkgICAgMC4zJSBObyBSTE9HSU4gY29ubmVjdGlvbnMuCisgIE5PT0xETU9ERU1TIDIxMjQwMzggICAgMC4yJSBObyBidWlsdC1pbiBzdXBwb3J0IGZvciBvbGQga2luZHMgb2YgbW9kZW1zLgorICBOT1NTSCAgICAgICAyMTI1Njk2ICAgIDAuMSUgTm8gU1NIIGNvbW1hbmQuCisKKyAgIEFuZCBoZXJlIGFyZSBhIGZldyBjb21iaW5hdGlvbnMKKworICAgT3B0aW9ucyBTaXplIFNhdmluZ3MgRWZmZWN0CisgICBOT0RFQlVHIE5PSUNQIE5PQ1NFVFMgTk9MT0NBTCAyODE2NDEgODYuNyUgTm8gZGVidWcgbG9nLCBwYXJzZXIsCisgICBjaGFyYWN0ZXIgc2V0cywgb3IgbWFraW5nIGNvbm5lY3Rpb25zLgorICAgTk9JQ1AgTk9DU0VUUyBOT0xPQ0FMIDM3NjQ2OCA4Mi4zJSBObyBwYXJzZXIsIGNoYXJhY3RlciBzZXRzLCBvcgorICAgbWFraW5nIGNvbm5lY3Rpb25zLgorICAgTk9JQ1AgTk9DU0VUUyBOT05FVCA0Mjc1MTAgNzkuOSUgTm8gcGFyc2VyLCBjaGFyYWN0ZXIgc2V0cywgb3IgbmV0d29yaworICAgY29ubmVjdGlvbnMuCisgICBOT1NQTCBOT0NTRVRTIDE0MjM3ODQgMzMuMSUgTm8gc2NyaXB0IGxhbmd1YWdlLCBvciBjaGFyYWN0ZXIgc2V0cy4KKworICAgLUROT0ZSSUxMUyByZW1vdmVzIHZhcmlvdXMgY29tbWFuZCBzeW5vbnltczsgdGhlIGZvbGxvd2luZyB0b3AtbGV2ZWwKKyAgIGNvbW1hbmRzOiBDTEVBUiwgREVMRVRFLCBESVNBQkxFLCBFTkFCTEUsIEdFVE9LLCBNQUlMLCBSRU5BTUUsIFRZUEUsCisgICBXSE87IGFuZCB0aGUgZm9sbG93aW5nIFJFTU9URSBjb21tYW5kczogS0VSTUlULCBMT0dJTiwgTE9HT1VULCBQUklOVCwKKyAgIFRZUEUsIFdITy4KKworICA2LjIuIENoYW5naW5nIEJ1ZmZlciBTaXplcworCisgICBNb3N0IG1vZGVybiBjb21wdXRlcnMgaGF2ZSBzbyBtdWNoIG1lbW9yeSB0aGF0IChhKSB0aGVyZSBpcyBubyBuZWVkIHRvCisgICBzY3JpbXAgYW5kIHNhdmUsIGFuZCAoYikgQy1LZXJtaXQsIGV2ZW4gd2hlbiBmdWxseSBjb25maWd1cmVkLCBpcworICAgcmVsYXRpdmVseSBzbWFsbCBieSB0b2RheSdzIHN0YW5kYXJkcy4KKworICAgVHdvIG1ham9yIGZhY3RvcnMgYWZmZWN0IEtlcm1pdCdzIHNpemU6IGZlYXR1cmUgc2VsZWN0aW9uIGFuZCBidWZmZXIKKyAgIHNpemVzLiBCdWZmZXIgc2l6ZXMgYWZmZWN0IHN1Y2ggdGhpbmdzIGFzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgYQorICAgS2VybWl0IHBhY2tldCwgdGhlIG1heGltdW0gbGVuZ3RoIGZvciBhIGNvbW1hbmQsIGZvciBhIG1hY3JvLCBmb3IgdGhlCisgICBuYW1lIG9mIGEgbWFjcm8sIGV0Yy4gQmlnIGJ1ZmZlciBzaXplcyBhcmUgdXNlZCB3aGVuIHRoZSBmb2xsb3dpbmcKKyAgIHN5bWJvbCBpcyBkZWZpbmVkOgorCisgIEJJR0JVRk9LCisKKyAgIGFzIGl0IGlzIGJ5IGRlZmF1bHQgZm9yIG1vc3QgbW9kZXJuIHBsYXRmb3JtcyAoTGludXgsIEFJWCA0IGFuZCA1LAorICAgSFAtVVggMTAgYW5kIDExLCBTb2xhcmlzLCBldGMpIGluIFs4Ml1ja3V1c3IuaC4gSWYgeW91ciBidWlsZCBkb2VzIG5vdAorICAgZ2V0IGJpZyBidWZmZXJzIGF1dG9tYXRpY2FsbHkgKFNIT1cgRkVBVFVSRVMgdGVsbHMgeW91KSwgeW91IGNhbgorICAgaW5jbHVkZSB0aGVtIGJ5IHJlYnVpbGRpbmcgd2l0aCBCSUdCVUZPSyBkZWZpbmVkOyBlLmcuIGluIFVuaXg6CisKKyAgbWFrZSB4eHh4IEtGTEFHUz0tREJJR0JVRk9LCisKKyAgIHdoZXJlIHh4eHggaXMgdGhlIG1ha2VmaWxlIHRhcmdldC4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSB3YW50IHRvCisgICBidWlsZCB3aXRob3V0IGJpZyBidWZmZXJzIHdoZW4gdGhleSBub3JtYWxseSB3b3VsZCBiZSBzZWxlY3RlZCwgdXNlOgorCisgIG1ha2UgeHh4eCBLRkxBR1M9LUROT0JJR0JVRgorCisgICBUaGVyZSBhcmUgb3B0aW9ucyB0byBjb250cm9sIEtlcm1pdCdzIHBhY2tldCBidWZmZXIgYWxsb2NhdGlvbnMuIFRoZQorICAgZm9sbG93aW5nIHN5bWJvbHMgYXJlIGRlZmluZWQgaW4gWzgzXWNrY2tlci5oIGluIHN1Y2ggYSB3YXkgdGhhdCB5b3UKKyAgIGNhbiBvdmVycmlkZSB0aGVtIGJ5IHJlZGVmaW5pbmcgdGhlbSBpbiBDRkxBR1M6CisKKyAgLURNQVhTUD14eHh4IC0gTWF4aW11bSBzZW5kLXBhY2tldCBsZW5ndGguCisgIC1ETUFYUlA9eHh4eCAtIE1heGltdW0gcmVjZWl2ZS1wYWNrZXQgbGVuZ3RoLgorICAtRFNCU0laPXh4eHggLSBUb3RhbCBhbGxvY2F0aW9uIGZvciBzZW5kLXBhY2tldCBidWZmZXJzLgorICAtRFJCU0laPXh4eHggLSBUb3RhbCBhbGxvY2F0aW9uIGZvciByZWNlaXZlLXBhY2tldCBidWZmZXJzLgorCisgICBUaGUgZGVmYXVsdHMgZGVwZW5kIG9uIHRoZSBwbGF0Zm9ybS4KKworICAgVXNpbmcgZHluYW1pYyBhbGxvY2F0aW9uICgtRERZTkFNSUMpIHJlZHVjZXMgc3RvcmFnZSByZXF1aXJlbWVudHMgZm9yCisgICB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIG9uIGRpc2ssIGFuZCBhbGxvd3MgbW9yZSBhbmQgYmlnZ2VyIHBhY2tldHMgYXQKKyAgIHJ1bnRpbWUuIFRoaXMgaGFzIHByb3ZlbiBzYWZlIG92ZXIgdGhlIHllYXJzLCBhbmQgbm93IG1vc3QgYnVpbGRzCisgICAoZS5nLiBhbGwgVW5peCwgVk1TLCBXaW5kb3dzLCBhbmQgT1MvMiBvbmVzKSB1c2UgZHluYW1pYyBtZW1vcnkKKyAgIGFsbG9jYXRpb24gYnkgZGVmYXVsdC4gSWYgaXQgY2F1c2VzIHRyb3VibGUsIGhvd2V2ZXIsIHRoZW4gb21pdCB0aGUKKyAgIC1ERFlOQU1JQyBvcHRpb24gZnJvbSBDRkxBR1MsIG9yIGFkZCAtRE5PRFlOQU1JQy4KKworICA2LjMuIE90aGVyIFNpemUtUmVsYXRlZCBJdGVtcworCisgICBUbyBtYWtlIEtlcm1pdCBjb21waWxlIGFuZCBsb2FkIHN1Y2Nlc3NmdWxseSwgeW91IG1pZ2h0IGhhdmUgdG8gY2hhbmdlCisgICB5b3VyIGJ1aWxkIHByb2NlZHVyZSB0bzoKKworICAgIGEuIFJlcXVlc3QgYSBsYXJnZXIgKCJsYXJnZSIgb3IgImh1Z2UiKSBjb21waWxhdGlvbiAvIGNvZGUtZ2VuZXJhdGlvbgorICAgICAgIG1vZGVsLiBUaGlzIGlzIG5lZWRlZCBmb3IgMTYtYml0IFBDLWJhc2VkIFVOSVggdmVyc2lvbnMgKG1vc3Qgb3IKKyAgICAgICBhbGwgb2Ygd2hpY2ggZmFpbCB0byBidWlsZCBDLUtlcm1pdCA3LjAgYW5kIGxhdGVyIGFueXdheSkuIFRoaXMgaXMKKyAgICAgICB0eXBpY2FsbHkgZG9uZSB3aXRoIGEgLU0gYW5kL29yIC1GIHN3aXRjaCAoc2VlIHlvdXIgY2MgbWFudWFsIG9yCisgICAgICAgbWFuIHBhZ2UgZm9yIGRldGFpbHMpLgorICAgIGIuIFNvbWUgZGV2ZWxvcG1lbnQgc3lzdGVtcyBzdXBwb3J0IG92ZXJsYXlzLiBJZiB0aGUgcHJvZ3JhbSBpcyB0b28KKyAgICAgICBiaWcgdG8gYmUgYnVpbHQgYXMgaXMsIGNoZWNrIHlvdXIgbG9hZGVyIG1hbnVhbCAoIm1hbiBsZCIpIHRvIHNlZQorICAgICAgIGlmIGFuIG92ZXJsYXkgZmVhdHVyZSBpcyBhdmFpbGFibGUuIFNlZSB0aGUgMi4xMC8yLjExIEJTRCBleGFtcGxlCisgICAgICAgaW4gdGhlIFVOSVggbWFrZWZpbGUuIChBY3R1YWxseSwgYXMgb2YgdmVyc2lvbiA3LjAsIEMtS2VybWl0IGlzCisgICAgICAgdG9vIGJpZyB0byBidWlsZCwgcGVyaW9kLCBldmVuIHdpdGggb3ZlcmxheXMsIG9uIDIueHggQlNEKS4KKyAgICBjLiBTaW1pbGFybHksIHNvbWUgc21hbGwgYW5kL29yIHNlZ21lbnQtYmFzZWQgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0CisgICAgICAgImNvZGUgbWFwcGluZyIsIHdoaWNoIGlzIHNpbWlsYXIgdG8gb3ZlcmxheXMgKFBEUDExLWJhc2VkIFZFTklYCisgICAgICAgMS4wLCBjaXJjYSAxOTg0LCB3YXMgYW4gZXhhbXBsZSkuIFNlZSB0aGUgbGlua2VyIGRvY3VtZW50YXRpb24gb24KKyAgICAgICB0aGUgYWZmZWN0ZWQgcGxhdGZvcm0uCisKKyAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZQorICAgaW4gc2V2ZXJhbCBvdGhlciB3YXlzOgorCisgICAgYS4gSW5jbHVkZSB0aGUgLU8gKG9wdGltaXplKSBjb21waWxlciBzd2l0Y2ggaWYgaXQgaXNuJ3QgYWxyZWFkeQorICAgICAgIGluY2x1ZGVkIGluIHlvdXIgIm1ha2UiIGVudHJ5IChhbmQgaWYgaXQgd29ya3MhKS4gSWYgeW91ciBjb21waWxlcgorICAgICAgIHN1cHBvcnRzIGhpZ2hlciBsZXZlbHMgb2Ygb3B0aW1pemF0aW9uIChlLmcuIC1PMiBvciBoaWdoZXIgbnVtYmVyLAorICAgICAgIC1Pbm9saW1pdCAoSFAtVVgpLCBldGMpLCB0cnkgdGhlbTsgdGhlIGdyZWF0ZXIgdGhlIGxldmVsIG9mCisgICAgICAgb3B0aW1pemF0aW9uLCB0aGUgbG9uZ2VyIHRoZSBjb21waWxhdGlvbiBhbmQgbW9yZSBsaWtlbHkgdGhlCisgICAgICAgY29tcGlsZXIgd2lsbCBydW4gb3V0IG9mIG1lbW9yeS4gVGhlIHRoZSBsYXR0ZXIgZXZlbnR1YWxpdHksIHNvbWUKKyAgICAgICBjb21waWxlcnMgYWxzbyBwcm92aWRlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGFsbG9jYXRlIG1vcmUKKyAgICAgICBtZW1vcnkgZm9yIHRoZSBvcHRpbWl6ZXIsIGxpa2UgIi1PbGltaXQgbnVtYmVyIiBpbiBVbHRyaXguCisgICAgYi4gSWYgeW91ciBwbGF0b2ZybSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLCBjaGFuZ2UgdGhlIG1ha2UgZW50cnkKKyAgICAgICB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGZlYXR1cmUuIFRoZSB3YXkgdG8gZG8gdGhpcyBpcywgb2YKKyAgICAgICBjb3Vyc2UsIHBsYXRmb3JtIGRlcGVuZGVudDsgc2VlIHRoZSBOZVhUIG1ha2VmaWxlIHRhcmdldCBmb3IgYW4KKyAgICAgICBleGFtcGxlLiBzb21lIHBsYXRmb3JtcyAobGlrZSBTb2xhcmlzKSBkbyBpdCBhdXRvbWF0aWNhbGx5IGFuZAorICAgICAgIGdpdmUgeW91IG5vIGNob2ljZS4gQnV0IHdhdGNoIG91dDogZXhlY3V0YWJsZXMgbGlua2VkIHdpdGggc2hhcmVkCisgICAgICAgbGlicmFyaWVzIGFyZSBsZXNzIHBvcnRhYmxlIHRoYW4gc3RhdGljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMuCisgICAgYy4gU3RyaXAgdGhlIHByb2dyYW0gaW1hZ2UgYWZ0ZXIgYnVpbGRpbmcgKCJtYW4gc3RyaXAiIGZvciBmdXJ0aGVyCisgICAgICAgaW5mbyksIG9yIGFkZCAtcyB0byB0aGUgTE5LRkxBR1MgKFVOSVggb25seSkuIFRoaXMgc3RyaXBzIHRoZQorICAgICAgIHByb2dyYW0gb2YgaXRzIHN5bWJvbCB0YWJsZSBhbmQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgICBkLiBNb3ZlIGNoYXJhY3RlciBzdHJpbmdzIGludG8gYSBzZXBhcmF0ZSBmaWxlLiBTZWUgdGhlIDIuMTEgQlNECisgICAgICAgdGFyZ2V0IGZvciBhbiBleGFtcGxlLgorCisgIDYuNC4gU3BhY2UvVGltZSBUcmFkZW9mZnMKKworICAgVGhlcmUgYXJlIG1vcmUgdGhhbiA2MDAwIGRlYnVnKCkgc3RhdGVtZW50cyBpbiB0aGUgcHJvZ3JhbS4gSWYgeW91CisgICB3YW50IHRvIHNhdmUgYm90aCBzcGFjZSAocHJvZ3JhbSBzaXplKSBhbmQgdGltZSAocHJvZ3JhbSBleGVjdXRpb24KKyAgIHRpbWUpLCBpbmNsdWRlIC1ETk9ERUJVRyBpbiB0aGUgY29tcGlsYXRpb24uIElmIHlvdSB3YW50IHRvIGluY2x1ZGUKKyAgIGRlYnVnZ2luZyBmb3IgdHJhY2tpbmcgZG93biBwcm9ibGVtcywgb21pdCAtRE5PREVCVUcgZnJvbSB0aGUgbWFrZQorICAgZW50cnkuIEJ1dCB3aGVuIHlvdSBpbmNsdWRlIGRlYnVnZ2luZywgeW91IGhhdmUgdHdvIGNob2ljZXMgZm9yIGhvdworICAgaXQncyBkb25lLiBPbmUgZGVmaW5pdGlvbiBkZWZpbmVzIGRlYnVnKCkgdG8gYmUgYSBmdW5jdGlvbiBjYWxsOyB0aGlzCisgICBpcyBjaGVhcCBpbiBzcGFjZSBidXQgZXhwZW5zaXZlIGluIGV4ZWN1dGlvbi4gVGhlIG90aGVyIGRlZmluZXMgZGVidWcKKyAgIGFzICJpZiAoZGVibG9nKSIgYW5kIHRoZW4gdGhlIGZ1bmN0aW9uIGNhbGwsIHRvIG9taXQgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgIG92ZXJoZWFkIHdoZW4gdGhlIGRlYnVnIGxvZyBpcyBub3QgYWN0aXZlLiBCdXQgdGhpcyBhZGRzIGEgbG90IG9mCisgICBzcGFjZSB0byB0aGUgcHJvZ3JhbS4gQm90aCBtZXRob2RzIHdvcmssIHRha2UgeW91ciBjaG9pY2U7IElGREVCVUcgaXMKKyAgIHByZWZlcnJlZCBpZiBtZW1vcnkgaXMgbm90IGEgY29uc3RyYWludCBidXQgdGhlIGNvbXB1dGVyIGlzIGxpa2VseSB0bworICAgYmUgc2xvdy4gVGhlIGZpcnN0IG1ldGhvZCBpcyB0aGUgZGVmYXVsdCwgaS5lLiBpZiBub3RoaW5nIGlzIGRvbmUgdG8KKyAgIHRoZSBDRkxBR1Mgb3IgaW4gWzg0XWNrY2RlYi5oIChidXQgaW4gc29tZSBjYXNlcywgZS5nLiBWTVMsIGl0IGlzKS4gVG8KKyAgIHNlbGVjdCB0aGUgc2Vjb25kIG1ldGhvZCwgaW5jbHVkZSAtRElGREVCVUcgaW4gdGhlIGNvbXBpbGF0aW9uIChhbmQKKyAgIGRvbid0IGluY2x1ZGUgLUROT0RFQlVHKS4KKworICAgWyBbODVdQy1LZXJtaXQgSG9tZSBdIFsgWzg2XUtlcm1pdCBIb21lIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LiBNT0RFTSBESUFMSU5HCisKKyAgIFsgWzg3XVRvcCBdIFsgWzg4XUNvbnRlbnRzIF0gWyBbODldTmV4dCBdIFsgWzkwXVByZXZpb3VzIF0KKworICAgLUROT0RJQUwgcmVtb3ZlcyBhdXRvbWF0aWMgbW9kZW0gZGlhbGluZyBjb21wbGV0ZWx5LCBpbmNsdWRpbmcgdGhlCisgICBlbnRpcmUgWzkxXWNrdWRpYS5jIG1vZHVsZSwgcGx1cyBhbGwgY29tbWFuZHMgdGhhdCByZWZlciB0byBkaWFsaW5nIGluCisgICB0aGUgdmFyaW91cyBja3V1cyouYyBtb2R1bGVzLgorCisgICAtRE1JTklESUFMIGxlYXZlcyB0aGUgRElBTCBhbmQgcmVsYXRlZCBjb21tYW5kcyAoU0VUL1NIT1cgTU9ERU0sCisgICBTRVQvU0hPVyBESUFMKSBpbnRhY3QsIGJ1dCByZW1vdmVzIHN1cHBvcnQgZm9yIGFsbCB0eXBlcyBvZiBtb2RlbXMKKyAgIGV4Y2VwdCBDQ0lUVCwgSGF5ZXMsIFVua25vd24sIFVzZXItZGVmaW5lZCwgR2VuZXJpYy1oaWdoLXNwZWVkLCBhbmQKKyAgIE5vbmUgKD0gRGlyZWN0KS4gVGhlIE1JTklESUFMIG9wdGlvbiBjdXRzIHRoZSBzaXplIG9mIHRoZSBkaWFsIG1vZHVsZQorICAgYXBwcm94aW1hdGVseSBpbiBoYWxmLiBVc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgb25seSBIYXllcyBvciBDQ0lUVAorICAgbW9kZW1zIGFuZCBkb24ndCB3YW50IHRvIGNhcnJ5IHRoZSBiYWdnYWdlIGZvciB0aGUgb3RoZXIgdHlwZXMuCisKKyAgIEEgY29tcHJvbWlzZSBiZXR3ZWVuIGZ1bGwgZGlhbGVyIHN1cHBvcnQgYW5kIE1JTklESUFMIGlzIG9idGFpbmVkIGJ5CisgICByZW1vdmluZyBzdXBwb3J0IGZvciAib2xkIiBtb2RlbXMgLS0gYWxsIHRoZSBzdHJhbmdlIG5vbi1IYXllcworICAgY29tcGF0aWJsZSAxMjAwIGFuZCAyNDAwIGJwcyBtb2RlbXMgdGhhdCBDLUtlcm1pdCBoYXMgYmVlbiBjYXJyeWluZworICAgYXJvdW5kIHNpbmNlIDE5ODUgb3Igc28uIFRvIHJlbW92ZSBzdXBwb3J0IGZvciB0aGVzZSBtb2RlbXMsIGFkZAorICAgLUROT09MRE1PREVNUyB0byBDRkxBR1MgYXQgY29tcGlsYXRpb24gdGltZS4KKworICAgRmluYWxseSwgaWYgeW91IGtlZXAgc3VwcG9ydCBmb3Igb2xkIG1vZGVtcywgeW91IHdpbGwgbm90aWNlIHRoYXQKKyAgIHRoZWlyIG5hbWVzIGFwcGVhciBvbiB0aGUgInNldCBtb2RlbSA/IiBtZW51LiBUaGF0J3MgYmVjYXVzZSB0aGVpcgorICAgbmFtZXMgYXJlLCBieSBkZWZhdWx0LCAidmlzaWJsZSIuIEJ1dCB0aGUgbGlzdCBpcyBjb25mdXNpbmcgdG8gdGhlCisgICB5b3VuZ2VyIGdlbmVyYXRpb24sIHdobyBoYXZlIG9ubHkgaGVhcmQgb2YgbW9kZW1zIGZyb20gdGhlCisgICBWLjMyYmlzLWFuZC1sYXRlciBlcmEuIElmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gdXNlIG9sZCBtb2RlbXMsIGJ1dAorICAgZG9uJ3Qgd2FudCB0aGVpciBuYW1lcyBjbHV0dGVyaW5nIHVwIG1lbnVzLCBhZGQgdGhpcyB0byBDRkxBR1M6CisKKyAgLURNX09MRD0xCisKKyAgIFsgWzkyXUMtS2VybWl0IEhvbWUgXSBbIFs5M11LZXJtaXQgSG9tZSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOC4gTkVUV09SSyBTVVBQT1JUCisKKyAgIFsgWzk0XVRvcCBdIFsgWzk1XUNvbnRlbnRzIF0gWyBbOTZdTmV4dCBdIFsgWzk3XVByZXZpb3VzIF0KKworICAgU0VDVElPTiBDT05URU5UUworCisgIDguMS4gWzk4XVRDUC9JUAorICA4LjIuIFs5OV1YLjI1CisgIDguMy4gWzEwMF1PdGhlciBOZXR3b3JrcworCisgICBDLUtlcm1pdCBzdXBwb3J0cyBub3Qgb25seSBzZXJpYWwtcG9ydCBhbmQgbW9kZW0gY29ubmVjdGlvbnMsIGJ1dCBhbHNvCisgICBUQ1AvSVAgYW5kIFguMjUgbmV0d29yayBjb25uZWN0aW9ucy4gU29tZSB2ZXJzaW9ucyBzdXBwb3J0IG90aGVyCisgICBuZXR3b3JrIHR5cGVzIHRvbyBsaWtlIERFQ25ldCwgTEFULCBORVRCSU9TLCBldGMuIElmIHlvdSBkZWZpbmUgdGhlCisgICBmb2xsb3dpbmcgc3ltYm9sOgorCisgIE5PTkVUCisKKyAgIHRoZW4gYWxsIG5ldHdvcmsgc3VwcG9ydCBpcyBjb21waWxlZCBhd2F5LgorCisgIDguMS4gVENQL0lQCisKKyAgIFNVQlNFQ1RJT04gQ09OVEVOVFMKKworICA4LjEuMS4gWzEwMV1GaXJld2FsbHMKKyAgOC4xLjIuIFsxMDJdQ29tcGlsYXRpb24gYW5kIExpbmtpbmcgUHJvYmxlbXMKKyAgOC4xLjMuIFsxMDNdRW5hYmxpbmcgSG9zdCBBZGRyZXNzIExpc3RzCisgIDguMS40LiBbMTA0XUVuYWJsaW5nIFRlbG5ldCBOQVdTCisgIDguMS41LiBbMTA1XUVuYWJsaW5nIEluY29taW5nIFRDUC9JUCBDb25uZWN0aW9ucworICA4LjEuNi4gWzEwNl1EaXNhYmxpbmcgU0VUIFRDUCBPcHRpb25zCisKKyAgIEMtS2VybWl0J3MgVENQL0lQIGZlYXR1cmVzIHJlcXVpcmUgdGhlIEJlcmtlbGV5IHNvY2tldHMgbGlicmFyeSBvcgorICAgZXF1aXZhbGVudCwgZ2VuZXJhbGx5IGF2YWlsYWJsZSBvbiBhbnkgVW5peCBzeXN0ZW0sIGFzIHdlbGwgYXMgaW4KKyAgIFdpbmRvd3MgOXgvTlQsIE9TLzIsIFZNUywgQU9TL1ZTLCBWT1MsIGV0Yy4gVGhlIFRDUC9JUCBzdXBwb3J0CisgICBpbmNsdWRlcyBidWlsdC1pbiBURUxORVQsIEZUUCwgYW5kIEhUVFAgcHJvdG9jb2wuIFRvIHNlbGVjdCBUQ1AvSVAKKyAgIHN1cHBvcnQsIGluY2x1ZGUgLURUQ1BTT0NLRVQgaW4geW91ciBtYWtlZmlsZSB0YXJnZXQncyBDRkxBR1MsIG9yIChpbgorICAgVk1TKSB0aGUgYXBwcm9wcmlhdGUgdmFyaWFudCAoZS5nLiAtRFdPTExPTkdPTkcsIC1ETVVMVElORVQsCisgICAtREVYQ0VMQU4sIC1EV0lOVENQLCBldGMpLgorCisgICBUaGUgVk1TIGFuZC9vciBlYXJseSBVbml4IHRoaXJkLXBhcnR5IFRDUC9JUCBwcm9kdWN0cyBhcmUgb2Z0ZW4KKyAgIGluY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIsIGFuZCBzb21ldGltZXMgd2l0aCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YKKyAgIHRoZW1zZWx2ZXMuIEZvciBleGFtcGxlLCBXb2xsb25nb25nIHJlcG9ydGVkbHkgcHV0IGhlYWRlciBmaWxlcyBpbgorICAgZGlmZmVyZW50IGRpcmVjdG9yaWVzIGZvciBkaWZmZXJlbnQgVU5JWCB2ZXJzaW9uczoKKworICAgICAqIGluLmggY2FuIGJlIGluIGVpdGhlciAvdXNyL2luY2x1ZGUvc3lzIG9yIC91c2VyL2luY2x1ZGUvbmV0aW5ldC4KKyAgICAgKiB0ZWxuZXQuaCBjYW4gYmUgaW4gZWl0aGVyIC91c3IvaW5jbHVkZS9hcnBhIG9yCisgICAgICAgL3VzZXIvaW5jbHVkZS9uZXRpbmV0LgorICAgICAqIGluZXQuaCBjYW4gYmUgaW4gZWl0aGVyIC91c3IvaW5jbHVkZS9hcnBhIG9yIC91c2VyL2luY2x1ZGUvc3lzLgorCisgICBJbiBjYXNlcyBsaWtlIHRoaXMsIHVzZSB0aGUgLUkgY2MgY29tbWFuZC1saW5lIG9wdGlvbiB3aGVuIHBvc3NpYmxlOworICAgb3RoZXJ3aXNlIGl0J3MgYmV0dGVyIHRvIG1ha2UgbGlua3MgaW4gdGhlIGZpbGUgc3lzdGVtIHRoYW4gaXQgaXMgdG8KKyAgIGhhY2sgdXAgdGhlIEMtS2VybWl0IHNvdXJjZSBjb2RlLiBTdXBwb3NlLCBmb3IgZXhhbXBsZSwgS2VybWl0IGlzCisgICBsb29raW5nIGZvciB0ZWxuZXQuaCBpbiAvdXNyL2luY2x1ZGUvYXJwYSwgYnV0IG9uIHlvdXIgY29tcHV0ZXIgaXQgaXMKKyAgIGluIC91c3IvaW5jbHVkZS9uZXRpbmV0LiBEbyB0aGlzIChhcyByb290LCBvciBnZXQgdGhlIHN5c3RlbQorICAgYWRtaW5pc3RyYXRvciB0byBkbyBpdCk6CisKKyAgY2QgL3Vzci9pbmNsdWRlL2FycGEKKyAgbG4gL3Vzci9pbmNsdWRlL25ldGluZXQvdGVsbmV0LmggdGVsbmV0LmgKKworICAgKCJtYW4gbG4iIGZvciBkZXRhaWxzIGFib3V0IGxpbmtzLikKKworICAgVGhlIG5ldHdvcmsgc3VwcG9ydCBmb3IgVENQL0lQIGFuZCBYLjI1IGlzIGluIHRoZSBzb3VyY2UgZmlsZXMKKyAgIFsxMDddY2tjbmV0LmgsIFsxMDhdY2tjdGVsLmMsIFsxMDldY2tjdGVsLmMsIFsxMTBdY2tjdGVsLmgsCisgICBbMTExXWNrY2Z0cC5jLCB3aXRoIG1pc2NlbGxhbmVvdXMgU0hPVyBjb21tYW5kcywgZXRjLCBpbiB0aGUgdmFyaW91cworICAgY2t1dXMqLmMgbW9kdWxlcywgcGx1cyBjb2RlIGluIHRoZSBjaypjb24uYyBvciBja3VjbnMuYyAoQ09OTkVDVAorICAgY29tbWFuZCkgYW5kIHNldmVyYWwgb3RoZXIgbW9kdWxlcyB0byBkZXRlY3QgVEVMTkVUIG5lZ290aWF0aW9ucywgZXRjLgorCisgICBXaXRoaW4gdGhlIFRDUFNPQ0tFVCBjb2RlLCBzb21lIHNvY2tldC1sZXZlbCBjb250cm9scyBhcmUgaW5jbHVkZWQgaWYKKyAgIFRDUFNPQ0tFVCBpcyBkZWZpbmVkIGluIHRoZSBDLUtlcm1pdCBDRkxBR1MgYW5kIFNPTF9TT0NLRVQgaXMgZGVmaW5lZAorICAgaW4gaW4gdGhlIHN5c3RlbSdzIFRDUC1yZWxhdGVkIGhlYWRlciBmaWxlcywgc3VjaCBhcyA8c3lzL3NvY2tldC5oPi4KKyAgIFRoZXNlIGFyZToKKworICBTRVQgVENQIEtFRVBBTElWRQorICBTRVQgVENQIExJTkdFUgorICBTRVQgVENQIFJFQ1ZCVUYKKyAgU0VUIFRDUCBTRU5EQlVGCisKKyAgIEluIGFkZGl0aW9uLCBpZiBUQ1BfTk9ERUxBWSBpcyBkZWZpbmVkLCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgaXMgYWxzbworICAgZW5hYmxlZDoKKworICBTRVQgVENQIE5PREVMQVkgKE5hZ2xlIGFsZ29yaXRobSkKKworICAgU2VlIHRoZSBbMTEyXUMtS2VybWl0IHVzZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZXNlCisgICBjb21tYW5kcy4KKworICA4LjEuMS4gRmlyZXdhbGxzCisKKyAgIFRoZXJlIGV4aXN0IHZhcmlvdXMgdHlwZXMgb2YgZmlyZXdhbGxzLCBzZXQgdXAgdG8gc2VwYXJhdGUgdXNlcnMgb2YgYW4KKyAgIGludGVybmFsIFRDUC9JUCBuZXR3b3JrICgiSW50cmFuZXQiKSBmcm9tIHRoZSBncmVhdCB3aWRlIEludGVybmV0LCBidXQKKyAgIHRoZW4gdG8gbGV0IHNlbGVjdGVkIHVzZXJzIG9yIHNlcnZpY2VzIGdldCB0aHJvdWdoIGFmdGVyIGFsbC4KKworICAgT25lIGZpcmV3YWxsIG1ldGhvZCBpcyBjYWxsZWQgU09DS1MsIGluIHdoaWNoIGEgcHJveHkgc2VydmVyIGFsbG93cworICAgdXNlcnMgaW5zaWRlIGEgZmlyZXdhbGwgdG8gYWNjZXNzIHRoZSBvdXRzaWRlIHdvcmxkLCBiYXNlZCBvbiBhCisgICBwZXJtaXNzaW9uIGxpc3QgZ2VuZXJhbGx5IHN0b3JlZCBpbiBhIGZpbGUuIFNPQ0tTIGlzIGVuYWJsZWQgaW4gb25lIG9mCisgICB0d28gd2F5cy4gRmlyc3QsIHRoZSBzdGFuZGFyZCBzb2NrZXRzIGxpYnJhcnkgaXMgbW9kaWZpZWQgdG8gaGFuZGxlCisgICB0aGUgZmlyZXdhbGwsIGFuZCB0aGVuIGFsbCB0aGUgY2xpZW50IGFwcGxpY2F0aW9ucyBhcmUgcmVsaW5rZWQgKGlmCisgICBuZWNlc3NhcnksIGkuZS4gaWYgdGhlIGxpYnJhcmllcyBhcmUgbm90IGR5bmFtaWNhbGx5IGxvYWRlZCkgd2l0aCB0aGUKKyAgIG1vZGlmaWVkIHNvY2tldHMgbGlicmFyeS4gVGhlIEFQSXMgYXJlIGFsbCB0aGUgc2FtZSwgc28gdGhlCisgICBhcHBsaWNhdGlvbnMgZG8gbm90IG5lZWQgdG8gYmUgcmVjb2RlZCBvciByZWNvbXBpbGVkLgorCisgICBJbiB0aGUgb3RoZXIgbWV0aG9kLCB0aGUgYXBwbGljYXRpb25zIG11c3QgYmUgbW9kaWZpZWQgdG8gY2FsbAorICAgcmVwbGFjZW1lbnQgcm91dGluZXMsIHN1Y2ggYXMgUmFjY2VwdCgpIGluc3RlYWQgb2YgYWNjZXB0KCksIFJiaW5kKCkKKyAgIGluc3RlYWQgb2YgYmluZCgpLCBldGMsIGFuZCB0aGVuIGxpbmtlZCB3aXRoIGEgc2VwYXJhdGUgU09DS1MgbGlicmFyeS4KKyAgIFRoaXMgc2Vjb25kIG1ldGhvZCBpcyBhY2NvbXBsaXNoZWQgKGZvciBTT0NLUzQpIGluIEMtS2VybWl0IGJ5CisgICBpbmNsdWRpbmcgLURDS19TT0NLUyBpbiB5b3VyIENGTEFHUywgYW5kIGFsc28gYWRkaW5nOgorCisgIC1sc29ja3MKKworICAgdG8gTElCUywgb3IgcmVwbGFjaW5nIC1sc29ja2V0cyB3aXRoIC1sc29ja3MgKGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQorICAgc29ja3MgbGlicmFyeSBhbHNvIGluY2x1ZGVzIGFsbCB0aGUgc29ja2V0cyBlbnRyeSBwb2ludHMpLgorCisgICBGb3IgU09DS1M1LCB1c2UgLURDS19TT0NLUzUuCisKKyAgIEV4cGxpY2l0IGZpcmV3YWxsIHN1cHBvcnQgY2FuLCBpbiBnZW5lcmFsLCBub3QgYmUgYSBzdGFuZGFyZCBmZWF0dXJlCisgICBvciBhIGZlYXR1cmUgdGhhdCBpcyBzZWxlY3RlZCBhdCBydW50aW1lLCBiZWNhdXNlIHRoZSBTT0NLUyBsaWJyYXJ5CisgICB0ZW5kcyB0byBiZSBkaWZmZXJlbnQgYXQgZWFjaCBzaXRlIC0tIGxvY2FsIG1vZGlmaWNhdGlvbnMgYWJvdW5kLgorCisgICBUaGUgaWRlYWwgc2l0dWF0aW9uIG9jY3VycyB3aGVuIGZpcmV3YWxscyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBmaXJzdAorICAgbWV0aG9kLCB1c2luZyBkeW5hbWljYWxseSBsaW5rZWQgc29ja2V0cy1yZXBsYWNlbWVudCBsaWJyYXJpZXM7IGluCisgICB0aGlzIGNhc2UsIGFsbCB5b3VyIFRDUC9JUCBjbGllbnQgYXBwbGljYXRpb25zIG5lZ290aWF0ZSB0aGUgZmlyZXdhbGwKKyAgIHRyYW5zcGFyZW50bHkuCisKKyAgOC4xLjIuIENvbXBpbGF0aW9uIGFuZCBMaW5raW5nIFByb2JsZW1zCisKKyAgIElmIHlvdSBnZXQgYSBjb21waWxhdGlvbiBlcnJvciBpbiBbMTEzXWNrY25ldC5jLCB3aXRoIGEgY29tcGxhaW50IGxpa2UKKyAgICJpbmNvbXBhdGlibGUgdHlwZXMgaW4gYXNzaWdubWVudCIsIGl0IHByb2JhYmx5IGhhcyBzb21ldGhpbmcgdG8gZG8KKyAgIHdpdGggdGhlIGRhdGEgdHlwZSB5b3VyIHN5c3RlbSB1c2VzIGZvciB0aGUgaW5ldF9hZGRyKCkgZnVuY3Rpb24sCisgICB3aGljaCBpcyBkZWNsYXJlZCAodXN1YWxseSkgaW4gPGFycGEvaW5ldC5oPi4gS2VybWl0IHVzZXMgInVuc2lnbmVkCisgICBsb25nIiB1bmxlc3MgdGhlIHN5bWJvbCBJTkFERFJYIGlzIGRlZmluZWQsIGluIHdoaWNoIGNhc2UgInN0cnVjdAorICAgaW5hZGRyIiBpcyB1c2VkIGluc3RlYWQuIFRyeSBhZGRpbmcgLURJTkFERFJYIHRvIENGTEFHUyBpbiB5b3VyIG1ha2UKKyAgIGVudHJ5LCBhbmQgaWYgdGhhdCBmaXhlcyB0aGUgcHJvYmxlbSwgcGxlYXNlIHNlbmQgYSByZXBvcnQgdG8KKyAgIGtlcm1pdEBjb2x1bWJpYS5lZHUuCisKKyAgIENvbXBpbGF0aW9uIGVycm9ycyBtaWdodCBhbHNvIGhhdmUgdG8gZG8gd2l0aCB0aGUgZGF0YSB0eXBlIHVzZWQgZm9yCisgICBnZXRzb2Nrb3B0KCkgYW5kIHNldHNvY2tvcHQoKSBvcHRpb24tbGVuZ3RoIGZpZWxkLiBUaGlzIGlzIG5vcm1hbGx5IGFuCisgICBpbnQsIGJ1dCBzb21ldGltZXMgaXQncyBhIHNob3J0LCBhIGxvbmcsIG9yIGFuIHVuc2lnbmVkIGFueSBvZiB0aG9zZSwKKyAgIG9yIGEgc2l6ZV90LiBUbyBmaXggdGhlIGNvbXBpbGF0aW9uIHByb2JsZW0sIGFkZCAtRFNPQ0tPUFRfVD14eHggdG8KKyAgIHRoZSBDRkxBR1MgaW4geW91ciBtYWtlZmlsZSB0YXJnZXQsIHdoZXJlIHh4eCBpcyB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgKHVzZSAibWFuIGdldHNvY2tvcHQiIG9yIGdyZXAgdGhyb3VnaCB5b3VyIHN5c3RlbS9uZXR3b3JrIGhlYWRlciBmaWxlcworICAgdG8gZmluZCB0aGUgbmVlZGVkIHR5cGUpLgorCisgIDguMS4zLiBFbmFibGluZyBIb3N0IEFkZHJlc3MgTGlzdHMKKworICAgV2hlbiB5b3UgZ2l2ZSBLZXJtaXQgYW4gSVAgaG9zdCBuYW1lLCBpdCBjYWxscyB0aGUgc29ja2V0IHJvdXRpbmUKKyAgIGdldGhvc3RieW5hbWUoKSB0byByZXNvbHZlIGl0LiBnZXRob3N0YnluYW1lKCkgcmV0dXJucyBhIGhvc3RlbnQKKyAgIHN0cnVjdCwgd2hpY2ggbWlnaHQgb3IgbWlnaHQgbm90IG5vdCBpbmNsdWRlIGEgbGlzdCBvZiBhZGRyZXNzZXM7IGlmCisgICBpdCBkb2VzLCB0aGVuIGlmIHRoZSBmaXJzdCBvbmUgZmFpbHMsIEtlcm1pdCBjYW4gdHJ5IHRoZSBzZWNvbmQgb25lLAorICAgYW5kIHNvIG9uLiBIb3dldmVyLCB0aGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBzeW1ib2wgImhfYWRkciIgaXMgYQorICAgbWFjcm8gZGVmaW5lZCBhcyAiaF9hZGRyX2xpc3RbMF0iLCB1c3VhbGx5IGluIG5ldGRiLmguIElmIGl0IGlzLCB0aGVuCisgICB5b3UgY2FuIGFjdGl2YXRlIHRoaXMgZmVhdHVyZSBieSBkZWZpbmluZyB0aGUgZm9sbG93aW5nIHN5bWJvbCBpbgorICAgQ0ZMQUdTOgorCisgIEhBRERSTElTVAorCisgIDguMS40LiBFbmFibGluZyBUZWxuZXQgTkFXUworCisgICBUaGUgVGVsbmV0IE5lZ290aWF0aW9uIEFib3V0IFdpbmRvdyBTaXplIChOQVdTKSBvcHRpb24gcmVxdWlyZXMgdGhlCisgICBhYmlsaXR5IHRvIGZpbmQgb3V0IHRoZSB0ZXJtaW5hbCBzY3JlZW4ncyBkaW1lbnNpb25zLiBFLmcuIGluIFVuaXgsIHdlCisgICBuZWVkIHNvbWV0aGluZyBsaWtlIGlvY3RsKDAsIFRJT0NHV0lOU1osIC4uLikuIElmIHlvdXIgdmVyc2lvbiBvZgorICAgS2VybWl0IHdhcyBidWlsdCB3aXRoIE5BV1MgY2FwYWJpbGl0eSwgU0hPVyBWRVJTSU9OUyBpbmNsdWRlcyBDS19OQVdTCisgICBhbW9uZyB0aGUgY29tcGlsZXIgb3B0aW9ucy4gSWYgaXQgZG9lc24ndCwgeW91IGNhbiBhZGQgaXQgYnkgZGVmaW5pbmcKKyAgIENLX05BV1MgYXQgY29tcGlsZSB0aW1lLiBUaGVuLCBpZiB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGNvbXBsYWluCisgICBhYm91dCB1bmRlZmluZWQgb3IgbWlzc2luZyBzeW1ib2xzLCBvciB0aGVyZSBpcyBubyBjb21wbGFpbnQgYnV0IFNIT1cKKyAgIFRFUk1JTkFMIGZhaWxzIHRvIHNob3cgcmVhc29uYWJsZSAiUm93cyA9LCBDb2x1bW5zID0iIHZhbHVlcywgdGhlbgorICAgdGFrZSBhIGxvb2sgYXQgKG9yIHdyaXRlKSB0aGUgYXBwcm9wcmlhdGUgdHRnd3NpeigpIHJvdXRpbmUuIE9uIHRoZQorICAgb3RoZXIgaGFuZCwgaWYgQ0tfTkFXUyBpcyBkZWZpbmVkIGJ5IGRlZmF1bHQgZm9yIHlvdXIgc3lzdGVtIChpbgorICAgWzExNF1ja2NuZXQuaCksIGJ1dCBjYXVzZXMgdHJvdWJsZSwgeW91IGNhbiBvdmVycmlkZSB0aGlzIGRlZmluaXRpb24KKyAgIGJ5IGluY2x1ZGluZyB0aGUgLUROT05BV1Mgc3dpdGNoIG9uIHlvdXIgQ0MgY29tbWFuZCBsaW5lLCB0aHVzCisgICBkaXNhYmxpbmcgdGhlIE5BV1MgZmVhdHVyZS4KKworICAgVGhpcyBhcHBlYXJzIHRvIGJlIG5lZWRlZCBhdCBsZWFzdCBvbiB0aGUgQVQmVCAzQjIsIHdoZXJlIGluCisgICBbMTE1XWNrdXRpby5jLCB0aGUgcm91dGluZSB0dGd3c2l6KCkgZmluZHMgdGhhdCB0aGUgVElPQ0dXSU5TWiBzeW1ib2wKKyAgIGlzIGRlZmluZWQgYnV0IGxhY2tzIGRlZmluaXRpb25zIGZvciB0aGUgY29ycmVzcG9uZGluZyB3aW5zaXplIHN0cnVjdAorICAgYW5kIGl0cyBtZW1iZXJzIHdzX2NvbCBhbmQgd3Nfcm93LgorCisgICBUaGUgVU5JWCB2ZXJzaW9uIG9mIEMtS2VybWl0IGFsc28gdHJhcHMgU0lHV0lOQ0gsIHNvIGl0IGNhbiBzZW5kIGEKKyAgIE5BV1MgdG8gdGhlIFRlbG5ldCBzZXJ2ZXIgYW55IHRpbWUgdGhlIGxvY2FsIGNvbnNvbGUgdGVybWluYWwgd2luZG93CisgICBzaXplIGNoYW5nZXMsIGUuZy4gd2hlbiB5b3Ugc3RyZXRjaCBpdCB3aXRoIGEgbW91c2UuIFRoZQorICAgU0lHV0lOQ0gtdHJhcHBpbmcgY29kZSBpcyBlbmFibGVkIGlmIFNJR1dJTkNIIGlzIGRlZmluZWQgKGkuZS4gaW4KKyAgIHNpZ25hbC5oKS4gSWYgdGhpcyBjb2RlIHNob3VsZCBjYXVzZSBwcm9ibGVtcywgeW91IGNhbiBkaXNhYmxlIGl0CisgICB3aXRob3V0IGRpc2FibGluZyB0aGUgTkFXUyBmZWF0dXJlIGFsdG9nZXRoZXIsIGJ5IGRlZmluaW5nIE5PU0lHV0lOQ0gKKyAgIGF0IGNvbXBpbGUgdGltZS4KKworICA4LjEuNS4gRW5hYmxpbmcgSW5jb21pbmcgVENQL0lQIENvbm5lY3Rpb25zCisKKyAgIFRoaXMgZmVhdHVyZSBsZXRzIHlvdSAic2V0IGhvc3QgKiBwb3J0IiBhbmQgd2FpdCBmb3IgYW4gaW5jb21pbmcKKyAgIGNvbm5lY3Rpb24gb24gdGhlIGdpdmVuIHBvcnQuIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIGF1dG9tYXRpY2FsbHkgYXQKKyAgIGNvbXBpbGUgaWYgVENQU09DS0VUIGlzIGRlZmluZWQgYW5kIFNFTEVDVCBpcyBhbHNvIGRlZmluZWQuIEJ1dCB3YXRjaAorICAgb3V0LCBzaW1wbHkgZGVmaW5pbmcgU0VMRUNUIG9uIHRoZSBjYyBjb21tYW5kIGxpbmUgZG9lcyBub3QgZ3VhcmFudGVlCisgICBzdWNjZXNzZnVsIGNvbXBpbGF0aW9uIG9yIGxpbmtpbmcgKHNlZSBbMTE2XVNlY3Rpb24gMTEpLgorCisgICBJZiB5b3Ugd2FudCB0byBkaXNhYmxlIGluY29taW5nIFRDUC9JUCBjb25uZWN0aW9ucywgdGhlbiBidWlsZAorICAgQy1LZXJtaXQgd2l0aDoKKworICAtRE5PTElTVEVOCisKKyAgOC4xLjYuIERpc2FibGluZyBTRVQgVENQIE9wdGlvbnMKKworICAgVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIGlzIGJlY2F1c2Ugb2YgaGVhZGVyIGZpbGUgLyBwcm90b3R5cGUKKyAgIGNvbmZsaWN0cyBhdCBjb21waWxlIHRpbWUgcmVnYXJkdGluZyBnZXQtIC8gc2V0c29ja29wdCgpLiBJZiB5b3UgY2FuJ3QKKyAgIGZpeCB0aGVtICh3aXRob3V0IGJyZWFraW5nIG90aGVyIGJ1aWxkcyksIGFkZCB0aGUgZm9sbG93aW5nIGluIENGTEFHUzoKKworICAtRE5PVENQT1BUUworCisgIDguMi4gWC4yNQorCisgICBYLjI1IHN1cHBvcnQgcmVxdWlyZXMgKGEpIGEgU3VuLCAoYikgdGhlIFN1bkxpbmsgcHJvZHVjdCAobGlicmFyaWVzCisgICBhbmQgaGVhZGVyIGZpbGVzKSwgYW5kIChjKSBhbiBYLjI1IGNvbm5lY3Rpb24gaW50byB5b3VyIFN1bi4gU2ltaWxhcmx5CisgICAoaW4gQy1LZXJtaXQgNy4wIG9yIGxhdGVyKSBTdHJhdHVzIFZPUyBhbmQgSUJNIEFJWC4KKworICAgSW4gVU5JWCwgc3BlY2lhbCBtYWtlZmlsZSB0YXJnZXRzIHN1bm9zNHgyNSBhbmQgc3Vub3M0MXgyNSAoZm9yIFNVTk9TCisgICA0LjAgYW5kIDQuMSwgcmVzcGVjdGl2ZWx5KSwgb3IgYWl4NDF4MjUsIGFyZSBwcm92aWRlZCB0byBidWlsZCBpbiB0aGlzCisgICBmZWF0dXJlLCBidXQgdGhleSBvbmx5IHdvcmsgaWYgY29uZGl0aW9ucyAoYSktKGMpIGFyZSBtZXQuIFRvIHJlcXVlc3QKKyAgIHRoaXMgZmVhdHVyZSwgaW5jbHVkZSAtRFNVTlgyNSAob3IgLURJQk1YMjUpIGluIENGTEFHUy4KKworICAgU1VOWDI1IChvciAtRElCTVgyNSkgYW5kIFRDUFNPQ0tFVCBjYW4gYmUgZnJlZWx5IG1peGVkIGFuZCBtYXRjaGVkLAorICAgYW5kIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIGF0IHJ1bnRpbWUgd2l0aCB0aGUgU0VUIE5FVFdPUksgVFlQRSBjb21tYW5kCisgICBvciBTRVQgSE9TVCBzd2l0Y2hlcy4KKworICA4LjMuIE90aGVyIE5ldHdvcmtzCisKKyAgIFN1cHBvcnQgZm9yIG90aGVyIG5ldHdvcmtpbmcgbWV0aG9kcyAtLSBORVRCSU9TLCBMQVQsIE5hbWVkIFBpcGVzLCBldGMKKyAgIC0tIGlzIGluY2x1ZGVkIGluIGNrKm5ldC5oIGFuZCBjaypuZXQuYyBmb3IgaW1wbGVtZW50YXRpb25zIChzdWNoIGFzCisgICBXaW5kb3dzIG9yIE9TLzIpIHdoZXJlIHRoZXNlIG1ldGhvZHMgYXJlIHN1cHBvcnRlZC4KKworICAgUHJvdmlzaW9uIGlzIG1hZGUgaW4gdGhlIG9yZ2FuaXphdGlvbiBvZiB0aGUgbW9kdWxlcywgaGVhZGVyIGZpbGVzLAorICAgY29tbWFuZHMsIGV0YywgZm9yIGFkZGl0aW9uIG9mIG5ldyBuZXR3b3JrIHR5cGVzIHN1Y2ggYXMgREVDbmV0LCBYLjI1CisgICBmb3Igb3RoZXIgc3lzdGVtcyAoSFAtVVgsIFZNUywgZXRjKSwgYW5kIHNvIG9uLiBTZW5kIGVtYWlsIHRvCisgICBbMTE3XWtlcm1pdEBjb2x1bWJpYS5lZHUgaWYgeW91IGFyZSB3aWxsaW5nIGFuZCBhYmxlIHRvIHdvcmsgb24gc3VjaCBhCisgICBwcm9qZWN0LgorCisgICBbIFsxMThdQy1LZXJtaXQgSG9tZSBdIFsgWzExOV1LZXJtaXQgSG9tZSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOS4gRVhDRVBUSU9OIEhBTkRMSU5HCisKKyAgIFsgWzEyMF1Ub3AgXSBbIFsxMjFdQ29udGVudHMgXSBbIFsxMjJdTmV4dCBdIFsgWzEyM11QcmV2aW91cyBdCisKKyAgIFRoZSBDIGxhbmd1YWdlIHNldGptcC9sb25nam1wIG1lY2hhbmlzbSBpcyB1c2VkIGZvciBoYW5kbGluZworICAgZXhjZXB0aW9ucy4gVGhlIGp1bXAgYnVmZmVyIGlzIG9mIHR5cGUgam1wX2J1Ziwgd2hpY2ggYWxtb3N0CisgICBldmVyeXdoZXJlIGlzIHR5cGVkZWYnZCBhcyBhbiBhcnJheSwgaW4gd2hpY2ggY2FzZSB5b3Ugc2hvdWxkIGhhdmUgbm8KKyAgIHRyb3VibGUgY29tcGlsaW5nIHRoZSBleGNlcHRpb24taGFuZGxpbmcgY29kZS4gSG93ZXZlciwgaWYgeW91IGFyZQorICAgYnVpbGRpbmcgQy1LZXJtaXQgaW4vZm9yIGFuIGVudmlyb25tZW50IHdoZXJlIGptcF9idWYgaXMgc29tZXRoaW5nCisgICBvdGhlciB0aGFuIGFuIGFycmF5IChlLmcuIGEgc3RydWN0KSwgdGhlbiB5b3UnbGwgaGF2ZSB0byBkZWZpbmUgdGhlCisgICBmb2xsb3dpbmcgc3ltYm9sOgorCisgIEpCTk9UQVJSQVkKKworICAgWyBbMTI0XUMtS2VybWl0IEhvbWUgXSBbIFsxMjVdS2VybWl0IEhvbWUgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEwLiBTRUNVUklUWSBGRUFUVVJFUworCisgICBbIFsxMjZdVG9wIF0gWyBbMTI3XUNvbnRlbnRzIF0gWyBbMTI4XU5leHQgXSBbIFsxMjldUHJldmlvdXMgXQorCisgICBTZWN1cml0eSwgaW4gdGhlIHNlbnNlIG9mIHNlY3VyZSBhdXRoZW50aWNhdGlvbiBhbmQgc3Ryb25nIGVuY3J5cHRpb24sCisgICBjYW4gYmUgYnVpbHQgaW50byB2ZXJzaW9uZiBvZiBDLUtlcm1pdCBmb3Igd2hpY2ggdGhlIGFwcHJvcHJpYXRlCisgICBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcyBhcmUgYXZhaWxhYmxlIChLZXJiZXJvcyBJViwgS2VyYmVyb3MgViwKKyAgIE9wZW5TU0wsIFNSUCksIGFzIGV4cGxhaW5lZCBpbiBncmVhdCBkZXRhaWwgaW4gdGhlIEtlcm1pdCBTZWN1cml0eQorICAgUmVmZXJlbmNlCisgICAuIFRoZSBmb2xsb3dpbmcgc3ltYm9scyBnb3Zlcm4gQy1LZXJtaXQncyBzZWN1cml0eSBmZWF0dXJlcyBhdCBidWlsZAorICAgdGltZToKKworICAgTk9fQVVUSEVOVElDQVRJT04KKyAgICAgICAgICBNZWFucyBkbyBub3QgY29uZmlndXJlIGFueSBURUxORVQgQVVUSEVOVElDQVRJT04gc3VwcG9ydC4gSXQKKyAgICAgICAgICBpbXBsaWVzIE5PX0VOQ1JZUFRJT04gYW5kIHVuZGVmaW5lcyBhbnkgb2YgdGhlIGF1dGggYW5kIGVuY3J5cHQKKyAgICAgICAgICB0eXBlcy4gSXQgZG9lcyBub3QgdW5kZWZpbmUgQ0tfU1NMIGV2ZW4gdGhvdWdoIGJ1aWxkcyB3aXRoCisgICAgICAgICAgQ0tfU1NMIGNhbm5vdCBzdWNjZWVkIHdpdGhvdXQgQ0tfQVVUSEVOVElDQVRJT04uIChUaGlzIHdpbGwgYmUKKyAgICAgICAgICBzdXBwb3J0ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4gSXQgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cKKyAgICAgICAgICBDLUtlcm1pdCB0byBiZSBidWlsdCBvbmx5IGFzIGFuIEZUUCBjbGllbnQuKQorCisgICBOT19LRVJCRVJPUworICAgICAgICAgIE1lYW5zIGRvIG5vdCBjb21waWxlIGluIGFueSBLRVJCRVJPUyBzdXBwb3J0IHdoZW4KKyAgICAgICAgICBDS19BVVRIRU5USUNBVElPTiBoYXMgYmVlbiBkZWZpbmVkLgorCisgICBOT19TUlAKKyAgICAgICAgICBEbyBub3QgY29tcGlsZSBpbiBhbnkgU1JQIHN1cHBvcnQgd2hlbiBDS19BVVRIRU5USUNBVElPTiBoYXMKKyAgICAgICAgICBiZWVuIGRlZmluZWQuCisKKyAgIE5PX1NTTAorICAgICAgICAgIERvIG5vdCBjb21waWxlIGluIGFueSBTU0wvVExTIHN1cHBvcnQKKworICAgTk9fRU5DUllQVElPTgorICAgICAgICAgIERvIG5vdCBjb21waWxlIGluIGFueSBUZWxuZXQgZW5jcnlwdGlvbiBzdXBwb3J0LiBJdCBkb2VzIG5vdAorICAgICAgICAgIGFmZmVjdCB0aGUgdXNlIG9mIFNTTC9UTFMKKworICAgTk9TU0gKKyAgICAgICAgICBEbyBub3QgY29tcGlsZSBpbiBhbnkgU1NIIHN1cHBvcnQgd2hldGhlciBpbnRlcm5hbCBvciBleHRlcm5hbAorCisgICBDS19BVVRIRU5USUNBVElPTgorICAgICAgICAgIFRlbG5ldCBBVVRIRU5USUNBVElPTiBzdXBwb3J0LiAoQWxzbywgcmVxdWlyZWQgaWYgU1NML1RMUworICAgICAgICAgIHN1cHBvcnQgaXMgZGVzaXJlZC4pIE9uIG1vc3QgcGxhdGZvcm1zIHRoaXMgZG9lcyBub3QgYXV0b2RlZmluZQorICAgICAgICAgIGFueSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1Y2ggYXMgS2VyYmVyb3MgViwgS2VyYmVyb3MgSVYsCisgICAgICAgICAgU1JQLCAuLi4gVGhvc2UgbmVlZCB0byBiZSBkZWZpbmVkIHNlcGFyYXRlbHkuCisKKyAgIENLX0tFUkJFUk9TCisgICAgICAgICAgRGVmaW5lZCBhdXRvbWF0aWNhbGx5IHdoZW4gS1JCNCwgS1JCNSwgb3IgS1JCNTI0IGFyZSBkZWZpbmVkLgorICAgICAgICAgIEltcGxpZXMgdGhhdCBzb21lIHZlcnNpb24gb2YgS2VyYmVyb3MgaXMgaW4gdXNlLgorCisgICBLUkI0CisgICAgICAgICAgU2hvdWxkIGJlIGRlZmluZWQgd2hlbiBLZXJiZXJvcyBJViBzdXBwb3J0IGlzIGRlc2lyZWQuCisKKyAgIEtSQjUKKyAgICAgICAgICBTaG91bGQgYmUgZGVmaW5lZCB3aGVuIEtlcmJlcm9zIFYgc3VwcG9ydCBpcyBkZXNpcmVkLgorCisgICBLUkI1MjQKKyAgICAgICAgICBTaG91bGQgYmUgZGVmaW5lZCBpZiBib3RoIEtlcmJlcm9zIFYgYW5kIEtlcmJlcm9zIElWIGFyZSB1c2VkCisgICAgICAgICAgYW5kIHRoZSBLZXJiZXJvcyBJViBzdXBwb3J0IGlzIHByb3ZpZGVkIGJ5IHRoZSBNSVQgS2VyYmVyb3MgSVYKKyAgICAgICAgICBjb21wYXRpYmlsaXR5IGxpYnJhcnkgaW4gdGhlIGN1cnJlbnQgS2VyYmVyb3MgNSBkaXN0cmlidXRpb24uCisKKyAgIEtSQjVfVTJVCisgICAgICAgICAgU2hvdWxkIGJlIGRlZmluZWQgaWYgS1JCNSBpcyBkZWZpbmVkIGFuZCBLZXJiZXJvcyA1IFVzZXIgdG8KKyAgICAgICAgICBVc2VyIG1vZGUgaXMgZGVzaXJlZC4KKworICAgSEVJTURBTAorICAgICAgICAgIFNob3VsZCBiZSBkZWZpbmVkIGlmIEtlcmJlcm9zIFYgc3VwcG9ydCBpcyBwcm92aWRlZCBieSBIRUlNREFMLgorICAgICAgICAgIFN1cHBvcnQgZm9yIHRoaXMgb3B0aW9uIGlzIG5vdCBjb21wbGV0ZSBpbiBDLUtlcm1pdCA4LjAuIEFueW9uZQorICAgICAgICAgIGludGVyZXN0ZWQgaW4gd29ya2luZyBvbiB0aGlzIHNob3VsZCBjb250YWN0IGtlcm1pdC1zdXBwb3J0LgorCisgICBDS19TUlAKKyAgICAgICAgICBTaG91bGQgYmUgZGVmaW5lZCBpZiBTUlAgc3VwcG9ydCBpcyBkZXNpcmVkLgorCisgICBDS19FTkNSWVBUSU9OCisgICAgICAgICAgU2hvdWxkIGJlIGRlZmluZWQgaWYgVEVMTkVUIEVOQ1JZUFRJT04gb3B0aW9uIHN1cHBvcnQgaXMKKyAgICAgICAgICBkZXNpcmVkLiBUaGlzIG9wdGlvbiBkb2VzIG5vdCBkZWZpbmUgYW55IHBhcnRpY3VsYXIgZW5jcnlwdGlvbgorICAgICAgICAgIHR5cGVzLiBUaGF0IHNob3VsZCBiZSBkb25lIGJ5IGRlZmluaW5nIENLX0RFUyBvciBDS19DQVNULgorCisgICBDS19ERVMKKyAgICAgICAgICBTaG91bGQgYmUgZGVmaW5lZCBpZiBlaXRoZXIgREVTIG9yIDNERVMgVGVsbmV0IEVuY3J5cHRpb24KKyAgICAgICAgICBvcHRpb24gc3VwcG9ydCBpcyBkZXNpcmVkLgorCisgICBMSUJERVMKKyAgICAgICAgICBJZiBDS19ERVMgaXMgZGVmaW5lZCBhbmQgREVTIHN1cHBvcnQgaXMgYmVpbmcgcHJvdmlkZWQgYnkKKyAgICAgICAgICBlaXRoZXIgRXJpYyBZb3VuZydzIGxpYmRlcy5hIG9yIE9wZW5TU0wgMC45LjZ4IG9yIGVhcmxpZXIsIHRoaXMKKyAgICAgICAgICBvcHRpb24gbXVzdCBiZSBkZWZpbmVkLiBJZiBpdCBpcyBub3QgZGVmaW5lZCwgaXQgd2lsbCBiZQorICAgICAgICAgIGFzc3VtZWQgdGhhdCBERVMgc3VwcG9ydCBpcyBwcm92aWRlZCBieSB0aGUgTUlUIEtlcmJlcm9zIElWCisgICAgICAgICAgbGlicmFyaWVzLgorCisgICBDS19DQVNUCisgICAgICAgICAgU2hvdWxkIGJlIGRlZmluZWQgaWYgQ0FTVCBUZWxuZXQgRW5jcnlwdGlvbiBvcHRpb24gc3VwcG9ydCBpcworICAgICAgICAgIGRlc2lyZWQKKworICAgQ0tfU1NMCisgICAgICAgICAgU2hvdWxkIGJlIGRlZmluZWQgaWYgU1NML1RMUyBzdXBwb3J0IChPcGVuU1NMKSBpcyBkZXNpcmVkLgorCisgICBTU0xfS1JCNQorICAgICAgICAgIElmIEtSQjUgaXMgZGVmaW5lZCwgYW5kIE9wZW5TU0wgaXMgYnVpbHQgdG8gc3VwcG9ydCB0aGUKKyAgICAgICAgICBLZXJiZXJvcyA1IGNpcGhlcnMsIHRoZW4geW91IHNob3VsZCBkZWZpbmUgU1NMX0tSQjUKKworICAgTk9TU0xLUkI1CisgICAgICAgICAgSWYgeW91IGFyZSB1c2luZyBPcGVuU1NMIDAuOS43IG9yIGhpZ2hlciBhbmQgZG8gbm90IHdpc2ggdG8KKyAgICAgICAgICBidWlsZCB3aXRoIHN1cHBvcnQgZm9yIEtlcmJlcm9zIDUgVExTIGNpcGhlcnMsIHRoaXMgb3B0aW9uIG11c3QKKyAgICAgICAgICBiZSBkZWZpbmVkLgorCisgICBaTElCCisgICAgICAgICAgSWYgeW91IGFyZSB1c2luZyBPcGVuU1NMIDAuOS42IG9yIGhpZ2hlciBhbmQgaXQgaGFzIGJlZW4KKyAgICAgICAgICBjb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIFpMSUIgY29tcHJlc3Npb24sIHRoaXMgb3B0aW9uIHNob3VsZAorICAgICAgICAgIGJlIGRlZmluZWQgdG8gZW5hYmxlIEtlcm1pdCB0byBwcm9wZXJseSBlbmFibGUgdGhlIHVzZSBvZgorICAgICAgICAgIGNvbXByZXNzaW9uLgorCisgICBTU0hDTUQKKyAgICAgICAgICBEZWZpbmVkIGZvciBDLUtlcm1pdCB0byBlbmFibGUgdGhlIHVzZSBvZiBleHRlcm5hbCBTU0ggY2xpZW50cworICAgICAgICAgIGZyb20gdGhlIEtlcm1pdCBjb21tYW5kIGxhbmd1YWdlCisKKyAgIFNTSEJVSUxUSU4KKyAgICAgICAgICBEZWZpbmVkIGZvciBLZXJtaXQgaW1wbGVtZW50YXRpb25zIHRoYXQgaGF2ZSBpbnRlZ3JhdGVkIFNTSAorICAgICAgICAgIHN1cHBvcnQuIEN1cnJlbnRseSBvbmx5IFdpbmRvd3MuCisKKyAgIEFOWVNTSAorICAgICAgICAgIERlZmluZWQgaWYgZWl0aGVyIFNTSENNRCBvciBTU0hCVUlMVElOIGFyZSBkZWZpbmVkLgorCisgICBDS19TTkRMT0MKKyAgICAgICAgICBUZWxuZXQgU2VuZCBMb2NhdGlvbiBzdXBwb3J0LgorCisgICBOT1NORExPQworICAgICAgICAgIERvIG5vdCBpbmNsdWRlIFRlbG5ldCBTZW5kIExvY2F0aW9uIHN1cHBvcnQuCisKKyAgIENLX1hESVNQTE9DCisgICAgICAgICAgVGVsbmV0IFgtRGlzcGxheSBMb2NhdGlvbiBzdXBwb3J0LiBEZXRlcm1pbmVzIGlmIHRoZSBYLURpc3BsYXkKKyAgICAgICAgICBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpcyBzZW50IHRvIHRoZSBUZWxuZXQgc2VydmVyIGVpdGhlciB2aWEKKyAgICAgICAgICBUZWxuZXQgWERJU1BMT0Mgb3IgTkVXLUVOViBvcHRpb25zLgorCisgICBOT1hESVNQTE9DCisgICAgICAgICAgRG8gbm90IGluY2x1ZGUgVGVsbmV0IFgtRGlzcGxheSBMb2NhdGlvbiBzdXBwb3J0LgorCisgICBDS19GT1JXQVJEX1gKKyAgICAgICAgICBUZWxuZXQgRm9yd2FyZCBYIFdpbmRvd3MgU2Vzc2lvbiBEYXRhIG9wdGlvbi4gVXNlZCB0byBwcm90ZWN0CisgICAgICAgICAgdGhlIHByaXZhY3kgYW5kIGludGVncml0eSBvZiBYIFdpbmRvd3MgU2Vzc2lvbnMgd2hlbiBzZWN1cmUKKyAgICAgICAgICB0ZWxuZXQgc2Vzc2lvbnMgYXJlIGluIHVzZS4KKworICAgTk9GT1JXQVJEWAorICAgICAgICAgIERvIG5vdCBpbmNsdWRlIFRlbG5ldCBGb3J3YXJkIFggV2luZG93cyBTZXNzaW9uIERhdGEgb3B0aW9uLgorCisgICBCZXNpZGVzIHRoZSBzdHJvbmcgZm9ybXMgb2Ygc2VjdXJpdHkgbGlzdGVkIGFib3ZlLCBDLUtlcm1pdCBhbHNvCisgICBlbWJvZGllcyB2YXJpb3VzIGludGVybmFsIHNlY3VyaXR5IGZlYXR1cmVzLCBpbmNsdWRpbmc6CisKKyAgIE5PUFVTSAorICAgICAgICAgIENvbXBpbGluZyB3aXRoIHRoZSBOT1BVU0ggc3ltYm9sIGRlZmluZWQgcmVtb3ZlcyBhbGwgdGhlICJzaGVsbAorICAgICAgICAgIGVzY2FwZSIgZmVhdHVyZXMgZnJvbSB0aGUgcHJvZ3JhbSwgaW5jbHVkaW5nIHRoZSBQVVNILCBSVU4sIGFuZAorICAgICAgICAgIFNQQVdOIGNvbW1hbmRzLCB0aGUgIiEiIGFuZCAiQCIgY29tbWFuZCBwcmVmaXhlcywgT1BFTiAhUkVBRCwKKyAgICAgICAgICBPUEVOICFXUklURSwgam9iIGNvbnRyb2wgKGluY2x1ZGluZyB0aGUgU1VTUEVORCBjb21tYW5kKSwgdGhlCisgICAgICAgICAgUkVESVJFQ1QgY29tbWFuZCwgc2hlbGwvRENMIGVzY2FwZSBmcm9tIENPTk5FQ1QgbW9kZSwgYXMgd2VsbAorICAgICAgICAgIGFzIHRoZSBzZXJ2ZXIncyBleGVjdXRpb24gb2YgUkVNT1RFIEhPU1QgY29tbWFuZHMgKGFuZCwgb2YKKyAgICAgICAgICBjb3Vyc2UsIHRoZSBFTkFCTEUgSE9TVCBjb21tYW5kKS4gQWRkIE5PRElTUE8gdG8gYWxzbyBwcmV2ZW50CisgICAgICAgICAgYWNjZXB0YW5jZSBvZiBpbmNvbWluZyBNQUlMIG9yIFJFTU9URSBQUklOVCBmaWxlcy4gRm9yIFVOSVgsCisgICAgICAgICAgYWxzbyBiZSBzdXJlIHRvIHJlYWQgWzEzMF1TZWN0aW9uIDExIG9mIHRoZSBbMTMxXVVuaXggQy1LZXJtaXQKKyAgICAgICAgICBJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zLiBhYm91dCBzZXRbdWddaWQgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICBBZGRpdGlvbmFsIHJlc3RyaWN0aW9ucyBjYW4gYmUgZW5mb3JjZWQgd2hlbiBpbiBzZXJ2ZXIgbW9kZTsKKyAgICAgICAgICByZWFkIGFib3V0IHRoZSBESVNBQkxFIGNvbW1hbmQgaW4gdGhlIHVzZXIgbWFudWFsLgorCisgICBOT0NDVFJBUAorICAgICAgICAgIENvbXBpbGluZyB3aXRoIE5PQ0NUUkFQIHByZXZlbnRzIHRoZSB0cmFwcGluZyBvZiBTSUdJTlQgYnkKKyAgICAgICAgICBLZXJtaXQuIFRodXMgaWYgdGhlIHVzZXIgZ2VuZXJhdGVzIGEgU0lHSU5UIHNpZ25hbCAoZS5nLiBieQorICAgICAgICAgIHR5cGluZyB0aGUgc3lzdGVtJ3MgaW50ZXJydXB0IGNoYXJhY3RlciksIEtlcm1pdCB3aWxsIGV4aXQKKyAgICAgICAgICBpbW1lZGlhdGVseSwgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIHRvIGl0cyBwcm9tcHQuCisKKyAgIE5PUFVTSCBhbmQgTk9DQ1RSQVAgdG9nZXRoZXIgYWxsb3cgS2VybWl0IHRvIGJlIHJ1biBmcm9tIHJlc3RyaWN0ZWQKKyAgIHNoZWxscywgcHJldmVudGluZyBhY2Nlc3MgdG8gc3lzdGVtIGZ1bmN0aW9ucy4KKworICAgWyBbMTMyXUMtS2VybWl0IEhvbWUgXSBbIFsxMzNdS2VybWl0IEhvbWUgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDExLiBFTkFCTElORyBTRUxFQ1QoKQorCisgICBbIFsxMzRdVG9wIF0gWyBbMTM1XUNvbnRlbnRzIF0gWyBbMTM2XU5leHQgXSBbIFsxMzddUHJldmlvdXMgXQorCisgICBLZXJtaXQgd29ya3MgYmVzdCBpZiBpdCBjYW4gZG8gbm9uYmxvY2tpbmcgcmVhZHMsIG5vbmRlc3RydWN0aXZlIGlucHV0CisgICBidWZmZXIgY2hlY2tpbmcsIGFuZCBtaWxsaXNlY29uZCBzbGVlcHMuIEFsbCBvZiB0aGVzZSBmdW5jdGlvbnMgY2FuIGJlCisgICBhY2NvbXBsaXNoZWQgYnkgdGhlIHNlbGVjdCgpIGZ1bmN0aW9uLCB3aGljaCwgdW5mb3J0dW5hdGVseSwgaXMgbm90CisgICB1bml2ZXJzYWxseSBhdmFpbGFibGUuIEZ1cnRoZXJtb3JlLCBzZWxlY3QoKSBpcyByZXF1aXJlZCBpZiBpbmNvbWluZworICAgVENQL0lQIGNvbm5lY3Rpb25zIGFyZSB0byBiZSBzdXBwb3J0ZWQuCisKKyAgIHNlbGVjdCgpIHdhcyBpbnRyb2R1Y2VkIHdpdGggQmVya2VsZXkgVU5JWCwgcmVqZWN0ZWQgYnkgQVQmVCBmb3IKKyAgIFN5c3RlbSBWLCBidXQgaXMgZ3JhZHVhbGx5IGNyZWVwaW5nIGluIHRvIGFsbCBVTklYIHZlcnNpb25zIChhbmQgb3RoZXIKKyAgIG9wZXJhdGluZyBzeXN0ZW1zIHRvbykgYnkgdmlydHVlIG9mIGl0cyBwcmVzZW5jZSBpbiB0aGUgc29ja2V0cworICAgbGlicmFyeSwgd2hpY2ggaXMgbmVlZGVkIGZvciBUQ1AvSVAuIEFUJlQgU1ZJRCBmb3IgU3lzdGVtIFYgUjQKKyAgIGluY2x1ZGVzIHNlbGVjdCgpLCBidXQgdGhhdCBkb2VzIG5vdCBtZWFuIHRoYXQgYWxsIFNWUjQKKyAgIGltcGxlbWVudGF0aW9ucyBoYXZlIGl0LgorCisgICBGdXJ0aGVybW9yZSwgZXZlbiB3aGVuIHNlbGVjdCgpIGlzIGF2YWlsYWJsZSwgaXQgbWlnaHQgd29yayBvbmx5IG9uCisgICBzb2NrZXQgZmlsZSBkZXNjcmlwdG9ycywgYnV0IG5vdCBvbiBvdGhlcnMgbGlrZSBzZXJpYWwgcG9ydHMsIHBpcGVzLAorICAgZXRjLiBGb3IgZXhhbXBsZSwgaW4gQU9TL1ZTIGFuZCBCZU9TLCBpdCB3b3JrcyBvbmx5IHdpdGggZmlsZQorICAgZGVzY3JpcHRvcnMgdGhhdCB3ZXJlIGNyZWF0ZWQgYnkgc29ja2V0KCkgYW5kIG9wZW5lZCBieSBjb25uZWN0KCkgb3IKKyAgIGFjY2VwdCgpLgorCisgICBPdGhlciBhbHRlcm5hdGl2ZXMgaW5jbHVkZSBwb2xsKCkgYW5kIHJkY2hrKCkuIE9ubHkgb25lIG9mIHRoZXNlIHRocmVlCisgICBmdW5jdGlvbnMgc2hvdWxkIGJlIGluY2x1ZGVkLiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgZ292ZXJuIHRoaXM6CisKKyAgICAgU0VMRUNUICBVc2Ugc2VsZWN0KCkgKEJTRCwgb3Igc3lzdGVtcyB3aXRoIHNvY2tldHMgbGlicmFyaWVzKQorICAgICBDS19QT0xMIFVzZSBwb2xsKCkgICAoU3lzdGVtIFYpCisgICAgIFJEQ0hLICAgVXNlIHJkY2hrKCkgIChTQ08gWEVOSVggYW5kIFVOSVgpCisKKyAgIElmIHlvdXIgc3lzdGVtIHN1cHBvcnRzIHRoZSBzZWxlY3QoKSBmdW5jdGlvbiwgYnV0IHlvdXIgdmVyc2lvbiBvZgorICAgQy1LZXJtaXQgZG9lcyBub3QsIHRyeSBhZGRpbmc6CisKKyAgLURTRUxFQ1QKKworICAgdG8gdGhlIENGTEFHUywgYW5kIHJlbW92aW5nIC1EUkRDSEsgb3IgLURDS19QT0xMIGlmIGl0IGlzIHRoZXJlLiBJZgorICAgeW91IGdldCBjb21waWxhdGlvbiBlcnJvcnMsIHNvbWUgYWRqdXN0bWVudHMgdG8gY2sqdGlvLmMgYW5kL29yCisgICBjaypuZXQuYyBtaWdodCBiZSBuZWVkZWQ7IHNlYXJjaCBmb3IgU0VMRUNUICh1cHBlcmNhc2UpIGluIHRoZXNlIGZpbGVzCisgICAobm90ZSB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsIHZhcmlhdGlvbnMgb24gdGhlIGNhbGxpbmcgY29udmVudGlvbnMgZm9yCisgICBzZWxlY3QoKSkuCisKKyAgIFZhcmlvdXMgbWFjcm9zIGFuZCBkYXRhIHR5cGVzIG5lZWQgdG8gYmUgZGVmaW5lZCBpbiBvcmRlciB0byB1c2UKKyAgIHNlbGVjdCgpLiBVc3VhbGx5IHRoZXNlIGFyZSBwaWNrZWQgdXAgZnJvbSA8dHlwZXMuaD4gb3IgPHN5cy90eXBlcy5oPi4KKyAgIEJ1dCBvbiBzb21lIHN5c3RlbXMsIHRoZXkgYXJlIGluIDxzeXMvc2VsZWN0Lmg+LiBJbiB0aGF0IGNhc2UsIGFkZCB0aGUKKyAgIGZvbGxvd2luZzoKKworICAtRFNFTEVDVF9ICisKKyAgIHRvIHRoZSBDRkxBR1MgdG8gdGVsbCBDLUtlcm1pdCB0byAjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPi4gQSBnb29kCisgICBpbmRpY2F0aW9uIHRoYXQgeW91IG5lZWQgdG8gZG8gdGhpcyB3b3VsZCBiZSBpZiB5b3UgZ2V0IGNvbXBpbGUtdGltZQorICAgY29tcGxhaW50cyBhYm91dCAiZmRfc2V0IiBvciAiRkRfU0VUIiBub3QgYmVpbmcgZGVjbGFyZWQgb3IgZGVmaW5lZC4KKworICAgSW4gVU5JWCwgdGhlIHVzZSBvZiBzZWxlY3QoKSB2cyBmb3JrKCkgaW4gdGhlIENPTk5FQ1QgY29tbWFuZCBpcworICAgaW5kZXBlbmRlbnQgb2YgdGhlIGFib3ZlIGNvbnNpZGVyYXRpb25zLCBhbmQgaXMgZ292ZXJuZWQgYnkgY2hvb3NpbmcgYQorICAgcGFydGljdWxhciBtYWtlZmlsZSB0YXJnZXQuCisKKyAgIEFzIG9mIEMtS2VybWl0IDcuMCwgc2VsZWN0KCkgaXMgYWxzbyB0aGUgcHJlZmVycmVkIGNvbnRyb2wgbWVjaGFuaXNtCisgICBmb3IgdGhlIENPTk5FQ1QgY29tbWFuZC4gVW5mb3J0dW5hdGVseSwgdGhlIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUKKyAgIG9yaWdpbmFsIFVOSVggQ09OTkVDVCBjb21tYW5kLCBiYXNlZCBvbiBmb3JrKCksIGFuZCB0aG9zZSB1c2VkIGJ5CisgICBzZWxlY3QoKSwgYXJlIHNvIGRpZmZlcmVudCwgaXQgd2FzIG5vdCBwcmFjdGljYWwgdG8gaW1wbGVtZW50IHRoZW0KKyAgIGJvdGggaW4gb25lIG1vZHVsZS4gU28gdGhlIHNlbGVjdCgpLWJhc2VkIENPTk5FQ1QgY29tbWFuZCBtb2R1bGUgZm9yCisgICBVTklYIGlzIFsxMzhdY2t1Y25zLmMsIGFuZCB0aGUgZm9yay1iYXNlZCBvbmUgcmVtYWlucyBbMTM5XWNrdWNvbi5jLgorICAgVG8gY2hvb3NlIHRoZSBmb3JrLWJhc2VkIG9uZSwgd2hpY2ggaXMgbW9yZSBwb3J0YWJsZSAoYnV0IHNsb3dlciBhbmQKKyAgIG1vcmUgZnJhZ2lsZSksIHVzZSAid2VybWl0IiBhcyB0aGUgbWFrZSB0YXJnZXQuIFRvIGNob29zZSB0aGUKKyAgIHNlbGVjdC1iYXNlZCBvbmUsIHVzZSAieGVybWl0Ii4gT25seSBkbyB0aGlzIGlmIHlvdSBjYW4gdmVyaWZ5IHRoYXQKKyAgIHRoZSBDT05ORUNUIGNvbW1hbmQgd29ya3Mgb24gc2VyaWFsIGNvbm5lY3Rpb25zIGFuZCBQSVBFIGNvbm5lY3Rpb25zCisgICBhcyB3ZWxsIGFzIFRDUCBjb25uZWN0aW9ucy4KKworICAgICBUaGUgc2VsZWN0KCktYmFzZWQgVW5peCBDT05ORUNUIG1vZHVsZSwgY2t1Y25zLmMsIG11c3QgYmUgdXNlZCBpZgorICAgICBlbmNyeXB0aW9uIGlzIHRvIGJlIGRvbmUsIHNpbmNlIHRoZSBmb3JrKCkgdmVyc2lvbiAoY2t1Y29uLmMpIGxvc2VzCisgICAgIGl0cyBhYmlsaXR5IHRvIHNoYXJlIHZpdGFsIHN0YXRlIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIHR3byBmb3Jrcy4KKyAgICAgQWxzbyBub3RlIHRoYXQgdGhlIHNlbGVjdCgpIHZlcnNpb24gaXMgc3VwZXJpb3IgaW4gbWFueSBvdGhlciB3YXlzCisgICAgIHRvby4gRm9yIGV4YW1wbGUsIGl0IHJlY292ZXJzIGJldHRlciBmcm9tIGV4dGVyaW9yIGtpbGxpbmcsIGZvcmNlZAorICAgICBkaXNjb25uZWN0aW9ucywgZXRjLCBwbHVzIGl0IGdvZXMgZmFzdGVyLgorCisgICBTSE9XIFZFUlNJT05TIHRlbGxzIHdoZXRoZXIgdGhlIENPTk5FQ1QgbW9kdWxlIHVzZXMgZm9yaygpIG9yCisgICBzZWxlY3QoKS4KKworICAgQy1LZXJtaXQgOC4wIGFkZHMgbGVhcm5lZCBzY3JpcHQgY2FwYWJpbGl0eSwgd2hpY2ggZGVwZW5kcyBvbgorICAgc2VsZWN0KCkuIEFsbCB0aGUgIndlcm1pdCIgYmFzZWQgdGFyZ2V0cyAoYXMgb3Bwb3NlZCB0byAieGVybWl0IikgaGFkCisgICBOT0xFQVJOIGFkZGVkIHRvIHRoZW0uIFdoZW5ldmVyIGNoYW5naW5nIGEgdGFyZ2V0IG92ZXIgZnJvbSB3ZXJtaXQgdG8KKyAgIHhlcm1pdCwgYWxzbyByZW1lbWJlciB0byByZW1vdmUgTk9MRUFSTi4KKworICAgWyBbMTQwXUMtS2VybWl0IEhvbWUgXSBbIFsxNDFdS2VybWl0IEhvbWUgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEyLiBJL08gUkVESVJFQ1RJT04KKworICAgWyBbMTQyXVRvcCBdIFsgWzE0M11Db250ZW50cyBdIFsgWzE0NF1OZXh0IF0gWyBbMTQ1XVByZXZpb3VzIF0KKworICAgVGhlIFJFRElSRUNUIGNvbW1hbmQgYWxsb3dzIGEgbG9jYWwgcHJvZ3JhbSB0byBiZSBydW4gd2l0aCBpdHMgaS9vCisgICByZWRpcmVjdGVkIG92ZXIgdGhlIGNvbW11bmljYXRpb25zIGNvbm5lY3Rpb24uIFlvdXIgdmVyc2lvbiBvZgorICAgQy1LZXJtaXQgaGFzIGEgUkVESVJFQ1QgY29tbWFuZCBpZiBpdCB3YXMgYnVpbHQgd2l0aCB0aGUgZm9sbG93aW5nCisgICBDRkxBRzoKKworICAtRENLX1JFRElSCisKKyAgIFRoaXMsIGluIHR1cm4sIGlzIHBvc3NpYmxlIG9ubHkgaWYgdGhlIHVuZGVybHlpbmcgQVBJIGlzIHRoZXJlLiBJbiB0aGUKKyAgIGNhc2Ugb2YgVU5JWCB0aGlzIGlzIGp1c3QgdGhlIHdhaXQoKSBzeXN0ZW0gY2FsbCwgc28gYWxsIFVOSVggdmVyc2lvbnMKKyAgIGdldCB0aGlzIGZlYXR1cmUgYXMgb2YgNi4wLjE5MiAoZWFybGllciB2ZXJzaW9ucyBuZWVkZWQgYSA8c3lzL3dhaXQuaD4KKyAgIGhlYWRlciBmaWxlIGRlZmluaW5nIHRoZSBzeW1ib2xzIFdJRkVYSVRFRCBhbmQgV0VYSVRTVEFUVVMpLgorCisgICBBcyBvZiB2ZXJzaW9uIDcuMCwgZmlsZSB0cmFuc2ZlciBjYW4gYmUgZG9uZSB1c2luZyBwaXBlcyBhbmQgZmlsdGVycy4KKyAgIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsICNkZWZpbmUgUElQRVNFTkQgKGFuZCBmaWxsIGluIHRoZSBjb2RlKS4gVG8KKyAgIGRpc2FibGUgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBub3JtYWxseSBlbmFibGVkLCBkZWZpbmUgTk9QSVBFU0VORC4KKyAgIFRoaXMgZmVhdHVyZSBpcywgb2YgY291cnNlLCBhbHNvIGRpc2FibGVkIGJ5IGJ1aWxkaW5nIHdpdGggTk9QVVNIIChvcgorICAgZ2l2aW5nIHRoZSAibm9wdXNoIiBjb21tYW5kIGF0IHJ1bnRpbWUpLgorCisgICBDLUtlcm1pdCA3LjAgYWxzbyBhZGRzIHRoZSBQSVBFIGFuZCBTRVQgSE9TVCAvQ09NTUFORCBjb21tYW5kcywgd2hpY2gKKyAgIHByb3ZpZGUgYW5vdGhlciBmb3JtIG9mIHJlZGlyZWN0aW9uLiBUaGlzIGZlYXR1cmUgaXMgc2VsZWN0ZWQgd2l0aAorICAgLURORVRDTUQuIENLX1JESVIgbXVzdCBhbHNvIGJlIGRlZmluZWQsIHNpbmNlIHRoZSBzYW1lIG1lY2hhbmlzbXMgYXJlCisgICB1c2VkIGludGVybmFsbHkuCisKKyAgIFsgWzE0Nl1DLUtlcm1pdCBIb21lIF0gWyBbMTQ3XUtlcm1pdCBIb21lIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxMy4gRkxPQVRJTkctUE9JTlQgTlVNQkVSUywgVElNRVJTLCBBTkQgQVJJVEhNRVRJQworCisgICBbIFsxNDhdVG9wIF0gWyBbMTQ5XUNvbnRlbnRzIF0gWyBbMTUwXU5leHQgXSBbIFsxNTFdUHJldmlvdXMgXQorCisgICBGbG9hdGluZy1wb2ludCBzdXBwb3J0IHdhcyBhZGRlZCBpbiBDLUtlcm1pdCA3LjAuCisKKyAgIEZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXJlIGVuYWJsZWQgaW50ZXJuYWxseSwgYXQgbGVhc3QgZm9yIHVzZSBpbgorICAgaGlnaC1wcmVjaXNpb24gZmlsZS10cmFuc2ZlciB0aW1lcnMgYW5kIHN0YXRpc3RpY3MsIHVubGVzcyB0aGUKKyAgIGZvbGxvd2luZyBzeW1ib2wgaXMgZGVmaW5lZCBhdCBjb21waWxlIHRpbWU6CisKKyAgLUROT0ZMT0FUCisKKyAgIFRoaXMgbWlnaHQgYmUgbmVjZXNzYXJ5IG9uIG9sZCBQQ3MgdGhhdCBkbyBub3QgaGF2ZSBidWlsdC1pbgorICAgZmxvYXRpbmctcG9pbnQgaGFyZHdhcmUuCisKKyAgIFdoZW4gTk9GTE9BVCBpcyBub3QgZGVmaW5lZCwgdGhlIGZvbGxvd2luZyBzeW1ib2wgdGVsbHMgd2hpY2gKKyAgIGZsb2F0aW5nLXBvaW50IHR5cGUgdG8gdXNlOgorCisgIC1EQ0tGTE9BVD14eHh4CisKKyAgIFRoZSB2YWx1ZSBpcyBlaXRoZXIgImRvdWJsZSIgKG5vcm1hbCBmb3IgMzItIGFuZCAxNi1iaXQgYXJjaGl0ZWN0dXJlcykKKyAgIG9yICJmbG9hdCIgKG5vcm1hbCBmb3IgNjQtYml0IGFyY2hpdGVjdHVyZXMpLgorCisgICBDLUtlcm1pdCBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UgaGlnaC1wcmVjaXNpb24gZmlsZS10cmFuc2ZlciB0aW1lcnMKKyAgIGZvciBtb3JlIGFjY3VyYXRlIHN0YXRpc3RpY3MuIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIHdpdGg6CisKKyAgLURHRlRJTUVSCisKKyAgIGFuZCBkaXNhYmxlZCB3aXRoOgorCisgIC1ETk9HRlRJTUVSCisKKyAgIElmIHlvdSB0cnkgdG8gYnVpbGQgd2l0aCAtREdGVElNRVIgYnV0IHlvdSBnZXQgY29tcGlsYXRpb24gZXJyb3JzLAorICAgZWl0aGVyIGZpeCB0aGVtIChhbmQgc2VuZCBlbWFpbCB0byBrZXJtaXRAY29sdW1iaWEuZWR1IHRlbGxpbmcgd2hhdAorICAgeW91IGRpZCksIG9yIGVsc2UgZ2l2ZSB1cCBhbmQgdXNlIC1ETk9HRlRJTUVSIChvciAtRE5PRkxPQVQpIGluc3RlYWQuCisgICBIaW50OiBkZXBlbmRpbmcgb24geW91ciBtYWNoaW5lIGFyY2hpdGVjdHVyZSwgeW91IG1pZ2h0IGhhdmUgYmV0dGVyCisgICBsdWNrIHVzaW5nIGRvdWJsZSB0aGFuIGZsb2F0IGFzIHRoZSBkYXRhIHR5cGUgZm9yIGZsb2F0aW5nLXBvaW50CisgICBudW1iZXJzLCBvciB2aWNlIHZlcnNhLiBMb29rIGluIFsxNTJdY2tjZGViLmggZm9yIHRoZSBDS0ZMT0FUCisgICBkZWZpbml0aW9uLgorCisgICBGbG9hdGluZy1wb2ludCBhcml0aG1ldGljIGlzIGFsc28gc3VwcG9ydGVkIGluIHRoZSBzY3JpcHQgcHJvZ3JhbW1pbmcKKyAgIGxhbmd1YWdlLiBGaXJzdCB2aWEgdGhlIFxmcHAuLi4oKSBmdW5jdGlvbnMsIHN1Y2ggYXMgXGZwcGFkZCgpLCB3aGljaAorICAgYWRkcyB0d28gZmxvYXRpbmctcG9pbnQgbnVtYmVycywgc2Vjb25kIGluIFMtRXhwcmVzc2lvbnMuIEFkZGl0aW9uLAorICAgc3VidHJhY3Rpb24sIG11bHRpcGxpY2F0aW9uLCBhbmQgZGl2aXNpb24gYXJlIGFsd2F5cyBhdmFpbGFibGUuIEJ1dAorICAgb3RoZXIgZnVuY3Rpb25zIHN1Y2ggYXMgbG9ncywgcmFpc2luZyB0byBwb3dlcnMsIHNpbmVzIGFuZCBjb3NpbmVzLAorICAgZXRjLCByZXF1aXJlIHRoZSBDIE1hdGggbGlicmFyeS4gVG8gaW5jbHVkZSB1c2VyLWxldmVsIGZsb2F0aW5nLXBvaW50CisgICBtYXRoIHlvdSBtdXN0IHB1dDoKKworICAtREZORkxPQVQKKworICAgYW5kIGluIFVuaXggeW91IG11c3QgbGluayB3aXRoIHRoZSBNYXRoIGxpYnJhcnk6CisKKyAgTElCUz0iLi4uLiAtbG0iCisKKyAgIEluIEs5NSBhbmQgVk1TLCBGTkZMT0FUIGlzIGRlZmluZWQgYXV0b21hdGljYWxseSBpZiBDS0ZMT0FUIGlzCisgICBkZWZpbmVkLiBJbiBVbml4LCBob3dldmVyLCBGTkZMT0FUIG11c3QgYmUgYWRkZWQgdG8gZWFjaCBtYWtlZmlsZQorICAgdGFyZ2V0IGluZGl2aWR1YWxseSwgYmVjYXVzZSBvZiB0aGUgc3BlY2lhbCBsaW5raW5nIGluc3RydWN0aW9ucyB0aGF0CisgICBtdXN0IGFsc28gYmUgYWRkZWQgdG8gZWFjaCB0YXJnZXQuCisKKyAgIE5vdGU6IFMtRXhwcmVzc2lvbnMgcmVxdWlyZSBGTkZMT0FULgorCisgICBbIFsxNTNdQy1LZXJtaXQgSG9tZSBdIFsgWzE1NF1LZXJtaXQgSG9tZSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMTQuIFNQRUNJQUwgQ09ORklHVVJBVElPTlMKKworICAgWyBbMTU1XVRvcCBdIFsgWzE1Nl1Db250ZW50cyBdIFsgWzE1N11QcmV2aW91cyBdCisKKyAgIEFzIG9mIEMtS2VybWl0IDcuMCwgaWYgeW91IGJ1aWxkIEMtS2VybWl0IG5vcm1hbGx5LCBidXQgd2l0aCAtRE5PSUNQCisgICAoTm8gSW50ZXJhY3RpdmUgQ29tbWFuZCBQYXJzZXIpLCB5b3UgZ2V0IGEgcHJvZ3JhbSBjYXBhYmxlIG9mIG1ha2luZworICAgc2VyaWFsIGNvbm5lY3Rpb25zIChidXQgbm90IGRpYWxpbmcpIGFuZCBuZXR3b3JrIGNvbm5lY3Rpb25zIChpZgorICAgVENQU09DS0VUIG9yIG90aGVyIG5ldHdvcmsgb3B0aW9uIGluY2x1ZGVkKSwgYW5kIGNhbiBhbHNvIHRyYW5zZmVyCisgICBmaWxlcyB1c2luZyBLZXJtaXQgcHJvdG9jb2wsIGJ1dCBvbmx5IHZpYSBhdXRvZG93bmxvYWQvdXBsb2FkLgorICAgRnVydGhlcm1vcmUsIGlmIHlvdSBjYWxsIHRoZSBleGVjdXRhYmxlICJ0ZWxuZXQiLCBpdCB3aWxsIGFjdCBsaWtlCisgICBUZWxuZXQgLS0gdXNpbmcgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zLiBIb3dldmVyLCBpbiB0aGlzIGNhc2UgdGhlcmUKKyAgIGlzIG5vdGhpbmcgdG8gZXNjYXBlIGJhY2sgdG8sIHNvIGlmIHlvdSB0eXBlIEN0cmwtXGMsIGl0IGp1c3QgcHJpbnRzIGEKKyAgIG1lc3NhZ2UgdG8gdGhpcyBlZmZlY3QuCisKKyAgIFlvdSBjYW4gYWxzbyBidWlsZCBDLUtlcm1pdCB3aXRoIC1ETk9YRkVSLCBtZWFuaW5nIG9taXQgYWxsIHRoZQorICAgZmlsZS10cmFuc2ZlciBmZWF0dXJlcy4gVGhpcyBsZWF2ZXMgeW91IHdpdGggYSBzY3JpcHRhYmxlCisgICBjb21tdW5pY2F0aW9ucyBwcm9ncmFtIHRoYXQgaXMgY29uc2lkZXJhYmx5IHNtYWxsZXIgdGhhbiB0aGUgZnVsbAorICAgQy1LZXJtaXQuCisKKyAgIFsgWzE1OF1DLUtlcm1pdCBIb21lIF0gWyBbMTU5XUtlcm1pdCBIb21lIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICBBUFBFTkRJWCBJOiBTVU1NQVJZIE9GIENPTVBJTEUtVElNRSBPUFRJT05TCisKKyAgIFsgWzE2MF1Ub3AgXSBbIFsxNjFdQ29udGVudHMgXQorCisgICBUaGVzZSBhcmUgdGhlIHN5bWJvbHMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZSBjYyBjb21tYW5kIGxpbmUsCisgICBsaXN0ZWQgYWxwaGFiZXRpY2FsbHkuIE90aGVycyBhcmUgdXNlZCBpbnRlcm5hbGx5LCBpbmNsdWRpbmcgdGhvc2UKKyAgIHRha2VuIGZyb20gaGVhZGVyIGZpbGVzLCB0aG9zZSBkZWZpbmVkIGJ5IHRoZSBjb21waWxlciBpdHNlbGYsIGFuZAorICAgdGhvc2UgaW5mZXJyZWQgZnJvbSB0aGUgb25lcyBnaXZlbiBiZWxvdy4gS2VybWl0J3MgU0hPVyBWRVJTSU9OUworICAgY29tbWFuZCBhdHRlbXB0cyB0byBkaXNwbGF5IG1vc3Qgb2YgdGhlc2UuIFNlZSBbMTYyXWNrY2RlYi5oIGFuZAorICAgWzE2M11ja2NuZXQuaCBmb3IgaW5mZXJlbmNlIHJ1bGVzLiBGb3IgZXhhbXBsZSBTVlIzIGltcGxpZXMgQVRUU1YsCisgICBNVUxUSU5FVCBpbXBsaWVzIFRDUFNPQ0tFVCwgYW5kIHNvIG9uLgorCisgICBIZXJlIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHRoZSBLZXJtaXQtc3BlY2lmaWMgY29tcGlsZS10aW1lCisgICBzd2l0Y2hlczoKKworICAgQUNVQ05UUkwgU2VsZWN0IEJTRCA0LjMtc3R5bGUgYWN1Y250cmwoKSBiaWRpcmVjdGlvbmFsIHR0eSBjb250cm9sLgorICAgYWVnaXMgQnVpbGQgZm9yIEFwb2xsbyBBZWdpcyAocHJlZGVmaW5lZCBvbiBBcG9sbG8gc3lzdGVtcykuCisgICBBSVgzNzAgQnVpbGQgZm9yIElCTSBBSVgvMzcwIGZvciBJQk0gbWFpbmZyYW1lcy4KKyAgIEFJWEVTQSBCdWlsZCBmb3IgSUJNIEFJWC9FU0EgZm9yIElCTSBtYWluZnJhbWVzLgorICAgQUlYUFMyIEJ1aWxkIGZvciBJQk0gQUlYIDMuMCBmb3IgUFMvMiBzZXJpZXMgKG5ldmVyIGZvcm1hbGx5CisgICByZWxlYXNlZCkuCisgICBBSVhSUyBCdWlsZCBmb3IgSUJNIEFJWCAzLnggb24gUlMvNjAwMC4KKyAgIEFJWDQxIEJ1aWxkIGZvciBJQk0gQUlYIDQueCBvbiBSUy82MDAwLgorICAgQU1JR0EgQnVpbGQgZm9yIENvbW1vZG9yZSBBbWlnYSB3aXRoIEludHVpdGlvbiBPUy4KKyAgIEFUVDYzMDAgQnVpbGQgZm9yIEFUJlQgNjMwMCBQTFVTLgorICAgQVRUNzMwMCBCdWlsZCBmb3IgQVQmVCA3MzAwIFVOSVggUEMgKDNCMSkuCisgICBBVFRTViBCdWlsZCBmb3IgQVQmVCBTeXN0ZW0gSUlJIG9yIFYgVU5JWC4KKyAgIEFVWCBCdWlsZCBmb3IgQXBwbGUgQS9VWCBmb3IgdGhlIE1hY2ludG9zaC4KKyAgIEJJR0JVRk9LIE9LIHRvIHVzZSBiaWcgYnVmZmVycyAtICJtZW1vcnkgaXMgbm90IGEgcHJvYmxlbSIKKyAgIEJQU194eHh4IEVuYWJsZSBTRVQgU1BFRUQgeHh4eAorICAgQlNEMjkgQnVpbGQgZm9yIEJTRCAyLjkgb3IgMi4xMC4KKyAgIEJTRDQgQnVpbGQgZm9yIEJTRCA0LjIuCisgICBCU0Q0MSBCdWlsZCBmb3IgQlNEIDQuMS4KKyAgIEJTRDQzIEJ1aWxkIGZvciBCU0QgNC4zLgorICAgQlNENDQgQnVpbGQgZm9yIEJTRCA0LjQuCisgICBDNzAgQnVpbGQgZm9yIEJCTiBDLzcwLgorICAgQ0lFIEJ1aWxkIGZvciBDSUUgU3lzdGVtcyA2ODAvMjAuCisgICBDS0NPTklOVEI0Q0IgV29yayBhcm91bmQgcHJvbXB0LWRpc2FwcGVhcnMgYWZ0ZXIgZXNjYXBlIGJhY2sgZnJvbQorICAgQ09OTkVDVC4KKyAgIENLTEVBUk4gQnVpbGQgd2l0aCBzdXBwb3J0IGZvciBsZWFybmVkIHNjcmlwdHMuCisgICBDS0xPR0RJQUwgRW5hYmxlIGNvbm5lY3Rpb24gbG9nLgorICAgQ0tNQVhQQVRIIE1heGltdW0gbGVuZ3RoIGZvciBhIGZ1bGx5IHF1YWxpZmllZCBmaWxlbmFtZS4KKyAgIENLUkVHRVggKG1pc25vbWVyKSBJbmNsdWRlIFsuLi5dIG9yIHt4eHgseHh4LHh4eH0gbWF0Y2hpbmcgaW4KKyAgIGNrbWF0Y2goKS4KKyAgIENLU1lTTE9HIEVuYWJsZSBzeXNsb2dnaW5nLgorICAgQ0tfQU5TSUMgRW5hYmxlIEFOU0kgQyBjb25zdHJ1Y3RzIC0gcHJvdG90eXBlcywgZXRjLgorICAgQ0tfQU5TSUxJQlMgVXNlIGhlYWRlciBmaWxlcyBmb3IgQU5TSSBDIGxpYnJhcmllcy4KKyAgIENLX0FQQyBFbmFibGUgQVBDIGV4ZWN1dGlvbiBieSBDT05ORUNUIG1vZHVsZS4KKyAgIENLX0NVUlNFUyBFbmFibGUgZnVsbHNjcmVlbiBmaWxlIHRyYW5zZmVyIGRpc3BsYXkuCisgICBDS19EU1lTSU5JIFVzZSBzeXN0ZW0td2lkZSBpbml0IGZpbGUsIHdpdGggbmFtZSBzdXBwbGllZCBieSBLZXJtaXQuCisgICBDS19EVFJDRCBEVFIvQ0QgZmxvdyBjb250cm9sIGlzIGF2YWlsYWJsZS4KKyAgIENLX0ZBU1QgQnVpbGQgd2l0aCBmYXN0IEtlcm1pdCBwcm90b2NvbCBkZWZhdWx0cy4KKyAgIENLX0ZPUktfU0lHIFVOSVggb25seTogc2lnbmFsKCkgbnVtYmVyIGZvciBDT05ORUNUIG1vZHVsZSBmb3Jrcy4KKyAgIENLX0lGUk8gSUYgUkVNT1RFIGNvbW1hbmQgaXMgYXZhaWxhYmxlIChhbmQgY2FuIHJ1biBpbiByZW1vdGUgbW9kZSkuCisgICBDS19JTklfQSBTeXN0ZW0td2lkZSBpbml0IGZpbGUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHVzZXIncy4KKyAgIENLX0lOSV9CIFVzZXIncyBpbml0IGZpbGUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBzeXN0ZW0td2lkZSBvbmUuCisgICBDS19MQUJFTEVEIEluY2x1ZGUgc3VwcG9ydCBmb3IgU0VUIEZJTEUgVFlQRSBMQUJFTEVELgorICAgQ0tfTEJSSyBUaGlzIHZlcnNpb24gY2FuIHNlbmQgTG9uZyBCUkVBSy4KKyAgIENLX0xJTkdFUiBBZGQgY29kZSB0byB0dXJuIG9mIFRDUCBzb2NrZXQgImxpbmdlciIgcGFyYW1ldGVyLgorICAgQ0tfTUtESVIgVGhpcyB2ZXJzaW9uIGhhcyBhIHpta2RpcigpIGNvbW1hbmQgdG8gY3JlYXRlIGRpcmVjdG9yaWVzLgorICAgQ0tfTkFXUyBJbmNsdWRlIFRFTE5FVCBOZWdvdGlhdGUgQWJvdXQgV2luZG93IFNpemUgc3VwcG9ydC4KKyAgIENLX05FV1RFUk0gVXNlIG5ld3Rlcm0oKSByYXRoZXIgdGhhbiBpbml0c2NyKCkgdG8gaW5pdGlhbGl6ZSBjdXJzZXMuCisgICBDS19QQU0gSW5jbHVkZSBQQU0gYXV0aGVudGljYXRpb24gKG1pZ2h0IGFsc28gcmVxdWlyZSAtbHBhbSkuCisgICBDS19QQ1RfQkFSIEZ1bGxzY3JlZW4gZmlsZSB0cmFuc2ZlciBkaXNwbGF5IHNob3VsZCBpbmNsdWRlCisgICAidGhlcm1vbWV0ZXIiLgorICAgQ0tfUE9MTCBTeXN0ZW0tViBvciBQT1NJWCBiYXNlZCBVTklYIGhhcyBwb2xsKCkgZnVuY3Rpb24uCisgICBDS19QT1NJWF9TSUcgVXNlIFBPU0lYIHNpZ25hbCBoYW5kaW5nOiBzaWdqbXBfYnVmLCBzaWdzZXRqbXAsCisgICBzaWdsb25nam1wLgorICAgQ0tfUkVBRDAgcmVhZChmZCwmeCwwKSBjYW4gYmUgdXNlZCB0byB0ZXN0IFRDUC9JUCBjb25uZWN0aW9ucy4KKyAgIENLX1JFRElSIEVuYWJsZSB0aGUgUkVESVJFQ1QgY29tbWFuZC4KKyAgIENLX1JFU0VORCBJbmNsdWRlIHRoZSBSRVNFTkQgY29tbWFuZCAobmVlZHMgemZzZWVrKCkgKyBhcHBlbmQpLgorICAgQ0tfUlRTQ1RTIFJUUy9DVFMgZmxvdyBjb250cm9sIGlzIGF2YWlsYWJsZS4KKyAgIENLX1NIQURPVyBJbmNsdWRlIHN1cHBvcnQgZm9yIHNoYWRvdyBwYXNzd29yZHMgKGUuZy4gZm9yIElLU0QKKyAgIGF1dGhlbnRpY2F0aW9uKS4KKyAgIENLX1NPQ0tCVUYgRW5hYmxlIFRDUCBzb2NrZXQtYnVmZmVyLXNpemUtaW5jcmVhc2luZyBjb2RlLgorICAgQ0tfU09DS1MgVU5JWCBvbmx5OiBCdWlsZCB3aXRoIHNvY2tzIGxpYnJhcnkgcmF0aGVyIHRoYW4gcmVndWxhcgorICAgc29ja2V0cworICAgQ0tfU09DS1M1IFVOSVggb25seTogQnVpbGQgd2l0aCBzb2NrcyA1IGxpYiByYXRoZXIgdGhhbiByZWd1bGFyCisgICBzb2NrZXRzCisgICBDS19TUEVFRCBFbmFibGUgY29udHJvbC1jaGFyYWN0ZXIgdW5wcmVmaXhpbmcuCisgICBDS19TWVNJTkk9Inh4eHh4IiBRdW90ZWQgc3RyaW5nIHRvIGJlIHVzZWQgYXMgc3lzdGVtLXdpZGUgaW5pdCBmaWxlCisgICBuYW1lLgorICAgQ0tfVElNRVJTIEJ1aWxkIHdpdGggc3VwcG9ydCBmb3IgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBwYWNrZXQKKyAgIHRpbWVvdXRzLgorICAgQ0tfVE1QRElSIFRoaXMgdmVyc2lvbiBvZiBLZXJtaXQgaGFzIGFuIGlzZGlyKCkgZnVuY3Rpb24uCisgICBDS19UVFlGRCBEZWZpbmVkIG9uIHN5c3RlbXMgd2hlcmUgdGhlIGNvbW11bmljYXRpb25zIGNvbm5lY3Rpb24gZmlsZQorICAgZGVzY3JpcHRvciAodHR5ZmQpIGNhbiBiZSBwYXNzZWQgdG8gb3RoZXIgcHJvY2Vzc2VzIGFzIGEgY29tbWFuZC1saW5lCisgICBhcmd1bWVudCB2aWEgXHYodHR5ZmQpLgorICAgQ0tfVVJMIFBhcnNlIFVSTHMgYXMgd2VsbCBhcyBob3N0bmFtZXMsIGV0Yy4KKyAgIENLX1hPTlhPRkYgWG9uL1hvZmYgZmxvdyBjb250cm9sIGF2YWlsYWJsZS4KKyAgIENLX1hZWiBJbmNsdWRlIHN1cHBvcnQgZm9yIFhZWk1PREVNIHByb3RvY29scy4KKyAgIENLX1dSRUZSRVNIIEN1cnNlcyBwYWNrYWdlIGluY2x1ZGVzIHdyZWZyZXNoKCksY2xlYXJvaygpIGZvciBzY3JlZW4KKyAgIHJlZnJlc2guCisgICBDS0ZMT0FUPXR5cGUgRmxvYXRpbmctcG9pbnQgZGF0YSB0eXBlLCAiZG91YmxlIiBvciAiZmxvYXQiLgorICAgQ0tUWVBfSD14eHggRm9yY2UgaW5jbHVkZSBvZiB4eHggYXMgPHR5cGVzLmg+IGZpbGUuCisgICBDTFNPUE4gV2hlbiBoYW5naW5nIHVwIGEgdHR5IGRldmljZSwgYWxzbyBjbG9zZSBhbmQgcmVvcGVuIGl0LgorICAgQ01EREVQIE1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGZvciBzZWxmLXJlZmVyZW50aWFsIHVzZXItZGVmaW5lZCBmbidzLgorICAgQ09IRVJFTlQgQnVpbGQgZm9yIE1hcmsgV2lsbGlhbXMgQ29oZXJlbnQgVU5JWAorICAgQ09OR1NQRCBEZWZpbmUgaWYgdGhpcyB2ZXJzaW9uIGhhcyBjb25nc3BkKCkgcm91dGluZSBpbiBjaz90aW8uYworICAgZGF0YWdlbmVyYWwgQnVpbGQgZm9yIERhdGEgR2VuZXJhbCBBT1MvVlMgb3IgQU9TL1ZTIElJCisgICBEQ0xQT1BFTiBwb3BlbigpIGlzIGF2YWlsYWJsZSBidXQgbmVlZHMgdG8gYmUgZGVjbGFyZWQKKyAgIERFQ19UQ1BJUCBCdWlsZCB3aXRoIHN1cHBvcnQgZm9yIERFQyBUQ1AvSVAgKFVDWCkgZm9yIChPcGVuKVZNUworICAgREdVWDQzMCBCdWlsZCBmb3IgREcvVVggNC4zMAorICAgREdVWDU0MCBCdWlsZCBmb3IgREcvVVggNS40MAorICAgREVGUEFSPXggRGVmYXVsdCBwYXJpdHksIDAsICdlJywgJ28nLCAnbScsIG9yICdzJy4KKyAgIERGVFRZPXh4eCBEZWZhdWx0IGNvbW11bmljYXRpb25zIGRldmljZSBuYW1lLgorICAgRElSRU5UIFVOSVggZGlyZWN0b3J5IHN0cnVjdHVyZSB0byBiZSB0YWtlbiBmcm9tIDxkaXJlbnQuaD4uCisgICBESVJQV0RSUCBQcm9tcHQgZm9yIHBhc3N3b3JkIGluIFJFTU9URSBDV0QgY29tbWFuZC4KKyAgIERUSUxERSBJbmNsdWRlIFVOSVggfiBub3RhdGlvbiBmb3IgdXNlcm5hbWUvaG9tZS1kaXJlY3RvcnkKKyAgIERZTkFNSUMgQWxsb2NhdGUgZmlsZSB0cmFuc2ZlciBwYWNrZXQgYnVmZmVycyBkeW5hbWljYWxseSB3aXRoIG1hbGxvYy4KKyAgIEVOQ09SRSBCdWlsZCBmb3IgRW5jb3JlIE11bHRpbWF4IGNvbXB1dGVycy4KKyAgIEVYQ0VMQU4gQnVpbGQgd2l0aCBleGNlbGFuIFRDUC9JUC4KKyAgIEZORkxPQVQgSW5jbHVkZSBmbG9hdGluZy1wb2ludCBtYXRoIGZ1bmN0aW9ucyAobG9ncywgc2luLCBjb3MsIGV4cCwKKyAgIGV0YykKKyAgIEZUMTggQnVpbGQgZm9yIEZvcnR1bmUgRm9yOlBybyAxLjguCisgICBGVDIxIEJ1aWxkIGZvciBGb3J0dW5lIEZvcjpQcm8gMi4xLgorICAgR0VNRE9TIEJ1aWxkIGZvciBBdGFyaSBTVCBHRU1ET1MuCisgICBHRlRJTUVSIFVzZSBoaWdoLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmaWxlLXRyYW5zZmVyIHRpbWVycy4KKyAgIEdJRF9UPXh4eCBHcm91cCBJRHMgYXJlIG9mIHR5cGUgeHh4ICh1c3VhbGx5IGludCwgc2hvcnQsIG9yIGdpZF90KS4KKyAgIEhBRERSTElTVCBJZiBnZXRob3N0YnluYW1lKCkgaG9zdGVudCBzdHJ1Y3QgY29udGFpbnMgYSBsaXN0IG9mCisgICBhZGRyZXNzZXMuCisgICBIREJVVUNQIEJ1aWxkIHdpdGggc3VwcG9ydCBmb3IgSG9uZXkgRGFuQmVyIFVVQ1AuCisgICBIUFVYIEJ1aWxkIGZvciBIZXdsZXR0IFBhY2thcmQgSFAtVVguCisgICBIUFVYOSBCdWlsZCBmb3IgSGV3bGV0dCBQYWNrYXJkIEhQLVVYIDkueC4KKyAgIEhQVVgxMCBCdWlsZCBmb3IgSGV3bGV0dCBQYWNrYXJkIEhQLVVYIDEwLnguCisgICBIV1BBUklUWSBEZWZpbmUgaWYgdGhpcyB2ZXJzaW9uIGNhbiBTRVQgUEFSSVRZIEhBUkRXQVJFIHsgRVZFTiwKKyAgIE9ERC4uLn0KKyAgIEkzODZJWCBCdWlsZCBmb3IgSW50ZXJhY3RpdmUgU3lzdGVtIFYgUjMuCisgICBJRkRFQlVHIEFkZCBJRiBzdG10cyAiaWYgKGRlYmxvZykiIGJlZm9yZSAiZGVidWcoKSIgY2FsbHMuCisgICBJTkFERFJYIFRDUC9JUCBpbmV0X2FkZHIoKSB0eXBlIGlzIHN0cnVjdCBpbmFkZHIsIG5vdCB1bnNpZ25lZCBsb25nLgorICAgSU5URVJMQU4gQnVpbGQgd2l0aCBzdXBwb3J0IGZvciBSYWNhbC9JbnRlcmxhbiBUQ1AvSVAuCisgICBJU0RJUkJVRyBTeXN0ZW0gZGVmcyBvZiBTX0lTRElSIGFuZCBTX0lTUkVHIGhhdmUgYnVnLCBkZWZpbmUKKyAgIG91cnNlbHZlcy4KKyAgIElTSUlJIEJ1aWxkIGZvciBJbnRlcmFjdGl2ZSBTeXN0ZW0gSUlJLgorICAgSVgzNzAgQnVpbGQgZm9yIElCTSBJWC8zNzAuCisgICBLQU5KSSBCdWlsZCB3aXRoIEthbmppIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gc3VwcG9ydC4KKyAgIExDS0RJUiBVVUNQIGxvY2sgZGlyZWN0b3J5IGlzIC91c3Ivc3Bvb2wvdXVjcC9MQ0svLgorICAgTEZERVZOTyBVVUNQIGxvY2tmaWxlIG5hbWUgdXNlcyBkZXZpY2UgbnVtYmVycywgYXMgaW4gU1ZSNC4KKyAgIExJTlVYRlNTVE5EIEZvciBMaW51eCwgdXNlIEZTU1RORCBVVUNQIGxvY2tmaWxlIGNvbnZlbnRpb25zIChkZWZhdWx0KS4KKyAgIExPQ0tfRElSPXh4eCBVVUNQIGxvY2sgZGlyZWN0b3J5IGlzIHh4eCAocXVvdGVkIHN0cmluZykuCisgICBMT0NLRiBVc2UgbG9ja2YoKSAoaW4gYWRkaXRpb24gdG8gbG9ja2ZpbGVzKSBvbiBzZXJpYWwgbGluZXMKKyAgIExPTkdGTiBCU0QgbG9uZyBmaWxlbmFtZXMgc3VwcG9ydGVkIHVzaW5nIDxkaXIuaD4gYW5kIG9wZW5kaXIoKS4KKyAgIExZTlhPUyBCdWlsZCBmb3IgTHlueCBPUyAyLjIgb3IgbGF0ZXIgKFBPU0lYLWJhc2VkKS4KKyAgIE1BQyBCdWlsZCBmb3IgQXBwbGUgTWFjaW50b3NoIHdpdGggTWFjIE9TLgorICAgTUFUQ0hET1QgTWFrZSB3aWxkY2FyZHMgbWF0Y2ggZmlsZW5hbWVzIHRoYXQgc3RhcnQgd2l0aCBwZXJpb2QgKC4pCisgICBNQVhSUD1udW1iZXIgTWF4aW11bSByZWNlaXZlLXBhY2tldCBsZW5ndGguCisgICBNQVhTUD1udW1iZXIgTWF4aW11bSBzZW5kLXBhY2tldCBsZW5ndGguCisgICBNREVCVUcgTWFsbG9jLWRlYnVnZ2luZyByZXF1ZXN0ZWQuCisgICBNSU5JRElBTCBNaW5pbXVtIG1vZGVtIGRpYWxlciBzdXBwb3J0OiBDQ0lUVCwgSGF5ZXMsIFVua293biwgYW5kIE5vbmUuCisgICBNSU5JWCBCdWlsZCBmb3IgTUlOSVguCisgICBNSVBTIEJ1aWxkIGZvciBNSVBTIHdvcmtzdGF0aW9uLgorICAgTVVMVElORVQgQnVpbGQgd2l0aCBzdXBwb3J0IGZvciBUR1YgTXVsdGlOZXQgVENQL0lQIChWQVgvVk1TKS4KKyAgIE1fVU5JWCBEZWZpbmVkIGJ5IFNDTy4KKyAgIE5BUCBUaGUgbmFwKCkgaXMgYXZhaWxhYmxlIChjb25mbGljdHMgd2l0aCBTRUxFQ1QgYW5kIFVTTEVFUCkKKyAgIE5BUEhBQ0sgVGhlIG5hcCgpIGNhbGwgaXMgYXZhaWxhYmxlIGJ1dCBvbmx5IGFzIHN5c2NhbGwoMzExMiwuLi4pCisgICBORElSIEJTRCBsb25nIGZpbGVuYW1lcyBzdXBwb3J0ZWQgdXNpbmcgPG5kaXIuaD4gYW5kIG9wZW5kaXIoKS4KKyAgIE5ER1BXTkFNIERvbid0IGRlY2xhcmUgZ2V0cHduYW0oKS4KKyAgIE5EU1lTRVJSTElTVCBEb24ndCBkZWNsYXJlIHN5c19lcnJsaXN0W10uCisgICBORUVEU0VMRUNUREVGUyBzZWxlY3QoKSBpcyBhdmFpYmxlIGJ1dCB3ZSBuZWVkIHRvIGRlZmluZSBGRF9ibGFoCisgICBvdXJzZWx2ZXMuCisgICBORVRDTUQgQnVpbGQgd2l0aCBzdXBwb3J0IGZvciBTRVQgSE9TVCAvQ09NTUFORCBhbmQgUElQRSBjb21tYW5kcy4KKyAgIE5FWFQgQnVpbGQgZm9yIE5lWFQgTWFjaCAxLnggb3IgMi54IG9yIDMuMCwgMy4xLCBvciAzLjIuCisgICBORVhUMzMgQnVpbGQgZm9yIE5lWFQgTWFjaCAzLjMuCisgICBOT0FOU0kgRGlzYWJsZSBBTlNJIEMgZnVuY3Rpb24gcHJvdG90eXBpbmcuCisgICBOT0FQQyBEbyBub3QgaW5jbHVkZSBDS19BUEMgY29kZS4KKyAgIE5PQVJST1dLRVlTIEV4Y2x1ZGUgY29kZSB0byBwYXJzZSBBTlNJIGFycm93LWtleSBzZXF1ZW5jZXMuCisgICBOT0JfeHh4eCBEaXNhYmxlIFNFVCBTUEVFRCB4eHh4CisgICBOT0JJR0JVRiBPdmVycmlkZSBCSUdCVUZPSyB3aGVuIGl0IGlzIHRoZSBkZWZhdWx0CisgICBOT0JSS0MgRG9uJ3QgdHJ5IHRvIHJlZmVyIHRvIHRfYnJrYyBvciB0X2VvZiB0Y2hhcnMgc3RydWN0dXJlIG1lbWJlcnMuCisgICBOT0NLRlFIT1NUTkFNRSBFeGNsdWRlIGNvZGUgdG8gZ2V0IGZ1bGx5IHF1YWxpZmllZCBob3N0bmFtZSBpbiBjYXNlIGl0CisgICBjYXVzZXMgY29yZSBkdW1wcy4KKyAgIE5PQ0NUUkFQIERpc2FibGUgQ29udHJvbC1DIChTSUdJTlQpIHRyYXBwaW5nLgorICAgTk9DS1NQRUVEIERpc2FibGUgY29udHJvbC1wcmVmaXggcmVtb3ZhbCBmZWF0dXJlIChTRVQgQ09OVFJPTCkuCisgICBOT0NLVElNRVJTIEJ1aWxkIHdpdGhvdXQgc3VwcG9ydCBmb3IgZHluYW1pYyB0aW1lcnMuCisgICBOT0NLWFlaIE92ZXJyaWRlcyBDS19YWVouCisgICBOT0NLUkVHRVggRG8gbm90IGluY2x1ZGUgWy4uLl0gb3Ige3h4eCx4eHgseHh4fSBtYXRjaGluZyBpbiBja21hdGNoKCkuCisgICBOT0NNREwgQnVpbGQgd2l0aCBubyBjb21tYW5kLWxpbmUgb3B0aW9uIHByb2Nlc3NpbmcuCisgICBOT0NPVEZNQyBObyBDbG9zZShPcGVuKCkpIFRvIEZvcmNlIE1vZGUgQ2hhbmdlIChVTklYIHZlcnNpb24pLgorICAgTk9DU0VUUyBCdWlsZCB3aXRoIG5vIHN1cHBvcnQgZm9yIGNoYXJhY3RlciBzZXQgdHJhbnNsYXRpb24uCisgICBOT0NZUklMIEJ1aWxkIHdpdGggbm8gc3VwcG9ydCBmb3IgQ3lyaWxsaWMgY2hhcmFjdGVyIHNldCB0cmFuc2xhdGlvbi4KKyAgIE5PQ1lSSUxMSUMgRGl0dG8uCisgICBOT0RFQlVHIEJ1aWxkIHdpdGggbm8gZGVidWcgbG9nZ2luZyBjYXBhYmlsaXR5LgorICAgTk9ESUFMIEJ1aWxkIHdpdGggbm8gRElBTCBvciBTRVQgRElBTCBjb21tYW5kcy4KKyAgIE5PRElTUE8gQnVpbGQgdG8gYWx3YXlzIHJlZnVzZSBpbmNvbWluZyBNQUlMIG9yIFJFTU9URSBQUklOVCBmaWxlcy4KKyAgIEROT0RJU1BMQVkgQnVpbGQgd2l0aCBubyBmaWxlLXRyYW5zZmVyIGRpc3BsYXkuCisgICBOT0VTQ1NFUSBCdWlsZCB3aXRoIG5vIHN1cHBvcnQgZm9yIEFOU0kgZXNjYXBlIHNlcXVlbmNlIHJlY29nbml0aW9uLgorICAgTk9GQVNUIERvIG5vdCBtYWtlIEZBU1QgS2VybWl0IHByb3RvY29sIHNldHRpbmdzIHRoZSBkZWZhdWx0LgorICAgTk9GRFpFUk8gRG8gbm90IHVzZSBmaWxlIGRlc2NyaXB0b3IgMCBmb3IgcmVtb3RlLW1vZGUgZmlsZSB0cmFuc2Zlci4KKyAgIE5PRklMRUggRG8gbm90ICNpbmNsdWRlIDxzeXMvZmlsZS5oPi4KKyAgIE5PRkxPQVQgRG9uJ3QgaW5jbHVkZSBhbnkgZmxvYXRpbmctcG9pbnQgZGF0YSB0eXBlcyBvciBvcGVyYXRpb25zLgorICAgTk9GUklMTFMgQnVpbGQgd2l0aCAibm8gZnJpbGxzIiAodGhpcyBzaG91bGQgYmUgcGhhc2VkIG91dC4uLikKKyAgIE5PRlRSVU5DQVRFIEluY2x1ZGUgdGhpcyBvbiBVTklYZXMgdGhhdCBkb24ndCBoYXZlIGZ0cnVuY2F0ZSgpLgorICAgTk9HRVRVU0VSU0hFTEwgSW5jbHVkZSB0aGlzIG9uIFVOSVhlcyB0aGF0IGRvbid0IGhhdmUgZ2V0dXNlcnNoZWxsKCkuCisgICBOT0dGVElNRVIgRG9uJ3QgdXNlIGhpZ2gtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZpbGUtdHJhbnNmZXIKKyAgIHRpbWVycy4KKyAgIE5PSEVCUkVXIEJ1aWxkIHdpdGggbm8gc3VwcG9ydCBmb3IgSGVicmV3IGNoYXJhY3RlciBzZXRzLgorICAgTk9IRUxQIEJ1aWxkIHdpdGggbm8gYnVpbHQtaW4gaGVscC4KKyAgIE5PSUtTRCBCdWlsZCB3aXRoIElLU0Qgc3VwcG9ydCBleGNsdWRlZC4KKyAgIE5PSU5JVEdST1VQUyBJbmNsdWRlIHRoaXMgb24gVU5JWGVzIHRoYXQgZG9uJ3QgaGF2ZSBpbml0Z3JvdXBzKCkuCisgICBOT0lDUCBCdWlsZCB3aXRoIG5vIGludGVyYWN0aXZlIGNvbW1hbmQgcGFyc2VyLgorICAgTk9KQyBCdWlsZCB3aXRoIG5vIHN1cHBvcnQgZm9yIGpvYiBjb250cm9sIChzdXNwZW5kKS4KKyAgIE5PS0FOSkkgQnVpbGQgd2l0aCBubyBzdXBwb3J0IGZvciBKYXBhbmVzZSBLYW5qaSBjaGFyYWN0ZXIgc2V0cy4KKyAgIE5PS1ZFUkJTIEJ1aWxkIHdpdGggbm8gc3VwcG9ydCBmb3Iga2V5Ym9hcmQgdmVyYnMgKFxLdmVyYnMpLgorICAgTk9MQVRJTjIgQnVpbGQgd2l0aCBubyBJU08gTGF0aW4tMiBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIHN1cHBvcnQuCisgICBOT0xFQVJOIEJ1aWxkIHdpdGggbm8gc3VwcG9ydCBmb3IgbGVhcm5lZCBzY3JpcHRzLgorICAgTk9MSU5LQklUUyBVc2Ugb2YgU19JU0xOSyBhbmQgX0lGTE5LIHVudHJ1c3R3b3J0aHk7IHVzZSByZWFkbGluaygpCisgICBpbnN0ZWFkLgorICAgTk9MT0NBTCBCdWlsZCB3aXRob3V0IGFueSBsb2NhbC1tb2RlIGZlYXR1cmVzOiBObyBNYWtpbmcgQ29ubmVjdGlvbnMuCisgICBOT0xPR0RJQUwgRGlzYWJsZSBjb25uZWN0aW9uIGxvZy4KKyAgIE5PTE9HSU4gQnVpbGQgd2l0aG91dCBJS1NEIChuZXR3b3JrIGxvZ2luKSBzdXBwb3J0LgorICAgTk9MU1RBVCBOb3QgT0sgdG8gdXNlIGxzdGF0KCkuCisgICBOT01ETUhVUCBCdWlsZCB3aXRob3V0ICJtb2RlbS1zcGVjaWZpYyBoYW5ndXAiIChlLmcuIEFUSDApIGZlYXR1cmUuCisgICBOT01ISE9TVCBFeGNsdWRlIHRoZSBtdWx0aWhvbWVkLWhvc3QgVENQL0lQIGNvZGUgKGlmIGNvbXBpbGNhdGlvbgorICAgZXJyb3JzKQorICAgTk9NSU5QVVQgQnVpbGQgd2l0aG91dCBNSU5QVVQgY29tbWFuZC4KKyAgIE5PTVNFTkQgQnVpbGQgd2l0aCBubyBNU0VORCBjb21tYW5kLgorICAgTk9OQVdTIERvIG5vdCBpbmNsdWRlIFRFTE5FVCBOZWdvdGlhdGUgQWJvdXQgV2luZG93IFNpemUgc3VwcG9ydC4KKyAgIE5PTkVUIERvIG5vdCBpbmNsdWRlIGFueSBuZXR3b3JrIHN1cHBvcnQuCisgICBOT05PU0VUQlVGIChTZWUgTk9TRVRCVUYpCisgICBOT1BBUlNFTiBCdWlsZCB3aXRob3V0IGF1dG9tYXRpYyBwYXJpdHkgZGV0ZWN0aW9uLgorICAgTk9QSVBFU0VORCBEaXNhYmxlIGZpbGUgdHJhbnNmZXIgdXNpbmcgcGlwZXMgYW5kIGZpbHRlcnMuCisgICBOT1BPTEwgT3ZlcnJpZGUgQ0tfUE9MTCBkZWZpbml0aW9uLgorICAgTk9QT1BFTiBUaGUgcG9wZW4oKSBsaWJyYXJ5IGNhbGwgaXMgbm90IGF2YWlsYWJsZS4KKyAgIE5PUFVSR0UgQnVpbGQgd2l0aCBubyBQVVJHRSBjb21tYW5kLgorICAgTk9QVVNIIEJ1aWxkIHdpdGggbm8gZXNjYXBlcyB0byBvcGVyYXRpbmcgc3lzdGVtLgorICAgTk9SRUFMUEFUSCBJbiBVTklYLCByZWFscGF0aCgpIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUuCisgICBOT1JFQ0FMTCBEaXNhYmxlIHRoZSBjb21tYW5kLXJlY2FsbCBmZWF0dXJlLgorICAgTk9SRURJUkVDVCBEaXNhYmxlIFJFRElSRUNUIGNvbW1hbmQuCisgICBOT1JFTkFNRSBEb24ndCB1c2UgcmVuYW1lKCkgc3lzdGVtIGNhbGwsIHVzZSBsaW5rKCkvdW5saW5rKCkgKFVOSVgpLgorICAgTk9SRVNFTkQgQnVpbGQgd2l0aCBubyBSRVNFTkQgY29tbWFuZC4KKyAgIE5PUkVUUlkgQnVpbGQgd2l0aCBubyBjb21tYW5kLXJldHJ5IGZlYXR1cmUuCisgICBOT1NDUklQVCBCdWlsZCB3aXRoIG5vIFNDUklQVCBjb21tYW5kLgorICAgTk9TRUxFQ1QgRG9uJ3QgdHJ5IHRvIHVzZSBzZWxlY3QoKS4KKyAgIE5PU0VSVkVSIEJ1aWxkIHdpdGggbm8gU0VSVkVSIG1vZGUgYW5kIG5vIHNlcnZlci1yZWxhdGVkIGNvbW1hbmRzLgorICAgTk9TRVRCVUYgRG9uJ3QgbWFrZSBjb25zb2xlIHdyaXRlcyB1bmJ1ZmZlcmVkLgorICAgTk9OT1NFVEJVRiBETyBtYWtlIGNvbnNvbGUgd3JpdGVzIHVuYnVmZmVyZWQuCisgICBOT1NFVFJFVSBzZXRyZXVpZCgpIGFuZC9vciBzZXRyZWdpZCgpIG5vdCBhdmFpbGFibGUuCisgICBOT1NIT1cgQnVpbGQgd2l0aCBubyBTSE9XIGNvbW1hbmQgKG5vdCByZWNvbW1lbmRlZCEpLgorICAgTk9TSUdXSU5DSCBEaXNhYmxlIFNJR1dJTkNIIHNpZ25hbCB0cmFwcGluZy4KKyAgIE5PU1BMIEJ1aWxkIHdpdGggbm8gc2NyaXB0IHByb2dyYW1taW5nIGxhbmd1YWdlLgorICAgTk9TVEFUIERvbid0IGNhbGwgc3RhdCgpIGZyb20gbWFpbmxpbmUgY29kZS4KKyAgIE5PU1lNTElOSyBJbmNsdWRlIHRoaXMgZm9yIFVOSVhlcyB0aGF0IGRvbid0IGhhdmUgcmVhZGxpbmsoKS4KKyAgIE5PU1lTSU9DVExIIERvIG5vdCAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+LgorICAgTk9TWVNUSU1FSCBDbyBub3QgaW5jbHVkZSA8c3lzL3RpbWUuaD4uCisgICBOT1NZU0xPRyBEaXNhYmxlIHN5c2xvZ2dpbmcgY29kZS4KKyAgIE5PVENQT1BUUyBCdWlsZCB3aXRoIG5vIFNFVCBUQ1Agb3B0aW9ucyBvciB1bmRlcmx5aW5nIHN1cHBvcnQuCisgICBOT1RMT0cgQnVpbGQgd2l0aCBubyBzdXBwb3J0IGZvciB0cmFuc2FjdGlvbiBsb2dnaW5nLgorICAgTk9UTV9JU0RTVCBTdHJ1Y3QgdG0gaGFzIG5vIHRtX2lzZHN0IG1lbWJlci4KKyAgIE5PVU5JQ09ERSBCdWlsZCB3aXRoIG5vIHN1cHBvcnQgZm9yIFVuaWNvZGUgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbi4KKyAgIE5PVVJMIERvbid0IHBhcnNlIFVSTHMKKyAgIE5PVVVDUCBCdWlsZCB3aXRoIG5vIFVVQ1AgbG9ja2ZpbGUgc3VwcG9ydCAoZGFuZ2Vyb3VzISkuCisgICBOT1dBUk4gTWFrZSBFWElUIFdBUk5JTkcgYmUgT0ZGIGJ5IGRlZmF1bHQgKG90aGVyd2lzZSBpdCdzIE9OKS4KKyAgIE5PV1JFRlJFU0ggT3ZlcnJpZGUgYnVpbHQtaW4gZGVmaW5pdGlvbiBvZiBDS19XUkVGUkVTSCAocS52LikuCisgICBOT1hGRVIgQnVpbGQgd2l0aCBubyBLZXJtaXQgb3Igb3RoZXIgZmlsZS10cmFuc2ZlciBwcm90b2NvbHMuCisgICBOT1hNSVQgQnVpbGQgd2l0aCBubyBUUkFOU01JVCBjb21tYW5kLgorICAgTk9YUFJJTlQgRGlzYWJsZXMgdHJhbnNwYXJlbnQgcHJpbnQgY29kZS4KKyAgIE9MRE1TRyBVc2Ugb2xkICJlbnRlcmluZyBzZXJ2ZXIgbW9kZSIgbWVzc2FnZSAoc2VlIFsxNjRdY2tjbWFpLmMpLgorICAgT0xJTlVYSElTUEVFRCBCdWlsZCBpbiBvbGQgTGludXggaGktc2VyaWFsLXNwZWVkIGNvZGUgKGZvciBMaW51eCA8PQorICAgMS4wKS4KKyAgIE9QRU5CU0QgQnVpbGQgZm9yIE9wZW5CU0QuCisgICBPUzIgQnVpbGQgZm9yIE9TLzIuCisgICBPU0YgQnVpbGQgZm9yIE9TRi8xLgorICAgT1NGUEMgQnVpbGQgZm9yIE9TRi8xIG9uIGEgUEMuCisgICBPU0YzMiBEaWdpdGFsIFVOSVggMy4yIG9yIGxhdGVyLgorICAgT1NGNDAgQnVpbGQgZm9yIERpZ2l0YWwgVU5JWCA0LjAuCisgICBPU0Y1MCBCdWlsZCBmb3IgRGlnaXRhbCBVTklYIDUuMC4KKyAgIE9TSyBCdWlsZCBmb3IgT1MtOS4KKyAgIE9YT1MgQnVpbGQgZm9yIE9saXZldHRpIFgvT1MgMi4zLgorICAgUENJWCBCdWlsZCBmb3IgUEMvSVgKKyAgIFBJRF9UPXh4eCBUeXBlIGZvciBwaWRzIGlzIHh4eCAobm9ybWFsbHkgaW50IG9yIHBpZF90KS4KKyAgIFBPU0lYIEJ1aWxkIGZvciBQT1NJWDogdXNlIFBPU0lYIGhlYWRlciBmaWxlcywgZnVuY3Rpb25zLCBldGMuCisgICBfUE9TSVhfU09VUkNFIERpc2FibGUgbm9uLVBPU0lYIGZlYXR1cmVzLgorICAgUFJPVlgxIEJ1aWxkIGZvciBWZW5peCAxLjAgb24gREVDIFByb2Zlc3Npb25hbCAzeHguCisgICBQVFggQnVpbGQgZm9yIER5bml4L1BUWAorICAgUFdJRF9UPXh4eCBnZXRwd2lkKCkgdHlwZSBpcyB4eHguCisgICBSQlNJWj14eHggRGVmaW5lIG92ZXJhbGwgc2l6ZSBvZiByZWNlaXZlLXBhY2tldCBidWZmZXIgKHdpdGggRFlOQU1JQykuCisgICBSRENISyByZGNoaygpIHN5c3RlbSBjYWxsIGlzIGF2YWlsYWJsZS4KKyAgIFJFTkFNRSByZW5hbWUoKSBzeXN0ZW0gY2FsbCBpcyBhdmFpbGFibGUgKFVOSVgpLgorICAgUlRBSVggQnVpbGQgZm9yIEFJWCAyLjIuMSBvbiBJQk0gUlQgUEMuCisgICBSVFUgQnVpbGQgZm9yIE1hc3Njb21wIC8gQ29uY3VycmVudCBSVFUuCisgICBTQVZFRFVJRCBCU0Qgb3Igb3RoZXIgbm9uLUFUJlQgVU5JWCBoYXMgc2F2ZWQtc2V0dWlkIGZlYXR1cmUuCisgICBTQlNJWj14eHggRGVmaW5lIG92ZXJhbGwgc2l6ZSBvZiBzZW5kLXBhY2tldCBidWZmZXIgKHVzZSB3aXRoCisgICBEWU5BTUlDKS4KKyAgIFNESVJFTlQgRGlyZWN0b3J5IHN0cnVjdHVyZSBzcGVjaWZpZWQgaW4gPHN5cy9kaXJlbnQuaD4uCisgICBTRUxFQ1Qgc2VsZWN0KCkgZnVuY3Rpb24gYXZhaWxhYmxlIChjb25mbGljdHMgd2l0aCBSRENISyBhbmQgQ0tfUE9MTCkKKyAgIFNFTEVDVF9IIEluY2x1ZGUgPHN5cy9zZWxlY3QuaD4gZm9yIHNlbGVjdCgpLXJlbGVhdGVkIGRlZmluaXRpb25zLgorICAgU0VURVVJRCBCU0QgNC40LXN0eWxlIHNldGVYaWQoKSBmdW5jdGlvbnMgYXZhaWxhYmxlLgorICAgU0lHX1YgVHlwZSBmb3Igc2lnbmFsKCkgaXMgdm9pZC4gVXNlZCB0byBvdmVycmlkZSBub3JtYWwgYXNzdW1wdGlvbi4KKyAgIFNJR19JIFR5cGUgZm9yIHNpZ25hbCgpIGlzIGludC4gVXNlZCB0byBvdmVycmlkZSBub3JtYWwgYXNzdW1wdGlvbi4KKyAgIFNPQ0tPUFRfVCBPdmVycmlkZSBkZWZhdWx0IGRhdGEgdHlwZSBmb3IgZ2V0L3NldHNvY2tvcHQoKSBvcHRpb24KKyAgIGxlbmd0aC4KKyAgIFNPTEFSSVMgQnVpbGQgZm9yIFNvbGFyaXMuCisgICBTT0xBUklTMjUgQnVpbGQgZm9yIFNvbGFyaXMgMi41IG9yIGxhdGVyLgorICAgU09OWU5FV1MgQnVpbGQgZm9yIFNvbnkgTkVXUy1PUy4KKyAgIFNURVJNSU9YIDxzeXMvdGVybWlveC5oPiBpcyBhdmFpbGFibGUuCisgICBTVFJBVFVTIEJ1aWxkIGZvciBTdHJhdHVzIFZPUy4KKyAgIFNUUkFUVVNYMjUgSW5jbHVkZSBTdHJhdHVzIFZPUyBYLjI1IHN1cHBvcnQuCisgICBTVU40UzUgQnVpbGQgZm9yIFNVTk9TIDQueCBpbiB0aGUgU3lzdGVtIFYgUjMgZW52aXJvbm1lbnQuCisgICBTVU5PUzQgQnVpbGQgZm9yIFNVTk9TIDQuMCBpbiB0aGUgQlNEIGVudmlyb25tZW50LgorICAgU1VOT1M0MSBCdWlsZCBmb3IgU1VOT1MgNC4xIGluIHRoZSBCU0QgZW52aXJvbm1lbnQuCisgICBTVU5YMjUgQnVpbGQgd2l0aCBzdXBwb3J0IGZvciBTdW5MaW5rIFguMjUuCisgICBTVlIzIEJ1aWxkIGZvciBBVCZUIFN5c3RlbSBWIFJlbGVhc2UgMy4KKyAgIFNWUjNKQyBBbGxvdyBqb2IgY29udHJvbCBzdXBwb3J0IG9uIFN5c3RlbSBWIFJlbGVhc2UgMyBVTklYIHZlcnNpb25zLgorICAgU1ZSNCBCdWlsZCBmb3IgQVQmVCBTeXN0ZW0gViBSZWxlYXNlIDQuCisgICBTV19BQ0NfSUQgVU5JWCBvbmx5IC0tIHN3YXAgcmVhbCAmIGVmZmVjdGl2ZSBpZHMgYXJvdW5kIGFjY2VzcygpCisgICBjYWxscy4KKyAgIHN4YUU1MCBCdWlsZCBmb3IgUEZVIENvbXBhY3QgQSBTZXJpZXMgU1gvQSBUSVNQLgorICAgU1lTTE9HTEVWRUw9biBGb3JjZSBzeXNsb2dnaW5nIGF0IGdpdmVuIGxldmVsLgorICAgU1lTVElNRUggSW5jbHVkZSA8c3lzL3RpbWUuaD4uCisgICBTWVNVVElNRUggSW5jbHVkZSA8c3lzL3V0aW1lLmg+IGZvciBzZXR0aW5nIGZpbGUgZGF0ZXMgKDg4T1BFTikKKyAgIFRDUFNPQ0tFVCBCdWlsZCB3aXRoIHN1cHBvcnQgZm9yIFRDUC9JUCB2aWEgQmVya2VsZXkgc29ja2V0cyBsaWJyYXJ5LgorICAgVEVSTUlPWCA8dGVybWlveC5oPiBoZWFkZXIgZmlsZSBpcyBhdmFpbGFibGUgKG1vc3RseSBTVlI0KS4KKyAgIFROQ09ERSBJbmNsdWRlIFRFTE5FVC1zcGVjaWZpYyBjb2RlLgorICAgVE9XRVIxIEJ1aWxkIGZvciBOQ1IgVG93ZXIgMTYzMiB3aXRoIE9TIDEuMDIuCisgICBUUlMxNiBCdWlsZCBmb3IgVGFuZHkgMTYvNjAwMC4KKyAgIFVJRF9UPXh4eCBUeXBlIGZvciB1aWRzIGlzIHh4eCAobm9ybWFsbHkgaW50IG9yIHVpZF90KS4KKyAgIFVOSVggTXVzdCBiZSBkZWZpbmVkIGZvciBhbGwgVU5JWCB2ZXJzaW9ucy4KKyAgIFVOSVgzNTFNIEFUJlQgVU5JWCAzLjUxbSBvbiB0aGUgQVQmVCA3MzAwIFVOSVggUEMuCisgICBVU0VfQVJST1dLRVlTIEluY2x1ZGUgY29kZSB0byBwYXJzZSBBTlNJIGFycm93LWtleSBzZXF1ZW5jZXMuCisgICBVU0VfTFNUQVQgT0sgdG8gdXNlIGxzdGF0KCkuCisgICBVU0VfTUVNQ1BZIERlZmluZSB0aGlzIGlmIG1lbWNweSgpL21lbXNldCgpL21lbW1vdmUoKSBhdmFpbGFibGUuCisgICBVU0VfU1RSRVJST1IgRGVmaW5lIHRoaXMgaWYgc3RyZXJyb3IoKSBpcyBhdmFpbGFibGUuCisgICBVU0xFRVAgdXNsZWVwKCkgc3lzdGVtIGNhbGwgYXZhaWxhYmxlIChjb25mbGljdHMgd2l0aCBOQVAgJiBTRUxFQ1QpLgorICAgVVRFSyBCdWlsZCBmb3IgVGVrdHJvbml4IHdvcmtzdGF0aW9ucyB3aXRoIFVURUsgT1MuCisgICBVVElNRUggSW5jbHVkZSA8dXRpbWUuaD4gZm9yIHNldHRpbmcgZmlsZSBkYXRlcyAoU1ZSNCwgUE9TSVgpCisgICBVVFMyNCBCdWlsZCBmb3IgQW1kYWhsIFVUUyAyLjQuCisgICBWNyBCdWlsZCBmb3IgVmVyc2lvbiA3IFVOSVguCisgICBWTVMgQnVpbGQgZm9yIFZBWC9WTVMuCisgICBWT0lEPXh4eCBWT0lEIHR5cGUgZm9yIGZ1bmN0aW9ucyAoaW50IG9yIHZvaWQpLgorICAgVlhWRSBCdWlsZCBmb3IgQ0RDIFZYL1ZFIDUuMi4xLgorICAgV0FJVF9UPXh4eCBUeXBlIG9mIGFyZ3VtZW50IHBhc3NlZCB0byB3YWl0KCkuCisgICBXSU5UQ1AgQnVpbGQgd2l0aCBXb2xsb25nb25nIFZBWC9WTVMgVENQL0lQIChpbXBsaWVzIFRDUFNPQ0tFVCkKKyAgIFdPTExPTkdPTkcgQnVpbGQgd2l0aCBXb2xsb25nb25nIFVOSVggVENQL0lQIChpbXBsaWVzIFRDUFNPQ0tFVCkKKyAgIFhFTklYIEJ1aWxkIGZvciBYZW5peCAoU0NPLCBUYW5keSwgb3RoZXJzKS4KKyAgIFhORElSIFN1cHBvcnQgZm9yIEJTRCBsb25nIGZpbGVuYW1lcyB2aWEgPHN5cy9uZGlyLmg+LgorICAgWFlaX0lOVEVSTkFMIFN1cHBvcnQgZm9yIFhZWk1PREVNIHByb3RvY29scyBpcyBpbnRlcm5hbCwgbm90IGV4dGVybmFsLgorICAgWkZDREFUIERlZmluZSB0aGlzIGlmIHpmY2RhdCgpIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBpbiBLZXJtaXQuCisgICBaSUxPRyBCdWlsZCBmb3IgWmlsb2cgWkVVUy4KKyAgIFpKREFURSBIYXMgempkYXRlKCkgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBkYXRlIHRvIEp1bGlhbiBmb3JtYXQuCisgICBYUFJJTlQgVHJhbnNwYXJlbnQgcHJpbnQgY29kZSBpbmNsdWRlZCBpbiBDT05ORUNUIG1vZHVsZS4KKworICAgWyBbMTY1XVRvcCBdIFsgWzE2Nl1Db250ZW50cyBdIFsgWzE2N11DLUtlcm1pdCBIb21lIF0gWyBbMTY4XUtlcm1pdAorICAgSG9tZSBdCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKworICAgIEMtS2VybWl0IENvbmZpZ3VyYXRpb24gT3B0aW9ucyAvIFsxNjldVGhlIEtlcm1pdCBQcm9qZWN0IC8KKyAgICBbMTcwXUNvbHVtYmlhIFVuaXZlcnNpdHkgLyBbMTcxXWtlcm1pdEBjb2x1bWJpYS5lZHUgLyAxNCBNYXJjaCAyMDAzCisKK1JlZmVyZW5jZXMKKworICAgMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworICAgMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUvCisgICAzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwKKyAgIDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgIDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgICA2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDEKKyAgIDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4MgorICAgOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3gzCisgICA5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDQKKyAgMTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4NQorICAxMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3g2CisgIDEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDcKKyAgMTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4OAorICAxNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3g5CisgIDE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDEwCisgIDE2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDExCisgIDE3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDEyCisgIDE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDEzCisgIDE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDE0CisgIDIwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeGExCisgIDIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwKKyAgMjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgMjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgIDI0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjdG9wCisgIDI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjY29udGVudHMKKyAgMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4MgorICAyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3gwCisgIDI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgIDI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorICAzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3RvcAorICAzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI2NvbnRlbnRzCisgIDMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDMKKyAgMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4MQorICAzNC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1dGlvLmMKKyAgMzUuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY2RlYi5oCisgIDM2LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V1czMuYworICAzNy4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjZGViLmgKKyAgMzguIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXRpby5jCisgIDM5LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V0aW8uYworICA0MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorICA0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAgNDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN0b3AKKyAgNDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCNjb250ZW50cworICA0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3g0CisgIDQ1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDIKKyAgNDYuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L21ha2VmaWxlCisgIDQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwKKyAgNDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NAorICA0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5LjIKKyAgNTAuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXVzeC5jCisgIDUxLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V0aW8uYworICA1Mi4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1ZmlvLmMKKyAgNTMuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXVzeC5jCisgIDU0LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3VjbWQuYworICA1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorICA1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAgNTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN0b3AKKyAgNTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCNjb250ZW50cworICA1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3g1CisgIDYwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDMKKyAgNjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC91bmljb2RlLmh0bWwKKyAgNjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgIDY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjdG9wCisgIDY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjY29udGVudHMKKyAgNjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4NgorICA2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3g0CisgIDY4LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V1c3IuaAorICA2OS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1dXNyLmgKKyAgNzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgNzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgIDcyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjdG9wCisgIDczLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjY29udGVudHMKKyAgNzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4NworICA3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3g1CisgIDc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDYuMQorICA3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3g2LjIKKyAgNzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4Ni4zCisgIDc5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDYuNAorICA4MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3g0CisgIDgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvZ2tlcm1pdC5odG1sCisgIDgyLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V1c3IuaAorICA4My4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tja2VyLmgKKyAgODQuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY2RlYi5oCisgIDg1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgIDg2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorICA4Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3RvcAorICA4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI2NvbnRlbnRzCisgIDg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDgKKyAgOTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4NgorICA5MS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1ZGlhLmMKKyAgOTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgOTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgIDk0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjdG9wCisgIDk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjY29udGVudHMKKyAgOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4OQorICA5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3g3CisgIDk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDguMQorICA5OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3g4LjIKKyAxMDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4OC4zCisgMTAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDguMS4xCisgMTAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDguMS4yCisgMTAzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDguMS4zCisgMTA0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDguMS40CisgMTA1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDguMS41CisgMTA2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDguMS42CisgMTA3LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2NuZXQuaAorIDEwOC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjdGVsLmMKKyAxMDkuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY3RlbC5jCisgMTEwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2N0ZWwuaAorIDExMS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjZnRwLmMKKyAxMTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAxMTMuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY25ldC5jCisgMTE0LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2NuZXQuaAorIDExNS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1dGlvLmMKKyAxMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4MTEKKyAxMTcuIG1haWx0bzprZXJtaXRAY29sdW1iaWEuZWR1CisgMTE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDEyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3RvcAorIDEyMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI2NvbnRlbnRzCisgMTIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDEwCisgMTIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDgKKyAxMjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAxMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMTI2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjdG9wCisgMTI3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjY29udGVudHMKKyAxMjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4MTEKKyAxMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4OQorIDEzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gxMQorIDEzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sCisgMTMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDEzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3RvcAorIDEzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI2NvbnRlbnRzCisgMTM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDEyCisgMTM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDEwCisgMTM4LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3VjbnMuYworIDEzOS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1Y29uLmMKKyAxNDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAxNDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMTQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjdG9wCisgMTQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjY29udGVudHMKKyAxNDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4MTMKKyAxNDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4MTEKKyAxNDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAxNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMTQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjdG9wCisgMTQ5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjY29udGVudHMKKyAxNTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4MTQKKyAxNTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4MTIKKyAxNTIuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY2RlYi5oCisgMTUzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTU0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDE1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3RvcAorIDE1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI2NvbnRlbnRzCisgMTU3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjeDEzCisgMTU4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDE2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3RvcAorIDE2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI2NvbnRlbnRzCisgMTYyLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2NkZWIuaAorIDE2My4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjbmV0LmgKKyAxNjQuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY21haS5jCisgMTY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjdG9wCisgMTY2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwjY29udGVudHMKKyAxNjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAxNjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMTY5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDE3MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUvCisgMTcxLiBtYWlsdG86a2VybWl0QGNvbHVtYmlhLmVkdQpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrY2RlYi5oIGIvY2tlcm1pdC04LjAuMjExL2NrY2RlYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZjljNTUKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2tjZGViLmgKQEAgLTAsMCArMSw2MzY5IEBACisvKiAgQyBLIEMgRCBFIEIgLiBIICAqLworCisvKgorICBUdWUgQXByICA2IDE0OjAwOjE2IDIwMDQKKworICBOT1RFIFRPIENPTlRSSUJVVE9SUzogVGhpcyBmaWxlLCBhbmQgYWxsIHRoZSBvdGhlciBDLUtlcm1pdCBmaWxlcywgbXVzdCBiZQorICBjb21wYXRpYmxlIHdpdGggQyBwcmVwcm9jZXNzb3JzIHRoYXQgc3VwcG9ydCBvbmx5ICNpZmRlZiwgI2Vsc2UsICNlbmRpZiwKKyAgI2RlZmluZSwgYW5kICN1bmRlZi4gIFBsZWFzZSBkbyBub3QgdXNlICNpZiwgbG9naWNhbCBvcGVyYXRvcnMsIG9yIG90aGVyCisgIGxhdGVyLW1vZGVsIHByZXByb2Nlc3NvciBmZWF0dXJlcyBpbiBhbnkgb2YgdGhlIHBvcnRhYmxlIEMtS2VybWl0IG1vZHVsZXMuCisgIFlvdSBjYW4sIG9mIGNvdXJzZSwgdXNlIHRoZXNlIGNvbnN0cnVjdGlvbnMgaW4gcGxhdGZvcm0tc3BlY2lmaWMgbW9kdWxlcyAKKyAgd2hlbiB5b3Uga25vdyB0aGV5IGFyZSBzdXBwb3J0ZWQuCisqLworCisvKgorICBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgYWxsIEMtS2VybWl0IG1vZHVsZXMsIGluY2x1ZGluZyB0aGUgbW9kdWxlcworICB0aGF0IGFyZW4ndCBzcGVjaWZpYyB0byBLZXJtaXQgKGxpa2UgdGhlIGNvbW1hbmQgcGFyc2VyIGFuZCB0aGUgY2s/dGlvIGFuZAorICBjaz9maW8gbW9kdWxlcykuICBJdCBzaG91bGQgYmUgaW5jbHVkZWQgQkVGT1JFIGFueSBvdGhlciBDLUtlcm1pdCBoZWFkZXIKKyAgZmlsZXMuICBJdCBzcGVjaWZpZXMgZm9ybWF0IGNvZGVzIGZvciBkZWJ1ZygpLCB0bG9nKCksIGFuZCBzaW1pbGFyCisgIGZ1bmN0aW9ucywgYW5kIGluY2x1ZGVzIGFueSBuZWNlc3NhcnkgZGVmaW5pdGlvbnMgdG8gYmUgdXNlZCBieSBhbGwgQy1LZXJtaXQKKyAgbW9kdWxlcywgYW5kIGFsc28gaW5jbHVkZXMgc29tZSBmZWF0dXJlIHNlbGVjdGlvbiBjb21waWxlLXRpbWUgc3dpdGNoZXMsIGFuZAorICBhbHNvIHN5c3RlbS0gb3IgY29tcGlsZXItZGVwZW5kZW50IGRlZmluaXRpb25zLCBwbHVzICNpbmNsdWRlcyBhbmQgcHJvdG90eXBlcworICByZXF1aXJlZCBieSBhbGwgQy1LZXJtaXQgbW9kdWxlcy4KKyovCisKKy8qCisgIEF1dGhvcjogRnJhbmsgZGEgQ3J1eiA8ZmRjQGNvbHVtYmlhLmVkdT4sCisgIENvbHVtYmlhIFVuaXZlcnNpdHkgQWNhZGVtaWMgSW5mb3JtYXRpb24gU3lzdGVtcywgTmV3IFlvcmsgQ2l0eS4KKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorKi8KKworLyoKKyAgRXR5bW9sb2d5OiBUaGUgbmFtZSBvZiB0aGlzIGZpbGUgbWVhbnMgIkMtS2VybWl0IENvbW1vbi1DLUxhbmd1YWdlIERlYnVnZ2luZworICBIZWFkZXIiLCBiZWNhdXNlIG9yaWdpbmFsbHkgaXQgY29udGFpbmVkIG9ubHkgdGhlIGZvcm1hdHMgKEYwMDAtRjExMSkgZm9yCisgIHRoZSBkZWJ1ZygpIGFuZCB0bG9nKCkgZnVuY3Rpb25zLiAgU2luY2UgdGhlbiBpdCBoYXMgZ3Jvd24gdG8gaW5sY3VkZSBhbGwKKyAgbWF0ZXJpYWwgcmVxdWlyZWQgYnkgYWxsIG90aGVyIEMtS2VybWl0IG1vZHVsZXMsIGluY2x1ZGluZyB0aGUgbm9uLUtlcm1pdAorICBzcGVjaWZpYyBvbmVzLgorKi8KKworI2lmbmRlZiBDS0NERUJfSAkJCS8qIERvbid0IGluY2x1ZGUgbWUgbW9yZSB0aGFuIG9uY2UuICovCisjZGVmaW5lIENLQ0RFQl9ICisKKyNpZmRlZiBPUzIKKyNpbmNsdWRlICJja29rZXIuaCIKKyNlbHNlIC8qIE9TMiAqLworLyogVW5zaWduZWQgbnVtYmVycyAqLworCisjaWZuZGVmIFVTSE9SVAorI2RlZmluZSBVU0hPUlQgdW5zaWduZWQgc2hvcnQKKyNlbmRpZiAvKiBVU0hPUlQgKi8KKworI2lmbmRlZiBVSU5UCisjZGVmaW5lIFVJTlQgdW5zaWduZWQgaW50CisjZW5kaWYgLyogVUlOVCAqLworCisjaWZuZGVmIFVMT05HCisjZGVmaW5lIFVMT05HIHVuc2lnbmVkIGxvbmcKKyNlbmRpZiAvKiBVTE9ORyAqLworI2VuZGlmIC8qIE9TMiAqLworCisvKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIEtlcm1pdCBmaWxlIGF0dHJpYnV0ZXMgKi8KKy8qIEFsbCBzdHJpbmdzIGNvbWUgYXMgcG9pbnRlciBhbmQgbGVuZ3RoIGNvbWJpbmF0aW9ucyAqLworLyogRW1wdHkgc3RyaW5nIChvciBmb3IgbnVtZXJpYyB2YXJpYWJsZXMsIC0xKSA9IHVudXNlZCBhdHRyaWJ1dGUuICovCisKK3N0cnVjdCB6c3RyIHsgICAgICAgICAgICAgLyogc3RyaW5nIGZvcm1hdCAqLworICAgIGludCBsZW47CSAgICAgICAgICAvKiBsZW5ndGggKi8KKyAgICBjaGFyICp2YWw7ICAgICAgICAgICAgLyogdmFsdWUgKi8KK307CitzdHJ1Y3QgemF0dHIgeyAgICAgICAgICAgIC8qIEtlcm1pdCBGaWxlIEF0dHJpYnV0ZSBzdHJ1Y3R1cmUgKi8KKyAgICBsb25nIGxlbmd0aGs7ICAgICAgICAgLyogKCEpIGZpbGUgbGVuZ3RoIGluIEsgKi8KKyAgICBzdHJ1Y3QgenN0ciB0eXBlOyAgICAgLyogKCIpIGZpbGUgdHlwZSAodGV4dCBvciBiaW5hcnkpICovCisgICAgc3RydWN0IHpzdHIgZGF0ZTsgICAgIC8qICgjKSBmaWxlIGNyZWF0aW9uIGRhdGUgeXl5eW1tZGRbIGhoOm1tWzpzc11dICovCisgICAgc3RydWN0IHpzdHIgY3JlYXRvcjsgIC8qICgkKSBmaWxlIGNyZWF0b3IgaWQgKi8KKyAgICBzdHJ1Y3QgenN0ciBhY2NvdW50OyAgLyogKCUpIGZpbGUgYWNjb3VudCAqLworICAgIHN0cnVjdCB6c3RyIGFyZWE7ICAgICAvKiAoJikgYXJlYSAoZS5nLiBkaXJlY3RvcnkpIGZvciBmaWxlICovCisgICAgc3RydWN0IHpzdHIgcGFzc3dvcmQ7IC8qICgnKSBwYXNzd29yZCBmb3IgYXJlYSAqLworICAgIGxvbmcgYmxrc2l6ZTsgICAgICAgICAvKiAoKCkgZmlsZSBibG9ja3NpemUgKi8KKyAgICBzdHJ1Y3QgenN0ciB4YWNjZXNzOyAgLyogKCkpIGZpbGUgYWNjZXNzOiBuZXcsIHN1cGVyc2VkZSwgYXBwZW5kLCB3YXJuICovCisgICAgc3RydWN0IHpzdHIgZW5jb2Rpbmc7IC8qICgqKSBlbmNvZGluZyAodHJhbnNmZXIgc3ludGF4KSAqLworICAgIHN0cnVjdCB6c3RyIGRpc3A7ICAgICAvKiAoKykgZGlzcG9zaXRpb24gKG1haWwsIG1lc3NhZ2UsIHByaW50LCBldGMpICovCisgICAgc3RydWN0IHpzdHIgbHByb3RlY3Q7IC8qICgsKSBwcm90ZWN0aW9uIChsb2NhbCBzeW50YXgpICovCisgICAgc3RydWN0IHpzdHIgZ3Byb3RlY3Q7IC8qICgtKSBwcm90ZWN0aW9uIChnZW5lcmljIHN5bnRheCkgKi8KKyAgICBzdHJ1Y3QgenN0ciBzeXN0ZW1pZDsgLyogKC4pIElEIGZvciBzeXN0ZW0gb2Ygb3JpZ2luICovCisgICAgc3RydWN0IHpzdHIgcmVjZm07ICAgIC8qICgvKSByZWNvcmQgZm9ybWF0ICovCisgICAgc3RydWN0IHpzdHIgc3lzcGFyYW07IC8qICgwKSBzeXN0ZW0tZGVwZW5kZW50IHBhcmFtZXRlciBzdHJpbmcgKi8KKyAgICBsb25nIGxlbmd0aDsgICAgICAgICAgLyogKDEpIGV4YWN0IGxlbmd0aCBvbiBzeXN0ZW0gb2Ygb3JpZ2luICovCisgICAgc3RydWN0IHpzdHIgY2hhcnNldDsgIC8qICgyKSB0cmFuc2ZlciBzeW50YXggY2hhcmFjdGVyIHNldCAqLworI2lmZGVmIE9TMgorICAgIHN0cnVjdCB6c3RyIGxvbmduYW1lOyAvKiBPUy8yIGxvbmduYW1lIGlmIGFwcGxpY2FibGUgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBzdHJ1Y3QgenN0ciByZXBseTsgICAgLyogVGhpcyBnb2VzIGxhc3QsIHVzZWQgZm9yIGF0dHJpYnV0ZSByZXBseSAqLworfTsKKworLyogS2VybWl0IGZpbGUgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCisKK3N0cnVjdCBmaWxpbmZvIHsKKyAgaW50IGJzOwkJCQkvKiBCbG9ja3NpemUgKi8KKyAgaW50IGNzOwkJCQkvKiBDaGFyYWN0ZXIgc2V0ICovCisgIGxvbmcgcmw7CQkJCS8qIFJlY29yZCBsZW5ndGggKi8KKyAgaW50IG9yZzsJCQkJLyogT3JnYW5pemF0aW9uICovCisgIGludCBmbXQ7CQkJCS8qIFJlY29yZCBmb3JtYXQgKi8KKyAgaW50IGNjOwkJCQkvKiBDYXJyaWFnZSBjb250cm9sICovCisgIGludCB0eXA7CQkJCS8qIFR5cGUgKHRleHQvYmluYXJ5KSAqLworICBpbnQgZHNwOwkJCQkvKiBEaXNwb3NpdGlvbiAqLworICBjaGFyICpvc19zcGVjaWZpYzsJCQkvKiBPUy1zcGVjaWZpYyBhdHRyaWJ1dGVzICovCisjaWZkZWYgT1MyCisgIHVuc2lnbmVkIGxvbmcgaW50IGxibG9wdHM7CQkvKiBMQUJFTEVEIEZJTEUgb3B0aW9ucyBiaXRtYXNrICovCisjZWxzZQorICBpbnQgbGJsb3B0czsKKyNlbmRpZiAvKiBPUzIgKi8KK307CisKKyNpZmRlZiBNQUNPU1gxMAkJCQkvKiBNYWMgT1MgWCAxLjAgKi8KKyNpZm5kZWYgTUFDT1NYCQkJCS8qIGltcGxpZXMgTWFjIE9TIFggKi8KKyNkZWZpbmUgTUFDT1NYCisjZW5kaWYgLyogTUFDT1NYICovCisjZW5kaWYgLyogTUFDT1NYMTAgKi8KKworI2lmZGVmIE1BQ09TWAkJCQkvKiBNYWMgT1MgWCAqLworI2lmbmRlZiBCU0Q0NAkJCQkvKiBpbXBsaWVzIDQuNCBCU0QgKi8KKyNkZWZpbmUgQlNENDQKKyNlbmRpZiAvKiBCU0Q0NCAqLworI2VuZGlmIC8qIE1BQ09TWCAqLworCisjaWZkZWYgU0NPX09TUjUwNQkJCS8qIFNDTyAzLjJ2NS4wLjUgKi8KKyNpZm5kZWYgU0NPX09TUjUwNAkJCS8qIGltcGxpZXMgU0NPIDMuMnY1LjAuNCAqLworI2RlZmluZSBTQ09fT1NSNTA0CisjZW5kaWYgLyogU0NPX09TUjUwNCAqLworI2VuZGlmIC8qIFNDT19PU1I1MDUgKi8KKworI2lmZGVmIFNDT19PU1I1MDQJCQkvKiBTQ08gMy4ydjUuMC40ICovCisjaWZuZGVmIENLX1NDT1Y1CQkJLyogaW1wbGllcyBTQ08gMy4ydjUuMCAqLworI2RlZmluZSBDS19TQ09WNQorI2VuZGlmIC8qIENLX1NDT1Y1ICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CQkJLyogVG8gc2lkZXN0ZXAgaGVhZGVyLWZpbGUgbWVzcyAqLworI2VuZGlmIC8qIFNDT19PU1I1MDQgKi8KKworI2lmZGVmIENLX1NDT1Y1CisjaWZuZGVmIEFOWVNDTworI2RlZmluZSBBTllTQ08KKyNlbmRpZiAvKiBBTllTQ08gKi8KKyNlbmRpZiAvKiBDS19TQ09WNSAqLworCisjaWZkZWYgVU5JWFdBUkUKKyNpZm5kZWYgQU5ZU0NPCisjZGVmaW5lIEFOWVNDTworI2VuZGlmIC8qIEFOWVNDTyAqLworI2VuZGlmIC8qIFVOSVhXQVJFICovCisKKyNpZmRlZiBDS19TQ08zMlY0CQkJLyogU0NPIDMuMnY0ICovCisjaWZuZGVmIEFOWVNDTworI2RlZmluZSBBTllTQ08KKyNlbmRpZiAvKiBBTllTQ08gKi8KKyNpZm5kZWYgWEVOSVgKKyNkZWZpbmUgWEVOSVgKKyNlbmRpZiAvKiBYRU5JWCAqLworI2lmbmRlZiBTVlIzCisjZGVmaW5lIFNWUjMKKyNlbmRpZiAvKiBTVlIzICovCisjaWZuZGVmIERJUkVOVAorI2RlZmluZSBESVJFTlQKKyNlbmRpZiAvKiBESVJFTlQgKi8KKyNpZm5kZWYgUkVOQU1FCisjZGVmaW5lIFJFTkFNRQorI2VuZGlmIC8qIFJFTkFNRSAqLworI2lmbmRlZiBTVlIzSkMKKyNkZWZpbmUgU1ZSM0pDCisjZW5kaWYgLyogU1ZSM0pDICovCisjaWZuZGVmIENLX1JUU0NUUworI2RlZmluZSBDS19SVFNDVFMKKyNlbmRpZiAvKiBDS19SVFNDVFMgKi8KKyNpZm5kZWYgUElEX1QKKyNkZWZpbmUgUElEX1QgcGlkX3QKKyNlbmRpZiAvKiBQSURfVCAqLworI2lmbmRlZiBQV0lEX1QKKyNkZWZpbmUgUFdJRF9UIGludAorI2VuZGlmIC8qIFBXSURfVCAqLworI2VuZGlmIC8qIENLX1NDTzMyVjQgKi8KKworI2lmZGVmIE5PSUNQCQkJCS8qIElmIG5vIGNvbW1hbmQgcGFyc2VyICovCisjaWZuZGVmIE5PU1BMCQkJCS8qIFRoZW4gbm8gc2NyaXB0IGxhbmd1YWdlIGVpdGhlciAqLworI2RlZmluZSBOT1NQTAorI2VuZGlmIC8qIE5PU1BMICovCisjaWZuZGVmIE5PQ1NFVFMJCQkJLyogT3IgY2hhcmFjZXIgc2V0cyAqLworI2RlZmluZSBOT0NTRVRTCisjZW5kaWYgLyogTk9DU0VUUyAqLworI2lmbmRlZiBOT0ZUUAkJCQkvKiBPciBGVFAgY2xpZW50ICovCisjZGVmaW5lIE5PRlRQCisjZW5kaWYgLyogTk9GVFAgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworCisvKiBCdWlsdC1pbiBtYWtlZmlsZSBlbnRyaWVzICovCisKKyNpZmRlZiBTT0xBUklTOQkJCQkvKiBTb2xhcmlzIDkgaW1wbGllcyA4ICovCisjaWZuZGVmIFNPTEFSSVM4CisjZGVmaW5lIFNPTEFSSVM4CisjZW5kaWYgLyogU09MQVJJUzggKi8KKyNlbmRpZiAvKiBTT0xBUklTOSAqLworCisjaWZkZWYgU09MQVJJUzgJCQkJLyogU29sYXJpcyA4IGltcGxpZXMgNyAqLworI2lmbmRlZiBTT0xBUklTNworI2RlZmluZSBTT0xBUklTNworI2VuZGlmIC8qIFNPTEFSSVM3ICovCisjZW5kaWYgLyogU09MQVJJUzggKi8KKworI2lmZGVmIFNPTEFSSVM3CQkJCS8qIFNvbGFyaXMgNyBpbXBsaWVzIDIuNiAqLworI2lmbmRlZiBTT0xBUklTMjYKKyNkZWZpbmUgU09MQVJJUzI2CisjZW5kaWYgLyogU09MQVJJUzI2ICovCisjZW5kaWYgLyogU09MQVJJUzcgKi8KKworI2lmZGVmIFNPTEFSSVMyNgkJCS8qIFNvbGFyaXMgMi42IGltcGxpZXMgMi41ICovCisjaWZuZGVmIFNPTEFSSVMyNQorI2RlZmluZSBTT0xBUklTMjUKKyNlbmRpZiAvKiBTT0xBUklTMjUgKi8KKyNlbmRpZiAvKiBTT0xBUklTMjYgKi8KKworI2lmZGVmIFNPTEFSSVMyNQkJCS8qIFNvbGFyaXMgMi41IGltcGxpZXMgU29sYXJpcyAqLworI2lmbmRlZiBTT0xBUklTCisjZGVmaW5lIFNPTEFSSVMKKyNlbmRpZiAvKiBTT0xBUklTICovCisjaWZuZGVmIFBPU0lYCQkJCS8qIEFuZCBQT1NJWCAqLworI2RlZmluZSBQT1NJWAorI2VuZGlmIC8qIFBPU0lYICovCisjaWZuZGVmIENLX1dSRUZSRVNICQkJLyogQW5kIHRoaXMgKGN1cnNlcykgKi8KKyNkZWZpbmUgQ0tfV1JFRlJFU0gKKyNlbmRpZiAvKiBDS19XUkVGUkVTSCAqLworI2VuZGlmIC8qIFNPTEFSSVMyNSAqLworCisjaWZkZWYgU09MQVJJUzI0CQkJLyogU29sYXJpcyAyLjQgaW1wbGllcyBTb2xhcmlzICovCisjaWZuZGVmIFNPTEFSSVMKKyNkZWZpbmUgU09MQVJJUworI2VuZGlmIC8qIFNPTEFSSVMgKi8KKyNlbmRpZiAvKiBTT0xBUklTMjQgKi8KKworI2lmZGVmIFNPTEFSSVMJCQkJLyogU29sYXJpcyBnZXRzICJQT1NJWCIgUlRTL0NUUyBBUEkgKi8KKyNpZmRlZiBQT1NJWAorI2lmbmRlZiBQT1NJWF9DUlRTQ1RTCisjZGVmaW5lIFBPU0lYX0NSVFNDVFMKKyNlbmRpZiAvKiBQT1NJWF9DUlRTQ1RTICovCisjZW5kaWYgLyogUE9TSVggKi8KKyNlbmRpZiAvKiBTT0xBUklTICovCisKKyNpZmRlZiBTVU40UzUJCQkJLyogU3VuLTQgU3lzdGVtIFYgZW52aXJvbm1lbnQgKi8KKyNpZm5kZWYgU1ZSMwkJCQkvKiBpbXBsaWVzIFN5c3RlbSBWIFIzIG9yIGxhdGVyICovCisjZGVmaW5lIFNWUjMKKyNlbmRpZiAvKiBTVlIzICovCisjZW5kaWYgLyogU1VONFM1ICovCisjaWZkZWYgU1VOT1M0MQkJCQkvKiBTVU5PUzQxIGltcGxpZXMgU1VOT1M0ICovCisjaWZuZGVmIFNVTk9TNAorI2RlZmluZSBTVU5PUzQKKyNlbmRpZiAvKiBTVU5PUzQgKi8KKyNlbmRpZiAvKiBTVU5PUzQxICovCisKKyNpZmRlZiBTVU40UzUJCQkJLyogU3VuLTQgU3lzdGVtIFYgZW52aXJvbm1lbnQgKi8KKyNpZm5kZWYgU1ZSMwkJCQkvKiBpbXBsaWVzIFN5c3RlbSBWIFIzIG9yIGxhdGVyICovCisjZGVmaW5lIFNWUjMKKyNlbmRpZiAvKiBTVlIzICovCisjZW5kaWYgLyogU1VONFM1ICovCisKKyNpZmRlZiBTVU5PUzQxCQkJCS8qIFNVTk9TNDEgaW1wbGllcyBTVU5PUzQgKi8KKyNpZm5kZWYgU1VOT1M0CisjZGVmaW5lIFNVTk9TNAorI2VuZGlmIC8qIFNVTk9TNCAqLworI2VuZGlmIC8qIFNVTk9TNDEgKi8KKworI2lmZGVmIFNVTk9TNAkJCQkvKiBCdWlsdC1pbiBTVU5PUzQgbWFrZWZpbGUgZW50cnkgKi8KKyNpZm5kZWYgVU5JWAorI2RlZmluZSBVTklYCisjZW5kaWYgLyogVU5JWCAqLworI2lmbmRlZiBCU0Q0CisjZGVmaW5lIEJTRDQKKyNlbmRpZiAvKiBCU0Q0ICovCisjaWZuZGVmIE5PU0VUQlVGCisjZGVmaW5lIE5PU0VUQlVGCisjZW5kaWYgLyogTk9TRVRCVUYgKi8KKyNpZm5kZWYgRElSRU5UCisjZGVmaW5lIERJUkVOVAorI2VuZGlmIC8qIERJUkVOVCAqLworI2lmbmRlZiBOT05FVAorI2lmbmRlZiBUQ1BTT0NLRVQKKyNkZWZpbmUgVENQU09DS0VUCisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogTk9ORVQgKi8KKyNpZm5kZWYgU0FWRURVSUQKKyNkZWZpbmUgU0FWRURVSUQKKyNlbmRpZiAvKiBTQVZFRFVJRCAqLworI2lmbmRlZiBEWU5BTUlDCisjZGVmaW5lIERZTkFNSUMKKyNlbmRpZiAvKiBEWU5BTUlDICovCisjZW5kaWYgLyogU1VOT1M0ICovCisKKyNpZmRlZiBTT0xBUklTCQkJCS8qIEJ1aWx0IGluIG1ha2VmaWxlIGVudHJ5ICovCisjaWZuZGVmIE5PU0VUQlVGCQkJLyogZm9yIFNvbGFyaXMgMi54ICovCisjZGVmaW5lIE5PU0VUQlVGCisjZW5kaWYgLyogTk9TRVRCVUYgKi8KKyNpZm5kZWYgTk9DVVJTRVMKKyNpZm5kZWYgQ0tfQ1VSU0VTCisjZGVmaW5lIENLX0NVUlNFUworI2VuZGlmIC8qIENLX0NVUlNFUyAqLworI2VuZGlmIC8qIE5PQ1VSU0VTICovCisjaWZuZGVmIENLX05FV1RFUk0KKyNkZWZpbmUgQ0tfTkVXVEVSTQorI2VuZGlmIC8qIENLX05FV1RFUk0gKi8KKyNpZm5kZWYgRElSRU5UCisjZGVmaW5lIERJUkVOVAorI2VuZGlmIC8qIERJUkVOVCAqLworI2lmbmRlZiBOT05FVAorI2lmbmRlZiBUQ1BTT0NLRVQKKyNkZWZpbmUgVENQU09DS0VUCisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogTk9ORVQgKi8KKyNpZm5kZWYgVU5JWAorI2RlZmluZSBVTklYCisjZW5kaWYgLyogVU5JWCAqLworI2lmbmRlZiBTVlI0CisjZGVmaW5lIFNWUjQKKyNlbmRpZiAvKiBTVlI0ICovCisjaWZuZGVmIEhBRERSTElTVAorI2RlZmluZSBIQUREUkxJU1QKKyNlbmRpZiAvKiBIQUREUkxJU1QgKi8KKyNpZm5kZWYgU1RFUk1JT1gKKyNkZWZpbmUgU1RFUk1JT1gKKyNlbmRpZiAvKiBTVEVSTUlPWCAqLworI2lmbmRlZiBTRUxFQ1QKKyNkZWZpbmUgU0VMRUNUCisjZW5kaWYgLyogU0VMRUNUICovCisjaWZuZGVmIERZTkFNSUMKKyNkZWZpbmUgRFlOQU1JQworI2VuZGlmIC8qIERZTkFNSUMgKi8KKyNpZm5kZWYgTk9VVUNQCisjaWZuZGVmIEhEQlVVQ1AKKyNkZWZpbmUgSERCVVVDUAorI2VuZGlmIC8qIEhEQlVVQ1AgKi8KKyNlbmRpZiAvKiBOT1VVQ1AgKi8KKyNlbmRpZiAvKiBTT0xBUklTICovCisKKy8qIEZlYXR1cmVzIHRoYXQgY2FuIGJlIGVsaW1pbmF0ZWQgZnJvbSBhIG5vLWZpbGUtdHJhbnNmZXIgdmVyc2lvbiAqLworCisjaWZkZWYgTk9YRkVSCisjaWZuZGVmIE5PRlRQCisjZGVmaW5lIE5PRlRQCisjZW5kaWYgLyogTk9GVFAgKi8KKyNpZm5kZWYgT1MyCisjaWZuZGVmIE5PQ1VSU0VTCQkJLyogRnVsbHNjcmVlbiBmaWxlLXRyYW5zZmVyIGRpc3BsYXkgKi8KKyNkZWZpbmUgTk9DVVJTRVMKKyNlbmRpZiAvKiBOT0NVUlNFUyAqLworI2VuZGlmIC8qIE9TMiAqLworI2lmbmRlZiBOT0NLWFlaCQkJCS8qIFhZWk1PREVNIHN1cHBvcnQgKi8KKyNkZWZpbmUgTk9DS1hZWgorI2VuZGlmIC8qIE5PQ0tYWVogKi8KKyNpZm5kZWYgTk9DS1NQRUVECQkJLyogQ3RybC1jaGFyIHVucHJlZml4aW5nICovCisjZGVmaW5lIE5PQ0tTUEVFRAorI2VuZGlmIC8qIE5PQ0tTUEVFRCAqLworI2lmbmRlZiBOT1NFUlZFUgkJCS8qIFNlcnZlciBtb2RlICovCisjZGVmaW5lIE5PU0VSVkVSCisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKyNpZm5kZWYgTk9DS1RJTUVSUwkJCS8qIER5bmFtaWMgcGFja2V0IHRpbWVycyAqLworI2RlZmluZSBOT0NLVElNRVJTCisjZW5kaWYgLyogTk9DS1RJTUVSUyAqLworI2lmbmRlZiBOT1BBVFRFUk5TCQkJLyogRmlsZS10eXBlIHBhdHRlcm5zICovCisjZGVmaW5lIE5PUEFUVEVSTlMKKyNlbmRpZiAvKiBOT1BBVFRFUk5TICovCisjaWZuZGVmIE5PU1RSRUFNSU5HCQkJLyogU3RyZWFtaW5nICovCisjZGVmaW5lIE5PU1RSRUFNSU5HCisjZW5kaWYgLyogTk9TVFJFQU1JTkcgKi8KKyNpZm5kZWYgTk9JS1NECQkJCS8qIEludGVybmV0IEtlcm1pdCBTZXJ2aWNlICovCisjZGVmaW5lIE5PSUtTRAorI2VuZGlmIC8qIE5PSUtTRCAqLworI2lmbmRlZiBOT1BJUEVTRU5ECQkJLyogU2VuZGluZyBmcm9tIHBpcGVzICovCisjZGVmaW5lIE5PUElQRVNFTkQKKyNlbmRpZiAvKiBOT1BJUEVTRU5EICovCisjaWZuZGVmIE5PQVVUT0RMCQkJLyogQXV0b2Rvd25sb2FkICovCisjZGVmaW5lIE5PQVVUT0RMCisjZW5kaWYgLyogTk9BVVRPREwgKi8KKyNpZm5kZWYgTk9NU0VORAkJCQkvKiBNU0VORCAqLworI2RlZmluZSBOT01TRU5ECisjZW5kaWYgLyogTk9NU0VORCAqLworI2lmbmRlZiBOT1RMT0cJCQkJLyogVHJhbnNhY3Rpb24gbG9nZ2luZyAqLworI2RlZmluZSBOT1RMT0cKKyNlbmRpZiAvKiBOT1RMT0cgKi8KKyNpZm5kZWYgTk9DS1hYQ0hBUgkJCS8qIFBhY2tldCBjaGFyYWN0ZXIgZG91YmxpbmcgKi8KKyNkZWZpbmUgTk9DS1hYQ0hBUgorI2VuZGlmIC8qIE5PQ0tYWENIQVIgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIE5PSUNQCQkJCS8qIE5vIEludGVyYWN0aXZlIENvbW1hbmQgUGFyc2VyICovCisjaWZuZGVmIE5PRElBTAkJCQkvKiBJbXBsaWVzIE5vIERJQUwgY29tbWFuZCAqLworI2RlZmluZSBOT0RJQUwKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyNpZm5kZWYgTk9DS1hZWgkJCQkvKiBhbmQgbm8gZXh0ZXJuYWwgcHJvdG9jb2xzICovCisjZGVmaW5lIE5PQ0tYWVoKKyNlbmRpZiAvKiBOT0NLWFlaICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKworI2lmbmRlZiBOT0lLU0QKKyNpZmRlZiBJS1NET05MWQorI2lmbmRlZiBJS1NECisjZGVmaW5lIElLU0QKKyNlbmRpZiAvKiBJS1NEICovCisjaWZuZGVmIE5PTE9DQUwKKyNkZWZpbmUgTk9MT0NBTAorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZm5kZWYgTk9QVVNICisjZGVmaW5lIE5PUFVTSAorI2VuZGlmIC8qIE5PUFVTSCAqLworI2lmbmRlZiBUTkNPREUKKyNkZWZpbmUgVE5DT0RFCisjZW5kaWYgLyogVE5DT0RFICovCisjaWZuZGVmIFRDUFNPQ0tFVAorI2RlZmluZSBUQ1BTT0NLRVQKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNpZm5kZWYgTkVUQ09OTgorI2RlZmluZSBORVRDT05OCisjZW5kaWYgLyogTkVUQ09OTiAqLworI2lmZGVmIFNVTlgyNQorI3VuZGVmIFNVTlgyNQorI2VuZGlmIC8qIFNVTlgyNSAqLworI2lmZGVmIElCTVgyNQorI3VuZGVmIElCTVgyNQorI2VuZGlmIC8qIElCTVgyNSAqLworI2lmZGVmIFNUUkFUVVNYMjUKKyN1bmRlZiBTVFJBVFVTWDI1CisjZW5kaWYgLyogU1RSQVRVU1gyNSAqLworI2lmZGVmIENLX05FVEJJT1MKKyN1bmRlZiBDS19ORVRCSU9TCisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworI2lmZGVmIFNVUEVSTEFUCisjdW5kZWYgU1VQRVJMQVQKKyNlbmRpZiAvKiBTVVBFUkxBVCAqLworI2lmZGVmIE5QSVBFCisjdW5kZWYgTlBJUEUKKyNlbmRpZiAvKiBOUElQRSAqLworI2lmZGVmIE5FVEZJTEUKKyN1bmRlZiBORVRGSUxFCisjZW5kaWYgLyogTkVURklMRSAqLworI2lmZGVmIE5FVENNRAorI3VuZGVmIE5FVENNRAorI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorI3VuZGVmIE5FVFBUWQorI2VuZGlmIC8qIE5FVFBUWSAqLworI2lmZGVmIFJMT0dDT0RFCisjdW5kZWYgUkxPR0NPREUKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2lmZGVmIE5FVERMTAorI3VuZGVmIE5FVERMTAorI2VuZGlmIC8qIE5FVERMTCAqLworI2lmbmRlZiBOT1NTSAorI3VuZGVmIE5PU1NICisjZW5kaWYgLyogTk9TU0ggKi8KKyNpZm5kZWYgTk9GT1JXQVJEWAorI2RlZmluZSBOT0ZPUldBUkRYCisjZW5kaWYgLyogTk9GT1JXQVJEWCAqLworI2lmbmRlZiBOT0JST1dTRVIKKyNkZWZpbmUgTk9CUk9XU0VSCisjZW5kaWYgLyogTk9CUk9XU0VSICovCisjaWZuZGVmIE5PSFRUUAorI2RlZmluZSBOT0hUVFAKKyNlbmRpZiAvKiBOT0hUVFAgKi8KKyNpZm5kZWYgTk9GVFAKKyNkZWZpbmUgTk9GVFAKKyNlbmRpZiAvKiBOT0ZUUCAqLworI2lmbmRlZiBOT19DT01QT1JUCisjZGVmaW5lIE5PX0NPTVBPUlQKKyNlbmRpZiAvKiBOT19DT01QT1JUICovCisjZW5kaWYgLyogSUtTRE9OTFkgKi8KKyNlbmRpZiAvKiBOT0lLU0QgKi8KKworLyogRmVhdHVyZXMgdGhhdCBjYW4gYmUgZWxpbWluYXRlZCBmcm9tIGEgcmVtb3RlLW9ubHkgdmVyc2lvbiAqLworCisjaWZkZWYgTk9MT0NBTAorI2lmbmRlZiBOT0ZUUAorI2RlZmluZSBOT0ZUUAorI2VuZGlmIC8qIE5PRlRQICovCisjaWZuZGVmIE5PSFRUUAorI2RlZmluZSBOT0hUVFAKKyNlbmRpZiAvKiBOT0hUVFAgKi8KKyNpZm5kZWYgTk9TU0gKKyNkZWZpbmUgTk9TU0gKKyNlbmRpZiAvKiBOT1NTSCAqLworI2lmbmRlZiBOT1RFUk0KKyNkZWZpbmUgTk9URVJNCisjZW5kaWYgLyogTk9URVJNICovCisjaWZuZGVmIE5PQ1VSU0VTCQkJLyogRnVsbHNjcmVlbiBmaWxlLXRyYW5zZmVyIGRpc3BsYXkgKi8KKyNkZWZpbmUgTk9DVVJTRVMKKyNlbmRpZiAvKiBOT0NVUlNFUyAqLworI2lmbmRlZiBOT0RJQUwKKyNkZWZpbmUgTk9ESUFMCisjZW5kaWYgLyogTk9ESUFMICovCisjaWZuZGVmIE5PU0NSSVBUCisjZGVmaW5lIE5PU0NSSVBUCisjZW5kaWYgLyogTk9TQ1JJUFQgKi8KKyNpZm5kZWYgTk9TRVRLRVkKKyNkZWZpbmUgTk9TRVRLRVkKKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworI2lmbmRlZiBOT0tWRVJCUworI2RlZmluZSBOT0tWRVJCUworI2VuZGlmIC8qIE5PS1ZFUkJTICovCisjaWZuZGVmIE5PWE1JVAorI2RlZmluZSBOT1hNSVQKKyNlbmRpZiAvKiBOT1hNSVQgKi8KKyNpZmRlZiBDS19DVVJTRVMKKyN1bmRlZiBDS19DVVJTRVMKKyNlbmRpZiAvKiBDS19DVVJTRVMgKi8KKyNpZm5kZWYgSUtTRE9OTFkKKyNpZm5kZWYgTk9BUEMKKyNkZWZpbmUgTk9BUEMKKyNlbmRpZiAvKiBOT0FQQyAqLworI2lmbmRlZiBOT05FVAorI2RlZmluZSBOT05FVAorI2VuZGlmIC8qIE5PTkVUICovCisjZW5kaWYgLyogSUtTRE9OTFkgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBOT05FVAorI2lmZGVmIE5FVENPTk4KKyN1bmRlZiBORVRDT05OCisjZW5kaWYgLyogTkVUQ09OTiAqLworI2lmZGVmIFRDUFNPQ0tFVAorI3VuZGVmIFRDUFNPQ0tFVAorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2lmbmRlZiBOT1RDUE9QVFMKKyNkZWZpbmUgTk9UQ1BPUFRTCisjZW5kaWYgLyogTk9UQ1BPUFRTICovCisjaWZkZWYgU1VOWDI1CisjdW5kZWYgU1VOWDI1CisjZW5kaWYgLyogU1VOWDI1ICovCisjaWZkZWYgSUJNWDI1CisjdW5kZWYgSUJNWDI1CisjZW5kaWYgLyogSUJNWDI1ICovCisjaWZkZWYgU1RSQVRVU1gyNQorI3VuZGVmIFNUUkFUVVNYMjUKKyNlbmRpZiAvKiBTVFJBVFVTWDI1ICovCisjaWZkZWYgQ0tfTkVUQklPUworI3VuZGVmIENLX05FVEJJT1MKKyNlbmRpZiAvKiBDS19ORVRCSU9TICovCisjaWZkZWYgU1VQRVJMQVQKKyN1bmRlZiBTVVBFUkxBVAorI2VuZGlmIC8qIFNVUEVSTEFUICovCisjaWZkZWYgTlBJUEUKKyN1bmRlZiBOUElQRQorI2VuZGlmIC8qIE5QSVBFICovCisjaWZkZWYgTkVURklMRQorI3VuZGVmIE5FVEZJTEUKKyNlbmRpZiAvKiBORVRGSUxFICovCisjaWZkZWYgTkVUQ01ECisjdW5kZWYgTkVUQ01ECisjZW5kaWYgLyogTkVUQ01EICovCisjaWZkZWYgTkVUUFRZCisjdW5kZWYgTkVUUFRZCisjZW5kaWYgLyogTkVUUFRZICovCisjaWZkZWYgUkxPR0NPREUKKyN1bmRlZiBSTE9HQ09ERQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisjaWZkZWYgTkVURExMCisjdW5kZWYgTkVURExMCisjZW5kaWYgLyogTkVURExMICovCisjaWZuZGVmIE5PU1NICisjZGVmaW5lIE5PU1NICisjZW5kaWYgLyogTk9TU0ggKi8KKyNpZm5kZWYgTk9GVFAKKyNkZWZpbmUgTk9GVFAKKyNlbmRpZiAvKiBOT0ZUUCAqLworI2lmbmRlZiBOT0hUVFAKKyNkZWZpbmUgTk9IVFRQCisjZW5kaWYgLyogTk9IVFRQICovCisjaWZuZGVmIE5PQlJPV1NFUgorI2RlZmluZSBOT0JST1dTRVIKKyNlbmRpZiAvKiBOT0JST1dTRVIgKi8KKyNpZm5kZWYgTk9GT1JXQVJEWAorI2RlZmluZSBOT0ZPUldBUkRYCisjZW5kaWYgLyogTk9GT1JXQVJEWCAqLworI2VuZGlmIC8qIE5PTkVUICovCisKKyNpZmRlZiBJS1NET05MWQorI2lmZGVmIFNVTlgyNQorI3VuZGVmIFNVTlgyNQorI2VuZGlmIC8qIFNVTlgyNSAqLworI2lmZGVmIElCTVgyNQorI3VuZGVmIElCTVgyNQorI2VuZGlmIC8qIElCTVgyNSAqLworI2lmZGVmIFNUUkFUVVNYMjUKKyN1bmRlZiBTVFJBVFVTWDI1CisjZW5kaWYgLyogU1RSQVRVU1gyNSAqLworI2lmZGVmIENLX05FVEJJT1MKKyN1bmRlZiBDS19ORVRCSU9TCisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworI2lmZGVmIFNVUEVSTEFUCisjdW5kZWYgU1VQRVJMQVQKKyNlbmRpZiAvKiBTVVBFUkxBVCAqLworI2lmZGVmIE5QSVBFCisjdW5kZWYgTlBJUEUKKyNlbmRpZiAvKiBOUElQRSAqLworI2lmZGVmIE5FVEZJTEUKKyN1bmRlZiBORVRGSUxFCisjZW5kaWYgLyogTkVURklMRSAqLworI2lmZGVmIE5FVENNRAorI3VuZGVmIE5FVENNRAorI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorI3VuZGVmIE5FVFBUWQorI2VuZGlmIC8qIE5FVFBUWSAqLworI2lmZGVmIFJMT0dDT0RFCisjdW5kZWYgUkxPR0NPREUKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2lmZGVmIE5FVERMTAorI3VuZGVmIE5FVERMTAorI2VuZGlmIC8qIE5FVERMTCAqLworI2lmbmRlZiBOT1NTSAorI2RlZmluZSBOT1NTSAorI2VuZGlmIC8qIE5PU1NIICovCisjaWZuZGVmIE5PSFRUUAorI2RlZmluZSBOT0hUVFAKKyNlbmRpZiAvKiBOT0hUVFAgKi8KKyNpZm5kZWYgTk9CUk9XU0VSCisjZGVmaW5lIE5PQlJPV1NFUgorI2VuZGlmIC8qIE5PQlJPV1NFUiAqLworI2VuZGlmIC8qIElLU0RPTkxZICovCisvKgorICBOb3RlIHRoYXQgbm9uZSBvZiB0aGUgYWJvdmUgcHJlY2x1ZGVzIFROQ09ERSwgd2hpY2ggY2FuIGJlIGRlZmluZWQgaW4KKyAgdGhlIGFic2VuY2Ugb2YgVENQU09DS0VULCBldGMsIHRvIGVuYWJsZSBzZXJ2ZXItc2lkZSBUZWxuZXQgbmVnb3RhdGlvbi4KKyovCisjaWZuZGVmIFROQ09ERQkJCQkvKiBUaGlzIGlzIGZvciB0aGUgYmVuZWZpdCBvZiAqLworI2lmZGVmIFRDUFNPQ0tFVAkJCS8qIG1vZHVsZXMgdGhhdCBtaWdodCBuZWVkIFROQ09ERSAqLworI2RlZmluZSBUTkNPREUJCQkJLyogbm90IGFsbCBvZiBja2NuZXQuaC4uLiAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2VuZGlmIC8qIFROQ09ERSAqLworCisjaWZuZGVmIE5FVENPTk4KKyNpZmRlZiBUQ1BTT0NLRVQKKyNkZWZpbmUgTkVUQ09OTgorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmbmRlZiBERUZQQVIJCQkJLyogRGVmYXVsdCBwYXJpdHkgKi8KKyNkZWZpbmUgREVGUEFSIDAJCQkvKiBNdXN0IGJlIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkICovCisjZW5kaWYgLyogREVGUEFSICovCQkJLyogYnkgYWxsIGNsYXNzZXMgb2YgbW9kdWxlcyAqLworCisjaWZkZWYgTlQKKyNpZm5kZWYgT1MyT1JXSU4zMgorI2RlZmluZSBPUzJPUldJTjMyCisjZW5kaWYgLyogT1MyT1JXSU4zMiAqLworI2lmbmRlZiBPUzIKKyNkZWZpbmUgV0lOMzJPTkxZCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTlQgKi8KKworI2lmZGVmIE9TMgkJCQkvKiBGb3IgT1MvMiBkZWJ1Z2dpbmcgKi8KKyNpZm5kZWYgT1MyT1JXSU4zMgorI2RlZmluZSBPUzJPUldJTjMyCisjZW5kaWYgLyogT1MyT1JXSU4zMiAqLworI2lmZGVmIE5UCisjZGVmaW5lIE5PQ1JZUFQKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZGVmaW5lIE5UU0lHCisjZWxzZSAvKiBOVCAqLworI2RlZmluZSBPUzJPTkxZCisjaW5jbHVkZSA8b3MyZGVmLmg+CisjZW5kaWYgLyogTlQgKi8KKyNpZm5kZWYgT1MyT1JVTklYCisjZGVmaW5lIE9TMk9SVU5JWAorI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworI2lmbmRlZiBPUzJPUlZNUworI2RlZmluZSBPUzJPUlZNUworI2VuZGlmIC8qIE9TMk9SVk1TICovCisjZW5kaWYgLyogT1MyICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgkJCS8qIEJlZ2luIGJ5IGluY2x1ZGluZyB0aGlzLiAqLworI2luY2x1ZGUgPGN0eXBlLmg+CQkJLyogYW5kIHRoaXMuICovCisKKy8qIFN5c3RlbS10eXBlIGNvbXBpbGF0aW9uIHN3aXRjaGVzICovCisKKyNpZmRlZiBGVDIxCQkJCS8qIEZvcnR1bmUgRm9yOlBybyAyLjEgaW1wbGllcyAxLjggKi8KKyNpZm5kZWYgRlQxOAorI2RlZmluZSBGVDE4CisjZW5kaWYgLyogRlQxOCAqLworI2VuZGlmIC8qIEZUMjEgKi8KKworI2lmZGVmIF9fYnNkaV9fCisjaWZuZGVmIEJTREkKKyNkZWZpbmUgQlNESQorI2VuZGlmIC8qIEJTREkgKi8KKyNlbmRpZiAvKiBfX2JzZGlfXyAqLworCisjaWZkZWYgQUlYUFMyCQkJCS8qIEFJWFBTMiBpbXBsaWVzIEFJWDM3MCAqLworI2lmbmRlZiBBSVgzNzAKKyNkZWZpbmUgQUlYMzcwCisjZW5kaWYgLyogQUlYMzcwICovCisjZW5kaWYgLyogQUlYUFMyICovCisKKyNpZmRlZiBBSVgzNzAJCQkJLyogQUlYIFBTLzIgb3IgMzcwIGltcGxpZXMgQlNENCAqLworI2lmbmRlZiBCU0Q0CisjZGVmaW5lIEJTRDQKKyNlbmRpZiAvKiBCU0Q0ICovCisjZW5kaWYgLyogQUlYMzcwICovCisKKyNpZmRlZiBBSVhFU0EJCQkJLyogQUlYL0VTQSBpbXBsaWVzIEJTRDQuNCAqLworI2lmbmRlZiBCU0Q0NAorI2RlZmluZSBCU0Q0NAorI2VuZGlmIC8qIEJTRDQ0ICovCisjZW5kaWYgLyogQUlYRVNBICovCisKKyNpZmRlZiBBSVg1MwkJCQkvKiBBSVg1MyBpbXBsaWVzIEFJWDUyICovCisjaWZuZGVmIEFJWDUyCisjZGVmaW5lIEFJWDUyCisjZW5kaWYgLyogQUlYNTIgKi8KKyNlbmRpZiAvKiBBSVg1MyAqLworCisjaWZkZWYgQUlYNTIJCQkJLyogQUlYNTIgaW1wbGllcyBBSVg1MSAqLworI2lmbmRlZiBBSVg1MQorI2RlZmluZSBBSVg1MQorI2VuZGlmIC8qIEFJWDUxICovCisjZW5kaWYgLyogQUlYNTIgKi8KKworI2lmZGVmIEFJWDUxCQkJCS8qIEFJWDUxIGltcGxpZXMgQUlYNTAgKi8KKyNpZm5kZWYgQUlYNTAKKyNkZWZpbmUgQUlYNTAKKyNlbmRpZiAvKiBBSVg1MCAqLworI2VuZGlmIC8qIEFJWDUxICovCisKKyNpZmRlZiBBSVg1MAkJCQkvKiBBSVg1MCBpbXBsaWVzIEFJWDQ1ICovCisjaWZuZGVmIEFJWDQ1CisjZGVmaW5lIEFJWDQ1CisjZW5kaWYgLyogQUlYNDUgKi8KKyNlbmRpZiAvKiBBSVg1MCAqLworCisjaWZkZWYgQUlYNDUJCQkJLyogQUlYNDUgaW1wbGllcyBBSVg0NCAqLworI2lmbmRlZiBBSVg0NAorI2RlZmluZSBBSVg0NAorI2VuZGlmIC8qIEFJWDQ0ICovCisjZW5kaWYgLyogQUlYNDUgKi8KKworI2lmZGVmIEFJWDQ0CQkJCS8qIEFJWDQ0IGltcGxpZXMgQUlYNDMgKi8KKyNpZm5kZWYgQUlYNDMKKyNkZWZpbmUgQUlYNDMKKyNlbmRpZiAvKiBBSVg0MyAqLworI2VuZGlmIC8qIEFJWDQ0ICovCisKKyNpZmRlZiBBSVg0MwkJCQkvKiBBSVg0MyBpbXBsaWVzIEFJWDQyICovCisjaWZuZGVmIEFJWDQyCisjZGVmaW5lIEFJWDQyCisjZW5kaWYgLyogQUlYNDIgKi8KKyNlbmRpZiAvKiBBSVg0MyAqLworCisjaWZkZWYgQUlYNDIJCQkJLyogQUlYNDIgaW1wbGllcyBBSVg0MSAqLworI2lmbmRlZiBBSVg0MQorI2RlZmluZSBBSVg0MQorI2VuZGlmIC8qIEFJWDQxICovCisjZW5kaWYgLyogQUlYNDIgKi8KKworI2lmZGVmIFNWNjhSM1Y2CQkJCS8qIFN5c3RlbSBWLzY4IFIzMlY2IGltcGxpZXMgU1ZSMyAqLworI2lmbmRlZiBTVlIzCisjZGVmaW5lIFNWUjMKKyNlbmRpZiAvKiBTVlIzICovCisjZW5kaWYgLyogU1Y2OFIzVjYgKi8KKworI2lmZGVmIFNWODhSMzIJCQkJLyogU3lzdGVtIFYvODggUjMyIGltcGxpZXMgU1ZSMyAqLworI2lmbmRlZiBTVlIzCisjZGVmaW5lIFNWUjMKKyNlbmRpZiAvKiBTVlIzICovCisjZW5kaWYgLyogU1Y4OFIzMiAqLworCisjaWZkZWYgREdVWDU0MAkJCQkvKiBERyBVWCA1LjQwIGltcGxpZXMgU3lzIFYgUiA0ICovCisjaWZuZGVmIFNWUjQKKyNkZWZpbmUgU1ZSNAorI2VuZGlmIC8qIFNWUjQgKi8KKyNlbmRpZiAvKiBER1VYNTQwICovCisKKyNpZm5kZWYgREdVWAorI2lmZGVmIERHVVg1NDAJCQkJLyogREcvVVggNS40MCBpbXBsaWVzIERHVVggKi8KKyNkZWZpbmUgREdVWAorI2Vsc2UKKyNpZmRlZiBER1VYNDMwCQkJCS8qIFNvIGRvZXMgREcvVVggNC4zMCAqLworI2RlZmluZSBER1VYCisjZW5kaWYgLyogREdVWDQzMCAqLworI2VuZGlmIC8qIERHVVg1NDAgKi8KKyNlbmRpZiAvKiBER1VYICovCisKKyNpZmRlZiBJUklYNjUJCQkJLyogSVJJWCA2LjUgaW1wbGllcyBJUklYIDYuNCAqLworI2lmbmRlZiBJUklYNjQKKyNkZWZpbmUgSVJJWDY0CisjZW5kaWYgLyogSVJJWDY0ICovCisjZW5kaWYgLyogSVJJWDY1ICovCisKKyNpZmRlZiBJUklYNjQJCQkJLyogSVJJWCA2LjQgaW1wbGllcyBJUklYIDYuMiAqLworI2lmbmRlZiBCU0Q0NE9SUE9TSVgKKyNkZWZpbmUgQlNENDRPUlBPU0lYCQkJLyogZm9yIGNrdXRpbydzIGJlbmVmaXQgKi8KKyNlbmRpZiAvKiBCU0Q0NE9SUE9TSVggKi8KKyNpZm5kZWYgSVJJWDYyCisjZGVmaW5lIElSSVg2MgorI2VuZGlmIC8qIElSSVg2MiAqLworI2VuZGlmIC8qIElSSVg2NCAqLworCisjaWZkZWYgSVJJWDYyCQkJCS8qIElSSVggNi4yIGltcGxpZXMgSVJJWCA2LjAgKi8KKyNpZm5kZWYgSVJJWDYwCisjZGVmaW5lIElSSVg2MAorI2VuZGlmIC8qIElSSVg2MCAqLworI2VuZGlmIC8qIElSSVg2MiAqLworCisjaWZkZWYgSVJJWDYwCQkJCS8qIElSSVggNi4wIGltcGxpZXMgSVJJWCA1LjEgKi8KKyNpZm5kZWYgSVJJWDUxCisjZGVmaW5lIElSSVg1MQorI2VuZGlmIC8qIElSSVg1MSAqLworI2lmbmRlZiBJUklYNTIJCQkJLyogQW5kIElSSVggNS4yIChmb3IgaHdmYykgKi8KKyNkZWZpbmUgSVJJWDUyCisjZW5kaWYgLyogSVJJWDUyICovCisjZW5kaWYgLyogSVJJWDYwICovCisKKyNpZm5kZWYgSVJJWAkJCQkvKiBJUklYIDQuMCBvciBncmVhdGVyIGltcGxpZXMgSVJJWCAqLworI2lmZGVmIElSSVg2NAorI2RlZmluZSBJUklYCisjZWxzZQorI2lmZGVmIElSSVg2MgorI2RlZmluZSBJUklYCisjZWxzZQorI2lmZGVmIElSSVg2MAorI2RlZmluZSBJUklYCisjZWxzZQorI2lmZGVmIElSSVg1MQorI2RlZmluZSBJUklYCisjZWxzZQorI2lmZGVmIElSSVg0MAorI2RlZmluZSBJUklYCisjZW5kaWYgLyogSVJJWDQwICovCisjZW5kaWYgLyogSVJJWDUxICovCisjZW5kaWYgLyogSVJJWDYwICovCisjZW5kaWYgLyogSVJJWDYyICovCisjZW5kaWYgLyogSVJJWDY0ICovCisjZW5kaWYgLyogSVJJWCAqLworCisjaWZkZWYgTUlQUwkJCQkvKiBNSVBTIFN5c3RlbSBWIGVudmlyb25tZW50ICovCisjaWZuZGVmIFNWUjMJCQkJLyogaW1wbGllcyBTeXN0ZW0gViBSMyBvciBsYXRlciAqLworI2RlZmluZSBTVlIzCisjZW5kaWYgLyogU1ZSMyAqLworI2VuZGlmIC8qIE1JUFMgKi8KKworI2lmZGVmIEhQVVg5CQkJCS8qIEhQLVVYIDkueCAqLworI2lmbmRlZiBTVlIzCisjZGVmaW5lIFNWUjMKKyNlbmRpZiAvKiBTVlIzICovCisjaWZuZGVmIEhQVVgKKyNkZWZpbmUgSFBVWAorI2VuZGlmIC8qIEhQVVggKi8KKyNpZm5kZWYgSFBVWDlQTFVTCisjZGVmaW5lIEhQVVg5UExVUworI2VuZGlmIC8qIEhQVVg5UExVUyAqLworI2VuZGlmIC8qIEhQVVg5ICovCisKKyNpZmRlZiBIUFVYMTAJCQkJLyogSFAtVVggMTAueCAqLworI2lmbmRlZiBIUFVYMTAxMAkJCS8qIElmIGFueXRoaW5nIGhpZ2hlciBpcyBkZWZpbmVkICovCisjaWZkZWYgSFBVWDEwMjAJCQkJLyogZGVmaW5lIEhQVVgxMDEwIHRvby4gKi8KKyNkZWZpbmUgSFBVWDEwMTAKKyNlbmRpZiAvKiBIUFVYMTAyMCAqLworI2lmZGVmIEhQVVgxMDMwCisjZGVmaW5lIEhQVVgxMDEwCisjZW5kaWYgLyogSFBVWDEwMzAgKi8KKyNlbmRpZiAvKiBIUFVYMTAxMCAqLworCisjaWZkZWYgSFBVWDExMDAJCQkJLyogSFAtVVggMTEuMDAgaW1wbGllcyAxMC4xMCAqLworI2lmbmRlZiBIUFVYMTAxMAorI2RlZmluZSBIUFVYMTAxMAorI2VuZGlmIC8qIEhQVVgxMDEwICovCisjZW5kaWYgLyogSFBVWDExMDAgKi8KKworI2lmbmRlZiBTVlI0CisjZGVmaW5lIFNWUjQKKyNlbmRpZiAvKiBTVlI0ICovCisjaWZuZGVmIEhQVVgKKyNkZWZpbmUgSFBVWAorI2VuZGlmIC8qIEhQVVggKi8KKyNpZm5kZWYgSFBVWDlQTFVTCisjZGVmaW5lIEhQVVg5UExVUworI2VuZGlmIC8qIEhQVVg5UExVUyAqLworI2VuZGlmIC8qIEhQVVgxMCAqLworCisjaWZkZWYgUU5YCQkJCS8qIFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIEluYyAqLworI2lmbmRlZiBQT1NJWAkJCQkvKiBRTlggNC4wIG9yIGxhdGVyIGlzIFBPU0lYICovCisjZGVmaW5lIFBPU0lYCisjZW5kaWYgLyogUE9TSVggKi8KKyNpZm5kZWYgX18zODZfXwkJCQkvKiBDb21lcyBpbiAxNi1iaXQgYW5kIDMyLWJpdCAqLworI2RlZmluZSBfXzE2QklUX18KKyNkZWZpbmUgQ0tfUU5YMTYKKyNlbHNlCisjZGVmaW5lIF9fMzJCSVRfXworI2RlZmluZSBDS19RTlgzMgorI2VuZGlmIC8qIF9fMzg2X18gKi8KKyNlbmRpZiAvKiBRTlggKi8KKworLyoKKyAgNC40QlNEIGlzIGEgbWl4dHVyZSBvZiBTeXN0ZW0gViBSNCwgUE9TSVgsIGFuZCA0LjNCU0QuCisqLworI2lmZGVmIEJTRDQ0CQkJCS8qIDQuNCBCU0QgKi8KKyNpZm5kZWYgU1ZSNAkJCQkvKiBCU0Q0NCBpbXBsaWVzIFNWUjQgKi8KKyNkZWZpbmUgU1ZSNAorI2VuZGlmIC8qIFNWUjQgKi8KKyNpZm5kZWYgTk9TRVRCVUYJCQkvKiBOT1NFVEJVRiBpcyBzYWZlICovCisjZGVmaW5lIE5PU0VUQlVGCisjZW5kaWYgLyogTk9TRVRCVUYgKi8KKyNpZm5kZWYgRElSRU5UCQkJCS8qIFVzZXMgPGRpcmVudC5oPiAqLworI2RlZmluZSBESVJFTlQKKyNlbmRpZiAvKiBESVJFTlQgKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworCisjaWZkZWYgT1BFTkJTRAkJCQkvKiBPcGVuQlNEIG1pZ2h0IG9yIG1pZ2h0IG5vdCAqLworI2lmbmRlZiBfX09wZW5CU0RfXwkJCS8qIGhhdmUgdGhpcyBkZWZpbmVkLi4uICovCisjZGVmaW5lIF9fT3BlbkJTRF9fCisjZW5kaWYgLyogX19PcGVuQlNEX18gKi8KKyNlbmRpZiAvKiBPUEVOQlNEICovCisKKyNpZmRlZiBTVlIzCQkJCS8qIFNWUjMgaW1wbGllcyBBVFRTViAqLworI2lmbmRlZiBBVFRTVgorI2RlZmluZSBBVFRTVgorI2VuZGlmIC8qIEFUVFNWICovCisjZW5kaWYgLyogU1ZSMyAqLworCisjaWZkZWYgU1ZSNAkJCQkvKiBTVlI0IGltcGxpZXMgQVRUU1YgKi8KKyNpZm5kZWYgQVRUU1YKKyNkZWZpbmUgQVRUU1YKKyNlbmRpZiAvKiBBVFRTViAqLworI2lmbmRlZiBTVlIzCQkJCS8qIC4uLmFzIHdlbGwgYXMgU1ZSMyAqLworI2RlZmluZSBTVlIzCisjZW5kaWYgLyogU1ZSMyAqLworI2VuZGlmIC8qIFNWUjQgKi8KKworI2lmZGVmIE9YT1MKKyNpZm5kZWYgQVRUU1YKKyNkZWZpbmUgQVRUU1YJCQkJLyogT1hPUyBpbXBsaWVzIEFUVFNWICovCisjZW5kaWYgLyogISBBVFRTViAqLworI2RlZmluZSBTV19BQ0NfSUQJCQkvKiBhY2Nlc3MoKSB3YW50cyBwcml2cyBvbiAqLworI2RlZmluZSBraWxsIHByaXZfa2lsbAkJCS8qIGtpbGwoKSB3YW50cyBwcml2cyBvbiAqLworI2lmbmRlZiBOT1NFVEJVRgorI2RlZmluZSBOT1NFVEJVRgkJCS8qIE5PU0VUQlVGIGlzIHNhZmUgKi8KKyNlbmRpZiAvKiAhIE5PU0VUQlVGICovCisjZW5kaWYgLyogT1hPUyAqLworCisjaWZkZWYgVVRTVgkJCQkvKiBVVFNWIGltcGxpZXMgQVRUU1YgKi8KKyNpZm5kZWYgQVRUU1YKKyNkZWZpbmUgQVRUU1YKKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIFVUU1YgKi8KKworI2lmZGVmIFhFTklYCQkJCS8qIFhFTklYIGltcGxpZXMgQVRUU1YgKi8KKyNpZm5kZWYgQVRUU1YKKyNkZWZpbmUgQVRUU1YKKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIFhFTklYICovCisKKyNpZmRlZiBBVVgJCQkJLyogQVVYIGltcGxpZXMgQVRUU1YgKi8KKyNpZm5kZWYgQVRUU1YKKyNkZWZpbmUgQVRUU1YKKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIEFVWCAqLworCisjaWZkZWYgQVRUNzMwMAkJCQkvKiBBVFQ3MzAwIGltcGxpZXMgQVRUU1YgKi8KKyNpZm5kZWYgQVRUU1YKKyNkZWZpbmUgQVRUU1YKKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIEFUVDczMDAgKi8KKworI2lmZGVmIEFUVDYzMDAJCQkJLyogQVRUNjMwMCBpbXBsaWVzIEFUVFNWICovCisjaWZuZGVmIEFUVFNWCisjZGVmaW5lIEFUVFNWCisjZW5kaWYgLyogQVRUU1YgKi8KKyNlbmRpZiAvKiBBVFQ2MzAwICovCisKKyNpZmRlZiBIUFVYCQkJCS8qIEhQVVggaW1wbGllcyBBVFRTViAqLworI2lmbmRlZiBBVFRTVgorI2RlZmluZSBBVFRTVgorI2VuZGlmIC8qIEFUVFNWICovCisjZW5kaWYgLyogSFBVWCAqLworCisjaWZkZWYgSVNJSUkJCQkJLyogSVNJSUkgaW1wbGllcyBBVFRTViAqLworI2lmbmRlZiBBVFRTVgorI2RlZmluZSBBVFRTVgorI2VuZGlmIC8qIEFUVFNWICovCisjZW5kaWYgLyogSVNJSUkgKi8KKworI2lmZGVmIE5FWFQzMwkJCQkvKiBORVhUMzMgaW1wbGllcyBORVhUICovCisjaWZuZGVmIE5FWFQKKyNkZWZpbmUgTkVYVAorI2VuZGlmIC8qIE5FWFQgKi8KKyNlbmRpZiAvKiBORVhUMzMgKi8KKworI2lmZGVmIE5FWFQJCQkJLyogTkVYVCBpbXBsaWVzIEJTRDQgKi8KKyNpZm5kZWYgQlNENAorI2RlZmluZSBCU0Q0CisjZW5kaWYgLyogQlNENCAqLworI2VuZGlmIC8qIE5FWFQgKi8KKworI2lmZGVmIEJTRDQxCQkJCS8qIEJTRDQxIGltcGxpZXMgQlNENCAqLworI2lmbmRlZiBCU0Q0CisjZGVmaW5lIEJTRDQKKyNlbmRpZiAvKiBCU0Q0ICovCisjZW5kaWYgLyogQlNENDEgKi8KKworI2lmZGVmIEJTRDQzCQkJCS8qIEJTRDQzIGltcGxpZXMgQlNENCAqLworI2lmbmRlZiBCU0Q0CisjZGVmaW5lIEJTRDQKKyNlbmRpZiAvKiBCU0Q0ICovCisjZW5kaWYgLyogQlNENDMgKi8KKworI2lmZGVmIEJTRDQJCQkJLyogQlNENCBpbXBsaWVzIEFOWUJTRCAqLworI2lmbmRlZiBBTllCU0QKKyNkZWZpbmUgQU5ZQlNECisjZW5kaWYgLyogQU5ZQlNEICovCisjZW5kaWYgLyogQlNENCAqLworCisjaWZkZWYgQlNEMjkJCQkJLyogQlNEMjkgaW1wbGllcyBBTllCU0QgKi8KKyNpZm5kZWYgQU5ZQlNECisjZGVmaW5lIEFOWUJTRAorI2VuZGlmIC8qIEFOWUJTRCAqLworI2VuZGlmIC8qIEJTRDI5ICovCisKKyNpZmRlZiBBVFRTVgkJCQkvKiBBVFRTViBpbXBsaWVzIFVOSVggKi8KKyNpZm5kZWYgVU5JWAorI2RlZmluZSBVTklYCisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIEFUVFNWICovCisKKyNpZmRlZiBBTllCU0QJCQkJLyogQU5ZQlNEIGltcGxpZXMgVU5JWCAqLworI2lmbmRlZiBVTklYCisjZGVmaW5lIFVOSVgKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogQU5ZQlNEICovCisKKyNpZmRlZiBQT1NJWAkJCQkvKiBQT1NJWCBpbXBsaWVzIFVOSVggKi8KKyNpZm5kZWYgVU5JWAorI2RlZmluZSBVTklYCisjZW5kaWYgLyogVU5JWCAqLworI2lmbmRlZiBESVJFTlQJCQkJLyogYW5kIERJUkVOVCwgaS5lLiA8ZGlyZW50Lmg+ICovCisjaWZuZGVmIFNESVJFTlQKKyNkZWZpbmUgRElSRU5UCisjZW5kaWYgLyogU0RJUkVOVCAqLworI2VuZGlmIC8qIERJUkVOVCAqLworI2lmbmRlZiBOT0ZJTEVICQkJCS8qIFBPU0lYIGRvZXNuJ3QgdXNlIDxzeXMvZmlsZS5oPiAqLworI2RlZmluZSBOT0ZJTEVICisjZW5kaWYgLyogTk9GSUxFSCAqLworI2VuZGlmIC8qIFBPU0lYICovCisKKyNpZmRlZiBWNworI2lmbmRlZiBVTklYCisjZGVmaW5lIFVOSVgKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogVjcgKi8KKworI2lmZGVmIENPSEVSRU5UCisjaWZuZGVmIFVOSVgKKyNkZWZpbmUgVU5JWAorI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBDT01NRU5UCisjaWZuZGVmIE5PQ1VSU0VTCisjZGVmaW5lIE5PQ1VSU0VTCisjZW5kaWYgLyogTk9DVVJTRVMgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKworI2lmZGVmIE1JTklYCisjaWZuZGVmIFVOSVgKKyNkZWZpbmUgVU5JWAorI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBNSU5JWCAqLworLyoKKyAgVGhlIHN5bWJvbCBTVk9SUE9TSVggaXMgZGVmaW5lZCBmb3IgYm90aCBBVCZUIGFuZCBQT1NJWCBjb21waWxhdGlvbnMKKyAgdG8gbWFrZSBpdCBlYXNpZXIgdG8gc2VsZWN0IGl0ZW1zIHRoYXQgU3lzdGVtIFYgYW5kIFBPU0lYIGhhdmUgaW4gY29tbW9uLAorICBidXQgd2hpY2ggQlNELCBWNywgZXRjLCBkbyBub3QgaGF2ZS4KKyovCisjaWZkZWYgQVRUU1YKKyNpZm5kZWYgU1ZPUlBPU0lYCisjZGVmaW5lIFNWT1JQT1NJWAorI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworI2VuZGlmIC8qIEFUVFNWICovCisKKyNpZmRlZiBQT1NJWAorI2lmbmRlZiBTVk9SUE9TSVgKKyNkZWZpbmUgU1ZPUlBPU0lYCisjZW5kaWYgLyogU1ZPUlBPU0lYICovCisjZW5kaWYgLyogUE9TSVggKi8KKworLyoKKyAgVGhlIHN5bWJvbCBTVlI0T1JQT1NJWCBpcyBkZWZpbmVkIGZvciBib3RoIEFUJlQgU3lzdGVtIFYgUjQgYW5kIFBPU0lYCisgIGNvbXBpbGF0aW9ucyB0byBtYWtlIGl0IGVhc2llciB0byBzZWxlY3QgaXRlbXMgdGhhdCBTeXN0ZW0gViBSNCBhbmQgUE9TSVgKKyAgaGF2ZSBpbiBjb21tb24sIGJ1dCB3aGljaCBCU0QsIFY3LCBhbmQgU3lzdGVtIFYgUjMgYW5kIGVhcmxpZXIsIGV0YywgZG8KKyAgbm90IGhhdmUuCisqLworI2lmZGVmIFBPU0lYCisjaWZuZGVmIFNWUjRPUlBPU0lYCisjZGVmaW5lIFNWUjRPUlBPU0lYCisjZW5kaWYgLyogU1ZSNE9SUE9TSVggKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworI2lmZGVmIFNWUjQKKyNpZm5kZWYgU1ZSNE9SUE9TSVgKKyNkZWZpbmUgU1ZSNE9SUE9TSVgKKyNlbmRpZiAvKiBTVlI0T1JQT1NJWCAqLworI2VuZGlmIC8qIFNWUjQgKi8KKworLyoKKyAgVGhlIHN5bWJvbCBCU0Q0NE9SUE9TSVggaXMgZGVmaW5lZCBmb3IgYm90aCA0LjRCU0QgYW5kIFBPU0lYIGNvbXBpbGF0aW9ucworICB0byBtYWtlIGl0IGVhc2llciB0byBzZWxlY3QgaXRlbXMgdGhhdCA0LjRCU0QgYW5kIFBPU0lYIGhhdmUgaW4gY29tbW9uLAorICBidXQgd2hpY2ggU3lzdGVtIFYsIEJTRCwgVjcsIGV0YywgZG8gbm90IGhhdmUuCisqLworI2lmZGVmIEJTRDQ0CisjaWZuZGVmIEJTRDQ0T1JQT1NJWAorI2RlZmluZSBCU0Q0NE9SUE9TSVgKKyNlbmRpZiAvKiBCU0Q0NE9SUE9TSVggKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworCisjaWZkZWYgUE9TSVgKKyNpZm5kZWYgQlNENDRPUlBPU0lYCisjZGVmaW5lIEJTRDQ0T1JQT1NJWAorI2VuZGlmIC8qIEJTRDQ0T1JQT1NJWCAqLworI2VuZGlmIC8qIFBPU0lYICovCisKKyNpZmRlZiBVTklYCQkJCS8qIEZvciBpdGVtcyBjb21tb24gdG8gT1MvMiBhbmQgVU5JWCAqLworI2lmbmRlZiBPUzJPUlVOSVgKKyNkZWZpbmUgT1MyT1JVTklYCisjZW5kaWYgLyogT1MyT1JVTklYICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZkZWYgVU5JWAkJCQkvKiBGb3IgaXRlbXMgY29tbW9uIHRvIFZNUyBhbmQgVU5JWCAqLworI2RlZmluZSBWTVNPUlVOSVgKKyNlbHNlCisjaWZkZWYgVk1TCisjZGVmaW5lIFZNU09SVU5JWAorI2lmbmRlZiBPUzJPUlZNUworI2RlZmluZSBPUzJPUlZNUworI2VuZGlmIC8qIE9TMk9SVk1TICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZuZGVmIFVOSVhPUk9TSwkJCS8qIFVOSVggb3IgT1MtOSAob3IgT1MtOTAwMCkgKi8KKyNpZmRlZiBVTklYCisjZGVmaW5lIFVOSVhPUk9TSworI2Vsc2UKKyNpZmRlZiBPU0sKKyNkZWZpbmUgVU5JWE9ST1NLCisjZW5kaWYgLyogT1NLICovCisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworCisjaWZuZGVmIE9TS09SVU5JWAorI2lmZGVmIFVOSVhPUk9TSworI2RlZmluZSBPU0tPUlVOSVgKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyNlbmRpZiAvKiBPU0tPUlVOSVggKi8KKworI2lmZGVmIE9TMgorI2RlZmluZSBDS19BTlNJQyAgICAgICAgICAgIC8qIE9TLzIgc3VwcG9ydHMgQU5TSUMgYW5kIG1vcmUgZXh0ZW5zaW9ucyAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgT1NGNTAJCSAgICAvKiBOZXdlciBPU0YvMSB2ZXJzaW9ucyBpbXBseSBvbGRlciBvbmVzICovCisjaWZuZGVmIE9TRjQwCisjZGVmaW5lIE9TRjQwCisjZW5kaWYgLyogT1NGNDAgKi8KKyNlbmRpZiAvKiBPU0Y1MCAqLworCisjaWZkZWYgT1NGNDAKKyNpZm5kZWYgT1NGMzIKKyNkZWZpbmUgT1NGMzIKKyNlbmRpZiAvKiBPU0YzMiAqLworI2VuZGlmIC8qIE9TRjQwICovCisKKyNpZmRlZiBPU0YzMgorI2lmbmRlZiBPU0YzMAorI2RlZmluZSBPU0YzMAorI2VuZGlmIC8qIE9TRjMwICovCisjZW5kaWYgLyogT1NGMzIgKi8KKworI2lmZGVmIE9TRjMwCisjaWZuZGVmIE9TRjIwCisjZGVmaW5lIE9TRjIwCisjZW5kaWYgLyogT1NGMjAgKi8KKyNlbmRpZiAvKiBPU0YzMCAqLworCisjaWZkZWYgT1NGMjAKKyNpZm5kZWYgT1NGMTAKKyNkZWZpbmUgT1NGMTAKKyNlbmRpZiAvKiBPU0YxMCAqLworI2VuZGlmIC8qIE9TRjIwICovCisKKyNpZmRlZiBfX0RFQ0MJCQkJLyogRm9yIERFQyBBbHBoYSBWTVMgb3IgT1NGLzEgKi8KKyNpZm5kZWYgQ0tfQU5TSUMKKyNkZWZpbmUgQ0tfQU5TSUMJCQkvKiBFdmVuIHdpdGggL3N0YW5kPXZheGMsIG5lZWQgYW5zaSAqLworI2VuZGlmIC8qIENLQU5TSUMgKi8KKyNpZm5kZWYgU0lHX1YKKyNkZWZpbmUgU0lHX1YJCQkJLyogYW5kIHNpZ25hbCB0eXBlIGlzIFZPSUQgKi8KKyNlbmRpZiAvKiBTSUdfViAqLworI2lmbmRlZiBDS19BTlNJTElCUworI2RlZmluZSBDS19BTlNJTElCUwkJCS8qIChNYXJ0aW4gWmluc2VyLCBGZWIgMTk5NSkgKi8KKyNlbmRpZiAvKiBDS19BTlNJTElCUyAqLworI2lmbmRlZiBfUE9TSVhfQ19TT1VSQ0UKKyNkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDEKKyNlbmRpZiAvKiBfUE9TSVhfQ19TT1VSQ0UgKi8KKyNlbmRpZgkvKiBfX0RFQ0MgKi8KKworI2lmZGVmIFZNUworI2lmZGVmIF9faWE2NAkJCQkvKiBWTVMgb24gSXRhbml1bSAqLworI2lmbmRlZiBWTVNJNjQKKyNkZWZpbmUgVk1TSTY0CisjZW5kaWYJLyogVk1TSTY0ICovCisjZW5kaWYJLyogX19pYTY0ICovCisjaWZuZGVmIFZNUzY0QklUCQkJLyogNjQtYml0IFZNUyBvbiBJdGFuaXVtIG9yIEFscGhhICovCisjaWZkZWYgX19pYTY0CisjZGVmaW5lIFZNUzY0QklUCisjZWxzZQorI2lmZGVmIF9fQUxQSEEKKyNkZWZpbmUgVk1TNjRCSVQKKyNlbmRpZgkvKiBfX2lhNjQgKi8KKyNlbmRpZgkvKiBfX0FMUEhBICovCisjZW5kaWYJLyogVk1TNjRCSVQgKi8KKyNlbmRpZgkvKiBWTVMgKi8KKworI2lmZGVmIGFwb2xsbwkJCQkvKiBNYXkgYmUgQU5TSS1DLCBjaGVjayBmdXJ0aGVyICovCisjaWZkZWYgX19TVERDUFBfXworI2RlZmluZSBDS19BTlNJQwkJCS8qIFllcywgdGhpcyBpcyByZWFsIEFOU0ktQyAqLworI2RlZmluZSBTSUdfVgorI2Vsc2UKKyNkZWZpbmUgTk9BTlNJCQkJCS8qIE5vcGUsIG5vdCBBTlNJICovCisjdW5kZWYgX19TVERDX18JCQkJLyogRXZlbiB0aG91Z2ggaXQgc2F5IGl0IGlzISAqLworI2RlZmluZSBTSUdfSQorI2VuZGlmIC8qIF9fU1REQ1BQX18gKi8KKyNlbmRpZiAvKiBhcG9sbG8gKi8KKworI2lmZGVmIFBPU0lYCQkJCS8qIC1EUE9TSVggb24gY2MgY29tbWFuZCBsaW5lICovCisjaWZuZGVmIF9QT1NJWF9TT1VSQ0UJCQkvKiBJbXBsaWVzIF9QT1NJWF9TT1VSQ0UgKi8KKyNkZWZpbmUgX1BPU0lYX1NPVVJDRQorI2VuZGlmIC8qIF9QT1NJWF9TT1VSQ0UgKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworCisvKgorICBBTlNJIEM/ICBUaGF0IGlzLCBkbyB3ZSBoYXZlIGZ1bmN0aW9uIHByb3RvdHlwZXMsIG5ldy1zdHlsZQorICBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIGFuZCBwYXJhbWV0ZXIgdHlwZSBjaGVja2luZyBhbmQgY29lcmNpb24/CisqLworI2lmZGVmIE1BQwkJCQkvKiBNUFcgQyBpcyBBTlNJICovCisjaWZuZGVmIE5PQU5TSQorI2lmbmRlZiBDS19BTlNJQworI2RlZmluZSBDS19BTlNJQworI2VuZGlmIC8qIENLX0FOU0lDICovCisjZW5kaWYgLyogTk9BTlNJICovCisjZW5kaWYgLyogTUFDICovCisKKyNpZmRlZiBTVFJBVFVTCQkJCS8qIFN0cmF0dXMgVk9TICovCisjaWZuZGVmIENLX0FOU0lDCisjZGVmaW5lIENLX0FOU0lDCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyNpZm5kZWYgTk9TVEFUCisjZGVmaW5lIE5PU1RBVAorI2VuZGlmIC8qIE5PU1RBVCAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKworI2lmbmRlZiBOT0FOU0kKKyNpZmRlZiBfX1NURENfXwkJCQkvKiBfX1NURENfXyBtZWFucyBBTlNJIEMgKi8KKyNpZm5kZWYgQ0tfQU5TSUMKKyNkZWZpbmUgQ0tfQU5TSUMKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworI2VuZGlmIC8qIF9fU1REQ19fICovCisjZW5kaWYgLyogTk9BTlNJICovCisvKgorICBfUFJPVE9UWVAoKSBpcyB1c2VkIGZvciBmb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMgc28gd2UgY2FuIGhhdmUKKyAgcGFyYW1ldGVyIGFuZCByZXR1cm4gdmFsdWUgdHlwZSBjaGVja2luZyBpZiB0aGUgY29tcGlsZXIgb2ZmZXJzIGl0LgorICBfX1NURENfXyBzaG91bGQgYmUgZGVmaW5lZCBieSB0aGUgY29tcGlsZXIgb25seSBpZiBmdW5jdGlvbiBwcm90b3R5cGVzIGFyZQorICBhbGxvd2VkLiAgT3RoZXJ3aXNlLCB3ZSBnZXQgb2xkLXN0eWxlIGZvcndhcmQgZGVjbGFyYXRpb25zLiAgT3VyIG93biBwcml2YXRlCisgIENLX0FOU0lDIHN5bWJvbCB0ZWxscyB3aGV0aGVyIHdlIHVzZSBBTlNJIEMgcHJvdG90eXBlcy4gIFRvIGZvcmNlIHVzZSBvZgorICBBTlNJIHByb3RvdHlwZXMsIGluY2x1ZGUgLURDS19BTlNJQyBvbiB0aGUgY2MgY29tbWFuZCBsaW5lLiAgVG8gZGlzYWJsZSB0aGUKKyAgdXNlIG9mIEFOU0kgcHJvdG90eXBlcywgaW5jbHVkZSAtRE5PQU5TSS4KKyovCisjaWZkZWYgQ0tfQU5TSUMKKyNkZWZpbmUgX1BST1RPVFlQKCBmdW5jLCBwYXJtcyApIGZ1bmMgcGFybXMKKyNlbHNlIC8qIE5vdCBBTlNJIEMgKi8KKyNkZWZpbmUgX1BST1RPVFlQKCBmdW5jLCBwYXJtcyApIGZ1bmMoKQorI2VuZGlmIC8qIENLX0FOU0lDICovCisKKyNpZm5kZWYgT1MyCisjaWZkZWYgTk9MT0dJTgkJCQkvKiBOT0xPR0lOIGltcGxpZXMgTk9JS1NEICovCisjaWZuZGVmIE5PSUtTRAorI2RlZmluZSBOT0lLU0QKKyNlbmRpZiAvKiBOT0lLU0QgKi8KKyNlbmRpZiAvKiBOT0xPR0lOICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBOT0lLU0QJCQkJLyogSW50ZXJuZXQgS2VybWl0IFNlcnZpY2UgRGFlbW9uICovCisjaWZuZGVmIE9TMgorI2lmbmRlZiBOT1BSSU5URlNVQlNUCisjZGVmaW5lIE5PUFJJTlRGU1VCU1QKKyNlbmRpZiAvKiBOT1BSSU5URlNVQlNUICovCisjZW5kaWYgLyogT1MyICovCisjaWZuZGVmIE5PTE9HSU4KKyNkZWZpbmUgTk9MT0dJTgorI2VuZGlmIC8qIE5PTE9HSU4gKi8KKyNpZm5kZWYgTk9TWVNMT0cKKyNkZWZpbmUgTk9TWVNMT0cKKyNlbmRpZiAvKiBOT1NZU0xPRyAqLworI2lmbmRlZiBOT1dUTVAKKyNkZWZpbmUgTk9XVE1QCisjZW5kaWYgLyogTk9XVE1QICovCisjZWxzZQorI2lmbmRlZiBJS1NECisjaWZkZWYgT1MyT1JVTklYCQkJLyogUGxhdGZvcm1zIHdoZXJlIElLU0QgaXMgc3VwcG9ydGVkICovCisjZGVmaW5lIElLU0QKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyNlbmRpZiAvKiBJS1NEICovCisjZW5kaWYgLyogTk9JS1NEICovCisKKyNpZmRlZiBJS1NECQkJCS8qIElLU0Qgb3B0aW9ucy4uLiAqLworI2lmbmRlZiBJS1NEQ09ORgkJCS8qIElLU0QgY29uZmlndXJhdGlvbiBmaWxlICovCisjaWZkZWYgVU5JWAorI2RlZmluZSBJS1NEQ09ORiAiL2V0Yy9pa3NkLmNvbmYiCisjZWxzZQorI2lmZGVmIE9TMgorI2RlZmluZSBJS1NEQ09ORiAiaWtzZC5rc2MiCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIElLU0RDT05GICovCisjaWZuZGVmIE5PSUtTREIKKyNpZm5kZWYgSUtTREIJCQkJLyogSUtTRCBkYXRhYmFzZSAqLworI2lmZGVmIFVOSVgKKyNkZWZpbmUgSUtTREIKKyNkZWZpbmUgSUtfTENLVFJJRVMgMTYJCQkvKiBIb3cgbWFueSB0aW1lcyB0byB0cnkgdG8gZ2V0IGxvY2sgKi8KKyNkZWZpbmUgSUtfTENLU0xFRVAgMQkJCS8qIEhvdyBsb25nIHRvIHNsZWVwIGJldHdlZW4gdHJpZXMgKi8KKyNkZWZpbmUgSUtfTE9DS0ZJTEUgImlrc2QubGNrIgkJLyogRGF0YWJhc2UgbG9ja2ZpbGVuYW1lICovCisjZGVmaW5lIElLX0RCQVNFRElSICIvdmFyL2xvZy8iCQkvKiBEYXRhYmFzZSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgSUtfREJBU0VGSUwgImlrc2QuZGIiCQkvKiBEYXRhYmFzZSBmaWxlbmFtZSAqLworI2Vsc2UgLyogVU5JWCAqLworI2lmZGVmIE9TMgorI2RlZmluZSBJS1NEQgorI2lmbmRlZiBOT0ZUUlVOQ0FURQkJCS8qIGZ0cnVuY2F0ZSgpIG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTk9GVFJVTkNBVEUKKyNlbmRpZiAvKiBOT0ZUUlVOQ0FURSAqLworI2RlZmluZSBJS19MQ0tUUklFUyAxNgkJCS8qIEhvdyBtYW55IHRpbWVzIHRvIHRyeSB0byBnZXQgbG9jayAqLworI2RlZmluZSBJS19MQ0tTTEVFUCAxCQkJLyogSG93IGxvbmcgdG8gc2xlZXAgYmV0d2VlbiB0cmllcyAqLworI2RlZmluZSBJS19MT0NLRklMRSAiaWtzZC5sY2siCQkvKiBEQiBsb2NrZmlsZW5hbWUgKGluIHN5c3RlbXJvb3QpICovCisjZGVmaW5lIElLX0RCQVNFRklMICJpa3NkLmRiIgkJLyogRGF0YWJhc2UgZmlsZW5hbWUgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogSUtTREIgKi8KKyNlbmRpZiAvKiBOT0lLU0RCICovCisjZW5kaWYgLyogSUtTRCAqLworLyoKKyAgU3Vic3RpdHV0ZXMgZm9yIHByaW50ZigpIGFuZCBmcmllbmRzIHVzZWQgaW4gSUtTIHRvIGNvbXBlbnNhdGUgZm9yCisgIGxhY2sgb2YgYSB0ZXJtaW5hbCBkcml2ZXIsIG1haW5seSB0byBzdXBwbHkgQ1IgYWZ0ZXIgTEYuCisqLworI2lmbmRlZiBOT1BSSU5URlNVQlNUCisjaWZkZWYgTUFDCisvKgorICogVGhlIE1BQyBkb2Vzbid0IHVzZSBzdGFuZGFyZCBzdGRpbyByb3V0aW5lcy4KKyAqLworI3VuZGVmIGdldGNoYXIKKyNkZWZpbmUgZ2V0Y2hhcigpICAgbWFjX2dldGNoYXIoKQorI3VuZGVmIHB1dGNoYXIKKyNkZWZpbmUgcHV0Y2hhcihjKQltYWNfcHV0Y2hhcihjKQorI2RlZmluZSBwcmludGYJCW1hY19wcmludGYKKyNkZWZpbmUgcGVycm9yCQltYWNfcGVycm9yCisjZGVmaW5lIHB1dHMJCW1hY19wdXRzCitleHRlcm4gaW50IG1hY19wdXRjaGFyIChpbnQgYyk7CitleHRlcm4gaW50IG1hY19wdXRzIChjb25zdCBjaGFyICpzdHJpbmcpOworZXh0ZXJuIGludCBtYWNfcHJpbnRmKGNvbnN0IGNoYXIgKiwgLi4uKTsKK2V4dGVybiBpbnQgbWFjX2dldGNoYXIgKHZvaWQpOworI2VuZGlmIC8qIE1BQyAqLworCisjaWZkZWYgT1MyCisjZGVmaW5lIHByaW50ZiBWc2NybnByaW50ZgorI2RlZmluZSBmcHJpbnRmIFZzY3JuZnByaW50ZgorZXh0ZXJuIGludCBWc2NybnByaW50Zihjb25zdCBjaGFyICosIC4uLik7CitleHRlcm4gaW50IFZzY3JucHJpbnR3KGNvbnN0IGNoYXIgKiwgLi4uKTsKK2V4dGVybiBpbnQgVnNjcm5mcHJpbnRmKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pOworI2lmZGVmIHB1dGNoYXIKKyN1bmRlZiBwdXRjaGFyCisjZW5kaWYgLyogcHV0Y2hhciAqLworI2RlZmluZSBwdXRjaGFyKHgpIFZzY3JucHJpbnRmKCIlYyIseCkKKyNkZWZpbmUgcGVycm9yKHgpICBWc2NybnBlcnJvcih4KQorI2VuZGlmIC8qIE9TMiAqLworCisjaWZuZGVmIENLV0FSVF9DCisjaWZkZWYgVU5JWAorI2lmbmRlZiBwZHAxMQorI2lmbmRlZiBDS1hQUklOVEYKKyNkZWZpbmUgQ0tYUFJJTlRGCisjZW5kaWYgLyogQ0tYUFJJTlRGICovCisjZW5kaWYgLyogcGRwMTEgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogQ0tXQVJUX0MgKi8KKyNlbmRpZiAvKiBOT1BSSU5URlNVQlNUICovCisKKyNpZmRlZiBDS1hQUklOVEYKKyNkZWZpbmUgcHJpbnRmIGNreHByaW50ZgorI2RlZmluZSBmcHJpbnRmIGNreGZwcmludGYKKyNpZmRlZiBDS19BTlNJQworX1BST1RPVFlQKGludCBja3hwcmludGYsKGNvbnN0IGNoYXIgKiwgLi4uKSk7CisjaWZkZWYgTkVYVAorX1BST1RPVFlQKHZvaWQgY2t4cGVycm9yLChjb25zdCBjaGFyICopKTsKKyNlbHNlCisjaWZkZWYgQ0tfU0NPVjUKK19QUk9UT1RZUCh2b2lkIGNreHBlcnJvciwoY29uc3QgY2hhciAqKSk7CisjZWxzZQorX1BST1RPVFlQKGludCBja3hwZXJyb3IsKGNvbnN0IGNoYXIgKikpOworI2VuZGlmIC8qIENLX1NDT1Y1ICovCisjZW5kaWYgLyogTkVYVCAqLworX1BST1RPVFlQKGludCBja3hmcHJpbnRmLChGSUxFICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyNpZmRlZiBwdXRjaGFyCisjdW5kZWYgcHV0Y2hhcgorI2VuZGlmIC8qIHB1dGNoYXIgKi8KKyNkZWZpbmUgcHV0Y2hhcih4KSBja3hwcmludGYoIiVjIix4KQorI2lmZGVmIHB1dGMKKyN1bmRlZiBwdXRjCisjZW5kaWYgLyogcHV0YyAqLworI2RlZmluZSBwdXRjKGEsYikgY2t4ZnByaW50ZihiLCIlYyIsYSkKKyNkZWZpbmUgcGVycm9yKHgpICBja3hwZXJyb3IoeCkKKyNlbmRpZiAvKiBDS1hQUklOVEYgKi8KKworLyoKKyAgQWx0b3Mtc3BlY2lmaWMgaXRlbXM6IDQ4NiwgNTg2LCA5ODYgbW9kZWxzLi4uCisqLworI2lmZGVmIEE5ODYKKyNkZWZpbmUgTV9WT0lECisjZGVmaW5lIHZvaWQgaW50CisjZGVmaW5lIENIQVIgY2hhcgorI2RlZmluZSBTSUdfSQorI2VuZGlmIC8qIEE5ODYgKi8KKworLyogU2lnbmFsIGhhbmRsaW5nICovCisKKyNpZmRlZiBRTlgKKyNpZm5kZWYgQ0tfUE9TSVhfU0lHCisjZGVmaW5lIENLX1BPU0lYX1NJRworI2VuZGlmIC8qIENLX1BPU0lYX1NJRyAqLworI2VuZGlmIC8qIFFOWCAqLworCisvKiBWb2lkIHR5cGUgKi8KKworI2lmbmRlZiBWT0lECQkJCS8qIFVzZWQgdGhyb3VnaG91dCBhbGwgQy1LZXJtaXQgKi8KKyNpZmRlZiBDS19BTlNJQwkJCQkvKiBtb2R1bGVzLi4uICovCisjZGVmaW5lIFZPSUQgdm9pZAorI2Vsc2UKKyNkZWZpbmUgVk9JRCBpbnQKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworI2VuZGlmIC8qIFZPSUQgKi8KKworLyogQ29uc3QgdHlwZSAqLworCisjaWZuZGVmIENPTlNUCisjaWZkZWYgT1NLCisjaWZkZWYgX1VDQworI2RlZmluZSBDT05TVCBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ09OU1QKKyNlbmRpZiAvKiBfVUNDICovCisjZWxzZSAgLyogIU9TSyAqLworI2lmZGVmIENLX1NDTzMyVjQKKyNkZWZpbmUgQ09OU1QKKyNlbHNlCisjaWZkZWYgQ0tfQU5TSUMKKyNkZWZpbmUgQ09OU1QgY29uc3QKKyNlbHNlCisjZGVmaW5lIENPTlNUCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyNlbmRpZiAvKiBDS19TQ08zMlY0ICovCisjZW5kaWYgLyogT1NLICovCisjZW5kaWYgLyogQ09OU1QgKi8KKworLyogU2lnbmFsIHR5cGUgKi8KKworI2lmbmRlZiBTSUdfVgkJCQkvKiBzaWduYWwoKSB0eXBlLCBpZiBub3QgZGVmJ2QgeWV0ICovCisjaWZuZGVmIFNJR19JCisjaWZkZWYgT1MyCisjZGVmaW5lIFNJR19WCisjZWxzZQorI2lmZGVmIFBPU0lYCisjZGVmaW5lIFNJR19WCisjZWxzZQorI2lmZGVmIFNWUjMJCQkJLyogU3lzdGVtIFYgUjMgYW5kIGxhdGVyICovCisjZGVmaW5lIFNJR19WCisjZWxzZQorI2lmZGVmIFNVTk9TNAkJCQkvKiBTVU5PUyBWIDQuMCBhbmQgbGF0ZXIgKi8KKyNpZm5kZWYgc3VuMzg2CisjZGVmaW5lIFNJR19WCisjZWxzZQorI2RlZmluZSBTSUdfSQorI2VuZGlmIC8qIHN1bjM4NiAqLworI2Vsc2UKKyNpZmRlZiBORVhUCQkJCS8qIE5lWFQgKi8KKyNkZWZpbmUgU0lHX1YKKyNlbHNlCisjaWZkZWYgQUlYMzcwCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZGVmaW5lIFNJR19WCisjZGVmaW5lIFNJR1RZUCBfX1NJR1ZPSUQJCS8qIEFJWDM3MCAqLworI2Vsc2UKKyNpZmRlZiBTVFJBVFVTCQkJCS8qIFN0cmF0dXMgVk9TICovCisjZGVmaW5lIFNJR19WCisjZWxzZQorI2lmZGVmIE1BQworI2RlZmluZSBTSUdUWVAgbG9uZworI2RlZmluZSBTSUdfSQorI2lmbmRlZiBNUFczMworI2RlZmluZSBTSUdfSUdOIDAKKyNlbmRpZiAvKiBNUFczMyAqLworI2RlZmluZSBTSUdBTFJNIDEKKyNpZm5kZWYgTVBXMzMKKyNkZWZpbmUgU0lHSU5UICAyCisjZW5kaWYgLyogTVBXMzMgKi8KKyNlbHNlIC8qIEV2ZXJ5dGhpbmcgZWxzZSAqLworI2RlZmluZSBTSUdfSQorI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBBSVgzNzAgKi8KKyNlbmRpZiAvKiBORVhUICovCisjZW5kaWYgLyogU1VOT1M0ICovCisjZW5kaWYgLyogU1ZSMyAqLworI2VuZGlmIC8qIFBPU0lYICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogU0lHX0kgKi8KKyNlbmRpZiAvKiBTSUdfViAqLworCisjaWZkZWYgU0lHX0kKKyNkZWZpbmUgU0lHUkVUVVJOIHJldHVybigwKQorI2lmbmRlZiBTSUdUWVAKKyNkZWZpbmUgU0lHVFlQIGludAorI2VuZGlmIC8qIFNJR1RZUCAqLworI2VuZGlmIC8qIFNJR19JICovCisKKyNpZmRlZiBTSUdfVgorI2RlZmluZSBTSUdSRVRVUk4gcmV0dXJuCisjaWZuZGVmIFNJR1RZUAorI2RlZmluZSBTSUdUWVAgdm9pZAorI2VuZGlmIC8qIFNJR1RZUCAqLworI2VuZGlmIC8qIFNJR19WICovCisKKyNpZmRlZiBOVAorI2lmbmRlZiBTSUdUWVAKKyNkZWZpbmUgU0lHVFlQIHZvaWQKKyNlbmRpZiAvKiBTSUdUWVAgKi8KKyNlbmRpZiAvKiBOVCAqLworCisjaWZuZGVmIFNJR1RZUAorI2RlZmluZSBTSUdUWVAgaW50CisjZW5kaWYgLyogU0lHVFlQICovCisKKyNpZm5kZWYgU0lHUkVUVVJOCisjZGVmaW5lIFNJR1JFVFVSTiByZXR1cm4oMCkKKyNlbmRpZiAvKiBTSUdSRVRVUk4gKi8KKworI2lmZGVmIENLTlRTSUcKKy8qIFRoaXMgZG9lcyBub3Qgd29yaywgc28gZG9uJ3QgdXNlIGl0LiAqLworI2RlZmluZSBzaWduYWwgY2tudHNpZ25hbAorU0lHVFlQICgqY2tudHNpZ25hbChpbnQgdHlwZSwgU0lHVFlQICgqKShpbnQpKSkoaW50KTsKKyNlbmRpZiAvKiBDS05UU0lHICovCisKKy8qIFdlIHdhbnQgYWxsIGNoYXJhY3RlcnMgdG8gYmUgdW5zaWduZWQgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGl0ICovCisKKyNpZmRlZiBLVUkKKyNpZmRlZiBDSEFSCisjdW5kZWYgQ0hBUgorI2VuZGlmIC8qIENIQVIgKi8KKyNkZWZpbmUgQ0hBUiB1bnNpZ25lZCBjaGFyCisjZWxzZQorI2lmZGVmIFBST1ZYMQordHlwZWRlZiBjaGFyIENIQVI7CisvKiB0eXBlZGVmIGxvbmcgTE9ORzsgKi8KK3R5cGVkZWYgaW50IHZvaWQ7CisjZWxzZQorI2lmZGVmIE1JTklYCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQ0hBUjsKKyNlbHNlCisjaWZkZWYgVjcKK3R5cGVkZWYgY2hhciBDSEFSOworI2Vsc2UKKyNpZmRlZiBDNzAKK3R5cGVkZWYgY2hhciBDSEFSOworLyogdHlwZWRlZiBsb25nIExPTkc7ICovCisjZWxzZQorI2lmZGVmIEJTRDI5Cit0eXBlZGVmIGNoYXIgQ0hBUjsKKy8qIHR5cGVkZWYgbG9uZyBMT05HOyAqLworI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorI2RlZmluZSBDSEFSIHVuc2lnbmVkIGNoYXIJCQkvKiAzLjIyIGNvbXBpbGVyICovCisjZWxzZQorI2lmZGVmIEhQVVgKKyNkZWZpbmUgQ0hBUiB1bnNpZ25lZCBjaGFyCisjZWxzZQorI2lmZGVmIE9TMgorI2lmZGVmIE5UCisjZGVmaW5lIENIQVIgdW5zaWduZWQgY2hhcgorI2Vsc2UgLyogTlQgKi8KKyNpZmRlZiBDSEFSCisjdW5kZWYgQ0hBUgorI2VuZGlmIC8qIENIQVIgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBDSEFSOworI2VuZGlmIC8qIE5UICovCisjZWxzZSAvKiBPUzIgKi8KKyNpZmRlZiBWTVMKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBDSEFSOworI2Vsc2UKKyNpZmRlZiBDSEFSCisjdW5kZWYgQ0hBUgorI2VuZGlmIC8qIENIQVIgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBDSEFSOworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIEhQVVggKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIEJTRDI5ICovCisjZW5kaWYgLyogQzcwICovCisjZW5kaWYgLyogVjcgKi8KKyNlbmRpZiAvKiBNSU5JWCAqLworI2VuZGlmIC8qIFBST1ZYMSAqLworI2VuZGlmIC8qIEtVSSAqLworCit1bmlvbiBja19zaG9ydCB7CQkJLyogTWFpbmx5IGZvciBVbmljb2RlICovCisgICAgVVNIT1JUIHhfc2hvcnQ7CisgICAgQ0hBUiB4X2NoYXJbMl07Cit9OworCisjaWZkZWYgTUFDCQkJCS8qIE1hY2ludG9zaCBmaWxlIHJvdXRpbmVzICovCisjaWZuZGVmIENLV0FSVF9DCQkJLyogQnV0IG5vdCBpbiAid2FydCIuLi4gKi8KKyNpZmRlZiBmZW9mCisjdW5kZWYgZmVvZgorI2VuZGlmIC8qIGZlb2YgKi8KKyNkZWZpbmUgZmVvZiBtYWNfZmVvZgorI2RlZmluZSByZXdpbmQgbWFjX3Jld2luZAorI2RlZmluZSBmZ2V0cyBtYWNfZmdldHMKKyNkZWZpbmUgZm9wZW4gbWFjX2ZvcGVuCisjZGVmaW5lIGZjbG9zZSBtYWNfZmNsb3NlCitpbnQgbWFjX2Zlb2YoKTsKK3ZvaWQgbWFjX3Jld2luZCgpOworY2hhciAqbWFjX2ZnZXRzKCk7CitGSUxFICptYWNfZm9wZW4oKTsKK2ludCBtYWNfZmNsb3NlKCk7CisjZW5kaWYgLyogQ0tDUFJPX1cgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKy8qCisgICBTeXN0ZW1zIHdob3NlIG1haW5saW5lIG1vZHVsZXMgaGF2ZSBhY2Nlc3MgdG8gdGhlIGNvbW11bmljYXRpb24tbGluZQorICAgZmlsZSBkZXNjcmlwdG9yLCB0dHlmZC4KKyovCisjaWZuZGVmIENLX1RUWUZECisjaWZkZWYgVU5JWAorI2RlZmluZSBDS19UVFlGRAorI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgQ0tfVFRZRkQKKyNlbHNlCisjaWZkZWYgVk1TCisjZGVmaW5lIENLX1RUWUZECisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIENLX1RUWUZEICovCisKKy8qIFN5c3RlbXMgd2hlcmUgd2UgY2FuIGdldCBvdXIgb3duIHByb2Nlc3MgSUQgKi8KKworI2lmbmRlZiBDS19QSUQKKyNpZmRlZiBVTklYCisjZGVmaW5lIENLX1BJRAorI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBPUzIKKyNkZWZpbmUgQ0tfUElECisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgVk1TCisjZGVmaW5lIENLX1BJRAorI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIENLX1BJRCAqLworCisvKiBTeXN0ZW1zIHRoYXQgc3VwcG9ydCB0aGUgTWljcm9zb2Z0IFRlbGVwaG9ueSBBUEkgKFRBUEkpICovCisKKyNpZm5kZWYgTk9ESUFMCisjaWZuZGVmIENLX1RBUEkKKyNpZmRlZiBOVAorI2RlZmluZSBDS19UQVBJCisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBDS19UQVBJICovCisjZW5kaWYgLyogTk9ESUFMICovCisKKyNpZm5kZWYgTk9OWlhQQU5ECisjaWZuZGVmIE5aWFBBTkQKKyNpZmRlZiBPUzJPUlVOSVgKKyNkZWZpbmUgTlpYUEFORAorI2Vsc2UKKyNpZmRlZiBWTVMKKyNkZWZpbmUgTlpYUEFORAorI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorI2RlZmluZSBOWlhQQU5ECisjZWxzZQorI2lmZGVmIE9TSworI2RlZmluZSBOWlhQQU5ECisjZW5kaWYgLyogT1NLICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyNlbmRpZiAvKiBOWlhQQU5EICovCisjZWxzZQorI2lmZGVmIE5aWFBBTkQKKyN1bmRlZiBOWlhQQU5ECisjZW5kaWYgLyogTlpYUEFORCAqLworI2VuZGlmIC8qIE5PTlpYUEFORCAqLworCisvKiBuenhwYW5kKCkgb3B0aW9uIGZsYWdzICovCisKKyNkZWZpbmUgWlhfRklMT05MWSAgIDEJCQkvKiBNYXRjaCBvbmx5IHJlZ3VsYXIgZmlsZXMgKi8KKyNkZWZpbmUgWlhfRElST05MWSAgIDIJCQkvKiBNYXRjaCBvbmx5IGRpcmVjdG9yaWVzICovCisjZGVmaW5lIFpYX1JFQ1VSU0UgICA0CQkJLyogRGVzY2VuZCB0aHJvdWdoIGRpcmVjdG9yeSB0cmVlICovCisjZGVmaW5lIFpYX01BVENIRE9UICA4CQkJLyogTWF0Y2ggImRvdCBmaWxlcyIgKi8KKyNkZWZpbmUgWlhfTk9CQUNLVVAgMTYJCQkvKiBEb24ndCBtYXRjaCAiYmFja3VwIGZpbGVzIiAqLworI2RlZmluZSBaWF9OT0xJTktTICAzMgkJCS8qIERvbid0IGZvbGxvdyBzeW1saW5rcyAqLworCisjaWZuZGVmIE5aWFBBTkQKKyNkZWZpbmUgbnp4cGFuZChhLGIpIHp4cGFuZChhKQorI2VuZGlmIC8qIE5aWFBBTkQgKi8KKworI2lmbmRlZiBOT1pYUkVXSU5ECisjaWZuZGVmIFpYUkVXSU5ECQkJLyogUGxhdGZvcm1zIHRoYXQgaGF2ZSB6eHJld2luZCgpICovCisjaWZkZWYgT1MyT1JVTklYCisjZGVmaW5lIFpYUkVXSU5ECisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBaWFJFV0lORAorI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorI2RlZmluZSBaWFJFV0lORAorI2Vsc2UKKyNpZmRlZiBPU0sKKyNkZWZpbmUgWlhSRVdJTkQKKyNlbHNlCisjaWZkZWYgU1RSQVRVUworI2RlZmluZSBaWFJFV0lORAorI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworI2VuZGlmIC8qIFpYUkVXSU5EICovCisjZWxzZQorI2lmZGVmIFpYUkVXSU5ECisjdW5kZWYgWlhSRVdJTkQKKyNlbmRpZiAvKiBaWFJFV0lORCAqLworI2VuZGlmIC8qIE5PWlhSRVdJTkQgKi8KKworLyogVGVtcG9yYXJ5LWRpcmVjdG9yeS1mb3ItUkVDRUlWRSBmZWF0dXJlIC4uLiAqLworLyogVGhpcyBzYXlzIHdoZXRoZXIgd2UgaGF2ZSB0aGUgaXNkaXIoKSBmdW5jdGlvbiBkZWZpbmVkLiAqLworCisjaWZkZWYgVU5JWAkJCQkvKiBVTklYIGhhcyBpdCAqLworI2lmbmRlZiBDS19UTVBESVIKKyNpZm5kZWYgcGRwMTEKKyNkZWZpbmUgQ0tfVE1QRElSCisjZGVmaW5lIFRNUERJUkxFTiAyNTYKKyNlbmRpZiAvKiBwZHAxMSAqLworI2VuZGlmIC8qIENLX1RNUERJUiAqLworI2VuZGlmIC8qIFVOSVggKi8KKworI2lmZGVmIFZNUwkJCQkvKiBWTVMgdG9vICovCisjaWZuZGVmIENLX1RNUERJUgorI2RlZmluZSBDS19UTVBESVIKKyNkZWZpbmUgVE1QRElSTEVOIDI1NgorI2VuZGlmIC8qIENLX1RNUERJUiAqLworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgT1MyCQkJCS8qIE9TIHR3byB0b28gKi8KKyNpZm5kZWYgQ0tfVE1QRElSCisjZGVmaW5lIENLX1RNUERJUgorI2RlZmluZSBUTVBESVJMRU4gMTI5CisjZW5kaWYgLyogQ0tfVE1QRElSICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBTVFJBVFVTCQkJCS8qIFN0cmF0dXMgVk9TIHRvby4gKi8KKyNpZm5kZWYgQ0tfVE1QRElSCisjZGVmaW5lIENLX1RNUERJUgorI2RlZmluZSBUTVBESVJMRU4gMjU2CisjZW5kaWYgLyogQ0tfVE1QRElSICovCisjZW5kaWYgLyogU1RSQVRVUyAqLworCisjaWZkZWYgT1NLCQkJCS8qIE9TLTkgdG9vICovCisjaWZuZGVmIENLX1RNUERJUgorI2RlZmluZSBDS19UTVBESVIKKyNkZWZpbmUgVE1QRElSTEVOIDI1NgorI2VuZGlmIC8qIENLX1RNUERJUiAqLworI2VuZGlmIC8qIE9TSyAqLworCisjaWZkZWYgZGF0YWdlbmVyYWwJCQkvKiBBT1MvVlMgdG9vICovCisjaWZuZGVmIENLX1RNUERJUgorI2RlZmluZSBDS19UTVBESVIKKyNkZWZpbmUgVE1QRElSTEVOIDI1NgorI2VuZGlmIC8qIENLX1RNUERJUiAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisKKyNpZmRlZiBDS19UTVBESVIJCQkvKiBOZWVkcyBjb21tYW5kIHBhcnNlciAqLworI2lmZGVmIE5PSUNQCisjdW5kZWYgQ0tfVE1QRElSCisjZW5kaWYgLyogTk9JQ1AgKi8KKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKworLyogV2hldGhlciB0byBpbmNsdWRlIDxzeXMvdGltZS5oPiAqLworCisjaWZuZGVmIE5PVElNRUgJCQkJLyogPHRpbWUuaD4gKi8KKyNpZm5kZWYgVElNRUgKKyNkZWZpbmUgVElNRUgKKyNlbmRpZiAvKiBUSU1FSCAqLworI2VuZGlmIC8qIE5PVElNRUggKi8KKworI2lmbmRlZiBOT1NZU1RJTUVICQkJLyogPHN5cy90aW1lLmg+ICovCisjaWZuZGVmIFNZU1RJTUVICisjaWZkZWYgVU5JWAkJCQkvKiBVTklYICovCisjaWZkZWYgU1ZPUlBPU0lYCQkJLyogU3lzdGVtIFYgb3IgUE9TSVguLi4gKi8KKyNpZmRlZiBNX1VOSVgKKyNkZWZpbmUgU1lTVElNRUgKKyNlbHNlCisjaWZkZWYgU0NPXzMyVjQKKyNkZWZpbmUgU1lTVElNRUgKKyNlbHNlCisjaWZkZWYgT1hPUworI2RlZmluZSBTWVNUSU1FSAorI2Vsc2UKKyNpZmRlZiBCU0Q0NAorI2RlZmluZSBTWVNUSU1FSAorI2Vsc2UKKyNpZmRlZiBfX2xpbnV4X18KKyNkZWZpbmUgU1lTVElNRUgKKyNlbHNlCisjaWZkZWYgQUlYUlMKKyNpZm5kZWYgQUlYNDEKKyNkZWZpbmUgU1lTVElNRUgKKyNlbmRpZiAvKiBBSVg0MSAqLworI2Vsc2UKKyNpZmRlZiBJUklYNjAKKyNkZWZpbmUgU1lTVElNRUgKKyNlbHNlCisjaWZkZWYgSTM4NklYCisjZGVmaW5lIFNZU1RJTUVICisjZWxzZQorI2lmZGVmIFNWNjhSM1Y2CisjZGVmaW5lIFNZU1RJTUVICisjZW5kaWYgLyogU1Y2OFIzVjYgKi8KKyNlbmRpZiAvKiBJMzg2SVggKi8KKyNlbmRpZiAvKiBJUklYNjAgKi8KKyNlbmRpZiAvKiBBSVhSUyAqLworI2VuZGlmIC8qIF9fbGludXhfXyAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisjZW5kaWYgLyogT1hPUyAqLworI2VuZGlmIC8qIFNDT18zMlY0ICovCisjZW5kaWYgLyogTV9VTklYICovCisKKyNlbHNlICAvKiBOb3QgU1ZPUlBPU0lYICovCisKKyNpZm5kZWYgQkVMTFYxMAkJCQkvKiBBbGwgYnV0IHRoZXNlLi4uICovCisjaWZuZGVmIFBST1ZYMQorI2lmbmRlZiBWNworI2lmbmRlZiBCU0Q0MQorI2lmbmRlZiBDT0hFUkVOVAorI2RlZmluZSBTWVNUSU1FSAorI2VuZGlmIC8qIENPSEVSRU5UICovCisjZW5kaWYgLyogQlNENDEgKi8KKyNlbmRpZiAvKiBWNyAqLworI2VuZGlmIC8qIFBST1ZYMSAqLworI2VuZGlmIC8qIEJFTExWMTAgKi8KKyNlbmRpZiAvKiBTVk9SUE9TSVggKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogU1lTVElNRUggKi8KKyNlbmRpZiAvKiBOT1NZU1RJTUVIICovCisKKyNpZm5kZWYgTk9TWVNUSU1FQkgJCQkvKiA8c3lzL3RpbWViLmg+ICovCisjaWZuZGVmIFNZU1RJTUVCSAorI2lmZGVmIE9TRgorI2RlZmluZSBTWVNUSU1FQkgKKyNlbHNlCisjaWZkZWYgQ09IRVJFTlQKKyNkZWZpbmUgU1lTVElNRUJICisjZWxzZQorI2lmZGVmIEJTRDQxCisjZGVmaW5lIFNZU1RJTUVCSAorI2Vsc2UKKyNpZmRlZiBCU0QyOQorI2RlZmluZSBTWVNUSU1FQkgKKyNlbHNlCisjaWZkZWYgVE9XRVIxCisjZGVmaW5lIFNZU1RJTUVCSAorI2Vsc2UKKyNpZmRlZiBGVDIxCisjZGVmaW5lIFNZU1RJTUVCSAorI2Vsc2UKKyNpZmRlZiBCRUxMVjEwCisjZGVmaW5lIFNZU1RJTUVCSAorI2VuZGlmIC8qIEJFTExWMTAgKi8KKyNlbmRpZiAvKiBGVDIxICovCisjZW5kaWYgLyogVE9XRVIxICovCisjZW5kaWYgLyogQlNEMjkgKi8KKyNlbmRpZiAvKiBCU0Q0MSAqLworI2VuZGlmIC8qIENPSEVSRU5UICovCisjZW5kaWYgLyogT1NGICovCisjZW5kaWYgLyogU1lTVElNRUJIICovCisjZW5kaWYgLyogTk9TWVNUSU1FQkggKi8KKworLyoKKyBEZWJ1ZyBhbmQgdHJhbnNhY3Rpb24gbG9nZ2luZyBpcyBpbmNsdWRlZCBhdXRvbWF0aWNhbGx5IHVubGVzcyB5b3UgZGVmaW5lCisgTk9ERUJVRyBvciBOT1RMT0cuICBEbyB0aGlzIGlmIHlvdSB3YW50IHRvIHNhdmUgdGhlIHNwYWNlIGFuZCBvdmVyaGVhZC4KKyAoTm90ZSwgaW4gdmVyc2lvbiA0RiB0aGVzZSBkZWZpbml0aW9ucyBjaGFuZ2VkIGZyb20gInt9IiB0byB0aGUgbnVsbCBzdHJpbmcKKyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHNlbWljb2xvbnMgYWZ0ZXIgYnJhY2VzLCBhcyBpbjogImlmICh4KSB0bG9nKHRoaXMpOworIGVsc2UgdGxvZyh0aGF0KTsiCisqLworI2lmbmRlZiBOT0RFQlVHCisjaWZuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHCisjZW5kaWYgLyogREVCVUcgKi8KKyNlbHNlCisjaWZkZWYgREVCVUcKKyN1bmRlZiBERUJVRworI2VuZGlmIC8qIERFQlVHICovCisjZW5kaWYgLyogTk9ERUJVRyAqLworCisjaWZkZWYgTk9UTE9HCisjaWZkZWYgVExPRworI3VuZGVmIFRMT0cKKyNlbmRpZiAvKiBUTE9HICovCisjZWxzZSAgLyogTk9UTE9HICovCisjaWZuZGVmIFRMT0cKKyNkZWZpbmUgVExPRworI2VuZGlmIC8qIFRMT0cgKi8KKyNlbmRpZiAvKiBOT1RMT0cgKi8KKworLyogZGVidWcoKSBtYWNybyBzdHlsZSBzZWxlY3Rpb24uICovCisKKyNpZmRlZiBWTVMKKyNpZm5kZWYgSUZERUJVRworI2RlZmluZSBJRkRFQlVHCisjZW5kaWYgLyogSUZERUJVRyAqLworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgTUFDCisjaWZuZGVmIElGREVCVUcKKyNkZWZpbmUgSUZERUJVRworI2VuZGlmIC8qIElGREVCVUcgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKworI2lmZGVmIE9TMgorI2lmbmRlZiBJRkRFQlVHCisjZGVmaW5lIElGREVCVUcKKyNlbmRpZiAvKiBJRkRFQlVHICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBPWE9TCQkJCS8qIHRzdCBpcyBmYXN0ZXIgdGhhbiBqc3IgKi8KKyNpZm5kZWYgSUZERUJVRworI2RlZmluZSBJRkRFQlVHCisjZW5kaWYgLyogSUZERUJVRyAqLworI2VuZGlmIC8qIE9YT1MgKi8KKworI2lmbmRlZiBDS0NNQUkKK2V4dGVybiBpbnQgZGVibG9nOworZXh0ZXJuIGludCBkZWJvazsKK2V4dGVybiBpbnQgZGVieGxlbjsKK2V4dGVybiBpbnQgbWF0Y2hkb3Q7CitleHRlcm4gaW50IHR0X2JlbGw7CisjZW5kaWYgLyogQ0tDTUFJICovCisKKyNpZmRlZiBPUzIKK19QUk9UT1RZUCggdm9pZCBibGVlcCwgKHNob3J0KSApOworI2Vsc2UgLyogT1MyICovCisjZGVmaW5lIGJsZWVwKHgpIGlmKHR0X2JlbGwpcHV0Y2hhcignXDA3JykKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBCRU9TT1JCRUJPWAorI2lmZGVmIEJFQk9YCQkJCS8qIFRoaXMgd2FzIHVzZWQgb25seSBmb3IgRFI3ICovCisjZGVmaW5lIEJFT1NPUkJFQk9YCisjZWxzZQorI2lmZGVmIEJFT1MJCQkJLyogVGhpcyBpcyB1c2VkIGZvciBCZU9TIDQueCAqLworI2RlZmluZSBCRU9TT1JCRUJPWAorI2VuZGlmIC8qIEJFT1MgKi8KKyNlbmRpZiAvKiBCRUJPWCAqLworI2VuZGlmIC8qIEJFT1NPUkJFQk9YICovCisKKyNpZmRlZiBOT0lDUAorI2lmZGVmIFRMT0cKKyN1bmRlZiBUTE9HCisjZW5kaWYgLyogVExPRyAqLworI2VuZGlmIC8qIE5PSUNQICovCisKKyNpZm5kZWYgVExPRworI2RlZmluZSB0bG9nKGEsYixjLGQpCisjZWxzZQorI2lmbmRlZiBDS0NNQUkKKy8qIERlYnVnZ2luZyBpbmNsdWRlZC4gIERlY2xhcmUgZGVidWcgbG9nIGZsYWcgaW4gbWFpbiBwcm9ncmFtIG9ubHkuICovCitleHRlcm4gaW50IHRyYWxvZywgdGxvZ2ZtdDsKKyNlbmRpZiAvKiBDS0NNQUkgKi8KK19QUk9UT1RZUChWT0lEIGRvdGxvZywoaW50LCBjaGFyICosIGNoYXIgKiwgbG9uZykpOworI2RlZmluZSB0bG9nKGEsYixjLGQpIGlmICh0cmFsb2cgJiYgdGxvZ2ZtdCkgZG90bG9nKGEsYixjLGQpCitfUFJPVE9UWVAoVk9JRCBkb3hsb2csKGludCwgY2hhciAqLCBsb25nLCBpbnQsIGludCwgY2hhciAqKSk7CisjZW5kaWYgLyogVExPRyAqLworCisvKiBGb3JtYXRzIGZvciBkZWJ1ZygpIGFuZCB0bG9nKCkgKi8KKworI2RlZmluZSBGMDAwIDAKKyNkZWZpbmUgRjAwMSAxCisjZGVmaW5lIEYwMTAgMgorI2RlZmluZSBGMDExIDMKKyNkZWZpbmUgRjEwMCA0CisjZGVmaW5lIEYxMDEgNQorI2RlZmluZSBGMTEwIDYKKyNkZWZpbmUgRjExMSA3CisKKyNpZmRlZiBfX2xpbnV4X18KKyNpZm5kZWYgTElOVVgKKyNkZWZpbmUgTElOVVgKKyNlbmRpZiAvKiBMSU5VWCAqLworI2VuZGlmIC8qIF9fbGludXhfXyAqLworCisvKiBQbGF0Zm9ybXMgd2hlcmUgc21hbGwgc2l6ZSBpcyBuZWVkZWQgKi8KKworI2lmZGVmIHBkcDExCisjZGVmaW5lIENLX1NNQUxMCisjZW5kaWYgLyogcGRwMTEgKi8KKworLyogQ2FuIHdlIHVzZSByZWFscGF0aCgpPyAqLworCisjaWZuZGVmIE5PUkVBTFBBVEgKKyNpZmRlZiBwZHAxMQorI2RlZmluZSBOT1JFQUxQQVRICisjZW5kaWYgLyogcGRwMTEgKi8KKyNlbmRpZiAvKiBOT1JFQUxQQVRIICovCisKKyNpZm5kZWYgTk9SRUFMUEFUSAorI2lmZGVmIFVOSVgKKyNpZmRlZiBIUFVYNQorI2RlZmluZSBOT1JFQUxQQVRICisjZWxzZQorI2lmZGVmIEhQVVg2CisjZGVmaW5lIE5PUkVBTFBBVEgKKyNlbHNlCisjaWZkZWYgSFBVWDcKKyNkZWZpbmUgTk9SRUFMUEFUSAorI2Vsc2UKKyNpZmRlZiBIUFVYOAorI2RlZmluZSBOT1JFQUxQQVRICisjZWxzZQorI2lmZGVmIFNWNjhSM1Y2CisjZGVmaW5lIE5PUkVBTFBBVEgKKyNlbHNlCisjaWZkZWYgWEVOSVgKKyNkZWZpbmUgTk9SRUFMUEFUSAorI2Vsc2UKKyNpZmRlZiBDS19TQ08zMlY0CisjZGVmaW5lIE5PUkVBTFBBVEgKKyNlbHNlCisjaWZkZWYgQ0tfU0NPVjUKKyNkZWZpbmUgTk9SRUFMUEFUSAorI2Vsc2UKKyNpZmRlZiBPU0YzMgorI2RlZmluZSBOT1JFQUxQQVRICisjZWxzZQorI2lmZGVmIE9TRjMwCisjZGVmaW5lIE5PUkVBTFBBVEgKKyNlbHNlCisjaWZkZWYgdWx0cml4CisjZGVmaW5lIE5PUkVBTFBBVEgKKyNlbHNlCisjaWZkZWYgQ09IRVJFTlQKKyNkZWZpbmUgTk9SRUFMUEFUSAorI2VuZGlmIC8qIENPSEVSRU5UICovCisjZW5kaWYgLyogdWx0cml4ICovCisjZW5kaWYgLyogT1NGMzAgKi8KKyNlbmRpZiAvKiBPU0YzMiAqLworI2VuZGlmIC8qIENLX1NDT1Y1ICovCisjZW5kaWYgLyogQ0tfU0NPMzJWNCAqLworI2VuZGlmIC8qIFhFTklYICovCisjZW5kaWYgLyogU1Y2OFIzVjYgKi8KKyNlbmRpZiAvKiBIUFVYOCAqLworI2VuZGlmIC8qIEhQVVg3ICovCisjZW5kaWYgLyogSFBVWDYgKi8KKyNlbmRpZiAvKiBIUFVYNSAqLworI2VuZGlmIC8qIE5PUkVBTFBBVEggKi8KKworI2lmbmRlZiBOT1JFQUxQQVRICisjaWZuZGVmIENLUkVBTFBBVEgKKyNkZWZpbmUgQ0tSRUFMUEFUSAorI2VuZGlmIC8qIE5PUkVBTFBBVEggKi8KKyNlbmRpZiAvKiBDS1JFQUxQQVRIICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZkZWYgQ0tSRUFMUEFUSAorI2lmZGVmIE9TMk9SVU5JWAorI2lmbmRlZiBDS1JPT1QKKyNkZWZpbmUgQ0tST09UCisjZW5kaWYgLyogQ0tST09UICovCisjZW5kaWYgLyogT1MyT1JVTklYICovCisjZW5kaWYgLyogQ0tSRUFMUEFUSCAqLworCisvKiBDS1NZTUxJTksgc2hvdWxkIGJlIHNldCBvbmx5IGlmIHdlIGNhbiB1c2UgcmVhZGxpbmsoKSAqLworCisjaWZkZWYgVU5JWAorI2lmbmRlZiBOT1NZTUxJTksKKyNpZm5kZWYgQ0tTWU1MSU5LCisjZGVmaW5lIENLU1lNTElOSworI2VuZGlmIC8qIE5PU1lNTElOSyAqLworI2VuZGlmIC8qIENLU1lNTElOSyAqLworI2VuZGlmIC8qIFVOSVggKi8KKworLyogUGxhdGZvcm1zIHdoZXJlIHdlIGNhbiB1c2UgbHN0YXQoKSBpbnN0ZWFkIG9mIHN0YXQoKSAoZm9yIHN5bWxpbmtzKSAqLworLyogVGhpcyBzaG91bGQgYmUgc2V0IG9ubHkgaWYgYm90aCBsc3RhdCgpIGFuZCByZWFkbGluaygpIGFyZSBhdmFpbGFibGUgKi8KKworI2lmbmRlZiBOT0xTVEFUCisjaWZuZGVmIE5PU1lNTElOSworI2lmbmRlZiBVU0VfTFNUQVQKKyNpZmRlZiBVTklYCisjaWZkZWYgQ0tTWU1MSU5LCisjaWZkZWYgU1ZSNAkJCQkvKiBTVlI0IGhhcyBsc3RhdCgpICovCisjZGVmaW5lIFVTRV9MU1RBVAorI2Vsc2UKKyNpZmRlZiBCU0Q0MgkJCQkvKiA0LjJCU0QgYW5kIDQuM0JTRCBoYXZlIGl0ICovCisjZGVmaW5lIFVTRV9MU1RBVAkJCS8qIFRoaXMgc2hvdWxkIGluY2x1ZGUgb2xkIEhQVVhzICovCisjZWxzZQorI2lmZGVmIEJTRDQ0CQkJCS8qIDQuNEJTRCBoYXMgaXQgKi8KKyNkZWZpbmUgVVNFX0xTVEFUCisjZWxzZQorI2lmZGVmIExJTlVYCQkJCS8qIExJTlVYIGhhcyBpdCAqLworI2RlZmluZSBVU0VfTFNUQVQKKyNlbHNlCisjaWZkZWYgU1VOT1M0CQkJCS8qIFN1bk9TIGhhcyBpdCAqLworI2RlZmluZSBVU0VfTFNUQVQKKyNlbmRpZiAvKiBTVU5PUzQgKi8KKyNlbmRpZiAvKiBMSU5VWCAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisjZW5kaWYgLyogQlNENDIgKi8KKyNlbmRpZiAvKiBTVlI0ICovCisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIFVTRV9MU1RBVCAqLworI2VuZGlmIC8qIE5PU1lNTElOSyAqLworI2VuZGlmIC8qIE5PTFNUQVQgKi8KKworI2lmZGVmIE5PTFNUQVQKKyNpZmRlZiBVU0VfTFNUQVQKKyN1bmRlZiBVU0VfTFNUQVQKKyNlbmRpZiAvKiBVU0VfTFNUQVQgKi8KKyNlbmRpZiAvKiBOT0xTVEFUICovCisKKyNpZm5kZWYgTk9UVFlMT0NLCQkJLyogVU5JWCBzeXN0ZW1zIHRoYXQgaGF2ZSB0dHlsb2NrKCkgKi8KKyNpZm5kZWYgVVNFVFRZTE9DSworI2lmZGVmIEFJWFJTCQkJCS8qIEFJWCAzLjEgYW5kIGxhdGVyICovCisjZGVmaW5lIFVTRVRUWUxPQ0sKKyNlbHNlCisjaWZkZWYgVVNFX1VVX0xPQ0sJCQkvKiBGcmVlQlNEIG9yIG90aGVyIHdpdGggdXVfbG9jaygpICovCisjZGVmaW5lIFVTRVRUWUxPQ0sKKyNlbHNlCisjaWZkZWYgSEFWRV9CQVVEQk9ZCQkJLyogUmVkIEhhdCBMaW51eCA+PSA3LjIgKi8KKyNkZWZpbmUgVVNFVFRZTE9DSworI2VuZGlmIC8qIEhBVkVfQkFVREJPWSAqLworI2VuZGlmIC8qIFVTRV9VVV9MT0NLICovCisjZW5kaWYgLyogQUlYUlMgKi8KKyNlbmRpZiAvKiBVU0VUVFlMT0NLICovCisjZW5kaWYgLyogTk9UVFlMT0NLICovCisKKy8qIEtlcm1pdCBmZWF0dXJlIHNlbGVjdGlvbiAqLworCisjaWZuZGVmIE5PU1BMCisjaWZuZGVmIE5PQ0hBTk5FTElPCQkJLyogQ2hhbm5lbC1iYXNlZCBmaWxlIGkvbyBwYWNrYWdlICovCisjaWZuZGVmIENLQ0hBTk5FTElPCisjaWZkZWYgVU5JWAorI2RlZmluZSBDS0NIQU5ORUxJTworI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgQ0tDSEFOTkVMSU8KKyNlbHNlCisjaWZkZWYgVk1TCisjZGVmaW5lIENLQ0hBTk5FTElPCisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKyNkZWZpbmUgQ0tDSEFOTkVMSU8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIENLQ0hBTk5FTElPICovCisjZW5kaWYgLyogTk9DSEFOTkVMSU8gKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PQ0tFWEVDCQkJLyogRVhFQyBjb21tYW5kICovCisjaWZuZGVmIE5PUFVTSAorI2lmbmRlZiBDS0VYRUMKKyNpZmRlZiBVTklYCQkJCS8qIFVOSVggY2FuIGRvIGl0ICovCisjZGVmaW5lIENLRVhFQworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBDS0VYRUMgKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNlbmRpZiAvKiBOT0NLRVhFQyAqLworCisjaWZuZGVmIE5PRkFTVAkJCQkvKiBGYXN0IEtlcm1pdCBwcm90b2NvbCBieSBkZWZhdWx0ICovCisjaWZuZGVmIENLX0ZBU1QKKyNpZmRlZiBVTklYCisjZGVmaW5lIENLX0ZBU1QKKyNlbHNlCisjaWZkZWYgVk1TCisjZGVmaW5lIENLX0ZBU1QKKyNlbHNlCisjaWZkZWYgT1MyCisjZGVmaW5lIENLX0ZBU1QKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogQ0tfRkFTVCAqLworI2VuZGlmIC8qIE5PRkFTVCAqLworCisjaWZkZWYgVU5JWAkJCQkvKiBUcmFuc3BhcmVudCBwcmludCAqLworI2lmbmRlZiBOT1hQUklOVAorI2lmbmRlZiBYUFJJTlQKKyNkZWZpbmUgWFBSSU5UCisjZW5kaWYgLyogWFBSSU5UICovCisjZW5kaWYgLyogTk9YUFJJTlQgKi8KKyNlbmRpZiAvKiBVTklYICovCisKKyNpZm5kZWYgTk9IV1BBUklUWQkJCS8qIEhhcmR3YXJlIHBhcml0eSAqLworI2lmbmRlZiBIV1BBUklUWQorI2lmZGVmIFNWT1JQT1NJWAkJCS8qIFN5c3RlbSBWIG9yIFBPU0lYIGNhbiBoYXZlIGl0ICovCisjZGVmaW5lIEhXUEFSSVRZCisjZWxzZQorI2lmZGVmIFNVTk9TNDEJCQkJLyogU3VuT1MgNC4xIGNhbiBoYXZlIGl0ICovCisjZGVmaW5lIEhXUEFSSVRZCisjZWxzZQorI2lmZGVmIE9TMgkJCQkvKiBLOTUgY2FuIGhhdmUgaXQgKi8KKyNkZWZpbmUgSFdQQVJJVFkKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBTVU5PUzQxICovCisjZW5kaWYgLyogU1ZPUlBPU0lYICovCisjZW5kaWYgLyogSFdQQVJJVFkgKi8KKyNlbmRpZiAvKiBOT0hXUEFSSVRZICovCisKKyNpZm5kZWYgTk9TVE9QQklUUwkJCS8qIFN0b3AtYml0IHNlbGVjdGlvbiAqLworI2lmbmRlZiBTVE9QQklUUworI2lmZGVmIE9TMk9SVU5JWAorLyogSW4gVW5peCByZWFsbHkgdGhpcyBzaG91bGQgb25seSBiZSBpZiBDU1RPUEIgaXMgZGVmaW5lZC4gKi8KKy8qIEJ1dCB3ZSBkb24ndCBrbm93IHRoYXQgeWV0LiAqLworI2RlZmluZSBTVE9QQklUUworI2Vsc2UKKyNpZmRlZiBUTl9DT01QT1JUCisjZGVmaW5lIFNUT1BCSVRTCisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworI2VuZGlmIC8qIFNUT1BCSVRTICovCisjZW5kaWYgLyogTk9TVE9QQklUUyAqLworCisjaWZkZWYgVU5JWAorI2lmbmRlZiBORVRDTUQJCQkJLyogQ2FuIFNFVCBORVRXT1JLIFRZUEUgQ09NTUFORCAqLworI2RlZmluZSBORVRDTUQKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNlbmRpZiAvKiBVTklYICovCisKKy8qIFB0eSBzdXBwb3J0LCBub25wb3J0YWJsZSwgYXZhaWxhYmxlIG9uIGEgY2FzZS1ieS1jYXNlIGJhc2lzICovCisKKyNpZm5kZWYgTk9QVFkKKyNpZmRlZiBORVhUCQkJCS8qIE5lWFRTVEVQICh0ZXN0ZWQgb24gMy4xKSovCisjZGVmaW5lIE5FVFBUWQorI2Vsc2UKKyNpZmRlZiBDS19TQ09WNQkJCQkvKiBTQ08gT1NSNSAodGVzdGVkIG9uIDUuMC41KSovCisjZGVmaW5lIE5FVFBUWQorI2Vsc2UKKyNpZmRlZiBRTlgJCQkJLyogUU5YICh0ZXN0ZWQgb24gNC4yNSkgKi8KKyNkZWZpbmUgTkVUUFRZCisjZWxzZQorI2lmZGVmIFNJTklYICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpbml4ICh0ZXN0ZWQgb24gNS40MikgKi8KKyNkZWZpbmUgTkVUUFRZCisjZWxzZQorI2lmZGVmIERHVVg1NDAJCQkJLyogREcvVVggNS40KysgKHRlc3RlZCBvbiA1LjRSNC4xMSkgKi8KKyNkZWZpbmUgTkVUUFRZCisjZWxzZQorI2lmZGVmIE9TRjMyCQkJCS8qIERpZ2l0YWwgVW5peCAzLjIgKi8KKyNkZWZpbmUgTkVUUFRZCisjZWxzZQorI2lmZGVmIE9TRjQwCQkJCS8qIERpZ2l0YWwgVW5peCA0LjAgLyBUcnU2NCAqLworI2RlZmluZSBORVRQVFkKKyNlbHNlCisjaWZkZWYgSVJJWDYwCQkJCS8qIElSSVggNi4wIChub3QgZWFybGllcikgKi8KKyNkZWZpbmUgTkVUUFRZCisjZWxzZQorI2lmZGVmIEhQVVgxMAkJCQkvKiBIUFVYIDEwLjAwIG9yIGxhdGVyICovCisjZGVmaW5lIE5FVFBUWQorI2lmbmRlZiBIQVZFX1BUWVRSQVAKKyNkZWZpbmUgSEFWRV9QVFlUUkFQCisjZW5kaWYgLyogSEFWRV9QVFlUUkFQICovCisjZWxzZQorI2lmZGVmIEhQVVg5CQkJCS8qIEhQVVggOS4wMCAobm90IGVhcmxpZXIpICovCisjZGVmaW5lIE5FVFBUWQorI2lmbmRlZiBIQVZFX1BUWVRSQVAKKyNkZWZpbmUgSEFWRV9QVFlUUkFQCisjZW5kaWYgLyogSEFWRV9QVFlUUkFQICovCisjZWxzZQorI2lmZGVmIEJTRDQ0CQkJCS8qIEJTRDQ0LCB7TmV0LEZyZWUsT3Blbn1CU0QgKi8KKyNkZWZpbmUgTkVUUFRZCisjZWxzZQorI2lmZGVmIEJTREkJCQkJLyogQlNESS9PUyAodGVzdGVkIGluIDQpICovCisjZGVmaW5lIE5FVFBUWQorI2Vsc2UKKyNpZmRlZiBTT0xBUklTCQkJCS8qIFNvbGFyaXMgKHRlc3RlZCBpbiAyLjUpICovCisjZGVmaW5lIE5FVFBUWQorI2Vsc2UKKyNpZmRlZiBVVzcJCQkJLyogVW5peHdhcmUgNyAqLworI2RlZmluZSBORVRQVFkKKyNlbHNlCisjaWZkZWYgU1VOT1M0MQkJCQkvKiBTdW5PUyAodGVzdGVkIGluIDQuMS4zKSAqLworI2RlZmluZSBORVRQVFkKKyNlbHNlCisjaWZkZWYgQUlYNDEJCQkJLyogQUlYIDQuMSBhbmQgbGF0ZXIgKi8KKyNkZWZpbmUgTkVUUFRZCisjZWxzZQorI2lmZGVmIExJTlVYCQkJCS8qIExpbnV4ICovCisjZGVmaW5lIE5FVFBUWQorI2VuZGlmIC8qIExJTlVYICovCisjZW5kaWYgLyogQUlYNDEgKi8KKyNlbmRpZiAvKiBTVU5PUzQxICovCisjZW5kaWYgLyogVVc3ICovCisjZW5kaWYgLyogU09MQVJJUyAqLworI2VuZGlmIC8qIEJTREkgKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworI2VuZGlmIC8qIEhQVVg5ICovCisjZW5kaWYgLyogSFBVWDEwICovCisjZW5kaWYgLyogSVJJWDYwICovCisjZW5kaWYgLyogT1NGNDAgKi8KKyNlbmRpZiAvKiBPU0YzMiAqLworI2VuZGlmIC8qIERHVVg1NDAgKi8KKyNlbmRpZiAvKiBTSU5JWCAqLworI2VuZGlmIC8qIFFOWCAqLworI2VuZGlmIC8qIENLX1NDT1Y1ICovCisjZW5kaWYgLyogTkVYVCAqLworCisjZWxzZSAvKiBOT1BUWSAqLworCisjaWZkZWYgTkVUUFRZCisjdW5kZWYgTkVUUFRZCisjZW5kaWYgLyogTkVUUFRZICovCisjZW5kaWYgLyogTk9QVFkgKi8KKworI2lmZGVmIE5FVFBUWSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVENNRCByZXF1aXJlZCBmb3IgTkVUUFRZICovCisjaWZuZGVmIE5FVENNRAorI2RlZmluZSBORVRDTUQKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNlbmRpZiAvKiBORVRQVFkgKi8KKworI2lmbmRlZiBDS19VVFNOQU1FCQkJLyogQ2FuIHdlIGNhbGwgdW5hbWUoKT8gKi8KKyNpZmRlZiBWTVMKKyNkZWZpbmUgQ0tfVVRTTkFNRQorI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgQ0tfVVRTTkFNRQorI2Vsc2UKKyNpZmRlZiBQT1NJWAkJCQkvKiBJdCdzIGluIFBPU0lYLjEgKi8KKyNkZWZpbmUgQ0tfVVRTTkFNRQorI2Vsc2UKKyNpZmRlZiBTVU5PUzQxCQkJCS8qIEl0J3MgaW4gU3VuT1MgNC4xICovCisjZGVmaW5lIENLX1VUU05BTUUKKyNlbHNlCisjaWZkZWYgQUlYUlMJCQkJLyogSXQncyBpbiBBSVggKi8KKyNkZWZpbmUgQ0tfVVRTTkFNRQorI2Vsc2UKKyNpZmRlZiBTVlI0CQkJCS8qIEl0J3MgaW4gU1ZSNCAoYnV0IG5vdCBTVlIzKSAqLworI2RlZmluZSBDS19VVFNOQU1FCisjZWxzZQorI2lmZGVmIEhQVVgJCQkJLyogSXQncyBpbiBIUC1VWCA1LjAwIGFuZCBsYXRlciAqLworI2RlZmluZSBDS19VVFNOQU1FCisjZWxzZQorI2lmZGVmIE9TRgkJCQkvKiBJdCdzIGluIE9TRi8xIC8gRGlnaXRhbCBVTklYICovCisjZGVmaW5lIENLX1VUU05BTUUKKyNlbHNlCisjaWZkZWYgQ0tfU0NPVjUKKyNkZWZpbmUgQ0tfVVRTTkFNRQorI2VuZGlmIC8qIENLX1NDT1Y1ICovCisjZW5kaWYgLyogT1NGICovCisjZW5kaWYgLyogSFBVWCAqLworI2VuZGlmIC8qIFNWUjQgKi8KKyNlbmRpZiAvKiBBSVhSUyAqLworI2VuZGlmIC8qIFNVTk9TNDEgKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIENLX1VUU05BTUUgKi8KKworLyogVGhpcyBzZWN0aW9uIGZvciBhbnl0aGluZyB0aGF0IG1pZ2h0IHVzZSBmbG9hdGluZy1wb2ludCAqLworCisvKiBJZiB0aGUgZm9sbG93aW5nIGNhdXNlcyB0cm91YmxlIHVzZSAtREZMT0FUPWZsb2F0IG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KKworI2lmZGVmIE5PU1BMCisjaWZkZWYgRk5GTE9BVAorI3VuZGVmIEZORkxPQVQKKyNlbmRpZiAvKiBGTkZMT0FUICovCisjaWZkZWYgQ0tGTE9BVAorI3VuZGVmIENLRkxPQVQKKyNlbmRpZiAvKiBDS0ZMT0FUICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT0ZMT0FUCisKKyNpZm5kZWYgQ0tGTE9BVAorI2lmZGVmIF9fYWxwaGEKKy8qIERvbid0IHVzZSBkb3VibGUgb24gNjQtYml0IHBsYXRmb3JtcyAtLSBiYWQgdGhpbmdzIGhhcHBlbiAqLworI2RlZmluZSBDS0ZMT0FUIGZsb2F0CisjZGVmaW5lIENLRkxPQVRfUyAiZmxvYXQiCisjZWxzZQorI2RlZmluZSBDS0ZMT0FUIGRvdWJsZQorI2RlZmluZSBDS0ZMT0FUX1MgImRvdWJsZSIKKyNlbmRpZiAvKiBfX2FscGhhICovCisjZW5kaWYgLyogQ0tGTE9BVCAqLworCisjaWZuZGVmIE5PR0ZUSU1FUgkJCS8qIEZsb2F0aW5nLXBvaW50IHRpbWVycyAqLworI2lmbmRlZiBHRlRJTUVSCisjaWZkZWYgVU5JWAkJCQkvKiBGb3IgVU5JWCAqLworI2RlZmluZSBHRlRJTUVSCisjZW5kaWYgLyogVU5JWCAqLworI2lmZGVmIFZNUwkJCQkvKiBWTVMgKi8KKyNpZm5kZWYgT0xEX1ZNUwkJCQkvKiA1LjAgYW5kIGxhdGVyICovCisjZGVmaW5lIEdGVElNRVIKKyNlbmRpZiAvKiBPTERfVk1TICovCisjZW5kaWYgLyogVk1TICovCisjaWZkZWYgT1MyCQkJCS8qIEFuZCBLOTUgKi8KKyNkZWZpbmUgR0ZUSU1FUgorI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIFNUUkFUVVMJCQkJLyogQW5kIFN0cmF0dXMgVk9TICovCisjZGVmaW5lIEdGVElNRVIKKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogR0ZUSU1FUiAqLworI2VuZGlmIC8qIE5PR0ZUSU1FUiAqLworCisjaWZuZGVmIE5PU1BMCisjaWZuZGVmIEZORkxPQVQJCQkJLyogRmxvYXRpbmctcG9pbnQgbWF0aCBmdW5jdGlvbnMgKi8KKyNpZmRlZiBWTVMJCQkJLyogZGVmaW5lZCBieSBkZWZhdWx0IGluIFZNUyAqLworI2RlZmluZSBGTkZMT0FUCisjZWxzZQorI2lmZGVmIE9TMgkJCQkvKiBhbmQgSzk1ICovCisjZGVmaW5lIEZORkxPQVQKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBGTkZMT0FUICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2Vsc2UgIC8qIE5PRkxPQVQgaXMgZGVmaW5lZCAqLworCisjaWZkZWYgQ0tGTE9BVAorI3VuZGVmIENLRkxPQVQKKyNlbmRpZiAvKiBDS0ZMT0FUICovCisKKyNpZmRlZiBHRlRJTUVSCisjdW5kZWYgR0ZUSU1FUgorI2VuZGlmIC8qIEdGVElNRVIgKi8KKworI2lmZGVmIEZORkxPQVQKKyN1bmRlZiBGTkZMT0FUCisjZW5kaWYgLyogRk5GTE9BVCAqLworCisjZW5kaWYgLyogTk9GTE9BVCAqLworCisjaWZkZWYgR0ZUSU1FUgkJCQkvKiBGcmFjdGlvbiBvZiBzZWNvbmQgdG8gdXNlIHdoZW4gKi8KKyNpZm5kZWYgR0ZNSU5USU1FCQkJLyogZWxhcHNlZCB0aW1lIGlzIDw9IDAgKi8KKyNkZWZpbmUgR0ZNSU5USU1FIDAuMDA1CisjZW5kaWYgLyogR0ZNSU5USU1FICovCisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisjaWZuZGVmIENLQ01BSQorZXh0ZXJuIGxvbmcgenRtc2VjLCB6dHVzZWM7CQkvKiBGcmFjdGlvbiBvZiBzZWMgb2YgY3VycmVudCB0aW1lICovCisjZW5kaWYgLyogQ0tDTUFJICovCisKKyNpZm5kZWYgTk9VTlBSRUZJWFpFUk8JCQkvKiBBbGxvdyB1bnByZWZpeGluZyBvZiAgTlVMICgwKSAqLworI2lmbmRlZiBVTlBSRUZJWFpFUk8JCQkvKiBpbiBmaWxlLXRyYW5zZmVyIHBhY2tldHMgKi8KKyNkZWZpbmUgVU5QUkVGSVhaRVJPCisjZW5kaWYgLyogVU5QUkVGSVhaRVJPICovCisjZW5kaWYgLyogTk9VTlBSRUZJWFpFUk8gKi8KKworI2lmZGVmIENLX1NNQUxMCisjZGVmaW5lIE5PQ0FMCQkJCS8qIENhbGlicmF0ZSAqLworI2VuZGlmIC8qIENLX1NNQUxMICovCisKKyNpZm5kZWYgTk9QQVRURVJOUwkJCS8qIEZpbGV0eXBlIG1hdGNoaW5nIHBhdHRlcm5zICovCisjaWZuZGVmIFBBVFRFUk5TCisjaWZuZGVmIFZNUworI2lmbmRlZiBDS19TTUFMTAorI2RlZmluZSBQQVRURVJOUworI2VuZGlmIC8qIENLX1NNQUxMICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyNlbmRpZiAvKiBOT1BBVFRFUk5TICovCisKKyNpZm5kZWYgTk9DQUwKKyNpZm5kZWYgQ0FMSUJSQVRFCisjZGVmaW5lIENBTElCUkFURQorI2VuZGlmIC8qIENBTElCUkFURSAqLworI2Vsc2UKKyNpZmRlZiBDQUxJQlJBVEUKKyN1bmRlZiBDQUxJQlJBVEUKKyNlbmRpZiAvKiBDQUxJQlJBVEUgKi8KKyNlbmRpZiAvKiBOT0NBTCAqLworCisjaWZuZGVmIE5PUkVDVVJTRQkJCS8qIFJlY3Vyc2l2ZSBkaXJlY3RvcnkgdHJhdmVyc2FsICovCisjaWZuZGVmIFJFQ1VSU0lWRQorI2lmZGVmIFZNUworI2RlZmluZSBSRUNVUlNJVkUKKyNlbHNlCisjaWZkZWYgT1MyT1JVTklYCisjaWZuZGVmIENLX1NNQUxMCisjZGVmaW5lIFJFQ1VSU0lWRQorI2VuZGlmIC8qIENLX1NNQUxMICovCisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKyNkZWZpbmUgUkVDVVJTSVZFCisjZWxzZQorI2lmZGVmIE9TSworI2RlZmluZSBSRUNVUlNJVkUKKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogT1MyT1JVTklYICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogUkVDVVJTSVZFICovCisjZW5kaWYgLyogTk9SRUNVUlNFICovCisKKyNpZm5kZWYgQ0tfU01BTEwJCQkvKiBFbmFibGUgZmlsZS10cmFuc2ZlciB0dW5pbmcgY29kZSAqLworI2lmbmRlZiBDS1RVTklORwkJCS8qIGluIHdoaWNoIG1vcmUgY29kZSBpcyBhZGRlZCAqLworI2lmbmRlZiBOT1RVTklORwkJCS8qIHRvIGF2b2lkIGZ1bmN0aW9uIGNhbGxzLCBldGMgKi8KKyNkZWZpbmUgQ0tUVU5JTkcKKyNlbmRpZiAvKiBOT1RVTklORyAqLworI2VuZGlmIC8qIENLVFVOSU5HICovCisjZW5kaWYgLyogQ0tfU01BTEwgKi8KKworI2lmbmRlZiBOT1VSTAkJCQkvKiBQYXJzZSBVUkxzIGluIFNFVCBIT1NULCBldGMgKi8KKyNkZWZpbmUgQ0tfVVJMCisjZGVmaW5lIE5PX0ZUUF9BVVRIICAgICAgICAgICAgICAgICAgICAgLyogTm8gYXV0aCAiZnRwIiAvICJhbm9ueW1vdXMiICovCisjZW5kaWYgLyogTk9VUkwgKi8KKworI2lmbmRlZiBOT1RSSUdHRVIKKyNpZm5kZWYgQ0tfVFJJR0dFUgkJCS8qIFRyaWdnZXIgc3RyaW5nIHRvIGV4aXQgQ09OTkVDVCAqLworI2lmZGVmIE9TMk9SVU5JWAkJCS8qIE9LIGZvciBVTklYIGFuZCBLOTUgKi8KKyNkZWZpbmUgQ0tfVFJJR0dFUgorI2Vsc2UKKyNpZmRlZiBWTVMJCQkJLyogYW5kIFZNUyAqLworI2RlZmluZSBDS19UUklHR0VSCisjZWxzZQorI2lmZGVmIGRhdGFnZW5lcmFsCQkJLyogYW5kIEFPUy9WUyAqLworI2RlZmluZSBDS19UUklHR0VSCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBDS19UUklHR0VSICovCisjZW5kaWYgLyogTk9UUklHR0VSICovCisKKyNpZmRlZiBDS19UUklHR0VSCisjZGVmaW5lIFRSSUdHRVJTIDgJCQkvKiBIb3cgbWFueSB0cmlnZ2VycyBhbGxvd2VkICovCisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworCisjaWZuZGVmIFhMSU1JVFMJCQkJLyogQ09OTkVDVCBsaW1pdHMgKi8KKyNpZmRlZiBPUzIKKyNkZWZpbmUgWExJTUlUUworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFhMSU1JVFMgKi8KKworI2lmZGVmIE5PRlJJTExTCisjaWZuZGVmIE5PQlJPV1NFUgorI2RlZmluZSBOT0JST1dTRVIKKyNlbmRpZiAvKiBOT0JST1dTRVIgKi8KKyNpZm5kZWYgTk9GVFAKKyNkZWZpbmUgTk9GVFAKKyNlbmRpZiAvKiBOT0ZUUCAqLworI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyNpZm5kZWYgTk9IVFRQCQkJCS8qIEhUVFAgZmVhdHVyZXMgbmVlZC4uLiAqLworI2lmZGVmIE5PSUNQCQkJCS8qIGFuIGludGVyYWN0aXZlIGNvbW1hbmQgcGFyc2VyICovCisjZGVmaW5lIE5PSFRUUAorI2VuZGlmIC8qIE5PSUNQICovCisjaWZuZGVmIFZNUworI2lmbmRlZiBPUzJPUlVOSVgJCQkvKiBLOTUgb3IgVU5JWCAoYmVjYXVzZSBvZiAqLworI2RlZmluZSBOT0hUVFAJCQkJLyogdGltZSBmdW5jdGlvbnMsIHRpbWVfdCwgZXRjKSAqLworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE5PSFRUUCAqLworCisKKyNpZm5kZWYgTk9ORVQKKyNpZmRlZiBUQ1BTT0NLRVQKKworLyogVGhlIEhUVFAgY29kZSBpcyBub3QgdmVyeSBwb3J0YWJsZSwgc28gaXQgbXVzdCBiZSBhc2tlZCBmb3Igd2l0aCAtRENLSFRUUCAqLworCisjaWZuZGVmIE5PSFRUUAorI2lmbmRlZiBDS0hUVFAKKyNpZmRlZiBTVU5PUzQJCQkJLyogV2UgY2FuIHVzZSBpdCBpbiBTdW5PUyAqLworI2RlZmluZSBDS0hUVFAKKyNlbmRpZiAvKiBTVU5PUzQgKi8KKyNpZmRlZiBTT0xBUklTCQkJCS8qIEFuZCBpbiBTb2xhcmlzICovCisjZGVmaW5lIENLSFRUUAorI2VuZGlmIC8qIFNPTEFSSVMgKi8KKyNpZmRlZiBMSU5VWAkJCQkvKiBBbmQgTGludXggKi8KKyNkZWZpbmUgQ0tIVFRQCisjZW5kaWYgLyogTElOVVggKi8KKyNpZmRlZiBIUFVYMTAJCQkJLyogQW5kIEhQLVVYIDEwIGFuZCBhYm92ZSAqLworI2RlZmluZSBDS0hUVFAKKyNlbmRpZiAvKiBIUFVYMTAgKi8KKyNpZmRlZiBPUzIJCQkJLyogQW5kIGluIEstOTUgKi8KKyNkZWZpbmUgQ0tIVFRQCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgQUlYNDEJCQkJLyogSW4gQUlYIDQuMSBhbmQgaGlnaGVyICovCisjZGVmaW5lIENLSFRUUAorI2VuZGlmIC8qIEFJWDQxICovCisjaWZkZWYgVU5JWFdBUkUJCQkJLyogSW4gVW5peHdhcmUgMi4xIGFuZCBoaWdoZXIgKi8KKyNkZWZpbmUgQ0tIVFRQCQkJCS8qIGFuZCBwcm9iYWJseSBhbHNvIGluIDEueCBhbmQgMi4wICovCisjZW5kaWYgLyogVU5JWFdBUkUgKi8KKyNpZmRlZiBDS19TQ09WNQorI2RlZmluZSBDS0hUVFAKKyNlbmRpZiAvKiBDS19TQ09WNSAqLworI2lmZGVmIE9TRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFuZCBpbiBPU0YgRGlnaXRhbCBVTklYL1RydWUgNjQgKi8KKyNkZWZpbmUgQ0tIVFRQCisjZW5kaWYgLyogT1NGICovCisjaWZkZWYgdWx0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW5kIGluIFVsdHJpeCBNaXBzICovCisjaWZkZWYgbWlwcworI2RlZmluZSBDS0hUVFAKKyNlbmRpZiAvKiBtaXBzICovCisjZW5kaWYgLyogdWx0cml4ICovCisvKiBBZGQgbW9yZSBoZXJlLi4uICovCisjZW5kaWYgLyogQ0tIVFRQICovCisjaWZuZGVmIENLSFRUUAkJCQkvKiBJZiBDS0hUVFAgbm90IGRlZmluZWQgeWV0ICovCisjZGVmaW5lIE5PSFRUUAkJCQkvKiB0aGVuIGRlZmluZSBIT0hUVFAgKi8KKyNlbmRpZiAvKiBDS0hUVFAgKi8KKyNlbmRpZiAvKiBOT0hUVFAgKi8KKworI2lmZGVmIE5FVENPTk4JCQkJLyogU3BlY2lhbCAibmV0d29yayIgdHlwZXMuLi4gKi8KKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorI2lmbmRlZiBORVRGSUxFCisjZGVmaW5lIE5FVEZJTEUKKyNlbmRpZiAvKiBORVRGSUxFICovCisjaWZuZGVmIE5PUFVTSAorI2lmbmRlZiBORVRDTUQKKyNkZWZpbmUgTkVUQ01ECisjZW5kaWYgLyogTkVUQ01EICovCisjZW5kaWYgLyogTk9QVVNIICovCisjaWZkZWYgTlQKKyNpZm5kZWYgTkVURExMCisjZGVmaW5lIE5FVERMTAorI2VuZGlmIC8qIE5FVERMTCAqLworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmbmRlZiBOT0ZUUAorI2lmbmRlZiBTWVNGVFAKKyNpZm5kZWYgTkVXRlRQCisjaWZkZWYgT1MyT1JVTklYCisjZGVmaW5lIE5FV0ZUUAorI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworI2VuZGlmIC8qIE5FV0ZUUCAqLworI2VuZGlmIC8qIFNZU0ZUUCAqLworI2VuZGlmIC8qIE5PRlRQICovCisKKyNpZm5kZWYgTk9GVFAKKyNpZmRlZiBORVdGVFAKKyNpZmRlZiBTWVNGVFAKKyN1bmRlZiBTWVNGVFAKKyNlbmRpZiAvKiBTWVNGVFAgKi8KKyNlbHNlIC8qIE5FV0ZUUCAqLworI2lmbmRlZiBTWVNGVFAKKyNkZWZpbmUgU1lTRlRQCisjZW5kaWYgLyogU1lTRlRQICovCisjZW5kaWYgLyogTkVXRlRQICovCisjZWxzZSAvKiBOT0ZUUCAqLworI2lmZGVmIE5FV0ZUUAorI3VuZGVmIE5FV0ZUUAorI2VuZGlmIC8qIE5FV0ZUUCAqLworI2lmZGVmIFNZU0ZUUAorI3VuZGVmIFNZU0ZUUAorI2VuZGlmIC8qIFNZU0ZUUCAqLworI2VuZGlmIC8qIE5PRlRQICovCisKKyNpZm5kZWYgTk9CUk9XU0VSCisjaWZkZWYgVU5JWAorI2lmbmRlZiBCUk9XU0VSCisjaWZuZGVmIE5PUFVTSAorI2RlZmluZSBCUk9XU0VSCisjZW5kaWYgLyogTk9QVVNIICovCisjZW5kaWYgLyogQlJPV1NFUiAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBPUzIKKyNpZm5kZWYgQlJPV1NFUgorI2lmbmRlZiBOT1BVU0gKKyNkZWZpbmUgQlJPV1NFUgorI2VuZGlmIC8qIE5PUFVTSCAqLworI2VuZGlmIC8qIEJST1dTRVIgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbHNlCisjaWZkZWYgQlJPV1NFUgorI3VuZGVmIEJST1dTRVIKKyNlbmRpZiAvKiBCUk9XU0VSICovCisjZW5kaWYgLyogTk9CUk9XU0VSICovCisKKyNlbHNlIC8qIFRDUFNPQ0tFVCAqLworI2lmbmRlZiBOT0hUVFAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhUVFAgcmVxdWlyZXMgVENQU09DS0VUICovCisjZGVmaW5lIE5PSFRUUAorI2VuZGlmIC8qIE5PSFRUUCAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2VuZGlmIC8qIE5PTkVUICovCisKKyNpZmRlZiBUQ1BTT0NLRVQKKyNpZm5kZWYgTk9DS0dFVEZRSE9TVAorI2lmZGVmIF9faWE2NF9fCisjZGVmaW5lIE5PQ0tHRVRGUUhPU1QKKyNlbHNlICAvKiBfX2lhNjRfXyAqLworI2lmZGVmIFNWNjgKKyNkZWZpbmUgTk9DS0dFVEZRSE9TVAorI2Vsc2UKKyNpZmRlZiBIUFVYUFJFNjUKKyNkZWZpbmUgTk9DS0dFVEZRSE9TVAorI2VuZGlmIC8qIEhQVVhQUkU2NSAqLworI2VuZGlmIC8qIFNWNjggKi8KKyNlbmRpZiAvKiBfX2lhNjQgKi8KKyNlbmRpZiAvKiBOT0NLR0VURlFIT1NUICovCisvKgorICBSZWdhcmRpbmcgU3lzdGVtIFYvNjggKFNWNjgpIChmcm9tIEdlcnJ5IEJlbGFuZ2VyLCBPY3QgMjAwMik6CisKKyAgICAxKSBUaGUgZ2V0aG9zdGJ5bmFtZSgpIGFwcGVhcnMgdG8gcmV0dXJuIHRoZSBhY3R1YWwgaG9zdCBJUAorICAgICAgIGFkZHJlc3MgaW4gdGhlIGhvc3RlbnQgc3RydWN0LCBpbnN0ZWFkIG9mIHRoZSBleHBlY3RlZCBwb2ludGVyCisgICAgICAgdG8gdGhlIGFkZHJlc3MuIEhlbmNlIHRoZSBib2d1cyBhZGRyZXNzIGluIHRoZSBiY29weS9tZW1jb3B5LgorICAgICAgIFRoaXMgaXMgZGVzcGl0ZSB0aGUgaGVhZGVyIGFncmVlaW5nIHdpdGggb3VyIGV4cGVjdGF0aW9ucy4KKworICAgIDIpIHRoZSBleHBlY3RlZCBhcmd1bWVudCBzd2FwIGJldHdlZW4gYmNvcHkgYW5kIG1lbWNvcHkKKyAgICAgICBkaWQgbm90IGhhcHBlbi4gIFdoYXQgZ3JpZWYgdGhpcyBtaWdodCBjYXVzZSwgSSBrbm93IG5vdC4KKyovCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZmRlZiBUQ1BTT0NLRVQKKyNpZmRlZiBPUzJPTkxZCisjaWZuZGVmIE5PU09DS1MKKyNkZWZpbmUgTk9TT0NLUworI2VuZGlmIC8qIE5PU09DS1MgKi8KKyNlbmRpZiAvKiBPUzJPTkxZICovCisjaWZkZWYgTk9TT0NLUworI2lmZGVmIENLX1NPQ0tTCisjdW5kZWYgQ0tfU09DS1MKKyNlbmRpZiAvKiBDS19TT0NLUyAqLworI2lmZGVmIENLX1NPQ0tTNQorI3VuZGVmIENLX1NPQ0tTNQorI2VuZGlmIC8qIENLX1NPQ0tTNSAqLworI2Vsc2UgLyogTk9TT0NLUyAqLworI2lmZGVmIE5UCisjaWZuZGVmIENLX1NPQ0tTCisjZGVmaW5lIENLX1NPQ0tTCisjZW5kaWYgLyogQ0tfU09DS1MgKi8KKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIENLX1NPQ0tTNQkJCS8qIENLX1NPQ0tTNSBpbXBsaWVzIENLX1NPQ0tTICovCisjaWZuZGVmIENLX1NPQ0tTCisjZGVmaW5lIENLX1NPQ0tTCisjZW5kaWYgLyogQ0tfU09DS1MgKi8KKyNlbmRpZiAvKiBDS19TT0NLUzUgKi8KKyNlbmRpZiAvKiBOT1NPQ0tTICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZmRlZiBUTkNPREUKKyNpZm5kZWYgQ0tfQVVUSEVOVElDQVRJT04KKyNpZmRlZiBPUzIKKyNpZmRlZiBfTV9QUEMKKyNkZWZpbmUgTk9fS0VSQkVST1MKKyNkZWZpbmUgTk9fU1JQCisjZWxzZSAvKiBfTV9QUEMgKi8KKyNpZm5kZWYgTk9fU1NMCisjZGVmaW5lIENLX1NTTAorI2RlZmluZSBTU0xETEwKKyNlbmRpZiAvKiBOT19TU0wgKi8KKyNlbmRpZiAvKiBfTV9QUEMgKi8KKyNpZm5kZWYgTk9fS0VSQkVST1MKKyNkZWZpbmUgQ0tfS0VSQkVST1MKKyNkZWZpbmUgS1JCNAorI2RlZmluZSBLUkI1CisjZGVmaW5lIEtSQjUyNAorI2RlZmluZSBLUkI1MjRfQ09OVgorI2lmZGVmIE5UCisjaWZuZGVmIF9NX1BQQworI2lmbmRlZiBfTV9BTFBIQQorI2lmbmRlZiBOT19TU0xfS1JCNQorI2RlZmluZSBTU0xfS1JCNQorI2VuZGlmIC8qIE5PX1NTTF9LUkI1ICovCisjZW5kaWYgLyogX01fQUxQSEEgKi8KKyNlbmRpZiAvKiBfTV9QUEMgKi8KKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIE5PX0tFUkJFUk9TICovCisjaWZuZGVmIE5PX1NSUAorI2RlZmluZSBDS19TUlAKKyNlbmRpZiAvKiBOT19TUlAgKi8KKyNkZWZpbmUgQ0tfQVVUSEVOVElDQVRJT04KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04JCS8qIEVuY3J5cHRpb24gbXVzdCBoYXZlIEF1dGggKi8KKyNpZm5kZWYgQ0tfRU5DUllQVElPTgorI2lmbmRlZiBOT19FTkNSWVBUSU9OCisjaWZkZWYgT1MyCisjZGVmaW5lIENLX0VOQ1JZUFRJT04KKyNkZWZpbmUgQ0tfREVTCisjZGVmaW5lIENLX0NBU1QKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT19FTkNSWVBUSU9OICovCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisKKyNpZmRlZiBOT19BVVRIRU5USUNBVElPTiAgICAgICAgICAgICAgICAvKiBBbGxvdyBhdXRoZW50aWNhdGlvbiB0byBiZSAqLworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgICAgIC8qIGRpc2FibGVkIGluIE5UIGFuZCBPUy8yICAgICovCisjdW5kZWYgQ0tfQVVUSEVOVElDQVRJT04KKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX0tFUkJFUk9TCisjdW5kZWYgQ0tfS0VSQkVST1MKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2lmZGVmIENLX1NSUAorI3VuZGVmIENLX1NSUAorI2VuZGlmIC8qIENLX1NSUCAqLworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyN1bmRlZiBDS19FTkNSWVBUSU9OCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2VuZGlmIC8qIE5PX0FVVEhFTlRJQ0FUSU9OICovCisKKyNpZmRlZiBOT19FTkNSWVBUSU9OICAgICAgICAgICAgICAgICAgICAvKiBBbGxvdyBlbmNyeXB0aW9uIHRvIGJlICovCisjaWZkZWYgQ0tfRU5DUllQVElPTiAgICAgICAgICAgICAgICAgICAgLyogZGlzYWJsZWQgaW4gTlQgYW5kIE9TLzIgKi8KKyN1bmRlZiBDS19FTkNSWVBUSU9OCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2VuZGlmIC8qIE5PX0VOQ1JZUFRJT04gKi8KKworI2lmZGVmIENLX0tFUkJFUk9TICAgICAgLyogRGlzYWJsZSBmdW5jcyBub3QgeWV0IHN1cHBvcnRlZCB3aXRoIEhlaW1kYWwgKi8KKyNpZmRlZiBLUkI1CisjaWZuZGVmIEhFSU1EQUwKKyNkZWZpbmUgS1JCNV9VMlUKKyNlbmRpZiAvKiBIRUlNREFMICovCisjZW5kaWYgLyogS1JCNSAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKy8qCisgIFNTSCBzZWN0aW9uLiAgTk9TU0ggZGlzYWJsZXMgYW55IGZvcm0gb2YgU1NIIHN1cHBvcnQuCisgIElmIE5PU1NIIGlzIG5vdCBkZWZpbmVkIChvciBpbXBsaWVkIGJ5IE5PTkVULCBOT0xPQ0FMLCBldGMpCisgIHRoZW4gU1NIQlVJTFRJTiBpcyBkZWZpbmVkIGZvciBLOTUgYW5kIFNTSENNRCBpcyBkZWZpbmVkIGZvciBVTklYLgorICBUaGVuLCBpZiBlaXRoZXIgU1NIQlVJTFRJTiBvciBTU0hDTUQgaXMgZGVmaW5lZCwgQU5ZU1NIIGlzIGFsc28gZGVmaW5lZC4KKyovCisKKyNpZm5kZWYgTk9TU0gKKyNpZm5kZWYgTk9fU1NMCisjaWZkZWYgT1MyT05MWQorI2RlZmluZSBOT1NTSAorI2VuZGlmIC8qIE9TMk9OTFkgKi8KKyNpZmRlZiBOVAorI2lmbmRlZiBDS19TU0wKKyNkZWZpbmUgTk9TU0gKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UgLyogTk9fU1NMICovCisjZGVmaW5lIE5PU1NICisjZW5kaWYgLyogTk9fU1NMICovCisjZW5kaWYgLyogTk9TU0ggKi8KKworI2lmZGVmIE5PU1NICQkJCS8qIE5PU1NIICovCisjaWZkZWYgU1NIQlVJTFRJTgkJCS8qIHVuZGVmaW5lcyBhbnkgU1NIIHNlbGN0b3JzICovCisjdW5kZWYgU1NIQlVJTFRJTgorI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKyNpZmRlZiBTRlRQX0JVSUxUSU4KKyN1bmRlZiBTRlRQX0JVSUxUSU4KKyNlbmRpZiAvKiBTRlRQX0JVSUxUSU4gKi8KKyNpZmRlZiBTU0hDTUQKKyN1bmRlZiBTU0hDTUQKKyNlbmRpZiAvKiBTU0hDTUQgKi8KKyNpZmRlZiBBTllTU0gKKyN1bmRlZiBBTllTU0gKKyNlbmRpZiAvKiBBTllTU0ggKi8KKyNlbHNlICAvKiBOb3QgTk9TU0ggKi8KKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorI2lmbmRlZiBTU0hCVUlMVElOCisjZGVmaW5lIFNTSEJVSUxUSU4KKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisjZWxzZSAgLyogTm90IE9TMiAqLworI2lmZGVmIFVOSVgKKyNpZm5kZWYgU1NIQ01ECisjaWZkZWYgTkVUUFRZCisjaWZuZGVmIE5PUFVTSAorI2RlZmluZSBTU0hDTUQKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNlbmRpZiAvKiBORVRQVFkgKi8KKyNlbmRpZiAvKiBTU0hDTUQgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogT1MyICovCisjaWZuZGVmIEFOWVNTSAorI2lmZGVmIFNTSEJVSUxUSU4KKyNkZWZpbmUgQU5ZU1NICisjaWZkZWYgU1NIQ01ECisjdW5kZWYgU1NIQ01ECisjZW5kaWYgLyogU1NIQ01EICovCisjZWxzZSAgLyogU1NIQlVJTFRJTiAqLworI2lmZGVmIFNTSENNRAorI2RlZmluZSBBTllTU0gKKyNlbmRpZiAvKiBTU0hDTUQgKi8KKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisjZW5kaWYgLyogQU5ZU1NIICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworI2VuZGlmIC8qIE5PU1NIICovCisKKy8qIFRoaXMgaXMgaW4gY2FzZSAjaWZkZWYgU1NIIGlzIHVzZWQgYW55d2hlcmUgaW4gdGhlIEs5NSBtb2R1bGVzICovCisKKyNpZmRlZiBPUzIKKyNpZmRlZiBTU0hCVUlMVElOCisjaWZuZGVmIFNTSAorI2RlZmluZSBTU0gKKyNlbmRpZiAvKiBTU0ggKi8KKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorI2RlZmluZSBDS19TRUNVUklUWQorI2Vsc2UKKyNpZmRlZiBDS19TU0wKKyNkZWZpbmUgQ0tfQVVUSEVOVElDQVRJT04KKyNkZWZpbmUgQ0tfU0VDVVJJVFkKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworCisvKiBFbnZpcm9ubWVudCBzdHVmZiAqLworCisjaWZuZGVmIE9TMk9SVU5JWAorI2lmbmRlZiBOT1BVVEVOVgorI2RlZmluZSBOT1BVVEVOVgorI2VuZGlmIC8qIE5PUFVURU5WICovCisjZW5kaWYgLyogT1MyT1JVTklYICovCisKKyNpZm5kZWYgQ0tfRU5WSVJPTk1FTlQKKyNpZmRlZiBPUzIKKyNkZWZpbmUgQ0tfRU5WSVJPTk1FTlQKKyNlbHNlCisjaWZkZWYgVU5JWAorI2RlZmluZSBDS19FTlZJUk9OTUVOVAorI2Vsc2UKKyNpZmRlZiBTVFJBVFVTCisjZGVmaW5lIENLX0VOVklST05NRU5UCisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBDS19FTlZJUk9OTUVOVAorI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogQ0tfRU5WSVJPTk1FTlQgKi8KKyNpZm5kZWYgTk9TTkRMT0MJCQkvKiBSRkMgNzc5IFNFTkQgTE9DQVRJT04gKi8KKyNpZm5kZWYgQ0tfU05ETE9DCisjZGVmaW5lIENLX1NORExPQworI2VuZGlmIC8qIENLX1NORExPQyAqLworI2VuZGlmIC8qIE5PU05ETE9DICovCisjaWZuZGVmIE5PWERJU1BMT0MJCQkvKiBSRkMgMTA5NiBYRElTUExPQyAqLworI2lmbmRlZiBDS19YRElTUExPQworI2RlZmluZSBDS19YRElTUExPQworI2VuZGlmIC8qIENLX1hESVNQTE9DICovCisjZW5kaWYgLyogTk9YRElTUExPQyAqLworI2lmbmRlZiBOT0ZPUldBUkRYCisjaWZuZGVmIE5PUFVURU5WCisjaWZuZGVmIE5PU0VMRUNUCisjaWZuZGVmIENLX0ZPUldBUkRfWAorI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisjaWZuZGVmIE9TMk9OTFkKKyNkZWZpbmUgQ0tfRk9SV0FSRF9YCisjZW5kaWYgLyogT1MyT05MWSAqLworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisjZW5kaWYgLyogQ0tfRk9SV0FSRF9YICovCisjZW5kaWYgLyogTk9TRUxFQ1QgKi8KKyNlbmRpZiAvKiBOT1BVVEVOViAqLworI2VuZGlmIC8qIE5PRk9SV0FSRFggKi8KKyNpZm5kZWYgTk9fQ09NUE9SVAorI2lmZGVmIFRDUFNPQ0tFVAorI2lmbmRlZiBUTl9DT01QT1JUCisjZGVmaW5lIFROX0NPTVBPUlQKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogTk9fQ09NUE9SVCAqLworI2VuZGlmIC8qIFROQ09ERSAqLworCisjaWZuZGVmIE5PWEZFUgorI2lmbmRlZiBOT0NUUkxaCQkJCS8qIEFsbG93IFNFVCBGSUxFIEVPRiBDVFJMLVogKi8KKyNpZm5kZWYgQ0tfQ1RSTFoKKyNpZmRlZiBPUzJPUlVOSVgKKyNkZWZpbmUgQ0tfQ1RSTFoKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyNlbmRpZiAvKiBDS19DVFJMWiAqLworI2VuZGlmIC8qIE5PQ1RSTFogKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1BFUk1TCQkJCS8qIEZpbGUgcGVybWlzc2lvbnMgaW4gQSBwYWNrZXRzICovCisjaWZuZGVmIENLX1BFUk1TCisjaWZkZWYgVU5JWAorI2RlZmluZSBDS19QRVJNUworI2Vsc2UKKyNpZmRlZiBWTVMKKyNkZWZpbmUgQ0tfUEVSTVMKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKyNlbmRpZiAvKiBOT1BFUk1TICovCisjaWZkZWYgQ0tfUEVSTVMKKyNkZWZpbmUgQ0tfUEVSTUxFTiAyNAkJCS8qIE1heCBsZW5ndGggb2Ygc3lzLWRlcGVuZGVudCBwZXJtcyAqLworI2VuZGlmIC8qIENLX1BFUk1TICovCisKKyNpZmRlZiBVTklYCQkJCS8qIE5PU0VUQlVGIGZvciBldmVyeWJvZHkgKi8KKyNpZm5kZWYgTk9TRVRCVUYKKyNpZm5kZWYgVVNFX1NFVEJVRgkJCS8qIFRoaXMgaXMgdGhlIGVzY2FwZSBjbGF1c2UgKi8KKyNkZWZpbmUgTk9TRVRCVUYKKyNlbmRpZiAvKiBVU0VfU0VUQlVGICovCisjZW5kaWYgLyogTk9TRVRCVUYgKi8KKyNlbmRpZiAvKiBVTklYICovCisKKyNpZm5kZWYgVVNFX1NUUkVSUk9SCQkJLyogV2hldGhlciB0byB1c2Ugc3RyZXJyb3IoKSAqLworI2lmZGVmIHBkcDExCisjZGVmaW5lIFVTRV9TVFJFUlJPUgorI2VuZGlmIC8qIHBkcDExICovCisjZW5kaWYgLyogVVNFX1NUUkVSUk9SICovCisKKyNpZmRlZiBWTVMJCQkJLyogRmVhdHVyZXMgZm9yIGFsbCBWTVMgYnVpbGRzICovCisjaWZuZGVmIE5PSkMKKyNkZWZpbmUgTk9KQworI2VuZGlmIC8qIE5PSkMgKi8KKyNpZm5kZWYgTk9TRVRCVUYKKyNkZWZpbmUgTk9TRVRCVUYKKyNlbmRpZiAvKiBOT1NFVEJVRiAqLworI2lmbmRlZiBEWU5BTUlDCisjZGVmaW5lIERZTkFNSUMKKyNlbmRpZiAvKiBEWU5BTUlDICovCisjaWZuZGVmIE5PQ1VSU0VTCisjaWZuZGVmIENLX0NVUlNFUworI2RlZmluZSBDS19DVVJTRVMKKyNlbmRpZiAvKiBDS19DVVJTRVMgKi8KKyNlbmRpZiAvKiBOT0NVUlNFUyAqLworI2VuZGlmIC8qIFZNUyAqLworCisjaWZuZGVmIE5PQ0tUSU1FUlMJCQkvKiBEeW5hbWljIHRpbWVvdXRzICovCisjaWZuZGVmIENLX1RJTUVSUworI2RlZmluZSBDS19USU1FUlMKKyNlbmRpZiAvKiBDS19USU1FUlMgKi8KKyNlbmRpZiAvKiBOT0NLVElNRVJTICovCisKKyNkZWZpbmUgQ0tfU1BFRUQJCQkvKiBDb250cm9sLXByZWZpeCByZW1vdmFsICovCisjaWZkZWYgTk9DS1NQRUVECisjdW5kZWYgQ0tfU1BFRUQKKyNlbmRpZiAvKiBOT0NLU1BFRUQgKi8KKworI2lmbmRlZiBOT0NLWFhDSEFSCisjaWZuZGVmIENLWFhDSEFSCisjaWZkZWYgVU5JWAorI2RlZmluZSBDS1hYQ0hBUgorI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgQ0tYWENIQVIKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogQ0tYWENIQVIgKi8KKyNlbmRpZiAvKiBOT0NLWFhDSEFSICovCisKKyNpZmRlZiBNQUMJCQkJLyogRm9yIE1hY2ludG9zaCwgbm8gZXNjYXBlICovCisjZGVmaW5lIE5PUFVTSAkJCQkvKiB0byBvcGVyYXRpbmcgc3lzdGVtICovCisjZW5kaWYgLyogTUFDICovCisKKy8qIFN5c3RlbXMgd2hlcmUgd2UgY2FuIGNhbGwgem1rZGlyKCkgdG8gY3JlYXRlIGRpcmVjdG9yaWVzLiAqLworCisjaWZuZGVmIENLX01LRElSCisjaWZuZGVmIE5PTUtESVIKKworI2lmZGVmIFVOSVgKKyNpZm5kZWYgcGRwMTEKKyNkZWZpbmUgQ0tfTUtESVIKKyNlbmRpZiAvKiBwZHAxMSAqLworI2VuZGlmIC8qIFVOSVggKi8KKworI2lmZGVmIE9TMgorI2RlZmluZSBDS19NS0RJUgorI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgVk1TCisjZGVmaW5lIENLX01LRElSCisjZW5kaWYgLyogVk1TICovCisKKyNpZmRlZiBTVFJBVFVTCisjZGVmaW5lIENLX01LRElSCisjZW5kaWYgLyogU1RSQVRVUyAqLworCisjaWZkZWYgT1NLCisjZGVmaW5lIENLX01LRElSCisjZW5kaWYgLyogT1NLICovCisKKyNpZmRlZiBkYXRhZ2VuZXJhbAorI2RlZmluZSBDS19NS0RJUgorI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisKKyNlbmRpZiAvKiBDS19NS0RJUiAqLworI2VuZGlmIC8qIE5PTUtESVIgKi8KKworI2lmZGVmIE5PTUtESVIJCQkJLyogQWxsb3cgZm9yIGNvbW1hbmQtbGluZSBvdmVycmlkZSAqLworI2lmZGVmIENLX01LRElSCisjdW5kZWYgQ0tfTUtESVIKKyNlbmRpZiAvKiBDS19NS0RJUiAqLworI2VuZGlmIC8qIE5PTUtESVIgKi8KKworLyogU3lzdGVtcyBmb3Igd2hpY2ggd2UgY2FuIGVuYWJsZSB0aGUgUkVESVJFQ1QgY29tbWFuZCBhdXRvbWF0aWNhbGx5ICovCisvKiAgIEFzIG9mIDYuMC4xOTMsIGl0IHNob3VsZCB3b3JrIGZvciBhbGwgVU5JWC4uLiAqLworCisjaWZuZGVmIE5PUkVESVJFQ1QKKyNpZm5kZWYgQ0tfUkVESVIKKyNpZmRlZiBVTklYCisjZGVmaW5lIENLX1JFRElSCisjZW5kaWYgLyogVU5JWCAqLworI2lmZGVmIE9TMgkJCQkvKiBBcyB3ZWxsIGFzIE9TLzIgYW5kIGZyaWVuZHMuLi4gKi8KKyNkZWZpbmUgQ0tfUkVESVIKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19SRURJUiAqLworI2VuZGlmIC8qIE5PUkVESVJFQ1QgKi8KKworI2lmZGVmIE5PUFVTSAkJCQkvKiBCdXQuLi4gUkVESVJFQ1QgY29tbWFuZCBpcyBub3QgKi8KKyNpZmRlZiBDS19SRURJUgkJCQkvKiAgYWxsb3dlZCBpZiBOT1BVU0ggaXMgZGVmaW5lZC4gKi8KKyN1bmRlZiBDS19SRURJUgorI2VuZGlmIC8qIENLX1JFRElSICovCisjaWZkZWYgTkVUQ01ECQkJCS8qIE5vciBpcyBTRVQgTkVUIENPTU1BTkQgKi8KKyN1bmRlZiBORVRDTUQKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyN1bmRlZiBORVRQVFkKKyNlbmRpZiAvKiBORVRQVFkgKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworI2lmbmRlZiBQRVhJVFNUQVQJCQkvKiBcdihwZXhpdHN0YXQpIHZhcmlhYmxlIGRlZmluZWQgKi8KKyNpZmRlZiBPUzJPUlVOSVgKKyNkZWZpbmUgUEVYSVRTVEFUCisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBQRVhJVFNUQVQKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyNlbmRpZiAvKiBQRVhJVFNUQVQgKi8KKworLyogVGhlIGZvbGxvd2luZyBhbGxvd3MgYXV0b21hdGljIGVuYWJsaW5nIG9mIFJFRElSRUNUIHRvIGJlIG92ZXJyaWRkZW4uLi4gKi8KKworI2lmZGVmIE5PUkVESVJFQ1QKKyNpZmRlZiBORVRDTUQKKyN1bmRlZiBORVRDTUQKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyN1bmRlZiBORVRQVFkKKyNlbmRpZiAvKiBORVRQVFkgKi8KKyNpZmRlZiBDS19SRURJUgorI3VuZGVmIENLX1JFRElSCisjZW5kaWYgLyogQ0tfUkVESVIgKi8KKyNlbmRpZiAvKiBOT1JFRElSRUNUICovCisKKyNpZmRlZiBOT05FVENNRAorI2lmZGVmIE5FVENNRAorI3VuZGVmIE5FVENNRAorI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorI3VuZGVmIE5FVFBUWQorI2VuZGlmIC8qIE5FVFBUWSAqLworI2VuZGlmIC8qIE5PTkVUQ01EICovCisKKyNpZmRlZiBDS19SRURJUgorX1BST1RPVFlQKCBpbnQgdHRydW5jbWQsIChjaGFyICopICk7CisjZW5kaWYgLyogQ0tfUkVESVIgKi8KKworLyogVXNlIGJ1aWx0LWluIERJUkVDVE9SWSBjb21tYW5kICovCisKKyNpZm5kZWYgTk9NWURJUgorI2lmbmRlZiBET01ZRElSCisjaWZkZWYgVU5JWE9ST1NLCisjZGVmaW5lIERPTVlESVIKKyNlbHNlCisjaWZkZWYgT1MyCisjZGVmaW5lIERPTVlESVIKKyNlbHNlCisjaWZkZWYgVk1TCisjZGVmaW5lIERPTVlESVIKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyNlbmRpZiAvKiBET01ZRElSICovCisjZW5kaWYgLyogTk9NWURJUiAqLworCisvKiBTZW5kaW5nIGZyb20gYW5kIHJlY2VpdmluZyB0byBjb21tYW5kcy9waXBlcyAqLworCisjaWZuZGVmIFBJUEVTRU5ECisjaWZkZWYgVU5JWAorI2RlZmluZSBQSVBFU0VORAorI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBPUzIKKyNkZWZpbmUgUElQRVNFTkQKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisjaWZkZWYgUElQRVNFTkQKKyNpZmRlZiBOT1BJUEVTRU5ECisjdW5kZWYgUElQRVNFTkQKKyNlbmRpZiAvKiBOT1BJUEVTRU5EICovCisjaWZkZWYgTk9QVVNICisjdW5kZWYgUElQRVNFTkQKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisjaWZkZWYgTk9QVVNICisjaWZkZWYgQlJPV1NFUgorI3VuZGVmIEJST1dTRVIKKyNlbmRpZiAvKiBCUk9XU0VSICovCisjZW5kaWYgLyogTk9QVVNIICovCisKKy8qIFZlcnNpb25zIHdoZXJlIHdlIHN1cHBvcnQgdGhlIFJFU0VORCBjb21tYW5kICovCisKKyNpZm5kZWYgTk9YRkVSCisjaWZuZGVmIE5PUkVTRU5ECisjaWZuZGVmIENLX1JFU0VORAorI2lmZGVmIFVOSVgKKyNpZm5kZWYgcGRwMTEKKyNkZWZpbmUgQ0tfUkVTRU5ECisjZW5kaWYgLyogcGRwMTEgKi8KKyNlbmRpZiAvKiBVTklYICovCisKKyNpZmRlZiBWTVMKKyNkZWZpbmUgQ0tfUkVTRU5ECisjZW5kaWYgLyogVk1TICovCisKKyNpZmRlZiBPUzIKKyNkZWZpbmUgQ0tfUkVTRU5ECisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBBTUlHQQorI2RlZmluZSBDS19SRVNFTkQKKyNlbmRpZiAvKiBBTUlHQSAqLworCisjaWZkZWYgZGF0YWdlbmVyYWwKKyNkZWZpbmUgQ0tfUkVTRU5ECisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKworI2lmZGVmIFNUUkFUVVMKKyNkZWZpbmUgQ0tfUkVTRU5ECisjZW5kaWYgLyogU1RSQVRVUyAqLworCisjaWZkZWYgT1NLCisjZGVmaW5lIENLX1JFU0VORAorI2VuZGlmIC8qIE9TSyAqLworCisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisjZW5kaWYgLyogTk9SRVNFTkQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworLyogU3lzdGVtcyBpbXBsZW1lbnRpbmcgIkRvb21zZGF5IEtlcm1pdCIgcHJvdG9jb2wgLi4uICovCisKKyNpZm5kZWYgRE9PTVNEQVkKKyNpZmRlZiBVTklYCisjZGVmaW5lIERPT01TREFZCisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBET09NU0RBWQorI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgRE9PTVNEQVkKKyNlbHNlCisjaWZkZWYgU1RSQVRVUworI2RlZmluZSBET09NU0RBWQorI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogRE9PTVNEQVkgKi8KKworLyogU3lzdGVtcyB3aGVyZSB3ZSB3YW50IHRoZSBUaGVybW9tZXRlciB0byBiZSB1c2VkIGZvciBmdWxsc2NyZWVuICovCisKKyNpZmRlZiBPUzIKKyNpZm5kZWYgQ0tfUENUX0JBUgorI2RlZmluZSBDS19QQ1RfQkFSCisjZW5kaWYgLyogQ0tfUENUX0JBUiAqLworI2VuZGlmIC8qIE9TMiAqLworCisvKiBTeXN0ZW1zIHdoZXJlIHdlIGhhdmUgYSBSRVhYIGNvbW1hbmQgKi8KKworI2lmZGVmIE9TMgorI2lmZGVmIF9fMzJCSVRfXworI2lmbmRlZiBOT1JFWFgKKyNkZWZpbmUgQ0tfUkVYWAorI2VuZGlmIC8qIE5PUkVYWCAqLworI2VuZGlmIC8qIF9fMzJCSVRfXyAqLworI2VuZGlmIC8qIE9TMiAqLworCisvKiBQbGF0Zm9ybXMgdGhhdCBoYXZlIGEgWkNIS1BJRCBmdW5jdGlvbiAqLworCisjaWZkZWYgT1MyT1JVTklYCisjZGVmaW5lIFpDSEtQSUQKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKworI2lmbmRlZiBaQ0hLUElECisvKiBJZiB3ZSBjYW4ndCBjaGVjayBwaWRzIHRoZW4gd2UgaGF2ZSB0cmVhdCBhbGwgcGlkcyBhcyBhY3RpdmUgJiB2YWxpZC4gKi8KKyNkZWZpbmUgemNoa3BpZCh4KSAxCisjZW5kaWYgLyogWkNIS1BJRCAqLworCisvKiBTeXN0ZW1zIHRoYXQgaGF2ZSBhIFpSRU5BTUUgZnVuY3Rpb24gKi8KKworI2RlZmluZSBaUkVOQU1FCQkJCS8qIFRoZXkgYWxsIGRvICovCisKKy8qIFN5c3RlbXMgdGhhdCBoYXZlIGEgWkNPUFkgZnVuY3Rpb24gKi8KKworI2lmbmRlZiBaQ09QWQorI2lmZGVmIFZNUworI2RlZmluZSBaQ09QWQorI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgWkNPUFkKKyNlbHNlCisjaWZkZWYgVU5JWAorI2RlZmluZSBaQ09QWQorI2Vsc2UKKyNpZmRlZiBTVFJBVFVTCisjZGVmaW5lIFpDT1BZCisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBaQ09QWSAqLworCisvKiBTeXN0ZW1zIHRoYXQgaGF2ZSB0dGd3c2l6KCkgKHRoZXkgYWxsIHNob3VsZCBidXQgdGhleSBkb24ndCkgKi8KKworI2lmbmRlZiBOT1RUR1dTSVoKKyNpZm5kZWYgQ0tfVFRHV1NJWgorI2lmZGVmIFVOSVgKKyNkZWZpbmUgQ0tfVFRHV1NJWgorI2Vsc2UKKyNpZmRlZiBWTVMKKyNkZWZpbmUgQ0tfVFRHV1NJWgorI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgQ0tfVFRHV1NJWgorI2Vsc2UKKyNpZmRlZiBPU0sKKyNkZWZpbmUgQ0tfVFRHV1NJWgorI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisjZW5kaWYgLyogTk9UVEdXU0laICovCisKKyNpZmRlZiBOT1RUR1dTSVoKKyNpZmRlZiBDS19UVEdXU0laCisjdW5kZWYgQ0tfVFRHV1NJWgorI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKyNlbmRpZiAvKiBOT1RUR1dTSVogKi8KKworLyogT1MvMiBDLUtlcm1pdCBmZWF0dXJlcyBub3QgYXZhaWxhYmxlIGluIDE2LWJpdCB2ZXJzaW9uLi4uICovCisKKyNpZmRlZiBPUzJPTkxZCisjaWZuZGVmIF9fMzJCSVRfXworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgUENGT05UUwkJCQkvKiBQQyBGb250IHN1cHBvcnQgKi8KKyN1bmRlZiBQQ0ZPTlRTCisjZW5kaWYgLyogUENGT05UUyAqLworI2lmZGVmIE5QSVBFCQkJCS8qIE5hbWVkIFBpcGVzIGNvbW11bmljYXRpb24gKi8KKyN1bmRlZiBOUElQRQorI2VuZGlmIC8qIE5QSVBFICovCisjaWZkZWYgQ0tfTkVUQklPUwkJCS8qIE5FVEJJT1MgY29tbXVuaWNhdGlvbiAqLworI3VuZGVmIENLX05FVEJJT1MKKyNlbmRpZiAvKiBDS19ORVRCSU9TICovCisjaWZkZWYgT1MyTU9VU0UJCQkJLyogTW91c2UgKi8KKyN1bmRlZiBPUzJNT1VTRQorI2VuZGlmIC8qIE9TMk1PVVNFICovCisjaWZkZWYgT1MyUE0JCQkJLyogUHJlc2VudGF0aW9uIE1hbmFnZXIgKi8KKyN1bmRlZiBPUzJQTQorI2VuZGlmIC8qIE9TMlBNICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworI2lmZGVmIENLX1JFWFgJCQkJLyogUmV4eCAqLworI3VuZGVmIENLX1JFWFgKKyNlbmRpZiAvKiBDS19SRVhYICovCisjZW5kaWYgLyogX18zMkJJVF9fICovCisjZW5kaWYgLyogT1MyT05MWSAqLworCisvKiBPUy8yIEMtS2VybWl0IGZlYXR1cmVzIG5vdCBhdmFpbGFibGUgaW4gV2luZG93cyBOVCB2ZXJzaW9uLi4uICovCisKKyNpZmRlZiBPUzIKKyNpZmRlZiBOVAorI2lmZGVmIFBDRk9OVFMJCQkJLyogUEMgRm9udCBzdXBwb3J0ICovCisjdW5kZWYgUENGT05UUworI2VuZGlmIC8qIFBDRk9OVFMgKi8KKyNpZmRlZiBOUElQRQkJCQkvKiBOYW1lZCBQaXBlcyBjb21tdW5pY2F0aW9uICovCisjdW5kZWYgTlBJUEUKKyNlbmRpZiAvKiBOUElQRSAqLworI2lmZGVmIE9TMlBNCQkJCS8qIFByZXNlbnRhdGlvbiBNYW5hZ2VyICovCisjdW5kZWYgT1MyUE0KKyNlbmRpZiAvKiBPUzJQTSAqLworI2lmZGVmIENLX1JFWFgJCQkJLyogUmV4eCAqLworI3VuZGVmIENLX1JFWFgKKyNlbmRpZiAvKiBDS19SRVhYICovCisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworLyoKKyAgU3lzdGVtcyB0aGF0IGhhdmUgc2VsZWN0KCkuCisgIFRoaXMgaXMgdXNlZCBmb3IgYm90aCBtc2xlZXAoKSBhbmQgZm9yIHJlYWQtYnVmZmVyIGNoZWNraW5nIGluIGluX2NoaygpLgorKi8KKyNkZWZpbmUgQ0tfU0xFRVBJTlQgMjUwIC8qIG1pbGxpc2Vjb25kcyAtIHNldCB0aGlzIHRvIHNvbWV0aGluZyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpZGVzIGV2ZW5seSBpbnRvIDEwMDAgKi8KKyNpZm5kZWYgU0VMRUNUCisjaWZuZGVmIE5PU0VMRUNUCisjaWZkZWYgX19saW51eF9fCisjZGVmaW5lIFNFTEVDVAorI2Vsc2UKKyNpZmRlZiBTVU5PUzQKKyNkZWZpbmUgU0VMRUNUCisjZWxzZQorI2lmZGVmIE5FWFQKKyNkZWZpbmUgU0VMRUNUCisjZWxzZQorI2lmZGVmIFJUQUlYCisjZGVmaW5lIFNFTEVDVAorI2Vsc2UKKyNpZmRlZiBIUFVYCisvKgorICBOb3QgcmVhbGx5LiAgSSB0aGluayBpdCdzIG9ubHkgaW4gSFAtVVggNy4wIGFuZCBsYXRlciwgZXhjZXB0IGl0J3MgYWxzbworICBpbiBlYXJsaWVyIHZlcnNpb25zIHRoYXQgaGF2ZSBUQ1AvSVAgaW5zdGFsbGVkLiAgT3ZlcnJpZGUgdGhpcyBkZWZhdWx0CisgIGluIHBhcnRpY3VsYXIgSFAtVVggbWFrZWZpbGUgZW50cmllcyBieSBhZGRpbmcgLUROT1NFTEVDVCwgYXMgaW4gKGUuZy4pCisgIHRoZSBIUC1VWCA2LjUgb25lcy4KKyovCisjZGVmaW5lIFNFTEVDVAorI2Vsc2UKKyNpZmRlZiBBSVhSUworI2RlZmluZSBTRUxFQ1QKKyNlbHNlCisjaWZkZWYgQlNENDQKKyNkZWZpbmUgU0VMRUNUCisjZWxzZQorI2lmZGVmIEJTRDQKKyNkZWZpbmUgU0VMRUNUCisjZWxzZQorI2lmZGVmIE9YT1MKKyNkZWZpbmUgU0VMRUNUCisjZWxzZQorI2lmZGVmIE9TMgorI2RlZmluZSBTRUxFQ1QKKyNlbHNlCisjaWZkZWYgQkVCT1gKKyNkZWZpbmUgU0VMRUNUCisjZW5kaWYgLyogQkVCT1ggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBPWE9TICovCisjZW5kaWYgLyogQlNENCAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisjZW5kaWYgLyogQUlYUlMgKi8KKyNlbmRpZiAvKiBIUFVYICovCisjZW5kaWYgLyogUlRBSVggKi8KKyNlbmRpZiAvKiBORVhUICovCisjZW5kaWYgLyogX19saW51eF9fICovCisjZW5kaWYgLyogU1VOT1M0ICovCisjZW5kaWYgLyogTk9TRUxFQ1QgKi8KKyNlbmRpZiAvKiBTRUxFQ1QgKi8KKworLyoKKyAgVGhlIGZvbGxvd2luZyBzZWN0aW9uIG1vdmVkIGhlcmUgZnJvbSBja2NuZXQuaCBpbiA2LjEgYmVjYXVzZSBzZWxlY3QoKQorICBpcyBub3cgdXNlZCBmb3Igbm9uLW5ldHdvcmtpbmcgcHVycG9zZXMuCisqLworCisvKiBPbiBIUC05MDAwLzUwMCBIUC1VWCA1LjIxIHRoaXMgc3R1ZmYgaXMgbm90IGRlZmluZWQgaW4gYW55IGhlYWRlciBmaWxlICovCisKKyNpZmRlZiBocDkwMDBzNTAwCisjaWZuZGVmIE5FRURTRUxFQ1RERUZTCisjZGVmaW5lIE5FRURTRUxFQ1RERUZTCisjZW5kaWYgLyogTkVFRFNFTEVDVERFRlMgKi8KKyNlbmRpZiAvKiBocDkwMDBzNTAwICovCisKKyNpZmRlZiBORUVEU0VMRUNUREVGUwordHlwZWRlZiBsb25nIGZkX21hc2s7CisjaWZuZGVmIE5CQlkKKyNkZWZpbmUgTkJCWSA4CisjZW5kaWYgLyogTkJCWSAqLworI2lmbmRlZiBGRF9TRVRTSVpFCisjZGVmaW5lIEZEX1NFVFNJWkUgMzIKKyNlbmRpZiAvKiBGRF9TRVRTSVpFICovCisjaWZuZGVmIE5GREJJVFMKKyNkZWZpbmUgTkZEQklUUyAoc2l6ZW9mKGZkX21hc2spICogTkJCWSkKKyNlbmRpZiAvKiBORkRCSVRTICovCisjaWZuZGVmIGhvd21hbnkKKyNkZWZpbmUgaG93bWFueSh4LHkpICgoKHgpKygoeSktMSkpLyh5KSkKKyNlbmRpZiAvKiBob3dtYW55ICovCit0eXBlZGVmIHN0cnVjdCBmZF9zZXQgeworICAgIGZkX21hc2sgZmRzX2JpdHNbaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKV07Cit9IGZkX3NldDsKKyNpZm5kZWYgRkRfU0VUCisjZGVmaW5lIEZEX1NFVChuLHApICgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSB8PSAoMSA8PCAoKG4pICUgTkZEQklUUykpKQorI2VuZGlmIC8qIEZEX1NFVCAqLworI2lmbmRlZiBGRF9DTFIKKyNkZWZpbmUgRkRfQ0xSKG4scCkgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdICY9IH4oMSA8PCAoKG4pICUgTkZEQklUUykpKQorI2VuZGlmIC8qIEZEX0NMUiAqLworI2lmbmRlZiBGRF9JU1NFVAorI2RlZmluZSBGRF9JU1NFVChuLHApICgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmICgxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZW5kaWYgLyogRkRfSVNTRVQgKi8KKyNpZm5kZWYgRkRfQ09QWQorI2RlZmluZSBGRF9DT1BZKGYsdCkgKGJjb3B5KGYsdCxzaXplb2YoKihmKSkpCisjZW5kaWYgLyogRkRfQ09QWSAqLworI2lmbmRlZiBGRF9aRVJPCisjZGVmaW5lIEZEX1pFUk8ocCkgYnplcm8oKGNoYXIgKikocCksc2l6ZW9mKCoocCkpKQorI2VuZGlmIC8qIEZEX1pFUk8gKi8KKyNlbmRpZiAvKiBORUVEU0VMRUNUREVGUyAqLworCisvKgorICBDS19ORUVEX1NJRyBpcyBkZWZpbmVkIGlmIHRoZSBzeXN0ZW0gY2Fubm90IGNoZWNrIHRoZSBjb25zb2xlIHRvCisgIHRvIHNlZSBpZiBjaGFyYWN0ZXJzIGFyZSB3YWl0aW5nLiAgVGhpcyBpcyB1c2VkIGR1cmluZyBsb2NhbC1tb2RlIGZpbGUKKyAgdHJhbnNmZXIgdG8gaW50ZXJydXB0IHRoZSB0cmFuc2ZlciwgcmVmcmVzaCB0aGUgc2NyZWVuIGRpc3BsYXksIGV0Yy4KKyAgSWYgQ0tfTkVFRF9TSUcgaXMgZGVmaW5lZCwgdGhlbiBmaWxlLXRyYW5zZmVyIGludGVycnVwdGlvbiBjaGFyYWN0ZXJzCisgIGhhdmUgdG8gYmUgcHJlY2VkZWQgYSBzcGVjaWFsIGNoYXJhY3RlciwgZS5nLiB0aGUgU0lHUVVJVCBjaGFyYWN0ZXIuCisgIENLX05FRURfU0lHIHNob3VsZCBiZSBkZWZpbmVkIGlmIHRoZSBjb25jaGsoKSBmdW5jdGlvbiBpcyBub3Qgb3BlcmF0aW9uYWwuCisqLworI2lmZGVmIE5PUE9MTAkJCQkvKiBGb3Igb3ZlcnJpZGluZyBDS19QT0xMIGRlZmluaXRpb24gKi8KKyNpZmRlZiBDS19QT0xMCisjdW5kZWYgQ0tfUE9MTAorI2VuZGlmIC8qIENLX1BPTEwgKi8KKyNlbmRpZiAvKiBOT1BPTEwgKi8KKworI2lmbmRlZiBDS19QT0xMCQkJCS8qIElmIHdlIGRvbid0IGhhdmUgcG9sbCgpICovCisjaWZuZGVmIFJEQ0hLCQkJCS8qIEFuZCB3ZSBkb24ndCBoYXZlIHJkY2hrKCkgKi8KKyNpZm5kZWYgU0VMRUNUCQkJCS8qIEFuZCB3ZSBkb24ndCBoYXZlIHNlbGVjdCgpICovCisjaWZkZWYgQVRUU1YKKyNpZm5kZWYgYWVnaXMKKyNpZm5kZWYgZGF0YWdlbmVyYWwKKyNpZm5kZWYgT1hPUworI2RlZmluZSBDS19ORUVEX1NJRworI2VuZGlmIC8qIE9YT1MgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIGFlZ2lzICovCisjZW5kaWYgLyogQVRUU1YgKi8KKyNpZmRlZiBQT1NJWAorI2lmbmRlZiBDS19ORUVEX1NJRworI2RlZmluZSBDS19ORUVEX1NJRworI2VuZGlmIC8qIENLX05FRURfU0lHICovCisjZW5kaWYgLyogUE9TSVggKi8KKyNlbmRpZiAvKiBTRUxFQ1QgKi8KKyNlbmRpZiAvKiBSRENISyAqLworI2VuZGlmIC8qIENLX1BPTEwgKi8KKworI2lmZGVmIEhQVVgJCQkJLyogSFAtVVggaGFzIHNlbGVjdCgpICovCisjaWZkZWYgQ0tfTkVFRF9TSUcKKyN1bmRlZiBDS19ORUVEX1NJRworI2VuZGlmIC8qIENLX05FRURfU0lHICovCisjZW5kaWYgLyogSFBVWCAqLworCisjaWZkZWYgQUlYUlMJCQkJLyogQUlYIGhhcyBzZWxlY3QoKSAqLworI2lmZGVmIENLX05FRURfU0lHCisjdW5kZWYgQ0tfTkVFRF9TSUcKKyNlbmRpZiAvKiBDS19ORUVEX1NJRyAqLworI2VuZGlmIC8qIEFJWFJTICovCisKKyNpZmRlZiBCU0Q0NAkJCQkvKiA0LjRCU0QgaGFzIEZJT05SRUFEICovCisjaWZkZWYgQ0tfTkVFRF9TSUcKKyN1bmRlZiBDS19ORUVEX1NJRworI2VuZGlmIC8qIENLX05FRURfU0lHICovCisjZW5kaWYgLyogQlNENDQgKi8KKworI2lmZGVmIFFOWAkJCQkvKiBRTlggaGFzIEZJT05SRUFEIGFuZCBzZWxlY3QoKSAqLworI2lmZGVmIENLX05FRURfU0lHCisjdW5kZWYgQ0tfTkVFRF9TSUcKKyNlbmRpZiAvKiBDS19ORUVEX1NJRyAqLworI2VuZGlmIC8qIFFOWCAqLworCisjaWZkZWYgQ09IRVJFTlQKKyNpZm5kZWYgTk9USU1FWk9ORQorI2RlZmluZSBOT1RJTUVaT05FCisjZW5kaWYgLyogTk9USU1FWk9ORSAqLworI2VuZGlmIC8qIENPSEVSRU5UICovCisKKyNpZmRlZiBVTklYCisjaWZuZGVmIEhBVkVfVFoJCQkJLyogQ2FuIHdlIHVzZSBzdHJ1Y3QgdGltZXpvbmU/ICovCisjaWZuZGVmIE5PVElNRVpPTkUKKyNpZmRlZiBQVFgKKyNkZWZpbmUgTk9USU1FWk9ORQorI2Vsc2UKKyNpZm5kZWYgU0VMRUNUCisjaWZkZWYgQ09IRVJFTlQKKyNkZWZpbmUgTk9USU1FWk9ORQorI2Vsc2UKKyNpZmRlZiBCRUxMVjEwCisjZGVmaW5lIE5PVElNRVpPTkUKKyNlbmRpZiAvKiBCRUxMVjEwICovCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBTRUxFQ1QgKi8KKyNlbmRpZiAvKiBQVFggKi8KKyNlbmRpZiAvKiBOT1RJTUVaT05FICovCisjZW5kaWYgLyogSEFWRV9UWiAqLworI2lmbmRlZiBOT1RJTUVWQUwJCQkvKiBDYW4gd2UgdXNlIHN0cnVjdCB0aW1ldmFsPyAqLworI2lmbmRlZiBIQVZFX1RWCisjZGVmaW5lIEhBVkVfVFYKKyNlbmRpZiAvKiBIQVZFX1RWICovCisjZW5kaWYgLyogTk9USU1FVkFMICovCisjaWZuZGVmIE5PVElNRVpPTkUKKyNpZm5kZWYgSEFWRV9UWgorI2RlZmluZSBIQVZFX1RaCisjZW5kaWYgLyogSEFWRV9UWiAqLworI2VuZGlmIC8qIE5PVElNRVpPTkUgKi8KKyNlbmRpZiAvKiBVTklYICovCisKKyNpZmRlZiBTQ08zMgorI2lmZGVmIEhBVkVfVFYKKyN1bmRlZiBIQVZFX1RWCisjZW5kaWYgLyogSEFWRV9UViAqLworI2lmZGVmIEhBVkVfVFoKKyN1bmRlZiBIQVZFX1RaCisjZW5kaWYgLyogSEFWRV9UWiAqLworI2lmbmRlZiBOT1RJTUVWQUwKKyNkZWZpbmUgTk9USU1FVkFMCisjZW5kaWYgLyogTk9USU1FVkFMICovCisjaWZuZGVmIE5PVElNRVpPTkUKKyNkZWZpbmUgTk9USU1FWk9ORQorI2VuZGlmIC8qIE5PVElNRVpPTkUgKi8KKyNlbmRpZiAvKiBTQ08zMiAqLworCisjaWZkZWYgQVRUNzMwMAorI2lmZGVmIEhBVkVfVFYKKyN1bmRlZiBIQVZFX1RWCisjZW5kaWYgLyogSEFWRV9UViAqLworI2lmZGVmIEhBVkVfVFoKKyN1bmRlZiBIQVZFX1RaCisjZW5kaWYgLyogSEFWRV9UWiAqLworI2lmbmRlZiBOT1RJTUVWQUwKKyNkZWZpbmUgTk9USU1FVkFMCisjZW5kaWYgLyogTk9USU1FVkFMICovCisjaWZuZGVmIE5PVElNRVpPTkUKKyNkZWZpbmUgTk9USU1FWk9ORQorI2VuZGlmIC8qIE5PVElNRVpPTkUgKi8KKyNlbmRpZiAvKiBBVFQ3MzAwICovCisKKy8qCisgIEF1dG9tYXRpYyBwYXJpdHkgZGV0ZWN0aW9uLgorICBUaGlzIGFjdHVhbGx5IGltcGxpZXMgYSBsb3QgbW9yZSBub3c6IGxlbmd0aC1kcml2ZW4gcGFja2V0IHJlYWRpbmcsCisgICJEb29tc2RheSBLZXJtaXQiIElCTSBNYWluZnJhbWUgZmlsZSB0cmFuc2ZlciB0aHJvdWdoIDMyNzAgZGF0YSBzdHJlYW1zLCBldGMuCisqLworI2lmZGVmIFVOSVgJCQkJLyogRm9yIFVuaXggKi8KKyNpZm5kZWYgTk9QQVJTRU4KKyNkZWZpbmUgUEFSU0VOU0UKKyNlbmRpZiAvKiBOT1BBUlNFTiAqLworI2VuZGlmIC8qIFVOSVggKi8KKworI2lmZGVmIFZNUwkJCQkvKiAuLi4gYW5kIFZNUyAqLworI2lmbmRlZiBOT1BBUlNFTgorI2RlZmluZSBQQVJTRU5TRQorI2VuZGlmIC8qIE5PUEFSU0VOICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgVk1TR0NDCisjZW5kaWYgLyogX19HTlVDX18gKi8KKyNlbmRpZiAvKiBWTVMgKi8KKworI2lmZGVmIE1BQwkJCQkvKiBhbmQgTWFjaW50b3NoICovCisjaWZuZGVmIE5PUEFSU0VOCisjZGVmaW5lIFBBUlNFTlNFCisjZW5kaWYgLyogTk9QQVJTRU4gKi8KKyNlbmRpZiAvKiBNQUMgKi8KKworI2lmZGVmIFNUUkFUVVMJCQkJLyogYW5kIFN0cmF0dXMgVk9TICovCisjaWZuZGVmIE5PUEFSU0VOCisjZGVmaW5lIFBBUlNFTlNFCisjZW5kaWYgLyogTk9QQVJTRU4gKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisKKyNpZmRlZiBPUzIJCQkJLyogYW5kIE9TLzIsIGZpbmFsbHkgKi8KKyNpZm5kZWYgTk9QQVJTRU4KKyNkZWZpbmUgUEFSU0VOU0UKKyNlbmRpZiAvKiBOT1BBUlNFTiAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZuZGVmIE5PRFlOQU1JQwkJCS8qIERZTkFNSUMgaXMgZGVmYXVsdCBmb3IgVU5JWCAqLworI2lmbmRlZiBEWU5BTUlDCQkJCS8qIGFzIG9mIEMtS2VybWl0IDcuMCAqLworI2lmZGVmIFVOSVgKKyNkZWZpbmUgRFlOQU1JQworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBEWU5BTUlDICovCisjZW5kaWYgLyogTk9EWU5BTUlDICovCisKKyNpZmRlZiBEWU5BTUlDCQkJCS8qIElmIERZTkFNSUMgaXMgZGVmaW5lZCAqLworI2RlZmluZSBEQ01EQlVGCQkJCS8qIHRoZW4gYWxzbyBkZWZpbmUgdGhpcy4gKi8KKyNlbmRpZiAvKiBEWU5BTUlDICovCisKKyNpZm5kZWYgQ0tfTEJSSwkJCQkvKiBDYW4gc2VuZCBMb25nIEJSRUFLICovCisKKyNpZmRlZiBVTklYCQkJCS8qIChldmVyeWJvZHkgYnV0IE9TLTkpICovCisjZGVmaW5lIENLX0xCUksKKyNlbmRpZiAvKiBVTklYICovCisjaWZkZWYgVk1TCisjZGVmaW5lIENLX0xCUksKKyNlbmRpZiAvKiBWTVMgKi8KKyNpZmRlZiBkYXRhZ2VuZXJhbAorI2RlZmluZSBDS19MQlJLCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNpZmRlZiBHRU1ET1MKKyNkZWZpbmUgQ0tfTEJSSworI2VuZGlmIC8qIEdFTURPUyAqLworI2lmZGVmIE9TMgorI2RlZmluZSBDS19MQlJLCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgQU1JR0EKKyNkZWZpbmUgQ0tfTEJSSworI2VuZGlmIC8qIEFNSUdBICovCisjaWZkZWYgU1RSQVRVUworI2RlZmluZSBDS19MQlJLCisjZW5kaWYgLyogU1RSQVRVUyAqLworCisjZW5kaWYgLyogQ0tfTEJSSyAqLworCisvKiBDYXJyaWVyIHRyZWF0bWVudCAqLworLyogVGhlc2UgYXJlIGRlZmluZWQgaGVyZSBiZWNhdXNlIHRoZXkgYXJlIHNoYXJlZCBieSB0aGUgc3lzdGVtIGRlcGVuZGVudCAqLworLyogYW5kIHRoZSBzeXN0ZW0gaW5kZXBlbmRlbnQgbW9kdWxlcy4gKi8KKworI2RlZmluZSAgQ0FSX09GRiAwCS8qIE9mZjogaWdub3JlIGNhcnJpZXIgYWx3YXlzLiAqLworI2RlZmluZSAgQ0FSX09OICAxICAgICAgLyogT246IGhlZWQgY2FycmllciBhbHdheXMsIGV4Y2VwdCBkdXJpbmcgRElBTC4gKi8KKyNkZWZpbmUgIENBUl9BVVQgMiAgICAgIC8qIEF1dG86IGhlZWQgY2FycmllciwgYnV0IG9ubHkgaWYgbGluZSBpcyBkZWNsYXJlZCAqLworCQkJLyogdG8gYmUgYSBtb2RlbSBsaW5lLCBhbmQgb25seSBkdXJpbmcgQ09OTkVDVC4gKi8KKworLyogQW5kIG1vcmUgZ2VuZXJpY2FsbHkgKGZvciB1c2Ugd2l0aCBhbnkgT04vT0ZGL0FVVE8gZmVhdHVyZSkgKi8KKyNkZWZpbmUgIENLX09GRiAgMAorI2RlZmluZSAgQ0tfT04gICAxCisjZGVmaW5lICBDS19BVVRPIDIKKworI2lmbmRlZiBOT0xPQ0FMCisvKgorICBTZXJpYWwgaW50ZXJmYWNlIHNwZWVkcyBhdmFpbGFibGUuCisKKyAgQXMgb2YgQy1LZXJtaXQgNi4xIHRoZXJlIGlzIGEgbmV3IG1ldGhvZCB0byBnZXQgdGhlIHN1cHBvcnRlZAorICBzcGVlZHMsIHdoaWNoIG9idmlhdGVzIHRoZSBuZWVkIGZvciBhbGwgdGhlIGNyYXppbmVzcyBiZWxvdy4gIEF0IHJ1bnRpbWUsCisgIGp1c3QgY2FsbCB0aGUgbmV3IHR0c3BkbGlzdCgpIHJvdXRpbmUgdG8gZ2V0IGEgbGlzdCBvZiBzdXBwb3J0ZWQgc3BlZWRzLgorICBUaGVuIHRoZSB1c2VyIGludGVyZmFjZSBtb2R1bGUgY2FuIGJ1aWxkIGEga2V5d29yZCB0YWJsZSBvciBtZW51IGZyb20gaXQuCisqLworI2lmbmRlZiBUVFNQRExJU1QKKyNpZmRlZiBVTklYCQkJCS8qIEZvciBub3csIG9ubHkgZm9yIFVOSVggKi8KKyNpZm5kZWYgT0xJTlVYSElTUEVFRAkJCS8qIEJ1dCBub3Qgc3lzdGVtcyB3aXRoIGhhY2tzIGZvciAqLworI2lmbmRlZiBNSU5JWAkJCQkvKiBoaWdoIHNwZWVkcywgbGlrZSAxMTAgPSAxMTUyMDAgKi8KKyNkZWZpbmUgVFRTUERMSVNUCisjZW5kaWYgLyogTUlOSVggKi8KKyNlbmRpZiAvKiBPTElOVVhISVNQRUVEICovCisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBUVFNQRExJU1QJCQkvKiBWTVMgZ2V0cyBpdCB0b28gKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogVFRTUERMSVNUICovCisKKyNpZm5kZWYgTk9ESUFMCQkJCS8qIEhhbmd1cCBieSBtb2RlbSBjb21tYW5kICovCisjaWZuZGVmIE5PTURNSFVQCisjaWZuZGVmIE1ETUhVUAorI2RlZmluZSBNRE1IVVAKKyNlbmRpZiAvKiBNRE1IVVAgKi8KKyNlbmRpZiAvKiBOT01ETUhVUCAqLworI2VuZGlmIC8qIE5PRElBTCAqLworCisjaWZkZWYgTk9TUEwKKyNpZm5kZWYgTk9MT0dESUFMCQkJLyogQ29ubmVjdGlvbiBsb2cgbmVlZHMgbWpkKCksIGV0Yy4gKi8KKyNkZWZpbmUgTk9MT0dESUFMCisjZW5kaWYgLyogTk9MT0dESUFMICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIHBkcDExCisjZGVmaW5lIE5PTE9HRElBTAorI2VuZGlmIC8qIHBkcDExICovCisKKyNpZm5kZWYgTk9MT0dESUFMCQkJLyogQ29ubmVjdGlvbiBsb2cgKi8KKyNpZm5kZWYgQ1hMT0dGSUxFCisjZGVmaW5lIENYTE9HRklMRSAiQ1guTE9HIgkJLyogRGVmYXVsdCBjb25uZWN0aW9uIGxvZyBmaWxlIG5hbWUgKi8KKyNlbmRpZiAvKiBDWExPR0ZJTEUgKi8KKyNpZm5kZWYgQ0tMT0dESUFMCisjaWZuZGVmIENLX1NNQUxMCisjZGVmaW5lIENLTE9HRElBTAorI2RlZmluZSBDWExPR0JVRkwgMTAyNAkJCS8qIENvbm5lY3Rpb24gbG9nIHJlY29yZCBidWZmZXIgc2l6ZSAqLworI2VuZGlmIC8qIENLX1NNQUxMICovCisjZW5kaWYgLyogTk9MT0dESUFMICovCisjZW5kaWYgLyogQ0tMT0dESUFMICovCisKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBOT1RUU1BETElTVAkJCS8qIEV4Y2VwdCBpZiBOT1RUU1BETElTVCBpcyBkZWZpbmVkICovCisjaWZkZWYgVFRTUERMSVNUCisjdW5kZWYgVFRTUERMSVNUCisjZW5kaWYgLyogVFRTUERMSVNUICovCisjZW5kaWYgLyogTk9UVFNQRExJU1QgKi8KKworI2lmZGVmIFRUU1BETElTVAorCitfUFJPVE9UWVAoIGxvbmcgKiB0dHNwZGxpc3QsICh2b2lkKSApOworCisjZWxzZSAvKiBUVFNQRExJU1Qgbm90IGRlZmluZWQgKi8KKy8qCisgIFdlIG11c3QgdXNlIGEgbG9uZyBhbmQgY29udm9sdXRlZCBzZXJpZXMgb2YgI2lmZGVmcyB0aGF0IGhhdmUgdG8gYmUga2VwdCBpbgorICBzeW5jIHdpdGggdGhlIGNvZGUgaW4gdGhlIGNrP3Rpby5jIG1vZHVsZS4KKworICBXZSBhc3N1bWUgdGhhdCBldmVyeWJvZHkgc3VwcG9ydHM6IDAsIDExMCwgMzAwLCA2MDAsIDEyMDAsIDI0MDAsIDQ4MDAsIGFuZAorICA5NjAwIGJwcy4gIFN5bWJvbHMgZm9yIG90aGVyIHNwZWVkcyBhcmUgZGVmaW5lZCBoZXJlLiAgWW91IGNhbiBhbHNvIGFkZAorICBkZWZpbml0aW9ucyBvbiB0aGUgQ0MgY29tbWFuZCBsaW5lcy4gIFRoZXNlIGRlZmluaXRpb25zIGFmZmVjdCB0aGUgU0VUIFNQRUVECisgIGtleXdvcmQgdGFibGUsIGFuZCBhcmUgbm90IG5lY2Vzc2FyaWx5IHVzYWJsZSBpbiB0aGUgc3lzdGVtLWRlcGVuZGVudAorICBzcGVlZC1zZXR0aW5nIGNvZGUgaW4gdGhlIGNrP3Rpby5jIG1vZHVsZXMsIHdoaWNoIGRlcGVuZHMgb24gc3lzdGVtLXNwZWNpZmljCisgIHN5bWJvbHMgbGlrZSAoaW4gVU5JWCkgQjE5MjAwLiAgSW4gb3RoZXIgd29yZHMsIGp1c3QgZGVmaW5pbmcgaXQgZG9lc24ndAorICBtZWFuIGl0J2xsIHdvcmsgLS0geW91IGFsc28gaGF2ZSB0byBzdXBwbHkgdGhlIHN1cHBvcnRpbmcgY29kZSBpbiB0dHNzcGQoKQorICBhbmQgdHRnc3BkKCkgaW4gY2s/dGlvLmMuCisKKyAgVGhlIHN5bWJvbHMgaGF2ZSB0aGUgZm9ybSBCUFNfeHh4eCwgd2hlcmUgeHh4eCBpcyB0aGUgc3BlZWQgaW4gYml0cyBwZXIKKyAgc2Vjb25kLCBvciAoZm9yIGJwcyB2YWx1ZXMgbGFyZ2VyIHRoYW4gOTk5OSkgdGhvdXNhbmRzIG9mIGJwcyBmb2xsb3dlZCBieSBLLgorICBUaGUgdG90YWwgc3ltYm9sIGxlbmd0aCBzaG91bGQgYmUgOCBjaGFyYWN0ZXJzIG9yIGxlc3MuICBTb21lIHZhbHVlcyBhcmUKKyAgZW5hYmxlZCBhdXRvbWF0aWNhbGx5IGJlbG93LiAgWW91IGNhbiBkaXNhYmxlIGEgcGFydGljdWxhciB2YWx1ZSBieSBkZWZpbmluZworICBOT0JfeHh4eCBvbiB0aGUgQ0MgY29tbWFuZCBsaW5lLgorCisqLworCisjaWZuZGVmIE5PQl81MAorI2RlZmluZSBCUFNfNTAJCQkJLyogNTAgYnBzICovCisjZW5kaWYKKworI2lmbmRlZiBOT0JfNzUKKyNkZWZpbmUgQlBTXzc1CQkJCS8qIDc1IGJwcyAqLworI2VuZGlmCisKKyNpZm5kZWYgTk9CNzUxMgorI2lmZGVmIEFOWUJTRAorI2RlZmluZSBCUFNfNzUxMgkJCS8qIDc1LzEyMDAgU3BsaXQgU3BlZWQgKi8KKyNlbmRpZiAvKiBBTllCU0QgKi8KKyNlbmRpZiAvKiBOT0I3NTEyICovCisKKyNpZm5kZWYgTk9CMTM0CisjaWZkZWYgU09MQVJJUzI1CisjZGVmaW5lIEJQU18xMzQKKyNlbHNlCisjdW5kZWYgQlBTXzEzNAkJCQkvKiAxMzQuNSBicHMgKElCTSAyNzQxKSAqLworI2VuZGlmIC8qIEJQU18xMzQgKi8KKyNlbmRpZiAvKiBOT0IxMzQgKi8KKworI2lmbmRlZiBOT0JfMTUwCisjZGVmaW5lIEJQU18xNTAJCQkJLyogMTUwIGJwcyAqLworI2VuZGlmCisKKyNpZm5kZWYgTk9CXzIwMAorI2RlZmluZSBCUFNfMjAwCQkJCS8qIDIwMCBicHMgKi8KKyNlbmRpZgorCisjaWZuZGVmIE5PQl8xODAwCisjaWZkZWYgTUFDCisjZGVmaW5lIEJQU18xODAwCQkJLyogMTgwMCBicHMgKi8KKyNlbHNlCisjaWZkZWYgU09MQVJJUzI1CisjZGVmaW5lIEJQU18xODAwCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgTk9CXzM2MDAKKyNpZm5kZWYgU09MQVJJUzI1CisjZGVmaW5lIEJQU18zNjAwCQkJLyogMzYwMCBicHMgKi8KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgTk9CXzcyMDAKKyNpZm5kZWYgU09MQVJJUzI1CisjZGVmaW5lIEJQU183MjAwCQkJLyogNzIwMCBicHMgKi8KKyNlbmRpZiAvKiBTT0xBUklTMjUgKi8KKyNlbmRpZgorCisjaWZuZGVmIE5PQl8xNEsKKyNpZmRlZiBCU0Q0NAorI2RlZmluZSBCUFNfMTRLCQkJCS8qIDE0NDAwIGJwcyAqLworI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgQlBTXzE0SworI2Vsc2UKKyNpZmRlZiBORVhUCisjZGVmaW5lIEJQU18xNEsKKyNlbHNlCisjaWZkZWYgTUFDCisjZGVmaW5lIEJQU18xNEsKKyNlbHNlCisjaWZkZWYgQU1JR0EKKyNkZWZpbmUgQlBTXzE0SworI2VuZGlmIC8qIEFNSUdBICovCisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogTkVYVCAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisjZW5kaWYgLyogTk9CXzE0SyAqLworCisjaWZuZGVmIE5PQl8xOUsKKyNkZWZpbmUgQlBTXzE5SwkJCQkvKiAxOTIwMCBicHMgKi8KKyNlbmRpZgorCisjaWZuZGVmIE5PQl8yOEsKKyNpZmRlZiBCU0Q0NAorI2RlZmluZSBCUFNfMjhLCisjZWxzZQorI2lmZGVmIE9TMgorI2RlZmluZSBCUFNfMjhLCisjZWxzZQorI2lmZGVmIE5FWFQKKyNkZWZpbmUgQlBTXzI4SwkJCQkvKiAyODgwMCBicHMgKi8KKyNlbHNlCisjaWZkZWYgTUFDCisjZGVmaW5lIEJQU18yOEsJCQkJLyogMjg4MDAgYnBzICovCisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogTkVYVCAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisjZW5kaWYgLyogTk9CXzI4SyAqLworCisjaWZuZGVmIE5PQl8zOEsKKyNkZWZpbmUgQlBTXzM4SwkJCQkvKiAzODQwMCBicHMgKi8KKyNlbmRpZgorCisjaWZuZGVmIE5PQl81N0sKKyNpZmRlZiBQbGFuOQorI2RlZmluZSBCUFNfNTdLCisjZWxzZQorI2lmZGVmIFNPTEFSSVMyNQorI2RlZmluZSBCUFNfNTdLCisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBCUFNfNTdLCQkJCS8qIDU3NjAwIGJwcyAqLworI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgQlBTXzU3SworI2Vsc2UKKyNpZmRlZiBfX2xpbnV4X18KKyNkZWZpbmUgQlBTXzU3SworI2Vsc2UKKyNpZmRlZiBIUFVYCisjZGVmaW5lIEJQU181N0sKKyNlbHNlCisjaWZkZWYgTkVYVAorI2RlZmluZSBCUFNfNTdLCisjZWxzZQorI2lmZGVmIF9fMzg2QlNEX18KKyNkZWZpbmUgQlBTXzU3SworI2Vsc2UKKyNpZmRlZiBfX0ZyZWVCU0RfXworI2RlZmluZSBCUFNfNTdLCisjZWxzZQorI2lmZGVmIF9fTmV0QlNEX18KKyNkZWZpbmUgQlBTXzU3SworI2Vsc2UKKyNpZmRlZiBNQUMKKyNkZWZpbmUgQlBTXzU3SworI2Vsc2UKKyNpZmRlZiBRTlgKKyNkZWZpbmUgQlBTXzU3SworI2Vsc2UKKyNpZmRlZiBCRU9TT1JCRUJPWAorI2RlZmluZSBCUFNfNTdLCisjZWxzZQorI2lmZGVmIElSSVg2MgorI2RlZmluZSBCUFNfNTdLCisjZWxzZQorI2lmZGVmIFNDT19PU1I1MDQKKyNkZWZpbmUgQlBTXzU3SworI2Vsc2UKKyNpZmRlZiBCU0RJMgorI2RlZmluZSBCUFNfNTdLCisjZW5kaWYgLyogQlNESTIgKi8KKyNlbmRpZiAvKiBTQ09fT1NSNTA0ICovCisjZW5kaWYgLyogSVJJWDYyICovCisjZW5kaWYgLyogQkVPU09SQkVCT1ggKi8KKyNlbmRpZiAvKiBRTlggKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBfX05ldEJTRF9fICovCisjZW5kaWYgLyogX19GcmVlQlNEX18gKi8KKyNlbmRpZiAvKiBfXzM4NkJTRF9fICovCisjZW5kaWYgLyogTkVYVCAqLworI2VuZGlmIC8qIEhQVVggKi8KKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBTT0xBUklTMjUgKi8KKyNlbmRpZiAvKiBQbGFuOSAqLworI2VuZGlmIC8qIE5PQl81N0sgKi8KKworI2lmbmRlZiBOT0JfNzZLCisjaWZkZWYgQlNESTIKKyNkZWZpbmUgQlBTXzc2SworI2VuZGlmIC8qIEJTREkyICovCisjaWZkZWYgUGxhbjkKKyNkZWZpbmUgQlBTXzc2SworI2VuZGlmIC8qIFBsYW45ICovCisjaWZkZWYgU09MQVJJUzI1CisjZGVmaW5lIEJQU183NksKKyNlbmRpZiAvKiBTT0xBUklTMjUgKi8KKyNpZmRlZiBWTVMKKyNkZWZpbmUgQlBTXzc2SwkJCQkvKiA3NjgwMCBicHMgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNpZmRlZiBPUzIKKyNpZmRlZiBfXzMyQklUX18KKyNkZWZpbmUgQlBTXzc2SworI2VuZGlmIC8qIF9fMzJCSVRfXyAqLworI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIFFOWAorI2RlZmluZSBCUFNfNzZLCisjZW5kaWYgLyogUU5YICovCisjaWZkZWYgSVJJWDYyCisjZGVmaW5lIEJQU183NksKKyNlbmRpZiAvKiBJUklYNjIgKi8KKyNpZmRlZiBTQ09fT1NSNTA0CisjZGVmaW5lIEJQU183NksKKyNlbmRpZiAvKiBTQ09fT1NSNTA0ICovCisjZW5kaWYgLyogTk9CXzc2SyAqLworCisjaWZuZGVmIE5PQl8xMTVLCisjaWZkZWYgQlNESTIKKyNkZWZpbmUgQlBTXzExNUsKKyNlbmRpZiAvKiBCU0RJMiAqLworI2lmZGVmIFBsYW45CisjZGVmaW5lIEJQU18xMTVLCisjZW5kaWYgLyogUGxhbjkgKi8KKyNpZmRlZiBTT0xBUklTMjUKKyNkZWZpbmUgQlBTXzExNUsKKyNlbmRpZiAvKiBTT0xBUklTMjUgKi8KKyNpZmRlZiBWTVMKKyNkZWZpbmUgQlBTXzExNUsJCQkvKiAxMTUyMDAgYnBzICovCisjZWxzZQorI2lmZGVmIFFOWAorI2RlZmluZSBCUFNfMTE1SworI2Vsc2UKKyNpZmRlZiBIUFVYCisjZGVmaW5lIEJQU18xMTVLCisjZWxzZQorI2lmZGVmIF9fbGludXhfXworI2RlZmluZSBCUFNfMTE1SworI2Vsc2UKKyNpZmRlZiBfXzM4NkJTRF9fCisjZGVmaW5lIEJQU18xMTVLCisjZWxzZQorI2lmZGVmIF9fRnJlZUJTRF9fCisjZGVmaW5lIEJQU18xMTVLCisjZWxzZQorI2lmZGVmIF9fTmV0QlNEX18KKyNkZWZpbmUgQlBTXzExNUsKKyNlbHNlCisjaWZkZWYgT1MyCisjaWZkZWYgX18zMkJJVF9fCisjZGVmaW5lIEJQU18xMTVLCisjZW5kaWYgLyogX18zMkJJVF9fICovCisjZWxzZQorI2lmZGVmIEJFT1NPUkJFQk9YCisjZGVmaW5lIEJQU18xMTVLCisjZWxzZQorI2lmZGVmIElSSVg2MgorI2RlZmluZSBCUFNfMTE1SworI2Vsc2UKKyNpZmRlZiBTQ09fT1NSNTA0CisjZGVmaW5lIEJQU18xMTVLCisjZW5kaWYgLyogU0NPX09TUjUwNCAqLworI2VuZGlmIC8qIElSSVg2MiAqLworI2VuZGlmIC8qIEJFT1NPUkJFQk9YICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogX19OZXRCU0RfXyAqLworI2VuZGlmIC8qIF9fRnJlZUJTRF9fICovCisjZW5kaWYgLyogX18zODZCU0RfXyAqLworI2VuZGlmIC8qIF9fbGludXhfXyAqLworI2VuZGlmIC8qIEhQVVggKi8KKyNlbmRpZiAvKiBRTlggKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBOT0JfMTE1SyAqLworCisjaWZuZGVmIE5PQl8yMzBLCQkJLyogMjMwNDAwIGJwcyAqLworI2lmZGVmIEJTREkyCisjZGVmaW5lIEJQU18yMzBLCisjZWxzZQorI2lmZGVmIFNDT19PU1I1MDQKKyNkZWZpbmUgQlBTXzIzMEsKKyNlbHNlCisjaWZkZWYgX19saW51eF9fCisjZGVmaW5lIEJQU18yMzBLCisjZWxzZQorI2lmZGVmIFNPTEFSSVMyNQorI2RlZmluZSBCUFNfMjMwSworI2Vsc2UKKyNpZmRlZiBPUzIKKyNpZmRlZiBfXzMyQklUX18KKyNkZWZpbmUgQlBTXzIzMEsKKyNlbmRpZiAvKiBfXzMyQklUX18gKi8KKyNlbHNlCisjdW5kZWYgQlBTXzIzMEsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBTT0xBUklTMjUgKi8KKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKyNlbmRpZiAvKiBTQ09fT1NSNTA0ICovCisjZW5kaWYgLyogQlNESTIgKi8KKyNlbmRpZiAvKiBOT0JfMjMwSyAqLworCisjaWZuZGVmIE5PQl80NjBLCQkJLyogNDYwODAwIGJwcyAqLworI2lmZGVmIFNDT19PU1I1MDQKKyNkZWZpbmUgQlBTXzQ2MEsKKyNlbHNlCisjaWZkZWYgX19saW51eF9fCisjZGVmaW5lIEJQU180NjBLCisjZWxzZQorI2lmZGVmIE9TMgorI2lmZGVmIF9fMzJCSVRfXworI2RlZmluZSBCUFNfNDYwSworI2VuZGlmIC8qIF9fMzJCSVRfXyAqLworI2Vsc2UKKyN1bmRlZiBCUFNfNDYwSworI2VuZGlmIC8qIF9fbGludXhfXyAqLworI2VuZGlmIC8qIFNDT19PU1I1MDQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0JfNDYwSyAqLworCisjaWZuZGVmIE5PQl85MjFLCQkJLyogOTIxNjAwIGJwcyAqLworI2lmZGVmIFNDT19PU1I1MDQKKyNkZWZpbmUgQlBTXzkyMUsKKyNlbmRpZiAvKiBTQ09fT1NSNTA0ICovCisjZW5kaWYgLyogTk9CXzkyMUsgKi8KKworI2lmZGVmIEJQU185MjFLCQkJCS8qIE1heGltdW0gc3BlZWQgZGVmaW5lZCAqLworI2RlZmluZSBNQVhfU1BEIDkyMTYwMEwKKyNlbHNlCisjaWZkZWYgQlBTXzQ2MEsKKyNkZWZpbmUgTUFYX1NQRCA0NjA4MDBMCisjZWxzZQorI2lmZGVmIEJQU18yMzBLCisjZGVmaW5lIE1BWF9TUEQgMjMwNDAwTAorI2Vsc2UKKyNpZmRlZiBCUFNfMTE1SworI2RlZmluZSBNQVhfU1BEIDExNTIwMEwKKyNlbHNlCisjaWZkZWYgQlBTXzc2SworI2RlZmluZSBNQVhfU1BEIDc2ODAwTAorI2Vsc2UKKyNpZmRlZiBCUFNfNTdLCisjZGVmaW5lIE1BWF9TUEQgNTc2MDBMCisjZWxzZQorI2lmZGVmIEJQU18zOEsKKyNkZWZpbmUgTUFYX1NQRCAzODQwMEwKKyNlbHNlCisjaWZkZWYgQlBTXzI4SworI2RlZmluZSBNQVhfU1BEIDI4ODAwTAorI2Vsc2UKKyNpZmRlZiBCUFNfMTlLCisjZGVmaW5lIE1BWF9TUEQgMTkyMDBMCisjZWxzZQorI2lmZGVmIEJQU18xNEsKKyNkZWZpbmUgTUFYX1NQRCAxNDQwMEwKKyNlbHNlCisjZGVmaW5lIE1BWF9TUEQgOTYwMEwKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmIC8qIFRUU1BETElTVCAqLworCisjaWZuZGVmIENPTkdTUEQJCQkJLyogU3lzdGVtcyB0aGF0IGNhbiBjYWxsIGNvbmdzcGQoKSAqLworI2lmZGVmIFVOSVgKKyNkZWZpbmUgQ09OR1NQRAorI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBWTVMKKyNkZWZpbmUgQ09OR1NQRAorI2VuZGlmIC8qIFZNUyAqLworI2lmZGVmIFNUUkFUVVMKKyNkZWZpbmUgQ09OR1NQRAorI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBDT05HU1BEICovCisKKy8qIFR5cGVzIG9mIGZsb3cgY29udHJvbCBhdmFpbGFibGUgKi8KKworI2RlZmluZSBDS19YT05YT0ZGCQkJLyogRXZlcnlib2R5IGNhbiBkbyB0aGlzLCByaWdodD8gKi8KKworI2lmZGVmIEFNSUdBCQkJCS8qIENvbW1vZG9yZSBBbWlnYSAqLworI2RlZmluZSBDS19SVFNDVFMJCQkvKiBoYXMgUlRTL0NUUyAqLworI2VuZGlmIC8qIEFNSUdBICovCisKKyNpZmRlZiBTVU40UzUJCQkJLyogU3VuT1MgaW4gU3lzdGVtIFYgZW52aXJvbm1lbnQgKi8KKyNkZWZpbmUgQ0tfUlRTQ1RTCisjZWxzZQkJCQkJLyogU3VuT1MgNC4wLzQuMSBpbiBCU0QgZW52aXJvbm1lbnQgKi8KKyNpZmRlZiBTVU5PUzQJCQkJLyogU3VuT1MgNC4wK2xhdGVyIHN1cHBvcnRzIFJUUy9DVFMgKi8KKyNpZmRlZiBTVU5PUzQxCQkJCS8qIEVhc3kgaW4gNC4xIGFuZCBsYXRlciAqLworI2RlZmluZSBDS19SVFNDVFMKKyNlbHNlCQkJCQkvKiBIYXJkZXIgaW4gNC4wICovCisjaWZuZGVmIF9fR05VQ19fCQkJLyogKHNlZSB0dGhmbG93KCkgaW4gY2t1dGlvLmMpICovCisjaWZuZGVmIEdOVUMKKyNkZWZpbmUgQ0tfUlRTQ1RTCQkJLyogT25seSBpZiBub3QgdXNpbmcgR05VIGdjYyAqLworI2VuZGlmIC8qIF9fR05VQ19fICovCisjZW5kaWYgLyogR05VQyAqLworI2VuZGlmIC8qIFNVTk9TNDEgKi8KKyNlbmRpZiAvKiBTVU5PUzQgKi8KKyNlbmRpZiAvKiBTVU40UzUgKi8KKworI2lmZGVmIEJTRDQ0CQkJCS8qIEFuZCBpbiA0LjQgQlNELCBpbmNsdWRpbmcgQlNESSAqLworI2RlZmluZSBDS19SVFNDVFMKKyNlbmRpZiAvKiBCU0Q0NCAqLworCisjaWZkZWYgVEVSTUlPWAkJCQkvKiBTeXMgViBSNCA8dGVybWlveC5oPiAqLworI2lmbmRlZiBDS19SVFNDVFMKKyNkZWZpbmUgQ0tfUlRTQ1RTCisjZW5kaWYgLyogQ0tfUlRTQ1RTICovCisjaWZuZGVmIENLX0RUUkNECisjZGVmaW5lIENLX0RUUkNECisjZW5kaWYgLyogQ0tfRFRSQ0QgKi8KKyNlbHNlCisjaWZkZWYgU1RFUk1JT1gJCQkJLyogU3lzIFYgUjQgPHN5cy90ZXJtaW94Lmg+ICovCisjaWZuZGVmIENLX1JUU0NUUworI2RlZmluZSBDS19SVFNDVFMKKyNlbmRpZiAvKiBDS19SVFNDVFMgKi8KKyNpZm5kZWYgQ0tfRFRSQ0QKKyNkZWZpbmUgQ0tfRFRSQ0QKKyNlbmRpZiAvKiBDS19EVFJDRCAqLworI2VuZGlmIC8qIFNURVJNSU9YICovCisjZW5kaWYgLyogVEVSTUlPWCAqLworCisjaWZkZWYgT1hPUwkJCQkvKiBPbGl2ZXR0aSBYL09TIFIyIHN0cnVjdCB0ZXJtaW9zICovCisjZGVmaW5lIENLX1JUU0NUUwkJCS8qIERpdHRvLiAqLworI2RlZmluZSBDS19EVFJDRAorI2VuZGlmIC8qIE9YT1MgKi8KKworI2lmZGVmIEFJWFJTCQkJCS8qIFJTLzYwMDAgd2l0aCBBSVggMy54ICovCisjZGVmaW5lIENLX1JUU0NUUwkJCS8qIEhhcyBpdHMgb3duIHBlY3VsaWFyIG1ldGhvZC4uLiAqLworI2VuZGlmIC8qIEFJWFJTICovCisKKyNpZmRlZiBfX2xpbnV4X18JCQkvKiBMaW51eCAqLworI2RlZmluZSBDS19SVFNDVFMKKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKy8qCisgIEhhcmR3YXJlIGZsb3cgY29udHJvbCBpcyBub3QgZGVmaW5lZCBpbiBQT1NJWC4xLiAgTmV2ZXJ0aGVsZXNzLCBhIGNlcnRhaW4KKyAgc3R5bGUgQVBJIGZvciBoYXJkd2FyZSBmbG93IGNvbnRyb2wsIHVzaW5nIHRjc2V0YXR0cigpIGFuZCB0aGUgQ1JUU0NUUworICBiaXQocyksIHNlZW1zIHRvIGJlIGdhaW5pbmcgY3VycmVuY3kgb24gUE9TSVgtYmFzZWQgVU5JWCBzeXN0ZW1zLiAgVGhlCisgIGZvbGxvd2luZyBjb2RlIGRlZmluZXMgdGhlIHN5bWJvbCBQT1NJWF9DUlRTQ1RTIGZvciBzdWNoIHN5c3RlbXMuCisqLworI2lmZGVmIENLX1JUU0NUUworI2lmZGVmIF9fYnNkaV9fCQkJCS8qIEJTREksIGEuay5hLiBCU0QvMzg2ICovCisjZGVmaW5lIFBPU0lYX0NSVFNDVFMKKyNlbmRpZiAvKiBfX2JzZGlfXyAqLworI2lmZGVmIF9fbGludXhfXwkJCS8qIExpbnV4ICovCisjZGVmaW5lIFBPU0lYX0NSVFNDVFMKKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKyNpZmRlZiBfX05ldEJTRF9fCQkJLyogTmV0QlNEICovCisjZGVmaW5lIFBPU0lYX0NSVFNDVFMKKyNlbmRpZiAvKiBfX05ldEJTRF9fICovCisjaWZkZWYgX19PcGVuQlNEX18KKyNkZWZpbmUgUE9TSVhfQ1JUU0NUUworI2VuZGlmIC8qIF9fT3BlbkJTRF9fICovCisjaWZkZWYgQkVPU09SQkVCT1gJCQkvKiBCZUJPWCAqLworI2RlZmluZSBQT1NJWF9DUlRTQ1RTCisvKiBCRUJPWCBkZWZpbmVzIENSVFNGTCBhcyAoQ1RTRkxPVyAmIFJUU0ZMT1cpICovCisjZGVmaW5lIENSVFNDVFMgQ1JUU0ZMCisjZW5kaWYgLyogQkVPU09SQkVCT1ggKi8KKyNpZmRlZiBJUklYNTIJCQkJLyogSVJJWCA1LjIgYW5kIGxhdGVyICovCisjZGVmaW5lIFBPU0lYX0NSVFNDVFMKKyNkZWZpbmUgQ1JUU0NUUyBDTkVXX1JUU0NUUwkJLyogU2VlIDxzeXMvdGVybWlvcy5oPiAqLworI2VuZGlmIC8qIElSSVg1MiAqLworI2VuZGlmIC8qIENLX1JUU0NUUyAqLworCisvKiBJbXBsZW1lbnRhdGlvbnMgdGhhdCBoYXZlIGltcGxlbWVudGVkIHRoZSB0dHNldGZsb3coKSBmdW5jdGlvbi4gKi8KKworI2lmbmRlZiBDS19UVFNFVEZMT1cKKyNpZmRlZiBVTklYCisjZGVmaW5lIENLX1RUU0VURkxPVworI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBPUzIKKyNkZWZpbmUgQ0tfVFRTRVRGTE9XCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogQ0tfVFRTRVRGTE9XICovCisKKyNpZmRlZiBDS19UVFNFVEZMT1cKK19QUk9UT1RZUCggaW50IHR0c2V0ZmxvdywgKGludCkgKTsKKyNlbmRpZiAvKiBDS19UVFNFVEZMT1cgKi8KKy8qCisgU3lzdGVtcyB3aGVyZSB3ZSBjYW4gZXhwYW5kIHRpbGRlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZmlsZSBvciBkaXJlY3RvcnkgbmFtZXMKKyovCisjaWZkZWYgUE9TSVgKKyNpZm5kZWYgRFRJTERFCisjZGVmaW5lIERUSUxERQorI2VuZGlmIC8qIERUSUxERSAqLworI2VuZGlmIC8qIFBPU0lYICovCisjaWZkZWYgQlNENAorI2lmbmRlZiBEVElMREUKKyNkZWZpbmUgRFRJTERFCisjZW5kaWYgLyogRFRJTERFICovCisjZW5kaWYgLyogQlNENCAqLworI2lmZGVmIEFUVFNWCisjaWZuZGVmIERUSUxERQorI2RlZmluZSBEVElMREUKKyNlbmRpZiAvKiBEVElMREUgKi8KKyNlbmRpZiAvKiBBVFRTViAqLworI2lmZGVmIE9TSworI2lmbmRlZiBEVElMREUKKyNkZWZpbmUgRFRJTERFCisjZW5kaWYgLyogRFRJTERFICovCisjZW5kaWYgLyogT1NLICovCisjaWZkZWYgSFBVWAkJCQkvKiBJIGRvbid0IGtub3cgd2h5IHRoaXMgaXMgKi8KKyNpZm5kZWYgRFRJTERFCQkJCS8qIG5lY2Vzc2FyeSwgc2luY2UgLURIUFVYICovCisjZGVmaW5lIERUSUxERQkJCQkvKiBhdXRvbWF0aWNhbGx5IGRlZmluZXMgQVRUU1YgKi8KKyNlbmRpZiAvKiBEVElMREUgKi8JCQkvKiAoc2VlIGFib3ZlKSAuLi4gKi8KKyNlbmRpZiAvKiBIUFVYICovCisKKy8qCisgIFRoaXMgaXMgbWFpbmx5IGZvciB0aGUgYmVuZWZpdCBvZiBja3VmaW8uYyAoVU5JWCBhbmQgT1MvMiBmaWxlIHN1cHBvcnQpLgorICBTeXN0ZW1zIHRoYXQgaGF2ZSBhbiBhdG9taWMgcmVuYW1lKCkgZnVuY3Rpb24sIHNvIHdlIGRvbid0IGhhdmUgdG8gdXNlCisgIGxpbmsoKSBhbmQgdW5saW5rKCkuCisqLworI2lmZGVmIFBPU0lYCisjaWZuZGVmIFJFTkFNRQorI2RlZmluZSBSRU5BTUUKKyNlbmRpZiAvKiBSRU5BTUUgKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworCisjaWZkZWYgT1MyCisjaWZuZGVmIFJFTkFNRQorI2RlZmluZSBSRU5BTUUKKyNlbmRpZiAvKiBSRU5BTUUgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIFNVTk9TNDEKKyNpZm5kZWYgUkVOQU1FCisjZGVmaW5lIFJFTkFNRQorI2VuZGlmIC8qIFJFTkFNRSAqLworI2VuZGlmIC8qIFNVTk9TNDEgKi8KKworI2lmZGVmIFNWUjQKKyNpZm5kZWYgUkVOQU1FCisjZGVmaW5lIFJFTkFNRQorI2VuZGlmIC8qIFJFTkFNRSAqLworI2VuZGlmIC8qIFNWUjQgKi8KKworI2lmZGVmIEFJWFJTCisjaWZuZGVmIFJFTkFNRQorI2RlZmluZSBSRU5BTUUKKyNlbmRpZiAvKiBSRU5BTUUgKi8KKyNlbmRpZiAvKiBBSVhSUyAqLworCisjaWZkZWYgQlNENDQKKyNpZm5kZWYgUkVOQU1FCisjZGVmaW5lIFJFTkFNRQorI2VuZGlmIC8qIFJFTkFNRSAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisKKyNpZmRlZiBOT1JFTkFNRQkJCQkvKiBBbGxvdyBmb3IgY29tcGlsZS10aW1lIG92ZXJyaWRlICovCisjaWZkZWYgUkVOQU1FCisjdW5kZWYgUkVOQU1FCisjZW5kaWYgLyogUkVOQU1FICovCisjZW5kaWYgLyogTk9SRU5BTUUgKi8KKworI2lmZGVmIFNUUkFUVVMJCQkJLyogU3RyYXR1cyBWT1MgKi8KKyNpZm5kZWYgUkVOQU1FCisjZGVmaW5lIFJFTkFNRQorI2VuZGlmIC8qIFJFTkFNRSAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKworLyogTGluZSBkZWxpbWl0ZXIgZm9yIHRleHQgZmlsZXMgKi8KKworLyoKKyBJZiB0aGUgc3lzdGVtIHVzZXMgYSBzaW5nbGUgY2hhcmFjdGVyIGZvciB0ZXh0IGZpbGUgbGluZSBkZWxpbWl0YXRpb24sCisgZGVmaW5lIE5MQ0hBUiB0byB0aGUgdmFsdWUgb2YgdGhhdCBjaGFyYWN0ZXIuICBGb3IgdGV4dCBmaWxlcywgdGhhdAorIGNoYXJhY3RlciB3aWxsIGJlIGNvbnZlcnRlZCB0byBDUkxGIHVwb24gb3V0cHV0LCBhbmQgQ1JMRiB3aWxsIGJlIGNvbnZlcnRlZAorIHRvIHRoYXQgY2hhcmFjdGVyIG9uIGlucHV0IGR1cmluZyB0ZXh0LW1vZGUgKGRlZmF1bHQpIHBhY2tldCBvcGVyYXRpb25zLgorKi8KKyNpZmRlZiBNQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNpbnRvc2ggKi8KKyNkZWZpbmUgTkxDSEFSIDAxNQorI2Vsc2UKKyNpZmRlZiBPU0sJCQkJLyogT1MtOS82OEsgKi8KKyNkZWZpbmUgTkxDSEFSIDAxNQorI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBVbml4LWxpa2Ugc3lzdGVtcyAqLworI2RlZmluZSBOTENIQVIgMDEyCisjZW5kaWYgLyogT1NLICovCisjZW5kaWYgLyogTUFDICovCisKKy8qCisgQXQgdGhpcyBwb2ludCwgaWYgdGhlcmUncyBhIHN5c3RlbSB0aGF0IHVzZXMgb3JkaW5hcnkgQ1JMRiBsaW5lCisgZGVsaW1pdGF0aW9uIEFORCB0aGUgQyBjb21waWxlciBhY3R1YWxseSByZXR1cm5zIGJvdGggdGhlIENSIGFuZAorIHRoZSBMRiB3aGVuIGRvaW5nIGlucHV0IGZyb20gYSBmaWxlLCB0aGVuICN1bmRlZiBOTENIQVIuCisqLworI2lmZGVmIE9TMgkJCQkvKiBPUy8yICovCisjdW5kZWYgTkxDSEFSCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBHRU1ET1MJCQkJLyogQXRhcmkgU1QgKi8KKyN1bmRlZiBOTENIQVIKKyNlbmRpZiAvKiBHRU1ET1MgKi8KKworLyoKKyAgVk1TIGZpbGUgZm9ybWF0cyBhcmUgc28gY29tcGxpY2F0ZWQgd2UgbmVlZCB0byBkbyBhbGwgdGhlIGNvbnZlcnNpb24KKyAgd29yayBpbiB0aGUgQ0tWRklPIG1vZHVsZSwgc28gd2UgdGVsbCB0aGUgcmVzdCBvZiBDLUtlcm1pdCBub3QgdG8gZmlkZGxlCisgIHdpdGggdGhlIGJ5dGVzLgorKi8KKworI2lmZGVmIHZtcworI3VuZGVmIE5MQ0hBUgorI2VuZGlmIC8qIHZtcyAqLworCisvKiBUaGUgZGV2aWNlIG5hbWUgb2YgYSBqb2IncyBjb250cm9sbGluZyB0ZXJtaW5hbCAqLworLyogU3BlY2lhbCBmb3IgVk1TLCBzYW1lIGZvciBhbGwgVW5peGVzICg/KSwgbm90IHVzZWQgYnkgTWFjaW50b3NoICovCisKKyNpZmRlZiBCRU9TCisjZGVmaW5lIENUVE5BTSBkZnR0eQorI2Vsc2UKKyNpZmRlZiB2bXMKKyNkZWZpbmUgQ1RUTkFNICJTWVMkSU5QVVQ6IgkJLyogKDQgSmFuIDIwMDIpIFdhcyBUVDogKi8KKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKyNkZWZpbmUgQ1RUTkFNICJAb3V0cHV0IgorI2Vsc2UKKyNpZmRlZiBPU0sKK2V4dGVybiBjaGFyIG15dHR5c3RyW107CisjZGVmaW5lIENUVE5BTSBteXR0eXN0cgorI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgQ1RUTkFNICJjb24iCisjZWxzZQorI2lmZGVmIFVOSVgKKyNkZWZpbmUgQ1RUTkFNICIvZGV2L3R0eSIKKyNlbHNlCisjaWZkZWYgR0VNRE9TCisjZGVmaW5lIENUVE5BTSAiYXV4OiIKKyNlbHNlCisjaWZkZWYgU1RSQVRVUworZXh0ZXJuIGNoYXIgbXl0dHlzdHJbXTsKKyNkZWZpbmUgQ1RUTkFNIG15dHR5c3RyCisjZWxzZSAvKiBBbnlvbmUgZWxzZS4uLiAqLworI2RlZmluZSBDVFROQU0gInN0ZG91dCIJCQkvKiBUaGlzIGlzIGEga2x1ZGdlIHVzZWQgYnkgTWFjICovCisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIEdFTURPUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIHZtcyAqLworI2VuZGlmIC8qIEJFT1MgKi8KKworI2lmbmRlZiBIQVZFQ1RUTkFNCisjaWZkZWYgVU5JWAorI2RlZmluZSBIQVZFQ1RUTkFNCisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBIQVZFQ1RUTkFNCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIEhBVkVDVFROQU0gKi8KKworI2lmbmRlZiBaRkNEQVQJCQkJLyogemZjZGF0KCkgZnVuY3Rpb24gYXZhaWxhYmxlPyAqLworI2lmZGVmIFVOSVgKKyNkZWZpbmUgIFpGQ0RBVAorI2Vsc2UKKyNpZmRlZiBTVFJBVFVTCisjZGVmaW5lICBaRkNEQVQKKyNlbHNlCisjaWZkZWYgR0VNRE9TCisjZGVmaW5lICBaRkNEQVQKKyNlbHNlCisjaWZkZWYgQU1JR0EKKyNkZWZpbmUgIFpGQ0RBVAorI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgIFpGQ0RBVAorI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorI2RlZmluZSAgWkZDREFUCisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSAgWkZDREFUCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworI2VuZGlmIC8qIEdFTURPUyAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogWkZDREFUICovCisKKyNpZmRlZiBTVU5TNFM1CisjZGVmaW5lIHRvbG93ZXIgX3RvbG93ZXIKKyNkZWZpbmUgdG91cHBlciBfdG91cHBlcgorI2VuZGlmIC8qIFNVTlM0UzUgKi8KKworLyogRXJyb3IgbnVtYmVyICovCisKKyNpZmRlZiBfQ1JBWQorI2lmZGVmIF9DUkFZQ09NCQkJCS8qIENyYXkgQ29tcHV0ZXIgQ29ycC4gKi8KK2V4dGVybiBpbnQgZXJybm87CisjZWxzZSAvKiBfQ1JBWUNPTSAqLworI2luY2x1ZGUgPGVycm5vLmg+CQkJLyogQ3JheSBSZXNlYXJjaCBVTklDT1MgZGVmaW5lcyAqLworCQkJCQkvKiBlcnJubyBhcyBhIGZ1bmN0aW9uLiAqLworI2VuZGlmIC8qIF9DUkFZQ09NICovCQkJLyogT0sgZm9yIFVOSUNPUyA2LjEgYW5kIDcuMC4gKi8KKyNlbHNlIC8qIF9DUkFZICovCisjaWZkZWYgU1RSQVRVUwkJCQkvKiBTdHJhdHVzIFZPUyAqLworI2luY2x1ZGUgPGVycm5vLmg+CisjZWxzZSAvKiBub3QgU1RSQVRVUyAqLworI2lmbmRlZiBWTVMKKyNpZm5kZWYgT1MyCisjaWZkZWYgX19HTElCQ19fCisvKgorICAiZ2xpYmMgdXNlcyB0aHJlYWRzLCBrZXJtaXQgdXNlcyBnbGliYzsgZXJybm8gYWNjZXNzIGlzIGluIFRocmVhZCBMb2NhbAorICBTdG9yYWdlIChUTFMpIGZyb20gZ2xpYmMtMy4yLjIuICAuLi5hIHRocmVhZCBzcGVjaWZpYyBlcnJubyBpcyBiZWluZyBydW4gaW4KKyAgdGhyZWFkIGxvY2FsIHN0b3JhZ2UgcmVsYXRpdmUgdG8gdGhlICVncyBzZWdtZW50IHJlZ2lzdGVyLCBzbyBzb21lIG1lYW5zIHRvCisgIHJldmVjdG9yIGdldHMvcHV0cyBuZWVkcyB0byBiZSBkb25lLiIgLSBKZWZmIEpvaG5zb24sIFJlZCBIYXQsIEZlYiAyMDAzLgorKi8KKyNpbmNsdWRlIDxlcnJuby5oPgorI2Vsc2UKKy8qCisgIFRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gd291bGQgY2F1c2UgcHJvYmxlbXMgZm9yIFZNUyBhbmQgT1MvMiwgaW4gd2hpY2gKKyAgZXJybm8gaXMgYW4gImV4dGVybiB2b2xhdGlsZSBpbnQgbm9zaGFyZSIuLi4KKyovCisgZXh0ZXJuIGludCBlcnJubzsJCQkvKiBOZWVkZWQgYnkgbW9zdCBtb2R1bGVzLiAqLworI2VuZGlmIC8qIF9fR0xJQkNfXyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBfQ1JBWSAqLworCisjaWZkZWYgcGRwMTEJCQkJLyogVHJ5IHRvIG1ha2Ugc29tZSBzcGFjZSBvbiBQRFAtMTEgKi8KKyNpZm5kZWYgTk9ESUFMCisjZGVmaW5lIE5PRElBTAorI2VuZGlmIC8qIE5PRElBTCAqLworI2lmbmRlZiBOT0NVUlNFUworI2RlZmluZSBOT0NVUlNFUworI2VuZGlmIC8qIE5PQ1VSU0VTICovCisjaWZuZGVmIE5PQklHQlVGCisjZGVmaW5lIE5PQklHQlVGCisjZW5kaWYgLyogTk9CSUdCVUYgKi8KKyNlbmRpZiAvKiBwZHAxMSAqLworCisjaWZuZGVmIE5PQklHQlVGCisjaWZuZGVmIEJJR0JVRk9LCQkJLyogUGxhdGZvcm1zIHdpdGggbG90cyBvZiBtZW1vcnkgKi8KKworI2lmZGVmIFFOWAkJCQkvKiBRTlggKi8KKyNpZm5kZWYgUU5YMTYJCQkJLyogQnV0IG5vdCAxNi1iaXQgdmVyc2lvbnMgKi8KKyNkZWZpbmUgQklHQlVGT0sKKyNlbmRpZiAvKiBRTlgxNiAqLworI2VuZGlmIC8qIFFOWCAqLworCisjaWZkZWYgQlNENDQKKyNkZWZpbmUgQklHQlVGT0sKKyNlbmRpZiAvKiBCU0Q0NCAqLworCisjaWZkZWYgU1RSQVRVUwkJCQkvKiBTdHJhdHVzIFZPUyAqLworI2RlZmluZSBCSUdCVUZPSworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKworI2lmZGVmIHNwYXJjCQkJCS8qIFNQQVJDIHByb2Nlc3NvcnMgKi8KKyNkZWZpbmUgQklHQlVGT0sKKyNlbmRpZiAvKiBzcGFyYyAqLworCisjaWZkZWYgbWlwcwkJCQkvKiBNSVBTIHByb2Nlc3NvcnMgKi8KKyNkZWZpbmUgQklHQlVGT0sKKyNlbmRpZiAvKiBtaXBzICovCisKKyNpZmRlZiBIUFVYOQkJCQkvKiBIUC1VWCA5LnggKi8KKyNkZWZpbmUgQklHQlVGT0sKKyNlbmRpZiAvKiBIUFVYOSAqLworCisjaWZkZWYgSFBVWDEwCQkJCS8qIEhQLVVYIDEwLjAgUEEtUklTQyAqLworI2RlZmluZSBCSUdCVUZPSworI2VuZGlmIC8qIEhQVVgxMCAqLworCisjaWZkZWYgTkVYVAkJCQkvKiBOZVhUU1RFUCAqLworI2lmZGVmIG1jNjgwMDAJCQkJLyogb24gTkVYVCBwbGF0Zm9ybXMuLi4gKi8KKyNkZWZpbmUgQklHQlVGT0sKKyNlbmRpZiAvKiBtYzY4MDAwICovCisjZW5kaWYgLyogTkVYVCAqLworCisjaWZkZWYgTElOVVgJCQkJLyogTGludXggaW4gMTk5OCBzaG91bGQgYmUgT0sgKi8KKyNpZm5kZWYgQklHQlVGT0sKKyNkZWZpbmUgQklHQlVGT0sKKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworI2VuZGlmIC8qIExJTlVYICovCisKKyNpZmRlZiBPUzIJCQkJLyogMzItYml0IE9TLzIgMi54IGFuZCBhYm92ZSAqLworI2lmZGVmIF9fMzJCSVRfXworI2RlZmluZSBCSUdCVUZPSworI2VuZGlmIC8qIF9fMzJCSVRfXyAqLworI2lmZGVmIE5UCisjZGVmaW5lIEJJR0JVRk9LCisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIFBsYW45CQkJCS8qIFBsYW4gOSBpcyBPSyAqLworI2RlZmluZSBCSUdCVUZPSworI2VuZGlmIC8qIFBsYW45ICovCisKKyNpZmRlZiBWTVMJCQkJLyogQW55IFZNUyBpcyBPSyAqLworI2lmbmRlZiBCSUdCVUZPSworI2RlZmluZSBCSUdCVUZPSworI2VuZGlmIC8qIEJJR0JVRk9LICovCisjZW5kaWYgLyogVk1TICovCisKKyNpZmRlZiBfX2FscGhhCQkJCS8qIERFQyA2NC1iaXQgQWxwaGEsIGUuZy4gT1NGLzEgKi8KKyNpZm5kZWYgQklHQlVGT0sJCQkvKiBNaWdodCBhbHJlYWR5IGJlIGRlZmluZWQgZm9yIFZNUyAqLworI2RlZmluZSBCSUdCVUZPSworI2VuZGlmIC8qIEJJR0JVRk9LICovCisjZW5kaWYgLyogX19hbHBoYSAqLworCisjaWZkZWYgc2dpCQkJCS8qIFNHSSB3aXRoIElSSVggNC4wIG9yIGxhdGVyICovCisjaWZuZGVmIEJJR0JVRk9LCisjZGVmaW5lIEJJR0JVRk9LCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKyNlbmRpZiAvKiBzZ2kgKi8KKworI2lmZGVmIEFJWFJTCQkJCS8qIEFJWCBvbiBSSVNDICovCisjZGVmaW5lIEJJR0JVRk9LCisjZW5kaWYgLyogQUlYUlMgKi8KKworI2lmZGVmIENLX1NDT1Y1CQkJCS8qIFNDTyBPU1I1ICovCisjaWZuZGVmIEJJR0JVRk9LCisjZGVmaW5lIEJJR0JVRk9LCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKyNlbmRpZiAvKiBDS19TQ09WNSAqLworCisjaWZkZWYgU09MQVJJUwkJCQkvKiBTb2xhcmlzIHg4NiAqLworI2lmbmRlZiBCSUdCVUZPSworI2RlZmluZSBCSUdCVUZPSworI2VuZGlmIC8qIEJJR0JVRk9LICovCisjZW5kaWYgLyogU09MQVJJUyAqLworCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKyNlbmRpZiAvKiBOT0JJR0JVRiAqLworCisjaWZkZWYgQ0tfU01BTEwKKyNpZmRlZiBCSUdCVUZPSworI3VuZGVmIEJJR0JVRk9LCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKyNlbmRpZiAvKiBDS19TTUFMTCAqLworCisvKiBJZiAibWVtb3J5IGlzIG5vIHByb2JsZW0iIHRoZW4gdGhpcyBpbXByb3ZlcyBwZXJmb3JtYW5jZSAqLworCisjaWZkZWYgREVCVUcKKyNpZmRlZiBCSUdCVUZPSworI2lmbmRlZiBJRkRFQlVHCisjZGVmaW5lIElGREVCVUcKKyNlbmRpZiAvKiBJRkRFQlVHICovCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZuZGVmIERFQlVHCisvKiBDb21waWxlIGFsbCB0aGUgZGVidWcoKSBzdGF0ZW1lbnRzIGF3YXkuICBTYXZlcyBhIGxvdCBvZiBzcGFjZSBhbmQgdGltZS4gKi8KKyNkZWZpbmUgZGVidWcoYSxiLGMsZCkKKyNkZWZpbmUgaGV4ZHVtcChhLGIsYykKKy8qIE5vdyBkZWZpbmUgdGhlIGRlYnVnKCkgbWFjcm8uICovCisjZWxzZSAvKiBERUJVRyAqLworX1BST1RPVFlQKGludCBkb2RlYnVnLChpbnQsY2hhciAqLGNoYXIgKixsb25nKSk7CitfUFJPVE9UWVAoaW50IGRvaGV4ZHVtcCwoQ0hBUiAqLENIQVIgKixpbnQpKTsKKyNpZmRlZiBJRkRFQlVHCisvKiBVc2UgdGhpcyBmb3JtIHRvIGF2b2lkIGZ1bmN0aW9uIGNhbGxzOiAqLworI2lmZGVmIENPTU1FTlQKKyNkZWZpbmUgZGVidWcoYSxiLGMsZCkgaWYgKGRlYmxvZykgZG9kZWJ1ZyhhLGIsKGNoYXIgKikoYyksKGxvbmcpZCkKKyNkZWZpbmUgaGV4ZHVtcChhLGIsYykgaWYgKGRlYmxvZykgZG9oZXhkdW1wKChDSEFSICopKGEpLChDSEFSICopKGIpLGMpCisjZWxzZQorI2lmZGVmIENLX0FOU0lDCisjZGVmaW5lIGRlYnVnKGEsYixjLGQpICgodm9pZCkoZGVibG9nP2RvZGVidWcoYSxiLChjaGFyICopKGMpLChsb25nKWQpOjApKQorI2RlZmluZSBoZXhkdW1wKGEsYixjKSAoKHZvaWQpKGRlYmxvZz9kb2hleGR1bXAoKENIQVIgKikoYSksKENIQVIgKikoYiksYyk6MCkpCisjZWxzZQorI2RlZmluZSBkZWJ1ZyhhLGIsYyxkKSAoZGVibG9nP2RvZGVidWcoYSxiLChjaGFyICopKGMpLChsb25nKWQpOjApCisjZGVmaW5lIGhleGR1bXAoYSxiLGMpIChkZWJsb2c/ZG9oZXhkdW1wKChDSEFSICopKGEpLChDSEFSICopKGIpLGMpOjApCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisjZWxzZSAvKiBJRkRFQlVHICovCisvKiBVc2UgdGhpcyBmb3JtIHRvIHNhdmUgc3BhY2U6ICovCisjZGVmaW5lIGRlYnVnKGEsYixjLGQpIGRvZGVidWcoYSxiLChjaGFyICopKGMpLChsb25nKWQpCisjZGVmaW5lIGhleGR1bXAoYSxiLGMpIGRvaGV4ZHVtcCgoQ0hBUiAqKShhKSwoQ0hBUiAqKShiKSxjKQorI2VuZGlmIC8qIElGREVCVUcgKi8KKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiBGaWxlIFN5c3RlbSBEZWZhdWx0cyAqLworCisjaWZuZGVmIFVJREJVRkxFTgkJCS8qIExlbmd0aCBvZiBVc2VyIElEICovCisjaWZkZWYgT1MyCisjZGVmaW5lIFVJREJVRkxFTiAyNTYKKyNlbHNlIC8qIE9TMiAqLworI2lmZGVmIEJJR0JVRk9LCisjZGVmaW5lIFVJREJVRkxFTiAyNTYKKyNlbHNlCisjZGVmaW5lIFVJREJVRkxFTiA2NAorI2VuZGlmIC8qIEJJR0JVRk9LICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVUlEQlVGTEVOICovCisKKyNpZmRlZiBVTklYCisjaWZkZWYgUFJPVlgxCisjZGVmaW5lIE1BWFdMRCA1MAorI2Vsc2UKKyNpZmRlZiBwZHAxMQorI2RlZmluZSBNQVhXTEQgNTAKKyNlbHNlCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgTUFYV0xEIDEwMjQwMAorI2Vsc2UKKyNkZWZpbmUgTUFYV0xEIDEwMjQKKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworI2VuZGlmIC8qIHBkcDExICovCisjZW5kaWYgLyogUFJPVlgxICovCisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBNQVhXTEQgMTAyNDAwCQkJLyogTWF4aW11bSB3aWxkY2FyZCBmaWxlbmFtZXMgKi8KKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKyNkZWZpbmUgTUFYV0xEIDUwMAorI2Vsc2UKKyNpZmRlZiBTVFJBVFVTCisjZGVmaW5lIE1BWFdMRCA1MDAwCisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZkZWYgVk1TCisjZGVmaW5lIERCTEtTSVogNTEyCisjZGVmaW5lIERMUkVDTCA1MTIKKyNlbHNlCisjZGVmaW5lIERCTEtTSVogMAorI2RlZmluZSBETFJFQ0wgMAorI2VuZGlmIC8qIFZNUyAqLworCisvKiBDb21tdW5pY2F0aW9uIGRldmljZSAvIG5ldHdvcmsgaG9zdCBuYW1lIGxlbmd0aCAqLworCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgVFROQU1MRU4gNTEyCisjZWxzZQorI2lmZGVmIE1BQworI2RlZmluZSBUVE5BTUxFTiAyNTYKKyNlbHNlCisjaWZuZGVmIENLX1NNQUxMCisjZGVmaW5lIFRUTkFNTEVOIDEyOAorI2Vsc2UKKyNkZWZpbmUgVFROQU1MRU4gODAKKyNlbmRpZiAvKiBDS19TTUFMTCAqLworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIEJJR0JVRk9LICovCisKKy8qIFByb2dyYW0gcmV0dXJuIGNvZGVzIGZvciBERUNVUyBDIGFuZCBVTklYIChWTVMgdXNlcyBVTklYIGNvZGVzKSAqLworCisjaWZkZWYgZGVjdXMKKyNkZWZpbmUgR09PRF9FWElUICAgSU9fTk9STUFMCisjZGVmaW5lIEJBRF9FWElUICAgIElPX0VSUk9SCisjZWxzZQorI2RlZmluZSBHT09EX0VYSVQgICAwCisjZGVmaW5lIEJBRF9FWElUICAgIDEKKyNlbmRpZiAvKiBkZWN1cyAqLworCisvKiBTcGVjaWFsIGhhY2sgZm9yIEZvcnR1bmUsIHdoaWNoIGRvZXNuJ3QgaGF2ZSA8c3lzL2ZpbGUuaD4uLi4gKi8KKworI2lmZGVmIEZUMTgKKyNkZWZpbmUgRlJFQUQgMHgwMQorI2RlZmluZSBGV1JJVEUgMHgxMAorI2VuZGlmIC8qIEZUMTggKi8KKworLyogU3BlY2lhbCBoYWNrIGZvciBPUy05LzY4ayAqLworI2lmZGVmIE9TSworI2lmbmRlZiBfVUNDCisjZGVmaW5lIFNJR0FMUk0gMzAJCQkvKiBNYXkgYWx3YXlzIGNhbmNlbCBJL08gKi8KKyNlbmRpZiAvKiBfVUNDICovCisjZGVmaW5lIFNJR0FSQgkxMjM0CQkJLyogQXJiaXRyYXJ5IGZvciBJL08gKi8KK1NJR1RZUCAoKnNpZ25hbCgpKSgpOworI2VuZGlmIC8qIE9TSyAqLworCisjaWZkZWYgTUlOSVgKKyNpZmRlZiBwdXRjaGFyCisjdW5kZWYgcHV0Y2hhcgorI2VuZGlmIC8qIHB1dGNoYXIgKi8KKyNkZWZpbmUgcHV0Y2hhcihjKSAocHV0YyhjLHN0ZG91dCkhPUVPRikmJmZmbHVzaChzdGRvdXQpCisjZW5kaWYgLyogTUlOSVggKi8KKworI2lmZGVmIGRhdGFnZW5lcmFsCQkJLyogRGF0YSBHZW5lcmFsIEFPUy9WUyAqLworI2lmZGVmIHB1dGNoYXIKKyN1bmRlZiBwdXRjaGFyCisjZW5kaWYgLyogcHV0Y2hhciAqLworI2RlZmluZSBwdXRjaGFyKGMpIGNvbm9jKGMpCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKworLyogRXNjYXBlL3F1b3RlIGNoYXJhY3RlciB1c2VkIGJ5IHRoZSBjb21tYW5kIHBhcnNlciAqLworCisjZGVmaW5lIENNRFEgJ1xcJworCisvKiBTeW1ib2xzIGZvciBSUy0yMzIgbW9kZW0gc2lnbmFscyAqLworCisjZGVmaW5lIEtNX0ZHICAgIDEJCQkvKiBGcmFtZSBncm91bmQgKi8KKyNkZWZpbmUgS01fVFhEICAgMgkJCS8qIFRyYW5zbWl0ICovCisjZGVmaW5lIEtNX1JYRCAgIDMJCQkvKiBSZWNlaXZlICovCisjZGVmaW5lIEtNX1JUUyAgIDQJCQkvKiBSZXF1ZXN0IHRvIFNlbmQgKi8KKyNkZWZpbmUgS01fQ1RTICAgNQkJCS8qIENsZWFyIHRvIFNlbmQgKi8KKyNkZWZpbmUgS01fRFNSICAgNgkJCS8qIERhdGEgU2V0IFJlYWR5ICovCisjZGVmaW5lIEtNX1NHICAgIDcJCQkvKiBTaWduYWwgZ3JvdW5kICovCisjZGVmaW5lIEtNX0RDRCAgIDgJCQkvKiBDYXJyaWVyIERldGVjdCAqLworI2RlZmluZSBLTV9EVFIgIDIwCQkJLyogRGF0YSBUZXJtaW5hbCBSZWFkeSAqLworI2RlZmluZSBLTV9SSSAgIDIyCQkJLyogUmluZyBJbmRpY2F0aW9uICovCisKKy8qIEJpdCBtYXNrIHZhbHVlcyBmb3IgbW9kZW0gc2lnbmFscyAqLworCisjZGVmaW5lIEJNX0NUUyAgIDAwMDEJCQkvKiBDbGVhciB0byBzZW5kICAgICAgIChGcm9tIERDRSkgKi8KKyNkZWZpbmUgQk1fRFNSICAgMDAwMgkJCS8qIERhdGFzZXQgcmVhZHkgICAgICAgKEZyb20gRENFKSAqLworI2RlZmluZSBCTV9EQ0QgICAwMDA0CQkJLyogQ2FycmllciAgICAgICAgICAgICAoRnJvbSBEQ0UpICovCisjZGVmaW5lIEJNX1JORyAgIDAwMTAJCQkvKiBSaW5nIEluZGljYXRvciAgICAgIChGcm9tIERDRSkgKi8KKyNkZWZpbmUgQk1fRFRSICAgMDAyMAkJCS8qIERhdGEgVGVybWluYWwgUmVhZHkgKEZyb20gRFRFKSAqLworI2RlZmluZSBCTV9SVFMgICAwMDQwCQkJLyogUmVxdWVzdCB0byBTZW5kICAgICAoRnJvbSBEVEUpICovCisKKy8qIENvZGVzIGZvciBmdWxsIGR1cGxleCBmbG93IGNvbnRyb2wgKi8KKworI2RlZmluZSBGTE9fTk9ORSAwCQkJLyogTm9uZSAqLworI2RlZmluZSBGTE9fWE9OWCAxCQkJLyogWG9uL1hvZmYgKHNvZnQpICovCisjZGVmaW5lIEZMT19SVFNDIDIJCQkvKiBSVFMvQ1RTIChoYXJkKSAqLworI2RlZmluZSBGTE9fRFRSQyAzCQkJLyogRFRSL0NEIChoYXJkKSAqLworI2RlZmluZSBGTE9fRVRYQSA0CQkJLyogRVRYL0FDSyAoc29mdCkgKi8KKyNkZWZpbmUgRkxPX1NUUkcgNQkJCS8qIFN0cmluZy1iYXNlZCAoc29mdCkgKi8KKyNkZWZpbmUgRkxPX0RJQUwgNgkJCS8qIERJQUxpbmcga2x1ZGdlICovCisjZGVmaW5lIEZMT19ESUFYIDcJCQkvKiBDYW5jZWwgZGlhbGluZyBrbHVkZ2UgKi8KKyNkZWZpbmUgRkxPX0RUUlQgOAkJCS8qIERUUi9DVFMgKGhhcmQpICovCisjZGVmaW5lIEZMT19LRUVQIDkJCQkvKiBLZWVwLCBpLmUuIGRvbid0IHRvdWNoIG9yIGNoYW5nZSAqLworI2RlZmluZSBGTE9fQVVUTyAxMAkJCS8qIEZpZ3VyZSBvdXQgYXV0b21hdGljYWxseSAqLworCisvKiBUeXBlcyBvZiBjb25uZWN0aW9ucyAqLworCisjZGVmaW5lIENYVF9SRU1PVEUgIDAJCQkvKiBSZW1vdGUgbW9kZSAtIG5vIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgQ1hUX0RJUkVDVCAgMQkJCS8qIERpcmVjdCBzZXJpYWwgY29ubmVjdGlvbiAqLworI2RlZmluZSBDWFRfTU9ERU0gICAyCQkJLyogTW9kZW0gZGlhbG91dCAqLworI2RlZmluZSBDWFRfVENQSVAgICAzCQkJLyogVENQL0lQIC0gVGVsbmV0LCBSbG9naW4sIGV0YyAqLworI2RlZmluZSBDWFRfWDI1ICAgICA0CQkJLyogWC4yNSBwZWVyLXRvLXBlZXIgKi8KKyNkZWZpbmUgQ1hUX0RFQ05FVCAgNQkJCS8qIERFQ25ldCAoQ1RFUk0sIGV0YykgKi8KKyNkZWZpbmUgQ1hUX0xBVCAgICAgNgkJCS8qIExBVCAqLworI2RlZmluZSBDWFRfTkVUQklPUyA3CQkJLyogTkVUQklPUyAqLworI2RlZmluZSBDWFRfTlBJUEUgICA4CQkJLyogTmFtZWQgUGlwZSAqLworI2RlZmluZSBDWFRfUElQRSAgICA5CQkJLyogUGlwZSwgQ29tbWFuZCwgUFRZLCBETEwsIGV0YyAqLworI2RlZmluZSBDWFRfU1NIICAgICAxMCAgICAgICAgICAgICAgICAgIC8qIFNTSCAqLworI2RlZmluZSBDWFRfTUFYICAgICAxMAkJCS8qIEhpZ2hlc3QgY29ubmVjdGlvbiB0eXBlICovCisKKy8qIEF1dG9kb3dubG9hZCBEZXRlY3Rpb24gT3B0aW9ucyAqLworCisjZGVmaW5lIEFETF9QQUNLIDAJCQkvKiBBdXRvLURvd25sb2FkIGRldGVjdCBwYWNrZXQgKi8KKyNkZWZpbmUgQURMX1NUUiAgMQkJCS8qIEF1dG8tRG93bmxvYWQgZGV0ZWN0IHN0cmluZyAqLworCisvKiBBbmQgZmluYWxseS4uLiAqLworCisjaWZkZWYgQ09NTUVOVAkJCQkvKiBNYWtlIHN1cmUgdGhpcyBpcyBOT1QgZGVmaW5lZCEgKi8KKyN1bmRlZiBDT01NRU5UCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisvKiB6c3RyIHphdHRyIGZpbGluZm8gd2VyZSBoZXJlIChtb3ZlZCB0byB0b3AgZm9yIERFQ0MgNSBKdW4gMjAwMCkgKi8KKworI2lmbmRlZiBaRk5RRlAJCQkJLyogVmVyc2lvbnMgdGhhdCBoYXZlIHpmbnFmcCgpICovCisjaWZkZWYgVU5JWAorI2RlZmluZSBaRk5RRlAKKyNlbHNlCisjaWZkZWYgVk1TCisjZGVmaW5lIFpGTlFGUAorI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgWkZOUUZQCisjZWxzZQorI2lmZGVmIGRhdGFnZW5lcmFsCisjZGVmaW5lIFpGTlFGUAorI2Vsc2UKKyNpZmRlZiBTVFJBVFVTCisjZGVmaW5lIFpGTlFGUAorI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFVOSVggKi8KK3N0cnVjdCB6Zm5mcCB7CisgICBpbnQgbGVuOwkJCQkvKiBMZW5ndGggb2YgZnVsbCBwYXRobmFtZSAqLworICAgY2hhciAqIGZwYXRoOwkJCS8qIFBvaW50ZXIgdG8gZnVsbCBwYXRobmFtZSAqLworICAgY2hhciAqIGZuYW1lOwkJCS8qIFBvaW50ZXIgdG8gbmFtZSBwYXJ0ICovCit9OworI2VuZGlmIC8qIFpGTlFGUCAqLworCisvKiBTeXN0ZW1zIHRoYXQgc3VwcG9ydCBGSUxFIFRZUEUgTEFCRUxFRCAqLworCisjaWZkZWYgVk1TCisjZGVmaW5lIENLX0xBQkVMRUQKKyNlbHNlCisjaWZkZWYgT1MyCisjaWZkZWYgX18zMkJJVF9fCisjaWZuZGVmIE5UCisjZGVmaW5lIENLX0xBQkVMRUQKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIF9fMzJCSVRfXyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFZNUyAqLworCisvKiBMQUJFTEVEIEZJTEUgb3B0aW9ucyBiaXRtYXNrICovCisKKyNpZmRlZiBWTVMJCQkJLyogRm9yIFZNUyAqLworI2RlZmluZSBMQkxfTkFNICAxCQkJLyogSWdub3JlIGluY29taW5nIG5hbWUgaWYgc2V0ICovCisjZGVmaW5lIExCTF9QVEggIDIJCQkvKiBVc2UgY29tcGxldGUgcGF0aCBpZiBzZXQgKi8KKyNkZWZpbmUgTEJMX0FDTCAgNAkJCS8qIFByZXNlcnZlIEFDTHMgaWYgc2V0ICovCisjZGVmaW5lIExCTF9CQ0sgIDgJCQkvKiBQcmVzZXJ2ZSBiYWNrdXAgZGF0ZSBpZiBzZXQgKi8KKyNkZWZpbmUgTEJMX09XTiAxNgkJCS8qIFByZXNlcnZlIG93bmVyc2hpcCBpZiBzZXQgKi8KKworI2Vsc2UKKworI2lmZGVmIE9TMgkJCQkvKiBEaXR0byBmb3IgT1MvMiAqLworI2RlZmluZSBMQkxfTk9SICAweDAwMDAJCQkvKiBOb3JtYWwgZmlsZSAqLworI2RlZmluZSBMQkxfQVJDICAweDAwMjAJCQkvKiBBcmNoaXZlICovCisjZGVmaW5lIExCTF9ESVIgIDB4MDAxMAkJCS8qIERpcmVjdG9yeSAqLworI2RlZmluZSBMQkxfSElEICAweDAwMDIJCQkvKiBIaWRkZW4gZmlsZSAqLworI2RlZmluZSBMQkxfUk8gICAweDAwMDEJCQkvKiBSZWFkIG9ubHkgZmlsZSAqLworI2RlZmluZSBMQkxfU1lTICAweDAwMDQJCQkvKiBTeXN0ZW0gZmlsZSAqLworI2RlZmluZSBMQkxfRVhUICAweDAwNDAJCQkvKiBFeHRlbmRlZCAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFZNUyAqLworCisvKgorICBEYXRhIHR5cGVzLiAgRmlyc3QgdGhlIGhlYWRlciBmaWxlIGZvciBkYXRhIHR5cGVzIHNvIHdlIGNhbiBwaWNrIHVwIHRoZQorICB0eXBlcyB1c2VkIGZvciBwaWRzLCB1aWRzLCBhbmQgZ2lkcy4gIE92ZXJyaWRlIHRoaXMgc2VjdGlvbiBieSBwdXR0aW5nCisgIC1EQ0tUWVBfSD14eHggb24gdGhlIGNvbW1hbmQgbGluZSB0byBzcGVjaWZ5IHRoZSBoZWFkZXIgZmlsZSB3aGVyZSB5b3VyCisgIHN5c3RlbSBkZWZpbmVzIHRoZXNlIHR5cGVzLgorKi8KKyNpZm5kZWYgU1RSQVRVUworI2lmZGVmIF9fQUxQSEEKKyNpZmRlZiBNVUxUSU5FVAorI2RlZmluZSBDS19UR1ZfQVhQCisjZW5kaWYgLyogTVVMVElORVQgKi8KKyNlbmRpZiAvKiBfX0FMUEhBICovCisKKyNpZmRlZiBDS19UR1ZfQVhQCQkJLyogQWxwaGEsIFZNUywgTXVsdGlOZXQgKi8KKy8qCisgIFN0YXJ0aW5nIGluIERFQ0MgNS4wLCA8c3RkbGliLmg+IG5vIGxvbmdlciBpbmNsdWRlcyA8dHlwZXMuaD4uCisgIEJ1dCBiZWZvcmUgdGhhdCBhbiBlbGFib3JhdGUgd29ya2Fyb3VuZCBpcyByZXF1aXJlZCwgd2hpY2ggcmVzdWx0cyBpbgorICBpbmNsdWRpbmcgPHR5cGVzLmg+IHNvbWV0aW1lcyBidXQgbm90IG90aGVycywgZXZpZGVudGx5IGRlcGVuZGluZyBvbiB3aGV0aGVyCisgIDx0eXBlcy5oPiBwcm90ZWN0cyBpdHNlbGYgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24sIHdoaWNoIGluIHR1cm4gcHJvYmFibHkKKyAgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBERUNDIDx0eXBlcy5oPiBhbmQgVEdWIDx0eXBlcy5oPi4gIFVuZm9ydHVuYXRlbHkgSQorICBkb24ndCByZW1lbWJlciB0aGUgZGV0YWlscy4gIChmZGMsIDI1IE9jdCA5NikKKyovCisjaWZkZWYgQ09NTUVOVAorLyoKKyAgUHJldmlvdXNseSB0aGUgdGVzdCBoZXJlIHdhcyBmb3IgREVDIHZlcnNpb24gcHJpb3IgdG8gNC4wLCBidXQgc2luY2UgdGhlCisgIHRlc3QgaW52b2x2ZWQgYW4gIiNpZiIgc3RhdGVtZW50LCBpdCB3YXMgbm90IHBvcnRhYmxlIGFuZCBicm9rZSBzb21lIG5vbi1WTVMKKyAgYnVpbGRzLiAgSW4gYW55IGNhc2UsIGNvbmRpdGlvbiB3YXMgbmV2ZXIgc2F0aXNmaWVkLCBzbyB0aGUgcmVzdWx0IG9mCisgIGNvbW1lbnRpbmcgdGhpcyBzZWN0aW9uIG91dCBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgIiNpZiIgY29uZGl0aW9uLgorKi8KKyNpZm5kZWYgX19UWVBFU19MT0FERUQKKyNkZWZpbmUgX19UWVBFU19MT0FERUQJCQkvKiBXb3JrIGFyb3VuZCBidWcgaW4gLmggZmlsZXMgKi8KKyNlbmRpZiAvKiBfX1RZUEVTX0xPQURFRCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBJRl9ET1RfSAorI2lmbmRlZiBNVUxUSU5FVAorI2luY2x1ZGUgPGlmLmg+CQkJCS8qIE5lZWRlZCB0byBwdXQgdXAgdV9pbnQgdHlwZWRlZiAqLworI2VuZGlmIC8qIE1VTFRJTkVUICovCisjZWxzZSAvKiBJRl9ET1RfSCAqLworI2lmZGVmIE5FRURVSU5UCit0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDsKKyNlbmRpZiAvKiBORUVEVUlOVCAqLworI2VuZGlmIC8qIElGX0RPVF9IICovCisjZWxzZQkJCQkJLyogIUNLX1RHVl9BWFAgKi8KKyNpZmRlZiBPU0sJCQkJLyogT1MtOSAqLworI2luY2x1ZGUgPHR5cGVzLmg+CisjZWxzZQkJCQkJLyogR2VuZXJhbCBjYXNlLCBub3QgT1MtOSAqLworI2lmbmRlZiBDS1RZUF9ICisjaWZuZGVmIFZNUworI2lmbmRlZiBNQUMKKyNpZm5kZWYgQU1JR0EKKyNkZWZpbmUgQ0tUWVBfSCA8c3lzL3R5cGVzLmg+CisjZW5kaWYgLyogQU1JR0EgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBDS1RZUF9IICovCisKKyNpZmRlZiBHRU1ET1MKKyN1bmRlZiBDS1RZUF9ICisjaW5jbHVkZSA8dHlwZXMuaD4KKyNlbmRpZiAvKiBHRU1ET1MgKi8KKworI2lmZGVmIE9TMgorI3VuZGVmIENLVFlQX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIENLVFlQX0gJCQkJLyogSW5jbHVkZSBpdC4gKi8KKyNpZmRlZiBDT0hFUkVOVAkJCQkvKiBFeGNlcHQgZm9yIENPSEVSRU5UICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZWxzZQorI2lmZGVmIGRhdGFnZW5lcmFsCQkJLyogQU9TL1ZTICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZWxzZSAgLyogQWxsIG90aGVycyAqLworI2lmZGVmIF9fYnNkaV9fCQkJCS8qIEJTREkgKi8KKyNpZmRlZiBQT1NJWAorI3VuZGVmIF9QT1NJWF9TT1VSQ0UKKyNlbmRpZiAvKiBQT1NJWCAqLworI2VuZGlmIC8qIF9fYnNkaV9fICovCisjaW5jbHVkZSBDS1RZUF9ICisjaWZkZWYgX19ic2RpX18KKyNpZmRlZiBQT1NJWAorI2RlZmluZSBfUE9TSVhfU09VUkNFCisjZW5kaWYgLyogUE9TSVggKi8KKyNlbmRpZiAvKiBfX2JzZGlfXyAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBDS1RZUF9IICovCisKKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBDS19UR1ZfQVhQICovCisjZW5kaWYgLyogU1RSQVRVUyAqLwkJCS8qIEVuZCBvZiB0eXBlcy5oIHNlY3Rpb24gKi8KKworLyoKKyAgRGF0YSB0eXBlIGZvciBwaWRzLiAgSWYgeW91ciBzeXN0ZW0gdXNlcyBhIGRpZmZlcmVudCB0eXBlLCBwdXQgc29tZXRoaW5nCisgIGxpa2UgLURQSURfVD1waWRfdCBvbiBjb21tYW5kIGxpbmUsIG9yIG92ZXJyaWRlIGhlcmUuCisqLworI2lmbmRlZiBQSURfVAorI2RlZmluZSBQSURfVCBpbnQKKyNlbmRpZiAvKiBQSURfVCAqLworLyoKKyAgRGF0YSB0eXBlcyBmb3IgdWlkcyBhbmQgZ2lkcy4gIFNhbWUgZGVhbCBhcyBmb3IgcGlkcy4KKyAgV291bGRuJ3QgYmUgbmljZSBpZiB0aGVyZSB3YXMgYSBwcmVwcm9jZXNzb3IgdGVzdCB0byBmaW5kIG91dCBpZiBhCisgIHR5cGVkZWYgZXhpc3RlZD8KKyovCisjaWZkZWYgVk1TCisvKiBOb3QgdXNlZCBpbiBWTVMgc28gd2hvIGNhcmVzICovCisjZGVmaW5lIFVJRF9UIGludAorI2RlZmluZSBHSURfVCBpbnQKKyNlbmRpZiAvKiBWTVMgKi8KKworI2lmZGVmIFBPU0lYCisvKiBPciB3b3VsZCBpdCBiZSBiZXR0ZXIgKG9yIHdvcnNlPykgdG8gdXNlIF9QT1NJWF9TT1VSQ0UgaGVyZT8gKi8KKyNpZm5kZWYgVUlEX1QKKyNkZWZpbmUgVUlEX1QgdWlkX3QKKyNlbmRpZiAvKiBVSURfVCAqLworI2lmbmRlZiBHSURfVAorI2RlZmluZSBHSURfVCBnaWRfdAorI2VuZGlmIC8qIEdJRF9UICovCisjZWxzZSAvKiBOb3QgUE9TSVggKi8KKyNpZmRlZiBTVlI0CisvKiBTVlI0IGFuZCBsYXRlciBoYXZlIHVpZF90IGFuZCBnaWRfdC4gKi8KKy8qIFNWUjMgYW5kIGVhcmxpZXIgdXNlIGludCwgb3IgdW5zaWduZWQgc2hvcnQsIG9yLi4uLiAqLworI2lmbmRlZiBVSURfVAorI2RlZmluZSBVSURfVCB1aWRfdAorI2VuZGlmIC8qIFVJRF9UICovCisjaWZuZGVmIEdJRF9UCisjZGVmaW5lIEdJRF9UIGdpZF90CisjZW5kaWYgLyogR0lEX1QgKi8KKyNlbHNlIC8qIE5vdCBTVlI0ICovCisjaWZkZWYgQlNENDMKKyNpZm5kZWYgVUlEX1QKKyNkZWZpbmUgVUlEX1QgdWlkX3QKKyNlbmRpZiAvKiBVSURfVCAqLworI2lmbmRlZiBHSURfVAorI2RlZmluZSBHSURfVCBnaWRfdAorI2VuZGlmIC8qIEdJRF9UICovCisjZWxzZSAvKiBOb3QgQlNENDMgKi8KKy8qIERlZmF1bHQgdGhlc2UgdG8gaW50IGZvciBvbGRlciBVTklYIHZlcnNpb25zICovCisjaWZuZGVmIFVJRF9UCisjZGVmaW5lIFVJRF9UIGludAorI2VuZGlmIC8qIFVJRF9UICovCisjaWZuZGVmIEdJRF9UCisjZGVmaW5lIEdJRF9UIGludAorI2VuZGlmIC8qIEdJRF9UICovCisjZW5kaWYgLyogQlNENDMgKi8KKyNlbmRpZiAvKiBTVlI0ICAqLworI2VuZGlmIC8qIFBPU0lYICovCisKKy8qCisgIGdldHB3dWlkKCkgYXJnIHR5cGUsIHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyBVSURfVCwKKyAgZS5nLiBpbiBTQ08gVU5JWCBTVlIzLCBpdCdzIGludC4KKyovCisjaWZuZGVmIFBXSURfVAorI2RlZmluZSBQV0lEX1QgVUlEX1QKKyNlbmRpZiAvKiBQV0lEX1QgKi8KKworI2lmZGVmIENLX1JFRElSCisjaWZkZWYgTkVYVAorI2RlZmluZSBNQUNIV0FJVAorI2Vsc2UKKyNpZmRlZiBNQUNICisjZGVmaW5lIE1BQ0hXQUlUCisjZW5kaWYgLyogTUFDSCAqLworI2VuZGlmIC8qIE5FWFQgKi8KKworI2lmZGVmIE1BQ0hXQUlUCQkJCS8qIFdBSVRfVCBhcmd1bWVudCBmb3Igd2FpdCgpICovCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNkZWZpbmUgQ0tfV0FJVF9ICit0eXBlZGVmIHVuaW9uIHdhaXQgV0FJVF9UOworI2Vsc2UKKyNpZmRlZiBQT1NJWAorI2lmZGVmIE9TRgorLyogT1NGIHdhaXQuaCBkZWZpbmVzIEJTRCB3YWl0IGlmIF9CU0QgaXMgZGVmaW5lZCBzbyAgaGlkZSBfQlNEIGZyb20gd2FpdC5oICovCisjaWZkZWYgX0JTRAorI2RlZmluZSBDS19PU0ZfQlNECisjdW5kZWYgIF9CU0QKKyNlbmRpZiAvKiBfQlNEICovCisjZW5kaWYgLyogT1NGICovCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNkZWZpbmUgQ0tfV0FJVF9ICisjaWZuZGVmIFdBSVRfVAordHlwZWRlZiBpbnQgV0FJVF9UOworI2VuZGlmIC8qIFdBSVRfVCAqLworI2lmZGVmIENLX09TRl9CU0QJCQkvKiBPU0YvMTogUmVzdG9yZSAgX0JTRCBkZWZpbml0aW9uICovCisjZGVmaW5lIF9CU0QKKyN1bmRlZiBDS19PU0ZfQlNECisjZW5kaWYgLyogQ0tfT1NGX0JTRCAqLworI2Vsc2UgLyogIVBPU0lYICovCit0eXBlZGVmIGludCBXQUlUX1Q7CisjZW5kaWYgLyogUE9TSVggKi8KKyNlbmRpZiAvKiBNQUNIV0FJVCAqLworI2Vsc2UKK3R5cGVkZWYgaW50IFdBSVRfVDsKKyNlbmRpZiAvKiBDS19SRURJUiAqLworCisvKiBBc3NvcnRlZCBvdGhlciBibGFoX3QncyBoYW5kbGVkIGhlcmUuLi4gKi8KKworI2lmbmRlZiBTSVpFX1QKKyNkZWZpbmUgU0laRV9UIHNpemVfdAorI2VuZGlmIC8qIFNJWkVfVCAqLworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBzeXN0ZW0tZGVwZW5kZW50IGZ1bmN0aW9ucyBjYWxsYWJsZSBmcm9tIGFsbCAqLworLyogQy1LZXJtaXQgbW9kdWxlcy4gKi8KKworLyogRmlsZS1yZWxhdGVkIGZ1bmN0aW9ucyBmcm9tIHN5c3RlbS1kZXBlbmRlbnQgZmlsZSBpL28gbW9kdWxlICovCisKKyNpZm5kZWYgQ0tWRklPX0MKKy8qIEZvciBzb21lIHJlYXNvbiwgdGhpcyBkb2VzIG5vdCBhZ3JlZSB3aXRoIERFQyBDICovCitfUFJPVE9UWVAoIGludCB6a3NlbGYsICh2b2lkKSApOworI2VuZGlmIC8qIENLVkZJT19DICovCitfUFJPVE9UWVAoIGludCB6b3BlbmksIChpbnQsIGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IHpvcGVubywgKGludCwgY2hhciAqLCBzdHJ1Y3QgemF0dHIgKiwgc3RydWN0IGZpbGluZm8gKikgKTsKK19QUk9UT1RZUCggaW50IHpjbG9zZSwgKGludCkgKTsKKyNpZm5kZWYgTUFDCitfUFJPVE9UWVAoIGludCB6Y2hpbiwgKGludCwgaW50ICopICk7CisjZW5kaWYgLyogTUFDICovCitfUFJPVE9UWVAoIGludCB6eGluLCAoaW50LCBjaGFyICosIGludCkgKTsKK19QUk9UT1RZUCggaW50IHpzaW5sLCAoaW50LCBjaGFyICosIGludCkgKTsKK19QUk9UT1RZUCggaW50IHppbmZpbGwsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgenNvdXQsIChpbnQsIGNoYXIqKSApOworX1BST1RPVFlQKCBpbnQgenNvdXRsLCAoaW50LCBjaGFyKikgKTsKK19QUk9UT1RZUCggaW50IHpzb3V0eCwgKGludCwgY2hhciosIGludCkgKTsKK19QUk9UT1RZUCggaW50IHpjaG91dCwgKGludCwgY2hhcikgKTsKK19QUk9UT1RZUCggaW50IHpvdXRkdW1wLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHpzeXNjbWQsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCB6c2hjbWQsIChjaGFyICopICk7CisjaWZkZWYgVU5JWAorX1BST1RPVFlQKCBpbnQgenNldGZpbCwgKGludCwgaW50KSApOworX1BST1RPVFlQKCBpbnQgemNoa3BpZCwgKHVuc2lnbmVkIGxvbmcpICk7CisjZW5kaWYJLyogVU5JWCAqLworI2lmZGVmIENLRVhFQworX1BST1RPVFlQKCBWT0lEIHpfZXhlYywgKGNoYXIgKiwgY2hhciAqKiwgaW50KSApOworI2VuZGlmIC8qIENLRVhFQyAqLworX1BST1RPVFlQKCBpbnQgY2hrZm4sIChpbnQpICk7CitfUFJPVE9UWVAoIGxvbmcgemNoa2ksIChjaGFyICopICk7CisjaWZkZWYgVk1TT1JVTklYCitfUFJPVE9UWVAoIGxvbmcgemdldGZzLCAoY2hhciAqKSApOworI2Vsc2UKKyNpZmRlZiBPUzIKK19QUk9UT1RZUCggbG9uZyB6Z2V0ZnMsIChjaGFyICopICk7CisjZWxzZQorI2RlZmluZSB6Z2V0ZnMoYSkgemNoa2koYSkKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBWTVNPUlVOSVggKi8KK19QUk9UT1RZUCggaW50IGlzd2lsZCwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IGlzZGlyLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgemNoa28sIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCB6ZGVsZXQsIChjaGFyICopICk7CitfUFJPVE9UWVAoIFZPSUQgenJ0b2wsIChjaGFyICosY2hhciAqKSApOworX1BST1RPVFlQKCBWT0lEIHpsdG9yLCAoY2hhciAqLGNoYXIgKikgKTsKK19QUk9UT1RZUCggVk9JRCB6c3RyaXAsIChjaGFyICosY2hhciAqKikgKTsKKyNpZmRlZiBWTVMKK19QUk9UT1RZUCggY2hhciAqIHpyZWxuYW1lLCAoY2hhciAqLCBjaGFyICopICk7CisjZW5kaWYgLyogVk1TICovCitfUFJPVE9UWVAoIGludCB6Y2hkaXIsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGNoYXIgKiB6aG9tZSwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGNoYXIgKiB6Z3RkaXIsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgenhjbWQsIChpbnQsIGNoYXIgKikgKTsKKyNpZm5kZWYgTUFDCitfUFJPVE9UWVAoIGludCB6Y2xvc2YsIChpbnQpICk7CisjZW5kaWYgLyogTUFDICovCisjaWZkZWYgTlpYUEFORAorX1BST1RPVFlQKCBpbnQgbnp4cGFuZCwgKGNoYXIgKiwgaW50KSApOworI2Vsc2UgLyogTlpYUEFORCAqLworX1BST1RPVFlQKCBpbnQgenhwYW5kLCAoY2hhciAqKSApOworI2VuZGlmIC8qIE5aWFBBTkQgKi8KK19QUk9UT1RZUCggaW50IHpuZXh0LCAoY2hhciAqKSApOworI2lmZGVmIFpYUkVXSU5ECitfUFJPVE9UWVAoIGludCB6eHJld2luZCwgKHZvaWQpICk7CisjZW5kaWYgLyogWlhSRVdJTkQgKi8KK19QUk9UT1RZUCggaW50IHpjaGtzcGEsIChjaGFyICosIGxvbmcpICk7CitfUFJPVE9UWVAoIFZPSUQgem5ld24sIChjaGFyICosIGNoYXIgKiopICk7CitfUFJPVE9UWVAoIGludCB6cmVuYW1lLCAoY2hhciAqLCBjaGFyICopICk7CitfUFJPVE9UWVAoIGludCB6Y29weSwgKGNoYXIgKiwgY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgenNhdHRyLCAoc3RydWN0IHphdHRyICopICk7CitfUFJPVE9UWVAoIGludCB6ZnJlZSwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggY2hhciAqIHpmY2RhdCwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IHpzdGltZSwgKGNoYXIgKiwgc3RydWN0IHphdHRyICosIGludCkgKTsKKyNpZmRlZiBDS19QRVJNUworX1BST1RPVFlQKCBjaGFyICogemdwZXJtLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBjaGFyICogemlwZXJtLCAoY2hhciAqKSApOworI2VuZGlmIC8qIENLX1BFUk1TICovCitfUFJPVE9UWVAoIGludCB6bWFpbCwgKGNoYXIgKiwgY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgenByaW50LCAoY2hhciAqLCBjaGFyICopICk7CitfUFJPVE9UWVAoIGNoYXIgKiB0aWxkZV9leHBhbmQsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCB6bWtkaXIsIChjaGFyICopICkgOworX1BST1RPVFlQKCBpbnQgemZzZWVrLCAobG9uZykgKSA7CisjaWZkZWYgWkZOUUZQCitfUFJPVE9UWVAoIHN0cnVjdCB6Zm5mcCAqIHpmbnFmcCwgKGNoYXIgKiwgaW50LCBjaGFyICogKSApIDsKKyNlbHNlCisjZGVmaW5lIHpmbnFmcChhLGIsYykgY2tzdHJuY3B5KGMsYSxiKQorI2VuZGlmIC8qIFpGTlFGUCAqLworX1BST1RPVFlQKCBpbnQgenZ1c2VyLCAoY2hhciAqKSApIDsKK19QUk9UT1RZUCggaW50IHp2cGFzcywgKGNoYXIgKikgKSA7CitfUFJPVE9UWVAoIFZPSUQgenZsb2dvdXQsICh2b2lkKSApIDsKKyNpZmRlZiBPUzIKK19QUk9UT1RZUCggaW50IG9zMnNldGxvbmduYW1lLCAoIGNoYXIgKiBmbiwgY2hhciAqIGxuICkgKSA7CitfUFJPVE9UWVAoIGludCBvczJnZXRsb25nbmFtZSwgKCBjaGFyICogZm4sIGNoYXIgKiogbG4gKSApIDsKK19QUk9UT1RZUCggaW50IG9zMnJleHgsICggY2hhciAqLCBjaGFyICosIGludCApICkgOworX1BST1RPVFlQKCBpbnQgb3MycmV4eGZpbGUsICggY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50KSApIDsKK19QUk9UT1RZUCggaW50IG9zMmdldGVhcywgKGNoYXIgKikgKSA7CitfUFJPVE9UWVAoIGludCBvczJzZXRlYXMsIChjaGFyICopICkgOworX1BST1RPVFlQKCBjaGFyICogZ2V0X29zMl92ZXJzLCAodm9pZCkgKSA7CitfUFJPVE9UWVAoIGludCBkb19sYWJlbF9zZW5kLCAoY2hhciAqKSApIDsKK19QUk9UT1RZUCggaW50IGRvX2xhYmVsX3JlY3YsICh2b2lkKSApIDsKKyNpZmRlZiBPUzJNT1VTRQorX1BST1RPVFlQKCB1bnNpZ25lZCBsb25nIG9zMl9tb3VzZW9uLCAodm9pZCkgKTsKK19QUk9UT1RZUCggdW5zaWduZWQgbG9uZyBvczJfbW91c2VoaWRlLCAodm9pZCkgKTsKK19QUk9UT1RZUCggdW5zaWduZWQgbG9uZyBvczJfbW91c2VzaG93LCAodm9pZCkgKTsKK19QUk9UT1RZUCggdW5zaWduZWQgbG9uZyBvczJfbW91c2VvZmYsICh2b2lkKSApOworX1BST1RPVFlQKCB2b2lkIG9zMl9tb3VzZWV2dCwgKHZvaWQgKikgKTsKK19QUk9UT1RZUCggaW50IG1vdXNlYnV0dG9uY291bnQsICh2b2lkKSk7CisjZW5kaWYgLyogT1MyTU9VU0UgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworLyogRnVuY3Rpb25zIGZyb20gc3lzdGVtLWRlcGVuZGVudCB0ZXJtaW5hbCBpL28gbW9kdWxlICovCisKK19QUk9UT1RZUCggaW50IHR0b3BlbiwgKGNoYXIgKiwgaW50ICosIGludCwgaW50KSApOyAgLyogdHR5IGZ1bmN0aW9ucyAqLworI2lmbmRlZiBNQUMKK19QUk9UT1RZUCggaW50IHR0Y2xvcywgKGludCkgKTsKKyNlbmRpZiAvKiBNQUMgKi8KK19QUk9UT1RZUCggaW50IHR0aGFuZywgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCB0dHJlcywgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCB0dHBrdCwgKGxvbmcsIGludCwgaW50KSApOworI2lmbmRlZiBNQUMKK19QUk9UT1RZUCggaW50IHR0dnQsIChsb25nLCBpbnQpICk7CisjZW5kaWYgLyogTUFDICovCitfUFJPVE9UWVAoIGludCB0dHNzcGQsIChpbnQpICk7CitfUFJPVE9UWVAoIGxvbmcgdHRnc3BkLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHR0Zmx1aSwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCB0dGZsdW8sICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgdHRwdXNoYmFjaywgKENIQVIgKiwgaW50KSApOworX1BST1RPVFlQKCBpbnQgdHRwZWVrLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHR0Z3dzaXosICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgdHRjaGssICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgdHR4aW4sIChpbnQsIENIQVIgKikgKTsKK19QUk9UT1RZUCggaW50IHR0eG91dCwgKENIQVIgKiwgaW50KSApOworX1BST1RPVFlQKCBpbnQgdHRvbCwgKENIQVIgKiwgaW50KSApOworX1BST1RPVFlQKCBpbnQgdHRvYywgKGNoYXIpICk7CitfUFJPVE9UWVAoIGludCB0dGluYywgKGludCkgKTsKK19QUk9UT1RZUCggaW50IHR0c2NhcnIsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCB0dGdtZG0sICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgdHRzbmRiLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHR0c25kbGIsICh2b2lkKSApOworI2lmZGVmIFVOSVgKK19QUk9UT1RZUCggY2hhciAqIHR0Z2xja2RpciwgKHZvaWQpICk7CisjZW5kaWYgLyogVU5JWCAqLworI2lmZGVmIFBBUlNFTlNFCisjaWZkZWYgVU5JWAorX1BST1RPVFlQKCBpbnQgdHRpbmwsIChDSEFSICosIGludCwgaW50LCBDSEFSLCBDSEFSLCBpbnQpICk7CisjZWxzZQorI2lmZGVmIFZNUworX1BST1RPVFlQKCBpbnQgdHRpbmwsIChDSEFSICosIGludCwgaW50LCBDSEFSLCBDSEFSLCBpbnQpICk7CisjZWxzZQorI2lmZGVmIFNUUkFUVVMKK19QUk9UT1RZUCggaW50IHR0aW5sLCAoQ0hBUiAqLCBpbnQsIGludCwgQ0hBUiwgQ0hBUiwgaW50KSApOworI2Vsc2UKKyNpZmRlZiBPUzIKK19QUk9UT1RZUCggaW50IHR0aW5sLCAoQ0hBUiAqLCBpbnQsIGludCwgQ0hBUiwgQ0hBUiwgaW50KSApOworI2Vsc2UKKyNpZmRlZiBPU0sKK19QUk9UT1RZUCggaW50IHR0aW5sLCAoQ0hBUiAqLCBpbnQsIGludCwgQ0hBUiwgQ0hBUiwgaW50KSApOworI2Vsc2UKK19QUk9UT1RZUCggaW50IHR0aW5sLCAoQ0hBUiAqLCBpbnQsIGludCwgQ0hBUiwgQ0hBUikgKTsKKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogVU5JWCAqLworI2Vsc2UgLyogISBQQVJTRU5TRSAqLworX1BST1RPVFlQKCBpbnQgdHRpbmwsIChDSEFSICosIGludCwgaW50LCBDSEFSKSApOworI2VuZGlmIC8qIFBBUlNFTlNFICovCisKKy8qIFhZWk1PREVNIHN1cHBvcnQgKi8KKworLyoKKyAgQ0tfWFlaIGVuYWJsZXMgdGhlIHZhcmlvdXMgY29tbWFuZHMgYW5kIGRhdGEgc3RydWN0dXJlcy4KKyAgWFlaX0lOVEVSTkFMIG1lYW5zIHRoZXNlIHByb3RvY29scyBhcmUgYnVpbHQtaW47IGlmIG5vdCBkZWZpbmVkLAorICB0aGVuIHRoZXkgYXJlIGV4dGVybmFsLiAgWFlaX0RMTCBpcyB1c2VkIHRvIGluZGljYXRlIGEgc2VwYXJhdGUKKyAgbG9hZGFibGUgbGlicmFyeSBjb250YWluaW5nIHRoZSBYWVptb2RlbSBwcm90b2NvbCBjb2RlLgorKi8KKyNpZmRlZiBwZHAxMQkJCQkvKiBObyByb29tIGZvciB0aGlzIGluIFBEUC0xMSAqLworI2RlZmluZSBOT0NLWFlaCisjZW5kaWYgLyogcGRwMTEgKi8KKworI2lmbmRlZiBOT0NLWFlaCQkJCS8qIEFsdGVybmF0aXZlIHByb3RvY29scyAqLworI2lmbmRlZiBDS19YWVoKKyNpZmRlZiBVTklYCisjZGVmaW5lIENLX1hZWgorI2Vsc2UKKyNpZmRlZiBPUzIKKyNkZWZpbmUgQ0tfWFlaCisjaWZuZGVmIE5PWFlaRExMCisjZGVmaW5lIFhZWl9JTlRFUk5BTAkJCS8qIEludGVybmFsIGFuZCBETEwgKi8KKyNkZWZpbmUgWFlaX0RMTAorI2VuZGlmIC8qIE5PWFlaRExMICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIENLX1hZWiAqLworI2VuZGlmIC8qIE5PQ0tYWVogKi8KKworI2lmZGVmIFhZWl9JTlRFUk5BTAkJCS8qIFRoaXMgZW5zdXJlcyB0aGF0IFhZWl9JTlRFUk5BTCAqLworI2lmbmRlZiBDS19YWVoJCQkJLyogaXMgZGVmaW5lZCBvbmx5IGlmIENLX1hZWiBpcyB0b28gKi8KKyN1bmRlZiBYWVpfSU5URVJOQUwKKyNlbmRpZiAvKiBDS19YWVogKi8KKyNlbmRpZiAvKiBYWVpfSU5URVJOQUwgKi8KKyNpZmRlZiBYWVpfRExMCQkJCS8qIFRoaXMgZW5zdXJlcyBYWVpfRExMIGlzIGRlZmluZWQgKi8KKyNpZm5kZWYgWFlaX0lOVEVSTkFMCQkJLyogb25seSBpZiBYWVpfSU5URVJOQUwgaXMgdG9vICovCisjdW5kZWYgWFlaX0RMTAorI2VuZGlmIC8qIFhZWl9JTlRFUk5BTCAqLworI2VuZGlmIC8qIFhZWl9ETEwgKi8KKworLyogQ29uc29sZSBmdW5jdGlvbnMgKi8KKworX1BST1RPVFlQKCBpbnQgY29uZ20sICh2b2lkKSApOworI2lmZGVmIENPTU1FTlQKK19QUk9UT1RZUCggVk9JRCBjb25pbnQsIChTSUdUWVAgKCopKGludCwgaW50KSwgU0lHVFlQICgqKShpbnQsIGludCkpICk7CisjZWxzZQorX1BST1RPVFlQKCBWT0lEIGNvbmludCwgKFNJR1RZUCAoKikoaW50KSwgU0lHVFlQICgqKShpbnQpKSApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KK19QUk9UT1RZUCggVk9JRCBjb25ub2ksICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgY29uY2IsIChjaGFyKSApOworI2lmZGVmIENPTkdTUEQKK19QUk9UT1RZUCggbG9uZyBjb25nc3BkLCAodm9pZCkgKTsKKyNlbmRpZiAvKiBDT05HU1BEICovCitfUFJPVE9UWVAoIGludCBjb25iaW4sIChjaGFyKSApOworX1BST1RPVFlQKCBpbnQgY29ucmVzLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGNvbm9jLCAoY2hhcikgKTsKK19QUk9UT1RZUCggaW50IGNvbnhvLCAoaW50LCBjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBjb25vbCwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IGNvbm9sYSwgKGNoYXIgKltdKSApOworX1BST1RPVFlQKCBpbnQgY29ub2xsLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgY29uY2hrLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGNvbmluYywgKGludCkgKTsKK19QUk9UT1RZUCggY2hhciAqIGNvbmtiZywgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBwc3VzcGVuZCwgKGludCkgKTsKK19QUk9UT1RZUCggaW50IHByaXZfaW5pLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHByaXZfb24sICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgcHJpdl9vZmYsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgcHJpdl9jYW4sICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgcHJpdl9jaGssICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgcHJpdl9vcG4sIChjaGFyICosIGludCkgKTsKKworX1BST1RPVFlQKCBpbnQgc3lzaW5pdCwgKHZvaWQpICk7CS8qIE1pc2MgS2VybWl0IGZ1bmN0aW9ucyAqLworX1BST1RPVFlQKCBpbnQgc3lzY2xlYW51cCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBtc2xlZXAsIChpbnQpICk7CitfUFJPVE9UWVAoIFZPSUQgcnRpbWVyLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGd0aW1lciwgKHZvaWQpICk7CisjaWZkZWYgR0ZUSU1FUgorX1BST1RPVFlQKCBWT0lEIHJmdGltZXIsICh2b2lkKSApOworX1BST1RPVFlQKCBDS0ZMT0FUIGdmdGltZXIsICh2b2lkKSApOworI2VuZGlmIC8qIEdGVElNRVIgKi8KK19QUk9UT1RZUCggVk9JRCB0dGltb2ZmLCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCB6dGltZSwgKGNoYXIgKiopICk7CitfUFJPVE9UWVAoIGludCBwYXJjaGssIChDSEFSICosIENIQVIsIGludCkgKTsKK19QUk9UT1RZUCggVk9JRCBkb2V4aXQsIChpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IGFza21vcmUsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIGZhdGFsLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBWT0lEIGZhdGFsMiwgKGNoYXIgKiwgY2hhciAqKSApOworI2lmZGVmIFZNUworX1BST1RPVFlQKCBpbnQgY2tfY2FuY2lvLCAodm9pZCkgKTsKKyNlbmRpZiAvKiBWTVMgKi8KKworLyogS2V5IG1hcHBpbmcgc3VwcG9ydCAqLworCisjaWZkZWYgTk9JQ1AKKyNpZm5kZWYgTk9TRVRLRVkKKyNkZWZpbmUgTk9TRVRLRVkKKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworI2VuZGlmIC8qIE5PSUNQICovCisKKyNpZmRlZiBNQUMKKyNpZm5kZWYgTk9TRVRLRVkKKyNkZWZpbmUgTk9TRVRLRVkKKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworI2VuZGlmIC8qIE1BQyAqLworCitfUFJPVE9UWVAoIGludCBjb25na3MsIChpbnQpICk7CisjaWZkZWYgT1MyCisvKiBPUzIgcmVxdWlyZXMgdGhlc2UgZGVmaW5pdGlvbnMgZXZlbiBpZiBTRVQgS0VZIGlzIG5vdCBiZWluZyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgS01TSVpFIDg5MTYKK3R5cGVkZWYgVUxPTkcgS0VZOwordHlwZWRlZiBDSEFSICpNQUNSTzsKK2V4dGVybiBpbnQgd2lkZXJlc3VsdDsKKyNlbHNlIC8qIE5vdCBPUzIgKi8KKyNpZm5kZWYgTk9TRVRLRVkKKy8qCisgIENhdGNoLWFsbCBmb3Igc3lzdGVtcyB3aGVyZSB3ZSBkb24ndCBrbm93IGhvdyB0byByZWFkIGtleWJvYXJkIHNjYW4KKyAgY29kZXMgPiAyNTUuCisqLworI2RlZmluZSBLTVNJWkUgMjU2CisvKiBOb3RlOiBDSEFSIChpLmUuIHVuc2lnbmVkIGNoYXIpIGlzIHZlcnkgaW1wb3J0YW50IGhlcmUuICovCit0eXBlZGVmIENIQVIgS0VZOwordHlwZWRlZiBDSEFSICogTUFDUk87CisjZGVmaW5lIGNvbmdrcyBjb25pbmMKKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZuZGVmIE9TMgorI2lmbmRlZiBOT0tWRVJCUwkJCS8qIE5vIFxLdmVyYnMgdW5sZXNzLi4uICovCisjZGVmaW5lIE5PS1ZFUkJTCisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBOT0tWRVJCUworI2lmZGVmIE9TMgorLyoKKyAgTm90ZTogdGhpcyB2YWx1ZSBjaG9zZW4gdG8gYmUgYmlnZ2VyIHRoYW4gUEMgQklPUyBrZXkgbW9kaWZpZXIgYml0cywKKyAgYnV0IHN0aWxsIGZpdCBpbiAxNiBiaXRzIHdpdGhvdXQgYWZmZWN0aW5nIHNpZ24uCisKKyAgQXMgb2YgSzk1IDEuMS41LCB0aGlzIG5vIGxvbmdlciBmaXRzIGluIDE2IGJpdHMsIGdvb2QgdGhpbmcgd2UgYXJlIDMyIGJpdC4KKyovCisjZGVmaW5lIEZfTUFDUk8gMHgyMDAwICAgICAgICAgIC8qIEJpdCBpbmRpY2F0aW5nIGEgbWFjcm8gaW5kaWNlICovCisjZGVmaW5lIElTX01BQ1JPKHgpICh4ICYgRl9NQUNSTykKKyNkZWZpbmUgRl9LVkVSQiAweDQwMDAJCQkvKiBCaXQgaW5kaWNhdGluZyBhIGtleWJvYXJkIHZlcmIgKi8KKyNkZWZpbmUgSVNfS1ZFUkIoeCkgKHggJiBGX0tWRVJCKQkvKiBUZXN0IHRoaXMgYml0ICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKworI2RlZmluZSBGX0VTQyAgIDB4ODAwMAkJLyogQml0IGluZGljYXRpbmcgRVNDIGNoYXIgY29tYmluYXRpb24gKi8KKyNkZWZpbmUgSVNfRVNDKHgpICh4ICYgRl9FU0MpCisjZGVmaW5lIEZfQ1NJICAgMHgxMDAwMAkJLyogQml0IGluZGljYXRpbmcgQ1NJIGNoYXIgY29tYmluYXRpb24gKi8KKyNkZWZpbmUgSVNfQ1NJKHgpICh4ICYgRl9DU0kpCisKKyNpZmRlZiBOT1NQTAkJCQkvKiBUaGlzIG1pZ2h0IGJlIG92ZXJraWxsLi4gKi8KKyNpZm5kZWYgTk9LVkVSQlMJCQkvKiBOb3QgYWxsIFxLdmVyYnMgcmVxdWlyZSAqLworI2RlZmluZSBOT0tWRVJCUwkJCS8qIHRoZSBzY3JpcHQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICovCisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKyNpZm5kZWYgTk9UQUtFQVJHUworI2RlZmluZSBOT1RBS0VBUkdTCisjZW5kaWYgLyogTk9UQUtFQVJHUyAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKy8qCisgIEZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHN5c3RlbSBhbmQgbGlicmFyeSBmdW5jdGlvbnMuCisqLworI2lmZGVmIF9QT1NJWF9TT1VSQ0UKKyNpZm5kZWYgVk1TCisjaWZuZGVmIE1BQworI2RlZmluZSBDS19BTlNJTElCUworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIF9QT1NJWF9TT1VSQ0UgKi8KKworI2lmZGVmIE5FWFQKKyNkZWZpbmUgQ0tfQU5TSUxJQlMKKyNlbmRpZiAvKiBORVhUICovCisKKyNpZmRlZiBTVlI0CisjZGVmaW5lIENLX0FOU0lMSUJTCisjZW5kaWYgLyogU1ZSNCAqLworCisjaWZkZWYgU1RSQVRVUwkJCQkvKiBTdHJhdHVzIFZPUyB1c2VzIEFOU0kgbGlicmFyaWVzICovCisjZGVmaW5lIENLX0FOU0lMSUJTCisjZW5kaWYgLyogU1RSQVRVUyAqLworCisjaWZkZWYgT1MyCisjZGVmaW5lIENLX0FOU0lMSUJTCisjaWZuZGVmIE5PQ1VSU0VTCisjZGVmaW5lIE1ZQ1VSU0VTCisjZW5kaWYgLyogTk9DVVJTRVMgKi8KKyNkZWZpbmUgQ0tfUlRTQ1RTCisjaWZkZWYgX19JQk1DX18KKyNkZWZpbmUgU19JRk1UIDB4RjAwMAorI2RlZmluZSB0aW1lem9uZSBfdGltZXpvbmUKKyNlbmRpZiAvKiBfX0lCTUNfXyAqLworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW8uaD4KKyNpZmRlZiBfX0VNWF9fCisjaWZuZGVmIF9fMzJCSVRfXworI2RlZmluZSBfXzMyQklUX18KKyNlbmRpZiAvKiBfXzMyQklUX18gKi8KKyNpbmNsdWRlIDxzeXMvdGltZWIuaD4KKyNlbHNlIC8qIF9fRU1YX18gKi8KKyNpbmNsdWRlIDxkaXJlY3QuaD4KKyN1bmRlZiBTSUdBTFJNCisjaWZuZGVmIFNJR1VTUjEKKyNkZWZpbmUgU0lHVVNSMSA3CisjZW5kaWYgLyogU0lHVVNSMSAqLworI2RlZmluZSBTSUdBTFJNIFNJR1VTUjEKK19QUk9UT1RZUCggdW5zaWduZWQgYWxhcm0sICh1bnNpZ25lZCkgKTsKK19QUk9UT1RZUCggdW5zaWduZWQgc2xlZXAsICh1bnNpZ25lZCkgKTsKKyNlbmRpZiAvKiBfX0VNWF9fICovCitfUFJPVE9UWVAoIHVuc2lnbmVkIGxvbmcgemRza3NwYWNlLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgemNoZHNrLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgY29uaW5jcmF3LCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgdHRpc2NvbSwgKGludCBmKSApOworX1BST1RPVFlQKCBpbnQgSXNGaWxlTmFtZVZhbGlkLCAoY2hhciAqKSApOworX1BST1RPVFlQKCB2b2lkIENoYW5nZU5hbWVGb3JGQVQsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGNoYXIgKkdldExvYWRQYXRoLCAodm9pZCkgKTsKKyNlbmRpZiAvKiBPUzIgKi8KKworLyogRnVsbHNjcmVlbiBmaWxlIHRyYW5zZmVyIGRpc3BsYXkgaXRlbXMuLi4gKi8KKworI2lmbmRlZiBOT0NVUlNFUworI2lmZGVmIENLX05DVVJTRVMJCQkvKiBDS19OQ1VSU0VTIGltcGxpZXMgQ0tfQ1VSU0VTICovCisjaWZuZGVmIENLX0NVUlNFUworI2RlZmluZSBDS19DVVJTRVMKKyNlbmRpZiAvKiBDS19DVVJTRVMgKi8KKyNlbmRpZiAvKiBDS19OQ1VSU0VTICovCisKKyNpZmRlZiBNWUNVUlNFUwkJCQkvKiBNWUNVUlNFUyBpbXBsaWVzIENLX0NVUlNFUyAqLworI2lmbmRlZiBDS19DVVJTRVMKKyNkZWZpbmUgQ0tfQ1VSU0VTCisjZW5kaWYgLyogQ0tfQ1VSU0VTICovCisjZW5kaWYgLyogTVlDVVJTRVMgKi8KKyNlbmRpZiAvKiBOT0NVUlNFUyAqLworCisjaWZkZWYgTk9DVVJTRVMKKyNpZmRlZiBDS19DVVJTRVMKKyN1bmRlZiBDS19DVVJTRVMKKyNlbmRpZiAvKiBDS19DVVJTRVMgKi8KKyNpZm5kZWYgTk9ESVNQTEFZCisjZGVmaW5lIE5PRElTUExBWQorI2VuZGlmIC8qIE5PRElTUExBWSAqLworI2VuZGlmIC8qIE5PQ1VSU0VTICovCisKKyNpZmRlZiBDS19DVVJTRVMKKy8qCisgIFRoZSBDS19XUkVGUkVTSCBzeW1ib2wgaXMgZGVmaW5lZCBpZiB0aGUgY3Vyc2VzIGxpYnJhcnkgcHJvdmlkZXMKKyAgY2xlYXJvaygpIGFuZCB3cmVmcmVzaCgpIGZ1bmN0aW9ucywgd2hpY2ggYXJlIHVzZWQgaW4gcmVwYWludGluZworICB0aGUgc2NyZWVuLgorKi8KKyNpZmRlZiBOT1dSRUZSRVNICQkJLyogT3ZlcnJpZGUgQ0tfV1JFRlJFU0ggKi8KKworI2lmZGVmIENLX1dSRUZSRVNICQkJLyogSWYgdGhpcyBpcyBkZWZpbmVkLCAqLworI3VuZGVmIENLX1dSRUZSRVNICQkJLyogdW5kZWZpbmUgaXQuICovCisjZW5kaWYgLyogQ0tfV1JFRlJFU0ggKi8KKworI2Vsc2UgLyogIU5PV1JFRlJFU0ggKi8JCQkvKiBObyBvdmVycmlkZS4uLiAqLworCisjaWZuZGVmIENLX1dSRUZSRVNICQkJLyogSWYgQ0tfV1JFRlJFU0ggbm90IGRlZmluZWQgKi8KKy8qCisgIEF1dG9tYXRpY2FsbHkgZGVmaW5lIGl0IGZvciBzeXN0ZW1zIGtub3duIHRvIGhhdmUgaXQgLi4uCisqLworI2lmZGVmIFZNUwkJCQkvKiBERUMgKE9wZW4pVk1TIGhhcyBpdCAqLworI2RlZmluZSBDS19XUkVGUkVTSAorI2Vsc2UKKyNpZmRlZiB1bHRyaXgJCQkJLyogREVDIFVMVFJJWCBoYXMgaXQgKi8KKyNlbHNlCisjaWZkZWYgU1ZSMwkJCQkvKiBTeXN0ZW0gViBoYXMgaXQgKi8KKyNkZWZpbmUgQ0tfV1JFRlJFU0gKKyNlbHNlCisjaWZkZWYgQlNENDQJCQkJLyogNC40IEJTRCBoYXMgaXQgKi8KKyNkZWZpbmUgQ0tfV1JFRlJFU0gKKyNlbHNlCisjaWZkZWYgTkVYVAkJCQkvKiBEZWZpbmUgaXQgZm9yIE5lWFRTVEVQICovCisjZGVmaW5lIENLX1dSRUZSRVNICisjZWxzZQorI2lmZGVmIFNVTk9TNAkJCQkvKiBTdW5PUyA0LnguLi4gKi8KKyNkZWZpbmUgQ0tfV1JFRlJFU0gKKyNlbHNlCisjaWZkZWYgU09MQVJJUzI1CQkJLyogU29sYXJpcyAyLjUgYW5kIGxhdGVyICovCisjZGVmaW5lIENLX1dSRUZSRVNICisjZWxzZQorI2lmZGVmIEFJWFJTCQkJCS8qIFJTLzYwMDAgQUlYIC4uLiAqLworI2RlZmluZSBDS19XUkVGUkVTSAorI2Vsc2UKKyNpZmRlZiBSVEFJWAkJCQkvKiBSVCBQQyBBSVggLi4uICovCisjZGVmaW5lIENLX1dSRUZSRVNICisjZWxzZQorI2lmZGVmIE9TRgkJCQkvKiBERUMgT1NGLzEgLi4uICovCisjZGVmaW5lIENLX1dSRUZSRVNICisKKy8qIEFkZCBtb3JlIGhlcmUsIG9yIGp1c3QgZGVmaW5lIENLX1dSRUZSRVNIIG9uIHRoZSBDQyBjb21tYW5kIGxpbmUuLi4gKi8KKworI2VuZGlmIC8qIE9TRiAqLworI2VuZGlmIC8qIFJUQUlYICovCisjZW5kaWYgLyogQUlYUlMgKi8KKyNlbmRpZiAvKiBTT0xBUklTMjUgKi8KKyNlbmRpZiAvKiBTVU5PUzQgKi8KKyNlbmRpZiAvKiBORVhUICovCisjZW5kaWYgLyogQlNENDQgKi8KKyNlbmRpZiAvKiBTVlIzICovCisjZW5kaWYgLyogdWx0cml4ICovCisjZW5kaWYgLyogVk1TICovCisKKyNlbHNlIC8qIENLX1dSRUZSRVNIIGlzIGRlZmluZWQgKi8KKworLyogVGhpcyBpcyB3aXRoaW4gYW4gaWZkZWYgQ0tfQ1VSU0VTIGJsb2NrLiAgVGhlIGZvbGxvd2luZyBpcyBub3QgbmVlZGVkICovCisKKyNpZm5kZWYgQ0tfQ1VSU0VTCQkJLyogQ0tfV1JFRlJFU0ggaW1wbGllcyBDS19DVVJTRVMgKi8KKyNkZWZpbmUgQ0tfQ1VSU0VTCisjZW5kaWYgLyogQ0tfQ1VSU0VTICovCisKKyNlbmRpZiAvKiBDS19XUkVGUkVTSCAqLworI2VuZGlmIC8qIE5PV1JFRlJFU0ggKi8KKworI2lmbmRlZiBUUk1CVUZMCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgVFJNQlVGTCAxNjM4NAorI2Vsc2UKKyNpZmRlZiBEWU5BTUlDCisjZGVmaW5lIFRSTUJVRkwgODE5MgorI2Vsc2UKKyNkZWZpbmUgVFJNQlVGTCAxMDI0CisjZW5kaWYgLyogQklHQlVGT0sgKi8KKyNlbmRpZiAvKiBEWU5BTUlDICovCisjZW5kaWYgLyogVFJNQlVGTCAqLworI2VuZGlmIC8qIENLX0NVUlNFUyAqLworCisvKgorICBXaGV0aGVyIHRvIHVzZSBja21hdGNoKCkgaW4gYWxsIGl0cyBnbG9yeSBmb3IgQy1TaGVsbC1saWtlIHBhdHRlcm5zLgorICBJZiBDS1JFR0VYIGlzIE5PVCBkZWZpbmVkLCBhbGwgYnV0ICogYW5kID8gbWF0Y2hpbmcgYXJlIHJlbW92ZWQgZnJvbQorICBja21hdGNoKCkuICBOT1RFOiBEZWZpbmluZyBDS1JFR0VYIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCBja21hdGNoKCkKKyAgcmVnZXhlcyBhcmUgdXNlZCBmb3IgZmlsZW5hbWUgbWF0Y2hpbmcuICBUaGF0IGRlcGVuZHMgb24gd2hldGhlciB6eHBhbmQoKQorICBpbiBjaz9maW8uYyBjYWxscyBja21hdGNoKCkuICBOT1RFIDI6IFJFR0VYIGlzIGEgbWlzbm9tZXIgLS0gdGhlc2UgYXJlIG5vdAorICByZWd1bGFyIGV4cHJlc3Npb25zIGluIHRoZSBjb21wdXRlci1zY2llbmNlIHNlbnNlIChpbiB3aGljaCwgZS5nLiAiYSpiIgorICBtYXRjaGVzIDAgb3IgbW9yZSAnYScgY2hhcmFjdGVycyBmb2xsb3dlZCBieSAnYicpIGJ1dCBwYXR0ZXJucyAoaW4gd2hpY2gKKyAgImEqYiIgbWF0Y2hlcyAnYScgZm9sbG93ZWQgYnkgMCBvciBtb3JlIG5vbi1iIGNoYXJhY3RlcnMsIGZvbGxvd2VkIGJ5IGIpLgorKi8KKyNpZm5kZWYgTk9DS1JFR0VYCisjaWZuZGVmIENLUkVHRVgKKyNkZWZpbmUgQ0tSRUdFWAorI2VuZGlmIC8qIENLUkVHRVggKi8KKyNlbmRpZiAvKiBOT0NLUkVHRVggKi8KKworLyogTGVhcm5lZC1zY3JpcHQgZmVhdHVyZSAqLworCisjaWZuZGVmIE5PTEVBUk4KKyNpZmRlZiBOT1NQTAorI2RlZmluZSBOT0xFQVJOCisjZWxzZQorI2lmZGVmIE5PTE9DQUwKKyNkZWZpbmUgTk9MRUFSTgorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworI2VuZGlmIC8qIE5PTEVBUk4gKi8KKworI2lmZGVmIE5PTEVBUk4KKyNpZmRlZiBDS0xFQVJOCisjdW5kZWYgQ0tMRUFSTgorI2VuZGlmIC8qIENLTEVBUk4gKi8KKyNlbHNlICAvKiAhTk9MRUFSTiAqLworI2lmbmRlZiBDS0xFQVJOCisjaWZkZWYgT1MyT1JVTklYCisvKiBJbiBVTklYIHRoaXMgY2FuIHdvcmsgb25seSB3aXRoIGNrdWNucy5jIGJ1aWxkcyAqLworI2RlZmluZSBDS0xFQVJOCisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBDS0xFQVJOCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyT1JVTklYICovCisjZW5kaWYgLyogQ0tMRUFSTiAqLworI2VuZGlmIC8qIE5PTEVBUk4gKi8KKworI2lmZGVmIENLTEVBUk4KKyNpZm5kZWYgTEVBUk5CVUZTSVoKKyNkZWZpbmUgTEVBUk5CVUZTSVogMTI4CisjZW5kaWYgLyogTEVBUk5CVUZTSVogKi8KKyNlbmRpZiAvKiBDS0xFQVJOICovCisKKyNpZm5kZWYgSUtTRE9OTFkKKyNpZm5kZWYgQ0tUSURMRQkJCQkvKiBQc2V1ZG8ta2VlcGFsaXZlIGluIENPTk5FQ1QgKi8KKyNpZmRlZiBPUzIJCQkJLyogSW4gSzk1ICovCisjZGVmaW5lIENLVElETEUKKyNlbHNlCisjaWZkZWYgVU5JWAkJCQkvKiBJbiBVTklYIGJ1dCBvbmx5IGNrdWNucyB2ZXJzaW9ucyAqLworI2lmbmRlZiBOT0xFQVJOCisjaWZuZGVmIE5PU0VMRUNUCisjZGVmaW5lIENLVElETEUKKyNlbmRpZiAvKiBOT1NFTEVDVCAqLworI2VuZGlmIC8qIE5PTEVBUk4gKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogQ0tUSURMRSAqLworI2VuZGlmIC8qIElLU0RPTkxZICovCisKKyNpZmRlZiBDS19BTlNJTElCUworLyoKKyAgU3RyaW5nIGxpYnJhcnkgZnVuY3Rpb25zLgorICBGb3IgQU5TSSBDLCBnZXQgcHJvdG90eXBlcyBmcm9tIDxzdHJpbmcuaD4uCisgIE90aGVyd2lzZSwgc2tpcCB0aGUgcHJvdG90eXBlcy4KKyovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qCisgIFByb3RvdHlwZXMgZm9yIG90aGVyIGNvbW1vbmx5IHVzZWQgbGlicmFyeSBmdW5jdGlvbnMsIHN1Y2ggYXMKKyAgbWFsbG9jLCBmcmVlLCBnZXRlbnYsIGF0b2wsIGF0b2ksIGFuZCBleGl0LiAgT3RoZXJ3aXNlLCBubyBwcm90b3R5cGVzLgorKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZmRlZiBESUFCIC8qIERJQUIgRFM5MCAqLworLyogI2luY2x1ZGUgPGNvbW1vbkMuaD4gICovCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNkZWZpbmUgQ0tfV0FJVF9ICisjaWZkZWYgQ09NTUVOVAorZXh0ZXJuIHZvaWQgZXhpdChpbnQgc3RhdHVzKTsKK2V4dGVybiB2b2lkIF9leGl0KGludCBzdGF0dXMpOworZXh0ZXJuIGludCB1bmFtZShzdHJ1Y3QgdXRzbmFtZSAqbmFtZSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworZXh0ZXJuIGludCBjaG1vZChjaGFyICpwYXRoLCBpbnQgbW9kZSk7CitleHRlcm4gaW50IGlvY3RsKGludCBmaWxkZXMsIGludCByZXF1ZXN0LCAuLi4pOworZXh0ZXJuIGludCByZGNoayhpbnQgdHR5ZmQpOworZXh0ZXJuIGludCBuYXAoaW50IG0pOworI2lmZGVmIENPTU1FTlQKK2V4dGVybiBpbnQgZ2V0cHBpZCh2b2lkKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCitleHRlcm4gaW50IF9maWxidWYoRklMRSAqc3RyZWFtKTsKK2V4dGVybiBpbnQgX2Zsc2J1ZihjaGFyIGMsRklMRSAqc3RyZWFtKTsKKyNlbmRpZiAvKiBESUFCICovCisKKy8qCisgIFByb3RvdHlwZXMgZm9yIFVOSVggZnVuY3Rpb25zIGxpa2UgYWNjZXNzLCBhbGFybSwgY2hkaXIsIHNsZWVwLCBmb3JrLAorICBhbmQgcGF1c2UuICBPdGhlcndpc2UsIG5vIHByb3RvdHlwZXMuCisqLworI2lmZGVmIFZNUworI2luY2x1ZGUgPHVuaXhpby5oPgorI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgTkVYVAorI2lmbmRlZiBORVhUMzMKKyNpbmNsdWRlIDxsaWJjLmg+CisjZW5kaWYgLyogTkVYVDMzICovCisjZWxzZSAgLyogTm9UIE5lWFQgKi8KKyNpZm5kZWYgQU1JR0EKKyNpZm5kZWYgT1MyCisjaWZkZWYgU1RSQVRVUworI2luY2x1ZGUgPGNfdXRpbGl0aWVzLmg+CisjZWxzZSAvKiAhU1RSQVRVUyAqLworI2lmbmRlZiBPU0tYWEMKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAvKiBPU0tYWEMgKi8KKyNpZmRlZiBIQVZFX0NSWVBUX0gKKyNpbmNsdWRlIDxjcnlwdC5oPgorI2VuZGlmIC8qIEhBVkVfQ1JZUFRfSCAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworI2VuZGlmIC8qIE5FWFQgKi8KKworI2Vsc2UgLyogTm90IEFOU0kgbGlicy4uLiAqLworCisjaWZkZWYgTUFDCisjaW5jbHVkZSA8U3RyaW5nLmg+CisjaW5jbHVkZSA8U3RkTGliLmg+CisjZW5kaWYgLyogTUFDICovCisKKyNpZmRlZiBIUFVYCisjaWZuZGVmIEhQVVhQUkU2NQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIC8qIEhQVVhQUkU2NSAqLworI2VuZGlmIC8qIEhQVVggKi8KKworI2lmZGVmIFNVTk9TNDEKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbHNlCisjaWZuZGVmIE1BQworLyoKKyAgSXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlc2UgYXJlIGRlY2xhcmVkIGNvcnJlY3RseSEKKyAgV2hpY2ggaXMgbm90IGFsd2F5cyBlYXN5LiAgVGFrZSBtYWxsb2MoKSBmb3IgaW5zdGFuY2UgLi4uCisqLworI2lmZGVmIFBZUkFNSUQKKyNpZmRlZiBTVlI0CisjaWZkZWYgX19TVERDX18KKyNkZWZpbmUgU0laRV9UX01BTExPQworI2VuZGlmIC8qIF9fU1REQ19fICovCisjZW5kaWYgLyogU1ZSNCAqLworI2VuZGlmIC8qIFBZUkFNSUQgKi8KKy8qCisgIE1heWJlIHNvbWUgb3RoZXIgZW52aXJvbm1lbnRzIG5lZWQgdGhlIHNhbWUgdHJlYXRtZW50IGZvciBtYWxsb2MuCisgIElmIHNvLCBkZWZpbmUgU0laRV9UX01BTExPQyBmb3IgdGhlbSBoZXJlIG9yIGluIGNvbXBpbGVyIENGTEFHUy4KKyovCisjaWZkZWYgU0laRV9UX01BTExPQworX1BST1RPVFlQKCB2b2lkICogbWFsbG9jLCAoc2l6ZV90KSApOworI2Vsc2UKK19QUk9UT1RZUCggY2hhciAqIG1hbGxvYywgKHVuc2lnbmVkIGludCkgKTsKKyNlbmRpZiAvKiBTSVpFX1RfTUFMTE9DICovCisKK19QUk9UT1RZUCggY2hhciAqIGdldGVudiwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggbG9uZyBhdG9sLCAoY2hhciAqKSApOworI2VuZGlmIC8qICFNQUMgKi8KKyNlbmRpZiAvKiBTVU5PUzQxICovCisjZW5kaWYgLyogQ0tfQU5TSUxJQlMgKi8KKworLyoKKyAgPHN5cy9wYXJhbS5oPiBnZW5lcmFsbHkgcGlja3MgdXAgTlVMTCwgTUFYUEFUSExFTiwgYW5kIE1BWE5BTUxFTgorICBhbmQgc2VlbXMgdG8gcHJlc2VudCBvbiBhbGwgVW5peGVzIGdvaW5nIGJhY2sgYXQgbGVhc3QgdG8gU0NPIFhlbml4CisgIHdpdGggdGhlIGV4Y2VwdGlvbihzKSBub3RlZC4KKyovCisjaWZuZGVmIE5PX1BBUkFNX0gJCQkvKiAyMDAxLTExLTAzICovCisjaWZuZGVmIFVOSVgJCQkJLyogTm9uLVVuaXhlcyBkb24ndCBoYXZlIGl0ICovCisjZGVmaW5lIE5PX1BBUkFNX0gKKyNlbHNlCisjaWZkZWYgVFJTMTYJCQkJLyogVGFuZHkgWGVuaXggZG9lc24ndCBoYXZlIGl0ICovCisjZGVmaW5lIE5PX1BBUkFNX0gKKyNlbmRpZiAvKiBUUlMxNiAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBOT19QQVJBTV9IICovCisKKyNpZm5kZWYgTk9fUEFSQU1fSAorI2lmbmRlZiBJTkNMX1BBUkFNX0gKKyNkZWZpbmUgSU5DTF9QQVJBTV9ICisjZW5kaWYgLyogSU5DTF9QQVJBTV9IICovCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYgLyogTk9fUEFSQU1fSCAqLworCisjaWZuZGVmIE5VTEwJCQkJLyogSW4gY2FzZSBOVUxMIGlzIHN0aWxsIG5vdCBkZWZpbmVkICovCisjZGVmaW5lIE5VTEwgMEwKKy8qIG9yICNkZWZpbmUgTlVMTCAwICovCisvKiBvciAjZGVmaW5lIE5VTEwgKChjaGFyICopIDApICovCisvKiBvciAjZGVmaW5lIE5VTEwgKCh2b2lkICopIDApICovCisjZW5kaWYgLyogTlVMTCAqLworCisvKiBNYXhpbXVtIGxlbmd0aCBmb3IgYSBmdWxseSBxdWFsaWZpZWQgZmlsZW5hbWUsIG5vdCBjb3VudGluZyBcMCBhdCBlbmQuICovCisvKgorICBUaGlzIGlzIGEgcm91Z2ggY3V0LCBhbmQgZXJycyBvbiB0aGUgc2lkZSBvZiBiZWluZyB0b28gYmlnLiAgV2UgZG9uJ3QKKyAgd2FudCB0byBwdWxsIGluIGh1bmRyZWRzIG9mIGhlYWRlciBmaWxlcyBsb29raW5nIGZvciBtYW55IGFuZCB2YXJpZWQKKyAgc3ltYm9scywgZm9yIGZlYXIgb2YgaW50cm9kdWNpbmcgdW5uZWNlc3NhcnkgY29uZmxpY3RzLgorKi8KKyNpZm5kZWYgQ0tNQVhQQVRICisjaWZkZWYgTUFYUEFUSExFTgkJCS8qIChpdCBwcm9iYWJseSBpc24ndCkgKi8KKyNkZWZpbmUgQ0tNQVhQQVRIIE1BWFBBVEhMRU4KKyNlbHNlCisjaWZkZWYgUEFUSF9NQVgJCQkJLyogUE9TSVggKi8KKyNkZWZpbmUgQ0tNQVhQQVRIIFBBVEhfTUFYCisjZWxzZQorI2lmZGVmIE1BQworI2RlZmluZSBDS01BWFBBVEggNjMKKyNlbHNlCisjaWZkZWYgcGRwMTEKKyNkZWZpbmUgQ0tNQVhQQVRIIDI1NQorI2Vsc2UKKyNpZmRlZiBVTklYCQkJCS8qIEV2ZW4gdGhvdWdoIHNvbWUgYXJlIHdheSBsZXNzLi4uICovCisjZGVmaW5lIENLTUFYUEFUSCAxMDI0CisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBDS01BWFBBVEggNjc1CQkJLyogKGRlcml2YXRpb24gaXMgY29tcGxpY2F0ZWQuLi4pICovCisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKyNkZWZpbmUgQ0tNQVhQQVRIIDI1NgkJCS8qID09ICRNWFBMIGZyb20gUEFSVS5IICovCisjZWxzZQorI2lmZGVmIGRhdGFnZW5lcmFsCisjZGVmaW5lIENLTUFYUEFUSCAyNTYJCQkvKiA9PSAkTVhQTCBmcm9tIFBBUlUuSCAqLworI2Vsc2UKKyNkZWZpbmUgQ0tNQVhQQVRIIDI1NQorI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBwZHAxMSAqLworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIFBBVEhfTUFYICovCisjZW5kaWYgLyogTUFYUEFUSExFTiAqLworI2VuZGlmIC8qIENLTUFYUEFUSCAqLworCisvKiBNYXhpbXVtIGxlbmd0aCBmb3IgdGhlIG5hbWUgb2YgYSB0dHkgZGV2aWNlICovCisKKyNpZm5kZWYgREVWTkFNTEVOCisjZGVmaW5lIERFVk5BTUxFTiBDS01BWFBBVEgKKyNlbmRpZiAvKiBERVZOQU1MRU4gKi8KKworLyogRGlyZWN0b3J5IChwYXRoIHNlZ21lbnQpIHNlcGFyYXRvciAqLworLyogTm90IGZ1bGx5IGdlbmVyYWwgLSBUcmlja3kgZm9yIFZNUywgQW1pZ2EsIC4uLiAqLworCisjaWZuZGVmIERJUlNFUAorI2lmZGVmIFVOSVgKKyNkZWZpbmUgRElSU0VQICcvJworI2RlZmluZSBJU0RJUlNFUChjKSAoKGMpPT0nLycpCisjZWxzZQorI2lmZGVmIE9TMgorI2RlZmluZSBESVJTRVAgJy8nCisjZGVmaW5lIElTRElSU0VQKGMpICgoYyk9PScvJ3x8KGMpPT0nXFwnKQorI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorI2RlZmluZSBESVJTRVAgJzonCisjZGVmaW5lIElTRElSU0VQKGMpICgoKGMpPT0nOicpfHwoKGMpPT0nXicpfHwoKGMpPT0nPScpKQorI2Vsc2UKKyNpZmRlZiBTVFJBVFVTCisjZGVmaW5lIERJUlNFUCAnPicKKyNkZWZpbmUgSVNESVJTRVAoYykgKChjKT09Jz4nKQorI2Vsc2UKKyNpZmRlZiBWTVMKKyNkZWZpbmUgRElSU0VQICddJwkJCS8qIChub3QgcmVhbGx5KSAqLworI2RlZmluZSBJU0RJUlNFUChjKSAoKGMpPT0nXSd8fChjKT09JzonKQorI2Vsc2UKKyNpZmRlZiBNQUMKKyNkZWZpbmUgRElSU0VQICc6JworI2RlZmluZSBJU0RJUlNFUChjKSAoKGMpPT0nOicpCisjZWxzZQorI2lmZGVmIEFNSUdBCisjZGVmaW5lIERJUlNFUCAnLycKKyNkZWZpbmUgSVNESVJTRVAoYykgKChjKT09Jy8nfHwoYyk9PSc6JykKKyNlbHNlCisjaWZkZWYgR0VNRE9TCisjZGVmaW5lIERJUlNFUCAnXFwnCisjZGVmaW5lIElTRElSU0VQKGMpICgoYyk9PSdcXCd8fChjKT09JzonKQorI2Vsc2UKKyNkZWZpbmUgRElSU0VQICcvJworI2RlZmluZSBJU0RJUlNFUChjKSAoKGMpPT0nLycpCisjZW5kaWYgLyogR0VNRE9TICovCisjZW5kaWYgLyogQU1JR0EgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogRElSU0VQICovCisKKy8qIEZJTEUgcGFja2FnZSBwYXJhbWV0ZXJzICovCisKKyNpZmRlZiBwZHAxMQorI2RlZmluZSBOT0NIQU5ORUxJTworI2Vsc2UKKworI2lmbmRlZiBDS01BWE9QRU4KKyNpZmRlZiBRTlgKKyNkZWZpbmUgQ0tNQVhPUEVOIDM5MAorI2Vsc2UKKyNpZmRlZiBWTVMKKyNkZWZpbmUgQ0tNQVhPUEVOIDY0CisjZWxzZQorI2lmZGVmIE9QRU5fTUFYCisjZGVmaW5lIENLTUFYT1BFTiBPUEVOX01BWAorI2Vsc2UKKyNpZmRlZiBGT1BFTl9NQVgKKyNkZWZpbmUgQ0tNQVhPUEVOIEZPUEVOX01BWAorI2Vsc2UKKyNkZWZpbmUgQ0tNQVhPUEVOIDY0CisjZW5kaWYgLyogRk9QRU5fTUFYICovCisjZW5kaWYgLyogT1BFTl9NQVggKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBRTlggKi8KKyNlbmRpZiAvKiBDS01BWE9QRU4gKi8KKworLyogTWF4aW11bSBjaGFubmVscyBmb3IgRk9QRU4gPSBDS01BWE9QRU4gbWludXMgbG9ncywgc3RkaW8sIGV0YyAqLworCisjaWZuZGVmIFpfTUlOQ0hBTgorI2RlZmluZSBaX01JTkNIQU4gMTYKKyNlbmRpZiAvKiBaX01JTkNIQU4gKi8KKworI2lmbmRlZiBaX01BWENIQU4KKyNkZWZpbmUgWl9NQVhDSEFOIChDS01BWE9QRU4tWk5GSUxTLTUpCisjZW5kaWYgLyogWl9NQVhDSEFOICovCisjZW5kaWYgLyogcGRwMTEgKi8KKworLyogTmV3LWZvcm1hdCBuemx0b3IoKSBhbmQgbnpydG9sKCkgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHBhdGhuYW1lcyAqLworCisjaWZuZGVmIE5aTFRPUgorI2lmZGVmIFVOSVgKKyNkZWZpbmUgTlpMVE9SCisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBOWkxUT1IKKyNlbHNlCisjaWZkZWYgT1MyCisjZGVmaW5lIE5aTFRPUgorI2Vsc2UKKyNpZmRlZiBTVFJBVFVTCisjZGVmaW5lIE5aTFRPUgorI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogTlpMVE9SICovCisKKyNpZmRlZiBOWkxUT1IKK19QUk9UT1RZUCggVk9JRCBuemx0b3IsIChjaGFyICosIGNoYXIgKiwgaW50LCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggVk9JRCBuenJ0b2wsIChjaGFyICosIGNoYXIgKiwgaW50LCBpbnQsIGludCkgKTsKKyNlbmRpZiAvKiBOWkxUT1IgKi8KKworLyogSW1wbGVtZW50YXRpb25zIHdpdGggYSB6cm1kaXIoKSBmdW5jdGlvbiAqLworCisjaWZuZGVmIFpSTURJUgorI2lmZGVmIE9TMgorI2RlZmluZSBaUk1ESVIKKyNlbHNlIC8qIE9TMiAqLworI2lmZGVmIFVOSVgKKyNkZWZpbmUgWlJNRElSCisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBaUk1ESVIKKyNlbHNlIC8qIFZNUyAqLworI2lmZGVmIFNUUkFUVVMKKyNkZWZpbmUgWlJNRElSCisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBaUk1ESVIgKi8KKworI2lmZGVmIFpSTURJUgorX1BST1RPVFlQKCBpbnQgenJtZGlyLCAoY2hhciAqKSApOworI2VuZGlmIC8qIFpSTURJUiAqLworCisjaWZuZGVmIEZJTEVDQVNFCisjaWZkZWYgVU5JWE9ST1NLCisjZGVmaW5lIEZJTEVDQVNFIDEKKyNlbHNlCisjZGVmaW5lIEZJTEVDQVNFIDAKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyNpZm5kZWYgQ0tDTUFJCitleHRlcm4gaW50IGZpbGVjYXNlOworI2VuZGlmIC8qIENLQ01BSSAqLworI2VuZGlmIC8qIEZJTEVDQVNFICovCisKKy8qIEZ1bm55IG5hbWVzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucyBkZXBhcnRtZW50Li4uICovCisKKyNpZmRlZiBaSUxPRworI2RlZmluZSBzZXRqbXAgc2V0cmV0CisjZGVmaW5lIGxvbmdqbXAgbG9uZ3JldAorI2RlZmluZSBqbXBfYnVmIHJldF9idWYKKyNkZWZpbmUgZ2V0Y3dkIGN1cmRpcgorI2VuZGlmIC8qIFpJTE9HICovCisKKyNpZmRlZiBTVFJBVFVTCisvKiBUaGUgQy1ydW50aW1lIGNvbmZsaWN0cyB3aXRoIHRoaW5ncyB3ZSBkbyBpbiBTdHJhdHVzIFZPUyBja2x0aW8uYyAuLi4gKi8KKyNkZWZpbmUgcHJpbnRmIHZvc3BydGYKK19QUk9UT1RZUCggaW50IHZvc3BydGYsIChjaGFyICpmbXQsIC4uLikgKTsKKyNkZWZpbmUgcGVycm9yKHR4dCkgcHJpbnRmKCIlc1xuIiwgdHh0KQorLyogY2hhcl92YXJ5aW5nIGlzIGEgc3RyaW5nIHR5cGUgZnJvbSBQTC9JIHRoYXQgVk9TIHVzZXMgZXh0ZW5zaXZlbHkgKi8KKyNkZWZpbmUgQ1YgY2hhcl92YXJ5aW5nCisjZW5kaWYgLyogU1RSQVRVUyAqLworCisjaWZkZWYgTlQKK2V4dGVybiBpbnQgT1NWZXI7CisjZGVmaW5lIGlzV2luOTUoKSAoT1NWZXI9PVZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTKQorI2Vsc2UKKyNkZWZpbmUgaXNXaW45NSgpICgwKQorI2VuZGlmIC8qIE5UICovCisKKyNpZm5kZWYgQlBSSU5UCisjaWZkZWYgT1MyCisjZGVmaW5lIEJQUklOVAorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIEJQUklOVCAqLworCisjaWZuZGVmIFNFU0xJTUlUCisjaWZkZWYgT1MyCisjZGVmaW5lIFNFU0xJTUlUCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogU0VTTElNSVQgKi8KKworI2lmbmRlZiBOT1RFUk0KKyNpZm5kZWYgUENURVJNCisjaWZkZWYgTlQKKyNkZWZpbmUgUENURVJNCisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBQQ1RFUk0gKi8KKyNlbmRpZiAvKiBOT1RFUk0gKi8KKworI2lmZGVmIEJFT1NPUkJFQk9YCisjZGVmaW5lIHF1ZXJ5IGNrcXVlcnkKKyNlbmRpZiAvKiBCRU9TT1JCRUJPWCAqLworCisjaWZuZGVmIFBUWU9SUElQRQkJCS8qIE5FVENNRCBhbmQvb3IgTkVUUFRZIGRlZmluZWQgKi8KKyNpZmRlZiBORVRDTUQKKyNkZWZpbmUgUFRZT1JQSVBFCisjZWxzZQorI2lmZGVmIE5FVFBUWQorI2RlZmluZSBQVFlPUlBJUEUKKyNlbmRpZiAvKiBORVRQVFkgKi8KKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNlbmRpZiAvKiBQVFlPUlBJUEUgKi8KKworLyogbWt0ZW1wKCkgYW5kIG1rc3RlbXAoKSAqLworCisjaWZuZGVmIE5PTUtURU1QCisjaWZuZGVmIE1LVEVNUAorI2lmZGVmIE9TMk9SVU5JWAorI2RlZmluZSBNS1RFTVAKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyNlbmRpZiAvKiBNS1RFTVAgKi8KKworI2lmZGVmIE1LVEVNUAorI2lmbmRlZiBOT01LU1RFTVAKKyNpZm5kZWYgTUtTVEVNUAorI2lmZGVmIEJTRDQ0CisjZGVmaW5lIE1LU1RFTVAKKyNlbHNlCisjaWZkZWYgX19saW51eF9fCisjZGVmaW5lIE1LU1RFTVAKKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworI2VuZGlmIC8qIE1LU1RFTVAgKi8KKyNlbmRpZiAvKiBOT01LU1RFTVAgKi8KKyNlbmRpZiAvKiBNS1RFTVAgKi8KKyNlbmRpZiAvKiBOT01LVEVNUCAqLworCisvKiBQbGF0Zm9ybXMgdGhhdCBoYXZlIG1lbWNweSgpIC0tIG9ubHkgYWZ0ZXIgYWxsIGhlYWRlcnMgaW5jbHVkZWQgKi8KKworI2lmbmRlZiBVU0VfTUVNQ1BZCisjaWZkZWYgVk1TCisjZGVmaW5lIFVTRV9NRU1DUFkKKyNlbHNlCisjaWZkZWYgTkVYVAorI2RlZmluZSBVU0VfTUVNQ1BZCisjZWxzZQorI2lmZGVmIE9TMgorI2RlZmluZSBVU0VfTUVNQ1BZCisjZWxzZQorI2lmZGVmIF9fbGludXhfXworI2RlZmluZSBVU0VfTUVNQ1BZCisjZWxzZQorI2lmZGVmIFNPTEFSSVMKKyNkZWZpbmUgVVNFX01FTUNQWQorI2Vsc2UKKyNpZmRlZiBTVU5PUzQKKyNkZWZpbmUgVVNFX01FTUNQWQorI2Vsc2UKKyNpZmRlZiBBSVhSUworI2RlZmluZSBVU0VfTUVNQ1BZCisjZWxzZQorI2lmZGVmIEhQVVgKKyNkZWZpbmUgVVNFX01FTUNQWQorI2Vsc2UKKyNpZmRlZiBQT1NJWAorI2RlZmluZSBVU0VfTUVNQ1BZCisjZWxzZQorI2lmZGVmIFNWUjQKKyNkZWZpbmUgVVNFX01FTUNQWQorI2Vsc2UKKyNpZmRlZiBPU0YKKyNkZWZpbmUgVVNFX01FTUNQWQorI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorI2RlZmluZSBVU0VfTUVNQ1BZCisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKyNkZWZpbmUgVVNFX01FTUNQWQorI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIE9TRiAqLworI2VuZGlmIC8qIFNWUjQgKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworI2VuZGlmIC8qIEhQVVggKi8KKyNlbmRpZiAvKiBBSVhSUyAqLworI2VuZGlmIC8qIFNVTk9TNCAqLworI2VuZGlmIC8qIFNPTEFSSVMgKi8KKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBORVhUICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogVVNFX01FTUNQWSAqLworCisjaWZuZGVmIFVTRV9NRU1DUFkKKyNkZWZpbmUgbWVtY3B5KGEsYixjKSBja21lbWNweSgoYSksKGIpLChjKSkKKyNlbHNlCisjaWZkZWYgQ0tfU0NPMzJWNAorLyogQmVjYXVzZSB0aGUgcHJvdG90eXBlIGlzbid0IHBpY2tlZCB1cCBpbiB0aGUgbm9ybWFsIGhlYWRlciBmaWxlcyAqLworX1BST1RPVFlQKCB2b2lkICptZW1jcHksICh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KSk7CisjZW5kaWYgLyogQ0tfU0NPMzJWNCAqLworI2VuZGlmIC8qIFVTRV9NRU1DUFkgKi8KKworLyogVXNlciBhdXRoZW50aWNhdGlvbiBmb3IgSUtTIC0tIFNvIGZhciBLOTUgYW5kIFVOSVggb25seSAqLworCisjaWZkZWYgTk9JQ1AKKyNpZm5kZWYgTk9MT0dJTgorI2RlZmluZSBOT0xPR0lOCisjZW5kaWYgLyogTk9MT0dJTiAqLworI2VuZGlmIC8qIE5PSUNQICovCisKKyNpZm5kZWYgTk9MT0dJTgorI2lmZGVmIE9TMk9SVU5JWAorI2lmbmRlZiBDS19MT0dJTgorI2RlZmluZSBDS19MT0dJTgorI2lmbmRlZiBOT1NIQURPVworI2lmZGVmIENLX1NDT1Y1CisjZGVmaW5lIENLX1NIQURPVworI2VuZGlmIC8qIENLX1NDT1Y1ICovCisjZW5kaWYgLyogTk9TSEFET1cgKi8KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2lmZGVmIE5UCisjZGVmaW5lIE5UQ1JFQVRFVE9LRU4KKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworI2Vsc2UgLyogTk9MT0dJTiAqLworI2lmZGVmIENLX0xPR0lOCisjdW5kZWYgQ0tfTE9HSU4KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2VuZGlmIC8qIE5PTE9HSU4gKi8KKworI2lmZGVmIE9TMgorI2RlZmluZSBDS1NQSU5ORVIKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIENLX0xPR0lOCQkJCS8qIFRlbG5ldCBwcm90b2NvbCByZXF1aXJlZCAqLworI2lmbmRlZiBUTkNPREUJCQkJLyogZm9yIGxvZ2luIHRvIElLU0QuICovCisjZGVmaW5lIFROQ09ERQorI2VuZGlmIC8qIFROQ09ERSAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorI2lmZGVmIE5PU0VORFVJRAorI3VuZGVmIE5PU0VORFVJRAorI2VuZGlmIC8qIE5PU0VORFVJRCAqLworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisKKyNpZmRlZiBUTkNPREUJCQkJLyogU2hvdWxkIFRFTE5FVCBzZW5kIHVzZXIgSUQ/ICovCisjaWZuZGVmIE5PU0VORFVJRAorI2lmbmRlZiBDS1NFTkRVSUQKKyNkZWZpbmUgQ0tTRU5EVUlECisjZW5kaWYgLyogQ0tTRU5EVUlEICovCisjZW5kaWYgLyogTk9TRU5EVUlEICovCisjZW5kaWYgLyogVE5DT0RFICovCisKKy8qIFVOSVggcGxhdGZvcm1zIHRoYXQgZG9uJ3QgaGF2ZSBnZXR1c2Vyc2hlbGwoKSAqLworCisjaWZkZWYgVU5JWAorI2lmbmRlZiBOT0dFVFVTRVJTSEVMTAorI2lmZGVmIElSSVgKKyNkZWZpbmUgTk9HRVRVU0VSU0hFTEwKKyNlbHNlCisjaWZkZWYgUFRYCisjZGVmaW5lIE5PR0VUVVNFUlNIRUxMCisjZWxzZQorI2lmZGVmIEFJWFJTCisjZGVmaW5lIE5PR0VUVVNFUlNIRUxMCisjZWxzZQorI2lmZGVmIFNJTklYCisjZGVmaW5lIE5PR0VUVVNFUlNIRUxMCisjZWxzZQorI2lmZGVmIFVOSVhXQVJFCisjZGVmaW5lIE5PR0VUVVNFUlNIRUxMCisjZWxzZQorI2lmZGVmIENPSEVSRU5UCisjZGVmaW5lIE5PR0VUVVNFUlNIRUxMCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBVTklYV0FSRSAqLworI2VuZGlmIC8qIFNJTklYICovCisjZW5kaWYgLyogQUlYUlMgKi8KKyNlbmRpZiAvKiBQVFggKi8KKyNlbmRpZiAvKiBJUklYICovCisjZW5kaWYgLyogTk9HRVRVU0VSU0hFTEwgKi8KKyNlbmRpZiAvKiBVTklYICovCisKKyNpZmRlZiBDS19MT0dJTgorI2lmZGVmIE5UCisjaWZuZGVmIE5PU1lTTE9HCisjaWZuZGVmIENLU1lTTE9HCisjZGVmaW5lIENLU1lTTE9HCisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyNlbmRpZiAvKiBOT1NZU0xPRyAqLworI2VuZGlmIC8qIE5UICovCisjaWZkZWYgVU5JWAorI2lmbmRlZiBOT1NZU0xPRworI2lmbmRlZiBDS1NZU0xPRworI2RlZmluZSBDS1NZU0xPRworI2VuZGlmIC8qIENLU1lTTE9HICovCisjZW5kaWYgLyogTk9TWVNMT0cgKi8KKyNpZm5kZWYgTk9XVE1QCisjaWZuZGVmIENLV1RNUAorI2RlZmluZSBDS1dUTVAKKyNlbmRpZiAvKiBDS1dUTVAgKi8KKyNlbmRpZiAvKiBOT1dUTVAgKi8KKyNpZm5kZWYgTk9HRVRVU0VSU0hFTEwKKyNpZm5kZWYgR0VUVVNFUlNIRUxMCisjZGVmaW5lIEdFVFVTRVJTSEVMTAorI2VuZGlmIC8qIEdFVFVTRVJTSEVMTCAqLworI2VuZGlmIC8qIE5PR0VUVVNFUlNIRUxMICovCisjZW5kaWYgLyogVU5JWCAqLworX1BST1RPVFlQKCBpbnQgY2t4bG9naW4sIChDSEFSICosIENIQVIgKiwgQ0hBUiAqLCBpbnQpKTsKK19QUk9UT1RZUCggaW50IGNreGxvZ291dCwgKFZPSUQpKTsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCisjaWZuZGVmIE5PWkxPQ0FMVElNRQkJCS8qIHpsb2NhbHRpbWUoKSBhdmFpbGFibGUuICovCisjaWZkZWYgT1MyT1JVTklYCisjZGVmaW5lIFpMT0NBTFRJTUUKK19QUk9UT1RZUCggY2hhciAqIHpsb2NhbHRpbWUsIChjaGFyICopICk7CisjZW5kaWYgLyogT1MyT1JVTklYICovCisjZW5kaWYgLyogTk9aTE9DQUxUSU1FICovCisKKyNpZmRlZiBDS1NZU0xPRwkJCQkvKiBTeXNsb2dnaW5nIGxldmVscyAqLworI2RlZmluZSBTWVNMR19OTyAwCQkJLyogTm8gbG9nZ2luZyAqLworI2RlZmluZSBTWVNMR19MSSAxCQkJLyogTG9naW4vb3V0ICovCisjZGVmaW5lIFNZU0xHX0RJIDIJCQkvKiBEaWFsaW5nIG91dCAqLworI2RlZmluZSBTWVNMR19BQyAzCQkJLyogTWFraW5nIGFueSBraW5kIG9mIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgU1lTTEdfUFIgNCAgICAgICAgICAgICAgICAgICAgICAvKiBQcm90b2NvbCBPcGVyYXRpb25zICovCisjZGVmaW5lIFNZU0xHX0ZDIDUJCQkvKiBGaWxlIGNyZWF0aW9uICovCisjZGVmaW5lIFNZU0xHX0ZBIDYJCQkvKiBGaWxlIHJlYWRpbmcgKi8KKyNkZWZpbmUgU1lTTEdfQ00gNwkJCS8qIFRvcC1sZXZlbCBjb21tYW5kcyAqLworI2RlZmluZSBTWVNMR19DWCA4CQkJLyogQWxsIGNvbW1hbmRzICovCisjZGVmaW5lIFNZU0xHX0RCIDkJCQkvKiBEZWJ1ZyAqLworI2RlZmluZSBTWVNMR01BWCA5CQkJLyogSGlnaGVzdCBsZXZlbCAqLworI2RlZmluZSBTWVNMR19ERiBTWVNMR19GQQkJLyogRGVmYXVsdCBsZXZlbCAqLworLyogTG9nZ2luZyBmdW5jdGlvbiAqLworX1BST1RPVFlQKFZPSUQgY2tzeXNsb2csKGludCwgaW50LCBjaGFyICosIGNoYXIgKiwgY2hhciAqKSk7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyNpZm5kZWYgQ0tDTUFJCitleHRlcm4gaW50IGNreGxvZ2dpbmcsIGNreHN5c2xvZywgaWtkYm9wZW47CisjZW5kaWYgLyogQ0tDTUFJICovCisKKyNpZm5kZWYgQ0tfS0VZVEFCCisjZGVmaW5lIENLX0tFWVRBQgorLyogS2V5d29yZCBUYWJsZSBUZW1wbGF0ZSAqLworCisvKiBOb3RlOiBmb3JtZXJseSBkZWZpbmVkIGluIGNrdWNtZC5oIGJ1dCBub3cgbW9yZSB3aWRlbHkgdXNlZCAqLworCitzdHJ1Y3Qga2V5dGFiIHsJCQkJLyogS2V5d29yZCB0YWJsZSAqLworICAgIGNoYXIgKmt3ZDsJCQkJLyogUG9pbnRlciB0byBrZXl3b3JkIHN0cmluZyAqLworICAgIGludCBrd3ZhbDsJCQkJLyogQXNzb2NpYXRlZCB2YWx1ZSAqLworICAgIGludCBmbGdzOwkJCQkvKiBGbGFncyAoYXMgZGVmaW5lZCBhYm92ZSkgKi8KK307CisjZW5kaWYgLyogQ0tfS0VZVEFCICovCisKKyNpZmRlZiBORVRQVFkKK19QUk9UT1RZUCggaW50IGRvX3B0eSwgKGNoYXIgKikpOworX1BST1RPVFlQKCBWT0lEIGVuZF9wdHksICh2b2lkKSk7CisjZW5kaWYgLyogTkVUUFRZICovCisKKyNpZmRlZiBDS1JPT1QKK19QUk9UT1RZUCggaW50IHpzZXRyb290LCAoY2hhciAqKSApOworX1BST1RPVFlQKCBjaGFyICogemdldHJvb3QsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgemlucm9vdCwgKGNoYXIgKikgKTsKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworLyogTG9jYWwgRWNobyBCdWZmZXIgcHJvdG90eXBlcyAqLworX1BST1RPVFlQKCBWT0lEIGxlX2luaXQsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIGxlX2NsZWFuLCAodm9pZCkpOworX1BST1RPVFlQKCBpbnQgbGVfaW5idWYsICh2b2lkKSk7CitfUFJPVE9UWVAoIGludCBsZV9wdXRzdHIsIChDSEFSICopKTsKK19QUk9UT1RZUCggaW50IGxlX3B1dHMsIChDSEFSICosIGludCkpOworX1BST1RPVFlQKCBpbnQgbGVfcHV0Y2hhciwgKENIQVIpKTsKK19QUk9UT1RZUCggaW50IGxlX2dldGNoYXIsIChDSEFSICopKTsKKworLyogI2lmbmRlZiBOT0hUVFAgKi8KKyNpZm5kZWYgTk9DTURBVEUyVE0KKyNpZm5kZWYgQ01EQVRFMlRNCisjaWZkZWYgT1MyT1JVTklYCisjZGVmaW5lIENNREFURTJUTQorI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworI2lmZGVmIFZNUworI2RlZmluZSBDTURBVEUyVE0KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBDTURBVEUyVE0gKi8KKyNlbmRpZiAvKiBOT0NNREFURTJUTSAqLworCisjaWZkZWYgQ01EQVRFMlRNCitfUFJPVE9UWVAoIHN0cnVjdCB0bSAqIGNtZGF0ZTJ0bSwgKGNoYXIgKixpbnQpKTsKKyNlbmRpZiAvKiBDTURBVEUyVE0gKi8KKy8qICNlbmRpZiAqLyAvKiBOT0hUVFAgKi8KKworI2lmbmRlZiBOT1NFVFRJTUUJCQkvKiBUaGlzIHdvdWxkIGJlIHNldCBpbiBDRkxBR1MgKi8KKyNpZmRlZiBTVlI0T1JQT1NJWAkJCS8qIERlZmluZWQgaW4gSUVFRSAxMDAzLjEtMTk5NiAqLworI2lmbmRlZiBVVElNRUgJCQkJLyogYW5kIGluIFNWSUQgZm9yIFNWUjQgKi8KKyNkZWZpbmUgVVRJTUVICisjZW5kaWYgLyogVVRJTUVIICovCisjZWxzZSAgLyogU1ZSNE9SUE9TSVggKi8KKyNpZmRlZiBPU0YJCQkJLyogVmVyaWZpZWQgYnkgTHVjYXMgSGFydCAqLworI2lmbmRlZiBVVElNRUgKKyNkZWZpbmUgVVRJTUVICisjZW5kaWYgLyogVVRJTUVIICovCisjZWxzZSAgLyogT1NGICovCisjaWZkZWYgU1VOT1M0MQkJCQkvKiBWZXJpZmllZCBieSBMdWNhcyBIYXJ0ICovCisjaWZuZGVmIFVUSU1FSAorI2RlZmluZSBVVElNRUgKKyNlbmRpZiAvKiBVVElNRUggKi8KKyNlbHNlICAvKiBTVU5PUzQxICovCisjaWZkZWYgT1MyCisjaWZuZGVmIFNZU1VUSU1FSAorI2RlZmluZSBTWVNVVElNRUgKKyNlbmRpZiAvKiBTWVNVVElNRUggKi8KKyNlbHNlIC8qIE9TMiAqLworI2lmZGVmIFZNUworI2lmbmRlZiBVVElNRUgKKyNkZWZpbmUgVVRJTUVICisjZW5kaWYgLyogVVRJTUVIICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogU1VOT1M0MSAqLworI2VuZGlmIC8qIE9TRiAqLworI2VuZGlmIC8qIFNWUjRPUlBPU0lYICovCisjZW5kaWYgLyogTk9TRVRUSU1FICovCisKKyNpZmRlZiBORVdGVFAKK19QUk9UT1RZUCggaW50IGZ0cGlzY29ubmVjdGVkLCAodm9pZCkpOworX1BST1RPVFlQKCBpbnQgZnRwaXNsb2dnZWRpbiwgKHZvaWQpKTsKK19QUk9UT1RZUCggaW50IGZ0cGlzc2VjdXJlLCAodm9pZCkpOworI2VuZGlmIC8qIE5FV0ZUUCAqLworCitfUFJPVE9UWVAoIGludCByZWFkcGFzcywgKGNoYXIgKiwgY2hhciAqLCBpbnQpKTsKK19QUk9UT1RZUCggaW50IHJlYWR0ZXh0LCAoY2hhciAqLCBjaGFyICosIGludCkpOworCisjaWZkZWYgT1MyCitfUFJPVE9UWVAoaW50IGNrX2F1dGhfbG9hZGRsbCwgKFZPSUQpKTsKK19QUk9UT1RZUChpbnQgY2tfYXV0aF91bmxvYWRkbGwsIChWT0lEKSk7CisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBOVAorX1BST1RPVFlQKERXT1JEIGNrR2V0TG9uZ1BhdGhuYW1lLChMUENTVFIgbHBGaWxlTmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGxwQnVmZmVyLCBEV09SRCBjY2hCdWZmZXIpKTsKKyNlbmRpZiAvKiBOVCAqLworCisjaW5jbHVkZSAiY2tjbGliLmgiCisKKy8qIEVuZCBvZiBja2NkZWIuaCAqLworI2VuZGlmIC8qIENLQ0RFQl9IICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2tjZm4yLmMgYi9ja2VybWl0LTguMC4yMTEvY2tjZm4yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiOTdhMgotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja2NmbjIuYwpAQCAtMCwwICsxLDMyOTcgQEAKKy8qICBDIEsgQyBGIE4gMiAgLS0gIFN5c3RlbS1pbmRlcGVuZGVudCBLZXJtaXQgcHJvdG9jb2wgc3VwcG9ydCBmdW5jdGlvbnMuLi4gKi8KKworLyogIC4uLlBhcnQgMiAoY29udGludWVkIGZyb20gY2tjZm5zLmMpICAqLworCisvKgorICBBdXRob3I6IEZyYW5rIGRhIENydXogPGZkY0Bjb2x1bWJpYS5lZHU+LAorICBDb2x1bWJpYSBVbml2ZXJzaXR5IEFjYWRlbWljIEluZm9ybWF0aW9uIFN5c3RlbXMsIE5ldyBZb3JrIENpdHkuCisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisvKgorIE5vdGUgLS0gaWYgeW91IGNoYW5nZSB0aGlzIGZpbGUsIHBsZWFzZSBhbWVuZCB0aGUgdmVyc2lvbiBudW1iZXIgYW5kIGRhdGUgYXQKKyB0aGUgdG9wIG9mIGNrY2Zucy5jIGFjY29yZGluZ2x5LgorKi8KKworI2luY2x1ZGUgImNrY3N5bS5oIgkJCS8qIENvbXBpbGF0aW9uIG9wdGlvbnMgKi8KKyNpbmNsdWRlICJja2NkZWIuaCIJCQkvKiBEZWJ1Z2dpbmcgYW5kIG90aGVyIHN5bWJvbHMgKi8KKyNpbmNsdWRlICJja2Nhc2MuaCIJCQkvKiBBU0NJSSBzeW1ib2xzICovCisjaW5jbHVkZSAiY2tja2VyLmgiCQkJLyogS2VybWl0IHN5bWJvbHMgKi8KKyNpbmNsdWRlICJja2N4bGEuaCIJCQkvKiBUcmFuc2xhdGlvbiAqLworI2luY2x1ZGUgImNrY25ldC5oIgkJCS8qIElLUyBhbmQgVk1TICNkZWZpbmUgVENQU09DS0VUICovCisjaWZkZWYgVENQU09DS0VUCQkJLyogRm9yIFRFTE5FVCBidXNpbmVzcyBpbiBzcGFjaygpICovCitleHRlcm4gaW50IHRuX25sbSwgdHRucHJvdG8sIHRuX2JfbmxtOworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCitleHRlcm4gaW50IHBhcml0eSwgbmV0d29yaywgbG9jYWwsIGludGVycnVwdGVkLCBmYXRhbGlvLCB3YXNjbG9zZWQ7CisKK2ludCBrc3RhcnRhY3RpdmUgPSAwOwkJCS8qIEZsYWcgZm9yIGtzdGFydCgpIGluIGEgcGFja2V0ICovCisKK3N0YXRpYyBDSEFSIHBfdGJsW10gPSB7CQkJLyogRXZlbiBwYXJpdHkgdGFibGUgZm9yIGRvcGFyKCkuICovCisgICAgKENIQVIpICdcMDAwJywJCQkvKiBBTlNJIEMgY2FzdHMgJ1xvb28nIGNvbnN0YW50cyAgKi8KKyAgICAoQ0hBUikgJ1wyMDEnLAkJCS8qIHRvIHNpZ25lZCBjaGFyLCBzbyB3ZSBoYXZlIHRvICAqLworICAgIChDSEFSKSAnXDIwMicsCQkJLyogY2FzdCBiYWNrIHRvIHVuc2lnbmVkIGNoYXIuLi4gICovCisgICAgKENIQVIpICdcMDAzJywKKyAgICAoQ0hBUikgJ1wyMDQnLAorICAgIChDSEFSKSAnXDAwNScsCisgICAgKENIQVIpICdcMDA2JywKKyAgICAoQ0hBUikgJ1wyMDcnLAorICAgIChDSEFSKSAnXDIxMCcsCisgICAgKENIQVIpICdcMDExJywKKyAgICAoQ0hBUikgJ1wwMTInLAorICAgIChDSEFSKSAnXDIxMycsCisgICAgKENIQVIpICdcMDE0JywKKyAgICAoQ0hBUikgJ1wyMTUnLAorICAgIChDSEFSKSAnXDIxNicsCisgICAgKENIQVIpICdcMDE3JywKKyAgICAoQ0hBUikgJ1wyMjAnLAorICAgIChDSEFSKSAnXDAyMScsCisgICAgKENIQVIpICdcMDIyJywKKyAgICAoQ0hBUikgJ1wyMjMnLAorICAgIChDSEFSKSAnXDAyNCcsCisgICAgKENIQVIpICdcMjI1JywKKyAgICAoQ0hBUikgJ1wyMjYnLAorICAgIChDSEFSKSAnXDAyNycsCisgICAgKENIQVIpICdcMDMwJywKKyAgICAoQ0hBUikgJ1wyMzEnLAorICAgIChDSEFSKSAnXDIzMicsCisgICAgKENIQVIpICdcMDMzJywKKyAgICAoQ0hBUikgJ1wyMzQnLAorICAgIChDSEFSKSAnXDAzNScsCisgICAgKENIQVIpICdcMDM2JywKKyAgICAoQ0hBUikgJ1wyMzcnLAorICAgIChDSEFSKSAnXDI0MCcsCisgICAgKENIQVIpICdcMDQxJywKKyAgICAoQ0hBUikgJ1wwNDInLAorICAgIChDSEFSKSAnXDI0MycsCisgICAgKENIQVIpICdcMDQ0JywKKyAgICAoQ0hBUikgJ1wyNDUnLAorICAgIChDSEFSKSAnXDI0NicsCisgICAgKENIQVIpICdcMDQ3JywKKyAgICAoQ0hBUikgJ1wwNTAnLAorICAgIChDSEFSKSAnXDI1MScsCisgICAgKENIQVIpICdcMjUyJywKKyAgICAoQ0hBUikgJ1wwNTMnLAorICAgIChDSEFSKSAnXDI1NCcsCisgICAgKENIQVIpICdcMDU1JywKKyAgICAoQ0hBUikgJ1wwNTYnLAorICAgIChDSEFSKSAnXDI1NycsCisgICAgKENIQVIpICdcMDYwJywKKyAgICAoQ0hBUikgJ1wyNjEnLAorICAgIChDSEFSKSAnXDI2MicsCisgICAgKENIQVIpICdcMDYzJywKKyAgICAoQ0hBUikgJ1wyNjQnLAorICAgIChDSEFSKSAnXDA2NScsCisgICAgKENIQVIpICdcMDY2JywKKyAgICAoQ0hBUikgJ1wyNjcnLAorICAgIChDSEFSKSAnXDI3MCcsCisgICAgKENIQVIpICdcMDcxJywKKyAgICAoQ0hBUikgJ1wwNzInLAorICAgIChDSEFSKSAnXDI3MycsCisgICAgKENIQVIpICdcMDc0JywKKyAgICAoQ0hBUikgJ1wyNzUnLAorICAgIChDSEFSKSAnXDI3NicsCisgICAgKENIQVIpICdcMDc3JywKKyAgICAoQ0hBUikgJ1wzMDAnLAorICAgIChDSEFSKSAnXDEwMScsCisgICAgKENIQVIpICdcMTAyJywKKyAgICAoQ0hBUikgJ1wzMDMnLAorICAgIChDSEFSKSAnXDEwNCcsCisgICAgKENIQVIpICdcMzA1JywKKyAgICAoQ0hBUikgJ1wzMDYnLAorICAgIChDSEFSKSAnXDEwNycsCisgICAgKENIQVIpICdcMTEwJywKKyAgICAoQ0hBUikgJ1wzMTEnLAorICAgIChDSEFSKSAnXDMxMicsCisgICAgKENIQVIpICdcMTEzJywKKyAgICAoQ0hBUikgJ1wzMTQnLAorICAgIChDSEFSKSAnXDExNScsCisgICAgKENIQVIpICdcMTE2JywKKyAgICAoQ0hBUikgJ1wzMTcnLAorICAgIChDSEFSKSAnXDEyMCcsCisgICAgKENIQVIpICdcMzIxJywKKyAgICAoQ0hBUikgJ1wzMjInLAorICAgIChDSEFSKSAnXDEyMycsCisgICAgKENIQVIpICdcMzI0JywKKyAgICAoQ0hBUikgJ1wxMjUnLAorICAgIChDSEFSKSAnXDEyNicsCisgICAgKENIQVIpICdcMzI3JywKKyAgICAoQ0hBUikgJ1wzMzAnLAorICAgIChDSEFSKSAnXDEzMScsCisgICAgKENIQVIpICdcMTMyJywKKyAgICAoQ0hBUikgJ1wzMzMnLAorICAgIChDSEFSKSAnXDEzNCcsCisgICAgKENIQVIpICdcMzM1JywKKyAgICAoQ0hBUikgJ1wzMzYnLAorICAgIChDSEFSKSAnXDEzNycsCisgICAgKENIQVIpICdcMTQwJywKKyAgICAoQ0hBUikgJ1wzNDEnLAorICAgIChDSEFSKSAnXDM0MicsCisgICAgKENIQVIpICdcMTQzJywKKyAgICAoQ0hBUikgJ1wzNDQnLAorICAgIChDSEFSKSAnXDE0NScsCisgICAgKENIQVIpICdcMTQ2JywKKyAgICAoQ0hBUikgJ1wzNDcnLAorICAgIChDSEFSKSAnXDM1MCcsCisgICAgKENIQVIpICdcMTUxJywKKyAgICAoQ0hBUikgJ1wxNTInLAorICAgIChDSEFSKSAnXDM1MycsCisgICAgKENIQVIpICdcMTU0JywKKyAgICAoQ0hBUikgJ1wzNTUnLAorICAgIChDSEFSKSAnXDM1NicsCisgICAgKENIQVIpICdcMTU3JywKKyAgICAoQ0hBUikgJ1wzNjAnLAorICAgIChDSEFSKSAnXDE2MScsCisgICAgKENIQVIpICdcMTYyJywKKyAgICAoQ0hBUikgJ1wzNjMnLAorICAgIChDSEFSKSAnXDE2NCcsCisgICAgKENIQVIpICdcMzY1JywKKyAgICAoQ0hBUikgJ1wzNjYnLAorICAgIChDSEFSKSAnXDE2NycsCisgICAgKENIQVIpICdcMTcwJywKKyAgICAoQ0hBUikgJ1wzNzEnLAorICAgIChDSEFSKSAnXDM3MicsCisgICAgKENIQVIpICdcMTczJywKKyAgICAoQ0hBUikgJ1wzNzQnLAorICAgIChDSEFSKSAnXDE3NScsCisgICAgKENIQVIpICdcMTc2JywKKyAgICAoQ0hBUikgJ1wzNzcnCit9OworCisvKiAgRCBPIFAgQSBSICAtLSAgQWRkIGFuIGFwcHJvcHJpYXRlIHBhcml0eSBiaXQgdG8gYSBjaGFyYWN0ZXIgICovCisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworZG9wYXIocmVnaXN0ZXIgQ0hBUiBjaCkKKyNlbHNlCitkb3BhcihjaCkgcmVnaXN0ZXIgQ0hBUiBjaDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworICAgIHsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYTsKKyAgICBpZiAoIXBhcml0eQorI2lmZGVmIFRDUFNPQ0tFVAorICAgICAgICB8fCAobmV0d29yayAmJiAodHRucHJvdG8gPT0gTlBfVEVMTkVUKSAmJiAoVEVMT1BUX01FKFRFTE9QVF9CSU5BUlkpKSkKKyNpZm5kZWYgTk9YRkVSCisJfHwgKCFsb2NhbCAmJiBzc3RlbG5ldCkJCS8qIFRFTE5FVCBCSU5BUlkgTU9ERSAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworICAgICAgICApIHJldHVybigoQ0hBUikgKGNoICYgMjU1KSk7IGVsc2UgYSA9IGNoICYgMTI3OworICAgIHN3aXRjaCAocGFyaXR5KSB7CisJY2FzZSAnZSc6ICByZXR1cm4ocF90YmxbYV0pOwkgICAgICAgICAgICAgLyogRXZlbiAqLworCWNhc2UgJ20nOiAgcmV0dXJuKChDSEFSKSAoYSB8IDEyOCkpOyAgICAgICAgIC8qIE1hcmsgKi8KKwljYXNlICdvJzogIHJldHVybigoQ0hBUikgKHBfdGJsW2FdIF4gMTI4KSk7ICAvKiBPZGQgKi8KKwljYXNlICdzJzogIHJldHVybigoQ0hBUikgYSk7CSAgICAgICAgICAgICAvKiBTcGFjZSAqLworCWRlZmF1bHQ6ICAgcmV0dXJuKChDSEFSKSBhKTsgICAgICAgICAgICAgICAgIC8qIFNvbWV0aGluZyBpbGxlZ2FsICovCisgICAgfQorfQorCisjaWZuZGVmIE5PWEZFUgkJCQkvKiBSZXN0IG9mIHRoaXMgZmlsZS4uLiAqLworCisjZGVmaW5lIE5FV0RQTAkJCQkvKiBOZXcgZHluYW1pYyBwYWNrZXQgbGVuZ3RoIG1ldGhvZCAqLworCisjaWZkZWYgVk1TCitleHRlcm4gaW50IGJhdGNoOworI2Vsc2UKK2V4dGVybiBpbnQgYmFja2dyZDsKKyNlbmRpZiAvKiBWTVMgKi8KKworI2lmZGVmIERZTkFNSUMKK2V4dGVybiBzdHJ1Y3QgcGt0aW5mbyAqc19wa3Q7CQkvKiBhcnJheSBvZiBwa3RpbmZvIHN0cnVjdHVyZXMgKi8KK2V4dGVybiBzdHJ1Y3QgcGt0aW5mbyAqcl9wa3Q7CQkvKiBhcnJheSBvZiBwa3RpbmZvIHN0cnVjdHVyZXMgKi8KKyNlbHNlCitleHRlcm4gc3RydWN0IHBrdGluZm8gc19wa3RbXTsJCS8qIGFycmF5IG9mIHBrdGluZm8gc3RydWN0dXJlcyAqLworZXh0ZXJuIHN0cnVjdCBwa3RpbmZvIHJfcGt0W107CQkvKiBhcnJheSBvZiBwa3RpbmZvIHN0cnVjdHVyZXMgKi8KKyNlbmRpZiAvKiBEWU5BTUlDICovCisKK2V4dGVybiBpbnQgc3NlcXRibFtdLCByc2VxdGJsW10sIHNidWZ1c2VbXSwgc2Fja3RibFtdLCB3c2xvdHMsIHdpbmxvLCB3c2xvdG4sCisgIHNidWZudW0sIHJidWZudW0sIHBrdHBhdXMsIHJlbGlhYmxlOworCisjaWZkZWYgU1RSRUFNSU5HCitzdGF0aWMgaW50IGRvbnRzZW5kID0gMDsKK2V4dGVybiBpbnQgc3RyZWFtaW5nOworI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCitleHRlcm4gaW50IHR0cHJ0eTsJCQkvKiBmcm9tIGNrKnRpby5jICovCitleHRlcm4gaW50IGF1dG9wYXI7CisKK2V4dGVybiBpbnQgc3BzaXosIHNwbWF4LCBycHNpeiwgdGltaW50LCB0aW1lZiwgbnBhZCwgYmVzdGxlbiwgbWF4c2VuZDsKK2V4dGVybiBpbnQgcnB0LCBycHRxLCBycHRmbGcsIGNhcGFzLCBzcHNpemYsIGVuX2ZpbiwgdHNlY3MsIGZsb3c7CitleHRlcm4gaW50IHBrdG51bSwgc25kdHlwLCByY3Z0eXAsIGJjdHIsIGJjdHUsIGJjdGwsIHJzbiwgcmxuLCBtYXh0cnksIHNpemU7CitleHRlcm4gaW50IG9zaXplLCBtYXhzaXplLCBzcGt0bCwgcnBrdGwsIG5maWxzLCBzdGRvdWYsIGZzZWNzOworZXh0ZXJuIGludCB0dXJuLCB0dXJuY2gsIGRpc3BsYSwgcGt0bG9nLCBzZXNsb2csIHhmbGcsIG15cGFkbjsKK2V4dGVybiBpbnQgaGNmbGcsIHNlcnZlciwgY3hzZWVuLCBjenNlZW4sIGRpc2NhcmQsIHNsb3N0YXJ0OworZXh0ZXJuIGludCBuYWtzdGF0ZSwgcXVpZXQsIHN1Y2Nlc3MsIHhpdHN0YSwgd2hhdCwgZmlsZXN0YXR1czsKK2V4dGVybiBpbnQgc3BhY2tldHMsIHJwYWNrZXRzLCB0aW1lb3V0cywgcmV0cmFucywgY3J1bmNoZWQsIHVycHNpejsKK2V4dGVybiBpbnQgY2FycmllciwgZmRpc3BsYSwgc3J2aWRsOworCisjaWZkZWYgR0ZUSU1FUgorZXh0ZXJuIENLRkxPQVQgZnB0c2VjcywgZnBmc2VjcywgZnB4ZnNlY3M7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworCitleHRlcm4gbG9uZyBmaWxjbnQsIGZpbHJlaiwgZmZjLCBmbGNpLCBmbGNvLCB0bGNpLCB0bGNvLCB0ZmMsIHNwZWVkOworZXh0ZXJuIGxvbmcgZmlsY3BzLCB0ZmNwczsKKworZXh0ZXJuIGNoYXIgKmNtYXJnLCBmaWxuYW1bXTsKKworZXh0ZXJuIENIQVIgcGFkY2gsIG15cGFkYywgZW9sLCBzZW9sLCBjdGxxLCBzc3RhdGU7CitleHRlcm4gQ0hBUiAqcmVjcGt0LCAqZGF0YSwgbXlpbml0W107CitleHRlcm4gQ0hBUiAqc3J2cHRyLCBzdGNociwgbXlzdGNoLCAqcmRhdGFwOworZXh0ZXJuIENIQVIgcGFkYnVmW107CitleHRlcm4gQ0hBUiAqIGVwa3Rtc2c7CitleHRlcm4gaW50IGVwa3RyY3ZkLCBlcGt0c2VudDsKKworI2lmZGVmIE9TMgkJCQkvKiBBVVRPRE9XTkxPQUQgcGFyYW1ldGVycyAqLworZXh0ZXJuIGludCBhZGxfa21vZGUsIGFkbF96bW9kZTsJLyogTWF0Y2ggUGFja2V0IHRvIHNpZ25hbCBkb3dubG9hZCAqLworZXh0ZXJuIGNoYXIgKiBhZGxfa3N0cjsJCQkvKiBLRVJNSVQgRG93bmxvYWQgU3RyaW5nICovCitleHRlcm4gY2hhciAqIGFkbF96c3RyOwkJCS8qIFpNT0RFTSBEb3dubG9hZCBTdHJpbmcgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIENLX0FVVE9ETAorQ0hBUiBrc2J1Zls5Nl0gPSB7IE5VTCwgTlVMIH07CQkvKiBBdXRvZG93bmxvYWQgIktlcm1pdCBTdGFydCIgYnVmICovCisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisKK2ludCBudW1lcnJzID0gMDsJCQkvKiBOdW1iZXIgb2YgcGFja2V0IGVycm9ycyBzbyBmYXIgKi8KK2ludCByY3Z0aW1vID0gMDsJCQkvKiBUaW1lb3V0IGZvciByZWNlaXZpbmcgYSBwYWNrZXQgKi8KK2ludCBpZGxldG1vID0gMDsJCQkvKiBGbGFnIGZvciBpZGxlIHRpbWVvdXQgKi8KKworbG9uZyBmaWxjcHMgPSAwTDsJCQkvKiBDUFMgbW9zdCByZWNlbnQgZmlsZSB0cmFuc2ZlcnJlZCAqLworbG9uZyB0ZmNwcyAgPSAwTDsJCQkvKiBDUFMgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gKi8KK2xvbmcgeGZzZWNzID0gMEw7CQkJLyogRWxhcHNlZCB0aW1lIGZvciBtb3N0IHJlY2VudCBmaWxlICovCisjaWZkZWYgR0ZUSU1FUgorQ0tGTE9BVCBmcHhmc2VjcyA9IDAuMDsJCQkvKiBEaXR0bywgYnV0IGZsb2F0aW5nIHBvaW50ICovCisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisjaWZkZWYgQ0tfVElNRVJTCitpbnQgcnJ0dGJsWzY0XSwgc3J0dGJsWzY0XTsJCS8qIFBhY2tldCB0aW1lc3RhbXAgdGFibGVzICovCitleHRlcm4gaW50IHJ0dGZsZzsKKyNkZWZpbmUgUlRUX1NDQUxFIDEwMDAKK2xvbmcKKyAgcnR0c2FtcGxlcywJCQkJLyogUm91bmQgdHJpcCB0aW1lIHNhbXBsZXMgKi8KKyAgcnR0ZGVsYXksCQkJCS8qIFJUVCBkZWxheSAqLworICBwa3RpbnR2bCwJCQkJLyogSW50ZXJwYWNrZXQgYXJyaXZhbCB0aW1lICovCisgIHJ0dHZhcmlhbmNlLAkJCQkvKiBSVFQgdmFyaWFuY2UgKi8KKyAgcnR0c3RkZGV2OwkJCQkvKiBSVFQgc3RhbmRhcmQgZGV2aWF0aW9uICovCisjZW5kaWYgLyogQ0tfVElNRVJTICovCisKKy8qIENSQyBnZW5lcmF0aW9uIHRhYmxlcyAqLworCitsb25nIGNyY3RhWzE2XSA9IHsgMEwsIDAxMDIwMUwsIDAyMDQwMkwsIDAzMDYwM0wsIDA0MTAwNEwsCisgIDA1MTIwNUwsIDA2MTQwNkwsIDA3MTYwN0wsIDAxMDIwMTBMLCAwMTEyMjExTCwgMDEyMjQxMkwsIDAxMzI2MTNMLCAwMTQzMDE0TCwKKyAgMDE1MzIxNUwsIDAxNjM0MTZMLCAwMTczNjE3TAorfTsKKworbG9uZyBjcmN0YlsxNl0gPSB7IDBMLCAwMTA2MTFMLCAwMjE0MjJMLCAwMzEyMzNMLCAwNDMwNDRMLAorICAwNTM2NTVMLCAwNjI0NjZMLCAwNzIyNzdMLCAwMTA2MTEwTCwgMDExNjcwMUwsIDAxMjc1MzJMLCAwMTM3MzIzTCwgMDE0NTE1NEwsCisgIDAxNTU3NDVMLCAwMTY0NTc2TCwgMDE3NDM2N0wKK307CisKKyNpZmRlZiBDS19USU1FUlMKKy8qCisgIFJvdW5kLXRyaXAgdGltZXIgY2FsY3VsYXRpb25zIGFkYXB0ZWQgZnJvbSBUaW0gS2llbnR6bGUncyBhcnRpY2xlLAorICAiSW1wcm92aW5nIEtlcm1pdCBQZXJmb3JtYW5jZSIsIERyIERvYmIncyBKb3VybmFsLCBGZWJydWFyeSAxOTk2LgorKi8KKworCisvKiAgUiBUIFQgSSBOIEkgVCAgLS0gIEluaXRpYWxpemUgdGltZXJzIGF0IHN0YXJ0IG9mIHRyYW5zYWN0aW9uICAqLworCitWT0lECitydHRpbml0KCkgewkJCQkvKiBJbml0aWFsaXplIHJvdW5kLXRyaXAgdGltaW5nICovCisgICAgaW50IGk7CisKKyAgICBpZiAodGltaW50ID09IDApCisgICAgICByZXR1cm47CisKKyAgICBydHRzYW1wbGVzICA9IDBMOwkJCS8qIFNhbXBsZXMgKHBhY2tldHMpICovCisgICAgcnR0dmFyaWFuY2UgPSAwTDsJCQkvKiBWYXJpYW5jZSBpbiBkZWxheSAqLworICAgIHJ0dGRlbGF5ICAgID0gKGxvbmcpIHRpbWludCAqIFJUVF9TQ0FMRTsgLyogRGVsYXkgKi8KKyAgICBwa3RpbnR2bCAgICA9IChsb25nKSB0aW1pbnQgKiBSVFRfU0NBTEU7IC8qIERlbGF5ICovCisgICAgcnR0c3RkZGV2ICAgPSAobG9uZykgdGltaW50ICogUlRUX1NDQUxFOyAvKiBTdGFuZGFyZCBkZXZpYXRpb24gb2YgZGVsYXkgKi8KKworICAgIC8qIFRhYmxlcyBvZiB0aW1lc3RhbXBzIGluZGV4ZWQgYnkgcGFja2V0IHNlcXVlbmNlIG51bWJlciAqLworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwlycnR0YmxbaV0gPSAtMTsJCQkvKiBUaW1lIGVhY2ggcGFja2V0IHdhcyByZWNlaXZlZCAqLworCXNydHRibFtpXSA9IC0xOwkJCS8qIFRpbWUgZWFjaCBwYWNrZXQgd2FzIHNlbnQgKi8KKyAgICB9CisgICAgcmN2dGltbyA9IHRpbWludDsJCQkvKiBJbml0aWFsIHRpbWVvdXQgaXMgd2hhdCB1c2VyIHNhaWQgKi8KK30KKworLyogIEcgRSBUIFIgVCBUICAtLSAgR2V0IHBhY2tldCByb3VuZCB0cmlwIHRpbWUgICovCisvKgorICBDYWxsIHdpdGggbmFrc3RhdGUgPT0gMCBpZiBmaWxlIHNlbmRlciwgbm9uemVybyBpZiByZWNlaXZlciwKKyAgYW5kIG4gPT0gcGFja2V0IHNlcXVlbmNlIG51bWJlciBvZiB0aGUgcGFja2V0IHdlIGp1c3QgcmVjZWl2ZWQuCisKKyAgUmV0dXJuczoKKyAgLTEgb24gZmFpbHVyZSB3aXRoIHJjdnRpbW8gc2V0IHRvIHRpbWludCAod2hhdCB0aGUgdXNlciBzYWlkKSwgb3I6CisgICAwIG9uIHN1Y2Nlc3Mgd2l0aCByY3Z0aW1vIHNldCB0byBkeW5hbWljYWxseSBjYWxjdWxhdGVkIHZhbHVlOgorICAgICAxIDw9IHJjdnRpbW8gPD0gdGltaW50ICogMy4KKyovCitpbnQKK2dldHJ0dChuYWtzdGF0ZSwgbikgaW50IG5ha3N0YXRlLCBuOyB7CisgICAgZXh0ZXJuIGludCBtaW50aW1lLCBtYXh0aW1lOworICAgIHN0YXRpYyBpbnQgcHJldnogPSAwLCBwcmV2ciA9IDA7CisgICAgaW50IHgsIHksIHl5LCB6ID0gMCwgenogPSAwOwkvKiBIb3cgbG9uZyBkaWQgaXQgdGFrZSB0byBnZXQgaGVyZT8gKi8KKworICAgIHJjdnRpbW8gPSB0aW1pbnQ7CQkJLyogRGVmYXVsdCB0aW1lb3V0IGlzIHdoYXQgdXNlciBzYWlkICovCisKKyAgICBpZiAodGltaW50ID09IDApCQkJLyogV2UncmUgbm90IHRpbWluZyBvdXQuICovCisgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAoIXJ0dGZsZykJCQkvKiBOb3Qgc3VwcG9zZWQgdG8gYmUgZG9pbmcgdGhpcz8gKi8KKyAgICAgIHJldHVybigtMSk7CQkJLyogIFNvIGRvbid0ICovCisKKyAgICBpZiAoIVJUVF9TQ0FMRSkJCQkvKiBQYXJhbm9pYS4uLiAqLworICAgICAgcmV0dXJuKC0xKTsKKworICAgIC8qIHJ0aW1lcigpIChyZXNldCB0aW1lcikgaXMgbm90IGNhbGxlZCB1bnRpbCAxc3QgZGF0YSBwYWNrZXQgKi8KKyNpZmRlZiBHRlRJTUVSCisgICAgLyogcmZ0aW1lcigpOyAqLworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyAgICAvKiBTIChGIFsgQSBdIEQqIFopKiBCICovCisKKyAgICAvKiBOT1RFOiB3ZSBjYWxjdWxhdGUgYm90aCB0aGUgcm91bmQtdHJpcCB0aW1lIEFORCB0aGUgcGFja2V0ICovCisgICAgLyogYXJyaXZhbCByYXRlLiAgV2UgZG9uJ3QgdXNlIHRoZSBSVFQgZm9yIGFueXRoaW5nLCB3ZSBqdXN0IGRpc3BsYXkgaXQuICovCisgICAgLyogVGltZW91dHMgYXJlIGJhc2VkIG9uIHRoZSBwYWNrZXQgYXJyaXZhbCByYXRlLiAqLworCisgICAgaWYgKHNwYWNrZXRzID4gMykgewkJCS8qIERvbid0IHN0YXJ0IHRpbGwgNHRoIHBhY2tldCAqLworCWlmIChuYWtzdGF0ZSkgewkJCS8qIEZpbGUgcmVjZWl2ZXIgKi8KKwkgICAgeCA9IHJydHRibFtuXTsJCSAgICAgLyogVGltZSB3aGVuIEkgZ290IHBhY2tldCBuICovCisJICAgIHkgPSBycnR0YmxbbiA+IDAgPyBuIC0gMSA6IDYzXTsgIC8qIFRpbWUgd2hlbiBJIGdvdCBwYWNrZXQgbi0xICovCisJICAgIHl5ID0gc3J0dGJsW24gPiAwID8gbiAtIDEgOiA2M107IC8qIFRpbWUgd2hlbiBJIHNlbnQgQUNLKG4tMSkgKi8KKwkgICAgaWYgKHggPiAtMSAmJiB5ID4gLTEpIHsJLyogQmUgY2FyZWZ1bCAqLworCQl6ID0geCAtIHk7CQkvKiBQYWNrZXQgcmF0ZSAqLworCQl6eiA9IHggLSB5eTsJCS8qIFJvdW5kIHRyaXAgdGltZSAqLworCQl6Kys7CQkJLyogU28gc2VuZGVyICYgcmVjZWl2ZXIgZGlmZmVyICovCisJCWRlYnVnKEYxMDEsIlJUVCBSRUNWIiwiIix6KTsKKwkgICAgfSBlbHNlIHsJCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gKi8KKwkJZGVidWcoRjEwMSwiUlRUIFJFQ1YgRVJST1Igc3BhY2tldHMiLCIiLHNwYWNrZXRzKTsKKwkJZGVidWcoRjEwMSwiUlRUIFJFQ1YgRVJST1Igc2VxdWVuY2UiLCIiLG4pOworCQlyZXR1cm4oLTEpOworCSAgICB9CisJfSBlbHNlIHsJCQkvKiBGaWxlIHNlbmRlciAqLworCSAgICB4ID0gcnJ0dGJsW25dOwkJLyogVGltZSB3aGVuIEkgZ290IEFDSyhuKSAqLworCSAgICB5ID0gcnJ0dGJsW24gPiAwID8gbiAtIDEgOiA2M107IC8qIFRpbWUgd2hlbiBJIGdvdCBwYWNrZXQgbi0xICovCisJICAgIHl5ID0gc3J0dGJsW25dOwkJLyogVGltZSB3aGVuIEkgc2VudCBuICovCisJICAgIGlmICh4ID4gLTEgJiYgeSA+IC0xKSB7CisJCXogPSB4IC0geTsJCS8qIFBhY2tldCByYXRlICovCisJCXp6ID0geCAtIHl5OwkJLyogUm91bmQgdHJpcCB0aW1lICovCisJCWRlYnVnKEYxMDEsIlJUVCBTRU5EIiwiIix6KTsKKwkgICAgfSBlbHNlIHsKKwkJZGVidWcoRjEwMCwiUlRUIFNFTkQgRVJST1IiLCIiLDApOworCQlyZXR1cm4oLTEpOworCSAgICB9CisJfQorCWlmICh6IDwgMSkJCQkvKiBGb3IgZmFzdCBjb25uZWN0aW9ucyAqLworCSAgeiA9IFJUVF9TQ0FMRSAvIDI7CQkvKiBDb252ZXJ0IHRvIHNjYWxlLi4uICovCisJZWxzZQorCSAgeiAqPSBSVFRfU0NBTEU7CisJZGVidWcoRjEwMSwiUlRUIHogc2NhbGVkIiwiIix6KTsKKworCWlmICh6eiA8IDEpCQkJLyogRm9yIGZhc3QgY29ubmVjdGlvbnMgKi8KKwkgIHp6ID0gUlRUX1NDQUxFIC8gMjsJCS8qIENvbnZlcnQgdG8gc2NhbGUuLi4gKi8KKwllbHNlCisJICB6eiAqPSBSVFRfU0NBTEU7CisKKwlydHRkZWxheSA9IHp6OwkJCS8qIFJvdW5kIHRyaXAgdGltZSBvZiB0aGlzIHBhY2tldCAqLworI2lmZGVmIENPTU1FTlQKKy8qCisgIFRoaXMgd2FzIHVzZWQgaW4gQy1LZXJtaXQgNy4wIChhbmQgNi4wPykgYnV0IG5vdCBvbmx5IGlzIGl0IG92ZXJraWxsLAorICBpdCBhbHNvIGNhbiBwcm9kdWNlIHJpZGljdWxvdXNseSBsb25nIHRpbWVvdXRzIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4KKyAgUmVwbGFjZWQgaW4gOC4wIGJ5IGEgZmFyIHNpbXBsZXIgYW5kIG1vcmUgYWdncmVzc2l2ZSBzdHJhdGVneS4KKyovCisJaWYgKHJ0dHNhbXBsZXMrKyA9PSAwTCkgewkvKiBGaXJzdCBzYW1wbGUgKi8KKwkgICAgcGt0aW50dmwgPSB6OworCX0gZWxzZSB7CQkJLyogU3Vic2VxdWVudCBzYW1wbGVzICovCisJICAgIGxvbmcgb2xkYXZnID0gcGt0aW50dmw7CisJICAgIGxvbmcgcnR0ZGlmZnNxOworCisJICAgIGlmIChydHRzYW1wbGVzID4gMzApCS8qIFVzZSByZWFsIGF2ZXJhZ2UgZm9yIGZpcnN0IDMwICovCisJICAgICAgcnR0c2FtcGxlcyA9IDMwOwkJLyogIHRoZW4gZGVjYXlpbmcgYXZlcmFnZS4gKi8KKworCSAgICAvKiBBdmVyYWdlIGRlbGF5LCBkaWZmZXJlbmNlIHNxdWFyZWQsIHZhcmlhbmNlLCBzdGQgZGV2aWF0aW9uICovCisKKwkgICAgcGt0aW50dmwgKz0gKHogLSBwa3RpbnR2bCkgLyBydHRzYW1wbGVzOworCSAgICBydHRkaWZmc3EgPSAoeiAtIG9sZGF2ZykgKiAoeiAtIG9sZGF2Zyk7CisJICAgIHJ0dHZhcmlhbmNlICs9IChydHRkaWZmc3EgLSBydHR2YXJpYW5jZSkgLyBydHRzYW1wbGVzOworCSAgICBkZWJ1ZyhGMTAxLCJSVFQgc3RkZGV2MSIsIiIscnR0c3RkZGV2KTsKKwkgICAgaWYgKHJ0dHN0ZGRldiA8IDFMKQkJLyogSXQgY2FuIGJlIHplcm8sIGluIHdoaWNoIGNhc2UgKi8KKwkgICAgICBydHRzdGRkZXYgPSBSVFRfU0NBTEUgLyAzOyAvKiBzZXQgaXQgdG8gc29tZXRoaW5nIHNtYWxsLi4uICovCisJICAgIHJ0dHN0ZGRldiA9IChydHRzdGRkZXYgKyBydHR2YXJpYW5jZSAvIHJ0dHN0ZGRldikgLyAyOworCX0KKwlkZWJ1ZyhGMTAxLCJSVFQgc3RkZGV2MiIsIiIscnR0c3RkZGV2KTsKKwlkZWJ1ZyhGMTAxLCJSVFQgZGVsYXkgICIsIiIscGt0aW50dmwpOworCXJjdnRpbW8gPSAocGt0aW50dmwgKyAoM0wgKiBydHRzdGRkZXYpKSAvIFJUVF9TQ0FMRSArIDE7CisJaWYgKHJwYWNrZXRzIDwgMzIpCQkvKiBBbGxvdyBmb3Igc2xvdyBzdGFydCAqLworCSAgcmN2dGltbyArPSByY3Z0aW1vICsgMjsKKwllbHNlIGlmIChycGFja2V0cyA8IDY0KQorCSAgcmN2dGltbyArPSByY3Z0aW1vIC8gMiArIDE7CisgICAgICAgIC8qIE9uIGEgcmVsaWFibGUgbGluaywgZG9uJ3QgdHJ5IHRvbyBoYXJkIHRvIHRpbWUgb3V0LiAqLworCS8qIEVzcGVjaWFsbHkgb24gZmFzdCBsb2NhbCBuZXR3b3JrIGNvbm5lY3Rpb25zLiAqLworICAgICAgICBpZiAoc2VydmVyICYmIHdoYXQgPT0gV19OT1RISU5HKSAvKiBTZXJ2ZXIgY29tbWFuZCB3YWl0ICovCisJICByY3Z0aW1vID0gcmN2dGltbzsJCS8qID09IHNydnRpbSAqLworICAgICAgICBlbHNlIGlmIChyZWxpYWJsZSA9PSBTRVRfT04gJiYgcmN2dGltbyA+IDApIC8qIFJlbGlhYmxlICovCisJICByY3Z0aW1vID0gcmN2dGltbyArMTU7CS8qIGFuZCBub3Qgc2VydmVyIGNvbW1hbmQgd2FpdCAqLworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCByZWxpYWJsZSBvciBzZXJ2ZXIgY21kIHdhaXQgKi8KKwkgIHJjdnRpbW8gPSByY3Z0aW1vOworCWlmIChyY3Z0aW1vIDwgbWludGltZSkJCS8qIExvd2VyIGJvdW5kICovCisJICByY3Z0aW1vID0gbWludGltZTsKKwlpZiAobWF4dGltZSA+IDApIHsJCS8qIFVzZXIgc3BlY2lmaWVkIGFuIHVwcGVyIGJvdW5kICovCisJICAgIGlmIChyY3Z0aW1vID4gbWF4dGltZSkKKwkgICAgICByY3Z0aW1vID0gbWF4dGltZTsKKwl9IGVsc2UgaWYgKG1heHRpbWUgPT0gMCkgewkvKiBVc2VyIGRpZG4ndCBzcGVjaWZ5ICovCisJICAgIGlmIChyY3Z0aW1vID4gdGltaW50ICogNikKKwkgICAgICByY3Z0aW1vID0gdGltaW50ICogNjsKKwl9CisjZWxzZSAgLyogQ09NTUVOVCAqLworI2lmZGVmIENLRkxPQVQKKwl7CisJICAgIENLRkxPQVQgeDsKKwkgICAgeCA9IChDS0ZMT0FUKShwcmV2eiArIHogKyB6KSAvIDMuMDsKKwkgICAgcmN2dGltbyA9IChpbnQpKCgoKENLRkxPQVQpeCAqIDIuNjYpIC8gUlRUX1NDQUxFKSArIDAuNSk7CisJICAgIGRlYnVnKEYxMDEsIlJUVCByY3Z0aW1vIChmbG9hdCkiLCIiLHJjdnRpbW8pOworCX0KKyNlbHNlCisJcmN2dGltbyA9IChwcmV2eiArIHogKyB6KSAvIFJUVF9TQ0FMRTsKKwlkZWJ1ZyhGMTAxLCJSVFQgcmN2dGltbyAoaW50KSIsIiIscmN2dGltbyk7CisjZW5kaWYgLyogQ0tGTE9BVCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworCXp6ID0gKHJ0dGRlbGF5ICsgNTAwKSAvIDEwMDA7CisJaWYgKHJjdnRpbW8gPiAoenogKiAzKSkKKwkgIHJjdnRpbW8gPSB6eiAqIDM7CisKKwlpZiAocmN2dGltbyA8IDEpCisJICByY3Z0aW1vID0gMTsKKwlpZiAobWludGltZSA+IDApIHsKKwkgICAgaWYgKHJjdnRpbW8gPCBtaW50aW1lKQkvKiBMb3dlciBib3VuZCAqLworCSAgICAgIHJjdnRpbW8gPSBtaW50aW1lOworCX0KKwlpZiAobWF4dGltZSA+IDApIHsJCS8qIFVwcGVyIGJvdW5kICovCisJICAgIGlmIChyY3Z0aW1vID4gbWF4dGltZSkKKwkgICAgICByY3Z0aW1vID0gbWF4dGltZTsKKwl9CisJaWYgKHJjdnRpbW8gPT0gKHByZXZyIC0gMSkpCisJICByY3Z0aW1vKys7CisKKwlkZWJ1ZyhGMTAxLCJSVFQgZmluYWwgcmN2dGltbyIsIiIscmN2dGltbyk7CisgICAgfQorICAgIHByZXZ6ID0gejsKKyAgICBwcmV2ciA9IHJjdnRpbW87CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIENLX1RJTUVSUyAqLworCisvKiAgSSBOIFAgVSBUICAtLSAgQXR0ZW1wdCB0byByZWFkIHBhY2tldCBudW1iZXIgJ3BrdG51bScuICAqLworCisvKgorIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZmVlZHMgaW5wdXQgdG8gS2VybWl0J3MgZmluaXRlIHN0YXRlIG1hY2hpbmUsCisgaW4gdGhlIGZvcm0gb2YgYSBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlIDMyLTEyNiwgbm9ybWFsbHkgYSBwYWNrZXQgdHlwZQorICh1cHBlcmNhc2UgbGV0dGVyKSBvciBwc2V1ZG8tcGFja2V0LXR5cGUgKGxvd2VyY2FzZSBsZXR0ZXIpLgorCisgSWYgYSBzcGVjaWFsIHN0YXJ0IHN0YXRlIGlzIGluIGVmZmVjdCwgdGhhdCBzdGF0ZSBpcyByZXR1cm5lZCBhcyBpZiBpdCB3ZXJlCisgdGhlIHR5cGUgb2YgYW4gaW5jb21pbmcgcGFja2V0LgorKi8KK2ludAoraW5wdXQoKSB7CisgICAgaW50IHR5cGUgPSAwLCBhY2t0eXBlOwkJLyogUmVjZWl2ZWQgcGFja2V0IHR5cGUgKi8KKyAgICBpbnQgeCwgeSwgazsJCQkvKiBXb3JrZXJzICovCisgICAgaW50IHosIHBpLCBuZjsJCQkvKiBXb3JrZXIsIHBhY2tldCBpbmRleCwgTkFLIGZsYWcgKi8KKyAgICBpbnQgbmFrMmFjayA9IDA7CisKKyAgICBkZWJ1ZyhGMDAwLCJpbnB1dCBzc3RhdGUiLCIiLHNzdGF0ZSk7CisgICAgZGVidWcoRjEwMSwiaW5wdXQgbmFrc3RhdGUiLCIiLG5ha3N0YXRlKTsKKyAgICBkZWJ1ZyhGMDAwLCJpbnB1dCBzbmR0eXAiLCIiLHNuZHR5cCk7CisgICAgZGVidWcoRjEwMSwiaW5wdXQgeGl0c3RhIiwiIix4aXRzdGEpOworICAgIGRlYnVnKEYxMDEsImlucHV0IHdoYXQiLCIiLHdoYXQpOworCisgICAgd2hpbGUgKDEpIHsJCQkJLyogQmlnIGxvb3AuLi4gKi8KKy8qCisgIEl0IGlzIHR0Y2hrKCkncyByZXNwb25zaWJpbGl0eSB0byB0ZWxsIHVzIGlmIHRoZSBjb25uZWN0aW9uIGlzIGJyb2tlbiwKKyAgYW5kIHRvIGRvIHNvIGluc3RhbnRseSBhbmQgbm9uZGVzdHJ1Y3RpdmVseSAtLSBubyBibG9ja2luZywgZXRjLCB0aGF0IHdvdWxkCisgIHNsb3cgZG93biBmaWxlIHRyYW5zZmVyLgorKi8KKwlpZiAodHRjaGsoKSA8IDApIHsKKwkgICAgZGVidWcoRjEwMCwiaW5wdXQgQ09OTkVDVElPTiBCUk9LRU4iLCIiLDApOworCSAgICBmYXRhbGlvID0gMTsKKwkgICAgcmV0dXJuKCdxJyk7CisJfQorCWlmIChzc3RhdGUgIT0gMCkgewkJLyogSWYgYSBzdGFydCBzdGF0ZSBpcyBpbiBlZmZlY3QsICovCisJICAgIHR5cGUgPSBzc3RhdGU7CQkvKiByZXR1cm4gaXQgbGlrZSBhIHBhY2tldCB0eXBlLCAqLworCSAgICBzc3RhdGUgPSAwOwkJCS8qIGFuZCB0aGVuIG51bGxpZnkgaXQuICovCisJICAgIG51bWVycnMgPSAwOwkJLyogKFBXUCkgbm8gZXJyb3JzIHNvIGZhciAqLworCSAgICByZXR1cm4odHlwZSk7CisJfQorCWlmIChuYWtzdGF0ZSkgewkJCS8qIFRoaXMgc2VjdGlvbiBmb3IgZmlsZSByZWNlaXZlci4gKi8KKwkgICAgaWYgKHdzbG90cyA+IDEpIHsJCS8qIElmIHdlJ3JlIGRvaW5nIHdpbmRvd3MsICovCisJCXggPSByc2VxdGJsW3dpbmxvXTsJLyogc2VlIGlmIGRlc2lyZWQgcGFja2V0IGFscmVhZHkgaW4uICovCisJCWRlYnVnKEYxMDEsImlucHV0IHdpbmxvIiwiIix3aW5sbyk7CisJCWRlYnVnKEYxMDEsImlucHV0IHJzZXF0Ymxbd2lubG9dIiwiIixyc2VxdGJsW3dpbmxvXSk7CisJCWlmICh4ID4gLTEpIHsJCS8qIEFscmVhZHkgdGhlcmU/ICovCisJCSAgICBpZiAocl9wa3RbeF0ucGtfc2VxID09IHdpbmxvKSB7IC8qIChkb3VibGUgY2hlY2spICovCisJCQlyc24gPSB3aW5sbzsJICAgICAgICAgICAgLyogWWVzLCByZXR1cm4gaXRzIGluZm8gKi8KKwkJCWRlYnVnKEYxMDEsImlucHV0IHJldHVybiBwcmUtc3Rhc2hlZCBwYWNrZXQiLCIiLHJzbik7CisJCQlkdW1wcmJ1ZigpOworCQkJcmRhdGFwID0gcl9wa3RbeF0ucGtfYWRyOyAgIC8qIGxpa2UgcnBhY2sgd291bGQgZG8uICovCisJCQlybG4gPSAoaW50KXN0cmxlbigoY2hhciAqKSByZGF0YXApOworCQkJdHlwZSA9IHJfcGt0W3hdLnBrX3R5cDsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgdHlwZSA9IHJwYWNrKCk7CSAgICAgICAgLyogVHJ5IHRvIHJlYWQgYSBwYWNrZXQuICovCisJICAgIGRlYnVnKEYxMDEsImlucHV0IHJwYWNrIiwiIix0eXBlKTsKKworCSAgICB3aGlsZSAodHlwZSA9PSAnZScpIHsJLyogSGFuZGxlIGVjaG9lcyAqLworCQlkZWJ1ZyhGMTAxLCJpbnB1dCBlY2hvIGRpc2NhcmRlZCIsIiIsdHlwZSk7CisJCXR5cGUgPSBycGFjaygpOworCSAgICB9CisjaWZkZWYgREVCVUcKKwkgICAgaWYgKGRlYmxvZykgeworCQlpZiAodHlwZSA9PSAnRCcpCisJCSAgZGVidWcoRjAxMSwiaW5wdXQgdHlwZSBEPSIsKGNoYXIgKilyZGF0YXAsMzkpOworCQllbHNlCisJCSAgZGVidWcoRjAwMCwiaW5wdXQgdHlwZSIsKGNoYXIgKilyZGF0YXAsdHlwZSk7CisJICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmbmRlZiBPTERDSEtJTlQKKwkgICAgaWYgKHR5cGUgPT0gJ3onKSB7CisJCWVwa3RyY3ZkID0gMTsKKwkJZXJycGt0KChDSEFSICopIlVzZXIgY2FuY2VsbGVkLiIpOworCQl0eXBlID0gJ0UnOworCQlicmVhazsKKwkgICAgfQorI2VuZGlmIC8qIE9MRENIS0lOVCAqLworCSAgICBpZiAodHlwZSA8IC0xKSB7CisJCWNoYXIgKiBzOworCQlzID0gKHR5cGUgPT0gLTIpID8KKwkJICAiRkFJTEVEIC0gSW50ZXJydXB0ZWQiIDoKKwkJICAgICJGQUlMRUQgLSBDb25uZWN0aW9uIGxvc3QiOworCisJCXh4c2NyZWVuKFNDUl9QVCwncScsMEwscyk7CisJCWRvbG9nZW5kKCk7CisJCXJldHVybigncScpOwkJLyogQ3RybC1DIG9yIGNvbm5lY3Rpb24gbG9zdCAqLworCSAgICB9CisJICAgIGlmICh0eXBlIDwgMCkgewkJLyogUmVjZWl2ZSB3aW5kb3cgZnVsbCAqLworCQkvKiBBbm90aGVyIHRoaW5nIHRvIGRvIGhlcmUgd291bGQgYmUgdG8gZGVsZXRlICovCisJCS8qIHRoZSBoaWdoZXN0IHBhY2tldCBhbmQgTkFLIHdpbmxvLiAgQnV0IHRoYXQgKi8KKwkJLyogc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBzaW5jZSB0aGUgb3RoZXIgS2VybWl0ICovCisJCS8qIHNob3VsZCBub3QgaGF2ZSBzZW50IGEgcGFja2V0IG91dHNpZGUgdGhlIHdpbmRvdy4gKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgY2hhciBmb29bMjU2XTsKKyAgICAgICAgICAgICAgICBja21ha3htc2coZm9vLDI1NiwiUmVjZWl2ZSB3aW5kb3cgZnVsbCAocnBhY2spOiB3c2xvdHM9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2tpdG9hKHdzbG90cyksIiB3aW5sbz0iLGNraXRvYSh3aW5sbyksIiBwa3RudW09IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2tpdG9hKHBrdG51bSksIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKwkJZXJycGt0KChDSEFSICopZm9vKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLGZvbywiIiwwKTsKKyNlbHNlCisJCWVycnBrdCgoQ0hBUiAqKSJSZWNlaXZlIHdpbmRvdyBmdWxsIik7CisJCWRlYnVnKEYxMDEsInJwYWNrIHJlY2VpdmUgd2luZG93IGZ1bGwiLCIiLDApOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsIiB3c2xvdHMiLCIiLHdzbG90cyk7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiIHdpbmxvIiwiIix3aW5sbyk7CisJCWRlYnVnKEYxMDEsIiBwa3RudW0iLCIiLHBrdG51bSk7CisjZW5kaWYKKwkJZHVtcHJidWYoKTsKKwkJdHlwZSA9ICdFJzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgZHVtcHJidWYoKTsKKworI2lmZGVmIE9MRENIS0lOVAorCSAgICBpZiAoY2hraW50KCkgPCAwKSB7CQkvKiBDaGVjayBmb3IgY29uc29sZSBpbnRlcnJ1cHRzLiAqLworCQllcnJwa3QoKENIQVIgKikiVXNlciBjYW5jZWxsZWQuIik7IC8qIChvbGQgd2F5KSAqLworCQl0eXBlID0gJ0UnOworCQlicmVhazsKKwkgICAgfQorI2VuZGlmIC8qIE9MRENIS0lOVCAqLworCisjaWZkZWYgU1RSRUFNSU5HCisJICAgIGlmIChzdHJlYW1pbmcpIHsJCS8qIFN0cmVhbWluZyAqLworCQlpZiAodHlwZSA9PSAnUScgfHwgdHlwZSA9PSAnVCcpIHsgLyogRXJyb3JzIGFyZSBmYXRhbC4gKi8KKwkJICAgIGNydW5jaGVkKys7CQkvKiBGb3Igc3RhdGlzdGljcyAqLworCQkgICAgZXJycGt0KChDSEFSICopIlRyYW5zbWlzc2lvbiBlcnJvciBvbiByZWxpYWJsZSBsaW5rLiIpOworCQkgICAgdHlwZSA9ICdFJzsKKwkJfQorCSAgICB9CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJICAgIGlmICh0eXBlID09ICdFJykgeworCQlkZWJ1ZyhGMTAxLCJpbnB1dCBnb3QgRSwgbmFrc3RhdGUiLCIiLG5ha3N0YXRlKTsKKwkJYnJlYWs7CQkJLyogRXJyb3IgcGFja2V0ICovCisJICAgIH0KKwkgICAgaWYgKHR5cGUgPT0gJ1EnKSB7CQkvKiBDcnVuY2hlZCBwYWNrZXQuICovCisJCWNydW5jaGVkKys7CisJCW51bWVycnMrKzsKKy8qCisgIFBhY2tldCBhcnJpdmVkIGRhbWFnZWQuICBJdCB3YXMgbW9zdCBsaWtlbHkgdGhlIHBhY2tldCB3ZSB3ZXJlIGV4cGVjdGluZworICBuZXh0LCBzbyB3ZSBzZW5kIGEgTkFLIGZvciB0aGF0IHBhY2tldC4gIFByaW9yIHRvIDVBKDE4OSksIHdlIGFsd2F5cworICBOQUsnZCB3aW5sbyBoZXJlLCBidXQgdGhhdCB3YXMgYmFkIGJlY2F1c2UgaWYgdHdvIChvciBtb3JlKSBkaWZmZXJlbnQKKyAgcGFja2V0cyB3ZXJlIGRhbWFnZWQsIHdlIHdvdWxkIGtlZXAgTkFLaW5nIHRoZSBmaXJzdCBvbmUgYW5kIG5ldmVyIE5BSyB0aGUKKyAgb3RoZXIgb25lcywgd2hpY2ggY291bGQgcmVzdWx0IGluIGEgbGVuZ3RoeSBzZXJpZXMgb2YgdGltZW91dHMuICBOb3cgd2UKKyAgTkFLIHRoZSBvbGRlc3QgYXMteWV0LXVuTkFLJ2QgbWlzc2luZyBwYWNrZXQuCisqLworI2lmZGVmIENLX1RJTUVSUworCQlyY3Z0aW1vKys7CQkvKiBTdHJldGNoIHRoZSB0aW1lb3V0IGEgbGl0dGxlICovCisjZW5kaWYgLyogQ0tfVElNRVJTICovCisJCXogPSAod2lubG8gKyB3c2xvdHMpICUgNjQ7ICAvKiBTZWFyY2ggZnJvbSB3aW5sbyB0byB6ICovCisJCWRlYnVnKEYxMDEsIlpaWiBjcnVuY2hlZCB6IiwiIix6KTsKKwkJbmYgPSAwOwkJCSAgICAvKiBOQUsgZmxhZyBub3Qgc2V0IHlldCAqLworCQlmb3IgKHggPSB3aW5sbzsgeCAhPSB6OyB4ID0gKHggKyAxKSAlIDY0KSB7CisJCSAgICBkZWJ1ZyhGMTAxLCJaWlogeCIsIiIseCk7CisJCSAgICBpZiAocnNlcXRibFt4XSA+IC0xKSAvKiBIYXZlIEkgcmVjZWl2ZWQgcGFja2V0IHg/ICovCisJCSAgICAgIGNvbnRpbnVlOwkJIC8qIFllcywgZ28gb24uICovCisJCSAgICBkZWJ1ZyhGMTAxLCJaWlogeCBub3QgcmVjZCB5ZXQiLCIiLHgpOworCQkgICAgcGkgPSBzc2VxdGJsW3hdOwkgLyogTm8sIGhhdmUgSSBOQUsnZCBpdCB5ZXQ/ICovCisJCSAgICBpZiAocGkgPCAwIHx8IHNfcGt0W3BpXS5wa19ydHIgPT0gMCkgeworCQkJZGVidWcoRjEwMSwiWlpaIHggbm90IE5BSydkIHlldCIsIiIseCk7CisJCQluYWNrKHgpOwkgLyogTm8sIE5BSyBpdCBub3cuICovCisJCQluZiA9IDE7CQkgLyogRmxhZyB0aGF0IEkgZGlkLiAqLworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkJaWYgKCFuZikgewkJLyogSWYgd2UgZGlkbid0IE5BSyBhbnl0aGluZyBhYm92ZSwgKi8KKwkJICAgIGRlYnVnKEYxMDEsIlpaWiBOQUtpbmcgd2lubG8iLCIiLHdpbmxvKTsKKwkJICAgIGlmIChuYWNrKHdpbmxvKSA8IDApIHsgLyogd2UgaGF2ZSB0byBOQUsgd2lubG8gKGFnYWluKSAqLworCQkJZXJycGt0KChDSEFSICopIlRvbyBtYW55IHJldHJpZXMuIik7IC8qIFRvbyBtYW55ICovCisJCQl0eXBlID0gJ0UnOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkJY29udGludWU7CisJICAgIH0KKworCSAgICBpZiAodHlwZSA9PSAnVCcpIHsJCS8qIFRpbWVvdXQgKi8KKyNpZm5kZWYgT1MyCisJCS8qIEs5NSBkb2VzIHRoaXMgaXRzIG93biB3YXkgKi8KKwkJaWYgKHNlcnZlciAmJiBzcnZpZGwpIHsKKwkJICAgIGlkbGV0bW8gPSAxOworCQkgICAgZGVidWcoRjEwMSwiU0VSVkVSIElETEUgVElNRU9VVCIsIiIsc3J2aWRsKTsKKwkJICAgIHJldHVybigncScpOworCQl9CisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgQ0tfVElNRVJTCisJCXJjdnRpbW8rKzsJCS8qIFN0cmV0Y2ggdGhlIHRpbWVvdXQgYSBsaXR0bGUgKi8KKyNlbmRpZiAvKiBDS19USU1FUlMgKi8KKwkJdGltZW91dHMrKzsKKwkJZGVidWcoRjEwMSwiaW5wdXQgcmVjZWl2ZS1zdGF0ZSB0aW1lb3V0LCB3aW5sbyIsIiIsd2lubG8pOworCQkvKiBOQUsgb25seSB0aGUgcGFja2V0IGF0IHdpbmRvdy1sb3cgKi8KKwkJZGVidWcoRjEwMSwiaW5wdXQgc2VuZGluZyBOQUsgZm9yIHdpbmxvIiwiIix3aW5sbyk7CisJCXggPSB0dGNoaygpOworCQlpZiAoeCA+IDApCQkvKiBEb24ndCBnaXZlIHVwIGlmIHRoZXJlIGlzIHN0aWxsICovCisJCSAgY29udGludWU7CQkvKiBzb21ldGhpbmcgdG8gcmVhZC4gKi8KKwkJZWxzZSBpZiAoeCA8IDApIHsKKwkJICAgIGRvbG9nZW5kKCk7CisJCSAgICBmYXRhbGlvID0gMTsKKwkJICAgIHJldHVybigncScpOwkvKiBDb25uZWN0aW9uIExvc3QgKi8KKwkJfQorCQlpZiAobmFjayh3aW5sbykgPCAwKSB7CisJCSAgICBkZWJ1ZyhGMTAxLCJpbnB1dCBzZW50IHRvbyBtYW55IG5ha3MiLCIiLHdpbmxvKTsKKwkJICAgIGVycnBrdCgoQ0hBUiAqKSJUb28gbWFueSByZXRyaWVzLiIpOworCQkgICAgdHlwZSA9ICdFJzsKKwkJICAgIGJyZWFrOworCQl9IGVsc2UgY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKHJzbiA9PSB3aW5sbykgewkJLyogR290IHRoZSBwYWNrZXQgd2Ugd2FudCwgZG9uZS4gKi8KKyNpZmRlZiBDS19USU1FUlMKKwkJaWYgKHJ0dGZsZyAmJiB0aW1pbnQpCS8qIER5bmFtaWMgcm91bmQgdHJpcCB0aW1lcnM/ICovCisJCSAgZ2V0cnR0KG5ha3N0YXRlLCByc24pOyAvKiB5ZXMsIGRvIGl0LiAqLworI2VuZGlmIC8qIENLX1RJTUVSUyAqLworCQlkZWJ1ZyhGMTAxLCJpbnB1dCByc249d2lubG8iLCIiLHJzbik7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgLyogR290IGEgcGFja2V0IG91dCBvZiBvcmRlci4gKi8KKworCSAgICBkZWJ1ZyhGMTAxLCJpbnB1dCBvdXQgb2Ygc2VxdWVuY2UsIHJzbiIsIiIscnNuKTsKKwkgICAgayA9IHJzZXF0YmxbcnNuXTsJCS8qIEdldCB3aW5kb3cgc2xvdCBvZiB0aGlzIHBhY2tldC4gKi8KKwkgICAgZGVidWcoRjEwMSwiaW5wdXQgcnNlcXRibFtyc25dIiwiIixrKTsKKwkgICAgaWYgKGsgPCAwKSB7CisJCWRlYnVnKEYxMDEsImlucHV0IHJlY3YgY2FuJ3QgZmluZCBpbmRleCBmb3IgcmN2ZCBwa3QiLCIiLHJzbik7CisJCS8qIFdhcyAiSW50ZXJuYWwgZXJyb3IgMjEiICovCisJCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gICovCisJCWVycnBrdCgoQ0hBUiAqKSJTbGlkaW5nIHdpbmRvd3MgcHJvdG9jb2wgZXJyb3IuIik7CisJCXR5cGUgPSAnRSc7CisJCWJyZWFrOworCSAgICB9CisJICAgIHkgPSBjaGt3aW4ocnNuLHdpbmxvLHdzbG90cyk7IC8qIFNlZSB3aGF0IHdpbmRvdyBpdCdzIGluLiAqLworCSAgICBkZWJ1ZyhGMTAxLCJpbnB1dCByZWN2IGNoa3dpbiIsIiIseSk7CisJICAgIGlmICh5ID09IDEpIHsJCS8qIEZyb20gcHJldmlvdXMgd2luZG93LiAqLworI2lmZGVmIFNUUkVBTUlORworCQlpZiAoIXN0cmVhbWluZykJCS8qIE5PIFJFU0VORCBJRiBTVFJFQU1JTkchICovCisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJCSAgcmVzZW5kKHJzbik7CQkvKiBSZXNlbmQgdGhlIEFDSyAobWlnaHQgaGF2ZSBkYXRhKSAqLworCQlmcmVlcnBrdChyc24pOwkJLyogR2V0IHJpZCBvZiByZWNlaXZlZCBwYWNrZXQgKi8KKwkJY29udGludWU7CQkvKiBCYWNrIHRvIHdhaXQgZm9yIGFub3RoZXIgcGFja2V0ICovCisJICAgIH0gZWxzZSB7CQkJLyogSW4gdGhpcyB3aW5kb3cgb3Igb3V0IG9mIHJhbmdlICovCisJCWlmICh5IDwgMCkJCS8qIElmIG91dCBvZiByYW5nZSBlbnRpcmVseSwgKi8KKwkJICBmcmVlcnBrdChyc24pOwkvKiByZWxlYXNlIGl0cyBidWZmZXIgKi8KKworI2lmZGVmIFNUUkVBTUlORworCQlpZiAoc3RyZWFtaW5nKSB7CS8qIFN0cmVhbWluZyAodGhpcyBzaG91bGRuJ3QgaGFwcGVuKSAqLworCQkgICAgZXJycGt0KChDSEFSICopIlNlcXVlbmNlIGVycm9yIG9uIHJlbGlhYmxlIGxpbmsuIik7CisJCSAgICB0eXBlID0gJ0UnOworCQkgICAgYnJlYWs7CisJCX0KKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKworLyogSWYgb3VyIHJlY2VpdmUgd2luZG93IGlzIGZ1bGwsIE5BSyB3aW5kb3ctbG93ICovCisKKwkJaWYgKHJidWZudW0gPCAxKSB7CS8qIFJlY2VpdmUgd2luZG93IGZ1bGw/ICovCisJCSAgICBpZiAobmFjayh3aW5sbykgPCAwKSB7ICAgIC8qIE5vIGNob2ljZSwgbXVzdCBOQUsgd2lubG8uICovCisJCQllcnJwa3QoKENIQVIgKikiVG9vIG1hbnkgcmV0cmllcy4iKTsgLyogVG9vIG1hbnkgKi8KKwkJCXR5cGUgPSAnRSc7CisJCQlicmVhazsKKwkJICAgIH0gZWxzZSBjb250aW51ZTsKKwkJfQorLyoKKyAgUmVjZWl2ZSB3aW5kb3cgbm90IGZ1bGwuICBUaGlzIGlzIGEgcGFja2V0IGluIHRoZSBjdXJyZW50IHdpbmRvdyBidXQgaXQgaXMKKyAgbm90IHRoZSBkZXNpcmVkIHBhY2tldCBhdCB3aW5sby4gIFNvIHRoZXJlZm9yZSB0aGVyZSBhcmUgZ2FwcyBiZWZvcmUgdGhpcworICBwYWNrZXQuICBTbyB3ZSBmaW5kIHRoZSAibG93ZXN0IiB1bk5BSydkIG1pc3NpbmcgcGFja2V0LCBpZiBhbnksIGJldHdlZW4KKyAgd2lubG8gYW5kIHRoaXMgb25lLCBhbmQgTkFLIGl0LiAgSWYgdGhlcmUgYXJlIG5vIGFzLXlldC11bk5BSydkIG1pc3NpbmcKKyAgcGFja2V0cyBpbiB0aGUgd2luZG93LCB0aGVuIHdlIHNlbmQgbm90aGluZyBhbmQgZ28gd2FpdCBmb3IgYW5vdGhlciBwYWNrZXQuCisgIEluIHRoZW9yeSwgdGhpcyBjb3VsZCByZXN1bHQgaW4gYSB0aW1lb3V0LCBidXQgaW4gcHJhY3RpY2UgaXQgaXMgbGlrZWx5IHRoYXQKKyAgdGhlIGFscmVhZHktTkFLJ2QgbWlzc2luZyBwYWNrZXRzIGFyZSBhbHJlYWR5IG9uIHRoZWlyIHdheS4gIE5vdGUsIHdlIGRvIG5vdAorICBOQUsgYWhlYWQgb2Ygb3Vyc2VsdmVzLCBhcyB0aGF0IG9ubHkgY3JlYXRlcyB1bm5lY2Vzc2FyeSByZXRyYW5zbWlzc2lvbnMuCisqLworCQlmb3IgKHggPSB3aW5sbzsgeCAhPSByc247IHggPSAoeCArIDEpICUgNjQpIHsKKwkJICAgIGlmIChyc2VxdGJsW3hdID4gLTEpIC8qIEhhdmUgSSByZWNlaXZlZCBwYWNrZXQgeD8gKi8KKwkJICAgICAgY29udGludWU7CQkgLyogWWVzLCBjaGVjayBuZXh0IHNlcXVlbmNlIG51bWJlci4gKi8KKwkJICAgIHBpID0gc3NlcXRibFt4XTsJIC8qIE5vLCBoYXZlIEkgTkFLJ2QgaXQgeWV0PyAqLworCQkgICAgaWYgKHBpIDwgMCB8fCBzX3BrdFtwaV0ucGtfcnRyID09IDApIHsKKwkJCW5hY2soeCk7CSAvKiBObywgTkFLIGl0IG5vdy4gKi8KKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKy8qISEhKi8KKwl9IGVsc2UgewkJCS8qIE90aGVyd2lzZSBmaWxlIHNlbmRlci4uLiAqLworCisjaWZkZWYgU1RSRUFNSU5HCisJICAgIGlmIChzdHJlYW1pbmcgJiYgc25kdHlwID09ICdEJykgeworCQlkZWJ1ZyhGMTAxLCJTVFJFQU1JTkcgaW5wdXQgc3RyZWFtaW5nIiwiIixzdHJlYW1pbmcpOworCQlkZWJ1ZyhGMDAwLCJTVFJFQU1JTkcgaW5wdXQgc25kdHlwIiwiIixzbmR0eXApOworCQlyc24gPSB3aW5sbzsKKwkJdHlwZSA9ICdZJzsJCS8qIFByZXRlbmQgd2UgZ290IGFuIEFDSyAqLworCSAgICB9CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJICAgIGlmICghbmFrMmFjaykgewkJLyogTkFLKG4rMSkgPSBBQ0sobikgKi8KKwkJaWYgKHdzbG90cyA+IDEpIHsJLyogUGFja2V0IGF0IHdpbmxvIGFscmVhZHkgQUNLJ2Q/ICovCisJCSAgICBpZiAoc2Fja3RibFt3aW5sb10pIHsgLyogSWYgc28sICAqLworCQkJc2Fja3RibFt3aW5sb10gPSAwOyAvKiBUdXJuIG9mZiB0aGUgQUNLJ2QgZmxhZyAqLworCQkJd2lubG8gPSAod2lubG8gKyAxKSAlIDY0OyAvKiBSb3RhdGUgdGhlIHdpbmRvdyAqLworCQkJdHlwZSA9ICdZJzsJLyogQW5kIHJldHVybiBBQ0sgKi8KKwkJCWRlYnVnKEYxMDEsCisJCQkgICAgICAiaW5wdXQgc2VuZCByZXR1cm5pbmcgcHJlLXN0YXNoZWQgQUNLIiwiIiwKKwkJCSAgICAgIHdpbmxvLTEpOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKyNpZmRlZiBTVFJFQU1JTkcKKwkJaWYgKCEoc3RyZWFtaW5nICYmIHNuZHR5cCA9PSAnRCcpKSB7IC8qIE5vdCBzdHJlYW1pbmcgfCBkYXRhICovCisJCSAgICB0eXBlID0gcnBhY2soKTsJLyogVHJ5IHRvIHJlYWQgYW4gYWNrbm93bGVkZ2VtZW50ICovCisJCX0gZWxzZSB7CQkvKiBTdHJlYW1pbmcgYW5kIGluIERhdGEgcGhhc2UgKi8KKwkJICAgIHR5cGUgPSAnWSc7CQkvKiBBc3N1bWUgYWxsIGlzIG5vcm1hbCAqLworCQkgICAgaWYgKGNoa2ludCgpIDwgMCkJLyogQ2hlY2sgZm9yIGNvbnNvbGUgaW50ZXJydXB0cy4gKi8KKwkJICAgICAgdHlwZSA9ICd6JzsKKwkJICAgIGVsc2UgaWYgKHR0Y2hrKCkgPiA0ICsgYmN0dSkgLyogQ2hlY2sgZm9yIHJldHVybiB0cmFmZmljICovCisJCSAgICAgIHR5cGUgPSBycGFjaygpOworCQkgICAgZGVidWcoRjAwMCwiaW5wdXQgc3RyZWFtaW5nIHR5cGUiLCIiLHR5cGUpOworCQl9CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJCWRlYnVnKEYxMTEsImlucHV0IHNlbmQiLChjaGFyICopIHJkYXRhcCwoaW50KSB0eXBlKTsKKwkJd2hpbGUgKHR5cGUgPT0gJ2UnKSB7CS8qIEhhbmRsZSBlY2hvZXMgKi8KKwkJICAgIGRlYnVnKEYwMDAsImVjaG8gZGlzY2FyZGVkIiwiIix0eXBlKTsKKwkJICAgIHR5cGUgPSBycGFjaygpOworCQl9CisjaWZuZGVmIE9MRENIS0lOVAorCQlpZiAodHlwZSA9PSAneicpIHsKKwkJICAgIGVwa3RyY3ZkID0gMTsKKwkJICAgIGVycnBrdCgoQ0hBUiAqKSJVc2VyIGNhbmNlbGxlZC4iKTsKKwkJICAgIHR5cGUgPSAnRSc7CisJCSAgICBicmVhazsKKwkJfQorI2VuZGlmIC8qIE9MRENIS0lOVCAqLworCQlpZiAodHlwZSA8IC0xKSB7CisJCSAgICB4eHNjcmVlbihTQ1JfUFQsJ3EnLDBMLAorCQkJICAgKChjaGFyICopKCh0eXBlID09IC0yKSA/CisJCQkgICAiSW50ZXJydXB0ZWQiIDoKKwkJCSAgICJDb25uZWN0aW9uIGxvc3QiKSkKKwkJCSAgICk7CisJCSAgICBpZiAodHlwZSAhPSAtMikKKwkJICAgICAgZG9sb2dlbmQoKTsKKwkJICAgIHJldHVybigncScpOwkvKiBDdHJsLUMgb3IgY29ubmVjdGlvbiBsb3N0ICovCisJCX0KKwkJaWYgKHR5cGUgPT0gLTEpIHsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgIGNoYXIgZm9vWzI1Nl07CisgICAgICAgICAgICAgICAgICAgIGNrbWFreG1zZyhmb28sMjU2LAorCQkJICAgICAgIlJlY2VpdmUgd2luZG93IGZ1bGwgKGVycm9yIDE4KTogd3Nsb3RzPSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja2l0b2Eod3Nsb3RzKSwKKwkJCSAgICAgICIgd2lubG89Iixja2l0b2Eod2lubG8pLCIgcGt0bnVtPSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja2l0b2EocGt0bnVtKSwgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworCQkgICAgZXJycGt0KChDSEFSICopZm9vKTsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMCxmb28sIiIsMCk7CisjZWxzZQorCQkgICAgZXJycGt0KChDSEFSICopIlJlY2VpdmUgd2luZG93IGZ1bGwiKTsgLyogd2FzICJpbnRlcm5hbCAqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCIgd3Nsb3RzIiwiIix3c2xvdHMpOyAvKiBlcnJvciAxOCIgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiIHdpbmxvIiwiIix3aW5sbyk7CisJCSAgICBkZWJ1ZyhGMTAxLCIgcGt0bnVtIiwiIixwa3RudW0pOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkJICAgIGR1bXByYnVmKCk7CisJCSAgICB0eXBlID0gJ0UnOworCQkgICAgYnJlYWs7CisJCX0KKwkJZHVtcHJidWYoKTsJCS8qIERlYnVnZ2luZyAqLworCisjaWZkZWYgT0xEQ0hLSU5UCisJCWlmIChjaGtpbnQoKSA8IDApIHsJLyogQ2hlY2sgZm9yIGNvbnNvbGUgaW50ZXJydXB0cy4gKi8KKwkJICAgIGVycnBrdCgoQ0hBUiAqKSJVc2VyIGNhbmNlbGxlZC4iKTsKKwkJICAgIHJldHVybih0eXBlID0gJ0UnKTsKKwkJfQorI2VuZGlmIC8qIE9MRENIS0lOVCAqLworCisJCS8qIEdvdCBhIHBhY2tldCAqLworCisjaWZkZWYgU1RSRUFNSU5HCisJCWlmIChzdHJlYW1pbmcpIHsJCS8qIFN0cmVhbWluZyAqLworCQkgICAgaWYgKHR5cGUgPT0gJ1EnIHx8IHR5cGUgPT0gJ1QnKSB7IC8qIEVycm9ycyBhcmUgZmF0YWwuICovCisJCQljcnVuY2hlZCsrOwkvKiBGb3Igc3RhdGlzdGljcyAqLworCQkJZXJycGt0KChDSEFSICopIlRyYW5zbWlzc2lvbiBlcnJvciBvbiByZWxpYWJsZSBsaW5rLiIpOworCQkJdHlwZSA9ICdFJzsKKwkJICAgIH0KKwkJfQorI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCQlpZiAodHlwZSA9PSAnRScpIHsKKwkJICAgIGRlYnVnKEYxMDEsImlucHV0IHNlbmQgZ290IEUsIG5ha3N0YXRlIiwiIixuYWtzdGF0ZSk7CisJCSAgICBicmVhazsJCS8qIEVycm9yIHBhY2tldCAqLworCQl9CisJCWlmICh0eXBlID09ICdRJykgewkvKiBDcnVuY2hlZCBwYWNrZXQgKi8KKwkJICAgIGNydW5jaGVkKys7CQkvKiBGb3Igc3RhdGlzdGljcyAqLworCQkgICAgbnVtZXJycysrOwkJLyogRm9yIHBhY2tldCByZXNpemluZyAqLworCQkgICAgeCA9IHJlc2VuZCh3aW5sbyk7CS8qIFJlc2VuZCB3aW5kb3ctbG93ICovCisJCSAgICBpZiAoeCA8IDApIHsKKwkJCXR5cGUgPSAnRSc7CisJCQllcnJwa3QoKENIQVIgKikiVG9vIG1hbnkgcmV0cmllcyIpOworCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICBjb250aW51ZTsKKwkJfQorCQlpZiAodHlwZSA9PSAnVCcpIHsJLyogVGltZW91dCB3YWl0aW5nIGZvciBBQ0tzLiAqLworCQkgICAgdGltZW91dHMrKzsJCS8qIENvdW50IGl0ICovCisJCSAgICBudW1lcnJzKys7CQkvKiBDb3VudCBhbiBlcnJvciB0b28gKi8KKwkJICAgIGRlYnVnKEYxMDEsImlucHV0IHNlbmQgc3RhdGUgdGltZW91dCwgd2lubG8iLCIiLHdpbmxvKTsKKworCQkgICAgLyogUmV0cmFuc21pdCB0aGUgb2xkZXN0IHVuLUFDSydkIHBhY2tldC4gKi8KKworCQkgICAgZGVidWcoRjEwMSwiaW5wdXQgc2VuZCByZXNlbmRpbmcgd2lubG8iLCIiLHdpbmxvKTsKKwkJICAgIGlmIChyZXNlbmQod2lubG8pIDwgMCkgeyAvKiBDaGVjayByZXRyaWVzICovCisJCQlkZWJ1ZyhGMTAxLCJpbnB1dCBzZW5kIHRvbyBtYW55IHJlc2VuZHMiLCIiLG1heHRyeSk7CisJCQllcnJwa3QoKENIQVIgKikiVG9vIG1hbnkgcmV0cmllcyIpOworCQkJcmV0dXJuKHR5cGUgPSAnRScpOworCQkgICAgfQorI2lmZGVmIE5FV0RQTAorCQkgICAgLyogUmVkdWNlIHByZXZhaWxpbmcgcGFja2V0IGxlbmd0aCAqLworCQkgICAgeCA9IHNzZXF0Ymxbd2lubG9dOwkvKiBHZXQgbGVuZ3RoIG9mIHBhY2tldCB3ZSB3YW50IEFDS2QgKi8KKwkJICAgIGlmICh4ID4gLTEpIHsJLyogT25seSBpZiB3ZSBoYXZlIGEgdmFsaWQgaW5kZXggKi8KKwkJCWlmIChzX3BrdFt4XS5wa190eXAgPT0gJ0QnKSB7IC8qIG9ubHkgZm9yIEQgcGFja2V0cyAqLworCQkJICAgIHNwc2l6ID0gKHNfcGt0W3hdLnBrX2xlbiArIDgpID4+IDE7IC8qIGhhbHZlIGl0ICovCisJCQkgICAgaWYgKHNwc2l6IDwgMjApIHNwc2l6ID0gMjA7IC8qIHdpdGhpbiByZWFzb24gKi8KKwkJCSAgICBkZWJ1ZyhGMTAxLCJpbnB1dCBUIGN1dCBwYWNrZXQgbGVuZ3RoIiwiIixzcHNpeik7CisJCQl9CisJCSAgICB9CisjZW5kaWYgLyogTkVXRFBMICovCisJCSAgICBjb250aW51ZTsKKwkJfQorCSAgICB9CisJICAgIC8qIEdvdCBhbiBhY3R1YWwgbm9ybWFsIHBhY2tldCAqLworCisJICAgIG5hazJhY2sgPSAwOwkJLyogVW5zZXQgdGhpcyBmbGFnLiAqLworCSAgICB5ID0gY2hrd2luKHJzbix3aW5sbyx3c2xvdHMpOyAvKiBJcyBpdCBpbiB0aGUgd2luZG93PyAqLworCSAgICBkZWJ1ZyhGMTAxLCJpbnB1dCBzZW5kIHJzbiIsIiIscnNuKTsKKwkgICAgZGVidWcoRjEwMSwiaW5wdXQgc2VuZCB3aW5sbyIsIiIsd2lubG8pOworCSAgICBkZWJ1ZyhGMTAxLCJpbnB1dCBzZW5kIGNoa3dpbiIsIiIseSk7CisKKwkgICAgaWYgKHR5cGUgPT0gJ1knKSB7CQkvKiBHb3QgYW4gQUNLICovCisJCWlmICh5ID09IDApIHsJCS8qIEluIGN1cnJlbnQgd2luZG93ICovCisJCSAgICBpZiAoc3BhY2tldHMgPCA0KQkvKiBFcnJvciBjb3VudGVyIGRvZXNuJ3QgY291bnQgKi8KKwkJICAgICAgbnVtZXJycyA9IDA7CS8qIHVudGlsIGRhdGEgcGhhc2UuICovCisJCSAgICBzYWNrdGJsW3Jzbl0rKzsJLyogTWFyayB0aGUgcGFja2V0IGFzIEFDSydkICovCisJCSAgICB4ID0gc3NlcXRibFtyc25dOwkvKiBHZXQgQUNLJ2QgcGFja2V0J3MgYnVmZmVyIGluZGV4ICovCisJCSAgICBkZWJ1ZyhGMTAxLCJiZXN0bGVuIGFjayB4IiwiIix4KTsKKyNpZmRlZiBORVdEUEwKKwkJICAgIGlmICh4ID4gLTEpIHsKKwkJCWFja3R5cGUgPSBzX3BrdFt4XS5wa190eXA7IC8qIEdldCB0eXBlICovCisJCQlkZWJ1ZyhGMDAwLCJiZXN0bGVuIGFjayB0eXBlIiwiIixhY2t0eXBlKTsKKworCQkJaWYgKGFja3R5cGUgPT0gJ0QnKSB7IC8qIEFkanVzdCBkYXRhIHBhY2tldCBsZW5ndGggKi8KKwkJCSAgICBpZiAoc3BzaXogPiBiZXN0bGVuKSB7CisJCQkJYmVzdGxlbiA9IHNwc2l6OworCQkJCWRlYnVnKEYxMDEsImJlc3RsZW4gQiIsIiIsYmVzdGxlbik7CisJCQkgICAgfQorI2lmZGVmIERFQlVHCisJCQkgICAgaWYgKGRlYmxvZykgeworCQkJCWRlYnVnKEYxMDEsImJlc3RsZW4gcmV0cnkiLCIiLHNfcGt0W3hdLnBrX3J0cik7CisJCQkJZGVidWcoRjEwMSwiYmVzdGxlbiBsZW4iLCIiLHNfcGt0W3hdLnBrX2xlbik7CisJCQkJZGVidWcoRjEwMSwiYmVzdGxlbiBzcGFja2V0cyIsIiIsc3BhY2tldHMpOworCQkJICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCQkJICAgIC8qIFNldCBuZXcgYmVzdCBsZW5ndGggKi8KKwkJCSAgICBpZiAoc19wa3RbeF0ucGtfcnRyID09IDAgJiYKKwkJCQlzX3BrdFt4XS5wa19sZW4gKyA4ID4gYmVzdGxlbikgeworCQkJCWJlc3RsZW4gPSBzX3BrdFt4XS5wa19sZW4gKyA4OworCQkJCWlmIChiZXN0bGVuID4gc3BtYXgpCisJCQkJICBiZXN0bGVuID0gc3BtYXg7CisJCQkJZGVidWcoRjEwMSwiYmVzdGxlbiBBIiwiIixiZXN0bGVuKTsKKwkJCSAgICB9CisjaWZkZWYgREVCVUcKKwkJCSAgICBpZiAoZGVibG9nKSB7CisJCQkJZGVidWcoRjEwMSwiYmVzdGxlbiB3c2xvdHMiLCIiLHdzbG90cyk7CisJCQkJZGVidWcoRjEwMSwiYmVzdGxlbiBtYXhzZW5kIiwiIixtYXhzZW5kKTsKKwkJCSAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCSAgICAvKiBTbG93IHN0YXJ0ICovCisJCQkgICAgaWYgKHNsb3N0YXJ0ICYmCisJCQkJKG1heHNlbmQgPD0gc3BtYXgpICYmCisJCQkJKHJwYWNrZXRzIDwgMTEpICYmCisJCQkJKG51bWVycnMgPT0gMCkpIHsKKwkJCQlzcHNpeiA9IHNwc2l6IDw8IDE7CisJCQkJZGVidWcoRjEwMSwiYmVzdGxlbiBzcHNpeiBBIiwiIixzcHNpeik7CisKKwkJCSAgICAvKiBDcmVlcCB1cCB0byBiZXN0IGxlbmd0aCAqLworCQkJICAgIH0gZWxzZSBpZiAoKHNwYWNrZXRzID4gNSkgJiYKKwkJCQkgICAgICAgKHNwc2l6IDwgYmVzdGxlbiAtIDgpKSB7CisJCQkJc3BzaXogKz0gKGJlc3RsZW4gLSBzcHNpeikgLyAzOworCQkJCWRlYnVnKEYxMDEsImJlc3RsZW4gc3BzaXogQiIsIiIsc3BzaXopOworCisJCQkgICAgLyogUHVzaCB0aGUgZW52ZWxvcGUgKi8KKwkJCSAgICB9IGVsc2UgaWYgKChzcGFja2V0cyAlICh3c2xvdHMgKyAxKSA9PSAwKSAmJgorCQkJCSAgICAgICAoc3BhY2tldHMgPiA2KSAmJgorCQkJCSAgICAgICAoYmVzdGxlbiA8IHNwbWF4IC0gOCkgJiYKKwkJCQkgICAgICAgKHNwc2l6IDwgc3BtYXgpKSB7CisJCQkJc3BzaXogKz0gKHNwbWF4IC0gYmVzdGxlbikgLyAzOworCQkJCWRlYnVnKEYxMDEsImJlc3RsZW4gc3BzaXogQyIsIiIsc3BzaXopOworCQkJICAgIH0KKwkJCSAgICAvKiBCdXQgbm90IHRvbyBmYXIgKi8KKwkJCSAgICBpZiAoc3BzaXogPiBzcG1heCkgeworCQkJCXNwc2l6ID0gc3BtYXg7CisJCQkJZGVidWcoRjEwMSwiYmVzdGxlbiBzcHNpeiBEIiwiIixzcHNpeik7CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorI2VuZGlmIC8qIE5FV0RQTCAqLworCisjaWZkZWYgQ0tfVElNRVJTCisJCSAgICBpZiAocnR0ZmxnICYmIHRpbWludCkgLyogSWYgZG9pbmcgZHluYW1pYyB0aW1lcnMgKi8KKwkJICAgICAgZ2V0cnR0KG5ha3N0YXRlLCByc24pOyAvKiBjYWxsIHJvdXRpbmUgdG8gc2V0IGl0LiAqLworI2VuZGlmIC8qIENLX1RJTUVSUyAqLworLyoKKyAgTk9URTogVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgZnJlZXMgdGhlIGJ1ZmZlciBvZiB0aGUgQUNLIHdlIGp1c3QgZ290LgorICBCdXQgdGhlIHVwcGVyIGxheWVycyBzdGlsbCBuZWVkIHRoZSBkYXRhLCBsaWtlIGlmIGl0J3MgdGhlIEFDSyB0byBhbiBJLAorICBTLCBGLCBELCBaLCBvciBqdXN0IGFib3V0IGFueSBraW5kIG9mIHBhY2tldC4gIFNvIGZvciBub3csIGZyZWVyYnVmKCkKKyAgZGVhbGxvY2F0ZXMgdGhlIGJ1ZmZlciwgYnV0IGRvZXMgbm90IGVyYXNlIHRoZSBkYXRhIG9yIGRlc3Ryb3kgdGhlIHBvaW50ZXIKKyAgdG8gaXQuICBUaGVyZSdzIG5vIG90aGVyIHNpbmdsZSBwbGFjZSB3aGVyZSB0aGVzZSByZWNlaXZlIGJ1ZmZlcnMgY2FuIGJlCisgIGNvcnJlY3RseSBmcmVlZCAoPykgLi4uCisqLworCQkgICAgZnJlZXJwa3QocnNuKTsJLyogRnJlZSB0aGUgQUNLJ3MgYnVmZmVyICovCisJCSAgICBmcmVlc2J1Zihyc24pOwkvKiAqKiogRnJlZSB0aGUgc2VudCBwYWNrZXQncyBidWZmZXIgKi8KKwkJICAgIGlmIChyc24gPT0gd2lubG8pIHsJLyogR290IHRoZSBvbmUgd2Ugd2FudCAqLworCQkJc2Fja3RibFt3aW5sb10gPSAwOworCQkJd2lubG8gPSAod2lubG8gKyAxKSAlIDY0OworCQkJZGVidWcoRjEwMSwiaW5wdXQgc2VuZCByb3RhdGVkIHNlbmQgd2luZG93IiwiIix3aW5sbyk7CisJCQlicmVhazsJCS8qIFJldHVybiB0aGUgQUNLICovCisJCSAgICB9IGVsc2UgeworCQkJZGVidWcoRjEwMSwiaW5wdXQgc2VuZCBtYXJrIHBrdCIsIiIscnNuKTsKKwkJCWNvbnRpbnVlOwkvKiBPdGhlcndpc2UgZ28gcmVhZCBhbm90aGVyIHBhY2tldCAqLworCQkgICAgfQorCQl9IGVsc2UgaWYgKHkgPT0gMSAmJiB3c2xvdHMgPCAyKSB7IC8qICgxOTApIEFDSyBmb3IgcHJldmlvdXMgKi8KKwkJICAgIG51bWVycnMrKzsJCS8qID09IE5BSyBmb3IgY3VycmVudCwgY291bnQgZXJyb3IgKi8KKwkJICAgIGRlYnVnKEYxMDEsImlucHV0IHNlbmQgQUNLIGZvciBwcmV2aW91cyIsIiIscnNuKTsKKwkJICAgIGZyZWVycGt0KHJzbik7CS8qIEZyZWUgTkFLJ3MgYnVmZmVyICovCisJCSAgICB4ID0gcmVzZW5kKHdpbmxvKTsJLyogUmVzZW5kIGN1cnJlbnQgcGFja2V0ICovCisJCSAgICBpZiAoeCA8IDApIHsKKwkJCXR5cGUgPSAnRSc7CisJCQllcnJwa3QoKENIQVIgKikiVG9vIG1hbnkgcmV0cmllcyIpOworCQkJYnJlYWs7CisJCSAgICB9IGVsc2UgY29udGludWU7CS8qIFJlc2VuZCBvaywgZ28gcmVhZCBhbm90aGVyIHBhY2tldCAqLworCQl9IGVsc2UgewkJLyogT3RoZXIgY2FzZXMsIGp1c3QgaWdub3JlICovCisJCSAgICBkZWJ1ZyhGMTAxLCJpbnB1dCBzZW5kIEFDSyBvdXQgb2Ygd2luZG93IiwiIixyc24pOworCQkgICAgZnJlZXJwa3QocnNuKTsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJICAgIH0KKwkgICAgaWYgKHR5cGUgPT0gJ04nKSB7CQkvKiBOQUsgKi8KKwkJbnVtZXJycysrOwkJLyogQ291bnQgYW4gZXJyb3IgKi8KKyNpZmRlZiBTVFJFQU1JTkcKKwkJaWYgKHN0cmVhbWluZykgewkJLyogU3RyZWFtaW5nICovCisJCSAgICBlcnJwa3QoKENIQVIgKikiTkFLIHJlY2VpdmVkIG9uIHJlbGlhYmxlIGxpbmsuIik7CisJCSAgICB0eXBlID0gJ0UnOworCQkgICAgYnJlYWs7CisJCX0KKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKworCQlkZWJ1ZyhGMTAxLCJpbnB1dCBzZW5kIE5BSyIsIiIscnNuKTsKKyNpZmRlZiBORVdEUEwKKwkJLyogUmVkdWNlIHByZXZhaWxpbmcgcGFja2V0IGxlbmd0aCAqLworCQl4ID0gc3NlcXRibFtyc25dOwkvKiBMZW5ndGggb2YgcGFja2V0IHRoYXQgd2FzIE5BSydkICovCisJCWlmICh4ID4gLTEpIHsJCS8qIElmIGl0J3MgYSBEYXRhIHBhY2tldCB3ZSd2ZSBzZW50ICovCisJCSAgICBpZiAoc19wa3RbeF0ucGtfdHlwID09ICdEJykgeworCQkJc3BzaXogPSAoc19wa3RbeF0ucGtfbGVuICsgOCkgPj4gMTsgLyogSGFsdmUgbGVuZ3RoICovCisjaWZkZWYgQ09NTUVOVAorCQkJLyogVGhpcyBtaWdodCBiZSBhIGdvb2QgaWRlYSAtLSBoYXZlbid0IHRyaWVkIGl0IC4uLiAqLworCQkJaWYgKGJlc3RsZW4gPiAwICYmIHNwc2l6ID4gYmVzdGxlbikKKwkJCSAgc3BzaXogPSBiZXN0bGVuOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkJCWlmIChzcHNpeiA8IDIwKSBzcHNpeiA9IDIwOworCQkJZGVidWcoRjEwMSwiaW5wdXQgTiBjdXQgcGFja2V0IGxlbmd0aCIsIiIsc3BzaXopOworCQkgICAgfQorCQl9CisjZW5kaWYgLyogTkVXRFBMICovCisJCWZyZWVycGt0KHJzbik7CQkvKiBGcmVlIGJ1ZmZlciB3aGVyZSBOQUsgbGllcy4gKi8KKwkJaWYgKHkgPT0gMCkgewkJLyogSW4gY3VycmVudCB3aW5kb3cgKi8KKwkJICAgIGRlYnVnKEYxMDAsIiBpbiB3aW5kb3ciLCIiLDApOworCQkgICAgayA9IHNzZXF0YmxbcnNuXTsJLyogR2V0IHBvaW50ZXIgdG8gTkFLJ2QgcGFja2V0LiAqLworCQkgICAgaWYgKGsgPCAwIHx8IChrID4gLTEgJiYgc19wa3Rba10ucGtfdHlwID09ICcgJykpIHsKKwkJCXggPSByZXNlbmQod2lubG8pOyAvKiBQYWNrZXQgd2UgaGF2ZW4ndCBzZW50IHlldC4gKi8KKwkJICAgIH0gZWxzZSB7CisJCQl4ID0gcmVzZW5kKHJzbik7IC8qIFJlc2VuZCByZXF1ZXN0ZWQgcGFja2V0LiAqLworCQkgICAgfQorCQkgICAgaWYgKHggPCAwKSB7CS8qIFJlc2VuZCBlcnJvciBpcyBmYXRhbC4gICovCisJCQl0eXBlID0gJ0UnOworCQkJZXJycGt0KChDSEFSICopIlRvbyBtYW55IHJldHJpZXMiKTsKKwkJCWJyZWFrOworCQkgICAgfSBlbHNlIGNvbnRpbnVlOwkvKiBSZXNlbmQgb2ssIGdvIHJlYWQgYW5vdGhlciBwYWNrZXQgKi8KKwkJfSBlbHNlIGlmICgocnNuID09IChwa3RudW0gKyAxKSAlIDY0KSkgeyAvKiBOQUsgZm9yIG5leHQgcGt0ICovCisJCSAgICBpZiAod3Nsb3RzID4gMSkgeworCQkJZGVidWcoIEYxMDEsIk5BSyBmb3IgbmV4dCBwYWNrZXQsIHdpbmRvd2luZyIsIiIscnNuKTsKKwkJCXggPSByZXNlbmQod2lubG8pOyAvKiBSZXNlbmQgd2luZG93LWxvdyAqLworCQkJaWYgKHggPCAwKSB7CisJCQkgICAgdHlwZSA9ICdFJzsKKwkJCSAgICBlcnJwa3QoKENIQVIgKikiVG9vIG1hbnkgcmV0cmllcyIpOworCQkJICAgIGJyZWFrOworCQkJfQorCQkJY29udGludWU7CS8qIEdvIGJhY2sgYW5kIHJlYWQgYW5vdGhlciBwa3QgKi8KKwkJICAgIH0KKwkJICAgIGRlYnVnKEYxMDEsIk5BSyBmb3IgbmV4dCBwYWNrZXQsIG5vIHdpbmRvd2luZyIsIiIscnNuKTsKKwkJICAgIHggPSAocnNuID09IDApID8gNjMgOiByc24gLSAxOworCQkgICAgaWYgKHggPT0gMCAmJiAoc25kdHlwID09ICdTJyB8fCBzbmR0eXAgPT0gJ0knKSkgeworCQkJcmVzZW5kKDApOwkvKiBBQ0sgZm9yIFMgb3IgSSBwYWNrZXQgbWlzc2luZyAqLworCQkJY29udGludWU7CS8qIHNvIHJlc2VuZCB0aGUgUyBvciBJICovCisJCSAgICB9CisJCSAgICByc24gPSB4OwkJLyogRWxzZSwgdHJlYXQgTkFLKG4rMSkgYXMgQUNLKG4pICovCisJCSAgICBuYWsyYWNrID0gMTsJLyogR28gYmFjayBhbmQgcHJvY2VzcyB0aGUgQUNLICovCisJCSAgICBjb250aW51ZTsKKwkJfSBlbHNlIGlmICh5ID4gMCkgewkvKiBOQUsgZm9yIHBrdCB3ZSBjYW4ndCByZXNlbmQgKi8KKwkJICAgIGRlYnVnKEYxMDEsIiBOQUsgb3V0IG9mIHdpbmRvdyIsIiIscnNuKTsgLyogYmFkLi4uICovCisJCSAgICB0eXBlID0gJ0UnOworCQkgICAgZXJycGt0KChDSEFSICopIk5BSyBvdXQgb2Ygd2luZG93Iik7CisJCSAgICBicmVhazsKKwkJfSBlbHNlIGNvbnRpbnVlOwkvKiBJZ25vcmUgb3RoZXIgTkFLcyAqLworCSAgICB9CQkJCS8qIEVuZCBvZiBmaWxlLXNlbmRlciBOQUsgaGFuZGxlciAqLworCisgICAgICAgICAgICBpZiAocnNuID09IHdpbmxvKSB7CQkvKiBOb3QgQUNLLCBOQUssIHRpbWVvdXQsIGV0Yy4gKi8KKwkJZGVidWcoRjAwMCwiaW5wdXQgc2VuZCB1bmV4cGVjdGVkIHR5cGUiLCIiLHR5cGUpOworCQlicmVhazsKKwkgICAgfQorCX0JCQkJLyogRW5kIG9mIGZpbGUtc2VuZGVyIHNlY3Rpb24gKi8KKyAgICB9CQkJCQkvKiBFbmQgb2YgaW5wdXQoKSB3aGlsZSgpIGxvb3AgKi8KKy8qCisgIFdoZW4gdGhlIHdpbmRvdyBzaXplIGlzIDEgYW5kIHdlIGhhdmUgdGhlIHBhY2tldCB3ZSB3YW50LCB0aGVyZSBjYW4gbm90CisgIHBvc3NpYmx5IGJlIGFueXRoaW5nIHdhaXRpbmcgZm9yIHVzIG9uIHRoZSBjb25uZWN0aW9uIHRoYXQgaXMgdXNlZnVsIHRvIHVzLgorICBIb3dldmVyLCB0aGVyZSBtaWdodCBiZSByZWR1bmRhbnQgY29waWVzIG9mIGEgcGFja2V0IHdlIGFscmVhZHkgZ290LCB3aGljaAorICB3b3VsZCBjYXVzZSBuZWVkbGVzcyBjeWNsZXMgb2YgcmVwZWF0ZWQgcGFja2V0cy4gIFRoZXJlZm9yZSB3ZSBmbHVzaCB0aGUKKyAgY29tbXVuaWNhdGlvbnMgaW5wdXQgYnVmZmVyIG5vdyB0byB0cnkgdG8gZ2V0IHJpZCBvZiB1bmRlc2lyZWQgYW5kIHVubmVlZGVkCisgIHBhY2tldHMgdGhhdCB3ZSBoYXZlIG5vdCByZWFkIHlldC4KKyovCisgICAgaWYgKHdzbG90biA9PSAxCQkJLyogKG5vdCB3c2xvdHMhKSAqLworI2lmZGVmIFNUUkVBTUlORworCSYmICFzdHJlYW1pbmcJCQkvKiBCdXQgbm90IHdoZW4gc3RyZWFtaW5nICovCisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJKSB7CisJZGVidWcoRjEwMCwiaW5wdXQgYWJvdXQgdG8gZmx1c2giLCIiLDApOworCXR0Zmx1aSgpOwkJLyogR290IHdoYXQgd2Ugd2FudCwgY2xlYXIgaW5wdXQgYnVmZmVyLiAqLworICAgIH0KKyNpZm5kZWYgTkVXRFBMCisgICAgaWYgKCFuYWtzdGF0ZSkJCQkvKiBXaGVuIHNlbmRpbmcgKi8KKyAgICAgIHJjYWxjcHN6KCk7CQkJLyogcmVjYWxjdWxhdGUgc2l6ZSBldmVyeSBwYWNrZXQgKi8KKyNlbmRpZiAvKiBORVdEUEwgKi8KKyAgICBpZiAodHlwZSA9PSAnRScpCisgICAgICB4aXRzdGEgfD0gKHdoYXQgPyB3aGF0IDogMSk7CS8qIFJlbWVtYmVyIHdoYXQgZmFpbGVkLiAqLworICAgIGRlYnVnKEYxMDEsImlucHV0IHdpbmxvIiwiIix3aW5sbyk7CisgICAgZGVidWcoRjEwMSwiaW5wdXQgcnNuIiwiIixyc24pOworICAgIGRlYnVnKEYwMDAsImlucHV0IHJldHVybmluZyB0eXBlIiwiIix0eXBlKTsKKyAgICByZXR1cm4ocmN2dHlwID0gdHlwZSk7CQkvKiBTdWNjZXNzLCByZXR1cm4gcGFja2V0IHR5cGUuICovCit9CisKKyNpZmRlZiBQQVJTRU5TRQorLyogIFAgQSBSIEMgSCBLICAtLSAgQ2hlY2sgaWYgS2VybWl0IHBhY2tldCBoYXMgcGFyaXR5ICAqLworCisvKgorICBDYWxsIHdpdGggcyA9IHBvaW50ZXIgdG8gcGFja2V0LCBzdGFydCA9IHBhY2tldCBzdGFydCBjaGFyYWN0ZXIsIG4gPSBsZW5ndGguCisgIFJldHVybnMgMCBpZiBwYWNrZXQgaGFzIG5vIHBhcml0eSwgLTEgb24gZXJyb3IsIG9yLCBpZiBwYWNrZXQgaGFzIHBhcml0eToKKyAgICAnZScgZm9yIGV2ZW4sICdvJyBmb3Igb2RkLCAnbScgZm9yIG1hcmsuICBTcGFjZSBwYXJpdHkgY2Fubm90IGJlIHNlbnNlZC4KKyAgU28gYSByZXR1cm4gdmFsdWUgb2YgMCByZWFsbHkgbWVhbnMgZWl0aGVyIHNwYWNlIG9yIG5vbmUuCisgIFJldHVybnMgLTIgaWYgcGFyaXR5IGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBkdXJpbmcgdGhpcyBwcm90b2NvbCBvcGVyYXRpb24uCisqLworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3BhcmNoayhDSEFSICpzLCBDSEFSIHN0YXJ0LCBpbnQgbikKKyNlbHNlCitwYXJjaGsocyxzdGFydCxuKSBDSEFSICpzLCBzdGFydDsgaW50IG47CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHBhcmNoayAqLyB7CisgICAgQ0hBUiBzMCwgczEsIHMyLCBzMzsKKworICAgIGRlYnVnKEYxMDEsInBhcmNoayBuIiwiIixuKTsKKyAgICBkZWJ1ZyhGMTAxLCJwYXJjaGsgc3RhcnQiLCIiLHN0YXJ0KTsKKworICAgIHMwID0gc1swXSAmIDB4N2Y7CQkJLyogTWFyayBmaWVsZCAodXN1YWxseSBDdHJsLUEpICovCisKKyAgICBpZiAoczAgIT0gc3RhcnQgfHwgbiA8IDUpIHJldHVybigtMSk7IC8qIE5vdCBhIHZhbGlkIHBhY2tldCAqLworCisvKiBMb29rIGF0IHBhY2tldCBjb250cm9sIGZpZWxkcywgd2hpY2ggbmV2ZXIgaGF2ZSA4dGggYml0IHNldCAqLworLyogRmlyc3QgY2hlY2sgZm9yIG5vIHBhcml0eSwgbW9zdCBjb21tb24gY2FzZS4gKi8KKworICAgIGlmICgoKHNbMF0gfCBzWzFdIHwgc1syXSB8IHNbM10pICYgMHg4MCkgPT0gMCkKKyAgICAgIHJldHVybigwKTsJCQkvKiBObyBwYXJpdHkgb3Igc3BhY2UgcGFyaXR5ICovCisKKy8qIENoZWNrIGZvciBtYXJrIHBhcml0eSAqLworCisgICAgaWYgKCgoc1swXSAmIHNbMV0gJiBzWzJdICYgc1szXSkgJiAweDgwKSA9PSAweDgwKQorICAgICAgcmV0dXJuKCdtJyk7CQkJLyogTWFyayBwYXJpdHkgKi8KKworLyogUGFja2V0IGhhcyBzb21lIGtpbmQgb2YgcGFyaXR5ICovCisvKiBNYWtlIDctYml0IGNvcGllcyBvZiBjb250cm9sIGZpZWxkcyAqLworCisgICAgczEgPSBzWzFdICYgMHg3ZjsJCQkvKiBMRU4gKi8KKyAgICBzMiA9IHNbMl0gJiAweDdmOwkJCS8qIFNFUSAqLworICAgIHMzID0gc1szXSAmIDB4N2Y7CQkJLyogVFlQRSAqLworCisvKiBDaGVjayBmb3IgZXZlbiBwYXJpdHkgKi8KKworICAgIGlmICgoc1swXSA9PSBwX3RibFtzMF0pICYmCisgICAgICAgIChzWzFdID09IHBfdGJsW3MxXSkgJiYKKyAgICAgICAgKHNbMl0gPT0gcF90YmxbczJdKSAmJgorCShzWzNdID09IHBfdGJsW3MzXSkpCisgICAgICByZXR1cm4oJ2UnKTsKKworLyogQ2hlY2sgZm9yIG9kZCBwYXJpdHkgKi8KKworICAgIGlmICgoc1swXSAhPSBwX3RibFtzMF0pICYmCisgICAgICAgIChzWzFdICE9IHBfdGJsW3MxXSkgJiYKKyAgICAgICAgKHNbMl0gIT0gcF90YmxbczJdKSAmJgorCShzWzNdICE9IHBfdGJsW3MzXSkpCisgICAgICByZXR1cm4oJ28nKTsKKworLyogT3RoZXJ3aXNlIGl0J3MgcHJvYmFibHkgbGluZSBub2lzZS4gIExldCBjaGVja3N1bSBjYWxjdWxhdGlvbiBjYXRjaCBpdC4gKi8KKworICAgIHJldHVybigtMSk7Cit9CisjZW5kaWYgLyogUEFSU0VOU0UgKi8KKwwKKy8qCisgIENoZWNrIHRvIG1ha2Ugc3VyZSB0aW1lb3V0IGludGVydmFscyBhcmUgbG9uZyBlbm91Z2ggdG8gYWxsb3cgbWF4aW11bQorICBsZW5ndGggcGFja2V0cyB0byBnZXQgdGhyb3VnaCBiZWZvcmUgdGhlIHRpbWVyIGdvZXMgb2ZmLiAgSWYgbm90LCB0aGUKKyAgdGltZW91dCBpbnRlcnZhbCBpcyBhZGp1c3RlZCB1cHdhcmRzLgorCisgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHRyYW5zYWN0aW9uLCBiZWZvcmUgd2UKKyAga25vdyBhbnl0aGluZyBhYm91dCB0aGUgZGVsYXkgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBsaW5lLiAgSXQgd29ya3MKKyAgb25seSBmb3Igc2VyaWFsIGNvbW11bmljYXRpb24gZGV2aWNlczsgaXQgdHJ1c3RzIHRoZSBzcGVlZCByZXBvcnRlZCBieQorICB0aGUgb3BlcmF0aW5nIHN5c3RlbS4KKworICBDYWxsIHdpdGggYSB0aW1vdXQgaW50ZXJ2YWwuICBSZXR1cm5zIGl0LCBhZGp1c3RlZCBpZiBuZWNlc3NhcnkuCisqLworaW50CitjaGt0aW1vKHRpbW8sZmxhZykgaW50IHRpbW8sIGZsYWc7IHsKKyAgICBsb25nIGNwcywgejsgaW50IHgsIHk7CisjaWZkZWYgU1RSRUFNSU5HCisgICAgZGVidWcoRjEwMSwiY2hrdGltbyBzdHJlYW1pbmciLCIiLHN0cmVhbWluZyk7CisgICAgaWYgKHN0cmVhbWluZykKKyAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKworICAgIGRlYnVnKEYxMDEsImNoa3RpbW8gdGltbyIsIiIsdGltbyk7IC8qIFRpbWVvdXQgYmVmb3JlIGFkanVzdG1lbnQgKi8KKyAgICBkZWJ1ZyhGMTAxLCJjaGt0aW1vIGZsYWciLCIiLGZsYWcpOworCisgICAgaWYgKGZsYWcpCQkJCS8qIERvbid0IGNoYW5nZSB0aW1lb3V0IGlmIHVzZXIgKi8KKyAgICAgIHJldHVybih0aW1vKTsJCQkvKiBnYXZlIFNFVCBTRU5EIFRJTUVPVVQgY29tbWFuZC4gKi8KKyAgICBkZWJ1ZyhGMTAxLCJjaGt0aW1vIHNwbWF4IiwiIixzcG1heCk7CisgICAgZGVidWcoRjEwMSwiY2hrdGltbyB1cnBzaXoiLCIiLHVycHNpeik7CisKKyAgICBpZiAoIW5ldHdvcmspIHsJCQkvKiBPbiBzZXJpYWwgY29ubmVjdGlvbnMuLi4gKi8KKwlzcGVlZCA9IHR0Z3NwZCgpOwkJLyogR2V0IGN1cnJlbnQgc3BlZWQuICovCisJaWYgKHNwZWVkID4gMEwpIHsKKwkgICAgY3BzID0gc3BlZWQgLyAxMEw7CQkvKiBDb252ZXJ0IHRvIGNoYXJzIHBlciBzZWNvbmQgKi8KKwkgICAgaWYgKGNwcyA+IDBMKSB7CisJCWxvbmcgcGxlbjsJCS8qIE1heGltdW0gb2Ygc2VuZCBhbmQgcmN2IHBrdCBzaXplICovCisJCXogPSBjcHMgKiAobG9uZykgdGltbzsJLyogQ2hhcnMgcGVyIHRpbWVvdXQgaW50ZXJ2YWwgKi8KKwkJeiAtPSB6IC8gMTBMOwkJLyogTGVzcyAxMCBwZXJjZW50ICovCisJCXBsZW4gPSBzcG1heDsKKwkJaWYgKHVycHNpeiA+IHNwbWF4KSBwbGVuID0gdXJwc2l6OworCQlkZWJ1ZyhGMTAxLCJjaGt0aW1vIHBsZW4iLCIiLHBsZW4pOworCQlpZiAoeiA8IHBsZW4pIHsJCS8qIENvbXBhcmUgd2l0aCBwYWNrZXQgc2l6ZSAqLworCQkgICAgeCA9IChpbnQpICgobG9uZykgcGxlbiAvIGNwcyk7IC8qIEFkanVzdCBpZiBuZWNlc3NhcnkgKi8KKwkJICAgIHkgPSB4IC8gMTA7CQkvKiBBZGQgMTAgcGVyY2VudCBmb3Igc2FmZXR5ICovCisJCSAgICBpZiAoeSA8IDIpIHkgPSAyOwkvKiBPciAyIHNlY29uZHMsIHdoaWNoZXZlciBpcyBtb3JlICovCisJCSAgICB4ICs9IHk7CisJCSAgICBpZiAoeCA+IHRpbW8pCS8qIElmIHRoaXMgaXMgZ3JlYXRlciB0aGFuIGN1cnJlbnQgKi8KKwkJICAgICAgdGltbyA9IHg7CQkvKiB0aW1lb3V0LCBjaGFuZ2UgdGhlIHRpbWVvdXQgKi8KKwkJICAgIGRlYnVnKEYxMDEsImNoa3RpbW8gbmV3IHRpbW8iLCIiLHRpbW8pOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybih0aW1vKTsKK30KKwwKKy8qICBTIFAgQSBDIEsgIC0tICBDb25zdHJ1Y3QgYW5kIHNlbmQgYSBwYWNrZXQgICovCisKKy8qCisgIHNwYWNrKCkgc2VuZHMgYSBwYWNrZXQgb2YgdGhlIGdpdmVuIHR5cGUsIHNlcXVlbmNlIG51bWJlciBuLCB3aXRoIGxlbiBkYXRhCisgIGNoYXJhY3RlcnMgcG9pbnRlZCB0byBieSBkLCBpbiBlaXRoZXIgYSByZWd1bGFyIG9yIGV4dGVuZGVkLSBsZW5ndGggcGFja2V0LAorICBkZXBlbmRpbmcgb24gbGVuLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHNlbnQsIG9yIGVsc2UgLTEKKyAgdXBvbiBmYWlsdXJlLiAgVXNlcyBnbG9iYWwgbnBhZCwgcGFkY2gsIG15c3RjaCwgYmN0dSwgZGF0YS4gIExlYXZlcyBwYWNrZXQKKyAgZnVsbHkgYnVpbHQgYW5kIG51bGwtdGVybWluYXRlZCBmb3IgbGF0ZXIgcmV0cmFuc21pc3Npb24gYnkgcmVzZW5kKCkuCisgIFVwZGF0ZXMgZ2xvYmFsIHNuZHBrdGwgKHNlbmQtcGFja2V0IGxlbmd0aCkuCisKKyAgTk9URTogVGhlIGdsb2JhbCBwb2ludGVyICJkYXRhIiBpcyBhc3N1bWVkIHRvIHBvaW50IGludG8gdGhlIDd0aCBwb3NpdGlvbgorICBvZiBhIGNoYXJhY3RlciBhcnJheSAocHJlc3VtYWJseSBpbiBwYWNrZXQgYnVmZmVyIGZvciB0aGUgY3VycmVudCBwYWNrZXQpLgorICBJdCB3YXMgdXNlZCBieSBnZXRwa3QoKSB0byBidWlsZCB0aGUgcGFja2V0IGRhdGEgZmllbGQuICBzcGFjaygpIGZpbGxzIGluCisgIHRoZSBoZWFkZXIgdG8gdGhlIGxlZnQgb2YgdGhlIGRhdGEgcG9pbnRlciAodGhlIGRhdGEgcG9pbnRlciBpcyBkZWZpbmVkCisgIGluIGdldHNidWYoKSBpbiBja2NmbjMuYykuICBJZiB0aGUgYWRkcmVzcyAiZCIgaXMgdGhlIHNhbWUgYXMgImRhdGEiLCB0aGVuCisgIHRoZSBwYWNrZXQncyBkYXRhIGZpZWxkIGhhcyBiZWVuIGJ1aWx0ICJpbiBwbGFjZSIgYW5kIG5lZWQgbm90IGJlIGNvcGllZC4KKyovCitpbnQKKyNpZmRlZiBDS19BTlNJQworc3BhY2soY2hhciBwa3R0eXAsIGludCBuLCBpbnQgbGVuLCBDSEFSICpkKQorI2Vsc2UKK3NwYWNrKHBrdHR5cCxuLGxlbixkKSBjaGFyIHBrdHR5cDsgaW50IG4sIGxlbjsgQ0hBUiAqZDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogc3BhY2sgKi8geworICAgIHJlZ2lzdGVyIGludCBpOworICAgIGludCBpeCwgaiwgaywgeCwgbHAsIGxvbmdwa3QsIGNvcHksIGxvZ2xlbjsKKworI2lmZGVmIEdGVElNRVIKKyAgICBDS0ZMT0FUIHQxID0gMC4wLCB0MiA9IDAuMDsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisKKyAgICByZWdpc3RlciBDSEFSICpjcCwgKm15ZGF0YTsKKyAgICB1bnNpZ25lZCBjcmM7CisKKyAgICBjb3B5ID0gKGQgIT0gZGF0YSk7CQkJLyogRmxhZyB3aGV0aGVyIGRhdGEgbXVzdCBiZSBjb3BpZWQgICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsJCQkvKiBTYXZlIGxvdHMgb2YgZnVuY3Rpb24gY2FsbHMhICovCisJZGVidWcoRjEwMSwic3BhY2sgbiIsIiIsbik7CisJaWYgKHBrdHR5cCAhPSAnRCcpIHsJCS8qIERhdGEgcGFja2V0cyB3b3VsZCBiZSB0b28gbG9uZyAqLworCSAgICBkZWJ1ZyhGMTExLCJzcGFjayBkYXRhIixkYXRhLGRhdGEpOworCSAgICBkZWJ1ZyhGMTExLCJzcGFjayBkIixkLGQpOworCX0KKwlkZWJ1ZyhGMTAxLCJzcGFjayBsZW4iLCIiLGxlbik7CisJZGVidWcoRjEwMSwic3BhY2sgY29weSIsIiIsY29weSk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyAgICBsb25ncGt0ID0gKGxlbiArIGJjdGwgKyAyKSA+IDk0OwkvKiBEZWNpZGUgd2hldGhlciBpdCdzIGEgbG9uZyBwYWNrZXQgKi8KKyAgICBteWRhdGEgPSBkYXRhIC0gNyArIChsb25ncGt0ID8gMCA6IDMpOyAvKiBTdGFydGluZyBwb3NpdGlvbiBvZiBoZWFkZXIgKi8KKyAgICBrID0gc3NlcXRibFtuXTsJCQkvKiBQYWNrZXQgc3RydWN0dXJlIGluZm8gZm9yIHBrdCBuICovCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CQkJLyogU2F2ZSAyIG1vcmUgZnVuY3Rpb24gY2FsbHMuLi4gKi8KKwlkZWJ1ZyhGMTAxLCJzcGFjayBteWRhdGEiLCIiLG15ZGF0YSk7CisJZGVidWcoRjEwMSwic3BhY2sgc3NlcXRibFtuXSIsIiIsayk7CisJaWYgKGsgPCAwKSB7CisjaWZkZWYgU1RSRUFNSU5HCisJICAgIGlmICghc3RyZWFtaW5nKQorI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCSAgICAgIGRlYnVnKEYxMDEsInNwYWNrIHNlbmRpbmcgcGFja2V0IG91dCBvZiB3aW5kb3ciLCIiLG4pOworCX0KKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICBpZiAoayA+IC0xKSB7CisJc19wa3Rba10ucGtfYWRyID0gbXlkYXRhOwkvKiBSZW1lbWJlciBhZGRyZXNzIG9mIHBhY2tldC4gKi8KKwlzX3BrdFtrXS5wa19zZXEgPSBuOwkJLyogUmVjb3JkIHNlcXVlbmNlIG51bWJlciAqLworCXNfcGt0W2tdLnBrX3R5cCA9IHBrdHR5cDsJLyogUmVjb3JkIHBhY2tldCB0eXBlICovCisgICAgfQorICAgIHNwa3RsID0gMDsJCQkJLyogSW5pdGlhbGl6ZSBsZW5ndGggb2YgdGhpcyBwYWNrZXQgKi8KKyAgICBpID0gMDsJCQkJLyogYW5kIHBvc2l0aW9uIGluIHBhY2tldC4gKi8KKworLyogTm93IGZpbGwgdGhlIHBhY2tldCAqLworCisgICAgbXlkYXRhW2krK10gPSBteXN0Y2g7CQkvKiBNQVJLICovCisgICAgbHAgPSBpKys7CQkJCS8qIFBvc2l0aW9uIG9mIExFTiwgZmlsbCBpbiBsYXRlciAqLworCisgICAgbXlkYXRhW2krK10gPSB0b2NoYXIobik7CQkvKiBTRVEgZmllbGQgKi8KKyAgICBteWRhdGFbaSsrXSA9IHBrdHR5cDsJCS8qIFRZUEUgZmllbGQgKi8KKyAgICBqID0gbGVuICsgYmN0bDsJCQkvKiBMZW5ndGggb2YgZGF0YSArIGJsb2NrIGNoZWNrICovCisgICAgaWYgKGxvbmdwa3QpIHsJCQkvKiBMb25nIHBhY2tldD8gKi8KKwlpbnQgeDsJCQkJLyogWWVzLCB3b3JrIGFyb3VuZCBTQ08gWGVuaXgvMjg2ICovCisjaWZkZWYgQ0tUVU5JTkcKKwl1bnNpZ25lZCBpbnQgY2hrOworI2VuZGlmIC8qIENLVFVOSU5HICovCisJeCA9IGogLyA5NTsJCQkvKiBjb21waWxlciBidWcuLi4gKi8KKyAgICAgICAgbXlkYXRhW2xwXSA9IHRvY2hhcigwKTsJCS8qIFNldCBMRU4gdG8gemVybyAqLworICAgICAgICBteWRhdGFbaSsrXSA9IHRvY2hhcih4KTsJLyogRXh0ZW5kZWQgbGVuZ3RoLCBoaWdoIGJ5dGUgKi8KKyAgICAgICAgbXlkYXRhW2krK10gPSB0b2NoYXIoaiAlIDk1KTsJLyogRXh0ZW5kZWQgbGVuZ3RoLCBsb3cgYnl0ZSAqLworI2lmZGVmIENLVFVOSU5HCisgICAgICAgIC8qIEhlYWRlciBjaGVja3N1bSAtIHNraXAgdGhlIGZ1bmN0aW9uIGNhbGxzIGFuZCBsb29wcyAqLworCSAgY2hrID0gKHVuc2lnbmVkKSBteWRhdGFbbHBdICAgKworCSAgICAgICAgKHVuc2lnbmVkKSBteWRhdGFbbHArMV0gKworCSAgICAgICAgKHVuc2lnbmVkKSBteWRhdGFbbHArMl0gKworCQkodW5zaWduZWQpIG15ZGF0YVtscCszXSArCisJCSh1bnNpZ25lZCkgbXlkYXRhW2xwKzRdIDsKKwlteWRhdGFbaSsrXSA9IHRvY2hhcigoQ0hBUikgKCgoKGNoayAmIDAzMDApID4+IDYpICsgY2hrKSAmIDA3NykpOworI2Vsc2UKKyAgICAgICAgbXlkYXRhW2ldID0gJ1wwJzsJCS8qIFRlcm1pbmF0ZSBmb3IgaGVhZGVyIGNoZWNrc3VtICovCisgICAgICAgIG15ZGF0YVtpKytdID0gdG9jaGFyKGNoazEobXlkYXRhK2xwLDUpKTsKKyNlbmRpZiAvKiBDS1RVTklORyAqLworICAgIH0gZWxzZSBteWRhdGFbbHBdID0gdG9jaGFyKGorMik7CS8qIE5vcm1hbCBMRU4gKi8KKy8qCisgIFdoZW4gc2VuZGluZyBhIGZpbGUsIHRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgSWYgaXQgd2VyZW4ndCwKKyAgaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBvcHRpbWl6ZSB0aGlzIHNlY3Rpb24gYnkgdXNpbmcgbWVtY3B5IG9yIGJjb3B5CisgIChuZWl0aGVyIG9mIHdoaWNoIGFyZSBwb3J0YWJsZSksIGJ1dCBvbmx5IGlmIG91ciBwYWNrZXRzIHdlcmUgcmF0aGVyIGxvbmcuCisgIFdoZW4gcmVjZWl2aW5nLCB3ZSdyZSBvbmx5IHNlbmRpbmcgQUNLcyBzbyBpdCBkb2Vzbid0IG1hdHRlci4gIFNvIGNvdW50IHRoZQorICBmb2xsb3dpbmcgbG9vcCBhcyBhIHNsZWVwaW5nIGRvZy4KKyovCisgICAgaWYgKGNvcHkpCQkJCS8qIERhdGEgZmllbGQgYnVpbHQgaW4gcGxhY2U/ICovCisgICAgICBmb3IgKCA7IGxlbi0tOyBpKyspIG15ZGF0YVtpXSA9ICpkKys7IC8qIE5vLCBtdXN0IGNvcHkuICovCisgICAgZWxzZQkJCQkvKiBPdGhlcndpc2UsICovCisgICAgICBpICs9IGxlbjsJCQkJLyogSnVzdCBza2lwIHBhc3QgZGF0YSBmaWVsZC4gKi8KKyAgICBteWRhdGFbaV0gPSAnXDAnOwkJCS8qIE51bGwtdGVybWluYXRlIGZvciBjaGVja3N1bSBjYWxjLiAqLworCisgICAgc3dpdGNoIChiY3R1KSB7CQkJLyogQmxvY2sgY2hlY2sgKi8KKyAgICAgICAgY2FzZSAxOgkJCQkvKiAxID0gNi1iaXQgY2hrc3VtICovCisJICAgIGl4ID0gaSAtIGxwOwkJLyogQXZvaWQgIm9yZGVyIG9mIG9wZXJhdGlvbiIgZXJyb3IgKi8KKwkgICAgbXlkYXRhW2krK10gPSB0b2NoYXIoY2hrMShteWRhdGErbHAsaXgpKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgkJCQkvKiAyID0gMTItYml0IGNoa3N1bSAqLworCSAgICBqID0gY2hrMihteWRhdGErbHAsaS1scCk7CisJICAgIG15ZGF0YVtpKytdID0gKHVuc2lnbmVkKXRvY2hhcigoaiA+PiA2KSAmIDA3Nyk7CisgICAJICAgIG15ZGF0YVtpKytdID0gKHVuc2lnbmVkKXRvY2hhcihqICYgMDc3KTsKKwkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoJCQkJLyogMyA9IDE2LWJpdCBDUkMgKi8KKwkgICAgY3JjID0gY2hrMyhteWRhdGErbHAsaS1scCk7CisJICAgIG15ZGF0YVtpKytdID0gKHVuc2lnbmVkKXRvY2hhcigoKGNyYyAmIDAxNzAwMDApKSA+PiAxMik7CisJICAgIG15ZGF0YVtpKytdID0gKHVuc2lnbmVkKXRvY2hhcigoY3JjID4+IDYpICYgMDc3KTsKKwkgICAgbXlkYXRhW2krK10gPSAodW5zaWduZWQpdG9jaGFyKGNyYyAmIDA3Nyk7CisJICAgIGJyZWFrOworCWNhc2UgNDoJCQkJLyogMiA9IDEyLWJpdCBjaGtzdW0sIGJsYW5rLWZyZWUgKi8KKwkgICAgaiA9IGNoazIobXlkYXRhK2xwLGktbHApOworCSAgICBteWRhdGFbaSsrXSA9CisJICAgICAgKHVuc2lnbmVkKSh0b2NoYXIoKHVuc2lnbmVkKSgoKGogPj4gNikgJiAwNzcpICsgMSkpKTsKKyAgIAkgICAgbXlkYXRhW2krK10gPSAodW5zaWduZWQpKHRvY2hhcigodW5zaWduZWQpKChqICYgMDc3KSArIDEpKSk7CisJICAgIGJyZWFrOworICAgIH0KKyAgICBsb2dsZW4gPSBpOworICAgIG15ZGF0YVtpKytdID0gc2VvbDsJCQkvKiBFbmQgb2YgbGluZSAocGFja2V0IHRlcm1pbmF0b3IpICovCisjaWZkZWYgVENQU09DS0VUCisvKgorICBJZiBURUxORVQgY29ubmVjdGlvbiBhbmQgcGFja2V0IHRlcm1pbmF0b3IgaXMgY2FycmlhZ2UgcmV0dXJuLAorICB3ZSBtdXN0IHN0dWZmIGVpdGhlciBMRiBvciBOVUwsIGFjY29yZGluZyB0byBTRVQgVEVMTkVUIE5FV0xJTkUtTU9ERQorICAodG5fbmxtKSwgdG8gbWVldCB0aGUgVEVMTkVUIE5WVCBzcGVjaWZpY2F0aW9uLCB1bmxlc3MgdXNlciBzYWlkIFJBVy4KKworICBJZiBORVdMSU5FLU1PREUgaXMgc2V0IHRvIExGIGluc3RlYWQgb2YgQ1IsIHdlIHN0aWxsIHNlbmQgQ1ItTlVMCisgIG9uIGEgTlZUIGNvbm5lY3Rpb24gYW5kIENSIG9uIGEgYmluYXJ5IGNvbm5lY3Rpb24uCisqLworICAgIGlmICgKKyNpZmRlZiBTVFJFQU1JTkcKKwkhZG9udHNlbmQgJiYKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKwkoKG5ldHdvcmsgJiYgdHRucHJvdG8gPT0gTlBfVEVMTkVUKSB8fCAoIWxvY2FsICYmIHNzdGVsbmV0KSkKKwkmJiBzZW9sID09IENSKSB7CisgICAgICAgIHN3aXRjaCAoVEVMT1BUX01FKFRFTE9QVF9CSU5BUlkpID8gdG5fYl9ubG0gOiB0bl9ubG0pIHsKKwkgIGNhc2UgVE5MX0NSOgkJCS8qIE5WVCBvciBCSU5BUlkgKi8KKwkgICAgYnJlYWs7CisJICBjYXNlIFROTF9DUk5VTDoKKwkgICAgbXlkYXRhW2krK10gPSBOVUw7CisJICAgIGJyZWFrOworCSAgY2FzZSBUTkxfQ1JMRjoKKwkgICAgbXlkYXRhW2krK10gPSBMRjsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyAgICBteWRhdGFbaV0gPSAnXDAnOwkJCS8qIFRlcm1pbmF0ZSBzdHJpbmcgKi8KKyAgICBpZiAoCisjaWZkZWYgU1RSRUFNSU5HCisJIWRvbnRzZW5kICYmCisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJcGt0bG9nCisJKQkJCQkvKiBTYXZlIGEgZnVuY3Rpb24gY2FsbCEgKi8KKyAgICAgIGxvZ3BrdCgncycsbixteWRhdGEsbG9nbGVuKTsJLyogTG9nIHRoZSBwYWNrZXQgKi8KKworICAgIC8qIChQV1ApIGFkZCB0aGUgcGFyaXR5IHF1aWNrbHkgYXQgdGhlIGVuZCAqLworICAgIGlmIChwYXJpdHkpIHsKKwlzd2l0Y2ggKHBhcml0eSkgeworCSAgY2FzZSAnZSc6CQkJLyogRXZlbiAqLworCSAgICBmb3IgKGNwID0gJm15ZGF0YVtpLTFdOyBjcCA+PSBteWRhdGE7IGNwLS0pCisJICAgICAgKmNwID0gcF90YmxbKmNwXTsKKwkgICAgYnJlYWs7CisJICBjYXNlICdtJzoJCQkvKiBNYXJrICovCisJICAgIGZvciAoY3AgPSAmbXlkYXRhW2ktMV07IGNwID49IG15ZGF0YTsgY3AtLSkKKwkgICAgICAqY3AgfD0gMTI4OworCSAgICBicmVhazsKKwkgIGNhc2UgJ28nOgkJCS8qIE9kZCAqLworCSAgICBmb3IgKGNwID0gJm15ZGF0YVtpLTFdOyBjcCA+PSBteWRhdGE7IGNwLS0pCisJICAgICAgKmNwID0gcF90YmxbKmNwXSBeIDEyODsKKwkgICAgYnJlYWs7CisJICBjYXNlICdzJzoJCQkvKiBTcGFjZSAqLworCSAgICBmb3IgKGNwID0gJm15ZGF0YVtpLTFdOyBjcCA+PSBteWRhdGE7IGNwLS0pCisJICAgICAgKmNwICY9IDEyNzsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAocGt0cGF1cykgbXNsZWVwKHBrdHBhdXMpOwkvKiBQYXVzZSBpZiByZXF1ZXN0ZWQgKi8KKyAgICB4ID0gMDsKKworICAgIGlmIChucGFkKSB7CisjaWZkZWYgU1RSRUFNSU5HCisJaWYgKGRvbnRzZW5kKQorCSAgeCA9IDA7CisJZWxzZQorI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCSAgeCA9IHR0b2wocGFkYnVmLG5wYWQpOwkvKiBTZW5kIGFueSBwYWRkaW5nICovCisgICAgfQorICAgIGlmICh4ID4gLTEpIHsKKyNpZmRlZiBDS19USU1FUlMKKwlpZiAodGltaW50ID4gMCkgeworCSAgICBpZiAocGt0dHlwID09ICdOJykKKwkgICAgICBzcnR0YmxbbiA+IDAgPyBuLTEgOiA2M10gPSBndGltZXIoKTsKKwkgICAgZWxzZQorCSAgICAgIHNydHRibFtuXSA9IGd0aW1lcigpOworCX0KKyNlbmRpZiAvKiBDS19USU1FUlMgKi8KKwlzcGt0bCA9IGk7CQkJLyogUmVtZW1iZXIgcGFja2V0IGxlbmd0aCAqLworCWlmIChrID4gLTEpCisJICBzX3BrdFtrXS5wa19sZW4gPSBzcGt0bDsJLyogYWxzbyBpbiBwYWNrZXQgaW5mbyBzdHJ1Y3R1cmUgKi8KKworI2lmZGVmIERFQlVHCisjaWZkZWYgR0ZUSU1FUgorLyoKKyAgVGhpcyBjb2RlIHNob3dzIChpbiB0aGUgZGVidWcgbG9nKSBob3cgbG9uZyBpdCB0YWtlcyB3cml0ZSgpIHRvIGV4ZWN1dGUuCisgIFNvbWV0aW1lcyBvbiBhIGNvbmdlc3RlZCBUQ1AgY29ubmVjdGlvbiwgaXQgY2FuIHN1cnByaXNlIHlvdSAtLSA5MCBzZWNvbmRzCisgIG9yIG1vcmUuLi4KKyovCisJaWYgKAorI2lmZGVmIFNUUkVBTUlORworCSAgICAhZG9udHNlbmQgJiYKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKwkgICAgZGVibG9nCisJICAgICkKKwkgIHQxID0gZ2Z0aW1lcigpOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgU1RSRUFNSU5HCisJaWYgKGRvbnRzZW5kKSB7CisJICAgIGRlYnVnKEYwMDAsIlNUUkVBTUlORyBzcGFjayBza2lwcGluZyIsIiIscGt0dHlwKTsKKwkgICAgeCA9IDA7CisJfSBlbHNlCisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJeCA9IHR0b2wobXlkYXRhLHNwa3RsKTsJCS8qIFNlbmQgdGhlIHBhY2tldCAqLworICAgIH0KKyNpZmRlZiBTVFJFQU1JTkcKKyAgICBpZiAoIWRvbnRzZW5kKSB7CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJZGVidWcoRjEwMSwic3BhY2sgc3BrdGwiLCIiLHNwa3RsKTsKKwlkZWJ1ZyhGMTAxLCJzcGFjayB0dG9sIHJldHVybnMiLCIiLHgpOworCWlmICh4IDwgMCkgewkJCS8qIEZhaWxlZC4gKi8KKwkgICAgaWYgKGxvY2FsICYmIHggPCAtMSkgeworCQl4eHNjcmVlbihTQ1JfU1QsU1RfRVJSLDBMLCJGQUlMRUQ6IENvbm5lY3Rpb24gbG9zdCIpOworCQkvKiBXZSBjYW4ndCBzZW5kIGFuIEUgcGFja2V0IGJlY2F1c2UgdGhlIGNvbm5lY3Rpb24gaXMgbG9zdC4gKi8KKwkJZXBrdHNlbnQgPSAxOwkJLyogU28gcHJldGVuZCB3ZSBzZW50IG9uZS4gKi8KKwkJZmF0YWxpbyA9IDE7CQkvKiBSZW1lbWJlciB3ZSBnb3QgYSBmYXRhbCBpL28gZXJyb3IgKi8KKwkJZG9sb2dlbmQoKTsKKwkJY2tzdHJuY3B5KChjaGFyICopZXBrdG1zZywiQ29ubmVjdGlvbiBsb3N0IixQS1RNU0dMRU4pOworCSAgICB9CisJICAgIHJldHVybih4KTsKKwl9CisJaWYgKHNwa3RsID4gbWF4c2VuZCkJCS8qIEtlZXAgdHJhY2sgb2YgbG9uZ2VzdCBwYWNrZXQgc2VudCAqLworCSAgbWF4c2VuZCA9IHNwa3RsOworI2lmZGVmIERFQlVHCisjaWZkZWYgR0ZUSU1FUgorCWlmIChkZWJsb2cpICB7CQkJLyogTG9nIGVsYXBzZWQgdGltZSBmb3Igd3JpdGUoKSAqLworCSAgICB0MiA9IGdmdGltZXIoKTsKKwkgICAgZGVidWcoRjEwMSwic3BhY2sgdHRvbCBtc2VjIiwiIiwobG9uZykoKHQyLXQxKSoxMDAwLjApKTsKKwl9CisjZW5kaWYgLyogR0ZUSU1FUiAqLworI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgU1RSRUFNSU5HCisgICAgfQorI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCisgICAgc25kdHlwID0gcGt0dHlwOwkJCS8qIFJlbWVtYmVyIHBhY2tldCB0eXBlIGZvciBlY2hvcyAqLworI2lmZGVmIFNUUkVBTUlORworICAgIGlmICghZG9udHNlbmQpIHsJCQkvKiBJZiByZWFsbHkgc2VudCwgKi8KKwlzcGFja2V0cysrOwkJCS8qIGNvdW50IGl0LiAqLworCWZsY28gKz0gc3BrdGw7CQkJLyogQ291bnQgdGhlIGNoYXJhY3RlcnMgKi8KKwl0bGNvICs9IHNwa3RsOwkJCS8qIGZvciBzdGF0aXN0aWNzLi4uICovCisjaWZkZWYgREVCVUcKKwlpZiAoZGVibG9nKSB7CQkJLyogU2F2ZSB0d28gZnVuY3Rpb24gY2FsbHMhICovCisJICAgIGR1bXBzYnVmKCk7CQkJLyogRHVtcCBzZW5kIGJ1ZmZlcnMgdG8gZGVidWcgbG9nICovCisJICAgIGRlYnVnKEYxMTEsInNwYWNrIGNhbGxpbmcgc2NyZWVuLCBteWRhdGE9IixteWRhdGEsbik7CisJfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgfQorI2VuZGlmIC8qIFNUUkVBTUlORyAqLworICAgIGlmIChsb2NhbCkgeworCWludCB4ID0gMDsKKwlpZiAoZmRpc3BsYSAhPSBYWUZEX04pIHggPSAxOworCWlmICgoZmRpc3BsYSA9PSBYWUZEX0IpICYmIChwa3R0eXAgPT0gJ0QnIHx8IHBrdHR5cCA9PSAnWScpKSB4ID0gMDsKKwlpZiAoeCkKKwkgIHh4c2NyZWVuKFNDUl9QVCxwa3R0eXAsKGxvbmcpbiwoY2hhciAqKW15ZGF0YSk7IC8qIFVwZGF0ZSBzY3JlZW4gKi8KKyAgICB9CisgICAgcmV0dXJuKHNwa3RsKTsJCQkvKiBSZXR1cm4gbGVuZ3RoICovCit9CisKKy8qICBDIEggSyAxICAtLSAgQ29tcHV0ZSBhIHR5cGUtMSBLZXJtaXQgNi1iaXQgY2hlY2tzdW0uICAqLworCitpbnQKK2NoazEocGt0LGxlbikgcmVnaXN0ZXIgQ0hBUiAqcGt0OyByZWdpc3RlciBpbnQgbGVuOyB7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGNoazsKKyNpZmRlZiBDS1RVTklORworI2lmZGVmIENPTU1FTlQKKyAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgbTsJCS8qIEF2b2lkIGZ1bmN0aW9uIGNhbGwgKi8KKyAgICBtID0gKHBhcml0eSkgPyAwMTc3IDogMDM3NzsKKyAgICBmb3IgKGNoayA9IDA7IGxlbi0tID4gMDsgcGt0KyspCisgICAgICBjaGsgKz0gKnBrdCAmIG07CisjZWxzZQorICAgIGNoayA9IDA7CisgICAgd2hpbGUgKGxlbi0tID4gMCkgY2hrICs9ICh1bnNpZ25lZCkgKnBrdCsrOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbHNlCisgICAgY2hrID0gY2hrMihwa3QsbGVuKTsKKyNlbmRpZiAvKiBDS1RVTklORyAqLworICAgIGNoayA9ICgoKGNoayAmIDAzMDApID4+IDYpICsgY2hrKSAmIDA3NzsKKyAgICBkZWJ1ZyhGMTAxLCJjaGsxIiwiIixjaGspOworICAgIHJldHVybigoaW50KSBjaGspOworfQorCisvKiAgQyBIIEsgMiAgLS0gIENvbXB1dGUgdGhlIG51bWVyaWMgc3VtIG9mIGFsbCB0aGUgYnl0ZXMgaW4gdGhlIHBhY2tldC4gICovCisKK3Vuc2lnbmVkIGludAorY2hrMihwa3QsbGVuKSByZWdpc3RlciBDSEFSICpwa3Q7IHJlZ2lzdGVyIGludCBsZW47IHsKKyAgICByZWdpc3RlciBsb25nIGNoazsKKyNpZmRlZiBDT01NRU5UCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IG07CisgICAgbSA9IChwYXJpdHkpID8gMDE3NyA6IDAzNzc7CisgICAgZm9yIChjaGsgPSAwOyBsZW4tLSA+IDA7IHBrdCsrKQorICAgICAgY2hrICs9ICpwa3QgJiBtOworI2Vsc2UKKyAgICAvKiBQYXJpdHkgaGFzIGFscmVhZHkgYmVlbiBzdHJpcHBlZCAqLworICAgIGNoayA9IDBMOworICAgIHdoaWxlIChsZW4tLSA+IDApIGNoayArPSAodW5zaWduZWQpICpwa3QrKzsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgZGVidWcoRjEwMSwiY2hrMiIsIiIsKHVuc2lnbmVkIGludCkgKGNoayAmIDA3Nzc3KSk7CisgICAgcmV0dXJuKCh1bnNpZ25lZCBpbnQpIChjaGsgJiAwNzc3NykpOworfQorCisvKiAgQyBIIEsgMyAgLS0gIENvbXB1dGUgYSB0eXBlLTMgS2VybWl0IGJsb2NrIGNoZWNrLiAgKi8KKy8qCisgQ2FsY3VsYXRlIHRoZSAxNi1iaXQgQ1JDLUNDSVRUIG9mIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB1c2luZyBhIGxvb2t1cAorIHRhYmxlLiAgQXNzdW1lcyB0aGUgYXJndW1lbnQgc3RyaW5nIGNvbnRhaW5zIG5vIGVtYmVkZGVkIG51bGxzLgorKi8KKyNpZmRlZiBDT01NRU5UCit1bnNpZ25lZCBpbnQKK2NoazMocGt0LHBhcml0eSxsZW4pIHJlZ2lzdGVyIENIQVIgKnBrdDsgaW50IHBhcml0eTsgcmVnaXN0ZXIgaW50IGxlbjsgeworICAgIHJlZ2lzdGVyIGxvbmcgYywgY3JjOworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBtOworICAgIG0gPSAocGFyaXR5KSA/IDAxNzcgOiAwMzc3OworICAgIGZvciAoY3JjID0gMDsgbGVuLS0gPiAwOyBwa3QrKykgeworCWMgPSBjcmMgXiAobG9uZykoKnBrdCAmIG0pOworCWNyYyA9IChjcmMgPj4gOCkgXiAoY3JjdGFbKGMgJiAweEYwKSA+PiA0XSBeIGNyY3RiW2MgJiAweDBGXSk7CisgICAgfQorICAgIHJldHVybigodW5zaWduZWQgaW50KSAoY3JjICYgMHhGRkZGKSk7Cit9CisjZWxzZQordW5zaWduZWQgaW50CitjaGszKHBrdCxsZW4pIHJlZ2lzdGVyIENIQVIgKnBrdDsgcmVnaXN0ZXIgaW50IGxlbjsgeworICAgIHJlZ2lzdGVyIGxvbmcgYywgY3JjOworICAgIGZvciAoY3JjID0gMDsgbGVuLS0gPiAwOyBwa3QrKykgeworCWMgPSBjcmMgXiAobG9uZykoKnBrdCk7CisJY3JjID0gKGNyYyA+PiA4KSBeIChjcmN0YVsoYyAmIDB4RjApID4+IDRdIF4gY3JjdGJbYyAmIDB4MEZdKTsKKyAgICB9CisgICAgZGVidWcoRjEwMSwiY2hrMyIsIiIsKHVuc2lnbmVkIGludCkgKGNyYyAmIDB4RkZGRikpOworICAgIHJldHVybigodW5zaWduZWQgaW50KSAoY3JjICYgMHhGRkZGKSk7Cit9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisvKiAgTiBYIFQgUCBLIFQgIC0tICBOZXh0IFBhY2tldCAgKi8KKy8qCisgIEdldCBwYWNrZXQgbnVtYmVyIG9mIG5leHQgcGFja2V0IHRvIHNlbmQgYW5kIGFsbG9jYXRlIGEgYnVmZmVyIGZvciBpdC4KKyAgUmV0dXJuczoKKyAgICAwIG9uIHN1Y2Nlc3MsIHdpdGggZ2xvYmFsIHBrdG51bSBzZXQgdG8gdGhlIHBhY2tldCBudW1iZXI7CisgICAtMSBvbiBmYWlsdXJlIHRvIGFsbG9jYXRlIGJ1ZmZlciAoZmF0YWwpOworICAgLTIgaWYgcmVzdWx0aW5nIHBhY2tldCBudW1iZXIgaXMgb3V0c2lkZSB0aGUgY3VycmVudCB3aW5kb3cuCisqLworaW50CitueHRwa3QoKSB7CQkJCS8qIENhbGxlZCBieSBmaWxlIHNlbmRlciAqLworICAgIGludCBqLCBuLCB4OworCisgICAgZGVidWcoRjEwMSwibnh0cGt0IHBrdG51bSIsIiIscGt0bnVtKTsKKyAgICBkZWJ1ZyhGMTAxLCJueHRwa3Qgd2lubG8gIiwiIix3aW5sbyk7CisgICAgbiA9IChwa3RudW0gKyAxKSAlIDY0OwkJLyogSW5jcmVtZW50IHBhY2tldCBudW1iZXIgbW9kIDY0ICovCisgICAgZGVidWcoRjEwMSwibnh0cGt0IG4iLCIiLG4pOworI2lmZGVmIFNUUkVBTUlORworICAgIGlmICghc3RyZWFtaW5nKSB7CisJeCA9IGNoa3dpbihuLHdpbmxvLHdzbG90cyk7CS8qIERvbid0IGV4Y2VlZCB3aW5kb3cgYm91bmRhcnkgKi8KKwlkZWJ1ZyhGMTAxLCJueHRwa3QgY2hrd2luIiwiIix4KTsKKwlpZiAoeCkKKwkgIHJldHVybigtMik7CisJaiA9IGdldHNidWYobik7CQkJLyogR2V0IGEgYnVmZmVyIGZvciBwYWNrZXQgbiAqLworCWlmIChqIDwgMCkgeworCSAgICBkZWJ1ZyhGMTAxLCJueHRwa3QgZ2V0c2J1ZiBmYWlsdXJlIiwiIixqKTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisgICAgfQorI2VuZGlmIC8qIFNUUkVBTUlORyAqLworICAgIHBrdG51bSA9IG47CisgICAgcmV0dXJuKDApOworfQorCisvKiBGdW5jdGlvbnMgZm9yIHNlbmRpbmcgQUNLcyBhbmQgTkFLcyAqLworCisvKiBOb3RlLCB3ZSBzaG91bGQgb25seSBBQ0sgdGhlIHBhY2tldCBhdCB3aW5kb3ctbG93ICh3aW5sbykgKi8KKy8qIEhvd2V2ZXIsIGlmIGFuIG9sZCBwYWNrZXQgYXJyaXZlcyBhZ2FpbiAoZS5nLiBiZWNhdXNlIHRoZSBBQ0sgd2Ugc2VudCAqLworLyogZWFybGllciB3YXMgbG9zdCksIHdlIEFDSyBpdCBhZ2Fpbi4gKi8KKworaW50CithY2soKSB7CQkJCQkvKiBBY2tub3dsZWRnZSB0aGUgY3VycmVudCBwYWNrZXQuICovCisgICAgcmV0dXJuKGFja25zKHdpbmxvLChDSEFSICopIiIpKTsKK30KKworI2lmZGVmIFNUUkVBTUlORworaW50CitmYXN0YWNrKCkgewkJCQkvKiBBY2tub3dsZWRnZSBwYWNrZXQgbiAqLworICAgIGludCBqLCBrLCBuLCB4OworICAgIG4gPSB3aW5sbzsKKworICAgIGsgPSByc2VxdGJsW25dOwkJCS8qIEZpcnN0IGZpbmQgcmVjZWl2ZWQgcGFja2V0IG4uICovCisgICAgZGVidWcoRjEwMSwiU1RSRUFNSU5HIGZhc3RhY2sgayIsIiIsayk7CisgICAgZnJlZXNidWYobik7CQkJLyogRnJlZSBjdXJyZW50IHNlbmQtYnVmZmVyLCBpZiBhbnkgKi8KKyAgICBpZiAoKGogPSBnZXRzYnVmKG4pKSA8IDApIHsKKwkvKiBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgaGF2ZSB0byByZS1BQ0sgYW4gb2xkIHBhY2tldCB0aGF0IGhhcyAqLworICAgICAgICAvKiBhbHJlYWR5IGxlZnQgdGhlIHdpbmRvdy4gIEl0IGRvZXMgbm8gaGFybS4gKi8KKwlkZWJ1ZyhGMTAxLCJTVFJFQU1JTkcgZmFzdGFjayBjYW4ndCBnZXRzYnVmIiwiIixuKTsKKyAgICB9CisgICAgZG9udHNlbmQgPSAxOworICAgIHggPSBzcGFjaygnWScsbiwwLChDSEFSICopIiIpOwkvKiBOb3cgc2VuZCBpdCAoYnV0IG5vdCByZWFsbHkpICovCisgICAgZG9udHNlbmQgPSAwOworICAgIGlmICh4IDwgMCkgcmV0dXJuKHgpOworICAgIGRlYnVnKEYxMDEsIlNUUkVBTUlORyBmYXN0YWNrIHgiLCIiLHgpOworICAgIGlmIChrID4gLTEpCisgICAgICBmcmVlcmJ1ZihrKTsJCQkvKiBkb24ndCBuZWVkIGl0IGFueSBtb3JlICovCisgICAgaWYgKGogPiAtMSkKKyAgICAgIGZyZWVzYnVmKGopOwkJCS8qIGFuZCBkb24ndCBuZWVkIHRvIGtlZXAgQUNLIGVpdGhlciAqLworICAgIHdpbmxvID0gKHdpbmxvICsgMSkgJSA2NDsKKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisKK2ludAorYWNrbnMobixzKSBpbnQgbjsgQ0hBUiAqczsgewkJLyogQWNrbm93bGVkZ2UgcGFja2V0IG4gKi8KKyAgICBpbnQgaiwgaywgeDsKKyAgICBkZWJ1ZyhGMTExLCJhY2tucyIscyxuKTsKKworICAgIGsgPSByc2VxdGJsW25dOwkJCS8qIEZpcnN0IGZpbmQgcmVjZWl2ZWQgcGFja2V0IG4uICovCisgICAgZGVidWcoRjEwMSwiYWNrbnMgayIsIiIsayk7CisgICAgZnJlZXNidWYobik7CQkJLyogRnJlZSBjdXJyZW50IHNlbmQtYnVmZmVyLCBpZiBhbnkgKi8KKyAgICBpZiAoKGogPSBnZXRzYnVmKG4pKSA8IDApIHsKKwkvKiBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgaGF2ZSB0byByZS1BQ0sgYW4gb2xkIHBhY2tldCB0aGF0IGhhcyAqLworICAgICAgICAvKiBhbHJlYWR5IGxlZnQgdGhlIHdpbmRvdy4gIEl0IGRvZXMgbm8gaGFybS4gKi8KKwlkZWJ1ZyhGMTAxLCJhY2tucyBjYW4ndCBnZXRzYnVmIiwiIixuKTsKKyAgICB9CisgICAgeCA9IHNwYWNrKCdZJyxuLChpbnQpc3RybGVuKChjaGFyICopcykscyk7IC8qIE5vdyBzZW5kIGl0LiAqLworICAgIGlmICh4IDwgMCkgcmV0dXJuKHgpOworICAgIGRlYnVnKEYxMDEsImFja25zIHdpbmxvIiwiIix3aW5sbyk7CisgICAgZGVidWcoRjEwMSwiYWNrbnMgbiIsIiIsbik7CisgICAgaWYgKG4gPT0gd2lubG8pIHsJCQkvKiBJZiB3ZSdyZSBhY2tpbmcgd2lubG8gKi8KKwlpZiAoayA+IC0xKQorCSAgZnJlZXJidWYoayk7CQkJLyogZG9uJ3QgbmVlZCBpdCBhbnkgbW9yZSAqLworCWlmIChqID4gLTEpCisJICBmcmVlc2J1ZihqKTsJCQkvKiBhbmQgZG9uJ3QgbmVlZCB0byBrZWVwIEFDSyBlaXRoZXIgKi8KKwl3aW5sbyA9ICh3aW5sbyArIDEpICUgNjQ7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworaW50CithY2tuKG4pIGludCBuOyB7CQkJLyogU2VuZCBBQ0sgZm9yIHBhY2tldCBudW1iZXIgbiAqLworICAgIHJldHVybihhY2tucyhuLChDSEFSICopIiIpKTsKK30KKworaW50CithY2sxKHMpIENIQVIgKnM7IHsJCQkvKiBTZW5kIGFuIEFDSyB3aXRoIGRhdGEuICovCisgICAgaWYgKCFzKSBzID0gKENIQVIgKikiIjsKKyAgICBkZWJ1ZyhGMTEwLCJhY2sxIiwoY2hhciAqKXMsMCk7CisgICAgcmV0dXJuKGFja25zKHdpbmxvLHMpKTsKK30KKworLyogTiBBIEMgSyAgLS0gICBTZW5kIGEgTmVnYXRpdmUgQUNLbm93bGVkZ21lbnQuICovCisvKgorIENhbGwgd2l0aCB0aGUgcGFja2V0IG51bWJlciwgbiwgdG8gYmUgTkFLJ2QuCisgUmV0dXJucyAtMSBpZiB0aGF0IHBhY2tldCBoYXMgYmVlbiBOQUsnZCB0b28gbWFueSB0aW1lcywgb3RoZXJ3aXNlIDAuCisgQnR3LCBpdCBpcyBub3QgcmlnaHQgdG8gcmV0dXJuIDAgdW5kZXIgZXJyb3IgY29uZGl0aW9ucy4gIFRoaXMgaXMKKyBkb25lIGJlY2F1c2UgdGhlIC0xIGNvZGUgaXMgdXNlZCBmb3IgY2FuY2VsbGluZyB0aGUgZmlsZSB0cmFuc2Zlci4KKyBNb3JlIHdvcmsgaXMgbmVlZGVkIGhlcmUuCisqLworaW50CituYWNrKG4pIGludCBuOyB7CisgICAgaW50IGksIHg7CisKKyAgICBpZiAobiA8IDAgfHwgbiA+IDYzKSB7CisJZGVidWcoRjEwMSwibmFjayBiYWQgcGt0IG51bSIsIiIsbik7CisJcmV0dXJuKDApOworICAgIH0gZWxzZSBkZWJ1ZyhGMTAxLCJuYWNrIiwiIixuKTsKKyAgICBpZiAoKGkgPSBzc2VxdGJsW25dKSA8IDApIHsJCS8qIElmIG5lY2Vzc2FyeSAqLworCWlmIChnZXRzYnVmKG4pIDwgMCkgewkJLyogZ2V0IGEgYnVmZmVyIGZvciB0aGlzIE5BSyAqLworCSAgICBkZWJ1ZyhGMTAxLCJuYWNrIGNhbid0IGdldHNidWYiLCIiLG4pOworCSAgICByZXR1cm4oMCk7CisJfSBlbHNlIGkgPSBzc2VxdGJsW25dOwkJLyogTmV3IHNsb3QgbnVtYmVyICovCisgICAgfQorICAgIGlmIChtYXh0cnkgPiAwICYmIHNfcGt0W2ldLnBrX3J0cisrID4gbWF4dHJ5KSAvKiBIb3cgbWFueT8gKi8KKyAgICAgIHJldHVybigtMSk7CQkJLyogVG9vIG1hbnkuLi4gKi8KKworLyogTm90ZSwgZG9uJ3QgZnJlZSB0aGlzIGJ1ZmZlci4gIEV2ZW50dWFsbHkgYW4gQUNLIHdpbGwgY29tZSwgYW5kIHRoYXQgKi8KKy8qIHdpbGwgc2V0IGl0IGZyZWUuICBJZiBub3QsIHdlbGwsIGl0J3MgYmFjayB0byBncm91bmQgemVybyBhbnl3YXkuLi4gICovCisKKyAgICB4ID0gc3BhY2soJ04nLG4sMCwoQ0hBUiAqKSAiIik7CS8qIE5BS3MgbmV2ZXIgaGF2ZSBkYXRhLiAqLworICAgIHJldHVybih4KTsKK30KKworI2lmbmRlZiBORVdEUEwJCQkJLyogVGhpcyByb3V0aW5lIG5vIGxvbmdlciB1c2VkICovCisvKgorICogKFBXUCkgcmVjYWxjdWxhdGUgdGhlIG9wdGltYWwgcGFja2V0IGxlbmd0aCBpbiB0aGUgZmFjZSBvZiBlcnJvcnMuCisgKiBUaGlzIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgYWxnb3JpdGhtIGJ5IEpvaG4gQ2hhbmRsZXIgaW4gS2VybWl0LzM3MCwKKyAqIHNlZSAiRHluYW1pYyBQYWNrZXQgU2l6ZSBDb250cm9sIiwgS2VybWl0IE5ld3MsIFYyICMxLCBKdW5lIDE5ODguCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBtaW5pbWl6ZXMgdGhlIHRvdGFsIG92ZXJoZWFkIGVxdWF0aW9uLCB3aGljaCBpcworICoKKyAqICAgVG90YWwgY2hhcnMgPSBmaWxlX2NoYXJzICsgKGhlYWRlcl9sZW4gKiBudW1fcGFja3MpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChlcnJvcnMgKiAoaGVhZGVyX2xlbiArIHBhY2tldF9sZW4pKQorICoKKyAqIERpZmZlcmVudGlhdGUgd2l0aCByZXNwZWN0IHRvIG51bWJlciBvZiBjaGFycywgc29sdmUgZm9yIHBhY2tldF9sZW4sIGdldDoKKyAqCisgKiAgIHBhY2tldF9sZW4gPSBzcXJ0IChmaWxlX2NoYXJzICogaGVhZGVyX2xlbiAvIGVycm9ycykKKyAqLworCisvKgorIChGREMpIE5ldyBzdXBlci1zaW1wbGUgYWxnb3JpdGhtLiAgSWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBtb3N0IHJlY2VudAorIHBhY2tldCBleGNoYW5nZSwgY3V0IHRoZSBzZW5kLXBhY2tldCBzaXplIGluIGhhbGYsIGRvd24gdG8gYSBtaW5pbXVtIG9mIDIwLgorIElmIHRoZXJlIHdhcyBubyBlcnJvciwgaW5jcmVhc2UgdGhlIHNpemUgYnkgNS80LCB1cCB0byB0aGUgbWF4aW11bSBuZWdvdGlhdGVkCisgbGVuZ3RoLiAgU2VlbXMgdG8gYmUgbXVjaCBtb3JlIHJlc3BvbnNpdmUgdGhhbiBwcmV2aW91cyBhbGdvcml0aG0sIHdoaWNoIHRvb2sKKyBmb3JldmVyIHRvIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBhY2tldCBsZW5ndGgsIGFuZCBpdCBhbHNvIHdlbnQgY3JhenkgdW5kZXIKKyBjZXJ0YWluIGNvbmRpdGlvbnMuCisKKyBIZXJlJ3MgYW5vdGhlciBpZGVhIGZvciBwYWNrZXQgbGVuZ3RoIHJlc2l6aW5nIHRoYXQga2VlcHMgYSBoaXN0b3J5IG9mIHRoZQorIGxhc3QgbiBwYWNrZXRzLiAgUHVzaCBhIDEgaW50byB0aGUgbGVmdCBlbmQgb2YgYW4gbi1iaXQgc2hpZnQgcmVnaXN0ZXIgaWYgdGhlCisgY3VycmVudCBwYWNrZXQgaXMgZ29vZCwgb3RoZXJ3aXNlIHB1c2ggYSB6ZXJvLiAgVGhlIGN1cnJlbnQgbi1iaXQgdmFsdWUsIHcsIG9mCisgdGhpcyByZWdpc3RlciBpcyBhIHdlaWdodGVkIHN1bSBvZiB0aGUgbm9pc2UgaGl0cyBmb3IgdGhlIGxhc3QgbiBwYWNrZXRzLCB3aXRoCisgdGhlIG1vc3QgcmVjZW50IHdlaWdoaW5nIHRoZSBtb3N0LiAgVGhlIGN1cnJlbnQgcGFja2V0IGxlbmd0aCBpcyBzb21lIGZ1bmN0aW9uCisgb2YgdyBhbmQgdGhlIG5lZ290aWF0ZWQgcGFja2V0IGxlbmd0aCwgbGlrZToKKworICAgKDJebiAtIHcpIC8gKDJebikgKiAobmVnb3RpYXRlZCBsZW5ndGgpCisKKyBJZiB0aGUgcHJlc2VudCByZXNpemluZyBtZXRob2QgY2F1c2VzIHByb2JsZW1zLCB0aGluayBhYm91dCB0aGlzIG9uZSBhIGxpdHRsZQorIG1vcmUuCisqLworVk9JRAorcmNhbGNwc3ooKSB7CisKKyNpZmRlZiBDT01NRU5UCisvKiBPbGQgd2F5ICovCisgICAgcmVnaXN0ZXIgbG9uZyB4LCBxOworICAgIGlmIChudW1lcnJzID09IDApIHJldHVybjsJCS8qIGJvdW5kcyBjaGVjayBqdXN0IGluIGNhc2UgKi8KKworICAgIC8qIG92ZXJoZWFkIG9uIGEgZGF0YSBwYWNrZXQgaXMgbnBhZCs1K2JjdHIsIHBsdXMgMyBpZiBleHRlbmRlZCBwYWNrZXQgKi8KKyAgICAvKiBhbiBBQ0sgaXMgNStiY3RyICovCisKKyAgICAvKiBmaXJzdCBzZXQgeCA9IHBlciBwYWNrZXQgb3ZlcmhlYWQgKi8KKyAgICBpZiAod3Nsb3RzID4gMSkJCQkvKiBTbGlkaW5nIHdpbmRvd3MgKi8KKyAgICAgIHggPSAobG9uZykgKG5wYWQrNStiY3RyKTsJCS8qIHBhY2tldCBvbmx5LCBkb24ndCBjb3VudCBhY2sgKi8KKyAgICBlbHNlCQkJCS8qIFN0b3Atbi13YWl0ICovCisgICAgICB4ID0gKGxvbmcpIChucGFkKzUrMytiY3RyKzUrYmN0cik7IC8qIGNvdW50IHBhY2tldCBhbmQgYWNrLiAqLworCisgICAgLyogdGhlbiBzZXQgeCA9IHBhY2tldCBsZW5ndGggKiogMiAqLworICAgIHggPSB4ICogKCBmZmMgLyAobG9uZykgbnVtZXJycyk7CS8qIGNhcmVmdWwgb2Ygb3ZlcmZsb3cgKi8KKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgbG9uZyBpbnRlZ2VyIHNxcnQoeCkgcXVpY2tseSAqLworICAgIHEgPSA1MDA7CisgICAgcSA9IChxICsgeC9xKSA+PiAxOworICAgIHEgPSAocSArIHgvcSkgPj4gMTsKKyAgICBxID0gKHEgKyB4L3EpID4+IDE7CisgICAgcSA9IChxICsgeC9xKSA+PiAxOwkJLyogc2hvdWxkIGNvbnZlcmdlIGluIGFib3V0IDQgc3RlcHMgKi8KKyAgICBpZiAoKHEgPiA5NCkgJiYgKHEgPCAxMzApKQkvKiBicmVhay1ldmVuIHBvaW50IGZvciBsb25nIHBhY2tldHMgKi8KKyAgICAgIHEgPSA5NDsKKyAgICBpZiAocSA+IHNwbWF4KSBxID0gc3BtYXg7CS8qIG1heGltdW0gYm91bmRzICovCisgICAgaWYgKHEgPCAxMCkgcSA9IDEwOwkJLyogbWluaW11bSBib3VuZHMgKi8KKyAgICBzcHNpeiA9IHE7CQkJLyogc2V0IG5ldyBzZW5kIHBhY2tldCBzaXplICovCisgICAgZGVidWcoRjEwMSwicmNhbGNwc2l6IiwiIixxKTsKKyNlbHNlCisvKiBOZXcgd2F5ICovCisgICAgZGVidWcoRjEwMSwicmNhbGNwc2l6IG51bWVycnMiLCIiLG51bWVycnMpOworICAgIGRlYnVnKEYxMDEsInJjYWxjcHNpeiBzcHNpeiIsIiIsc3BzaXopOworICAgIGlmIChzcGFja2V0cyA8IDMpIHsKKwludW1lcnJzID0gMDsKKwlyZXR1cm47CisgICAgfQorICAgIGlmIChudW1lcnJzKQorICAgICAgc3BzaXogPSBzcHNpeiAvIDI7CisgICAgZWxzZQorICAgICAgc3BzaXogPSAoc3BzaXogLyA0KSAqIDU7CisgICAgaWYgKHNwc2l6IDwgMjApIHNwc2l6ID0gMjA7CisgICAgaWYgKHNwc2l6ID4gc3BtYXgpIHNwc2l6ID0gc3BtYXg7CisgICAgZGVidWcoRjEwMSwicmNhbGNwc2l6IG5ldyBzcHNpeiIsIiIsc3BzaXopOworICAgIG51bWVycnMgPSAwOworI2VuZGlmIC8qIENPTU1FTlQgKi8KK30KKyNlbmRpZiAvKiBORVdEUEwgKi8KKworLyogIFIgRSBTIEUgTiBEICAtLSAgUmV0cmFuc21pdCBwYWNrZXQgbi4gICovCisKKy8qCisgIFJldHVybnMgMCBvciBwb3NpdGl2ZSBvbiBzdWNjZXNzICh0aGUgbnVtYmVyIG9mIHJldHJpZXMgZm9yIHBhY2tldCBuKS4KKyAgT24gZmFpbHVyZSwgcmV0dXJucyBhIG5lZ2F0aXZlIG51bWJlciwgYW5kIGFuIGVycm9yIG1lc3NhZ2UgaXMgcGxhY2VkCisgIGluIHJlY3BrdC4KKyovCitpbnQKK3Jlc2VuZChuKSBpbnQgbjsgewkJCS8qIFNlbmQgcGFja2V0IG4gYWdhaW4uICovCisgICAgaW50IGosIGssIHg7CisjaWZkZWYgR0ZUSU1FUgorICAgIENLRkxPQVQgdDEgPSAwLjAsIHQyID0gMC4wOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKworICAgIGRlYnVnKEYxMDEsInJlc2VuZCBzZXEiLCIiLG4pOworCisgICAgayA9IGNoa3dpbihuLHdpbmxvLHdzbG90cyk7CQkvKiBTZWUgaWYgcGFja2V0IGluIGN1cnJlbnQgd2luZG93ICovCisgICAgaiA9IC0xOwkJCQkvKiBBc3N1bWUgaXQncyBsb3N0ICovCisgICAgaWYgKGsgPT0gMCkgaiA9IHNzZXF0Ymxbbl07CQkvKiBTZWUgaWYgd2Ugc3RpbGwgaGF2ZSBhIGNvcHkgb2YgaXQgKi8KKyAgICBpZiAoayAhPSAwIHx8IGogPCAwKSB7CQkvKiBJZiBub3QuLi4uICovCisJaWYgKG5ha3N0YXRlICYmIGsgPT0gMSkgeworLyoKKyAgUGFja2V0IG4gaXMgaW4gdGhlIHByZXZpb3VzIHdpbmRvdyBhbmQgd2UgYXJlIHRoZSBmaWxlIHJlY2VpdmVyLgorICBXZSBhbHJlYWR5IHNlbnQgdGhlIEFDSyBhbmQgZGVhbGxvY2F0ZWQgaXRzIGJ1ZmZlciBzbyB3ZSBjYW4ndCBqdXN0CisgIHJldHJhbnNtaXQgdGhlIEFDSy4gIFJhdGhlciB0aGFuIGdpdmUgdXAsIHdlIHRyeSBzb21lIHRyaWNrcy4uLgorKi8KKwkgICAgaWYgKG4gPT0gMCAmJiBzcGFja2V0cyA8IDYzICYmIG15aW5pdFswXSkgeyAvKiBBQ0sgdG8gU2VuZC1Jbml0ICovCisvKgorICBJZiB0aGUgcGFja2V0IG51bWJlciBpcyAwLCBhbmQgd2UncmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHByb3RvY29sCisgIG9wZXJhdGlvbiAoc3BhY2tldHMgPCA2MyksIHRoZW4gd2UgaGF2ZSB0byByZXNlbmQgdGhlIEFDSyB0byBhbiBJIG9yIFMKKyAgcGFja2V0LCBjb21wbGV0ZSB3aXRoIHBhcmFtZXRlcnMgaW4gdGhlIGRhdGEgZmllbGQuICBTbyB3ZSB0YWtlIGEgY2hhbmNlIGFuZAorICBzZW5kIGEgY29weSBvZiB0aGUgcGFyYW1ldGVycyBpbiBhbiBBQ0sgcGFja2V0IHdpdGggYmxvY2sgY2hlY2sgdHlwZSAxLgorKi8KKwkJaW50IGJjdGxzYXY7CQkvKiBUZW1wb3Jhcnkgc3RvcmFnZSAqLworCQlpbnQgYmN0dXNhdjsKKwkJYmN0bHNhdiA9IGJjdGw7CQkvKiBTYXZlIGN1cnJlbnQgYmxvY2sgY2hlY2sgbGVuZ3RoICovCisJCWJjdHVzYXYgPSBiY3R1OwkJLyogYW5kIHR5cGUgKi8KKwkJYmN0dSA9IGJjdGwgPSAxOwkvKiBTZXQgYmxvY2sgY2hlY2sgdG8gMSAqLworCQl4ID0gc3BhY2soJ1knLDAsKGludClzdHJsZW4oKGNoYXIgKilteWluaXQpLChDSEFSICopbXlpbml0KTsKKwkJaWYgKHggPCAwKSByZXR1cm4oeCk7CisJCWxvZ3BrdCgnIycsbiwoQ0hBUiAqKSI8cmVjb25zdHJ1Y3RlZD4iLDApOyAvKiBMb2cgaXQgKi8KKwkJYmN0dSA9IGJjdHVzYXY7CQkvKiBSZXN0b3JlIGJsb2NrIGNoZWNrIHR5cGUgKi8KKwkJYmN0bCA9IGJjdGxzYXY7CQkvKiBhbmQgbGVuZ3RoICovCisKKwkgICAgfSBlbHNlIHsJCQkvKiBOb3QgdGhlIGZpcnN0IHBhY2tldCAqLworLyoKKyAgSXQncyBub3QgdGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgcHJvdG9jb2wgb3BlcmF0aW9uLiAgSXQncyBzb21lIG90aGVyIHBhY2tldAorICB0aGF0IHdlIGhhdmUgYWxyZWFkeSBBQ0snZCBhbmQgZm9yZ290dGVuIGFib3V0LiAgU28gd2UgdGFrZSBhIGNoYW5jZSBhbmQKKyAgc2VuZCBhbiBlbXB0eSBBQ0sgdXNpbmcgdGhlIGN1cnJlbnQgYmxvY2stY2hlY2sgdHlwZS4gIFVzdWFsbHkgdGhpcyB3aWxsCisgIHdvcmsgb3V0IE9LIChsaWtlIHdoZW4gYWNraW5nIERhdGEgcGFja2V0cyksIGFuZCBubyBncmVhdCBoYXJtIHdpbGwgYmUgZG9uZQorICBpZiBpdCB3YXMgc29tZSBvdGhlciBraW5kIG9mIHBhY2tldCAoRiwgZXRjKS4gIElmIHdlIGFyZSByZXF1ZXN0aW5nIGFuCisgIGludGVycnVwdGlvbiBvZiB0aGUgZmlsZSB0cmFuc2ZlciwgdGhlIGZsYWdzIGFyZSBzdGlsbCBzZXQsIHNvIHdlJ2xsIGNhdGNoCisgIHVwIG9uIHRoZSBuZXh0IHBhY2tldC4KKyovCisJCXggPSBzcGFjaygnWScsbiwwLChDSEFSICopICIiKTsKKwkJaWYgKHggPCAwKSByZXR1cm4oeCk7CisJICAgIH0KKwkgICAgcmV0cmFucysrOworCSAgICB4eHNjcmVlbihTQ1JfUFQsJyUnLChsb25nKXBrdG51bSwiUmV0cmFuc21pc3Npb24iKTsKKwkgICAgcmV0dXJuKDApOworCX0gZWxzZSB7CisvKgorICBQYWNrZXQgbnVtYmVyIGlzIG5vdCBpbiBjdXJyZW50IG9yIHByZXZpb3VzIHdpbmRvdy4gIFdlIHNlZW0gdG8gaGl0IHRoaXMKKyAgY29kZSBvY2Nhc2lvbmFsbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHRyYW5zYWN0aW9uLCBmb3IgYXBwYXJlbnRseSBubyBnb29kCisgIHJlYXNvbi4gIExldCdzIGp1c3QgbG9nIGl0IGZvciBkZWJ1Z2dpbmcsIHNlbmQgbm90aGluZywgYW5kIHRyeSB0byBwcm9jZWVkCisgIHdpdGggdGhlIHByb3RvY29sIHJhdGhlciB0aGFuIGtpbGxpbmcgaXQuCisqLworCSAgICBkZWJ1ZyhGMTAxLCJyZXNlbmQgUEtUIE5PVCBJTiBXSU5ET1ciLCIiLG4pOworCSAgICBkZWJ1ZyhGMTAxLCJyZXNlbmQgayIsIiIsayk7CisJICAgIHJldHVybigwKTsKKwl9CisgICAgfQorCisvKiBPSywgaXQncyBpbiB0aGUgd2luZG93IGFuZCBpdCdzIG5vdCBsb3N0LiAqLworCisgICAgZGVidWcoRjEwMSwicmVzZW5kIHBrdGluZm8gaW5kZXgiLCIiLGspOworCisgICAgaWYgKG1heHRyeSA+IDAgJiYgc19wa3Rbal0ucGtfcnRyKysgPiBtYXh0cnkpIHsgLyogT3ZlciByZXRyeSBsaW1pdCAqLworCXhpdHN0YSB8PSB3aGF0OworCXJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsInJlc2VuZCByZXRyeSIsIiIsc19wa3Rbal0ucGtfcnRyKTsgLyogT0sgc28gZmFyICovCisgICAgZHVtcHNidWYoKTsJCQkJLyogKGRlYnVnZ2luZykgKi8KKyAgICBpZiAoc19wa3Rbal0ucGtfdHlwID09ICcgJykgewkvKiBJbmNvbXBsZXRlbHkgZm9ybWVkIHBhY2tldCAqLworCWlmIChuYWtzdGF0ZSkgewkJCS8qIChUaGlzIHNob3VsZG4ndCBoYXBwZW4gYW55IG1vcmUpICovCisJICAgIG5hY2sobik7CisJICAgIHJldHJhbnMrKzsKKwkgICAgeHhzY3JlZW4oU0NSX1BULCclJywobG9uZylwa3RudW0sIihyZXNlbmQpIik7CisJICAgIHJldHVybihzX3BrdFtqXS5wa19ydHIpOworCX0gZWxzZSB7CQkJLyogTm8gcGFja2V0IHRvIHJlc2VuZCEgKi8KKyNpZmRlZiBDT01NRU5UCisvKgorICBUaGlzIGhhcHBlbmVkIChvbmNlKSB3aGlsZSBzZW5kaW5nIGEgZmlsZSB3aXRoIDIgd2luZG93IHNsb3RzIGFuZCB0eXBpbmcKKyAgWCB0byB0aGUgc2VuZGVyIHRvIGNhbmNlbCB0aGUgZmlsZS4gIEJ1dCBzaW5jZSB3ZSdyZSBjYW5jZWxsaW5nIGFueXdheSwKKyAgdGhlcmUncyBubyBuZWVkIHRvIGdpdmUgYSBzY2FyeSBtZXNzYWdlLgorKi8KKwkgICAgc3ByaW50ZigoY2hhciAqKWVwa3Rtc2csCisJCSAgICAicmVzZW5kIGxvZ2ljIGVycm9yOiBOUFMsIG49JWQsIGo9JWQuIixuLGopOworCSAgICByZXR1cm4oLTIpOworI2Vsc2UKKy8qIEp1c3QgaWdub3JlIGl0LiAqLworCSAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCX0KKyAgICB9CisjaWZkZWYgREVCVUcKKyNpZmRlZiBHRlRJTUVSCisgICAgaWYgKGRlYmxvZykgdDEgPSBnZnRpbWVyKCk7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworI2VuZGlmIC8qIERFQlVHICovCisKKyAgICAvKiBFdmVyeXRoaW5nIG9rLCBzZW5kIHRoZSBwYWNrZXQgKi8KKyNpZmRlZiBDS19USU1FUlMKKyAgICBpZiAodGltaW50ID4gMCkKKyAgICAgIHNydHRibFtuXSA9IGd0aW1lcigpOwkJLyogVXBkYXRlIHRoZSB0aW1lciAqLworI2VuZGlmIC8qIENLX1RJTUVSUyAqLworICAgIHggPSB0dG9sKHNfcGt0W2pdLnBrX2FkcixzX3BrdFtqXS5wa19sZW4pOworCisjaWZkZWYgREVCVUcKKyNpZmRlZiBHRlRJTUVSCisgICAgaWYgKGRlYmxvZykgIHsKKwl0MiA9IGdmdGltZXIoKTsKKwlkZWJ1ZyhGMTAxLCJyZXNlbmQgdHRvbCBtc2VjIiwiIiwobG9uZykoKHQyLXQxKSoxMDAwLjApKTsKKyAgICB9CisjZW5kaWYgLyogR0ZUSU1FUiAqLworI2VuZGlmIC8qIERFQlVHICovCisgICAgZGVidWcoRjEwMSwicmVzZW5kIHR0b2wgcmV0dXJucyIsIiIseCk7CisKKyAgICByZXRyYW5zKys7CQkJCS8qIENvdW50IGEgcmV0cmFuc21pc3Npb24gKi8KKyAgICB4eHNjcmVlbihTQ1JfUFQsJyUnLChsb25nKXBrdG51bSwiKHJlc2VuZCkiKTsgLyogVGVsbCB1c2VyIGFib3V0IHJlc2VuZCAqLworICAgIGxvZ3BrdCgnUycsbixzX3BrdFtqXS5wa19hZHIsIHNfcGt0W2pdLnBrX2xlbik7IC8qIExvZyB0aGUgcmVzZW50IHBhY2tldCAqLworICAgIHJldHVybihzX3BrdFtqXS5wa19ydHIpOwkJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgcmV0cmllcy4gKi8KK30KKworLyogIEUgUiBSIFAgSyBUICAtLSAgU2VuZCBhbiBFcnJvciBQYWNrZXQgICovCisKK2ludAorZXJycGt0KHJlYXNvbikgQ0hBUiAqcmVhc29uOyB7CQkvKiAuLi5jb250YWluaW5nIHRoZSByZWFzb24gZ2l2ZW4gKi8KKyAgICBleHRlcm4gaW50IHJ0aW1vLCBzdGF0ZSwganVzdG9uZTsKKyAgICBpbnQgeCwgeTsKKyAgICBjenNlZW4gPSAxOwkJCQkvKiBBbHNvIGNhbmNlbHMgYmF0Y2ggKi8KKyAgICBzdGF0ZSA9IDA7CQkJCS8qIFJlc2V0IHByb3RvY29sIHN0YXRlICovCisgICAgZGVidWcoRjExMCwiZXJycGt0IixyZWFzb24sMCk7CisgICAgdGxvZyhGMTEwLCJQcm90b2NvbCBFcnJvcjoiLChjaGFyICopcmVhc29uLDBMKTsKKyAgICB4eHNjcmVlbihTQ1JfRU0sMCwwTCxyZWFzb24pOworICAgIGVuY3N0cihyZWFzb24pOworICAgIHggPSBzcGFjaygnRScscGt0bnVtLHNpemUsZGF0YSk7CisgICAgY2tzdHJuY3B5KChjaGFyICopZXBrdG1zZywoY2hhciAqKXJlYXNvbixQS1RNU0dMRU4pOworICAgIHkgPSBxdWlldDsgcXVpZXQgPSAxOyBlcGt0c2VudCA9IDE7CS8qIENsb3NlIGZpbGVzIHNpbGVudGx5LiAqLworICAgIGNsc2lmKCk7IGNsc29mKDEpOworICAgIHF1aWV0ID0geTsKKy8qCisgIEkganVzdCBzZW50IGFuIEUtcGFja2V0LiAgSSdtIGluIGxvY2FsIG1vZGUsIEkgd2FzIHJlY2VpdmluZyBhIGZpbGUsCisgIEknbSBub3QgYSBzZXJ2ZXIsIGFuZCBzbGlkaW5nIHdpbmRvd3MgYXJlIGluIHVzZS4gIFRoZXJlZm9yZSwgdGhlcmUgYXJlCisgIGxpa2VseSB0byBiZSBhIGJ1bmNoIG9mIHBhY2tldHMgYWxyZWFkeSAiaW4gdGhlIHBpcGUiIG9uIHRoZWlyIHdheSB0byBtZQorICBieSB0aGUgdGltZSB0aGUgcmVtb3RlIHNlbmRlciBnZXRzIHRoZSBFLXBhY2tldC4gIFNvIHRoZSBuZXh0IHRpbWUgSQorICBDT05ORUNUIG9yIHRyeSB0byBzdGFydCBhbm90aGVyIHByb3RvY29sIG9wZXJhdGlvbiwgSSBhbSBsaWtlbHkgdG8gYmVjb21lCisgIHRlcnJpYmx5IGNvbmZ1c2VkIGJ5IHRvcnJlbnRzIG9mIGluY29taW5nIG1hdGVyaWFsLiAgVG8gcHJldmVudCB0aGlzLAorICB0aGUgZm9sbG93aW5nIGNvZGUgc29ha3MgdXAgcGFja2V0cyBmcm9tIHRoZSBjb25uZWN0aW9uIHVudGlsIHRoZXJlIGlzIGFuCisgIGVycm9yIG9yIHRpbWVvdXQsIHdpdGhvdXQgd2FzdGluZyB0b28gbXVjaCB0aW1lIHdhaXRpbmcuCisKKyAgRXhhY3RseSB0aGUgc2FtZSBwcm9ibGVtIG9jY3VycyB3aGVuIEkgYW0gaW4gcmVtb3RlIG1vZGUgb3IgaWYgSSBhbQorICBpbiBzZXJ2ZXIgbW9kZSB3aXRoIHRoZSBqdXN0b25lIGZsYWcgc2V0LiAgSW4gcmVtb3RlIG1vZGUgbm90IG9ubHkKKyAgZG9lcyB0aGUgcGFja2V0IGRhdGEgcG90ZW50aWFsbHkgZ2V0IGVjaG8nZCBiYWNrIHRvIHRoZSBzZW5kZXIgd2hpY2gKKyAgaXMgY29uZnVzaW5nIHRvIHRoZSB1c2VyIGluIENPTk5FQ1QgbW9kZSwgYnV0IGl0IGFsc28gbWF5IHJlc3VsdCBpbiB0aGUKKyAgaG9zdCBwZXJmb3JtaW5nIGJpemFycmUgYWN0aW9ucyBzdWNoIGFzIHN1c3BlbmRpbmcgdGhlIHByb2Nlc3MgaWYgXlogaXMKKyAgdW5wcmVmaXhlZCwgZXRjLgorCisgIEZ1cnRoZXJtb3JlLCB0aG91c2FuZHMgb2YgcGFja2V0cyBieXRlcyBpbiB0aGUgZGF0YSBzdHJlYW0gcHJldmVudCB0aGUKKyAgY2xpZW50IGZyb20gYmVpbmcgYWJsZSB0byBwcm9jZXNzIFRlbG5ldCBLZXJtaXQgT3B0aW9uIG5lZ290aWF0aW9ucworICBwcm9wZXJseS4KKyovCisjaWZkZWYgU1RSRUFNSU5HCisgICAgLyogQmVjYXVzZSBzdHJlYW1pbmcgc2V0cyB0aGUgdGltZW91dCB0byAwLi4uICovCisgICAgaWYgKHN0cmVhbWluZykgeworCXRpbWludCA9IHJjdnRpbW8gPSBydGltbzsKKwlzdHJlYW1pbmcgPSAwOworICAgIH0KKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKyAgICBpZiAod2hhdCAmIFdfUkVDViAmJgorICAgICAgICAoIXNlcnZlciB8fCAoc2VydmVyICYmIGp1c3RvbmUpKSAmJgorICAgICAgICAod3Nsb3RzID4gMQorI2lmZGVmIFNUUkVBTUlORworCSB8fCBzdHJlYW1pbmcKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKwkgKSkgeworI2lmZGVmIEdGVElNRVIKKwlDS0ZMT0FUIG9sZHNlYywgc2VjID0gKENLRkxPQVQpIDAuMDsKKyNlbHNlCisJaW50IG9sZHNlYywgc2VjID0gMDsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisJZGVidWcoRjEwMSwiZXJycGt0IGRyYWluaW5nIiwiIix3c2xvdHMpOworCXh4c2NyZWVuKFNDUl9TVCxTVF9NU0csMGwsIkRyYWluaW5nIGluY29taW5nIHBhY2tldHMsIHdhaXQuLi4iKTsKKwl3aGlsZSAoeCA+IC0xKSB7CQkvKiBEb24ndCBib3RoZXIgaWYgbm8gY29ubmVjdGlvbiAqLworCSAgICBvbGRzZWMgPSBzZWM7CisjaWZkZWYgR0ZUSU1FUgorCSAgICBzZWMgPSBnZnRpbWVyKCk7CisJICAgIGlmIChvbGRzZWMgIT0gKENLRkxPQVQpIDAuMCkKKwkgICAgICB0aW1pbnQgPSByY3Z0aW1vID0gKGludCkgKHNlYyAtIG9sZHNlYyArIDAuNSk7CisjZWxzZQorCSAgICBzZWMgPSBndGltZXIoKTsKKwkgICAgaWYgKG9sZHNlYyAhPSAwKQorCSAgICAgIHRpbWludCA9IHJjdnRpbW8gPSBzZWMgLSBvbGRzZWMgKyAxOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKwkgICAgaWYgKHRpbWludCA8IDEpCisJICAgICAgdGltaW50ID0gcmN2dGltbyA9IDE7CisJICAgIG1zbGVlcCg1MCk7CQkJLyogQWxsb3cgYSBiaXQgb2Ygc2xvcCAqLworCSAgICB4ID0gcnBhY2soKTsJCS8qIFJlYWQgYSBwYWNrZXQgKi8KKwkgICAgaWYgKHggPT0gJ1QnIHx8IHggPT0gJ3onKQkvKiBUaW1lZCBvdXQgbWVhbnMgd2UncmUgZG9uZSAqLworCSAgICAgIGJyZWFrOworCSAgICB4eHNjcmVlbihTQ1JfUFQseCxyc24sIiIpOwkvKiBMZXQgdXNlciBrbm93ICovCisJfQorCXh4c2NyZWVuKFNDUl9TVCxTVF9NU0csMGwsIkRyYWluIGNvbXBsZXRlLiIpOworICAgIH0KKyAgICBpZiAoKHggPSAod2hhdCAmIFdfS0VSTUlUKSkpCisgICAgICB4aXRzdGEgfD0geDsJCQkvKiBSZW1lbWJlciB3aGF0IGZhaWxlZC4gKi8KKyAgICBzdWNjZXNzID0gMDsKKyAgICByZXR1cm4oeSk7Cit9CisKKy8qIHNjbWQoKSAgLS0gIFNlbmQgYSBwYWNrZXQgb2YgdGhlIGdpdmVuIHR5cGUgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3NjbWQoY2hhciB0LCBDSEFSICpkYXQpCisjZWxzZQorc2NtZCh0LGRhdCkgY2hhciB0OyBDSEFSICpkYXQ7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHNjbWQgKi8geworICAgIGludCB4OworICAgIGV4dGVybiBjaGFyICogc3JpbXNnOworICAgIGRlYnVnKEYwMDAsInNjbWQiLGRhdCx0KTsKKyAgICBpZiAoZW5jc3RyKGRhdCkgPCAwKSB7CQkvKiBFbmNvZGUgdGhlIGNvbW1hbmQgc3RyaW5nICovCisJc3JpbXNnID0gIlN0cmluZyB0b28gbG9uZyI7CisJcmV0dXJuKC0xKTsKKyAgICB9CisgICAgeCA9IHNwYWNrKHQscGt0bnVtLHNpemUsZGF0YSk7CisgICAgZGVidWcoRjEwMSwic2NtZCBzcGFjayIsIiIseCk7CisgICAgcmV0dXJuKHgpOworfQorCisvKiBDb21wb3NlIGFuZCBTZW5kIEdFVCBwYWNrZXQgKi8KKworc3RydWN0IG9wa3RwYXJtIHsJCQkvKiBPLVBhY2tldCBpdGVtIGxpc3QgKi8KKyAgICBDSEFSICogb3BrdGl0ZW07CisgICAgc3RydWN0IG9wa3RwYXJtICogb3BrdG5leHQ7Cit9OworCitzdHJ1Y3Qgb3BrdHBhcm0gKiBvcGt0aGVhZCA9IE5VTEw7CS8qIExpbmtlZCBsaXN0IG9mIE8tcGFja2V0IGZpZWxkcyAqLworaW50IG9wa3RjbnQgPSAwOwkJCS8qIE8tUGFja2V0IGNvdW50ZXIgKi8KK2NoYXIgKiBzcmltc2cgPSBOVUxMOwkJCS8qIEdFVC1QYWNrZXQgZXJyb3IgbWVzc2FnZSAqLworCisvKiBTIE8gUCBLIFQgIC0tICBTZW5kIE8tUGFja2V0ICovCisvKgorICBTZW5kcyBvbmUgTy1QYWNrZXQgZWFjaCB0aW1lIGNhbGxlZCwgdXNpbmcgZmlyc3QtZml0IG1ldGhvZCBvZiBmaWxsaW5nCisgIHRoZSBwYWNrZXQgZnJvbSBsaW5rZWQgbGlzdCBvZiBwYXJhbWV0ZXJzIHBvaW50ZWQgdG8gYnkgb3BrdGhlYWQuCisgIFRvIGJlIGNhbGxlZCByZXBlYXRlZGx5IHVudGlsIGxpc3QgaXMgZW1wdHkgb3IgdGhlcmUgaXMgYW4gZXJyb3IuCisgIFJldHVybnM6CisgICAtMSBvbiBmYWlsdXJlLgorICAgIDAgb24gc3VjY2VzcyBhbmQgbm8gbW9yZSBmaWVsZHMgbGVmdCB0byBzZW5kLgorICAgIDEgb24gc3VjY2VzcyBidXQgd2l0aCBtb3JlIGZpZWxkcyBsZWZ0IHRvIGJlIHNlbnQuCisqLworCitpbnQKK3NvcGt0KCkgeworICAgIGludCBuID0gMDsJCQkJLyogRmllbGQgbnVtYmVyIGluIHRoaXMgcGFja2V0ICovCisgICAgaW50IHJjID0gMDsJCQkJLyogUmV0dXJuIGNvZGUgKi8KKyAgICBpbnQgbGVuID0gMDsJCQkvKiBEYXRhIGZpZWxkIGxlbmd0aCAqLworICAgIGNoYXIgYyA9IE5VTDsKKyAgICBzdHJ1Y3Qgb3BrdHBhcm0gKiBvID0gTlVMTDsKKyAgICBzdHJ1Y3Qgb3BrdHBhcm0gKiB0ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgb3BrdHBhcm0gKiBwcmV2ID0gTlVMTDsKKyAgICBDSEFSICogZHNhdmUgPSBkYXRhOworICAgIGludCB4LCBzc2F2ZSA9IHNwc2l6OworCisgICAgc3JpbXNnID0gTlVMTDsJCQkvKiBFcnJvciBtZXNzYWdlICovCisgICAgbyA9IG9wa3RoZWFkOwkJCS8qIFBvaW50IHRvIGhlYWQgb2YgbGlzdCAqLworICAgIGlmICghbykgewkJCQkvKiBPb3BzLCBubyBsaXN0Li4uICovCisJc3JpbXNnID0gIkdFVCBQYWNrZXQgSW50ZXJuYWwgRXJyb3IgMSI7CisJZGVidWcoRjEwMCwic29wa3QgTlVMTCBsaXN0IiwiIiwwKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICB3aGlsZSAobykgewkJCQkvKiBHbyB0aHJ1IGxpbmtlZCBsaXN0Li4uICovCisJYyA9ICooby0+b3BrdGl0ZW0pOwkJLyogUGFyYW1ldGVyIGNvZGUgKi8KKwlkZWJ1ZyhGMDAwLCJzb3BrdCIsby0+b3BrdGl0ZW0sYyk7CisJeCA9IGVuY3N0cigoQ0hBUiAqKW8tPm9wa3RpdGVtKTsKKwlkZWJ1ZyhGMTExLCJzb3BrdCBlbmNzdHIiLGRzYXZlLHgpOworCWlmICh4IDwgMCkgewkJCS8qIEVuY29kZSB0aGlzIGl0ZW0gKi8KKwkgICAgaWYgKG4gPT0gMCkgewkJLyogRmFpbHVyZSwgZmlyc3QgZmllbGQgaW4gcGFja2V0ICovCisJCWRlYnVnKEYxMDAsInNvcGt0IG92ZXJmbG93IiwiIiwwKTsKKwkJc3BzaXogPSBzc2F2ZTsJCS8qIFJlc3RvcmUgdGhlc2UgKi8KKwkJZGF0YSA9IGRzYXZlOworCQlvID0gb3BrdGhlYWQ7CQkvKiBGcmVlIGxpbmtlZCBsaXN0ICovCisJCXdoaWxlIChvKSB7CisJCSAgICBpZiAoby0+b3BrdGl0ZW0pIGZyZWUoby0+b3BrdGl0ZW0pOworCQkgICAgdCA9IG8tPm9wa3RuZXh0OworCQkgICAgZnJlZSgoY2hhciAqKW8pOworCQkgICAgbyA9IHQ7CisJCX0KKwkJb3BrdGhlYWQgPSBOVUxMOworCQlzcmltc2cgPSAiR0VUIFBhY2tldCBUb28gTG9uZyBmb3IgU2VydmVyIjsKKwkJcmV0dXJuKC0xKTsJCS8qIEZhaWwgKi8KKwkgICAgfSBlbHNlIHsJCQkvKiBOb3QgZmlyc3QgZmllbGQgaW4gcGFja2V0ICovCisJCWRlYnVnKEYxMTAsInNvcGt0IGxlZnRvdmVyIixvLT5vcGt0aXRlbSwwKTsKKwkJcHJldiA9IG87CQkvKiBNYWtlIHRoaXMgb25lIHRoZSBuZXcgcHJldmlvdXMgKi8KKwkJbyA9IG8tPm9wa3RuZXh0OwkvKiBHZXQgbmV4dCAqLworCQljID0gTlVMOwkJLyogU28gd2Uga25vdyB3ZSdyZSBub3QgZG9uZSAqLworCQkqZGF0YSA9IE5VTDsJCS8qIEVyYXNlIGFueSBwYXJ0aWFsIGVuY29kaW5nICovCisJCWNvbnRpbnVlOwkJLyogV2UgY2FuIHRyeSB0aGlzIG9uZSBhZ2FpbiBsYXRlciAqLworCSAgICB9CisJfQorCW4rKzsJCQkJLyogRW5jb2Rpbmcgd2FzIHN1Y2Nlc3NmdWwgKi8KKwlkZWJ1ZyhGMTExLCJzb3BrdCBmaWVsZCIsZGF0YSx4KTsKKwlsZW4gKz0geDsJCQkvKiBUb3RhbCBkYXRhIGZpZWxkIGxlbmd0aCAqLworCWRhdGEgKz0geDsJCQkvKiBTZXQgdXAgZm9yIG5leHQgZmllbGQuLi4gKi8KKwlzcHNpeiAtPSB4OworCWZyZWUoby0+b3BrdGl0ZW0pOwkJLyogRnJlZSBpdGVtIGp1c3QgZW5jb2RlZCAqLworCWlmIChvID09IG9wa3RoZWFkKSB7CQkvKiBJZiBoZWFkICovCisJICAgIG9wa3RoZWFkID0gby0+b3BrdG5leHQ7CS8qIE1vdmUgaGVhZCB0byBuZXh0ICovCisJICAgIGZyZWUoKGNoYXIgKilvKTsJCS8qIEZyZWUgdGhpcyBsaXN0IG5vZGUgKi8KKwkgICAgbyA9IG9wa3RoZWFkOworCX0gZWxzZSB7CQkJLyogSWYgbm90IGhlYWQgKi8KKwkgICAgbyA9IG8tPm9wa3RuZXh0OwkJLyogR2V0IG5leHQgKi8KKwkgICAgcHJldi0+b3BrdG5leHQgPSBvOwkJLyogTGluayBwcmV2aW91cyB0byBuZXh0ICovCisJfQorCWlmIChjID09ICdAJykJCQkvKiBMb29wIGV4aXQgKi8KKwkgIGJyZWFrOworCWlmICghbyAmJiAhb3BrdGhlYWQpIHsJCS8qIFNldCB1cCBFbmQgT2YgUGFyYW1ldGVycyBGaWVsZCAqLworCSAgICBvID0gKHN0cnVjdCBvcGt0cGFybSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IG9wa3RwYXJtKSk7CisJICAgIGlmIChvKSB7CisJCW9wa3RoZWFkID0gbzsKKwkJaWYgKCEoby0+b3BrdGl0ZW0gPSAoQ0hBUiAqKW1hbGxvYygzKSkpIHsKKwkJICAgIGZyZWUoKGNoYXIgKilvKTsKKwkJICAgIHNyaW1zZyA9ICJHRVQgUGFja2V0IEludGVybmFsIEVycm9yIDgiOworCQkgICAgcmV0dXJuKC0xKTsKKwkJfQorCQlja3N0cm5jcHkoKGNoYXIgKikoby0+b3BrdGl0ZW0pLCAiQCAiLCAzKTsKKwkJZGVidWcoRjExMSwic29wa3Qgby0+b3BrdGl0ZW0iLG8tPm9wa3RpdGVtLAorCQkgICAgICBzdHJsZW4oKGNoYXIgKikoby0+b3BrdGl0ZW0pKSk7CisJCW8tPm9wa3RuZXh0ID0gTlVMTDsKKwkgICAgfQorCX0KKyAgICB9CisgICAgZGF0YSA9IGRzYXZlOwkJCS8qIFJlc3RvcmUgZ2xvYmFscyAqLworICAgIHNwc2l6ID0gc3NhdmU7CisgICAgZGVidWcoRjExMCwic29wa3QgZGF0YSIsZGF0YSwwKTsKKyAgICBkZWJ1ZyhGMTAxLCJzb3BrdCBvcGt0Y250IiwiIixvcGt0Y250KTsKKyAgICBpZiAob3BrdGNudCsrID4gMCkgeworCWlmIChueHRwa3QoKSA8IDApIHsJCS8qIEdldCBuZXh0IHBhY2tldCBudW1iZXIgYW5kIGJ1ZmZlciAqLworCSAgICBzcmltc2cgPSAiR0VUIFBhY2tldCBJbnRlcm5hbCBFcnJvciA5IjsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisgICAgfQorICAgIGRlYnVnKEYxMDEsInNvcGt0IHBrdG51bSIsIiIscGt0bnVtKTsKKyAgICByYyA9IHNwYWNrKChjaGFyKSdPJyxwa3RudW0sbGVuLGRhdGEpOyAvKiBTZW5kIE8tUGFja2V0ICovCisgICAgZGVidWcoRjEwMSwic29wa3Qgc3BhY2siLCIiLHJjKTsKKyAgICBpZiAocmMgPCAwKQkJCQkvKiBGYWlsZWQgKi8KKyAgICAgIHNyaW1zZyA9ICJTZW5kIFBhY2tldCBGYWlsdXJlIjsJLyogU2V0IG1lc3NhZ2UgKi8KKyAgICBlbHNlCQkJCS8qIFN1Y2NlZWRlZCAqLworICAgICAgcmMgPSAoYyA9PSAnQCcpID8gMCA6IDE7CQkvKiAxID0gY29tZSBiYWNrIGZvciBtb3JlLCAwID0gZG9uZSAqLworICAgIGRlYnVnKEYxMDEsInNvcGt0IHJjIiwiIixyYyk7CisgICAgcmV0dXJuKHJjKTsKK30KKworLyogUyBSIEkgTiBJIFQgIC0tICBTZW5kIEdFVCBwYWNrZXQgICovCisvKgorICBTZW5kcyB0aGUgYXBwcm9wcmlhdGUgR0VULUNsYXNzIHBhY2tldC4KKyAgUmV0dXJuczoKKyAgLTEgb24gZXJyb3IKKyAgIDAgaWYgcGFja2V0IHNlbnQgc3VjY2Vzc2Z1bGx5IGFuZCB3ZSBjYW4gbW92ZSBvbiB0byB0aGUgbmV4dCBzdGF0ZQorICAgMSBpZiBhbiBPLXBhY2tldCB3YXMgc2VudCBPSyBidXQgbW9yZSBPIHBhY2tldHMgc3RpbGwgbmVlZCB0byBiZSBzZW50LgorKi8KK2ludAorc3Jpbml0KHJlZ2V0LCByZXRyaWV2ZSwgb3BrdCkgaW50IHJlZ2V0LCByZXRyaWV2ZSwgb3BrdDsgeworICAgIGludCB4ID0gMCwgbGVmdCA9IDA7CisgICAgZXh0ZXJuIGludCBvb3B0cywgb21vZGU7CisgICAgQ0hBUiAqIHAgPSBOVUxMOworI2lmZGVmIFJFQ1VSU0lWRQorICAgIGV4dGVybiBpbnQgcmVjdXJzaXZlOworICAgIGRlYnVnKEYxMDEsInNyaW5pdCByZWN1cnNpdmUiLCIiLHJlY3Vyc2l2ZSk7CisjZW5kaWYgLyogUkVDVVJTSVZFICovCisgICAgZGVidWcoRjEwMSwic3Jpbml0IHJlZ2V0IiwiIixyZWdldCk7CisgICAgZGVidWcoRjEwMSwic3Jpbml0IHJldHJpZXZlIiwiIixyZXRyaWV2ZSk7CisgICAgZGVidWcoRjEwMSwic3Jpbml0IG9wa3QiLCIiLG9wa3QpOworICAgIGRlYnVnKEYxMDEsInNyaW5pdCBvb3B0cyIsIiIsb29wdHMpOworICAgIGRlYnVnKEYxMDEsInNyaW5pdCBvbW9kZSIsIiIsb21vZGUpOworICAgIGRlYnVnKEYxMTAsInNyaW5pdCBjbWFyZyIsY21hcmcsMCk7CisgICAgc3JpbXNnID0gTlVMTDsKKworICAgIG9wa3RjbnQgPSAwOworICAgIGlmICghY21hcmcpIGNtYXJnID0gIiI7CisgICAgaWYgKCEqY21hcmcpIHsKKwlzcmltc2cgPSAiR0VUIHdpdGggbm8gZmlsZW5hbWUiOworCWRlYnVnKEYxMDAsInNyaW5pdCBudWxsIGNtYXJnIiwiIiwwKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICBpZiAob3BrdCkgewkJCQkvKiBFeHRlbmRlZCBHRVQgaXMgdG90YWxseSBkaWZmZXJlbnQgKi8KKwljaGFyIGJ1ZlsxNl07CisJc3RydWN0IG9wa3RwYXJtICogbyA9IE5VTEw7CisJc3RydWN0IG9wa3RwYXJtICogcHJldiA9IE5VTEw7CisKKyAgICAgICAgYnVmWzBdID0gTlVMOworCisJLyogQnVpbGQgTy1QYWNrZXQgZmllbGRzIGFuZCBzZW5kIChwZXJoYXBzIGZpcnN0KSBPLVBhY2tldCAqLworCisJaWYgKG9vcHRzID4gLTEpIHsJCS8qIFdyaXRlIE9wdGlvbiBmbGFncyAqLworCSAgICBvID0gKHN0cnVjdCBvcGt0cGFybSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IG9wa3RwYXJtKSk7CisJICAgIGlmICghbykgeworCQlzcmltc2cgPSAiR0VUIFBhY2tldCBJbnRlcm5hbCBFcnJvciAyIjsKKwkJZGVidWcoRjEwMCwic3Jpbml0IG1hbGxvYyBmYWlsIE8xIiwiIiwwKTsKKwkJcmV0dXJuKC0xKTsKKwkgICAgfQorCSAgICBzcHJpbnRmKGJ1ZiwiT3glZCIsb29wdHMpOwkvKiBzYWZlICovCisJICAgIHggPSAoaW50KSBzdHJsZW4oYnVmKzIpOworCSAgICBidWZbMV0gPSB0b2NoYXIoeCk7CisJICAgIG8tPm9wa3RpdGVtID0gKENIQVIgKiltYWxsb2MoeCArIDMpOworCSAgICBpZiAoIW8tPm9wa3RpdGVtKSB7CisJCXNyaW1zZyA9ICJHRVQgUGFja2V0IEludGVybmFsIEVycm9yIDMiOworCQlkZWJ1ZyhGMTAwLCJzcmluaXQgbWFsbG9jIGZhaWwgTzIiLCIiLDApOworCQlyZXR1cm4oLTEpOworCSAgICB9CisJICAgIGNrc3RybmNweSgoY2hhciAqKShvLT5vcGt0aXRlbSksYnVmLHgrMyk7CisJICAgIG8tPm9wa3RuZXh0ID0gTlVMTDsKKwkgICAgaWYgKCFvcGt0aGVhZCkKKwkgICAgICBvcGt0aGVhZCA9IG87CisJICAgIHByZXYgPSBvOworCX0KKwlpZiAob21vZGUgPiAtMSkgewkJLyogSWYgWGZlciBNb2RlIHNwZWNpZmllZCwgd3JpdGUgaXQgKi8KKwkgICAgbyA9IChzdHJ1Y3Qgb3BrdHBhcm0gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcGt0cGFybSkpOworCSAgICBpZiAoIW8pIHsKKwkJc3JpbXNnID0gIkdFVCBQYWNrZXQgSW50ZXJuYWwgRXJyb3IgNCI7CisJCWRlYnVnKEYxMDAsInNyaW5pdCBtYWxsb2MgZmFpbCBNMSIsIiIsMCk7CisJCXJldHVybigtMSk7CisJICAgIH0KKwkgICAgc3ByaW50ZihidWYsIk14JWQiLG9tb2RlKTsJLyogc2FmZSAqLworCSAgICB4ID0gKGludCkgc3RybGVuKGJ1ZisyKTsKKwkgICAgYnVmWzFdID0gdG9jaGFyKHgpOworCSAgICBvLT5vcGt0aXRlbSA9IChDSEFSICopbWFsbG9jKHggKyAzKTsKKwkgICAgaWYgKCFvLT5vcGt0aXRlbSkgeworCQlzcmltc2cgPSAiR0VUIFBhY2tldCBJbnRlcm5hbCBFcnJvciA1IjsKKwkJZGVidWcoRjEwMCwic3Jpbml0IG1hbGxvYyBmYWlsIE8yIiwiIiwwKTsKKwkJcmV0dXJuKC0xKTsKKwkgICAgfQorCSAgICBja3N0cm5jcHkoKGNoYXIgKikoby0+b3BrdGl0ZW0pLGJ1Zix4KzMpOworCSAgICBvLT5vcGt0bmV4dCA9IE5VTEw7CisJICAgIGlmICghb3BrdGhlYWQpCisJICAgICAgb3BrdGhlYWQgPSBvOworCSAgICBlbHNlCisJICAgICAgcHJldi0+b3BrdG5leHQgPSBvOworCSAgICBwcmV2ID0gbzsKKwl9CisKKwkvKiBTYW1lIGRlYWwgZm9yIG9uYW1lIGFuZCBvcGF0aCBldmVudHVhbGx5IGJ1dCBub3QgbmVlZGVkIG5vdy4uLiAqLworCisJeCA9IHN0cmxlbihjbWFyZyk7CQkvKiBOb3cgZG8gZmlsZW5hbWUgKi8KKwlpZiAoeCA+IHNwc2l6IC0gNCkgeworCSAgICBzcmltc2cgPSAiR0VUIFBhY2tldCBUb28gTG9uZyBmb3IgU2VydmVyIjsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisJbyA9IChzdHJ1Y3Qgb3BrdHBhcm0gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcGt0cGFybSkpOworCWlmICghbykgeworCSAgICBzcmltc2cgPSAiR0VUIFBhY2tldCBJbnRlcm5hbCBFcnJvciA2IjsKKwkgICAgZGVidWcoRjEwMCwic3Jpbml0IG1hbGxvYyBmYWlsIEYxIiwiIiwwKTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisJbGVmdCA9IHggKyA2OworCW8tPm9wa3RpdGVtID0gKENIQVIgKiltYWxsb2MobGVmdCArIDEpOworCWlmICghby0+b3BrdGl0ZW0pIHsKKwkgICAgc3JpbXNnID0gIkdFVCBQYWNrZXQgSW50ZXJuYWwgRXJyb3IgNyI7CisJICAgIGRlYnVnKEYxMDAsInNyaW5pdCBtYWxsb2MgZmFpbCBGMiIsIiIsMCk7CisJICAgIHJldHVybigtMSk7CisJfQorCXAgPSBvLT5vcGt0aXRlbTsKKwkqcCsrID0gJ0YnOworCWxlZnQtLTsKKwlpZiAoeCA+IDk0KSB7CQkJLyogVG9vIGxvbmcgZm9yIG5vcm1hbCBsZW5ndGggKi8KKwkgICAgKnArKyA9IFNZTjsJCQkvKiBFc2NhcGUgbGVuZ3RoIHdpdGggQ3RybC1WICovCisJICAgICpwKysgPSB0b2NoYXIoeCAvIDk1KTsKKwkgICAgKnArKyA9IHRvY2hhcih4ICUgOTUpOworCSAgICBsZWZ0IC09IDM7CisJfSBlbHNlIHsJCQkvKiBOb3JtYWwgZW5jb2RpbmcgZm9yIDk0IG9yIGxlc3MgKi8KKwkgICAgKnArKyA9IHRvY2hhcih4KTsKKwkgICAgbGVmdC0tOworCX0KKwlja3N0cm5jcHkoKGNoYXIgKilwLGNtYXJnLGxlZnQpOyAvKiBDb3B5IHRoZSBmaWxlbmFtZSAqLworCW8tPm9wa3RuZXh0ID0gTlVMTDsKKwlpZiAoIW9wa3RoZWFkKQorCSAgb3BrdGhlYWQgPSBvOworCWVsc2UKKwkgIHByZXYtPm9wa3RuZXh0ID0gbzsKKwlwcmV2ID0gbzsKKworCS8qIEVuZCBvZiBQYXJhbWV0ZXJzICovCisKKwlwcmV2LT5vcGt0bmV4dCA9IE5VTEw7CQkvKiBFbmQgb2YgbGlzdC4gKi8KKwlyZXR1cm4oc29wa3QoKSk7CisgICAgfQorCisgICAgLyogTm90IEV4dGVuZGVkIEdFVCAqLworCisgICAgaWYgKGVuY3N0cigoQ0hBUiAqKWNtYXJnKSA8IDApIHsJLyogRW5jb2RlIHRoZSBmaWxlbmFtZS4gKi8KKwlzcmltc2cgPSAiR0VUIFBhY2tldCBUb28gTG9uZyBmb3IgU2VydmVyIjsKKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICBpZiAocmV0cmlldmUpIHsJCQkvKiBTZW5kIHRoZSBwYWNrZXQuICovCisjaWZkZWYgUkVDVVJTSVZFCisJaWYgKHJlY3Vyc2l2ZSkKKwkgIHggPSBzcGFjaygoY2hhciknVycscGt0bnVtLHNpemUsZGF0YSk7IC8qIEdFVCAvREVMRVRFIC9SRUNVUlNJVkUgKi8KKwllbHNlCisjZW5kaWYgLyogUkVDVVJTSVZFICovCisJICB4ID0gc3BhY2soKGNoYXIpJ0gnLHBrdG51bSxzaXplLGRhdGEpOyAvKiBHRVQgL0RFTEVURSAqLworICAgIH0KKyNpZmRlZiBSRUNVUlNJVkUKKyAgICBlbHNlIGlmIChyZWN1cnNpdmUpCisgICAgICB4ID0gc3BhY2soKGNoYXIpJ1YnLHBrdG51bSxzaXplLGRhdGEpOyAvKiBHRVQgL1JFQ1VSU0lWRSAqLworI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworICAgIGVsc2UKKyAgICAgIHggPSBzcGFjaygoY2hhcikocmVnZXQgPyAnSicgOiAnUicpLHBrdG51bSxzaXplLGRhdGEpOyAvKiBHRVQgKi8KKyAgICBpZiAoeCA8IDApCisgICAgICBzcmltc2cgPSAiU2VuZCBQYWNrZXQgRmFpbHVyZSI7CisgICAgcmV0dXJuKHggPCAwID8geCA6IDApOworfQorCisKKy8qICBLIFMgVCBBIFIgVCAgLS0gIENoZWNrcyBmb3IgYSBLZXJtaXQgcGFja2V0IHdoaWxlIGluIHRlcm1pbmFsIG1vZGUuICAqLworCisvKiAgKG9yIGNvbW1hbmQgbW9kZS4uLikgICovCisKKyNpZmRlZiBDS19BVVRPREwKK2ludAorI2lmZGVmIENLX0FOU0lDCitrc3RhcnQoQ0hBUiBjaCkKKyNlbHNlCitrc3RhcnQoY2gpIENIQVIgY2g7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGtzdGFydCAqLyB7CisgICAgc3RhdGljIENIQVIgKiBwID0gTlVMTDsKKworI2lmZGVmIE9TMgorICAgIHN0YXRpYyBDSEFSICogcGsgPSBOVUxMOworI2VuZGlmIC8qIE9TMiAqLworICAgIGNoICY9IDAxNzc7CQkJCS8qIFN0cmlwIDh0aCBiaXQgKi8KKworICAgIC8qIEJlY2F1c2Ugd2UncmUgaW4gY29va2VkIG1vZGUgYXQgdGhlIGNvbW1hbmQgcHJvbXB0Li4uICovCisKKyAgICBpZiAoY2ggPT0gTEYpIHsKKwlkZWJ1ZyhGMTEwLCJrc3RhcnQiLCJjaCA9PSBMRiIsMCk7CisJaWYgKCh3aGF0ID09IFdfQ09NTUFORCB8fCB3aGF0ID09IFdfSU5JVCB8fCB3aGF0ID09IFdfTk9USElORykpIHsKKwkgICAgaWYgKGVvbCA9PSBDUikgeworCQljaCA9IGVvbDsKKwkJZGVidWcoRjExMCwia3N0YXJ0IiwiY2ggPSBDUiIsMCk7CisJICAgIH0KKwl9CisgICAgfQorCisjaWZkZWYgT1MyCisgICAgaWYgKGFkbF9rbW9kZSA9PSBBRExfU1RSKSB7CisJaWYgKCFjaCkKKwkgIHJldHVybigwKTsKKwlpZiAoIXBrKQorCSAgcGsgPSBhZGxfa3N0cjsKKworCWlmIChjaCA9PSAqcGspIHsKKwkgICAgcGsrKzsKKwkgICAgaWYgKCpwayA9PSAnXDAnKSB7CisJCXBrID0gYWRsX2tzdHI7CisJCWRlYnVnKEYxMDAsICJrc3RhcnQgS2VybWl0IFN0YXJ0IFN0cmluZyIsIiIsMCk7CisJCXJldHVybihQUk9UT19LICsgMSk7CisJICAgIH0KKwl9IGVsc2UKKwkgIHBrID0gYWRsX2tzdHI7CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworCisgICAgaWYgKGNoID09IHN0Y2hyKSB7CQkJLyogU3RhcnQgb2YgcGFja2V0ICovCisJa3N0YXJ0YWN0aXZlID0gMTsKKwlwID0ga3NidWY7CisJKnAgPSBjaDsKKwlkZWJ1ZyhGMTAxLCJrc3RhcnQgU09QIiwiIixjaCk7CisgICAgfSBlbHNlIGlmIChjaCA9PSBlb2wpIHsJCS8qIEVuZCBvZiBwYWNrZXQgKi8KKwlrc3RhcnRhY3RpdmUgPSAwOworCWlmIChwKSB7CisJICAgIGRlYnVnKEYxMDEsImtzdGFydCBFT0wiLCIiLGNoKTsKKwkgICAgcCsrOworCSAgICBpZiAocCAtIGtzYnVmIDwgOTQgKSB7CisJCWludCByYyA9IDA7CisJCSpwKysgPSBjaDsKKwkJKnAgPSBOVUw7CisJCXJjID0gY2hrc3BrdCgoY2hhciAqKWtzYnVmKTsKKwkJZGVidWcoRjExMSwia3N0YXJ0IEVPUCBjaGtzcGt0Iiwga3NidWYsIHJjKTsKKwkJcCA9IE5VTEw7CisJCWlmICghcmMpIHJldHVybigwKTsKKwkJaWYgKHJjID09IDIpIHJjID0gLTE7CisJCWRlYnVnKEYxMTEsImtzdGFydCBrc2J1ZiIsa3NidWYscmMpOworCQlyZXR1cm4ocmMpOworCSAgICB9IGVsc2UgeworCQlkZWJ1ZyhGMTEwLCJrc3RhcnQiLCJwIC0ga3NidWYgPj0gOTQiLDApOworCQlwID0gTlVMTDsKKwkgICAgfQorCX0KKyAgICB9IGVsc2UgaWYgKHApIHsKKwlpZiAoY2ggPCBTUCkKKwkgIGtzdGFydGFjdGl2ZSA9IDA7CisJcCsrOworCWlmIChwIC0ga3NidWYgPCA5NCkgeworCSAgICAqcCA9IGNoOworCX0gZWxzZSB7CisJICAgIHAgPSBOVUxMOworCSAgICBkZWJ1ZyhGMTEwLCJrc3RhcnQiLCJwIC0ga3NidWYgPj0gOTQiLDApOworCX0KKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisjaWZkZWYgQ0tfWFlaCisKKy8qICBaIFMgVCBBIFIgVCAgLS0gIENoZWNrcyBmb3IgYSBaTU9ERU0gcGFja2V0IHdoaWxlIGluIHRlcm1pbmFsIG1vZGUuICAqLworCitpbnQKKyNpZmRlZiBDS19BTlNJQworenN0YXJ0KENIQVIgY2gpCisjZWxzZQorenN0YXJ0KGNoKSBDSEFSIGNoOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB6c3RhcnQgKi8geworICAgIHN0YXRpYyBDSEFSICogbWF0Y2hzdHIgPSAoQ0hBUiAqKSAiXDAzMEIwMCI7CisgICAgLyogInJ6XHIqKlwwMzBCMDAwMDAwMDAwMDAwMDBcclwwMzNKXDAyMSI7ICovCisgICAgc3RhdGljIENIQVIgKiBwID0gTlVMTDsKKyAgICBleHRlcm4gaW50IGluc2VydmVyOworCisgICAgaWYgKGluc2VydmVyKQorICAgICAgcmV0dXJuKDApOworCisgICAgaWYgKCFjaCkKKyAgICAgIHJldHVybigwKTsKKyAgICBpZiAoIXApIHsKKyNpZmRlZiBPUzIKKwlwID0gYWRsX3ptb2RlID09IEFETF9QQUNLID8gbWF0Y2hzdHIgOiBhZGxfenN0cjsKKyNlbHNlCisJcCA9IG1hdGNoc3RyOworI2VuZGlmIC8qIE9TMiAqLworICAgIH0KKyAgICBpZiAoY2ggPT0gKnApIHsKKwlwKys7CisJaWYgKCpwID09ICdcMCcpIHsKKyNpZmRlZiBPUzIKKwkgICAgaWYgKGFkbF96bW9kZSA9PSBBRExfUEFDSykgeworCQlwID0gbWF0Y2hzdHI7CisJCWRlYnVnKEYxMDAsICJ6c3RhcnQgWm1vZGVtIFNPUCIsIiIsMCk7CisJICAgIH0gZWxzZSB7CisJCXAgPSBhZGxfenN0cjsKKwkJZGVidWcoRjEwMCwgInpzdGFydCBabW9kZW0gU3RhcnQgU3RyaW5nIiwiIiwwKTsKKwkgICAgfQorI2Vsc2UKKwkgICAgcCA9IG1hdGNoc3RyOworCSAgICBkZWJ1ZyhGMTAwLCAienN0YXJ0IFptb2RlbSBTT1AiLCIiLDApOworI2VuZGlmIC8qIE9TMiAqLworCSAgICByZXR1cm4oUFJPVE9fWiArIDEpOworCX0KKyAgICB9IGVsc2UgeworI2lmZGVmIE9TMgorCXAgPSBhZGxfem1vZGUgPT0gQURMX1BBQ0sgPyBtYXRjaHN0ciA6IGFkbF96c3RyOworI2Vsc2UKKwlwID0gbWF0Y2hzdHI7CisjZW5kaWYgLyogT1MyICovCisgICAgfQorICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBDS19YWVogKi8KKworI2lmbmRlZiBOT0lDUAorI2lmZGVmIENLX0FQQworLyogIEEgVSBUIE8gRCBPIFcgTiAgKi8KKworI2lmZGVmIENLX0FOU0lDCitWT0lECithdXRvZG93bihpbnQgY2gpCisjZWxzZQorVk9JRAorYXV0b2Rvd24oY2gpIGludCBjaDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogYXV0b2Rvd24gKi8geworCisvKiBUaGUgS2VybWl0IGFuZCBabW9kZW0gQXV0by1kb3dubG9hZCBjYWxscyBnbyBoZXJlICovCisKKyAgICBleHRlcm4gaW50IGp1c3RvbmU7CQkJLyogRnJvbSBwcm90b2NvbCBtb2R1bGUgKi8KKyAgICBleHRlcm4gaW50IGRlYnNlcywgcHJvdG9jb2wsIGFwY2FjdGl2ZSwgYXV0b2RsLCBpbmF1dG9kbDsKKyNpZmRlZiBEQ01EQlVGCisgICAgZXh0ZXJuIGNoYXIgKmFwY2J1ZjsKKyNlbHNlCisgICAgZXh0ZXJuIGNoYXIgYXBjYnVmW107CisjZW5kaWYgLyogRENNREJVRiAqLworI2lmZGVmIE9TMgorICAgIGV4dGVybiBpbnQgYXBjbGVuZ3RoLCB0ZXJtX2lvOworI2VuZGlmIC8qIE9TMiAqLworICAgIGludCBrID0gMDsKKworICAgIGlmICgoYXV0b2RsIHx8IGluYXV0b2RsCisjaWZkZWYgSUtTX09QVElPTgorCSB8fCBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCSApICYmICFkZWJzZXMpIHsKKyNpZmRlZiBDS19YWVoKKyNpZmRlZiBYWVpfSU5URVJOQUwKKwlleHRlcm4gaW50IHBfYXZhaWw7CisjZWxzZQorCWludCBwX2F2YWlsID0gMTsKKyNlbmRpZiAvKiBYWVpfSU5URVJOQUwgKi8KKwlpZiAocF9hdmFpbCAmJiB6c3RhcnQoKENIQVIpIGNoKSkgeworCSAgICBkZWJ1ZyhGMTAwLCAiWm1vZGVtIGRvd25sb2FkIiwiIiwwKTsKKyNpZmRlZiBPUzIKKyNpZm5kZWYgTk9URVJNCisgICAgICAgICAgICBhcGNfY29tbWFuZChBUENfTE9DQUwsInJlY2VpdmUgL3Byb3RvY29sOnptb2RlbSIpOworI2VuZGlmIC8qIE5PVEVSTSAqLworI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgICBja3N0cm5jcHkoYXBjYnVmLCJyZWNlaXZlIC9wcm90b2NvbDp6bW9kZW0iLEFQQ0JVRkxFTik7CisJICAgIGFwY2FjdGl2ZSA9IEFQQ19MT0NBTDsKKyNlbmRpZiAvKiBPUzIgKi8KKwkgICAgcmV0dXJuOworCX0KKyNlbmRpZiAvKiBDS19YWVogKi8KKworCS8qIEZpcnN0IHRyeS4uLiAqLworCWsgPSBrc3RhcnQoKENIQVIpIGNoKTsKKwlpZiAoCisjaWZkZWYgTk9TRVJWRVIKKwkgICAgayA+IDAKKyNlbHNlIC8qIE5PU0VSVkVSICovCisJICAgIGsKKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworCSAgICApIHsJCQkJLyogV2Ugc2F3IGEgdmFsaWQgUyBvciBJIHBhY2tldCAqLworCSAgICBpZiAoayA8IDApIHsJCS8qIFN0dWZmIFJFQ0VJVkUgaW50byBBUEMgYnVmZmVyICovCisJCWp1c3RvbmUgPSAxOworCQlzd2l0Y2ggKHByb3RvY29sKSB7CisjaWZkZWYgQ0tfWFlaCisJCSAgY2FzZSBQUk9UT19HOgorCQkgICAgY2tzdHJuY3B5KGFwY2J1ZiwKKwkJCSAgICAgICJzZXQgcHJvdG8ga2VybWl0LCBzZXJ2ZXIsIHNldCBwcm90b2NvbCBnIiwKKwkJCSAgICAgIEFQQ0JVRkxFTgorCQkJICAgICAgKTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgUFJPVE9fWDoKKwkJICAgIGNrc3RybmNweShhcGNidWYsCisJCQkgICAgICAic2V0IHByb3RvIGtlcm1pdCxzZXJ2ZXIsc2V0IHByb3RvIHhtb2RlbSIsCisJCQkgICAgICBBUENCVUZMRU4KKwkJCSAgICAgICk7CisJCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgUFJPVE9fWEM6CisJCSAgICBja3N0cm5jcHkoYXBjYnVmLAorCQkJICAgInNldCBwcm90byBrZXJtaXQsc2VydmVyLHNldCBwcm90byB4bW9kZW0tY3JjIiwKKwkJCSAgICAgIEFQQ0JVRkxFTgorCQkJICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJICBjYXNlIFBST1RPX1k6CisJCSAgICBja3N0cm5jcHkoYXBjYnVmLAorCQkJICAgICAgInNldCBwcm90byBrZXJtaXQsc2VydmVyLCBzZXQgcHJvdG9jb2wgeSIsCisJCQkgICAgICBBUENCVUZMRU4KKwkJCSAgICAgICk7CisJCSAgICBicmVhazsKKwkJICBjYXNlIFBST1RPX1o6CisJCSAgICBja3N0cm5jcHkoYXBjYnVmLAorCQkJICAgICAgInNldCBwcm90byBrZXJtaXQsc2VydmVyLHNldCBwcm90byB6bW9kZW0iLAorCQkJICAgICAgQVBDQlVGTEVOCisJCQkgICAgICApOworCQkgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfWFlaICovCisJCSAgY2FzZSBQUk9UT19LOgorCQkgICAgY2tzdHJuY3B5KGFwY2J1Ziwic2VydmVyIixBUENCVUZMRU4pOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJanVzdG9uZSA9IDA7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGFwY2J1ZiwicmVjZWl2ZSAvcHJvdG9jb2w6a2VybWl0IixBUENCVUZMRU4pOworCSAgICB9CisjaWZkZWYgT1MyCisjaWZuZGVmIE5PVEVSTQorICAgICAgICAgICAgYXBjX2NvbW1hbmQoQVBDX0xPQ0FMLGFwY2J1Zik7CisjZW5kaWYgLyogTk9URVJNICovCisjZWxzZSAvKiBPUzIgKi8KKyAgICAgICAgICAgIGNrc3RybmNweShhcGNidWYsInJlY2VpdmUgL3Byb3RvY29sOnptb2RlbSIsQVBDQlVGTEVOKTsKKwkgICAgYXBjYWN0aXZlID0gQVBDX0xPQ0FMOworI2VuZGlmIC8qIE9TMiAqLworCSAgICByZXR1cm47CisJfQorICAgIH0KK30KKyNlbmRpZiAvKiBDS19BUEMgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworCisvKiAgQyBIIEsgUyBQIEsgVCAgLS0gIENoZWNrIGlmIGJ1ZiBjb250YWlucyBhIHZhbGlkIFMgb3IgSSBwYWNrZXQgICovCisKK2ludAorY2hrc3BrdChidWYpIGNoYXIgKmJ1ZjsgeworICAgIGludCBidWZsZW47CisgICAgaW50IGxlbiA9IC0xOworICAgIENIQVIgY2hrOworICAgIGNoYXIgdHlwZSA9IDA7CisgICAgY2hhciAqcyA9IGJ1ZjsKKworICAgIGlmICghYnVmKSByZXR1cm4oMCk7CisgICAgYnVmbGVuID0gc3RybGVuKGJ1Zik7CisgICAgaWYgKGJ1ZmxlbiA8IDUpIHJldHVybigwKTsJCS8qIFRvbyBzaG9ydCAqLworICAgIGlmICgqcysrICE9IHN0Y2hyKSByZXR1cm4oMCk7CS8qIFNPSCAqLworICAgIGxlbiA9IHh1bmNoYXIoKnMrKyk7CQkvKiBMZW5ndGggKi8KKyAgICBpZiAobGVuIDwgMCkgcmV0dXJuKDApOworICAgIGlmICgqcysrICE9IFNQKSByZXR1cm4oMCk7CQkvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB0eXBlID0gKnMrKzsJCQkvKiBUeXBlICovCisgICAgaWYgKHR5cGUgIT0gJ1MnICYmIHR5cGUgIT0gJ0knKQorICAgICAgcmV0dXJuKDApOworICAgIGlmIChidWZsZW4gPCBsZW4gKyAyKSByZXR1cm4oMCk7CisgICAgcyArPSAobGVuIC0gMyk7CQkJLyogUG9zaXRpb24gb2YgY2hlY2tzdW0gKi8KKyAgICBjaGsgPSAoQ0hBUikgKCpzKTsJCQkvKiBDaGVja3N1bSAqLworICAgICpzID0gTlVMOworICAgIGlmICh4dW5jaGFyKGNoaykgIT0gY2hrMSgoQ0hBUiAqKShidWYrMSksYnVmbGVuLTIpKSAvKiBDaGVjayBpdCAqLworICAgICAgcmV0dXJuKDApOworICAgICpzID0gY2hrOworICAgIHJldHVybih0eXBlID09ICdTJyA/IDEgOiAyKTsKK30KKyNlbmRpZiAvKiBDS19BVVRPREwgKi8KKworLyogUiBQIEEgQyBLICAtLSAgUmVhZCBhIFBhY2tldCAqLworCisvKgorICBycGFjayByZWFkcyBhIHBhY2tldCBhbmQgcmV0dXJucyB0aGUgcGFja2V0IHR5cGUsIG9yIGVsc2UgUSBpZiB0aGUKKyAgcGFja2V0IHdhcyBpbnZhbGlkLCBvciBUIGlmIGEgdGltZW91dCBvY2N1cnJlZC4gIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4sCisgIHNldHMgdGhlIHZhbHVlcyBvZiBnbG9iYWwgcnNuIChyZWNlaXZlZCBzZXF1ZW5jZSBudW1iZXIpLCAgcmxuIChyZWNlaXZlZAorICBkYXRhIGxlbmd0aCksIGFuZCByZGF0YXAgKHBvaW50ZXIgdG8gbnVsbC10ZXJtaW5hdGVkIGRhdGEgZmllbGQpLCBhbmQKKyAgcmV0dXJucyB0aGUgcGFja2V0IHR5cGUuICBOT1RFOiBUaGlzIGlzIGFuIGlubmVyLWxvb3AgZnVuY3Rpb24gc28gbXVzdCBiZQorICBlZmZpY2llbnQuICBQcm90ZWN0IGZ1bmN0aW9uIGNhbGxzIGJ5IGlmLXRlc3RzIHdoZXJlIHBvc3NpYmxlLCBlLmcuCisgICJpZiAocGt0bG9nKSBsb2dwa3QoLi4uKTsiLgorKi8KK2ludAorcnBhY2soKSB7CisgICAgcmVnaXN0ZXIgaW50IGksIGosIHgsIGxwOwkJLyogTG9jYWwgdmFyaWFibGVzICovCisjaWZkZWYgQ0tUVU5JTkcKKyAgICB1bnNpZ25lZCBpbnQgY2hrOworI2VuZGlmIC8qIENLVFVOSU5HICovCisgICAgaW50IGssIHR5cGUsIGNoa2xlbjsKKyAgICB1bnNpZ25lZCBjcmM7CisgICAgQ0hBUiBwYmNbNV07CQkJLyogUGFja2V0IGJsb2NrIGNoZWNrICovCisgICAgQ0hBUiAqc29ocDsJCQkJLyogUG9pbnRlciB0byBTT0ggKi8KKyAgICBDSEFSIGU7CQkJCS8qIFBhY2tldCBlbmQgY2hhcmFjdGVyICovCisKKyNpZmRlZiBHRlRJTUVSCisgICAgQ0tGTE9BVCB0MSA9IDAuMCwgdDIgPSAwLjA7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisgICAgZGVidWcoRjEwMSwicnBhY2sgcGt0bnVtIiwiIixwa3RudW0pOworCisjaWZuZGVmIE9MRENIS0lOVAorICAgIGlmIChjaGtpbnQoKSA8IDApCQkJLyogQ2hlY2sgZm9yIGNvbnNvbGUgaW50ZXJydXB0cy4gKi8KKyAgICAgIHJldHVybigneicpOworI2VuZGlmIC8qIE9MRENIS0lOVCAqLworCisgICAgayA9IGdldHJidWYoKTsJCQkvKiBHZXQgYSBuZXcgcGFja2V0IGlucHV0IGJ1ZmZlci4gKi8KKyAgICBkZWJ1ZyhGMTAxLCJycGFjayBnZXRyYnVmIiwiIixrKTsKKyAgICBpZiAoayA8IDApIHsJCQkvKiBSZXR1cm4gbGlrZSB0aGlzIGlmIG5vbmUgZnJlZS4gKi8KKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICByZWNwa3QgPSByX3BrdFtrXS5iZl9hZHI7CisgICAgKnJlY3BrdCA9ICdcMCc7CQkJLyogQ2xlYXIgcmVjZWl2ZSBidWZmZXIuICovCisgICAgc29ocCA9IHJlY3BrdDsJCQkvKiBJbml0aWFsaXplIHBvaW50ZXJzIHRvIGl0LiAqLworICAgIHJkYXRhcCA9IHJlY3BrdDsKKyAgICByc24gPSBybG4gPSAtMTsJCQkvKiBJbiBjYXNlIG9mIGZhaWx1cmUuICovCisgICAgZSA9ICh0dXJuKSA/IHR1cm5jaCA6IGVvbDsJCS8qIFVzZSBhbnkgaGFuZHNoYWtlIGNoYXIgZm9yIGVvbCAqLworCisvKiBUcnkgdG8gZ2V0IGEgImxpbmUiLiAqLworCisjaWZkZWYgQ0tfQVVUT0RMCisgICAgZGVidWcoRjExMCwicnBhY2sga3NidWYiLGtzYnVmLDApOworICAgIGlmIChrc2J1ZlswXSkgewkJCS8qIEtlcm1pdCBwYWNrZXQgYWxyZWFkeSAqLworCWludCB4OwkJCQkvKiBjb2xsZWN0ZWQgZm9yIHVzIGluIENPTk5FQ1QgbW9kZSAqLworCUNIQVIgKnMxID0gcmVjcGt0LCAqczIgPSBrc2J1ZjsKKwlqID0gMDsKKwl3aGlsZSAoKnMyKSB7CQkJLyogQ29weSBhbmQgZ2V0IGxlbmd0aCAqLworCSAgICAqczErKyA9ICpzMisrOwkJLyogTm8gcG9pbnQgb3B0aW1pemluZyB0aGlzIHNpbmNlICovCisJICAgIGorKzsJCQkvKiBpdCdzIG5ldmVyIG1vcmUgdGhhbiB+MjAgY2hhcnMgKi8KKwl9CisJKnMxID0gTlVMOworI2lmZGVmIFBBUlNFTlNFCisJeCA9IHBhcmNoayhyZWNwa3QsIHN0Y2hyLCBqKTsJLyogQ2hlY2sgcGFyaXR5ICovCisJZGVidWcoRjAwMCwiYXV0b2Rvd25sb2FkIHBhcml0eSIsIiIscGFyaXR5KTsKKwlkZWJ1ZyhGMDAwLCJhdXRvZG93bmxvYWQgcGFyY2hrIiwiIix4KTsKKwlpZiAoeCA+IC0xICYmIHBhcml0eSAhPSB4KSB7CisJICAgIGF1dG9wYXIgPSAxOworCSAgICBwYXJpdHkgPSB4OworCX0KKyNlbmRpZiAvKiBQQVJTRU5TRSAqLworCWtzYnVmWzBdID0gTlVMOwkJCS8qIERvbid0IGRvIHRoaXMgbmV4dCB0aW1lISAqLworCisgICAgfSBlbHNlIHsJCQkJLyogTm9ybWFsbHkgZ28gcmVhZCBhIHBhY2tldCAqLworI2VuZGlmIC8qIENLX0FVVE9ETCAqLworCisjaWZkZWYgREVCVUcKKwlpZiAoZGVibG9nKSB7CisJICAgIGRlYnVnKEYxMDEsInJwYWNrIHRpbWludCIsIiIsdGltaW50KTsKKwkgICAgZGVidWcoRjEwMSwicnBhY2sgcmN2dGltbyIsIiIscmN2dGltbyk7CisjaWZkZWYgU1RSRUFNSU5HCisJICAgIGRlYnVnKEYxMDEsInJwYWNrIHN0cmVhbWluZyIsIiIsc3RyZWFtaW5nKTsKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKyNpZmRlZiBHRlRJTUVSCisJICAgIC8qIE1lYXN1cmUgaG93IGxvbmcgaXQgdGFrZXMgdG8gcmVhZCBhIHBhY2tldCAqLworCSAgICB0MSA9IGdmdGltZXIoKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisJfQorI2VuZGlmIC8qIERFQlVHICovCisKKy8qIEpVU1QgSU4gQ0FTRSAob3RoZXJ3aXNlIHRoaXMgY291bGQgY2xvYmJlciBzdHJlYW1pbmcpICovCisKKwlpZiAoKHRpbWludCA9PSAwCisjaWZkZWYgU1RSRUFNSU5HCisJICAgICB8fCBzdHJlYW1pbmcKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKwkgICAgICkgJiYgKHJjdnRpbW8gIT0gMCkpIHsKKwkgICAgZGVidWcoRjEwMSwicnBhY2sgdGltaW50IDAgfHwgc3RyZWFtaW5nIGJ1dCByY3Z0aW1vIiwiIixyY3Z0aW1vKTsKKwkgICAgcmN2dGltbyA9IDA7CisJfQorCisjaWZkZWYgUEFSU0VOU0UKKyNpZmRlZiBVTklYCisvKgorICBTbyBmYXIgdGhlIGZpbmFsIHR1cm4gYXJndW1lbnQgaXMgb25seSBmb3IgY2tbdXZkbF10aW8uYy4gIFNob3VsZCBiZSBhZGRlZAorICB0byB0aGUgb3RoZXJzIHRvby4gICh0dXJuID09IGhhbmRzaGFrZSBjaGFyYWN0ZXIuKQorKi8KKwlqID0gdHRpbmwocmVjcGt0LHJfcGt0W2tdLmJmX2xlbiAtIDEscmN2dGltbyxlLHN0Y2hyLHR1cm4pOworI2Vsc2UKKyNpZmRlZiBWTVMKKwlqID0gdHRpbmwocmVjcGt0LHJfcGt0W2tdLmJmX2xlbiAtIDEscmN2dGltbyxlLHN0Y2hyLHR1cm4pOworI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorCWogPSB0dGlubChyZWNwa3Qscl9wa3Rba10uYmZfbGVuIC0gMSxyY3Z0aW1vLGUsc3RjaHIsdHVybik7CisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKwlqID0gdHRpbmwocmVjcGt0LHJfcGt0W2tdLmJmX2xlbiAtIDEscmN2dGltbyxlLHN0Y2hyLHR1cm4pOworI2Vsc2UKKyNpZmRlZiBPUzIKKwlqID0gdHRpbmwocmVjcGt0LHJfcGt0W2tdLmJmX2xlbiAtIDEscmN2dGltbyxlLHN0Y2hyLHR1cm4pOworI2Vsc2UKKyNpZmRlZiBPU0sKKwlqID0gdHRpbmwocmVjcGt0LHJfcGt0W2tdLmJmX2xlbiAtIDEscmN2dGltbyxlLHN0Y2hyLHR1cm4pOworI2Vsc2UKKwlqID0gdHRpbmwocmVjcGt0LHJfcGt0W2tdLmJmX2xlbiAtIDEscmN2dGltbyxlLHN0Y2hyKTsKKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisJaWYgKHBhcml0eSAhPSAwICYmIHBhcml0eSAhPSAncycgJiYgdHRwcnR5ICE9IDApIHsKKwkgICAgaWYgKHBhcml0eSAhPSB0dHBydHkpIGF1dG9wYXIgPSAxOworCSAgICBwYXJpdHkgPSB0dHBydHk7CisJfQorI2Vsc2UgLyogIVBBUlNFTlNFICovCisJaiA9IHR0aW5sKHJlY3BrdCxyX3BrdFtrXS5iZl9sZW4gLSAxLHJjdnRpbW8sZSk7CisjZW5kaWYgLyogUEFSU0VOU0UgKi8KKworI2lmZGVmIERFQlVHCisJaWYgKGRlYmxvZykgIHsKKwkgICAgZGVidWcoRjEwMSwicnBhY2sgdHRpbmwgbGVuIiwiIixqKTsKKyNpZmRlZiBHRlRJTUVSCisJICAgIHQyID0gZ2Z0aW1lcigpOworCSAgICBkZWJ1ZyhGMTAxLCJycGFjayB0dGlubCBtc2VjIiwiIiwobG9uZykoKHQyLXQxKSoxMDAwLjApKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisJfQorI2VuZGlmIC8qIERFQlVHICovCisKKyNpZmRlZiBTVFJFQU1JTkcKKyAgICBpZiAoc3RyZWFtaW5nICYmIHNuZHR5cCA9PSAnRCcgJiYgaiA9PSAwKQorICAgICAgICByZXR1cm4oJ1knKTsKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKworCWlmIChqIDwgMCkgeworCSAgICAvKiAtMSA9PSB0aW1lb3V0LCAtMiA9PSBeQywgLTMgPT0gY29ubmVjdGlvbiBsb3N0IG9yIGZhdGFsIGkvbyAqLworCSAgICBkZWJ1ZyhGMTAxLCJycGFjazogdHRpbmwgZmFpbHMiLCIiLGopOyAvKiBPdGhlcndpc2UsICovCisJICAgIGZyZWVyYnVmKGspOwkJLyogRnJlZSB0aGlzIGJ1ZmZlciAqLworCSAgICBpZiAoaiA8IC0xKSB7CQkvKiBCYWlsIG91dCBpZiBeQ15DIHR5cGVkLiAqLworCQlpZiAoaiA9PSAtMikgeworCQkgICAgaW50ZXJydXB0ZWQgPSAxOworCQkgICAgZGVidWcoRjEwMSwicnBhY2sgXkMgc2VydmVyIiwiIixzZXJ2ZXIpOworCQkgICAgZGVidWcoRjEwMSwicnBhY2sgXkMgZW5fZmluIiwiIixlbl9maW4pOworCQl9IGVsc2UgaWYgKGogPT0gLTMpIHsKKwkJICAgIGZhdGFsaW8gPSAxOworCQkgICAgZGVidWcoRjEwMSwicnBhY2sgZmF0YWxpbyIsIiIsZW5fZmluKTsKKwkJfQorCQlyZXR1cm4oaik7CisJICAgIH0KKwkgICAgaWYgKG5ha3N0YXRlKQkJLyogaiA9PSAtMSBpcyBhIHJlYWQgdGltZW91dCAqLworCSAgICAgIHh4c2NyZWVuKFNDUl9QVCwnVCcsKGxvbmcpd2lubG8sIiIpOworCSAgICBlbHNlCisJICAgICAgeHhzY3JlZW4oU0NSX1BULCdUJywobG9uZylwa3RudW0sIiIpOworCSAgICBsb2dwa3QoJ3InLC0xLChDSEFSICopIjx0aW1lb3V0PiIsMCk7CisJICAgIGlmIChmbG93ID09IDEpIHR0b2MoWE9OKTsJLyogSW4gY2FzZSBvZiBYb2ZmIGJsb2NrYWdlLiAqLworCSAgICByZXR1cm4oJ1QnKTsKKwl9CisjaWZkZWYgQ0tfQVVUT0RMCisgICAgfQorI2VuZGlmIC8qIENLX0FVVE9ETCAqLworCisgICAgcnBrdGwgPSBqOworICAgIHRsY2kgKz0gajsJCQkJLyogQWxsIE9LLCBDb3VudCB0aGUgY2hhcmFjdGVycy4gKi8KKyAgICBmbGNpICs9IGo7CisKKy8qIEZpbmQgc3RhcnQgb2YgcGFja2V0ICovCisKKyNpZm5kZWYgUEFSU0VOU0UKKyAgICBmb3IgKGkgPSAwOyAocmVjcGt0W2ldICE9IHN0Y2hyKSAmJiAoaSA8IGopOyBpKyspCisgICAgICBzb2hwKys7CQkJCS8qIEZpbmQgbWFyayAqLworICAgIGlmIChpKysgPj0gaikgewkJCS8qIERpZG4ndCBmaW5kIGl0LiAqLworCWxvZ3BrdCgncicsLTEsIjx0aW1lb3V0PiIsMCk7CisJZnJlZXJidWYoayk7CisJcmV0dXJuKCdUJyk7CisgICAgfQorI2Vsc2UKKyAgICBpID0gMTsJCQkJLyogdHRpbmwgZG9lcyB0aGlzIGZvciB1cyAqLworI2VuZGlmIC8qIFBBUlNFTlNFICovCisKKyAgICBycGFja2V0cysrOwkJCQkvKiBDb3VudCByZWNlaXZlZCBwYWNrZXQuICovCisgICAgbHAgPSBpOwkJCQkvKiBSZW1lbWJlciBMRU4gcG9zaXRpb24uICovCisgICAgaWYgKChqID0geHVuY2hhcihyZWNwa3RbaSsrXSkpID09IDApIHsgLyogR2V0IHBhY2tldCBsZW5ndGguICAqLworICAgICAgICBpZiAoKGogPSBscCs1KSA+IE1BWFJQKSB7CS8qIExvbmcgcGFja2V0ICovCisJICAgIHJldHVybignUScpOwkJLyogVG9vIGxvbmcgKi8KKwl9CisKKyNpZmRlZiBDS1RVTklORworCS8qIFNhdmUgc29tZSBmdW5jdGlvbi1jYWxsIGFuZCBsb29wIG92ZXJoZWFkLi4uICovCisjaWZkZWYgQ09NTUVOVAorCS8qIHR0aW5sKCkgYWxyZWFkeSByZW1vdmVkIHBhcml0eSAqLworCWlmIChwYXJpdHkpCisjZW5kaWYgLyogQ09NTUVOVCAqLworCSAgY2hrID0gKHVuc2lnbmVkKSAoKHVuc2lnbmVkKSByZWNwa3RbaS0xXSArCisJCQkgICAgKHVuc2lnbmVkKSByZWNwa3RbaV0gICArCisJCQkgICAgKHVuc2lnbmVkKSByZWNwa3RbaSsxXSArCisJCQkgICAgKHVuc2lnbmVkKSByZWNwa3RbaSsyXSArCisJCQkgICAgKHVuc2lnbmVkKSByZWNwa3RbaSszXQorCQkJICAgICk7CisjaWZkZWYgQ09NTUVOVAorCWVsc2UKKwkgIGNoayA9ICh1bnNpZ25lZCkgKCh1bnNpZ25lZCkgKHJlY3BrdFtpLTFdICYgMDc3KSArCisJCQkgICAgKHVuc2lnbmVkKSAocmVjcGt0W2ldICAgJiAwNzcpICsKKwkJCSAgICAodW5zaWduZWQpIChyZWNwa3RbaSsxXSAmIDA3NykgKworCQkJICAgICh1bnNpZ25lZCkgKHJlY3BrdFtpKzJdICYgMDc3KSArCisJCQkgICAgKHVuc2lnbmVkKSAocmVjcGt0W2krM10gJiAwNzcpCisJCQkgICAgKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJaWYgKHh1bmNoYXIocmVjcGt0W2pdKSAhPSAoKCgoY2hrICYgMDMwMCkgPj4gNikgKyBjaGspICYgMDc3KSkKKyNlbHNlCisJeCA9IHJlY3BrdFtqXTsJCQkvKiBIZWFkZXIgY2hlY2tzdW0uICovCisJcmVjcGt0W2pdID0gJ1wwJzsJCS8qIENhbGN1bGF0ZSAmIGNvbXBhcmUuICovCisJaWYgKHh1bmNoYXIoeCkgIT0gY2hrMShyZWNwa3QrbHAsNSkpCisjZW5kaWYgLyogQ0tUVU5JTkcgKi8KKwkgIHsKKwkgICAgICBmcmVlcmJ1ZihrKTsKKwkgICAgICBsb2dwa3QoJ3InLC0xLChDSEFSICopIjxjcnVuY2hlZDpoZHI+IiwwKTsKKwkgICAgICB4eHNjcmVlbihTQ1JfUFQsJyUnLChsb25nKXBrdG51bSwiQmFkIHBhY2tldCBoZWFkZXIiKTsKKwkgICAgICByZXR1cm4oJ1EnKTsKKwkgIH0KKyNpZm5kZWYgQ0tUVU5JTkcKKwlyZWNwa3Rbal0gPSB4OwkJCS8qIENoZWNrc3VtIG9rLCBwdXQgaXQgYmFjay4gKi8KKyNlbmRpZiAvKiBDS1RVTklORyAqLworCXJsbiA9IHh1bmNoYXIocmVjcGt0W2otMl0pICogOTUgKyB4dW5jaGFyKHJlY3BrdFtqLTFdKSAtIGJjdGw7CisJaiA9IDM7CQkJCS8qIERhdGEgb2Zmc2V0LiAqLworICAgIH0gZWxzZSBpZiAoaiA8IDMpIHsKKwlkZWJ1ZyhGMTAxLCJycGFjayBwYWNrZXQgbGVuZ3RoIGxlc3MgdGhhbiAzIiwiIixqKTsKKwlmcmVlcmJ1ZihrKTsKKwlsb2dwa3QoJ3InLC0xLChDSEFSICopIjxjcnVuY2hlZDpsZW4+IiwwKTsKKwl4eHNjcmVlbihTQ1JfUFQsJyUnLChsb25nKXBrdG51bSwiQmFkIHBhY2tldCBsZW5ndGgiKTsKKwlyZXR1cm4oJ1EnKTsKKyAgICB9IGVsc2UgeworCXJsbiA9IGogLSBiY3RsIC0gMjsJCS8qIFJlZ3VsYXIgcGFja2V0ICovCisJaiA9IDA7CQkJCS8qIE5vIGV4dGVuZGVkIGhlYWRlciAqLworICAgIH0KKyAgICByc24gPSB4dW5jaGFyKHJlY3BrdFtpKytdKTsJCS8qIFNlcXVlbmNlIG51bWJlciAqLworICAgIGlmIChwa3Rsb2cpCQkJCS8qIFNhdmUgYSBmdW5jdGlvbiBjYWxsISAqLworICAgICAgbG9ncGt0KCdyJyxyc24sc29ocCxybG4rYmN0bCtqKzQpOworICAgIGlmIChyc24gPCAwIHx8IHJzbiA+IDYzKSB7CisJZGVidWcoRjEwMSwicnBhY2sgYmFkIHNlcXVlbmNlIG51bWJlciIsIiIscnNuKTsKKwlmcmVlcmJ1ZihrKTsKKwlpZiAocGt0bG9nKQorCSAgbG9ncGt0KCdyJyxyc24sKENIQVIgKikiPGNydW5jaGVkOnNlcT4iLDApOworCXh4c2NyZWVuKFNDUl9QVCwnJScsKGxvbmcpcGt0bnVtLCJCYWQgc2VxdWVuY2UgbnVtYmVyIik7CisJcmV0dXJuKCdRJyk7CisgICAgfQorLyoKKyAgSWYgdGhpcyBwYWNrZXQgaGFzIHRoZSBzYW1lIHR5cGUgYXMgdGhlIHBhY2tldCBqdXN0IHNlbnQsIGFzc3VtZSBpdCBpcworICBhbiBlY2hvIGFuZCBpZ25vcmUgaXQuICBEb24ndCBldmVuIGJvdGhlciB3aXRoIHRoZSBibG9jayBjaGVjayBjYWxjdWxhdGlvbjoKKyAgZXZlbiBpZiB0aGUgcGFja2V0IGlzIGNvcnJ1cHRlZCwgd2UgZG9uJ3Qgd2FudCB0byBOQUsgYW4gZWNob2VkIHBhY2tldC4KKyAgTm9yIG11c3Qgd2UgTkFLIGFuIEFDSyBvciBOQUsuCisqLworICAgIHR5cGUgPSByZWNwa3RbaSsrXTsJCQkvKiBHZXQgcGFja2V0J3MgVFlQRSBmaWVsZCAqLworICAgIGlmICh0eXBlID09IHNuZHR5cCB8fCAobmFrc3RhdGUgJiYgKHR5cGUgPT0gJ04nIC8qIHx8IHR5cGUgPT0gJ1knICovICkpKSB7CisJZGVidWcoRjAwMCwicnBhY2sgZWNobyIsIiIsdHlwZSk7IC8qIElmIGl0J3MgYW4gZWNobyAqLworCWZyZWVyYnVmKGspOwkJCS8qIEZyZWUgdGhpcyBidWZmZXIgKi8KKwlsb2dwa3QoJyMnLHJzbiwoQ0hBUiAqKSI8ZWNobzppZ25vcmVkPiIsMCk7CisJcmV0dXJuKCdlJyk7CQkJLyogUmV0dXJuIHNwZWNpYWwgKGxvd2VyY2FzZSkgY29kZSAqLworICAgIH0KKy8qCisgIFNlcGFyYXRlIHRoZSBkYXRhIGZyb20gdGhlIGJsb2NrIGNoZWNrLCBhY2NvdW50aW5nIGZvciB0aGUgY2FzZSB3aGVyZQorICBhIHBhY2tldCB3YXMgcmV0cmFuc21pdHRlZCBhZnRlciB0aGUgYmxvY2sgY2hlY2sgc3dpdGNoZWQuCisqLworICAgIGlmICh0eXBlID09ICdJJyB8fCB0eXBlID09ICdTJykgewkvKiBJICYgUyBwYWNrZXRzIGFsd2F5cyBoYXZlIHR5cGUgMSAqLworCWNoa2xlbiA9IDE7CisJcmxuID0gcmxuICsgYmN0bCAtIDE7CisgICAgfSBlbHNlIGlmICh0eXBlID09ICdOJykgewkJLyogQSBOQUsgcGFja2V0IG5ldmVyIGhhcyBkYXRhICovCisJY2hrbGVuID0geHVuY2hhcihyZWNwa3RbbHBdKSAtIDI7CisJcmxuID0gcmxuICsgYmN0bCAtIGNoa2xlbjsKKyAgICB9IGVsc2UgY2hrbGVuID0gYmN0bDsKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsJCQkvKiBTYXZlIDIgZnVuY3Rpb24gY2FsbHMgKi8KKwlkZWJ1ZyhGMTAxLCJycGFjayBiY3RsIiwiIixiY3RsKTsKKwlkZWJ1ZyhGMTAxLCJycGFjayBjaGtsZW4iLCIiLGNoa2xlbik7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgaSArPSBqOwkJCQkvKiBCdWZmZXIgaW5kZXggb2YgREFUQSBmaWVsZCAqLworICAgIHJkYXRhcCA9IHJlY3BrdCtpOwkJCS8qIFBvaW50ZXIgdG8gREFUQSBmaWVsZCAqLworICAgIGlmICgoaiA9IHJsbiArIGkpID4gcl9wa3Rba10uYmZfbGVuKSB7IC8qIE1ha2Ugc3VyZSBpdCBmaXRzICovCisJZGVidWcoRjEwMSwicGFja2V0IHRvbyBsb25nIiwiIixqKTsKKwlmcmVlcmJ1ZihrKTsKKwlsb2dwa3QoJ3InLHJzbiwoQ0hBUiAqKSI8b3ZlcmZsb3c+IiwwKTsKKwlyZXR1cm4oJ1EnKTsKKyAgICB9CisgICAgZm9yICh4ID0gMDsgeCA8IGNoa2xlbjsgeCsrKQkvKiBDb3B5IHRoZSBibG9jayBjaGVjayAqLworICAgICAgcGJjW3hdID0gcmVjcGt0W2oreF07CQkvKiAzIGJ5dGVzIGF0IG1vc3QuICovCisgICAgcGJjW3hdID0gJ1wwJzsJCQkvKiBOdWxsLXRlcm1pbmF0ZSBibG9jayBjaGVjayBzdHJpbmcgKi8KKyAgICByZWNwa3Rbal0gPSAnXDAnOwkJCS8qIGFuZCB0aGUgcGFja2V0IERhdGEgZmllbGQuICovCisKKyAgICBpZiAoY2hrbGVuID09IDIgJiYgYmN0dSA9PSA0KSB7CS8qIEFkanVzdCBmb3IgQmxhbmstRnJlZS0yICovCisJY2hrbGVuID0gNDsJCQkvKiAoY2hrbGVuIGlzIG5vdyBhIG1pc25vbWVyLi4uKSAqLworCWRlYnVnKEYxMDAsInJwYWNrIGJsb2NrIGNoZWNrIEIiLCIiLDApOworICAgIH0KKyAgICBzd2l0Y2ggKGNoa2xlbikgewkJCS8qIENoZWNrIHRoZSBibG9jayBjaGVjayAqLworICAgICAgY2FzZSAxOgkJCQkvKiBUeXBlIDEsIDYtYml0IGNoZWNrc3VtICovCisJaWYgKHh1bmNoYXIoKnBiYykgIT0gY2hrMShyZWNwa3QrbHAsai1scCkpIHsKKyNpZmRlZiBERUJVRworCSAgICBpZiAoZGVibG9nKSB7CisJCWRlYnVnKEYxMTAsImNoZWNrZWQgY2hhcnMiLHJlY3BrdCtscCwwKTsKKwkJZGVidWcoRjEwMSwiYmxvY2sgY2hlY2sgKDEpIiwiIiwoaW50KSB4dW5jaGFyKCpwYmMpKTsKKwkJZGVidWcoRjEwMSwic2hvdWxkIGJlICgxKSIsIiIsY2hrMShyZWNwa3QrbHAsai1scCkpOworCSAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKwkgICAgZnJlZXJidWYoayk7CisJICAgIGxvZ3BrdCgncicsLTEsKENIQVIgKikiPGNydW5jaGVkOmNoazE+IiwwKTsKKwkgICAgeHhzY3JlZW4oU0NSX1BULCclJywobG9uZylwa3RudW0sIkNoZWNrc3VtIGVycm9yIik7CisJICAgIHJldHVybignUScpOworCX0KKwlicmVhazsKKyAgICAgIGNhc2UgMjoJCQkJLyogVHlwZSAyLCAxMi1iaXQgY2hlY2tzdW0gKi8KKwl4ID0geHVuY2hhcigqcGJjKSA8PCA2IHwgeHVuY2hhcihwYmNbMV0pOworCWlmICh4ICE9IGNoazIocmVjcGt0K2xwLGotbHApKSB7IC8qIE5vIG1hdGNoICovCisJICAgIGlmICh0eXBlID09ICdFJykgewkJLyogQWxsb3cgRSBwYWNrZXRzIHRvIGhhdmUgdHlwZSAxICovCisJCXJlY3BrdFtqKytdID0gcGJjWzBdOworCQlyZWNwa3Rbal0gPSAnXDAnOworCQlpZiAoeHVuY2hhcihwYmNbMV0pID09IGNoazEocmVjcGt0K2xwLGotbHApKQorCQkgIGJyZWFrOworCQllbHNlCisJCSAgcmVjcGt0Wy0tal0gPSAnXDAnOworCSAgICB9CisjaWZkZWYgREVCVUcKKwkgICAgaWYgKGRlYmxvZykgeworCQlkZWJ1ZyhGMTEwLCJjaGVja2VkIGNoYXJzIixyZWNwa3QrbHAsMCk7CisJCWRlYnVnKEYxMDEsImJsb2NrIGNoZWNrICgyKSIsIiIsIHgpOworCQlkZWJ1ZyhGMTAxLCJzaG91bGQgYmUgKDIpIiwiIiwgKGludCkgY2hrMihyZWNwa3QrbHAsai1scCkpOworCSAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKwkgICAgZnJlZXJidWYoayk7CisJICAgIGxvZ3BrdCgncicsLTEsKENIQVIgKikiPGNydW5jaGVkOmNoazI+IiwwKTsKKwkgICAgeHhzY3JlZW4oU0NSX1BULCclJywobG9uZylwa3RudW0sIkNoZWNrc3VtIGVycm9yIik7CisJICAgIHJldHVybignUScpOworCX0KKwlicmVhazsKKyAgICAgIGNhc2UgMzoJCQkJLyogVHlwZSAzLCAxNi1iaXQgQ1JDICovCisJY3JjID0gKHh1bmNoYXIocGJjWzBdKSA8PCAxMikKKwkgICAgfCAoeHVuY2hhcihwYmNbMV0pIDw8IDYpCisJICAgIHwgKHh1bmNoYXIocGJjWzJdKSk7CisJaWYgKGNyYyAhPSBjaGszKHJlY3BrdCtscCxqLWxwKSkgeworCSAgICBpZiAodHlwZSA9PSAnRScpIHsJCS8qIEFsbG93IEUgcGFja2V0cyB0byBoYXZlIHR5cGUgMSAqLworCQlyZWNwa3RbaisrXSA9IHBiY1swXTsKKwkJcmVjcGt0W2orK10gPSBwYmNbMV07CisJCXJlY3BrdFtqXSA9ICdcMCc7CisJCWlmICh4dW5jaGFyKHBiY1syXSkgPT0gY2hrMShyZWNwa3QrbHAsai1scCkpCisJCSAgYnJlYWs7CisJCWVsc2UgeyBqIC09MjsgcmVjcGt0W2pdID0gJ1wwJzsgfQorCSAgICB9CisjaWZkZWYgREVCVUcKKwkgICAgaWYgKGRlYmxvZykgeworCQlkZWJ1ZyhGMTEwLCJjaGVja2VkIGNoYXJzIixyZWNwa3QrbHAsMCk7CisJCWRlYnVnKEYxMDEsImJsb2NrIGNoZWNrICgzKSIsIiIsY3JjKTsKKwkJZGVidWcoRjEwMSwic2hvdWxkIGJlICgzKSIsIiIsKGludCkgY2hrMyhyZWNwa3QrbHAsai1scCkpOworCSAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKwkgICAgZnJlZXJidWYoayk7CisJICAgIGxvZ3BrdCgncicsLTEsKENIQVIgKikiPGNydW5jaGVkOmNoazM+IiwwKTsKKwkgICAgeHhzY3JlZW4oU0NSX1BULCclJywobG9uZylwa3RudW0sIkNSQyBlcnJvciIpOworCSAgICByZXR1cm4oJ1EnKTsKKwl9CisJYnJlYWs7CisgICAgICBjYXNlIDQ6CQkJCS8qIFR5cGUgNCA9IFR5cGUgMiwgbm8gYmxhbmtzLiAqLworCXggPSAodW5zaWduZWQpKCh4dW5jaGFyKCpwYmMpIC0gMSkgPDwgNikgfAorCSAgKHVuc2lnbmVkKSh4dW5jaGFyKHBiY1sxXSkgLSAxKTsKKwlpZiAoeCAhPSBjaGsyKHJlY3BrdCtscCxqLWxwKSkgeworCSAgICBpZiAodHlwZSA9PSAnRScpIHsJLyogQWxsb3cgRSBwYWNrZXRzIHRvIGhhdmUgdHlwZSAxICovCisJCXJlY3BrdFtqKytdID0gcGJjWzBdOworCQlyZWNwa3Rbal0gPSAnXDAnOworCQlpZiAoeHVuY2hhcihwYmNbMV0pID09IGNoazEocmVjcGt0K2xwLGotbHApKQorCQkgIGJyZWFrOworCQllbHNlCisJCSAgcmVjcGt0Wy0tal0gPSAnXDAnOworCSAgICB9CisJICAgIGRlYnVnKEYxMDEsImJhZCB0eXBlIEIgYmxvY2sgY2hlY2siLCIiLHgpOworCSAgICBmcmVlcmJ1ZihrKTsKKwkgICAgbG9ncGt0KCdyJywtMSwoQ0hBUiAqKSI8Y3J1bmNoZWQ6Y2hrYj4iLDApOworCSAgICB4eHNjcmVlbihTQ1JfUFQsJyUnLChsb25nKXBrdG51bSwiQ2hlY2tzdW0gZXJyb3IiKTsKKwkgICAgcmV0dXJuKCdRJyk7CisJfQorCWJyZWFrOworICAgICAgZGVmYXVsdDoJCQkvKiBTaG91bGRuJ3QgaGFwcGVuLi4uICovCisJZnJlZXJidWYoayk7CisJbG9ncGt0KCdyJywtMSwoQ0hBUiAqKSI8Y3J1bmNoZWQ6Y2hreD4iLDApOworCXh4c2NyZWVuKFNDUl9QVCwnJScsKGxvbmcpcGt0bnVtLCIoY3J1bmNoZWQpIik7CisJcmV0dXJuKCdRJyk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsInJwYWNrIGJsb2NrIGNoZWNrIE9LIiwiIixyc24pOworCisvKiBOb3cgd2UgY2FuIGJlbGlldmUgdGhlIHNlcXVlbmNlIG51bWJlciwgYW5kIG90aGVyIGZpZWxkcy4gKi8KKy8qIEhlcmUgd2UgdmlvbGF0ZSBzdHJpY3QgcHJpbmNpcGxlcyBvZiBsYXllcmluZywgZXRjLCBhbmQgbG9vayBhdCB0aGUgICovCisvKiBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyLiAgSWYgdGhlcmUncyBhbHJlYWR5IGEgcGFja2V0IHdpdGggdGhlIHNhbWUgICAqLworLyogbnVtYmVyIGluIHRoZSB3aW5kb3csIHdlIHJlbW92ZSB0aGlzIG9uZSBzbyB0aGF0IHRoZSB3aW5kb3cgd2lsbCBub3QgKi8KKy8qIGZpbGwgdXAuICovCisKKyAgICBpZiAoKHggPSByc2VxdGJsW3Jzbl0pICE9IC0xKSB7CS8qIEFscmVhZHkgYSBwYWNrZXQgd2l0aCB0aGlzIG51bWJlciAqLworCXJldHJhbnMrKzsJCQkvKiBDb3VudCBpdCBmb3Igc3RhdGlzdGljcyAqLworCWRlYnVnKEYxMDEsInJwYWNrIGdvdCBkdXAiLCIiLHJzbik7CisJbG9ncGt0KCdyJyxyc24sKENIQVIgKikiPGR1cGxpY2F0ZT4iLDApOworCWZyZWVyYnVmKHgpOwkJCS8qIEZyZWUgb2xkIGJ1ZmZlciwga2VlcCBuZXcgcGFja2V0LiAqLworCXJfcGt0W2tdLnBrX3J0cisrOwkJLyogQ291bnQgdGhpcyBhcyBhIHJldHJhbnNtaXNzaW9uLiAqLworICAgIH0KKworLyogTmV3IHBhY2tldCwgbm90IHNlZW4gYmVmb3JlLCBlbnRlciBpdCBpbnRvIHRoZSByZWNlaXZlIHdpbmRvdy4gKi8KKworI2lmZGVmIENLX1RJTUVSUworICAgIGlmICh0aW1pbnQgPiAwKQorICAgICAgcnJ0dGJsW3Jzbl0gPSBndGltZXIoKTsJCS8qIFRpbWVzdGFtcCAqLworI2VuZGlmIC8qIENLX1RJTUVSUyAqLworCisgICAgcnNlcXRibFtyc25dID0gazsJCQkvKiBNYWtlIGJhY2sgcG9pbnRlciAqLworICAgIHJfcGt0W2tdLnBrX3NlcSA9IHJzbjsJCS8qIFJlY29yZCBpbiBwYWNrZXQgaW5mbyBzdHJ1Y3R1cmUgKi8KKyAgICByX3BrdFtrXS5wa190eXAgPSB0eXBlOwkJLyogU2VxdWVuY2UsIHR5cGUsLi4uICovCisgICAgcl9wa3Rba10ucGtfYWRyID0gcmRhdGFwOwkJLyogcG9pbnRlciB0byBkYXRhIGJ1ZmZlciAqLworICAgIGlmIChsb2NhbCkgewkJCS8qIFNhdmUgYSBmdW5jdGlvbiBjYWxsISAqLworCWludCB4ID0gMDsKKwlpZiAoZmRpc3BsYSAhPSBYWUZEX04pIHggPSAxOworCWlmIChmZGlzcGxhID09IFhZRkRfQiAmJiAodHlwZSA9PSAnRCcgfHwgc25kdHlwID09ICdEJykpIHggPSAwOworCWlmICh4KQkJCQkvKiBVcGRhdGUgc2NyZWVuICovCisJICB4eHNjcmVlbihTQ1JfUFQsKGNoYXIpdHlwZSwobG9uZylyc24sKGNoYXIgKilzb2hwKTsKKyAgICB9CisgICAgcmV0dXJuKHR5cGUpOwkJCS8qIFJldHVybiBwYWNrZXQgdHlwZSAqLworfQorCisvKiAgTCBPIEcgUCBLIFQgIC0tICBMb2cgcGFja2V0IG51bWJlciBuLCBwb2ludGVkIHRvIGJ5IHMuICAqLworCisvKiBjID0gJ3MnIChzZW5kKSBvciAncicgKHJlY2VpdmUpICovCisKK1ZPSUQKKyNpZmRlZiBDS19BTlNJQworbG9ncGt0KGNoYXIgYyxpbnQgbiwgQ0hBUiAqcywgaW50IGxlbikKKyNlbHNlCitsb2dwa3QoYyxuLHMsbGVuKSBjaGFyIGM7IGludCBuOyBDSEFSICpzOyBpbnQgbGVuOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBsb2dwa3QgKi8geworICAgIGNoYXIgcGxvZ1syMF07CisgICAgaWYgKCFzKSBzID0gKENIQVIgKikiIjsKKyAgICBpZiAocGt0bG9nKSBpZiAoY2hrZm4oWlBGSUxFKSA+IDApIHsKKwlpZiAobiA8IDApCQkJLyogQ29uc3RydWN0IGVudHJ5IGhlYWRlciAqLworCSAgc3ByaW50ZihwbG9nLCIlYy14eC0lMDJkLSIsYywoZ3RpbWVyKCklNjApKTsgLyogc2FmZSAqLworCWVsc2UKKwkgIHNwcmludGYocGxvZywiJWMtJTAyZC0lMDJkLSIsYyxuLChndGltZXIoKSU2MCkpOyAvKiBzYWZlICovCisJaWYgKHpzb3V0eChaUEZJTEUscGxvZywoaW50KXN0cmxlbihwbG9nKSkgPCAwKSB7CisJICAgIHBrdGxvZyA9IDA7CisJICAgIHJldHVybjsKKwl9IGVsc2UgeworCSAgICBpZiAobGVuID09IDApCisJICAgICAgbGVuID0gc3RybGVuKChjaGFyICopcyk7CisJICAgIGlmIChsZW4gPiAwKSB7CisJCWNoYXIgKiBwOwkJLyogTWFrZSBTT1AgcHJpbnRhYmxlICovCisJCWludCB4OwkJCS8qIHNvIHdlIGNhbiBsb29rIGF0IGxvZ3Mgd2l0aG91dCAqLworCQlwID0gZGJjaHIoKnMpOwkJLyogdHJpZ2dlcmluZyBhdXRvZG93bmxvYWQuICovCisJCXggPSBzdHJsZW4oZGJjaHIoKnMpKTsKKwkJaWYgKCpzIDwgMzIgfHwgKCpzID4gMTI3ICYmICpzIDwgMTYwKSkgeworCQkgICAgaWYgKHpzb3V0eChaUEZJTEUscCx4KSA8IDApIHsKKwkJCXBrdGxvZyA9IDA7CisJCQlyZXR1cm47CisJCSAgICB9IGVsc2UgeworCQkJbGVuLS07CisJCQlzKys7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBpZiAoenNvdXR4KFpQRklMRSwoY2hhciAqKXMsbGVuKSA8IDApIHsKKwkJcGt0bG9nID0gMDsKKwkJcmV0dXJuOworCSAgICB9IGVsc2UgaWYgKHpzb3V0eChaUEZJTEUsCisjaWZkZWYgVU5JWAorCQkJICAgICAgIlxuIiwgMQorI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorCQkJICAgICAgIlxuIiwgMQorI2Vsc2UKKyNpZmRlZiBPU0sKKwkJCSAgICAgICJcciIsIDEKKyNlbHNlCisjaWZkZWYgTUFDCisJCQkgICAgICAiXHIiLCAxCisjZWxzZQorCQkJICAgICAgIlwwMTVcMDEyIiwgMgorI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogVU5JWCAqLworCQkJICAgICAgKSA8IDApIHsKKwkJcGt0bG9nID0gMDsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qICBUIFMgVCBBIFQgUyAgLS0gIFJlY29yZCBzdGF0aXN0aWNzIGluIHRyYW5zYWN0aW9uIGxvZyAgKi8KKworVk9JRAordHN0YXRzKCkgeworICAgIGNoYXIgKnRwID0gTlVMTDsKKyNpZmRlZiBHRlRJTUVSCisgICAgQ0tGTE9BVCB4eDsJCQkJLyogRWxhcHNlZCB0aW1lIGRpdmlzb3IgKi8KKyNlbmRpZiAvKiBHRlRJTUVSICovCisKKyAgICBkZWJ1ZyhGMTAxLCJ0c3RhdHMgeGZzZWNzIiwiIix4ZnNlY3MpOworICAgIGRlYnVnKEYxMDEsInRzdGF0cyBmaWxjbnQiLCIiLGZpbGNudCk7CisgICAgaWYgKGZpbGNudCA9PSAxKSB7CQkJLyogR2V0IHRpbWluZyBmb3Igc3RhdGlzdGljcyAqLworCXRzZWNzID0geGZzZWNzOwkJCS8qIFNpbmdsZSBmaWxlLCB3ZSBhbHJlYWR5IGhhdmUgaXQgKi8KKyNpZmRlZiBHRlRJTUVSCisJZGVidWcoRjEwMSwidHN0YXRzIGZweGZzZWNzIiwiIiwoaW50KWZweGZzZWNzKTsKKwlmcHRzZWNzID0gZnB4ZnNlY3M7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworICAgIH0gZWxzZSB7CQkJCS8qIE11bHRpcGxlIGZpbGVzICovCisJdHNlY3MgPSBndGltZXIoKTsJCS8qIEdldCBjdXJyZW50IHRpbWUgKi8KKyNpZmRlZiBHRlRJTUVSCisJZnB0c2VjcyA9IGdmdGltZXIoKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgfQorI2lmZGVmIEdGVElNRVIKKyAgICBpZiAoZnB0c2VjcyA8PSBHRk1JTlRJTUUpCQkvKiBDYWxjdWxhdGUgQ1BTICovCisgICAgICBmcHRzZWNzID0gKENLRkxPQVQpIEdGTUlOVElNRTsKKyAgICBkZWJ1ZyhGMTAxLCJ0c3RhdHMgZnB0c2VjcyIsIiIsKGludClmcHRzZWNzKTsKKyAgICB4eCA9IChDS0ZMT0FUKSB0ZmMgLyBmcHRzZWNzOworICAgIGlmIChzaXplb2YobG9uZykgPD0gNCkgewkJLyogZG9lc24ndCBhY2NvdW50IGZvciAxNi1iaXQgbG9uZ3MgKi8KKwlpZiAoeHggID4gMjE0NzQ4MzY0Ny4wKQorCSAgdGZjcHMgPSAyMTQ3NDgzNjQ3TDsJICAgICAgICAvKiAzMSBiaXRzICovCisJZWxzZQorCSAgdGZjcHMgPSAobG9uZykgeHg7CisgICAgfSBlbHNlCisgICAgICB0ZmNwcyA9IChsb25nKSB4eDsKKyNlbHNlCisgICAgaWYgKHRzZWNzIDwgMkwpCisgICAgICB0c2VjcyA9IDFMOworICAgIGRlYnVnKEYxMDEsInRzdGF0cyB0c2VjcyIsIiIsdHNlY3MpOworICAgIHRmY3BzID0gdGZjIC8gdHNlY3M7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisgICAgenRpbWUoJnRwKTsJCQkJLyogR2V0IHRpbWUgc3RhbXAgKi8KKyAgICB0bG9nKEYxMDAsIiIsIiIsMEwpOwkJLyogTGVhdmUgYSBibGFuayBsaW5lICovCisgICAgdGxvZyhGMTEwLCJUcmFuc2FjdGlvbiBjb21wbGV0ZSIsdHAsMEwpOyAgLyogUmVjb3JkIGl0ICovCisKKyAgICBpZiAoZmlsY250IDwgMSkgcmV0dXJuOwkJLyogSWYgbm8gZmlsZXMsIGRvbmUuICovCisKKy8qIElmIG11bHRpcGxlIGZpbGVzLCByZWNvcmQgY2hhcmFjdGVyIHRvdGFscyBmb3IgYWxsIGZpbGVzICovCisKKyAgICBpZiAoZmlsY250ID4gMSkgeworCXRsb2coRjEwMSwiIGZpbGVzIHRyYW5zZmVycmVkICAgICAgICIsIiIsZmlsY250IC0gZmlscmVqKTsKKwl0bG9nKEYxMDEsIiB0b3RhbCBmaWxlIGNoYXJhY3RlcnMgICAiLCIiLHRmYyk7CisJdGxvZyhGMTAxLCIgY29tbXVuaWNhdGlvbiBsaW5lIGluICAgIiwiIix0bGNpKTsKKwl0bG9nKEYxMDEsIiBjb21tdW5pY2F0aW9uIGxpbmUgb3V0ICAiLCIiLHRsY28pOworICAgIH0KKworLyogUmVjb3JkIHRpbWluZyBpbmZvIGZvciBvbmUgb3IgbW9yZSBmaWxlcyAqLworCisjaWZkZWYgR0ZUSU1FUgorICAgIGlmIChmaWxjbnQgLSBmaWxyZWogPT0gMSkgeworCXRsb2coRjEwMSwiIGVsYXBzZWQgdGltZSAoc2Vjb25kcykgICIsIiIsKGxvbmcpIGZweGZzZWNzKTsKKwl0bG9nKEYxMDEsIiBlZmZlY3RpdmUgZGF0YSByYXRlICAgICAiLCIiLGZpbGNwcyk7CisgICAgfSBlbHNlIHsKKwl0bG9nKEYxMDEsIiBlbGFwc2VkIHRpbWUgKHNlY29uZHMpICAiLCIiLChsb25nKSBmcHRzZWNzKTsKKwl0bG9nKEYxMDEsIiBlZmZlY3RpdmUgZGF0YSByYXRlICAgICAiLCIiLChsb25nKSB4eCk7CisgICAgfQorI2Vsc2UKKyAgICB0bG9nKEYxMDEsIiBlbGFwc2VkIHRpbWUgKHNlY29uZHMpICAiLCIiLChsb25nKSB0c2Vjcyk7CisgICAgaWYgKHRzZWNzID4gMCkgeworCWxvbmcgbHg7CisJbHggPSAodGZjICogMTBMKSAvIChsb25nKSB0c2VjczsKKwl0bG9nKEYxMDEsIiBlZmZlY3RpdmUgZGF0YSByYXRlICAgICAiLCIiLGx4LzEwTCk7CisgICAgfQorI2VuZGlmIC8qIEdGVElNRVIgKi8KKyAgICB0bG9nKEYxMDAsIiIsIiIsMEwpOwkJLyogTGVhdmUgYSBibGFuayBsaW5lICovCit9CisKKy8qICBGIFMgVCBBIFQgUyAgLS0gIFJlY29yZCBmaWxlIHN0YXRpc3RpY3MgaW4gdHJhbnNhY3Rpb24gbG9nICAqLworCitWT0lECitmY3BzKCkgeworI2lmZGVmIEdGVElNRVIKKyAgICBkb3VibGUgeHg7CisgICAgZnB4ZnNlY3MgPSBnZnRpbWVyKCkgLSBmcGZzZWNzOworICAgIGlmIChmcHhmc2VjcyA8PSBHRk1JTlRJTUUpCisgICAgICBmcHhmc2VjcyA9IChDS0ZMT0FUKSBHRk1JTlRJTUU7CisgICAgeHggPSAoQ0tGTE9BVCkgZmZjIC8gZnB4ZnNlY3M7CisgICAgaWYgKHNpemVvZihsb25nKSA8PSA0KSB7CisJaWYgKHh4ICA+IDIxNDc0ODM2NDcuMCkKKwkgIHRmY3BzID0gMjE0NzQ4MzY0N0w7CQkvKiAzMSBiaXRzICovCisJZWxzZQorCSAgZmlsY3BzID0gKGxvbmcpIHh4OworICAgIH0gZWxzZQorICAgICAgZmlsY3BzID0gKGxvbmcpIHh4OworICAgIGlmIChzaXplb2YoaW50KSA+PSA0KQorICAgICAgeGZzZWNzID0gKGludCkgZnB4ZnNlY3M7CisgICAgZWxzZSBpZiAoZnB4ZnNlY3MgPCAzMjc2OC4wKQorICAgICAgeGZzZWNzID0gKGludCkgZnB4ZnNlY3M7CisgICAgZWxzZQorICAgICAgeGZzZWNzID0gMzI3Njc7CisjZWxzZSAvKiBHRlRJTUVSICovCisgICAgeGZzZWNzID0gZ3RpbWVyKCkgLSBmc2VjczsKKyAgICBpZiAoeGZzZWNzIDwgMUwpIHhmc2VjcyA9IDFMOworICAgIGZpbGNwcyA9IGZmYyAvIHhmc2VjczsKKyNlbmRpZiAvKiBHRlRJTUVSICovCit9CisKK1ZPSUQKK2ZzdGF0cygpIHsKKyAgICB0ZmMgKz0gZmZjOworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworCWRlYnVnKEYxMDEsImZzdGF0cyB0ZmMiLCIiLHRmYyk7CisJZGVidWcoRjEwMSwiZnN0YXRzIHdoYXQiLCIiLHdoYXQpOworCWRlYnVnKEYxMTAsImZzdGF0cyBlcGt0bXNnIixlcGt0bXNnLDApOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIFRMT0cKKyAgICBpZiAoIWRpc2NhcmQgJiYgIWN4c2VlbiAmJiAhY3pzZWVuICYmIHdoYXQgIT0gV19OT1RISU5HICYmICEqZXBrdG1zZykKKyAgICAgIHRsb2coRjEwMSwiIGNvbXBsZXRlLCBzaXplIiwiIixmZmMpOworI2VuZGlmIC8qIFRMT0cgKi8KK30KKworI2VuZGlmIC8qIE5PWEZFUiAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrY2ZuMy5jIGIvY2tlcm1pdC04LjAuMjExL2NrY2ZuMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTk0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2tjZm4zLmMKQEAgLTAsMCArMSwyNTU5IEBACisvKiAgQyBLIEMgRiBOIDMgIC0tICBQYWNrZXQgYnVmZmVyIG1hbmFnZW1lbnQgZm9yIEMtS2VybWl0ICAqLworCisvKiAocGx1cyBhc3NvcnRlZCBmdW5jdGlvbnMgdGFja2VkIG9uIGF0IHRoZSBlbmQpICovCisKKy8qCisgIEF1dGhvcjogRnJhbmsgZGEgQ3J1eiA8ZmRjQGNvbHVtYmlhLmVkdT4sCisgIENvbHVtYmlhIFVuaXZlcnNpdHkgQWNhZGVtaWMgSW5mb3JtYXRpb24gU3lzdGVtcywgTmV3IFlvcmsgQ2l0eS4KKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorKi8KKy8qCisgTm90ZSAtLSBpZiB5b3UgY2hhbmdlIHRoaXMgZmlsZSwgcGxlYXNlIGFtZW5kIHRoZSB2ZXJzaW9uIG51bWJlciBhbmQgZGF0ZSBhdAorIHRoZSB0b3Agb2YgY2tjZm5zLmMgYWNjb3JkaW5nbHkuCisqLworCisjaW5jbHVkZSAiY2tjc3ltLmgiCisjaW5jbHVkZSAiY2tjZGViLmgiCisjaW5jbHVkZSAiY2tjYXNjLmgiCisjaW5jbHVkZSAiY2tja2VyLmgiCisjaW5jbHVkZSAiY2tjeGxhLmgiCisKKy8qICBDIEsgTSBLIEQgSSBSICAtLSAgQ3JlYXRlIGEgZGlyZWN0b3J5ICAqLworLyoKKyAgQ2FsbCB3aXRoOgorICAgIGludCBmYyAgICA9IDAgdG8gY3JlYXRlLCBub256ZXJvIHRvIHJlbW92ZSwgYSBkaXJlY3RvcnkuCisgICAgY2hhciAqIHMgID0gcG9pbnRlciB0byBuYW1lIG9mIGRpcmVjdG9yeSB0byBjcmVhdGUgb3IgcmVtb3ZlLgorICAgIGNoYXIgKiogciA9IGFkZHJlc3Mgb2YgcG9pbnRlciB0byByZXR1cm4gbmFtZSBvciBtZXNzYWdlLgorICAgIGludCBtICAgICA9IDEgdG8gcHJpbnQgZXJyb3IgbWVzc2FnZXMsIDAgdG8gYmUgc2lsZW50LgorICAgIGludCBjdnQgICA9IDEgbWVhbnMgY29udmVydCBzIGZyb20gc3RhbmRhcmQgZm9ybWF0IHRvIGxvY2FsIGZvcm1hdDsKKyAgICAgICAgICAgICAgICAwIG1lYW5zIHVzZSBzIGFzIGlzLgorICBSZXR1cm5zOgorICAgIDAgb24gc3VjY2VzcyAoZGlyZWN0b3J5IHdhcyBjcmVhdGVkIG9yIHJlbW92ZWQpLgorICAgLTEgd2hlbiBhdHRlbXB0IHRvIGNyZWF0ZSB0aGUgZGlyZWN0b3J5IGZhaWxlZC4KKyAgIC0yIG9uIGludGVybmFsIGVycm9yIChlLmcuIG5vIGNvZGUgZm9yIGNyZWF0aW5nIGRpcmVjdG9yaWVzKS4KKyAgT24gc3VjY2VzcywgdGhlIG5hbWUgaXMgcG9pbnRlZCB0byBieSBwLgorICBPbiBmYWlsdXJlLCB0aGUgcmVhc29uIGlzIHBvaW50ZWQgdG8gYnkgcC4KKyovCisjaWZkZWYgQ0tfTUtESVIKK3N0YXRpYyBjaGFyIGNrbWtkYnVmW0NLTUFYUEFUSCsxXTsKKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKK3N0YXRpYyBjaGFyIGNrbWtkYnVmW0NLTUFYUEFUSCsxXTsKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIENLX01LRElSICovCisKKyNpZmRlZiBDS19NS0RJUgoraW50Citja21rZGlyKGZjLHMscixtLGN2dCkgaW50IGZjOyBjaGFyICogczsgY2hhciAqKiByOyBpbnQgbTsgaW50IGN2dDsgeworICAgIGludCB4LCByYyA9IC0yOworICAgIGNoYXIgdG1wYnVmW0NLTUFYUEFUSCsxXTsKKyAgICBjaGFyIGJ1ZjJbQ0tNQVhQQVRIKzFdOworICAgIGlmICghcykgcyA9ICIiOworICAgIGRlYnVnKEYxMTAsImNrbWtkaXIgMSBmYyIscyxmYyk7CisgICAgaWYgKCEqcykgeworCWNrbWFrbXNnKGNrbWtkYnVmLAorCQkgQ0tNQVhQQVRIKzEsCisJCSAoZmMgPT0gMCkgPyAibWtkaXIiIDogInJtZGlyIiwKKwkJICI6IG5vIG5hbWUgZ2l2ZW4iLAorCQkgTlVMTCwKKwkJIE5VTEwKKwkJICk7CisJKnIgPSBja21rZGJ1ZjsKKwlyZXR1cm4oLTIpOworICAgIH0KKyNpZmRlZiBkYXRhZ2VuZXJhbAorLyogQ29tZSBiYWNrIGFuZCBtYWtlIHRoaXMgbmljZXIgbGF0ZXIgaWYgYW55Ym9keSBub3RpY2VzICovCisgICAgaWYgKGZjID09IDApIHsJCQkvKiBta2RpciAqLworCXJjID0gY3JlYXRlZGlyKHMsMCk7CisgICAgfSBlbHNlIHsJCQkJLyogcm1kaXIgKi8KKwkvKiBBT1MvVlMgcm1kaXIoKSBpcyBhIG5vLW9wLiAqLworCWNrbWFrbXNnKHRtcGJ1ZixDS01BWFBBVEgrMSwiZGVsZXRlICIscyxOVUxMLE5VTEwpOworCWRlYnVnKEYxMTAsImNrbWtkaXIgMiIsdG1wYnVmLDApOworCXJjID0gc3lzdGVtKHRtcGJ1Zik7CisgICAgfQorICAgICpyID0gTlVMTDsKKyNlbHNlIC8qIG5vdCBkYXRhZ2VuZXJhbCAqLworCisvKiBGaXJzdCBtYWtlIHN1cmUgdGhlIG5hbWUgaGFzIGFuIGFjY2VwdGFibGUgZGlyZWN0b3J5LW5hbWUgZm9ybWF0ICovCisKKyNpZmRlZiBWTVMKKyAgICB7CisJY2hhciAqcCA9IHM7CisJaW50IGxiID0gMCwgcmIgPSAwLCBzbCA9IDA7CisJd2hpbGUgKCpwKSB7CisJICAgIGlmICAgICAgKCpwID09ICdbJyB8fCAqcCA9PSAnPCcpIGxiKys7ICAgLyogQ291bnQgYnJhY2tldHMgKi8KKwkgICAgZWxzZSBpZiAoKnAgPT0gJ10nIHx8ICpwID09ICc+JykgcmIrKzsKKwkgICAgZWxzZSBpZiAoKnAgPT0gJy8nKSAJICAgICBzbCsrOwkvKiBhbmQgc2xhc2hlcyAqLworCSAgICBwKys7CisJfQorCWlmIChsYiAhPSAxICYmIHJiICE9IDEgJiYgc2wgPT0gMCAmJiBwID4gcyAmJiAqKHAtMSkgIT0gJzonKSB7CisJICAgIC8qIFByb2JhYmx5IGp1c3QgYSB3b3JkIC0gY29udmVydCB0byBWTVMgZm9ybWF0ICovCisJICAgIGNrbWFrbXNnKGJ1ZjIsCisJCSAgICAgQ0tNQVhQQVRIKzEsCisJCSAgICAgIlsiLAorCQkgICAgICgqcyA9PSAnLicpID8gIiIgOiAiLiIsCisJCSAgICAgcywKKwkJICAgICAiXSIKKwkJICAgICApOworCSAgICBzID0gYnVmMjsKKwl9IGVsc2UgaWYgKGxiID09IDAgJiYgcmIgPT0gMCAmJiBzbCAhPSAwICYmIHAgPiBzICYmICoocC0xKSAhPSAnOicpIHsKKwkgICAgaW50IGZsYWcgPSAwOworCSAgICAvKiBTZWVtcyB0byBiZSBpbiBVTklYIGZvcm1hdCAqLworCSAgICB4ID0gc3RybGVuKHMpOworCSAgICBpZiAoeCA+IDAgJiYgc1t4LTFdICE9ICcvJykKKwkgICAgICBmbGFnID0gMTsKKwkgICAgY2ttYWttc2coYnVmMixDS01BWFBBVEgrMSxzLGZsYWcgPyAiLyIgOiAiIixOVUxMLE5VTEwpOworCSAgICBzID0gYnVmMjsKKwl9CisJaWYgKHMgPT0gYnVmMikgeworCSAgICBja3N0cm5jcHkodG1wYnVmLHMsQ0tNQVhQQVRIKzEpOworCSAgICBzID0gdG1wYnVmOworCX0KKwlkZWJ1ZyhGMTEwLCJja21rZGlyIDIrVk1TIixzLDApOworICAgIH0KKyNlbHNlCisjaWZkZWYgVU5JWE9ST1NLCisjaWZkZWYgRFRJTERFCisgICAgcyA9IHRpbGRlX2V4cGFuZChzKTsKKyNlbmRpZiAvKiBEVElMREUgKi8KKyAgICBja3N0cm5jcHkodG1wYnVmLHMsQ0tNQVhQQVRIKzEpOworICAgIHMgPSB0bXBidWY7CisgICAgeCA9IHN0cmxlbihzKTsKKyAgICBpZiAoeCA+IDAgJiYgc1t4LTFdICE9ICcvJykgewkvKiBNdXN0IGVuZCBpbiAiLyIgZm9yIHpta2RpcigpICovCisJc1t4XSA9ICcvJzsKKwlzW3grMV0gPSBOVUw7CisJZGVidWcoRjExMCwiY2tta2RpciAyK1VOSVhPUk9TSyIscywwKTsKKyAgICB9CisjZWxzZSAvKiBVTklYT1JPU0sgKi8KKyNpZmRlZiBPUzIKKyAgICBja3N0cm5jcHkodG1wYnVmLHMsQ0tNQVhQQVRIKzEpOworICAgIHMgPSB0bXBidWY7CisgICAgeCA9IHN0cmxlbihzKTsKKyAgICBpZiAoZmMgPT0gMCAmJiB4ID4gMCAmJiBzW3gtMV0gIT0gJy8nKSB7IC8qIE11c3QgZW5kIGluICIvIiBmb3Igem1rZGlyKCkgKi8KKwlzW3hdID0gJy8nOworCXNbeCsxXSA9IE5VTDsKKwlkZWJ1ZyhGMTEwLCJja21rZGlyIDIrT1MyIixzLDApOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNpZmRlZiBOWkxUT1IKKyAgICAvKiBTZXJ2ZXIgaXMgY2FsbGluZyB1cywgc28gY29udmVydCB0byBsb2NhbCBmb3JtYXQgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKGN2dCkgeworCW56cnRvbChzLChjaGFyICopYnVmMiwxLFBBVEhfQUJTLENLTUFYUEFUSCk7CisJcyA9IGJ1ZjI7CisJZGVidWcoRjExMCwiY2tta2RpciAzIixzLDApOworICAgIH0KKyNlbmRpZiAvKiBOWkxUT1IgKi8KKyAgICBkZWJ1ZyhGMTEwLCJja21rZGlyIDQiLHMsMCk7CisgICAgaWYgKGZjID09IDApIHsJCQkvKiBNYWtpbmcgKi8KKyNpZmRlZiBDS19NS0RJUgorCXJjID0gem1rZGlyKHMpOworI2Vsc2UKKyNpZmRlZiBOVAorCXJjID0gX21rZGlyKHMpOworI2Vsc2UKKwlyYyA9IG1rZGlyKHMsMDc3Nyk7CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBDS19NS0RJUiAqLworICAgIH0gZWxzZSB7CQkJCS8qIFJlbW92aW5nICovCisjaWZkZWYgWlJNRElSCisJcmMgPSB6cm1kaXIocyk7CisjZWxzZQorI2lmZGVmIE5UCisJcmMgPSBfcm1kaXIocyk7CisjZWxzZQorI2lmZGVmIE9TSworCXJjID0gLTI7CisjZWxzZQorCXJjID0gcm1kaXIocyk7CisjZW5kaWYgLyogT1NLICovCisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBaUk1ESVIgKi8KKyAgICB9CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyAgICBkZWJ1ZyhGMTAxLCJja21rZGlyIHJjIiwiIixyYyk7CisgICAgaWYgKHJjID09IC0yKSB7CisJY2ttYWttc2coY2tta2RidWYsCisJCSBDS01BWFBBVEgsCisJCSAiRGlyZWN0b3J5ICIsCisJCSAoZmMgPT0gMCkgPyAiY3JlYXRpb24iIDogInJlbW92YWwiLAorCQkgIm5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24gb2YgQy1LZXJtaXQiLAorCQkgTlVMTAorCQkgKTsKKwkqciA9IGNrbWtkYnVmOworCWlmIChtKSBwcmludGYoIiVzXG4iLCpyKTsKKyAgICB9IGVsc2UgaWYgKHJjIDwgMCkgeworCWlmIChtKSBwZXJyb3Iocyk7CisJY2ttYWttc2coY2tta2RidWYsQ0tNQVhQQVRILHMsIjogIixja19lcnJzdHIoKSxOVUxMKTsKKwkqciA9IGNrbWtkYnVmOworICAgIH0gZWxzZSBpZiAoZmMgPT0gMCAmJiB6Zm5xZnAocyxDS01BWFBBVEgsY2tta2RidWYpKSB7CisJKnIgPSBja21rZGJ1ZjsKKyAgICB9IGVsc2UgaWYgKGZjICE9IDApIHsKKwlja21ha21zZyhja21rZGJ1ZixDS01BWFBBVEgscywiOiByZW1vdmVkIixOVUxMLE5VTEwpOworCSpyID0gY2tta2RidWY7CisgICAgfQorICAgIHJldHVybihyYyk7Cit9CisjZW5kaWYgLyogQ0tfTUtESVIgKi8KKworI2lmbmRlZiBOT1hGRVIJCQkJLyogUmVzdCBvZiB0aGlzIGZpbGUuLi4gKi8KKworI2lmbmRlZiBOT0RJU1BPCisjaWZkZWYgcGRwMTEKKyNkZWZpbmUgTk9ESVNQTworI2VuZGlmIC8qIHBkcGQxMSAqLworI2VuZGlmIC8qIE5PRElTUE8gKi8KKworZXh0ZXJuIGludCBwaXBlc2VuZDsKKyNpZmRlZiBQSVBFU0VORAorZXh0ZXJuIGNoYXIgKiogc25kZmlsdGVyOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKK2V4dGVybiBpbnQgdW5rY3MsIHdtYXgsIHdjdXIsIGRpc2NhcmQsIGJjdHUsIGJjdGwsIGxvY2FsLCBmZGlzcGxhLCB3aGF0LAorICBzZW5kbW9kZSwgb3BuZXJyLCBkZXN0LCBlcGt0cmN2ZCwgZXBrdHNlbnQsIGZpbGVzdGF0dXMsIGVvZm1ldGhvZCwgZGlzcG9zOworZXh0ZXJuIGxvbmcgc2VuZHN0YXJ0LCBjYWxpYnJhdGUsIGZuY252LCBmbnJwYXRoOworCitleHRlcm4gY2hhciAqIG9mbjI7CitleHRlcm4gY2hhciAqIHJmc3BlYywgKiBzZnNwZWMsICogcHJmc3BlYywgKiBwc2ZzcGVjLCAqIHJyZnNwZWMsICogcHJyZnNwZWM7CitleHRlcm4gY2hhciBvZm4xW107CitleHRlcm4gaW50IG9mbjF4OworZXh0ZXJuIGNoYXIgKiBvZnBlcm1zOworCisjaWZkZWYgVk1TCitleHRlcm4gaW50IGJhdGNoOworI2Vsc2UKK2V4dGVybiBpbnQgYmFja2dyZDsKKyNlbmRpZiAvKiBWTVMgKi8KKworZXh0ZXJuIGludCB4ZmxnLCByZW1maWxlLCByZW1hcHBkOworZXh0ZXJuIENIQVIgKmRhdGE7CitleHRlcm4gY2hhciBmaWxuYW1bXTsKKyNpZm5kZWYgTk9GUklMTFMKK2V4dGVybiBpbnQgcnByaW50Ziwgcm1haWxmOwkJLyogUkVNT1RFIE1BSUwsIFBSSU5UICovCitjaGFyIG9wdGJ1ZltPUFRCVUZMRU5dOwkJCS8qIE9wdGlvbnMgZm9yIE1BSUwgb3IgUkVNT1RFIFBSSU5UICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KK2V4dGVybiBpbnQgd3Nsb3RzOworZXh0ZXJuIGludCBmYmxrc2l6LCBmcmVjbCwgZm9yZywgZnJlY2ZtLCBmbmNhY3QsIGZuY3NhdiwgZmNjdHJsLCBsZl9vcHRzOworZXh0ZXJuIENIQVIgKiBzcnZjbWQ7CitleHRlcm4gaW50IHNydmNtZGxlbjsKKworZXh0ZXJuIGludCBiaW5hcnksIHNwc2l6OworZXh0ZXJuIGludCBwa3RudW0sIGN4c2VlbiwgY3pzZWVuLCBuZmlscywgc3RkaW5mOworZXh0ZXJuIGludCBtZW1zdHIsIHN0ZG91Ziwga2VlcCwgc25kc3JjLCBoY2ZsZzsKK2V4dGVybiBpbnQgc2VydmVyLCBlbl9jd2QsIGVuX21haSwgZW5fcHJpOworCisvKiBBdHRyaWJ1dGVzIGluL291dCBlbmFibGVkIGZsYWdzICovCisKK2V4dGVybiBpbnQKKyAgYXRlbmNpLCBhdGVuY28sIGF0ZGF0aSwgYXRkYXRvLCBhdGxlbmksIGF0bGVubywgYXRibGtpLCBhdGJsa28sCisgIGF0dHlwaSwgYXR0eXBvLCBhdHNpZGksIGF0c2lkbywgYXRzeXNpLCBhdHN5c28sIGF0ZGlzaSwgYXRkaXNvOworCisjaWZkZWYgQ0tfUEVSTVMKK2V4dGVybiBpbnQgYXRscHJpLCBhdGxwcm8sIGF0Z3ByaSwgYXRncHJvOworI2VuZGlmIC8qIENLX1BFUk1TICovCisKKyNpZmRlZiBTVFJBVFVTCitleHRlcm4gaW50IGF0ZnJtaSwgYXRmcm1vLCBhdGNyZWksIGF0Y3JlbywgYXRhY3RpLCBhdGFjdG87CisjZW5kaWYgLyogU1RSQVRVUyAqLworCisjaWZkZWYgZGF0YWdlbmVyYWwKK2V4dGVybiBpbnQgcXVpZXQ7CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKworZXh0ZXJuIGxvbmcgZnNpemUsIGZpbGNudCwgZmZjLCB0ZmM7CisKKyNpZm5kZWYgTk9DU0VUUworX1BST1RPVFlQIChWT0lEIHNldHhsYXRlLCAodm9pZCkpOworZXh0ZXJuIGludCB0Y2hhcnNldCwgZmNoYXJzZXQ7CitleHRlcm4gaW50IG50Y3NldHMsIHhsYXR5cGUsIHhmcnhsYTsKK2V4dGVybiBzdHJ1Y3QgY3NpbmZvIHRjc2luZm9bXSwgZmNzaW5mb1tdOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworLyogVmFyaWFibGVzIGdsb2JhbCB0byBLZXJtaXQgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSAqLworCisjaWZkZWYgQ0tYWENIQVIJCQkJLyogRE9VQkxFIC8gSUdOT1JFIGNoYXIgdGFibGUgKi8KK2ludCBkYmxmbGFnID0gMDsKK2ludCBpZ25mbGFnID0gMDsKK3Nob3J0IGRibHRbMjU2XSA9IHsKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwCit9OworI2VuZGlmIC8qIENLWFhDSEFSICovCisKK2ludCB3aW5sbzsJCQkJLyogcGFja2V0IG51bWJlciBhdCBsb3cgd2luZG93IGVkZ2UgICovCisKK2ludCBzYnVmbnVtOwkJCQkvKiBudW1iZXIgb2YgZnJlZSBidWZmZXJzICovCitpbnQgZHVtMDAxID0gMTIzNDsJCQkvKiBwcm90ZWN0aW9uLi4uICovCitpbnQgc2J1ZnVzZVtNQVhXU107CQkJLyogYnVmZmVyIGluLXVzZSBmbGFnICovCitpbnQgZHVtMDAzID0gMTExMTsKK2ludCByYnVmbnVtOwkJCQkvKiBudW1iZXIgb2YgZnJlZSBidWZmZXJzICovCitpbnQgZHVtMDAyID0gNDMyMTsJCQkvKiBtb3JlIHByb3RlY3Rpb24gKi8KK2ludCByYnVmdXNlW01BWFdTXTsJCQkvKiBidWZmZXIgaW4tdXNlIGZsYWcgKi8KK2ludCBzc2VxdGJsWzY0XTsJCQkvKiBzZXF1ZW5jZSAjIHRvIGJ1ZmZlciAjIHRhYmxlICovCitpbnQgcnNlcXRibFs2NF07CQkJLyogc2VxdWVuY2UgIyB0byBidWZmZXIgIyB0YWJsZSAqLworaW50IHNhY2t0YmxbNjRdOwkJCS8qIHNlcXVlbmNlICMgYWNrIHRhYmxlICovCisKK2ludCBvX2lzb3BlbiA9IDAsIGlfaXNvcGVuID0gMDsJCS8qIElucHV0ICYgb3V0cHV0IGZpbGVzIGFyZSBvcGVuICovCisKKyNpZmRlZiBEWU5BTUlDCitzdHJ1Y3QgcGt0aW5mbyAqc19wa3QgPSBOVUxMOwkJLyogYXJyYXkgb2YgcGt0aW5mbyBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgcGt0aW5mbyAqcl9wa3QgPSBOVUxMOwkJLyogYXJyYXkgb2YgcGt0aW5mbyBzdHJ1Y3R1cmVzICovCisjZWxzZQorc3RydWN0IHBrdGluZm8gc19wa3RbTUFYV1NdOwkJLyogYXJyYXkgb2YgcGt0aW5mbyBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgcGt0aW5mbyByX3BrdFtNQVhXU107CQkvKiBhcnJheSBvZiBwa3RpbmZvIHN0cnVjdHVyZXMgKi8KKyNlbmRpZiAvKiBEWU5BTUlDICovCisKKyNpZmRlZiBERUJVRworY2hhciB4YnVmWzIwMF07CQkJCS8qIEZvciBkZWJ1ZyBsb2dnaW5nICovCisjZW5kaWYgLyogREVCVUcgKi8KKworI2lmZGVmIERZTkFNSUMKK0NIQVIgKmJpZ3NidWYgPSBOVUxMLCAqYmlncmJ1ZiA9IE5VTEw7CisjZWxzZQorY2hhciBiaWdzYnRbOF07CQkJCS8qIFByb3RlY3Rpb24gKHNob3VsZG4ndCBuZWVkIHRoaXMpLiAqLworCQkJCQkvKiBCVVQgRE9OJ1QgUkVNT1ZFIElUISAqLworQ0hBUiBiaWdzYnVmW1NCU0laICsgNV07CQkvKiBTZW5kLXBhY2tldCBidWZmZXIgYXJlYSAqLworY2hhciBiaWdyYnRbOF07CQkJCS8qIFNhZmV0eSBwYWRkaW5nICovCitDSEFSIGJpZ3JidWZbUkJTSVogKyA1XTsJCS8qIFJlY2VpdmUtcGFja2V0IGFyZWEgKi8KKyNlbmRpZgoraW50IGJpZ3Nic2l6ID0gU0JTSVo7CQkJLyogU2l6ZXMgb2YgYmlnIHNlbmQgJiByY3YgYnVmZmVycy4gKi8KK2ludCBiaWdyYnNpeiA9IFJCU0laOworCisjaWZkZWYgVk1TCitpbnQgemNoa3BhdGgoY2hhciAqcyk7CisjZW5kaWYgLyogVk1TICovCisKKy8qIEZVTkNUSU9OUyAqLworCitWT0lECitkb2Zhc3QoKSB7CisgICAgbG9uZyBtYXhidWZzaXogPSBSQlNJWjsJCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworICAgIGludCBtYXhwa3RzaXogPSBNQVhTUDsKKyAgICBleHRlcm4gaW50IHNwc2l6ZiwJCQkvKiBGb3IgYnVnIGluIElSSVggVGVsbmV0IHNlcnZlciAqLworICAgICAgcnBzaXosIHVycHNpeiwgc3BzaXpyLCBzcG1heCwgd3Nsb3RyOworICAgIGV4dGVybiBzdHJ1Y3QgY2tfcCBwdGFiW107CisKKyAgICBpZiAobWF4cGt0c2l6IDwgNDApCQkJLyogTG9uZyBwYWNrZXQgbGVuZ3RoICovCisgICAgICBtYXhwa3RzaXogPSA0MDsKKyAgICBlbHNlIGlmIChtYXhwa3RzaXogPiA0MDAwKQorICAgICAgbWF4cGt0c2l6ID0gNDAwMDsKKyAgICB3c2xvdHIgPSBtYXhidWZzaXogLyBtYXhwa3RzaXo7CisgICAgaWYgKHdzbG90ciA+IE1BWFdTKQkJCS8qIFdpbmRvdyBzbG90cyAqLworICAgICAgd3Nsb3RyID0gTUFYV1M7CisgICAgaWYgKHdzbG90ciA+IDMwKQorICAgICAgd3Nsb3RyID0gMzA7CisgICAgZWxzZSBpZiAod3Nsb3RyIDwgMSkKKyAgICAgIHdzbG90ciA9IDE7CisgICAgdXJwc2l6ID0gYWRqcGtsKG1heHBrdHNpeix3c2xvdHIsbWF4YnVmc2l6KTsKKyAgICBwdGFiW1BST1RPX0tdLnJwa3RsZW4gPSB1cnBzaXo7CisgICAgcnBzaXogPSAodXJwc2l6ID4gOTQpID8gOTQgOiB1cnBzaXo7IC8qIE1heCBub24tbG9uZyBwYWNrZXQgbGVuZ3RoICovCisgICAgZGVidWcoRjExMSwiZG9mYXN0IiwidXByc2l6Iix1cnBzaXopOworI2lmZGVmIElSSVgKKyNpZm5kZWYgSVJJWDY1CisgICAgLyogSVJJWCBUZWxuZXQgc2VydmVyIGNob3BzIG9mZiB3cml0ZXMgbG9uZ2VyIHRoYW4gNEsgKi8KKyAgICBzcHNpeiA9IHNwbWF4ID0gc3BzaXpyID0gdXJwc2l6OworICAgIGRlYnVnKEYxMDEsImRvYXJnIFEgSVJJWCBzcHNpeiIsIiIsc3BzaXopOworICAgIHNwc2l6ZiA9IDE7CisjZW5kaWYgLyogSVJJWDY1ICovCisjZW5kaWYgLyogSVJJWCAqLworI2lmZGVmIENLX1NQRUVECisgICAgc2V0cHJlZml4KFBYX0NBVSk7CQkJLyogQ2F1dGlvdXMgdW5wcmVmaXhpbmcgKi8KKyNlbmRpZiAvKiBDS19TUEVFRCAqLworfQorCisKKy8qIEZvciBzYW5pdHksIHVzZSAiaSIgZm9yIGJ1ZmZlciBzbG90cywgIm4iIGZvciBwYWNrZXQgbnVtYmVycy4gKi8KKworLyogSSBOIEkgQiBVIEYgUyAqLworCisvKgorICBBbGxvY2F0ZXMgdGhlIGJpZyBzZW5kIGFuZCByZWNlaXZlIGJ1ZmZlcnMuCisgIENhbGwgd2l0aCBzaXplIGZvciBiaWcgc2VuZCBidWZmZXIgKHMpIGFuZCByZWNlaXZlIGJ1ZmZlciAocikuCisgIFRoZXNlIHNpemVzIGNhbiBiZSBkaWZmZXJlbnQuCisgIEF0dGVtcHRzIHRvIGFsbG9jYXRlIGJ1ZmZlcnMgb2YgdGhlIHJlcXVlc3RlZCBzaXplLCBidXQgaWYgaXQgY2FuJ3QsCisgIGl0IHdpbGwgYWxsb2NhdGUgc21hbGxlciBvbmVzLgorICBTZXRzIGdsb2JhbCB2YXJpYWJsZXMgYmlnc2JzaXogYW5kIGJpZ3Jic2l6IHRvIHRoZSBhY3R1YWwgc2l6ZXMsCisgIGFuZCBiaWdzYnVmIGFuZCBiaWdyYnVmIHBvaW50aW5nIHRvIHRoZSBhY3R1YWwgYnVmZmVycy4KKyAgRGVzaWduZWQgdG8gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgorICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyovCisKK0NIQVIgKmJpZ2J1ZnAgPSBOVUxMOworCitpbnQKK2luaWJ1ZnMocyxyKSBpbnQgcywgcjsgeworI2lmZGVmIERZTkFNSUMKKyAgICB1bnNpZ25lZAorICAgICAgaW50IHNpemU7CisjaWZkZWYgT1MyCisgICAgdW5zaWduZWQJCS8qIERvbid0IHlvdSB3aXNoIGV2ZXJ5Ym9keSBoYWQgdW5zaWduZWQgbG9uZy4uLiAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgbG9uZyB6OworICAgIGludCB4OworCisgICAgZGVidWcoRjEwMSwiaW5pYnVmcyBzIiwiIixzKTsKKyAgICBkZWJ1ZyhGMTAxLCJpbmlidWZzIHIiLCIiLHIpOworCisgICAgaWYgKHMgPCA4MCB8fCByIDwgODApIHJldHVybigtMSk7CS8qIFZhbGlkYXRlIGFyZ3VtZW50cy4gKi8KKworICAgIGlmICghc19wa3QpIHsJCQkvKiBBbGxvY2F0ZSBwYWNrZXQgaW5mbyBzdHJ1Y3R1cmVzICovCisJaWYgKCEoc19wa3QgPSAoc3RydWN0IHBrdGluZm8gKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGt0aW5mbykqTUFYV1MpKSkKKwkgIGZhdGFsKCJpbmlfcGt0czogbm8gbWVtb3J5IGZvciBzX3BrdCIpOworICAgIH0KKyAgICBmb3IgKHggPSAwOyB4IDwgTUFYV1M7IHgrKykKKyAgICAgIHNfcGt0W3hdLnBrX2FkciA9IE5VTEw7CQkvKiBJbml0aWFsaXplIGFkZHJlc3NlcyAqLworCisgICAgaWYgKCFyX3BrdCkgeworCWlmICghKHJfcGt0ID0gKHN0cnVjdCBwa3RpbmZvICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHBrdGluZm8pKk1BWFdTKSkpCisJICBmYXRhbCgiaW5pX3BrdHM6IG5vIG1lbW9yeSBmb3Igc19wa3QiKTsKKyAgICB9CisgICAgZm9yICh4ID0gMDsgeCA8IE1BWFdTOyB4KyspCisgICAgICByX3BrdFt4XS5wa19hZHIgPSBOVUxMOwkJLyogSW5pdGlhbGl6ZSBhZGRyZXNzZXMgKi8KKworICAgIGlmICghc3J2Y21kKSB7CQkJLyogQWxsb2NhdGUgc3J2Y21kIGJ1ZmZlciAqLworCXNydmNtZCA9IChDSEFSICopIG1hbGxvYyhyICsgMTAwKTsKKwlpZiAoIXNydmNtZCkgcmV0dXJuKC0xKTsKKwlzcnZjbWRsZW4gPSByICsgOTk7CisJKnNydmNtZCA9IE5VTDsKKyAgICB9CisgICAgaWYgKGJpZ2J1ZnApIHsJCQkvKiBGcmVlIHByZXZpb3VzIGJ1ZmZlcnMsIGlmIGFueS4gKi8KKwlmcmVlKGJpZ2J1ZnApOworCWJpZ2J1ZnAgPSBOVUxMOworICAgIH0KKyAgICBzaXplID0gcyArIHIgKyA0MDsJCQkvKiBDb21iaW5lZCByZXF1ZXN0ZWQgc2l6ZSArIHBhZGRpbmcgKi8KKyAgICB6ICA9ICh1bnNpZ25lZCkgcyArICh1bnNpZ25lZCkgciArIDQwOworICAgIGRlYnVnKEYxMDEsImluaWJ1ZnMgc2l6ZSAxIiwiIixzaXplKTsKKyAgICBkZWJ1ZyhGMTAxLCJpbmlidWZzIHNpemUgeiIsIiIseik7CisgICAgaWYgKChsb25nKSBzaXplICE9IHopIHsKKwlkZWJ1ZyhGMTAwLCJpbmlidWZzIG92ZXJmbG93IiwiIiwwKTsKKwlzaXplID0gNjU1MzU7CisgICAgfQorCisgICAgLyogVHJ5IHRvIGdldCB0aGUgc3BhY2UuICBJZiBtYWxsb2MgZmFpbHMsIHRyeSB0byBnZXQgYSBsaXR0bGUgbGVzcy4gKi8KKyAgICAvKiAoT2J2aW91c2x5LCB0aGlzIGFsZ29yaXRobSBjYW4gYmUgcmVmaW5lZC4pICovCisKKyAgICB3aGlsZSAoIShiaWdidWZwID0gKENIQVIgKikgbWFsbG9jKHNpemUpKSkgeworCWRlYnVnKEYxMDEsImluaWJ1ZnMgYmlnYnVmIG1hbGxvYyBmYWlsZWQiLCIiLHNpemUpOworCXNpemUgPSAoc2l6ZSAqIDIpIC8gMzsJCS8qIEZhaWxlZCwgY3V0IHNpemUgYnkgMS8zLiAqLworCWlmIChzaXplIDwgMjAwKQkJCS8qIFRyeSBhZ2FpbiB1bnRpbCB0b28gc21hbGwuICovCisJICByZXR1cm4oLTEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJpbmlidWZzIHNpemUgMiIsIiIsc2l6ZSk7IC8qIE9LLCB3ZSBnb3Qgc29tZSBzcGFjZS4gKi8KKworLyoKKyAgTm93IGRpdmlkZSB0aGUgYWxsb2NhdGVkIHNwYWNlIGJldHdlZW4gdGhlIHNlbmQgYW5kIHJlY2VpdmUgYnVmZmVycyBpbiB0aGUKKyAgcmVxdWVzdGVkIHByb3BvcnRpb24uICBUaGUgbmF0dXJhbCBmb3JtdWxhIHdvdWxkIGJlIChzIC8gKHMgKyByKSkgKiBzaXplCisgIChmb3IgdGhlIHNlbmQgYnVmZmVyKSwgYnV0IHRoYXQgZG9lc24ndCB3b3JrIHdpdGggaW50ZWdlciBhcml0aG1ldGljIGFuZCB3ZQorICBjYW4ndCB1c2UgZmxvYXRpbmcgcG9pbnQgYmVjYXVzZSBzb21lIG1hY2hpbmVzIGRvbid0IGhhdmUgaXQuICBUaGlzIGNhbiBiZQorICByZWFycmFuZ2VkIGFzIChzICogc2l6ZSkgLyAocyArIHIpLiAgQnV0IChzICogc2l6ZSkgY2FuIGJlIFZFUlkgbGFyZ2UsIHRvbworICBsYXJnZSBmb3IgMzIgYml0cy4gIFNvIGxldCdzIGRvIGl0IHRoaXMgd2F5LiAgVGhpcyBhcml0aG1ldGljIHdvcmtzIGZvcgorICBidWZmZXIgc2l6ZXMgdXAgdG8gYWJvdXQgNSwwMDAsMDAwLgorKi8KKyNkZWZpbmUgRkFDVE9SIDIwTAorICAgIHogPSAoIChsb25nKSBzICogRkFDVE9SICkgLyAoIChsb25nKSBzICsgKGxvbmcpIHIgKTsKKyAgICB4ID0gKCB6ICogKCAobG9uZykgc2l6ZSAvIEZBQ1RPUiApICk7CisgICAgaWYgKHggPCAwKSByZXR1cm4oLTEpOwkJLyogQ2F0Y2ggb3ZlcmZsb3cgKi8KKworICAgIGJpZ3Nic2l6ID0geCAtIDU7CQkJLyogU2l6ZSBvZiBzZW5kIGJ1ZmZlciAqLworICAgIGJpZ3NidWYgPSBiaWdidWZwOwkJCS8qIEFkZHJlc3Mgb2Ygc2VuZCBidWZmZXIgKi8KKyAgICBkZWJ1ZyhGMTAxLCJpbmlidWZzIGJpZ3Nic2l6IiwiIixiaWdzYnNpeik7CisKKyAgICBiaWdyYnNpeiA9IHNpemUgLSB4IC0gNTsJCS8qIFNpemUgb2YgcmVjZWl2ZSBidWZmZXIgKi8KKyAgICBiaWdyYnVmID0gYmlnYnVmcCArIHg7CQkvKiBBZGRyZXNzcyBvZiByZWNlaXZlIGJ1ZmZlciAqLworICAgIGRlYnVnKEYxMDEsImluaWJ1ZnMgYmlncmJzaXoiLCIiLGJpZ3Jic2l6KTsKKworICAgIHJldHVybigwKTsJCQkJLyogU3VjY2VzcyAqLworI2Vsc2UJCQkJCS8qIE5vIGR5bmFtaWMgYWxsb2NhdGlvbiAqLworICAgIGJpZ3Nic2l6ID0gU0JTSVo7CQkJLyogSnVzdCB1c2UgdGhlIHN5bWJvbHMgKi8KKyAgICBiaWdyYnNpeiA9IFJCU0laOwkJCS8qIC4uLiAqLworICAgIHJldHVybigwKTsJCQkJLyogU3VjY2Vzcy4gKi8KKyNlbmRpZiAvKiBEWU5BTUlDICovCit9CisKKworLyogTSBBIEsgRSBCIFUgRiAgLS0gIE1ha2VzIGFuZCBjbGVhcnMgYSBuZXcgYnVmZmVycy4gICovCisKKy8qIENhbGwgd2l0aDogKi8KKy8qICBzbG90czogIG51bWJlciBvZiBidWZmZXIgc2xvdHMgdG8gbWFrZSwgMSB0byAzMiAqLworLyogIGJ1ZnNpejogc2l6ZSBvZiB0aGUgYmlnIGJ1ZmZlciAqLworLyogIGJ1ZjogICAgYWRkcmVzcyBvZiB0aGUgYmlnIGJ1ZmZlciAqLworLyogIHh4OiAgICAgcG9pbnRlciB0byBhcnJheSBvZiBwa3RpbmZvIHN0cnVjdHVyZXMgZm9yIHRoZXNlIGJ1ZmZlcnMgKi8KKworLyogU3ViZGl2aWRlcyB0aGUgYmlnIGJ1ZmZlciBpbnRvICJzbG90cyIgYnVmZmVycy4gKi8KKworLyogUmV0dXJuczogKi8KKy8qICAtMSBpZiB0b28gbWFueSBvciB0b28gZmV3IHNsb3RzIHJlcXVlc3RlZCwgICAgICovCisvKiAgLTIgaWYgc2xvdHMgd291bGQgYmUgdG9vIHNtYWxsLiAgICAgICovCisvKiAgIG4gKHBvc2l0aXZlKSBvbiBzdWNjZXNzID0gc2l6ZSBvZiBvbmUgYnVmZmVyLiAqLworLyogICB3aXRoIHBrdGluZm8gc3RydWN0dXJlIGluaXRpYWxpemVkIGZvciB0aGlzIHNldCBvZiBidWZmZXJzLiAqLworCitpbnQKK21ha2VidWYoc2xvdHMsYnVmc2l6LGJ1Zix4eCkKKy8qIG1ha2VidWYgKi8gaW50IHNsb3RzLCBidWZzaXo7IENIQVIgYnVmW107IHN0cnVjdCBwa3RpbmZvICp4eDsgeworCisgICAgQ0hBUiAqYTsKKyAgICBpbnQgaSwgc2l6ZTsKKworICAgIGRlYnVnKEYxMDEsIm1ha2VidWYiLCIiLHNsb3RzKTsKKyAgICBkZWJ1ZyhGMTAxLCJtYWtlYnVmIGJ1ZnNpeiIsIiIsYnVmc2l6KTsKKyAgICBkZWJ1ZyhGMTAxLCJtYWtlYnVmIE1BWFdTIiwiIixNQVhXUyk7CisKKyAgICBpZiAoc2xvdHMgPiBNQVhXUyB8fCBzbG90cyA8IDEpIHJldHVybigtMSk7CisgICAgaWYgKGJ1ZnNpeiA8IHNsb3RzICogMTAgKSByZXR1cm4oLTIpOworCisgICAgc2l6ZSA9IGJ1ZnNpeiAvIHNsb3RzOwkJLyogRGl2aWRlIHVwIHRoZSBiaWcgYnVmZmVyLiAqLworICAgIGEgPSBidWY7CQkJCS8qIEFkZHJlc3Mgb2YgZmlyc3QgcGllY2UuICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2xvdHM7IGkrKykgeworCXN0cnVjdCBwa3RpbmZvICp4ID0gJnh4W2ldOworCXgtPmJmX2FkciA9IGE7CQkJLyogQWRkcmVzcyBvZiB0aGlzIGJ1ZmZlciAqLworCXgtPmJmX2xlbiA9IHNpemU7CQkvKiBMZW5ndGggb2YgdGhpcyBidWZmZXIgKi8KKwl4LT5wa19sZW4gPSAwOwkJCS8qIExlbmd0aCBvZiBkYXRhIGZpZWxkICovCisgICAgICAgIHgtPnBrX3R5cCA9ICcgJzsJCS8qIHBhY2tldCB0eXBlICovCisJeC0+cGtfc2VxID0gLTE7CQkJLyogcGFja2V0IHNlcXVlbmNlIG51bWJlciAqLworICAgICAgICB4LT5wa19ydHIgPSAwOwkJCS8qIHJldHJhbnNtaXNzaW9ucyAqLworCSphID0gJ1wwJzsJCQkvKiBDbGVhciB0aGUgYnVmZmVyICovCisJYSArPSBzaXplOwkJCS8qIFBvc2l0aW9uIHRvIG5leHQgYnVmZmVyIHNsb3QgKi8KKyAgICB9CisgICAgcmV0dXJuKHNpemUpOworfQorCisvKiAgTSBBIEsgUyBCIFUgRiAgLS0gIE1ha2VzIHRoZSBzZW5kLXBhY2tldCBidWZmZXIgICovCisKK2ludAorbWtzYnVmKHNsb3RzKSBpbnQgc2xvdHM7IHsKKyAgICBpbnQgaSwgeDsKKyAgICBzYnVmbnVtID0gMDsKKyAgICBpZiAoKHggPSBtYWtlYnVmKHNsb3RzLGJpZ3Nic2l6LGJpZ3NidWYsc19wa3QpKSA8IDApIHsKKwlkZWJ1ZyhGMTAxLCJta3NidWYgbWFrZWJ1ZiByZXR1cm4iLCIiLHgpOworCXJldHVybih4KTsKKyAgICB9CisgICAgZGVidWcoRjEwMSwibWtzYnVmIG1ha2VidWYgcmV0dXJuIiwiIix4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewkJLyogSW5pdGlhbGl6ZSBzZXF1ZW5jZS1udW1iZXItICovCisJc3NlcXRibFtpXSA9IC0xOwkJLyogdG8tYnVmZmVyLW51bWJlciB0YWJsZS4gKi8KKyAgICAgICAgc2Fja3RibFtpXSA9IDA7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBNQVhXUzsgaSsrKQorICAgICAgc2J1ZnVzZVtpXSA9IDA7CQkJLyogTWFyayBlYWNoIGJ1ZmZlciBhcyBmcmVlICovCisgICAgc2J1Zm51bSA9IHNsb3RzOworICAgIHdjdXIgPSAwOworICAgIHJldHVybih4KTsKK30KKworLyogIE0gQSBLIFIgQiBVIEYgIC0tICBNYWtlcyB0aGUgcmVjZWl2ZS1wYWNrZXQgYnVmZmVyICAqLworCitpbnQKK21rcmJ1ZihzbG90cykgaW50IHNsb3RzOyB7CisgICAgaW50IGksIHg7CisgICAgcmJ1Zm51bSA9IDA7CisgICAgaWYgKCh4ID0gbWFrZWJ1ZihzbG90cyxiaWdyYnNpeixiaWdyYnVmLHJfcGt0KSkgPCAwKSB7CisJZGVidWcoRjEwMSwibWtyYnVmIG1ha2VidWYgcmV0dXJuIiwiIix4KTsKKwlyZXR1cm4oeCk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsIm1rcmJ1ZiBtYWtlYnVmIHJldHVybiIsIiIseCk7CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsJCS8qIEluaXRpYWxpemUgc2VxdWVuY2UtbnVtYmVyLSAqLworCXJzZXF0YmxbaV0gPSAtMTsJCS8qIHRvLWJ1ZmZlci1udW1iZXIgdGFibGUuICovCisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBNQVhXUzsgaSsrKQorICAgICAgcmJ1ZnVzZVtpXSA9IDA7CQkJLyogTWFyayBlYWNoIGJ1ZmZlciBhcyBmcmVlICovCisgICAgcmJ1Zm51bSA9IHNsb3RzOworICAgIHdjdXIgPSAwOworICAgIHJldHVybih4KTsKK30KKworLyogIFcgSSBOIEQgTyBXICAtLSAgUmVzaXplIHRoZSB3aW5kb3cgdG8gbiAgKi8KKworaW50Cit3aW5kb3cobikgaW50IG47IHsKKyAgICBkZWJ1ZyhGMTAxLCJ3aW5kb3ciLCIiLG4pOworICAgIGlmIChuIDwgMSB8fCBuID4gTUFYV1MpIHJldHVybigtMSk7CisgICAgaWYgKG1rc2J1ZihuKSA8IDApIHJldHVybigtMSk7CisgICAgaWYgKG1rcmJ1ZihuKSA8IDApIHJldHVybigtMSk7CisgICAgd3Nsb3RzID0gbjsKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIGR1bXBzYnVmKCk7CisgICAgaWYgKGRlYmxvZykgZHVtcHJidWYoKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJldHVybigwKTsKK30KKworLyogIEcgRSBUIFMgQiBVIEYgIC0tICBBbGxvY2F0ZSBhIHNlbmQtYnVmZmVyLiAgKi8KKworLyogIENhbGwgd2l0aCBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IuICovCisvKiAgUmV0dXJuczogKi8KKy8qICAgLTQgaWYgYXJndW1lbnQgaXMgaW52YWxpZCAobmVnYXRpdmUsIG9yIGdyZWF0ZXIgdGhhbiA2MykgKi8KKy8qICAgLTMgaWYgYnVmZmVycyB3ZXJlIHRob3VnaHQgdG8gYmUgYXZhaWxhYmxlIGJ1dCByZWFsbHkgd2VyZW4ndCAoYnVnISkgKi8KKy8qICAgLTIgaWYgdGhlIG51bWJlciBvZiBmcmVlIGJ1ZmZlcnMgaXMgbmVnYXRpdmUgKGJ1ZyEpICovCisvKiAgIC0xIGlmIG5vIGZyZWUgYnVmZmVycy4gKi8KKy8qICAgMCBvciBwb3NpdGl2ZSwgcGFja2V0IHNlcXVlbmNlIG51bWJlciwgd2l0aCBidWZmZXIgYWxsb2NhdGVkIGZvciBpdC4gKi8KKworaW50CitnZXRzYnVmKG4pIGludCBuOyB7CQkJLyogQWxsb2NhdGUgYSBzZW5kLWJ1ZmZlciAqLworICAgIGludCBpOworICAgIENIQVIgKiBwID0gTlVMTDsKKyAgICBpZiAobiA8IDAgfHwgbiA+IDYzKSB7CisJZGVidWcoRjEwMSwiZ2V0c2J1ZiBiYWQgYXJnIiwiIixuKTsKKwlyZXR1cm4oLTQpOwkvKiBCYWQgYXJndW1lbnQgKi8KKyAgICB9CisgICAgZGVidWcoRjEwMSwiZ2V0c2J1ZiBwYWNrZXQiLCIiLG4pOworICAgIC8qIGRlYnVnKEYxMDEsImdldHNidWYsIHNidWZudW0iLCIiLHNidWZudW0pOyAqLworICAgIGlmIChzYnVmbnVtID09IDApIHJldHVybigtMSk7CS8qIE5vIGZyZWUgYnVmZmVycy4gKi8KKyAgICBpZiAoc2J1Zm51bSA8IDApIHJldHVybigtMik7CS8qIFNob3VsZG4ndCBoYXBwZW4uICovCisgICAgZm9yIChpID0gMDsgaSA8IHdzbG90czsgaSsrKQkvKiBGaW5kIHRoZSBmaXJzdCBvbmUgbm90IGluIHVzZS4gKi8KKyAgICAgIGlmIChzYnVmdXNlW2ldID09IDApIHsJCS8qIEdvdCBvbmU/ICovCisJICBzYnVmdXNlW2ldID0gMTsJCS8qIE1hcmsgaXQgYXMgaW4gdXNlLiAqLworCSAgc2J1Zm51bS0tOwkJCS8qIE9uZSBsZXNzIGZyZWUgYnVmZmVyLiAqLworCSAgKnNfcGt0W2ldLmJmX2FkciA9ICdcMCc7CS8qIFplcm8gdGhlIGJ1ZmZlciBkYXRhIGZpZWxkICovCisJICBzX3BrdFtpXS5wa19zZXEgPSBuOwkJLyogUHV0IGluIHRoZSBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICAgICAgICBzc2VxdGJsW25dID0gaTsJCS8qIEJhY2sgcG9pbnRlciBmcm9tIHNlcXVlbmNlIG51bWJlciAqLworICAgICAgICAgIHNhY2t0Ymxbbl0gPSAwOwkJLyogQUNLIGZsYWcgKi8KKwkgIHNfcGt0W2ldLnBrX2xlbiA9IDA7CQkvKiBEYXRhIGZpZWxkIGxlbmd0aCBub3cgemVyby4gKi8KKwkgIHNfcGt0W2ldLnBrX3R5cCA9ICcgJzsJLyogQmxhbmsgdGhlIHBhY2tldCB0eXBlIHRvby4gKi8KKwkgIHNfcGt0W2ldLnBrX3J0ciA9IDA7CQkvKiBaZXJvIHRoZSByZXRyYW5zbWlzc2lvbiBjb3VudCAqLworCSAgcCA9IHNfcGt0W2ldLmJmX2FkciArIDc7CS8qIFNldCBnbG9iYWwgImRhdGEiIGFkZHJlc3MuICovCisJICBkZWJ1ZyhGMTAxLCJnZXRzYnVmIHAiLCIiLDApOworCSAgZGF0YSA9IHA7CisJICBpZiAoIWRhdGEpIHsKKwkgICAgICBkZWJ1ZyhGMTAwLCJnZXRzYnVmIGRhdGEgPT0gTlVMTCIsIiIsMCk7CisgICAgICAgICAgICAgIHJldHVybigtMyk7CisgICAgICAgICAgfQorCSAgaWYgKCh3aGF0ICYgKFdfU0VORHxXX1JFTU8pKSAmJiAoKyt3Y3VyID4gd21heCkpCisJICAgIHdtYXggPSB3Y3VyOwkJLyogRm9yIHN0YXRpc3RpY3MuICovCisJICAvKiBkZWJ1ZyhGMTAxLCJnZXRzYnVmIHdjdXIiLCIiLHdjdXIpOyAqLworCSAgcmV0dXJuKG4pOwkJCS8qIFJldHVybiBpdHMgaW5kZXguICovCisgICAgICB9CisgICAgc2J1Zm51bSA9IDA7CQkJLyogRGlkbid0IGZpbmQgb25lLiAqLworICAgIHJldHVybigtMyk7CQkJCS8qIFNob3VsZG4ndCBoYXBwZW4hICovCit9CisKK2ludAorZ2V0cmJ1ZigpIHsJCQkJLyogQWxsb2NhdGUgYSByZWNlaXZlIGJ1ZmZlciAqLworICAgIGludCBpOworI2lmZGVmIENPTU1FTlQKKyAgICAvKiBUaGlzIGNvZGUgaXMgcHJldHR5IHN0YWJsZSBieSBub3cuLi4gKi8KKyAgICAvKiBMb29rcyBsaWtlIHdlIG1pZ2h0IG5lZWQgdGhpcyBhZnRlciBhbGwgKi8KKyAgICBkZWJ1ZyhGMTAxLCJnZXRyYnVmIHJidWZudW0iLCIiLHJidWZudW0pOworICAgIGRlYnVnKEYxMDEsImdldHJidWYgd3Nsb3RzIiwiIix3c2xvdHMpOworICAgIGRlYnVnKEYxMDEsImdldHJidWYgZHVtMDAyIiwiIixkdW0wMDIpOworICAgIGRlYnVnKEYxMDEsImdldHJidWYgZHVtMDAzIiwiIixkdW0wMDMpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBpZiAocmJ1Zm51bSA9PSAwKSByZXR1cm4oLTEpOwkvKiBObyBmcmVlIGJ1ZmZlcnMuICovCisgICAgaWYgKHJidWZudW0gPCAwKSByZXR1cm4oLTIpOwkvKiBTaG91bGRuJ3QgaGFwcGVuLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCB3c2xvdHM7IGkrKykJLyogRmluZCB0aGUgZmlyc3Qgb25lIG5vdCBpbiB1c2UuICovCisgICAgICBpZiAocmJ1ZnVzZVtpXSA9PSAwKSB7CQkvKiBHb3Qgb25lPyAqLworCSAgcmJ1ZnVzZVtpXSA9IDE7CQkvKiBNYXJrIGl0IGFzIGluIHVzZS4gKi8KKwkgICpyX3BrdFtpXS5iZl9hZHIgPSAnXDAnOwkvKiBaZXJvIHRoZSBidWZmZXIgZGF0YSBmaWVsZCAqLworCSAgcmJ1Zm51bS0tOwkJCS8qIE9uZSBsZXNzIGZyZWUgYnVmZmVyLiAqLworCSAgZGVidWcoRjEwMSwiZ2V0cmJ1ZiBuZXcgcmJ1Zm51bSIsIiIscmJ1Zm51bSk7CisJICBpZiAoKHdoYXQgJiBXX1JFQ1YpICYmICgrK3djdXIgPiB3bWF4KSkKKwkgICAgd21heCA9IHdjdXI7CQkvKiBGb3Igc3RhdGlzdGljcy4gKi8KKwkgIC8qIGRlYnVnKEYxMDEsImdldHJidWYgd2N1ciIsIiIsd2N1cik7ICovCisJICByZXR1cm4oaSk7CQkJLyogUmV0dXJuIGl0cyBpbmRleC4gKi8KKyAgICAgIH0KKyAgICAvKiBkZWJ1ZyhGMTAxLCJnZXRyYnVmIGZvdWx1cCIsIiIsaSk7ICovCisgICAgcmJ1Zm51bSA9IDA7CQkJLyogRGlkbid0IGZpbmQgb25lLiAqLworICAgIHJldHVybigtMyk7CQkJCS8qIFNob3VsZG4ndCBoYXBwZW4hICovCit9CisKKy8qICBGIFIgRSBFIFMgQiBVIEYgIC0tICBGcmVlIHNlbmQtYnVmZmVyIGZvciBnaXZlbiBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyICovCisKKy8qICBSZXR1cm5zOiAgKi8KKy8qICAgMSB1cG9uIHN1Y2Nlc3MgICovCisvKiAgLTEgaWYgc3BlY2lmaWVkIGJ1ZmZlciBkb2VzIG5vdCBleGlzdCAqLworCitpbnQKK2ZyZWVzYnVmKG4pIGludCBuOyB7CQkJLyogUmVsZWFzZSBzZW5kLWJ1ZmZlciBmb3IgcGFja2V0IG4uICovCisgICAgaW50IGk7CisKKyAgICBkZWJ1ZyhGMTAxLCJmcmVlc2J1ZiIsIiIsbik7CisgICAgaWYgKG4gPCAwIHx8IG4gPiA2MykJCS8qIE5vIHN1Y2ggcGFja2V0LiAqLworICAgICAgcmV0dXJuKC0xKTsKKyAgICBpID0gc3NlcXRibFtuXTsJCQkvKiBHZXQgdGhlIHdpbmRvdyBzbG90IG51bWJlci4gKi8KKyAgICBpZiAoaSA+IC0xICYmIGkgPD0gd3Nsb3RzKSB7CisJc3NlcXRibFtuXSA9IC0xOwkJLyogSWYgdmFsaWQsIHJlbW92ZSBmcm9tIHNlcXRibCAqLworIAlzYnVmbnVtKys7CQkJLyogYW5kIGNvdW50IG9uZSBtb3JlIGZyZWUgYnVmZmVyICovCisJc2J1ZnVzZVtpXSA9IDA7CQkJLyogYW5kIG1hcmsgaXQgYXMgZnJlZSwgKi8KKwlpZiAod2hhdCAmIChXX1NFTkR8V19SRU1PKSkJLyogZGVjcmVtZW50IGFjdGl2ZSBzbG90cyAqLworCSAgd2N1ci0tOwkJCS8qIGZvciBzdGF0aXN0aWNzIGFuZCBkaXNwbGF5LiAqLworICAgIH0gZWxzZSB7CisJZGVidWcoRjEwMSwiIHNzZXF0Ymxbbl0iLCIiLHNzZXF0Ymxbbl0pOworCXJldHVybigtMSk7CisgICAgfQorCisvKiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgb25seSBzbyBkdW1wZWQgYnVmZmVycyB3aWxsIGxvb2sgcmlnaHQuICovCisKKyAgICBpZiAoMSkgeworCSpzX3BrdFtpXS5iZl9hZHIgPSAnXDAnOwkvKiBaZXJvIHRoZSBidWZmZXIgZGF0YSBmaWVsZCAqLworCXNfcGt0W2ldLnBrX3NlcSA9IC0xOwkJLyogSW52YWxpZGF0ZSB0aGUgc2VxdWVuY2UgbnVtYmVyICovCisJc19wa3RbaV0ucGtfbGVuID0gMDsJCS8qIERhdGEgZmllbGQgbGVuZ3RoIG5vdyB6ZXJvLiAqLworCXNfcGt0W2ldLnBrX3R5cCA9ICcgJzsJCS8qIEJsYW5rIHRoZSBwYWNrZXQgdHlwZSB0b28uICovCisJc19wa3RbaV0ucGtfcnRyID0gMDsJCS8qIEFuZCB0aGUgcmV0cmllcyBmaWVsZC4gKi8KKyAgICB9CisgICAgcmV0dXJuKDEpOworfQorCitpbnQKK2ZyZWVyYnVmKGkpIGludCBpOyB7CQkJLyogUmVsZWFzZSByZWNlaXZlLWJ1ZmZlciBzbG90ICJpIi4gKi8KKyAgICBpbnQgbjsKKworLyogTk9URSAhISBDdXJyZW50bHksIHRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIGluZGljYXRlZCBidWZmZXIsIGJ1dCAqLworLyogZG9lcyBOT1QgZXJhc2UgdGhlIGRhdGEuICBUaGUgcHJvZ3JhbSBjb3VudHMgb24gdGhpcy4gIFdpbGwgZmluZCBhICovCisvKiBiZXR0ZXIgd2F5IGxhdGVyLi4uLiAqLworCisgICAgLyogZGVidWcoRjEwMSwiZnJlZXJidWYsIHNsb3QiLCIiLGkpOyAqLworICAgIGlmIChpIDwgMCB8fCBpID49IHdzbG90cykgewkJLyogTm8gc3VjaCBzbG90LiAqLworCWRlYnVnKEYxMDEsImZyZWVyYnVmIG5vIHN1Y2ggc2xvdCIsIiIsaSk7CisJcmV0dXJuKC0xKTsKKyAgICB9CisgICAgbiA9IHJfcGt0W2ldLnBrX3NlcTsJCS8qIEdldCB0aGUgcGFja2V0IHNlcXVlbmNlIG51bWJlciAqLworICAgIGRlYnVnKEYxMDEsImZyZWVyYnVmIHBhY2tldCIsIiIsbik7CisgICAgaWYgKG4gPiAtMSAmJiBuIDwgNjQpCQkvKiBJZiB2YWxpZCwgcmVtb3ZlIGZyb20gc2VxdGJsICovCisgICAgICByc2VxdGJsW25dID0gLTE7CisgICAgaWYgKHJidWZ1c2VbaV0gIT0gMCkgewkJLyogSWYgcmVhbGx5IGFsbG9jYXRlZCwgKi8KKwlyYnVmdXNlW2ldID0gMDsJCQkvKiBtYXJrIGl0IGFzIGZyZWUsICovCisJcmJ1Zm51bSsrOwkJCS8qIGFuZCBjb3VudCBvbmUgbW9yZSBmcmVlIGJ1ZmZlci4gKi8KKwlpZiAod2hhdCAmIFdfUkVDVikJCS8qIEtlZXAgdHJhY2sgb2YgY3VycmVudCBzbG90cyAqLworCSAgd2N1ci0tOwkJCS8qICBmb3Igc3RhdGlzdGljcyBhbmQgZGlzcGxheSAqLworCWRlYnVnKEYxMDEsImZyZWVyYnVmIHJidWZudW0iLCIiLHJidWZudW0pOworICAgIH0KKworLyogVGhlIGZvbGxvd2luZyBpcyBkb25lIG9ubHkgc28gZHVtcGVkIGJ1ZmZlcnMgd2lsbCBsb29rIHJpZ2h0LiAqLworCisgICAgaWYgKDEpIHsKKyAgICAgLyogKnJfcGt0W2ldLmJmX2FkciA9ICdcMCc7ICovCS8qIFplcm8gdGhlIGJ1ZmZlciBkYXRhIGZpZWxkICovCisJcl9wa3RbaV0ucGtfc2VxID0gLTE7CQkvKiBBbmQgZnJvbSBwYWNrZXQgbGlzdCAqLworCXJfcGt0W2ldLnBrX2xlbiA9IDA7CQkvKiBEYXRhIGZpZWxkIGxlbmd0aCBub3cgemVyby4gKi8KKwlyX3BrdFtpXS5wa190eXAgPSAnICc7CQkvKiBCbGFuayB0aGUgcGFja2V0IHR5cGUgdG9vLiAqLworCXJfcGt0W2ldLnBrX3J0ciA9IDA7CQkvKiBBbmQgdGhlIHJldHJpZXMgZmllbGQuICovCisgICAgfQorICAgIHJldHVybigxKTsKK30KKworLyogVGhpcyBpcyBsaWtlIGZyZWVyYnVmLCBleGNlcHQgaXQncyBjYWxsZWQgd2l0aCBhIHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KKy8qIHJhdGhlciB0aGFuIGEgcGFja2V0IGJ1ZmZlciBpbmRleC4gKi8KKworVk9JRAorZnJlZXJwa3Qoc2VxKSBpbnQgc2VxOyB7CisgICAgaW50IGs7CisgICAgZGVidWcoRjEwMSwiZnJlZXJwa3Qgc2VxIiwiIixzZXEpOworICAgIGsgPSByc2VxdGJsW3NlcV07CisgICAgLyogZGVidWcoRjEwMSwiZnJlZXJwa3QgayIsIiIsayk7ICovCisgICAgaWYgKGsgPiAtMSkgeworCWsgPSBmcmVlcmJ1ZihrKTsKKwkvKiBkZWJ1ZyhGMTAxLCJmcmVlcnBrdCBmcmVlcmJ1ZiIsIiIsayk7ICovCisgICAgfQorfQorCisKKy8qICBDIEggSyBXIEkgTiAgLS0gIENoZWNrIGlmIHBhY2tldCBuIGlzIGluIHdpbmRvdy4gKi8KKworLyogIFJldHVybnM6ICovCisvKiAgICAwIGlmIGl0IGlzIGluIHRoZSBjdXJyZW50IHdpbmRvdywgICovCisvKiAgICsxIGlmIGl0IHdvdWxkIGhhdmUgYmVlbiBpbiBwcmV2aW91cyB3aW5kb3cgKGUuZy4gaWYgYWNrIHdhcyBsb3N0KSwgKi8KKy8qICAgLTEgaWYgaXQgaXMgb3V0c2lkZSBhbnkgd2luZG93IChwcm90b2NvbCBlcnJvciksICAgKi8KKy8qICAgLTIgaWYgZWl0aGVyIG9mIHRoZSBhcmd1bWVudCBwYWNrZXQgbnVtYmVycyBpcyBvdXQgb2YgcmFuZ2UuICAqLworCisvKiBDYWxsIHdpdGggcGFja2V0IG51bWJlciB0byBjaGVjayAobiksIGxvd2VzdCBwYWNrZXQgbnVtYmVyIGluIHdpbmRvdyAqLworLyogKGJvdHRvbSksIGFuZCBudW1iZXIgb2Ygc2xvdHMgaW4gd2luZG93IChzbG90cykuICAqLworCitpbnQKK2Noa3dpbihuLGJvdHRvbSxzbG90cykgaW50IG4sIGJvdHRvbSwgc2xvdHM7IHsKKyAgICBpbnQgdG9wLCBwcmV2OworCisgICAgZGVidWcoRjEwMSwiY2hrd2luIHBhY2tldCIsIiIsbik7CisgICAgZGVidWcoRjEwMSwiY2hrd2luIHdpbmxvIiwiIixib3R0b20pOworICAgIGRlYnVnKEYxMDEsImNoa3dpbiBzbG90cyIsIiIsc2xvdHMpOworCisvKiBGaXJzdCBkbyB0aGUgZWFzeSBhbmQgY29tbW9uIGNhc2VzLCB3aGVyZSB0aGUgd2luZG93cyBhcmUgbm90IHNwbGl0LiAqLworCisgICAgaWYgKG4gPCAwIHx8IG4gPiA2MyB8fCBib3R0b20gPCAwIHx8IGJvdHRvbSA+IDYzKQorICAgICAgcmV0dXJuKC0yKTsKKworICAgIGlmIChuID09IGJvdHRvbSkgcmV0dXJuKDApOwkJLyogSW4gYSBwZXJmZWN0IHdvcmxkLi4uICovCisKKyAgICB0b3AgPSBib3R0b20gKyBzbG90czsJCS8qIENhbGN1bGF0ZSB3aW5kb3cgdG9wLiAqLworICAgIGlmICh0b3AgPCA2NCAmJiBuIDwgdG9wICYmIG4gPj0gYm90dG9tKQorICAgICAgcmV0dXJuKDApOwkJCS8qIEluIGN1cnJlbnQgd2luZG93LiAqLworCisgICAgcHJldiA9IGJvdHRvbSAtIHNsb3RzOwkJLyogQm90dG9tIG9mIHByZXZpb3VzIHdpbmRvdy4gKi8KKyAgICBpZiAocHJldiA+IC0xICYmIG4gPCBib3R0b20gJiYgbiA+IHByZXYpCisgICAgICByZXR1cm4oMSk7CQkJLyogSW4gcHJldmlvdXMuICovCisKKy8qIE5vdyBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB0aGUgY3VycmVudCB3aW5kb3cgaXMgc3BsaXQuICovCisKKyAgICBpZiAodG9wID4gNjMpIHsJCQkvKiBXcmFwYXJvdW5kLi4uICovCisJdG9wIC09IDY0OwkJCS8qIEdldCBtb2R1bG8tNjQgc2VxdWVuY2UgbnVtYmVyICovCisJaWYgKG4gPCB0b3AgfHwgbiA+PSBib3R0b20pIHsKKwkgICAgcmV0dXJuKDApOwkJCS8qIEluIGN1cnJlbnQgd2luZG93LiAqLworCX0gZWxzZSB7CQkJLyogTm90IGluIGN1cnJlbnQgd2luZG93LiAqLworCSAgICBpZiAobiA8IGJvdHRvbSAmJiBuID49IHByZXYpIC8qIFByZXZpb3VzIHdpbmRvdyBjYW4ndCBiZSBzcGxpdC4gKi8KKwkgICAgICByZXR1cm4oMSk7CQkvKiBJbiBwcmV2aW91cyB3aW5kb3cuICovCisJICAgIGVsc2UKKwkgICAgICByZXR1cm4oLTEpOwkJLyogTm90IGluIHByZXZpb3VzIHdpbmRvdy4gKi8KKwl9CisgICAgfQorCisvKiBOb3cgdGhlIGNhc2Ugd2hlcmUgY3VycmVudCB3aW5kb3cgbm90IHNwbGl0LCBidXQgcHJldmlvdXMgd2luZG93IGlzLiAqLworCisgICAgaWYgKHByZXYgPCAwKSB7CQkJLyogSXMgcHJldmlvdXMgd2luZG93IHNwbGl0PyAqLworCXByZXYgKz0gNjQ7CQkJLyogWWVzLiAqLworCWlmIChuIDwgYm90dG9tIHx8IG4gPj0gcHJldikKKwkgIHJldHVybigxKTsJCQkvKiBJbiBwcmV2aW91cyB3aW5kb3cuICovCisgICAgfSBlbHNlIHsJCQkJLyogUHJldmlvdXMgd2luZG93IG5vdCBzcGxpdC4gKi8KKwlpZiAobiA8IGJvdHRvbSAmJiBuID49IHByZXYpCisJICByZXR1cm4oMSk7CQkJLyogSW4gcHJldmlvdXMgd2luZG93LiAqLworICAgIH0KKworLyogSXQncyBub3QgaW4gdGhlIGN1cnJlbnQgd2luZG93LCBhbmQgbm90IGluIHRoZSBwcmV2aW91cyB3aW5kb3cuLi4gKi8KKworICAgIHJldHVybigtMSk7CQkJCS8qIFNvIGl0J3Mgbm90IGluIGFueSB3aW5kb3cuICovCit9CisKK2ludAorZHVtcHNidWYoKSB7CQkJCS8qIER1bXAgc2VuZC1idWZmZXJzICovCisjaWZkZWYgREVCVUcKKyAgICBpbnQgaiwgeCwgejsJCQkvKiB0byBkZWJ1ZyBsb2cuICovCisKKyAgICBpZiAoISBkZWJsb2cpIHJldHVybigwKTsKKyAgICB4ID0genNvdXRsKFpERklMRSwiU0VORCBCVUZGRVJTOiIpOworICAgIGlmICh4IDwgMCkgeworCWRlYmxvZyA9IDA7CisJcmV0dXJuKDApOworICAgIH0KKyAgICB4PXpzb3V0bChaREZJTEUsImJ1ZmZlciBpbnVzZSBhZGRyZXNzIGxlbmd0aCBkYXRhIHR5cGUgc2VxIGZsYWcgcmV0cmllcyIpOworICAgIGlmICh4IDwgMCkgeworCWRlYmxvZyA9IDA7CisJcmV0dXJuKDApOworICAgIH0KKyAgICBmb3IgKGogPSAwOyBqIDwgd3Nsb3RzOyBqKyspIHsKKwlpZiAoIXNidWZ1c2Vbal0pCisJICBjb250aW51ZTsKKwl6ID0gKCh1bnNpZ25lZCBsb25nKShzX3BrdFtqXS5iZl9hZHIpKSAmIDB4ZmZmZjsKKworCXNwcmludGYoeGJ1ZiwJCQkvKiBzYWZlICgyMDApICovCisJCSIlNGQlNmQlMTBkJTVkJTZkJTRjJTVkJTZkXG4iLAorCQlqLAorCQlzYnVmdXNlW2pdLAorCQkvKiBBdm9pZCB3YXJuaW5ncyB3aGVuIGFkZHJlc3NlcyBhcmUgYmlnZ2VyIHRoYW4gaW50cyAqLworCQl6LAorCQlzX3BrdFtqXS5iZl9sZW4sCisJCXNfcGt0W2pdLnBrX2xlbiwKKwkJc19wa3Rbal0ucGtfdHlwLAorCQlzX3BrdFtqXS5wa19zZXEsCisJCXNfcGt0W2pdLnBrX3J0cgorCQkpOworCWlmICh6c291dChaREZJTEUseGJ1ZikgPCAwKSAgeworCSAgICBkZWJsb2cgPSAwOworCSAgICByZXR1cm4oMCk7CisJfQorCWlmIChzX3BrdFtqXS5wa19hZHIpIHsKKwkgICAgeCA9IChpbnQpc3RybGVuKChjaGFyICopIHNfcGt0W2pdLnBrX2Fkcik7CisJICAgIGlmICh4KQorCSAgICAgIHNwcmludGYoeGJ1ZiwJCS8qIHNhZmUgKGNoZWNrZWQpICovCisJCSAgICAgICJbJS43MnMlc11cbiIsc19wa3Rbal0ucGtfYWRyLCB4ID4gNzIgPyAiLi4uIiA6ICIiKTsKKwkgICAgZWxzZQorCSAgICAgIHNwcmludGYoeGJ1ZiwiWyhlbXB0eSBzdHJpbmcpXVxuIik7IC8qIHNhZmUgKDIwMCkgKi8KKwl9IGVsc2UgeworCSAgICBzcHJpbnRmKHhidWYsIlsobnVsbCBwb2ludGVyKV1cbiIpOwkvKiBzYWZlICgyMDApICovCisJfQorCWlmICh6c291dChaREZJTEUseGJ1ZikgPCAwKSB7CisJICAgIGRlYmxvZyA9IDA7CisJICAgIHJldHVybigwKTsKKwl9CisgICAgfQorICAgIHNwcmludGYoeGJ1ZiwiZnJlZTogJWQsIHdpbmxvOiAlZFxuIiwgc2J1Zm51bSwgd2lubG8pOyAvKiBzYWZlICgyMDApICovCisgICAgaWYgKHpzb3V0KFpERklMRSx4YnVmKSA8IDApIHsKKwlkZWJsb2cgPSAwOworCXJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByZXR1cm4oMCk7Cit9CitpbnQKK2R1bXByYnVmKCkgewkJCQkvKiBEdW1wIHJlY2VpdmUtYnVmZmVycyAqLworI2lmZGVmIERFQlVHCisgICAgaW50IGosIHgsIHo7CisgICAgaWYgKCEgZGVibG9nKSByZXR1cm4oMCk7CisgICAgaWYgKHpzb3V0bChaREZJTEUsIlJFQ0VJVkUgQlVGRkVSUzoiKSA8IDApIHsKKwlkZWJsb2cgPSAwOworCXJldHVybigwKTsKKyAgICB9CisgICAgeD16c291dGwoWkRGSUxFLCJidWZmZXIgaW51c2UgYWRkcmVzcyBsZW5ndGggZGF0YSB0eXBlIHNlcSBmbGFnIHJldHJpZXMiKTsKKyAgICBpZiAoeCA8IDApIHsKKwlkZWJsb2cgPSAwOworCXJldHVybigwKTsKKyAgICB9CisgICAgZm9yICggaiA9IDA7IGogPCB3c2xvdHM7IGorKyApIHsKKwlpZiAoIXJidWZ1c2Vbal0pCisJICBjb250aW51ZTsKKwl6ID0gKCh1bnNpZ25lZCBsb25nKShyX3BrdFtqXS5iZl9hZHIpKSAmIDB4ZmZmZjsKKwlzcHJpbnRmKHhidWYsCQkJLyogMjAwLCBzYWZlICovCisJCSIlNGQlNmQlMTBkJTVkJTZkJTRjJTVkJTZkXG4iLAorCQlqLAorCQlyYnVmdXNlW2pdLAorCQkvKiBBdm9pZCB3YXJuaW5ncyB3aGVuIGFkZHJlc3NlcyBhcmUgYmlnZ2VyIHRoYW4gaW50cyAqLworCQl6LAorCQlyX3BrdFtqXS5iZl9sZW4sCisJCXJfcGt0W2pdLnBrX2xlbiwKKwkJcl9wa3Rbal0ucGtfdHlwLAorCQlyX3BrdFtqXS5wa19zZXEsCisJCXJfcGt0W2pdLnBrX3J0cgorCQkpOworCWlmICh6c291dChaREZJTEUseGJ1ZikgPCAwKSB7CisJICAgIGRlYmxvZyA9IDA7CisJICAgIHJldHVybigwKTsKKwl9CisJeCA9IChpbnQpc3RybGVuKChjaGFyICopcl9wa3Rbal0uYmZfYWRyKTsKKwlzcHJpbnRmKHhidWYsCQkJLyogc2FmZSAoY2hlY2tlZCkgKi8KKwkJIlslLjcycyVzXVxuIixyX3BrdFtqXS5iZl9hZHIsIHggPiA3MiA/ICIuLi4iIDogIiIpOworCWlmICh6c291dChaREZJTEUseGJ1ZikgPCAwKSAgeworCSAgICBkZWJsb2cgPSAwOworCSAgICByZXR1cm4oMCk7CisJfQorICAgIH0KKyAgICBzcHJpbnRmKHhidWYsImZyZWU6ICVkLCB3aW5sbzogJWRcbiIsIHJidWZudW0sIHdpbmxvKTsgLyogc2FmZSAoMjAwKSAqLworICAgIGlmICh6c291dChaREZJTEUseGJ1ZikgPCAwKSAgeworCWRlYmxvZyA9IDA7CisJcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJldHVybigwKTsKK30KKworLyogIFMgQSBUIFQgUiAgLS0gIFNlbmQgYW4gQXR0cmlidXRlIFBhY2tldCAgKi8KKworLyoKKyAgU2VuZHMgYXR0cmlidXRlIHBhY2tldChzKSBmb3IgdGhlIGN1cnJlbnQgZmlsZS4gIElmIHRoZSBpbmZvIHdpbGwgbm90CisgIGZpdCBpbnRvIG9uZSBwYWNrZXQsIGl0IGNhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSB1bnRpbCBhbGwgdGhlIGZpZWxkcworICB0aGF0IHdpbGwgZml0IGFyZSBzZW50LgorCisgIENhbGwgd2l0aDoKKyAgICB4cCA9PSAwIGlmIHdlJ3JlIHNlbmRpbmcgYSByZWFsIGZpbGUgKEYgcGFja2V0KSwgb3I6CisgICAgeHAgIT0gMCBmb3Igc2NyZWVuIGRhdGEgKFggcGFja2V0KS4KKyAgQW5kOgorICAgIGZsYWcgPT0gMSBmb3IgZmlyc3QgQSBwYWNrZXQKKyAgICBmbGFnID09IDAgZm9yIHN1YnNlcXVlbnQgQSBwYWNrZXRzLgorICBSZXR1cm5zOgorICAgIDEgb3IgZ3JlYXRlciBpZiBhbiBBIHBhY2tldCB3YXMgc2VudCwgb3I6CisgICAgMCBpZiBhbiBTLXBhY2tldCB3YXMgbm90IHNlbnQgYmVjYXVzZSB0aGVyZSB3YXMgbm8gZGF0YSB0byBzZW5kIG9yCisgICAgICB0aGVyZSB3YXMgbm8gZGF0YSBsZWZ0IHRoYXQgd2FzIHNob3J0IGVub3VnaCB0byBzZW5kLCBvcjoKKyAgIC0xIG9uIGFueSBraW5kIG9mIGVycm9yLgorKi8KKworLyogKGRvbid0KSAjZGVmaW5lIFRTT0ZPUk1BVCAqLworLyogd2hpY2ggd2FzIG9ubHkgZm9yIG1ha2luZyBDLUtlcm1pdCBzZW5kIFRTTy1LZXJtaXQtbGlrZSBBIHBhY2tldHMgKi8KKy8qIHRvIHRyeSB0byB0cmFjayBkb3duIGEgcHJvYmxlbSBzb21lYm9keSByZXBvcnRlZC4uLiAqLworCitpbnQKK3NhdHRyKHhwLCBmbGFnKSBpbnQgeHAsIGZsYWc7IHsJCS8qIFNlbmQgQXR0cmlidXRlcyAqLworCisgICAgc3RhdGljIGludCBtYXg7CQkJLyogTWF4aW11bSBsZW5ndGggZm9yIEF0dHJpYnV0ZXMgKi8KKyAgICBzdGF0aWMgc2hvcnQgZG9uZVs5NV07CQkvKiBGaWVsZC1jb21wbGV0ZSBhcnJheSAqLworICAgIHN0YXRpYyBzdHJ1Y3QgemF0dHIgeDsJCS8qIEZpbGUgYXR0cmlidXRlIHN0cnVjdCAqLworICAgIHN0YXRpYyBjaGFyIHhkYXRlWzI0XTsKKworICAgIGV4dGVybiBjaGFyICogY2tzeXNpZDsKKworICAgIC8qIFNvbWUgZXh0cmEgZmxhZ3MgYXJlIHVzZWQgYmVjYXVzZSB0aGUgImRvbmUiIGFycmF5IGlzIHNwYXJzZSAqLworCisgICAgaW50IGksIGosIHJjLCBhbG4sIGxlZnQgPSAwLCBudW1zZXQgPSAwLCB4YmluID0gMDsgLyogV29ya2VycyAqLworICAgIGludCBub3RhZmlsZSA9IDA7CisgICAgY2hhciAqdHAsIGM7CisKKyAgICBub3RhZmlsZSA9IHNuZGFycmF5IHx8IHBpcGVzZW5kIHx8CisjaWZkZWYgUElQRVNFTkQKKyAgICAgIHNuZGZpbHRlciB8fAorI2VuZGlmIC8qIFBJUEVTRU5EICovCisJY2FsaWJyYXRlOworCisgICAgZGVidWcoRjEwMSwic2F0dHIgZmxhZyIsIiIsZmxhZyk7CisgICAgaWYgKCFmbGFnKQkJCQkvKiBObyBtb3JlIGF0dHJpYnV0ZXMgdG8gc2VuZCAqLworICAgICAgaWYgKGRvbmVbeHVuY2hhcignQCcpXSkKKwlyZXR1cm4oMCk7CisKKyAgICAvKiBJbml0aWFsaXplIEF0dHJpYnV0ZSBtZWNoYW5pc20gKi8KKworICAgIGlmIChmbGFnKSB7CQkJCS8qIEZpcnN0IHRpbWUgaGVyZSBmb3IgdGhpcyBmaWxlPyAqLworCWluaXRhdHRyKCZ4KTsJCQkvKiBCbGFuayBvdXQgYWxsIHRoZSBmaWVsZHMuICovCisJZm9yIChqID0gMDsgaiA8IDk1OyBqKyspCS8qIEluaXQgYXJyYXkgb2YgY29tcGxldGVkIGZpZWxkcyAqLworCSAgZG9uZVtqXSA9IDA7CisJbWF4ID0gbWF4ZGF0YSgpOwkJLyogR2V0IG1heGltdW0gZGF0YSBmaWVsZCBsZW5ndGggKi8KKwlpZiAobm90YWZpbGUgfHwgeHAgPT0gMSkgewkvKiBJcyBpdCBub3QgYSByZWFsIGZpbGU/ICovCisJICAgIGV4dGVybiBjaGFyICogenpuZGF0ZSgpOworCSAgICBjaGFyICogcDsKKwkgICAgaW50IGk7CisjaWZkZWYgQ0FMSUJSQVRFCisJICAgIGlmIChjYWxpYnJhdGUpIHsJCS8qIENhbGlicmF0aW9uIHJ1bi4uLiAqLworCQl4Lmxlbmd0aGsgPSBjYWxpYnJhdGUgLyAxMDI0TDsgLyogV2Uga25vdyB0aGUgbGVuZ3RoICovCisJCXgubGVuZ3RoID0gY2FsaWJyYXRlOworCSAgICB9CisjZW5kaWYgLyogQ0FMSUJSQVRFICovCisJICAgIHguc3lzdGVtaWQudmFsID0gY2tzeXNpZDsJLyogU3lzdGVtIElEICovCisJICAgIHguc3lzdGVtaWQubGVuID0gKGludClzdHJsZW4oY2tzeXNpZCk7CisJICAgIGNrc3RybmNweSh4ZGF0ZSx6em5kYXRlKCksMjQpOworCSAgICB4ZGF0ZVs4XSA9IFNQOworCSAgICB6dGltZSgmcCk7CisJICAgIGZvciAoaSA9IDExOyBpIDwgMTk7IGkrKykJLyogY29weSBoaDptbTpzcyAqLworCSAgICAgIHhkYXRlW2kgLSAyXSA9IHBbaV07CS8qIHRvIHhkYXRlICovCisJICAgIHhkYXRlWzE3XSA9IE5VTDsJCS8qIHRlcm1pbmF0ZSAqLworCSAgICB4LmRhdGUudmFsID0geGRhdGU7CisJICAgIHguZGF0ZS5sZW4gPSAxNzsKKwkgICAgZGVidWcoRjExMSwic2F0dHIgbm90YWZpbGUgZGF0ZSIseC5kYXRlLnZhbCx4LmRhdGUubGVuKTsKKwl9IGVsc2UgewkJCS8qIFJlYWwgZmlsZSAqLworCSAgICByYyA9IHpzYXR0cigmeCk7CQkvKiBHZXQgYXR0cmlidXRlcyBmb3IgdGhpcyBmaWxlICAqLworCSAgICBkZWJ1ZyhGMTAxLCJzYXR0ciB6c2F0dHIiLCIiLHJjKTsKKwkgICAgaWYgKHJjIDwgMCkJCQkvKiBDYW4ndCBnZXQgJ2VtIHNvIGRvbid0IHNlbmQgJ2VtICovCisJICAgICAgcmV0dXJuKDApOworCSAgICBkZWJ1ZyhGMTAxLCJzYXR0ciBpbml0IG1heCIsIiIsbWF4KTsKKwl9CisgICAgfQorICAgIGlmIChueHRwa3QoKSA8IDApCQkJLyogR290ICdlbSwgZ2V0IG5leHQgcGFja2V0IG51bWJlciAqLworICAgICAgcmV0dXJuKC0xKTsJCQkvKiBCYWQgbmV3cyBpZiB3ZSBjYW4ndCAqLworCisgICAgaSA9IDA7CQkJCS8qIEluaXQgZGF0YSBmaWVsZCBjaGFyYWN0ZXIgbnVtYmVyICovCisKKyAgICAvKiBEbyBlYWNoIGF0dHJpYnV0ZSB1c2luZyBmaXJzdC1maXQgbWV0aG9kLCBtYXJraW5nIGFzIHdlIGdvICovCisgICAgLyogVGhpcyBpcyByYXRoZXIgbG9uZyBhbmQgcmVwaXRpdGlvdXMgLSBjb3VsZCBiZSBkb25lIG1vcmUgY2xldmVybHkgKi8KKworICAgIGlmIChhdHNpZG8gJiYgIWRvbmVbeHVuY2hhcihjID0gJy4nKV0pIHsgLyogU3lzdGVtIHR5cGUgKi8KKwlpZiAobWF4IC0gaSA+PSB4LnN5c3RlbWlkLmxlbiArIDIpIHsgLyogRW5vdWdoIHNwYWNlID8gKi8KKwkgICAgZGF0YVtpKytdID0gYzsJCSAgICAgLyogWWVzLCBhZGQgcGFyYW1ldGVyICovCisJICAgIGRhdGFbaSsrXSA9IHRvY2hhcih4LnN5c3RlbWlkLmxlbik7CSAvKiBBZGQgbGVuZ3RoICovCisJICAgIGZvciAoaiA9IDA7IGogPCB4LnN5c3RlbWlkLmxlbjsgaisrKSAvKiBBZGQgZGF0YSAqLworCSAgICAgIGRhdGFbaSsrXSA9IHguc3lzdGVtaWQudmFsW2pdOworCSAgICBudW1zZXQrKzsJCQkvKiBDb3VudCB0aGF0IHdlIGRpZCBhdCBsZWFzdCBvbmUgKi8KKwkgICAgZG9uZVt4dW5jaGFyKGMpXSA9IDE7CS8qIE1hcmsgdGhpcyBhdHRyaWJ1dGUgYXMgZG9uZSAqLworCX0gZWxzZQkJCQkvKiBObyAqLworCSAgbGVmdCsrOwkJCS8qIHNvIG1hcmsgdGhpcyBvbmUgbGVmdCB0byBkbyAqLworICAgIH0KKyNpZmRlZiBTVFJBVFVTCisgICAgaWYgKGF0Y3JlbyAmJiAhZG9uZVt4dW5jaGFyKGMgPSAnJCcpXSkgeyAvKiBDcmVhdG9yICovCisJaWYgKG1heCAtIGkgPj0geC5jcmVhdG9yLmxlbiArIDIpIHsgLyogRW5vdWdoIHNwYWNlID8gKi8KKwkgICAgZGF0YVtpKytdID0gYzsKKwkgICAgZGF0YVtpKytdID0gdG9jaGFyKHguY3JlYXRvci5sZW4pOworCSAgICBmb3IgKGogPSAwOyBqIDwgeC5jcmVhdG9yLmxlbjsgaisrKQorCSAgICAgIGRhdGFbaSsrXSA9IHguY3JlYXRvci52YWxbal07CisJICAgIG51bXNldCsrOworCSAgICBkb25lW3h1bmNoYXIoYyldID0gMTsKKwl9IGVsc2UKKwkgIGxlZnQrKzsKKyAgICB9CisgICAgaWYgKGF0YWN0byAmJiAhZG9uZVt4dW5jaGFyKGMgPSAnJScpXSkgeyAvKiBGaWxlIGFjY291bnQgKi8KKwlpZiAobWF4IC0gaSA+PSB4LmFjY291bnQubGVuICsgMikgeworCSAgICBkYXRhW2krK10gPSBjOworCSAgICBkYXRhW2krK10gPSB0b2NoYXIoeC5hY2NvdW50Lmxlbik7CisJICAgIGZvciAoaiA9IDA7IGogPCB4LmFjY291bnQubGVuOyBqKyspCisJICAgICAgZGF0YVtpKytdID0geC5hY2NvdW50LnZhbFtqXTsKKwkgICAgbnVtc2V0Kys7CisJICAgIGRvbmVbeHVuY2hhcihjKV0gPSAxOworCX0gZWxzZQorCSAgbGVmdCsrOworICAgIH0KKyAgICBpZiAoYXRmcm1vICYmICFkb25lW3h1bmNoYXIoYyA9ICcvJyldKSB7IC8qIFBhY2tldCBkYXRhIGZvcm1hdCAqLworCWlmIChtYXggLSBpID49IHgucmVjZm0ubGVuICsgMikgeworCSAgICBkYXRhW2krK10gPSBjOworCSAgICBkYXRhW2krK10gPSB0b2NoYXIoeC5yZWNmbS5sZW4pOyAvKiAgQ29weSBmcm9tIGF0dHIgc3RydWN0dXJlICovCisJICAgIGZvciAoaiA9IDA7IGogPCB4LnJlY2ZtLmxlbjsgaisrKQorCSAgICAgIGRhdGFbaSsrXSA9IHgucmVjZm0udmFsW2pdOworCSAgICBudW1zZXQrKzsKKwkgICAgZG9uZVt4dW5jaGFyKGMpXSA9IDE7CisJfSBlbHNlCisJICBsZWZ0Kys7CisgICAgfQorI2VuZGlmIC8qIFNUUkFUVVMgKi8KKworICAgIHhiaW4gPQkJCQkvKiBJcyB0aGUgdHJhbnNmZXIgaW4gYmluYXJ5IG1vZGU/ICovCisjaWZkZWYgVk1TCisgICAgICBiaW5hcnkgPT0gWFlGVF9JIHx8IGJpbmFyeSA9PSBYWUZUX0wgfHwgLyogSU1BR0Ugb3IgTEFCRUxFRCAqLworCSFzdHJuY21wKHgucmVjZm0udmFsLCJGIiwxKQkvKiBvciBSRUNGTT1GeHh4eHh4ICovCisjZWxzZQorICAgICAgYmluYXJ5CQkJCS8qIFVzZXIgc2FpZCBTRVQgRklMRSBUWVBFIEJJTkFSWSAgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKwk7CisKKyAgICBpZiAoYXR0eXBvICYmICFkb25lW3h1bmNoYXIoYyA9ICciJyldKSB7IC8qIEZpbGUgdHlwZSAqLworCWlmIChtYXggLSBpID49IDUpIHsJCS8qIE1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgKi8KKwkgICAgZGF0YVtpKytdID0gYzsKKwkgICAgaWYgKHhiaW4pIHsJCQkvKiBCaW5hcnkgKi8KKwkJZGF0YVtpKytdID0gdG9jaGFyKDIpOwkvKiAgVHdvIGNoYXJhY3RlcnMgKi8KKwkJZGF0YVtpKytdID0gJ0InOwkvKiAgQiBmb3IgQmluYXJ5ICovCisJCWRhdGFbaSsrXSA9ICc4JzsJLyogIDgtYml0IGJ5dGVzIChub3RlIGFzc3VtcHRpb24uLi4pICovCisjaWZkZWYgQ0tfTEFCRUxFRAorCQlpZiAoYmluYXJ5ICE9IFhZRlRfTAorI2lmZGVmIFZNUworCQkgICAgJiYgYmluYXJ5ICE9IFhZRlRfSQorI2VuZGlmIC8qIFZNUyAqLworCQkgICAgKQorCQkgIGJpbmFyeSA9IFhZRlRfQjsKKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisJICAgIH0gZWxzZSB7CQkJLyogVGV4dCAqLworI2lmZGVmIFRTT0ZPUk1BVAorCQlkYXRhW2krK10gPSB0b2NoYXIoMSk7CS8qICBPbmUgY2hhcmFjdGVyICovCisJCWRhdGFbaSsrXSA9ICdBJzsJLyogIEEgPSAoZXh0ZW5kZWQpIEFTQ0lJIHdpdGggQ1JMRnMgKi8KKyNlbHNlCisJCWRhdGFbaSsrXSA9IHRvY2hhcigzKTsJLyogIFRocmVlIGNoYXJhY3RlcnMgKi8KKwkJZGF0YVtpKytdID0gJ0EnOwkvKiAgQSA9IChleHRlbmRlZCkgQVNDSUkgd2l0aCBDUkxGcyAqLworCQlkYXRhW2krK10gPSAnTSc7CS8qICBNIGZvciBjYXJyaWFnZSByZXR1cm4gKi8KKwkJZGF0YVtpKytdID0gJ0onOwkvKiAgSiBmb3IgbGluZWZlZWQgKi8KKyNlbmRpZiAvKiBUU09GT1JNQVQgKi8KKworI2lmZGVmIFZNUworCQliaW5hcnkgPSBYWUZUX1Q7CS8qIFdlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGV4dCAqLworI2VuZGlmIC8qIFZNUyAqLworCSAgICB9CisJICAgIG51bXNldCsrOworCSAgICBkb25lW3h1bmNoYXIoYyldID0gMTsKKwl9IGVsc2UKKwkgIGxlZnQrKzsKKyAgICB9CisKKyNpZmRlZiBUU09GT1JNQVQKKyAgICBpZiAoYXR0eXBvICYmICF4YmluICYmICFkb25lW3h1bmNoYXIoYyA9ICcvJyldKSB7IC8qIFJlY29yZCBmb3JtYXQgKi8KKwlpZiAobWF4IC0gaSA+PSA1KSB7CisJICAgIGRhdGFbaSsrXSA9IGM7CisJICAgIGRhdGFbaSsrXSA9IHRvY2hhcigzKTsJLyogIFRocmVlIGNoYXJhY3RlcnMgKi8KKwkgICAgZGF0YVtpKytdID0gJ0EnOwkJLyogIEEgPSB2YXJpYWJsZSB3aXRoIENSTEZzICovCisJICAgIGRhdGFbaSsrXSA9ICdNJzsJCS8qICBNIGZvciBjYXJyaWFnZSByZXR1cm4gKi8KKwkgICAgZGF0YVtpKytdID0gJ0onOwkJLyogIEogZm9yIGxpbmVmZWVkICovCisJfQorICAgIH0KKyNlbmRpZiAvKiBUU09GT1JNQVQgKi8KKworICAgIGlmIChhdHR5cG8gJiYgIXhiaW4gJiYgIWRvbmVbeHVuY2hhcihjID0gJyonKV0pIHsgLyogVGV4dCBlbmNvZGluZyAqLworI2lmZGVmIE5PQ1NFVFMKKwlpZiAobWF4IC0gaSA+PSAzKSB7CisJICAgIGRhdGFbaSsrXSA9IGM7CisJICAgIGRhdGFbaSsrXSA9IHRvY2hhcigxKTsJLyogTGVuZ3RoIG9mIHZhbHVlIGlzIDEgKi8KKwkgICAgZGF0YVtpKytdID0gJ0EnOwkJLyogQSBmb3IgQVNDSUkgKi8KKwkgICAgbnVtc2V0Kys7CisJICAgIGRvbmVbeHVuY2hhcihjKV0gPSAxOworCX0gZWxzZQorCSAgbGVmdCsrOworI2Vsc2UKKwlpZiAodGNoYXJzZXQgPT0gVENfVFJBTlNQIHx8ICF4ZnJ4bGEpIHsJLyogVHJhbnNmZXIgY2hhcmFjdGVyIHNldCAqLworCSAgICBpZiAobWF4IC0gaSA+PSAzKSB7CisJCWRhdGFbaSsrXSA9IGM7CQkvKiBFbmNvZGluZyAqLworCQlkYXRhW2krK10gPSB0b2NoYXIoMSk7CS8qIExlbmd0aCBvZiB2YWx1ZSBpcyAxICovCisJCWRhdGFbaSsrXSA9ICdBJzsJLyogQSBmb3IgQVNDSUkgKGkuZS4gdGV4dCkgKi8KKwkJbnVtc2V0Kys7CisJCWRvbmVbeHVuY2hhcihjKV0gPSAxOworCSAgICB9IGVsc2UKKwkgICAgICBsZWZ0Kys7CisJfSBlbHNlIHsKKwkgICAgdHAgPSB0Y3NpbmZvW3RjaGFyc2V0XS5kZXNpZ25hdG9yOworCSAgICBpZiAoIXRwKSB0cCA9ICIiOworCSAgICBhbG4gPSBzdHJsZW4odHApOworCSAgICBpZiAoYWxuID4gMCkgeworCQlpZiAobWF4IC0gaSA+PSBhbG4gKyAyKSB7CisJCSAgICBkYXRhW2krK10gPSBjOwkvKiBFbmNvZGluZyAqLworCQkgICAgZGF0YVtpKytdID0gdG9jaGFyKGFsbisxKTsgLyogTGVuZ3RoIG9mIGRlc2lnbmF0b3IuICovCisJCSAgICBkYXRhW2krK10gPSAnQyc7IC8qIFRleHQgaW4gc3BlY2lmaWVkIGNoYXJzZXQuICovCisJCSAgICBmb3IgKGogPSAwOyBqIDwgYWxuOyBqKyspIC8qIENvcHkgZGVzaWduYXRvciAqLworCQkgICAgICBkYXRhW2krK10gPSAqdHArKzsgLyogIEV4YW1wbGU6IComSTYvMTAwICovCisJCSAgICBudW1zZXQrKzsKKwkJICAgIGRvbmVbeHVuY2hhcihjKV0gPSAxOworCQl9IGVsc2UKKwkJICBsZWZ0Kys7CisJICAgIH0gZWxzZQorCSAgICAgIGRvbmVbeHVuY2hhcihjKV0gPSAxOworCX0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgfQorICAgIGlmIChhdGRhdG8gJiYgIWRvbmVbeHVuY2hhcihjID0gJyMnKV0gJiYgLyogQ3JlYXRpb24gZGF0ZSwgaWYgYW55ICovCisJKGFsbiA9IHguZGF0ZS5sZW4pID4gMCkgeworCWlmIChtYXggLSBpID49IGFsbiArIDIpIHsKKwkgICAgZGF0YVtpKytdID0gYzsKKwkgICAgZGF0YVtpKytdID0gdG9jaGFyKGFsbik7CisJICAgIGZvciAoaiA9IDA7IGogPCBhbG47IGorKykKKwkgICAgICBkYXRhW2krK10gPSB4LmRhdGUudmFsW2pdOworCSAgICBudW1zZXQrKzsKKwkgICAgZG9uZVt4dW5jaGFyKGMpXSA9IDE7CisJfSBlbHNlCisJICBsZWZ0Kys7CisgICAgfQorICAgIC8qIEZpbGUgbGVuZ3RoIGluIEsgKi8KKyAgICBpZiAoYXRsZW5vICYmICFkb25lW3h1bmNoYXIoYyA9ICchJyldICYmIHgubGVuZ3RoayA+IC0xTCkgeworCXNwcmludGYoKGNoYXIgKikgJmRhdGFbaSsyXSwiJWxkIix4Lmxlbmd0aGspOyAvKiBzYWZlICovCisJYWxuID0gKGludClzdHJsZW4oKGNoYXIgKikoZGF0YStpKzIpKTsKKwlpZiAobWF4IC0gaSA+PSBhbG4gKyAyKSB7CisJICAgIGRhdGFbaV0gPSBjOworCSAgICBkYXRhW2krMV0gPSB0b2NoYXIoYWxuKTsKKwkgICAgaSArPSBhbG4gKyAyOworCSAgICBudW1zZXQrKzsKKwkgICAgZG9uZVt4dW5jaGFyKGMpXSA9IDE7CisJfSBlbHNlIHsKKwkgICAgZGF0YVtpXSA9IE5VTDsKKwkgICAgbGVmdCsrOworCX0KKyAgICB9CisgICAgLyogRmlsZSBsZW5ndGggaW4gYnl0ZXMgKi8KKyAgICBpZiAoYXRsZW5vICYmICFkb25lW3h1bmNoYXIoYyA9ICcxJyldICYmIHgubGVuZ3RoID4gLTFMKSB7CisJc3ByaW50ZigoY2hhciAqKSAmZGF0YVtpKzJdLCIlbGQiLHgubGVuZ3RoKTsgLyogc2FmZSAqLworCWFsbiA9IChpbnQpc3RybGVuKChjaGFyICopKGRhdGEraSsyKSk7CisJaWYgKG1heCAtIGkgPj0gYWxuICsgMikgeworCSAgICBkYXRhW2ldID0gYzsKKwkgICAgZGF0YVtpKzFdID0gdG9jaGFyKGFsbik7CisJICAgIGkgKz0gYWxuICsgMjsKKwkgICAgbnVtc2V0Kys7CisJICAgIGRvbmVbeHVuY2hhcihjKV0gPSAxOworCX0gZWxzZSB7CisJICAgIGRhdGFbaV0gPSBOVUw7CisJICAgIGxlZnQrKzsKKwl9CisgICAgfQorI2lmZGVmIENLX1BFUk1TCisgICAgaWYgKGF0bHBybyAmJiAhZG9uZVt4dW5jaGFyKGMgPSAnLCcpXSAmJiAvKiBMb2NhbCBwcm90ZWN0aW9uICovCisJKGFsbiA9IHgubHByb3RlY3QubGVuKSA+IDAgJiYgIW5vdGFmaWxlICYmIHhwID09IDApIHsKKwlpZiAobWF4IC0gaSA+PSBhbG4gKyAyKSB7CisJICAgIGRhdGFbaSsrXSA9IGM7CisJICAgIGRhdGFbaSsrXSA9IHRvY2hhcihhbG4pOworCSAgICBmb3IgKGogPSAwOyBqIDwgYWxuOyBqKyspCisJICAgICAgZGF0YVtpKytdID0geC5scHJvdGVjdC52YWxbal07CisJICAgIG51bXNldCsrOworCSAgICBkb25lW3h1bmNoYXIoYyldID0gMTsKKwl9IGVsc2UKKwkgIGxlZnQrKzsKKyAgICB9CisgICAgaWYgKGF0Z3BybyAmJiAhZG9uZVt4dW5jaGFyKGMgPSAnLScpXSAmJiAvKiBHZW5lcmljIHByb3RlY3Rpb24gKi8KKwkoYWxuID0geC5ncHJvdGVjdC5sZW4pID4gMCAmJiAhbm90YWZpbGUgJiYgeHAgPT0gMCkgeworCWlmIChtYXggLSBpID49IGFsbiArIDIpIHsKKwkgICAgZGF0YVtpKytdID0gYzsKKwkgICAgZGF0YVtpKytdID0gdG9jaGFyKGFsbik7CisJICAgIGZvciAoaiA9IDA7IGogPCBhbG47IGorKykKKwkgICAgICBkYXRhW2krK10gPSB4Lmdwcm90ZWN0LnZhbFtqXTsKKwkgICAgbnVtc2V0Kys7CisJICAgIGRvbmVbeHVuY2hhcihjKV0gPSAxOworCX0gZWxzZQorCSAgbGVmdCsrOworICAgIH0KKyNlbmRpZiAvKiBDS19QRVJNUyAqLworICAgIGlmIChhdGJsa28gJiYgZmJsa3NpeiAmJiAhZG9uZVt4dW5jaGFyKGMgPSAnKCcpXSAmJgorCSFub3RhZmlsZSAmJiB4cCA9PSAwKSB7CS8qIEJsb2Nrc2l6ZSAqLworCXNwcmludGYoKGNoYXIgKikgJmRhdGFbaSsyXSwiJWQiLGZibGtzaXopOyAvKiBzYWZlICovCisJYWxuID0gKGludClzdHJsZW4oKGNoYXIgKikoZGF0YStpKzIpKTsKKwlpZiAobWF4IC0gaSA+PSBhbG4gKyAyKSB7CisJICAgIGRhdGFbaV0gPSBjOworCSAgICBkYXRhW2krMV0gPSB0b2NoYXIoYWxuKTsKKwkgICAgaSArPSBhbG4gKyAyOworCSAgICBudW1zZXQrKzsKKwkgICAgZG9uZVt4dW5jaGFyKGMpXSA9IDE7CisJfSBlbHNlIHsKKwkgICAgZGF0YVtpXSA9IE5VTDsKKwkgICAgbGVmdCsrOworCX0KKyAgICB9CisjaWZuZGVmIE5PRlJJTExTCisgICAgaWYgKChycHJpbnRmIHx8IHJtYWlsZikgJiYgYXRkaXNvICYmIC8qIE1BSUwsIG9yIFJFTU9URSBQUklOVD8gICovCisJIWRvbmVbeHVuY2hhcihjID0gJysnKV0pIHsKKwlhbG4gPSAoaW50KSBzdHJsZW4ob3B0YnVmKSArIDE7CS8qIE9wdGlvbnMsIGlmIGFueSAqLworCWlmIChtYXggLSBpID49IGFsbiArIDIpIHsKKwkgICAgZGF0YVtpKytdID0gYzsJCS8qIERpc3Bvc2l0aW9uICovCisJICAgIGRhdGFbaSsrXSA9IHRvY2hhcihhbG4pOwkvKiBPcHRpb25zLCBpZiBhbnkgKi8KKwkgICAgaWYgKHJwcmludGYpCisJICAgICAgZGF0YVtpKytdID0gJ1AnOwkJLyogUCBmb3IgUHJpbnQgKi8KKwkgICAgZWxzZQorCSAgICAgIGRhdGFbaSsrXSA9ICdNJzsJCS8qIE0gZm9yIE1haWwgKi8KKwkgICAgZm9yIChqID0gMDsgb3B0YnVmW2pdOyBqKyspCS8qIENvcHkgYW55IG9wdGlvbnMgKi8KKwkgICAgICBkYXRhW2krK10gPSBvcHRidWZbal07CisJICAgIG51bXNldCsrOworCSAgICBkb25lW3h1bmNoYXIoYyldID0gMTsKKwl9IGVsc2UgeworCSAgICBkYXRhW2ldID0gTlVMOworCSAgICBsZWZ0Kys7CisJfQorICAgIH0KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2lmZGVmIENLX1JFU0VORAorICAgIGlmIChzZW5kbW9kZSA9PSBTTV9SRVNFTkQgJiYgIWRvbmVbeHVuY2hhcihjID0gJysnKV0pIHsKKwlpZiAobWF4IC0gaSA+PSAzKSB7CisJICAgIGRhdGFbaSsrXSA9IGM7CQkvKiBEaXNwb3NpdGlvbiAqLworCSAgICBkYXRhW2krK10gPSB0b2NoYXIoMSk7CisJICAgIGRhdGFbaSsrXSA9ICdSJzsJCS8qIGlzIFJFU0VORCAqLworCSAgICBudW1zZXQrKzsKKwkgICAgZG9uZVt4dW5jaGFyKGMpXSA9IDE7CisJfSBlbHNlCisJICBsZWZ0Kys7CisgICAgfQorI2VuZGlmIC8qIENLX1JFU0VORCAqLworCisgICAgLyogRW5kIG9mIEF0dHJpYnV0ZXMgLS0gdG8gYmUgc2VudCBvbmx5IGFmdGVyIHNlbmRpbmcgYWxsIG90aGVycyAqLworCisgICAgZGVidWcoRjExMSwic2F0dHIiLCJAIixpKTsKKyAgICBkZWJ1ZyhGMTAxLCJzYXR0ciBudW1zZXQiLCIiLG51bXNldCk7CisgICAgZGVidWcoRjEwMSwic2F0dHIgbGVmdCIsIiIsbGVmdCk7CisKKyAgICBpZiAoKGxlZnQgPT0gMCB8fCBudW1zZXQgPT0gMCkgJiYgIWRvbmVbeHVuY2hhcihjID0gJ0AnKV0pIHsKKwlpZiAobWF4IC0gaSA+PSAzKSB7CisJICAgIGRhdGFbaSsrXSA9IGM7CQkvKiBFbmQgb2YgQXR0cmlidXRlcyAqLworCSAgICBkYXRhW2krK10gPSBTUDsJCS8qIExlbmd0aCAwICovCisJICAgIGRhdGFbaV0gPSBOVUw7CQkvKiBNYWtlIHN1cmUgaXQncyBudWxsLXRlcm1pbmF0ZWQgKi8KKwkgICAgbnVtc2V0Kys7CisJICAgIGRvbmVbeHVuY2hhcihjKV0gPSAxOworCX0KKyAgICB9CisKKyAgICAvKiBGaW5pc2hlZCAtIHNlbmQgdGhlIHBhY2tldCBvZmYgaWYgd2UgaGF2ZSBhbnl0aGluZyBpbiBpdCAqLworCisgICAgaWYgKG51bXNldCkgeworCWRhdGFbaV0gPSBOVUw7CQkJLyogVGVybWluYXRlIGxhc3QgZ29vZCBmaWVsZCAqLworCWRlYnVnKEYxMTEsInNhdHRyIHNlbmRpbmciLGRhdGEsbGVmdCk7CisJYWxuID0gKGludClzdHJsZW4oKGNoYXIgKilkYXRhKTsgLyogR2V0IG92ZXJhbGwgbGVuZ3RoIG9mIGF0dHJpYnV0ZXMgKi8KKwlyZXR1cm4oc3BhY2soJ0EnLHBrdG51bSxhbG4sZGF0YSkpOyAvKiBTZW5kIGl0ICovCisgICAgfSBlbHNlCisgICAgICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBjaGFyICpyZWZ1c2VkID0gIiI7CisKK3N0YXRpYyBjaGFyICpyZWFzb25bXSA9IHsKKyAgICAic2l6ZSIsICJ0eXBlIiwgImRhdGUiLCAiY3JlYXRvciIsICJhY2NvdW50IiwgImFyZWEiLCAicGFzc3dvcmQiLAorICAgICJibG9ja3NpemUiLCAiYWNjZXNzIiwgImVuY29kaW5nIiwgImRpc3Bvc2l0aW9uIiwgInByb3RlY3Rpb24iLAorICAgICJwcm90ZWN0aW9uIiwgIm9yaWdpbiIsICJmb3JtYXQiLAorICAgICJzeXMtZGVwZW5kZW50IiwJCQkvKiAwICovCisgICAgInNpemUiLAkJCQkvKiAxICovCisgICAgIjIiLAkJCQkvKiAyICovCisgICAgIjMiLAkJCQkvKiAzICovCisgICAgIjQiLAkJCQkvKiA0ICovCisgICAgIjUiLAkJCQkvKiA1ICovCisgICAgIjYiLAkJCQkvKiA2ICovCisgICAgIjciLAkJCQkvKiA3ICovCisgICAgIjgiLAkJCQkvKiA4ICovCisgICAgIjkiLAkJCQkvKiA5ICovCisgICAgIjoiLAkJCQkvKiA6ICovCisgICAgIjsiLAkJCQkvKiA7ICovCisgICAgIjwiLAkJCQkvKiA8ICovCisgICAgIj0iLAkJCQkvKiA9ICovCisgICAgIj4iLAkJCQkvKiA+ICovCisgICAgIm5hbWUiLAkJCQkvKiA/ICovCisgICAgIkAiCit9Oworc3RhdGljIGludCBucmVhc29uID0gc2l6ZW9mKHJlYXNvbikgLyBzaXplb2YoY2hhciAqKTsKK2ludCByZWplY3Rpb24gPSAtMTsKKworY2hhciAqCitnZXRyZWFzb24ocykgY2hhciAqczsgewkJCS8qIERlY29kZSBhdHRyaWJ1dGUgcmVmdXNhbCByZWFzb24gKi8KKyAgICBjaGFyIGMsICpwOworICAgIGlmIChyZWplY3Rpb24gPT0gMSkJCQkvKiBLbHVkZ2UgZm9yIFNFVCBGSUwgQ09MTCBESVNDQVJEICovCisgICAgICByZXR1cm4oIm5hbWUiKTsJCQkvKiB3aGVuIG90aGVyIEtlcm1pdCBkb2Vzbid0Li4uICovCisgICAgcCA9IHM7CisgICAgaWYgKCpwKysgIT0gJ04nKSByZXR1cm4oIiIpOwkvKiBTaG91bGQgc3RhcnQgd2l0aCBOICovCisgICAgZWxzZSBpZiAoKGMgPSAqcCkgPiBTUCkgewkJLyogZ2V0IHJlYXNvbiwgKi8KKwlyZWplY3Rpb24gPSBjOwkJCS8qIHJlbWVtYmVyIGl0LCAqLworCWMgLT0gJyEnOwkJCS8qIGdldCBvZmZzZXQgKi8KKwlwID0gKCh1bnNpZ25lZCBpbnQpICgoQ0hBUikgYykgPD0gKHVuc2lnbmVkIGludCkgbnJlYXNvbikgPworCSAgcmVhc29uW2NdIDoKKwkgICAgInVua25vd24iOworICAgIH0KKyAgICByZXR1cm4ocCk7Cit9CisKK2ludAorcnNhdHRyKHMpIENIQVIgKnM7IHsJCQkvKiBSZWFkIHJlc3BvbnNlIHRvIGF0dHJpYnV0ZSBwYWNrZXQgKi8KKyAgICBkZWJ1ZyhGMTExLCJyc2F0dHIiLHMsKnMpOworICAgIGlmICgqcyA9PSAnTicpIHsJCQkvKiBJZiBpdCdzICdOJyBmb2xsb3dlZCBieSBhbnl0aGluZywgKi8KKwlyZWZ1c2VkID0gZ2V0cmVhc29uKChjaGFyICopcyk7CS8qIHRoZXkgYXJlIHJlZnVzaW5nLCBnZXQgcmVhc29uLiAqLworCWRlYnVnKEYxMTAsInJzYXR0ciByZWZ1c2VkIixyZWZ1c2VkLDApOworCXRsb2coRjExMCwiIHJlZnVzZWQ6IixyZWZ1c2VkLDBMKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKyNpZmRlZiBDS19SRVNFTkQKKyAgICBpZiAoc2VuZG1vZGUgPT0gU01fUkVTRU5EICYmICpzID09ICcxJykgeyAvKiBSRVNFTkQgbGVuZ3RoICovCisJaW50IG47IGxvbmcgejsgQ0hBUiAqcDsKKwlwID0gcyArIDE7CisJbiA9IHh1bmNoYXIoKnArKyk7CisJZGVidWcoRjEwMSwicnNhdHRyIFJFU0VORCBuIiwiIixuKTsKKwl6ID0gMEw7CisJd2hpbGUgKG4tLSA+IDApCQkJLyogV2UgYXNzdW1lIHRoZSBmb3JtYXQgaXMgZ29vZC4gKi8KKwkgIHogPSAxMEwgKiB6ICsgKGxvbmcpICgqcCsrIC0gJzAnKTsKKwlkZWJ1ZyhGMTAxLCJyc2F0dHIgUkVTRU5EIHoiLCIiLHopOworCWlmICh6ID4gMEwpIHNlbmRzdGFydCA9IHo7CisJZGVidWcoRjEwMSwicnNhdHRyIFJFU0VORCBzZW5kc3RhcnQiLCIiLHNlbmRzdGFydCk7CisJaWYgKHNlbmRzdGFydCA+IDBMKQorCSAgaWYgKHpmc2VlayhzZW5kc3RhcnQpIDwgMCkJLyogSW5wdXQgZmlsZSBpcyBhbHJlYWR5IG9wZW4uICovCisJICAgIHJldHVybigwKTsKKyNpZmRlZiBDS19DVVJTRVMKKwlpZiAoZmRpc3BsYSA9PSBYWUZEX0MpCisJICB4eHNjcmVlbihTQ1JfRlMsMCxmc2l6ZSwiIik7CS8qIFJlZnJlc2ggZmlsZSB0cmFuc2ZlciBkaXNwbGF5ICovCisjZW5kaWYgLyogQ0tfQ1VSU0VTICovCisgICAgfQorI2VuZGlmIC8qIENLX1JFU0VORCAqLworICAgIHJlZnVzZWQgPSAiIjsKKyAgICByZXR1cm4oMCk7Cit9CisKK2xvbmcgcnNfbGVuID0gMEw7CQkJLyogTGVuZ3RoIG9mIGZpbGUgYmVpbmcgcmVzZW50IHRvICovCisKKy8qCisgIEdldCBhdHRyaWJ1dGVzIGZyb20gaW5jb21pbmcgQSBwYWNrZXQuICBSZXR1cm5zOgorICAgMCBvbiBzdWNjZXNzLCBmaWxlIGlzIHRvIGJlIGFjY2VwdGVkCisgIC0xIG9uIGZhaWx1cmUsIGZpbGUgaXMgdG8gYmUgcmVmdXNlZAorKi8KK2ludAorZ2F0dHIocywgeXkpIENIQVIgKnM7IHN0cnVjdCB6YXR0ciAqeXk7IHsgLyogUmVhZCBpbmNvbWluZyBhdHRyaWJ1dGUgcGFja2V0ICovCisgICAgY2hhciBjLCBkOworICAgIGNoYXIgKmZmOworICAgIGludCBhbG4sIGk7CisKKyNpZm5kZWYgTk9DU0VUUworICAgIGV4dGVybiBpbnQgcl9jc2V0LCBheGNzZXRbXTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyNkZWZpbmUgQUJVRkwgNDAJCQkvKiBUZW1wb3JhcnkgYnVmZmVyIGZvciBjb252ZXJzaW9ucyAqLworICAgIGNoYXIgYWJ1ZltBQlVGTCsxXTsKKyNkZWZpbmUgUkZCVUZMIDEwCQkJLyogUmVjb3JkLWZvcm1hdCBidWZmZXIgKi8KKyAgICBzdGF0aWMgY2hhciByZmJ1ZltSRkJVRkwrMV07CisjZGVmaW5lIEZUQlVGTCAxMAkJCS8qIEZpbGUgdHlwZSBidWZmZXIgKi8KKyAgICBzdGF0aWMgY2hhciBmdGJ1ZltGVEJVRkwrMV07CisjZGVmaW5lIERUQlVGTCA0MAkJCS8qIEZpbGUgY3JlYXRpb24gZGF0ZSAqLworICAgIHN0YXRpYyBjaGFyIGR0YnVmW0RUQlVGTCsxXTsKKyNkZWZpbmUgVFNCVUZMIDEwCQkJLyogVHJhbnNmZXIgc3ludGF4ICovCisgICAgc3RhdGljIGNoYXIgdHNidWZbVFNCVUZMKzFdOworI2RlZmluZSBJREJVRkwgMTAJCQkvKiBTeXN0ZW0gSUQgKi8KKyAgICBzdGF0aWMgY2hhciBpZGJ1ZltJREJVRkwrMV07CisjaWZuZGVmIERZTkFNSUMKKyNkZWZpbmUgRFNCVUZMIDEwMAkJCS8qIERpc3Bvc2l0aW9uICovCisgICAgc3RhdGljIGNoYXIgZHNidWZbRFNCVUZMKzFdOworI2RlZmluZSBTUEJVRkwgNTEyCQkJLyogU3lzdGVtLWRlcGVuZGVudCBwYXJhbWV0ZXJzICovCisgICAgc3RhdGljIGNoYXIgc3BidWZbU1BCVUZMKzFdOworI2Vsc2UKKyNkZWZpbmUgRFNCVUZMIDEwMAkJCS8qIERpc3Bvc2l0aW9uICovCisgICAgc3RhdGljIGNoYXIgKmRzYnVmID0gTlVMTDsKKyNkZWZpbmUgU1BCVUZMIDUxMgkJCS8qIFN5c3RlbS1kZXBlbmRlbnQgcGFyYW1ldGVycyAqLworICAgIHN0YXRpYyBjaGFyICpzcGJ1ZiA9IE5VTEw7CisjZW5kaWYgLyogRFlOQU1JQyAqLworI2RlZmluZSBSUEJVRkwgMjAJCQkvKiBBdHRyaWJ1dGUgcmVwbHkgKi8KKyAgICBzdGF0aWMgY2hhciBycGJ1ZltSUEJVRkwrMV07CisKKyNpZmRlZiBDS19QRVJNUworICAgIHN0YXRpYyBjaGFyIGxwcm1idWZbQ0tfUEVSTUxFTisxXTsKKyAgICBzdGF0aWMgY2hhciBncHJtYnVmWzJdOworI2VuZGlmIC8qIENLX1BFUk1TICovCisKKyAgICBjaGFyICpycDsJCQkJLyogUG9pbnRlciB0byByZXBseSBidWZmZXIgKi8KKyAgICBpbnQgcmV0Y29kZTsJCQkvKiBSZXR1cm4gY29kZSAqLworCisgICAgZCA9IFNQOwkJCQkvKiBJbml0aWFsaXplIGRpc3Bvc2l0aW9uICovCisgICAgZmYgPSBmaWxuYW07CQkJLyogRmlsZW5hbWUgcmV0dXJuZWQgYnkgcmN2ZmlsICovCisgICAgaWYgKGZuY2FjdCA9PSBYWUZYX1IgJiYgb2ZuMXggJiYgb2ZuMVswXSkgLyogQnV0IHdhdGNoIG91dCBmb3IgRkM9UkVOQU1FICovCisgICAgICBmZiA9IG9mbjE7CQkJLyogYmVjYXVzZSB3ZSBoYXZlbid0IHJlbmFtZWQgaXQgeWV0ICovCisKKy8qIEZpbGwgaW4gdGhlIGF0dHJpYnV0ZXMgd2UgaGF2ZSByZWNlaXZlZCAqLworCisgICAgcnAgPSBycGJ1ZjsJCQkJLyogSW5pdGlhbGl6ZSByZXBseSBidWZmZXIgKi8KKyAgICAqcnArKyA9ICdOJzsJCQkvKiBmb3IgbmVnYXRpdmUgcmVwbHkuICovCisgICAgKnJwID0gTlVMOworICAgIHJldGNvZGUgPSAwOwkJCS8qIEluaXRpYWxpemUgcmV0dXJuIGNvZGUuICovCisKKyAgICBpZiAoZGVzdCA9PSBERVNUX1ApIHsJCS8qIFNFVCBERVNUSU5BVElPTiBQUklOVEVSICovCisjaWZkZWYgRFlOQU1JQworCWlmICghZHNidWYpCisJICBpZiAoKGRzYnVmID0gbWFsbG9jKERTQlVGTCsxKSkgPT0gTlVMTCkKKwkgICAgZmF0YWwoImd0YXR0cjogbm8gbWVtb3J5IGZvciBkc2J1ZiIpOworI2VuZGlmIC8qIERZTkFNSUMgKi8KKwlkc2J1ZlswXSA9ICdQJzsKKwlkc2J1ZlsxXSA9ICdcMCc7CisJeXktPmRpc3AudmFsID0gZHNidWY7CisJeXktPmRpc3AubGVuID0gMTsKKyAgICB9CisgICAgd2hpbGUgKGMgPSAqcysrKSB7CQkJLyogR2V0IGF0dHJpYnV0ZSB0YWcgKi8KKwlhbG4gPSB4dW5jaGFyKCpzKyspOwkJLyogTGVuZ3RoIG9mIGF0dHJpYnV0ZSBzdHJpbmcgKi8KKwlzd2l0Y2ggKGMpIHsKKwkgIGNhc2UgJyEnOgkJCS8qIEZpbGUgbGVuZ3RoIGluIEsgKi8KKwkgICAgZm9yIChpID0gMDsgKGkgPCBhbG4pICYmIChpIDwgQUJVRkwpOyBpKyspIC8qIENvcHkgaXQgKi8KKwkgICAgICBhYnVmW2ldID0gKnMrKzsKKwkgICAgYWJ1ZltpXSA9ICdcMCc7CQkvKiBUZXJtaW5hdGUgd2l0aCBudWxsICovCisJICAgIGlmIChpIDwgYWxuKSBzICs9IChhbG4gLSBpKTsgLyogSWYgZmllbGQgd2FzIHRvbyBsb25nIGZvciBidWZmZXIgKi8KKwkgICAgeXktPmxlbmd0aGsgPSBhdG9sKGFidWYpOwkvKiBDb252ZXJ0IHRvIG51bWJlciAqLworCSAgICBicmVhazsKKworCSAgY2FzZSAnLyc6CQkJLyogUmVjb3JkIGZvcm1hdCAqLworCSAgICByZmJ1ZlsxXSA9IE5VTDsKKwkgICAgcmZidWZbMl0gPSBOVUw7CisJICAgIGZvciAoaSA9IDA7IChpIDwgYWxuKSAmJiAoaSA8IFJGQlVGTCk7IGkrKykgLyogQ29weSBpdCAqLworCSAgICAgIHJmYnVmW2ldID0gKnMrKzsKKwkgICAgcmZidWZbaV0gPSBOVUw7CQkvKiBUZXJtaW5hdGUgd2l0aCBudWxsICovCisJICAgIHl5LT5yZWNmbS52YWwgPSByZmJ1ZjsJLyogUG9pbnRlciB0byBzdHJpbmcgKi8KKwkgICAgeXktPnJlY2ZtLmxlbiA9IGk7CQkvKiBMZW5ndGggb2Ygc3RyaW5nICovCisJICAgIGlmICgocmZidWZbMF0gIT0gJ0EnKSB8fAorCQkocmZidWZbMV0gJiYgcmZidWZbMV0gIT0gJ00nKSB8fAorCQkocmZidWZbMl0gJiYgcmZidWZbMl0gIT0gJ0onKSkgeworCQlkZWJ1ZyhGMTEwLCJnYXR0ciBiYWQgcmVjZm0iLHJmYnVmLDApOworCQkqcnArKyA9IGM7CisJCXJldGNvZGUgPSAtMTsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgY2FzZSAnIic6CQkJLyogRmlsZSB0eXBlICh0ZXh0LCBiaW5hcnksIC4uLikgKi8KKwkgICAgZm9yIChpID0gMDsgKGkgPCBhbG4pICYmIChpIDwgRlRCVUZMKTsgaSsrKQorCSAgICAgIGZ0YnVmW2ldID0gKnMrKzsJCS8qIENvcHkgaXQgaW50byBhIHN0YXRpYyBzdHJpbmcgKi8KKwkgICAgZnRidWZbaV0gPSAnXDAnOworCSAgICBpZiAoaSA8IGFsbikgcyArPSAoYWxuIC0gaSk7CisJICAgIC8qIFRZUEUgYXR0cmlidXRlIGlzIGVuYWJsZWQ/ICovCisJICAgIGlmIChhdHR5cGkpIHsKKwkJeXktPnR5cGUudmFsID0gZnRidWY7CS8qIFBvaW50ZXIgdG8gc3RyaW5nICovCisJCXl5LT50eXBlLmxlbiA9IGk7CS8qIExlbmd0aCBvZiBzdHJpbmcgKi8KKwkJZGVidWcoRjExMSwiZ2F0dHIgZmlsZSB0eXBlIiwgZnRidWYsIGkpOworCQlkZWJ1ZyhGMTAxLCJnYXR0ciBiaW5hcnkgMSIsIiIsYmluYXJ5KTsKKwkJLyogVW5rbm93biB0eXBlPyAqLworCQlpZiAoKCpmdGJ1ZiAhPSAnQScgJiYgKmZ0YnVmICE9ICdCJyAmJiAqZnRidWYgIT0gJ0knKQorI2lmZGVmIENLX0xBQkVMRUQKKy8qIC4uLiBPciBvdXIgRklMRSBUWVBFIGlzIExBQkVMRUQgYW5kIHRoZSBpbmNvbWluZyBmaWxlIGlzIHRleHQuLi4gKi8KKwkJICAgIHx8IChiaW5hcnkgPT0gWFlGVF9MICYmICpmdGJ1ZiA9PSAnQScgJiYgIXhmbGcpCisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworCQkgICAgKSB7CisJCSAgICByZXRjb2RlID0gLTE7CS8qIFJlamVjdCB0aGUgZmlsZSAqLworCQkgICAgKnJwKysgPSBjOworCQkgICAgaWYgKCFvcG5lcnIpIHRsb2coRjEwMCwiIHJlZnVzZWQ6IHR5cGUiLCIiLDApOworCQkgICAgYnJlYWs7CisJCX0KKy8qCisgIFRoZSBmb2xsb3dpbmcgY29kZSBtb3ZlZCBoZXJlIGZyb20gb3BlbmEoKSBzbyB3ZSBzZXQgYmluYXJ5IG1vZGUKKyAgYXMgc29vbiBhcyByZXF1ZXN0ZWQgYnkgdGhlIGF0dHJpYnV0ZSBwYWNrZXQuICBUaGF0IHdheSB3aGVuIHRoZSBmaXJzdAorICBkYXRhIHBhY2tldCBjb21lcywgdGhlIG1vZGUgb2YgdHJhbnNmZXIgY2FuIGJlIGRpc3BsYXllZCBjb3JyZWN0bHkKKyAgYmVmb3JlIG9wZW5hKCkgaXMgY2FsbGVkLgorKi8KKwkJaWYgKHl5LT50eXBlLnZhbFswXSA9PSAnQScpIHsgLyogQ2hlY2sgcmVjZWl2ZWQgYXR0cmlidXRlcy4gKi8KKyNpZmRlZiBWTVMKKwkJICAgIGlmIChiaW5hcnkgIT0gWFlGVF9JKSAvKiBWTVMgSU1BR0Ugb3ZlcnJpZGVzIHRoaXMgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKwkJICAgICAgYmluYXJ5ID0gWFlGVF9UOwkvKiBTZXQgY3VycmVudCB0eXBlIHRvIFRleHQuICovCisJCSAgICBkZWJ1ZyhGMTAxLCJnYXR0ciBiaW5hcnkgMiIsIiIsYmluYXJ5KTsKKwkJfSBlbHNlIGlmICh5eS0+dHlwZS52YWxbMF0gPT0gJ0InKSB7CisjaWZkZWYgQ0tfTEFCRUxFRAorCQkgICAgaWYgKGJpbmFyeSAhPSBYWUZUX0wKKyNpZmRlZiBWTVMKKwkJCSYmIGJpbmFyeSAhPSBYWUZUX1UgLyogVk1TIHNwZWNpYWwgY2FzZSAqLworI2VuZGlmIC8qIFZNUyAqLworCQkJKQorI2VuZGlmIC8qIENLX0xBQkVMRUQgKi8KKyNpZmRlZiBNQUMKKwkJICAgIGlmIChiaW5hcnkgIT0gWFlGVF9NKSAvKiBJZiBub3QgTWFjQmluYXJ5Li4uICovCisjZW5kaWYgLyogTUFDICovCisJCSAgICAgIGJpbmFyeSA9IFhZRlRfQjsKKwkJICAgIGRlYnVnKEYxMDEsImdhdHRyIGJpbmFyeSAzIiwiIixiaW5hcnkpOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJyMnOgkJCS8qIEZpbGUgY3JlYXRpb24gZGF0ZSAqLworCSAgICBmb3IgKGkgPSAwOyAoaSA8IGFsbikgJiYgKGkgPCBEVEJVRkwpOyBpKyspCisJICAgICAgZHRidWZbaV0gPSAqcysrOwkJLyogQ29weSBpdCBpbnRvIGEgc3RhdGljIHN0cmluZyAqLworCSAgICBpZiAoaSA8IGFsbikgcyArPSAoYWxuIC0gaSk7CisJICAgIGR0YnVmW2ldID0gJ1wwJzsKKwkgICAgaWYgKGF0ZGF0aSAmJiAheGZsZykgewkvKiBSZWFsIGZpbGUgYW5kIGRhdGVzIGVuYWJsZWQgKi8KKwkJeXktPmRhdGUudmFsID0gZHRidWY7CS8qIFBvaW50ZXIgdG8gc3RyaW5nICovCisJCXl5LT5kYXRlLmxlbiA9IGk7CS8qIExlbmd0aCBvZiBzdHJpbmcgKi8KKwkJaWYgKGZuY2FjdCA9PSBYWUZYX1UpIHsJLyogUmVjZWl2aW5nIGluIHVwZGF0ZSBtb2RlPyAqLworCQkgICAgaWYgKHpzdGltZShmZix5eSwxKSA+IDApIHsgLyogQ29tcGFyZSBkYXRlcyAqLworCQkJKnJwKysgPSBjOwkvKiBEaXNjYXJkIGlmIG9sZGVyLCByZWFzb24gPSBkYXRlLiAqLworCQkJaWYgKCFvcG5lcnIpIHRsb2coRjEwMCwiIHJlZnVzZWQ6IGRhdGUiLCIiLDApOworCQkJcmV0Y29kZSA9IC0xOwkvKiBSZWplY3Rpb24gbm90aWNlLiAqLworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJygnOgkJCS8qIEZpbGUgQmxvY2sgU2l6ZSAqLworCSAgICBmb3IgKGkgPSAwOyAoaSA8IGFsbikgJiYgKGkgPCBBQlVGTCk7IGkrKykgLyogQ29weSBpdCAqLworCSAgICAgIGFidWZbaV0gPSAqcysrOworCSAgICBhYnVmW2ldID0gJ1wwJzsJCS8qIFRlcm1pbmF0ZSB3aXRoIG51bGwgKi8KKwkgICAgaWYgKGkgPCBhbG4pIHMgKz0gKGFsbiAtIGkpOworCSAgICBpZiAoYXRibGtpKQorCSAgICAgIHl5LT5ibGtzaXplID0gYXRvbChhYnVmKTsgLyogQ29udmVydCB0byBudW1iZXIgKi8KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJyonOgkJCS8qIEVuY29kaW5nICh0cmFuc2ZlciBzeW50YXgpICovCisJICAgIGZvciAoaSA9IDA7IChpIDwgYWxuKSAmJiAoaSA8IFRTQlVGTCk7IGkrKykKKwkgICAgICB0c2J1ZltpXSA9ICpzKys7CQkvKiBDb3B5IGl0IGludG8gYSBzdGF0aWMgc3RyaW5nICovCisJICAgIGlmIChpIDwgYWxuKSBzICs9IChhbG4gLSBpKTsKKwkgICAgdHNidWZbaV0gPSAnXDAnOworI2lmbmRlZiBOT0NTRVRTCisJICAgIHhsYXR5cGUgPSBYTEFfTk9ORTsJCS8qIEFzc3VtZSBubyB0cmFuc2xhdGlvbiAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKwkgICAgaWYgKGF0ZW5jaSkgeworCQljaGFyICogc3M7CisJCXl5LT5lbmNvZGluZy52YWwgPSB0c2J1ZjsgLyogUG9pbnRlciB0byBzdHJpbmcgKi8KKwkJeXktPmVuY29kaW5nLmxlbiA9IGk7CS8qIExlbmd0aCBvZiBzdHJpbmcgKi8KKwkJZGVidWcoRjEwMSwiZ2F0dHIgZW5jb2RpbmciLHRzYnVmLGkpOworCQlzcyA9IHRzYnVmKzE7CisJCXN3aXRjaCAoKnRzYnVmKSB7CisjaWZuZGVmIE5PQ1NFVFMKKwkJICBjYXNlICdBJzoJCSAgLyogTm9ybWFsLCBub3RoaW5nIHNwZWNpYWwgKi8KKwkJICAgIHRjaGFyc2V0ID0gVENfVFJBTlNQOyAvKiBUcmFuc3BhcmVudCBjaGFycyB1bnRyYW5zbGF0ZWQgKi8KKwkJICAgIGRlYnVnKEYxMTAsImdhdHRyIHNldHMgdGNoYXJzZXQgVENfVFJBTlNQIiwiQSIsMCk7CisJCSAgICBicmVhazsKKwkJICBjYXNlICdDJzoJCSAgLyogU3BlY2lmaWVkIGNoYXJhY3RlciBzZXQgKi8KKwkJICAgIGlmICgheGZyeGxhKSB7CSAgLyogQnV0IHRyYW5zbGF0aW9uIGRpc2FibGVkICovCisJCQl0Y2hhcnNldCA9IFRDX1RSQU5TUDsKKwkJCWRlYnVnKEYxMTAsImdhdHRyIHNldHMgdGNoYXJzZXQgVENfVFJBTlNQIiwiQyIsMCk7CisJCQlicmVhazsKKwkJICAgIH0KKyNpZmRlZiBVTklDT0RFCisJCSAgICBpZiAoIXN0cmNtcCgiSTE5NiIsc3MpKSAvKiBUcmVhdCBJMTk2IChVVEYtOCBubyBsZXZlbCkgKi8KKwkJICAgICAgc3MgPSAiSTE5MCI7CSAgICAvKiBhcyBJMTkwIChVVEYtOCBMZXZlbCAxKSAqLworI2VuZGlmIC8qIFVOSUNPREUgKi8KKwkJICAgIGlmICghc3RyY21wKCJJNi8yMDQiLHNzKSkgLyogVHJlYXQgIkxhdGluLTEgKyBFdXJvIiAqLworCQkgICAgICBzcyA9ICJJNi8xMDAiOwkgICAgICAvKiBhcyBJNi8xMDAgKHJlZ3VsYXIgTGF0aW4tMSkgKi8KKwkJICAgIGZvciAoaSA9IDA7IGkgPCBudGNzZXRzOyBpKyspIHsKKwkJCWlmICghc3RyY21wKHRjc2luZm9baV0uZGVzaWduYXRvcixzcykpCisJCQkgIGJyZWFrOworCQkgICAgfQorCQkgICAgZGVidWcoRjEwMSwiZ2F0dHIgeGZlciBjaGFyc2V0IGxvb2t1cCIsIiIsaSk7CisJCSAgICBpZiAoaSA9PSBudGNzZXRzKSB7CS8qIElmIHVua25vd24gY2hhcmFjdGVyIHNldCwgKi8KKwkJCWRlYnVnKEYxMTAsImdhdHRyOiB4ZmVyIGNoYXJzZXQgdW5rbm93biIsc3MsMCk7CisJCQlpZiAoIXVua2NzKSB7CS8qIGFuZCBTRVQgVU5LTk9XTiBESVNDQVJELCAqLworCQkJICAgIHJldGNvZGUgPSAtMTsgLyogcmVqZWN0IHRoZSBmaWxlLiAqLworCQkJICAgICpycCsrID0gYzsKKwkJCSAgICBpZiAoIW9wbmVycikKKwkJCSAgICAgIHRsb2coRjEwMCwiIHJlZnVzZWQ6IGNoYXJhY3RlciBzZXQiLCIiLDApOworCQkJfQorCQkgICAgfSBlbHNlIHsKKwkJCXRjaGFyc2V0ID0gdGNzaW5mb1tpXS5jb2RlOyAvKiBpdCdzIGtub3duLCB1c2UgaXQgKi8KKwkJCWRlYnVnKEYxMDEsImdhdHRyIHN3aXRjaCB0Y2hhcnNldCIsIiIsdGNoYXJzZXQpOworCQkJZGVidWcoRjEwMSwiZ2F0dHIgZmNoYXJzZXQiLCIiLGZjaGFyc2V0KTsKKwkJCWlmIChyX2NzZXQgPT0gWE1PREVfQSkgeyAvKiBBdXRvbWF0aWMgc3dpdGNoaW5nPyAqLworCQkJICAgIGlmICh0Y2hhcnNldCA+IC0xICYmIHRjaGFyc2V0IDw9IE1BWFRDU0VUUykgeworCQkJCWludCB4OworCQkJCXggPSBheGNzZXRbdGNoYXJzZXRdOworCQkJCWlmICh4ID4gMCAmJiB4IDw9IE1BWEZDU0VUUykgeworCQkJCSAgICBmY2hhcnNldCA9IHg7CisJCQkJICAgIGRlYnVnKEYxMDEsImdhdHRyIHN3aXRjaCBmY2hhcnNldCIsIiIseCk7CisJCQkJfQorCQkJICAgIH0KKwkJCX0KKwkJCS8qIFNldCB1cCB0cmFuc2xhdGlvbiB0eXBlIGFuZCBmdW5jdGlvbiAqLworCQkJc2V0eGxhdHlwZSh0Y2hhcnNldCxmY2hhcnNldCk7CisJCSAgICB9CisJCWJyZWFrOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKwkgICAgICBkZWZhdWx0OgkJCS8qIFNvbWV0aGluZyBlbHNlLiAqLworCQlkZWJ1ZyhGMTEwLCJnYXR0ciB1bmsgZW5jb2RpbmcgYXR0cmlidXRlIix0c2J1ZiwwKTsKKwkJaWYgKCF1bmtjcykgewkJLyogSWYgU0VUIFVOSyBESVNDICovCisJCSAgICByZXRjb2RlID0gLTE7CisJCSAgICAqcnArKyA9IGM7CisJCSAgICBpZiAoIW9wbmVycikgdGxvZyhGMTAwLCIgcmVmdXNlZDogZW5jb2RpbmciLCIiLDApOworCQl9CisJCWJyZWFrOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJysnOgkJCS8qIERpc3Bvc2l0aW9uICovCisjaWZkZWYgRFlOQU1JQworCSAgICBpZiAoIWRzYnVmKQorCSAgICAgIGlmICgoZHNidWYgPSBtYWxsb2MoRFNCVUZMKzEpKSA9PSBOVUxMKQorCQlmYXRhbCgiZ3RhdHRyOiBubyBtZW1vcnkgZm9yIGRzYnVmIik7CisjZW5kaWYgLyogRFlOQU1JQyAqLworCSAgICBmb3IgKGkgPSAwOyAoaSA8IGFsbikgJiYgKGkgPCBEU0JVRkwpOyBpKyspCisJICAgICAgZHNidWZbaV0gPSAqcysrOwkJLyogQ29weSBpdCBpbnRvIGEgc2VwYXJhdGUgc3RyaW5nICovCisJICAgIGRzYnVmW2ldID0gJ1wwJzsKKwkgICAgaWYgKGkgPCBhbG4pIHMgKz0gKGFsbiAtIGkpOworCSAgICByc19sZW4gPSAwOworCSAgICBpZiAoYXRkaXNpKSB7CQkvKiBXZSBhcmUgZG9pbmcgdGhpcyBhdHRyaWJ1dGUgKi8KKwkJLyogQ29weSBpdCBpbnRvIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlICovCisJCXl5LT5kaXNwLnZhbCA9IGRzYnVmOwkvKiBQb2ludGVyIHRvIHN0cmluZyAqLworCQl5eS0+ZGlzcC5sZW4gPSBpOwkvKiBMZW5ndGggb2Ygc3RyaW5nICovCisJCWQgPSAqZHNidWY7CisjaWZuZGVmIE5PRElTUE8KKy8qCisgIERlZmluZSBOT0RJU1BPIHRvIGRpc2FibGUgcmVjZWlwdCBvZiBtYWlsIG9yIHByaW50IGZpbGVzIGFuZCBvZiBSRVNFTkQuCisqLworCQlpZiAoCisjaWZuZGVmIGRhdGFnZW5lcmFsCQkJLyogTUFJTCBzdXBwb3J0ZWQgb25seSBmb3IgKi8KKyNpZm5kZWYgT1MyCQkJCS8qIFVOSVgsIFZNUywgYW5kIE9TLTkgKi8KKyNpZm5kZWYgTUFDCisjaWZuZGVmIEdFTURPUworI2lmbmRlZiBBTUlHQQorCQkgICAgZCAhPSAnTScgJiYJCS8qIE1BSUwgKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworI2VuZGlmIC8qIEdFTURPUyAqLworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIE9TLzIgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2lmZGVmIENLX1JFU0VORAorCQkgICAgZCAhPSAnUicgJiYJCS8qIFJFU0VORCAqLworI2VuZGlmIC8qIENLX1JFU0VORCAqLworCQkgICAgZCAhPSAnUCcpIHsJCS8qIFBSSU5UICovCisJCSAgICByZXRjb2RlID0gLTE7CS8qIFVua25vd24vdW5zdXBwb3J0ZWQgZGlzcG9zaXRpb24gKi8KKwkJICAgICpycCsrID0gYzsKKwkJICAgIGlmICghb3BuZXJyKSB0bG9nKEYxMDEsIiByZWZ1c2VkOiBiYWQgZGlzcG9zaXRpb24iLCIiLGQpOworCQl9CisJCWRpc3BvcyA9IGQ7CisJCWRlYnVnKEYwMDAsImdhdHRyIGRpc3BvcyIsIiIsZGlzcG9zKTsKKwkJc3dpdGNoIChkKSB7CisjaWZuZGVmIE5PRlJJTExTCisJCSAgY2FzZSAnTSc6CisJCSAgICBpZiAoIWVuX21haSkgeworCQkJcmV0Y29kZSA9IC0xOworCQkJKnJwKysgPSBjOworCQkJaWYgKCFvcG5lcnIpIHRsb2coRjEwMCwiIHJlZnVzZWQ6IG1haWwgZGlzYWJsZWQiLCIiLDApOworCQkJZGlzcG9zID0gMDsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworI2VuZGlmIC8qIE5PRlJJTExTICovCisJCSAgY2FzZSAnUCc6CisJCSAgICBpZiAoIWVuX3ByaSkgeworCQkJcmV0Y29kZSA9IC0xOworCQkJKnJwKysgPSBjOworCQkJaWYgKCFvcG5lcnIpCisJCQkgIHRsb2coRjEwMCwiIHJlZnVzZWQ6IHByaW50IGRpc2FibGVkIiwiIiwwKTsKKwkJCWRpc3BvcyA9IDA7CisJCSAgICB9CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJ1InOgorCQkgICAgZGlzcG9zID0gMDsKKyNpZmRlZiBDS19SRVNFTkQKKwkJICAgIHJzX2xlbiA9IHpnZXRmcyhmZik7IC8qIEdldCBsZW5ndGggb2YgZmlsZSAqLworCQkgICAgZGVidWcoRjExMSwiZ2F0dHIgUkVTRU5EIixmZixyc19sZW4pOworI2lmZGVmIFZNUworCQkgICAgcnNfbGVuICY9IChsb25nKSAtNTEyOyAvKiBFbnN1cmUgYmxvY2sgYm91bmRhcnkgaWYgVk1TICovCisJCSAgICByc19sZW4gLT0gNTEyOwkgIC8qIEluIGNhc2UgbGFzdCBibG9jayBub3QgY29tcGxldGUgKi8KKwkJICAgIGRlYnVnKEYxMTEsImdhdHRyIHJzX2xlbiIsZmYscnNfbGVuKTsKKyNlbmRpZiAvKiBWTVMgKi8KKyNpZmRlZiBDT01NRU5UCisJCSAgICBpZiAocnNfbGVuIDwgMEwpCS8qIExvY2FsIGZpbGUgZG9lc24ndCBleGlzdCAqLworCQkgICAgICByc19sZW4gPSAwTDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisvKgorICBBbm90aGVyIHBvc3NpYmlsaXR5IGhlcmUgKG9yIGxhdGVyLCByZWFsbHkpIHdvdWxkIGJlIHRvIGNoZWNrIGlmIHRoZSB0d28KKyAgZmlsZSBsZW5ndGhzIGFyZSB0aGUgc2FtZSwgYW5kIGlmIHNvLCBrZWVwIHRoZSBwcmV2YWlsaW5nIGNvbGxpc2lvbiBhY3Rpb24KKyAgYXMgaXMgKG5vdGU6IHJzX2xlbiA9PSBsZW5ndGggb2YgZXhpc3RpbmcgZmlsZTsgeXktPmxlbmd0aCA9PSBmc2l6ZSA9PQorICBsZW5ndGggb2YgaW5jb21pbmcgZmlsZSkuICBUaGlzIGNvdWxkIGJlIGNvbXBsaWNhdGVkLCB0aG91Z2gsIHNpbmNlCisgIChhKSB3ZSBtaWdodCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgbGVuZ3RoIGF0dHJpYnV0ZSB5ZXQsIGFuZCBpbiBmYWN0IGl0CisgIG1pZ2h0IGV2ZW4gYmUgaW4gYSBzdWJzZXF1ZW50IEEtcGFja2V0LCB5ZXQgKGIpIHdlIGhhdmUgdG8gYWNjZXB0IG9yIHJlamVjdAorICB0aGUgUmVjb3ZlciBhdHRyaWJ1dGUgbm93LiAgU28gYmV0dGVyIHRvIGxlYXZlIGFzLWlzLiAgQW55d2F5LCBpdCdzIHByb2JhYmx5CisgIG1vcmUgdXNlZnVsIHRoaXMgd2F5LgorKi8KKwkJICAgIGlmIChyc19sZW4gPiAwTCkgeworCQkJZm5jc2F2ID0gZm5jYWN0OyAvKiBTYXZlIGNvbGxpc2lvbiBhY3Rpb24gKi8KKwkJCWZuY2FjdCA9IFhZRlhfQTsgLyogU3dpdGNoIHRvIEFQUEVORCAqLworCQkgICAgfQorI2Vsc2UKKwkJICAgIHJldGNvZGUgPSAtMTsJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCisJCSAgICAqcnArKyA9IGM7CQkvKiAnY2F1c2UgaXQgd2Fzbid0IG5lZ290aWF0ZWQuICovCisJCSAgICBpZiAoIW9wbmVycikgdGxvZyhGMTAwLCIgcmVmdXNlZDogcmVzZW5kIiwiIiwwKTsKKyNlbmRpZiAvKiBDS19SRVNFTkQgKi8KKwkJfQorI2Vsc2UgIC8qIE5PRElTUE8gKi8KKwkJcmV0Y29kZSA9IC0xOworCQkqcnArKyA9IGM7CisJCWlmICghb3BuZXJyKSB0bG9nKEYxMDAsIiByZWZ1c2VkOiBOT0RJU1BPIiwiIiwwKTsKKyNlbmRpZiAvKiBOT0RJU1BPICovCisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJy4nOgkJCS8qIFNlbmRlcidzIHN5c3RlbSBJRCAqLworCSAgICBmb3IgKGkgPSAwOyAoaSA8IGFsbikgJiYgKGkgPCBJREJVRkwpOyBpKyspCisJICAgICAgaWRidWZbaV0gPSAqcysrOwkJLyogQ29weSBpdCBpbnRvIGEgc3RhdGljIHN0cmluZyAqLworCSAgICBpZGJ1ZltpXSA9ICdcMCc7CisJICAgIGlmIChpIDwgYWxuKSBzICs9IChhbG4gLSBpKTsKKwkgICAgaWYgKGF0c2lkaSkgeworCQl5eS0+c3lzdGVtaWQudmFsID0gaWRidWY7IC8qIFBvaW50ZXIgdG8gc3RyaW5nICovCisJCXl5LT5zeXN0ZW1pZC5sZW4gPSBpOwkvKiBMZW5ndGggb2Ygc3RyaW5nICovCisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJzAnOgkJCS8qIFN5c3RlbS1kZXBlbmRlbnQgcGFyYW1ldGVycyAqLworI2lmZGVmIERZTkFNSUMKKwkgICAgaWYgKCFzcGJ1ZiAmJiAhKHNwYnVmID0gbWFsbG9jKFNQQlVGTCkpKQorCQlmYXRhbCgiZ2F0dHI6IG5vIG1lbW9yeSBmb3Igc3BidWYiKTsKKyNlbmRpZiAvKiBEWU5BTUlDICovCisJICAgIGZvciAoaSA9IDA7IChpIDwgYWxuKSAmJiAoaSA8IFNQQlVGTCk7IGkrKykKKwkgICAgICBzcGJ1ZltpXSA9ICpzKys7CQkvKiBDb3B5IGl0IGludG8gYSBzdGF0aWMgc3RyaW5nICovCisJICAgIHNwYnVmW2ldID0gJ1wwJzsKKwkgICAgaWYgKGkgPCBhbG4pIHMgKz0gKGFsbiAtIGkpOworCSAgICBpZiAoYXRzeXNpKSB7CisJCXl5LT5zeXNwYXJhbS52YWwgPSBzcGJ1ZjsgLyogUG9pbnRlciB0byBzdHJpbmcgKi8KKwkJeXktPnN5c3BhcmFtLmxlbiA9IGk7CS8qIExlbmd0aCBvZiBzdHJpbmcgKi8KKwkgICAgfQorCSAgICBicmVhazsKKworCSAgY2FzZSAnMSc6CQkJLyogRmlsZSBsZW5ndGggaW4gYnl0ZXMgKi8KKwkgICAgZm9yIChpID0gMDsgKGkgPCBhbG4pICYmIChpIDwgQUJVRkwpOyBpKyspIC8qIENvcHkgaXQgKi8KKwkgICAgICBhYnVmW2ldID0gKnMrKzsKKwkgICAgYWJ1ZltpXSA9ICdcMCc7CQkvKiBUZXJtaW5hdGUgd2l0aCBudWxsICovCisJICAgIGlmIChpIDwgYWxuKSBzICs9IChhbG4gLSBpKTsKKwkgICAgeXktPmxlbmd0aCA9IGF0b2woYWJ1Zik7CS8qIENvbnZlcnQgdG8gbnVtYmVyICovCisJICAgIGRlYnVnKEYxMTEsImdhdHRyIGxlbmd0aCIsYWJ1ZiwoaW50KSB5eS0+bGVuZ3RoKTsKKwkgICAgYnJlYWs7CisKKworI2lmZGVmIENLX1BFUk1TCisJICBjYXNlICcsJzoJCQkvKiBTeXN0ZW0tZGVwZW5kZW50IHByb3RlY3Rpb24gY29kZSAqLworCSAgICBmb3IgKGkgPSAwOyAoaSA8IGFsbikgJiYgKGkgPCBDS19QRVJNTEVOKTsgaSsrKQorCSAgICAgIGxwcm1idWZbaV0gPSAqcysrOwkvKiBKdXN0IGNvcHkgaXQgLSBkZWNvZGUgbGF0ZXIgKi8KKwkgICAgbHBybWJ1ZltpXSA9ICdcMCc7CQkvKiBUZXJtaW5hdGUgd2l0aCBudWxsICovCisJICAgIGlmIChpIDwgYWxuKSBzICs9IChhbG4gLSBpKTsKKwkgICAgaWYgKGF0bHByaSkgeworCQl5eS0+bHByb3RlY3QudmFsID0gKGNoYXIgKilscHJtYnVmOworCQl5eS0+bHByb3RlY3QubGVuID0gaTsKKwkgICAgfSBlbHNlCisJICAgICAgbHBybWJ1ZlswXSA9IE5VTDsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJy0nOgkJCS8qIEdlbmVyaWMgIndvcmxkIiBwcm90ZWN0aW9uIGNvZGUgKi8KKwkgICAgZ3BybWJ1ZlswXSA9IE5VTDsJCS8qIEp1c3QgMSBieXRlIGJ5IGRlZmluaXRpb24gKi8KKwkgICAgZm9yIChpID0gMDsgaSA8IGFsbjsgaSsrKQkvKiBCdXQgYWxsb3cgZm9yIG1vcmUuLi4gKi8KKwkgICAgICBpZiAoaSA9PSAwKSBncHJtYnVmWzBdID0gKnMrKzsKKwkgICAgZ3BybWJ1ZlsxXSA9IE5VTDsKKwkgICAgaWYgKGF0Z3ByaSkgeworCQl5eS0+Z3Byb3RlY3QudmFsID0gKGNoYXIgKilncHJtYnVmOworCQl5eS0+Z3Byb3RlY3QubGVuID0gZ3BybWJ1ZlswXSA/IDEgOiAwOworCSAgICB9IGVsc2UKKwkgICAgICBncHJtYnVmWzBdID0gTlVMOworCSAgICBicmVhazsKKyNlbmRpZiAvKiBDS19QRVJNUyAqLworCisJICBkZWZhdWx0OgkJCS8qIFVua25vd24gYXR0cmlidXRlICovCisJICAgIHMgKz0gYWxuOwkJCS8qIEp1c3Qgc2tpcCBwYXN0IGl0ICovCisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICAvKiBDaGVjayBmaWxlIGxlbmd0aCBub3csIGJlY2F1c2Ugd2UgYWxzbyBuZWVkIHRvIGtub3cgdGhlIGZpbGUgdHlwZSAqLworICAgIC8qIGluIGNhc2UgemNoa3NwYSgpIGRpZmZlcmVudGlhdGVzIHRleHQgYW5kIGJpbmFyeSAoVk1TIHZlcnNpb24gZG9lcykgKi8KKworICAgIGlmIChhdGxlbmkpIHsJCQkvKiBMZW5ndGggYXR0cmlidXRlIGVuYWJsZWQ/ICovCisJaWYgKHl5LT5sZW5ndGggPiAtMUwpIHsJCS8qIExlbmd0aC1pbi1ieXRlcyBhdHRyaWJ1dGUgcmVjJ2Q/ICovCisJICAgIGlmICghemNoa3NwYShmZiwoeXktPmxlbmd0aCkpKSB7IC8qIENoZWNrIHNwYWNlICovCisJCXJldGNvZGUgPSAtMTsJCSAgICAgLyogTm90IGVudWYgKi8KKwkJKnJwKysgPSAnMSc7CisJCWlmICghb3BuZXJyKSB0bG9nKEYxMDAsIiByZWZ1c2VkOiBsZW5ndGggYnl0ZXMiLCIiLDApOworCSAgICB9CisJfSBlbHNlIGlmICh5eS0+bGVuZ3RoayA+IC0xTCkgewkvKiBMZW5ndGggaW4gSyBhdHRyaWJ1dGUgcmVjJ2Q/ICovCisJICAgIGlmICghemNoa3NwYShmZiwoeXktPmxlbmd0aGsgKiAxMDI0KSkpIHsKKwkJcmV0Y29kZSA9IC0xOwkJLyogQ2hlY2sgc3BhY2UgKi8KKwkJKnJwKysgPSAnISc7CisJCWlmICghb3BuZXJyKSB0bG9nKEYxMDAsIiByZWZ1c2VkOiBsZW5ndGggSyIsIiIsMCk7CisJICAgIH0KKwl9CisgICAgfQorICAgIGlmICh5eS0+bGVuZ3RoID4gLTFMKSB7CQkvKiBSZW1lbWJlciB0aGUgZmlsZSBzaXplICovCisJZnNpemUgPSB5eS0+bGVuZ3RoOworICAgIH0gZWxzZSBpZiAoeXktPmxlbmd0aGsgPiAtMUwpIHsKKwlmc2l6ZSA9IHl5LT5sZW5ndGhrICogMTAyNEw7CisgICAgfSBlbHNlIGZzaXplID0gLTFMOworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisJc3ByaW50ZihhYnVmLCIlbGQiLGZzaXplKTsJLyogc2FmZSAqLworCWRlYnVnKEYxMTAsImdhdHRyIGZzaXplIixhYnVmLDApOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgaWYgKHJldGNvZGUgPT0gMCkgcnAgPSBycGJ1ZjsJLyogTnVsbCByZXBseSBzdHJpbmcgaWYgYWNjZXB0ZWQgKi8KKyAgICAqcnAgPSAnXDAnOwkJCQkvKiBFbmQgb2YgcmVwbHkgc3RyaW5nICovCisKKyNpZmRlZiBDS19SRVNFTkQKKyAgICBpZiAoZCA9PSAnUicpIHsJCQkvKiBSZWNlaXZpbmcgYSBSRVNFTkQ/ICovCisJZGVidWcoRjEwMSwiZ2F0dHIgUkVTRU5EIiwiIixyZXRjb2RlKTsKKwkvKiBXZSBpZ25vcmUgcmV0Y29kZXMgYmVjYXVzZSB0aGlzIG92ZXJyaWRlcyAqLworCWlmIChiaW5hcnkgIT0gWFlGVF9CKSB7CQkvKiBSZWplY3QgaWYgbm90IGJpbmFyeSAqLworCSAgICByZXRjb2RlID0gLTE7CQkvKiBpbiBjYXNlIHR5cGUgZmllbGQgY2FtZSAqLworCSAgICBja3N0cm5jcHkocnBidWYsIk4rIixSUEJVRkwpOyAvKiBhZnRlciB0aGUgZGlzcG9zaXRpb24gZmllbGQgKi8KKwkgICAgZGVidWcoRjExMSwiZ2F0dHIgUkVTRU5EIG5vdCBiaW5hcnkiLHJwYnVmLGJpbmFyeSk7CisJfSBlbHNlIHsJCQkvKiBCaW5hcnkgbW9kZSAqLworCSAgICByZXRjb2RlID0gMDsJCS8qIEFjY2VwdCB0aGUgZmlsZSAqLworCSAgICBkaXNjYXJkID0gMDsJCS8qIElmIFNFVCBGSUxFIENPTExJU0lPTiBESVNDQVJEICovCisJICAgIHNwcmludGYocnBidWYrMiwiJWxkIixyc19sZW4pOyAvKiBSZXBseSB3aXRoIGxlbmd0aCBvZiBmaWxlICovCisJICAgIHJwYnVmWzBdID0gJzEnOwkJLyogJzEnIG1lYW5zIExlbmd0aCBpbiBCeXRlcyAqLworCSAgICBycGJ1ZlsxXSA9IHRvY2hhcigoaW50KXN0cmxlbihycGJ1ZisyKSk7IC8qIExlbmd0aCBvZiBsZW5ndGggKi8KKwkgICAgZGVidWcoRjExMSwiZ2F0dHIgUkVTRU5EIE9LIixycGJ1ZixyZXRjb2RlKTsKKwl9CisgICAgfQorI2VuZGlmIC8qIENLX1JFU0VORCAqLworICAgIGlmIChyZXRjb2RlID09IDAgJiYgZGlzY2FyZCAhPSAwKSB7CS8qIERvIHdlIHN0aWxsIGhhdmUgYSBkaXNjYXJkIGZsYWc/ICovCisJY2tzdHJuY3B5KHJwYnVmLCJOPyIsUlBCVUZMKTsJLyogWWVzLCBtdXN0IGJlIGZpbGVuYW1lIGNvbGxpc2lvbiAqLworCXJldGNvZGUgPSAtMTsJCQkvKiAiPyIgPSBuYW1lIChyZXBseS1vbmx5IGNvZGUpICovCisgICAgfQorICAgIHl5LT5yZXBseS52YWwgPSBycGJ1ZjsJCS8qIEFkZCBpdCB0byBhdHRyaWJ1dGUgc3RydWN0dXJlICovCisgICAgeXktPnJlcGx5LmxlbiA9IChpbnQpc3RybGVuKHJwYnVmKTsKKyAgICBpZiAocmV0Y29kZSA8IDApIHsJCQkvKiBJZiB3ZSBhcmUgcmVqZWN0aW5nICovCisJZGlzY2FyZCA9IDE7CQkJLyogcmVtZW1iZXIgdG8gZGlzY2FyZCB0aGUgZmlsZSAqLworCXJlamVjdGlvbiA9IHJwYnVmWzFdOwkJLyogYW5kIHVzZSB0aGUgZmlyc3QgcmVhc29uIGdpdmVuLiAqLworCWlmIChmbmNzYXYgIT0gLTEpIHsKKwkgICAgZm5jYWN0ID0gZm5jc2F2OworCSAgICBmbmNzYXYgPSAtMTsKKwl9CisgICAgfQorICAgIGRlYnVnKEYxMTEsImdhdHRyIHJldHVybiIscnBidWYscmV0Y29kZSk7CisgICAgcmV0dXJuKHJldGNvZGUpOworfQorCisvKiAgSSBOIEkgVCBBIFQgVCBSICAtLSAgSW5pdGlhbGl6ZSBmaWxlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUgICovCisKK2ludAoraW5pdGF0dHIoeXkpIHN0cnVjdCB6YXR0ciAqeXk7IHsKKyAgICB5eS0+bGVuZ3RoayA9IHl5LT5sZW5ndGggPSAtMUw7CisgICAgeXktPnR5cGUudmFsID0gIiI7CisgICAgeXktPnR5cGUubGVuID0gMDsKKyAgICB5eS0+ZGF0ZS52YWwgPSAiIjsKKyAgICB5eS0+ZGF0ZS5sZW4gPSAwOworICAgIHl5LT5lbmNvZGluZy52YWwgPSAiIjsKKyAgICB5eS0+ZW5jb2RpbmcubGVuID0gMDsKKyAgICB5eS0+ZGlzcC52YWwgPSAiIjsKKyAgICB5eS0+ZGlzcC5sZW4gPSAwOworICAgIHl5LT5zeXN0ZW1pZC52YWwgPSAiIjsKKyAgICB5eS0+c3lzdGVtaWQubGVuID0gMDsKKyAgICB5eS0+c3lzcGFyYW0udmFsID0gIiI7CisgICAgeXktPnN5c3BhcmFtLmxlbiA9IDA7CisgICAgeXktPmNyZWF0b3IudmFsID0gIiI7CisgICAgeXktPmNyZWF0b3IubGVuID0gMDsKKyAgICB5eS0+YWNjb3VudC52YWwgPSAiIjsKKyAgICB5eS0+YWNjb3VudC5sZW4gPSAwOworICAgIHl5LT5hcmVhLnZhbCA9ICIiOworICAgIHl5LT5hcmVhLmxlbiA9IDA7CisgICAgeXktPnBhc3N3b3JkLnZhbCA9ICIiOworICAgIHl5LT5wYXNzd29yZC5sZW4gPSAwOworICAgIHl5LT5ibGtzaXplID0gLTFMOworICAgIHl5LT54YWNjZXNzLnZhbCA9ICIiOworICAgIHl5LT54YWNjZXNzLmxlbiA9IDA7CisjaWZkZWYgQ0tfUEVSTVMKKyAgICBpZiAoIW9mcGVybXMpIG9mcGVybXMgPSAiIjsKKyAgICBkZWJ1ZyhGMTEwLCJpbml0YXR0ciBvZnBlcm1zIixvZnBlcm1zLDApOworICAgIHl5LT5scHJvdGVjdC52YWwgPSBvZnBlcm1zOworICAgIHl5LT5scHJvdGVjdC5sZW4gPSAwIC0gc3RybGVuKG9mcGVybXMpOyAvKiA8LS0gTk9URSEgKi8KKyAgICAvKgorICAgICAgQSBuZWdhdGl2ZSBsZW5ndGggaW5kaWNhdGVzIHRoYXQgd2UgaGF2ZSBhIHBlcm1pc3Npb25zIHN0cmluZyBidXQgaXQgaGFzCisgICAgICBiZWVuIGluaGVyaXRlZCBmcm9tIGEgcHJldmlvdXNseSBleGlzdGluZyBmaWxlIHJhdGhlciB0aGFuIHBpY2tlZCB1cAorICAgICAgZnJvbSBhbiBpbmNvbWluZyBBLXBhY2tldC4KKyAgICAqLworI2Vsc2UKKyAgICB5eS0+bHByb3RlY3QudmFsID0gIiI7CisgICAgeXktPmxwcm90ZWN0LmxlbiA9IDA7CisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKyAgICB5eS0+Z3Byb3RlY3QudmFsID0gIiI7CisgICAgeXktPmdwcm90ZWN0LmxlbiA9IDA7CisgICAgeXktPnJlY2ZtLnZhbCA9ICIiOworICAgIHl5LT5yZWNmbS5sZW4gPSAwOworICAgIHl5LT5yZXBseS52YWwgPSAiIjsKKyAgICB5eS0+cmVwbHkubGVuID0gMDsKKyNpZmRlZiBPUzIKKyAgICB5eS0+bG9uZ25hbWUubGVuID0gMCA7CisgICAgeXktPmxvbmduYW1lLnZhbCA9ICIiIDsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qICBBIEQgRSBCIFUgLS0gV3JpdGUgYXR0cmlidXRlIHBhY2tldCBpbmZvIHRvIGRlYnVnIGxvZyAgKi8KKworaW50CithZGVidShmLHp6KSBjaGFyICpmOyBzdHJ1Y3QgemF0dHIgKnp6OyB7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nID09IDApIHJldHVybigwKTsKKyAgICBkZWJ1ZyhGMTEwLCJBdHRyaWJ1dGVzIGZvciBpbmNvbWluZyBmaWxlICIsZiwwKTsKKyAgICBkZWJ1ZyhGMTAxLCIgbGVuZ3RoIGluIEsiLCIiLChpbnQpIHp6LT5sZW5ndGhrKTsKKyAgICBkZWJ1ZyhGMTExLCIgZmlsZSB0eXBlIix6ei0+dHlwZS52YWwsenotPnR5cGUubGVuKTsKKyAgICBkZWJ1ZyhGMTExLCIgY3JlYXRpb24gZGF0ZSIsenotPmRhdGUudmFsLHp6LT5kYXRlLmxlbik7CisgICAgZGVidWcoRjExMSwiIGNyZWF0b3IiLHp6LT5jcmVhdG9yLnZhbCx6ei0+Y3JlYXRvci5sZW4pOworICAgIGRlYnVnKEYxMTEsIiBhY2NvdW50Iix6ei0+YWNjb3VudC52YWwsenotPmFjY291bnQubGVuKTsKKyAgICBkZWJ1ZyhGMTExLCIgYXJlYSIsenotPmFyZWEudmFsLHp6LT5hcmVhLmxlbik7CisgICAgZGVidWcoRjExMSwiIHBhc3N3b3JkIix6ei0+cGFzc3dvcmQudmFsLHp6LT5wYXNzd29yZC5sZW4pOworICAgIGRlYnVnKEYxMDEsIiBibGtzaXplIiwiIiwoaW50KSB6ei0+Ymxrc2l6ZSk7CisgICAgZGVidWcoRjExMSwiIGFjY2VzcyIsenotPnhhY2Nlc3MudmFsLHp6LT54YWNjZXNzLmxlbik7CisgICAgZGVidWcoRjExMSwiIGVuY29kaW5nIix6ei0+ZW5jb2RpbmcudmFsLHp6LT5lbmNvZGluZy5sZW4pOworICAgIGRlYnVnKEYxMTEsIiBkaXNwb3NpdGlvbiIsenotPmRpc3AudmFsLHp6LT5kaXNwLmxlbik7CisgICAgZGVidWcoRjExMSwiIGxwcm90ZWN0aW9uIix6ei0+bHByb3RlY3QudmFsLHp6LT5scHJvdGVjdC5sZW4pOworICAgIGRlYnVnKEYxMTEsIiBncHJvdGVjdGlvbiIsenotPmdwcm90ZWN0LnZhbCx6ei0+Z3Byb3RlY3QubGVuKTsKKyAgICBkZWJ1ZyhGMTExLCIgc3lzdGVtaWQiLHp6LT5zeXN0ZW1pZC52YWwsenotPnN5c3RlbWlkLmxlbik7CisgICAgZGVidWcoRjExMSwiIHJlY2ZtIix6ei0+cmVjZm0udmFsLHp6LT5yZWNmbS5sZW4pOworICAgIGRlYnVnKEYxMTEsIiBzeXNwYXJhbSIsenotPnN5c3BhcmFtLnZhbCx6ei0+c3lzcGFyYW0ubGVuKTsKKyAgICBkZWJ1ZyhGMTAxLCIgbGVuZ3RoIiwiIiwoaW50KSB6ei0+bGVuZ3RoKTsKKyAgICBkZWJ1ZyhGMTEwLCIgcmVwbHkiLHp6LT5yZXBseS52YWwsMCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qICBPIFAgRSBOIEEgLS0gT3BlbiBhIGZpbGUsIHdpdGggYXR0cmlidXRlcy4gICovCisvKgorICBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIG9wZW4gYSBuZXcgZmlsZSB0byBwdXQgdGhlIGFycml2aW5nIGRhdGEgaW4uICBUaGUKKyAgZmlsZW5hbWUgaXMgdGhlIG9uZSBpbiB0aGUgc3J2Y21kIGJ1ZmZlci4gIEZpbGUgY29sbGlzaW9uIGFjdGlvbnMgYXJlOgorICBPVkVSV1JJVEUgKHRoZSBleGlzdGluZyBmaWxlIGlzIG92ZXJ3cml0dGVuKSwgUkVOQU1FICh0aGUgbmV3IGZpbGUgaXMKKyAgcmVuYW1lZCksIEJBQ0tVUCAodGhlIGV4aXN0aW5nIGZpbGUgaXMgcmVuYW1lZCksIERJU0NBUkQgKHRoZSBuZXcgZmlsZSBpcworICByZWZ1c2VkKSwgVVBEQVRFICh0aGUgaW5jb21pbmcgZmlsZSByZXBsYWNlcyB0aGUgZXhpc3RpbmcgZmlsZSBvbmx5IGlmIHRoZQorICBpbmNvbWluZyBmaWxlIGhhcyBhIG5ld2VyIGNyZWF0aW9uIGRhdGUpLgorCisgIFJldHVybnMgMCBvbiBmYWlsdXJlLCBub256ZXJvIG9uIHN1Y2Nlc3MuCisqLworZXh0ZXJuIGNoYXIgKnJmX2VycjsKKworaW50CitvcGVuYShmLHp6KSBjaGFyICpmOyBzdHJ1Y3QgemF0dHIgKnp6OyB7CisgICAgaW50IHgsIGRpc3BvcyA9IDA7CisgICAgc3RhdGljIHN0cnVjdCBmaWxpbmZvIGZjYjsJCS8qIE11c3QgYmUgc3RhdGljISAqLworCisgICAgZGVidWcoRjExMCwib3BlbmEgZiIsZiwwKTsKKyAgICBkZWJ1ZyhGMTAxLCJvcGVuYSBkaXNjYXJkIiwiIixkaXNjYXJkKTsKKworICAgIGFkZWJ1KGYsenopOwkJCS8qIFdyaXRlIGF0dHJpYnV0ZXMgdG8gZGVidWcgbG9nICovCisKKyAgICBmZmMgPSAwTDsJCQkJLyogSW5pdCBmaWxlLWNoYXJhY3RlciBjb3VudGVyICovCisKKyNpZmRlZiBQSVBFU0VORAorICAgIGlmIChwaXBlc2VuZCkJCQkvKiBSZWNlaXZpbmcgdG8gYSBwaXBlIC0gZWFzeS4gKi8KKyAgICAgIHJldHVybihvcGVubyhmLHp6LCZmY2IpKTsJCS8qIEp1c3Qgb3BlbiB0aGUgcGlwZS4gKi8KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisgICAgLyogUmVjZWl2aW5nIHRvIGEgZmlsZSAtIHNldCB1cCBmaWxlIGNvbnRyb2wgc3RydWN0dXJlICovCisKKyAgICBmY2IuYnMgPSBmYmxrc2l6OwkJCS8qIEJsb2Nrc2l6ZSAqLworI2lmbmRlZiBOT0NTRVRTCisgICAgZmNiLmNzID0gZmNoYXJzZXQ7CQkJLyogQ2hhcmFjdGVyIHNldCAqLworI2Vsc2UKKyAgICBmY2IuY3MgPSAwOwkJCQkvKiBDaGFyYWN0ZXIgc2V0ICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgIGZjYi5ybCA9IGZyZWNsOwkJCS8qIFJlY29yZCBMZW5ndGggKi8KKyAgICBmY2IuZm10ID0gZnJlY2ZtOwkJCS8qIFJlY29yZCBGb3JtYXQgKi8KKyAgICBmY2Iub3JnID0gZm9yZzsJCQkvKiBPcmdhbml6YXRpb24gKi8KKyAgICBmY2IuY2MgPSBmY2N0cmw7CQkJLyogQ2FycmlhZ2UgY29udHJvbCAqLworICAgIGZjYi50eXAgPSBiaW5hcnk7CQkJLyogVHlwZSAqLworICAgIGRlYnVnKEYxMDEsIm9wZW5hIHhmbGciLCIiLHhmbGcpOworICAgIGRlYnVnKEYxMDEsIm9wZW5hIHJlbWZpbGUiLCIiLHJlbWZpbGUpOworICAgIGRlYnVnKEYxMDEsIm9wZW5hIHJlbWFwcGQiLCIiLHJlbWFwcGQpOworICAgIGlmICh4ZmxnICYmIHJlbWZpbGUgJiYgcmVtYXBwZCkJLyogUkVNT1RFIG91dHB1dCByZWRpcmVjdGVkIHdpdGggPj4gKi8KKyAgICAgIGZjYi5kc3AgPSBYWUZaX0E7CisgICAgZWxzZQorICAgICAgZmNiLmRzcCA9IChmbmNhY3QgPT0gWFlGWF9BKSA/IFhZRlpfQSA6IFhZRlpfTjsgLyogRGlzcG9zaXRpb24gKi8KKyAgICBkZWJ1ZyhGMTAxLCJvcGVuYSBkaXNwIiwiIixmY2IuZHNwKTsKKyAgICBmY2Iub3Nfc3BlY2lmaWMgPSAiIjsJCS8qIE9TLXNwZWNpZmljIGluZm8gKi8KKyNpZmRlZiBDS19MQUJFTEVECisgICAgZmNiLmxibG9wdHMgPSBsZl9vcHRzOwkJLyogTGFiZWxlZCBmaWxlIG9wdGlvbnMgKi8KKyNlbHNlCisgICAgZmNiLmxibG9wdHMgPSAwOworI2VuZGlmIC8qIENLX0xBQkVMRUQgKi8KKworICAgIGlmICh6ei0+ZGlzcC5sZW4gPiAwKSB7CQkvKiBJbmNvbWluZyBmaWxlIGhhcyBhIGRpc3Bvc2l0aW9uPyAqLworCWRlYnVnKEYxMTEsIm9wZW4gZGlzcG9zaXRpb24iLHp6LT5kaXNwLnZhbCx6ei0+ZGlzcC5sZW4pOworCWRpc3BvcyA9IChpbnQpICgqKHp6LT5kaXNwLnZhbCkpOworICAgIH0KKyAgICBpZiAoIWRpc3BvcyAmJiB4ZmxnICYmIHJlbWZpbGUgJiYgcmVtYXBwZCkgLyogUkVNT1RFIHJlZGlyZWN0IGFwcGVuZCA/ICovCisgICAgICBkaXNwb3MgPSBmY2IuZHNwOworCisgICAgZGVidWcoRjEwMSwib3BlbmEgZGlzcG9zIiwiIixkaXNwb3MpOworCisgICAgaWYgKCFkaXNwb3MpIHsJCQkgICAgICAgICAvKiBObyBzcGVjaWFsIGRpc3Bvc2l0aW9uPyAqLworCWlmIChmbmNhY3QgPT0gWFlGWF9CICYmIG9mbjF4ICYmIG9mbjIpIHsgLyogRmlsZSBjb2xsaXNpb24gPSBCQUNLVVA/ICovCisJICAgIGlmICh6cmVuYW1lKG9mbjEsb2ZuMikgPCAwKSB7ICAgICAgICAvKiBSZW5hbWUgZXhpc3RpbmcgZmlsZS4gKi8KKwkJZGVidWcoRjExMCwib3BlbmEgcmVuYW1lIGZhaWxzIixvZm4xLDApOworCQlyZl9lcnIgPSAiQ2FuJ3QgY3JlYXRlIGJhY2t1cCBmaWxlIjsKKwkJcmV0dXJuKDApOworCSAgICB9IGVsc2UgZGVidWcoRjExMCwib3BlbmEgcmVuYW1lIG9rIixvZm4yLDApOworCX0KKyAgICB9IGVsc2UgaWYgKGRpc3BvcyA9PSAnUicpIHsJCS8qIFJlY2VpdmluZyBhIFJFU0VORCAqLworCWRlYnVnKEYxMDEsIm9wZW5hIHJlbW90ZSBsZW4iLCIiLHp6LT5sZW5ndGgpOworCWRlYnVnKEYxMDEsIm9wZW5hIGxvY2FsIGxlbiIsIiIscnNfbGVuKTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIGlmIChmbmNhY3QgPT0gWFlGWF9SKQkJLyogYW5kIGZpbGUgY29sbGlzaW9uID0gUkVOQU1FICovCisJICBpZiAob2ZuMXgpCisjZW5kaWYgLyogQ09NTUVOVCAqLworCWlmIChvZm4xWzBdKQorCSAgZiA9IG9mbjE7CQkJLyogdXNlIG9yaWdpbmFsIG5hbWUuICovCisgICAgICAgIGlmIChmbmNhY3QgPT0gWFlGWF9SKQkJLyogaWYgZmlsZSBjb2xsaXNpb24gaXMgUkVOQU1FICovCisgICAgICAgICAgY2tzdHJuY3B5KGZpbG5hbSxvZm4xLENLTUFYUEFUSCsxKTsgLyogcmVzdG9yZSB0aGUgcmVhbCBuYW1lICovCisgICAgICAgIHh4c2NyZWVuKFNDUl9BTiwwLDBMLGYpOwkvKiB1cGRhdGUgbmFtZSBvbiBzY3JlZW4gKi8KKwlpZiAoenotPmxlbmd0aCA9PSByc19sZW4pCS8qIExvY2FsIGFuZCByZW1vdGUgbGVuZ3RocyBlcXVhbD8gKi8KKwkgIHJldHVybigtMTcpOwkJCS8qIFNlY3JldCBjb2RlICovCisgICAgfQorICAgIGRlYnVnKEYxMTEsIm9wZW5hIFtmaWxlXT1tb2RlOiAiLGYsZmNiLmRzcCk7CisgICAgaWYgKHggPSBvcGVubyhmLHp6LCZmY2IpKSB7CQkvKiBUcnkgdG8gb3BlbiB0aGUgZmlsZS4gKi8KKyNpZmRlZiBwZHAxMQorCXRsb2coRjExMCwiIGxvY2FsIG5hbWU6IixmLDBMKTsJLyogT0ssIG9wZW4sIHJlY29yZCBsb2NhbCBuYW1lLiAqLworCW1ha2VzdHIoJnByZnNwZWMsZik7CQkvKiBOZXcgcHJlbGltaW5hcnkgbmFtZSAqLworI2Vsc2UKKyNpZm5kZWYgWkZOUUZQCisJdGxvZyhGMTEwLCIgbG9jYWwgbmFtZToiLGYsMEwpOworCW1ha2VzdHIoJnByZnNwZWMsZik7CisjZWxzZQorCXsJCQkJLyogTG9nIGZ1bGwgbG9jYWwgcGF0aG5hbWUgKi8KKwkgICAgY2hhciAqcCA9IE5VTEwsICpxID0gZjsKKwkgICAgaWYgKChwID0gbWFsbG9jKENLTUFYUEFUSCsxKSkpCisJICAgICAgaWYgKHpmbnFmcChmaWxuYW0sIENLTUFYUEFUSCwgcCkpCisJCXEgPSBwOworCSAgICB0bG9nKEYxMTAsIiBsb2NhbCBuYW1lOiIscSwwTCk7CisJICAgIG1ha2VzdHIoJnByZnNwZWMscSk7CisJICAgIGlmIChwKSBmcmVlKHApOworCX0KKyNlbmRpZiAvKiBaRk5RRlAgKi8KKyNlbmRpZiAvKiBwZHAxMSAqLworCisJaWYgKGJpbmFyeSkgewkJCS8qIExvZyBmaWxlIG1vZGUgaW4gdHJhbnNhY3Rpb24gbG9nICovCisJICAgIHRsb2coRjEwMSwiIG1vZGU6IGJpbmFyeSIsIiIsKGxvbmcpIGJpbmFyeSk7CisJfSBlbHNlIHsJCQkvKiBJZiB0ZXh0IG1vZGUsIGNoZWNrIGNoYXJhY3RlciBzZXQgKi8KKwkgICAgdGxvZyhGMTAwLCIgbW9kZTogdGV4dCIsIiIsMEwpOworI2lmbmRlZiBOT0NTRVRTCisJICAgIGlmICh4ZnJ4bGEpIHsKKwkJaWYgKGZjaGFyc2V0ID4gLTEgJiYgZmNoYXJzZXQgPD0gTUFYRkNTRVRTKQorCQkgIHRsb2coRjExMCwiIGZpbGUgY2hhcmFjdGVyLXNldDoiLGZjc2luZm9bZmNoYXJzZXRdLm5hbWUsMEwpOworCQlpZiAodGNoYXJzZXQgPiAtMSAmJiB0Y2hhcnNldCA8PSBNQVhUQ1NFVFMpCisJCSAgdGxvZyhGMTEwLCIgeGZlciBjaGFyYWN0ZXItc2V0OiIsdGNzaW5mb1t0Y2hhcnNldF0ubmFtZSwwTCk7CisJICAgIH0gZWxzZSB7CisJCSAgdGxvZyhGMTEwLCIgY2hhcmFjdGVyLXNldDoiLCJ0cmFuc3BhcmVudCIsMEwpOworCSAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCSAgICBkZWJ1ZyhGMTExLCJvcGVuYSBjaGFyc2V0Iix6ei0+ZW5jb2RpbmcudmFsLHp6LT5lbmNvZGluZy5sZW4pOworCX0KKwlkZWJ1ZyhGMTAxLCJvcGVuYSBiaW5hcnkiLCIiLGJpbmFyeSk7CisKKyNpZmRlZiBDT01NRU5UCisJaWYgKGZzaXplID4gLTFMKQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgIHh4c2NyZWVuKFNDUl9GUywwLGZzaXplLCIiKTsKKworI2lmZGVmIGRhdGFnZW5lcmFsCisvKgorICBOZWVkIHRvIHR1cm4gb24gbXVsdGktdGFza2luZyBjb25zb2xlIGludGVycnVwdCB0YXNrIGhlcmUsIHNpbmNlIG11bHRpcGxlCisgIGZpbGVzIG1heSBiZSByZWNlaXZlZCAoaHVoPykgLi4uCisqLworICAgICAgICBpZiAoKGxvY2FsKSAmJiAoIXF1aWV0KSkgICAgICAgIC8qIE9ubHkgZG8gdGhpcyBpZiBsb2NhbCAmIG5vdCBxdWlldCAqLworCSAgY29uc3RhX210KCk7CQkJLyogU3RhcnQgdGhlIGFzeW5jIHJlYWQgdGFzayAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisKKyAgICB9IGVsc2UgewkJCQkvKiBEaWQgbm90IG9wZW4gZmlsZSBPSy4gKi8KKworCXJmX2VyciA9IGNrX2VycnN0cigpOwkJLyogR2V0IHN5c3RlbSBlcnJvciBtZXNzYWdlICovCisJaWYgKCpyZl9lcnIpCisJICB4eHNjcmVlbihTQ1JfRU0sMCwwbCxyZl9lcnIpOworCWVsc2UKKwkgIHh4c2NyZWVuKFNDUl9FTSwwLDBsLCJDYW4ndCBvcGVuIG91dHB1dCBmaWxlIik7CisgICAgICAgIHRsb2coRjExMCwiRmFpbHVyZSB0byBvcGVuIixmLDBMKTsKKyAgICAgICAgdGxvZyhGMTEwLCJFcnJvcjoiLHJmX2VyciwwTCk7CisJZGVidWcoRjExMCwib3BlbmEgZXJyb3IiLHJmX2VyciwwKTsKKyAgICB9CisgICAgcmV0dXJuKHgpOwkJCQkvKiBQYXNzIG9uIHJldHVybiBjb2RlIGZyb20gb3Blbm8gKi8KK30KKworLyogIE8gUCBFIE4gQyAgLS0gIE9wZW4gYSBjb21tYW5kIChpbiBwbGFjZSBvZiBhIGZpbGUpIGZvciBvdXRwdXQgKi8KKworaW50CitvcGVuYyhuLHMpIGludCBuOyBjaGFyICogczsgeworICAgIGludCB4OworI2lmbmRlZiBOT1BVU0gKKyAgICB4ID0genhjbWQobixzKTsKKyNlbHNlCisgICAgeCA9IDA7CisjZW5kaWYgLyogTk9QVVNIICovCisgICAgZGVidWcoRjExMSwib3BlbmMgenhjbWQiLHMseCk7CisgICAgb19pc29wZW4gPSAoeCA+IDApID8gMSA6IDA7CisgICAgcmV0dXJuKHgpOworfQorCisvKiAgQyBBIE4gTiBFIEQgIC0tICBDaGVjayBpZiBjdXJyZW50IGZpbGUgdHJhbnNmZXIgY2FuY2VsbGVkICovCisKK2ludAorY2FubmVkKGJ1ZikgQ0hBUiAqYnVmOyB7CisgICAgZXh0ZXJuIGludCBpbnRlcnJ1cHRlZDsKKyAgICBpZiAoKmJ1ZiA9PSAnWCcpIGN4c2VlbiA9IDE7CisgICAgaWYgKCpidWYgPT0gJ1onKSBjenNlZW4gPSAxOworICAgIGlmIChjenNlZW4gfHwgY3hzZWVuKQorICAgICAgaW50ZXJydXB0ZWQgPSAxOworICAgIGRlYnVnKEYxMDEsImNhbm5lZDogY3hzZWVuIiwiIixjeHNlZW4pOworICAgIGRlYnVnKEYxMDEsIiBjenNlZW4iLCIiLGN6c2Vlbik7CisgICAgcmV0dXJuKChjenNlZW4gfHwgY3hzZWVuKSA/IDEgOiAwKTsKK30KKworCisvKiAgTyBQIEUgTiBJICAtLSAgT3BlbiBhbiBleGlzdGluZyBmaWxlIGZvciBpbnB1dCAgKi8KKworaW50CitvcGVuaShuYW1lKSBjaGFyICpuYW1lOyB7CisjaWZuZGVmIE5PU0VSVkVSCisgICAgZXh0ZXJuIGludCBmcm9tZ2V0cGF0aDsKKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworICAgIGludCB4LCBmaWxubzsKKyAgICBjaGFyICpuYW1lMjsKKyAgICBleHRlcm4gQ0hBUiAqZXBrdG1zZzsKKworICAgIGVwa3Rtc2dbMF0gPSBOVUw7CQkJLyogSW5pdGlhbGl6ZSBlcnJvciBtZXNzYWdlICovCisgICAgaWYgKG1lbXN0ciB8fCBzbmRhcnJheSkgewkJLyogSnVzdCByZXR1cm4gaWYgImZpbGUiIGlzIG1lbW9yeS4gKi8KKwlpX2lzb3BlbiA9IDE7CisJcmV0dXJuKDEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJvcGVuaSBuYW1lIixuYW1lLDApOworICAgIGRlYnVnKEYxMDEsIm9wZW5pIHNuZHNyYyIsIiIsc25kc3JjKTsKKworICAgIGZpbG5vID0gKHNuZHNyYyA9PSAwKSA/IFpTVERJTyA6IFpJRklMRTsgICAgLyogLi4uICovCisgICAgZGVidWcoRjEwMSwib3BlbmkgZmlsZSBudW1iZXIiLCIiLGZpbG5vKTsKKworI2lmbmRlZiBOT1NFUlZFUgorICAgIC8qIElmIEknbSBhIHNlcnZlciBhbmQgQ1dEIGlzIGRpc2FibGVkIGFuZCBuYW1lIGlzIG5vdCBmcm9tIEdFVC1QQVRILi4uICovCisKKyAgICBpZiAoc2VydmVyICYmICFlbl9jd2QgJiYgIWZyb21nZXRwYXRoKSB7CisJenN0cmlwKG5hbWUsJm5hbWUyKTsKKwlpZiAoCQkJCS8qIC4uLiBjaGVjayBpZiBwYXRobmFtZSBpbmNsdWRlZC4gKi8KKyNpZmRlZiBWTVMKKwkgICAgemNoa3BhdGgobmFtZSkKKyNlbHNlCisJICAgIHN0cmNtcChuYW1lLG5hbWUyKQorI2VuZGlmIC8qIFZNUyAqLworCSAgICApIHsKKwkgICAgdGxvZyhGMTEwLG5hbWUsImFjY2VzcyBkZW5pZWQiLDBMKTsKKwkgICAgZGVidWcoRjExMCwib3BlbmkgQ0QgZGlzYWJsZWQiLG5hbWUsMCk7CisJICAgIGNrc3RybmNweSgoY2hhciAqKWVwa3Rtc2csIkFjY2VzcyBkZW5pZWQiLFBLVE1TR0xFTik7CisJICAgIHJldHVybigwKTsKKwl9IGVsc2UgbmFtZSA9IG5hbWUyOworICAgIH0KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworCisjaWZkZWYgUElQRVNFTkQKKyAgICBkZWJ1ZyhGMTAxLCJvcGVuaSBwaXBlc2VuZCIsIiIscGlwZXNlbmQpOworICAgIGlmIChwaXBlc2VuZCkgeworCWludCB4OworI2lmbmRlZiBOT1BVU0gKKwl4ID0genhjbWQoWklGSUxFLG5hbWUpOworI2Vsc2UKKwl4ID0gMDsKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKwlpX2lzb3BlbiA9ICh4ID4gMCkgPyAxIDogMDsKKwlpZiAoIWlfaXNvcGVuKQorCSAgY2tzdHJuY3B5KChjaGFyICopZXBrdG1zZywiQ29tbWFuZCBvciBwaXBlIGZhaWx1cmUiLFBLVE1TR0xFTik7CisJZGVidWcoRjExMSwib3BlbmkgcGlwZXNlbmQgenhjbWQiLG5hbWUseCk7CisJcmV0dXJuKGlfaXNvcGVuKTsKKyAgICB9CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKworI2lmZGVmIENBTElCUkFURQorICAgIGlmIChjYWxpYnJhdGUpIHsKKwlpX2lzb3BlbiA9IDE7CisgICAgCXJldHVybigxKTsKKyAgICB9CisjZW5kaWYgLyogQ0FMSUJSQVRFICovCisKKyAgICB4ID0gem9wZW5pKGZpbG5vLG5hbWUpOwkJLyogT3RoZXJ3aXNlLCB0cnkgdG8gb3BlbiBpdC4gKi8KKyAgICBkZWJ1ZyhGMTExLCJvcGVuaSB6b3BlbmkgMSIsbmFtZSx4KTsKKyAgICBpZiAoeCkgeworCWlfaXNvcGVuID0gMTsKKyAgICAJcmV0dXJuKDEpOworICAgIH0gZWxzZSB7CQkJCS8qIElmIG5vdCBmb3VuZCwgKi8KKwljaGFyIHhuYW1lW0NLTUFYUEFUSF07CQkvKiBjb252ZXJ0IHRoZSBuYW1lICovCisjaWZkZWYgTlpMVE9SCisJbnpydG9sKG5hbWUseG5hbWUsZm5jbnYsZm5ycGF0aCxDS01BWFBBVEgpOworI2Vsc2UKKwl6cnRvbChuYW1lLHhuYW1lKTsJCS8qIHRvIGxvY2FsIGZvcm0gYW5kIHRoZW4gKi8KKyNlbmRpZiAvKiAgTlpMVE9SICovCisJeCA9IHpvcGVuaShmaWxubyx4bmFtZSk7CS8qIHRyeSBvcGVuaW5nIGl0IGFnYWluLiAqLworCWRlYnVnKEYxMTEsIm9wZW5pIHpvcGVuaSAyIix4bmFtZSx4KTsKKwlpZiAoeCkgeworCSAgICBpX2lzb3BlbiA9IDE7CisJICAgIHJldHVybigxKTsJCQkvKiBJdCB3b3JrZWQuICovCisgICAgICAgIH0gZWxzZSB7CisJICAgIGNoYXIgKiBzOworCSAgICBzID0gY2tfZXJyc3RyKCk7CisJICAgIGlmIChzKSBpZiAoIXMpIHMgPSBOVUxMOworCSAgICBpZiAoIXMpIHMgPSAiQ2FuJ3Qgb3BlbiBmaWxlIjsKKwkgICAgY2tzdHJuY3B5KChjaGFyICopZXBrdG1zZyxzLFBLVE1TR0xFTik7CisJICAgIHRsb2coRjExMCx4bmFtZSxzLDBMKTsKKwkgICAgZGVidWcoRjExMCwib3BlbmkgZmFpbGVkIix4bmFtZSwwKTsKKwkgICAgZGVidWcoRjExMCwib3BlbmkgbWVzc2FnZSIscywwKTsKKwkgICAgaV9pc29wZW4gPSAwOworCSAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qICBPIFAgRSBOIE8gIC0tICBPcGVuIGEgbmV3IGZpbGUgZm9yIG91dHB1dC4gICovCisKK2ludAorb3Blbm8obmFtZSx6eixmY2IpIGNoYXIgKm5hbWU7IHN0cnVjdCB6YXR0ciAqeno7IHN0cnVjdCBmaWxpbmZvICpmY2I7IHsKKyAgICBjaGFyICpuYW1lMjsKKyNpZmRlZiBEVElMREUKKyAgICBjaGFyICpkaXJwOworI2VuZGlmIC8qIERUSUxERSAqLworCisgICAgaW50IGNoYW5uZWwsIHg7CisKKyAgICBpZiAoc3Rkb3VmKSB7CQkJCS8qIFJlY2VpdmluZyB0byBzdGRvdXQ/ICovCisJeCA9IHpvcGVubyhaU1RESU8sIiIsenosTlVMTCk7CisJb19pc29wZW4gPSAoeCA+IDApOworCWRlYnVnKEYxMDEsIm9wZW5vIHN0ZG91ZiB6b3Blbm8iLCIiLHgpOworCXJldHVybih4KTsKKyAgICB9CisgICAgZGVidWcoRjExMCwib3Blbm86IG5hbWUiLG5hbWUsMCk7CisKKyAgICBpZiAoY3hzZWVuIHx8IGN6c2VlbiB8fCBkaXNjYXJkKSB7CS8qIElmIGludGVycnVwdGVkLCBnZXQgb3V0IGJlZm9yZSAqLworCWRlYnVnKEYxMDAsIiBvcGVuIGNhbmNlbGxlZCIsIiIsMCk7IC8qIGRlc3Ryb3lpbmcgZXhpc3RpbmcgZmlsZS4gKi8KKwlyZXR1cm4oMSk7CQkJLyogUHJldGVuZCB0byBzdWNjZWVkLiAqLworICAgIH0KKyAgICBjaGFubmVsID0gWk9GSUxFOwkJCS8qIFNFVCBERVNUSU5BVElPTiBESVNLIG9yIFBSSU5URVIgKi8KKworI2lmZGVmIFBJUEVTRU5ECisgICAgZGVidWcoRjEwMSwib3Blbm8gcGlwZXNlbmQiLCIiLHBpcGVzZW5kKTsKKyAgICBpZiAocGlwZXNlbmQpIHsKKwlpbnQgeDsKKyNpZm5kZWYgTk9QVVNICisJeCA9IHp4Y21kKFpPRklMRSwoY2hhciAqKXNydmNtZCk7CisjZWxzZQorCXggPSAwOworI2VuZGlmIC8qIE5PUFVTSCAqLworCW9faXNvcGVuID0geCA+IDA7CisJZGVidWcoRjEwMSwib3Blbm8genhjbWQiLCIiLHgpOworCXJldHVybih4KTsKKyAgICB9CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKworICAgIGlmIChkZXN0ID09IERFU1RfUykgewkJLyogU0VUIERFU1QgU0NSRUVOLi4uICovCisJY2hhbm5lbCA9IFpDVEVSTTsKKwlmY2IgPSBOVUxMOworICAgIH0KKyNpZmRlZiBEVElMREUKKyAgICBpZiAoKm5hbWUgPT0gJ34nKSB7CisJZGlycCA9IHRpbGRlX2V4cGFuZChuYW1lKTsKKwlpZiAoKmRpcnApIGNrc3RybmNweShuYW1lLGRpcnAsQ0tNQVhQQVRIKzEpOworICAgIH0KKyNlbmRpZiAvKiBEVElMREUgKi8KKyAgICBpZiAoc2VydmVyICYmICFlbl9jd2QpIHsJCS8qIElmIHJ1bm5pbmcgYXMgc2VydmVyICovCisJenN0cmlwKG5hbWUsJm5hbWUyKTsJCS8qIGFuZCBDV0QgaXMgZGlzYWJsZWQsICovCisJaWYgKHN0cmNtcChuYW1lLG5hbWUyKSkgewkvKiBjaGVjayBpZiBwYXRobmFtZSB3YXMgaW5jbHVkZWQuICovCisJICAgIHRsb2coRjExMCxuYW1lLCJhdXRob3JpemF0aW9uIGZhaWx1cmUiLDBMKTsKKwkgICAgZGVidWcoRjExMCwib3Blbm8gQ0QgZGlzYWJsZWQiLG5hbWUsMCk7CisJICAgIHJldHVybigwKTsKKwl9IGVsc2UgbmFtZSA9IG5hbWUyOworICAgIH0KKyAgICBpZiAoem9wZW5vKGNoYW5uZWwsbmFtZSx6eixmY2IpIDw9IDApIHsgLyogVHJ5IHRvIG9wZW4gdGhlIGZpbGUgKi8KKwlvX2lzb3BlbiA9IDA7CisJZGVidWcoRjExMCwib3Blbm8gZmFpbGVkIixuYW1lLDApOworCS8qIHRsb2coRjExMCwiRmFpbHVyZSB0byBvcGVuIixuYW1lLDBMKTsgKi8KKwlyZXR1cm4oMCk7CisgICAgfSBlbHNlIHsKKwlvX2lzb3BlbiA9IDE7CisJZGVidWcoRjExMCwib3Blbm8gb2ssIG5hbWUiLG5hbWUsMCk7CisJcmV0dXJuKDEpOworICAgIH0KK30KKworLyogIE8gUCBFIE4gVCAgLS0gIE9wZW4gdGhlIHRlcm1pbmFsIGZvciBvdXRwdXQsIGluIHBsYWNlIG9mIGEgZmlsZSAgKi8KKworaW50CitvcGVudCh6eikgc3RydWN0IHphdHRyICp6ejsgeworICAgIGludCB4OworICAgIGZmYyA9IHRmYyA9IDBMOworICAgIHggPSB6b3Blbm8oWkNURVJNLCIiLHp6LE5VTEwpOworICAgIGRlYnVnKEYxMDEsIm9wZW50IHpvcGVubyIsIiIseCk7CisgICAgaWYgKHggPj0gMCkgeworCW9faXNvcGVuID0gMTsKKwliaW5hcnkgPSBYWUZUX1Q7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4oMCk7CisgICAgcmV0dXJuKHgpOworfQorCisvKiAgTyBQIEUgTiBYICAtLSAgT3BlbiBub3RoaW5nIChpbmNvbWluZyBmaWxlIHRvIGJlIGFjY2VwdGVkIGJ1dCBpZ25vcmVkKSAgKi8KKworaW50Citja29wZW54KHp6KSBzdHJ1Y3QgemF0dHIgKnp6OyB7CisgICAgZmZjID0gdGZjID0gMEw7CQkJLyogUmVzZXQgY291bnRlcnMgKi8KKyAgICBvX2lzb3BlbiA9IDE7CisgICAgZGVidWcoRjEwMSwiY2tvcGVueCBmc2l6ZSIsIiIsZnNpemUpOworICAgIHh4c2NyZWVuKFNDUl9GUywwLGZzaXplLCIiKTsJLyogTGV0IHNjcmVlbiBkaXNwbGF5IGtub3cgdGhlIHNpemUgKi8KKyAgICByZXR1cm4oMSk7Cit9CisKKy8qICBDIEwgUyBJIEYgIC0tICBDbG9zZSB0aGUgY3VycmVudCBpbnB1dCBmaWxlLiAqLworCitpbnQKK2Nsc2lmKCkgeworICAgIGV4dGVybiBpbnQgeGZlcnN0YXQsIHN1Y2Nlc3M7CisgICAgaW50IHggPSAwOworCisgICAgZmNwcygpOwkJCS8qIENhbGN1bGF0ZSBDUFMgcXVpY2tseSAqLworCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICBpZiAoKGxvY2FsKSAmJiAoIXF1aWV0KSkgICAgLyogT25seSBkbyB0aGlzIGlmIGxvY2FsICYgbm90IHF1aWV0ICovCisgICAgICBpZiAobmZpbHMgPCAxKQkJLyogTW9yZSBmaWxlcyB0byBzZW5kIC4uLiBsZWF2ZSBpdCBvbiEgKi8KKwljb25ub2lfbXQoKTsKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworCisgICAgZGVidWcoRjEwMSwiY2xzaWYgaV9pc29wZW4iLCIiLGlfaXNvcGVuKTsKKyAgICBpZiAoaV9pc29wZW4pIHsJCQkvKiBJZiBpbnB1dCBmaWxlIGlzIG9wZW4uLi4gKi8KKwlpZiAobWVtc3RyKSB7CQkJLyogSWYgaW5wdXQgd2FzIG1lbW9yeSBzdHJpbmcsICovCisJICAgIG1lbXN0ciA9IDA7CQkJLyogaW5kaWNhdGUgbm8gbW9yZS4gKi8KKwl9IGVsc2UgeworCSAgICB4ID0gemNsb3NlKFpJRklMRSk7CQkvKiBlbHNlIGNsb3NlIGlucHV0IGZpbGUuICovCisJfQorI2lmZGVmIERFQlVHCisJaWYgKGRlYmxvZykgeworCSAgICBkZWJ1ZyhGMTAxLCJjbHNpZiB6Y2xvc2UiLCIiLHgpOworCSAgICBkZWJ1ZyhGMTAxLCJjbHNpZiBzdWNjZXNzIiwiIixzdWNjZXNzKTsKKwkgICAgZGVidWcoRjEwMSwiY2xzaWYgeGZlcnN0YXQiLCIiLHhmZXJzdGF0KTsKKwkgICAgZGVidWcoRjEwMSwiY2xzaWYgZnNpemUiLCIiLGZzaXplKTsKKwkgICAgZGVidWcoRjEwMSwiY2xzaWYgZmZjIiwiIixmZmMpOworCSAgICBkZWJ1ZyhGMTAxLCJjbHNpZiBjeHNlZW4iLCIiLGN4c2Vlbik7CisJICAgIGRlYnVnKEYxMDEsImNsc2lmIGN6c2VlbiIsIiIsY3pzZWVuKTsKKwkgICAgZGVidWcoRjEwMSwiY2xzaWYgZGlzY2FyZCIsIiIsY3pzZWVuKTsKKwl9CisjZW5kaWYgLyogREVCVUcgKi8KKwlpZiAoKGN4c2VlbiB8fCBjenNlZW4pICYmICFlcGt0c2VudCkgeyAvKiBJZiBpbnRlcnJ1cHRlZCAqLworCSAgICB4eHNjcmVlbihTQ1JfU1QsU1RfSU5ULDBsLCIiKTsgLyogc2F5IHNvICovCisjaWZkZWYgVExPRworCSAgICBpZiAodHJhbG9nICYmICF0bG9nZm10KQorCSAgICAgIGRveGxvZyh3aGF0LHBzZnNwZWMsZnNpemUsYmluYXJ5LDEsIkludGVycnVwdGVkIik7CisjZW5kaWYgLyogVExPRyAqLworCX0gZWxzZSBpZiAoZGlzY2FyZCAmJiAhZXBrdHNlbnQpIHsgLyogSWYgSSdtIHJlZnVzaW5nICovCisJICAgIHh4c2NyZWVuKFNDUl9TVCxTVF9SRUZVLDBsLHJlZnVzZWQpOyAvKiBzYXkgd2h5ICovCisjaWZkZWYgVExPRworCSAgICBpZiAodHJhbG9nICYmICF0bG9nZm10KSB7CisJCWNoYXIgYnVmWzEyOF07CisJCWNrbWFrbXNnKGJ1ZiwxMjgsIlJlZnVzZWQ6ICIscmVmdXNlZCxOVUxMLE5VTEwpOworCQlkb3hsb2cod2hhdCxwc2ZzcGVjLGZzaXplLGJpbmFyeSwxLGJ1Zik7CisJICAgIH0KKyNlbmRpZiAvKiBUTE9HICovCisJfSBlbHNlIGlmICghZXBrdHJjdmQgJiYgIWVwa3RzZW50ICYmICFjeHNlZW4gJiYgIWN6c2VlbikgeworCSAgICBsb25nIHp6OworCSAgICB6eiA9IGZmYzsKKyNpZmRlZiBDS19SRVNFTkQKKwkgICAgaWYgKHNlbmRtb2RlID09IFNNX1JFU0VORCB8fCBzZW5kbW9kZSA9PSBTTV9QU0VORCkKKwkgICAgICB6eiArPSBzZW5kc3RhcnQ7CisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisJICAgIGRlYnVnKEYxMDEsImNsc2lmIGZzdGF0cyIsIiIsenopOworCSAgICBmc3RhdHMoKTsJCQkvKiBVcGRhdGUgc3RhdGlzdGljcyAqLworCSAgICBpZiAoCQkJLyogV2FzIHRoZSB3aG9sZSBmaWxlIHNlbnQ/ICovCisjaWZkZWYgVk1TCisJCTAJCQkvKiBOb3QgYSByZWxpYWJsZSBjaGVjayBpbiBWTVMgKi8KKyNlbHNlCisjaWZkZWYgU1RSQVRVUworCQkwCQkJLyogUHJvYmFibHkgbm90IGZvciBWT1MgZWl0aGVyICovCisjZWxzZQorCQl6eiA8IGZzaXplCisjaWZkZWYgQ0tfQ1RSTFoKKwkJJiYgKChlb2ZtZXRob2QgIT0gWFlFT0ZfWiAmJiAhYmluYXJ5KSB8fCBiaW5hcnkpCisjZW5kaWYgLyogQ0tfQ1RSTFogKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogVk1TICovCisJCSkgeworCQl4eHNjcmVlbihTQ1JfU1QsU1RfSU5ULDBsLCIiKTsKKyNpZmRlZiBUTE9HCisJCWlmICh0cmFsb2cgJiYgIXRsb2dmbXQpCisJCSAgZG94bG9nKHdoYXQscHNmc3BlYyxmc2l6ZSxiaW5hcnksMSwiSW5jb21wbGV0ZSIpOworI2VuZGlmIC8qIFRMT0cgKi8KKwkgICAgfSBlbHNlIHsKKyNpZmRlZiBDT01NRU5UCisJCS8qIE5vdCB5ZXQgLS0gd2UgZG9uJ3QgaGF2ZSBjb25maXJtYXRpb24gZnJvbSB0aGUgcmVjZWl2ZXIgKi8KKwkJeHhzY3JlZW4oU0NSX1NULFNUX09LLDBsLCIiKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisjaWZkZWYgVExPRworCQlpZiAodHJhbG9nICYmICF0bG9nZm10KQorCQkgIGRveGxvZyh3aGF0LHBzZnNwZWMsZnNpemUsYmluYXJ5LDAsIiIpOworI2VuZGlmIC8qIFRMT0cgKi8KKwkgICAgfQorCX0KKyAgICB9CisgICAgaV9pc29wZW4gPSAwOworICAgIGhjZmxnID0gMDsJCQkJLyogUmVzZXQgZmxhZ3MgKi8KKyAgICBzZW5kc3RhcnQgPSAwTDsJCQkvKiBEb24ndCBkbyB0aGlzIGFnYWluISAqLworI2lmZGVmIENPTU1FTlQKKy8qCisgIFRoaXMgcHJldmVudHMgYSBzdWJzZXF1ZW50IGNhbGwgdG8gY2xzb2YoKSBmcm9tIGRlbGV0aW5nIHRoZSBmaWxlCisgIHdoZW4gZ2l2ZW4gdGhlIGRpc2NhcmQgZmxhZy4KKyovCisgICAgKmZpbG5hbSA9ICdcMCc7CQkJLyogYW5kIGN1cnJlbnQgZmlsZSBuYW1lICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHJldHVybih4KTsKK30KKworCisvKiAgQyBMIFMgTyBGICAtLSAgQ2xvc2UgYW4gb3V0cHV0IGZpbGUuICAqLworCisvKiAgQ2FsbCB3aXRoIGRpc3AgIT0gMCBpZiBmaWxlIGlzIHRvIGJlIGRpc2NhcmRlZC4gICovCisvKiAgUmV0dXJucyAtMSB1cG9uIGZhaWx1cmUgdG8gY2xvc2UsIDAgb3IgZ3JlYXRlciBvbiBzdWNjZXNzLiAqLworCitpbnQKK2Nsc29mKGRpc3ApIGludCBkaXNwOyB7CisgICAgaW50IHggPSAwOworICAgIGV4dGVybiBpbnQgc3VjY2VzczsKKworICAgIGZjcHMoKTsJCQkJLyogQ2FsY3VsYXRlIENQUyBxdWlja2x5ICovCisKKyAgICBkZWJ1ZyhGMTAxLCJjbHNvZiBkaXNwIiwiIixkaXNwKTsKKyAgICBkZWJ1ZyhGMTAxLCJjbHNvZiBjeHNlZW4iLCIiLGN4c2Vlbik7CisgICAgZGVidWcoRjEwMSwiY2xzb2Ygc3VjY2VzcyIsIiIsc3VjY2Vzcyk7CisKKyAgICBkZWJ1ZyhGMTAxLCJjbHNvZiBvX2lzb3BlbiIsIiIsb19pc29wZW4pOworICAgIGlmIChmbmNzYXYgIT0gLTEpIHsJCQkvKiBTYXZlZCBmaWxlIGNvbGxpc2lvbiBhY3Rpb24uLi4gKi8KKwlmbmNhY3QgPSBmbmNzYXY7CQkvKiBSZXN0b3JlIGl0LiAqLworCWZuY3NhdiA9IC0xOwkJCS8qIFVuc2F2ZSBpdC4gKi8KKyAgICB9CisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICBpZiAoKGxvY2FsKSAmJiAoIXF1aWV0KSkJCS8qIE9ubHkgZG8gdGhpcyBpZiBsb2NhbCAmIG5vdCBxdWlldCAqLworICAgICAgY29ubm9pX210KCk7CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyAgICBpZiAob19pc29wZW4gJiYgIWNhbGlicmF0ZSkgeworCWlmICgoeCA9IHpjbG9zZShaT0ZJTEUpKSA8IDApIHsgLyogVHJ5IHRvIGNsb3NlIHRoZSBmaWxlICovCisJICAgIHRsb2coRjEwMCwiRmFpbHVyZSB0byBjbG9zZSIsZmlsbmFtLDBMKTsKKwkgICAgeHhzY3JlZW4oU0NSX1NULFNUX0VSUiwwbCwiQ2FuJ3QgY2xvc2UgZmlsZSIpOworI2lmZGVmIFRMT0cKKwkgICAgaWYgKHRyYWxvZyAmJiAhdGxvZ2ZtdCkKKwkgICAgICBkb3hsb2cod2hhdCxwcmZzcGVjLGZzaXplLGJpbmFyeSwxLCJDYW4ndCBjbG9zZSBmaWxlIik7CisjZW5kaWYgLyogVExPRyAqLworCX0gZWxzZSBpZiAoZGlzcCkgewkJLyogSW50ZXJydXB0ZWQgb3IgcmVmdXNlZCAqLworCSAgICBpZiAoa2VlcCA9PSAwIHx8CQkvKiBJZiBub3Qga2VlcGluZyBpbmNvbXBsZXRlIGZpbGVzICovCisJCShrZWVwID09IFNFVF9BVVRPICYmIGJpbmFyeSA9PSBYWUZUX1QpCisJCSkgeworCQlpZiAoKmZpbG5hbSAmJiAod2hhdCAmIFdfUkVDVikpIC8qIEFORCB3ZSdyZSByZWNlaXZpbmcgKi8KKwkJICB6ZGVsZXQoZmlsbmFtKTsJLyogT05MWSBUSEVOLCBkZWxldGUgaXQgKi8KKwkJaWYgKHdoYXQgJiBXX0tFUk1JVCkgeworCQkgICAgZGVidWcoRjEwMCwiY2xzb2YgaW5jb21wbGV0ZSBkaXNjYXJkZWQiLCIiLDApOworCQkgICAgdGxvZyhGMTAwLCIgaW5jb21wbGV0ZTogZGlzY2FyZGVkIiwiIiwwTCk7CisJCSAgICBpZiAoIWVwa3RyY3ZkICYmICFlcGt0c2VudCkgeworCQkJeHhzY3JlZW4oU0NSX1NULFNUX0RJU0MsMGwsIiIpOworI2lmZGVmIFRMT0cKKwkJCWlmICh0cmFsb2cgJiYgIXRsb2dmbXQpCisJCQkgIGRveGxvZyh3aGF0LHByZnNwZWMsZnNpemUsYmluYXJ5LDEsIkRpc2NhcmRlZCIpOworI2VuZGlmIC8qIFRMT0cgKi8KKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2UgewkJCS8qIEtlZXAgaW5jb21wbGV0ZSBjb3B5ICovCisJCWRlYnVnKEYxMDAsImNsc29mIGZzdGF0cyAxIiwiIiwwKTsKKwkJZnN0YXRzKCk7CisJCWlmICghZGlzY2FyZCkgewkgLyogVW5sZXNzIGRpc2NhcmRpbmcgZm9yIG90aGVyIHJlYXNvbi4uLiAqLworCQkgICAgaWYgKHdoYXQgJiBXX0tFUk1JVCkgeworCQkJZGVidWcoRjEwMCwiY2xvc2YgaW5jb21wbGV0ZSBrZXB0IiwiIiwwKTsKKwkJCXRsb2coRjEwMCwiIGluY29tcGxldGU6IGtlcHQiLCIiLDBMKTsKKwkJICAgIH0KKwkJfQorCQlpZiAod2hhdCAmIFdfS0VSTUlUKSB7CisJCSAgICBpZiAoIWVwa3RyY3ZkICYmICFlcGt0c2VudCkgeworCQkJeHhzY3JlZW4oU0NSX1NULFNUX0lOQywwbCwiIik7CisjaWZkZWYgVExPRworCQkJaWYgKHRyYWxvZyAmJiAhdGxvZ2ZtdCkKKwkJCSAgZG94bG9nKHdoYXQscHJmc3BlYyxmc2l6ZSxiaW5hcnksMSwiSW5jb21wbGV0ZSIpOworI2VuZGlmIC8qIFRMT0cgKi8KKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICBpZiAob19pc29wZW4gJiYgeCA+IC0xICYmICFkaXNwKSB7CisJZGVidWcoRjExMCwiY2xzb2YgT0siLHJmc3BlYywwKTsKKwltYWtlc3RyKCZyZnNwZWMscHJmc3BlYyk7CisJbWFrZXN0cigmcnJmc3BlYyxwcnJmc3BlYyk7CisJZnN0YXRzKCk7CisJaWYgKCFlcGt0cmN2ZCAmJiAhZXBrdHNlbnQgJiYgIWN4c2VlbiAmJiAhY3pzZWVuKSB7CisJICAgIHh4c2NyZWVuKFNDUl9TVCxTVF9PSywwTCwiIik7CisjaWZkZWYgVExPRworCSAgICBpZiAodHJhbG9nICYmICF0bG9nZm10KQorCSAgICAgIGRveGxvZyh3aGF0LHJmc3BlYyxmc2l6ZSxiaW5hcnksMCwiIik7CisjZW5kaWYgLyogVExPRyAqLworCX0KKyAgICB9CisgICAgcnNfbGVuID0gMDsKKyAgICBvX2lzb3BlbiA9IDA7CQkJLyogVGhlIGZpbGUgaXMgbm90IG9wZW4gYW55IG1vcmUuICovCisgICAgY3hzZWVuID0gMDsJCQkJLyogUmVzZXQgcGVyLWZpbGUgaW50ZXJydXB0aW9uIGZsYWcgKi8KKyAgICByZXR1cm4oeCk7CQkJCS8qIFNlbmQgYmFjayB6Y2xvc2UoKSByZXR1cm4gY29kZS4gKi8KK30KKworI2lmZGVmIFNVTk9TNFM1Cit0b2xvd2VyKGMpIGNoYXIgYzsgeyByZXR1cm4oKGMpLSdBJysnYScpOyB9Cit0b3VwcGVyKGMpIGNoYXIgYzsgeyByZXR1cm4oKGMpLSdhJysnQScpOyB9CisjZW5kaWYgLyogU1VOT1M0UzUgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja2NmbnMuYyBiL2NrZXJtaXQtOC4wLjIxMS9ja2NmbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2VhMjM2Ci0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrY2Zucy5jCkBAIC0wLDAgKzEsNzEwOCBAQAorY2hhciAqZm5zdiA9ICJDLUtlcm1pdCBmdW5jdGlvbnMsIDguMC4yMjMsIDEgTWF5IDIwMDMiOworCitjaGFyICpubVtdID0gIHsgIkRpc2FibGVkIiwgIkxvY2FsIG9ubHkiLCAiUmVtb3RlIG9ubHkiLCAiRW5hYmxlZCIgfTsKKworLyogIEMgSyBDIEYgTiBTICAtLSAgU3lzdGVtLWluZGVwZW5kZW50IEtlcm1pdCBwcm90b2NvbCBzdXBwb3J0IGZ1bmN0aW9ucy4gICovCisKKy8qICAuLi5QYXJ0IDEgKG90aGVycyBtb3ZlZCB0byBja2NmbjIsMyB0byBtYWtlIHRoaXMgbW9kdWxlIHNtYWxsZXIpICovCisKKy8qCisgIEF1dGhvcjogRnJhbmsgZGEgQ3J1eiA8ZmRjQGNvbHVtYmlhLmVkdT4sCisgIENvbHVtYmlhIFVuaXZlcnNpdHkgQWNhZGVtaWMgSW5mb3JtYXRpb24gU3lzdGVtcywgTmV3IFlvcmsgQ2l0eS4KKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorKi8KKy8qCisgU3lzdGVtLWRlcGVuZGVudCBwcmltaXRpdmVzIGRlZmluZWQgaW46CisKKyAgIGNrP3Rpby5jIC0tIHRlcm1pbmFsIChjb21tdW5pY2F0aW9ucykgaS9vCisgICBjeD9maW8uYyAtLSBmaWxlIGkvbywgZGlyZWN0b3J5IHN0cnVjdHVyZQorKi8KKyNpbmNsdWRlICJja2NzeW0uaCIJCQkvKiBOZWVkZWQgZm9yIFN0cmF0dXMgVk9TICovCisjaW5jbHVkZSAiY2tjYXNjLmgiCQkJLyogQVNDSUkgc3ltYm9scyAqLworI2luY2x1ZGUgImNrY2RlYi5oIgkJCS8qIERlYnVnIGZvcm1hdHMsIHR5cGVkZWZzLCBldGMuICovCisjaW5jbHVkZSAiY2tja2VyLmgiCQkJLyogU3ltYm9sIGRlZmluaXRpb25zIGZvciBLZXJtaXQgKi8KKyNpbmNsdWRlICJja2N4bGEuaCIJCQkvKiBDaGFyYWN0ZXIgc2V0IHN5bWJvbHMgKi8KKyNpbmNsdWRlICJja2NuZXQuaCIgICAgICAgICAgICAgICAgICAgICAvKiBWTVMgZGVmaW5pdGlvbiBvZiBUQ1BTT0NLRVQgKi8KKyNpZmRlZiBPUzIKKyNpZmRlZiBPUzJPTkxZCisjaW5jbHVkZSA8b3MyLmg+CisjZW5kaWYgLyogT1MyT05MWSAqLworI2luY2x1ZGUgImNrb2Nvbi5oIgorI2VuZGlmIC8qIE9TMiAqLworCitpbnQgZG9jcmMgID0gMDsJCQkJLyogQWNjdW11bGF0ZSBDUkMgZm9yIFx2KGNyYzE2KSAqLworbG9uZyBjcmMxNiA9IDBMOwkJCS8qIEZpbGUgQ1JDID0gXHYoY3JjMTYpICovCitpbnQgZ25mZXJyb3IgPSAwOwkJCS8qIGduZmlsZSgpIGZhaWx1cmUgcmVhc29uICovCisKK2V4dGVybiBDSEFSIGZlb2w7CitleHRlcm4gaW50IGJ5dGVvcmRlciwgeGZsZywgd2hhdCwgZm1hc2ssIGN4c2VlbiwgY3pzZWVuLCBuc2NhbmZpbGUsIHN5c2luZGV4OworZXh0ZXJuIGludCB4Y21kc3JjLCBkaXNwb3MsIG1hdGNoZmlmbzsKK2V4dGVybiBsb25nIGZmYzsKK2V4dGVybiBpbnQgaW5zZXJ2ZXI7CisKK2V4dGVybiBpbnQgbm9saW5rczsKKyNpZmRlZiBWTVNPUlVOSVgKK2V4dGVybiBpbnQgemdmc19kaXI7CisjaWZkZWYgQ0tTWU1MSU5LCitleHRlcm4gaW50IHpnZnNfbGluazsKKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKyNlbmRpZiAvKiBWTVNPUlVOSVggKi8KKworI2lmbmRlZiBOT1hGRVIKKworI2lmbmRlZiBOT0lDUAorI2lmbmRlZiBOT1NQTAorZXh0ZXJuIGNoYXIgKiBjbGNtZHM7CitleHRlcm4gaW50IGhhdmV1cmw7CisjaWZkZWYgQ0tfQVBDCitleHRlcm4gaW50IGFwY2FjdGl2ZSwgYWRsX2FzazsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworI2VuZGlmIC8qIE5PSUNQICovCisKK2V4dGVybiBpbnQgcmVtZmlsZTsKKworLyogKG1vdmUgdGhlc2UgcHJvdG90eXBlcyB0byB0aGUgYXBwcm9wcmlhdGUgLmggZmlsZXMuLi4pICovCisKKyNpZmRlZiBDT01NRU5UCisvKiBOb3QgdXNlZCAqLworI2lmZGVmIFZNUworX1BST1RPVFlQKCBpbnQgZ2V0dm51bSwgKGNoYXIgKikgKTsKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKK19QUk9UT1RZUCggc3RhdGljIGludCBiZ2V0cGt0LCAoaW50KSApOworI2lmbmRlZiBOT0NTRVRTCitfUFJPVE9UWVAoIGludCBsb29rdXAsIChzdHJ1Y3Qga2V5dGFiW10sIGNoYXIgKiwgaW50LCBpbnQgKikgKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisjaWZuZGVmIE5PU1BMCitfUFJPVE9UWVAoIGludCB6enN0cmluZywgKGNoYXIgKiwgY2hhciAqKiwgaW50ICopICk7CisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZmRlZiBPUzJPUlVOSVgKK19QUk9UT1RZUCggbG9uZyB6ZnNpemUsIChjaGFyICopICk7CisjZW5kaWYgLyogT1MyT1JVTklYICovCisKKyNpZmRlZiBPUzIKKyNpbmNsdWRlIDxpby5oPgorI2lmZGVmIE9TMk9OTFkKKyNpbmNsdWRlIDxvczIuaD4KKyNlbmRpZiAvKiBPUzJPTkxZICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBWTVMKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmIC8qIFZNUyAqLworCisvKiBFeHRlcm5hbHMgZnJvbSBja2NtYWkuYyAqLworCitleHRlcm4gaW50IHNydmNkbXNnLCBzcnZpZGwsIGlkbGV0bW87CitleHRlcm4gY2hhciAqIGNkbXNnZmlsZVtdOworZXh0ZXJuIGludCBzcHNpeiwgc3BtYXgsIHJwc2l6LCB0aW1pbnQsIHNydnRpbSwgcnRpbW8sIG5wYWQsIGVicSwgZWJxZmxnLAorIHJwdCwgcnB0cSwgcnB0ZmxnLCBjYXBhcywga2VlcCwgZm5jYWN0LCBwa3R0aW0sIGF1dG9wYXIsIHNwc2l6ciwgeGl0c3RhOworZXh0ZXJuIGludCBwa3RudW0sIGJjdHIsIGJjdHUsIGJjdGwsIGNsZmlscywgc2J1Zm51bSwgcHJvdG9jb2wsCisgc2l6ZSwgb3NpemUsIHNwa3RsLCBuZmlscywgY2t3YXJuLCB0aW1lZiwgc3BzaXpmLCBzbmR0eXAsIHJjdnR5cCwgc3VjY2VzczsKK2V4dGVybiBpbnQgcGFyaXR5LCB0dXJuLCBuZXR3b3JrLCB3aGF0cnUsIGZzZWNzLCBqdXN0b25lLCBzbG9zdGFydCwKKyBja2RlbGF5LCBkaXNwbGEsIG15cGFkbiwgbW92aW5nLCByZWN1cnNpdmUsIG5ldHR5cGU7CitleHRlcm4gbG9uZyBmaWxjbnQsIGZsY2ksIGZsY28sIHRsY2ksIHRsY28sIHRmYywgZnNpemUsIHNlbmRzdGFydCwgcnNfbGVuOworZXh0ZXJuIGxvbmcgZmlscmVqLCBvbGRjcHMsIGNwcywgcGVha2NwcywgY2N1LCBjY3AsIGNhbGlicmF0ZSwgZmlsZXN0YXR1czsKK2V4dGVybiBpbnQgZmJsa3NpeiwgZnJlY2wsIGZyZWNmbSwgZm9yZywgZmNjdHJsLCBmZGlzcGxhLCBza2lwYnVwOworZXh0ZXJuIGludCBzcGFja2V0cywgcnBhY2tldHMsIHRpbWVvdXRzLCByZXRyYW5zLCBjcnVuY2hlZCwgd21heCwgd2N1cjsKK2V4dGVybiBpbnQgaGNmbGcsIGJpbmFyeSwgZm5jbnYsIGJfc2F2ZSwgZl9zYXZlLCBzZXJ2ZXI7CitleHRlcm4gaW50IG5ha3N0YXRlLCBkaXNjYXJkLCByZWplY3Rpb24sIGxvY2FsLCB4ZmVybW9kZSwgaW50ZXJydXB0ZWQ7CitleHRlcm4gaW50IHJxLCBycWYsIHNxLCB3c2xvdHMsIHdzbG90biwgd3Nsb3RyLCB3aW5sbywgdXJwc2l6LCBybG47CitleHRlcm4gaW50IGZuc3BhdGgsIGZucnBhdGgsIGVvZm1ldGhvZCwgZGlyYWN0aXZlLCB3aGF0cnUyLCB3ZWFyZWFsaWtlOworZXh0ZXJuIGludCBhdGNhcHIsIGF0Y2FwYiwgYXRjYXB1OworZXh0ZXJuIGludCBscGNhcHIsIGxwY2FwYiwgbHBjYXB1OworZXh0ZXJuIGludCBzd2NhcHIsIHN3Y2FwYiwgc3djYXB1OworZXh0ZXJuIGludCBsc2NhcHIsIGxzY2FwYiwgbHNjYXB1OworZXh0ZXJuIGludCByc2NhcHIsIHJzY2FwYiwgcnNjYXB1OworZXh0ZXJuIGludCBycHRlbmEsIHJwdG1pbjsKK2V4dGVybiBpbnQgc3NlcXRibFtdOworZXh0ZXJuIGludCBudW1lcnJzLCBuenhvcHRzOworZXh0ZXJuIGxvbmcgcnB0bjsKK2V4dGVybiBpbnQgbWF4dHJ5OworZXh0ZXJuIGludCBzdGRvdWY7CitleHRlcm4gaW50IHNlbmRtb2RlOworZXh0ZXJuIGludCBjYXJyaWVyLCB0dHBydHk7CitleHRlcm4gaW50IGdfZm5ycGF0aDsKKyNpZmRlZiBUQ1BTT0NLRVQKK2V4dGVybiBpbnQgdHRucHJvdG87CisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZm5kZWYgTk9TUEwKK2V4dGVybiBpbnQgc25keGluLCBzbmR4aGksIHNuZHhsbzsKKyNlbmRpZiAvKiBOT1NQTCAqLworCitleHRlcm4gaW50IGdfYmluYXJ5LCBnX2ZuY252OworCisjaWZkZWYgR0ZUSU1FUgorZXh0ZXJuIENLRkxPQVQgZnBmc2VjczsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisKKyNpZmRlZiBPUzIKK2V4dGVybiBzdHJ1Y3QgemF0dHIgaWF0dHI7CisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBQSVBFU0VORAorZXh0ZXJuIGludCB1c2VwaXBlczsKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworZXh0ZXJuIGludCBwaXBlc2VuZDsKKworI2lmZGVmIFNUUkVBTUlORworZXh0ZXJuIGludCBzdHJlYW1ycSwgc3RyZWFtaW5nLCBzdHJlYW1lZCwgc3RyZWFtb2s7CisjZW5kaWYgLyogU1RSRUFNSU5HICovCitleHRlcm4gaW50IHJlbGlhYmxlLCBjbGVhcnJxLCBjbGVhcmVkLCB1cmNsZWFyOworCitleHRlcm4gaW50CisgIGF0ZW5jaSwgYXRlbmNvLCBhdGRhdGksIGF0ZGF0bywgYXRsZW5pLCBhdGxlbm8sIGF0YmxraSwgYXRibGtvLAorICBhdHR5cGksIGF0dHlwbywgYXRzaWRpLCBhdHNpZG8sIGF0c3lzaSwgYXRzeXNvLCBhdGRpc2ksIGF0ZGlzbzsKKworZXh0ZXJuIGludCBiaWdzYnNpeiwgYmlncmJzaXo7CitleHRlcm4gY2hhciAqdmVyc2lvOworZXh0ZXJuIGNoYXIgKmZpbGVmaWxlOworZXh0ZXJuIGNoYXIgd2hvYXJldVtdLCAqIGNrc3lzaWQ7CisKKyNpZm5kZWYgTk9TRVJWRVIKK2V4dGVybiBpbnQgbmdldHBhdGg7CitleHRlcm4gY2hhciAqIGdldHBhdGhbXTsKK2V4dGVybiBpbnQgZnJvbWdldHBhdGg7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKworI2lmZGVmIENLX0xPR0lOCitleHRlcm4gaW50IGlzZ3Vlc3Q7CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKworZXh0ZXJuIGludCBzcnZjbWRsZW47CitleHRlcm4gQ0hBUiAqc3J2Y21kLCAqIGVwa3Rtc2c7CitleHRlcm4gQ0hBUiBwYWRjaCwgbXlwYWRjLCBlb2wsIHNlb2wsIGN0bHEsIG15Y3RscSwgc3N0YXRlLCBteXJwdHE7CitleHRlcm4gQ0hBUiAqZGF0YSwgcGFkYnVmW10sIHN0Y2hyLCBteXN0Y2g7CitleHRlcm4gQ0hBUiAqc3J2cHRyOworZXh0ZXJuIENIQVIgKnJkYXRhcDsKK2V4dGVybiBjaGFyICpjbWFyZywgKmNtYXJnMiwgKipjbWxpc3QsIGZpbG5hbVtdLCBvZmlsbmFtW107CitleHRlcm4gY2hhciAqcmZzcGVjLCAqcHJmc3BlYywgKnJyZnNwZWMsICpwcnJmc3BlYywgKnNmc3BlYywgKnBzZnNwZWMsICpyZnNwZWM7CitleHRlcm4gY2hhciBmc3BlY1tdOworZXh0ZXJuIGludCBmc3BlY2xlbjsKKworI2lmbmRlZiBOT01TRU5ECitleHRlcm4gc3RydWN0IGZpbGVsaXN0ICogZmlsZWhlYWQsICogZmlsZW5leHQ7CitleHRlcm4gaW50IGFkZGxpc3Q7CisjZW5kaWYgLyogTk9NU0VORCAqLworCitfUFJPVE9UWVAoIGludCBsc2xvb2ssICh1bnNpZ25lZCBpbnQgYikgKTsgLyogTG9ja2luZyBTaGlmdCBMb29rYWhlYWQgKi8KK19QUk9UT1RZUCggaW50IHN6ZW9mLCAoQ0hBUiAqcykgKTsKK19QUk9UT1RZUCggVk9JRCBmbmxpc3QsICh2b2lkKSApOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisvKiBDaGFyYWN0ZXIgc2V0IFRyYW5zbGF0aW9uICovCisKKyNpZm5kZWYgTk9DU0VUUworZXh0ZXJuIGludCB0Y2hhcnNldCwgZmNoYXJzZXQsIGRjc2V0NywgZGNzZXQ4OworZXh0ZXJuIGludCBmY3Nfc2F2ZSwgdGNzX3NhdmU7CitleHRlcm4gaW50IG50Y3NldHMsIHhsYXR5cGUsIGNzZXF0YWJbXTsKK2V4dGVybiBzdHJ1Y3QgY3NpbmZvIHRjc2luZm9bXSwgZmNzaW5mb1tdOworZXh0ZXJuIGludCByX2NzZXQsIHNfY3NldCwgYWZjc2V0W107CisjaWZkZWYgVU5JQ09ERQorZXh0ZXJuIGludCB1Y3NvcmRlciwgZmlsZW9yZGVyOworI2VuZGlmIC8qIFVOSUNPREUgKi8KKworX1BST1RPVFlQKCBDSEFSIGlkZW50LCAoQ0hBUikgKTsJLyogSWRlbnRpdHkgdHJhbnNsYXRpb24gZnVuY3Rpb24gKi8KKworLyogQXJyYXlzIG9mIGFuZCBwb2ludGVycyB0byBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gZnVuY3Rpb25zICovCisKKyNpZmRlZiBDS19BTlNJQworZXh0ZXJuIENIQVIgKCpyeCkoQ0hBUik7IC8qIFBvaW50ZXIgdG8gaW5wdXQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIGZ1bmN0aW9uICovCitleHRlcm4gQ0hBUiAoKnN4KShDSEFSKTsgLyogUG9pbnRlciB0byBvdXRwdXQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIGZ1bmN0aW9uICovCitleHRlcm4gQ0hBUiAoKnhsc1tNQVhUQ1NFVFMrMV1bTUFYRkNTRVRTKzFdKShDSEFSKTsgLyogQnl0ZS10by1CeXRlIFNlbmQgKi8KK2V4dGVybiBDSEFSICgqeGxyW01BWFRDU0VUUysxXVtNQVhGQ1NFVFMrMV0pKENIQVIpOyAvKiBCeXRlLXRvLUJ5dGUgUmVjdiAqLworI2lmZGVmIFVOSUNPREUKK2V4dGVybiBpbnQgKCp4dXQpKFVTSE9SVCk7CS8qIFRyYW5zbGF0aW9uIGZ1bmN0aW9uIFVDUyB0byBUQ1MgKi8KK2V4dGVybiBpbnQgKCp4dWYpKFVTSE9SVCk7CS8qIFRyYW5zbGF0aW9uIGZ1bmN0aW9uIFVDUyB0byBGQ1MgKi8KK2V4dGVybiBVU0hPUlQgKCp4dHUpKENIQVIpOwkvKiBUcmFuc2xhdGlvbiBmdW5jdGlvbiBUQ1MgdG8gVUNTICovCitleHRlcm4gVVNIT1JUICgqeGZ1KShDSEFSKTsJLyogVHJhbnNsYXRpb24gZnVuY3Rpb24gRkNTIHRvIFVDUyAqLworI2VuZGlmIC8qIFVOSUNPREUgKi8KKworI2Vsc2UgLyogVGhlIHNhbWUgZGVjbGFyYXRpb25zIGFnYWluIGZvciBub24tQU5TSSBjb21pbGVycy4uLiAqLworCitleHRlcm4gQ0hBUiAoKnJ4KSgpOworZXh0ZXJuIENIQVIgKCpzeCkoKTsKK2V4dGVybiBDSEFSICgqeGxzW01BWFRDU0VUUysxXVtNQVhGQ1NFVFMrMV0pKCk7CitleHRlcm4gQ0hBUiAoKnhscltNQVhUQ1NFVFMrMV1bTUFYRkNTRVRTKzFdKSgpOworI2lmZGVmIFVOSUNPREUKK2V4dGVybiBpbnQgKCp4dXQpKCk7CitleHRlcm4gaW50ICgqeHVmKSgpOworZXh0ZXJuIFVTSE9SVCAoKnh0dSkoKTsKK2V4dGVybiBVU0hPUlQgKCp4ZnUpKCk7CisjZW5kaWYgLyogVU5JQ09ERSAqLworI2VuZGlmIC8qIENLX0FOU0lDICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCisvKiAoUFdQKSBleHRlcm5hbCBkZWYuIG9mIHRoaW5ncyB1c2VkIGluIGJ1ZmZlcmVkIGZpbGUgaW5wdXQgYW5kIG91dHB1dCAqLworCisjaWZkZWYgRFlOQU1JQworZXh0ZXJuIGNoYXIgKnppbmJ1ZmZlciwgKnpvdXRidWZmZXI7CisjZWxzZQorZXh0ZXJuIGNoYXIgemluYnVmZmVyW10sIHpvdXRidWZmZXJbXTsKKyNlbmRpZiAvKiBEWU5BTUlDICovCitleHRlcm4gY2hhciAqemlucHRyLCAqem91dHB0cjsKK2V4dGVybiBpbnQgemluY250LCB6b3V0Y250LCB6b2J1ZnNpemUsIHhmcnhsYTsKKworZXh0ZXJuIGxvbmcgY3JjdGFbXSwgY3JjdGJbXTsJCS8qIENSQy0xNiBnZW5lcmF0aW9uIHRhYmxlcyAqLworZXh0ZXJuIGludCByc2VxdGJsW107CQkJLyogUmVjJ2QtcGFja2V0IHNlcXVlbmNlICMgdGFibGUgKi8KKworI2lmbmRlZiBOT1hGRVIKKworLyogQ3JpdGVyaWEgdXNlZCBieSBnbmZpbGUoKS4uLiAqLworCitjaGFyIHNuZGFmdGVyWzE5XSAgID0geyBOVUwsIE5VTCB9OworY2hhciBzbmRiZWZvcmVbMTldICA9IHsgTlVMLCBOVUwgfTsKK2NoYXIgc25kbmFmdGVyWzE5XSAgPSB7IE5VTCwgTlVMIH07CitjaGFyIHNuZG5iZWZvcmVbMTldID0geyBOVUwsIE5VTCB9OworY2hhciAqc25kZXhjZXB0W05TTkRFWENFUFRdICA9IHsgTlVMTCwgTlVMTCB9OworY2hhciAqcmN2ZXhjZXB0W05TTkRFWENFUFRdICA9IHsgTlVMTCwgTlVMTCB9OworbG9uZyBzbmRzbWFsbGVyID0gLTFMOworbG9uZyBzbmRsYXJnZXIgID0gLTFMOworCisvKiBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSBidXQgc2hhcmVkIGJ5IG90aGVyIG1vZHVsZXMuICovCisKK2ludCB4ZnJiZWwgPSAxOworY2hhciAqIG9mcGVybXMgPSAiIjsJCQkvKiBPdXRwdXQgZmlsZSBwZXJtaXNzaW9ucyAqLworaW50IGF1dG9wYXRoID0gMDsJCQkvKiBTRVQgUkVDRUlWRSBQQVRITkFNRVMgQVVUTyBmbGFnICovCisKKyNpZmRlZiBDQUxJQlJBVEUKKyNkZWZpbmUgQ0FMX08gMworI2RlZmluZSBDQUxfTSAyNTMKKworaW50IGNhbF9qID0gMDsKKworQ0hBUgorY2FsX2FbXSA9IHsKKyAxNiwgNDUsIDk4LCAgMywgNTIsIDQxLCAxNCwgIDcsIDc2LDE2NSwxMjIsIDExLDEwNCwgNzcsMTY2LCAxNSwKKzE2MCwgOTMsIDE4LCAxOSwxMTIsIDg1LCA1NCwgMjMsMjMyLDIxMywgOTAsIDI3LCAxMiwgODEsMTI2LCAzMSwKKyAgNCwyMDUsIDM0LCAzNSwxNDQsIDczLDExMCwgMzksIDI4LDEzMywyMTgsIDQzLDE1NiwgNjUsMTAyLCA0NywKKyA4NCwgNjEsIDUwLCA1MSwyMDgsMTE3LCA4NiwgNTUsICA4LDI0NSwgNzQsIDU5LCA0NCwxMjUsMjIyLCA2MywKKyA4MCwgIDEsMTYyLCA2NywxMTYsMTA1LDIwNiwgNzEsMTIwLCAgOSwyNTAsIDc1LCA4OCwgOTcsICA2LCA3OSwKKzEwMCwyMjEsIDgyLCA4MywgMzYsIDg5LCA5NCwgODcsIDQwLCAyMSwxMDYsIDkxLDIzNiwxNDUsMTUwLCA5NSwKKzIyOCwgMzMsMTMwLCA5OSwxNDgsMTM3LDE5OCwxMDMsMTA4LDE2OSwgNDIsMTA3LDE4NCwxMjksIDc4LDExMSwKKyAgMCwgNDksMTE0LDExNSwgMzIsMTIxLDI1NCwxMTksMTcyLCA1NywxMzgsMTIzLDE1MiwxNzcsIDIyLDEyNywKKzI0MCwxOTMsICAyLDEzMSwxNzYsICA1LCAzOCwxMzUsMjA0LDIyOSwgMTAsMTM5LDIwMCwxNjEsMTc0LDE0MywKKzEyOCwgMTcsMTQ2LDE0NywgNjgsMTUzLCAzMCwxNTEsIDcyLDIxNywxNzAsMTU1LCAyNCwyMDksIDYyLDE1OSwKKyA2NCwyMjUsMTk0LDE2MywyNDQsMjAxLCA3MCwxNjcsMjE2LDE5NywyMzQsMTcxLDE4OCwxMDksMjMwLDE3NSwKKzIxMiwxMTMsMTc4LDE3OSwxMzIsMTg1LDE5MCwxODMsMTM2LDI0OSwyMDIsMTg3LCA5MiwyNDEsMTE4LDE5MSwKKyA0OCwyMzcsIDY2LDE5NSwgOTYsMjMzLDE0MiwxOTksMjQ4LCAzNywgNTgsMjAzLCA2MCwgMTMsMTM0LDIwNywKKyAyMCwgMjksMjEwLDIxMSwxNjQsMTQ5LDE4MiwyMTUsMjIwLCAyNSwgMjYsMjE5LDEyNCwxNTcsMjQ2LDIyMywKKzE4MCwxNDEsMjI2LDIyNywxOTIsMTAxLDIzOCwyMzEsIDU2LCA2OSwxNTQsMjM1LDI1MiwxNzMsIDQ2LDIzOSwKKzIyNCwyNTMsMjQyLDI0MywxOTYsIDUzLDIxNCwyNDcsMTY4LDE4MSwxODYsMjUxLDE0MCwxODksMTU4LDI1NQorfTsKKyNlbmRpZiAvKiBDQUxJQlJBVEUgKi8KKworY2hhciAqIHJmX2VyciA9ICJFcnJvciByZWNlaXZpbmcgZmlsZSI7CS8qIHJjdmZpbCgpIGVycm9yIG1lc3NhZ2UgKi8KKworI2lmZGVmIENLX1NQRUVECitzaG9ydCBjdGxwWzI1Nl0gPSB7CQkvKiBDb250cm9sLVByZWZpeCB0YWJsZSAqLworICAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIEMwICAqLworICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIEcwICAqLworICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwgLyogREVMICovCisgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogQzEgICovCisgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogRzEgICovCisgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxICAvKiAyNTUgKi8KK307CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKworaW50IHNuZHNyYzsJCS8qIEZsYWcgZm9yIHdoZXJlIHRvIGdldCBuYW1lcyBvZiBmaWxlcyB0byBzZW5kOiAqLworCQkJCQkvKiAtMTogem5leHQoKSBmdW5jdGlvbiAqLworCQkJCQkvKiAgMDogc3RkaW4gKi8KKwkJCQkJLyogPjA6IGxpc3QgaW4gY21saXN0IG9yIG90aGVyIGxpc3QgKi8KKwkJCQkJLyogLTk6IGNhbGlicmF0ZSAqLworCitpbnQgIG1lbXN0cjsJCQkJLyogRmxhZyBmb3IgaW5wdXQgZnJvbSBtZW1vcnkgc3RyaW5nICovCitpbnQgIGZ1bmNzdHI7CQkJCS8qIEZsYWcgZm9yIGlucHV0IGZyb20gZnVuY3Rpb24gKi8KK2ludCAgYmVzdGxlbiA9IDA7CitpbnQgIG1heHNlbmQgPSAwOworCitpbnQgZ25mX2JpbmFyeSA9IDA7CQkJLyogUHJldmFpbGluZyB4ZmVyIG1vZGUgZm9yIGduZmlsZSAqLworCisjaWZkZWYgcGRwMTEKKyNkZWZpbmUgTVlJTklUTEVOIDMyCisjZWxzZQorI2RlZmluZSBNWUlOSVRMRU4gMTAwCisjZW5kaWYgLyogcGRwMTEgKi8KK0NIQVIgbXlpbml0W01ZSU5JVExFTl07CQkJLyogQ29weSBvZiBteSBTZW5kLUluaXQgZGF0YSAqLworCisvKiBWYXJpYWJsZXMgbG9jYWwgdG8gdGhpcyBtb2R1bGUgKi8KKworI2lmZGVmIFRMT0cKKyNpZm5kZWYgWFlaX0lOVEVSTkFMCitzdGF0aWMKKyNlbmRpZiAvKiBYWVpfSU5URVJOQUwgKi8KK2NoYXIgKmZuY25hbVtdID0geworICAicmVuYW1lIiwgInJlcGxhY2UiLCAiYmFja3VwIiwgImFwcGVuZCIsICJkaXNjYXJkIiwgImFzayIsCisgICJ1cGRhdGUiLCAiZGF0ZXMtZGlmZmVyIiwgIiIKK307CisjZW5kaWYgLyogVExPRyAqLworCitzdGF0aWMgY2hhciAqbWVtcHRyOwkJCS8qIFBvaW50ZXIgZm9yIG1lbW9yeSBzdHJpbmdzICovCisKKyNpZmRlZiBWTVMKK2V4dGVybiBpbnQgYmF0Y2g7CisjZWxzZQorZXh0ZXJuIGludCBiYWNrZ3JkOworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgQ0tfQ1RSTFoKK3N0YXRpYyBpbnQgbGFzdGNoYXIgPSAwOworI2VuZGlmIC8qIENLX0NUUkxaICovCisKKyNpZmRlZiBDS19BTlNJQworc3RhdGljIGludCAoKmZ1bmNwdHIpKHZvaWQpOwkJLyogUG9pbnRlciBmb3IgZnVuY3Rpb24gc3RyaW5ncyAqLworI2Vsc2UKK3N0YXRpYyBpbnQgKCpmdW5jcHRyKSgpOworI2VuZGlmIC8qIENLX0FOU0lDICovCisKKyNpZmRlZiBwZHAxMQorI2RlZmluZSBDTURTVFJMIDUwCitzdGF0aWMgY2hhciBjbWRzdHJbNTBdOwkJCS8qIFN5c3RlbSBjb21tYW5kIHN0cmluZy4gKi8KKyNlbHNlCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgQ01EU1RSTCAxMDI0CisjZWxzZQorI2RlZmluZSBDTURTVFJMIDI1NgorI2VuZGlmIC8qIEJJR0JVRk9LICovCitzdGF0aWMgY2hhciBjbWRzdHJbQ01EU1RSTCsxXTsKKyNlbmRpZiAvKiBwZHAxMSAqLworCitzdGF0aWMgaW50IGRyYWluOwkJCS8qIEZvciBkcmFpbmluZyBzdGFja2VkLXVwIEFDS3MuICovCisKK3N0YXRpYyBpbnQgZmlyc3Q7CQkJLyogRmxhZyBmb3IgZmlyc3QgY2hhciBmcm9tIGlucHV0ICovCitzdGF0aWMgQ0hBUiB0OwkJCQkvKiBDdXJyZW50IGNoYXJhY3RlciAqLworI2lmZGVmIENPTU1FTlQKK3N0YXRpYyBDSEFSIG5leHQ7CQkJLyogTmV4dCBjaGFyYWN0ZXIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKK3N0YXRpYyBpbnQgZWJxc2VudCA9IDA7CQkJLyogOHRoLWJpdCBwcmVmaXggYmlkIHRoYXQgSSBzZW50ICovCitzdGF0aWMgaW50IGxzc3RhdGUgPSAwOwkJCS8qIExvY2tpbmcgc2hpZnQgc3RhdGUgKi8KK3N0YXRpYyBpbnQgbHNxdW90ZSA9IDA7CQkJLyogTG9ja2luZyBzaGlmdCBxdW90ZSAqLworCitleHRlcm4gaW50IHF1aWV0OworCisvKiAgRSBOIEMgUyBUIFIgIC0tICBFbmNvZGUgYSBzdHJpbmcgZnJvbSBtZW1vcnkuICovCisKKy8qCisgIENhbGwgdGhpcyBpbnN0ZWFkIG9mIGdldHBrdCgpIGlmIHNvdXJjZSBpcyBhIHN0cmluZywgcmF0aGVyIHRoYW4gYSBmaWxlLgorICBOb3RlOiBDaGFyYWN0ZXIgc2V0IHRyYW5zbGF0aW9uIGlzIG5ldmVyIGRvbmUgaW4gdGhpcyBjYXNlLgorKi8KKworI2lmZGVmIENPTU1FTlQKKyNkZWZpbmUgRU5DQlVGTCAyMDAKKyNpZm5kZWYgcGRwMTEKK0NIQVIgZW5jYnVmW0VOQ0JVRkxdOworI2Vsc2UKKy8qIFRoaXMgaXMgZ3Jvc3MsIGJ1dCB0aGUgcGRwMTEgcm9vdCBzZWdtZW50IGlzIG91dCBvZiBzcGFjZSAqLworLyogV2lsbCBhbGxvY2F0ZSBpdCBpbiBja3V1c3IuYy4gKi8KK2V4dGVybiBDSEFSIGVuY2J1ZltdOworI2VuZGlmIC8qIHBkcDExICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisvKgorICBFbmNvZGUgcGFja2V0IGRhdGEgZnJvbSBhIHN0cmluZyBpbiBtZW1vcnkgcmF0aGVyIHRoYW4gZnJvbSBhIGZpbGUuCisgIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZW5jb2RlZCBzdHJpbmcgb24gc3VjY2VzcywgLTEgaWYgdGhlIHN0cmluZworICBjb3VsZCBub3QgYmUgY29tcGxldGVseSBlbmNvZGVkIGludG8gdGhlIGN1cnJlbnRseSBuZWdvdGlhdGVkIGRhdGEKKyAgZmllbGQgbGVuZ3RoLgorKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCitlbmNzdHIoQ0hBUiAqcykKKyNlbHNlIC8qIENLX0FOU0lDICovCitlbmNzdHIocykgQ0hBUiogczsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworLyoKKyAgUmVjb2RlZCAzMCBKdWwgOTQgdG8gdXNlIHRoZSByZWd1bGFyIGRhdGEgYnVmZmVyIGFuZCB0aGUgbmVnb3RpYXRlZAorICBtYXhpbXVtIHBhY2tldCBzaXplLiAgUHJldmlvdXNseSB3ZSB3ZXJlIGxpbWl0ZWQgdG8gdGhlIGxlbmd0aCBvZiBlbmNidWZbXS4KKyAgQWxzbywgdG8gcmV0dXJuIGEgZmFpbHVyZSBjb2RlIGlmIHRoZSBlbnRpcmUgZW5jb2RlZCBzdHJpbmcgd291bGQgbm90IGZpdC4KKyAgTW9kaWZpZWQgMTQgSnVsIDk4IHRvIHJldHVybiBsZW5ndGggb2YgZW5jb2RlZCBzdHJpbmcuCisqLworICAgIGludCBtLCByYywgc2xlbjsgY2hhciAqcDsKKyAgICBpZiAoIWRhdGEpIHsJCQkvKiBXYXRjaCBvdXQgZm9yIG51bGwgcG9pbnRlcnMuICovCisJZGVidWcoRjEwMCwiU0VSSU9VUyBFUlJPUjogZW5jc3RyIGRhdGEgPT0gTlVMTCIsIiIsMCk7CisJcmV0dXJuKC0xKTsKKyAgICB9CisgICAgaWYgKCFzKSBzID0gKENIQVIgKikiIjsJCS8qIERpdHRvLiAqLworICAgIHNsZW4gPSBzdHJsZW4oKGNoYXIgKilzKTsJCS8qIExlbmd0aCBvZiBzb3VyY2Ugc3RyaW5nLiAqLworICAgIGRlYnVnKEYxMTEsImVuY3N0ciIscyxzbGVuKTsKKyAgICByYyA9IDA7CQkJCS8qIFJldHVybiBjb2RlLiAqLworICAgIG0gPSBtZW1zdHI7IHAgPSBtZW1wdHI7CQkvKiBTYXZlIHRoZXNlLiAqLworICAgIG1lbXB0ciA9IChjaGFyICopczsJCQkvKiBQb2ludCB0byB0aGUgc3RyaW5nLiAqLworICAgIGRlYnVnKEYxMDEsImVuY3N0ciBtZW1wdHIgMSIsIiIsbWVtcHRyKTsKKyAgICBtZW1zdHIgPSAxOwkJCQkvKiBGbGFnIG1lbW9yeSBzdHJpbmcgYXMgc291cmNlLiAqLworICAgIGZpcnN0ID0gMTsJCQkJLyogSW5pdGlhbGl6ZSBjaGFyYWN0ZXIgbG9va2FoZWFkLiAqLworICAgICpkYXRhID0gTlVMOwkJCS8qIEluIGNhc2UgcyBpcyBlbXB0eSAqLworICAgIGRlYnVnKEYxMDEsImVuY3N0ciBzcHNpeiIsIiIsc3BzaXopOworICAgIHJjID0gZ2V0cGt0KHNwc2l6LDApOwkJLyogRmlsbCBhIHBhY2tldCBmcm9tIHRoZSBzdHJpbmcuICovCisgICAgZGVidWcoRjEwMSwiZW5jc3RyIGdldHBrdCByYyIsIiIscmMpOworICAgIGlmIChyYyA+IC0xICYmIG1lbXB0ciA8IChjaGFyICopKHMgKyBzbGVuKSkgeyAvKiBNZWFucyB3ZSBkaWRuJ3QgZW5jb2RlICovCisJcmMgPSAtMTsJCQkvKiB0aGUgd2hvbGUgc3RyaW5nLiAqLworCWRlYnVnKEYxMDEsImVuY3N0ciBzdHJpbmcgdG9vIGJpZyIsIiIsc2l6ZSk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsImVuY3N0ciBnZXRwa3QgcmMiLCIiLHJjKTsKKyAgICBtZW1zdHIgPSBtOwkJCQkvKiBSZXN0b3JlIG1lbW9yeSBzdHJpbmcgZmxhZyAqLworICAgIG1lbXB0ciA9IHA7CQkJCS8qIGFuZCBwb2ludGVyICovCisgICAgZmlyc3QgPSAxOwkJCQkvKiBQdXQgdGhpcyBiYWNrIGFzIHdlIGZvdW5kIGl0LiAqLworICAgIHJldHVybihyYyk7Cit9CisKKy8qICBPdXRwdXQgZnVuY3Rpb25zIHBhc3NlZCB0byAnZGVjb2RlJzogICovCisKK2ludAkJCSAgICAgICAvKiAgUHV0IGNoYXJhY3RlciBpbiBzZXJ2ZXIgY29tbWFuZCBidWZmZXIgICovCisjaWZkZWYgQ0tfQU5TSUMKK3B1dHNydihjaGFyIGMpCisjZWxzZQorcHV0c3J2KGMpIHJlZ2lzdGVyIGNoYXIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogcHV0c3J2ICovIHsKKyAgICAqc3J2cHRyKysgPSBjOworICAgICpzcnZwdHIgPSAnXDAnOwkJLyogTWFrZSBzdXJlIGJ1ZmZlciBpcyBudWxsLXRlcm1pbmF0ZWQgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAkJCQkJLyogIE91dHB1dCBjaGFyYWN0ZXIgdG8gY29uc29sZS4gICovCisjaWZkZWYgQ0tfQU5TSUMKK3B1dHRybShjaGFyIGMpCisjZWxzZQorcHV0dHJtKGMpIHJlZ2lzdGVyIGNoYXIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogcHV0dHJtICovIHsKKyAgICBleHRlcm4gaW50IHJjZGFjdGl2ZTsKKyNpZm5kZWYgTk9TUEwKKyAgICBleHRlcm4gY2hhciAqIHFidWZwOwkJLyogSWYgUkVNT1RFIFFVRVJZIGFjdGl2ZSwgKi8KKyAgICBleHRlcm4gaW50IHF1ZXJ5LCBxYnVmbjsJCS8qIGFsc28gc3RvcmUgcmVzcG9uc2UgaW4gKi8KKyAgICBpZiAocXVlcnkgJiYgcWJ1Zm4rKyA8IDEwMjQpIHsJLyogcXVlcnkgYnVmZmVyLiAqLworCSpxYnVmcCsrID0gYzsKKwkqcWJ1ZnAgPSBOVUw7CisgICAgfQorICAgIGlmICghcXVlcnkgfHwgIXhjbWRzcmMpCisjZW5kaWYgLyogTk9TUEwgKi8KKy8qCisgIFRoaXMgcm91dGluZSBpcyB1c2VkIChhbW9uZyBvdGhlciB0aGluZ3MpIGZvciBwcmludGluZyB0aGUgc2VydmVyJ3MgYW5zd2VyCisgIHRvIGEgUkVNT1RFIGNvbW1hbmQuICBCdXQgUkVNT1RFIENEIGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBpc24ndCByZWFsbHkgCisgIGFza2luZyBmb3IgYW4gYW5zd2VyIGZyb20gdGhlIHNlcnZlci4gIFRodXMgc29tZSBwZW9wbGUgd2FudCB0byBzdXBwcmVzcworICB0aGUgY29uZmlybWF0aW9uIG1lc3NhZ2UgKGUuZy4gd2hlbiB0aGUgc2VydmVyIHNlbmRzIGJhY2sgdGhlIGFjdHVhbCBwYXRoCisgIG9mIHRoZSBkaXJlY3RvcnkgQ0QnZCB0byksIGFuZCBleHBlY3QgdG8gYmUgYWJsZSB0byBkbyB0aGlzIHdpdGggU0VUIFFVSUVUCisgIE9OLiAgQnV0IHRoZXkgd291bGQgbm90IHdhbnQgU0VUIFFVSUVUIE9OIHRvIHN1cHByZXNzIHRoZSBvdGhlciBzZXJ2ZXIKKyAgcmVwbGllcywgd2hpY2ggYXJlIHBvaW50bGVzcyB3aXRob3V0IHRoZWlyIGFuc3dlcnMuICBUaHVzIHRoZSAicmNkYWN0aXZlIgorICBmbGFnIChSRU1PVEUgQ0QgY29tbWFuZCBpcyBhY3RpdmUpLiAgVGh1IE9jdCAxMCAxNjozODoyMSAyMDAyCisqLworICAgICAgaWYgKCEocXVpZXQgJiYgcmNkYWN0aXZlKSkJLyogZ3Jvc3MsIHl1ayAqLworCWNvbm9jKGMpOworICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworaW50CQkJCQkvKiAgT3V0cHV0IGNoYXIgdG8gZmlsZS4gKi8KKyNpZmRlZiBDS19BTlNJQworcHV0bWZpbChjaGFyIGMpCQkJCS8qIEp1c3QgbGlrZSBwdXRmaWwgYnV0IHRvIFpNRklMRSAqLworI2Vsc2UJCQkJCS8qIHJhdGhlciB0aGFuIFpPRklMRS4uLiAqLworcHV0bWZpbChjKSByZWdpc3RlciBjaGFyIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHB1dG1maWwgKi8geworICAgIGRlYnVnKEYwMDAsInB1dGZpbCIsIiIsYyk7CisgICAgaWYgKHpjaG91dChaTUZJTEUsIChjaGFyKSAoYyAmIGZtYXNrKSkgPCAwKSB7CisJY3pzZWVuID0gMTsKKwlkZWJ1ZyhGMTAxLCJwdXRmaWwgemNob3V0IHdyaXRlIGVycm9yLCBzZXR0aW5nIGN6c2VlbiIsIiIsMSk7CisJcmV0dXJuKC0xKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCitpbnQJCQkJCS8qICBPdXRwdXQgY2hhciB0byBub3doZXJlLiAqLworI2lmZGVmIENLX0FOU0lDCitwdXRub3doZXJlKGNoYXIgYykKKyNlbHNlCitwdXRub3doZXJlKGMpIHJlZ2lzdGVyIGNoYXIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogcHV0bm93aGVyZSAqLyB7CisgICAgcmV0dXJuKDApOworfQorCisKK2ludAkJCQkJLyogIE91dHB1dCBjaGFyIHRvIGZpbGUuICovCisjaWZkZWYgQ0tfQU5TSUMKK3B1dGZpbChjaGFyIGMpCisjZWxzZQorcHV0ZmlsKGMpIHJlZ2lzdGVyIGNoYXIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogcHV0ZmlsICovIHsKKyAgICBkZWJ1ZyhGMDAwLCJwdXRmaWwiLCIiLGMpOworICAgIGlmICh6Y2hvdXQoWk9GSUxFLCAoY2hhcikgKGMgJiBmbWFzaykpIDwgMCkgeworCWN6c2VlbiA9IDE7ICAgCQkJLyogSWYgd3JpdGUgZXJyb3IuLi4gKi8KKwlkZWJ1ZyhGMTAxLCJwdXRmaWwgemNob3V0IHdyaXRlIGVycm9yLCBzZXR0aW5nIGN6c2VlbiIsIiIsMSk7CisJcmV0dXJuKC0xKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisvKgorICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBmb3IgcHV0ZmlsKCkuICBUaGUgb25seSByZWFzb24gZm9yIGl0cworICBleGlzdGVuY2UgaXMgdG8gYmUgcGFzc2VkIGFzIGEgZnVuY3Rpb24gcG9pbnRlciB0byBkZWNvZGUoKSwgd2hpY2ggdHJlYXRzCisgIHB1dGZpbCgpIGl0c2VsZiBzcGVjaWFsbHkgLS0gYnlwYXNzaW5nIGl0IGFuZCB1c2luZyBhbiBpbnRlcm5hbCBtYWNybworICBpbnN0ZWFkIHRvIHNwZWVkIHRoaW5ncyB1cC4gIFVzZSB6cHV0ZmlsKCkgaW5zdGVhZCBvZiBwdXRmaWwoKSBpbiBjYXNlcyB3aGVyZQorICB3ZSBkbyBub3Qgd2FudCB0aGlzIHRvIGhhcHBlbiwgZS5nLiB3aGVuIHdlIG5lZWQgdG8gc2VuZCBvdXRwdXQgdG8gdGhlIGZpbGUKKyAgd2l0aCBhIG1peHR1cmUgb2YgemNob3V0KCkgYW5kIHpzb3V0KCkvenNvdXRsKCkgY2FsbHMgKGFzIGlzIHRoZSBjYXNlIHdpdGgKKyAgaW5jb21pbmcgc2hvcnQtZm9ybSBSRU1PVEUgY29tbWFuZCByZXBsaWVzIHJlZGlyZWN0ZWQgdG8gYSBmaWxlKSwgd2hpY2ggd291bGQKKyAgb3RoZXJ3aXNlIHJlc3VsdCBpbiBkYXRhIHdyaXR0ZW4gdG8gdGhlIGZpbGUgb3V0IG9mIG9yZGVyLgorKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCit6cHV0ZmlsKGNoYXIgYykKKyNlbHNlCit6cHV0ZmlsKGMpIHJlZ2lzdGVyIGNoYXIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogenB1dGZpbCAqLyB7CisgICAgcmV0dXJuKHB1dGZpbChjKSk7Cit9CisKKyNpZm5kZWYgTk9YRkVSCisKKy8qIEQgRSBDIE8gRCBFICAtLSAgS2VybWl0IHBhY2tldCBkZWNvZGluZyBwcm9jZWR1cmUgKi8KKworLyoKKyBDYWxsIHdpdGggc3RyaW5nIHRvIGJlIGRlY29kZWQgYW5kIGFuIG91dHB1dCBmdW5jdGlvbi4KKyBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZSAoZS5nLiBkaXNrIGZ1bGwpLgorCisgVGhpcyBpcyB0aGUgImlubmVyIGxvb3AiIHdoZW4gcmVjZWl2aW5nIGZpbGVzLCBhbmQgbXVzdCBiZSBjb2RlZCBhcworIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlLiAgTm90ZSBzb21lIHBvdGVudGlhbCBwcm9ibGVtczogIGlmIGEgcGFja2V0CisgaXMgYmFkbHkgZm9ybWVkLCBoYXZpbmcgYSBwcmVmaXhlZCBzZXF1ZW5jZSBlbmRpbmcgcHJlbWF0dXJlbHksIHRoaXMKKyBmdW5jdGlvbiwgYXMgY29kZWQsIGNvdWxkIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBwYWNrZXQuICBUaGlzIGhhcworIG5ldmVyIGhhcHBlbmVkLCB0aHVzIHRoZSBhZGRpdGlvbmFsICh0aW1lLWNvbnN1bWluZykgdGVzdHMgaGF2ZSBub3QKKyBiZWVuIGFkZGVkLgorKi8KKworc3RhdGljIENIQVIgKnhkYnVmOwkvKiBHbG9iYWwgdmVyc2lvbiBvZiBkZWNvZGUoKSdzIGJ1ZmZlciBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgdXNlIGJ5IHRyYW5zbGF0aW9uIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gZm9yIHB1c2hpbmcgYSBjaGFyYWN0ZXIgb250byBkZWNvZGUoKSdzIGlucHV0IHN0cmVhbS4gKi8KKworVk9JRAorI2lmZGVmIENLX0FOU0lDCit6ZHN0dWZmKENIQVIgYykKKyNlbHNlCit6ZHN0dWZmKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogemRzdHVmZiAqLyB7CisgICAgeGRidWYtLTsJCQkJLyogQmFjayB1cCB0aGUgcG9pbnRlci4gKi8KKyAgICAqeGRidWYgPSBjOwkJCQkvKiBTdHVmZiB0aGUgY2hhcmFjdGVyLiAqLworfQorCisjaWZkZWYgQ0tUVU5JTkcKKy8qCisgIFRyaW1tZWQtZG93biBwYWNrZXQgZGVjb2RlciBmb3IgYmluYXJ5LW1vZGUgbm8tcGFyaXR5IHRyYW5zZmVycy4KKyAgZGVjb2RlKCkgaXMgdGhlIGZ1bGwgdmVyc2lvbi4KKyovCitpbnQKKyNpZmRlZiBDS19BTlNJQworYmRlY29kZShDSEFSICpidWYsIGludCAoKmZuKShjaGFyKSkKKyNlbHNlCitiZGVjb2RlKGJ1ZixmbikgcmVnaXN0ZXIgQ0hBUiAqYnVmOyByZWdpc3RlciBpbnQgKCpmbikoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogYmRlY29kZSAqLyB7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGEsIGE3OwkvKiBWYXJpb3VzIGNvcGllcyBvZiBjdXJyZW50IGNoYXIgKi8KKyAgICBpbnQgY2NwZmxnOwkJCQkvKiBGb3IgQ3RybC11bnByZWZpeGluZyBzdGF0cyAqLworICAgIGludCB0OwkJCQkvKiBJbnQgdmVyc2lvbiBvZiBjaGFyYWN0ZXIgKi8KKyAgICBpbnQgbGVuOworICAgIGxvbmcgejsJCQkJLyogRm9yIENSQyBjYWxjdWxhdGlvbiAqLworICAgIENIQVIgYzsJCQkJLyogQ3VycmVudCBjaGFyYWN0ZXIgKi8KKworICAgIGlmICghYmluYXJ5IHx8IHBhcml0eSB8fCBmbiAhPSBwdXRmaWwpIC8qIEpVU1QgSU4gQ0FTRSAqLworICAgICAgcmV0dXJuKGRlY29kZShidWYsZm4sMSkpOworICAgIGRlYnVnKEYxMDAsIkJERUNPREUiLCIiLDApOworCisgICAgeGRidWYgPSBidWY7CQkJLyogR2xvYmFsIGNvcHkgb2Ygc291cmNlIHBvaW50ZXIuICovCisKKyAgICBsZW4gPSBybG47CQkJCS8qIE51bWJlciBvZiBieXRlcyBpbiBkYXRhIGZpZWxkICovCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgYSA9ICp4ZGJ1ZisrICYgMHhmZjsJCS8qIEdldCBuZXh0IGNoYXJhY3RlciAqLworCWxlbi0tOworCXJwdCA9IDA7CQkJLyogSW5pdGlhbGl6ZSByZXBlYXQgY291bnQuICovCisJaWYgKGEgPT0gcnB0cSAmJiBycHRmbGcpIHsJLyogR290IGEgcmVwZWF0IHByZWZpeD8gKi8KKwkgICAgcnB0ID0geHVuY2hhcigqeGRidWYrKyAmIDB4RkYpOyAvKiBZZXMsIGdldCB0aGUgcmVwZWF0IGNvdW50LCAqLworCSAgICBycHRuICs9IHJwdDsKKwkgICAgYSA9ICp4ZGJ1ZisrICYgMHhGRjsJLyogYW5kIGdldCB0aGUgcHJlZml4ZWQgY2hhcmFjdGVyLiAqLworCSAgICBsZW4gLT0gMjsKKwl9CisJY2NwZmxnID0gMDsJCQkvKiBDb250cm9sIHByZWZpeCBmbGFnLiAqLworCWlmIChhID09IGN0bHEpIHsJCS8qIElmIGNvbnRyb2wgcHJlZml4LCAqLworCSAgICBhICA9ICp4ZGJ1ZisrICYgMHhGRjsJLyogZ2V0IGl0cyBvcGVyYW5kICovCisJICAgIGxlbi0tOworCSAgICBhNyA9IGEgJiAweDdGOwkJLyogYW5kIGl0cyBsb3cgNyBiaXRzLiAqLworCSAgICBpZiAoKGE3ID49IDAxMDAgJiYgYTcgPD0gMDEzNykgfHwgYTcgPT0gJz8nKSB7IC8qIENvbnRyb2xsaWZ5ICovCisJCWEgPSBjdGwoYSk7CQkvKiBpZiBpbiBjb250cm9sIHJhbmdlLiAqLworCQlhNyA9IGEgJiAweDdGOworCQljY3BmbGcgPSAxOwkJLyogTm90ZSB0aGF0IHdlIGRpZCB0aGlzICovCisJCWNjcCsrOwkJCS8qIENvdW50IGZvciBzdGF0cyAqLworCSAgICB9CisJfSBlbHNlIGE3ID0gYSAmIDB4N2Y7CQkvKiBOb3QgY29udHJvbCBxdW90ZSAqLworCWlmIChhNyA8IDMyIHx8IGE3ID09IDEyNykJLyogQSBiYXJlIGNvbnRyb2wgY2hhcmFjdGVyPyAqLworCSAgaWYgKCFjY3BmbGcpIGNjdSsrOwkJLyogQ291bnQgaXQgKi8KKwlpZiAoIXJwdCkgcnB0ID0gMTsKKwlmb3IgKDsgcnB0ID4gMDsgcnB0LS0pIHsJLyogT3V0cHV0IHRoZSBjaGFyIFJQVCB0aW1lcyAqLworI2lmZGVmIENBTElCUkFURQorCSAgICBpZiAoY2FsaWJyYXRlKSB7CisJCWZmYysrOworCQljb250aW51ZTsKKwkgICAgfQorI2VuZGlmIC8qIENBTElCUkFURSAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgaWYgKHhmbGcgJiYgIXJlbWZpbGUpIHsJCS8qIFdyaXRlIHRvIHZpcnR1YWwgc2NyZWVuICovCisgICAgICAgICAgICAgICAgY2hhciBfYTsKKyAgICAgICAgICAgICAgICBfYSA9IGEgJiBmbWFzazsKKyAgICAgICAgICAgICAgICB0ID0gY29ub2MoX2EpOworICAgICAgICAgICAgICAgIGlmICh0IDwgMSkKKyAgICAgICAgICAgICAgICAgICAgdCA9IC0xOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogT1MyICovCisJICAgICAgdCA9IHptY2hvdXQoYSAmIGZtYXNrKTsJLyogem1jaG91dCBpcyBhIG1hY3JvICovCisJICAgIGlmICh0IDwgMCkgeworCQlkZWJ1ZyhGMTAxLCJiZGVjb2RlIHdyaXRlIGVycm9yIC0gZXJybm8iLCIiLGVycm5vKTsKKwkJcmV0dXJuKC0xKTsKKwkgICAgfQorCSAgICBmZmMrKzsJCQkvKiBDb3VudCB0aGUgY2hhcmFjdGVyICovCisJICAgIGlmIChkb2NyYyAmJiAhcmVtZmlsZSkgewkvKiBVcGRhdGUgZmlsZSBDUkMgKi8KKwkJYyA9IGE7CQkJLyogRm9yY2UgY29udmVyc2lvbiB0byB1bnNpZ25lZCBjaGFyICovCisJCXogPSBjcmMxNiBeIChsb25nKWM7CisJCWNyYzE2ID0gKGNyYzE2ID4+IDgpIF4KKwkJICAoY3JjdGFbKHogJiAweEYwKSA+PiA0XSBeIGNyY3RiW3ogJiAweDBGXSk7CisJICAgIH0KKwl9CisjaWZkZWYgQ0tfQ1RSTFoKKwlsYXN0Y2hhciA9IGE7CisjZW5kaWYgLyogQ0tfQ1RSTFogKi8KKyAgICB9CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIENLVFVOSU5HICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKy8qICBQIE4gQiBZIFQgRSAgLS0gIE91dHB1dCBuZXh0IGJ5dGUgdG8gZmlsZSBvciBvdGhlciBkZXN0aW5hdGlvbiAgKi8KKworc3RhdGljIGxvbmcgb2ZmYyA9IDBMOworCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK3BuYnl0ZShDSEFSIGMsIGludCAoKmZuKShjaGFyKSkKKyNlbHNlCitwbmJ5dGUoYyxmbikgQ0hBUiBjOyBpbnQgKCpmbikoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogcG5ieXRlICovIHsKKyAgICBpbnQgcmM7CisgICAgbG9uZyB6OworCisjaWZkZWYgT1MyCisjaWZuZGVmIE5PWEZFUgorICAgIGlmICh4ZmxnICYmICFyZW1maWxlKSB7CQkvKiBXcml0ZSB0byB2aXJ0dWFsIHNjcmVlbiAqLworCWNoYXIgX2E7CisJX2EgPSBjICYgZm1hc2s7CisJcmMgPSBjb25vYyhfYSk7CisJaWYgKHJjIDwgMSkKKwkgIHJldHVybigtMSk7CisgICAgfSBlbHNlCisjZW5kaWYgLyogTk9YRkVSICovCisjZW5kaWYgLyogT1MyICovCisgICAgeworCWlmIChmbiA9PSBwdXRmaWwpIHsJCS8qIEV4ZWN1dGUgb3V0cHV0IGZ1bmN0aW9uICovCisJICAgIHJjID0gem1jaG91dChjKTsJCS8qIHRvLWZpbGUgbWFjcm8gKGZhc3QpICovCisJfSBlbHNlIGlmICghZm4pIHsKKwkgICAgcmMgPSBwdXRjaGFyKGMpOwkJLyogdG8tc2NyZWVuIG1hY3JvIChmYXN0KSAqLworICAgICAgICB9IGVsc2UgeworCSAgICByYyA9ICgqZm4pKGMpOwkJLyogZnVuY3Rpb24gY2FsbCAobm90IGFzIGZhc3QpICovCisJfQorCWlmIChyYyA8IDApCisJICByZXR1cm4ocmMpOworICAgIH0KKy8qCisgIEJvdGggeGduYnl0ZSgpIGFuZCB4cG5ieXRlKCkgaW5jcmVtZW50IGZmYyAodGhlIGZpbGUgYnl0ZSBjb3VudGVyKS4KKyAgRHVyaW5nIGZpbGUgdHJhbnNmZXIsIG9ubHkgb25lIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBjYWxsZWQuICBIb3dldmVyLAorICB0aGUgVFJBTlNMQVRFIGNvbW1hbmQgaXMgbGlrZWx5IHRvIGNhbGwgdGhlbSBib3RoLiAgb2ZmYywgdGhlcmVmb3JlLAorICBjb250YWlucyB0aGUgb3V0cHV0IGJ5dGUgY291bnQsIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgdGhlIFVDUy0yIEJPTS4KKyAgTk9URTogSXQgbWlnaHQgYmUgc2FmZSB0byBqdXN0IHRlc3QgZm9yIFdfU0VORCwgRlRQIG9yIG5vdC4KKyovCisgICAgaWYgKCh3aGF0ICYgKFdfRlRQfFdfU0VORCkpICE9IChXX0ZUUHxXX1NFTkQpKSB7CisJb2ZmYysrOwkJCQkvKiBDb3VudCB0aGUgYnl0ZSAqLworCWZmYysrOwkJCQkvKiBDb3VudCB0aGUgYnl0ZSAqLworICAgIH0KKyNpZm5kZWYgTk9YRkVSCisgICAgaWYgKGRvY3JjICYmICF4ZmxnICYmICFyZW1maWxlKSB7CS8qIFVwZGF0ZSBmaWxlIENSQyAqLworCXogPSBjcmMxNiBeIChsb25nKWM7CisJY3JjMTYgPSAoY3JjMTYgPj4gOCkgXgorCSAgKGNyY3RhWyh6ICYgMHhGMCkgPj4gNF0gXiBjcmN0Ylt6ICYgMHgwRl0pOworICAgIH0KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICByZXR1cm4oMSk7Cit9CisKKy8qCisgIFggUCBOIEIgWSBUIEUgIC0tICBUcmFuc2xhdGUgYW5kIHB1dCBuZXh0IGJ5dGUgdG8gZmlsZS4KKworICBPbmx5IGZvciBVbmljb2RlLiAgQ2FsbCB3aXRoIG5leHQgdW50cmFuc2xhdGVkIGJ5dGUgZnJvbSBpbmNvbWluZworICBieXRlIHN0cmVhbSwgd2hpY2ggY2FuIGJlIGluIGFueSBUcmFuc2ZlciBDaGFyYWN0ZXIgU2V0OiBVQ1MtMiwgVVRGLTgsCisgIExhdGluLTEsIExhdGluLUhlYnJldywgZXRjLiAgVHJhbnNsYXRlcyB0byB0aGUgZmlsZSBjaGFyYWN0ZXIgc2V0IGFuZAorICB3cml0ZXMgYnl0ZXMgdG8gdGhlIG91dHB1dCBmaWxlLiAgQ2FsbCB3aXRoIGNoYXJhY3RlciB0byB0cmFuc2xhdGUKKyAgYXMgYW4gaW50LCBwbHVzIHRoZSB0cmFuc2ZlciBjaGFyYWN0ZXIgc2V0ICh0byB0cmFuc2xhdGUgZnJvbSkgYW5kIHRoZQorICBmaWxlIGNoYXJhY3RlciBzZXQgKHRvIHRyYW5zbGF0ZSB0byksIG9yIC0xLDAsMCB0byByZXNldCB0aGUgVUNTLTIgYnl0ZQorICBudW1iZXIgKHdoaWNoIHNob3VsZCBiZSBkb25lIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmaWxlKS4gIElmIHRoZSB0cmFuc2ZlcgorICAoc291cmNlKSBjaGFyYWN0ZXItc2V0IGlzIFVDUy0yLCBieXRlcyBNVVNUIGFycml2ZSBpbiBCaWctRW5kaWFuIG9yZGVyLgorICBSZXR1cm5zOgorICAgLTE6IE9uIGVycm9yCisgICAgMDogTm90aGluZyB0byB3cml0ZSAobWlkLXNlcXVlbmNlKQorICAgPjA6IE51bWJlciBvZiBieXRlcyB3cml0dGVuLgorKi8KKyNpZmRlZiBLQU5KSQorc3RhdGljIGludCBqc3RhdGUgPSAwLCBqeCA9IDA7CQkvKiBGb3Igb3V0cHV0dGluZyBKSVMtNyAqLworc3RhdGljIGNoYXIgamJ1ZlsxNl0gPSB7IE5VTCwgTlVMIH07CisjZW5kaWYgLyogS0FOSkkgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3hwbmJ5dGUoaW50IGEsIGludCB0Y3MsIGludCBmY3MsIGludCAoKmZuKShjaGFyKSkKKyNlbHNlCit4cG5ieXRlKGEsdGNzLGZjcyxmbikgaW50IGEsIHRjcywgZmNzOyBpbnQgKCpmbikoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogeHBuYnl0ZSAqLyB7CisjaWZkZWYgVU5JQ09ERQorICAgIGV4dGVybiBpbnQgdWNzYm9tOwkJCS8qIEJ5dGUgb3JkZXIgKi8KKyNlbmRpZiAvKiBVTklDT0RFICovCisgICAgLyogQ0hBUiBjOyAqLwkJCS8qIFVuc2lnbmVkIGNoYXIgd29ya2VyICovCisgICAgc3RhdGljIHVuaW9uIGNrX3Nob3J0IHVjLCBldSwgc2o7CS8qIFVDUy0yLCBFVUMsIGFuZCBTaGlmdC1KSVMgd29ya2VycyAqLworICAgIFVTSE9SVCBjaDsJCQkJLyogZGl0dG8uLi4gKi8KKyAgICBVU0hPUlQgKiB1cyA9IE5VTEw7CQkJLyogZGl0dG8uLi4gKi8KKyAgICBpbnQgYzcsIHJjLCBoYXZldWMgPSAwOwkJLyogUmV0dXJuIGNvZGUgYW5kIFVDUy0yIGZsYWcgKi8KKyAgICBpbnQgdXRmZXJyb3IgPSAwOwkJCS8qIFVURi04IGVycm9yICovCisgICAgc3RhdGljIGludCBibiA9IDA7CQkJLyogVUNTLTIgYnl0ZSBudW1iZXIgKi8KKyAgICBpbnQgc3dhcHBpbmcgPSAwOwkJCS8qIFN3YXBwaW5nIFVDUyBieXRlcyB0byBvdXRwdXQ/ICovCisJCQkJCS8qIHN3YXBwaW5nIG11c3QgYmUgMCBvciAxICovCisgICAgaWYgKGEgPT0gLTEgJiYgKHRjcyB8IGZjcykgPT0gMCkgewkvKiBSZXNldCBpbiBjYXNlIHByZXZpb3VzIHJ1biAqLworCWJuID0gMDsJCQkJLyogbGVmdCBibiBhdCAxLi4uICovCisJb2ZmYyA9IDBMOworCWRlYnVnKEYxMDEsInhwbmJ5dGUgUkVTRVQiLCIiLGJuKTsKKwlyZXR1cm4oMCk7CisgICAgfQorICAgIGRlYnVnKEYwMDEsInhwbmJ5dGUgYSIsIiIsYSk7CisKKyNpZmRlZiBVTklDT0RFCisKKy8qCisgIGJ5dGVvcmRlciA9IGhhcmR3YXJlIGJ5dGUgb3JkZXIgb2YgdGhpcyBtYWNoaW5lLgorICB1Y3NvcmRlciAgPSBvdmVycmlkZSBieSBTRVQgRklMRSBVQ1MgQllURS1PUkRFUiBjb21tYW5kLgorICBmaWxlb3JkZXIgPSBieXRlIG9yZGVyIG9mIFVDUy0yIGlucHV0IGZpbGUgZGV0ZWN0ZWQgZnJvbSBCT00uCisgIHN3YXBwaW5nIGFwcGxpZXMgb25seSB3aGVuIG91dHB1dCBjaGFyc2V0IGlzIFVDUy0yLgorKi8KKyAgICBpZiAodWNzb3JkZXIgIT0gMSAmJiB1Y3NvcmRlciAhPSAwKQkvKiBBbHNvIGp1c3QgaW4gY2FzZS4uLiAqLworICAgICAgdWNzb3JkZXIgPSBieXRlb3JkZXI7CisgICAgaWYgKChieXRlb3JkZXIgJiYgIXVjc29yZGVyKSB8fCAoIWJ5dGVvcmRlciAmJiBmaWxlb3JkZXIpKQorICAgICAgc3dhcHBpbmcgPSAxOwkJCS8qIFN3YXBwaW5nIGJ5dGVzIHRvIG91dHB1dCAqLworCisjaWZkZWYgQ09NTUVOVAorICAgIGRlYnVnKEYxMDEsInhwbmJ5dGUgdWNzb3JkZXIiLCIiLHVjc29yZGVyKTsKKyAgICBkZWJ1ZyhGMTAxLCJ4cG5ieXRlIHN3YXBwaW5nIiwiIixzd2FwcGluZyk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgaWYgKHRjcyA9PSBUQ19VVEY4KSB7CQkvKiAnYScgaXMgZnJvbSBhIFVURi04IHN0cmVhbSAqLworCWNoID0gYTsKKwlpZiAoZmNzID09IFRDX1VURjgpCQkvKiBPdXRwdXQgaXMgVVRGLTggdG9vICovCisJICByZXR1cm4ocG5ieXRlKGNoLGZuKSk7CS8qIHNvIGp1c3QgY29weS4gKi8KKwlyYyA9IHV0ZjhfdG9fdWNzMihjaCwmdXMpOwkvKiBPdGhlcndpc2UgY29udmVydCB0byBVQ1MtMiAqLworCWlmIChyYyA9PSAwKSB7CQkJLyogRG9uZSB3aXRoIHRoaXMgc2VxdWVuY2UgKi8KKwkgICAgdWMueF9zaG9ydCA9ICp1czsJCS8qIFdlIGhhdmUgYSBVbmljb2RlICovCisJICAgIGhhdmV1YyA9IDE7CisJfSBlbHNlIGlmIChyYyA8IDApIHsJCS8qIEVycm9yICovCisJICAgIGRlYnVnKEYxMDEsInhwbmJ5dGUgVVRGLTggY29udmVyc2lvbiBlcnJvciIsIiIscmMpOworCSAgICBoYXZldWMgPSAxOwkJCS8qIFJlcGxhY2UgYnkgVStGRkZEICovCisJICAgIHVjLnhfc2hvcnQgPSAqdXM7CisJICAgIHV0ZmVycm9yID0gMTsKKwl9IGVsc2UJCQkJLyogU2VxdWVuY2UgaW5jb21wbGV0ZSAqLworCSAgcmV0dXJuKDApOworICAgIH0gZWxzZSBpZiAodGNzID09IFRDX1VDUzIpIHsJLyogJ2EnIGlzIFVDUy0yICovCisJLyogSGVyZSB3ZSBoYXZlIGluY29taW5nIFVDUy0yIGluIGd1YXJhbnRlZWQgQmlnIEVuZGlhbiBvcmRlciAqLworCS8qIHNvIHdlIG11c3QgZXhjaGFuZ2UgYnl0ZXMgaWYgbG9jYWwgbWFjaGluZSBpcyBMaXR0bGUgRW5kaWFuLiAqLworCXN3aXRjaCAoYm4pIHsJCQkvKiBXaGljaCBieXRlPyAqLworCSAgY2FzZSAwOgkJCS8qIEhpZ2guLi4gKi8KKwkgICAgdWMueF9jaGFyW2J5dGVvcmRlcl0gPSAodW5zaWduZWQpYSAmIDB4ZmY7CisJICAgIGJuKys7CisJICAgIHJldHVybigwKTsJCQkvKiBXYWl0IGZvciBuZXh0ICovCisJICBjYXNlIDE6CQkJLyogTG93Li4uICovCisJICAgIHVjLnhfY2hhclsxLWJ5dGVvcmRlcl0gPSAodW5zaWduZWQpYSAmIDB4ZmY7CisJICAgIGJuID0gMDsJCQkvKiBEb25lIHdpdGggc2VxdWVuY2UgKi8KKwkgICAgaGF2ZXVjID0gMTsJCQkvKiBIYXZlIGEgVW5pY29kZSAqLworCX0KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBVTklDT0RFICovCisKKyNpZmRlZiBLQU5KSQkJCQkvKiBXaGV0aGVyIFVOSUNPREUgaXMgZGVmaW5lZCBvciBub3QgKi8KKyAgICAgIGlmICh0Y3MgPT0gVENfSkVVQykgewkJLyogSW5jb21pbmcgSmFwYW5lc2UgRVVDICovCisJaW50IGJhZCA9IDA7CisJc3RhdGljIGludCBrYW5qaSA9IDA7CQkvKiBGbGFncyBzZXQgaW4gY2FzZSAwIGZvciBjYXNlIDEgKi8KKwlzdGF0aWMgaW50IGthbmEgPSAwOworCXN3aXRjaCAoYm4pIHsJCQkvKiBCeXRlIG51bWJlciAqLworCSAgY2FzZSAwOgkJCS8qIEJ5dGUgMCAqLworCSAgICBldS54X3Nob3J0ID0gMDsKKwkgICAgaWYgKChhICYgMHg4MCkgPT0gMCkgeworCQlzai54X3Nob3J0ID0gKHVuc2lnbmVkKWEgJiAweGZmOyAvKiBTaW5nbGUgYnl0ZSAqLworCQlrYW5qaSA9IGthbmEgPSAwOworCSAgICB9IGVsc2UgewkJCS8qIERvdWJsZSBieXRlICovCisJCWM3ID0gYSAmIDB4N2Y7CisJCWlmIChjNyA+IDB4MjAgJiYgYzcgPCAweDdmKSB7IC8qIEthbmppICovCisJCSAgICBldS54X2NoYXJbYnl0ZW9yZGVyXSA9IChDSEFSKSBhOyAgLyogU3RvcmUgZmlyc3QgYnl0ZSAqLworCQkgICAgYm4rKzsJCSAgICAgIC8qIFNldCB1cCBmb3Igc2Vjb25kIGJ5dGUgKi8KKwkJICAgIGthbmppID0gMTsKKwkJICAgIGthbmEgPSAwOworCQkgICAgcmV0dXJuKDApOworCQl9IGVsc2UgaWYgKGEgPT0gMHg4ZSkgewkvKiBTUzIgLS0gS2F0YWthbmEgcHJlZml4ICovCisJCSAgICBldS54X2NoYXJbYnl0ZW9yZGVyXSA9IChDSEFSKSBhOyAvKiBTYXZlIGl0ICovCisJCSAgICBibisrOworCQkgICAga2FuYSA9IDE7CisJCSAgICBrYW5qaSA9IDA7CisJCSAgICByZXR1cm4oMCk7CisJCX0gZWxzZSB7CisJCSAgICBiYWQrKzsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSAxOgkJCS8qIEJ5dGUgMSAqLworCSAgICBibiA9IDA7CisJICAgIGlmIChrYW5qaSkgeworCQlldS54X2NoYXJbMS1ieXRlb3JkZXJdID0gKENIQVIpIGE7CisJCXNqLnhfc2hvcnQgPSBldV90b19zaihldS54X3Nob3J0KTsKKwkJYnJlYWs7CisJICAgIH0gZWxzZSBpZiAoa2FuYSkgeworCQlzai54X3Nob3J0ID0gKENIQVIpIChhIHwgMHg4MCk7CisJCWJyZWFrOworCSAgICB9IGVsc2UgewkJCS8qIChzaG91bGRuJ3QgaGFwcGVuKSAqLworCQliYWQrKzsKKwkgICAgfQorCX0KKwkvKiBDb21lIGhlcmUgd2l0aCBvbmUgU2hpZnQtSklTIGNoYXJhY3RlciAqLworCisjaWZkZWYgVU5JQ09ERQorCWlmIChiYWQpIHsKKwkgICAgdWMueF9zaG9ydCA9IDB4ZmZmZDsKKwl9IGVsc2UgeworCSAgICB1Yy54X3Nob3J0ID0gc2pfdG9fdW4oc2oueF9zaG9ydCk7IC8qIENvbnZlcnQgdG8gVW5pY29kZSAqLworCX0KKwloYXZldWMgPSAxOworI2VuZGlmIC8qIFVOSUNPREUgKi8KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBLQU5KSSAqLworCisjaWZkZWYgVU5JQ09ERQorCXVjLnhfc2hvcnQgPSAodW5zaWduZWQpYSAmIDB4ZmY7IC8qIExhdGluLTEgb3Igd2hhdGV2ZXIuLi4gKi8KKworICAgIC8qIENvbWUgaGVyZSB3aXRoIHVjID0gdGhlIGNoYXJhY3RlciB0byBiZSB0cmFuc2xhdGVkLiAqLworICAgIC8qIElmIChoYXZldWMpIGl0J3MgVUNTLTIgaW4gbmF0aXZlIG9yZGVyLCBvdGhlcndpc2UgaXQncyBhIGJ5dGUuICovCisKKyAgICBkZWJ1ZyhGMTAxLCJ4cG5ieXRlIGhhdmV1YyIsIiIsaGF2ZXVjKTsKKworICAgIGlmIChoYXZldWMpIHsJCQkvKiBJZiB3ZSBoYXZlIGEgVW5pY29kZS4uLiAqLworCWRlYnVnKEYwMDEsInhwbmJ5dGUgdWMueF9zaG9ydCIsIltBXSIsdWMueF9zaG9ydCk7CisJZGVidWcoRjEwMSwieHBuYnl0ZSBmZW9sIiwiIixmZW9sKTsKKwlpZiAod2hhdCAmIFdfWEZFUikgewkJLyogSWYgdHJhbnNmZXJyaW5nIGEgZmlsZSAqLworCSAgICBpZiAoZmVvbCAmJiB1Yy54X3Nob3J0ID09IENSKSB7IC8qIGhhbmRsZSBlb2wgY29udmVyc2lvbi4gKi8KKwkJcmV0dXJuKDApOworCSAgICB9IGVsc2UgaWYgKGZlb2wgJiYgdWMueF9zaG9ydCA9PSBMRikgeworCQl1Yy54X3Nob3J0ID0gZmVvbDsKKwkgICAgfQorCX0KKwlkZWJ1ZyhGMDAxLCJ4cG5ieXRlIHVjLnhfc2hvcnQiLCJbQl0iLHVjLnhfc2hvcnQpOworCWlmIChmY3MgPT0gRkNfVUNTMikgewkJLyogQW5kIEZDUyBpcyBVQ1MtMiAqLworCSAgICAvKiBXcml0ZSBvdXQgdGhlIGJ5dGVzIGluIHRoZSBhcHByb3ByaWF0ZSBieXRlIG9yZGVyICovCisJICAgIGludCBjb3VudCA9IDA7CisjaWZuZGVmIElLU0RPTkxZCisjaWZkZWYgT1MyCisgICAgICAgICAgICBleHRlcm4gaW50IGs5NXN0ZG91dCx3aGVyZXhbXSx3aGVyZXlbXTsKKwkJCWV4dGVybiB1bnNpZ25lZCBjaGFyIGNvbG9yY21kOworICAgICAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgIFVTSE9SVCB1Y3MyOworICAgICAgICAgICAgICAgIFVDSEFSICBieXRlc1syXTsKKyAgICAgICAgICAgIH0gb3V0cHV0OworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIElLU0RPTkxZICovCisJICAgIGlmIChvZmZjID09IDBMICYmIHVjc2JvbSkgewkvKiBCZWdpbm5pbmcgb2YgZmlsZT8gKi8KKworI2lmbmRlZiBJS1NET05MWQorI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgIGlmIChmbiA9PSBOVUxMICYmICFrOTVzdGRvdXQgJiYgIWluc2VydmVyKSB7CisJCSAgICBvZmZjKys7CisjaWZkZWYgQ09NTUVOVAorCQkgICAgLyogRG9uJ3QgcHJpbnQgdGhlIEJPTSB0byB0aGUgZGlzcGxheSAqLworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnl0ZXNbMF0gPSAoIXVjc29yZGVyID8gMHhmZiA6IDB4ZmUpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnl0ZXNbMV0gPSAoIXVjc29yZGVyID8gMHhmZSA6IDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIFZzY3JuV3J0VUNTMlN0ckF0dChWQ01ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC51Y3MyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJleVtWQ01EXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJleFtWQ01EXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcmNtZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgfSBlbHNlIAorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIElLU0RPTkxZICovCisgICAgICAgICAgICAgICAgeworCQkgICAgaWYgKChyYyA9IHBuYnl0ZSgodWNzb3JkZXIgPyAweGZmIDogMHhmZSksZm4pKSA8IDApCisJCSAgICAgIHJldHVybihyYyk7CS8qIEJPTSAqLworCQkgICAgaWYgKChyYyA9IHBuYnl0ZSgodWNzb3JkZXIgPyAweGZlIDogMHhmZiksZm4pKSA8IDApCisJCSAgICAgIHJldHVybihyYyk7CisJCX0KKwkJY291bnQgKz0gMjsKKwkgICAgfQorCSAgICBpZiAodXRmZXJyb3IpIHsKKyNpZm5kZWYgSUtTRE9OTFkKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICBpZiAoZm4gPT0gTlVMTCAmJiAhazk1c3Rkb3V0ICYmICFpbnNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICBvZmZjKys7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5ieXRlc1swXSA9ICghdWNzb3JkZXIgPyAweGZkIDogMHhmZik7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5ieXRlc1sxXSA9ICghdWNzb3JkZXIgPyAweGZmIDogMHhmZCk7CisKKyAgICAgICAgICAgICAgICAgICAgVnNjcm5XcnRVQ1MyU3RyQXR0KFZDTUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LnVjczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmV5W1ZDTURdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmV4W1ZDTURdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yY21kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0gZWxzZSAKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBJS1NET05MWSAqLworCQl7CisJCSAgICBpZiAoKHJjID0gcG5ieXRlKCh1Y3NvcmRlciA/IDB4ZmQgOiAweGZmKSxmbikpIDwgMCkKKwkJICAgICAgcmV0dXJuKHJjKTsKKwkJICAgIGlmICgocmMgPSBwbmJ5dGUoKHVjc29yZGVyID8gMHhmZiA6IDB4ZmQpLGZuKSkgPCAwKQorCQkgICAgICByZXR1cm4ocmMpOworCQl9CisJCWNvdW50ICs9IDI7CisJICAgIH0KKyNpZm5kZWYgSUtTRE9OTFkKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGlmIChmbiA9PSBOVUxMICYmICFrOTVzdGRvdXQgJiYgIWluc2VydmVyKSB7CisgICAgICAgICAgICAgICAgb2ZmYysrOworICAgICAgICAgICAgICAgIG91dHB1dC5ieXRlc1swXSA9IHVjLnhfY2hhclsxLXN3YXBwaW5nXTsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYnl0ZXNbMV0gPSB1Yy54X2NoYXJbc3dhcHBpbmddOworCisgICAgICAgICAgICAgICAgVnNjcm5XcnRVQ1MyU3RyQXR0KFZDTUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQudWNzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmV5W1ZDTURdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZXhbVkNNRF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcmNtZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIAorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIElLU0RPTkxZICovCisgICAgICAgICAgICB7CisJCWlmICgocmMgPSBwbmJ5dGUodWMueF9jaGFyW3N3YXBwaW5nXSxmbikpIDwgMCkKKwkJICByZXR1cm4ocmMpOworCQlpZiAoKHJjID0gcG5ieXRlKHVjLnhfY2hhclsxLXN3YXBwaW5nXSxmbikpIDwgMCkKKwkJICByZXR1cm4ocmMpOworCSAgICB9CisJICAgIGNvdW50ICs9IDI7CisJICAgIHJldHVybihjb3VudCk7CisJfSBlbHNlIGlmIChmY3MgPT0gRkNfVVRGOCkgewkvKiBDb252ZXJ0IHRvIFVURi04ICovCisJICAgIENIQVIgKiBidWYgPSBOVUxMOworCSAgICBpbnQgaSwgY291bnQ7CisJICAgIGlmICh1dGZlcnJvcikgeworCQlpZiAoKHJjID0gcG5ieXRlKCh1Y3NvcmRlciA/IDB4YmQgOiAweGZmKSxmbikpIDwgMCkKKwkJICByZXR1cm4ocmMpOworCQlpZiAoKHJjID0gcG5ieXRlKCh1Y3NvcmRlciA/IDB4ZmYgOiAweGJkKSxmbikpIDwgMCkKKwkJICByZXR1cm4ocmMpOworCSAgICB9CisJICAgIGlmICgoY291bnQgPSB1Y3MyX3RvX3V0ZjgodWMueF9zaG9ydCwmYnVmKSkgPCAxKQorCSAgICAgIHJldHVybigtMSk7CisJICAgIGRlYnVnKEYwMTEsInhwbmJ5dGUgYnVmIixidWYsY291bnQpOworCSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkgICAgICBpZiAoKHJjID0gcG5ieXRlKGJ1ZltpXSxmbikpIDwgMCkKKwkJcmV0dXJuKHJjKTsKKwkgICAgaWYgKHV0ZmVycm9yKQorCSAgICAgIGNvdW50ICs9IDI7CisJICAgIHJldHVybihjb3VudCk7CisJfSBlbHNlIHsJCQkvKiBUcmFuc2xhdGUgVUNTLTIgdG8gYnl0ZSAqLworCSAgICBpZiAodWMueF9zaG9ydCA9PSAweDIwMjggfHwgdWMueF9zaG9ydCA9PSAweDIwMjkpIHsKKwkJaWYgKHV0ZmVycm9yKQorCQkgIHBuYnl0ZShVTkssZm4pOworCQlpZiAoZmVvbCkKKwkJICByZXR1cm4ocG5ieXRlKChDSEFSKWZlb2wsZm4pKTsKKwkJaWYgKChyYyA9IHBuYnl0ZSgoQ0hBUilDUixmbikpIDwgMCkKKwkJICByZXR1cm4ocmMpOworCQlpZiAoKHJjID0gcG5ieXRlKChDSEFSKUxGLGZuKSkgPCAwKQorCQkgIHJldHVybihyYyk7CisJCWVsc2UKKwkJICByZXR1cm4odXRmZXJyb3IgPyAzIDogMik7CisJICAgIH0gZWxzZSBpZiAoeHVmKSB7CQkvKiBVQ1MtdG8tRkNTIGZ1bmN0aW9uICovCisJCWludCB4ID0gMDsKKwkJaWYgKHV0ZmVycm9yKQorCQkgIHBuYnl0ZShVTkssZm4pOworCQlpZiAoKHJjID0gKCp4dWYpKHVjLnhfc2hvcnQpKSA8IDApIC8qIFRoZXNlIGNhbiBmYWlsLi4uICovCisJCSAgY2ggPSBVTks7CisJCWVsc2UKKwkJICBjaCA9ICh1bnNpZ25lZCkoKHVuc2lnbmVkKXJjICYgMHhmZmZmKTsKKwkJeCA9IHBuYnl0ZShjaCxmbik7CisJCWlmICh4IDwgMCkKKwkJICByZXR1cm4oeCk7CisJCWVsc2UgaWYgKHV0ZmVycm9yKQorCQkgIHgrKzsKKwkJcmV0dXJuKHgpOworI2lmZGVmIEtBTkpJCisKKy8qICBBbHNvIHNlZSB0aGUgbm9uLVVuaWNvZGUgS2Fuamkgc2VjdGlvbiBmdXJ0aGVyIGRvd24gaW4gdGhpcyBmdW5jdGlvbi4gKi8KKworCSAgICB9IGVsc2UgaWYgKGZjc2luZm9bZmNzXS5hbHBoYWJldCA9PSBBTF9KQVBBTikgeworCisJCS8qIFRyYW5zbGF0ZSBVQ1MtMiB0byBKYXBhbmVzZSBzZXQgKi8KKwkJZGVidWcoRjAwMSwieHBuYnl0ZSB1YyIsIiIsdWMueF9zaG9ydCk7CisJCXNqLnhfc2hvcnQgPSB1bl90b19zaih1Yy54X3Nob3J0KTsgLyogRmlyc3QgdG8gU2hpZnQtSklTICovCisJCWRlYnVnKEYwMDEsInhwbmJ5dGUgc2oiLCIiLHNqLnhfc2hvcnQpOworCisJCXN3aXRjaCAoZmNzKSB7CQkvKiBGaWxlIGNoYXJhY3RlciBzZXQgKi8KKwkJICBjYXNlIEZDX1NISklTOgkvKiBTaGlmdC1KSVMgLS0ganVzdCBvdXRwdXQgaXQgKi8KKwkJICAgIGlmIChzai54X2NoYXJbYnl0ZW9yZGVyXSkgLyogQnV0IG5vdCBoaWdoIGJ5dGUgaWYgemVybyAqLworCQkgICAgICBpZiAoKHJjID0gcG5ieXRlKChDSEFSKXNqLnhfY2hhcltieXRlb3JkZXJdLGZuKSkgPCAwKQorCQkJcmV0dXJuKHJjKTsKKwkJICAgIGlmICgocmMgPSBwbmJ5dGUoKENIQVIpc2oueF9jaGFyWzEtYnl0ZW9yZGVyXSxmbikpIDwgMCkKKwkJICAgICAgcmV0dXJuKHJjKTsKKwkJICAgIHJldHVybigyKTsKKwkJICBjYXNlIEZDX0pFVUM6CQkvKiBFVUMtSlAgKi8KKwkJICAgIGV1Lnhfc2hvcnQgPSBzal90b19ldShzai54X3Nob3J0KTsgLyogU2hpZnQtSklTIHRvIEVVQyAqLworCQkgICAgZGVidWcoRjAwMSwieHBuYnl0ZSBldSIsIiIsZXUueF9zaG9ydCk7CisJCSAgICBpZiAoZXUueF9zaG9ydCA9PSAweGZmZmYpIHsgLyogQmFkICovCisJCQlpZiAoKHJjID0gcG5ieXRlKFVOSyxmbikpIDwgMCkKKwkJCSAgcmV0dXJuKHJjKTsKKwkJCXJldHVybigxKTsKKwkJICAgIH0gZWxzZSB7CQkvKiBHb29kICovCisJCQlpbnQgY291bnQgPSAwOwkvKiBXcml0ZSBoaWdoIGJ5dGUgaWYgbm90IHplcm8gKi8KKwkJCWlmIChldS54X2NoYXJbYnl0ZW9yZGVyXSkgeworCQkJICAgIGlmICgocmM9cG5ieXRlKChDSEFSKWV1LnhfY2hhcltieXRlb3JkZXJdLGZuKSkgPCAwKQorCQkJICAgICAgcmV0dXJuKHJjKTsKKwkJCSAgICBjb3VudCsrOworCQkJfQorCQkJLyogQWx3YXlzIHdyaXRlIGxvdyBieXRlICovCisJCQlpZiAoKHJjID0gcG5ieXRlKChDSEFSKWV1LnhfY2hhclsxLWJ5dGVvcmRlcl0sZm4pKSA8IDApCisJCQkgIHJldHVybihyYyk7CisJCQljb3VudCsrOworCQkJcmV0dXJuKGNvdW50KTsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSBGQ19KSVM3OgkJLyogSklTLTcgKi8KKwkJICBjYXNlIEZDX0pERUM6CQkvKiBERUMgS2FuamkgKi8KKwkJICAgIGV1Lnhfc2hvcnQgPSBzal90b19ldShzai54X3Nob3J0KTsgLyogU2hpZnQtSklTIHRvIEVVQyAqLworCQkgICAgaWYgKGV1Lnhfc2hvcnQgPT0gMHhmZmZmKSB7IC8qIEJhZCAqLworCQkJZGVidWcoRjAwMSwieHBuYnl0ZSBiYWQgZXUiLCIiLGV1Lnhfc2hvcnQpOworCQkJaWYgKChyYyA9IHBuYnl0ZShVTkssZm4pKSA8IDApCisJCQkgIHJldHVybihyYyk7CisJCQlyZXR1cm4oMSk7CisJCSAgICB9IGVsc2UgewkJLyogR29vZCAqLworCQkJaW50IGk7CisJCQkvKiBVc2UgYW5vdGhlciBuYW1lIC0gJ2EnIGhpZGVzIHBhcmFtZXRlciAqLworCQkJLyogSXQncyBPSyBhcyBpcyBidXQgY2F1c2VzIGNvbXBpbGVyIHdhcm5pbmdzICovCisJCQljaGFyIGEgPSBldS54X2NoYXJbMS1ieXRlb3JkZXJdOyAvKiBMb3cgYnl0ZSAqLworCQkJZGVidWcoRjAwMSwieHBuYnl0ZSBldSIsIiIsZXUueF9zaG9ydCk7CisJCQlpZiAoZXUueF9jaGFyW2J5dGVvcmRlcl0gPT0gMCkgeyAvKiBSb21hbiAqLworCQkJICAgIHN3aXRjaCAoanN0YXRlKSB7CisJCQkgICAgICBjYXNlIDE6CS8qIEN1cnJlbnQgc3RhdGUgaXMgS2F0YWthbmEgKi8KKwkJCQlqYnVmWzBdID0gMHgwZjsJLyogU0kgKi8KKwkJCQlqYnVmWzFdID0gYTsKKwkJCQlqeCA9IDI7CisJCQkJYnJlYWs7CisJCQkgICAgICBjYXNlIDI6CS8qIEN1cnJlbnQgc3RhdGUgaXMgS2FuamkgKi8KKwkJCQlqYnVmWzBdID0gMHgxYjsJLyogRVNDICovCisJCQkJamJ1ZlsxXSA9IDB4Mjg7CS8qICggKi8KKwkJCQlqYnVmWzJdID0gMHg0YTsJLyogSiAqLworCQkJCWpidWZbM10gPSBhOworCQkJCWp4ID0gNDsKKwkJCQlicmVhazsKKwkJCSAgICAgIGRlZmF1bHQ6CS8qIEN1cnJlbnQgc3RhdGUgaXMgUm9tYW4gKi8KKwkJCQlqYnVmWzBdID0gYTsKKwkJCQlqeCA9IDE7CisJCQkJYnJlYWs7CisJCQkgICAgfQorCQkJICAgIGpzdGF0ZSA9IDA7CS8qIE5ldyBzdGF0ZSBpcyBSb21hbiAqLworCQkJfSBlbHNlIGlmIChldS54X2NoYXJbYnl0ZW9yZGVyXSA9PSAweDhlKSB7IC8qIEthbmEgKi8KKwkJCSAgICBqeCA9IDA7CisJCQkgICAgc3dpdGNoIChqc3RhdGUpIHsKKwkJCSAgICAgIGNhc2UgMjoJCSAgIC8qIGZyb20gS2FuamkgKi8KKwkJCQlqYnVmW2p4KytdID0gMHgxYjsgLyogRVNDICovCisJCQkJamJ1ZltqeCsrXSA9IDB4Mjg7IC8qICggKi8KKwkJCQlqYnVmW2p4KytdID0gMHg0YTsgLyogSiAqLworCQkJICAgICAgY2FzZSAwOgkJICAgLyogZnJvbSBSb21hbiAqLworCQkJCWpidWZbangrK10gPSAweDBlOyAvKiBTTyAqLworCQkJICAgICAgZGVmYXVsdDoJCSAgIC8qIFN0YXRlIGlzIGFscmVhZHkgS2FuYSovCisJCQkJamJ1ZltqeCsrXSA9IChhICYgMHg3Zik7IC8qIGFuZCB0aGUgY2hhciAqLworCQkJCWJyZWFrOworCQkJICAgIH0KKwkJCSAgICBqc3RhdGUgPSAxOwkvKiBOZXcgc3RhdGUgaXMgS2F0YWthbmEgKi8KKwkJCX0gZWxzZSB7CS8qIEthbmppICovCisJCQkgICAganggPSAwOworCQkJICAgIHN3aXRjaCAoanN0YXRlKSB7CisJCQkgICAgICBjYXNlIDE6CS8qIEN1cnJlbnQgc3RhdGUgaXMgS2F0YWthbmEgKi8KKwkJCQlqYnVmW2p4KytdID0gMHgwZjsgLyogU0kgICovCisJCQkgICAgICBjYXNlIDA6CS8qIEN1cnJlbnQgc3RhdGUgaXMgUm9tYW4gKi8KKwkJCQlqYnVmW2p4KytdID0gMHgxYjsgLyogRVNDICovCisJCQkJamJ1ZltqeCsrXSA9IDB4MjQ7IC8qICQgICAqLworCQkJCWpidWZbangrK10gPSAweDQyOyAvKiBCICAgKi8KKwkJCSAgICAgIGRlZmF1bHQ6CS8qIEN1cnJlbnQgc3RhdGUgaXMgYWxyZWFkeSBLYW5qaSAqLworCQkJCWpidWZbangrK10gPSBldS54X2NoYXJbYnl0ZW9yZGVyXSAmIDB4N2Y7CisJCQkJamJ1ZltqeCsrXSA9IGV1LnhfY2hhclsxLWJ5dGVvcmRlcl0gJiAweDdmOworCQkJCWJyZWFrOworCQkJICAgIH0KKwkJCSAgICBqc3RhdGUgPSAyOwkvKiBTZXQgc3RhdGUgdG8gS2FuamkgKi8KKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCBqeDsgaSsrKSAvKiBPdXRwdXQgdGhlIHJlc3VsdCAqLworCQkJICBpZiAoKHJjID0gcG5ieXRlKGpidWZbaV0sZm4pKSA8IDApCisJCQkgICAgcmV0dXJuKHJjKTsKKwkJCXJldHVybihqeCk7CS8qIFJldHVybiBpdHMgbGVuZ3RoICovCisJCSAgICB9CisJCX0KKyNlbmRpZiAvKiBLQU5KSSAqLworCSAgICB9IGVsc2UgewkJCS8qIE5vIHRyYW5zbGF0aW9uIGZ1bmN0aW9uICovCisJCWludCBjb3VudCA9IDA7CisJCWlmICh1dGZlcnJvcikgeworCQkgICAgaWYgKChyYyA9IHBuYnl0ZSgodWNzb3JkZXIgPyAweGZkIDogMHhmZiksZm4pKSA8IDApCisJCSAgICAgIHJldHVybihyYyk7CisJCSAgICBpZiAoKHJjID0gcG5ieXRlKCh1Y3NvcmRlciA/IDB4ZmYgOiAweGZkKSxmbikpIDwgMCkKKwkJICAgICAgcmV0dXJuKHJjKTsKKwkJICAgIGNvdW50ICs9IDI7CisJCX0KKwkJaWYgKChyYyA9IHBuYnl0ZSh1Yy54X2NoYXJbc3dhcHBpbmddLGZuKSkgPCAwKQorCQkgIHJldHVybihyYyk7CisJCWlmICgocmMgPSBwbmJ5dGUodWMueF9jaGFyWzEtc3dhcHBpbmddLGZuKSkgPCAwKQorCQkgIHJldHVybihyYyk7CisJCWNvdW50ICs9IDI7CisJCXJldHVybihjb3VudCk7CisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsJCQkJLyogQnl0ZSB0byBVbmljb2RlICovCisJaWYgKHh0dSkgewkJCS8qIFRDUy10by1VQ1MgZnVuY3Rpb24gKi8KKwkgICAgaWYgKCgodGNzaW5mb1t0Y3NdLnNpemUgPiAxMjgpICYmICh1Yy54X3Nob3J0ICYgMHg4MCkpIHx8CisJCXRjc2luZm9bdGNzXS5zaXplIDw9IDEyOCkKKwkgICAgICB1Yy54X3Nob3J0ID0gKCp4dHUpKHVjLnhfc2hvcnQpOworCX0KKwlpZiAoZmNzID09IEZDX1VDUzIpIHsJCS8qIEFuZCBGQ1MgaXMgVUNTLTIgKi8KKwkgICAgLyogV3JpdGUgb3V0IHRoZSBieXRlcyBpbiB0aGUgYXBwcm9wcmlhdGUgYnl0ZSBvcmRlciAqLworCSAgICBpZiAob2ZmYyA9PSAwICYmIHVjc2JvbSkgewkvKiBCZWdpbm5pbmcgb2YgZmlsZT8gKi8KKwkJaWYgKChyYyA9IHBuYnl0ZSgodWNzb3JkZXIgPyAweGZmIDogMHhmZSksZm4pKSA8IDApIC8qIEJPTSAqLworCQkgIHJldHVybihyYyk7CisJCWlmICgocmMgPSBwbmJ5dGUoKHVjc29yZGVyID8gMHhmZSA6IDB4ZmYpLGZuKSkgPCAwKQorCQkgIHJldHVybihyYyk7CisJICAgIH0KKwkgICAgaWYgKChyYyA9IHBuYnl0ZSh1Yy54X2NoYXJbc3dhcHBpbmddLGZuKSkgPCAwKQorCSAgICAgIHJldHVybihyYyk7CisJICAgIGlmICgocmMgPSBwbmJ5dGUodWMueF9jaGFyWzEtc3dhcHBpbmddLGZuKSkgPCAwKQorCSAgICAgIHJldHVybihyYyk7CisJICAgIHJldHVybigyKTsKKwl9IGVsc2UgaWYgKGZjcyA9PSBGQ19VVEY4KSB7CS8qIENvbnZlcnQgdG8gVVRGLTggKi8KKwkgICAgQ0hBUiAqIGJ1ZiA9IE5VTEw7CisJICAgIGludCBpLCBjb3VudDsKKwkgICAgaWYgKChjb3VudCA9IHVjczJfdG9fdXRmOCh1Yy54X3Nob3J0LCZidWYpKSA8IDEpCisJICAgICAgcmV0dXJuKC0xKTsKKwkgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJICAgICAgaWYgKChyYyA9IHBuYnl0ZShidWZbaV0sZm4pKSA8IDApCisJCXJldHVybihyYyk7CisJICAgIHJldHVybihjb3VudCk7CisJfSBlbHNlIHsKKwkgICAgZGVidWcoRjEwMCwieHBuYnl0ZSBpbXBvc3NpYmxlIGNvbWJpbmF0aW9uIiwiIiwwKTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisgICAgfQorI2Vsc2UKKyNpZmRlZiBLQU5KSQorLyoKKyAgVGhpcyBhbG1vc3QsIGJ1dCBub3QgcXVpdGUsIGR1cGxpY2F0ZXMgdGhlIEthbmppIHNlY3Rpb24gYWJvdmUuCisgIFRoZXJlIGlzIG5vIGRvdWJ0IGEgd2F5IHRvIGNvbWJpbmUgdGhlIHNlY3Rpb25zIG1vcmUgZWxlZ2FudGx5LAorICBidXQgcHJvYmFibHkgb25seSBhdCB0aGUgZXhwZW5zZSBvZiBhZGRpdGlvbmFsIGV4ZWN1dGlvbiBvdmVyaGVhZC4KKyAgQXMgbWF0dGVycyBzdGFuZCwgYmUgY2FyZWZ1bCB0byByZWZsZWN0IGFueSBjaGFuZ2VzIGluIHRoaXMgc2VjdGlvbgorICB0byB0aGUgb3RoZXIgS2Fuamkgc2VjdGlvbiBhYm92ZS4KKyovCisgICAgaWYgKHRjcyA9PSBUQ19KRVVDKSB7CQkvKiBJbmNvbWluZyBKYXBhbmVzZSBFVUMgKi8KKwlpbnQgY291bnQgPSAwOworCXN3aXRjaCAoZmNzKSB7CQkJLyogRmlsZSBjaGFyYWN0ZXIgc2V0ICovCisJICBjYXNlIEZDX1NISklTOgkJLyogU2hpZnQtSklTIC0tIGp1c3Qgb3V0cHV0IGl0ICovCisJICAgIGlmIChzai54X2NoYXJbYnl0ZW9yZGVyXSkJLyogQnV0IG5vdCBoaWdoIGJ5dGUgaWYgemVybyAqLworCSAgICAgIGlmICgocmMgPSBwbmJ5dGUoKENIQVIpc2oueF9jaGFyW2J5dGVvcmRlcl0sZm4pKSA8IDApCisJCXJldHVybihyYyk7CisJICAgIGNvdW50Kys7CisJICAgIGlmICgocmMgPSBwbmJ5dGUoKENIQVIpc2oueF9jaGFyWzEtYnl0ZW9yZGVyXSxmbikpIDwgMCkKKwkgICAgICByZXR1cm4ocmMpOworCSAgICBjb3VudCsrOworCSAgICByZXR1cm4oY291bnQpOworCSAgY2FzZSBGQ19KRVVDOgkJCS8qIEVVQy1KUCAqLworCSAgICBldS54X3Nob3J0ID0gc2pfdG9fZXUoc2oueF9zaG9ydCk7IC8qIFNoaWZ0LUpJUyB0byBFVUMgKi8KKwkgICAgZGVidWcoRjAwMSwieHBuYnl0ZSBGQ19KRVVDIGV1IiwiIixldS54X3Nob3J0KTsKKwkgICAgaWYgKGV1Lnhfc2hvcnQgPT0gMHhmZmZmKSB7IC8qIEJhZCAqLworCQlpZiAoKHJjID0gcG5ieXRlKFVOSyxmbikpIDwgMCkKKwkJICByZXR1cm4ocmMpOworCQlyZXR1cm4oMSk7CisJICAgIH0gZWxzZSB7CQkJLyogR29vZCAqLworCQlpbnQgY291bnQgPSAwOwkJLyogV3JpdGUgaGlnaCBieXRlIGlmIG5vdCB6ZXJvICovCisJCWlmIChldS54X2NoYXJbYnl0ZW9yZGVyXSkgeworCQkgICAgaWYgKChyYyA9IHBuYnl0ZSgoQ0hBUilldS54X2NoYXJbYnl0ZW9yZGVyXSxmbikpIDwgMCkKKwkJICAgICAgcmV0dXJuKHJjKTsKKwkJICAgIGNvdW50Kys7CisJCX0KKwkJLyogQWx3YXlzIHdyaXRlIGxvdyBieXRlICovCisJCWlmICgocmMgPSBwbmJ5dGUoKENIQVIpZXUueF9jaGFyWzEtYnl0ZW9yZGVyXSxmbikpIDwgMCkKKwkJICByZXR1cm4ocmMpOworCQljb3VudCsrOworCQlyZXR1cm4oY291bnQpOworCSAgICB9CisJICAgIGJyZWFrOworCisJICBjYXNlIEZDX0pJUzc6CQkJLyogSklTLTcgKi8KKwkgIGNhc2UgRkNfSkRFQzoJCQkvKiBERUMgS2FuamkgKi8KKwkgICAgZXUueF9zaG9ydCA9IHNqX3RvX2V1KHNqLnhfc2hvcnQpOyAvKiBTaGlmdC1KSVMgdG8gRVVDICovCisJICAgIGlmIChldS54X3Nob3J0ID09IDB4ZmZmZikgeyAvKiBCYWQgKi8KKwkJZGVidWcoRjAwMSwieHBuYnl0ZSBGQ19KSVM3IGJhZCBldSIsIiIsZXUueF9zaG9ydCk7CisJCWlmICgocmMgPSBwbmJ5dGUoVU5LLGZuKSkgPCAwKQorCQkgIHJldHVybihyYyk7CisJCXJldHVybigxKTsKKwkgICAgfSBlbHNlIHsJCQkvKiBHb29kICovCisJCWludCBpOworCQljaGFyIGEgPSBldS54X2NoYXJbMS1ieXRlb3JkZXJdOyAvKiBMb3cgYnl0ZSAqLworCQlkZWJ1ZyhGMDAxLCJ4cG5ieXRlIEZDX0pJUzcgZXUiLCIiLGV1Lnhfc2hvcnQpOworCQlpZiAoZXUueF9jaGFyW2J5dGVvcmRlcl0gPT0gMCkgeyAvKiBSb21hbiAqLworCQkgICAgc3dpdGNoIChqc3RhdGUpIHsKKwkJICAgICAgY2FzZSAxOgkJLyogQ3VycmVudCBzdGF0ZSBpcyBLYXRha2FuYSAqLworCQkJamJ1ZlswXSA9IDB4MGY7CS8qIFNJICovCisJCQlqYnVmWzFdID0gYTsKKwkJCWp4ID0gMjsKKwkJCWJyZWFrOworCQkgICAgICBjYXNlIDI6CQkvKiBDdXJyZW50IHN0YXRlIGlzIEthbmppICovCisJCQlqYnVmWzBdID0gMHgxYjsJLyogRVNDICovCisJCQlqYnVmWzFdID0gMHgyODsJLyogKCAqLworCQkJamJ1ZlsyXSA9IDB4NGE7CS8qIEogKi8KKwkJCWpidWZbM10gPSBhOworCQkJanggPSA0OworCQkJYnJlYWs7CisJCSAgICAgIGRlZmF1bHQ6CQkvKiBDdXJyZW50IHN0YXRlIGlzIFJvbWFuICovCisJCQlqYnVmWzBdID0gYTsKKwkJCWp4ID0gMTsKKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAganN0YXRlID0gMDsJCS8qIE5ldyBzdGF0ZSBpcyBSb21hbiAqLworCQl9IGVsc2UgaWYgKGV1LnhfY2hhcltieXRlb3JkZXJdID09IDB4OGUpIHsgLyogS2FuYSAqLworCQkgICAganggPSAwOworCQkgICAgc3dpdGNoIChqc3RhdGUpIHsKKwkJICAgICAgY2FzZSAyOgkJICAgLyogZnJvbSBLYW5qaSAqLworCQkJamJ1ZltqeCsrXSA9IDB4MWI7IC8qIEVTQyAqLworCQkJamJ1ZltqeCsrXSA9IDB4Mjg7IC8qICggKi8KKwkJCWpidWZbangrK10gPSAweDRhOyAvKiBKICovCisJCSAgICAgIGNhc2UgMDoJCSAgIC8qIGZyb20gUm9tYW4gKi8KKwkJCWpidWZbangrK10gPSAweDBlOyAvKiBTTyAqLworCQkgICAgICBkZWZhdWx0OgkJICAgLyogU3RhdGUgaXMgYWxyZWFkeSBLYW5hKi8KKwkJCWpidWZbangrK10gPSAoYSAmIDB4N2YpOyAvKiBhbmQgdGhlIGNoYXIgKi8KKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAganN0YXRlID0gMTsJCS8qIE5ldyBzdGF0ZSBpcyBLYXRha2FuYSAqLworCQl9IGVsc2UgewkJLyogS2FuamkgKi8KKwkJICAgIGp4ID0gMDsKKwkJICAgIHN3aXRjaCAoanN0YXRlKSB7CisJCSAgICAgIGNhc2UgMToJCS8qIEN1cnJlbnQgc3RhdGUgaXMgS2F0YWthbmEgKi8KKwkJCWpidWZbangrK10gPSAweDBmOyAvKiBTSSAgKi8KKwkJICAgICAgY2FzZSAwOgkJLyogQ3VycmVudCBzdGF0ZSBpcyBSb21hbiAqLworCQkJamJ1ZltqeCsrXSA9IDB4MWI7IC8qIEVTQyAqLworCQkJamJ1ZltqeCsrXSA9IDB4MjQ7IC8qICQgICAqLworCQkJamJ1ZltqeCsrXSA9IDB4NDI7IC8qIEIgICAqLworCQkgICAgICBkZWZhdWx0OgkJLyogQ3VycmVudCBzdGF0ZSBpcyBhbHJlYWR5IEthbmppICovCisJCQlqYnVmW2p4KytdID0gZXUueF9jaGFyW2J5dGVvcmRlcl0gJiAweDdmOworCQkJamJ1ZltqeCsrXSA9IGV1LnhfY2hhclsxLWJ5dGVvcmRlcl0gJiAweDdmOworCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICBqc3RhdGUgPSAyOwkJLyogU2V0IHN0YXRlIHRvIEthbmppICovCisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGp4OyBpKyspIC8qIE91dHB1dCB0aGUgcmVzdWx0ICovCisJCSAgaWYgKChyYyA9IHBuYnl0ZShqYnVmW2ldLGZuKSkgPCAwKQorCQkgICAgcmV0dXJuKHJjKTsKKwkJcmV0dXJuKGp4KTsJCS8qIFJldHVybiBpdHMgbGVuZ3RoICovCisJICAgIH0KKwkgIGRlZmF1bHQ6CisJICAgIGlmIChzai54X3Nob3J0IDwgMHg4MCkKKwkgICAgICByZXR1cm4oc2oueF9zaG9ydCk7CisJICAgIGVsc2UKKwkgICAgICByZXR1cm4oJz8nKTsKKwl9CisgICAgfQorI2VuZGlmIC8qIEtBTkpJICovCisjZW5kaWYgLyogVU5JQ09ERSAqLworICAgIGRlYnVnKEYxMDAsInhwbmJ5dGUgQkFEIEZBTExUSFJVIiwiIiwwKTsKKyAgICByZXR1cm4oLTEpOworfQorCisjaWZuZGVmIE5PWEZFUgorCisvKiAgRCBFIEMgTyBEIEUgIC0tICBLZXJtaXQgRGF0YS1wYWNrZXQgZGVjb2RlciAgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2RlY29kZShDSEFSICpidWYsIGludCAoKmZuKShjaGFyKSwgaW50IHhsYXRlKQorI2Vsc2UKK2RlY29kZShidWYsZm4seGxhdGUpIHJlZ2lzdGVyIENIQVIgKmJ1ZjsgcmVnaXN0ZXIgaW50ICgqZm4pKCk7IGludCB4bGF0ZTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogZGVjb2RlICovIHsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYSwgYTcsIGE4LCBiODsgLyogVmFyaW91cyBjb3BpZXMgb2YgY3VycmVudCBjaGFyICovCisgICAgaW50IHQ7CQkJCS8qIEludCB2ZXJzaW9uIG9mIGNoYXJhY3RlciAqLworICAgIGludCBzc2ZsZzsJCQkJLyogQ2hhcmFjdGVyIHdhcyBzaW5nbGUtc2hpZnRlZCAqLworICAgIGludCBjY3BmbGc7CQkJCS8qIEZvciBDdHJsLXVucHJlZml4aW5nIHN0YXRzICovCisgICAgaW50IGxlbjsKKyAgICBsb25nIHo7CisgICAgQ0hBUiBjOworLyoKKyAgQ2F0Y2ggdGhlIGNhc2UgaW4gd2hpY2ggd2UgYXJlIGFza2VkIHRvIGRlY29kZSBpbnRvIGEgZmlsZSB0aGF0IGlzIG5vdCBvcGVuLAorICBmb3IgZXhhbXBsZSwgaWYgdGhlIHVzZXIgaW50ZXJydXB0ZWQgdGhlIHRyYW5zZmVyLCBidXQgdGhlIG90aGVyIEtlcm1pdAorICBrZWVwcyBzZW5kaW5nLgorKi8KKyAgICBpZiAoKGN4c2VlbiB8fCBjenNlZW4gfHwgZGlzY2FyZCkgJiYgKGZuID09IHB1dGZpbCkpCisgICAgICByZXR1cm4oMCk7CisKKyNpZmRlZiBDT01NRU5UCisjaWZkZWYgQ0tUVU5JTkcKKyAgICBpZiAoYmluYXJ5ICYmICFwYXJpdHkpCisgICAgICByZXR1cm4oYmRlY29kZShidWYsZm4pKTsKKyNlbmRpZiAvKiBDS1RVTklORyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBkZWJ1ZyhGMTAwLCJERUNPREUiLCIiLDApOworCisgICAgeGRidWYgPSBidWY7CQkJLyogTWFrZSBnbG9iYWwgY29weSBvZiBwb2ludGVyLiAqLworICAgIHJwdCA9IDA7CQkJCS8qIEluaXRpYWxpemUgcmVwZWF0IGNvdW50LiAqLworCisgICAgbGVuID0gcmxuOwkJCQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBmaWVsZCAqLworICAgIHdoaWxlIChsZW4gPiAwKSB7CQkJLyogTG9vcCBmb3IgZWFjaCBieXRlICovCisgICAgICAgIGEgPSAqeGRidWYrKyAmIDB4ZmY7CQkvKiBHZXQgbmV4dCBjaGFyYWN0ZXIgKi8KKwlsZW4tLTsKKwlpZiAoYSA9PSBycHRxICYmIHJwdGZsZykgewkvKiBHb3QgYSByZXBlYXQgcHJlZml4PyAqLworCSAgICBycHQgPSB4dW5jaGFyKCp4ZGJ1ZisrICYgMHhGRik7IC8qIFllcywgZ2V0IHRoZSByZXBlYXQgY291bnQsICovCisJICAgIHJwdG4gKz0gcnB0OworCSAgICBhID0gKnhkYnVmKysgJiAweEZGOwkvKiBhbmQgZ2V0IHRoZSBwcmVmaXhlZCBjaGFyYWN0ZXIuICovCisJICAgIGxlbiAtPSAyOworCX0KKwliOCA9IGxzc3RhdGUgPyAwMjAwIDogMDsJLyogOHRoLWJpdCB2YWx1ZSBmcm9tIFNISUZULVNUQVRFICovCisJaWYgKGVicWZsZyAmJiBhID09IGVicSkgewkvKiBIYXZlIDh0aC1iaXQgcHJlZml4PyAqLworCSAgICBiOCBePSAwMjAwOwkJCS8qIFllcywgaW52ZXJ0IHRoZSA4dGggYml0J3MgdmFsdWUsICovCisJICAgIHNzZmxnID0gMTsJCQkvKiByZW1lbWJlciB3ZSBkaWQgdGhpcywgKi8KKwkgICAgYSA9ICp4ZGJ1ZisrICYgMHhGRjsJLyogYW5kIGdldCB0aGUgcHJlZml4ZWQgY2hhcmFjdGVyLiAqLworCSAgICBsZW4tLTsKKwl9IGVsc2Ugc3NmbGcgPSAwOworCWNjcGZsZyA9IDA7CisJaWYgKGEgPT0gY3RscSkgewkJLyogSWYgY29udHJvbCBwcmVmaXgsICovCisJICAgIGEgID0gKnhkYnVmKysgJiAweEZGOwkvKiBnZXQgaXRzIG9wZXJhbmQgKi8KKwkgICAgbGVuLS07CisJICAgIGE3ID0gYSAmIDB4N0Y7CQkvKiBhbmQgaXRzIGxvdyA3IGJpdHMuICovCisJICAgIGlmICgoYTcgPj0gMDEwMCAmJiBhNyA8PSAwMTM3KSB8fCBhNyA9PSAnPycpIHsgLyogQ29udHJvbGxpZnkgKi8KKwkJYSA9IGN0bChhKTsJCS8qIGlmIGluIGNvbnRyb2wgcmFuZ2UuICovCisJCWE3ID0gYSAmIDB4N0Y7CisJCWNjcGZsZyA9IDE7CQkvKiBOb3RlIHRoYXQgd2UgZGlkIHRoaXMgKi8KKwkJY2NwKys7CQkJLyogQ291bnQgZm9yIHN0YXRzICovCisJICAgIH0KKwl9IGVsc2UgYTcgPSBhICYgMHg3ZjsJCS8qIE5vdCBjb250cm9sIHF1b3RlICovCisJaWYgKGE3IDwgMzIgfHwgYTcgPT0gMTI3KSB7CS8qIENvbnRyb2wgY2hhcmFjdGVyPyAqLworCSAgICBpZiAoIWNjcGZsZykgY2N1Kys7CQkvKiBBIGJhcmUgb25lLCBjb3VudCBpdCAqLworCSAgICBpZiAobHNjYXB1KSB7CQkvKiBJZiBkb2luZyBsb2NraW5nIHNoaWZ0cy4uLiAqLworCQlpZiAobHNzdGF0ZSkJCS8qIElmIFNISUZURUQgKi8KKwkJICBhOCA9IChhICYgfmI4KSAmIDB4RkY7IC8qIEludmVydCBtZWFuaW5nIG9mIDh0aCBiaXQgKi8KKwkJZWxzZQkJCS8qIG90aGVyd2lzZSAqLworCQkgIGE4ID0gYSB8IGI4OwkJLyogT1IgaW4gOHRoIGJpdCAqLworCQkvKiBJZiB3ZSdyZSBub3QgaW4gYSBxdW90ZWQgc2VxdWVuY2UgKi8KKwkJaWYgKCFsc3F1b3RlICYmICghbHNzdGF0ZSB8fCAhc3NmbGcpKSB7CisJCSAgICBpZiAoYTggPT0gRExFKSB7CS8qIENoZWNrIGZvciBETEUgcXVvdGUgKi8KKwkJCWxzcXVvdGUgPSAxOwkvKiBwcmVmaXhlZCBieSBzaW5nbGUgc2hpZnQhICovCisJCQljb250aW51ZTsKKwkJICAgIH0gZWxzZSBpZiAoYTggPT0gU08pIHsgLyogQ2hlY2sgZm9yIFNoaWZ0LU91dCAqLworCQkJbHNzdGF0ZSA9IDE7CS8qIFNISUZULVNUQVRFID0gU0hJRlRFRCAqLworCQkJY29udGludWU7CisJCSAgICB9IGVsc2UgaWYgKGE4ID09IFNJKSB7IC8qIG9yIFNoaWZ0LUluICovCisJCQlsc3N0YXRlID0gMDsJLyogU0hJRlQtU1RBVEUgPSBVTlNISUZURUQgKi8KKwkJCWNvbnRpbnVlOworCQkgICAgfQorCQl9IGVsc2UgbHNxdW90ZSA9IDA7CisJICAgIH0KKwl9CisJYSB8PSBiODsJCQkvKiBPUiBpbiB0aGUgOHRoIGJpdCAqLworCWlmIChycHQgPT0gMCkgcnB0ID0gMTsJCS8qIElmIG5vIHJlcGVhdHMsIHRoZW4gb25lICovCisjaWZuZGVmIE5PQ1NFVFMKKwlpZiAoIWJpbmFyeSkgewkJCS8qIElmIGluIHRleHQgbW9kZSwgKi8KKwkgICAgaWYgKHRjaGFyc2V0ICE9IFRDX1VDUzIpIHsKKwkJaWYgKGZlb2wgJiYgYSA9PSBDUikJLyogQ29udmVydCBDUkxGIHRvIG5ld2xpbmUgY2hhciAqLworCQkgIGNvbnRpbnVlOworCQlpZiAoZmVvbCAmJiBhID09IExGKQorCQkgIGEgPSBmZW9sOworCSAgICB9CisJICAgIGlmICh4bGF0eXBlID09IFhMQV9CWVRFKQkvKiBCeXRlLWZvci1ieXRlIC0gZG8gaXQgbm93ICovCisJICAgICAgaWYgKHhsYXRlICYmIHJ4KSBhID0gKCpyeCkoKENIQVIpIGEpOworICAgIAl9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCS8qIChQV1ApIERlY29kaW5nIHNwZWVkdXAgdmlhIGJ1ZmZlcmVkIG91dHB1dCBhbmQgYSBtYWNyby4uLiAqLworCWlmIChmbiA9PSBwdXRmaWwpIHsKKwkgICAgZm9yICg7IHJwdCA+IDA7IHJwdC0tKSB7CS8qIE91dHB1dCB0aGUgY2hhciBSUFQgdGltZXMgKi8KKyNpZmRlZiBDQUxJQlJBVEUKKwkJaWYgKGNhbGlicmF0ZSkgeworCQkgICAgZmZjKys7CisJCSAgICBjb250aW51ZTsKKwkJfQorI2VuZGlmIC8qIENBTElCUkFURSAqLworCisvKiBOb3RlOiBUaGUgVW5pY29kZSBhbmQgS2Fuamkgc2VjdGlvbnMgY2FuIHByb2JhYmx5IGJlIGNvbWJpbmVkIG5vdzsgKi8KKy8qIHRoZSBVbmljb2RlIG1ldGhvZCAoeHBuYnl0ZSgpKSBjb3ZlcnMgS2FuamkgdG9vLiAqLworCisjaWZkZWYgVU5JQ09ERQorCQlpZiAoIWJpbmFyeSAmJiB4bGF0eXBlID09IFhMQV9VTklDT0RFKQorCQkgIHQgPSB4cG5ieXRlKCh1bnNpZ25lZCkoKHVuc2lnbmVkKWEgJiAweGZmKSwKKwkJCSAgICAgIHRjaGFyc2V0LAorCQkJICAgICAgZmNoYXJzZXQsCisJCQkgICAgICBmbgorCQkJICAgICAgKTsKKwkJZWxzZQorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNpZmRlZiBLQU5KSQorCQlpZiAoIWJpbmFyeSAmJiB0Y2hhcnNldCA9PSBUQ19KRVVDICYmCisJCSAgICBmY2hhcnNldCAhPSBGQ19KRVVDKSB7IC8qIFRyYW5zbGF0aW5nIGZyb20gSi1FVUMgKi8KKwkJICAgIGlmIChmZmMgPT0gMEwpIHhrYW5qZigpOworCQkgICAgaWYgKHhrYW5qaShhLGZuKSA8IDApICAvKiB0byBzb21ldGhpbmcgZWxzZT8gKi8KKwkJICAgICAgcmV0dXJuKC0xKTsKKwkJICAgIGVsc2UgdCA9IDE7CisJCX0gZWxzZQorI2VuZGlmIC8qIEtBTkpJICovCisJCXsKKyNpZmRlZiBPUzIKKwkJICAgICAgaWYgKHhmbGcgJiYgIXJlbWZpbGUpIHsgLyogV3JpdGUgdG8gdmlydHVhbCBzY3JlZW4gKi8KKwkJCSAgY2hhciBfYTsKKwkJCSAgX2EgPSBhICYgZm1hc2s7CisJCQkgIHQgPSBjb25vYyhfYSk7CisJCQkgIGlmICh0IDwgMSkKKwkJCSAgICB0ID0gLTE7CisJCSAgICAgIH0gZWxzZQorI2VuZGlmIC8qIE9TMiAqLworCQkJdCA9IHptY2hvdXQoYSAmIGZtYXNrKTsgLyogem1jaG91dCBpcyBhIG1hY3JvICovCisJCX0KKwkJaWYgKHQgPCAwKSB7CisJCSAgICBkZWJ1ZyhGMTAxLCJkZWNvZGUgd3JpdGUgZXJybm8iLCIiLGVycm5vKTsKKwkJICAgIHJldHVybigtMSk7CisJCX0KKyNpZmRlZiBVTklDT0RFCisJCWlmICh4bGF0eXBlICE9IFhMQV9VTklDT0RFIHx8IGJpbmFyeSkgeworCQkgICAgZmZjKys7CQkvKiBDb3VudCB0aGUgY2hhcmFjdGVyICovCisJCSAgICBpZiAoZG9jcmMgJiYgIXhmbGcgJiYgIXJlbWZpbGUpIHsgLyogVXBkYXRlIGZpbGUgQ1JDICovCisJCQljID0gYTsJCS8qIEZvcmNlIGNvbnZlcnNpb24gdG8gdW5zaWduZWQgY2hhciAqLworCQkJeiA9IGNyYzE2IF4gKGxvbmcpYzsKKwkJCWNyYzE2ID0gKGNyYzE2ID4+IDgpIF4KKwkJCSAgKGNyY3RhWyh6ICYgMHhGMCkgPj4gNF0gXiBjcmN0Ylt6ICYgMHgwRl0pOworCQkgICAgfQorCQl9CisjZW5kaWYgLyogVU5JQ09ERSAqLworCSAgICB9CisJfSBlbHNlIHsJCQkvKiBPdXRwdXQgdG8gc29tZXRoaW5nIGVsc2UuICovCisJICAgIGEgJj0gZm1hc2s7CQkJLyogQXBwbHkgZmlsZSBtYXNrICovCisJICAgIGZvciAoOyBycHQgPiAwOyBycHQtLSkgewkvKiBPdXRwdXQgdGhlIGNoYXIgUlBUIHRpbWVzICovCisjaWZkZWYgQ0FMSUJSQVRFCisJCWlmIChjYWxpYnJhdGUpIHsKKwkJICAgIGZmYysrOworCQkgICAgY29udGludWU7CisJCX0KKyNlbmRpZiAvKiBDQUxJQlJBVEUgKi8KKwkJaWYgKCgqZm4pKChjaGFyKSBhKSA8IDApIHJldHVybigtMSk7IC8qIFNlbmQgdG8gb3V0cHV0IGZ1bmMuICovCisJICAgIH0KKwl9CisjaWZkZWYgQ0tfQ1RSTFoKKwlsYXN0Y2hhciA9IGE7CisjZW5kaWYgLyogQ0tfQ1RSTFogKi8KKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisvKiAgRyBFIFQgUCBLIFQgLS0gRmlsbCBhIHBhY2tldCBkYXRhIGZpZWxkICAqLworCisvKgorICBHZXRzIGNoYXJhY3RlcnMgZnJvbSB0aGUgY3VycmVudCBzb3VyY2UgLS0gZmlsZSBvciBtZW1vcnkgc3RyaW5nLgorICBFbmNvZGVzIHRoZSBkYXRhIGludG8gdGhlIHBhY2tldCwgZmlsbGluZyB0aGUgcGFja2V0IG9wdGltYWxseS4KKyAgU2V0IGZpcnN0ID0gMSB3aGVuIGNhbGxpbmcgZm9yIHRoZSBmaXJzdCB0aW1lIG9uIGEgZ2l2ZW4gaW5wdXQgc3RyZWFtCisgIChzdHJpbmcgb3IgZmlsZSkuCisKKyAgQ2FsbCB3aXRoOgorICAgIGJ1Zm1heCAtLSBjdXJyZW50IHNlbmQtcGFja2V0IHNpemUKKyAgICB4bGF0ZSAgLS0gZmxhZzogMCB0byBza2lwIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24sIDEgdG8gdHJhbnNsYXRlCisKKyAgVXNlcyBnbG9iYWwgdmFyaWFibGVzOgorICAgIHQgICAgIC0tIGN1cnJlbnQgY2hhcmFjdGVyLgorICAgIGZpcnN0IC0tIGZsYWc6IDEgdG8gc3RhcnQgdXAsIDAgZm9yIGlucHV0IGluIHByb2dyZXNzLCAtMSBmb3IgRU9GLgorICAgIG5leHQgIC0tIG5leHQgY2hhcmFjdGVyIChub3QgdXNlZCBhbnkgbW9yZSkuCisgICAgZGF0YSAgLS0gcG9pbnRlciB0byB0aGUgcGFja2V0IGRhdGEgYnVmZmVyLgorICAgIHNpemUgIC0tIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBkYXRhIGJ1ZmZlci4KKyAgICBtZW1zdHIgLSBmbGFnIHRoYXQgaW5wdXQgaXMgY29taW5nIGZyb20gYSBtZW1vcnkgc3RyaW5nIGluc3RlYWQgb2YgYSBmaWxlLgorICAgIG1lbXB0ciAtIHBvaW50ZXIgdG8gc3RyaW5nIGluIG1lbW9yeS4KKyAgICAoKnN4KSgpICBjaGFyYWN0ZXIgc2V0IHRyYW5zbGF0aW9uIGZ1bmN0aW9uCisKKyAgUmV0dXJuczoKKyAgICBUaGUgc2l6ZSBhcyB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24sIGFuZCBhbHNvIHNldHMgZ2xvYmFsICJzaXplIiwKKyAgICBhbmQgZmlsbHMgKGFuZCBudWxsLXRlcm1pbmF0ZXMpIHRoZSBnbG9iYWwgZGF0YSBhcnJheS4KKyAgICBSZXR1cm5zOgorICAgICAgMCBvbiBFT0YuCisgICAgIC0xIG9uIGZhdGFsIChpbnRlcm5hbCkgZXJyb3IuCisgICAgIC0zIG9uIHRpbWVvdXQgKGUuZy4gd2hlbiByZWFkaW5nIGRhdGEgZnJvbSBhIHBpcGUpLgorCisgIFJld3JpdHRlbiBieSBQYXVsIFcuIFBsYWNld2F5IChQV1ApIG9mIE9oaW8gU3RhdGUgVW5pdmVyc2l0eSwgTWFyY2ggMTk4OS4KKyAgSW5jb3Jwb3JhdGVzIG9sZCBnZXRjaHgoKSBhbmQgZW5jb2RlKCkgaW5saW5lIHRvIHJlZHVjZSBmdW5jdGlvbiBjYWxscywKKyAgdXNlcyBidWZmZXJlZCBpbnB1dCBmb3IgbXVjaC1pbXByb3ZlZCBlZmZpY2llbmN5LCBhbmQgY2xlYXJzIHVwIHNvbWUKKyAgY29uZnVzaW9uIHdpdGggbGluZSB0ZXJtaW5hdGlvbiAoQ1JMRiB2cyBMRiB2cyBDUikuCisKKyAgUmV3cml0dGVuIGFnYWluIGJ5IEZyYW5rIGRhIENydXogdG8gaW5jb3Jwb3JhdGUgbG9ja2luZyBzaGlmdCBtZWNoYW5pc20sCisgIE1heSAxOTkxLiAgQW5kIGFnYWluIGluIDE5OTggZm9yIGVmZmljaWVuY3ksIGV0Yywgd2l0aCBhIHNlcGFyYXRlCisgIGJnZXRwa3QoKSBzcGxpdCBvdXQgZm9yIGJpbmFyeS1tb2RlIG5vLXBhcml0eSB0cmFuc2ZlcnMuCisqLworCisvKgorICBOb3RlOiBTZXBhcmF0ZSBLYW5qaSBzdXBwb3J0IGRhdGVzIGZyb20gY2lyY2EgMTk5MSBhbmQgbm93ICgxOTk5KSBjYW4gbW9zdAorICBsaWtlbHkgYmUgY29tYmluZWQgd2l0aCB0aGUgdGhlIFVuaWNvZGUgc3VwcG9ydDogdGhlIHhnbmJ5dGUoKS94cG5ieXRlKCkKKyAgbWVjaGFuaXNtIHdvcmtzIGZvciBib3RoIFVuaWNvZGUgYW5kIEthbmppLgorKi8KKyNpZmRlZiBLQU5KSQoraW50CitrZ2V0ZigKKyNpZmRlZiBDS19BTlNJQworICAgICAgVk9JRAorI2VuZGlmIC8qIENLX0FOU0lDICovCisgICAgICApIHsKKyAgICBpZiAoZnVuY3N0cikKKyAgICAgIHJldHVybigoKmZ1bmNwdHIpKCkpOworICAgIGVsc2UKKyAgICAgIHJldHVybih6bWluY2hhcigpKTsKK30KKworaW50CitrZ2V0bSgKKyNpZmRlZiBDS19BTlNJQworICAgICAgVk9JRAorI2VuZGlmIC8qIENLX0FOU0lDICovCisgICAgICApIHsKKyAgICBpbnQgeDsKKyAgICBpZiAoKHggPSAqbWVtcHRyKyspKSByZXR1cm4oeCk7CisgICAgZWxzZSByZXR1cm4oLTEpOworfQorI2VuZGlmIC8qIEtBTkpJICovCisKKy8qCisgIExvb2thaGVhZCBmdW5jdGlvbiB0byBkZWNpZGUgd2hldGhlciBsb2NraW5nIHNoaWZ0IGlzIHdvcnRoIGl0LiAgTG9va3MgYXQKKyAgdGhlIG5leHQgZm91ciBpbnB1dCBjaGFyYWN0ZXJzIHRvIHNlZSBpZiBhbGwgb2YgdGhlaXIgOHRoIGJpdHMgbWF0Y2ggdGhlCisgIGFyZ3VtZW50LiAgQ2FsbCB3aXRoIDAgb3IgMDIwMC4gIFJldHVybnMgMSBvbiBtYXRjaCwgMCBpZiB0aGV5IGRvbid0IG1hdGNoLgorICBJZiB3ZSBkb24ndCBoYXBwZW4gdG8gaGF2ZSBhdCBsZWFzdCA0IG1vcmUgY2hhcmFjdGVycyB3YWl0aW5nIGluIHRoZSBpbnB1dAorICBidWZmZXIsIHJldHVybnMgMS4gIE5vdGUgdGhhdCB6aW5wdHIgcG9pbnRzIHR3byBjaGFyYWN0ZXJzIGFoZWFkIG9mIHRoZQorICBjdXJyZW50IGNoYXJhY3RlciBiZWNhdXNlIG9mIHJlcGVhdC1jb3VudCBsb29rYWhlYWQuCisqLworaW50Citsc2xvb2soYikgdW5zaWduZWQgaW50IGI7IHsJCS8qIExvY2tpbmcgU2hpZnQgTG9va2FoZWFkICovCisgICAgaW50IGk7CisgICAgaWYgKHppbmNudCA8IDMpCQkJLyogSWYgbm90IGVub3VnaCBjaGFycyBpbiBidWZmZXIsICovCisgICAgICByZXR1cm4oMSk7CQkJLyogZm9yY2Ugc2hpZnQtc3RhdGUgc3dpdGNoLiAqLworICAgIGIgJj0gMDIwMDsJCQkJLyogRm9yY2UgYXJndW1lbnQgdG8gcHJvcGVyIGZvcm0uICovCisgICAgZm9yIChpID0gLTE7IGkgPCAzOyBpKyspCQkvKiBMb29rIGF0IG5leHQgNSBjaGFyYWN0ZXJzIHRvICovCisgICAgICBpZiAoKCgqKHppbnB0citpKSkgJiAwMjAwKSAhPSBiKQkvKiBzZWUgaWYgYWxsIHRoZWlyIDh0aCBiaXRzIG1hdGNoLiAgKi8KKwlyZXR1cm4oMCk7CQkJLyogVGhleSBkb24ndC4gKi8KKyAgICByZXR1cm4oMSk7CQkJCS8qIFRoZXkgZG8uICovCit9CisKKy8qIFJvdXRpbmUgdG8gY29tcHV0ZSBtYXhpbXVtIGRhdGEgbGVuZ3RoIGZvciBwYWNrZXQgdG8gYmUgZmlsbGVkICovCisKK2ludAorbWF4ZGF0YSgpIHsJCQkJLyogR2V0IG1heGltdW0gZGF0YSBsZW5ndGggKi8KKyAgICBpbnQgbiwgbGVuOworICAgIGRlYnVnKEYxMDEsIm1heGRhdGEgc3BzaXogMSIsIiIsc3BzaXopOworICAgIGlmIChzcHNpeiA8IDApCQkJLyogSG93IGNvdWxkIHRoaXMgaGFwcGVuPyAqLworICAgICAgc3BzaXogPSBEU1BTSVo7CisgICAgZGVidWcoRjEwMSwibWF4ZGF0YSBzcHNpeiAyIiwiIixzcHNpeik7CisgICAgbiA9IHNwc2l6IC0gNTsJCQkvKiBTcGFjZSBmb3IgRGF0YSBhbmQgQ2hlY2tzdW0gKi8KKyAgICBpZiAobiA+IDkyICYmIG4gPCA5NikgbiA9IDkyOwkvKiAiU2hvcnQiIExvbmcgcGFja2V0cyBkb24ndCBwYXkgKi8KKyAgICBpZiAobiA+IDkyICYmIGxwY2FwdSA9PSAwKQkJLyogSWYgbG9uZyBwYWNrZXRzIG5lZWRlZCwgKi8KKyAgICAgIG4gPSA5MjsJCQkJLyogbWFrZSBzdXJlIHRoZXkndmUgYmVlbiBuZWdvdGlhdGVkICovCisgICAgbGVuID0gbiAtIGJjdGw7CQkJLyogU3BhY2UgZm9yIGRhdGEgKi8KKyAgICBpZiAobiA+IDkyKSBsZW4gLT0gMzsJCS8qIExvbmcgcGFja2V0IG5lZWRzIGhlYWRlciBjaGtzdW0gKi8KKyAgICBkZWJ1ZyhGMTAxLCJtYXhkYXRhIGxlbiAxIiwiIixsZW4pOworICAgIGlmIChsZW4gPCAwKSBsZW4gPSAxMDsKKyAgICBkZWJ1ZyhGMTAxLCJtYXhkYXRhIGxlbiAyIiwiIixsZW4pOworICAgIHJldHVybihsZW4pOworfQorCitzdGF0aWMgQ0hBUiBsZWZ0b3Zlcls5XSA9IHsgJ1wwJywnXDAnLCdcMCcsJ1wwJywnXDAnLCdcMCcsJ1wwJywnXDAnLCdcMCcgfTsKK3N0YXRpYyBpbnQgbmxlZnQgPSAwOworCisjaWZkZWYgQ0tUVU5JTkcKKy8qCisgIFdoZW4gQ0tUVU5JTkcgaXMgZGVmaW5lZCB3ZSB1c2UgdGhpcyBzcGVjaWFsIHRyaW1tZWQtZG93biB2ZXJzaW9uIG9mIGdldHBrdAorICB0byBzcGVlZCB1cCBiaW5hcnktbW9kZSBuby1wYXJpdHkgdHJhbnNmZXJzLiAgV2hlbiBDS1RVTklORyBpcyBub3QgZGVmaW5lZCwKKyAgb3IgZm9yIHRleHQtbW9kZSBvciBwYXJpdHkgdHJhbnNmZXJzLCB3ZSB1c2UgdGhlIHJlZ3VsYXIgZ2V0cGt0KCkgZnVuY3Rpb24uCisgIENhbGwganVzdCBsaWtlIGdldHBrdCgpIGJ1dCB0ZXN0IGZpcnN0IGZvciB0cmFuc2ZlciBtb2RlIGFuZCBwYXJpdHkuICBOT1RFOgorICBUaGlzIHJvdXRpbmUgaXMgb25seSB0byBiZSBjYWxsZWQgd2hlbiBzZW5kaW5nIGEgcmVhbCBmaWxlIC0tIG5vdCBmb3IKKyAgZmlsZW5hbWVzLCBzZXJ2ZXIgcmVzcG9uc2VzLCBldGMsIGJlY2F1c2UgaXQgb25seSByZWFkcyBmcm9tIHRoZSBpbnB1dCBmaWxlLgorICBTZWUgZ2V0cGt0KCkgZm9yIG1vcmUgZGV0YWlsZWQgY29tbWVudGFyeS4KKyovCitzdGF0aWMgaW50CitiZ2V0cGt0KGJ1Zm1heCkgaW50IGJ1Zm1heDsgeworICAgIHJlZ2lzdGVyIENIQVIgcnQgPSB0LCBybmV4dDsKKyAgICByZWdpc3RlciBDSEFSICpkcCwgKm9kcCwgKnAxLCAqcDI7CisgICAgcmVnaXN0ZXIgaW50IHggPSAwLCBhNzsKKworICAgIENIQVIgeHhyYywgeHhjcTsJCQkvKiBQaWVjZXMgb2YgcHJlZml4ZWQgc2VxdWVuY2UgKi8KKworICAgIGxvbmcgejsJCQkJLyogQSBsb25nIHdvcmtlciAoZm9yIENSQykgKi8KKworICAgIGlmICghYmluYXJ5IHx8IHBhcml0eSB8fCBtZW1zdHIpCS8qIEpVU1QgSU4gQ0FTRSBjYWxsZXIgZGlkbid0IHRlc3QgKi8KKyAgICAgIHJldHVybihnZXRwa3QoYnVmbWF4LCFiaW5hcnkpKTsKKworICAgIGlmICghZGF0YSkgeworCWRlYnVnKEYxMDAsIlNFUklPVVMgRVJST1I6IGJnZXRwa3QgZGF0YSA9PSBOVUxMIiwiIiwwKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICBkcCA9IGRhdGE7CQkJCS8qIFBvaW50IHRvIHBhY2tldCBkYXRhIGJ1ZmZlciAqLworICAgIHNpemUgPSAwOwkJCQkvKiBBbmQgaW5pdGlhbGl6ZSBpdHMgc2l6ZSAqLworICAgIGJ1Zm1heCA9IG1heGRhdGEoKTsJCQkvKiBHZXQgbWF4aW11bSBkYXRhIGxlbmd0aCAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKQorICAgICAgZGVidWcoRjEwMSwiYmdldHBrdCBidWZtYXgiLCIiLGJ1Zm1heCk7CisjZW5kaWYgLyogREVCVUcgKi8KKworICAgIGlmIChmaXJzdCA9PSAxKSB7CQkJLyogSWYgZmlyc3QgY2hhcmFjdGVyIG9mIHRoaXMgZmlsZS4uICovCisJZmZjID0gMEw7CQkJLyogcmVzZXQgZmlsZSBjaGFyYWN0ZXIgY291bnRlciAqLworI2lmZGVmIENPTU1FTlQKKy8qIE1vdmVkIHRvIGJlbG93ICovCisJZmlyc3QgPSAwOwkJCS8qIE5leHQgY2hhcmFjdGVyIHdvbid0IGJlIGZpcnN0ICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCSpsZWZ0b3ZlciA9ICdcMCc7CQkvKiBEaXNjYXJkIGFueSBpbnRlcnJ1cHRlZCBsZWZ0b3ZlcnMgKi8KKwlubGVmdCA9IDA7CisKKwkvKiBHZXQgZmlyc3QgY2hhcmFjdGVyIG9mIGZpbGUgaW50byBydCwgd2F0Y2hpbmcgb3V0IGZvciBudWxsIGZpbGUgKi8KKworI2lmZGVmIENBTElCUkFURQorCWlmIChjYWxpYnJhdGUpIHsKKyNpZmRlZiBOT1JBTkRPTQorCSAgICBydCA9IDE3OworI2Vsc2UKKwkgICAgcnQgPSBjYWxfYVtyYW5kKCkgJiAweGZmXTsKKyNlbmRpZiAvKiBOT1JBTkRPTSAqLworCSAgICBmaXJzdCA9IDA7CisJfSBlbHNlCisjZW5kaWYgLyogQ0FMSUJSQVRFICovCisKKwlpZiAoKHggPSB6bWluY2hhcigpKSA8IDApIHsJLyogRU9GIG9yIGVycm9yICovCisJICAgIGlmICh4ID09IC0zKSB7CQkvKiBUaW1lb3V0LiAqLworCQlzaXplID0gKGRwIC0gZGF0YSk7CisJCWRlYnVnKEYxMDEsImJnZXRwa3QgdGltZW91dCBzaXplIiwiIixzaXplKTsKKwkJcmV0dXJuKChzaXplID09IDApID8geCA6IHNpemUpOworCSAgICB9CisJICAgIGZpcnN0ID0gLTE7CisJICAgIHNpemUgPSAwOworCSAgICBpZiAoeCA9PSAtMikgewkJLyogRXJyb3IgKi8KKwkJZGVidWcoRjEwMCwiYmdldHBrdDogaW5wdXQgZXJyb3IiLCIiLDApOworCQljeHNlZW4gPSAxOwkJLyogSW50ZXJydXB0IHRoZSBmaWxlIHRyYW5zZmVyICovCisJICAgIH0gZWxzZSB7CisJCWRlYnVnKEYxMDAsImJnZXRwa3QgZW1wdHkgZmlsZSIsIiIsMCk7CisJICAgIH0KKwkgICAgcmV0dXJuKDApOworCX0KKwlmaXJzdCA9IDA7CQkJLyogTmV4dCBjaGFyIHdpbGwgbm90IGJlIHRoZSBmaXJzdCAqLworCWZmYysrOwkJCQkvKiBDb3VudCBhIGZpbGUgY2hhcmFjdGVyICovCisJcnQgPSAoQ0hBUikgeDsJCQkvKiBDb252ZXJ0IGludCB0byBjaGFyICovCisJaWYgKGRvY3JjICYmICh3aGF0ICYgV19TRU5EKSkgewkvKiBBY2N1bXVsYXRlIGZpbGUgY3JjICovCisJICAgIHogPSBjcmMxNiBeIChsb25nKXJ0OworCSAgICBjcmMxNiA9IChjcmMxNiA+PiA4KSBeCisJICAgICAgKGNyY3RhWyh6ICYgMHhGMCkgPj4gNF0gXiBjcmN0Ylt6ICYgMHgwRl0pOworCX0KKwlydCAmPSBmbWFzazsJCQkvKiBBcHBseSBTRVQgRklMRSBCWVRFU0laRSBtYXNrICovCisKKyAgICB9IGVsc2UgaWYgKGZpcnN0ID09IC0xICYmIG5sZWZ0ID09IDApIHsgLyogRU9GIGZyb20gbGFzdCB0aW1lICovCisKKyAgICAgICAgcmV0dXJuKHNpemUgPSAwKTsKKyAgICB9CisvKgorICBIZXJlIHdlIGhhbmRsZSBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBlbmNvZGVkIGZvciB0aGUgbGFzdCBwYWNrZXQgYnV0CisgIGRpZCBub3QgZml0LCBhbmQgc28gd2VyZSBzYXZlZCBpbiB0aGUgImxlZnRvdmVyIiBhcnJheS4KKyovCisgICAgaWYgKG5sZWZ0KSB7CisJZm9yIChwMSA9IGxlZnRvdmVyOyBubGVmdCA+IDA7IG5sZWZ0LS0pIC8qIENvcHkgbGVmdG92ZXJzICovCisJICAqZHArKyA9ICpwMSsrOworCSpsZWZ0b3ZlciA9ICdcMCc7CQkvKiBEZWxldGUgbGVmdG92ZXJzICovCisJbmxlZnQgPSAwOworICAgIH0KKyAgICBpZiAoZmlyc3QgPT0gLTEpCQkJLyogSGFuZGxlIEVPRiAqLworICAgICAgcmV0dXJuKHNpemUgPSAoZHAgLSBkYXRhKSk7CisKKy8qIE5vdyBmaWxsIHVwIHRoZSByZXN0IG9mIHRoZSBwYWNrZXQuICovCisKKyAgICBycHQgPSAwOwkJCQkvKiBJbml0aWFsaXplIGNoYXJhY3RlciByZXBlYXQgY291bnQgKi8KKworICAgIHdoaWxlIChmaXJzdCA+IC0xKSB7CQkvKiBVbnRpbCBFT0YuLi4gKi8KKyNpZmRlZiBDQUxJQlJBVEUKKwlpZiAoY2FsaWJyYXRlKSB7CQkvKiBXZSBnZW5lcmF0ZSBvdXIgb3duICJmaWxlIiAqLworCSAgICBpZiAoZmZjID49IGNhbGlicmF0ZSkgewkvKiBFT0YgKi8KKwkJZmlyc3QgPSAtMTsKKwkJZmZjLS07CisJICAgIH0gZWxzZSB7CQkJLyogR2VuZXJhdGUgbmV4dCBjaGFyYWN0ZXIgKi8KKwkJaWYgKGNhbF9qID4gQ0FMX00gKiBmZmMpCisJCSAgY2FsX2ogPSBjYWxfYVtmZmMgJiAweGZmXTsKKwkJeCA9ICh1bnNpZ25lZCljYWxfYVsoY2FsX2ogJiAweGZmKV07CisJCWlmICh4ID09IHJ0KSB4IF49IDI7CisJICAgIH0KKwkgICAgZmZjKys7CisJICAgIGNhbF9qICs9ICh1bnNpZ25lZCBpbnQpKGZmYyArIENBTF9PKTsKKwl9IGVsc2UKKyNlbmRpZiAvKiBDQUxJQlJBVEUgKi8KKwlpZiAoKHggPSB6bWluY2hhcigpKSA8IDApIHsJLyogQ2hlY2sgZm9yIEVPRiAqLworCSAgICBpZiAoeCA9PSAtMykgewkJLyogVGltZW91dC4gKi8KKwkJdCA9IHJ0OworCQlzaXplID0gKGRwLWRhdGEpOworCQlkZWJ1ZyhGMTAxLCJiZ2V0cGt0IHRpbWVvdXQgc2l6ZSIsIiIsc2l6ZSk7CisJCXJldHVybigoc2l6ZSA9PSAwKSA/IHggOiBzaXplKTsKKwkgICAgfQorCSAgICBmaXJzdCA9IC0xOwkJCS8qIEZsYWcgZW9mIGZvciBuZXh0IHRpbWUuICovCisJICAgIGlmICh4ID09IC0yKSBjeHNlZW4gPSAxOwkvKiBJZiBlcnJvciwgY2FuY2VsIHRoaXMgZmlsZS4gKi8KKwl9IGVsc2UgeworCSAgICBmZmMrKzsJCQkvKiBDb3VudCB0aGUgY2hhcmFjdGVyICovCisJICAgIGlmIChkb2NyYyAmJiAod2hhdCAmIFdfU0VORCkpIHsgLyogQWNjdW11bGF0ZSBmaWxlIGNyYyAqLworCQl6ID0gY3JjMTYgXiAobG9uZykoKENIQVIpeCAmIDB4ZmYpOworCQljcmMxNiA9IChjcmMxNiA+PiA4KSBeCisJCSAgKGNyY3RhWyh6ICYgMHhGMCkgPj4gNF0gXiBjcmN0Ylt6ICYgMHgwRl0pOworCSAgICB9CisJfQorCXJuZXh0ID0gKENIQVIpICh4ICYgZm1hc2spOwkvKiBBcHBseSBmaWxlIG1hc2sgKi8KKy8qCisgIEF0IHRoaXMgcG9pbnQsIHRoZSBjaGFyYWN0ZXIgd2UganVzdCByZWFkIGlzIGluIHJuZXh0LAorICBhbmQgdGhlIGNoYXJhY3RlciB3ZSBhcmUgYWJvdXQgdG8gZW5jb2RlIGludG8gdGhlIHBhY2tldCBpcyBpbiBydC4KKyovCisJb2RwID0gZHA7CQkJLyogUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZC4gKi8KKwl4eHJjID0geHhjcSA9IE5VTDsJCS8qIENsZWFyIHRoZXNlLiAqLworLyoKKyAgTm93IGVuY29kZSB0aGUgY2hhcmFjdGVyIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucyB0aGF0IGFyZSBpbiBlZmZlY3Q6CisgICAgY3RscFtdOiB3aGV0aGVyIHRoaXMgY29udHJvbCBjaGFyYWN0ZXIgbmVlZHMgcHJlZml4aW5nLgorICAgIHJwdGZsZzogcmVwZWF0IGNvdW50cyBlbmFibGVkLgorICAgIE90aGVyIG9wdGlvbnMgZG9uJ3QgYXBwbHkgaW4gdGhpcyByb3V0aW5lLgorKi8KKwlpZiAocnB0ZmxnICYmIChydCA9PSBybmV4dCkgJiYgKGZpcnN0ID09IDApKSB7IC8qIEdvdCBhIHJ1bi4uLiAqLworCSAgICBpZiAoKytycHQgPCA5NCkgewkJLyogQmVsb3cgbWF4LCBqdXN0IGNvdW50ICovCisJCWNvbnRpbnVlOwkJLyogZ28gYmFjayBhbmQgZ2V0IGFub3RoZXIgKi8KKwkgICAgfSBlbHNlIGlmIChycHQgPT0gOTQpIHsJLyogUmVhY2hlZCBtYXgsIG11c3QgZHVtcCAqLworCQl4eHJjID0gKENIQVIpIHRvY2hhcihycHQpOyAvKiBQdXQgdGhlIHJlcGVhdCBjb3VudCBoZXJlICovCisJCXJwdG4gKz0gcnB0OwkJLyogQWNjdW11bGF0ZSBpdCBmb3Igc3RhdGlzdGljcyAqLworCQlycHQgPSAwOwkJLyogQW5kIHJlc2V0IGl0ICovCisJICAgIH0KKwl9IGVsc2UgaWYgKHJwdCA+IDApIHsJCS8qIEVuZCBvZiBydW4gKi8KKwkgICAgeHhyYyA9IChDSEFSKXRvY2hhcigrK3JwdCk7IC8qIFRoZSBjb3VudCAqLworCSAgICBycHRuICs9IHJwdDsJCS8qIEZvciBzdGF0cyAqLworCSAgICBycHQgPSAwOwkJCS8qIFJlc2V0IHJlcGVhdCBjb3VudCAqLworCX0KKwlhNyA9IHJ0ICYgMDE3NzsJCQkvKiBHZXQgbG93IDcgYml0cyBvZiBjaGFyYWN0ZXIgKi8KKwlpZiAoCisjaWZkZWYgQ0tfU1BFRUQKKwkgICAgY3RscFsodW5zaWduZWQpKHJ0ICYgMHhmZildCS8qIExvcCBvZmYgYW55ICJzaWduIiBleHRlbnNpb24gKi8KKyNlbHNlCisJICAgIChhNyA8IFNQKSB8fCAoYTcgPT0gREVMKQorI2VuZGlmIC8qIENLX1NQRUVEICovCisJICAgICkgewkJCQkvKiBEbyBjb250cm9sIHByZWZpeGluZyBpZiBuZWNlc3NhcnkgKi8KKwkgICAgeHhjcSA9IG15Y3RscTsJCS8qIFRoZSBwcmVmaXggKi8KKwkgICAgY2NwKys7CQkJLyogQ291bnQgaXQgKi8KKwkgICAgcnQgPSAoQ0hBUikgY3RsKHJ0KTsJLyogVW5jb250cm9sbGlmeSB0aGUgY2hhcmFjdGVyICovCisJfQorI2lmZGVmIENLX1NQRUVECisJZWxzZSBpZiAoKGE3IDwgU1ApIHx8IChhNyA9PSBERUwpKSAvKiBDb3VudCBhbiB1bnByZWZpeGVkIG9uZSAqLworCSAgY2N1Kys7CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKworCWlmIChhNyA9PSBteWN0bHEpCQkvKiBBbHdheXMgcHJlZml4IHRoZSBjb250cm9sIHByZWZpeCAqLworCSAgeHhjcSA9IG15Y3RscTsKKworCWlmICgocnB0ZmxnKSAmJiAoYTcgPT0gcnB0cSkpCS8qIElmIGl0J3MgdGhlIHJlcGVhdCBwcmVmaXgsICovCisJICB4eGNxID0gbXljdGxxOwkJLyogcHJlZml4IGl0IGlmIGRvaW5nIHJlcGVhdCBjb3VudHMgKi8KKworLyogTm93IGNvbnN0cnVjdCB0aGUgcHJlZml4ZWQgc2VxdWVuY2UgKi8KKworCWlmICh4eHJjKSB7CQkJLyogUmVwZWF0IGNvdW50ICovCisjaWZkZWYgQ09NTUVOVAorCSAgICBpZiAoeHhyYyA9PSAoQ0hBUikgJyInICYmICF4eGNxKSB7IC8qIDIgaW4gYSByb3cgJiBub3QgcHJlZml4ZWQgKi8KKwkJKmRwKysgPSBydDsJCS8qIFNvIGp1c3QgZG8gdGhpcyAqLworCSAgICB9IGVsc2UgewkJCS8qIE1vcmUgdGhhbiB0d28gb3IgcHJlZml4ZWQgKi8KKwkJKmRwKysgPSAoQ0hBUikgcnB0cTsgKmRwKysgPSB4eHJjOyAvKiBFbWl0IHJlcGVhdCBzZXF1ZW5jZSAqLworCSAgICB9CisjZWxzZQkJCQkJLyogQ0hFQ0sgVEhJUyAqLworCSAgICBpZiAoeHhyYyA9PSAoQ0hBUikgJyInICYmICF4eGNxKSB7IC8qIDIgaW4gYSByb3cgJiBub3QgcHJlZml4ZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAoZHAgPT0gZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAqZHArKyA9IHJ0OwkJLyogU28ganVzdCBkbyB0aGlzICovCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgqKGRwLTEpID09IHJ0KSB7CisgICAgICAgICAgICAgICAgICAgICpkcCsrID0gKENIQVIpIHJwdHE7CisJCSAgICAqZHArKyA9IHh4cmM7CS8qIEVtaXQgcmVwZWF0IHNlcXVlbmNlICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKmRwKysgPSBydDsJCS8qIFNvIGp1c3QgZG8gdGhpcyAqLworICAgICAgICAgICAgICAgIH0KKwkgICAgfSBlbHNlIHsJCQkvKiBNb3JlIHRoYW4gdHdvIG9yIHByZWZpeGVkICovCisJCSpkcCsrID0gKENIQVIpIHJwdHE7CisJCSpkcCsrID0geHhyYzsJCS8qIEVtaXQgcmVwZWF0IHNlcXVlbmNlICovCisJICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisJfQorCWlmICh4eGNxKSB7ICpkcCsrID0gbXljdGxxOyB9CS8qIENvbnRyb2wgcHJlZml4ICovCisJKmRwKysgPSBydDsJCQkvKiBGaW5hbGx5LCB0aGUgY2hhcmFjdGVyIGl0c2VsZiAqLworCXJ0ID0gcm5leHQ7CQkJLyogTmV4dCBjaGFyYWN0ZXIgaXMgbm93IGN1cnJlbnQuICovCisKKy8qIERvbmUgZW5jb2RpbmcgdGhlIGNoYXJhY3Rlci4gIE5vdyB0YWtlIGNhcmUgb2YgcGFja2V0IGJ1ZmZlciBvdmVyZmxvdy4gKi8KKworCXNpemUgPSBkcCAtIGRhdGE7CQkvKiBIb3cgbWFueSBieXRlcyB3ZSBwdXQgaW4gYnVmZmVyLiAqLworCWlmIChzaXplID49IGJ1Zm1heCkgewkJLyogSWYgdG9vIGJpZywgc2F2ZSBzb21lIGZvciBuZXh0LiAqLworCSAgICAqZHAgPSAnXDAnOwkJCS8qIE1hcmsgdGhlIGVuZC4gKi8KKwkgICAgaWYgKHNpemUgPiBidWZtYXgpIHsJLyogaWYgcGFja2V0IGlzIG92ZXJmdWxsICovCisJCS8qIENvcHkgdGhlIHBhcnQgdGhhdCBkb2Vzbid0IGZpdCBpbnRvIHRoZSBsZWZ0b3ZlciBidWZmZXIsICovCisJCS8qIHRha2luZyBjYXJlIG5vdCB0byBzcGxpdCBhIHByZWZpeGVkIHNlcXVlbmNlLiAqLworCQlpbnQgaTsKKwkJbmxlZnQgPSBkcCAtIG9kcDsKKwkJcDEgPSBsZWZ0b3ZlcjsKKwkJcDIgPSBvZHA7CisJCWZvciAoaSA9IDA7IGkgPCBubGVmdDsgaSsrKQorCQkgICpwMSsrID0gKnAyKys7CisJCXNpemUgPSBvZHAgLSBkYXRhOwkvKiBSZXR1cm4gdHJ1bmNhdGVkIHBhY2tldC4gKi8KKwkJKm9kcCA9ICdcMCc7CQkvKiBNYXJrIHRoZSBuZXcgZW5kICovCisJICAgIH0KKwkgICAgdCA9IHJ0OwkJCS8qIFNhdmUgZm9yIG5leHQgdGltZSAqLworCSAgICByZXR1cm4oc2l6ZSk7CisJfQorICAgIH0JCQkJCS8qIE90aGVyd2lzZSwga2VlcCBmaWxsaW5nLiAqLworICAgIHNpemUgPSBkcCAtIGRhdGE7CQkJLyogRW5kIG9mIGZpbGUgKi8KKyAgICAqZHAgPSAnXDAnOwkJCQkvKiBNYXJrIHRoZSBlbmQgb2YgdGhlIGRhdGEuICovCisgICAgcmV0dXJuKHNpemUpOwkJICAgICAvKiBSZXR1cm4gcGFydGlhbGx5IGZpbGxlZCBsYXN0IHBhY2tldC4gKi8KK30KKyNlbmRpZiAvKiBDS1RVTklORyAqLworCitWT0lECitkb2ZpbGNyYyhjKSBpbnQgYzsgewkJCS8qIEFjY3VtdWxhdGUgZmlsZSBjcmMgKi8KKyAgICBsb25nIHo7CisgICAgeiA9IGNyYzE2IF4gKGxvbmcpYzsKKyAgICBjcmMxNiA9IChjcmMxNiA+PiA4KSBeCisgICAgICAoY3JjdGFbKHogJiAweEYwKSA+PiA0XSBeIGNyY3RiW3ogJiAweDBGXSk7Cit9CisKKy8qIEZvciBTRU5EaW5nIGZyb20gYW4gYXJyYXkuLi4gKi8KKworaW50CithZ25ieXRlKCkgewkJCQkvKiBHZXQgbmV4dCBieXRlIGZyb20gYXJyYXkgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICBjaGFyIGM7CisgICAgc3RhdGljIGludCBzYXZlID0gMDsJCS8qIEZvciBDUkxGICovCisgICAgc3RhdGljIGNoYXIgKiogYXAgPSBOVUxMOwkJLyogQXJyYXkgcG9pbnRlciAqLworICAgIHN0YXRpYyBjaGFyICogcCA9IE5VTEw7CQkvKiBDaGFyYWN0ZXIgcG9pbnRlciAqLworICAgIHN0YXRpYyBpbnQgaSA9IDAsIG4gPSAwOwkJLyogQXJyYXkgaW5kZXggYW5kIGxpbWl0ICovCisgICAgZXh0ZXJuIGludCBhX2RpbVtdOwkJCS8qIEFycmF5IGRpbWVuc2lvbiAqLworCisgICAgaWYgKCFhcCkgewkJCQkvKiBGaXJzdCB0aW1lIHRocnUgKi8KKwlhcCA9IHNuZGFycmF5OwkJCS8qIFNldCB1cCBhcnJheSBwb2ludGVycyAqLworCWlmICghYXAgfHwgKGkgPSBzbmR4bG8pID4gYV9kaW1bc25keGluXSkgeworCSAgICBzbmRhcnJheSA9IE5VTEw7CisJICAgIGFwID0gTlVMTDsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisJcCA9IGFwW2ldOwkJCS8qIFBvaW50IHRvIGZpcnN0IGVsZW1lbnQgaW4gcmFuZ2UgKi8KKwluID0gc25keGhpOwkJCS8qIEluZGV4IG9mIGxhc3QgZWxlbWVudCBpbiByYW5nZSAqLworCWlmIChzbmR4aGkgPiBhX2RpbVtzbmR4aW5dKQkvKiBBZGp1c3QgaWYgbmVjZXNzYXJ5ICovCisJICBuID0gYV9kaW1bc25keGluXTsKKyAgICB9CisgICAgaWYgKHNhdmUpIHsJCQkJLyogSWYgYW55dGhpbmcgc2F2ZWQgKi8KKwljID0gc2F2ZTsJCQkvKiB1bnNhdmUgaXQgKi8KKwlzYXZlID0gMDsJCQkvKiBhbmQgcmV0dXJuIGl0ICovCisJcmV0dXJuKGMgJiAweGZmKTsKKyAgICB9CisgICAgaWYgKGkgPiBuKSB7CQkJLyogTm8gbW9yZSBlbGVtZW50cyAqLworCXNuZGFycmF5ID0gTlVMTDsKKwlhcCA9IE5VTEw7CisJcmV0dXJuKC0xKTsKKyAgICB9CisgICAgaWYgKCFwKQkJCQkvKiBTb3VyY2UgcG9pbnRlciBpcyBOVUxMICovCisgICAgICBjID0gTlVMOwkJCQkvKiB0aGlzIG1lYW5zIGFuIGVtcHR5IGxpbmUgKi8KKyAgICBlbHNlCQkJCS8qIFNvdXJjZSBwb2ludGVyIG5vdCBOVUxMICovCisgICAgICBjID0gKnArKzsJCQkJLyogTmV4dCBjaGFyICovCisgICAgaWYgKCFjKSB7CQkJCS8qIENoYXIgaXMgZW1wdHk/ICovCisJaWYgKCFiaW5hcnkpIHsJCQkvKiBUZXh0OiBlbmQgb2YgbGluZS4gKi8KKwkgICAgaWYgKGZlb2wpIHsJCQkvKiBTdXBwbHkgTkwgKi8KKwkJYyA9IGZlb2w7CisJICAgIH0gZWxzZSB7CQkJLyogb3IgQ1JMRiAqLworCQlzYXZlID0gTEY7CisJCWMgPSBDUjsKKwkgICAgfQorCSAgICBwID0gYXBbKytpXTsKKwkgICAgcmV0dXJuKGMgJiAweGZmKTsKKwl9CisJd2hpbGUgKGkrKyA8IG4pIHsJCS8qIEJpbmFyeSAtIGdldCBuZXh0IGVsZW1lbnQgKi8KKwkgICAgcCA9IGFwW2ldOworCSAgICBpZiAoIXApCQkJLyogRW1wdHkgbGluZT8gKi8KKwkgICAgICBjb250aW51ZTsJCQkvKiBJZ25vcmUgaXQgYW5kIGdldCBhbm90aGVyICovCisJICAgIGMgPSAqcCsrOwkJCS8qIEdldCBuZXh0IGNoYXIgKi8KKwkgICAgaWYgKCFjKQkJCS8qIEVtdHB5IGNoYXI/ICovCisJICAgICAgY29udGludWU7CQkJLyogSWdub3JlIGl0IGFuZCBnZXQgYW5vdGhlciAqLworCSAgICByZXR1cm4oYyAmIDB4ZmYpOwkJLyogTm90IGVtcHR5IC0gcmV0dXJuIGl0ICovCisJfQorCXNuZGFycmF5ID0gTlVMTDsKKwlhcCA9IE5VTEw7CisJcmV0dXJuKC0xKTsJCQkvKiBEb25lICovCisgICAgfQorICAgIHJldHVybihjICYgMHhmZik7CQkJLyogQ2hhciBpcyBub3QgZW1wdHkgKi8KKyNlbHNlCisgICAgc25kYXJyYXkgPSBOVUxMOworICAgIHJldHVybigtMSk7CisjZW5kaWYgLyogTk9TUEwgKi8KK30KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT0NTRVRTCitzdGF0aWMgQ0hBUiB4bGFidWZbMzJdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CitzdGF0aWMgaW50IHhsYWNvdW50ID0gMDsKK3N0YXRpYyBpbnQgeGxhcHRyID0gMDsKKy8qIHN0YXRpYyBVU0hPUlQgbGFzdHVjczIgPSAwOyAqLworCisvKgorICBYIEcgTiBCIFkgVCBFIC0tICBHZXQgbmV4dCB0cmFuc2xhdGVkIGJ5dGUgZnJvbSB0aGUgaW5wdXQgZmlsZS4KKworICBSZXR1cm5zIHRoZSBuZXh0IGJ5dGUgdGhhdCBpcyB0byBiZSBwdXQgaW50byB0aGUgcGFja2V0LCBhbHJlYWR5IHRyYW5zbGF0ZWQuCisgIFRoaXMgaXNvbGF0ZXMgZ2V0cGt0KCkgZnJvbSBoYXZpbmcgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0cmFuc2xhdGlvbiwKKyAgc2luZ2xlLSB2cyBtdWx0aWJ5dGUgY2hhcmFjdGVyIHNldHMsIG9uZS10by1tYW55IHZzIG1hbnktdG8tb25lLCBldGMsIGJ1dCBpdAorICBoYXMgcmF0aGVyIGhpZ2ggb3ZlcmhlYWQsIHNvIGRvbid0IGNhbGwgaXQgdW5sZXNzIHlvdSBrbm93IHRyYW5zbGF0aW9uIGlzCisgIG5lZWRlZCB0byBvciBmcm9tIFVuaWNvZGUsIEphcGFuZXNlLCBvciBvdGhlciBtdWx0aWJ5dGUgY2hhcmFjdGVyIHNldC4KKworICBDYWxsIHdpdGg6CisgICAgZmNzOiAgRmlsZSBjaGFyYWN0ZXIgc2V0IChzb3VyY2UsIGZpbGUgd2UgYXJlIHJlYWRpbmcgZnJvbSkKKyAgICB0Y3M6ICBUYXJnZXQgY2hhcmFjdGVyIHNldCAodXNlIGFuIEZDX3h4eCBjb2RlLCBub3QgYSBUQ194eHggY29kZSkKKyAgUmV0dXJuczoKKyAgICA+PSAwOiBBIHRyYW5zbGF0ZWQgYnl0ZSBzdWl0YWJsZSBmb3Igd3JpdGluZy4KKyAgICA8ICAwOiBGYXRhbCBlcnJvciAoc3VjaCBhcyBFT0Ygb24gaW5wdXQgc291cmNlKS4KKyAgQXMgb2YgU2F0IFNlcCAgNyAxODozNzo0MSAyMDAyOiAgCisgICAgV2hlbiB0aGUgb3V0cHV0IGNoYXJhY3Rlci1zZXQgaXMgVUNTLTIsIGJ5dGVzIGFyZSBBTFdBWVMgcmV0dXJuZWQgaW4KKyAgICBiaWctZW5kaWFuIG9yZGVyIChwcmV2aW91c2x5IHRoZXkgY291bGQgYWxzbyBiZSByZXR1cm5lZCBpbiBMRSBvcmRlcgorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgd2hpY2ggd2FzIGp1c3Qgd2F5IHRvbyBjb25mdXNpbmcpLgorKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCit4Z25ieXRlKGludCB0Y3MsIGludCBmY3MsIGludCAoKmZuKSh2b2lkKSkKKyNlbHNlIC8qIENLX0FOU0lDICovCit4Z25ieXRlKHRjcyxmY3MsZm4pIGludCB0Y3MsIGZjcywgKCpmbikoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogeGduYnl0ZSAqLyB7CisgICAgX1BST1RPVFlQKCBpbnQgKCp4eCksIChVU0hPUlQpICkgPSBOVUxMOworICAgIGludCBoYXZldWMgPSAwOwkJCS8qIEZsYWcgZm9yIGhhdmUgVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyNpZmRlZiBLQU5KSQorICAgIGludCBoYXZlc2ogPSAwOwkJCS8qIEhhdmUgU2hpZnQtSklTIGNoYXJhY3RlciAqLworICAgIGludCBoYXZlZXUgPSAwOwkJCS8qIEhhdmUgRVVDLUpQIGNoYXJhY3RlciAqLworI2VuZGlmIC8qIEtBTkpJICovCisgICAgaW50IHJjID0gLTEsIHggPSAwLCBmbGFnID0gMDsKKyAgICBpbnQgdXRmZXJyb3IgPSAwOworICAgIGludCBlb2xmbGFnID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgeGMsIHRoaXNjaGFyOworICAgIHN0YXRpYyBpbnQgc3dhcHBpbmcgPSAwOworICAgIENIQVIgcnQ7CisgICAgLyogVVNIT1JUIGNoOyAqLworI2lmZGVmIFVOSUNPREUKKyAgICB1bmlvbiBja19zaG9ydCB1YzsKKyNlbmRpZiAvKiBVTklDT0RFICovCisjaWZkZWYgS0FOSkkKKyAgICB1bmlvbiBja19zaG9ydCBzaiwgZXU7CQkvKiBTaGlmdC1KSVMgY2hhcmFjdGVyICovCisjZW5kaWYgLyogS0FOSkkgKi8KKworI2lmZGVmIEtBTkpJCisgICAgc2oueF9zaG9ydCA9IDA7CisjZW5kaWYgLyogS0FOSkkgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyAmJiBmZmMgPT0gMCkgeworCWRlYnVnKEYxMDEsInhnbmJ5dGUgaW5pdGlhbCBzd2FwIiwiIixzd2FwcGluZyk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyAgICBpZiAoeGxhY291bnQtLSA+IDApIHsJCS8qIFdlIGFscmVhZHkgaGF2ZSBzb21lICovCisJeCA9IHhsYWJ1Zlt4bGFwdHIrK107CisJZGVidWcoRjAwMSwieGduYnl0ZSBmcm9tIGJ1ZiIsIiIseCk7CisJcmV0dXJuKHgpOworICAgIH0KKyAgICBpZiAoeGxhdHlwZSAhPSBYTEFfTk9ORSkgewkJLyogTm90IG5vdCB0cmFuc2xhdGluZy4uLiAqLworCWhhdmV1YyA9IDA7CisjaWZkZWYgVU5JQ09ERQorCWlmIChmY3MgPT0gRkNfVUNTMikgewkJLyogVUNTLTI6IFJlYWQgdHdvIGJ5dGVzICovCisJICAgIGlmIChmZmMgPT0gMCkJCS8qIEJlZ2lubmluZyBvZiBmaWxlPyAqLworCSAgICAgIHN3YXBwaW5nID0gMDsJCS8qIFJlc2V0IGJ5dGUtc3dhcHBpbmcgZmxhZyAqLworCSAgICB1Yy54X3Nob3J0ID0gMDsKKwkgIGJvbXNraXA6CisJICAgIHggPSBmbiA/ICgqZm4pKCkgOiB6bWluY2hhcigpOyAvKiBHZXQgZmlyc3QgYnl0ZSAqLworCSAgICBkZWJ1ZyhGMDAxLCJ6bWluY2hhciBzd2FwcGluZyIsIiIsc3dhcHBpbmcpOworCSAgICBkZWJ1ZyhGMDAxLCJ6bWluY2hhciBDMCIsIiIseCk7CisJICAgIGZsYWcgPSAxOwkJCS8qIFJlbWVtYmVyIHdlIGNhbGxlZCB6bWluY2hhcigpICovCisJICAgIGlmICh4ID4gLTEpIHsJCS8qIERpZG4ndCBmYWlsICovCisJCWZmYysrOwkJCS8qIENvdW50IGEgZmlsZSBieXRlICovCisJCXVjLnhfY2hhcltzd2FwcGluZ10gPSB4ICYgMHhmZjsKKyNpZm5kZWYgTk9YRkVSCisJCWlmIChkb2NyYyAmJiAod2hhdCAmIFdfU0VORCkpCisJCSAgZG9maWxjcmMoeCk7CisjZW5kaWYgLyogTk9YRkVSICovCisJCXggPSBmbiA/ICgqZm4pKCkgOiB6bWluY2hhcigpOyAvKiBHZXQgc2Vjb25kIGJ5dGUgKi8KKwkJaWYgKHggPiAtMSkgewkJLyogSWYgZGlkbid0IGZhaWwgKi8KKwkJICAgIGRlYnVnKEYwMDEsInptaW5jaGFyIEMxIiwiIix4KTsKKwkJICAgIGZmYysrOwkJLyogY291bnQgYW5vdGhlciBmaWxlIGJ5dGUgKi8KKwkJICAgIHVjLnhfY2hhclsxLXN3YXBwaW5nXSA9IHggJiAweGZmOworCQkgICAgaGF2ZXVjID0gMTsJCS8qIEFuZCByZW1lbWJlciB3ZSBoYXZlIFVuaWNvZGUgKi8KKyNpZm5kZWYgTk9YRkVSCisJCSAgICBpZiAoZG9jcmMgJiYgKHdoYXQgJiBXX1NFTkQpKQorCQkgICAgICBkb2ZpbGNyYyh4KTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKwkJICAgIGlmIChmZmMgPT0gMikgewkvKiBTZWNvbmQgY2hhciBvZiBmaWxlICovCisJCQlkZWJ1ZyhGMDAxLCJ4Z25ieXRlIDFzdCBVQ1MyIiwiIix1Yy54X3Nob3J0KTsKKwkJCWRlYnVnKEYxMTEsInhnbmJ5dGUgZmlsZW9yZGVyIiwiQSIsZmlsZW9yZGVyKTsKKwkJCWlmIChmaWxlb3JkZXIgPCAwKSAvKiBCeXRlIG9yZGVyIG9mIHRoaXMgZmlsZSAqLworCQkJICBmaWxlb3JkZXIgPSB1Y3NvcmRlcjsJLyogRGVmYXVsdCBpcyB1Y3NvcmRlciAqLworCQkJaWYgKGZpbGVvcmRlciA+IDEpCisJCQkgIGZpbGVvcmRlciA9IDE7CisJCQlkZWJ1ZyhGMTExLCJ4Z25ieXRlIGZpbGVvcmRlciIsIkIiLGZpbGVvcmRlcik7CisJCQlpZiAodWMueF9zaG9ydCA9PSAoVVNIT1JUKTB4ZmVmZikgeworCQkJICAgIHN3YXBwaW5nID0gMDsKKwkJCSAgICBkZWJ1ZyhGMTAxLAorCQkJCSAgInhnbmJ5dGUgVUNTMiBnb29kYm9tIHN3YXAiLCIiLHN3YXBwaW5nKTsKKwkJCSAgICBmaWxlb3JkZXIgPSBieXRlb3JkZXI7IC8qIE5vdGU6IE5PVCAwICovCisJCQkgICAgZ290byBib21za2lwOworCQkJfSBlbHNlIGlmICh1Yy54X3Nob3J0ID09IChVU0hPUlQpMHhmZmZlKSB7CisJCQkgICAgc3dhcHBpbmcgPSAxOworCQkJICAgIGRlYnVnKEYxMDEsCisJCQkJICAieGduYnl0ZSBVQ1MyIGJhZGJvbSBzd2FwIiwiIixzd2FwcGluZyk7CisJCQkgICAgZmlsZW9yZGVyID0gKDEgLSBieXRlb3JkZXIpOyAvKiBOb3RlOiBOT1QgMSAqLworCQkJICAgIGdvdG8gYm9tc2tpcDsKKwkJCX0gZWxzZSBpZiAoKGJ5dGVvcmRlciAmJiAhZmlsZW9yZGVyKSB8fCAvKiBObyBCT00gKi8KKwkJCQkgICAoIWJ5dGVvcmRlciAmJiBmaWxlb3JkZXIgPiAwKSkgeworCQkJICAgIC8qIGZpbGVvcmRlciBtaWdodCBoYXZlIGJlZW4gc2V0IGJ5IHNjYW5maWxlKCkgKi8KKwkJCSAgICBDSEFSIGM7CisJCQkgICAgYyA9IHVjLnhfY2hhclswXTsKKwkJCSAgICB1Yy54X2NoYXJbMF0gPSB1Yy54X2NoYXJbMV07CisJCQkgICAgdWMueF9jaGFyWzFdID0gYzsKKwkJCSAgICBzd2FwcGluZyA9IDE7CisJCQkgICAgZGVidWcoRjExMSwieGduYnl0ZSBVQ1MyIG5vQk9NIHN3YXAiLCJBIixzd2FwcGluZyk7CisJCQl9IGVsc2UgeworCQkJICAgIHN3YXBwaW5nID0gMDsKKwkJCSAgICBkZWJ1ZyhGMTExLCJ4Z25ieXRlIFVDUzIgbm9CT00gc3dhcCIsIkIiLHN3YXBwaW5nKTsKKwkJCX0KKwkJCWRlYnVnKEYxMTEsInhnbmJ5dGUgZmlsZW9yZGVyIiwiQyIsZmlsZW9yZGVyKTsKKwkJICAgIH0KKwkJfSBlbHNlCisJCSAgcmV0dXJuKHgpOworCSAgICB9IGVsc2UKKwkgICAgICByZXR1cm4oeCk7CisJICAgIGRlYnVnKEYwMDEsInhnbmJ5dGUgVUNTMiIsIiIsdWMueF9zaG9ydCk7CisKKwl9IGVsc2UgaWYgKGZjcyA9PSBGQ19VVEY4KSB7CS8qIEZpbGUgaXMgVVRGLTggKi8KKwkgICAgQ0hBUiBjaCA9IDA7CQkvKiBEYXRhIHR5cGVzIG5lZWRlZCBmb3IgQVBJLi4uICovCisJICAgIFVTSE9SVCAqIHVzID0gTlVMTDsKKwkgICAgdWMueF9zaG9ydCA9IDA7CisJICAgIGZsYWcgPSAxOwkJCS8qIFdlICh3aWxsKSBoYXZlIGNhbGxlZCB6bWluY2hhcigpICovCisJICAgIC8qIFJlYWQgc291cmNlIGJ5dGVzICovCisJICAgIHdoaWxlICgoeCA9IGZuID8gKCpmbikoKSA6IHptaW5jaGFyKCkpID4gLTEpIHsKKwkJZmZjKys7CQkJLyogR290IGEgYnl0ZSAtIGNvdW50IGl0ICovCisjaWZuZGVmIE5PWEZFUgorCQlpZiAoZG9jcmMgJiYgKHdoYXQgJiBXX1NFTkQpKQorCQkgIGRvZmlsY3JjKHgpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCQljaCA9IHg7CisJCXJjID0gdXRmOF90b191Y3MyKGNoLCZ1cyk7IC8qIENvbnZlcnQgdG8gVUNTLTIgKi8KKwkJaWYgKHJjID09IDApIHsJCS8qIERvbmUgKi8KKwkJICAgIHVjLnhfc2hvcnQgPSAqdXM7CisJCSAgICBoYXZldWMgPSAxOworCQkgICAgYnJlYWs7CisJCX0gZWxzZSBpZiAocmMgPCAwKSB7CS8qIEVycm9yICovCisJCSAgICB1dGZlcnJvciA9IDE7CisJCSAgICBkZWJ1ZyhGMTAxLCJ4Z25ieXRlIFVURi04IGlucHV0IGVycm9yIiwiIixyYyk7CisJCSAgICBoYXZldWMgPSAxOworCQkgICAgdWMueF9zaG9ydCA9ICp1czsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwkgICAgaWYgKHggPCAwKQorCSAgICAgIHJldHVybih4KTsKKwkgICAgZGVidWcoRjAwMSwieGduYnl0ZSBVVEY4LT5VQ1MyIiwiIix1Yy54X3Nob3J0KTsKKwl9CisjZW5kaWYgLyogVU5JQ09ERSAqLworCisjaWZkZWYgS0FOSkkKKyNpZmRlZiBVTklDT0RFCisJZWxzZQorI2VuZGlmIC8qIFVOSUNPREUgKi8KKwkgIGlmIChmY3NpbmZvW2Zjc10uYWxwaGFiZXQgPT0gQUxfSkFQQU4pIHsgLyogSmFwYW5lc2Ugc291cmNlIGZpbGUgKi8KKwkgICAgaW50IGM3LCB4LCB5OworCSAgICBpZiAoZmNzID09IEZDX0pJUzcpIHsJLyogSWYgZmlsZSBjaGFyc2V0IGlzIEpJUy03ICovCisJCWlmIChmZmMgPT0gMEwpCQkvKiBJZiBmaXJzdCBieXRlIG9mIGZpbGUgKi8KKwkJICBqN2luaXQoKTsJCS8qIEluaXRpYWxpemUgSklTLTcgcGFyc2VyICovCisJCXggPSBnZXRqNygpOwkJLyogR2V0IGEgSklTLTcgYnl0ZSAqLworCSAgICB9IGVsc2UJCQkvKiBPdGhlcndpc2UgKi8KKwkgICAgICB4ID0gZm4gPyAoKmZuKSgpIDogem1pbmNoYXIoKTsgLyogSnVzdCBnZXQgYnl0ZSAqLworCSAgICBpZiAoeCA8IDApIHsJCS8qIFByb3BvZ2F0ZSBFT0Ygb3IgZXJyb3IgKi8KKwkJZGVidWcoRjEwMCwiWEdOQllURSBFT0YiLCIiLDApOworCQlyZXR1cm4oeCk7CisJICAgIH0KKwkgICAgZGVidWcoRjAwMSwiWEdOQllURSB4IiwiIix4KTsKKwkgICAgZmZjKys7CQkJLyogQ291bnQgKi8KKyNpZm5kZWYgTk9YRkVSCisJICAgIGlmIChkb2NyYyAmJiAod2hhdCAmIFdfU0VORCkpIGRvZmlsY3JjKHgpOyAvKiBEbyBDUkMgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKwkgICAgc3dpdGNoIChmY3MpIHsJCS8qIFdoYXQgbmV4dCBkZXBlbmRzIG9uIGNoYXJzZXQgKi8KKwkgICAgICBjYXNlIEZDX1NISklTOgkJLyogU2hpZnQtSklTICovCisJCWlmICgoeCA8PSAweDgwKSB8fAkvKiBBbnkgNy1iaXQgY2hhci4uLiAqLworCQkgICAgKHggPj0gMHhhMCAmJiB4IDw9IDB4ZGYpKSB7IC8qIG9yIGhhbGZ3aWR0aCBLYXRha2FuYSAqLworCQkgICAgc2oueF9zaG9ydCA9IChVU0hPUlQpIHg7ICAgIC8qIHdlIHJlYWQgb25lIGJ5dGUuICovCisJCX0gZWxzZSB7CQkvKiBBbnl0aGluZyBlbHNlICovCisJCSAgICBpZiAoKHkgPSBmbiA/ICgqZm4pKCkgOiB6bWluY2hhcigpKSA8IDApIC8qIGdldCBhbm90aGVyICovCisJCSAgICAgIHJldHVybih5KTsKKyNpZm5kZWYgTk9YRkVSCisJCSAgICBpZiAoZG9jcmMgJiYgKHdoYXQgJiBXX1NFTkQpKSBkb2ZpbGNyYyh5KTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKwkJICAgIGZmYysrOworCQkgICAgc2oueF9jaGFyW2J5dGVvcmRlcl0gPSAoQ0hBUikgeDsKKwkJICAgIHNqLnhfY2hhclsxLWJ5dGVvcmRlcl0gPSAoQ0hBUikgeTsKKwkJfQorCQlicmVhazsKKworCSAgICAgIGNhc2UgRkNfSklTNzoJCS8qIEpJUy03ICovCisJICAgICAgY2FzZSBGQ19KREVDOgkJLyogREVDIEthbmppICovCisJICAgICAgY2FzZSBGQ19KRVVDOgkJLyogRVVDLUpQICovCisJCWlmICgoeCAmIDB4ODApID09IDApIHsJLyogQ29udmVydCB0byBTaGlmdC1KSVMgKi8KKwkJICAgIHNqLnhfc2hvcnQgPSAoVVNIT1JUKSB4OyAvKiBDMCBvciBHMDogb25lIGJ5dGUgKi8KKwkJICAgIGV1Lnhfc2hvcnQgPSAoVVNIT1JUKSB4OworCQkgICAgaGF2ZWV1ID0gMTsKKwkJfSBlbHNlIHsKKwkJICAgIGM3ID0geCAmIDB4N2Y7CisJCSAgICBpZiAoYzcgPiAweDIwICYmIGM3IDwgMHg3ZikgeyAvKiBLYW5qaTogdHdvIGJ5dGVzICovCisJCQlpZiAoKHkgPSAoZmNzID09IEZDX0pFVUMpID8KKwkJCSAgICAgKGZuID8gKCpmbikoKSA6IHptaW5jaGFyKCkpIDoKKwkJCSAgICAgZ2V0ajcoKQkvKiBeXl4gKi8KKwkJCSAgICAgKSA8IDApCisJCQkgIHJldHVybih5KTsKKwkJCWZmYysrOworI2lmbmRlZiBOT1hGRVIKKwkJCWlmIChkb2NyYyAmJiAod2hhdCAmIFdfU0VORCkpIGRvZmlsY3JjKHkpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCQkJZXUueF9jaGFyW2J5dGVvcmRlcl0gPSAoQ0hBUikgeDsKKwkJCWV1LnhfY2hhclsxLWJ5dGVvcmRlcl0gPSAoQ0hBUikgeTsKKwkJCXNqLnhfc2hvcnQgPSBldV90b19zaihldS54X3Nob3J0KTsKKwkJCWhhdmVldSA9IDE7CisJCSAgICB9IGVsc2UgaWYgKHggPT0gMHg4ZSkgeyAvKiBTUzIgS2F0YWthbmEgcHJlZml4OiAyIGJ5dGVzICovCisJCQlpZiAoKHkgPSAoZmNzID09IEZDX0pJUzcpID8KKwkJCSAgICAgZ2V0ajcoKSA6CS8qIF5eXiAqLworCQkJICAgICAoZm4gPyAoKmZuKSgpIDogem1pbmNoYXIoKSkKKwkJCSAgICAgKSA8IDApCisJCQkgIHJldHVybih5KTsKKwkJCWZmYysrOworI2lmbmRlZiBOT1hGRVIKKwkJCWlmIChkb2NyYyAmJiAod2hhdCAmIFdfU0VORCkpIGRvZmlsY3JjKHkpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCQkJc2oueF9zaG9ydCA9IHkgfCAweDgwOworCQkJZGVidWcoRjAwMSwiWEdOQllURSBLQU5BIFNKIiwiIixzai54X3Nob3J0KTsKKwkJICAgIH0gZWxzZSB7CisJCQkvKiBTb21ldGhpbmcgdGhhdCB0cmFuc2xhdGVzIHRvIFUrRkZGRCAqLworCQkJc2oueF9zaG9ydCA9IFVOS1NKSVM7CisJCSAgICB9CisJCX0KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaGF2ZXNqID0gMTsJCQkvKiBIYXZlIFNoaWZ0LUpJUyAqLworI2lmZGVmIFVOSUNPREUKKwkgICAgdWMueF9zaG9ydCA9IHNqX3RvX3VuKHNqLnhfc2hvcnQpOyAvKiBUcmFuc2xhdGUgdG8gVUNTLTIgKi8KKwkgICAgaGF2ZXVjID0gMTsJCQkvKiBIYXZlIFVuaWNvZGUgKi8KKyNlbmRpZiAvKiBVTklDT0RFICovCisJICAgIGZsYWcgPSAxOwkJCS8qIEhhdmUgYSBjaGFyICovCisJfQorI2VuZGlmIC8qIEtBTkpJICovCisgICAgfQorICAgIGlmICghZmxhZykgewkJCS8qIElmIG5vIGNoYXJhY3RlciB3YXMgcmVhZCB5ZXQuLi4gKi8KKwlpZiAoKHggPSAoZm4gPyAoKmZuKSgpIDogem1pbmNoYXIoKSkpID4gLTEpCS8qIHJlYWQgb25lIG5vdyAqLworCSAgZmZjKys7CisJZGVidWcoRjEwMSwieGduYnl0ZSB6bWluY2hhciAxIiwiIix4KTsKKwlpZiAoeCA8IDApCisJICByZXR1cm4oeCk7CisJaGF2ZXVjID0gMDsKKyAgICB9CisjaWZkZWYgVU5JQ09ERQorICAgIGlmIChoYXZldWMpIHsKKwl0aGlzY2hhciA9IHVjLnhfc2hvcnQ7CisJLyogbGFzdHVjczIgPSB1Yy54X3Nob3J0OyAqLworICAgIH0gZWxzZQorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyAgICAgIHRoaXNjaGFyID0geDsKKyAgICBkZWJ1ZyhGMDAxLCJ4Z25ieXRlIHRoaXNjaGFyIixoYXZldWMgPyAiW1VOSUNPREVdIiA6ICJbb3RoZXJdIix0aGlzY2hhcik7CisKKyNpZmRlZiBDS19DVFJMWgkJCQkvKiBTRVQgRU9GIENUUkxaICovCisgICAgaWYgKGVvZm1ldGhvZCA9PSBYWUVPRl9aICYmICFiaW5hcnkgJiYgdGhpc2NoYXIgPT0gMjYpIHsKKwlkZWJ1ZyhGMTAwLCJ4Z25ieXRlIEVPRiBvbiBDdHJsLVogMSIsIiIsMCk7CisJcmV0dXJuKC0xKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfQ1RSTFogKi8KKworI2lmZGVmIFVOSUNPREUKKyAgICBpZiAoIWhhdmV1YykJCQkvKiBJZiBub3QgVW5pY29kZS4uLiAqLworI2VuZGlmIC8qIFVOSUNPREUgKi8KKyAgICAgIHggJj0gZm1hc2s7CQkJLyogQXBwbHkgU0VUIEZJTEUgQllURVNJWkUgbWFzayAqLworCisgICAgc3dpdGNoICh4bGF0eXBlKSB7CQkJLyogVHJhbnNsYXRpb24gdHlwZS4uLiAqLworI2lmZGVmIFVOSUNPREUKKyAgICAgIGNhc2UgWExBX1VOSUNPREU6IHsJCS8qIFVuaWNvZGUgaXMgaW52b2x2ZWQgKi8KKwkgIHhjID0gMDsKKy8qCisgIEhlcmUgd2UgbXVzdCBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRyYW5zbGF0aW9uIGZ1bmN0aW9uLiAgSWYgd2UgYXJlIGJlaW5nCisgIGNhbGxlZCBieSBnZXRwa3QoKSAoaS5lLiB3aGVuIHRyYW5zZmVycmluZyBhIGZpbGUpLCB3ZSBhcmUgdHJhbnNsYXRpbmcgZnJvbQorICBVbmljb2RlIHRvIHRoZSBUcmFuc2ZlciBDaGFyYWN0ZXIgU2V0IGFuZCB0aGVyZWZvcmUgbXVzdCB1c2UgdGhlIGZ1bmN0aW9uCisgIHBvaW50ZWQgdG8gYnkgeHV0LiAgT3RoZXJ3aXNlLCBlLmcuIGR1cmluZyBUUkFOU0xBVEUsIENPTk5FQ1QsIFRSQU5TTUlULCBldGMsCisgIHdlIGFyZSB0cmFuc2xhdGluZyBmcm9tIFVuaWNvZGUgdG8gdGhlIEZpbGUgQ2hhcmFjdGVyIFNldCBhbmQgc28gbXVzdCBjYWxsCisgIHRoZSBmdW5jdGlvbiBwb2ludGVkIHRvIGJ5IHh1Zi4gIFRoZXJlIG1pZ2h0IGJlIGEgY2xlYW5lciB3YXkgdG8gc2V0IHRoaXMKKyAgdXAgYnV0IEkgZG9uJ3QgdGhpbmsgc28uICBGb3IgZXhhbXBsZSwgc2V0eGxhdHlwZSgpIG1pZ2h0IGhhdmUgYmVlbiBjYWxsZWQKKyAgdG9vIHNvb24gYW5kIHNvIG1pZ2h0IG5vdCBoYXZlIGtub3duIHdoZXRoZXIgaXQgd2FzIGEgZmlsZSB0cmFuc2ZlciBvciBhCisgIGxvY2FsIG9wZXJhdGlvbi4KKyovCisJICB4eCA9ICh3aGF0ICYgV19TRU5EKSA/IHh1dCA6IHh1ZjsKKwkgIGVvbGZsYWcgPSAwOworCSAgaWYgKGhhdmV1YykgewkJCS8qIEZpbGUgaXMgVW5pY29kZSAqLworCSAgICAgIC8qIFNlZSBVbmljb2RlIFRSMTMsICJDb252ZXJ0aW5nIHRvIE90aGVyIENoYXJhY3RlciBTZXRzIiAqLworCSAgICAgIGlmICh1Yy54X3Nob3J0ID09IDB4MjAyOCB8fCAvKiBMaW5lIFNlcGFyYXRvcj8gKi8KKwkJICB1Yy54X3Nob3J0ID09IDB4MjAyOSB8fCAvKiBQYXJhZ3JhcGggU2VwYXJhdG9yICovCisJCSAgKGZlb2wgJiYgKHVjLnhfc2hvcnQgPT0gKFVTSE9SVClmZW9sKSkKKwkJICApIHsKKwkJICBkZWJ1ZyhGMDAxLCJ4Z25ieXRlIHVjIGVvbCIsIiIsdWMueF9zaG9ydCk7CisJCSAgcmMgPSAwOworCQkgIGVvbGZsYWcgPSAxOwkJLyogRG9uJ3QgdHJhbnNsYXRlIGFuZCBoYW5kbGUgbGF0ZXIgKi8KKwkgICAgICB9CisJICAgICAgaWYgKHh4ICYmICFlb2xmbGFnKSB7CS8qIFVDUy10by1UQ1MgZnVuY3Rpb24gKFVDUy0+Ynl0ZSkgKi8KKwkJICByYyA9ICgqeHgpKHVjLnhfc2hvcnQpOyAvKiBUaGVzZSBjYW4gZmFpbC4uLiAqLworCQkgIGRlYnVnKEYxMDEsInhnbmJ5dGUgeHggcmMiLCIiLHJjKTsKKwkJICBpZiAocmMgPCAwKQkJLyogSWYgaXQgY2FuJ3QgYmUgdHJhbnNsYXRlZCAqLworCQkgICAgdWMueF9zaG9ydCA9IFVOSzsJLyogUHV0IHVua25vd24tY2hhcmFjdGVyIHN5bWJvbCAqLworCQkgIGVsc2UKKwkJICAgIHVjLnhfc2hvcnQgPSAodW5zaWduZWQpKCh1bnNpZ25lZClyYyAmIDB4ZmZmZik7CisJCSAgZGVidWcoRjEwMSwieGduYnl0ZSB4eCB1YyIsIiIsdWMueF9zaG9ydCk7CisJICAgICAgfQorI2lmZGVmIEtBTkpJCisJICAgICAgaWYgKHRjcyA9PSBGQ19KRVVDKSB7CS8qIFRyYW5zbGF0aW5nIHRvIEVVQy1KUCAqLworCQkgIFVTSE9SVCBzaiA9IDA7CisJCSAgdW5pb24gY2tfc2hvcnQgZXU7CisJCSAgZGVidWcoRjAwMSwieGduYnl0ZSBVQ1MtPkVVQyBVQ1MiLCIiLHVjLnhfc2hvcnQpOworCQkgIGlmICghaGF2ZXNqKQkJLyogSWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGl0ICovCisJCSAgICBzaiA9IHVuX3RvX3NqKHVjLnhfc2hvcnQpOyAvKiBjb252ZXJ0IHRvIFNoaWZ0LUpJUyAqLworCQkgIGV1Lnhfc2hvcnQgPSBzal90b19ldShzaik7CisJCSAgZGVidWcoRjAwMSwieGduYnl0ZSBVQ1MtPkVVQyBFVUMiLCIiLGV1Lnhfc2hvcnQpOworCQkgIHhsYXB0ciA9IDA7CisJCSAgeGxhY291bnQgPSAwOworCQkgIGlmIChlb2xmbGFnKSB7CisJCSAgICAgIGlmICh3aGF0ICYgV19TRU5EKSB7CisJCQkgIHhsYWJ1Zlt4bGFjb3VudCsrXSA9IExGOworCQkJICByZXR1cm4oQ1IpOworCQkgICAgICB9IGVsc2UgeworCQkJICByZXR1cm4oZmVvbCk7CisJCSAgICAgIH0KKwkJICB9CisJCSAgaWYgKGV1LnhfY2hhcltieXRlb3JkZXJdKSB7CS8qIFR3byBieXRlcyAqLworCQkgICAgICByYyA9IGV1LnhfY2hhcltieXRlb3JkZXJdOworCQkgICAgICB4bGFidWZbeGxhY291bnQrK10gPSBldS54X2NoYXJbMS1ieXRlb3JkZXJdOworCQkgICAgICBkZWJ1ZyhGMDAxLCJ4Z25ieXRlIFVDUy0+RVVDIHhsYWJ1ZlswXSIsIiIseGxhYnVmWzBdKTsKKwkJICB9IGVsc2UgewkJLyogT25lIGJ5dGUgKi8KKwkJICAgICAgcmMgPSBldS54X2NoYXJbMS1ieXRlb3JkZXJdOworCQkgIH0KKwkJICBkZWJ1ZyhGMTAxLCJ4Z25ieXRlIFVDUy0+RVVDIHhsYWNvdW50IiwiIix4bGFjb3VudCk7CisJCSAgZGVidWcoRjAwMSwieGduYnl0ZSBVQ1MtPkVVQyByYyIsIiIscmMpOworCQkgIHJldHVybihyYyk7CisJICAgICAgfSBlbHNlCisjZW5kaWYgLyogS0FOSkkgKi8KKwkgICAgICBpZiAodGNzICE9IEZDX1VDUzIgJiYgdGNzICE9IEZDX1VURjgpIHsKKwkJICBpZiAodWMueF9zaG9ydCAmIDB4ZmYwMCkgewkvKiBEZWNvZGluZyBlcnJvciAqLworCQkgICAgICBkZWJ1ZyhGMDAxLCJ4Z25ieXRlIGRlY29kaW5nIGVycm9yIiwiIix1Yy54X3Nob3J0KTsKKwkJICAgICAgcmV0dXJuKC0yKTsKKwkJICB9IGVsc2UKKwkJICAgIHJldHVybigodW5zaWduZWQgaW50KSh1Yy54X3Nob3J0ICYgMHhmZikpOworCSAgICAgIH0KKwkgICAgICB4YyA9IHVjLnhfc2hvcnQ7CisKKwkgIH0gZWxzZSB7CQkJLyogRmlsZSBpcyBub3QgVW5pY29kZSAqLworCSAgICAgIFVTSE9SVCBjaDsKKwkgICAgICAvKiBUcmFuc2xhdGUgZnJvbSBzaW5nbGUgRkNTIGJ5dGUgdG8gVUNTLTIgKi8KKy8qCisgIFRoaXMgaXMgYSBiaXQgbm9ub2J2aW91cy4uLiAgVGhlIGJsYWhfdSgpIChCbGFoLXRvLVVuaWNvZGUpIHJvdXRpbmVzIGFyZQorICBjYWxsZWQgb25seSB3aXRoIHBpZWNlcyBvZiBjaGFyYWN0ZXIgc2V0cywgaW4gdGhlIElTTyAyMDIyIHNlbnNlLiAgU28sCisgIGZvciBleGFtcGxlLCBpZiBjaCBpcyBhIExhdGluLTEgY2hhcmFjdGVyLCB3ZSBjYWxsIHRoZSB0cmFuc2xhdGlvbgorICByb3V0aW5lIG9ubHkgaWYgaXQgaXMgaW4gdGhlIHJpZ2h0IGhhbGY7IGlmIGl0J3MgaW4gdGhlIGxlZnQgaGFsZiwgaXQKKyAgaXNuJ3QgdHJhbnNsYXRlZCwgYW5kIGluIGZhY3Qgd2lsbCBnaXZlIHRoZSB3cm9uZyByZXN1bHQgaWYgc2VudCB0byB0aGUKKyAgdHJhbnNsYXRpb24gZnVuY3Rpb24uICBUaGF0J3MgYmVjYXVzZSB0aG9zZSBmdW5jdGlvbnMgd2VyZSBkZXNpZ25lZCBmb3IKKyAgdXNlIHdpdGggdGhlIElTTyAyMDIyIEcwLi5HMyBzZXRzLCBub3QgZm9yIGZpbGUgdHJhbnNmZXIuICBPbiB0aGUgb3RoZXIKKyAgaGFuZCwgaWYgaXQncyBhIDctYml0IGNoYXJhY3RlciBzZXQsIHdlICpkbyogY2FsbCB0aGUgdHJhbnNsYXRpb24KKyAgZnVuY3Rpb24uICAoVG8gcHV0IGl0IGFub3RoZXIgd2F5LCB0aGUgbGVmdCBoYWxmIG9mIGFueSA4LWJpdCBjaGFyYWN0ZXIKKyAgc2V0IGlzIEFTQ0lJIGFuZCB0aGVyZWZvcmUgZG9lc24ndCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQgYnV0IDctYml0IHNldHMKKyAgc3VjaCBhcyBJU08gNjQ2IEdlcm1hbiBkbyBuZWVkIHRyYW5zbGF0aW9uKS4KKyovCisJICAgICAgY2ggPSAodW5zaWduZWQpKHRoaXNjaGFyICYgMHhmZik7CisJICAgICAgaWYgKCgoZmNzaW5mb1tmY3NdLnNpemUgPiAxMjgpICYmIChjaCAmIDB4ODApKSB8fAorCQkgIGZjc2luZm9bZmNzXS5zaXplIDw9IDEyOCkgeworCQkgIGlmICh4ZnUpIHsJCSAvKiBGQ1MtdG8tVUNTIGZ1bmN0aW9uICovCisJCSAgICAgIGNoID0gKCp4ZnUpKGNoKTsKKwkJICB9CisJICAgICAgfQorCSAgICAgIHhjID0gY2g7CisJICB9CisJICAvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYSBVQ1MtMiBjaGFyYWN0ZXIgaW4gbmF0aXZlIGZvcm1hdCAqLworCSAgLyogKEJpZyBFbmRpYW4gb3IgTGl0dGxlIEVuZGlhbikgaW4geGMsIHdoaWNoIGlzIGFuIHVuc2lnbmVkIGludC4gKi8KKworCSAgZGVidWcoRjAwMSwieGduYnl0ZSB4YyIsIiIseGMpOworCisJICBpZiAodGNzID09IEZDX1VURjgpIHsJCS8qIE5vdyBjb252ZXJ0IHRvIFVURi04ICovCisJICAgICAgVVNIT1JUIGM7CQkJLyogTk9URTogdGhpcyBpcyBGQ19VVEY4IG9uIHB1cnBvc2UhICovCisJICAgICAgQ0hBUiAqIGJ1ZiA9IE5VTEw7CisJICAgICAgaW50IGksIGsgPSAwLCB4OworCisJICAgICAgeGxhcHRyID0gMDsKKwkgICAgICBpZiAodXRmZXJyb3IpIHsKKwkJICB4bGFidWZbaysrXSA9IDB4ZmY7CisJCSAgeGxhYnVmW2srK10gPSAweGJkOworCSAgICAgIH0KKwkgICAgICBpZiAoZW9sZmxhZykgewkJLyogV2UgZGV0ZWN0ZWQgRU9MIGluIHNvdXJjZSBmaWxlICovCisJCSAgaWYgKHdoYXQgJiBXX1NFTkQpIHsJLyogQ29udmVydCB0byBDUkxGICovCisJCSAgICAgIHhsYWJ1ZltrKytdID0gTEY7CisJCSAgICAgIHhsYWNvdW50ID0gazsKKwkJICAgICAgcmV0dXJuKCh1bnNpZ25lZCBpbnQpQ1IpOworI2lmZGVmIENPTU1FTlQKKwkJICB9IGVsc2UgewkJLyogT3IgdG8gbG9jYWwgbGluZS1lbmQgKi8KKwkJICAgICAgeGxhY291bnQgPSBrOworCQkgICAgICByZXR1cm4oKHVuc2lnbmVkIGludClmZW9sKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJCSAgfQorCSAgICAgIH0KKwkgICAgICBjID0geGM7CisJICAgICAgaWYgKCh4ID0gdWNzMl90b191dGY4KGMsJmJ1ZikpIDwgMSkgeworCQkgIGRlYnVnKEYxMDEsInhnbmJ5dGUgdWNzMl90b191dGY4IGVycm9yIiwiIixjKTsKKwkJICByZXR1cm4oLTIpOworCSAgICAgIH0KKwkgICAgICBkZWJ1ZyhGMTAxLCJ4Z25ieXRlIFVURjggYnVmWzBdIiwiIixidWZbMF0pOworCSAgICAgIGZvciAoaSA9IDE7IGkgPCB4OyBpKyspIHsKKwkJICB4bGFidWZbaytpLTFdID0gYnVmW2ldOworCQkgIGRlYnVnKEYxMTEsInhnbmJ5dGUgVVRGOCB4bGFidWYiLGNraXRvYShpLTEpLGJ1ZltpXSk7CisJICAgICAgfQorCSAgICAgIHhsYXB0ciA9IDA7CisJICAgICAgeGxhY291bnQgPSB4IC0gMTsKKwkgICAgICBkZWJ1ZyhGMTAxLCJ4Z25ieXRlIFVURjggeGxhY291bnQiLCIiLHhsYWNvdW50KTsKKwkgICAgICByZXR1cm4oKHVuc2lnbmVkIGludClidWZbMF0pOworCSAgfSBlbHNlIHsJCQkvKiBPciBrZWVwIGl0IGFzIFVDUy0yICovCisJICAgICAgaW50IGsgPSAwOworCSAgICAgIENIQVIgYzsKKwkgICAgICB4bGFwdHIgPSAwOworCSAgICAgIGlmICh1dGZlcnJvcikgeworCQkgIHhsYWJ1ZltrKytdID0gMHhmZjsKKwkJICB4bGFidWZbaysrXSA9IDB4ZmQ7CisJCSAgZGVidWcoRjEwMSwieGduYnl0ZSBlcnJvciIsIiIsayk7CisJICAgICAgfQorCSAgICAgIGlmIChlb2xmbGFnKSB7CQkvKiBXZSBkZXRlY3RlZCBFT0wgaW4gc291cmNlIGZpbGUgKi8KKwkJICBpZiAod2hhdCAmIFdfU0VORCkgewkvKiBDb252ZXJ0IHRvIENSTEYgKi8KKwkJICAgICAgeGxhYnVmW2srK10gPSBDUjsKKwkJICAgICAgeGxhYnVmW2srK10gPSBOVUw7CisJCSAgICAgIHhsYWJ1ZltrKytdID0gTEY7CisJCSAgICAgIHhsYWNvdW50ID0gazsKKwkJICAgICAgZGVidWcoRjEwMSwieGduYnl0ZSBzZW5kIENSTEYiLCIiLGspOworCQkgICAgICByZXR1cm4oMCk7CS8qIFJldHVybiBOVUwgKi8KKwkJICB9IGVsc2UgewkJLyogT3IgdG8gbG9jYWwgbGluZS1lbmQgKi8KKyNpZmRlZiBDT01NRU5UCisJCSAgICAgIC8qIFRoaXMgYnlwYXNzZXMgYnl0ZSBzd2FwcGluZyB0aGF0IHdlIG1pZ2h0IG5lZWQgKi8KKwkJICAgICAgeGxhYnVmW2srK10gPSAoQ0hBUilmZW9sOworCQkgICAgICB4bGFjb3VudCA9IGs7CisJCSAgICAgIGRlYnVnKEYxMDEsInhnbmJ5dGUgc2VuZCBmZW9sIiwiIixrKTsKKwkJICAgICAgcmV0dXJuKDApOwkvKiBSZXR1cm4gTlVMICovCisjZWxzZQorCQkgICAgICB4YyA9IChDSEFSKWZlb2w7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCQkgIH0KKwkgICAgICB9CisJICAgICAgLyogSW4gd2hpY2ggb3JkZXIgc2hvdWxkIHdlIHJldHVybiB0aGUgYnl0ZXM/ICovCisjaWZkZWYgQ09NTUVOVAorCSAgICAgIGlmICggKHdoYXQgJiBXX1NFTkQpIHx8ICh3aGF0ICYgV19GVFApIHx8IChmaWxlb3JkZXIgPT0gMCkpIHsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJCSAgLyogQUxXQVlTIFJFVFVSTiBJTiBCSUcgRU5ESUFOIE9SREVSLi4uIDcgU2VwIDIwMDIgICAqLworCQkgIC8qIHhnbmJ5dGUoKSBpcyBhbG1vc3QgYWx3YXlzIHVzZWQgdG8gZmVlZCB4cG5ieXRlKCkgKi8KKwkJICAvKiB3aGljaCByZXF1aXJlcyBieXRlcyBpbiBCRSBvcmRlci4gSW4gY2FzZXMgd2hlcmUgICovCisJCSAgLyogeGduYnl0ZSBpcyB1c2VkIGluIGlzb2xhdGlvbiwgdGhlIGNhbGxlciBjYW4gc3dhcCAqLworCQkgIC8qIGJ5dGVzIGl0c2VsZiBhZnRlcndhcmRzLiAqLworCQkgIHhsYWJ1ZltrKytdID0gKHhjID4+IDgpICYgMHhmZjsgLyogQmlnIEVuZGlhbiAqLworCQkgIHhsYWJ1ZltrKytdID0geGMgJiAweGZmOworCQkgIGRlYnVnKEYwMDEsInhnbmJ5dGUtPlVDUzJCRSIsCisJCQlja2l0b3goKGludCl4bGFidWZbMF0pLHhsYWJ1ZlsxXSk7CisjaWZkZWYgQ09NTUVOVAorCSAgICAgIH0gZWxzZSB7CQkJLyogTGl0dGxlIEVuZGlhbiAqLworCQkgIHhsYWJ1ZltrKytdID0geGMgJiAweGZmOworCQkgIHhsYWJ1ZltrKytdID0gKHhjID4+IDgpICYgMHhmZjsKKwkJICBkZWJ1ZyhGMDAxLCJ4Z25ieXRlLT5VQ1MyTEUiLAorCQkJY2tpdG94KChpbnQpeGxhYnVmWzBdKSx4bGFidWZbMV0pOworCSAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisJICAgICAgYyA9IHhsYWJ1ZlswXTsKKwkgICAgICB4bGFwdHIgPSAxOworCSAgICAgIHhsYWNvdW50ID0gay0xOworCSAgICAgIGRlYnVnKEYxMDEsInhnbmJ5dGUgYyIsIiIsYyk7CisJICAgICAgZGVidWcoRjEwMSwieGduYnl0ZSB4bGFwdHIiLCIiLHhsYXB0cik7CisJICAgICAgZGVidWcoRjAxMSwieGduYnl0ZSB4bGFidWYiLHhsYWJ1Zix4bGFjb3VudCk7CisJICAgICAgcmV0dXJuKCh1bnNpZ25lZCBpbnQpYyk7CisJICB9CisgICAgICB9CisjZW5kaWYgLyogVU5JQ09ERSAqLworICAgICAgY2FzZSBYTEFfTk9ORToKKwlyZXR1cm4oKGZuID8gKCpmbikoKSA6IHptaW5jaGFyKCkpKTsKKyAgICAgIGNhc2UgWExBX0JZVEU6CQkJLyogQnl0ZS1mb3ItQnl0ZSB0cmFuc2xhdGlvbiAqLworCXJ0ID0geDsKKwlpZiAoc3gpCisJICBydCA9ICgqc3gpKHJ0KTsKKyNpZmRlZiBVTklDT0RFCisJaWYgKHV0ZmVycm9yKSB7CisJICAgIHhsYXB0ciA9IDA7CisJICAgIHhsYWNvdW50ID0gMTsKKwkgICAgeGxhYnVmWzBdID0gcnQ7CisJICAgIHJldHVybihVTkspOworCX0gZWxzZQorI2VuZGlmIC8qIFVOSUNPREUgKi8KKwkgIHJldHVybigodW5zaWduZWQgaW50KXJ0KTsKKworI2lmZGVmIEtBTkpJCisgICAgICBjYXNlIFhMQV9KQVBBTjoJCQkvKiBDb21lIGhlcmUgd2l0aCBTaGlmdC1KSVMgKi8KKwlpZiAodGNzID09IEZDX0pFVUMpIHsJCS8qIEl0IGJldHRlciBiZS4uLiAqLworCSAgICB4bGFwdHIgPSAwOworCSAgICB4bGFjb3VudCA9IDA7CisJICAgIGlmICghaGF2ZXNqKSB7CisJCXByaW50ZigiQkFEIEJBRFxuIik7CisJCXJldHVybigtMik7CisJICAgIH0KKwkgICAgaWYgKCFoYXZlZXUpCQkvKiBXZSBtaWdodCBhbHJlYWR5IGhhdmUgRVVDIHRvbyAqLworCSAgICAgIGV1Lnhfc2hvcnQgPSBzal90b19ldShzai54X3Nob3J0KTsKKwkgICAgaWYgKGV1LnhfY2hhcltieXRlb3JkZXJdKSB7CisJCXhsYWJ1Zlt4bGFjb3VudCsrXSA9IGV1LnhfY2hhclsxLWJ5dGVvcmRlcl07CisJCXJldHVybihldS54X2NoYXJbYnl0ZW9yZGVyXSk7CisJICAgIH0gZWxzZSB7CisJCXJldHVybihldS54X2NoYXJbMS1ieXRlb3JkZXJdKTsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisjZW5kaWYgLyogS0FOSkkgKi8KKworICAgICAgZGVmYXVsdDoKKwlkZWJ1ZyhGMTAxLCJ4Z25ieXRlIGJhZCB4bGF0eXBlIiwiIix4bGF0eXBlKTsKKwlyZXR1cm4oLTIpOworICAgIH0KKyNpZmRlZiBDT01NRU5UCisvKiAgICAKKyAgSWYgdGhlcmUgaXMgYSByZXR1cm4oKSBzdGF0ZW1lbnQgaGVyZSwgc29tZSBjb21waWxlcnMgY29tcGxhaW4KKyAgYWJvdXQgInN0YXRlbWVudCBub3QgcmVhY2hlZCIuICBJZiB0aGVyZSBpcyBubyByZXR1cm4oKSBzdGF0ZW1lbnQsCisgIG90aGVyIGNvbXBpbGVycyBjb21wbGFpbiB0aGF0ICJOb24tdm9pZCBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgdmFsdWUiLgorICBUaGVyZSBpcyBubyBwYXRoIHRocm91Z2ggdGhpcyBmdW5jdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggdG8gaGVyZS4KKyovCisgICAgZGVidWcoRjEwMCwieGduYnl0ZSBzd2l0Y2ggZmFpbHVyZSIsIiIsMCk7CisgICAgcmV0dXJuKC0yKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCit9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisjaWZuZGVmIE5PWEZFUgorCisvKiAgRyBFIFQgUCBLIFQgIC0tICBGaWxsIGEgcGFja2V0IGRhdGEgZmllbGQgZnJvbSB0aGUgaW5kaWNhdGVkIHNvdXJjZS4gICovCisKKy8qCisgIFBhcmFtZXRlcnM6CisgICAgYnVmbWF4OiBNYXhpbXVtIGxlbmd0aCBvZiBlbnRpcmUgcGFja2V0LgorICAgIHhsYXRlOiAgRmxhZyBmb3Igd2hldGhlciB0byB0cmFuc2xhdGUgY2hhcnNldHMgd2hlbiBpbiB0ZXh0IG1vZGUuCisgIFJldHVybnM6ICBOdW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuIHRvIHBhY2tldCBkYXRhIGZpZWxkLCAwIG9yIG1vcmUsCisgICAgICAgICAgICBPciAtMSBvbiBmYWlsdXJlIChpbnRlcm5hbCBlcnJvciksCisgICAgICAgICAgICBvciAtMyBvbiB0aW1lb3V0IChlLmcuIHdoZW4gcmVhZGluZyBmcm9tIGEgcGlwZSkuCisKKyAgVGhpcyBpcyB0aGUgZnVsbCB2ZXJzaW9uIGFsbG93aW5nIGZvciBwYXJpdHkgYW5kIHRleHQtbW9kZSBjb252ZXJzaW9uczsKKyAgaS5lLiBpdCB3b3JrcyBpbiBhbGwgY2FzZXMuICAgQWxzbyBzZWUgYmdldHBrdCgpLCBhIHNwZWNpYWwgbGVhbi9tZWFuL2Zhc3QKKyAgcGFja2V0IGVuY29kZXIgdGhhdCB3b3JrcyBvbmx5IGZvciBiaW5hcnktbW9kZSBuby1wYXJpdHkgdHJhbnNmZXJzLgorKi8KK3N0YXRpYyBpbnQgdWZsYWcgPSAwOworCitpbnQKK2dldHBrdChidWZtYXgseGxhdGUpIGludCBidWZtYXgsIHhsYXRlOyB7IC8qIEZpbGwgb25lIHBhY2tldCBidWZmZXIgKi8KKyAgICByZWdpc3RlciBDSEFSIHJ0ID0gdCwgcm5leHQgPSBOVUw7CSAgLyogUmVnaXN0ZXIgc2hhZG93cyBvZiB0aGUgZ2xvYmFscyAqLworICAgIHJlZ2lzdGVyIENIQVIgKmRwLCAqb2RwLCAqb2RwMiwgKnAxLCAqcDI7IC8qIHBvaW50ZXJzLi4uICovCisgICAgcmVnaXN0ZXIgaW50IHg7CQkJLyogTG9vcCBpbmRleC4gKi8KKyAgICByZWdpc3RlciBpbnQgYTc7CQkJLyogTG93IDcgYml0cyBvZiBjaGFyYWN0ZXIgKi8KKworICAgIENIQVIgeHhscywgeHhkbCwgeHhyYywgeHhzcywgeHhjcTsJLyogUGllY2VzIG9mIHByZWZpeGVkIHNlcXVlbmNlICovCisKKyAgICBpZiAoYmluYXJ5KSB4bGF0ZSA9IDA7CQkvKiBXZSBkb24ndCB0cmFuc2xhdGUgaWYgYmluYXJ5ICovCisKKyAgICBpZiAoIWRhdGEpIHsKKwlkZWJ1ZyhGMTAwLCJTRVJJT1VTIEVSUk9SOiBnZXRwa3QgZGF0YSA9PSBOVUxMIiwiIiwwKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICBkcCA9IGRhdGE7CQkJCS8qIFBvaW50IHRvIHBhY2tldCBkYXRhIGJ1ZmZlciAqLworICAgIHNpemUgPSAwOwkJCQkvKiBBbmQgaW5pdGlhbGl6ZSBpdHMgc2l6ZSAqLworLyoKKyAgQXNzdW1lIGJ1Zm1heCBpcyB0aGUgcmVjZWl2ZXIncyB0b3RhbCByZWNlaXZlLXBhY2tldCBidWZmZXIgbGVuZ3RoLgorICBPdXIgd2hvbGUgcGFja2V0IGhhcyB0byBmaXQgaW50byBpdCwgc28gd2UgYWRqdXN0IHRoZSBkYXRhIGZpZWxkIGxlbmd0aC4KKyAgV2UgYWxzbyBkZWNpZGUgb3B0aW1hbGx5IHdoZXRoZXIgaXQgaXMgYmV0dGVyIHRvIHVzZSBhIHNob3J0LWZvcm1hdCBvcgorICBsb25nLWZvcm1hdCBwYWNrZXQgd2hlbiB3ZSdyZSBuZWFyIHRoZSBib3JkZXJsaW5lLgorKi8KKyAgICBidWZtYXggPSBtYXhkYXRhKCk7CQkJLyogR2V0IG1heGltdW0gZGF0YSBsZW5ndGggKi8KKworICAgIGlmIChmaXJzdCA9PSAxKSB7CQkJLyogSWYgZmlyc3QgY2hhcmFjdGVyIG9mIHRoaXMgZmlsZS4uICovCisjaWZkZWYgVU5JQ09ERQorCS8qIFNwZWNpYWwgZW5kLW9mLWxpbmUgaGFuZGxpbmcgZm9yIFVuaWNvZGUgKi8KKwlpZiAodGNoYXJzZXQgPT0gVENfVUNTMiB8fCB0Y2hhcnNldCA9PSBUQ19VVEY4KQorCSAgdWZsYWcgPSAxOworI2VuZGlmIC8qIFVOSUNPREUgKi8KKwlkZWJ1ZyhGMTAxLCJnZXRwa3QgZmlyc3QgdWZsYWciLCIiLHVmbGFnKTsKKwlkZWJ1ZyhGMTAxLCJnZXRwa3QgZmlyc3QgcnQiLCIiLHJ0KTsKKwlpZiAoIW1lbXN0ciAmJiAhZnVuY3N0cikJLyogYW5kIHJlYWwgZmlsZS4uLiAqLworCSAgZmZjID0gMEw7CQkJLyogcmVzZXQgZmlsZSBjaGFyYWN0ZXIgY291bnRlciAqLworI2lmZGVmIENPTU1FTlQKKwkvKiBNb3ZlZCB0byBiZWxvdy4uLiAqLworCWZpcnN0ID0gMDsJCQkvKiBOZXh0IGNoYXJhY3RlciB3b24ndCBiZSBmaXJzdCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkqbGVmdG92ZXIgPSAnXDAnOwkJLyogRGlzY2FyZCBhbnkgaW50ZXJydXB0ZWQgbGVmdG92ZXJzICovCisJbmxlZnQgPSAwOworI2lmbmRlZiBOT0NTRVRTCisJc2V0eGxhdHlwZSh0Y2hhcnNldCxmY2hhcnNldCk7CS8qIFNldCB1cCBjaGFyc2V0IHRyYW5zbGF0aW9ucyAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworCS8qIEdldCBmaXJzdCBjaGFyYWN0ZXIgb2YgZmlsZSBpbnRvIHJ0LCB3YXRjaGluZyBvdXQgZm9yIG51bGwgZmlsZSAqLworCisjaWZkZWYgQ0FMSUJSQVRFCisJaWYgKGNhbGlicmF0ZSAmJiAhbWVtc3RyKSB7CisjaWZkZWYgTk9SQU5ET00KKwkgICAgeCA9IHJ0ID0gNTM7CisjZWxzZQorCSAgICB4ID0gcnQgPSBjYWxfYVtyYW5kKCkgJiAweGZmXTsKKyNlbmRpZiAvKiBOT1JBTkRPTSAqLworCSAgICBmaXJzdCA9IDA7CisJICAgIGZmYysrOworCX0gZWxzZQorI2VuZGlmIC8qIENBTElCUkFURSAqLworI2lmZGVmIEtBTkpJCisJaWYgKHhsYXRlICYmIHRjaGFyc2V0ID09IFRDX0pFVUMpIHsgLyogS2FuamkgdGV4dCAqLworCSAgICB4ID0gemthbmpmKCk7CisJICAgIGlmICgoeCA9IHprYW5qaShtZW1zdHIgPyBrZ2V0bSA6IGtnZXRmKSkgPCAwKSB7CisJICAgICAgICBmaXJzdCA9IC0xOworCSAgICAgICAgc2l6ZSA9IDA7CisJICAgICAgICBpZiAoeCA9PSAtMikgeworCSAgICAgICAgICAgIGRlYnVnKEYxMDAsImdldHBrdCB6a2Fuamk6IGlucHV0IGVycm9yIiwiIiwwKTsKKwkgICAgICAgICAgICBjeHNlZW4gPSAxOworCSAgICAgICAgfSBlbHNlIGRlYnVnKEYxMDAsImdldHBrdCB6a2Fuamk6IGVtcHR5IHN0cmluZy9maWxlIiwiIiwwKTsKKwkgICAgICAgIHJldHVybigwKTsKKwkgICAgfQorCSAgICBydCA9IHg7CisJICAgIGZpcnN0ID0gMDsKKwkgICAgaWYgKCFtZW1zdHIpIHsKKwkJZmZjKys7CisJCWlmIChkb2NyYyAmJiAod2hhdCAmIFdfU0VORCkpIC8qIEFjY3VtdWxhdGUgZmlsZSBjcmMgKi8KKwkJICBkb2ZpbGNyYygoaW50KXJ0KTsKKwkgICAgfQorCX0gZWxzZSB7CQkJLyogTm90IEthbmppIHRleHQgKi8KKyNlbmRpZiAvKiBLQU5KSSAqLworCSAgICBpZiAobWVtc3RyKSB7CQkvKiBSZWFkaW5nIGRhdGEgZnJvbSBtZW1vcnkgc3RyaW5nICovCisJCS8qIFRoaXMgd2lsbCBub3QgYmUgVW5pY29kZSAqLworCQlpZiAoKHJ0ID0gKm1lbXB0cisrKSA9PSAnXDAnKSB7IC8qIGVuZCBvZiBzdHJpbmcgPT0+IEVPRiAqLworCQkgICAgZmlyc3QgPSAtMTsKKwkJICAgIHNpemUgPSAwOworCQkgICAgZGVidWcoRjEwMCwiZ2V0cGt0OiBlbXB0eSBzdHJpbmciLCIiLDApOworCQkgICAgcmV0dXJuKDApOworCQl9CisJCWZpcnN0ID0gMDsKKwkgICAgfSBlbHNlIGlmIChmdW5jc3RyKSB7CS8qIFJlYWRpbmcgZGF0YSBmcm9tIGEgZnVuY3Rpb24gKi8KKwkJLyogVGhpcyB3aWxsIG5vdCBiZSBVbmljb2RlICovCisJCWlmICgoeCA9ICgqZnVuY3B0cikoKSkgPCAwKSB7IC8qIEVuZCBvZiBpbnB1dCAgKi8KKwkJICAgIGZpcnN0ID0gLTE7CisJCSAgICBzaXplID0gMDsJCS8qIEVtcHR5ICovCisJCSAgICByZXR1cm4oMCk7CisJCX0KKwkJZmZjKys7CQkJLyogQ291bnQgYSBmaWxlIGNoYXJhY3RlciAqLworCQlydCA9IChDSEFSKSB4OwkJLyogQ29udmVydCBpbnQgdG8gY2hhciAqLworCQlmaXJzdCA9IDA7CisJCWRlYnVnKEYwMDAsImdldHBrdCBmdW5jc3RyIiwiIixydCk7CisKKwkgICAgfSBlbHNlIHsJCQkvKiBSZWFkaW5nIGRhdGEgZnJvbSBhIGZpbGUgKi8KKyNpZm5kZWYgTk9DU0VUUworCQlpZiAoeGxhdGUgJiYgIWJpbmFyeSkgewkvKiBDb3VsZCBiZSBVbmljb2RlICovCisJCSAgICBpZiAoeGxhdHlwZSA9PSBYTEFfVU5JQ09ERSkgeworCQkJLyogR2V0IG5leHQgdHJhbnNsYXRlZCBieXRlICovCisJCQl4ID0geGduYnl0ZShjc2VxdGFiW3RjaGFyc2V0XSxmY2hhcnNldCxOVUxMKTsKKwkJCWRlYnVnKEYxMDEsImdldHBrdCB4Z25ieXRlIiwiIix4KTsKKwkJICAgIH0gZWxzZSB7CQkvKiBOb3QgVW5pY29kZSAqLworCQkJeCA9IHptaW5jaGFyKCk7CS8qIEdldCBuZXh0IGJ5dGUsIHRyYW5zbGF0ZSBiZWxvdyAqLworCQkJZGVidWcoRjEwMSwiZ2V0cGt0IHptaW5jaGFyIEEiLCIiLHgpOworCQkgICAgfQorCQl9IGVsc2UgewkJLyogSnVzdCBnZXQgbmV4dCBieXRlICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCQkgICAgeCA9IHptaW5jaGFyKCk7CisJCSAgICBkZWJ1ZyhGMTAxLCJnZXRwa3Qgem1pbmNoYXIgQiIsIiIseCk7CisjaWZuZGVmIE5PQ1NFVFMKKwkJfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKwkJaWYgKHggPCAwKSB7CQkvKiBFbmQgb2YgZmlsZSBvciBpbnB1dCBlcnJvciAqLworCQkgICAgaWYgKHggPT0gLTMpIHsJLyogVGltZW91dC4gKi8KKwkJCXNpemUgPSAoZHAtZGF0YSk7CisJCQlkZWJ1ZyhGMTAxLCJnZXRwa3QgdGltZW91dCBzaXplIiwiIixzaXplKTsKKwkJCXJldHVybigoc2l6ZSA9PSAwKSA/IHggOiBzaXplKTsKKwkJICAgIH0KKwkJICAgIGZpcnN0ID0gLTE7CisJCSAgICBzaXplID0gMDsKKwkJICAgIGlmICh4ID09IC0yKSB7CS8qIEVycm9yICovCisJCQlkZWJ1ZyhGMTAwLCJnZXRwa3Q6IGlucHV0IGVycm9yIiwiIiwwKTsKKwkJCWN4c2VlbiA9IDE7CS8qIEludGVycnVwdCB0aGUgZmlsZSB0cmFuc2ZlciAqLworCQkgICAgfSBlbHNlIHsKKwkJCWRlYnVnKEYxMDAsImdldHBrdCBlbXB0eSBmaWxlIiwiIiwwKTsKKwkJICAgIH0KKwkJICAgIHJldHVybigwKTsKKwkJfQorCQlmaXJzdCA9IDA7CQkvKiBOZXh0IGNoYXJhY3RlciB3b24ndCBiZSBmaXJzdCAqLworCQlydCA9IChDSEFSKSB4OwkJLyogQ29udmVydCBpbnQgdG8gY2hhciAqLworI2lmbmRlZiBOT0NTRVRTCisJCWlmICh4bGF0eXBlICE9IFhMQV9VTklDT0RFIHx8IGJpbmFyeSkgeworCQkgICAgZmZjKys7CisJCSAgICBpZiAoc3gpCisJCSAgICAgIHJ0ID0gKCpzeCkocnQpOworCQkgICAgaWYgKGRvY3JjICYmICh3aGF0ICYgV19TRU5EKSkKKwkJICAgICAgZG9maWxjcmMoeCk7CisJCX0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisjaWZkZWYgREVCVUcKKwkJaWYgKGRlYmxvZykKKwkJICBkZWJ1ZyhGMTAxLCJnZXRwa3QgMXN0IGNoYXIiLCIiLHJ0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQlpZiAoLyogIWhhdmV1YyAmJiAqLyBkb2NyYyAmJiAod2hhdCAmIFdfU0VORCkpIC8qIEZpbGUgQ1JDICovCisJCSAgZG9maWxjcmMoeCk7CisJICAgIH0KKyNpZmRlZiBLQU5KSQorCX0KKyNlbmRpZiAvKiBLQU5KSSAqLworCS8qIFBXUDogaGFuZGxpbmcgb2YgZmVvbCBpcyBkb25lIGxhdGVyIChpbiB0aGUgd2hpbGUgbG9vcCkuLi4gKi8KKworICAgIH0gZWxzZSBpZiAoKGZpcnN0ID09IC0xKSAmJiAobmxlZnQgPT0gMCkpIHsgLyogRU9GIGZyb20gbGFzdCB0aW1lICovCisjaWZkZWYgREVCVUcKKwlpZiAoZGVibG9nKSB7CisJICAgIGRlYnVnKEYxMDEsImdldHBrdCBlb2YgY3JjMTYiLCIiLGNyYzE2KTsKKwkgICAgZGVidWcoRjEwMSwiZ2V0cGt0IGVvZiBmZmMiLCIiLGZmYyk7CisJfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgIHJldHVybihzaXplID0gMCk7CisgICAgfQorLyoKKyAgSGVyZSB3ZSBoYW5kbGUgY2hhcmFjdGVycyB0aGF0IHdlcmUgZW5jb2RlZCBmb3IgdGhlIGxhc3QgcGFja2V0IGJ1dAorICBkaWQgbm90IGZpdCwgYW5kIHNvIHdlcmUgc2F2ZWQgaW4gdGhlICJsZWZ0b3ZlciIgYXJyYXkuCisqLworICAgIGRlYnVnKEYxMDEsImdldHBrdCBubGVmdCIsIiIsbmxlZnQpOworICAgIGlmIChubGVmdCkgeworCWZvciAocDEgPSBsZWZ0b3ZlcjsgbmxlZnQgPiAwOyBubGVmdC0tKSAvKiBDb3B5IGxlZnRvdmVycyAqLworCSAgKmRwKysgPSAqcDErKzsKKwkqbGVmdG92ZXIgPSAnXDAnOwkJCS8qIERlbGV0ZSBsZWZ0b3ZlcnMgKi8KKwlubGVmdCA9IDA7CisgICAgfQorICAgIGlmIChmaXJzdCA9PSAtMSkJCQkvKiBIYW5kbGUgRU9GICovCisgICAgICByZXR1cm4oc2l6ZSA9IChkcCAtIGRhdGEpKTsKKworLyogTm93IGZpbGwgdXAgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldC4gKi8KKworICAgIHJwdCA9IDA7CQkJCS8qIEluaXRpYWxpemUgY2hhcmFjdGVyIHJlcGVhdCBjb3VudCAqLworCisgICAgd2hpbGUgKGZpcnN0ID4gLTEpIHsJCS8qIFVudGlsIEVPRi4uLiAqLworI2lmZGVmIENBTElCUkFURQorCWlmIChjYWxpYnJhdGUgJiYgIW1lbXN0cikgewkvKiBXZSBnZW5lcmF0ZSBvdXIgb3duICJmaWxlIiAqLworCSAgICBpZiAoZmZjID49IGNhbGlicmF0ZSkgewkvKiBFT0YgKi8KKwkJZmlyc3QgPSAtMTsKKwkJZmZjLS07CisJICAgIH0gZWxzZSB7CQkJLyogR2VuZXJhdGUgbmV4dCBjaGFyYWN0ZXIgKi8KKwkJaWYgKGNhbF9qID4gQ0FMX00gKiBmZmMpCisJCSAgY2FsX2ogPSBjYWxfYVtmZmMgJiAweGZmXTsKKwkJeCA9ICh1bnNpZ25lZCljYWxfYVsoY2FsX2ogJiAweGZmKV07CisJCWlmICh4ID09IHJ0KSB4IF49IDI7CisJICAgIH0KKwkgICAgY2FsX2ogKz0gKHVuc2lnbmVkIGludCkoZmZjICsgQ0FMX08pOworCSAgICBmZmMrKzsKKwl9IGVsc2UKKyNlbmRpZiAvKiBDQUxJQlJBVEUgKi8KKyNpZmRlZiBLQU5KSQorCSAgaWYgKHhsYXRlICYmIHRjaGFyc2V0ID09IFRDX0pFVUMpIHsKKwkgICAgICBpZiAoKHggPSB6a2FuamkobWVtc3RyID8ga2dldG0gOiBrZ2V0ZikpIDwgMCkgeworCQkgIGZpcnN0ID0gLTE7CisJCSAgaWYgKHggPT0gLTIpIGN4c2VlbiA9IDE7CisJICAgICAgfSBlbHNlIGlmICghbWVtc3RyKSBmZmMrKzsKKwkgICAgICBybmV4dCA9IChDSEFSKSAoeCAmIGZtYXNrKTsKKwkgIH0gZWxzZSB7CisjZW5kaWYgLyogS0FOSkkgKi8KKwkgICAgaWYgKG1lbXN0cikgewkJLyogR2V0IG5leHQgY2hhciBmcm9tIG1lbW9yeSBzdHJpbmcgKi8KKwkJaWYgKCh4ID0gKm1lbXB0cisrKSA9PSAnXDAnKSAvKiBFbmQgb2Ygc3RyaW5nIG1lYW5zIEVPRiAqLworCQkgIGZpcnN0ID0gLTE7CQkvKiBGbGFnIEVPRiBmb3IgbmV4dCB0aW1lLiAqLworCQlybmV4dCA9IChDSEFSKSAoeCAmIGZtYXNrKTsgLyogQXBwbHkgZmlsZSBtYXNrICovCisJICAgIH0gZWxzZSBpZiAoZnVuY3N0cikgewkvKiBHZXQgbmV4dCBjaGFyIGZyb20gZnVuY3Rpb24gKi8KKwkJaWYgKCh4ID0gKCpmdW5jcHRyKSgpKSA8IDApIC8qIEVuZCBvZiBzdHJpbmcgbWVhbnMgRU9GICovCisJCSAgZmlyc3QgPSAtMTsJCS8qIEZsYWcgRU9GIGZvciBuZXh0IHRpbWUuICovCisJCXJuZXh0ID0gKENIQVIpICh4ICYgZm1hc2spOyAvKiBBcHBseSBmaWxlIG1hc2sgKi8KKwkgICAgfSBlbHNlIHsJCQkvKiBGcm9tIGZpbGUuLi4gKi8KKyNpZm5kZWYgTk9DU0VUUworCQlpZiAoeGxhdGUgJiYgIWJpbmFyeSkgewkvKiBDb3VsZCBiZSBVbmljb2RlICovCisJCSAgICBpZiAoeGxhdHlwZSA9PSBYTEFfVU5JQ09ERSkgeworCQkJLyogR2V0IG5leHQgdHJhbnNsYXRlZCBieXRlICovCisJCQl4ID0geGduYnl0ZShjc2VxdGFiW3RjaGFyc2V0XSxmY2hhcnNldCxOVUxMKTsKKwkJICAgIH0gZWxzZSB7CQkvKiBOb3QgVW5pY29kZSAqLworCQkJeCA9IHptaW5jaGFyKCk7IC8qIEdldCBuZXh0IGJ5dGUsIHRyYW5zbGF0ZSBiZWxvdyAqLworCQkJLyogZGVidWcoRjEwMSwieGduYnl0ZSBCIHptaW5jaGFyIiwiIix4KTsgKi8KKwkJICAgIH0KKwkJfSBlbHNlIHsJCS8qIEp1c3QgZ2V0IG5leHQgYnl0ZSAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKwkJICAgIHggPSB6bWluY2hhcigpOworCQkgICAgLyogZGVidWcoRjEwMSwieGduYnl0ZSBDIHptaW5jaGFyIiwiIix4KTsgKi8KKyNpZm5kZWYgTk9DU0VUUworCQl9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCQlpZiAoeCA8IDApIHsJCS8qIENoZWNrIGZvciBFT0YgKi8KKwkJICAgIGlmICh4ID09IC0zKSB7CS8qIFRpbWVvdXQgcmVhZGluZyBmcm9tIHBpcGUgKi8KKwkJCXQgPSBydDsKKwkJCXNpemUgPSAoZHAtZGF0YSk7CisJCQlkZWJ1ZyhGMTAxLCJnZXRwa3QgdGltZW91dCBzaXplIiwiIixzaXplKTsKKwkJCXJldHVybigoc2l6ZSA9PSAwKSA/IHggOiBzaXplKTsKKwkJICAgIH0KKwkJICAgIGZpcnN0ID0gLTE7CQkvKiBGbGFnIGVvZiBmb3IgbmV4dCB0aW1lLiAqLworCQkgICAgaWYgKHggPT0gLTIpIGN4c2VlbiA9IDE7IC8qIElmIGVycm9yLCBjYW5jZWwgdGhpcyBmaWxlLiAqLworCQl9CisJCXJuZXh0ID0gKENIQVIpICh4ICYgZm1hc2spOyAvKiBBcHBseSBmaWxlIG1hc2sgKi8KKyNpZm5kZWYgTk9DU0VUUworCQlpZiAoeGxhdHlwZSAhPSBYTEFfVU5JQ09ERSkgeworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKwkJICAgIGZmYysrOworI2lmbmRlZiBOT0NTRVRTCisJCSAgICBpZiAoc3gpCisJCSAgICAgIHJ0ID0gKCpzeCkocnQpOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKwkJICAgIGlmIChkb2NyYyAmJiAod2hhdCAmIFdfU0VORCkpCisJCSAgICAgIGRvZmlsY3JjKHgpOworCisjaWZuZGVmIE5PQ1NFVFMKKwkJfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKwkgICAgfQorI2lmZGVmIEtBTkpJCisJfQorI2VuZGlmIC8qIEtBTkpJICovCisvKgorICBBdCB0aGlzIHBvaW50LCB0aGUgY2hhcmFjdGVyIHdlIGp1c3QgcmVhZCBpcyBpbiBybmV4dCwKKyAgYW5kIHRoZSBjaGFyYWN0ZXIgd2UgYXJlIGFib3V0IHRvIGVuY29kZSBpbnRvIHRoZSBwYWNrZXQgaXMgaW4gcnQuCisqLworCW9kcCA9IGRwOwkJCS8qIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQuICovCisgCXh4bHMgPSB4eGRsID0geHhyYyA9IHh4c3MgPSB4eGNxID0gTlVMOwkvKiBDbGVhciB0aGVzZS4gKi8KKy8qCisgIE5vdyBlbmNvZGUgdGhlIGNoYXJhY3RlciBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMgdGhhdCBhcmUgaW4gZWZmZWN0OgorICAgIGN0bHBbXTogd2hldGhlciB0aGlzIGNvbnRyb2wgY2hhcmFjdGVyIG5lZWRzIHByZWZpeGluZy4KKyAgICBiaW5hcnk6IHRleHQgb3IgYmluYXJ5IG1vZGUuCisgICAgcnB0ZmxnOiByZXBlYXQgY291bnRzIGVuYWJsZWQuCisgICAgZWJxZmxnOiA4dGgtYml0IHByZWZpeGluZyBlbmFibGVkLgorICAgIGxzY2FwdTogbG9ja2luZyBzaGlmdHMgZW5hYmxlZC4KKyovCisJaWYgKHJwdGZsZykgewkJCS8qIFJlcGVhdCBwcm9jZXNzaW5nIGlzIG9uPyAqLworCSAgICBpZiAoIXVmbGFnICYmCisJCS8qCisJCSAqIElmIHRoZSBuZXh0IGNoYXIgaXMgcmVhbGx5IENSTEYsIHRoZW4gd2UgY2Fubm90CisJCSAqIGJlIGRvaW5nIGEgcmVwZWF0ICh1bmxlc3MgQ1IsQ1IsTEYgd2hpY2ggYmVjb21lcworCQkgKiAifiA8bi0xPiBDUiBDUiBMRiIsIHdoaWNoIGlzIE9LIGJ1dCBub3QgbW9zdCBlZmZpY2llbnQpLgorCQkgKiBJIGp1c3QgcGxhaW4gZG9uJ3Qgd29ycnkgYWJvdXQgdGhpcyBjYXNlLiAgVGhlIGFjdHVhbAorCQkgKiBjb252ZXJzaW9uIGZyb20gTkwgdG8gQ1JMRiBpcyBkb25lIGFmdGVyIHRoZSBycHRmbGcgaWYuLi4KKwkJICovCisJCSghZmVvbCB8fCBiaW5hcnkgfHwgKGZlb2wgJiYgKHJuZXh0ICE9IGZlb2wpKSkgJiYKKwkJKHJ0ID09IHJuZXh0KSAmJiAoZmlyc3QgPT0gMCkpIHsgLyogR290IGEgcnVuLi4uICovCisJCWlmICgrK3JwdCA8IDk0KSB7CS8qIEJlbG93IG1heCwganVzdCBjb3VudCAqLworCQkgICAgY29udGludWU7CQkvKiBnbyBiYWNrIGFuZCBnZXQgYW5vdGhlciAqLworCQl9IGVsc2UgaWYgKHJwdCA9PSA5NCkgewkvKiBSZWFjaGVkIG1heCwgbXVzdCBkdW1wICovCisJCSAgICB4eHJjID0gKENIQVIpIHRvY2hhcihycHQpOyAvKiBQdXQgdGhlIHJlcGVhdCBjb3VudCBoZXJlICovCisJCSAgICBycHRuICs9IHJwdDsJLyogQWNjdW11bGF0ZSBpdCBmb3Igc3RhdGlzdGljcyAqLworCQkgICAgcnB0ID0gMDsJCS8qIEFuZCByZXNldCBpdCAqLworCQl9CisJICAgIH0gZWxzZSBpZiAocnB0ID4gMSkgewkvKiBNb3JlIHRoYW4gdHdvICovCisJCXh4cmMgPSAoQ0hBUikgdG9jaGFyKCsrcnB0KTsgLyogYW5kIGNvdW50LiAqLworCQlycHRuICs9IHJwdDsKKwkJcnB0ID0gMDsJCS8qIFJlc2V0IHJlcGVhdCBjb3VudGVyLiAqLworCSAgICB9CisJICAgIC8qCisJICAgICAgSWYgKHJwdCA9PSAxKSB3ZSBtdXN0IGVuY29kZSBleGFjdGx5IHR3byBjaGFyYWN0ZXJzLgorCSAgICAgIFRoaXMgaXMgZG9uZSBsYXRlciwgYWZ0ZXIgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBlbmNvZGVkLgorCSAgICAqLworCX0KKwkvKiBJZiBpdCdzIHRoZSBuZXdsaW5lIGNoYXJhY3Rlci4uLiAqLworCWlmICghdWZsYWcgJiYgIWJpbmFyeSAmJiBmZW9sICYmIChydCA9PSBmZW9sKSkgeworCSAgICBpZiAobHNjYXB1ICYmIGxzc3RhdGUpIHsJLyogSWYgU0hJRlQtU1RBVEUgaXMgU0hJRlRFRCAqLworCQlpZiAoZWJxZmxnKSB7CQkvKiBJZiBzaW5nbGUgc2hpZnRzIGVuYWJsZWQsICovCisJCSAgICAqZHArKyA9IChDSEFSKSBlYnE7CS8qIGluc2VydCBhIHNpbmdsZSBzaGlmdC4gKi8KKwkJfSBlbHNlIHsJCS8qIE90aGVyd2lzZSBtdXN0IHNoaWZ0IGluLiAqLworCQkgICAgKmRwKysgPSBteWN0bHE7CS8qIEluc2VydCBzaGlmdC1vdXQgY29kZSAqLworCQkgICAgKmRwKysgPSAnTyc7CisJCSAgICBsc3N0YXRlID0gMDsJLyogQ2hhbmdlIHNoaWZ0IHN0YXRlICovCisJCX0KKwkgICAgfQorI2lmZGVmIENLX1NQRUVECisJICAgIGlmIChjdGxwW0NSXSkgeworCQkqZHArKyA9IG15Y3RscTsJCS8qIEluc2VydCBjYXJyaWFnZSByZXR1cm4gZGlyZWN0bHkgKi8KKwkJKmRwKysgPSAnTSc7CisJCWNjcCsrOworCSAgICB9IGVsc2UgeworCQkqZHArKyA9IENSOwkJLyogUGVyaGFwcyBsaXRlcmFsbHkgKi8KKwkJY2N1Kys7CisJICAgIH0KKyNlbHNlIC8qICFDS19TUEVFRCAqLworCSAgICAqZHArKyA9IG15Y3RscTsJCS8qIEluc2VydCBjYXJyaWFnZSByZXR1cm4gZGlyZWN0bHkgKi8KKwkgICAgKmRwKysgPSAnTSc7CisJICAgIGNjcCsrOworI2VuZGlmIC8qIENLX1NQRUVEICovCisJICAgIHJ0ID0gTEY7CQkJLyogTm93IG1ha2UgbmV4dCBjaGFyIGJlIGxpbmVmZWVkLiAqLworCX0KKy8qCisgIE5vdyBoYW5kbGUgdGhlIDh0aCBiaXQgb2YgdGhlIGZpbGUgY2hhcmFjdGVyLiAgSWYgd2UgaGF2ZSBhbiA4LWJpdAorICBjb25uZWN0aW9uLCB3ZSBwcmVzZXJ2ZSB0aGUgOHRoIGJpdC4gIElmIHdlIGhhdmUgYSA3LWJpdCBjb25uZWN0aW9uLAorICB3ZSBlbXBsb3kgZWl0aGVyIHNpbmdsZSBvciBsb2NraW5nIHNoaWZ0cyAoaWYgdGhleSBhcmUgZW5hYmxlZCkuCisqLworCWE3ID0gcnQgJiAwMTc3OwkJCS8qIEdldCBsb3cgNyBiaXRzIG9mIGNoYXJhY3RlciAqLworCWlmIChydCAmIDAyMDApIHsJCS8qIDgtYml0IGNoYXJhY3Rlcj8gKi8KKwkgICAgaWYgKGxzY2FwdSkgewkJLyogTG9ja2luZyBzaGlmdHMgZW5hYmxlZD8gKi8KKwkJaWYgKCFsc3N0YXRlKSB7CQkvKiBOb3QgY3VycmVudGx5IHNoaWZ0ZWQ/ICovCisJCSAgICB4ID0gbHNsb29rKDAyMDApOwkvKiBMb29rIGFoZWFkICovCisJCSAgICBpZiAoeCAhPSAwIHx8IGVicWZsZyA9PSAwKSB7IC8qIExvY2tpbmcgc2hpZnQgZGVjaXNpb24gKi8KKwkJCXh4bHMgPSAnTic7CSAgIC8qIE5lZWQgbG9ja2luZyBzaGlmdC1vdXQgKi8KKwkJCWxzc3RhdGUgPSAxOwkgICAvKiBhbmQgY2hhbmdlIHRvIHNoaWZ0ZWQgc3RhdGUgKi8KKwkJICAgIH0gZWxzZSBpZiAoZWJxZmxnKSB7ICAgLyogTm90IHdvcnRoIGl0ICovCisJCQl4eHNzID0gKENIQVIpIGVicTsgLyogVXNlIHNpbmdsZSBzaGlmdCAqLworCQkgICAgfQorCQl9CisJCXJ0ID0gKENIQVIpIGE3OwkJLyogUmVwbGFjZSBjaGFyYWN0ZXIgYnkgNy1iaXQgdmFsdWUgKi8KKwkgICAgfSBlbHNlIGlmIChlYnFmbGcpIHsJLyogOHRoIGJpdCBwcmVmaXhpbmcgaXMgb24/ICovCisJCXh4c3MgPSAoQ0hBUikgZWJxOwkvKiBJbnNlcnQgc2luZ2xlIHNoaWZ0ICovCisJCXJ0ID0gKENIQVIpIGE3OwkJLyogUmVwbGFjZSBjaGFyYWN0ZXIgYnkgNy1iaXQgdmFsdWUgKi8KKwkgICAgfQorLyoKKyAgSW4gY2FzZSB3ZSBoYXZlIGEgNy1iaXQgY29ubmVjdGlvbiBhbmQgdGhpcyBpcyBhbiA4LWJpdCBjaGFyYWN0ZXIsIEFORAorICBuZWl0aGVyIGxvY2tpbmcgc2hpZnRzIG5vciBzaW5nbGUgc2hpZnRzIGFyZSBlbmFibGVkLCB0aGVuIHRoZSBjaGFyYWN0ZXIncworICA4dGggYml0IHdpbGwgYmUgZGVzdHJveWVkIGluIHRyYW5zbWlzc2lvbiwgYW5kIGEgYmxvY2sgY2hlY2sgZXJyb3Igd2lsbAorICBvY2N1ci4KKyovCisJfSBlbHNlIGlmIChsc2NhcHUpIHsJCS8qIDctYml0IGNoYXJhY3RlciAqLworCisJICAgIGlmIChsc3N0YXRlKSB7CQkvKiBDb21lcyB3aGlsZSBzaGlmdGVkIG91dD8gKi8KKwkJeCA9IGxzbG9vaygwKTsJCS8qIFllcywgbG9vayBhaGVhZCAqLworCQlpZiAoeCB8fCBlYnFmbGcgPT0gMCkgewkvKiBUaW1lIHRvIHNoaWZ0IGluLiAqLworCQkgICAgeHhscyA9ICdPJzsJCS8qIFNldCBzaGlmdC1pbiBjb2RlICovCisJCSAgICBsc3N0YXRlID0gMDsJLyogRXhpdCBzaGlmdGVkIHN0YXRlICovCisJCX0gZWxzZSBpZiAoZWJxZmxnKSB7CS8qIE5vdCB3b3J0aCBpdCwgc3RheSBzaGlmdGVkIG91dCAqLworCQkgICAgeHhzcyA9IChDSEFSKSBlYnE7CS8qIEluc2VydCBzaW5nbGUgc2hpZnQgKi8KKwkJfQorCSAgICB9CisJfQorCS8qIElmIGRhdGEgY2hhcmFjdGVyIGlzIHNpZ25pZmljYW50IHRvIGxvY2tpbmcgc2hpZnQgcHJvdG9jb2wuLi4gKi8KKwlpZiAobHNjYXB1ICYmIChhNyA9PSBTTyB8fCBhNyA9PSBTSSB8fCBhNyA9PSBETEUpKQorCSAgeHhkbCA9ICdQJzsJCQkvKiBJbnNlcnQgZGF0YWxpbmsgZXNjYXBlICovCisKKwlpZiAoCisjaWZkZWYgQ0tfU1BFRUQKKwkgICAgLyoKKwkgICAgICBUaHdhcnQgWUVUIEFOT1RIRVIgdW53YW50ZWQsIHVubmVlZGVkLCBhbmQgdW5sb3ZlZCBzaWduCisJICAgICAgZXh0ZW5zaW9uLiAgVGhpcyBvbmUgd2FzIHBhcnRpY3VsYXJseSBuYXN0eSBiZWNhdXNlIGl0IHByZXZlbnRlZAorCSAgICAgIDI1NSAoVGVsbmV0IElBQykgZnJvbSBiZWluZyBwcmVmaXhlZCBvbiBzb21lIHBsYXRmb3JtcyAtLSBlLmcuCisJICAgICAgVk1TIHdpdGggVkFYIEMgLS0gYnV0IG5vdCBvdGhlcnMsIHRodXMgY2F1c2luZyBmaWxlIHRyYW5zZmVycyB0bworCSAgICAgIGZhaWwgb24gVGVsbmV0IGNvbm5lY3Rpb25zIGJ5IHNlbmRpbmcgYmFyZSBJQUNzLiAgTm90IHRvIG1lbnRpb24KKwkgICAgICB0aGUgc3RyYXkgbWVtb3J5IHJlZmVyZW5jZS4gIFNpZ25lZCBjaGFycyBhcmUgYSBCQUQgaWRlYS4KKwkgICAgKi8KKwkgICAgY3RscFsodW5zaWduZWQpKHJ0ICYgMHhmZildCS8qIExvcCBvZmYgYW55ICJzaWduIiBleHRlbnNpb24gKi8KKyNlbHNlCisJICAgIChhNyA8IFNQKSB8fCAoYTcgPT0gREVMKQorI2VuZGlmIC8qIENLX1NQRUVEICovCisJICAgICkgewkJCQkvKiBEbyBjb250cm9sIHByZWZpeGluZyBpZiBuZWNlc3NhcnkgKi8KKwkgICAgeHhjcSA9IG15Y3RscTsJCS8qIFRoZSBwcmVmaXggKi8KKwkgICAgY2NwKys7CQkJLyogQ291bnQgaXQgKi8KKwkgICAgcnQgPSAoQ0hBUikgY3RsKHJ0KTsJLyogVW5jb250cm9sbGlmeSB0aGUgY2hhcmFjdGVyICovCisJfQorI2lmZGVmIENLX1NQRUVECisJZWxzZSBpZiAoKGE3IDwgU1ApIHx8IChhNyA9PSBERUwpKSAvKiBDb3VudCBhbiB1bnByZWZpeGVkIG9uZSAqLworCSAgY2N1Kys7CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKworCWlmIChhNyA9PSBteWN0bHEpCQkvKiBBbHdheXMgcHJlZml4IHRoZSBjb250cm9sIHByZWZpeCAqLworCSAgeHhjcSA9IG15Y3RscTsKKworCWlmICgocnB0ZmxnKSAmJiAoYTcgPT0gcnB0cSkpCS8qIElmIGl0J3MgdGhlIHJlcGVhdCBwcmVmaXgsICovCisJICB4eGNxID0gbXljdGxxOwkJLyogcHJlZml4IGl0IGlmIGRvaW5nIHJlcGVhdCBjb3VudHMgKi8KKworCWlmICgoZWJxZmxnKSAmJiAoYTcgPT0gZWJxKSkJLyogUHJlZml4IHRoZSA4dGgtYml0IHByZWZpeCAqLworCSAgeHhjcSA9IG15Y3RscTsJCS8qIGlmIGRvaW5nIDh0aC1iaXQgcHJlZml4ZXMgKi8KKworLyogTm93IGNvbnN0cnVjdCB0aGUgZW50aXJlIHNlcXVlbmNlICovCisKKwlpZiAoeHhscykgeyAqZHArKyA9IG15Y3RscTsgKmRwKysgPSB4eGxzOyB9IC8qIExvY2tpbmcgc2hpZnQgKi8KKwlvZHAyID0gZHA7CQkJCSAgICAvKiAoU2F2ZSB0aGlzIHBsYWNlKSAqLworCWlmICh4eGRsKSB7ICpkcCsrID0gbXljdGxxOyAqZHArKyA9IHh4ZGw7IH0gLyogRGF0YWxpbmsgZXNjYXBlICovCisJaWYgKHh4cmMpIHsgKmRwKysgPSAoQ0hBUikgcnB0cTsgKmRwKysgPSB4eHJjOyB9IC8qIFJlcGVhdCBjb3VudCAqLworCWlmICh4eHNzKSB7ICpkcCsrID0gKENIQVIpIGVicTsgfSAgICAgICAgICAgLyogU2luZ2xlIHNoaWZ0ICovCisJaWYgKHh4Y3EpIHsgKmRwKysgPSBteWN0bHE7IH0JICAgIAkgICAgLyogQ29udHJvbCBwcmVmaXggKi8KKwkqZHArKyA9IHJ0OwkJCS8qIEZpbmFsbHksIHRoZSBjaGFyYWN0ZXIgaXRzZWxmICovCisKKwlpZiAocnB0ID09IDEpIHsJCQkvKiBFeGFjdGx5IHR3byBjb3BpZXM/ICovCisJICAgIHJwdCA9IDA7CisJICAgIHAyID0gZHA7CQkJLyogU2F2ZSBwbGFjZSB0ZW1wb3JhcmlseSAqLworCSAgICBmb3IgKHAxID0gb2RwMjsgcDEgPCBwMjsgcDErKykgLyogQ29weSB0aGUgb2xkIGNoYXJzIG92ZXIgYWdhaW4gKi8KKwkgICAgICAqZHArKyA9ICpwMTsKKwkgICAgaWYgKChwMi1kYXRhKSA8PSBidWZtYXgpIG9kcCA9IHAyOyAvKiBDaGVjayBwYWNrZXQgYm91bmRzICovCisJICAgIGlmICgocDItZGF0YSkgPCBidWZtYXgpIG9kcCA9IHAyOyAvKiBDaGVjayBwYWNrZXQgYm91bmRzICovCisJfQorCXJ0ID0gcm5leHQ7CQkJLyogTmV4dCBjaGFyYWN0ZXIgaXMgbm93IGN1cnJlbnQuICovCisKKy8qIERvbmUgZW5jb2RpbmcgdGhlIGNoYXJhY3Rlci4gIE5vdyB0YWtlIGNhcmUgb2YgcGFja2V0IGJ1ZmZlciBvdmVyZmxvdy4gKi8KKworCWlmICgoZHAtZGF0YSkgPj0gYnVmbWF4KSB7CS8qIElmIHRvbyBiaWcsIHNhdmUgc29tZSBmb3IgbmV4dC4gKi8KKworCSAgICBkZWJ1ZyhGMDAwLCJnZXRwa3QgRU9QIiwiIixydCk7CisKKwkgICAgc2l6ZSA9IChkcC1kYXRhKTsJCS8qIENhbGN1bGF0ZSB0aGUgc2l6ZS4gKi8KKwkgICAgKmRwID0gJ1wwJzsJCQkvKiBNYXJrIHRoZSBlbmQuICovCisJICAgIGlmIChtZW1zdHIpIHsJCS8qIE5vIGxlZnRvdmVycyBmb3IgbWVtb3J5IHN0cmluZ3MgKi8KKwkJaWYgKHJ0KQkJCS8qIENoYXIgd2UgZGlkbid0IGVuY29kZSB5ZXQgKi8KKwkJICBtZW1wdHItLTsJCS8qIChmb3IgZW5jc3RyKCkpICovCisJCXJldHVybihzaXplKTsKKwkgICAgfQorCSAgICBpZiAoKGRwLWRhdGEpID4gYnVmbWF4KSB7CS8qIGlmIHBhY2tldCBpcyBvdmVyZnVsbCAqLworCQkvKiBjb3B5IHRoZSBwYXJ0IHRoYXQgZG9lc24ndCBmaXQgaW50byB0aGUgbGVmdG92ZXIgYnVmZmVyLCAqLworCQkvKiB0YWtpbmcgY2FyZSBub3QgdG8gc3BsaXQgYSBwcmVmaXhlZCBzZXF1ZW5jZS4gKi8KKwkJaW50IGk7CisJCW5sZWZ0ID0gZHAgLSBvZHA7CisJCWZvciAoaSA9IDAsIHAxID0gbGVmdG92ZXIsIHAyID0gb2RwOyBpIDwgbmxlZnQ7IGkrKykgeworCQkgICAgKnAxKysgPSAqcDIrKzsKKwkJICAgIGlmIChtZW1zdHIpIG1lbXB0ci0tOyAvKiAoZm9yIGVuY3N0cikgKi8KKwkJfQorCQlkZWJ1ZyhGMTExLCJnZXRwa3QgbGVmdG92ZXIiLGxlZnRvdmVyLHNpemUpOworCQlkZWJ1ZyhGMTAxLCJnZXRwa3Qgb3NpemUiLCIiLChvZHAtZGF0YSkpOworCQlzaXplID0gKG9kcC1kYXRhKTsJLyogUmV0dXJuIHRydW5jYXRlZCBwYWNrZXQuICovCisJCSpvZHAgPSAnXDAnOwkJLyogTWFyayB0aGUgbmV3IGVuZCAqLworCSAgICB9CisJICAgIHQgPSBydDsJCQkvKiBTYXZlIGZvciBuZXh0IHRpbWUgKi8KKwkgICAgcmV0dXJuKHNpemUpOworCX0KKyAgICB9CQkJCQkvKiBPdGhlcndpc2UsIGtlZXAgZmlsbGluZy4gKi8KKyAgICBzaXplID0gKGRwLWRhdGEpOwkJCS8qIEVuZCBvZiBmaWxlICovCisgICAgKmRwID0gJ1wwJzsJCQkJLyogTWFyayB0aGUgZW5kIG9mIHRoZSBkYXRhLiAqLworICAgIGRlYnVnKEYxMTEsImdldHBrdCBlb2YvZW90IixkYXRhLHNpemUpOyAvKiBGZWxsIHRocnUgYmVmb3JlIHBhY2tldCBmdWxsLCAqLworICAgIHJldHVybihzaXplKTsJCSAgICAgLyogcmV0dXJuIHBhcnRpYWxseSBmaWxsZWQgbGFzdCBwYWNrZXQuICovCit9CisKKy8qICBUIEkgTiBJIFQgIC0tICBJbml0aWFsaXplIGEgdHJhbnNhY3Rpb24gICovCisKK2ludCBlcGt0cmN2ZCA9IDAsIGVwa3RzZW50ID0gMDsKKworLyoKKyAgQ2FsbCB3aXRoIDEgdG8gcmVzZXQgZXZlcnl0aGluZyBiZWZvcmUgUy9JL1kgbmVnb3RpYXRpb24sIG9yIDAgdG8KKyAgcmVzZXQgb25seSB0aGUgdGhpbmdzIHRoYXQgYXJlIG5vdCBzZXQgaW4gdGhlIFMvSS9ZIG5lZ290aWF0aW9uLgorICBSZXR1cm5zIC0xIG9uIGZhaWx1cmUgKGUuZy4gdG8gY3JlYXRlIHBhY2tldCBidWZmZXJzKSwgMCBvbiBzdWNjZXNzLgorKi8KK2ludAordGluaXQoZmxhZykgaW50IGZsYWc7IHsKKyAgICBpbnQgeDsKKyNpZmRlZiBDS19USU1FUlMKKyAgICBleHRlcm4gaW50IHJ0dGZsZzsKKyNlbmRpZiAvKiBDS19USU1FUlMgKi8KKyAgICBleHRlcm4gaW50IHJjdnRpbW87CisgICAgZXh0ZXJuIGludCBmYXRhbGlvOworCisgICAgZGVidWcoRjEwMSwidGluaXQgZmxhZyIsIiIsZmxhZyk7CisKKyAgICAqZXBrdG1zZyA9IE5VTDsKKyAgICBlcGt0cmN2ZCA9IDA7CisgICAgZXBrdHNlbnQgPSAwOworICAgIG9mcGVybXMgPSAiIjsKKyAgICBkaXJhY3RpdmUgPSAwOwkJCS8qIERJUiAvIFJFTU9URSBESVIgbm90IGFjdGl2ZSAqLworICAgIGludGVycnVwdGVkID0gMDsJCQkvKiBOb3QgaW50ZXJydXB0ZWQgKi8KKyAgICBmYXRhbGlvID0gMDsJCQkvKiBObyBmYXRhbCBpL28gZXJyb3IgKi8KKyAgICBpZiAoc2VydmVyKSB7CisJbW92aW5nICA9IDA7CisJcGlwZXNlbmQgPSAwOyAvKiBUaGlzIHRha2VzIGNhcmUgb2YgbXVsdGlwbGUgR0VUcyBzZW50IHRvIGEgc2VydmVyLiAqLworICAgIH0KKyAgICBiZXN0bGVuID0gMDsJCQkvKiBGb3IgcGFja2V0IGxlbmd0aCBvcHRpbWl6YXRpb24gKi8KKyAgICBtYXhzZW5kID0gMDsJCQkvKiBCaWdnZXN0IGRhdGEgZmllbGQgd2UgY2FuIHNlbmQgKi8KKyNpZmRlZiBTVFJFQU1JTkcKKyAgICBzdHJlYW1vayA9IDA7CQkJLyogU3RyZWFtaW5nIG5lZ290aWF0ZWQgKi8KKyAgICBzdHJlYW1pbmcgPSAwOwkJCS8qIFN0cmVhbWluZyBiZWluZyBkb25lIG5vdyAqLworI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCisgICAgYmluYXJ5ID0gYl9zYXZlOwkJCS8qIC4uLiAqLworICAgIGduZl9iaW5hcnkgPSBiaW5hcnk7CQkvKiBQZXItZmlsZSB0cmFuc2ZlciBtb2RlICovCisgICAgcmV0cmFucyA9IDA7CQkJLyogUGFja2V0IHJldHJhbnNtaXNzaW9uIGNvdW50ICovCisgICAgc25kdHlwID0gMDsJCQkJLyogTm8gcHJldmlvdXMgcGFja2V0ICovCisgICAgeGZsZyA9IDA7CQkJCS8qIFJlc2V0IHgtcGFja2V0IGZsYWcgKi8KKyAgICBtZW1zdHIgPSAwOwkJCQkvKiBSZXNldCBtZW1vcnktc3RyaW5nIGZsYWcgKi8KKyAgICBtZW1wdHIgPSBOVUxMOwkJCS8qICBhbmQgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICBmdW5jc3RyID0gMDsJCQkvKiBSZXNldCAicmVhZCBmcm9tIGZ1bmN0aW9uIiBmbGFnICovCisgICAgZnVuY3B0ciA9IE5VTEw7CQkJLyogIGFuZCBmdW5jdGlvbiBwb2ludGVyICovCisgICAgYXV0b3BhciA9IDA7CQkJLyogQXV0b21hdGljIHBhcml0eSBkZXRlY3Rpb24gZmxhZyAqLworCisgICAgLyogVGhpcyBzdHVmZiBpcyBvbmx5IGZvciBCRUZPUkUgUy9JL1kgbmVnb3RpYXRpb24sIG5vdCBhZnRlciAqLworCisgICAgaWYgKGZsYWcpIHsKKwliY3R1ID0gYmN0bCA9IDE7CQkvKiBSZXNldCBibG9jayBjaGVjayB0eXBlIHRvIDEgKi8KKwlteWluaXRbMF0gPSAnXDAnOwkJLyogSGF2ZW4ndCBzZW50IGluaXQgc3RyaW5nIHlldCAqLworCXJxZiA9IC0xOwkJCS8qIFJlc2V0IDh0aC1iaXQtcXVvdGUgcmVxdWVzdCBmbGFnICovCisJZWJxID0gTVlFQlE7CQkJLyogUmVzZXQgOHRoLWJpdCBxdW90aW5nIHN0dWZmICovCisJZWJxZmxnID0gMDsJCQkvKiA4dGggYml0IHF1b3Rpbmcgbm90IGVuYWJsZWQgKi8KKwllYnFzZW50ID0gMDsJCQkvKiBObyA4dGgtYml0IHByZWZpeCBiaWQgc2VudCB5ZXQgKi8KKwlzcSA9ICdZJzsJCQkvKiA4dGgtYml0IHByZWZpeCBiaWQgSSB1c3VhbGx5IHNlbmQgKi8KKwlzcHNpeiA9IHNwc2l6cjsJCQkvKiBJbml0aWFsIHNlbmQtcGFja2V0IHNpemUgKi8KKwlkZWJ1ZyhGMTAxLCJ0aW5pdCBzcHNpeiIsIiIsc3BzaXopOworCXdzbG90cyA9IDE7CQkJLyogT25lIHdpbmRvdyBzbG90ICovCisJd3Nsb3RuID0gMTsJCQkvKiBObyB3aW5kb3cgbmVnb3RpYXRlZCB5ZXQgKi8KKwlqdXN0b25lID0gMDsJCQkvKiAoc2hvdWxkIHRoaXMgYmUgemVybydkIGhlcmU/KSAqLworCXdob2FyZXVbMF0gPSBOVUw7CQkvKiBQYXJ0bmVyJ3Mgc3lzdGVtIHR5cGUgKi8KKwlzeXNpbmRleCA9IC0xOworCXdlYXJlYWxpa2UgPSAwOworCXdoYXQgPSBXX0lOSVQ7CQkJLyogRG9pbmcgbm90aGluZyBzbyBmYXIuLi4gKi8KKyAgICB9CisgICAgZm5jbnYgPSBmX3NhdmU7CQkJLyogQmFjayB0byB3aGF0IHVzZXIgbGFzdCBzYWlkICovCisgICAgcGt0bnVtID0gMDsJCQkJLyogSW5pdGlhbCBwYWNrZXQgbnVtYmVyIHRvIHNlbmQgKi8KKyAgICBjeHNlZW4gPSBjenNlZW4gPSBkaXNjYXJkID0gMDsJLyogUmVzZXQgaW50ZXJydXB0IGZsYWdzICovCisgICAgKmZpbG5hbSA9ICdcMCc7CQkJLyogQ2xlYXIgZmlsZSBuYW1lICovCisgICAgc3BrdGwgPSAwOwkJCQkvKiBBbmQgaXRzIGxlbmd0aCAqLworICAgIG5ha3N0YXRlID0gMDsJCQkvKiBBc3N1bWUgd2UncmUgbm90IGluIGEgTkFLIHN0YXRlICovCisgICAgbnVtZXJycyA9IDA7CQkJLyogVHJhbnNtaXNzaW9uIGVycm9yIGNvdW50ZXIgKi8KKyAgICBpZGxldG1vID0gMDsJCQkvKiBObyBpZGxlIHRpbWVvdXQgeWV0ICovCisgICAgaWYgKHNlcnZlcikgeyAJCQkvKiBJZiBhY3RpbmcgYXMgc2VydmVyLCAqLworCWlmIChzcnZpZGwgPiAwKQkJCS8qIElmIGFuIGlkbGUgdGltZW91dCBpcyBnaXZlbiAqLworCSAgdGltaW50ID0gc3J2aWRsOworCWVsc2UKKwkgIHRpbWludCA9IHNydnRpbTsJCS8qIHVzZSBzZXJ2ZXIgdGltZW91dCBpbnRlcnZhbC4gKi8KKyAgICB9IGVsc2UgewkJCQkvKiBPdGhlcndpc2UgKi8KKwl0aW1pbnQgPSBjaGt0aW1vKHJ0aW1vLHRpbWVmKTsJLyogYW5kIHVzZSBsb2NhbCB0aW1lb3V0IHZhbHVlICovCisgICAgfQorICAgIGRlYnVnKEYxMDEsInRpbml0IHRpbWludCIsIiIsdGltaW50KTsKKworI2lmZGVmIENLX1RJTUVSUworICAgIGlmIChydHRmbGcgJiYgdGltaW50ID4gMCkJCS8qIFVzaW5nIHJvdW5kLXRyaXAgdGltZXJzPyAqLworICAgICAgcnR0aW5pdCgpOworICAgIGVsc2UKKyNlbmRpZiAvKiBDS19USU1FUlMgKi8KKyAgICAgIHJjdnRpbW8gPSB0aW1pbnQ7CisKKyAgICB3aW5sbyA9IDA7CQkJCS8qIFBhY2tldCAwIGlzIGF0IHdpbmRvdy1sb3cgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0aW5pdCB3aW5sbyIsIiIsd2lubG8pOworICAgIHggPSBta3NidWYoMSk7CQkJLyogTWFrZSBhIDEtc2xvdCBzZW5kLXBhY2tldCBidWZmZXIgKi8KKyAgICBpZiAoeCA8IDApIHJldHVybih4KTsKKyAgICB4ID0gZ2V0c2J1ZigwKTsJCQkvKiBBbGxvY2F0ZSBmaXJzdCBzZW5kLWJ1ZmZlci4gKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0aW5pdCBnZXRzYnVmIiwiIix4KTsKKyAgICBpZiAoeCA8IDApIHJldHVybih4KTsKKyAgICBkdW1wc2J1ZigpOworICAgIHggPSBta3JidWYod3Nsb3RzKTsJCQkvKiAmIGEgMS1zbG90IHJlY2VpdmUtcGFja2V0IGJ1ZmZlci4gKi8KKyAgICBpZiAoeCA8IDApIHJldHVybih4KTsKKyAgICBsc3N0YXRlID0gMDsJCQkvKiBJbml0aWFsaXplIGxvY2tpbmcgc2hpZnQgc3RhdGUgKi8KKyAgICBpZiAoYXV0b3BhdGgpIHsJCQkvKiBTRVQgUkVDRUlWRSBQQVRITkFNRVMgQVVUTyBmaXh1cCAqLworCWZucnBhdGggPSBQQVRIX0FVVE87CisJYXV0b3BhdGggPSAwOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKK1ZPSUQKK3BrdGluaXQoKSB7CQkJCS8qIEluaXRpYWxpemUgcGFja2V0IHNlcXVlbmNlICovCisgICAgcGt0bnVtID0gMDsJCQkJLyogbnVtYmVyICYgd2luZG93IGxvdy4gKi8KKyAgICB3aW5sbyA9IDA7CisgICAgZGVidWcoRjEwMSwicGt0aW5pdCB3aW5sbyIsIiIsd2lubG8pOworfQorCisvKiAgUiBJIE4gSSBUICAtLSAgUmVzcG9uZCB0byBTIG9yIEkgcGFja2V0ICAqLworCitWT0lECityaW5pdChkKSBDSEFSICpkOyB7CisgICAgY2hhciAqdHAgPSBOVUxMOworICAgIHp0aW1lKCZ0cCk7CisgICAgdGxvZyhGMTEwLCJUcmFuc2FjdGlvbiBiZWdpbnMiLHRwLDBMKTsgLyogTWFrZSB0cmFuc2FjdGlvbiBsb2cgZW50cnkgKi8KKyAgICB0bG9nKEYxMTAsIkdsb2JhbCBmaWxlIG1vZGU6IiwgYmluYXJ5ID8gImJpbmFyeSIgOiAidGV4dCIsIDBMKTsKKyAgICB0bG9nKEYxMTAsIkNvbGxpc2lvbiBhY3Rpb246IiwgZm5jbmFtW2ZuY2FjdF0sMCk7CisgICAgdGxvZyhGMTAwLCIiLCIiLDApOworICAgIGRlYnVnKEYxMDEsInJpbml0IGZuY2FjdCIsIiIsZm5jYWN0KTsKKyAgICBmaWxjbnQgPSBmaWxyZWogPSAwOwkJLyogSW5pdCBmaWxlIGNvdW50ZXJzICovCisgICAgc3BhcihkKTsKKyAgICBhY2sxKHJwYXIoKSk7CisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICBpZiAoKGxvY2FsKSAmJiAoIXF1aWV0KSkgICAgICAgICAgICAvKiBPbmx5IGRvIHRoaXMgaWYgbG9jYWwgJiBub3QgcXVpZXQgKi8KKyAgICAgICAgY29uc3RhX210KCk7ICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCB0aGUgYXN5bmNoIHJlYWQgdGFzayAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCit9CisKKworLyogIFIgRSBTIEUgVCBDICAtLSAgUmVzZXQgcGVyLXRyYW5zYWN0aW9uIGNoYXJhY3RlciBjb3VudGVycyAqLworCitWT0lECityZXNldGMoKSB7CisgICAgcnB0biA9IDA7CQkJCS8qIFJlcGVhdCBjb3VudHMgKi8KKyAgICBmc2VjcyA9IGZsY2kgPSBmbGNvID0gMEw7CQkvKiBGaWxlIGNoYXJzIGluIGFuZCBvdXQgKi8KKyNpZmRlZiBHRlRJTUVSCisgICAgZnBmc2VjcyA9IDAuMDsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgdGZjID0gdGxjaSA9IHRsY28gPSAwTDsJCS8qIFRvdGFsIGZpbGUsIGxpbmUgY2hhcnMgaW4gJiBvdXQgKi8KKyAgICBjY3UgPSBjY3AgPSAwTDsJCQkvKiBDb250cm9sLWNoYXIgc3RhdGlzdGljcyAqLworI2lmZGVmIENPTU1FTlQKKyAgICBmc2l6ZSA9IC0xTDsJCQkvKiBGaWxlIHNpemUgKi8KKyNlbHNlCisgICAgaWYgKCEod2hhdCAmIFdfU0VORCkpCisgICAgICBmc2l6ZSA9IC0xTDsKKyAgICBkZWJ1ZyhGMTAxLCJyZXNldGMgZnNpemUiLCIiLGZzaXplKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgdGltZW91dHMgPSByZXRyYW5zID0gMDsJCS8qIFRpbWVvdXRzLCByZXRyYW5zbWlzc2lvbnMgKi8KKyAgICBzcGFja2V0cyA9IHJwYWNrZXRzID0gMDsJCS8qIFBhY2tldCBjb3VudHMgb3V0ICYgaW4gKi8KKyAgICBjcnVuY2hlZCA9IDA7CQkJLyogQ3J1bmNoZWQgcGFja2V0cyAqLworICAgIHdjdXIgPSAwOwkJCQkvKiBDdXJyZW50IHdpbmRvdyBzaXplICovCisgICAgd21heCA9IDA7CQkJCS8qIE1heGltdW0gd2luZG93IHNpemUgdXNlZCAqLworICAgIHBlYWtjcHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlYWsgY2hhcnMgcGVyIHNlY29uZCAqLworfQorCisvKiAgUyBJIE4gSSBUICAtLSAgR2V0ICYgdmVyaWZ5IGZpcnN0IGZpbGUgbmFtZSwgdGhlbiBzZW5kIFNlbmQtSW5pdCBwYWNrZXQgKi8KKy8qCisgUmV0dXJuczoKKyAgIDEgaWYgc2VuZCBvcGVyYXRpb24gYmVnaW5zIHN1Y2Nlc3NmdWxseQorICAgMCBpZiBzZW5kIG9wZXJhdGlvbiBmYWlscworKi8KKyNpZmRlZiBEWU5BTUlDCitjaGFyICpjbWFyZ2J1ZiA9IE5VTEw7CisjZWxzZQorY2hhciBjbWFyZ2J1ZltDS01BWFBBVEgrMV07CisjZW5kaWYgLyogRFlOQU1JQyAqLworY2hhciAqY21hcmdwWzJdOworCitWT0lECitmbmxpc3QoKSB7CisgICAgaWYgKCFjYWxpYnJhdGUpCisgICAgICBzbmRzcmMgPSAobmZpbHMgPCAwKSA/IC0xIDogbmZpbHM7IC8qIFNvdXJjZSBmb3IgZmlsZW5hbWVzICovCisjaWZkZWYgRFlOQU1JQworICAgIGlmICghY21hcmdidWYgJiYgIShjbWFyZ2J1ZiA9IG1hbGxvYyhDS01BWFBBVEgrMSkpKQorICAgICAgZmF0YWwoImZubGlzdDogbm8gbWVtb3J5IGZvciBjbWFyZ2J1ZiIpOworI2VuZGlmIC8qIERZTkFNSUMgKi8KKyAgICBjbWFyZ2J1ZlswXSA9IE5VTDsJCQkvKiBJbml0aWFsaXplIG5hbWUgYnVmZmVyICovCisKKyAgICBkZWJ1ZyhGMTAxLCJmbmxpc3QgbmZpbHMiLCIiLG5maWxzKTsKKyAgICBkZWJ1ZyhGMTEwLCJmbmxpc3QgY21hcmciLGNtYXJnLDApOworICAgIGRlYnVnKEYxMTAsImZubGlzdCBjbWFyZzIiLGNtYXJnMiwwKTsKKyAgICBpZiAoIWNtYXJnMikgY21hcmcyID0gIiI7CisgICAgaWYgKG5maWxzID09IDApIHsJCQkvKiBTZW5kaW5nIGZyb20gc3RkaW4gb3IgbWVtb3J5LiAqLworCWlmICgoY21hcmcyICE9IE5VTEwpICYmICgqY21hcmcyKSkgeworCSAgICBjbWFyZyA9IGNtYXJnMjsJCS8qIElmIEYgcGFja2V0LCAiYXMtbmFtZSIgaXMgdXNlZCAqLworCSAgICBjbWFyZzIgPSAiIjsJCS8qIGlmIHByb3ZpZGVkICovCisJfSBlbHNlCisJICBjbWFyZyA9ICJzdGRpbiI7CQkvKiBvdGhlcndpc2UganVzdCB1c2UgInN0ZGluIiAqLworCWNrc3RybmNweShjbWFyZ2J1ZixjbWFyZyxDS01BWFBBVEgrMSk7CisJY21hcmdwWzBdID0gY21hcmdidWY7CisJY21hcmdwWzFdID0gIiI7CisJY21saXN0ID0gY21hcmdwOworCW5maWxzID0gMTsKKyAgICB9Cit9CisKK2ludAorc2luaXQoKSB7CisgICAgaW50IHg7CQkJCS8qIFdvcmtlciBpbnQgKi8KKyAgICBjaGFyICp0cCwgKnhwLCAqbTsJCQkvKiBXb3JrZXIgc3RyaW5nIHBvaW50ZXJzICovCisKKyAgICBmaWxjbnQgPSBmaWxyZWogPSAwOwkJLyogSW5pdGlhbGl6ZSBmaWxlIGNvdW50ZXJzICovCisKKyAgICBmbmxpc3QoKTsKKworICAgIHhwID0gIiI7CisgICAgaWYgKG5maWxzIDwgMCkgeworI2lmZGVmIFBJUEVTRU5ECisJaWYgKHVzZXBpcGVzICYmIHByb3RvY29sID09IFBST1RPX0sgJiYgKmNtYXJnID09ICchJykgeworCSAgICBwaXBlc2VuZCA9IDE7CisJICAgIGNtYXJnKys7CisJfQorI2VuZGlmIC8qIFBJUEVTRU5EICovCisJeHAgPSBjbWFyZzsKKyAgICB9IGVsc2UgeworI2lmbmRlZiBOT01TRU5ECisJaWYgKGFkZGxpc3QpCisJICB4cCA9IGZpbGVoZWFkLT5mbF9uYW1lOworCWVsc2UKKyNlbmRpZiAvKiBOT01TRU5EICovCisJICBpZiAoZmlsZWZpbGUpCisJICAgIHhwID0gZmlsZWZpbGU7CisJICBlbHNlIGlmIChjYWxpYnJhdGUpCisJICAgIHhwID0gIkNhbGlicmF0aW9uIjsKKwkgIGVsc2UKKwkgICAgeHAgPSAqY21saXN0OworICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJzaW5pdCB4cCIseHAsMCk7CisgICAgeCA9IGduZmlsZSgpOwkJCS8qIEdldCBmaXJzdCBmaWxlbmFtZS4gKi8KKyAgICBkZWJ1ZyhGMTExLCJzaW5pdCBnbmZpbGUiLGNraXRvYShnbmZlcnJvcikseCk7CisgICAgaWYgKHggPT0gMCkgeCA9IGduZmVycm9yOwkJLyogSWYgbm9uZSwgZ2V0IGVycm9yIHJlYXNvbiAqLworICAgIG0gPSBOVUxMOwkJCQkvKiBFcnJvciBtZXNzYWdlIHBvaW50ZXIgKi8KKyAgICBkZWJ1ZyhGMTAxLCJzaW5pdCBnbmZpbCIsIiIseCk7CisgICAgc3dpdGNoICh4KSB7CisgICAgICBjYXNlIC02OiBtID0gIk5vIGZpbGVzIG1lZXQgc2VsZWN0aW9uIGNyaXRlcmlhIjsgYnJlYWs7CisgICAgICBjYXNlIC01OiBtID0gIlRvbyBtYW55IGZpbGVzIG1hdGNoIHdpbGRjYXJkIjsgYnJlYWs7CisgICAgICBjYXNlIC00OiBtID0gIkNhbmNlbGxlZCI7IGJyZWFrOworICAgICAgY2FzZSAtMzogbSA9ICJSZWFkIGFjY2VzcyBkZW5pZWQiOyBicmVhazsKKyAgICAgIGNhc2UgLTI6IG0gPSAiRmlsZSBpcyBub3QgcmVhZGFibGUiOyBicmVhazsKKyNpZmRlZiBDT01NRU5UCisgICAgICBjYXNlIC0xOiBtID0gaXN3aWxkKGZpbG5hbSkgPyAiTm8gZmlsZXMgbWF0Y2giIDogIkZpbGUgbm90IGZvdW5kIjsKKwlicmVhazsKKyAgICAgIGNhc2UgIDA6IG0gPSAiTm8gZmlsZXNwZWMgZ2l2ZW4hIjsgYnJlYWs7CisjZWxzZQorICAgICAgY2FzZSAgMDoKKyAgICAgIGNhc2UgLTE6IG0gPSBpc3dpbGQoZmlsbmFtKSA/ICJObyBmaWxlcyBtYXRjaCIgOiAiRmlsZSBub3QgZm91bmQiOworCWJyZWFrOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgfQorICAgIGRlYnVnKEYxMDEsInNpbml0IG5maWxzIiwiIixuZmlscyk7CisgICAgZGVidWcoRjExMCwic2luaXQgZmlsbmFtIixmaWxuYW0sMCk7CisgICAgaWYgKHggPCAxKSB7CQkJLyogRGlkbid0IGdldCBhIGZpbGUuICovCisJZGVidWcoRjExMSwic2luaXQgbXNnIixtLHgpOworCWlmIChzZXJ2ZXIpIHsJCQkvKiBEb2luZyBHRVQgY29tbWFuZCAqLworCSAgICBlcnJwa3QoKENIQVIgKiltKTsJCS8qIHNvIHNlbmQgRXJyb3IgcGFja2V0LiAqLworCX0gZWxzZSBpZiAoIWxvY2FsKSB7IAkJLyogRG9pbmcgU0VORCBjb21tYW5kICovCisJICAgIGludGVycnVwdGVkID0gMTsJCS8qIChUbyBzdXBwcmVzcyBoaW50KSAqLworCSAgICBwcmludGYoIj8lc1xyXG4iLG0pOworCX0gZWxzZSB7CisJICAgIHh4c2NyZWVuKFNDUl9FTSwwLDBsLG0pOwkvKiBzbyBwcmludCBtZXNzYWdlLiAqLworCX0KKwl0bG9nKEYxMTAseHAsbSwwTCk7CQkvKiBNYWtlIHRyYW5zYWN0aW9uIGxvZyBlbnRyeS4gKi8KKwlmcmVlcmJ1Zihyc2VxdGJsWzBdKTsJCS8qIEZyZWUgdGhlIGJ1ZmZlciB0aGUgR0VUIGNhbWUgaW4uICovCisJcmV0dXJuKDApOwkJCS8qIFJldHVybiBmYWlsdXJlIGNvZGUgKi8KKyAgICB9CisgICAgaWYgKCFsb2NhbCAmJiAhc2VydmVyICYmIGNrZGVsYXkgPiAwKSAvKiBPUy05IHNsZWVwKDApID09IGluZmluaXRlICovCisgICAgICBzbGVlcChja2RlbGF5KTsJCQkvKiBEZWxheSBpZiByZXF1ZXN0ZWQgKi8KKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgIGlmICgobG9jYWwpICYmICghcXVpZXQpKSAgICAgICAgICAgIC8qIE9ubHkgZG8gdGhpcyBpZiBsb2NhbCAmIG5vdCBxdWlldCAqLworICAgICAgY29uc3RhX210KCk7CQkJLyogU3RhcnQgdGhlIGFzeW5jIHJlYWQgdGFzayAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisgICAgZnJlZXJidWYocnNlcXRibFswXSk7CQkvKiBGcmVlIHRoZSBidWZmZXIgdGhlIEdFVCBjYW1lIGluLiAqLworICAgIHNpcGt0KCdTJyk7CQkJCS8qIFNlbmQgdGhlIFNlbmQtSW5pdCBwYWNrZXQuICovCisgICAgenRpbWUoJnRwKTsJCQkJLyogR2V0IGN1cnJlbnQgZGF0ZS90aW1lICovCisgICAgdGxvZyhGMTEwLCJUcmFuc2FjdGlvbiBiZWdpbnMiLHRwLDBMKTsgLyogTWFrZSB0cmFuc2FjdGlvbiBsb2cgZW50cnkgKi8KKyAgICB0bG9nKEYxMTAsIkdsb2JhbCBmaWxlIG1vZGU6IiwgYmluYXJ5ID8gImJpbmFyeSIgOiAidGV4dCIsIDBMKTsKKyAgICB0bG9nKEYxMDAsIiIsIiIsMCk7CisgICAgZGVidWcoRjExMSwic2luaXQgb2siLGZpbG5hbSwwKTsKKyAgICByZXR1cm4oMSk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitzaXBrdChjaGFyIGMpCQkJCS8qIFNlbmQgUyBvciBJIHBhY2tldC4gKi8KKyNlbHNlCitzaXBrdChjKSBjaGFyIGM7CisjZW5kaWYKKy8qIHNpcGt0ICovIHsKKyAgICBDSEFSICpycDsgaW50IGssIHg7CisgICAgZXh0ZXJuIGludCBzZW5kaXBrdHM7CisgICAgZGVidWcoRjEwMSwic2lwa3QgcGt0bnVtIiwiIixwa3RudW0pOyAvKiAoYmV0dGVyIGJlIDAuLi4pICovCisgICAgdHRmbHVpKCk7CQkJCS8qIEZsdXNoIHBlbmRpbmcgaW5wdXQuICovCisgICAgLyoKKyAgICAgIElmIHRoaXMgaXMgYW4gSSBwYWNrZXQgYW5kIFNFVCBTRU5EIEktUEFDS0VUUyBpcyBPRkYsIGRvbid0IHNlbmQgaXQ7CisgICAgICBzZXQgc3N0YXRlIHRvICdZJyB3aGljaCBtYWtlcyB0aGUgbmV4dCBpbnB1dCgpIGNhbGwgcmV0dXJuICdZJyBhcyBpZiB3ZQorICAgICAgaGFkIHJlY2VpdmVkIGFuIEFDSyB0byB0aGUgSSBwYWNrZXQgd2UgZGlkbid0IHNlbmQuICBUaGlzIGlzIHRvIHdvcmsKKyAgICAgIGFyb3VuZCBidWdneSBLZXJtaXQgc2VydmVycyB0aGF0IGNhbid0IGhhbmRsZSBJIHBhY2tldHMuCisgICAgKi8KKyAgICBpZiAoKHNlbmRpcGt0cyA9PSAwKSAmJiAoYyA9PSAnSScpKSB7IC8qIEkgcGFja2V0IGJ1dCBkb24ndCBzZW5kIEkgcGt0cz8gKi8KKwlzc3RhdGUgPSAnWSc7CQkJICAvKiBZaWtlcyEgKi8KKwlyZXR1cm4oMCk7CQkJICAvKiAoc2VlIGlucHV0KCkuLikqLworICAgIH0KKyAgICBrID0gc3NlcXRibFtwa3RudW1dOwkJLyogRmluZCBzbG90IGZvciB0aGlzIHBhY2tldCAqLworICAgIGlmIChrIDwgMCkgewkJCS8qIE5vIHNsb3Q/ICovCisJayA9IGdldHNidWYod2lubG8gPSBwa3RudW0pOwkvKiBNYWtlIG9uZS4gKi8KKwlkZWJ1ZyhGMTAxLCJzaXBrdCBnZXRzYnVmIiwiIixrKTsKKyAgICB9CisgICAgcnAgPSBycGFyKCk7CQkJLyogR2V0IHByb3RvY29sIHBhcmFtZXRlcnMuICovCisgICAgaWYgKCFycCkgcnAgPSAoQ0hBUiAqKSIiOworICAgIHggPSBzcGFjayhjLHBrdG51bSwoaW50KXN0cmxlbigoY2hhciAqKXJwKSxycCk7IC8qIFNlbmQgdGhlbS4gKi8KKyAgICByZXR1cm4oeCk7Cit9CisKKy8qICBYIFMgSSBOIEkgVCAgLS0gIFJldHJhbnNtaXQgUy1wYWNrZXQgICovCisvKgorICBGb3IgdXNlIGluIHRoZSBHRVQtU0VORCBzZXF1ZW5jZSwgd2hlbiB3ZSBzdGFydCB0byBzZW5kLCBidXQgcmVjZWl2ZSBhbm90aGVyCisgIGNvcHkgb2YgdGhlIEdFVCBjb21tYW5kIGJlY2F1c2UgdGhlIHJlY2VpdmVyIGRpZG4ndCBnZXQgb3VyIFMgcGFja2V0LgorICBUaGlzIHJldHJhbnNtaXRzIHRoZSBTIHBhY2tldCBhbmQgZnJlZXMgdGhlIHJlY2VpdmUgYnVmZmVyIGZvciB0aGUgQUNLLgorICBUaGlzIHNwZWNpYWwgY2FzZSBpcyBuZWNlc3NhcnkgYmVjYXVzZSBwYWNrZXQgbnVtYmVyIHplcm8gaXMgYmVpbmcgcmUtdXNlZC4KKyovCitWT0lECit4c2luaXQoKSB7CisgICAgaW50IGs7CisgICAgayA9IHJzZXF0YmxbMF07CisgICAgZGVidWcoRjEwMSwieHNpbml0IGsiLCIiLGspOworICAgIGlmIChrID4gLTEpCisgICAgZnJlZXJidWYoayk7CisgICAgcmVzZW5kKDApOworfQorCisvKiAgUiBDIFYgRiBJIEwgLS0gUmVjZWl2ZSBhIGZpbGUgICovCisKKy8qCisgIEluY29taW5nIGZpbGVuYW1lIGlzIGluIGRhdGEgZmllbGQgb2YgRiBwYWNrZXQuCisgIFRoaXMgZnVuY3Rpb24gZGVjb2RlcyBpdCBpbnRvIHRoZSBzcnZjbWQgYnVmZmVyLCBzdWJzdGl0dXRpbmcgYW4KKyAgYWx0ZXJuYXRlICJhcy1uYW1lIiwgaWYgb25lIHdhcyBnaXZlbi4KKyAgVGhlbiBpdCBkb2VzIGFueSByZXF1ZXN0ZWQgdHJhbnNmb3JtYXRpb25zIChsaWtlIGNvbnZlcnRpbmcgdG8KKyAgbG93ZXJjYXNlKSwgYW5kIGZpbmFsbHkgaWYgYSBmaWxlIG9mIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsCisgIHRha2VzIHRoZSBkZXNpcmVkIGNvbGxpc2lvbiBhY3Rpb24uCisgIFJldHVybnM6CisgICAgMSBvbiBzdWNjZXNzLgorICAgIDAgb24gZmFpbHVyZS4KKyovCitjaGFyIG9mbjFbQ0tNQVhQQVRIKzRdOwkJCS8qIEJ1ZmZlciBmb3Igb3V0cHV0IGZpbGUgbmFtZSAqLworY2hhciAqIG9mbjI7CQkJCS8qIFBvaW50ZXIgdG8gYmFja3VwIGZpbGUgbmFtZSAqLworaW50IG9mbjF4OwkJCQkvKiBGbGFnIG91dHB1dCBmaWxlIGFscmVhZHkgZXhpc3RzICovCitsb25nIG9mbjFsZW4gPSAwTDsKK2ludCBvcG5lcnI7CQkJCS8qIEZsYWcgZm9yIG9wZW4gZXJyb3IgKi8KKworaW50CQkJCQkvKiBSZXR1cm5zIHN1Y2Nlc3MgPyAxIDogMCAqLworcmN2ZmlsKG4pIGNoYXIgKm47IHsKKyAgICBleHRlcm4gaW50IGVuX2N3ZDsKKyAgICBpbnQgaSwgc2tpcHRoaXM7CisgICAgY2hhciAqIG4yOworICAgIGNoYXIgKiBkaXNwbzsKKyNpZmRlZiBPUzJPTkxZCisgICAgY2hhciAqenMsICpsb25nbmFtZSwgKm5ld2xvbmduYW1lLCAqcG47IC8qIE9TLzIgbG9uZyBuYW1lIGl0ZW1zICovCisjZW5kaWYgLyogT1MyT05MWSAqLworI2lmZGVmIERUSUxERQorICAgIGNoYXIgKmRpcnA7CisjZW5kaWYgLyogRFRJTERFICovCisgICAgaW50IGRpcmZsZywgeCwgeTsKKyNpZmRlZiBQSVBFU0VORAorICAgIGV4dGVybiBjaGFyICogcmN2ZmlsdGVyOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisjaWZkZWYgQ0FMSUJSQVRFCisgICAgZXh0ZXJuIGludCBkZXN0OworICAgIGludCBjc2F2ZTsKKyAgICBjc2F2ZSA9IGNhbGlicmF0ZTsJCQkvKiBTbyB3ZSBjYW4gZGVjb2RlIGZpbGVuYW1lICovCisgICAgY2FsaWJyYXRlID0gMDsKKyNlbmRpZiAvKiBDQUxJQlJBVEUgKi8KKworICAgIG9mcGVybXMgPSAiIjsJCQkvKiBSZXNldCBvbGQtZmlsZSBwZXJtaXNzaW9ucyAqLworICAgIG9wbmVyciA9IDA7CQkJCS8qIE5vIG9wZW4gZXJyb3IgKHlldCkgKi8KKyAgICBvZm4yID0gTlVMTDsJCQkvKiBObyBuZXcgbmFtZSAoeWV0KSAqLworICAgIGxzc3RhdGUgPSAwOwkJCS8qIENhbmNlbCBsb2NraW5nLXNoaWZ0IHN0YXRlICovCisgICAgc3J2cHRyID0gc3J2Y21kOwkJCS8qIERlY29kZSBmaWxlIG5hbWUgZnJvbSBwYWNrZXQuICovCisKKyNpZmRlZiBVTklDT0RFCisgICAgeHBuYnl0ZSgtMSwwLDAsTlVMTCk7CQkvKiBSZXNldCBVQ1MtMiBieXRlIGNvdW50ZXIuICovCisjZW5kaWYgLyogVU5JQ09ERSAqLworCisgICAgZGVidWcoRjExMCwicmN2ZmlsIHJkYXRhcCIscmRhdGFwLDApOworICAgIGRlY29kZShyZGF0YXAscHV0c3J2LDApOwkJLyogRG9uJ3QgeGxhdGUgY2hhcnNldHMuICovCisjaWZkZWYgQ0FMSUJSQVRFCisgICAgY2FsaWJyYXRlID0gY3NhdmU7CisgICAgaWYgKGRlc3QgPT0gREVTVF9OKSB7CisJY2FsaWJyYXRlID0gMTsKKwljbWFyZzIgPSAiQ0FMSUJSQVRFIjsKKyAgICB9CisjZW5kaWYgLyogQ0FMSUJSQVRFICovCisgICAgaWYgKCpzcnZjbWQgPT0gJ1wwJykJCS8qIFdhdGNoIG91dCBmb3IgbnVsbCBGIHBhY2tldC4gKi8KKyAgICAgIGNrc3RybmNweSgoY2hhciAqKXNydmNtZCwiTk9OQU1FIixzcnZjbWRsZW4pOworICAgIG1ha2VzdHIoJnBycmZzcGVjLChjaGFyICopc3J2Y21kKTsJLyogTmV3IHByZWxpbWluYXJ5IGZpbGVuYW1lICovCisjaWZkZWYgRFRJTERFCisgICAgaWYgKCpzcnZjbWQgPT0gJ34nKSB7CisJZGlycCA9IHRpbGRlX2V4cGFuZCgoY2hhciAqKXNydmNtZCk7IC8qIEV4cGFuZCB0aWxkZSwgaWYgYW55LiAqLworCWlmICgqZGlycCAhPSAnXDAnKQorCSAgY2tzdHJuY3B5KChjaGFyICopc3J2Y21kLGRpcnAsc3J2Y21kbGVuKTsKKyAgICB9CisjZWxzZQorI2lmZGVmIE9TMgorICAgIGlmIChpc2FscGhhKCpzcnZjbWQpICYmIHNydmNtZFsxXSA9PSAnOicgJiYgc3J2Y21kWzJdID09ICdcMCcpCisgICAgICBja3N0cm5jYXQoKGNoYXIgKilzcnZjbWQsIk5PTkFNRSIsc3J2Y21kbGVuKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBEVElMREUgKi8KKworI2lmbmRlZiBOT0lDUAorI2lmbmRlZiBOT1NQTAorLyogRmlsZSBkaWFsb2cgd2hlbiBkb3dubG9hZGluZy4uLiAgKi8KKyAgICBpZiAoCisjaWZkZWYgQ0tfQVBDCisJKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwgJiYgYWRsX2FzaykgfHwgLyogQXV0b2Rvd25sb2FkIHdpdGggQVNLICovCisjZW5kaWYgLyogQ0tfQVBDICovCisJKGNsY21kcyAmJiBoYXZldXJsKQkJLyogT3IgImtlcm1pdDoiIG9yICJpa3NkOiIgVVJMICovCisJKSB7CisJaW50IHg7CisJY2hhciBmbmJ1ZltDS01BWFBBVEgrMV07CS8qIFJlc3VsdCBidWZmZXIgKi8KKwljaGFyICogcHJlZmFjZTsKKworCWlmIChjbGNtZHMgJiYgaGF2ZXVybCkKKwkgIHByZWZhY2UgPSAiXHJcbkluY29taW5nIGZpbGUgZnJvbSBLZXJtaXQgc2VydmVyLi4uXHJcblwKK1BsZWFzZSBjb25maXJtIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24gb3Igc3VwcGx5IGFuIGFsdGVybmF0aXZlOiI7CisJZWxzZQorCSAgcHJlZmFjZSA9ICJcclxuSW5jb21pbmcgZmlsZSBmcm9tIHJlbW90ZSBLZXJtaXQuLi5cclxuXAorUGxlYXNlIGNvbmZpcm0gb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbiBvciBzdXBwbHkgYW4gYWx0ZXJuYXRpdmU6IjsKKworCXggPSB1cV9maWxlKHByZWZhY2UsCQkvKiBQcmVmYWNlICovCisJCSAgICBOVUxMLAkJLyogUHJvbXB0IChsZXQgdXFfZmlsZSgpIGJ1aWx0IGl0KSAqLworCQkgICAgMywJCQkvKiBPdXRwdXQgZmlsZSAqLworCQkgICAgTlVMTCwJCS8qIEhlbHAgdGV4dCAqLworCQkgICAgKGNoYXIgKilzcnZjbWQsCS8qIERlZmF1bHQgKi8KKwkJICAgIGZuYnVmLAkJLyogUmVzdWx0IGJ1ZmZlciAqLworCQkgICAgQ0tNQVhQQVRIKzEJCS8qIFNpemUgb2YgcmVzdWx0IGJ1ZmZlciAqLworCQkgICAgKTsKKwlpZiAoeCA8IDEpIHsJCQkvKiBSZWZ1c2VkICovCisJICAgIHJmX2VyciA9ICJSZWZ1c2VkIGJ5IHVzZXIiOworCSAgICByZXR1cm4oMCk7CisJfQorCWNrc3RybmNweSgoY2hhciAqKXNydmNtZCxmbmJ1ZixDS01BWFBBVEgrMSk7CisJaWYgKGlzYWJzb2x1dGUoKGNoYXIgKilzcnZjbWQpKSB7IC8qIFVzZXIgZ2F2ZSBhbiBhYnNvbHV0ZSBwYXRoICovCisJICAgIGdfZm5ycGF0aCA9IGZucnBhdGg7CS8qIFNhdmUgY3VycmVudCBSRUNFSVZFIFBBVEhOQU1FUyAqLworCSAgICBmbnJwYXRoID0gUEFUSF9BQlM7CQkvKiBzd2l0Y2ggdG8gQUJTT0xVVEUgKi8KKwl9CisgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKworICAgIGlmICghRU5BQkxFRChlbl9jd2QpKSB7CQkvKiBDRCBpcyBkaXNhYmxlZCAqLworCXpzdHJpcCgoY2hhciAqKShzcnZjbWQrMiksJm4yKTsgLyogYW5kIHRoZXkgaW5jbHVkZWQgYSBwYXRobmFtZSwgKi8KKwlpZiAoc3RyY21wKChjaGFyICopKHNydmNtZCsyKSxuMikpIHsgLyogc28gcmVmdXNlLiAqLworCSAgICByZl9lcnIgPSAiQWNjZXNzIGRlbmllZCI7CisJICAgIHJldHVybigwKTsKKwl9CisgICAgfQorI2lmZGVmIENPTU1FTlQKKyAgICAvKiBXcm9uZyBwbGFjZSBmb3IgdGhpcyAtLSBoYW5kbGUgY21hcmcyIGZpcnN0IC0tIHNlZSBiZWxvdy4uLiAgKi8KKworICAgIGlmICh6Y2hrbygoY2hhciAqKXNydmNtZCkgPCAwKSB7CS8qIFByZWNoZWNrIGZvciB3cml0ZSBhY2Nlc3MgKi8KKwlkZWJ1ZyhGMTEwLCJyY3ZmaWwgYWNjZXNzIGRlbmllZCIsc3J2Y21kLDApOworCXJmX2VyciA9ICJXcml0ZSBhY2Nlc3MgZGVuaWVkIjsKKwlkaXNjYXJkID0gb3BuZXJyID0gMTsKKwlyZXR1cm4oMCk7CisgICAgfQorICAgIHh4c2NyZWVuKFNDUl9GTiwwLDBsLChjaGFyICopc3J2Y21kKTsgLyogUHV0IGl0IG9uIHNjcmVlbiBpZiBsb2NhbCAqLworICAgIGRlYnVnKEYxMTAsInJjdmZpbCBzcnZjbWQgMSIsc3J2Y21kLDApOworICAgIHRsb2coRjExMCwiUmVjZWl2aW5nIiwoY2hhciAqKXNydmNtZCwwTCk7IC8qIFRyYW5zYWN0aW9uIGxvZyBlbnRyeSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIHNraXB0aGlzID0gMDsJCQkvKiBUaGlzIGZpbGUgaW4gb3VyIGV4Y2VwdGlvbiBsaXN0PyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOU05ERVhDRVBUOyBpKyspIHsKKwlpZiAoIXJjdmV4Y2VwdFtpXSkgeworCSAgICBicmVhazsKKwl9CisJaWYgKGNrbWF0Y2gocmN2ZXhjZXB0W2ldLChjaGFyICopc3J2Y21kLGZpbGVjYXNlLDEpKSB7CisJICAgIHNraXB0aGlzID0gMTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyAmJiBza2lwdGhpcykgeworCWRlYnVnKEYxMTEsInJjdmZpbCByY3ZleGNlcHQiLHJjdmV4Y2VwdFtpXSxpKTsKKwlkZWJ1ZyhGMTEwLCJyY3ZmaWwgc2tpcHBpbmciLHNydmNtZCwwKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKworICAgIGlmIChza2lwdGhpcykgewkJCS8qIFNraXBwaW5nIHRoaXMgZmlsZSAqLworCWRpc2NhcmQgPSAxOworCXJlamVjdGlvbiA9IDE7CisJcmZfZXJyID0gIkV4Y2VwdGlvbiBsaXN0IjsKKwlkZWJ1ZyhGMTAxLCJyY3ZmaWwgZGlzY2FyZCIsIiIsZGlzY2FyZCk7CisJdGxvZyhGMTAwLCIgcmVmdXNlZDogZXhjZXB0aW9uIGxpc3QiLCIiLDApOworCXJldHVybigxKTsKKyAgICB9CisKKyAgICAvKiBGaWxlIGlzIG5vdCBpbiBleGNlcHRpb24gbGlzdCAqLworCisgICAgaWYgKCFjbWFyZzIpCQkJLyogTm8gY29yZSBkdW1wcyBwbGVhc2UgKi8KKyAgICAgIGNtYXJnMiA9ICIiOworICAgIGRlYnVnKEYxMTAsInJjdmZpbCBjbWFyZzIiLGNtYXJnMiwwKTsKKworICAgIGlmICgqY21hcmcyKSB7CQkJLyogQ2hlY2sgZm9yIGFsdGVybmF0ZSBuYW1lICovCisjaWZuZGVmIE5PU1BMCisJaW50IHk7IGNoYXIgKnM7CQkJLyogUGFzcyBpdCB0aHJ1IHRoZSBldmFsdWF0b3IgKi8KKwlleHRlcm4gaW50IGNtZF9xdW90aW5nOworCWlmIChjbWRfcXVvdGluZykgeworCSAgICB5ID0gTUFYUlA7CisJICAgIGNrc3RybmNweShvZm4xLChjaGFyICopc3J2Y21kLENLTUFYUEFUSCsxKTsgLyogZm9yIFx2KGZpbGVuYW1lKSAqLworCSAgICBzID0gKGNoYXIgKilzcnZjbWQ7CisJICAgIHp6c3RyaW5nKGNtYXJnMiwmcywmeSk7CisJfSBlbHNlCisJICAqc3J2Y21kID0gTlVMOworCWlmICghKnNydmNtZCkJCQkvKiBJZiB3ZSBnb3Qgc29tZXRoaW5nICovCisjZW5kaWYgLyogTk9TUEwgKi8KKwkgIGNrc3RybmNweSgoY2hhciAqKXNydmNtZCxjbWFyZzIsc3J2Y21kbGVuKTsKKyAgICB9CisgICAgZGVidWcoRjExMCwicmN2ZmlsIHNydmNtZCAyIixzcnZjbWQsMCk7CisKKyNpZmRlZiBQSVBFU0VORAorICAgIC8qIElmIGl0IHN0YXJ0cyB3aXRoICJiYW5nIiwgaXQncyBhIHBpcGUsIG5vdCBhIGZpbGUuICovCisgICAgaWYgKHVzZXBpcGVzICYmIHByb3RvY29sID09IFBST1RPX0sgJiYgKnNydmNtZCA9PSAnIScgJiYgIXJjdmZpbHRlcikgeworCUNIQVIgKnM7CisJcyA9IHNydmNtZCsxOwkJCS8qIHNydmNtZFtdIGlzIG5vdCBhIHBvaW50ZXIuICovCisJd2hpbGUgKCpzKSB7CQkJLyogU28gd2UgaGF2ZSB0byBzbGlkZSB0aGUgY29udGVudHMgKi8KKwkgICAgKihzLTEpID0gKnM7CQkvKiBvdmVyIDEgc3BhY2UgdG8gdGhlIGxlZnQuICovCisJICAgIHMrKzsKKwl9CisJKihzLTEpID0gTlVMOworCXBpcGVzZW5kID0gMTsKKyAgICB9CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKworI2lmZGVmIENPTU1FTlQKKy8qCisgIFRoaXMgaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIHdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIHRoZSBuYW1lIHdlIGFyZQorICB1c2luZyB3YXMgc3BlY2lmaWVkIGJ5IHRoZSBsb2NhbCB1c2VyIGFzIGFuIG92ZXJyaWRlLCBvciBjYW1lIGZyb20gdGhlCisgIGluY29taW5nIHBhY2tldC4gIEluIHRoZSBmb3JtZXIgY2FzZSwgd2UgZG9uJ3QgZG8gc3R1ZmYgdG8gaXQgKGxpa2UKKyAgc3RyaXAgdGhlIHBhdGhuYW1lKSB0aGF0IHdlIG1pZ2h0IGRvIHRvIGl0IGluIHRoZSBsYXR0ZXIuCisqLworICAgIGNtYXJnMiA9ICIiOwkJCS8qIERvbmUgd2l0aCBhbHRlcm5hdGUgbmFtZSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIGlmICgoaW50KXN0cmxlbigoY2hhciAqKXNydmNtZCkgPiBDS01BWFBBVEgpIC8qIFdhdGNoIG91dCBmb3Igb3ZlcmZsb3cgKi8KKyAgICAgICooc3J2Y21kICsgQ0tNQVhQQVRIIC0gMSkgPSBOVUw7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50LCBzcnZjbWRbXSBjb250YWlucyB0aGUgaW5jb21pbmcgZmlsZW5hbWUgb3IgYXMtbmFtZS4gKi8KKyAgICAvKiBTbyBOT1cgd2UgY2hlY2sgZm9yIHdyaXRlIGFjY2Vzcy4gKi8KKworICAgIGlmICh6Y2hrbygoY2hhciAqKXNydmNtZCkgPCAwKSB7CS8qIFByZWNoZWNrIGZvciB3cml0ZSBhY2Nlc3MgKi8KKwlkZWJ1ZyhGMTEwLCJyY3ZmaWwgYWNjZXNzIGRlbmllZCIsc3J2Y21kLDApOworCXJmX2VyciA9ICJXcml0ZSBhY2Nlc3MgZGVuaWVkIjsKKwlkaXNjYXJkID0gb3BuZXJyID0gMTsKKwlyZXR1cm4oMCk7CisgICAgfQorICAgIHh4c2NyZWVuKFNDUl9GTiwwLDBsLChjaGFyICopc3J2Y21kKTsgLyogUHV0IGl0IG9uIHNjcmVlbiBpZiBsb2NhbCAqLworICAgIGRlYnVnKEYxMTAsInJjdmZpbCBzcnZjbWQgMSIsc3J2Y21kLDApOworICAgIHRsb2coRjExMCwiUmVjZWl2aW5nIiwoY2hhciAqKXNydmNtZCwwTCk7IC8qIFRyYW5zYWN0aW9uIGxvZyBlbnRyeSAqLworCisjaWZkZWYgQ0tfTEFCRUxFRAorI2lmZGVmIFZNUworLyoKKyAgSWYgd2UgaGF2ZSBhbiBhcy1uYW1lLCB0aGlzIG92ZXJyaWRlcyB0aGUgaW50ZXJuYWwgbmFtZSBpZiB3ZSBhcmUgZG9pbmcKKyAgYSBsYWJlbGVkLW1vZGUgdHJhbnNmZXIuCisqLworICAgIGlmICgqY21hcmcyKSB7CisJZXh0ZXJuIGludCBsZl9vcHRzOworCWxmX29wdHMgJj0gfkxCTF9OQU07CisgICAgfQorI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIENLX0xBQkVMRUQgKi8KKworICAgIGRlYnVnKEYxMTEsInJjdmZpbCBwaXBlc2VuZCIsc3J2Y21kLHBpcGVzZW5kKTsKKworI2lmZGVmIFBJUEVTRU5ECisgICAgLyogU2tpcCBhbGwgdGhlIGZpbGVuYW1lIG1hbmlwdWxhdGlvbiBhbmQgY29sbGlzaW9uIGFjdGlvbnMgKi8KKyAgICBpZiAocGlwZXNlbmQpIHsKKwlkaXJmbGcgPSAwOworCW9mbjFbMF0gPSAnISc7CisJY2tzdHJuY3B5KCZvZm4xWzFdLChjaGFyICopc3J2Y21kLENLTUFYUEFUSCsxKTsKKwlja3N0cm5jcHkobixvZm4xLENLTUFYUEFUSCsxKTsKKwlja3N0cm5jcHkoZnNwZWMsb2ZuMSxDS01BWFBBVEgrMSk7CisJbWFrZXN0cigmcHJmc3BlYyxmc3BlYyk7CS8qIE5ldyBwcmVsaW1pbmFyeSBmaWxlbmFtZSAqLworCWRlYnVnKEYxMTAsInJjdmZpbCBwaXBlc2VuZCIsb2ZuMSwwKTsKKwlnb3RvIHJjdmZpbHg7CisgICAgfQorI2VuZGlmIC8qIFBJUEVTRU5EICovCisvKgorICBUaGlzIGlzIHRvIGF2b2lkIHBhc3NpbmcgZW1haWwgc3ViamVjdHMgdGhyb3VnaCBuenJ0b2woKS4KKyAgV2UgaGF2ZW4ndCB5ZXQgcmVjZWl2ZWQgdGhlIEEgcGFja2V0IHNvIHdlIGRvbid0IHlldCBrbm93IGl0J3MgZS1tYWlsLAorICBzbyBpbiBmYWN0IHdlIGdvIGFoZWFkIGFuZCBjb252ZXJ0IGl0IGFueXdheSwgYnV0IGxhdGVyIHdlIGdldCB0aGUKKyAgb3JpZ2luYWwgYmFjayBmcm9tIG9maWxuYW1bXS4KKyovICAKKyAgICBkaXNwb3MgPSAwOworICAgIGNrc3RybmNweShvZmlsbmFtLChjaGFyICopc3J2Y21kLENLTUFYUEFUSCsxKTsKKworI2lmZGVmIE5aTFRPUgorICAgIGlmICgqY21hcmcyKQorICAgICAgY2tzdHJuY3B5KChjaGFyICopb2ZuMSwoY2hhciAqKXNydmNtZCxDS01BWFBBVEgrMSk7CisgICAgZWxzZQorICAgICAgbnpydG9sKChjaGFyICopc3J2Y21kLAkJLyogRmlsZW5hbWUgZnJvbSBwYWNrZXQgKi8KKwkgICAgIChjaGFyICopb2ZuMSwJCS8qIFdoZXJlIHRvIHB1dCByZXN1bHQgKi8KKwkgICAgIGZuY252LAkJCS8qIEZpbGVuYW1lIGNvbnZlcnNpb24gKi8KKwkgICAgIGZucnBhdGgsCQkJLyogUGF0aG5hbWUgaGFuZGxpbmcgKi8KKwkgICAgIENLTUFYUEFUSAkJCS8qIFNpemUgb2YgcmVzdWx0IGJ1ZmZlciAqLworCSAgICAgKTsKKyNlbHNlCisgICAgZGVidWcoRjEwMSwicmN2ZmlsIGZucnBhdGgiLCIiLGZucnBhdGgpOyAvKiBIYW5kbGUgcGF0aG5hbWVzICovCisgICAgaWYgKGZucnBhdGggPT0gUEFUSF9PRkYgJiYgISpjbWFyZzIpIHsgLyogUkVDRUlWRSBQQVRITkFNRVMgT0ZGPyAqLworCWNoYXIgKnQ7CQkJLyogWWVzLiAqLworCXpzdHJpcCgoY2hhciAqKXNydmNtZCwmdCk7CS8qIElmIHRoZXJlIGlzIGEgcGF0aG5hbWUsIHN0cmlwIGl0ICovCisJZGVidWcoRjExMCwicmN2ZmlsIFBBVEhfT0ZGIHpzdHJpcCIsdCwwKTsKKwlpZiAoIXQpCQkJCS8qIEJlIHN1cmUgd2UgZGlkbid0IHN0cmlwIHRvbyBtdWNoICovCisJICBzcHJpbnRmKG9mbjEsIkZJTEUlMDJsZCIsZmlsY250KTsKKwllbHNlIGlmICgqdCA9PSAnXDAnKQorCSAgc3ByaW50ZihvZm4xLCJGSUxFJTAybGQiLGZpbGNudCk7CisJZWxzZQorCSAgY2tzdHJuY3B5KG9mbjEsdCxDS01BWFBBVEgrMSk7CisJY2tzdHJuY3B5KChjaGFyICopc3J2Y21kLG9mbjEsc3J2Y21kbGVuKTsgLyogTm93IGNvcHkgaXQgYmFjay4gKi8KKyAgICB9CisvKgorICBTRVQgUkVDRUlWRSBQQVRITkFNRVMgUkVMQVRJVkUuLi4KKyAgVGhlIGZvbGxvd2luZyBkb2Vzbid0IGJlbG9uZyBoZXJlIGJ1dCBkb2luZyBpdCByaWdodCB3b3VsZCByZXF1aXJlCisgIGRlZmluaW5nIGFuZCBpbXBsZW1lbnRpbmcgYSBuZXcgZmlsZSByb3V0aW5lIGZvciBhbGwgY2s/ZmlvLmMgbW9kdWxlcy4KKyAgU28gZm9yIG5vdy4uLgorKi8KKyNpZmRlZiBVTklYT1JPU0sKKyAgICBlbHNlIGlmIChmbnJwYXRoID09IFBBVEhfUkVMICYmICEqY21hcmcyKSB7CisJaWYgKGlzYWJzb2x1dGUoKGNoYXIgKilzcnZjbWQpKSB7CisJICAgIG9mbjFbMF0gPSAnLic7CisJICAgIGNrc3RybmNweSgmb2YxblsxXSwoY2hhciAqKXNydmNtZCxDS01BWFBBVEgrMSk7CisJICAgIGNrc3RybmNweSgoY2hhciAqKXNydmNtZCxvZm4xLHNydmNtZGxlbik7CisJICAgIGRlYnVnKEYxMTAsInJjdmZpbCBQQVRIX1JFTCIsb2ZuMSwwKTsKKwl9CisgICAgfQorI2Vsc2UKKyNpZmRlZiBPUzIKKyAgICBlbHNlIGlmIChmbnJwYXRoID09IFBBVEhfUkVMICYmICEqY21hcmcyKSB7CisJaWYgKGlzYWJzb2x1dGUoKGNoYXIgKilzcnZjbWQpKSB7CisJICAgIGNoYXIgKnAgPSAoY2hhciAqKXNydmNtZDsKKwkgICAgaWYgKGlzYWxwaGEoKnApICYmICoocCsxKSA9PSAnOicpCisJICAgICAgcCArPSAyOworCSAgICBpZiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSAnLycpCisJICAgICAgcCsrOworCSAgICBja3N0cm5jcHkob2ZuMSxwLENLTUFYUEFUSCsxKTsKKwkgICAgY2tzdHJuY3B5KChjaGFyICopc3J2Y21kLG9mbjEsc3J2Y21kbGVuKTsKKwkgICAgZGVidWcoRjExMCwicmN2ZmlsIE9TMiBQQVRIX1JFTCIsb2ZuMSwwKTsKKwl9CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworCisgICAgLyogTm93IHNydmNtZCBjb250YWlucyBpbmNvbWluZyBmaWxlbmFtZSB3aXRoIHBhdGggcG9zc2libHkgc3RyaXBwZWQgKi8KKworICAgIGlmIChmbmNudikJCQkJLyogRklMRSBOQU1FUyBDT05WRVJURUQ/ICovCisgICAgICB6cnRvbCgoY2hhciAqKXNydmNtZCwoY2hhciAqKW9mbjEpOyAvKiBZZXMsIGNvbnZlcnQgdG8gbG9jYWwgZm9ybSAqLworICAgIGVsc2UKKyAgICAgIGNrc3RybmNweShvZm4xLChjaGFyICopc3J2Y21kLENLTUFYUEFUSCsxKTsgLyogTm8sIGNvcHkgbGl0ZXJhbGx5LiAqLworI2VuZGlmIC8qIE5aTFRPUiAqLworCisjaWZkZWYgUElQRVNFTkQKKyAgICBpZiAocmN2ZmlsdGVyKSB7CisJY2hhciAqIHAgPSBOVUxMLCAqIHE7CisJaW50IG5uID0gTUFYUlA7CisJcGlwZXNlbmQgPSAxOworCWRlYnVnKEYxMTAsInJjdmZpbCByY3ZmaWx0ZXIgIixyY3ZmaWx0ZXIsMCk7CisjaWZuZGVmIE5PU1BMCisJaWYgKChwID0gKGNoYXIgKikgbWFsbG9jKG5uICsgMSkpKSB7CisJICAgIHEgPSBwOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSBwcm9jZXNzZWQgc3J2Y21kIGFuZCBwbGFjZWQgaXQgaW50byBvZm4xICovCisgICAgICAgICAgICBja3N0cm5jcHkob2ZuMSwoY2hhciAqKXNydmNtZCxDS01BWFBBVEgrMSk7IC8qIEZvciBcdihmaWxlbmFtZSkgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisJICAgIGRlYnVnKEYxMTAsInJjdmZpbGUgcGlwZXNlbmQgZmlsdGVyIixyY3ZmaWx0ZXIsMCk7CisJICAgIHp6c3RyaW5nKHJjdmZpbHRlciwmcCwmbm4pOworCSAgICBkZWJ1ZyhGMTExLCJyY3ZmaWwgcGlwZW5hbWUiLHEsbm4pOworCSAgICBpZiAobm4gPD0gMCkgeworCQlwcmludGYoCisJCSAgICAgICAiP1NvcnJ5LCByZWNlaXZlIGZpbHRlciArIGZpbGVuYW1lIHRvbyBsb25nLCAlZCBtYXguXG4iLAorCQkgICAgICAgQ0tNQVhQQVRICisJCSAgICAgICApOworCQlyZl9lcnIgPSAiTmFtZSB0b28gbG9uZyI7CisJCWZyZWUocSk7CisJCXJldHVybigwKTsKKwkgICAgfQorCSAgICBja3N0cm5jcHkoKGNoYXIgKilzcnZjbWQscSxNQVhSUCk7CisJICAgIGZyZWUocSk7CisJfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgfQorI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyAgICAvKiBOb3cgdGhlIGluY29taW5nIGZpbGVuYW1lLCBwb3NzaWJseSBjb252ZXJ0ZWQsIGlzIGluIG9mbjFbXS4gKi8KKworI2lmZGVmIE9TMgorICAgIC8qIERvbid0IHJlZnVzZSB0aGUgZmlsZSBqdXN0IGJlY2F1c2UgdGhlIG5hbWUgaXMgaWxsZWdhbC4gKi8KKyAgICBpZiAoIUlzRmlsZU5hbWVWYWxpZChvZm4xKSkgewkvKiBOYW1lIGlzIE9LIGZvciBPUy8yPyAqLworI2lmZGVmIE9TMk9OTFkKKwljaGFyICp6cyA9IE5VTEw7CisJenN0cmlwKG9mbjEsICZ6cyk7CQkvKiBOb3QgdmFsaWQsIHN0cmlwIHVuY29uZGl0aW9uYWxseSAqLworCWlmICh6cykgeworCSAgICBpZiAoaWF0dHIubG9uZ25hbWUubGVuICYmCS8qIEZyZWUgcHJldmlvdXMgbG9uZ25hbWUsIGlmIGFueSAqLworCQlpYXR0ci5sb25nbmFtZS52YWwpCisJICAgICAgZnJlZShpYXR0ci5sb25nbmFtZS52YWwpOworCSAgICBpYXR0ci5sb25nbmFtZS5sZW4gPSBzdHJsZW4oenMpOyAvKiBTdG9yZSBpbiBhdHRyaWJ1dGUgc3RydWN0dXJlICovCisJICAgIGlhdHRyLmxvbmduYW1lLnZhbCA9IChjaGFyICopIG1hbGxvYyhpYXR0ci5sb25nbmFtZS5sZW4gKyAxKTsKKwkgICAgaWYgKGlhdHRyLmxvbmduYW1lLnZhbCkJLyogUmVtZW1iZXIgdGhpcyAoaWxsZWdhbCkgbmFtZSAqLworCSAgICAgIHN0cmNweShpYXR0ci5sb25nbmFtZS52YWwsIHpzKTsgLyogc2FmZSAqLworCX0KKyNlbmRpZiAvKiBPUzJPTkxZICovCisJZGVidWcoRjExMCwicmN2ZmlsOiBpbnZhbGlkIGZpbGUgbmFtZSIsb2ZuMSwwKTsKKwlDaGFuZ2VOYW1lRm9yRkFUKG9mbjEpOwkvKiBDaGFuZ2UgdG8gYW4gYWNjZXB0YWJsZSBuYW1lICovCisJZGVidWcoRjExMCwicmN2ZmlsOiBGQVQgZmlsZSBuYW1lIixvZm4xLDApOworCisgICAgfSBlbHNlIHsJCQkJLyogTmFtZSBpcyBPSy4gKi8KKworCWRlYnVnKEYxMTAsInJjdmZpbDogdmFsaWQgZmlsZSBuYW1lIixvZm4xLDApOworI2lmZGVmIE9TMk9OTFkKKwlpZiAoaWF0dHIubG9uZ25hbWUubGVuICYmCisJICAgICBpYXR0ci5sb25nbmFtZS52YWwpCS8qIEZyZWUgcHJldmlvdXMgbG9uZ25hbWUsIGlmIGFueSAqLworCSAgZnJlZShpYXR0ci5sb25nbmFtZS52YWwpOworCWlhdHRyLmxvbmduYW1lLmxlbiA9IDA7CisJaWF0dHIubG9uZ25hbWUudmFsID0gTlVMTDsJLyogVGhpcyBmaWxlIGRvZXNuJ3QgbmVlZCBhIGxvbmduYW1lICovCisjZW5kaWYgLyogT1MyT05MWSAqLworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBkZWJ1ZyhGMTEwLCJyY3ZmaWwgYXMiLG9mbjEsMCk7CisKKy8qIEZpbGVuYW1lIGNvbGxpc2lvbiBhY3Rpb24gc2VjdGlvbi4gKi8KKworICAgIGRpcmZsZyA9CQkJCS8qIElzIGl0IGEgZGlyZWN0b3J5IG5hbWU/ICovCisjaWZkZWYgQ0tfVE1QRElSCisgICAgICAgIGlzZGlyKG9mbjEpCisjZWxzZQorCTAKKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKwkgIDsKKyAgICBkZWJ1ZyhGMTAxLCJyY3ZmaWwgZGlyZmxnIiwiIixkaXJmbGcpOworICAgIG9mbjFsZW4gPSB6Y2hraShvZm4xKTsJCS8qIEZpbGUgYWxyZWFkeSBleGlzdHM/ICovCisgICAgZGVidWcoRjExMSwicmN2ZmlsIG9mbjFsZW4iLG9mbjEsb2ZuMWxlbik7CisgICAgb2ZuMXggPSAob2ZuMWxlbiAhPSAtMSk7CisKKyAgICBpZiAoICgKKyNpZmRlZiBVTklYCisJc3RyY21wKG9mbjEsIi9kZXYvbnVsbCIpICYmCS8qIEl0J3Mgbm90IHRoZSBudWxsIGRldmljZT8gKi8KKyNlbHNlCisjaWZkZWYgT1NLCisJc3RyY21wKG9mbjEsIi9uaWwiKSAmJgorI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIFVOSVggKi8KKwkhc3Rkb3VmICkgJiYJCQkvKiBOb3QgY29weWluZyB0byBzdGFuZGFyZCBvdXRwdXQ/ICovCisJb2ZuMXggfHwJCQkvKiBGaWxlIG9mIHNhbWUgbmFtZSBleGlzdHM/ICovCisJZGlyZmxnICkgewkJCS8qIE9yIGZpbGUgaXMgYSBkaXJlY3Rvcnk/ICovCisgICAgICAgIGRlYnVnKEYxMTEsInJjdmZpbCBleGlzdHMiLG9mbjEsZm5jYWN0KTsKKyNpZmRlZiBDS19QRVJNUworCW9mcGVybXMgPSB6Z3Blcm0oKGNoYXIgKilvZm4xKTsJLyogR2V0IG9sZCBmaWxlJ3MgcGVybWlzc2lvbnMgKi8KKwlkZWJ1ZyhGMTEwLCJyY3ZmaWwgcGVybXMiLG9mcGVybXMsMCk7CisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKworCWRlYnVnKEYxMDEsInJjdmZpbCBmbmNhY3QiLCIiLGZuY2FjdCk7CisJc3dpdGNoIChmbmNhY3QpIHsJCS8qIFllcywgZG8gd2hhdCB1c2VyIHNhaWQuICovCisJICBjYXNlIFhZRlhfQToJCQkvKiBBcHBlbmQgKi8KKwkgICAgb2ZwZXJtcyA9ICIiOworCSAgICBkZWJ1ZyhGMTAwLCJyY3ZmaWwgYXBwZW5kIiwiIiwwKTsKKwkgICAgaWYgKGRpcmZsZykgeworCQlyZl9lcnIgPSAiQ2FuJ3QgYXBwZW5kIHRvIGEgZGlyZWN0b3J5IjsKKwkJdGxvZyhGMTAwLCIgZXJyb3IgLSBjYW4ndCBhcHBlbmQgdG8gZGlyZWN0b3J5IiwiIiwwKTsKKwkJZGlzY2FyZCA9IG9wbmVyciA9IDE7CisJCXJldHVybigwKTsKKwkgICAgfQorCSAgICB0bG9nKEYxMTAsIiBhcHBlbmRpbmcgdG8iLG9mbjEsMCk7CisJICAgIGJyZWFrOworI2lmZGVmIENPTU1FTlQKKwkgIGNhc2UgWFlGWF9ROgkJCS8qIFF1ZXJ5IChBc2spICovCisJICAgIGJyZWFrOwkJCS8qIG5vdCBpbXBsZW1lbnRlZCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgIGNhc2UgWFlGWF9COgkJCS8qIEJhY2t1cCAocmVuYW1lIG9sZCBmaWxlKSAqLworCSAgICBpZiAoZGlyZmxnKSB7CisJCXJmX2VyciA9ICJDYW4ndCByZW5hbWUgZXhpc3RpbmcgZGlyZWN0b3J5IjsKKwkJdGxvZyhGMTAwLCIgZXJyb3IgLSBjYW4ndCByZW5hbWUgZGlyZWN0b3J5IiwiIiwwKTsKKwkJZGlzY2FyZCA9IG9wbmVyciA9IDE7CisJCXJldHVybigwKTsKKwkgICAgfQorCSAgICB6bmV3bihvZm4xLCZvZm4yKTsJCS8qIEdldCBuZXcgdW5pcXVlIG5hbWUgKi8KKwkgICAgdGxvZyhGMTEwLCIgYmFja3VwOiIsb2ZuMiwwKTsKKwkgICAgZGVidWcoRjExMCwicmN2ZmlsIGJhY2t1cCBvZm4xIixvZm4xLDApOworCSAgICBkZWJ1ZyhGMTEwLCJyY3ZmaWwgYmFja3VwIG9mbjIiLG9mbjIsMCk7CisjaWZkZWYgQ0tfTEFCRUxFRAorI2lmZGVmIE9TMk9OTFkKKy8qCisgIEluIGNhc2UgdGhpcyBpcyBhIEZBVCBmaWxlIHN5c3RlbSwgd2UgY2FuJ3QgY2hhbmdlIG9ubHkgdGhlIEZBVCBuYW1lLCB3ZQorICBhbHNvIGhhdmUgdG8gY2hhbmdlIHRoZSBsb25nbmFtZSBmcm9tIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIGJsb2NrLgorICBPdGhlcndpc2UsIHdlJ2xsIGhhdmUgbWFueSBmaWxlcyB3aXRoIHRoZSBzYW1lIGxvbmduYW1lIGFuZCBpZiB3ZSBjb3B5IHRoZW0KKyAgdG8gYW4gSFBGUyB2b2x1bWUsIG9ubHkgb25lIHdpbGwgc3Vydml2ZS4KKyovCisJICAgIGlmIChvczJnZXRsb25nbmFtZShvZm4xLCAmbG9uZ25hbWUpID4gLTEpIHsKKwkJaWYgKHN0cmxlbihsb25nbmFtZSkpIHsKKwkJICAgIGNoYXIgdG1wWzEwXTsKKwkJICAgIGV4dGVybiBpbnQgY2tfem5ld247CisJCSAgICBzcHJpbnRmKHRtcCwiLn4lZH4iLGNrX3puZXduKTsKKwkJICAgIG5ld2xvbmduYW1lID0KKwkJICAgICAgKGNoYXIgKikgbWFsbG9jKHN0cmxlbihsb25nbmFtZSkgKyBzdHJsZW4odG1wKSArIDEpOworCQkgICAgaWYgKG5ld2xvbmduYW1lKSB7CisJCQlzdHJjcHkobmV3bG9uZ25hbWUsIGxvbmduYW1lKTsgLyogc2FmZSAocHJlY2hlY2tlZCkgKi8KKwkJCXN0cmNhdChuZXdsb25nbmFtZSwgdG1wKTsgLyogc2FmZSAocHJlY2hlY2tlZCkgKi8KKwkJCW9zMnNldGxvbmduYW1lKG9mbjEsIG5ld2xvbmduYW1lKTsKKwkJCWZyZWUobmV3bG9uZ25hbWUpOworCQkJbmV3bG9uZ25hbWUgPSBOVUxMOworCQkgICAgfQorCQl9CisJICAgIH0gZWxzZSBkZWJ1ZyhGMTAwLCJyY3ZmaWwgb3MyZ2V0bG9uZ25hbWUgZmFpbGVkIiwiIiwwKTsKKyNlbmRpZiAvKiBPUzJPTkxZICovCisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworCisjaWZkZWYgQ09NTUVOVAorCSAgICAvKiBEbyB0aGlzIGxhdGVyLCBpbiBvcGVuYSgpLi4uICovCisJICAgIGlmICh6cmVuYW1lKG9mbjEsb2ZuMikgPCAwKSB7CisJCXJmX2VyciA9ICJDYW4ndCB0cmFuc2Zvcm0gZmlsZW5hbWUiOworCQlkZWJ1ZyhGMTEwLCJyY3ZmaWwgcmVuYW1lIGZhaWxzIixvZm4xLDApOworCQlkaXNjYXJkID0gb3BuZXJyID0gMTsKKwkJcmV0dXJuKDApOworCSAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCSAgICBicmVhazsKKworCSAgY2FzZSBYWUZYX0Q6CQkJLyogRGlzY2FyZCAocmVmdXNlIG5ldyBmaWxlKSAqLworCSAgICBvZnBlcm1zID0gIiI7CisJICAgIGRpc2NhcmQgPSAxOworCSAgICByZWplY3Rpb24gPSAxOwkJLyogSG9ycmlibGUgaGFjazogcmVhc29uID0gbmFtZSAqLworCSAgICBkZWJ1ZyhGMTAxLCJyY3ZmaWwgZGlzY2FyZCIsIiIsZGlzY2FyZCk7CisJICAgIHRsb2coRjEwMCwiIHJlZnVzZWQ6IG5hbWUiLCIiLDApOworCSAgICBicmVhazsKKworCSAgY2FzZSBYWUZYX1I6CQkJLyogUmVuYW1lIGluY29taW5nIGZpbGUgKi8KKwkgICAgem5ld24ob2ZuMSwmb2ZuMik7CQkvKiBNYWtlIG5ldyBuYW1lIGZvciBpdCAqLworI2lmZGVmIE9TMk9OTFkKKwkgICAgaWYgKGlhdHRyLmxvbmduYW1lLmxlbikgeworCQljaGFyIHRtcFsxMF07CisJCWV4dGVybiBpbnQgY2tfem5ld247CisJCXNwcmludGYodG1wLCIufiVkfiIsY2tfem5ld24pOworCQluZXdsb25nbmFtZSA9CisJCSAgKGNoYXIgKikgbWFsbG9jKGlhdHRyLmxvbmduYW1lLmxlbiArIHN0cmxlbih0bXApICsgMSk7CisJCWlmIChuZXdsb25nbmFtZSkgeworCQkgICAgc3RyY3B5KG5ld2xvbmduYW1lLCBpYXR0ci5sb25nbmFtZS52YWwpOyAvKiBzYWZlICovCisJCSAgICBzdHJjYXQobmV3bG9uZ25hbWUsIHRtcCk7IC8qIHNhZmUgKi8KKwkJICAgIGRlYnVnKEYxMTAsCisJCQkgICJSZW5hbWUgSW5jb21pbmc6IG5ld2xvbmduYW1lIixuZXdsb25nbmFtZSwwKTsKKwkJICAgIGlmIChpYXR0ci5sb25nbmFtZS5sZW4gJiYKKwkJCWlhdHRyLmxvbmduYW1lLnZhbCkKKwkJICAgICAgZnJlZShpYXR0ci5sb25nbmFtZS52YWwpOworCQkgICAgaWF0dHIubG9uZ25hbWUubGVuID0gc3RybGVuKG5ld2xvbmduYW1lKTsKKwkJICAgIGlhdHRyLmxvbmduYW1lLnZhbCA9IG5ld2xvbmduYW1lOworCQkgICAgLyogZnJlZShuZXdsb25nbmFtZSkgaGVyZSA/ICovCisJCX0KKwkgICAgfQorI2VuZGlmIC8qIE9TMk9OTFkgKi8KKwkgICAgYnJlYWs7CisJICBjYXNlIFhZRlhfWDoJCQkvKiBSZXBsYWNlIG9sZCBmaWxlICovCisJICAgIGRlYnVnKEYxMDAsInJjdmZpbCBvdmVyd3JpdGUiLCIiLDApOworCSAgICBpZiAoZGlyZmxnKSB7CisJCXJmX2VyciA9ICJDYW4ndCBvdmVyd3JpdGUgZXhpc3RpbmcgZGlyZWN0b3J5IjsKKwkJdGxvZyhGMTAwLCIgZXJyb3IgLSBjYW4ndCBvdmVyd3JpdGUgZGlyZWN0b3J5IiwiIiwwKTsKKwkJZGlzY2FyZCA9IG9wbmVyciA9IDE7CisjaWZkZWYgQ09NTUVOVAorCQlyZXR1cm4oMCk7CisjZWxzZQorCQlicmVhazsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJICAgIH0KKwkgICAgdGxvZyhGMTEwLCJvdmVyd3JpdGluZyIsb2ZuMSwwKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIFhZRlhfVToJCQkvKiBSZWZ1c2UgaWYgb2xkZXIgKi8KKwkgICAgZGVidWcoRjExMCwicmN2ZmlsIHVwZGF0ZSIsb2ZuMSwwKTsKKwkgICAgaWYgKGRpcmZsZykgeworCQlyZl9lcnIgPSAiRmlsZSBoYXMgc2FtZSBuYW1lIGFzIGV4aXN0aW5nIGRpcmVjdG9yeSI7CisJCXRsb2coRjExMCwiIGVycm9yIC0gZGlyZWN0b3J5IGV4aXN0czoiLG9mbjEsMCk7CisJCWRpc2NhcmQgPSBvcG5lcnIgPSAxOworI2lmZGVmIENPTU1FTlQKKwkJLyogRG9uJ3Qgc2VuZCBhbiBlcnJvciBwYWNrZXQsIGp1c3QgcmVmdXNlIHRoZSBmaWxlICovCisJCXJldHVybigwKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJICAgIH0KKwkgICAgYnJlYWs7CQkJLyogTm90IGhlcmUsIHdlIGRvbid0IGhhdmUgKi8KKwkJCQkJLyogdGhlIGF0dHJpYnV0ZSBwYWNrZXQgeWV0LiAqLworCSAgZGVmYXVsdDoKKwkgICAgb2ZwZXJtcyA9ICIiOworCSAgICBkZWJ1ZyhGMTAxLCJyY3ZmaWwgYmFkIGNvbGxpc2lvbiBhY3Rpb24iLCIiLGZuY2FjdCk7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisgICAgZGVidWcoRjExMCwicmN2ZmlsIG9mbjEiLG9mbjEsMCk7CisgICAgZGVidWcoRjExMCwicmN2ZmlsIG9mbjIiLG9mbjIsMCk7CisgICAgZGVidWcoRjExMCwicmN2ZmlsIG9mcGVybXMiLG9mcGVybXMsMCk7CisgICAgaWYgKGZuY2FjdCA9PSBYWUZYX1IgJiYgb2ZuMXggJiYgb2ZuMikgeyAvKiBSZW5hbWluZyBpbmNvbWluZyBmaWxlPyAqLworCXh4c2NyZWVuKFNDUl9BTiwwLDBsLG9mbjIpOwkvKiBEaXNwbGF5IHJlbmFtZWQgbmFtZSAqLworCWNrc3RybmNweShuLCBvZm4yLCBDS01BWFBBVEgrMSk7IC8qIFJldHVybiBpdCAqLworICAgIH0gZWxzZSB7CQkJCS8qIE5vICovCisJeHhzY3JlZW4oU0NSX0FOLDAsMGwsb2ZuMSk7CS8qIERpc3BsYXkgcmVndWxhciBuYW1lICovCisJY2tzdHJuY3B5KG4sIG9mbjEsIENLTUFYUEFUSCsxKTsgLyogYW5kIHJldHVybiBpdC4gKi8KKyAgICB9CisKKyNpZmRlZiBDS19NS0RJUgorLyogIENyZWF0ZSBkaXJlY3RvcnkocykgaWYgbmVjZXNzYXJ5LiAgKi8KKyAgICBpZiAoIWRpc2NhcmQgJiYgZm5ycGF0aCAhPSBQQVRIX09GRikgeyAvKiBSRUNFSVZFIFBBVEhBTUVTIE9OPyAqLworCWludCB4OworCWRlYnVnKEYxMTAsInJjdmZpbCBjYWxsaW5nIHpta2RpciIsb2ZuMSwwKTsgLyogWWVzICovCisJaWYgKCh4ID0gem1rZGlyKG9mbjEpKSA8IDApIHsKKwkgICAgZGVidWcoRjEwMCwiem1rZGlyIGZhaWxzIiwiIiwwKTsKKwkgICAgdGxvZyhGMTEwLCIgZXJyb3IgLSBkaXJlY3RvcnkgY3JlYXRpb24gZmFpbHVyZToiLG9mbjEsMCk7CisJICAgIHJmX2VyciA9ICJEaXJlY3RvcnkgY3JlYXRpb24gZmFpbHVyZS4iOworCSAgICBkaXNjYXJkID0gMTsKKwkgICAgcmV0dXJuKDApOworCX0KKyNpZmRlZiBUTE9HCisJZWxzZSBpZiAoeCA+IDApCisJICB0bG9nKEYxMTAsIiBwYXRoIGNyZWF0ZWQ6IixvZm4xLDApOworI2VuZGlmIC8qIFRMT0cgKi8KKyAgICB9CisjZWxzZQorICAgIGRlYnVnKEYxMTAsInJjdmZpbCBDS19NS0RJUiBub3QgZGVmaW5lZCIsb2ZuMSwwKTsKKyNlbmRpZiAvKiBDS19NS0RJUiAqLworCisgICAgaWYgKGNhbGlicmF0ZSkKKyAgICAgIGNrc3RybmNweShmc3BlYyxvZm4xLENLTUFYUEFUSCsxKTsKKyAgICBlbHNlCisgICAgICB6Zm5xZnAob2ZuMSxmc3BlY2xlbixmc3BlYyk7CisgICAgZGVidWcoRjExMCwicmN2ZmlsIGZzcGVjIixmc3BlYywwKTsKKworI2lmZGVmIENPTU1FTlQKKyAgICAvKiBTZWUgY29tbWVudHMgd2l0aCBWTVMgemZucWZwKCkuLi4gKi8KKyNpZmRlZiBWTVMKKyAgICAvKiB6Zm5xZnAoKSBkb2VzIG5vdCByZXR1cm4gdGhlIHZlcnNpb24gbnVtYmVyICovCisgICAgaWYgKCFjYWxpYnJhdGUpIHsKKwlpbnQgeCwgdjsKKwl4ID0gc3RybGVuKG9mbjEpOworCWlmICh4ID4gMCkgeworCSAgICBpZiAob2ZuMVt4LTFdID09ICc7JykgeworCQl2ID0gZ2V0dm51bShvZm4xKTsKKwkJY2tzdHJuY3B5KCZvZm4xW3hdLGNraXRvYSh2KSxDS01BWFBBVEgteCk7CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBmc3BlY1tmc3BlY2xlbl0gPSBOVUw7CisgICAgbWFrZXN0cigmcHJmc3BlYyxmc3BlYyk7CQkvKiBOZXcgcHJlbGltaW5hcnkgZmlsZW5hbWUgKi8KKworI2lmZGVmIFBJUEVTRU5ECisgIHJjdmZpbHg6CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKworICAgIGRlYnVnKEYxMTAsInJjdmZpbHg6IG4iLG4sMCk7CisgICAgZGVidWcoRjExMCwicmN2ZmlseDogb2ZuMSIsb2ZuMSwwKTsKKyAgICBmZmMgPSAwTDsJCQkJLyogSW5pdCBwZXItZmlsZSBjb3VudGVycyAqLworICAgIGNwcyA9IG9sZGNwcyA9IDBMOworICAgIHJzX2xlbiA9IDBMOworICAgIHJlamVjdGlvbiA9IC0xOworICAgIGZzZWNzID0gZ3RpbWVyKCk7CQkJLyogVGltZSB0aGlzIGZpbGUgc3RhcnRlZCAqLworI2lmZGVmIEdGVElNRVIKKyAgICBmcGZzZWNzID0gZ2Z0aW1lcigpOworICAgIGRlYnVnKEYxMDEsInJjdmZpbCBmcGZzZWNzIiwiIixmcGZzZWNzKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgZmlsY250Kys7CisgICAgaW50bXNnKGZpbGNudCk7CisgICAgcmV0dXJuKDEpOwkJCQkvKiBTdWNjZXNzZnVsIHJldHVybiAqLworfQorCisKKy8qICBSIEUgTyBGICAtLSAgUmVjZWl2ZSBFbmQgT2YgRmlsZSBwYWNrZXQgZm9yIGluY29taW5nIGZpbGUgKi8KKworLyoKKyAgQ2xvc2VzIHRoZSByZWNlaXZlZCBmaWxlLgorICBSZXR1cm5zOgorICAgIDAgb24gc3VjY2Vzcy4KKyAgIC0xIGlmIGZpbGUgY291bGQgbm90IGJlIGNsb3NlZC4KKyAgICAyIGlmIGRpc3Bvc2l0aW9uIHdhcyBtYWlsLCBtYWlsIHdhcyBzZW50LCBidXQgdGVtcCBmaWxlIG5vdCBkZWxldGVkLgorICAgIDMgaWYgZGlzcG9zaXRpb24gd2FzIHByaW50LCBmaWxlIHdhcyBwcmludGVkLCBidXQgbm90IGRlbGV0ZWQuCisgICAtMiBpZiBkaXNwb3NpdGlvbiB3YXMgbWFpbCBhbmQgbWFpbCBjb3VsZCBub3QgYmUgc2VudAorICAgLTMgaWYgZGlzcG9zaXRpb24gd2FzIHByaW50IGFuZCBmaWxlIGNvdWxkIG5vdCBiZSBwcmludGVkCisgICAtNCBpZiBNT1ZFLVRPOiBmYWlsZWQKKyAgIC01IGlmIFJFTkFNRS1UTzogZmFpbGVkCisqLworaW50CityZW9mKGYseXkpIGNoYXIgKmY7IHN0cnVjdCB6YXR0ciAqeXk7IHsKKyAgICBleHRlcm4gY2hhciAqIHJjdl9tb3ZlLCAqIHJjdl9yZW5hbWU7CisgICAgZXh0ZXJuIGludCBvX2lzb3BlbjsKKyAgICBpbnQgcmMgPSAwOwkJCQkvKiBSZXR1cm4gY29kZSAqLworICAgIGNoYXIgKnA7CisgICAgY2hhciBjOworCisgICAgZGVidWcoRjExMSwicmVvZiBmbmNhY3QiLGYsZm5jYWN0KTsKKyAgICBkZWJ1ZyhGMTAxLCJyZW9mIGRpc2NhcmQiLCIiLGRpc2NhcmQpOworICAgIHN1Y2Nlc3MgPSAxOwkJCS8qIEFzc3VtZSBzdGF0dXMgaXMgT0sgKi8KKyAgICBsc3N0YXRlID0gMDsJCQkvKiBDYW5jZWwgbG9ja2luZy1zaGlmdCBzdGF0ZSAqLworICAgIGlmIChkaXNjYXJkKSB7CQkJLyogSGFuZGxlIGF0dHJpYnV0ZSByZWZ1c2FscywgZXRjLiAqLworCWRlYnVnKEYxMDEsInJlb2YgZGlzY2FyZGluZyIsIiIsMCk7CisJc3VjY2VzcyA9IDA7CQkJLyogU3RhdHVzID0gZmFpbGVkLiAqLworCWlmIChyZWplY3Rpb24gPT0gJyMnIHx8CQkvKiBVbmxlc3MgcmVqZWN0aW9uIHJlYXNvbiBpcyAqLworCSAgICByZWplY3Rpb24gPT0gIDEgIHx8CQkvKiBkYXRlIG9yIG5hbWUgKFNFVCBGSUxFIENPTExJU0lPTiAqLworCSAgICByZWplY3Rpb24gPT0gJz8nKQkJLyogVVBEQVRFIG9yIERJU0NBUkQpICovCisJICBzdWNjZXNzID0gMTsKKwlkZWJ1ZyhGMTAxLCJyZW9mIHN1Y2Nlc3MiLCIiLHN1Y2Nlc3MpOworCWZpbHJlaisrOwkJCS8qIENvdW50IHRoaXMgcmVqZWN0aW9uLiAqLworCWRpc2NhcmQgPSAwOwkJCS8qIFdlIG5ldmVyIG9wZW5lZCB0aGUgZmlsZSwgKi8KKwlyZXR1cm4oMCk7CQkJLyogc28gd2UgZG9uJ3QgY2xvc2UgaXQuICovCisgICAgfQorI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworCWRlYnVnKEYxMDEsInJlb2YgY3hzZWVuIiwiIixjeHNlZW4pOworCWRlYnVnKEYxMDEsInJlb2YgY3pzZWVuIiwiIixjenNlZW4pOworCWRlYnVnKEYxMTAsInJlb2YgcmRhdGFwIixyZGF0YXAsMCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyAgICBpZiAoY3hzZWVuID09IDApCQkJLyogR290IGNhbmNlbCBkaXJlY3RpdmU/ICovCisgICAgICBjeHNlZW4gPSAoKnJkYXRhcCA9PSAnRCcpOworICAgIGlmIChjeHNlZW4gfHwgY3pzZWVuKQkJLyogKGZvciBoaW50cykgKi8KKyAgICAgIGludGVycnVwdGVkID0gMTsKKyAgICBzdWNjZXNzID0gKGN4c2VlbiB8fCBjenNlZW4pID8gMCA6IDE7IC8qIFNldCBTVUNDRVNTIGZsYWcgYXBwcm9wcmlhdGVseSAqLworICAgIGlmICghc3VjY2VzcykJCQkgIC8qICJVbmNvdW50IiB0aGlzIGZpbGUgKi8KKyAgICAgIGZpbHJlaisrOworICAgIGRlYnVnKEYxMDEsInJlb2Ygb19pc29wZW4iLCIiLG9faXNvcGVuKTsKKworICAgIGlmIChvX2lzb3BlbikgewkJCS8qIElmIGFuIG91dHB1dCBmaWxlIHdhcyBvcGVuLi4uICovCisKKyNpZmRlZiBDS19DVFJMWgorCWlmIChzdWNjZXNzKSB7CisJICAgIGRlYnVnKEYxMDEsInJlb2YgbGFzdGNoYXIiLCIiLGxhc3RjaGFyKTsKKwkgICAgaWYgKCFiaW5hcnkgJiYgZW9mbWV0aG9kID09IFhZRU9GX1ogJiYgbGFzdGNoYXIgIT0gMjYgJiYKKwkJKCF4ZmxnIHx8ICh4ZmxnICYmIHJlbWZpbGUpKSkKKwkgICAgICBwbmJ5dGUoKGNoYXIpMjYscHV0ZmlsKTsKKwl9CisjZW5kaWYgLyogQ0tfQ1RSTFogKi8KKworCXJjID0gY2xzb2YoY3hzZWVuIHx8IGN6c2Vlbik7CS8qIENsb3NlIHRoZSBmaWxlIChyZXNldHMgY3hzZWVuKSAqLworCWRlYnVnKEYxMDEsInJlb2YgY2xvc2YiLCIiLHJjKTsKKwlpZiAocmMgPCAwKSB7CQkJLyogSWYgZmFpbHVyZSB0byBjbG9zZSwgRkFJTCAqLworCSAgICBpZiAoc3VjY2VzcykgZmlscmVqKys7CisJICAgIHN1Y2Nlc3MgPSAwOworCX0KKwlpZiAoIWNhbGlicmF0ZSkgeworCSAgICAvKiBTZXQgZmlsZSBtb2RpZmljYXRpb24gZGF0ZSBhbmQvb3IgcGVybWlzc2lvbnMgKi8KKwkgICAgaWYgKHN1Y2Nlc3MpCisJICAgICAgenN0aW1lKGYseXksMCk7CisjaWZkZWYgT1MyT05MWQorI2lmZGVmIENLX0xBQkVMRUQKKwkgICAgaWYgKHN1Y2Nlc3MgJiYgeXktPmxvbmduYW1lLmxlbikKKwkgICAgICBvczJzZXRsb25nbmFtZShmLCB5eS0+bG9uZ25hbWUudmFsKTsKKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisjZW5kaWYgLyogT1MyT05MWSAqLworCX0KKwlpZiAoc3VjY2VzcyA9PSAwKSB7CQkvKiBBbmQgcHJvZ3JhbSByZXR1cm4gY29kZSAqLworCSAgICB4aXRzdGEgfD0gV19SRUNWOworCX0gZWxzZSBpZiAoc3VjY2VzcyA9PSAxKSB7CS8qIEZpbGUgcmVjJ2Qgc3VjY2Vzc2Z1bGx5ICovCisJICAgIG1ha2VzdHIoJnJyZnNwZWMscHJyZnNwZWMpOwkvKiBSZWNvcmQgaXQgZm9yIHdoZXJlbXNnICovCisJICAgIG1ha2VzdHIoJnJmc3BlYyxwcmZzcGVjKTsKKwl9CisKKy8qIEhhbmRsZSBkaXNwb3NpdGlvbnMgZnJvbSBhdHRyaWJ1dGUgcGFja2V0Li4uICovCisKKwljID0gTlVMOworI2lmbmRlZiBOT0ZSSUxMUworCWlmICghY2FsaWJyYXRlICYmIHl5LT5kaXNwLmxlbiAhPSAwKSB7CisJICAgIHAgPSB5eS0+ZGlzcC52YWw7CisJICAgIGMgPSAqcCsrOworI2lmbmRlZiBVTklYCisvKgorICBTZWUgY2tjcHJvLncuICBJbiBVTklYIHdlIGRvbid0IHVzZSB0ZW1wIGZpbGVzIGFueSBtb3JlIC0tIHdlIHBpcGUgdGhlCisgIHN0dWZmIHJpZ2h0IGludG8gbWFpbCBvciBscHIuCisqLworCSAgICBpZiAoYyA9PSAnTScpIHsJCS8qIE1haWwgdG8gdXNlci4gKi8KKwkJcmMgPSB6bWFpbChwLGZpbG5hbSk7CS8qIERvIHRoZSBzeXN0ZW0ncyBtYWlsIGNvbW1hbmQgKi8KKwkJaWYgKHJjIDwgMCkgc3VjY2VzcyA9IDA7CS8qIFJlbWVtYmVyIHN0YXR1cyAqLworCQl0bG9nKEYxMTAsIm1haWxlZCIsZmlsbmFtLDBMKTsKKwkJdGxvZyhGMTEwLCIgdG8iLHAsMEwpOworCQl6ZGVsZXQoZmlsbmFtKTsJCS8qIERlbGV0ZSB0aGUgZmlsZSAqLworCSAgICB9IGVsc2UgaWYgKGMgPT0gJ1AnKSB7CS8qIFByaW50IHRoZSBmaWxlLiAqLworCQlyYyA9IHpwcmludChwLGZpbG5hbSk7CS8qIERvIHRoZSBzeXN0ZW0ncyBwcmludCBjb21tYW5kICovCisJCWlmIChyYyA8IDApIHN1Y2Nlc3MgPSAwOyAvKiBSZW1lbWJlciBzdGF0dXMgKi8KKwkJdGxvZyhGMTEwLCJwcmludGVkIixmaWxuYW0sMEwpOworCQl0bG9nKEYxMTAsIiB3aXRoIG9wdGlvbnMiLHAsMEwpOworI2lmbmRlZiBWTVMKKyNpZm5kZWYgU1RSQVRVUworCQkvKiBzcG9vbGVyIGRlbGV0ZXMgZmlsZSBhZnRlciBwcmludCBjb21wbGV0ZSBpbiBWT1MgJiBWTVMgKi8KKwkJaWYgKHpkZWxldChmaWxuYW0pICYmIHJjID09IDApIHJjID0gMzsgLyogRGVsZXRlIHRoZSBmaWxlICovCisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIFZNUyAqLworCSAgICB9CisjZW5kaWYgLyogVU5JWCAqLworCX0KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisJaWYgKHN1Y2Nlc3MgJiYKKwkgICAgIXBpcGVzZW5kICYmCisJICAgICFjYWxpYnJhdGUgJiYgYyAhPSAnTScgJiYgYyAhPSAnUCcpIHsKKwkgICAgaWYgKHJjdl9tb3ZlKSB7CQkvKiBJZiAvTU9WRS1UTyB3YXMgZ2l2ZW4uLi4gKi8KKwkJY2hhciAqIHAgPSByY3ZfbW92ZTsKKyNpZmRlZiBDT01NRU5UCisvKiBObyBuZWVkIGZvciB0aGlzIC0gaXQncyBhIGRpcmVjdG9yeSBuYW1lICovCisJCWNoYXIgdG1wYnVmW0NLTUFYUEFUSCsxXTsKKwkJZXh0ZXJuIGludCBjbWRfcXVvdGluZzsJLyogZm9yIFx2KGZpbGVuYW1lKSAqLworCQlpZiAoY21kX3F1b3RpbmcpIHsJLyogQnV0IG9ubHkgaWYgY21kX3F1b3RpbmcgaXMgb24gKi8KKwkJICAgIGludCBuOworCQkgICAgbiA9IENLTUFYUEFUSDsKKwkJICAgIHAgPSB0bXBidWY7CisJCSAgICBkZWJ1ZyhGMTExLCJyZW9mIC9tb3ZlLXRvIixyY3ZfbW92ZSwwKTsKKwkJICAgIHp6c3RyaW5nKHJjdl9tb3ZlLCZwLCZuKTsKKwkJICAgIHAgPSB0bXBidWY7CisJCX0KKyNlbmRpZiAvKiBDT01NRU5UICovCisvKgorICBIZXJlIHdlIGNvdWxkIGNyZWF0ZSB0aGUgZGlyZWN0b3J5IGlmIGl0IGRpZG4ndCBleGlzdCAoYW5kIGl0IHdhcyByZWxhdGl2ZSkKKyAgYnV0IHRoZXJlIHdvdWxkIGhhdmUgdG8gYmUgYSB1c2VyLXNldHRhYmxlIG9wdGlvbiB0byBzYXkgd2hldGhlciB0byBkbyB0aGlzLgorKi8KKwkJcmMgPSB6cmVuYW1lKGZpbG5hbSxwKTsKKwkJZGVidWcoRjExMSwicmVvZiBNT1ZFIHpyZW5hbWUiLHJjdl9tb3ZlLHJjKTsKKwkJaWYgKHJjID4gLTEpIHsKKwkJICAgIHRsb2coRjExMCwiIG1vdmluZyByZWNlaXZlZCBmaWxlIHRvIixyY3ZfbW92ZSwwKTsKKwkJfSBlbHNlIHsKKwkJICAgIHJjID0gLTQ7CisJCSAgICB0bG9nKEYxMTAsIiBGQUlMRUQgdG8gbW92ZSByZWNlaXZlZCBmaWxlIHRvIixyY3ZfbW92ZSwwKTsKKwkJfQorCSAgICB9IGVsc2UgaWYgKHJjdl9yZW5hbWUpIHsJLyogT3IgL1JFTkFNRS1UTzogKi8KKwkJY2hhciAqcyA9IHJjdl9yZW5hbWU7CS8qIFRoaXMgaXMgdGhlIHJlbmFtaW5nIHN0cmluZyAqLworI2lmbmRlZiBOT1NQTAorCQljaGFyIHRtcG5hbVtDS01BWFBBVEgrMTZdOworCQlleHRlcm4gaW50IGNtZF9xdW90aW5nOwkvKiBmb3IgXHYoZmlsZW5hbWUpICovCisJCWlmIChjbWRfcXVvdGluZykgewkvKiBCdXQgb25seSBpZiBjbWRfcXVvdGluZyBpcyBvbiAqLworCQkgICAgaW50IG47CQkvKiBQYXNzIGl0IHRocnUgdGhlIGV2YWx1YXRvciAqLworCQkgICAgbiA9IENLTUFYUEFUSDsKKwkJICAgIHMgPSAoY2hhciAqKXRtcG5hbTsKKwkJICAgIHp6c3RyaW5nKHJjdl9yZW5hbWUsJnMsJm4pOworCQkgICAgcyA9IChjaGFyICopdG1wbmFtOworCQl9CisjZW5kaWYgLyogTk9TUEwgKi8KKwkJaWYgKHMpIGlmICgqcykgeworCQkgICAgcmMgPSB6cmVuYW1lKGZpbG5hbSxzKTsKKwkJICAgIGRlYnVnKEYxMTEsInJlb2YgUkVOQU1FIHpyZW5hbWUiLHMscmMpOworCQkgICAgaWYgKHJjID4gLTEpIHsKKwkJCXRsb2coRjExMCwiIHJlbmFtaW5nIHJlY2VpdmVkIGZpbGUgdG8iLHMsMCk7CisJCSAgICB9IGVsc2UgeworCQkJcmMgPSAtNTsKKwkJCXRsb2coRjExMCwiIEZBSUxFRCB0byByZW5hbWUgcmVjZWl2ZWQgZmlsZSB0byIscywwKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJyZW9mIHN1Y2Nlc3MiLCIiLHN1Y2Nlc3MpOworICAgIGRlYnVnKEYxMDEsInJlb2YgcmV0dXJucyIsIiIscmMpOworCisgICAgZmlsbmFtWzBdID0gTlVMOwkJCS8qIEVyYXNlIHRoZSBmaWxlbmFtZSAqLworICAgIHJldHVybihyYyk7Cit9CisKKy8qICBSIEUgTyBUICAtLSAgUmVjZWl2ZSBFbmQgT2YgVHJhbnNhY3Rpb24gICovCisKK1ZPSUQKK3Jlb3QoKSB7CisgICAgY3hzZWVuID0gY3pzZWVuID0gZGlzY2FyZCA9IDA7CS8qIFJlc2V0IGludGVycnVwdGlvbiBmbGFncyAqLworICAgIHRzdGF0cygpOwkJCQkvKiBGaW5hbGl6ZSB0cmFuc2ZlciBzdGF0aXN0aWNzICovCit9CisKKy8qICBTIEYgSSBMIEUgLS0gU2VuZCBGaWxlIGhlYWRlciBvciB0ZVh0IGhlYWRlciBwYWNrZXQgICovCisKKy8qCisgIENhbGwgd2l0aCB4IG5vbnplcm8gZm9yIFggcGFja2V0LCB6ZXJvIGZvciBGIHBhY2tldC4KKyAgSWYgWCA9PSAwLCBmaWxlbmFtZSB0byBzZW5kIGlzIGluIGZpbG5hbVtdLCBhbmQgaWYgY21hcmcyIGlzIG5vdCBudWxsCisgIG9yIGVtcHR5LCB0aGUgZmlsZSBzaG91bGQgYmUgc2VudCB1bmRlciB0aGlzIG5hbWUgcmF0aGVyIHRoYW4gZmlsbmFtW10uCisgIElmIHNuZGZpbHRlciBub3QgTlVMTCwgaXQgaXMgdGhlIG5hbWUgb2YgYSBzZW5kIGZpbHRlci4KKyAgUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4KKyovCitpbnQKK3NmaWxlKHgpIGludCB4OyB7CisjaWZkZWYgcGRwMTEKKyNkZWZpbmUgUEtUTkwgNjQKKyNlbHNlCisjZGVmaW5lIFBLVE5MIDI1NgorI2VuZGlmIC8qIHBkcDExICovCisgICAgY2hhciBwa3RuYW1bUEtUTkwrMV07CQkvKiBMb2NhbCBjb3B5IG9mIG5hbWUgKi8KKyAgICBjaGFyICpzOworICAgIGludCByYzsKKyAgICBpbnQgbm90YWZpbGUgPSAwOworICAgIGV4dGVybiBpbnQgZmlsZXBlZWs7CisjaWZkZWYgUElQRVNFTkQKKyAgICBleHRlcm4gY2hhciAqIHNuZGZpbHRlcjsKKworICAgIGlmIChzbmRmaWx0ZXIpIHsKKwlwaXBlc2VuZCA9IDE7CisJZGVidWcoRjExMCwic2ZpbGUgc2VuZCBmaWx0ZXIgIixzbmRmaWx0ZXIsMCk7CisgICAgfQorI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyAgICBub3RhZmlsZSA9IGNhbGlicmF0ZSB8fCBzbmRhcnJheSB8fCBwaXBlc2VuZCB8fCB4OworICAgIGRlYnVnKEYxMDEsInNmaWxlIHgiLCIiLHgpOworICAgIGRlYnVnKEYxMDEsInNmaWxlIG5vdGFmaWxlIiwiIixub3RhZmlsZSk7CisKKyNpZm5kZWYgTk9DU0VUUworICAgIGlmICh0Y3Nfc2F2ZSA+IC0xKSB7ICAgICAgICAgICAgICAgIC8qIENoYXJhY3RlciBzZXRzICovCisgICAgICAgIHRjaGFyc2V0ID0gdGNzX3NhdmU7CisgICAgICAgIHRjc19zYXZlID0gLTE7CisJZGVidWcoRjEwMSwic2ZpbGUgcmVzdG9yZWQgdGNoYXJzZXQiLCIiLHRjaGFyc2V0KTsKKyAgICB9CisgICAgaWYgKGZjc19zYXZlID4gLTEpIHsKKyAgICAgICAgZmNoYXJzZXQgPSBmY3Nfc2F2ZTsKKyAgICAgICAgZmNzX3NhdmUgPSAtMTsKKwlkZWJ1ZyhGMTAxLCJzZmlsZSByZXN0b3JlZCBmY2hhcnNldCIsIiIsZmNoYXJzZXQpOworICAgIH0KKyAgICBzZXR4bGF0eXBlKHRjaGFyc2V0LGZjaGFyc2V0KTsgICAgICAvKiBUcmFuc2xhdGlvbiB0eXBlICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCisgICAgLyogY21hcmcyIG9yIGZpbG5hbSAod2l0aCB0aGF0IHByZWNlZGVuY2UpIGhhdmUgdGhlIGZpbGUncyBuYW1lICovCisKKyAgICBsc3N0YXRlID0gMDsJCQkvKiBDYW5jZWwgbG9ja2luZy1zaGlmdCBzdGF0ZSAqLworI2lmZGVmIENPTU1FTlQKKyAgICAvKiBEbyB0aGlzIGFmdGVyIG1ha2luZyBzdXJlIHdlIGNhbiBvcGVuIHRoZSBmaWxlICovCisgICAgaWYgKG54dHBrdCgpIDwgMCkgcmV0dXJuKDApOwkvKiBCdW1wIHBhY2tldCBudW1iZXIsIGdldCBidWZmZXIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgcGt0bmFtWzBdID0gTlVMOwkJCS8qIEJ1ZmZlciBmb3IgbmFtZSB3ZSB3aWxsIHNlbmQgKi8KKyAgICBpZiAoeCA9PSAwKSB7CQkJLyogRi1QYWNrZXQgc2V0dXAgKi8KKwlpZiAoIWNtYXJnMikgY21hcmcyID0gIiI7CisjaWZkZWYgREVCVUcKKwlpZiAoZGVibG9nKSB7CisJICAgIGRlYnVnKEYxMTEsInNmaWxlIGNtYXJnMiIsY21hcmcyLGNtYXJnMik7CisJICAgIGRlYnVnKEYxMDEsInNmaWxlIGJpbmFyeSAxIiwiIixiaW5hcnkpOworCSAgICBkZWJ1ZyhGMTAxLCJzZmlsZSB3ZWFyZWFsaWtlIiwiIix3ZWFyZWFsaWtlKTsKKwkgICAgZGVidWcoRjEwMSwic2ZpbGUgeGZlcm1vZGUiLCIiLHhmZXJtb2RlKTsKKwkgICAgZGVidWcoRjEwMSwic2ZpbGUgZmlsZXBlZWsiLCIiLGZpbGVwZWVrKTsKKyNpZm5kZWYgTk9DU0VUUworCSAgICBkZWJ1ZyhGMTAxLCJzZmlsZSBzX2NzZXQiLCIiLHNfY3NldCk7CisJICAgIGRlYnVnKEYxMDEsInNmaWxlIHRjaGFyc2V0IiwiIix0Y2hhcnNldCk7CisJICAgIGRlYnVnKEYxMDEsInNmaWxlIHhmcnhsYSIsIiIseGZyeGxhKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisJfQorI2VuZGlmIC8qIERFQlVHICovCisJaWYgKHhmZXJtb2RlID09IFhNT0RFX0EJCS8qIFRSQU5TRkVSIE1PREUgQVVUT01BVElDICovCisjaWZuZGVmIE5PTVNFTkQKKwkgICAgJiYgIWFkZGxpc3QJCQkvKiBBbmQgbm90IHdvcmtpbmcgZnJvbSBhIFNFTkQtTElTVCAqLworI2VuZGlmIC8qIE5PTVNFTkQgKi8KKwkgICAgKSB7CisJICAgIC8qIE90aGVyIEtlcm1pdCBpcyBvbiBhIGxpa2Ugc3lzdGVtIGFuZCBubyBjaGFyc2V0IHRyYW5zbGF0aW9uICovCisJICAgIGlmICh3ZWFyZWFsaWtlCisjaWZuZGVmIE5PQ1NFVFMKKwkJJiYgKHRjaGFyc2V0ID09IFRDX1RSQU5TUCB8fCB4ZnJ4bGEgPT0gMCkKKyNlbmRpZiAvKiBOT0NTRVRTICovCisJCSkgeworI2lmZGVmIFZNUworCQlpZiAoYmluYXJ5ICE9IFhZRlRfSSkKKyNlbmRpZiAvKiBWTVMgKi8KKyNpZmRlZiBDS19MQUJFTEVECisJCSAgaWYgKGJpbmFyeSAhPSBYWUZUX0wpCisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworCQkgICAgYmluYXJ5ID0gWFlGVF9COwkvKiBTZW5kIGFsbCBmaWxlcyBpbiBiaW5hcnkgbW9kZSAqLworCSAgICB9CisKKwkgICAgLyogT3RoZXJ3aXNlIHNlbGVjdCB0cmFuc2ZlciBtb2RlIGJhc2VkIG9uIGZpbGUgaW5mbyAqLworCisJICAgIGVsc2UgaWYgKCFub3RhZmlsZQkJLyogYnV0IG5vdCBpZiBzZW5kaW5nIGZyb20gcGlwZSAqLworI2lmZGVmIENLX0xBQkVMRUQKKwkJICAgICAmJiBiaW5hcnkgIT0gWFlGVF9MIC8qIGFuZCBub3QgaWYgRklMRSBUWVBFIExBQkVMRUQgKi8KKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisjaWZkZWYgVk1TCisJCSAgICAgJiYgYmluYXJ5ICE9IFhZRlRfSSAvKiBvciBGSUxFIFRZUEUgSU1BR0UgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKwkJICAgICApIHsKKyNpZmRlZiBVTklDT0RFCisJCWZpbGVvcmRlciA9IC0xOwkJLyogRmlsZSBieXRlIG9yZGVyICovCisjZW5kaWYgLyogVU5JQ09ERSAqLworCQlpZiAoZmlsZXBlZWsgJiYgIW5vdGFmaWxlKSB7IC8qIFJlYWwgZmlsZSwgRklMRSBTQ0FOIGlzIE9OICovCisJCSAgICBpbnQgaywgeDsKKwkJICAgIGsgPSBzY2FuZmlsZShmaWxuYW0sJngsbnNjYW5maWxlKTsgLyogU2NhbiB0aGUgZmlsZSAqLworCQkgICAgZGVidWcoRjEwMSwic2ZpbGUgc2NhbmZpbGUiLCIiLGspOworCQkgICAgc3dpdGNoIChrKSB7CisJCSAgICAgIGNhc2UgRlRfVEVYVDoJLyogVW5zcGVjaWZpZWQgdGV4dCAqLworCQkJZGVidWcoRjEwMCwic2ZpbGUgc2NhbmZpbGUgdGV4dCIsIiIsMCk7CisJCQliaW5hcnkgPSBYWUZUX1Q7IC8qIFNFVCBGSUxFIFRZUEUgVEVYVCAqLworCQkJYnJlYWs7CisjaWZuZGVmIE5PQ1NFVFMKKwkJICAgICAgY2FzZSBGVF83QklUOgkJLyogNy1iaXQgdGV4dCAqLworCQkJYmluYXJ5ID0gWFlGVF9UOwkvKiBTRVQgRklMRSBUWVBFIFRFWFQgKi8KKwkJCS8qIElmIFNFTkQgQ0hBUlNFVC1TRUxFQ1RJT04gQVVUTyAgKi8KKwkJCS8qIGFuZCBTRVQgVFJBTlNGRVIgVFJBTlNMQVRJT04gaXMgT04gKi8KKwkJCWRlYnVnKEYxMDAsInNmaWxlIHNjYW5maWxlIHRleHQ3IiwiIiwwKTsKKwkJCWlmIChzX2NzZXQgPT0gWE1PREVfQSAmJiB4ZnJ4bGEpIHsKKwkJCSAgICBpZiAoZmNzaW5mb1tmY2hhcnNldF0uc2l6ZSAhPSAxMjgpIHsKKwkJCQlmY3Nfc2F2ZSA9IGZjaGFyc2V0OyAvKiBDdXJyZW50IEZDUyBub3QgN2JpdCAqLworCQkJCWZjaGFyc2V0ID0gZGNzZXQ3OyAgIC8qIFVzZSBkZWZhdWx0IDdiaXQgc2V0ICovCisJCQkJZGVidWcoRjEwMSwic2ZpbGUgc2NhbmZpbGUgNyBmY2hhcnNldCIsCisJCQkJICAgICAgIiIsZmNoYXJzZXQpOworCQkJICAgIH0KKwkJCSAgICAvKiBBbmQgYWxzbyBzd2l0Y2ggdG8gYXBwcm9wcmlhdGUgVENTICovCisJCQkgICAgaWYgKGFmY3NldFtmY2hhcnNldF0gPiAtMSAmJgorCQkJCWFmY3NldFtmY2hhcnNldF0gPD0gTUFYVENTRVRTKSB7CisJCQkJdGNzX3NhdmUgPSB0Y2hhcnNldDsKKwkJCQl0Y2hhcnNldCA9IGFmY3NldFtmY2hhcnNldF07CisJCQkJZGVidWcoRjEwMSwic2ZpbGUgc2NhbmZpbGUgNyB0Y2hhcnNldCIsIiIsCisJCQkJICAgICAgdGNoYXJzZXQpOworCQkJICAgIH0KKwkJCSAgICBzZXR4bGF0eXBlKHRjaGFyc2V0LGZjaGFyc2V0KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCSAgICAgIGNhc2UgRlRfOEJJVDoJLyogOC1iaXQgdGV4dCAqLworCQkJYmluYXJ5ID0gWFlGVF9UOyAvKiBTRVQgRklMRSBUWVBFIFRFWFQgKi8KKwkJCS8qIElmIFNFTkQgQ0hBUlNFVC1TRUxFQyBBVVRPICAqLworCQkJLyogYW5kIFNFVCBUUkFOU0ZFUiBUUkFOU0xBVElPTiBpcyBPTiAqLworCQkJZGVidWcoRjEwMCwic2ZpbGUgc2NhbmZpbGUgdGV4dDgiLCIiLDApOworCQkJaWYgKHNfY3NldCA9PSBYTU9ERV9BICYmIHhmcnhsYSkgeworCQkJICAgIGlmIChmY3NpbmZvW2ZjaGFyc2V0XS5zaXplICE9IDI1NikgeworCQkJCWZjc19zYXZlID0gZmNoYXJzZXQ7IC8qIEN1cnJlbnQgRkNTIG5vdCA4Yml0ICovCisJCQkJZmNoYXJzZXQgPSBkY3NldDg7IC8qIFVzZSBkZWZhdWx0IDhiaXQgc2V0ICovCisJCQkJZGVidWcoRjEwMSwic2ZpbGUgc2NhbmZpbGUgOCBmY2hhcnNldCIsCisJCQkJICAgICAgIiIsZmNoYXJzZXQpOworCQkJICAgIH0KKwkJCSAgICAvKiBTd2l0Y2ggdG8gY29ycmVzcG9uZGluZyB0cmFuc2ZlciBjaGFyc2V0ICovCisJCQkgICAgaWYgKGFmY3NldFtmY2hhcnNldF0gPiAtMSAmJgorCQkJCWFmY3NldFtmY2hhcnNldF0gPD0gTUFYVENTRVRTKSB7CisJCQkJdGNzX3NhdmUgPSB0Y2hhcnNldDsKKwkJCQl0Y2hhcnNldCA9IGFmY3NldFtmY2hhcnNldF07CisJCQkJZGVidWcoRjEwMSwic2ZpbGUgc2NhbmZpbGUgOCB0Y2hhcnNldCIsIiIsCisJCQkJICAgICAgdGNoYXJzZXQpOworCQkJICAgIH0KKwkJCSAgICBzZXR4bGF0eXBlKHRjaGFyc2V0LGZjaGFyc2V0KTsKKwkJCX0KKwkJCWJyZWFrOworI2lmZGVmIFVOSUNPREUKKwkJICAgICAgY2FzZSBGVF9VVEY4OgkvKiBVVEYtOCB0ZXh0ICovCisJCSAgICAgIGNhc2UgRlRfVUNTMjoJLyogVUNTLTIgdGV4dCAqLworCQkJZGVidWcoRjEwMSwic2ZpbGUgc2NhbmZpbGUgVW5pY29kZSIsIiIsayk7CisJCQliaW5hcnkgPSBYWUZUX1Q7CisJCQkvKiBJZiBTRU5EIENIQVJTRVQtU0VMRUMgQVVUTyAgKi8KKwkJCS8qIGFuZCBTRVQgVFJBTlNGRVIgVFJBTlNMQVRJT04gaXMgT04gKi8KKwkJCWlmIChzX2NzZXQgPT0gWE1PREVfQSAmJiB4ZnJ4bGEpIHsKKwkJCSAgICBmY3Nfc2F2ZSA9IGZjaGFyc2V0OworCQkJICAgIHRjc19zYXZlID0gdGNoYXJzZXQ7CisJCQkgICAgZmNoYXJzZXQgPSAoayA9PSBGVF9VQ1MyKSA/IEZDX1VDUzIgOiBGQ19VVEY4OworCQkJICAgIGlmIChrID09IEZUX1VDUzIgJiYgeCA+IC0xKQorCQkJICAgICAgZmlsZW9yZGVyID0geDsKKwkJCX0KKwkJCS8qIFN3aXRjaCB0byBhc3NvY2lhdGVkIHRyYW5zZmVyIGNoYXJzZXQgaWYgYW55ICovCisJCQlpZiAoYWZjc2V0W2ZjaGFyc2V0XSA+IC0xICYmCisJCQkgICAgYWZjc2V0W2ZjaGFyc2V0XSA8PSBNQVhUQ1NFVFMpCisJCQkgIHRjaGFyc2V0ID0gYWZjc2V0W2ZjaGFyc2V0XTsKKwkJCWlmICh0Y2hhcnNldCA9PSBUQ19UUkFOU1ApIC8qIElmIG5vbmUgKi8KKwkJCSAgdGNoYXJzZXQgPSBUQ19VVEY4OyAgICAgIC8qIHVzZSBVVEYtOCAqLworCQkJc2V0eGxhdHlwZSh0Y2hhcnNldCxmY2hhcnNldCk7CisJCQlkZWJ1ZyhGMTAxLCJzZmlsZSBVbmljb2RlIHRjaGFyc2V0IiwiIix0Y2hhcnNldCk7CisJCQlicmVhazsKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCQkgICAgICBjYXNlIEZUX0JJTjoKKwkJCWRlYnVnKEYxMDEsInNmaWxlIHNjYW5maWxlIGJpbmFyeSIsIiIsayk7CisJCQliaW5hcnkgPSBYWUZUX0I7CisJCQlicmVhazsKKwkJICAgIC8qIERlZmF1bHQ6IERvbid0IGNoYW5nZSBhbnl0aGluZyAqLworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgZGVidWcoRjEwMSwic2ZpbGUgYmluYXJ5IDIiLCIiLGJpbmFyeSk7CisJICAgIGRlYnVnKEYxMDEsInNmaWxlIHNlbmRtb2RlIiwiIixzZW5kbW9kZSk7CisJfQorICAgIAlpZiAoKmNtYXJnMikgewkJCS8qIElmIHdlIGhhdmUgYSBzZW5kLWFzIG5hbWUuLi4gKi8KKwkgICAgaW50IHk7IGNoYXIgKnM7CisjaWZuZGVmIE5PU1BMCQkJCS8qIGFuZCBhIHNjcmlwdCBwcm9ncmFtbWluZyBsYW5ndWFnZSAqLworCSAgICBleHRlcm4gaW50IGNtZF9xdW90aW5nOworCSAgICBpZiAoY21kX3F1b3RpbmcpIHsJCS8qIGFuZCBpdCdzIG5vdCB0dXJuZWQgb2ZmICovCisJCXkgPSBQS1ROTDsJCS8qIHBhc3MgYXMtbmFtZSB0aHJ1IHRoZSBldmFsdWF0b3IgKi8KKwkJcyA9IHBrdG5hbTsKKwkJenpzdHJpbmcoY21hcmcyLCZzLCZ5KTsKKyNpZmRlZiBDT01NRU5UCisvKiBUaGlzIHJ1aW5zIG1hY3JvcyBsaWtlIEJTRU5EICovCisJCWlmICghcGt0bmFtWzBdKQkJLyogYW5kIG1ha2Ugc3VyZSByZXN1bHQgaXMgbm90IGVtcHR5ICovCisJCSAgc3ByaW50Zihwa3RuYW0sIkZJTEUlMDJsZCIsZmlsY250KTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJICAgIH0gZWxzZQorI2VuZGlmIC8qIE5PU1BMICovCisJICAgICAgY2tzdHJuY3B5KHBrdG5hbSxjbWFyZzIsUEtUTkwpOyAvKiBjb3B5IGl0IGxpdGVyYWxseSwgKi8KKworCSAgICBkZWJ1ZyhGMTEwLCJzZmlsZSBwa3RuYW0iLHBrdG5hbSwwKTsKKyNpZmRlZiBDT01NRU5UCisvKiBXZSBkb24ndCBkbyB0aGlzIGFueSBtb3JlIGJlY2F1c2Ugbm93IHdlIGhhdmUgZmlsZW5hbWUgdGVtcGxhdGVzICovCisJICAgIGNtYXJnMiA9ICIiOwkJLyogYW5kIGJsYW5rIGl0IG91dCBmb3IgbmV4dCB0aW1lLiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAJfQorCWlmICghKnBrdG5hbSkgewkJCS8qIE5vIGFzLW5hbWUuLi4gKi8KKyNpZmRlZiBOWkxUT1IKKwkgICAgaW50IHhmbmNudiwgeHBhdGg7CisJICAgIGRlYnVnKEYxMDEsInNmaWxlIGZuc3BhdGgiLCIiLGZuc3BhdGgpOworCSAgICBkZWJ1ZyhGMTAxLCJzZmlsZSBmbmNudiIsIiIsZm5jbnYpOworCSAgICB4Zm5jbnYgPSBmbmNudjsKKwkgICAgeHBhdGggPSBmbnNwYXRoOworCSAgICBpZiAobm90YWZpbGUpIHsJCS8qIElmIG5vdCBhbiBhY3R1YWwgZmlsZSAqLworCQl4Zm5jbnYgPSAwOwkJLyogRG9uJ3QgY29udmVydCBuYW1lICovCisJCXhwYXRoID0gUEFUSF9PRkY7CS8qIExlYXZlIHBhdGggb2ZmICovCisJICAgIH0gZWxzZSBpZiAoeGZuY252ICYmCisJCSAgICAgICAoIXN0cmNtcCh3aG9hcmV1LCJVMSIpIHx8ICFzdHJjbXAod2hvYXJldSwiVU4iKSkKKwkJICAgICAgICkgeworCQkvKiBMZXNzLXN0cmljdCBjb252ZXJzaW9uIGlmIHBhcnRuZXIgaXMgVU5JWCBvciBXaW4zMiAqLworCQl4Zm5jbnYgPSAtMTsKKwkgICAgfQorCSAgICBkZWJ1ZyhGMTAxLCJzZmlsZSB4cGF0aCIsIiIseHBhdGgpOworCSAgICBkZWJ1ZyhGMTAxLCJzZmlsZSB4Zm5jbnYiLCIiLHhmbmNudik7CisJICAgIG56bHRvcihmaWxuYW0scGt0bmFtLHhmbmNudix4cGF0aCxQS1ROTCk7CisKKyNlbHNlICAvKiBOb3QgTlpMVE9SICovCisKKwkgICAgZGVidWcoRjEwMSwic2ZpbGUgZm5zcGF0aCIsIiIsZm5zcGF0aCk7CisJICAgIGlmIChmbnNwYXRoID09IFBBVEhfT0ZGCS8qIFN0cmlwcGluZyBwYXRoIG5hbWVzPyAqLworCQkmJiAoIW5vdGFmaWxlKQkJLyogKG9mIGFjdHVhbCBmaWxlcykgKi8KKwkJKSB7CisJCWNoYXIgKnQ7CQkvKiBZZXMuICovCisJCXpzdHJpcChmaWxuYW0sJnQpOwkvKiBTdHJpcCBvZmYgdGhlIHBhdGguICovCisJCWRlYnVnKEYxMTAsInNmaWxlIHpzdHJpcCIsdCwwKTsKKwkJaWYgKCF0KSB0ID0gIlVOS05PV04iOwkvKiBCZSBjYXV0aW91cy4uLiAqLworCQllbHNlIGlmICgqdCA9PSAnXDAnKQorCQkgIHQgPSAiVU5LTk9XTiI7CisJCWNrc3RybmNweShwa3RuYW0sdCxQS1ROTCk7IC8qIENvcHkgc3RyaXBwZWQgbmFtZSBsaXRlcmFsbHkuICovCisJICAgIH0gZWxzZSBpZiAoZm5zcGF0aCA9PSBQQVRIX0FCUyAmJiAhbm90YWZpbGUpIHsKKwkJLyogQ29udmVydGluZyB0byBhYnNvbHV0ZSBmb3JtICovCisJCXpmbnFmcChmaWxuYW0sUEtUTkwscGt0bmFtKTsKKwkgICAgfSBlbHNlCisJCWNrc3RybmNweShwa3RuYW0sZmlsbmFtLFBLVE5MKTsKKworCSAgICAvKiBwa3RuYW1bXSBoYXMgdGhlIHBhY2tldCBuYW1lLCBmaWxuYW1bXSBoYXMgdGhlIG9yaWdpbmFsIG5hbWUuICovCisJICAgIC8qIEJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGNvbnZlcnQgcGt0bmFtIGlmIEZJTEUgTkFNRVMgQ09OVkVSVEVELiAgKi8KKworCSAgICBkZWJ1ZyhGMTAxLCJzZmlsZSBmbmNudiIsIiIsZm5jbnYpOworCSAgICBpZiAoZm5jbnYgJiYgIW5vdGFmaWxlKSB7CS8qIElmIGNvbnZlcnRpbmcgbmFtZXMgb2YgZmlsZXMgKi8KKwkJemx0b3IocGt0bmFtLChjaGFyICopc3J2Y21kKTsgLyogY29udmVydCBpdCB0byBjb21tb24gZm9ybSwgKi8KKwkJY2tzdHJuY3B5KHBrdG5hbSwoY2hhciAqKXNydmNtZCxQS1ROTCk7CisJCSpzcnZjbWQgPSBOVUw7CisJICAgIH0KKyNlbmRpZiAvKiBOWkxUT1IgKi8KKyAgICAJfQorCWlmICghKnBrdG5hbSkJCQkvKiBGYWlsc2FmZS4uLiAqLworCSAgc3ByaW50Zihwa3RuYW0sIkZJTEUlMDJsZCIsZmlsY250KTsKKwlkZWJ1ZyhGMTEwLCJzZmlsZSBmaWxuYW0gMSIsZmlsbmFtLDApOworCWRlYnVnKEYxMTAsInNmaWxlIHBrdG5hbSAxIixwa3RuYW0sMCk7CisjaWZkZWYgUElQRVNFTkQKKy8qIElmIHdlIGhhdmUgYSBzZW5kIGZpbHRlciwgc3Vic3RpdHV0ZSB0aGUgY3VycmVudCBmaWxlbmFtZSBpbnRvIGl0ICovCisKKwlpZiAoc25kZmlsdGVyKSB7CisJICAgIGNoYXIgKiBwID0gTlVMTCwgKiBxOworCSAgICBpbnQgbiA9IENLTUFYUEFUSDsKKyNpZm5kZWYgTk9TUEwKKwkgICAgaWYgKChwID0gKGNoYXIgKikgbWFsbG9jKG4gKyAxKSkpIHsKKwkJcSA9IHA7CisJCWRlYnVnKEYxMTAsInNmaWxlIHBpcGVzZW5kIGZpbHRlciIsc25kZmlsdGVyLDApOworCQl6enN0cmluZyhzbmRmaWx0ZXIsJnAsJm4pOworCQlkZWJ1ZyhGMTExLCJzZmlsZSBwaXBlbmFtZSIscSxuKTsKKwkJaWYgKG4gPD0gMCkgeworCQkgICAgcHJpbnRmKAorCQkJICAiP1NvcnJ5LCBzZW5kIGZpbHRlciArIGZpbGVuYW1lIHRvbyBsb25nLCAlZCBtYXguXG4iLAorCQkJICAgQ0tNQVhQQVRICisJCQkgICApOworCQkgICAgZnJlZShxKTsKKwkJICAgIHJldHVybigwKTsKKwkJfQorCQlja3N0cm5jcHkoZmlsbmFtLHEsQ0tNQVhQQVRIKzEpOworCQlmcmVlKHEpOworCSAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKwl9CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKworICAgIAlkZWJ1ZyhGMTEwLCJzZmlsZSBmaWxuYW0gMiIsZmlsbmFtLDApOyAvKiBMb2cgZGVidWdnaW5nIGluZm8gKi8KKyAgICAJZGVidWcoRjExMCwic2ZpbGUgcGt0bmFtIDIiLHBrdG5hbSwwKTsKKyAgICAJaWYgKG9wZW5pKGZpbG5hbSkgPT0gMCkgCS8qIFRyeSB0byBvcGVuIHRoZSBpbnB1dCBmaWxlICovCisJICByZXR1cm4oMCk7CisKKyNpZmRlZiBDS19SRVNFTkQKKy8qCisgIFRoZSBmb2xsb3dpbmcgY2hlY2sgaXMgZG9uZSBhZnRlciBvcGVuaSgpIGlzIGNhbGxlZCwgc2luY2Ugb3BlbmkoKSBpdHNlbGYKKyAgY2FuIGNoYW5nZSB0aGUgdHJhbnNmZXIgbW9kZSAoYXMgaW4gVk1TKS4KKyovCisgICAgICAgIGlmICgoYmluYXJ5ID09IFhZRlRfVAorI2lmZGVmIFZNUworCSAgICAgfHwgYmluYXJ5ID09IFhZRlRfTAorI2VuZGlmIC8qIFZNUyAqLworCSAgICAgKSAmJiBzZW5kbW9kZSA9PSBTTV9SRVNFTkQpIHsKKyAgICAgICAgICAgIC8qIFRyeWluZyB0byBSRVNFTkQvUkVHRVQgYSBmaWxlIGZpcnN0IHNlbnQgaW4gVEVYVCBtb2RlLiAqLworCSAgICBkZWJ1ZyhGMTExLCJzZmlsZSBlcnJvciAtIFJlY292ZXIgdnMgVGV4dCIsZmlsbmFtLGJpbmFyeSk7CisgICAgICAgICAgICAvKiBTZXQgYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZXMgYW5kIG1ha2UgbG9nIGVudHJpZXMgaGVyZSAqLworI2lmZGVmIFZNUworCSAgICBpZiAoYmluYXJ5ID09IFhZRlRfTCkKKwkgICAgICBja21ha21zZygoY2hhciAqKWVwa3Rtc2csCisJCSAgICAgICBQS1RNU0dMRU4sCisJCSAgICAgICAiUmVjb3ZlcnkgYXR0ZW1wdGVkIGluIExBQkVMRUQgbW9kZTogIiwKKwkJICAgICAgIGZpbG5hbSwKKwkJICAgICAgIE5VTEwsCisJCSAgICAgICBOVUxMCisJCSAgICAgICApOworCSAgICBlbHNlCisjZW5kaWYgLyogVk1TICovCisJICAgICAgY2ttYWttc2coKGNoYXIgKillcGt0bXNnLAorCQkgICAgICAgUEtUTVNHTEVOLAorCQkgICAgICAgIlJlY292ZXJ5IGF0dGVtcHRlZCBpbiBURVhUIG1vZGU6ICIsCisJCSAgICAgICBmaWxuYW0sCisJCSAgICAgICBOVUxMLAorCQkgICAgICAgTlVMTAorCQkgICAgICAgKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorCWlmIChzZW5kbW9kZSA9PSBTTV9QU0VORCkJLyogUFNFTkRpbmc/ICovCisJICBpZiAoc2VuZHN0YXJ0ID4gMEwpCQkvKiBTdGFydGluZyBwb3NpdGlvbiAqLworCSAgICBpZiAoemZzZWVrKHNlbmRzdGFydCkgPCAwKQkvKiBzZWVrIHRvIGl0Li4uICovCisJICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIENLX1JFU0VORCAqLworICAgIAlzID0gcGt0bmFtOwkJCS8qIE5hbWUgZm9yIHBhY2tldCBkYXRhIGZpZWxkICovCisjaWZkZWYgT1MyCisJLyogTmV2ZXIgc2VuZCBhIGRpc2sgbGV0dGVyLiAqLworCWlmIChpc2FscGhhKCpzKSAmJiAoKihzKzEpID09ICc6JykpCisJICBzICs9IDI7CisjZW5kaWYgLyogT1MyICovCisKKyAgICB9IGVsc2UgewkJCQkvKiBYLXBhY2tldCBzZXR1cCwgbm90IEYtcGFja2V0LiAqLworCWJpbmFyeSA9IFhZRlRfVDsJCS8qIFRleHQgYWx3YXlzICovCisgICAgCWRlYnVnKEYxMTAsInNmaWxlIFggcGFja2V0IixjbWRzdHIsMCk7IC8qIExvZyBkZWJ1Z2dpbmcgaW5mbyAqLworICAgIAlzID0gY21kc3RyOwkJCS8qIE5hbWUgZm9yIGRhdGEgZmllbGQgKi8KKyAgICB9CisKKyAgICAvKiBOb3cgcyBwb2ludHMgdG8gdGhlIHN0cmluZyB0aGF0IGdvZXMgaW4gdGhlIHBhY2tldCBkYXRhIGZpZWxkLiAqLworCisgICAgZGVidWcoRjEwMSwic2ZpbGUgYmluYXJ5IiwiIixiaW5hcnkpOyAvKiBMb2cgZGVidWdnaW5nIGluZm8gKi8KKyAgICBlbmNzdHIoKENIQVIgKilzKTsJCQkvKiBFbmNvZGUgdGhlIG5hbWUuICovCisJCQkJCS8qIFNlbmQgdGhlIEYgb3IgWCBwYWNrZXQgKi8KKyAgICAvKiBJZiB0aGUgZW5jb2RlZCBzdHJpbmcgZGlkIG5vdCBmaXQgaW50byB0aGUgcGFja2V0LCBpdCB3YXMgdHJ1bmNhdGVkLiAqLworCisgICAgaWYgKG54dHBrdCgpIDwgMCkgcmV0dXJuKDApOwkvKiBCdW1wIHBhY2tldCBudW1iZXIsIGdldCBidWZmZXIgKi8KKworICAgIHJjID0gc3BhY2soKGNoYXIpICh4ID8gJ1gnIDogJ0YnKSwgcGt0bnVtLCBzaXplLCBkYXRhKTsKKyAgICBpZiAocmMgPCAwKQorICAgICAgcmV0dXJuKHJjKTsKKworI2lmbmRlZiBOT0NTRVRTCisgICAgc2V0eGxhdHlwZSh0Y2hhcnNldCxmY2hhcnNldCk7CS8qIFNldCB1cCBjaGFyc2V0IHRyYW5zbGF0aW9ucyAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworICAgIGlmICh4ID09IDApIHsJCQkvKiBEaXNwbGF5IGZvciBGIHBhY2tldCAqLworICAgIAlpZiAoZGlzcGxhKSB7CQkJLyogU2NyZWVuICovCisJICAgIHh4c2NyZWVuKFNDUl9GTiwnRicsKGxvbmcpcGt0bnVtLGZpbG5hbSk7CisJICAgIHh4c2NyZWVuKFNDUl9BTiwwLDBMLHBrdG5hbSk7CisJICAgIHh4c2NyZWVuKFNDUl9GUywwLGNhbGlicmF0ZSA/IGNhbGlicmF0ZSA6IGZzaXplLCIiKTsKKyAgICAJfQorI2lmZGVmIHBkcDExCisgICAgCXRsb2coRjExMCwiU2VuZGluZyIsZmlsbmFtLDBMKTsgLyogVHJhbnNhY3Rpb24gbG9nIGVudHJ5ICovCisJbWFrZXN0cigmcHNmc3BlYyxmaWxuYW0pOwkvKiBOZXcgZmlsZW5hbWUgKi8KKyNlbHNlCisjaWZuZGVmIFpGTlFGUAorICAgIAl0bG9nKEYxMTAsIlNlbmRpbmciLGZpbG5hbSwwTCk7CisJbWFrZXN0cigmcHNmc3BlYyxmaWxuYW0pOwkvKiBOZXcgZmlsZW5hbWUgKi8KKyNlbHNlCisJaWYgKG5vdGFmaWxlKSB7CQkJLyogSWYgbm90IGEgZmlsZSBsb2cgc2ltcGxlIG5hbWUgKi8KKwkgICAgdGxvZyhGMTEwLCJTZW5kaW5nIiwgZmlsbmFtLCAwTCk7CisJfSBlbHNlIHsJCQkvKiBMb2cgZnVsbHkgcXVhbGlmaWVkIGZpbGVuYW1lICovCisjaWZkZWYgQ09NTUVOVAorCSAgICAvKiBUaGlzIHNlY3Rpb24gZ2VuZXJhdGVzIGJhZCBjb2RlIGluIFNDTyAzLjJ2NS4wLjUncyBjYyAqLworCSAgICBjaGFyICpwID0gTlVMTCwgKnEgPSBmaWxuYW07CisJICAgIGRlYnVnKEYxMDEsInNmaWxlIENLTUFYUEFUSCIsIiIsQ0tNQVhQQVRIKTsKKwkgICAgaWYgKChwID0gbWFsbG9jKENLTUFYUEFUSCsxKSkpIHsKKwkJZGVidWcoRjExMSwic2ZpbGUgY2FsbGluZyB6Zm5xZnAiLGZpbG5hbSxzdHJsZW4oZmlsbmFtKSk7CisJCWlmICh6Zm5xZnAoZmlsbmFtLCBDS01BWFBBVEgsIHApKSB7CisJCSAgICBkZWJ1ZyhGMTExLCJzZmlsZSB6Zm5xZnAgb2siLHAsc3RybGVuKHApKTsKKwkJICAgIHEgPSBwOworCQl9CisJICAgIH0KKyNlbHNlCisJICAgIGNoYXIgdG1wYnVmW0NLTUFYUEFUSCsxXTsKKwkgICAgY2hhciAqcCA9IHRtcGJ1ZiwgKnEgPSBmaWxuYW07CisJICAgIGlmICh6Zm5xZnAoZmlsbmFtLCBDS01BWFBBVEgsIHApKQorCSAgICAgIHEgPSBwOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgICAgZGVidWcoRjExMSwic2ZpbGUgcSIscSxzdHJsZW4ocSkpOworCSAgICB0bG9nKEYxMTAsIlNlbmRpbmciLHEsMEwpOworCSAgICBtYWtlc3RyKCZwc2ZzcGVjLHEpOwkvKiBOZXcgcHJlbGltaW5hcnkgZmlsZW5hbWUgKi8KKyNpZmRlZiBDT01NRU5UCisJICAgIGlmIChwKSBmcmVlKHApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwl9CisjZW5kaWYgLyogWkZOUUZQICovCisjZW5kaWYgLyogcGRwMTEgKi8KKyAgICAJdGxvZyhGMTEwLCIgYXMiLHBrdG5hbSwwTCk7CisJaWYgKGJpbmFyeSkgewkJCS8qIExvZyBmaWxlIG1vZGUgaW4gdHJhbnNhY3Rpb24gbG9nICovCisJICAgIHRsb2coRjEwMSwiIG1vZGU6IGJpbmFyeSIsIiIsKGxvbmcpIGJpbmFyeSk7CisJfSBlbHNlIHsJCQkvKiBJZiB0ZXh0IG1vZGUsIGNoZWNrIGNoYXJhY3RlciBzZXQgKi8KKwkgICAgdGxvZyhGMTAwLCIgbW9kZTogdGV4dCIsIiIsMEwpOworI2lmbmRlZiBOT0NTRVRTCisJICAgIGlmICh0Y2hhcnNldCA9PSBUQ19UUkFOU1AgfHwgeGZyeGxhID09IDApIHsKKwkJdGxvZyhGMTEwLCIgY2hhcmFjdGVyIHNldCIsInRyYW5zcGFyZW50IiwwTCk7CisJICAgIH0gZWxzZSB7CisJCXRsb2coRjExMCwiIHhmZXIgY2hhcmFjdGVyIHNldCIsdGNzaW5mb1t0Y2hhcnNldF0ubmFtZSwwTCk7CisJCXRsb2coRjExMCwiIGZpbGUgY2hhcmFjdGVyIHNldCIsZmNzaW5mb1tmY2hhcnNldF0ubmFtZSwwTCk7CisJICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisJfQorICAgIH0gZWxzZSB7CQkJCS8qIERpc3BsYXkgZm9yIFgtcGFja2V0ICovCisKKyAgICAJeHhzY3JlZW4oU0NSX1hELCdYJywobG9uZylwa3RudW0sY21kc3RyKTsgLyogU2NyZWVuICovCisgICAgCXRsb2coRjExMCwiU2VuZGluZyBmcm9tOiIsY21kc3RyLDBMKTsJLyogVHJhbnNhY3Rpb24gbG9nICovCisgICAgfQorICAgIGludG1zZygrK2ZpbGNudCk7CQkJLyogQ291bnQgZmlsZSwgZ2l2ZSBpbnRlcnJ1cHQgbXNnICovCisgICAgZmlyc3QgPSAxOwkJCQkvKiBJbml0IGZpbGUgY2hhcmFjdGVyIGxvb2thaGVhZC4gKi8KKyAgICBmZmMgPSAwTDsJCQkJLyogSW5pdCBmaWxlIGNoYXJhY3RlciBjb3VudGVyLiAqLworICAgIGNwcyA9IG9sZGNwcyA9IDBMOwkJCS8qIEluaXQgY3BzIHN0YXRpc3RpY3MgKi8KKyAgICByZWplY3Rpb24gPSAtMTsKKyAgICBmc2VjcyA9IGd0aW1lcigpOwkJCS8qIFRpbWUgdGhpcyBmaWxlIHN0YXJ0ZWQgKi8KKyNpZmRlZiBHRlRJTUVSCisgICAgZnBmc2VjcyA9IGdmdGltZXIoKTsKKyAgICBkZWJ1ZyhGMTAxLCJTRklMRSBmcGZzZWNzIiwiIixmcGZzZWNzKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgZGVidWcoRjEwMSwiU0ZJTEUgZnNlY3MiLCIiLGZzZWNzKTsKKyAgICByZXR1cm4oMSk7Cit9CisKKy8qICBTIEQgQSBUIEEgLS0gU2VuZCBhIGRhdGEgcGFja2V0ICovCisKKy8qCisgIFJldHVybnMgLTEgaWYgbm8gZGF0YSB0byBzZW5kIChlbmQgb2YgZmlsZSksIC0yIGlmIGNvbm5lY3Rpb24gaXMgYnJva2VuLgorICBJZiB0aGVyZSBpcyBkYXRhLCBhIGRhdGEgcGFja2V0IGlzIHNlbnQsIGFuZCBzZGF0YSgpIHJldHVybnMgMS4KKworICBJbiB0aGUgc3RyZWFtaW5nIGNhc2UsIHRoZSB3aW5kb3cgaXMgcmVnYXJkZWQgYXMgaW5maW5pdGUgYW5kIHdlIGtlZXAKKyAgc2VuZGluZyBkYXRhIHBhY2tldHMgdW50aWwgRU9GIG9yIHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBLZXJtaXQgcGFja2V0IG9uIHRoZQorICByZXZlcnNlIGNoYW5uZWwuICBXaGVuIG5vdCBzdHJlYW1pbmcgYW5kIHRoZSB3aW5kb3cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gMSwKKyAgd2Uga2VlcCBzZW5kaW5nIGRhdGEgcGFja2V0cyB1bnRpbCB3aW5kb3cgaXMgZnVsbCBvciBjaGFyYWN0ZXJzIHN0YXJ0IHRvCisgIGFwcGVhciBmcm9tIHRoZSBvdGhlciBLZXJtaXQuCisKKyAgSW4gdGhlIHdpbmRvd2luZyBvciBzdHJlYW1pbmcgY2FzZSwgd2hlbiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgbGVmdCB0byBzZW5kCisgIChvciB3aGVuIHNlbmRpbmcgaGFzIGJlZW4gaW50ZXJydXB0ZWQpLCBzZGF0YSgpIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyAwCisgIGVhY2ggdGltZSBpdCBpcyBjYWxsZWQgdW50aWwgdGhlIGFja25vd2xlZGdlbWVudCBzZXF1ZW5jZSBudW1iZXIgY2F0Y2hlcyB1cAorICB0byB0aGUgbGFzdCBkYXRhIHBhY2tldCB0aGF0IHdhcyBzZW50LgorKi8KK2ludAorc2RhdGEoKSB7CisgICAgaW50IGksIHgsIGxlbjsKKyAgICBjaGFyICogczsKKworICAgIGRlYnVnKEYxMDEsInNkYXRhIGVudHJ5LCBmaXJzdCIsIiIsZmlyc3QpOworICAgIGRlYnVnKEYxMDEsInNkYXRhIGRyYWluIiwiIixkcmFpbik7CisvKgorICBUaGUgImRyYWluIiBmbGFnIGlzIHVzZWQgd2l0aCB3aW5kb3cgc2l6ZSA+IDEuICBJdCBtZWFucyB3ZSBoYXZlIHNlbnQKKyAgb3VyIGxhc3QgZGF0YSBwYWNrZXQuICBJZiBjYWxsZWQgYW5kIGRyYWluIGlzIG5vdCB6ZXJvLCB0aGVuIHdlIHJldHVybgorICAwIGFzIGlmIHdlIGhhZCBzZW50IGFuIGVtcHR5IGRhdGEgcGFja2V0LCB1bnRpbCBhbGwgZGF0YSBwYWNrZXRzIGhhdmUKKyAgYmVlbiBBQ0snZCwgdGhlbiB0aGVuIHdlIGNhbiBmaW5hbGx5IHJldHVybiAtMSBpbmRpY2F0aW5nIEVPRiwgc28gdGhhdAorICB0aGUgcHJvdG9jb2wgY2FuIHN3aXRjaCB0byBzZW9mIHN0YXRlLiAgVGhpcyBpcyBhIGtsdWRnZSwgYnV0IGF0IGxlYXN0CisgIGl0J3MgbG9jYWxpemVkLi4uCisqLworICAgIGlmIChmaXJzdCA9PSAxKSBkcmFpbiA9IDA7CQkvKiBTdGFydCBvZiBmaWxlLCBpbml0IGRyYWluIGZsYWcuICovCisKKyAgICBpZiAoZHJhaW4pIHsJCQkvKiBJZiBkcmFpbmluZy4uLiAqLworCWRlYnVnKEYxMDEsInNkYXRhIGRyYWluaW5nLCB3aW5sbyIsIiIsd2lubG8pOworCWlmICh3aW5sbyA9PSBwa3RudW0pCQkvKiBJZiBhbGwgZGF0YSBwYWNrZXRzIGFyZSBBQ0snZCAqLworCSAgcmV0dXJuKC0xKTsJCQkvKiByZXR1cm4gRU9GIGluZGljYXRpb24gKi8KKwllbHNlCQkJCS8qIG90aGVyd2lzZSAqLworCSAgcmV0dXJuKDApOwkJCS8qIHByZXRlbmQgd2Ugc2VudCBhIGRhdGEgcGFja2V0LiAqLworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJzZGF0YSBzYnVmbnVtIiwiIixzYnVmbnVtKTsKKyAgICBmb3IgKGkgPSBzYnVmbnVtOworCSBpID4gMAorI2lmZGVmIFNUUkVBTUlORworCSB8fCBzdHJlYW1pbmcKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKwkgOworCSBpLS0pIHsKKwlpZiAoaSA8IDApCisJICBicmVhazsKKyAgICAgICAgZGVidWcoRjEwMSwic2RhdGEgY291bnRkb3duIiwiIixpKTsKKyNpZmRlZiBTVFJFQU1JTkcKKwlpZiAoc3RyZWFtaW5nKSB7CisJICAgIHBrdG51bSA9IChwa3RudW0gKyAxKSAlIDY0OworCSAgICB3aW5sbyA9IHBrdG51bTsKKwkgICAgZGVidWcoRjEwMSwic2RhdGEgc3RyZWFtaW5nIHBrdG51bSIsIiIscGt0bnVtKTsKKwl9IGVsc2UgeworI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCSAgICB4ID0gbnh0cGt0KCk7CQkvKiBHZXQgbmV4dCBwa3QgbnVtYmVyIGFuZCBidWZmZXIgKi8KKwkgICAgZGVidWcoRjEwMSwic2RhdGEgbnh0cGt0IHBrdG51bSIsIiIscGt0bnVtKTsKKwkgICAgaWYgKHggPCAwKSByZXR1cm4oMCk7CisjaWZkZWYgU1RSRUFNSU5HCisJfQorI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCWRlYnVnKEYxMDEsInNkYXRhIHBhY2tldCIsIiIscGt0bnVtKTsKKwlpZiAoY2hraW50KCkgPCAwKQkJLyogRXNwZWNpYWxseSBpbXBvcnRhbnQgaWYgc3RyZWFtaW5nICovCisJICByZXR1cm4oLTkpOworCWlmIChjeHNlZW4gfHwgY3pzZWVuKSB7CQkvKiBJZiBpbnRlcnJ1cHRlZCwgZG9uZS4gKi8KKwkgICAgaWYgKHdzbG90cyA+IDEpIHsKKwkJZHJhaW4gPSAxOworCQlkZWJ1ZyhGMTAwLCJzZGF0YSBjeC96c2VlbiB3aW5kb3dpbmciLCIiLDApOworCQlyZXR1cm4oMCk7CisJICAgIH0gZWxzZSB7CisJCWRlYnVnKEYxMDAsInNkYXRhIGN4L3pzZWVuIG5vbndpbmRvd2luZyIsIiIsMCk7CisJCXJldHVybigtMSk7CisJICAgIH0KKwl9CisjaWZkZWYgREVCVUcKKwlpZiAoZGVibG9nKSB7CisJICAgIGRlYnVnKEYxMDEsInNkYXRhIHNwc2l6IiwiIixzcHNpeik7CisJICAgIGRlYnVnKEYxMDEsInNkYXRhIGJpbmFyeSIsIiIsYmluYXJ5KTsKKwkgICAgZGVidWcoRjEwMSwic2RhdGEgcGFyaXR5IiwiIixwYXJpdHkpOworCX0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIENLVFVOSU5HCisJaWYgKGJpbmFyeSAmJiAhcGFyaXR5ICYmICFtZW1zdHIgJiYgIWZ1bmNzdHIpCisJICBsZW4gPSBiZ2V0cGt0KHNwc2l6KTsKKwllbHNlCisJICBsZW4gPSBnZXRwa3Qoc3BzaXosMSk7CisjZWxzZQorCWxlbiA9IGdldHBrdChzcHNpeiwxKTsKKyNlbmRpZiAvKiBDS1RVTklORyAqLworCXMgPSAoY2hhciAqKWRhdGE7CisJaWYgKGxlbiA9PSAtMykgewkJLyogVGltZWQgb3V0IChlLmcucmVhZGluZyBmcm9tIHBpcGUpICovCisJICAgIHMgPSAiIjsJCQkvKiBTZW5kIGFuIGVtcHR5IGRhdGEgcGFja2V0LiAqLworCSAgICBsZW4gPSAwOworCX0gZWxzZSBpZiAobGVuID09IDApIHsJCS8qIERvbmUgaWYgbm8gZGF0YS4gKi8KKwkgICAgaWYgKHBrdG51bSA9PSB3aW5sbykKKwkgICAgICByZXR1cm4oLTEpOworCSAgICBkcmFpbiA9IDE7CQkJLyogQnV0IGNhbid0IHJldHVybiAtMSB1bnRpbCBhbGwgKi8KKwkgICAgZGVidWcoRjEwMSwic2RhdGEgZW9mLCBkcmFpbiIsIiIsZHJhaW4pOworCSAgICByZXR1cm4oMCk7CQkJLyogQUNLcyBhcmUgZHJhaW5lZC4gKi8KKwl9CisJZGVidWcoRjEwMSwic2RhdGEgcGt0bnVtIiwiIixwa3RudW0pOworCWRlYnVnKEYxMDEsInNkYXRhIGxlbiIsIiIsbGVuKTsKKwlkZWJ1ZyhGMDExLCJzZGF0YSBkYXRhIixkYXRhLDUyKTsKKworCXggPSBzcGFjaygnRCcscGt0bnVtLGxlbiwoQ0hBUiAqKXMpOyAvKiBTZW5kIHRoZSBkYXRhIHBhY2tldC4gKi8KKwlkZWJ1ZyhGMTAxLCJzZGF0YSBzcGFjayIsIiIseCk7CisJaWYgKHggPCAwKSB7CQkJLyogRXJyb3IgKi8KKwkgICAgdHRjaGsoKTsJCQkvKiBTZWUgaWYgY29ubmVjdGlvbiBpcyBzdGlsbCB0aGVyZSAqLworCSAgICByZXR1cm4oLTIpOworCX0KKyNpZmRlZiBTVFJFQU1JTkcKKwlpZiAoc3RyZWFtaW5nKQkJCS8qIFdoYXQgYW4gQUNLIHdvdWxkIGRvLiAqLworCSAgd2lubG8gPSBwa3RudW07CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJeCA9IHR0Y2hrKCk7CQkJLyogUGVlayBhdCBpbnB1dCBidWZmZXIuICovCisJZGVidWcoRjEwMSwic2RhdGEgdHRjaGsiLCIiLHgpOwkvKiBBQ0tzIHdhaXRpbmcsIG1heWJlPyAgKi8KKwlpZiAoeCA8IDApCQkJLyogT3IgY29ubmVjdGlvbiBicm9rZW4/ICovCisJICByZXR1cm4oLTIpOworLyoKKyAgSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgYW55IEFDS3Mgb3IgTkFLcyBoYXZlIGFycml2ZWQsIGluIHdoaWNoIGNhc2Ugd2UKKyAgYnJlYWsgb3V0IG9mIHRoZSBELXBhY2tldC1zZW5kaW5nIGxvb3AgYW5kIHJldHVybiB0byB0aGUgc3RhdGUgc3dpdGNoZXIKKyAgdG8gcHJvY2VzcyB0aGVtLiAgVGhpcyBpcyB3aGF0IG1ha2VzIG91ciB3aW5kb3dzIHNsaWRlIGluc3RlYWQgb2YgbHVyY2guCisqLworCWlmICgKKyNpZmRlZiBHRU1ET1MKKy8qCisgIEluIHRoZSBBdGFyaSBTVCB2ZXJzaW9uLCB0dGNoaygpIGNhbiBvbmx5IHJldHVybiAwIG9yIDEuICBCdXQgbm90ZTogeCB3aWxsCisgIHByb2JhYmx5IGFsd2F5cyBiZSA+IDAsIHNpbmNlIHRoZSBhcy15ZXQtdW5yZWFkIHBhY2tldCB0ZXJtaW5hdG9yIGZyb20gdGhlCisgIGxhc3QgcGFja2V0IGlzIHByb2JhYmx5IHN0aWxsIGluIHRoZSBidWZmZXIsIHNvIHNsaWRpbmcgd2luZG93cyB3aWxsCisgIHByb2JhYmx5IG5ldmVyIGhhcHBlbiB3aGVuIHRoZSBBdGFyaSBTVCBpcyB0aGUgZmlsZSBzZW5kZXIuICBUaGUgYWx0ZXJuYXRpdmUKKyAgaXMgdG8gc2F5ICJpZiAoMCkiLCBpbiB3aGljaCBjYXNlIHRoZSBTVCB3aWxsIGFsd2F5cyBzZW5kIGEgd2luZG93IGZ1bGwgb2YKKyAgcGFja2V0cyBiZWZvcmUgcmVhZGluZyBhbnkgQUNLcyBvciBOQUtzLgorKi8KKwkgICAgeCA+IDAKKworI2Vsc2UgLyogIUdFTURPUyAqLworLyoKKyAgSW4gbW9zdCBvdGhlciB2ZXJzaW9ucywgdHRjaGsoKSByZXR1cm5zIHRoZSBhY3R1YWwgY291bnQuCisgIEl0IGNhbid0IGJlIGEgS2VybWl0IHBhY2tldCBpZiBpdCdzIGxlc3MgdGhhbiBmaXZlIGJ5dGVzIGxvbmcuCisqLworCSAgICB4ID4gNCArIGJjdHUKKworI2VuZGlmIC8qIEdFTURPUyAqLworCSAgICApCisJICByZXR1cm4oMSk7CQkJLyogWWVzLCBzdG9wIHNlbmRpbmcgZGF0YSBwYWNrZXRzICovCisgICAgfQkJCQkJLyogYW5kIGdvIHRyeSB0byByZWFkIHRoZSBBQ0tzLiAqLworICAgIHJldHVybigxKTsKK30KKworCisvKiAgUyBFIE8gRiAtLSBTZW5kIGFuIEVuZC1PZi1GaWxlIHBhY2tldCAqLworCisvKiAgQ2FsbCB3aXRoIGEgc3RyaW5nIHBvaW50ZXIgdG8gY2hhcmFjdGVyIHRvIHB1dCBpbiB0aGUgZGF0YSBmaWVsZCwgKi8KKy8qICBvciBlbHNlIGEgbnVsbCBwb2ludGVyIG9yICIiIGZvciBubyBkYXRhLiAgKi8KKworLyoKKyAgVGhlcmUgYXJlIHR3byAic2VuZC1lb2YiIGZ1bmN0aW9ucy4gIHNlb2YoKSBpcyB1c2VkIHRvIHNlbmQgdGhlIG5vcm1hbCBlb2YKKyAgcGFja2V0IGF0IHRoZSBlbmQgb2YgYSBmaWxlJ3MgZGF0YSAoZXZlbiBpZiB0aGUgZmlsZSBoYXMgbm8gZGF0YSksIG9yIHdoZW4KKyAgYSBmaWxlIHRyYW5zZmVyIGlzIGludGVycnVwdGVkLiAgc3hlb2YoKSBpcyB1c2VkIHRvIHNlbmQgYW4gRU9GIHBhY2tldCB0aGF0CisgIG9jY3VycyBiZWNhdXNlIG9mIGF0dHJpYnV0ZSByZWZ1c2FsIG9yIGludGVycnVwdGlvbiBwcmlvciB0byBlbnRlcmluZyBkYXRhCisgIHN0YXRlLiAgVGhlIGRpZmZlcmVuY2UgaXMgcHVyZWx5IGEgbWF0dGVyIG9mIGJ1ZmZlciBhbGxvY2F0aW9uIGFuZCBwYWNrZXQKKyAgc2VxdWVuY2UgbnVtYmVyIG1hbmFnZW1lbnQuICBCb3RoIGZ1bmN0aW9ucyBhY3QgYXMgImZyb250IGVuZHMiIHRvIHRoZQorICBjb21tb24gc2VuZC1lb2YgZnVuY3Rpb24sIHN6ZW9mKCkuCisqLworCisvKiBDb2RlIGNvbW1vbiB0byBib3RoIHNlb2YoKSBhbmQgc3hlb2YoKSAqLworCitpbnQKK3N6ZW9mKHMpIENIQVIgKnM7IHsKKyAgICBpbnQgeDsKKyAgICBsc3N0YXRlID0gMDsJCQkvKiBDYW5jZWwgbG9ja2luZy1zaGlmdCBzdGF0ZSAqLworICAgIGlmICghcykgcyA9IChDSEFSICopIiI7CisgICAgZGVidWcoRjExMSwic3plb2YiLHMscGt0bnVtKTsKKyAgICBpZiAoKnMpIHsKKwl4ID0gc3BhY2soJ1onLHBrdG51bSwxLHMpOworCXhpdHN0YSB8PSBXX1NFTkQ7CisjaWZkZWYgQ09NTUVOVAorCXRsb2coRjEwMCwiICoqKiBpbnRlcnJ1cHRlZCwgc2VuZGluZyBkaXNjYXJkIHJlcXVlc3QiLCIiLDBMKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJZmlscmVqKys7CisgICAgfSBlbHNlIHsKKwl4ID0gc3BhY2soJ1onLHBrdG51bSwwLChDSEFSICopIiIpOworICAgIH0KKyAgICBpZiAoeCA8IDApCisgICAgICByZXR1cm4oeCk7CisKKyNpZmRlZiBDT01NRU5UCisgICAgLyogTm8sIHRvbyBzb29uICovCisgICAgZGlzY2FyZCA9IDA7CQkJLyogVHVybiBvZmYgcGVyLWZpbGUgZGlzY2FyZCBmbGFnICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisvKiBJZiB3ZSB3ZXJlIHNlbmRpbmcgZnJvbSBhIHBpcGUsIHdlJ3JlIG5vdCBhbnkgbW9yZS4uLiAqLworICAgIHBpcGVzZW5kID0gMDsKKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorc2VvZih4KSBpbnQgeDsgeworICAgIGNoYXIgKiBzOworLyoKKyAgY2tjcHJvLncsIGJlZm9yZSBjYWxsaW5nIHNlb2YoKSwgc2V0cyB3aW5kb3cgc2l6ZSBiYWNrIHRvIDEgYW5kIHRoZW4gY2FsbHMKKyAgd2luZG93KCksIHdoaWNoIGNsZWFycyBvdXQgdGhlIG9sZCBidWZmZXJzLiAgVGhpcyBpcyBPSyBiZWNhdXNlIHRoZSBmaW5hbAorICBkYXRhIHBhY2tldCBmb3IgdGhlIGZpbGUgaGFzIGJlZW4gQUNLJ2QuICBIb3dldmVyLCBzZGF0YSgpIGhhcyBhbHJlYWR5CisgIGNhbGxlZCBueHRwa3QoKSwgd2hpY2ggc2V0IHRoZSBuZXcgdmFsdWUgb2YgcGt0bnVtIHdoaWNoIHNlb2YoKSB3aWxsIHVzZS4KKyAgU28gYWxsIHdlIG5lZWQgdG8gZG8gaGVyZSBpcyBpcyBhbGxvY2F0ZSBhIG5ldyBzZW5kLWJ1ZmZlci4KKyovCisgICAgcyA9IHggPyAiRCIgOiAiIjsKKyAgICBkZWJ1ZyhGMTExLCJzZW9mIixzLHBrdG51bSk7CisgICAgaWYgKGdldHNidWYocGt0bnVtKSA8IDApIHsJLyogR2V0IGEgYnVmZmVyIGZvciBwYWNrZXQgbiAqLworCWRlYnVnKEYxMDEsInNlb2YgY2FuJ3QgZ2V0IHMtYnVmZmVyIiwiIixwa3RudW0pOworCXJldHVybigtMSk7CisgICAgfQorICAgIHJldHVybihzemVvZigoQ0hBUiAqKXMpKTsKK30KKworLyoKKyAgVmVyc2lvbiBvZiBzZW9mKCkgdG8gYmUgY2FsbGVkIHdoZW4gc2RhdGEoKSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZS4gIFRoZQorICBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyB2ZXJzaW9uIGNhbGxzIG54dHBrdCgpIHRvIGFsbG9jYXRlIGEgc2VuZC1idWZmZXIgYW5kCisgIGdldCB0aGUgbmV4dCBwYWNrZXQgbnVtYmVyLgorKi8KK2ludAorc3hlb2YoeCkgaW50IHg7IHsKKyAgICBjaGFyICogczsKKyAgICBzID0geCA/ICJEIiA6ICIiOworICAgIGlmIChueHRwa3QoKSA8IDApCQkJLyogR2V0IG5leHQgcGt0IG51bWJlciBhbmQgYnVmZmVyICovCisgICAgICBkZWJ1ZyhGMTAxLCJzeGVvZiBueHRwa3QgZmFpbHMiLCIiLHBrdG51bSk7CisgICAgZWxzZQorICAgICAgZGVidWcoRjEwMSwic3hlb2YgcGFja2V0IiwiIixwa3RudW0pOworICAgIHJldHVybihzemVvZigoQ0hBUiAqKXMpKTsKK30KKworLyogIFMgRSBPIFQgLS0gU2VuZCBhbiBFbmQtT2YtVHJhbnNhY3Rpb24gcGFja2V0ICovCisKK2ludAorc2VvdCgpIHsKKyAgICBpbnQgeDsKKyAgICB4ID0gbnh0cGt0KCk7CisgICAgZGVidWcoRjEwMSwic2VvdCBueHRwa3QiLCIiLHgpOworICAgIGlmICh4IDwgMCkgcmV0dXJuKC0xKTsJCS8qIEJ1bXAgcGFja2V0IG51bWJlciwgZ2V0IGJ1ZmZlciAqLworICAgIHggPSBzcGFjaygnQicscGt0bnVtLDAsKENIQVIgKikiIik7CS8qIFNlbmQgdGhlIEVPVCBwYWNrZXQgKi8KKyAgICBpZiAoeCA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgY3hzZWVuID0gY3pzZWVuID0gZGlzY2FyZCA9IDA7CS8qIFJlc2V0IGludGVycnVwdGlvbiBmbGFncyAqLworICAgIHRzdGF0cygpOwkJCQkvKiBMb2cgdGltaW5nIGluZm8gKi8KKyAgICByZXR1cm4oMCk7Cit9CisKKworLyogICBSIFAgQSBSIC0tIEZpbGwgdGhlIGRhdGEgYXJyYXkgd2l0aCBteSBzZW5kLWluaXQgcGFyYW1ldGVycyAgKi8KKworaW50IHE4ZmxhZyA9IDA7CisKK0NIQVIgZGFkYVszMl07CQkJCS8qIFVzZSB0aGlzIGluc3RlYWQgb2YgZGF0YVtdLiAqLworCQkJCQkvKiBUbyBhdm9pZCBzb21lIGtpbmQgb2Ygd2llcmQgKi8KKwkJCQkJLyogYWRkcmVzc2luZyBmb3VsdXAgaW4gc3BhY2soKS4uLiAqLworCQkJCQkvKiAod2hpY2ggbWlnaHQgYmUgZml4ZWQgbm93Li4uKSAqLworCitDSEFSICoKK3JwYXIoKSB7CisgICAgY2hhciAqcDsKKyAgICBpbnQgaSwgeCwgbWF4OworICAgIGV4dGVybiBpbnQgc3BybWxlbjsKKworICAgIG1heCA9IG1heGRhdGEoKTsJCQkvKiBCaWdnZXN0IGRhdGEgZmllbGQgSSBjYW4gc2VuZCAqLworICAgIGRlYnVnKEYxMDEsICJycGFyIG1heCAxIiwiIixtYXgpOworICAgIGRlYnVnKEYxMDEsICJycGFyIHNwcm1sZW4iLCIiLHNwcm1sZW4pOworICAgIGlmIChzcHJtbGVuID4gMSAmJiBzcHJtbGVuIDwgbWF4KQkvKiBVc2VyIG92ZXJyaWRlICovCisgICAgICBtYXggPSBzcHJtbGVuOworICAgIGRlYnVnKEYxMDEsICJycGFyIG1heCAyIiwiIixtYXgpOworCisgICAgaWYgKHJwc2l6ID4gTUFYUEFDSykJCS8qIEJpZ2dlc3Qgbm9ybWFsIHBhY2tldCBJIHdhbnQuICovCisgICAgICBkYWRhWzBdID0gKGNoYXIpIHRvY2hhcihNQVhQQUNLKTsJLyogSWYgPiA5NCwgdXNlIDk0LCBidXQgc3BlY2lmeSAqLworICAgIGVsc2UJCQkJLyogZXh0ZW5kZWQgcGFja2V0IGxlbmd0aCBiZWxvdy4uLiAqLworICAgICAgZGFkYVswXSA9IChjaGFyKSB0b2NoYXIocnBzaXopOwkvKiBlbHNlIHVzZSB3aGF0IHRoZSB1c2VyIHNhaWQuICovCisgICAgZGFkYVsxXSA9IChjaGFyKSB0b2NoYXIoY2hrdGltbyhwa3R0aW0sMCkpOyAvKiBXaGVuIHRvIHRpbWUgbWUgb3V0ICovCisgICAgZGFkYVsyXSA9IChjaGFyKSB0b2NoYXIobXlwYWRuKTsJLyogSG93IG11Y2ggcGFkZGluZyBJIG5lZWQgKG5vbmUpICovCisgICAgZGFkYVszXSA9IChjaGFyKSBjdGwobXlwYWRjKTsJLyogUGFkZGluZyBjaGFyYWN0ZXIgSSB3YW50ICovCisgICAgZGFkYVs0XSA9IChjaGFyKSB0b2NoYXIoZW9sKTsJLyogRW5kLU9mLUxpbmUgY2hhcmFjdGVyIEkgd2FudCAqLworICAgIGRhZGFbNV0gPSBteWN0bHE7CQkJLyogQ29udHJvbC1RdW90ZSBjaGFyYWN0ZXIgSSBzZW5kICovCisKKyAgICBpZiAobWF4IDwgNikgeyBkYWRhWzZdID0gTlVMOyBycWYgPSAwOyBlYnEgPSBzcSA9IE5VTDsgcmV0dXJuKGRhZGEpOyB9CisKKyAgICBzd2l0Y2ggKHJxZikgewkJCS8qIDh0aC1iaXQgcHJlZml4IChzaW5nbGUtc2hpZnQpICovCisgICAgICBjYXNlIC0xOgkJCQkvKiBJJ20gb3BlbmluZyB0aGUgYmlkcyAqLworICAgICAgY2FzZSAgMToJCQkJLyogT3RoZXIgS2VybWl0IGFscmVhZHkgYmlkICdZJyAqLworCWlmIChwYXJpdHkpIGVicSA9IHNxID0gTVlFQlE7CS8qIFNvIEkgcmVwbHkgd2l0aCAnJicgaWYgcGFyaXR5ICovCisJYnJlYWs7CQkJCS8qICBvdGhlcndpc2Ugd2l0aCAnWScuICovCisgICAgICBjYXNlICAyOgkJCQkvKiBPdGhlciBLZXJtaXQgc2VudCBhIHZhbGlkIHByZWZpeCAqLworCWlmIChxOGZsYWcpCisJICBzcSA9IGVicTsJCQkvKiBGYWxsIHRocm91Z2ggb24gcHVycG9zZSAqLworICAgICAgY2FzZSAgMDoJCQkJLyogT3RoZXIgS2VybWl0IGJpZCBub3RoaW5nICovCisJYnJlYWs7CQkJCS8qIFNvIEkgcmVwbHkgd2l0aCAnWScuICovCisgICAgfQorICAgIGRlYnVnKEYwMDAsInJwYXIgOGJxIHNxIiwiIixzcSk7CisgICAgZGVidWcoRjAwMCwicnBhciA4YnEgZWJxIiwiIixlYnEpOworICAgIGlmIChsc2NhcHUgPT0gMikJCQkvKiBMT0NLSU5HLVNISUZUIEZPUkNFRCAqLworICAgICAgZGFkYVs2XSA9ICdOJzsJCQkvKiByZXF1aXJlcyBubyBzaW5nbGUtc2hpZnQgKi8KKyAgICBlbHNlCQkJCS8qIG90aGVyd2lzZSBzZW5kIHByZWZpeCBvciAnWScgKi8KKyAgICAgIGRhZGFbNl0gPSAoY2hhcikgc3E7CisgICAgZWJxc2VudCA9IGRhZGFbNl07CQkJLyogQW5kIHJlbWVtYmVyIHdoYXQgSSByZWFsbHkgc2VudCAqLworCisgICAgaWYgKG1heCA8IDcpIHsgZGFkYVs3XSA9IE5VTDsgYmN0ciA9IDE7IHJldHVybihkYWRhKTsgfQorCisgICAgZGFkYVs3XSA9IChjaGFyKSAoYmN0ciA9PSA0KSA/ICdCJyA6IGJjdHIgKyAnMCc7IC8qIEJsb2NrIGNoZWNrIHR5cGUgKi8KKworICAgIGlmIChtYXggPCA4KSB7IGRhZGFbOF0gPSBOVUw7IHJwdGZsZyA9IDA7IHJldHVybihkYWRhKTsgfQorCisgICAgaWYgKHJwdGVuYSkgeworCWlmIChycHRmbGcpCQkJLyogUnVuIGxlbmd0aCBlbmNvZGluZyAqLworCSAgZGFkYVs4XSA9IChjaGFyKSBycHRxOwkvKiBJZiByZWNlaXZpbmcsIGFncmVlICovCisJZWxzZQkJCQkvKiBieSByZXBseWluZyB3aXRoIHNhbWUgY2hhcmFjdGVyLiAqLworCSAgZGFkYVs4XSA9IChjaGFyKSAocnB0cSA9IG15cnB0cSk7IC8qIFdoZW4gc2VuZGluZyB1c2UgdGhpcy4gKi8KKyAgICB9IGVsc2UgZGFkYVs4XSA9IFNQOwkJLyogTm90IGVuYWJsZWQsIHB1dCBhIHNwYWNlIGhlcmUuICovCisKKyAgICAvKiBDQVBBUyBtYXNrICovCisKKyAgICBpZiAobWF4IDwgOSkgeworCWRhZGFbOV0gPSBOVUw7CisJYXRjYXByID0gMDsKKwlscGNhcHIgPSAwOworCXN3Y2FwciA9IDA7CisJcnNjYXByID0gMDsKKwlyZXR1cm4oZGFkYSk7CisgICAgfQorICAgIGRhZGFbOV0gPSAoY2hhcikgdG9jaGFyKChsc2NhcHIgPyBsc2NhcGIgOiAwKSB8IC8qIExvY2tpbmcgc2hpZnRzICovCisJCSAgICAgKGF0Y2FwciA/IGF0Y2FwYiA6IDApIHwgLyogQXR0cmlidXRlIHBhY2tldHMgKi8KKwkJICAgICAobHBjYXByID8gbHBjYXBiIDogMCkgfCAvKiBMb25nIHBhY2tldHMgKi8KKwkJICAgICAoc3djYXByID8gc3djYXBiIDogMCkgfCAvKiBTbGlkaW5nIHdpbmRvd3MgKi8KKwkJICAgICAocnNjYXByID8gcnNjYXBiIDogMCkpOyAvKiBSRVNFTkQgKi8KKyAgICBpZiAobWF4IDwgMTApIHsgd3Nsb3RyID0gMTsgcmV0dXJuKGRhZGEpOyB9CisgICAgZGFkYVsxMF0gPSAoY2hhcikgdG9jaGFyKHN3Y2FwciA/IHdzbG90ciA6IDEpOyAvKiBDQVBBUysxID0gV2luZG93IHNpemUgKi8KKworICAgIGlmIChtYXggPCAxMikgeyBycHNpeiA9IDgwOyByZXR1cm4oZGFkYSk7IH0KKyAgICBpZiAodXJwc2l6ID4gOTQpCisgICAgICBycHNpeiA9IHVycHNpeiAtIDE7CQkvKiBMb25nIHBhY2tldHMgLi4uICovCisgICAgZGFkYVsxMV0gPSAoY2hhcikgdG9jaGFyKHJwc2l6IC8gOTUpOyAvKiBMb25nIHBhY2tldCBzaXplLCBiaWcgcGFydCAqLworICAgIGRhZGFbMTJdID0gKGNoYXIpIHRvY2hhcihycHNpeiAlIDk1KTsgLyogTG9uZyBwYWNrZXQgc2l6ZSwgbGl0dGxlIHBhcnQgKi8KKworICAgIGlmIChtYXggPCAxNikgcmV0dXJuKGRhZGEpOworICAgIGRhZGFbMTNdID0gJzAnOwkJCS8qIENBUEFTKzQgPSBXT05UIENIS1BOVCAqLworICAgIGRhZGFbMTRdID0gJ18nOwkJCS8qIENBUEFTKzUgPSBDSEtJTlQgKHJlc2VydmVkKSAqLworICAgIGRhZGFbMTVdID0gJ18nOwkJCS8qIENBUEFTKzYgPSBDSEtJTlQgKHJlc2VydmVkKSAqLworICAgIGRhZGFbMTZdID0gJ18nOwkJCS8qIENBUEFTKzcgPSBDSEtJTlQgKHJlc2VydmVkKSAqLworICAgIGlmIChtYXggPCAxNykgcmV0dXJuKGRhZGEpOworI2lmbmRlZiBXSEFUQU1JCisgICAgZGFkYVsxN10gPSAnICc7CisjZWxzZQorICAgIHggPSAwOworICAgIGlmIChzZXJ2ZXIpIHggfD0gV01JX1NFUlZFOwkJLyogV2hldGhlciBJIGFtIGEgc2VydmVyICovCisgICAgaWYgKGJpbmFyeSkgeCB8PSBXTUlfRk1PREU7CQkvKiBNeSBmaWxlIHRyYW5zZmVyIG1vZGUgaXMgLi4uICovCisgICAgaWYgKGZuY252KSAgeCB8PSBXTUlfRk5BTUU7CQkvKiBNeSBmaWxlbmFtZSBjb252ZXJzaW9uIGlzIC4uLiAqLworI2lmZGVmIFNUUkVBTUlORworICAgIGlmIChzdHJlYW1ycSA9PSBTRVRfT04pCisgICAgICB4IHw9IFdNSV9TVFJFQU07CisgICAgZWxzZSBpZiAoc3RyZWFtcnEgPT0gU0VUX0FVVE8gJiYgcmVsaWFibGUgPT0gU0VUX09OKQorICAgICAgeCB8PSBXTUlfU1RSRUFNOworICAgIC8qCisgICAgICBBbHdheXMgb2ZmZXIgdG8gc3RyZWFtIHdoZW4gaW4gcmVtb3RlIG1vZGUgYW5kIFNUUkVBTUlORyBpcyBBVVRPCisgICAgICBhbmQgUkVMSUFCTEUgaXMgbm90IE9GRiAoaS5lLiBpcyBPTiBvciBBVVRPKS4KKyAgICAqLworICAgIGVsc2UgaWYgKCFsb2NhbCAmJiBzdHJlYW1ycSA9PSBTRVRfQVVUTyAmJiByZWxpYWJsZSAhPSBTRVRfT0ZGKQorICAgICAgeCB8PSBXTUlfU1RSRUFNOworI2VuZGlmIC8qIFNUUkVBTUlORyAqLworI2lmZGVmIFRDUFNPQ0tFVAorICAgIGlmIChjbGVhcnJxID09IFNFVF9PTikKKyAgICAgIHggfD0gV01JX0NMRUFSOworICAgIGVsc2UgaWYgKGNsZWFycnEgPT0gU0VUX0FVVE8gJiYJLyogU0VUIENMRUFSLUNIQU5ORUwgQVVUTyAqLworCSAgICAgKChuZXR3b3JrICYmIG5ldHR5cGUgPT0gTkVUX1RDUEIgLyogVENQL0lQICovCisjaWZkZWYgUkxPR0NPREUKKyAgICAgICAgICAgICAgICAmJiB0dG5wcm90byAhPSBOUF9STE9HSU4vKiBSbG9naW4gaXMgbm90IGNsZWFyICovCisgICAgICAgICAgICAgICAgJiYgISh0dG5wcm90byA+PSBOUF9LNExPR0lOICYmIHR0bnByb3RvIDw9IE5QX0VLNUxPR0lOKQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisJICAgICAgICkKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICAgICAgICAgIHx8IChuZXR3b3JrICYmIG5ldHR5cGUgPT0gTkVUX1NTSCkKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisjaWZkZWYgSUtTRAorCSAgICAgIHx8IGluc2VydmVyCQkvKiBXZSBhcmUgSUtTRCAqLworI2VuZGlmIC8qIElLU0QgKi8KKwkgICAgICApKQorICAgICAgeCB8PSBXTUlfQ0xFQVI7CisjZW5kaWYgLyogVENQU09DS0VUICovCisgICAgeCB8PSBXTUlfRkxBRzsKKyAgICBkYWRhWzE3XSA9IChjaGFyKSB0b2NoYXIoeCk7CisjZW5kaWYgLyogV0hBVEFNSSAqLworICAgIGkgPSAxODsJCQkJLyogUG9zaXRpb24gb2YgbmV4dCBmaWVsZCAqLworICAgIHAgPSBja3N5c2lkOwkJCS8qIFdIT0FNSSAobXkgc3lzdGVtIElEKSAqLworICAgIHggPSBzdHJsZW4ocCk7CisgICAgaWYgKG1heCAtIGkgPCB4ICsgMSkgcmV0dXJuKGRhZGEpOworICAgIGlmICh4ID4gMCkgeworCWRhZGFbaSsrXSA9IChjaGFyKSB0b2NoYXIoeCk7CisJd2hpbGUgKCpwKQorCSAgZGFkYVtpKytdID0gKnArKzsKKyAgICB9CisKKyAgICBpZiAobWF4IDwgaSsxKSByZXR1cm4oZGFkYSk7CisjaWZuZGVmIFdIQVRBTUkJCQkJLyogV0hBVEFNSTIgKi8KKyAgICBkYWRhW2krK10gPSAnICc7CisjZWxzZQorICAgIGRlYnVnKEYxMDEsInJwYXIgeGZlcm1vZGUiLCIiLHhmZXJtb2RlKTsKKyAgICB4ID0gV01JMl9GTEFHOwkJCS8qIElzLVZhbGlkIGZsYWcgKi8KKyAgICBpZiAoeGZlcm1vZGUgIT0gWE1PREVfQSkJCS8qIElmIFRSQU5TRkVSIE1PREUgaXMgTUFOVUFMICovCisgICAgICB4IHw9IFdNSTJfWE1PREU7CQkJLyogc2V0IHRoZSBYRkVSTU9ERSBiaXQgKi8KKyAgICBpZiAocmVjdXJzaXZlID4gMCkJCQkvKiBJZiB0aGlzIGlzIGEgcmVjdXJzaXZlIHRyYW5zZmVyICovCisgICAgICB4IHw9IFdNSTJfUkVDVTsJCQkvKiBzZXQgdGhlIFJFQ1VSU0lWRSBiaXQgKi8KKyAgICBkYWRhW2krK10gPSB0b2NoYXIoeCk7CisgICAgZGVidWcoRjEwMSwicnBhciB3aGF0YW1pMiIsIiIseCk7CisjZW5kaWYgLyogV0hBVEFNSSAqLworCisgICAgZGFkYVtpXSA9ICdcMCc7CQkJLyogVGVybWluYXRlIHRoZSBpbml0IHN0cmluZyAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisJZGVidWcoRjExMCwicnBhciIsZGFkYSwwKTsKKwlyZGVidShkYWRhLChpbnQpc3RybGVuKChjaGFyICopZGFkYSkpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgIGNrc3RybmNweSgoY2hhciAqKW15aW5pdCwoY2hhciAqKWRhZGEsTVlJTklUTEVOKTsKKyAgICByZXR1cm4oZGFkYSk7CQkJLyogUmV0dXJuIHBvaW50ZXIgdG8gc3RyaW5nLiAqLworfQorCitpbnQKK3NwYXIocykgQ0hBUiAqczsgewkJCS8qIFNldCBwYXJhbWV0ZXJzICovCisgICAgaW50IHgsIHksIGxwc2l6LCBiaWdnZXN0OworICAgIGV4dGVybiBpbnQgcnBybWxlbiwgbGFzdHNwbWF4OworICAgIGV4dGVybiBzdHJ1Y3Qgc3lzZGF0YSBzeXNpZGxpc3RbXTsKKworICAgIHdoYXRydSA9IDA7CisgICAgd2hvYXJldVswXSA9IE5VTDsKKyNpZmRlZiBTVFJFQU1JTkcKKyAgICBzdHJlYW1vayA9IDA7CisgICAgc3RyZWFtaW5nID0gMDsKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKyAgICBiaWdnZXN0ID0gcmxuOworCisgICAgZGVidWcoRjEwMSwgInNwYXIgYmlnZ2VzdCAxIiwiIixiaWdnZXN0KTsKKyAgICBkZWJ1ZyhGMTAxLCAic3BhciBycHJtbGVuIiwiIixycHJtbGVuKTsKKyAgICBpZiAocnBybWxlbiA+IDEgJiYgcnBybWxlbiA8IGJpZ2dlc3QpCisgICAgICBiaWdnZXN0ID0gcnBybWxlbjsKKyAgICBkZWJ1ZyhGMTAxLCAicnBhciBiaWdnZXN0IDIiLCIiLGJpZ2dlc3QpOworICAgIGRlYnVnKEYxMTAsInNwYXIgcGFja2V0IixzLDApOworCisgICAgcy0tOwkJCQkvKiBMaW5lIHVwIHdpdGggZmllbGQgbnVtYmVycy4gKi8KKworLyogTGltaXQgb24gc2l6ZSBvZiBvdXRib3VuZCBwYWNrZXRzICovCisgICAgeCA9IChiaWdnZXN0ID49IDEpID8geHVuY2hhcihzWzFdKSA6IDgwOworICAgIGxwc2l6ID0gc3BzaXpyOwkJCS8qIFJlbWVtYmVyIHdoYXQgdGhleSBTRVQuICovCisgICAgaWYgKHNwc2l6ZikgewkJCS8qIFNFVC1jb21tYW5kIG92ZXJyaWRlPyAqLworCWlmICh4IDwgc3BzaXpyKSBzcHNpeiA9IHg7CS8qIElnbm9yZSBMRU4gdW5sZXNzIHNtYWxsZXIgKi8KKyAgICB9IGVsc2UgewkJCQkvKiBvdGhlcndpc2UgKi8KKwlzcHNpeiA9ICh4IDwgMTApID8gODAgOiB4OwkvKiBiZWxpZXZlIHRoZW0gaWYgcmVhc29uYWJsZSAqLworICAgIH0KKyAgICBzcG1heCA9IHNwc2l6OwkJCS8qIFJlbWVtYmVyIG1heGltdW0gc2l6ZSAqLworCisvKiBUaW1lb3V0IG9uIGluYm91bmQgcGFja2V0cyAqLworICAgIGlmICh0aW1lZikgeworCXRpbWludCA9IHJ0aW1vOwkJCS8qIFNFVCBTRU5EIFRJTUVPVVQgdmFsdWUgb3ZlcnJpZGVzICovCisgICAgfSBlbHNlIHsJCQkJLyogT3RoZXJ3aXNlIHVzZSByZXF1ZXN0ZWQgdmFsdWUsICovCisJeCA9IChiaWdnZXN0ID49IDIpID8geHVuY2hhcihzWzJdKSA6IHJ0aW1vOyAvKiBpZiBpdCBpcyBsZWdhbC4gKi8KKwl0aW1pbnQgPSAoeCA8IDApID8gcnRpbW8gOiB4OworICAgIH0KKyAgICB0aW1pbnQgPSBjaGt0aW1vKHRpbWludCx0aW1lZik7CS8qIEFkanVzdCBpZiBuZWNlc3NhcnkgKi8KKworLyogT3V0Ym91bmQgUGFkZGluZyAqLworICAgIG5wYWQgPSAwOyBwYWRjaCA9ICdcMCc7CisgICAgaWYgKGJpZ2dlc3QgPj0gMykgeworCW5wYWQgPSB4dW5jaGFyKHNbM10pOworCWlmIChiaWdnZXN0ID49IDQpIHBhZGNoID0gKENIQVIpIGN0bChzWzRdKTsgZWxzZSBwYWRjaCA9IDA7CisgICAgfQorICAgIGlmIChucGFkKSB7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG5wYWQ7IGkrKykgcGFkYnVmW2ldID0gZG9wYXIocGFkY2gpOworICAgIH0KKworLyogT3V0Ym91bmQgUGFja2V0IFRlcm1pbmF0b3IgKi8KKyAgICBzZW9sID0gKENIQVIpIChiaWdnZXN0ID49IDUpID8geHVuY2hhcihzWzVdKSA6IENSOworICAgIGlmICgoc2VvbCA8IDEpIHx8IChzZW9sID4gMzEpKSBzZW9sID0gQ1I7CisKKy8qIENvbnRyb2wgcHJlZml4IHRoYXQgdGhlIG90aGVyIEtlcm1pdCBpcyBzZW5kaW5nICovCisgICAgeCA9IChiaWdnZXN0ID49IDYpID8gc1s2XSA6ICcjJzsKKyAgICBjdGxxID0gKENIQVIpICgoKHggPiAzMiAmJiB4IDwgNjMpIHx8ICh4ID4gOTUgJiYgeCA8IDEyNykpID8geCA6ICcjJyk7CisKKy8qIDh0aC1iaXQgcHJlZml4ICovCisvKgorICBOT1RFOiBNYXliZSB0aGlzIGNvdWxkIGJlIHNpbXBsaWZpZWQgdXNpbmcgcmN2dHlwLgorICBJZiByY3Z0eXAgPT0gJ1knIHRoZW4gd2UncmUgcmVhZGluZyB0aGUgQUNLLAorICBvdGhlcndpc2Ugd2UncmUgcmVhZGluZyB0aGUgb3RoZXIgS2VybWl0J3MgaW5pdGlhbCBiaWQuCisgIEJ1dCBoaXMgaG9ycmVuZG91cyBjb2RlIGhhcyBiZWVuIHdvcmtpbmcgT0sgZm9yIHllYXJzLCBzby4uLgorKi8KKyAgICBycSA9IChiaWdnZXN0ID49IDcpID8gc1s3XSA6IDA7CisgICAgaWYgKHJxID09ICdZJykgcnFmID0gMTsKKyAgICAgIGVsc2UgaWYgKChycSA+IDMyICYmIHJxIDwgNjMpIHx8IChycSA+IDk1ICYmIHJxIDwgMTI3KSkgcnFmID0gMjsKKyAgICAgICAgZWxzZSBycWYgPSAwOworICAgIGRlYnVnKEYwMDAsInNwYXIgOGJxIHJxIiwiIixycSk7CisgICAgZGVidWcoRjAwMCwic3BhciA4YnEgc3EiLCIiLHNxKTsKKyAgICBkZWJ1ZyhGMDAwLCJzcGFyIDhicSBlYnEiLCIiLGVicSk7CisgICAgZGVidWcoRjEwMSwic3BhciA4YnEgcnFmIiwiIixycWYpOworICAgIHN3aXRjaCAocnFmKSB7CisgICAgICBjYXNlIDA6CQkJCS8qIEZpZWxkIGlzIG1pc3NpbmcgZnJvbSBwYWNrZXQuICovCisJZWJxZmxnID0gMDsJCQkvKiBTbyBubyA4dGgtYml0IHByZWZpeGluZy4gKi8KKwlicmVhazsKKyAgICAgIGNhc2UgMToJCQkJLyogT3RoZXIgS2VybWl0IHNlbnQgJ1knID0gV2lsbCBEby4gKi8KKwkvKgorICAgICAgICAgIFdoZW4gSSBhbSB0aGUgZmlsZSByZWNlaXZlciwgZWJxc2VudCBpcyAwIGJlY2F1c2UgSSBkaWRuJ3Qgc2VuZCBhCisgICAgICAgICAgbmVnb3RpYXRpb24geWV0LiAgSWYgbXkgcGFyaXR5IGlzIHNldCB0byBhbnl0aGluZyBvdGhlciB0aGFuIE5PTkUsCisgICAgICAgICAgZWl0aGVyIGJlY2F1c2UgbXkgdXNlciBTRVQgUEFSSVRZIG9yIGJlY2F1c2UgSSBkZXRlY3RlZCBwYXJpdHkgYml0cworICAgICAgICAgIG9uIHRoaXMgcGFja2V0LCBJIHJlcGx5IHdpdGggJyYnLCBvdGhlcndpc2UgJ1knLgorCisJICBXaGVuIEkgYW0gdGhlIGZpbGUgc2VuZGVyLCBlYnFzZW50IGlzIHdoYXQgSSBqdXN0IHNlbnQgaW4gcnBhcigpLAorICAgICAgICAgIHdoaWNoIGNhbiBiZSAnWScsICdOJywgb3IgJyYnLiAgSWYgSSBzZW50ICcmJywgdGhlbiB0aGlzICdZJyBtZWFucworICAgICAgICAgIHRoZSBvdGhlciBLZXJtaXQgYWdyZWVzIHRvIGRvIDh0aC1iaXQgcHJlZml4aW5nLgorCisgICAgICAgICAgSWYgSSBzZW50ICdZJyBvciAnTicsIGJ1dCB0aGVuIGRldGVjdGVkIHBhcml0eSBvbiB0aGUgQUNLIHBhY2tldAorICAgICAgICAgIHRoYXQgY2FtZSBiYWNrLCB0aGVuIGl0J3MgdG9vIGxhdGU6IHRoZXJlIGlzIG5vIGxvbmdlciBhbnkgd2F5IGZvcgorICAgICAgICAgIG1lIHRvIHRlbGwgdGhlIG90aGVyIEtlcm1pdCB0aGF0IEkgd2FudCB0byBkbyA4dGgtYml0IHByZWZpeGluZywgc28KKyAgICAgICAgICBJIG11c3Qgbm90IGRvIGl0LCBhbmQgaW4gdGhhdCBjYXNlLCBpZiB0aGVyZSBpcyBhbnkgOC1iaXQgZGF0YSBpbgorICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHRyYW5zZmVycmVkLCB0aGUgdHJhbnNmZXIgd2lsbCBmYWlsIGJlY2F1c2Ugb2YgYmxvY2sKKyAgICAgICAgICBjaGVjayBlcnJvcnMuCisKKyAgICAgICAgICBUaGUgZm9sbG93aW5nIGNsYXVzZSBjb3ZlcnMgYWxsIG9mIHRoZXNlIHNpdHVhdGlvbnM6CisJKi8KKwlpZiAocGFyaXR5ICYmIChlYnFzZW50ID09IDAgfHwgZWJxc2VudCA9PSAnJicpKSB7CisJICAgIGVicWZsZyA9IDE7CisJICAgIGVicSA9IE1ZRUJROworCX0KKwlicmVhazsKKyAgICAgIGNhc2UgMjoJCQkJLyogT3RoZXIgS2VybWl0IHNlbnQgYSB2YWxpZCBwcmVmaXggKi8KKwllYnFmbGcgPSAoZWJxID09IHNxIHx8IHNxID09ICdZJyk7CisJaWYgKGVicWZsZykgeworCSAgICBlYnEgPSBycTsKKwkgICAgZGVidWcoRjEwMSwic3BhciBzZXR0aW5nIHBhcml0eSB0byBzcGFjZSIsIiIsZWJxKTsKKwkgICAgaWYgKCFwYXJpdHkpIHBhcml0eSA9IHR0cHJ0eSA9ICdzJzsKKwl9CisgICAgfQorICAgIGlmIChsc2NhcHUgPT0gMikgeyAgICAgLyogQnV0IG5vIHNpbmdsZS1zaGlmdHMgaWYgTE9DS0lORy1TSElGVCBGT1JDRUQgKi8KKwllYnFmbGcgPSAwOworCWVicSA9ICdOJzsKKyAgICB9CisKKy8qIEJsb2NrIGNoZWNrICovCisgICAgeCA9IDE7CisgICAgaWYgKGJpZ2dlc3QgPj0gOCkgeworCWlmIChzWzhdID09ICdCJykgeCA9IDQ7CisJZWxzZSB4ID0gc1s4XSAtICcwJzsKKwlpZiAoKHggPCAxKSB8fCAoeCA+IDQpKSB4ID0gMTsKKyAgICB9CisgICAgYmN0ciA9IHg7CisKKy8qIFJlcGVhdCBwcmVmaXggKi8KKworICAgIHJwdGZsZyA9IDA7CQkJCS8qIEFzc3VtZSBubyByZXBlYXQtY291bnRzICovCisgICAgaWYgKGJpZ2dlc3QgPj0gOSkgewkJCS8qIElzIHRoZXJlIGEgcmVwZWF0LWNvdW50IGZpZWxkPyAqLworCWNoYXIgdDsJCQkJLyogWWVzLiAqLworCXQgPSBzWzldOwkJCS8qIEdldCBpdHMgY29udGVudHMuICovCisvKgorICBJZiBJJ20gc2VuZGluZyBmaWxlcywgdGhlbiBJJ20gcmVhZGluZyB0aGVzZSBwYXJhbWV0ZXJzIGZyb20gYW4gQUNLLCBhbmQgc28KKyAgdGhpcyBjaGFyYWN0ZXIgbXVzdCBhZ3JlZSB3aXRoIHdoYXQgSSBzZW50LgorKi8KKwlpZiAocnB0ZW5hKSB7CQkJLyogSWYgZW5hYmxlZCAuLi4gKi8KKwkgICAgaWYgKChjaGFyKSByY3Z0eXAgPT0gJ1knKSB7CS8qIFNlbmRpbmcgZmlsZXMsIHJlYWRpbmcgQUNLLiAqLworCQlpZiAodCA9PSBteXJwdHEpIHJwdGZsZyA9IDE7CisJICAgIH0gZWxzZSB7CQkJLyogSSdtIHJlY2VpdmluZyBmaWxlcyAqLworCQlpZiAoKHQgPiAzMiAmJiB0IDwgNjMpIHx8ICh0ID4gOTUgJiYgdCA8IDEyNykpIHsKKwkJICAgIHJwdGZsZyA9IDE7CisJCSAgICBycHRxID0gdDsKKwkJfQorCSAgICB9CisJfSBlbHNlIHJwdGZsZyA9IDA7CisgICAgfQorCisvKiBDYXBhYmlsaXRpZXMgKi8KKworICAgIGF0Y2FwdSA9IGxwY2FwdSA9IHN3Y2FwdSA9IHJzY2FwdSA9IDA7IC8qIEFzc3VtZSBub25lIG9mIHRoZXNlLiAqLworICAgIGlmIChsc2NhcHUgIT0gMikgbHNjYXB1ID0gMDsJLyogQXNzdW1lIG5vIExTIHVubGVzcyBmb3JjZWQuICovCisgICAgeSA9IDExOwkJCQkvKiBQb3NpdGlvbiBvZiBuZXh0IGZpZWxkLCBpZiBhbnkgKi8KKyAgICBpZiAoYmlnZ2VzdCA+PSAxMCkgeworICAgICAgICB4ID0geHVuY2hhcihzWzEwXSk7CisJZGVidWcoRjEwMSwic3BhciBjYXBhcyIsIiIseCk7CisgICAgICAgIGF0Y2FwdSA9ICh4ICYgYXRjYXBiKSAmJiBhdGNhcHI7IC8qIEF0dHJpYnV0ZXMgKi8KKwlscGNhcHUgPSAoeCAmIGxwY2FwYikgJiYgbHBjYXByOyAvKiBMb25nIHBhY2tldHMgKi8KKwlzd2NhcHUgPSAoeCAmIHN3Y2FwYikgJiYgc3djYXByOyAvKiBTbGlkaW5nIHdpbmRvd3MgKi8KKwlyc2NhcHUgPSAoeCAmIHJzY2FwYikgJiYgcnNjYXByOyAvKiBSRVNFTkQgKi8KKwlkZWJ1ZyhGMTAxLCJzcGFyIGxzY2FwdSIsIiIsbHNjYXB1KTsKKwlkZWJ1ZyhGMTAxLCJzcGFyIGxzY2FwciIsIiIsbHNjYXByKTsKKwlkZWJ1ZyhGMTAxLCJzcGFyIGVicWZsZyIsIiIsZWJxZmxnKTsKKwlpZiAobHNjYXB1ICE9IDIpIGxzY2FwdSA9ICgoeCAmIGxzY2FwYikgJiYgbHNjYXByICYmIGVicWZsZykgPyAxIDogMDsKKwlkZWJ1ZyhGMTAxLCJzcGFyIHN3Y2FwciIsIiIsc3djYXByKTsKKwlkZWJ1ZyhGMTAxLCJzcGFyIHN3Y2FwdSIsIiIsc3djYXB1KTsKKwlkZWJ1ZyhGMTAxLCJzcGFyIGxzY2FwdSIsIiIsbHNjYXB1KTsKKwlmb3IgKHkgPSAxMDsgKHh1bmNoYXIoc1t5XSkgJiAxKSAmJiAoYmlnZ2VzdCA+PSB5KTsgeSsrKTsKKwlkZWJ1ZyhGMTAxLCJzcGFyIHkiLCIiLHkpOworICAgIH0KKworLyogTG9uZyBQYWNrZXRzICovCisgICAgZGVidWcoRjEwMSwic3BhciBscGNhcHUiLCIiLGxwY2FwdSk7CisgICAgaWYgKGxwY2FwdSkgeworICAgICAgICBpZiAoYmlnZ2VzdCA+IHkrMSkgeworCSAgICB4ID0geHVuY2hhcihzW3krMl0pICogOTUgKyB4dW5jaGFyKHNbeSszXSk7CisJICAgIGRlYnVnKEYxMDEsInNwYXIgbHAgbGVuIiwiIix4KTsKKwkgICAgaWYgKHNwc2l6ZikgewkJLyogSWYgb3ZlcnJpZGluZyBuZWdvdGlhdGlvbnMgKi8KKwkJc3BzaXogPSAoeCA8IGxwc2l6KSA/IHggOiBscHNpejsgLyogZG8gdGhpcywgKi8KKwkgICAgfSBlbHNlIHsJCQkgICAgICAgICAvKiBvdGhlcndpc2UgKi8KKwkJc3BzaXogPSAoeCA+IE1BWFNQKSA/IE1BWFNQIDogeDsgLyogZG8gdGhpcy4gKi8KKwkgICAgfQorCSAgICBpZiAoc3BzaXogPCAxMCkgc3BzaXogPSA4MDsJLyogQmUgZGVmZW5zaXZlLi4uICovCisJfQorICAgIH0KKyAgICAvKiAoUFdQKSBzYXZlIGN1cnJlbnQgc2VuZCBwYWNrZXQgc2l6ZSBmb3Igb3B0aW1hbCBwYWNrZXQgc2l6ZSBjYWxjcyAqLworICAgIHNwbWF4ID0gc3BzaXo7CQkJLyogTWF4aW11bSBuZWdvdGlhdGVkIGxlbmd0aCAqLworICAgIGxhc3RzcG1heCA9IHNwc2l6OwkJCS8qIEZvciBzdGF0cyAqLworICAgIGlmIChzbG9zdGFydCAmJiBzcHNpeiA+IDQ5OSkJLyogU2xvdyBzdGFydCBsZW5ndGggKi8KKyAgICAgIHNwc2l6ID0gMjQ0OworICAgIGRlYnVnKEYxMDEsInNwYXIgc2xvdy1zdGFydCBzcHNpeiIsIiIsc3BzaXopOworICAgIGRlYnVnKEYxMDEsInNwYXIgbHAgc3BtYXgiLCIiLHNwbWF4KTsKKyAgICB0aW1pbnQgPSBjaGt0aW1vKHRpbWludCx0aW1lZik7CS8qIFJlY2FsY3VsYXRlIHRoZSBwYWNrZXQgdGltZW91dCAqLworCisvKiBTbGlkaW5nIFdpbmRvd3MuLi4gKi8KKworICAgIGlmIChzd2NhcHIpIHsJCQkvKiBPbmx5IGlmIHJlcXVlc3RlZC4uLiAqLworICAgICAgICBpZiAoYmlnZ2VzdCA+IHkpIHsJCS8qIFNlZSB3aGF0IG90aGVyIEtlcm1pdCBzYXlzICovCisJICAgIHggPSB4dW5jaGFyKHNbeSsxXSk7CisJICAgIGRlYnVnKEYxMDEsInNwYXIgd2luZG93IiwiIix4KTsKKwkgICAgd3Nsb3RuID0gKHggPiBNQVhXUykgPyBNQVhXUyA6IHg7CisvKgorICB3c2xvdG4gPSBuZWdvdGlhdGVkIHNpemUgKGZyb20gb3RoZXIgS2VybWl0J3MgUyBvciBJIHBhY2tldCkuCisgIHdzbG90ciA9IHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAoZnJvbSB0aGlzIEtlcm1pdCdzIFNFVCBXSU5ET1cgY29tbWFuZCkuCisqLworCSAgICBpZiAod3Nsb3RuID4gd3Nsb3RyKQkvKiBVc2UgdGhlIHNtYWxsZXIgb2YgdGhlIHR3byAqLworCSAgICAgIHdzbG90biA9IHdzbG90cjsKKwkgICAgaWYgKHdzbG90biA8IDEpCQkvKiBXYXRjaCBvdXQgZm9yIGJhZCBuZWdvdGlhdGlvbiAqLworCSAgICAgIHdzbG90biA9IDE7CisJICAgIGlmICh3c2xvdG4gPiAxKSB7CisJCXN3Y2FwdSA9IDE7CQkvKiBXZSBkbyB3aW5kb3dzLi4uICovCisJCWlmICh3c2xvdG4gPiBtYXh0cnkpCS8qIFJldHJ5IGxpbWl0IG11c3QgYmUgZ3JlYXRlciAqLworCQkgIG1heHRyeSA9IHdzbG90biArIDE7CS8qIHRoYW4gd2luZG93IHNpemUuICovCisJICAgIH0KKwkgICAgZGVidWcoRjEwMSwic3BhciB3aW5kb3cgYWZ0ZXIgYWRqdXN0bWVudCIsIiIseCk7CisJfSBlbHNlIHsJCQkvKiBObyB3aW5kb3cgc2l6ZSBzcGVjaWZpZWQuICovCisJICAgIHdzbG90biA9IDE7CQkJLyogV2UgZG9uJ3QgZG8gd2luZG93cy4uLiAqLworCSAgICBkZWJ1ZyhGMTAxLCJzcGFyIHdpbmRvdyIsIiIseCk7CisJICAgIHN3Y2FwdSA9IDA7CisJICAgIGRlYnVnKEYxMDEsInNwYXIgbm8gd2luZG93cyIsIiIsd3Nsb3RuKTsKKwl9CisgICAgfQorCisvKiBOb3cgcmVjYWxjdWxhdGUgcGFja2V0IGxlbmd0aCBiYXNlZCBvbiBudW1iZXIgb2Ygd2luZG93cy4gICAqLworLyogVGhlIG5vZ290aWF0ZWQgbnVtYmVyIG9mIHdpbmRvdyBzbG90cyB3aWxsIGJlIGFsbG9jYXRlZCwgICAgKi8KKy8qIGFuZCB0aGUgbWF4aW11bSBwYWNrZXQgbGVuZ3RoIHdpbGwgYmUgcmVkdWNlZCBpZiBuZWNlc3NhcnksICovCisvKiBzbyB0aGF0IGEgd2luZG93ZnVsIG9mIHBhY2tldHMgY2FuIGZpdCBpbiB0aGUgYmlnIGJ1ZmZlci4gICAqLworCisgICAgaWYgKHdzbG90biA+IDEpIHsJCQkvKiBTaHJpbmsgdG8gZml0Li4uICovCisJeCA9IGFkanBrbChzcG1heCx3c2xvdG4sYmlnc2JzaXopOworCWlmICh4IDwgc3BtYXgpIHsKKwkgICAgc3BtYXggPSB4OworCSAgICBsYXN0c3BtYXggPSBzcHNpejsKKwkgICAgaWYgKHNsb3N0YXJ0ICYmIHNwc2l6ID4gNDk5KSBzcHNpeiA9IDI0NDsgLyogU2xvdyBzdGFydCBhZ2FpbiAqLworCSAgICBkZWJ1ZyhGMTAxLCJzcGFyIHNlbmRpbmcsIHJlZGVmaW5lIHNwbWF4IiwiIixzcG1heCk7CisJfQorICAgIH0KKyNpZmRlZiBXSEFUQU1JCisgICAgZGVidWcoRjEwMSwic3BhciBiaWdnZXN0IiwiIixiaWdnZXN0KTsKKyAgICBpZiAoYmlnZ2VzdCA+IHkrNykgewkJLyogR2V0IFdIQVRBTUkgaW5mbyBpZiBhbnkgKi8KKwl3aGF0cnUgPSB4dW5jaGFyKHNbeSs4XSk7CisJZGVidWcoRjEwMSwic3BhciB3aGF0cnUiLCIiLHdoYXRydSk7CisgICAgfQorICAgIGlmICh3aGF0cnUgJiBXTUlfRkxBRykgewkJLyogT25seSB2YWxpZCBpZiB0aGlzIGJpdCBpcyBzZXQgKi8KKyNpZmRlZiBTVFJFQU1JTkcKKwlpZiAod2hhdHJ1ICYgV01JX1NUUkVBTSkgeworCSAgICBpZiAoc3RyZWFtcnEgPT0gU0VUX09OIHx8CisJCShzdHJlYW1ycSA9PSBTRVRfQVVUTyAmJgorCQkgKHJlbGlhYmxlID09IFNFVF9PTiB8fCAocmVsaWFibGUgPT0gU0VUX0FVVE8gJiYgIWxvY2FsKQorI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgICAgICAgICAgICYmICFpc3RuY29tcG9ydCgpCisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworI2lmZGVmIElLU0QKKyAgICAgICAgICAgICAgICAgICB8fCBpbnNlcnZlcgorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgICAgICAgICAgICApKSkgeworCQlzdHJlYW1vayA9IDE7CQkvKiBTdHJlYW1pbmcgbmVnb3RpYXRlZCAqLworCQlzbG9zdGFydCA9IDA7CQkvKiBVbmRvIHNsb3ctc3RhcnQgbWFjaGluYXRpb25zICovCisJCXNwc2l6ID0gbGFzdHNwbWF4OworCSAgICB9CisJfQorCXN0cmVhbWVkID0gc3RyZWFtb2s7CisJZGVidWcoRjEwMSwic3BhciBzdHJlYW1vayIsIiIsc3RyZWFtb2spOworCWRlYnVnKEYxMDEsInNwYXIgY2xlYXJycSIsIiIsY2xlYXJycSk7CisJaWYgKGNsZWFycnEgPT0gU0VUX09OIHx8CisgICAgICAgICAgICAgKGNsZWFycnEgPT0gU0VUX0FVVE8gJiYKKyAgICAgICAgICAgICAgICgobmV0d29yayAmJiBuZXR0eXBlID09IE5FVF9UQ1BCCisjaWZkZWYgUkxPR0NPREUKKyAgICAgICAgICAgICAgICAmJiB0dG5wcm90byAhPSBOUF9STE9HSU4vKiBSbG9naW4gaXMgbm90IGNsZWFyICovCisgICAgICAgICAgICAgICAgJiYgISh0dG5wcm90byA+PSBOUF9LNExPR0lOICYmIHR0bnByb3RvIDw9IE5QX0VLNUxPR0lOKQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisjaWZkZWYgVE5fQ09NUE9SVAorICAgICAgICAgICAgICAgICYmICFpc3RuY29tcG9ydCgpCisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworICAgICAgICAgICAgICAgICAgKQorI2lmZGVmIFNTSEJVSUxUSU4KKyAgICAgICAgICAgICAgICAgfHwgKG5ldHdvcmsgJiYgbmV0dHlwZSA9PSBORVRfU1NIKQorI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKyNpZmRlZiBJS1NECisgICAgICAgICAgICAgICAgIHx8IGluc2VydmVyCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgICAgICAgICApKSkKKyAgICAgICAgICB1cmNsZWFyID0gKHdoYXRydSAmIFdNSV9DTEVBUik7CisJZGVidWcoRjEwMSwic3BhciB1cmNsZWFyIiwiIix1cmNsZWFyKTsKKyNpZmRlZiBDS19TUEVFRAorCWlmICh1cmNsZWFyKQorCSAgc2V0cHJlZml4KFBYX05PTik7CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKwljbGVhcmVkID0gdXJjbGVhcjsKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKyAgICB9CisjZW5kaWYgLyogV0hBVEFNSSAqLworCisgICAgaWYgKGJpZ2dlc3QgPiB5KzgpIHsJCS8qIEdldCBXSE9BUkVZT1UgaW5mbyBpZiBhbnkgKi8KKwlpbnQgeCwgejsKKwl4ID0geHVuY2hhcihzW3krOV0pOwkJLyogTGVuZ3RoIG9mIGl0ICovCisJeiA9IHk7CisJeSArPSAoOSArIHgpOworCWRlYnVnKEYxMDEsInNwYXIgc3lzaW5kZXggeCIsIiIseCk7CisJZGVidWcoRjEwMSwic3BhciBzeXNpbmRleCB5IiwiIix5KTsKKwlkZWJ1ZyhGMTAxLCJzcGFyIHN5c2luZGV4IGJpZ2dlc3QiLCIiLGJpZ2dlc3QpOworCisJaWYgKHggPiAwICYmIHggPCAxNiAmJiBiaWdnZXN0ID49IHkpIHsKKwkgICAgc3RybmNweSh3aG9hcmV1LChjaGFyICopcyt6KzEwLHgpOyAvKiBPdGhlciBLZXJtaXQncyBzeXN0ZW0gSUQgKi8KKwkgICAgZGVidWcoRjExMSwic3BhciB3aG9hcmV5b3UiLHdob2FyZXUsd2hvYXJldVswXSk7CisJICAgIGlmICh3aG9hcmV1WzBdKSB7CQkvKiBHb3Qgb25lPyAqLworCQlzeXNpbmRleCA9IGdldHN5c2l4KChjaGFyICopd2hvYXJldSk7CisJCWRlYnVnKEYxMDEsInNwYXIgc3lzaW5kZXgiLHdob2FyZXUsc3lzaW5kZXgpOworCSAgICB9CisJfQorICAgIH0gZWxzZQorICAgICAgZ290byB4c3BhcjsKKworI2lmZGVmIFdIQVRBTUkKKyAgICB5Kys7CQkJCS8qIEFkdmFuY2UgcG9pbnRlciAqLworICAgIGlmIChiaWdnZXN0ID49IHkpIHsKKwl3aGF0cnUyID0geHVuY2hhcihzW3ldKTsJLyogTmV4dCBmaWVsZCBpcyBXSEFUQU1JMiAqLworCWRlYnVnKEYxMDEsInNwYXIgd2hhdHJ1MiIsIiIsd2hhdHJ1Mik7CisJaWYgKHdoYXRydTIgJiBXTUkyX0ZMQUcpIHsJLyogVmFsaWQgb25seSBpZiB0aGlzIGJpdCBpcyBzZXQgKi8KKwkgICAgaWYgKHNlcnZlcikgewkJLyogU2VydmVyIG9iZXlzIGNsaWVudCdzIHhmZXIgbW9kZSAqLworCQl4ZmVybW9kZSA9ICh3aGF0cnUyICYgV01JMl9YTU9ERSkgPyBYTU9ERV9NIDogWE1PREVfQTsKKwkJZGVidWcoRjEwMSwic3BhciB3aGF0cnUyIHhmZXJtb2RlIiwiIix4ZmVybW9kZSk7CisJICAgIH0KKwkgICAgaWYgKHdoYXRydTIgJiBXTUkyX1JFQ1UpIHsJLyogUkVDVVJTSVZFIHRyYW5zZmVyICovCisJCWlmIChmbnJwYXRoID09IFBBVEhfQVVUTykgeyAvKiBJZiBSRUMgUEFUSCBBVVRPICovCisJCSAgICBmbnJwYXRoID0gUEFUSF9SRUw7CS8qIFNldCBpdCB0byBSRUxBVElWRSAqLworCQkgICAgYXV0b3BhdGggPSAxOwkvKiBhbmQgcmVtZW1iZXIgd2UgZGlkIHRoaXMgKi8KKwkJfQorCSAgICB9CisJfQorICAgIH0KKyNlbmRpZiAvKiBXSEFUQU1JICovCisKKyAgeHNwYXI6CisgICAgaWYgKHN5c2luZGV4ID4gLTEpIHsKKwljaGFyICogcDsKKwlwID0gc3lzaWRsaXN0W3N5c2luZGV4XS5zaWRfbmFtZTsKKwl0bG9nKEYxMTAsIlJlbW90ZSBzeXN0ZW0gdHlwZTogIixwLDBMKTsKKwlpZiAoc3lzaW5kZXggPiAwKSB7CQkvKiBJZiBwYXJ0bmV0J3Mgc3lzdGVtIHR5cGUga25vd24gKi8KKwkgICAgd2hvYXJld2UoKTsJCQkvKiBzZWUgaWYgd2UgYXJlIGEgbWF0Y2guICovCisjaWZkZWYgQ0tfU1BFRUQKKy8qIE5ldmVyIHVucHJlZml4IFhPTiBhbmQgWE9GRiB3aGVuIHNlbmRpbmcgdG8gVk1TICovCisJICAgIGRlYnVnKEYxMTEsInByb3RvIHdob2FyZXUiLHdob2FyZXUsc3lzaW5kZXgpOworCSAgICBpZiAoIXN0cmNtcCgoY2hhciAqKXdob2FyZXUsIkQ3IikpIHsKKwkJZGVidWcoRjExMSwicHJvdG8gc3BlY2lhbCBWTVMgcHJlZml4aW5nIiwiIiwwKTsKKwkJY3RscFtYT05dID0gY3RscFtYT0ZGXSA9IDE7CisJCWN0bHBbWE9OKzEyOF0gPSBjdGxwW1hPRkYrMTI4XSA9IDE7CisJCWN0bHBbM10gPSAxOwkJLyogQ3RybC1DIG1pZ2h0IGJlIGRhbmdlcm91cyB0b28gKi8KKwkJY3RscFsxNF0gPSBjdGxwWzE1XSA9IDE7IC8qIEFuZCBTTy9TSSAqLworCQljdGxwWzI0XSA9IGN0bHBbMjVdID0gMTsgLyogQW5kIF5YL15ZICovCisJCWN0bHBbMTQxXSA9IDE7CQkvKiBBbmQgQ1IrMTI4ICovCisJICAgIH0KKyNlbmRpZiAvKiBDS19TUEVFRCAqLworCX0KKyAgICB9CisKKy8qIFJlY29yZCBwYXJhbWV0ZXJzIGluIGRlYnVnIGxvZyAqLworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgc2RlYnUoYmlnZ2VzdCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICBudW1lcnJzID0gMDsJCQkvKiBTdGFydCBjb3VudGluZyBlcnJvcnMgaGVyZS4gKi8KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qICBHIE4gRiBJIEwgRSAgLS0gIEdldCBuYW1lIG9mIG5leHQgZmlsZSB0byBzZW5kICAqLworLyoKKyAgRXhwZWN0cyBnbG9iYWwgc25kc3JjIHRvIGJlOgorICAgLTk6IGlmIHdlIGFyZSBnZW5lcmF0aW5nIGEgZmlsZSBpbnRlcm5hbGx5IGZvciBjYWxpYnJhdGlvbi4KKyAgIC0xOiBuZXh0IGZpbGVuYW1lIHRvIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcgem5leHQoKS4KKyAgICAwOiBubyBuZXh0IGZpbGUgbmFtZQorICAgIDE6IChvciBncmVhdGVyKSBuZXh0IGZpbGVuYW1lIHRvIGJlIG9idGFpbmVkIGZyb20gKipjbWxpc3QsCisgICAgICAgb3IgaWYgYWRkbGlzdCAhPSAwLCBmcm9tIHRoZSAiZmlsZWhlYWQiIGxpbmtlZCBsaXN0LAorICAgICAgIG9yIGlmIGZpbGVmaWxlIHBvaW50ZXIgbm90IG51bGwgZnJvbSB0aGF0IGZpbGUgKHdoaWNoIGlzIGFscmVhZHkgb3BlbikuCisgIFJldHVybnM6CisgICAgMSwgd2l0aCBuYW1lIG9mIG5leHQgZmlsZSBpbiBmaWxuYW0uCisgICAgMCwgbm8gbW9yZSBmaWxlcywgd2l0aCBmaWxuYW0gc2V0IHRvIGVtcHR5IHN0cmluZy4KKyAgIC0xLCBmaWxlIG5vdCBmb3VuZAorICAgLTIsIGZpbGUgaXMgbm90IHJlYWRhYmxlIChidXQgdGhlbiB3ZSBqdXN0IHNraXAgdG8gdGhlIG5leHQgb25lIGlmIGFueSkKKyAgIC0zLCByZWFkIGFjY2VzcyBkZW5pZWQKKyAgIC00LCBjYW5jZWxsZWQKKyAgIC01LCB0b28gbWFueSBmaWxlcyBtYXRjaCB3aWxkY2FyZAorICAgLTYsIG5vIGZpbGVzIHNlbGVjdGVkCisgIE5PVEU6CisgICAgSWYgZ25maWxlKCkgcmV0dXJucyAwLCB0aGVuIHRoZSBnbG9iYWwgdmFyaWFibGUgZ25mZXJyb3Igc2hvdWxkIGJlIGNoZWNrZWQKKyAgICB0byBmaW5kIG91dCB0aGUgbW9zdCByZWNlbnQgZ25maWxlKCkgZXJyb3IsIGFuZCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHRoZQorICAgIHJldHVybiBjb2RlIChmb3IgcmVhc29ucyB0byBoYXJkIHRvIGV4cGxhaW4pLgorKi8KK2ludAorZ25maWxlKCkgeworICAgIGludCBpID0gMCwgeCA9IDA7IGxvbmcgeSA9IDBMOworICAgIGludCBkb2RpcnN0b28gPSAwOworICAgIGludCByZXRjb2RlID0gMDsKKworICAgIGNoYXIgZnVsbG5hbWVbQ0tNQVhQQVRIKzFdOworCisgICAgZG9kaXJzdG9vID0gKCh3aGF0ICYgKFdfRlRQfFdfU0VORCkpID09IChXX0ZUUHxXX1NFTkQpKSAmJiByZWN1cnNpdmU7CisKKyAgICBkZWJ1ZyhGMTAxLCJnbmZpbGUgc25kc3JjIiwiIixzbmRzcmMpOworICAgIGRlYnVnKEYxMDEsImduZmlsZSBmaWxjbnQiLCIiLGZpbGNudCk7CisgICAgZGVidWcoRjEwMSwiZ25maWxlIHdoYXQiLCIiLHdoYXQpOworICAgIGRlYnVnKEYxMDEsImduZmlsZSByZWN1cnNpdmUiLCIiLHJlY3Vyc2l2ZSk7CisgICAgZGVidWcoRjEwMSwiZ25maWxlIGRvZGlyc3RvbyIsIiIsZG9kaXJzdG9vKTsKKyAgICBnbmZlcnJvciA9IDA7CisgICAgZnNpemUgPSAtMUw7CQkJLyogSW5pdGlhbGl6ZSBmaWxlIHNpemUgKi8KKyAgICBmdWxsbmFtZVswXSA9IE5VTDsKKyAgICBpZiAoISh3aGF0ICYgV19SRU1PKSAmJiAoeGZlcm1vZGUgPT0gWE1PREVfQSkKKyNpZm5kZWYgTk9NU0VORAorCSYmICFhZGRsaXN0CisjZW5kaWYgLyogTk9NU0VORCAqLworCSkgeworCWV4dGVybiBpbnQgc3RkaW5mOworCWlmICghc3RkaW5mKQkJCS8qIE5vdCBpZiBzZW5kaW5nIGZyb20gc3RkaW4gKi8KKyNpZmRlZiBXSEFUQU1JCisJICAvKiBXZSBkb24ndCBkbyB0aGlzIGluIHNlcnZlciBtb2RlIGJlY2F1c2UgaXQgdW5kb2VzIFdIQVRBTUkgKi8KKwkgIGlmICghc2VydmVyIHx8IChzZXJ2ZXIgJiYgKCh3aGF0cnUgJiBXTUlfRkxBRykgPT0gMCkpKQorI2VuZGlmIC8qIFdIQVRBTUkgKi8KKwkgICAgYmluYXJ5ID0gZ25mX2JpbmFyeTsJLyogUmVzdG9yZSBwcmV2YWlsaW5nIHRyYW5zZmVyIG1vZGUgKi8KKwlkZWJ1ZyhGMTAxLCJnbmZpbGUgYmluYXJ5ID0gZ25mX2JpbmFyeSIsIiIsZ25mX2JpbmFyeSk7CisgICAgfQorI2lmZGVmIFBJUEVTRU5ECisgICAgZGVidWcoRjEwMSwiZ25maWxlIHBpcGVzZW5kIiwiIixwaXBlc2VuZCk7CisgICAgaWYgKHBpcGVzZW5kKSB7CQkJLyogRmlyc3Qgb25lICovCisJaWYgKGZpbGNudCA9PSAwKSB7CisJICAgIGNrc3RybmNweShmaWxuYW0sY21hcmcsQ0tNQVhQQVRIKzEpOworCSAgICByZXR1cm4oMSk7CisJfSBlbHNlIHsJCQkvKiBUaGVyZSdzIG9ubHkgb25lLi4uICovCisJICAgICpmaWxuYW0gPSBOVUw7CisJICAgIHBpcGVzZW5kID0gMDsKKwkgICAgcmV0dXJuKDApOworCX0KKyAgICB9CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKworI2lmZGVmIENBTElCUkFURQorICAgIGlmIChzbmRzcmMgPT0gLTkpIHsKKwlkZWJ1ZyhGMTAwLCJnbmZpbGUgY2FsaWJyYXRlIiwiIiwwKTsKKwlja3N0cm5jcHkoZmlsbmFtLCJDQUxJQlJBVElPTiIsQ0tNQVhQQVRIKTsKKwluZmlscyA9IDA7CisJY2FsX2ogPSAwOworCWZzaXplID0gY2FsaWJyYXRlOworCXNuZHNyYyA9IDA7CQkJLyogRm9yIG5leHQgdGltZSAqLworCW5maWxzID0gMDsKKwlyZXR1cm4oMSk7CisgICAgfQorI2VuZGlmIC8qIENBTElCUkFURSAqLworCisjaWZuZGVmIE5PU1BMCisgICAgaWYgKHNuZGFycmF5KSB7CQkJLyogU2VuZGluZyBmcm9tIGFuIGFycmF5ICovCisJZXh0ZXJuIGNoYXIgc25keG5hbVtdOwkJLyogUHNldWRvIGZpbGVuYW1lICovCisJZGVidWcoRjEwMCwiZ25maWxlIGFycmF5IiwiIiwwKTsKKwluZmlscyA9IDA7CisJZnNpemUgPSAtMUw7CQkJLyogU2l6ZSB1bmtub3duICovCisJc25kc3JjID0gMDsKKwlja3N0cm5jcHkoZmlsbmFtLHNuZHhuYW0sQ0tNQVhQQVRIKTsKKwlyZXR1cm4oMSk7CisgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICBpZiAoc25kc3JjID09IDApIHsJCQkvKiBJdCdzIG5vdCByZWFsbHkgYSBmaWxlICovCisJaWYgKG5maWxzID4gMCkgewkJLyogSXQncyBhIHBpcGUsIG9yIHN0ZGluICovCisJICAgIGNrc3RybmNweShmaWxuYW0sKmNtbGlzdCxDS01BWFBBVEgrMSk7IC8qIENvcHkgaXRzICJuYW1lIiAqLworCSAgICBuZmlscyA9IDA7CQkJLyogVGhlcmUgaXMgbm8gbmV4dCBmaWxlICovCisJICAgIHJldHVybigxKTsJCQkvKiBPSyB0aGlzIHRpbWUgKi8KKwl9IGVsc2UgcmV0dXJuKDApOwkJLyogYnV0IG5vdCBuZXh0IHRpbWUgKi8KKyAgICB9CisKKy8qIElmIGZpbGUgZ3JvdXAgaW50ZXJydXB0aW9uIChDLVopIG9jY3VycmVkLCBmYWlsLiAgKi8KKworICAgIGlmIChjenNlZW4pIHsKKwl0bG9nKEYxMDAsIlRyYW5zYWN0aW9uIGNhbmNlbGxlZCIsIiIsMEwpOworICAgICAgICBkZWJ1ZyhGMTAwLCJnbmZpbGUgY3pzZWVuIiwiIiwwKTsKKwlyZXR1cm4oLTQpOworICAgIH0KKworLyogTG9vcCB0aHJvdWdoIGZpbGUgbGlzdCB0aWxsIHdlIGZpbmQgYSByZWFkYWJsZSwgc2VuZGFibGUgZmlsZSAqLworCisgICAgeSA9IC0xTDsJCQkJLyogTG9vcCBleGl0IChmaWxlIHNpemUpIHZhcmlhYmxlICovCisgICAgd2hpbGUgKHkgPCAwTCkgewkJCS8qIEtlZXAgdHJ5aW5nIHRpbGwgd2UgZ2V0IG9uZS4uLiAqLworCXJldGNvZGUgPSAwOworCWlmIChzbmRzcmMgPiAwKSB7CQkvKiBGaWxlIGxpc3QgaW4gY21saXN0IG9yIGZpbGUgKi8KKwkgICAgaWYgKGZpbGVmaWxlKSB7CQkvKiBSZWFkaW5nIGxpc3QgZnJvbSBmaWxlLi4uICovCisJCWlmICh6c2lubChaTUZJTEUsZmlsbmFtLENLTUFYUEFUSCkgPCAwKSB7IC8qIFJlYWQgYSBsaW5lICovCisJCSAgICB6Y2xvc2UoWk1GSUxFKTsJICAgICAgICAgICAgICAgICAgLyogRmFpbGVkICovCisJCSAgICBkZWJ1ZyhGMTEwLCJnbmZpbGUgZmlsZWZpbGUgRU9GIixmaWxlZmlsZSwwKTsKKwkJICAgIG1ha2VzdHIoJmZpbGVmaWxlLE5VTEwpOworCQkgICAgcmV0dXJuKDApOworCQl9CisJCWRlYnVnKEYxMTAsImduZmlsZSBmaWxlZmlsZSBmaWxuYW0iLGZpbG5hbSwwKTsKKwkgICAgfQorCSAgICBkZWJ1ZyhGMTAxLCJnbmZpbGUgbmZpbHMiLCIiLG5maWxzKTsKKwkgICAgaWYgKG5maWxzLS0gPiAwIHx8IGZpbGVmaWxlKSB7IC8qIFN0aWxsIHNvbWUgbGVmdD8gKi8KKyNpZm5kZWYgTk9NU0VORAorCQlpZiAoYWRkbGlzdCkgeworCQkgICAgaWYgKGZpbGVuZXh0ICYmIGZpbGVuZXh0LT5mbF9uYW1lKSB7CisJCQlja3N0cm5jcHkoZmlsbmFtLGZpbGVuZXh0LT5mbF9uYW1lLENLTUFYUEFUSCsxKTsKKwkJCWNtYXJnMiA9CisJCQkgIGZpbGVuZXh0LT5mbF9hbGlhcyA/CisJCQkgICAgZmlsZW5leHQtPmZsX2FsaWFzIDoKKwkJCSAgICAgICIiOworCQkJYmluYXJ5ID0gZmlsZW5leHQtPmZsX21vZGU7CisJCSAgICB9IGVsc2UgeworCQkJcHJpbnRmKCI/SW50ZXJuYWwgZXJyb3IgZXhwYW5kaW5nIEFERCBsaXN0XG4iKTsKKwkJCXJldHVybigtNSk7CisJCSAgICB9CisJCSAgICBmaWxlbmV4dCA9IGZpbGVuZXh0LT5mbF9uZXh0OworCQkgICAgZGVidWcoRjExMSwiZ25maWxlIGFkZGxpc3QgZmlsbmFtIixmaWxuYW0sbmZpbHMpOworCQl9IGVsc2UgaWYgKHNuZHNyYyA+IDAgJiYgIWZpbGVmaWxlKSB7CisjZW5kaWYgLyogTk9NU0VORCAqLworCQkgICAgY2tzdHJuY3B5KGZpbG5hbSwqY21saXN0KyssQ0tNQVhQQVRIKzEpOworCQkgICAgZGVidWcoRjExMSwiZ25maWxlIGNtbGlzdCBmaWxuYW0iLGZpbG5hbSxuZmlscyk7CisjaWZuZGVmIE5PTVNFTkQKKwkJfQorI2VuZGlmIC8qIE5PTVNFTkQgKi8KKwkJaSA9IDA7CisjaWZuZGVmIE5PU0VSVkVSCisJCWRlYnVnKEYxMDEsImduZmlsZSBuZ2V0cGF0aCIsIiIsbmdldHBhdGgpOworI2VuZGlmIC8qIE5PU0VSVkVSICovCituZXh0aW5wYXRoOgorI2lmbmRlZiBOT1NFUlZFUgorCQlmcm9tZ2V0cGF0aCA9IDA7CisJCWlmIChzZXJ2ZXIgJiYgIWlzYWJzb2x1dGUoZmlsbmFtKSAmJiAobmdldHBhdGggPiBpKSkgeworCQkgICAgY2tzdHJuY3B5KGZ1bGxuYW1lLGdldHBhdGhbaV0sQ0tNQVhQQVRIKzEpOworCQkgICAgc3RybmNhdChmdWxsbmFtZSxmaWxuYW0sQ0tNQVhQQVRIKTsKKwkJICAgIGRlYnVnKEYxMTEsImduZmlsZSBnZXRwYXRoIixmdWxsbmFtZSxpKTsKKwkJICAgIGZyb21nZXRwYXRoID0gMTsKKwkJICAgIGkrKzsKKwkJfSBlbHNlIHsKKwkJICAgIGkgPSBuZ2V0cGF0aCArIDE7CisjZWxzZQorCQkgICAgaSA9IDE7CQkvKiA/ICovCisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKwkJICAgIGNrc3RybmNweShmdWxsbmFtZSxmaWxuYW0sQ0tNQVhQQVRIKzEpOworCQkgICAgZGVidWcoRjExMCwiZ25maWxlIGFic29sdXRlIixmdWxsbmFtZSwwKTsKKyNpZm5kZWYgTk9TRVJWRVIKKwkJfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCisJCWlmIChpc3dpbGQoZnVsbG5hbWUpCisjaWZkZWYgUkVDVVJTSVZFCisJCSAgICB8fCByZWN1cnNpdmUgPiAwIHx8ICFzdHJjbXAoZnVsbG5hbWUsIi4iKQorI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworCQkgICAgKSB7CS8qIEl0IGxvb2tzIHdpbGQuLi4gKi8KKwkJICAgIC8qIEZpcnN0IGNoZWNrIGlmIGEgZmlsZSB3aXRoIHRoaXMgbmFtZSBleGlzdHMgKi8KKwkJICAgIGRlYnVnKEYxMTAsImduZmlsZSB3aWxkIixmdWxsbmFtZSwwKTsKKwkJICAgIGlmICh6Y2hraShmdWxsbmFtZSkgPiAtMSkgeworCQkJLyoKKwkJCSAgIEhlcmUgd2UgaGF2ZSBhIGZpbGUgd2hvc2UgbmFtZSBhY3R1YWxseQorCQkJICAgY29udGFpbnMgd2lsZGNhcmQgY2hhcmFjdGVycy4KKwkJCSovCisJCQlnb3RvIGdvdG5hbTsKKwkJICAgIH0KKyNpZmRlZiBDT01NRU5UCisJCSAgICBuenhvcHRzID0gWlhfRklMT05MWTsgLyogKHdhcyAwOiAyNSBKdWwgMjAwMSBmZGMpICovCisjZWxzZQorCQkgICAgbnp4b3B0cyA9IHJlY3Vyc2l2ZSA/IDAgOiBaWF9GSUxPTkxZOyAvKiAzMCBKdWwgMjAwMSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkJICAgIGlmIChub2xpbmtzKSBuenhvcHRzIHw9IFpYX05PTElOS1M7CS8qICgyNiBKdWwgMjAwMSBmZGMpICovCisjaWZkZWYgVU5JWE9ST1NLCisJCSAgICBpZiAobWF0Y2hkb3QpIG56eG9wdHMgfD0gWlhfTUFUQ0hET1Q7CisjZW5kaWYgLyogVU5JWE9ST1NLICovCisJCSAgICBpZiAocmVjdXJzaXZlKSBuenhvcHRzIHw9IFpYX1JFQ1VSU0U7CisJCSAgICB4ID0gbnp4cGFuZChmdWxsbmFtZSxuenhvcHRzKTsgLyogRXhwYW5kIHdpbGRjYXJkcyAqLworCQkgICAgZGVidWcoRjEwMSwiZ25maWxlIG56eHBhbmQiLCIiLHgpOworCQkgICAgaWYgKHggPT0gMSkgeworCQkJaW50IHh4OworCQkJeHggPSB6bmV4dChmdWxsbmFtZSk7CisJCQlkZWJ1ZyhGMTExLCJnbmZpbGUgem5leHQgQSIsZnVsbG5hbWUseHgpOworCQkJZ290byBnb3RuYW07CisJCSAgICB9CisJCSAgICBpZiAoeCA9PSAwKSB7CS8qIE5vbmUgbWF0Y2ggKi8KKyNpZm5kZWYgTk9TRVJWRVIKKwkJCWlmIChzZXJ2ZXIgJiYgbmdldHBhdGggPiBpKQorCQkJICBnb3RvIG5leHRpbnBhdGg7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKwkJCXJldGNvZGUgPSAtMTsKKwkJCWRlYnVnKEYxMDEsImduZmlsZSBnbmZlcnJvciBBIiwiIixnbmZlcnJvcik7CisJCQlnbmZlcnJvciA9IC0xOworCQkJY29udGludWU7CisJCSAgICB9CisJCSAgICBpZiAoeCA8IDApIHsJLyogVG9vIG1hbnkgdG8gZXhwYW5kICovCisJCQlkZWJ1ZyhGMTAxLCJnbmZpbGUgZ25mZXJyb3IgQiIsIiIsZ25mZXJyb3IpOworCQkJZ25mZXJyb3IgPSAtNTsKKwkJCXJldHVybigtNSk7CisJCSAgICB9CisJCSAgICBzbmRzcmMgPSAtMTsJLyogQ2hhbmdlIHNlbmQtc291cmNlIHRvIHpuZXh0KCkgKi8KKwkJfQorCSAgICB9IGVsc2UgewkJCS8qIFdlJ3JlIG91dCBvZiBmaWxlcy4gKi8KKwkJZGVidWcoRjExMSwiZ25maWxlIGRvbmUiLGNraXRvYShnbmZlcnJvciksbmZpbHMpOworCQkqZmlsbmFtID0gJ1wwJzsKKwkJcmV0dXJuKDApOworCSAgICB9CisJfQorCisvKiBPdGhlcndpc2UsIHN0ZXAgdG8gbmV4dCBlbGVtZW50IG9mIGludGVybmFsIHdpbGRjYXJkIGV4cGFuc2lvbiBsaXN0LiAqLworCisJaWYgKHNuZHNyYyA9PSAtMSkgeworCSAgICBpbnQgeHggPSAwOworCSAgICB3aGlsZSAoMSkgeworCQlkZWJ1ZyhGMTExLCJnbmZpbGUgem5leHQgWCIsZmlsbmFtLHh4KTsKKwkJeHggPSB6bmV4dChmaWxuYW0pOworCQlkZWJ1ZyhGMTExLCJnbmZpbGUgem5leHQgQiIsZmlsbmFtLHh4KTsKKwkJaWYgKCFmaWxuYW1bMF0pCisJCSAgYnJlYWs7CisJCWlmIChkb2RpcnN0b28pIHsKKwkJICAgIGRlYnVnKEYxMTEsImduZmlsZSBGVFAgTVBVVCAvUkVDVVJTSVZFIixmaWxuYW0seHgpOworCQkgICAgYnJlYWs7CisJCX0KKwkJaWYgKCFpc2RpcihmaWxuYW0pKQorCQkgIGJyZWFrOworCSAgICB9CisJICAgIGRlYnVnKEYxMTEsImduZmlsZSB6bmV4dCBDIixmaWxuYW0seCk7CisJICAgIGlmICghZmlsbmFtWzBdKSB7CQkvKiBJZiBubyBtb3JlLCAqLworCQlzbmRzcmMgPSAxOwkJLyogZ28gYmFjayB0byBwcmV2aW91cyBsaXN0ICovCisJCWRlYnVnKEYxMDEsImduZmlsZSBzZXR0aW5nIHNuZHNyYyBiYWNrIiwiIixzbmRzcmMpOworCQljb250aW51ZTsKKwkgICAgfSBlbHNlCisJICAgICAgY2tzdHJuY3B5KGZ1bGxuYW1lLGZpbG5hbSxDS01BWFBBVEgrMSk7CisJfQorCisvKiBHZXQgaGVyZSB3aXRoIGEgZmlsZW5hbWUuICovCisKK2dvdG5hbToKKwlkZWJ1ZyhGMTEwLCJnbmZpbGUgZnVsbG5hbWUiLGZ1bGxuYW1lLDApOworCWlmIChmdWxsbmFtZVswXSkgeworI2lmZGVmIERUSUxERQorCSAgICBjaGFyICogZGlycCA9ICIiOworCSAgICBpZiAoZnVsbG5hbWVbMF0gPT0gJ34nKSB7CisJCWRpcnAgPSB0aWxkZV9leHBhbmQoKGNoYXIgKilmdWxsbmFtZSk7CisJCWlmICgqZGlycCkgY2tzdHJuY3B5KGZ1bGxuYW1lLGRpcnAsQ0tNQVhQQVRIKzEpOworCSAgICB9CisjZW5kaWYgLyogRFRJTERFICovCisJICAgIHkgPSB6Y2hraShmdWxsbmFtZSk7CS8qIENoZWNrIGlmIGZpbGUgcmVhZGFibGUgKi8KKwkgICAgZGVidWcoRjExMSwiZ25maWxlIHpjaGtpIixmdWxsbmFtZSx5KTsKKwkgICAgcmV0Y29kZSA9IChpbnQpIHk7CQkvKiBQb3NzaWJsZSByZXR1cm4gY29kZSAqLworCSAgICBpZiAoeSA9PSAtMkwgJiYgZG9kaXJzdG9vKSB7CisJCXkgPSAwTDsKKwkgICAgfQorCSAgICBpZiAoeSA8IDBMKSB7CisJCWduZmVycm9yID0gKGludCkgeTsKKwkJZGVidWcoRjEwMSwiZ25maWxlIGduZmVycm9yIEMiLCIiLGduZmVycm9yKTsKKwkgICAgfQorCSAgICBpZiAoeSA9PSAtMUwpIHsJCS8qIElmIG5vdCBmb3VuZCAqLworCQlkZWJ1ZyhGMTAwLCJnbmZpbGUgLTEiLCIiLDApOworI2lmbmRlZiBOT1NFUlZFUgorCQlpZiAoc2VydmVyICYmIG5nZXRwYXRoID4gaSkKKwkJICBnb3RvIG5leHRpbnBhdGg7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKwkJZGVidWcoRjExMCwiZ25maWxlIHNraXBwaW5nOiIsZnVsbG5hbWUsMCk7CisJCXRsb2coRjExMCxmdWxsbmFtZSwiOiBvcGVuIGZhaWx1cmUgLSBza2lwcGVkIiwwKTsKKwkJeHhzY3JlZW4oU0NSX0ZOLDAsMGwsZnVsbG5hbWUpOworCQl4eHNjcmVlbihTQ1JfU1QsU1RfU0tJUCxTS1BfQUNDLGZ1bGxuYW1lKTsKKyNpZmRlZiBUTE9HCisJCWlmICh0cmFsb2cgJiYgIXRsb2dmbXQpCisJCSAgZG94bG9nKHdoYXQsZnVsbG5hbWUsZnNpemUsYmluYXJ5LDEsIlNraXBwZWQiKTsKKyNlbmRpZiAvKiBUTE9HICovCisJCWNvbnRpbnVlOworCSAgICB9IGVsc2UgaWYgKHkgPCAwKSB7CisJCWlmICh5ID09IC0zKSB7CQkvKiBFeGlzdHMgYnV0IG5vdCByZWFkYWJsZSAqLworCQkgICAgZGVidWcoRjEwMCwiZ25maWxlIC0zIiwiIiwwKTsKKwkJICAgIGZpbHJlaisrOwkJLyogQ291bnQgdGhpcyBvbmUgYXMgbm90IHNlbnQgKi8KKwkJICAgIHRsb2coRjExMCwiUmVhZCBhY2Nlc3MgZGVuaWVkIixmdWxsbmFtZSwwKTsgLyogTG9nIHRoaXMgKi8KKwkJICAgIHh4c2NyZWVuKFNDUl9GTiwwLDBsLGZ1bGxuYW1lKTsKKwkJICAgIHh4c2NyZWVuKFNDUl9TVCxTVF9TS0lQLFNLUF9BQ0MsZnVsbG5hbWUpOyAvKiBEaXNwbGF5IGl0ICovCisjaWZkZWYgVExPRworCQkgICAgaWYgKHRyYWxvZyAmJiAhdGxvZ2ZtdCkKKwkJICAgICAgZG94bG9nKHdoYXQsZnVsbG5hbWUsZnNpemUsYmluYXJ5LDEsIlNraXBwZWQiKTsKKyNlbmRpZiAvKiBUTE9HICovCisJCX0KKwkJY29udGludWU7CisJICAgIH0gZWxzZSB7CisJCWludCB4eDsKKwkJZnNpemUgPSB5OworCQl4eCA9IGZpbGVzZWxlY3QoZnVsbG5hbWUsCisJCQkJc25kYWZ0ZXIsIHNuZGJlZm9yZSwKKwkJCQlzbmRuYWZ0ZXIsc25kbmJlZm9yZSwKKwkJCQlzbmRzbWFsbGVyLHNuZGxhcmdlciwKKwkJCQlza2lwYnVwLAorCQkJCU5TTkRFWENFUFQsc25kZXhjZXB0KTsKKwkJZGVidWcoRjExMSwiZ25maWxlIGZpbGVzZWxlY3QiLGZ1bGxuYW1lLHh4KTsKKwkJaWYgKCF4eCkgeworCQkgICAgeSA9IC0xTDsKKwkJICAgIGduZmVycm9yID0gLTY7CisJCSAgICBkZWJ1ZyhGMTAxLCJnbmZpbGUgZ25mZXJyb3IgRCIsIiIsZ25mZXJyb3IpOworCQkgICAgY29udGludWU7CisJCX0KKwkJY2tzdHJuY3B5KGZpbG5hbSxmdWxsbmFtZSxDS01BWFBBVEgrMSk7CisJCXJldHVybigxKTsKKwkgICAgfQorI2lmZGVmIENPTU1FTlQKKwkvKiBUaGlzIGNhbid0IGJlIHJpZ2h0ISAqLworCX0gZWxzZSB7CQkJLyogc25kc3JjIGlzIDAuLi4gKi8KKwkgICAgaWYgKCFmaWxlc2VsZWN0KGZ1bGxuYW1lLAorCQkJICAgIHNuZGFmdGVyLCBzbmRiZWZvcmUsCisJCQkgICAgc25kbmFmdGVyLHNuZG5iZWZvcmUsCisJCQkgICAgc25kc21hbGxlcixzbmRsYXJnZXIsCisJCQkgICAgc2tpcGJ1cCwKKwkJCSAgICBOU05ERVhDRVBULHNuZGV4Y2VwdCkpIHsKKwkJZ25mZXJyb3IgPSAtNjsKKwkJZGVidWcoRjExMSwiZ25maWxlIGZpbGVzZWxlY3QiLGZ1bGxuYW1lLGduZmVycm9yKTsKKwkJeSA9IC0xTDsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgY2tzdHJuY3B5KGZpbG5hbSxmdWxsbmFtZSxDS01BWFBBVEgrMSk7CisJICAgIHJldHVybigxKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJfQorICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJnbmZpbGUgcmVzdWx0IiwiIixyZXRjb2RlKTsKKyAgICAqZmlsbmFtID0gJ1wwJzsKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qCisgIFRoZSBmb2xsb3dpbmcgYnVuY2ggb2Ygcm91dGluZXMgZmVlZCBpbnRlcm5hbGx5IGdlbmVyYXRlZCBkYXRhIHRvIHRoZSBzZXJ2ZXIKKyAgdG8gc2VuZCB0byB0aGUgY2xpZW50IGluIHJlc3BvbnNlIHRvIFJFTU9URSBjb21tYW5kcyBsaWtlIERJUkVDVE9SWSwgREVMRVRFLAorICBhbmQgc28gb24uICBXZSBoYXZlIHRvIHdyaXRlIHRoZXNlIGxpbmVzIGluIHRoZSBmb3JtYXQgYXBwcm9wcmlhdGUgdG8gb3VyCisgIHBsYXRmb3JtLCBzbyB0aGV5IGNhbiBiZSBjb252ZXJ0ZWQgdG8gZ2VuZXJpYyAoQ1JMRikgdGV4dCBmb3JtYXQgYnkgdGhlCisgIHBhY2tldGl6ZXIuCisqLworI2lmZGVmIFVOSVgKK2NoYXIgKiBlbmRsaW5lID0gIlwxMiI7CisjZWxzZQorI2lmZGVmIGRhdGFnZW5lcmFsCitjaGFyICogZW5kbGluZSA9ICJcMTIiOworI2Vsc2UKKyNpZmRlZiBNQUMKK2NoYXIgKiBlbmRsaW5lID0gIlwxNSI7CisjZWxzZQorI2lmZGVmIE9TSworY2hhciAqIGVuZGxpbmUgPSAiXDE1IjsKKyNlbHNlCitjaGFyICogZW5kbGluZSA9ICJcMTVcMTIiOworI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZkZWYgTUFDCisjZGVmaW5lIEZOQ0JVRkwgMjU2CisjZWxzZQorI2lmZGVmIENLU1lNTElOSworI2RlZmluZSBGTkNCVUZMIChDS01BWFBBVEggKyBDS01BWFBBVEggKyA2NCkKKyNlbHNlCisjZGVmaW5lIEZOQ0JVRkwgKENLTUFYUEFUSCArIDY0KQorI2VuZGlmIC8qIENLU1lNTElOSyAqLworI2VuZGlmIC8qIE1BQyAqLworCisvKiBOQjogVGhlIG1pbmltdW0gRk5DQlVGTCBpcyAyNTUgKi8KKworc3RhdGljIENIQVIgZnVuY2J1ZltGTkNCVUZMXTsKK3N0YXRpYyBpbnQgIGZ1bmNueHQgPSAgMDsKK3N0YXRpYyBpbnQgIGZ1bmNsZW4gPSAgMDsKK3N0YXRpYyBpbnQgIG54cG5kICAgPSAtMTsKK3N0YXRpYyBsb25nIG5kaXJzICAgPSAgMDsKK3N0YXRpYyBsb25nIG5maWxlcyAgPSAgMDsKK3N0YXRpYyBsb25nIG5ieXRlcyAgPSAgMDsKKworaW50CitzbmRzdHJpbmcocCkgY2hhciAqIHA7IHsKKyNpZm5kZWYgTk9TRVJWRVIKKyAgICBuZmlscyA9IDA7CQkJCS8qIE5vIGZpbGVzLCBubyBsaXN0cy4gKi8KKyAgICB4ZmxnID0gMTsJCQkJLyogRmxhZyB3ZSBtdXN0IHNlbmQgWCBwYWNrZXQuICovCisgICAgY2tzdHJuY3B5KGNtZHN0cix2ZXJzaW8sQ01EU1RSTCk7CS8qIERhdGEgZm9yIFggcGFja2V0LiAqLworICAgIGZpcnN0ID0gMTsJCQkJLyogSW5pdCBnZXRjaHggbG9va2FoZWFkICovCisgICAgbWVtc3RyID0gMTsJCQkJLyogSnVzdCBzZXQgdGhlIGZsYWcuICovCisgICAgbWVtcHRyID0gcDsJCQkJLyogQW5kIHRoZSBwb2ludGVyLiAqLworICAgIGJpbmFyeSA9IFhZRlRfVDsJCQkvKiBUZXh0IG1vZGUgZm9yIHRoaXMuICovCisgICAgcmV0dXJuKHNpbml0KCkpOworI2Vsc2UKKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KK30KKworLyogIFMgTiBEIEggTCBQICAtLSAgUm91dGluZSB0byBzZW5kIGJ1aWx0aW4gaGVscCAgKi8KKworc3RhdGljIGludCBzcnZobHBudW0gPSAwOworCisjaWZkZWYgSUtTRAorc3RhdGljIGNoYXIgKm5teFtdID0gIHsgIkRpc2FibGVkIiwgIkRpc2FibGVkIiwgIkVuYWJsZWQiLCAiRW5hYmxlZCIgfTsKKyNlbmRpZiAvKiBJS1NEICovCisKK3N0YXRpYyBjaGFyICoKK3hubSh4KSBpbnQgeDsgeworI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpCisgICAgICByZXR1cm4obm14W3hdKTsKKyAgICBlbHNlCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgcmV0dXJuKG5tW3hdKTsKK30KKworc3RhdGljIGludAorbnh0aGxwKAorI2lmZGVmIENLX0FOU0lDCisgICAgICAgdm9pZAorI2VuZGlmIC8qIENLX0FOU0lDICovCisgICAgICAgKSB7CisgICAgaW50IHggPSAwOworICAgIGV4dGVybiBpbnQKKyAgICAgIGVuX2NweSwgZW5fY3dkLCBlbl9kZWwsIGVuX2RpciwgZW5fZmluLCBlbl9nZXQsIGVuX2J5ZSwgZW5fbWFpLAorICAgICAgZW5fcHJpLCBlbl9ob3MsIGVuX3JlbiwgZW5fc2VuLCBlbl9zcGEsIGVuX3NldCwgZW5fdHlwLCBlbl93aG8sCisgICAgICAvKiBlbl9yZXQsICovIGVuX21rZCwgZW5fcm1kLCBlbl9hc2csIGVuX3F1ZSwgZW5feGl0LCB4X2xvZ2luLCB4X2xvZ2dlZCwKKyAgICAgIHhmaW5pc2g7CisgICAgZXh0ZXJuIGNoYXIgKiBja3hzeXM7CisKKyAgICBpZiAoZnVuY254dCA8IGZ1bmNsZW4pCisgICAgICByZXR1cm4gKGZ1bmNidWZbZnVuY254dCsrXSk7CisKKyAgICBzd2l0Y2ggKHNydmhscG51bSsrKSB7CisgICAgICBjYXNlIDA6CisJeCA9IGNrc3RybmNweSgoY2hhciAqKWZ1bmNidWYsCisJCSAgICAgICJDbGllbnQgQ29tbWFuZCAgICAgU3RhdHVzICAgICAgICBEZXNjcmlwdGlvblxuIiwKKwkJICAgICAgRk5DQlVGTAorCQkgICAgICApOworCWlmICh4X2xvZ2luICYmICF4X2xvZ2dlZCkgeworCSAgICB4ICs9IGNrc3RybmNhdCgoY2hhciAqKWZ1bmNidWYsCisJCQkgICAiIFJFTU9URSBMT0dJTiAgICAgICByZXF1aXJlZFxuIiwKKwkJCSAgIEZOQ0JVRkwKKwkJCSAgICk7CisJfQorCWlmIChGTkNCVUZMIC0geCA+IDc0KQorCXNwcmludGYoKGNoYXIgKikoZnVuY2J1Zit4KSwiIEdFVCAgICAgICAgICAgICAgICAlLTE0cyVzXG4iLAorCQl4bm0oZW5fZ2V0KSwKKwkJIlRyYW5zZmVyIGZpbGUocykgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50LiIKKwkJKTsKKwlicmVhazsKKworLyogTk9URTogVGhlIG1pbmltdW0gZnVuY2J1ZltdIHNpemUgaXMgMjU1OyBhbGwgb2YgdGhlIGZvbGxvd2luZyBhcmUgc2FmZS4gKi8KKworICAgICAgY2FzZSAxOgorCXNwcmludGYoKGNoYXIgKilmdW5jYnVmLCIgU0VORCAgICAgICAgICAgICAgICUtMTRzJXNcbiIsCisJCXhubShlbl9zZW4pLAorCQkiVHJhbnNmZXIgZmlsZShzKSBmcm9tIGNsaWVudCB0byBzZXJ2ZXIuIgorCQkpOworCWJyZWFrOworCisgICAgICBjYXNlIDI6CisJc3ByaW50ZigoY2hhciAqKWZ1bmNidWYsIiBNQUlMICAgICAgICAgICAgICAgJS0xNHMlc1xuIiwKKwkJeG5tKGluc2VydmVyID8gMCA6IGVuX21haSksCisJCSJTZW5kIGZpbGUocykgYXMgZS1tYWlsLiIKKwkJKTsKKwlicmVhazsKKworICAgICAgY2FzZSAzOgorI2lmbmRlZiBOT1NQTAorCXNwcmludGYoKGNoYXIgKilmdW5jYnVmLCIgUkVNT1RFIEFTU0lHTiAgICAgICUtMTRzJXNcbiIsCisJCXhubShlbl9hc2cpLAorCQkiQXNzaWduIHZhbHVlIHRvIHNlcnZlciB2YXJpYWJsZSBvciBtYWNyby4iCisJCSk7CisjZWxzZQorCXNwcmludGYoKGNoYXIgKilmdW5jYnVmLCIgUkVNT1RFIEFTU0lHTiAgICAgIG5vdCBjb25maWd1cmVkXG4iKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisJYnJlYWs7CisgICAgICBjYXNlIDQ6CisJc3ByaW50ZigoY2hhciAqKWZ1bmNidWYsIiBSRU1PVEUgQ0QgICAgICAgICAgJS0xNHMlc1xuIiwKKwkJeG5tKGVuX2N3ZCksCisJCSJDaGFuZ2Ugc2VydmVyJ3MgZGlyZWN0b3J5LiIKKwkJKTsKKwlicmVhazsKKworICAgICAgY2FzZSA1OgorI2lmZGVmIFpDT1BZCisJc3ByaW50ZigoY2hhciAqKWZ1bmNidWYsIiBSRU1PVEUgQ09QWSAgICAgICAgJS0xNHMlc1xuIiwKKwkJeG5tKGVuX2NweSksCisJCSJDb3B5IGEgZmlsZSBvbiB0aGUgc2VydmVyLiIKKwkJKTsKKyNlbHNlCisJc3ByaW50ZigoY2hhciAqKWZ1bmNidWYsIiBSRU1PVEUgQ09QWSAgICAgICAgbm90IGNvbmZpZ3VyZWRcbiIpOworI2VuZGlmIC8qIFpDT1BZICovCisKKwlicmVhazsKKyAgICAgIGNhc2UgNjoKKwlzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwiIFJFTU9URSBERUxFVEUgICAgICAlLTE0cyVzXG4iLAorCQl4bm0oZW5fZGVsKSwKKwkJIkRlbGV0ZSBhIGZpbGUgb24gdGhlIHNlcnZlci4iCisJCSk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgNzoKKwlzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwiIFJFTU9URSBESVJFQ1RPUlkgICAlLTE0cyVzXG4iLAorCQl4bm0oZW5fZGlyKSwKKwkJIkxpc3QgZmlsZXMgb24gdGhlIHNlcnZlci4iCisJCSk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgODoKKwlzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwiIFJFTU9URSBFWElUICAgICAgICAlLTE0cyVzXG4iLAorCQl4bm0oZW5feGl0KSwKKwkJIkV4aXQgZnJvbSBLZXJtaXQgc2VydmVyIHByb2dyYW0uIgorCQkpOworCWJyZWFrOworCisgICAgICBjYXNlIDk6CisJc3ByaW50ZigoY2hhciAqKWZ1bmNidWYsIiBSRU1PVEUgSE9TVCAgICAgICAgJS0xNHMlc1xuIiwKKwkJeG5tKGluc2VydmVyID8gMCA6IGVuX2hvcyksCisjaWZkZWYgZGF0YWdlbmVyYWwKKwkJIkV4ZWN1dGUgYSBDTEkgY29tbWFuZCBvbiB0aGUgc2VydmVyLiIKKyNlbHNlCisjaWZkZWYgVk1TCisJCSJFeGVjdXRlIGEgRENMIGNvbW1hbmQgb24gdGhlIHNlcnZlci4iCisjZWxzZQorCQkiRXhlY3V0ZSBhIHNoZWxsIGNvbW1hbmQgb24gdGhlIHNlcnZlci4iCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKwkJKTsKKwlicmVhazsKKworICAgICAgY2FzZSAxMDoKKwlzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwiIFJFTU9URSBQUklOVCAgICAgICAlLTE0cyVzXG4iLAorCQl4bm0oaW5zZXJ2ZXIgPyAwIDogZW5fcHJpKSwKKwkJIlNlbmQgYSBmaWxlIHRvIHRoZSBzZXJ2ZXIgZm9yIHByaW50aW5nLiIKKwkJKTsKKwlicmVhazsKKworICAgICAgY2FzZSAxMToKKyNpZm5kZWYgTk9TUEwKKwlzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwiIFJFTU9URSBRVUVSWSAgICAgICAlLTE0cyVzXG4iLAorCQl4bm0oZW5fcXVlKSwKKwkJIkdldCB2YWx1ZSBvZiBzZXJ2ZXIgdmFyaWFibGUgb3IgbWFjcm8uIgorCQkpOworCisjZWxzZQorCXNwcmludGYoKGNoYXIgKilmdW5jYnVmLCIgUkVNT1RFIFFVRVJZICAgICAgIG5vdCBjb25maWd1cmVkXG4iKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisJYnJlYWs7CisgICAgICBjYXNlIDEyOgorCXNwcmludGYoKGNoYXIgKilmdW5jYnVmLCIgUkVNT1RFIE1LRElSICAgICAgICUtMTRzJXNcbiIsCisJCXhubShlbl9ta2QpLAorCQkiQ3JlYXRlIGEgZGlyZWN0b3J5IG9uIHRoZSBzZXJ2ZXIuIgorCQkpOworCWJyZWFrOworCisgICAgICBjYXNlIDEzOgorCXNwcmludGYoKGNoYXIgKilmdW5jYnVmLCIgUkVNT1RFIFJNRElSICAgICAgICUtMTRzJXNcbiIsCisJCXhubShlbl9ybWQpLAorCQkiUmVtb3ZlIGEgZGlyZWN0b3J5IG9uIHRoZSBzZXJ2ZXIuIgorCQkpOworCWJyZWFrOworCisgICAgICBjYXNlIDE0OgorCXNwcmludGYoKGNoYXIgKilmdW5jYnVmLCIgUkVNT1RFIFJFTkFNRSAgICAgICUtMTRzJXNcbiIsCisJCXhubShlbl9yZW4pLAorCQkiUmVuYW1lIGEgZmlsZSBvbiB0aGUgc2VydmVyLiIKKwkJKTsKKwlicmVhazsKKworICAgICAgY2FzZSAxNToKKwlzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwiIFJFTU9URSBTRVQgICAgICAgICAlLTE0cyVzXG4iLAorCQl4bm0oZW5fc2V0KSwKKwkJIlNldCBhIHBhcmFtZXRlciBvbiB0aGUgc2VydmVyIgorCQkpOworCWJyZWFrOworCisgICAgICBjYXNlIDE2OgorCXNwcmludGYoKGNoYXIgKilmdW5jYnVmLCIgUkVNT1RFIFNQQUNFICAgICAgICUtMTRzJXNcbiIsCisJCXhubShlbl9zcGEpLAorCQkiSW5xdWlyZSBhYm91dCBkaXNrIHNwYWNlIG9uIHRoZSBzZXJ2ZXIuIgorCQkpOworCWJyZWFrOworCisgICAgICBjYXNlIDE3OgorCXNwcmludGYoKGNoYXIgKilmdW5jYnVmLCIgUkVNT1RFIFRZUEUgICAgICAgICUtMTRzJXNcbiIsCisJCXhubShlbl90eXApLAorCQkiRGlzcGxheSBhIHNlcnZlciBmaWxlIG9uIHlvdXIgc2NyZWVuLiIKKwkJKTsKKwlicmVhazsKKworICAgICAgY2FzZSAxODoKKwlzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwiIFJFTU9URSBXSE8gICAgICAgICAlLTE0cyVzXG4iLAorCQl4bm0oaW5zZXJ2ZXIgPyAwIDogZW5fd2hvKSwKKwkJIkxpc3Qgd2hvIGlzIGxvZ2dlZCBpbiB0byB0aGUgc2VydmVyLiIKKwkJKTsKKwlicmVhazsKKworICAgICAgY2FzZSAxOToKKwlzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwiIEZJTklTSCAgICAgICAgICAgICAlLTE0cyVzXG4iLAorCQl4bm0oZW5fZmluKSwKKwkJeGZpbmlzaCA/CisJCSJFeGl0IGZyb20gS2VybWl0IHNlcnZlciBwcm9ncmFtLiIgOgorCQkiUmV0dXJuIHRoZSBzZXJ2ZXIgdG8gaXRzIGNvbW1hbmQgcHJvbXB0LiIKKwkJKTsKKwlicmVhazsKKworICAgICAgY2FzZSAyMDoKKwlzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwiIEJZRSAgICAgICAgICAgICAgICAlLTE0cyVzXG5cbiIsCisJCXhubShlbl9ieWUpLAorCQkiTG9nIHRoZSBzZXJ2ZXIgb3V0IGFuZCBkaXNjb25uZWN0LiIKKwkJKTsKKwlicmVhazsKKworICAgICAgZGVmYXVsdDoKKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICBmdW5jbnh0ID0gMDsKKyAgICBmdW5jbGVuID0gc3RybGVuKChjaGFyICopZnVuY2J1Zik7CisgICAgcmV0dXJuKGZ1bmNidWZbZnVuY254dCsrXSk7Cit9CisKK2ludAorc25kaGxwKCkgeworI2lmbmRlZiBOT1NFUlZFUgorICAgIGV4dGVybiBjaGFyICogY2t4c3lzOworCisgICAgZmlyc3QgPSAxOwkJCQkvKiBJbml0IGdldGNoeCBsb29rYWhlYWQgKi8KKyAgICBuZmlscyA9IDA7CQkJCS8qIE5vIGZpbGVzLCBubyBsaXN0cy4gKi8KKyAgICB4ZmxnID0gMTsJCQkJLyogRmxhZyB3ZSBtdXN0IHNlbmQgWCBwYWNrZXQuICovCisgICAgY2tzdHJuY3B5KGNtZHN0ciwiUkVNT1RFIEhFTFAiLENNRFNUUkwpOyAvKiBEYXRhIGZvciBYIHBhY2tldC4gKi8KKyAgICBzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwgIkMtS2VybWl0ICVzLCVzXG5cbiIsIHZlcnNpbywgY2t4c3lzKTsKKyAgICBmdW5jbGVuID0gc3RybGVuKChjaGFyICopZnVuY2J1Zik7CisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlcikgeworCXNwcmludGYoKGNoYXIgKikoZnVuY2J1ZitmdW5jbGVuKSwKKwkJIkludGVybmV0IEtlcm1pdCBTZXJ2aWNlIChFWFBFUklNRU5UQUwpXG5cbiIpOworCWZ1bmNsZW4gPSBzdHJsZW4oKGNoYXIgKilmdW5jYnVmKTsKKyAgICB9CisjZW5kaWYgLyogSUtTRCAqLworICAgIGZ1bmNueHQgPSAwOworICAgIGZ1bmNwdHIgPSBueHRobHA7CisgICAgZnVuY3N0ciA9IDE7CisgICAgc3J2aGxwbnVtID0gMDsKKyAgICBiaW5hcnkgPSBYWUZUX1Q7CQkJLyogVGV4dCBtb2RlIGZvciB0aGlzLiAqLworICAgIHJldHVybihzaW5pdCgpKTsKKyNlbHNlCisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIE5PU0VSVkVSICovCit9CisKKy8qCisgICBSZXR1cm5zIHRoZSBuZXh0IGF2YWlsYWJsZSBjaGFyYWN0ZXIsCisgIC0xIGlmIG5vIG1vcmUgZGF0YS4KKyovCitzdGF0aWMgaW50CitueHR0eXBlKAorI2lmZGVmIENLX0FOU0lDCisgICAgICAgdm9pZAorI2VuZGlmIC8qIENLX0FOU0lDICovCisJKSB7CisgICAgaW50IGM7CisgICAgaWYgKHpjaGluKFpJRklMRSwmYykgPCAwKSB7CisgICAgICAgIHpjbG9zZShaSUZJTEUpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0gZWxzZSB7CisJcmV0dXJuKCh1bnNpZ25lZCljKTsKKyAgICB9Cit9CisKKy8qICBTIE4gRCBUIFkgUCAtLSBUWVBFIGEgZmlsZSB0byByZW1vdGUgY2xpZW50ICovCisKK2ludAorc25kdHlwZShmaWxlKSBjaGFyICogZmlsZTsgeworI2lmbmRlZiBOT1NFUlZFUgorICAgIGNoYXIgbmFtZVtDS01BWFBBVEgrMV07CisKKyNpZmRlZiBPUzIKKyAgICBjaGFyICogcCA9IE5VTEw7CisKKyAgICBpZiAoKmZpbGUpIHsKKyAgICAgICAgY2tzdHJuY3B5KG5hbWUsIGZpbGUsIENLTUFYUEFUSCsxKTsKKyAgICAgICAgLyogY2hhbmdlIC8gdG8gXC4gKi8KKyAgICAgICAgcCA9IG5hbWU7CisgICAgICAgIHdoaWxlICgqcCkgewkJCS8qIENoYW5nZSB0aGVtIGJhY2sgdG8gXCAqLworICAgICAgICAgICAgaWYgKCpwID09ICcvJykgKnAgPSAnXFwnOworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICByZXR1cm4oMCk7CisjZWxzZQorICAgIGNrc3RybmNweShuYW1lLCBmaWxlLCBDS01BWFBBVEgrMSk7CisjZW5kaWYgLyogT1MyICovCisKKyAgICBmdW5jbnh0ID0gMDsKKyAgICBmdW5jbGVuID0gc3RybGVuKChjaGFyICopZnVuY2J1Zik7CisgICAgaWYgKHpjaGtpKG5hbWUpID09IC0yKSB7CisgICAgICAgIC8qIEZvdW5kIGEgZGlyZWN0b3J5ICovCisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgaWYgKCF6b3BlbmkoWklGSUxFLG5hbWUpKQorICAgICAgcmV0dXJuKDApOworCisgICAgbmZpbHMgPSAwOwkJCQkvKiBObyBmaWxlcywgbm8gbGlzdHMuICovCisgICAgeGZsZyA9IDE7CQkJCS8qIEZsYWcgd2UgbXVzdCBzZW5kIFggcGFja2V0LiAqLworICAgIGNrc3RybmNweShjbWRzdHIsInR5cGUiLENNRFNUUkwpOwkvKiBEYXRhIGZvciBYIHBhY2tldC4gKi8KKyAgICBmaXJzdCA9IDE7CQkJCS8qIEluaXQgZ2V0Y2h4IGxvb2thaGVhZCAqLworICAgIGZ1bmNzdHIgPSAxOwkJCS8qIEp1c3Qgc2V0IHRoZSBmbGFnLiAqLworICAgIGZ1bmNwdHIgPSBueHR0eXBlOwkJCS8qIEFuZCB0aGUgcG9pbnRlci4gKi8KKyAgICBiaW5hcnkgPSBYWUZUX1Q7CQkJLyogVGV4dCBtb2RlIGZvciB0aGlzICovCisgICAgcmV0dXJuKHNpbml0KCkpOworI2Vsc2UKKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KK30KKworLyoKKyAgIE4gWCBUIEQgSSBSICAtLSAgUHJvdmlkZSBkYXRhIGZvciBzZW5kZGlyKCkKKworICAgUmV0dXJucyB0aGUgbmV4dCBhdmFpbGFibGUgY2hhcmFjdGVyIG9yIC0xIGlmIG5vIG1vcmUgZGF0YS4KKyovCisjaWZuZGVmIE5PSUNQCisvKiBEaXJlY3RvcnkgbGlzdGluZyBwYXJhbWV0ZXJzIHNldCBieSB0aGUgdXNlciBpbnRlcmZhY2UsIGlmIGFueS4gKi8KK2V4dGVybiBpbnQgZGlyX2hlYWQsIGRpcl9kb3RzLCBkaXJfYmFjazsKKyNlbmRpZiAvKiBOT0lDUCAqLworc3RhdGljIGludCBzZF9oZGcsIHNkX2JrcCwgc2RfZG90OwkvKiBMb2NhbCBsaXN0aW5nIHBhcmFtZXRlcnMgKi8KKworc3RhdGljIGludAorbnh0ZGlyKAorI2lmZGVmIENLX0FOU0lDCisgICAgICAgdm9pZAorI2VuZGlmIC8qIENLX0FOU0lDICovCisgICAgICAgKSB7CisgICAgY2hhciBuYW1lW0NLTUFYUEFUSCsxXSwgZGJ1ZlsyNF0sICpwID0gTlVMTDsKKyAgICBjaGFyICpkc3RyID0gTlVMTCwgKiBsbmsgPSAiIjsKKyAgICBDSEFSIGMsICogbGluZWJ1ZiA9IGZ1bmNidWY7CisjaWZkZWYgT1NLCisgICAgLyogV29yayBhcm91bmQgYnVncyBpbiBPU0sgY29tcGlsZXIgKi8KKyAgICBjaGFyICpkaXJ0YWcgPSAiZGlyZWN0b3JpZXMiOworICAgIGNoYXIgKmZpbGV0YWcgPSAiZmlsZXMiOworICAgIGNoYXIgKmJ5dGV0YWcgPSAiYnl0ZXMiOworI2VuZGlmIC8qIE9TSyAqLworICAgIGxvbmcgbGVuID0gMDsKKyAgICBpbnQgeCwgaXRzYWRpciA9IDAsIGdvdG9uZSA9IDA7CisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKwlkZWJ1ZyhGMTAxLCJueHRkaXIgZnVuY254dCIsIiIsZnVuY254dCk7CisJZGVidWcoRjEwMSwibnh0ZGlyIGZ1bmNsZW4iLCIiLGZ1bmNsZW4pOworCWRlYnVnKEYxMTAsIm54dGRpciBmdW5jYnVmIixmdW5jYnVmK2Z1bmNueHQsMCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgaWYgKGZ1bmNueHQgPCBmdW5jbGVuKSB7CQkvKiBSZXR1cm4gbmV4dCBjaGFyYWN0ZXIgZnJvbSBidWZmZXIgKi8KKwljID0gZnVuY2J1ZltmdW5jbnh0KytdOworCWRlYnVnKEYwMDAsIm54dGRpciByZXR1cm4gMSIsIiIsKHVuc2lnbmVkKShjICYgMHhmZikpOworCXJldHVybigodW5zaWduZWQpKGMgJiAweGZmKSk7CisgICAgfQorICAgIHdoaWxlIChueHBuZCA+IDApIHsJCQkvKiBCdWZmZXIgbmVlZHMgcmVmaWxsICovCisgICAgICAgIG54cG5kLS07CisJem5leHQobmFtZSk7CQkJLyogR2V0IG5leHQgZmlsZW5hbWUgKi8KKyAgICAgICAgaWYgKCFuYW1lWzBdKSB7CQkJLyogTm9uZSBsZWZ0IC0gZG9uZSAqLworICAgICAgICAgICAgbnhwbmQgPSAwOworICAgICAgICAgICAgcmV0dXJuKG54dGRpcigpKTsKKyAgICAgICAgfQorCWlmIChzZF9ia3ApIHsJCQkvKiBTaG93aW5nIGJhY2t1cCBmaWxlcz8gKi8KKwkgICAgZ290b25lID0gMTsJCQkvKiBZZXMsIG5vIG5lZWQgdG8gY2hlY2suICovCisJICAgIGJyZWFrOworCX0KKwl4ID0gY2ttYXRjaCgJCQkvKiBObyAtIHNlZSBpZiB0aGlzIGlzIG9uZSAqLworI2lmZGVmIENLUkVHRVgKKwkJICAgICIqLn5bMC05XSp+IgkvKiBOb3QgcGVyZmVjdCBidXQgY2xvc2UgZW5vdWdoLiAqLworI2Vsc2UKKwkJICAgICIqLn4qfiIJCS8qIExlc3MgY2xvc2UuICovCisjZW5kaWYgLyogQ0tSRUdFWCAqLworCQkgICAgLG5hbWUsZmlsZWNhc2UsMSk7CisJZGVidWcoRjExMSwibnh0ZGlyIGNrbWF0Y2giLG5hbWUseCk7CisJaWYgKHgpIHsKKwkgICAgY29udGludWU7CQkJLyogSXQncyBhIGJhY2t1cCBmaWxlIC0gc2tpcCBpdCAqLworCX0gZWxzZSB7CisJICAgIGdvdG9uZSA9IDE7CQkJLyogSXQncyBub3QsIGJyZWFrIGZyb20gbG9vcC4gKi8KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAoZ290b25lKSB7CisgICAgICAgIGxlbiA9IHpnZXRmcyhuYW1lKTsJCS8qIEdldCBmaWxlIHNpemUgKi8KKwlkZWJ1ZyhGMTExLCJueHRkaXIgemdldGZzIixuYW1lLGxlbik7CisjaWZkZWYgVk1TT1JVTklYCisJaXRzYWRpciA9IHpnZnNfZGlyOwkJLyogU2VlIGlmIGl0J3MgYSBkaXJlY3RvcnkgKi8KKyNlbHNlCisJaXRzYWRpciA9IChsZW4gPT0gLTIgfHwgaXNkaXIobmFtZSkpOworI2VuZGlmIC8qIFZNU09SVU5JWCAqLworICAgICAgICBkc3RyID0gemZjZGF0KG5hbWUpOworCWRlYnVnKEYxMTEsIm54dGRpciB6Y2ZkYXQiLGRzdHIsMCk7CisJaWYgKCFkc3RyKQorCSAgZHN0ciA9ICIwMDAwLTAwLTAwIDAwOjAwOjAwIjsKKwlpZiAoISpkc3RyKSB7CisJICBkc3RyID0gIjAwMDAtMDAtMDAgMDA6MDA6MDAiOworCX0gZWxzZSB7CisJICAgIGRidWZbMF0gPSBkc3RyWzBdOworCSAgICBkYnVmWzFdID0gZHN0clsxXTsKKwkgICAgZGJ1ZlsyXSA9IGRzdHJbMl07CisJICAgIGRidWZbM10gPSBkc3RyWzNdOworCSAgICBkYnVmWzRdID0gJy0nOworCSAgICBkYnVmWzVdID0gZHN0cls0XTsKKwkgICAgZGJ1Zls2XSA9IGRzdHJbNV07CisJICAgIGRidWZbN10gPSAnLSc7CisJICAgIGRidWZbOF0gPSBkc3RyWzZdOworCSAgICBkYnVmWzldID0gZHN0cls3XTsKKwkgICAgc3RyY3B5KGRidWYrMTAsZHN0cis4KTsKKwkgICAgZHN0ciA9IGRidWY7CisJfQorI2lmZGVmIENLX1BFUk1TCisjaWZkZWYgVk1TT1JVTklYCisJcCA9IHppcGVybShuYW1lKTsJCS8qIEdldCBwZXJtaXNzaW9ucyAqLworI2Vsc2UKKwlwID0gemdwZXJtKG5hbWUpOworI2VuZGlmIC8qIFZNU09SVU5JWCAqLworI2Vsc2UKKwlwID0gTlVMTDsKKyNlbmRpZiAvKiBDS19QRVJNUyAqLworCWRlYnVnKEYxMTAsImRvbXlkaXIgcGVybXMiLHAsMCk7CisKKyNpZmRlZiBWTVMKKwkvKiBNYWtlIG5hbWUgcmVsYXRpdmUgKi8KKwlja3N0cm5jcHkobmFtZSx6cmVsbmFtZShuYW1lLHpndGRpcigpKSxDS01BWFBBVEgrMSk7CisjZW5kaWYgLyogVk1TICovCisKKwlpZiAoaXRzYWRpcikgeworCSAgICBuZGlycysrOworCX0gZWxzZSB7CisJICAgIG5maWxlcysrOworCSAgICBuYnl0ZXMgKz0gbGVuOworCX0KKwlsbmsgPSAiIjsKKyNpZmRlZiBVTklYCisjaWZkZWYgQ0tTWU1MSU5LCisJaWYgKHpnZnNfbGluaykgeworCSAgICBleHRlcm4gY2hhciBsaW5rbmFtZVtdOworCSAgICBsbmsgPSBsaW5rbmFtZTsKKwl9CisJZGVidWcoRjExMSwibnh0ZGlyIGxpbmtuYW1lIixsbmssemdmc19saW5rKTsKKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKyNlbmRpZiAvKiBVTklYICovCisKKy8qCisgIFRoZSBmb2xsb3dpbmcgc3ByaW50ZidzIGFyZSBzYWZlOyBsaW5lYnVmIGlzIGEgcG9pbnRlciB0byBmdW5jYnVmLAorICB3aGljaCBpcyA2NCBieXRlcyBsYXJnZXIgdGhhbiBDS01BWFBBVEggKG9yIGRvdWJsZSBDS01BWFBBVEggd2hlbgorICBzeW1saW5rcyBhcmUgcG9zc2libGUpLiAgNjQgYWxsb3dzIGZvciB0aGUgZml4ZWQtZmllbGQgcG9ydGlvbnMgb2YKKyAgdGhlIGZpbGUgbGlzdGluZyBsaW5lOiBwZXJtaXNzaW9ucywgc2l6ZSwgYW5kIGRhdGUuICBDS01BWFBBVEggYWxsb3dzCisgIGZvciB0aGUgbG9uZ2VzdCBwb3NzaWJsZSBwYXRobmFtZS4KKyovCisJaWYgKGl0c2FkaXIgJiYgbGVuIDwgMCkgewkvKiBEaXJlY3RvcnkgKi8KKyNpZmRlZiBWTVMKKwkgICAgc3ByaW50ZigoY2hhciAqKWxpbmVidWYsCisJCSAgICAiJS0yMnMlLTEwcyAgJXMgICVzXG4iLHAsIjxESVI+Iixkc3RyLG5hbWUpOworI2Vsc2UKKwkgICAgaWYgKHApCisJICAgICAgc3ByaW50ZigoY2hhciAqKWxpbmVidWYsCisJCSAgICAgICIlMTBzJS0xMHMgICVzICAlc1xuIixwLCI8RElSPiIsZHN0cixuYW1lKTsKKwkgICAgZWxzZQorCSAgICAgIHNwcmludGYoKGNoYXIgKilsaW5lYnVmLAorCQkgICAgICAiJS0xMHMgICVzICAlc1xuIiwgIjxESVI+IiwgZHN0ciwgbmFtZSk7CisjZW5kaWYgLyogVk1TICovCisJfSBlbHNlIHsJCQkvKiBSZWd1bGFyIGZpbGUgKi8KKyNpZmRlZiBWTVMKKwkgICAgc3ByaW50ZigoY2hhciAqKWxpbmVidWYsCisJCSAgICAiJS0yMnMlMTBsZCAgJXMgICVzXG4iLCBwLCBsZW4sIGRzdHIsIG5hbWUpOworI2Vsc2UKKwkgICAgaWYgKHApCisJICAgICAgc3ByaW50ZigoY2hhciAqKWxpbmVidWYsCisJCSAgICAgICIlMTBzJTEwbGQgICVzICAlcyVzJXNcbiIsCisJCSAgICAgIHAsIGxlbiwgZHN0ciwgbmFtZSwKKwkJICAgICAgKmxuayA/ICIgLT4gIiA6ICIiLAorCQkgICAgICBsbmsKKwkJICAgICAgKTsKKwkgICAgZWxzZQorCSAgICAgIHNwcmludGYoKGNoYXIgKilsaW5lYnVmLAorCQkgICAgICAiJTEwbGQgICVzICAlcyVzJXNcbiIsCisJCSAgICAgIGxlbiwgZHN0ciwgbmFtZSwKKwkJICAgICAgKmxuayA/ICIgLT4gIiA6ICIiLAorCQkgICAgICBsbmsKKwkJICAgICAgKTsKKyNlbmRpZiAvKiBWTVMgKi8KKwl9CisgICAgICAgIGZ1bmNueHQgPSAwOworICAgICAgICBmdW5jbGVuID0gc3RybGVuKChjaGFyICopZnVuY2J1Zik7CisgICAgfSBlbHNlIGlmIChzZF9oZGcgJiYgbnhwbmQgPT0gMCkgewkvKiBEb25lLCBzZW5kIHN1bW1hcnkgKi8KKwljaGFyICpibGFua2xpbmUgPSAiIjsJCS8qIEF0IGJlZ2lubmluZyBvZiBzdW1tYXJ5ICovCisvKgorICBUaGUgaWRlYSBpcyB0byBwcmV2ZW50IChhKSB1bm5lY2Vzc2FyeSBtdWx0aXBsZSBibGFua2xpbmVzLCBhbmQgKGIpCisgIHByb21wdC1zdG9tcGluZy4gIFByZXZlbnRpbmcgKGIpIGlzIHByYWN0aWNhbGx5IGltcG9zc2libGUsIGJlY2F1c2UgaXQKKyAgZGVwZW5kcyBvbiB0aGUgY2xpZW50IHNvIGZvciBub3cgYWx3YXlzIGluY2x1ZGUgdGhhdCBmaW5hbCBDUkxGLgorKi8KKwlpZiAoIW5kaXJzIHx8ICFuYnl0ZXMgfHwgIW5maWxlcykKKwkgIGJsYW5rbGluZSA9IGVuZGxpbmU7CisjaWZkZWYgT1NLCisvKiBXb3JrYXJvdW5kIGJ1Z3MgaW4gT1MtOSBjb21waWxlci4uLiAqLworICAgICAgICBpZiAobmRpcnMgPT0gMSkKKyAgICAgICAgICAgZGlydGFnID0gImRpcmVjdG9yeSI7CisgICAgICAgIGlmIChuZmlsZXMgPT0gMSkKKyAgICAgICAgICAgZmlsZXRhZyA9ICJmaWxlIjsKKyAgICAgICAgaWYgKG5ieXRlcyA9PSAxKQorICAgICAgICAgICBieXRldGFnID0gImJ5dGUiOworICAgICAgICBzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwKKyAgICAgICAgICAgIiVzU3VtbWFyeTogJWxkICVzLCAlbGQgJXMsICVsZCAlcyVzIiwKKyAgICAgICAgICAgYmxhbmtsaW5lLAorICAgICAgICAgICBuZGlycywKKyAgICAgICAgICAgZGlydGFnLAorICAgICAgICAgICBuZmlsZXMsCisgICAgICAgICAgIGZpbGV0YWcsCisgICAgICAgICAgIG5ieXRlcywKKyAgICAgICAgICAgYnl0ZXRhZywKKyAgICAgICAgICAgZW5kbGluZSk7CisjZWxzZQorICAgICAgICBzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwKKwkJIiVzU3VtbWFyeTogJWxkIGRpcmVjdG9yJXMsICVsZCBmaWxlJXMsICVsZCBieXRlJXMlcyIsCisJCWJsYW5rbGluZSwKKwkJbmRpcnMsCisJCShuZGlycyA9PSAxKSA/ICJ5IiA6ICJpZXMiLAorCQluZmlsZXMsCisJCShuZmlsZXMgPT0gMSkgPyAiIiA6ICJzIiwKKwkJbmJ5dGVzLAorCQkobmJ5dGVzID09IDEpID8gIiIgOiAicyIsCisJCWVuZGxpbmUKKwkJKTsKKyNlbmRpZiAvKiBPU0sgKi8KKyAgICAgICAgbnhwbmQtLTsKKyAgICAgICAgZnVuY254dCA9IDA7CisgICAgICAgIGZ1bmNsZW4gPSBzdHJsZW4oKGNoYXIgKilmdW5jYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmdW5jYnVmWzBdID0gJ1wwJzsKKyAgICAgICAgZnVuY254dCA9IDA7CisgICAgICAgIGZ1bmNsZW4gPSAwOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJueHRkaXIgZnVuY2xlbiIsIiIsZnVuY2xlbik7CisKKyAgICBpZiAoZnVuY254dCA8IGZ1bmNsZW4pIHsJCS8qIElmIHdlIGhhdmUgZGF0YSB0byBzZW5kLi4uICovCisJYyA9IGZ1bmNidWZbZnVuY254dCsrXTsKKwlkZWJ1ZyhGMDAwLCJueHRkaXIgcmV0dXJuIDIiLCIiLCh1bnNpZ25lZCkoYyAmIDB4ZmYpKTsKKwlyZXR1cm4oKHVuc2lnbmVkKShjICYgMHhmZikpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuKC0xKTsJCQkvKiBOb3RoaW5nIGxlZnQsIGRvbmUuICovCit9CisKKy8qICBTIE4gRCBEIEkgUiAtLSBzZW5kIGRpcmVjdG9yeSBsaXN0aW5nICAqLworCitpbnQKK3NuZGRpcihzcGVjKSBjaGFyICogc3BlYzsgeworI2lmbmRlZiBOT1NFUlZFUgorICAgIGNoYXIgKiBwID0gTlVMTCwgbmFtZVtDS01BWFBBVEgrMV07CisgICAgaW50IHQgPSAwLCByYyA9IDA7CisgICAgY2hhciBmbmJ1ZltDS01BWFBBVEgrMV07CisKKyAgICBkZWJ1ZyhGMTExLCJzbmRkaXIgbWF0Y2hkb3QiLHNwZWMsbWF0Y2hkb3QpOworCisjaWZuZGVmIE5PSUNQCisgICAgZGVidWcoRjExMSwic25kZGlyIGRpcl9kb3RzIixzcGVjLGRpcl9kb3RzKTsKKyAgICBzZF9oZGcgPSBkaXJfaGVhZCA+IDA7CQkvKiBJbXBvcnQgbGlzdGluZyBwYXJhbWV0ZXJzIGlmIGFueSAqLworICAgIHNkX2JrcCA9IGRpcl9iYWNrID4gMDsKKyAgICBpZiAoZGlyX2RvdHMgPiAtMSkKKyAgICAgIHNkX2RvdCA9IGRpcl9kb3RzOworICAgIGVsc2UKKyAgICAgIHNkX2RvdCA9IG1hdGNoZG90OworI2Vsc2UKKyAgICBzZF9oZGcgPSAxOwkJCQkvKiBPciB1c2UgaGFyZHdpcmVkIGRlZmF1bHRzICovCisgICAgc2RfYmtwID0gMTsKKyAgICBzZF9kb3QgPSBtYXRjaGRvdDsKKyNlbmRpZiAvKiBOT0lDUCAqLworCisgICAgaWYgKCFzcGVjKSBzcGVjID0gIiI7CisgICAgZGVidWcoRjExMSwic25kZGlyIHNkX2RvdCIsc3BlYyxzZF9kb3QpOworICAgIGlmICgqc3BlYykgeworI2lmZGVmIENPTU1FTlQKKwl6Zm5xZnAoc3BlYyxDS01BWFBBVEgsbmFtZSk7CisJZGVidWcoRjExMCwic25kZGlyIHpmbnFmcCIsbmFtZSwwKTsKKyNlbHNlCisJY2tzdHJuY3B5KG5hbWUsc3BlYyxDS01BWFBBVEgrMSk7CisJZGVidWcoRjExMCwic25kZGlyIG5hbWUiLG5hbWUsMCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIH0gZWxzZSB7CisjaWZkZWYgT1MyCisJc3RyY3B5KG5hbWUsICIqIik7CisjZWxzZQorI2lmZGVmIFVOSVhPUk9TSworCXN0cmNweShuYW1lLCAiLi8qIik7CisjZWxzZQorI2lmZGVmIFZNUworCXN0cmNweShuYW1lLCAiKi4qIik7CisjZWxzZQorI2lmZGVmIGRhdGFnZW5lcmFsCisJc3RyY3B5KG5hbWUsICIrIik7CisjZWxzZQorCWRlYnVnKEYxMDEsInNuZGRpciBxdWl0IChubyBmaWxlc3BlYykiLCIiLDApOworCXJldHVybigwKTsKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB9CisgICAgZGVidWcoRjExMCwic25kZGlyIG5hbWUgMSIsbmFtZSwwKTsKKyAgICBuZGlycyA9IDBMOworICAgIG5maWxlcyA9IDBMOworICAgIG5ieXRlcyA9IDBMOworCisgICAgaWYgKHpmbnFmcChuYW1lLENLTUFYUEFUSCxmbmJ1ZikpCisKKyAgICBkZWJ1ZyhGMTEwLCJzbmRkaXIgbmFtZSAyIixuYW1lLDApOworICAgIHAgPSBuYW1lICsgc3RybGVuKG5hbWUpOwkJLyogTW92ZSBpdCB0byBlbmQgb2YgbGlzdCAqLworCisgICAgLyogc3ByaW50ZiBzYWZlIGJlY2F1c2UgZnVuY2J1ZiBzaXplID49IG1heCBwYXRoIGxlbiArIDY0ICovCisKKyAgICBpZiAoc2RfaGRnKSB7CisJc3ByaW50ZigoY2hhciAqKWZ1bmNidWYsIkxpc3RpbmcgZmlsZXM6ICVzJXMlcyIsZm5idWYsZW5kbGluZSxlbmRsaW5lKTsKKwlmdW5jbnh0ID0gMDsKKwlmdW5jbGVuID0gc3RybGVuKChjaGFyICopZnVuY2J1Zik7CisgICAgfQorICAgIGRpcmFjdGl2ZSA9IDE7CisKKyNpZmRlZiBPUzIKKyAgICBpZiAoemNoa2kobmFtZSkgPT0gLTIpIHsJCS8qIEZvdW5kIGEgZGlyZWN0b3J5ICovCisgICAgICAgIHAtLTsKKyAgICAgICAgaWYgKCpwID09ICdcXCcgfHwgKnAgPT0gJy8nKQorICAgICAgICAgIGNrc3RybmNhdChuYW1lLCAiKiIsIENLTUFYUEFUSCk7CisgICAgICAgIGVsc2UgaWYgKCpwID09ICc6JykKKyAgICAgICAgICBja3N0cm5jYXQobmFtZSwgIi4iLCBDS01BWFBBVEgpOworICAgICAgICBlbHNlCisgICAgICAgICAgY2tzdHJuY2F0KG5hbWUsICJcXCoiLCBDS01BWFBBVEgpOworCWRlYnVnKEYxMTAsInNuZGRpciBkaXJlY3RvcnkiLG5hbWUsMCk7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoIWlzd2lsZChuYW1lKSAmJiBpc2RpcihuYW1lKSkgeworCWNoYXIgKiBzID0gbmFtZTsKKwlwLS07CisjaWZkZWYgVU5JWE9ST1NLCisJaWYgKCpwID09ICcvJykJCQkvKiBTbyBhcHBlbmQgd2lsZGNhcmQgdG8gaXQgKi8KKwkgIGNrc3RybmNhdChzLCAiKiIsIENLTUFYUEFUSCk7CisJZWxzZQorCSAgY2tzdHJuY2F0KHMsICIvKiIsIENLTUFYUEFUSCk7CisjZWxzZQorI2lmZGVmIFZNUworCWlmICgqcCA9PSAnXScgfHwgKnAgPT0gJz4nIHx8ICpwID09ICc6JykKKwkgIGNrc3RybmNhdChzLCAiKi4qIiwgQ0tNQVhQQVRIKTsKKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKwlpZiAoKnAgPT0gJzonKQorCSAgY2tzdHJuY2F0KHMsICIrIiwgQ0tNQVhQQVRIKTsKKwllbHNlCisJICBja3N0cm5jYXQocywgIjorIiwgQ0tNQVhQQVRIKTsKKyNlbHNlCisjaWZkZWYgVk9TCisJaWYgKCpwID09ICc+JykKKwkgIGNrc3RybmNhdChzLCAiKiIsIENLTUFYUEFUSCk7CisJZWxzZQorCSAgY2tzdHJuY2F0KHMsICI+KiIsIENLTUFYUEFUSCk7CisjZW5kaWYgLyogVk9TICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKwlkZWJ1ZyhGMTEwLCJzbmRkaXIgZGlyZWN0b3J5IixuYW1lLDApOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIG56eG9wdHMgPSAwOworI2lmZGVmIFVOSVgKKyAgICB7CisJZXh0ZXJuIGNoYXIgKiogbXRjaHM7CisJZGVidWcoRjExMSwic25kZGlyIHNkX2RvdCIsc3BlYyxzZF9kb3QpOworCWlmIChzZF9kb3QgPiAwKQorCSAgbnp4b3B0cyB8PSBaWF9NQVRDSERPVDsKKwlpZiAocmVjdXJzaXZlKQorCSAgbnp4b3B0cyB8PSBaWF9SRUNVUlNFOworCWRlYnVnKEYxMTEsInNuZGRpciBuenhvcHRzIixzcGVjLG56eG9wdHMpOworCW54cG5kID0gbnp4cGFuZChuYW1lLG56eG9wdHMpOwkvKiBHZXQgdGhlIGFycmF5IG9mIG5hbWVzICovCisJc2hfc29ydChtdGNocyxOVUxMLG54cG5kLDAsMCwxKTsgLyogU29ydCB0aGUgYXJyYXkgKi8KKyAgICB9CisjZWxzZQorICAgIGlmIChyZWN1cnNpdmUpIG56eG9wdHMgfD0gWlhfUkVDVVJTRTsKKyAgICBueHBuZCA9IG56eHBhbmQobmFtZSxuenhvcHRzKTsKKyNlbmRpZiAvKiBVTklYICovCisKKyAgICBkZWJ1ZyhGMTAxLCJzbmRkaXIgbnp4cGFuZCBueHBuZCIsIiIsbnhwbmQpOworICAgIGlmIChueHBuZCA8IDEpCisgICAgICByZXR1cm4oLTEpOworICAgIG5maWxzID0gMDsJCQkJLyogTm8gZmlsZXMsIG5vIGxpc3RzLiAqLworICAgIHhmbGcgPSAxOwkJCQkvKiBGbGFnIHdlIG11c3Qgc2VuZCBYIHBhY2tldC4gKi8KKyAgICBpZiAoKGludClzdHJsZW4obmFtZSkgPCBDTURTVFJMIC0gMTEpIC8qIERhdGEgZm9yIFggcGFja2V0LiAqLworICAgICAgc3ByaW50ZihjbWRzdHIsIkRJUkVDVE9SWSAlcyIsbmFtZSk7IC8qIHNhZmUgKi8KKyAgICBlbHNlCisgICAgICBja3N0cm5jcHkoY21kc3RyLCJESVJFQ1RPUlkiLENNRFNUUkwpOworICAgIGZpcnN0ID0gMTsJCQkJLyogSW5pdCBnZXRjaHggbG9va2FoZWFkICovCisgICAgZnVuY3N0ciA9IDE7CQkJLyogSnVzdCBzZXQgdGhlIGZsYWcuICovCisgICAgZnVuY3B0ciA9IG54dGRpcjsJCQkvKiBBbmQgdGhlIHBvaW50ZXIuICovCisgICAgcmMgPSBzaW5pdCgpOworICAgIGRlYnVnKEYxMTEsInNuZGRpciIsInNpbml0KCkiLHJjKTsKKyAgICByZXR1cm4ocmMpOworI2Vsc2UKKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KK30KKworLyogIE4gWCBUIEQgRSBMIC0tIHByb3ZpZGUgZGF0YSBmb3IgZGVsZXRlICAgKi8KKworLyogIFJldHVybnMgdGhlIG5leHQgYXZhaWxhYmxlIGNoYXJhY3RlciBvciAtMSBpZiBubyBtb3JlIGRhdGEgICovCisKK3N0YXRpYyBpbnQKK254dGRlbCgKKyNpZmRlZiBDS19BTlNJQworICAgICAgIHZvaWQKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworICAgICAgICkgeworICAgIGNoYXIgbmFtZVsyNTddLCAqcCA9IE5VTEw7CisgICAgaW50IGxlbiA9IDA7CisKKyAgICBpZiAoZnVuY254dCA8IGZ1bmNsZW4pCisgICAgICByZXR1cm4gKCh1bnNpZ25lZClmdW5jYnVmW2Z1bmNueHQrK10pOworCisgICAgaWYgKG54cG5kID4gMCkgeworICAgICAgICBueHBuZC0tOworCXpuZXh0KG5hbWUpOworICAgICAgICBpZiAoIW5hbWVbMF0pIHsKKyAgICAgICAgICAgIG54cG5kID0gMDsKKyAgICAgICAgICAgIHJldHVybihueHRkZWwoKSk7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gemNoa2kobmFtZSk7CisKKyAgICAgICAgLyogRmluZCBqdXN0IHRoZSBuYW1lIG9mIHRoZSBmaWxlICovCisKKyAgICAgICAgZm9yIChwID0gbmFtZSArIHN0cmxlbihuYW1lKTsgcCAhPSBuYW1lICYmICpwICE9ICcvJyA7IHAtLSkgOworICAgICAgICBpZiAoKnAgPT0gJy8nKSBwKys7CisKKwkvKiBzcHJpbnRmJ3Mgc2FmZSBiZWNhdXNlIHNpemUgb2YgZnVuY2J1ZiA+PSA2NCArIG1heHBhdGhsZW4gKi8KKworICAgICAgICBpZiAobGVuID4gLTFMKSB7CisJICAgIGlmICh6ZGVsZXQobmFtZSkpIHsKKwkJc3ByaW50ZigoY2hhciAqKWZ1bmNidWYsIiAlMTBzOiAlcyVzIiwic2tpcHBpbmciLHAsZW5kbGluZSk7CisJICAgIH0gZWxzZSB7CisJCW5maWxlcysrOworCQluYnl0ZXMgKz0gbGVuOworCQlzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwiICUxMHM6ICVzJXMiLCJkZWxldGVkIixwLGVuZGxpbmUpOworCSAgICB9CisgICAgICAgIH0gZWxzZQorCSAgc3ByaW50ZigoY2hhciAqKWZ1bmNidWYsIiBkaXJlY3Rvcnk6ICVzJXMiLCBwLCBlbmRsaW5lKTsKKyAgICAgICAgZnVuY254dCA9IDA7CisgICAgICAgIGZ1bmNsZW4gPSBzdHJsZW4oKGNoYXIgKilmdW5jYnVmKTsKKyAgICB9IGVsc2UKKworICAgIC8qIElmIGRvbmUgcHJvY2Vzc2luZyB0aGUgZXhwYW5kZWQgZW50cmllcyBzZW5kIGEgc3VtbWFyeSBzdGF0ZW1lbnQgKi8KKworICAgICAgaWYgKG54cG5kID09IDApIHsKKwkgIHNwcmludGYoKGNoYXIgKilmdW5jYnVmLAorCQkgICIlcyVsZCBmaWxlJXMgZGVsZXRlZCwgJWxkIGJ5dGUlcyBmcmVlZCVzIiwKKwkJICBlbmRsaW5lLAorCQkgIG5maWxlcywKKwkJICAobmZpbGVzID09IDEpID8gIiIgOiAicyIsCisJCSAgbmJ5dGVzLAorCQkgIChuYnl0ZXMgPT0gMSkgPyAiIiA6ICJzIiwKKwkJICBlbmRsaW5lCisJCSAgKTsKKwkgIG54cG5kLS07CisJICBmdW5jbnh0ID0gMDsKKwkgIGZ1bmNsZW4gPSBzdHJsZW4oKGNoYXIgKilmdW5jYnVmKTsKKyAgICAgIH0gZWxzZSB7CisJICBmdW5jYnVmWzBdID0gJ1wwJzsKKwkgIGZ1bmNueHQgPSAwOworCSAgZnVuY2xlbiA9IDA7CisgICAgICB9CisKKyAgICAvKiBJZiB3ZSBoYXZlIGRhdGEgdG8gc2VuZCAqLworCisgICAgaWYgKGZ1bmNueHQgPCBmdW5jbGVuKQorICAgICAgcmV0dXJuICgodW5zaWduZWQpZnVuY2J1ZltmdW5jbnh0KytdKTsgLyogUmV0dXJuIGEgY2hhcmFjdGVyICovCisgICAgZWxzZQorICAgICAgcmV0dXJuKC0xKTsJCQkvKiBObyBtb3JlIGlucHV0ICovCit9CisKKy8qICBTIE4gRCBEIEUgTCAgLS0gIFNlbmQgZGVsZXRlIG1lc3NhZ2UgICovCisKK2ludAorc25kZGVsKHNwZWMpIGNoYXIgKiBzcGVjOyB7CisjaWZuZGVmIE5PU0VSVkVSCisgICAgY2hhciBuYW1lW0NLTUFYUEFUSCsxXTsKKyNpZmRlZiBPUzIKKyAgICBjaGFyICogcCA9IE5VTEw7CisjZW5kaWYgLyogI2lmZGVmIE9TMiAqLworCisgICAgaWYgKCEqc3BlYykKKyAgICAgIHJldHVybigwKTsKKworICAgIGNrc3RybmNweShuYW1lLCBzcGVjLCBDS01BWFBBVEgrMSk7CisKKyNpZmRlZiBPUzIKKyAgICAvKiBjaGFuZ2UgLyB0byBcLiAqLworICAgIHAgPSBuYW1lOworICAgIHdoaWxlICgqcCkgewkJCS8qIENoYW5nZSB0aGVtIGJhY2sgdG8gXCAqLworICAgICAgICBpZiAoKnAgPT0gJy8nKSAqcCA9ICdcXCc7CisgICAgICAgIHArKzsKKyAgICB9CisjZW5kaWYgLyogT1MyICovCisKKyAgICBuZmlsZXMgPSBuYnl0ZXMgPSAwTDsKKyAgICBzcHJpbnRmKChjaGFyICopZnVuY2J1ZiwiRGVsZXRpbmcgXCIlc1wiJXMiLG5hbWUsZW5kbGluZSk7CisgICAgZnVuY254dCA9IDA7CisgICAgZnVuY2xlbiA9IHN0cmxlbigoY2hhciAqKWZ1bmNidWYpOworCisgICAgbnp4b3B0cyA9IFpYX0ZJTE9OTFk7CQkvKiBGaWxlcyBvbmx5ICovCisjaWZkZWYgVU5JWE9ST1NLCisgICAgaWYgKG1hdGNoZG90KSBuenhvcHRzIHw9IFpYX01BVENIRE9UOworI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworI2lmZGVmIENPTU1FTlQKKyAgICAvKiBSZWN1cnNpdmUgZGVsZXRpbmcgbm90IHN1cHBvcnRlZCB5ZXQgKi8KKyAgICBpZiAocmVjdXJzaXZlKSBuenhvcHRzIHw9IFpYX1JFQ1VSU0U7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIG54cG5kID0gbnp4cGFuZChuYW1lLG56eG9wdHMpOworICAgIGlmIChueHBuZCA8IDEpCisgICAgICByZXR1cm4oLTEpOworICAgIG5maWxzID0gMDsJCQkJLyogTm8gZmlsZXMsIG5vIGxpc3RzLiAqLworICAgIHhmbGcgPSAxOwkJCQkvKiBGbGFnIHdlIG11c3Qgc2VuZCBYIHBhY2tldC4gKi8KKyAgICBja3N0cm5jcHkoY21kc3RyLCJSRU1PVEUgREVMRVRFIixDTURTVFJMKTsgLyogRGF0YSBmb3IgWCBwYWNrZXQuICovCisgICAgZmlyc3QgPSAxOwkJCQkvKiBJbml0IGdldGNoeCBsb29rYWhlYWQgKi8KKyAgICBmdW5jc3RyID0gMTsJCQkvKiBKdXN0IHNldCB0aGUgZmxhZy4gKi8KKyAgICBmdW5jcHRyID0gbnh0ZGVsOwkJCS8qIEFuZCB0aGUgcG9pbnRlci4gKi8KKyAgICBiaW5hcnkgPSBYWUZUX1Q7CQkJLyogVXNlIHRleHQgbW9kZSBmb3IgdGhpcywgKi8KKyAgICByZXR1cm4oc2luaXQoKSk7CisjZWxzZQorICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCisjaWZkZWYgT1MyCisvKiAgUyBOIEQgUyBQIEEgQyBFIC0tIHNlbmQgZGlzayBzcGFjZSBtZXNzYWdlICAqLworaW50CitzbmRzcGFjZShkcml2ZSkgaW50IGRyaXZlOyB7CisjaWZuZGVmIE5PU0VSVkVSCisgICAgc3RhdGljIGNoYXIgc3BjdGV4dFs2NF07CisgICAgdW5zaWduZWQgbG9uZyBzcGFjZTsKKworICAgIGlmIChkcml2ZSkgeworCXNwYWNlID0gemRza3NwYWNlKGRyaXZlIC0gJ0EnICsgMSk7CisJaWYgKHNwYWNlID4gMCAmJiBzcGFjZSA8IDEwMjQpCisJICBzcHJpbnRmKHNwY3RleHQsCisJCSAgIiBEcml2ZSAlYzogdW5rbm93biVzIiwKKwkJICBkcml2ZSwKKwkJICBlbmRsaW5lCisJCSAgKTsKKwllbHNlCisJICBzcHJpbnRmKHNwY3RleHQsCisJCSAgIiBEcml2ZSAlYzogJWxkSyBmcmVlJXMiLAorCQkgIGRyaXZlLAorCQkgIHNwYWNlIC8gMTAyNEwsCisJCSAgZW5kbGluZQorCQkgICk7CisgICAgfSBlbHNlIHsKKwlzcGFjZSA9IHpkc2tzcGFjZSgwKTsKKwlpZiAoc3BhY2UgPiAwICYmIHNwYWNlIDwgMTAyNCkKKwkgIHNwcmludGYoc3BjdGV4dCwgIiBGcmVlIHNwYWNlOiB1bmtub3duJXMiLCBlbmRsaW5lKTsKKwllbHNlCisJICBzcHJpbnRmKHNwY3RleHQsICIgRnJlZSBzcGFjZTogJWxkSyVzIiwgc3BhY2UgLyAxMDI0TCwgZW5kbGluZSk7CisgICAgfQorICAgIG5maWxzID0gMDsJCQkJLyogTm8gZmlsZXMsIG5vIGxpc3RzLiAqLworICAgIHhmbGcgPSAxOwkJCQkvKiBGbGFnIHdlIG11c3Qgc2VuZCBYIHBhY2tldC4gKi8KKyAgICBja3N0cm5jcHkoY21kc3RyLCJmcmVlIHNwYWNlIixDTURTVFJMKTsgLyogRGF0YSBmb3IgWCBwYWNrZXQuICovCisgICAgZmlyc3QgPSAxOwkJCQkvKiBJbml0IGdldGNoeCBsb29rYWhlYWQgKi8KKyAgICBtZW1zdHIgPSAxOwkJCQkvKiBKdXN0IHNldCB0aGUgZmxhZy4gKi8KKyAgICBtZW1wdHIgPSBzcGN0ZXh0OwkJCS8qIEFuZCB0aGUgcG9pbnRlci4gKi8KKyAgICBiaW5hcnkgPSBYWUZUX1Q7CQkJLyogVGV4dCBtb2RlIGZvciB0aGlzLiAqLworICAgIHJldHVybihzaW5pdCgpKTsKKyNlbHNlCisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIE5PU0VSVkVSICovCit9CisKKy8qICBTIE4gRCBXIEggTyAtLSBzZW5kIHdobyBtZXNzYWdlICAqLworaW50CitzbmR3aG8od2hvKSBjaGFyICogd2hvOyB7CisjaWZuZGVmIE5PU0VSVkVSCisgICAgbmZpbHMgPSAwOwkJCQkvKiBObyBmaWxlcywgbm8gbGlzdHMuICovCisgICAgeGZsZyA9IDE7CQkJCS8qIEZsYWcgd2UgbXVzdCBzZW5kIFggcGFja2V0LiAqLworICAgIGNrc3RybmNweShjbWRzdHIsIndobyIsQ01EU1RSTCk7CS8qIERhdGEgZm9yIFggcGFja2V0LiAqLworICAgIGZpcnN0ID0gMTsJCQkJLyogSW5pdCBnZXRjaHggbG9va2FoZWFkICovCisgICAgbWVtc3RyID0gMTsJCQkJLyogSnVzdCBzZXQgdGhlIGZsYWcuICovCisjaWZkZWYgTlQKKyAgICBtZW1wdHIgPSAiXDE1XDEySzk1IFNFUlZFUlwxNVwxMiI7CS8qIEFuZCB0aGUgcG9pbnRlci4gKi8KKyNlbHNlCisgICAgbWVtcHRyID0gIlwxNVwxMksvMiBTRVJWRVJcMTVcMTIiOworI2VuZGlmIC8qIE5UICovCisgICAgYmluYXJ5ID0gWFlGVF9UOwkJCS8qIFVzZSB0ZXh0IG1vZGUgKi8KKyAgICByZXR1cm4oc2luaXQoKSk7CisjZWxzZQorICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorI2VuZGlmIC8qIE9TMiAqLworCisvKiAgQyBXIEQgIC0tICBDaGFuZ2Ugc2VydmVyJ3Mgd29ya2luZyBkaXJlY3RvcnkgICovCisKKy8qCisgU3RyaW5nIHBhc3NlZCBoYXMgZmlyc3QgYnl0ZSBhcyBsZW5ndGggb2YgZGlyZWN0b3J5IG5hbWUsIHJlc3Qgb2Ygc3RyaW5nCisgaXMgbmFtZS4gIFJldHVybnM6CisgIDAgb24gZmFpbHVyZS4KKyAgMSBvbiBzdWNjZXNzIGFmdGVyIHNlbmRpbmcgc2hvcnQtZm9ybSByZXNwb25zZSAoQUNLIHdpdGggbmFtZSkuCisgIDIgb24gc3VjY2VzcyBpZiBhIENEIE1lc3NhZ2UgZmlsZSBpcyB0byBiZSBzZW50LgorKi8KK2ludAorY3dkKHZkaXIpIGNoYXIgKnZkaXI7IHsKKyAgICBjaGFyICpjZGQsICpkaXJwOworCisgICAgdmRpclt4dW5jaGFyKCp2ZGlyKSArIDFdID0gJ1wwJzsJLyogVGVybWluYXRlIHN0cmluZyB3aXRoIGEgbnVsbCAqLworICAgIGRpcnAgPSB2ZGlyKzE7CisgICAgdGxvZyhGMTEwLCJEaXJlY3RvcnkgcmVxdWVzdGVkOiAiLGRpcnAsMEwpOworICAgIGlmICh6Y2hkaXIoZGlycCkpIHsJCQkvKiBUcnkgdG8gY2hhbmdlICovCisJY2RkID0gemd0ZGlyKCk7CQkJLyogR2V0IG5ldyB3b3JraW5nIGRpcmVjdG9yeS4gKi8KKwlkZWJ1ZyhGMTEwLCJjd2QiLGNkZCwwKTsKKwlpZiAoc3J2Y2Rtc2cpIHsJCQkvKiBTZW5kIG9yaWVudGF0aW9uIGZpbGU/ICovCisJICAgIGludCBpOworCSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmICh6Y2hraShjZG1zZ2ZpbGVbaV0pID4gLTEpIHsKKwkJICAgIHh4c2NyZWVuKFNDUl9DRCwwLDBsLGNkZCk7CisJCSAgICB0bG9nKEYxMTAsIkNoYW5nZWQgZGlyZWN0b3J5IHRvIixjZGQsMEwpOworCQkgICAgcmV0dXJuKDIpOworCQl9CisJICAgIH0KKwl9CisJZW5jc3RyKChDSEFSICopY2RkKTsJCS8qIFNlbmQgc2hvcnQtZm9ybSByZXBseSAqLworCWFjazEoZGF0YSk7CQkJLyogY29udGFpbmluZyBkaXJlY3RvcnkgbmFtZS4gKi8KKwl4eHNjcmVlbihTQ1JfQ0QsMCwwbCxjZGQpOworCXRsb2coRjExMCwiQ2hhbmdlZCBkaXJlY3RvcnkgdG8iLGNkZCwwTCk7CisJcmV0dXJuKDEpOworICAgIH0gZWxzZSB7CisJZGVidWcoRjExMCwiY3dkIGZhaWxlZCIsZGlycCwwKTsKKwl0bG9nKEYxMTAsIkZhaWxlZCB0byBjaGFuZ2UgZGlyZWN0b3J5IHRvIixkaXJwLDBMKTsKKwlyZXR1cm4oMCk7CisgICAgfQorfQorCisKKy8qICBTIFkgUyBDIE0gRCAgLS0gIERvIGEgc3lzdGVtIGNvbW1hbmQgICovCisKKy8qICBDb21tYW5kIHN0cmluZyBpcyBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgdHdvIGFyZ3VtZW50cy4gICovCisKK2ludAorc3lzY21kKHByZWZpeCxzdWZmaXgpIGNoYXIgKnByZWZpeCwgKnN1ZmZpeDsgeworICAgIGV4dGVybiBpbnQgaV9pc29wZW47CisjaWZuZGVmIE5PUFVTSAorICAgIGNoYXIgKmNwOworCisgICAgaV9pc29wZW4gPSAwOworICAgIGlmICghcHJlZml4KQorICAgICAgcmV0dXJuKDApOworICAgIGlmICghKnByZWZpeCkKKyAgICAgIHJldHVybigwKTsKKyAgICBmb3IgKGNwID0gY21kc3RyOyAqcHJlZml4ICE9ICdcMCc7ICgqY3ArKyA9ICpwcmVmaXgrKykpOworICAgIHdoaWxlICgoKmNwKysgPSAqc3VmZml4KyspKQorI2lmZGVmIE9TMgorICAgICAgICAvKiBUaGlzIHRha2VzIGF3YXkgbW9yZSB0aGFuIHdlIGdhaW4gaW4gY29udmVuaWVuY2UKKyAgICAgICAgaWYgKCooY3AtMSkgPT0gJy8nKSAqKGNwLTEpID0gJ1xcJyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgOwkJCQkJLyogQ29weSBzdWZmaXggKi8KKworICAgIGRlYnVnKEYxMTAsInN5c2NtZCIsY21kc3RyLDApOworCisgICAgaWYgKHp4Y21kKFpJRklMRSxjbWRzdHIpID4gMCkgeworICAgIAlkZWJ1ZyhGMTEwLCJzeXNjbWQgenhjbWQgb2siLGNtZHN0ciwwKTsKKwluZmlscyA9IHNuZHNyYyA9IDA7CQkvKiBGbGFnIHRoYXQgaW5wdXQgaXMgZnJvbSBzdGRpbiAqLworICAgIAl4ZmxnID0gaGNmbGcgPSAxOwkJLyogQW5kIHNwZWNpYWwgZmxhZ3MgZm9yIHBpcGUgKi8KKwliaW5hcnkgPSBYWUZUX1Q7CQkvKiBHbyB0byB0ZXh0IG1vZGUgKi8KKwlpX2lzb3BlbiA9IDE7CisgICAgCXJldHVybiAoc2luaXQoKSk7CQkvKiBTZW5kIFMgcGFja2V0ICovCisgICAgfSBlbHNlIHsKKyAgICAJZGVidWcoRjEwMCwic3lzY21kIHp4Y21kIGZhaWxlZCIsY21kc3RyLDApOworCWlfaXNvcGVuID0gMDsKKyAgICAJcmV0dXJuKDApOworICAgIH0KKyNlbHNlCisgICAgZGVidWcoRjEwMCwic3lzY21kIHp4Y21kIE5PUFVTSCIsY21kc3RyLDApOworICAgIGlfaXNvcGVuID0gMDsKKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogTk9QVVNIICovCit9CisKKy8qICBSIEUgTSBTIEUgVCAgLS0gIFJlbW90ZSBTZXQgICovCisvKiAgQ2FsbGVkIGJ5IHNlcnZlciB0byBzZXQgdmFyaWFibGVzIGFzIGNvbW1hbmRlZCBpbiBSRU1PVEUgU0VUIHBhY2tldHMuICAqLworLyogIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUuICAqLworCitpbnQKK3JlbXNldChzKSBjaGFyICpzOyB7CisgICAgZXh0ZXJuIGludCBjX3NhdmUsIGVuX2RlbDsKKyAgICBpbnQgbGVuLCBpLCB4LCB5OworICAgIGNoYXIgKnA7CisKKyAgICBsZW4gPSB4dW5jaGFyKCpzKyspOwkJLyogTGVuZ3RoIG9mIGZpcnN0IGZpZWxkICovCisgICAgcCA9IHMgKyBsZW47CQkJLyogUG9pbnRlciB0byBzZWNvbmQgbGVuZ3RoIGZpZWxkICovCisgICAgKnArKyA9ICdcMCc7CQkJLyogWmVybyBvdXQgc2Vjb25kIGxlbmd0aCBmaWVsZCAqLworICAgIHggPSBhdG9pKHMpOwkJCS8qIFZhbHVlIG9mIGZpcnN0IGZpZWxkICovCisgICAgZGVidWcoRjExMSwicmVtc2V0IixzLHgpOworICAgIGRlYnVnKEYxMTAsInJlbXNldCIscCwwKTsKKyAgICBzd2l0Y2ggKHgpIHsJCQkvKiBEbyB0aGUgcmlnaHQgdGhpbmcgKi8KKyAgICAgIGNhc2UgMTMyOgkJCQkvKiBBdHRyaWJ1dGVzIChhbGwsIGluKSAqLworCWF0Y2FwciA9IGF0b2kocCk7CisJcmV0dXJuKDEpOworICAgICAgY2FzZSAxMzM6CQkJCS8qIEZpbGUgbGVuZ3RoIGF0dHJpYnV0ZXMgKi8KKyAgICAgIGNhc2UgMjMzOgkJCQkvKiBJTi9PVVQgY29tYmluZWQgKi8KKyAgICAgIGNhc2UgMTQ4OgkJCQkvKiBCb3RoIGtpbmRzIG9mIGxlbmd0aHMgKi8KKyAgICAgIGNhc2UgMjQ4OgorCWF0bGVuaSA9IGF0bGVubyA9IGF0b2kocCk7CisJcmV0dXJuKDEpOworICAgICAgY2FzZSAxMzQ6CQkJCS8qIEZpbGUgVHlwZSAodGV4dC9iaW5hcnkpICovCisgICAgICBjYXNlIDIzNDoKKwlhdHR5cGkgPSBhdHR5cG8gPSBhdG9pKHApOworCXJldHVybigxKTsKKyAgICAgIGNhc2UgMTM1OgkJCQkvKiBGaWxlIGNyZWF0aW9uIGRhdGUgKi8KKyAgICAgIGNhc2UgMjM1OgorCWF0ZGF0aSA9IGF0ZGF0byA9IGF0b2kocCk7CisJcmV0dXJuKDEpOworICAgICAgY2FzZSAxMzk6CQkJCS8qIEZpbGUgQmxvY2tzaXplICovCisgICAgICBjYXNlIDIzOToKKwlhdGJsa2kgPSBhdGJsa28gPSBhdG9pKHApOworCXJldHVybigxKTsKKyAgICAgIGNhc2UgMTQxOgkJCQkvKiBFbmNvZGluZyAvIENoYXJhY3RlciBTZXQgKi8KKyAgICAgIGNhc2UgMjQxOgorCWF0ZW5jaSA9IGF0ZW5jbyA9IGF0b2kocCk7CisJcmV0dXJuKDEpOworICAgICAgY2FzZSAxNDI6CQkJCS8qIERpc3Bvc2l0aW9uICovCisgICAgICBjYXNlIDI0MjoKKwlhdGRpc2kgPSBhdGRpc28gPSBhdG9pKHApOworCXJldHVybigxKTsKKyAgICAgIGNhc2UgMTQ1OgkJCQkvKiBTeXN0ZW0gSUQgKi8KKyAgICAgIGNhc2UgMjQ1OgorCWF0c2lkaSA9IGF0c2lkbyA9IGF0b2kocCk7CisJcmV0dXJuKDEpOworICAgICAgY2FzZSAxNDc6CQkJCS8qIFN5c3RlbS1EZXBlbmRlbnQgSW5mbyAqLworICAgICAgY2FzZSAyNDc6CisJYXRzeXNpID0gYXRzeXNvID0gYXRvaShwKTsKKwlyZXR1cm4oMSk7CisgICAgICBjYXNlIDIzMjoJCQkJLyogQXR0cmlidXRlcyAoYWxsLCBvdXQpICovCisJYXRjYXByID0gYXRvaShwKTsKKwlyZXR1cm4oMSk7CisgICAgICBjYXNlIDMwMDoJCQkJLyogRmlsZSB0eXBlICh0ZXh0LCBiaW5hcnkpICovCisJYmluYXJ5ID0gYXRvaShwKTsKKwliX3NhdmUgPSBiaW5hcnk7CisjaWZuZGVmIE5PSUNQCisJZ19iaW5hcnkgPSAtMTsKKyNlbmRpZiAvKiBOT0lDUCAqLworCXJldHVybigxKTsKKyAgICAgIGNhc2UgMzAxOgkJCQkvKiBGaWxlIG5hbWUgY29udmVyc2lvbiAqLworCWZuY252ID0gMSAtIGF0b2kocCk7CQkvKiAob29wcykgKi8KKwlmX3NhdmUgPSBmbmNudjsKKyNpZm5kZWYgTk9JQ1AKKwlnX2ZuY252ID0gLTE7CisjZW5kaWYgLyogTk9JQ1AgKi8KKwlyZXR1cm4oMSk7CisgICAgICBjYXNlIDMwMjoJCQkJLyogRmlsZSBuYW1lIGNvbGxpc2lvbiAqLworI2lmZGVmIElLU0QKKyNpZmRlZiBDS19MT0dJTgorCWlmIChpbnNlcnZlciAmJiBpc2d1ZXN0KQkvKiBNYXkgbm90IGJlIGNoYW5nZWQgYnkgZ3Vlc3QgKi8KKwkgIHJldHVybigwKTsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2VuZGlmIC8qIElLU0QgKi8KKwl4ID0gYXRvaShwKTsKKwlpZiAoIUVOQUJMRUQoZW5fZGVsKSAmJiAoeCA9PSBYWUZYX1ggfHwgeCA9PSBYWUZYX1UpKQorCSAgcmV0dXJuKDApOworCWlmICh4ID09IFhZRlhfUikgY2t3YXJuID0gMTsJLyogUmVuYW1lICovCisJaWYgKHggPT0gWFlGWF9YKSBja3dhcm4gPSAwOwkvKiBSZXBsYWNlICovCisJZm5jYWN0ID0geDsKKwlyZXR1cm4oMSk7CisgICAgICBjYXNlIDMxMDoJCQkJLyogSW5jb21wbGV0ZSBGaWxlIERpc3Bvc2l0aW9uICovCisJa2VlcCA9IGF0b2kocCk7CQkJLyogS2VlcCwgRGlzY2FyZCwgQXV0byAqLworCXJldHVybigxKTsKKyAgICAgIGNhc2UgMzExOgkJCQkvKiBCbG9ja3NpemUgKi8KKwlmYmxrc2l6ID0gYXRvaShwKTsKKwlyZXR1cm4oMSk7CisgICAgICBjYXNlIDMxMjoJCQkJLyogUmVjb3JkIExlbmd0aCAqLworCWZyZWNsID0gYXRvaShwKTsKKwlyZXR1cm4oMSk7CisgICAgICBjYXNlIDMxMzoJCQkJLyogUmVjb3JkIGZvcm1hdCAqLworCWZyZWNmbSA9IGF0b2kocCk7CisJcmV0dXJuKDEpOworICAgICAgY2FzZSAzMTQ6CQkJCS8qIEZpbGUgb3JnYW5pemF0aW9uICovCisJZm9yZyA9IGF0b2kocCk7CisJcmV0dXJuKDEpOworICAgICAgY2FzZSAzMTU6CQkJCS8qIEZpbGUgY2FycmlhZ2UgY29udHJvbCAqLworCWZjY3RybCA9IGF0b2kocCk7CisJcmV0dXJuKDEpOworICAgICAgY2FzZSAzMzA6CQkJCS8qIE1hdGNoIGRvdGZpbGVzICovCisjaWZuZGVmIE5PSUNQCisJZGlyX2RvdHMgPSAtMTsJCQkvKiBUaGlzIHVuZG9lcyBESVIgL0RPVCBvcHRpb24gKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworCW1hdGNoZG90ID0gYXRvaShwKTsKKwlyZXR1cm4oMSk7CisgICAgICBjYXNlIDMzMToJCQkJLyogTWF0Y2ggRklGT3MgKi8KKwltYXRjaGZpZm8gPSBhdG9pKHApOworCXJldHVybigxKTsKKyAgICAgIGNhc2UgNDAwOgkJCQkvKiBCbG9jayBjaGVjayAqLworCXkgPSBhdG9pKHApOworCWlmICh5IDwgNSAmJiB5ID4gMCkgeworCSAgICBiY3RyID0geTsKKwkgICAgY19zYXZlID0gLTE7CisJICAgIHJldHVybigxKTsKKwl9IGVsc2UgaWYgKCpwID09ICdCJykgeworCSAgICBiY3RyID0gNDsKKwkgICAgY19zYXZlID0gLTE7CisJICAgIHJldHVybigxKTsKKwl9CisJcmV0dXJuKDApOworICAgICAgY2FzZSA0MDE6CQkJCS8qIFJlY2VpdmUgcGFja2V0LWxlbmd0aCAqLworCXJwc2l6ID0gdXJwc2l6ID0gYXRvaShwKTsKKwlpZiAodXJwc2l6ID4gTUFYUlApIHVycHNpeiA9IE1BWFJQOyAvKiBNYXggbG9uZy1wYWNrZXQgbGVuZ3RoICovCisJaWYgKHJwc2l6ID4gOTQpIHJwc2l6ID0gOTQ7CSAgICAvKiBNYXggc2hvcnQtcGFja2V0IGxlbmd0aCAqLworCXVycHNpeiA9IGFkanBrbCh1cnBzaXosd3Nsb3RzLGJpZ3Jic2l6KTsKKwlyZXR1cm4oMSk7CisgICAgICBjYXNlIDQwMjoJCQkJLyogUmVjZWl2ZSB0aW1lb3V0ICovCisJeSA9IGF0b2kocCk7CQkJLyogQ2xpZW50IGlzIHRlbGxpbmcgdXMgKi8KKwlpZiAoeSA+IC0xICYmIHkgPCA5OTkpIHsJLyogdGhlIHRpbWVvdXQgdGhhdCBpdCB3YW50cyAqLworCSAgICBwa3R0aW0gPSBjaGt0aW1vKHksdGltZWYpOwkvKiB1cyB0byB0ZWxsIGl0IHRvIHVzZS4gKi8KKwkgICAgcmV0dXJuKDEpOworCX0gZWxzZSByZXR1cm4oMCk7CisgICAgICBjYXNlIDQwMzoJCQkJLyogUmV0cnkgbGltaXQgKi8KKwl5ID0gYXRvaShwKTsKKwlpZiAoeSA+IC0xICYmIHkgPCA5NSkgeworCSAgICBtYXh0cnkgPSB5OworCSAgICByZXR1cm4oMSk7CisJfSBlbHNlIHJldHVybigwKTsKKyAgICAgIGNhc2UgNDA0OgkJCQkvKiBTZXJ2ZXIgdGltZW91dCAqLworCXkgPSBhdG9pKHApOworCWlmICh5IDwgMCkgcmV0dXJuKDApOworCXNydnRpbSA9IHk7CisJcmV0dXJuKDEpOworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgIGNhc2UgNDA1OiB7CQkJCS8qIFRyYW5zZmVyIGNoYXJhY3RlciBzZXQgKi8KKwkgIGV4dGVybiBpbnQgc19jc2V0LCBheGNzZXRbXTsKKwkgIGludCBpOworCSAgZm9yIChpID0gMDsgaSA8IG50Y3NldHM7IGkrKykgeworCSAgICAgIGlmICghc3RyY21wKHRjc2luZm9baV0uZGVzaWduYXRvcixwKSkgYnJlYWs7CisJICB9CisJICBkZWJ1ZyhGMTAxLCJyZW1zZXQgdGNoYXJzZXQgbG9va3VwIiwiIixpKTsKKwkgIGlmIChpID09IG50Y3NldHMpIHJldHVybigwKTsKKwkgIHRjaGFyc2V0ID0gdGNzaW5mb1tpXS5jb2RlOwkvKiBJZiBrbm93biwgdXNlIGl0ICovCisJICBkZWJ1ZyhGMTAxLCJyZW1zZXQgdGNoYXJzZXQiLCIiLHRjaGFyc2V0KTsKKwkgIGlmIChzX2NzZXQgPT0gWE1PREVfQSkKKwkgICAgaWYgKGF4Y3NldFt0Y2hhcnNldF0gPiAtMSAmJiBheGNzZXRbdGNoYXJzZXRdID4gTUFYRkNTRVRTKQorCSAgICAgIGZjaGFyc2V0ID0gYXhjc2V0W3RjaGFyc2V0XTsgLyogQXV0by1waWNrIGZpbGUgY2hhcnNldCAqLworCSAgZGVidWcoRjEwMSwicmVtc2V0IHRjaGFyc2V0IGZjaGFyc2V0IiwiIixmY2hhcnNldCk7CisJICBzZXR4bGF0eXBlKHRjaGFyc2V0LGZjaGFyc2V0KTsgLyogU2V0IHVwIGNoYXJzZXQgdHJhbnNsYXRpb25zICovCisJICBkZWJ1ZyhGMTAxLCJyZW1zZXQgeGxhdHlwZSIsIiIseGxhdHlwZSk7CisJICBkZWJ1ZyhGMTAxLCJyZW1zZXQgdGNoYXJzZXQgYWZ0ZXIgc2V0eGxhdHlwZSIsIiIsdGNoYXJzZXQpOworCSAgdGNzX3NhdmUgPSAtMTsKKwkgIHJldHVybigxKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgMzIwOiB7CQkJLyogRmlsZSBjaGFyYWN0ZXIgc2V0ICovCisJICBleHRlcm4gc3RydWN0IGtleXRhYiBmY3N0YWJbXTsKKwkgIGV4dGVybiBpbnQgbmZpbGMsIHNfY3NldCwgcl9jc2V0OworCSAgeCA9IGxvb2t1cChmY3N0YWIscCxuZmlsYywmeSk7CisJICBkZWJ1ZyhGMTExLCJSU0VUIEZJTEUgQ0hBUiBuYW1lIixwLHgpOworCSAgaWYgKHggPCAwKQorCSAgICByZXR1cm4oMCk7CisJICBzX2NzZXQgPSBYTU9ERV9NOwkJLyogTm8gYXV0b21hdGljIGNoYXJzZXQgc3dpdGNoaW5nICovCisJICByX2NzZXQgPSBYTU9ERV9NOworCSAgZmNoYXJzZXQgPSB4OwkJCS8qIFNldCBmaWxlIGNoYXJzZXQgKi8KKwkgIHNldHhsYXR5cGUodGNoYXJzZXQsZmNoYXJzZXQpOyAvKiBhbmQgdHJhbnNsYXRpb24gdHlwZSAqLworCSAgZmNzX3NhdmUgPSAtMTsKKwkgIHJldHVybigxKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyAgICAgIGNhc2UgNDA2OgkJCQkvKiBXaW5kb3cgc2xvdHMgKi8KKwl5ID0gYXRvaShwKTsKKwlpZiAoeSA9PSAwKSB5ID0gMTsKKwlpZiAoeSA8IDEgfHwgeSA+IE1BWFdTKSByZXR1cm4oMCk7CisJd3Nsb3RyID0geTsKKwlzd2NhcHIgPSAxOworCXVycHNpeiA9IGFkanBrbCh1cnBzaXosd3Nsb3RyLGJpZ3Jic2l6KTsKKwlyZXR1cm4oMSk7CisKKyAgICAgIGNhc2UgNDEwOgkJCQkvKiBUcmFuc2ZlciBtb2RlICovCisJeSA9IGF0b2kocCk7CQkJLyogMCA9IGF1dG9tYXRpYywgbm9uemVybyA9IG1hbnVhbCAqLworCWlmICh5ICE9IDApIHkgPSAxOworCXhmZXJtb2RlID0geTsKKwlkZWJ1ZyhGMTAxLCJSRU1PVEUgU0VUIHhmZXJtb2RlIiwiIix4ZmVybW9kZSk7CisJcmV0dXJuKDEpOworCisgICAgICBjYXNlIDQyMDoJCQkJLyogU0VSVkVSIENELU1FU1NBR0UgeyBPTiwgT0ZGIH0gKi8KKwl5ID0gYXRvaShwKTsJCQkvKiAwID0gYXV0b21hdGljLCBub256ZXJvID0gbWFudWFsICovCisJc3J2Y2Rtc2cgPSB5OworCXJldHVybigxKTsKKworICAgICAgZGVmYXVsdDoJCQkJLyogQW55dGhpbmcgZWxzZS4uLiAqLworCXJldHVybigwKTsKKyAgICB9Cit9CisKKy8qIEFkanVzdCBwYWNrZXQgbGVuZ3RoIGJhc2VkIG9uIG51bWJlciBvZiB3aW5kb3cgc2xvdHMgYW5kIGJ1ZmZlciBzaXplICovCisKK2ludAorYWRqcGtsKHBrdGxlbixzbG90cyxidWZzaXopIGludCBwa3RsZW4sIHNsb3RzLCBidWZzaXo7IHsKKyAgICBpZiAocHJvdG9jb2wgIT0gUFJPVE9fSykgcmV0dXJuKHBrdGxlbik7CisgICAgZGVidWcoRjEwMSwiYWRqcGtsIGxlbiIsIiIscGt0bGVuKTsKKyAgICBkZWJ1ZyhGMTAxLCJhZGpwa2wgc2xvdHMiLCIiLHNsb3RzKTsKKyAgICBkZWJ1ZyhGMTAxLCJhZGpwa2wgYnVmc2l6IiwiIixidWZzaXopOworICAgIGlmICgoKHBrdGxlbiArIDYpICogc2xvdHMpID4gYnVmc2l6KQorICAgICAgcGt0bGVuID0gKGJ1ZnNpeiAvIHNsb3RzKSAtIDY7CisgICAgZGVidWcoRjEwMSwiYWRqcGtsIG5ldyBsZW4iLCIiLHBrdGxlbik7CisgICAgcmV0dXJuKHBrdGxlbik7Cit9CisKKy8qIFNldCB0cmFuc2ZlciBtb2RlIGFuZCBmaWxlIG5hbWluZyBiYXNlZCBvbiBjb21wYXJpc29uIG9mIHN5c3RlbSB0eXBlcyAqLworCisKK1ZPSUQKK3dob2FyZXdlKCkgeworI2lmbmRlZiBOT0lDUAorICAgIGV4dGVybiBpbnQgZ194ZmVybW9kZTsKKyNlbmRpZiAvKiBOT0lDUCAqLworCisgICAgd2VhcmVhbGlrZSA9IDA7CisKKyAgICBkZWJ1ZyhGMTAxLCJ3aG9hcmV3ZSB4ZmVybW9kZSIsIiIseGZlcm1vZGUpOworI2lmbmRlZiBOT0lDUAorICAgIGRlYnVnKEYxMDEsIndob2FyZXdlIGdfeGZlcm1vZGUiLCIiLGdfeGZlcm1vZGUpOworI2VuZGlmIC8qIE5PSUNQICovCisgICAgaWYgKHdob2FyZXVbMF0pIHsJCQkvKiBJZiB3ZSBrbm93IHBhcnRuZXIncyBzeXN0ZW0gdHlwZSAqLworCWNoYXIgKiBwID0gKGNoYXIgKil3aG9hcmV1OworCWRlYnVnKEYxMTAsIndob2FyZXdlIHJlbW90ZSBzeXNpZCIsd2hvYXJldSwwKTsKKwlpZiAoIXN0cmNtcChwLGNrc3lzaWQpKQkJLyogT3RoZXIgc3lzdGVtIHNhbWUgYXMgdXMgKi8KKwkgIHdlYXJlYWxpa2UgPSAxOworCisjaWZkZWYgVU5JWAorCWVsc2UgaWYgKCFzdHJjbXAocCwiTDMiKSkJLyogVU5JWCBpcyBzb3J0IG9mIGxpa2UgQW1pZ2FET1MgKi8KKwkgIHdlYXJlYWxpa2UgPSAxOwkJLyogKHNhbWUgZGlyZWN0b3J5IHNlcGFyYXRvcikgKi8KKwllbHNlIGlmICghc3RyY21wKHAsIk4zIikpCS8qIFVOSVggbGlrZSBBZWdpcyAqLworCSAgd2VhcmVhbGlrZSA9IDE7CisjZWxzZQorI2lmZGVmIEFNSUdBCisvKiBMaWtlIFVOSVgsIGJ1dCBjYXNlIGRpc3RpbmN0aW9ucyBhcmUgaWdub3JlZCBhbmQgY2FuIGJlZ2luIHdpdGggZGV2aWNlOi4gKi8KKwllbHNlIGlmICghc3RyY21wKHAsIlUxIikpCS8qIEFtaWdhIGlzIHNvcnQgb2YgbGlrZSBVTklYICovCisJICB3ZWFyZWFsaWtlID0gMTsKKwllbHNlIGlmICghc3RyY21wKHAsIk4zIikpCS8qIEFtaWdhIGlzIHNvcnQgb2YgbGlrZSBBZWdpcyAqLworCSAgd2VhcmVhbGlrZSA9IDE7CisjZWxzZQorI2lmZGVmIE9TMgkJCQkvKiAoSW5jbHVkZXMgV2luZG93cyA5NS9OVCkgKi8KKworCS8qIERPUywgR0VNRE9TLCBXaW5kb3dzIDMueCwgV2luZG93cyA5NSwgV2luZG93cyBOVCAqLworCS8qIEFsbCAidGhlIHNhbWUiIGZvciBGQVQgcGFydGl0aW9ucyBidXQgYWxsIGJldHMgb2ZmIG90aGVyd2lzZSAqLworCS8qIHNvIHRoaXMgcGFydCBuZWVkcyBzb21lIHJlZmluZW1lbnQgLi4uICAqLworCisJZWxzZSBpZiAoIXN0cmNtcChwLCJVOCIpKQkvKiBNUy1ET1MgKi8KKwkgIHdlYXJlYWxpa2UgPSAxOworCWVsc2UgaWYgKCFzdHJjbXAocCwiVU8iKSkJLyogT1MvMiAqLworCSAgd2VhcmVhbGlrZSA9IDE7CisJZWxzZSBpZiAoIXN0cmNtcChwLCJVTiIpKQkvKiBXaW5kb3dzIE5UIG9yIDk1ICovCisJICB3ZWFyZWFsaWtlID0gMTsKKwllbHNlIGlmICghc3RyY21wKHAsIksyIikpCS8qIEdFTURPUyAqLworCSAgd2VhcmVhbGlrZSA9IDE7CisjZWxzZQorI2lmZGVmIEdFTURPUworCWVsc2UgaWYgKCFzdHJjbXAocCwiVTgiKSkKKwkgIHdlYXJlYWxpa2UgPSAxOworCWVsc2UgaWYgKCFzdHJjbXAocCwiVU8iKSkKKwkgIHdlYXJlYWxpa2UgPSAxOworCWVsc2UgaWYgKCFzdHJjbXAocCwiVU4iKSkKKwkgIHdlYXJlYWxpa2UgPSAxOworCWVsc2UgaWYgKCFzdHJjbXAocCwiSzIiKSkKKwkgIHdlYXJlYWxpa2UgPSAxOworI2VuZGlmIC8qIEdFTURPUyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIEFNSUdBICovCisjZW5kaWYgLyogVU5JWCAqLworCisJLyogR2V0IGhlcmUgd2l0aCB3ZWFyZWFsaWtlID09IDEgaWYgc3lzdGVtIHR5cGVzIG1hdGNoICovCisKKwlkZWJ1ZyhGMTAxLCJ3aG9hcmV3ZSB3ZWFyZWFsaWtlIiwiIix3ZWFyZWFsaWtlKTsKKwlpZiAoIXdlYXJlYWxpa2UpCQkvKiBOb3QgYWxpa2UgKi8KKwkgIHJldHVybjsKKworCWZuY252ID0gWFlGTl9MOwkJCS8qIEFsaWtlLCBzbyBsaXRlcmFsIGZpbGVuYW1lcyAqLworCWRlYnVnKEYxMDEsIndob2FyZXdlIHNldHRpbmcgZm5jbnYiLCIiLGZuY252KTsKKworCWlmICh4ZmVybW9kZSA9PSBYTU9ERV9BKSB7CS8qIEN1cnJlbnQgeGZlciBtb2RlIGlzIGF1dG8gKi8KKyNpZmRlZiBWTVMKKwkgICAgYmluYXJ5ID0gWFlGVF9MOwkJLyogRm9yIFZNUy10by1WTVMsIHVzZSBsYWJlbGVkICovCisjZWxzZQorI2lmZGVmIE9TMgorCSAgICAvKiBPUy8yIGJ1dCBub3QgV2luZG93cyAqLworCSAgICBpZiAoIXN0cmNtcChja3N5c2lkLCJVTyIpICYmICFzdHJjbXAoKGNoYXIgKil3aG9hcmV1LCJVTyIpKQorCSAgICAgIGJpbmFyeSA9IFhZRlRfTDsJCS8qIEZvciBPUy8yLXRvLU9TLzIsIHVzZSBsYWJlbGVkICovCisjZWxzZQorCSAgICBiaW5hcnkgPSBYWUZUX0I7CQkvKiBGb3IgYWxsIG90aGVycyB1c2UgYmluYXJ5ICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVk1TICovCisJICAgIGduZl9iaW5hcnkgPSBiaW5hcnk7CS8qIFByZXZhaWxpbmcgdHlwZSBmb3IgZ25maWxlKCkgKi8KKwkgICAgZGVidWcoRjEwMSwid2hvYXJld2Ugc2V0dGluZyBiaW5hcnkiLCIiLGJpbmFyeSk7CisJfQorICAgIH0KK30KKyNlbmRpZiAvKiBOT1hGRVIgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja2NmdHAuYyBiL2NrZXJtaXQtOC4wLjIxMS9ja2NmdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQ5ZGRkCi0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrY2Z0cC5jCkBAIC0wLDAgKzEsMTcxMjYgQEAKKy8qICBDIEsgQyBGIFQgUCAgLS0gIEZUUCBDbGllbnQgZm9yIEMtS2VybWl0ICAqLworCitjaGFyICpja2Z0cHYgPSAiRlRQIENsaWVudCwgOC4wLjIyNiwgNyBKYW4gMjAwNCI7CisKKy8qCisgIEF1dGhvcnM6CisgICAgSmVmZnJleSBFIEFsdG1hbiA8amFsdG1hbkBzZWN1cmUtZW5kcG9pbnRzLmNvbT4KKyAgICAgIFNlY3VyZSBFbmRwb2ludHMgSW5jLiwgTmV3IFlvcmsgQ2l0eQorICAgIEZyYW5rIGRhIENydXogPGZkY0Bjb2x1bWJpYS5lZHU+LAorICAgICAgVGhlIEtlcm1pdCBQcm9qZWN0LCBDb2x1bWJpYSBVbml2ZXJzaXR5LgorCisgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisKKyAgUG9ydGlvbnMgb2YgY29uZGl0aW9uYWxseSBpbmNsdWRlZCBjb2RlIENvcHlyaWdodCBSZWdlbnRzIG9mIHRoZQorICAgIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhbmQgVGhlIFN0YW5mb3JkIFNSUCBBdXRoZW50aWNhdGlvbiBQcm9qZWN0OworICAgIHNlZSBub3RpY2VzIGJlbG93LgorKi8KKworLyoKKyAgUGVuZGluZy4uLgorCisgIC4gSW1wbGVtZW50IHJlY3Vyc2l2ZSBOTFNUIGRvd25sb2FkcyBieSB0cnlpbmcgdG8gQ0QgdG8gZWFjaCBmaWxlbmFtZS4KKyAgICBJZiBpdCB3b3JrcywgaXQncyBhIGRpcmVjdG9yeTsgaWYgbm90LCBpdCdzIGEgZmlsZSAtLSBHRVQgaXQuICBCdXQKKyAgICB0aGF0IHdvbid0IHdvcmsgd2l0aCBzZXJ2ZXJzIGxpa2Ugd3UtZnRwZCB0aGF0IGRvbid0IHNlbmQgZGlyZWN0b3J5IAorICAgIG5hbWVzLiAgUmVjdXJzaW9uIHdpdGggTUxTRCBpcyBkb25lLgorCisgIC4gTWFrZSBzeXNsb2cgZW50cmllcyBmb3Igc2Vzc2lvbj8gIEZpbGVzPworCisgIC4gTWVzc2FnZXMgYXJlIHByaW50ZWQgdG8gc3Rkb3V0IGFuZCBzdGRlcnIgaW4gcmFuZG9tIGZhc2hpb24uICBXZSBzaG91bGQKKyAgICBlaXRoZXIgcHJpbnQgZXZlcnl0aGluZyB0byBzdGRvdXQsIG9yIGVsc2UgYmUgc3lzdGVtYXRpYyBhYm91dCB3aGVuCisgICAgdG8gdXNlIHN0ZGVyci4KKworICAuIEltcGxlbWVudCBtYWlsIChNQUlMLCBNTEZMLCBNU09NLCBldGMpIGlmIGFueSBzZXJ2ZXJzIHN1cHBvcnQgaXQuCisKKyAgLiBBZGFwdCB0byBWTVMuICBCaWcgam9iIGJlY2F1c2Ugb2YgaXRzIHJlY29yZC1vcmllbnRlZCBmaWxlIHN5c3RlbS4KKyAgICBSTVMgcHJvZ3JhbW1lciByZXF1aXJlZC4gIFRoZXJlIGFyZSBwcm9iYWJseSBhbHNvIHNvbWUgVk1TIFRDUC9JUAorICAgIHByb2R1Y3Qtc3BlY2lmaWMgd3JpbmtsZXMsIGUuZy4gYXR0cmlidXRlIHByZXNlcnZhdGlvbiBpbiBWTVMtdG8tVk1TCisgICAgdHJhbnNmZXJzIHVzaW5nIHNwZWNpYWwgb3B0aW9ucyBmb3IgTXVsdGluZXQgb3Igb3RoZXIgRlRQIHNlcnZlcnMKKyAgICAoZmluZCBvdXQgYWJvdXQgU1RSVSBWTVMpLgorKi8KKworLyoKKyAgUXVpY2sgRlRQIGNvbW1hbmQgcmVmZXJlbmNlOgorCisgIFJGQzc2NSAoMTk4MCkgYW5kIGVhcmxpZXI6CisgICAgTU9ERSAgUyh0cmVhbSksIEIobG9jayksIEMob21wcmVzc2VkKQorICAgIFNUUlUgIEYoSUxFKSwgUihFQ09SRCksIFAoQUdFKQorICAgIFRZUEUgIEEoU0NJSSkgPGZvcm1hdD4sICBFKEJDRElDKSA8Zm9ybWF0PiwgSShNQUdFKSwgTChPQ0FMKSA8Ynl0ZXNpemU+CisgICAgUE9SVCAgLSBQb3J0CisgICAgUEFTViAgLSBQYXNzaXZlIG1vZGUKKyAgICBVU0VSICAtIFVzZXIKKyAgICBQQVNTICAtIFBhc3N3b3JkCisgICAgQUNDVCAgLSBBY2NvdW50CisgICAgQ1dEICAgLSBDaGFuZ2UgV29ya2luZyBEaXJlY3RvcnkKKyAgICBSRUlOICAtIExvZ291dCBidXQgbm90IGRpc2Nvbm5lY3QKKyAgICBRVUlUICAtIEJ5ZQorICAgIFJFVFIgIC0gUmV0cmVpdmUKKyAgICBTVE9SICAtIFN0b3JlCisgICAgQVBQRSAgLSBBcHBlbmQKKyAgICBBTExPICAtIEFsbG9jYXRlCisgICAgUkVTVCAgLSBSZXN0YXJ0CisgICAgUk5GUiAgLSBSZW5hbWUgZnJvbQorICAgIFJOVE8gIC0gUmVuYW1lIHRvCisgICAgQUJPUiAgLSBDYW5jZWwKKyAgICBERUxFICAtIERlbGV0ZQorICAgIExJU1QgIC0gRGlyZWN0b3J5CisgICAgTkxTVCAgLSBOYW1lIExpc3QKKyAgICBTSVRFICAtIFNpdGUgcGFyYW1ldGVycyBvciBjb21tYW5kcworICAgIFNUQVQgIC0gU3RhdHVzCisgICAgSEVMUCAgLSBIZWxwCisgICAgTk9PUCAgLSBOb29wCisKKyAgUkZDOTU5ICgxOTg1KToKKyAgICBDRFVQICAtIENoYW5nZSB0byBQYXJlbnQgRGlyZWN0b3J5CisgICAgU01OVCAgLSBTdHJ1Y3R1cmUgTW91bnQKKyAgICBTVE9VICAtIFN0b3JlIFVuaXF1ZQorICAgIFJNRCAgIC0gUmVtb3ZlIERpcmVjdG9yeQorICAgIE1LRCAgIC0gTWFrZSBEaXJlY3RvcnkKKyAgICBQV0QgICAtIFByaW50IERpcmVjdG9yeQorICAgIFNZU1QgIC0gU3lzdGVtCisKKyAgUkZDMjM4OSAoMTk5OCk6CisgICAgRkVBVCAgLSBMaXN0IEZlYXR1cmVzIChkb25lKQorICAgIE9QVFMgIC0gU2VuZCBvcHRpb25zIChkb25lKQorCisgIFJGQzI2NDAgKDE5OTkpOgorICAgIExBTkcgIC0gU3BlY2lmeSBsYW5ndWFnZSBmb3IgbWVzc2FnZXMgKG5vdCBkb25lKQorCisgIFBlbmRpbmcgKEludGVybmV0IERyYWZ0cyk6CisgICAgU0laRSAgLSBGaWxlIHNpemUgKGRvbmUpCisgICAgTURUTSAgLSBGaWxlIG1vZGlmaWNhdGlvbiBkYXRlLXRpbWUgKGRvbmUpCisgICAgTUxTVCAgLSBGaWxlIG5hbWUgYW5kIGF0dHJpYnV0ZSBsaXN0IChzaW5nbGUgZmlsZSkgKG5vdCBkb25lKQorICAgIE1MU0QgIC0gRmlsZSBsaXN0IHdpdGggYXR0cmlidXRlcyAobXVsdGlwbGUgZmlsZXMpIChkb25lKQorICAgIE1BSUwsIE1MRkwsIE1TT00gLSBtYWlsIGRlbGl2ZXJ5IChub3QgZG9uZSkKKworICBBbHBoYWJldGljYWwgc3ludGF4IGxpc3Q6CisgICAgQUJPUiA8Q1JMRj4KKyAgICBBQ0NUIDxTUD4gPGFjY291bnQtaW5mb3JtYXRpb24+IDxDUkxGPgorICAgIEFMTE8gPFNQPiA8ZGVjaW1hbC1pbnRlZ2VyPiBbPFNQPiBSIDxTUD4gPGRlY2ltYWwtaW50ZWdlcj5dIDxDUkxGPgorICAgIEFQUEUgPFNQPiA8cGF0aG5hbWU+IDxDUkxGPgorICAgIENEVVAgPENSTEY+CisgICAgQ1dEICA8U1A+IDxwYXRobmFtZT4gPENSTEY+CisgICAgREVMRSA8U1A+IDxwYXRobmFtZT4gPENSTEY+CisgICAgRkVBVCA8Q1JMRj4KKyAgICBIRUxQIFs8U1A+IDxzdHJpbmc+XSA8Q1JMRj4KKyAgICBMQU5HIFs8U1A+IDxsYW5ndWFnZS10YWc+IF0gPENSTEY+CisgICAgTElTVCBbPFNQPiA8cGF0aG5hbWU+XSA8Q1JMRj4KKyAgICBNS0QgIDxTUD4gPHBhdGhuYW1lPiA8Q1JMRj4KKyAgICBNTFNEIFs8U1A+IDxwYXRobmFtZT5dIDxDUkxGPgorICAgIE1MU1QgWzxTUD4gPHBhdGhuYW1lPl0gPENSTEY+CisgICAgTU9ERSA8U1A+IDxtb2RlLWNvZGU+IDxDUkxGPgorICAgIE5MU1QgWzxTUD4gPHBhdGhuYW1lLW9yLXdpbGRjYXJkPl0gPENSTEY+CisgICAgTk9PUCA8Q1JMRj4KKyAgICBPUFRTIDxTUD4gPGNvbW1hbmRuYW1lPiBbIDxTUD4gPGNvbW1hbmQtb3B0aW9ucz4gXSA8Q1JMRj4KKyAgICBQQVNTIDxTUD4gPHBhc3N3b3JkPiA8Q1JMRj4KKyAgICBQQVNWIDxDUkxGPgorICAgIFBPUlQgPFNQPiA8aG9zdC1wb3J0PiA8Q1JMRj4KKyAgICBQV0QgIDxDUkxGPgorICAgIFFVSVQgPENSTEY+CisgICAgUkVJTiA8Q1JMRj4KKyAgICBSRVNUIDxTUD4gPG1hcmtlcj4gPENSTEY+CisgICAgUkVUUiA8U1A+IDxwYXRobmFtZT4gPENSTEY+CisgICAgUk1EICA8U1A+IDxwYXRobmFtZT4gPENSTEY+CisgICAgUk5GUiA8U1A+IDxwYXRobmFtZT4gPENSTEY+CisgICAgUk5UTyA8U1A+IDxwYXRobmFtZT4gPENSTEY+CisgICAgU0lURSA8U1A+IDxzdHJpbmc+IDxDUkxGPgorICAgIFNJWkUgPFNQPiA8cGF0aG5hbWU+IDxDUkxGPgorICAgIFNNTlQgPFNQPiA8cGF0aG5hbWU+IDxDUkxGPgorICAgIFNUQVQgWzxTUD4gPHBhdGhuYW1lPl0gPENSTEY+CisgICAgU1RPUiA8U1A+IDxwYXRobmFtZT4gPENSTEY+CisgICAgU1RPVSA8Q1JMRj4KKyAgICBTVFJVIDxTUD4gPHN0cnVjdHVyZS1jb2RlPiA8Q1JMRj4KKyAgICBTWVNUIDxDUkxGPgorICAgIFRZUEUgPFNQPiA8dHlwZS1jb2RlPiA8Q1JMRj4KKyAgICBVU0VSIDxTUD4gPHVzZXJuYW1lPiA8Q1JMRj4KKyovCisjaW5jbHVkZSAiY2tjc3ltLmgiICAgICAgICAgICAgICAgICAgICAgLyogU3RhbmRhcmQgaW5jbHVkZXMgKi8KKyNpbmNsdWRlICJja2NkZWIuaCIKKworI2lmbmRlZiBOT0ZUUCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PRlRQICA9IG5vIEZUUCAqLworI2lmbmRlZiBTWVNGVFAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNZU0ZUUCA9IHVzZSBleHRlcm5hbCBmdHAgY2xpZW50ICovCisjaWZkZWYgVENQU09DS0VUICAgICAgICAgICAgICAgICAgICAgICAgLyogQnVpbGQgb25seSBpZiBUQ1AvSVAgaW5jbHVkZWQgKi8KKyNkZWZpbmUgQ0tDRlRQX0MKKworLyogTm90ZTogbXVjaCBvZiB0aGUgZm9sbG93aW5nIGR1cGxpY2F0ZXMgd2hhdCB3YXMgZG9uZSBpbiBja2NkZWIuaCAqLworLyogYnV0IGxldCdzIG5vdCBtZXNzIHdpdGggaXQgdW5sZXNzIGl0IGNhdXNlcyB0cm91YmxlLiAqLworCisjaWZkZWYgQ0tfQU5TSUMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlIC8qIENLX0FOU0lDICovCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmIC8qIENLX0FOU0lDICovCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgT1MyCisjaWZkZWYgT1MyT05MWQorI2luY2x1ZGUgPG9zMi5oPgorI2VuZGlmIC8qIE9TMk9OTFkgKi8KKyNpbmNsdWRlICJja293aW4uaCIKKyNpbmNsdWRlICJja29jb24uaCIKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZm5kZWYgWklMT0cKKyNpZmRlZiBOVAorI2luY2x1ZGUgPHNldGptcGV4Lmg+CisjaWZkZWYgTlRTSUcKK2V4dGVybiBpbnQgVGxzSW5kZXg7CisjZW5kaWYgLyogTlRTSUcgKi8KKyNlbHNlIC8qIE5UICovCisjaW5jbHVkZSA8c2V0am1wLmg+CisjZW5kaWYgLyogTlQgKi8KKyNlbHNlCisjaW5jbHVkZSA8c2V0cmV0Lmg+CisjZW5kaWYgLyogWklMT0cgKi8KKyNpbmNsdWRlICJja2NzaWcuaCIKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZm5kZWYgTk9USU1FSAorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZiAvKiBOT1RJTUVIICovCisjaWZuZGVmIEVQSVBFCisjZGVmaW5lIEVQSVBFIDMyICAgICAgICAgICAgICAgICAgICAgICAgLyogQnJva2VuIHBpcGUgZXJyb3IgKi8KKyNlbmRpZiAvKiBFUElQRSAqLworCisvKiBLZXJtaXQgaW5jbHVkZXMgKi8KKworI2luY2x1ZGUgImNrY2FzYy5oIgorI2luY2x1ZGUgImNrY2tlci5oIgorI2luY2x1ZGUgImNrdWNtZC5oIgorI2luY2x1ZGUgImNrdXVzci5oIgorI2luY2x1ZGUgImNrY25ldC5oIiAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVzIGNrY3RlbC5oICovCisjaW5jbHVkZSAiY2tjdGVsLmgiICAgICAgICAgICAgICAgICAgICAgLyogKHRoZW4gd2h5IGluY2x1ZGUgaXQgYWdhaW4/KSAqLworI2luY2x1ZGUgImNrY3hsYS5oIgorCisvKgorICBIb3cgdG8gZ2V0IHRoZSBzdHJ1Y3QgdGltZXZhbCBkZWZpbml0aW9uIHNvIHdlIGNhbiBjYWxsIHNlbGVjdCgpLiAgVGhlCisgIHh4VElNRUggc3ltYm9scyBhcmUgZGVmaW5lZCBpbiBja2NkZWIuaCwgb3ZlcnJpZGRlbiBpbiB2YXJpb3VzIG1ha2VmaWxlCisgIHRhcmdldHMuICBUaGUgcHJvYmxlbSBpczogbWF5YmUgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIHNvbWUgaGVhZGVyIGZpbGUKKyAgdGhhdCBkZWZpbmVkIHN0cnVjdCB0aW1ldmFsLCBhbmQgbWF5YmUgd2UgZGlkbid0LiAgSWYgd2UgZGlkLCB3ZSBkb24ndCB3YW50CisgIHRvIGluY2x1ZGUgYW5vdGhlciBoZWFkZXIgZmlsZSB0aGF0IGRlZmluZXMgaXQgYWdhaW4gb3IgdGhlIGNvbXBpbGF0aW9uIHdpbGwKKyAgZmFpbC4gIElmIHdlIGRpZG4ndCwgd2UgaGF2ZSB0byBpbmNsdWRlIHRoZSBoZWFkZXIgZmlsZSB3aGVyZSBpdCdzIGRlZmluZWQuCisgIEJ1dCBpbiBzb21lIGNhc2VzIGV2ZW4gdGhhdCB3b24ndCB3b3JrIGJlY2F1c2Ugb2Ygc3RyaWN0IFBPU0lYIGNvbnN0cmFpbnRzCisgIG9yIHNvbWVzdWNoLCBvciBiZWNhdXNlIHRoaXMgaW50cm9kdWNlcyBvdGhlciBjb25mbGljdHMgKGUuZy4gc3RydWN0IHRtCisgIG11bHRpcGx5IGRlZmluZWQpLCBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gZGVmaW5lIGl0IG91cnNlbHZlcywgYnV0IHRoaXMKKyAgY2FuIHdvcmsgb25seSBpZiB3ZSBkaWRuJ3QgYWxyZWFkeSBlbmNvdW50ZXIgYSBkZWZpbml0aW9uLgorKi8KKyNpZm5kZWYgRENMVElNRVZBTAorI2lmZGVmIFNWNjhSM1Y2CisjZGVmaW5lIERDTFRJTUVWQUwKKyNlbHNlCisjaWZkZWYgU0NPMjM0CisjZGVmaW5lIERDTFRJTUVWQUwKKyNlbmRpZiAvKiBTQ08yMzQgKi8KKyNlbmRpZiAvKiBTVjY4UjNWNiAqLworI2VuZGlmIC8qIERDTFRJTUVWQUwgKi8KKworI2lmZGVmIERDTFRJTUVWQUwKKy8qIEFsc28gbWF5YmUgaW4gc29tZSBwbGFjZXMgdGhlIGVsZW1lbnRzIG11c3QgYmUgdW5zaWduZWQuLi4gKi8KK3N0cnVjdCB0aW1ldmFsIHsKKyAgICBsb25nIHR2X3NlYzsKKyAgICBsb25nIHR2X3VzZWM7Cit9OworI2lmZGVmIENPTU1FTlQKKy8qIEN1cnJlbnRseSB3ZSBkb24ndCB1c2UgdGhpcy4uLiAqLworc3RydWN0IHRpbWV6b25lIHsKKyAgICBpbnQgdHpfbWludXRlc3dlc3Q7CisgICAgaW50IHR6X2RzdHRpbWU7Cit9OworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbHNlICAvKiAhRENMVElNRVZBTCAqLworI2lmbmRlZiBOT1NZU1RJTUVICisjaWZkZWYgU1lTVElNRUgKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmIC8qIFNZU1RJTUVIICovCisjZW5kaWYgLyogTk9TWVNUSU1FSCAqLworI2lmbmRlZiBOT1NZU1RJTUVCSAorI2lmZGVmIFNZU1RJTUVCSAorI2luY2x1ZGUgPHN5cy90aW1lYi5oPgorI2VuZGlmIC8qIFNZU1RJTUVCSCAqLworI2VuZGlmIC8qIE5PU1lTVElNRUJIICovCisjZW5kaWYgLyogRENMVElNRVZBTCAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYgLyogSEFWRV9TVERMSUJfSCAqLworCisjaWZuZGVmIE5PU0VUVElNRQorI2lmZGVmIENPTU1FTlQKKy8qIFRoaXMgc2VjdGlvbiBtb3ZlZCB0byBja2NkZWIuaCAqLworI2lmZGVmIFBPU0lYCisjZGVmaW5lIFVUSU1FSAorI2Vsc2UKKyNpZmRlZiBIUFVYOQorI2RlZmluZSBVVElNRUgKKyNlbHNlCisjaWZkZWYgT1MyCisjZGVmaW5lIFNZU1VUSU1FSAorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIEhQVVg5ICovCisjZW5kaWYgLyogUE9TSVggKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBTWVNVVElNRUgKKyNpbmNsdWRlIDxzeXMvdXRpbWUuaD4KKyNlbHNlCisjaWZkZWYgVVRJTUVICisjaW5jbHVkZSA8dXRpbWUuaD4KKyNkZWZpbmUgU1lTVVRJTUVICisjZW5kaWYgLyogVVRJTUVIICovCisjZW5kaWYgLyogU1lTVVRJTUVIICovCisjZW5kaWYgLyogTk9TRVRUSU1FICovCisKKyNpZm5kZWYgU0NPX09TUjUwNAorI2lmZGVmIFNFTEVDVF9ICisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmIC8qIFNFTEVDVF9IICovCisjZW5kaWYgLyogU0NPX09TUjUwNCAqLworCisvKiBzZWxlY3QoKSBkaWFsZWN0cy4uLiAqLworCisjaWZkZWYgVU5JWAorI2RlZmluZSBCU0RTRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgIC8qIEJTRCBzZWxlY3QoKSBzeW50YXgvc2VtYW50aWNzICovCisjZWxzZQorI2lmZGVmIE9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9TLzIgb3IgV2luMzIgKi8KKyNpZmRlZiBOVAorI2RlZmluZSBCU0RTRUxFQ1QKKyNlbHNlIC8qIE5UICovCisjZGVmaW5lIElCTVNFTEVDVAorI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVU5JWCAqLworCisvKiBPdGhlciBzZWxlY3QoKSBwZWN1bGlhcml0aWVzICovCisKKyNpZmRlZiBIUFVYCisjaWZuZGVmIEhQVVgxMCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSFAtVVggOS54eCBhbmQgZWFybGllciAqLworI2lmbmRlZiBIUFVYMTEwMAorLyogVGhlIHRocmVlIGludGVyaW9yIGFyZ3MgdG8gc2VsZWN0KCkgYXJlIChpbnQgKikgcmF0aGVyIHRoYW4gKGZkX3NldCAqKSAqLworI2lmbmRlZiBJTlRTRUxFQ1QKKyNkZWZpbmUgSU5UU0VMRUNUCisjZW5kaWYgLyogSU5UU0VMRUNUICovCisjZW5kaWYgLyogSFBVWDExMDAgKi8KKyNlbmRpZiAvKiBIUFVYMTAgKi8KKyNlbmRpZiAvKiBIUFVYICovCisKKyNpZmRlZiBDS19TT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTT0NLUyBJbnRlcm5ldCByZWxheSBwYWNrYWdlICovCisjaWZkZWYgQ0tfU09DS1M1ICAgICAgICAgICAgICAgICAgICAgICAgLyogU09DS1MgNSAqLworI2RlZmluZSBhY2NlcHQgIFNPQ0tTYWNjZXB0CisjZGVmaW5lIGJpbmQgICAgU09DS1NiaW5kCisjZGVmaW5lIGNvbm5lY3QgU09DS1Njb25uZWN0CisjZGVmaW5lIGdldHNvY2tuYW1lIFNPQ0tTZ2V0c29ja25hbWUKKyNkZWZpbmUgbGlzdGVuIFNPQ0tTbGlzdGVuCisjZWxzZSAgLyogTm90IFNPQ0tTIDUgKi8KKyNkZWZpbmUgYWNjZXB0ICBSYWNjZXB0CisjZGVmaW5lIGJpbmQgICAgUmJpbmQKKyNkZWZpbmUgY29ubmVjdCBSY29ubmVjdAorI2RlZmluZSBnZXRzb2NrbmFtZSBSZ2V0c29ja25hbWUKKyNkZWZpbmUgbGlzdGVuIFJsaXN0ZW4KKyNlbmRpZiAvKiBDS19TT0NLUzUgKi8KKyNlbmRpZiAvKiBDS19TT0NLUyAqLworCisjaWZuZGVmIE5PSFRUUAorZXh0ZXJuIGNoYXIgKiB0Y3BfaHR0cF9wcm94eTsgICAgICAgICAgIC8qIE5hbWVbOnBvcnRdIG9mIGh0dHAgcHJveHkgc2VydmVyICovCitleHRlcm4gaW50ICAgIHRjcF9odHRwX3Byb3h5X2Vycm5vOworZXh0ZXJuIGNoYXIgKiB0Y3BfaHR0cF9wcm94eV91c2VyOworZXh0ZXJuIGNoYXIgKiB0Y3BfaHR0cF9wcm94eV9wd2Q7CitleHRlcm4gY2hhciAqIHRjcF9odHRwX3Byb3h5X2FnZW50OworI2RlZmluZSBIVFRQQ1BZTCAxMDI0CitzdGF0aWMgY2hhciBwcm94eWhvc3RbSFRUUENQWUxdOworI2VuZGlmIC8qIE5PSFRUUCAqLworaW50IHNzbF9mdHBfcHJveHkgPSAwOyAgICAgICAgICAgICAgICAgIC8qIEZUUCBvdmVyIFNTTC9UTFMgUHJveHkgU2VydmVyICovCisKKy8qIEZlYXR1cmUgc2VsZWN0aW9uICovCisKKyNpZm5kZWYgVVNFX1NIVVRET1dOCisvKgorICBXZSBkb24ndCB1c2Ugc2h1dGRvd24oKSBiZWNhdXNlIChhKSB3ZSBhbHdheXMgY2FsbCBpdCBqdXN0IGJlZm9yZSBjbG9zZSgpCisgIHNvIGl0J3MgcmVkdW5kYW50IGFuZCB1bm5lY2Vzc2FyeSwgYW5kIChiKSBpdCBpbnRyb2R1Y2VzIGEgbG9uZyBwYXVzZSBvbgorICBzb21lIHBsYXRmb3JtcyBsaWtlIFNWLzY4IFIzLgorKi8KKy8qICNkZWZpbmUgVVNFX1NIVVRET1dOICovCisjZW5kaWYgLyogVVNFX1NIVVRET1dOICovCisKKyNpZm5kZWYgTk9SRVNFTkQKKyNpZm5kZWYgTk9SRVNUQVJUICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0YXJ0IC8gcmVjb3ZlciAqLworI2lmbmRlZiBGVFBfUkVTVEFSVAorI2RlZmluZSBGVFBfUkVTVEFSVAorI2VuZGlmIC8qIEZUUF9SRVNUQVJUICovCisjZW5kaWYgLyogTk9SRVNUQVJUICovCisjZW5kaWYgLyogTk9SRVNFTkQgKi8KKworI2lmbmRlZiBOT1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBtb2RlICovCisjaWZuZGVmIERPVVBEQVRFCisjZGVmaW5lIERPVVBEQVRFCisjZW5kaWYgLyogRE9VUERBVEUgKi8KKyNlbmRpZiAvKiBOT1VQREFURSAqLworCisjaWZuZGVmIFVOSUNPREUgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5pY29kZSByZXF1aXJlZCAqLworI2lmbmRlZiBOT0NTRVRTICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBjaGFyc2V0IHRyYW5zbGF0aW9uICovCisjZGVmaW5lIE5PQ1NFVFMKKyNlbmRpZiAvKiBOT0NTRVRTICovCisjZW5kaWYgLyogVU5JQ09ERSAqLworCisjaWZuZGVmIE9TMgorI2lmbmRlZiBIQVZFX01TRUNTICAgICAgICAgICAgICAgICAgICAgIC8qIE1pbGxpc2Vjb25kIHRpbWVyICovCisjaWZkZWYgVU5JWAorI2lmZGVmIEdGVElNRVIKKyNkZWZpbmUgSEFWRV9NU0VDUworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogSEFWRV9NU0VDUyAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgUElQRVNFTkQgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFVUIGZyb20gcGlwZSAqLworI2lmbmRlZiBQVVRQSVBFCisjZGVmaW5lIFBVVFBJUEUKKyNlbmRpZiAvKiBQVVRQSVBFICovCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKworI2lmbmRlZiBOT1NQTCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBVVCBmcm9tIGFycmF5ICovCisjaWZuZGVmIFBVVEFSUkFZCisjZGVmaW5lIFBVVEFSUkFZCisjZW5kaWYgLyogUFVUQVJSQVkgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisvKiBTZWN1cml0eS4uLiAqLworCisjaWZkZWYgQ0tfU1JQCisjZGVmaW5lIEZUUF9TUlAKKyNlbmRpZiAvKiBDS19TUlAgKi8KKworI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgS1JCNAorLyoKKyAgVGhlcmUgaXMgYSBjb25mbGljdCBiZXR3ZWVuIHRoZSBLZXkgU2NoZWR1bGUgZm9ybWF0cyB1c2VkIGludGVybmFsbHkKKyAgd2l0aGluIHRoZSBzdGFuZGFsb25lIE1JVCBLUkI0IGxpYnJhcnkgYW5kIHRoYXQgdXNlZCBieSBFcmljIFlvdW5nCisgIGluIE9wZW5TU0wgYW5kIGhpcyBzdGFuZGFsb25lIERFUyBsaWJyYXJ5LiAgVGhlcmVmb3JlLCBLUkI0IEZUUCBBVVRICisgIGNhbm5vdCBiZSBzdXBwb3J0ZWQgd2hlbiBlaXRoZXIgb2YgdGhvc2UgdHdvIHBhY2thZ2VzIGFyZSB1c2VkLgorKi8KKyNpZmRlZiBLUkI1MjQKKyNkZWZpbmUgRlRQX0tSQjQKKyNlbHNlIC8qIEtSQjUyNCAqLworI2lmbmRlZiBDS19TU0wKKyNpZm5kZWYgTElCREVTCisjZGVmaW5lIEZUUF9LUkI0CisjZW5kaWYgLyogTElCREVTICovCisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogS1JCNTI0ICovCisjZW5kaWYgLyogS1JCNCAqLworI2lmZGVmIEtSQjUKKyNpZm5kZWYgSEVJTURBTAorI2RlZmluZSBGVFBfR1NTQVBJCisjZW5kaWYgLyogSEVJTURBTCAqLworI2VuZGlmIC8qIEtSQjUgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCisvKiBGVFBfU0VDVVJJVFkgaXMgZGVmaW5lZCBpZiBhbnkgb2YgdGhlIGFib3ZlIGlzIHNlbGVjdGVkICovCisjaWZuZGVmIEZUUF9TRUNVUklUWQorI2lmZGVmIEZUUF9HU1NBUEkKKyNkZWZpbmUgRlRQX1NFQ1VSSVRZCisjZWxzZQorI2lmZGVmIEZUUF9LUkI0CisjZGVmaW5lIEZUUF9TRUNVUklUWQorI2Vsc2UKKyNpZmRlZiBGVFBfU1JQCisjZGVmaW5lIEZUUF9TRUNVUklUWQorI2Vsc2UKKyNpZmRlZiBDS19TU0wKKyNkZWZpbmUgRlRQX1NFQ1VSSVRZCisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogRlRQX1NSUCAqLworI2VuZGlmIC8qIEZUUF9LUkI0ICovCisjZW5kaWYgLyogRlRQX0dTU0FQSSAqLworI2VuZGlmIC8qIEZUUF9TRUNVUklUWSAqLworCisjaWZkZWYgQ0tfREVTCisjaWZkZWYgQ0tfU1NMCisjaWZuZGVmIExJQkRFUworI2RlZmluZSBMSUJERVMKKyNlbmRpZiAvKiBMSUJERVMgKi8KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNlbmRpZiAvKiBDS19ERVMgKi8KKworI2lmZGVmIENSWVBUX0RMTAorI2lmbmRlZiBMSUJERVMKKyNkZWZpbmUgTElCREVTCisjZW5kaWYgLyogTElCREVTICovCisjZW5kaWYgLyogQ1JZUFRfRExMICovCisKKyNpZmRlZiBGVFBfS1JCNAorI2RlZmluZSBkZXNfY2Jsb2NrIEJsb2NrCisjZGVmaW5lIGRlc19rZXlfc2NoZWR1bGUgU2NoZWR1bGUKKyNpZmRlZiBLUkI1MjQKKyNpZmRlZiBOVAorI2RlZmluZSBfV0lORE9XUworI2VuZGlmIC8qIE5UICovCisjaW5jbHVkZSAia2VyYmVyb3NJVi9rcmIuaCIKKyNlbHNlIC8qIEtSQjUyNCAqLworI2lmZGVmIFNPTEFSSVMKKyNpZm5kZWYgc3VuCisvKiBGb3Igc29tZSByZWFzb24gbG9zdCBpbiBoaXN0b3J5IHRoZSBNYWtlZmlsZSBTb2xhcmlzIHRhcmdldHMgaGF2ZSAtVXN1biAqLworI2RlZmluZSBzdW4KKyNlbmRpZiAvKiBzdW4gKi8KKyNlbmRpZiAvKiBTT0xBUklTICovCisjaW5jbHVkZSAia3JiLmgiCisjZGVmaW5lIGtyYl9nZXRfZXJyX3RleHRfZW50cnkga3JiX2dldF9lcnJfdGV4dAorI2VuZGlmIC8qIEtSQjUyNCAqLworI2VuZGlmIC8qIEZUUF9LUkI0ICovCisKKyNpZmRlZiBDS19TU0wKKyNpZmRlZiBGVFBfS1JCNAorI2lmbmRlZiBIRUFERVJfREVTX0gKKyNkZWZpbmUgSEVBREVSX0RFU19ICisjZW5kaWYgLyogSEVBREVSX0RFU19IICovCisjZW5kaWYgLyogRlRQX0tSQjQgKi8KKyNpbmNsdWRlICJja19zc2wuaCIKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworI2lmZGVmIEZUUF9TUlAKKyNpZmRlZiBIQVZFX1BXRF9ICisjaW5jbHVkZSAicHdkLmgiCisjZW5kaWYgLyogSEFWRV9QV0RfSCAqLworI2luY2x1ZGUgInRfcHdkLmgiCisjaW5jbHVkZSAidF9jbGllbnQuaCIKKyNpbmNsdWRlICJrcnlwdG8uaCIKKyNlbmRpZiAvKiBGVFBfU1JQICovCisKKyNpZmRlZiBGVFBfR1NTQVBJCisjaW5jbHVkZSA8Z3NzYXBpL2dzc2FwaS5oPgorLyoKKyAgTmVlZCB0byBpbmNsdWRlIHRoZSBrcmI1IGZpbGUsIGJlY2F1c2Ugd2UncmUgZG9pbmcgbWFudWFsIGZhbGxiYWNrCisgIGZyb20gdGhlIHYyIG1lY2ggdG8gdGhlIHYxIG1lY2guICBPbmNlIHRoZXJlJ3MgcmVhbCBuZWdvdGlhdGlvbiwKKyAgd2UgY2FuIGJlIGdlbmVyaWMgYWdhaW4uCisqLworI2luY2x1ZGUgPGdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGdzc2FwaS9nc3NhcGlfa3JiNS5oPgorc3RhdGljIGdzc19jdHhfaWRfdCBnY29udGV4dDsKKyNlbmRpZiAvKiBGVFBfR1NTQVBJICovCisKKyNpZmRlZiBPUzIKKyNpZmRlZiBGVFBfU1JQCisjZGVmaW5lIE1BUF9LUllQVE8KKyNpZmRlZiBTUlBETEwKKyNkZWZpbmUgTUFQX1NSUAorI2VuZGlmIC8qIFNSUERMTCAqLworI2VuZGlmIC8qIEZUUF9TUlAgKi8KKyNpZmRlZiBGVFBfS1JCNAorI2RlZmluZSBNQVBfS1JCNAorI2lmZGVmIENLX0VOQ1JZUFRJT04KKyNkZWZpbmUgTUFQX0RFUworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNlbmRpZiAvKiBGVFBfS1JCNCAqLworI2lmZGVmIEZUUF9HU1NBUEkKKyNkZWZpbmUgTUFQX0dTU0FQSQorI2RlZmluZSBHU1NfT0lEUworI2VuZGlmIC8qIEZUUF9HU1NBUEkgKi8KKyNpbmNsdWRlICJja29hdGguaCIKKworZXh0ZXJuIGludCBrOTVzdGRvdXQsIHdoZXJleFtdLCB3aGVyZXlbXTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGNvbG9yY21kOworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgRlRQX0tSQjQKK3N0YXRpYyBjaGFyIGZ0cF9yZWFsbVtSRUFMTV9TWiArIDFdOworc3RhdGljIEtURVhUX1NUIGZ0cF90a3Q7CisjaWZkZWYgT1MyCitzdGF0aWMgTEVBU0hfQ1JFREVOVElBTFMgZnRwX2NyZWQ7CisjZWxzZSAvKiBPUzIgKi8KK3N0YXRpYyBDUkVERU5USUFMUyBmdHBfY3JlZDsKKyNlbmRpZiAvKiBPUzIgKi8KK3N0YXRpYyBNU0dfREFUIGZ0cF9tc2dfZGF0YTsKK3N0YXRpYyBkZXNfa2V5X3NjaGVkdWxlIGZ0cF9zY2hlZDsKK3N0YXRpYyBpbnQgZm9vWzRdID0gezk5LDk5LDk5LDk5fTsKKyNlbmRpZiAvKiBGVFBfS1JCNCAqLworCisvKiBnZXRyZXBseSgpIGZ1bmN0aW9uIGNvZGVzICovCisKKyNkZWZpbmUgR1JGX0FVVEggMQkJCS8qIFJlcGx5IHRvIEFVVEggY29tbWFuZCAqLworI2RlZmluZSBHUkZfRkVBVCAyCQkJLyogUmVwbHkgdG8gRkVBVCBjb21tYW5kICovCisKKy8qIE9wZXJhdGlvbmFsIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgREVGX1ZCTSAwICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IHZlcmJvc2UgbW9kZSAqLworLyogI2RlZmluZSBTRVRWQk0gKi8gICAgICAgICAgICAgICAgICAgIC8qIChzZWUgZ2V0cmVwbHkpICovCisKKyNkZWZpbmUgVVJMX09ORUZJTEUgICAgICAgICAgICAgICAgICAgICAvKiBHRVQsIG5vdCBNR0VULCBmb3IgRlRQIFVSTCAqLworCisjZGVmaW5lIEZUUF9CVUZTSVogMTAyNDAgICAgICAgICAgICAgICAgLyogTWF4IHNpemUgZm9yIEZUUCBjbWRzICYgcmVwbGllcyAqLworI2RlZmluZSBTUlZOQU1MRU4gMzIgICAgICAgICAgICAgICAgICAgIC8qIE1heCBsZW5ndGggZm9yIHNlcnZlciB0eXBlIG5hbWUgKi8KKyNkZWZpbmUgUFdEU0laIDI1NgorI2RlZmluZSBQQVNTQlVGU0laIDI1NgorI2RlZmluZSBQUk9NUFRTSVogMjU2CisKKyNpZm5kZWYgTUdFVE1BWCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXggb3BlcmFuZHMgZm9yIE1HRVQgY29tbWFuZCAqLworI2RlZmluZSBNR0VUTUFYIDEwMDAKKyNlbmRpZiAvKiBNR0VUTUFYICovCisKKyNpZmRlZiBGVFBfU1JQCisjZGVmaW5lIEZVREdFX0ZBQ1RPUiAxMDAKKyNlbmRpZiAvKiBGVFBfU1JQICovCisKKy8qCisgIEFtb3VudCBvZiBncm93dGggZnJvbSBjbGVhcnRleHQgdG8gY2lwaGVydGV4dC4gIGtyYl9ta19wcml2IGFkZHMgdGhpcworICBudW1iZXIgYnl0ZXMuICBNdXN0IGJlIGRlZmluZWQgZm9yIGVhY2ggYXV0aCB0eXBlLgorICBHU1NBUEkgYXBwZWFycyB0byBhZGQgNTIgYnl0ZXMsIGJ1dCBJJ20gbm90IHN1cmUgaXQgaXMgYSBjb25zdGFudC0taGFydG1hbnMKKyAgM0RFUyByZXF1aXJlcyA1NiBieXRlcy4gIExldHMgdXNlIDk2IGp1c3QgdG8gYmUgc3VyZS4KKyovCisjaWZkZWYgRlRQX0dTU0FQSQorI2lmbmRlZiBGVURHRV9GQUNUT1IKKyNkZWZpbmUgRlVER0VfRkFDVE9SIDk2CisjZW5kaWYgLyogRlVER0VfRkFDVE9SICovCisjZW5kaWYgLyogRlRQX0dTU0FQSSAqLworCisjaWZkZWYgRlRQX0tSQjQKKyNpZm5kZWYgRlVER0VfRkFDVE9SCisjZGVmaW5lIEZVREdFX0ZBQ1RPUiAzMgorI2VuZGlmIC8qIEZVREdFX0ZBQ1RPUiAqLworI2VuZGlmIC8qIEZUUF9LUkI0ICovCisKKyNpZm5kZWYgRlVER0VfRkFDVE9SICAgICAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIG5vIGF1dGggdHlwZXMgZGVmaW5lIGl0ICovCisjZGVmaW5lIEZVREdFX0ZBQ1RPUiAwCisjZW5kaWYgLyogRlVER0VfRkFDVE9SICovCisKKyNpZm5kZWYgTUFYSE9TVE5BTUVMRU4KKyNkZWZpbmUgTUFYSE9TVE5BTUVMRU4gNjQKKyNlbmRpZiAvKiBNQVhIT1NUTkFNRUxFTiAqLworI2RlZmluZSBNQVhfRE5TX05BTUVMRU4gKDE1KihNQVhIT1NUTkFNRUxFTiArIDEpKzEpCisKKy8qIEZhc2Npc3QgY29tcGlsZXIgdG9hZHlpbmcgKi8KKworI2lmbmRlZiBTRU5EQVJHMlRZUEUKKyNpZmRlZiBDT01NRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaWdodCBiZSBuZWVkZWQgaGVyZSBhbmQgdGhlcmUgKi8KKyNkZWZpbmUgU0VOREFSRzJUWVBFIGNvbnN0IGNoYXIgKgorI2Vsc2UKKyNkZWZpbmUgU0VOREFSRzJUWVBFIGNoYXIgKgorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBTRU5EQVJHMlRZUEUgKi8KKworLyogQ29tbW9uIHRleHQgbWVzc2FnZXMgKi8KKworc3RhdGljIGNoYXIgKm5vY3ggPSAiP05vIEZUUCBjb250cm9sIGNvbm5lY3Rpb25cbiI7CisKK3N0YXRpYyBjaGFyICpmbmNuYW1bXSA9IHsKKyAgInJlbmFtZSIsICJvdmVyd3JpdGUiLCAiYmFja3VwIiwgImFwcGVuZCIsICJkaXNjYXJkIiwgImFzayIsICJ1cGRhdGUiLAorICAiZGF0ZXMtZGlmZmVyIiwgIiIKK307CisKKy8qIE1hY3JvIGRlZmluaXRpb25zICovCisKKy8qIFVzZWQgdG8gc3BlZWQgdXAgdGV4dC1tb2RlIFBVVHMgKi8KKyNkZWZpbmUgenpvdXQoZmQsYykgXAorKChmZDwwKT8oLTEpOigobm91dD49dWNidWZzaXopPyh6enNlbmQoZmQsYykpOih1Y2J1Zltub3V0KytdPWMpKSkKKworI2RlZmluZSBDSEVDS0NPTk4oKSBpZighY29ubmVjdGVkKXtwcmludGYobm9jeCk7cmV0dXJuKC05KTt9CisKKy8qIEV4dGVybmFscyAqLworCisjaWZkZWYgQ0tfVVJMCitleHRlcm4gc3RydWN0IHVybGRhdGEgZ191cmw7CisjZW5kaWYgLyogQ0tfVVJMICovCisKKyNpZmRlZiBEWU5BTUlDCitleHRlcm4gY2hhciAqemluYnVmZmVyLCAqem91dGJ1ZmZlcjsgICAgLyogUmVndWxhciBLZXJtaXQgZmlsZSBpL28gKi8KKyNlbHNlCitleHRlcm4gY2hhciB6aW5idWZmZXJbXSwgem91dGJ1ZmZlcltdOworI2VuZGlmIC8qIERZTkFNSUMgKi8KK2V4dGVybiBjaGFyICp6aW5wdHIsICp6b3V0cHRyOworZXh0ZXJuIGludCB6aW5jbnQsIHpvdXRjbnQsIHpvYnVmc2l6ZSwgZm5jYWN0OworCisjaWZkZWYgQ0tfVE1QRElSCitleHRlcm4gaW50IGZfdG1wZGlyOyAgICAgICAgICAgICAgICAgICAgLyogRGlyZWN0b3J5IGNoYW5nZWQgdGVtcG9yYXJpbHkgKi8KK2V4dGVybiBjaGFyIHNhdmRpcltdOyAgICAgICAgICAgICAgICAgICAvKiBGb3Igc2F2aW5nIGN1cnJlbnQgZGlyZWN0b3J5ICovCitleHRlcm4gY2hhciAqIGRsZGlyOworI2VuZGlmIC8qIENLX1RNUERJUiAqLworCitleHRlcm4gY2hhciAqIHJmc3BlYywgKiBzZnNwZWMsICogc3Jmc3BlYywgKiBycmZzcGVjOyAvKiBGb3IgV0hFUkUgY29tbWFuZCAqLworCitleHRlcm4geHhfc3RycCB4eHN0cmluZzsKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIG9ub2ZmW10sIHR4dGJpbltdLCBycGF0aHRhYltdOworZXh0ZXJuIGludCBucnBhdGh0YWIsIHhmaWxldHlwZSwgcGF0dGVybnMsIGduZmVycm9yLCBtb3ZpbmcsIHdoYXQsIHBrdG51bTsKK2V4dGVybiBpbnQgc3VjY2VzcywgbmZpbHMsIHNuZHNyYywgcXVpZXQsIG5vcHVzaCwgcmVjdXJzaXZlLCBpbnNlcnZlciwgYmluYXJ5OworZXh0ZXJuIGludCBmaWxlcGVlaywgbnNjYW5maWxlLCBmc2VjcywgeGZlcnN0YXQsIHhmZXJtb2RlLCBsYXN0eGZlciwgdHNlY3M7CitleHRlcm4gaW50IGJhY2tncmQsIHNwYWNrZXRzLCBycGFja2V0cywgc3BrdGwsIHJwa3RsLCB4YXNrbW9yZSwgY21kX3Jvd3M7CitleHRlcm4gaW50IG5vbGlua3MsIG1zZ2ZsZywga2VlcDsKK2V4dGVybiBsb25nIGZzaXplLCBmZmMsIHRmYywgZmlsY250LCB4ZnNlY3MsIHRmY3BzLCBjcHMsIG9sZGNwczsKKyNpZmRlZiBHRlRJTUVSCitleHRlcm4gQ0tGTE9BVCBmcHRzZWNzLCBmcGZzZWNzLCBmcHhmc2VjczsKKyNlbHNlCitleHRlcm4gbG9uZyB4ZnNlY3M7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworCitleHRlcm4gY2hhciBmaWxuYW1bXSwgKiBmaWxlZmlsZSwgbXlob3N0W107CitleHRlcm4gY2hhciAqIHNuZF9tb3ZlLCAqIHJjdl9tb3ZlLCAqIHNuZF9yZW5hbWUsICogcmN2X3JlbmFtZTsKK2V4dGVybiBpbnQgZ19za2lwYnVwLCBza2lwYnVwLCBzZW5kbW9kZTsKK2V4dGVybiBpbnQgZ19kaXNwbGEsIGZkaXNwbGEsIGRpc3BsYTsKKworI2lmZGVmIExPQ1VTCitleHRlcm4gaW50IGxvY3VzLCBhdXRvbG9jdXM7CisjZW5kaWYgLyogTE9DVVMgKi8KKworI2lmbmRlZiBOT0NTRVRTCitleHRlcm4gaW50IG5maWxjLCBkY3NldDcsIGRjc2V0OCwgZmlsZW9yZGVyOworZXh0ZXJuIHN0cnVjdCBjc2luZm8gZmNzaW5mb1tdOworZXh0ZXJuIHN0cnVjdCBrZXl0YWIgZmNzdGFiW107CitleHRlcm4gaW50IGZjaGFyc2V0OworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworZXh0ZXJuIGNoYXIgc25kYmVmb3JlW10sIHNuZGFmdGVyW10sICpzbmRleGNlcHRbXTsgLyogU2VsZWN0aW9uIGNyaXRlcmlhICovCitleHRlcm4gY2hhciBzbmRuYmVmb3JlW10sIHNuZG5hZnRlcltdLCAqcmN2ZXhjZXB0W107CitleHRlcm4gQ0hBUiBmZW9sOworZXh0ZXJuIGxvbmcgc2VuZHN0YXJ0LCBzbmRzbWFsbGVyLCBzbmRsYXJnZXIsIHJzX2xlbjsKKworZXh0ZXJuIGNoYXIgKiByZW1kZXN0OworZXh0ZXJuIGludCByZW1maWxlLCByZW1hcHBkLCByZW1waXBlOworCisjaWZuZGVmIE5PU1BMCitleHRlcm4gaW50IGNtZF9xdW90aW5nOworI2lmZGVmIFBVVEFSUkFZCitleHRlcm4gaW50IHNuZHhsbywgc25keGhpLCBzbmR4aW47CitleHRlcm4gY2hhciBzbmR4bmFtW107CitleHRlcm4gY2hhciAqKmFfcHRyW107ICAgICAgICAgICAgICAgICAgLyogQXJyYXkgcG9pbnRlcnMgKi8KK2V4dGVybiBpbnQgYV9kaW1bXTsgICAgICAgICAgICAgICAgICAgICAvKiBBcnJheSBkaW1lbnNpb25zICovCisjZW5kaWYgLyogUFVUQVJSQVkgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PTVNFTkQgICAgICAgICAgICAgICAgICAgICAgICAgLyogTVBVVCBhbmQgQUREIFNFTkQtTElTVCBsaXN0cyAqLworZXh0ZXJuIGNoYXIgKm1zZmlsZXNbXTsKK2V4dGVybiBpbnQgZmlsZXNpbmxpc3Q7CitleHRlcm4gc3RydWN0IGZpbGVsaXN0ICogZmlsZWhlYWQ7CitleHRlcm4gc3RydWN0IGZpbGVsaXN0ICogZmlsZXRhaWw7CitleHRlcm4gc3RydWN0IGZpbGVsaXN0ICogZmlsZW5leHQ7CitleHRlcm4gaW50IGFkZGxpc3Q7CitleHRlcm4gY2hhciBmc3BlY1tdOyAgICAgICAgICAgICAgICAgICAgLyogTW9zdCByZWNlbnQgZmlsZXNwZWMgKi8KK2V4dGVybiBpbnQgZnNwZWNsZW47ICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgZnNwZWNbXSBidWZmZXIgKi8KKyNlbmRpZiAvKiBOT01TRU5EICovCisKK2V4dGVybiBpbnQgcGlwZXNlbmQ7CisjaWZkZWYgUElQRVNFTkQKK2V4dGVybiBjaGFyICogc25kZmlsdGVyLCAqIHJjdmZpbHRlcjsKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisjaWZkZWYgQ0tST09UCitleHRlcm4gaW50IGNrcm9vdGVycjsKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworI2lmZGVmIEtSQjQKK2V4dGVybiBpbnQga3JiNF9hdXRvZ2V0OworX1BST1RPVFlQKGNoYXIgKiBja19rcmI0X3JlYWxtb2Zob3N0LChjaGFyICopKTsKKyNlbmRpZiAvKiBLUkI0ICovCisKKyNpZmRlZiBLUkI1CitleHRlcm4gaW50IGtyYjVfYXV0b2dldDsKK2V4dGVybiBpbnQga3JiNV9kX25vX2FkZHJlc3NlczsKK19QUk9UT1RZUChjaGFyICogY2tfa3JiNV9yZWFsbW9maG9zdCwoY2hhciAqKSk7CisjZW5kaWYgLyogS1JCNSAqLworCisjaWZkZWYgRENNREJVRgorZXh0ZXJuIGNoYXIgKmF0bWJ1ZjsgICAgICAgICAgICAgICAgICAgIC8qIEF0b20gYnVmZmVyIChtYWxsb2MnZCkgKi8KK2V4dGVybiBjaGFyICpjbWRidWY7ICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kIGJ1ZmZlciAobWFsbG9jJ2QpICovCitleHRlcm4gY2hhciAqbGluZTsgICAgICAgICAgICAgICAgICAgICAgLyogQmlnIHN0cmluZyBidWZmZXIgIzEgKi8KK2V4dGVybiBjaGFyICp0bXBidWY7ICAgICAgICAgICAgICAgICAgICAvKiBCaWcgc3RyaW5nIGJ1ZmZlciAjMiAqLworI2Vsc2UKK2V4dGVybiBjaGFyIGF0bWJ1ZltdOyAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2FtZSwgYnV0IHN0YXRpYyAqLworZXh0ZXJuIGNoYXIgY21kYnVmW107CitleHRlcm4gY2hhciBsaW5lW107CitleHRlcm4gY2hhciB0bXBidWZbXTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisKK2V4dGVybiBjaGFyICogY21hcmcsICogY21hcmcyLCAqKiBjbWxpc3Q7IC8qIEZvciBzZXR0aW5nIHVwIGZpbGUgbGlzdHMgKi8KKworLyogUHVibGljIHZhcmlhYmxlcyBkZWNsYXJlZCBoZXJlICovCisKKyNpZmRlZiBOT1hGRVIKK2ludCBmdHBnZXQgID0gIDE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHRVQvUFVUL1JFTU9URSBvcmllbnRhdGlvbiBGVFAgKi8KKyNlbHNlCitpbnQgZnRwZ2V0ICA9ICAyOyAgICAgICAgICAgICAgICAgICAgICAgLyogR0VUL1BVVC9SRU1PVEUgb3JpZW50YXRpb24gQVVUTyAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworaW50IGZ0cGNvZGUgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIExhc3QgRlRQIHJlc3BvbnNlIGNvZGUgKi8KK2ludCBmdHBfY21kbGluID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBGVFAgaW52b2tlZCBmcm9tIGNvbW1hbmQgbGluZSAqLworaW50IGZ0cF9mYWkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUUCBmYWlsdXJlIGNvdW50ICovCitpbnQgZnRwX2RlYiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRlRQIGRlYnVnZ2luZyAqLworaW50IGZ0cF9kaXMgPSAtMTsJCQkvKiBGVFAgZGlzcGxheSBzdHlsZSAqLworaW50IGZ0cF9sb2cgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUUCBBdXRvLWxvZ2luICovCitpbnQgc2F2X2xvZyA9IC0xOworaW50IGZ0cF9hY3Rpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIEZUUCBhY3Rpb24gZnJvbSBjb21tYW5kIGxpbmUgKi8KK2ludCBmdHBfZGF0ZXMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgZmlsZSBkYXRlcyBmcm9tIHNlcnZlciAqLworCitjaGFyIGZ0cF9yZXBseV9zdHJbRlRQX0JVRlNJWl0gPSAiIjsgICAgLyogTGFzdCBsaW5lIG9mIHByZXZpb3VzIHJlcGx5ICovCitjaGFyIGZ0cF9zcnZ0eXBbU1JWTkFNTEVOXSA9IHsgTlVMLCBOVUwgfTsgLyogU2VydmVyJ3Mgc3lzdGVtIHR5cGUgKi8KK2NoYXIgZnRwX3VzZXJfaG9zdFtNQVhfRE5TX05BTUVMRU5dPSAiIjsgLyogRlRQIGhvc3RuYW1lIHNwZWNpZmllZCBieSB1c2VyICovCitjaGFyICogZnRwX2hvc3QgPSBOVUxMOyAgICAgICAgICAgICAgICAgLyogRlRQIGhvc3RuYW1lICovCitjaGFyICogZnRwX2xvZ25hbWUgPSBOVUxMOyAgICAgICAgICAgICAgLyogRlRQIHVzZXJuYW1lICovCitjaGFyICogZnRwX3JkaXIgPSBOVUxMOyAgICAgICAgICAgICAgICAgLyogUmVtb3RlIGRpcmVjdG9yeSBmcm9tIGNtZGxpbmUgKi8KK2NoYXIgKiBmdHBfYXB3ID0gTlVMTDsJCQkvKiBBbm9ueW1vdXMgcGFzc3dvcmQgKi8KKworLyogRGVmaW5pdGlvbnMgYW5kIHR5cGVkZWZzIG5lZWRlZCBmb3IgcHJvdG90eXBlcyAqLworCisjZGVmaW5lIHNpZ190IG15X3NpZ190CisjZGVmaW5lIHNpZ3R5cGUgU0lHVFlQCit0eXBlZGVmIHNpZ3R5cGUgKCpzaWdfdCkoKTsKKworLyogU3RhdGljIGdsb2JhbCB2YXJpYWJsZXMgKi8KKworc3RhdGljIGNoYXIgZnRwc25kYnVmW0ZUUF9CVUZTSVorNjRdOworCitzdGF0aWMgY2hhciAqIGZ0c19zdG8gPSBOVUxMOworCitzdGF0aWMgaW50IGZ0cHNuZHJldCA9IDA7CitzdGF0aWMgc3RydWN0IF9mdHBzbmQgeworICAgIHNpZ190IG9sZGludHIsIG9sZGludHA7CisgICAgaW50ICAgICAgICAgICAgcmVwbHk7CisgICAgaW50ICAgICAgICAgICAgaW5jcywKKyAgICAgICAgICAgICAgICAgICBvdXRjczsKKyAgICBjaGFyICogICAgICAgICBjbWQsICogbG9jYWwsICogcmVtb3RlOworICAgIGludCAgICAgICAgICAgIGJ5dGVzOworICAgIGludCAgICAgICAgICAgIHJlc3RhcnQ7CisgICAgaW50ICAgICAgICAgICAgeGxhdGU7CisgICAgY2hhciAqICAgICAgICAgbG1vZGU7Cit9IGZ0cHNuZDsKKworLyoKKyAgVGhpcyBpcyBqdXN0IGEgZmlyc3Qgc3RhYiAtLSB0aGVzZSBzdHJpbmdzIHNob3VsZCBtYXRjaCBob3cgdGhlCisgIGNvcnJlc3BvbmRpbmcgRlRQIHNlcnZlcnMgaWRlbnRpZnkgdGhlbXNlbHZlcy4KKyovCisjaWZkZWYgVU5JWAorc3RhdGljIGNoYXIgKiBteW9zdHlwZSA9ICJVTklYIjsKKyNlbHNlCisjaWZkZWYgVk1TCisvKiBub3QgeWV0Li4uICovCitzdGF0aWMgY2hhciAqIG15b3N0eXBlID0gIlZNUyI7CisjZWxzZQorI2lmZGVmIE9TMgorI2lmZGVmIE5UCitzdGF0aWMgY2hhciAqIG15b3N0eXBlID0gIldJTjMyIjsKKyNlbHNlCitzdGF0aWMgY2hhciAqIG15b3N0eXBlID0gIk9TLzIiOworI2VuZGlmIC8qIE5UICovCisjZWxzZQorc3RhdGljIGNoYXIgKiBteW9zdHlwZSA9ICJVTlNVUFBPUlRFRCI7CisjZW5kaWYgLyogT1MyICAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKworc3RhdGljIGludCBub2luaXQgPSAwOyAgICAgICAgICAgICAgICAgIC8qIERvbid0IHNlbmQgUkVTVCwgU1RSVSwgTU9ERSAqLworc3RhdGljIGludCBhbGlrZSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIENsaWVudC9zZXJ2ZXIgbGlrZSBwbGF0Zm9ybXMgKi8KK3N0YXRpYyBpbnQgbG9jYWwgPSAxOyAgICAgICAgICAgICAgICAgICAvKiBTaGFkb3dzIEtlcm1pdCBnbG9iYWwgJ2xvY2FsJyAqLworc3RhdGljIGludCBkb3V0ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIERhdGEgY29ubmVjdGlvbiBmaWxlIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBpbnQgZHB5YWN0aXZlID0gMDsgICAgICAgICAgICAgICAvKiBEYXRhIHRyYW5zZmVyIGlzIGFjdGl2ZSAqLworc3RhdGljIGludCBnbG9iYWxkaW4gPSAtMTsgICAgICAgICAgICAgIC8qIERhdGEgY29ubmVjdGlvbiBmLmQuICovCitzdGF0aWMgaW50IG91dDJzY3JlZW4gPSAwOyAgICAgICAgICAgICAgLyogR0VUIG91dHB1dCBpcyB0byBzY3JlZW4gKi8KK3N0YXRpYyBpbnQgZm9yY2V0eXBlID0gMDsgICAgICAgICAgICAgICAvKiBGb3JjZSB0ZXh0IG9yIGJpbmFyeSBtb2RlICovCitzdGF0aWMgaW50IGNhbmNlbGZpbGUgPSAwOyAgICAgICAgICAgICAgLyogRmlsZSBjYW5jZWxlZCAqLworc3RhdGljIGludCBjYW5jZWxncm91cCA9IDA7ICAgICAgICAgICAgIC8qIEdyb3VwIGNhbmNlbGVkICovCitzdGF0aWMgaW50IGFub255bW91cyA9IDA7ICAgICAgICAgICAgICAgLyogTG9nZ2luZyBpbiBhcyBhbm9ueW1vdXMgKi8KK3N0YXRpYyBpbnQgbG9nZ2VkaW4gPSAwOyAgICAgICAgICAgICAgICAvKiBMb2dnZWQgaW4gKG9yIG5vdCkgKi8KK3N0YXRpYyBpbnQgcHV0ZXJyb3IgPSAwOyAgICAgICAgICAgICAgICAvKiBXaGF0IHRvIGRvIG9uIFBVVCBlcnJvciAqLworc3RhdGljIGludCBnZXRlcnJvciA9IDA7ICAgICAgICAgICAgICAgIC8qIFdoYXQgdG8gZG8gb24gR0VUIGVycm9yICovCitzdGF0aWMgaW50IHJmcmMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogcmVtb3RlX2ZpbGVzKCkgcmV0dXJuIGNvZGUgKi8KK3N0YXRpYyBpbnQgb2tyZXN0YXJ0ID0gMDsgICAgICAgICAgICAgICAvKiBTZXJ2ZXIgdW5kZXJzdGFuZHMgUkVTVCAqLworc3RhdGljIGludCBwcmludGxpbmVzID0gMDsgICAgICAgICAgICAgIC8qIGdldHJlcGx5KClzaG91bGQgcHJpbnQgZGF0YSBsaW5lcyAqLworc3RhdGljIGludCBoYXZldXJsID0gMDsgICAgICAgICAgICAgICAgIC8qIEludm9rZWQgYnkgY29tbWFuZC1saW5lIEZUUCBVUkwgKi8KK3N0YXRpYyBpbnQgbWR0bW9rID0gMTsJCQkvKiBTZXJ2ZXIgc3VwcG9ydHMgTURUTSAqLworc3RhdGljIGludCBzaXplb2sgPSAxOworc3RhdGljIGludCBmZWF0b2sgPSAxOworc3RhdGljIGludCBtbHN0b2sgPSAxOworc3RhdGljIGludCBzdG91YXJnID0gMTsKK3N0YXRpYyBpbnQgdHlwZXNlbnQgPSAwOworc3RhdGljIGludCBoYXZlc2lnaW50ID0gMDsKK3N0YXRpYyBsb25nIGhhdmV0eXBlID0gIDA7CitzdGF0aWMgbG9uZyBoYXZlc2l6ZSA9IC0xTDsKK3N0YXRpYyBjaGFyICogaGF2ZW1kdG0gPSBOVUxMOworc3RhdGljIGludCBtZ2V0bWV0aG9kID0gMDsJCS8qIE5MU1Qgb3IgTUxTRCAqLworc3RhdGljIGludCBtZ2V0Zm9yY2VkID0gMDsKKworc3RhdGljIGludCBpLCAvKiBqLCBrLCAqLyB4LCB5LCB6OyAgICAgIC8qIFZvbGF0aWxlIHRlbXBvcmFyaWVzICovCitzdGF0aWMgaW50IGMwLCBjMTsgICAgICAgICAgICAgICAgICAgICAgLyogVGVtcCB2YXJpYWJsZXMgZm9yIGNoYXJhY3RlcnMgKi8KKworc3RhdGljIGNoYXIgcHV0cGF0aFtDS01BWFBBVEgrMV0gPSB7IE5VTCwgTlVMIH07CitzdGF0aWMgY2hhciBhc25hbWJ1ZltDS01BWFBBVEgrMV0gPSB7IE5VTCwgTlVMIH07CisKKyNkZWZpbmUgUkZOQlVGU0laIDQwOTYJCQkvKiBSZW1vdGUgZmlsZW5hbWUgYnVmZmVyIHNpemUgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBtYXhidWYgPSAwLCBhY3R1YWxidWYgPSAwOworc3RhdGljIENIQVIgKnVjYnVmID0gTlVMTDsKK3N0YXRpYyBpbnQgdWNidWZzaXogPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBub3V0ID0gMDsgICAgICAgICAgIC8qIE51bWJlciBvZiBjaGFycyBpbiB1Y2J1ZiAqLworCitzdGF0aWMgam1wX2J1ZiByZWN2Y2FuY2VsOworc3RhdGljIGptcF9idWYgc2VuZGNhbmNlbDsKK3N0YXRpYyBqbXBfYnVmIHB0Y2FuY2VsOworc3RhdGljIGptcF9idWYgamNhbmNlbDsKK3N0YXRpYyBpbnQgcHRhYmZsZyA9IDA7CisKKy8qIFByb3RlY3Rpb24gbGV2ZWwgc3ltYm9scyAqLworCisjZGVmaW5lIEZQTF9DTFIgMSAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgKi8KKyNkZWZpbmUgRlBMX1NBRiAyICAgICAgICAgICAgICAgICAgICAgICAvKiBTYWZlICovCisjZGVmaW5lIEZQTF9QUlYgMyAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpdmF0ZSAqLworI2RlZmluZSBGUExfQ09OIDQgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbmZpZGVudGlhbCAqLworCisvKiBTeW1ib2xzIGZvciBmaWxlIHR5cGVzIHJldHVybmVkIGJ5IE1MU1QvTUxTRCAqLworCisjZGVmaW5lIEZUWVBfRklMRSAxCQkJLyogUmVndWxhciBmaWxlICovCisjZGVmaW5lIEZUWVBfRElSICAyCQkJLyogRGlyZWN0b3J5ICovCisjZGVmaW5lIEZUWVBfQ0RJUiAzCQkJLyogQ3VycmVudCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgRlRZUF9QRElSIDQJCQkvKiBQYXJlbnQgZGlyZWN0b3J5ICovCisKKy8qIEZpbGUgdHlwZSBzeW1ib2xzIGtleWVkIHRvIHRoZSBmaWxlLXR5cGUgc3ltYm9scyBmcm9tIGNrY2tlci5oICovCisKKyNkZWZpbmUgRlRUX0FTQyBYWUZUX1QgICAgICAgICAgICAgICAgICAvKiBBU0NJSSAodGV4dCkgKi8KKyNkZWZpbmUgRlRUX0JJTiBYWUZUX0IgICAgICAgICAgICAgICAgICAvKiBCaW5hcnkgKGltYWdlKSAqLworI2RlZmluZSBGVFRfVEVOIFhZRlRfWCAgICAgICAgICAgICAgICAgIC8qIFRFTkVYIChUT1BTLTIwKSAqLworCisvKiBTZXJ2ZXIgZmVhdHVyZSB0YWJsZSAtIHNmdHRhYlswXSA+IDAgbWVhbnMgc2VydmVyIHN1cHBvcnRzIEZFQVQgYW5kIE9QVFMgKi8KKworc3RhdGljIGludCBzZnR0YWJbMTZdID0geyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIH07CisKKyNkZWZpbmUgU0ZUX0FVVEggIDEJCQkvKiBGVFAgc2VydmVyIGZlYXR1cmUgY29kZXMgKi8KKyNkZWZpbmUgU0ZUX0xBTkcgIDIKKyNkZWZpbmUgU0ZUX01EVE0gIDMKKyNkZWZpbmUgU0ZUX01MU1QgIDQKKyNkZWZpbmUgU0ZUX1BCU1ogIDUKKyNkZWZpbmUgU0ZUX1BST1QgIDYKKyNkZWZpbmUgU0ZUX1JFU1QgIDcKKyNkZWZpbmUgU0ZUX1NJWkUgIDgKKyNkZWZpbmUgU0ZUX1RWRlMgIDkKKyNkZWZpbmUgU0ZUX1VURjggMTAKKworI2RlZmluZSBDTlZfQVVUTyAgMgkJCS8qIEZUUCBmaWxlbmFtZSBjb252ZXJzaW9uICovCisjZGVmaW5lIENOVl9DTlYgICAxCisjZGVmaW5lIENOVl9MSVQgICAwCisKKy8qIFNFVCBGVFAgdmFsdWVzICovCisKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgRlRQIHZhbHVlcy4uLiAqLworICBmdHBfYXV0ID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dG8tYXV0aGVudGljYXRpb24gKi8KKyNpZmRlZiBGVFBfU0VDVVJJVFkKKyAgZnRwX2NyeSA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvLWVuY3J5cHRpb24gKi8KKyAgZnRwX2NmdyA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDcmVkZW50aWFsIGZvcndhcmRpbmcgKi8KKyNlbmRpZiAvKiBGVFBfU0VDVVJJVFkgKi8KKyAgZnRwX2NwbCA9IEZQTF9DTFIsICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kIHByb3RlY3Rpb24gbGV2ZWwgKi8KKyAgZnRwX2RwbCA9IEZQTF9DTFIsICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIHByb3RlY3Rpb24gbGV2ZWwgKi8KKyNpZmRlZiBGVFBfUFJPWFkKKyAgZnRwX3ByeCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgcHJveHkgKi8KKyNlbmRpZiAvKiBGVFBfUFJPWFkgKi8KKyAgc2F2X3BzdiA9IC0xLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3Igc2F2aW5nIHBhc3NpdmUgbW9kZSAqLworICBmdHBfcHN2ID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhc3NpdmUgbW9kZSAqLworICBmdHBfc3BjID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlbmQgcG9ydCBjb21tYW5kcyAqLworICBmdHBfdHlwID0gRlRUX0FTQywgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgKi8KKyAgZ2V0X2F1dG8gPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvbWF0aWMgdHlwZSBzd2l0Y2hpbmcgZm9yIEdFVCAqLworICB0ZW5leCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgaXMgVGVuZXggKi8KKyAgZnRwX3VzbiA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVbmlxdWUgc2VydmVyIG5hbWVzICovCisgIGZ0cF9wcm0gPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGVybWlzc2lvbnMgKi8KKyAgZnRwX2NudiA9IENOVl9BVVRPLAkJCS8qIEZpbGVuYW1lIGNvbnZlcnNpb24gKDIgPSBhdXRvKSAqLworICBmdHBfdmJtID0gREVGX1ZCTSwgICAgICAgICAgICAgICAgICAgIC8qIFZlcmJvc2UgbW9kZSAqLworICBmdHBfdmJ4ID0gREVGX1ZCTSwgICAgICAgICAgICAgICAgICAgIC8qIFN0aWNreSB2ZXJzaW9uIG9mIHNhbWUgKi8KKyAgZnRwX2VyciA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFcnJvciBhY3Rpb24gKi8KKyAgZnRwX2ZuYyA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlbmFtZSBjb2xsaXNpb24gYWN0aW9uICovCisKKyNpZmRlZiBDS19TU0wKK3N0YXRpYyBpbnQgZnRwX2J1Z191c2Vfc3NsX3YyID0gMDsgICAgICAvKiB1c2UgU1NMdjIgZm9yIEFVVEggU1NMICovCisjZW5kaWYgLyogQ0tfU1NMICovCisKK3N0YXRpYyBpbnQKKyNpZmRlZiBOT0NTRVRTCisgIGZ0cF9jc3IgPSAtMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVtb3RlIChzZXJ2ZXIpIGNoYXJhY3RlciBzZXQgKi8KKyNlbHNlCisgIGZ0cF9jc3IgPSBGQ19VVEY4LAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgZnRwX3hsYSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIG9uL29mZiAqLworaW50CisgIGZ0cF9jc3ggPSAtMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVtb3RlIGNoYXJzZXQgY3VycmVudGx5IGluIHVzZSAqLworICBmdHBfY3NsID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvY2FsIGNoYXJzZXQgY3VycmVudGx5IGluIHVzZSAqLworCitzdGF0aWMgaW50IGdfZnRwX3R5cCA9IEZUVF9BU0M7ICAgICAgICAgLyogRm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIGZ0cF90eXAgKi8KKworY2hhciAqIGZ0cF9ubWwgPSBOVUxMOyAgICAgICAgICAgICAgICAgIC8qIC9OQU1FTElTVCAqLworY2hhciAqIGZ0cF90bXAgPSBOVUxMOyAgICAgICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBzdHJpbmcgKi8KK3N0YXRpYyBjaGFyICogZnRwX2FjYyA9IE5VTEw7ICAgICAgICAgICAvKiBBY2NvdW50IHN0cmluZyAqLworc3RhdGljIGNoYXIgKiBhdXRoX3R5cGUgPSBOVUxMOyAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIHR5cGUgKi8KK3N0YXRpYyBjaGFyICogc3J2X3JlbmFtID0gTlVMTDsgICAgICAgICAvKiBTZXJ2ZXItcmVuYW1lIHN0cmluZyAqLworRklMRSAqIGZwX25tbCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgIC8qIE5hbWVsaXN0IGZpbGUgcG9pbnRlciAqLworCitzdGF0aWMgaW50IGNzb2NrZXQgPSAtMTsgICAgICAgICAgICAgICAgLyogQ29udHJvbCBzb2NrZXQgKi8KK3N0YXRpYyBpbnQgY29ubmVjdGVkID0gMDsgICAgICAgICAgICAgICAvKiBDb25uZWN0ZWQgdG8gRlRQIHNlcnZlciAqLworc3RhdGljIHNob3J0IGZ0cF9wb3J0ID0gMDsgICAgICAgICAgICAgIC8qIEZUUCBwb3J0ICovCisjaWZkZWYgRlRQSE9TVAorc3RhdGljIGludCBob3N0Y21kID0gMDsgICAgICAgICAgICAgICAgIC8qIEhhcyBIT1NUIGNvbW1hbmQgYmVlbiBzZW50ICovCisjZW5kaWYgLyogRlRQSE9TVCAqLworc3RhdGljIGludCBmb3JtLCBtb2RlLCBzdHJ1LCBieXRlc2l6ZSwgY3VydHlwZSA9IEZUVF9BU0M7CitzdGF0aWMgY2hhciBieXRlbmFtZVs4XTsKKworLyogRm9yIHBhcnNpbmcgcmVwbGllcyB0byBGVFAgc2VydmVyIGNvbW1hbmQgKi8KK3N0YXRpYyBjaGFyICpyZXBseV9wYXJzZSwgcmVwbHlfYnVmW0ZUUF9CVUZTSVpdLCAqcmVwbHlfcHRyOworCisjaWZkZWYgRlRQX1BST1hZCitzdGF0aWMgaW50IHByb3h5LCB1bml4X3Byb3h5CisjZW5kaWYgLyogRlRQX1BST1hZICovCisKK3N0YXRpYyBjaGFyIHBhc3ZbNjRdOyAgICAgICAgICAgICAgICAgICAvKiBQYXNzaXZlLW1vZGUgcG9ydCAqLworc3RhdGljIGludCBwYXNzaXZlbW9kZSA9IDA7CitzdGF0aWMgaW50IHNlbmRwb3J0ID0gMDsKK3N0YXRpYyBpbnQgc2VydmVydHlwZSA9IDA7ICAgICAgICAgICAgICAvKiBGVFAgc2VydmVyJ3MgT1MgdHlwZSAqLworCitzdGF0aWMgaW50IHRlc3RpbmcgPSAwOworc3RhdGljIGNoYXIgZnRwY21kYnVmW0ZUUF9CVUZTSVpdOworCisvKiBNYWNybyBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIFVDKGIpIGNraXRvYSgoKGludCliKSYweGZmKQorI2RlZmluZSBueih4KSAoKHgpID09IDAgPyAxIDogKHgpKQorCisvKiBDb21tYW5kIHRhYmxlcyBhbmQgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBGVFBfQUNDICAxICAgICAgICAgICAgICAgICAgICAgIC8qIEZUUCBjb21tYW5kIGtleXdvcmQgY29kZXMgKi8KKyNkZWZpbmUgRlRQX0FQUCAgMgorI2RlZmluZSBGVFBfQ1dEICAzCisjZGVmaW5lIEZUUF9DSE0gIDQKKyNkZWZpbmUgRlRQX0NMUyAgNQorI2RlZmluZSBGVFBfREVMICA2CisjZGVmaW5lIEZUUF9ESVIgIDcKKyNkZWZpbmUgRlRQX0dFVCAgOAorI2RlZmluZSBGVFBfSURMICA5CisjZGVmaW5lIEZUUF9NREUgMTAKKyNkZWZpbmUgRlRQX01ESSAxMQorI2RlZmluZSBGVFBfTUdFIDEyCisjZGVmaW5lIEZUUF9NS0QgMTMKKyNkZWZpbmUgRlRQX01PRCAxNAorI2RlZmluZSBGVFBfTVBVIDE1CisjZGVmaW5lIEZUUF9PUE4gMTYKKyNkZWZpbmUgRlRQX1BVVCAxNworI2RlZmluZSBGVFBfUFdEIDE4CisjZGVmaW5lIEZUUF9SR0UgMTkKKyNkZWZpbmUgRlRQX1JFTiAyMAorI2RlZmluZSBGVFBfUkVTIDIxCisjZGVmaW5lIEZUUF9ITFAgMjIKKyNkZWZpbmUgRlRQX1JNRCAyMworI2RlZmluZSBGVFBfU1RBIDI0CisjZGVmaW5lIEZUUF9TSVQgMjUKKyNkZWZpbmUgRlRQX1NJWiAyNgorI2RlZmluZSBGVFBfU1lTIDI3CisjZGVmaW5lIEZUUF9VTUEgMjgKKyNkZWZpbmUgRlRQX0dVUCAyOQorI2RlZmluZSBGVFBfVVNSIDMwCisjZGVmaW5lIEZUUF9RVU8gMzEKKyNkZWZpbmUgRlRQX1RZUCAzMgorI2RlZmluZSBGVFBfRkVBIDMzCisjZGVmaW5lIEZUUF9PUFQgMzQKKyNkZWZpbmUgRlRQX0NISyAzNQorI2RlZmluZSBGVFBfVkRJIDM2CisjZGVmaW5lIEZUUF9FTkEgMzcKKyNkZWZpbmUgRlRQX0RJUyAzOAorCitzdHJ1Y3Qga2V5dGFiIGdwcnRhYltdID0geyAgICAgICAgICAgICAgLyogR0VULVBVVC1SRU1PVEUga2V5d29yZHMgKi8KKyAgICB7ICJhdXRvIiwgICAgMiwgMCB9LAorICAgIHsgImZ0cCIsICAgICAxLCAwIH0sCisgICAgeyAia2VybWl0IiwgIDAsIDAgIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHFvcnBbXSA9IHsgICAgICAgICAvKiBRVUlUIG9yIFBST0NFRUQga2V5d29yZHMgKi8KKyAgICB7ICJwcm9jZWVkIiwgMCwgMCB9LCAgICAgICAgICAgICAgICAvKiAwID0gcHJvY2VlZCAqLworICAgIHsgInF1aXQiLCAgICAxLCAwIH0gICAgICAgICAgICAgICAgIC8qIDEgPSBxdWl0ICovCit9OworCitzdGF0aWMgc3RydWN0IGtleXRhYiBmdHBjbWR0YWJbXSA9IHsgICAgLyogRlRQIGNvbW1hbmQgdGFibGUgKi8KKyAgICB7ICJhY2NvdW50IiwgICBGVFBfQUNDLCAwIH0sCisgICAgeyAiYXBwZW5kIiwgICAgRlRQX0FQUCwgMCB9LAorICAgIHsgImJ5ZSIsICAgICAgIEZUUF9DTFMsIDAgfSwKKyAgICB7ICJjZCIsICAgICAgICBGVFBfQ1dELCAwIH0sCisgICAgeyAiY2R1cCIsICAgICAgRlRQX0dVUCwgMCB9LAorICAgIHsgImNoZWNrIiwgICAgIEZUUF9DSEssIDAgfSwKKyAgICB7ICJjaG1vZCIsICAgICBGVFBfQ0hNLCAwIH0sCisgICAgeyAiY2xvc2UiLCAgICAgRlRQX0NMUywgMCB9LAorICAgIHsgImN3ZCIsICAgICAgIEZUUF9DV0QsIENNX0lOViB9LAorICAgIHsgImRlbGV0ZSIsICAgIEZUUF9NREUsIDAgfSwKKyAgICB7ICJkaXJlY3RvcnkiLCBGVFBfRElSLCAwIH0sCisgICAgeyAiZGlzYWJsZSIsICAgRlRQX0RJUywgMCB9LAorICAgIHsgImVuYWJsZSIsICAgIEZUUF9FTkEsIDAgfSwKKyAgICB7ICJmZWF0dXJlcyIsICBGVFBfRkVBLCAwIH0sCisgICAgeyAiZ2V0IiwgICAgICAgRlRQX0dFVCwgMCB9LAorICAgIHsgImhlbHAiLCAgICAgIEZUUF9ITFAsIDAgfSwKKyAgICB7ICJpZGxlIiwgICAgICBGVFBfSURMLCAwIH0sCisgICAgeyAibG9naW4iLCAgICAgRlRQX1VTUiwgQ01fSU5WIH0sCisgICAgeyAibWRlbGV0ZSIsICAgRlRQX01ERSwgQ01fSU5WIH0sCisgICAgeyAibWdldCIsICAgICAgRlRQX01HRSwgMCB9LAorICAgIHsgIm1rZGlyIiwgICAgIEZUUF9NS0QsIDAgfSwKKyAgICB7ICJtb2R0aW1lIiwgICBGVFBfTU9ELCAwIH0sCisgICAgeyAibXB1dCIsICAgICAgRlRQX01QVSwgMCB9LAorICAgIHsgIm9wZW4iLCAgICAgIEZUUF9PUE4sIDAgfSwKKyAgICB7ICJvcHQiLCAgICAgICBGVFBfT1BULCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAib3B0cyIsICAgICAgRlRQX09QVCwgQ01fSU5WIH0sCisgICAgeyAib3B0aW9ucyIsICAgRlRQX09QVCwgMCB9LAorICAgIHsgInB1dCIsICAgICAgIEZUUF9QVVQsIDAgfSwKKyAgICB7ICJwd2QiLCAgICAgICBGVFBfUFdELCAwIH0sCisgICAgeyAicXVpdCIsICAgICAgRlRQX0NMUywgQ01fSU5WIH0sCisgICAgeyAicXVvdGUiLCAgICAgRlRQX1FVTywgMCB9LAorICAgIHsgInJlZ2V0IiwgICAgIEZUUF9SR0UsIDAgfSwKKyAgICB7ICJyZW5hbWUiLCAgICBGVFBfUkVOLCAwIH0sCisgICAgeyAicmVzZXQiLCAgICAgRlRQX1JFUywgMCB9LAorICAgIHsgInJtZGlyIiwgICAgIEZUUF9STUQsIDAgfSwKKyAgICB7ICJzZW5kIiwgICAgICBGVFBfUFVULCBDTV9JTlYgfSwKKyAgICB7ICJzaXRlIiwgICAgICBGVFBfU0lULCAwIH0sCisgICAgeyAic2l6ZSIsICAgICAgRlRQX1NJWiwgMCB9LAorICAgIHsgInN0YXR1cyIsICAgIEZUUF9TVEEsIDAgfSwKKyAgICB7ICJzeXN0ZW0iLCAgICBGVFBfU1lTLCAwIH0sCisgICAgeyAidHlwZSIsICAgICAgRlRQX1RZUCwgMCB9LAorICAgIHsgInVtYXNrIiwgICAgIEZUUF9VTUEsIDAgfSwKKyAgICB7ICJ1cCIsICAgICAgICBGVFBfR1VQLCBDTV9JTlYgfSwKKyAgICB7ICJ1c2VyIiwgICAgICBGVFBfVVNSLCAwIH0sCisgICAgeyAidmRpcmVjdG9yeSIsRlRQX1ZESSwgMCB9LAorICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmZ0cGNtZCA9IChzaXplb2YoZnRwY21kdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCisjZGVmaW5lIE9QTl9BTk8gMQkJCS8qIEZUUCBPUEVOIHN3aXRjaCBjb2RlcyAqLworI2RlZmluZSBPUE5fUFNXIDIKKyNkZWZpbmUgT1BOX1VTUiAzCisjZGVmaW5lIE9QTl9BQ0MgNAorI2RlZmluZSBPUE5fQUNUIDUKKyNkZWZpbmUgT1BOX1BTViA2CisjZGVmaW5lIE9QTl9UTFMgNworI2RlZmluZSBPUE5fTklOIDgKKyNkZWZpbmUgT1BOX05PTCA5CisKKyNpZmRlZiBGVFBfU0VDVVJJVFkKKyNpZmRlZiBDS19TU0wKKyNkZWZpbmUgVVNFVExTVEFCCitzdGF0aWMgc3RydWN0IGtleXRhYiB0bHN0YWJbXSA9IHsgICAgICAgLyogRlRQIFNTTC9UTFMgc3dpdGNoZXMgKi8KKyAgICB7ICIvc3NsIiwgICAgICAgT1BOX1RMUywgMCAgICB9LAorICAgIHsgIi90bHMiLCAgICAgICBPUE5fVExTLCAwICAgIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBudGxzdGFiID0gKHNpemVvZih0bHN0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogRlRQX1NFQ1VSSVRZICovCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGZ0cHN3aXRhYltdID0geyAgICAvKiBGVFAgY29tbWFuZCBzd2l0Y2hlcyAqLworICAgIHsgIi9hY2NvdW50IiwgICBPUE5fQUNDLCBDTV9BUkcgfSwKKyAgICB7ICIvYWN0aXZlIiwgICAgT1BOX0FDVCwgMCAgICAgIH0sCisgICAgeyAiL2Fub255bW91cyIsIE9QTl9BTk8sIDAgICAgICB9LAorICAgIHsgIi9ub2luaXQiLCAgICBPUE5fTklOLCAwICAgICAgfSwKKyAgICB7ICIvbm9sb2dpbiIsICAgT1BOX05PTCwgMCAgICAgIH0sCisgICAgeyAiL3Bhc3NpdmUiLCAgIE9QTl9QU1YsIDAgICAgICB9LAorICAgIHsgIi9wYXNzd29yZCIsICBPUE5fUFNXLCBDTV9BUkcgfSwKKyAgICB7ICIvdXNlciIsICAgICAgT1BOX1VTUiwgQ01fQVJHIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuZnRwc3dpID0gKHNpemVvZihmdHBzd2l0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKKy8qIEZUUCB7IEVOQUJMRSwgRElTQUJMRSB9IGl0ZW1zICovCisKKyNkZWZpbmUgRU5BX0ZFQVQgMQorI2RlZmluZSBFTkFfTURUTSAyCisjZGVmaW5lIEVOQV9NTFNUIDMKKyNkZWZpbmUgRU5BX1NJWkUgNAorI2RlZmluZSBFTkFfQVVUSCA1CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGZ0cGVuYXRhYltdID0geworICAgIHsgIkFVVEgiLCAgRU5BX0FVVEgsIDAgfSwKKyAgICB7ICJGRUFUIiwgIEVOQV9GRUFULCAwIH0sCisgICAgeyAiTURUTSIsICBFTkFfTURUTSwgMCB9LAorICAgIHsgIk1MIiwgICAgRU5BX01MU1QsIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJNTFMiLCAgIEVOQV9NTFNULCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiTUxTRCIsICBFTkFfTUxTVCwgQ01fSU5WIH0sCisgICAgeyAiTUxTVCIsICBFTkFfTUxTVCwgMCB9LAorICAgIHsgIlNJWkUiLCAgRU5BX1NJWkUsIDAgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5mdHBlbmEgPSAoc2l6ZW9mKGZ0cGVuYXRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworLyogU0VUIEZUUCBjb21tYW5kIGtleXdvcmQgaW5kaWNlcyAqLworCisjZGVmaW5lIEZUU19BVVQgIDEgICAgICAgICAgICAgICAgICAgICAgLyogQXV0b2F1dGhlbnRpY2F0aW9uICovCisjZGVmaW5lIEZUU19DUlkgIDIgICAgICAgICAgICAgICAgICAgICAgLyogRW5jcnlwdGlvbiAqLworI2RlZmluZSBGVFNfTE9HICAzICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dG9sb2dpbiAqLworI2RlZmluZSBGVFNfQ1BMICA0ICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgcHJvdGVjdGlvbiBsZXZlbCAqLworI2RlZmluZSBGVFNfQ0ZXICA1ICAgICAgICAgICAgICAgICAgICAgIC8qIENyZWRlbnRpYWxzIGZvcndhcmRpbmcgKi8KKyNkZWZpbmUgRlRTX0RQTCAgNiAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIHByb3RlY3Rpb24gbGV2ZWwgKi8KKyNkZWZpbmUgRlRTX0RCRyAgNyAgICAgICAgICAgICAgICAgICAgICAvKiBEZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgRlRTX1BTViAgOCAgICAgICAgICAgICAgICAgICAgICAvKiBQYXNzaXZlIG1vZGUgKi8KKyNkZWZpbmUgRlRTX1NQQyAgOSAgICAgICAgICAgICAgICAgICAgICAvKiBTZW5kIHBvcnQgY29tbWFuZHMgKi8KKyNkZWZpbmUgRlRTX1RZUCAxMCAgICAgICAgICAgICAgICAgICAgICAvKiAoZmlsZSkgVHlwZSAqLworI2RlZmluZSBGVFNfVVNOIDExICAgICAgICAgICAgICAgICAgICAgIC8qIFVuaXF1ZSBzZXJ2ZXIgbmFtZXMgKGZvciBmaWxlcykgKi8KKyNkZWZpbmUgRlRTX1ZCTSAxMiAgICAgICAgICAgICAgICAgICAgICAvKiBWZXJib3NlIG1vZGUgKi8KKyNkZWZpbmUgRlRTX0FUUCAxMyAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiB0eXBlICovCisjZGVmaW5lIEZUU19DTlYgMTQgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZW5hbWUgY29udmVyc2lvbiAqLworI2RlZmluZSBGVFNfVFNUIDE1ICAgICAgICAgICAgICAgICAgICAgIC8qIFRlc3QgKHByb2dyZXNzKSBtZXNzYWdlcyAqLworI2RlZmluZSBGVFNfUFJNIDE2ICAgICAgICAgICAgICAgICAgICAgIC8qIChmaWxlKSBQZXJtaXNzaW9ucyAqLworI2RlZmluZSBGVFNfWExBIDE3ICAgICAgICAgICAgICAgICAgICAgIC8qIENoYXJzZXQgdHJhbnNsYXRpb24gKi8KKyNkZWZpbmUgRlRTX0NTUiAxOCAgICAgICAgICAgICAgICAgICAgICAvKiBTZXJ2ZXIgY2hhcnNldCAqLworI2RlZmluZSBGVFNfRVJSIDE5ICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yIGFjdGlvbiAqLworI2RlZmluZSBGVFNfRk5DIDIwICAgICAgICAgICAgICAgICAgICAgIC8qIENvbGxpc2lvbiAqLworI2RlZmluZSBGVFNfU1JQIDIxICAgICAgICAgICAgICAgICAgICAgIC8qIFNSUCBvcHRpb25zICovCisjZGVmaW5lIEZUU19HRlQgMjIgICAgICAgICAgICAgICAgICAgICAgLyogR0VUIGF1dG9tYXRpYyBmaWxlLXR5cGUgc3dpdGNoaW5nICovCisjZGVmaW5lIEZUU19EQVQgMjMgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGZpbGUgZGF0ZXMgKi8KKyNkZWZpbmUgRlRTX1NUTyAyNAkJCS8qIFNlcnZlciB0aW1lIG9mZnNldCAqLworI2RlZmluZSBGVFNfQVBXIDI1CQkJLyogQW5vbnltb3VzIHBhc3N3b3JkICovCisjZGVmaW5lIEZUU19ESVMgMjYJCQkvKiBGaWxlLXRyYW5zZmVyIGRpc3BsYXkgc3R5bGUgKi8KKyNkZWZpbmUgRlRTX0JVRyAyNyAgICAgICAgICAgICAgICAgICAgICAvKiBCdWcocykgKi8KKworLyogRlRQIEJVR1MgKi8KKworI2RlZmluZSBGVEJfU1YyICAxICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBTU0x2MiAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBmdHBidWd0YWJbXSA9IHsKKyAgICB7ICJ1c2Utc3NsLXYyIiwgICAgIEZUQl9TVjIsICAgICAgICAwIH0KK307CitzdGF0aWMgaW50IG5mdHBidWcgPSAoc2l6ZW9mKGZ0cGJ1Z3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCisvKiBGVFAgUFVUIG9wdGlvbnMgKG11dHVhbGx5IGV4Y2x1c2l2ZSwgbm90IGEgYml0bWFzaykgKi8KKworI2RlZmluZSBQVVRfVVBEIDEgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSAqLworI2RlZmluZSBQVVRfUkVTIDIgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RhcnQgKi8KKyNkZWZpbmUgUFVUX1NJTSA0ICAgICAgICAgICAgICAgICAgICAgICAvKiBTaW11bGF0aW9uICovCisjZGVmaW5lIFBVVF9ESUYgOAkJCS8qIERhdGVzIERpZmZlciAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBmdHBjb2x4dGFiW10gPSB7IC8qIFNFVCBGVFAgQ09MTElTSU9OIG9wdGlvbnMgKi8KKyNpZm5kZWYgTUFDCisgICAgeyAiYXBwZW5kIiwgICAgWFlGWF9BLCAwIH0sICAgICAgICAgLyogYXBwZW5kIHRvIG9sZCBmaWxlICovCisjZW5kaWYgLyogTUFDICovCisjaWZkZWYgQ09NTUVOVAorICAgIHsgImFzayIsICAgICAgIFhZRlhfUSwgMCB9LCAgICAgICAgIC8qIGFzayB3aGF0IHRvIGRvIChub3QgaW1wbGVtZW50ZWQpICovCisjZW5kaWYKKyAgICB7ICJiYWNrdXAiLCAgICBYWUZYX0IsIDAgfSwgICAgICAgICAvKiByZW5hbWUgb2xkIGZpbGUgKi8KKyNpZm5kZWYgTUFDCisgICAgeyAiZGF0ZXMtZGlmZmVyIiwgWFlGWF9NLCAwIH0sCS8qIGFjY2VwdCBpZiBkYXRlcyBkaWZmZXIgKi8KKyAgICB7ICJkaXNjYXJkIiwgICBYWUZYX0QsIDAgfSwgICAgICAgICAvKiBkb24ndCBhY2NlcHQgbmV3IGZpbGUgKi8KKyAgICB7ICJuby1zdXBlcnNlZGUiLCBYWUZYX0QsIENNX0lOViB9LCAvKiBkaXR0byAoTVNLIGNvbXBhdGliaWxpdHkpICovCisjZW5kaWYgLyogTUFDICovCisgICAgeyAib3ZlcndyaXRlIiwgWFlGWF9YLCAwIH0sICAgICAgICAgLyogb3ZlcndyaXRlIHRoZSBvbGQgZmlsZSAqLworICAgIHsgInJlbmFtZSIsICAgIFhZRlhfUiwgMCB9LCAgICAgICAgIC8qIHJlbmFtZSB0aGUgaW5jb21pbmcgZmlsZSAqLworI2lmbmRlZiBNQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgY3Jhc2hlcyBNYWMgS2VybWl0LiAqLworICAgIHsgInVwZGF0ZSIsICAgIFhZRlhfVSwgMCB9LCAgICAgICAgIC8qIHJlcGxhY2UgaWYgbmV3ZXIgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5mdHBjb2x4ID0gKHNpemVvZihmdHBjb2x4dGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCisKKyNpZmRlZiBGVFBfU0VDVVJJVFkKKy8qIEZUUCBhdXRoZW50aWNhdGlvbiBvcHRpb25zICovCisKKyNkZWZpbmUgRlRBX0FVVE8gMCAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvICovCisjZGVmaW5lIEZUQV9TUlAgIDEgICAgICAgICAgICAgICAgICAgICAgLyogU1JQICovCisjZGVmaW5lIEZUQV9HSzUgIDIgICAgICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgNSAqLworI2RlZmluZSBGVEFfSzQgICAzICAgICAgICAgICAgICAgICAgICAgIC8qIEtlcmJlcm9zIDQgKi8KKyNkZWZpbmUgRlRBX1NTTCAgNCAgICAgICAgICAgICAgICAgICAgICAvKiBTU0wgKi8KKyNkZWZpbmUgRlRBX1RMUyAgNSAgICAgICAgICAgICAgICAgICAgICAvKiBUTFMgKi8KKworLyogRlRQIGF1dGhlbnRpY2F0aW9uIHR5cGVzICovCisKKyNkZWZpbmUgRlRQQVRZUFMgOAorc3RhdGljIGludCBmdHBfYXV0aF90eXBlW0ZUUEFUWVBTXSA9IHsKKyNpZmRlZiBGVFBfR1NTQVBJCisgICAgRlRBX0dLNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR1NTQVBJIEtlcmJlcm9zIDUgKi8KKyNlbmRpZiAvKiBGVFBfR0s1ICovCisjaWZkZWYgRlRQX1NSUAorICAgIEZUQV9TUlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNSUCAqLworI2VuZGlmIC8qIEZUUF9TUlAgKi8KKyNpZmRlZiBGVFBfS1JCNAorICAgIEZUQV9LNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtlcmJlcm9zIDQgKi8KKyNlbmRpZiAvKiBGVFBfS1JCNCAqLworI2lmZGVmIENLX1NTTAorICAgIEZUQV9UTFMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRMUyAqLworICAgIEZUQV9TU0wsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNTTCAqLworI2VuZGlmIC8qIENLX1NTTCAqLworICAgIDAKK307CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGZ0cGF1dGhbXSA9IHsgICAgICAvKiBTRVQgRlRQIEFVVEhUWVBFIGNtZCB0YWJsZSAqLworICAgIHsgImF1dG9tYXRpYyIsIEZUQV9BVVRPLCAgQ01fSU5WIH0sCisjaWZkZWYgRlRQX0dTU0FQSQorICAgIHsgImdzc2FwaS1rcmI1IiwgRlRBX0dLNSwgMCB9LAorI2VuZGlmIC8qIEZUUF9HU1NBUEkgKi8KKyNpZmRlZiBGVFBfS1JCNAorICAgIHsgIms0IiwgICAgICAgRlRBX0s0LCAgICAgQ01fSU5WIH0sCisjZW5kaWYgLyogRlRQX0tSQjQgKi8KKyNpZmRlZiBGVFBfR1NTQVBJCisgICAgeyAiazUiLCAgICAgICAgRlRBX0dLNSwgICBDTV9JTlYgfSwKKyNlbmRpZiAvKiBGVFBfR1NTQVBJICovCisjaWZkZWYgRlRQX0tSQjQKKyAgICB7ICJrZXJiZXJvczQiLCBGVEFfSzQsICAgIDAgfSwKKyNlbmRpZiAvKiBGVFBfS1JCNCAqLworI2lmZGVmIEZUUF9HU1NBUEkKKyAgICB7ICJrZXJiZXJvczUiLCBGVEFfR0s1LCAgIENNX0lOViB9LAorI2VuZGlmIC8qIEZUUF9HU1NBUEkgKi8KKyNpZmRlZiBGVFBfS1JCNAorICAgIHsgImtlcmJlcm9zX2l2IixGVEFfSzQsICAgQ01fSU5WIH0sCisjZW5kaWYgLyogRlRQX0tSQjQgKi8KKyNpZmRlZiBGVFBfR1NTQVBJCisgICAgeyAia2VyYmVyb3NfdiIsIEZUQV9HSzUsICBDTV9JTlYgfSwKKyNlbmRpZiAvKiBGVFBfR1NTQVBJICovCisjaWZkZWYgRlRQX0tSQjQKKyAgICB7ICJrcmI0IiwgICAgIEZUQV9LNCwgICAgIENNX0lOViB9LAorI2VuZGlmIC8qIEZUUF9LUkI0ICovCisjaWZkZWYgRlRQX0dTU0FQSQorICAgIHsgImtyYjUiLCAgICAgRlRBX0dLNSwgICAgQ01fSU5WIH0sCisjZW5kaWYgLyogRlRQX0dTU0FQSSAqLworI2lmZGVmIEZUUF9TUlAKKyAgICB7ICJzcnAiLCAgICAgIEZUQV9TUlAsICAgICAwIH0sCisjZW5kaWYgLyogRlRQX1NSUCAqLworI2lmZGVmIENLX1NTTAorICAgIHsgInNzbCIsICAgICAgRlRBX1NTTCwgICAgIDAgfSwKKyAgICB7ICJ0bHMiLCAgICAgIEZUQV9UTFMsICAgICAwIH0sCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuZnRwYXV0aCA9IChzaXplb2YoZnRwYXV0aCkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworI2lmZGVmIEZUUF9TUlAKKyNkZWZpbmUgU1JQX0NJUEhFUiAxCisjZGVmaW5lIFNSUF9IQVNIICAgMgorc3RhdGljIHN0cnVjdCBrZXl0YWIgZnRwc3JwW10gPSB7ICAgICAgLyogU0VUIEZUUCBTUlAgY29tbWFuZCB0YWJsZSAqLworICAgIHsgImNpcGhlciIsICAgU1JQX0NJUEhFUiwgICAgIDAgfSwKKyAgICB7ICJoYXNoIiwgICAgIFNSUF9IQVNILCAgICAgICAwIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuZnRwc3JwID0gKHNpemVvZihmdHBzcnApIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisjZW5kaWYgLyogRlRQX1NSUCAqLworI2VuZGlmIC8qIEZUUF9TRUNVUklUWSAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBmdHBzZXRbXSA9IHsgICAgICAgLyogU0VUIEZUUCBjb21tbWFuZCB0YWJsZSAqLworICAgIHsgImFub255bW91cy1wYXNzd29yZCIsICAgICAgIEZUU19BUFcsIDAgfSwKKyNpZmRlZiBGVFBfU0VDVVJJVFkKKyAgICB7ICJhdXRodHlwZSIsICAgICAgICAgICAgICAgICBGVFNfQVRQLCAwIH0sCisgICAgeyAiYXV0b2F1dGhlbnRpY2F0aW9uIiwgICAgICAgRlRTX0FVVCwgMCB9LAorICAgIHsgImF1dG9lbmNyeXB0aW9uIiwgICAgICAgICAgIEZUU19DUlksIDAgfSwKKyNlbmRpZiAvKiBGVFBfU0VDVVJJVFkgKi8KKyAgICB7ICJhdXRvbG9naW4iLCAgICAgICAgICAgICAgICBGVFNfTE9HLCAwIH0sCisgICAgeyAiYnVnIiwgICAgICAgICAgICAgICAgICAgICAgRlRTX0JVRywgMCB9LAorI2lmbmRlZiBOT0NTRVRTCisgICAgeyAiY2hhcmFjdGVyLXNldC10cmFuc2xhdGlvbiIsRlRTX1hMQSwgMCB9LAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICB7ICJjb2xsaXNpb24iLCAgICAgICAgICAgICAgICBGVFNfRk5DLCAwIH0sCisjaWZkZWYgRlRQX1NFQ1VSSVRZCisgICAgeyAiY29tbWFuZC1wcm90ZWN0aW9uLWxldmVsIiwgRlRTX0NQTCwgMCB9LAorICAgIHsgImNwbCIsICAgICAgICAgICAgICAgICAgICAgIEZUU19DUEwsIENNX0lOViB9LAorICAgIHsgImNyZWRlbnRpYWwtZm9yd2FyZGluZyIsICAgIEZUU19DRlcsIDAgfSwKKyAgICB7ICJkYSIsICAgICAgICAgICAgICAgICAgICAgICBGVFNfREFULCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiZGF0YS1wcm90ZWN0aW9uLWxldmVsIiwgICAgRlRTX0RQTCwgMCB9LAorI2VuZGlmIC8qIEZUUF9TRUNVUklUWSAqLworICAgIHsgImRhdGVzIiwgICAgICAgICAgICAgICAgICAgIEZUU19EQVQsIDAgfSwKKyAgICB7ICJkZWJ1ZyIsICAgICAgICAgICAgICAgICAgICBGVFNfREJHLCAwIH0sCisgICAgeyAiZGlzcGxheSIsICAgICAgICAgICAgICAgICAgRlRTX0RJUywgMCB9LAorI2lmZGVmIEZUUF9TRUNVUklUWQorICAgIHsgImRwbCIsICAgICAgICAgICAgICAgICAgICAgIEZUU19EUEwsIENNX0lOViB9LAorI2VuZGlmIC8qIEZUUF9TRUNVUklUWSAqLworICAgIHsgImVycm9yLWFjdGlvbiIsICAgICAgICAgICAgIEZUU19FUlIsIDAgfSwKKyAgICB7ICJmaWxlbmFtZXMiLCAgICAgICAgICAgICAgICBGVFNfQ05WLCAwIH0sCisgICAgeyAiZ2V0LWZpbGV0eXBlLXN3aXRjaGluZyIsICAgRlRTX0dGVCwgMCB9LAorICAgIHsgInBhc3NpdmUtbW9kZSIsICAgICAgICAgICAgIEZUU19QU1YsIDAgfSwKKyAgICB7ICJwYXN2IiwgICAgICAgICAgICAgICAgICAgICBGVFNfUFNWLCBDTV9JTlYgfSwKKyAgICB7ICJwZXJtaXNzaW9ucyIsICAgICAgICAgICAgICBGVFNfUFJNLCAwIH0sCisgICAgeyAicHJvZ3Jlc3MtbWVzc2FnZXMiLCAgICAgICAgRlRTX1RTVCwgMCB9LAorICAgIHsgInNlbmQtcG9ydC1jb21tYW5kcyIsICAgICAgIEZUU19TUEMsIDAgfSwKKyNpZm5kZWYgTk9DU0VUUworICAgIHsgInNlcnZlci1jaGFyYWN0ZXItc2V0IiwgICAgIEZUU19DU1IsIDAgfSwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgeyAic2VydmVyLXRpbWUtb2Zmc2V0IiwgICAgICAgRlRTX1NUTywgMCB9LAorI2lmZGVmIEZUUF9TUlAKKyAgICB7ICJzcnAiLCAgICAgICAgICAgICAgICAgICAgICBGVFNfU1JQLCAwIH0sCisjZWxzZQorICAgIHsgInNycCIsICAgICAgICAgICAgICAgICAgICAgIEZUU19TUlAsIENNX0lOViB9LAorI2VuZGlmIC8qIEZUUF9TUlAgKi8KKyAgICB7ICJ0eXBlIiwgICAgICAgICAgICAgICAgICAgICBGVFNfVFlQLCAwIH0sCisgICAgeyAidW5pcXVlLXNlcnZlci1uYW1lcyIsICAgICAgRlRTX1VTTiwgMCB9LAorICAgIHsgInZlcmJvc2UtbW9kZSIsICAgICAgICAgICAgIEZUU19WQk0sIDAgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5mdHBzZXQgPSAoc2l6ZW9mKGZ0cHNldCkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworLyoKKyAgR0VUIGFuZCBQVVQgc3dpdGNoZXMgYXJlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgYXMgS2VybWl0IEdFVCBhbmQgU0VORCwKKyAgYW5kIHVzZSB0aGUgc2FtZSBTTkRfeHh4IGRlZmluaXRpb25zLCBidXQgaGlqYWNrIGEgY291cGxlIGZvciBGVFAgdXNlLgorICBEb24ndCBqdXN0IG1ha2UgdXAgbmV3IG9uZXMsIHNpbmNlIHRoZSBudW1iZXIgb2YgU05EX3h4eCBvcHRpb25zIG11c3QgYmUKKyAga25vd24gaW4gYWR2YW5jZSBmb3IgdGhlIHN3aXRjaC1wYXJzaW5nIGFycmF5cy4KKyovCisjZGVmaW5lIFNORF9VU04gU05EX1BSTyAgICAgICAgICAgICAgICAgLyogL1VOSVFVRSBpbnN0ZWFkIG9mIC9QUk9UT0NPTCAqLworI2RlZmluZSBTTkRfUFJNIFNORF9QSVAgICAgICAgICAgICAgICAgIC8qIC9QRVJNSVNTSU9OUyBpbnN0ZWFkIG9mIC9QSVBFUyAqLworI2RlZmluZSBTTkRfVEVOIFNORF9DQUwgICAgICAgICAgICAgICAgIC8qIC9URU5FWCBpbnN0ZWFkIG9mIC9DQUxJQlJBVEUgKi8KKworc3RhdGljIHN0cnVjdCBrZXl0YWIgcHV0c3dpW10gPSB7ICAgICAgIC8qIEZUUCBQVVQgc3dpdGNoIHRhYmxlICovCisgICAgeyAiL2FmdGVyIiwgICAgICAgICAgICAgICAgU05EX0FGVCwgQ01fQVJHIH0sCisjaWZkZWYgUFVUQVJSQVkKKyAgICB7ICIvYXJyYXkiLCAgICAgICAgICAgICAgICBTTkRfQVJSLCBDTV9BUkcgfSwKKyNlbmRpZiAvKiBQVVRBUlJBWSAqLworICAgIHsgIi9hcyIsICAgICAgICAgICAgICAgICAgIFNORF9BU04sIENNX0FSR3xDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiL2FzLW5hbWUiLCAgICAgICAgICAgICAgU05EX0FTTiwgQ01fQVJHIH0sCisgICAgeyAiL2FzY2lpIiwgICAgICAgICAgICAgICAgU05EX1RYVCwgQ01fSU5WIH0sCisgICAgeyAiL2IiLCAgICAgICAgICAgICAgICAgICAgU05EX0JJTiwgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgIi9iZWZvcmUiLCAgICAgICAgICAgICAgIFNORF9CRUYsIENNX0FSRyB9LAorICAgIHsgIi9iaW5hcnkiLCAgICAgICAgICAgICAgIFNORF9CSU4sIDAgfSwKKyNpZmRlZiBQVVRQSVBFCisgICAgeyAiL2NvbW1hbmQiLCAgICAgICAgICAgICAgU05EX0NNRCwgQ01fUFNIIH0sCisjZW5kaWYgLyogUFVUUElQRSAqLworI2lmZGVmIENPTU1FTlQKKy8qIFRoaXMgd29ya3MgYnV0IGl0J3MgZGFuZ2Vyb3VzICovCisjaWZkZWYgRE9VUERBVEUKKyAgICB7ICIvZGF0ZXMtZGlmZmVyIiwgICAgICAgICBTTkRfRElGLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBET1VQREFURSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB7ICIvZGVsZXRlIiwgICAgICAgICAgICAgICBTTkRfREVMLCAwIH0sCisjaWZkZWYgVU5JWE9ST1NLCisgICAgeyAiL2RvdGZpbGVzIiwgICAgICAgICAgICAgU05EX0RPVCwgMCB9LAorI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworICAgIHsgIi9lcnJvci1hY3Rpb24iLCAgICAgICAgIFNORF9FUlIsIENNX0FSRyB9LAorICAgIHsgIi9leGNlcHQiLCAgICAgICAgICAgICAgIFNORF9FWEMsIENNX0FSRyB9LAorICAgIHsgIi9maWxlbmFtZXMiLCAgICAgICAgICAgIFNORF9OQU0sIENNX0FSRyB9LAorI2lmZGVmIFBJUEVTRU5ECisjaWZuZGVmIE5PU1BMCisgICAgeyAiL2ZpbHRlciIsICAgICAgICAgICAgICAgU05EX0ZMVCwgQ01fQVJHfENNX1BTSCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyNpZmRlZiBDS1NZTUxJTksKKyAgICB7ICIvZm9sbG93bGlua3MiLCAgICAgICAgICBTTkRfTE5LLCAwIH0sCisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisjaWZkZWYgVk1TCisgICAgeyAiL2ltYWdlIiwgICAgICAgICAgICAgICAgU05EX0lNRywgMCB9LAorI2Vsc2UKKyAgICB7ICIvaW1hZ2UiLCAgICAgICAgICAgICAgICBTTkRfQklOLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBWTVMgKi8KKyAgICB7ICIvbGFyZ2VyLXRoYW4iLCAgICAgICAgICBTTkRfTEFSLCBDTV9BUkcgfSwKKyAgICB7ICIvbGlzdGZpbGUiLCAgICAgICAgICAgICBTTkRfRklMLCBDTV9BUkcgfSwKKyNpZm5kZWYgTk9DU0VUUworICAgIHsgIi9sb2NhbC1jaGFyYWN0ZXItc2V0IiwgIFNORF9DU0wsIENNX0FSRyB9LAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyNpZmRlZiBDS19UTVBESVIKKyAgICB7ICIvbW92ZS10byIsICAgICAgICAgICAgICBTTkRfTU9WLCBDTV9BUkcgfSwKKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKyAgICB7ICIvbm9iYWNrdXBmaWxlcyIsICAgICAgICBTTkRfTk9CLCAwIH0sCisjaWZkZWYgVU5JWE9ST1NLCisgICAgeyAiL25vZG90ZmlsZXMiLCAgICAgICAgICAgU05EX05PRCwgMCB9LAorI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworI2lmZGVmIENLU1lNTElOSworICAgIHsgIi9ub2ZvbGxvd2xpbmtzIiwgICAgICAgIFNORF9OTEssIDAgfSwKKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKworICAgIHsgIi9ub3QtYWZ0ZXIiLCAgICAgICAgICAgIFNORF9OQUYsIENNX0FSRyB9LAorICAgIHsgIi9ub3QtYmVmb3JlIiwgICAgICAgICAgIFNORF9OQkUsIENNX0FSRyB9LAorI2lmZGVmIFVOSVgKKyAgICB7ICIvcGVybWlzc2lvbnMiLCAgICAgICAgICBTTkRfUFJNLCBDTV9BUkcgfSwKKyNlbHNlCisgICAgeyAiL3Blcm1pc3Npb25zIiwgICAgICAgICAgU05EX1BSTSwgQ01fQVJHfENNX0lOViB9LAorI2VuZGlmIC8qIFVOSVggKi8KKyAgICB7ICIvcXVpZXQiLCAgICAgICAgICAgICAgICBTTkRfU0hILCAwIH0sCisjaWZkZWYgRlRQX1JFU1RBUlQKKyAgICB7ICIvcmVjb3ZlciIsICAgICAgICAgICAgICBTTkRfUkVTLCAwIH0sCisjZW5kaWYgLyogRlRQX1JFU1RBUlQgKi8KKyNpZmRlZiBSRUNVUlNJVkUKKyAgICB7ICIvcmVjdXJzaXZlIiwgICAgICAgICAgICBTTkRfUkVDLCAwIH0sCisjZW5kaWYgLyogUkVDVVJTSVZFICovCisgICAgeyAiL3JlbmFtZS10byIsICAgICAgICAgICAgU05EX1JFTiwgQ01fQVJHIH0sCisjaWZkZWYgRlRQX1JFU1RBUlQKKyAgICB7ICIvcmVzdGFydCIsICAgICAgICAgICAgICBTTkRfUkVTLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBGVFBfUkVTVEFSVCAqLworI2lmbmRlZiBOT0NTRVRTCisgICAgeyAiL3NlcnZlci1jaGFyYWN0ZXItc2V0IiwgU05EX0NTUiwgQ01fQVJHIH0sCisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgIHsgIi9zZXJ2ZXItcmVuYW1lLXRvIiwgICAgIFNORF9TUk4sIENNX0FSRyB9LAorICAgIHsgIi9zaW11bGF0ZSIsICAgICAgICAgICAgIFNORF9TSU0sIDAgfSwKKyAgICB7ICIvc2luY2UiLCAgICAgICAgICAgICAgICBTTkRfQUZULCBDTV9JTlZ8Q01fQVJHIH0sCisgICAgeyAiL3NtYWxsZXItdGhhbiIsICAgICAgICAgU05EX1NNQSwgQ01fQVJHIH0sCisjaWZkZWYgQ09NTUVOVAorICAgIHsgIi9zdGFydGluZy1hdCIsICAgICAgICAgIFNORF9TVEEsIENNX0FSRyB9LAorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBSRUNVUlNJVkUKKyAgICB7ICIvc3ViZGlyZWN0b3JpZXMiLCAgICAgICBTTkRfUkVDLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICB7ICIvdGVuZXgiLCAgICAgICAgICAgICAgICBTTkRfVEVOLCAwIH0sCisgICAgeyAiL3RleHQiLCAgICAgICAgICAgICAgICAgU05EX1RYVCwgMCB9LAorI2lmbmRlZiBOT0NTRVRTCisgICAgeyAiL3RyYW5zcGFyZW50IiwgICAgICAgICAgU05EX1hQQSwgMCB9LAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICB7ICIvdHlwZSIsICAgICAgICAgICAgICAgICBTTkRfVFlQLCBDTV9BUkcgfSwKKyNpZmRlZiBET1VQREFURQorICAgIHsgIi91cGRhdGUiLCAgICAgICAgICAgICAgIFNORF9VUEQsIDAgfSwKKyNlbmRpZiAvKiBET1VQREFURSAqLworICAgIHsgIi91bmlxdWUtc2VydmVyLW5hbWVzIiwgIFNORF9VU04sIDAgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5wdXRzd2kgPSAoc2l6ZW9mKHB1dHN3aSkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgZ2V0c3dpW10gPSB7ICAgICAgIC8qIEZUUCBbTV1HRVQgc3dpdGNoIHRhYmxlICovCisgICAgeyAiL2FmdGVyIiwgICAgICAgICAgICAgICAgU05EX0FGVCwgQ01fSU5WIH0sCisgICAgeyAiL2FzIiwgICAgICAgICAgICAgICAgICAgU05EX0FTTiwgQ01fQVJHfENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICIvYXMtbmFtZSIsICAgICAgICAgICAgICBTTkRfQVNOLCBDTV9BUkcgfSwKKyAgICB7ICIvYXNjaWkiLCAgICAgICAgICAgICAgICBTTkRfVFhULCBDTV9JTlYgfSwKKyAgICB7ICIvYmVmb3JlIiwgICAgICAgICAgICAgICBTTkRfQkVGLCBDTV9JTlYgfSwKKyAgICB7ICIvYmluYXJ5IiwgICAgICAgICAgICAgICBTTkRfQklOLCAwIH0sCisgICAgeyAiL2NvbGxpc2lvbiIsICAgICAgICAgICAgU05EX0NPTCwgQ01fQVJHIH0sCisjaWZkZWYgUFVUUElQRQorICAgIHsgIi9jb21tYW5kIiwgICAgICAgICAgICAgIFNORF9DTUQsIENNX1BTSCB9LAorI2VuZGlmIC8qIFBVVFBJUEUgKi8KKyAgICB7ICIvZGVsZXRlIiwgICAgICAgICAgICAgICBTTkRfREVMLCAwIH0sCisgICAgeyAiL2Vycm9yLWFjdGlvbiIsICAgICAgICAgU05EX0VSUiwgQ01fQVJHIH0sCisgICAgeyAiL2V4Y2VwdCIsICAgICAgICAgICAgICAgU05EX0VYQywgQ01fQVJHIH0sCisgICAgeyAiL2ZpbGVuYW1lcyIsICAgICAgICAgICAgU05EX05BTSwgQ01fQVJHIH0sCisjaWZkZWYgUElQRVNFTkQKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICIvZmlsdGVyIiwgICAgICAgICAgICAgICBTTkRfRkxULCBDTV9BUkd8Q01fUFNIIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworI2lmZGVmIFZNUworICAgIHsgIi9pbWFnZSIsICAgICAgICAgICAgICAgIFNORF9JTUcsIDAgfSwKKyNlbHNlCisgICAgeyAiL2ltYWdlIiwgICAgICAgICAgICAgICAgU05EX0JJTiwgQ01fSU5WIH0sCisjZW5kaWYgLyogVk1TICovCisgICAgeyAiL2xhcmdlci10aGFuIiwgICAgICAgICAgU05EX0xBUiwgQ01fQVJHIH0sCisgICAgeyAiL2xpc3RmaWxlIiwgICAgICAgICAgICAgU05EX0ZJTCwgQ01fQVJHIH0sCisjaWZuZGVmIE5PQ1NFVFMKKyAgICB7ICIvbG9jYWwtY2hhcmFjdGVyLXNldCIsICBTTkRfQ1NMLCBDTV9BUkcgfSwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgeyAiL21hdGNoIiwgICAgICAgICAgICAgICAgU05EX1BBVCwgQ01fQVJHIH0sCisgICAgeyAiL21sIiwgICAgICAgICAgICAgICAgICAgU05EX01MUywgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgIi9tbHMiLCAgICAgICAgICAgICAgICAgIFNORF9NTFMsIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICIvbWxzZCIsICAgICAgICAgICAgICAgICBTTkRfTUxTLCAwIH0sCisgICAgeyAiL21sc3QiLCAgICAgICAgICAgICAgICAgU05EX01MUywgQ01fSU5WIH0sCisjaWZkZWYgQ0tfVE1QRElSCisgICAgeyAiL21vdmUtdG8iLCAgICAgICAgICAgICAgU05EX01PViwgQ01fQVJHIH0sCisjZW5kaWYgLyogQ0tfVE1QRElSICovCisgICAgeyAiL25hbWVsaXN0IiwgICAgICAgICAgICAgU05EX05NTCwgQ01fQVJHIH0sCisgICAgeyAiL25sc3QiLCAgICAgICAgICAgICAgICAgU05EX05MUywgMCB9LAorICAgIHsgIi9ub2JhY2t1cGZpbGVzIiwgICAgICAgIFNORF9OT0IsIDAgfSwKKyAgICB7ICIvbm9kb3RmaWxlcyIsICAgICAgICAgICBTTkRfTk9ELCAwIH0sCisjaWZkZWYgRE9VUERBVEUKKyAgICB7ICIvZGF0ZXMtZGlmZmVyIiwgICAgICAgICBTTkRfRElGLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBET1VQREFURSAqLworICAgIHsgIi9ub3QtYWZ0ZXIiLCAgICAgICAgICAgIFNORF9OQUYsIENNX0lOViB9LAorICAgIHsgIi9ub3QtYmVmb3JlIiwgICAgICAgICAgIFNORF9OQkUsIENNX0lOViB9LAorICAgIHsgIi9wZXJtaXNzaW9ucyIsICAgICAgICAgIFNORF9QUk0sIENNX0lOViB9LAorICAgIHsgIi9xdWlldCIsICAgICAgICAgICAgICAgIFNORF9TSEgsIDAgfSwKKyNpZmRlZiBGVFBfUkVTVEFSVAorICAgIHsgIi9yZWNvdmVyIiwgICAgICAgICAgICAgIFNORF9SRVMsIDAgfSwKKyNlbmRpZiAvKiBGVFBfUkVTVEFSVCAqLworI2lmZGVmIFJFQ1VSU0lWRQorICAgIHsgIi9yZWN1cnNpdmUiLCAgICAgICAgICAgIFNORF9SRUMsIDAgfSwKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICB7ICIvcmVuYW1lLXRvIiwgICAgICAgICAgICBTTkRfUkVOLCBDTV9BUkcgfSwKKyNpZmRlZiBGVFBfUkVTVEFSVAorICAgIHsgIi9yZXN0YXJ0IiwgICAgICAgICAgICAgIFNORF9SRVMsIENNX0lOViB9LAorI2VuZGlmIC8qIEZUUF9SRVNUQVJUICovCisjaWZuZGVmIE5PQ1NFVFMKKyAgICB7ICIvc2VydmVyLWNoYXJhY3Rlci1zZXQiLCBTTkRfQ1NSLCBDTV9BUkcgfSwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgeyAiL3NlcnZlci1yZW5hbWUtdG8iLCAgICAgU05EX1NSTiwgQ01fQVJHIH0sCisgICAgeyAiL3NtYWxsZXItdGhhbiIsICAgICAgICAgU05EX1NNQSwgQ01fQVJHIH0sCisjaWZkZWYgUkVDVVJTSVZFCisgICAgeyAiL3N1YmRpcmVjdG9yaWVzIiwgICAgICAgU05EX1JFQywgQ01fSU5WIH0sCisjZW5kaWYgLyogUkVDVVJTSVZFICovCisgICAgeyAiL3RleHQiLCAgICAgICAgICAgICAgICAgU05EX1RYVCwgMCB9LAorICAgIHsgIi90ZW5leCIsICAgICAgICAgICAgICAgIFNORF9URU4sIDAgfSwKKyNpZm5kZWYgTk9DU0VUUworICAgIHsgIi90cmFuc3BhcmVudCIsICAgICAgICAgIFNORF9YUEEsIDAgfSwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgeyAiL3RvLXNjcmVlbiIsICAgICAgICAgICAgU05EX01BSSwgMCB9LAorI2lmZGVmIERPVVBEQVRFCisgICAgeyAiL3VwZGF0ZSIsICAgICAgICAgICAgICAgU05EX1VQRCwgQ01fSU5WIH0sCisjZW5kaWYgLyogRE9VUERBVEUgKi8KKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5nZXRzd2kgPSAoc2l6ZW9mKGdldHN3aSkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgZGVsc3dpW10gPSB7ICAgICAgIC8qIEZUUCBbTV1ERUxFVEUgc3dpdGNoIHRhYmxlICovCisgICAgeyAiL2Vycm9yLWFjdGlvbiIsICAgICAgICAgU05EX0VSUiwgQ01fQVJHIH0sCisgICAgeyAiL2V4Y2VwdCIsICAgICAgICAgICAgICAgU05EX0VYQywgQ01fQVJHIH0sCisgICAgeyAiL2ZpbGVuYW1lcyIsICAgICAgICAgICAgU05EX05BTSwgQ01fQVJHIH0sCisgICAgeyAiL2xhcmdlci10aGFuIiwgICAgICAgICAgU05EX0xBUiwgQ01fQVJHIH0sCisgICAgeyAiL25vYmFja3VwZmlsZXMiLCAgICAgICAgU05EX05PQiwgMCB9LAorI2lmZGVmIFVOSVhPUk9TSworICAgIHsgIi9ub2RvdGZpbGVzIiwgICAgICAgICAgIFNORF9OT0QsIDAgfSwKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyAgICB7ICIvcXVpZXQiLCAgICAgICAgICAgICAgICBTTkRfU0hILCAwIH0sCisjaWZkZWYgUkVDVVJTSVZFCisgICAgeyAiL3JlY3Vyc2l2ZSIsICAgICAgICAgICAgU05EX1JFQywgMCB9LAorI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworICAgIHsgIi9zbWFsbGVyLXRoYW4iLCAgICAgICAgIFNORF9TTUEsIENNX0FSRyB9LAorI2lmZGVmIFJFQ1VSU0lWRQorICAgIHsgIi9zdWJkaXJlY3RvcmllcyIsICAgICAgIFNORF9SRUMsIENNX0lOViB9LAorI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmRlbHN3aSA9IChzaXplb2YoZGVsc3dpKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBmbnRhYltdID0geyAgICAgICAgLyogRmlsZW5hbWUgY29udmVyc2lvbiBrZXl3b3JkIHRhYmxlICovCisgICAgeyAiYXV0b21hdGljIiwgICAgMiwgQ05WX0FVVE8gfSwKKyAgICB7ICJjb252ZXJ0ZWQiLCAgICAxLCBDTlZfQ05WICB9LAorICAgIHsgImxpdGVyYWwiLCAgICAgIDAsIENOVl9MSVQgIH0KK307CitzdGF0aWMgaW50IG5mbnRhYiA9IChzaXplb2YoZm50YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgZnRwdHlwW10gPSB7ICAgICAgIC8qIFNFVCBGVFAgVFlQRSB0YWJsZSAqLworICAgIHsgImFzY2lpIiwgICAgICAgIEZUVF9BU0MsIDAgfSwKKyAgICB7ICJiaW5hcnkiLCAgICAgICBGVFRfQklOLCAwIH0sCisgICAgeyAidGVuZXgiLCAgICAgICAgRlRUX1RFTiwgMCB9LAorICAgIHsgInRleHQiLCAgICAgICAgIEZUVF9BU0MsIENNX0lOViB9LAorICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmZ0cHR5cCA9IChzaXplb2YoZnRwdHlwKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCisjaWZkZWYgRlRQX1NFQ1VSSVRZCitzdGF0aWMgc3RydWN0IGtleXRhYiBmdHBwcm9bXSA9IHsgICAgICAgLyogU0VUIEZUUCBQUk9URUNUSU9OLUxFVkVMIHRhYmxlICovCisgICAgeyAiY2xlYXIiLCAgICAgICAgRlBMX0NMUiwgMCB9LAorICAgIHsgImNvbmZpZGVudGlhbCIsIEZQTF9DT04sIDAgfSwKKyAgICB7ICJwcml2YXRlIiwgICAgICBGUExfUFJWLCAwIH0sCisgICAgeyAic2FmZSIsICAgICAgICAgRlBMX1NBRiwgMCB9LAorICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmZ0cHBybyA9IChzaXplb2YoZnRwcHJvKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworI2VuZGlmIC8qIEZUUF9TRUNVUklUWSAqLworCisvKiBEZWZpbml0aW9ucyBmb3IgRlRQIGZyb20gUkZDNzY1LiAqLworCisvKiBSZXBseSBjb2RlcyAqLworCisjZGVmaW5lIFJFUExZX1BSRUxJTSAgICAxICAgICAgICAgICAgICAgLyogUG9zaXRpdmUgcHJlbGltaW5hcnkgKi8KKyNkZWZpbmUgUkVQTFlfQ09NUExFVEUgIDIgICAgICAgICAgICAgICAvKiBQb3NpdGl2ZSBjb21wbGV0aW9uICovCisjZGVmaW5lIFJFUExZX0NPTlRJTlVFICAzICAgICAgICAgICAgICAgLyogUG9zaXRpdmUgaW50ZXJtZWRpYXRlICovCisjZGVmaW5lIFJFUExZX1RSQU5TSUVOVCA0ICAgICAgICAgICAgICAgLyogVHJhbnNpZW50IG5lZ2F0aXZlIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgUkVQTFlfRVJST1IgICAgIDUgICAgICAgICAgICAgICAvKiBQZXJtYW5lbnQgbmVnYXRpdmUgY29tcGxldGlvbiAqLworI2RlZmluZSBSRVBMWV9TRUNVUkUgICAgNiAgICAgICAgICAgICAgIC8qIFNlY3VyaXR5IGVuY29kZWQgbWVzc2FnZSAqLworCisvKiBGb3JtIGNvZGVzIGFuZCBuYW1lcyAqLworCisjZGVmaW5lIEZPUk1fTiAxICAgICAgICAgICAgICAgICAgICAgICAgLyogTm9uLXByaW50ICovCisjZGVmaW5lIEZPUk1fVCAyICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVsbmV0IGZvcm1hdCBlZmZlY3RvcnMgKi8KKyNkZWZpbmUgRk9STV9DIDMgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYXJyaWFnZSBjb250cm9sIChBU0EpICovCisKKy8qIFN0cnVjdHVyZSBjb2RlcyBhbmQgbmFtZXMgKi8KKworI2RlZmluZSBTVFJVX0YgMSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgKG5vIHJlY29yZCBzdHJ1Y3R1cmUpICovCisjZGVmaW5lIFNUUlVfUiAyICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVjb3JkIHN0cnVjdHVyZSAqLworI2RlZmluZSBTVFJVX1AgMyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhZ2Ugc3RydWN0dXJlICovCisKKy8qIE1vZGUgdHlwZXMgYW5kIG5hbWVzICovCisKKyNkZWZpbmUgTU9ERV9TIDEgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdHJlYW0gKi8KKyNkZWZpbmUgTU9ERV9CIDIgICAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9jayAqLworI2RlZmluZSBNT0RFX0MgMyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbXByZXNzZWQgKi8KKworLyogUHJvdGVjdGlvbiBsZXZlbHMgYW5kIG5hbWVzICovCisKKyNkZWZpbmUgUFJPVF9DIDEgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciAqLworI2RlZmluZSBQUk9UX1MgMiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhZmUgKi8KKyNkZWZpbmUgUFJPVF9QIDMgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcml2YXRlICovCisjZGVmaW5lIFBST1RfRSA0ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29uZmlkZW50aWFsICovCisKKyNpZmRlZiBDT01NRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgdXNlZCAqLworI2lmZGVmIEZUUF9OQU1FUworY2hhciAqc3RydW5hbWVzW10gID0gIHsiMCIsICJGaWxlIiwgICAgICJSZWNvcmQiLCAiUGFnZSIgfTsKK2NoYXIgKmZvcm1uYW1lc1tdICA9ICB7IjAiLCAiTm9ucHJpbnQiLCAiVGVsbmV0IiwgIkNhcnJpYWdlLWNvbnRyb2wiIH07CitjaGFyICptb2RlbmFtZXNbXSAgPSAgeyIwIiwgIlN0cmVhbSIsICAgIkJsb2NrIiwgICJDb21wcmVzc2VkIiB9OworY2hhciAqbGV2ZWxuYW1lc1tdID0gIHsiMCIsICJDbGVhciIsICAgICJTYWZlIiwgICAiUHJpdmF0ZSIsICAiQ29uZmlkZW50aWFsIiB9OworI2VuZGlmIC8qIEZUUF9OQU1FUyAqLworCisvKiBSZWNvcmQgVG9rZW5zICovCisKKyNkZWZpbmUgUkVDX0VTQyAnXDM3NycgICAgICAgICAgICAgICAgICAvKiBSZWNvcmQtbW9kZSBFc2NhcGUgKi8KKyNkZWZpbmUgUkVDX0VPUiAnXDAwMScgICAgICAgICAgICAgICAgICAvKiBSZWNvcmQtbW9kZSBFbmQtb2YtUmVjb3JkICovCisjZGVmaW5lIFJFQ19FT0YgJ1wwMDInICAgICAgICAgICAgICAgICAgLyogUmVjb3JkLW1vZGUgRW5kLW9mLUZpbGUgKi8KKworLyogQmxvY2sgSGVhZGVyICovCisKKyNkZWZpbmUgQkxLX0VPUiAgICAgICAgICAgMHg4MCAgICAgICAgICAvKiBCbG9jayBpcyBFbmQtb2YtUmVjb3JkICovCisjZGVmaW5lIEJMS19FT0YgICAgICAgICAgIDB4NDAgICAgICAgICAgLyogQmxvY2sgaXMgRW5kLW9mLUZpbGUgKi8KKyNkZWZpbmUgQkxLX1JFUExZX0VSUk9SUyAgMHgyMCAgICAgICAgICAvKiBCbG9jayBtaWdodCBoYXZlIGVycm9ycyAqLworI2RlZmluZSBCTEtfUkVTVEFSVCAgICAgICAweDEwICAgICAgICAgIC8qIEJsb2NrIGlzIFJlc3RhcnQgTWFya2VyICovCisjZGVmaW5lIEJMS19CWVRFQ09VTlQgMiAgICAgICAgICAgICAgICAgLyogQnl0ZXMgaW4gdGhpcyBibG9jayAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2RlZmluZSBSQURJWF9FTkNPREUgMCAgICAgICAgICAgICAgICAgIC8qIHJhZGl4X2VuY29kZSgpIGZ1bmN0aW9uIGNvZGVzICovCisjZGVmaW5lIFJBRElYX0RFQ09ERSAxCisKKy8qCisgIFRoZSBkZWZhdWx0IHNldHBic3ooKSB2YWx1ZSBpbiB0aGUgVW5peCBGVFAgY2xpZW50IGlzIDE8PDIwICgxTUIpLiAgVGhpcworICByZXN1bHRzIGluIGEgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBkdWUgdG8gdGhlIGluY3JlYXNlZCBudW1iZXIKKyAgb2YgcGFnZSBmYXVsdHMgYW5kIHRoZSBpbmFiaWxpdHkgdG8gb3ZlcmxhcCBlbmNyeXB0L2RlY3J5cHQsIGZpbGUgaS9vLCBhbmQKKyAgbmV0d29yayBpL28uICBTbyBpbnN0ZWFkIHdlIHNldCB0aGUgdmFsdWUgdG8gMTw8MTMgKDhLKSwgYWJvdXQgaGFsZiB0aGUgc2l6ZQorICBvZiB0aGUgdHlwaWNhbCBUQ1Agd2luZG93LiAgTWF5YmUgd2Ugc2hvdWxkIGFkZCBhIGNvbW1hbmQgdG8gYWxsb3cgdGhlIHZhbHVlCisgIHRvIGJlIGNoYW5nZWQuCisqLworI2RlZmluZSBERUZBVUxUX1BCU1ogMTw8MTMKKworLyogUHJvdG90eXBlcyAqLworCitfUFJPVE9UWVAoaW50IHJlbXR4dCwgKGNoYXIgKiopICk7CitfUFJPVE9UWVAoY2hhciAqIGdza3JlYXNvbiwgKGludCkgKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IGZ0cGNsb3NlLCh2b2lkKSk7CitfUFJPVE9UWVAoc3RhdGljIGludCB6enNlbmQsIChpbnQsIENIQVIpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IGdldHJlcGx5LChpbnQsaW50LGludCxpbnQsaW50KSk7CitfUFJPVE9UWVAoc3RhdGljIGludCByYWRpeF9lbmNvZGUsKENIQVJbXSwgQ0hBUltdLCBpbnQsIGludCAqLCBpbnQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IHNldHBic3osKHVuc2lnbmVkIGludCkpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgcmVjdnJlcXVlc3QsKGNoYXIgKixjaGFyICosY2hhciAqLGNoYXIgKiwKKyAgaW50LGludCxjaGFyICosaW50LGludCxpbnQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IGZ0cGNtZCwoY2hhciAqLGNoYXIgKixpbnQsaW50LGludCkpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgZnRzX2NwbCwoaW50KSk7CitfUFJPVE9UWVAoc3RhdGljIGludCBmdHNfZHBsLChpbnQpKTsKKyNpZmRlZiBGVFBfU0VDVVJJVFkKK19QUk9UT1RZUChzdGF0aWMgaW50IGZ0cF9hdXRoLCAodm9pZCkpOworI2VuZGlmIC8qIEZUUF9TRUNVUklUWSAqLworX1BST1RPVFlQKHN0YXRpYyBpbnQgZnRwX3VzZXIsIChjaGFyICosIGNoYXIgKiwgY2hhciAqKSk7CitfUFJPVE9UWVAoc3RhdGljIGludCBmdHBfbG9naW4sIChjaGFyICopKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IGZ0cF9yZXNldCwgKHZvaWQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IGZ0cF9yZW5hbWUsIChjaGFyICosIGNoYXIgKikpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgZnRwX3VtYXNrLCAoY2hhciAqKSk7CitfUFJPVE9UWVAoc3RhdGljIGludCBzZWN1cmVfZmx1c2gsIChpbnQpKTsKKyNpZmRlZiBDT01NRU5UCitfUFJPVE9UWVAoc3RhdGljIGludCBzZWN1cmVfcHV0YywgKGNoYXIsIGludCkpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KK19QUk9UT1RZUChzdGF0aWMgaW50IHNlY3VyZV93cml0ZSwgKGludCwgQ0hBUiAqLCB1bnNpZ25lZCBpbnQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IHNjb21tYW5kLCAoY2hhciAqKSk7CitfUFJPVE9UWVAoc3RhdGljIGludCBzZWN1cmVfcHV0YnVmLCAoaW50LCBDSEFSICosIHVuc2lnbmVkIGludCkpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgc2VjdXJlX2dldGMsIChpbnQsIGludCkpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgc2VjdXJlX2dldGJ5dGUsIChpbnQsIGludCkpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgc2VjdXJlX3JlYWQsIChpbnQsIGNoYXIgKiwgaW50KSk7CitfUFJPVE9UWVAoc3RhdGljIGludCBpbml0Y29ubiwgKHZvaWQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IGRhdGFjb25uLCAoY2hhciAqKSk7CitfUFJPVE9UWVAoc3RhdGljIGludCBzZXRwcm90YnVmLCh1bnNpZ25lZCBpbnQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IHNlbmRyZXF1ZXN0LCAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50LGludCxpbnQsaW50KSk7CisKK19QUk9UT1RZUChzdGF0aWMgY2hhciAqIHJhZGl4X2Vycm9yLChpbnQpKTsKK19QUk9UT1RZUChzdGF0aWMgY2hhciAqIGZ0cF9ob29rdXAsKGNoYXIgKiwgaW50LCBpbnQpKTsKK19QUk9UT1RZUChzdGF0aWMgQ0hBUiAqIHJlbW90ZV9maWxlcywgKGludCwgQ0hBUiAqLCBDSEFSICosIGludCkpOworCitfUFJPVE9UWVAoc3RhdGljIFZPSUQgbWxzcmVzZXQsICh2b2lkKSk7CitfUFJPVE9UWVAoc3RhdGljIFZPSUQgc2VjdXJlX2Vycm9yLCAoY2hhciAqZm10LCAuLi4pKTsKK19QUk9UT1RZUChzdGF0aWMgVk9JRCBsb3N0cGVlciwgKHZvaWQpKTsKK19QUk9UT1RZUChzdGF0aWMgVk9JRCBjYW5jZWxfcmVtb3RlLCAoaW50KSk7CitfUFJPVE9UWVAoc3RhdGljIFZPSUQgY2hhbmdldHlwZSwgKGludCwgaW50KSk7CisKK19QUk9UT1RZUChzdGF0aWMgc2lndHlwZSBjbWRjYW5jZWwsIChpbnQpKTsKKworI2lmZGVmIEZUUF9TUlAKK19QUk9UT1RZUChzdGF0aWMgaW50IHNycF9yZXNldCwgKCkpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgc3JwX2Z0cF9hdXRoLCAoY2hhciAqLGNoYXIgKixjaGFyICopKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IHNycF9wdXQsIChDSEFSICosIENIQVIgKiosIGludCwgaW50ICopKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IHNycF9nZXQsIChDSEFSICoqLCBDSEFSICoqLCBpbnQgKiwgaW50ICopKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IHNycF9lbmNvZGUsIChpbnQsIENIQVIgKiwgQ0hBUiAqLCB1bnNpZ25lZCBpbnQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IHNycF9kZWNvZGUsIChpbnQsIENIQVIgKiwgQ0hBUiAqLCB1bnNpZ25lZCBpbnQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IHNycF9zZWxjaXBoZXIsIChjaGFyICopKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IHNycF9zZWxoYXNoLCAoY2hhciAqKSk7CisjZW5kaWYgLyogRlRQX1NSUCAqLworCisjaWZkZWYgRlRQX0dTU0FQSQorX1BST1RPVFlQKHN0YXRpYyB2b2lkIHVzZXJfZ3NzX2Vycm9yLChPTV91aW50MzIsIE9NX3VpbnQzMixjaGFyICopKTsKKyNlbmRpZiAvKiBGVFBfR1NTQVBJICovCisKKy8qICBEIE8gRiBUIFAgQSBSIEcgIC0tICBEbyBhbiBGVFAgY29tbWFuZC1saW5lIGFyZ3VtZW50LiAgKi8KKworI2lmZGVmIEZUUF9TRUNVUklUWQorI2lmbmRlZiBOT0lDUAorI2RlZmluZSBGVF9OT0dTUyAgIDEKKyNkZWZpbmUgRlRfTk9LNCAgICAyCisjZGVmaW5lIEZUX05PU1JQICAgMworI2RlZmluZSBGVF9OT1NTTCAgIDQKKyNkZWZpbmUgRlRfTk9UTFMgICA1CisjZGVmaW5lIEZUX0NFUlRGSSAgNgorI2RlZmluZSBGVF9PS0NFUlQgIDcKKyNkZWZpbmUgRlRfREVCVUcgICA4CisjZGVmaW5lIEZUX0tFWSAgICAgOQorI2RlZmluZSBGVF9TRUNVUkUgMTAKKyNkZWZpbmUgRlRfVkVSSUZZIDExCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGZ0cHp0YWJbXSA9IHsKKyAgICB7ICIhZ3NzIiwgICAgRlRfTk9HU1MsICAwIH0sCisgICAgeyAiIWtyYjQiLCAgIEZUX05PSzQsICAgMCB9LAorICAgIHsgIiFzcnAiLCAgICBGVF9OT1NSUCwgIDAgfSwKKyAgICB7ICIhc3NsIiwgICAgRlRfTk9TU0wsICAwIH0sCisgICAgeyAiIXRscyIsICAgIEZUX05PVExTLCAgMCB9LAorICAgIHsgImNlcnQiLCAgICBGVF9DRVJURkksIENNX0FSRyB9LAorICAgIHsgImNlcnRzb2siLCBGVF9PS0NFUlQsIDAgfSwKKyAgICB7ICJkZWJ1ZyIsICAgRlRfREVCVUcsICAwIH0sCisgICAgeyAia2V5IiwgICAgIEZUX0tFWSwgICAgQ01fQVJHIH0sCisgICAgeyAibm9nc3MiLCAgIEZUX05PR1NTLCAgMCB9LAorICAgIHsgIm5va3JiNCIsICBGVF9OT0s0LCAgIDAgfSwKKyAgICB7ICJub3NycCIsICAgRlRfTk9TUlAsICAwIH0sCisgICAgeyAibm9zc2wiLCAgIEZUX05PU1NMLCAgMCB9LAorICAgIHsgIm5vdGxzIiwgICBGVF9OT1RMUywgIDAgfSwKKyNpZmRlZiBDT01NRU5UCisgICAgeyAic2VjdXJlIiwgIEZUX1NFQ1VSRSwgMCB9LAorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB7ICJ2ZXJpZnkiLCAgRlRfVkVSSUZZLCBDTV9BUkcgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5mdHB6dGFiID0gc2l6ZW9mKGZ0cHp0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpIC0gMTsKKworLyoKKyAgVGhlIGZvbGxvd2luZyBjaXBoZXIgYW5kIGhhc2ggdGFibGVzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoCisgIGR5bmFtaWNseSBjcmVhdGVkIHZlcnNpb25zIGJhc2VkIHVwb24gdGhlIGxpbmtlZCBsaWJyYXJ5LgorKi8KKyNkZWZpbmUgU1JQX0JMT1dGSVNIX0VDQiAgICAxCisjZGVmaW5lIFNSUF9CTE9XRklTSF9DQkMgICAgMgorI2RlZmluZSBTUlBfQkxPV0ZJU0hfQ0ZCNjQgIDMKKyNkZWZpbmUgU1JQX0JMT1dGSVNIX09GQjY0ICA0CisjZGVmaW5lIFNSUF9DQVNUNV9FQ0IgICAgICAgNQorI2RlZmluZSBTUlBfQ0FTVDVfQ0JDICAgICAgIDYKKyNkZWZpbmUgU1JQX0NBU1Q1X0NGQjY0ICAgICA3CisjZGVmaW5lIFNSUF9DQVNUNV9PRkI2NCAgICAgOAorI2RlZmluZSBTUlBfREVTX0VDQiAgICAgICAgIDkKKyNkZWZpbmUgU1JQX0RFU19DQkMgICAgICAgIDEwCisjZGVmaW5lIFNSUF9ERVNfQ0ZCNjQgICAgICAxMQorI2RlZmluZSBTUlBfREVTX09GQjY0ICAgICAgMTIKKyNkZWZpbmUgU1JQX0RFUzNfRUNCICAgICAgIDEzCisjZGVmaW5lIFNSUF9ERVMzX0NCQyAgICAgICAxNAorI2RlZmluZSBTUlBfREVTM19DRkI2NCAgICAgMTUKKyNkZWZpbmUgU1JQX0RFUzNfT0ZCNjQgICAgIDE2CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGNpcGhlcnRhYltdID0geworICAgIHsgImJsb3dmaXNoX2VjYiIsICAgU1JQX0JMT1dGSVNIX0VDQiwgICAwIH0sCisgICAgeyAiYmxvd2Zpc2hfY2JjIiwgICBTUlBfQkxPV0ZJU0hfQ0JDLCAgIDAgfSwKKyAgICB7ICJibG93ZmlzaF9jZmI2NCIsIFNSUF9CTE9XRklTSF9DRkI2NCwgMCB9LAorICAgIHsgImJsb3dmaXNoX29mYjY0IiwgU1JQX0JMT1dGSVNIX09GQjY0LCAwIH0sCisgICAgeyAiY2FzdDVfZWNiIiwgICAgICBTUlBfQ0FTVDVfRUNCLCAgICAgIDAgfSwKKyAgICB7ICJjYXN0NV9jYmMiLCAgICAgIFNSUF9DQVNUNV9DQkMsICAgICAgMCB9LAorICAgIHsgImNhc3Q1X2NmYjY0IiwgICAgU1JQX0NBU1Q1X0NGQjY0LCAgICAwIH0sCisgICAgeyAiY2FzdDVfb2ZiNjQiLCAgICBTUlBfQ0FTVDVfT0ZCNjQsICAgIDAgfSwKKyAgICB7ICJkZXNfZWNiIiwgICAgICAgIFNSUF9ERVNfRUNCLCAgICAgICAgMCB9LAorICAgIHsgImRlc19jYmMiLCAgICAgICAgU1JQX0RFU19DQkMsICAgICAgICAwIH0sCisgICAgeyAiZGVzX2NmYjY0IiwgICAgICBTUlBfREVTX0NGQjY0LCAgICAgIDAgfSwKKyAgICB7ICJkZXNfb2ZiNjQiLCAgICAgIFNSUF9ERVNfT0ZCNjQsICAgICAgMCB9LAorICAgIHsgImRlczNfZWNiIiwgICAgICAgU1JQX0RFUzNfRUNCLCAgICAgICAwIH0sCisgICAgeyAiZGVzM19jYmMiLCAgICAgICBTUlBfREVTM19DQkMsICAgICAgIDAgfSwKKyAgICB7ICJkZXMzX2NmYjY0IiwgICAgIFNSUF9ERVMzX0NGQjY0LCAgICAgMCB9LAorICAgIHsgImRlczNfb2ZiNjQiLCAgICAgU1JQX0RFUzNfT0ZCNjQsICAgICAwIH0sCisgICAgeyAibm9uZSIsICAgICAgICAgICAwLCAwIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuY2lwaGVydGFiID0gc2l6ZW9mKGNpcGhlcnRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikgLSAxOworCisjZGVmaW5lIFNSUF9NRDUgIDEKKyNkZWZpbmUgU1JQX1NIQSAgMgorc3RhdGljIHN0cnVjdCBrZXl0YWIgaGFzaHRhYltdID0geworICAgIHsgIm1kNSIsICAgICAgICAgICAgICBTUlBfTUQ1LCAgICAgICAgMCB9LAorICAgIHsgIm5vbmUiLCAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgMCB9LAorICAgIHsgInNoYSIsICAgICAgICAgICAgICBTUlBfU0hBLCAgICAgICAgMCB9LAorICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmhhc2h0YWIgPSBzaXplb2YoaGFzaHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikgLSAxOworI2VuZGlmIC8qIE5PSUNQICovCisjZW5kaWYgLyogRlRQX1NFQ1VSSVRZICovCisKK3N0YXRpYyBjaGFyICoKK3N0cnZhbChzMSxzMikgY2hhciAqIHMxLCAqIHMyOyB7CisgICAgaWYgKCFzMSkgczEgPSAiIjsKKyAgICBpZiAoIXMyKSBzMiA9ICIiOworICAgIHJldHVybigqczEgPyBzMSA6ICgqczIgPyBzMiA6ICIobm9uZSkiKSk7Cit9CisKKyNpZm5kZWYgTk9DU0VUUworc3RhdGljIGNoYXIgKiByZm5wdHIgPSBOVUxMOworc3RhdGljIGludCByZm5sZW4gPSAwOworc3RhdGljIGNoYXIgcmZuYnVmW1JGTkJVRlNJWl07ICAgICAgICAgIC8qIFJlbW90ZSBmaWxlbmFtZSB0cmFuc2xhdGUgYnVmZmVyICovCitzdGF0aWMgY2hhciAqIHhnbmJwID0gTlVMTDsKKworc3RhdGljIGludAorc3RyZ2V0YygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhlbHBlciBmdW5jdGlvbiBmb3IgeGduYnl0ZSgpICovCisgICAgaW50IGM7CisgICAgaWYgKCF4Z25icCkKKyAgICAgIHJldHVybigtMSk7CisgICAgaWYgKCEqeGduYnApCisgICAgICByZXR1cm4oLTEpOworICAgIGMgPSAodW5zaWduZWQpICp4Z25icCsrOworICAgIHJldHVybigoKHVuc2lnbmVkKSBjKSAmIDB4ZmYpOworfQorCitzdGF0aWMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGVscGVyIGZ1bmN0aW9uIGZvciB4cG5ieXRlKCkgKi8KKyNpZmRlZiBDS19BTlNJQworc3RycHV0YyhjaGFyIGMpCisjZWxzZQorc3RycHV0YyhjKSBjaGFyIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICByZm5sZW4gPSByZm5wdHIgLSByZm5idWY7CisgICAgaWYgKHJmbmxlbiA+PSAoUkZOQlVGU0laIC0gMSkpCisgICAgICByZXR1cm4oLTEpOworICAgICpyZm5wdHIrKyA9IGM7CisgICAgKnJmbnB0ciA9IE5VTDsKKyAgICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQKKyNpZmRlZiBDS19BTlNJQworeHByaW50YyhjaGFyIGMpCisjZWxzZQoreHByaW50YyhjKSBjaGFyIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBwcmludGYoIiVjIixjKTsKKyAgICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBWT0lECitieXRzd2FwKGMwLGMxKSBpbnQgKiBjMCwgKiBjMTsgeworICAgIGludCB0OworICAgIHQgPSAqYzA7CisgICAgKmMwID0gKmMxOworICAgICpjMSA9IHQ7Cit9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisjaWZkZWYgQ0tMT0dESUFMCitjaGFyIGZ0cGxvZ2J1ZltDWExPR0JVRkxdID0geyBOVUwsIE5VTCB9OyAvKiBDb25uZWN0aW9uIExvZyAqLworaW50IGZ0cGxvZ2FjdGl2ZSA9IDA7Citsb25nIGZ0cGxvZ3ByZXYgPSAwTDsKKworVk9JRAorZnRwbG9nZW5kKCkgeworICAgIGV4dGVybiBpbnQgZGlhbG9nOworICAgIGV4dGVybiBjaGFyIGRpYWZpbFtdOworICAgIGxvbmcgZDEsIGQyLCB0MSwgdDI7CisgICAgY2hhciBidWZbMzJdLCAqIHA7CisKKyAgICBkZWJ1ZyhGMTExLCJmdHAgY3ggbG9nIGFjdGl2ZSIsY2tpdG9hKGRpYWxvZyksZnRwbG9nYWN0aXZlKTsKKyAgICBkZWJ1ZyhGMTEwLCJmdHAgY3ggbG9nIGJ1ZiIsZnRwbG9nYnVmLDApOworCisgICAgaWYgKCFmdHBsb2dhY3RpdmUgfHwgIWZ0cGxvZ2J1ZlswXSkgLyogTm8gYWN0aXZlIHJlY29yZCAqLworICAgICAgcmV0dXJuOworCisgICAgZnRwbG9nYWN0aXZlID0gMDsgICAgICAgICAgICAgICAgICAgLyogUmVjb3JkIGlzIG5vdCBhY3RpdmUgKi8KKworICAgIGQxID0gbWpkKChjaGFyICopZnRwbG9nYnVmKTsgICAgICAgIC8qIEdldCBzdGFydCBkYXRlIG9mIHRoaXMgc2Vzc2lvbiAqLworICAgIGNrc3RybmNweShidWYsY2tkYXRlKCksMzEpOyAgICAgICAgIC8qIEdldCBjdXJyZW50IGRhdGUgKi8KKyAgICBkMiA9IG1qZChidWYpOyAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHRoZW0gdG8gbWpkcyAqLworICAgIHAgPSBmdHBsb2didWY7ICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBzdGFydCB0aW1lICovCisgICAgcFsxMV0gPSBOVUw7CisgICAgcFsxNF0gPSBOVUw7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udmVydCB0byBzZWNvbmRzICovCisgICAgdDEgPSBhdG9sKHArOSkgKiAzNjAwTCArIGF0b2wocCsxMikgKiA2MEwgKyBhdG9sKHArMTUpOworICAgIHBbMTFdID0gJzonOworICAgIHBbMTRdID0gJzonOworICAgIHAgPSBidWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBlbmQgdGltZSAqLworICAgIHBbMTFdID0gTlVMOworICAgIHBbMTRdID0gTlVMOworICAgIHQyID0gYXRvbChwKzkpICogMzYwMEwgKyBhdG9sKHArMTIpICogNjBMICsgYXRvbChwKzE1KTsKKyAgICB0MiA9ICgoZDIgLSBkMSkgKiA4NjQwMEwpICsgKHQyIC0gdDEpOyAvKiBDb21wdXRlIGVsYXBzZWQgdGltZSAqLworICAgIGlmICh0MiA+IC0xTCkgeworICAgICAgICBmdHBsb2dwcmV2ID0gdDI7CisgICAgICAgIHAgPSBoaG1tc3ModDIpOworICAgICAgICBzdHJuY2F0KGZ0cGxvZ2J1ZiwiRT0iLENYTE9HQlVGTCk7IC8qIEFwcGVuZCB0byBsb2cgcmVjb3JkICovCisgICAgICAgIHN0cm5jYXQoZnRwbG9nYnVmLHAsQ1hMT0dCVUZMKTsKKyAgICB9IGVsc2UKKyAgICAgIGZ0cGxvZ3ByZXYgPSAwTDsKKyAgICBkZWJ1ZyhGMTAxLCJmdHAgY3ggbG9nIGRpYWxvZyIsIiIsZGlhbG9nKTsKKyAgICBpZiAoZGlhbG9nKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBsb2dnaW5nICovCisgICAgICAgIGludCB4OworICAgICAgICB4ID0gZGlhb3BuKGRpYWZpbCwxLDEpOyAgICAgICAgIC8qIE9wZW4gbG9nIGluIGFwcGVuZCBtb2RlICovCisgICAgICAgIGlmICh4ID4gMCkgeworICAgICAgICAgICAgZGVidWcoRjEwMSwiZnRwIGN4IGxvZyBvcGVuIiwiIix4KTsKKyAgICAgICAgICAgIHggPSB6c291dGwoWkRJRklMLGZ0cGxvZ2J1Zik7IC8qIFdyaXRlIHRoZSByZWNvcmQgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBjeCBsb2cgd3JpdGUiLCIiLHgpOworICAgICAgICAgICAgeCA9IHpjbG9zZShaRElGSUwpOyAgICAgICAgIC8qIENsb3NlIHRoZSBsb2cgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBjeCBsb2cgY2xvc2UiLCIiLHgpOworICAgICAgICB9CisgICAgfQorfQorCitWT0lECitkb2xvZ2Z0cCgpIHsKKyAgICBmdHBsb2dlbmQoKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmV2aW91cyBzZXNzaW9uIG5vdCBjbG9zZWQgb3V0PyAqLworICAgIGZ0cGxvZ3ByZXYgPSAwTDsKKyAgICBmdHBsb2dhY3RpdmUgPSAxOyAgICAgICAgICAgICAgICAgICAvKiBSZWNvcmQgaXMgYWN0aXZlICovCisKKyAgICBja21ha3htc2coZnRwbG9nYnVmLENYTE9HQlVGTCwKKyAgICAgICAgICAgICAgY2tkYXRlKCksIiAiLHN0cnZhbChmdHBfbG9nbmFtZSxOVUxMKSwiICIsY2tnZXRwaWQoKSwKKyAgICAgICAgICAgICAgIiBUPUZUUCBOPSIsIHN0cnZhbChmdHBfaG9zdCxOVUxMKSwiIEg9IixteWhvc3QsIiAiLE5VTEwsTlVMTCk7CisgICAgZGVidWcoRjExMCwiZnRwIGN4IGxvZyBiZWdpbiIsZnRwbG9nYnVmLDApOworfQorI2VuZGlmIC8qIENLTE9HRElBTCAqLworCitzdGF0aWMgY2hhciAqIGR1bW15WzJdID0geyBOVUxMLCBOVUxMIH07CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIG1vZGV0YWJbXSA9IHsKKyAgICB7ICJhY3RpdmUiLCAgMCwgMCB9LAorICAgIHsgInBhc3NpdmUiLCAxLCAwIH0KK307CisKKyNpZm5kZWYgTk9DTURMCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbGVkIGZyb20gY2t1dXN5LmMgKi8KKyNpZmRlZiBDS19BTlNJQworZG9mdHBhcmcoY2hhciBjKQorI2Vsc2UKK2RvZnRwYXJnKGMpIGNoYXIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogZG9mdHBhcmcgKi8geworICAgIGludCB4LCB6OworICAgIGNoYXIgKnhwOworICAgIGV4dGVybiBjaGFyICoqeGFyZ3YsICp4YXJnMDsKKyAgICBleHRlcm4gaW50IHhhcmdjLCBzdGF5ZmxnLCBoYXZlZnRwdWlkOworICAgIGV4dGVybiBjaGFyIHVpZGJ1ZltdOworCisgICAgeHAgPSAqeGFyZ3YrMTsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciBmb3IgYnVuZGxlZCBhcmdzICovCisgICAgd2hpbGUgKGMpIHsKKyAgICAgICAgaWYgKGNrc3RyY2hyKCJNdURQa2NIem0iLGMpKSB7ICAvKiBPcHRpb25zIHRoYXQgdGFrZSBhcmd1bWVudHMgKi8KKyAgICAgICAgICAgIGlmICgqKHhwKzEpKSB7CisgICAgICAgICAgICAgICAgZmF0YWwoIj9JbnZhbGlkIGFyZ3VtZW50IGJ1bmRsaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4YXJndisrLCB4YXJnYy0tOworICAgICAgICAgICAgaWYgKCh4YXJnYyA8IDEpIHx8ICgqKnhhcmd2ID09ICctJykpIHsKKyAgICAgICAgICAgICAgICBmYXRhbCgiP1JlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGMpIHsgICAgICAgICAgICAgICAgICAgIC8qIEJpZyBzd2l0Y2ggb24gYXJnICovCisgICAgICAgICAgY2FzZSAnaCc6ICAgICAgICAgICAgICAgICAgICAgLyogaGVscCAqLworICAgICAgICAgICBwcmludGYoIkMtS2VybWl0J3MgRlRQIGNsaWVudCBjb21tYW5kLWxpbmUgcGVyc29uYWxpdHkuICBVc2FnZTpcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgICVzIFsgb3B0aW9ucyBdIGhvc3QgWyBwb3J0IF0gWy1wZyBmaWxlcyBdXG5cbiIseGFyZzApOworICAgICAgICAgICAgcHJpbnRmKCJPcHRpb25zOlxuIik7CisgICAgICAgICAgICBwcmludGYoIiAgLWggICAgICAgICAgID0gaGVscCAodGhpcyBtZXNzYWdlKVxuIik7CisgICAgICAgICAgICBwcmludGYoIiAgLW0gbW9kZSAgICAgID0gXCJwYXNzaXZlXCIgKGRlZmF1bHQpIG9yIFwiYWN0aXZlXCJcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgIC11IG5hbWUgICAgICA9IHVzZXJuYW1lIGZvciBhdXRvbG9naW4gKG9yIC1NKVxuIik7CisgICAgICAgICAgICBwcmludGYoIiAgLVAgcGFzc3dvcmQgID0gcGFzc3dvcmQgZm9yIGF1dG9sb2dpbiAoUklTS1kpXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiICAtQSAgICAgICAgICAgPSBhdXRvbG9naW4gYW5vbnltb3VzbHlcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgIC1EIGRpcmVjdG9yeSA9IGNkIGFmdGVyIGF1dG9sb2dpblxuIik7CisgICAgICAgICAgICBwcmludGYoIiAgLWIgICAgICAgICAgID0gZm9yY2UgYmluYXJ5IG1vZGVcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgIC1hICAgICAgICAgICA9IGZvcmNlIHRleHQgKFwiYXNjaWlcIikgbW9kZSAob3IgLVQpXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiICAtZCAgICAgICAgICAgPSBkZWJ1ZyAoZG91YmxlIHRvIGFkZCB0aW1lc3RhbXBzKVxuIik7CisgICAgICAgICAgICBwcmludGYoIiAgLW4gICAgICAgICAgID0gbm8gYXV0b2xvZ2luXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiICAtdiAgICAgICAgICAgPSB2ZXJib3NlIChkZWZhdWx0KVxuIik7CisgICAgICAgICAgICBwcmludGYoIiAgLXEgICAgICAgICAgID0gcXVpZXRcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgIC1TICAgICAgICAgICA9IFN0YXkgKGlzc3VlIGNvbW1hbmQgcHJvbXB0IHdoZW4gZG9uZSlcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgIC1ZICAgICAgICAgICA9IGRvIG5vdCBleGVjdXRlIEtlcm1pdCBpbml0IGZpbGVcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgIC1wIGZpbGVzICAgICA9IGZpbGVzIHRvIHB1dCBhZnRlciBhdXRvbG9naW4gKG9yIC1zKVxuIik7CisgICAgICAgICAgICBwcmludGYoIiAgLWcgZmlsZXMgICAgID0gZmlsZXMgdG8gZ2V0IGFmdGVyIGF1dG9sb2dpblxuIik7CisgICAgICAgICAgICBwcmludGYoIiAgLVIgICAgICAgICAgID0gcmVjdXJzaXZlIChmb3IgdXNlIHdpdGggLXApXG4iKTsKKworI2lmZGVmIEZUUF9TRUNVUklUWQorICAgICAgICAgICAgcHJpbnRmKCJcblNlY3VyaXR5IG9wdGlvbnM6XG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiICAtayByZWFsbSAgICAgPSBLZXJiZXJvcyA0IHJlYWxtXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiICAtZiAgICAgICAgICAgPSBLZXJib3JvcyA1IGNyZWRlbnRpYWxzIGZvcndhcmRpbmdcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgIC14ICAgICAgICAgICA9IGF1dG9lbmNyeXB0aW9uIG1vZGVcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgIC1jIGNpcGhlciAgICA9IFNSUCBjaXBoZXIgdHlwZVxuIik7CisgICAgICAgICAgICBwcmludGYoIiAgLUggaGFzaCAgICAgID0gU1JQIGVuY3J5cHRpb24gaGFzaFxuIik7CisgICAgICAgICAgICBwcmludGYoIiAgLXogb3B0aW9uICAgID0gU2VjdXJpdHkgb3B0aW9uc1xuIik7CisjZW5kaWYgLyogRlRQX1NFQ1VSSVRZICovCisKKyAgICAgICAgICAgIHByaW50ZigiXG4tcCBvciAtZywgaWYgZ2l2ZW4sIHNob3VsZCBiZSBsYXN0LiAgRXhhbXBsZTpcbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgIGZ0cCAtQSBrZXJtaXQuY29sdW1iaWEuZWR1IC1EIGtlcm1pdCAtYWcgVEVTVEZJTEVcbiIpOworCisgICAgICAgICAgICBkb2V4aXQoR09PRF9FWElULC0xKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAnUic6ICAgICAgICAgICAgICAgICAgICAgLyogUmVjdXJzaXZlICovCisgICAgICAgICAgICByZWN1cnNpdmUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICdkJzogICAgICAgICAgICAgICAgICAgICAvKiBEZWJ1ZyAqLworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBpZiAoZGVibG9nKSB7CisgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBkZWJ0aW07CisgICAgICAgICAgICAgICAgZGVidGltID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVibG9nID0gZGVib3BuKCJkZWJ1Zy5sb2ciLDApOworICAgICAgICAgICAgICAgIGRlYm9rID0gMTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICAgICAgLyogZmFsbCB0aHJ1IG9uIHB1cnBvc2UgKi8KKworICAgICAgICAgIGNhc2UgJ3QnOiAgICAgICAgICAgICAgICAgICAgIC8qIFRyYWNlICovCisgICAgICAgICAgICBmdHBfZGViKys7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgJ24nOiAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGF1dG9sb2dpbiAqLworICAgICAgICAgICAgZnRwX2xvZyA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgJ2knOiAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHByb21wdCAqLworICAgICAgICAgIGNhc2UgJ3YnOiAgICAgICAgICAgICAgICAgICAgIC8qIFZlcmJvc2UgKi8KKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAvKiAoaWdub3JlZCkgKi8KKworICAgICAgICAgIGNhc2UgJ3EnOiAgICAgICAgICAgICAgICAgICAgIC8qIFF1aWV0ICovCisgICAgICAgICAgICBxdWlldCA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgJ1MnOiAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXkgKi8KKyAgICAgICAgICAgIHN0YXlmbGcgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICBjYXNlICd1JzogICAgICAgICAgICAgICAgICAgICAvKiBNeSBVc2VyIE5hbWUgKi8KKyAgICAgICAgICAgIGlmICgoaW50KXN0cmxlbigqeGFyZ3YpID4gNjMpIHsKKyAgICAgICAgICAgICAgICBmYXRhbCgidXNlcm5hbWUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNrc3RybmNweSh1aWRidWYsKnhhcmd2LFVJREJVRkxFTik7CisgICAgICAgICAgICBoYXZlZnRwdWlkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAnQSc6CisgICAgICAgICAgICBja3N0cm5jcHkodWlkYnVmLCJhbm9ueW1vdXMiLFVJREJVRkxFTik7CisgICAgICAgICAgICBoYXZlZnRwdWlkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAnVCc6ICAgICAgICAgICAgICAgICAgICAgLyogVGV4dCAqLworICAgICAgICAgIGNhc2UgJ2EnOiAgICAgICAgICAgICAgICAgICAgIC8qICJhc2NpaSIgKi8KKyAgICAgICAgICBjYXNlICdiJzogICAgICAgICAgICAgICAgICAgICAvKiBCaW5hcnkgKi8KKyAgICAgICAgICAgIGJpbmFyeSA9IChjID09ICdiJykgPyBGVFRfQklOIDogRlRUX0FTQzsKKyAgICAgICAgICAgIHhmZXJtb2RlID0gWE1PREVfTTsKKyAgICAgICAgICAgIGZpbGVwZWVrID0gMDsKKyAgICAgICAgICAgIHBhdHRlcm5zID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAnZyc6ICAgICAgICAgICAgICAgICAgICAgLyogR2V0ICovCisgICAgICAgICAgY2FzZSAncCc6ICAgICAgICAgICAgICAgICAgICAgLyogUHV0ICovCisgICAgICAgICAgY2FzZSAncyc6IHsgICAgICAgICAgICAgICAgICAgLyogU2VuZCAoPSBQdXQpICovCisgICAgICAgICAgICAgIGludCBoYXZlZmlsZXMsIHJjOworICAgICAgICAgICAgICBpZiAoZnRwX2FjdGlvbikgeworICAgICAgICAgICAgICAgICAgZmF0YWwoIk9ubHkgb25lIEZUUCBhY3Rpb24gYXQgYSB0aW1lIHBsZWFzZSIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICgqKHhwKzEpKSB7CisgICAgICAgICAgICAgICAgICBmYXRhbCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyBhZnRlciAtcyIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG5maWxzID0gMDsgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBmaWxlIGNvdW50ZXIgKi8KKyAgICAgICAgICAgICAgaGF2ZWZpbGVzID0gMDsgICAgICAgICAgICAvKiBBc3N1bWUgbm90aGluZyB0byBzZW5kICAqLworICAgICAgICAgICAgICBjbWxpc3QgPSB4YXJndiArIDE7ICAgICAgIC8qIFJlbWVtYmVyIHRoaXMgcG9pbnRlciAqLworCisgICAgICAgICAgICAgIHdoaWxlICgrK3hhcmd2LCAtLXhhcmdjID4gMCkgeyAvKiBUcmF2ZXJzZSB0aGUgbGlzdCAqLworICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ2cnKSB7CisgICAgICAgICAgICAgICAgICAgICAgaGF2ZWZpbGVzKys7CisgICAgICAgICAgICAgICAgICAgICAgbmZpbHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBSRUNVUlNJVkUKKyAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKCp4YXJndiwiLiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgaGF2ZWZpbGVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICBuZmlscysrOworICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZSA9IDE7CisgICAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKChyYyA9IHpjaGtpKCp4YXJndikpID4gLTEgfHwgKHJjID09IC0yKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgIChyYyAhPSAtMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWZpbGVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5maWxzKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXN3aWxkKCp4YXJndikgJiYgbnp4cGFuZCgqeGFyZ3YsMCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlZmlsZXMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbmZpbHMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHhhcmdjKyssIHhhcmd2LS07ICAgICAgICAgLyogQWRqdXN0IGFyZ3YvYXJnYyAqLworICAgICAgICAgICAgICBpZiAoIWhhdmVmaWxlcykgeworICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ2cnKSB7CisgICAgICAgICAgICAgICAgICAgICAgZmF0YWwoIk5vIGZpbGVzIHRvIHB1dCIpOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBmYXRhbCgiTm8gZmlsZXMgdG8gZ2V0Iik7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZnRwX2FjdGlvbiA9IGM7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlICdEJzogICAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3RvcnkgKi8KKyAgICAgICAgICAgIG1ha2VzdHIoJmZ0cF9yZGlyLCp4YXJndik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgJ20nOiAgICAgICAgICAgICAgICAgICAgIC8qIE1vZGUgKEFjdGl2ZS9QYXNzaXZlICovCisgICAgICAgICAgICBmdHBfcHN2ID0gbG9va3VwKG1vZGV0YWIsKnhhcmd2LDIsTlVMTCk7CisgICAgICAgICAgICBpZiAoZnRwX3BzdiA8IDApIGZhdGFsKCJJbnZhbGlkIG1vZGUiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICBtYWtlc3RyKCZmdHBfdG1wLCp4YXJndik7ICAgLyogWW91LUtub3ctV2hhdCAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICdZJzogICAgICAgICAgICAgICAgICAgICAvKiBObyBpbml0aWFsaXphdGlvbiBmaWxlICovCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgLyogKGFscmVhZHkgZG9uZSBpbiBwcmVzY2FuKSAqLworCisjaWZkZWYgQ0tfVVJMCisgICAgICAgICAgY2FzZSAnVSc6IHsgICAgICAgICAgICAgICAgICAgLyogVVJMICovCisgICAgICAgICAgICAgIC8qIFRoZXNlIGFyZSBzZXQgYnkgdXJscGFyc2UoKSAtIGFueSBub3Qgc2V0IGFyZSBOVUxMICovCisgICAgICAgICAgICAgIGlmIChnX3VybC5ob3MpIHsKKy8qCisgIEtlcm1pdCBoYXMgYWNjZXB0ZWQgaG9zdDpwb3J0IG5vdGF0aW9uIHNpbmNlIG1hbnkgeWVhcnMgYmVmb3JlIFVSTHMgd2VyZQorICBpbnZlbnRlZC4gIFVuZm9ydHVuYXRlbHksIFVSTHMgY29uZmxpY3Qgd2l0aCB0aGlzIG5vdGF0aW9uLiAgVGh1cyAiZnRwCisgIGhvc3Q6NDQ5IiBsb29rcyBsaWtlIGEgVVJMIGFuZCByZXN1bHRzIGluIHNlcnZpY2UgPSBob3N0IGFuZCBob3N0ID0gNDQ5LgorICBIZXJlIHdlIHRyeSB0byBjYXRjaCB0aGlzIHNpdHVhdGlvbiB0cmFuc3BhcmVudGx5IHRvIHRoZSB1c2VyLgorKi8KKyAgICAgICAgICAgICAgICAgIGlmIChja3N0cmNtcChnX3VybC5zdmMsImZ0cCIsLTEsMCkKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgY2tzdHJjbXAoZ191cmwuc3ZjLCJmdHBzIiwtMSwwKQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdfdXJsLnVzciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAhZ191cmwucHN3ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICFnX3VybC5wb3IgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIWdfdXJsLnB0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBnX3VybC5wb3IgPSBnX3VybC5ob3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGdfdXJsLmhvcyA9IGdfdXJsLnN2YzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ191cmwuc3ZjID0gImZ0cCI7CisgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2ttYWttc2codG1wYnVmLFRNUEJVRlNJWiwiTm9uLUZUUCBVUkw6IHNlcnZpY2U9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ191cmwuc3ZjLCIgaG9zdD0iLGdfdXJsLmhvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsKHRtcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgbWFrZXN0cigmZnRwX2hvc3QsZ191cmwuaG9zKTsKKyAgICAgICAgICAgICAgICAgIGlmIChnX3VybC51c3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICBoYXZlZnRwdWlkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkodWlkYnVmLGdfdXJsLnVzcixVSURCVUZMRU4pOworICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmZ0cF9sb2duYW1lLHVpZGJ1Zik7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBpZiAoZ191cmwucHN3KSB7CisgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmZnRwX3RtcCxnX3VybC5wc3cpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKGdfdXJsLnB0aCkgeworICAgICAgICAgICAgICAgICAgICAgIGlmICghZ191cmwudXNyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVmdHB1aWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkodWlkYnVmLCJhbm9ueW1vdXMiLFVJREJVRkxFTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmZ0cF9sb2duYW1lLHVpZGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGlmIChmdHBfYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsKCJPbmx5IG9uZSBGVFAgYWN0aW9uIGF0IGEgdGltZSBwbGVhc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF5ZmxnKQorICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQgPSAxOworICAgICAgICAgICAgICAgICAgICAgIG5maWxzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICBkdW1teVswXSA9IGdfdXJsLnB0aDsKKyAgICAgICAgICAgICAgICAgICAgICBjbWxpc3QgPSBkdW1teTsKKyAgICAgICAgICAgICAgICAgICAgICBmdHBfYWN0aW9uID0gJ2cnOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgeHAgPSBOVUxMOworICAgICAgICAgICAgICAgICAgaGF2ZXVybCA9IDE7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorI2VuZGlmIC8qIENLX1VSTCAqLworCisjaWZkZWYgRlRQX1NFQ1VSSVRZCisgICAgICAgICAgY2FzZSAnayc6IHsgICAgICAgICAgICAgICAgICAgLyogSzQgUmVhbG0gKi8KKyNpZmRlZiBGVFBfS1JCNAorICAgICAgICAgICAgICBja3N0cm5jcHkoZnRwX3JlYWxtLCp4YXJndiwgUkVBTE1fU1opOworI2VuZGlmIC8qIEZUUF9LUkI0ICovCisgICAgICAgICAgICAgIGlmIChmdHBfZGViKSBwcmludGYoIks0IFJlYWxtID0gWyVzXVxuIiwqeGFyZ3YpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSAnZic6IHsKKyNpZmRlZiBGVFBfR1NTQVBJCisgICAgICAgICAgICAgIGZ0cF9jZncgPSAxOworICAgICAgICAgICAgICBpZiAoZnRwX2RlYikgcHJpbnRmKCJLNSBDcmVkZW50aWFscyBGb3J3YXJkaW5nXG4iKTsKKyNlbHNlIC8qIEZUUF9HU1NBUEkgKi8KKyAgICAgICAgICAgICAgcHJpbnRmKCJLNSBDcmVkZW50aWFscyBGb3J3YXJkaW5nIG5vdCBzdXBwb3J0ZWRcbiIpOworI2VuZGlmIC8qIEZUUF9HU1NBUEkgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgJ3gnOiB7CisgICAgICAgICAgICAgIGZ0cF9jcnkgPSAxOworICAgICAgICAgICAgICBpZiAoZnRwX2RlYikgcHJpbnRmKCJBdXRvZW5jcnlwdGlvblxuIik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlICdjJzogeyAgICAgICAgICAgICAgICAgICAvKiBDaXBoZXIgKi8KKyNpZmRlZiBGVFBfU1JQCisgICAgICAgICAgICAgIGlmICghc3JwX3NlbGNpcGhlcigqeGFyZ3YpKSB7CisgICAgICAgICAgICAgICAgICBpZiAoZnRwX2RlYikgcHJpbnRmKCJTUlAgY2lwaGVyIHR5cGU6IFwiJXNcIlxuIiwqeGFyZ3YpOworICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIj9JbnZhbGlkIFNSUCBjaXBoZXIgdHlwZTogXCIlc1wiXG4iLCp4YXJndik7CisjZWxzZSAvKiBGVFBfU1JQICovCisgICAgICAgICAgICAgIHByaW50ZigiP1NSUCBub3Qgc3VwcG9ydGVkXG4iKTsKKyNlbmRpZiAvKiBGVFBfU1JQICovCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlICdIJzogeworI2lmZGVmIEZUUF9TUlAKKyAgICAgICAgICAgICAgaWYgKCFzcnBfc2VsaGFzaCgqeGFyZ3YpKSB7CisgICAgICAgICAgICAgICAgICBpZiAoZnRwX2RlYikgcHJpbnRmKCJTUlAgaGFzaCB0eXBlOiBcIiVzXCJcbiIsKnhhcmd2KTsKKyAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/SW52YWxpZCBTUlAgaGFzaCB0eXBlOiBcIiVzXCJcbiIsKnhhcmd2KTsKKyNlbHNlIC8qIEZUUF9TUlAgKi8KKyAgICAgICAgICAgICAgcHJpbnRmKCI/U1JQIG5vdCBzdXBwb3J0ZWRcbiIpOworI2VuZGlmIC8qIEZUUF9TUlAgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgJ3onOiB7CisgICAgICAgICAgICAgIC8qICp4YXJndiBjb250YWlucyBhIHZhbHVlIG9mIHRoZSBmb3JtIHRhZz12YWx1ZSAqLworICAgICAgICAgICAgICAvKiB3ZSBuZWVkIHRvIGxvb2t1cCB0aGUgdGFnIGFuZCBzYXZlIHRoZSB2YWx1ZSAgKi8KKyAgICAgICAgICAgICAgY2hhciAqIHAgPSBOVUxMLCAqIHEgPSBOVUxMOworICAgICAgICAgICAgICBtYWtlc3RyKCZwLCp4YXJndik7CisgICAgICAgICAgICAgIHkgPSBja2luZGV4KCI9IixwLDAsMCwxKTsKKyAgICAgICAgICAgICAgaWYgKHkgPiAwKQorICAgICAgICAgICAgICAgIHBbeS0xXSA9ICdcMCc7CisgICAgICAgICAgICAgIHggPSBsb29rdXAoZnRwenRhYixwLG5mdHB6dGFiLCZ6KTsKKyAgICAgICAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICAgICAgICBwcmludGYoIj9JbnZhbGlkIHNlY3VyaXR5IG9wdGlvbjogXCIlc1wiXG4iLHApOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgaWYgKGZ0cF9kZWIpCisJCSAgICBwcmludGYoIlNlY3VyaXR5IG9wdGlvbjogXCIlcyIscCk7CisgICAgICAgICAgICAgICAgICBpZiAoZnRwenRhYlt6XS5mbGdzICYgQ01fQVJHKSB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsKCI/TWlzc2luZyByZXF1aXJlZCB2YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICAgIHEgPSAmcFt5XTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoISpxKQorICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWwoIj9NaXNzaW5nIHJlcXVpcmVkIHZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ0cF9kZWIpCisJCQlwcmludGYoIj0lc1wiIixxKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZnRwenRhYlt6XS5rd3ZhbCkgeyAvKiAteiBvcHRpb25zIHcvYXJncyAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIEZUX05PR1NTOgorI2lmZGVmIEZUUF9HU1NBUEkKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgRlRQQVRZUFMgJiYgZnRwX2F1dGhfdHlwZVt6XTsgeisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdHBfYXV0aF90eXBlW3pdID09IEZUQV9HSzUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IHo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPCAoRlRQQVRZUFMtMSkgJiYgZnRwX2F1dGhfdHlwZVt5XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSsrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwX2F1dGhfdHlwZVt5XSA9IGZ0cF9hdXRoX3R5cGVbeSsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cF9hdXRoX3R5cGVbRlRQQVRZUFMtMV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogRlRQX0dTU0FQSSAqLworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZUX05PSzQ6CisjaWZkZWYgRlRQX0tSQjQKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgRlRQQVRZUFMgJiYgZnRwX2F1dGhfdHlwZVt6XTsgeisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdHBfYXV0aF90eXBlW3pdID09IEZUQV9LNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gejsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA8IChGVFBBVFlQUy0xKSAmJiBmdHBfYXV0aF90eXBlW3ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfYXV0aF90eXBlW3ldID0gZnRwX2F1dGhfdHlwZVt5KzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwX2F1dGhfdHlwZVtGVFBBVFlQUy0xXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBGVFBfS1JCNCAqLworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZUX05PU1JQOgorI2lmZGVmIEZUUF9TUlAKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgRlRQQVRZUFMgJiYgZnRwX2F1dGhfdHlwZVt6XTsgeisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdHBfYXV0aF90eXBlW3pdID09IEZUQV9TUlApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IHo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPCAoRlRQQVRZUFMtMSkgJiYgZnRwX2F1dGhfdHlwZVt5XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSsrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwX2F1dGhfdHlwZVt5XSA9IGZ0cF9hdXRoX3R5cGVbeSsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cF9hdXRoX3R5cGVbRlRQQVRZUFMtMV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogRlRQX1NSUCAqLworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZUX05PU1NMOgorI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICAgICAgICAgIGZvciAoeiA9IDA7IHogPCBGVFBBVFlQUyAmJiBmdHBfYXV0aF90eXBlW3pdOyB6KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ0cF9hdXRoX3R5cGVbel0gPT0gRlRBX1NTTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gejsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA8IChGVFBBVFlQUy0xKSAmJiBmdHBfYXV0aF90eXBlW3ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfYXV0aF90eXBlW3ldID0gZnRwX2F1dGhfdHlwZVt5KzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwX2F1dGhfdHlwZVtGVFBBVFlQUy0xXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGVF9OT1RMUzoKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgRlRQQVRZUFMgJiYgZnRwX2F1dGhfdHlwZVt6XTsgeisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdHBfYXV0aF90eXBlW3pdID09IEZUQV9UTFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IHo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPCAoRlRQQVRZUFMtMSkgJiYgZnRwX2F1dGhfdHlwZVt5XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSsrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwX2F1dGhfdHlwZVt5XSA9IGZ0cF9hdXRoX3R5cGVbeSsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cF9hdXRoX3R5cGVbRlRQQVRZUFMtMV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlRfQ0VSVEZJOgorI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzbF9yc2FfY2VydF9maWxlLHEpOworI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZUX09LQ0VSVDoKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAgICAgICBzc2xfY2VydHNva19mbGFnID0gMTsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGVF9ERUJVRzoKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJsb2cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBkZWJ0aW07CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnRpbSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVibG9nID0gZGVib3BuKCJkZWJ1Zy5sb2ciLDApOworICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZUX0tFWToKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2xfcnNhX2tleV9maWxlLHEpOworI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZUX1NFQ1VSRToKKyAgICAgICAgICAgICAgICAgICAgICAvKiBubyBlcXVpdmFsZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRlRfVkVSSUZZOgorI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICAgICAgICAgIGlmICghcmRpZ2l0cyhxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0JhZCBudW1iZXI6ICVzXG4iLHEpOworICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJpZnlfZmxhZyA9IGF0b2kocSk7CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKGZ0cF9kZWIpIHByaW50ZigiXCJcbiIpOworICAgICAgICAgICAgICBmcmVlKHApOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisjZW5kaWYgLyogRlRQX1NFQ1VSSVRZICovCisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZmF0YWwyKCp4YXJndiwKKyAgICAgICAgICAgICAgICAgICAidW5rbm93biBjb21tYW5kLWxpbmUgb3B0aW9uLCB0eXBlIFwiZnRwIC1oXCIgZm9yIGhlbHAiCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXhwKSBicmVhazsKKyAgICAgICAgYyA9ICorK3hwOyAgICAgICAgICAgICAgICAgICAgICAvKiBTZWUgaWYgb3B0aW9ucyBhcmUgYnVuZGxlZCAqLworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogTk9DTURMICovCisKK2ludAorZnRwaXNjb25uZWN0ZWQoKSB7CisgICAgcmV0dXJuKGNvbm5lY3RlZCk7Cit9CisKK2ludAorZnRwaXNsb2dnZWRpbigpIHsKKyAgICByZXR1cm4oY29ubmVjdGVkID8gbG9nZ2VkaW4gOiAwKTsKK30KKworaW50CitmdHBpc3NlY3VyZSgpIHsKKyAgICByZXR1cm4oKGZ0cF9kcGwgPT0gRlBMX0NMUiAmJiAhc3NsX2Z0cF9wcm94eSkgPyAwIDogMSk7Cit9CisKK3N0YXRpYyBWT0lECitmdHNjcmVlbihuLCBjLCB6LCBzKSBpbnQgbjsgY2hhciBjOyBsb25nIHo7IGNoYXIgKiBzOyB7CisgICAgaWYgKGRpc3BsYSAmJiBmZGlzcGxhICYmICFiYWNrZ3JkICYmICFxdWlldCAmJiAhb3V0MnNjcmVlbikgeworICAgICAgICBpZiAoIWRweWFjdGl2ZSkgeworICAgICAgICAgICAgY2tzY3JlZW4oU0NSX1BULCdTJywwTCwiIik7CisgICAgICAgICAgICBkcHlhY3RpdmUgPSAxOworICAgICAgICB9CisgICAgICAgIGNrc2NyZWVuKG4sYyx6LHMpOworICAgIH0KK30KKworI2lmbmRlZiBPUzIKKy8qICBnIG0gcyB0IGkgbSBlIHIgIC0tICBNaWxsaXNlY29uZCB0aW1lciAqLworCitsb25nCitnbXN0aW1lcigpIHsKKyNpZmRlZiBIQVZFX01TRUNTCisgICAgLyogRm9yIHRob3NlIHZlcnNpb25zIG9mIHp0aW1lKCkgdGhhdCBhbHNvIHNldCBnbG9iYWwgenRtc2VjLiAqLworICAgIGNoYXIgKnAgPSBOVUxMOworICAgIGxvbmcgejsKKyAgICB6dGltZSgmcCk7CisgICAgaWYgKCFwKSByZXR1cm4oMEwpOworICAgIGlmICghKnApIHJldHVybigwTCk7CisgICAgeiA9IGF0b2wocCsxMSkgKiAzNjAwTCArIGF0b2wocCsxNCkgKiA2MEwgKyBhdG9sKHArMTcpOworICAgIHJldHVybih6ICogMTAwMCArIHp0bXNlYyk7CisjZWxzZQorICAgIHJldHVybigobG9uZyl0aW1lKE5VTEwpICogMTAwMEwpOworI2VuZGlmIC8qIEhBVkVfTVNFQ1MgKi8KK30KKyNlbmRpZiAvKiBPUzIgKi8KKworLyogIGQgbyBzIGUgdCBmIHQgcCAgLS0gIFRoZSBTRVQgRlRQIGNvbW1hbmQgICovCisKK2ludAorZG9zZXRmdHAoKSB7CisgICAgaW50IGN4OworICAgIGlmICgoY3ggPSBjbWtleShmdHBzZXQsbmZ0cHNldCwiIiwiIix4eHN0cmluZykpIDwgMCkgLyogU2V0IHdoYXQ/ICovCisgICAgICByZXR1cm4oY3gpOworICAgIHN3aXRjaCAoY3gpIHsKKworICAgICAgY2FzZSBGVFNfRk5DOiAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGVuYW1lIGNvbGxpc2lvbiBhY3Rpb24gKi8KKyAgICAgICAgaWYgKCh4ID0gY21rZXkoZnRwY29seHRhYixuZnRwY29seCwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGZ0cF9mbmMgPSB4OworICAgICAgICByZXR1cm4oMSk7CisKKyAgICAgIGNhc2UgRlRTX0NOVjogICAgICAgICAgICAgICAgICAgICAvKiBGaWxlbmFtZSBjb252ZXJzaW9uICovCisgICAgICAgIGlmICgoeCA9IGNta2V5KGZudGFiLG5mbnRhYiwiIiwiYXV0b21hdGljIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGZ0cF9jbnYgPSB4OworICAgICAgICByZXR1cm4oMSk7CisKKyAgICAgIGNhc2UgRlRTX0RCRzogICAgICAgICAgICAgICAgICAgICAvKiBEZWJ1ZyBtZXNzYWdlcyAqLworICAgICAgICByZXR1cm4oc2V0b24oJmZ0cF9kZWIpKTsKKworICAgICAgY2FzZSBGVFNfTE9HOiAgICAgICAgICAgICAgICAgICAgIC8qIEF1dG8tbG9naW4gKi8KKyAgICAgICAgcmV0dXJuKHNldG9uKCZmdHBfbG9nKSk7CisKKyAgICAgIGNhc2UgRlRTX1BTVjogICAgICAgICAgICAgICAgICAgICAvKiBQYXNzaXZlIG1vZGUgKi8KKwlyZXR1cm4oZG9zZXRmdHBwc3YoKSk7CisKKyAgICAgIGNhc2UgRlRTX1NQQzogICAgICAgICAgICAgICAgICAgICAvKiBTZW5kIHBvcnQgY29tbWFuZHMgKi8KKyAgICAgICAgeCA9IHNldG9uKCZmdHBfc3BjKTsKKyAgICAgICAgaWYgKHggPiAwKSBzZW5kcG9ydCA9IGZ0cF9zcGM7CisgICAgICAgIHJldHVybih4KTsKKworICAgICAgY2FzZSBGVFNfVFlQOiAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgKi8KKyAgICAgICAgaWYgKCh4ID0gY21rZXkoZnRwdHlwLG5mdHB0eXAsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgZnRwX3R5cCA9IHg7CisgICAgICAgIGdfZnRwX3R5cCA9IHg7CisgICAgICAgIHRlbmV4ID0gKGZ0cF90eXAgPT0gRlRUX1RFTik7CisgICAgICAgIHJldHVybigxKTsKKworICAgICAgY2FzZSBGVFNfVVNOOiAgICAgICAgICAgICAgICAgICAgIC8qIFVuaXF1ZSBzZXJ2ZXIgbmFtZXMgKi8KKyAgICAgICAgcmV0dXJuKHNldG9uKCZmdHBfdXNuKSk7CisKKyAgICAgIGNhc2UgRlRTX1ZCTTogICAgICAgICAgICAgICAgICAgICAvKiBWZXJib3NlIG1vZGUgKi8KKyAgICAgICAgaWYgKCh4ID0gc2V0b24oJmZ0cF92Ym0pKSA8IDApICAvKiBQZXItY29tbWFuZCBjb3B5ICovCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBmdHBfdmJ4ID0gZnRwX3ZibTsgICAgICAgICAgICAgIC8qIEdsb2JhbCBzdGlja3kgY29weSAqLworICAgICAgICByZXR1cm4oeCk7CisKKyAgICAgIGNhc2UgRlRTX1RTVDogICAgICAgICAgICAgICAgICAgICAvKiAiaWYgKHRlc3RpbmcpIiBtZXNzYWdlcyAqLworICAgICAgICByZXR1cm4oc2V0b24oJnRlc3RpbmcpKTsKKworICAgICAgY2FzZSBGVFNfUFJNOiAgICAgICAgICAgICAgICAgICAgIC8qIFNlbmQgcGVybWlzc2lvbnMgKi8KKyAgICAgICAgcmV0dXJuKHNldG9uYXV0KCZmdHBfcHJtKSk7CisKKyAgICAgIGNhc2UgRlRTX0FVVDogICAgICAgICAgICAgICAgICAgICAvKiBBdXRvLWF1dGhlbnRpY2F0aW9uICovCisgICAgICAgIHJldHVybihzZXRvbigmZnRwX2F1dCkpOworCisgICAgICBjYXNlIEZUU19FUlI6ICAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IgYWN0aW9uICovCisgICAgICAgIGlmICgoeCA9IGNta2V5KHFvcnAsMiwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGZ0cF9lcnIgPSB4OworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgIGNhc2UgRlRTX1hMQTogICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2xhdGlvbiAqLworICAgICAgICByZXR1cm4oc2V0b24oJmZ0cF94bGEpKTsKKworICAgICAgY2FzZSBGVFNfQ1NSOiAgICAgICAgICAgICAgICAgICAgIC8qIFNlcnZlciBjaGFyc2V0ICovCisgICAgICAgIGlmICgoeCA9IGNta2V5KGZjc3RhYixuZmlsYywiY2hhcmFjdGVyLXNldCIsInV0ZjgiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgZnRwX2NzciA9IHg7CisgICAgICAgIGZ0cF94bGEgPSAxOyAgICAgICAgICAgICAgICAgICAgLyogQWxzbyBlbmFibGUgdHJhbnNsYXRpb24gKi8KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyAgICAgIGNhc2UgRlRTX0dGVDoKKyAgICAgICAgcmV0dXJuKHNldG9uKCZnZXRfYXV0bykpOyAgICAgICAvKiBHRVQtZmlsZXR5cGUtc3dpdGNoaW5nICovCisKKyAgICAgIGNhc2UgRlRTX0RBVDoKKyAgICAgICAgcmV0dXJuKHNldG9uKCZmdHBfZGF0ZXMpKTsgICAgICAvKiBTZXQgZmlsZSBkYXRlcyAqLworCisgICAgICBjYXNlIEZUU19TVE86IHsJCQkvKiBTZXJ2ZXIgdGltZSBvZmZzZXQgKi8KKwkgIGNoYXIgKiBzLCAqIHAgPSBOVUxMOworCSAgaW50IGs7CisJICBpZiAoKHggPSBjbWZsZCgiWystXWhoWzptbVs6c3NdXSIsIiswIiwmcyx4eHN0cmluZykpIDwgMCkKKwkgICAgcmV0dXJuKHgpOworCSAgaWYgKCFzdHJjbXAocywiKzAiKSkgeworCSAgICAgIHMgPSBOVUxMOworCSAgfSBlbHNlIGlmICgoeCA9IGRlbHRhMnNlYyhzLCZrKSkgPCAwKSB7IC8qIENoZWNrIGZvcm1hdCAqLworCSAgICAgIHByaW50ZigiP0ludmFsaWQgdGltZSBvZmZzZXRcbiIpOworCSAgICAgIHJldHVybigtOSk7CisJICB9CisJICBtYWtlc3RyKCZwLHMpOwkJLyogTWFrZSBhIHNhZmUgY29weSB0aGUgc3RyaW5nICovCisJICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHsJLyogR2V0IGNvbmZpcm1hdGlvbiAqLworCSAgICAgIGlmIChwKQorCQltYWtlc3RyKCZwLE5VTEwpOworCSAgICAgIHJldHVybih4KTsKKwkgIH0KKwkgIGZ0c19zdG8gPSBwOwkJCS8qIENvbmZpcm1lZCAtIHNldCB0aGUgc3RyaW5nLiAqLworCSAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgRlRTX0FQVzogeworCSAgY2hhciAqIHM7CisJICBpZiAoKHggPSBjbXR4dCgiVGV4dCIsICIiLCAmcywgeHhzdHJpbmcpKSA8IDApCisJICAgIHJldHVybih4KTsKKwkgIG1ha2VzdHIoJmZ0cF9hcHcsICpzID8gcyA6IE5VTEwpOworCSAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIH0KKworICAgICAgY2FzZSBGVFNfQlVHOiB7CisgICAgICAgICAgaWYgKCh4ID0gY21rZXkoZnRwYnVndGFiLG5mdHBidWcsIiIsIiIseHhzdHJpbmcpKSA8IDApIAorCSAgICByZXR1cm4oeCk7CisgICAgICAgICAgc3dpdGNoICh4KSB7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgY2FzZSBGVEJfU1YyOgorCSAgICByZXR1cm4gc2V0b24oJmZ0cF9idWdfdXNlX3NzbF92Mik7CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgZGVmYXVsdDoKKwkgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICB9CisgICAgICB9CisKKyNpZmRlZiBGVFBfU0VDVVJJVFkKKyAgICAgIGNhc2UgRlRTX0NSWTogICAgICAgICAgICAgICAgICAgICAvKiBBdXRvLWVuY3J5cHRpb24gKi8KKyAgICAgICAgcmV0dXJuKHNldG9uKCZmdHBfY3J5KSk7CisKKyAgICAgIGNhc2UgRlRTX0NGVzogICAgICAgICAgICAgICAgICAgICAvKiBDcmVkZW50aWFsLWZvcndhcmRpbmcgKi8KKyAgICAgICAgcmV0dXJuKHNldG9uKCZmdHBfY2Z3KSk7CisKKyAgICAgIGNhc2UgRlRTX0NQTDogICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kIHByb3RlY3Rpb24gbGV2ZWwgKi8KKyAgICAgICAgaWYgKCh4ID0gY21rZXkoZnRwcHJvLG5mdHBwcm8sIiIsIiIseHhzdHJpbmcpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHN1Y2Nlc3MgPSBmdHNfY3BsKHgpOworICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisKKyAgICAgIGNhc2UgRlRTX0RQTDogICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIHByb3RlY3Rpb24gbGV2ZWwgKi8KKyAgICAgICAgaWYgKCh4ID0gY21rZXkoZnRwcHJvLG5mdHBwcm8sIiIsIiIseHhzdHJpbmcpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgICAgc3VjY2VzcyA9IGZ0c19kcGwoeCk7CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MpOworCisgICAgICBjYXNlIEZUU19BVFA6IHsgICAgICAgICAgICAgICAgICAgLyogRlRQIEF1dGggVHlwZSAqLworICAgICAgICAgIGludCBpLCBqLCBhdHlwZXNbOF07CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KGZ0cGF1dGgsbmZ0cGF1dGgsIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpID09IDApID8gImF1dG9tYXRpYyIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgIGlmICh5ID09IC0zKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgKHkgPT0gRlRBX0FVVE8pKSB7CisgICAgICAgICAgICAgICAgICBwcmludGYoIj9DaG9pY2UgbWF5IG9ubHkgYmUgdXNlZCBpbiBmaXJzdCBwb3NpdGlvbi5cclxuIik7CisgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgIGlmIChhdHlwZXNbal0gPT0geSkgeworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXHJcbj9DaG9pY2UgaGFzIGFscmVhZHkgYmVlbiB1c2VkLlxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGF0eXBlc1tpXSA9IHk7CisgICAgICAgICAgICAgIGlmICh5ID09IEZUQV9BVVRPKSB7CisgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaSA8IDgpCisgICAgICAgICAgICBhdHlwZXNbaV0gPSAwOworICAgICAgICAgIGlmICgoeiA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgICBpZiAoYXR5cGVzWzBdID09IEZUQV9BVVRPKSB7CisgICAgICAgICAgICAgIGkgPSAwOworI2lmZGVmIEZUUF9HU1NBUEkKKyAgICAgICAgICAgICAgZnRwX2F1dGhfdHlwZVtpKytdID0gRlRBX0dLNTsKKyNlbmRpZiAvKiBGVFBfR1NTQVBJICovCisjaWZkZWYgRlRQX1NSUAorICAgICAgICAgICAgICBmdHBfYXV0aF90eXBlW2krK10gPSBGVEFfU1JQOworI2VuZGlmIC8qIEZUUF9TUlAgKi8KKyNpZmRlZiBGVFBfS1JCNAorICAgICAgICAgICAgICBmdHBfYXV0aF90eXBlW2krK10gPSBGVEFfSzQ7CisjZW5kaWYgLyogRlRQX0tSQjQgKi8KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgZnRwX2F1dGhfdHlwZVtpKytdID0gRlRBX1RMUzsKKyAgICAgICAgICAgICAgZnRwX2F1dGhfdHlwZVtpKytdID0gRlRBX1NTTDsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgZnRwX2F1dGhfdHlwZVtpXSA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgICAgICBmdHBfYXV0aF90eXBlW2ldID0gYXR5cGVzW2ldOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorCisgICAgICBjYXNlIEZUU19TUlA6CisjaWZkZWYgRlRQX1NSUAorICAgICAgICBpZiAoKHggPSBjbWtleShmdHBzcnAsbmZ0cHNycCwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIHN3aXRjaCAoeCkgeworICAgICAgICAgIGNhc2UgU1JQX0NJUEhFUjoKKyAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KGNpcGhlcnRhYixuY2lwaGVydGFiLCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSAhc3JwX3NlbGNpcGhlcihjaXBoZXJ0YWJbeF0ua3dkKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzKTsKKyAgICAgICAgICBjYXNlIFNSUF9IQVNIOgorICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkoaGFzaHRhYixuaGFzaHRhYiwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgICAgICBzdWNjZXNzID0gIXNycF9zZWxoYXNoKGhhc2h0YWJbeF0ua3dkKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICgoeiA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorI2Vsc2UgLyogRlRQX1NSUCAqLworICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICByZXR1cm4oLTIpOworI2VuZGlmIC8qIEZUUF9TUlAgKi8KKyNlbmRpZiAvKiBGVFBfU0VDVVJJVFkgKi8KKworICAgICAgY2FzZSBGVFNfRElTOgorCWRveGRpcygyKTsJCQkvKiAyID09IGZ0cCAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4oLTIpOworICAgIH0KK30KKworaW50CitmdHBieWUoKSB7CisgICAgaW50IHg7CisgICAgaWYgKCFjb25uZWN0ZWQpCisgICAgICByZXR1cm4oMSk7CisgICAgaWYgKHRlc3RpbmcpCisgICAgICBwcmludGYoIiBmdHAgY2xvc2luZyAlcy4uLlxuIixmdHBfaG9zdCk7CisgICAgeCA9IGZ0cGNsb3NlKCk7CisgICAgcmV0dXJuKCh4ID4gLTEpID8gMSA6IDApOworfQorCisvKiAgbyBwIGUgbiBmIHQgcCAgLS0gIFBhcnNlIEZUUCBob3N0bmFtZSAmIHBvcnQgYW5kIG9wZW4gKi8KKworc3RhdGljIGludAorb3BlbmZ0cChzLG9wbl90bHMpIGNoYXIgKiBzOyBpbnQgb3BuX3RsczsgeworICAgIGNoYXIgYywgKiBwLCAqIGhvc3RuYW1lID0gTlVMTCwgKmhvc3RzYXZlID0gTlVMTCwgKiBzZXJ2aWNlID0gTlVMTDsKKyAgICBpbnQgaSwgbiwgaGF2ZWhvc3QgPSAwLCBnZXR2YWwgPSAwLCByYyA9IC05LCBvcG5fcHN2ID0gLTEsIG5vbG9naW4gPSAwOworICAgIGludCBoYXZldXNlciA9IDA7CisgICAgc3RydWN0IEZEQiBzdywgZmwsIGNtOworICAgIGV4dGVybiBpbnQgbm5ldGRpcjsgICAgICAgICAgICAgICAgIC8qIE5ldHdvcmsgc2VydmljZXMgZGlyZWN0b3J5ICovCisgICAgZXh0ZXJuIGludCBuaGNvdW50OyAgICAgICAgICAgICAgICAgLyogTG9va3VwIHJlc3VsdCAqLworICAgIGV4dGVybiBjaGFyICpuaF9wW107ICAgICAgICAgICAgICAgIC8qIE5ldHdvcmsgZGlyZWN0b3J5IGVudHJ5IHBvaW50ZXJzICovCisgICAgZXh0ZXJuIGNoYXIgKm5oX3AyW107ICAgICAgICAgICAgICAgLyogTmV0d29yayBkaXJlY3RvcnkgZW50cnkgbmV0dHlwZSAqLworCisgICAgaWYgKCFzKSByZXR1cm4oLTIpOworICAgIGlmICghKnMpIHJldHVybigtMik7CisKKyAgICBtYWtlc3RyKCZob3N0bmFtZSxzKTsKKyAgICBob3N0c2F2ZSA9IGhvc3RuYW1lOworICAgIG1ha2VzdHIoJmZ0cF9sb2duYW1lLE5VTEwpOworICAgIGFub255bW91cyA9IDA7CisgICAgbm9pbml0ID0gMDsKKworICAgIGRlYnVnKEYxMTAsImZ0cCBvcGVuIixob3N0bmFtZSwwKTsKKworICAgIGlmIChzYXZfcHN2ID4gLTEpIHsgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgcHJldmFpbGluZyBhY3RpdmUvcGFzc2l2ZSAqLworICAgICAgICBmdHBfcHN2ID0gc2F2X3BzdjsgICAgICAgICAgICAgIC8qIHNlbGVjdGlvbiBpbiBjYXNlIGl0IHdhcyAqLworICAgICAgICBzYXZfcHN2ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyaWx5IG92ZXJyaWRlbiBieSBhIHN3aXRjaCAqLworICAgIH0KKyAgICBpZiAoc2F2X2xvZyA+IC0xKSB7ICAgICAgICAgICAgICAgICAvKiBEaXR0byBmb3IgYXV0b2xvZ2luICovCisgICAgICAgIGZ0cF9sb2cgPSBzYXZfbG9nOworICAgICAgICBzYXZfbG9nID0gLTE7CisgICAgfQorICAgIGNtZmRiaSgmc3csICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN3aXRjaGVzICovCisgICAgICAgICAgIF9DTUtFWSwKKyAgICAgICAgICAgIlNlcnZpY2UgbmFtZSBvciBwb3J0O1xuIG9yIHN3aXRjaCIsCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIG5mdHBzd2ksICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IG5vbmUgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgIGZ0cHN3aXRhYiwgICAgICAgICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAmZmwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKyAgICAgICAgICAgKTsKKyAgICBjbWZkYmkoJmZsLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBIGhvc3QgbmFtZSBvciBhZGRyZXNzICovCisgICAgICAgICAgIF9DTUZMRCwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoZWxwICovCisgICAgICAgICAgICJ4WXpCb28iLCAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworICAgICAgICAgICB4eHN0cmluZywKKyAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgJmNtCisgICAgICAgICAgICk7CisgICAgY21mZGJpKCZjbSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBjb25maXJtYXRpb24gKi8KKyAgICAgICAgICAgX0NNQ0ZNLAorICAgICAgICAgICAiIiwKKyAgICAgICAgICAgIiIsCisgICAgICAgICAgICIiLAorICAgICAgICAgICAwLAorICAgICAgICAgICAwLAorICAgICAgICAgICBOVUxMLAorICAgICAgICAgICBOVUxMLAorICAgICAgICAgICBOVUxMCisgICAgICAgICAgICk7CisKKyAgICBmb3IgKG4gPSAwOzsgbisrKSB7CisgICAgICAgIHJjID0gY21mZGIoJnN3KTsgICAgICAgICAgICAgICAgLyogUGFyc2UgYSBzZXJ2aWNlIG5hbWUgb3IgYSBzd2l0Y2ggKi8KKyAgICAgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgICBnb3RvIHhvcGVuZnRwOworCisgICAgICAgIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01DRk0pIHsgLyogRG9uZT8gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGNtcmVzdWx0LmZjb2RlID09IF9DTUZMRCkgeyAgLyogUG9ydCAqLworICAgICAgICAgICAgaWYgKGNrc3RyY21wKCJ4WXpCb28iLGNtcmVzdWx0LnNyZXN1bHQsLTEsMSkpCisgICAgICAgICAgICAgIG1ha2VzdHIoJnNlcnZpY2UsY21yZXN1bHQuc3Jlc3VsdCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG1ha2VzdHIoJnNlcnZpY2Usb3BuX3Rscz8iZnRwcyI6ImZ0cCIpOworICAgICAgICB9IGVsc2UgaWYgKGNtcmVzdWx0LmZjb2RlID09IF9DTUtFWSkgeyAvKiBIYXZlIGEgc3dpdGNoICovCisgICAgICAgICAgICBjID0gY21nYnJrKCk7ICAgICAgICAgICAgICAgLyogZ2V0IGJyZWFrIGNoYXJhY3RlciAqLworICAgICAgICAgICAgZ2V0dmFsID0gKGMgPT0gJzonIHx8IGMgPT0gJz0nKTsKKyAgICAgICAgICAgIHJjID0gLTk7CisgICAgICAgICAgICBpZiAoZ2V0dmFsICYmICEoY21yZXN1bHQua2ZsYWdzICYgQ01fQVJHKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIGRvZXMgbm90IHRha2UgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIHhvcGVuZnRwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFnZXR2YWwgJiYgKGNtcmVzdWx0LmtmbGFncyAmIENNX0FSRykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisgICAgICAgICAgICAgICAgZ290byB4b3BlbmZ0cDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoY21yZXN1bHQubnJlc3VsdCkgeyAvKiBTd2l0Y2ggKi8KKyAgICAgICAgICAgICAgY2FzZSBPUE5fQU5POiAgICAgICAgICAgICAvKiAvQU5PTllNT1VTICovCisgICAgICAgICAgICAgICAgYW5vbnltb3VzKys7CisJCW5vbG9naW4gPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIE9QTl9OSU46ICAgICAgICAgICAgIC8qIC9OT0lOSVQgKi8KKyAgICAgICAgICAgICAgICBub2luaXQrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBPUE5fTk9MOiAgICAgICAgICAgICAvKiAvTk9MT0dJTiAqLworICAgICAgICAgICAgICAgIG5vbG9naW4rKzsKKwkJYW5vbnltb3VzID0gMDsKKwkJbWFrZXN0cigmZnRwX2xvZ25hbWUsTlVMTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgT1BOX1BTVzogICAgICAgICAgICAgLyogL1BBU1NXT1JEICovCisgICAgICAgICAgICAgICAgaWYgKCFhbm9ueW1vdXMpICAgICAgICAgLyogRG9uJ3QgbG9nIHJlYWwgcGFzc3dvcmRzICovCisgICAgICAgICAgICAgICAgICBkZWJvayA9IDA7CisgICAgICAgICAgICAgICAgcmMgPSBjbWZsZCgiUGFzc3dvcmQgZm9yIEZUUCBzZXJ2ZXIiLCIiLCZwLHh4c3RyaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmZnRwX3RtcCxOVUxMKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIHhvcGVuZnRwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmZ0cF90bXAsYnJzdHJpcChwKSk7CisJCSAgICBub2xvZ2luID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgT1BOX1VTUjogICAgICAgICAgICAgLyogL1VTRVIgKi8KKyAgICAgICAgICAgICAgICByYyA9IGNtZmxkKCJVc2VybmFtZSBmb3IgRlRQIHNlcnZlciIsIiIsJnAseHhzdHJpbmcpOworICAgICAgICAgICAgICAgIGlmIChyYyA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZmdHBfbG9nbmFtZSxOVUxMKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIHhvcGVuZnRwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCSAgICBub2xvZ2luID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYW5vbnltb3VzID0gMDsKKwkJICAgIGhhdmV1c2VyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmZnRwX2xvZ25hbWUsYnJzdHJpcChwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIE9QTl9BQ0M6CisgICAgICAgICAgICAgICAgcmMgPSBjbWZsZCgiQWNjb3VudCBmb3IgRlRQIHNlcnZlciIsIiIsJnAseHhzdHJpbmcpOworICAgICAgICAgICAgICAgIGlmIChyYyA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZmdHBfYWNjLE5VTEwpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8geG9wZW5mdHA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmZnRwX2FjYyxicnN0cmlwKHApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgT1BOX0FDVDoKKyAgICAgICAgICAgICAgICBvcG5fcHN2ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBPUE5fUFNWOgorICAgICAgICAgICAgICAgIG9wbl9wc3YgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIE9QTl9UTFM6CisgICAgICAgICAgICAgICAgb3BuX3RscyA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPT0gMCkgeyAgICAgICAgICAgICAgICAgICAvKiBBZnRlciBmaXJzdCB0aW1lIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNtZmRiaSgmc3csICAgICAgICAgICAgICAgICAvKiBhY2NlcHQgb25seSBzd2l0Y2hlcyAqLworICAgICAgICAgICAgICAgICAgIF9DTUtFWSwKKyAgICAgICAgICAgICAgICAgICAiXG5DYXJyaWFnZSByZXR1cm4gdG8gY29uZmlybSB0byBjb21tYW5kLCBvciBzd2l0Y2giLAorICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgIG5mdHBzd2ksCisgICAgICAgICAgICAgICAgICAgNCwKKyAgICAgICAgICAgICAgICAgICB4eHN0cmluZywKKyAgICAgICAgICAgICAgICAgICBmdHBzd2l0YWIsCisgICAgICAgICAgICAgICAgICAgJmNtCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBDT01NRU5UCisgICAgZGVidWcoRjEwMCwiZnRwIG9wZW5mdHAgd2hpbGUgZXhpdCIsIiIsMCk7CisgICAgcmMgPSBjbWNmbSgpOworICAgIGRlYnVnKEYxMDEsImZ0cCBvcGVuZnRwIGNtY2ZtIHJjIiwiIixyYyk7CisgICAgaWYgKHJjIDwgMCkKKyAgICAgIGdvdG8geG9wZW5mdHA7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgaWYgKG9wbl9wc3YgPiAtMSkgeyAgICAgICAgICAgICAgICAgLyogL1BBU1NJVkUgb3IgL0FDVElWRSBzd2l0Y2ggZ2l2ZW4gKi8KKyAgICAgICAgc2F2X3BzdiA9IGZ0cF9wc3Y7CisgICAgICAgIGZ0cF9wc3YgPSBvcG5fcHN2OworICAgIH0KKyAgICBpZiAobm9sb2dpbiB8fCBoYXZldXNlcikgewkJLyogL05PTE9HSU4gb3IgL1VTRVIgc3dpdGNoIGdpdmVuICovCisJc2F2X2xvZyA9IGZ0cF9sb2c7CisJZnRwX2xvZyA9IGhhdmV1c2VyID8gMSA6IDA7CisgICAgfQorICAgIGlmICgqaG9zdG5hbWUgPT0gJz0nKSB7ICAgICAgICAgICAgIC8qIEJ5cGFzcyBkaXJlY3RvcnkgbG9va3VwICovCisgICAgICAgIGhvc3RuYW1lKys7ICAgICAgICAgICAgICAgICAgICAgLyogaWYgaG9zdG5hbWUgc3RhcnRzIHdpdGggJz0nICovCisgICAgICAgIGhhdmVob3N0Kys7CisgICAgfSBlbHNlIGlmIChpc2RpZ2l0KCpob3N0bmFtZSkpIHsgICAgLyogb3IgaWYgaXQgc3RhcnRzIHdpdGggYSBkaWdpdCAqLworICAgICAgICBoYXZlaG9zdCsrOworICAgIH0KKyAgICBpZiAoIXNlcnZpY2UpCisgICAgICBtYWtlc3RyKCZzZXJ2aWNlLG9wbl90bHM/ImZ0cHMiOiJmdHAiKTsKKworI2lmbmRlZiBOT0RJQUwKKyAgICBpZiAoIWhhdmVob3N0ICYmIG5uZXRkaXIgPiAwKSB7ICAgICAvKiBJZiB0aGVyZSBpcyBhIG5ldHdvcmtzIGRpcmVjdG9yeSAqLworICAgICAgICBsdW5ldChob3N0bmFtZSk7ICAgICAgICAgICAgICAgIC8qIExvb2sgdXAgdGhlIG5hbWUgKi8KKyAgICAgICAgZGVidWcoRjExMSwiZnRwIG9wZW5mdHAgbHVuZXQiLGhvc3RuYW1lLG5oY291bnQpOworICAgICAgICBpZiAobmhjb3VudCA9PSAwKSB7CisgICAgICAgICAgICBpZiAodGVzdGluZykKKyAgICAgICAgICAgICAgcHJpbnRmKCIgZnRwIG9wZW4gdHJ5aW5nIFwiJXMgJXNcIi4uLlxuIixob3N0bmFtZSxzZXJ2aWNlKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBmdHBvcGVuKGhvc3RuYW1lLHNlcnZpY2Usb3BuX3Rscyk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJmdHAgb3BlbmZ0cCBBIGZ0cG9wZW4gc3VjY2VzcyIsIiIsc3VjY2Vzcyk7CisgICAgICAgICAgICByYyA9IHN1Y2Nlc3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgZm91bmQgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5oY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChuaF9wMltpXSkgICAgICAgICAgIC8qIElmIG5ldHdvcmsgdHlwZSBzcGVjaWZpZWQgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChja3N0cmNtcChuaF9wMltpXSwidGNwL2lwIixzdHJsZW4obmhfcDJbaV0pLDApKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBmb3VuZCsrOworICAgICAgICAgICAgICAgIG1ha2VzdHIoJmhvc3RuYW1lLG5oX3BbaV0pOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cG9wZW4gbHVuZXQgc3Vic3RpdHV0aW9uIixob3N0bmFtZSxpKTsKKyAgICAgICAgICAgICAgICBpZiAodGVzdGluZykKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiIGZ0cCBvcGVuIHRyeWluZyBcIiVzICVzXCIuLi5cbiIsaG9zdG5hbWUsc2VydmljZSk7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZ0cG9wZW4oaG9zdG5hbWUsc2VydmljZSxvcG5fdGxzKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJmdHAgb3BlbmZ0cCBCIGZ0cG9wZW4gc3VjY2VzcyIsIiIsc3VjY2Vzcyk7CisgICAgICAgICAgICAgICAgcmMgPSBzdWNjZXNzOworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7ICAgICAgICAgICAgICAgLyogRS5nLiBpZiBubyBuZXR3b3JrIHR5cGVzIG1hdGNoICovCisgICAgICAgICAgICAgICAgaWYgKHRlc3RpbmcpCisgICAgICAgICAgICAgICAgICBwcmludGYoIiBmdHAgb3BlbiB0cnlpbmcgXCIlcyAlc1wiLi4uXG4iLGhvc3RuYW1lLHNlcnZpY2UpOworICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmdHBvcGVuKGhvc3RuYW1lLHNlcnZpY2Usb3BuX3Rscyk7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiZnRwIG9wZW5mdHAgQyBmdHBvcGVuIHN1Y2Nlc3MiLCIiLHN1Y2Nlc3MpOworICAgICAgICAgICAgICAgIHJjID0gc3VjY2VzczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisjZW5kaWYgLyogTk9ESUFMICovCisgICAgICAgIGlmICh0ZXN0aW5nKQorICAgICAgICAgIHByaW50ZigiIGZ0cCBvcGVuIHRyeWluZyBcIiVzICVzXCIuLi5cbiIsaG9zdG5hbWUsc2VydmljZSk7CisgICAgICAgIHN1Y2Nlc3MgPSBmdHBvcGVuKGhvc3RuYW1lLHNlcnZpY2Usb3BuX3Rscyk7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBvcGVuZnRwIEQgZnRwb3BlbiBzdWNjZXNzIixob3N0bmFtZSxzdWNjZXNzKTsKKyAgICAgICAgZGVidWcoRjExMSwiZnRwIG9wZW5mdHAgRCBmdHBvcGVuIGNvbm5lY3RlZCIsaG9zdG5hbWUsY29ubmVjdGVkKTsKKyAgICAgICAgcmMgPSBzdWNjZXNzOworI2lmbmRlZiBOT0RJQUwKKyAgICB9CisjZW5kaWYgLyogTk9ESUFMICovCisKKyAgeG9wZW5mdHA6CisgICAgZGVidWcoRjEwMSwiZnRwIG9wZW5mdHAgeG9wZW5mdHAgcmMiLCIiLHJjKTsKKyAgICBpZiAoaG9zdHNhdmUpIGZyZWUoaG9zdHNhdmUpOworICAgIGlmIChzZXJ2aWNlKSBmcmVlKHNlcnZpY2UpOworICAgIGlmIChyYyA8IDAgJiYgZnRwX2xvZ25hbWUpIHsKKyAgICAgICAgZnJlZShmdHBfbG9nbmFtZSk7CisgICAgICAgIGZ0cF9sb2duYW1lID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGZ0cF90bXApIHsKKyAgICAgICAgZnJlZShmdHBfdG1wKTsKKyAgICAgICAgZnRwX3RtcCA9IE5VTEw7CisgICAgfQorICAgIHJldHVybihyYyk7Cit9CisKK2ludAorZG9mdHBhY2N0KCkgeworICAgIGludCB4OworICAgIGNoYXIgKiBzOworICAgIGlmICgoeCA9IGNtdHh0KCJSZW1vdGUgYWNjb3VudCIsICIiLCAmcywgeHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgQ0hFQ0tDT05OKCk7CisgICAgbWFrZXN0cigmZnRwX2FjYyxicnN0cmlwKHMpKTsKKyAgICBpZiAodGVzdGluZykKKyAgICAgIHByaW50ZigiIGZ0cCBhY2NvdW50OiBcIiVzXCJcbiIsZnRwX2FjYyk7CisgICAgc3VjY2VzcyA9IChmdHBjbWQoIkFDQ1QiLGZ0cF9hY2MsLTEsLTEsZnRwX3ZibSkgPT0gUkVQTFlfQ09NUExFVEUpOworICAgIHJldHVybihzdWNjZXNzKTsKK30KKworaW50Citkb2Z0cHVzcigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9nIGluIGFzIFVTRVIgKi8KKyAgICBpbnQgeDsKKyAgICBjaGFyICpzLCAqIGFjY3QgPSAiIjsKKworICAgIGRlYm9rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGxvZyAqLworICAgIGlmICgoeCA9IGNtZmxkKCJSZW1vdGUgdXNlcm5hbWUgb3IgSUQiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworICAgIGNrc3RybmNweShsaW5lLGJyc3RyaXAocyksTElOQlVGU0laKTsgLyogYnJzdHJpcDogMTUgSmFuIDIwMDMgKi8KKyAgICBpZiAoKHggPSBjbWZsZCgiUmVtb3RlIHBhc3N3b3JkIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgIGlmICh4ICE9IC0zKQorICAgICAgICByZXR1cm4oeCk7CisgICAgY2tzdHJuY3B5KHRtcGJ1ZixicnN0cmlwKHMpLFRNUEJVRlNJWik7CisgICAgaWYgKCh4ID0gY210eHQoIlJlbW90ZSBhY2NvdW50XG4gb3IgRW50ZXIgb3IgQ1IgdG8gY29uZmlybSB0aGUgY29tbWFuZCIsCisgICAgICAgICAgICAgICAgICAgIiIsICZzLCB4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih4KTsKKyAgICBDSEVDS0NPTk4oKTsKKyAgICBpZiAoKnMpIHsKKyAgICAgICAgeCA9IHN0cmxlbih0bXBidWYpOworICAgICAgICBpZiAoeCA+IDApIHsKKyAgICAgICAgICAgIGFjY3QgPSAmdG1wYnVmW3grMl07CisgICAgICAgICAgICBja3N0cm5jcHkoYWNjdCxicnN0cmlwKHMpLFRNUEJVRlNJWiAtIHggLSAyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGVzdGluZykKKyAgICAgIHByaW50ZigiIGZ0cCB1c2VyIFwiJXNcIiBwYXNzd29yZCBcIiVzXCIuLi5cbiIsbGluZSx0bXBidWYpOworICAgIHN1Y2Nlc3MgPSBmdHBfdXNlcihsaW5lLHRtcGJ1ZixhY2N0KTsKKyNpZmRlZiBDS0xPR0RJQUwKKyAgICBkb2xvZ2Z0cCgpOworI2VuZGlmIC8qIENLTE9HRElBTCAqLworICAgIHJldHVybihzdWNjZXNzKTsKK30KKworLyogRE8gKHZhcmlvdXMgRlRQIGNvbW1hbmRzKS4uLiAqLworCitpbnQKK2RvZnRwdHlwKHR5cGUpIGludCB0eXBlOyB7ICAgICAgICAgICAgICAvKiBUWVBFICovCisgICAgQ0hFQ0tDT05OKCk7CisgICAgZnRwX3R5cCA9IHR5cGU7CisgICAgY2hhbmdldHlwZShmdHBfdHlwLGZ0cF92Ym0pOworICAgIHJldHVybigxKTsKK30KKworc3RhdGljIGludAorZG9mdHB4bWtkKHMsdmJtKSBjaGFyICogczsgaW50IHZibTsgeyAgIC8qIE1LRElSIGFjdGlvbiAqLworICAgIGludCBsY3MgPSAtMSwgcmNzID0gLTE7CisjaWZuZGVmIE5PQ1NFVFMKKyAgICBpZiAoZnRwX3hsYSkgeworICAgICAgICBsY3MgPSBmdHBfY3NsOworICAgICAgICBpZiAobGNzIDwgMCkgbGNzID0gZmNoYXJzZXQ7CisgICAgICAgIHJjcyA9IGZ0cF9jc3g7CisgICAgICAgIGlmIChyY3MgPCAwKSByY3MgPSBmdHBfY3NyOworICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgZGVidWcoRjExMCwiZnRwIGRvZnRwbWtkIixzLDApOworICAgIGlmIChmdHBjbWQoIk1LRCIscyxsY3MscmNzLHZibSkgPT0gUkVQTFlfQ09NUExFVEUpCisgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgIGlmIChmdHBjb2RlID09IDUwMCB8fCBmdHBjb2RlID09IDUwMikgeworICAgICAgICBpZiAoIXF1aWV0KQorICAgICAgICAgIHByaW50ZigiTUtEIGNvbW1hbmQgbm90IHJlY29nbml6ZWQsIHRyeWluZyBYTUtEXG4iKTsKKyAgICAgICAgaWYgKGZ0cGNtZCgiWE1LRCIscyxsY3MscmNzLHZibSkgPT0gUkVQTFlfQ09NUExFVEUpCisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKK30KKworc3RhdGljIGludAorZG9mdHBta2QoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1LRElSIHBhcnNlICovCisgICAgaW50IHg7CisgICAgY2hhciAqIHM7CisgICAgaWYgKCh4ID0gY210eHQoIlJlbW90ZSBkaXJlY3RvcnkgbmFtZSIsICIiLCAmcywgeHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgQ0hFQ0tDT05OKCk7CisgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgIGlmICh0ZXN0aW5nKQorICAgICAgcHJpbnRmKCIgZnRwIG1rZGlyIFwiJXNcIi4uLlxuIixsaW5lKTsKKyAgICByZXR1cm4oc3VjY2VzcyA9IGRvZnRweG1rZChsaW5lLC0xKSk7Cit9CisKK3N0YXRpYyBpbnQKK2RvZnRwcm1kKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSTURJUiAqLworICAgIGludCB4LCBsY3MgPSAtMSwgcmNzID0gLTE7CisgICAgY2hhciAqIHM7CisgICAgaWYgKCh4ID0gY210eHQoIlJlbW90ZSBkaXJlY3RvcnkiLCAiIiwgJnMsIHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworICAgIENIRUNLQ09OTigpOworICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKyAgICBpZiAodGVzdGluZykKKyAgICAgIHByaW50ZigiIGZ0cCBybWRpciBcIiVzXCIuLi5cbiIsbGluZSk7CisjaWZuZGVmIE5PQ1NFVFMKKyAgICBpZiAoZnRwX3hsYSkgeworICAgICAgICBsY3MgPSBmdHBfY3NsOworICAgICAgICBpZiAobGNzIDwgMCkgbGNzID0gZmNoYXJzZXQ7CisgICAgICAgIHJjcyA9IGZ0cF9jc3g7CisgICAgICAgIGlmIChyY3MgPCAwKSByY3MgPSBmdHBfY3NyOworICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgaWYgKGZ0cGNtZCgiUk1EIixsaW5lLGxjcyxyY3MsZnRwX3ZibSkgPT0gUkVQTFlfQ09NUExFVEUpCisgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgIGlmIChmdHBjb2RlID09IDUwMCB8fCBmdHBjb2RlID09IDUwMikgeworICAgICAgICBpZiAoIXF1aWV0KQorICAgICAgICAgIHByaW50ZigiUk1EIGNvbW1hbmQgbm90IHJlY29nbml6ZWQsIHRyeWluZyBYTUtEXG4iKTsKKyAgICAgICAgc3VjY2VzcyA9IChmdHBjbWQoIlhSTUQiLGxpbmUsbGNzLHJjcyxmdHBfdmJtKSA9PSBSRVBMWV9DT01QTEVURSk7CisgICAgfSBlbHNlCisgICAgICBzdWNjZXNzID0gMDsKKyAgICByZXR1cm4oc3VjY2Vzcyk7Cit9CisKK3N0YXRpYyBpbnQKK2RvZnRwcmVuKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRU5BTUUgKi8KKyAgICBpbnQgeDsKKyAgICBjaGFyICogczsKKyAgICBpZiAoKHggPSBjbWZsZCgiUmVtb3RlIGZpbGVuYW1lIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih4KTsKKyAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgaWYgKCh4ID0gY21mbGQoIk5ldyBuYW1lIGZvciByZW1vdGUgZmlsZSIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgY2tzdHJuY3B5KHRtcGJ1ZixzLFRNUEJVRlNJWik7CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworICAgIENIRUNLQ09OTigpOworICAgIGlmICh0ZXN0aW5nKQorICAgICAgcHJpbnRmKCIgZnRwIHJlbmFtZSBcIiVzXCIgKHRvKSBcIiVzXCIuLi5cbiIsbGluZSx0bXBidWYpOworICAgIHN1Y2Nlc3MgPSBmdHBfcmVuYW1lKGxpbmUsdG1wYnVmKTsKKyAgICByZXR1cm4oc3VjY2Vzcyk7Cit9CisKK2ludAorZG9mdHByZXMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFU0VUIChsb2cgb3V0IHdpdGhvdXQgY2xvc2UpICovCisgICAgaW50IHg7CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworICAgIENIRUNLQ09OTigpOworICAgIGlmICh0ZXN0aW5nKQorICAgICAgcHJpbnRmKCIgZnRwIHJlc2V0Li4uXG4iKTsKKyAgICByZXR1cm4oc3VjY2VzcyA9IGZ0cF9yZXNldCgpKTsKK30KKworc3RhdGljIGludAorZG9mdHB4aGxwKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhFTFAgKi8KKyAgICBpbnQgeDsKKyAgICBjaGFyICogczsKKyAgICBpZiAoKHggPSBjbXR4dCgiQ29tbWFuZCBuYW1lIiwgIiIsICZzLCB4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih4KTsKKyAgICBDSEVDS0NPTk4oKTsKKyAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgaWYgKHRlc3RpbmcpCisgICAgICBwcmludGYoIiBmdHAgaGVscCBcIiVzXCIuLi5cbiIsbGluZSk7CisgICAgLyogTm8gbmVlZCB0byB0cmFuc2xhdGUgLS0gYWxsIEZUUCBjb21tYW5kcyBhcmUgQVNDSUkgKi8KKyAgICByZXR1cm4oc3VjY2VzcyA9IChmdHBjbWQoIkhFTFAiLGxpbmUsMCwwLDEpID09IFJFUExZX0NPTVBMRVRFKSk7Cit9CisKK3N0YXRpYyBpbnQKK2RvZnRwZGlyKGN4KSBpbnQgY3g7IHsgICAgICAgICAgICAgICAgICAvKiBbVl1ESVJFQ1RPUlkgKi8KKyAgICBpbnQgeCwgbGNzID0gMCwgcmNzID0gMCwgeGxhdGUgPSAwOworICAgIGNoYXIgKiBwLCAqIHMsICogbSA9ICIiOworICAgIGlmIChjeCA9PSBGVFBfVkRJKSB7CisgICAgICAgIHN3aXRjaCAoc2VydmVydHlwZSkgeworICAgICAgICAgIGNhc2UgU1lTX1ZNUzoKKyAgICAgICAgICBjYXNlIFNZU19ET1M6CisgICAgICAgICAgY2FzZSBTWVNfVE9QUzEwOgorICAgICAgICAgIGNhc2UgU1lTX1RPUFMyMDoKKyAgICAgICAgICAgIG0gPSAiKi4qIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtID0gIioiOworICAgICAgICB9CisgICAgfQorICAgIGlmICgoeCA9IGNtdHh0KCJSZW1vdGUgZmlsZXNwZWMiLG0sJnMseHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgaWYgKCh4ID0gcmVtdHh0KCZzKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworI2lmZGVmIE5PQ1NFVFMKKyAgICB4bGF0ZSA9IDA7CisjZWxzZQorICAgIHhsYXRlID0gZnRwX3hsYTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgbGluZVswXSA9IE5VTDsKKyAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgcyA9IGxpbmU7CisgICAgQ0hFQ0tDT05OKCk7CisKKyNpZm5kZWYgTk9DU0VUUworICAgIGlmICh4bGF0ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBGVFAgQ0hBUkFDVEVSLVNFVC1UUkFOU0xBVElPTiAqLworICAgICAgICBsY3MgPSBmdHBfY3NsOyAgICAgICAgICAgICAgICAgIC8qIExvY2FsIGNoYXJzZXQgKi8KKyAgICAgICAgaWYgKGxjcyA8IDApIGxjcyA9IGZjaGFyc2V0OworICAgICAgICBpZiAobGNzIDwgMCkgeGxhdGUgPSAwOworICAgIH0KKyAgICBpZiAoeGxhdGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGlsbCBPTj8gKi8KKyAgICAgICAgcmNzID0gZnRwX2NzeDsgICAgICAgICAgICAgICAgICAvKiBSZW1vdGUgKFNlcnZlcikgY2hhcnNldCAqLworICAgICAgICBpZiAocmNzIDwgMCkgcmNzID0gZnRwX2NzcjsKKyAgICAgICAgaWYgKHJjcyA8IDApIHhsYXRlID0gMDsKKyAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisgICAgaWYgKHRlc3RpbmcpIHsKKyAgICAgICAgcCA9IHM7CisgICAgICAgIGlmICghcCkgcCA9ICIiOworICAgICAgICBpZiAoKnApCisgICAgICAgICAgcHJpbnRmKCJEaXJlY3Rvcnkgb2YgZmlsZXMgJXMgYXQgJXM6XG4iLCBsaW5lLCBmdHBfaG9zdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoIkRpcmVjdG9yeSBvZiBmaWxlcyBhdCAlczpcbiIsIGZ0cF9ob3N0KTsKKyAgICB9CisgICAgZGVidWcoRjExMSwiZG9mdHBkaXIiLHMsY3gpOworCisgICAgaWYgKGN4ID09IEZUUF9ESVIpIHsKKyAgICAgICAgLyogVHJhbnNsYXRpb24gb2YgbGluZVtdIGlzIGRvbmUgaW5zaWRlIHJlY3ZyZXF1ZXN0KCkgKi8KKyAgICAgICAgLyogd2hlbiBpdCBjYWxscyBmdHBjbWQoKS4gKi8KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPQorICAgICAgICAgIChyZWN2cmVxdWVzdCgiTElTVCIsIi0iLHMsIndiIiwwLDAsTlVMTCx4bGF0ZSxsY3MscmNzKSA9PSAwKSk7CisgICAgfQorICAgIHN1Y2Nlc3MgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZESVIgLSBvbmUgZmlsZSBhdCBhIHRpbWUuLi4gKi8KKyAgICBwID0gKGNoYXIgKilyZW1vdGVfZmlsZXMoMSwoQ0hBUiAqKXMsTlVMTCwwKTsgLyogR2V0IHRoZSBmaWxlIGxpc3QgKi8KKyAgICBjYW5jZWxncm91cCA9IDA7CisgICAgaWYgKCFmdHBfdmJtICYmICFxdWlldCkKKyAgICAgIHByaW50bGluZXMgPSAxOworICAgIHdoaWxlIChwICYmICFjYW5jZWxmaWxlICYmICFjYW5jZWxncm91cCkgeyAvKiBTVEFUIG9uZSBmaWxlICovCisgICAgICAgIGlmIChmdHBjbWQoIlNUQVQiLHAsbGNzLHJjcyxmdHBfdmJtKSA8IDApIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcCA9IChjaGFyICopcmVtb3RlX2ZpbGVzKDAsTlVMTCxOVUxMLDApOyAvKiBHZXQgbmV4dCBmaWxlICovCisgICAgICAgIGRlYnVnKEYxMTAsImZ0cCB2ZGlyIGZpbGUiLHMsMCk7CisgICAgfQorICAgIHJldHVybihzdWNjZXNzKTsKK30KKworc3RhdGljIGludAorZG9mdHBwd2QoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBXRCAqLworICAgIGludCB4LCBsY3MgPSAtMSwgcmNzID0gLTE7CisjaWZuZGVmIE5PQ1NFVFMKKyAgICBpZiAoZnRwX3hsYSkgeworICAgICAgICBsY3MgPSBmdHBfY3NsOworICAgICAgICBpZiAobGNzIDwgMCkgbGNzID0gZmNoYXJzZXQ7CisgICAgICAgIHJjcyA9IGZ0cF9jc3g7CisgICAgICAgIGlmIChyY3MgPCAwKSByY3MgPSBmdHBfY3NyOworICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworICAgIENIRUNLQ09OTigpOworICAgIGlmIChmdHBjbWQoIlBXRCIsTlVMTCxsY3MscmNzLDEpID09IFJFUExZX0NPTVBMRVRFKSB7CisgICAgICAgIHN1Y2Nlc3MgPSAxOworICAgIH0gZWxzZSBpZiAoZnRwY29kZSA9PSA1MDAgfHwgZnRwY29kZSA9PSA1MDIpIHsKKyAgICAgICAgaWYgKGZ0cF9kZWIpCisgICAgICAgICAgcHJpbnRmKCJQV0QgY29tbWFuZCBub3QgcmVjb2duaXplZCwgdHJ5aW5nIFhQV0RcbiIpOworICAgICAgICBzdWNjZXNzID0gKGZ0cGNtZCgiWFBXRCIsTlVMTCxsY3MscmNzLDEpID09IFJFUExZX0NPTVBMRVRFKTsKKyAgICB9CisgICAgcmV0dXJuKHN1Y2Nlc3MpOworfQorCitzdGF0aWMgaW50Citkb2Z0cGN3ZChzLHZibSkgY2hhciAqIHM7IGludCB2Ym07IHsgICAgLyogQ0QgKENXRCkgKi8KKyAgICBpbnQgbGNzID0gLTEsIHJjcyA9IC0xOworI2lmbmRlZiBOT0NTRVRTCisgICAgaWYgKGZ0cF94bGEpIHsKKyAgICAgICAgbGNzID0gZnRwX2NzbDsKKyAgICAgICAgaWYgKGxjcyA8IDApIGxjcyA9IGZjaGFyc2V0OworICAgICAgICByY3MgPSBmdHBfY3N4OworICAgICAgICBpZiAocmNzIDwgMCkgcmNzID0gZnRwX2NzcjsKKyAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisgICAgZGVidWcoRjExMCwiZnRwIGRvZnRwY3dkIixzLDApOworICAgIGlmIChmdHBjbWQoIkNXRCIscyxsY3MscmNzLHZibSkgPT0gUkVQTFlfQ09NUExFVEUpCisgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgIGlmIChmdHBjb2RlID09IDUwMCB8fCBmdHBjb2RlID09IDUwMikgeworICAgICAgICBpZiAoIXF1aWV0KQorICAgICAgICAgIHByaW50ZigiQ1dEIGNvbW1hbmQgbm90IHJlY29nbml6ZWQsIHRyeWluZyBYQ1dEXG4iKTsKKyAgICAgICAgaWYgKGZ0cGNtZCgiWENXRCIscyxsY3MscmNzLHZibSkgPT0gUkVQTFlfQ09NUExFVEUpCisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKK30KKworc3RhdGljIGludAorZG9mdHBjZHVwKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENEVVAgKi8KKyAgICBkZWJ1ZyhGMTAwLCJmdHAgZG9mdHBjZHVwIiwiIiwwKTsKKyAgICBpZiAoZnRwY21kKCJDRFVQIixOVUxMLDAsMCwxKSA9PSBSRVBMWV9DT01QTEVURSkKKyAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgaWYgKGZ0cGNvZGUgPT0gNTAwIHx8IGZ0cGNvZGUgPT0gNTAyKSB7CisgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgcHJpbnRmKCJDRFVQIGNvbW1hbmQgbm90IHJlY29nbml6ZWQsIHRyeWluZyBYQ1VQXG4iKTsKKyAgICAgICAgaWYgKGZ0cGNtZCgiWENVUCIsTlVMTCwwLDAsMSkgPT0gUkVQTFlfQ09NUExFVEUpCisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKK30KKworLyogcyB5IG4gYyBkIGkgciAgLS0gIFN5bmNocm9uaXplcyBjbGllbnQgJiBzZXJ2ZXIgZGlyZWN0b3JpZXMgKi8KKworLyogVXNlZCB3aXRoIHJlY3Vyc2l2ZSBQVVRzOyBSZXR1cm5zIDAgb24gZmFpbHVyZSwgMSBvbiBzdWNjZXNzICovCisKK3N0YXRpYyBpbnQgY2RsZXZlbCA9IDAsIGNkc2ltbHZsID0gMDsKKworc3RhdGljIGludAorc3luY2Rpcihsb2NhbCxzaW0pIGNoYXIgKiBsb2NhbDsgaW50IHNpbTsgeworICAgIGNoYXIgYnVmW0NLTUFYUEFUSCsxXTsKKyAgICBjaGFyIHRtcFtDS01BWFBBVEgrMV07CisgICAgY2hhciBtc2didWZbQ0tNQVhQQVRIKzY0XTsKKyAgICBjaGFyIGMsICogcCA9IGxvY2FsLCAqIHMgPSBidWYsICogcSA9IGJ1ZjsKKyAgICBpbnQgaSwgayA9IDAsIGRvbmUgPSAwLCBpdHNhZGlyID0gMCwgc2F2ZXE7CisKKyAgICBkZWJ1ZyhGMTEwLCJmdHAgc3luY2RpciBsb2NhbCAobmV3KSIsbG9jYWwsMCk7CisgICAgZGVidWcoRjExMCwiZnRwIHN5bmNkaXIgcHV0cGF0aCAob2xkKSIscHV0cGF0aCwwKTsKKworICAgIGl0c2FkaXIgPSBpc2Rpcihsb2NhbCk7CisgICAgc2F2ZXEgPSBxdWlldDsKKworICAgIHdoaWxlICgoKnMgPSAqcCkpIHsgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGFyZ3VtZW50IGZpbGVuYW1lICovCisgICAgICAgIGlmICgrK2sgPT0gQ0tNQVhQQVRIKSAgICAgICAgICAgLyogc28gd2UgY2FuIHBva2UgaXQuICovCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgaWYgKCpzID09ICcvJykgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHJpZ2h0bW9zdCBkaXJzZXAgKi8KKyAgICAgICAgICBxID0gczsKKyAgICAgICAgcysrOworICAgICAgICBwKys7CisgICAgfQorICAgIGlmICghaXRzYWRpcikKKyAgICAgICpxID0gTlVMOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBLZWVwIGp1c3QgdGhlIHBhdGggcGFydCAqLworCisgICAgZGVidWcoRjExMCwiZnRwIHN5bmNkaXIgYnVmIixidWYsMCk7CisgICAgaWYgKCFzdHJjbXAoYnVmLHB1dHBhdGgpKSB7ICAgICAgICAgLyogU2FtZSBhcyBmb3IgcHJldmlvdXMgZmlsZT8gKi8KKyAgICAgICAgaWYgKGl0c2FkaXIpIHsgICAgICAgICAgICAgICAgICAvKiBJdCdzIGEgZGlyZWN0b3J5PyAqLworICAgICAgICAgICAgaWYgKGRvZnRwY3dkKGxvY2FsLDApKSB7ICAgIC8qIFRyeSB0byBDRCB0byBpdCAqLworICAgICAgICAgICAgICAgIGRvZnRwY2R1cCgpOyAgICAgICAgICAgIC8qIFdvcmtlZCAtIENEIGJhY2sgdXAgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2ltKSB7ICAgICAgICAgICAvKiBTaW11bGF0aW5nLi4uICovCisgICAgICAgICAgICAgICAgaWYgKGZkaXNwbGEgPT0gWFlGRF9CKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiV09VTEQgQ1JFQVRFIERJUkVDVE9SWSAlc1xuIixsb2NhbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmZGlzcGxhKSB7CisgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKG1zZ2J1ZixDS01BWFBBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXT1VMRCBDUkVBVEUgRElSRUNUT1JZIixsb2NhbCxOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgICAgICBmdHNjcmVlbihTQ1JfU1QsU1RfTVNHLDBsLG1zZ2J1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIFNlZSBub3RlIGFib3ZlICovCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgfSBlbHNlIGlmICghZG9mdHB4bWtkKGxvY2FsLDApKSB7IC8qIENhbid0IENEIC0gdHJ5IHRvIGNyZWF0ZSAqLworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGZkaXNwbGEgPT0gWFlGRF9CKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ1JFQVRFRCBESVJFQ1RPUlkgJXNcbiIsbG9jYWwpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmRpc3BsYSkgeworICAgICAgICAgICAgICAgICAgICBja21ha21zZyhtc2didWYsQ0tNQVhQQVRIKzY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFRCBESVJFQ1RPUlkgIixsb2NhbCxOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgICAgICBmdHNjcmVlbihTQ1JfU1QsU1RfTVNHLDBsLG1zZ2J1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBzeW5jZGlyIG5vIGNoYW5nZSIsYnVmLDApOworICAgICAgICByZXR1cm4oMSk7ICAgICAgICAgICAgICAgICAgICAgIC8qIFllcywgZG9uZS4gKi8KKyAgICB9CisgICAgY2tzdHJuY3B5KHRtcCxidWYsQ0tNQVhQQVRIKzEpOyAgICAgLyogTWFrZSBhIHNhZmUgKHByZS1wb2tlZCkgY29weSAqLworICAgIGRlYnVnKEYxMTAsImZ0cCBzeW5jZGlyIG5ldyBwYXRoIixidWYsMCk7IC8qIGZvciBsYXRlciAoc2VlIGVuZCkgKi8KKworICAgIHAgPSBidWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyAqLworICAgIHMgPSBwdXRwYXRoOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9sZCAqLworCisgICAgZGVidWcoRjExMCwiZnRwIHN5bmNkaXIgQSBwIixwLDApOworICAgIGRlYnVnKEYxMTAsImZ0cCBzeW5jZGlyIEEgcyIscywwKTsKKworICAgIHdoaWxlICgqcCAhPSBOVUwgJiYgKnMgIT0gTlVMICYmICpwID09ICpzKSBwKysscysrOworCisgICAgaWYgKCpzID09ICcvJyAmJiAhKnApIHMrKzsgICAgICAgICAgLyogRG9uJ3QgY291bnQgaW5pdGlhbCBzbGFzaCAqLworCisgICAgZGVidWcoRjExMCwiZnRwIHN5bmNkaXIgQiBwIixwLDApOworICAgIGRlYnVnKEYxMTAsImZ0cCBzeW5jZGlyIEIgcyIscywwKTsKKworICAgIC8qIHAgYW5kIHMgbm93IHBvaW50IHRvIHRoZSBsZWZ0bW9zdCBzcG90IHdoZXJlIHRoZXkgZGlmZmVyICovCisKKyAgICBpZiAoKnMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIHRvIGJhY2sgdXAgKi8KKyAgICAgICAgayA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIb3cgbWFueSBsZXZlbHMgKi8KKyAgICAgICAgd2hpbGUgKChjID0gKnMrKykpIHsgICAgICAgICAgICAvKiBDb3VudCBkaXJzZXBzICovCisgICAgICAgICAgICBpZiAoYyA9PSAnLycgJiYgKnMpCisgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKSB7ICAgICAgIC8qIERvIHRoYXQgbWFueSBDRFVQcyAqLworICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIHN5bmNkaXIgdXAiLHAsaSsxKTsKKyAgICAgICAgICAgIGlmIChzaW0gJiYgY2RzaW1sdmwpIHsKKyAgICAgICAgICAgICAgICBjZHNpbWx2bC0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRvZnRwY2R1cCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHF1aWV0ID0gc2F2ZXE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjZGxldmVsLS07CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEqcCkgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIHRvIGdvIGRvd24gKi8KKyAgICAgICAgICBnb3RvIHhjd2Q7ICAgICAgICAgICAgICAgICAgICAvKiB3ZSdyZSBkb25lLiAqLworICAgIH0KKyAgICB3aGlsZSAocCA+IGJ1ZiAmJiAqcCAmJiAqcCAhPSAnLycpICAvKiBJZiBpbiBtaWRkbGUgb2Ygc2VnbWVudCAqLworICAgICAgcC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdXAgdG8gYmVnaW5uaW5nICovCisgICAgaWYgKCpwID09ICcvJykgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHRlcm1pbmF0ZSB0aGVyZSAqLworICAgICAgcCsrOworCisgICAgcyA9IHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gc3RhcnQgb2YgbmV3IGRvd24gcGF0aC4gKi8KKyAgICB3aGlsZSAoMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb29wIHRocm91Z2ggY2hhcmFjdGVycy4gKi8KKyAgICAgICAgaWYgKCpzID09ICcvJyB8fCAhKnMpIHsgICAgICAgICAvKiBIYXZlIGEgc2VnbWVudC4gKi8KKyAgICAgICAgICAgIGlmICghKnMpICAgICAgICAgICAgICAgICAgICAvKiBJZiBlbmQgb2Ygc3RyaW5nLCAqLworICAgICAgICAgICAgICBkb25lKys7ICAgICAgICAgICAgICAgICAgIC8qIGFmdGVyIHRoaXMgc2VnbWVudCB3ZSdyZSBkb25lLiAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAqcyA9IE5VTDsgICAgICAgICAgICAgICAgIC8qIE5VTCBvdXQgdGhlIHNlcGFyYXRvci4gKi8KKyAgICAgICAgICAgIGlmICgqcCkgeyAgICAgICAgICAgICAgICAgICAvKiBJZiBzZWdtZW50IGlzIG5vdCBlbXB0eSAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBzeW5jZGlyIGRvd24gc2VnbWVudCIscCwwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRvZnRwY3dkKHAsMCkpIHsgICAvKiBUcnkgdG8gQ0QgdG8gaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZkaXNwbGEgPT0gWFlGRF9CKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJXT1VMRCBDUkVBVEUgRElSRUNUT1JZICVzXG4iLGxvY2FsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmRpc3BsYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKG1zZ2J1ZixDS01BWFBBVEgsIldPVUxEIENSRUFURSBESVJFQ1RPUlkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRzY3JlZW4oU0NSX1NULFNUX01TRywwbCxtc2didWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2RzaW1sdmwrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9mdHB4bWtkKHAsMCkpIHsgLyogQ2FuJ3QgQ0QgLSB0cnkgdG8gY3JlYXRlICovCisvKgorICBTdXBwb3NlIHdlIGFyZSBleGVjdXRpbmcgU0VORCAvUkVDVVJTSVZFLiAgTG9jYWxseSB3ZSBoYXZlIGEgZGlyZWN0b3J5CisgIEZPTyBidXQgdGhlIHJlbW90ZSBoYXMgYSByZWd1bGFyIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lLiAgV2UgY2FuJ3QgQ0QKKyAgdG8gaXQsIGNhbid0IE1LRElSIGl0IGVpdGhlci4gIFRoZXJlJ3Mgbm8gd2F5IG91dCBidXQgdG8gZmFpbCBhbmQgbGV0CisgIHRoZSB1c2VyIGhhbmRsZSB0aGUgcHJvYmxlbS4KKyovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQgPSBzYXZlcTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX0IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkNSRUFURUQgRElSRUNUT1JZICVzXG4iLHApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmZGlzcGxhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ttYWttc2cobXNnYnVmLENLTUFYUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFRCBESVJFQ1RPUlkgIixwLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRzY3JlZW4oU0NSX1NULFNUX01TRywwbCxtc2didWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb2Z0cGN3ZChwLDApKSB7IC8qIFRyeSBhZ2FpbiB0byBDRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0ID0gc2F2ZXE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNkbGV2ZWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkb25lKSAgICAgICAgICAgICAgICAgICAvKiBRdWl0IGlmIG5vIG5leHQgc2VnbWVudCAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHAgPSBzKzE7ICAgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBuZXh0IHNlZ21lbnQgKi8KKyAgICAgICAgfQorICAgICAgICBzKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIG5leHQgc291cmNlIGNoYXIgKi8KKyAgICB9CisKKyAgeGN3ZDoKKyAgICBja3N0cm5jcHkocHV0cGF0aCx0bXAsQ0tNQVhQQVRIKzEpOyAvKiBBbGwgT0sgLSBtYWtlIHRoaXMgdGhlIG5ldyBwYXRoICovCisgICAgcXVpZXQgPSBzYXZlcTsKKyAgICByZXR1cm4oMSk7Cit9CisKKyNpZmRlZiBET1VQREFURQorI2lmZGVmIERFQlVHCitzdGF0aWMgVk9JRAorZGJ0aW1lKHMseHgpIGNoYXIgKiBzOyBzdHJ1Y3QgdG0gKiB4eDsgeyAvKiBXcml0ZSBzdHJ1Y3QgdG0gdG8gZGVidWcgbG9nICovCisgICAgaWYgKGRlYmxvZykgeworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgeWVhciAiLHMseHgtPnRtX3llYXIpOworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgbW9udGgiLHMseHgtPnRtX21vbik7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBkYXkgICIscyx4eC0+dG1fbWRheSk7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBob3VyICIscyx4eC0+dG1faG91cik7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBtaW4gICIscyx4eC0+dG1fbWluKTsKKyAgICAgICAgZGVidWcoRjExMSwiZnRwIHNlYyAgIixzLHh4LT50bV9zZWMpOworICAgIH0KK30KKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiAgdCBtIGMgbyBtIHAgYSByIGUgIC0tICBDb21wYXJlIHR3byBzdHJ1Y3QgdG0ncyAqLworCisvKiAgTGlrZSBzdHJjbXAoKSBidXQgZm9yIHN0cnVjdCB0bSdzICAqLworLyogIFJldHVybnMgLTEgaWYgeHggPCB5eSwgMCBpZiB0aGV5IGFyZSBlcXVhbCwgMSBpZiB4eCA+IHl5ICovCisKK3N0YXRpYyBpbnQKK3RtY29tcGFyZSh4eCx5eSkgc3RydWN0IHRtICogeHgsICogeXk7IHsKKworICAgIGlmICh4eC0+dG1feWVhciA8IHl5LT50bV95ZWFyKSAgICAgIC8qIEZpcnN0IHllYXIgbGVzcyB0aGFuIHNlY29uZCAqLworICAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAoeHgtPnRtX3llYXIgPiB5eS0+dG1feWVhcikgICAgICAvKiBGaXJzdCB5ZWFyIGdyZWF0ZXIgdGhhbiBzZWNvbmQgKi8KKyAgICAgIHJldHVybigxKTsKKworICAgIC8qIFllYXJzIGFyZSBlcXVhbCBzbyBjb21wYXJlIG1vbnRocyAqLworCisgICAgaWYgKHh4LT50bV9tb24gIDwgeXktPnRtX21vbikgICAgICAgLyogQW5kIHNvIG9uLi4uICovCisgICAgICByZXR1cm4oLTEpOworICAgIGlmICh4eC0+dG1fbW9uICA+IHl5LT50bV9tb24pCisgICAgICByZXR1cm4oMSk7CisKKyAgICBpZiAoeHgtPnRtX21kYXkgPCB5eS0+dG1fbWRheSkKKyAgICAgIHJldHVybigtMSk7CisgICAgaWYgKHh4LT50bV9tZGF5ID4geXktPnRtX21kYXkpCisgICAgICByZXR1cm4oMSk7CisKKyAgICBpZiAoeHgtPnRtX2hvdXIgPCB5eS0+dG1faG91cikKKyAgICAgIHJldHVybigtMSk7CisgICAgaWYgKHh4LT50bV9ob3VyID4geXktPnRtX2hvdXIpCisgICAgICByZXR1cm4oMSk7CisKKyAgICBpZiAoeHgtPnRtX21pbiAgPCB5eS0+dG1fbWluKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAoeHgtPnRtX21pbiAgPiB5eS0+dG1fbWluKQorICAgICAgcmV0dXJuKDEpOworCisgICAgaWYgKHh4LT50bV9zZWMgIDwgeXktPnRtX3NlYykKKyAgICAgIHJldHVybigtMSk7CisgICAgaWYgKHh4LT50bV9zZWMgID4geXktPnRtX3NlYykKKyAgICAgIHJldHVybigxKTsKKworICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBET1VQREFURSAqLworCisjaWZuZGVmIEhBVkVfVElNRUdNICAgICAgICAgICAgIC8qIEZvciBwbGF0Zm9ybXMgdGhhdCBkbyBub3QgaGF2ZSB0aW1lZ20oKSAqLworc3RhdGljIENPTlNUIGludCBNT05USERBWVNbXSA9IHsgLyogTnVtYmVyIG9mIGRheXMgaW4gZWFjaCBtb250aC4gKi8KKyAgICAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCit9OworCisvKiBNYWNybyBmb3Igd2hldGhlciBhIGdpdmVuIHllYXIgaXMgYSBsZWFwIHllYXIuICovCisjZGVmaW5lIElTTEVBUCh5ZWFyKSBcCisoKCh5ZWFyKSAlIDQpID09IDAgJiYgKCgoeWVhcikgJSAxMDApICE9IDAgfHwgKCh5ZWFyKSAlIDQwMCkgPT0gMCkpCisjZW5kaWYgLyogSEFWRV9USU1FR00gKi8KKworLyogIG0gayB1IHQgaSBtIGUgIC0tICBMaWtlIG1rdGltZSgpIGJ1dCBhcmd1bWVudCBpcyBhbHJlYWR5IFVUQyAqLworCitzdGF0aWMgdGltZV90CisjaWZkZWYgQ0tfQU5TSUMKK21rdXRpbWUoc3RydWN0IHRtICogdG0pCisjZWxzZQorbWt1dGltZSh0bSkgc3RydWN0IHRtICogdG07CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIG1rdXRpbWUgKi8geworI2lmZGVmIEhBVkVfVElNRUdNCisgICAgcmV0dXJuKHRpbWVnbSh0bSkpOyAgICAgICAgICAgICAgICAgLyogSGF2ZSBzeXN0ZW0gc2VydmljZSwgdXNlIGl0LiAqLworI2Vsc2UKKy8qCisgIENvbnRyaWJ1dGVkIGJ5IFJ1c3MgQWxsYmVyeSAocnJhQHN0YW5mb3JkLmVkdSksIHVzZWQgYnkgcGVybWlzc2lvbi4KKyAgR2l2ZW4gYSBzdHJ1Y3QgdG0gcmVwcmVzZW50aW5nIGEgY2FsZW5kYXIgdGltZSBpbiBVVEMsIGNvbnZlcnQgaXQgdG8KKyAgc2Vjb25kcyBzaW5jZSBlcG9jaC4gIFJldHVybnMgKHRpbWVfdCkgLTEgaWYgdGhlIHRpbWUgaXMgbm90CisgIGNvbnZlcnRhYmxlLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2Fub25pY2FsaXplIHRoZSBwcm92aWRlZAorICBzdHJ1Y3QgdG0sIG5vciBkb2VzIGl0IGFsbG93IG91dC1vZi1yYW5nZSB2YWx1ZXMgb3IgeWVhcnMgYmVmb3JlIDE5NzAuCisgIFJlc3VsdCBzaG91bGQgYmUgaWRlbnRpY2FsIHdpdGggdGltZWdtKCkuCisqLworICAgIHRpbWVfdCByZXN1bHQgPSAwOworICAgIGludCBpOworICAgIC8qCisgICAgICBXZSBkbyBhbGxvdyBzb21lIGlsbC1mb3JtZWQgZGF0ZXMsIGJ1dCB3ZSBkb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsCisgICAgICB3aXRoIHRoZW0gYW5kIG91ciBjYWxsZXJzIHJlYWxseSBzaG91bGRuJ3QgcGFzcyB0aGVtIHRvIHVzLiAgRG8KKyAgICAgIGV4cGxpY2l0bHkgZGlzYWxsb3cgdGhlIG9uZXMgdGhhdCB3b3VsZCBjYXVzZSBpbnZhbGlkIGFycmF5IGFjY2Vzc2VzCisgICAgICBvciBvdGhlciBhbGdvcml0aG0gcHJvYmxlbXMuCisgICAgKi8KKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKyAgICAgICAgZGVidWcoRjEwMSwibWt1dGltZSB0bV9tb24iLCIiLHRtLT50bV9tb24pOworICAgICAgICBkZWJ1ZyhGMTAxLCJta3V0aW1lIHRtX3llYXIiLCIiLHRtLT50bV95ZWFyKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICBpZiAodG0tPnRtX21vbiA8IDAgfHwgdG0tPnRtX21vbiA+IDExIHx8IHRtLT50bV95ZWFyIDwgNzApCisgICAgICByZXR1cm4oKHRpbWVfdCkgLTEpOworCisgICAgLyogQ29udmVydCB0byB0aW1lX3QuICovCisgICAgZm9yIChpID0gMTk3MDsgaSA8IHRtLT50bV95ZWFyICsgMTkwMDsgaSsrKQorICAgICAgcmVzdWx0ICs9IDM2NSArIElTTEVBUChpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdG0tPnRtX21vbjsgaSsrKQorICAgICAgcmVzdWx0ICs9IE1PTlRIREFZU1tpXTsKKyAgICBpZiAodG0tPnRtX21vbiA+IDEgJiYgSVNMRUFQKHRtLT50bV95ZWFyICsgMTkwMCkpCisgICAgICByZXN1bHQrKzsKKyAgICByZXN1bHQgPSAyNCAqIChyZXN1bHQgKyB0bS0+dG1fbWRheSAtIDEpICsgdG0tPnRtX2hvdXI7CisgICAgcmVzdWx0ID0gNjAgKiByZXN1bHQgKyB0bS0+dG1fbWluOworICAgIHJlc3VsdCA9IDYwICogcmVzdWx0ICsgdG0tPnRtX3NlYzsKKyAgICBkZWJ1ZyhGMTAxLCJta3V0aW1lIHJlc3VsdCIsIiIscmVzdWx0KTsKKyAgICByZXR1cm4ocmVzdWx0KTsKKyNlbmRpZiAvKiBIQVZFX1RJTUVHTSAqLworfQorCisKKy8qCisgIHMgZSB0IG0gbyBkIHQgaSBtIGUgIC0tICBTZXQgZmlsZSBtb2RpZmljYXRpb24gdGltZS4KKworICBmID0gY2hhciAqIGZpbGVuYW1lOworICB0ID0gdGltZV90IGRhdGUvdGltZSB0byBzZXQgKFNlY3Mgc2luY2UgMTk3MDAxMDEgMDowMDowMCBVVEMsIE5PVCBsb2NhbCkKKworICBVTklYLXNwZWNpZmljOyBpc29sYXRlcyBtYWlubGluZSBjb2RlIGZyb20gaGlkZW91cyAjaWZkZWZzLgorICBSZXR1cm5zOgorICAgIDAgb24gc3VjY2VzcywKKyAgIC0xIG9uIGVycm9yLgorCisqLworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCitzZXRtb2R0aW1lKGNoYXIgKiBmLCB0aW1lX3QgdCkKKyNlbHNlCitzZXRtb2R0aW1lKGYsdCkgY2hhciAqIGY7IHRpbWVfdCB0OworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBzZXRtb2R0aW1lICovIHsKKyNpZmRlZiBOVAorICAgIHN0cnVjdCBfc3RhdCBzYjsKKyNlbHNlIC8qIE5UICovCisgICAgc3RydWN0IHN0YXQgc2I7CisjZW5kaWYgLyogTlQgKi8KKyAgICBpbnQgeCwgcmMgPSAwOworI2lmZGVmIEJTRDQ0CisgICAgc3RydWN0IHRpbWV2YWwgdHBbMl07CisjZWxzZQorI2lmZGVmIFY3CisgICAgc3RydWN0IHV0aW1idWYgeworICAgICAgICB0aW1lX3QgdGltZXBbMl07CisgICAgfSB0cDsKKyNlbHNlCisjaWZkZWYgU1lTVVRJTUVICisjaWZkZWYgTlQKKyAgICBzdHJ1Y3QgX3V0aW1idWYgdHA7CisjZWxzZSAvKiBOVCAqLworICAgIHN0cnVjdCB1dGltYnVmIHRwOworI2VuZGlmIC8qIE5UICovCisjZWxzZQorICAgIHN0cnVjdCB1dGltYnVmIHsKKyAgICAgICAgdGltZV90IGF0aW1lOworICAgICAgICB0aW1lX3QgbXRpbWU7CisgICAgfSB0cDsKKyNlbmRpZiAvKiBTWVNVVElNRUggKi8KKyNlbmRpZiAvKiBWNyAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisKKyAgICBpZiAoc3RhdChmLCZzYikgPCAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsInNldG1vZHRpbWUgc3RhdCBmYWlsdXJlIixmLGVycm5vKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisjaWZkZWYgQlNENDQKKyAgICB0cFswXS50dl9zZWMgPSBzYi5zdF9hdGltZTsgICAgICAgICAvKiBBY2Nlc3MgdGltZSBmaXJzdCAqLworICAgIHRwWzFdLnR2X3NlYyA9IHQ7ICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aW1lIHNlY29uZCAqLworICAgIGRlYnVnKEYxMTEsInNldG1vZHRpbWUgQlNENDQiLGYsdCk7CisjZWxzZQorI2lmZGVmIFY3CisgICAgdHAudGltZXBbMF0gPSB0OyAgICAgICAgICAgICAgICAgICAgLyogU2V0IG1vZGlmLiB0aW1lIHRvIGNyZWF0aW9uIGRhdGUgKi8KKyAgICB0cC50aW1lcFsxXSA9IHNiLnN0X2F0aW1lOyAgICAgICAgICAvKiBEb24ndCBjaGFuZ2UgdGhlIGFjY2VzcyB0aW1lICovCisgICAgZGVidWcoRjExMSwic2V0bW9kdGltZSBWNyIsZix0KTsKKyNlbHNlCisjaWZkZWYgU1lTVVRJTUVICisgICAgdHAubW9kdGltZSA9IHQ7ICAgICAgICAgICAgICAgICAgICAgLyogU2V0IG1vZGlmLiB0aW1lIHRvIGNyZWF0aW9uIGRhdGUgKi8KKyAgICB0cC5hY3RpbWUgPSBzYi5zdF9hdGltZTsgICAgICAgICAgICAvKiBEb24ndCBjaGFuZ2UgdGhlIGFjY2VzcyB0aW1lICovCisgICAgZGVidWcoRjExMSwic2V0bW9kdGltZSBTWVNVVElNRUgiLGYsdCk7CisjZWxzZQorICAgIHRwLm10aW1lID0gdDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBtb2RpZi4gdGltZSB0byBjcmVhdGlvbiBkYXRlICovCisgICAgdHAuYXRpbWUgPSBzYi5zdF9hdGltZTsgICAgICAgICAgICAgLyogRG9uJ3QgY2hhbmdlIHRoZSBhY2Nlc3MgdGltZSAqLworICAgIGRlYnVnKEYxMTEsInNldG1vZHRpbWUgKG90aGVyKSIsZix0KTsKKyNlbmRpZiAvKiBTWVNVVElNRUggKi8KKyNlbmRpZiAvKiBWNyAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisKKyAgICAvKiBUcnkgdG8gc2V0IHRoZSBmaWxlIGRhdGUgKi8KKworI2lmZGVmIEJTRDQ0CisgICAgeCA9IHV0aW1lcyhmLHRwKTsKKyAgICBkZWJ1ZyhGMTExLCJzZXRtb2R0aW1lIHV0aW1lcygpIiwiQlNENDQiLHgpOworI2Vsc2UKKyNpZmRlZiBJUklYNjUKKyAgICB7CisgICAgICAvKgorICAgICAgICBUaGUgZm9sbG93aW5nIHByb2R1Y2VzIHRoZSBub25zZW5zaWNhbCB3YXJuaW5nOgorICAgICAgICBBcmd1bWVudCAgb2YgdHlwZSAiY29uc3Qgc3RydWN0IHV0aW1idWYgKiIgaXMgaW5jb21wYXRpYmxlIHdpdGgKKyAgICAgICAgcGFyYW1ldGVyIG9mIHR5cGUgImNvbnN0IHN0cnVjdCB1dGltYnVmICoiLiAgSWYgeW91IGNhbiBtYWtlIGl0CisgICAgICAgIGdvIGF3YXksIGJlIG15IGd1ZXN0LgorICAgICAgKi8KKyAgICAgICAgY29uc3Qgc3RydWN0IHV0aW1idWYgKiB0MiA9ICZ0cDsKKyAgICAgICAgeCA9IHV0aW1lKGYsdDIpOworICAgIH0KKyNlbHNlCisgICAgeCA9IHV0aW1lKGYsJnRwKTsKKyAgICBkZWJ1ZyhGMTExLCJzZXRtb2R0aW1lIHV0aW1lKCkiLCJvdGhlciIseCk7CisjZW5kaWYgLyogSVJJWDY1ICovCisjZW5kaWYgLyogQlNENDQgKi8KKyAgICBpZiAoeCkKKyAgICAgIHJjID0gLTE7CisKKyAgICBkZWJ1ZyhGMTAxLCJzZXRtb2R0aW1lIHJlc3VsdCIsIiIscmMpOworICAgIHJldHVybihyYyk7Cit9CisKKworLyoKKyAgYyBoIGsgbSBvIGQgdCBpIG0gZSAgLS0gIENoZWNrL1NldCBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lLgorCisgIGZjID0gZnVuY3Rpb24gY29kZToKKyAgICAwID0gQ2hlY2s7IHJldHVybnM6CisgICAgICAtMSBvbiBlcnJvciwKKyAgICAgICAwIGlmIGxvY2FsIG9sZGVyIHRoYW4gcmVtb3RlLAorICAgICAgIDEgaWYgbW9kdGltZXMgYXJlIGVxdWFsLAorICAgICAgIDIgaWYgbG9jYWwgbmV3ZXIgdGhhbiByZW1vdGUuCisgICAgMSA9IFNldCAobG9jYWwgZmlsZSdzIG1vZHRpbWUgZnJvbSByZW1vdGUncyk7IHJldHVybnM6CisgICAgICAtMSBvbiBlcnJvciwKKyAgICAgICAwIG9uIHN1Y2Nlc3MuCisqLworc3RhdGljIGludAorY2hrbW9kdGltZShsb2NhbCxyZW1vdGUsZmMpIGNoYXIgKiBsb2NhbCwgKiByZW1vdGU7IGludCBmYzsgeworI2lmZGVmIE5UCisgICAgc3RydWN0IF9zdGF0IHN0YXRidWY7CisjZWxzZSAvKiBOVCAqLworICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisjZW5kaWYgLyogTlQgKi8KKyAgICBzdHJ1Y3QgdG0gKiB0bWxvY2FsID0gTlVMTDsKKyAgICBzdHJ1Y3QgdG0gdG1yZW1vdGU7CisgICAgaW50IHJjID0gMCwgaGF2ZWRhdGUgPSAwLCBsY3MgPSAtMSwgcmNzID0gLTEsIGZsYWcgPSAwOworICAgIGNoYXIgKiBzLCB0aW1lYnVmWzY0XTsKKworICAgIGRlYnVnKEYxMTEsImNoa21vZHRpbWUiLGxvY2FsLG1kdG1vayk7CisgICAgaWYgKCFtZHRtb2spCQkJLyogU2VydmVyIHN1cHBvcnRzIE1EVE0/ICovCisgICAgICByZXR1cm4oLTEpOwkJCS8qIE5vIGRvbid0IGJvdGhlci4gKi8KKworI2lmbmRlZiBOT0NTRVRTCisgICAgaWYgKGZ0cF94bGEpIHsKKyAgICAgICAgbGNzID0gZnRwX2NzbDsKKyAgICAgICAgaWYgKGxjcyA8IDApIGxjcyA9IGZjaGFyc2V0OworICAgICAgICByY3MgPSBmdHBfY3N4OworICAgICAgICBpZiAocmNzIDwgMCkgcmNzID0gZnRwX2NzcjsKKyAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisgICAgaWYgKGZjID09IDApIHsKKyAgICAgICAgcmMgPSBzdGF0KGxvY2FsLCZzdGF0YnVmKTsKKyAgICAgICAgaWYgKHJjID09IDApIHsgICAgICAgICAgICAgICAgICAvKiBHZXQgbG9jYWwgZmlsZSdzIG1vZCB0aW1lICovCisgICAgICAgICAgICB0bWxvY2FsID0gZ210aW1lKCZzdGF0YnVmLnN0X210aW1lKTsgLyogQ29udmVydCB0byBzdHJ1Y3QgdG0gKi8KKyNpZmRlZiBERUJVRworICAgICAgICAgICAgaWYgKHRtbG9jYWwpIHsKKyAgICAgICAgICAgICAgICBkYnRpbWUobG9jYWwsdG1sb2NhbCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBHZXQgcmVtb3RlIGZpbGUncyBtb2QgdGltZSBhcyB5eXl5bW1kZGhobW1zcyAqLworCisgICAgaWYgKGhhdmVtZHRtKSB7CQkJLyogQWxyZWFkeSBnb3QgaXQgZnJvbSBNTFNEPyAqLworCXMgPSBoYXZlbWR0bTsKKwlmbGFnKys7CisgICAgfSBlbHNlIGlmIChmdHBjbWQoIk1EVE0iLHJlbW90ZSxsY3MscmNzLDApID09IFJFUExZX0NPTVBMRVRFKSB7CisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgYnplcm8oKGNoYXIgKikmdG1yZW1vdGUsIHNpemVvZihzdHJ1Y3QgdG0pKTsKKyAgICAgICAgcyA9IGZ0cF9yZXBseV9zdHI7CisgICAgICAgIHdoaWxlICgoYyA9ICpzKyspKSB7ICAgICAgICAgICAgLyogU2tpcCBwYXN0IHJlc3BvbnNlIGNvZGUgKi8KKyAgICAgICAgICAgIGlmIChjID09IFNQKSB7CisgICAgICAgICAgICAgICAgZmxhZysrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChmbGFnKSB7CisJZGVidWcoRjExMSwiZnRwIGNoa21vZHRpbWUgc3RyaW5nIixzLGZsYWcpOworCWlmIChmdHNfc3RvKSB7CQkJLyogVXNlciBnYXZlIHNlcnZlciB0aW1lIG9mZnNldD8gKi8KKwkgICAgY2hhciAqIHA7CisJICAgIGRlYnVnKEYxMTAsImZ0cCBjaGttb2R0aW1lIG9mZnNldCIsZnRzX3N0bywwKTsKKwkgICAgY2ttYWttc2codGltZWJ1Ziw2NCxzLCIgIixmdHNfc3RvLE5VTEwpOyAvKiBCdWlsZCBkZWx0YSB0aW1lICovCisJICAgIGlmICgocCA9IGNtY3Z0ZGF0ZSh0aW1lYnVmLDEpKSkgeyAvKiBBcHBseSBkZWx0YSB0aW1lICovCisJCWNrc3RybmNweSh0aW1lYnVmLHAsNjQpOyAgICAgIC8qIENvbnZlcnQgdG8gTURUTSBmb3JtYXQgKi8KKwkJdGltZWJ1Zls4XSAgPSB0aW1lYnVmWzldOyAgLyogaCAqLworCQl0aW1lYnVmWzldICA9IHRpbWVidWZbMTBdOyAvKiBoICovCisJCXRpbWVidWZbMTBdID0gdGltZWJ1ZlsxMl07IC8qIG0gKi8KKwkJdGltZWJ1ZlsxMV0gPSB0aW1lYnVmWzEzXTsgLyogbSAqLworCQl0aW1lYnVmWzEyXSA9IHRpbWVidWZbMTJdOyAvKiBzICovCisJCXRpbWVidWZbMTNdID0gdGltZWJ1ZlsxM107IC8qIHMgKi8KKwkJdGltZWJ1ZlsxNF0gPSBOVUw7CisJCXMgPSB0aW1lYnVmOworCQlkZWJ1ZyhGMTEwLCJmdHAgY2hrbW9kdGltZSBhZGp1c3QiLHMsMCk7CisJICAgIH0KKwl9CisgICAgICAgIGlmIChmbGFnKSB7ICAgICAgICAgICAgICAgICAgICAgLyogQ29udmVydCB0byBzdHJ1Y3QgdG0gKi8KKyAgICAgICAgICAgIGNoYXIgKiBwYXQ7CisgICAgICAgICAgICBpbnQgeTJrYnVnID0gMDsgICAgICAgICAgICAgLyogU2VlbiBpbiBLZXJiZXJvcyA0IEZUUCBzZXJ2ZXJzICovCisgICAgICAgICAgICBpZiAoIWNrc3RyY21wKHMsIjE5MSIsMywwKSkgeworICAgICAgICAgICAgICAgIHBhdCA9ICIlMDVkJTAyZCUwMmQlMDJkJTAyZCUwMmQiOworICAgICAgICAgICAgICAgIHkya2J1ZysrOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBjaGttb2R0aW1lIFkySyBCVUcgZGV0ZWN0ZWQiLHMsMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhdCA9ICIlMDRkJTAyZCUwMmQlMDJkJTAyZCUwMmQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNzY2FuZihzLCAgICAgICAgICAgICAgIC8qIFBhcnNlIGludG8gc3RydWN0IHRtICovCisgICAgICAgICAgICAgICAgICAgICAgIHBhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgJih0bXJlbW90ZS50bV95ZWFyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgJih0bXJlbW90ZS50bV9tb24pLAorICAgICAgICAgICAgICAgICAgICAgICAmKHRtcmVtb3RlLnRtX21kYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAmKHRtcmVtb3RlLnRtX2hvdXIpLAorICAgICAgICAgICAgICAgICAgICAgICAmKHRtcmVtb3RlLnRtX21pbiksCisgICAgICAgICAgICAgICAgICAgICAgICYodG1yZW1vdGUudG1fc2VjKQorICAgICAgICAgICAgICAgICAgICAgICApID09IDYpIHsKKyAgICAgICAgICAgICAgICB0bXJlbW90ZS50bV95ZWFyIC09ICh5MmtidWcgPyAxOTAwMCA6IDE5MDApOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBjaGttb2R0aW1lIHllYXIiLCIiLHRtcmVtb3RlLnRtX3llYXIpOworICAgICAgICAgICAgICAgIHRtcmVtb3RlLnRtX21vbi0tOworCisjaWZkZWYgREVCVUcKKwkJZGVidWcoRjEwMCwiU0VSVkVSIFRJTUUgRk9MTE9XUzoiLCIiLDApOworICAgICAgICAgICAgICAgIGRidGltZShyZW1vdGUsJnRtcmVtb3RlKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgICAgICAgICAgICAgaWYgKGhhdmVkYXRlID4gLTEpCisJCSAgaGF2ZWRhdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsJCQkJLyogRmFpbGVkICovCisJZGVidWcoRjEwMSwiZnRwIGNoa21vZHRpbWUgZnRwY29kZSIsIiIsZnRwY29kZSk7CisJaWYgKGZ0cGNvZGUgPT0gNTAwIHx8CQkvKiBDb21tYW5kIHVucmVjb2duaXplZCAqLworCSAgICBmdHBjb2RlID09IDUwMiB8fAkJLyogQ29tbWFuZCBub3QgaW1wbGVtZW50ZWQgKi8KKwkgICAgZnRwY29kZSA9PSAyMDIpCQkvKiBDb21tYW5kIHN1cGVyZmx1b3VzICovCisJICBtZHRtb2sgPSAwOwkJCS8qIERvbid0IGFzayB0aGlzIHNlcnZlciBhZ2FpbiAqLworCXJldHVybigtMSk7CisgICAgfQorICAgIGlmIChmYyA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIENvbXBhcmUgKi8KKyAgICAgICAgaWYgKGhhdmVkYXRlID09IDEpIHsJCS8qIE9ubHkgaWYgd2UgaGF2ZSBib3RoIGZpbGUgZGF0ZXMgKi8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgIENvbXBhcmUgd2l0aCBsb2NhbCBmaWxlJ3MgdGltZS4gIFdlIGRvbid0IHVzZQorICAgICAgICAgICAgICBjbG9jayB0aW1lICh0aW1lX3QpIGhlcmUgaW4gY2FzZSBvZiBzaWduZWQvdW5zaWduZWQKKyAgICAgICAgICAgICAgY29uZnVzaW9uLCBldGMuCisgICAgICAgICAgICAqLworCSAgICBpbnQgeHg7CisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIERFQlVHCSAgICAKKwkgICAgaWYgKGRlYmxvZykgeworCQlkYnRpbWUoIkxPQ0FMIix0bWxvY2FsKTsKKwkJZGJ0aW1lKCJSRU1PVCIsJnRtcmVtb3RlKTsKKwkgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCSAgICB4eCA9IHRtY29tcGFyZSh0bWxvY2FsLCZ0bXJlbW90ZSk7CisJICAgIGRlYnVnKEYxMDEsImNoa21vZHRpbWUgdG1jb21wYXJlIiwiIix4eCk7CisgICAgICAgICAgICByZXR1cm4oeHggKyAxKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZnRwX2RhdGVzKSB7ICAgICAgICAgICAgIC8qIFNldCAqLworICAgICAgICAvKgorICAgICAgICAgIEhlcmUgd2UgbXVzdCBjb252ZXJ0IHN0cnVjdCB0bSB0byB0aW1lX3QKKyAgICAgICAgICB3aXRob3V0IGFwcGx5aW5nIHRpbWV6b25lIGNvbnZlcnNpb24sIGZvciB3aGljaAorICAgICAgICAgIHRoZXJlIGlzIG5vIHBvcnRhYmxlIEFQSS4gIFRoZSBtZXRob2QgaXMgaGlkZGVuCisgICAgICAgICAgaW4gbWt1dGltZSgpLCBkZWZpbmVkIGFib3ZlLgorICAgICAgICAqLworICAgICAgICB0aW1lX3QgdXRjOworICAgICAgICB1dGMgPSBta3V0aW1lKCZ0bXJlbW90ZSk7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBjaGttb2R0aW1lIG1rdXRpbWUiLHJlbW90ZSx1dGMpOworICAgICAgICBpZiAodXRjICE9ICh0aW1lX3QpLTEpCisgICAgICAgICAgcmV0dXJuKHNldG1vZHRpbWUobG9jYWwsdXRjKSk7CisgICAgfQorICAgIHJldHVybigtMSk7Cit9CisKKy8qIGdldGZpbGUoKSByZXR1cm5zOiAtMSBvbiBlcnJvciwgMCBpZiBmaWxlIHJlY2VpdmVkLCAxIGlmIGZpbGUgc2tpcHBlZCAqLworCitzdGF0aWMgaW50CitnZXRmaWxlKHJlbW90ZSxsb2NhbCxyZWNvdmVyLGFwcGVuZCxwaXBlbmFtZSx4bGF0ZSxmY3MscmNzKQorICAgIGNoYXIgKiBsb2NhbCwgKiByZW1vdGUsICogcGlwZW5hbWU7IGludCByZWNvdmVyLCBhcHBlbmQsIHhsYXRlLCBmY3MsIHJjczsKKy8qIGdldGZpbGUgKi8geworICAgIGludCByYyA9IC0xOworICAgIFVMT05HIHQwLCB0MTsKKworI2lmZGVmIEdGVElNRVIKKyAgICBDS0ZMT0FUIHNlYzsKKyNlbHNlCisgICAgaW50IHNlYyA9IDA7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworICAgIGNoYXIgZnVsbG5hbWVbQ0tNQVhQQVRIKzFdOworCisgICAgZGVidWcoRjExMCwiZnRwIGdldGZpbGUgcmVtb3RlIEEiLHJlbW90ZSwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJmdHAgZ2V0ZmlsZSBsb2NhbCBBIixsb2NhbCwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJmdHAgZ2V0ZmlsZSBwaXBlbmFtZSIscGlwZW5hbWUsMCk7CisgICAgaWYgKCFyZW1vdGUpIHJlbW90ZSA9ICIiOworCisjaWZkZWYgUEFUVEVSTlMKKyAgICAvKiBBdXRvbWF0aWMgdHlwZSBzd2l0Y2hpbmc/ICovCisgICAgaWYgKHhmZXJtb2RlID09IFhNT0RFX0EgJiYgcGF0dGVybnMgJiYgZ2V0X2F1dG8gJiYgIWZvcmNldHlwZSkgeworICAgICAgICBpbnQgeDsKKyAgICAgICAgeCA9IG1hdGNobmFtZShyZW1vdGUsMCxzZXJ2ZXJ0eXBlKTsKKyAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldGZpbGUgbWF0Y2huYW1lIixyZW1vdGUseCk7CisgICAgICAgIHN3aXRjaCAoeCkgeworICAgICAgICAgIGNhc2UgMDogZnRwX3R5cCA9IEZUVF9BU0M7IGJyZWFrOworICAgICAgICAgIGNhc2UgMTogZnRwX3R5cCA9IHRlbmV4ID8gRlRUX1RFTiA6IEZUVF9CSU47IGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IGlmIChnX2Z0cF90eXAgPiAtMSkgZnRwX3R5cCA9IGdfZnRwX3R5cDsKKyAgICAgICAgfQorICAgICAgICBjaGFuZ2V0eXBlKGZ0cF90eXAsZnRwX3ZibSk7CisgICAgICAgIGJpbmFyeSA9IGZ0cF90eXA7ICAgICAgICAgICAgICAgLyogRm9yIGZpbGUtdHJhbnNmZXIgZGlzcGxheSAqLworICAgIH0KKyNlbmRpZiAvKiBQQVRURVJOUyAqLworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICBmdHBfY3N4ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgZmlsZS10cmFuc2ZlciBkaXNwbGF5ICovCisgICAgZnRwX2NzbCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgLyogLi4uICovCisKKyAgICBpZiAocmNzID4gLTEpICAgICAgICAgICAgICAgICAgICAgICAvKiAtMSBtZWFucyBubyB0cmFuc2xhdGlvbiAqLworICAgICAgaWYgKGZ0cF90eXAgPT0gRlRUX0FTQykgICAgICAgICAgIC8qIEZpbGUgdHlwZSBpcyAiYXNjaWkiPyAqLworICAgICAgICBpZiAoZmNzIDwgMCkgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgY2hhcnNldCBub3QgZm9yY2VkPyAqLworICAgICAgICAgIGZjcyA9IGZjaGFyc2V0OyAgICAgICAgICAgICAgIC8qIHVzZSBwcmV2YWlsaW5nIEZJTEUgQ0hBUkFDVEVSLVNFVCAqLworICAgIGlmIChmY3MgPiAtMSAmJiByY3MgPiAtMSkgeyAgICAgICAgIC8qIFNldCB1cCB0cmFuc2xhdGlvbiBmdW5jdGlvbnMgKi8KKyAgICAgICAgZGVidWcoRjExMCwiZnRwIGdldGZpbGUiLCJpbml0eGxhdGUiLDApOworICAgICAgICBpbml0eGxhdGUocmNzLGZjcyk7ICAgICAgICAgICAgIC8qIE5COiBvcHBvc2l0ZSBvcmRlciBvZiBQVVQgKi8KKyAgICAgICAgZnRwX2NzeCA9IHJjczsKKyAgICAgICAgZnRwX2NzbCA9IGZjczsKKyAgICB9IGVsc2UKKyAgICAgIHhsYXRlID0gMDsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyAgICBpZiAoIXBpcGVuYW1lICYmICghbG9jYWwgfHwgIWxvY2FsWzBdKSkKKyAgICAgIGxvY2FsID0gcmVtb3RlOworCisgICAgb3V0MnNjcmVlbiA9ICFzdHJjbXAobG9jYWwsIi0iKTsKKworICAgIGZ1bGxuYW1lWzBdID0gTlVMOworICAgIGlmIChwaXBlbmFtZSkgeworICAgICAgICBja3N0cm5jcHkoZnVsbG5hbWUscGlwZW5hbWUsQ0tNQVhQQVRIKzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHpmbnFmcChsb2NhbCxDS01BWFBBVEgsZnVsbG5hbWUpOworICAgICAgICBpZiAoIWZ1bGxuYW1lWzBdKQorICAgICAgICAgIGNrc3RybmNweShmdWxsbmFtZSxsb2NhbCxDS01BWFBBVEgrMSk7CisgICAgfQorICAgIGlmICghb3V0MnNjcmVlbiAmJiBkaXNwbGEgJiYgZmRpc3BsYSkgeyAvKiBTY3JlZW4gKi8KKyAgICAgICAgZnRzY3JlZW4oU0NSX0ZOLCdGJywobG9uZylwa3RudW0scmVtb3RlKTsKKyAgICAgICAgZnRzY3JlZW4oU0NSX0FOLDAsMEwsZnVsbG5hbWUpOworICAgICAgICBmdHNjcmVlbihTQ1JfRlMsMCxmc2l6ZSwiIik7CisgICAgfQorICAgIHRsb2coRjExMCxmdHBfdHlwID8gImZ0cCBnZXQgQklOQVJZOiIgOiAiZnRwIGdldCBURVhUOiIsIHJlbW90ZSwgMCk7CisgICAgdGxvZyhGMTEwLCIgYXMiLGZ1bGxuYW1lLDApOworICAgIGRlYnVnKEYxMTEsImZ0cCBnZXRmaWxlIHNpemUiLHJlbW90ZSxmc2l6ZSk7CisgICAgZGVidWcoRjExMSwiZnRwIGdldGZpbGUgbG9jYWwiLGxvY2FsLG91dDJzY3JlZW4pOworCisgICAgY2tzdHJuY3B5KGZpbG5hbSwgcGlwZW5hbWUgPyByZW1vdGUgOiBsb2NhbCwgQ0tNQVhQQVRIKTsKKworICAgIHQwID0gZ21zdGltZXIoKTsgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IHRpbWUgKi8KKyAgICBkZWJ1ZyhGMTExLCJmdHAgZ2V0ZmlsZSB0MCIscmVtb3RlLHQwKTsgLyogXl5eICovCisgICAgcmMgPSByZWN2cmVxdWVzdCgiUkVUUiIsCisgICAgICAgICAgICAgICAgICAgICBsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgIHJlbW90ZSwKKyAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCA/ICJhYiIgOiAid2IiLAorICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIsCisgICAgICAgICAgICAgICAgICAgICBwaXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHhsYXRlLAorICAgICAgICAgICAgICAgICAgICAgZmNzLAorICAgICAgICAgICAgICAgICAgICAgcmNzCisgICAgICAgICAgICAgICAgICAgICApOworICAgIHQxID0gZ21zdGltZXIoKTsgICAgICAgICAgICAgICAgICAgIC8qIEVuZCB0aW1lICovCisgICAgZGVidWcoRjExMSwiZnRwIGdldGZpbGUgdDEiLHJlbW90ZSx0MSk7CisgICAgZGVidWcoRjExMSwiZnRwIGdldGZpbGUgc2VjIixyZW1vdGUsKHQxLXQwKS8xMDAwKTsKKyNpZmRlZiBHRlRJTUVSCisgICAgc2VjID0gKENLRkxPQVQpKChDS0ZMT0FUKSh0MSAtIHQwKSAvIDEwMDAuMCk7IC8qIFN0YXRzICovCisgICAgZnB4ZnNlY3MgPSBzZWM7ICAgICAgICAgICAgICAgICAgICAgLyogKGZvciBkb3hsb2coKSkgKi8KKyNlbHNlCisgICAgc2VjID0gKHQxIC0gdDApIC8gMTAwMDsKKyAgICB4ZnNlY3MgPSAoaW50KXNlYzsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgZGVidWcoRjExMSwiZnRwIHJlY3ZyZXF1ZXN0IHJjIixyZW1vdGUscmMpOworICAgIGlmIChjYW5jZWxmaWxlIHx8IGNhbmNlbGdyb3VwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBnZXQgY2FuY2VsZWQiLGNraXRvYShjYW5jZWxmaWxlKSxjYW5jZWxncm91cCk7CisgICAgICAgIGZ0c2NyZWVuKFNDUl9TVCxTVF9JTlQsMGwsIiIpOworICAgIH0gZWxzZSBpZiAocmMgPiAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBnZXQgc2tpcHBlZCIsY2tpdG9hKGNhbmNlbGZpbGUpLGNhbmNlbGdyb3VwKTsKKyAgICAgICAgZnRzY3JlZW4oU0NSX1NULFNUX1NLSVAsMGwsY21hcmcpOworICAgIH0gZWxzZSBpZiAocmMgPCAwKSB7CisgICAgICAgIHN3aXRjaCAoZnRwY29kZSkgeworICAgICAgICAgIGNhc2UgLTQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldHdvcmsgZXJyb3IgKi8KKyAgICAgICAgICBjYXNlIC0yOiAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIGVycm9yICovCisgICAgICAgICAgICBmdHNjcmVlbihTQ1JfU1QsU1RfTVNHLDBsLGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgLTM6CisgICAgICAgICAgICBmdHNjcmVlbihTQ1JfU1QsU1RfTVNHLDBsLCJGYWlsdXJlIHRvIG1ha2UgZGF0YSBjb25uZWN0aW9uIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgZnRzY3JlZW4oU0NSX1NULFNUX0lOVCwwbCwiIik7IC8qIChzaG91bGQgYmUgY292ZXJlZCBhYm92ZSkgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmdHNjcmVlbihTQ1JfU1QsU1RfTVNHLDBsLCZmdHBfcmVwbHlfc3RyWzRdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR1ZG8gYmVtICovCisgICAgICAgIGZ0c2NyZWVuKFNDUl9QVCwnWicsMEwsIiIpOworICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgZnRzY3JlZW4oU0NSX1NULFNUX09LLDBMLCIiKTsgLyogRm9yIHNjcmVlbiAqLworICAgICAgICAgICAgbWFrZXN0cigmcnJmc3BlYyxyZW1vdGUpOyAgICAgLyogRm9yIFdIRVJFIGNvbW1hbmQgKi8KKyAgICAgICAgICAgIG1ha2VzdHIoJnJmc3BlYyxmdWxsbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZ0cF9kYXRlcykJCQkvKiBJZiBGVFAgREFURVMgT04uLi4gKi8KKyAgICAgIGlmICghcGlwZW5hbWUgJiYgIW91dDJzY3JlZW4pCS8qIGFuZCBpdCdzIGEgcmVhbCBmaWxlICovCisJaWYgKHJjIDwgMSAmJiByYyAhPSAtMykJCS8qIGFuZCBpdCB3YXNuJ3Qgc2tpcHBlZCAqLworCSAgaWYgKGNvbm5lY3RlZCkJCS8qIGFuZCB3ZSBzdGlsbCBoYXZlIGEgY29ubmVjdGlvbiAqLworCSAgICBpZiAoemNoa2kobG9jYWwpID4gLTEpIHsJLyogYW5kIHRoZSBmaWxlIHdhc24ndCBkaXNjYXJkZWQgKi8KKwkJY2hrbW9kdGltZShsb2NhbCxyZW1vdGUsMSk7IC8qIHNldCBsb2NhbCBmaWxlIGRhdGUgKi8KKwkJZGVidWcoRjExMCwiZnRwIGdldCBzZXQgZGF0ZSIsbG9jYWwsMCk7CisJICAgIH0KKyAgICBmaWxjbnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2VkIGJ5IFx2KGZpbGVudW0pICovCisjaWZkZWYgVExPRworICAgIGlmICh0cmFsb2cpIHsKKyAgICAgICAgaWYgKHJjID4gMCkgeworICAgICAgICAgICAgdGxvZyhGMTAwLCIgcmVjb3Zlcnkgc2tpcHBlZCIsIiIsMCk7CisgICAgICAgIH0gZWxzZSBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgdGxvZyhGMTAxLCIgY29tcGxldGUsIHNpemUiLCAiIiwgZnNpemUpOworICAgICAgICB9IGVsc2UgaWYgKGNhbmNlbGZpbGUpIHsKKyAgICAgICAgICAgIHRsb2coRjEwMCwiIGNhbmNlbGVkIGJ5IHVzZXIiLCIiLDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGxvZyhGMTEwLCIgZmFpbGVkOiIsZnRwX3JlcGx5X3N0ciwwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXRsb2dmbXQpCisgICAgICAgICAgZG94bG9nKHdoYXQsbG9jYWwsZnNpemUsZnRwX3R5cCxyYywiIik7CisgICAgfQorI2VuZGlmIC8qIFRMT0cgKi8KKyAgICByZXR1cm4ocmMpOworfQorCisvKiBwdXRmaWxlKCkgcmV0dXJuczogLTEgb24gZXJyb3IsID4wIGlmIGZpbGUgbm90IHNlbGVjdGVkLCAwIG9uIHN1Y2Nlc3MuICovCisvKiBQb3NpdGl2ZSByZXR1cm4gdmFsdWUgaXMgU2tpcCBSZWFzb24sIFNLUF94eHgsIGZyb20gY2tja2VyLmguICovCisKK3N0YXRpYyBpbnQKK3B1dGZpbGUoY3gsCisgICAgbG9jYWwscmVtb3RlLGZvcmNlLG1vdmluZyxtdnRvLHJudG8sc3J2cm4seF9jbnYseF91c24seGZ0LHBybSxmY3MscmNzLGZsZykKKyAgICBjaGFyICogbG9jYWwsICogcmVtb3RlLCAqIG12dG8sICpybnRvLCAqc3J2cm47CisgICAgaW50IGN4LCBmb3JjZSwgbW92aW5nLCB4X2NudiwgeF91c24sIHhmdCwgZmNzLCByY3MsIGZsZzsKKworLyogcHV0ZmlsZSAqLyB7CisKKyAgICBjaGFyIGFzbmFtZVtDS01BWFBBVEgrMV07CisgICAgY2hhciBmdWxsbmFtZVtDS01BWFBBVEgrMV07CisgICAgaW50IGsgPSAtMSwgeCA9IDAsIHkgPSAwLCBvID0gLTEsIHJjID0gMCwgbmMgPSAwOworICAgIGludCB4bGF0ZSA9IDAsIHJlc3RhcnQgPSAwLCBtdCA9IC0xOworICAgIGNoYXIgKiBzID0gTlVMTCwgKiBjbWQgPSBOVUxMOworICAgIFVMT05HIHQwID0gMCwgdDEgPSAwOwkJLyogVGltZXMgZm9yIHN0YXRzICovCisgICAgaW50IG9mY3MgPSAwLCBvcmNzID0gMDsKKworI2lmZGVmIEdGVElNRVIKKyAgICBDS0ZMT0FUIHNlYyA9IDAuMDsKKyNlbHNlCisgICAgaW50IHNlYyA9IDA7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworICAgIGRlYnVnKEYxMTEsImZ0cCBwdXRmaWxlIGZsZyIsbG9jYWwsZmxnKTsKKyAgICBkZWJ1ZyhGMTEwLCJmdHAgcHV0ZmlsZSBzcnZfcmVuYW0iLHNydnJuLDApOworICAgIGRlYnVnKEYxMDEsImZ0cCBwdXRmaWxlIGZjcyIsIiIsZmNzKTsKKyAgICBkZWJ1ZyhGMTAxLCJmdHAgcHV0ZmlsZSByY3MiLCIiLHJjcyk7CisKKyAgICBvZmNzID0gZmNzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIGNoYXJzZXQgYXJncyAqLworICAgIG9yY3MgPSByY3M7CisKKyAgICBzZW5kc3RhcnQgPSAwTDsKKyAgICByZXN0YXJ0ID0gZmxnICYgUFVUX1JFUzsKKyAgICBpZiAoIXJlbW90ZSkKKyAgICAgIHJlbW90ZSA9ICIiOworCisgICAgLyogRlRQIHByb3RvY29sIGNvbW1hbmQgdG8gc2VuZCB0byBzZXJ2ZXIgKi8KKyAgICBjbWQgPSAoY3ggPT0gRlRQX0FQUCkgPyAiQVBQRSIgOiAoeF91c24gPyAiU1RPVSIgOiAiU1RPUiIpOworCisgICAgaWYgKHhfY252ID09IFNFVF9BVVRPKSB7ICAgICAgICAgICAgLyogTmFtZSBjb252ZXJzaW9uIGlzIGF1dG8gKi8KKyAgICAgICAgaWYgKGFsaWtlKSB7ICAgICAgICAgICAgICAgICAgICAvKiBJZiBzZXJ2ZXIgJiBjbGllbnQgYXJlIGFsaWtlICovCisgICAgICAgICAgICBuYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gY29udmVyc2lvbiAqLworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZXkgYXJlIGRpZmZlcmVudCAqLworICAgICAgICAgICAgaWYgKHNlcnZlcnR5cGUgPT0gU1lTX1VOSVggfHwgc2VydmVydHlwZSA9PSBTWVNfV0lOMzIpCisgICAgICAgICAgICAgIG5jID0gLTE7ICAgICAgICAgICAgICAgICAgLyogb25seSBtaW5pbWFsIGNvbnZlcnNpb25zIG5lZWRlZCAqLworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSAqLworICAgICAgICAgICAgICBuYyA9IDE7ICAgICAgICAgICAgICAgICAgIC8qIGZ1bGwgY29udmVyc2lvbiAqLworICAgICAgICB9CisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGF1dG8gLSBkbyB3aGF0IHVzZXIgc2FpZCAqLworICAgICAgbmMgPSB4X2NudjsKKworICAgIC8qIElmIFRyYW5zZmVyIE1vZGUgaXMgQXV0b21hdGljLCBkZXRlcm1pbmUgZmlsZSB0eXBlICovCisgICAgaWYgKHhmZXJtb2RlID09IFhNT0RFX0EgJiYgZmlsZXBlZWsgJiYgIXBpcGVzZW5kKSB7CisgICAgICAgIGlmIChpc2Rpcihsb2NhbCkpIHsgICAgICAgICAgICAgLyogSWYgaXQncyBhIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgayA9IEZUX0JJTjsgICAgICAgICAgICAgICAgIC8qIHNraXAgdGhlIGZpbGUgc2NhbiAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWcoRjExMCwiRlRQIFBVVCBjYWxsaW5nIHNjYW5maWxlIixsb2NhbCwwKTsKKyAgICAgICAgICAgIGsgPSBzY2FuZmlsZShsb2NhbCwmbyxuc2NhbmZpbGUpOyAvKiBTY2FuIHRoZSBmaWxlICovCisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjExMSwiRlRQIFBVVCBzY2FuZmlsZSIsbG9jYWwsayk7CisgICAgICAgIGlmIChrID4gLTEgJiYgIWZvcmNldHlwZSkgeworICAgICAgICAgICAgZnRwX3R5cCA9IChrID09IEZUX0JJTikgPyAxIDogMDsKKyAgICAgICAgICAgIGlmICh4ZnQgPiAtMSAmJiBmdHBfdHlwICE9IHhmdCkgeworICAgICAgICAgICAgICAgIGlmIChmbGcgJiBQVVRfU0lNKQorICAgICAgICAgICAgICAgICAgdGxvZyhGMTEwLCJmdHAgcHV0IFNLSVAgKFR5cGUpOiIsIGxvY2FsLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oU0tQX1RZUCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZnRwX3R5cCA9PSAxICYmIHRlbmV4KSAgLyogVXNlciBzYWlkIFRFTkVYPyAqLworICAgICAgICAgICAgICBmdHBfdHlwID0gRlRUX1RFTjsKKyAgICAgICAgfQorICAgIH0KKyNpZm5kZWYgTk9DU0VUUworICAgIGZ0cF9jc3ggPSAtMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBmaWxlLXRyYW5zZmVyIGRpc3BsYXkgKi8KKyAgICBmdHBfY3NsID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAvKiAuLi4gKi8KKworICAgIGlmIChyY3MgPiAtMSkgeyAgICAgICAgICAgICAgICAgICAgIC8qIC0xIG1lYW5zIG5vIHRyYW5zbGF0aW9uICovCisgICAgICAgIGlmIChmdHBfdHlwID09IDApIHsgICAgICAgICAgICAgLyogRmlsZSB0eXBlIGlzICJhc2NpaSI/ICovCisgICAgICAgICAgICBpZiAoZmNzIDwgMCkgeyAgICAgICAgICAgICAgLyogRmlsZSBjaGFyc2V0IG5vdCBmb3JjZWQ/ICovCisgICAgICAgICAgICAgICAgaWYgKGsgPCAwKSB7ICAgICAgICAgICAgLyogSWYgd2UgZGlkbid0IHNjYW4gKi8KKyAgICAgICAgICAgICAgICAgICAgZmNzID0gZmNoYXJzZXQ7ICAgICAvKiB1c2UgcHJldmFpbGluZyBGSUxFIENIQVJBQ1RFUi1TRVQgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBkaWQgc2NhbiwgdXNlIHNjYW4gcmVzdWx0ICovCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaykgeworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlRfVEVYVDogICAgIC8qIFVua25vd24gdGV4dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZmNzID0gZmNoYXJzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZUXzdCSVQ6ICAgICAvKiA3LWJpdCB0ZXh0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmY3MgPSBkY3NldDc7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZUXzhCSVQ6ICAgICAvKiA4LWJpdCB0ZXh0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmY3MgPSBkY3NldDg7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZUX1VURjg6ICAgICAvKiBVVEYtOCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZmNzID0gRkNfVVRGODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlRfVUNTMjogICAgIC8qIFVDUy0yICovCisgICAgICAgICAgICAgICAgICAgICAgICBmY3MgPSBGQ19VQ1MyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPiAtMSkgICAgIC8qIElucHV0IGZpbGUgYnl0ZSBvcmRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlb3JkZXIgPSBvOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjcyA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChmY3MgPiAtMSAmJiByY3MgPiAtMSkgeyAgICAgICAgIC8qIFNldCB1cCB0cmFuc2xhdGlvbiBmdW5jdGlvbnMgKi8KKyAgICAgICAgZGVidWcoRjExMCwiZnRwIHB1dGZpbGUiLCJpbml0eGxhdGUiLDApOworICAgICAgICBpbml0eGxhdGUoZmNzLHJjcyk7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBwdXRmaWxlIHJjcyIsZmNzaW5mb1tyY3NdLmtleXdvcmQscmNzKTsKKyAgICAgICAgeGxhdGUgPSAxOworICAgICAgICBmdHBfY3N4ID0gcmNzOworICAgICAgICBmdHBfY3NsID0gZmNzOworICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyAgICBiaW5hcnkgPSBmdHBfdHlwOyAgICAgICAgICAgICAgICAgICAvKiBGb3IgZmlsZS10cmFuc2ZlciBkaXNwbGF5ICovCisgICAgYXNuYW1lWzBdID0gTlVMOworCisgICAgaWYgKHJlY3Vyc2l2ZSkgeyAgICAgICAgICAgICAgICAgICAgLyogSWYgc2VuZGluZyByZWN1cnNpdmVseSwgKi8KKyAgICAgICAgaWYgKCFzeW5jZGlyKGxvY2FsLGZsZyAmIFBVVF9TSU0pKSAvKiBzeW5jaHJvbml6ZSBkaXJlY3Rvcmllcy4gKi8KKyAgICAgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBQVVQgaWYgaXQgZmFpbHMuICovCisgICAgICAgIGVsc2UgaWYgKGlzZGlyKGxvY2FsKSkgICAgICAgICAgLyogSXQncyBhIGRpcmVjdG9yeSAqLworICAgICAgICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IHNlbmQgaXQhICovCisgICAgfQorICAgIGlmICgqcmVtb3RlKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGFuIGFzLW5hbWUgdGVtcGxhdGUgd2FzIGdpdmVuICovCisjaWZuZGVmIE5PU1BMCisgICAgICAgIGlmIChjbWRfcXVvdGluZykgeyAgICAgICAgICAgICAgLyogYW5kIENPTU1BTkQgUVVPVElORyBpcyBPTiAqLworICAgICAgICAgICAgeSA9IENLTUFYUEFUSDsgICAgICAgICAgICAgIC8qIGV2YWx1YXRlIGl0IGZvciB0aGlzIGZpbGUgKi8KKyAgICAgICAgICAgIHMgPSBhc25hbWU7CisgICAgICAgICAgICB6enN0cmluZyhyZW1vdGUsJnMsJnkpOworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgIGNrc3RybmNweShhc25hbWUscmVtb3RlLENLTUFYUEFUSCk7ICAgLyogKG9yIHRha2UgaXQgbGl0ZXJhbGx5KSAqLworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gYXMtbmFtZSAqLworICAgICAgICBuemx0b3IobG9jYWwsYXNuYW1lLG5jLDAsQ0tNQVhQQVRIKTsgICAgLyogdXNlIGxvY2FsIG5hbWUgc3RyaXAgcGF0aCAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJGVFAgUFVUIG56bHRvciIsYXNuYW1lLDApOworICAgIH0KKyAgICAvKiBQcmVsaW1pbmFyeSBtZXNzYWdlcyBhbmQgbG9nIGVudHJpZXMgKi8KKworICAgIGZ1bGxuYW1lWzBdID0gTlVMOworICAgIHpmbnFmcChsb2NhbCxDS01BWFBBVEgsZnVsbG5hbWUpOworICAgIGlmICghZnVsbG5hbWVbMF0pIGNrc3RybmNweShmdWxsbmFtZSxsb2NhbCxDS01BWFBBVEgrMSk7CisgICAgZnVsbG5hbWVbQ0tNQVhQQVRIXSA9IE5VTDsKKworICAgIGlmIChkaXNwbGEgJiYgZmRpc3BsYSkgeyAgICAgICAgICAgIC8qIFNjcmVlbiAqLworICAgICAgICBmdHNjcmVlbihTQ1JfRk4sJ0YnLChsb25nKXBrdG51bSxsb2NhbCk7CisgICAgICAgIGZ0c2NyZWVuKFNDUl9BTiwwLDBMLGFzbmFtZSk7CisgICAgICAgIGZ0c2NyZWVuKFNDUl9GUywwLGZzaXplLCIiKTsKKyAgICB9CisjaWZkZWYgRE9VUERBVEUKKyAgICBpZiAoZmxnICYgKFBVVF9VUER8UFVUX0RJRikpIHsJLyogRGF0ZS1jaGVja2luZyBtb2Rlcy4uLiAqLworICAgICAgICBtdCA9IGNoa21vZHRpbWUoZnVsbG5hbWUsYXNuYW1lLDApOworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgcHV0ZmlsZSBjaGttb2R0aW1lIixhc25hbWUsbXQpOworICAgICAgICBpZiAobXQgPT0gMCAmJiAoKGZsZyAmIFBVVF9ESUYpID09IDApKSB7IC8qIExvY2FsIGlzIG9sZGVyICovCisgICAgICAgICAgICB0bG9nKEYxMTAsImZ0cCBwdXQgL3VwZGF0ZSBTS0lQIChPbGRlciBtb2R0aW1lKTogIixmdWxsbmFtZSwwKTsKKyAgICAgICAgICAgIGZ0c2NyZWVuKFNDUl9TVCxTVF9TS0lQLFNLUF9EQVQsZnVsbG5hbWUpOyAvKiBTa2lwIHRoaXMgb25lICovCisgICAgICAgICAgICBmaWxjbnQrKzsKKyAgICAgICAgICAgIHJldHVybihTS1BfREFUKTsKKyAgICAgICAgfSBlbHNlIGlmIChtdCA9PSAxKSB7ICAgICAgICAgICAvKiBUaW1lcyBhcmUgZXF1YWwgKi8KKyAgICAgICAgICAgIHRsb2coRjExMCwiZnRwIHB1dCAvdXBkYXRlIFNLSVAgKEVxdWFsIG1vZHRpbWUpOiAiLGZ1bGxuYW1lLDApOworICAgICAgICAgICAgZnRzY3JlZW4oU0NSX1NULFNUX1NLSVAsU0tQX0VRVSxmdWxsbmFtZSk7IC8qIFNraXAgaXQgKi8KKyAgICAgICAgICAgIGZpbGNudCsrOworICAgICAgICAgICAgcmV0dXJuKFNLUF9EQVQpOworICAgICAgICB9CisJLyogTG9jYWwgZmlsZSBpcyBuZXdlciAqLworICAgICAgICB0bG9nKEYxMTAsZnRwX3R5cCA/ICJmdHAgcHV0IC91cGRhdGUgQklOQVJZOiIgOgorICAgICAgICAgICAgICJmdHAgcHV0IC91cGRhdGUgVEVYVDoiLCBmdWxsbmFtZSwgMCk7CisgICAgfSBlbHNlIGlmIChmbGcgJiBQVVRfUkVTKSB7CisgICAgICAgIHRsb2coRjExMCxmdHBfdHlwID8gImZ0cCBwdXQgL3JlY292ZXIgQklOQVJZOiIgOgorICAgICAgICAgICAgICJmdHAgcHV0IC9yZWNvdmVyIFRFWFQ6IiwgZnVsbG5hbWUsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHRsb2coRjExMCxmdHBfdHlwID8gImZ0cCBwdXQgQklOQVJZOiIgOiAiZnRwIHB1dCBURVhUOiIsIGZ1bGxuYW1lLCAwKTsKKyAgICB9CisjZWxzZQorICAgIHRsb2coRjExMCxmdHBfdHlwID8gImZ0cCBwdXQgQklOQVJZOiIgOiAiZnRwIHB1dCBURVhUOiIsIGZ1bGxuYW1lLCAwKTsKKyNlbmRpZiAvKiBET1VQREFURSAqLworICAgIHRsb2coRjExMCwiIGFzIixhc25hbWUsMCk7CisKKyNpZm5kZWYgTk9DU0VUUworICAgIGlmICh4bGF0ZSkgeworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgcHV0ZmlsZSBmY3MiLGZjc2luZm9bZmNzXS5rZXl3b3JkLGZjcyk7CisgICAgICAgIHRsb2coRjExMCwiIGZpbGUgY2hhcmFjdGVyIHNldDoiLGZjc2luZm9bZmNzXS5rZXl3b3JkLDApOworICAgICAgICB0bG9nKEYxMTAsIiBzZXJ2ZXIgY2hhcmFjdGVyIHNldDoiLGZjc2luZm9bcmNzXS5rZXl3b3JkLDApOworICAgIH0gZWxzZSBpZiAoIWZ0cF90eXApIHsKKyAgICAgICAgdGxvZyhGMTEwLCIgY2hhcmFjdGVyIHNldHM6Iiwibm8gY29udmVyc2lvbiIsMCk7CisgICAgICAgIGZjcyA9IG9mY3M7ICAgICAgICAgICAgICAgICAgICAgLyogQmluYXJ5IGZpbGUgYnV0IHdlIHN0aWxsIG11c3QgKi8KKyAgICAgICAgcmNzID0gb3JjczsgICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc2xhdGUgaXRzIG5hbWUgKi8KKyAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisgICAgLyogUFVUIFRIRSBGSUxFICovCisKKyAgICB0MCA9IGdtc3RpbWVyKCk7ICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCB0aW1lICovCisgICAgaWYgKGZsZyAmIFBVVF9TSU0pIHsgICAgICAgICAgICAgICAgLyogcmMgPiAwIGlzIGEgc2tpcCByZWFzb24gY29kZSAqLworICAgICAgICBpZiAoZmxnICYgKFBVVF9VUER8UFVUX0RJRikpIHsJLyogKHNlZSBTS1BfeHh4IGluIGNrY2tlci5oKSAqLworICAgICAgICAgICAgcmMgPSAobXQgPCAwKSA/ICAgICAgICAgICAgIC8qIFVwZGF0ZSBtb2RlLi4uICovCisgICAgICAgICAgICAgIFNLUF9YTlggOiAgICAgICAgICAgICAgICAgLyogUmVtb3RlIGZpbGUgZG9lc24ndCBleGlzdCAqLworICAgICAgICAgICAgICAgIFNLUF9YVVA7ICAgICAgICAgICAgICAgIC8qIFJlbW90ZSBmaWxlIGlzIG9sZGVyICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYyA9IFNLUF9TSU07ICAgICAgICAgICAgICAgLyogIldvdWxkIGJlIHNlbnQiLCBwZXJpb2QuICovCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IHNlbmRyZXF1ZXN0KGNtZCxsb2NhbCxhc25hbWUseGxhdGUsZmNzLHJjcyxyZXN0YXJ0KTsKKyAgICB9CisgICAgdDEgPSBnbXN0aW1lcigpOyAgICAgICAgICAgICAgICAgICAgLyogRW5kIHRpbWUgKi8KKyAgICBmaWxjbnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIG51bWJlciAqLworCisjaWZkZWYgR0ZUSU1FUgorICAgIHNlYyA9IChDS0ZMT0FUKSgoQ0tGTE9BVCkodDEgLSB0MCkgLyAxMDAwLjApOyAvKiBTdGF0cyAqLworICAgIGZweGZzZWNzID0gc2VjOyAgICAgICAgICAgICAgICAgICAgIC8qIChmb3IgZG94bG9nKCkpICovCisjZWxzZQorICAgIHNlYyA9ICh0MSAtIHQwKSAvIDEwMDA7CisgICAgeGZzZWNzID0gKGludClzZWM7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisgICAgZGVidWcoRjExMSwiZnRwIHNlbmRyZXF1ZXN0IHJjIixsb2NhbCxyYyk7CisKKyAgICBpZiAoY2FuY2VsZmlsZSB8fCBjYW5jZWxncm91cCkgeworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgcHV0IGNhbmNlbGVkIixja2l0b2EoY2FuY2VsZmlsZSksY2FuY2VsZ3JvdXApOworICAgICAgICBmdHNjcmVlbihTQ1JfU1QsU1RfSU5ULDBsLCIiKTsKKyAgICB9IGVsc2UgaWYgKHJjID4gMCkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJmdHAgcHV0IHNraXBwZWQiLGxvY2FsLHJjKTsKKyAgICAgICAgZnRzY3JlZW4oU0NSX1NULFNUX1NLSVAscmMsZnVsbG5hbWUpOworICAgIH0gZWxzZSBpZiAocmMgPCAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBwdXQgZXJyb3IiLGxvY2FsLGZ0cGNvZGUpOworICAgICAgICBmdHNjcmVlbihTQ1JfU1QsU1RfTVNHLDBMLCZmdHBfcmVwbHlfc3RyWzRdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgcHV0IG5vdCBjYW5jZWxlZCIsY2tpdG9hKGRpc3BsYSksZmRpc3BsYSk7CisgICAgICAgIGZ0c2NyZWVuKFNDUl9QVCwnWicsMEwsIiIpOworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgcHV0IFNUX09LIixsb2NhbCxyYyk7CisgICAgICAgIGZ0c2NyZWVuKFNDUl9TVCxTVF9PSywwTCwiIik7CisgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBwdXQgb2xkIHNmc3BlYyIsc2ZzcGVjLDApOworICAgICAgICBtYWtlc3RyKCZzZnNwZWMsZnVsbG5hbWUpOyAgICAgIC8qIEZvciBXSEVSRSBjb21tYW5kICovCisgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBwdXQgbmV3IHNmc3BlYyIsc2ZzcGVjLDApOworICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgcHV0IG9sZCBzcmZzcGVjIixzcmZzcGVjLDApOworICAgICAgICBtYWtlc3RyKCZzcmZzcGVjLGFzbmFtZSk7CisgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBwdXQgbmV3IHNyZnNwZWMiLHNyZnNwZWMsMCk7CisgICAgfQorCisgICAgLyogRmluYWwgbG9nIGVudHJpZXMgKi8KKworI2lmZGVmIFRMT0cKKyAgICBpZiAodHJhbG9nKSB7CisgICAgICAgIGlmIChyYyA+IDApIHsKKyAgICAgICAgICAgIGlmIChyYyA9PSBTS1BfWE5YKQorICAgICAgICAgICAgICB0bG9nKEYxMDAsIiAvc2ltdWxhdGU6IFdPVUxEIEJFIFNFTlQ6Iiwibm8gcmVtb3RlIGZpbGUiLDApOworICAgICAgICAgICAgZWxzZSBpZiAocmMgPT0gU0tQX1hVUCkKKyAgICAgICAgICAgICAgdGxvZyhGMTAwLCIgL3NpbXVsYXRlOiBXT1VMRCBCRSBTRU5UOiIsInJlbW90ZSBmaWxlIG9sZGVyIiwwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJjID09IFNLUF9TSU0pCisgICAgICAgICAgICAgIHRsb2coRjEwMCwiIC9zaW11bGF0ZTogV09VTEQgQkUgU0VOVCIsIiIsMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHRsb2coRjExMCwiIHNraXBwZWQ6Iixnc2tyZWFzb24ocmMpLDApOworICAgICAgICB9IGVsc2UgaWYgKHJjID09IDApIHsKKyAgICAgICAgICAgIHRsb2coRjEwMSwiIGNvbXBsZXRlLCBzaXplIiwgIiIsIGZzaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChjYW5jZWxmaWxlKSB7CisgICAgICAgICAgICB0bG9nKEYxMDAsIiBjYW5jZWxlZCBieSB1c2VyIiwiIiwwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRsb2coRjExMCwiIGZhaWxlZDoiLGZ0cF9yZXBseV9zdHIsMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0bG9nZm10KQorICAgICAgICAgIGRveGxvZyh3aGF0LGxvY2FsLGZzaXplLGZ0cF90eXAscmMsIiIpOworICAgIH0KKyNlbmRpZiAvKiBUTE9HICovCisKKyAgICBpZiAocmMgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQVVQgZGlkIG5vdCBzdWNjZWVkICovCisgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAgICAgICAgICAgLyogc28gZG9uZS4gKi8KKworICAgIGlmIChmbGcgJiBQVVRfU0lNKSAgICAgICAgICAgICAgICAgIC8qIFNpbXVsYXRpbmcsIHNraXAgdGhlIHJlc3QuICovCisgICAgICByZXR1cm4oU0tQX1NJTSk7CisKKyNpZmRlZiBVTklYCisgICAgLyogU2V0IHBlcm1pc3Npb25zIHRvbz8gKi8KKworICAgIGlmIChwcm0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoYW5nZSBwZXJtaXNzaW9ucz8gKi8KKyAgICAgICAgcyA9IHpncGVybShsb2NhbCk7ICAgICAgICAgICAgICAvKiBHZXQgcGVybXMgb2YgbG9jYWwgZmlsZSAqLworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgeCA9IHN0cmxlbihzKTsKKyAgICAgICAgaWYgKHggPiAzKSBzICs9ICh4IC0gMyk7CisgICAgICAgIGlmIChyZGlnaXRzKHMpKSB7CisgICAgICAgICAgICBja21ha21zZyhmdHBjbWRidWYsRlRQX0JVRlNJWixzLCIgIixhc25hbWUsTlVMTCk7CisgICAgICAgICAgICB4ID0KKyAgICAgICAgICAgICAgZnRwY21kKCJTSVRFIENITU9EIixmdHBjbWRidWYsZmNzLHJjcyxmdHBfdmJtKSA9PSBSRVBMWV9DT01QTEVURTsKKyAgICAgICAgICAgIHRsb2coRjExMCwgeCA/ICIgY2htb2QiIDogIiBjaG1vZCBmYWlsZWQiLAorICAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBpZiAoIXgpCisgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVU5JWCAqLworCisgICAgLyogRGlzcG9zaXRpb24gb2Ygc291cmNlIGZpbGUgKi8KKworICAgIGlmIChtb3ZpbmcpIHsKKyAgICAgICAgeCA9IHpkZWxldChsb2NhbCk7CisgICAgICAgIHRsb2coRjExMCwgKHggPiAtMSkgPworICAgICAgICAgICAgICIgZGVsZXRlZCIgOiAiIGZhaWxlZCB0byBkZWxldGUiLAorICAgICAgICAgICAgIGxvY2FsLAorICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICApOworICAgICAgICBpZiAoeCA8IDApCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9IGVsc2UgaWYgKG12dG8pIHsKKyAgICAgICAgeCA9IHpyZW5hbWUobG9jYWwsbXZ0byk7CisgICAgICAgIHRsb2coRjExMCwgKHggPiAtMSkgPworICAgICAgICAgICAgICIgbW92ZWQgc291cmNlIHRvIiA6ICIgZmFpbGVkIHRvIG1vdmUgc291cmNlIHRvIiwKKyAgICAgICAgICAgICBtdnRvLAorICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICApOworICAgICAgICBpZiAoeCA8IDApCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgLyogZnRzY3JlZW4oU0NSX1NULFNUX01TRywwTCxtdnRvKTsgKi8KKworICAgIH0gZWxzZSBpZiAocm50bykgeworICAgICAgICBjaGFyICogcyA9IHJudG87CisjaWZuZGVmIE5PU1BMCisgICAgICAgIGludCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFzcyBpdCB0aHJ1IHRoZSBldmFsdWF0b3IgKi8KKyAgICAgICAgZXh0ZXJuIGludCBjbWRfcXVvdGluZzsgICAgICAgICAvKiBmb3IgXHYoZmlsZW5hbWUpICovCisgICAgICAgIGlmIChjbWRfcXVvdGluZykgeyAgICAgICAgICAgICAgLyogQnV0IG9ubHkgaWYgY21kX3F1b3RpbmcgaXMgb24gKi8KKyAgICAgICAgICAgIHkgPSBDS01BWFBBVEg7CisgICAgICAgICAgICBzID0gKGNoYXIgKilhc25hbWU7CisgICAgICAgICAgICB6enN0cmluZyhybnRvLCZzLCZ5KTsKKyAgICAgICAgICAgIHMgPSAoY2hhciAqKWFzbmFtZTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgIGlmIChzKSBpZiAoKnMpIHsKKyAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgeCA9IHpyZW5hbWUobG9jYWwscyk7CisgICAgICAgICAgICB0bG9nKEYxMTAsICh4ID4gLTEpID8KKyAgICAgICAgICAgICAgICAgIiByZW5hbWVkIHNvdXJjZSBmaWxlIHRvIiA6CisgICAgICAgICAgICAgICAgICIgZmFpbGVkIHRvIHJlbmFtZSBzb3VyY2UgZmlsZSB0byIsCisgICAgICAgICAgICAgICAgIHMsCisgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIC8qIGZ0c2NyZWVuKFNDUl9TVCxTVF9NU0csMEwscyk7ICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBEaXNwb3NpdGlvbiBvZiBkZXN0aW5hdGlvbiBmaWxlICovCisKKyAgICBpZiAoc3J2cm4pIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiAvU0VSVkVSLVJFTkFNRTogKi8KKyAgICAgICAgY2hhciAqIHMgPSBzcnZybjsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgaW50IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYXNzIGl0IHRocnUgdGhlIGV2YWx1YXRvciAqLworICAgICAgICBleHRlcm4gaW50IGNtZF9xdW90aW5nOyAvKiBmb3IgXHYoZmlsZW5hbWUpICovCisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBwdXRmaWxlIHNydnJuIixzLDEpOworCisgICAgICAgIGlmIChjbWRfcXVvdGluZykgeyAgICAgICAgICAgICAgLyogQnV0IG9ubHkgaWYgY21kX3F1b3RpbmcgaXMgb24gKi8KKyAgICAgICAgICAgIHkgPSBDS01BWFBBVEg7CisgICAgICAgICAgICBzID0gKGNoYXIgKilmdWxsbmFtZTsgICAgICAgLyogV2UgY2FuIHJlY3ljbGUgdGhpcyBidWZmZXIgbm93ICovCisgICAgICAgICAgICB6enN0cmluZyhzcnZybiwmcywmeSk7CisgICAgICAgICAgICBzID0gKGNoYXIgKilmdWxsbmFtZTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBwdXRmaWxlIHNydnJuIixzLDIpOworICAgICAgICBpZiAocykgaWYgKCpzKSB7CisgICAgICAgICAgICBpbnQgeDsKKyAgICAgICAgICAgIHggPSBmdHBfcmVuYW1lKGFzbmFtZSxzKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBwdXRmaWxlIGZ0cF9yZW5hbWUiLGFzbmFtZSx4KTsKKyAgICAgICAgICAgIHRsb2coRjExMCwgKHggPiAwKSA/CisgICAgICAgICAgICAgICAgICIgcmVuYW1lZCBkZXN0aW5hdGlvbiBmaWxlIHRvIiA6CisgICAgICAgICAgICAgICAgICIgZmFpbGVkIHRvIHJlbmFtZSBkZXN0aW5hdGlvbiBmaWxlIHRvIiwKKyAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKHggPCAxKQorICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworLyogeHhvdXQgbXVzdCBvbmx5IGJlIHVzZWQgZm9yIEFTQ0lJIHRyYW5zZmVycyAqLworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCit4eG91dChjaGFyIGMpCisjZWxzZQoreHhvdXQoYykgY2hhciBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisjaWZuZGVmIE9TMgorI2lmbmRlZiBWTVMKKyNpZm5kZWYgTUFDCisjaWZuZGVmIE9TSworICAgIC8qIEZvciBVbml4LCBERywgU3RyYXR1cywgQW1pZ2EsIEdlbWRvcywgb3RoZXIgKi8KKyAgICBpZiAoYyA9PSAnXDAxMicpIHsKKwlpZiAoenpvdXQoZG91dCwoQ0hBUiknXDAxNScpIDwgMCkKKwkgIHJldHVybigtMSk7CisJZnRwc25kLmJ5dGVzKys7CisgICAgfQorI2Vsc2UgLyogT1NLICovCisgICAgaWYgKGMgPT0gJ1wwMTUnKSB7CisJYyA9ICdcMDEyJzsKKwlpZiAoenpvdXQoZG91dCwoQ0hBUiknXDAxNScpIDwgMCkKKwkgIHJldHVybigtMSk7CisJZnRwc25kLmJ5dGVzKys7CisgICAgfQorI2VuZGlmIC8qIE9TSyAqLworI2Vsc2UgLyogTUFDICovCisgICAgaWYgKGMgPT0gJ1wwMTUnKSB7CisJYyA9ICdcMDEyJzsKKwlpZiAoenpvdXQoZG91dCwoQ0hBUiknXDAxNScpIDwgMCkKKwkgIHJldHVybigtMSk7CisJZnRwc25kLmJ5dGVzKys7CisgICAgfQorI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIGlmICh6em91dChkb3V0LChDSEFSKWMpIDwgMCkKKyAgICAgIHJldHVybigtMSk7CisgICAgZnRwc25kLmJ5dGVzKys7CisgICAgcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK3Njcm5vdXQoY2hhciBjKQorI2Vsc2UKK3Njcm5vdXQoYykgY2hhciBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgcmV0dXJuKHB1dGNoYXIoYykpOworfQorCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK3BpcGVvdXQoY2hhciBjKQorI2Vsc2UKK3BpcGVvdXQoYykgY2hhciBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgcmV0dXJuKHptY2hvdXQoYykpOworfQorCitzdGF0aWMgaW50Citpc3BhdGhzZXAoYykgaW50IGM7IHsKKyAgICBzd2l0Y2ggKHNlcnZlcnR5cGUpIHsKKyAgICAgIGNhc2UgU1lTX1ZNUzoKKyAgICAgIGNhc2UgU1lTX1RPUFMxMDoKKyAgICAgIGNhc2UgU1lTX1RPUFMyMDoKKyAgICAgICAgcmV0dXJuKCgoYyA9PSAnXScpIHx8IChjID09ICc+JykgfHwgKGMgPT0gJzonKSkgPyAxIDogMCk7CisgICAgICBjYXNlIFNZU19PUzI6CisgICAgICBjYXNlIFNZU19XSU4zMjoKKyAgICAgIGNhc2UgU1lTX0RPUzoKKyAgICAgICAgcmV0dXJuKCgoYyA9PSAnXFwnKSB8fCAoYyA9PSAnLycpIHx8IChjID09ICc6JykpID8gMSA6IDApOworICAgICAgY2FzZSBTWVNfVk9TOgorICAgICAgICByZXR1cm4oKGMgPT0gJz4nKSA/IDEgOiAwKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybigoYyA9PSAnLycpID8gMSA6IDApOworICAgIH0KK30KKworc3RhdGljIGludAoraXNjYW5jZWxlZCgpIHsKKyNpZmRlZiBDS19DVVJTRVMKKyAgICBleHRlcm4gaW50IGNrX3JlcGFpbnQoKTsKKyNlbmRpZiAvKiBDS19DVVJTRVMgKi8KKyAgICBpbnQgeCwgcmMgPSAwOworICAgIGNoYXIgYyA9IDA7CisgICAgaWYgKGNhbmNlbGZpbGUpCisgICAgICByZXR1cm4oMSk7CisgICAgeCA9IGNvbmNoaygpOyAgICAgICAgICAgICAgICAgICAgICAgLyogQW55IGNoYXJzIHdhaXRpbmcgYXQgY29uc29sZT8gKi8KKyAgICBpZiAoeC0tID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAvKiBZZXMuLi4gICovCisgICAgICAgIGMgPSBjb25pbmMoNSk7ICAgICAgICAgICAgICAgICAgLyogR2V0IG9uZSAqLworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICBjYXNlIDAzMjogICAgICAgICAgICAgICAgICAgICAvKiBDdHJsLVggb3IgWCAqLworICAgICAgICAgIGNhc2UgJ3onOgorICAgICAgICAgIGNhc2UgJ1onOiBjYW5jZWxncm91cCsrOyAgICAgIC8qIGZhbGwgdGhydSBvbiBwdXJwb3NlICovCisgICAgICAgICAgY2FzZSAwMzA6ICAgICAgICAgICAgICAgICAgICAgLyogQ3RybC1aIG9yIFogKi8KKyAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICBjYXNlICdYJzogY2FuY2VsZmlsZSsrOyByYysrOyBicmVhazsKKyNpZmRlZiBDS19DVVJTRVMKKyAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICBjYXNlIDAxNDogICAgICAgICAgICAgICAgICAgICAvKiBDdHJsLUwgb3IgTCBvciBDdHJsLVcgKi8KKyAgICAgICAgICBjYXNlIDAyNzoKKyAgICAgICAgICAgIGNrX3JlcGFpbnQoKTsgICAgICAgICAgICAgICAvKiBSZWZyZXNoIHNjcmVlbiAqLworI2VuZGlmIC8qIENLX0NVUlNFUyAqLworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlICh4LS0gPiAwKSAgICAgICAgICAgICAgICAgICAgIC8qIFNvYWsgdXAgYW55IHJlc3QgKi8KKyAgICAgIGMgPSBjb25pbmMoMSk7CisgICAgcmV0dXJuKHJjKTsKK30KKworLyogenpzZW5kIC0gdXNlZCBieSBidWZmZXJlZCBvdXRwdXQgbWFjcm9zLiAqLworCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK3p6c2VuZChpbnQgZmQsIENIQVIgYykKKyNlbHNlCit6enNlbmQoZmQsYykgaW50IGZkOyBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpbnQgcmM7CisKKyAgICBkZWJ1ZyhGMTAxLCJ6enNlbmQgdWNidWZzaXoiLCIiLHVjYnVmc2l6KTsKKyAgICBkZWJ1ZyhGMTAxLCJ6enNlbmQgbm91dCIsIiIsbm91dCk7CisgICAgZGVidWcoRjExMSwienpzZW5kIiwic2VjdXJlPyIsZnRwaXNzZWN1cmUoKSk7CisKKyAgICBpZiAoaXNjYW5jZWxlZCgpKSAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgY2FuY2VsbGF0aW9uICovCisgICAgICByZXR1cm4oLTkpOworICAgIHJjID0gKCFmdHBpc3NlY3VyZSgpKSA/CisgICAgICBzZW5kKGZkLCAoU0VOREFSRzJUWVBFKXVjYnVmLCBub3V0LCAwKSA6CisgICAgICAgIHNlY3VyZV9wdXRidWYoZmQsIHVjYnVmLCBub3V0KTsKKyAgICB1Y2J1Zltub3V0XSA9IE5VTDsKKyAgICBub3V0ID0gMDsKKyAgICB1Y2J1Zltub3V0KytdID0gYzsKKyAgICBzcGFja2V0cysrOworICAgIHBrdG51bSsrOworICAgIGlmIChyYyA+IC0xICYmIGZkaXNwbGEgIT0gWFlGRF9CKSB7CisgICAgICAgIHNwa3RsID0gbm91dDsKKyAgICAgICAgZnRzY3JlZW4oU0NSX1BULCdEJyxzcGFja2V0cyxOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuKHJjKTsKK30KKworLyogYyBtIGQgbCBpIG4gcCB1IHQgIC0tICBDb21tYW5kLWxpbmUgUFVUICovCisKK2ludAorY21kbGlucHV0KHN0YXkpIGludCBzdGF5OyB7CisgICAgaW50IHgsIHJjID0gMCwgZG9uZSA9IDAsIGdvb2QgPSAwLCBzdGF0dXMgPSAwOworICAgIFVMT05HIHQwLCB0MTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVzIGZvciBzdGF0cyAqLworI2lmZGVmIEdGVElNRVIKKyAgICBDS0ZMT0FUIHNlYzsKKyNlbHNlCisgICAgaW50IHNlYyA9IDA7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisgICAgaWYgKHF1aWV0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogLXEgcmVhbGx5IG1lYW5zIHF1aWV0ICovCisgICAgICAgIGRpc3BsYSA9IDA7CisgICAgICAgIGZkaXNwbGEgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpc3BsYSA9IDE7CisgICAgICAgIGZkaXNwbGEgPSBYWUZEX0I7CisgICAgfQorICAgIHRlc3RpbmcgPSAwOworICAgIG91dDJzY3JlZW4gPSAwOworICAgIGRweWFjdGl2ZSA9IDA7CisgICAgd2hhdCA9IFdfRlRQfFdfU0VORDsKKworI2lmbmRlZiBOT1NQTAorICAgIGNtZF9xdW90aW5nID0gMDsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHNuZHNyYyA9IG5maWxzOworCisgICAgdDAgPSBnbXN0aW1lcigpOyAgICAgICAgICAgICAgICAgICAgLyogUmVjb3JkIHN0YXJ0aW5nIHRpbWUgKi8KKworICAgIHdoaWxlICghZG9uZSAmJiAhY2FuY2VsZ3JvdXApIHsgICAgIC8qIExvb3AgZm9yIGFsbCBmaWxlcyAqLworCisgICAgICAgIGNhbmNlbGZpbGUgPSAwOworICAgICAgICB4ID0gZ25maWxlKCk7ICAgICAgICAgICAgICAgICAgIC8qIEdldCBuZXh0IGZpbGUgZnJvbSBsaXN0KHMpICovCisgICAgICAgIGlmICh4ID09IDApICAgICAgICAgICAgICAgICAgICAgLyogKHNlZSBnbmZpbGUoKSBjb21tZW50cy4uLikgKi8KKyAgICAgICAgICB4ID0gZ25mZXJyb3I7CisKKyAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSB0byBzZW5kICovCisgICAgICAgICAgICByYyA9IHB1dGZpbGUoRlRQX1BVVCwgICAgICAgLyogRnVuY3Rpb24gKFBVVCwgQVBQRU5EKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIGZpbG5hbSwgICAgICAgIC8qIExvY2FsIGZpbGUgdG8gc2VuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIGZpbG5hbSwgICAgICAgIC8qIFJlbW90ZSBuYW1lIGZvciBmaWxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2V0eXBlLCAgICAgLyogVGV4dC9iaW5hcnkgbW9kZSBmb3JjZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAvKiBOb3QgbW92aW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgLyogTm8gbW92ZS10byAqLworICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgIC8qIE5vIHJlbmFtZS10byAqLworICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgIC8qIE5vIHNlcnZlci1yZW5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfY252LCAgICAgICAvKiBGaWxlbmFtZSBjb252ZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgLyogVW5pcXVlLXNlcnZlci1uYW1lcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgIC8qIEFsbCBmaWxlIHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgLyogTm8gcGVybWlzc2lvbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAvKiBObyBjaGFyYWN0ZXIgc2V0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgIC8qIE5vIGNoYXJhY3RlciBzZXRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgLyogTm8gdXBkYXRlIG9yIHJlc3RhcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKHJjID4gLTEpIHsKKyAgICAgICAgICAgICAgICBnb29kKys7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYW5jZWxmaWxlKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgLyogT3IgYnJlYWs/ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgZnRwX2ZhaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgIC8qIE9yIGJyZWFrPyAqLworCisgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gbW9yZSBmaWxlcywgZG9uZSAqLworICAgICAgICAgICAgZG9uZSsrOworICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBjYXNlIC0yOgorICAgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICBwcmludGYoIj8lczogZmlsZSBub3QgZm91bmQgLSBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgcHV0ZXJyb3IgPyAiRmF0YWwiIDogIldhcm5pbmciLAorICAgICAgICAgICAgICAgICAgIGZpbG5hbQorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgLyogb3IgYnJlYWs/ICovCisgICAgICAgICAgY2FzZSAtMzoKKyAgICAgICAgICAgIHByaW50ZigiP1dhcm5pbmcgYWNjZXNzIGRlbmllZCAtIFwiJXNcIlxuIiwgZmlsbmFtKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAvKiBvciBicmVhaz8gKi8KKyAgICAgICAgICBjYXNlIC01OgorICAgICAgICAgICAgcHJpbnRmKCI/VG9vIG1hbnkgZmlsZXMgbWF0Y2hcbiIpOworICAgICAgICAgICAgZG9uZSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAtNjoKKyAgICAgICAgICAgIGlmIChnb29kIDwgMSkKKyAgICAgICAgICAgICAgcHJpbnRmKCI/Tm8gZmlsZXMgc2VsZWN0ZWRcbiIpOworICAgICAgICAgICAgZG9uZSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZigiP2dldG5leHRmaWxlKCkgLSB1bmtub3duIGZhaWx1cmVcbiIpOworICAgICAgICAgICAgZG9uZSsrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0dXMgPiAwKSB7CisgICAgICAgIGlmIChjYW5jZWxncm91cCkKKyAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICBlbHNlIGlmIChjYW5jZWxmaWxlICYmIGdvb2QgPCAxKQorICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgfQorICAgIHN1Y2Nlc3MgPSBzdGF0dXM7CisgICAgeCA9IHN1Y2Nlc3M7CisgICAgaWYgKHggPiAtMSkgeworICAgICAgICBsYXN0eGZlciA9IFdfRlRQfFdfU0VORDsKKyAgICAgICAgeGZlcnN0YXQgPSBzdWNjZXNzOworICAgIH0KKyAgICB0MSA9IGdtc3RpbWVyKCk7ICAgICAgICAgICAgICAgICAgICAvKiBFbmQgdGltZSAqLworI2lmZGVmIEdGVElNRVIKKyAgICBzZWMgPSAoQ0tGTE9BVCkoKENLRkxPQVQpKHQxIC0gdDApIC8gMTAwMC4wKTsgLyogU3RhdHMgKi8KKyAgICBpZiAoIXNlYykgc2VjID0gMC4wMDE7CisgICAgZnB0c2VjcyA9IHNlYzsKKyNlbHNlCisgICAgc2VjID0gKHQxIC0gdDApIC8gMTAwMDsKKyAgICBpZiAoIXNlYykgc2VjID0gMTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgdGZjcHMgPSAobG9uZykgKHRmYyAvIHNlYyk7CisgICAgdHNlY3MgPSAoaW50KXNlYzsKKyAgICBsYXN0eGZlciA9IFdfRlRQfFdfU0VORDsKKyAgICB4ZmVyc3RhdCA9IHN1Y2Nlc3M7CisgICAgaWYgKGRweWFjdGl2ZSkKKyAgICAgIGZ0c2NyZWVuKFNDUl9UQywwLDBMLCIiKTsKKworICAgIGlmICghc3RheSkKKyAgICAgIGRvZXhpdChzdWNjZXNzID8gR09PRF9FWElUIDogQkFEX0VYSVQsIC0xKTsKKyAgICByZXR1cm4oc3VjY2Vzcyk7Cit9CisKKworLyogIGQgbyBmIHQgcCBwIHUgdCAgLS0gIFBhcnNlIGFuZCBleGVjdXRlIFBVVCwgTVBVVCwgYW5kIEFQUEVORCAgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2RvZnRwcHV0KGludCBjeCwgaW50IHdobykgICAgICAgICAgICAgICAvKiB3aG8gPT0gMSBmb3IgZnRwLCAwIGZvciBrZXJtaXQgKi8KKyNlbHNlCitkb2Z0cHB1dChjeCx3aG8pIGludCBjeCwgd2hvOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgc3RydWN0IEZEQiBzZiwgZmwsIHN3LCBjbTsKKyAgICBpbnQgbiwgcmMsIGNvbmZpcm1lZCA9IDAsIHdpbGQgPSAwLCBnZXR2YWwgPSAwLCBtcHV0ID0gMCwgZG9uZSA9IDA7CisgICAgaW50IHhfY252ID0gMCwgeF91c24gPSAwLCB4X3BybSA9IDAsIHB1dGZsYWdzID0gMCwgc3RhdHVzID0gMCwgZ29vZCA9IDA7CisgICAgY2hhciAqIHMsICogczI7CisKKyAgICBpbnQgeF9jc2wsIHhfY3NyID0gLTE7ICAgICAgICAgICAgICAvKiBMb2NhbCBhbmQgcmVtb3RlIGNoYXJzZXRzICovCisgICAgaW50IHhfeGxhID0gMDsKKyAgICBpbnQgeF9yZWN1cnNlID0gMDsKKyAgICBjaGFyIGMsICogcDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBXb3JrZXJzICovCisjaWZkZWYgUFVUQVJSQVkKKyAgICBpbnQgcmFuZ2VbMl07ICAgICAgICAgICAgICAgICAgICAgICAvKiBBcnJheSByYW5nZSAqLworICAgIGNoYXIgKiogYXAgPSBOVUxMOyAgICAgICAgICAgICAgICAgIC8qIEFycmF5IHBvaW50ZXIgKi8KKyAgICBpbnQgYXJyYXl4ID0gLTE7ICAgICAgICAgICAgICAgICAgICAvKiBBcnJheSBpbmRleCAqLworI2VuZGlmIC8qIFBVVEFSUkFZICovCisgICAgVUxPTkcgdDAgPSAwTCwgdDEgPSAwTDsgICAgICAgICAgICAgLyogVGltZXMgZm9yIHN0YXRzICovCisjaWZkZWYgR0ZUSU1FUgorICAgIENLRkxPQVQgc2VjOworI2Vsc2UKKyAgICBpbnQgc2VjID0gMDsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisKKyAgICBzdHJ1Y3Qgc3RyaW5naW50IHsgICAgICAgICAgICAgICAgICAvKiBUZW1wb3JhcnkgYXJyYXkgZm9yIHN3aXRjaCB2YWx1ZXMgKi8KKyAgICAgICAgY2hhciAqIHN2YWw7CisgICAgICAgIGludCBpdmFsOworICAgIH0gcHZbU05EX01BWCsxXTsKKworICAgIHN1Y2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzc3VtZSBmYWlsdXJlICovCisgICAgZm9yY2V0eXBlID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogTm8gL1RFWFQgb3IgL0JJTkFSWSBnaXZlbiB5ZXQgKi8KKyAgICBvdXQyc2NyZWVuID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBOb3Qgb3V0cHV0dGluZyBmaWxlIHRvIHNjcmVlbiAqLworICAgIHB1dGZsYWdzID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBVVCBvcHRpb25zICovCisgICAgeF9jbnYgPSBmdHBfY252OyAgICAgICAgICAgICAgICAgICAgLyogRmlsZW5hbWUgY29udmVyc2lvbiAqLworICAgIHhfdXNuID0gZnRwX3VzbjsgICAgICAgICAgICAgICAgICAgIC8qIFVuaXF1ZSBzZXJ2ZXIgbmFtZXMgKi8KKyAgICB4X3BybSA9IGZ0cF9wcm07ICAgICAgICAgICAgICAgICAgICAvKiBQZXJtaXNzaW9ucyAqLworICAgIGlmICh4X3BybSA9PSBTRVRfQVVUTykgICAgICAgICAgICAgIC8qIFBlcm1pc3Npb25zIEFVVE8gKi8KKyAgICAgIHhfcHJtID0gYWxpa2U7CisKKyNpZm5kZWYgTk9DU0VUUworICAgIHhfY3NyID0gZnRwX2NzcjsgICAgICAgICAgICAgICAgICAgIC8qIEluaGVyaXQgZ2xvYmFsIHNlcnZlciBjaGFyc2V0ICovCisgICAgeF9jc2wgPSBmdHBfY3NsOworICAgIGlmICh4X2NzbCA8IDApCisgICAgICB4X2NzbCA9IGZjaGFyc2V0OworICAgIHhfeGxhID0gZnRwX3hsYTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyAgICBtYWtlc3RyKCZmaWxlZmlsZSxOVUxMKTsgICAgICAgICAgICAvKiBObyBmaWxlbmFtZSBsaXN0IGZpbGUgeWV0LiAqLworICAgIG1ha2VzdHIoJnNydl9yZW5hbSxOVUxMKTsJCS8qIENsZWFyIC9TRVJWRVItUkVOQU1FOiAqLworICAgIG1ha2VzdHIoJnNuZF9yZW5hbWUsTlVMTCk7CQkvKiAgUFVUIC9SRU5BTUUgKi8KKyAgICBtYWtlc3RyKCZzbmRfbW92ZSxOVUxMKTsJCS8qICBQVVQgL01PVkUgKi8KKyAgICBwdXRwYXRoWzBdID0gTlVMOyAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGZvciBzeW5jZGlyKCkuICovCisgICAgcHV0ZXJyb3IgPSBmdHBfZXJyOyAgICAgICAgICAgICAgICAgLyogSW5oZXJpdCBnbG9iYWwgZXJyb3IgYWN0aW9uLiAqLworICAgIHdoYXQgPSBXX1NFTkR8V19GVFA7ICAgICAgICAgICAgICAgIC8qIFdoYXQgd2UncmUgZG9pbmcgKHNlbmRpbmcgdy9GVFApICovCisgICAgYXNuYW1idWZbMF0gPSBOVUw7ICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgYXMtbmFtZSBidWZmZXIgKi8KKworICAgIGlmIChnX2Z0cF90eXAgPiAtMSkgeyAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgVFlQRSBpZiBzYXZlZCAqLworICAgICAgICBmdHBfdHlwID0gZ19mdHBfdHlwOworICAgICAgICAvKiBnX2Z0cF90eXAgPSAtMTsgKi8KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8PSBTTkRfTUFYOyBpKyspIHsgICAgLyogSW5pdGlhbGl6ZSBzd2l0Y2ggdmFsdWVzICovCisgICAgICAgIHB2W2ldLnN2YWwgPSBOVUxMOyAgICAgICAgICAgICAgLyogdG8gbnVsbCBwb2ludGVycyAqLworICAgICAgICBwdltpXS5pdmFsID0gLTE7ICAgICAgICAgICAgICAgIC8qIGFuZCAtMSBpbnQgdmFsdWVzICovCisgICAgfQorICAgIGlmICh3aG8gPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxlZCB3aXRoIHVucHJlZml4ZWQgY29tbWFuZCAqLworICAgICAgICBzd2l0Y2ggKGN4KSB7CisgICAgICAgICAgY2FzZSBYWFJTRU46ICBwdltTTkRfUkVTXS5pdmFsID0gMTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBYWENTRU46ICBwdltTTkRfQ01EXS5pdmFsID0gMTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBYWE1PVkU6ICBwdltTTkRfREVMXS5pdmFsID0gMTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBYWE1NT1ZFOiBwdltTTkRfREVMXS5pdmFsID0gMTsgLyogZmFsbCB0aHJ1ICovCisgICAgICAgICAgY2FzZSBYWE1TRTogICBtcHV0Kys7IGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGN4ID09IEZUUF9NUFUpCisgICAgICAgICAgbXB1dCsrOworICAgIH0KKyAgICBjbWZkYmkoJnN3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBGREIgLSBjb21tYW5kIHN3aXRjaGVzICovCisgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIkZpbGVuYW1lLCBvciBzd2l0Y2giLCAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgbnB1dHN3aSwgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKyAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICBwdXRzd2ksICAgICAgICAgICAgICAgICAgICAgIC8qIEtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgICAgJnNmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICk7CisgICAgY21mZGJpKCZmbCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogM3JkIEZEQiAtIGxvY2FsIGZpbGVzcGVjICovCisgICAgICAgICAgIF9DTUZMRCwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisgICAgICAgICAgIHh4c3RyaW5nLAorICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAmY20KKyAgICAgICAgICAgKTsKKyAgICBjbWZkYmkoJmNtLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0dGggRkRCIC0gQ29uZmlybWF0aW9uICovCisgICAgICAgICAgIF9DTUNGTSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgKTsKKworICBhZ2FpbjoKKyAgICBjbWZkYmkoJnNmLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAybmQgRkRCIC0gZmlsZSB0byBzZW5kICovCisgICAgICAgICAgIF9DTUlGSSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgLyogMCA9IHBhcnNlIGZpbGVzLCAxID0gcGFyc2UgZmlsZXMgb3IgZGlycywgMiA9IHNraXAgc3ltbGlua3MgKi8KKyAgICAgICAgICAgbm9saW5rcyB8IHhfcmVjdXJzZSwgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpcmZsZyAwIG1lYW5zICJub3QgZGlycyBvbmx5IiAqLworICAgICAgICAgICB4eHN0cmluZywKKyAgICAgICAgICAgTlVMTCwKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgIG1wdXQgPyAmY20gOiAmZmwKKyNlbHNlCisJICAgJmZsCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICApOworCisgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFyc2UgemVybyBvciBtb3JlIHN3aXRjaGVzICovCisgICAgICAgIHggPSBjbWZkYigmc3cpOyAgICAgICAgICAgICAgICAgLyogUGFyc2Ugc29tZXRoaW5nICovCisgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBwdXQgY21mZGIgQSIsIiIseCk7CisgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBwdXQgZmNvZGUgQSIsIiIsY21yZXN1bHQuZmNvZGUpOworICAgICAgICBpZiAoeCA8IDApICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgZ290byB4cHV0eDsgICAgICAgICAgICAgICAgICAgLyogb3IgcmVwYXJzZSBuZWVkZWQgKi8KKyAgICAgICAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkgICAvKiBCcmVhayBvdXQgb2YgbG9vcCBpZiBub3QgYSBzd2l0Y2ggKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgYyA9IGNtZ2JyaygpOyAgICAgICAgICAgICAgICAgICAvKiBHZXQgYnJlYWsgY2hhcmFjdGVyICovCisgICAgICAgIGdldHZhbCA9IChjID09ICc6JyB8fCBjID09ICc9Jyk7IC8qIHRvIHNlZSBob3cgdGhleSBlbmRlZCB0aGUgc3dpdGNoICovCisgICAgICAgIGlmIChnZXR2YWwgJiYgIShjbXJlc3VsdC5rZmxhZ3MgJiBDTV9BUkcpKSB7CisgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFyZ3VtZW50c1xuIik7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhwdXR4OworICAgICAgICB9CisgICAgICAgIGlmICghZ2V0dmFsICYmIChjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgIH0KKyAgICAgICAgbiA9IGNtcmVzdWx0Lm5yZXN1bHQ7ICAgICAgICAgICAvKiBOdW1lcmljIHJlc3VsdCA9IHN3aXRjaCB2YWx1ZSAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJmdHAgcHV0IHN3aXRjaCIsIiIsbik7CisKKyAgICAgICAgc3dpdGNoIChuKSB7ICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIHRoZSBzd2l0Y2ggKi8KKyAgICAgICAgICBjYXNlIFNORF9BRlQ6ICAgICAgICAgICAgICAgICAvKiBTZW5kIC9BRlRFUjpkYXRlLXRpbWUgKi8KKyAgICAgICAgICBjYXNlIFNORF9CRUY6ICAgICAgICAgICAgICAgICAvKiBTZW5kIC9CRUZPUkU6ZGF0ZS10aW1lICovCisgICAgICAgICAgY2FzZSBTTkRfTkFGOiAgICAgICAgICAgICAgICAgLyogU2VuZCAvTk9ULUFGVEVSOmRhdGUtdGltZSAqLworICAgICAgICAgIGNhc2UgU05EX05CRTogICAgICAgICAgICAgICAgIC8qIFNlbmQgL05PVC1CRUZPUkU6ZGF0ZS10aW1lICovCisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWRhdGUoIkZpbGUgZGF0ZS10aW1lIiwiIiwmcywwLHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/RGF0ZS10aW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIHhwdXR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHZbbl0uaXZhbCA9IDE7CisgICAgICAgICAgICBtYWtlc3RyKCYocHZbbl0uc3ZhbCkscyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU05EX0FTTjogICAgICAgICAgICAgICAgIC8qIC9BUy1OQU1FOiAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwiZnRwIHB1dCAvYXMtbmFtZSBnZXR2YWwiLCIiLGdldHZhbCk7CisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiTmFtZSB0byBzZW5kIHVuZGVyIiwiIiwmcyxOVUxMKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/bmFtZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byB4cHV0eDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ha2VzdHIoJihwdltuXS5zdmFsKSxicnN0cmlwKHMpKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBwdXQgL2FzLW5hbWUgMSIscHZbbl0uc3ZhbCwwKTsKKyAgICAgICAgICAgIGlmIChwdltuXS5zdmFsKSBwdltuXS5pdmFsID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgUFVUQVJSQVkKKyAgICAgICAgICBjYXNlIFNORF9BUlI6ICAgICAgICAgICAgICAgICAvKiAvQVJSQVkgKi8KKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGFwID0gTlVMTDsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKCJBcnJheSBuYW1lIChhIHNpbmdsZSBsZXR0ZXIgd2lsbCBkbykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICkpIDwgMCkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IC0zKQorCQkgIGJyZWFrOworCQllbHNlCisJCSAgcmV0dXJuKHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh4ID0gYXJyYXlib3VuZHMocywmKHJhbmdlWzBdKSwmKHJhbmdlWzFdKSkpIDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0JhZCBhcnJheTogJXNcbiIscyk7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKGFwID0gYV9wdHJbeF0pKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/Tm8gc3VjaCBhcnJheTogJXNcbiIscyk7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB2W25dLml2YWwgPSAxOworICAgICAgICAgICAgcHZbU05EX0NNRF0uaXZhbCA9IDA7ICAgICAgIC8qIFVuZG8gYW55IGNvbmZsaWN0aW5nIG9uZXMuLi4gKi8KKyAgICAgICAgICAgIHB2W1NORF9SRVNdLml2YWwgPSAwOworICAgICAgICAgICAgcHZbU05EX0ZJTF0uaXZhbCA9IDA7CisgICAgICAgICAgICBhcnJheXggPSB4OworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogUFVUQVJSQVkgKi8KKworICAgICAgICAgIGNhc2UgU05EX0JJTjogICAgICAgICAgICAgICAgIC8qIC9CSU5BUlkgKi8KKyAgICAgICAgICBjYXNlIFNORF9UWFQ6ICAgICAgICAgICAgICAgICAvKiAvVEVYVCBvciAvQVNDSUkgKi8KKyAgICAgICAgICBjYXNlIFNORF9URU46ICAgICAgICAgICAgICAgICAvKiAvVEVORVggKi8KKyAgICAgICAgICAgIHB2W1NORF9CSU5dLml2YWwgPSAwOworICAgICAgICAgICAgcHZbU05EX1RYVF0uaXZhbCA9IDA7CisgICAgICAgICAgICBwdltTTkRfVEVOXS5pdmFsID0gMDsKKyAgICAgICAgICAgIHB2W25dLml2YWwgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBQVVRQSVBFCisgICAgICAgICAgY2FzZSBTTkRfQ01EOiAgICAgICAgICAgICAgICAgLyogVGhlc2UgdGFrZSBubyBhcmdzICovCisgICAgICAgICAgICBpZiAobm9wdXNoKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/U29ycnksIHN5c3RlbSBjb21tYW5kIGFjY2VzcyBpcyBkaXNhYmxlZFxuIik7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICB9CisjaWZkZWYgUElQRVNFTkQKKyAgICAgICAgICAgIGVsc2UgaWYgKHNuZGZpbHRlcikgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBubyBQVVQgL0NPTU1BTkQgd2hlbiBTRU5EIEZJTFRFUiBzZWxlY3RlZFxuIik7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyAgICAgICAgICAgIHN3LmhscG1zZyA9ICJDb21tYW5kLCBvciBzd2l0Y2giOyAvKiBDaGFuZ2UgaGVscCBtZXNzYWdlICovCisgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsgICAgICAgICAgICAgLyogSnVzdCBzZXQgdGhlIGZsYWcgKi8KKyAgICAgICAgICAgIHB2W1NORF9BUlJdLml2YWwgPSAwOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogUFVUUElQRSAqLworCisjaWZkZWYgQ0tTWU1MSU5LCisgICAgICAgICAgY2FzZSBTTkRfTE5LOgorICAgICAgICAgICAgbm9saW5rcyA9IDA7CisgICAgICAgICAgICBnb3RvIGFnYWluOwkJCS8qIEJlY2F1c2UgQ01JRkkgcGFyYW1zIGNoYW5nZWQuLi4gKi8KKyAgICAgICAgICBjYXNlIFNORF9OTEs6CisgICAgICAgICAgICBub2xpbmtzID0gMjsKKyAgICAgICAgICAgIGdvdG8gYWdhaW47CisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisKKyNpZmRlZiBGVFBfUkVTVEFSVAorICAgICAgICAgIGNhc2UgU05EX1JFUzogICAgICAgICAgICAgICAgIC8qIC9SRUNPVkVSIChyZXNlbmQpICovCisgICAgICAgICAgICBwdltTTkRfQVJSXS5pdmFsID0gMDsgICAgICAgLyogZmFsbCB0aHJ1IG9uIHB1cnBvc2UuLi4gKi8KKyNlbmRpZiAvKiBGVFBfUkVTVEFSVCAqLworCisgICAgICAgICAgY2FzZSBTTkRfTk9COgorICAgICAgICAgIGNhc2UgU05EX0RFTDogICAgICAgICAgICAgICAgIC8qIC9ERUxFVEUgKi8KKyAgICAgICAgICBjYXNlIFNORF9TSEg6ICAgICAgICAgICAgICAgICAvKiAvUVVJRVQgKi8KKyAgICAgICAgICBjYXNlIFNORF9VUEQ6ICAgICAgICAgICAgICAgICAvKiAvVVBEQVRFICovCisgICAgICAgICAgY2FzZSBTTkRfU0lNOiAgICAgICAgICAgICAgICAgLyogL1VQREFURSAqLworICAgICAgICAgIGNhc2UgU05EX1VTTjogICAgICAgICAgICAgICAgIC8qIC9VTklRVUUgKi8KKyAgICAgICAgICAgIHB2W25dLml2YWwgPSAxOyAgICAgICAgICAgICAvKiBKdXN0IHNldCB0aGUgZmxhZyAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFNORF9SRUM6ICAgICAgICAgICAgICAgICAvKiAvUkVDVVJTSVZFICovCisgICAgICAgICAgICByZWN1cnNpdmUgPSAyOyAgICAgICAgICAgICAgLyogTXVzdCBiZSBzZXQgYmVmb3JlIGNtaWZpKCkgKi8KKyAgICAgICAgICAgIHhfcmVjdXJzZSA9IDE7CisgICAgICAgICAgICBnb3RvIGFnYWluOwkJCS8qIEJlY2F1c2UgQ01JRkkgcGFyYW1zIGNoYW5nZWQuLi4gKi8KKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgVU5JWE9ST1NLCisgICAgICAgICAgY2FzZSBTTkRfRE9UOiAgICAgICAgICAgICAgICAgLyogL0RPVEZJTEVTICovCisgICAgICAgICAgICBtYXRjaGRvdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFNORF9OT0Q6ICAgICAgICAgICAgICAgICAvKiAvTk9ET1RGSUxFUyAqLworICAgICAgICAgICAgbWF0Y2hkb3QgPSAwOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogVU5JWE9ST1NLICovCisKKyAgICAgICAgICBjYXNlIFNORF9FUlI6ICAgICAgICAgICAgICAgICAvKiAvRVJST1ItQUNUSU9OICovCisgICAgICAgICAgICBpZiAoKHggPSBjbWtleShxb3JwLDIsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICBwdltuXS5pdmFsID0geDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfRVhDOiAgICAgICAgICAgICAgICAgLyogRXhjbHVkZXMgKi8KKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKCJQYXR0ZXJuIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1BhdHRlcm4gcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocykgaWYgKCEqcykgcyA9IE5VTEw7CisgICAgICAgICAgICBtYWtlc3RyKCYocHZbbl0uc3ZhbCkscyk7CisgICAgICAgICAgICBpZiAocHZbbl0uc3ZhbCkKKyAgICAgICAgICAgICAgcHZbbl0uaXZhbCA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU05EX1BSTTogICAgICAgICAgICAgICAgIC8qIC9QRVJNSVNTSU9OUyAqLworICAgICAgICAgICAgaWYgKCFnZXR2YWwpCisgICAgICAgICAgICAgIHggPSAxOworICAgICAgICAgICAgZWxzZSBpZiAoKHggPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICBwdltTTkRfUFJNXS5pdmFsID0geDsKKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgUElQRVNFTkQKKyAgICAgICAgICBjYXNlIFNORF9GTFQ6ICAgICAgICAgICAgICAgICAvKiAvRklMVEVSICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJmdHAgcHV0IC9maWx0ZXIgZ2V0dmFsIiwiIixnZXR2YWwpOworICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgaWYgKCh4ID0gY21mbGQoIkZpbHRlciBwcm9ncmFtIHRvIHNlbmQgdGhyb3VnaCIsIiIsJnMsTlVMTCkpIDwgMCkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IC0zKQorICAgICAgICAgICAgICAgICAgcyA9ICIiOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnMpIHMgPSBicnN0cmlwKHMpOworICAgICAgICAgICAgeSA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB5OyB4KyspIHsgICAvKiBNYWtlIHN1cmUgdGhleSBpbmNsdWRlZCAiXHYoLi4uKSIgKi8KKyAgICAgICAgICAgICAgICBpZiAoc1t4XSAhPSAnXFwnKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoc1t4KzFdID09ICd2JykgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeCA9PSB5KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICI/RmlsdGVyIG11c3QgY29udGFpbiBhIHJlcGxhY2VtZW50IHZhcmlhYmxlIGZvciBmaWxlbmFtZS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgZ290byB4cHV0eDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzKSBpZiAoISpzKSBzID0gTlVMTDsKKyAgICAgICAgICAgIG1ha2VzdHIoJihwdltuXS5zdmFsKSxzKTsKKyAgICAgICAgICAgIGlmIChwdltuXS5zdmFsKQorICAgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyAgICAgICAgICBjYXNlIFNORF9OQU06ICAgICAgICAgICAgICAgICAvKiAvRklMRU5BTUVTICovCisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWtleShmbnRhYixuZm50YWIsIiIsImF1dG9tYXRpYyIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJmdHAgcHV0IC9maWxlbmFtZXMiLCIiLHgpOworICAgICAgICAgICAgcHZbbl0uaXZhbCA9IHg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU05EX1NNQTogICAgICAgICAgICAgICAgIC8qIFNtYWxsZXIgLyBsYXJnZXIgdGhhbiAqLworICAgICAgICAgIGNhc2UgU05EX0xBUjoKKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtbnVtKCJTaXplIGluIGJ5dGVzIiwiMCIsMTAsJnkseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICBwdltuXS5pdmFsID0geTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfRklMOiAgICAgICAgICAgICAgICAgLyogTmFtZSBvZiBmaWxlIGNvbnRhaW5pbmcgZmlsZW5hbWVzICovCisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWlmaSgiTmFtZSBvZiBmaWxlIGNvbnRhaW5pbmcgbGlzdCBvZiBmaWxlbmFtZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCZzLCZ5LHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/RmlsZW5hbWUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHkgJiYgaXN3aWxkKHMpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/V2lsZGNhcmRzIG5vdCBhbGxvd2VkXG4iKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgZ290byB4cHV0eDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzKSBpZiAoISpzKSBzID0gTlVMTDsKKyAgICAgICAgICAgIG1ha2VzdHIoJihwdltuXS5zdmFsKSxzKTsKKyAgICAgICAgICAgIGlmIChwdltuXS5zdmFsKSB7CisgICAgICAgICAgICAgICAgcHZbbl0uaXZhbCA9IDE7CisgICAgICAgICAgICAgICAgcHZbU05EX0FSUl0uaXZhbCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB2W25dLml2YWwgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXB1dCA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU05EX01PVjogICAgICAgICAgICAgICAgIC8qIE1PVkUgYWZ0ZXIgKi8KKyAgICAgICAgICBjYXNlIFNORF9SRU46ICAgICAgICAgICAgICAgICAvKiBSRU5BTUUgYWZ0ZXIgKi8KKyAgICAgICAgICBjYXNlIFNORF9TUk46IHsgICAgICAgICAgICAgICAvKiBTRVJWRVItUkVOQU1FIGFmdGVyICovCisgICAgICAgICAgICAgIGNoYXIgKiBtID0gIiI7CisgICAgICAgICAgICAgIHN3aXRjaCAobikgeworICAgICAgICAgICAgICAgIGNhc2UgU05EX01PVjoKKyAgICAgICAgICAgICAgICAgIG0gPSAiZGV2aWNlIGFuZC9vciBkaXJlY3RvcnkgZm9yIHNvdXJjZSBmaWxlIGFmdGVyIHNlbmRpbmciOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTTkRfUkVOOgorICAgICAgICAgICAgICAgICAgbSA9ICJuZXcgbmFtZSBmb3Igc291cmNlIGZpbGUgYWZ0ZXIgc2VuZGluZyI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNORF9TUk46CisgICAgICAgICAgICAgICAgICBtID0gIm5ldyBuYW1lIGZvciBkZXN0aW5hdGlvbiBmaWxlIGFmdGVyIHNlbmRpbmciOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgICBpZiAoKHggPSBjbWZsZChtLCAiIiwgJnMsIG4gPT0gU05EX01PViA/IHh4c3RyaW5nIDogTlVMTCkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzXG4iLCBuID09IFNORF9NT1YgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiP0Rlc3RpbmF0aW9uIHJlcXVpcmVkIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI/TmV3IG5hbWUgcmVxdWlyZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZ290byB4cHV0eDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAocykgaWYgKCEqcykgcyA9IE5VTEw7CisgICAgICAgICAgICAgIG1ha2VzdHIoJihwdltuXS5zdmFsKSxzID8gYnJzdHJpcChzKSA6IE5VTEwpOworICAgICAgICAgICAgICBwdltuXS5pdmFsID0gKHB2W25dLnN2YWwpID8gMSA6IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFNORF9TVEE6ICAgICAgICAgICAgICAgICAvKiBTdGFydGluZyBwb3NpdGlvbiAoPSBQU0VORCkgKi8KKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtbnVtKCIwLWJhc2VkIHBvc2l0aW9uIiwiMCIsMTAsJnkseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICBwdltuXS5pdmFsID0geTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfVFlQOiAgICAgICAgICAgICAgICAgLyogL1RZUEUgKi8KKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KHR4dGJpbiwzLCIiLCJhbGwiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICBnb3RvIHhwdXR4OworICAgICAgICAgICAgcHZbbl0uaXZhbCA9ICh4ID09IDIpID8gLTEgOiB4OworICAgICAgICAgICAgYnJlYWs7CisKKyNpZm5kZWYgTk9DU0VUUworICAgICAgICAgIGNhc2UgU05EX0NTTDogICAgICAgICAgICAgICAgIC8qIExvY2FsIGNoYXJhY3RlciBzZXQgKi8KKyAgICAgICAgICBjYXNlIFNORF9DU1I6ICAgICAgICAgICAgICAgICAvKiBSZW1vdGUgKHNlcnZlcikgY2hhcnNldCAqLworICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkoZmNzdGFiLG5maWxjLCIiLCIiLHh4c3RyaW5nKSkgPCAwKSB7CisJCXJldHVybigoeCA9PSAtMykgPyAtMiA6IHgpOworICAgICAgICAgICAgfQorCSAgICBpZiAobiA9PSBTTkRfQ1NMKQorICAgICAgICAgICAgICB4X2NzbCA9IHg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHhfY3NyID0geDsKKyAgICAgICAgICAgIHhfeGxhID0gMTsgICAgICAgICAgICAgICAgICAvKiBPdmVycmlkZXMgZ2xvYmFsIE9GRiBzZXR0aW5nICovCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU05EX1hQQTogICAgICAgICAgICAgICAgIC8qIFRyYW5zcGFyZW50ICovCisgICAgICAgICAgICB4X3hsYSA9IDA7CisgICAgICAgICAgICB4X2NzciA9IC0xOworICAgICAgICAgICAgeF9jc2wgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBQSVBFU0VORAorICAgIGlmIChwdltTTkRfUkVTXS5pdmFsID4gMCkgeyAvKiAvUkVDT1ZFUiAqLworICAgICAgICBpZiAoc25kZmlsdGVyIHx8IHB2W1NORF9GTFRdLml2YWwgPiAwKSB7CisgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgbm8gL1JFQ09WRVIgb3IgL1NUQVJUIGlmIFNFTkQgRklMVEVSIHNlbGVjdGVkXG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgIH0KKwlpZiAoc2Z0dGFiWzBdID4gMCAmJiBzZnR0YWJbU0ZUX1JFU1RdID09IDApCisJICBwcmludGYoIldBUk5JTkc6IFNlcnZlciBzYXlzIGl0IGRvZXNuJ3Qgc3VwcG9ydCBSRVNULlxuIik7CisgICAgfQorI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyAgICBjbWFyZyA9ICIiOworICAgIGNtYXJnMiA9IGFzbmFtYnVmOworICAgIGxpbmVbMF0gPSBOVUw7CisgICAgcyA9IGxpbmU7CisgICAgd2lsZCA9IDA7CisKKyAgICBzd2l0Y2ggKGNtcmVzdWx0LmZjb2RlKSB7ICAgICAgICAgICAvKiBIb3cgZGlkIHdlIGdldCBvdXQgb2Ygc3dpdGNoIGxvb3AgKi8KKyAgICAgIGNhc2UgX0NNSUZJOiAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBmaWxlbmFtZSAqLworICAgICAgICBpZiAocHZbU05EX0ZJTF0uaXZhbCA+IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiP1lvdSBtYXkgbm90IGdpdmUgYSBQVVQgZmlsZXNwZWMgYW5kIGEgL0xJU1RGSUxFXG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgIH0KKyAgICAgICAgY2tzdHJuY3B5KGxpbmUsY21yZXN1bHQuc3Jlc3VsdCxMSU5CVUZTSVopOyAvKiBOYW1lICovCisgICAgICAgIGlmIChwdltTTkRfQVJSXS5pdmFsID4gMCkKKyAgICAgICAgICBja3N0cm5jcHkoYXNuYW1idWYsbGluZSxDS01BWFBBVEgpOworICAgICAgICBlbHNlCisgICAgICAgICAgd2lsZCA9IGNtcmVzdWx0Lm5yZXN1bHQ7ICAgICAgLyogV2lsZCBmbGFnICovCisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBwdXQgd2lsZCIsbGluZSx3aWxkKTsKKyAgICAgICAgaWYgKCF3aWxkICYmICFyZWN1cnNpdmUgJiYgIW1wdXQpCisgICAgICAgICAgbm9saW5rcyA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBfQ01GTEQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIEZpZWxkICovCisgICAgICAgIC8qIE9ubHkgYWxsb3dlZCB3aXRoIC9DT01NQU5EIGFuZCAvQVJSQVkgKi8KKyAgICAgICAgaWYgKHB2W1NORF9GSUxdLml2YWwgPiAwKSB7CisgICAgICAgICAgICBwcmludGYoIj9Zb3UgbWF5IG5vdCBnaXZlIGEgUFVUIGZpbGVzcGVjIGFuZCBhIC9MSVNURklMRVxuIik7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhwdXR4OworICAgICAgICB9CisJLyogRm9yIE1QVVQgaXQncyBPSyB0byBoYXZlIGZpbGVzcGVjcyB0aGF0IGRvbid0IG1hdGNoIGFueSBmaWxlcyAqLworCWlmIChtcHV0KQorCSAgYnJlYWs7CisgICAgICAgIGlmIChwdltTTkRfQ01EXS5pdmFsIDwgMSAmJiBwdltTTkRfQVJSXS5pdmFsIDwgMSkgeworI2lmZGVmIENLUk9PVAorICAgICAgICAgICAgaWYgKGNrcm9vdGVycikKKyAgICAgICAgICAgICAgcHJpbnRmKCI/T2ZmIGxpbWl0czogJXNcbiIsY21yZXN1bHQuc3Jlc3VsdCk7CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLyogQ0tST09UICovCisgICAgICAgICAgICAgIHByaW50ZigiPyVzIC0gXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgIGlzd2lsZChjbXJlc3VsdC5zcmVzdWx0KSA/CisgICAgICAgICAgICAgICAgICAgIk5vIGZpbGVzIG1hdGNoIiA6ICJGaWxlIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgY21yZXN1bHQuc3Jlc3VsdAorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhwdXR4OworICAgICAgICB9CisgICAgICAgIGNrc3RybmNweShsaW5lLGNtcmVzdWx0LnNyZXN1bHQsTElOQlVGU0laKTsKKyAgICAgICAgaWYgKHB2W1NORF9BUlJdLml2YWwgPiAwKQorICAgICAgICAgIGNrc3RybmNweShhc25hbWJ1ZixsaW5lLENLTUFYUEFUSCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBfQ01DRk06ICAgICAgICAgICAgICAgICAgICAgIC8qIENvbmZpcm1hdGlvbiAqLworICAgICAgICBjb25maXJtZWQgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ZigiP1VuZXhwZWN0ZWQgZnVuY3Rpb24gY29kZTogJWRcbiIsY21yZXN1bHQuZmNvZGUpOworICAgICAgICB4ID0gLTk7CisgICAgICAgIGdvdG8geHB1dHg7CisgICAgfQorICAgIGRlYnVnKEYxMTAsImZ0cCBwdXQgc3RyaW5nIixzLDApOworICAgIGRlYnVnKEYxMDEsImZ0cCBwdXQgY29uZmlybWVkIiwiIixjb25maXJtZWQpOworCisgICAgLyogU2F2ZSBhbmQgY2hhbmdlIHByb3RvY29sIGFuZCB0cmFuc2ZlciBtb2RlICovCisgICAgLyogR2xvYmFsIHZhbHVlcyBhcmUgcmVzdG9yZWQgaW4gbWFpbiBwYXJzZSBsb29wICovCisKKyAgICBnX2Rpc3BsYSA9IGZkaXNwbGE7CisgICAgaWYgKGZ0cF9kaXMgPiAtMSkKKyAgICAgIGZkaXNwbGEgPSBmdHBfZGlzOworICAgIGdfc2tpcGJ1cCA9IHNraXBidXA7CisKKyAgICBpZiAocHZbU05EX05PQl0uaXZhbCA+IC0xKSB7ICAgICAgICAvKiAvTk9CQUNLVVAgKHNraXAgYmFja3VwIGZpbGUpICovCisgICAgICAgIGdfc2tpcGJ1cCA9IHNraXBidXA7CisgICAgICAgIHNraXBidXAgPSAxOworICAgIH0KKyAgICBpZiAocHZbU05EX1RZUF0uaXZhbCA+IC0xKSB7ICAgICAgICAvKiAvVFlQRSAqLworICAgICAgICB4ZmlsZXR5cGUgPSBwdltTTkRfVFlQXS5pdmFsOworICAgICAgICBpZiAoeGZpbGV0eXBlID09IDIpCisgICAgICAgICAgeGZpbGV0eXBlID0gLTE7CisgICAgfQorICAgIGlmIChwdltTTkRfQklOXS5pdmFsID4gMCkgeyAgICAgICAgIC8qIC9CSU5BUlkgcmVhbGx5IG1lYW5zIGJpbmFyeS4uLiAqLworICAgICAgICBmb3JjZXR5cGUgPSAxOyAgICAgICAgICAgICAgICAgIC8qIFNvIHNraXAgZmlsZSBzY2FuICovCisgICAgICAgIGZ0cF90eXAgPSBGVFRfQklOOyAgICAgICAgICAgICAgLyogU2V0IGJpbmFyeSAqLworICAgIH0gZWxzZSBpZiAocHZbU05EX1RYVF0uaXZhbCA+IDApIHsgIC8qIFNpbWlsYXJseSBmb3IgL1RFWFQuLi4gKi8KKyAgICAgICAgZm9yY2V0eXBlID0gMTsKKyAgICAgICAgZnRwX3R5cCA9IEZUVF9BU0M7CisgICAgfSBlbHNlIGlmIChwdltTTkRfVEVOXS5pdmFsID4gMCkgeyAgLyogYW5kIC9URU5FWCovCisgICAgICAgIGZvcmNldHlwZSA9IDE7CisgICAgICAgIGZ0cF90eXAgPSBGVFRfVEVOOworICAgIH0gZWxzZSBpZiAoZnRwX2NtZGxpbiAmJiB4ZmVybW9kZSA9PSBYTU9ERV9NKSB7CisgICAgICAgIGZvcmNldHlwZSA9IDE7CisgICAgICAgIGZ0cF90eXAgPSBiaW5hcnk7CisgICAgICAgIGdfZnRwX3R5cCA9IGJpbmFyeTsKKyAgICB9CisKKyNpZmRlZiBQSVBFU0VORAorICAgIGlmIChwdltTTkRfQ01EXS5pdmFsID4gMCkgeyAgICAgICAgIC8qIC9DT01NQU5EIC0gc3RyaXAgYW55IGJyYWNlcyAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJQVVQgL0NPTU1BTkQgYmVmb3JlIHN0cmlwcGluZyIscywwKTsKKyAgICAgICAgcyA9IGJyc3RyaXAocyk7CisgICAgICAgIGRlYnVnKEYxMTAsIlBVVCAvQ09NTUFORCBhZnRlciBzdHJpcHBpbmciLHMsMCk7CisgICAgICAgIGlmICghKnMpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBhIGNvbW1hbmQgdG8gc2VuZCBmcm9tIGlzIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgIH0KKyAgICAgICAgY21hcmcgPSBzOworICAgIH0KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisvKiBTZXQgdXAgL01PVkUgYW5kIC9SRU5BTUUgKi8KKworICAgIGlmIChwdltTTkRfREVMXS5pdmFsID4gMCAmJgorICAgICAgICAocHZbU05EX01PVl0uaXZhbCA+IDAgfHwgcHZbU05EX1JFTl0uaXZhbCA+IDApKSB7CisgICAgICAgIHByaW50ZigiP1NvcnJ5LCAvREVMRVRFIGNvbmZsaWN0cyB3aXRoIC9NT1ZFIG9yIC9SRU5BTUVcbiIpOworICAgICAgICB4ID0gLTk7CisgICAgICAgIGdvdG8geHB1dHg7CisgICAgfQorI2lmZGVmIENLX1RNUERJUgorICAgIGlmIChwdltTTkRfTU9WXS5pdmFsID4gMCkgeworICAgICAgICBpbnQgbGVuOworICAgICAgICBjaGFyICogcCA9IHB2W1NORF9NT1ZdLnN2YWw7CisgICAgICAgIGxlbiA9IHN0cmxlbihwKTsKKyAgICAgICAgaWYgKCFpc2RpcihwKSkgeyAgICAgICAgICAgICAgICAvKiBDaGVjayBkaXJlY3RvcnkgKi8KKyNpZmRlZiBDS19NS0RJUgorICAgICAgICAgICAgY2hhciAqIHMgPSBOVUxMOworICAgICAgICAgICAgcyA9IChjaGFyICopbWFsbG9jKGxlbiArIDQpOworICAgICAgICAgICAgaWYgKHMpIHsKKyAgICAgICAgICAgICAgICBzdHJjcHkocyxwKTsgICAgICAgICAgICAvKiBzYWZlICovCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgICAgICAgICBpZiAoc1tsZW4tMV0gIT0gJzonKSB7IHNbbGVuKytdID0gJzonOyBzW2xlbl0gPSBOVUw7IH0KKyNlbHNlCisgICAgICAgICAgICAgICAgaWYgKHNbbGVuLTFdICE9ICcvJykgeyBzW2xlbisrXSA9ICcvJzsgc1tsZW5dID0gTlVMOyB9CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyAgICAgICAgICAgICAgICBzW2xlbisrXSA9ICdYJzsKKyAgICAgICAgICAgICAgICBzW2xlbl0gPSBOVUw7CisjaWZkZWYgTk9NS0RJUgorICAgICAgICAgICAgICAgIHggPSAtMTsKKyNlbHNlCisgICAgICAgICAgICAgICAgeCA9IHpta2RpcihzKTsKKyNlbmRpZiAvKiBOT01LRElSICovCisgICAgICAgICAgICAgICAgZnJlZShzKTsKKyAgICAgICAgICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/Q2FuJ3QgY3JlYXRlIFwiJXNcIlxuIixwKTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgICAgICBnb3RvIHhwdXR4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICBwcmludGYoIj9EaXJlY3RvcnkgXCIlc1wiIG5vdCBmb3VuZFxuIixwKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geHB1dHg7CisjZW5kaWYgLyogQ0tfTUtESVIgKi8KKyAgICAgICAgfQorICAgICAgICBtYWtlc3RyKCZzbmRfbW92ZSxwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfVE1QRElSICovCisKKyAgICBpZiAocHZbU05EX1JFTl0uaXZhbCA+IDApIHsgICAgICAgICAvKiAvUkVOQU1FICovCisgICAgICAgIGNoYXIgKiBwID0gcHZbU05EX1JFTl0uc3ZhbDsKKyAgICAgICAgaWYgKCFwKSBwID0gIiI7CisgICAgICAgIGlmICghKnApIHsKKyAgICAgICAgICAgIHByaW50ZigiP05ldyBuYW1lIHJlcXVpcmVkIGZvciAvUkVOQU1FXG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgIH0KKyAgICAgICAgcCA9IGJyc3RyaXAocCk7CisjaWZuZGVmIE5PU1BMCisgICAgLyogSWYgbmFtZSBnaXZlbiBpcyB3aWxkLCByZW5hbWUgc3RyaW5nIG11c3QgY29udGFpbiB2YXJpYWJsZXMgKi8KKyAgICAgICAgaWYgKHdpbGQpIHsKKyAgICAgICAgICAgIGNoYXIgKiBzID0gdG1wYnVmOworICAgICAgICAgICAgeCA9IFRNUEJVRlNJWjsKKyAgICAgICAgICAgIHp6c3RyaW5nKHAsJnMsJngpOworICAgICAgICAgICAgaWYgKCFzdHJjbXAodG1wYnVmLHApKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICI/L1JFTkFNRSBmb3IgZmlsZSBncm91cCBtdXN0IGNvbnRhaW4gdmFyaWFibGVzIHN1Y2ggYXMgXFx2KGZpbGVuYW1lKVxuIgorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICBnb3RvIHhwdXR4OworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgbWFrZXN0cigmc25kX3JlbmFtZSxwKTsKKyAgICAgICAgZGVidWcoRjExMCwiRlRQIHNuZF9yZW5hbWUiLHNuZF9yZW5hbWUsMCk7CisgICAgfQorICAgIGlmIChwdltTTkRfU1JOXS5pdmFsID4gMCkgeyAgICAgICAgIC8qIC9TRVJWRVItUkVOQU1FICovCisgICAgICAgIGNoYXIgKiBwID0gcHZbU05EX1NSTl0uc3ZhbDsKKyAgICAgICAgaWYgKCFwKSBwID0gIiI7CisgICAgICAgIGlmICghKnApIHsKKyAgICAgICAgICAgIHByaW50ZigiP05ldyBuYW1lIHJlcXVpcmVkIGZvciAvU0VSVkVSLVJFTkFNRVxuIik7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhwdXR4OworICAgICAgICB9CisgICAgICAgIHAgPSBicnN0cmlwKHApOworI2lmbmRlZiBOT1NQTAorICAgICAgICBpZiAod2lsZCkgeworICAgICAgICAgICAgY2hhciAqIHMgPSB0bXBidWY7CisgICAgICAgICAgICB4ID0gVE1QQlVGU0laOworICAgICAgICAgICAgenpzdHJpbmcocCwmcywmeCk7CisgICAgICAgICAgICBpZiAoIXN0cmNtcCh0bXBidWYscCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoCisiPy9TRVJWRVItUkVOQU1FIGZvciBmaWxlIGdyb3VwIG11c3QgY29udGFpbiB2YXJpYWJsZXMgc3VjaCBhcyBcXHYoZmlsZW5hbWUpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICBtYWtlc3RyKCZzcnZfcmVuYW0scCk7CisgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBwdXQgc3J2X3JlbmFtIixzcnZfcmVuYW0sMCk7CisgICAgfQorICAgIGlmICghY29uZmlybWVkKSB7ICAgICAgICAgICAgICAgICAgIC8qIENSIG5vdCB0eXBlZCB5ZXQsIGdldCBtb3JlIGZpZWxkcyAqLworICAgICAgICBjaGFyICogbHA7CisgICAgICAgIGlmIChtcHV0KSB7ICAgICAgICAgICAgICAgICAgICAgLyogTVBVVCBvciBNTU9WRSAqLworICAgICAgICAgICAgbmZpbHMgPSAwOyAgICAgICAgICAgICAgICAgIC8qIFdlIGFscmVhZHkgaGF2ZSB0aGUgZmlyc3Qgb25lICovCisjaWZuZGVmIE5PTVNFTkQKKwkgICAgaWYgKGNtcmVzdWx0LmZjb2RlID09IF9DTUlGSSkgeworCQkvKiBGaXJzdCBmaWxlc3BlYyBpcyB2YWxpZCAqLworCQltc2ZpbGVzW25maWxzKytdID0gbGluZTsgICAgLyogU3RvcmUgcG9pbnRlciAqLworCQlscCA9IGxpbmUgKyAoaW50KXN0cmxlbihsaW5lKSArIDE7IC8qIFBvaW50IHBhc3QgaXQgKi8KKwkJZGVidWcoRjExMSwiZnRwIHB1dCBtcHV0Iixtc2ZpbGVzW25maWxzLTFdLG5maWxzLTEpOworCSAgICB9IGVsc2UgeworCQkvKiBGaXJzdCBmaWxlc3BlYyBtYXRjaGVzIG5vIGZpbGVzICovCisJCWRlYnVnKEYxMTAsImZ0cCBwdXQgbXB1dCBza2lwcGluZyBmaXJzdCBmaWxlc3BlYyIsCisJCSAgICAgIGNtcmVzdWx0LnNyZXN1bHQsCisJCSAgICAgIDAKKwkJICAgICAgKTsKKwkJbHAgPSBsaW5lOworCSAgICB9CisJICAgIC8qIFBhcnNlIGEgZmlsZXNwZWMsIGEgImZpZWxkIiwgb3IgY29uZmlybWF0aW9uICovCisKKwkgICAgY21mZGJpKCZzZiwJCQkvKiAxc3QgRkRCIC0gZmlsZSB0byBzZW5kICovCisJCSAgIF9DTUlGSSwJCS8qIGZjb2RlICovCisJCSAgICIiLAkJCS8qIGhscG1zZyAqLworCQkgICAiIiwJCQkvKiBkZWZhdWx0ICovCisJCSAgICIiLAkJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJCSAgIG5vbGlua3MgfCB4X3JlY3Vyc2UsCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisJCSAgIDAsCQkJLyogZGlyZmxnIDAgbWVhbnMgIm5vdCBkaXJzIG9ubHkiICovCisJCSAgIHh4c3RyaW5nLAorCQkgICBOVUxMLAorCQkgICAmZmwKKwkJICAgKTsKKwkgICAgY21mZGJpKCZmbCwJCQkvKiAybmQgRkRCIC0gbG9jYWwgZmlsZXNwZWMgKi8KKwkJICAgX0NNRkxELAkJLyogZmNvZGUgKi8KKwkJICAgIiIsCQkJLyogaGxwbXNnICovCisJCSAgICIiLAkJCS8qIGRlZmF1bHQgKi8KKwkJICAgIiIsCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkJICAgMCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworCQkgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisJCSAgIHh4c3RyaW5nLAorCQkgICBOVUxMLAorCQkgICAmY20KKwkJICAgKTsKKwkgICAgY21mZGJpKCZjbSwJCQkvKiAzcmQgRkRCIC0gQ29uZmlybWF0aW9uICovCisJCSAgIF9DTUNGTSwJCS8qIGZjb2RlICovCisJCSAgICIiLAorCQkgICAiIiwKKwkJICAgIiIsCisJCSAgIDAsCisJCSAgIDAsCisJCSAgIE5VTEwsCisJCSAgIE5VTEwsCisJCSAgIE5VTEwKKwkJICAgKTsKKworICAgICAgICAgICAgd2hpbGUgKCFjb25maXJtZWQpIHsJLyogR2V0IG1vcmUgZmlsZW5hbWVzICovCisJCXggPSBjbWZkYigmc2YpOwkJLyogUGFyc2Ugc29tZXRoaW5nICovCisJCWRlYnVnKEYxMDEsImZ0cCBwdXQgY21mZGIgQiIsIiIseCk7CisJCWRlYnVnKEYxMDEsImZ0cCBwdXQgZmNvZGUgQiIsIiIsY21yZXN1bHQuZmNvZGUpOworCQlpZiAoeCA8IDApCQkvKiBFcnJvciAqLworCQkgIGdvdG8geHB1dHg7CQkvKiBvciByZXBhcnNlIG5lZWRlZCAqLworCQlzd2l0Y2ggKGNtcmVzdWx0LmZjb2RlKSB7CisJCSAgY2FzZSBfQ01DRk06CQkvKiBFbmQgb2YgY29tbWFuZCAqLworCQkgICAgY29uZmlybWVkKys7CisJCSAgICBpZiAobmZpbHMgPCAxKSB7CisJCQlkZWJ1ZyhGMTAwLCJmdHAgcHV0IG1wdXQgbm8gZmlsZXMgbWF0Y2giLCIiLDApOworCQkJcHJpbnRmKCI/Tm8gZmlsZXMgbWF0Y2ggTVBVVCBsaXN0XG4iKTsKKwkJCXggPSAtOTsKKwkJCWdvdG8geHB1dHg7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJICBjYXNlIF9DTUZMRDoJCS8qIE5vIG1hdGNoICovCisJCSAgICBkZWJ1ZyhGMTEwLCJmdHAgcHV0IG1wdXQgc2tpcHBpbmciLGNtcmVzdWx0LnNyZXN1bHQsMCk7CisJCSAgICBjb250aW51ZTsKKwkJICBjYXNlIF9DTUlGSToJCS8qIEdvb2QgbWF0Y2ggKi8KKwkJICAgIHMgPSBjbXJlc3VsdC5zcmVzdWx0OworCQkgICAgbXNmaWxlc1tuZmlscysrXSA9IGxwOyAvKiBHb3Qgb25lLCBjb3VudCwgcG9pbnQgdG8gaXQsICovCisJCSAgICBwID0gbHA7CQkgICAvKiByZW1lbWJlciBwb2ludGVyLCAqLworCQkgICAgd2hpbGUgKCgqbHArKyA9ICpzKyspKSAvKiBhbmQgY29weSBpdCBpbnRvIGJ1ZmZlciAqLworCQkgICAgICBpZiAobHAgPiAobGluZSArIExJTkJVRlNJWikpIHsgLyogQXZvaWQgbWVtb3J5IGxlYWsgKi8KKwkJCSAgcHJpbnRmKCI/TVBVVCBsaXN0IHRvbyBsb25nXG4iKTsKKwkJCSAgbGluZVswXSA9IE5VTDsKKwkJCSAgeCA9IC05OworCQkJICBnb3RvIHhwdXR4OworCQkgICAgICB9CisJCSAgICBkZWJ1ZyhGMTExLCJmdHAgcHV0IG1wdXQgYWRkaW5nIixtc2ZpbGVzW25maWxzLTFdLG5maWxzLTEpOworCQkgICAgaWYgKG5maWxzID09IDEpCS8qIFRha2UgY2FyZSBvZiBcdihmaWxlc3BlYykgKi8KKwkJICAgICAgZnNwZWNbMF0gPSBOVUw7CisjaWZkZWYgWkZOUUZQCisJCSAgICB6Zm5xZnAocCxUTVBCVUZTSVosdG1wYnVmKTsKKwkJICAgIHAgPSB0bXBidWY7CisjZW5kaWYgLyogWkZOUUZQICovCisJCSAgICBpZiAoKChpbnQpc3RybGVuKGZzcGVjKSArIChpbnQpc3RybGVuKHApICsgMSkgPCBmc3BlY2xlbikgeworCQkJc3RyY2F0KGZzcGVjLHApOyAgICAvKiBzYWZlICovCisJCQlzdHJjYXQoZnNwZWMsIiAiKTsgIC8qIHNhZmUgKi8KKwkJICAgIH0gZWxzZSB7CisjaWZkZWYgQ09NTUVOVAorCQkJcHJpbnRmKCJXQVJOSU5HIC0gXFx2KGZpbGVzcGVjKSBidWZmZXIgb3ZlcmZsb3dcbiIpOworI2Vsc2UKKwkJCWRlYnVnKEYxMDEsImRveHB1dCBmaWxlc3BlYyBidWZmZXIgb3ZlcmZsb3ciLCIiLDApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkJICAgIH0KKwkJfQorCSAgICB9CisjZW5kaWYgLyogTk9NU0VORCAqLworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ3VsYXIgUFVUICovCisgICAgICAgICAgICBuZmlscyA9IC0xOworICAgICAgICAgICAgaWYgKCh4ID0gY210eHQod2lsZCA/CisiXG5PcHRpb25hbCBhcy1uYW1lIHRlbXBsYXRlIGNvbnRhaW5pbmcgcmVwbGFjZW1lbnQgdmFyaWFibGVzIFwKK2xpa2UgXFx2KGZpbGVuYW1lKSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9wdGlvbmFsIG5hbWUgdG8gc2VuZCBpdCB3aXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCZwLE5VTEwpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisKKyAgICAgICAgICAgIGlmIChwKSBpZiAoISpwKSBwID0gTlVMTDsKKyAgICAgICAgICAgIHAgPSBicnN0cmlwKHApOworCisgICAgICAgICAgICBpZiAocCAmJiAqcCkgeworICAgICAgICAgICAgICAgIG1ha2VzdHIoJihwdltTTkRfQVNOXS5zdmFsKSxwKTsKKyAgICAgICAgICAgICAgICBpZiAocHZbU05EX0FTTl0uc3ZhbCkKKyAgICAgICAgICAgICAgICAgIHB2W1NORF9BU05dLml2YWwgPSAxOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBwdXQgL2FzLW5hbWUgMiIscHZbU05EX0FTTl0uc3ZhbCwwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBTZXQgY21hcmcyIGZyb20gYXMtbmFtZSwgaG93ZXZlciB3ZSBnb3QgaXQuICovCisKKyAgICBDSEVDS0NPTk4oKTsKKyAgICBpZiAocHZbU05EX0FTTl0uaXZhbCA+IDAgJiYgcHZbU05EX0FTTl0uc3ZhbCAmJiAhYXNuYW1idWZbMF0pIHsKKyAgICAgICAgY2hhciAqIHA7CisgICAgICAgIHAgPSBicnN0cmlwKHB2W1NORF9BU05dLnN2YWwpOworICAgICAgICBja3N0cm5jcHkoYXNuYW1idWYscCxDS01BWFBBVEgrMSk7CisgICAgfQorICAgIGRlYnVnKEYxMTAsImZ0cCBwdXQgYXNuYW1idWYiLGFzbmFtYnVmLDApOworCisgICAgaWYgKHB2W1NORF9GSUxdLml2YWwgPiAwKSB7CisgICAgICAgIGlmIChjb25maXJtZWQpIHsKKyAgICAgICAgICAgIGlmICh6b3BlbmkoWk1GSUxFLHB2W1NORF9GSUxdLnN2YWwpIDwgMSkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBwdXQgY2FuJ3Qgb3BlbiIscHZbU05EX0ZJTF0uc3ZhbCwwKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9GYWlsdXJlIHRvIG9wZW4gJXNcbiIscHZbU05EX0ZJTF0uc3ZhbCk7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYWtlc3RyKCZmaWxlZmlsZSxwdltTTkRfRklMXS5zdmFsKTsgLyogT3BlbiwgcmVtZW1iZXIgbmFtZSAqLworICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIFBVVCAvTElTVEZJTEUgb3BlbmVkIixmaWxlZmlsZSwwKTsKKyAgICAgICAgICAgIHdpbGQgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb25maXJtZWQgJiYgIWxpbmVbMF0gJiYgIWZpbGVmaWxlKSB7CisjaWZuZGVmIE5PTVNFTkQKKyAgICAgICAgaWYgKGZpbGVoZWFkKSB7ICAgICAgICAgICAgICAgICAvKiBPSyBpZiB3ZSBoYXZlIGEgU0VORC1MSVNUICovCisgICAgICAgICAgICBuZmlscyA9IGZpbGVzaW5saXN0OworICAgICAgICAgICAgc25kc3JjID0gbmZpbHM7ICAgICAgICAgICAgIC8qIExpa2UgTVNFTkQgKi8KKyAgICAgICAgICAgIGFkZGxpc3QgPSAxOyAgICAgICAgICAgICAgICAvKiBCdXQgdXNpbmcgYSBkaWZmZXJlbnQgbGlzdC4uLiAqLworICAgICAgICAgICAgZmlsZW5leHQgPSBmaWxlaGVhZDsKKyAgICAgICAgICAgIGdvdG8gZG9wdXQ7CisgICAgICAgIH0KKyNlbmRpZiAvKiBOT01TRU5EICovCisgICAgICAgIHByaW50ZigiP0ZpbGVuYW1lIHJlcXVpcmVkIGJ1dCBub3QgZ2l2ZW5cbiIpOworICAgICAgICB4ID0gLTk7CisgICAgICAgIGdvdG8geHB1dHg7CisgICAgfQorI2lmbmRlZiBOT01TRU5ECisgICAgYWRkbGlzdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgdXNlIFNFTkQtTElTVC4gKi8KKyNlbmRpZiAvKiBOT01TRU5EICovCisKKyAgICBpZiAobXB1dCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNUFVUIChyYXRoZXIgdGhhbiBQVVQpICovCisjaWZuZGVmIE5PTVNFTkQKKyAgICAgICAgY21saXN0ID0gbXNmaWxlczsgICAgICAgICAgICAgICAvKiBMaXN0IG9mIGZpbGVzcGVjcyAqLworICAgICAgICBzbmRzcmMgPSBuZmlsczsgICAgICAgICAgICAgICAgIC8qIHJhdGhlciBmaWxlc3BlYyBhbmQgYXMtbmFtZSAqLworI2VuZGlmIC8qIE5PTVNFTkQgKi8KKyAgICAgICAgcGlwZXNlbmQgPSAwOworICAgIH0gZWxzZSBpZiAoZmlsZWZpbGUpIHsgICAgICAgICAgICAgIC8qIEZpbGUgY29udGFpbnMgbGlzdCBvZiBmaWxlbmFtZXMgKi8KKyAgICAgICAgcyA9ICIiOworICAgICAgICBjbWFyZyA9ICIiOworICAgICAgICBsaW5lWzBdID0gTlVMOworICAgICAgICBuZmlscyA9IDE7CisgICAgICAgIHNuZHNyYyA9IDE7CisKKyAgICB9IGVsc2UgaWYgKHB2W1NORF9BUlJdLml2YWwgPCAxICYmIHB2W1NORF9DTURdLml2YWwgPCAxKSB7CisKKyAgICAgICAgLyogTm90IE1TRU5ELCBNTU9WRSwgL0xJU1QsIG9yIC9BUlJBWSAqLworICAgICAgICBuZmlscyA9IHNuZHNyYyA9IC0xOworICAgICAgICBpZiAoIXdpbGQpIHsKKyAgICAgICAgICAgIHkgPSB6Y2hraShzKTsKKyAgICAgICAgICAgIGlmICh5IDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1JlYWQgYWNjZXNzIGRlbmllZCAtIFwiJXNcIlxuIiwgcyk7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMgIT0gbGluZSkgICAgICAgICAgICAgICAgICAvKiBXZSBtaWdodCBhbHJlYWR5IGhhdmUgZG9uZSB0aGlzLiAqLworICAgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsgIC8qIENvcHkgb2Ygc3RyaW5nIGp1c3QgcGFyc2VkLiAqLworI2lmZGVmIERFQlVHCisgICAgICAgIGVsc2UKKyAgICAgICAgICBkZWJ1ZyhGMTEwLCJkb3hwdXQgbGluZT1zIixsaW5lLDApOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgIGNtYXJnID0gbGluZTsgICAgICAgICAgICAgICAgICAgLyogRmlsZSB0byBzZW5kICovCisgICAgfQorI2lmbmRlZiBOT01TRU5ECisgICAgemZucWZwKGNtYXJnLGZzcGVjbGVuLGZzcGVjKTsgICAgICAgLyogR2V0IGZ1bGwgbmFtZSAqLworI2VuZGlmIC8qIE5PTVNFTkQgKi8KKworICAgIGlmICghbXB1dCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBhbGwgYnV0IE1QVVQuLi4gKi8KKyNpZmRlZiBQSVBFU0VORAorICAgICAgICBpZiAocHZbU05EX0NNRF0uaXZhbCA+IDApICAgICAgIC8qIC9DT01NQU5EIHNldHMgcGlwZXNlbmQgZmxhZyAqLworICAgICAgICAgIHBpcGVzZW5kID0gMTsKKyAgICAgICAgZGVidWcoRjEwMSwiZnRwIHB1dCAvQ09NTUFORCBwaXBlc2VuZCIsIiIscGlwZXNlbmQpOworICAgICAgICBpZiAocGlwZXNlbmQgJiYgZmlsZWZpbGUpIHsKKyAgICAgICAgICAgIHByaW50ZigiP0ludmFsaWQgc3dpdGNoIGNvbWJpbmF0aW9uXG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgIH0KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisjaWZuZGVmIE5PU1BMCisgICAgLyogSWYgYXMtbmFtZSBnaXZlbiBhbmQgZmlsZXNwZWMgaXMgd2lsZCwgYXMtbmFtZSBtdXN0IGNvbnRhaW4gdmFyaWFibGVzICovCisgICAgICAgIGlmICgod2lsZCB8fCBtcHV0KSAmJiBhc25hbWJ1ZlswXSkgeworICAgICAgICAgICAgY2hhciAqIHMgPSB0bXBidWY7CisgICAgICAgICAgICB4ID0gVE1QQlVGU0laOworICAgICAgICAgICAgenpzdHJpbmcoYXNuYW1idWYsJnMsJngpOworICAgICAgICAgICAgaWYgKCFzdHJjbXAodG1wYnVmLGFzbmFtYnVmKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAiP0FzLW5hbWUgZm9yIGZpbGUgZ3JvdXAgbXVzdCBjb250YWluIHZhcmlhYmxlcyBzdWNoIGFzIFxcdihmaWxlbmFtZSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgZ290byB4cHV0eDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgfQorCisgIGRvcHV0OgorCisgICAgaWYgKHB2W1NORF9TSEhdLml2YWwgPiAwKSB7ICAgICAgICAgLyogU0VORCAvUVVJRVQuLi4gKi8KKyAgICAgICAgZmRpc3BsYSA9IDA7CisgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBwdXQgZGlzcGxheSIsIiIsZmRpc3BsYSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGlzcGxhID0gMTsKKyAgICAgICAgaWYgKGZ0cF9kZWIpCisJICBmZGlzcGxhID0gWFlGRF9COworICAgIH0KKworI2lmZGVmIFBVVEFSUkFZICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNFTkQgL0FSUkFZLi4uICovCisgICAgaWYgKHB2W1NORF9BUlJdLml2YWwgPiAwKSB7CisgICAgICAgIGlmICghYXApIHsgeCA9IC0yOyBnb3RvIHhwdXR4OyB9IC8qIChzaG91bGRuJ3QgaGFwcGVuKSAqLworICAgICAgICBpZiAocmFuZ2VbMF0gPT0gLTEpICAgICAgICAgICAgIC8qIElmIGxvdyBlbmQgb2YgcmFuZ2Ugbm90IHNwZWNpZmllZCAqLworICAgICAgICAgIHJhbmdlWzBdID0gMTsgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgdG8gMSAqLworICAgICAgICBpZiAocmFuZ2VbMV0gPT0gLTEpICAgICAgICAgICAgIC8qIElmIGhpZ2ggbm90IHNwZWNpZmllZCAqLworICAgICAgICAgIHJhbmdlWzFdID0gYV9kaW1bYXJyYXl4XTsgICAgIC8qIGRlZmF1bHQgdG8gc2l6ZSBvZiBhcnJheSAqLworICAgICAgICBpZiAoKHJhbmdlWzBdIDwgMCkgfHwgICAgICAgICAgIC8qIENoZWNrIHJhbmdlICovCisgICAgICAgICAgICAocmFuZ2VbMF0gPiBhX2RpbVthcnJheXhdKSB8fAorICAgICAgICAgICAgKHJhbmdlWzFdIDwgcmFuZ2VbMF0pIHx8CisgICAgICAgICAgICAocmFuZ2VbMV0gPiBhX2RpbVthcnJheXhdKSkgeworICAgICAgICAgICAgcHJpbnRmKCI/QmFkIGFycmF5IHJhbmdlIC0gWyVkOiVkXVxuIixyYW5nZVswXSxyYW5nZVsxXSk7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhwdXR4OworICAgICAgICB9CisgICAgICAgIHNuZGFycmF5ID0gYXA7ICAgICAgICAgICAgICAgICAgLyogQXJyYXkgcG9pbnRlciAqLworICAgICAgICBzbmR4aW4gPSBhcnJheXg7ICAgICAgICAgICAgICAgIC8qIEFycmF5IGluZGV4ICovCisgICAgICAgIHNuZHhsbyA9IHJhbmdlWzBdOyAgICAgICAgICAgICAgLyogQXJyYXkgcmFuZ2UgKi8KKyAgICAgICAgc25keGhpID0gcmFuZ2VbMV07CisgICAgICAgIHNuZHhuYW1bN10gPSAoY2hhcikoKHNuZHhpbiA9PSAxKSA/IDY0IDogc25keGluICsgQVJSQVlCQVNFKTsKKyAgICAgICAgaWYgKCFhc25hbWJ1ZlswXSkKKyAgICAgICAgICBja3N0cm5jcHkoYXNuYW1idWYsc25keG5hbSxDS01BWFBBVEgpOworICAgICAgICBjbWFyZyA9ICIiOworICAgIH0KKyNlbmRpZiAvKiBQVVRBUlJBWSAqLworCisgICAgbW92aW5nID0gMDsKKworICAgIGlmIChwdltTTkRfQVJSXS5pdmFsIDwgMSkgeyAgICAgICAgIC8qIEZpbGUgc2VsZWN0aW9uICYgZGlzcG9zaXRpb24uLi4gKi8KKyAgICAgICAgaWYgKHB2W1NORF9ERUxdLml2YWwgPiAwKSAgICAgICAvKiAvREVMRVRFIHdhcyBzcGVjaWZpZWQgKi8KKyAgICAgICAgICBtb3ZpbmcgPSAxOworICAgICAgICBpZiAocHZbU05EX0FGVF0uaXZhbCA+IDApICAgICAgIC8qIENvcHkgU0VORCBjcml0ZXJpYSAqLworICAgICAgICAgIGNrc3RybmNweShzbmRhZnRlcixwdltTTkRfQUZUXS5zdmFsLDE5KTsKKyAgICAgICAgaWYgKHB2W1NORF9CRUZdLml2YWwgPiAwKQorICAgICAgICAgIGNrc3RybmNweShzbmRiZWZvcmUscHZbU05EX0JFRl0uc3ZhbCwxOSk7CisgICAgICAgIGlmIChwdltTTkRfTkFGXS5pdmFsID4gMCkKKyAgICAgICAgICBja3N0cm5jcHkoc25kbmFmdGVyLHB2W1NORF9OQUZdLnN2YWwsMTkpOworICAgICAgICBpZiAocHZbU05EX05CRV0uaXZhbCA+IDApCisgICAgICAgICAgY2tzdHJuY3B5KHNuZG5iZWZvcmUscHZbU05EX05CRV0uc3ZhbCwxOSk7CisgICAgICAgIGlmIChwdltTTkRfRVhDXS5pdmFsID4gMCkKKyAgICAgICAgICBtYWtlbGlzdChwdltTTkRfRVhDXS5zdmFsLHNuZGV4Y2VwdCxOU05ERVhDRVBUKTsKKyAgICAgICAgaWYgKHB2W1NORF9TTUFdLml2YWwgPiAtMSkKKyAgICAgICAgICBzbmRzbWFsbGVyID0gcHZbU05EX1NNQV0uaXZhbDsKKyAgICAgICAgaWYgKHB2W1NORF9MQVJdLml2YWwgPiAtMSkKKyAgICAgICAgICBzbmRsYXJnZXIgPSBwdltTTkRfTEFSXS5pdmFsOworICAgICAgICBpZiAocHZbU05EX05BTV0uaXZhbCA+IC0xKQorICAgICAgICAgIHhfY252ID0gcHZbU05EX05BTV0uaXZhbDsKKyAgICAgICAgaWYgKHB2W1NORF9VU05dLml2YWwgPiAtMSkKKyAgICAgICAgICB4X3VzbiA9IHB2W1NORF9VU05dLml2YWw7CisgICAgICAgIGlmIChwdltTTkRfRVJSXS5pdmFsID4gLTEpCisgICAgICAgICAgcHV0ZXJyb3IgPSBwdltTTkRfRVJSXS5pdmFsOworCisjaWZkZWYgRE9VUERBVEUKKyAgICAgICAgaWYgKHB2W1NORF9VUERdLml2YWwgPiAwKSB7CisgICAgICAgICAgICBpZiAoeF91c24pIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9Db25mbGljdGluZyBzd2l0Y2hlczogL1VQREFURSAvVU5JUVVFXG4iKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgZ290byB4cHV0eDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1dGZsYWdzIHw9IFBVVF9VUEQ7CisJICAgIGZ0cF9kYXRlcyB8PSAyOworICAgICAgICB9CisjaWZkZWYgQ09NTUVOVAorCS8qIFRoaXMgd29ya3MgYnV0IGl0J3MgdXNlbGVzcywgbWF5YmUgZGFuZ2Vyb3VzICovCisgICAgICAgIGlmIChwdltTTkRfRElGXS5pdmFsID4gMCkgeworICAgICAgICAgICAgaWYgKHhfdXNuKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/Q29uZmxpY3Rpbmcgc3dpdGNoZXM6IC9EQVRFUy1ESUZGRVIgL1VOSVFVRVxuIik7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXRmbGFncyB8PSBQVVRfRElGOworCSAgICBmdHBfZGF0ZXMgfD0gMjsKKyAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBET1VQREFURSAqLworCisgICAgICAgIGlmIChwdltTTkRfU0lNXS5pdmFsID4gMCkKKyAgICAgICAgICBwdXRmbGFncyB8PSBQVVRfU0lNOworCisgICAgICAgIGlmIChwdltTTkRfUFJNXS5pdmFsID4gLTEpIHsKKyNpZmRlZiBVTklYCisgICAgICAgICAgICBpZiAoeF91c24pIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9Db25mbGljdGluZyBzd2l0Y2hlczogL1BFUk1JU1NJT05TIC9VTklRVUVcbiIpOworICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICBnb3RvIHhwdXR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgeF9wcm0gPSBwdltTTkRfUFJNXS5pdmFsOworI2Vsc2UgLyogVU5JWCAqLworICAgICAgICAgICAgcHJpbnRmKCI/L1BFUk1JU1NJT05TIHN3aXRjaCBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKyNlbmRpZiAvKiBVTklYICovCisgICAgICAgIH0KKyNpZmRlZiBGVFBfUkVTVEFSVAorICAgICAgICBpZiAocHZbU05EX1JFU10uaXZhbCA+IDApIHsKKwkgICAgaWYgKCFzaXplb2spIHsKKwkJcHJpbnRmKCI/UFVUIC9SRVNUQVJUIGNhbid0IGJlIHVzZWQgYmVjYXVzZSBTSVpFIGRpc2FibGVkLlxuIik7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisJICAgIH0KKyAgICAgICAgICAgIGlmICh4X3VzbiB8fCBwdXRmbGFncykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0NvbmZsaWN0aW5nIHN3aXRjaGVzOiAvUkVDT1ZFUiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeF91c24gJiYgcHV0ZmxhZ3MgPyAiL1VOSVFVRSAvVVBEQVRFIiA6CisgICAgICAgICAgICAgICAgICAgICAgICh4X3VzbiA/ICIvVU5JUVVFIiA6ICIvVVBEQVRFIikKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgZ290byB4cHV0eDsKKyAgICAgICAgICAgIH0KKyNpZm5kZWYgTk9DU0VUUworICAgICAgICAgICAgaWYgKHhfeGxhICYmCisgICAgICAgICAgICAgICAgKHhfY3NsID09IEZDX1VDUzIgfHwKKyAgICAgICAgICAgICAgICAgeF9jc2wgPT0gRkNfVVRGOCB8fAorICAgICAgICAgICAgICAgICB4X2NzciA9PSBGQ19VQ1MyIHx8CisgICAgICAgICAgICAgICAgIHhfY3NyID09IEZDX1VURjgpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/L1JFQ09WRVIgY2FuIG5vdCBiZSB1c2VkIHdpdGggVW5pY29kZSB0cmFuc2xhdGlvblxuIik7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geHB1dHg7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgICAgICAgICAgcHV0ZmxhZ3MgPSBQVVRfUkVTOworICAgICAgICB9CisjZW5kaWYgLyogRlRQX1JFU1RBUlQgKi8KKyAgICB9CisgICAgZGVidWcoRjEwMSwiZnRwIFBVVCByZXN0YXJ0IiwiIixwdXRmbGFncyAmIFBVVF9SRVMpOworICAgIGRlYnVnKEYxMDEsImZ0cCBQVVQgdXBkYXRlIiwiIixwdXRmbGFncyAmIFBVVF9VUEQpOworCisjaWZkZWYgUElQRVNFTkQKKyAgICBpZiAocHZbU05EX0ZMVF0uaXZhbCA+IDApIHsgICAgICAgICAvKiBIYXZlIFNFTkQgRklMVEVSPyAqLworICAgICAgICBpZiAoIXB2W1NORF9GTFRdLnN2YWwpIHsKKyAgICAgICAgICAgIHNuZGZpbHRlciA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbmRmaWx0ZXIgPSAoY2hhciAqKSBtYWxsb2MoKGludCkgc3RybGVuKHB2W1NORF9GTFRdLnN2YWwpICsgMSk7CisgICAgICAgICAgICBpZiAoc25kZmlsdGVyKSBzdHJjcHkoc25kZmlsdGVyLHB2W1NORF9GTFRdLnN2YWwpOyAvKiBzYWZlICovCisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjExMCwiZnRwIHB1dCAvRklMVEVSIiwgc25kZmlsdGVyLCAwKTsKKyAgICB9CisgICAgaWYgKHNuZGZpbHRlciB8fCBwaXBlc2VuZCkgICAgICAgICAgLyogTm8gL1VQREFURSBvciAvUkVTVEFSVCAqLworICAgICAgaWYgKHB1dGZsYWdzKSAgICAgICAgICAgICAgICAgICAgIC8qIHdpdGggcGlwZXMgb3IgZmlsdGVycyAqLworICAgICAgICBwdXRmbGFncyA9IDA7CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKworICAgIHRmYyA9IDBMOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgc3RhdHMgYW5kIGNvdW50ZXJzICovCisgICAgZmlsY250ID0gMDsKKyAgICBwa3RudW0gPSAwOworICAgIHNwYWNrZXRzID0gMEw7CisKKyAgICBpZiAod2lsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaXMgdGhpcyBuZWNlc3Nhcnk/KSAqLworICAgICAgY3ggPSBGVFBfTVBVOworCisgICAgdDAgPSBnbXN0aW1lcigpOyAgICAgICAgICAgICAgICAgICAgLyogUmVjb3JkIHN0YXJ0aW5nIHRpbWUgKi8KKworICAgIGRvbmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvb3AgY29udHJvbCAqLworICAgIGNhbmNlbGdyb3VwID0gMDsKKworICAgIGNkbGV2ZWwgPSAwOworICAgIGNkc2ltbHZsID0gMDsKKyAgICB3aGlsZSAoIWRvbmUgJiYgIWNhbmNlbGdyb3VwKSB7ICAgICAvKiBMb29wIGZvciBhbGwgZmlsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvciB1bnRpbCBjYW5jZWxlZC4gKi8KKyNpZmRlZiBGVFBfUFJPWFkKKyAgICAgICAgLyoKKyAgICAgICAgICAgSWYgd2UgYXJlIHVzaW5nIGEgcHJveHksIHdlIGRvbid0IHVzZSB0aGUgbG9jYWwgZmlsZSBsaXN0OworICAgICAgICAgICBpbnN0ZWFkIHdlIHVzZSB0aGUgbGlzdCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUgd2hpY2ggd2Ugd2FudAorICAgICAgICAgICBzZW50IHRvIHNvbWVvbmUgZWxzZSwgYW5kIHdlIHVzZSByZW1nbG9iKCkgdG8gZ2V0IHRoZSBuYW1lcy4KKyAgICAgICAgICAgQnV0IGluIHRoYXQgY2FzZSB3ZSBzaG91bGRuJ3QgZXZlbiBiZSBleGVjdXRpbmcgdGhpcyByb3V0aW5lOworICAgICAgICAgICBzZWUgZnRwX21wdXQoKS4KKyAgICAgICAgKi8KKyNlbmRpZiAvKiBGVFBfUFJPWFkgKi8KKworICAgICAgICBjYW5jZWxmaWxlID0gMDsKKyAgICAgICAgeCA9IGduZmlsZSgpOyAgICAgICAgICAgICAgICAgICAvKiBHZXQgbmV4dCBmaWxlIGZyb20gbGlzdChzKSAqLworCisgICAgICAgIGlmICh4ID09IDApICAgICAgICAgICAgICAgICAgICAgLyogKHNlZSBnbmZpbGUoKSBjb21tZW50cy4uLikgKi8KKyAgICAgICAgICB4ID0gZ25mZXJyb3I7CisgICAgICAgIGRlYnVnKEYxMTEsIkZUUCBQVVQgZ25maWxlIixmaWxuYW0seCk7CisKKyAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSB0byBzZW5kICovCisgICAgICAgICAgICBzMiA9IGFzbmFtYnVmOworI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgaWYgKGFzbmFtYnVmWzBdKSB7ICAgICAgICAgIC8qIEFzLW5hbWUgKi8KKyAgICAgICAgICAgICAgICBpbnQgbjsgY2hhciAqcDsgICAgICAgICAvKiB0byBiZSBldmFsdWF0ZWQuLi4gKi8KKyAgICAgICAgICAgICAgICBuID0gVE1QQlVGU0laOworICAgICAgICAgICAgICAgIHAgPSB0bXBidWY7CisgICAgICAgICAgICAgICAgenpzdHJpbmcoYXNuYW1idWYsJnAsJm4pOworICAgICAgICAgICAgICAgIHMyID0gdG1wYnVmOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBwdXQgYXNuYW1lIixzMiwwKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgICAgcmMgPSBwdXRmaWxlKGN4LCAgICAgICAgICAgIC8qIEZ1bmN0aW9uIChQVVQsIEFQUEVORCkgKi8KKyAgICAgICAgICAgICAgICAgICAgZmlsbmFtLCBzMiwgICAgICAgICAvKiBOYW1lIHRvIHNlbmQsIGFzLW5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yY2V0eXBlLCBtb3ZpbmcsICAvKiBQYXJhbWV0ZXJzIGZyb20gc3dpdGNoZXMuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgc25kX21vdmUsIHNuZF9yZW5hbWUsIHNydl9yZW5hbSwKKyAgICAgICAgICAgICAgICAgICAgeF9jbnYsIHhfdXNuLCB4ZmlsZXR5cGUsIHhfcHJtLAorI2lmbmRlZiBOT0NTRVRTCisgICAgICAgICAgICAgICAgICAgIHhfY3NsLCAoIXhfeGxhID8gLTEgOiB4X2NzciksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAtMSwgLTEsCisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgICAgICAgICAgICAgICAgICBwdXRmbGFncworICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIHB1dCBwdXRmaWxlIHJjIixmaWxuYW0scmMpOworICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIHB1dCBwdXRmaWxlIGNhbmNlbGZpbGUiLGZpbG5hbSxjYW5jZWxmaWxlKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBwdXQgcHV0ZmlsZSBjYW5jZWxncm91cCIsZmlsbmFtLGNhbmNlbGdyb3VwKTsKKyAgICAgICAgICAgIGlmIChyYyA+IC0xKSB7CisgICAgICAgICAgICAgICAgZ29vZCsrOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FuY2VsZmlsZSkKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgZnRwX2ZhaSsrOworICAgICAgICAgICAgICAgIGlmIChwdXRlcnJvcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9GYXRhbCB1cGxvYWQgZXJyb3I6ICVzXG4iLGZpbG5hbSk7CisgICAgICAgICAgICAgICAgICAgIGRvbmUrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtb3JlIGZpbGVzLCBkb25lICovCisgICAgICAgICAgICBkb25lKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgcHJpbnRmKCI/JXM6IGZpbGUgbm90IGZvdW5kIC0gXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgIHB1dGVycm9yID8gIkZhdGFsIiA6ICJXYXJuaW5nIiwKKyAgICAgICAgICAgICAgICAgICBmaWxuYW0KKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKHB1dGVycm9yKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICBkb25lKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlIC0yOgorICAgICAgICAgICAgaWYgKHB1dGVycm9yKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/RmF0YWw6IGZpbGUgbm90IGZvdW5kIC0gXCIlc1wiXG4iLCBmaWxuYW0pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgZG9uZSsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgIC8qIE5vdCByZWFkYWJsZSwga2VlcCBnb2luZyAqLworICAgICAgICAgIGNhc2UgLTM6CisgICAgICAgICAgICBpZiAocHV0ZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9GYXRhbDogUmVhZCBhY2Nlc3MgZGVuaWVkIC0gXCIlc1wiXG4iLCBmaWxuYW0pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgZG9uZSsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCI/V2FybmluZyBhY2Nlc3MgZGVuaWVkIC0gXCIlc1wiXG4iLCBmaWxuYW0pOworICAgICAgICAgICAgY29udGludWU7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgIGNhc2UgLTQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIENhbmNlbGVkICovCisgICAgICAgICAgICBkb25lKys7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgY2FzZSAtNToKKyAgICAgICAgICAgIHByaW50ZigiP1RvbyBtYW55IGZpbGVzIG1hdGNoXG4iKTsKKyAgICAgICAgICAgIGRvbmUrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgLTY6CisgICAgICAgICAgICBpZiAoZ29vZCA8IDEpCisgICAgICAgICAgICAgIHByaW50ZigiP05vIGZpbGVzIHNlbGVjdGVkXG4iKTsKKyAgICAgICAgICAgIGRvbmUrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoIj9nZXRuZXh0ZmlsZSgpIC0gdW5rbm93biBmYWlsdXJlXG4iKTsKKyAgICAgICAgICAgIGRvbmUrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY2RsZXZlbCA+IDApIHsKKyAgICAgICAgd2hpbGUgKGNkbGV2ZWwtLSkgeworICAgICAgICAgICAgaWYgKGNkc2ltbHZsKSB7CisgICAgICAgICAgICAgICAgY2RzaW1sdmwtLTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRvZnRwY2R1cCgpKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhdHVzID4gMCkgeworICAgICAgICBpZiAoY2FuY2VsZ3JvdXApCisgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgZWxzZSBpZiAoY2FuY2VsZmlsZSAmJiBnb29kIDwgMSkKKyAgICAgICAgICBzdGF0dXMgPSAwOworICAgIH0KKyAgICBzdWNjZXNzID0gc3RhdHVzOworICAgIHggPSBzdWNjZXNzOworCisgIHhwdXR4OgorICAgIGlmICh4ID4gLTEpIHsKKyNpZmRlZiBHRlRJTUVSCisgICAgICAgIHQxID0gZ21zdGltZXIoKTsgICAgICAgICAgICAgICAgLyogRW5kIHRpbWUgKi8KKyAgICAgICAgc2VjID0gKENLRkxPQVQpKChDS0ZMT0FUKSh0MSAtIHQwKSAvIDEwMDAuMCk7IC8qIFN0YXRzICovCisgICAgICAgIGlmICghc2VjKSBzZWMgPSAwLjAwMTsKKyAgICAgICAgZnB0c2VjcyA9IHNlYzsKKyNlbHNlCisgICAgICAgIHNlYyA9ICh0MSAtIHQwKSAvIDEwMDA7CisgICAgICAgIGlmICghc2VjKSBzZWMgPSAxOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyAgICAgICAgdGZjcHMgPSAobG9uZykgKHRmYyAvIHNlYyk7CisgICAgICAgIHRzZWNzID0gKGludClzZWM7CisgICAgICAgIGxhc3R4ZmVyID0gV19GVFB8V19TRU5EOworICAgICAgICB4ZmVyc3RhdCA9IHN1Y2Nlc3M7CisgICAgICAgIGlmIChkcHlhY3RpdmUpCisgICAgICAgICAgZnRzY3JlZW4oU0NSX1RDLDAsMEwsIiIpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDw9IFNORF9NQVg7IGkrKykgeyAgICAvKiBGcmVlIG1hbGxvYydkIG1lbW9yeSAqLworICAgICAgICBpZiAocHZbaV0uc3ZhbCkKKyAgICAgICAgICBmcmVlKHB2W2ldLnN2YWwpOworICAgIH0KKyAgICBmdHJlc2V0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVbmRvIHN3aXRjaCBlZmZlY3RzICovCisgICAgZHB5YWN0aXZlID0gMDsKKyAgICByZXR1cm4oeCk7Cit9CisKKworc3RhdGljIGNoYXIgKiogbWdldGxpc3QgPSBOVUxMOyAgICAgICAgIC8qIEZvciBNR0VUICovCitzdGF0aWMgaW50IG1nZXRuID0gMCwgbWdldHggPSAwOworc3RhdGljIGNoYXIgeHRtcGJ1Zls0MDk2XTsKKworLyoKKyAgYyBtIGQgbCBpIG4gZyBlIHQKKworICBHZXQgZmlsZXMgc3BlY2lmaWVkIGJ5IC1nIGNvbW1hbmQtbGluZSBvcHRpb24uCisgIEZpbGUgbGlzdCBpcyBzZXQgdXAgaW4gY21saXN0W10gYnkgY2t1dXN5LmM7IG5maWxzIGlzIGxlbmd0aCBvZiBsaXN0LgorKi8KK2ludAorY21kbGluZ2V0KHN0YXkpIGludCBzdGF5OyB7CisgICAgaW50IGksIHgsIHJjID0gMCwgZG9uZSA9IDAsIGdvb2QgPSAwLCBzdGF0dXMgPSAwLCBhcHBlbmQgPSAwOworICAgIGludCBsY3MgPSAtMSwgcmNzID0gLTEsIHhsYXRlID0gMDsKKyAgICBpbnQgZmlyc3QgPSAxOworICAgIGludCBtZ2V0ID0gMTsKKyAgICBpbnQgbmM7CisgICAgY2hhciAqIHMsICogczIsICogczM7CisgICAgVUxPTkcgdDAsIHQxOyAgICAgICAgICAgICAgICAgICAgICAgLyogVGltZXMgZm9yIHN0YXRzICovCisjaWZkZWYgR0ZUSU1FUgorICAgIENLRkxPQVQgc2VjOworI2Vsc2UKKyAgICBpbnQgc2VjID0gMDsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisKKyAgICBpZiAocXVpZXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiAtcSByZWFsbHkgbWVhbnMgcXVpZXQgKi8KKyAgICAgICAgZGlzcGxhID0gMDsKKyAgICAgICAgZmRpc3BsYSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGlzcGxhID0gMTsKKyAgICAgICAgZmRpc3BsYSA9IFhZRkRfQjsKKyAgICB9CisgICAgdGVzdGluZyA9IDA7CisgICAgZHB5YWN0aXZlID0gMDsKKyAgICBvdXQyc2NyZWVuID0gMDsKKyAgICB3aGF0ID0gV19GVFB8V19SRUNWOworICAgIG1nZXRtZXRob2QgPSAwOworICAgIG1nZXRmb3JjZWQgPSAwOworCisgICAgaGF2ZXR5cGUgPSAwOworICAgIGhhdmVzaXplID0gLTFMOworICAgIG1ha2VzdHIoJmhhdmVtZHRtLE5VTEwpOworCisgICAgaWYgKGZ0cF9mbmMgPCAwKQorICAgICAgZnRwX2ZuYyA9IGZuY2FjdDsKKworI2lmbmRlZiBOT1NQTAorICAgIGNtZF9xdW90aW5nID0gMDsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIGRlYnVnKEYxMDEsImZ0cCBjbWRsaW5nZXQgbmZpbHMiLCIiLG5maWxzKTsKKworICAgIGlmIChmdHBfY252ID09IENOVl9BVVRPKSB7ICAgICAgICAgIC8qIE5hbWUgY29udmVyc2lvbiBpcyBhdXRvICovCisgICAgICAgIGlmIChhbGlrZSkgeyAgICAgICAgICAgICAgICAgICAgLyogSWYgc2VydmVyICYgY2xpZW50IGFyZSBhbGlrZSAqLworICAgICAgICAgICAgbmMgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGNvbnZlcnNpb24gKi8KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQgKi8KKyAgICAgICAgICAgIGlmIChzZXJ2ZXJ0eXBlID09IFNZU19VTklYIHx8IHNlcnZlcnR5cGUgPT0gU1lTX1dJTjMyKQorICAgICAgICAgICAgICBuYyA9IC0xOyAgICAgICAgICAgICAgICAgIC8qIG9ubHkgbWluaW1hbCBjb252ZXJzaW9ucyBuZWVkZWQgKi8KKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2UgKi8KKyAgICAgICAgICAgICAgbmMgPSAxOyAgICAgICAgICAgICAgICAgICAvKiBmdWxsIGNvbnZlcnNpb24gKi8KKyAgICAgICAgfQorICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBhdXRvIC0gZG8gd2hhdCB1c2VyIHNhaWQgKi8KKyAgICAgIG5jID0gZnRwX2NudjsKKworICAgIGlmIChuZmlscyA8IDEpCisgICAgICBkb2V4aXQoQkFEX0VYSVQsLTEpOworCisgICAgdDAgPSBnbXN0aW1lcigpOyAgICAgICAgICAgICAgICAgICAgLyogU3RhcnRpbmcgdGltZSBmb3IgdGhpcyBiYXRjaCAqLworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICBpZiAoeGxhdGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgRlRQIENIQVJBQ1RFUi1TRVQtVFJBTlNMQVRJT04gKi8KKyAgICAgICAgbGNzID0gZnRwX2NzbDsgICAgICAgICAgICAgICAgICAvKiBMb2NhbCBjaGFyc2V0ICovCisgICAgICAgIGlmIChsY3MgPCAwKSBsY3MgPSBmY2hhcnNldDsKKyAgICAgICAgaWYgKGxjcyA8IDApIHhsYXRlID0gMDsKKyAgICB9CisgICAgaWYgKHhsYXRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RpbGwgT04/ICovCisgICAgICAgIHJjcyA9IGZ0cF9jc3g7ICAgICAgICAgICAgICAgICAgLyogUmVtb3RlIChTZXJ2ZXIpIGNoYXJzZXQgKi8KKyAgICAgICAgaWYgKHJjcyA8IDApIHJjcyA9IGZ0cF9jc3I7CisgICAgICAgIGlmIChyY3MgPCAwKSB4bGF0ZSA9IDA7CisgICAgfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICAvKgorICAgICAgSWYgd2UgaGF2ZSBvbmx5IG9uZSBmaWxlIGFuZCBpdCBpcyBhIGRpcmVjdG9yeSwgdGhlbiB3ZSBhc2sgZm9yIGEKKyAgICAgIGxpc3Rpbmcgb2YgaXRzIGNvbnRlbnRzLCByYXRoZXIgdGhhbiByZXRyaWV2aW5nIHRoZSBkaXJlY3RvcnkgZmlsZQorICAgICAgaXRzZWxmLiAgVGhpcyBpcyB3aGF0IChlLmcuKSBOZXRzY2FwZSBkb2VzLgorICAgICovCisgICAgaWYgKG5maWxzID09IDEpIHsKKyAgICAgICAgaWYgKGRvZnRwY3dkKChjaGFyICopY21saXN0W21nZXR4XSwtMSkpIHsKKyAgICAgICAgICAgIC8qIElmIHdlIGNhbiBDRCB0byBpdCwgaXQgbXVzdCBiZSBhIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgaWYgKHJlY3Vyc2l2ZSkgeworICAgICAgICAgICAgICAgIGNtbGlzdFttZ2V0eF0gPSAiKiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9CisgICAgICAgICAgICAgICAgICAocmVjdnJlcXVlc3QoIkxJU1QiLCItIiwiIiwid2IiLDAsMCxOVUxMLHhsYXRlLGxjcyxyY3MpPT0wKTsKKyAgICAgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKy8qCisgIFRoZSBmb2xsb3dpbmcgaXMgdG8gd29yayBhcm91bmQgVU5JWCBzZXJ2ZXJzIHdoaWNoLCB3aGVuIGdpdmVuIGEgY29tbWFuZAorICBsaWtlICJOTFNUIHBhdGgvYmxhaCIgKG5vdCB3aWxkKSByZXR1cm5zIHRoZSBiYXNlbmFtZSB3aXRob3V0IHRoZSBwYXRoLgorKi8KKyAgICBpZiAoIWRvbmUgJiYgc2VydmVydHlwZSA9PSBTWVNfVU5JWCAmJiBuZmlscyA9PSAxKSB7CisgICAgICAgIG1nZXQgPSBpc3dpbGQoY21saXN0W21nZXR4XSk7CisgICAgfQorICAgIGlmICghbWdldCAmJiAhZG9uZSkgeyAgICAgICAgICAgICAgIC8qIEludm9rZWQgYnkgY29tbWFuZC1saW5lIEZUUCBVUkwgKi8KKyAgICAgICAgaWYgKGZ0cF9kZWIpCisgICAgICAgICAgcHJpbnRmKCJET0lORyBHRVQuLi5cbiIpOworICAgICAgICBkb25lKys7CisgICAgICAgIGNhbmNlbGZpbGUgPSAwOyAgICAgICAgICAgICAgICAgLyogVGhpcyBmaWxlIG5vdCBjYW5jZWxlZCB5ZXQgKi8KKyAgICAgICAgcyA9IGNtbGlzdFttZ2V0eF07CisgICAgICAgIHJjID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbCByZXR1cm4gY29kZSAqLworCWZzaXplID0gLTFMOworCWlmIChzaXplb2spIHsKKwkgICAgeCA9IGZ0cGNtZCgiU0laRSIscyxsY3MscmNzLGZ0cF92Ym0pOyAvKiBHZXQgcmVtb3RlIGZpbGUncyBzaXplICovCisJICAgIGlmICh4ID09IFJFUExZX0NPTVBMRVRFKQorCSAgICAgIGZzaXplID0gYXRvbCgmZnRwX3JlcGx5X3N0cls0XSk7CisJfQorICAgICAgICBja3N0cm5jcHkoZmlsbmFtLHMsQ0tNQVhQQVRIKTsgIC8qIEZvciBcdihmaWxlbmFtZSkgKi8KKyAgICAgICAgZGVidWcoRjExMSwiZnRwIGNtZGxpbmdldCBmaWxuYW0iLGZpbG5hbSxmc2l6ZSk7CisKKyAgICAgICAgbnpydG9sKHMsdG1wYnVmLG5jLDAsQ0tNQVhQQVRIKTsgLyogU3RyaXAgcGF0aCBhbmQgbWF5YmUgY29udmVydCAqLworICAgICAgICBzMiA9IHRtcGJ1ZjsKKworICAgICAgICAvKiBJZiBsb2NhbCBmaWxlIGFscmVhZHkgZXhpc3RzLCB0YWtlIGNvbGxpc2lvbiBhY3Rpb24gKi8KKworICAgICAgICB4ID0gemNoa2koczIpOworICAgICAgICBpZiAoeCA+IC0xKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGZ0cF9mbmMpIHsKKyAgICAgICAgICAgICAgY2FzZSBYWUZYX0E6ICAgICAgICAgICAgICAvKiBBcHBlbmQgKi8KKyAgICAgICAgICAgICAgICBhcHBlbmQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFhZRlhfUjogICAgICAgICAgICAgIC8qIFJlbmFtZSAqLworICAgICAgICAgICAgICBjYXNlIFhZRlhfQjogeyAgICAgICAgICAgIC8qIEJhY2t1cCAqLworICAgICAgICAgICAgICAgICAgY2hhciAqIHAgPSBOVUxMOworICAgICAgICAgICAgICAgICAgaW50IHggPSAtMTsKKyAgICAgICAgICAgICAgICAgIHpuZXduKHMyLCZwKTsgICAgICAgICAvKiBNYWtlIHVuaXF1ZSBuYW1lICovCisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgY21kbGluZ2V0IHpuZXduIixwLDApOworICAgICAgICAgICAgICAgICAgaWYgKGZ0cF9mbmMgPT0gWFlGWF9CKSB7IC8qIEJhY2t1cCBleGlzdGluZyBmaWxlICovCisgICAgICAgICAgICAgICAgICAgICAgeCA9IHpyZW5hbWUoczIscCk7CisgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGNtZGxpbmdldCBiYWNrdXAgenJlbmFtZSIscCx4KTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAvKiBSZW5hbWUgaW5jb21pbmcgZmlsZSAqLworICAgICAgICAgICAgICAgICAgICAgIHggPSBja3N0cm5jcHkodG1wYnVmLHAsQ0tNQVhQQVRIKzEpOworICAgICAgICAgICAgICAgICAgICAgIHMyID0gdG1wYnVmOworICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBjbWRsaW5nZXQgcmVuYW1lIGluY29taW5nIixwLHgpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/QmFja3VwL1JlbmFtZSBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjYXNlIFhZRlhfRDogICAgICAgICAgICAgIC8qIERpc2NhcmQgKi8KKyAgICAgICAgICAgICAgICBmdHNjcmVlbihTQ1JfRk4sJ0YnLDBMLHMpOworICAgICAgICAgICAgICAgIGZ0c2NyZWVuKFNDUl9TVCxTVF9TS0lQLFNLUF9OQU0scyk7CisgICAgICAgICAgICAgICAgdGxvZyhGMTAwLCIgcmVmdXNlZDogbmFtZSIsIiIsMCk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIGNtZGxpbmdldCBza2lwIG5hbWUiLHMyLDApOworICAgICAgICAgICAgICAgIGdvdG8geGNsZ2V0OworCisgICAgICAgICAgICAgIGNhc2UgWFlGWF9YOiAgICAgICAgICAgICAgLyogT3ZlcndyaXRlICovCisgICAgICAgICAgICAgIGNhc2UgWFlGWF9VOiAgICAgICAgICAgICAgLyogVXBkYXRlIChhbHJlYWR5IGhhbmRsZWQgYWJvdmUpICovCisJICAgICAgY2FzZSBYWUZYX006CQkvKiBkaXR0byAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJjID0gZ2V0ZmlsZShzLCAgICAgICAgICAgICAgICAgLyogUmVtb3RlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgIHMyLCAgICAgICAgICAgICAgICAvKiBMb2NhbCBuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgLyogUmVjb3Zlci9SZXN0YXJ0ICovCisgICAgICAgICAgICAgICAgICAgICBhcHBlbmQsICAgICAgICAgICAgLyogQXBwZW5kICovCisgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgLyogUGlwZW5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAvKiBUcmFuc2xhdGUgY2hhcnNldHMgKi8KKyAgICAgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAvKiBGaWxlIGNoYXJzZXQgKG5vbmUpICovCisgICAgICAgICAgICAgICAgICAgICAtMSAgICAgICAgICAgICAgICAgLyogU2VydmVyIGNoYXJzZXQgKG5vbmUpICovCisgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgY21kbGluZ2V0IHJjIixzLHJjKTsKKyAgICAgICAgZGVidWcoRjExMSwiZnRwIGNtZGxpbmdldCBjYW5jZWxmaWxlIixzLGNhbmNlbGZpbGUpOworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgY21kbGluZ2V0IGNhbmNlbGdyb3VwIixzLGNhbmNlbGdyb3VwKTsKKworICAgICAgICBpZiAocmMgPCAwICYmIGhhdmV1cmwgJiYgc1swXSA9PSAnLycpIC8qIFVSTCBmYWlsZWQgLSB0cnkgYWdhaW4gKi8KKyAgICAgICAgICAgIHJjID0gZ2V0ZmlsZSgmc1sxXSwgICAgICAgICAvKiBSZW1vdGUgbmFtZSB3aXRob3V0IGxlYWRpbmcgJy8nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgczIsICAgICAgICAgICAgLyogTG9jYWwgbmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgIC8qIFJlY292ZXIvUmVzdGFydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCwgICAgICAgIC8qIEFwcGVuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgIC8qIFBpcGVuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgLyogVHJhbnNsYXRlIGNoYXJzZXRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgLyogRmlsZSBjaGFyc2V0IChub25lKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIC0xICAgICAgICAgICAgIC8qIFNlcnZlciBjaGFyc2V0IChub25lKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGlmIChyYyA+IC0xKSB7CisgICAgICAgICAgICBnb29kKys7CisgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChjYW5jZWxmaWxlKQorICAgICAgICAgIGdvdG8geGNsZ2V0OworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBmdHBfZmFpKys7CisgICAgICAgICAgICBpZiAoZ2V0ZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgICAgICAgIGRvbmUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZnRwX2RlYiAmJiAhZG9uZSkKKyAgICAgIHByaW50ZigiRE9JTkcgTUdFVC4uLlxuIik7CisgICAgd2hpbGUgKCFkb25lICYmICFjYW5jZWxncm91cCkgeworICAgICAgICBjYW5jZWxmaWxlID0gMDsgICAgICAgICAgICAgICAgIC8qIFRoaXMgZmlsZSBub3QgY2FuY2VsZWQgeWV0ICovCisgICAgICAgIHMgPSAoY2hhciAqKXJlbW90ZV9maWxlcyhmaXJzdCwoQ0hBUiAqKWNtbGlzdFttZ2V0eF0sTlVMTCwwKTsKKyAgICAgICAgaWYgKCFzKSBzID0gIiI7CisgICAgICAgIGlmICghKnMpIHsKKyAgICAgICAgICAgIGZpcnN0ID0gMTsKKyAgICAgICAgICAgIG1nZXR4Kys7CisgICAgICAgICAgICBpZiAobWdldHggPCBuZmlscykKKyAgICAgICAgICAgICAgcyA9IChjaGFyICopcmVtb3RlX2ZpbGVzKGZpcnN0LChDSEFSICopY21saXN0W21nZXR4XSxOVUxMLDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBzID0gTlVMTDsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBjbWRsaW5nZXQgcmVtb3RlX2ZpbGVzIEIiLHMsMCk7CisgICAgICAgICAgICBpZiAoIXMpIHsKKyAgICAgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgIFRoZSBzZW1hbnRpY3Mgb2YgTkxTVCBhcmUgaWxsLWRlZmluZWQuICBTdXBwb3NlIHdlIGhhdmUganVzdCBzZW50CisgICAgICAgICAgTkxTVCAvcGF0aC9bYS16XSouICBNb3N0IHNlcnZlcnMgc2VuZCBiYWNrIG5hbWVzIGxpa2UgL3BhdGgvZm9vLAorICAgICAgICAgIC9wYXRoL2JhciwgZXRjLiAgQnV0IHNvbWUgc2VuZCBiYWNrIG9ubHkgZm9vIGFuZCBiYXIsIGFuZCBzdWJzZXF1ZW50CisgICAgICAgICAgUkVUUiBjb21tYW5kcyBiYXNlZCBvbiB0aGUgcGF0aGxlc3MgbmFtZXMgYXJlIG5vdCBnb2luZyB0byB3b3JrLgorICAgICAgICAqLworICAgICAgICBpZiAoc2VydmVydHlwZSA9PSBTWVNfVU5JWCAmJiAhY2tzdHJjaHIocywnLycpKSB7CisgICAgICAgICAgICBpZiAoKHMzID0gY2tzdHJyY2hyKGNtbGlzdFttZ2V0eF0sJy8nKSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuLCBsZWZ0ID0gNDA5NjsKKyAgICAgICAgICAgICAgICBjaGFyICogdG1wID0geHRtcGJ1ZjsKKyAgICAgICAgICAgICAgICBsZW4gPSBzMyAtIGNtbGlzdFttZ2V0eF0gKyAxOworICAgICAgICAgICAgICAgIGNrc3RybmNweSh0bXAsY21saXN0W21nZXR4XSxsZWZ0KTsKKyAgICAgICAgICAgICAgICB0bXAgKz0gbGVuOworICAgICAgICAgICAgICAgIGxlZnQgLT0gbGVuOworICAgICAgICAgICAgICAgIGNrc3RybmNweSh0bXAscyxsZWZ0KTsKKyAgICAgICAgICAgICAgICBzID0geHRtcGJ1ZjsKKwkJZGVidWcoRjExMSwiZnRwIGNtZGxpbmdldCByZW1vdGVfZmlsZXMgWCIscywwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaXJzdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBmaXJzdCBhbnkgbW9yZSAqLworCisJZGVidWcoRjExMSwiZnRwIGNtZGxpbmdldCBoYXZldHlwZSIscyxoYXZldHlwZSk7CisJaWYgKGhhdmV0eXBlID4gMCAmJiBoYXZldHlwZSAhPSBGVFlQX0ZJTEUpIHsgLyogU2VydmVyIHNheXMgbm90IGZpbGUgKi8KKwkgICAgZGVidWcoRjExMCwiZnRwIGNtZGxpbmdldCBub3QtYS1maWxlIixzLDApOworCSAgICBjb250aW51ZTsKKwl9CisgICAgICAgIHJjID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbCByZXR1cm4gY29kZSAqLworCWlmIChoYXZlc2l6ZSA+IC0xTCkgewkJLyogQWxyZWFkeSBoYXZlIGZpbGUgc2l6ZT8gKi8KKwkgICAgZnNpemUgPSBoYXZlc2l6ZTsKKwl9IGVsc2UgewkJCS8qIE5vIC0gbXVzdCBhc2sgc2VydmVyICovCisJICAgIC8qCisJICAgICAgUHJpb3IgdG8gc2VuZGluZyB0aGUgTkxTVCBjb21tYW5kIHdlIG5lY2Vzc2FyaWx5IHB1dCB0aGUKKwkgICAgICBzZXJ2ZXIgaW50byBBU0NJSSBtb2RlLiAgV2UgbXVzdCBub3cgcHV0IGl0IGJhY2sgaW50byB0aGUKKwkgICAgICB0aGUgcmVxdWVzdGVkIG1vZGUgc28gdGhlIHVwY29taW5nIFNJWkUgY29tbWFuZCByZXR1cm5zCisJICAgICAgcmlnaHQga2luZCBvZiBzaXplOyB0aGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvcgorCSAgICAgIEdFVCAvUkVDT1ZFUjsgb3RoZXJ3aXNlIHRoZSBzZXJ2ZXIgcmV0dXJucyB0aGUgIkFTQ0lJIiBzaXplCisJICAgICAgb2YgdGhlIGZpbGUsIHJhdGhlciB0aGFuIGl0cyB0cnVlIHNpemUuCisJICAgICovCisJICAgIGNoYW5nZXR5cGUoZnRwX3R5cCwwKTsJLyogQ2hhbmdlIHRvIHJlcXVlc3RlZCB0eXBlICovCisJICAgIGZzaXplID0gLTFMOworCSAgICBpZiAoc2l6ZW9rKSB7CisJCXggPSBmdHBjbWQoIlNJWkUiLHMsbGNzLHJjcyxmdHBfdmJtKTsKKwkJaWYgKHggPT0gUkVQTFlfQ09NUExFVEUpCisJCSAgZnNpemUgPSBhdG9sKCZmdHBfcmVwbHlfc3RyWzRdKTsKKwkgICAgfQorCX0KKyAgICAgICAgY2tzdHJuY3B5KGZpbG5hbSxzLENLTUFYUEFUSCk7ICAvKiBGb3IgXHYoZmlsZW5hbWUpICovCisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBjbWRsaW5nZXQgZmlsbmFtIixmaWxuYW0sZnNpemUpOworCisgICAgICAgIG56cnRvbChzLHRtcGJ1ZixuYywwLENLTUFYUEFUSCk7IC8qIFN0cmlwIHBhdGggYW5kIG1heWJlIGNvbnZlcnQgKi8KKyAgICAgICAgczIgPSB0bXBidWY7CisKKyAgICAgICAgLyogSWYgbG9jYWwgZmlsZSBhbHJlYWR5IGV4aXN0cywgdGFrZSBjb2xsaXNpb24gYWN0aW9uICovCisKKyAgICAgICAgeCA9IHpjaGtpKHMyKTsKKyAgICAgICAgaWYgKHggPiAtMSkgeworICAgICAgICAgICAgc3dpdGNoIChmdHBfZm5jKSB7CisgICAgICAgICAgICAgIGNhc2UgWFlGWF9BOiAgICAgICAgICAgICAgLyogQXBwZW5kICovCisgICAgICAgICAgICAgICAgYXBwZW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBYWUZYX1I6ICAgICAgICAgICAgICAvKiBSZW5hbWUgKi8KKyAgICAgICAgICAgICAgY2FzZSBYWUZYX0I6IHsgICAgICAgICAgICAvKiBCYWNrdXAgKi8KKyAgICAgICAgICAgICAgICAgIGNoYXIgKiBwID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIGludCB4ID0gLTE7CisgICAgICAgICAgICAgICAgICB6bmV3bihzMiwmcCk7ICAgICAgICAgLyogTWFrZSB1bmlxdWUgbmFtZSAqLworICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIGNtZGxpbmdldCB6bmV3biIscCwwKTsKKyAgICAgICAgICAgICAgICAgIGlmIChmdHBfZm5jID09IFhZRlhfQikgeyAvKiBCYWNrdXAgZXhpc3RpbmcgZmlsZSAqLworICAgICAgICAgICAgICAgICAgICAgIHggPSB6cmVuYW1lKHMyLHApOworICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBjbWRsaW5nZXQgYmFja3VwIHpyZW5hbWUiLHAseCk7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgLyogUmVuYW1lIGluY29taW5nIGZpbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICB4ID0gY2tzdHJuY3B5KHRtcGJ1ZixwLENLTUFYUEFUSCsxKTsKKyAgICAgICAgICAgICAgICAgICAgICBzMiA9IHRtcGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgY21kbGluZ2V0IHJlbmFtZSBpbmNvbWluZyIscCx4KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0JhY2t1cC9SZW5hbWUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY2FzZSBYWUZYX0Q6ICAgICAgLyogRGlzY2FyZCAqLworICAgICAgICAgICAgICAgIGZ0c2NyZWVuKFNDUl9GTiwnRicsMEwscyk7CisgICAgICAgICAgICAgICAgZnRzY3JlZW4oU0NSX1NULFNUX1NLSVAsU0tQX05BTSxzKTsKKyAgICAgICAgICAgICAgICB0bG9nKEYxMDAsIiByZWZ1c2VkOiBuYW1lIiwiIiwwKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgY21kbGluZ2V0IHNraXAgbmFtZSIsczIsMCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIGNhc2UgWFlGWF9YOiAgICAgICAgICAgICAgLyogT3ZlcndyaXRlICovCisgICAgICAgICAgICAgIGNhc2UgWFlGWF9VOiAgICAgICAgICAgICAgLyogVXBkYXRlIChhbHJlYWR5IGhhbmRsZWQgYWJvdmUpICovCisgICAgICAgICAgICAgIGNhc2UgWFlGWF9NOiAgICAgICAgICAgICAgLyogZGl0dG8gKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIF5eXiBBREQgQ0hBUlNFVCBTVFVGRiBIRVJFIF5eXiAqLworICAgICAgICByYyA9IGdldGZpbGUocywgICAgICAgICAgICAgICAgIC8qIFJlbW90ZSBuYW1lICovCisgICAgICAgICAgICAgICAgICAgICBzMiwgICAgICAgICAgICAgICAgLyogTG9jYWwgbmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgIC8qIFJlY292ZXIvUmVzdGFydCAqLworICAgICAgICAgICAgICAgICAgICAgYXBwZW5kLCAgICAgICAgICAgIC8qIEFwcGVuZCAqLworICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgIC8qIFBpcGVuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgLyogVHJhbnNsYXRlIGNoYXJzZXRzICovCisgICAgICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgLyogRmlsZSBjaGFyc2V0IChub25lKSAqLworICAgICAgICAgICAgICAgICAgICAgLTEgICAgICAgICAgICAgICAgIC8qIFNlcnZlciBjaGFyc2V0IChub25lKSAqLworICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgZGVidWcoRjExMSwiZnRwIGNtZGxpbmdldCByYyIscyxyYyk7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBjbWRsaW5nZXQgY2FuY2VsZmlsZSIscyxjYW5jZWxmaWxlKTsKKyAgICAgICAgZGVidWcoRjExMSwiZnRwIGNtZGxpbmdldCBjYW5jZWxncm91cCIscyxjYW5jZWxncm91cCk7CisKKyAgICAgICAgaWYgKHJjID4gLTEpIHsKKyAgICAgICAgICAgIGdvb2QrKzsKKyAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbmNlbGZpbGUpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIGZ0cF9mYWkrKzsKKyAgICAgICAgICAgIGlmIChnZXRlcnJvcikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgZG9uZSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHhjbGdldDoKKyAgICBpZiAoY2FuY2VsZ3JvdXApCisgICAgICBtbHNyZXNldCgpOworICAgIGlmIChzdGF0dXMgPiAwKSB7CisgICAgICAgIGlmIChjYW5jZWxncm91cCkKKyAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICBlbHNlIGlmIChjYW5jZWxmaWxlICYmIGdvb2QgPCAxKQorICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgfQorICAgIHN1Y2Nlc3MgPSBzdGF0dXM7CisKKyNpZmRlZiBHRlRJTUVSCisgICAgdDEgPSBnbXN0aW1lcigpOyAgICAgICAgICAgICAgICAgICAgLyogRW5kIHRpbWUgKi8KKyAgICBzZWMgPSAoQ0tGTE9BVCkoKENLRkxPQVQpKHQxIC0gdDApIC8gMTAwMC4wKTsgLyogU3RhdHMgKi8KKyAgICBpZiAoIXNlYykgc2VjID0gMC4wMDE7CisgICAgZnB0c2VjcyA9IHNlYzsKKyNlbHNlCisgICAgc2VjID0gKHQxIC0gdDApIC8gMTAwMDsKKyAgICBpZiAoIXNlYykgc2VjID0gMTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisKKyAgICB0ZmNwcyA9IChsb25nKSAodGZjIC8gc2VjKTsKKyAgICB0c2VjcyA9IChpbnQpc2VjOworICAgIGxhc3R4ZmVyID0gV19GVFB8V19SRUNWOworICAgIHhmZXJzdGF0ID0gc3VjY2VzczsKKyAgICBpZiAoZHB5YWN0aXZlKQorICAgICAgZnRzY3JlZW4oU0NSX1RDLDAsMEwsIiIpOworICAgIGlmICghc3RheSkKKyAgICAgIGRvZXhpdChzdWNjZXNzID8gR09PRF9FWElUIDogQkFEX0VYSVQsIC0xKTsKKyAgICByZXR1cm4oc3VjY2Vzcyk7Cit9CisKKy8qICBkIG8gZiB0IHAgZyBlIHQgIC0tICBQYXJzZSBhbmQgZXhlY3V0ZSBHRVQsIE1HRVQsIE1ERUxFVEUsIC4uLiAgKi8KKworLyoKKyAgTm90ZTogaWYgd2Ugd2FudGVkIHRvIGltcGxlbWVudCAvQUZURVI6LCAvQkVGT1JFOiwgZXRjLCB3ZSBjb3VsZCB1c2UKKyAgenN0cmRhdCgpIHRvIGNvbnZlcnQgdG8gVVRDLWJhc2VkIHRpbWVfdC4gIEJ1dCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZnJvbQorICB0aGUgdXNlci1pbnRlcmZhY2UgcGVyc3BlY3RpdmUsIHNpbmNlIHRoZSBzZXJ2ZXIncyBkaXJlY3RvcnkgbGlzdGluZ3Mgc2hvdworICBpdHMgb3duIGxvY2FsIHRpbWVzIGFuZCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQgdGltZXpvbmUgaXQncyBpbiwgdGhlcmUncworICBubyB3YXkgdG8gcmVjb25jaWxlIG91ciBsb2NhbCB0aW1lcyB3aXRoIHRoZSBzZXJ2ZXIncy4KKyovCitpbnQKK2RvZnRwZ2V0KGN4LHdobykgaW50IGN4LCB3aG87IHsgICAgICAgICAvKiB3aG8gPT0gMSBmb3IgZnRwLCAwIGZvciBrZXJtaXQgKi8KKyAgICBzdHJ1Y3QgRkRCIGZsLCBzdywgY207CisgICAgaW50IGksIG4sIHJjLCBnZXR2YWwgPSAwLCBtZ2V0ID0gMCwgZG9uZSA9IDAsIHBpcGVzYXZlID0gMDsKKyAgICBpbnQgeF9jbnYgPSAwLCB4X3BybSA9IDAsIHJlc3RhcnQgPSAwLCBzdGF0dXMgPSAwLCBnb29kID0gMDsKKyAgICBpbnQgeF9mbmMgPSAwLCBmaXJzdCA9IDAsIHNraXB0aGlzID0gMCwgYXBwZW5kID0gMCwgc2VsZWN0ZWQgPSAwOworICAgIGludCByZW5hbWluZyA9IDAsIG1kZWwgPSAwLCBsaXN0ZmlsZSA9IDAsIHVwZGF0aW5nID0gMCwgZ2V0b25lID0gMDsKKyAgICBpbnQgbW92aW5nID0gMCwgZGVsZXRpbmcgPSAwLCB0b3NjcmVlbiA9IDAsIGhhc3BhdGggPSAwOworICAgIGludCBnb3RzaXplID0gMDsKKyAgICBpbnQgbWF0Y2hkb3QgPSAwOworICAgIGxvbmcgZ2V0bGFyZ2VyID0gLTEsIGdldHNtYWxsZXIgPSAtMTsKKyAgICBjaGFyICogbXNnLCAqIHMsICogczIsICogbmFtLCAqIHBpcGVuYW1lID0gTlVMTCwgKiBwbiA9IE5VTEw7CisgICAgY2hhciAqIHNyYyA9ICIiLCAqIGxvY2FsID0gIiI7CisgICAgY2hhciAqIHBhdCA9ICIiOworCisgICAgaW50IHhfY3NsID0gLTEsIHhfY3NyID0gLTE7ICAgICAgICAgLyogTG9jYWwgYW5kIHJlbW90ZSBjaGFyc2V0cyAqLworICAgIGludCB4X3hsYSA9IDA7CisgICAgY2hhciBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29ya2VyIGNoYXIgKi8KKyAgICBVTE9ORyB0MCA9IDBMLCB0MTsgICAgICAgICAgICAgICAgICAvKiBUaW1lcyBmb3Igc3RhdHMgKi8KKyNpZmRlZiBHRlRJTUVSCisgICAgQ0tGTE9BVCBzZWM7CisjZWxzZQorICAgIGludCBzZWMgPSAwOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKworICAgIHN0cnVjdCBzdHJpbmdpbnQgeyAgICAgICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBhcnJheSBmb3Igc3dpdGNoIHZhbHVlcyAqLworICAgICAgICBjaGFyICogc3ZhbDsKKyAgICAgICAgaW50IGl2YWw7CisgICAgfSBwdltTTkRfTUFYKzFdOworCisgICAgc3VjY2VzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIGZhaWx1cmUgKi8KKyAgICBmb3JjZXR5cGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBObyAvVEVYVCBvciAvQklOQVJZIGdpdmVuIHlldCAqLworICAgIHJlc3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHJlc3RhcnQgeWV0ICovCisgICAgb3V0MnNjcmVlbiA9IDA7CQkJLyogTm8gVE8tU0NSRUVOIHN3aXRjaCBnaXZlbiB5ZXQgKi8KKyAgICBtZ2V0bWV0aG9kID0gMDsJCQkvKiBObyBOTFNUIG9yIE1MU0Qgc3dpdGNoIHlldCAqLworICAgIG1nZXRmb3JjZWQgPSAwOworCisgICAgZ19kaXNwbGEgPSBmZGlzcGxhOworICAgIGlmIChmdHBfZGlzID4gLTEpCisgICAgICBmZGlzcGxhID0gZnRwX2RpczsKKworICAgIHhfY252ID0gZnRwX2NudjsgICAgICAgICAgICAgICAgICAgIC8qIEZpbGVuYW1lIGNvbnZlcnNpb24gKi8KKyAgICBpZiAoeF9jbnYgPT0gQ05WX0FVVE8pIHsJCS8qIE5hbWUgY29udmVyc2lvbiBpcyBhdXRvICovCisgICAgICAgIGlmIChhbGlrZSkgeyAgICAgICAgICAgICAgICAgICAgLyogSWYgc2VydmVyICYgY2xpZW50IGFyZSBhbGlrZSAqLworICAgICAgICAgICAgeF9jbnYgPSAwOwkJCS8qIG5vIGNvbnZlcnNpb24gKi8KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQgKi8KKyAgICAgICAgICAgIGlmIChzZXJ2ZXJ0eXBlID09IFNZU19VTklYIHx8IHNlcnZlcnR5cGUgPT0gU1lTX1dJTjMyKQorICAgICAgICAgICAgICB4X2NudiA9IC0xOwkJLyogb25seSBtaW5pbWFsIGNvbnZlcnNpb25zIG5lZWRlZCAqLworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSAqLworICAgICAgICAgICAgICB4X2NudiA9IDE7CQkvKiBmdWxsIGNvbnZlcnNpb24gKi8KKyAgICAgICAgfQorICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBhdXRvIC0gZG8gd2hhdCB1c2VyIHNhaWQgKi8KKyAgICAgIHhfY252ID0gZnRwX2NudjsKKworICAgIHhfcHJtID0gZnRwX3BybTsgICAgICAgICAgICAgICAgICAgIC8qIFBlcm1pc3Npb25zICovCisgICAgaWYgKHhfcHJtID09IFNFVF9BVVRPKSAgICAgICAgICAgICAgLyogUGVybWlzc2lvbnMgQVVUTyAqLworICAgICAgeF9wcm0gPSBhbGlrZTsKKworI2lmbmRlZiBOT0NTRVRTCisgICAgeF9jc3IgPSBmdHBfY3NyOyAgICAgICAgICAgICAgICAgICAgLyogSW5oZXJpdCBnbG9iYWwgc2VydmVyIGNoYXJzZXQgKi8KKyAgICB4X2NzbCA9IGZ0cF9jc2w7ICAgICAgICAgICAgICAgICAgICAvKiBJbmhlcml0IGdsb2JhbCBsb2NhbCBjaGFyc2V0ICovCisgICAgaWYgKHhfY3NsIDwgMCkgICAgICAgICAgICAgICAgICAgICAgLyogSWYgbm9uZSwgdXNlIGN1cnJlbnQgKi8KKyAgICAgIHhfY3NsID0gZmNoYXJzZXQ7ICAgICAgICAgICAgICAgICAvKiBmaWxlIGNoYXJhY3Rlci1zZXQuICovCisgICAgeF94bGEgPSBmdHBfeGxhOyAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNsYXRpb24gT24vT2ZmICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCisgICAgZ2V0ZXJyb3IgPSBmdHBfZXJyOyAgICAgICAgICAgICAgICAgLyogSW5oZXJpdCBnbG9iYWwgZXJyb3IgYWN0aW9uLiAqLworICAgIGFzbmFtYnVmWzBdID0gTlVMOyAgICAgICAgICAgICAgICAgIC8qIE5vIGFzLW5hbWUgeWV0LiAqLworICAgIHBpcGVzYXZlID0gcGlwZXNlbmQ7CisgICAgcGlwZXNlbmQgPSAwOworCisgICAgaGF2ZXR5cGUgPSAwOworICAgIGhhdmVzaXplID0gLTFMOworICAgIG1ha2VzdHIoJmhhdmVtZHRtLE5VTEwpOworCisgICAgaWYgKGdfZnRwX3R5cCA+IC0xKSB7ICAgICAgICAgICAgICAgLyogUmVzdG9yZSBUWVBFIGlmIHNhdmVkICovCisgICAgICAgIGZ0cF90eXAgPSBnX2Z0cF90eXA7CisgICAgICAgIC8qIGdfZnRwX3R5cCA9IC0xOyAqLworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDw9IFNORF9NQVg7IGkrKykgeyAgICAvKiBJbml0aWFsaXplIHN3aXRjaCB2YWx1ZXMgKi8KKyAgICAgICAgcHZbaV0uc3ZhbCA9IE5VTEw7ICAgICAgICAgICAgICAvKiB0byBudWxsIHBvaW50ZXJzICovCisgICAgICAgIHB2W2ldLml2YWwgPSAtMTsgICAgICAgICAgICAgICAgLyogYW5kIC0xIGludCB2YWx1ZXMgKi8KKyAgICB9CisgICAgemNsb3NlKFpNRklMRSk7ICAgICAgICAgICAgICAgICAgICAgLyogSW4gY2FzZSBpdCB3YXMgbGVmdCBvcGVuICovCisKKyAgICB4X2ZuYyA9IGZ0cF9mbmMgPiAtMSA/IGZ0cF9mbmMgOiBmbmNhY3Q7IC8qIEZpbGVuYW1lIGNvbGxpc2lvbiBhY3Rpb24gKi8KKworICAgIGlmIChmcF9ubWwpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IC9OQU1FTElTVCAqLworICAgICAgICBpZiAoZnBfbm1sICE9IHN0ZG91dCkKKyAgICAgICAgICBmY2xvc2UoZnBfbm1sKTsKKyAgICAgICAgZnBfbm1sID0gTlVMTDsKKyAgICB9CisgICAgbWFrZXN0cigmZnRwX25tbCxOVUxMKTsKKworICAgIC8qIEluaXRpYWxpemUgbGlzdCBvZiByZW1vdGUgZmlsZXNwZWNzICovCisKKyAgICBpZiAoIW1nZXRsaXN0KSB7CisgICAgICAgIG1nZXRsaXN0ID0gKGNoYXIgKiopbWFsbG9jKE1HRVRNQVggKiBzaXplb2YoY2hhciAqKSk7CisgICAgICAgIGlmICghbWdldGxpc3QpIHsKKyAgICAgICAgICAgIHByaW50ZigiP01lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgLSBNR0VUIGxpc3RcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUdFVE1BWDsgaSsrKQorICAgICAgICAgIG1nZXRsaXN0W2ldID0gTlVMTDsKKyAgICB9CisgICAgbWdldG4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIG1nZXQgYXJndW1lbnRzICovCisgICAgbWdldHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBhcmcgKi8KKworICAgIGlmICh3aG8gPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxlZCB3aXRoIHVucHJlZml4ZWQgY29tbWFuZCAqLworICAgICAgICBpZiAoY3ggPT0gWFhHRVQgfHwgY3ggPT0gWFhSRUdFVCB8fCBjeCA9PSBYWFJFVFIpCisgICAgICAgICAgZ2V0b25lKys7CisgICAgICAgIHN3aXRjaCAoY3gpIHsKKyAgICAgICAgICBjYXNlIFhYUkVHRVQ6IHB2W1NORF9SRVNdLml2YWwgPSAxOyBicmVhazsKKyAgICAgICAgICBjYXNlIFhYUkVUUjogIHB2W1NORF9ERUxdLml2YWwgPSAxOyBicmVhazsKKyAgICAgICAgICBjYXNlIFhYR0VUOgorICAgICAgICAgIGNhc2UgWFhNR0VUOiAgbWdldCsrOyBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUUCBjb21tYW5kICovCisgICAgICAgIGlmIChjeCA9PSBGVFBfR0VUIHx8IGN4ID09IEZUUF9SR0UpCisgICAgICAgICAgZ2V0b25lKys7CisgICAgICAgIHN3aXRjaCAoY3gpIHsKKyAgICAgICAgICBjYXNlIEZUUF9ERUw6ICAgICAgICAgICAgICAgICAvKiAoZmFsbCB0aHJ1IG9uIHB1cnBvc2UpICovCisgICAgICAgICAgY2FzZSBGVFBfTURFOiBtZGVsKys7ICAgICAgICAgLyogKGRpdHRvKSAqLworICAgICAgICAgIGNhc2UgRlRQX0dFVDogICAgICAgICAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICAgICAgICBjYXNlIEZUUF9NR0U6IG1nZXQrKzsgYnJlYWs7CisgICAgICAgICAgY2FzZSBGVFBfUkdFOiBwdltTTkRfUkVTXS5pdmFsID0gMTsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgY21mZGJpKCZzdywgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgRkRCIC0gY29tbWFuZCBzd2l0Y2hlcyAqLworICAgICAgICAgICBfQ01LRVksICAgICAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICJSZW1vdGUgZmlsZW5hbWU7XG4gb3Igc3dpdGNoIiwgLyogaGxwbXNnICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIG1kZWwgPyBuZGVsc3dpIDogbmdldHN3aSwgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgbWRlbCA/IGRlbHN3aSA6IGdldHN3aSwgICAgICAvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgICAgICZmbCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICApOworICAgIGNtZmRiaSgmZmwsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDJuZCBGREIgLSByZW1vdGUgZmlsZW5hbWUgKi8KKyAgICAgICAgICAgX0NNRkxELCAgICAgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsCisgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICZjbQorICAgICAgICAgICApOworICAgIGNtZmRiaSgmY20sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDNyZCBGREIgLSBDb25maXJtYXRpb24gKi8KKyAgICAgICAgICAgX0NNQ0ZNLCAgICAgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKyAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgTlVMTAorICAgICAgICAgICApOworCisgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFyc2UgMCBvciBtb3JlIHN3aXRjaGVzICovCisgICAgICAgIHggPSBjbWZkYigmc3cpOyAgICAgICAgICAgICAgICAgLyogUGFyc2Ugc29tZXRoaW5nICovCisgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBnZXQgY21mZGIiLCIiLHgpOworICAgICAgICBpZiAoeCA8IDApICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgZ290byB4Z2V0eDsgICAgICAgICAgICAgICAgICAgLyogb3IgcmVwYXJzZSBuZWVkZWQgKi8KKyAgICAgICAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkgICAvKiBCcmVhayBvdXQgb2YgbG9vcCBpZiBub3QgYSBzd2l0Y2ggKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgYyA9IGNtZ2JyaygpOyAgICAgICAgICAgICAgICAgICAvKiBHZXQgYnJlYWsgY2hhcmFjdGVyICovCisgICAgICAgIGdldHZhbCA9IChjID09ICc6JyB8fCBjID09ICc9Jyk7IC8qIHRvIHNlZSBob3cgdGhleSBlbmRlZCB0aGUgc3dpdGNoICovCisgICAgICAgIGlmIChnZXR2YWwgJiYgIShjbXJlc3VsdC5rZmxhZ3MgJiBDTV9BUkcpKSB7CisgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFyZ3VtZW50c1xuIik7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICB9CisgICAgICAgIG4gPSBjbXJlc3VsdC5ucmVzdWx0OyAgICAgICAgICAgLyogTnVtZXJpYyByZXN1bHQgPSBzd2l0Y2ggdmFsdWUgKi8KKyAgICAgICAgZGVidWcoRjEwMSwiZnRwIGdldCBzd2l0Y2giLCIiLG4pOworCisgICAgICAgIGlmICghZ2V0dmFsICYmIChjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChuKSB7ICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIHRoZSBzd2l0Y2ggKi8KKyAgICAgICAgICBjYXNlIFNORF9BU046ICAgICAgICAgICAgICAgICAvKiAvQVMtTkFNRTogKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBnZXQgL2FzLW5hbWUgZ2V0dmFsIiwiIixnZXR2YWwpOworICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgaWYgKCh4ID0gY21mbGQoIk5hbWUgdG8gc3RvcmUgaXQgdW5kZXIiLCIiLCZzLE5VTEwpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9uYW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA9IGJyc3RyaXAocyk7CisgICAgICAgICAgICBpZiAoISpzKSBzID0gTlVMTDsKKyAgICAgICAgICAgIG1ha2VzdHIoJihwdltuXS5zdmFsKSxzKTsKKyAgICAgICAgICAgIHB2W25dLml2YWwgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFNORF9CSU46ICAgICAgICAgICAgICAgICAvKiAvQklOQVJZICovCisgICAgICAgICAgY2FzZSBTTkRfVFhUOiAgICAgICAgICAgICAgICAgLyogL1RFWFQgb3IgL0FTQ0lJICovCisgICAgICAgICAgY2FzZSBTTkRfVEVOOiAgICAgICAgICAgICAgICAgLyogL1RFTkVYICovCisgICAgICAgICAgICBwdltTTkRfQklOXS5pdmFsID0gMDsKKyAgICAgICAgICAgIHB2W1NORF9UWFRdLml2YWwgPSAwOworICAgICAgICAgICAgcHZbU05EX1RFTl0uaXZhbCA9IDA7CisgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgUFVUUElQRQorICAgICAgICAgIGNhc2UgU05EX0NNRDogICAgICAgICAgICAgICAgIC8qIFRoZXNlIHRha2Ugbm8gYXJncyAqLworICAgICAgICAgICAgaWYgKG5vcHVzaCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBzeXN0ZW0gY29tbWFuZCBhY2Nlc3MgaXMgZGlzYWJsZWRcbiIpOworICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgfQorI2lmZGVmIFBJUEVTRU5ECisgICAgICAgICAgICBlbHNlIGlmIChyY3ZmaWx0ZXIpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgbm8gUFVUIC9DT01NQU5EIHdoZW4gU0VORCBGSUxURVIgc2VsZWN0ZWRcbiIpOworICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgfQorI2VuZGlmIC8qIFBJUEVTRU5EICovCisgICAgICAgICAgICBzdy5obHBtc2cgPSAiQ29tbWFuZCwgb3Igc3dpdGNoIjsgLyogQ2hhbmdlIGhlbHAgbWVzc2FnZSAqLworICAgICAgICAgICAgcHZbbl0uaXZhbCA9IDE7ICAgICAgICAgICAgIC8qIEp1c3Qgc2V0IHRoZSBmbGFnICovCisgICAgICAgICAgICBwdltTTkRfQVJSXS5pdmFsID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFBVVFBJUEUgKi8KKworICAgICAgICAgIGNhc2UgU05EX1NISDogICAgICAgICAgICAgICAgIC8qIC9RVUlFVCAqLworICAgICAgICAgIGNhc2UgU05EX1JFUzogICAgICAgICAgICAgICAgIC8qIC9SRUNPVkVSIChyZWdldCkgKi8KKyAgICAgICAgICBjYXNlIFNORF9OT0I6ICAgICAgICAgICAgICAgICAvKiAvTk9CQUNLVVBGSUxFUyAqLworICAgICAgICAgIGNhc2UgU05EX0RFTDogICAgICAgICAgICAgICAgIC8qIC9ERUxFVEUgKi8KKyAgICAgICAgICBjYXNlIFNORF9VUEQ6ICAgICAgICAgICAgICAgICAvKiAvVVBEQVRFICovCisgICAgICAgICAgY2FzZSBTTkRfVVNOOiAgICAgICAgICAgICAgICAgLyogL1VOSVFVRSAqLworICAgICAgICAgIGNhc2UgU05EX05PRDogICAgICAgICAgICAgICAgIC8qIC9OT0RPVEZJTEVTICovCisgICAgICAgICAgY2FzZSBTTkRfUkVDOiAgICAgICAgICAgICAgICAgLyogL1JFQ09WRVIgKi8KKyAgICAgICAgICBjYXNlIFNORF9NQUk6ICAgICAgICAgICAgICAgICAvKiAvVE8tU0NSRUVOICovCisgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsgICAgICAgICAgICAgLyogSnVzdCBzZXQgdGhlIGZsYWcgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfRElGOiAgICAgICAgICAgICAgICAgLyogL0RBVEVTLURJRkZFUiAqLworCSAgICBwdltTTkRfQ09MXS5pdmFsID0gWFlGWF9NOwkvKiBOb3cgaXQncyBhIGNvbGxpc2lvbiBvcHRpb24gKi8KKwkgICAgcHZbbl0uaXZhbCA9IDE7CisJICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfQ09MOiAgICAgICAgICAgICAgICAgLyogL0NPTExJU0lPTjogKi8KKyAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KGZ0cGNvbHh0YWIsbmZ0cGNvbHgsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geGdldHg7CisJICAgIGlmICh4ID09IFhZRlhfTSkKKwkgICAgICBwdltTTkRfRElGXS5pdmFsID0gMTsJLyogKHBoYXNlIHRoaXMgb3V0KSAqLworCSAgICBwdltuXS5pdmFsID0geDsJCS8qIHRoaXMgc2hvdWxkIGJlIHN1ZmZpY2llbnQgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfRVJSOiAgICAgICAgICAgICAgICAgLyogL0VSUk9SLUFDVElPTiAqLworICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkocW9ycCwyLCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgcHZbbl0uaXZhbCA9IHg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU05EX0VYQzogICAgICAgICAgICAgICAgIC8qIEV4Y2VwdGlvbiBsaXN0ICovCisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiUGF0dGVybiIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9QYXR0ZXJuIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMpIGlmICghKnMpIHMgPSBOVUxMOworICAgICAgICAgICAgbWFrZXN0cigmKHB2W25dLnN2YWwpLHMpOworICAgICAgICAgICAgaWYgKHB2W25dLnN2YWwpCisgICAgICAgICAgICAgIHB2W25dLml2YWwgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBQSVBFU0VORAorICAgICAgICAgIGNhc2UgU05EX0ZMVDoKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBnZXQgL2ZpbHRlciBnZXR2YWwiLCIiLGdldHZhbCk7CisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiRmlsdGVyIHByb2dyYW0gdG8gc2VuZCB0aHJvdWdoIiwiIiwmcyxOVUxMKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gLTMpCisgICAgICAgICAgICAgICAgICBzID0gIiI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMgPSBicnN0cmlwKHMpOworICAgICAgICAgICAgaWYgKHB2W1NORF9NQUldLml2YWwgPCAxKSB7CisgICAgICAgICAgICAgICAgeSA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhleSBpbmNsdWRlZCAiXHYoLi4uKSIgKi8KKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgeTsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzW3hdICE9ICdcXCcpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoc1t4KzFdID09ICd2JykgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh4ID09IHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICI/RmlsdGVyIG11c3QgY29udGFpbiBhIHJlcGxhY2VtZW50IHZhcmlhYmxlIGZvciBmaWxlbmFtZS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnMpIHsKKyAgICAgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCYocHZbbl0uc3ZhbCkscyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB2W25dLml2YWwgPSAwOworICAgICAgICAgICAgICAgIG1ha2VzdHIoJihwdltuXS5zdmFsKSxOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyAgICAgICAgICBjYXNlIFNORF9OQU06CisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWtleShmbnRhYixuZm50YWIsIiIsImF1dG9tYXRpYyIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJmdHAgZ2V0IC9maWxlbmFtZXMiLCIiLHgpOworICAgICAgICAgICAgcHZbbl0uaXZhbCA9IHg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU05EX1NNQTogICAgICAgICAgICAgICAgIC8qIFNtYWxsZXIgLyBsYXJnZXIgdGhhbiAqLworICAgICAgICAgIGNhc2UgU05EX0xBUjoKKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtbnVtKCJTaXplIGluIGJ5dGVzIiwiMCIsMTAsJnkseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICBwdltuXS5pdmFsID0geTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfRklMOiAgICAgICAgICAgICAgICAgLyogTmFtZSBvZiBmaWxlIGNvbnRhaW5pbmcgZmlsbmFtZXMgKi8KKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtaWZpKCJOYW1lIG9mIGZpbGUgY29udGFpbmluZyBsaXN0IG9mIGZpbGVuYW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsJnMsJnkseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9GaWxlbmFtZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoeSAmJiBpc3dpbGQocykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9XaWxkY2FyZHMgbm90IGFsbG93ZWQgQkJCXG4iKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzKSBpZiAoISpzKSBzID0gTlVMTDsKKyAgICAgICAgICAgIG1ha2VzdHIoJihwdltuXS5zdmFsKSxzKTsKKyAgICAgICAgICAgIGlmIChwdltuXS5zdmFsKQorICAgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfTU9WOiAgICAgICAgICAgICAgICAgLyogTU9WRSBhZnRlciAqLworICAgICAgICAgIGNhc2UgU05EX1JFTjogICAgICAgICAgICAgICAgIC8qIFJFTkFNRSBhZnRlciAqLworICAgICAgICAgIGNhc2UgU05EX1NSTjogeyAgICAgICAgICAgICAgIC8qIFNFUlZFUi1SRU5BTUUgKi8KKyAgICAgICAgICAgICAgY2hhciAqIG0gPSAiIjsKKyAgICAgICAgICAgICAgc3dpdGNoIChuKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTTkRfTU9WOgorICAgICAgICAgICAgICAgICAgbSA9CisgICAgICAgICAgICAgICAgICAgIkRldmljZSBhbmQvb3IgZGlyZWN0b3J5IGZvciBpbmNvbWluZyBmaWxlIGFmdGVyIHJlY2VwdGlvbiI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNORF9SRU46CisgICAgICAgICAgICAgICAgICBtID0gIk5ldyBuYW1lIGZvciBpbmNvbWluZyBmaWxlIGFmdGVyIHJlY2VwdGlvbiI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNORF9TUk46CisgICAgICAgICAgICAgICAgICBtID0gIk5ldyBuYW1lIGZvciBzb3VyY2UgZmlsZSBvbiBzZXJ2ZXIgYWZ0ZXIgcmVjZXB0aW9uIjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21mbGQobSwgIiIsICZzLCBuID09IFNORF9NT1YgPyB4eHN0cmluZyA6IE5VTEwpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlc1xuIiwgbiA9PSBTTkRfTU9WID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj9EZXN0aW5hdGlvbiByZXF1aXJlZCIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiP05ldyBuYW1lIHJlcXVpcmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbWFrZXN0cigmKHB2W25dLnN2YWwpLCpzID8gYnJzdHJpcChzKSA6IE5VTEwpOworICAgICAgICAgICAgICBwdltuXS5pdmFsID0gKHB2W25dLnN2YWwpID8gMSA6IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyNpZm5kZWYgTk9DU0VUUworICAgICAgICAgIGNhc2UgU05EX0NTTDogICAgICAgICAgICAgICAgIC8qIExvY2FsIGNoYXJhY3RlciBzZXQgKi8KKyAgICAgICAgICBjYXNlIFNORF9DU1I6ICAgICAgICAgICAgICAgICAvKiBSZW1vdGUgKHNlcnZlcikgY2hhcnNldCAqLworICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkoZmNzdGFiLG5maWxjLCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oKHggPT0gLTMpID8gLTIgOiB4KTsKKyAgICAgICAgICAgIGlmIChuID09IFNORF9DU0wpCisgICAgICAgICAgICAgIHhfY3NsID0geDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeF9jc3IgPSB4OworICAgICAgICAgICAgeF94bGEgPSAxOyAgICAgICAgICAgICAgICAgIC8qIE92ZXJyaWRlcyBnbG9iYWwgT0ZGIHNldHRpbmcgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfWFBBOiAgICAgICAgICAgICAgICAgLyogVHJhbnNwYXJlbnQgKi8KKyAgICAgICAgICAgIHhfeGxhID0gIDA7CisgICAgICAgICAgICB4X2NzciA9IC0xOworICAgICAgICAgICAgeF9jc2wgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworICAgICAgICAgIGNhc2UgU05EX05NTDoKKyAgICAgICAgICAgIGlmICgoeCA9IGNtb2ZpKCJMb2NhbCBmaWxlbmFtZSIsIi0iLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgbWFrZXN0cigmZnRwX25tbCxzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisJICBjYXNlIFNORF9QQVQ6CQkJLyogL1BBVFRFUk46ICovCisJICAgIGlmICghZ2V0dmFsKSBicmVhazsKKwkgICAgaWYgKCh4ID0gY21mbGQoIlBhdHRlcm4iLCIqIiwgJnMsIHh4c3RyaW5nKSkgPCAwKQorCSAgICAgIGdvdG8geGdldHg7CisJICAgIG1ha2VzdHIoJihwdltuXS5zdmFsKSwqcyA/IGJyc3RyaXAocykgOiBOVUxMKTsKKwkgICAgcHZbbl0uaXZhbCA9IChwdltuXS5zdmFsKSA/IDEgOiAwOworCSAgICBicmVhazsKKworCSAgY2FzZSBTTkRfTkxTOgkJCS8qIC9OTFNUICovCisgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsJCS8qIFVzZSBOTFNUICovCisJICAgIHB2W1NORF9NTFNdLml2YWwgPSAwOwkvKiBEb24ndCB1c2UgTUxTRCAqLworCSAgICBicmVhazsKKworCSAgY2FzZSBTTkRfTUxTOgkJCS8qIC9NTFNEICovCisgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsJCS8qIFVzZSBNTFNEICovCisJICAgIHB2W1NORF9OTFNdLml2YWwgPSAwOwkvKiBEb24ndCB1c2UgTkxTVCAqLworCSAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIC9BRlRFUiwgL1BFUk1JU1NJT05TLCBldGMuLi4gKi8KKyAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBcIiVzXCIgd29ya3Mgb25seSB3aXRoIFtNXVBVVFxuIixhdG1idWYpOworICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgfQorICAgIH0KKyAgICBsaW5lWzBdID0gTlVMOworICAgIGNtYXJnID0gbGluZTsKKyAgICBjbWFyZzIgPSBhc25hbWJ1ZjsKKyAgICBzID0gbGluZTsKKy8qCisgIEZvciBHRVQsIHdlIHdhbnQgdG8gcGFyc2UgYW4gb3B0aW9uYWwgYXMtbmFtZSwgbGlrZSB3aXRoIFBVVC4KKyAgRm9yIE1HRVQsIHdlIG11c3QgcGFyc2UgYSBsaXN0IG9mIG5hbWVzLCBhbmQgdGhlbiBzZW5kIE5MU1Qgb3IgTUxTRAorICBjb21tYW5kcyBmb3IgZWFjaCBuYW1lIHNlcGFyYXRlbHkuCisqLworICAgIHN3aXRjaCAoY21yZXN1bHQuZmNvZGUpIHsgICAgICAgICAgIC8qIEhvdyBkaWQgd2UgZ2V0IG91dCBvZiBzd2l0Y2ggbG9vcCAqLworICAgICAgY2FzZSBfQ01GTEQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIEZpZWxkICovCisgICAgICAgIGlmICghZ2V0b25lKSB7CisgICAgICAgICAgICBzID0gYnJzdHJpcChjbXJlc3VsdC5zcmVzdWx0KTsKKyAgICAgICAgICAgIG1ha2VzdHIoJihtZ2V0bGlzdFttZ2V0bisrXSkscyk7CisgICAgICAgICAgICB3aGlsZSAoKHggPSBjbWZsZCgiUmVtb3RlIGZpbGVuYW1lIiwiIiwmcyx4eHN0cmluZykpICE9IC0zKSB7CisgICAgICAgICAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCYobWdldGxpc3RbbWdldG4rK10pLGJyc3RyaXAocykpOworICAgICAgICAgICAgICAgIGlmIChtZ2V0biA+PSBNR0VUTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RvbyBtYW55IGl0ZW1zIGluIE1HRVQgbGlzdFxuIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcyA9IGJyc3RyaXAoY21yZXN1bHQuc3Jlc3VsdCk7CisgICAgICAgICAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiTmFtZSB0byBzdG9yZSBpdCB1bmRlciIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGlmICh4ICE9IC0zKQorICAgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICBzID0gYnJzdHJpcChzKTsKKyAgICAgICAgICAgIGNrc3RybmNweShhc25hbWJ1ZixzLENLTUFYUEFUSCsxKTsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgX0NNQ0ZNOiAgICAgICAgICAgICAgICAgICAgICAvKiBDb25maXJtYXRpb24gKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBwcmludGYoIj9VbmV4cGVjdGVkIGZ1bmN0aW9uIGNvZGU6ICVkXG4iLGNtcmVzdWx0LmZjb2RlKTsKKyAgICAgICAgeCA9IC05OworICAgICAgICBnb3RvIHhnZXR4OworICAgIH0KKyAgICBpZiAocHZbU05EX1JFQ10uaXZhbCA+IDApICAgICAgICAgICAvKiAvUkVDVVJTSVZFICovCisgICAgICByZWN1cnNpdmUgPSAyOworCisgICAgaWYgKHB2W1NORF9CSU5dLml2YWwgPiAwKSB7ICAgICAgICAgLyogL0JJTkFSWSByZWFsbHkgbWVhbnMgYmluYXJ5Li4uICovCisgICAgICAgIGZvcmNldHlwZSA9IDE7ICAgICAgICAgICAgICAgICAgLyogU28gc2tpcCB0aGUgbmFtZS1wYXR0ZXJuIG1hdGNoICovCisgICAgICAgIGZ0cF90eXAgPSBYWUZUX0I7ICAgICAgICAgICAgICAgLyogU2V0IGJpbmFyeSAqLworICAgIH0gZWxzZSBpZiAocHZbU05EX1RYVF0uaXZhbCA+IDApIHsgIC8qIFNpbWlsYXJseSBmb3IgL1RFWFQuLi4gKi8KKyAgICAgICAgZm9yY2V0eXBlID0gMTsKKyAgICAgICAgZnRwX3R5cCA9IFhZRlRfVDsKKyAgICB9IGVsc2UgaWYgKHB2W1NORF9URU5dLml2YWwgPiAwKSB7ICAvKiBhbmQgL1RFTkVYKi8KKyAgICAgICAgZm9yY2V0eXBlID0gMTsKKyAgICAgICAgZnRwX3R5cCA9IEZUVF9URU47CisgICAgfSBlbHNlIGlmIChmdHBfY21kbGluICYmIHhmZXJtb2RlID09IFhNT0RFX00pIHsKKyAgICAgICAgZm9yY2V0eXBlID0gMTsKKyAgICAgICAgZnRwX3R5cCA9IGJpbmFyeTsKKyAgICAgICAgZ19mdHBfdHlwID0gYmluYXJ5OworICAgIH0KKyAgICBpZiAocHZbU05EX0FTTl0uaXZhbCA+IDAgJiYgcHZbU05EX0FTTl0uc3ZhbCAmJiAhYXNuYW1idWZbMF0pIHsKKyAgICAgICAgY2hhciAqIHA7CisgICAgICAgIHAgPSBicnN0cmlwKHB2W1NORF9BU05dLnN2YWwpOyAgLyogQXMtbmFtZSAqLworICAgICAgICBja3N0cm5jcHkoYXNuYW1idWYscCxDS01BWFBBVEgrMSk7CisgICAgfQorICAgIGRlYnVnKEYxMTAsImZ0cCBnZXQgYXNuYW1idWYiLGFzbmFtYnVmLDApOworCisjaWZkZWYgUElQRVNFTkQKKyAgICBpZiAocHZbU05EX0NNRF0uaXZhbCA+IDApIHsgICAgICAgICAvKiAvQ09NTUFORCAtIHN0cmlwIGFueSBicmFjZXMgKi8KKyAgICAgICAgY2hhciAqIHA7CisgICAgICAgIHAgPSBhc25hbWJ1ZjsKKyAgICAgICAgZGVidWcoRjExMCwiR0VUIC9DT01NQU5EIGJlZm9yZSBzdHJpcHBpbmciLHAsMCk7CisgICAgICAgIHAgPSBicnN0cmlwKHApOworICAgICAgICBkZWJ1ZyhGMTEwLCJHRVQgL0NPTU1BTkQgYWZ0ZXIgc3RyaXBwaW5nIixwLDApOworICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgYSBjb21tYW5kIHRvIHdyaXRlIHRvIGlzIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgIH0KKyAgICAgICAgcGlwZW5hbWUgPSBwOworICAgICAgICBwaXBlc2VuZCA9IDE7CisgICAgfQorI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKy8qIFNldCB1cCAvTU9WRSBhbmQgL1JFTkFNRSAqLworCisgICAgaWYgKHB2W1NORF9ERUxdLml2YWwgPiAwICYmCisgICAgICAgIChwdltTTkRfTU9WXS5pdmFsID4gMCB8fCBwdltTTkRfUkVOXS5pdmFsID4gMCkpIHsKKyAgICAgICAgcHJpbnRmKCI/U29ycnksIC9ERUxFVEUgY29uZmxpY3RzIHdpdGggL01PVkUgb3IgL1JFTkFNRVxuIik7CisgICAgICAgIHggPSAtOTsKKyAgICAgICAgZ290byB4Z2V0eDsKKyAgICB9CisjaWZkZWYgQ0tfVE1QRElSCisgICAgaWYgKHB2W1NORF9NT1ZdLml2YWwgPiAwICYmIHB2W1NORF9NT1ZdLnN2YWwpIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgY2hhciAqIHAgPSBwdltTTkRfTU9WXS5zdmFsOworICAgICAgICBsZW4gPSBzdHJsZW4ocCk7CisgICAgICAgIGlmICghaXNkaXIocCkpIHsgICAgICAgICAgICAgICAgLyogQ2hlY2sgZGlyZWN0b3J5ICovCisjaWZkZWYgQ0tfTUtESVIKKyAgICAgICAgICAgIGNoYXIgKiBzID0gTlVMTDsKKyAgICAgICAgICAgIHMgPSAoY2hhciAqKW1hbGxvYyhsZW4gKyA0KTsKKyAgICAgICAgICAgIGlmIChzKSB7CisgICAgICAgICAgICAgICAgc3RyY3B5KHMscCk7ICAgICAgICAgICAgLyogc2FmZSAqLworI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgICAgICAgICAgICAgaWYgKHNbbGVuLTFdICE9ICc6JykgeyBzW2xlbisrXSA9ICc6Jzsgc1tsZW5dID0gTlVMOyB9CisjZWxzZQorICAgICAgICAgICAgICAgIGlmIChzW2xlbi0xXSAhPSAnLycpIHsgc1tsZW4rK10gPSAnLyc7IHNbbGVuXSA9IE5VTDsgfQorI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisgICAgICAgICAgICAgICAgc1tsZW4rK10gPSAnWCc7CisgICAgICAgICAgICAgICAgc1tsZW5dID0gTlVMOworI2lmZGVmIE5PTUtESVIKKyAgICAgICAgICAgICAgICB4ID0gLTE7CisjZWxzZQorICAgICAgICAgICAgICAgIHggPSB6bWtkaXIocyk7CisjZW5kaWYgLyogTk9NS0RJUiAqLworICAgICAgICAgICAgICAgIGZyZWUocyk7CisgICAgICAgICAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0Nhbid0IGNyZWF0ZSBcIiVzXCJcbiIscCk7CisgICAgICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgcHJpbnRmKCI/RGlyZWN0b3J5IFwiJXNcIiBub3QgZm91bmRcbiIscCk7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhnZXR4OworI2VuZGlmIC8qIENLX01LRElSICovCisgICAgICAgIH0KKyAgICAgICAgbWFrZXN0cigmcmN2X21vdmUscCk7CisgICAgICAgIG1vdmluZyA9IDE7CisgICAgfQorI2VuZGlmIC8qIENLX1RNUERJUiAqLworCisgICAgaWYgKHB2W1NORF9SRU5dLml2YWwgPiAwKSB7ICAgICAgICAgLyogL1JFTkFNRSAqLworICAgICAgICBjaGFyICogcCA9IHB2W1NORF9SRU5dLnN2YWw7CisgICAgICAgIGlmICghcCkgcCA9ICIiOworICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICBwcmludGYoIj9OZXcgbmFtZSByZXF1aXJlZCBmb3IgL1JFTkFNRVxuIik7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICB9CisgICAgICAgIHAgPSBicnN0cmlwKHApOworI2lmbmRlZiBOT1NQTAorICAgIC8qIElmIG5hbWUgZ2l2ZW4gaXMgd2lsZCwgcmVuYW1lIHN0cmluZyBtdXN0IGNvbnRhaW4gdmFyaWFibGVzICovCisgICAgICAgIGlmIChtZ2V0ICYmICFnZXRvbmUpIHsKKyAgICAgICAgICAgIGNoYXIgKiBzID0gdG1wYnVmOworICAgICAgICAgICAgeCA9IFRNUEJVRlNJWjsKKyAgICAgICAgICAgIHp6c3RyaW5nKHAsJnMsJngpOworICAgICAgICAgICAgaWYgKCFzdHJjbXAodG1wYnVmLHApKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICI/L1JFTkFNRSBmb3IgZmlsZSBncm91cCBtdXN0IGNvbnRhaW4gdmFyaWFibGVzIHN1Y2ggYXMgXFx2KGZpbGVuYW1lKVxuIgorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgcmVuYW1pbmcgPSAxOworICAgICAgICBtYWtlc3RyKCZyY3ZfcmVuYW1lLHApOworICAgICAgICBkZWJ1ZyhGMTEwLCJGVFAgcmN2X3JlbmFtZSIscmN2X3JlbmFtZSwwKTsKKyAgICB9CisgICAgaWYgKCFjbWFyZ1swXSAmJiBtZ2V0biA9PSAwICYmIGdldG9uZSAmJiBwdltTTkRfRklMXS5pdmFsIDwgMSkgeworICAgICAgICBwcmludGYoIj9GaWxlbmFtZSByZXF1aXJlZCBidXQgbm90IGdpdmVuXG4iKTsKKyAgICAgICAgeCA9IC05OworICAgICAgICBnb3RvIHhnZXR4OworICAgIH0gZWxzZSBpZiAoKGNtYXJnWzBdIHx8IG1nZXRuID4gMCkgJiYgcHZbU05EX0ZJTF0uaXZhbCA+IDApIHsKKyAgICAgICAgcHJpbnRmKCI/WW91IGNhbid0IGdpdmUgYm90aCAvTElTVEZJTEUgYW5kIGEgcmVtb3RlIGZpbGVuYW1lXG4iKTsKKyAgICAgICAgeCA9IC05OworICAgICAgICBnb3RvIHhnZXR4OworICAgIH0KKyAgICBDSEVDS0NPTk4oKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBjb25uZWN0aW9uICovCisKKyAgICBpZiAocHZbU05EX0NPTF0uaXZhbCA+IC0xKQorICAgICAgeF9mbmMgPSBwdltTTkRfQ09MXS5pdmFsOworCisjaWZuZGVmIE5PU1BMCisgICAgLyogSWYgYXMtbmFtZSBnaXZlbiBmb3IgTUdFVCwgYXMtbmFtZSBtdXN0IGNvbnRhaW4gdmFyaWFibGVzICovCisgICAgaWYgKG1nZXQgJiYgIWdldG9uZSAmJiBhc25hbWJ1ZlswXSAmJiB4X2ZuYyAhPSBYWUZYX0EpIHsKKyAgICAgICAgY2hhciAqIHMgPSB0bXBidWY7CisgICAgICAgIHggPSBUTVBCVUZTSVo7CisgICAgICAgIHp6c3RyaW5nKGFzbmFtYnVmLCZzLCZ4KTsKKyAgICAgICAgaWYgKCFzdHJjbXAodG1wYnVmLGFzbmFtYnVmKSkgeworICAgICAgICAgICAgcHJpbnRmKAorICAgICI/QXMtbmFtZSBmb3IgTUdFVCBtdXN0IGNvbnRhaW4gdmFyaWFibGVzIHN1Y2ggYXMgXFx2KGZpbGVuYW1lKVxuIgorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKy8qIGRvZ2V0OiAqLworCisgICAgaWYgKHB2W1NORF9TSEhdLml2YWwgPiAwIHx8IGZ0cF9ubWwpIHsgLyogR0VUIC9RVUlFVC4uLiAqLworICAgICAgICBmZGlzcGxhID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXNwbGEgPSAxOworICAgICAgICBpZiAobWRlbCB8fCBmdHBfZGViKQorCSAgZmRpc3BsYSA9IFhZRkRfQjsKKyAgICB9CisgICAgZGVsZXRpbmcgPSAwOworICAgIGlmIChwdltTTkRfREVMXS5pdmFsID4gMCkgICAgICAgICAgIC8qIC9ERUxFVEUgd2FzIHNwZWNpZmllZCAqLworICAgICAgZGVsZXRpbmcgPSAxOworICAgIGlmIChwdltTTkRfRVhDXS5pdmFsID4gMCkKKyAgICAgIG1ha2VsaXN0KHB2W1NORF9FWENdLnN2YWwscmN2ZXhjZXB0LE5TTkRFWENFUFQpOworICAgIGlmIChwdltTTkRfU01BXS5pdmFsID4gLTEpCisgICAgICBnZXRzbWFsbGVyID0gcHZbU05EX1NNQV0uaXZhbDsKKyAgICBpZiAocHZbU05EX0xBUl0uaXZhbCA+IC0xKQorICAgICAgZ2V0bGFyZ2VyID0gcHZbU05EX0xBUl0uaXZhbDsKKyAgICBpZiAocHZbU05EX05BTV0uaXZhbCA+IC0xKQorICAgICAgeF9jbnYgPSBwdltTTkRfTkFNXS5pdmFsOworICAgIGlmIChwdltTTkRfRVJSXS5pdmFsID4gLTEpCisgICAgICBnZXRlcnJvciA9IHB2W1NORF9FUlJdLml2YWw7CisgICAgaWYgKHB2W1NORF9NQUldLml2YWwgPiAtMSkKKyAgICAgIHRvc2NyZWVuID0gMTsKKworICAgIGlmIChwdltTTkRfTkxTXS5pdmFsID4gMCkgewkJLyogRm9yY2UgTkxTVCBvciBNTFNEPyAqLworCW1nZXRtZXRob2QgPSBTTkRfTkxTOworCW1nZXRmb3JjZWQgPSAxOworICAgIH0gZWxzZSBpZiAocHZbU05EX01MU10uaXZhbCA+IDApIHsKKwltZ2V0bWV0aG9kID0gU05EX01MUzsKKwltZ2V0Zm9yY2VkID0gMTsKKyAgICB9CisKKyNpZmRlZiBGVFBfUkVTVEFSVAorICAgIGlmIChwdltTTkRfUkVTXS5pdmFsID4gMCkgeworICAgICAgICBpZiAoIWZ0cF90eXApIHsKKyAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBHRVQgL1JFQ09WRVIgcmVxdWlyZXMgYmluYXJ5IG1vZGVcbiIpOworICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgZ290byB4Z2V0eDsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIC8qIE5vdCB0cnVlIC0gdGhlIGZhY3QgdGhhdCB0aGUgaW5pdGlhbCBSRVNUIGZhaWxzIGRvZXMgbm90IG1lYW4gKi8KKyAgICAgICAgLyogaXQgd2lsbCBmYWlsIGhlcmUuICAqLworICAgICAgICB9IGVsc2UgaWYgKCFva3Jlc3RhcnQpIHsKKyAgICAgICAgICAgIHByaW50ZigiV0FSTklORzogU2VydmVyIG1pZ2h0IG5vdCBzdXBwb3J0IHJlc3RhcnQuLi5cbiIpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgfQorICAgICAgICByZXN0YXJ0ID0gMTsKKyAgICB9CisjZW5kaWYgLyogRlRQX1JFU1RBUlQgKi8KKworI2lmZGVmIFBJUEVTRU5ECisgICAgaWYgKHB2W1NORF9GTFRdLml2YWwgPiAwKSB7ICAgICAgICAgLyogSGF2ZSBTRU5EIEZJTFRFUj8gKi8KKyAgICAgICAgaWYgKHBpcGVzZW5kKSB7CisgICAgICAgICAgICBwcmludGYoIj9Td2l0Y2ggY29uZmxpY3Q6IC9GSUxURVIgYW5kIC9DT01NQU5EXG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgIH0KKyAgICAgICAgbWFrZXN0cigmcmN2ZmlsdGVyLHB2W1NORF9GTFRdLnN2YWwpOworICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgZ2V0IC9GSUxURVIiLCByY3ZmaWx0ZXIsIDApOworICAgIH0KKyAgICBpZiAocmN2ZmlsdGVyIHx8IHBpcGVzZW5kKSB7ICAgICAgICAvKiAvUkVTVEFSVCAqLworI2lmZGVmIEZUUF9SRVNUQVJUCisgICAgICAgIGlmIChyZXN0YXJ0KSB7ICAgICAgICAgICAgICAgICAgLyogd2l0aCBwaXBlcyBvciBmaWx0ZXJzICovCisgICAgICAgICAgICBwcmludGYoIj9Td2l0Y2ggY29uZmxpY3Q6IC9GSUxURVIgb3IgL0NPTU1BTkQgYW5kIC9SRUNPVkVSXG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgIH0KKyNlbmRpZiAvKiBGVFBfUkVTVEFSVCAqLworICAgICAgICBpZiAocHZbU05EX1VQRF0uaXZhbCA+IDAgfHwgeF9mbmMgPT0gWFlGWF9NIHx8IHhfZm5jID09IFhZRlhfVSkgeworICAgICAgICAgICAgcHJpbnRmKAorCQkiP1N3aXRjaCBjb25mbGljdDogL0ZJTFRFUiBvciAvQ09NTUFORCBhbmQgRGF0ZSBDaGVja2luZ1xuIik7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyAgICB0ZmMgPSAwTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHN0YXRzIGFuZCBjb3VudGVycyAqLworICAgIGZpbGNudCA9IDA7CisgICAgcGt0bnVtID0gMDsKKyAgICBycGFja2V0cyA9IDBMOworCisgICAgaWYgKHB2W1NORF9GSUxdLml2YWwgPiAwKSB7CisgICAgICAgIGlmICh6b3BlbmkoWk1GSUxFLHB2W1NORF9GSUxdLnN2YWwpIDwgMSkgeworICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCBjYW4ndCBvcGVuIGxpc3RmaWxlIixwdltTTkRfRklMXS5zdmFsLGVycm5vKTsKKyAgICAgICAgICAgIHByaW50ZigiP0ZhaWx1cmUgdG8gb3BlbiBsaXN0ZmlsZSAtIFwiJXNcIlxuIixwdltTTkRfRklMXS5zdmFsKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHpzaW5sKFpNRklMRSx0bXBidWYsQ0tNQVhQQVRIKSA8IDApIHsgLyogUmVhZCBhIGxpbmUgKi8KKyAgICAgICAgICAgIHpjbG9zZShaTUZJTEUpOyAgICAgICAgICAgICAgICAgICAgICAgLyogRmFpbGVkICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgZ2V0IGxpc3RmaWxlIEVPRiIscHZbU05EX0ZJTF0uc3ZhbCwwKTsKKyAgICAgICAgICAgIHByaW50ZigiP0VtcHR5IGxpc3RmaWxlIC0gXCIlc1wiXG4iLHB2W1NORF9GSUxdLnN2YWwpOworICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgfQorICAgICAgICBsaXN0ZmlsZSA9IDE7CisgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBnZXQgbGlzdGZpbGUgZmlyc3QiLHRtcGJ1ZiwwKTsKKyAgICAgICAgbWFrZXN0cigmKG1nZXRsaXN0WzBdKSx0bXBidWYpOworICAgIH0KKyAgICB0MCA9IGdtc3RpbWVyKCk7ICAgICAgICAgICAgICAgICAgICAvKiBSZWNvcmQgc3RhcnRpbmcgdGltZSAqLworCisgICAgdXBkYXRpbmcgPSAwOwkJCS8qIENoZWNraW5nIGRhdGVzPyAqLworICAgIGlmIChwdltTTkRfVVBEXS5pdmFsID4gMCB8fCAoIW1kZWwgJiYgeF9mbmMgPT0gWFlGWF9VKSkKKyAgICAgIHVwZGF0aW5nID0gMTsKKyAgICBpZiAocHZbU05EX0RJRl0uaXZhbCA+IDAgfHwgeF9mbmMgPT0gWFlGWF9NKQorICAgICAgdXBkYXRpbmcgPSAyOworICAgIGlmICh1cGRhdGluZykJCQkvKiBUaGVzZSBzd2l0Y2hlcyBmb3JjZSBGVFAgREFURVMgT04gKi8KKyAgICAgIGZ0cF9kYXRlcyB8PSAyOworCisgICAgd2hhdCA9IG1kZWwgPyBXX0ZUUHxXX0ZUX0RFTEUgOiBXX1JFQ1Z8V19GVFA7IC8qIFdoYXQgd2UncmUgZG9pbmcgKi8KKworICAgIGNhbmNlbGdyb3VwID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIEdyb3VwIG5vdCBjYW5jZWxlZCB5ZXQgKi8KKyAgICBpZiAoISh4ZmVybW9kZSA9PSBYTU9ERV9BICYmIHBhdHRlcm5zICYmIGdldF9hdXRvICYmICFmb3JjZXR5cGUpKQorICAgICAgY2hhbmdldHlwZShmdHBfdHlwLDApOwkJLyogQ2hhbmdlIHRvIHJlcXVlc3RlZCB0eXBlICovCisgICAgYmluYXJ5ID0gZnRwX3R5cDsgICAgICAgICAgICAgICAgICAgLyogRm9yIGZpbGUtdHJhbnNmZXIgZGlzcGxheSAqLworICAgIGZpcnN0ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBNR0VUIGxpc3QgKi8KKyAgICBkb25lID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb29wIGNvbnRyb2wgKi8KKworI2lmZGVmIENLX1RNUERJUgorICAgIGlmIChkbGRpciAmJiAhZl90bXBkaXIpIHsgICAgICAgICAgIC8qIElmIHRoZXkgaGF2ZSBhIGRvd25sb2FkIGRpcmVjdG9yeSAqLworICAgICAgICBpZiAoKHMgPSB6Z3RkaXIoKSkpIHsgICAgICAgICAgIC8qIEdldCBjdXJyZW50IGRpcmVjdG9yeSAqLworICAgICAgICAgICAgaWYgKHpjaGRpcihkbGRpcikpIHsgICAgICAgIC8qIENoYW5nZSB0byBkb3dubG9hZCBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgICAgICBja3N0cm5jcHkoc2F2ZGlyLHMsVE1QRElSTEVOKTsKKyAgICAgICAgICAgICAgICBmX3RtcGRpciA9IDE7ICAgICAgICAgICAvKiBSZW1lbWJlciB0aGF0IHdlIGRpZCB0aGlzICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tfVE1QRElSICovCisKKyAgICBpZiAoZnRwX25tbCkgeyAgICAgICAgICAgICAgICAgICAgICAvKiAvTkFNRUxJU1QgKi8KKyAgICAgICAgZGVidWcoRjExMCwiZnRwIEdFVCBmdHBfbm1sIixmdHBfbm1sLDApOworICAgICAgICBpZiAoZnRwX25tbFswXSA9PSAnLScgJiYgZnRwX25tbFsxXSA9PSAwKQorICAgICAgICAgIGZwX25tbCA9IHN0ZG91dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZwX25tbCA9IGZvcGVuKGZ0cF9ubWwsICJ3YiIpOworICAgICAgICBpZiAoIWZwX25tbCkgeworICAgICAgICAgICAgcHJpbnRmKCI/JXM6ICVzXG4iLGZ0cF9ubWwsY2tfZXJyc3RyKCkpOworICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoIWRvbmUgJiYgIWNhbmNlbGdyb3VwKSB7ICAgICAvKiBMb29wIGZvciBhbGwgZmlsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvciB1bnRpbCBjYW5jZWxlZC4gKi8KKyNpZmRlZiBGVFBfUFJPWFkKKyAgICAgICAgLyogZG8gc29tZXRoaW5nIGhlcmUgaWYgcHJveHkgKi8KKyNlbmRpZiAvKiBGVFBfUFJPWFkgKi8KKworICAgICAgICByc19sZW4gPSAwTDsgICAgICAgICAgICAgICAgICAgIC8qIFJFR0VUIHBvc2l0aW9uICovCisgICAgICAgIGNhbmNlbGZpbGUgPSAwOyAgICAgICAgICAgICAgICAgLyogVGhpcyBmaWxlIG5vdCBjYW5jZWxlZCB5ZXQgKi8KKyAgICAgICAgaGFzcGF0aCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBSZWNhbGN1bGF0ZSB0aGlzIGVhY2ggdGltZSB0aHJ1ICovCisKKyAgICAgICAgaWYgKGdldG9uZSkgeyAgICAgICAgICAgICAgICAgICAvKiBHRVQgKi8KKyAgICAgICAgICAgIGNoYXIgKiBwOworICAgICAgICAgICAgcyA9IGxpbmU7CisgICAgICAgICAgICBzcmMgPSBsaW5lOyAgICAgICAgICAgICAgICAgLyogU2VydmVyIG5hbWUgKi8KKyAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCBmaWxlIixzLDApOworICAgICAgICB9IGVsc2UgaWYgKG1nZXQpIHsgICAgICAgICAgICAgIC8qIE1HRVQgKi8KKyAgICAgICAgICAgIHNyYyA9IG1nZXRsaXN0W21nZXR4XTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBtZ2V0IHJlbW90ZV9maWxlcyBBIixzcmMsZmlyc3QpOworICAgICAgICAgICAgcyA9IChjaGFyICopcmVtb3RlX2ZpbGVzKGZpcnN0LAorCQkJCSAgICAgKENIQVIgKiltZ2V0bGlzdFttZ2V0eF0sCisJCQkJICAgICAoQ0hBUiAqKXB2W1NORF9QQVRdLnN2YWwsCisJCQkJICAgICAwCisJCQkJICAgICApOworICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIG1nZXQgcmVtb3RlX2ZpbGVzIEIiLHMsMCk7CisgICAgICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgICAgIGlmICghKnMpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RmaWxlKSB7CQkvKiBOYW1lcyBmcm9tIGxpc3RmaWxlICovCisgICAgICAgICAgICAgICAgICBhZ2FpbjoKKyAgICAgICAgICAgICAgICAgICAgdG1wYnVmWzBdID0gTlVMOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXRtcGJ1ZlswXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpzaW5sKFpNRklMRSx0bXBidWYsQ0tNQVhQQVRIKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Y2xvc2UoWk1GSUxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgZ2V0IGxpc3RmaWxlIEVPRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZbU05EX0ZJTF0uc3ZhbCwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCYobWdldGxpc3RbMF0pLE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkb25lKQorICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJihtZ2V0bGlzdFswXSksdG1wYnVmKTsKKwkJICAgIGRlYnVnKEYxMTAsImZ0cCBnZXQgbGlzdGZpbGUgbmV4dCIsdG1wYnVmLDApOworICAgICAgICAgICAgICAgICAgICBzID0gKGNoYXIgKilyZW1vdGVfZmlsZXMoZmlyc3QsCisJCQkJCSAgICAgKENIQVIgKiltZ2V0bGlzdFswXSwKKwkJCQkJICAgICAoQ0hBUiAqKXB2W1NORF9QQVRdLnN2YWwsCisJCQkJCSAgICAgMAorCQkJCQkgICAgICk7CisJCSAgICBkZWJ1ZyhGMTEwLCJmdHAgbWdldCByZW1vdGVfZmlsZXMgQyIscywwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdHNjcmVlbihTQ1JfRk4sJ0YnLDBMLHMpOworICAgICAgICAgICAgICAgICAgICAgICAgZnRzY3JlZW4oU0NSX1NULFNUX01TRywwTCwiRmlsZSBub3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRsb2coRjExMCwiZnRwIGdldCBmaWxlIG5vdCBmb3VuZDoiLHMsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGFnYWluOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsJCS8qIE5hbWVzIGZyb20gY29tbWFuZCBsaW5lICovCisgICAgICAgICAgICAgICAgICAgIG1nZXR4Kys7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZ2V0eCA8IG1nZXRuKQorCQkgICAgICBzID0gKGNoYXIgKilyZW1vdGVfZmlsZXMoZmlyc3QsCisJCQkJCSAgICAgICAoQ0hBUiAqKW1nZXRsaXN0W21nZXR4XSwKKwkJCQkJICAgICAgIChDSEFSICopcHZbU05EX1BBVF0uc3ZhbCwKKwkJCQkJICAgICAgIDAKKwkJCQkJICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKwkJICAgICAgcyA9IE5VTEw7CisJCSAgICBpZiAoIXMpIG1nZXR4Kys7CisJCSAgICBkZWJ1ZyhGMTExLCJmdHAgbWdldCByZW1vdGVfZmlsZXMgRCIscyxtZ2V0eCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghcykgeworCQkgICAgaWYgKCFmaXJzdCB8fCBtZ2V0eCA+PSBtZ2V0bikgeworCQkJZG9uZSA9IDE7CisJCQlicmVhazsKKwkJICAgIH0gZWxzZSBpZiAoZ2V0ZXJyb3IpIHsKKwkJCXN0YXR1cyA9IDA7CisJCQlkb25lID0gMTsKKwkJCWJyZWFrOworCQkgICAgfSBlbHNlIHsKKwkJCWNvbnRpbnVlOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCWRlYnVnKEYxMTEsImZ0cCBtZ2V0IHJlbW90ZV9maWxlcyBFIixzLDApOworICAgICAgICAvKgorICAgICAgICAgIFRoZSBzZW1hbnRpY3Mgb2YgTkxTVCBhcmUgaWxsLWRlZmluZWQuICBTdXBwb3NlIHdlIGhhdmUganVzdCBzZW50CisgICAgICAgICAgTkxTVCAvcGF0aC9bYS16XSouICBNb3N0IHNlcnZlcnMgc2VuZCBiYWNrIG5hbWVzIGxpa2UgL3BhdGgvZm9vLAorICAgICAgICAgIC9wYXRoL2JhciwgZXRjLiAgQnV0IHNvbWUgc2VuZCBiYWNrIG9ubHkgZm9vIGFuZCBiYXIsIGFuZCBzdWJzZXF1ZW50CisgICAgICAgICAgUkVUUiBjb21tYW5kcyBiYXNlZCBvbiB0aGUgcGF0aGxlc3MgbmFtZXMgYXJlIG5vdCBnb2luZyB0byB3b3JrLgorICAgICAgICAqLworICAgICAgICBpZiAoc2VydmVydHlwZSA9PSBTWVNfVU5JWCAmJiAhY2tzdHJjaHIocywnLycpKSB7CisgICAgICAgICAgICBjaGFyICogczM7CisgICAgICAgICAgICBpZiAoKHMzID0gY2tzdHJyY2hyKG1nZXRsaXN0W21nZXR4XSwnLycpKSkgeworICAgICAgICAgICAgICAgIGludCBsZW4sIGxlZnQgPSA0MDk2OworICAgICAgICAgICAgICAgIGNoYXIgKiB0bXAgPSB4dG1wYnVmOworICAgICAgICAgICAgICAgIGxlbiA9IHMzIC0gbWdldGxpc3RbbWdldHhdICsgMTsKKyAgICAgICAgICAgICAgICBja3N0cm5jcHkodG1wLG1nZXRsaXN0W21nZXR4XSxsZWZ0KTsKKyAgICAgICAgICAgICAgICB0bXAgKz0gbGVuOworICAgICAgICAgICAgICAgIGxlZnQgLT0gbGVuOworICAgICAgICAgICAgICAgIGNrc3RybmNweSh0bXAscyxsZWZ0KTsKKyAgICAgICAgICAgICAgICBzID0geHRtcGJ1ZjsKKwkJZGVidWcoRjExMSwiZnRwIG1nZXQgcmVtb3RlX2ZpbGVzIEYiLHMsMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSAwOworICAgICAgICBza2lwdGhpcyA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgc2VsZWN0aW9uLi4uICovCisgICAgICAgIG1zZyA9ICIiOworICAgICAgICBuYW0gPSBzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGVuYW1lICh3aXRob3V0IHBhdGgpICovCisgICAgICAgIHJjID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbCByZXR1cm4gY29kZSAqLworICAgICAgICBzMiA9ICIiOworCisgICAgICAgIGlmICghZ2V0b25lICYmICFza2lwdGhpcykgeyAgICAgLyogRm9yIE1HRVQgYW5kIE1ERUxFVEUuLi4gKi8KKyAgICAgICAgICAgIGNoYXIgYywgKiBwID0gczsKKyAgICAgICAgICAgIGludCBzcnZwYXRoID0gMDsKKyAgICAgICAgICAgIGludCB1c3JwYXRoID0gMDsKKyAgICAgICAgICAgIGludCBpLCBrID0gMDsKKworCSAgICBkZWJ1ZyhGMTExLCJmdHAgbWdldCBoYXZldHlwZSIscyxoYXZldHlwZSk7CisJICAgIGlmIChoYXZldHlwZSA+IDAgJiYgaGF2ZXR5cGUgIT0gRlRZUF9GSUxFKSB7CisJCS8qIFNlcnZlciBzYXlzIGl0J3Mgbm90IGZpbGUuLi4gKi8KKwkJZGVidWcoRjExMCwiZnRwIG1nZXQgbm90LWEtZmlsZSIscywwKTsKKwkJY29udGludWU7CisJICAgIH0KKy8qCisgIEV4cGxhbmF0aW9uOiBTb21lIGZ0cCBzZXJ2ZXJzIChzdWNoIGFzIHd1LWZ0cGQpIHJldHVybiBhIHJlY3Vyc2l2ZSBsaXN0LgorICBCdXQgaWYgdGhlIGNsaWVudCBkaWQgbm90IGFzayBmb3IgYSByZWN1cnNpdmUgbGlzdCwgd2UgaGF2ZSB0byBpZ25vcmUgYW55CisgIHNlcnZlciBmaWxlcyB0aGF0IGluY2x1ZGUgYSBwYXRobmFtZSB0aGF0IGV4dGVuZHMgYmV5b25kIGFueSBwYXRoIHRoYXQKKyAgd2FzIGluY2x1ZGVkIGluIHRoZSB1c2VyJ3MgcmVxdWVzdC4KKworICBVc2VyJ3MgZmlsZXNwZWMgaXMgYmxhaCBvciBwYXRoL2JsYWggKG9yIG90aGVyIG5vbi1VTklYIHN5bnRheCkuICBXZSBuZWVkIHRvCisgIGdldCB0aGUgdXNlcidzIHBhdGggc2VnbWVudC4gIFRoZW4sIGZvciBlYWNoIGluY29taW5nIGZpbGUsIGlmIGl0IGJlZ2lucworICB3aXRoIHRoZSBzYW1lIHBhdGggc2VnbWVudCwgd2UgbXVzdCBzdHJpcCBpdCAocG9pbnQgcGFzdCBpdCkuCisqLworICAgICAgICAgICAgc3JjID0gbWdldGxpc3RbbWdldHhdOyAgICAgIC8qIEluIGNhc2UgaXQgbW92ZWQhICovCisJICAgIGlmIChzcmMpIHsKKwkJZm9yIChpID0gMDsgc3JjW2ldOyBpKyspIHsgLyogRmluZCByaWdodG1vc3QgcGF0aCBzZXBhcmF0b3IgKi8KKwkJICAgIGlmIChpc3BhdGhzZXAoc3JjW2ldKSkgLyogaW4gdXNlcidzIHBhdGhuYW1lICovCisJCSAgICAgIGsgPSBpICsgMTsKKwkJfQorCSAgICB9IGVsc2UgeworCQlzcmMgPSAiIjsKKwkgICAgfQorICAgICAgICAgICAgdXNycGF0aCA9IGs7ICAgICAgICAgICAgICAgIC8qIFVzZXIgcGF0aCBzZWdtZW50IGxlbmd0aCAqLworICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCB1c3JwYXRoIixzcmMsdXNycGF0aCk7CisKKyAgICAgICAgICAgIHAgPSBzOyAgICAgICAgICAgICAgICAgICAgICAvKiBTZXJ2ZXIgZmlsZW5hbWUgKi8KKyAgICAgICAgICAgIHdoaWxlICgoYyA9ICpwKyspKSB7ICAgICAgICAvKiBMb29rIGZvciBwYXRoIGluIHNlcnZlciBmaWxlbmFtZSAqLworICAgICAgICAgICAgICAgIGlmIChpc3BhdGhzZXAoYykpIHsKKwkJICAgIC8qIGhhc3BhdGgrKzsgKi8KKyAgICAgICAgICAgICAgICAgICAgbmFtID0gcDsgICAgICAgICAgICAvKiBQYXRobGVzcyBuYW1lIChmb3IgY2ttYXRjaCkgKi8KKyAgICAgICAgICAgICAgICAgICAgc3J2cGF0aCA9IHAgLSBzOyAgICAvKiBTZXJ2ZXIgcGF0aCBzZWdtZW50IGxlbmd0aCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBnZXQgc3J2cGF0aCIscyxzcnZwYXRoKTsKKworCSAgICBpZiAodXNycGF0aCA9PSAwKSB7CisvKgorICBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdXNlciBzYWlkICJtZ2V0IGZvbyIgd2hlcmUgZm9vIGlzIGEKKyAgZGlyZWN0b3J5IG5hbWUsIGFuZCB0aGUgc2VydmVyIGlzIHNlbmRpbmcgYmFjayBuYW1lcyBsaWtlICJmb28vZmlsZTEiLAorICAiZm9vL2ZpbGUyIiwgZXRjLiAgVGhpcyBpcyBhIG5hc3R5IHRyaWNrIGJ1dCBpdCdzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZQorICB1c2VyIGNhbid0IGNvbXBlbnNhdGUgYnkgdHlwaW5nICJtZ2V0IGZvby8iIGJlY2F1c2UgdGhlbiB0aGUgc2VydmVyIGlzCisgIGxpa2VseSB0byBzZW5kIGJhY2sgImZvby8vZmlsZTEsIGZvby8vZmlsZTIiIGV0YywgYW5kIHdlIHN0aWxsIHdvbid0CisgIGdldCBhIG1hdGNoLi4uCisqLworCQlpbnQgc3JjbGVuID0gMCwgc3J2bGVuID0gMDsKKwkJaWYgKHNyYykgc3JjbGVuID0gc3RybGVuKHNyYyk7CisJCWlmIChzKSBzcnZsZW4gPSBzdHJsZW4ocyk7CisJCWlmIChzcmMgJiYgKHNydmxlbiA+IHNyY2xlbikpIHsKKwkJICAgIGlmICghc3RybmNtcChzcmMscyxzcmNsZW4pICYmIGlzcGF0aHNlcChzW3NyY2xlbl0pKSB7CisJCQljaGFyICogdG1wc3JjID0gTlVMTDsKKwkJCXRtcHNyYyA9IChjaGFyICopbWFsbG9jKHNyY2xlbiArIDIpOworCQkJc3RybmNweSh0bXBzcmMsc3JjLHNyY2xlbik7CisJCQl0bXBzcmNbc3JjbGVuXSA9IHNbc3JjbGVuXTsKKwkJCXRtcHNyY1tzcmNsZW4rMV0gPSBOVUw7CisJCQlmcmVlKG1nZXRsaXN0W21nZXR4XSk7CisJCQltZ2V0bGlzdFttZ2V0eF0gPSB0bXBzcmM7CisJCQl0bXBzcmMgPSBOVUxMOworCQkJc3JjID0gbWdldGxpc3RbbWdldHhdOworCQkJdXNycGF0aCA9IHNyY2xlbisxOworCQkgICAgfQkJCSAgICAgIAorCQl9CisJICAgIH0KKy8qCisgIElmIGFzLW5hbWUgbm90IGdpdmVuIGFuZCBzZXJ2ZXIgZmlsZW5hbWUgaW5jbHVkZXMgcGF0aCB0aGF0IG1hdGNoZXMKKyAgdGhlIHBhdGhuYW1lIGZyb20gdGhlIHVzZXIncyBmaWxlIHNwZWNpZmljYXRpb24sIHdlIG11c3QgdHJpbSB0aGUgY29tbW9uCisgIHBhdGggcHJlZml4IGZyb20gdGhlIHNlcnZlcidzIG5hbWUgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGxvY2FsIG5hbWUuCisqLworICAgICAgICAgICAgaWYgKHNyYyAmJgkJCS8qIFdlZCBTZXAgMjUgMTc6Mjc6NDggMjAwMiAqLworCQkhYXNuYW1idWZbMF0gJiYKKwkJIXJlY3Vyc2l2ZSAmJgkJLyogVGh1IFNlcCAxOSAxNjoxMTo1OSAyMDAyICovCisJCShzcnZwYXRoID4gMCkgJiYKKwkJIXN0cm5jbXAoc3JjLHMsdXNycGF0aCkpIHsKKyAgICAgICAgICAgICAgICBzMiA9IHMgKyB1c3JwYXRoOyAgICAgICAvKiBMb2NhbCBuYW1lIHNraXBzIHBhc3QgcmVtb3RlIHBhdGggKi8KKyAgICAgICAgICAgIH0KKyNpZmRlZiBDT01NRU5UCisJICAgIC8qIFRoaXMgZG9lc24ndCB3b3JrIGlmIHRoZSBwYXRoIHByZWZpeCBjb250YWlucyB3aWxkY2FyZHMhICovCisJICAgIGhhc3BhdGggPSAoc3J2cGF0aCA+IHVzcnBhdGgpOworI2Vsc2UKKwkgICAgewkJCQkvKiBDb3VudCBwYXRoIHNlZ21lbnRzIGluc3RlYWQgKi8KKwkJaW50IHgxID0gMCwgeDIgPSAwOworCQljaGFyICpwOworCQlmb3IgKHAgPSBzOyAqcDsgcCsrKQorCQkgIGlmIChpc3BhdGhzZXAoKnApKSB4MSsrOworCQlmb3IgKHAgPSBzcmM7ICpwOyBwKyspIHsKKwkJICAgIGlmIChpc3BhdGhzZXAoKnApKSB4MisrOworCQl9CisJCWhhc3BhdGggPSByZWN1cnNpdmUgPyB4MSB8fCB4MiA6IHgxID4geDI7CisJCWRlYnVnKEYxMTEsImZ0cCBnZXQgc2VydmVyIHBhdGggc2VnbWVudHMiLHMseDEpOworCQlkZWJ1ZyhGMTExLCJmdHAgZ2V0IHVzZXIgICBwYXRoIHNlZ21lbnRzIixzcmMseDIpOworCSAgICB9CisKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgZ2V0IGhhc3BhdGgiLHMrdXNycGF0aCxoYXNwYXRoKTsKKworICAgICAgICAgICAgaWYgKGhhc3BhdGgpIHsgICAgICAgICAgICAgIC8qIFNlcnZlciBmaWxlIGhhcyBwYXRoIHNlZ21lbnRzPyAqLworICAgICAgICAgICAgICAgIGlmICghcmVjdXJzaXZlKSB7ICAgICAgIC8qIFtNXUdFVCAvUkVDVVJTSVZFPyAqLworLyoKKyAgV2UgZGlkIG5vdCBhc2sgZm9yIGEgcmVjdXJzaXZlIGxpc3RpbmcsIGJ1dCB0aGUgc2VydmVyIGlzIHNlbmRpbmcgdXMgb25lCisgIGFueXdheSAoYXMgd3UtZnRwZCBpcyB3b250IHRvIGRvKS4gIFdlIGdldCBoZXJlIGlmIHRoZSBjdXJyZW50IGZpbGVuYW1lCisgIGluY2x1ZGVzIGEgcGF0aCBzZWdtZW50IGJleW9uZCBhbnkgcGF0aCBzZWdtZW50IHdlIGFza2VkIGZvciBpbiBvdXIKKyAgbm9uLXJlY3Vyc2l2ZSBbTV1HRVQgY29tbWFuZC4gIFdlIE1VU1Qgc2tpcCB0aGlzIGZpbGUuCisqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgZ2V0IHNraXBwaW5nIGJlY2F1c2Ugb2YgcGF0aCIscywwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGdldG9uZSAmJiAhc2tpcHRoaXMpIHsgLyogR0VUIChub3QgTUdFVCkgKi8KKyAgICAgICAgICAgIGNoYXIgKiBwID0gbmFtOworCSAgICB3aGlsZSAoKGMgPSAqcCsrKSkgewkvKiBIYW5kbGUgcGF0aCBpbiBsb2NhbCBuYW1lICovCisJCWlmIChpc3BhdGhzZXAoYykpIHsKKwkJICAgIGlmIChyZWN1cnNpdmUpIHsJLyogSWYgcmVjdXJzaXZlLCBrZWVwIGl0ICovCisJCQloYXNwYXRoID0gMTsKKwkJCWJyZWFrOworCQkgICAgfSBlbHNlIHsJCS8qIE90aGVyd2lzZSBsb3NlIGl0LiAqLworCQkgICAgICBuYW0gPSBwOworCQkgICAgfQorCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzMiA9IG5hbTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISpuYW0pICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgd2l0aG91dCBwYXRoICovCisgICAgICAgICAgbmFtID0gczsKKworICAgICAgICBpZiAoIXNraXB0aGlzICYmIHB2W1NORF9OT0RdLml2YWwgPiAwKSB7IC8qIC9OT0RPVEZJTEVTICovCisgICAgICAgICAgICBpZiAobmFtWzBdID09ICcuJykKKwkgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNraXB0aGlzICYmIHJjdmV4Y2VwdFswXSkgeyAvKiAvRVhDRVBUOiBsaXN0ICovCisJICAgIGludCB4eDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOU05ERVhDRVBUOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJjdmV4Y2VwdFtpXSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisJCXh4ID0gY2ttYXRjaChyY3ZleGNlcHRbaV0sIG5hbSwgc2VydmVydHlwZSA9PSBTWVNfVU5JWCwgMSk7CisJCWRlYnVnKEYxMTEsImZ0cCBtZ2V0IC9leGNlcHQgbWF0Y2giLHJjdmV4Y2VwdFtpXSx4eCk7CisgICAgICAgICAgICAgICAgaWYgKHh4KSB7CisgICAgICAgICAgICAgICAgICAgIHRsb2coRjEwMCwiIHJlZnVzZWQ6IGV4Y2VwdGlvbiBsaXN0IiwiIiwwKTsKKwkJICAgIG1zZyA9ICJSZWZ1c2VkOiBFeGNlcHRpb24gTGlzdCI7CisgICAgICAgICAgICAgICAgICAgIHNraXB0aGlzKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXNraXB0aGlzICYmIHB2W1NORF9OT0JdLml2YWwgPiAwKSB7IC8qIC9OT0JBQ0tVUEZJTEVTICovCisgICAgICAgICAgICBpZiAoY2ttYXRjaCgKKyNpZmRlZiBDS1JFR0VYCisgICAgICAgICAgICAgICAgICAgICAgICAiKi5+WzAtOV0qfiIKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAiKi5+Kn4iCisjZW5kaWYgLyogQ0tSRUdFWCAqLworICAgICAgICAgICAgICAgICAgICAgICAgLG5hbSwwLDEpID4gMCkKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4X3hsYSkgeyAgICAgICAgICAgICAgICAgICAvKiBJZiB0cmFuc2xhdGlvbiBpcyBvZmYgKi8KKyAgICAgICAgICAgIHhfY3NsID0gLTI7ICAgICAgICAgICAgICAgICAvKiB1bnNldCB0aGUgY2hhcnNldHMgKi8KKyAgICAgICAgICAgIHhfY3NyID0gLTI7CisgICAgICAgIH0KKyAgICAgICAgY2tzdHJuY3B5KGZpbG5hbSxzLENLTUFYUEFUSCk7ICAvKiBGb3IgXHYoZmlsZW5hbWUpICovCisgICAgICAgIGlmICghKnMyKSAgICAgICAgICAgICAgICAgICAgICAgLyogTG9jYWwgbmFtZSAqLworICAgICAgICAgIHMyID0gYXNuYW1idWY7ICAgICAgICAgICAgICAgIC8qIEFzLW5hbWUgKi8KKworCWlmICghKnMyKQkJCS8qIFNhdCBOb3YgMTYgMTk6MTk6MzkgMjAwMiAqLworCSAgczIgPSByZWN1cnNpdmUgPyBzIDogbmFtOwkvKiBGcmkgSmFuIDEwIDEzOjE1OjE5IDIwMDMgKi8KKworICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgZ2V0IGZpbG5hbSAgIixzLDApOworICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgZ2V0IGFzbmFtZSBBIixzMiwwKTsKKworICAgICAgICAvKiBSZWNlaXZpbmcgdG8gcmVhbCBmaWxlICovCisgICAgICAgIGlmICghcGlwZXNlbmQgJiYKKyNpZmRlZiBQSVBFU0VORAorICAgICAgICAgICAgIXJjdmZpbHRlciAmJgorI2VuZGlmIC8qIFBJUEVTRU5EICovCisgICAgICAgICAgICAhdG9zY3JlZW4pIHsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgIC8qIERvIHRoaXMgaGVyZSBzbyB3ZSBjYW4gZGVjaWRlIHdoZXRoZXIgdG8gc2tpcCAqLworICAgICAgICAgICAgaWYgKGNtZF9xdW90aW5nICYmICFza2lwdGhpcyAmJiBhc25hbWJ1ZlswXSkgeworICAgICAgICAgICAgICAgIGludCBuOyBjaGFyICpwOworICAgICAgICAgICAgICAgIG4gPSBUTVBCVUZTSVo7CisgICAgICAgICAgICAgICAgcCA9IHRtcGJ1ZjsKKyAgICAgICAgICAgICAgICB6enN0cmluZyhhc25hbWJ1ZiwmcCwmbik7CisgICAgICAgICAgICAgICAgczIgPSB0bXBidWY7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCBhc25hbWUgQiIsczIsdXBkYXRpbmcpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKwkgICAgbG9jYWwgPSAqczIgPyBzMiA6IHM7CisKKwkgICAgaWYgKCFza2lwdGhpcyAmJiB4X2ZuYyA9PSBYWUZYX0QpIHsgLyogRmlsZSBDb2xsaXNpb24gPSBEaXNjYXJkICovCisJCWludCB4OworCQl4ID0gemNoa2kobG9jYWwpOworCQlkZWJ1ZyhGMTExLCJmdHAgZ2V0IERJU0NBUkQgemNoa2kiLGxvY2FsLHgpOworCQlpZiAoeCA+IC0xKSB7CisJCSAgICBza2lwdGhpcysrOworCQkgICAgZGVidWcoRjExMCwiZnRwIGdldCBza2lwIG5hbWUiLGxvY2FsLDApOworCQkgICAgdGxvZyhGMTAwLCIgcmVmdXNlZDogbmFtZSIsIiIsMCk7CisJCSAgICBtc2cgPSAiUmVmdXNlZDogTmFtZSI7CisJCX0KKwkgICAgfQorCisjaWZkZWYgRE9VUERBVEUKKyAgICAgICAgICAgIGlmICghc2tpcHRoaXMgJiYgdXBkYXRpbmcpIHsgLyogSWYgdXBkYXRpbmcgYW5kIG5vdCB5ZXQgc2tpcHBpbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAoemNoa2kobG9jYWwpID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGNoa21vZHRpbWUobG9jYWwscywwKTsKKyNpZmRlZiBERUJVRworCQkgICAgaWYgKGRlYmxvZykgeworCQkJaWYgKHVwZGF0aW5nID09IDIpCisJCQkgIGRlYnVnKEYxMTEsImZ0cCBnZXQgL2RhdGVzLWRpZmYgY2hrbW9kdGltZSIsbG9jYWwseCk7CisJCQllbHNlCisJCQkgIGRlYnVnKEYxMTEsImZ0cCBnZXQgL3VwZGF0ZSBjaGttb2R0aW1lIixsb2NhbCx4KTsKKwkJICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCQkgICAgaWYgKCh1cGRhdGluZyA9PSAxICYmIHggPiAwKSB8fCAgLyogL1VQREFURSAqLworCQkJKHVwZGF0aW5nID09IDIgJiYgeCA9PSAxKSkgeyAvKiAvREFURVMtRElGRkVSICovCisJCQlza2lwdGhpcysrOworCQkJdGxvZyhGMTAwLCIgcmVmdXNlZDogZGF0ZSIsIiIsMCk7CisJCQltc2cgPSAiUmVmdXNlZDogRGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgZ2V0IHNraXAgZGF0ZSIsbG9jYWwsMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogRE9VUERBVEUgKi8KKyAgICAgICAgfQorICAgICAgICAvKiBJbml0aWFsaXplIGZpbGUgc2l6ZSB0byAtMSBpbiBjYXNlIHNlcnZlciBkb2Vzbid0IHVuZGVyc3RhbmQgKi8KKyAgICAgICAgLyogU0laRSBjb21tYW5kLCBzbyB4eHNjcmVlbigpIHdpbGwga25vdyB3ZSBkb24ndCBrbm93IHRoZSBzaXplICovCisKKyAgICAgICAgZnNpemUgPSAtMUw7CisKKwkvKiBBc2sgZm9yIHNpemUgbm93IG9ubHkgaWYgd2UgbmVlZCBpdCBmb3Igc2VsZWN0aW9uICovCisJLyogYmVjYXVzZSBpZiB5b3UncmUgZ29pbmcgdGhydSBhIGxpc3QgMTAwLDAwMCBmaWxlcyB0byBzZWxlY3QgKi8KKwkvKiBhIHNtYWxsIHN1YnNldCwgMTAwLDAwMCBTSVpFIGNvbW1hbmRzIGNhbiB0YWtlIGhvdXJzLi4uICovCisKKwlnb3RzaXplID0gMDsKKyAgICAgICAgaWYgKCFtZGVsICYmICFza2lwdGhpcyAmJiAgICAgICAgLyogRG9uJ3QgbmVlZCBzaXplIGZvciBERUxFLi4uICovCisJICAgIChnZXRzbWFsbGVyID4gLTFMIHx8IGdldGxhcmdlciA+IC0xTCkpIHsKKwkgICAgaWYgKGhhdmVzaXplID4gLTFMKSB7CS8qIEFscmVhZHkgaGF2ZSBmaWxlIHNpemU/ICovCisJCWZzaXplID0gaGF2ZXNpemU7CisJCWdvdHNpemUgPSAxOworCSAgICB9IGVsc2UgewkJCS8qIE5vIC0gbXVzdCBhc2sgc2VydmVyICovCisJCS8qCisJCSAgUHJpb3IgdG8gc2VuZGluZyB0aGUgTkxTVCBjb21tYW5kIHdlIG5lY2Vzc2FyaWx5IHB1dCB0aGUKKwkJICBzZXJ2ZXIgaW50byBBU0NJSSBtb2RlLiAgV2UgbXVzdCBub3cgcHV0IGl0IGJhY2sgaW50byB0aGUKKwkJICB0aGUgcmVxdWVzdGVkIG1vZGUgc28gdGhlIHVwY29taW5nIFNJWkUgY29tbWFuZCByZXR1cm5zCisJCSAgcmlnaHQga2luZCBvZiBzaXplOyB0aGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvcgorCQkgIEdFVCAvUkVDT1ZFUjsgb3RoZXJ3aXNlIHRoZSBzZXJ2ZXIgcmV0dXJucyB0aGUgIkFTQ0lJIiBzaXplCisJCSAgb2YgdGhlIGZpbGUsIHJhdGhlciB0aGFuIGl0cyB0cnVlIHNpemUuCisJCSovCisJCWNoYW5nZXR5cGUoZnRwX3R5cCwwKTsJLyogQ2hhbmdlIHRvIHJlcXVlc3RlZCB0eXBlICovCisJCWZzaXplID0gLTFMOworCQlpZiAoc2l6ZW9rKSB7CisJCSAgICB4ID0gZnRwY21kKCJTSVpFIixzLHhfY3NsLHhfY3NyLGZ0cF92Ym0pOworCQkgICAgaWYgKHggPT0gUkVQTFlfQ09NUExFVEUpIHsKKwkJCWZzaXplID0gYXRvbCgmZnRwX3JlcGx5X3N0cls0XSk7CisJCQlnb3RzaXplID0gMTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisgICAgICAgICAgICBpZiAoZ290c2l6ZSkgeworICAgICAgICAgICAgICAgIGlmIChnZXRzbWFsbGVyID4gLTFMICYmIGZzaXplID49IGdldHNtYWxsZXIpCisgICAgICAgICAgICAgICAgICBza2lwdGhpcysrOworICAgICAgICAgICAgICAgIGlmIChnZXRsYXJnZXIgPiAtMUwgJiYgZnNpemUgPD0gZ2V0bGFyZ2VyKQorICAgICAgICAgICAgICAgICAgc2tpcHRoaXMrKzsKKyAgICAgICAgICAgICAgICBpZiAoc2tpcHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCBza2lwIHNpemUiLHMsZnNpemUpOworICAgICAgICAgICAgICAgICAgICB0bG9nKEYxMDAsIiByZWZ1c2VkOiBzaXplIiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gIlJlZnVzZWQ6IFNpemUiOworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICB9IGVsc2UgaWYgKGdldG9uZSkgeworICAgICAgICAgICAgICAgIC8qIFNJWkUgY2FuIGZhaWwgZm9yIG1hbnkgcmVhc29ucy4gIERvZXMgdGhlIGZpbGUgZXhpc3Q/ICovCisgICAgICAgICAgICAgICAgeCA9IGZ0cGNtZCgiTkxTVCIscyx4X2NzbCx4X2NzcixmdHBfdmJtKTsKKyAgICAgICAgICAgICAgICBpZiAoeCAhPSBSRVBMWV9DT01QTEVURSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj4+PiBGSUxFIE5PVCBGT1VORDogJXNcbiIscyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNraXB0aGlzKSB7ICAgICAgICAgICAgICAgICAvKiBTa2lwcGluZyB0aGlzIGZpbGU/ICovCisgICAgICAgICAgICBmdHNjcmVlbihTQ1JfRk4sJ0YnLDBMLHMpOworICAgICAgICAgICAgaWYgKG1zZykKKyAgICAgICAgICAgICAgZnRzY3JlZW4oU0NSX1NULFNUX0VSUiwwTCxtc2cpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmdHNjcmVlbihTQ1JfU1QsU1RfU0tJUCwwTCxzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChmcF9ubWwpIHsgICAgICAgICAgICAgICAgICAgLyogL05BTUVMSVNUIG9ubHkgLSBubyB0cmFuc2ZlciAqLworICAgICAgICAgICAgZnByaW50ZihmcF9ubWwsIiVzXG4iLHMpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlY3Vyc2l2ZSAmJiBoYXNwYXRoICYmICFwaXBlc2VuZAorI2lmZGVmIFBJUEVTRU5ECisgICAgICAgICAgICAmJiAhcmN2ZmlsdGVyCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyAgICAgICAgICAgICkgeworCSAgICBpbnQgeDsKKworI2lmZGVmIE5PTUtESVIKKwkgICAgeCA9IC0xOworI2Vsc2UKKyAgICAgICAgICAgIHggPSB6bWtkaXIocyk7CQkvKiBUcnkgdG8gbWFrZSB0aGUgZGlyZWN0b3J5ICovCisjZW5kaWYgLyogTk9NS0RJUiAqLworCisgICAgICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgICAgICByYyA9IC0xOyAgICAgICAgICAgICAgICAvKiBGYWlsdXJlIGlzIGZhdGFsICovCisgICAgICAgICAgICAgICAgaWYgKGdldGVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZ0c2NyZWVuKFNDUl9FTSwwLDBMLCJEaXJlY3RvcnkgY3JlYXRpb24gZmFpbHVyZSIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBOb3Qgc2tpcHBpbmcgKi8KKworCXNlbGVjdGVkKys7CQkJLyogQ291bnQgdGhpcyBmaWxlIGFzIHNlbGVjdGVkICovCisgICAgICAgIHBuID0gTlVMTDsKKworCWlmICghZ290c2l6ZSAmJiAhbWRlbCkgewkvKiBEaWRuJ3QgZ2V0IHNpemUgeWV0ICovCisJICAgIGlmIChoYXZlc2l6ZSA+IC0xTCkgewkvKiBBbHJlYWR5IGhhdmUgZmlsZSBzaXplPyAqLworCQlmc2l6ZSA9IGhhdmVzaXplOworCQlnb3RzaXplID0gMTsKKwkgICAgfSBlbHNlIHsJCQkvKiBObyAtIG11c3QgYXNrIHNlcnZlciAqLworCQlmc2l6ZSA9IC0xTDsKKwkJaWYgKHNpemVvaykgeworCQkgICAgeCA9IGZ0cGNtZCgiU0laRSIscyx4X2NzbCx4X2NzcixmdHBfdmJtKTsKKwkJICAgIGlmICh4ID09IFJFUExZX0NPTVBMRVRFKSB7CisJCQlmc2l6ZSA9IGF0b2woJmZ0cF9yZXBseV9zdHJbNF0pOworCQkJZ290c2l6ZSA9IDE7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICAgICAgaWYgKG1kZWwpIHsgICAgICAgICAgICAgICAgICAgICAvKiBbTV1ERUxFVEUgKi8KKyAgICAgICAgICAgIGlmIChkaXNwbGEgJiYgIWZ0cF92Ym0pCisgICAgICAgICAgICAgIHByaW50ZigiICVzLi4uIixzKTsKKyAgICAgICAgICAgIHJjID0KKyAgICAgICAgICAgICAoZnRwY21kKCJERUxFIixzLHhfY3NsLHhfY3NyLGZ0cF92Ym0pID09IFJFUExZX0NPTVBMRVRFKSA/IDEgOiAtMTsKKyAgICAgICAgICAgIGlmIChyYyA+IC0xKSB7CisgICAgICAgICAgICAgICAgdGxvZyhGMTEwLCJmdHAgbWRlbGV0ZSIscywwKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcGxhICYmICFmdHBfdmJtKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCJPS1xuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRsb2coRjExMCwiZnRwIG1kZWxldGUgZmFpbGVkOiIscywwKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcGxhKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCJGYWlsZWRcbiIpOworICAgICAgICAgICAgfQorI2lmbmRlZiBOT1NQTAorI2lmZGVmIFBJUEVTRU5ECisgICAgICAgIH0gZWxzZSBpZiAocmN2ZmlsdGVyKSB7ICAgICAgICAgLyogW01dR0VUIHdpdGggZmlsdGVyICovCisgICAgICAgICAgICBpbnQgbjsgY2hhciAqIHA7CisgICAgICAgICAgICBuID0gQ0tNQVhQQVRIOworICAgICAgICAgICAgcCA9IHRtcGJ1ZjsgICAgICAgICAgICAgICAgIC8qIFNhZmUgLSBubyBhc25hbWUgd2l0aCBmaWx0ZXIgKi8KKyAgICAgICAgICAgIHp6c3RyaW5nKHJjdmZpbHRlciwmcCwmbik7CisgICAgICAgICAgICBpZiAobiA+IC0xKQorICAgICAgICAgICAgICBwbiA9IHRtcGJ1ZjsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBnZXQgcmN2ZmlsdGVyIixwbixuKTsKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICBpZiAodG9zY3JlZW4pIHMyID0gIi0iOworICAgICAgICB9IGVsc2UgaWYgKHBpcGVzZW5kKSB7ICAgICAgICAgIC8qIFtNXUdFVCAvQ09NTUFORCAqLworICAgICAgICAgICAgaW50IG47IGNoYXIgKiBwOworICAgICAgICAgICAgbiA9IENLTUFYUEFUSDsKKyAgICAgICAgICAgIHAgPSB0bXBidWY7ICAgICAgICAgICAgICAgICAvKiBTYWZlIC0gbm8gYXNuYW1lIHdpdGggZmlsdGVyICovCisgICAgICAgICAgICB6enN0cmluZyhwaXBlbmFtZSwmcCwmbik7CisgICAgICAgICAgICBpZiAobiA+IC0xKQorICAgICAgICAgICAgICBwbiA9IHRtcGJ1ZjsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBnZXQgcGlwZW5hbWUiLHBpcGVuYW1lLG4pOworICAgICAgICAgICAgaWYgKHRvc2NyZWVuKSBzMiA9ICItIjsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBbTV1HRVQgd2l0aCBubyBwaXBlcyBvciBmaWx0ZXJzICovCisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgZ2V0IHMyIEEiLHMyLHhfY252KTsKKyAgICAgICAgICAgIGlmICh0b3NjcmVlbikgeworICAgICAgICAgICAgICAgIHMyID0gIi0iOyAgICAgICAgICAgICAgIC8qIChob2tleSBjb252ZW50aW9uIGZvciBzdGRvdXQpICovCisgICAgICAgICAgICB9IGVsc2UgaWYgKCEqczIpIHsgICAgICAgICAgLyogTm8gYXNuYW1lPyAqLworICAgICAgICAgICAgICAgIGlmICh4X2NudikgeyAgICAgICAgICAgIC8qIElmIGNvbnZlcnRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgbnpydG9sKHMsdG1wYnVmLHhfY252LDEsQ0tNQVhQQVRIKTsgLyogY29udmVydCAqLworICAgICAgICAgICAgICAgICAgICBzMiA9IHRtcGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIGdldCBuenJ0b2wiLHMyLDApOworICAgICAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSAqLworICAgICAgICAgICAgICAgICAgczIgPSBzOyAgICAgICAgICAgICAgIC8qIHVzZSBpbmNvbWluZyBmaWxlJ3MgbmFtZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIGdldCBzMiBCIixzMiwwKTsKKworICAgICAgICAgICAgLyogSWYgbG9jYWwgZmlsZSBhbHJlYWR5IGV4aXN0cywgdGFrZSBjb2xsaXNpb24gYWN0aW9uICovCisKKyAgICAgICAgICAgIGlmICghcGlwZXNlbmQgJiYKKyNpZmRlZiBQSVBFU0VORAorICAgICAgICAgICAgICAgICFyY3ZmaWx0ZXIgJiYKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworICAgICAgICAgICAgICAgICF0b3NjcmVlbikgeworICAgICAgICAgICAgICAgIHggPSB6Y2hraShzMik7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCB6Y2hraSIsczIseCk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCB4X2ZuYyIsczIseF9mbmMpOworCisgICAgICAgICAgICAgICAgaWYgKHggPiAtMSAmJiAhcmVzdGFydCkgeworCQkgICAgaW50IHggPSAtMTsKKwkJICAgIGNoYXIgKiBuZXduYW1lID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHhfZm5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYWUZYX0E6ICAgICAgLyogQXBwZW5kICovCisgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYWUZYX1I6ICAgICAgLyogUmVuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYWUZYX0I6CS8qIEJhY2t1cCAqLworCQkJem5ld24oczIsJm5ld25hbWUpOyAvKiBNYWtlIHVuaXF1ZSBuYW1lICovCisJCQlkZWJ1ZyhGMTEwLCJmdHAgZ2V0IHpuZXduIixuZXduYW1lLDApOworCQkJaWYgKHhfZm5jID09IFhZRlhfQikgeyAvKiBCYWNrdXAgZXhpc3RpbmcgZmlsZSAqLworCQkJICAgIHggPSB6cmVuYW1lKHMyLG5ld25hbWUpOworCQkJICAgIGRlYnVnKEYxMTEsImZ0cCBnZXQgYmFja3VwIHpyZW5hbWUiLG5ld25hbWUseCk7CisJCQl9IGVsc2UgeyAgICAgIC8qIFJlbmFtZSBpbmNvbWluZyBmaWxlICovCisJCQkgICAgeCA9IGNrc3RybmNweSh0bXBidWYsbmV3bmFtZSxDS01BWFBBVEgrMSk7CisJCQkgICAgczIgPSB0bXBidWY7CisJCQkgICAgZGVidWcoRjExMSwiZnRwIGdldCByZW5hbWUgaW5jb21pbmciLG5ld25hbWUseCk7CisJCQl9CisJCQlpZiAoeCA8IDApIHsKKwkJCSAgICBmdHNjcmVlbihTQ1JfRU0sMCwwTCwiQmFja3VwL1JlbmFtZSBmYWlsZWQiKTsKKwkJCSAgICB4ID0gMDsKKwkJCSAgICBnb3RvIHhnZXR4OworCQkJfQorCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYWUZYX0Q6ICAgICAgLyogRGlzY2FyZCAoYWxyZWFkeSBoYW5kbGVkIGFib3ZlKSAqLworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWFlGWF9VOiAgICAgIC8qIFVwZGF0ZSAoZGl0dG8pICovCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYWUZYX006ICAgICAgLyogVXBkYXRlIChkaXR0bykgKi8KKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhZRlhfWDogICAgICAvKiBPdmVyd3JpdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbWRlbCkgeworI2lmZGVmIFBJUEVTRU5ECisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgZ2V0IHBuIixwbixyY3ZmaWx0ZXIgPyAxIDogMCk7CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyAgICAgICAgICAgIGlmIChwaXBlc2VuZCAmJiAhdG9zY3JlZW4pCisgICAgICAgICAgICAgIHMyID0gTlVMTDsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgaWYgKGRlYmxvZykgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBnZXQgeF94bGEiLCIiLHhfeGxhKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJmdHAgZ2V0IHhfY3NsIiwiIix4X2NzbCk7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiZnRwIGdldCB4X2NzciIsIiIseF9jc3IpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBnZXQgYXBwZW5kIiwiIixhcHBlbmQpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyAgICAgICAgICAgIHJjID0gZ2V0ZmlsZShzLHMyLHJlc3RhcnQsYXBwZW5kLHBuLHhfeGxhLHhfY3NsLHhfY3NyKTsKKworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBpZiAoZGVibG9nKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCByYyIscyxyYyk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCBjYW5jZWxmaWxlIixzLGNhbmNlbGZpbGUpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBnZXQgY2FuY2VsZ3JvdXAiLHMsY2FuY2VsZ3JvdXApOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBnZXQgcmVuYW1pbmciLHMscmVuYW1pbmcpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHJjID4gLTEpIHsKKyAgICAgICAgICAgIGdvb2QrKzsKKyAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICBpZiAoIWNhbmNlbGZpbGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVsZXRpbmcpIHsgICAgICAgICAvKiBHRVQgL0RFTEVURSAoc291cmNlIGZpbGUpICovCisgICAgICAgICAgICAgICAgICAgIHJjID0KKyAgICAgICAgICAgICAgICAgICAgICAoZnRwY21kKCJERUxFIixzLHhfY3NsLHhfY3NyLGZ0cF92Ym0pID09IFJFUExZX0NPTVBMRVRFKQorICAgICAgICAgICAgICAgICAgICAgICAgPyAxIDogLTE7CisgICAgICAgICAgICAgICAgICAgIHRsb2coRjExMCwgKHJjID4gLTEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAiIGRlbGV0ZWQiIDogIiBmYWlsZWQgdG8gZGVsZXRlIiwgcywgMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZW5hbWluZyAmJiByY3ZfcmVuYW1lICYmICF0b3NjcmVlbikgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpwOyAgICAgICAgICAgIC8qIFJlbmFtZSBkb3dubG9hZGVkIGZpbGUgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICAgICAgY2hhciB0bXBidWZbQ0tNQVhQQVRIKzFdOworICAgICAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICAgICAgbiA9IENLTUFYUEFUSDsKKyAgICAgICAgICAgICAgICAgICAgcCA9IHRtcGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCAvcmVuYW1lIixyY3ZfcmVuYW1lLDApOworICAgICAgICAgICAgICAgICAgICB6enN0cmluZyhyY3ZfcmVuYW1lLCZwLCZuKTsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCAvcmVuYW1lIixyY3ZfcmVuYW1lLDApOworICAgICAgICAgICAgICAgICAgICBwID0gdG1wYnVmOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgcCA9IHJjdl9yZW5hbWU7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgICAgICAgICAgICAgcmMgPSAoenJlbmFtZShzMixwKSA8IDApID8gLTEgOiAxOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJkb2Z0cGdldCAvUkVOQU1FIHpyZW5hbWUiLHAscmMpOworICAgICAgICAgICAgICAgICAgICB0bG9nKEYxMTAsIChyYyA+IC0xKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIiByZW5hbWVkIHRvIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIiBmYWlsZWQgdG8gcmVuYW1lIHRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW92aW5nICYmIHJjdl9tb3ZlICYmICF0b3NjcmVlbikgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpwOyAgICAgICAgICAgIC8qIE1vdmUgZG93bmxvYWRlZCBmaWxlICovCisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgICAgICAgICAgIGNoYXIgdG1wYnVmW0NLTUFYUEFUSCsxXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAgICAgICAgIG4gPSBUTVBCVUZTSVo7CisgICAgICAgICAgICAgICAgICAgIHAgPSB0bXBidWY7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBnZXQgL21vdmUtdG8iLHJjdl9tb3ZlLDApOworICAgICAgICAgICAgICAgICAgICB6enN0cmluZyhyY3ZfbW92ZSwmcCwmbik7CisgICAgICAgICAgICAgICAgICAgIHAgPSB0bXBidWY7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBwID0gcmN2X21vdmU7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCAvbW92ZS10byIscCwwKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSAoenJlbmFtZShzMixwKSA8IDApID8gLTEgOiAxOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJkb2Z0cGdldCAvTU9WRSB6cmVuYW1lIixwLHJjKTsKKyAgICAgICAgICAgICAgICAgICAgdGxvZyhGMTEwLCAocmMgPiAtMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICIgbW92ZWQgdG8iIDogIiBmYWlsZWQgdG8gbW92ZSB0byIsIHAsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHZbU05EX1NSTl0uaXZhbCA+IDAgJiYgcHZbU05EX1NSTl0uc3ZhbCkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICogcyA9IHB2W1NORF9TUk5dLnN2YWw7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBzcnZybiA9IHB2W1NORF9TUk5dLnN2YWw7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgdG1wYnVmW0NLTUFYUEFUSCsxXTsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICAgICAgaW50IHk7ICAgICAgICAgICAgICAvKiBQYXNzIGl0IHRocnUgdGhlIGV2YWx1YXRvciAqLworICAgICAgICAgICAgICAgICAgICBleHRlcm4gaW50IGNtZF9xdW90aW5nOyAvKiBmb3IgXHYoZmlsZW5hbWUpICovCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBnZXQgc3J2X3JlbmFtIixzLDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjbWRfcXVvdGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgeSA9IENLTUFYUEFUSDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAoY2hhciAqKXRtcGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHp6c3RyaW5nKHNydnJuLCZzLCZ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAoY2hhciAqKXRtcGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBnZXQgc3J2X3JlbmFtIixzLDEpOworICAgICAgICAgICAgICAgICAgICBpZiAocykgaWYgKCpzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBmdHBfcmVuYW1lKHMyLHMpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIGdldCBmdHBfcmVuYW1lIixzMix4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRsb2coRjExMCwgKHggPiAwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVuYW1lZCBzb3VyY2UgZmlsZSB0byIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZhaWxlZCB0byByZW5hbWUgc291cmNlIGZpbGUgdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDEpCisJCQkgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbmNlbGZpbGUpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIGZ0cF9mYWkrKzsKKyAgICAgICAgICAgIGlmIChnZXRlcnJvcikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgZnRzY3JlZW4oU0NSX0VNLDAsMEwsIkZhdGFsIGRvd25sb2FkIGVycm9yIik7CisgICAgICAgICAgICAgICAgZG9uZSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworCWRlYnVnKEYxMDEsImZ0cCBnZXQgc3RhdHVzIiwiIixzdGF0dXMpOworCWRlYnVnKEYxMDEsImZ0cCBnZXQgY2FuY2VsZ3JvdXAiLCIiLGNhbmNlbGdyb3VwKTsKKwlkZWJ1ZyhGMTAxLCJmdHAgZ2V0IGNhbmNlbGZpbGUiLCIiLGNhbmNlbGZpbGUpOworCWRlYnVnKEYxMDEsImZ0cCBnZXQgc2VsZWN0ZWQiLCIiLHNlbGVjdGVkKTsKKwlkZWJ1ZyhGMTAxLCJmdHAgZ2V0IGdvb2QiLCIiLGdvb2QpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgaWYgKHNlbGVjdGVkID09IDApIHsJCS8qIE5vIGZpbGVzIG1ldCBzZWxlY3Rpb24gY3JpdGVyaWEgKi8KKwlzdGF0dXMgPSAxOwkJCS8qIHdoaWNoIGlzIGEga2luZCBvZiBzdWNjZXNzLiAqLworICAgIH0gZWxzZSBpZiAoc3RhdHVzID4gMCkgewkJLyogU29tZSBmaWxlcyB3ZXJlIHNlbGVjdGVkICovCisgICAgICAgIGlmIChjYW5jZWxncm91cCkJCS8qIGJ1dCBNR0VUIHdhcyBjYW5jZWxlZCAqLworICAgICAgICAgIHN0YXR1cyA9IDA7CQkJLyogc28gTUdFVCBmYWlsZWQgKi8KKyAgICAgICAgZWxzZSBpZiAoY2FuY2VsZmlsZSAmJiBnb29kIDwgMSkgLyogSWYgZmlsZSB3YXMgY2FuY2VsZWQgKi8KKyAgICAgICAgICBzdGF0dXMgPSAwOwkJCS8qIE1HRVQgZmFpbGVkIGlmIGl0IGdvdCBubyBmaWxlcyAqLworICAgIH0KKyAgICBzdWNjZXNzID0gc3RhdHVzOworICAgIHggPSBzdWNjZXNzOworICAgIGRlYnVnKEYxMDEsImZ0cCBnZXQgc3VjY2VzcyIsIiIsc3VjY2Vzcyk7CisKKyAgeGdldHg6CisgICAgcGlwZXNlbmQgPSBwaXBlc2F2ZTsgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBnbG9iYWwgcGlwZSBzZWxlY3Rpb24gKi8KKyAgICBpZiAoZnBfbm1sKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDbG9zZSAvTkFNRUxJU1QgKi8KKyAgICAgICAgaWYgKGZwX25tbCAhPSBzdGRvdXQpCisgICAgICAgICAgZmNsb3NlKGZwX25tbCk7CisgICAgICAgIGZwX25tbCA9IE5VTEw7CisgICAgfQorICAgIGlmICh4ID4gLTEpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIERvd25sb2FkIHN1Y2Nlc3NmdWwgKi8KKyNpZmRlZiBHRlRJTUVSCisgICAgICAgIHQxID0gZ21zdGltZXIoKTsgICAgICAgICAgICAgICAgLyogRW5kIHRpbWUgKi8KKyAgICAgICAgc2VjID0gKENLRkxPQVQpKChDS0ZMT0FUKSh0MSAtIHQwKSAvIDEwMDAuMCk7IC8qIFN0YXRzICovCisgICAgICAgIGlmICghc2VjKSBzZWMgPSAwLjAwMTsKKyAgICAgICAgZnB0c2VjcyA9IHNlYzsKKyNlbHNlCisgICAgICAgIHNlYyA9ICh0MSAtIHQwKSAvIDEwMDA7CisgICAgICAgIGlmICghc2VjKSBzZWMgPSAxOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyAgICAgICAgdGZjcHMgPSAobG9uZykgKHRmYyAvIHNlYyk7CisgICAgICAgIHRzZWNzID0gKGludClzZWM7CisgICAgICAgIGxhc3R4ZmVyID0gV19GVFB8V19SRUNWOworICAgICAgICB4ZmVyc3RhdCA9IHN1Y2Nlc3M7CisgICAgfQorICAgIGlmIChkcHlhY3RpdmUpCisgICAgICBmdHNjcmVlbihTQ1JfVEMsMCwwTCwiIik7CisjaWZkZWYgQ0tfVE1QRElSCisgICAgaWYgKGZfdG1wZGlyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgY2hhbmdlZCB0byBkb3dubG9hZCBkaXIgKi8KKyAgICAgICAgemNoZGlyKChjaGFyICopIHNhdmRpcik7ICAgICAgICAvKiBHbyBiYWNrIHdoZXJlIHdlIGNhbWUgZnJvbSAqLworICAgICAgICBmX3RtcGRpciA9IDA7CisgICAgfQorI2VuZGlmIC8qIENLX1RNUERJUiAqLworCisgICAgZm9yIChpID0gMDsgaSA8PSBTTkRfTUFYOyBpKyspIHsgICAgLyogRnJlZSBtYWxsb2MnZCBtZW1vcnkgKi8KKyAgICAgICAgaWYgKHB2W2ldLnN2YWwpCisgICAgICAgICAgZnJlZShwdltpXS5zdmFsKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG1nZXRuOyBpKyspICAgICAgICAgLyogTUdFVCBsaXN0IHRvbyAqLworICAgICAgbWFrZXN0cigmKG1nZXRsaXN0W2ldKSxOVUxMKTsKKworICAgIGlmIChjYW5jZWxncm91cCkJCQkvKiBDbGVhciB0ZW1wLWZpbGUgc3RhY2sgKi8KKyAgICAgIG1sc3Jlc2V0KCk7CisKKyAgICBmdHJlc2V0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVbmRvIHN3aXRjaCBlZmZlY3RzICovCisgICAgZHB5YWN0aXZlID0gMDsKKyAgICByZXR1cm4oeCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGZ0cHJtdFtdID0geworICAgIHsgImNkIiwgICAgICAgIFhaQ1dELCAwIH0sCisgICAgeyAiY2R1cCIsICAgICAgWFpDRFUsIDAgfSwKKyAgICB7ICJjd2QiLCAgICAgICBYWkNXRCwgQ01fSU5WIH0sCisgICAgeyAiZGVsZXRlIiwgICAgWFpERUwsIDAgfSwKKyAgICB7ICJkaXJlY3RvcnkiLCBYWkRJUiwgMCB9LAorICAgIHsgImV4aXQiLCAgICAgIFhaWElULCAwIH0sCisgICAgeyAiaGVscCIsICAgICAgWFpITFAsIDAgfSwKKyAgICB7ICJsb2dpbiIsICAgICBYWkxHSSwgMCB9LAorICAgIHsgImxvZ291dCIsICAgIFhaTEdPLCAwIH0sCisgICAgeyAibWtkaXIiLCAgICAgWFpNS0QsIDAgfSwKKyAgICB7ICJwd2QiLCAgICAgICBYWlBXRCwgMCB9LAorICAgIHsgInJlbmFtZSIsICAgIFhaUkVOLCAwIH0sCisgICAgeyAicm1kaXIiLCAgICAgWFpSTUQsIDAgfSwKKyAgICB7ICJ0eXBlIiwgICAgICBYWlRZUCwgMCB9LAorICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmZ0cHJtdCA9IChzaXplb2YoZnRwcm10KSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCitpbnQKK2RvZnRwc2l0ZSgpIHsJCQkJLyogU2VuZCBhIFNJVEUgY29tbWFuZCAqLworICAgIGludCByZXBseTsKKyAgICBjaGFyICogczsKKyAgICBpbnQgbGNzID0gLTEsIHJjcyA9IC0xOworI2lmbmRlZiBOT0NTRVRTCisgICAgaWYgKGZ0cF94bGEpIHsKKyAgICAgICAgbGNzID0gZnRwX2NzbDsKKyAgICAgICAgaWYgKGxjcyA8IDApIGxjcyA9IGZjaGFyc2V0OworICAgICAgICByY3MgPSBmdHBfY3N4OworICAgICAgICBpZiAocmNzIDwgMCkgcmNzID0gZnRwX2NzcjsKKyAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgIGlmICgoeCA9IGNtdHh0KCJDb21tYW5kIiwgIiIsICZzLCB4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih4KTsKKyAgICBDSEVDS0NPTk4oKTsKKyAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgaWYgKHRlc3RpbmcpIHByaW50ZigiIGZ0cCBzaXRlIFwiJXNcIi4uLlxuIixsaW5lKTsKKyAgICBpZiAoKHJlcGx5ID0gZnRwY21kKCJTSVRFIixsaW5lLGxjcyxyY3MsZnRwX3ZibSkpID09IFJFUExZX1BSRUxJTSkgeworCWRvIHsKKwkgICAgcmVwbHkgPSBnZXRyZXBseSgwLGxjcyxyY3MsZnRwX3ZibSwwKTsKKwl9IHdoaWxlIChyZXBseSA9PSBSRVBMWV9QUkVMSU0pOworICAgIH0KKyAgICByZXR1cm4oc3VjY2VzcyA9IChyZXBseSA9PSBSRVBMWV9DT01QTEVURSkpOworfQorCisKK2ludAorZG9zZXRmdHBwc3YoKSB7CQkJCS8qIFBhc3NpdmUgbW9kZSAqLworICAgIHggPSBzZXRvbigmZnRwX3Bzdik7CisgICAgaWYgKHggPiAwKSBwYXNzaXZlbW9kZSA9IGZ0cF9wc3Y7CisgICAgcmV0dXJuKHgpOworfQorCisvKiAgZCBvIGYgdCBwIHIgbSB0ICAtLSAgUGFyc2UgYW5kIGV4ZWN1dGUgUkVNT1RFIGNvbW1hbmRzICAqLworCitpbnQKK2RvZnRwcm10KGN4LHdobykgaW50IGN4LCB3aG87IHsgICAgICAgICAvKiB3aG8gPT0gMSBmb3IgZnRwLCAwIGZvciBrZXJtaXQgKi8KKyAgICAvKiBjeCA9PSAwIG1lYW5zIFJFTU9URSAqLworICAgIC8qIGN4ICE9IDAgaXMgYSBYWnh4eCB2YWx1ZSAqLworICAgIGNoYXIgKiBzOworCisgICAgaWYgKHdobyAhPSAwKQorICAgICAgcmV0dXJuKDApOworCisgICAgaWYgKGN4ID09IDApIHsKKyAgICAgICAgaWYgKCh4ID0gY21rZXkoZnRwcm10LG5mdHBybXQsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBjeCA9IHg7CisgICAgfQorICAgIHN3aXRjaCAoY3gpIHsKKyAgICAgIGNhc2UgWFpDRFU6ICAgICAgICAgICAgICAgICAgICAgICAvKiBDRFVQICovCisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICByZXR1cm4oZG9mdHBjZHVwKCkpOworCisgICAgICBjYXNlIFhaQ1dEOiAgICAgICAgICAgICAgICAgICAgICAgLyogUkNEICovCisgICAgICAgIGlmICgoeCA9IGNtdHh0KCJSZW1vdGUgZGlyZWN0b3J5IiwgIiIsICZzLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKyAgICAgICAgcmV0dXJuKGRvZnRwY3dkKChjaGFyICopbGluZSwxKSk7CisgICAgICBjYXNlIFhaUFdEOiAgICAgICAgICAgICAgICAgICAgICAgLyogUlBXRCAqLworICAgICAgICByZXR1cm4oZG9mdHBwd2QoKSk7CisgICAgICBjYXNlIFhaREVMOiAgICAgICAgICAgICAgICAgICAgICAgLyogUkRFTCAqLworICAgICAgICByZXR1cm4oZG9mdHBnZXQoRlRQX01ERSwxKSk7CisgICAgICBjYXNlIFhaRElSOiAgICAgICAgICAgICAgICAgICAgICAgLyogUkRJUiAqLworICAgICAgICByZXR1cm4oZG9mdHBkaXIoRlRQX0RJUikpOworICAgICAgY2FzZSBYWkhMUDogICAgICAgICAgICAgICAgICAgICAgIC8qIFJIRUxQICovCisgICAgICAgIHJldHVybihkb2Z0cHhobHAoKSk7CisgICAgICBjYXNlIFhaTUtEOiAgICAgICAgICAgICAgICAgICAgICAgLyogUk1LRElSICovCisgICAgICAgIHJldHVybihkb2Z0cG1rZCgpKTsKKyAgICAgIGNhc2UgWFpSRU46ICAgICAgICAgICAgICAgICAgICAgICAvKiBSUkVOQU1FICovCisgICAgICAgIHJldHVybihkb2Z0cHJlbigpKTsKKyAgICAgIGNhc2UgWFpSTUQ6ICAgICAgICAgICAgICAgICAgICAgICAvKiBSUk1ESVIgKi8KKyAgICAgICAgcmV0dXJuKGRvZnRwcm1kKCkpOworICAgICAgY2FzZSBYWkxHTzogICAgICAgICAgICAgICAgICAgICAgIC8qIExPR09VVCAqLworICAgICAgICByZXR1cm4oZG9mdHByZXMoKSk7CisgICAgICBjYXNlIFhaWElUOiAgICAgICAgICAgICAgICAgICAgICAgLyogRVhJVCAqLworICAgICAgICByZXR1cm4oZnRwYnllKCkpOworICAgIH0KKyAgICBwcmludGYoIj9Ob3QgdXNhYmxlIHdpdGggRlRQIC0gXCIlc1wiXG4iLCBhdG1idWYpOworICAgIHJldHVybigtOSk7Cit9CisKK2ludAorZG94ZnRwKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgcGFyc2VyIGZvciBidWlsdC1pbiBGVFAgKi8KKyAgICBpbnQgY3gsIG47CisgICAgc3RydWN0IEZEQiBrdywgZmw7CisgICAgY2hhciAqIHM7CisgICAgaW50IHVzZXRscyA9IDA7CisgICAgaW50IGxjcyA9IC0xLCByY3MgPSAtMTsKKworI2lmbmRlZiBOT0NTRVRTCisgICAgaWYgKGZ0cF94bGEpIHsKKyAgICAgICAgbGNzID0gZnRwX2NzbDsKKyAgICAgICAgaWYgKGxjcyA8IDApIGxjcyA9IGZjaGFyc2V0OworICAgICAgICByY3MgPSBmdHBfY3N4OworICAgICAgICBpZiAocmNzIDwgMCkgcmNzID0gZnRwX2NzcjsKKyAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisgICAgaWYgKGluc2VydmVyKSAgICAgICAgICAgICAgICAgICAgICAgLyogRlRQIG5vdCBhbGxvd2VkIGluIElLU0QuICovCisgICAgICByZXR1cm4oLTIpOworCisgICAgaWYgKGdfZnRwX3R5cCA+IC0xKSB7ICAgICAgICAgICAgICAgLyogUmVzdG9yZSBUWVBFIGlmIHNhdmVkICovCisgICAgICAgIGZ0cF90eXAgPSBnX2Z0cF90eXA7CisgICAgICAgIC8qIGdfZnRwX3R5cCA9IC0xOyAqLworICAgIH0KKyNpZmRlZiBDT01NRU5UCisvKgorICBXZSdsbCBzZXQgdGhlIGNvbGxpc2lvbiBhY3Rpb24gbG9jYWxseSBpbiBkb2Z0cGdldCgpIGJhc2VkIG9uIHdoZXRoZXIKKyAgZnRwX2ZuYyB3YXMgZXZlciBzZXQgdG8gYSB2YWx1ZS4gIGlmIG5vdCwgd2UnbGwgdXNlIHRoZSBmbmNhY3QgdmFsdWUuCisqLworICAgIGlmIChmdHBfZm5jIDwgMCkgICAgICAgICAgICAgICAgICAgIC8qIEluaGVyaXQgZ2xvYmFsIGNvbGxpc2lvbiBhY3Rpb24gKi8KKyAgICAgIGZ0cF9mbmMgPSBmbmNhY3Q7ICAgICAgICAgICAgICAgICAvKiBpZiBub25lIHNwZWNpZmllZCBmb3IgRlRQICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgLyogUmVzdG9yZSBnbG9iYWwgdmVyYm9zZSBtb2RlICovCisgICAgaWYgKGZ0cF9kZWIpCisgICAgICBmdHBfdmJtID0gMTsKKyAgICBlbHNlIGlmIChxdWlldCkKKyAgICAgIGZ0cF92Ym0gPSAwOworICAgIGVsc2UKKyAgICAgIGZ0cF92Ym0gPSBmdHBfdmJ4OworCisgICAgZnRwX2RhdGVzICY9IDE7CQkJLyogVW5kbyBhbnkgcHJldmlvdXMgL1VQREFURSBzd2l0Y2ggKi8KKworICAgIGRweWFjdGl2ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGdsb2JhbCB0cmFuc2Zlci1hY3RpdmUgZmxhZyAqLworICAgIHByaW50bGluZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHByaW50bGluZXMgKi8KKworICAgIGlmIChmcF9ubWwpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IC9OQU1FTElTVCAqLworICAgICAgICBpZiAoZnBfbm1sICE9IHN0ZG91dCkKKyAgICAgICAgICBmY2xvc2UoZnBfbm1sKTsKKyAgICAgICAgZnBfbm1sID0gTlVMTDsKKyAgICB9CisgICAgbWFrZXN0cigmZnRwX25tbCxOVUxMKTsKKworICAgIGNtZmRiaSgma3csICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IEZEQiAtIGNvbW1hbmRzICovCisgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIkhvc3RuYW1lOyBvciBGVFAgY29tbWFuZCIsICAvKiBoZWxwICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIG5mdHBjbWQsICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IG5vbmUgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgIGZ0cGNtZHRhYiwgICAgICAgICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAmZmwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKyAgICAgICAgICAgKTsKKyAgICBjbWZkYmkoJmZsLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBIGhvc3QgbmFtZSBvciBhZGRyZXNzICovCisgICAgICAgICAgIF9DTUZMRCwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIkhvc3RuYW1lIG9yIGFkZHJlc3MiLCAgICAgICAvKiBoZWxwICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworICAgICAgICAgICB4eHN0cmluZywKKyAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgTlVMTAorICAgICAgICAgICApOworICAgIHggPSBjbWZkYigma3cpOyAgICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIGEgaG9zdG5hbWUgb3IgYSBrZXl3b3JkICovCisgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgcHJpbnRmKCI/ZnRwIHdoYXQ/IFwiaGVscCBmdHBcIiBmb3IgaGludHNcbiIpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAoeCA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgaWYgKGNtcmVzdWx0LmZjb2RlID09IF9DTUZMRCkgeyAgICAgLyogSWYgaG9zdG5hbWUgKi8KKyAgICAgICAgcmV0dXJuKG9wZW5mdHAoY21yZXN1bHQuc3Jlc3VsdCwwKSk7IC8qIGdvIG9wZW4gdGhlIGNvbm5lY3Rpb24gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBjeCA9IGNtcmVzdWx0Lm5yZXN1bHQ7CisgICAgfQorICAgIHN3aXRjaCAoY3gpIHsKKyAgICAgIGNhc2UgRlRQX0FDQzogICAgICAgICAgICAgICAgICAgICAvKiBBQ0NPVU5UICovCisgICAgICAgIGlmICgoeCA9IGNtdHh0KCJSZW1vdGUgYWNjb3VudCIsICIiLCAmcywgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBDSEVDS0NPTk4oKTsKKyAgICAgICAgbWFrZXN0cigmZnRwX2FjYyxzKTsKKyAgICAgICAgaWYgKHRlc3RpbmcpCisgICAgICAgICAgcHJpbnRmKCIgZnRwIGFjY291bnQ6IFwiJXNcIlxuIixmdHBfYWNjKTsKKyAgICAgICAgc3VjY2VzcyA9IChmdHBjbWQoIkFDQ1QiLGZ0cF9hY2MsLTEsLTEsZnRwX3ZibSkgPT0gUkVQTFlfQ09NUExFVEUpOworICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisKKyAgICAgIGNhc2UgRlRQX0dVUDogICAgICAgICAgICAgICAgICAgICAvKiBHbyBVUCAqLworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgQ0hFQ0tDT05OKCk7CisgICAgICAgIGlmICh0ZXN0aW5nKSBwcmludGYoIiBmdHAgY2Q6IFwiKHVwKVwiXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSBkb2Z0cGNkdXAoKSk7CisKKyAgICAgIGNhc2UgRlRQX0NXRDogICAgICAgICAgICAgICAgICAgICAvKiBDRCAqLworICAgICAgICBpZiAoKHggPSBjbXR4dCgiUmVtb3RlIGRpcmVjdG9yeSIsICIiLCAmcywgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBDSEVDS0NPTk4oKTsKKyAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICBpZiAodGVzdGluZykKKyAgICAgICAgICBwcmludGYoIiBmdHAgY2Q6IFwiJXNcIlxuIiwgbGluZSk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gZG9mdHBjd2QobGluZSwxKSk7CisKKyAgICAgIGNhc2UgRlRQX0NITTogICAgICAgICAgICAgICAgICAgICAvKiBDSE1PRCAqLworICAgICAgICBpZiAoKHggPSBjbWZsZCgiUGVybWlzc2lvbnMgb3IgcHJvdGVjdGlvbiBjb2RlIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGNrc3RybmNweSh0bXBidWYscyxUTVBCVUZTSVopOworICAgICAgICBpZiAoKHggPSBjbXR4dCgiUmVtb3RlIGZpbGVuYW1lIiwgIiIsICZzLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIENIRUNLQ09OTigpOworICAgICAgICBja21ha21zZyhmdHBjbWRidWYsRlRQX0JVRlNJWix0bXBidWYsIiAiLHMsTlVMTCk7CisgICAgICAgIGlmICh0ZXN0aW5nKQorICAgICAgICAgIHByaW50ZigiIGZ0cCBjaG1vZDogJXNcbiIsZnRwY21kYnVmKTsKKyAgICAgICAgc3VjY2VzcyA9CisgICAgICAgICAgKGZ0cGNtZCgiU0lURSBDSE1PRCIsZnRwY21kYnVmLGxjcyxyY3MsZnRwX3ZibSkgPT0gUkVQTFlfQ09NUExFVEUpOworICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisKKyAgICAgIGNhc2UgRlRQX0NMUzogICAgICAgICAgICAgICAgICAgICAvKiBDTE9TRSBGVFAgY29ubmVjdGlvbiAqLworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBDSEVDS0NPTk4oKTsKKyAgICAgICAgaWYgKHRlc3RpbmcpCisgICAgICAgICAgcHJpbnRmKCIgZnRwIGNsb3NpbmcuLi5cbiIpOworICAgICAgICBmdHBjbG9zZSgpOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICBjYXNlIEZUUF9ESVI6ICAgICAgICAgICAgICAgICAgICAgLyogRElSRUNUT1JZIG9mIHJlbW90ZSBmaWxlcyAqLworICAgICAgY2FzZSBGVFBfVkRJOgorICAgICAgICByZXR1cm4oZG9mdHBkaXIoY3gpKTsKKworICAgICAgY2FzZSBGVFBfR0VUOiAgICAgICAgICAgICAgICAgICAgIC8qIEdFVCBhIHJlbW90ZSBmaWxlICovCisgICAgICBjYXNlIEZUUF9SR0U6ICAgICAgICAgICAgICAgICAgICAgLyogUkVHRVQgKi8KKyAgICAgIGNhc2UgRlRQX01HRTogICAgICAgICAgICAgICAgICAgICAvKiBNR0VUICovCisgICAgICBjYXNlIEZUUF9NREU6ICAgICAgICAgICAgICAgICAgICAgLyogTURFTEVURSAqLworICAgICAgICByZXR1cm4oZG9mdHBnZXQoY3gsMSkpOworCisgICAgICBjYXNlIEZUUF9JREw6ICAgICAgICAgICAgICAgICAgICAgLyogSURMRSAqLworICAgICAgICBpZiAoKHggPSBjbW51bSgiTnVtYmVyIG9mIHNlY29uZHMiLCItMSIsMTAsJnoseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBDSEVDS0NPTk4oKTsKKyAgICAgICAgaWYgKHogPCAwKSAgeyAgICAgICAgICAgICAgICAgICAvKiBEaXNwbGF5IGlkbGUgdGltZW91dCAqLworICAgICAgICAgICAgaWYgKHRlc3RpbmcpCisgICAgICAgICAgICAgIHByaW50ZigiIGZ0cCBxdWVyeSBpZGxlIHRpbWVvdXQuLi5cbiIpOworICAgICAgICAgICAgc3VjY2VzcyA9IChmdHBjbWQoIlNJVEUgSURMRSIsTlVMTCwwLDAsMSkgPT0gUkVQTFlfQ09NUExFVEUpOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBpZGxlIHRpbWVvdXQgKi8KKyAgICAgICAgICAgIGlmICh0ZXN0aW5nKQorICAgICAgICAgICAgICBwcmludGYoIiBmdHAgaWRsZSB0aW1lb3V0IHNldDogJWQuLi5cbiIseik7CisgICAgICAgICAgICBzdWNjZXNzID0KKyAgICAgICAgICAgICAgKGZ0cGNtZCgiU0lURSBJRExFIixja2l0b2EoeiksMCwwLDEpID09IFJFUExZX0NPTVBMRVRFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisKKyAgICAgIGNhc2UgRlRQX01LRDogICAgICAgICAgICAgICAgICAgICAvKiBNS0RJUiAqLworICAgICAgICByZXR1cm4oZG9mdHBta2QoKSk7CisKKyAgICAgIGNhc2UgRlRQX01PRDogICAgICAgICAgICAgICAgICAgICAvKiBNT0RUSU1FICovCisgICAgICAgIGlmICgoeCA9IGNtdHh0KCJSZW1vdGUgZmlsZW5hbWUiLCAiIiwgJnMsIHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgQ0hFQ0tDT05OKCk7CisgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKyAgICAgICAgaWYgKHRlc3RpbmcpCisgICAgICAgICAgcHJpbnRmKCIgZnRwIG1vZHRpbWUgXCIlc1wiLi4uXG4iLGxpbmUpOworICAgICAgICBzdWNjZXNzID0gMDsKKyAgICAgICAgaWYgKGZ0cGNtZCgiTURUTSIsbGluZSxsY3MscmNzLGZ0cF92Ym0pID09IFJFUExZX0NPTVBMRVRFKSB7CisJICAgIHN1Y2Nlc3MgPSAxOworCSAgICBtZHRtb2sgPSAxOworCSAgICBpZiAoIXF1aWV0KSB7CisJCWludCBmbGFnID0gMDsKKwkJY2hhciBjLCAqIHM7CisJCXN0cnVjdCB0bSB0bXJlbW90ZTsKKworCQliemVybygoY2hhciAqKSZ0bXJlbW90ZSwgc2l6ZW9mKHN0cnVjdCB0bSkpOworCQlzID0gZnRwX3JlcGx5X3N0cjsKKwkJd2hpbGUgKChjID0gKnMrKykpIHsKKwkJICAgIGlmIChjID09IFNQKSB7CisJCQlmbGFnKys7CisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCQlpZiAoZmxhZykgeworCQkgICAgaWYgKHNzY2FuZihzLCAiJTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwKKwkJCSAgICAgICAmdG1yZW1vdGUudG1feWVhciwKKwkJCSAgICAgICAmdG1yZW1vdGUudG1fbW9uLAorCQkJICAgICAgICZ0bXJlbW90ZS50bV9tZGF5LAorCQkJICAgICAgICZ0bXJlbW90ZS50bV9ob3VyLAorCQkJICAgICAgICZ0bXJlbW90ZS50bV9taW4sCisJCQkgICAgICAgJnRtcmVtb3RlLnRtX3NlYworCQkJICAgICAgICkgPT0gNikgeworCQkJcHJpbnRmKCIgJXMgJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgR01UXG4iLAorCQkJICAgICAgIGxpbmUsCisJCQkgICAgICAgdG1yZW1vdGUudG1feWVhciwKKwkJCSAgICAgICB0bXJlbW90ZS50bV9tb24sCisJCQkgICAgICAgdG1yZW1vdGUudG1fbWRheSwKKwkJCSAgICAgICB0bXJlbW90ZS50bV9ob3VyLAorCQkJICAgICAgIHRtcmVtb3RlLnRtX21pbiwKKwkJCSAgICAgICB0bXJlbW90ZS50bV9zZWMKKwkJCSAgICAgICApOworCQkgICAgfSBlbHNlIHsKKwkJCXN1Y2Nlc3MgPSAwOworCQkgICAgfQorCQl9CisJICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisKKyAgICAgIGNhc2UgRlRQX09QTjogICAgICAgICAgICAgICAgICAgICAvKiBPUEVOIGNvbm5lY3Rpb24gKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgIHggPSBjbWZsZCgiSVAgaG9zdG5hbWUgb3IgYWRkcmVzcyIsIiIsJnMseHhzdHJpbmcpOworICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSAwOworICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICB9CisgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKyAgICAgICAgcyA9IGxpbmU7CisgICAgICAgIHJldHVybihvcGVuZnRwKHMsMCkpOworI2Vsc2UKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPUEVOIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgIGNoYXIgbmFtZVtUVE5BTUxFTisxXSwgKnA7CisgICAgICAgICAgICBleHRlcm4gaW50IG5ldHdvcms7CisgICAgICAgICAgICBleHRlcm4gY2hhciB0dG5hbWVbXTsKKyAgICAgICAgICAgIGlmIChuZXR3b3JrKSAgICAgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgY3VycmVudCBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgIGNrc3RybmNweShuYW1lLHR0bmFtZSxMSU5CVUZTSVopOyAvKiBnZXQgdGhlIGhvc3QgbmFtZSAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAqbmFtZSA9ICdcMCc7ICAgICAgICAgICAgIC8qIGFzIGRlZmF1bHQgaG9zdCAqLworICAgICAgICAgICAgZm9yIChwID0gbmFtZTsgKnA7IHArKykgICAgIC8qIFJlbW92ZSAiOnNlcnZpY2UiIGZyb20gZW5kLiAqLworICAgICAgICAgICAgICBpZiAoKnAgPT0gJzonKSB7ICpwID0gJ1wwJzsgYnJlYWs7IH0KKyNpZm5kZWYgVVNFVExTVEFCCisgICAgICAgICAgICB4ID0gY21mbGQoIklQIGhvc3RuYW1lIG9yIGFkZHJlc3MiLG5hbWUsJnMseHhzdHJpbmcpOworI2Vsc2UKKyAgICAgICAgICAgIGNtZmRiaSgma3csICAgICAgICAgICAgICAgICAvKiBGaXJzdCBGREIgLSBjb21tYW5kcyAqLworICAgICAgICAgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICAgICAgICAgIkhvc3RuYW1lIG9yIHN3aXRjaCIsIC8qIGhlbHAgKi8KKyAgICAgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICBudGxzdGFiLCAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogbm9uZSAqLworICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICB0bHN0YWIsICAgICAgICAgICAgICAvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgJmZsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjbWZkYmkoJmZsLCAgICAgICAgICAgICAgICAgLyogQSBob3N0IG5hbWUgb3IgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgICAgIF9DTUZMRCwgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICAgICAgICAgIkhvc3RuYW1lIG9yIGFkZHJlc3MiLCAvKiBoZWxwICovCisgICAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKyAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nLAorICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIGZvciAobiA9IDA7OyBuKyspIHsKKyAgICAgICAgICAgICAgICB4ID0gY21mZGIoJmt3KTsgICAgICAgICAvKiBQYXJzZSBhIGhvc3RuYW1lIG9yIGEga2V5d29yZCAqLworICAgICAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgICBwcmludGYoIj9mdHAgb3BlbiB3aGF0PyBcImhlbHAgZnRwXCIgZm9yIGhpbnRzXG4iKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01GTEQpIHsgLyogSG9zdG5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgcyA9IGNtcmVzdWx0LnNyZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21yZXN1bHQubnJlc3VsdCA9PSBPUE5fVExTKSB7CisgICAgICAgICAgICAgICAgICAgIHVzZXRscyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8qIFVTRVRMU1RBQiAqLworICAgICAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICAgICAgcyA9IGxpbmU7CisgICAgICAgICAgICByZXR1cm4ob3BlbmZ0cChzLHVzZXRscykpOworICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgICBjYXNlIEZUUF9QVVQ6ICAgICAgICAgICAgICAgICAgICAgLyogUFVUICovCisgICAgICBjYXNlIEZUUF9NUFU6ICAgICAgICAgICAgICAgICAgICAgLyogTVBVVCAqLworICAgICAgY2FzZSBGVFBfQVBQOiAgICAgICAgICAgICAgICAgICAgIC8qIEFQUEVORCAqLworICAgICAgICByZXR1cm4oZG9mdHBwdXQoY3gsMSkpOworCisgICAgICBjYXNlIEZUUF9QV0Q6ICAgICAgICAgICAgICAgICAgICAgLyogUFdEICovCisgICAgICAgIHggPSBkb2Z0cHB3ZCgpOworICAgICAgICBpZiAoeCA+IC0xKSBzdWNjZXNzID0geDsKKyAgICAgICAgcmV0dXJuKHgpOworCisgICAgICBjYXNlIEZUUF9SRU46ICAgICAgICAgICAgICAgICAgICAgLyogUkVOQU1FICovCisgICAgICAgIHJldHVybihkb2Z0cHJlbigpKTsKKworICAgICAgY2FzZSBGVFBfUkVTOiAgICAgICAgICAgICAgICAgICAgIC8qIFJFU0VUICovCisgICAgICAgIHJldHVybihkb2Z0cHJlcygpKTsKKworICAgICAgY2FzZSBGVFBfSExQOiAgICAgICAgICAgICAgICAgICAgIC8qIChyZW1vdGUpIEhFTFAgKi8KKyAgICAgICAgcmV0dXJuKGRvZnRweGhscCgpKTsKKworICAgICAgY2FzZSBGVFBfUk1EOiAgICAgICAgICAgICAgICAgICAgIC8qIFJNRElSICovCisgICAgICAgIHJldHVybihkb2Z0cHJtZCgpKTsKKworICAgICAgY2FzZSBGVFBfU1RBOiAgICAgICAgICAgICAgICAgICAgIC8qIFNUQVRVUyAqLworICAgICAgICBpZiAoKHggPSBjbXR4dCgiQ29tbWFuZCIsICIiLCAmcywgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBDSEVDS0NPTk4oKTsKKyAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICBpZiAodGVzdGluZykgcHJpbnRmKCIgZnRwIHN0YXR1cyBcIiVzXCIuLi5cbiIsbGluZSk7CisgICAgICAgIHN1Y2Nlc3MgPSAoZnRwY21kKCJTVEFUIixsaW5lLGxjcyxyY3MsMSkgPT0gUkVQTFlfQ09NUExFVEUpOworICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisKKyAgICAgIGNhc2UgRlRQX1NJVDogeyAgICAgICAgICAgICAgICAgICAvKiBTSVRFICovCisJICByZXR1cm4oZG9mdHBzaXRlKCkpOworICAgICAgfQorCisgICAgICBjYXNlIEZUUF9TSVo6ICAgICAgICAgICAgICAgICAgICAgLyogKGFzayBmb3IpIFNJWkUgKi8KKyAgICAgICAgaWYgKCh4ID0gY210eHQoIlJlbW90ZSBmaWxlbmFtZSIsICIiLCAmcywgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBDSEVDS0NPTk4oKTsKKyAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICBpZiAodGVzdGluZykKKyAgICAgICAgICBwcmludGYoIiBmdHAgc2l6ZSBcIiVzXCIuLi5cbiIsbGluZSk7CisgICAgICAgIHN1Y2Nlc3MgPSAoZnRwY21kKCJTSVpFIixsaW5lLGxjcyxyY3MsMSkgPT0gUkVQTFlfQ09NUExFVEUpOworCWlmIChzdWNjZXNzKQorCSAgc2l6ZW9rID0gMTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MpOworCisgICAgICBjYXNlIEZUUF9TWVM6ICAgICAgICAgICAgICAgICAgICAgLyogQXNrIGZvciBzZXJ2ZXIncyBTWVNURU0gdHlwZSAqLworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgQ0hFQ0tDT05OKCk7CisgICAgICAgIGlmICh0ZXN0aW5nKQorICAgICAgICAgIHByaW50ZigiIGZ0cCBzeXN0ZW0uLi5cbiIpOworICAgICAgICBzdWNjZXNzID0gKGZ0cGNtZCgiU1lTVCIsTlVMTCwwLDAsMSkgPT0gUkVQTFlfQ09NUExFVEUpOworICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisKKyAgICAgIGNhc2UgRlRQX1VNQTogICAgICAgICAgICAgICAgICAgICAvKiBTZXQvcXVlcnkgVU1BU0sgKi8KKyAgICAgICAgaWYgKCh4ID0gY21mbGQoIlVtYXNrIHRvIHNldCBvciBub3RoaW5nIHRvIHF1ZXJ5IiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICBpZiAoeCAhPSAtMykKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgY2tzdHJuY3B5KHRtcGJ1ZixzLFRNUEJVRlNJWik7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICBDSEVDS0NPTk4oKTsKKyAgICAgICAgaWYgKHRlc3RpbmcpIHsKKyAgICAgICAgICAgIGlmICh0bXBidWZbMF0pCisgICAgICAgICAgICAgIHByaW50ZigiIGZ0cCB1bWFzayBcIiVzXCIuLi5cbiIsdG1wYnVmKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCIgZnRwIHF1ZXJ5IHVtYXNrLi4uXG4iKTsKKyAgICAgICAgfQorICAgICAgICBzdWNjZXNzID0gZnRwX3VtYXNrKHRtcGJ1Zik7CisgICAgICAgIHJldHVybihzdWNjZXNzKTsKKworICAgICAgY2FzZSBGVFBfVVNSOgorICAgICAgICByZXR1cm4oZG9mdHB1c3IoKSk7CisKKyAgICAgIGNhc2UgRlRQX1FVTzoKKyAgICAgICAgaWYgKCh4ID0gY210eHQoIkZUUCBwcm90b2NvbCBjb21tYW5kIiwgIiIsICZzLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIENIRUNLQ09OTigpOworICAgICAgICBzdWNjZXNzID0gKGZ0cGNtZChzLE5VTEwsMCwwLGZ0cF92Ym0pID09IFJFUExZX0NPTVBMRVRFKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MpOworCisgICAgICBjYXNlIEZUUF9UWVA6ICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSAqLworICAgICAgICBpZiAoKHggPSBjbWtleShmdHB0eXAsbmZ0cHR5cCwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBDSEVDS0NPTk4oKTsKKyAgICAgICAgZnRwX3R5cCA9IHg7CisgICAgICAgIGdfZnRwX3R5cCA9IHg7CisgICAgICAgIHRlbmV4ID0gKGZ0cF90eXAgPT0gRlRUX1RFTik7CisgICAgICAgIGNoYW5nZXR5cGUoZnRwX3R5cCxmdHBfdmJtKTsKKyAgICAgICAgcmV0dXJuKDEpOworCisgICAgICBjYXNlIEZUUF9DSEs6ICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgcmVtb3RlIGZpbGUocykgZXhpc3QocykgKi8KKyAgICAgICAgaWYgKCh4ID0gY210eHQoInJlbW90ZSBmaWxlbmFtZSIsICIiLCAmcywgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBDSEVDS0NPTk4oKTsKKyAgICAgICAgc3VjY2VzcyA9IHJlbW90ZV9maWxlcygxLChDSEFSICopcyxOVUxMLDApID8gMSA6IDA7CisgICAgICAgIHJldHVybihzdWNjZXNzKTsKKworICAgICAgY2FzZSBGVFBfRkVBOiAgICAgICAgICAgICAgICAgICAgIC8qIFJGQzIzODkgKi8KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgQ0hFQ0tDT05OKCk7CisJc3VjY2VzcyA9IChmdHBjbWQoIkZFQVQiLE5VTEwsMCwwLDEpID09IFJFUExZX0NPTVBMRVRFKTsKKwlpZiAoc3VjY2VzcykgeworCSAgICBpZiAoc2Z0dGFiWzBdID4gMCkgeworCQlmdHBfYXV0ID0gc2Z0dGFiW1NGVF9BVVRIXTsKKwkJc2l6ZW9rICA9IHNmdHRhYltTRlRfU0laRV07CisJCW1kdG1vayAgPSBzZnR0YWJbU0ZUX01EVE1dOworCQltbHN0b2sgID0gc2Z0dGFiW1NGVF9NTFNUXTsKKwkgICAgfQorCX0KKwlyZXR1cm4oc3VjY2Vzcyk7CisKKyAgICAgIGNhc2UgRlRQX09QVDogICAgICAgICAgICAgICAgICAgICAvKiBSRkMyMzg5ICovCisgICAgICAgIC8qIFBlcmhhcHMgdGhpcyBzaG91bGQgYmUgYSBrZXl3b3JkIGxpc3QuLi4gKi8KKyAgICAgICAgaWYgKCh4ID0gY21mbGQoIkZUUCBjb21tYW5kIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIENIRUNLQ09OTigpOworICAgICAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgICAgIGlmICgoeCA9IGNtdHh0KCJPcHRpb25zIGZvciB0aGlzIGNvbW1hbmQiLCAiIiwgJnMsIHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgc3VjY2VzcyA9IChmdHBjbWQoIk9QVFMiLGxpbmUsbGNzLHJjcyxmdHBfdmJtKSA9PSBSRVBMWV9DT01QTEVURSk7CisgICAgICAgIHJldHVybihzdWNjZXNzKTsKKworICAgICAgY2FzZSBGVFBfRU5BOgkJCS8qIEZUUCBFTkFCTEUgKi8KKyAgICAgIGNhc2UgRlRQX0RJUzoJCQkvKiBGVFAgRElTQUJMRSAqLworICAgICAgICBpZiAoKHggPSBjbWtleShmdHBlbmF0YWIsbmZ0cGVuYSwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworCXN3aXRjaCAoeCkgeworCSAgY2FzZSBFTkFfQVVUSDoJCS8qIE9LIHRvIHVzZSBhdXRvYXV0aGVudGljYXRpb24gKi8KKwkgICAgZnRwX2F1dCA9IChjeCA9PSBGVFBfRU5BKSA/IDEgOiAwOworCSAgICBzZnR0YWJbU0ZUX0FVVEhdID0gZnRwX2F1dDsKKwkgICAgYnJlYWs7CisJICBjYXNlIEVOQV9GRUFUOgkJLyogT0sgdG8gc2VuZCBGRUFUIGNvbW1hbmQgKi8KKwkgICAgZmVhdG9rID0gKGN4ID09IEZUUF9FTkEpID8gMSA6IDA7CisJICAgIGJyZWFrOworCSAgY2FzZSBFTkFfTUxTVDoJCS8qIE9LIHRvIHVzZSBNTFNUL01MU0QgKi8KKwkgICAgbWxzdG9rID0gKGN4ID09IEZUUF9FTkEpID8gMSA6IDA7CisJICAgIHNmdHRhYltTRlRfTUxTVF0gPSBtbHN0b2s7CisJICAgIGJyZWFrOworCSAgY2FzZSBFTkFfTURUTToJCS8qIE9LIHRvIHVzZSBNRFRNICovCisJICAgIG1kdG1vayA9IChjeCA9PSBGVFBfRU5BKSA/IDEgOiAwOworCSAgICBzZnR0YWJbU0ZUX01EVE1dID0gbWR0bW9rOworCSAgICBicmVhazsKKwkgIGNhc2UgRU5BX1NJWkU6CQkvKiBPSyB0byB1c2UgU0laRSAqLworCSAgICBzaXplb2sgPSAoY3ggPT0gRlRQX0VOQSkgPyAxIDogMDsKKwkgICAgc2Z0dGFiW1NGVF9TSVpFXSA9IHNpemVvazsKKwkgICAgYnJlYWs7CisJfQorCXJldHVybihzdWNjZXNzID0gMSk7CisgICAgfQorICAgIHJldHVybigtMik7Cit9CisKKyNpZm5kZWYgTk9TSE9XCitzdGF0aWMgY2hhciAqCitzaG9wbCh4KSBpbnQgeDsgeworICAgIHN3aXRjaCAoeCkgeworICAgICAgY2FzZSBGUExfQ0xSOiByZXR1cm4oImNsZWFyIik7CisgICAgICBjYXNlIEZQTF9QUlY6IHJldHVybigicHJpdmF0ZSIpOworICAgICAgY2FzZSBGUExfU0FGOiByZXR1cm4oInNhZmUiKTsKKyAgICAgIGNhc2UgMDogIHJldHVybigiKG5vdCBzZXQpIik7CisgICAgICBkZWZhdWx0OiByZXR1cm4oIih1bmtub3duKSIpOworICAgIH0KK30KKworaW50CitzaG9mdHAoYnJpZWYpIHsKKyAgICBjaGFyICogcyA9ICI/IjsKKyAgICBpbnQgbiwgeDsKKworICAgIGlmIChnX2Z0cF90eXAgPiAtMSkgeyAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgVFlQRSBpZiBzYXZlZCAqLworICAgICAgICBmdHBfdHlwID0gZ19mdHBfdHlwOworICAgICAgICAvKiBnX2Z0cF90eXAgPSAtMTsgKi8KKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiRlRQIGNvbm5lY3Rpb246ICAgICAgICAgICAgICAgICAlc1xuIixjb25uZWN0ZWQgPworICAgICAgICAgICBmdHBfaG9zdCA6CisgICAgICAgICAgICIobm9uZSkiCisgICAgICAgICAgICk7CisgICAgbiA9IDI7CisgICAgaWYgKGNvbm5lY3RlZCkgeworICAgICAgICBuKys7CisgICAgICAgIHByaW50ZigiRlRQIHNlcnZlciB0eXBlOiAgICAgICAgICAgICAgICAlc1xuIiwKKyAgICAgICAgICAgICAgIGZ0cF9zcnZ0eXBbMF0gPyBmdHBfc3J2dHlwIDogIih1bmtub3duKSIpOworICAgIH0KKyAgICBpZiAobG9nZ2VkaW4pCisgICAgICBwcmludGYoIkxvZ2dlZCBpbiBhczogICAgICAgICAgICAgICAgICAgJXNcbiIsCisgICAgICAgICAgICAgc3RydmFsKGZ0cF9sb2duYW1lLCIodW5rbm93bikiKSk7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJOb3QgbG9nZ2VkIGluXG4iKTsKKyAgICBuKys7CisgICAgaWYgKGJyaWVmKSByZXR1cm4oMCk7CisKKyAgICBwcmludGYoIlxuU0VUIEZUUCB2YWx1ZXM6XG5cbiIpOworICAgIG4gKz0gMzsKKworICAgIHByaW50ZigiIGZ0cCBhbm9ueW1vdXMtcGFzc3dvcmQ6ICAgICAgICAlc1xuIiwKKwkgICBmdHBfYXB3ID8gZnRwX2FwdyA6ICIoZGVmYXVsdCkiCisJICAgKTsKKyAgICBwcmludGYoIiBmdHAgYXV0by1sb2dpbjogICAgICAgICAgICAgICAgJXNcbiIsc2hvd29mZihmdHBfbG9nKSk7CisgICAgcHJpbnRmKCIgZnRwIGF1dG8tYXV0aGVudGljYXRpb246ICAgICAgICVzXG4iLHNob3dvZmYoZnRwX2F1dCkpOworICAgIHN3aXRjaCAoZnRwX3R5cCkgeworICAgICAgY2FzZSBGVFRfQVNDOiBzID0gInRleHQiOyBicmVhazsKKyAgICAgIGNhc2UgRlRUX0JJTjogcyA9ICJiaW5hcnkiOyBicmVhazsKKyAgICAgIGNhc2UgRlRUX1RFTjogcyA9ICJ0ZW5leCI7IGJyZWFrOworICAgIH0KKyAgICBwcmludGYoIiBmdHAgdHlwZTogICAgICAgICAgICAgICAgICAgICAgJXNcbiIscyk7CisgICAgcHJpbnRmKCIgZnRwIGdldC1maWxldHlwZS1zd2l0Y2hpbmc6ICAgICVzXG4iLHNob3dvZmYoZ2V0X2F1dG8pKTsKKyAgICBwcmludGYoIiBmdHAgZGF0ZXM6ICAgICAgICAgICAgICAgICAgICAgJXNcbiIsc2hvd29mZihmdHBfZGF0ZXMpKTsKKyAgICBwcmludGYoIiBmdHAgZXJyb3ItYWN0aW9uOiAgICAgICAgICAgICAgJXNcbiIsZnRwX2VyciA/ICJxdWl0IjoicHJvY2VlZCIpOworICAgIHByaW50ZigiIGZ0cCBmaWxlbmFtZXM6ICAgICAgICAgICAgICAgICAlc1xuIiwKKyAgICAgICAgICAgZnRwX2NudiA9PSBDTlZfQVVUTyA/ICJhdXRvIiA6IChmdHBfY252ID8gImNvbnZlcnRlZCIgOiAibGl0ZXJhbCIpCisgICAgICAgICAgICk7CisgICAgcHJpbnRmKCIgZnRwIGRlYnVnICAgICAgICAgICAgICAgICAgICAgICVzXG4iLHNob3dvZmYoZnRwX2RlYikpOworCisgICAgcHJpbnRmKCIgZnRwIHBhc3NpdmUtbW9kZTogICAgICAgICAgICAgICVzXG4iLHNob3dvZmYoZnRwX3BzdikpOworICAgIHByaW50ZigiIGZ0cCBwZXJtaXNzaW9uczogICAgICAgICAgICAgICAlc1xuIixzaG93b29hKGZ0cF9wcm0pKTsKKyAgICBwcmludGYoIiBmdHAgdmVyYm9zZS1tb2RlOiAgICAgICAgICAgICAgJXNcbiIsc2hvd29mZihmdHBfdmJ4KSk7CisgICAgcHJpbnRmKCIgZnRwIHNlbmQtcG9ydC1jb21tYW5kczogICAgICAgICVzXG4iLHNob3dvZmYoZnRwX3BzdikpOworICAgIHByaW50ZigiIGZ0cCB1bmlxdWUtc2VydmVyLW5hbWVzOiAgICAgICAlc1xuIixzaG93b2ZmKGZ0cF91c24pKTsKKyNpZmRlZiBDT01NRU5UCisgICAgLyogU2VlIG5vdGUgaW4gZG94ZnRwKCkgKi8KKyAgICBpZiAoZnRwX2ZuYyA8IDApCisgICAgICBmdHBfZm5jID0gZm5jYWN0OworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBwcmludGYoIiBmdHAgY29sbGlzaW9uOiAgICAgICAgICAgICAgICAgJXNcbiIsCisJICAgZm5jbmFtW2Z0cF9mbmMgPiAtMSA/IGZ0cF9mbmMgOiBmbmNhY3RdKTsKKyAgICBwcmludGYoIiBmdHAgc2VydmVyLXRpbWUtb2Zmc2V0OiAgICAgICAgJXNcbiIsCisJICAgZnRzX3N0byA/IGZ0c19zdG8gOiAiKG5vbmUpIik7CisgICAgbiArPSAxNTsKKworI2lmbmRlZiBOT0NTRVRTCisgICAgcHJpbnRmKCIgZnRwIGNoYXJhY3Rlci1zZXQtdHJhbnNsYXRpb246ICVzXG4iLHNob3dvZmYoZnRwX3hsYSkpOworICAgIGlmICgrKyBuID4gY21kX3Jvd3MtMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuIDA7IGVsc2UgbiA9IDA7IH0KKworICAgIHByaW50ZigiIGZ0cCBzZXJ2ZXItY2hhcmFjdGVyLXNldDogICAgICAlc1xuIixmY3NpbmZvW2Z0cF9jc3JdLmtleXdvcmQpOworICAgIGlmICgrKyBuID4gY21kX3Jvd3MtMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuIDA7IGVsc2UgbiA9IDA7IH0KKworICAgIHByaW50ZigiIGZpbGUgY2hhcmFjdGVyLXNldDogICAgICAgICAgICAlc1xuIixmY3NpbmZvW2ZjaGFyc2V0XS5rZXl3b3JkKTsKKyAgICBpZiAoKysgbiA+IGNtZF9yb3dzLTMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybiAwOyBlbHNlIG4gPSAwOyB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisgICAgeCA9IGZ0cF9kaXM7CisgICAgaWYgKHggPCAwKQorICAgICAgeCA9IGZkaXNwbGE7CisgICAgc3dpdGNoICh4KSB7CisgICAgICBjYXNlIFhZRkRfTjogcyA9ICJub25lIjsgYnJlYWs7CisgICAgICBjYXNlIFhZRkRfUjogcyA9ICJzZXJpYWwiOyBicmVhazsKKyAgICAgIGNhc2UgWFlGRF9DOiBzID0gImZ1bGxzY3JlZW4iOyBicmVhazsKKyAgICAgIGNhc2UgWFlGRF9TOiBzID0gImNydCI7IGJyZWFrOworICAgICAgY2FzZSBYWUZEX0I6IHMgPSAiYnJpZWYiOyBicmVhazsKKyAgICB9CisgICAgcHJpbnRmKCIgZnRwIGRpc3BsYXk6ICAgICAgICAgICAgICAgICAgICVzXG4iLHMpOworICAgIGlmICgrKyBuID4gY21kX3Jvd3MtMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuIDA7IGVsc2UgbiA9IDA7IH0KKworICAgIGlmIChtbHN0b2sgfHwgZmVhdG9rIHx8IG1kdG1vayB8fCBzaXplb2sgfHwgZnRwX2F1dCkgeworCXByaW50ZigiIGVuYWJsZWQ6ICAgICAgICAgICAgICAgICAgICAgICIpOworCWlmIChmdHBfYXV0KSBwcmludGYoIiBBVVRIIik7CisJaWYgKGZlYXRvaykgIHByaW50ZigiIEZFQVQiKTsKKwlpZiAobWR0bW9rKSAgcHJpbnRmKCIgTURUTSIpOworCWlmIChtbHN0b2spICBwcmludGYoIiBNTFNUIik7CisJaWYgKHNpemVvaykgIHByaW50ZigiIFNJWkUiKTsKKwlwcmludGYoIlxuIik7CisJaWYgKCsrIG4gPiBjbWRfcm93cy0zKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4gMDsgZWxzZSBuID0gMDsgfQorICAgIH0KKyAgICBpZiAoIW1sc3RvayB8fCAhZmVhdG9rIHx8ICFtZHRtb2sgfHwgIXNpemVvayB8fCAhZnRwX2F1dCkgeworCXByaW50ZigiIGRpc2FibGVkOiAgICAgICAgICAgICAgICAgICAgICIpOworCWlmICghZnRwX2F1dCkgcHJpbnRmKCIgQVVUSCIpOworCWlmICghZmVhdG9rKSAgcHJpbnRmKCIgRkVBVCIpOworCWlmICghbWR0bW9rKSAgcHJpbnRmKCIgTURUTSIpOworCWlmICghbWxzdG9rKSAgcHJpbnRmKCIgTUxTVCIpOworCWlmICghc2l6ZW9rKSAgcHJpbnRmKCIgU0laRSIpOworCXByaW50ZigiXG4iKTsKKwlpZiAoKysgbiA+IGNtZF9yb3dzLTMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybiAwOyBlbHNlIG4gPSAwOyB9CisgICAgfQorICAgIHN3aXRjaCAoZnRwZ2V0KSB7CisgICAgICBjYXNlIDA6IHMgPSAia2VybWl0IjsgYnJlYWs7CisgICAgICBjYXNlIDE6IHMgPSAiZnRwIjsgYnJlYWs7CisgICAgICBjYXNlIDI6IHMgPSAiYXV0byI7IGJyZWFrOworICAgICAgZGVmYXVsdDogcyA9ICI/IjsKKyAgICB9CisgICAgcHJpbnRmKCIgZ2V0LXB1dC1yZW1vdGU6ICAgICAgICAgICAgICAgICVzXG4iLHMpOworICAgIGlmICgrKyBuID4gY21kX3Jvd3MtMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuIDA7IGVsc2UgbiA9IDA7IH0KKworICAgIHByaW50ZigiXG4iKTsKKyAgICBpZiAoKysgbiA+IGNtZF9yb3dzLTMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybiAwOyBlbHNlIG4gPSAwOyB9CisKKyNpZmRlZiBGVFBfU0VDVVJJVFkKKyAgICBwcmludGYoIkF2YWlsYWJsZSBzZWN1cml0eSBtZXRob2RzOiAgICAiKTsKKyNpZmRlZiBGVFBfR1NTQVBJCisgICAgcHJpbnRmKCJHU1NBUEkgIik7CisjZW5kaWYgLyogRlRQX0dTU0FQSSAqLworI2lmZGVmIEZUUF9LUkI0CisgICAgcHJpbnRmKCJLZXJiZXJvczQgIik7CisjZW5kaWYgLyogRlRQX0tSQjQgKi8KKyNpZmRlZiBGVFBfU1JQCisgICAgcHJpbnRmKCJTUlAgIik7CisjZW5kaWYgLyogRlRQX1NSUCAqLworI2lmZGVmIEZUUF9TU0wKKyAgICBwcmludGYoIlNTTCAiKTsKKyNlbmRpZiAvKiBGVFBfU1NMICovCisKKyAgICBuKys7CisgICAgcHJpbnRmKCJcblxuIik7CisgICAgaWYgKCsrIG4gPiBjbWRfcm93cy0zKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4gMDsgZWxzZSBuID0gMDsgfQorICAgIHByaW50ZigiIGZ0cCBhdXRodHlwZTogICAgICAgICAgICAgICAgICAlc1xuIixzdHJ2YWwoYXV0aF90eXBlLE5VTEwpKTsKKyAgICBpZiAoKysgbiA+IGNtZF9yb3dzLTMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybiAwOyBlbHNlIG4gPSAwOyB9CisgICAgcHJpbnRmKCIgZnRwIGF1dG8tZW5jcnlwdGlvbjogICAgICAgICAgICVzXG4iLHNob3dvZmYoZnRwX2NyeSkpOworICAgIGlmICgrKyBuID4gY21kX3Jvd3MtMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuIDA7IGVsc2UgbiA9IDA7IH0KKyAgICBwcmludGYoIiBmdHAgY3JlZGVudGlhbC1mb3J3YXJkaW5nOiAgICAgJXNcbiIsc2hvd29mZihmdHBfY2Z3KSk7CisgICAgaWYgKCsrIG4gPiBjbWRfcm93cy0zKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4gMDsgZWxzZSBuID0gMDsgfQorICAgIHByaW50ZigiIGZ0cCBjb21tYW5kLXByb3RlY3Rpb24tbGV2ZWw6ICAlc1xuIixzaG9wbChmdHBfY3BsKSk7CisgICAgaWYgKCsrIG4gPiBjbWRfcm93cy0zKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4gMDsgZWxzZSBuID0gMDsgfQorICAgIHByaW50ZigiIGZ0cCBkYXRhLXByb3RlY3Rpb24tbGV2ZWw6ICAgICAlc1xuIixzaG9wbChmdHBfZHBsKSk7CisgICAgaWYgKCsrIG4gPiBjbWRfcm93cy0zKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4gMDsgZWxzZSBuID0gMDsgfQorICAgIHByaW50ZigiIGZ0cCBzZWN1cmUgcHJveHk6ICAgICAgICAgICAgICAlc1xuIixzaG9wbChzc2xfZnRwX3Byb3h5KSk7CisgICAgaWYgKCsrIG4gPiBjbWRfcm93cy0zKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4gMDsgZWxzZSBuID0gMDsgfQorI2Vsc2UKKyAgICBwcmludGYoIkF2YWlsYWJsZSBzZWN1cml0eSBtZXRob2RzOiAgICAgKG5vbmUpXG4iKTsKKyAgICBpZiAoKysgbiA+IGNtZF9yb3dzLTMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybiAwOyBlbHNlIG4gPSAwOyB9CisjZW5kaWYgLyogRlRQX1NFQ1VSSVRZICovCisKKyAgICBpZiAobiA8PSBjbWRfcm93cyAtIDMpCisgICAgICBwcmludGYoIlxuIik7CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIE5PU0hPVyAqLworCisjaWZuZGVmIE5PSEVMUAorLyogRlRQIEhFTFAgdGV4dCBzdHJpbmdzICovCisKK3N0YXRpYyBjaGFyICogZmhzX2Z0cFtdID0geworICAgICJTeW50YXg6IEZUUCBzdWJjb21tYW5kIFsgb3BlcmFuZHMgXSIsCisgICAgIiAgTWFrZXMgYW4gRlRQIGNvbm5lY3Rpb24sIG9yIHNlbmRzIGEgY29tbWFuZCB0byB0aGUgRlRQIHNlcnZlci4iLAorICAgICIgIFRvIHNlZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIEZUUCBzdWJjb21tYW5kcywgdHlwZSBcImZ0cCA/XCIuIiwKKyAgICAiICBhbmQgdGhlbiB1c2UgSEVMUCBGVFAgeHh4IHRvIGdldCBoZWxwIGFib3V0IHN1YmNvbW1hbmQgeHh4LiIsCisgICAgIiAgQWxzbyBzZWUgSEVMUCBTRVQgRlRQLCBIRUxQIFNFVCBHRVQtUFVULVJFTU9URSwgYW5kIEhFTFAgRklSRVdBTEwuIiwKKyAgICAiIgorfTsKKworc3RhdGljIGNoYXIgKiBmaHNfYWNjW10gPSB7ICAgICAgICAgICAgIC8qIEFDQ09VTlQgKi8KKyAgICAiU3ludGF4OiBGVFAgQUNDT1VOVCB0ZXh0IiwKKyAgICAiICBTZW5kcyBhbiBhY2NvdW50IGRlc2lnbmF0b3IgdG8gYW4gRlRQIHNlcnZlciB0aGF0IG5lZWRzIG9uZS4iLAorICAgICIgIE1vc3QgRlRQIHNlcnZlcnMgZG8gbm90IHVzZSBhY2NvdW50czsgc29tZSB1c2UgdGhlbSBmb3Igb3RoZXIiLAorICAgICIgIG90aGVyIHB1cnBvc2VzLCBzdWNoIGFzIGRpc2stYWNjZXNzIHBhc3N3b3Jkcy4iLAorICAgICIiCit9Oworc3RhdGljIGNoYXIgKiBmaHNfYXBwW10gPSB7ICAgICAgICAgICAgIC8qIEFQUEVORCAqLworICAgICJTeW50YXg6IEZUUCBBUFBFTkQgZmlsbmFtZSIsCisgICAgIiAgRXF1aXZhbGVudCB0byBbIEZUUCBdIFBVVCAvQVBQRU5ELiAgU2VlIEhFTFAgRlRQIFBVVC4iLAorICAgICIiCit9Oworc3RhdGljIGNoYXIgKiBmaHNfY2xzW10gPSB7ICAgICAgICAgICAgIC8qIEJZRSwgQ0xPU0UgKi8KKyAgICAiU3ludGF4OiBbIEZUUCBdIEJZRSIsCisgICAgIiAgTG9ncyBvdXQgZnJvbSB0aGUgRlRQIHNlcnZlciBhbmQgY2xvc2VzIHRoZSBGVFAgY29ubmVjdGlvbi4iLAorICAgICIgIEFsc28gc2VlIEhFTFAgU0VUIEdFVC1QVVQtUkVNT1RFLiAgU3lub255bTogWyBGVFAgXSBDTE9TRS4iLAorICAgICIiCit9Oworc3RhdGljIGNoYXIgKiBmaHNfY3dkW10gPSB7ICAgICAgICAgICAgIC8qIENELCBDV0QgKi8KKyAgICAiU3ludGF4OiBbIEZUUCBdIENEIGRpcmVjdG9yeSIsCisgICAgIiAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byBjaGFuZ2UgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4iLAorICAgICIgIEFsc28gc2VlIEhFTFAgU0VUIEdFVC1QVVQtUkVNT1RFLiAgU3lub255bXM6IFsgRlRQIF0gQ1dELCBSQ0QsIFJDV0QuIiwKKyAgICAiIgorfTsKK3N0YXRpYyBjaGFyICogZmhzX2d1cFtdID0geyAgICAgICAgICAgICAvKiBDRFVQLCBVUCAqLworICAgICJTeW50YXg6IEZUUCBDRFVQIiwKKyAgICAiICBBc2tzIHRoZSBGVFAgc2VydmVyIHRvIGNoYW5nZSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiBpdHMgY3VycmVudCIsCisgICAgIiAgZGlyZWN0b3J5LiAgQWxzbyBzZWUgSEVMUCBTRVQgR0VULVBVVC1SRU1PVEUuICBTeW5vbnltOiBGVFAgVVAuIiwKKyAgICAiIgorfTsKK3N0YXRpYyBjaGFyICogZmhzX2NobVtdID0geyAgICAgICAgICAgICAvKiBDSE1PRCAqLworICAgICJTeW50YXg6IEZUUCBDSE1PRCBmaWxlbmFtZSBwZXJtaXNzaW9ucyIsCisgICAgIiAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byBjaGFuZ2UgdGhlIHBlcm1pc3Npb25zLCBwcm90ZWN0aW9uLCBvciBtb2RlIG9mIiwKKyAgICAiICB0aGUgZ2l2ZW4gZmlsZS4gIFRoZSBnaXZlbiBwZXJtaXNzaW9ucyBtdXN0IGJlIGluIHRoZSBzeW50YXggb2YgdGhlIiwKKyAgICAiICB0aGUgc2VydmVyJ3MgZmlsZSBzeXN0ZW0sIGUuZy4gYW4gb2N0YWwgbnVtYmVyIGZvciBVTklYLiAgQWxzbyBzZWUiLAorICAgICIgIEZUUCBQVVQgL1BFUk1JU1NJT05TIiwKKyAgICAiIgorfTsKK3N0YXRpYyBjaGFyICogZmhzX21kZVtdID0geyAgICAgICAgICAgICAvKiBERUxFVEUgKi8KKyAgICAiU3ludGF4OiBGVFAgREVMRVRFIFsgc3dpdGNoZXMgXSBmaWxlc3BlYyIsCisgICAgIiAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byBkZWxldGUgdGhlIGdpdmVuIGZpbGUgb3IgZmlsZXMuIiwKKyAgICAiICBTeW5vbnltOiBNREVMRVRFIChLZXJtaXQgbWFrZXMgbm8gZGlzdGluY3Rpb24gYmV0d2VlbiBzaW5nbGUgYW5kIiwKKyAgICAiICBtdWx0aXBsZSBmaWxlIGRlbGV0aW9uKS4gIE9wdGlvbmFsIHN3aXRjaGVzOiIsCisgICAgIiAiLAorICAgICIgIC9FUlJPUi1BQ1RJT046e1BST0NFRUQsUVVJVH0iLAorICAgICIgIC9FWENFUFQ6cGF0dGVybiIsCisgICAgIiAgL0ZJTEVOQU1FUzp7QVVUTyxDT05WRVJURUQsTElURVJBTH0iLAorICAgICIgIC9MQVJHRVItVEhBTjpudW1iZXIiLAorI2lmZGVmIFVOSVhPUk9TSworICAgICIgIC9OT0RPVEZJTEVTIiwKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyAgICAiICAvUVVJRVQiLAorI2lmZGVmIFJFQ1VSU0lWRQorICAgICIgIC9SRUNVUlNJVkUgKGRlcGVuZHMgb24gc2VydmVyKSIsCisgICAgIiAgL1NVQkRJUkVDVE9SSUVTIiwKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICAiICAvU01BTExFUi1USEFOOm51bWJlciIsCisgICAgIiIKK307CitzdGF0aWMgY2hhciAqIGZoc19kaXJbXSA9IHsgICAgICAgICAgICAgLyogRElSRUNUT1JZICovCisgICAgIlN5bnRheDogRlRQIERJUkVDVE9SWSBbIGZpbGVzcGVjIF0iLAorICAgICIgIEFza3MgdGhlIHNlcnZlciB0byBzZW5kIGEgZGlyZWN0b3J5IGxpc3Rpbmcgb2YgdGhlIGZpbGVzIHRoYXQgbWF0Y2giLAorICAgICIgIHRoZSBnaXZlbiBmaWxlc3BlYywgb3IgaWYgbm9uZSBpcyBnaXZlbiwgYWxsIHRoZSBmaWxlcyBpbiBpdHMgY3VycmVudCIsCisgICAgIiAgZGlyZWN0b3J5LiAgVGhlIGZpbGVzcGVjLCBpbmNsdWRpbmcgYW55IHdpbGRjYXJkcywgbXVzdCBiZSBpbiB0aGUiLAorICAgICIgIHN5bnRheCBvZiB0aGUgc2VydmVyJ3MgZmlsZSBzeXN0ZW0uICBBbHNvIHNlZSBIRUxQIFNFVCBHRVQtUFVULVJFTU9URS4iLAorICAgICIgIFN5bm9ueW06IFJESVJFQ1RPUlkuIiwKKyAgICAiIgorfTsKK3N0YXRpYyBjaGFyICogZmhzX3ZkaVtdID0geyAgICAgICAgICAgICAvKiBWRElSRUNUT1JZICovCisgICAgIlN5bnRheDogRlRQIFZESVJFQ1RPUlkgWyBmaWxlc3BlYyBdIiwKKyAgICAiICBBc2tzIHRoZSBzZXJ2ZXIgdG8gc2VuZCBhIGRpcmVjdG9yeSBsaXN0aW5nIG9mIHRoZSBmaWxlcyB0aGF0IG1hdGNoIiwKKyAgICAiICB0aGUgZ2l2ZW4gZmlsZXNwZWMsIG9yIGlmIG5vbmUgaXMgZ2l2ZW4sIGFsbCB0aGUgZmlsZXMgaW4gaXRzIGN1cnJlbnQiLAorICAgICIgIGRpcmVjdG9yeS4gIFZESVJFQ1RPUlkgaXMgbmVlZGVkIGZvciBnZXR0aW5nIHZlcmJvc2UgZGlyZWN0b3J5IiwKKyAgICAiICBsaXN0aW5ncyBmcm9tIGNlcnRhaW4gRlRQIHNlcnZlcnMsIHN1Y2ggYXMgb24gVE9QUy0yMC4gIFRyeSBpdCBpZiIsCisgICAgIiAgRlRQIERJUkVDVE9SWSBsaXN0cyBvbmx5IGZpbGVuYW1lcyB3aXRob3V0IGRldGFpbHMuIiwKKyAgICAiIgorfTsKK3N0YXRpYyBjaGFyICogZmhzX2ZlYVtdID0geyAgICAgICAgICAgICAvKiBGRUFUVVJFUyAqLworICAgICJTeW50YXg6IEZUUCBGRUFUVVJFUyIsCisgICAgIiAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byBsaXN0IGl0cyBzcGVjaWFsIGZlYXR1cmVzLiAgTW9zdCBGVFAgc2VydmVycyIsCisgICAgIiAgZG8gbm90IHJlY29nbml6ZSB0aGlzIGNvbW1hbmQuIiwKKyAgICAiIgorfTsKK3N0YXRpYyBjaGFyICogZmhzX21nZVtdID0geyAgICAgICAgICAgICAvKiBNR0VUICovCisgICAgIlN5bnRheDogWyBGVFAgXSBNR0VUIFsgb3B0aW9ucyBdIGZpbGVzcGVjIFsgZmlsZXNwZWMgWyBmaWxlc3BlYyAuLi4gXSBdIiwKKyAgICAiICBEb3dubG9hZCBhIHNpbmdsZSBmaWxlIG9yIG11bHRpcGxlIGZpbGVzLiAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byBzZW5kIiwKKyAgICAiICB0aGUgZ2l2ZW4gZmlsZSBvciBmaWxlcy4gIEFsc28gc2VlIEZUUCBHRVQuICBPcHRpb25hbCBzd2l0Y2hlczoiLAorICAgICIgIiwKKyAgICAiICAvQVMtTkFNRTp0ZXh0IiwKKyAgICAiICAgIE5hbWUgdW5kZXIgd2hpY2ggdG8gc3RvcmUgaW5jb21pbmcgZmlsZS4iLAorICAgICIgICAgUGF0dGVybiByZXF1aXJlZCBmb3IgZm9yIG11bHRpcGxlIGZpbGVzLiIsCisgICAgIiAgL0JJTkFSWSIsICAgICAgICAgICAgICAgICAgICAgICAgLyogL0lNQUdFICovCisgICAgIiAgICBGb3JjZSBiaW5hcnkgbW9kZS4gIFN5bm9ueW06IC9JTUFHRS4iLAorICAgICIgIC9DT0xMSVNJT046e0JBQ0tVUCxSRU5BTUUsVVBEQVRFLERJU0NBUkQsQVBQRU5ELE9WRVJXUklURX0iLAorICAgIiAgICBXaGF0IHRvIGRvIGlmIGFuIGluY29taW5nIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYW4gZXhpc3RpbmcgZmlsZS4iLAorCisjaWZkZWYgUFVUUElQRQorICAgICIgIC9DT01NQU5EIiwKKyAgICAiICAgIFNwZWNpZmllcyB0aGF0IHRoZSBhcy1uYW1lIGlzIGEgY29tbWFuZCB0byB3aGljaCB0aGUgaW5jb21pbmcgZmlsZSIsCisgICAgIiAgICBpcyB0byBiZSBwaXBlZCBhcyBzdGFuZGFyZCBpbnB1dC4iLAorI2VuZGlmIC8qIFBVVFBJUEUgKi8KKworI2lmZGVmIERPVVBEQVRFCisgICAgIiAgL0RBVEVTLURJRkZFUiIsCisgICAgIiAgICBEb3dubG9hZCBvbmx5IHRob3NlIGZpbGVzIHdob3NlIG1vZGlmaWNhdGlvbiBkYXRlLXRpbWVzIGRpZmZlciBmcm9tIiwKKyAgICAiICAgIHRob3NlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsIGZpbGVzLCBvciB0aGF0IGRvIG5vdCBhbHJlYWR5IiwKKyAgICAiICAgIGV4aXN0IG9uIHRoZSBsb2NhbCBjb21wdXRlci4iLAorI2VuZGlmIC8qIERPVVBEQVRFICovCisKKyAgICAiICAvREVMRVRFIiwKKyAgICAiICAgIFNwZWNpZmllcyB0aGF0IGVhY2ggZmlsZSBpcyB0byBiZSBkZWxldGVkIGZyb20gdGhlIHNlcnZlciBhZnRlciwiLAorICAgICIgICAgYW5kIG9ubHkgaWYsIGl0IGlzIHN1Y2Nlc3NmdWxseSBkb3dubG9hZGVkLiIsCisgICAgIiAgL0VSUk9SLUFDVElPTjp7UFJPQ0VFRCxRVUlUfSIsCisgICAgIiAgICBXaGVuIGRvd25sb2FkaW5nIGEgZ3JvdXAgb2YgZmlsZXMsIHdoYXQgdG8gZG8gdXBvbiBmYWlsdXJlIHRvIiwKKyAgICAiICAgIHRyYW5zZmVyIGEgZmlsZTogcXVpdCBvciBwcm9jZWVkIHRvIHRoZSBuZXh0IG9uZS4iLAorICAgICIgIC9FWENFUFQ6cGF0dGVybiIsCisgICAgIiAgICBFeGNlcHRpb24gbGlzdDogZG9uJ3QgZG93bmxvYWQgYW55IGZpbGVzIHRoYXQgbWF0Y2ggdGhpcyBwYXR0ZXJuLiIsCisgICAgIiAgICBTZWUgSEVMUCBXSUxEQ0FSRCBmb3IgcGF0dGVybiBzeW50YXguIiwKKyAgICAiICAvRklMRU5BTUVTOntBVVRPTUFUSUMsQ09OVkVSVEVELExJVEVSQUx9IiwKKyAgICAiICAgIFdoZXRoZXIgdG8gY29udmVydCBpbmNvbWluZyBmaWxlbmFtZXMgdG8gbG9jYWwgc3ludGF4LiIsCisjaWZkZWYgUElQRVNFTkQKKyNpZm5kZWYgTk9TUEwKKyAgICAiICAvRklMVEVSOmNvbW1hbmQiLAorICAgICIgICAgUGFzcyBpbmNvbWluZyBmaWxlcyB0aHJvdWdoIHRoZSBnaXZlbiBjb21tYW5kLiIsCisjZW5kaWYgLyogTk9TUEwgKi8KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworICAgICIgIC9MQVJHRVItVEhBTjpudW1iZXIiLAorICAgICIgICAgT25seSBkb3dubG9hZCBmaWxlcyB0aGF0IGFyZSBsYXJnZXIgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLiIsCisgICAgIiAgL0xJU1RGSUxFOmZpbGVuYW1lIiwKKyAgICAiICAgIE9idGFpbiB0aGUgbGlzdCBvZiBmaWxlcyB0byBkb3dubG9hZCBmcm9tIHRoZSBnaXZlbiBmaWxlLiIsCisjaWZuZGVmIE5PQ1NFVFMKKyAgICAiICAvTE9DQUwtQ0hBUkFDVEVSLVNFVDpuYW1lIiwKKyAgICAiICAgIFdoZW4gZG93bmxvYWRpbmcgaW4gdGV4dCBtb2RlIGFuZCBjaGFyYWN0ZXItc2V0IGNvbnZlcnNpb24gaXMiLAorICAgICIgICAgZGVzaXJlZCwgdGhpcyBzcGVjaWZpZXMgdGhlIHRhcmdldCBzZXQuIiwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgIiAgL01BVENIOnBhdHRlcm4iLAorICAgICIgICAgU3BlY2lmaWVzIGEgcGF0dGVybiB0byBiZSB1c2VkIHRvIHNlbGVjdCBmaWxlbmFtZXMgbG9jYWxseSBmcm9tIHRoZSIsCisgICAgIiAgICBzZXJ2ZXIncyBsaXN0LiIsCisgICAgIiAgL01MU0QiLAorICAgICIgICAgRm9yY2VzIHNlbmRpbmcgb2YgTUxTRCAocmF0aGVyIHRoYW4gTkxTVCkgdG8gZ2V0IHRoZSBmaWxlIGxpc3QuIiwKKyNpZmRlZiBDS19UTVBESVIKKyAgICAiICAvTU9WRS1UTzpkaXJlY3RvcnkiLAorICAgICIgICAgRWFjaCBmaWxlIHRoYXQgaXMgZG93bmxvYWRlZCBpcyB0byBiZSBtb3ZlZCB0byB0aGUgZ2l2ZW4gbG9jYWwiLAorICAgICIgICAgZGlyZWN0b3J5IGltbWVkaWF0ZWx5IGFmdGVyLCBhbmQgb25seSBpZiwgaXQgaGFzIGJlZW4gcmVjZWl2ZWQiLAorICAgICIgICAgc3VjY2Vzc2Z1bGx5LiIsCisjZW5kaWYgLyogQ0tfVE1QRElSICovCisgICAgIiAgL05BTUVMSVNUOmZpbGVuYW1lIiwKKyAgICAiICAgIEluc3RlYWQgb2YgZG93bmxvYWRpbmcgdGhlIGZpbGVzLCBzdG9yZXMgdGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCIsCisgICAgIiAgICB3b3VsZCBiZSBkb3dubG9hZGVkIGluIHRoZSBnaXZlbiBsb2NhbCBmaWxlLCBvbmUgZmlsZW5hbWUgcGVyIGxpbmUuIiwKKyAgICAiICAvTkxTVCIsCisgICAgIiAgICBGb3JjZXMgc2VuZGluZyBvZiBOTFNUIChyYXRoZXIgdGhhbiBNTFNEKSB0byBnZXQgdGhlIGZpbGUgbGlzdC4iLAorICAgICIgIC9OT0JBQ0tVUEZJTEVTIiwKKyAgICAiICAgIERvbid0IGRvd25sb2FkIGFueSBmaWxlcyB3aG9zZSBuYW1lcyBlbmQgd2l0aCAufjxudW1iZXI+fi4iLAorICAgICIgIC9OT0RPVEZJTEVTIiwKKyAgICAiICAgIERvbid0IGRvd25sb2FkIGFueSBmaWxlcyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIHBlcmlvZCAoLikuIiwKKyAgICAiICAvUVVJRVQiLAorICAgICIgICAgU3VwcHJlc3MgdGhlIGZpbGUtdHJhbnNmZXIgZGlzcGxheS4iLAorI2lmZGVmIEZUUF9SRVNUQVJUCisgICAgIiAgL1JFQ09WRVIiLCAgICAgICAgICAgICAgICAgICAgICAgLyogL1JFU1RBUlQgKi8KKyAgICAiICAgIFJlc3VtZSBhIGRvd25sb2FkIHRoYXQgd2FzIHByZXZpb3VzbHkgaW50ZXJydXB0ZWQgZnJvbSB0aGUgcG9pbnQgb2YiLAorICAgICIgICAgZmFpbHVyZS4gIFdvcmtzIG9ubHkgaW4gYmluYXJ5IG1vZGUuICBOb3Qgc3VwcG9ydGVkIGJ5IGFsbCBzZXJ2ZXJzLiIsCisgICAgIiAgICBTeW5vbnltOiAvUkVTVEFSVC4iLAorI2VuZGlmIC8qIEZUUF9SRVNUQVJUICovCisjaWZkZWYgUkVDVVJTSVZFCisgICAgIiAgL1JFQ1VSU0lWRSIsICAgICAgICAgICAgICAgICAgICAgLyogL1NVQkRJUkVDVE9SSUVTICovCisgICAgIiAgICBDcmVhdGUgc3ViZGlyZWN0b3JpZXMgYXV0b21hdGljYWxseSBpZiB0aGUgc2VydmVyIHNlbmRzIGZpbGVzIiwKKyAgICAiICAgIHJlY3Vyc2l2ZWx5IGFuZCBpbmNsdWRlcyBwYXRobmFtZXMgKG1vc3QgZG9uJ3QpLiIsCisjZW5kaWYgLyogUkVDVVJTSVZFICovCisgICAgIiAgL1JFTkFNRS1UTzp0ZXh0IiwKKyAgICAiICAgIEVhY2ggZmlsZSB0aGF0IGlzIGRvd25sb2FkZWQgaXMgdG8gYmUgcmVuYW1lZCBhcyBpbmRpY2F0ZWQganVzdCwiLAorICAgICIgICAgYWZ0ZXIsIGFuZCBvbmx5IGlmLCBpdCBoYXMgYXJyaXZlZCBzdWNjZXNzZnVsbHkuIiwKKyNpZm5kZWYgTk9DU0VUUworICAgICIgIC9TRVJWRVItQ0hBUkFDVEVSLVNFVDpuYW1lIiwKKyAgICAiICAgIFdoZW4gZG93bmxvYWRpbmcgaW4gdGV4dCBtb2RlIGFuZCBjaGFyYWN0ZXItc2V0IGNvbnZlcnNpb24gaXMgZGVzaXJlZCIKKywgICAiICAgIHRoaXMgc3BlY2lmaWVzIHRoZSBvcmlnaW5hbCBmaWxlJ3MgY2hhcmFjdGVyIHNldCBvbiB0aGUgc2VydmVyLiIsCisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgICIgIC9TRVJWRVItUkVOQU1FOnRleHQiLAorICAgICIgICAgRWFjaCBzZXJ2ZXIgc291cmNlIGZpbGUgaXMgdG8gYmUgcmVuYW1lZCBvbiB0aGUgc2VydmVyIGFzIGluZGljYXRlZCIsCisgICAgIiAgICBpbW1lZGlhdGVseSBhZnRlciwgYnV0IG9ubHkgaWYsIGl0IGhhcyBhcnJpdmVkIHN1Y2Nlc2Z1bGx5LiIsCisgICAgIiAgL1NNQUxMRVItVEhBTjpudW1iZXIiLAorICAgICIgICAgRG93bmxvYWQgb25seSB0aG9zZSBmaWxlcyBzbWFsbGVyIHRoYW4gdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcy4iLAorICAgICIgIC9URVhUIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC9BU0NJSSAqLworICAgICIgICAgRm9yY2UgdGV4dCBtb2RlLiAgU3lub255bTogL0FTQ0lJLiIsCisgICAgIiAgL1RFTkVYIiwKKyAgICAiICAgIEZvcmNlIFRFTkVYIChUT1BTLTIwKSBtb2RlIChzZWUgSEVMUCBTRVQgRlRQIFRZUEUpLiIsCisjaWZuZGVmIE5PQ1NFVFMKKyAgICAiICAvVFJBTlNQQVJFTlQiLAorICAgICIgICAgV2hlbiBkb3dubG9hZGluZyBpbiB0ZXh0IG1vZGUsIGRvIG5vdCBjb252ZXJ0IGNocmFjdGVyLXNldHMuIiwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgIiAgL1RPLVNDUkVFTiIsCisgICAgIiAgICBUaGUgZG93bmxvYWRlZCBmaWxlIGlzIHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuLiIsCisjaWZkZWYgRE9VUERBVEUKKyAgICAiICAvVVBEQVRFIiwKKyAgICAiICAgIEVxdWl2YWxlbnQgdG8gL0NPTExJU0lPTjpVUERBVEUuICBEb3dubG9hZCBvbmx5IHRob3NlIGZpbGVzIHRoYXQgYXJlIiwKKyAgICAiICAgIG5ld2VyIHRoYW4gdGhhbiB0aGVpciBsb2NhbCBjb3VudGVycGFydHMsIG9yIHRoYXQgZG8gbm90IGV4aXN0IG9uIiwKKyAgICAiICAgIHRoZSBsb2NhbCBjb21wdXRlci4iLAorI2VuZGlmIC8qIERPVVBEQVRFICovCisgICAgIiIKK307CitzdGF0aWMgY2hhciAqIGZoc19obHBbXSA9IHsgICAgICAgICAgICAgLyogSEVMUCAqLworICAgICJTeW50YXg6IEZUUCBIRUxQIFsgY29tbWFuZCBbIHN1YmNvbW1hbmQuLi4gXSBdIiwKKyAgICAiICBBc2tzIHRoZSBGVFAgc2VydmVyIGZvciBoZWxwIGFib3V0IHRoZSBnaXZlbiBjb21tYW5kLiAgRmlyc3QgdXNlIiwKKyAgICAiICBGVFAgSEVMUCBieSBpdHNlbGYgdG8gZ2V0IGEgbGlzdCBvZiBjb21tYW5kcywgdGhlbiB1c2UgSEVMUCBGVFAgeHh4IiwKKyAgICAiICB0byBnZXQgaGVscCBmb3IgY29tbWFuZCBcInh4eFwiLiAgU3lub255bXM6IFJFTU9URSBIRUxQLCBSSEVMUC4iLAorICAgICIiCit9Oworc3RhdGljIGNoYXIgKiBmaHNfaWRsW10gPSB7ICAgICAgICAgICAgIC8qIElETEUgKi8KKyAgICAiU3ludGF4OiBGVFAgSURMRSBbIG51bWJlciBdIiwKKyAgICAiICBJZiBnaXZlbiB3aXRob3V0IGEgbnVtYmVyLCB0aGlzIGFza3MgdGhlIEZUUCBzZXJ2ZXIgdG8gdGVsbCBpdHMiLAorICAgICIgIGN1cnJlbnQgaWRsZS10aW1lIGxpbWl0LiAgSWYgZ2l2ZW4gd2l0aCBhIG51bWJlciwgaXQgYXNrcyB0aGUgc2VydmVyIiwKKyAgICAiICB0byBjaGFuZ2UgaXRzIGlkbGUtdGltZSBsaW1pdCB0byB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNlY29uZHMuIiwKKyAgICAiIgorfTsKK3N0YXRpYyBjaGFyICogZmhzX3VzcltdID0geyAgICAgICAgICAgICAvKiBVU0VSLCBMT0dJTiAqLworICAgICJTeW50YXg6IEZUUCBVU0VSIHVzZXJuYW1lIFsgcGFzc3dvcmQgWyBhY2NvdW50IF0gXSIsCisgICAgIiAgTG9nIGluIHRvIHRoZSBGVFAgc2VydmVyLiAgVG8gYmUgdXNlZCB3aGVuIGNvbm5lY3RlZCBidXQgbm90IHlldCIsCisgICAgIiAgbG9nZ2VkIGluLCBlLmcuIHdoZW4gU0VUIEZUUCBBVVRPTE9HSU4gaXMgT0ZGIG9yIGF1dG9sb2dpbiBmYWlsZWQuIiwKKyAgICAiICBJZiB5b3Ugb21pdCB0aGUgcGFzc3dvcmQsIGFuZCBvbmUgaXMgcmVxdWlyZWQgYnkgdGhlIHNlcnZlciwgeW91IGFyZSIsCisgICAgIiAgcHJvbXB0ZWQgZm9yIGl0LiAgSWYgeW91IG9taXQgdGhlIGFjY291bnQsIG5vIGFjY291bnQgaXMgc2VudC4iLAorICAgICIgIFN5bm9ueW06IEZUUCBMT0dJTi4iLAorICAgICIiCit9Oworc3RhdGljIGNoYXIgKiBmaHNfZ2V0W10gPSB7ICAgICAgICAgICAgIC8qIEdFVCAqLworICAgICJTeW50YXg6IFsgRlRQIF0gR0VUIFsgb3B0aW9ucyBdIGZpbGVuYW1lIFsgYXMtbmFtZSBdIiwKKyAgICAiICBEb3dubG9hZCBhIHNpbmdsZSBmaWxlLiAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byBzZW5kIHRoZSBnaXZlbiBmaWxlLiIsCisgICAgIiAgVGhlIG9wdGlvbmFsIGFzLW5hbWUgaXMgdGhlIG5hbWUgdG8gc3RvcmUgaXQgdW5kZXIgd2hlbiBpdCBhcnJpdmVzOyIsCisgICAgIiAgaWYgb21pdHRlZCwgdGhlIGZpbGUgaXMgc3RvcmVkIHdpdGggdGhlIG5hbWUgaXQgYXJyaXZlZCB3aXRoLCBhcyIsCisgICAgIiAgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBGVFAgRklMRU5BTUVTIHNldHRpbmcgb3IgL0ZJTEVOQU1FUzogc3dpdGNoIiwKKyAgICAiICB2YWx1ZS4gIEFzaWRlIGZyb20gdGhlIGZpbGUgbGlzdCBhbmQgYXMtbmFtZSwgc3ludGF4IGFuZCBvcHRpb25zIGFyZSIsCisgICAgIiAgdGhlIHNhbWUgYXMgZm9yIEZUUCBNR0VULCB3aGljaCBpcyB1c2VkIGZvciBkb3dubG9hZGluZyBtdWx0aXBsZSBmaWxlcy4iCissICAgIiIKK307CitzdGF0aWMgY2hhciAqIGZoc19ta2RbXSA9IHsgICAgICAgICAgICAgLyogTUtESVIgKi8KKyAgICAiU3ludGF4OiBGVFAgTUtESVIgZGlyZWN0b3J5IiwKKyAgICAiICBBc2tzIHRoZSBGVFAgc2VydmVyIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeSB3aXRoIHRoZSBnaXZlbiBuYW1lLCIsCisgICAgIiAgd2hpY2ggbXVzdCBiZSBpbiB0aGUgc3ludGF4IG9mIHRoZSBzZXJ2ZXIncyBmaWxlIHN5c3RlbS4gIFN5bm9ueW1zOiIsCisgICAgIiAgUkVNT1RFIE1LRElSLCBSTUtESVIuIiwKKyAgICAiIgorfTsKK3N0YXRpYyBjaGFyICogZmhzX21vZFtdID0geyAgICAgICAgICAgICAvKiBNT0RUSU1FICovCisgICAgIlN5bnRheDogRlRQIE1PRFRJTUUgZmlsZW5hbWUiLAorICAgICIgIEFza3MgdGhlIEZUUCBzZXJ2ZXIgdG8gc2VuZCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGdpdmVuIGZpbGUsIiwKKyAgICAiICB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi4gIFRoZSBkYXRlLXRpbWUgZm9ybWF0IGlzIGFsbCBudW1lcmljOiIsCisgICAgIiAgeXl5eW1tZGRoaG1tc3N4eHguLi4gKHdoZXJlIHh4eC4uLiBpcyAwIG9yIG1vcmUgZGlnaXRzIGluZGljYXRpbmciLAorICAgICIgIGZyYWN0aW9ucyBvZiBzZWNvbmRzKS4iLAorICAgICIiCit9Oworc3RhdGljIGNoYXIgKiBmaHNfbXB1W10gPSB7ICAgICAgICAgICAgIC8qIE1QVVQgKi8KKyAgICAiU3ludGF4OiBbIEZUUCBdIE1QVVQgWyBzd2l0Y2hlcyBdIGZpbGVzcGVjIFsgZmlsZXNwZWMgWyBmaWxlc3BlYyAuLi4gXSBdIiwKKyAgICAiICBVcGxvYWRzIGZpbGVzLiAgU2VuZHMgdGhlIGdpdmVuIGZpbGUgb3IgZmlsZXMgdG8gdGhlIEZUUCBzZXJ2ZXIuIiwKKyAgICAiICBBbHNvIHNlZSBGVFAgUFVULiAgT3B0aW9uYWwgc3dpdGNoZXMgYXJlOiIsCisgICAgIiAiLAorICAgICIgIC9BRlRFUjpkYXRlLXRpbWUiLAorICAgICIgICAgVXBsb2FkcyBvbmx5IHRob3NlIGZpbGVzIG5ld2VyIHRoYW4gdGhlIGdpdmVuIGRhdGUtdGltZS4iLAorICAgICIgICAgSEVMUCBEQVRFIGZvciBpbmZvIGFib3V0IGRhdGUtdGltZSBmb3JtYXRzLiAgU3lub255bTogL1NJTkNFLiIsCisjaWZkZWYgUFVUQVJSQVkKKyAgICAiICAvQVJSQVk6YXJyYXktZGVzaWduYXRvciIsCisgICAgIiAgICBUZWxscyBLZXJtaXQgdG8gdXBsb2FkIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gYXJyYXksIHJhdGhlciB0aGFuIiwKKyAgICAiICAgIGEgZmlsZS4iLAorI2VuZGlmIC8qIFBVVEFSUkFZICovCisgICAgIiAgL0FTLU5BTUU6dGV4dCIsCisgICAgIiAgICBOYW1lIHVuZGVyIHdoaWNoIHRvIHNlbmQgZmlsZXMuIiwKKyAgICAiICAgIFBhdHRlcm4gcmVxdWlyZWQgZm9yIGZvciBtdWx0aXBsZSBmaWxlcy4iLAorICAgICIgIC9CRUZPUkU6ZGF0ZS10aW1lIiwKKyAgICAiICAgIFVwbG9hZCBvbmx5IHRob3NlIGZpbGVzIG9sZGVyIHRoYW4gdGhlIGdpdmVuIGRhdGUtdGltZS4iLAorICAgICIgIC9CSU5BUlkiLAorICAgICIgICAgRm9yY2UgYmluYXJ5IG1vZGUuICBTeW5vbnltOiAvSU1BR0UuIiwKKyNpZmRlZiBQVVRQSVBFCisgICAgIiAgL0NPTU1BTkQiLAorICAgICIgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGZpbGVzcGVjIGlzIGEgY29tbWFuZCB3aG9zZSBzdGFuZGFyZCBvdXRwdXQgaXMiLAorICAgICIgICAgdG8gYmUgc2VudC4iLAorI2VuZGlmIC8qIFBVVFBJUEUgKi8KKworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBET1VQREFURQorICAgICIgIC9EQVRFUy1ESUZGRVIiLAorICAgICIgICAgVXBsb2FkIG9ubHkgdGhvc2UgZmlsZXMgd2hvc2UgbW9kaWZpY2F0aW9uIGRhdGUtdGltZXMgZGlmZmVyIGZyb20iLAorICAgICIgICAgdGhvc2Ugb24gdGhlIHNlcnZlciwgb3IgdGhhdCBkb24ndCBleGlzdCBvbiB0aGUgc2VydmVyIGF0IGFsbC4iLAorI2VuZGlmIC8qIERPVVBEQVRFICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgIiAgL0RFTEVURSIsCisgICAgIiAgICBTcGVjaWZpZXMgdGhhdCBlYWNoIHNvdXJjZSBmaWxlIGlzIHRvIGJlIGRlbGV0ZWQgYWZ0ZXIsIGFuZCBvbmx5IGlmLCIsCisgICAgIiAgICBpdCBpcyBzdWNjZXNzZnVsbHkgdXBsb2FkZWQuIiwKKyAgICAiICAvRE9URklMRVMiLAorICAgICIgICAgSW5jbHVkZSBmaWxlcyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIHBlcmlvZCAoLikuIiwKKyAgICAiICAvRVJST1ItQUNUSU9OOntQUk9DRUVELFFVSVR9IiwKKyAgICAiICAgIFdoZW4gdXBsb2FkaW5nIGEgZ3JvdXAgb2YgZmlsZXMsIHdoYXQgdG8gZG8gdXBvbiBmYWlsdXJlIHRvIiwKKyAgICAiICAgIHRyYW5zZmVyIGEgZmlsZTogcXVpdCBvciBwcm9jZWVkIHRvIHRoZSBuZXh0IG9uZS4iLAorICAgICIgIC9FWENFUFQ6cGF0dGVybiIsCisgICAgIiAgICBFeGNlcHRpb24gbGlzdDogZG9uJ3QgdXBsb2FkIGFueSBmaWxlcyB0aGF0IG1hdGNoIHRoaXMgcGF0dGVybi4iLAorICAgICIgICAgU2VlIEhFTFAgV0lMRENBUkQgZm9yIHBhdHRlcm4gc3ludGF4LiIsCisgICAgIiAgL0ZJTEVOQU1FUzp7QVVUT01BVElDLENPTlZFUlRFRCxMSVRFUkFMfSIsCisgICAgIiAgICBXaGV0aGVyIHRvIGNvbnZlcnQgb3V0Ym91bmQgZmlsZW5hbWVzIHRvIGNvbW1vbiBzeW50YXguIiwKKyNpZmRlZiBQSVBFU0VORAorI2lmbmRlZiBOT1NQTAorICAgICIgIC9GSUxURVI6Y29tbWFuZCIsCisgICAgIiAgICBQYXNzIG91dGJvdW5kIGZpbGVzIHRocm91Z2ggdGhlIGdpdmVuIGNvbW1hbmQuIiwKKyNlbmRpZiAvKiBOT1NQTCAqLworI2VuZGlmIC8qIFBJUEVTRU5EICovCisjaWZkZWYgQ0tTWU1MSU5LCisgICAgIiAgL0ZPTExPV0lOS1MiLAorICAgICIgICAgU2VuZCBmaWxlcyB0aGF0IGFyZSBwb2ludGVkIHRvIGJ5IHN5bWJvbGljIGxpbmtzLiIsCisgICAgIiAgL05PRk9MTE9XSU5LUyIsCisgICAgIiAgICBTa2lwIG92ZXIgc3ltYm9saWMgbGlua3MgKGRlZmF1bHQpLiIsCisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisgICAgIiAgL0xBUkdFUi1USEFOOm51bWJlciIsCisgICAgIiAgICBPbmx5IHVwbG9hZCBmaWxlcyB0aGF0IGFyZSBsYXJnZXIgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLiIsCisgICAgIiAgL0xJU1RGSUxFOmZpbGVuYW1lIiwKKyAgICAiICAgIE9idGFpbiB0aGUgbGlzdCBvZiBmaWxlcyB0byB1cGxvYWQgZnJvbSB0aGUgZ2l2ZW4gZmlsZS4iLAorI2lmbmRlZiBOT0NTRVRTCisgICAgIiAgL0xPQ0FMLUNIQVJBQ1RFUi1TRVQ6bmFtZSIsCisgICAgIiAgICBXaGVuIHVwbG9hZGluZyBpbiB0ZXh0IG1vZGUgYW5kIGNoYXJhY3Rlci1zZXQgY29udmVyc2lvbiBpcyIsCisgICAgIiAgICBkZXNpcmVkLCB0aGlzIHNwZWNpZmllcyB0aGUgc291cmNlLWZpbGUgY2hhcmFjdGVyIHNldC4iLAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyNpZmRlZiBDS19UTVBESVIKKyAgICAiICAvTU9WRS1UTzpkaXJlY3RvcnkiLAorICAgICIgICAgRWFjaCBzb3VyY2UgZmlsZSB0aGF0IGlzIHVwbG9hZGVkIGlzIHRvIGJlIG1vdmVkIHRvIHRoZSBnaXZlbiBsb2NhbCIsCisgICAgIiAgICBkaXJlY3Rvcnkgd2hlbiwgYW5kIG9ubHkgaWYsIHRoZSB0cmFuc2ZlciBpcyBzdWNjZXNzZnVsLiIsCisjZW5kaWYgLyogQ0tfVE1QRElSICovCisgICAgIiAgL05PQkFDS1VQRklMRVMiLAorICAgICIgICAgRG9uJ3QgdXBsb2FkIGFueSBmaWxlcyB3aG9zZSBuYW1lcyBlbmQgd2l0aCAufjxudW1iZXI+fi4iLAorI2lmZGVmIFVOSVhPUk9TSworICAgICIgIC9OT0RPVEZJTEVTIiwKKyAgICAiICAgIERvbid0IHVwbG9hZCBhbnkgZmlsZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBwZXJpb2QgKC4pLiIsCisjZW5kaWYgLyogVU5JWE9ST1NLICovCisgICAgIiAgL05PVC1BRlRFUjpkYXRlLXRpbWUiLAorICAgICIgICAgVXBsb2FkIG9ubHkgZmlsZXMgdGhhdCBhcmUgbm90IG5ld2VyIHRoYW4gdGhlIGdpdmVuIGRhdGUtdGltZSIsCisgICAgIiAgL05PVC1CRUZPUkU6ZGF0ZS10aW1lIiwKKyAgICAiICAgIFVwbG9hZCBvbmx5IGZpbGVzIHRoYXQgYXJlIG5vdCBvbGRlciB0aGFuIHRoZSBnaXZlbiBkYXRlLXRpbWUiLAorI2lmZGVmIFVOSVgKKyAgICAiICAvUEVSTUlTU0lPTlMiLAorICAgICIgICAgQXNrIHRoZSBzZXJ2ZXIgdG8gc2V0IHRoZSBwZXJtaXNzaW9ucyBvZiBlYWNoIGZpbGUgaXQgcmVjZWl2ZXMiLAorICAgICIgICAgYWNjb3JkaW5nIHRvIHRoZSBzb3VyY2UgZmlsZSdzIHBlcm1pc3Npb25zLiIsCisjZW5kaWYgLyogVU5JWCAqLworICAgICIgIC9RVUlFVCIsCisgICAgIiAgICBTdXBwcmVzcyB0aGUgZmlsZS10cmFuc2ZlciBkaXNwbGF5LiIsCisjaWZkZWYgRlRQX1JFU1RBUlQKKyAgICAiICAvUkVDT1ZFUiIsCisgICAgIiAgICBSZXN1bWUgYW4gdXBsb2FkIHRoYXQgd2FzIHByZXZpb3VzbHkgaW50ZXJydXB0ZWQgZnJvbSB0aGUgcG9pbnQgb2YiLAorICAgICIgICAgZmFpbHVyZS4gIFN5bm9ueW06IC9SRVNUQVJULiIsCisjZW5kaWYgLyogRlRQX1JFU1RBUlQgKi8KKyNpZmRlZiBSRUNVUlNJVkUKKyAgICAiICAvUkVDVVJTSVZFIiwKKyAgICAiICAgIFNlbmQgZmlsZXMgZnJvbSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGFuZCBhbGwgdGhlIGRpcmVjdG9yaWVzIGJlbmVhdGgiLAorICAgICIgICAgaXQuICBTeW5vbnltOiAvU1VCRElSRUNUT1JJRVMuIiwKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICAiICAvUkVOQU1FLVRPOnRleHQiLAorICAgICIgICAgRWFjaCBzb3VyY2UgZmlsZSB0aGF0IGlzIHVwbG9hZGVkIGlzIHRvIGJlIHJlbmFtZWQgb24gdGhlIGxvY2FsIiwKKyAgICAiICAgIGxvY2FsIGNvbXB1dGVyIGFzIGluZGljYXRlZCB3aGVuIGFuZCBvbmx5IGlmLCB0aGUgdHJhbnNmZXIgY29tcGxldGVzIiwKKyAgICAiICAgIHN1Y2Nlc3NmdWxseS4iLAorI2lmbmRlZiBOT0NTRVRTCisgICAgIiAgL1NFUlZFUi1DSEFSQUNURVItU0VUOm5hbWUiLAorICAgICIgICAgV2hlbiB1cGxvYWRpbmcgaW4gdGV4dCBtb2RlIGFuZCBjaGFyYWN0ZXItc2V0IGNvbnZlcnNpb24gaXMgZGVzaXJlZCwiLAorICAgICIgICAgdGhpcyBzcGVjaWZpZXMgdGhlIGNoYXJhY3RlciBzZXQgdG8gd2hpY2ggdGhlIGZpbGUgc2hvdWxkIGJlIiwKKyAgICAiICAgIGNvbnZlcnRlZCBmb3Igc3RvcmFnZSBvbiB0aGUgc2VydmVyLiIsCisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgICIgIC9TRVJWRVItUkVOQU1FOnRleHQiLAorICAgICIgICAgRWFjaCBmaWxlIHRoYXQgaXMgdXBsb2FkZWQgaXMgdG8gYmUgcmVuYW1lZCBhcyBpbmRpY2F0ZWQgb24gdGhlIiwKKyAgICAiICAgIHNlcnZlciBhZnRlciwgYW5kIG9ubHkgaWYsIGlmIGFycml2ZXMgc3VjY2Vzc2Z1bGx5LiIsCisgICAgIiAgL1NJTVVMQVRFIiwKKyAgICAiICAgIFNob3cgd2hpY2ggZmlsZXMgd291bGQgYmUgc2VudCB3aXRob3V0IGFjdHVhbGx5IHNlbmRpbmcgdGhlbS4iLAorICAgICIgIC9TTUFMTEVSLVRIQU46bnVtYmVyIiwKKyAgICAiICAgIFVwbG9hZCBvbmx5IHRob3NlIGZpbGVzIHNtYWxsZXIgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLiIsCisgICAgIiAgL1RFWFQiLAorICAgICIgICAgRm9yY2UgdGV4dCBtb2RlLiAgU3lub255bTogL0FTQ0lJLiIsCisgICAgIiAgL1RFTkVYIiwKKyAgICAiICAgIEZvcmNlIFRFTkVYIChUT1BTLTIwKSBtb2RlIChzZWUgSEVMUCBTRVQgRlRQIFRZUEUpLiIsCisjaWZuZGVmIE5PQ1NFVFMKKyAgICAiICAvVFJBTlNQQVJFTlQiLAorICAgICIgICAgV2hlbiB1cGxvYWRpbmcgaW4gdGV4dCBtb2RlLCBkbyBub3QgY29udmVydCBjaHJhY3Rlci1zZXRzLiIsCisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgICIgIC9UWVBFOntURVhULEJJTkFSWX0iLAorICAgICIgICAgVXBsb2FkIG9ubHkgZmlsZXMgb2YgdGhlIGdpdmVuIHR5cGUuIiwKKyNpZmRlZiBET1VQREFURQorICAgICIgIC9VUERBVEUiLAorICAgICIgICAgSWYgYSBmaWxlIG9mIHRoZSBzYW1lIG5hbWUgZXhpc3RzIG9uIHRoZSBzZXJ2ZXIsIHVwbG9hZCBvbmx5IGlmIiwKKyAgICAiICAgIHRoZSBsb2NhbCBmaWxlIGlzIG5ld2VyLiIsCisjZW5kaWYgLyogRE9VUERBVEUgKi8KKyAgICAiICAvVU5JUVVFLVNFUlZFUi1OQU1FUyIsCisgICAgIiAgICBBc2sgdGhlIHNlcnZlciB0byBjb21wdXRlIG5ldyBuYW1lcyBmb3IgYW55IGluY29taW5nIGZpbGUgdGhhdCBoYXMiLAorICAgICIgICAgdGhlIHNhbWUgbmFtZSBhcyBhbiBleGlzdGluZyBmaWxlLiIsCisgICAgIiIKK307CitzdGF0aWMgY2hhciAqIGZoc19vcG5bXSA9IHsgICAgICAgICAgICAgLyogT1BFTiAqLworI2lmZGVmIENLX1NTTAorICAgICJTeW50YXg6IEZUUCBbIE9QRU4gXSBbIHsgL1NTTCwgL1RMUyB9IF0gaG9zdG5hbWUgWyBwb3J0IF0gWyBzd2l0Y2hlcyBdIiwKKyAgICAiICBPcGVucyBhIGNvbm5lY3Rpb24gdG8gdGhlIEZUUCBzZXJ2ZXIgb24gdGhlIGdpdmVuIGhvc3QuICBUaGUgZGVmYXVsdCIsCisgICAgIiAgVENQIHBvcnQgaXMgMjEgKDk5MCBpZiBTU0wvVExTIGlzIHVzZWQpLCBidXQgYSBkaWZmZXJlbnQgcG9ydCBudW1iZXIiLAorICAgICIgIGNhbiBiZSBzdXBwbGllZCBpZiBuZWNlc3NhcnkuICBPcHRpb25hbCBzd2l0Y2hlcyBhcmU6IiwKKyNlbHNlIC8qIENLX1NTTCAqLworICAgICJTeW50YXg6IEZUUCBbIE9QRU4gXSBob3N0bmFtZSBbIHBvcnQgXSBbIHN3aXRjaGVzIF0iLAorICAgICIgIE9wZW5zIGEgY29ubmVjdGlvbiB0byB0aGUgRlRQIHNlcnZlciBvbiB0aGUgZ2l2ZW4gaG9zdC4gIFRoZSBkZWZhdWx0IiwKKyAgICAiICBUQ1AgcG9ydCBpcyAyMSwgYnV0IGEgZGlmZmVyZW50IHBvcnQgbnVtYmVyIGNhbiBiZSBzdXBwbGllZCBpZiIsCisgICAgIiAgbmVjZXNzYXJ5LiAgT3B0aW9uYWwgc3dpdGNoZXMgYXJlOiIsCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgIiAiLAorICAgICIgIC9BTk9OWU1PVVMiLAorICAgICIgICAgTG9ncyB5b3UgaW4gYW5vbnltb3VzbHkuIiwKKyAgICAiICAvVVNFUjp0ZXh0IiwKKyAgICAiICAgIFN1cHBsaWVzIHRoZSBnaXZlbiB0ZXh0IGFzIHlvdXIgdXNlcm5hbWUuIiwKKyAgICAiICAvUEFTU1dPUkQ6dGV4dCIsCisgICAgIiAgICBTdXBwbGllcyB0aGUgZ2l2ZW4gdGV4dCBhcyB5b3VyIHBhc3N3b3JkLiAgSWYgeW91IGluY2x1ZGUgYSB1c2VybmFtZSIsCisgICAgIiAgICBidXQgb21pdCB0aGlzIHN3aXRjaCBhbmQgdGhlIHNlcnZlciByZXF1aXJlcyBhIHBhc3N3b3JkLCB5b3UgYXJlIiwKKyAgICAiICAgIHByb21wdGVkIGZvciBpdC4iLAorICAgICIgIC9BQ0NPVU5UOnRleHQiLAorICAgICIgICAgU3VwcGxpZXMgdGhlIGdpdmVuIHRleHQgYXMgeW91ciBhY2NvdW50LCBpZiByZXF1aXJlZCBieSB0aGUgc2VydmVyLiIsCisgICAgIiAgL0FDVElWRSIsCisgICAgIiAgICBGb3JjZXMgYW4gYWN0aXZlIChyYXRoZXIgdGhhbiBwYXNzaXZlKSBjb25uZWN0aW9uLiIsCisgICAgIiAgL1BBU1NJVkUiLAorICAgICIgICAgRm9yY2VzIGEgcGFzc2l2ZSAocmF0aGVyIHRoYW4gYWN0aXZlKSBjb25uZWN0aW9uLiIsCisgICAgIiAgL05PSU5JVCIsCisgICAgIiAgICBJbmhpYml0cyBzZW5kaW5nIGluaXRpYWwgUkVTVCwgU1RSVSwgYW5kIE1PREUgY29tbWFuZHMsIHdoaWNoIGFyZSIsCisgICAgIiAgICB3ZWxsLWtub3duIHN0YW5kYXJkIGNvbW1hbmRzLCBidXQgdG8gd2hpY2ggc29tZSBzZXJ2ZXJzIHJlYWN0IGJhZGx5LiIsCisgICAgIiAgL05PTE9HSU4iLAorICAgICIgICAgSW5oaWJpdHMgYXV0b2xvZ2luIGZvciB0aGlzIGNvbm5lY3Rpb24gb25seS4iLAorICAgICIiCit9Oworc3RhdGljIGNoYXIgKiBmaHNfb3B0W10gPSB7ICAgICAgICAgICAgIC8qIE9QVFMsIE9QVElPTlMgKi8KKyAgICAiU3ludGF4OiBGVFAgT1BUSU9OUyIsCisgICAgIiAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byBsaXN0IGl0cyBjdXJyZW50IG9wdGlvbnMuICBBZHZhbmNlZCwgbmV3LCIsCisgICAgIiAgbm90IHN1cHBvcnRlZCBieSBtb3N0IEZUUCBzZXJ2ZXJzLiIsCisgICAgIiIKK307CitzdGF0aWMgY2hhciAqIGZoc19wdXRbXSA9IHsgICAgICAgICAgICAgLyogUFVULCBTRU5EICovCisgICAgIlN5bnRheDogWyBGVFAgXSBQVVQgWyBzd2l0Y2hlcyBdIGZpbGVzcGVjIFsgYXMtbmFtZSBdIiwKKyAgICAiICBMaWtlIEZUUCBNUFVULCBidXQgb25seSBvbmUgZmlsZXNwZWMgaXMgYWxsb3dlZCwgYW5kIGlmIGl0IGlzIGZvbGxvd2VkIiwKKyAgICAiICBieSBhbiBhZGRpdGlvbmFsIGZpZWxkLCB0aGlzIGlzIGludGVycHJldGVkIGFzIHRoZSBuYW1lIHVuZGVyIHdoaWNoIiwKKyAgICAiICB0byBzZW5kIHRoZSBmaWxlIG9yIGZpbGVzLiAgU2VlIEhFTFAgRlRQIE1QVVQuIiwKKyAgICAiIgorfTsKK3N0YXRpYyBjaGFyICogZmhzX3B3ZFtdID0geyAgICAgICAgICAgICAvKiBQV0QgKi8KKyAgICAiU3ludGF4OiBGVFAgUFdEIiwKKyAgICAiICBBc2tzIHRoZSBGVFAgc2VydmVyIHRvIHJldmVhbCBpdHMgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4iLAorICAgICIgIFN5bm9ueW1zOiBSRU1PVEUgUFdELCBSUFdELiIsCisgICAgIiIKK307CitzdGF0aWMgY2hhciAqIGZoc19xdW9bXSA9IHsgICAgICAgICAgICAgLyogUVVPVEUgKi8KKyAgICAiU3ludGF4OiBGVFAgUVVPVEUgdGV4dCIsCisgICAgIiAgU2VuZHMgYW4gRlRQIHByb3RvY29sIGNvbW1hbmQgdG8gdGhlIEZUUCBzZXJ2ZXIuICBVc2UgdGhpcyBjb21tYW5kIiwKKyAgICAiICBmb3Igc2VuZGluZyBjb21tYW5kcyB0aGF0IEtlcm1pdCBtaWdodCBub3Qgc3VwcG9ydC4iLAorICAgICIiCit9Oworc3RhdGljIGNoYXIgKiBmaHNfcmdlW10gPSB7ICAgICAgICAgICAgIC8qIFJFR0VUICovCisgICAgIlN5bnRheDogRlRQIFJFR0VUIiwKKyAgICAiICBTeW5vbnltIGZvciBGVFAgR0VUIC9SRUNPVkVSLiIsCisgICAgIiIKK307CitzdGF0aWMgY2hhciAqIGZoc19yZW5bXSA9IHsgICAgICAgICAgICAgLyogUkVOQU1FICovCisgICAgIlN5bnRheDogRlRQIFJFTkFNRSBuYW1lMSBuYW1lMSIsCisgICAgIiAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2hvc2UgbmFtZSBpcyBuYW1lMSIsCisgICAgIiAgYW5kIHdoaWNoIHJlc2lkZXMgaW4gdGhlIEZUUCBzZXJ2ZXIncyBmaWxlIHN5c3RlbSwgdG8gbmFtZTIuICBXb3JrcyIsCisgICAgIiAgb25seSBmb3Igc2luZ2xlIGZpbGVzOyB3aWxkY2FyZHMgYXJlIG5vdCBhY2NlcHRlZC4iLAorICAgICIiCit9Oworc3RhdGljIGNoYXIgKiBmaHNfcmVzW10gPSB7ICAgICAgICAgICAgIC8qIFJFU0VUICovCisgICAgIlN5bnRheDogRlRQIFJFU0VUIiwKKyAgICAiICBBc2tzIHRoZSBzZXJ2ZXIgdG8gbG9nIG91dCB5b3VyIHNlc3Npb24sIHRlcm1pbmF0aW5nIHlvdXIgYWNjZXNzIiwKKyAgICAiICByaWdodHMsIHdpdGhvdXQgY2xvc2luZyB0aGUgY29ubmVjdGlvbi4iLAorICAgICIiCit9Oworc3RhdGljIGNoYXIgKiBmaHNfcm1kW10gPSB7ICAgICAgICAgICAgIC8qIFJNRElSICovCisgICAgIlN5bnRheDogRlRQIFJNRElSIGRpcmVjdG9yeSIsCisgICAgIiAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byByZW1vdmUgdGhlIGRpcmVjdG9yeSB3aG9zZSBuYW1lIGlzIGdpdmVuLiIsCisgICAgIiAgVGhpcyB1c3VhbGx5IHJlcXVpcmVzIHRoZSBkaXJlY3RvcnkgdG8gYmUgZW1wdHkuICBTeW5vbnltczogUkVNT1RFIiwKKyAgICAiICBSTURJUiwgUlJNRElSLiIsCisgICAgIiIKK307CitzdGF0aWMgY2hhciAqIGZoc19zaXRbXSA9IHsgICAgICAgICAgICAgLyogU0lURSAqLworICAgICJTeW50YXg6IEZUUCBTSVRFIHRleHQiLAorICAgICIgIFNlbmRzIGEgc2l0ZS1zcGVjaWZpYyBjb21tYW5kIHRvIHRoZSBGVFAgc2VydmVyLiIsCisgICAgIiIKK307CitzdGF0aWMgY2hhciAqIGZoc19zaXpbXSA9IHsgICAgICAgICAgICAgLyogU0laRSAqLworICAgICJTeW50YXg6IEZUUCBTSVpFIGZpbGVuYW1lIiwKKyAgICAiICBBc2tzIHRoZSBGVFAgc2VydmVyIHRvIHNlbmQgYSBudW1lcmljIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNpemUiLAorICAgICIgIG9mIHRoZSBnaXZlbiBmaWxlLiIsCisgICAgIiIKK307CitzdGF0aWMgY2hhciAqIGZoc19zdGFbXSA9IHsgICAgICAgICAgICAgLyogU1RBVFVTICovCisgICAgIlN5bnRheDogRlRQIFNUQVRVUyBbIGZpbGVuYW1lIF0iLAorICAgICIgIEFza3MgdGhlIEZUUCBzZXJ2ZXIgdG8gcmVwb3J0IGl0cyBzdGF0dXMuICBJZiBhIGZpbGVuYW1lIGlzIGdpdmVuLCIsCisgICAgIiAgdGhlIEZUUCBzZXJ2ZXIgc2hvdWxkIHJlcG9ydCBkZXRhaWxzIGFib3V0IHRoZSBmaWxlLiIsCisgICAgIiIKK307CitzdGF0aWMgY2hhciAqIGZoc19zeXNbXSA9IHsgICAgICAgICAgICAgLyogU1lTVEVNICovCisgICAgIlN5bnRheDogRlRQIFNZU1RFTSIsCisgICAgIiAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byByZXBvcnQgaXRzIG9wZXJhdGluZyBzeXN0ZW0gdHlwZS4iLAorICAgICIiCit9Oworc3RhdGljIGNoYXIgKiBmaHNfdHlwW10gPSB7ICAgICAgICAgICAgIC8qIFRZUEUgKi8KKyAgICAiU3ludGF4OiBGVFAgVFlQRSB7IFRFWFQsIEJJTkFSWSwgVEVORVggfSIsCisgICAgIiAgUHV0cyB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgaW4gdGhlIGluZGljYXRlZCB0cmFuc2ZlciBtb2RlLiIsCisgICAgIiAgQVNDSUkgaXMgYSBzeW5vbnltIGZvciBURVhULiAgVEVORVggaXMgdXNlZCBvbmx5IGZvciB1cGxvYWRpbmcgOC1iaXQiLAorICAgICIgIGJpbmFyeSBmaWxlcyB0byBhIDM2LWJpdCBwbGF0Zm9ybXMgc3VjaCBhcyBURU5FWCBvciBUT1BTLTIwIGFuZC9vciIsCisgICAgIiAgZG93bmxvYWRpbmcgZmlsZXMgZnJvbSBURU5FWCBvciBUT1BTLTIwIHRoYXQgaGF2ZSBiZWVuIHVwbG9hZGVkIGluIiwKKyAgICAiICBURU5FWCBtb2RlLiIsCisgICAgIiIKK307CitzdGF0aWMgY2hhciAqIGZoc191bWFbXSA9IHsgICAgICAgICAgICAgLyogVU1BU0sgKi8KKyAgICAiU3ludGF4OiBGVFAgVU1BU0sgbnVtYmVyIiwKKyAgICAiICBBc2tzIHRoZSBGVFAgc2VydmVyIHRvIHNldCBpdHMgZmlsZSBjcmVhdGlvbiBtb2RlIG1hc2suICBBcHBsaWVzIiwKKyAgICAiICBvbmx5IChvciBtYWlubHkpIHRvIFVOSVgtYmFzZWQgRlRQIHNlcnZlcnMuIiwKKyAgICAiIgorfTsKK3N0YXRpYyBjaGFyICogZmhzX2Noa1tdID0geyAgICAgICAgICAgICAvKiBDSEVDSyAqLworICAgICJTeW50YXg6IEZUUCBDSEVDSyByZW1vdGUtZmlsZXNwZWMiLAorICAgICIgIEFza3MgdGhlIEZUUCBzZXJ2ZXIgaWYgdGhlIGdpdmVuIGZpbGUgb3IgZmlsZXMgZXhpc3QuICBJZiB0aGUiLAorICAgICIgIHJlbW90ZS1maWxlc3BlYyBjb250YWlucyB3aWxkY2FyZHMsIHRoaXMgY29tbWFuZCBmYWlscyBpZiBubyBzZXJ2ZXIiLAorICAgICIgIGZpbGVzIG1hdGNoLCBhbmQgc3VjY2VlZHMgaWYgYXQgbGVhc3Qgb25lIGZpbGUgbWF0Y2hlcy4gIElmIHRoZSIsCisgICAgIiAgcmVtb3RlLWZpbGVzcGVjIGRvZXMgbm90IGNvbnRhaW4gd2lsZGNhcmRzLCB0aGlzIGNvbW1hbmQgc3VjY2VlZHMgaWYiLAorICAgICIgIHRoZSBnaXZlbiBmaWxlIGV4aXN0cyBhbmQgZmFpbHMgaWYgaXQgZG9lcyBub3QuIiwKKyAgICAiIgorfTsKK3N0YXRpYyBjaGFyICogZmhzX2VuYVtdID0gewkJLyogRU5BQkxFICovCisgICAgIlN5bnRheDogRlRQIEVOQUJMRSB7IEFVVEgsIEZFQVQsIE1EVE0sIE1MU1QsIFNJWkUgfSIsCisgICAgIiAgRW5hYmxlcyB0aGUgdXNlIG9mIHRoZSBnaXZlbiBGVFAgcHJvdG9jb2wgY29tbWFuZCBpbiBjYXNlIGl0IGhhcyBiZWVuIiwKKyAgICAiICBkaXNhYmxlZCAoYnV0IHRoaXMgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIEZUUCBzZXJ2ZXIgdW5kZXJzdGFuZHMgaXQpLiIKKywKKyAgICAiICBVc2UgU0hPVyBGVFAgdG8gc2VlIHdoaWNoIG9mIHRoZXNlIGNvbW1hbmRzIGlzIGVuYWJsZWQgYW5kIGRpc2FibGVkLiIsCisgICAgIiAgQWxzbyBzZWUgRlRQIERJU0FCTEUuIiwKKyAgICAiIgorfTsKK3N0YXRpYyBjaGFyICogZmhzX2Rpc1tdID0gewkJLyogRElTQUJMRSAqLworICAgICJTeW50YXg6IEZUUCBESVNBQkxFIHsgQVVUSCwgRkVBVCwgTURUTSwgTUxTVCwgU0laRSB9IiwKKyAgICAiICBEaXNhYmxlcyB0aGUgdXNlIG9mIHRoZSBnaXZlbiBGVFAgcHJvdG9jb2wgY29tbWFuZC4iLAorICAgICIgIEFsc28gc2VlIEZUUCBFTkFCTEUuIiwKKyAgICAiIgorfTsKKworI2VuZGlmIC8qIE5PSEVMUCAqLworCitpbnQKK2RvZnRwaGxwKCkgeworICAgIGludCBjeDsKKyAgICBpZiAoKGN4ID0gY21rZXkoZnRwY21kdGFiLG5mdHBjbWQsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICBpZiAoY3ggIT0gLTMpCisgICAgICAgIHJldHVybihjeCk7CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworCisjaWZkZWYgTk9IRUxQCisgICAgcHJpbnRmKCJTb3JyeSwgbm8gaGVscCBhdmFpbGFibGVcbiIpOworI2Vsc2UKKyAgICBzd2l0Y2ggKGN4KSB7CisgICAgICBjYXNlIC0zOgorICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX2Z0cCkpOworICAgICAgY2FzZSBGVFBfQUNDOiAgICAgICAgICAgICAgICAgICAgIC8qIEFDQ09VTlQgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19hY2MpKTsKKyAgICAgIGNhc2UgRlRQX0FQUDogICAgICAgICAgICAgICAgICAgICAvKiBBUFBFTkQgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19hcHApKTsKKyAgICAgIGNhc2UgRlRQX0NMUzogICAgICAgICAgICAgICAgICAgICAvKiBCWUUsIENMT1NFICovCisgICAgICAgIHJldHVybihobXNnYShmaHNfY2xzKSk7CisgICAgICBjYXNlIEZUUF9DV0Q6ICAgICAgICAgICAgICAgICAgICAgLyogQ0QsIENXRCAqLworICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX2N3ZCkpOworICAgICAgY2FzZSBGVFBfR1VQOiAgICAgICAgICAgICAgICAgICAgIC8qIENEVVAsIFVQICovCisgICAgICAgIHJldHVybihobXNnYShmaHNfZ3VwKSk7CisgICAgICBjYXNlIEZUUF9DSE06ICAgICAgICAgICAgICAgICAgICAgLyogQ0hNT0QgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19jaG0pKTsKKyAgICAgIGNhc2UgRlRQX01ERTogICAgICAgICAgICAgICAgICAgICAvKiBERUxFVEUsIE1ERUxFVEUgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19tZGUpKTsKKyAgICAgIGNhc2UgRlRQX0RJUjogICAgICAgICAgICAgICAgICAgICAvKiBESVJFQ1RPUlkgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19kaXIpKTsKKyAgICAgIGNhc2UgRlRQX1ZESTogICAgICAgICAgICAgICAgICAgICAvKiBWRElSRUNUT1JZICovCisgICAgICAgIHJldHVybihobXNnYShmaHNfdmRpKSk7CisgICAgICBjYXNlIEZUUF9GRUE6ICAgICAgICAgICAgICAgICAgICAgLyogRkVBVFVSRVMgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19mZWEpKTsKKyAgICAgIGNhc2UgRlRQX0dFVDogICAgICAgICAgICAgICAgICAgICAvKiBHRVQgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19nZXQpKTsKKyAgICAgIGNhc2UgRlRQX0hMUDogICAgICAgICAgICAgICAgICAgICAvKiBIRUxQICovCisgICAgICAgIHJldHVybihobXNnYShmaHNfaGxwKSk7CisgICAgICBjYXNlIEZUUF9JREw6ICAgICAgICAgICAgICAgICAgICAgLyogSURMRSAqLworICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX2lkbCkpOworICAgICAgY2FzZSBGVFBfVVNSOiAgICAgICAgICAgICAgICAgICAgIC8qIFVTRVIsIExPR0lOICovCisgICAgICAgIHJldHVybihobXNnYShmaHNfdXNyKSk7CisgICAgICBjYXNlIEZUUF9NR0U6ICAgICAgICAgICAgICAgICAgICAgLyogTUdFVCAqLworICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX21nZSkpOworICAgICAgY2FzZSBGVFBfTUtEOiAgICAgICAgICAgICAgICAgICAgIC8qIE1LRElSICovCisgICAgICAgIHJldHVybihobXNnYShmaHNfbWtkKSk7CisgICAgICBjYXNlIEZUUF9NT0Q6ICAgICAgICAgICAgICAgICAgICAgLyogTU9EVElNRSAqLworICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX21vZCkpOworICAgICAgY2FzZSBGVFBfTVBVOiAgICAgICAgICAgICAgICAgICAgIC8qIE1QVVQgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19tcHUpKTsKKyAgICAgIGNhc2UgRlRQX09QTjogICAgICAgICAgICAgICAgICAgICAvKiBPUEVOICovCisgICAgICAgIHJldHVybihobXNnYShmaHNfb3BuKSk7CisgICAgICBjYXNlIEZUUF9PUFQ6ICAgICAgICAgICAgICAgICAgICAgLyogT1BUUywgT1BUSU9OUyAqLworICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX29wdCkpOworICAgICAgY2FzZSBGVFBfUFVUOiAgICAgICAgICAgICAgICAgICAgIC8qIFBVVCwgU0VORCAqLworICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX3B1dCkpOworICAgICAgY2FzZSBGVFBfUFdEOiAgICAgICAgICAgICAgICAgICAgIC8qIFBXRCAqLworICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX3B3ZCkpOworICAgICAgY2FzZSBGVFBfUVVPOiAgICAgICAgICAgICAgICAgICAgIC8qIFFVT1RFICovCisgICAgICAgIHJldHVybihobXNnYShmaHNfcXVvKSk7CisgICAgICBjYXNlIEZUUF9SR0U6ICAgICAgICAgICAgICAgICAgICAgLyogUkVHRVQgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19yZ2UpKTsKKyAgICAgIGNhc2UgRlRQX1JFTjogICAgICAgICAgICAgICAgICAgICAvKiBSRU5BTUUgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19yZW4pKTsKKyAgICAgIGNhc2UgRlRQX1JFUzogICAgICAgICAgICAgICAgICAgICAvKiBSRVNFVCAqLworICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX3JlcykpOworICAgICAgY2FzZSBGVFBfUk1EOiAgICAgICAgICAgICAgICAgICAgIC8qIFJNRElSICovCisgICAgICAgIHJldHVybihobXNnYShmaHNfcm1kKSk7CisgICAgICBjYXNlIEZUUF9TSVQ6ICAgICAgICAgICAgICAgICAgICAgLyogU0lURSAqLworICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX3NpdCkpOworICAgICAgY2FzZSBGVFBfU0laOiAgICAgICAgICAgICAgICAgICAgIC8qIFNJWkUgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19zaXopKTsKKyAgICAgIGNhc2UgRlRQX1NUQTogICAgICAgICAgICAgICAgICAgICAvKiBTVEFUVVMgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19zdGEpKTsKKyAgICAgIGNhc2UgRlRQX1NZUzogICAgICAgICAgICAgICAgICAgICAvKiBTWVNURU0gKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc19zeXMpKTsKKyAgICAgIGNhc2UgRlRQX1RZUDogICAgICAgICAgICAgICAgICAgICAvKiBUWVBFICovCisgICAgICAgIHJldHVybihobXNnYShmaHNfdHlwKSk7CisgICAgICBjYXNlIEZUUF9VTUE6ICAgICAgICAgICAgICAgICAgICAgLyogVU1BU0sgKi8KKyAgICAgICAgcmV0dXJuKGhtc2dhKGZoc191bWEpKTsKKyAgICAgIGNhc2UgRlRQX0NISzogICAgICAgICAgICAgICAgICAgICAvKiBDSEVDSyAqLworICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX2NoaykpOworICAgICAgY2FzZSBGVFBfRU5BOgorICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX2VuYSkpOworICAgICAgY2FzZSBGVFBfRElTOgorICAgICAgICByZXR1cm4oaG1zZ2EoZmhzX2RpcykpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJTb3JyeSwgaGVscCBhdmFpbGFibGUgZm9yIHRoaXMgY29tbWFuZC5cbiIpOworICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYgLyogTk9IRUxQICovCisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKK30KKworaW50Citkb3NldGZ0cGhscCgpIHsKKyAgICBpbnQgY3g7CisgICAgaWYgKChjeCA9IGNta2V5KGZ0cHNldCxuZnRwc2V0LCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgaWYgKGN4ICE9IC0zKQorICAgICAgICByZXR1cm4oY3gpOworICAgIGlmIChjeCAhPSAtMykKKyAgICAgIGNrc3RybmNweSh0bXBidWYsYXRtYnVmLFRNUEJVRlNJWik7CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworCisjaWZkZWYgTk9IRUxQCisgICAgcHJpbnRmKCJTb3JyeSwgbm8gaGVscCBhdmFpbGFibGVcbiIpOworI2Vsc2UKKyAgICBzd2l0Y2ggKGN4KSB7CisgICAgICBjYXNlIC0zOgorICAgICAgICBwcmludGYoIlxuU3ludGF4OiBTRVQgRlRQIHBhcmFtZXRlciB2YWx1ZVxuIik7CisgICAgICAgIHByaW50ZigiICBUeXBlIFwiaGVscCBzZXQgZnRwID9cIiBmb3IgYSBsaXN0IG9mIHBhcmFtZXRlcnMuXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIFR5cGUgXCJoZWxwIHNldCBmdHAgeHh4XCIgZm9yIGluZm9ybWF0aW9uIGFib3V0IHNldHRpbmdcbiIpOworICAgICAgICBwcmludGYoIiAgcGFyYW1ldGVyIHh4eC4gIFR5cGUgXCJzaG93IGZ0cFwiIGZvciBjdXJyZW50IHZhbHVlcy5cblxuIik7CisgICAgICAgIHJldHVybigwKTsKKworICAgICAgY2FzZSBGVFNfQlVHOgorCXByaW50ZigiXG5TeW50YXg6IFNFVCBGVFAgQlVHIDxuYW1lPiB7T04sIE9GRn1cbiIpOworCXByaW50ZigKKwkgICAgIiAgQWN0aXZhdGVzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIG5hbWVkIGJ1ZyBpbiB0aGUgRlRQIHNlcnZlci5cbiIpOworCXByaW50ZigiICBUeXBlIFNFVCBGVFAgQlVHID8gZm9yIGEgbGlzdCBvZiBuYW1lcy5cbiIpOworCXByaW50ZigiICBGb3IgZWFjaCBidWcsIHRoZSBkZWZhdWx0IGlzIE9GRlxuXG4iKTsKKwlyZXR1cm4oMCk7CisKKyNpZmRlZiBGVFBfU0VDVVJJVFkKKyAgICAgIGNhc2UgRlRTX0FUUDogICAgICAgICAgICAgICAgICAgICAvKiAiYXV0aHR5cGUiICovCisgICAgICAgIHByaW50ZigiXG5TeW50YXg6IFNFVCBGVFAgQVVUSFRZUEUgbGlzdFxuIik7CisgICAgICAgIHByaW50ZigiICBTcGVjaWZpZXMgYW4gb3JkZXJlZCBsaXN0IG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgdG8gYmVcbiIKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIHByaW50ZigiICB3aGVuIEZUUCBBVVRPQVVUSEVOVElDQVRJT04gaXMgT04uICBUaGUgZGVmYXVsdCBsaXN0IGlzOlxuIik7CisgICAgICAgIHByaW50ZigiICBHU1NBUEktS1JCNSwgU1JQLCBLRVJCRVJPU19WNCwgVExTLCBTU0wuXG5cbiIpOworICAgICAgICByZXR1cm4oMCk7CisKKyAgICAgIGNhc2UgRlRTX0FVVDogICAgICAgICAgICAgICAgICAgICAvKiAiYXV0b2F1dGhlbnRpY2F0aW9uIiAqLworICAgICAgICBwcmludGYoIlxuU3ludGF4OlNFVCBGVFAgQVVUT0FVVEhFTlRJQ0FUSU9OIHsgT04sIE9GRiB9XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIFRlbGxzIHdoZXRoZXIgYXV0aGVudGljYXRpb24gc2hvdWxkIGJlIG5lZ290aWF0ZWQgYnkgdGhlXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIEZUUCBPUEVOIGNvbW1hbmQuICBEZWZhdWx0IGlzIE9OLlxuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRlRTX0NSWTogICAgICAgICAgICAgICAgICAgICAvKiAiYXV0b2VuY3J5cHRpb24iICovCisgICAgICAgIHByaW50ZigiXG5TRVQgRlRQIEFVVE9FTkNSWVBUSU9OIHsgT04sIE9GRiB9XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIFRlbGxzIHdoZXRoZXIgZW5jcnlwdGlvbiAocHJpdmFjeSkgc2hvdWxkIGJlIG5lZ290aWF0ZWRcbiIpOworICAgICAgICBwcmludGYoIiAgYnkgdGhlIEZUUCBPUEVOIGNvbW1hbmQuICBEZWZhdWx0IGlzIE9OLlxuXG4iKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogRlRQX1NFQ1VSSVRZICovCisKKyAgICAgIGNhc2UgRlRTX0xPRzogICAgICAgICAgICAgICAgICAgICAvKiAiYXV0b2xvZ2luIiAqLworICAgICAgICBwcmludGYoIlxuU0VUIEZUUCBBVVRPTE9HSU4geyBPTiwgT0ZGIH1cbiIpOworICAgICAgICBwcmludGYoIiAgVGVsbHMgS2VybWl0IHdoZXRoZXIgdG8gdHJ5IHRvIGxvZyB5b3UgaW4gYXV0b21hdGljYWxseVxuIik7CisgICAgICAgIHByaW50ZigiICBhcyBwYXJ0IG9mIHRoZSBjb25uZWN0aW9uIHByb2Nlc3MuXG5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGVFNfRElTOgorICAgICAgICBwcmludGYoIlxuU0VUIEZUUCBESVNQTEFZIHsgQlJJRUYsIEZVTExTQ1JFRU4sIENSVCwgLi4uIH1cbiIpOworCXByaW50ZigiICBDaG9vc2VzIHRoZSBmaWxlLXRyYW5zZmVyIGRpc3BsYXkgc3R5bGUgZm9yIEZUUC5cbiIpOworICAgICAgICBwcmludGYoIiAgTGlrZSBTRVQgVFJBTlNGRVIgRElTUExBWSBidXQgYXBwbGllcyBvbmx5IHRvIEZUUC5cblxuIik7CisgICAgICAgIGJyZWFrOworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgIGNhc2UgRlRTX1hMQTogICAgICAgICAgICAgICAgICAgICAvKiAiY2hhcmFjdGVyLXNldC10cmFuc2xhdGlvbiIgKi8KKyAgICAgICAgcHJpbnRmKCJcblNFVCBGVFAgQ0hBUkFDVEVSLVNFVC1UUkFOU0xBVElPTiB7IE9OLCBPRkYgfVxuIik7CisgICAgICAgIHByaW50ZigiICBXaGV0aGVyIHRvIHRyYW5zbGF0ZSBjaGFyYWN0ZXIgc2V0cyB3aGVuIHRyYW5zZmVycmluZ1xuIik7CisgICAgICAgIHByaW50ZigiICB0ZXh0IGZpbGVzIHdpdGggRlRQLiAgT0ZGIGJ5IGRlZmF1bHQuXG5cbiIpOworICAgICAgICBicmVhazsKKworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICAgIGNhc2UgRlRTX0ZOQzogICAgICAgICAgICAgICAgICAgICAvKiAiY29sbGlzaW9uIiAqLworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIHByaW50ZigKKyJTeW50YXg6IFNFVCBGVFAgQ09MTElTSU9OIHsgQkFDS1VQLFJFTkFNRSxVUERBVEUsRElTQ0FSRCxBUFBFTkQsT1ZFUldSSVRFIH1cbiIKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIHByaW50ZigiICBUZWxscyB3aGF0IGRvIHdoZW4gYW4gaW5jb21pbmcgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhc1xuIik7CisgICAgICAgIHByaW50ZigiICBhbiBleGlzdGluZyBmaWxlIHdoZW4gZG93bmxvYWRpbmcgd2l0aCBGVFAuXG5cbiIpOworICAgICAgICBicmVhazsKKworI2lmZGVmIEZUUF9TRUNVUklUWQorICAgICAgY2FzZSBGVFNfQ1BMOiAgICAgICAgICAgICAgICAgICAgIC8qICJjb21tYW5kLXByb3RlY3Rpb24tbGV2ZWwiICovCisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgcHJpbnRmKAorIlN5bnRheDogU0VUIEZUUCBDT01NQU5ELVBST1RFQ1RJT04tTEVWRUwgeyBDTEVBUixDT05GSURFTlRJQUwsUFJJVkFURSxTQUZFIH0iCisgICAgICAgICAgICAgICApOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIHByaW50ZigKKyIgIFRlbGxzIHdoYXQgbGV2ZWwgb2YgcHJvdGVjdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSBGVFAgY29tbWFuZCBjaGFubmVsLlxuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZUU19DRlc6ICAgICAgICAgICAgICAgICAgICAgLyogImNyZWRlbnRpYWwtZm9yd2FyZGluZyIgKi8KKyAgICAgICAgcHJpbnRmKCJcblN5bnRheDogU0VUIEZUUCBDUkVERU5USUFMLUZPUldBUkRJTkcgeyBPTiwgT0ZGIH1cbiIpOworICAgICAgICBwcmludGYoIiAgVGVsbHMgd2hldGhlciBlbmQtdXNlciBjcmVkZW50aWFscyBhcmUgdG8gYmUgZm9yd2FyZGVkXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIHRvIHRoZSBzZXJ2ZXIgaWYgc3VwcG9ydGVkIGJ5IHRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2RcbiIpOworICAgICAgICBwcmludGYoIiAgKEdTU0FQSS1LUkI1IG9ubHkpLlxuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZUU19EUEw6ICAgICAgICAgICAgICAgICAgICAgLyogImRhdGEtcHJvdGVjdGlvbi1sZXZlbCIgKi8KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBwcmludGYoCisiU3ludGF4OiBTRVQgRlRQIERBVEEtUFJPVEVDVElPTi1MRVZFTCB7IENMRUFSLENPTkZJREVOVElBTCxQUklWQVRFLFNBRkUgfSIKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgcHJpbnRmKAorIiAgVGVsbHMgd2hhdCBsZXZlbCBvZiBwcm90ZWN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIEZUUCBkYXRhIGNoYW5uZWwuXG5cbiIpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBGVFBfU0VDVVJJVFkgKi8KKworICAgICAgY2FzZSBGVFNfREJHOiAgICAgICAgICAgICAgICAgICAgIC8qICJkZWJ1ZyIgKi8KKyAgICAgICAgcHJpbnRmKCJcblN5bnRheDogU0VUIEZUUCBERUJVRyB7IE9OLCBPRkYgfVxuIik7CisgICAgICAgIHByaW50ZigiICBXaGV0aGVyIHRvIHByaW50IEZUUCBwcm90b2NvbCBtZXNzYWdlcy5cblxuIik7CisgICAgICAgIHJldHVybigwKTsKKworICAgICAgY2FzZSBGVFNfRVJSOiAgICAgICAgICAgICAgICAgICAgIC8qICJlcnJvci1hY3Rpb24iICovCisgICAgICAgIHByaW50ZigiXG5TeW50YXg6IFNFVCBGVFAgRVJST1ItQUNUSU9OIHsgUVVJVCwgUFJPQ0VFRCB9XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIFdoYXQgdG8gZG8gd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hlbiB0cmFuc2ZlcnJpbmcgYSBncm91cFxuIikKKyAgICAgICAgICA7CisgICAgICAgIHByaW50ZigiICBvZiBmaWxlczogcXVpdCBhbmQgZmFpbCwgb3IgcHJvY2VlZCB0byB0aGUgbmV4dCBmaWxlLlxuXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgICBjYXNlIEZUU19DTlY6ICAgICAgICAgICAgICAgICAgICAgLyogImZpbGVuYW1lcyIgKi8KKyAgICAgICAgcHJpbnRmKCJcblN5bnRheDogU0VUIEZUUCBGSUxFTkFNRVMgeyBBVVRPLCBDT05WRVJURUQsIExJVEVSQUwgfVxuIik7CisgICAgICAgIHByaW50ZigiICBXaGF0IHRvIGRvIHdpdGggZmlsZW5hbWVzOiBjb252ZXJ0IHRoZW0sIHRha2UgYW5kIHVzZSB0aGVtXG4iCisgICAgICAgICAgICAgICApOworICAgICAgICBwcmludGYoIiAgbGl0ZXJhbGx5OyBvciBjaG9vc2Ugd2hhdCB0byBkbyBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZVxuIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcHJpbnRmKCIgIE9TIHR5cGUgb2YgdGhlIHNlcnZlci4gIFRoZSBkZWZhdWx0IGlzIEFVVE8uXG5cbiIpOworICAgICAgICByZXR1cm4oMCk7CisKKyAgICAgIGNhc2UgRlRTX1BTVjogICAgICAgICAgICAgICAgICAgICAvKiAicGFzc2l2ZS1tb2RlIiAqLworICAgICAgICBwcmludGYoIlxuU3ludGF4OiBTRVQgRlRQIFBBU1NJVkUtTU9ERSB7IE9OLCBPRkYgfVxuIik7CisgICAgICAgIHByaW50ZigiICBXaGV0aGVyIHRvIHVzZSBwYXNzaXZlIG1vZGUsIHdoaWNoIGhlbHBzIHRvIGdldCB0aHJvdWdoXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIGZpcmV3YWxscy4gIE9OIGJ5IGRlZmF1bHQuXG5cbiIpOworICAgICAgICByZXR1cm4oMCk7CisKKyAgICAgIGNhc2UgRlRTX1BSTTogICAgICAgICAgICAgICAgICAgICAvKiAicGVybWlzc2lvbnMiICovCisgICAgICAgIHByaW50ZigiXG5TeW50YXg6IFNFVCBGVFAgUEVSTUlTU0lPTlMgeyBBVVRPLCBPTiwgT0ZGIH1cbiIpOworICAgICAgICBwcmludGYoIiAgV2hldGhlciB0byB0cnkgdG8gc2VuZCBmaWxlIHBlcm1pc3Npb25zIHdoZW4gdXBsb2FkaW5nLlxuIik7CisgICAgICAgIHByaW50ZigiICBPRkYgYnkgZGVmYXVsdC4gIEFVVE8gbWVhbnMgb25seSBpZiBjbGllbnQgYW5kIHNlcnZlclxuIik7CisgICAgICAgIHByaW50ZigiICBoYXZlIHRoZSBzYW1lIE9TIHR5cGUuXG5cbiIpOworICAgICAgICByZXR1cm4oMCk7CisKKyAgICAgIGNhc2UgRlRTX1RTVDogICAgICAgICAgICAgICAgICAgICAvKiAicHJvZ3Jlc3MtbWVzc2FnZXMiICovCisgICAgICAgIHByaW50ZigiXG5TeW50YXg6IFNFVCBGVFAgUFJPR1JFU1MtTUVTU0FHRVMgeyBPTiwgT0ZGIH1cbiIpOworICAgICAgICBwcmludGYoIiAgV2hldGhlciBLZXJtaXQgc2hvdWxkIHByaW50IGxvY2FsbHktZ2VuZXJhdGVkIGZlZWRiYWNrXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIG1lc3NhZ2VzIGZvciBlYWNoIG5vbi1maWxlLXRyYW5zZmVyIGNvbW1hbmQuIik7CisgICAgICAgIHByaW50ZigiICBPTiBieSBkZWZhdWx0LlxuXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgICBjYXNlIEZUU19TUEM6ICAgICAgICAgICAgICAgICAgICAgLyogInNlbmQtcG9ydC1jb21tYW5kcyIgKi8KKyAgICAgICAgcHJpbnRmKCJcblN5bnRheDogU0VUIEZUUCBTRU5ELVBPUlQtQ09NTUFORFMgeyBPTiwgT0ZGIH1cbiIpOworICAgICAgICBwcmludGYoIiAgV2hldGhlciBLZXJtaXQgc2hvdWxkIHNlbmQgYSBuZXcgUE9SVCBjb21tYW5kIGZvciBlYWNoIik7CisgICAgICAgIHByaW50ZigiICB0YXNrLlxuXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgIGNhc2UgRlRTX0NTUjogICAgICAgICAgICAgICAgICAgICAvKiAic2VydmVyLWNoYXJhY3Rlci1zZXQiICovCisgICAgICAgIHByaW50ZigiXG5TeW50YXg6IFNFVCBGVFAgU0VSVkVSLUNIQVJBQ1RFUi1TRVQgbmFtZVxuIik7CisgICAgICAgIHByaW50ZigiICBUaGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIHNldCB1c2VkIGZvciB0ZXh0IGZpbGVzIG9uIHRoZVxuIik7CisgICAgICAgIHByaW50ZigiICBzZXJ2ZXIuICBFbnRlciBhIG5hbWUgb2YgJz8nIGZvciBhIG1lbnUuXG5cbiIpOworICAgICAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisgICAgICBjYXNlIEZUU19TVE86CQkJLyogInNlcnZlci10aW1lLW9mZnNldCAqLworCXByaW50ZigKKyJcblN5bnRheDogU0VUIEZUUCBTRVJWRVItVElNRS1PRkZTRVQgK2hoWzptbVs6c3NdXSBvciAtaGhbOm1tWzpzc11dXG4iKTsKKyAgICAgICAgcHJpbnRmKAorIiAgU3BlY2lmaWVzIGFuIG9mZnNldCB0byBhcHBseSB0byB0aGUgc2VydmVyJ3MgZmlsZSB0aW1lc3RhbXBzLlxuIik7CisgICAgICAgIHByaW50ZigKKyIgIFVzZSB0aGlzIHRvIGNvcnJlY3QgZm9yIG1pc2NvbmZpZ3VyZWQgc2VydmVyIHRpbWUgb3IgdGltZXpvbmUuXG4iKTsKKyAgICAgICAgcHJpbnRmKAorIiAgRm9ybWF0OiBtdXN0IGJlZ2luIHdpdGggKyBvciAtIHNpZ24uICBIb3VycyBtdXN0IGJlIGdpdmVuOyBtaW51dGVzXG4iKTsKKyAgICAgICAgcHJpbnRmKAorIiAgYW5kIHNlY29uZHMgYXJlIG9wdGlvbmFsOiArNCA9ICs0OjAwID0gKzQ6MDA6MDAgKGFkZCA0IGhvdXJzKS5cblxuIik7CisgICAgICAgIHJldHVybigwKTsKKworICAgICAgY2FzZSBGVFNfVFlQOiAgICAgICAgICAgICAgICAgICAgIC8qICJ0eXBlIiAqLworICAgICAgICBwcmludGYoIlxuU3ludGF4OiBTRVQgRlRQIFRZUEUgeyBURVhULCBCSU5BUlksIFRFTkVYIH1cbiIpOworICAgICAgICBwcmludGYoIiAgRXN0YWJsaXNoZXMgdGhlIGRlZmF1bHQgdHJhbnNmZXIgbW9kZS5cbiIpOworICAgICAgICBwcmludGYoIiAgVEVORVggaXMgdXNlZCBmb3IgdXBsb2FkaW5nIDgtYml0IGJpbmFyeSBmaWxlcyB0byAzNi1iaXRcbiIpOworICAgICAgICBwcmludGYoIiAgcGxhdGZvcm1zIHN1Y2ggYXMgVEVORVggYW5kIFRPUFMtMjAgYW5kIGZvciBkb3dubG9hZGluZ1xuIik7CisgICAgICAgIHByaW50ZigiICB0aGVtIGFnYWluLlxuXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworCisjaWZkZWYgUEFUVEVSTlMKKyAgICAgIGNhc2UgRlRTX0dGVDoKKyAgICAgICAgcHJpbnRmKCJcblN5bnRheDogU0VUIEZUUCBHRVQtRklMRVRZUEUtU1dJVENISU5HIHsgT04sIE9GRiB9XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIFRlbGxzIHdoZXRoZXIgR0VUIGFuZCBNR0VUIHNob3VsZCBhdXRvbWF0aWNhbGx5IHN3aXRjaFxuIik7CisgICAgICAgIHByaW50ZigiICB0aGUgYXBwcm9wcmlhdGUgZmlsZSB0eXBlLCBURVhULCBCSU5BUlksIG9yIFRFTkVYLCBieVxuIik7CisgICAgICAgIHByaW50ZigiICBtYXRjaGluZyB0aGUgbmFtZSBvZiBlYWNoIGluY29taW5nIGZpbGUgd2l0aCBpdHMgbGlzdCBvZlxuIik7CisgICAgICAgIHByaW50ZigiICBGSUxFIFRFWFQtUEFUVEVSTlMgYW5kIEZJTEUgQklOQVJZLVBBVFRFUk5TLiAgT04gYnlcbiIpOworICAgICAgICBwcmludGYoIiAgZGVmYXVsdC4gIFNIT1cgUEFUVEVSTlMgZGlzcGxheXMgdGhlIGN1cnJlbnQgcGF0dGVyblxuIik7CisgICAgICAgIHByaW50ZigiICBsaXN0LiAgSEVMUCBTRVQgRklMRSB0byBzZWUgaG93IHRvIGNoYW5nZSBpdC5cbiIpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworCisgICAgICBjYXNlIEZUU19VU046ICAgICAgICAgICAgICAgICAgICAgLyogInVuaXF1ZS1zZXJ2ZXItbmFtZXMiICovCisgICAgICAgIHByaW50ZigiXG5TeW50YXg6IFNFVCBGVFAgVU5JUVVFLVNFUlZFUi1OQU1FUyB7IE9OLCBPRkYgfVxuIik7CisgICAgICAgIHByaW50ZigiICBUZWxscyB3aGV0aGVyIHRvIGFzayB0aGUgc2VydmVyIHRvIGNyZWF0ZSB1bmlxdWUgbmFtZXNcbiIpOworICAgICAgICBwcmludGYoIiAgZm9yIGFueSB1cGxvYWRlZCBmaWxlIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYW5cbiIpOworICAgICAgICBwcmludGYoIiAgZXhpc3RpbmcgZmlsZS4gIERlZmF1bHQgaXMgT0ZGLlxuXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgICBjYXNlIEZUU19WQk06ICAgICAgICAgICAgICAgICAgICAgLyogInZlcmJvc2UtbW9kZSIgKi8KKyAgICAgICAgcHJpbnRmKCJcblN5bnRheDogU0VUIEZUUCBWRVJCT1NFLU1PREUgeyBPTiwgT0ZGIH1cbiIpOworICAgICAgICBwcmludGYoIiAgV2hldGhlciB0byBkaXNwbGF5IGFsbCByZXNwb25zZXMgZnJvbSB0aGUgRlRQIHNlcnZlci5cbiIpOworICAgICAgICBwcmludGYoIiAgT0ZGIGJ5IGRlZmF1bHQuXG5cbiIpOworICAgICAgICByZXR1cm4oMCk7CisKKyAgICAgIGNhc2UgRlRTX0RBVDoKKyAgICAgICAgcHJpbnRmKCJcblN5bnRheDogU0VUIEZUUCBEQVRFUyB7IE9OLCBPRkYgfVxuIik7CisgICAgICAgIHByaW50ZigiICBXaGV0aGVyIHRvIHNldCBkYXRlIG9mIGluY29taW5nIGZpbGVzIGZyb20gdGhlIGZpbGUgZGF0ZVxuIik7CisgICAgICAgIHByaW50ZigiICBvbiB0aGUgc2VydmVyLiAgT04gYnkgZGVmYXVsdC4gIE5vdGU6IHRoZXJlIGlzIG5vIHdheSB0b1xuIikKKyAgICAgICAgICA7CisgICAgICAgIHByaW50ZigiICBzZXQgdGhlIGRhdGUgb24gZmlsZXMgdXBsb2FkZWQgdG8gdGhlIHNlcnZlci4gIEFsc28gbm90ZVxuIik7CisJcHJpbnRmKCIgIHRoYXQgbm90IGFsbCBzZXJ2ZXJzIHN1cHBvcnQgdGhpcyBmZWF0dXJlLlxuXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgICBjYXNlIEZUU19BUFc6CisJcHJpbnRmKCJcblN5bnRheDogU0VUIEZUUCBBTk9OWU1PVVMtUEFTU1dPUkQgWyB0ZXh0IF1cbiIpOworCXByaW50ZigiICBQYXNzd29yZCB0byBzdXBwbHkgYXV0b21hdGljYWxseSBvbiBhbm9ueW1vdXMgRlRQXG4iKTsKKwlwcmludGYoIiAgY29ubmVjdGlvbnMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB1c2VyQGhvc3QuXG4iKTsKKwlwcmludGYoIiAgT21pdCBvcHRpb25hbCB0ZXh0IHRvIHJlc3RvcmUgZGVmYXVsdC5cblxuIik7CisJcmV0dXJuKDApOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBwcmludGYoIlNvcnJ5LCBoZWxwIG5vdCBhdmFpbGFibGUgZm9yIFwic2V0IGZ0cCAlc1wiXG4iLHRtcGJ1Zik7CisgICAgfQorI2VuZGlmIC8qIE5PSEVMUCAqLworICAgIHJldHVybigwKTsKK30KKworI2lmbmRlZiBMX1NFVAorI2RlZmluZSBMX1NFVCAwCisjZW5kaWYgLyogTF9TRVQgKi8KKyNpZm5kZWYgTF9JTkNSCisjZGVmaW5lIExfSU5DUiAxCisjZW5kaWYgLyogTF9JTkNSICovCisKKyNpZmRlZiBGVFBfU1JQCitjaGFyIHNycF91c2VyW0JVRlNJWl07ICAgICAgICAgICAgICAgICAgLyogd2hlcmUgaXMgQlVGU0laIGRlZmluZWQ/ICovCitjaGFyICpzcnBfcGFzczsKK2NoYXIgKnNycF9hY2N0OworI2VuZGlmIC8qIEZUUF9TUlAgKi8KKworc3RhdGljIGludCBrZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZWRlZCBmb3IgYWxsIGF1dGggdHlwZXMgKi8KKworc3RhdGljIHN0cnVjdCAgIHNvY2thZGRyX2luIGhpc2N0bGFkZHI7CitzdGF0aWMgc3RydWN0ICAgc29ja2FkZHJfaW4gaGlzZGF0YWFkZHI7CitzdGF0aWMgc3RydWN0ICAgc29ja2FkZHJfaW4gZGF0YV9hZGRyOworc3RhdGljIGludCAgICAgIGRhdGEgPSAtMTsKK3N0YXRpYyBpbnQgICAgICBwdGZsYWcgPSAwOworc3RhdGljIHN0cnVjdCAgIHNvY2thZGRyX2luIG15Y3RsYWRkcjsKKworI2lmZGVmIENPTU1FTlQKKyNpZm5kZWYgT1MyCitVSURfVCBnZXR1aWQoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKworc3RhdGljIGludCBjcGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIE5vIHBlbmRpbmcgcmVwbGllcyAqLworCisjaWZkZWYgQ0tfU1NMCitleHRlcm4gU1NMICpzc2xfZnRwX2NvbjsKK2V4dGVybiBTU0xfQ1RYICpzc2xfZnRwX2N0eDsKK2V4dGVybiBTU0wgKnNzbF9mdHBfZGF0YV9jb247CitleHRlcm4gaW50IHNzbF9mdHBfYWN0aXZlX2ZsYWc7CitleHRlcm4gaW50IHNzbF9mdHBfZGF0YV9hY3RpdmVfZmxhZzsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworLyogIGYgdCBwIGMgbSBkICAtLSAgU2VuZCBhIGNvbW1hbmQgdG8gdGhlIEZUUCBzZXJ2ZXIgICovCisvKgorICBDYWxsIHdpdGg6CisgICAgY2hhciAqIGNtZDogVGhlIGNvbW1hbmQgdG8gc2VuZC4KKyAgICBjaGFyICogYXJnOiBUaGUgYXJndW1lbnQgKGUuZy4gYSBmaWxlbmFtZSkuCisgICAgaW50IGxjczogVGhlIGxvY2FsIGNoYXJhY3RlciBzZXQgaW5kZXguCisgICAgaW50IHJjczogVGhlIHJlbW90ZSAoc2VydmVyKSBjaGFyYWN0ZXIgc2V0IGluZGV4LgorICAgIGludCB2Ym06IFZlcmJvc2UgbW9kZToKKyAgICAgIDAgPSBmb3JjZSB2ZXJib3NpdHkgb2ZmCisgICAgID4wID0gZm9yY2UgdmVyYm9zaXR5IG9uCisKKyAgSWYgYXJnIGlzIGdpdmVuIChub3QgTlVMTCBvciBlbXB0eSkgYW5kIGxjcyAhPSByY3MgYW5kIGJvdGggYXJlID4gLTEsCisgIGFuZCBuZWl0aGVyIGxjcyBvciByY3MgaXMgVUNTLTIsIHRoZSBhcmcgaXMgdHJhbnNsYXRlZCBmcm9tIHRoZSBsb2NhbAorICBjaGFyYWN0ZXIgc2V0IHRvIHRoZSByZW1vdGUgb25lIGJlZm9yZSBzZW5kaW5nIHRoZSByZXN1bHQgdG8gdGhlIHNlcnZlci4KKworICAgUmV0dXJuczoKKyAgICAwIG9uIGZhaWx1cmUgd2l0aCBmdHBjb2RlID0gLTEKKyAgICA+PSAwIG9uIHN1Y2Nlc3MgKGdldHJlcGx5KCkgcmVzdWx0KSB3aXRoIGZ0cGNvZGUgPSAwLgorKi8KK3N0YXRpYyBjaGFyIHhjbWRidWZbUkZOQlVGU0laXTsKKworc3RhdGljIGludAorZnRwY21kKGNtZCxhcmcsbGNzLHJjcyx2Ym0pIGNoYXIgKiBjbWQsICogYXJnOyBpbnQgbGNzLCByY3MsIHZibTsgeworICAgIGNoYXIgKiBzID0gTlVMTDsKKyAgICBpbnQgciA9IDAsIHggPSAwLCBmYyA9IDAsIGxlbiA9IDAsIGNtZGxlbiA9IDAsIHEgPSAtMTsKKyAgICBzaWdfdCBvbGRpbnRyOworCisgICAgaWYgKGZ0cF9kZWIpICAgICAgICAgICAgICAgICAgICAgICAgLyogREVCVUcgKi8KKyAgICAgIHZibSA9IDE7CisgICAgZWxzZSBpZiAocXVpZXQgfHwgZHB5YWN0aXZlKSAgICAgICAgLyogUVVJRVQgb3IgRmlsZSBUcmFuc2ZlciBBY3RpdmUgKi8KKyAgICAgIHZibSA9IDA7CisgICAgZWxzZSBpZiAodmJtIDwgMCkgICAgICAgICAgICAgICAgICAgLyogVkVSQk9TRSAqLworICAgICAgdmJtID0gZnRwX3ZibTsKKworICAgIGNhbmNlbGZpbGUgPSAwOworICAgIGlmICghY21kKSBjbWQgPSAiIjsKKyAgICBpZiAoIWFyZykgYXJnID0gIiI7CisgICAgY21kbGVuID0gKGludClzdHJsZW4oY21kKTsKKyAgICBsZW4gPSBjbWRsZW4gKyAoaW50KXN0cmxlbihhcmcpICsgMTsKKworICAgIGlmIChmdHBfZGViIC8qICYmICFkcHlhY3RpdmUgKi8gKSB7CisjaWZkZWYgRlRQX1BST1hZCisgICAgICAgIGlmIChmdHBfcHJ4KSBwcmludGYoIiVzICIsIGZ0cF9ob3N0KTsKKyNlbmRpZiAvKiBGVFBfUFJPWFkgKi8KKyAgICAgICAgcHJpbnRmKCItLS0+ICIpOworICAgICAgICBpZiAoIWFub255bW91cyAmJiBzdHJjbXAoIlBBU1MiLGNtZCkgPT0gMCkKKyAgICAgICAgICBwcmludGYoIlBBU1MgWFhYWCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCIlcyAlcyIsY21kLGFyZyk7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgICAgLyogYnplcm8oeGNtZGJ1ZixSRk5CVUZTSVopOyAqLworICAgIGNrbWFrbXNnKHhjbWRidWYsUkZOQlVGU0laLCBjbWQsICphcmcgPyAiICIgOiAiIiwgYXJnLCBOVUxMKTsKKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworICAgICAgICBkZWJ1ZyhGMTEwLCJmdHBjbWQgY21kIixjbWQsMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImZ0cGNtZCBhcmciLGFyZywwKTsKKyAgICAgICAgZGVidWcoRjEwMSwiZnRwY21kIGxjcyIsIiIsbGNzKTsKKyAgICAgICAgZGVidWcoRjEwMSwiZnRwY21kIHJjcyIsIiIscmNzKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKworICAgIGlmIChjc29ja2V0ID09IC0xKSB7CisgICAgICAgIHBlcnJvcigiTm8gY29udHJvbCBjb25uZWN0aW9uIGZvciBjb21tYW5kIik7CisgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBoYXZlc2lnaW50ID0gMDsKKyAgICBvbGRpbnRyID0gc2lnbmFsKFNJR0lOVCwgY21kY2FuY2VsKTsKKworI2lmbmRlZiBOT0NTRVRTCisgICAgaWYgKCphcmcgJiYgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgYW4gYXJnIHdhcyBnaXZlbiAqLworICAgICAgICBsY3MgPiAtMSAmJiAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBhIGxvY2FsIGNoYXJzZXQgKi8KKyAgICAgICAgcmNzID4gLTEgJiYgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgYSByZW1vdGUgY2hhcnNldCAqLworICAgICAgICBsY3MgIT0gcmNzICYmICAgICAgICAgICAgICAgICAgIC8qIGFuZCB0aGUgdHdvIGFyZSBub3QgdGhlIHNhbWUgKi8KKyAgICAgICAgbGNzICE9IEZDX1VDUzIgJiYgICAgICAgICAgICAgICAvKiBhbmQgbmVpdGhlciBvbmUgaXMgVUNTLTIgKi8KKyAgICAgICAgcmNzICE9IEZDX1VDUzIgICAgICAgICAgICAgICAgICAvKiAuLi4gKi8KKyAgICAgICAgKSB7CisgICAgICAgIGluaXR4bGF0ZShsY3MscmNzKTsgICAgICAgICAgICAgLyogVHJhbnNsYXRlIGFyZyBmcm9tIGxjcyB0byByY3MgKi8KKyAgICAgICAgeGduYnAgPSBhcmc7ICAgICAgICAgICAgICAgICAgICAvKiBHbG9iYWwgcG9pbnRlciB0byBpbnB1dCBzdHJpbmcgKi8KKyAgICAgICAgcmZucHRyID0gcmZuYnVmOyAgICAgICAgICAgICAgICAvKiBHbG9iYWwgcG9pbnRlciB0byBvdXRwdXQgYnVmZmVyICovCisKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGlmICgoYzAgPSB4Z25ieXRlKEZDX1VDUzIsbGNzLHN0cmdldGMpKSA8IDApIGJyZWFrOworICAgICAgICAgICAgaWYgKHhwbmJ5dGUoYzAsVENfVUNTMixyY3Msc3RycHV0YykgPCAwKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgIFdlIGhhdmUgdG8gY29weSBoZXJlIGluc3RlYWQgb2YgdHJhbnNsYXRpbmcgZGlyZWN0bHkgaW50bworICAgICAgICAgIHhjbWRidWZbXSBzbyBzdHJwdXRjKCkgY2FuIGNoZWNrIGxlbmd0aC4gIEFsdGVybmF0aXZlbHkgd2UgY291bGQKKyAgICAgICAgICB3cml0ZSB5ZXQgYW5vdGhlciB4cG5ieXRlKCkgb3V0cHV0IGZ1bmN0aW9uLgorICAgICAgICAqLworICAgICAgICBpZiAoKGludClzdHJsZW4ocmZuYnVmKSA+IChSRk5CVUZTSVogLSAoY21kbGVuKzEpKSkgeworICAgICAgICAgICAgcHJpbnRmKCI/RlRQIGNvbW1hbmQgdG9vIGxvbmc6ICVzICsgYXJnXG4iLGNtZCk7CisgICAgICAgICAgICBmdHBjb2RlID0gLTE7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgeCA9IGNrc3RybmNweSgmeGNtZGJ1ZltjbWRsZW4rMV0sIHJmbmJ1ZiwgUkZOQlVGU0laIC0gKGNtZGxlbisxKSk7CisgICAgfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworICAgIHMgPSB4Y21kYnVmOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgdG8gc2VuZCB0byBzZXJ2ZXIgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgewkJCS8qIExvZyBpdCAqLworCWlmICghYW5vbnltb3VzICYmICFja3N0cmNtcChzLCJQQVNTICIsNSwwKSkgeworCSAgICAvKiBCdXQgZG9uJ3QgbG9nIHBhc3N3b3JkcyAqLworCSAgICBkZWJ1ZyhGMTEwLCJGVFAgU0VOVCAiLCJQQVNTIFhYWFgiLDApOworCX0gZWxzZSB7CisJICAgIGRlYnVnKEYxMTAsIkZUUCBTRU5UICIscywwKTsKKwl9CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgIGFnYWluOgorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICBpZiAoc2NvbW1hbmQocykgPT0gMCkgeyAgICAgICAgICAgICAgLyogU2VuZCBpdC4gKi8KKyAgICAgIHNpZ25hbChTSUdJTlQsIG9sZGludHIpOworICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBjcGVuZCA9IDE7CisgICAgeCA9ICFzdHJjbXAoY21kLCJRVUlUIik7CQkvKiBJcyBpdCB0aGUgUVVJVCBjb21tYW5kPyAqLworICAgIGlmICh4KQkJCQkvKiBJbiBjYXNlIHdlJ3JlIGludGVycnVwdGVkICovCisgICAgICBjb25uZWN0ZWQgPSAwOwkJCS8qIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSByZXBseS4uLiAqLworCisgICAgZmMgPSAwOwkJCQkvKiBGdW5jdGlvbiBjb2RlIGZvciBnZXRyZXBseSgpICovCisgICAgaWYgKCFzdHJuY21wKGNtZCwiQVVUSCAiLDUpCQkvKiBNdXN0IHBhcnNlIEFVVEggcmVwbHkgKi8KKyNpZmRlZiBGVFBIT1NUCisJJiYgc3RybmNtcChjbWQsICJIT1NUICIsNSkKKyNlbmRpZiAvKiBGVFBIT1NUICovCisJKSB7CisJZmMgPSBHUkZfQVVUSDsKKyAgICB9IGVsc2UgaWYgKCFja3N0cmNtcChjbWQsIkZFQVQiLC0xLDApKSB7IC8qIE11c3QgcGFyc2UgRkVBVCByZXBseSAqLworCWZjID0gR1JGX0ZFQVQ7CQkJLyogQnV0IEZFQVQgbm90IHdpZGVseSB1bmRlcnN0b29kICovCisJaWYgKCFmdHBfZGViKQkJCS8qIFNvIHN1cHByZXNzIGVycm9yIG1lc3NhZ2VzICovCisJICB2Ym0gPSA5OworICAgIH0KKyAgICByID0gZ2V0cmVwbHkoeCwJCQkvKiBFeHBlY3QgY29ubmVjdGlvbiB0byBjbG9zZSAqLworCQkgbGNzLHJjcywJCS8qIENoYXJzZXRzICovCisJCSB2Ym0sCQkJLyogVmVyYm9zaXR5ICovCisJCSBmYwkJCS8qIEZ1bmN0aW9uIGNvZGUgKi8KKwkJICk7CisgICAgaWYgKHEgPiAtMSkKKyAgICAgIHF1aWV0ID0gcTsKKworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBpZiAoZnRwY29kZSA9PSA1MzMgJiYgZnRwX2NwbCA9PSBGUExfUFJWKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgIkVOQyBjb21tYW5kIG5vdCBzdXBwb3J0ZWQgYXQgc2VydmVyOyByZXRyeWluZyB1bmRlciBNSUMuLi5cbiIpOworICAgICAgICBmdHBfY3BsID0gRlBMX1NBRjsKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmIENPTU1FTlQKKyAgICBpZiAoY2FuY2VsZmlsZSAmJiBvbGRpbnRyICE9IFNJR19JR04pCisgICAgICAoKm9sZGludHIpKFNJR0lOVCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHNpZ25hbChTSUdJTlQsIG9sZGludHIpOworICAgIHJldHVybihyKTsKK30KKworc3RhdGljIFZPSUQKK2xvc3RwZWVyKCkgeworICAgIGRlYnVnKEYxMDAsImxvc3RwZWVyIiwiIiwwKTsKKyAgICBpZiAoY29ubmVjdGVkKSB7CisgICAgICAgIGlmIChjc29ja2V0ICE9IC0xKSB7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICBpZiAoc3NsX2Z0cF9hY3RpdmVfZmxhZykgeworICAgICAgICAgICAgICAgIFNTTF9zaHV0ZG93bihzc2xfZnRwX2Nvbik7CisgICAgICAgICAgICAgICAgU1NMX2ZyZWUoc3NsX2Z0cF9jb24pOworICAgICAgICAgICAgICAgIHNzbF9mdHBfcHJveHkgPSAwOworICAgICAgICAgICAgICAgIHNzbF9mdHBfYWN0aXZlX2ZsYWcgPSAwOworICAgICAgICAgICAgICAgIHNzbF9mdHBfY29uID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICAgICAgc29ja2V0X2Nsb3NlKGNzb2NrZXQpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgICAgIHNodXRkb3duKGNzb2NrZXQsIDErMSk7CisjZW5kaWYgLyogVVNFX1NIVVRET1dOICovCisgICAgICAgICAgICBjbG9zZShjc29ja2V0KTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgY3NvY2tldCA9IC0xOworICAgICAgICB9CisgICAgICAgIGlmIChkYXRhICE9IC0xKSB7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICBpZiAoc3NsX2Z0cF9kYXRhX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgICAgICAgICAgU1NMX3NodXRkb3duKHNzbF9mdHBfZGF0YV9jb24pOworICAgICAgICAgICAgICAgIFNTTF9mcmVlKHNzbF9mdHBfZGF0YV9jb24pOworICAgICAgICAgICAgICAgIHNzbF9mdHBfZGF0YV9hY3RpdmVfZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgc3NsX2Z0cF9kYXRhX2NvbiA9IE5VTEw7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICAgIHNvY2tldF9jbG9zZShkYXRhKTsKKyNlbHNlIC8qIFRDUElQTElCICovCisjaWZkZWYgVVNFX1NIVVRET1dOCisgICAgICAgICAgICBzaHV0ZG93bihkYXRhLCAxKzEpOworI2VuZGlmIC8qIFVTRV9TSFVURE9XTiAqLworICAgICAgICAgICAgY2xvc2UoZGF0YSk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgIGRhdGEgPSAtMTsKKyAgICAgICAgICAgIGdsb2JhbGRpbiA9IC0xOworICAgICAgICB9CisgICAgICAgIGNvbm5lY3RlZCA9IDA7CisgICAgICAgIGFub255bW91cyA9IDA7CisgICAgICAgIGxvZ2dlZGluID0gMDsKKyAgICAgICAgYXV0aF90eXBlID0gTlVMTDsKKyAgICAgICAgZnRwX2NwbCA9IGZ0cF9kcGwgPSBGUExfQ0xSOworI2lmZGVmIENLTE9HRElBTAorICAgICAgICBmdHBsb2dlbmQoKTsKKyNlbmRpZiAvKiBDS0xPR0RJQUwgKi8KKworI2lmZGVmIExPQ1VTCisJaWYgKGF1dG9sb2N1cykJCQkvKiBBdW90b21hdGljIGxvY3VzIHN3aXRjaGluZy4uLiAqLworCSAgc2V0bG9jdXMoMSwxKTsJCS8qIFN3aXRjaCBsb2N1cyB0byBsb2NhbC4gKi8KKyNlbmRpZiAvKiBMT0NVUyAqLworI2lmZGVmIE9TMgorICAgICAgICBEaWFsZXJTZW5kKE9QVF9LRVJNSVRfSEFOR1VQLCAwKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB9CisjaWZkZWYgRlRQX1BST1hZCisgICAgcHN3aXRjaCgxKTsKKyAgICBpZiAoY29ubmVjdGVkKSB7CisgICAgICAgIGlmIChjc29ja2V0ICE9IC0xKSB7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICAgIHNvY2tldF9jbG9zZShjc29ja2V0KTsKKyNlbHNlIC8qIFRDUElQTElCICovCisjaWZkZWYgVVNFX1NIVVRET1dOCisgICAgICAgICAgICBzaHV0ZG93bihjc29ja2V0LCAxKzEpOworI2VuZGlmIC8qIFVTRV9TSFVURE9XTiAqLworICAgICAgICAgICAgY2xvc2UoY3NvY2tldCk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgIGNzb2NrZXQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBjb25uZWN0ZWQgPSAwOworICAgICAgICBhbm9ueW1vdXMgPSAwOworICAgICAgICBsb2dnZWRpbiA9IDA7CisgICAgICAgIGF1dGhfdHlwZSA9IE5VTEw7CisgICAgICAgIGZ0cF9jcGwgPSBmdHBfZHBsID0gRlBMX0NMUjsKKyAgICB9CisgICAgcHJveGZsYWcgPSAwOworICAgIHBzd2l0Y2goMCk7CisjZW5kaWYgLyogRlRQX1BST1hZICovCit9CisKK2ludAorZnRwaXNvcGVuKCkgeworICAgIHJldHVybihjb25uZWN0ZWQpOworfQorCitzdGF0aWMgaW50CitmdHBjbG9zZSgpIHsKKyAgICBleHRlcm4gaW50IHF1aXR0aW5nOworICAgIGlmICghY29ubmVjdGVkKQorICAgICAgcmV0dXJuKDApOworICAgIGlmICghZnRwX3ZibSAmJiAhcXVpZXQpIHByaW50bGluZXMgPSAxOworICAgIGZ0cGNtZCgiUVVJVCIsTlVMTCwwLDAsZnRwX3ZibSk7CisgICAgaWYgKGNzb2NrZXQpIHsKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgaWYgKHNzbF9mdHBfYWN0aXZlX2ZsYWcpIHsKKyAgICAgICAgICAgIFNTTF9zaHV0ZG93bihzc2xfZnRwX2Nvbik7CisgICAgICAgICAgICBTU0xfZnJlZShzc2xfZnRwX2Nvbik7CisgICAgICAgICAgICBzc2xfZnRwX3Byb3h5ID0gMDsKKyAgICAgICAgICAgIHNzbF9mdHBfYWN0aXZlX2ZsYWcgPSAwOworICAgICAgICAgICAgc3NsX2Z0cF9jb24gPSBOVUxMOworICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgc29ja2V0X2Nsb3NlKGNzb2NrZXQpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgc2h1dGRvd24oY3NvY2tldCwgMSsxKTsKKyNlbmRpZiAvKiBVU0VfU0hVVERPV04gKi8KKyAgICAgICAgY2xvc2UoY3NvY2tldCk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICB9CisgICAgY3NvY2tldCA9IC0xOworICAgIGNvbm5lY3RlZCA9IDA7CisgICAgYW5vbnltb3VzID0gMDsKKyAgICBsb2dnZWRpbiA9IDA7CisgICAgbWR0bW9rID0gMTsKKyAgICBzaXplb2sgPSAxOworICAgIGZlYXRvayA9IDE7CisgICAgc3RvdWFyZyA9IDE7CisgICAgdHlwZXNlbnQgPSAwOworICAgIGRhdGEgPSAtMTsKKyAgICBnbG9iYWxkaW4gPSAtMTsKKyNpZmRlZiBGVFBfUFJPWFkKKyAgICBpZiAoIXByb3h5KQorICAgICAgbWFjbnVtID0gMDsKKyNlbmRpZiAvKiBGVFBfUFJPWFkgKi8KKyAgICBhdXRoX3R5cGUgPSBOVUxMOworICAgIGZ0cF9kcGwgPSBGUExfQ0xSOworI2lmZGVmIENLTE9HRElBTAorICAgIGZ0cGxvZ2VuZCgpOworI2VuZGlmIC8qIENLTE9HRElBTCAqLworI2lmZGVmIExPQ1VTCisgICAgLyogVW5wcmVmaXhlZCBmaWxlIG1hbmFnZW1lbnQgY29tbWFuZHMgYXJlIGV4ZWN1dGVkIGxvY2FsbHkgKi8KKyAgICBpZiAoYXV0b2xvY3VzICYmICFmdHBfY21kbGluICYmICFxdWl0dGluZykgeworICAgICAgICBzZXRsb2N1cygxLDEpOworICAgIH0KKyNlbmRpZiAvKiBMT0NVUyAqLworI2lmZGVmIE9TMgorICAgIERpYWxlclNlbmQoT1BUX0tFUk1JVF9IQU5HVVAsIDApOworI2VuZGlmIC8qIE9TMiAqLworICAgIHJldHVybigwKTsKK30KKworaW50CitmdHBvcGVuKHJlbW90ZSwgc2VydmljZSwgdXNlX3RscykgY2hhciAqIHJlbW90ZSwgKiBzZXJ2aWNlOyBpbnQgdXNlX3RsczsgeworICAgIGNoYXIgKiBob3N0OworCisgICAgaWYgKGNvbm5lY3RlZCkgeworICAgICAgICBwcmludGYoIj9BbHJlYWR5IGNvbm5lY3RlZCB0byAlcywgdXNlIEZUUCBDTE9TRSBmaXJzdC5cbiIsIGZ0cF9ob3N0KTsKKyAgICAgICAgZnRwY29kZSA9IC0xOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2lmZGVmIEZUUEhPU1QKKyAgICBob3N0Y21kID0gMDsKKyNlbmRpZiAvKiBGVFBIT1NUICovCisgICAgYWxpa2UgPSAwOworICAgIGZ0cF9zcnZ0eXBbMF0gPSBOVUw7CisgICAgaWYgKCFzZXJ2aWNlKSBzZXJ2aWNlID0gIiI7CisgICAgaWYgKCEqc2VydmljZSkgc2VydmljZSA9IHVzZV90bHMgPyAiZnRwcyIgOiAiZnRwIjsKKworICAgIGlmICghaXNkaWdpdChzZXJ2aWNlWzBdKSkgeworICAgICAgICBzdHJ1Y3Qgc2VydmVudCAqZGVzdHNwOworICAgICAgICBkZXN0c3AgPSBnZXRzZXJ2YnluYW1lKHNlcnZpY2UsICJ0Y3AiKTsKKyAgICAgICAgaWYgKCFkZXN0c3ApIHsKKyAgICAgICAgICAgIGlmICghY2tzdHJjbXAoc2VydmljZSwiZnRwIiwtMSwwKSkgeworICAgICAgICAgICAgICAgIGZ0cF9wb3J0ID0gMjE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFja3N0cmNtcChzZXJ2aWNlLCJmdHBzIiwtMSwwKSkgeworICAgICAgICAgICAgICAgIGZ0cF9wb3J0ID0gOTkwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9CYWQgcG9ydCBuYW1lIC0gXCIlc1wiXG4iLCBzZXJ2aWNlKTsKKyAgICAgICAgICAgICAgICBmdHBjb2RlID0gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnRwX3BvcnQgPSBkZXN0c3AtPnNfcG9ydDsKKyAgICAgICAgICAgIGZ0cF9wb3J0ID0gbnRvaHMoZnRwX3BvcnQpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGZ0cF9wb3J0ID0gYXRvaShzZXJ2aWNlKTsKKyAgICBpZiAoZnRwX3BvcnQgPD0gMCkgeworICAgICAgICBwcmludGYoIj9CYWQgcG9ydCBuYW1lIC0gXCIlc1wiXG4iLCBzZXJ2aWNlKTsKKyAgICAgICAgZnRwY29kZSA9IC0xOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGhvc3QgPSBmdHBfaG9va3VwKHJlbW90ZSwgZnRwX3BvcnQsIHVzZV90bHMpOworICAgIGlmIChob3N0KSB7CisgICAgICAgIGNrc3RybmNweShmdHBfdXNlcl9ob3N0LHJlbW90ZSxNQVhfRE5TX05BTUVMRU4pOworICAgICAgICBjb25uZWN0ZWQgPSAxOyAgICAgICAgICAgICAgICAgIC8qIFNldCBGVFAgZGVmYXVsdHMgKi8KKyAgICAgICAgZnRwX2NwbCA9IGZ0cF9kcGwgPSBGUExfQ0xSOworICAgICAgICBjdXJ0eXBlID0gRlRUX0FTQzsgICAgICAgICAgICAgIC8qIFNlcnZlciB1c2VzIEFTQ0lJIG1vZGUgKi8KKyAgICAgICAgZm9ybSA9IEZPUk1fTjsKKyAgICAgICAgbW9kZSA9IE1PREVfUzsKKyAgICAgICAgc3RydSA9IFNUUlVfRjsKKyAgICAgICAgc3RyY3B5KGJ5dGVuYW1lLCAiOCIpOworICAgICAgICBieXRlc2l6ZSA9IDg7CisKKyNpZmRlZiBGVFBfU0VDVVJJVFkKKyAgICAgICAgaWYgKGZ0cF9hdXQpIHsKKyAgICAgICAgICAgIGlmIChmdHBfYXV0aCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZ0cF9jcnkgCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgICAmJiBja19jcnlwdF9pc19pbnN0YWxsZWQoKQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJGVFAgQ29tbWFuZCBjaGFubmVsIGlzIFByaXZhdGUgKGVuY3J5cHRlZClcbiIpOworICAgICAgICAgICAgICAgICAgICBmdHBfY3BsID0gRlBMX1BSVjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNldHBic3ooREVGQVVMVF9QQlNaKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEgZmFpbHVyZSBoZXJlIGlzIG1vc3QgbGlrZWx5IGNhdXNlZCBieSBhIG1peHVwICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiB0aGUgc2Vzc2lvbiBrZXkgdXNlZCBieSBjbGllbnQgYW5kIHNlcnZlciAgICAqLworCQkJcHJpbnRmKCI/UHJvdGVjdGlvbiBidWZmZXIgc2l6ZSBuZWdvdGlhdGlvbiBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChmdHBjbWQoIlBST1QgUCIsTlVMTCwwLDAsZnRwX3ZibSkgPT0gUkVQTFlfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRlRQIERhdGEgY2hhbm5lbCBpcyBQcml2YXRlIChlbmNyeXB0ZWQpXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0cF9kcGwgPSBGUExfUFJWOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gZW5hYmxlIGVuY3J5cHRpb24gb24gZGF0YSBjaGFubmVsXG4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmdHBfY3BsID0gRlBMX1NBRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWNvbm5lY3RlZCkKKwkgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyNlbmRpZiAvKiBGVFBfU0VDVVJJVFkgKi8KKyAgICAgICAgaWYgKGZ0cF9sb2cpCQkJLyogXl5eICovCisgICAgICAgICAgZnRwX2xvZ2luKHJlbW90ZSk7CisKKyAgICAgICAgaWYgKCFjb25uZWN0ZWQpCisJICBnb3RvIGZhaWw7CisKKyNpZmRlZiBDS0xPR0RJQUwKKyAgICAgICAgZG9sb2dmdHAoKTsKKyNlbmRpZiAvKiBDS0xPR0RJQUwgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgRGlhbGVyU2VuZChPUFRfS0VSTUlUX0NPTk5FQ1QsIDApOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICBwYXNzaXZlbW9kZSA9IGZ0cF9wc3Y7CisgICAgICAgIHNlbmRwb3J0ID0gZnRwX3NwYzsKKwltZHRtb2sgPSAxOworCXNpemVvayA9IDE7CisJc3RvdWFyZyA9IDE7CisJdHlwZXNlbnQgPSAwOworCisgICAgICAgIGlmICh1Y2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBhY3R1YWxidWYgPSBERUZBVUxUX1BCU1o7CisgICAgICAgICAgICB3aGlsZSAoYWN0dWFsYnVmICYmICh1Y2J1ZiA9IChDSEFSICopbWFsbG9jKGFjdHVhbGJ1ZikpID09IE5VTEwpCisgICAgICAgICAgICAgIGFjdHVhbGJ1ZiA+Pj0gMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1heGJ1ZikKKyAgICAgICAgICB1Y2J1ZnNpeiA9IGFjdHVhbGJ1ZiAtIEZVREdFX0ZBQ1RPUjsKKwlkZWJ1ZyhGMTAxLCJmdHBvcGVuIHVjYnVmc2l6IiwiIix1Y2J1ZnNpeik7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisgIGZhaWw6CisgICAgcHJpbnRmKCI/Q2FuJ3QgRlRQIGNvbm5lY3QgdG8gJXM6JXNcbiIscmVtb3RlLHNlcnZpY2UpOworICAgIGZ0cGNvZGUgPSAtMTsKKyAgICByZXR1cm4oMCk7Cit9CisKKyNpZmRlZiBDS19TU0wKK2ludAorc3NsX2F1dGgoKSB7CisgICAgaW50IGk7CisgICAgY2hhciogcDsKKworICAgIGlmIChzc2xfZGVidWdfZmxhZykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiU1NMIERFQlVHIEFDVElWRVxuIik7CisgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAvKiBmb3IgdGhlIG1vbWVudCBJIHdhbnQgdGhlIG91dHB1dCBvbiBzY3JlZW4gKi8KKyAgICB9CisgICAgaWYgKHNzbF9mdHBfZGF0YV9jb24gIT0gTlVMTCkgeworICAgICAgICBTU0xfZnJlZShzc2xfZnRwX2RhdGFfY29uKTsKKyAgICAgICAgc3NsX2Z0cF9kYXRhX2NvbiA9IE5VTEw7CisgICAgfQorICAgIGlmIChzc2xfZnRwX2NvbiAhPSBOVUxMKSB7CisgICAgICAgIFNTTF9mcmVlKHNzbF9mdHBfY29uKTsKKyAgICAgICAgc3NsX2Z0cF9jb249TlVMTDsKKyAgICB9CisgICAgaWYgKHNzbF9mdHBfY3R4ICE9IE5VTEwpIHsKKyAgICAgICAgU1NMX0NUWF9mcmVlKHNzbF9mdHBfY3R4KTsKKyAgICAgICAgc3NsX2Z0cF9jdHggPSBOVUxMOworICAgIH0KKworICAgIC8qIFRoZSBTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTIAorICAgICAqIHdhcyBhZGRlZCB0byBPcGVuU1NMIDAuOS42ZSBhbmQgMC45LjcuICBJdCBkb2VzIG5vdCBleGlzdCBpbiBwcmV2aW91cworICAgICAqIHZlcnNpb25zCisgICAgICovCisjaWZuZGVmIFNTTF9PUF9ET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMKKyNkZWZpbmUgU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUyAwTAorI2VuZGlmCisgICAgaWYgKGF1dGhfdHlwZSAmJiAhc3RyY21wKGF1dGhfdHlwZSwiVExTIikpIHsKKyAgICAgICAgc3NsX2Z0cF9jdHg9U1NMX0NUWF9uZXcoU1NMdjNfY2xpZW50X21ldGhvZCgpKTsKKyAgICAgICAgaWYgKCFzc2xfZnRwX2N0eCkKKyAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoc3NsX2Z0cF9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX09QX1NJTkdMRV9ESF9VU0V8U1NMX09QX0VQSEVNRVJBTF9SU0EKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICAgIHNzbF9mdHBfY3R4ID0gU1NMX0NUWF9uZXcoZnRwX2J1Z191c2Vfc3NsX3YyID8gU1NMdjIzX2NsaWVudF9tZXRob2QoKSA6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTHYzX2NsaWVudF9tZXRob2QoKSk7CisgICAgICAgIGlmICghc3NsX2Z0cF9jdHgpCisgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKHNzbF9mdHBfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdHBfYnVnX3VzZV9zc2xfdjIgPyAwIDogU1NMX09QX05PX1NTTHYyKXwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfT1BfU0lOR0xFX0RIX1VTRXxTU0xfT1BfRVBIRU1FUkFMX1JTQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKHNzbF9mdHBfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwZW1fcGFzc3dvcmRfY2IgKilzc2xfcGFzc3dkX2NhbGxiYWNrKTsKKyAgICBTU0xfQ1RYX3NldF9pbmZvX2NhbGxiYWNrKHNzbF9mdHBfY3R4LHNzbF9jbGllbnRfaW5mb19jYWxsYmFjayk7CisgICAgU1NMX0NUWF9zZXRfc2Vzc2lvbl9jYWNoZV9tb2RlKHNzbF9mdHBfY3R4LFNTTF9TRVNTX0NBQ0hFX0NMSUVOVCk7CisKKyNpZmRlZiBPUzIKKyNpZmRlZiBOVAorICAgIC8qIFRoZSBkZWZhdWx0cyBpbiB0aGUgU1NMIGNyeXB0byBsaWJyYXJ5IGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIE9TLzIgKi8KKyAgICB7CisgICAgICAgIGNoYXIgcGF0aFtDS01BWFBBVEhdOworICAgICAgICBleHRlcm4gY2hhciBleGVkaXJbXTsKKworICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxleGVkaXIsImNlcnRzIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc3NsX2Z0cF9jdHgsTlVMTCxwYXRoKSA9PSAwKSAgeworICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIHNzbF9hdXRoIHVuYWJsZSB0byBsb2FkIHBhdGgiLHBhdGgsMCk7CisgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGxvYWQgdmVyaWZ5LWRpcjogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNrbWFrbXNnKHBhdGgsQ0tNQVhQQVRILAorICAgICAgICAgICAgICAgICAoY2hhciAqKUdldEFwcERhdGEoMSksImtlcm1pdCA5NS9jZXJ0cyIsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNzbF9mdHBfY3R4LE5VTEwscGF0aCkgPT0gMCkgIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBzc2xfYXV0aCB1bmFibGUgdG8gbG9hZCBwYXRoIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byBsb2FkIHZlcmlmeS1kaXI6ICVzXHJcbiIscGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCwKKyAgICAgICAgICAgICAgICAgKGNoYXIgKilHZXRBcHBEYXRhKDApLCJrZXJtaXQgOTUvY2VydHMiLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzc2xfZnRwX2N0eCxOVUxMLHBhdGgpID09IDApICB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgc3NsX2F1dGggdW5hYmxlIHRvIGxvYWQgcGF0aCIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gbG9hZCB2ZXJpZnktZGlyOiAlc1xyXG4iLHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsZXhlZGlyLCJjYV9jZXJ0cy5wZW0iLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzc2xfZnRwX2N0eCxwYXRoLE5VTEwpID09IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBzc2xfYXV0aCB1bmFibGUgdG8gbG9hZCBwYXRoIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byBsb2FkIHZlcmlmeS1maWxlOiAlc1xyXG4iLHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsKGNoYXIgKilHZXRBcHBEYXRhKDEpLAorCQkgImtlcm1pdCA5NS9jYV9jZXJ0cy5wZW0iLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzc2xfZnRwX2N0eCxwYXRoLE5VTEwpID09IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBzc2xfYXV0aCB1bmFibGUgdG8gbG9hZCBwYXRoIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byBsb2FkIHZlcmlmeS1maWxlOiAlc1xyXG4iLHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsKGNoYXIgKilHZXRBcHBEYXRhKDApLAorCQkgImtlcm1pdCA5NS9jYV9jZXJ0cy5wZW0iLE5VTEwsTlVMTCk7CisgICAgICAgIGlmIChTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzc2xfZnRwX2N0eCxwYXRoLE5VTEwpID09IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ0cCBzc2xfYXV0aCB1bmFibGUgdG8gbG9hZCBwYXRoIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byBsb2FkIHZlcmlmeS1maWxlOiAlc1xyXG4iLHBhdGgpOworICAgICAgICB9CisgICAgfQorI2Vsc2UgLyogTlQgKi8KKyAgICAvKiBUaGUgZGVmYXVsdHMgaW4gdGhlIFNTTCBjcnlwdG8gbGlicmFyeSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBPUy8yICovCisgICAgeworCisgICAgICAgIGNoYXIgcGF0aFtDS01BWFBBVEhdOworICAgICAgICBleHRlcm4gY2hhciBleGVkaXJbXTsKKworICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxleGVkaXIsImNlcnRzIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc3NsX2Z0cF9jdHgsTlVMTCxwYXRoKSA9PSAwKSAgeworICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIHNzbF9hdXRoIHVuYWJsZSB0byBsb2FkIHBhdGgiLHBhdGgsMCk7CisgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGxvYWQgdmVyaWZ5LWRpcjogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCxleGVkaXIsImNhX2NlcnRzLnBlbSIsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNzbF9mdHBfY3R4LHBhdGgsTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIHNzbF9hdXRoIHVuYWJsZSB0byBsb2FkIHBhdGgiLHBhdGgsMCk7CisgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGxvYWQgdmVyaWZ5LWZpbGU6ICVzXHJcbiIscGF0aCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTlQgKi8KKyNlbHNlIC8qIE9TMiAqLworICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKHNzbF9mdHBfY3R4KTsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIGlmIChzc2xfdmVyaWZ5X2ZpbGUgJiYKKyAgICAgICAgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc3NsX2Z0cF9jdHgsc3NsX3ZlcmlmeV9maWxlLE5VTEwpID09IDApIHsKKyAgICAgICAgZGVidWcoRjExMCwKKyAgICAgICAgICAgICAgImZ0cCBzc2wgYXV0aCB1bmFibGUgdG8gbG9hZCBzc2xfdmVyaWZ5X2ZpbGUiLAorICAgICAgICAgICAgICBzc2xfdmVyaWZ5X2ZpbGUsCisgICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byBsb2FkIHZlcmlmeS1maWxlOiAlc1xyXG4iLHNzbF92ZXJpZnlfZmlsZSk7CisgICAgfQorICAgIGlmIChzc2xfdmVyaWZ5X2RpciAmJgorICAgICAgICBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzc2xfZnRwX2N0eCxOVUxMLHNzbF92ZXJpZnlfZGlyKSA9PSAwKSB7CisgICAgICAgIGRlYnVnKEYxMTAsCisgICAgICAgICAgICAgICJmdHAgc3NsIGF1dGggdW5hYmxlIHRvIGxvYWQgc3NsX3ZlcmlmeV9kaXIiLAorICAgICAgICAgICAgICBzc2xfdmVyaWZ5X2RpciwKKyAgICAgICAgICAgICAgMAorICAgICAgICAgICAgICApOworICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGxvYWQgdmVyaWZ5LWRpcjogJXNcclxuIixzc2xfdmVyaWZ5X2Rpcik7CisgICAgfQorCisgICAgLyogc2V0IHVwIHRoZSBuZXcgQ1JMIFN0b3JlICovCisgICAgY3JsX3N0b3JlID0gKFg1MDlfU1RPUkUgKilYNTA5X1NUT1JFX25ldygpOworICAgIGlmIChjcmxfc3RvcmUpIHsKKyNpZmRlZiBPUzIKKyAgICAgICAgY2hhciBwYXRoW0NLTUFYUEFUSF07CisgICAgICAgIGV4dGVybiBjaGFyIGV4ZWRpcltdOworCisgICAgICAgIGNrbWFrbXNnKHBhdGgsQ0tNQVhQQVRILGV4ZWRpciwiY3JscyIsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMoY3JsX3N0b3JlLE5VTEwscGF0aCkgPT0gMCkgeworICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIHNzbCBhdXRoIHVuYWJsZSB0byBsb2FkIGRpciIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gbG9hZCBjcmwtZGlyOiAlc1xyXG4iLHBhdGgpOworICAgICAgICB9CisjaWZkZWYgTlQKKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsCisJCSAoY2hhciAqKUdldEFwcERhdGEoMSksImtlcm1pdCA5NS9jcmxzIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhjcmxfc3RvcmUsTlVMTCxwYXRoKSA9PSAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgc3NsIGF1dGggdW5hYmxlIHRvIGxvYWQgZGlyIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byBsb2FkIGNybC1kaXI6ICVzXHJcbiIscGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsCisJCSAoY2hhciAqKUdldEFwcERhdGEoMCksImtlcm1pdCA5NS9jcmxzIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhjcmxfc3RvcmUsTlVMTCxwYXRoKSA9PSAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgc3NsIGF1dGggdW5hYmxlIHRvIGxvYWQgZGlyIixwYXRoLDApOworICAgICAgICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byBsb2FkIGNybC1kaXI6ICVzXHJcbiIscGF0aCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAKKyAgICAgICAgY2ttYWttc2cocGF0aCxDS01BWFBBVEgsZXhlZGlyLCJjYV9jcmxzLnBlbSIsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMoY3JsX3N0b3JlLHBhdGgsTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIHNzbCBhdXRoIHVuYWJsZSB0byBsb2FkIGZpbGUiLHBhdGgsMCk7CisgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGxvYWQgY3JsLWZpbGU6ICVzXHJcbiIscGF0aCk7CisgICAgICAgIH0KKyNpZmRlZiBOVAorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCwoY2hhciAqKUdldEFwcERhdGEoMSksCisJCSAia2VybWl0IDk1L2NhX2NybHMucGVtIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhjcmxfc3RvcmUscGF0aCxOVUxMKSA9PSAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgc3NsIGF1dGggdW5hYmxlIHRvIGxvYWQgZmlsZSIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gbG9hZCBjcmwtZmlsZTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBja21ha21zZyhwYXRoLENLTUFYUEFUSCwoY2hhciAqKUdldEFwcERhdGEoMCksCisJCSAia2VybWl0IDk1L2NhX2NybHMucGVtIixOVUxMLE5VTEwpOworICAgICAgICBpZiAoWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhjcmxfc3RvcmUscGF0aCxOVUxMKSA9PSAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgc3NsIGF1dGggdW5hYmxlIHRvIGxvYWQgZmlsZSIscGF0aCwwKTsKKyAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gbG9hZCBjcmwtZmlsZTogJXNcclxuIixwYXRoKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogT1MyICovCisKKyAgICAgICAgaWYgKHNzbF9jcmxfZmlsZSB8fCBzc2xfY3JsX2RpcikgeworICAgICAgICAgICAgaWYgKHNzbF9jcmxfZmlsZSAmJgorICAgICAgICAgICAgICAgIFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMoY3JsX3N0b3JlLHNzbF9jcmxfZmlsZSxOVUxMKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwKKyAgICAgICAgICAgICAgICAgICAgICAiZnRwIHNzbCBhdXRoIHVuYWJsZSB0byBsb2FkIHNzbF9jcmxfZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgc3NsX2NybF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byBsb2FkIGNybC1maWxlOiAlc1xyXG4iLHNzbF9jcmxfZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3NsX2NybF9kaXIgJiYKKyAgICAgICAgICAgICAgICBYNTA5X1NUT1JFX2xvYWRfbG9jYXRpb25zKGNybF9zdG9yZSxOVUxMLHNzbF9jcmxfZGlyKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwKKyAgICAgICAgICAgICAgICAgICAgICAiZnRwIHNzbCBhdXRoIHVuYWJsZSB0byBsb2FkIHNzbF9jcmxfZGlyIiwKKyAgICAgICAgICAgICAgICAgICAgICBzc2xfY3JsX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gbG9hZCBjcmwtZGlyOiAlc1xyXG4iLHNzbF9jcmxfZGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFg1MDlfU1RPUkVfc2V0X2RlZmF1bHRfcGF0aHMoY3JsX3N0b3JlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBTU0xfQ1RYX3NldF92ZXJpZnkoc3NsX2Z0cF9jdHgsc3NsX3ZlcmlmeV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICBzc2xfY2xpZW50X3ZlcmlmeV9jYWxsYmFjayk7CisgICAgc3NsX3ZlcmlmeV9kZXB0aCA9IC0xOworICAgIHNzbF9mdHBfY29uPShTU0wgKilTU0xfbmV3KHNzbF9mdHBfY3R4KTsKKyAgICB0bHNfbG9hZF9jZXJ0cyhzc2xfZnRwX2N0eCxzc2xfZnRwX2NvbiwwKTsKKyAgICBTU0xfc2V0X2ZkKHNzbF9mdHBfY29uLGNzb2NrZXQpOworICAgIFNTTF9zZXRfdmVyaWZ5KHNzbF9mdHBfY29uLHNzbF92ZXJpZnlfZmxhZyxOVUxMKTsKKyAgICBpZiAoc3NsX2NpcGhlcl9saXN0KSB7CisgICAgICAgIFNTTF9zZXRfY2lwaGVyX2xpc3Qoc3NsX2Z0cF9jb24sc3NsX2NpcGhlcl9saXN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyICogcDsKKyAgICAgICAgaWYgKHAgPSBnZXRlbnYoIlNTTF9DSVBIRVIiKSkgeworICAgICAgICAgICAgU1NMX3NldF9jaXBoZXJfbGlzdChzc2xfZnRwX2NvbixwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNTTF9zZXRfY2lwaGVyX2xpc3Qoc3NsX2Z0cF9jb24sREVGQVVMVF9DSVBIRVJfTElTVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCI9PlNUQVJUIFNTTC9UTFMgY29ubmVjdCBvbiBDT01NQU5EXG4iKTsKKyAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgfQorICAgIGlmIChTU0xfY29ubmVjdChzc2xfZnRwX2NvbikgPD0gMCkgeworICAgICAgICBzdGF0aWMgY2hhciBlcnJidWZbMTAyNF07CisgICAgICAgIGNrbWFrbXNnKGVycmJ1ZiwxMDI0LCJmdHA6IFNTTC9UTFMgY29ubmVjdCBDT01NQU5EIGVycm9yOiAiLAorICAgICAgICAgICAgICAgICBFUlJfZXJyb3Jfc3RyaW5nKEVSUl9nZXRfZXJyb3IoKSxOVUxMKSxOVUxMLE5VTEwpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXNcbiIsIGVycmJ1Zik7CisgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICBzc2xfZnRwX2FjdGl2ZV9mbGFnPTA7CisgICAgICAgIFNTTF9mcmVlKHNzbF9mdHBfY29uKTsKKyAgICAgICAgc3NsX2Z0cF9jb24gPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHNzbF9mdHBfYWN0aXZlX2ZsYWcgPSAxOworCisgICAgICAgIGlmICghc3NsX2NlcnRzb2tfZmxhZyAmJiAhdGxzX2lzX2tyYjUoMSkpIHsKKyAgICAgICAgICAgIGNoYXIgKnN1YmplY3QgPSBzc2xfZ2V0X3N1YmplY3RfbmFtZShzc2xfZnRwX2Nvbik7CisKKyAgICAgICAgICAgIGlmICghc3ViamVjdCkgeworICAgICAgICAgICAgICAgIGlmIChzc2xfdmVyaWZ5X2ZsYWcgJiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKSB7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInNzbF9hdXRoIiwiW1NTTCAtIEZBSUxFRF0iLDApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oc3NsX2Z0cF9hY3RpdmVfZmxhZyA9IDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh1cV9vaygiV2FybmluZzogU2VydmVyIGRpZG4ndCBwcm92aWRlIGEgY2VydGlmaWNhdGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRpbnVlPyAoWS9OKSIsMyxOVUxMLDApIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsICJzc2xfYXV0aCIsIltTU0wgLSBGQUlMRURdIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihzc2xfZnRwX2FjdGl2ZV9mbGFnID0gMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNzbF9jaGVja19zZXJ2ZXJfbmFtZShzc2xfZnRwX2NvbiwgZnRwX3VzZXJfaG9zdCkpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzc2xfYXV0aCIsIltTU0wgLSBGQUlMRURdIiwwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oc3NsX2Z0cF9hY3RpdmVfZmxhZyA9IDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTAsInNzbF9hdXRoIiwiW1NTTCAtIE9LXSIsMCk7CisgICAgICAgIHNzbF9kaXNwbGF5X2Nvbm5lY3RfZGV0YWlscyhzc2xfZnRwX2NvbiwwLHNzbF92ZXJib3NlX2ZsYWcpOworICAgIH0KKyAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIj0+RE9ORSBTU0wvVExTIGNvbm5lY3Qgb24gQ09NTUFORFxuIik7CisgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgIH0KKyAgICByZXR1cm4oc3NsX2Z0cF9hY3RpdmVfZmxhZyk7Cit9CisjZW5kaWYgLyogQ0tfU1NMICovCisKK3N0YXRpYyBzaWd0eXBlCitjbWRjYW5jZWwoc2lnKSBpbnQgc2lnOyB7CisjaWZkZWYgT1MyCisgICAgLyogSW4gVW5peCB3ZSAiY2hhaW4iIHRvIHRyYXAoKSwgd2hpY2ggcHJpbnRzIHRoaXMgKi8KKyAgICBwcmludGYoIl5DLi4uXG4iKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBkZWJ1ZyhGMTAwLCJmdHAgY21kY2FuY2VsIGNhdWdodCBTSUdJTlQgIiwiIiwwKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBzZWN1cmVfZ2V0YygwLDEpOwkJCS8qIEluaXRpYWxpemUgbmV0IGlucHV0IGJ1ZmZlcnMgKi8KKyAgICBjYW5jZWxmaWxlKys7CisgICAgY2FuY2VsZ3JvdXArKzsKKyAgICBtbHNyZXNldCgpOworI2lmbmRlZiBPUzIKKyNpZmRlZiBGVFBfUFJPWFkKKyAgICBpZiAocHRmbGFnKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm94eS4uLiAqLworICAgICAgbG9uZ2ptcChwdGNhbmNlbCwxKTsKKyNlbmRpZiAvKiBGVFBfUFJPWFkgKi8KKyAgICBkZWJ1ZyhGMTAwLCJmdHAgY21kY2FuY2VsIGNoYWluIHRvIHRyYXAoKS4uLiIsIiIsMCk7CisgICAgdHJhcChTSUdJTlQpOworICAgIC8qIE5PVFJFQUNIRUQgKi8KKyAgICBkZWJ1ZyhGMTAwLCJmdHAgY21kY2FuY2VsIHJldHVybiBmcm9tIHRyYXAoKS4uLiIsIiIsMCk7CisjZWxzZQorICAgIGRlYnVnKEYxMDAsImZ0cCBjbWRjYW5jZWwgUG9zdEN0cmxDU2VtKCkuLi4iLCIiLDApOworICAgIFBvc3RDdHJsQ1NlbSgpOworI2VuZGlmIC8qIE9TMiAqLworfQorCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK3Njb21tYW5kKGNoYXIgKiBzKSAgICAgICAgICAgICAgICAgICAgICAvKiBXYXMgc2VjdXJlX2NvbW1hbmQoKSAqLworI2Vsc2UKK3Njb21tYW5kKHMpIGNoYXIgKiBzOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaW50IGxlbmd0aCA9IDAsIGxlbjI7CisgICAgY2hhciBpbltGVFBfQlVGU0laXSwgb3V0W0ZUUF9CVUZTSVpdOworI2lmZGVmIENLX1NTTAorICAgIGlmIChzc2xfZnRwX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgIGludCBlcnJvciwgcmM7CisgICAgICAgIGxlbmd0aCA9IHN0cmxlbihzKSArIDI7CisgICAgICAgIGxlbmd0aCA9IGNrbWFrbXNnKG91dCxGVFBfQlVGU0laLHMsIlxyXG4iLE5VTEwsTlVMTCk7CisgICAgICAgIHJjID0gU1NMX3dyaXRlKHNzbF9mdHBfY29uLG91dCxsZW5ndGgpOworICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsX2Z0cF9jb24scmMpOworICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfTk9ORToKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorI2lmZGVmIE5UCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGdsZSA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5UICovCisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TU0w6CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGxvc3RwZWVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIGlmIChhdXRoX3R5cGUgJiYgZnRwX2NwbCAhPSBGUExfQ0xSKSB7CisjaWZkZWYgRlRQX1NSUAorICAgICAgICBpZiAoY2tfc3JwX2lzX2luc3RhbGxlZCgpICYmIChzdHJjbXAoYXV0aF90eXBlLCJTUlAiKSA9PSAwKSkKKyAgICAgICAgICBpZiAoKGxlbmd0aCA9IHNycF9lbmNvZGUoZnRwX2NwbCA9PSBGUExfUFJWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0hBUiAqKXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDSEFSICopb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4ocykpKSA8IDApIHsKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTUlAgZmFpbGVkIHRvIGVuY29kZSBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBGVFBfU1JQICovCisjaWZkZWYgRlRQX0tSQjQKKyAgICAgICAgaWYgKGNrX2tyYjRfaXNfaW5zdGFsbGVkKCkgJiYKKyAgICAgICAgICAgIChzdHJjbXAoYXV0aF90eXBlLCAiS0VSQkVST1NfVjQiKSA9PSAwKSkgeworICAgICAgICAgICAgaWYgKGZ0cF9jcGwgPT0gRlBMX1BSVikgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9CisgICAgICAgICAgICAgICAgICBrcmJfbWtfcHJpdigoQ0hBUiAqKXMsIChDSEFSICopb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHMpLCBmdHBfc2NoZWQsCisjaWZkZWYgS1JCNTI0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfY3JlZC5zZXNzaW9uLAorI2Vsc2UgLyogS1JCNTI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnRwX2NyZWQuc2Vzc2lvbiwKKyNlbmRpZiAvKiBLUkI1MjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZteWN0bGFkZHIsICZoaXNjdGxhZGRyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgIGtyYl9ta19zYWZlKChDSEFSICopcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDSEFSICopb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHMpLAorI2lmZGVmIEtSQjUyNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwX2NyZWQuc2Vzc2lvbiwKKyNlbHNlIC8qIEtSQjUyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ0cF9jcmVkLnNlc3Npb24sCisjZW5kaWYgLyogS1JCNTI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXljdGxhZGRyLCAmaGlzY3RsYWRkcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGVuZ3RoID09IC0xKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJrcmJfbWtfJXMgZmFpbGVkIGZvciBLRVJCRVJPU19WNFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0cF9jcGwgPT0gRlBMX1BSViA/ICJwcml2IiA6ICJzYWZlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogRlRQX0tSQjQgKi8KKyNpZmRlZiBGVFBfR1NTQVBJCisgICAgICAgIC8qIFNjb21tYW5kIChiYXNlZCBvbiBsZXZlbCkgKi8KKyAgICAgICAgaWYgKGNrX2dzc2FwaV9pc19pbnN0YWxsZWQoKSAmJiAoc3RyY21wKGF1dGhfdHlwZSwgIkdTU0FQSSIpID09IDApKSB7CisgICAgICAgICAgICBnc3NfYnVmZmVyX2Rlc2MgaW5fYnVmLCBvdXRfYnVmOworICAgICAgICAgICAgT01fdWludDMyIG1hal9zdGF0LCBtaW5fc3RhdDsKKyAgICAgICAgICAgIGludCBjb25mX3N0YXRlOworICAgICAgICAgICAgaW5fYnVmLnZhbHVlID0gczsKKyAgICAgICAgICAgIGluX2J1Zi5sZW5ndGggPSBzdHJsZW4ocykgKyAxOworICAgICAgICAgICAgbWFqX3N0YXQgPSBnc3Nfc2VhbCgmbWluX3N0YXQsIGdjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnRwX2NwbD09RlBMX1BSViksIC8qIHByaXZhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NTX0NfUU9QX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbl9idWYsICZjb25mX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0X2J1Zik7CisgICAgICAgICAgICBpZiAobWFqX3N0YXQgIT0gR1NTX1NfQ09NUExFVEUpIHsgLyogR2VuZXJhbGx5IG5lZWQgdG8gZGVhbCAqLworICAgICAgICAgICAgICAgIHVzZXJfZ3NzX2Vycm9yKG1hal9zdGF0LCBtaW5fc3RhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnRwX2NwbD09RlBMX1BSVik/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdzc19zZWFsIEVOQyBkaWRuJ3QgY29tcGxldGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnc3Nfc2VhbCBNSUMgZGlkbid0IGNvbXBsZXRlIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChmdHBfY3BsID09IEZQTF9QUlYpICYmICFjb25mX3N0YXRlKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJHU1NBUEkgZGlkbid0IGVuY3J5cHQgbWVzc2FnZSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZnRwX2RlYikKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2VhbGVkICglcykgJWQgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cF9jcGw9PUZQTF9QUlY/IkVOQyI6Ik1JQyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9idWYubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkob3V0LCBvdXRfYnVmLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg9b3V0X2J1Zi5sZW5ndGgpOworICAgICAgICAgICAgICAgIGdzc19yZWxlYXNlX2J1ZmZlcigmbWluX3N0YXQsICZvdXRfYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIEZUUF9HU1NBUEkgKi8KKyAgICAgICAgLyogT3RoZXIgYXV0aCB0eXBlcyBnbyBoZXJlIC4uLiAqLworCisgICAgICAgIGxlbjIgPSBGVFBfQlVGU0laOworICAgICAgICBpZiAoKGtlcnJvciA9IHJhZGl4X2VuY29kZSgoQ0hBUiAqKW91dCwgKENIQVIgKilpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCAmbGVuMiwgUkFESVhfRU5DT0RFKSkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkNvdWxkbid0IGJhc2UgNjQgZW5jb2RlIGNvbW1hbmQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcmFkaXhfZXJyb3Ioa2Vycm9yKSk7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZ0cF9kZWIpCisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzY29tbWFuZCglcylcbmVuY29kaW5nICVkIGJ5dGVzXG4iLCBzLCBsZW5ndGgpOworICAgICAgICBsZW4yID0gY2ttYWttc2cob3V0LAorCQkJRlRQX0JVRlNJWiwKKwkJCWZ0cF9jcGwgPT0gRlBMX1BSViA/ICJFTkMgIiA6ICJNSUMgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluLAorCQkJIlxyXG4iLAorCQkJTlVMTAorCQkJKTsKKyAgICAgICAgc2VuZChjc29ja2V0LChTRU5EQVJHMlRZUEUpb3V0LGxlbjIsMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciBvdXRbRlRQX0JVRlNJWl07CisgICAgICAgIGludCBsZW4gPSBja21ha21zZyhvdXQsRlRQX0JVRlNJWixzLCJcclxuIixOVUxMLE5VTEwpOworICAgICAgICBzZW5kKGNzb2NrZXQsKFNFTkRBUkcyVFlQRSlvdXQsbGVuLDApOworICAgIH0KKyAgICByZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK215Z2V0YygpIHsKKyAgICBzdGF0aWMgY2hhciBpbmJ1Zls0MDk2XTsKKyAgICBzdGF0aWMgaW50IGJwID0gMCwgZXAgPSAwOworICAgIGludCByYzsKKworICAgIGlmIChicCA9PSBlcCkgeworICAgICAgICBicCA9IGVwID0gMDsKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgaWYgKHNzbF9mdHBfYWN0aXZlX2ZsYWcpIHsKKyAgICAgICAgICAgIGludCBlcnJvcjsKKyAgICAgICAgICAgIHJjID0gU1NMX3JlYWQoc3NsX2Z0cF9jb24saW5idWYsNDA5Nik7CisgICAgICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsX2Z0cF9jb24scmMpOworICAgICAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgICAgIGlmIChyYyA9PSAwKSB7ICAgICAgICAgIC8qIEVPRiAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworI2lmZGVmIE5UCisgICAgICAgICAgICAgICAgICAgIGludCBnbGUgPSBHZXRMYXN0RXJyb3IoKTsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisgICAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NTTDoKKyAgICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgIHJjID0gcmVjdihjc29ja2V0LChjaGFyICopaW5idWYsNDA5NiwwKTsKKyAgICAgICAgaWYgKHJjIDw9IDApCisgICAgICAgICAgcmV0dXJuKEVPRik7CisgICAgICAgIGVwID0gcmM7CisgICAgfQorICAgIHJldHVybihpbmJ1ZlticCsrXSk7Cit9CisKKy8qICB4IGwgYSB0IGUgYyAgLS0gIFRyYW5zbGF0ZSBhIGNoYXJhY3RlciAgKi8KKy8qCisgICAgQ2FsbCB3aXRoOgorICAgICAgZmMgICAgPSBGdW5jdGlvbiBjb2RlOiAwID0gdHJhbnNsYXRlLCAxID0gaW5pdGlhbGl6ZS4KKyAgICAgIGMgICAgID0gQ2hhcmFjdGVyIChhcyBpbnQpLgorICAgICAgaW5jcyAgPSBJbmRleCBvZiBjaGFyc2V0IHRvIHRyYW5zbGF0ZSBmcm9tLgorICAgICAgb3V0Y3MgPSBJbmRleCBvZiBjaGFyc2V0IHRvIHRyYW5zbGF0ZSB0by4KKworICAgIFJldHVybnM6CisgICAgICAwOiBPSworICAgICAtMTogRXJyb3IKKyovCitzdGF0aWMgaW50Cit4bGF0ZWMoZmMsYyxpbmNzLG91dGNzKSBpbnQgZmMsIGMsIGluY3MsIG91dGNzOyB7CisjaWZkZWYgTk9DU0VUUworICAgIHJldHVybihjKTsKKyNlbHNlCisgICAgc3RhdGljIGNoYXIgYnVmWzEyOF07CisgICAgc3RhdGljIGludCBjeDsKKyAgICBpbnQgYzAsIGMxOworCisgICAgaWYgKGZjID09IDEpIHsgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSAqLworICAgICAgICBjeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhdGNoLXVwIGJ1ZmZlciB3cml0ZSBpbmRleCAqLworICAgICAgICB4Z25icCA9IGJ1ZjsgICAgICAgICAgICAgICAgICAgIC8qIENhdGNoLXVwIGJ1ZmZlciByZWFkIHBvaW50ZXIgKi8KKyAgICAgICAgYnVmWzBdID0gTlVMOyAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgaXMgZW1wdHkgKi8KKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBpZiAoY3ggPj0gMTI3KSB7ICAgICAgICAgICAgICAgICAgICAvKiBDYXRjaC11cCBidWZmZXIgZnVsbCAqLworICAgICAgICBkZWJ1ZyhGMTAwLCJ4bGF0ZWMgb3ZlcmZsb3ciLCIiLDApOyAvKiAoc2hvdWxkbid0IGhhcHBlbikgKi8KKyAgICAgICAgcHJpbnRmKCI/VHJhbnNsYXRpb24gYnVmZmVyIG92ZXJmbG93XG4iKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgLyogQWRkIGNoYXIgdG8gYnVmZmVyLiAqLworICAgIC8qIFRoZSBidWZmZXIgd29uJ3QgZ3JvdyB1bmxlc3MgaW5jcyBpcyBhIG11bHRpYnl0ZSBzZXQsIGUuZy4gVVRGLTguICovCisKKyAgICBkZWJ1ZyhGMDAwLCJ4bGF0ZWMgYnVmIixja2l0b2EoY3gpLGMpOworICAgIGJ1ZltjeCsrXSA9IGM7CisgICAgYnVmW2N4XSA9IE5VTDsKKworICAgIHdoaWxlICgoYzAgPSB4Z25ieXRlKEZDX1VDUzIsaW5jcyxzdHJnZXRjKSkgPiAtMSkgeworICAgICAgICBpZiAoeHBuYnl0ZShjMCxUQ19VQ1MyLG91dGNzLE5VTEwpIDwgMCkJLyogKE5VTEwgd2FzIHhwcmludGMpICovCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgLyogSWYgd2UncmUgY2F1Z2h0IHVwLCByZWluaXRpYWxpemUgdGhlIGJ1ZmZlciAqLworICAgIHJldHVybigoY3ggPT0gKHhnbmJwIC0gYnVmKSkgPyB4bGF0ZWMoMSwwLDAsMCkgOiAwKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCit9CisKKworLyogIHAgYSByIHMgZSBmIGUgYSB0ICAqLworCisvKiBOb3RlOiBmb3IgY29udmVuaWVuY2Ugd2UgYWxpZ24ga2V5d29yZCB2YWx1ZXMgd2l0aCB0YWJsZSBpbmRpY2VzICovCisvKiBJZiB5b3UgbmVlZCB0byBpbnNlcnQgYSBuZXcga2V5d29yZCwgYWRqdXN0IHRoZSBTRlRfeHh4IGRlZmluaXRpb25zICovCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGZlYXR0YWJbXSA9IHsKKyAgICB7ICIkJCQkIiwgMCwgICAgICAgIDAgfSwJCS8qIER1bW15IGZvciBzZnR0YWJbMF0gKi8KKyAgICB7ICJBVVRIIiwgU0ZUX0FVVEgsIDAgfSwKKyAgICB7ICJMQU5HIiwgU0ZUX0xBTkcsIDAgfSwKKyAgICB7ICJNRFRNIiwgU0ZUX01EVE0sIDAgfSwKKyAgICB7ICJNTFNUIiwgU0ZUX01MU1QsIDAgfSwKKyAgICB7ICJQQlNaIiwgU0ZUX1BCU1osIDAgfSwKKyAgICB7ICJQUk9UIiwgU0ZUX1BST1QsIDAgfSwKKyAgICB7ICJSRVNUIiwgU0ZUX1JFU1QsIDAgfSwKKyAgICB7ICJTSVpFIiwgU0ZUX1NJWkUsIDAgfSwKKyAgICB7ICJUVkZTIiwgU0ZUX1RWRlMsIDAgfSwKKyAgICB7ICJVVEY4IiwgU0ZUX1VURjgsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmZlYXR0YWIgPSAoc2l6ZW9mKGZlYXR0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2RlZmluZSBGQUNUX0NTRVQgIDEKKyNkZWZpbmUgRkFDVF9DUkVBICAyCisjZGVmaW5lIEZBQ1RfTEFORyAgMworI2RlZmluZSBGQUNUX01UWVAgIDQKKyNkZWZpbmUgRkFDVF9NRFRNICA1CisjZGVmaW5lIEZBQ1RfUEVSTSAgNgorI2RlZmluZSBGQUNUX1NJWkUgIDcKKyNkZWZpbmUgRkFDVF9UWVBFICA4CisjZGVmaW5lIEZBQ1RfVU5JUSAgOQorCitzdGF0aWMgc3RydWN0IGtleXRhYiBmYWN0dGFiW10gPSB7CisgICAgeyAiQ0hBUlNFVCIsICAgIEZBQ1RfQ1NFVCwgMCB9LAorICAgIHsgIkNSRUFURSIsICAgICBGQUNUX0NSRUEsIDAgfSwKKyAgICB7ICJMQU5HIiwgICAgICAgRkFDVF9MQU5HLCAwIH0sCisgICAgeyAiTUVESUEtVFlQRSIsIEZBQ1RfTVRZUCwgMCB9LAorICAgIHsgIk1PRElGWSIsICAgICBGQUNUX01EVE0sIDAgfSwKKyAgICB7ICJQRVJNIiwgICAgICAgRkFDVF9QRVJNLCAwIH0sCisgICAgeyAiU0laRSIsICAgICAgIEZBQ1RfU0laRSwgMCB9LAorICAgIHsgIlRZUEUiLCAgICAgICBGQUNUX1RZUEUsIDAgfSwKKyAgICB7ICJVTklRVUUiLCAgICAgRkFDVF9VTklRLCAwIH0KK307CitzdGF0aWMgaW50IG5mYWN0dGFiID0gKHNpemVvZihmYWN0dGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGZ0eXB0YWJbXSA9IHsKKyAgICB7ICJDRElSIiwgRlRZUF9DRElSLCAwIH0sCisgICAgeyAiRElSIiwgIEZUWVBfRElSLCAgMCB9LAorICAgIHsgIkZJTEUiLCBGVFlQX0ZJTEUsIDAgfSwKKyAgICB7ICJQRElSIiwgRlRZUF9QRElSLCAwIH0KK307CitzdGF0aWMgaW50IG5mdHlwdGFiID0gKHNpemVvZihmdHlwdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0YXRpYyBWT0lECitwYXJzZWZlYXQocykgY2hhciAqIHM7IHsJCS8qIFBhcnNlIGEgRkVBVFVSRSByZXNwb25zZSAqLworICAgIGNoYXIga3didWZbOF07CisgICAgaW50IGksIHg7CisgICAgaWYgKCFzKSByZXR1cm47CisgICAgaWYgKCEqcykgcmV0dXJuOworICAgIHdoaWxlICgqcyA8ICchJykKKyAgICAgIHMrKzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJaWYgKHNbaV0gPCAnIScpCisJICBicmVhazsKKwlrd2J1ZltpXSA9IHNbaV07CisgICAgfQorICAgIGlmIChzW2ldICYmIHNbaV0gIT0gU1ApCisgICAgICByZXR1cm47CisgICAga3didWZbaV0gPSBOVUw7CisgICAgLyogeGxvb2t1cCByZXF1aXJlcyBhIGZ1bGwgKGJ1dCBjYXNlIGluZGVwZW5kZW50KSBtYXRjaCAqLworICAgIGkgPSB4bG9va3VwKGZlYXR0YWIsa3didWYsbmZlYXR0YWIsJngpOworICAgIGRlYnVnKEYxMTEsImZ0cCBwYXJzZWZlYXQiLHMsaSk7CisgICAgaWYgKGkgPCAwIHx8IGkgPiAxNSkKKyAgICAgIHJldHVybjsKKworICAgIHN3aXRjaCAoaSkgeworICAgICAgY2FzZSBTRlRfTURUTToJCQkvKiBDb250cm9sbGVkIGJ5IEVOQUJMRS9ESVNBQkxFICovCisJc2Z0dGFiW2ldID0gbWR0bW9rOworCWlmIChtZHRtb2spIHNmdHRhYlswXSsrOworCWJyZWFrOworICAgICAgY2FzZSBTRlRfTUxTVDoJCQkvKiBkaXR0byAqLworCXNmdHRhYltpXSA9IG1sc3RvazsKKwlpZiAobWxzdG9rKSBzZnR0YWJbMF0rKzsKKwlicmVhazsKKyAgICAgIGNhc2UgU0ZUX1NJWkU6CQkJLyogZGl0dG8gKi8KKwlzZnR0YWJbaV0gPSBzaXplb2s7CisJaWYgKHNpemVvaykgc2Z0dGFiWzBdKys7CisJYnJlYWs7CisgICAgICBjYXNlIFNGVF9BVVRIOgkJCS8qIGRpdHRvICovCisJc2Z0dGFiW2ldID0gZnRwX2F1dDsKKwlpZiAoZnRwX2F1dCkgc2Z0dGFiWzBdKys7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgkJCQkvKiBPdGhlcnMgKi8KKwlzZnR0YWJbMF0rKzsKKwlzZnR0YWJbaV0rKzsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICoKK3BhcnNlZmFjdHMocykgY2hhciAqIHM7IHsJCS8qIFBhcnNlIE1MU1tEVF0gRmlsZSBGYWN0cyAqLworICAgIGNoYXIgKiBwOworICAgIGludCBpLCBqLCB4OworICAgIGlmICghcykgcmV0dXJuKE5VTEwpOworICAgIGlmICghKnMpIHJldHVybihOVUxMKTsKKworICAgIC8qIE1heWJlIHdlIHNob3VsZCBtYWtlIGEgY29weSBvZiBzIHNvIHdlIGNhbiBwb2tlIGl0Li4uICovCisKKyAgICB3aGlsZSAoKHAgPSBja3N0cmNocihzLCc9JykpKSB7CisJKnAgPSBOVUw7CQkJLyogcyBwb2ludHMgdG8gZmFjdCAqLworCWkgPSB4bG9va3VwKGZhY3R0YWIscyxuZmFjdHRhYiwmeCk7IAorCWRlYnVnKEYxMTEsImZ0cCBwYXJzZWZhY3QgZmFjdCIscyxpKTsKKwkqcCA9ICc9JzsKKwlzID0gcCsxOwkJCS8qIE5vdyBzIHBvaW50cyB0byBhcmcgKi8KKwlwID0gY2tzdHJjaHIocywnOycpOworICAgICAgICBpZiAoIXApCisJICBwID0gY2tzdHJjaHIocyxTUCk7CisJaWYgKCFwKSB7CisJICAgIGRlYnVnKEYxMTAsImZ0cCBwYXJzZWZhY3QgZW5kLW9mLXZhbCBzZWFyY2ggZmFpbCIscywwKTsKKwkgICAgYnJlYWs7CisJfQorCSpwID0gTlVMOworCWRlYnVnKEYxMTAsImZ0cCBwYXJzZWZhY3QgdmFsdSIscywwKTsKKwlzd2l0Y2ggKGkpIHsKKwkgIGNhc2UgRkFDVF9DU0VUOgkJLyogSWdub3JlIHRoZXNlIGZvciBub3cgKi8KKwkgIGNhc2UgRkFDVF9DUkVBOgorCSAgY2FzZSBGQUNUX0xBTkc6CisJICBjYXNlIEZBQ1RfUEVSTToKKwkgIGNhc2UgRkFDVF9NVFlQOgorCSAgY2FzZSBGQUNUX1VOSVE6CisJICAgIGJyZWFrOworCSAgY2FzZSBGQUNUX01EVE06CQkvKiBNb2R0aW1lICovCisJICAgIG1ha2VzdHIoJmhhdmVtZHRtLHMpOworCSAgICBkZWJ1ZyhGMTEwLCJmdHAgcGFyc2VmYWN0IG1kdG0iLGhhdmVtZHRtLDApOworCSAgICBicmVhazsKKwkgIGNhc2UgRkFDVF9TSVpFOgkJLyogU2l6ZSAqLworCSAgICBoYXZlc2l6ZSA9IGF0b2wocyk7CisJICAgIGRlYnVnKEYxMDEsImZ0cCBwYXJzZWZhY3Qgc2l6ZSIsIiIsaGF2ZXNpemUpOworCSAgICBicmVhazsKKwkgIGNhc2UgRkFDVF9UWVBFOgkJLyogVHlwZSAqLworCSAgICBqID0geGxvb2t1cChmdHlwdGFiLHMsbmZ0eXB0YWIsTlVMTCk7CisJICAgIGRlYnVnKEYxMTEsImZ0cCBwYXJzZWZhY3QgdHlwZSIscyxqKTsKKwkgICAgaGF2ZXR5cGUgPSAoaiA8IDEpID8gMCA6IGo7CisJICAgIGJyZWFrOworCX0KKwkqcCA9ICc7JzsKKwlzID0gcCsxOwkJCS8qIHMgcG9pbnRzIG5leHQgZmFjdCBvciBuYW1lICovCisgICAgfQorICAgIHdoaWxlICgqcyA9PSBTUCkJCQkvKiBTa2lwIHBhc3Qgc3BhY2VzLiAqLworICAgICAgcysrOworICAgIGlmICghKnMpCQkJCS8qIE1ha2Ugc3VyZSB3ZSBzdGlsbCBoYXZlIGEgbmFtZSAqLworICAgICAgcyA9IE5VTEw7CisgICAgZGVidWcoRjExMCwiZnRwIHBhcnNlZmFjdCBuYW1lIixzLDApOworICAgIHJldHVybihzKTsKK30KKworLyogIGcgZSB0IHIgZSBwIGwgeSAgLS0gICh0byBhbiBGVFAgY29tbWFuZCBzZW50IHRvIHNlcnZlcikgICovCisKKy8qIHZibSA9IDEgKHZlcmJvc2UpOyAwIChxdWlldCBleGNlcHQgZm9yIGVycm9yIG1lc3NhZ2VzKTsgOSAoc3VwZXIgcXVpZXQpICovCisKK3N0YXRpYyBpbnQKK2dldHJlcGx5KGV4cGVjdGVvZixsY3MscmNzLHZibSxmYykgaW50IGV4cGVjdGVvZiwgbGNzLCByY3MsIHZibSwgZmM7IHsKKyAgICAvKiBsY3MsIHJjcywgdmJtIHBhcmFtZXRlcnMgYXMgaW4gZnRwY21kKCkgKi8KKyAgICByZWdpc3RlciBpbnQgaSwgYywgbjsKKyAgICByZWdpc3RlciBpbnQgZGlnOworICAgIHJlZ2lzdGVyIGNoYXIgKmNwOworICAgIGludCB4bGF0ZSA9IDA7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBpbnQgYXV0aCA9IDA7CisgICAgaW50IG9yaWdpbmFsY29kZSA9IDAsIGNvbnRpbnVhdGlvbiA9IDA7CisgICAgc2lnX3Qgb2xkaW50cjsKKyAgICBpbnQgcGZsYWcgPSAwOworICAgIGNoYXIgKnB0ID0gcGFzdjsKKyAgICBjaGFyIGlidWZbRlRQX0JVRlNJWl0sIG9idWZbRlRQX0JVRlNJWl07IC8qICh0aGVzZSBhcmUgcHJldHR5IGJpZy4uLikgKi8KKyAgICBpbnQgc2FmZSA9IDA7CisgICAgaW50IHhxdWlldCA9IDA7CisKKyAgICBhdXRoID0gKGZjID09IEdSRl9BVVRIKTsKKworI2lmbmRlZiBOT0NTRVRTCisgICAgZGVidWcoRjEwMSwiZnRwIGdldHJlcGx5IGxjcyIsIiIsbGNzKTsKKyAgICBkZWJ1ZyhGMTAxLCJmdHAgZ2V0cmVwbHkgcmNzIiwiIixyY3MpOworICAgIGlmIChsY3MgPiAtMSAmJiByY3MgPiAtMSAmJiBsY3MgIT0gcmNzKSB7CisgICAgICAgIHhsYXRlID0gMTsKKyAgICAgICAgaW5pdHhsYXRlKHJjcyxsY3MpOworICAgICAgICB4bGF0ZWMoMSwwLHJjcyxsY3MpOworICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgZGVidWcoRjEwMSwiZnRwIGdldHJlcGx5IGZjIiwiIixmYyk7CisKKyAgICBpZiAocXVpZXQpCisgICAgICB4cXVpZXQgPSAxOworICAgIGlmICh2Ym0gPT0gOSkgeworICAgICAgICB4cXVpZXQgPSAxOworICAgICAgICB2Ym0gPSAwOworICAgIH0KKyAgICBpZiAoZnRwX2RlYikgICAgICAgICAgICAgICAgICAgICAgICAvKiBERUJVRyAqLworICAgICAgdmJtID0gMTsKKyAgICBlbHNlIGlmIChxdWlldCB8fCBkcHlhY3RpdmUpICAgICAgICAvKiBRVUlFVCBvciBGaWxlIFRyYW5zZmVyIEFjdGl2ZSAqLworICAgICAgdmJtID0gMDsKKyAgICBlbHNlIGlmICh2Ym0gPCAwKSAgICAgICAgICAgICAgICAgICAvKiBWRVJCT1NFICovCisgICAgICB2Ym0gPSBmdHBfdmJtOworCisgICAgaWJ1ZlswXSA9ICdcMCc7CisgICAgaWYgKHJlcGx5X3BhcnNlKQorICAgICAgcmVwbHlfcHRyID0gcmVwbHlfYnVmOworICAgIGhhdmVzaWdpbnQgPSAwOworICAgIG9sZGludHIgPSBzaWduYWwoU0lHSU5ULCBjbWRjYW5jZWwpOworICAgIGZvciAoY291bnQgPSAwOzsgY291bnQrKykgeworICAgICAgICBvYnVmWzBdID0gJ1wwJzsKKyAgICAgICAgZGlnID0gbiA9IGZ0cGNvZGUgPSBpID0gMDsKKyAgICAgICAgY3AgPSBmdHBfcmVwbHlfc3RyOworICAgICAgICB3aGlsZSAoKGMgPSBpYnVmWzBdID8gaWJ1ZltpKytdIDogbXlnZXRjKCkpICE9ICdcbicpIHsKKyAgICAgICAgICAgIGlmIChjID09IElBQykgeyAgICAgICAgICAgICAvKiBIYW5kbGUgdGVsbmV0IGNvbW1hbmRzICovCisgICAgICAgICAgICAgICAgc3dpdGNoIChjID0gbXlnZXRjKCkpIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgV0lMTDoKKyAgICAgICAgICAgICAgICAgIGNhc2UgV09OVDoKKyAgICAgICAgICAgICAgICAgICAgYyA9IG15Z2V0YygpOworICAgICAgICAgICAgICAgICAgICBvYnVmWzBdID0gSUFDOworICAgICAgICAgICAgICAgICAgICBvYnVmWzFdID0gRE9OVDsKKyAgICAgICAgICAgICAgICAgICAgb2J1ZlsyXSA9IGM7CisgICAgICAgICAgICAgICAgICAgIG9idWZbM10gPSBOVUw7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICAgICAgICAgIGlmIChzc2xfZnRwX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IsIHJjOworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBTU0xfd3JpdGUoc3NsX2Z0cF9jb24sb2J1ZiwzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfZnRwX2NvbixyYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX05PTkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjID09IDApIHsgLyogRU9GICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdsZSA9IEdldExhc3RFcnJvcigpOworI2VuZGlmIC8qIE5UICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1NMOgorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgICAgICAgICAgc2VuZChjc29ja2V0LChTRU5EQVJHMlRZUEUpb2J1ZiwzLDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgRE86CisgICAgICAgICAgICAgICAgICBjYXNlIERPTlQ6CisgICAgICAgICAgICAgICAgICAgIGMgPSBteWdldGMoKTsKKyAgICAgICAgICAgICAgICAgICAgb2J1ZlswXSA9IElBQzsKKyAgICAgICAgICAgICAgICAgICAgb2J1ZlsxXSA9IFdPTlQ7CisgICAgICAgICAgICAgICAgICAgIG9idWZbMl0gPSBjOworICAgICAgICAgICAgICAgICAgICBvYnVmWzNdID0gTlVMOworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICAgICAgICBpZiAoc3NsX2Z0cF9hY3RpdmVfZmxhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yLCByYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gU1NMX3dyaXRlKHNzbF9mdHBfY29uLG9idWYsMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsX2Z0cF9jb24scmMpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9OT05FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwoU0lHSU5ULG9sZGludHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYyA9PSAwKSB7IC8qIEVPRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworI2lmZGVmIE5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnbGUgPSBHZXRMYXN0RXJyb3IoKTsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NTTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICAgICAgICAgIHNlbmQoY3NvY2tldCwoU0VOREFSRzJUWVBFKW9idWYsMywwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaWcrKzsKKyAgICAgICAgICAgIGlmIChjID09IEVPRikgeworICAgICAgICAgICAgICAgIGlmIChleHBlY3Rlb2YpIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmFsKFNJR0lOVCxvbGRpbnRyKTsKKyAgICAgICAgICAgICAgICAgICAgZnRwY29kZSA9IDIyMTsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiZnRwIGdldHJlcGx5IEVPRiIsIiIsZnRwY29kZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9zdHBlZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXhxdWlldCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnRwX2RlYikKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjQyMSAiKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5vdCBhdmFpbGFibGUsIGNvbm5lY3Rpb24gY2xvc2VkIGJ5IHNlcnZlclxuIik7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaWduYWwoU0lHSU5ULG9sZGludHIpOworICAgICAgICAgICAgICAgIGZ0cGNvZGUgPSA0MjE7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiZnRwIGdldHJlcGx5IEVPRiIsIiIsZnRwY29kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuKDQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPT0gMCkgewkJLyogRmlyc3QgZGlnaXQgKi8KKwkJbiA9IGM7CQkJLyogU2F2ZSBpdCAqLworCSAgICB9CisgICAgICAgICAgICBpZiAoYXV0aF90eXBlICYmCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICAgICAgIXNzbF9mdHBfYWN0aXZlX2ZsYWcgJiYKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICAhaWJ1ZlswXSAmJiAobiA9PSAnNicgfHwgY29udGludWF0aW9uKSkgeworICAgICAgICAgICAgICAgIGlmIChjICE9ICdccicgJiYgZGlnID4gNCkKKyAgICAgICAgICAgICAgICAgIG9idWZbaSsrXSA9IGM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhdXRoX3R5cGUgJiYKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAgICAgIXNzbF9mdHBfYWN0aXZlX2ZsYWcgJiYKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICAgICAgIWlidWZbMF0gJiYgZGlnID09IDEgJiYgdmJtKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCJVbmF1dGhlbnRpY2F0ZWQgcmVwbHkgcmVjZWl2ZWQgZnJvbSBzZXJ2ZXI6XG4iKTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbHlfcGFyc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgKnJlcGx5X3B0cisrID0gYzsKKyAgICAgICAgICAgICAgICAgICAgKnJlcGx5X3B0ciA9IE5VTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCghZHB5YWN0aXZlIHx8IGZ0cF9kZWIpICYmIC8qIERvbid0IG1lc3MgdXAgeGZlciBkaXNwbGF5ICovCisgICAgICAgICAgICAgICAgICAgIGZ0cF9jbWRsaW4gPCAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYyAhPSAnXHInKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGZ0cF9kZWIgfHwgKCh2Ym0gfHwgKCFhdXRoICYmIG4gPT0gJzUnKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChkaWcgPiA0IHx8ICggZGlnIDw9IDQgJiYgIWlzZGlnaXQoYykgJiYgZnRwY29kZSA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICApKSkpKQorICAgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgRlRQX1BST1hZCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnRwX3ByeCAmJiAoZGlnID09IDEgfHwgKGRpZyA9PSA1ICYmIHZibSA9PSAwKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IixmdHBfaG9zdCk7CisjZW5kaWYgLyogRlRQX1BST1hZICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgheHF1aWV0KSB7CisjaWZkZWYgTk9DU0VUUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJWMiLGMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGxhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGxhdGVjKDAsYyxyY3MsbGNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVjIixjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF1dGhfdHlwZSAmJgorI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICAgICFzc2xfZnRwX2FjdGl2ZV9mbGFnICYmCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgICAgIWlidWZbMF0gJiYgbiAhPSAnNicpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGRpZyA8IDQgJiYgaXNkaWdpdChjKSkKKyAgICAgICAgICAgICAgZnRwY29kZSA9IGZ0cGNvZGUgKiAxMCArIChjIC0gJzAnKTsKKyAgICAgICAgICAgIGlmICghcGZsYWcgJiYgZnRwY29kZSA9PSAyMjcpCisgICAgICAgICAgICAgIHBmbGFnID0gMTsKKyAgICAgICAgICAgIGlmIChkaWcgPiA0ICYmIHBmbGFnID09IDEgJiYgaXNkaWdpdChjKSkKKyAgICAgICAgICAgICAgcGZsYWcgPSAyOworICAgICAgICAgICAgaWYgKHBmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSAnXHInICYmIGMgIT0gJyknKQorICAgICAgICAgICAgICAgICAgKnB0KysgPSBjOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAqcHQgPSAnXDAnOworICAgICAgICAgICAgICAgICAgICBwZmxhZyA9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRpZyA9PSA0ICYmIGMgPT0gJy0nICYmIG4gIT0gJzYnKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRpbnVhdGlvbikKKyAgICAgICAgICAgICAgICAgIGZ0cGNvZGUgPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNwIDwgJmZ0cF9yZXBseV9zdHJbRlRQX0JVRlNJWiAtIDFdKSB7CisgICAgICAgICAgICAgICAgKmNwKysgPSBjOworICAgICAgICAgICAgICAgICpjcCA9IE5VTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVibG9nIHx8CisjaWZkZWYgQ09NTUVOVAorLyoKKyAgU29tZXRpbWVzIHdlIG5lZWQgdG8gcHJpbnQgdGhlIHNlcnZlciByZXBseS4gIHByaW50bGluZXMgaXMgbm9uemVybyBmb3IgYW55CisgIGNvbW1hbmQgd2hlcmUgdGhlIHJlc3VsdHMgYXJlIHNlbnQgYmFjayBvbiB0aGUgY29udHJvbCBjb25uZWN0aW9uIHJhdGhlcgorICB0aGFuIHRoZSBkYXRhIGNvbm5lY3Rpb24sIGUuZy4gU1RBVC4gIEluIHRoZSBUT1BTLTIwIGNhc2UsIGVhY2ggZmlsZSBsaW5lCisgIGhhcyBmdHBjb2RlIDIxMy4gIEJ1dCBpZiB5b3UgZG8gdGhpcyB3aXRoIGEgVU5JWCBzZXJ2ZXIsIGl0IHNlbmRzICIyMTMtU3RhcnQKKyAgU1RBVCIsIDxsaW5lIHdpdGggZnRwY29kZSA9PSAwPiwgIjIxMy1FbmQiIG9yIHNvbWVzdWNoLiAgU28gd2hlbiBwcmludGxpbmVzCisgIGlzIG5vbnplcm8sIHdlIHdhbnQgdGhlIDIxMyBsaW5lcyBmcm9tIFRPUFMtMjAgYW5kIHdlIERPTidUIHdhbnQgdGhlIDIxMworICBsaW5lcyBmcm9tIFVOSVguICBGdXJ0aGVyIGV4cGVyaW1lbnRhdGlvbiBuZWVkZWQgd2l0aCBvdGhlciBzZXJ2ZXJzLiAgT2YKKyAgY291cnNlIFJGQzk1OSBpcyBtdXRlIGFzIHRvIHRoZSBmb3JtYXQgb2YgdGhlIHNlcnZlciByZXBseS4KKworICAncHJpbnRsaW5lcycgaXMgYWxzbyB0cnVlIGZvciBQV0QgYW5kIEJZRS4KKyovCisJICAgIChwcmludGxpbmVzICYmICgoZnRwY29kZSA9PSAwKSB8fCAoc2VydmVydHlwZSA9PSBTWVNfVE9QUzIwKSkpCisjZWxzZQorLyogTm8sIHdlIGNhbid0IGJlIHRoYXQgY2xldmVyIC0tIGl0IGJyZWFrcyBvdGhlciB0aGluZ3MgbGlrZSBSUFdELi4uICovCisgICAgICAgICAgICAocHJpbnRsaW5lcyAmJgorICAgICAgICAgICAgIChmdHBjb2RlICE9IDYzMSAmJiBmdHBjb2RlICE9IDYzMiAmJiBmdHBjb2RlICE9IDYzMykpCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBjaGFyICogcSA9IGNwOworICAgICAgICAgICAgY2hhciAqciA9IGZ0cF9yZXBseV9zdHI7CisgICAgICAgICAgICAqcS0tID0gTlVMOyAgICAgICAgICAgICAgICAgLyogTlVMLXRlcm1pbmF0ZSAqLworICAgICAgICAgICAgd2hpbGUgKCpxIDwgJyEnICYmIHEgPiByKSAgIC8qIFN0cmlwIENSLCBldGMgKi8KKyAgICAgICAgICAgICAgKnEtLSA9IE5VTDsKKyAgICAgICAgICAgIGlmICghZnRwX2RlYiAmJiBwcmludGxpbmVzKSB7IC8qIElmIHByaW50aW5nICovCisgICAgICAgICAgICAgICAgaWYgKGZ0cGNvZGUgIT0gMCkgICAgICAgLyogc3RyaXAgZnRwY29kZSBpZiBhbnkgKi8KKyAgICAgICAgICAgICAgICAgIHIgKz0gNDsKKyNpZmRlZiBOT0NTRVRTCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlc1xuIixyKTsgICAgICAgLyogYW5kIHByaW50ICovCisjZWxzZQorICAgICAgICAgICAgICAgIGlmICgheGxhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlc1xuIixyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgewkJLyogVHJhbnNsYXRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgeGduYnAgPSByOwkJLyogU2V0IHVwIHN0cmdldGMoKSAqLworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGMwID0geGduYnl0ZShGQ19VQ1MyLHJjcyxzdHJnZXRjKSkgPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhwbmJ5dGUoYzAsVENfVUNTMixsY3MsTlVMTCkgPCAwKSB7CS8qICh4cHJpbnRjKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbChTSUdJTlQsb2xkaW50cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCWRlYnVnKEYxMTAsIkZUUCBSQ1ZEICIsZnRwX3JlcGx5X3N0ciwwKTsKKworCWlmIChmYyA9PSBHUkZfRkVBVCkgewkJLyogUGFyc2luZyBGRUFUIGNvbW1hbmQgcmVzcG9uc2U/ICovCisJICAgIGlmIChjb3VudCA9PSAwICYmIG4gPT0gJzInKSB7CisJCWludCBpOwkJCS8qIChSZSktaW5pdCBzZXJ2ZXIgRkVBVHVyZSB0YWJsZSAqLworCQlkZWJ1ZyhGMTAwLCJmdHAgZ2V0cmVwbHkgY2xlYXJpbmcgZmVhdHVyZSB0YWJsZSIsIiIsMCk7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkgIHNmdHRhYltpXSA9IDA7CisJICAgIH0gZWxzZSB7CisJCXBhcnNlZmVhdCgoY2hhciAqKWZ0cF9yZXBseV9zdHIpOworCSAgICB9CisJfQorICAgICAgICBpZiAoYXV0aF90eXBlICYmCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICAhc3NsX2Z0cF9hY3RpdmVfZmxhZyAmJgorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICFpYnVmWzBdICYmIG4gIT0gJzYnKSB7CisgICAgICAgICAgICBzaWduYWwoU0lHSU5ULG9sZGludHIpOworICAgICAgICAgICAgcmV0dXJuKGdldHJlcGx5KGV4cGVjdGVvZixsY3MscmNzLHZibSxhdXRoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWJ1ZlswXSA9IG9idWZbaV0gPSAnXDAnOworICAgICAgICBpZiAoZnRwY29kZSAmJiBuID09ICc2JykKKyAgICAgICAgICBpZiAoZnRwY29kZSAhPSA2MzEgJiYgZnRwY29kZSAhPSA2MzIgJiYgZnRwY29kZSAhPSA2MzMpIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCJVbmtub3duIHJlcGx5OiAlZCAlc1xuIiwgZnRwY29kZSwgb2J1Zik7CisgICAgICAgICAgICAgIG4gPSAnNSc7CisgICAgICAgICAgfSBlbHNlIHNhZmUgPSAoZnRwY29kZSA9PSA2MzEpOworICAgICAgICBpZiAob2J1ZlswXSAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZXJlIGlzIGEgc3RyaW5nIHRvIGRlY29kZSAqLworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgJiYgIXNzbF9mdHBfYWN0aXZlX2ZsYWcgICAgIC8qIGFuZCBub3QgU1NML1RMUyAqLworI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBpZiAoIWF1dGhfdHlwZSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiQ2Fubm90IGRlY29kZSByZXBseTpcbiVkICVzXG4iLCBmdHBjb2RlLCBvYnVmKTsKKyAgICAgICAgICAgICAgICBuID0gJzUnOworICAgICAgICAgICAgfQorI2lmbmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICBlbHNlIGlmIChmdHBjb2RlID09IDYzMikgeworICAgICAgICAgICAgICAgIHByaW50ZigiQ2Fubm90IGRlY3J5cHQgJWQgcmVwbHk6ICVzXG4iLCBmdHBjb2RlLCBvYnVmKTsKKyAgICAgICAgICAgICAgICBuID0gJzUnOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNpZmRlZiBOT0NPTkZJREVOVElBTAorICAgICAgICAgICAgZWxzZSBpZiAoZnRwY29kZSA9PSA2MzMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkNhbm5vdCBkZWNyeXB0ICVkIHJlcGx5OiAlc1xuIiwgZnRwY29kZSwgb2J1Zik7CisgICAgICAgICAgICAgICAgbiA9ICc1JzsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT0NPTkZJREVOVElBTCAqLworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IEZUUF9CVUZTSVo7CisgICAgICAgICAgICAgICAgaWYgKChrZXJyb3IgPSByYWRpeF9lbmNvZGUoKENIQVIgKilvYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDSEFSICopaWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFESVhfREVDT0RFKSkKKyAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ2FuJ3QgZGVjb2RlIGJhc2UgNjQgcmVwbHkgJWQgKCVzKVxuXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwY29kZSwgcmFkaXhfZXJyb3Ioa2Vycm9yKSwgb2J1Zik7CisgICAgICAgICAgICAgICAgICAgIG4gPSAnNSc7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIEZUUF9TUlAKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXV0aF90eXBlLCAiU1JQIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgb3V0bGVuOworICAgICAgICAgICAgICAgICAgICBvdXRsZW4gPSBzcnBfZGVjb2RlKCFzYWZlLCAoQ0hBUiAqKWlidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENIQVIgKikgaWJ1ZiwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dGxlbiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiV2FybmluZzogJWQgcmVwbHkgJXMhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cGNvZGUsIHNhZmUgPyAibW9kaWZpZWQiIDogImdhcmJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAnNSc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkoJmlidWZbb3V0bGVuXSwgIlxyXG4iLEZUUF9CVUZTSVotb3V0bGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdHBfZGViKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVjOiIsIHNhZmUgPyAnUycgOiAnUCcpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogRlRQX1NSUCAqLworI2lmZGVmIEZUUF9LUkI0CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGF1dGhfdHlwZSwgIktFUkJFUk9TX1Y0IikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2FmZSkgeworICAgICAgICAgICAgICAgICAgICAgICAga2Vycm9yID0ga3JiX3JkX3NhZmUoKENIQVIgKilpYnVmLCBsZW4sCisjaWZkZWYgS1JCNTI0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfY3JlZC5zZXNzaW9uLAorI2Vsc2UgLyogS1JCNTI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnRwX2NyZWQuc2Vzc2lvbiwKKyNlbmRpZiAvKiBLUkI1MjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoaXNjdGxhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm15Y3RsYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmdHBfbXNnX2RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXJyb3IgPSBrcmJfcmRfcHJpdigoQ0hBUiAqKWlidWYsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cF9zY2hlZCwKKyNpZmRlZiBLUkI1MjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cF9jcmVkLnNlc3Npb24sCisjZWxzZSAvKiBLUkI1MjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmdHBfY3JlZC5zZXNzaW9uLAorI2VuZGlmIC8qIEtSQjUyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpc2N0bGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXljdGxhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ0cF9tc2dfZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoa2Vycm9yICE9IEtTVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVkIHJlcGx5ICVzISAoa3JiX3JkXyVzOiAlcylcbiIsIGZ0cGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZSA/ICJtb2RpZmllZCIgOiAiZ2FyYmxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZSA/ICJzYWZlIiA6ICJwcml2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmJfZ2V0X2Vycl90ZXh0KGtlcnJvcikpOworICAgICAgICAgICAgICAgICAgICAgICAgbiA9ICc1JzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmdHBfbXNnX2RhdGEuYXBwX2xlbmd0aCA+PSBGVFBfQlVGU0laIC0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAga2Vycm9yID0gS0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgICAgICBuID0gJzUnOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJyZXBseSBkYXRhIHRvbyBsYXJnZSBmb3IgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdHBfZGViKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVjOiIsIHNhZmUgPyAnUycgOiAnUCcpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGlidWYsZnRwX21zZ19kYXRhLmFwcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cF9tc2dfZGF0YS5hcHBfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweSgmaWJ1ZltmdHBfbXNnX2RhdGEuYXBwX2xlbmd0aF0sICJcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVFBfQlVGU0laIC0gZnRwX21zZ19kYXRhLmFwcF9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogRlRQX0tSQjQgKi8KKyNpZmRlZiBGVFBfR1NTQVBJCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGF1dGhfdHlwZSwgIkdTU0FQSSIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZ3NzX2J1ZmZlcl9kZXNjIHhtaXRfYnVmLCBtc2dfYnVmOworICAgICAgICAgICAgICAgICAgICBPTV91aW50MzIgbWFqX3N0YXQsIG1pbl9zdGF0OworICAgICAgICAgICAgICAgICAgICBpbnQgY29uZl9zdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgeG1pdF9idWYudmFsdWUgPSBpYnVmOworICAgICAgICAgICAgICAgICAgICB4bWl0X2J1Zi5sZW5ndGggPSBsZW47CisgICAgICAgICAgICAgICAgICAgIC8qIGRlY3J5cHQvdmVyaWZ5IHRoZSBtZXNzYWdlICovCisgICAgICAgICAgICAgICAgICAgIGNvbmZfc3RhdGUgPSBzYWZlOworICAgICAgICAgICAgICAgICAgICBtYWpfc3RhdCA9IGdzc191bnNlYWwoJm1pbl9zdGF0LCBnY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4bWl0X2J1ZiwgJm1zZ19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZl9zdGF0ZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYWpfc3RhdCAhPSBHU1NfU19DT01QTEVURSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9nc3NfZXJyb3IobWFqX3N0YXQsIG1pbl9zdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB1bnNlYWxpbmcgcmVwbHkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAnNSc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaWJ1ZiwgbXNnX2J1Zi52YWx1ZSwgbXNnX2J1Zi5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KCZpYnVmW21zZ19idWYubGVuZ3RoXSwgIlxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUUF9CVUZTSVotbXNnX2J1Zi5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW5fc3RhdCwmbXNnX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnRwX2RlYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlYzoiLCBzYWZlID8gJ1MnIDogJ1AnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIEZUUF9HU1NBUEkgKi8KKyAgICAgICAgICAgICAgICAvKiBPdGhlciBhdXRoIHR5cGVzIGdvIGhlcmUuLi4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoIWRweWFjdGl2ZSB8fCBmdHBfZGViKSAmJiBmdHBfY21kbGluIDwgMiAmJgorICAgICAgICAgICAgICAgICAgICF4cXVpZXQgJiYgKHZibSB8fCAoIWF1dGggJiYgKG4gPT0gJzQnIHx8IG4gPT0gJzUnKSkpKSB7CisjaWZkZWYgTk9DU0VUUworICAgICAgICAgICAgcHJpbnRmKCIlYyIsYyk7CisjZWxzZQorICAgICAgICAgICAgaWYgKHhsYXRlKSB7CisgICAgICAgICAgICAgICAgeGxhdGVjKDAsYyxyY3MsbGNzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlYyIsYyk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgICAgICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgICAgICB9CisgICAgICAgIGlmIChjb250aW51YXRpb24gJiYgZnRwY29kZSAhPSBvcmlnaW5hbGNvZGUpIHsKKyAgICAgICAgICAgIGlmIChvcmlnaW5hbGNvZGUgPT0gMCkKKyAgICAgICAgICAgICAgb3JpZ2luYWxjb2RlID0gZnRwY29kZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICpjcCA9ICdcMCc7CisgICAgICAgIGlmIChuICE9ICcxJykKKyAgICAgICAgICBjcGVuZCA9IDA7CisgICAgICAgIHNpZ25hbChTSUdJTlQsb2xkaW50cik7CisgICAgICAgIGlmIChmdHBjb2RlID09IDQyMSB8fCBvcmlnaW5hbGNvZGUgPT0gNDIxKSB7CisJICAgIGxvc3RwZWVyKCk7CisJICAgIGlmICgheHF1aWV0ICYmICFmdHBfZGViKQorCSAgICAgIHByaW50ZigiJXNcbiIscmVwbHlfYnVmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNhbmNlbGZpbGUgIT0gMCkgJiYKKyNpZm5kZWYgVUxUUklYMworICAgICAgICAgICAgLyogVWx0cml4IDMuMCBjYyBvYmplY3RzIHZpb2xlbnRseSB0byB0aGlzIGNsYXVzZSAqLworICAgICAgICAgICAgKG9sZGludHIgIT0gY21kY2FuY2VsKSAmJgorI2VuZGlmIC8qIFVMVFJJWDMgKi8KKyAgICAgICAgICAgIChvbGRpbnRyICE9IFNJR19JR04pKSB7CisgICAgICAgICAgICBpZiAob2xkaW50cikKKyAgICAgICAgICAgICAgKCpvbGRpbnRyKShTSUdJTlQpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXBseV9wYXJzZSkgeworICAgICAgICAgICAgKnJlcGx5X3B0ciA9ICdcMCc7CisgICAgICAgICAgICBpZiAoKHJlcGx5X3B0ciA9IGNrc3Ryc3RyKHJlcGx5X2J1ZiwgcmVwbHlfcGFyc2UpKSkgeworICAgICAgICAgICAgICAgIHJlcGx5X3BhcnNlID0gcmVwbHlfcHRyICsgc3RybGVuKHJlcGx5X3BhcnNlKTsKKyAgICAgICAgICAgICAgICBpZiAoKHJlcGx5X3B0ciA9IGNrc3RycGJyayhyZXBseV9wYXJzZSwgIiBcciIpKSkKKyAgICAgICAgICAgICAgICAgICpyZXBseV9wdHIgPSAnXDAnOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIHJlcGx5X3BhcnNlID0gcmVwbHlfcHRyOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgqY3AgPCAnIScgJiYgY3AgPiBmdHBfcmVwbHlfc3RyKSAvKiBSZW1vdmUgdHJhaWxpbmcganVuayAqLworICAgICAgICAgICpjcC0tID0gTlVMOworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgZ2V0cmVwbHkiLGZ0cF9yZXBseV9zdHIsbiAtICcwJyk7CisgICAgICAgIHJldHVybihuIC0gJzAnKTsKKyAgICB9IC8qIGZvciAoOzspICovCit9CisKKyNpZmRlZiBCU0RTRUxFQ1QKK3N0YXRpYyBpbnQKKyNpZmRlZiBDS19BTlNJQworZW1wdHkoZmRfc2V0ICogbWFzaywgaW50IHNlYykKKyNlbHNlCitlbXB0eShtYXNrLCBzZWMpIGZkX3NldCAqIG1hc2s7IGludCBzZWM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCB0OworICAgIHQudHZfc2VjID0gKGxvbmcpIHNlYzsKKyAgICB0LnR2X3VzZWMgPSAwTDsKKyAgICBkZWJ1ZyhGMTAwLCJmdHAgZW1wdHkgY2FsbGluZyBzZWxlY3QuLi4iLCIiLDApOworI2lmZGVmIElOVFNFTEVDVAorICAgIHggPSBzZWxlY3QoMzIsIChpbnQgKiltYXNrLCBOVUxMLCBOVUxMLCAmdCk7CisjZWxzZQorICAgIHggPSBzZWxlY3QoMzIsIG1hc2ssIChmZF9zZXQgKikgMCwgKGZkX3NldCAqKSAwLCAmdCk7CisjZW5kaWYgLyogSU5UU0VMRUNUICovCisgICAgZGVidWcoRjEwMSwiZnRwIGVtcHR5IHNlbGVjdCIsIiIseCk7CisgICAgcmV0dXJuKHgpOworfQorI2Vsc2UgLyogQlNEU0VMRUNUICovCisjaWZkZWYgSUJNU0VMRUNUCitzdGF0aWMgaW50CitlbXB0eShtYXNrLCBjbnQsIHNlYykgaW50ICogbWFzaywgc2VjOworICAgICAgICAgICAgICAgICAgICAgIGludCAgIGNudDsKK3sKKyAgICByZXR1cm4oc2VsZWN0KG1hc2ssY250LDAsMCxzZWMqMTAwMCkpOworfQorI2VuZGlmIC8qIElCTVNFTEVDVCAqLworI2VuZGlmIC8qIEJTRFNFTEVDVCAqLworCitzdGF0aWMgc2lndHlwZQorY2FuY2Vsc2VuZChzaWcpIGludCBzaWc7IHsKKyAgICBoYXZlc2lnaW50Kys7CisgICAgY2FuY2VsZ3JvdXArKzsKKyAgICBjYW5jZWxmaWxlID0gMDsKKyAgICBwcmludGYoIiBDYW5jZWxlZC4uLlxuIik7CisgICAgc2VjdXJlX2dldGMoMCwxKTsJCQkvKiBJbml0aWFsaXplIG5ldCBpbnB1dCBidWZmZXJzICovCisgICAgZGVidWcoRjEwMCwiZnRwIGNhbmNlbHNlbmQgY2F1Z2h0IFNJR0lOVCAiLCIiLDApOworICAgIGZmbHVzaChzdGRvdXQpOworI2lmbmRlZiBPUzIKKyAgICBsb25nam1wKHNlbmRjYW5jZWwsIDEpOworI2Vsc2UKKyAgICBQb3N0Q3RybENTZW0oKTsKKyNlbmRpZiAvKiBPUzIgKi8KK30KKworc3RhdGljIFZPSUQKKyNpZmRlZiBDS19BTlNJQworc2VjdXJlX2Vycm9yKGNoYXIgKmZtdCwgLi4uKQorI2Vsc2UKKy8qIFZBUkFSR1MxICovCitzZWN1cmVfZXJyb3IoZm10LCBwMSwgcDIsIHAzLCBwNCwgcDUpCisgICBjaGFyICpmbXQ7IGludCBwMSwgcDIsIHAzLCBwNCwgcDU7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyNpZmRlZiBDS19BTlNJQworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisjZWxzZQorICAgIGZwcmludGYoc3RkZXJyLCBmbXQsIHAxLCBwMiwgcDMsIHA0LCBwNSk7CisjZW5kaWYKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKKy8qCisgKiBJbnRlcm5hbCBmb3JtIG9mIHNldHR5cGU7IGNoYW5nZXMgY3VycmVudCB0eXBlIGluIHVzZSB3aXRoIHNlcnZlcgorICogd2l0aG91dCBjaGFuZ2luZyBvdXIgbm90aW9uIG9mIHRoZSB0eXBlIGZvciBkYXRhIHRyYW5zZmVycy4KKyAqIFVzZWQgdG8gY2hhbmdlIHRvIGFuZCBmcm9tIGFzY2lpIGZvciBsaXN0aW5ncy4KKyAqLworc3RhdGljIFZPSUQKK2NoYW5nZXR5cGUobmV3dHlwZSwgc2hvdykgaW50IG5ld3R5cGUsIHNob3c7IHsKKyAgICBpbnQgcmM7CisgICAgY2hhciAqIHM7CisKKyAgICBpZiAoKG5ld3R5cGUgPT0gY3VydHlwZSkgJiYgdHlwZXNlbnQrKykKKyAgICAgIHJldHVybjsKKyAgICBzd2l0Y2ggKG5ld3R5cGUpIHsKKyAgICAgIGNhc2UgRlRUX0FTQzoKKyAgICAgICAgcyA9ICJBIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZUVF9CSU46CisgICAgICAgIHMgPSAiSSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGVFRfVEVOOgorICAgICAgICBzID0gIkwgOCI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcyA9ICJJIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJjID0gZnRwY21kKCJUWVBFIixzLC0xLC0xLHNob3cpOworICAgIGlmIChyYyA9PSBSRVBMWV9DT01QTEVURSkKKyAgICAgIGN1cnR5cGUgPSBuZXd0eXBlOworfQorCisvKiBQVVQgYSBmaWxlLiAgUmV0dXJucyAtMSBvbiBlcnJvciwgMCBvbiBzdWNjZXNzLCAxIGlmIGZpbGUgc2tpcHBlZCAqLworCitzdGF0aWMgVk9JRAorI2lmZGVmIENLX0FOU0lDCitkb2Z0cHNlbmQodm9pZCAqIHRocmVhZGluZm8pCisjZWxzZQorZG9mdHBzZW5kKHRocmVhZGluZm8pIFZPSUQgKiB0aHJlYWRpbmZvOworI2VuZGlmCit7CisjaWZkZWYgTlRTSUcKKyAgICBpZiAodGhyZWFkaW5mbykgeyAgICAgICAgICAgICAgICAgICAvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZS4uLiAqLworICAgICAgICBUbHNTZXRWYWx1ZShUbHNJbmRleCx0aHJlYWRpbmZvKTsKKyAgICAgICAgZGVidWcoRjEwMCwgImRvZnRwc2VuZCBjYWxsZWQgd2l0aCB0aHJlYWRpbmZvIGJsb2NrIiwiIiwgMCk7CisgICAgfSBlbHNlIGRlYnVnKEYxMDAsICJkb2Z0cHNlbmQgLSB0aHJlYWRpbmZvIGlzIE5VTEwiLCAiIiwgMCk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyNpZmRlZiBDS19MT0dJTgorI2lmZGVmIElLU0QKKyNpZmRlZiBOVAorICAgIGlmIChpbnNlcnZlcikKKyAgICAgIHNldG50Y3JlZHMoKTsKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIElLU0QgKi8KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCisgICAgaWYgKGluaXRjb25uKCkpIHsKKyNpZm5kZWYgTk9IVFRQCisgICAgICAgIGludCB5ID0gLTE7CisgICAgICAgIGRlYnVnKEYxMDEsImRvZnRwc2VuZCIsInRjcF9odHRwX3Byb3h5Iix0Y3BfaHR0cF9wcm94eSk7CisKKyAgICAgICAvKiAgSWYgdGhlIGNvbm5lY3Rpb24gZmFpbGVkIGFuZCB3ZSBhcmUgdXNpbmcgYW4gSFRUUCBQcm94eQorICAgICAgICAqICBhbmQgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgd2FzIGFuIGF1dGhlbnRpY2F0aW9uCisgICAgICAgICogIGVycm9yLCB0aGVuIHdlIG5lZWQgdG8gZ2l2ZSB0aGUgdXNlciB0byBhYmlsaXR5IHRvCisgICAgICAgICogIGVudGVyIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLCBqdXN0IGxpa2UgYSBicm93c2VyLgorICAgICAgICAqCisgICAgICAgICogIEkgdHJpZWQgdG8gZG8gYWxsIG9mIHRoaXMgd2l0aGluIHRoZSBuZXRvcGVuKCkgY2FsbAorICAgICAgICAqICBidXQgaXQgaXMgbXVjaCB0b28gbXVjaCB3b3JrLgorICAgICAgICAqLworICAgICAgICB3aGlsZSAoeSAhPSAwICYmIHRjcF9odHRwX3Byb3h5ICE9IE5VTEwgKSB7CisKKyAgICAgICAgICAgIGlmICh0Y3BfaHR0cF9wcm94eV9lcnJubyA9PSA0MDEgfHwKKyAgICAgICAgICAgICAgICAgdGNwX2h0dHBfcHJveHlfZXJybm8gPT0gNDA3ICkgeworICAgICAgICAgICAgICAgIGNoYXIgdWlkW1VJREJVRkxFTl07CisgICAgICAgICAgICAgICAgY2hhciBwd2RbUFdEU0laXTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdHh0Ym94IHRiWzJdOworICAgICAgICAgICAgICAgIGludCBvazsKKworICAgICAgICAgICAgICAgIHRiWzBdLnRfYnVmID0gdWlkOworICAgICAgICAgICAgICAgIHRiWzBdLnRfbGVuID0gVUlEQlVGTEVOOworICAgICAgICAgICAgICAgIHRiWzBdLnRfbGJsID0gIlByb3h5IFVzZXJpZDogIjsKKyAgICAgICAgICAgICAgICB0YlswXS50X2RmbHQgPSBOVUxMOworICAgICAgICAgICAgICAgIHRiWzBdLnRfZWNobyA9IDE7CisgICAgICAgICAgICAgICAgdGJbMV0udF9idWYgPSBwd2Q7CisgICAgICAgICAgICAgICAgdGJbMV0udF9sZW4gPSAyNTY7CisgICAgICAgICAgICAgICAgdGJbMV0udF9sYmwgPSAiUHJveHkgUGFzc3BocmFzZTogIjsKKyAgICAgICAgICAgICAgICB0YlsxXS50X2RmbHQgPSBOVUxMOworICAgICAgICAgICAgICAgIHRiWzFdLnRfZWNobyA9IDI7CisKKyAgICAgICAgICAgICAgICBvayA9IHVxX210eHQoIlByb3h5IFNlcnZlciBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDIsIHRiKTsKKyAgICAgICAgICAgICAgICBpZiAob2sgJiYgdWlkWzBdKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBwcm94eV91c2VyLCAqIHByb3h5X3B3ZDsKKworICAgICAgICAgICAgICAgICAgICBwcm94eV91c2VyID0gdGNwX2h0dHBfcHJveHlfdXNlcjsKKyAgICAgICAgICAgICAgICAgICAgcHJveHlfcHdkICA9IHRjcF9odHRwX3Byb3h5X3B3ZDsKKworICAgICAgICAgICAgICAgICAgICB0Y3BfaHR0cF9wcm94eV91c2VyID0gdWlkOworICAgICAgICAgICAgICAgICAgICB0Y3BfaHR0cF9wcm94eV9wd2QgPSBwd2Q7CisKKyAgICAgICAgICAgICAgICAgICAgeSA9IGluaXRjb25uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiZG9mdHBzZW5kIiwiaW5pdGNvbm4iLHkpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQocHdkLDAsUFdEU0laKTsKKyAgICAgICAgICAgICAgICAgICAgdGNwX2h0dHBfcHJveHlfdXNlciA9IHByb3h5X3VzZXI7CisgICAgICAgICAgICAgICAgICAgIHRjcF9odHRwX3Byb3h5X3B3ZCA9IHByb3h5X3B3ZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggeSAhPSAwICkgeworI2VuZGlmIC8qIE5PSFRUUCAqLworICAgICAgICAgICAgc2lnbmFsKFNJR0lOVCwgZnRwc25kLm9sZGludHIpOworI2lmZGVmIFNJR1BJUEUKKyAgICAgICAgICAgIGlmIChmdHBzbmQub2xkaW50cCkKKyAgICAgICAgICAgICAgc2lnbmFsKFNJR1BJUEUsIGZ0cHNuZC5vbGRpbnRwKTsKKyNlbmRpZiAvKiBTSUdQSVBFICovCisgICAgICAgICAgICBmdHBjb2RlID0gLTE7CisgICAgICAgICAgICB6Y2xvc2UoWklGSUxFKTsKKyAgICAgICAgICAgIGZ0cHNuZHJldCA9IC0xOworI2lmZGVmIE5UU0lHCisgICAgICAgICAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgICAgICAgICAgcmV0dXJuOworI2lmbmRlZiBOT0hUVFAKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PSFRUUCAqLworICAgIH0KKyAgICBmdHBzbmRyZXQgPSAwOworI2lmZGVmIE5UU0lHCisgICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCit9CisKK3N0YXRpYyBWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2ZhaWxmdHBzZW5kKHZvaWQgKiB0aHJlYWRpbmZvKQorI2Vsc2UKK2ZhaWxmdHBzZW5kKHRocmVhZGluZm8pIFZPSUQgKiB0aHJlYWRpbmZvOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisjaWZkZWYgTlRTSUcKKyAgICBpZiAodGhyZWFkaW5mbykgeyAgICAgICAgICAgICAgICAgICAvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZS4uLiAqLworICAgICAgICBUbHNTZXRWYWx1ZShUbHNJbmRleCx0aHJlYWRpbmZvKTsKKyAgICAgICAgZGVidWcoRjEwMCwgImRvY21kZmlsZSBjYWxsZWQgd2l0aCB0aHJlYWRpbmZvIGJsb2NrIiwiIiwgMCk7CisgICAgfSBlbHNlIGRlYnVnKEYxMDAsICJkb2NtZGZpbGUgLSB0aHJlYWRpbmZvIGlzIE5VTEwiLCAiIiwgMCk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyNpZmRlZiBDS19MT0dJTgorI2lmZGVmIElLU0QKKyNpZmRlZiBOVAorICAgIGlmIChpbnNlcnZlcikKKyAgICAgIHNldG50Y3JlZHMoKTsKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIElLU0QgKi8KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCisgICAgd2hpbGUgKGNwZW5kKSB7CisgICAgICAgIGZ0cHNuZC5yZXBseSA9IGdldHJlcGx5KDAsZnRwc25kLmluY3MsZnRwc25kLm91dGNzLGZ0cF92Ym0sMCk7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCBzZW5kcmVxdWVzdCBnZXRyZXBseSIsIm51bGwgY29tbWFuZCIsZnRwc25kLnJlcGx5KTsKKyAgICB9CisgICAgaWYgKGRhdGEgPj0gMCkgeworI2lmZGVmIENLX1NTTAorICAgICAgICBpZiAoc3NsX2Z0cF9kYXRhX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgICAgICBTU0xfc2h1dGRvd24oc3NsX2Z0cF9kYXRhX2Nvbik7CisgICAgICAgICAgICBTU0xfZnJlZShzc2xfZnRwX2RhdGFfY29uKTsKKyAgICAgICAgICAgIHNzbF9mdHBfZGF0YV9hY3RpdmVfZmxhZyA9IDA7CisgICAgICAgICAgICBzc2xfZnRwX2RhdGFfY29uID0gTlVMTDsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIFRDUElQTElCCisgICAgICAgIHNvY2tldF9jbG9zZShkYXRhKTsKKyNlbHNlIC8qIFRDUElQTElCICovCisjaWZkZWYgVVNFX1NIVVRET1dOCisgICAgICAgIHNodXRkb3duKGRhdGEsIDErMSk7CisjZW5kaWYgLyogVVNFX1NIVVRET1dOICovCisgICAgICAgIGNsb3NlKGRhdGEpOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgIGRhdGEgPSAtMTsKKyAgICAgICAgZ2xvYmFsZGluID0gLTE7CisgICAgfQorICAgIGlmIChmdHBzbmQub2xkaW50cikKKyAgICAgICAgc2lnbmFsKFNJR0lOVCxmdHBzbmQub2xkaW50cik7CisjaWZkZWYgU0lHUElQRQorICAgIGlmIChmdHBzbmQub2xkaW50cCkKKyAgICAgICAgc2lnbmFsKFNJR1BJUEUsZnRwc25kLm9sZGludHApOworI2VuZGlmIC8qIFNJR1BJUEUgKi8KKyAgICBmdHBjb2RlID0gLTE7CisjaWZuZGVmIE9TMgorICAgIC8qIFRFU1QgTUUgSU4gSzk1ICovCisgICAgaWYgKGhhdmVzaWdpbnQpIHsKKwloYXZlc2lnaW50ID0gMDsKKwlkZWJ1ZyhGMTAwLCJmdHAgZmFpbGZ0cHNlbmQgY2hhaW4gdG8gdHJhcCgpLi4uIiwiIiwwKTsKKwlpZiAoZnRwc25kLm9sZGludHIgIT0gU0lHX0lHTikKKwkgICgqZnRwc25kLm9sZGludHIpKFNJR0lOVCk7CisJLyogTk9UUkVBQ0hFRCAoSSBob3BlISkgKi8KKwlkZWJ1ZyhGMTAwLCJmdHAgZmFpbGZ0cHNlbmQgcmV0dXJuIGZyb20gdHJhcCgpLi4uIiwiIiwwKTsKKyAgICB9CisjZW5kaWYgLyogT1MyICovCit9CisKK3N0YXRpYyBWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2ZhaWxmdHBzZW5kMih2b2lkICogdGhyZWFkaW5mbykKKyNlbHNlCitmYWlsZnRwc2VuZDIodGhyZWFkaW5mbykgVk9JRCAqIHRocmVhZGluZm87CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyNpZmRlZiBOVFNJRworICAgIGlmICh0aHJlYWRpbmZvKSB7ICAgICAgICAgICAgICAgICAgIC8qIFRocmVhZCBsb2NhbCBzdG9yYWdlLi4uICovCisgICAgICAgIFRsc1NldFZhbHVlKFRsc0luZGV4LHRocmVhZGluZm8pOworICAgICAgICBkZWJ1ZyhGMTAwLCAiZG9jbWRmaWxlIGNhbGxlZCB3aXRoIHRocmVhZGluZm8gYmxvY2siLCIiLCAwKTsKKyAgICB9IGVsc2UgZGVidWcoRjEwMCwgImRvY21kZmlsZSAtIHRocmVhZGluZm8gaXMgTlVMTCIsICIiLCAwKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworI2lmZGVmIENLX0xPR0lOCisjaWZkZWYgSUtTRAorI2lmZGVmIE5UCisgICAgaWYgKGluc2VydmVyKQorICAgICAgc2V0bnRjcmVkcygpOworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogSUtTRCAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisKKyAgICBkZWJ1ZyhGMTAxLCJmdHAgc2VuZHJlcXVlc3QgY2FuY2VsZWQiLCIiLGZ0cHNuZC5ieXRlcyk7CisgICAgdGZjICs9IGZmYzsKKyNpZmRlZiBHRlRJTUVSCisgICAgZnBmc2VjcyA9IGdmdGltZXIoKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgemNsb3NlKFpJRklMRSk7CisjaWZkZWYgUElQRVNFTkQKKyAgICBpZiAoc25kZmlsdGVyKQorICAgICAgcGlwZXNlbmQgPSAwOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisgICAgc2lnbmFsKFNJR0lOVCwgZnRwc25kLm9sZGludHIpOworI2lmZGVmIFNJR1BJUEUKKyAgICBpZiAoZnRwc25kLm9sZGludHApCisgICAgICBzaWduYWwoU0lHUElQRSwgZnRwc25kLm9sZGludHApOworI2VuZGlmIC8qIFNJR1BJUEUgKi8KKyAgICBpZiAoIWNwZW5kKSB7CisgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyAgICAgICAgZnRwc25kcmV0ID0gLTE7CisjaWZkZWYgTlRTSUcKKyAgICAgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZGF0YSA+PSAwKSB7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgIGlmIChzc2xfZnRwX2RhdGFfYWN0aXZlX2ZsYWcpIHsKKyAgICAgICAgICAgIFNTTF9zaHV0ZG93bihzc2xfZnRwX2RhdGFfY29uKTsKKyAgICAgICAgICAgIFNTTF9mcmVlKHNzbF9mdHBfZGF0YV9jb24pOworICAgICAgICAgICAgc3NsX2Z0cF9kYXRhX2FjdGl2ZV9mbGFnID0gMDsKKyAgICAgICAgICAgIHNzbF9mdHBfZGF0YV9jb24gPSBOVUxMOworICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgc29ja2V0X2Nsb3NlKGRhdGEpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgc2h1dGRvd24oZGF0YSwgMSsxKTsKKyNlbmRpZiAvKiBVU0VfU0hVVERPV04gKi8KKyAgICAgICAgY2xvc2UoZGF0YSk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgZGF0YSA9IC0xOworICAgICAgICBnbG9iYWxkaW4gPSAtMTsKKyAgICB9CisgICAgaWYgKGRvdXQpIHsKKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICBzb2NrZXRfY2xvc2UoZG91dCk7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworI2lmZGVmIFVTRV9TSFVURE9XTgorICAgICAgICBzaHV0ZG93bihkb3V0LCAxKzEpOworI2VuZGlmIC8qIFVTRV9TSFVURE9XTiAqLworICAgICAgICBjbG9zZShkb3V0KTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgIH0KKyAgICBmdHBzbmQucmVwbHkgPSBnZXRyZXBseSgwLGZ0cHNuZC5pbmNzLGZ0cHNuZC5vdXRjcyxmdHBfdmJtLDApOworICAgIGZ0cGNvZGUgPSAtMTsKKyAgICBmdHBzbmRyZXQgPSAtMTsKKworI2lmbmRlZiBPUzIKKyAgICAvKiBURVNUIE1FIElOIEs5NSAqLworICAgIGlmIChoYXZlc2lnaW50KSB7CisJaGF2ZXNpZ2ludCA9IDA7CisJZGVidWcoRjEwMCwiZnRwIGZhaWxmdHBzZW5kMiBjaGFpbiB0byB0cmFwKCkuLi4iLCIiLDApOworCWlmIChmdHBzbmQub2xkaW50ciAhPSBTSUdfSUdOKQorCSAgKCpmdHBzbmQub2xkaW50cikoU0lHSU5UKTsKKwkvKiBOT1RSRUFDSEVEIChJIGhvcGUhKSAqLworCWRlYnVnKEYxMDAsImZ0cCBmYWlsZnRwc2VuZDIgcmV0dXJuIGZyb20gdHJhcCgpLi4uIiwiIiwwKTsKKyAgICB9CisjZW5kaWYgLyogT1MyICovCit9CisKK3N0YXRpYyBWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2RvZnRwc2VuZDIodm9pZCAqIHRocmVhZGluZm8pCisjZWxzZQorZG9mdHBzZW5kMih0aHJlYWRpbmZvKSBWT0lEICogdGhyZWFkaW5mbzsKKyNlbmRpZgoreworICAgIHJlZ2lzdGVyIGludCBjLCBkID0gMDsKKyAgICBpbnQgbiwgdCwgeCwgbm90YWZpbGUsIHVuaXF1ZSA9IDA7CisgICAgY2hhciAqYnVmLCAqYnVmcDsKKyAgICAKKyNpZmRlZiBOVFNJRworICAgIGlmICh0aHJlYWRpbmZvKSB7ICAgICAgICAgICAgICAgICAgIC8qIFRocmVhZCBsb2NhbCBzdG9yYWdlLi4uICovCisgICAgICAgIFRsc1NldFZhbHVlKFRsc0luZGV4LHRocmVhZGluZm8pOworICAgICAgICBkZWJ1ZyhGMTAwLCAiZG9mdHBzZW5kMiBjYWxsZWQgd2l0aCB0aHJlYWRpbmZvIGJsb2NrIiwiIiwgMCk7CisgICAgfSBlbHNlIGRlYnVnKEYxMDAsICJkb2Z0cHNlbmQyIC0gdGhyZWFkaW5mbyBpcyBOVUxMIiwgIiIsIDApOworI2VuZGlmIC8qIE5UU0lHICovCisjaWZkZWYgQ0tfTE9HSU4KKyNpZmRlZiBJS1NECisjaWZkZWYgTlQKKyAgICBpZiAoaW5zZXJ2ZXIpCisgICAgICBzZXRudGNyZWRzKCk7CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBJS1NEICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKworICAgIGJ1ZiA9IGZ0cHNuZGJ1ZjsJCQkvKiAobm90IG9uIHN0YWNrKSAqLworCisgICAgdW5pcXVlID0gc3RyY21wKGZ0cHNuZC5jbWQsIlNUT1UiKSA/IDAgOiAxOworICAgIG5vdGFmaWxlID0gc25kYXJyYXkgfHwgcGlwZXNlbmQ7CisKKyNpZmRlZiBGVFBfUkVTVEFSVAorICAgIGlmIChmdHBzbmQucmVzdGFydCAmJiAoKGN1cnR5cGUgPT0gRlRUX0JJTikgfHwgKGFsaWtlID4gMCkpKSB7CisgICAgICAgIGNoYXIgKiBwOworICAgICAgICBjaGFuZ2V0eXBlKEZUVF9CSU4sMCk7ICAgICAgICAgIC8qIENoYW5nZSB0byBiaW5hcnkgKi8KKworICAgICAgICAvKiBBc2sgZm9yIHJlbW90ZSBmaWxlJ3Mgc2l6ZSAqLworICAgICAgICB4ID0gZnRwY21kKCJTSVpFIixmdHBzbmQucmVtb3RlLGZ0cHNuZC5pbmNzLGZ0cHNuZC5vdXRjcyxmdHBfdmJtKTsKKworICAgICAgICBpZiAoeCA9PSBSRVBMWV9DT01QTEVURSkgeyAgICAgIC8qIEhhdmUgZnRwc25kLnJlcGx5ICovCisgICAgICAgICAgICBwID0gJmZ0cF9yZXBseV9zdHJbNF07ICAgICAgLyogUGFyc2UgaXQgKi8KKyAgICAgICAgICAgIHdoaWxlIChpc2RpZ2l0KCpwKSkgeworICAgICAgICAgICAgICAgIHNlbmRzdGFydCA9IHNlbmRzdGFydCAqIDEwICsgKGludCkoKnAgLSAnMCcpOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqcCAmJiAqcCAhPSBDUikgeyAgICAgICAvKiBCYWQgbnVtYmVyICovCisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZG9mdHBzZW5kMiBiYWQgc2l6ZSIsZnRwX3JlcGx5X3N0ciwwKTsKKyAgICAgICAgICAgICAgICBzZW5kc3RhcnQgPSAwTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VuZHN0YXJ0ID4gZnNpemUpIHsgLyogUmVtb3RlIGZpbGUgYmlnZ2VyIHRoYW4gbG9jYWwgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJkb2Z0cHNlbmQyIGJpZyBzaXplIixja2x0b2EoZnNpemUpLHNlbmRzdGFydCk7CisgICAgICAgICAgICAgICAgc2VuZHN0YXJ0ID0gMEw7CisgICAgICAgICAgICB9CisJICAgIC8qIExvY2FsIGlzIG5ld2VyICovCisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJkb2Z0cHNlbmQyIHNpemUiLGZ0cHNuZC5yZW1vdGUsc2VuZHN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChjaGttb2R0aW1lKGZ0cHNuZC5sb2NhbCxmdHBzbmQucmVtb3RlLDApID09IDIpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJkb2Z0cHNlbmQyIGRhdGUgbWlzbWF0Y2giLGZ0cF9yZXBseV9zdHIsMCk7CisgICAgICAgICAgICAgICAgc2VuZHN0YXJ0ID0gMEw7ICAgICAgICAgLyogU2VuZCB0aGUgd2hvbGUgZmlsZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNoYW5nZXR5cGUoZnRwX3R5cCwwKTsgICAgICAgICAgLyogQ2hhbmdlIGJhY2sgdG8gYXBwcm9wcmlhdGUgdHlwZSAqLworICAgICAgICBpZiAoc2VuZHN0YXJ0ID4gMEwpIHsgICAgICAgICAgIC8qIFN0aWxsIHJlc3RhcnRpbmc/ICovCisgICAgICAgICAgICBpZiAoc2VuZHN0YXJ0ID09IGZzaXplKSB7ICAgLyogU2FtZSBzaXplIC0gbm8gbmVlZCB0byBzZW5kICovCisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZG9mdHBzZW5kMiAvcmVzdGFydCBTS0lQIixmc2l6ZSxzZW5kc3RhcnQpOworICAgICAgICAgICAgICAgIHpjbG9zZShaSUZJTEUpOworICAgICAgICAgICAgICAgIGZ0cHNuZHJldCA9IFNLUF9SRVM7CisjaWZkZWYgTlRTSUcKKyAgICAgICAgICAgICAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm5vID0gMDsgICAgICAgICAgICAgICAgICAvKiBSZXN0YXJ0IG5lZWRlZCwgc2VlayB0byB0aGUgc3BvdCAqLworICAgICAgICAgICAgaWYgKHpmc2VlaygobG9uZylzZW5kc3RhcnQpIDwgMCkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImRvZnRwc2VuZDIgemZzZWVrIGZhaWxzIiwKKwkJICAgICAgZnRwc25kLmxvY2FsLHNlbmRzdGFydCk7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGU0VFSzogJXM6ICVzXG4iLCBmdHBzbmQubG9jYWwsIGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgICAgICBzZW5kc3RhcnQgPSAwOworICAgICAgICAgICAgICAgIHpjbG9zZShaSUZJTEUpOworICAgICAgICAgICAgICAgIGZ0cHNuZHJldCA9IC0xOworI2lmZGVmIE5UU0lHCisgICAgICAgICAgICAgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgZGVidWcoRjExMSwiZG9mdHBzZW5kMiB6ZnNlZWsgb2siLGZ0cHNuZC5sb2NhbCxzZW5kc3RhcnQpOworICAgICAgICAgICAgeCA9IGZ0cGNtZCgiUkVTVCIsY2tsdG9hKHNlbmRzdGFydCksLTEsLTEsZnRwX3ZibSk7CisgICAgICAgICAgICBpZiAoeCAhPSBSRVBMWV9DT05USU5VRSkgeworICAgICAgICAgICAgICAgIHNlbmRzdGFydCA9IDA7CisgICAgICAgICAgICAgICAgemNsb3NlKFpJRklMRSk7CisgICAgICAgICAgICAgICAgZnRwc25kcmV0ID0gLTE7CisjaWZkZWYgTlRTSUcKKyAgICAgICAgICAgICAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnRwc25kLmNtZCA9ICJTVE9SIjsKKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICBzZW5kbW9kZSA9IFNNX1JFU0VORDsKKyAgICAgICAgICAgIGZ0cHNuZC5jbWQgPSAiQVBQRSI7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgLyogc2VuZHN0YXJ0ID0gMEw7ICovCisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogRlRQX1JFU1RBUlQgKi8KKworICAgIGlmICh1bmlxdWUgJiYgIXN0b3VhcmcpCQkvKiBJZiB3ZSBrbm93IFNUT1UgYWNjZXB0cyBubyBhcmcgKi8KKyAgICAgIGZ0cHNuZC5yZW1vdGUgPSBOVUxMOwkJLyogZG9uJ3QgaW5jbHVkZSBvbmUuICovCisKKyAgICB4ID0gZnRwY21kKGZ0cHNuZC5jbWQsIGZ0cHNuZC5yZW1vdGUsIGZ0cHNuZC5pbmNzLCBmdHBzbmQub3V0Y3MsIGZ0cF92Ym0pOworICAgIGRlYnVnKEYxMTEsImRvZnRwc2VuZDIgZnRwY29kZSIsZnRwc25kLmNtZCxmdHBjb2RlKTsKKworICAgIGlmICh4ICE9IFJFUExZX1BSRUxJTSAmJiB1bmlxdWUpIHsKKwkvKgorCSAgUkZDOTU5IHNheXMgU1RPVSBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50LiAgQnV0IGV2ZXJ5IEZUUCBzZXJ2ZXIKKwkgIEkndmUgZW5jb3VudGVyZWQgYnV0IG9uZSBhY2NlcHRzIHRoZSBhcmcgYW5kIGNvbnN0cnVjdHMgdGhlIHVuaXF1ZQorCSAgbmFtZSBmcm9tIGl0LCB3aGljaCBpcyBiZXR0ZXIgdGhhbiBtYWtpbmcgdXAgYSB0b3RhbGx5IHJhbmRvbSBuYW1lCisJICBmb3IgdGhlIGZpbGUsIHdoaWNoIGlzIHdoYXQgUkZDOTU5IGNhbGxzIGZvci4gIEVzcGVjaWFsbHkgYmVjYXVzZQorCSAgdGhlcmUgaXMgbm8gd2F5IGZvciB0aGUgY2xpZW50IHRvIGZpbmQgb3V0IHRoZSBuYW1lIGNob3NlbiBieSB0aGUKKwkgIHNlcnZlci4gIFNvIHdlIHRyeSBTVE9VIHdpdGggdGhlIGFyZ3VtZW50IGZpcnN0LCB3aGljaCB3b3JrcyB3aXRoCisJICBtb3N0IHNlcnZlcnMsIGFuZCBpZiBpdCBmYWlscyB3ZSByZXRyeSBpdCB3aXRob3V0IHRoZSBhcmcsIGZvcgorCSAgdGhlIGJlbmVmaXQgb2YgdGhlIG9uZSBwaWNreSBzZXJ2ZXIgdGhhdCBpcyBub3QgImxpYmVyYWwgaW4gd2hhdAorCSAgaXQgYWNjZXB0cyIgVU5MRVNTIHRoZSBmaXJzdCBTVE9VIGdvdCBhIDUwMiBjb2RlICgibm90IGltcGxlbWVudGVkIikKKwkgIHdoaWNoIG1lYW5zIFNUT1UgaXMgbm90IGFjY2VwdGVkLCBwZXJpb2QuCisJKi8KKwlpZiAoKHggPT0gNSkgJiYgc3RvdWFyZyAmJiAoZnRwY29kZSAhPSA1MDIpKSB7CisJICAgIHggPSBmdHBjbWQoZnRwc25kLmNtZCxOVUxMLGZ0cHNuZC5pbmNzLGZ0cHNuZC5vdXRjcyxmdHBfdmJtKTsgCisJICAgIGlmICh4ID09IFJFUExZX1BSRUxJTSkJLyogSWYgYWNjZXB0ZWQgKi8KKwkgICAgICBzdG91YXJnID0gMDsJCS8qIGZsYWcgbm8gU1RPVSBhcmcgZm9yIHRoaXMgc2VydmVyICovCisJfQorICAgIH0KKyAgICBpZiAoeCAhPSBSRVBMWV9QUkVMSU0pIHsKKyAgICAgICAgc2lnbmFsKFNJR0lOVCwgZnRwc25kLm9sZGludHIpOworI2lmZGVmIFNJR1BJUEUKKyAgICAgICAgaWYgKGZ0cHNuZC5vbGRpbnRwKQorICAgICAgICAgIHNpZ25hbChTSUdQSVBFLCBmdHBzbmQub2xkaW50cCk7CisjZW5kaWYgLyogU0lHUElQRSAqLworICAgICAgICB6Y2xvc2UoWklGSUxFKTsKKyNpZmRlZiBQSVBFU0VORAorICAgICAgICBpZiAoc25kZmlsdGVyKQorICAgICAgICAgIHBpcGVzZW5kID0gMDsKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworICAgICAgICBmdHBzbmRyZXQgPSAtMTsKKyNpZmRlZiBOVFNJRworICAgICAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRvdXQgPSBkYXRhY29ubihmdHBzbmQubG1vZGUpOyAgICAgICAgICAgICAvKiBHZXQgZGF0YSBjb25uZWN0aW9uICovCisgICAgaWYgKGRvdXQgPT0gLTEpIHsKKyAgICAgICAgZmFpbGZ0cHNlbmQyKHRocmVhZGluZm8pOworI2lmZGVmIE5UU0lHCisgICAgICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogSW5pdGlhbGl6ZSBwZXItZmlsZSBzdGF0cyAqLworICAgIGZmYyA9IDBMOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoYXJhY3RlciBjb3VudGVyICovCisgICAgY3BzID0gb2xkY3BzID0gMEw7ICAgICAgICAgICAgICAgICAgLyogVGhydXB1dCAqLworI2lmZGVmIEdGVElNRVIKKyAgICByZnRpbWVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNldCBmLnAuIHRpbWVyICovCisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisjaWZkZWYgU0lHUElQRQorICAgIGZ0cHNuZC5vbGRpbnRwID0gc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworI2VuZGlmIC8qIFNJR1BJUEUgKi8KKyAgICBzd2l0Y2ggKGN1cnR5cGUpIHsKKyAgICAgIGNhc2UgRlRUX0JJTjogICAgICAgICAgICAgICAgICAgICAvKiBCaW5hcnkgbW9kZSAqLworICAgICAgY2FzZSBGVFRfVEVOOgorICAgICAgICBlcnJubyA9IGQgPSAwOworICAgICAgICB3aGlsZSAoKG4gPSB6eGluKFpJRklMRSxidWYsRlRQX0JVRlNJWiAtIDEpKSA+IDAgJiYgIWNhbmNlbGZpbGUpIHsKKyAgICAgICAgICAgIGZ0cHNuZC5ieXRlcyArPSBuOworICAgICAgICAgICAgZmZjICs9IG47CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJkb2Z0cHNlbmQyIHp4aW4iLGNrbHRvYShuKSxmZmMpOworICAgICAgICAgICAgaGV4ZHVtcCgiZG9mdHBzZW5kMiB6eGluIixidWYsMTYpOworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgaWYgKHNzbF9mdHBfZGF0YV9hY3RpdmVfZmxhZykgeworICAgICAgICAgICAgICAgIGZvciAoYnVmcCA9IGJ1ZjsgbiA+IDA7IG4gLT0gZCwgYnVmcCArPSBkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZCA9IFNTTF93cml0ZShzc2xfZnRwX2RhdGFfY29uLCBidWZwLCBuKSkgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgc3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICAgICAgcGt0bnVtKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChmZGlzcGxhICE9IFhZRkRfQikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3BrdGwgPSBkOworICAgICAgICAgICAgICAgICAgICAgICAgZnRzY3JlZW4oU0NSX1BULCdEJyxzcGFja2V0cyxOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgICAgZm9yIChidWZwID0gYnVmOyBuID4gMDsgbiAtPSBkLCBidWZwICs9IGQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoZCA9IHNlY3VyZV93cml0ZShkb3V0LCAoQ0hBUiAqKWJ1ZnAsIG4pKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNjYW5jZWxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBzcGFja2V0cysrOworICAgICAgICAgICAgICAgICAgICBwa3RudW0rKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZkaXNwbGEgIT0gWFlGRF9CKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGt0bCA9IGQ7CisgICAgICAgICAgICAgICAgICAgICAgICBmdHNjcmVlbihTQ1JfUFQsJ0QnLHNwYWNrZXRzLE5VTEwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgaWYgKGQgPD0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibG9jYWw6ICVzOiAlc1xuIiwgZnRwc25kLmxvY2FsLCBja19lcnJzdHIoKSk7CisgICAgICAgIGlmIChkIDwgMCB8fCAoZCA9IHNlY3VyZV9mbHVzaChkb3V0KSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoZCA9PSAtMSAmJiBlcnJubyAmJiBlcnJubyAhPSBFUElQRSkKKyAgICAgICAgICAgICAgcGVycm9yKCJuZXRvdXQiKTsKKyAgICAgICAgICAgIGZ0cHNuZC5ieXRlcyA9IC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZUVF9BU0M6ICAgICAgICAgICAgICAgICAgICAgLyogVGV4dCBtb2RlICovCisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgICAgaWYgKGZ0cHNuZC54bGF0ZSkgeyAgICAgICAgICAgICAvKiBXaXRoIHRyYW5zbGF0aW9uICovCisgICAgICAgICAgICBpbml0eGxhdGUoZnRwc25kLmluY3MsZnRwc25kLm91dGNzKTsKKyAgICAgICAgICAgIHdoaWxlICghY2FuY2VsZmlsZSkgeworICAgICAgICAgICAgICAgIGlmICgoYzAgPSB4Z25ieXRlKEZDX1VDUzIsZnRwc25kLmluY3MsTlVMTCkpIDwgMCkgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKCh4ID0geHBuYnl0ZShjMCxUQ19VQ1MyLGZ0cHNuZC5vdXRjcyx4eG91dCkpIDwgMCkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgICAgICAgICAgLyogVGV4dCBtb2RlLCBubyB0cmFuc2xhdGlvbiAqLworICAgICAgICAgICAgd2hpbGUgKCgoYyA9IHptaW5jaGFyKCkpID4gLTEpICYmICFjYW5jZWxmaWxlKSB7CisgICAgICAgICAgICAgICAgZmZjKys7CisJCWlmICh4eG91dChjKSA8IDApCisJCSAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkID0gMDsKKyNpZm5kZWYgTk9DU0VUUworICAgICAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgICAgICBpZiAoZG91dCA9PSAtMSB8fCAoZCA9IHNlY3VyZV9mbHVzaChkb3V0KSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoZCA9PSAtMSAmJiBlcnJubyAmJiBlcnJubyAhPSBFUElQRSkKKyAgICAgICAgICAgICAgcGVycm9yKCJuZXRvdXQiKTsKKyAgICAgICAgICAgIGZ0cHNuZC5ieXRlcyA9IC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB0ZmMgKz0gZmZjOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBmaWxlIGNoYXJzICovCisjaWZkZWYgR0ZUSU1FUgorICAgIGZwZnNlY3MgPSBnZnRpbWVyKCk7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworICAgIHpjbG9zZShaSUZJTEUpOyAgICAgICAgICAgICAgICAgICAgIC8qIENsb3NlIGlucHV0IGZpbGUgKi8KKyNpZmRlZiBQSVBFU0VORAorICAgIGlmIChzbmRmaWx0ZXIpICAgICAgICAgICAgICAgICAgICAgIC8qIFVuZG8gdGhpcyAoaXQncyBwZXIgZmlsZSkgKi8KKyAgICAgIHBpcGVzZW5kID0gMDsKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisjaWZkZWYgQ0tfU1NMCisgICAgICAgIGlmIChzc2xfZnRwX2RhdGFfYWN0aXZlX2ZsYWcpIHsKKyAgICAgICAgICAgIFNTTF9zaHV0ZG93bihzc2xfZnRwX2RhdGFfY29uKTsKKyAgICAgICAgICAgIFNTTF9mcmVlKHNzbF9mdHBfZGF0YV9jb24pOworICAgICAgICAgICAgc3NsX2Z0cF9kYXRhX2FjdGl2ZV9mbGFnID0gMDsKKyAgICAgICAgICAgIHNzbF9mdHBfZGF0YV9jb24gPSBOVUxMOworICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyNpZmRlZiBUQ1BJUExJQgorICAgIHNvY2tldF9jbG9zZShkb3V0KTsgICAgICAgICAgICAgICAgIC8qIENsb3NlIGRhdGEgY29ubmVjdGlvbiAqLworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICBzaHV0ZG93bihkb3V0LCAxKzEpOworI2VuZGlmIC8qIFVTRV9TSFVURE9XTiAqLworICAgIGNsb3NlKGRvdXQpOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgZnRwc25kLnJlcGx5ID0gZ2V0cmVwbHkoMCxmdHBzbmQuaW5jcyxmdHBzbmQub3V0Y3MsZnRwX3ZibSwwKTsKKyAgICBzaWduYWwoU0lHSU5ULCBmdHBzbmQub2xkaW50cik7ICAgICAgICAgICAgLyogUHV0IGJhY2sgaW50ZXJydXB0cyAqLworI2lmZGVmIFNJR1BJUEUKKyAgICBpZiAoZnRwc25kLm9sZGludHApCisgICAgICBzaWduYWwoU0lHUElQRSwgZnRwc25kLm9sZGludHApOworI2VuZGlmIC8qIFNJR1BJUEUgKi8KKyAgICBpZiAoZnRwc25kLnJlcGx5ID09IFJFUExZX1RSQU5TSUVOVCB8fCBmdHBzbmQucmVwbHkgPT0gUkVQTFlfRVJST1IpIHsKKyAgICAgICAgZGVidWcoRjEwMSwiZG9mdHBzZW5kMiBmdHBzbmQucmVwbHkiLCIiLGZ0cHNuZC5yZXBseSk7CisgICAgICAgIGZ0cHNuZHJldCA9IC0xOworI2lmZGVmIE5UU0lHCisgICAgICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGNhbmNlbGZpbGUpIHsKKyAgICAgICAgZGVidWcoRjEwMSwiZG9mdHBzZW5kMiBjYW5jZWxlZCIsIiIsZnRwc25kLmJ5dGVzKTsKKyAgICAgICAgZnRwc25kcmV0ID0gLTE7CisjaWZkZWYgTlRTSUcKKyAgICAgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJkb2Z0cHNlbmQyIG9rIiwiIixmdHBzbmQuYnl0ZXMpOworICAgIGZ0cHNuZHJldCA9IDA7CisjaWZkZWYgTlRTSUcKKyAgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KK30KKworc3RhdGljIGludAorc2VuZHJlcXVlc3QoY21kLCBsb2NhbCwgcmVtb3RlLCB4bGF0ZSwgaW5jcywgb3V0Y3MsIHJlc3RhcnQpCisgICAgY2hhciAqY21kLCAqbG9jYWwsICpyZW1vdGU7IGludCB4bGF0ZSwgaW5jcywgb3V0Y3MsIHJlc3RhcnQ7Cit7CisgICAgaWYgKCFyZW1vdGUpIHJlbW90ZSA9ICIiOyAgICAgICAgICAgLyogQ2hlY2sgYXJncyAqLworICAgIGlmICghKnJlbW90ZSkgcmVtb3RlID0gbG9jYWw7CisgICAgaWYgKCFsb2NhbCkgbG9jYWwgPSAiIjsKKyAgICBpZiAoISpsb2NhbCkgcmV0dXJuKC0xKTsKKyAgICBpZiAoIWNtZCkgY21kID0gIiI7CisgICAgaWYgKCEqY21kKSBjbWQgPSAiU1RPUiI7CisKKyAgICBkZWJ1ZyhGMTExLCJmdHAgc2VuZHJlcXVlc3QgcmVzdGFydCIsbG9jYWwscmVzdGFydCk7CisKKyAgICBub3V0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0IG91dHB1dCBidWZmZXIgY291bnQgKi8KKyAgICBmdHBzbmQuYnl0ZXMgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBGaWxlIGlucHV0IGJ5dGUgY291bnQgKi8KKyAgICBkb3V0ID0gLTE7CisKKyNpZmRlZiBGVFBfUFJPWFkKKyAgICBpZiAocHJveHkpIHsKKyAgICAgICAgcHJveHRyYW5zKGNtZCwgbG9jYWwsIHJlbW90ZSwgIXN0cmNtcChjbWQsIlNUT1UiKSk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogRlRQX1BST1hZICovCisKKyAgICBjaGFuZ2V0eXBlKGZ0cF90eXAsMCk7ICAgICAgICAgICAgICAvKiBDaGFuZ2UgdHlwZSBmb3IgdGhpcyBmaWxlICovCisKKyAgICBmdHBzbmQub2xkaW50ciA9IE5VTEw7CQkvKiBTZXQgdXAgaW50ZXJydXB0IGhhbmRsZXIgKi8KKyAgICBmdHBzbmQub2xkaW50cCA9IE5VTEw7CisgICAgZnRwc25kLnJlc3RhcnQgPSByZXN0YXJ0OworICAgIGZ0cHNuZC54bGF0ZSA9IHhsYXRlOworICAgIGZ0cHNuZC5sbW9kZSA9ICJ3YiI7CisKKyNpZmRlZiBQSVBFU0VORCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgS2VybWl0IEFQSSBmb3IgZmlsZSBpL28uLi4gKi8KKyAgICBpZiAoc25kZmlsdGVyKSB7CisgICAgICAgIGNoYXIgKiBwID0gTlVMTCwgKiBxOworI2lmbmRlZiBOT1NQTAorICAgICAgICBpbnQgbiA9IENLTUFYUEFUSDsKKyAgICAgICAgaWYgKGNtZF9xdW90aW5nICYmIChwID0gKGNoYXIgKikgbWFsbG9jKG4gKyAxKSkpIHsKKyAgICAgICAgICAgIHEgPSBwOworICAgICAgICAgICAgZGVidWcoRjExMCwic2VuZHJlcXVlc3QgcGlwZXNlbmQgZmlsdGVyIixzbmRmaWx0ZXIsMCk7CisgICAgICAgICAgICB6enN0cmluZyhzbmRmaWx0ZXIsJnAsJm4pOworICAgICAgICAgICAgZGVidWcoRjExMSwic2VuZHJlcXVlc3QgcGlwZW5hbWUiLHEsbik7CisgICAgICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/U29ycnksIHNlbmQgZmlsdGVyICsgZmlsZW5hbWUgdG9vIGxvbmcsICVkIG1heC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIENLTUFYUEFUSAorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGZyZWUocSk7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNrc3RybmNweShmaWxuYW0scSxDS01BWFBBVEgrMSk7CisgICAgICAgICAgICBmcmVlKHEpOworICAgICAgICAgICAgbG9jYWwgPSBmaWxuYW07CisgICAgICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIH0KKworICAgIGlmIChzbmRmaWx0ZXIpICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHNlbmRpbmcgdGhydSBhIGZpbHRlciAqLworICAgICAgcGlwZXNlbmQgPSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0aGlzIGZvciBvcGVuIGFuZCBpL28gKi8KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworICAgIAorICAgIGlmIChvcGVuaShsb2NhbCkgPT0gMCkgICAgICAgICAgICAgIC8qIFRyeSB0byBvcGVuIHRoZSBpbnB1dCBmaWxlICovCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICBmdHBzbmRyZXQgPSAwOworICAgIGZ0cHNuZC5pbmNzID0gaW5jczsKKyAgICBmdHBzbmQub3V0Y3MgPSBvdXRjczsKKyAgICBmdHBzbmQuY21kID0gY21kOworICAgIGZ0cHNuZC5sb2NhbCA9IGxvY2FsOworICAgIGZ0cHNuZC5yZW1vdGUgPSByZW1vdGU7CisgICAgZnRwc25kLm9sZGludHIgPSBzaWduYWwoU0lHSU5ULCBjYW5jZWxzZW5kKTsKKyAgICBoYXZlc2lnaW50ID0gMDsKKworICAgIGlmIChjY19leGVjdXRlKGNramFkZHIoc2VuZGNhbmNlbCksIGRvZnRwc2VuZCwgZmFpbGZ0cHNlbmQpIDwgMCkKKyAgICAgIHJldHVybigtMSk7CisgICAgaWYgKGZ0cHNuZHJldCA8IDApCisgICAgICByZXR1cm4oLTEpOworICAgIGlmIChjY19leGVjdXRlKGNramFkZHIoc2VuZGNhbmNlbCksIGRvZnRwc2VuZDIsIGZhaWxmdHBzZW5kMikgPCAwKQorICAgICAgcmV0dXJuKC0xKTsKKworICAgIHJldHVybihmdHBzbmRyZXQpOworfQorCitzdGF0aWMgc2lndHlwZQorY2FuY2VscmVjdihzaWcpIGludCBzaWc7IHsKKyAgICBoYXZlc2lnaW50Kys7CisgICAgY2FuY2VsZmlsZSA9IDA7CisgICAgY2FuY2VsZ3JvdXArKzsKKyAgICBzZWN1cmVfZ2V0YygwLDEpOwkJCS8qIEluaXRpYWxpemUgbmV0IGlucHV0IGJ1ZmZlcnMgKi8KKyAgICBwcmludGYoIiBDYW5jZWxpbmcuLi5cbiIpOworICAgIGRlYnVnKEYxMDAsImZ0cCBjYW5jZWxyZWN2IGNhdWdodCBTSUdJTlQiLCIiLDApOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIGlmIChmcF9ubWwpIHsKKyAgICAgICAgaWYgKGZwX25tbCAhPSBzdGRvdXQpCisgICAgICAgICAgZmNsb3NlKGZwX25tbCk7CisgICAgICAgIGZwX25tbCA9IE5VTEw7CisgICAgfQorI2lmbmRlZiBPUzIKKyAgICBsb25nam1wKHJlY3ZjYW5jZWwsIDEpOworI2Vsc2UKKyAgICBQb3N0Q3RybENTZW0oKTsKKyNlbmRpZiAvKiBPUzIgKi8KK30KKworLyogQXJndW1lbnRsZXNzIGZyb250LWVuZCBmb3Igc2VjdXJlX2dldGMoKSAqLworCitzdGF0aWMgaW50CituZXRnZXRjKCkgeworICAgIHJldHVybihzZWN1cmVfZ2V0YyhnbG9iYWxkaW4sMCkpOworfQorCisvKiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUsIDAgb24gc3VjY2VzcywgMSBpZiBmaWxlIHNraXBwZWQgKi8KKworLyoKKyAgU2V0cyBmdHBjb2RlIDwgMCBvbiBmYWlsdXJlIGlmIGZhaWx1cmUgcmVhc29uIGlzIG5vdCBzZXJ2ZXIgcmVwbHkgY29kZToKKyAgICAtMTogaW50ZXJydXB0ZWQgYnkgdXNlci4KKyAgICAtMjogZXJyb3Igb3BlbmluZyBvciB3cml0aW5nIG91dHB1dCBmaWxlIChyZWFzb24gaW4gZXJybm8pLgorICAgIC0zOiBmYWlsdXJlIHRvIG1ha2UgZGF0YSBjb25uZWN0aW9uLgorICAgIC00OiBuZXR3b3JrIHJlYWQgZXJyb3IgKHJlYXNvbiBpbiBlcnJubykuCisqLworCitzdHJ1Y3QgeHhfZnRwcmVjdiB7CisgICAgaW50IHJlcGx5OworICAgIGludCBmY3M7CisgICAgaW50IHJjczsKKyAgICBpbnQgcmVjb3ZlcjsKKyAgICBpbnQgeGxhdGU7CisgICAgaW50IGRpbjsKKyAgICBpbnQgaXNfcmV0cjsKKyAgICBzaWdfdCBvbGRpbnRyLCBvbGRpbnRwOworICAgIGNoYXIgKiBjbWQ7CisgICAgY2hhciAqIGxvY2FsOworICAgIGNoYXIgKiByZW1vdGU7CisgICAgY2hhciAqIGxtb2RlOworICAgIGNoYXIgKiBwaXBlbmFtZTsKKyAgICBpbnQgICAgdGNyZmxhZzsKKyAgICBsb25nICAgbG9jYWxzaXplOworfTsKK3N0YXRpYyBzdHJ1Y3QgeHhfZnRwcmVjdiBmdHByZWN2OworCitzdGF0aWMgaW50IGZ0cHJlY3ZyZXQgPSAwOworCitzdGF0aWMgVk9JRAorI2lmZGVmIENLX0FOU0lDCitmYWlsZnRwcmVjdihWT0lEICogdGhyZWFkaW5mbykKKyNlbHNlCitmYWlsZnRwcmVjdih0aHJlYWRpbmZvKSBWT0lEICogdGhyZWFkaW5mbzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworI2lmZGVmIE5UU0lHCisgICAgaWYgKHRocmVhZGluZm8pIHsgICAgICAgICAgICAgICAgICAgLyogVGhyZWFkIGxvY2FsIHN0b3JhZ2UuLi4gKi8KKyAgICAgICAgVGxzU2V0VmFsdWUoVGxzSW5kZXgsdGhyZWFkaW5mbyk7CisgICAgICAgIGRlYnVnKEYxMDAsICJkb2NtZGZpbGUgY2FsbGVkIHdpdGggdGhyZWFkaW5mbyBibG9jayIsIiIsIDApOworICAgIH0gZWxzZSBkZWJ1ZyhGMTAwLCAiZG9jbWRmaWxlIC0gdGhyZWFkaW5mbyBpcyBOVUxMIiwgIiIsIDApOworI2VuZGlmIC8qIE5UU0lHICovCisKKyNpZmRlZiBDS19MT0dJTgorI2lmZGVmIElLU0QKKyNpZmRlZiBOVAorICAgIGlmIChpbnNlcnZlcikKKyAgICAgIHNldG50Y3JlZHMoKTsKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIElLU0QgKi8KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCisgICAgd2hpbGUgKGNwZW5kKSB7CisgICAgICAgIGZ0cHJlY3YucmVwbHkgPSBnZXRyZXBseSgwLGZ0cHJlY3YuZmNzLGZ0cHJlY3YucmNzLGZ0cF92Ym0sMCk7CisgICAgfQorICAgIGlmIChkYXRhID49IDApIHsKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgaWYgKHNzbF9mdHBfZGF0YV9hY3RpdmVfZmxhZykgeworICAgICAgICAgICAgU1NMX3NodXRkb3duKHNzbF9mdHBfZGF0YV9jb24pOworICAgICAgICAgICAgU1NMX2ZyZWUoc3NsX2Z0cF9kYXRhX2Nvbik7CisgICAgICAgICAgICBzc2xfZnRwX2RhdGFfYWN0aXZlX2ZsYWcgPSAwOworICAgICAgICAgICAgc3NsX2Z0cF9kYXRhX2NvbiA9IE5VTEw7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICBzb2NrZXRfY2xvc2UoZGF0YSk7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworI2lmZGVmIFVTRV9TSFVURE9XTgorICAgICAgICBzaHV0ZG93bihkYXRhLCAxKzEpOworI2VuZGlmIC8qIFVTRV9TSFVURE9XTiAqLworICAgICAgICBjbG9zZShkYXRhKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgICBkYXRhID0gLTE7CisgICAgICAgIGdsb2JhbGRpbiA9IC0xOworICAgIH0KKyAgICBpZiAoZnRwcmVjdi5vbGRpbnRyKQorICAgICAgc2lnbmFsKFNJR0lOVCwgZnRwcmVjdi5vbGRpbnRyKTsKKyAgICBmdHBjb2RlID0gLTE7CisgICAgZnRwcmVjdnJldCA9IC0xOworCisjaWZuZGVmIE9TMgorICAgIC8qIFRFU1QgTUUgSU4gSzk1ICovCisgICAgaWYgKGhhdmVzaWdpbnQpIHsKKwloYXZlc2lnaW50ID0gMDsKKwlkZWJ1ZyhGMTAwLCJmdHAgZmFpbGZ0cHJlY3YgY2hhaW4gdG8gdHJhcCgpLi4uIiwiIiwwKTsKKwlpZiAoZnRwcmVjdi5vbGRpbnRyICE9IFNJR19JR04pCisJICAoKmZ0cHJlY3Yub2xkaW50cikoU0lHSU5UKTsKKwkvKiBOT1RSRUFDSEVEIChJIGhvcGUhKSAqLworCWRlYnVnKEYxMDAsImZ0cCBmYWlsZnRwcmVjdiByZXR1cm4gZnJvbSB0cmFwKCkuLi4iLCIiLDApOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2RvZnRwcmVjdihWT0lEICogdGhyZWFkaW5mbykKKyNlbHNlCitkb2Z0cHJlY3YodGhyZWFkaW5mbykgVk9JRCAqIHRocmVhZGluZm87CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyNpZmRlZiBOVFNJRworICAgIGlmICh0aHJlYWRpbmZvKSB7ICAgICAgICAgICAgICAgICAgIC8qIFRocmVhZCBsb2NhbCBzdG9yYWdlLi4uICovCisgICAgICAgIFRsc1NldFZhbHVlKFRsc0luZGV4LHRocmVhZGluZm8pOworICAgICAgICBkZWJ1ZyhGMTAwLCAiZG9jbWRmaWxlIGNhbGxlZCB3aXRoIHRocmVhZGluZm8gYmxvY2siLCIiLCAwKTsKKyAgICB9IGVsc2UgZGVidWcoRjEwMCwgImRvY21kZmlsZSAtIHRocmVhZGluZm8gaXMgTlVMTCIsICIiLCAwKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworI2lmZGVmIENLX0xPR0lOCisjaWZkZWYgSUtTRAorI2lmZGVmIE5UCisgICAgaWYgKGluc2VydmVyKQorICAgICAgc2V0bnRjcmVkcygpOworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogSUtTRCAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisKKyNpZm5kZWYgQ09NTUVOVAorICAgIGlmICghb3V0MnNjcmVlbiAmJiAhZnRwcmVjdi5waXBlbmFtZSkgeworCWludCB4OworCWNoYXIgKiBsb2NhbDsKKwlsb2NhbCA9IGZ0cHJlY3YubG9jYWw7CisJeCA9IHpjaGtvKGxvY2FsKTsKKyAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICBpZiAoKCFkcHlhY3RpdmUgfHwgZnRwX2RlYikpCisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorCQkgICAgICAiVGVtcG9yYXJ5IGZpbGUgJXM6ICVzXG4iLCBmdHByZWN2LmxvY2FsLCBja19lcnJzdHIoKSk7CisgICAgICAgICAgICBzaWduYWwoU0lHSU5ULCBmdHByZWN2Lm9sZGludHIpOworICAgICAgICAgICAgZnRwY29kZSA9IC0yOworICAgICAgICAgICAgZnRwcmVjdnJldCA9IC0xOworI2lmZGVmIE5UU0lHCisgICAgICAgICAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBjaGFuZ2V0eXBlKCghZnRwcmVjdi5pc19yZXRyKSA/IEZUVF9BU0MgOiBmdHBfdHlwLCAwKTsKKyAgICBpZiAoaW5pdGNvbm4oKSkgeyAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBkYXRhIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgc2lnbmFsKFNJR0lOVCwgZnRwcmVjdi5vbGRpbnRyKTsKKyAgICAgICAgZnRwY29kZSA9IC0xOworICAgICAgICBmdHByZWN2cmV0ID0gLTM7CisjaWZkZWYgTlRTSUcKKyAgICAgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZWN1cmVfZ2V0YygwLDEpOwkJCS8qIEluaXRpYWxpemUgbmV0IGlucHV0IGJ1ZmZlcnMgKi8KKyAgICBmdHByZWN2cmV0ID0gMDsKKworI2lmZGVmIE5UU0lHCisgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KK30KKworc3RhdGljIFZPSUQKKyNpZmRlZiBDS19BTlNJQworZmFpbGZ0cHJlY3YyKFZPSUQgKiB0aHJlYWRpbmZvKQorI2Vsc2UKK2ZhaWxmdHByZWN2Mih0aHJlYWRpbmZvKSBWT0lEICogdGhyZWFkaW5mbzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworI2lmZGVmIE5UU0lHCisgICAgaWYgKHRocmVhZGluZm8pIHsgICAgICAgICAgICAgICAgICAgLyogVGhyZWFkIGxvY2FsIHN0b3JhZ2UuLi4gKi8KKyAgICAgICAgVGxzU2V0VmFsdWUoVGxzSW5kZXgsdGhyZWFkaW5mbyk7CisgICAgICAgIGRlYnVnKEYxMDAsICJkb2NtZGZpbGUgY2FsbGVkIHdpdGggdGhyZWFkaW5mbyBibG9jayIsIiIsIDApOworICAgIH0gZWxzZSBkZWJ1ZyhGMTAwLCAiZG9jbWRmaWxlIC0gdGhyZWFkaW5mbyBpcyBOVUxMIiwgIiIsIDApOworI2VuZGlmIC8qIE5UU0lHICovCisjaWZkZWYgQ0tfTE9HSU4KKyNpZmRlZiBJS1NECisjaWZkZWYgTlQKKyAgICBpZiAoaW5zZXJ2ZXIpCisgICAgICBzZXRudGNyZWRzKCk7CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBJS1NEICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKworICAgIC8qIENhbmNlbCB1c2luZyBSRkM5NTkgcmVjb21tZW5kZWQgSVAsU1lOQyBzZXF1ZW5jZSAgKi8KKworICAgIGRlYnVnKEYxMDAsImZ0cCByZWN2cmVxdWVzdCBDQU5DRUwiLCIiLDApOworI2lmZGVmIEdGVElNRVIKKyAgICBmcGZzZWNzID0gZ2Z0aW1lcigpOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyNpZmRlZiBTSUdQSVBFCisgICAgaWYgKGZ0cHJlY3Yub2xkaW50cCkKKyAgICAgIHNpZ25hbChTSUdQSVBFLCBmdHByZWN2Lm9sZGludHIpOworI2VuZGlmIC8qIFNJR1BJUEUgKi8KKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKyAgICBpZiAoIWNwZW5kKSB7CisgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyAgICAgICAgc2lnbmFsKFNJR0lOVCwgZnRwcmVjdi5vbGRpbnRyKTsKKyAgICAgICAgZnRwcmVjdnJldCA9IC0xOworI2lmZGVmIE5UU0lHCisgICAgICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FuY2VsX3JlbW90ZShmdHByZWN2LmRpbik7CisgICAgaWYgKGZ0cGNvZGUgPiAtMSkKKyAgICAgIGZ0cGNvZGUgPSAtMTsKKyAgICBpZiAoZGF0YSA+PSAwKSB7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgIGlmIChzc2xfZnRwX2RhdGFfYWN0aXZlX2ZsYWcpIHsKKyAgICAgICAgICAgIFNTTF9zaHV0ZG93bihzc2xfZnRwX2RhdGFfY29uKTsKKyAgICAgICAgICAgIFNTTF9mcmVlKHNzbF9mdHBfZGF0YV9jb24pOworICAgICAgICAgICAgc3NsX2Z0cF9kYXRhX2FjdGl2ZV9mbGFnID0gMDsKKyAgICAgICAgICAgIHNzbF9mdHBfZGF0YV9jb24gPSBOVUxMOworICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgc29ja2V0X2Nsb3NlKGRhdGEpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgc2h1dGRvd24oZGF0YSwgMSsxKTsKKyNlbmRpZiAvKiBVU0VfU0hVVERPV04gKi8KKyAgICAgICAgY2xvc2UoZGF0YSk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgZGF0YSA9IC0xOworICAgICAgICBnbG9iYWxkaW4gPSAtMTsKKyAgICB9CisgICAgaWYgKCFvdXQyc2NyZWVuKSB7CisJaW50IHggPSAwOworCWRlYnVnKEYxMTEsImZ0cCBmYWlscmVjdjIgemNsb3NlIixmdHByZWN2LmxvY2FsLGtlZXApOworCXpjbG9zZShaT0ZJTEUpOworCXN3aXRjaCAoa2VlcCkgewkJCS8qIHdoaWNoIGlzLi4uICovCisJICBjYXNlIFNFVF9BVVRPOgkJLyogQVVUTyAqLworCSAgICBpZiAoY3VydHlwZSA9PSBGVFRfQVNDKQkvKiBEZWxldGUgZmlsZSBpZiBUWVBFIEEuICovCisJICAgICAgeCA9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSBTRVRfT0ZGOgkJCS8qIERJU0NBUkQgKi8KKwkgICAgeCA9IDE7CQkJLyogRGVsZXRlIGZpbGUsIHBlcmlvZC4gKi8KKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgkJCS8qIEtFRVAgKi8KKwkgICAgYnJlYWs7CisJfQorCWlmICh4KSB7CisJICAgIHggPSB6ZGVsZXQoZnRwcmVjdi5sb2NhbCk7CisJICAgIGRlYnVnKEYxMTEsImZ0cCBmYWlscmVjdjIgZGVsZXRlIGluY29tcGxldGUiLGZ0cHJlY3YubG9jYWwseCk7CisJfQorICAgIH0KKyAgICBpZiAoZnRwcmVjdi5kaW4pIHsKKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICBzb2NrZXRfY2xvc2UoZnRwcmVjdi5kaW4pOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgc2h1dGRvd24oZnRwcmVjdi5kaW4sIDErMSk7CisjZW5kaWYgLyogVVNFX1NIVVRET1dOICovCisgICAgICAgIGNsb3NlKGZ0cHJlY3YuZGluKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgIH0KKyAgICBzaWduYWwoU0lHSU5ULCBmdHByZWN2Lm9sZGludHIpOworICAgIGZ0cHJlY3ZyZXQgPSAtMTsKKworICAgIGlmIChoYXZlc2lnaW50KSB7CisJaGF2ZXNpZ2ludCA9IDA7CisJZGVidWcoRjEwMCwiRlRQIGZhaWxmdHByZWN2MiBjaGFpbiB0byB0cmFwKCkuLi4iLCIiLDApOworI2lmZGVmIE9TMgorICAgICAgICBkZWJ1ZyhGMTAwLCJGVFAgZmFpbGZ0cHJlY3YyIFBvc3RDdHJsQ1NlbSgpLi4uIiwiIiwwKTsKKyAgICAgICAgUG9zdEN0cmxDU2VtKCk7CisjZWxzZSAvKiBPUzIgKi8KKwlpZiAoZnRwcmVjdi5vbGRpbnRyICE9IFNJR19JR04pCisJICAoKmZ0cHJlY3Yub2xkaW50cikoU0lHSU5UKTsKKwkvKiBOT1RSRUFDSEVEIChJIGhvcGUhKSAqLworCWRlYnVnKEYxMDAsImZ0cCBmYWlsZnRwcmVjdjIgcmV0dXJuIGZyb20gdHJhcCgpLi4uIiwiIiwwKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB9Cit9CisKK3N0YXRpYyBWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2RvZnRwcmVjdjIoVk9JRCAqIHRocmVhZGluZm8pCisjZWxzZQorZG9mdHByZWN2Mih0aHJlYWRpbmZvKSBWT0lEICogdGhyZWFkaW5mbzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHJlZ2lzdGVyIGludCBjLCBkOworICAgIGxvbmcgYnl0ZXMgPSAwTDsKKyAgICBpbnQgYmFyZV9sZnMgPSAwOworICAgIGludCBibGtzaXplID0gMDsKKyAgICBVTE9ORyBzdGFydCA9IDBMLCBzdG9wOworICAgIGNoYXIgKiBwOworICAgIHN0YXRpYyBjaGFyICogcmN2YnVmID0gTlVMTDsKKyAgICBzdGF0aWMgaW50IHJjdmJ1ZnNpeiA9IDA7CisjaWZkZWYgQ0tfVVJMCisgICAgY2hhciBuZXduYW1lW0NLTUFYUEFUSCsxXTsJCS8qIEZvciBmaWxlIGRpYWxvZyAqLworI2VuZGlmIC8qIENLX1VSTCAqLworICAgIGV4dGVybiBpbnQgYWRsX2FzazsKKworICAgIGZ0cHJlY3YuZGluID0gLTE7CisjaWZkZWYgTlRTSUcKKyAgICBpZiAodGhyZWFkaW5mbykgeyAgICAgICAgICAgICAgICAgICAvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZS4uLiAqLworICAgICAgICBUbHNTZXRWYWx1ZShUbHNJbmRleCx0aHJlYWRpbmZvKTsKKyAgICAgICAgZGVidWcoRjEwMCwgImRvY21kZmlsZSBjYWxsZWQgd2l0aCB0aHJlYWRpbmZvIGJsb2NrIiwiIiwgMCk7CisgICAgfSBlbHNlIGRlYnVnKEYxMDAsICJkb2NtZGZpbGUgLSB0aHJlYWRpbmZvIGlzIE5VTEwiLCAiIiwgMCk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyNpZmRlZiBDS19MT0dJTgorI2lmZGVmIElLU0QKKyNpZmRlZiBOVAorICAgIGlmIChpbnNlcnZlcikKKyAgICAgIHNldG50Y3JlZHMoKTsKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIElLU0QgKi8KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCisgICAgaWYgKGZ0cHJlY3YucmVjb3ZlcikgeyAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWF0ZSByZWNvdmVyeSAqLworICAgICAgICB4ID0gZnRwY21kKCJSRVNUIixja2x0b2EoZnRwcmVjdi5sb2NhbHNpemUpLC0xLC0xLGZ0cF92Ym0pOworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgcmVwbHkiLCJSRVNUIix4KTsKKyAgICAgICAgaWYgKHggPT0gUkVQTFlfQ09OVElOVUUpIHsKKyAgICAgICAgICAgIGZ0cHJlY3YubG1vZGUgPSAiYWIiOworICAgICAgICAgICAgcnNfbGVuID0gZnRwcmVjdi5sb2NhbHNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmdHByZWN2LnJlY292ZXIgPSAwOworICAgICAgICB9CisgICAgfQorICAgIC8qIElNUE9SVEFOVDogTm8gRlRQIGNvbW1hbmRzIGNhbiBjb21lIGJldHdlZW4gUkVTVCBhbmQgUkVUUiEgKi8KKworICAgIGRlYnVnKEYxMTEsImZ0cCByZWN2cmVxdWVzdCByZWNvdmVyIEUiLGZ0cHJlY3YucmVtb3RlLGZ0cHJlY3YucmVjb3Zlcik7CisKKyAgICAvKiBTZW5kIHRoZSBjb21tYW5kIGFuZCBnZXQgcmVwbHkgKi8KKyAgICBkZWJ1ZyhGMTEwLCJmdHAgcmVjdnJlcXVlc3QgY21kIixmdHByZWN2LmNtZCwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJmdHAgcmVjdnJlcXVlc3QgcmVtb3RlIixmdHByZWN2LnJlbW90ZSwwKTsKKworICAgIGlmIChmdHBjbWQoZnRwcmVjdi5jbWQsZnRwcmVjdi5yZW1vdGUsZnRwcmVjdi5mY3MsZnRwcmVjdi5yY3MsZnRwX3ZibSkKKwkhPSBSRVBMWV9QUkVMSU0pIHsKKyAgICAgICAgc2lnbmFsKFNJR0lOVCwgZnRwcmVjdi5vbGRpbnRyKTsgLyogQmFkIHJlcGx5LCBmYWlsLiAqLworICAgICAgICBmdHByZWN2cmV0ID0gLTE7CQkvKiBmdHBjb2RlIGlzIHNldCBieSBmdHBjbWQoKSAqLworI2lmZGVmIE5UU0lHCisgICAgICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZnRwcmVjdi5kaW4gPSBkYXRhY29ubigiciIpOyAgICAgICAgLyogR29vZCByZXBseSwgb3BlbiBkYXRhIGNvbm5lY3Rpb24gKi8KKyAgICBnbG9iYWxkaW4gPSBmdHByZWN2LmRpbjsgICAgICAgICAgICAvKiBHbG9iYWwgY29weSBvZiBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgICBpZiAoZnRwcmVjdi5kaW4gPT0gLTEpIHsgICAgICAgICAgICAvKiBDaGVjayBmb3IgZmFpbHVyZSAqLworICAgICAgICBmdHBjb2RlID0gLTM7ICAgICAgICAgICAgICAgICAgIC8qIENvZGUgZm9yIG5vIGRhdGEgY29ubmVjdGlvbiAqLworICAgICAgICBmdHByZWN2cmV0ID0gLTE7CisjaWZkZWYgTlRTSUcKKyAgICAgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBDS19VUkwKKyAgICAvKiBJbiBLOTUgR1VJIHB1dCB1cCBhIGZpbGUgYm94ICovCisgICAgaWYgKGhhdmV1cmwgJiYgZ191cmwucHRoICYmIGFkbF9hc2sJKSB7IC8qIERvd25sb2FkaW5nIGZyb20gYSBVUkwgKi8KKwlpbnQgeDsKKwljaGFyICogcHJlZmFjZSA9CisiXHJcbkluY29taW5nIGZpbGUgZnJvbSBGVFAgc2VydmVyLi4uXHJcblwKK1BsZWFzZSBjb25maXJtIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24gb3Igc3VwcGx5IGFuIGFsdGVybmF0aXZlOiI7CisKKwl4ID0gdXFfZmlsZShwcmVmYWNlLAkJLyogSzk1IEdVSTogUHV0IHVwIGZpbGUgYm94LiAqLworCQkgICAgTlVMTCwKKwkJICAgIDQsCisJCSAgICBOVUxMLAorCQkgICAgZnRwcmVjdi5sb2NhbCA/IGZ0cHJlY3YubG9jYWwgOiBmdHByZWN2LnJlbW90ZSwKKwkJICAgIG5ld25hbWUsCisJCSAgICBDS01BWFBBVEgrMQorCQkgICAgKTsKKwlpZiAoeCA+IDApIHsKKwkgICAgZnRwcmVjdi5sb2NhbCA9IG5ld25hbWU7CS8qIFN1YnN0aXR1dGUgdXNlcidzIGZpbGUgbmFtZSAqLworCSAgICBpZiAoeCA9PSAyKQkJCS8qIEFuZCBhcHBlbmQgaWYgdXNlciBzYWlkIHRvICovCisJICAgICAgZnRwcmVjdi5sbW9kZSA9ICJhYiI7CisJfQorICAgIH0KKyNlbmRpZiAvKiBDS19VUkwgKi8KKyAgICB4ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgZmlsZSBvcGVuIE9LPyAqLworICAgIGlmIChmdHByZWN2LnBpcGVuYW1lKSB7CQkvKiBDb21tYW5kICovCisgICAgICAgIHggPSB6eGNtZChaT0ZJTEUsZnRwcmVjdi5waXBlbmFtZSk7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCByZWN2cmVxdWVzdCB6eGNtZCIsZnRwcmVjdi5waXBlbmFtZSx4KTsKKyAgICB9IGVsc2UgaWYgKCFvdXQyc2NyZWVuKSB7ICAgICAgICAgICAvKiBGaWxlICovCisgICAgICAgIHN0cnVjdCBmaWxpbmZvIHh4OworICAgICAgICB4eC5icyA9IDA7IHh4LmNzID0gMDsgeHgucmwgPSAwOyB4eC5vcmcgPSAwOyB4eC5jYyA9IDA7CisgICAgICAgIHh4LnR5cCA9IDA7IHh4Lm9zX3NwZWNpZmljID0gTlVMOyB4eC5sYmxvcHRzID0gMDsKKwkvKiBBcHBlbmQgb3IgTmV3ICovCisgICAgICAgIHh4LmRzcCA9ICFzdHJjbXAoZnRwcmVjdi5sbW9kZSwiYWIiKSA/IFhZRlpfQSA6IFhZRlpfTjsKKyAgICAgICAgeCA9IHpvcGVubyhaT0ZJTEUsZnRwcmVjdi5sb2NhbCxOVUxMLCZ4eCk7CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCByZWN2cmVxdWVzdCB6b3Blbm8iLGZ0cHJlY3YubG9jYWwseCk7CisgICAgfQorICAgIGlmICh4IDwgMSkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhaWx1cmUgdG8gb3BlbiBvdXRwdXQgZmlsZSAqLworICAgICAgICBpZiAoKCFkcHlhY3RpdmUgfHwgZnRwX2RlYikpCisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsb2NhbCgyKTogJXM6ICVzXG4iLCBmdHByZWN2LmxvY2FsLCBja19lcnJzdHIoKSk7CisgICAgICAgIGZ0cHJlY3ZyZXQgPSAtMTsKKyNpZmRlZiBOVFNJRworICAgICAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJsa3NpemUgPSBGVFBfQlVGU0laOyAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGlucHV0IGJ1ZmZlciAqLworCisgICAgZGVidWcoRjEwMSwiZnRwIHJlY3ZyZXF1ZXN0IGJsa3NpemUiLCIiLGJsa3NpemUpOworICAgIGRlYnVnKEYxMDEsImZ0cCByZWN2cmVxdWVzdCByY3ZidWZzaXoiLCIiLHJjdmJ1ZnNpeik7CisKKyAgICBpZiAocmN2YnVmc2l6IDwgYmxrc2l6ZSkgeyAgICAgICAgICAvKiBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgaWYgKHJjdmJ1ZikgeworICAgICAgICAgICAgZnJlZShyY3ZidWYpOworICAgICAgICAgICAgcmN2YnVmID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByY3ZidWYgPSAoY2hhciAqKW1hbGxvYygodW5zaWduZWQpYmxrc2l6ZSk7CisgICAgICAgIGlmICghcmN2YnVmKSB7CisJICAgIGRlYnVnKEYxMDAsImZ0cCBnZXQgcmN2YnVmIG1hbGxvYyBmYWlsZWQiLCIiLDApOworICAgICAgICAgICAgZnRwY29kZSA9IC0yOworI2lmZGVmIEVOT01FTQorICAgICAgICAgICAgZXJybm8gPSBFTk9NRU07CisjZW5kaWYgLyogRU5PTUVNICovCisgICAgICAgICAgICBpZiAoKCFkcHlhY3RpdmUgfHwgZnRwX2RlYikpCisgICAgICAgICAgICAgIHBlcnJvcigibWFsbG9jIik7CisgICAgICAgICAgICByY3ZidWZzaXogPSAwOworICAgICAgICAgICAgZnRwcmVjdnJldCA9IC0xOworI2lmZGVmIE5UU0lHCisgICAgICAgICAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisJZGVidWcoRjEwMSwiZnRwIGdldCByY3ZidWYgbWFsbG9jIG9rIiwiIixibGtzaXplKTsKKyAgICAgICAgcmN2YnVmc2l6ID0gYmxrc2l6ZTsKKyAgICB9CisgICAgZGVidWcoRjExMSwiZnRwIGdldCByY3ZidWZzaXoiLGZ0cHJlY3YubG9jYWwscmN2YnVmc2l6KTsKKworICAgIGZmYyA9IDBMOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoYXJhY3RlciBjb3VudGVyICovCisgICAgY3BzID0gb2xkY3BzID0gMEw7ICAgICAgICAgICAgICAgICAgLyogVGhydXB1dCAqLworICAgIHN0YXJ0ID0gZ21zdGltZXIoKTsgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IHRpbWUgKG1zZWNzKSAqLworI2lmZGVmIEdGVElNRVIKKyAgICByZnRpbWVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCB0aW1lIChmbG9hdCkgKi8KKyNlbmRpZiAvKiBHRlRJTUVSICovCisKKyAgICBkZWJ1ZyhGMTExLCJmdHAgZ2V0IHR5cGUiLGZ0cHJlY3YubG9jYWwsY3VydHlwZSk7CisgICAgZGVidWcoRjEwMSwiZnRwIHJlY3ZyZXF1ZXN0IGZ0cF9kcGwiLCIiLGZ0cF9kcGwpOworICAgIHN3aXRjaCAoY3VydHlwZSkgeworICAgICAgY2FzZSBGVFRfQklOOiAgICAgICAgICAgICAgICAgICAgIC8qIEJpbmFyeSBtb2RlICovCisgICAgICBjYXNlIEZUVF9URU46ICAgICAgICAgICAgICAgICAgICAgLyogVEVORVggbW9kZSAqLworICAgICAgICBkID0gMDsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgIGMgPSBzZWN1cmVfcmVhZChmdHByZWN2LmRpbiwgcmN2YnVmLCByY3ZidWZzaXopOworICAgICAgICAgICAgaWYgKGNhbmNlbGZpbGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsZnRwcmVjdjIodGhyZWFkaW5mbyk7CisjaWZkZWYgTlRTSUcKKyAgICAgICAgICAgICAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjIDwgMSkKKyAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgcHJpbnRmICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKFdoYXQgaWYgaXQgaXNuJ3Q/KSAqLworICAgICAgICAgICAgaWYgKG91dDJzY3JlZW4gJiYgIWZ0cHJlY3YucGlwZW5hbWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlYyIscmN2YnVmW2ldKTsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIHByaW50ZiAqLworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgYykgeworICAgICAgICAgICAgICAgICAgICBpZiAoem1jaG91dChyY3ZidWZbaSsrXSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZXMgKz0gYzsKKyAgICAgICAgICAgIGZmYyArPSBjOworICAgICAgICB9CisgICAgICAgIGlmIChjIDwgMCkgeworICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIHJlY3ZyZXF1ZXN0IGVycm5vIixja2l0b2EoYyksZXJybm8pOworICAgICAgICAgICAgaWYgKGMgPT0gLTEgJiYgZXJybm8gIT0gRVBJUEUpCisgICAgICAgICAgICAgIGlmICgoIWRweWFjdGl2ZSB8fCBmdHBfZGViKSkKKyAgICAgICAgICAgICAgICBwZXJyb3IoIm5ldGluIik7CisgICAgICAgICAgICBieXRlcyA9IC0xOworICAgICAgICAgICAgZnRwY29kZSA9IC00OworICAgICAgICB9CisgICAgICAgIGlmIChkIDwgYykgeworICAgICAgICAgICAgZnRwY29kZSA9IC0yOworICAgICAgICAgICAgaWYgKCghZHB5YWN0aXZlIHx8IGZ0cF9kZWIpKSB7CisgICAgICAgICAgICAgICAgY2hhciAqIHA7CisgICAgICAgICAgICAgICAgcCA9IGZ0cHJlY3YubG9jYWwgPyBmdHByZWN2LmxvY2FsIDogZnRwcmVjdi5waXBlbmFtZTsKKyAgICAgICAgICAgICAgICBpZiAoZCA8IDApCisgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKwkJCSAgImxvY2FsKDMpOiAlczogJXNcbiIsIGZ0cHJlY3YubG9jYWwsIGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKwkJCSAgIiVzOiBzaG9ydCB3cml0ZVxuIiwgZnRwcmVjdi5sb2NhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRlRUX0FTQzogICAgICAgICAgICAgICAgICAgICAvKiBUZXh0IG1vZGUgKi8KKwlkZWJ1ZyhGMTAxLCJmdHAgcmVjdnJlcXVlc3QgVFlQRSBBIHhsYXRlIiwiIixmdHByZWN2LnhsYXRlKTsKKyNpZm5kZWYgTk9DU0VUUworICAgICAgICBpZiAoZnRwcmVjdi54bGF0ZSkgeworICAgICAgICAgICAgaW50IHQ7CisjaWZkZWYgQ0tfQU5TSUMKKyAgICAgICAgICAgIGludCAoKmZuKShjaGFyKTsKKyNlbHNlCisgICAgICAgICAgICBpbnQgKCpmbikoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIHJlY3ZyZXF1ZXN0IChkYXRhKSIsImluaXR4bGF0ZSIsMCk7CisgICAgICAgICAgICBpbml0eGxhdGUoZnRwcmVjdi5yY3MsZnRwcmVjdi5mY3MpOyAgICAgICAgIC8qIChGcm9tLFRvKSAqLworICAgICAgICAgICAgaWYgKGZ0cHJlY3YucGlwZW5hbWUpIHsKKyAgICAgICAgICAgICAgICBmbiA9IHBpcGVvdXQ7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIHJlY3ZyZXF1ZXN0IEFTQ0lJIiwicGlwZW91dCIsMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZuID0gb3V0MnNjcmVlbiA/IHNjcm5vdXQgOiBwdXRmaWw7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIHJlY3ZyZXF1ZXN0IEFTQ0lJIiwKKyAgICAgICAgICAgICAgICAgICAgICBvdXQyc2NyZWVuID8gInNjcm5vdXQiIDogInB1dGZpbCIsMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoMSkgeworCQkvKiBHZXQgYnl0ZSBmcm9tIG5ldCAqLworICAgICAgICAgICAgICAgIGMwID0geGduYnl0ZShGQ19VQ1MyLGZ0cHJlY3YucmNzLG5ldGdldGMpOworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxmaWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWxmdHByZWN2Mih0aHJlYWRpbmZvKTsKKyNpZmRlZiBOVFNJRworICAgICAgICAgICAgICAgICAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjMCA8IDApCisgICAgICAgICAgICAgICAgICBicmVhazsKKwkJLyogU2Vjb25kIGJ5dGUgZnJvbSBuZXQgKi8KKyAgICAgICAgICAgICAgICBjMSA9IHhnbmJ5dGUoRkNfVUNTMixmdHByZWN2LnJjcyxuZXRnZXRjKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsZmlsZSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsZnRwcmVjdjIodGhyZWFkaW5mbyk7CisjaWZkZWYgTlRTSUcKKyAgICAgICAgICAgICAgICAgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYzEgPCAwKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgQ09NTUVOVAorCQkvKiBLOTU6IENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0aGlzICovCisJCWlmIChmaWxlb3JkZXIgPiAwKQkvKiBMaXR0bGUgRW5kaWFuICovCisJCSAgYnl0c3dhcCgmYzAsJmMxKTsJLyogc3dhcCBieXRlcyovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgaWYgKCBvdXQyc2NyZWVuICYmICAgICAgICAgICAgLyogd2UncmUgdHJhbnNsYXRpbmcgdG8gVUNTLTIgKi8gCisgICAgICAgICAgICAgICAgICAgICAhazk1c3Rkb3V0ICYmICFpbnNlcnZlcikgLyogZm9yIHRoZSByZWFsIHNjcmVlbi4uLiAqLyAgICAgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgdWNzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICBieXRlc1syXTsKKyAgICAgICAgICAgICAgICAgICAgfSBvdXRwdXQ7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmJ5dGVzWzBdID0gYzE7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5ieXRlc1sxXSA9IGMwOworCisgICAgICAgICAgICAgICAgICAgIFZzY3JuV3J0VUNTMlN0ckF0dChWQ01ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC51Y3MyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJleVtWQ01EXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJleFtWQ01EXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcmNtZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSAKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9IHhwbmJ5dGUoYzAsVENfVUNTMixmdHByZWN2LmZjcyxmbikpIDwgMCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9IHhwbmJ5dGUoYzEsVENfVUNTMixmdHByZWN2LmZjcyxmbikpIDwgMCkgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgICAgYyA9IHNlY3VyZV9nZXRjKGZ0cHJlY3YuZGluLDApOworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxmaWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWxmdHByZWN2Mih0aHJlYWRpbmZvKTsKKyNpZmRlZiBOVFNJRworICAgICAgICAgICAgICAgICAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBjID09IEVPRikKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFVOSVgKKwkJLyogUmVjb3JkIGZvcm1hdCBjb252ZXJzaW9uIGZvciBVbml4ICovCisJCS8qIFNLSVAgVEhJUyBGT1IgV0lORE9XUyEgKi8KKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgYmFyZV9sZnMrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYyA9PSAnXHInKSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzKys7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYyA9IHNlY3VyZV9nZXRjKGZ0cHJlY3YuZGluLDApKSAhPSAnXG4nIHx8CisJCQlmdHByZWN2LnRjcmZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5jZWxmaWxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGZ0cHJlY3YyKHRocmVhZGluZm8pOworI2lmZGVmIE5UU0lHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgYyA9PSBFT0YpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYnJlYWsyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1wwJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjb250aW4yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjIDwgMCkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFVOWCAqLworCisgICAgICAgICAgICAgICAgaWYgKG91dDJzY3JlZW4gJiYgIWZ0cHJlY3YucGlwZW5hbWUpCisjaWZkZWYgcHJpbnRmCisgICAgICAgICAgICAgICAgICBwcmludGYoIiVjIiwoY2hhciljKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICBwdXRjaGFyKChjaGFyKWMpOworI2VuZGlmIC8qIHByaW50ZiAqLworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGlmICgoZCA9IHptY2hvdXQoYykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYnl0ZXMrKzsKKyAgICAgICAgICAgICAgICBmZmMrKzsKKyAgICAgICAgICAgICAgY29udGluMjoKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWsyOgorICAgICAgICAgICAgaWYgKGJhcmVfbGZzICYmICghZHB5YWN0aXZlIHx8IGZ0cF9kZWIpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HISAlZCBiYXJlIGxpbmVmZWVkcyByZWNlaXZlZCBpbiBBU0NJSSBtb2RlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBiYXJlX2xmcyk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJGaWxlIG1pZ2h0IG5vdCBoYXZlIHRyYW5zZmVycmVkIGNvcnJlY3RseS5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZ0cHJlY3YuZGluID09IC0xKSB7CisgICAgICAgICAgICAgICAgYnl0ZXMgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09IC0yKQorICAgICAgICAgICAgICBieXRlcyA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICB9CisgICAgaWYgKGZ0cHJlY3YucGlwZW5hbWUgfHwgIW91dDJzY3JlZW4pIHsKKwl6Y2xvc2UoWk9GSUxFKTsJCQkvKiBDbG9zZSB0aGUgZmlsZSAqLworCWRlYnVnKEYxMTEsImRvZnRwcmVjdjIgemNsb3NlIGZ0cGNvZGUiLGZ0cHJlY3YubG9jYWwsZnRwY29kZSk7CisJaWYgKGZ0cGNvZGUgPCAwKSB7CQkvKiBJZiBkb3dubG9hZCBmYWlsZWQgKi8KKwkgICAgaW50IHggPSAwOworCSAgICBzd2l0Y2ggKGtlZXApIHsJCS8qIHdoaWNoIGlzLi4uICovCisJICAgICAgY2FzZSBTRVRfQVVUTzoJCS8qIEFVVE8gKi8KKwkJaWYgKGN1cnR5cGUgPT0gRlRUX0FTQykgLyogRGVsZXRlIGZpbGUgaWYgVFlQRSBBLiAqLworCQkgIHggPSAxOworCQlicmVhazsKKwkgICAgICBjYXNlIFNFVF9PRkY6CQkvKiBESVNDQVJEICovCisJCXggPSAxOwkJCS8qIERlbGV0ZSBmaWxlLCBwZXJpb2QuICovCisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CQkJLyogS0VFUCAqLworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoeCkgeworCQl4ID0gemRlbGV0KGZ0cHJlY3YubG9jYWwpOworCQlkZWJ1ZyhGMTExLCJmdHAgZ2V0IGRlbGV0ZSBpbmNvbXBsZXRlIixmdHByZWN2LmxvY2FsLHgpOworCSAgICB9CisJfQorICAgIH0KKyAgICBzaWduYWwoU0lHSU5ULCBmdHByZWN2Lm9sZGludHIpOworI2lmZGVmIFNJR1BJUEUKKyAgICBpZiAoZnRwcmVjdi5vbGRpbnRwKQorICAgICAgc2lnbmFsKFNJR1BJUEUsIGZ0cHJlY3Yub2xkaW50cCk7CisjZW5kaWYgLyogU0lHUElQRSAqLworICAgIHN0b3AgPSBnbXN0aW1lcigpOworI2lmZGVmIEdGVElNRVIKKyAgICBmcGZzZWNzID0gZ2Z0aW1lcigpOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyAgICB0ZmMgKz0gZmZjOworCisjaWZkZWYgVENQSVBMSUIKKyAgICBzb2NrZXRfY2xvc2UoZnRwcmVjdi5kaW4pOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICBzaHV0ZG93bihmdHByZWN2LmRpbiwgMSsxKTsKKyNlbmRpZiAvKiBVU0VfU0hVVERPV04gKi8KKyAgICBjbG9zZShmdHByZWN2LmRpbik7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICBmdHByZWN2LnJlcGx5ID0gZ2V0cmVwbHkoMCxmdHByZWN2LmZjcyxmdHByZWN2LnJjcyxmdHBfdmJtLDApOworICAgIGZ0cHJlY3ZyZXQgPSAoKGZ0cGNvZGUgPCAwIHx8IGZ0cHJlY3YucmVwbHkgPT0gUkVQTFlfVFJBTlNJRU5UIHx8IAorICAgICAgICAgICAgICAgICAgIGZ0cHJlY3YucmVwbHkgPT0gUkVQTFlfRVJST1IpID8gLTEgOiAwKTsKKyNpZmRlZiBOVFNJRworICAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworfQorCitzdGF0aWMgaW50CityZWN2cmVxdWVzdChjbWQsIGxvY2FsLCByZW1vdGUsIGxtb2RlLCBwcmludG5hbWVzLCByZWNvdmVyLCBwaXBlbmFtZSwKKyAgICAgICAgICAgIHhsYXRlLCBmY3MsIHJjcykKKyAgICBjaGFyICpjbWQsICpsb2NhbCwgKnJlbW90ZSwgKmxtb2RlLCAqcGlwZW5hbWU7CisgICAgaW50IHByaW50bmFtZXMsIHJlY292ZXIsIHhsYXRlLCBmY3MsIHJjczsKK3sKKyNpZmRlZiBOVAorICAgIHN0cnVjdCBfc3RhdCBzdGJ1ZjsKKyNlbHNlIC8qIE5UICovCisgICAgc3RydWN0IHN0YXQgc3RidWY7CisjZW5kaWYgLyogTlQgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgcmVjdnJlcXVlc3QgY21kIixjbWQscmVjb3Zlcik7CisgICAgICAgIGRlYnVnKEYxMTAsImZ0cCByZWN2cmVxdWVzdCBsb2NhbCAiLGxvY2FsLDApOworICAgICAgICBkZWJ1ZyhGMTExLCJmdHAgcmVjdnJlcXVlc3QgcmVtb3RlIixyZW1vdGUsZnRwX3R5cCk7CisgICAgICAgIGRlYnVnKEYxMTAsImZ0cCByZWN2cmVxdWVzdCBwaXBlbmFtZSAiLHBpcGVuYW1lLDApOworICAgICAgICBkZWJ1ZyhGMTAxLCJmdHAgcmVjdnJlcXVlc3QgeGxhdGUiLCIiLHhsYXRlKTsKKyAgICAgICAgZGVidWcoRjEwMSwiZnRwIHJlY3ZyZXF1ZXN0IGZjcyIsIiIsZmNzKTsKKyAgICAgICAgZGVidWcoRjEwMSwiZnRwIHJlY3ZyZXF1ZXN0IHJjcyIsIiIscmNzKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKworICAgIGZ0cHJlY3YubG9jYWxzaXplID0gMEw7CisKKyAgICBpZiAocmVtZmlsZSkgeyAgICAgICAgICAgICAgICAgICAgICAvKiBTZWUgcmVtY2ZtKCksIHJlbXR4dCgpICovCisgICAgICAgIGlmIChyZW1waXBlKSB7CisgICAgICAgICAgICBwaXBlbmFtZSA9IHJlbWRlc3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2NhbCA9IHJlbWRlc3Q7CisgICAgICAgICAgICBpZiAocmVtYXBwZCkgbG1vZGUgPSAiYWIiOworICAgICAgICB9CisgICAgfQorICAgIG91dDJzY3JlZW4gPSAwOworICAgIGlmICghY21kKSBjbWQgPSAiIjsgICAgICAgICAgICAgICAgIC8qIENvcmUgZHVtcCBwcmV2ZW50aW9uICovCisgICAgaWYgKCFyZW1vdGUpIHJlbW90ZSA9ICIiOworICAgIGlmICghbG1vZGUpIGxtb2RlID0gIiI7CisKKyAgICBpZiAocGlwZW5hbWUpIHsgICAgICAgICAgICAgICAgICAgICAvKiBObyByZWNvdmVyeSBmb3IgcGlwZXMuICovCisgICAgICAgIHJlY292ZXIgPSAwOworICAgICAgICBpZiAoIWxvY2FsKQorICAgICAgICAgIGxvY2FsID0gcGlwZW5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFsb2NhbCkgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgdG8gc2NyZWVuPyAqLworICAgICAgICAgIGxvY2FsID0gIi0iOworICAgICAgICBvdXQyc2NyZWVuID0gIXN0cmNtcChsb2NhbCwiLSIpOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJmdHAgcmVjdnJlcXVlc3Qgb3V0MnNjcmVlbiIsIiIsb3V0MnNjcmVlbik7CisKKyNpZmRlZiBPUzIKKyAgICBpZiAoIGZ0cF94bGEgJiYgb3V0MnNjcmVlbiAmJiAhazk1c3Rkb3V0ICYmICFpbnNlcnZlciApCisgICAgICAgIGZjcyA9IEZDX1VDUzI7CisjZW5kaWYgLyogT1MyICovCisKKyAgICBpZiAob3V0MnNjcmVlbikgICAgICAgICAgICAgICAgICAgICAvKiBObyByZWNvdmVyeSB0byBzY3JlZW4gKi8KKyAgICAgIHJlY292ZXIgPSAwOworICAgIGlmICghZnRwX3R5cCkgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHJlY292ZXJ5IGluIHRleHQgbW9kZSAqLworICAgICAgcmVjb3ZlciA9IDA7CisgICAgZnRwcmVjdi5pc19yZXRyID0gKHN0cmNtcChjbWQsICJSRVRSIikgPT0gMCk7CisKKyAgICBpZiAoIWZ0cHJlY3YuaXNfcmV0cikgICAgICAgICAgICAgICAvKiBObyByZWNvdmVyeSBleGNlcHQgZm9yIFJFVFJpZXZlICovCisgICAgICByZWNvdmVyID0gMDsKKworI2lmZGVmIENPTU1FTlQKKyAgICBpZiAoIW91dDJzY3JlZW4gJiYgIXBpcGVuYW1lICYmIGZ0cHJlY3YuaXNfcmV0cikgeyAvKiBUbyByZWFsIGZpbGUgKi8KKyAgICAgICAgaWYgKHJlY3Vyc2l2ZSAmJiBja3N0cmNocihsb2NhbCwnLycpKSB7CisJICAgIAorICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIGZ0cHJlY3YubG9jYWxzaXplID0gMEw7CQkvKiBMb2NhbCBmaWxlIHNpemUgKi8KKyAgICByc19sZW4gPSAwTDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWNvdmVyeSBwb2ludCAqLworCisgICAgZGVidWcoRjEwMSwiZnRwIHJlY3ZyZXF1ZXN0IHJlY292ZXIiLCIiLHJlY292ZXIpOworICAgIGlmIChyZWNvdmVyKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIFJlY292ZXJpbmcuLi4gKi8KKyAgICAgICAgaWYgKHN0YXQobG9jYWwsICZzdGJ1ZikgPCAwKSB7ICAvKiBDYW4ndCBzdGF0IGxvY2FsIGZpbGUgKi8KKwkgICAgZGVidWcoRjEwMSwiZnRwIHJlY3ZyZXF1ZXN0IHJlY292ZXIgc3RhdCBmYWlsZWQiLCIiLGVycm5vKTsKKyAgICAgICAgICAgIHJlY292ZXIgPSAwOyAgICAgICAgICAgICAgICAvKiBTbyBjYW5jZWwgcmVjb3ZlcnkgKi8KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXZlIGxvY2FsIGZpbGUgaW5mbyAqLworICAgICAgICAgICAgZnRwcmVjdi5sb2NhbHNpemUgPSBzdGJ1Zi5zdF9zaXplOyAgLyogR2V0IHNpemUgKi8KKwkgICAgLyogUmVtb3RlIGZpbGUgc21hbGxlciB0aGFuIGxvY2FsICovCisgICAgICAgICAgICBpZiAoZnNpemUgPCBmdHByZWN2LmxvY2Fsc2l6ZSkgeworCQlkZWJ1ZyhGMTAxLCJmdHAgcmVjdnJlcXVlc3QgcmVjb3ZlciByZW1vdGUgc21hbGxlciIsIiIsZnNpemUpOworICAgICAgICAgICAgICAgIHJlY292ZXIgPSAwOyAgICAgICAgICAgIC8qIFJlY292ZXJ5IGNhbid0IHdvcmsgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZnNpemUgPT0gZnRwcmVjdi5sb2NhbHNpemUpIHsgLyogU2l6ZXMgYXJlIGVxdWFsICovCisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIHJlY3ZyZXF1ZXN0IHJlY292ZXIgZXF1YWwgc2l6ZSIsCisJCSAgICAgIHJlbW90ZSxmdHByZWN2LmxvY2Fsc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgfQorI2lmZGVmIENPTU1FTlQKKy8qCisgIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgb3JpZ2luYWwgcGFydGlhbCBmaWxlIG5ldmVyIGdvdCBpdHMgZGF0ZQorICBzZXQsIGVpdGhlciBiZWNhdXNlIEZUUCBEQVRFUyB3YXMgT0ZGLCBvciBiZWNhdXNlIHRoZSBwYXJ0aWFsIGZpbGUgd2FzCisgIGRvd25sb2FkZWQgYnkgc29tZSBvdGhlciBwcm9ncmFtIHRoYXQgZG9lc24ndCBzZXQgbG9jYWwgZmlsZSBkYXRlcywgb3IKKyAgYmVjYXVzZSBLZXJtaXQgb25seSBzZXRzIHRoZSBmaWxlJ3MgZGF0ZSB3aGVuIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUKKyAgYW5kIHN1Y2Nlc3NmdWwuICBJbiBhbGwgdGhlc2UgY2FzZXMsIHRoZSBsb2NhbCBmaWxlIGhhcyBhIGxhdGVyIHRpbWUKKyAgdGhhbiB0aGUgcmVtb3RlLgorKi8KKyAgICAgICAgICAgIGlmIChyZWNvdmVyKSB7ICAgICAgICAgICAgICAvKiBSZW1vdGUgaXMgYmlnZ2VyICovCisgICAgICAgICAgICAgICAgeCA9IGNoa21vZHRpbWUobG9jYWwscmVtb3RlLDApOyAvKiBDaGVjayBmaWxlIGRhdGVzICovCisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZnRwIHJlY3ZyZXF1ZXN0IGNoa21vZHRpbWUiLHJlbW90ZSx4KTsKKyAgICAgICAgICAgICAgICBpZiAoeCAhPSAxKQkJLyogRGF0ZXMgbXVzdCBiZSBlcXVhbCEgKi8KKyAgICAgICAgICAgICAgICAgIHJlY292ZXIgPSAwOyAgICAgICAgICAvKiBJZiBub3QsIGdldCB3aG9sZSBmaWxlICovCisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTEsImZ0cCByZWN2cmVxdWVzdCByZWNvdmVyIixyZW1vdGUscmVjb3Zlcik7CisgICAgfQorCisjaWZkZWYgRlRQX1BST1hZCisgICAgaWYgKHByb3h5ICYmIGZ0cHJlY3YuaXNfcmV0cikKKyAgICAgIHJldHVybihwcm94dHJhbnMoY21kLCBsb2NhbCA/IGxvY2FsIDogcmVtb3RlLCByZW1vdGUpKTsKKyNlbmRpZiAvKiBGVFBfUFJPWFkgKi8KKworICAgIGZ0cHJlY3YudGNyZmxhZyA9IChmZW9sICE9IENSKSAmJiBmdHByZWN2LmlzX3JldHI7CisKKyAgICBmdHByZWN2LnJlcGx5ID0gMDsKKyAgICBmdHByZWN2LmZjcyA9IGZjczsKKyAgICBmdHByZWN2LnJjcyA9IHJjczsKKyAgICBmdHByZWN2LnJlY292ZXIgPSByZWNvdmVyOworICAgIGZ0cHJlY3YueGxhdGUgPSB4bGF0ZTsKKyAgICBmdHByZWN2LmNtZCA9IGNtZDsKKyAgICBmdHByZWN2LmxvY2FsID0gbG9jYWw7CisgICAgZnRwcmVjdi5yZW1vdGUgPSByZW1vdGU7CisgICAgZnRwcmVjdi5sbW9kZSA9IGxtb2RlOworICAgIGZ0cHJlY3YucGlwZW5hbWUgPSBwaXBlbmFtZTsKKyAgICBmdHByZWN2Lm9sZGludHAgPSBOVUxMOworICAgIGZ0cGNvZGUgPSAwOworCisgICAgaGF2ZXNpZ2ludCA9IDA7CisgICAgZnRwcmVjdi5vbGRpbnRyID0gc2lnbmFsKFNJR0lOVCwgY2FuY2VscmVjdik7CisgICAgaWYgKGNjX2V4ZWN1dGUoY2tqYWRkcihyZWN2Y2FuY2VsKSwgZG9mdHByZWN2LCBmYWlsZnRwcmVjdikgPCAwKQorICAgICAgcmV0dXJuIC0xOworICAgIGlmIChmdHByZWN2cmV0IDwgMCkKKyAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChjY19leGVjdXRlKGNramFkZHIocmVjdmNhbmNlbCksIGRvZnRwcmVjdjIsIGZhaWxmdHByZWN2MikgPCAwKQorICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBmdHByZWN2cmV0OworfQorCisvKgorICogTmVlZCB0byBzdGFydCBhIGxpc3RlbiBvbiB0aGUgZGF0YSBjaGFubmVsIGJlZm9yZSB3ZSBzZW5kIHRoZSBjb21tYW5kLAorICogb3RoZXJ3aXNlIHRoZSBzZXJ2ZXIncyBjb25uZWN0IG1heSBmYWlsLgorICovCitzdGF0aWMgaW50Citpbml0Y29ubigpIHsKKyAgICByZWdpc3RlciBjaGFyICpwLCAqYTsKKyAgICBpbnQgcmVzdWx0LCB0bXBubyA9IDA7CisgICAgaW50IG9uID0gMTsKKyAgICBHU09DS05BTUVfVCBsZW47CisKKyNpZm5kZWYgTk9fUEFTU0lWRV9NT0RFCisgICAgaW50IGExLGEyLGEzLGE0LHAxLHAyOworCisgICAgaWYgKHBhc3NpdmVtb2RlKSB7CisgICAgICAgIGRhdGEgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICAgICAgICBnbG9iYWxkaW4gPSBkYXRhOworICAgICAgICBpZiAoZGF0YSA8IDApIHsKKyAgICAgICAgICAgIHBlcnJvcigiZnRwOiBzb2NrZXQiKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZ0cGNtZCgiUEFTViIsTlVMTCwwLDAsZnRwX3ZibSkgIT0gUkVQTFlfQ09NUExFVEUpIHsKKyAgICAgICAgICAgIHByaW50ZigiUGFzc2l2ZSBtb2RlIHJlZnVzZWRcbiIpOworICAgICAgICAgICAgcGFzc2l2ZW1vZGUgPSAwOworICAgICAgICAgICAgcmV0dXJuKGluaXRjb25uKCkpOworICAgICAgICB9CisvKgorICBOb3cgd2UgaGF2ZSBhIHN0cmluZyBvZiBjb21tYS1zZXBhcmF0ZWQgb25lLWJ5dGUgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMsCisgIFRoZSBmaXJzdCBmb3VyIGFyZSB0aGUgYW4gSVAgYWRkcmVzcy4gIFRoZSBmaWZ0aCBpcyB0aGUgTVNCIG9mIHRoZSBwb3J0CisgIG51bWJlciwgdGhlIHNpeHRoIGlzIHRoZSBMU0IuICBGcm9tIHRoYXQgd2UgY2FuIG1ha2UgYSBzb2NrYWRkcl9pbi4KKyovCisgICAgICAgIGlmIChzc2NhbmYocGFzdiwiJWQsJWQsJWQsJWQsJWQsJWQiLCZhMSwmYTIsJmEzLCZhNCwmcDEsJnAyKSAhPSA2KSB7CisgICAgICAgICAgICBwcmludGYoIlBhc3NpdmUgbW9kZSBhZGRyZXNzIHNjYW4gZmFpbHVyZVxuIik7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9OworI2lmbmRlZiBOT0hUVFAKKyAgICAgICAgaWYgKHRjcF9odHRwX3Byb3h5KSB7CisjaWZkZWYgT1MyCisgICAgICAgICAgICBjaGFyICogYWdlbnQgPSAiS2VybWl0IDk1IjsgLyogRGVmYXVsdCB1c2VyIGFnZW50ICovCisjZWxzZQorICAgICAgICAgICAgY2hhciAqIGFnZW50ID0gIkMtS2VybWl0IjsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBob3N0ZW50ICpocCA9IDA7CisgICAgICAgICAgICBzdHJ1Y3Qgc2VydmVudCAqZGVzdHNwOworICAgICAgICAgICAgY2hhciBob3N0WzUxMl0sICpwLCAqcTsKKyNpZmRlZiBJUF9UT1MKKyNpZmRlZiBJUFRPU19USFJPVUdIUFVUCisgICAgICAgICAgICBpbnQgdG9zOworI2VuZGlmIC8qIElQVE9TX1RIUk9VR0hQVVQgKi8KKyNlbmRpZiAvKiBJUF9UT1MgKi8KKyAgICAgICAgICAgIGludCBzOworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBleHRlcm4gaW50IGRlYnRpbTsKKyAgICAgICAgICAgIGludCB4ZGVidGltOworICAgICAgICAgICAgeGRlYnRpbSA9IGRlYnRpbTsKKyAgICAgICAgICAgIGRlYnRpbSA9IDE7CisjZW5kaWYgLyogREVCVUcgKi8KKworICAgICAgICAgICAgY2ttYWt4bXNnKHByb3h5aG9zdCxIVFRQQ1BZTCxja3VpdG9hKGExKSwiLiIsY2t1aXRvYShhMiksCisgICAgICAgICAgICAgICAgICAgICAgIi4iLGNrdWl0b2EoYTMpLCIuIixja3VpdG9hKGE0KSwiOiIsY2t1aXRvYSgocDE8PDgpfHAyKSwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTAorICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBtZW1zZXQoKGNoYXIgKikmaGlzY3RsYWRkciwgMCwgc2l6ZW9mIChoaXNjdGxhZGRyKSk7CisgICAgICAgICAgICBmb3IgKHAgPSB0Y3BfaHR0cF9wcm94eSwgcT1ob3N0OyAqcCAhPSAnXDAnICYmICpwICE9ICc6JzsgcCsrLCBxKyspCisgICAgICAgICAgICAgICpxID0gKnA7CisgICAgICAgICAgICAqcSA9ICdcMCc7CisKKyAgICAgICAgICAgIGhpc2N0bGFkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKGhvc3QpOworICAgICAgICAgICAgaWYgKGhpc2N0bGFkZHIuc2luX2FkZHIuc19hZGRyICE9IC0xKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiaW5pdGNvbm4gQSIsaG9zdCwwKTsKKyAgICAgICAgICAgICAgICBoaXNjdGxhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJpbml0Y29ubiBCIixob3N0LDApOworICAgICAgICAgICAgICAgIGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0KTsKKyNpZmRlZiBIQUREUkxJU1QKKyAgICAgICAgICAgICAgICBocCA9IGNrX2NvcHlob3N0ZW50KGhwKTsgLyogbWFrZSBzYWZlIGNvcHkgdGhhdCB3b24ndCBjaGFuZ2UgKi8KKyNlbmRpZiAvKiBIQUREUkxJU1QgKi8KKyAgICAgICAgICAgICAgICBpZiAoaHAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZ0cDogJXM6IFVua25vd24gaG9zdFxuIiwgaG9zdCk7CisgICAgICAgICAgICAgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgICAgICBkZWJ0aW0gPSB4ZGVidGltOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGlzY3RsYWRkci5zaW5fZmFtaWx5ID0gaHAtPmhfYWRkcnR5cGU7CisjaWZkZWYgSEFERFJMSVNUCisgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopJmhpc2N0bGFkZHIuc2luX2FkZHIsIGhwLT5oX2FkZHJfbGlzdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhpc2N0bGFkZHIuc2luX2FkZHIpKTsKKyNlbHNlIC8qIEhBRERSTElTVCAqLworICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSZoaXNjdGxhZGRyLnNpbl9hZGRyLCBocC0+aF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGlzY3RsYWRkci5zaW5fYWRkcikpOworI2VuZGlmIC8qIEhBRERSTElTVCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YSA9IHNvY2tldChoaXNjdGxhZGRyLnNpbl9mYW1pbHksIFNPQ0tfU1RSRUFNLCAwKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImluaXRjb25uIHNvY2tldCIsIiIsZGF0YSk7CisgICAgICAgICAgICBpZiAoZGF0YSA8IDApIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoImZ0cDogc29ja2V0Iik7CisgICAgICAgICAgICAgICAgZnRwY29kZSA9IC0xOworI2lmZGVmIERFQlVHCisgICAgICAgICAgICAgICAgZGVidGltID0geGRlYnRpbTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqcCA9PSAnOicpCisgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcCA9ICJodHRwIjsKKworICAgICAgICAgICAgZGVzdHNwID0gZ2V0c2VydmJ5bmFtZShwLCJ0Y3AiKTsKKyAgICAgICAgICAgIGlmIChkZXN0c3ApCisgICAgICAgICAgICAgIGhpc2N0bGFkZHIuc2luX3BvcnQgPSBkZXN0c3AtPnNfcG9ydDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHApCisgICAgICAgICAgICAgIGhpc2N0bGFkZHIuc2luX3BvcnQgPSBodG9ucyhhdG9pKHApKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaGlzY3RsYWRkci5zaW5fcG9ydCA9IGh0b25zKDgwKTsKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyNpZmRlZiBIQUREUkxJU1QKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsImluaXRjb25uIEhBRERSTElTVCIsIiIsMCk7CisgICAgICAgICAgICB3aGlsZQorI2Vsc2UKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsImluaXRjb25uIG5vIEhBRERSTElTVCIsIiIsMCk7CisgICAgICAgICAgICBpZgorI2VuZGlmIC8qIEhBRERSTElTVCAqLworICAgICAgICAgICAgICAoY29ubmVjdChkYXRhLCAoc3RydWN0IHNvY2thZGRyICopJmhpc2N0bGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoaGlzY3RsYWRkcikpIDwgMCkgeworICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiaW5pdGNvbm4gY29ubmVjdCBmYWlsZWQiLCIiLGVycm5vKTsKKyNpZmRlZiBIQUREUkxJU1QKKyAgICAgICAgICAgICAgICAgIGlmIChocCAmJiBocC0+aF9hZGRyX2xpc3RbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Vycm5vID0gZXJybm87CisKKyAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdHA6IGNvbm5lY3QgdG8gYWRkcmVzcyAlczogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZXRfbnRvYShoaXNjdGxhZGRyLnNpbl9hZGRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICBlcnJubyA9IG9lcnJubzsKKyAgICAgICAgICAgICAgICAgICAgICBwZXJyb3IoKGNoYXIgKikwKTsKKyAgICAgICAgICAgICAgICAgICAgICBocC0+aF9hZGRyX2xpc3QrKzsKKyAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikmaGlzY3RsYWRkci5zaW5fYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHAtPmhfYWRkcl9saXN0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGlzY3RsYWRkci5zaW5fYWRkcikpOworICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiVHJ5aW5nICVzLi4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5ldF9udG9hKGhpc2N0bGFkZHIuc2luX2FkZHIpKTsKKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9jbG9zZShkYXRhKTsKKyNlbHNlIC8qIFRDUElQTElCICovCisgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoZGF0YSk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc29ja2V0KGhpc2N0bGFkZHIuc2luX2ZhbWlseSwgU09DS19TVFJFQU0sIDApOworICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJyb3IoImZ0cDogc29ja2V0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ0aW0gPSB4ZGVidGltOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogSEFERFJMSVNUICovCisgICAgICAgICAgICAgICAgICBwZXJyb3IoImZ0cDogY29ubmVjdCIpOworICAgICAgICAgICAgICAgICAgZnRwY29kZSA9IC0xOworICAgICAgICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChodHRwX2Nvbm5lY3QoZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX2h0dHBfcHJveHlfYWdlbnQgPworCQkJICAgICAgIHRjcF9odHRwX3Byb3h5X2FnZW50IDoKKwkJCSAgICAgICAgIGFnZW50LAorCQkJICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3BfaHR0cF9wcm94eV91c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3BfaHR0cF9wcm94eV9wd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5aG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDwgMCkgeworI2lmZGVmIFRDUElQTElCCisgICAgICAgICAgICAgICAgc29ja2V0X2Nsb3NlKGRhdGEpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgICAgICBjbG9zZShkYXRhKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgICAgIHBlcnJvcigiZnRwOiBjb25uZWN0Iik7CisgICAgICAgICAgICAgICAgZnRwY29kZSA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBOT0hUVFAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZGF0YV9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICAgICAgZGF0YV9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKChhMTw8MjQpfChhMjw8MTYpfChhMzw8OCl8YTQpOworICAgICAgICAgICAgZGF0YV9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoKHAxPDw4KXxwMik7CisKKyAgICAgICAgICAgIGlmIChjb25uZWN0KGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopJmRhdGFfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkYXRhX2FkZHIpKSA8IDAKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoImZ0cDogY29ubmVjdCIpOworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjEwMCwiaW5pdGNvbm4gY29ubmVjdCBvayIsIiIsMCk7CisjaWZkZWYgSVBfVE9TCisjaWZkZWYgSVBUT1NfVEhST1VHSFBVVAorICAgICAgICBvbiA9IElQVE9TX1RIUk9VR0hQVVQ7CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KGRhdGEsIElQUFJPVE9fSVAsIElQX1RPUywgKGNoYXIgKikmb24sIHNpemVvZihpbnQpKSA8IDApCisgICAgICAgICAgcGVycm9yKCJmdHA6IHNldHNvY2tvcHQgVE9TIChpZ25vcmVkKSIpOworI2VuZGlmIC8qIElQVE9TX1RIUk9VR0hQVVQgKi8KKyNlbmRpZiAvKiBJUF9UT1MgKi8KKyAgICAgICAgbWVtY3B5KCZoaXNkYXRhYWRkciwmZGF0YV9hZGRyLHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBOT19QQVNTSVZFX01PREUgKi8KKworICBub3BvcnQ6CisgICAgbWVtY3B5KCZkYXRhX2FkZHIsJm15Y3RsYWRkcixzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisgICAgaWYgKHNlbmRwb3J0KQorICAgICAgZGF0YV9hZGRyLnNpbl9wb3J0ID0gMDsgICAvKiBsZXQgc3lzdGVtIHBpY2sgb25lICovCisgICAgaWYgKGRhdGEgIT0gLTEpIHsKKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICBzb2NrZXRfY2xvc2UoZGF0YSk7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworI2lmZGVmIFVTRV9TSFVURE9XTgorICAgICAgICBzaHV0ZG93bihkYXRhLCAxKzEpOworI2VuZGlmIC8qIFVTRV9TSFVURE9XTiAqLworICAgICAgICBjbG9zZShkYXRhKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgIH0KKyAgICBkYXRhID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgICBnbG9iYWxkaW4gPSBkYXRhOworICAgIGlmIChkYXRhIDwgMCkgeworICAgICAgICBwZXJyb3IoImZ0cDogc29ja2V0Iik7CisgICAgICAgIGlmICh0bXBubykKKyAgICAgICAgICBzZW5kcG9ydCA9IDE7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGlmICghc2VuZHBvcnQpIHsKKyAgICAgICAgaWYgKHNldHNvY2tvcHQoZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgU09fUkVVU0VBRERSLAorICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChvbikKKyAgICAgICAgICAgICAgICAgICAgICAgKSA8IDAKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgcGVycm9yKCJmdHA6IHNldHNvY2tvcHQgKHJldXNlIGFkZHJlc3MpIik7CisgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYmluZChkYXRhLCAoc3RydWN0IHNvY2thZGRyICopJmRhdGFfYWRkciwgc2l6ZW9mIChkYXRhX2FkZHIpKSA8IDApIHsKKyAgICAgICAgcGVycm9yKCJmdHA6IGJpbmQiKTsKKyAgICAgICAgZ290byBiYWQ7CisgICAgfQorICAgIGxlbiA9IHNpemVvZiAoZGF0YV9hZGRyKTsKKyAgICBpZiAoZ2V0c29ja25hbWUoZGF0YSwgKHN0cnVjdCBzb2NrYWRkciAqKSZkYXRhX2FkZHIsICZsZW4pIDwgMCkgeworICAgICAgICBwZXJyb3IoImZ0cDogZ2V0c29ja25hbWUiKTsKKyAgICAgICAgZ290byBiYWQ7CisgICAgfQorICAgIGlmIChsaXN0ZW4oZGF0YSwgMSkgPCAwKSB7CisgICAgICAgIHBlcnJvcigiZnRwOiBsaXN0ZW4iKTsKKyAgICAgICAgZ290byBiYWQ7CisgICAgfQorICAgIGlmIChzZW5kcG9ydCkgeworICAgICAgICBhID0gKGNoYXIgKikmZGF0YV9hZGRyLnNpbl9hZGRyOworICAgICAgICBwID0gKGNoYXIgKikmZGF0YV9hZGRyLnNpbl9wb3J0OworICAgICAgICBja21ha3htc2coZnRwY21kYnVmLEZUUF9CVUZTSVosIlBPUlQgIiwKKyAgICAgICAgICAgICAgICAgIFVDKGFbMF0pLCIsIixVQyhhWzFdKSwiLCIsIFVDKGFbMl0pLCIsIiwgVUMoYVszXSksIiwiLAorICAgICAgICAgICAgICAgICAgVUMocFswXSksIiwiLCBVQyhwWzFdKSk7CisgICAgICAgIHJlc3VsdCA9IGZ0cGNtZChmdHBjbWRidWYsTlVMTCwwLDAsZnRwX3ZibSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gUkVQTFlfRVJST1IgJiYgc2VuZHBvcnQpIHsKKyAgICAgICAgICAgIHNlbmRwb3J0ID0gMDsKKyAgICAgICAgICAgIHRtcG5vID0gMTsKKyAgICAgICAgICAgIGdvdG8gbm9wb3J0OworICAgICAgICB9CisgICAgICAgIHJldHVybihyZXN1bHQgIT0gUkVQTFlfQ09NUExFVEUpOworICAgIH0KKyAgICBpZiAodG1wbm8pCisgICAgICBzZW5kcG9ydCA9IDE7CisjaWZkZWYgSVBfVE9TCisjaWZkZWYgSVBUT1NfVEhST1VHSFBVVAorICAgIG9uID0gSVBUT1NfVEhST1VHSFBVVDsKKyAgICBpZiAoc2V0c29ja29wdChkYXRhLCBJUFBST1RPX0lQLCBJUF9UT1MsIChjaGFyICopJm9uLCBzaXplb2YoaW50KSkgPCAwKQorICAgICAgcGVycm9yKCJmdHA6IHNldHNvY2tvcHQgVE9TIChpZ25vcmVkKSIpOworI2VuZGlmCisjZW5kaWYKKyAgICByZXR1cm4oMCk7CisgIGJhZDoKKyNpZmRlZiBUQ1BJUExJQgorICAgIHNvY2tldF9jbG9zZShkYXRhKTsKKyNlbHNlIC8qIFRDUElQTElCICovCisjaWZkZWYgVVNFX1NIVVRET1dOCisgICAgc2h1dGRvd24oZGF0YSwgMSsxKTsKKyNlbmRpZiAvKiBVU0VfU0hVVERPV04gKi8KKyAgICBjbG9zZShkYXRhKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgIGRhdGEgPSAtMTsKKyAgICBnbG9iYWxkaW4gPSBkYXRhOworICAgIGlmICh0bXBubykKKyAgICAgIHNlbmRwb3J0ID0gMTsKKyAgICByZXR1cm4oLTEpOworfQorCisjaWZkZWYgQ0tfU1NMCitzdGF0aWMgaW50Citzc2xfZGF0YWNvbm4oKSB7CisgICAgaWYgKHNzbF9mdHBfZGF0YV9jb24hPU5VTEwpIHsgICAgICAgLyogRG8gU1NMICovCisgICAgICAgIFNTTF9mcmVlKHNzbF9mdHBfZGF0YV9jb24pOworICAgICAgICBzc2xfZnRwX2RhdGFfY29uPU5VTEw7CisgICAgfQorICAgIHNzbF9mdHBfZGF0YV9jb249KFNTTCAqKVNTTF9uZXcoc3NsX2Z0cF9jdHgpOworCisgICAgU1NMX3NldF9mZChzc2xfZnRwX2RhdGFfY29uLGRhdGEpOworICAgIFNTTF9zZXRfdmVyaWZ5KHNzbF9mdHBfZGF0YV9jb24sc3NsX3ZlcmlmeV9mbGFnLE5VTEwpOworCisgICAgU1NMX2NvcHlfc2Vzc2lvbl9pZChzc2xfZnRwX2RhdGFfY29uLHNzbF9mdHBfY29uKTsKKworICAgIGlmIChzc2xfZGVidWdfZmxhZykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiPT5TVEFSVCBTU0wgY29ubmVjdCBvbiBEQVRBXG4iKTsKKyAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgfQorICAgIGlmIChTU0xfY29ubmVjdChzc2xfZnRwX2RhdGFfY29uKSA8PSAwKSB7CisgICAgICAgIHN0YXRpYyBjaGFyIGVycmJ1ZlsxMDI0XTsKKyAgICAgICAgY2ttYWttc2coZXJyYnVmLDEwMjQsImZ0cDogU1NMX2Nvbm5lY3QgREFUQSBlcnJvcjogIiwKKyAgICAgICAgICAgICAgICAgIEVSUl9lcnJvcl9zdHJpbmcoRVJSX2dldF9lcnJvcigpLE5VTEwpLE5VTEwsTlVMTCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIlc1xuIiwgZXJyYnVmKTsKKyAgICAgICAgZmZsdXNoKHN0ZGVycik7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgc29ja2V0X2Nsb3NlKGRhdGEpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgc2h1dGRvd24oZGF0YSwgMSsxKTsKKyNlbmRpZiAvKiBVU0VfU0hVVERPV04gKi8KKyAgICAgICAgY2xvc2UoZGF0YSk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgZGF0YSA9IC0xOworICAgICAgICBnbG9iYWxkaW4gPSBkYXRhOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNzbF9mdHBfZGF0YV9hY3RpdmVfZmxhZz0xOworCisgICAgICAgIGlmICghc3NsX2NlcnRzb2tfZmxhZyAmJiAhdGxzX2lzX2tyYjUoMikpIHsKKyAgICAgICAgICAgIGNoYXIgKnN1YmplY3QgPSBzc2xfZ2V0X3N1YmplY3RfbmFtZShzc2xfZnRwX2RhdGFfY29uKTsKKworICAgICAgICAgICAgaWYgKCFzdWJqZWN0KSB7CisgICAgICAgICAgICAgICAgaWYgKHNzbF92ZXJpZnlfZmxhZyAmIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZGF0YWNvbm4iLCJbU1NMIF8tIEZBSUxFRF0iLDApOworCisgICAgICAgICAgICAgICAgICAgIHNzbF9mdHBfZGF0YV9hY3RpdmVfZmxhZyA9IDA7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICAgICAgICAgICAgc29ja2V0X2Nsb3NlKGRhdGEpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgICAgICAgICAgICAgc2h1dGRvd24oZGF0YSwgMSsxKTsKKyNlbmRpZiAvKiBVU0VfU0hVVERPV04gKi8KKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoZGF0YSk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IC0xOworICAgICAgICAgICAgICAgICAgICBnbG9iYWxkaW4gPSBkYXRhOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb3V0MnNjcmVlbiAmJiBkaXNwbGEgJiYgZmRpc3BsYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnRzY3JlZW4oU0NSX1RDLDAsMEwsIkRpc3BsYXkgY2FuY2VsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZkaXNwbGEgPSBYWUZEX0I7ICovCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAodXFfb2soCisgICAgICAgICAgIldhcm5pbmc6IFNlcnZlciBkaWRuJ3QgcHJvdmlkZSBhIGNlcnRpZmljYXRlIG9uIGRhdGEgY29ubmVjdGlvblxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGludWUgd2l0aCBmaWxlIHRyYW5zZmVyPyAoWS9OKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLE5VTEwsMCkgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwgImRhdGFjb25uIiwiW1NTTCAtIEZBSUxFRF0iLDApOworICAgICAgICAgICAgICAgICAgICAgICAgc3NsX2Z0cF9kYXRhX2FjdGl2ZV9mbGFnID0gMDsKKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X2Nsb3NlKGRhdGEpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgICAgICAgICAgICAgICAgIHNodXRkb3duKGRhdGEsIDErMSk7CisjZW5kaWYgLyogVVNFX1NIVVRET1dOICovCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShkYXRhKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsZGluID0gZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghb3V0MnNjcmVlbiAmJiBkaXNwbGEgJiYgZmRpc3BsYSA9PSBYWUZEX0MpIHsKKyAgICAgICAgICAgICAgICAgICAgZnRzY3JlZW4oU0NSX1RDLDAsMEwsIkRpc3BsYXkgY2FuY2VsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgLyogZmRpc3BsYSA9IFhZRkRfQjsgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3NsX2NoZWNrX3NlcnZlcl9uYW1lKHNzbF9mdHBfZGF0YV9jb24sZnRwX3VzZXJfaG9zdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZGF0YWNvbm4iLCJbU1NMIC0gRkFJTEVEXSIsMCk7CisgICAgICAgICAgICAgICAgICAgIHNzbF9mdHBfZGF0YV9hY3RpdmVfZmxhZyA9IDA7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICAgICAgICAgICAgc29ja2V0X2Nsb3NlKGRhdGEpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgICAgICAgICAgICAgc2h1dGRvd24oZGF0YSwgMSsxKTsKKyNlbmRpZiAvKiBVU0VfU0hVVERPV04gKi8KKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoZGF0YSk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IC0xOworICAgICAgICAgICAgICAgICAgICBnbG9iYWxkaW4gPSBkYXRhOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTEwLCJkYXRhY29ubiIsIltTU0wgLSBPS10iLDApOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgLyogVGhpcyBtZXNzZXMgdXAgdGhlIGZ1bGwgc2NyZWVuIGZpbGUgdHJhbnNmZXIgZGlzcGxheSAqLworICAgICAgICBzc2xfZGlzcGxheV9jb25uZWN0X2RldGFpbHMoc3NsX2Z0cF9jb24sMCxzc2xfdmVyYm9zZV9mbGFnKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfQorICAgIGlmIChzc2xfZGVidWdfZmxhZykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiPT5ET05FIFNTTCBjb25uZWN0IG9uIERBVEFcbiIpOworICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICB9CisgICAgcmV0dXJuKGRhdGEpOworfQorI2VuZGlmIC8qIENLX1NTTCAqLworCitzdGF0aWMgaW50CitkYXRhY29ubihsbW9kZSkgY2hhciAqbG1vZGU7IHsKKyAgICBpbnQgczsKKyNpZmRlZiBJUF9UT1MKKyAgICBpbnQgdG9zOworI2VuZGlmIC8qIElQX1RPUyAqLworI2lmZGVmIFVDWDUwCisgICAgc3RhdGljIHVfaW50IGZyb21sZW47CisjZWxzZQorICAgIHN0YXRpYyBTT0NLT1BUX1QgZnJvbWxlbjsKKyNlbmRpZiAvKiBVQ1g1MCAqLworCisgICAgZnJvbWxlbiA9IHNpemVvZihoaXNkYXRhYWRkcik7CisKKyNpZm5kZWYgTk9fUEFTU0lWRV9NT0RFCisgICAgaWYgKHBhc3NpdmVtb2RlKSB7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgIHNzbF9mdHBfZGF0YV9hY3RpdmVfZmxhZz0wOworICAgICAgICBpZiAoc3NsX2Z0cF9hY3RpdmVfZmxhZyAmJgorICAgICAgICAgICAgKHNzbF9mdHBfcHJveHkgfHwgZnRwX2RwbCA9PSBGUExfUFJWKSkKKyAgICAgICAgICByZXR1cm4oc3NsX2RhdGFjb25uKCkpOworI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICByZXR1cm4oZGF0YSk7CisgICAgfQorI2VuZGlmIC8qIE5PX1BBU1NJVkVfTU9ERSAqLworCisgICAgcyA9IGFjY2VwdChkYXRhLCAoc3RydWN0IHNvY2thZGRyICopICZoaXNkYXRhYWRkciwgJmZyb21sZW4pOworICAgIGlmIChzIDwgMCkgeworICAgICAgICBwZXJyb3IoImZ0cDogYWNjZXB0Iik7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgc29ja2V0X2Nsb3NlKGRhdGEpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgc2h1dGRvd24oZGF0YSwgMSsxKTsKKyNlbmRpZiAvKiBVU0VfU0hVVERPV04gKi8KKyAgICAgICAgY2xvc2UoZGF0YSk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgZGF0YSA9IC0xOworICAgICAgICBnbG9iYWxkaW4gPSBkYXRhOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyNpZmRlZiBUQ1BJUExJQgorICAgIHNvY2tldF9jbG9zZShkYXRhKTsKKyNlbHNlIC8qIFRDUElQTElCICovCisjaWZkZWYgVVNFX1NIVVRET1dOCisgICAgc2h1dGRvd24oZGF0YSwgMSsxKTsKKyNlbmRpZiAvKiBVU0VfU0hVVERPV04gKi8KKyAgICBjbG9zZShkYXRhKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgIGRhdGEgPSBzOworICAgIGdsb2JhbGRpbiA9IGRhdGE7CisjaWZkZWYgSVBfVE9TCisjaWZkZWYgSVBUT1NfVEhST1VHSFBVVAorICAgIHRvcyA9IElQVE9TX1RIUk9VR0hQVVQ7CisgICAgaWYgKHNldHNvY2tvcHQoZGF0YSwgSVBQUk9UT19JUCwgSVBfVE9TLCAoY2hhciAqKSZ0b3MsIHNpemVvZihpbnQpKSA8IDApCisgICAgICBwZXJyb3IoImZ0cDogc2V0c29ja29wdCBUT1MgKGlnbm9yZWQpIik7CisjZW5kaWYgLyogSVBUT1NfVEhST1VHSFBVVCAqLworI2VuZGlmIC8qIElQX1RPUyAqLworCisjaWZkZWYgQ0tfU1NMCisgICAgc3NsX2Z0cF9kYXRhX2FjdGl2ZV9mbGFnPTA7CisgICAgaWYgKHNzbF9mdHBfYWN0aXZlX2ZsYWcgJiYKKyAgICAgICAgKHNzbF9mdHBfcHJveHkgfHwgZnRwX2RwbCA9PSBGUExfUFJWKSkKKyAgICAgIHJldHVybihzc2xfZGF0YWNvbm4oKSk7CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgcmV0dXJuKGRhdGEpOworfQorCisjaWZkZWYgRlRQX1BST1hZCitzdGF0aWMgc2lndHlwZQorcHNjYW5jZWwoc2lnKSBpbnQgc2lnOyB7CisgICAgY2FuY2VsZmlsZSsrOworfQorCitzdGF0aWMgVk9JRAorcHN3aXRjaChmbGFnKSBpbnQgZmxhZzsgeworICAgIGV4dGVybiBpbnQgcHJveHk7CisgICAgc2lnX3Qgb2xkaW50cjsKKyAgICBzdGF0aWMgc3RydWN0IGNvbXZhcnMgeworICAgICAgICBpbnQgY29ubmVjdDsKKyAgICAgICAgY2hhciBuYW1lW01BWEhPU1ROQU1FTEVOXTsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIG1jdGw7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBoY3RsOworICAgICAgICBGSUxFICppbjsKKyAgICAgICAgRklMRSAqb3V0OworICAgICAgICBpbnQgdHBlOworICAgICAgICBpbnQgY3VydHBlOworICAgICAgICBpbnQgY3BuZDsKKyAgICAgICAgaW50IHN1bnFlOworICAgICAgICBpbnQgcnVucWU7CisgICAgICAgIGludCBtY3NlOworICAgICAgICBpbnQgbnRmbGc7CisgICAgICAgIGNoYXIgbnRpWzE3XTsKKyAgICAgICAgY2hhciBudG9bMTddOworICAgICAgICBpbnQgbWFwZmxnOworICAgICAgICBjaGFyIG1pW0NLTUFYUEFUSF07CisgICAgICAgIGNoYXIgbW9bQ0tNQVhQQVRIXTsKKyAgICAgICAgY2hhciAqYXV0aHR5cGU7CisgICAgICAgIGludCBjbHZsOworICAgICAgICBpbnQgZGx2bDsKKyNpZmRlZiBGVFBfS1JCNAorICAgICAgICBkZXNfY2Jsb2NrIHNlc3Npb247CisgICAgICAgIGRlc19rZXlfc2NoZWR1bGUgZnRwX3NjaGVkOworI2VuZGlmIC8qIEZUUF9LUkI0ICovCisjaWZkZWYgRlRQX0dTU0FQSQorICAgICAgICBnc3NfY3R4X2lkX3QgZ2NvbnRleHQ7CisjZW5kaWYgLyogR1NTQVBJICovCisgICAgfSBwcm94c3RydWN0LCB0bXBzdHJ1Y3Q7CisgICAgc3RydWN0IGNvbXZhcnMgKmlwLCAqb3A7CisKKyAgICBjYW5jZWxmaWxlID0gMDsKKyAgICBvbGRpbnRyID0gc2lnbmFsKFNJR0lOVCwgcHNjYW5jZWwpOworICAgIGlmIChmbGFnKSB7CisgICAgICAgIGlmIChwcm94eSkKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGlwID0gJnRtcHN0cnVjdDsKKyAgICAgICAgb3AgPSAmcHJveHN0cnVjdDsKKyAgICAgICAgcHJveHkrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXByb3h5KQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaXAgPSAmcHJveHN0cnVjdDsKKyAgICAgICAgb3AgPSAmdG1wc3RydWN0OworICAgICAgICBwcm94eSA9IDA7CisgICAgfQorICAgIGlwLT5jb25uZWN0ID0gY29ubmVjdGVkOworICAgIGNvbm5lY3RlZCA9IG9wLT5jb25uZWN0OworICAgIGlmIChmdHBfaG9zdCkgeworICAgICAgICBzdHJuY3B5KGlwLT5uYW1lLCBmdHBfaG9zdCwgTUFYSE9TVE5BTUVMRU4gLSAxKTsKKyAgICAgICAgaXAtPm5hbWVbTUFYSE9TVE5BTUVMRU4gLSAxXSA9ICdcMCc7CisgICAgICAgIGlwLT5uYW1lW3N0cmxlbihpcC0+bmFtZSldID0gJ1wwJzsKKyAgICB9IGVsc2UKKyAgICAgIGlwLT5uYW1lWzBdID0gMDsKKyAgICBmdHBfaG9zdCA9IG9wLT5uYW1lOworICAgIGlwLT5oY3RsID0gaGlzY3RsYWRkcjsKKyAgICBoaXNjdGxhZGRyID0gb3AtPmhjdGw7CisgICAgaXAtPm1jdGwgPSBteWN0bGFkZHI7CisgICAgbXljdGxhZGRyID0gb3AtPm1jdGw7CisgICAgaXAtPmluID0gY3NvY2tldDsKKyAgICBjc29ja2V0ID0gb3AtPmluOworICAgIGlwLT5vdXQgPSBjc29ja2V0OworICAgIGNzb2NrZXQgPSBvcC0+b3V0OworICAgIGlwLT50cGUgPSBmdHBfdHlwOworICAgIGZ0cF90eXAgPSBvcC0+dHBlOworICAgIGlwLT5jdXJ0cGUgPSBjdXJ0eXBlOworICAgIGN1cnR5cGUgPSBvcC0+Y3VydHBlOworICAgIGlwLT5jcG5kID0gY3BlbmQ7CisgICAgY3BlbmQgPSBvcC0+Y3BuZDsKKyAgICBpcC0+c3VucWUgPSBmdHBfdXNuOworICAgIGZ0cF91c24gPSBvcC0+c3VucWU7CisgICAgaXAtPm1jc2UgPSBtY2FzZTsKKyAgICBtY2FzZSA9IG9wLT5tY3NlOworICAgIGlwLT5udGZsZyA9IG50ZmxhZzsKKyAgICBudGZsYWcgPSBvcC0+bnRmbGc7CisgICAgc3RybmNweShpcC0+bnRpLCBudGluLCAxNik7CisgICAgKGlwLT5udGkpW3N0cmxlbihpcC0+bnRpKV0gPSAnXDAnOworICAgIHN0cmNweShudGluLCBvcC0+bnRpKTsKKyAgICBzdHJuY3B5KGlwLT5udG8sIG50b3V0LCAxNik7CisgICAgKGlwLT5udG8pW3N0cmxlbihpcC0+bnRvKV0gPSAnXDAnOworICAgIHN0cmNweShudG91dCwgb3AtPm50byk7CisgICAgaXAtPm1hcGZsZyA9IG1hcGZsYWc7CisgICAgbWFwZmxhZyA9IG9wLT5tYXBmbGc7CisgICAgc3RybmNweShpcC0+bWksIG1hcGluLCBDS01BWFBBVEggLSAxKTsKKyAgICAoaXAtPm1pKVtzdHJsZW4oaXAtPm1pKV0gPSAnXDAnOworICAgIHN0cmNweShtYXBpbiwgb3AtPm1pKTsKKyAgICBzdHJuY3B5KGlwLT5tbywgbWFwb3V0LCBDS01BWFBBVEggLSAxKTsKKyAgICAoaXAtPm1vKVtzdHJsZW4oaXAtPm1vKV0gPSAnXDAnOworICAgIHN0cmNweShtYXBvdXQsIG9wLT5tbyk7CisgICAgaXAtPmF1dGh0eXBlID0gYXV0aF90eXBlOworICAgIGF1dGhfdHlwZSA9IG9wLT5hdXRodHlwZTsKKyAgICBpcC0+Y2x2bCA9IGZ0cF9jcGw7CisgICAgZnRwX2NwbCA9IG9wLT5jbHZsOworICAgIGlwLT5kbHZsID0gZnRwX2RwbDsKKyAgICBmdHBfZHBsID0gb3AtPmRsdmw7CisgICAgaWYgKCFmdHBfY3BsKQorICAgICAgZnRwX2NwbCA9IEZQTF9DTFI7CisgICAgaWYgKCFmdHBfZHBsKQorICAgICAgZnRwX2RwbCA9IEZQTF9DTFI7CisjaWZkZWYgRlRQX0tSQjQKKyAgICBtZW1jcHkoaXAtPnNlc3Npb24sIGZ0cF9jcmVkLnNlc3Npb24sIHNpemVvZihmdHBfY3JlZC5zZXNzaW9uKSk7CisgICAgbWVtY3B5KGZ0cF9jcmVkLnNlc3Npb24sIG9wLT5zZXNzaW9uLCBzaXplb2YoZnRwX2NyZWQuc2Vzc2lvbikpOworICAgIG1lbWNweShpcC0+c2NoZWR1bGUsIGZ0cF9zY2hlZCwgc2l6ZW9mKGZ0cF9zY2hlZCkpOworICAgIG1lbWNweShmdHBfc2NoZWQsIG9wLT5zY2hlZHVsZSwgc2l6ZW9mKGZ0cF9zY2hlZCkpOworI2VuZGlmIC8qIEZUUF9LUkI0ICovCisjaWZkZWYgRlRQX0dTU0FQSQorICAgIGlwLT5nY29udGV4dCA9IGdjb250ZXh0OworICAgIGdjb250ZXh0ID0gb3AtPmdjb250ZXh0OworI2VuZGlmIC8qIEdTU0FQSSAqLworICAgIHNpZ25hbChTSUdJTlQsIG9sZGludHIpOworICAgIGlmIChjYW5jZWxmaWxlKSB7CisgICAgICAgIGNhbmNlbGZpbGUgPSAwOworICAgICAgICBkZWJ1ZyhGMTAxLCJwc3dpdGNoIGNhbmNlbGZpbGUgQiIsIiIsY2FuY2VsZmlsZSk7CisgICAgICAgICgqb2xkaW50cikoU0lHSU5UKTsKKyAgICB9Cit9CisKK3N0YXRpYyBzaWd0eXBlCitjYW5jZWxwdChzaWcpIGludCBzaWc7IHsKKyAgICBwcmludGYoIlxuIik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgcHRhYmZsZysrOworICAgIGNhbmNlbGZpbGUgPSAwOworI2lmbmRlZiBPUzIKKyAgICBsb25nam1wKHB0Y2FuY2VsLCAxKTsKKyNlbHNlCisgICAgUG9zdEN0cmxDU2VtKCk7CisjZW5kaWYgLyogT1MyICovCit9CisKK3ZvaWQKK3Byb3h0cmFucyhjbWQsIGxvY2FsLCByZW1vdGUsIHVuaXF1ZSkgY2hhciAqY21kLCAqbG9jYWwsICpyZW1vdGU7IGludCB1bmlxdWU7IHsKKyAgICBzaWdfdCBvbGRpbnRyOworICAgIGludCBzZWNuZGZsYWcgPSAwLCBwcm94X3R5cGUsIG5mbmQ7CisgICAgY2hhciAqY21kMjsKKyNpZmRlZiBCU0RTRUxFQ1QKKyAgICBmZF9zZXQgbWFzazsKKyNlbmRpZiAvKiBCU0RTRUxFQ1QgKi8KKyAgICBzaWd0eXBlIGNhbmNlbHB0KCk7CisKKyAgICBpZiAoc3RyY21wKGNtZCwgIlJFVFIiKSkKKyAgICAgIGNtZDIgPSAiUkVUUiI7CisgICAgZWxzZQorICAgICAgY21kMiA9IHVuaXF1ZSA/ICJTVE9VIiA6ICJTVE9SIjsKKyAgICBpZiAoKHByb3hfdHlwZSA9IHR5cGUpID09IDApIHsKKyAgICAgICAgaWYgKHNlcnZlcnR5cGUgPT0gU1lTX1VOSVggJiYgdW5peF9wcm94eSkKKyAgICAgICAgICBwcm94X3R5cGUgPSBGVFRfQklOOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJveF90eXBlID0gRlRUX0FTQzsKKyAgICB9CisgICAgaWYgKGN1cnR5cGUgIT0gcHJveF90eXBlKQorICAgICAgY2hhbmdldHlwZShwcm94X3R5cGUsIDEpOworICAgIGlmIChmdHBjbWQoIlBBU1YiLE5VTEwsMCwwLGZ0cF92Ym0pICE9IFJFUExZX0NPTVBMRVRFKSB7CisgICAgICAgIHByaW50ZigiUHJveHkgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhpcmQgcGFydHkgdHJhbnNmZXJzLlxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcHN3aXRjaCgwKTsKKyAgICBpZiAoIWNvbm5lY3RlZCkgeworICAgICAgICBwcmludGYoIk5vIHByaW1hcnkgY29ubmVjdGlvblxuIik7CisgICAgICAgIHBzd2l0Y2goMSk7CisgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoY3VydHlwZSAhPSBwcm94X3R5cGUpCisgICAgICBjaGFuZ2V0eXBlKHByb3hfdHlwZSwgMSk7CisKKyAgICBpZiAoZnRwY21kKCJQT1JUIixwYXN2LC0xLC0xLGZ0cF92Ym0pICE9IFJFUExZX0NPTVBMRVRFKSB7CisgICAgICAgIHBzd2l0Y2goMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBSZXBsYWNlIHdpdGggY2FsbHMgdG8gY2NfZXhlY3V0ZSgpICovCisgICAgaWYgKHNldGptcChwdGNhbmNlbCkpCisgICAgICBnb3RvIGNhbmNlbDsKKyAgICBvbGRpbnRyID0gc2lnbmFsKFNJR0lOVCwgY2FuY2VscHQpOworICAgIGlmIChmdHBjbWQoY21kLHJlbW90ZSwtMSwtMSxmdHBfdmJtKSAhPSBQUkVMSU0pIHsKKyAgICAgICAgc2lnbmFsKFNJR0lOVCwgb2xkaW50cik7CisgICAgICAgIHBzd2l0Y2goMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2xlZXAoMjAwMCk7CisgICAgcHN3aXRjaCgxKTsKKyAgICBzZWNuZGZsYWcrKzsKKyAgICBpZiAoZnRwY21kKGNtZDIsbG9jYWwsLTEsLTEsZnRwX3ZibSkgIT0gUFJFTElNKQorICAgICAgZ290byBjYW5jZWw7CisgICAgcHRmbGFnKys7CisgICAgZ2V0cmVwbHkoMCwtMSwtMSxmdHBfdmJtLDApOworICAgIHBzd2l0Y2goMCk7CisgICAgZ2V0cmVwbHkoMCwtMSwtMSxmdHBfdmJtLDApOworICAgIHNpZ25hbChTSUdJTlQsIG9sZGludHIpOworICAgIHBzd2l0Y2goMSk7CisgICAgcHRmbGFnID0gMDsKKyAgICByZXR1cm47CisKKyAgY2FuY2VsOgorICAgIHNpZ25hbChTSUdJTlQsIFNJR19JR04pOworICAgIHB0ZmxhZyA9IDA7CisgICAgaWYgKHN0cmNtcChjbWQsICJSRVRSIikgJiYgIXByb3h5KQorICAgICAgcHN3aXRjaCgxKTsKKyAgICBlbHNlIGlmICghc3RyY21wKGNtZCwgIlJFVFIiKSAmJiBwcm94eSkKKyAgICAgIHBzd2l0Y2goMCk7CisgICAgaWYgKCFjcGVuZCAmJiAhc2VjbmRmbGFnKSB7ICAvKiBvbmx5IGhlcmUgaWYgY21kID0gIlNUT1IiIChwcm94eT0xKSAqLworICAgICAgICBpZiAoZnRwY21kKGNtZDIsbG9jYWwsLTEsLTEsZnRwX3ZibSkgIT0gUFJFTElNKSB7CisgICAgICAgICAgICBwc3dpdGNoKDApOworICAgICAgICAgICAgaWYgKGNwZW5kKQorICAgICAgICAgICAgICBjYW5jZWxfcmVtb3RlKDApOworICAgICAgICB9CisgICAgICAgIHBzd2l0Y2goMSk7CisgICAgICAgIGlmIChwdGFiZmxnKQorICAgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyAgICAgICAgc2lnbmFsKFNJR0lOVCwgb2xkaW50cik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGNwZW5kKQorICAgICAgY2FuY2VsX3JlbW90ZSgwKTsKKyAgICBwc3dpdGNoKCFwcm94eSk7CisgICAgaWYgKCFjcGVuZCAmJiAhc2VjbmRmbGFnKSB7ICAvKiBvbmx5IGlmIGNtZCA9ICJSRVRSIiAocHJveHk9MSkgKi8KKyAgICAgICAgaWYgKGZ0cGNtZChjbWQyLGxvY2FsLC0xLC0xLGZ0cF92Ym0pICE9IFBSRUxJTSkgeworICAgICAgICAgICAgcHN3aXRjaCgwKTsKKyAgICAgICAgICAgIGlmIChjcGVuZCkKKyAgICAgICAgICAgICAgY2FuY2VsX3JlbW90ZSgwKTsKKyAgICAgICAgICAgIHBzd2l0Y2goMSk7CisgICAgICAgICAgICBpZiAocHRhYmZsZykKKyAgICAgICAgICAgICAgZnRwY29kZSA9IC0xOworICAgICAgICAgICAgc2lnbmFsKFNJR0lOVCwgb2xkaW50cik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNwZW5kKQorICAgICAgY2FuY2VsX3JlbW90ZSgwKTsKKyAgICBwc3dpdGNoKCFwcm94eSk7CisgICAgaWYgKGNwZW5kKSB7CisjaWZkZWYgQlNEU0VMRUNUCisgICAgICAgIEZEX1pFUk8oJm1hc2spOworICAgICAgICBGRF9TRVQoY3NvY2tldCwgJm1hc2spOworICAgICAgICBpZiAoKG5mbmQgPSBlbXB0eSgmbWFzaywgMTApKSA8PSAwKSB7CisgICAgICAgICAgICBpZiAobmZuZCA8IDApIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoImNhbmNlbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB0YWJmbGcpCisgICAgICAgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyAgICAgICAgICAgIGxvc3RwZWVyKCk7CisgICAgICAgIH0KKyNlbHNlIC8qIEJTRFNFTEVDVCAqLworI2lmZGVmIElCTVNFTEVDVAorICAgICAgICBpZiAoKG5mbmQgPSBlbXB0eSgmY3NvY2tldCwgMSwgMTApKSA8PSAwKSB7CisgICAgICAgICAgICBpZiAobmZuZCA8IDApIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoImNhbmNlbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB0YWJmbGcpCisgICAgICAgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyAgICAgICAgICAgIGxvc3RwZWVyKCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBJQk1TRUxFQ1QgKi8KKyNlbmRpZiAvKiBCU0RTRUxFQ1QgKi8KKyAgICAgICAgZ2V0cmVwbHkoMCwtMSwtMSxmdHBfdmJtLDApOworICAgICAgICBnZXRyZXBseSgwLC0xLC0xLGZ0cF92Ym0sMCk7CisgICAgfQorICAgIGlmIChwcm94eSkKKyAgICAgIHBzd2l0Y2goMCk7CisgICAgcHN3aXRjaCgxKTsKKyAgICBpZiAocHRhYmZsZykKKyAgICAgIGZ0cGNvZGUgPSAtMTsKKyAgICBzaWduYWwoU0lHSU5ULCBvbGRpbnRyKTsKK30KKyNlbmRpZiAvKiBGVFBfUFJPWFkgKi8KKworI2lmZGVmIEZUUF9TRUNVUklUWQorI2lmZGVmIEZUUF9HU1NBUEkKKworc3RydWN0IHsKKyAgICBDT05TVCBnc3NfT0lEX2Rlc2MgKiBDT05TVCAqIG1lY2hfdHlwZTsKKyAgICBjaGFyICpzZXJ2aWNlX25hbWU7Cit9IGdzc190cmlhbHNbXSA9IHsKKyAgICB7ICZnc3NfbWVjaF9rcmI1LCAiZnRwIiB9LAorICAgIHsgJmdzc19tZWNoX2tyYjUsICJob3N0IiB9LAorfTsKKworaW50IG5fZ3NzX3RyaWFscyA9IHNpemVvZihnc3NfdHJpYWxzKS9zaXplb2YoZ3NzX3RyaWFsc1swXSk7CisjZW5kaWYgLyogRlRQX0dTU0FQSSAqLworCitzdGF0aWMgaW50CitmdHBfYXV0aCgpIHsKKyAgICBleHRlcm4gaW50IHNldHNhZmUoKTsKKyAgICBpbnQgaiA9IDAsIG47CisjaWZkZWYgRlRQX0tSQjQKKyAgICBjaGFyICpzZXJ2aWNlLCBpbnN0W0lOU1RfU1pdOworICAgIFVMT05HIGNrc3VtOworICAgIFVMT05HIGNoZWNrc3VtID0gKFVMT05HKSBnZXRwaWQoKTsKKyAgICBDSEFSIG91dF9idWZbRlRQX0JVRlNJWl07CisgICAgaW50IGk7CisjZWxzZSAvKiBGVFBfS1JCNCAqLworI2lmZGVmIEZUUF9HU1NBUEkKKyAgICBDSEFSIG91dF9idWZbRlRQX0JVRlNJWl07CisgICAgaW50IGk7CisjZW5kaWYgLyogRlRQX0dTU0FQSSAqLworI2VuZGlmIC8qIEZUUF9LUkI0ICovCisKKyAgICBpZiAoc3NsX2Z0cF9wcm94eSkgICAgICAgICAgICAgICAgICAvKiBEbyBub3QgYWxsb3cgQVVUSCBvdmVyIFNTTCBwcm94eSAqLworICAgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAoYXV0aF90eXBlKQorICAgICAgcmV0dXJuKDEpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGF1dGggYWxyZWFkeSBzdWNjZWVkZWQgKi8KKworICAgIC8qIFRyeSBlYWNoIGF1dGggdHlwZSBhcyBzcGVjaWZpZWQgYnkgdGhlIGVuZCB1c2VyICovCisgICAgZm9yIChqID0gMDsgaiA8IDggJiYgZnRwX2F1dGhfdHlwZVtqXSAhPSAwOyBqKyspIHsKKyNpZmRlZiBGVFBfR1NTQVBJCisgICAgICAgIGlmIChmdHBfYXV0aF90eXBlW2pdID09IEZUQV9HSzUgJiYgY2tfZ3NzYXBpX2lzX2luc3RhbGxlZCgpKSB7CisgICAgICAgICAgICBuID0gZnRwY21kKCJBVVRIIEdTU0FQSSIsTlVMTCwwLDAsZnRwX3ZibSk7CisgICAgICAgICAgICBpZiAobiA9PSBSRVBMWV9DT05USU5VRSkgeworICAgICAgICAgICAgICAgIE9NX3VpbnQzMiBtYWpfc3RhdCwgbWluX3N0YXQ7CisgICAgICAgICAgICAgICAgZ3NzX25hbWVfdCB0YXJnZXRfbmFtZTsKKyAgICAgICAgICAgICAgICBnc3NfYnVmZmVyX2Rlc2Mgc2VuZF90b2ssIHJlY3ZfdG9rLCAqdG9rZW5fcHRyOworICAgICAgICAgICAgICAgIGNoYXIgc3RidWZbRlRQX0JVRlNJWl07CisgICAgICAgICAgICAgICAgaW50IGNvbWNvZGUsIHRyaWFsOworICAgICAgICAgICAgICAgIHN0cnVjdCBnc3NfY2hhbm5lbF9iaW5kaW5nc19zdHJ1Y3QgY2hhbjsKKyAgICAgICAgICAgICAgICBjaGFyICogcmVhbG0gPSBOVUxMOworICAgICAgICAgICAgICAgIGNoYXIgdGd0WzI1Nl07CisKKyAgICAgICAgICAgICAgICBjaGFuLmluaXRpYXRvcl9hZGRydHlwZSA9IEdTU19DX0FGX0lORVQ7IC8qIE9NX3VpbnQzMiAgKi8KKyAgICAgICAgICAgICAgICBjaGFuLmluaXRpYXRvcl9hZGRyZXNzLmxlbmd0aCA9IDQ7CisgICAgICAgICAgICAgICAgY2hhbi5pbml0aWF0b3JfYWRkcmVzcy52YWx1ZSA9ICZteWN0bGFkZHIuc2luX2FkZHIuc19hZGRyOworICAgICAgICAgICAgICAgIGNoYW4uYWNjZXB0b3JfYWRkcnR5cGUgPSBHU1NfQ19BRl9JTkVUOyAvKiBPTV91aW50MzIgKi8KKyAgICAgICAgICAgICAgICBjaGFuLmFjY2VwdG9yX2FkZHJlc3MubGVuZ3RoID0gNDsKKyAgICAgICAgICAgICAgICBjaGFuLmFjY2VwdG9yX2FkZHJlc3MudmFsdWUgPSAmaGlzY3RsYWRkci5zaW5fYWRkci5zX2FkZHI7CisgICAgICAgICAgICAgICAgY2hhbi5hcHBsaWNhdGlvbl9kYXRhLmxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgY2hhbi5hcHBsaWNhdGlvbl9kYXRhLnZhbHVlID0gMDsKKworICAgICAgICAgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgICAgICAgICBwcmludGYoIkdTU0FQSSBhY2NlcHRlZCBhcyBhdXRoZW50aWNhdGlvbiB0eXBlXG4iKTsKKworICAgICAgICAgICAgICAgIHJlYWxtID0gY2tfa3JiNV9yZWFsbW9maG9zdChmdHBfdXNlcl9ob3N0KTsKKyAgICAgICAgICAgICAgICBpZiAocmVhbG0pIHsKKyAgICAgICAgICAgICAgICAgICAgY2ttYWttc2codGd0LHNpemVvZih0Z3QpLCJrcmJ0Z3QvIixyZWFsbSwiQCIscmVhbG0pOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmdHBfYXV0aChHU1NBUEkpIFRHVCIsdGd0LDApOworICAgICAgICAgICAgICAgICAgICBpZiAoIGtyYjVfYXV0b2dldCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICEoKGNrX2tyYjVfdGt0X2lzdmFsaWQoTlVMTCx0Z3QpID4gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2tfa3JiNV9pc190Z3RfdmFsaWQoKSA+IDApKSApCisgICAgICAgICAgICAgICAgICAgICAgICBja19rcmI1X2F1dG9nZXRfVEdUKHJlYWxtKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBCbG9iIGZyb20gZ3NzLWNsaWVudCAqLworICAgICAgICAgICAgICAgIGZvciAodHJpYWwgPSAwOyB0cmlhbCA8IG5fZ3NzX3RyaWFsczsgdHJpYWwrKykgeworICAgICAgICAgICAgICAgICAgICAvKiBmdHBAaG9zdG5hbWUgZmlyc3QsIHRoZSBob3N0QGhvc3RuYW1lICovCisgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBWNSBHU1NBUEkgYmluZGluZyBjYW5vbmljYWxpemVzIHRoaXMgZm9yIHVzLi4uICovCisgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKHN0YnVmLEZUUF9CVUZTSVosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc190cmlhbHNbdHJpYWxdLnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfdXNlcl9ob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmdHBfZGViKQorICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGhlbnRpY2F0aW5nIHRvIDwlcz4uLi5cbiIsIHN0YnVmKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZF90b2sudmFsdWUgPSBzdGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgc2VuZF90b2subGVuZ3RoID0gc3RybGVuKHN0YnVmKTsKKyAgICAgICAgICAgICAgICAgICAgbWFqX3N0YXQgPSBnc3NfaW1wb3J0X25hbWUoJm1pbl9zdGF0LCAmc2VuZF90b2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc19udF9zZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBpZiAobWFqX3N0YXQgIT0gR1NTX1NfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZ3NzX2Vycm9yKG1hal9zdGF0LCBtaW5fc3RhdCwgInBhcnNpbmcgbmFtZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlX2Vycm9yKCJuYW1lIHBhcnNlZCA8JXM+XG4iLCBzdGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0b2tlbl9wdHIgPSBHU1NfQ19OT19CVUZGRVI7CisgICAgICAgICAgICAgICAgICAgIGdjb250ZXh0ID0gR1NTX0NfTk9fQ09OVEVYVDsgLyogc3RydWN0dXJlIGNvcHkgKi8KKworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnRwX2RlYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjYWxsaW5nIGdzc19pbml0X3NlY19jb250ZXh0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hal9zdGF0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzX2luaXRfc2VjX2NvbnRleHQoJm1pbl9zdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1NfQ19OT19DUkVERU5USUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3NzX09JRCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc190cmlhbHNbdHJpYWxdLm1lY2hfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NTX0NfTVVUVUFMX0ZMQUcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1NfQ19SRVBMQVlfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdHBfY2Z3ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTU19DX0RFTEVHX0ZMQUcgOiAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgYmluZGluZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrcmI1X2Rfbm9fYWRkcmVzc2VzID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NTX0NfTk9fQ0hBTk5FTF9CSU5ESU5HUyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgLyogaWdub3JlIG1lY2ggdHlwZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VuZF90b2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgIC8qIGlnbm9yZSByZXRfZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOyAgICAgICAvKiBpZ25vcmUgdGltZV9yZWMgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hal9zdGF0ICE9IEdTU19TX0NPTVBMRVRFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFqX3N0YXQgIT0gR1NTX1NfQ09OVElOVUVfTkVFREVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyaWFsID09IG5fZ3NzX3RyaWFscy0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9nc3NfZXJyb3IobWFqX3N0YXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc3RhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0aWFsaXppbmcgY29udGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzX3JlbGVhc2VfbmFtZSgmbWluX3N0YXQsICZ0YXJnZXRfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF5YmUgd2UgbWlzc2VkIG9uIHRoZSBzZXJ2aWNlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dGVyX2xvb3A7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VuZF90b2subGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5X3BhcnNlID0gIkFEQVQ9IjsgLyogZm9yIGZ0cGNtZCgpIGxhdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gRlRQX0JVRlNJWjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJyb3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXhfZW5jb2RlKHNlbmRfdG9rLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF90b2subGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFESVhfRU5DT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2Vycm9yKSAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzZSA2NCBlbmNvZGluZyBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl4X2Vycm9yKGtlcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGdzc19jb21wbGV0ZV9sb29wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21jb2RlID0gZnRwY21kKCJBREFUIixvdXRfYnVmLC0xLC0xLDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21jb2RlICE9IFJFUExZX0NPTVBMRVRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbWNvZGUgIT0gUkVQTFlfQ09OVElOVUUgLyogKDMzNSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmlhbCA9PSBuX2dzc190cmlhbHMtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJHU1NBUEkgQURBVCBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yY2Ugb3V0IG9mIGxvb3AgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hal9zdGF0ID0gR1NTX1NfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2tvZmYgdG8gdGhlIHYxIGdzc2FwaSBpcyBzdGlsbCBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kIGEgbmV3IEFVVEggY29tbWFuZC4gIElmIHRoYXQgZmFpbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlIHRoZSBsb29wLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnRwY21kKCJBVVRIIEdTU0FQSSIsTlVMTCwwLDAsZnRwX3ZibSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IFJFUExZX0NPTlRJTlVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdTU0FQSSBBREFUIGZhaWxlZCwgQVVUSCByZXN0YXJ0IGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSBvdXQgb2YgbG9vcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFqX3N0YXQgPSBHU1NfU19GQUlMVVJFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0ZXJfbG9vcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXBseV9wYXJzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBhdXRoZW50aWNhdGlvbiBkYXRhIHJlY2VpdmVkIGZyb20gc2VydmVyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hal9zdGF0ID09IEdTU19TX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uLmJ1dCBubyBtb3JlIHdhcyBuZWVkZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBnc3NfY29tcGxldGVfbG9vcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZ3NzX2Vycm9yKG1hal9zdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3N0YXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gcmVwbHksIGh1aD8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBnc3NfY29tcGxldGVfbG9vcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBGVFBfQlVGU0laOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcnJvciA9IHJhZGl4X2VuY29kZShyZXBseV9wYXJzZSxvdXRfYnVmLGksJmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFESVhfREVDT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2Vycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYXNlIDY0IGRlY29kaW5nIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXhfZXJyb3Ioa2Vycm9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZ3NzX2NvbXBsZXRlX2xvb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXZlcnl0aGluZyB3b3JrZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbl9wdHIgPSAmcmVjdl90b2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdl90b2sudmFsdWUgPSBvdXRfYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ZfdG9rLmxlbmd0aCA9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBvdXQgb2YgbG9vcCBjbGVhbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBnc3NfY29tcGxldGVfbG9vcDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbCA9IG5fZ3NzX3RyaWFscy0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc19yZWxlYXNlX2J1ZmZlcigmbWluX3N0YXQsICZzZW5kX3Rvayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzX3JlbGVhc2VfbmFtZSgmbWluX3N0YXQsICZ0YXJnZXRfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXRlcl9sb29wOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChtYWpfc3RhdCA9PSBHU1NfU19DT05USU5VRV9ORUVERUQpOworCisgICAgICAgICAgICAgICAgICBvdXRlcl9sb29wOgorICAgICAgICAgICAgICAgICAgICBpZiAobWFqX3N0YXQgPT0gR1NTX1NfQ09NUExFVEUpCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtYWpfc3RhdCA9PSBHU1NfU19DT01QTEVURSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIkdTU0FQSSBhdXRoZW50aWNhdGlvbiBzdWNjZWVkZWRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXBseV9wYXJzZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGF1dGhfdHlwZSA9ICJHU1NBUEkiOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJHU1NBUEkgYXV0aGVudGljYXRpb24gZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHlfcGFyc2UgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGZ0cF9kZWIpCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJHU1NBUEkgcmVqZWN0ZWQgYXMgYW4gYXV0aGVudGljYXRpb24gdHlwZVxuIik7CisgICAgICAgICAgICAgICAgaWYgKGZ0cGNvZGUgPT0gNTAwIHx8IGZ0cGNvZGUgPT0gNTAyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBGVFBfR1NTQVBJICovCisjaWZkZWYgRlRQX1NSUAorICAgICAgICBpZiAoZnRwX2F1dGhfdHlwZVtqXSA9PSBGVEFfU1JQICYmIGNrX3NycF9pc19pbnN0YWxsZWQoKSkgeworICAgICAgICAgICAgaWYgKHNycF9mdHBfYXV0aChmdHBfdXNlcl9ob3N0LE5VTEwsTlVMTCkpCisgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZ0cGNvZGUgPT0gNTAwIHx8IGZ0cGNvZGUgPT0gNTAyKQorICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBGVFBfU1JQICovCisjaWZkZWYgRlRQX0tSQjQKKyAgICAgICAgaWYgKGZ0cF9hdXRoX3R5cGVbal0gPT0gRlRBX0s0ICYmIGNrX2tyYjRfaXNfaW5zdGFsbGVkKCkpIHsKKyAgICAgICAgICAgIG4gPSBmdHBjbWQoIkFVVEggS0VSQkVST1NfVjQiLE5VTEwsMCwwLGZ0cF92Ym0pOworICAgICAgICAgICAgaWYgKG4gPT0gUkVQTFlfQ09OVElOVUUpIHsKKyAgICAgICAgICAgICAgICBjaGFyIHRndFs0KlJFQUxNX1NaKzFdOworICAgICAgICAgICAgICAgIGludCByYzsKKworICAgICAgICAgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgICAgICAgICBwcmludGYoIktFUkJFUk9TX1Y0IGFjY2VwdGVkIGFzIGF1dGhlbnRpY2F0aW9uIHR5cGVcbiIpOworICAgICAgICAgICAgICAgIGNrc3RybmNweShpbnN0LCAoY2hhciAqKSBrcmJfZ2V0X3Bob3N0KGZ0cF91c2VyX2hvc3QpLElOU1RfU1opOworICAgICAgICAgICAgICAgIGNrc3RybmNweShmdHBfcmVhbG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopY2tfa3JiNF9yZWFsbW9maG9zdChmdHBfdXNlcl9ob3N0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTE1fU1oKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIGNrbWFrbXNnKHRndCxzaXplb2YodGd0KSwia3JidGd0LiIsZnRwX3JlYWxtLCJAIixmdHBfcmVhbG0pOworICAgICAgICAgICAgICAgIHJjID0gY2tfa3JiNF90a3RfaXN2YWxpZCh0Z3QpOworCisgICAgICAgICAgICAgICAgaWYgKHJjIDw9IDAgJiYga3JiNF9hdXRvZ2V0KQorICAgICAgICAgICAgICAgICAgY2tfa3JiNF9hdXRvZ2V0X1RHVChmdHBfcmVhbG0pOworCisgICAgICAgICAgICAgICAgc2VydmljZSA9ICJmdHAiOworICAgICAgICAgICAgICAgIGtlcnJvciA9IGtyYl9ta19yZXEoJmZ0cF90a3Qsc2VydmljZSxpbnN0LGZ0cF9yZWFsbSxjaGVja3N1bSk7CisgICAgICAgICAgICAgICAgaWYgKGtlcnJvciA9PSBLRENfUFJfVU5LTk9XTikgeworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gInJjbWQiOworICAgICAgICAgICAgICAgICAgICBrZXJyb3IgPSBrcmJfbWtfcmVxKCZmdHBfdGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfcmVhbG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoa2Vycm9yKQorICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJLZXJiZXJvcyBWNCBrcmJfbWtfcmVxIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYl9nZXRfZXJyX3RleHQoa2Vycm9yKSk7CisgICAgICAgICAgICAgICAgaWYgKCFrZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAga2Vycm9yID0ga3JiX2dldF9jcmVkKHNlcnZpY2UsIGluc3QsIGZ0cF9yZWFsbSwmZnRwX2NyZWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoa2Vycm9yKQorICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiS2VyYmVyb3MgVjQga3JiX2dldF9jcmVkIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmJfZ2V0X2Vycl90ZXh0KGtlcnJvcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWtlcnJvcikgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmM7CisgICAgICAgICAgICAgICAgICAgIHJjID0gZGVzX2tleV9zY2hlZChmdHBfY3JlZC5zZXNzaW9uLCBmdHBfc2NoZWQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/SW52YWxpZCBERVMga2V5IHNwZWNpZmllZCBpbiBjcmVkZW50aWFsc1xyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwX2F1dGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBERVMgS2V5IHNwZWNpZmllZCBpbiBjcmVkZW50aWFscyIsMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHJjID09IC0yICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/V2VhayBERVMga2V5IHNwZWNpZmllZCBpbiBjcmVkZW50aWFsc1xyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ0cF9hdXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWFrIERFUyBLZXkgc3BlY2lmaWVkIGluIGNyZWRlbnRpYWxzIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggcmMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0RFUyBLZXkgU2NoZWR1bGUgbm90IHNldCBieSBjcmVkZW50aWFsc1xyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ0cF9hdXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJERVMgS2V5IFNjaGVkdWxlIG5vdCBzZXQgYnkgY3JlZGVudGlhbHMiLDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcGx5X3BhcnNlID0gIkFEQVQ9IjsKKyAgICAgICAgICAgICAgICAgICAgaSA9IEZUUF9CVUZTSVo7CisgICAgICAgICAgICAgICAgICAgIGtlcnJvciA9IHJhZGl4X2VuY29kZShmdHBfdGt0LmRhdCwgb3V0X2J1ZiwgZnRwX3RrdC5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaSwgUkFESVhfRU5DT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtlcnJvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJCYXNlIDY0IGVuY29kaW5nIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl4X2Vycm9yKGtlcnJvcikpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBrcmI0X2VycjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IEZUUF9CVUZTSVogLSA2KQorICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0FEQVQgZGF0YSB0b28gbG9uZ1xuIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmdHBjbWQoIkFEQVQiLG91dF9idWYsLTEsLTEsMCkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgIFJFUExZX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIktlcmJlcm9zIFY0IGF1dGhlbnRpY2F0aW9uIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGtyYjRfZXJyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVwbHlfcGFyc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gYXV0aGVudGljYXRpb24gZGF0YSByZWNlaXZlZCBmcm9tIHNlcnZlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGtyYjRfZXJyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGkgPSBzaXplb2Yob3V0X2J1Zik7CisgICAgICAgICAgICAgICAgICAgIGtlcnJvciA9CisgICAgICAgICAgICAgICAgICAgICAgcmFkaXhfZW5jb2RlKHJlcGx5X3BhcnNlLCBvdXRfYnVmLCAwLCAmaSwgUkFESVhfREVDT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtlcnJvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJCYXNlIDY0IGRlY29kaW5nIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl4X2Vycm9yKGtlcnJvcikpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBrcmI0X2VycjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBrZXJyb3IgPSBrcmJfcmRfc2FmZShvdXRfYnVmLCBpLAorI2lmZGVmIEtSQjUyNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfY3JlZC5zZXNzaW9uLAorI2Vsc2UgLyogS1JCNTI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmdHBfY3JlZC5zZXNzaW9uLAorI2VuZGlmIC8qIEtSQjUyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlzY3RsYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm15Y3RsYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ0cF9tc2dfZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBpZiAoa2Vycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIktlcmJlcm9zIFY0IGtyYl9yZF9zYWZlIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYl9nZXRfZXJyX3RleHQoa2Vycm9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGtyYjRfZXJyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogZmV0Y2ggdGhlIChtb2RpZmllZCkgY2hlY2tzdW0gKi8KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZja3N1bSwgZnRwX21zZ19kYXRhLmFwcF9kYXRhLCBzaXplb2YoY2tzdW0pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG50b2hsKGNrc3VtKSA9PSBjaGVja3N1bSArIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdHBfdmJtKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIktlcmJlcm9zIFY0IGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBseV9wYXJzZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX3R5cGUgPSAiS0VSQkVST1NfVjQiOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXJiZXJvcyBWNCBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgIGtyYjRfZXJyOgorICAgICAgICAgICAgICAgICAgICByZXBseV9wYXJzZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZnRwX2RlYikKKwkJICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAiS0VSQkVST1NfVjQgcmVqZWN0ZWQgYXMgYW4gYXV0aGVudGljYXRpb24gdHlwZVxuIik7CisgICAgICAgICAgICAgICAgaWYgKGZ0cGNvZGUgPT0gNTAwIHx8IGZ0cGNvZGUgPT0gNTAyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBGVFBfS1JCNCAqLworI2lmZGVmIENLX1NTTAorICAgICAgICBpZiAoZnRwX2F1dGhfdHlwZVtqXSA9PSBGVEFfVExTICYmIGNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSkgeworI2lmZGVmIEZUUEhPU1QKKyAgICAgICAgICAgIGlmICghaG9zdGNtZCkgeworICAgICAgICAgICAgICAgIGZ0cGNtZCgiSE9TVCIsZnRwX3VzZXJfaG9zdCwwLDAsMCk7CisgICAgICAgICAgICAgICAgaG9zdGNtZCA9IDE7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogRlRQSE9TVCAqLworICAgICAgICAgICAgbiA9IGZ0cGNtZCgiQVVUSCBUTFMiLE5VTEwsMCwwLGZ0cF92Ym0pOworICAgICAgICAgICAgaWYgKG4gIT0gUkVQTFlfQ09NUExFVEUpCisgICAgICAgICAgICAgIG4gPSBmdHBjbWQoIkFVVEggVExTLVAiLE5VTEwsMCwwLGZ0cF92Ym0pOworICAgICAgICAgICAgaWYgKG4gPT0gUkVQTFlfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCJUTFMgYWNjZXB0ZWQgYXMgYXV0aGVudGljYXRpb24gdHlwZVxuIik7CisKKyAgICAgICAgICAgICAgICBhdXRoX3R5cGUgPSAiVExTIjsKKyAgICAgICAgICAgICAgICBzc2xfYXV0aCgpOworICAgICAgICAgICAgICAgIGlmIChzc2xfZnRwX2FjdGl2ZV9mbGFnICkgeworICAgICAgICAgICAgICAgICAgICBmdHBfZHBsID0gRlBMX0NMUjsKKyAgICAgICAgICAgICAgICAgICAgZnRwX2NwbCA9IEZQTF9QUlY7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiVExTIGF1dGhlbnRpY2F0aW9uIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIGF1dGhfdHlwZSA9IE5VTEw7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICAgICAgICAgICAgc29ja2V0X2Nsb3NlKGNzb2NrZXQpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgICAgICAgICAgICAgc2h1dGRvd24oY3NvY2tldCwgMSsxKTsKKyNlbmRpZiAvKiBVU0VfU0hVVERPV04gKi8KKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoY3NvY2tldCk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgICAgICAgICAgY3NvY2tldCA9IC0xOworICAgICAgICAgICAgICAgICAgICBpZiAoZnRwX2hvb2t1cChmdHBfdXNlcl9ob3N0LGZ0cF9wb3J0LDApID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGZ0cF9kZWIpCisJCSAgZnByaW50ZihzdGRlcnIsIlRMUyByZWplY3RlZCBhcyBhbiBhdXRoZW50aWNhdGlvbiB0eXBlXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoZnRwY29kZSA9PSA1MDAgfHwgZnRwY29kZSA9PSA1MDIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZnRwX2F1dGhfdHlwZVtqXSA9PSBGVEFfU1NMICYmIGNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSkgeworI2lmZGVmIEZUUEhPU1QKKyAgICAgICAgICAgIGlmICghaG9zdGNtZCkgeworICAgICAgICAgICAgICAgIGZ0cGNtZCgiSE9TVCIsZnRwX3VzZXJfaG9zdCwwLDAsMCk7CisgICAgICAgICAgICAgICAgaG9zdGNtZCA9IDE7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogRlRQSE9TVCAqLworICAgICAgICAgICAgbiA9IGZ0cGNtZCgiQVVUSCBTU0wiLE5VTEwsMCwwLGZ0cF92Ym0pOworICAgICAgICAgICAgaWYgKG4gPT0gUkVQTFlfQ09OVElOVUUgfHwgbiA9PSBSRVBMWV9DT01QTEVURSkgeworICAgICAgICAgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgICAgICAgICBwcmludGYoIlNTTCBhY2NlcHRlZCBhcyBhdXRoZW50aWNhdGlvbiB0eXBlXG4iKTsKKyAgICAgICAgICAgICAgICBhdXRoX3R5cGUgPSAiU1NMIjsKKyAgICAgICAgICAgICAgICBzc2xfYXV0aCgpOworICAgICAgICAgICAgICAgIGlmIChzc2xfZnRwX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIGZ0cF9kcGwgPSBGUExfUFJWOworICAgICAgICAgICAgICAgICAgICBmdHBfY3BsID0gRlBMX1BSVjsKKyAgICAgICAgICAgICAgICAgICAgc2V0cHJvdGJ1ZigxPDwyMCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiU1NMIGF1dGhlbnRpY2F0aW9uIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIGF1dGhfdHlwZSA9IE5VTEw7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICAgICAgICAgICAgc29ja2V0X2Nsb3NlKGNzb2NrZXQpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgICAgICAgICAgICAgc2h1dGRvd24oY3NvY2tldCwgMSsxKTsKKyNlbmRpZiAvKiBVU0VfU0hVVERPV04gKi8KKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoY3NvY2tldCk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgICAgICAgICAgY3NvY2tldCA9IC0xOworICAgICAgICAgICAgICAgICAgICBpZiAoZnRwX2hvb2t1cChmdHBfdXNlcl9ob3N0LGZ0cF9wb3J0LDApID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgICAgIH0KKwkgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZnRwX2RlYikKKwkJICBmcHJpbnRmKHN0ZGVyciwgIlNTTCByZWplY3RlZCBhcyBhbiBhdXRoZW50aWNhdGlvbiB0eXBlXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoZnRwY29kZSA9PSA1MDAgfHwgZnRwY29kZSA9PSA1MDIpCisJCSAgcmV0dXJuKDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgIC8qIE90aGVyIGF1dGggdHlwZXMgZ28gaGVyZSAuLi4gKi8KKyAgICB9IC8qIGZvciAoajs7KSAqLworICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBGVFBfU0VDVVJJVFkgKi8KKworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCitzZXRwcm90YnVmKHVuc2lnbmVkIGludCBzaXplKQorI2Vsc2UKK3NldHByb3RidWYoc2l6ZSkgdW5zaWduZWQgaW50IHNpemU7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHNldHByb3RidWYgKi8geworICAgIGlmICh1Y2J1ZikKKyAgICAgIGZyZWUodWNidWYpOworICAgIHVjYnVmID0gTlVMTDsKKyAgICB1Y2J1ZnNpeiA9IDA7CisgICAgYWN0dWFsYnVmID0gc2l6ZTsKKyAgICB3aGlsZSAoKHVjYnVmID0gKENIQVIgKiltYWxsb2MoYWN0dWFsYnVmKSkgPT0gTlVMTCkgeworICAgICAgICBpZiAoYWN0dWFsYnVmKQorICAgICAgICAgIGFjdHVhbGJ1ZiAvPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICB1Y2J1ZnNpeiA9IGFjdHVhbGJ1ZiAtIEZVREdFX0ZBQ1RPUjsKKyAgICBkZWJ1ZyhGMTAxLCJzZXRwcm90YnVmIHVjYnVmc2l6IiwiIix1Y2J1ZnNpeik7CisgICAgaWYgKHVjYnVmc2l6IDwgMTI4KSB7CisgICAgICAgIHByaW50ZigiV0FSTklORzogdGlueSB1Y2J1ZnNpejogJWRcbiIsdWNidWZzaXopOworICAgIH0gZWxzZSBpZiAodWNidWZzaXogPCAwKSB7CisgICAgICAgIHByaW50ZigiRVJST1I6IHVjYnVmIGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIG1heGJ1ZiA9IGFjdHVhbGJ1ZjsKKyAgICByZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKKyNpZmRlZiBDS19BTlNJQworc2V0cGJzeih1bnNpZ25lZCBpbnQgc2l6ZSkKKyNlbHNlCitzZXRwYnN6KHNpemUpIHVuc2lnbmVkIGludCBzaXplOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBzZXRwYnN6ICovIHsKKyAgICBpZiAoIXNldHByb3RidWYoc2l6ZSkpIHsKKyAgICAgICAgcGVycm9yKCI/RXJyb3Igd2hpbGUgdHJ5aW5nIHRvIG1hbGxvYyBQUk9UIGJ1ZmZlcjoiKTsKKyNpZmRlZiBGVFBfU1JQCisgICAgICAgIHNycF9yZXNldCgpOworI2VuZGlmIC8qIEZUUF9TUlAgKi8KKyAgICAgICAgZnRwY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgcmVwbHlfcGFyc2UgPSAiUEJTWj0iOworICAgIGNrbWFrbXNnKGZ0cGNtZGJ1ZixGVFBfQlVGU0laLCJQQlNaICIsCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICAgc3NsX2Z0cF9hY3RpdmVfZmxhZyA/ICIwIiA6CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgY2t1aXRvYShhY3R1YWxidWYpLE5VTEwsTlVMTCk7CisgICAgaWYgKGZ0cGNtZChmdHBjbWRidWYsTlVMTCwwLDAsMCkgIT0gUkVQTFlfQ09NUExFVEUpIHsKKyAgICAgICAgaWYgKGNvbm5lY3RlZCkgeworICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIG5lZ290aWF0ZSBQUk9UIGJ1ZmZlciBzaXplIHdpdGggRlRQIHNlcnZlclxuIik7CisgICAgICAgICAgICBmdHBjbG9zZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGlmIChyZXBseV9wYXJzZSkgeworICAgICAgICBpZiAoKG1heGJ1ZiA9ICh1bnNpZ25lZCBpbnQpIGF0b2wocmVwbHlfcGFyc2UpKSA+IGFjdHVhbGJ1ZikKKyAgICAgICAgICBtYXhidWYgPSBhY3R1YWxidWY7CisgICAgfSBlbHNlCisgICAgICBtYXhidWYgPSBhY3R1YWxidWY7CisgICAgdWNidWZzaXogPSBtYXhidWYgLSBGVURHRV9GQUNUT1I7CisgICAgZGVidWcoRjEwMSwic2V0cGJzeiB1Y2J1ZnNpeiIsIiIsdWNidWZzaXopOyAgICAKKyAgICByZXBseV9wYXJzZSA9IE5VTEw7CisgICAgcmV0dXJuKDApOworfQorCitzdGF0aWMgVk9JRAorY2FuY2VsX3JlbW90ZShkaW4pIGludCBkaW47IHsKKyAgICBDSEFSIGJ1ZltGVFBfQlVGU0laXTsKKyAgICBpbnQgeCwgbmZuZDsKKyNpZmRlZiBCU0RTRUxFQ1QKKyAgICBmZF9zZXQgbWFzazsKKyNlbmRpZiAvKiBCU0RTRUxFQ1QgKi8KKyNpZmRlZiBJQk1TRUxFQ1QKKyAgICBpbnQgZmRzWzJdLCBmZGNudCA9IDA7CisjZW5kaWYgLyogSUJNU0VMRUNUICovCisjaWZkZWYgREVCVUcKKyAgICBleHRlcm4gaW50IGRlYnRpbTsKKyAgICBpbnQgeGRlYnRpbTsKKyAgICB4ZGVidGltID0gZGVidGltOworICAgIGRlYnRpbSA9IDE7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICBkZWJ1ZyhGMTAwLCJmdHAgY2FuY2VsX3JlbW90ZSBlbnRyeSIsIiIsMCk7CisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKHNzbF9mdHBfYWN0aXZlX2ZsYWcpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VuZCBUZWxuZXQgSVAsIFRlbG5ldCBETSBidXQgZG8gc28gaW5saW5lIGFuZCB3aXRoaW4gdGhlCisgICAgICAgICAqIFRMUyBjaGFubmVsCisgICAgICAgICAqLworICAgICAgICBpbnQgY291bnQsIGVycm9yOworCisgICAgICAgIGJ1ZlswXSA9IElBQzsKKyAgICAgICAgYnVmWzFdID0gVE5fSVA7CisgICAgICAgIGJ1ZlsyXSA9IElBQzsKKyAgICAgICAgYnVmWzNdID0gVE5fRE07CisgICAgICAgIGJ1Zls0XSA9IE5VTDsKKworICAgICAgICBjb3VudCA9IFNTTF93cml0ZShzc2xfZnRwX2NvbiwgYnVmLCA0KTsKKyAgICAgICAgZGVidWcoRjExMSwiZnRwIGNhbmNlbF9yZW1vdGUiLCJTU0xfd3JpdGUoSUFDIElQIElBQyBETSkiLGNvdW50KTsKKyAgICAgICAgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF9mdHBfY29uLGNvdW50KTsKKyAgICAgICAgZGVidWcoRjExMSwiZnRwIGNhbmNlbF9yZW1vdGUiLCJTU0xfZ2V0X2Vycm9yKCkiLGVycm9yKTsKKyAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX05PTkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorI2lmZGVmIE5UCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGdsZSA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5UICovCisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TU0w6CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGxvc3RwZWVyKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIHNlbmQgSUFDIGluIHVyZ2VudCBtb2RlIGluc3RlYWQgb2YgRE0gYmVjYXVzZSA0LjNCU0QgcGxhY2VzIG9vYiBtYXJrCisgICAgICAgICAqIGFmdGVyIHVyZ2VudCBieXRlIHJhdGhlciB0aGFuIGJlZm9yZSBhcyBpcyBwcm90b2NvbCBub3cuCisgICAgICAgICAqLworICAgICAgICBidWZbMF0gPSBJQUM7CisgICAgICAgIGJ1ZlsxXSA9IFROX0lQOworICAgICAgICBidWZbMl0gPSBJQUM7CisgICAgICAgIGJ1ZlszXSA9IE5VTDsKKyAgICAgICAgaWYgKCh4ID0gc2VuZChjc29ja2V0LCAoU0VOREFSRzJUWVBFKWJ1ZiwgMywgTVNHX09PQikpICE9IDMpCisgICAgICAgICAgcGVycm9yKCJjYW5jZWwiKTsKKyAgICAgICAgZGVidWcoRjEwMSwiZnRwIGNhbmNlbF9yZW1vdGUgc2VuZCAxIiwiIix4KTsKKyAgICAgICAgYnVmWzBdID0gVE5fRE07CisgICAgICAgIHggPSBzZW5kKGNzb2NrZXQsKFNFTkRBUkcyVFlQRSlidWYsMSwwKTsKKyAgICAgICAgZGVidWcoRjEwMSwiZnRwIGNhbmNlbF9yZW1vdGUgc2VuZCAyIiwiIix4KTsKKyAgICB9CisgICAgeCA9IHNjb21tYW5kKCJBQk9SIik7CisgICAgZGVidWcoRjEwMSwiZnRwIGNhbmNlbF9yZW1vdGUgc2NvbW1hbmQiLCIiLHgpOworI2lmZGVmIEJTRFNFTEVDVAorICAgIEZEX1pFUk8oJm1hc2spOworICAgIEZEX1NFVChjc29ja2V0LCAmbWFzayk7CisgICAgaWYgKGRpbikgeworICAgICAgICBGRF9TRVQoZGluLCAmbWFzayk7CisgICAgfQorICAgIG5mbmQgPSBlbXB0eSgmbWFzaywgMTApOworICAgIGRlYnVnKEYxMDEsImZ0cCBjYW5jZWxfcmVtb3RlIGVtcHR5IiwiIixuZm5kKTsKKyAgICBpZiAoKG5mbmQpIDw9IDApIHsKKyAgICAgICAgaWYgKG5mbmQgPCAwKSB7CisgICAgICAgICAgICBwZXJyb3IoImNhbmNlbCIpOworICAgICAgICB9CisjaWZkZWYgRlRQX1BST1hZCisgICAgICAgIGlmIChwdGFiZmxnKQorICAgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyNlbmRpZiAvKiBGVFBfUFJPWFkgKi8KKyAgICAgICAgbG9zdHBlZXIoKTsKKyAgICB9CisgICAgZGVidWcoRjExMCwiZnRwIGNhbmNlbF9yZW1vdGUiLCJEIiwwKTsKKyAgICBpZiAoZGluICYmIEZEX0lTU0VUKGRpbiwgJm1hc2spKSB7CisgICAgICAgIC8qIFNlY3VyaXR5OiBObyB0aHJlYXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVhZC4gKi8KKyAgICAgICAgLyogQnV0IHlvdSBjYW4ndCBzaW1wbHkgcmVhZCB0aGUgVExTIGRhdGEgc3RyZWFtICAqLworI2lmZGVmIENLX1NTTAorICAgICAgICBpZiAoc3NsX2Z0cF9kYXRhX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgICAgICBpbnQgY291bnQsIGVycm9yOworICAgICAgICAgICAgd2hpbGUgKChjb3VudCA9IFNTTF9yZWFkKHNzbF9mdHBfZGF0YV9jb24sIGJ1ZiwgRlRQX0JVRlNJWikpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgLyogTE9PUCAqLyA7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAocmVjdihkaW4sIChTRU5EQVJHMlRZUEUpYnVmLCBGVFBfQlVGU0laLDApID4gMCkKKyAgICAgICAgICAgICAgICAvKiBMT09QICovIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJmdHAgY2FuY2VsX3JlbW90ZSIsIkUiLDApOworI2Vsc2UgLyogQlNEU0VMRUNUICovCisjaWZkZWYgSUJNU0VMRUNUCisgICAgZmRzWzBdID0gY3NvY2tldDsKKyAgICBmZGNudCsrOworICAgIGlmIChkaW4pIHsKKyAgICAgICAgZmRzWzFdID0gZGluOworICAgICAgICBmZGNudCsrOworICAgIH0KKyAgICBuZm5kID0gZW1wdHkoZmRzLCBmZGNudCwgMTApOworICAgIGRlYnVnKEYxMDEsImZ0cCBjYW5jZWxfcmVtb3RlIGVtcHR5IiwiIixuZm5kKTsKKyAgICBpZiAoKG5mbmQpIDw9IDApIHsKKyAgICAgICAgaWYgKG5mbmQgPCAwKSB7CisgICAgICAgICAgICBwZXJyb3IoImNhbmNlbCIpOworICAgICAgICB9CisjaWZkZWYgRlRQX1BST1hZCisgICAgICAgIGlmIChwdGFiZmxnKQorICAgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyNlbmRpZiAvKiBGVFBfUFJPWFkgKi8KKyAgICAgICAgbG9zdHBlZXIoKTsKKyAgICB9CisgICAgZGVidWcoRjExMCwiZnRwIGNhbmNlbF9yZW1vdGUiLCJEIiwwKTsKKyAgICBpZiAoZGluICYmIHNlbGVjdCgmZGluLCAxLDAsMCwxKSApIHsKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgaWYgKHNzbF9mdHBfZGF0YV9hY3RpdmVfZmxhZykgeworICAgICAgICAgICAgaW50IGNvdW50LCBlcnJvcjsKKyAgICAgICAgICAgIHdoaWxlICgoY291bnQgPSBTU0xfcmVhZChzc2xfZnRwX2RhdGFfY29uLCBidWYsIEZUUF9CVUZTSVopKSA+IDApCisgICAgICAgICAgICAgICAgICAgIC8qIExPT1AgKi8gOworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKHJlY3YoZGluLCAoU0VOREFSRzJUWVBFKWJ1ZiwgRlRQX0JVRlNJWiwwKSA+IDApCisgICAgICAgICAgICAgICAgLyogTE9PUCAqLyA7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVidWcoRjExMCwiZnRwIGNhbmNlbF9yZW1vdGUiLCJFIiwwKTsKKyNlbHNlIC8qIElCTVNFTEVDVCAqLworICAgIFNvbWUgZm9ybSBvZiBzZWxlY3QgaXMgcmVxdWlyZWQuCisjZW5kaWYgLyogSUJNU0VMRUNUICovCisjZW5kaWYgLyogQlNEU0VMRUNUICovCisgICAgaWYgKGdldHJlcGx5KDAsLTEsLTEsZnRwX3ZibSwwKSA9PSBSRVBMWV9FUlJPUiAmJiBmdHBjb2RlID09IDU1MikgeworICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgY2FuY2VsX3JlbW90ZSIsIkYiLDApOworICAgICAgICAvKiA1NTIgbmVlZGVkIGZvciBOSUMgc3R5bGUgY2FuY2VsICovCisgICAgICAgIGdldHJlcGx5KDAsLTEsLTEsZnRwX3ZibSwwKTsKKyAgICAgICAgZGVidWcoRjExMCwiZnRwIGNhbmNlbF9yZW1vdGUiLCJHIiwwKTsKKyAgICB9CisgICAgZGVidWcoRjExMCwiZnRwIGNhbmNlbF9yZW1vdGUiLCJIIiwwKTsKKyAgICBnZXRyZXBseSgwLC0xLC0xLGZ0cF92Ym0sMCk7CisgICAgZGVidWcoRjExMCwiZnRwIGNhbmNlbF9yZW1vdGUiLCJJIiwwKTsKKyNpZmRlZiBERUJVRworICAgIGRlYnRpbSA9IHhkZWJ0aW07CisjZW5kaWYgLyogREVCVUcgKi8KK30KKworc3RhdGljIGludAorZnRzX2RwbCh4KSBpbnQgeDsgeworICAgIGlmICghYXV0aF90eXBlCisjaWZkZWYgT1MyCisgICAgICAgICB8fCAhY2tfY3J5cHRfaXNfaW5zdGFsbGVkKCkKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICkgeworICAgICAgICBzd2l0Y2ggKCB4ICkgeworICAgICAgICAgIGNhc2UgRlBMX1BSVjoKKyAgICAgICAgICAgIHByaW50ZigiP0Nhbm5vdCBzZXQgcHJvdGVjdGlvbiBsZXZlbCB0byBQUklWQVRFXG4iKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICBjYXNlIEZQTF9TQUY6CisgICAgICAgICAgICBwcmludGYoIj9DYW5ub3Qgc2V0IHByb3RlY3Rpb24gbGV2ZWwgdG8gU0FGRVxuIik7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgZnRwX2RwbCA9IHg7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoeCA9PSBGUExfU0FGICYmCisgICAgICAgICghc3RyY21wKGF1dGhfdHlwZSwiU1NMIikgfHwgIXN0cmNtcChhdXRoX3R5cGUsIlRMUyIpKSkgeworICAgICAgICBwcmludGYoIkNhbm5vdCBzZXQgcHJvdGVjdGlvbiBsZXZlbCB0byBzYWZlXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAvKiBTdGFydCB3aXRoIGEgUEJTWiBvZiAxIG1lZyAqLworICAgIGlmICh4ICE9IEZQTF9DTFIpIHsKKyAgICAgICAgaWYgKHNldHBic3ooREVGQVVMVF9QQlNaKSA8IDApCisgICAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICB5ID0gZnRwY21kKHggPT0gRlBMX0NMUiA/ICJQUk9UIEMiIDoKKyAgICAgICAgICAgICAgICh4ID09IEZQTF9TQUYgPyAiUFJPVCBTIiA6ICJQUk9UIFAiKSwgTlVMTCwgMCwgMCxmdHBfdmJtKTsKKyAgICBpZiAoeSA9PSBSRVBMWV9DT01QTEVURSkgeworICAgICAgICBmdHBfZHBsID0geDsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQKK2Z0c19jcGwoeCkgaW50IHg7IHsKKyAgICBpZiAoIWF1dGhfdHlwZSAKKyNpZmRlZiBPUzIKKyAgICAgICAgIHx8ICFja19jcnlwdF9pc19pbnN0YWxsZWQoKQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgKSB7CisgICAgICAgIHN3aXRjaCAoIHggKSB7CisgICAgICAgICAgY2FzZSBGUExfUFJWOgorICAgICAgICAgICAgcHJpbnRmKCI/Q2Fubm90IHNldCBwcm90ZWN0aW9uIGxldmVsIHRvIFBSSVZBVEVcbiIpOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgIGNhc2UgRlBMX1NBRjoKKyAgICAgICAgICAgIHByaW50ZigiP0Nhbm5vdCBzZXQgcHJvdGVjdGlvbiBsZXZlbCB0byBTQUZFXG4iKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgICAgICBmdHBfY3BsID0geDsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKyAgICBpZiAoeCA9PSBGUExfQ0xSKSB7CisgICAgICAgIHkgPSBmdHBjbWQoIkNDQyIsTlVMTCwwLDAsZnRwX3ZibSk7CisgICAgICAgIGlmICh5ID09IFJFUExZX0NPTVBMRVRFKSB7CisgICAgICAgICAgICBmdHBfY3BsID0geDsKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGZ0cF9jcGwgPSB4OworICAgIHJldHVybigxKTsKK30KKworI2lmZGVmIEZUUF9HU1NBUEkKK3N0YXRpYyBWT0lECit1c2VyX2dzc19lcnJvcihtYWpfc3RhdCwgbWluX3N0YXQsIHMpCisgICAgT01fdWludDMyIG1hal9zdGF0LCBtaW5fc3RhdDsKKyAgICBjaGFyICpzOworeworICAgIC8qIGEgbG90IG9mIHdvcmsganVzdCB0byByZXBvcnQgdGhlIGVycm9yICovCisgICAgT01fdWludDMyIGdtYWpfc3RhdCwgZ21pbl9zdGF0LCBtc2dfY3R4OworICAgIGdzc19idWZmZXJfZGVzYyBtc2c7CisgICAgbXNnX2N0eCA9IDA7CisgICAgd2hpbGUgKCFtc2dfY3R4KSB7CisgICAgICAgIGdtYWpfc3RhdCA9IGdzc19kaXNwbGF5X3N0YXR1cygmZ21pbl9zdGF0LCBtYWpfc3RhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTU19DX0dTU19DT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NTX0NfTlVMTF9PSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGlmICgoZ21hal9zdGF0ID09IEdTU19TX0NPTVBMRVRFKXx8CisgICAgICAgICAgICAoZ21hal9zdGF0ID09IEdTU19TX0NPTlRJTlVFX05FRURFRCkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiR1NTQVBJIGVycm9yIG1ham9yOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgKGNoYXIqKW1zZy52YWx1ZSk7CisgICAgICAgICAgICBnc3NfcmVsZWFzZV9idWZmZXIoJmdtaW5fc3RhdCwgJm1zZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdtYWpfc3RhdCAhPSBHU1NfU19DT05USU5VRV9ORUVERUQpCisgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG1zZ19jdHggPSAwOworICAgIHdoaWxlICghbXNnX2N0eCkgeworICAgICAgICBnbWFqX3N0YXQgPSBnc3NfZGlzcGxheV9zdGF0dXMoJmdtaW5fc3RhdCwgbWluX3N0YXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1NfQ19NRUNIX0NPREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1NfQ19OVUxMX09JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2dfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKChnbWFqX3N0YXQgPT0gR1NTX1NfQ09NUExFVEUpfHwKKyAgICAgICAgICAgIChnbWFqX3N0YXQgPT0gR1NTX1NfQ09OVElOVUVfTkVFREVEKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJHU1NBUEkgZXJyb3IgbWlub3I6ICVzXG4iLCAoY2hhciopbXNnLnZhbHVlKTsKKyAgICAgICAgICAgIGdzc19yZWxlYXNlX2J1ZmZlcigmZ21pbl9zdGF0LCAmbXNnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ21hal9zdGF0ICE9IEdTU19TX0NPTlRJTlVFX05FRURFRCkKKyAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJHU1NBUEkgZXJyb3I6ICVzXG4iLCBzKTsKK30KKyNlbmRpZiAvKiBGVFBfR1NTQVBJICovCisKKyNpZm5kZWYgTk9NSEhPU1QKKyNpZmRlZiBkYXRhZ2VuZXJhbAorI2RlZmluZSBOT01ISE9TVAorI2Vsc2UKKyNpZmRlZiBIUFVYNVdJTlRDUAorI2RlZmluZSBOT01ISE9TVAorI2VuZGlmIC8qIEhQVVg1V0lOVENQICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBOT01ISE9TVCAqLworCisjaWZkZWYgSU5BRERSWAorc3RhdGljIHN0cnVjdCBpbl9hZGRyIGluYWRkcng7CisjZW5kaWYgLyogSU5BRERSWCAqLworCitzdGF0aWMgY2hhciAqCitmdHBfaG9va3VwKGhvc3QsIHBvcnQsIHRscykgY2hhciAqIGhvc3Q7IGludCBwb3J0OyBpbnQgdGxzOyB7CisgICAgcmVnaXN0ZXIgc3RydWN0IGhvc3RlbnQgKmhwID0gMDsKKyNpZmRlZiBJUF9UT1MKKyNpZmRlZiBJUFRPU19USFJPVUdIUFVUCisgICAgaW50IHRvczsKKyNlbmRpZiAvKiBJUFRPU19USFJPVUdIUFVUICovCisjZW5kaWYgLyogSVBfVE9TICovCisgICAgaW50IHM7CisgICAgR1NPQ0tOQU1FX1QgbGVuOworICAgIHN0YXRpYyBjaGFyIGhvc3RuYW1lYnVmW01BWEhPU1ROQU1FTEVOXTsKKyAgICBjaGFyIGhvc3RuYW1lW01BWEhPU1ROQU1FTEVOXSAvKiAsICpwLCAqcSAqLyA7CisgICAgaW50ICBjcG9ydDsKKyNpZmRlZiBERUJVRworICAgIGV4dGVybiBpbnQgZGVidGltOworICAgIGludCB4ZGVidGltOworICAgIHhkZWJ0aW0gPSBkZWJ0aW07CisgICAgZGVidGltID0gMTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZuZGVmIE5PSFRUUAorICAgIGlmICh0Y3BfaHR0cF9wcm94eSkgeworICAgICAgICBzdHJ1Y3Qgc2VydmVudCAqZGVzdHNwOworICAgICAgICBjaGFyICpwLCAqcTsKKworICAgICAgICBja21ha21zZyhwcm94eWhvc3QsSFRUUENQWUwsaG9zdCwiOiIsY2t1aXRvYShwb3J0KSxOVUxMKTsKKyAgICAgICAgZm9yIChwID0gdGNwX2h0dHBfcHJveHksIHEgPSBob3N0bmFtZTsKKyAgICAgICAgICAgICAqcCAhPSAnXDAnICYmICpwICE9ICc6JzsKKyAgICAgICAgICAgICBwKyssIHErKworICAgICAgICAgICAgICkKKyAgICAgICAgICAqcSA9ICpwOworICAgICAgICAqcSA9ICdcMCc7CisKKyAgICAgICAgaWYgKCpwID09ICc6JykKKyAgICAgICAgICBwKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwID0gImh0dHAiOworCisgICAgICAgIGRlc3RzcCA9IGdldHNlcnZieW5hbWUocCwidGNwIik7CisgICAgICAgIGlmIChkZXN0c3ApCisgICAgICAgICAgY3BvcnQgPSBudG9ocyhkZXN0c3AtPnNfcG9ydCk7CisgICAgICAgIGVsc2UgaWYgKHApIHsKKyAgICAgICAgICBjcG9ydCA9IGF0b2kocCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGNwb3J0ID0gODA7CisgICAgfSBlbHNlCisjZW5kaWYgLyogTk9IVFRQICovCisgICAgeworICAgICAgICBja3N0cm5jcHkoaG9zdG5hbWUsaG9zdCxNQVhIT1NUTkFNRUxFTik7CisgICAgICAgIGNwb3J0ID0gcG9ydDsKKyAgICB9CisgICAgbWVtc2V0KChjaGFyICopJmhpc2N0bGFkZHIsIDAsIHNpemVvZiAoaGlzY3RsYWRkcikpOworICAgIGhpc2N0bGFkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKGhvc3QpOworICAgIGlmIChoaXNjdGxhZGRyLnNpbl9hZGRyLnNfYWRkciAhPSAtMSkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJmdHAgaG9va3VwIEEiLGhvc3RuYW1lLDApOworICAgICAgICBoaXNjdGxhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBja3N0cm5jcHkoaG9zdG5hbWVidWYsIGhvc3RuYW1lLCBNQVhIT1NUTkFNRUxFTik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVidWcoRjExMCwiZnRwIGhvb2t1cCBCIixob3N0bmFtZSwwKTsKKyAgICAgICAgaHAgPSBnZXRob3N0YnluYW1lKGhvc3RuYW1lKTsKKyNpZmRlZiBIQUREUkxJU1QKKyAgICAgICAgaHAgPSBja19jb3B5aG9zdGVudChocCk7ICAgICAgICAvKiBtYWtlIHNhZmUgY29weSB0aGF0IHdvbid0IGNoYW5nZSAqLworI2VuZGlmIC8qIEhBRERSTElTVCAqLworICAgICAgICBpZiAoaHAgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmdHA6ICVzOiBVbmtub3duIGhvc3RcbiIsIGhvc3QpOworICAgICAgICAgICAgZnRwY29kZSA9IC0xOworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBkZWJ0aW0gPSB4ZGVidGltOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICByZXR1cm4oKGNoYXIgKikgMCk7CisgICAgICAgIH0KKyAgICAgICAgaGlzY3RsYWRkci5zaW5fZmFtaWx5ID0gaHAtPmhfYWRkcnR5cGU7CisjaWZkZWYgSEFERFJMSVNUCisgICAgICAgIG1lbWNweSgoY2hhciAqKSZoaXNjdGxhZGRyLnNpbl9hZGRyLCBocC0+aF9hZGRyX2xpc3RbMF0sCisgICAgICAgICAgICAgICBzaXplb2YoaGlzY3RsYWRkci5zaW5fYWRkcikpOworI2Vsc2UgLyogSEFERFJMSVNUICovCisgICAgICAgIG1lbWNweSgoY2hhciAqKSZoaXNjdGxhZGRyLnNpbl9hZGRyLCBocC0+aF9hZGRyLAorICAgICAgICAgICAgICAgc2l6ZW9mKGhpc2N0bGFkZHIuc2luX2FkZHIpKTsKKyNlbmRpZiAvKiBIQUREUkxJU1QgKi8KKyAgICAgICAgY2tzdHJuY3B5KGhvc3RuYW1lYnVmLCBocC0+aF9uYW1lLCBNQVhIT1NUTkFNRUxFTik7CisgICAgfQorICAgIGRlYnVnKEYxMTAsImZ0cCBob29rdXAgQyIsaG9zdG5hbWVidWYsMCk7CisgICAgZnRwX2hvc3QgPSBob3N0bmFtZWJ1ZjsKKyAgICBzID0gc29ja2V0KGhpc2N0bGFkZHIuc2luX2ZhbWlseSwgU09DS19TVFJFQU0sIDApOworICAgIGRlYnVnKEYxMDEsImZ0cCBob29rdXAgc29ja2V0IiwiIixzKTsKKyAgICBpZiAocyA8IDApIHsKKyAgICAgICAgcGVycm9yKCJmdHA6IHNvY2tldCIpOworICAgICAgICBmdHBjb2RlID0gLTE7CisjaWZkZWYgREVCVUcKKyAgICAgICAgZGVidGltID0geGRlYnRpbTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGhpc2N0bGFkZHIuc2luX3BvcnQgPSBodG9ucyhjcG9ydCk7CisgICAgZXJybm8gPSAwOworI2lmZGVmIEhBRERSTElTVAorICAgIGRlYnVnKEYxMDAsImZ0cCBob29rdXAgSEFERFJMSVNUIiwiIiwwKTsKKyAgICB3aGlsZQorI2Vsc2UKKyAgICBkZWJ1ZyhGMTAwLCJmdHAgaG9va3VwIG5vIEhBRERSTElTVCIsIiIsMCk7CisgICAgaWYKKyNlbmRpZiAvKiBIQUREUkxJU1QgKi8KKyAgICAgIChjb25uZWN0KHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmaGlzY3RsYWRkciwgc2l6ZW9mIChoaXNjdGxhZGRyKSkgPCAwKSB7CisgICAgICAgICAgZGVidWcoRjEwMSwiZnRwIGhvb2t1cCBjb25uZWN0IGZhaWxlZCIsIiIsZXJybm8pOworI2lmZGVmIEhBRERSTElTVAorICAgICAgICAgIGlmIChocCAmJiBocC0+aF9hZGRyX2xpc3RbMV0pIHsKKyAgICAgICAgICAgICAgaW50IG9lcnJubyA9IGVycm5vOworCisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZnRwOiBjb25uZWN0IHRvIGFkZHJlc3MgJXM6ICIsCisgICAgICAgICAgICAgICAgICAgICAgaW5ldF9udG9hKGhpc2N0bGFkZHIuc2luX2FkZHIpKTsKKyAgICAgICAgICAgICAgZXJybm8gPSBvZXJybm87CisgICAgICAgICAgICAgIHBlcnJvcigoY2hhciAqKSAwKTsKKyAgICAgICAgICAgICAgaHAtPmhfYWRkcl9saXN0Kys7CisgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSZoaXNjdGxhZGRyLnNpbl9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgaHAtPmhfYWRkcl9saXN0WzBdLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhpc2N0bGFkZHIuc2luX2FkZHIpKTsKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJUcnlpbmcgJXMuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgaW5ldF9udG9hKGhpc2N0bGFkZHIuc2luX2FkZHIpKTsKKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICAgICAgICBzb2NrZXRfY2xvc2Uocyk7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgICBjbG9zZShzKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgICBzID0gc29ja2V0KGhpc2N0bGFkZHIuc2luX2ZhbWlseSwgU09DS19TVFJFQU0sIDApOworICAgICAgICAgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgICAgICAgICAgIHBlcnJvcigiZnRwOiBzb2NrZXQiKTsKKyAgICAgICAgICAgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgICAgZGVidGltID0geGRlYnRpbTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBIQUREUkxJU1QgKi8KKyAgICAgICAgICBwZXJyb3IoImZ0cDogY29ubmVjdCIpOworICAgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgIH0KKyAgICBkZWJ1ZyhGMTAwLCJmdHAgaG9va3VwIGNvbm5lY3Qgb2siLCIiLDApOworCisgICAgbGVuID0gc2l6ZW9mIChteWN0bGFkZHIpOworICAgIGVycm5vID0gMDsKKyAgICBpZiAoZ2V0c29ja25hbWUocywgKHN0cnVjdCBzb2NrYWRkciAqKSZteWN0bGFkZHIsICZsZW4pIDwgMCkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJmdHAgaG9va3VwIGdldHNvY2tuYW1lIGZhaWxlZCIsIiIsZXJybm8pOworICAgICAgICBwZXJyb3IoImZ0cDogZ2V0c29ja25hbWUiKTsKKyAgICAgICAgZnRwY29kZSA9IC0xOworICAgICAgICBnb3RvIGJhZDsKKyAgICB9CisgICAgZGVidWcoRjEwMCwiZnRwIGhvb2t1cCBnZXRzb2NrbmFtZSBvayIsIiIsMCk7CisKKyNpZm5kZWYgTk9IVFRQCisgICAgaWYgKHRjcF9odHRwX3Byb3h5KSB7CisjaWZkZWYgT1MyCisgICAgICAgIGNoYXIgKiBhZ2VudCA9ICJLZXJtaXQgOTUiOyAgICAgLyogRGVmYXVsdCB1c2VyIGFnZW50ICovCisjZWxzZQorICAgICAgICBjaGFyICogYWdlbnQgPSAiQy1LZXJtaXQiOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgICAgIGlmIChodHRwX2Nvbm5lY3QocyxhZ2VudCxOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9odHRwX3Byb3h5X3VzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX2h0dHBfcHJveHlfcHdkLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgKSA8IDApIHsKKyAgICAgICAgICAgIGNoYXIgKiBmb28gPSBOVUxMOworI2lmZGVmIFRDUElQTElCCisgICAgICAgICAgICBzb2NrZXRfY2xvc2Uocyk7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgY2xvc2Uocyk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKworICAgICAgICAgICAgd2hpbGUgKGZvbyA9PSBOVUxMICYmIHRjcF9odHRwX3Byb3h5ICE9IE5VTEwgKSB7CisKKyAgICAgICAgICAgICAgICBpZiAodGNwX2h0dHBfcHJveHlfZXJybm8gPT0gNDAxIHx8CisgICAgICAgICAgICAgICAgICAgICB0Y3BfaHR0cF9wcm94eV9lcnJubyA9PSA0MDcgKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgdWlkW1VJREJVRkxFTl07CisgICAgICAgICAgICAgICAgICAgIGNoYXIgcHdkW1BXRFNJWl07CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0eHRib3ggdGJbMl07CisgICAgICAgICAgICAgICAgICAgIGludCBvazsKKworICAgICAgICAgICAgICAgICAgICB0YlswXS50X2J1ZiA9IHVpZDsKKyAgICAgICAgICAgICAgICAgICAgdGJbMF0udF9sZW4gPSBVSURCVUZMRU47CisgICAgICAgICAgICAgICAgICAgIHRiWzBdLnRfbGJsID0gIlByb3h5IFVzZXJpZDogIjsKKyAgICAgICAgICAgICAgICAgICAgdGJbMF0udF9kZmx0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgdGJbMF0udF9lY2hvID0gMTsKKyAgICAgICAgICAgICAgICAgICAgdGJbMV0udF9idWYgPSBwd2Q7CisgICAgICAgICAgICAgICAgICAgIHRiWzFdLnRfbGVuID0gMjU2OworICAgICAgICAgICAgICAgICAgICB0YlsxXS50X2xibCA9ICJQcm94eSBQYXNzcGhyYXNlOiAiOworICAgICAgICAgICAgICAgICAgICB0YlsxXS50X2RmbHQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB0YlsxXS50X2VjaG8gPSAyOworCisgICAgICAgICAgICAgICAgICAgIG9rID0gdXFfbXR4dCgiUHJveHkgU2VydmVyIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDIsIHRiKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAob2sgJiYgdWlkWzBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcHJveHlfdXNlciwgKiBwcm94eV9wd2Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X3VzZXIgPSB0Y3BfaHR0cF9wcm94eV91c2VyOworICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfcHdkICA9IHRjcF9odHRwX3Byb3h5X3B3ZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGNwX2h0dHBfcHJveHlfdXNlciA9IHVpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9odHRwX3Byb3h5X3B3ZCA9IHB3ZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9vID0gZnRwX2hvb2t1cChob3N0LCBwb3J0LCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwX2hvb2t1cCgpIixmb28sMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocHdkLDAsUFdEU0laKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9odHRwX3Byb3h5X3VzZXIgPSBwcm94eV91c2VyOworICAgICAgICAgICAgICAgICAgICAgICAgdGNwX2h0dHBfcHJveHlfcHdkID0gcHJveHlfcHdkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb28gIT0gTlVMTCkKKyAgICAgICAgICAgICAgcmV0dXJuKGZvbyk7CisgICAgICAgICAgICBwZXJyb3IoImZ0cDogY29ubmVjdCIpOworICAgICAgICAgICAgZnRwY29kZSA9IC0xOworICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKyAgICAgICAgY2tzdHJuY3B5KGhvc3RuYW1lYnVmLCBwcm94eWhvc3QsIE1BWEhPU1ROQU1FTEVOKTsKKyAgICB9CisjZW5kaWYgLyogTk9IVFRQICovCisKKyAgICBjc29ja2V0ID0gczsKKworI2lmZGVmIENLX1NTTAorICAgIGlmICh0bHMpIHsKKyAgICAgICAgLyogRlRQIG92ZXIgU1NMCisgICAgICAgICAqIElmIHRoZSBjb25uZWN0aW9uIGlzIG92ZXIgYW4gU1NMIHByb3h5IHRoZW4gdGhlCisgICAgICAgICAqIGF1dGhfdHlwZSB3aWxsIGJlIE5VTEwuICBIb3dldmVyLCBJJ20gbm90IHN1cmUKKyAgICAgICAgICogd2hldGhlciB3ZSBzaG91bGQgcHJvdGVjdCB0aGUgZGF0YSBjaGFubmVsIGluCisgICAgICAgICAqIHRoYXQgY2FzZSBvciBub3QuCisgICAgICAgICAqLworCisgICAgICAgIGRlYnVnKEYxMDAsImZ0cCBob29rdXAgdXNlX3RscyIsIiIsMCk7CisgICAgICAgIGlmICghc3NsX2F1dGgoKSkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwiZnRwIGhvb2t1cCBzc2xfYXV0aCBmYWlsZWQiLCIiLDApOworICAgICAgICAgICAgYXV0aF90eXBlID0gTlVMTDsKKyAgICAgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyAgICAgICAgICAgIGNzb2NrZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisgICAgICAgIHNzbF9mdHBfcHJveHkgPSAxOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworI2lmZGVmIElQX1RPUworI2lmZGVmIElQVE9TX0xPV0RFTEFZCisgICAgdG9zID0gSVBUT1NfTE9XREVMQVk7CisgICAgaWYgKHNldHNvY2tvcHQoY3NvY2tldCwgSVBQUk9UT19JUCwgSVBfVE9TLCAoY2hhciAqKSZ0b3MsIHNpemVvZihpbnQpKSA8IDApCisgICAgICBwZXJyb3IoImZ0cDogc2V0c29ja29wdCBUT1MgKGlnbm9yZWQpIik7CisjZW5kaWYKKyNlbmRpZgorICAgIGlmICghcXVpZXQpCisgICAgICBwcmludGYoIkNvbm5lY3RlZCB0byAlcy5cbiIsIGhvc3QpOworCisgICAgLyogUmVhZCBncmVldGluZyBmcm9tIHNlcnZlciAqLworICAgIGlmIChnZXRyZXBseSgwLGZ0cF9jc2wsZnRwX2NzcixmdHBfdmJtLDApID4gMikgeworICAgICAgICBkZWJ1ZyhGMTAwLCJmdHAgaG9va3VwIGJhZCByZXBseSIsIiIsMCk7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgc29ja2V0X2Nsb3NlKGNzb2NrZXQpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyAgICAgICAgY2xvc2UoY3NvY2tldCk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgZnRwY29kZSA9IC0xOworICAgICAgICBnb3RvIGJhZDsKKyAgICB9CisjaWZkZWYgU09fT09CSU5MSU5FCisgICAgeworICAgICAgICBpbnQgb24gPSAxOworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX09PQklOTElORSwgKGNoYXIgKikmb24sCisJCSAgICAgICBzaXplb2Yob24pKSA8IDApIHsKKyAgICAgICAgICAgIHBlcnJvcigiZnRwOiBzZXRzb2Nrb3B0Iik7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJmdHAgaG9va3VwIHNldHNvY2tvcHQgZmFpbGVkIiwiIixlcnJubyk7CisgICAgICAgIH0KKyNpZmRlZiBERUJVRworICAgICAgICBlbHNlCisgICAgICAgICAgZGVidWcoRjEwMCwiZnRwIGhvb2t1cCBzZXRzb2Nrb3B0IG9rIiwiIiwwKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIH0KKyNlbmRpZiAvKiBTT19PT0JJTkxJTkUgKi8KKworI2lmZGVmIERFQlVHCisgICAgZGVidGltID0geGRlYnRpbTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJldHVybihmdHBfaG9zdCk7CisKKyAgYmFkOgorICAgIGRlYnVnKEYxMDAsImZ0cCBob29rdXAgYmFkIiwiIiwwKTsKKyNpZmRlZiBUQ1BJUExJQgorICAgIHNvY2tldF9jbG9zZShzKTsKKyNlbHNlIC8qIFRDUElQTElCICovCisgICAgY2xvc2Uocyk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBERUJVRworICAgIGRlYnRpbSA9IHhkZWJ0aW07CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICBjc29ja2V0ID0gLTE7CisgICAgcmV0dXJuKChjaGFyICopMCk7Cit9CisKK3N0YXRpYyBWT0lECitmdHBfaW5pdCgpIHsKKyAgICBpbnQgaSwgbjsKKworICAgIC8qIFRoZSBwdXJwb3NlIG9mIHRoZSBpbml0aWFsIFJFU1QgMCBpcyBub3QgY2xlYXIsIGJ1dCBvdGhlciBGVFAgKi8KKyAgICAvKiBjbGllbnRzIGRvIGl0LiAgSW4gYW55IGNhc2UsIGZhaWx1cmUgb2YgdGhpcyBjb21tYW5kIGlzIG5vdCBhICovCisgICAgLyogcmVsaWFibGUgaW5kaWNhdGlvbiB0aGF0IHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBSZXN0YXJ0LiAqLworCisgICAgb2tyZXN0YXJ0ID0gMDsKKyAgICBpZiAoIW5vaW5pdCkgeworICAgICAgICBuID0gZnRwY21kKCJSRVNUIDAiLE5VTEwsMCwwLDApOworICAgICAgICBpZiAobiA9PSBSRVBMWV9DT01QTEVURSkKKyAgICAgICAgICBva3Jlc3RhcnQgPSAxOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgZWxzZSBpZiAoZnRwX2RlYikKKyAgICAgICAgICBwcmludGYoIldBUk5JTkc6IFVuYWJsZSB0byByZXN0b3JlIGZpbGUgcG9pbnRlci5cbiIpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB9CisgICAgbiA9IGZ0cGNtZCgiU1lTVCIsTlVMTCwwLDAsMCk7ICAgICAgLyogR2V0IHNlcnZlciBzeXN0ZW0gdHlwZSAqLworICAgIGlmIChuID09IFJFUExZX0NPTVBMRVRFKSB7CisgICAgICAgIHJlZ2lzdGVyIGNoYXIgKmNwLCBjID0gTlVMOworICAgICAgICBjcCA9IGNrc3RyY2hyKGZ0cF9yZXBseV9zdHIrNCwnICcpOyAvKiBHZXQgZmlyc3Qgd29yZCBvZiByZXBseSAqLworICAgICAgICBpZiAoY3AgPT0gTlVMTCkKKyAgICAgICAgICBjcCA9IGNrc3RyY2hyKGZ0cF9yZXBseV9zdHIrNCwnXHInKTsKKyAgICAgICAgaWYgKGNwKSB7CisgICAgICAgICAgICBpZiAoY3BbLTFdID09ICcuJykKKyAgICAgICAgICAgICAgY3AtLTsKKyAgICAgICAgICAgIGMgPSAqY3A7ICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoaXMgY2hhciAqLworICAgICAgICAgICAgKmNwID0gJ1wwJzsgICAgICAgICAgICAgICAgIC8qIFJlcGxhY2UgaXQgd2l0aCBOVUwgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoIXF1aWV0KQorICAgICAgICAgIHByaW50ZigiUmVtb3RlIHN5c3RlbSB0eXBlIGlzICVzLlxuIixmdHBfcmVwbHlfc3RyKzQpOworICAgICAgICBja3N0cm5jcHkoZnRwX3NydnR5cCxmdHBfcmVwbHlfc3RyKzQsU1JWTkFNTEVOKTsKKyAgICAgICAgaWYgKGNwKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQdXQgYmFjayBzYXZlZCBjaGFyICovCisgICAgICAgICAgKmNwID0gYzsKKyAgICB9CisgICAgYWxpa2UgPSAhY2tzdHJjbXAoZnRwX3NydnR5cCxteW9zdHlwZSwtMSwwKTsKKworICAgIGlmICghY2tzdHJjbXAoZnRwX3NydnR5cCwiVU5JWCIsLTEsMCkpIHNlcnZlcnR5cGUgPSBTWVNfVU5JWDsKKyAgICBlbHNlIGlmICghY2tzdHJjbXAoZnRwX3NydnR5cCwiV0lOMzIiLC0xLDApKSBzZXJ2ZXJ0eXBlID0gU1lTX1dJTjMyOworICAgIGVsc2UgaWYgKCFja3N0cmNtcChmdHBfc3J2dHlwLCJPUy8yIiwtMSwwKSkgc2VydmVydHlwZSA9IFNZU19XSU4zMjsKKyAgICBlbHNlIGlmICghY2tzdHJjbXAoZnRwX3NydnR5cCwiVk1TIiwtMSwwKSkgc2VydmVydHlwZSA9IFNZU19WTVM7CisgICAgZWxzZSBpZiAoIWNrc3RyY21wKGZ0cF9zcnZ0eXAsIkRPUyIsLTEsMCkpIHNlcnZlcnR5cGUgPSBTWVNfRE9TOworICAgIGVsc2UgaWYgKCFja3N0cmNtcChmdHBfc3J2dHlwLCJUT1BTMjAiLC0xLDApKSBzZXJ2ZXJ0eXBlID0gU1lTX1RPUFMyMDsKKyAgICBlbHNlIGlmICghY2tzdHJjbXAoZnRwX3NydnR5cCwiVE9QUzEwIiwtMSwwKSkgc2VydmVydHlwZSA9IFNZU19UT1BTMTA7CisKKyNpZmRlZiBGVFBfUFJPWFkKKyAgICB1bml4X3Byb3h5ID0gMDsKKyAgICBpZiAoc2VydmVydHlwZSA9PSBTWVNfVU5JWCAmJiBwcm94eSkgdW5peF9wcm94eSA9IDE7CisjZW5kaWYgLyogRlRQX1BST1hZICovCisKKyAgICBpZiAoZnRwX2NtZGxpbiAmJiB4ZmVybW9kZSA9PSBYTU9ERV9NKQorICAgICAgZnRwX3R5cCA9IGJpbmFyeTsgICAgICAgICAgICAgICAgIC8qIFR5cGUgZ2l2ZW4gb24gY29tbWFuZCBsaW5lICovCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIHNldCBpdCBhdXRvbWF0aWNhbGx5ICovCisgICAgICBmdHBfdHlwID0gYWxpa2UgPyBGVFRfQklOIDogRlRUX0FTQzsKKyAgICBjaGFuZ2V0eXBlKGZ0cF90eXAsMCk7ICAgICAgICAgICAgICAvKiBDaGFuZ2UgdG8gdGhpcyB0eXBlICovCisgICAgZ19mdHBfdHlwID0gZnRwX3R5cDsgICAgICAgICAgICAgICAgLyogTWFrZSBpdCB0aGUgZ2xvYmFsIHR5cGUgKi8KKyAgICBpZiAoIXF1aWV0KQorICAgICAgcHJpbnRmKCJEZWZhdWx0IHRyYW5zZmVyIG1vZGUgaXMgJXNcbiIsCisgICAgICAgICAgICAgZnRwX3R5cCA/ICJCSU5BUlkiIDogIlRFWFQgKFwiQVNDSUlcIikiCisgICAgICAgICAgICAgKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykJCS8qIEluaXQgc2VydmVyIEZFQVR1cmUgdGFibGUgKi8KKyAgICAgIHNmdHRhYltpXSA9IDA7CisgICAgaWYgKCFub2luaXQpIHsKKyAgICAgICAgbiA9IGZ0cGNtZCgiTU9ERSBTIixOVUxMLDAsMCwwKTsgLyogV2UgYWx3YXlzIHNlbmQgaW4gU3RyZWFtIG1vZGUgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgIGlmIChuICE9IFJFUExZX0NPTVBMRVRFKQorICAgICAgICAgIHByaW50ZigiV0FSTklORzogU2VydmVyIGRvZXMgbm90IGFjY2VwdCBNT0RFIFMoVFJFQU0pXG4iKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIG4gPSBmdHBjbWQoIlNUUlUgRiIsTlVMTCwwLDAsMCk7IC8qIFNUUlUgRmlsZSAobm90IFJlY29yZCBvciBQYWdlKSAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgaWYgKG4gIT0gUkVQTFlfQ09NUExFVEUpCisgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HOiBTZXJ2ZXIgZG9lcyBub3QgYWNjZXB0IFNUUlUgRihJTEUpXG4iKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJaWYgKGZlYXRvaykgeworCSAgICBuID0gZnRwY21kKCJGRUFUIixOVUxMLDAsMCwwKTsgLyogQXNrIHNlcnZlciBhYm91dCBmZWF0dXJlcyAqLworCSAgICBpZiAobiA9PSBSRVBMWV9DT01QTEVURSkgeworCQlkZWJ1ZyhGMTAxLCJmdHBfaW5pdCBGRUFUIiwiIixzZnR0YWJbMF0pOworCQlpZiAoZGVibG9nIHx8IGZ0cF9kZWIpIHsKKwkJICAgIGludCBpOworCQkgICAgZm9yIChpID0gMTsgaSA8IDE2ICYmIGkgPCBuZmVhdHRhYjsgaSsrKSB7CisJCQlkZWJ1ZyhGMTExLCJmdHBfaW5pdCBGRUFUIixmZWF0dGFiW2ldLmt3ZCxzZnR0YWJbaV0pOworCQkJaWYgKGZ0cF9kZWIpCisJCQkgIHByaW50ZigiICBTZXJ2ZXIgJXMgJXNcbiIsCisJCQkJIHNmdHRhYltpXSA/ICJzdXBwb3J0cyIgOiAiZG9lcyBub3Qgc3VwcG9ydCIsCisJCQkJIGZlYXR0YWJbaV0ua3dkCisJCQkJICk7CisJCSAgICB9CisJCSAgICAvKiBEZWFsIHdpdGggZGlzYWJsZWQgTUxTVCBvcHRzIGhlcmUgaWYgbmVjZXNzYXJ5ICovCisJCSAgICAvKiBCdXQgd2h5IHdvdWxkIGl0IGJlPyAqLworCQl9CisJICAgIH0KKwl9CisgICAgfQorfQorCitzdGF0aWMgaW50CitmdHBfbG9naW4oaG9zdCkgY2hhciAqIGhvc3Q7IHsgICAgICAgICAgLyogKGFsc28gY2FsbGVkIGZyb20gY2t1dXN5LmMpICovCisgICAgc3RhdGljIGNoYXIgZnRwcGFzc1tQQVNTQlVGU0laXT0iIjsKKyAgICBjaGFyIHRtcFtQQVNTQlVGU0laXTsKKyAgICBjaGFyICp1c2VyID0gTlVMTCwgKnBhc3MgPSBOVUxMLCAqYWNjdCA9IE5VTEw7CisgICAgaW50IG4sIGFmbGFnID0gMDsKKyAgICBleHRlcm4gY2hhciB1aWRidWZbXTsKKyAgICBleHRlcm4gY2hhciBwd2J1ZltdOworICAgIGV4dGVybiBpbnQgIHB3ZmxnLCBwd2NyeXB0OworCisgICAgZGVidWcoRjExMSwiZnRwX2xvZ2luIixmdHBfbG9nbmFtZSxmdHBfbG9nKTsKKworICAgIGlmICghY2tzdHJjbXAoZnRwX2xvZ25hbWUsImFub255bW91cyIsLTEsMCkpCisgICAgICBhbm9ueW1vdXMgPSAxOworICAgIGlmICghY2tzdHJjbXAoZnRwX2xvZ25hbWUsImZ0cCIsLTEsMCkpCisgICAgICBhbm9ueW1vdXMgPSAxOworCisjaWZkZWYgRlRQX1NSUAorICAgIGlmIChhdXRoX3R5cGUgJiYgIXN0cmNtcChhdXRoX3R5cGUsICJTUlAiKSkgeworICAgICAgICB1c2VyID0gc3JwX3VzZXI7CisgICAgICAgIHBhc3MgPSBzcnBfcGFzczsKKyAgICAgICAgYWNjdCA9IHNycF9hY2N0OworICAgIH0gZWxzZQorI2VuZGlmIC8qIEZUUF9TUlAgKi8KKyAgICAgIGlmIChhbm9ueW1vdXMpIHsKKyAgICAgICAgICB1c2VyID0gImFub255bW91cyI7CisgICAgICAgICAgaWYgKGZ0cF90bXApIHsJCS8qIFRoZXkgZ2F2ZSBhIHBhc3N3b3JkICovCisgICAgICAgICAgICAgIHBhc3MgPSBmdHBfdG1wOworICAgICAgICAgIH0gZWxzZSBpZiAoZnRwX2FwdykgewkJLyogU0VUIEZUUCBBTk9OWU1PVVMtUEFTU1dPUkQgKi8KKwkgICAgICBwYXNzID0gZnRwX2FwdzsKKwkgIH0gZWxzZSB7CQkJLyogU3VwcGx5IHVzZXJAaG9zdCAqLworCSAgICAgIGNrbWFrbXNnKHRtcCxQQVNTQlVGU0laLHdob2FtaSgpLCJAIixteWhvc3QsTlVMTCk7CisJICAgICAgcGFzcyA9IHRtcDsKKyAgICAgICAgICB9CisJICBkZWJ1ZyhGMTEwLCJmdHAgYW5vbnltb3VzIixwYXNzLDApOworICAgICAgfSBlbHNlIHsKKyNpZmRlZiBVU0VfUlVTRVJQQVNTCisgICAgICAgICAgaWYgKHJ1c2VycGFzcyhob3N0LCAmdXNlciwgJnBhc3MsICZhY2N0KSA8IDApIHsKKyAgICAgICAgICAgICAgZnRwY29kZSA9IC0xOworICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9SVVNFUlBBU1MgKi8KKyAgICAgICAgICBpZiAoZnRwX2xvZ25hbWUpIHsKKyAgICAgICAgICAgICAgdXNlciA9IGZ0cF9sb2duYW1lOworICAgICAgICAgICAgICBwYXNzID0gZnRwX3RtcDsKKyAgICAgICAgICB9IGVsc2UgaWYgKHVpZGJ1ZlswXSAmJiAoZnRwX3RtcCB8fCBwd2J1ZlswXSAmJiBwd2ZsZykpIHsKKyAgICAgICAgICAgICAgdXNlciA9IHVpZGJ1ZjsKKyAgICAgICAgICAgICAgaWYgKGZ0cF90bXApIHsKKyAgICAgICAgICAgICAgICAgIHBhc3MgPSBmdHBfdG1wOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKHB3YnVmWzBdICYmIHB3ZmxnKSB7CisgICAgICAgICAgICAgICAgICBja3N0cm5jcHkoZnRwcGFzcyxwd2J1ZixQQVNTQlVGU0laKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgIGlmICggcHdjcnlwdCApCisgICAgICAgICAgICAgICAgICAgICAgY2tfZW5jcnlwdCgoY2hhciAqKWZ0cHBhc3MpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgcGFzcyA9IGZ0cHBhc3M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYWNjdCA9IGZ0cF9hY2M7CisgICAgICAgICAgd2hpbGUgKHVzZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICBjaGFyICpteW5hbWUsIHByb21wdFtQUk9NUFRTSVpdOworICAgICAgICAgICAgICBpbnQgb2s7CisKKyAgICAgICAgICAgICAgbXluYW1lID0gd2hvYW1pKCk7CisgICAgICAgICAgICAgIGlmIChteW5hbWUpCisgICAgICAgICAgICAgICAgY2ttYWt4bXNnKHByb21wdCxQUk9NUFRTSVosIiBOYW1lICgiLGhvc3QsIjoiLG15bmFtZSwiKTogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBja21ha21zZyhwcm9tcHQsUFJPTVBUU0laLCIgTmFtZSAoIixob3N0LCIpOiAiLE5VTEwpOworICAgICAgICAgICAgICB0bXBbMF0gPSAnXDAnOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgb2sgPSB1cV90eHQoTlVMTCxwcm9tcHQsMSxOVUxMLHRtcCxQQVNTQlVGU0laLE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfVVFfVElNRU9VVCk7CisgICAgICAgICAgICAgIGlmICghb2sgfHwgKnRtcCA9PSAnXDAnKQorICAgICAgICAgICAgICAgIHVzZXIgPSBteW5hbWU7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gYnJzdHJpcCh0bXApOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICBuID0gZnRwY21kKCJVU0VSIix1c2VyLC0xLC0xLGZ0cF92Ym0pOworICAgIGlmIChuID09IFJFUExZX0NPTVBMRVRFKSB7CisgICAgICAgIC8qIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHNlbmQgYSBkdW1teSBwYXNzd29yZCAqLworICAgICAgICBpZiAoZnRwY21kKCJQV0QiLE5VTEwsMCwwLDApICE9IFJFUExZX0NPTVBMRVRFKQorICAgICAgICAgIGZ0cGNtZCgiUEFTUyBkdW1teSIsTlVMTCwwLDAsMSk7CisgICAgfSBlbHNlIGlmIChuID09IFJFUExZX0NPTlRJTlVFKSB7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICBpbnQgb2xkZnRwX2NwbDsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisKKyAgICAgICAgaWYgKHBhc3MgPT0gTlVMTCkgeworICAgICAgICAgICAgaW50IG9rOworICAgICAgICAgICAgc2V0aW50KCk7CisgICAgICAgICAgICBvayA9IHVxX3R4dChOVUxMLCIgUGFzc3dvcmQ6ICIsMixOVUxMLGZ0cHBhc3MsUEFTU0JVRlNJWixOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9VUV9USU1FT1VUKTsKKyAgICAgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgICAgICBwYXNzID0gYnJzdHJpcChmdHBwYXNzKTsKKyAgICAgICAgfQorCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICBvbGRmdHBfY3BsID0gZnRwX2NwbDsKKyAgICAgICAgZnRwX2NwbCA9IEZQTF9QUlY7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICBuID0gZnRwY21kKCJQQVNTIixwYXNzLC0xLC0xLDEpOworICAgICAgICBpZiAoIWFub255bW91cyAmJiBwYXNzKSB7CisgICAgICAgICAgICBjaGFyICogcCA9IHBhc3M7CisgICAgICAgICAgICB3aGlsZSAoKnArKykgKihwLTEpID0gTlVMOworICAgICAgICAgICAgbWFrZXN0cigmZnRwX3RtcCxOVUxMKTsKKyAgICAgICAgfQorI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgLyogbGV2ZWwgbWF5IGhhdmUgY2hhbmdlZCAqLworICAgICAgICBpZiAoZnRwX2NwbCA9PSBGUExfUFJWKQorICAgICAgICAgIGZ0cF9jcGwgPSBvbGRmdHBfY3BsOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICB9CisgICAgaWYgKG4gPT0gUkVQTFlfQ09OVElOVUUpIHsKKyAgICAgICAgYWZsYWcrKzsKKyAgICAgICAgaWYgKGFjY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdGljIGNoYXIgZnRwYWNjdFs4MF07CisgICAgICAgICAgICBpbnQgb2s7CisgICAgICAgICAgICBzZXRpbnQoKTsKKyAgICAgICAgICAgIG9rID0gdXFfdHh0KE5VTEwsIiBBY2NvdW50OiAiLDIsTlVMTCxmdHBhY2N0LDgwLE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1VRX1RJTUVPVVQpOworICAgICAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgICAgIGFjY3QgPSBicnN0cmlwKGZ0cGFjY3QpOworICAgICAgICB9CisgICAgICAgIG4gPSBmdHBjbWQoIkFDQ1QiLGFjY3QsLTEsLTEsZnRwX3ZibSk7CisgICAgfQorICAgIGlmIChuICE9IFJFUExZX0NPTVBMRVRFKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRlRQIGxvZ2luIGZhaWxlZC5cbiIpOworICAgICAgICBpZiAoaGF2ZXVybCkKKyAgICAgICAgICBkb2V4aXQoQkFEX0VYSVQsLTEpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGlmICghYWZsYWcgJiYgYWNjdCAhPSBOVUxMKSB7CisgICAgICAgIGZ0cGNtZCgiQUNDVCIsYWNjdCwtMSwtMSxmdHBfdmJtKTsKKyAgICB9CisgICAgbWFrZXN0cigmZnRwX2xvZ25hbWUsdXNlcik7CisgICAgbG9nZ2VkaW4gPSAxOworI2lmZGVmIExPQ1VTCisgICAgLyogVW5wcmVmaXhlZCBmaWxlIG1hbmFnZW1lbnQgY29tbWFuZHMgZ28gdG8gc2VydmVyICovCisgICAgaWYgKGF1dG9sb2N1cyAmJiAhZnRwX2NtZGxpbikgeworCXNldGxvY3VzKDAsMSk7CisgICAgfQorI2VuZGlmIC8qIExPQ1VTICovCisgICAgZnRwX2luaXQoKTsKKworICAgIGlmIChhbm9ueW1vdXMgJiYgIXF1aWV0KSB7CisgICAgICAgIHByaW50ZigiIExvZ2dlZCBpbiBhcyBhbm9ueW1vdXMgKCVzKVxuIixwYXNzKTsKKyAgICAgICAgbWVtc2V0KHBhc3MsIDAsIHN0cmxlbihwYXNzKSk7CisgICAgfQorICAgIGlmIChmdHBfcmRpcikgeworICAgICAgICBpZiAoZG9mdHBjd2QoZnRwX3JkaXIsLTEpIDwgMSkKKyAgICAgICAgICBkb2V4aXQoQkFEX0VYSVQsLTEpOworICAgIH0KKworI2lmZGVmIEZUUF9QUk9YWQorICAgIGlmIChwcm94eSkKKyAgICAgIHJldHVybigxKTsKKyNlbmRpZiAvKiBGVFBfUFJPWFkgKi8KKyAgICByZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK2Z0cF9yZXNldCgpIHsKKyAgICBpbnQgcmM7CisjaWZkZWYgQlNEU0VMRUNUCisgICAgaW50IG5mbmQgPSAxOworICAgIGZkX3NldCBtYXNrOworICAgIEZEX1pFUk8oJm1hc2spOworICAgIHdoaWxlIChuZm5kID4gMCkgeworICAgICAgICBGRF9TRVQoY3NvY2tldCwgJm1hc2spOworICAgICAgICBpZiAoKG5mbmQgPSBlbXB0eSgmbWFzaywwKSkgPCAwKSB7CisgICAgICAgICAgICBwZXJyb3IoInJlc2V0Iik7CisgICAgICAgICAgICBmdHBjb2RlID0gLTE7CisgICAgICAgICAgICBsb3N0cGVlcigpOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9IGVsc2UgaWYgKG5mbmQpIHsKKyAgICAgICAgICAgIGdldHJlcGx5KDAsLTEsLTEsZnRwX3ZibSwwKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlIC8qIEJTRFNFTEVDVCAqLworI2lmZGVmIElCTVNFTEVDVAorICAgIGludCBuZm5kID0gMTsKKyAgICB3aGlsZSAobmZuZCA+IDApIHsKKyAgICAgICAgaWYgKChuZm5kID0gZW1wdHkoJmNzb2NrZXQsMSwwKSkgPCAwKSB7CisgICAgICAgICAgICBwZXJyb3IoInJlc2V0Iik7CisgICAgICAgICAgICBmdHBjb2RlID0gLTE7CisgICAgICAgICAgICBsb3N0cGVlcigpOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9IGVsc2UgaWYgKG5mbmQpIHsKKyAgICAgICAgICAgIGdldHJlcGx5KDAsLTEsLTEsZnRwX3ZibSwwKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBJQk1TRUxFQ1QgKi8KKyNlbmRpZiAvKiBCU0RTRUxFQ1QgKi8KKyAgICByYyA9IChmdHBjbWQoIlJFSU4iLE5VTEwsMCwwLGZ0cF92Ym0pID09IFJFUExZX0NPTVBMRVRFKTsKKyAgICBpZiAocmMgPiAwKQorICAgICAgbG9nZ2VkaW4gPSAwOworICAgIHJldHVybihyYyk7Cit9CisKK3N0YXRpYyBpbnQKK2Z0cF9yZW5hbWUoZnJvbSwgdG8pIGNoYXIgKiBmcm9tLCAqIHRvOyB7CisgICAgaW50IGxjcyA9IC0xLCByY3MgPSAtMTsKKyNpZm5kZWYgTk9DU0VUUworICAgIGlmIChmdHBfeGxhKSB7CisgICAgICAgIGxjcyA9IGZ0cF9jc2w7CisgICAgICAgIGlmIChsY3MgPCAwKSBsY3MgPSBmY2hhcnNldDsKKyAgICAgICAgcmNzID0gZnRwX2NzeDsKKyAgICAgICAgaWYgKHJjcyA8IDApIHJjcyA9IGZ0cF9jc3I7CisgICAgfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICBpZiAoZnRwY21kKCJSTkZSIixmcm9tLGxjcyxyY3MsZnRwX3ZibSkgPT0gUkVQTFlfQ09OVElOVUUpIHsKKyAgICAgICAgcmV0dXJuKGZ0cGNtZCgiUk5UTyIsdG8sbGNzLHJjcyxmdHBfdmJtKSA9PSBSRVBMWV9DT01QTEVURSk7CisgICAgfQorICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhaWx1cmUgKi8KK30KKworc3RhdGljIGludAorZnRwX3VtYXNrKG1hc2spIGNoYXIgKiBtYXNrOyB7CisgICAgaW50IHJjOworICAgIHJjID0gKGZ0cGNtZCgiU0lURSBVTUFTSyIsbWFzaywtMSwtMSwxKSA9PSBSRVBMWV9DT01QTEVURSk7CisgICAgcmV0dXJuKHJjKTsKK30KKworc3RhdGljIGludAorZnRwX3VzZXIodXNlcixwYXNzLGFjY3QpIGNoYXIgKiB1c2VyLCAqIHBhc3MsICogYWNjdDsgeworICAgIGludCBuID0gMCwgYWZsYWcgPSAwOworICAgIGNoYXIgcHdkW1BXRFNJWl07CisKKyAgICBpZiAoIWF1dGhfdHlwZSAmJiBmdHBfYXV0KSB7CisjaWZkZWYgRlRQX1NSUAorICAgICAgICBpZiAoY2tfc3JwX2lzX2luc3RhbGxlZCgpKSB7CisgICAgICAgICAgICBpZiAoc3JwX2Z0cF9hdXRoKCBOVUxMLCB1c2VyLCBwYXNzKSkgeworICAgICAgICAgICAgICAgIG1ha2VzdHIoJnBhc3Msc3JwX3Bhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogRlRQX1NSUCAqLworICAgIH0KKyAgICBuID0gZnRwY21kKCJVU0VSIix1c2VyLC0xLC0xLGZ0cF92Ym0pOworICAgIGlmIChuID09IFJFUExZX0NPTVBMRVRFKQorICAgICAgbiA9IGZ0cGNtZCgiUEFTUyBkdW1teSIsTlVMTCwwLDAsMSk7CisgICAgZWxzZSBpZiAobiA9PSBSRVBMWV9DT05USU5VRSkgeworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgaW50IG9sZGZ0cF9jcGw7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICBpZiAocGFzcyA9PSBOVUxMIHx8ICFwYXNzWzBdKSB7CisgICAgICAgICAgICBpbnQgb2s7CisgICAgICAgICAgICBwd2RbMF0gPSAnXDAnOworICAgICAgICAgICAgc2V0aW50KCk7CisgICAgICAgICAgICBvayA9IHVxX3R4dChOVUxMLCIgUGFzc3dvcmQ6ICIsMixOVUxMLHB3ZCxQV0RTSVosTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfVVFfVElNRU9VVCk7CisgICAgICAgICAgICBpZiAob2spCisgICAgICAgICAgICAgICAgcGFzcyA9IGJyc3RyaXAocHdkKTsKKyAgICAgICAgfQorCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICBpZiAoKG9sZGZ0cF9jcGwgPSBmdHBfY3BsKSA9PSBQUk9UX1MpCisgICAgICAgICAgZnRwX2NwbCA9IFBST1RfUDsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgIG4gPSBmdHBjbWQoIlBBU1MiLHBhc3MsLTEsLTEsMSk7CisgICAgICAgIG1lbXNldChwYXNzLCAwLCBzdHJsZW4ocGFzcykpOworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgLyogbGV2ZWwgbWF5IGhhdmUgY2hhbmdlZCAqLworICAgICAgICBpZiAoZnRwX2NwbCA9PSBQUk9UX1ApCisgICAgICAgICAgZnRwX2NwbCA9IG9sZGZ0cF9jcGw7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgIH0KKyAgICBpZiAobiA9PSBSRVBMWV9DT05USU5VRSkgeworICAgICAgICBpZiAoYWNjdCA9PSBOVUxMIHx8ICFhY2N0WzBdKSB7CisgICAgICAgICAgICBpbnQgb2s7CisgICAgICAgICAgICBwd2RbMF0gPSAnXDAnOworICAgICAgICAgICAgc2V0aW50KCk7CisgICAgICAgICAgICBvayA9IHVxX3R4dChOVUxMLCIgQWNjb3VudDogIiwyLE5VTEwscHdkLFBXRFNJWixOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9VUV9USU1FT1VUKTsKKyAgICAgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgICAgICBhY2N0ID0gcHdkOworICAgICAgICB9CisgICAgICAgIG4gPSBmdHBjbWQoIkFDQ1QiLGFjY3QsLTEsLTEsZnRwX3ZibSk7CisgICAgICAgIGFmbGFnKys7CisgICAgfQorICAgIGlmIChuICE9IFJFUExZX0NPTVBMRVRFKSB7CisgICAgICAgIHByaW50ZigiTG9naW4gZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgaWYgKCFhZmxhZyAmJiBhY2N0ICE9IE5VTEwgJiYgYWNjdFswXSkgeworICAgICAgICBuID0gZnRwY21kKCJBQ0NUIixhY2N0LC0xLC0xLGZ0cF92Ym0pOworICAgIH0KKyAgICBpZiAobiA9PSBSRVBMWV9DT01QTEVURSkgeworICAgICAgICBtYWtlc3RyKCZmdHBfbG9nbmFtZSx1c2VyKTsKKyAgICAgICAgbG9nZ2VkaW4gPSAxOworICAgICAgICBmdHBfaW5pdCgpOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworY2hhciAqCitmdHBfYXV0aHR5cGUoKSB7CisgICAgaWYgKCFjb25uZWN0ZWQpCisgICAgICByZXR1cm4oIk5VTEwiKTsKKyAgICByZXR1cm4oYXV0aF90eXBlID8gYXV0aF90eXBlIDogIk5VTEwiKTsKK30KKworY2hhciAqCitmdHBfY3BsX21vZGUoKSB7CisgICAgc3dpdGNoIChmdHBfY3BsKSB7CisgICAgICBjYXNlIEZQTF9DTFI6CisgICAgICAgIHJldHVybigiY2xlYXIiKTsKKyAgICAgIGNhc2UgRlBMX1NBRjoKKyAgICAgICAgcmV0dXJuKCJzYWZlIik7CisgICAgICBjYXNlIEZQTF9QUlY6CisgICAgICAgIHJldHVybigicHJpdmF0ZSIpOworICAgICAgY2FzZSBGUExfQ09OOgorICAgICAgICByZXR1cm4oImNvbmZpZGVudGlhbCIpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKCIoZXJyb3IpIik7CisgICAgfQorfQorCitjaGFyICoKK2Z0cF9kcGxfbW9kZSgpIHsKKyAgICBzd2l0Y2ggKGZ0cF9kcGwpIHsKKyAgICAgIGNhc2UgRlBMX0NMUjoKKyAgICAgICAgcmV0dXJuKCJjbGVhciIpOworICAgICAgY2FzZSBGUExfU0FGOgorICAgICAgICByZXR1cm4oInNhZmUiKTsKKyAgICAgIGNhc2UgRlBMX1BSVjoKKyAgICAgICAgcmV0dXJuKCJwcml2YXRlIik7CisgICAgICBjYXNlIEZQTF9DT046CisgICAgICAgIHJldHVybigiY29uZmlkZW50aWFsIik7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4oIihlcnJvcikiKTsKKyAgICB9Cit9CisKKworLyogcmVtb3RlX2ZpbGVzKCkgKi8KKy8qCisgICBSZXR1cm5zIG5leHQgcmVtb3RlIGZpbGVuYW1lIG9uIHN1Y2Nlc3M7CisgICBOVUxMIG9uIGVycm9yIG9yIG5vIG1vcmUgZmlsZXMgd2l0aCBnbG9iYWwgcmZyYyBzZXQgdG86CisgICAgIC0xOiBCYWQgYXJndW1lbnQKKyAgICAgLTI6IFNlcnZlciBlcnJvciByZXNwb25zZSB0byBOTFNULCBlLmcuIGZpbGUgbm90IGZvdW5kCisgICAgIC0zOiBObyBtb3JlIGZpbGVzCisgICAgIC05OiBJbnRlcm5hbCBlcnJvcgorKi8KKyNkZWZpbmUgRlRQTkFNQlVGTEVOIENLTUFYUEFUSCsxMDI0CisKKy8qIENoZWNrOiBja21heGZpbGVzIENLTUFYT1BFTiAqLworCisjZGVmaW5lIE1MU0RFUFRIIDEyOAkJCS8qIFN0YWNrIG9mIG9wZW4gdGVtcCBmaWxlcyAqLworc3RhdGljIGludCBtbHNkZXB0aCA9IDA7CQkvKiBUZW1wIGZpbGUgc3RhY2sgZGVwdGggKi8KK3N0YXRpYyBGSUxFICogdG1wZmlscHRyW01MU0RFUFRIKzFdID0geyBOVUxMLCBOVUxMIH07IC8qIFRlbXAgZmlsZSBwb2ludGVycyAqLworc3RhdGljIGNoYXIgKiB0bXBmaWxuYW1bTUxTREVQVEgrMV0gPSB7IE5VTEwsIE5VTEwgfTsgLyogVGVtcCBmaWxlIG5hbWVzICovCisKK3N0YXRpYyBWT0lECittbHNyZXNldCgpIHsJCQkJLyogUmVzZXQgTUdFVCB0ZW1wLWZpbGUgc3RhY2sgKi8KKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IG1sc2RlcHRoOyBpKyspIHsKKwlpZiAodG1wZmlscHRyW2ldKSB7CisJICAgIGZjbG9zZSh0bXBmaWxwdHJbaV0pOworCSAgICB0bXBmaWxwdHJbaV0gPSBOVUxMOworCSAgICBpZiAodG1wZmlsbmFtW2ldKSB7CisjaWZkZWYgT1MyCisJCXVubGluayh0bXBmaWxuYW1baV0pOworI2VuZGlmIC8qIE9TMiAqLworCQlmcmVlKHRtcGZpbG5hbVtpXSk7CisJICAgIH0KKwl9CisgICAgfQorICAgIG1sc2RlcHRoID0gMDsKK30KKworc3RhdGljIENIQVIgKgorI2lmZGVmIENLX0FOU0lDCityZW1vdGVfZmlsZXMoaW50IG5ld19xdWVyeSwgQ0hBUiAqIGFyZywgQ0hBUiAqIHBhdHRlcm4sIGludCBwcm94eV9zd2l0Y2gpCisjZWxzZSAvKiBDS19BTlNJQyAqLworcmVtb3RlX2ZpbGVzKG5ld19xdWVyeSwgYXJnLCBwYXR0ZXJuLCBwcm94eV9zd2l0Y2gpCisgICAgaW50IG5ld19xdWVyeTsKKyAgICBDSEFSICogYXJnOwkJCQkvKiBUaGF0IHdlIHNlbmQgdG8gdGhlIHNlcnZlciAqLworICAgIENIQVIgKiBwYXR0ZXJuOwkJCS8qIFRoYXQgd2UgdXNlIGxvY2FsbHkgKi8KKyAgICBpbnQgcHJveHlfc3dpdGNoOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiByZW1vdGVfZmlsZXMgKi8geworICAgIHN0YXRpYyBDSEFSIGJ1ZltGVFBOQU1CVUZMRU5dOworICAgIENIQVIgKmNwLCAqd2hpY2hhcmc7CisgICAgY2hhciAqIGNkdG8gPSBOVUxMOworICAgIGNoYXIgKiBwOworICAgIGludCBpLCB4LCBmb3JjZWQgPSAwOworICAgIGludCBsY3MgPSAwLCByY3MgPSAwLCB4bGF0ZSA9IDA7CisKKyAgICBkZWJ1ZyhGMTAxLCJmdHAgcmVtb3RlX2ZpbGVzIG5ld19xdWVyeSIsIiIsbmV3X3F1ZXJ5KTsKKyAgICBkZWJ1ZyhGMTEwLCJmdHAgcmVtb3RlX2ZpbGVzIGFyZyIsYXJnLDApOworICAgIGRlYnVnKEYxMTAsImZ0cCByZW1vdGVfZmlsZXMgcGF0dGVybiIscGF0dGVybiwwKTsKKworICAgIHJmcmMgPSAtMTsKKyAgICBpZiAocGF0dGVybikJCQkvKiBUcmVhdCBlbXB0eSBwYXR0ZXJuIHNhbWUgYXMgTlVMTCAqLworICAgICAgaWYgKCEqcGF0dGVybikKKwlwYXR0ZXJuID0gTlVMTDsKKyAgICBpZiAoYXJnKQkJCQkvKiBEaXR0byBmb3IgYXJnICovCisgICAgICBpZiAoISphcmcpCisJYXJnID0gTlVMTDsKKworICBhZ2FpbjoKKworICAgIGlmIChuZXdfcXVlcnkpIHsKKyAgICAgICAgaWYgKHRtcGZpbHB0clttbHNkZXB0aF0pIHsKKyAgICAgICAgICAgIGZjbG9zZSh0bXBmaWxwdHJbbWxzZGVwdGhdKTsKKyAgICAgICAgICAgIHRtcGZpbHB0clttbHNkZXB0aF0gPSBOVUxMOworI2lmZGVmIE9TMgorICAgICAgICAgICAgaWYgKCFmdHBfZGViICYmICFkZWJsb2cpCisgICAgICAgICAgICAgIHVubGluayh0bXBmaWxuYW1bbWxzZGVwdGhdKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodG1wZmlscHRyW21sc2RlcHRoXSA9PSBOVUxMKSB7CisgICAgICAgIGV4dGVybiBjaGFyICogdGVtcGRpcjsKKyAgICAgICAgY2hhciAqIHA7CisgICAgICAgIGRlYnVnKEYxMTAsImZ0cCByZW1vdGVfZmlsZXMgdGVtcGRpciIsdGVtcGRpciwwKTsKKyAgICAgICAgaWYgKHRlbXBkaXIpIHsKKyAgICAgICAgICAgIHAgPSB0ZW1wZGlyOworICAgICAgICB9IGVsc2UgeworI2lmZGVmIE9TMgorI2lmZGVmIE5UCisgICAgICAgICAgICBwID0gZ2V0ZW52KCJLOTVUTVAiKTsKKyNlbHNlCisgICAgICAgICAgICBwID0gZ2V0ZW52KCJLMlRNUCIpOworI2VuZGlmIC8qIE5UICovCisgICAgICAgICAgICBpZiAoIXApCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgIHAgPSBnZXRlbnYoIkNLX1RNUCIpOworICAgICAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgICBwID0gZ2V0ZW52KCJUTVBESVIiKTsKKyAgICAgICAgICAgIGlmICghcCkgcCA9IGdldGVudigiVEVNUCIpOworICAgICAgICAgICAgaWYgKCFwKSBwID0gZ2V0ZW52KCJUTVAiKTsKKyNpZmRlZiBPUzJPUlVOSVgKKyAgICAgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbihwKTsKKyAgICAgICAgICAgICAgICBpZiAocFtsZW4tMV0gIT0gJy8nCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgICYmIHBbbGVuLTFdICE9ICdcXCcKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY2hhciBmb29bQ0tNQVhQQVRIXTsKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGZvbyxwLENLTUFYUEFUSCk7CisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdChmb28sIi8iLENLTUFYUEFUSCk7CisgICAgICAgICAgICAgICAgICAgIHAgPSBmb287CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisjZWxzZSAvKiBPUzJPUlVOSVggKi8KKyAgICAgICAgICAgIGlmICghcCkKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyNpZmRlZiBVTklYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTeXN0ZW1zIHRoYXQgaGF2ZSBhIHN0YW5kYXJkICovCisgICAgICAgICAgICAgICAgcCA9ICIvdG1wLyI7ICAgICAgICAgICAgLyogdGVtcG9yYXJ5IGRpcmVjdG9yeS4uLiAqLworI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgICAgICAgICAgcCA9ICI6VE1QOiI7CisjZWxzZQorICAgICAgICAgICAgcCA9ICIiOworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogVU5JWCAqLworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTAsImZ0cCByZW1vdGVfZmlsZXMgcCIscCwwKTsKKworCS8qIEdldCB0ZW1wIGZpbGUgKi8KKworCWlmICgodG1wZmlsbmFtW21sc2RlcHRoXSA9IChjaGFyICopbWFsbG9jKENLTUFYUEFUSCsxKSkpIHsKKwkgICAgY2ttYWttc2coKGNoYXIgKil0bXBmaWxuYW1bbWxzZGVwdGhdLAorCQkgICAgIENLTUFYUEFUSCsxLHAsImNrWFhYWFhYIixOVUxMLE5VTEwpOworCX0gZWxzZSB7CisJICAgIHByaW50ZigiP01hbGxvYyBmYWlsdXJlOiByZW1vdGVfZmlsZXMoKVxuIik7CisJICAgIHJldHVybihOVUxMKTsKKwl9CisKKyNpZmRlZiBOVAorCXsKKwkgICAgY2hhciAqIHRtcGZpbCA9IG1rdGVtcCgoY2hhciAqKXRtcGZpbG5hbVttbHNkZXB0aF0pOworCSAgICBpZiAoIHRtcGZpbCApCisJCWNrc3RybmNweSh0bXBmaWxuYW1bbWxzZGVwdGhdLHRtcGZpbCxDS01BWFBBVEgrMSk7CisJfQorI2Vsc2UgLyogTlQgKi8KKyNpZmRlZiBNS1RFTVAKKyNpZmRlZiBNS1NURU1QCisJeCA9IG1rc3RlbXAoKGNoYXIgKil0bXBmaWxuYW1bbWxzZGVwdGhdKTsKKwlpZiAoeCA+IC0xKSBjbG9zZSh4KTsJCS8qIFdlIGp1c3Qgd2FudCB0aGUgbmFtZS4gKi8KKyNlbHNlCisgICAgICAgIG1rdGVtcCgoY2hhciAqKXRtcGZpbG5hbVttbHNkZXB0aF0pOworI2VuZGlmIC8qIE1LU1RFTVAgKi8KKyAgICAgICAgLyogaWYgbm8gbWt0bXBuYW0oKSB0aGUgbmFtZSB3aWxsIGp1c3QgYmUgImNrWFhYWFhYIi4uLiAqLworI2VuZGlmIC8qIE1LVEVNUCAqLworI2VuZGlmIC8qIE5UICovCisKKwlkZWJ1ZyhGMTExLCJmdHAgcmVtb3RlX2ZpbGVzIHRtcGZpbG5hbVttbHNkZXB0aF0iLAorCSAgICAgIHRtcGZpbG5hbVttbHNkZXB0aF0sbWxzZGVwdGgpOworCisjaWZkZWYgRlRQX1BST1hZCisgICAgICAgIGlmIChwcm94eV9zd2l0Y2gpIHsKKyAgICAgICAgICAgIHBzd2l0Y2goIXByb3h5KTsKKyAgICAgICAgfQorI2VuZGlmIC8qIEZUUF9QUk9YWSAqLworCisgICAgICAgIGRlYnVnKEYxMDEsImZ0cCByZW1vdGVfZmlsZXMgZnRwX3hsYSIsIiIsZnRwX3hsYSk7CisgICAgICAgIGRlYnVnKEYxMDEsImZ0cCByZW1vdGVfZmlsZXMgZnRwX2NzbCIsIiIsZnRwX2NzbCk7CisgICAgICAgIGRlYnVnKEYxMDEsImZ0cCByZW1vdGVfZmlsZXMgZnRwX2NzciIsIiIsZnRwX2Nzcik7CisKKyNpZm5kZWYgTk9DU0VUUworICAgICAgICB4bGF0ZSA9IGZ0cF94bGE7ICAgICAgICAgICAgICAgIC8qIFNFVCBGVFAgQ0hBUkFDVEVSLVNFVC1UUkFOU0xBVElPTiAqLworICAgICAgICBpZiAoeGxhdGUpIHsgICAgICAgICAgICAgICAgICAgIC8qIE9OPyAqLworICAgICAgICAgICAgbGNzID0gZnRwX2NzbDsgICAgICAgICAgICAgIC8qIExvY2FsIGNoYXJzZXQgKi8KKyAgICAgICAgICAgIGlmIChsY3MgPCAwKSBsY3MgPSBmY2hhcnNldDsKKyAgICAgICAgICAgIGlmIChsY3MgPCAwKSB4bGF0ZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHhsYXRlKSB7ICAgICAgICAgICAgICAgICAgICAvKiBTdGlsbCBPTj8gKi8KKyAgICAgICAgICAgIHJjcyA9IGZ0cF9jc3g7ICAgICAgICAgICAgICAvKiBSZW1vdGUgKFNlcnZlcikgY2hhcnNldCAqLworICAgICAgICAgICAgaWYgKHJjcyA8IDApIHJjcyA9IGZ0cF9jc3I7CisgICAgICAgICAgICBpZiAocmNzIDwgMCkgeGxhdGUgPSAwOworICAgICAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisJZm9yY2VkID0gbWdldGZvcmNlZDsJCS8qIE1HRVQgbWV0aG9kIGZvcmNlZD8gKi8KKwlpZiAoIWZvcmNlZCB8fCAhbWdldG1ldGhvZCkJLyogTm90IGZvcmNlZC4uLiAqLworCSAgbWdldG1ldGhvZCA9IChzZnR0YWJbMF0gJiYgc2Z0dGFiW1NGVF9NTFNUXSkgPyAvKiBzbyBwaWNrIG9uZSAqLworCSAgICAgIFNORF9NTFMgOgorCSAgICAgIFNORF9OTFM7IAorLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIFVzZXIncyBDb21tYW5kOiAgICAgICAgICAgICAgICAgUmVzdWx0OgorICAgIG1nZXQgL25sc3QgICAgICAgICAgICAgICAgICAgICBOTFNUIChOVUxMKQorICAgIG1nZXQgL25sc3QgZm9vICAgICAgICAgICAgICAgICBOTFNUIGZvbworICAgIG1nZXQgL25sc3QgKi50eHQgICAgICAgICAgICAgICBOTFNUICoudHh0IAorICAgIG1nZXQgL25sc3QgL21hdGNoOioudHh0ICAgICAgICBOTFNUIChOVUxMKQorICAgIG1nZXQgL25sc3QgL21hdGNoOioudHh0ICBmb28gICBOTFNUIGZvbyAgIAorICAgIG1nZXQgL21sc2QgICAgICAgICAgICAgICAgICAgICBNTFNEIChOVUxMKQorICAgIG1nZXQgL21sc2QgZm9vICAgICAgICAgICAgICAgICBNTFNEIGZvbworICAgIG1nZXQgL21sc2QgKi50eHQgICAgICAgICAgICAgICBNTFNEIChOVUxMKQorICAgIG1nZXQgL21sc2QgL21hdGNoOioudHh0ICAgICAgICBNTFNEIChOVUxMKQorICAgIG1nZXQgL21sc2QgL21hdGNoOioudHh0ICBmb28gICBNTFNEIGZvbworKi8KKwl4ID0gLTE7CisJd2hpbGUgKHggPCAwKSB7CisJICAgIGlmIChwYXR0ZXJuKSB7CQkvKiBEb24ndCBzaW1wbGlmeSB0aGlzISAqLworCQl3aGljaGFyZyA9IGFyZzsKKwkgICAgfSBlbHNlIGlmIChtZ2V0bWV0aG9kID09IFNORF9NTFMpIHsKKwkJaWYgKGFyZykKKwkJICB3aGljaGFyZyA9IGlzd2lsZCgoY2hhciAqKWFyZykgPyBOVUxMIDogYXJnOworCQllbHNlCisJCSAgd2hpY2hhcmcgPSBOVUxMOworCSAgICB9IGVsc2UgeworCQl3aGljaGFyZyA9IGFyZzsKKwkgICAgfQorCSAgICBkZWJ1ZyhGMTEwLCJmdHAgcmVtb3RlX2ZpbGVzIG1nZXRtZXRob2QiLAorCQkgIG1nZXRtZXRob2QgPT0gU05EX01MUyA/ICJNTFNEIiA6ICJOTFNUIiwgMCk7CisJICAgIGRlYnVnKEYxMTAsImZ0cCByZW1vdGVfZmlsZXMgd2hpY2hhcmciLHdoaWNoYXJnLDApOworCisJICAgIHggPSByZWN2cmVxdWVzdCgobWdldG1ldGhvZCA9PSBTTkRfTUxTKSA/ICJNTFNEIiA6ICJOTFNUIiwKKwkJCSAgICAoY2hhciAqKXRtcGZpbG5hbVttbHNkZXB0aF0sCisJCQkgICAgKGNoYXIgKil3aGljaGFyZywKKwkJCSAgICAid2IiLAorCQkJICAgIDAsCisJCQkgICAgMCwKKwkJCSAgICBOVUxMLAorCQkJICAgIHhsYXRlLAorCQkJICAgIGxjcywKKwkJCSAgICByY3MKKwkJCSAgICApOworCSAgICBpZiAoeCA8IDApIHsJCS8qIENob3NlbiBtZXRob2Qgd2Fzbid0IGFjY2VwdGVkICovCisJCWlmIChmb3JjZWQpIHsKKwkJICAgIGlmIChmdHBjb2RlID4gNTAwICYmIGZ0cGNvZGUgPCA1MDUgJiYgIXF1aWV0KQorCQkgICAgICBwcmludGYoIj8lczogTm90IHN1cHBvcnRlZCBieSBzZXJ2ZXJcbiIsCisJCQkgICAgIG1nZXRtZXRob2QgPT0gU05EX01MUyA/ICJNTFNEIiA6ICJOTFNUIgorCQkJICAgICApOworCQkgICAgcmZyYyA9IC0yOwkJLyogRmFpbCAqLworCQkgICAgcmV0dXJuKE5VTEwpOworCQl9CisJCS8qIE5vdCBmb3JjZWQgLSBpZiBNTFNEIGZhaWxlZCwgdHJ5IE5MU1QgKi8KKwkJaWYgKG1nZXRtZXRob2QgPT0gU05EX01MUykgeyAgLyogU2VydmVyIGxpZWQgYWJvdXQgTUxTVCAqLworCQkgICAgc2Z0dGFiW1NGVF9NTFNUXSA9IDA7ICAgICAvKiBTbyBkaXNhYmxlIGl0ICovCisJCSAgICBtbHN0b2sgPSAwOwkJICAgICAgLyogYW5kICovCisJCSAgICBtZ2V0bWV0aG9kID0gU05EX05MUzsgICAgIC8qIHRyeSBOTFNUICovCisJCSAgICBjb250aW51ZTsKKwkJfQorCQlyZnJjID0gLTI7CisJCXJldHVybihOVUxMKTsKKwkgICAgfQorCX0KKyNpZmRlZiBGVFBfUFJPWFkKKyAgICAgICAgaWYgKHByb3h5X3N3aXRjaCkgeworICAgICAgICAgICAgcHN3aXRjaCghcHJveHkpOworICAgICAgICB9CisjZW5kaWYgLyogRlRQX1BST1hZICovCisgICAgICAgIHRtcGZpbHB0clttbHNkZXB0aF0gPSBmb3BlbigoY2hhciAqKXRtcGZpbG5hbVttbHNkZXB0aF0sICJyIik7CisjaWZuZGVmIE9TMgorCWlmICh0bXBmaWxwdHJbbWxzZGVwdGhdKSB7CisJICAgIGlmICghZnRwX2RlYiAmJiAhZGVibG9nKQorCSAgICAgIHVubGluayh0bXBmaWxuYW1bbWxzZGVwdGhdKTsKKwl9CisjZW5kaWYgLyogT1MyICovCisgICAgICBub3RlbXA6CisgICAgICAgIGlmICghdG1wZmlscHRyW21sc2RlcHRoXSkgeworICAgICAgICAgICAgZGVidWcoRjExMCwiZnRwIHJlbW90ZV9maWxlcyBvcGVuIGZhaWwiLHRtcGZpbG5hbVttbHNkZXB0aF0sMCk7CisgICAgICAgICAgICBpZiAoKCFkcHlhY3RpdmUgfHwgZnRwX2RlYikpCisgICAgICAgICAgICAgIHByaW50ZigiP0Nhbid0IGZpbmQgbGlzdCBvZiByZW1vdGUgZmlsZXMsIG9vcHNcbiIpOworICAgICAgICAgICAgcmZyYyA9IC05OworICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworICAgICAgICB9CisJaWYgKGZ0cF9kZWIpCisJICBwcmludGYoIkxJU1RGSUxFOiAlc1xuIix0bXBmaWxuYW1bbWxzZGVwdGhdKTsKKyAgICB9CisgICAgYnVmWzBdID0gTlVMOworICAgIGJ1ZltGVFBOQU1CVUZMRU4tMV0gPSBOVUw7CisgICAgYnVmW0ZUUE5BTUJVRkxFTi0yXSA9IE5VTDsKKworICAgIC8qIFdlIGhhdmUgdG8gcmVkbyBhbGwgdGhpcyBiZWNhdXNlIHRoZSBmaXJzdCB0aW1lIHdhcyBvbmx5IGZvciAqLworICAgIC8qIGZvciBnZXR0aW5nIHRoZSBmaWxlIGxpc3QsIG5vdyBpdCdzIGZvciBnZXR0aW5nIGVhY2ggZmlsZSAqLworCisgICAgaWYgKGFyZyAmJiBtZ2V0bWV0aG9kID09IFNORF9NTFMpIHsJLyogTUxTRCAqLworCWlmICghcGF0dGVybiAmJiBpc3dpbGQoKGNoYXIgKilhcmcpKSB7CisJICAgIHBhdHRlcm4gPSBhcmc7CQkvKiBXaWxkIGFyZyBpcyByZWFsbHkgYSBwYXR0ZXJuICovCisJICAgIGlmIChwYXR0ZXJuKQorCSAgICAgIGlmICghKnBhdHRlcm4pCisJCXBhdHRlcm4gPSBOVUxMOworCSAgICBhcmcgPSBOVUxMOwkJCS8qIGFuZCBub3QgYW4gYXJnICovCisJfQorCWlmIChuZXdfcXVlcnkpIHsJCS8qIEluaXRpYWwgcXVlcnk/ICovCisJICAgIGNkdG8gPSAoY2hhciAqKWFyZzsJCS8qIChub253aWxkKSBhcmcgZ2l2ZW4/ICovCisJICAgIGlmIChjZHRvKQorCSAgICAgIGlmICghKmNkdG8pCisJCWNkdG8gPSBOVUxMOworCSAgICBpZiAoY2R0bykJCQkvKiBJZiBzbywgdGhlbiBDRCB0byBpdCAqLworCSAgICAgIGRvZnRwY3dkKGNkdG8sMCk7CisJfQorICAgIH0KKyAgICBuZXdfcXVlcnkgPSAwOworCisgICAgaWYgKGZnZXRzKChjaGFyICopYnVmLCBGVFBOQU1CVUZMRU4sIHRtcGZpbHB0clttbHNkZXB0aF0pID09IE5VTEwpIHsKKyAgICAgICAgZmNsb3NlKHRtcGZpbHB0clttbHNkZXB0aF0pOworICAgICAgICB0bXBmaWxwdHJbbWxzZGVwdGhdID0gTlVMTDsKKworI2lmZGVmIE9TMgorICAgICAgICBpZiAoIWZ0cF9kZWIgJiYgIWRlYmxvZykKKyAgICAgICAgICB1bmxpbmsodG1wZmlsbmFtW21sc2RlcHRoXSk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIGlmIChmdHBfZGViICYmICFkZWJsb2cpIHsKKyAgICAgICAgICAgIHByaW50ZigiKFRlbXBvcmFyeSBmaWxlICVzIE5PVCBkZWxldGVkKVxuIiwKKwkJICAgKGNoYXIgKil0bXBmaWxuYW1bbWxzZGVwdGhdKTsKKyAgICAgICAgfQorCWlmIChtbHNkZXB0aCA8PSAwKSB7CQkvKiBFT0YgYXQgZGVwdGggMCAqLworCSAgICByZnJjID0gLTM7CQkJLyogbWVhbnMgd2UncmUgZG9uZSAqLworCSAgICByZXR1cm4oTlVMTCk7CisJfQorCXByaW50ZigiUE9QUElORyglZCkuLi5cbiIsbWxzZGVwdGgtMSk7IAorCWlmICh0bXBmaWxuYW1bbWxzZGVwdGhdKSBmcmVlKHRtcGZpbG5hbVttbHNkZXB0aF0pOworCW1sc2RlcHRoLS07CisJZG9mdHBjZHVwKCk7CisJemNoZGlyKCIuLiIpOwkJCS8qIDwtLSBOb3QgcG9ydGFibGUgKi8KKwlnb3RvIGFnYWluOworICAgIH0KKyAgICBpZiAoYnVmW0ZUUE5BTUJVRkxFTi0xXSkgeworCXByaW50ZigiP0JVRkZFUiBPVkVSRkxPVyAtLSBGVFAgTkxTVCBvciBNTFNEIHN0cmluZyBsb25nZXIgdGhhbiAlZFxuIiwKKwkgICAgICAgRlRQTkFNQlVGTEVOCisJICAgICAgICk7CisJZGVidWcoRjEwMSwicmVtb3RlX2ZpbGVzIGJ1ZmZlciBvdmVycnVuIiwiIixGVFBOQU1CVUZMRU4pOworCXJldHVybihOVUxMKTsKKyAgICB9CisgICAgLyogZGVidWcoRjExMCwiZnRwIHJlbW90ZV9maWxlcyBidWYgMSIsYnVmLDApOyAqLworICAgIGlmICgoY3AgPSAoQ0hBUiAqKWNrc3RyY2hyKChjaGFyICopYnVmLCdcbicpKSAhPSBOVUxMKQorICAgICAgKmNwID0gJ1wwJzsKKyAgICBpZiAoKGNwID0gKENIQVIgKilja3N0cmNocigoY2hhciAqKWJ1ZiwnXHInKSkgIT0gTlVMTCkKKyAgICAgICpjcCA9ICdcMCc7CisgICAgZGVidWcoRjExMCwiZnRwIHJlbW90ZV9maWxlcyBidWYiLGJ1ZiwwKTsKKyAgICByZnJjID0gMDsKKworICAgIGlmIChmdHBfZGViKQorICAgICAgcHJpbnRmKCJbJXNdXG4iLChjaGFyICopYnVmKTsKKworICAgIGhhdmVzaXplID0gLTFMOwkJCS8qIEluaXRpYWxpemUgZmlsZSBmYWN0cy4uLiAqLworICAgIGhhdmV0eXBlID0gLTA7CisgICAgbWFrZXN0cigmaGF2ZW1kdG0sTlVMTCk7CisgICAgcCA9IChjaGFyICopYnVmOworCisgICAgaWYgKG1nZXRtZXRob2QgPT0gU05EX05MUykgewkvKiBOTFNULi4uICovCisJaWYgKHBhdHRlcm4pIHsKKwkgICAgaWYgKCFja21hdGNoKChjaGFyICopcGF0dGVybixwLChzZXJ2ZXJ0eXBlID09IFNZU19VTklYKSwxKSkKKwkgICAgICBnb3RvIGFnYWluOworCX0KKyAgICB9IGVsc2UgewkJCQkvKiBNTFNELi4uICovCisJcCA9IHBhcnNlZmFjdHMoKGNoYXIgKilidWYpOworCXN3aXRjaCAoaGF2ZXR5cGUpIHsKKwkgIGNhc2UgRlRZUF9GSUxFOgkJLyogRmlsZTogR2V0IGl0IGlmIGl0IG1hdGNoZXMgKi8KKwkgICAgaWYgKHBhdHRlcm4pIHsKKwkJaWYgKCFja21hdGNoKChjaGFyICopcGF0dGVybixwLChzZXJ2ZXJ0eXBlID09IFNZU19VTklYKSwxKSkKKwkJICBnb3RvIGFnYWluOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSBGVFlQX0NESVI6CQkvKiBDdXJyZW50IGRpcmVjdG9yeSAqLworCSAgY2FzZSBGVFlQX1BESVI6CQkvKiBQYXJlbnQgZGlyZWN0b3J5ICovCisJICAgIGdvdG8gYWdhaW47CQkJLyogU2tpcCAqLworCSAgY2FzZSBGVFlQX0RJUjoJCS8qIChTdWIpRGlyZWN0b3J5ICovCisJICAgIGlmICghcmVjdXJzaXZlKQkJLyogSWYgbm90IC9SRUNVUlNJVkUgKi8KKwkgICAgICBnb3RvIGFnYWluOwkJLyogU2tpcCAqLworCSAgICBpZiAobWxzZGVwdGggPCBNTFNERVBUSCkgeworCQljaGFyICogcDIgPSBOVUxMOworCQltbHNkZXB0aCsrOworCQlwcmludGYoIlJFQ1VSU0lORyBbJXNdKCVkKS4uLlxuIixwLG1sc2RlcHRoKTsgCisJCWlmIChkb2Z0cGN3ZChwLDApID4gMCkgeworCQkgICAgaW50IHg7CisJCSAgICBpZiAoIWNrc3RyY2hyKHAsJy8nKSkgeworCQkJLyogem1rZGlyKCkgbmVlZHMgZGlyc2VwICovCisJCQlpZiAoKHAyID0gKGNoYXIgKiltYWxsb2MoKGludClzdHJsZW4ocCkgKyAyKSkpIHsKKwkJCSAgICBzdHJjcHkocDIscCk7CS8qIFNBRkUgKi8KKwkJCSAgICBzdHJjYXQocDIsIi8iKTsJLyogU0FGRSAqLworCQkJICAgIHAgPSBwMjsKKwkJCX0KKwkJICAgIH0KKyNpZmRlZiBOT01LRElSCisJCSAgICB4ID0gLTE7CisjZWxzZQorCQkgICAgeCA9IHpta2RpcihwKTsKKyNlbmRpZiAvKiBOT01LRElSICovCisJCSAgICBpZiAoeCA+IC0xKSB7CisJCQl6Y2hkaXIocCk7CisJCQlwID0gKGNoYXIgKilyZW1vdGVfZmlsZXMoMSxhcmcscGF0dGVybiwwKTsKKwkJCWlmIChwMikgZnJlZShwMik7CisJCSAgICB9IGVsc2UgeworCQkJcHJpbnRmKCI/bWtkaXIgZmFpbGVkOiBbJXNdIERlcHRoPSVkXG4iLAorCQkJICAgICAgIHAsCisJCQkgICAgICAgbWxzZGVwdGgKKwkJCSAgICAgICApOworCQkJbWxzcmVzZXQoKTsKKwkJCWlmIChwMikgZnJlZShwMik7CisJCQlyZXR1cm4oTlVMTCk7CisJCSAgICB9CisJCX0gZWxzZSB7CisJCSAgICBwcmludGYoIj9DV0QgZmFpbGVkOiBbJXNdIERlcHRoPSVkXG4iLHAsbWxzZGVwdGgpOworCQkgICAgbWxzcmVzZXQoKTsKKwkJICAgIHJldHVybihOVUxMKTsKKwkJfQorCSAgICB9IGVsc2UgeworCQlwcmludGYoIk1BWCBESVJFQ1RPUlkgU1RBQ0sgREVQVEggRVhDRUVERUQ6ICVkXG4iLAorCQkgICAgICAgbWxzZGVwdGgKKwkJICAgICAgICk7CisJCW1sc3Jlc2V0KCk7CisJCXJldHVybihOVUxMKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKwlkZWJ1ZyhGMTAxLCJyZW1vdGVfZmlsZXMgaGF2ZXNpemUiLCIiLGhhdmVzaXplKTsKKwlkZWJ1ZyhGMTAxLCJyZW1vdGVfZmlsZXMgaGF2ZXR5cGUiLCIiLGhhdmV0eXBlKTsKKwlkZWJ1ZyhGMTEwLCJyZW1vdGVfZmlsZXMgaGF2ZW1kdG0iLGhhdmVtZHRtLDApOwkKKwlkZWJ1ZyhGMTEwLCJyZW1vdGVfZmlsZXMgbmFtZSIscCwwKTsJCisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgcmV0dXJuKChDSEFSICopcCk7Cit9CisKKy8qIE4gTyBUICBQIE8gUiBUIEEgQiBMIEUgISEhICovCisKKyNpZiAoU0laRU9GX1NIT1JUID09IDQpCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGZ0cF91aW50MzI7Cit0eXBlZGVmIHNob3J0IGZ0cF9pbnQzMjsKKyNlbHNlCisjaWYgKFNJWkVPRl9JTlQgPT0gNCkKK3R5cGVkZWYgdW5zaWduZWQgaW50IGZ0cF91aW50MzI7Cit0eXBlZGVmIGludCBmdHBfaW50MzI7CisjZWxzZQorI2lmIChTSVpFT0ZfTE9ORyA9PSA0KQordHlwZWRlZiBVTE9ORyBmdHBfdWludDMyOwordHlwZWRlZiBsb25nIGZ0cF9pbnQzMjsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyogUGVyaGFwcyB1c2UgdGhlc2UgaW4gZ2VuZXJhbCwgY2VydGFpbmx5IHVzZSB0aGVtIGZvciBHU1NBUEkgKi8KKworI2lmbmRlZiBsb29waW5nX3dyaXRlCisjZGVmaW5lIGZ0cF9pbnQzMiBpbnQKKyNkZWZpbmUgZnRwX3VpbnQzMiB1bnNpZ25lZCBpbnQKK3N0YXRpYyBpbnQKK2xvb3Bpbmdfd3JpdGUoZmQsIGJ1ZiwgbGVuKQorICAgIGludCBmZDsKKyAgICByZWdpc3RlciBDT05TVCBjaGFyICpidWY7CisgICAgaW50IGxlbjsKK3sKKyAgICBpbnQgY2M7CisgICAgcmVnaXN0ZXIgaW50IHdybGVuID0gbGVuOworICAgIGRvIHsKKyAgICAgICAgY2MgPSBzZW5kKGZkLCAoU0VOREFSRzJUWVBFKWJ1Ziwgd3JsZW4sIDApOworICAgICAgICBpZiAoY2MgPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcmV0dXJuKGNjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZiArPSBjYzsKKyAgICAgICAgICAgIHdybGVuIC09IGNjOworICAgICAgICB9CisgICAgfSB3aGlsZSAod3JsZW4gPiAwKTsKKyAgICByZXR1cm4obGVuKTsKK30KKyNlbmRpZgorI2lmbmRlZiBsb29waW5nX3JlYWQKK3N0YXRpYyBpbnQKK2xvb3BpbmdfcmVhZChmZCwgYnVmLCBsZW4pCisgICAgaW50IGZkOworICAgIHJlZ2lzdGVyIGNoYXIgKmJ1ZjsKKyAgICByZWdpc3RlciBpbnQgbGVuOworeworICAgIGludCBjYywgbGVuMiA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIGNjID0gcmVjdihmZCwgKGNoYXIgKilidWYsIGxlbiwwKTsKKyAgICAgICAgaWYgKGNjIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHJldHVybihjYyk7ICAgICAgICAgICAgICAgICAvKiBlcnJubyBpcyBhbHJlYWR5IHNldCAqLworICAgICAgICB9IGVsc2UgaWYgKGNjID09IDApIHsKKyAgICAgICAgICAgIHJldHVybihsZW4yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZiArPSBjYzsKKyAgICAgICAgICAgIGxlbjIgKz0gY2M7CisgICAgICAgICAgICBsZW4gLT0gY2M7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChsZW4gPiAwKTsKKyAgICByZXR1cm4obGVuMik7Cit9CisjZW5kaWYgLyogbG9vcGluZ19yZWFkICovCisKKyNkZWZpbmUgRVJSIC0yCisKKyNpZmRlZiBDT01NRU5UCitzdGF0aWMKK3NlY3VyZV9wdXRieXRlKGZkLCBjKSBpbnQgZmQ7IENIQVIgYzsgeworICAgIGludCByZXQ7CisKKyAgICB1Y2J1Zltub3V0KytdID0gYzsKKyAgICBpZiAobm91dCA9PSAobWF4YnVmID8gbWF4YnVmIDogYWN0dWFsYnVmKSAtIEZVREdFX0ZBQ1RPUikgeworICAgICAgICBub3V0ID0gMDsKKyAgICAgICAgaWYgKCFmdHBpc3NlY3VyZSgpKQorICAgICAgICAgIHJldCA9IHNlbmQoZmQsIChTRU5EQVJHMlRZUEUpdWNidWYsCisgICAgICAgICAgICAgICAgICAgICAobWF4YnVmID8gbWF4YnVmIDogYWN0dWFsYnVmKSAtIEZVREdFX0ZBQ1RPUiwgMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXQgPSBzZWN1cmVfcHV0YnVmKGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4YnVmID8gbWF4YnVmIDogYWN0dWFsYnVmKSAtIEZVREdFX0ZBQ1RPUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuKHJldD9yZXQ6Yyk7CisgICAgfQorICAgIHJldHVybihjKTsKK30KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qIHJldHVybnM6CisgKiAgICAgICAwICBvbiBzdWNjZXNzCisgKiAgICAgIC0xICBvbiBlcnJvciAoZXJybm8gc2V0KQorICogICAgICAtMiAgb24gc2VjdXJpdHkgZXJyb3IKKyAqLworc3RhdGljIGludAorc2VjdXJlX2ZsdXNoKGZkKSBpbnQgZmQ7IHsKKyAgICBpbnQgcmMgPSAwOworICAgIGludCBsZW4gPSAwOworCisgICAgaWYgKG5vdXQgPiAwKSB7CisgICAgICAgIGxlbiA9IG5vdXQ7CisgICAgICAgIGlmICghZnRwaXNzZWN1cmUoKSkgeworICAgICAgICAgICAgcmMgPSBzZW5kKGZkLCAoU0VOREFSRzJUWVBFKXVjYnVmLCBub3V0LCAwKTsKKyAgICAgICAgICAgIG5vdXQgPSAwOworICAgICAgICAgICAgZ290byB4Zmx1c2g7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYyA9IHNlY3VyZV9wdXRidWYoZmQsIHVjYnVmLCBub3V0KTsKKyAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgZ290byB4Zmx1c2g7CisgICAgICAgIH0KKyAgICB9CisgICAgcmMgPSAoIWZ0cGlzc2VjdXJlKCkpID8gMCA6IHNlY3VyZV9wdXRidWYoZmQsIChDSEFSICopIiIsIG5vdXQgPSAwKTsKKworICB4Zmx1c2g6CisgICAgaWYgKHJjID4gLTEgJiYgbGVuID4gMCAmJiBmZGlzcGxhICE9IFhZRkRfQikgeworCXNwYWNrZXRzKys7CisgICAgICAgIHNwa3RsID0gbGVuOworICAgICAgICBmdHNjcmVlbihTQ1JfUFQsJ0QnLHNwYWNrZXRzLE5VTEwpOworICAgIH0KKyAgICByZXR1cm4ocmMpOworfQorCisjaWZkZWYgQ09NTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG5vdCB1c2VkKSAqLworLyogcmV0dXJuczoKKyAqICAgICAgYz49MCAgb24gc3VjY2VzcworICogICAgICAtMSAgICBvbiBlcnJvcgorICogICAgICAtMiAgICBvbiBzZWN1cml0eSBlcnJvcgorICovCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK3NlY3VyZV9wdXRjKGNoYXIgYywgaW50IGZkKQorI2Vsc2UKK3NlY3VyZV9wdXRjKGMsIGZkKSBjaGFyIGM7IGludCBmZDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogc2VjdXJlX3B1dGMgKi8geworICAgIHJldHVybihzZWN1cmVfcHV0Ynl0ZShmZCwgKENIQVIpIGMpKTsKK30KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qIHJldHVybnM6CisgKiAgICAgIG5ieXRlIG9uIHN1Y2Nlc3MKKyAqICAgICAgLTEgIG9uIGVycm9yIChlcnJubyBzZXQpCisgKiAgICAgIC0yICBvbiBzZWN1cml0eSBlcnJvcgorICovCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK3NlY3VyZV93cml0ZShpbnQgZmQsIENIQVIgKiBidWYsIHVuc2lnbmVkIGludCBuYnl0ZSkKKyNlbHNlCitzZWN1cmVfd3JpdGUoZmQsIGJ1ZiwgbmJ5dGUpCisgICAgaW50IGZkOworICAgIENIQVIgKiBidWY7CisgICAgdW5zaWduZWQgaW50IG5ieXRlOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaW50IHJldDsKKworICAgIGlmICghZnRwaXNzZWN1cmUoKSkgeworICAgICAgICBpZiAobm91dCA+IDApIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gc2VuZChmZCwgKFNFTkRBUkcyVFlQRSl1Y2J1Ziwgbm91dCwgMCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHJldCk7CisgICAgICAgICAgICBub3V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc2VuZChmZCwoU0VOREFSRzJUWVBFKWJ1ZixuYnl0ZSwwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHVjYnVmbGVuID0gKG1heGJ1ZiA/IG1heGJ1ZiA6IGFjdHVhbGJ1ZikgLSBGVURHRV9GQUNUT1I7CisgICAgICAgIGludCBic2VudCA9IDA7CisKKyAgICAgICAgd2hpbGUgKGJzZW50IDwgbmJ5dGUpIHsKKyAgICAgICAgICAgIGludCBiMmNwID0gKChuYnl0ZSAtIGJzZW50KSA+ICh1Y2J1ZmxlbiAtIG5vdXQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICh1Y2J1ZmxlbiAtIG5vdXQpIDogKG5ieXRlIC0gYnNlbnQpKTsKKyNpZmRlZiBERUJVRworCSAgICBpZiAoZGVibG9nKSB7CisJCWRlYnVnKEYxMDEsInNlY3VyZV93cml0ZSB1Y2J1ZmxlbiIsIiIsdWNidWZsZW4pOworCQlkZWJ1ZyhGMTAxLCJzZWN1cmVfd3JpdGUgdWNidWZzaXoiLCIiLHVjYnVmc2l6KTsKKwkJZGVidWcoRjEwMSwic2VjdXJlX3dyaXRlIGJzZW50IiwiIixic2VudCk7CisJCWRlYnVnKEYxMDEsInNlY3VyZV93cml0ZSBiMmNwIiwiIixiMmNwKTsKKwkgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICBtZW1jcHkoJnVjYnVmW25vdXRdLCZidWZbYnNlbnRdLGIyY3ApOworICAgICAgICAgICAgbm91dCArPSBiMmNwOworICAgICAgICAgICAgYnNlbnQgKz0gYjJjcDsKKworICAgICAgICAgICAgaWYgKG5vdXQgPT0gdWNidWZsZW4pIHsKKyAgICAgICAgICAgICAgICBub3V0ID0gMDsKKyAgICAgICAgICAgICAgICByZXQgPSBzZWN1cmVfcHV0YnVmKGZkLCB1Y2J1ZiwgdWNidWZsZW4pOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHJldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKGJzZW50KTsKKyAgICB9Cit9CisKKy8qIHJldHVybnM6CisgKiAgICAgICAwICBvbiBzdWNjZXNzCisgKiAgICAgIC0xICBvbiBlcnJvciAoZXJybm8gc2V0KQorICogICAgICAtMiAgb24gc2VjdXJpdHkgZXJyb3IKKyAqLworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCitzZWN1cmVfcHV0YnVmKGludCBmZCwgQ0hBUiAqIGJ1ZiwgdW5zaWduZWQgaW50IG5ieXRlKQorI2Vsc2UKK3NlY3VyZV9wdXRidWYoZmQsIGJ1ZiwgbmJ5dGUpIGludCBmZDsgQ0hBUiAqIGJ1ZjsgdW5zaWduZWQgaW50IG5ieXRlOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgc3RhdGljIGNoYXIgKm91dGJ1ZiA9IE5VTEw7ICAgICAgICAgLyogb3V0cHV0IGNpcGhlcnRleHQgKi8KKyNpZmRlZiBGVFBfU0VDVVJJVFkKKyAgICBzdGF0aWMgdW5zaWduZWQgaW50IGJ1ZnNpemUgPSAwOyAgICAvKiBzaXplIG9mIG91dGJ1ZiAqLworI2VuZGlmIC8qIEZUUF9TRUNVUklUWSAqLworICAgIGZ0cF9pbnQzMiBsZW5ndGggICA9IDA7CisgICAgZnRwX3VpbnQzMiBuZXRfbGVuID0gMDsKKworICAgIC8qIE90aGVyIGF1dGggdHlwZXMgZ28gaGVyZSAuLi4gKi8KKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoc3NsX2Z0cF9kYXRhX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgIGludCBjb3VudCwgZXJyb3I7CisKKyAgICAgICAgLyogdGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kIGFuIGVtcHR5IGJ1ZmZlciB3aGVuIHVzaW5nIFNTTC9UTFMgKi8KKyAgICAgICAgaWYgKCBuYnl0ZSA9PSAwICkKKwkgIHJldHVybigwKTsKKworICAgICAgICBjb3VudCA9IFNTTF93cml0ZShzc2xfZnRwX2RhdGFfY29uLCBidWYsIG5ieXRlKTsKKyAgICAgICAgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF9mdHBfZGF0YV9jb24sY291bnQpOworICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfTk9ORToKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorI2lmZGVmIE5UCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGdsZSA9IEdldExhc3RFcnJvcigpOworCQlpZiAoZ2xlID09IDApCisJCSAgcmV0dXJuKDApOworCQlkZWJ1ZyhGMTExLCJzZWN1cmVfcHV0YnVmIiwiU1NMX0VSUk9SX1NZU0NBTEwiLGdsZSk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQOgorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NTTDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgU1NMX3NodXRkb3duKHNzbF9mdHBfZGF0YV9jb24pOworICAgICAgICAgICAgU1NMX2ZyZWUoc3NsX2Z0cF9kYXRhX2Nvbik7CisgICAgICAgICAgICBzc2xfZnRwX2RhdGFfYWN0aXZlX2ZsYWcgPSAwOworICAgICAgICAgICAgc3NsX2Z0cF9kYXRhX2NvbiA9IE5VTEw7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICAgIHNvY2tldF9jbG9zZShkYXRhKTsKKyNlbHNlIC8qIFRDUElQTElCICovCisjaWZkZWYgVVNFX1NIVVRET1dOCisgICAgICAgICAgICBzaHV0ZG93bihkYXRhLCAxKzEpOworI2VuZGlmIC8qIFVTRV9TSFVURE9XTiAqLworICAgICAgICAgICAgY2xvc2UoZGF0YSk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgIGRhdGEgPSAtMTsKKyAgICAgICAgICAgIGdsb2JhbGRpbiA9IGRhdGE7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisjaWZkZWYgRlRQX1NSUAorICAgIGlmIChja19zcnBfaXNfaW5zdGFsbGVkKCkgJiYgKHN0cmNtcChhdXRoX3R5cGUsICJTUlAiKSA9PSAwKSkgeworICAgICAgICBpZiAoYnVmc2l6ZSA8IG5ieXRlICsgRlVER0VfRkFDVE9SKSB7CisgICAgICAgICAgICBpZiAob3V0YnVmPworICAgICAgICAgICAgICAgIChvdXRidWYgPSByZWFsbG9jKG91dGJ1ZiwgKHVuc2lnbmVkKSAobmJ5dGUgKyBGVURHRV9GQUNUT1IpKSk6CisgICAgICAgICAgICAgICAgKG91dGJ1ZiA9IG1hbGxvYygodW5zaWduZWQpIChuYnl0ZSArIEZVREdFX0ZBQ1RPUikpKSkgeworICAgICAgICAgICAgICAgIGJ1ZnNpemUgPSBuYnl0ZSArIEZVREdFX0ZBQ1RPUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgc2VjdXJlX2Vycm9yKCIlcyAoaW4gbWFsbG9jIG9mIFBST1QgYnVmZmVyKSIsIGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oRVJSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGxlbmd0aCA9CisgICAgICAgICAgICAgc3JwX2VuY29kZShmdHBfZHBsID09IEZQTF9QUlYsCisgICAgICAgICAgICAgICAgICAgICAgICAoQ0hBUiAqKSBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAoQ0hBUiAqKSBvdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBuYnl0ZQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICkgPCAwKSB7CisgICAgICAgICAgICBzZWN1cmVfZXJyb3IgKCJzcnBfZW5jb2RlIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIEVSUjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBGVFBfU1JQICovCisjaWZkZWYgRlRQX0tSQjQKKyAgICBpZiAoY2tfa3JiNF9pc19pbnN0YWxsZWQoKSAmJiAoc3RyY21wKGF1dGhfdHlwZSwgIktFUkJFUk9TX1Y0IikgPT0gMCkpIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIG15YWRkciwgaGlzYWRkcjsKKyAgICAgICAgR1NPQ0tOQU1FX1QgbGVuOworICAgICAgICBsZW4gPSBzaXplb2YobXlhZGRyKTsKKyAgICAgICAgaWYgKGdldHNvY2tuYW1lKGZkLCAoc3RydWN0IHNvY2thZGRyKikmbXlhZGRyLCAmbGVuKSA8IDApIHsKKyAgICAgICAgICAgIHNlY3VyZV9lcnJvcigic2VjdXJlX3B1dGJ1ZjogZ2V0c29ja25hbWUgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4oRVJSKTsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSBzaXplb2YoaGlzYWRkcik7CisgICAgICAgIGlmIChnZXRwZWVybmFtZShmZCwgKHN0cnVjdCBzb2NrYWRkciopJmhpc2FkZHIsICZsZW4pIDwgMCkgeworICAgICAgICAgICAgc2VjdXJlX2Vycm9yKCJzZWN1cmVfcHV0YnVmOiBnZXRwZWVybmFtZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybihFUlIpOworICAgICAgICB9CisgICAgICAgIGlmIChidWZzaXplIDwgbmJ5dGUgKyBGVURHRV9GQUNUT1IpIHsKKyAgICAgICAgICAgIGlmIChvdXRidWYgPworICAgICAgICAgICAgICAgIChvdXRidWYgPSByZWFsbG9jKG91dGJ1ZiwgKHVuc2lnbmVkKSAobmJ5dGUgKyBGVURHRV9GQUNUT1IpKSk6CisgICAgICAgICAgICAgICAgIChvdXRidWYgPSBtYWxsb2MoKHVuc2lnbmVkKSAobmJ5dGUgKyBGVURHRV9GQUNUT1IpKSkpIHsKKyAgICAgICAgICAgICAgICBidWZzaXplID0gbmJ5dGUgKyBGVURHRV9GQUNUT1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZnNpemUgPSAwOworICAgICAgICAgICAgICAgIHNlY3VyZV9lcnJvcigiJXMgKGluIG1hbGxvYyBvZiBQUk9UIGJ1ZmZlcikiLCBja19lcnJzdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuKEVSUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZ0cF9kcGwgPT0gRlBMX1BSVikgeworICAgICAgICAgICAgbGVuZ3RoID0ga3JiX21rX3ByaXYoYnVmLCAoQ0hBUiAqKSBvdXRidWYsIG5ieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwX3NjaGVkLAorI2lmZGVmIEtSQjUyNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwX2NyZWQuc2Vzc2lvbiwKKyNlbHNlIC8qIEtSQjUyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ0cF9jcmVkLnNlc3Npb24sCisjZW5kaWYgLyogS1JCNTI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXlhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpc2FkZHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZW5ndGggPSBrcmJfbWtfc2FmZShidWYsIChDSEFSICopIG91dGJ1ZiwgbmJ5dGUsCisjaWZkZWYgS1JCNTI0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfY3JlZC5zZXNzaW9uLAorI2Vsc2UgLyogS1JCNTI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnRwX2NyZWQuc2Vzc2lvbiwKKyNlbmRpZiAvKiBLUkI1MjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZteWFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlzYWRkcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuZ3RoID09IC0xKSB7CisgICAgICAgICAgICBzZWN1cmVfZXJyb3IoImtyYl9ta18lcyBmYWlsZWQgZm9yIEtFUkJFUk9TX1Y0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfZHBsID09IEZQTF9QUlYgPyAicHJpdiIgOiAic2FmZSIpOworICAgICAgICAgICAgcmV0dXJuKEVSUik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogRlRQX0tSQjQgKi8KKyNpZmRlZiBGVFBfR1NTQVBJCisgICAgaWYgKGNrX2dzc2FwaV9pc19pbnN0YWxsZWQoKSAmJiAoc3RyY21wKGF1dGhfdHlwZSwgIkdTU0FQSSIpID09IDApKSB7CisgICAgICAgIGdzc19idWZmZXJfZGVzYyBpbl9idWYsIG91dF9idWY7CisgICAgICAgIE9NX3VpbnQzMiBtYWpfc3RhdCwgbWluX3N0YXQ7CisgICAgICAgIGludCBjb25mX3N0YXRlOworCisgICAgICAgIGluX2J1Zi52YWx1ZSA9IGJ1ZjsKKyAgICAgICAgaW5fYnVmLmxlbmd0aCA9IG5ieXRlOworICAgICAgICBtYWpfc3RhdCA9IGdzc19zZWFsKCZtaW5fc3RhdCwgZ2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ0cF9kcGwgPT0gRlBMX1BSViksIC8qIGNvbmZpZGVudGlhbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTU19DX1FPUF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dF9idWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBpZiAobWFqX3N0YXQgIT0gR1NTX1NfQ09NUExFVEUpIHsKKyAgICAgICAgICAgIC8qIGdlbmVyYWxseSBuZWVkIHRvIGRlYWwgKi8KKyAgICAgICAgICAgIC8qIGllLiBzaG91bGQgbG9vcCwgYnV0IGZvciBub3cganVzdCBmYWlsICovCisgICAgICAgICAgICB1c2VyX2dzc19lcnJvcihtYWpfc3RhdCwgbWluX3N0YXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfZHBsID09IEZQTF9QUlY/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1NTQVBJIHNlYWwgZmFpbGVkIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJHU1NBUEkgc2lnbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybihFUlIpOworICAgICAgICB9CisgICAgICAgIGlmIChidWZzaXplIDwgb3V0X2J1Zi5sZW5ndGgpIHsKKyAgICAgICAgICAgIGlmIChvdXRidWYgPworICAgICAgICAgICAgICAgIChvdXRidWYgPSByZWFsbG9jKG91dGJ1ZiwgKHVuc2lnbmVkKSBvdXRfYnVmLmxlbmd0aCkpOgorICAgICAgICAgICAgICAgIChvdXRidWYgPSBtYWxsb2MoKHVuc2lnbmVkKSBvdXRfYnVmLmxlbmd0aCkpKSB7CisgICAgICAgICAgICAgICAgYnVmc2l6ZSA9IG91dF9idWYubGVuZ3RoOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZzaXplID0gMDsKKyAgICAgICAgICAgICAgICBzZWN1cmVfZXJyb3IoIiVzIChpbiBtYWxsb2Mgb2YgUFJPVCBidWZmZXIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tfZXJyc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybihFUlIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1lbWNweShvdXRidWYsIG91dF9idWYudmFsdWUsIGxlbmd0aD1vdXRfYnVmLmxlbmd0aCk7CisgICAgICAgIGdzc19yZWxlYXNlX2J1ZmZlcigmbWluX3N0YXQsICZvdXRfYnVmKTsKKyAgICB9CisjZW5kaWYgLyogRlRQX0dTU0FQSSAqLworICAgIG5ldF9sZW4gPSBodG9ubCgoVUxPTkcpIGxlbmd0aCk7CisgICAgaWYgKGxvb3Bpbmdfd3JpdGUoZmQsIChjaGFyICopJm5ldF9sZW4sIDQpID09IC0xKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAobG9vcGluZ193cml0ZShmZCwgb3V0YnVmLCBsZW5ndGgpICE9IGxlbmd0aCkKKyAgICAgIHJldHVybigtMSk7CisgICAgcmV0dXJuKDApOworfQorCisvKiBmYyA9IDAgbWVhbnMgdG8gZ2V0IGEgYnl0ZTsgbm9uemVybyBtZWFucyB0byBpbml0aWFsaXplIGJ1ZmZlciBwb2ludGVycyAqLworCitzdGF0aWMgaW50CitzZWN1cmVfZ2V0Ynl0ZShmZCxmYykgaW50IGZkLGZjOyB7CisgICAgLyogbnVtYmVyIG9mIGNoYXJzIGluIHVjYnVmLCBwb2ludGVyIGludG8gdWNidWYgKi8KKyAgICBzdGF0aWMgdW5zaWduZWQgaW50IG5pbiA9IDAsIGJ1ZnAgPSAwOworICAgIGludCBrZXJyb3I7CisgICAgZnRwX3VpbnQzMiBsZW5ndGg7CisKKyAgICBpZiAoZmMpIHsKKwluaW4gPSBidWZwID0gMDsKKwl1Y2J1ZlswXSA9IE5VTDsKKwlyZXR1cm4oMCk7CisgICAgfQorICAgIGlmIChuaW4gPT0gMCkgeworICAgICAgICBpZiAoaXNjYW5jZWxlZCgpKQorICAgICAgICAgIHJldHVybigtOSk7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgIGlmIChzc2xfZnRwX2RhdGFfYWN0aXZlX2ZsYWcpIHsKKyAgICAgICAgICAgIGludCBjb3VudCwgZXJyb3I7CisgICAgICAgICAgICBjb3VudCA9IFNTTF9yZWFkKHNzbF9mdHBfZGF0YV9jb24sIHVjYnVmLCB1Y2J1ZnNpeik7CisgICAgICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsX2Z0cF9kYXRhX2Nvbixjb3VudCk7CisgICAgICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX05PTkU6CisgICAgICAgICAgICAgICAgbmluID0gYnVmcCA9IGNvdW50OworICAgICAgICAgICAgICAgIHJwYWNrZXRzKys7CisgICAgICAgICAgICAgICAgcGt0bnVtKys7CisgICAgICAgICAgICAgICAgaWYgKGZkaXNwbGEgIT0gWFlGRF9CKSB7CisgICAgICAgICAgICAgICAgICAgIHJwa3RsID0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGZ0c2NyZWVuKFNDUl9QVCwnRCcscnBhY2tldHMsTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisjaWZkZWYgTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBnbGUgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUDoKKyAgICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1NMOgorICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBuaW4gPSBidWZwID0gY291bnQgPSAwOworICAgICAgICAgICAgICAgIFNTTF9zaHV0ZG93bihzc2xfZnRwX2RhdGFfY29uKTsKKyAgICAgICAgICAgICAgICBTU0xfZnJlZShzc2xfZnRwX2RhdGFfY29uKTsKKyAgICAgICAgICAgICAgICBzc2xfZnRwX2RhdGFfYWN0aXZlX2ZsYWcgPSAwOworICAgICAgICAgICAgICAgIHNzbF9mdHBfZGF0YV9jb24gPSBOVUxMOworI2lmZGVmIFRDUElQTElCCisgICAgICAgICAgICAgICAgc29ja2V0X2Nsb3NlKGRhdGEpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyNpZmRlZiBVU0VfU0hVVERPV04KKyAgICAgICAgICAgICAgICBzaHV0ZG93bihkYXRhLCAxKzEpOworI2VuZGlmIC8qIFVTRV9TSFVURE9XTiAqLworICAgICAgICAgICAgICAgIGNsb3NlKGRhdGEpOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgICAgICAgICAgZGF0YSA9IC0xOworICAgICAgICAgICAgICAgIGdsb2JhbGRpbiA9IGRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgICAga2Vycm9yID0gbG9vcGluZ19yZWFkKGZkLCAoY2hhciAqKSZsZW5ndGgsIHNpemVvZihsZW5ndGgpKTsKKyAgICAgICAgICAgICAgaWYgKGtlcnJvciAhPSBzaXplb2YobGVuZ3RoKSkgeworICAgICAgICAgICAgICAgICAgc2VjdXJlX2Vycm9yKCJDb3VsZG4ndCByZWFkIFBST1QgYnVmZmVyIGxlbmd0aDogJWQvJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJyb3IgPT0gLTEgPyBja19lcnJzdHIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInByZW1hdHVyZSBFT0YiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybihFUlIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGRlYnVnKEYxMDEsInNlY3VyZV9nZXRieXRlIGxlbmd0aCIsIiIsbGVuZ3RoKTsKKyAgICAgICAgICAgICAgZGVidWcoRjEwMSwic2VjdXJlX2dldGJ5dGUgbnRvaGwobGVuZ3RoKSIsIiIsbnRvaGwobGVuZ3RoKSk7CisKKyAgICAgICAgICAgICAgbGVuZ3RoID0gKFVMT05HKSBudG9obChsZW5ndGgpOworICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gbWF4YnVmKSB7CisgICAgICAgICAgICAgICAgICBzZWN1cmVfZXJyb3IoIkxlbmd0aCAoJWQpIG9mIFBST1QgYnVmZmVyID4gUEJTWj0ldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGJ1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICByZXR1cm4oRVJSKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoKGtlcnJvciA9IGxvb3BpbmdfcmVhZChmZCwgdWNidWYsIGxlbmd0aCkpICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgc2VjdXJlX2Vycm9yKCJDb3VsZG4ndCByZWFkICV1IGJ5dGUgUFJPVCBidWZmZXI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2Vycm9yID09IC0xID8gY2tfZXJyc3RyKCkgOiAicHJlbWF0dXJlIEVPRiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgcmV0dXJuKEVSUik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBPdGhlciBhdXRoIHR5cGVzIGdvIGhlcmUgLi4uICovCisjaWZkZWYgRlRQX1NSUAorICAgICAgICAgICAgICBpZiAoc3RyY21wKGF1dGhfdHlwZSwgIlNSUCIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgIGlmICgobmluID0gYnVmcCA9IHNycF9kZWNvZGUgKGZ0cF9kcGwgPT0gRlBMX1BSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDSEFSICopIHVjYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZV9lcnJvciAoInNycF9lbmNvZGUgZmFpbGVkIiApOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBGVFBfU1JQICovCisjaWZkZWYgRlRQX0tSQjQKKyAgICAgICAgICAgICAgaWYgKHN0cmNtcChhdXRoX3R5cGUsICJLRVJCRVJPU19WNCIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBteWFkZHIsIGhpc2FkZHI7CisgICAgICAgICAgICAgICAgICBHU09DS05BTUVfVCBsZW47CisgICAgICAgICAgICAgICAgICBsZW4gPSBzaXplb2YobXlhZGRyKTsKKyAgICAgICAgICAgICAgICAgIGlmIChnZXRzb2NrbmFtZShmZCwgKHN0cnVjdCBzb2NrYWRkciopJm15YWRkciwgJmxlbikgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlX2Vycm9yKCJzZWN1cmVfcHV0YnVmOiBnZXRzb2NrbmFtZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oRVJSKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGxlbiA9IHNpemVvZihoaXNhZGRyKTsKKyAgICAgICAgICAgICAgICAgIGlmIChnZXRwZWVybmFtZShmZCwgKHN0cnVjdCBzb2NrYWRkciopJmhpc2FkZHIsICZsZW4pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZV9lcnJvcigic2VjdXJlX3B1dGJ1ZjogZ2V0cGVlcm5hbWUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEVSUik7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBpZiAoZnRwX2RwbCkgeworICAgICAgICAgICAgICAgICAgICAgIGtlcnJvciA9IGtyYl9yZF9wcml2KHVjYnVmLCBsZW5ndGgsIGZ0cF9zY2hlZCwKKyNpZmRlZiBLUkI1MjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfY3JlZC5zZXNzaW9uLAorI2Vsc2UgLyogS1JCNTI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ0cF9jcmVkLnNlc3Npb24sCisjZW5kaWYgLyogS1JCNTI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpc2FkZHIsICZteWFkZHIsICZmdHBfbXNnX2RhdGEpOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBrZXJyb3IgPSBrcmJfcmRfc2FmZSh1Y2J1ZiwgbGVuZ3RoLAorI2lmZGVmIEtSQjUyNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cF9jcmVkLnNlc3Npb24sCisjZWxzZSAvKiBLUkI1MjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnRwX2NyZWQuc2Vzc2lvbiwKKyNlbmRpZiAvKiBLUkI1MjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlzYWRkciwgJm15YWRkciwgJmZ0cF9tc2dfZGF0YSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBpZiAoa2Vycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlX2Vycm9yKCJrcmJfcmRfJXMgZmFpbGVkIGZvciBLRVJCRVJPU19WNCAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwX2RwbCA9PSBGUExfUFJWID8gInByaXYiIDogInNhZmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmJfZ2V0X2Vycl90ZXh0KGtlcnJvcikpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybihFUlIpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgbWVtY3B5KHVjYnVmLGZ0cF9tc2dfZGF0YS5hcHBfZGF0YSxmdHBfbXNnX2RhdGEuYXBwX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICBuaW4gPSBidWZwID0gZnRwX21zZ19kYXRhLmFwcF9sZW5ndGg7CisgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBGVFBfS1JCNCAqLworI2lmZGVmIEZUUF9HU1NBUEkKKyAgICAgICAgICAgICAgaWYgKHN0cmNtcChhdXRoX3R5cGUsICJHU1NBUEkiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBnc3NfYnVmZmVyX2Rlc2MgeG1pdF9idWYsIG1zZ19idWY7CisgICAgICAgICAgICAgICAgICBPTV91aW50MzIgbWFqX3N0YXQsIG1pbl9zdGF0OworICAgICAgICAgICAgICAgICAgaW50IGNvbmZfc3RhdGU7CisKKyAgICAgICAgICAgICAgICAgIHhtaXRfYnVmLnZhbHVlID0gdWNidWY7CisgICAgICAgICAgICAgICAgICB4bWl0X2J1Zi5sZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICBjb25mX3N0YXRlID0gKGZ0cF9kcGwgPT0gRlBMX1BSVik7CisgICAgICAgICAgICAgICAgICAvKiBkZWNyeXB0L3ZlcmlmeSB0aGUgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgICAgbWFqX3N0YXQgPSBnc3NfdW5zZWFsKCZtaW5fc3RhdCwgZ2NvbnRleHQsICZ4bWl0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnX2J1ZiwgJmNvbmZfc3RhdGUsIE5VTEwpOworICAgICAgICAgICAgICAgICAgaWYgKG1hal9zdGF0ICE9IEdTU19TX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgdXNlcl9nc3NfZXJyb3IobWFqX3N0YXQsIG1pbl9zdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdHBfZHBsID09IEZQTF9QUlYpPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdW5zZWFsaW5nIEVOQyBtZXNzYWdlIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHVuc2VhbGluZyBNSUMgbWVzc2FnZSIpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBtZW1jcHkodWNidWYsIG1zZ19idWYudmFsdWUsIG5pbiA9IGJ1ZnAgPSBtc2dfYnVmLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICBnc3NfcmVsZWFzZV9idWZmZXIoJm1pbl9zdGF0LCAmbXNnX2J1Zik7CisgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBGVFBfR1NTQVBJICovCisgICAgICAgICAgICAgIC8qIE90aGVyIGF1dGggdHlwZXMgZ28gaGVyZSAuLi4gKi8KKworICAgICAgICAgICAgICAvKiBVcGRhdGUgZmlsZSB0cmFuc2ZlciBkaXNwbGF5ICovCisgICAgICAgICAgICAgIHJwYWNrZXRzKys7CisgICAgICAgICAgICAgIHBrdG51bSsrOworICAgICAgICAgICAgICBpZiAoZmRpc3BsYSAhPSBYWUZEX0IpIHsKKyAgICAgICAgICAgICAgICAgIHJwa3RsID0gbmluOworICAgICAgICAgICAgICAgICAgZnRzY3JlZW4oU0NSX1BULCdEJyxycGFja2V0cyxOVUxMKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5pbiA9PSAwKQorICAgICAgcmV0dXJuKEVPRik7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVjYnVmW2J1ZnAgLSBuaW4tLV0pOworfQorCisvKiBzZWN1cmVfZ2V0YyhmZCxmYykKKyAqIENhbGwgd2l0aDoKKyAqICAgZmQgPSBmaWxlIGRlc2NyaXB0b3IgZm9yIGNvbm5lY3Rpb24uCisgKiAgIGZjID0gMCB0byBnZXQgYSBjaGFyYWN0ZXIsIGZjICE9IDAgdG8gaW5pdGlhbGl6ZSBidWZmZXIgcG9pbnRlcnMuCisgKiBSZXR1cm5zOgorICogICBjPj0wIG9uIHN1Y2Nlc3MgKGNoYXJhY3RlciB2YWx1ZSkKKyAqICAgLTEgICBvbiBFT0YKKyAqICAgLTIgICBvbiBzZWN1cml0eSBlcnJvcgorICovCitzdGF0aWMgaW50CitzZWN1cmVfZ2V0YyhmZCxmYykgaW50IGZkLGZjOyB7CQkvKiBmaWxlIGRlc2NyaXB0b3IsIGZ1bmN0aW9uIGNvZGUgKi8KKyAgICBpZiAoIWZ0cGlzc2VjdXJlKCkpIHsKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGludCBuaW4gPSAwLCBidWZwID0gMDsKKwlpZiAoZmMpIHsKKwkgICAgbmluID0gYnVmcCA9IDA7CisJICAgIHVjYnVmWzBdID0gTlVMOworCSAgICByZXR1cm4oMCk7CisJfQorICAgICAgICBpZiAobmluID09IDApIHsKKyAgICAgICAgICAgIGlmIChpc2NhbmNlbGVkKCkpCisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICBuaW4gPSBidWZwID0gcmVjdihmZCwoY2hhciAqKXVjYnVmLGFjdHVhbGJ1ZiwwKTsKKyAgICAgICAgICAgIGlmIChuaW4gPD0gMCkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInNlY3VyZV9nZXRjIHJlY3YgZXJybm8iLGNraXRvYShuaW4pLGVycm5vKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJzZWN1cmVfZ2V0YyByZXR1cm5zIEVPRiIsIiIsRU9GKTsKKyAgICAgICAgICAgICAgICBuaW4gPSBidWZwID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4oRU9GKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBzZWN1cmVfZ2V0YyByZWN2IiwiIixuaW4pOworICAgICAgICAgICAgaGV4ZHVtcCgiZnRwIHNlY3VyZV9nZXRjIHJlY3YiLHVjYnVmLDE2KTsKKyAgICAgICAgICAgIHJwYWNrZXRzKys7CisgICAgICAgICAgICBwa3RudW0rKzsKKyAgICAgICAgICAgIGlmIChmZGlzcGxhICE9IFhZRkRfQikgeworICAgICAgICAgICAgICAgIHJwa3RsID0gbmluOworICAgICAgICAgICAgICAgIGZ0c2NyZWVuKFNDUl9QVCwnRCcscnBhY2tldHMsTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHVjYnVmW2J1ZnAgLSBuaW4tLV0pOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuKHNlY3VyZV9nZXRieXRlKGZkLGZjKSk7Cit9CisKKy8qIHJldHVybnM6CisgKiAgICAgbj4wICBvbiBzdWNjZXNzIChuID09ICMgb2YgYnl0ZXMgcmVhZCkKKyAqICAgICAgIDAgIG9uIEVPRgorICogICAgICAtMSAgb24gZXJyb3IgKGVycm5vIHNldCksIG9ubHkgZm9yIEZQTF9DTFIKKyAqICAgICAgLTIgIG9uIHNlY3VyaXR5IGVycm9yCisgKi8KK3N0YXRpYyBpbnQKK3NlY3VyZV9yZWFkKGZkLCBidWYsIG5ieXRlKSBpbnQgZmQ7IGNoYXIgKmJ1ZjsgaW50IG5ieXRlOyB7CisgICAgc3RhdGljIGludCBjID0gMDsKKyAgICBpbnQgaTsKKworICAgIGRlYnVnKEYxMDEsInNlY3VyZV9yZWFkIGJ5dGVzIHJlcXVlc3RlZCIsIiIsbmJ5dGUpOworICAgIGlmIChjID09IEVPRikKKyAgICAgIHJldHVybihjID0gMCk7CisgICAgZm9yIChpID0gMDsgbmJ5dGUgPiAwOyBuYnl0ZS0tKSB7CisgICAgICAgIGMgPSBzZWN1cmVfZ2V0YyhmZCwwKTsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgY2FzZSAtOTogICAgICAgICAgICAgICAgICAgICAgLyogQ2FuY2VsZWQgZnJvbSBrZXlib2FyZCAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwiZnRwIHNlY3VyZV9yZWFkIGludGVycnVwdGVkIiwiIixjKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICBjYXNlIEVSUjoKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImZ0cCBzZWN1cmVfcmVhZCBlcnJvciIsIiIsYyk7CisgICAgICAgICAgICByZXR1cm4oYyk7CisgICAgICAgICAgY2FzZSBFT0Y6CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJmdHAgc2VjdXJlX3JlYWQgRU9GIiwiIixjKTsKKyAgICAgICAgICAgIGlmICghaSkKKyAgICAgICAgICAgICAgYyA9IDA7CisgICAgICAgICAgICByZXR1cm4oaSk7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJ1ZltpKytdID0gYzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oaSk7Cit9CisKKyNpZmRlZiBVU0VfUlVTRVJQQVNTCisvKiBCRUdJTl9SVVNFUlBBU1MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAgICAgIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylydXNlcnBhc3MuYyA1LjMgKEJlcmtlbGV5KSAzLzEvOTEiOworI2VuZGlmIC8qIG5vdCBsaW50ICovCisKKyNpZm5kZWYgTUFYSE9TVE5BTUVMRU4KKyNkZWZpbmUgTUFYSE9TVE5BTUVMRU4gNjQKKyNlbmRpZgorCitjaGFyICogcmVudmxvb2soKTsKK3N0YXRpYyBGSUxFICogY2ZpbGU7CisKKyNkZWZpbmUgREVGQVVMVCAxCisjZGVmaW5lIExPR0lOICAgMgorI2RlZmluZSBQQVNTV0QgIDMKKyNkZWZpbmUgQUNDT1VOVCA0CisjZGVmaW5lIE1BQ0RFRiAgNQorI2RlZmluZSBJRCAgICAgIDEwCisjZGVmaW5lIE1BQ0ggICAgMTEKKworc3RhdGljIGNoYXIgdG9rdmFsWzEwMF07CisKK3N0YXRpYyBzdHJ1Y3QgdG9rdGFiIHsKKyAgICBjaGFyICp0b2tzdHI7CisgICAgaW50IHR2YWw7Cit9IHRva3RhYltdPSB7CisgICAgImRlZmF1bHQiLCAgREVGQVVMVCwKKyAgICAibG9naW4iLCAgICBMT0dJTiwKKyAgICAicGFzc3dvcmQiLCBQQVNTV0QsCisgICAgInBhc3N3ZCIsICAgUEFTU1dELAorICAgICJhY2NvdW50IiwgIEFDQ09VTlQsCisgICAgIm1hY2hpbmUiLCAgTUFDSCwKKyAgICAibWFjZGVmIiwgICBNQUNERUYsCisgICAgMCwgICAgICAgICAgMAorfTsKKworc3RhdGljIGludAordG9rZW4oKSB7CisgICAgY2hhciAqY3A7CisgICAgaW50IGM7CisgICAgc3RydWN0IHRva3RhYiAqdDsKKworICAgIGlmIChmZW9mKGNmaWxlKSkKKyAgICAgIHJldHVybigwKTsKKyAgICB3aGlsZSAoKGMgPSBnZXRjKGNmaWxlKSkgIT0gRU9GICYmCisgICAgICAgICAgIChjID09ICdcbicgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJyAnIHx8IGMgPT0gJywnKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChjID09IEVPRikKKyAgICAgIHJldHVybigwKTsKKyAgICBjcCA9IHRva3ZhbDsKKyAgICBpZiAoYyA9PSAnIicpIHsKKyAgICAgICAgd2hpbGUgKChjID0gZ2V0YyhjZmlsZSkpICE9IEVPRiAmJiBjICE9ICciJykgeworICAgICAgICAgICAgaWYgKGMgPT0gJ1xcJykKKyAgICAgICAgICAgICAgYyA9IGdldGMoY2ZpbGUpOworICAgICAgICAgICAgKmNwKysgPSBjOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmNwKysgPSBjOworICAgICAgICB3aGlsZSAoKGMgPSBnZXRjKGNmaWxlKSkgIT0gRU9GCisgICAgICAgICAgICAgICAmJiBjICE9ICdcbicgJiYgYyAhPSAnXHQnICYmIGMgIT0gJyAnICYmIGMgIT0gJywnKSB7CisgICAgICAgICAgICBpZiAoYyA9PSAnXFwnKQorICAgICAgICAgICAgICBjID0gZ2V0YyhjZmlsZSk7CisgICAgICAgICAgICAqY3ArKyA9IGM7CisgICAgICAgIH0KKyAgICB9CisgICAgKmNwID0gMDsKKyAgICBpZiAodG9rdmFsWzBdID09IDApCisgICAgICByZXR1cm4oMCk7CisgICAgZm9yICh0ID0gdG9rdGFiOyB0LT50b2tzdHI7IHQrKykKKyAgICAgIGlmICghc3RyY21wKHQtPnRva3N0ciwgdG9rdmFsKSkKKyAgICAgICAgcmV0dXJuKHQtPnR2YWwpOworICAgIHJldHVybihJRCk7Cit9CisKK3J1c2VycGFzcyhob3N0LCBhbmFtZSwgYXBhc3MsIGFhY2N0KQorICAgIGNoYXIgKmhvc3QsICoqYW5hbWUsICoqYXBhc3MsICoqYWFjY3Q7Cit7CisgICAgY2hhciAqaGRpciwgYnVmW0ZUUF9CVUZTSVpdLCAqdG1wOworICAgIGNoYXIgbXluYW1lW01BWEhPU1ROQU1FTEVOXSwgKm15ZG9tYWluOworICAgIGludCB0LCBpLCBjLCB1c2VkZWZhdWx0ID0gMDsKKyNpZmRlZiBOVAorICAgIHN0cnVjdCBfc3RhdCBzdGI7CisjZWxzZSAvKiBOVCAqLworICAgIHN0cnVjdCBzdGF0IHN0YjsKKyNlbmRpZiAvKiBOVCAqLworCisgICAgaGRpciA9IGdldGVudigiSE9NRSIpOworICAgIGlmIChoZGlyID09IE5VTEwpCisgICAgICAgIGhkaXIgPSAiLiI7CisgICAgY2ttYWttc2coYnVmLEZUUF9CVUZTSVosaGRpciwiLy5uZXRyYyIsTlVMTCxOVUxMKTsKKyAgICBjZmlsZSA9IGZvcGVuKGJ1ZiwgInIiKTsKKyAgICBpZiAoY2ZpbGUgPT0gTlVMTCkgeworICAgICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKQorICAgICAgICAgIHBlcnJvcihidWYpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGlmIChnZXRob3N0bmFtZShteW5hbWUsIE1BWEhPU1ROQU1FTEVOKSA8IDApCisgICAgICBteW5hbWVbMF0gPSAnXDAnOworICAgIGlmICgobXlkb21haW4gPSBja3N0cmNocihteW5hbWUsICcuJykpID09IE5VTEwpCisgICAgICBteWRvbWFpbiA9ICIiOworCisgIG5leHQ6CisgICAgd2hpbGUgKCh0ID0gdG9rZW4oKSkpIHN3aXRjaCh0KSB7CisKKyAgICAgIGNhc2UgREVGQVVMVDoKKyAgICAgICAgdXNlZGVmYXVsdCA9IDE7CisgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICBjYXNlIE1BQ0g6CisgICAgICAgIGlmICghdXNlZGVmYXVsdCkgeworICAgICAgICAgICAgaWYgKHRva2VuKCkgIT0gSUQpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFsbG93IG1hdGNoIGVpdGhlciBmb3IgdXNlcidzIGlucHV0IGhvc3QgbmFtZQorICAgICAgICAgICAgICogb3Igb2ZmaWNpYWwgaG9zdG5hbWUuICBBbHNvIGFsbG93IG1hdGNoIG9mCisgICAgICAgICAgICAgKiBpbmNvbXBsZXRlbHktc3BlY2lmaWVkIGhvc3QgaW4gbG9jYWwgZG9tYWluLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoY2tzdHJjbXAoaG9zdCwgdG9rdmFsLC0xLDEpID09IDApCisgICAgICAgICAgICAgIGdvdG8gbWF0Y2g7CisgICAgICAgICAgICBpZiAoY2tzdHJjbXAoZnRwX2hvc3QsIHRva3ZhbCwtMSwwKSA9PSAwKQorICAgICAgICAgICAgICBnb3RvIG1hdGNoOworICAgICAgICAgICAgaWYgKCh0bXAgPSBja3N0cmNocihmdHBfaG9zdCwgJy4nKSkgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIGNrc3RyY21wKHRtcCwgbXlkb21haW4sLTEsMSkgPT0gMCAmJgorICAgICAgICAgICAgICAgIGNrc3RyY21wKGZ0cF9ob3N0LCB0b2t2YWwsIHRtcC1mdHBfaG9zdCwwKSA9PSAwICYmCisgICAgICAgICAgICAgICAgdG9rdmFsW3RtcCAtIGZ0cF9ob3N0XSA9PSAnXDAnKQorICAgICAgICAgICAgICBnb3RvIG1hdGNoOworICAgICAgICAgICAgaWYgKCh0bXAgPSBja3N0cmNocihob3N0LCAnLicpKSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgY2tzdHJjbXAodG1wLCBteWRvbWFpbiwtMSwxKSA9PSAwICYmCisgICAgICAgICAgICAgICAgY2tzdHJjbXAoaG9zdCwgdG9rdmFsLCB0bXAgLSBob3N0LCAwKSA9PSAwICYmCisgICAgICAgICAgICAgICAgdG9rdmFsW3RtcCAtIGhvc3RdID09ICdcMCcpCisgICAgICAgICAgICAgIGdvdG8gbWF0Y2g7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBtYXRjaDoKKyAgICAgICAgd2hpbGUgKCh0ID0gdG9rZW4oKSkgJiYgdCAhPSBNQUNIICYmIHQgIT0gREVGQVVMVCkgc3dpdGNoKHQpIHsKKworICAgICAgICAgIGNhc2UgTE9HSU46CisgICAgICAgICAgICBpZiAodG9rZW4oKSkKKyAgICAgICAgICAgICAgaWYgKCphbmFtZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAqYW5hbWUgPSBtYWxsb2MoKHVuc2lnbmVkKSBzdHJsZW4odG9rdmFsKSArIDEpOworICAgICAgICAgICAgICAgICAgc3RyY3B5KCphbmFtZSwgdG9rdmFsKTsgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKCphbmFtZSwgdG9rdmFsKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFBBU1NXRDoKKyAgICAgICAgICAgIGlmIChzdHJjbXAoKmFuYW1lLCAiYW5vbnltb3VzIikgJiYKKyAgICAgICAgICAgICAgICBmc3RhdChmaWxlbm8oY2ZpbGUpLCAmc3RiKSA+PSAwICYmCisgICAgICAgICAgICAgICAgKHN0Yi5zdF9tb2RlICYgMDc3KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciAtIC5uZXRyYyBmaWxlIG5vdCBjb3JyZWN0IG1vZGUuXG4iKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlbW92ZSBwYXNzd29yZCBvciBjb3JyZWN0IG1vZGUuXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b2tlbigpICYmICphcGFzcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgKmFwYXNzID0gbWFsbG9jKCh1bnNpZ25lZCkgc3RybGVuKHRva3ZhbCkgKyAxKTsKKyAgICAgICAgICAgICAgICBzdHJjcHkoKmFwYXNzLCB0b2t2YWwpOyAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEFDQ09VTlQ6CisgICAgICAgICAgICBpZiAoZnN0YXQoZmlsZW5vKGNmaWxlKSwgJnN0YikgPj0gMAorICAgICAgICAgICAgICAgICYmIChzdGIuc3RfbW9kZSAmIDA3NykgIT0gMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgLSAubmV0cmMgZmlsZSBub3QgY29ycmVjdCBtb2RlLlxuIik7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZW1vdmUgYWNjb3VudCBvciBjb3JyZWN0IG1vZGUuXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b2tlbigpICYmICphYWNjdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgKmFhY2N0ID0gbWFsbG9jKCh1bnNpZ25lZCkgc3RybGVuKHRva3ZhbCkgKyAxKTsKKyAgICAgICAgICAgICAgICBzdHJjcHkoKmFhY2N0LCB0b2t2YWwpOyAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gLm5ldHJjIGtleXdvcmQgJXNcbiIsIHRva3ZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgIGRvbmU6CisgICAgZmNsb3NlKGNmaWxlKTsKKyAgICByZXR1cm4oMCk7CisKKyAgYmFkOgorICAgIGZjbG9zZShjZmlsZSk7CisgICAgcmV0dXJuKC0xKTsKK30KKyNlbmRpZiAvKiBVU0VfUlVTRVJQQVNTICovCisKK3N0YXRpYyBjaGFyICpyYWRpeE4gPQorICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKK3N0YXRpYyBjaGFyIHBhZCA9ICc9JzsKKworc3RhdGljIGludAorcmFkaXhfZW5jb2RlKGluYnVmLCBvdXRidWYsIGlubGVuLCBvdXRsZW4sIGRlY29kZSkKKyAgICBDSEFSIGluYnVmW10sIG91dGJ1ZltdOworICAgIGludCBpbmxlbiwgKm91dGxlbiwgZGVjb2RlOworeworICAgIGludCBpLCBqLCBEID0gMDsKKyAgICBjaGFyICpwOworICAgIENIQVIgYyA9IE5VTDsKKworICAgIGlmIChkZWNvZGUpIHsKKyAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGluYnVmW2ldICYmIGluYnVmW2ldICE9IHBhZDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKHAgPSBja3N0cmNocihyYWRpeE4sIGluYnVmW2ldKSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgRCA9IHAgLSByYWRpeE47CisgICAgICAgICAgICBzd2l0Y2ggKGkmMykgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgb3V0YnVmW2pdID0gRDw8MjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIG91dGJ1ZltqKytdIHw9IEQ+PjQ7CisgICAgICAgICAgICAgICAgb3V0YnVmW2pdID0gKEQmMTUpPDw0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgb3V0YnVmW2orK10gfD0gRD4+MjsKKyAgICAgICAgICAgICAgICBvdXRidWZbal0gPSAoRCYzKTw8NjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIG91dGJ1ZltqKytdIHw9IEQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA9PSAqb3V0bGVuKQorICAgICAgICAgICAgICByZXR1cm4oNCk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChpJjMpIHsKKyAgICAgICAgICBjYXNlIDE6IHJldHVybigzKTsKKyAgICAgICAgICBjYXNlIDI6IGlmIChEJjE1KSByZXR1cm4oMyk7CisgICAgICAgICAgICBpZiAoc3RyY21wKChjaGFyICopJmluYnVmW2ldLCAiPT0iKSkgcmV0dXJuKDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOiBpZiAoRCYzKSByZXR1cm4oMyk7CisgICAgICAgICAgICBpZiAoc3RyY21wKChjaGFyICopJmluYnVmW2ldLCAiPSIpKSAgcmV0dXJuKDIpOworICAgICAgICB9CisgICAgICAgICpvdXRsZW4gPSBqOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgaW5sZW47IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChpJTMpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIG91dGJ1ZltqKytdID0gcmFkaXhOW2luYnVmW2ldPj4yXTsKKyAgICAgICAgICAgICAgICBjID0gKGluYnVmW2ldJjMpPDw0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgb3V0YnVmW2orK10gPSByYWRpeE5bY3xpbmJ1ZltpXT4+NF07CisgICAgICAgICAgICAgICAgYyA9IChpbmJ1ZltpXSYxNSk8PDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBvdXRidWZbaisrXSA9IHJhZGl4TltjfGluYnVmW2ldPj42XTsKKyAgICAgICAgICAgICAgICBvdXRidWZbaisrXSA9IHJhZGl4TltpbmJ1ZltpXSY2M107CisgICAgICAgICAgICAgICAgYyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA9PSAqb3V0bGVuKQorICAgICAgICAgICAgICByZXR1cm4oNCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGklMykgb3V0YnVmW2orK10gPSByYWRpeE5bY107CisgICAgICAgIHN3aXRjaCAoaSUzKSB7CisgICAgICAgICAgY2FzZSAxOiBvdXRidWZbaisrXSA9IHBhZDsKKyAgICAgICAgICBjYXNlIDI6IG91dGJ1ZltqKytdID0gcGFkOworICAgICAgICB9CisgICAgICAgIG91dGJ1Zlsqb3V0bGVuID0gal0gPSAnXDAnOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBjaGFyICoKK3JhZGl4X2Vycm9yKGUpIGludCBlOworeworICAgIHN3aXRjaCAoZSkgeworICAgICAgY2FzZSAwOiAgcmV0dXJuKCJTdWNjZXNzIik7CisgICAgICBjYXNlIDE6ICByZXR1cm4oIkJhZCBjaGFyYWN0ZXIgaW4gZW5jb2RpbmciKTsKKyAgICAgIGNhc2UgMjogIHJldHVybigiRW5jb2Rpbmcgbm90IHByb3Blcmx5IHBhZGRlZCIpOworICAgICAgY2FzZSAzOiAgcmV0dXJuKCJEZWNvZGVkICMgb2YgYml0cyBub3QgYSBtdWx0aXBsZSBvZiA4Iik7CisgICAgICBjYXNlIDQ6ICByZXR1cm4oIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsIik7CisgICAgICBkZWZhdWx0OiByZXR1cm4oIlVua25vd24gZXJyb3IiKTsKKyAgICB9Cit9CisvKiBFTkRfUlVTRVJQQVNTICovCisKKyNpZmRlZiBGVFBfU1JQCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBQYWNrYWdlOiBzcnBmdHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIEF1dGhvcjogRXVnZW5lIEpob25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkgIFRoZSBTdGFuZm9yZCBTUlAgQXV0aGVudGljYXRpb24gUHJvamVjdAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgU1RBTkZPUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwKKyAqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorICogUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBBUklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKiBJbiBhZGRpdGlvbiwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFwcGx5OgorICoKKyAqIDEuIEFueSBzb2Z0d2FyZSB0aGF0IGluY29ycG9yYXRlcyB0aGUgU1JQIGF1dGhlbnRpY2F0aW9uIHRlY2hub2xvZ3kKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IHVzZXMgdGhlICdTZWN1cmUgUmVtb3RlIFBhc3N3b3JkJyBjcnlwdG9ncmFwaGljCisgKiAgICAgYXV0aGVudGljYXRpb24gc3lzdGVtIGRldmVsb3BlZCBieSBUb20gV3UgKHRqd0BDUy5TdGFuZm9yZC5FRFUpLiIKKyAqCisgKiAyLiBBbnkgc29mdHdhcmUgdGhhdCBpbmNvcnBvcmF0ZXMgYWxsIG9yIHBhcnQgb2YgdGhlIFNSUCBkaXN0cmlidXRpb24KKyAqICAgIGl0c2VsZiBtdXN0IGFsc28gZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVG9tIFd1IGFuZCBFdWdlbmUKKyAqICAgICBKaG9uZyBmb3IgdGhlIFNSUCBEaXN0cmlidXRpb24gKGh0dHA6Ly9zcnAuc3RhbmZvcmQuZWR1L3NycC8pLiIKKyAqCisgKiAzLiBSZWRpc3RyaWJ1dGlvbnMgaW4gc291cmNlIG9yIGJpbmFyeSBmb3JtIG11c3QgcmV0YWluIGFuIGludGFjdCBjb3B5CisgKiAgICBvZiB0aGlzIGNvcHlyaWdodCBub3RpY2UgYW5kIGxpc3Qgb2YgY29uZGl0aW9ucy4KKyAqLworCisjZGVmaW5lIFNSUF9QUk9UX1ZFUlNJT04gICAgICAgIDEKKworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyNkZWZpbmUgU1JQX0RFRkFVTFRfQ0lQSEVSICAgICAgQ0lQSEVSX0lEX0NBU1Q1X0NCQworI2Vsc2UKKyNkZWZpbmUgU1JQX0RFRkFVTFRfQ0lQSEVSICAgICAgQ0lQSEVSX0lEX05PTkUKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisKKyNkZWZpbmUgU1JQX0RFRkFVTFRfSEFTSCAgICAgICAgSEFTSF9JRF9TSEEKKworQ0hBUiBzcnBfcHJlZl9jaXBoZXIgPSBDSVBIRVJfSURfREVTM19FQ0I7CitDSEFSIHNycF9wcmVmX2hhc2ggPSBIQVNIX0lEX1NIQTsKKworc3RhdGljIHN0cnVjdCB0X2NsaWVudCAqdGMgPSBOVUxMOworc3RhdGljIENIQVIgKnNrZXkgPSBOVUxMOworc3RhdGljIGtyeXB0b19jb250ZXh0ICppbmNyeXB0ID0gTlVMTDsKK3N0YXRpYyBrcnlwdG9fY29udGV4dCAqb3V0Y3J5cHQgPSBOVUxMOworCit0eXBlZGVmIHVuc2lnbmVkIGludCBzcnBfdWludDMyOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgc3JwX3NlbGNpcGhlcjogc2VsZWN0IGNpcGhlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludAorc3JwX3NlbGNpcGhlciAoY25hbWUpIGNoYXIgKmNuYW1lOyB7CisgICAgY2lwaGVyX2Rlc2MgKmNkOworCisgICAgaWYgKCEoY2QgPSBjaXBoZXJfZ2V0ZGVzY2J5bmFtZSAoY25hbWUpKSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgQ0hBUiAqbGlzdCA9IGNpcGhlcl9nZXRsaXN0ICgpOworCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgImZ0cDogc3VwcG9ydGVkIGNpcGhlcnM6XG5cbiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RybGVuIChsaXN0KTsgaSsrKQorICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgICAlc1xuIiwgKGNpcGhlcl9nZXRkZXNjYnlpZChsaXN0W2ldKSktPm5hbWUpOworICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNycF9wcmVmX2NpcGhlciA9IGNkLT5pZDsKKyAgICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8IHNycF9zZWxoYXNoOiBzZWxlY3QgaGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQKK3NycF9zZWxoYXNoIChobmFtZSkgY2hhciAqaG5hbWU7IHsKKyAgICBoYXNoX2Rlc2MgKmhkOworCisgICAgaWYgKCEoaGQgPSBoYXNoX2dldGRlc2NieW5hbWUgKGhuYW1lKSkpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIENIQVIgKmxpc3QgPSBoYXNoX2dldGxpc3QgKCk7CisKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZnRwOiBzdXBwb3J0ZWQgaGFzaCBmdW5jdGlvbnM6XG5cbiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RybGVuIChsaXN0KTsgaSsrKQorICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgICAlc1xuIiwgKGhhc2hfZ2V0ZGVzY2J5aWQobGlzdFtpXSkpLT5uYW1lKTsKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzcnBfcHJlZl9oYXNoID0gaGQtPmlkOworICAgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgc3JwX3VzZXJwYXNzOiBnZXQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludAorc3JwX3VzZXJwYXNzIChob3N0KSBjaGFyICpob3N0OyB7CisgICAgY2hhciB0bXBbQlVGU0laXSwgcHJvbXB0W1BST01QVFNJWl07CisgICAgY2hhciAqdXNlcjsKKworICAgIHVzZXIgPSBOVUxMOworI2lmZGVmIFVTRV9SVVNFUlBBU1MKKyAgICBydXNlcnBhc3MgKGhvc3QsICZ1c2VyLCAmc3JwX3Bhc3MsICZzcnBfYWNjdCk7CisjZW5kaWYgLyogVVNFX1JVU0VSUEFTUyAqLworCisgICAgd2hpbGUgKHVzZXIgPT0gTlVMTCkgICAgIHsKKyAgICAgICAgY2hhciAqbXluYW1lOworICAgICAgICBpbnQgb2s7CisKKyAgICAgICAgbXluYW1lID0gd2hvYW1pKCk7CisgICAgICAgIGlmICghbXluYW1lKSBteW5hbWUgPSAiIjsKKyAgICAgICAgaWYgKG15bmFtZVswXSkKKyAgICAgICAgICBja21ha3htc2cocHJvbXB0LFBST01QVFNJWiwiIE5hbWUgKCIsaG9zdCwiOiIsbXluYW1lLCIpOiAiLAorICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNrbWFrbXNnKHByb21wdCxQUk9NUFRTSVosIiBOYW1lICgiLGhvc3QsIik6ICIsTlVMTCk7CisgICAgICAgIHRtcFswXSA9ICdcMCc7CisgICAgICAgIG9rID0gdXFfdHh0KE5VTEwscHJvbXB0LDEsTlVMTCx0bXAsQlVGU0laLE5VTEwsCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfVVFfVElNRU9VVCk7CisgICAgICAgIGlmICghb2sgfHwgKnRtcCA9PSAnXDAnKQorICAgICAgICAgIHVzZXIgPSBteW5hbWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB1c2VyID0gYnJzdHJpcCh0bXApOworICAgIH0KKyAgICBja3N0cm5jcHkgKHNycF91c2VyLCB1c2VyLEJVRlNJWik7CisgICAgcmV0dXJuKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgc3JwX3Jlc2V0OiByZXNldCBzcnAgaW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludAorc3JwX3Jlc2V0ICgpIHsKKyAgICBpZiAodGMpIHsgdF9jbGllbnRjbG9zZSAodGMpOyB0YyA9IE5VTEw7IH0KKyAgICBpZiAoaW5jcnlwdCkgeyBrcnlwdG9fZGVsZXRlIChpbmNyeXB0KTsgaW5jcnlwdCA9IE5VTEw7IH0KKyAgICBpZiAob3V0Y3J5cHQpIHsga3J5cHRvX2RlbGV0ZSAob3V0Y3J5cHQpOyBvdXRjcnlwdCA9IE5VTEw7IH0KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCBzcnBfZnRwX2F1dGg6IHBlcmZvcm0gc3JwIGF1dGhlbnRpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludAorc3JwX2Z0cF9hdXRoKGhvc3QsIHVzZXIsIHBhc3MpCisgICAgY2hhciAqaG9zdDsKKyAgICBjaGFyICp1c2VyOworICAgIGNoYXIgKnBhc3M7Cit7CisgICAgc3RydWN0IHRfbnVtICp3cDsKKyAgICBzdHJ1Y3QgdF9udW0gTjsKKyAgICBzdHJ1Y3QgdF9udW0gZzsKKyAgICBzdHJ1Y3QgdF9udW0gczsKKyAgICBzdHJ1Y3QgdF9udW0geXA7CisgICAgQ0hBUiBidWZbRlRQX0JVRlNJWl07CisgICAgQ0hBUiB0bXBbRlRQX0JVRlNJWl07CisgICAgQ0hBUiAqYnAsICpjcDsKKyAgICBpbnQgbiwgZSwgY2xlbiwgYmxlbiwgbGVuLCBpOworICAgIENIQVIgY2lkID0gMDsKKyAgICBDSEFSIGhpZCA9IDA7CisKKyAgICBzcnBfcGFzcyA9IHNycF9hY2N0ID0gMDsKKworICAgIG4gPSBmdHBjbWQoIkFVVEggU1JQIixOVUxMLDAsMCxmdHBfdmJtKTsKKyAgICBpZiAobiAhPSBSRVBMWV9DT05USU5VRSkgeworICAgICAgICBpZiAoZnRwX2RlYikKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU1JQIHJlamVjdGVkIGFzIGFuIGF1dGhlbnRpY2F0aW9uIHR5cGVcbiIpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VuZCBwcm90b2NvbCB2ZXJzaW9uICovCisgICAgICAgIENIQVIgdmVyc1s0XTsKKyAgICAgICAgbWVtc2V0ICh2ZXJzLCAwLCA0KTsKKyAgICAgICAgdmVyc1szXSA9IFNSUF9QUk9UX1ZFUlNJT047CisgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgcHJpbnRmICgiU1JQIGFjY2VwdGVkIGFzIGF1dGhlbnRpY2F0aW9uIHR5cGUuXG4iKTsKKyAgICAgICAgYnAgPSB0bXA7IGJsZW4gPSAwOworICAgICAgICBzcnBfcHV0ICh2ZXJzLCAmYnAsIDQsICZibGVuKTsKKyAgICAgICAgbGVuID0gRlRQX0JVRlNJWjsKKyAgICAgICAgaWYgKGUgPSByYWRpeF9lbmNvZGUgKHRtcCwgYnVmLCBibGVuLCAmbGVuLCBSQURJWF9FTkNPREUpKQorICAgICAgICAgIGdvdG8gZW5jb2RlX2Vycm9yOworICAgICAgICByZXBseV9wYXJzZSA9ICJBREFUPSI7CisgICAgICAgIG4gPSBmdHBjbWQoIkFEQVQiLGJ1ZiwtMSwtMSwwKTsKKyAgICB9CisgICAgaWYgKG4gPT0gUkVQTFlfQ09OVElOVUUpIHsgICAgICAgICAgLyogR2V0IHByb3RvY29sIHZlcnNpb24gKi8KKyAgICAgICAgYnAgPSBidWY7CisgICAgICAgIGlmICghcmVwbHlfcGFyc2UpCisgICAgICAgICAgZ290byBkYXRhX2Vycm9yOworICAgICAgICBibGVuID0gRlRQX0JVRlNJWjsKKyAgICAgICAgaWYgKGUgPSByYWRpeF9lbmNvZGUocmVwbHlfcGFyc2UsIGJwLCAwLCAmYmxlbiwgUkFESVhfREVDT0RFKSkKKyAgICAgICAgICBnb3RvIGRlY29kZV9lcnJvcjsKKyAgICAgICAgaWYgKHNycF9nZXQgKCZicCwgJmNwLCAmYmxlbiwgJmNsZW4pICE9IDQpCisgICAgICAgICAgZ290byBkYXRhX2Vycm9yOworCisgICAgICAgIGlmIChob3N0KSB7ICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHVzZXJuYW1lL3Bhc3N3b3JkIGlmIG5lZWRlZCAqLworICAgICAgICAgICAgc3JwX3VzZXJwYXNzIChob3N0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNrc3RybmNweSAoc3JwX3VzZXIsIHVzZXIsIEJVRlNJWik7CisgICAgICAgICAgICBzcnBfcGFzcyA9IHBhc3M7CisgICAgICAgIH0KKyAgICAgICAgYnAgPSB0bXA7IGJsZW4gPSAwOyAgICAgICAgICAgICAvKiBTZW5kIHVzZXJuYW1lICovCisgICAgICAgIHNycF9wdXQgKHNycF91c2VyLCAmYnAsIHN0cmxlbiAoc3JwX3VzZXIpLCAmYmxlbik7CisgICAgICAgIGxlbiA9IEZUUF9CVUZTSVo7CisgICAgICAgIGlmIChlID0gcmFkaXhfZW5jb2RlICh0bXAsIGJ1ZiwgYmxlbiwgJmxlbiwgUkFESVhfRU5DT0RFKSkKKyAgICAgICAgICBnb3RvIGVuY29kZV9lcnJvcjsKKyAgICAgICAgcmVwbHlfcGFyc2UgPSAiQURBVD0iOworICAgICAgICBuID0gZnRwY21kKCJBREFUIixidWYsLTEsLTEsMCk7CisgICAgfQorICAgIGlmIChuID09IFJFUExZX0NPTlRJTlVFKSB7ICAgICAgICAgIC8qIEdldCBOLCBnIGFuZCBzICovCisgICAgICAgIGJwID0gYnVmOworICAgICAgICBpZiAoIXJlcGx5X3BhcnNlKQorICAgICAgICAgIGdvdG8gZGF0YV9lcnJvcjsKKyAgICAgICAgYmxlbiA9IEZUUF9CVUZTSVo7CisgICAgICAgIGlmIChlID0gcmFkaXhfZW5jb2RlIChyZXBseV9wYXJzZSwgYnAsIDAsICZibGVuLCBSQURJWF9ERUNPREUpKQorICAgICAgICAgIGdvdG8gZGVjb2RlX2Vycm9yOworICAgICAgICBpZiAoc3JwX2dldCAoJmJwLCAmKE4uZGF0YSksICZibGVuLCAmKE4ubGVuKSkgPCAwKQorICAgICAgICAgIGdvdG8gZGF0YV9lcnJvcjsKKyAgICAgICAgaWYgKHNycF9nZXQgKCZicCwgJihnLmRhdGEpLCAmYmxlbiwgJihnLmxlbikpIDwgMCkKKyAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgIGlmIChzcnBfZ2V0ICgmYnAsICYocy5kYXRhKSwgJmJsZW4sICYocy5sZW4pKSA8IDApCisgICAgICAgICAgZ290byBkYXRhX2Vycm9yOworICAgICAgICBpZiAoKHRjID0gdF9jbGllbnRvcGVuIChzcnBfdXNlciwgJk4sICZnLCAmcykpID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuIFNSUCBjbGllbnQgc3RydWN0dXJlLlxuIik7CisgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorICAgICAgICB3cCA9IHRfY2xpZW50Z2VuZXhwICh0Yyk7ICAgICAgIC8qIFNlbmQgd3AgKi8KKyAgICAgICAgYnAgPSB0bXA7IGJsZW4gPSAwOworICAgICAgICBzcnBfcHV0ICh3cC0+ZGF0YSwgJmJwLCB3cC0+bGVuLCAmYmxlbik7CisgICAgICAgIGxlbiA9IEZUUF9CVUZTSVo7CisgICAgICAgIGlmIChlID0gcmFkaXhfZW5jb2RlICh0bXAsIGJ1ZiwgYmxlbiwgJmxlbiwgUkFESVhfRU5DT0RFKSkKKyAgICAgICAgICBnb3RvIGVuY29kZV9lcnJvcjsKKyAgICAgICAgcmVwbHlfcGFyc2UgPSAiQURBVD0iOworICAgICAgICBuID0gZnRwY21kKCJBREFUIixidWYsLTEsLTEsMCk7CisgICAgfQorICAgIGlmIChuID09IFJFUExZX0NPTlRJTlVFKSB7ICAgICAgICAgIC8qIEdldCB5cCAqLworICAgICAgICBicCA9IGJ1ZjsKKyAgICAgICAgaWYgKCFyZXBseV9wYXJzZSkKKyAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgIGJsZW4gPSBGVFBfQlVGU0laOworICAgICAgICBpZiAoZSA9IHJhZGl4X2VuY29kZSAocmVwbHlfcGFyc2UsIGJwLCAwLCAmYmxlbiwgUkFESVhfREVDT0RFKSkKKyAgICAgICAgICBnb3RvIGRlY29kZV9lcnJvcjsKKyAgICAgICAgaWYgKHNycF9nZXQgKCZicCwgJih5cC5kYXRhKSwgJmJsZW4sICYoeXAubGVuKSkgPCAwKQorICAgICAgICAgIGdvdG8gZGF0YV9lcnJvcjsKKyAgICAgICAgaWYgKCFzcnBfcGFzcykgeworICAgICAgICAgICAgc3RhdGljIGNoYXIgZnRwcGFzc1tQQVNTQlVGU0laXTsKKyAgICAgICAgICAgIGludCBvazsKKyAgICAgICAgICAgIHNldGludCgpOworICAgICAgICAgICAgb2sgPSB1cV90eHQoTlVMTCwiIFNSUCBQYXNzd29yZDogIiwyLE5VTEwsZnRwcGFzcyxQQVNTQlVGU0laLE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1VRX1RJTUVPVVQpOworICAgICAgICAgICAgaWYgKG9rKQorCSAgICAgIHNycF9wYXNzID0gYnJzdHJpcChmdHBwYXNzKTsKKyAgICAgICAgfQorICAgICAgICB0X2NsaWVudHBhc3N3ZCAodGMsIHNycF9wYXNzKTsKKyAgICAgICAgbWVtc2V0IChzcnBfcGFzcywgMCwgc3RybGVuIChzcnBfcGFzcykpOworICAgICAgICBza2V5ID0gdF9jbGllbnRnZXRrZXkgKHRjLCAmeXApOyAvKiBTZW5kIHJlc3BvbnNlICovCisgICAgICAgIGJwID0gdG1wOyBibGVuID0gMDsKKyAgICAgICAgc3JwX3B1dCAodF9jbGllbnRyZXNwb25zZSAodGMpLCAmYnAsIDIwLCAmYmxlbik7CisgICAgICAgIGxlbiA9IEZUUF9CVUZTSVo7CisgICAgICAgIGlmIChlID0gcmFkaXhfZW5jb2RlICh0bXAsIGJ1ZiwgYmxlbiwgJmxlbiwgUkFESVhfRU5DT0RFKSkKKyAgICAgICAgICBnb3RvIGVuY29kZV9lcnJvcjsKKyAgICAgICAgcmVwbHlfcGFyc2UgPSAiQURBVD0iOworICAgICAgICBuID0gZnRwY21kKCJBREFUIixidWYsLTEsLTEsMCk7CisgICAgfQorICAgIGlmIChuID09IFJFUExZX0NPTlRJTlVFKSB7ICAgICAgICAgIC8qIEdldCByZXNwb25zZSAqLworICAgICAgICBicCA9IGJ1ZjsKKyAgICAgICAgaWYgKCFyZXBseV9wYXJzZSkKKyAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgIGJsZW4gPSBGVFBfQlVGU0laOworICAgICAgICBpZiAoZSA9IHJhZGl4X2VuY29kZSAocmVwbHlfcGFyc2UsIGJwLCAwLCAmYmxlbiwgUkFESVhfREVDT0RFKSkKKyAgICAgICAgICBnb3RvIGVuY29kZV9lcnJvcjsKKyAgICAgICAgaWYgKHNycF9nZXQgKCZicCwgJmNwLCAmYmxlbiwgJmNsZW4pICE9IDIwKQorICAgICAgICAgIGdvdG8gZGF0YV9lcnJvcjsKKyAgICAgICAgaWYgKHRfY2xpZW50dmVyaWZ5ICh0YywgY3ApKSB7CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJXQVJOSU5HOiBiYWQgcmVzcG9uc2UgdG8gY2xpZW50IGNoYWxsZW5nZS5cbiIpOworICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKyAgICAgICAgYnAgPSB0bXA7IGJsZW4gPSAwOyAgICAgICAgICAgICAvKiBTZW5kIG5vdGhpbmcgKi8KKyAgICAgICAgc3JwX3B1dCAoIlwwIiwgJmJwLCAxLCAmYmxlbik7CisgICAgICAgIGxlbiA9IEZUUF9CVUZTSVo7CisgICAgICAgIGlmIChlID0gcmFkaXhfZW5jb2RlICh0bXAsIGJ1ZiwgYmxlbiwgJmxlbiwgUkFESVhfRU5DT0RFKSkKKyAgICAgICAgICBnb3RvIGVuY29kZV9lcnJvcjsKKyAgICAgICAgcmVwbHlfcGFyc2UgPSAiQURBVD0iOworICAgICAgICBuID0gZnRwY21kKCJBREFUIixidWYsLTEsLTEsMCk7CisgICAgfQorICAgIGlmIChuID09IFJFUExZX0NPTlRJTlVFKSB7ICAgICAgICAgIC8qIEdldCBjaXBoZXIgJiBoYXNoIGxpc3RzLCBzZXFudW0gKi8KKyAgICAgICAgQ0hBUiBzZXFudW1bNF07CisgICAgICAgIENIQVIgKmNsaXN0OworICAgICAgICBDSEFSICpobGlzdDsKKyAgICAgICAgQ0hBUiAqcDE7CisgICAgICAgIGludCBjbGlzdF9sZW4sIGhsaXN0X2xlbjsKKyAgICAgICAgYnAgPSBidWY7CisgICAgICAgIGlmICghcmVwbHlfcGFyc2UpCisgICAgICAgICAgZ290byBkYXRhX2Vycm9yOworICAgICAgICBibGVuID0gRlRQX0JVRlNJWjsKKyAgICAgICAgaWYgKGUgPSByYWRpeF9lbmNvZGUgKHJlcGx5X3BhcnNlLCBicCwgMCwgJmJsZW4sIFJBRElYX0RFQ09ERSkpCisgICAgICAgICAgZ290byBlbmNvZGVfZXJyb3I7CisgICAgICAgIGlmIChzcnBfZ2V0ICgmYnAsICZjbGlzdCwgJmJsZW4sICZjbGlzdF9sZW4pIDwgMCkKKyAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgIGlmIChzcnBfZ2V0ICgmYnAsICZobGlzdCwgJmJsZW4sICZobGlzdF9sZW4pIDwgMCkKKyAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgIGlmIChzcnBfZ2V0ICgmYnAsICZjcCwgJmJsZW4sICZjbGVuKSAhPSA0KQorICAgICAgICAgIGdvdG8gZGF0YV9lcnJvcjsKKyAgICAgICAgbWVtY3B5IChzZXFudW0sIGNwLCA0KTsKKyAgICAgICAgaWYgKGNpcGhlcl9zdXBwb3J0ZWQgKGNsaXN0LCBzcnBfcHJlZl9jaXBoZXIpKSAvKiBDaG9vc2UgY2lwaGVyICovCisgICAgICAgICAgY2lkID0gc3JwX3ByZWZfY2lwaGVyOworICAgICAgICBpZiAoIWNpZCAmJiBjaXBoZXJfc3VwcG9ydGVkIChjbGlzdCwgU1JQX0RFRkFVTFRfQ0lQSEVSKSkKKyAgICAgICAgICBjaWQgPSBTUlBfREVGQVVMVF9DSVBIRVI7CisgICAgICAgIGlmICghY2lkKSB7CisgICAgICAgICAgICBDSEFSICpsb2NsaXN0ID0gY2lwaGVyX2dldGxpc3QgKCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RybGVuIChsb2NsaXN0KTsgaSsrKQorICAgICAgICAgICAgICBpZiAoY2lwaGVyX3N1cHBvcnRlZCAoY2xpc3QsIGxvY2xpc3RbaV0pKSB7CisgICAgICAgICAgICAgICAgICBjaWQgPSBsb2NsaXN0W2ldOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWNpZCkgeworICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5hYmxlIHRvIGFncmVlIG9uIGNpcGhlci5cbiIpOworICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2hvb3NlIGhhc2ggKi8KKworICAgICAgICBpZiAoc3JwX3ByZWZfaGFzaCAmJiBoYXNoX3N1cHBvcnRlZCAoaGxpc3QsIHNycF9wcmVmX2hhc2gpKQorICAgICAgICAgIGhpZCA9IHNycF9wcmVmX2hhc2g7CisKKyAgICAgICAgaWYgKCFoaWQgJiYgaGFzaF9zdXBwb3J0ZWQgKGhsaXN0LCBTUlBfREVGQVVMVF9IQVNIKSkKKyAgICAgICAgICBoaWQgPSBTUlBfREVGQVVMVF9IQVNIOworCisgICAgICAgIGlmICghaGlkKSB7CisgICAgICAgICAgICBDSEFSICpsb2NsaXN0ID0gaGFzaF9nZXRsaXN0ICgpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0cmxlbiAobG9jbGlzdCk7IGkrKykKKyAgICAgICAgICAgICAgaWYgKGhhc2hfc3VwcG9ydGVkIChobGlzdCwgbG9jbGlzdFtpXSkpIHsKKyAgICAgICAgICAgICAgICAgIGhpZCA9IGxvY2xpc3RbaV07CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaGlkKSB7CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gYWdyZWUgb24gaGFzaC5cbiIpOworICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKyAgICAgICAgLyogU2V0IGluY3J5cHQgKi8KKworICAgICAgICBpZiAoIShpbmNyeXB0ID0ga3J5cHRvX25ldyAoY2lkLCBoaWQsIHNrZXksIDIwLCBOVUxMLCAwLCBzZXFudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLUllQVE9fREVDT0RFKSkpCisgICAgICAgICAgZ290byBiYWQ7CisKKyAgICAgICAgLyogR2VuZXJhdGUgcmFuZG9tIG51bWJlciBmb3Igb3V0a2V5IGFuZCBvdXRzZXFudW0gKi8KKworICAgICAgICB0X3JhbmRvbSAoc2VxbnVtLCA0KTsKKworICAgICAgICAvKiBTZW5kIGNpZCwgaGlkLCBvdXRrZXksIG91dHNlcW51bSAqLworCisgICAgICAgIGJwID0gdG1wOyBibGVuID0gMDsKKyAgICAgICAgc3JwX3B1dCAoJmNpZCwgJmJwLCAxLCAmYmxlbik7CisgICAgICAgIHNycF9wdXQgKCZoaWQsICZicCwgMSwgJmJsZW4pOworICAgICAgICBzcnBfcHV0IChzZXFudW0sICZicCwgNCwgJmJsZW4pOworICAgICAgICBsZW4gPSBGVFBfQlVGU0laOworICAgICAgICBpZiAoZSA9IHJhZGl4X2VuY29kZSAodG1wLCBidWYsIGJsZW4sICZsZW4sIFJBRElYX0VOQ09ERSkpCisgICAgICAgICAgZ290byBlbmNvZGVfZXJyb3I7CisgICAgICAgIHJlcGx5X3BhcnNlID0gIkFEQVQ9IjsKKyAgICAgICAgbiA9IGZ0cGNtZCgiQURBVCIsYnVmLC0xLC0xLDApOworCisgICAgICAgIC8qIFNldCBvdXRjcnlwdCAqLworCisgICAgICAgIGlmICghKG91dGNyeXB0ID0ga3J5cHRvX25ldyAoY2lkLCBoaWQsIHNrZXkrMjAsIDIwLCBOVUxMLCAwLCBzZXFudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1JZUFRPX0VOQ09ERSkpKQorICAgICAgICAgIGdvdG8gYmFkOworCisgICAgICAgIHRfY2xpZW50Y2xvc2UgKHRjKTsKKyAgICAgICAgdGMgPSBOVUxMOworICAgIH0KKyAgICBpZiAobiAhPSBSRVBMWV9DT01QTEVURSkKKyAgICAgIGdvdG8gYmFkOworCisgICAgaWYgKGZ0cF92Ym0pIHsKKyAgICAgICAgaWYgKGZ0cF9kZWIpCisgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBwcmludGYgKCJTUlAgYXV0aGVudGljYXRpb24gc3VjY2VlZGVkLlxuIik7CisgICAgICAgIHByaW50ZiAoIlVzaW5nIGNpcGhlciAlcyBhbmQgaGFzaCBmdW5jdGlvbiAlcy5cbiIsCisgICAgICAgICAgICAgICAgKGNpcGhlcl9nZXRkZXNjYnlpZChjaWQpKS0+bmFtZSwKKyAgICAgICAgICAgICAgICAoaGFzaF9nZXRkZXNjYnlpZChoaWQpKS0+bmFtZQorICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIHJlcGx5X3BhcnNlID0gTlVMTDsKKyAgICBhdXRoX3R5cGUgPSAiU1JQIjsKKyAgICByZXR1cm4oMSk7CisKKyAgZW5jb2RlX2Vycm9yOgorICAgIGZwcmludGYgKHN0ZGVyciwgIkJhc2UgNjQgZW5jb2RpbmcgZmFpbGVkOiAlcy5cbiIsIHJhZGl4X2Vycm9yIChlKSk7CisgICAgZ290byBiYWQ7CisKKyAgZGVjb2RlX2Vycm9yOgorICAgIGZwcmludGYgKHN0ZGVyciwgIkJhc2UgNjQgZGVjb2RpbmcgZmFpbGVkOiAlcy5cbiIsIHJhZGl4X2Vycm9yIChlKSk7CisgICAgZ290byBiYWQ7CisKKyAgZGF0YV9lcnJvcjoKKyAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gdW5tYXJzaGFsIGF1dGhlbnRpY2F0aW9uIGRhdGEuXG4iKTsKKyAgICBnb3RvIGJhZDsKKworICBiYWQ6CisgICAgZnByaW50ZiAoc3RkZXJyLCAiU1JQIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgdHJ5aW5nIHJlZ3VsYXIgbG9naW4uXG4iKTsKKyAgICByZXBseV9wYXJzZSA9IE5VTEw7CisgICAgcmV0dXJuKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgc3JwX3B1dDogcHV0IGl0ZW0gdG8gc2VuZCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludAorc3JwX3B1dCAoaW4sIG91dCwgaW5sZW4sIG91dGxlbikKKyAgICBDSEFSICppbjsKKyAgICBDSEFSICoqb3V0OworICAgIGludCBpbmxlbjsKKyAgICBpbnQgKm91dGxlbjsKK3sKKyAgICBzcnBfdWludDMyIG5ldF9sZW47CisKKyAgICBuZXRfbGVuID0gaHRvbmwgKGlubGVuKTsKKyAgICBtZW1jcHkgKCpvdXQsICZuZXRfbGVuLCA0KTsKKworICAgICpvdXQgKz0gNDsgKm91dGxlbiArPSA0OworCisgICAgbWVtY3B5ICgqb3V0LCBpbiwgaW5sZW4pOworCisgICAgKm91dCArPSBpbmxlbjsgKm91dGxlbiArPSBpbmxlbjsKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCBzcnBfZ2V0OiBnZXQgaXRlbSBmcm9tIHJlY2VpdmUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50CitzcnBfZ2V0IChpbiwgb3V0LCBpbmxlbiwgb3V0bGVuKQorICAgIENIQVIgKippbjsKKyAgICBDSEFSICoqb3V0OworICAgIGludCAqaW5sZW47CisgICAgaW50ICpvdXRsZW47Cit7CisgICAgc3JwX3VpbnQzMiBuZXRfbGVuOworCisgICAgaWYgKCppbmxlbiA8IDQpIHJldHVybiAtMTsKKworICAgIG1lbWNweSAoJm5ldF9sZW4sICppbiwgNCk7ICppbmxlbiAtPSA0OyAqaW4gKz0gNDsKKyAgICAqb3V0bGVuID0gbnRvaGwgKG5ldF9sZW4pOworCisgICAgaWYgKCppbmxlbiA8ICpvdXRsZW4pIHJldHVybiAtMTsKKworICAgICpvdXQgPSAqaW47ICppbmxlbiAtPSAqb3V0bGVuOyAqaW4gKz0gKm91dGxlbjsKKworICAgIHJldHVybiAqb3V0bGVuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgc3JwX2VuY29kZTogZW5jb2RlIGNvbnRyb2wgbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludAorc3JwX2VuY29kZSAocHJpdmF0ZSwgaW4sIG91dCwgbGVuKQorICAgIGludCBwcml2YXRlOworICAgIENIQVIgKmluOworICAgIENIQVIgKm91dDsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgaWYgKHByaXZhdGUpCisgICAgICByZXR1cm4ga3J5cHRvX21zZ19wcml2IChvdXRjcnlwdCwgaW4sIG91dCwgbGVuKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4ga3J5cHRvX21zZ19zYWZlIChvdXRjcnlwdCwgaW4sIG91dCwgbGVuKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8IHNycF9kZWNvZGU6IGRlY29kZSBjb250cm9sIG1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQKK3NycF9kZWNvZGUgKHByaXZhdGUsIGluLCBvdXQsIGxlbikKKyAgICBpbnQgcHJpdmF0ZTsKKyAgICBDSEFSICppbjsKKyAgICBDSEFSICpvdXQ7CisgICAgdW5zaWduZWQgbGVuOworeworICAgIGlmIChwcml2YXRlKQorICAgICAgcmV0dXJuIGtyeXB0b19tc2dfcHJpdiAoaW5jcnlwdCwgaW4sIG91dCwgbGVuKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4ga3J5cHRvX21zZ19zYWZlIChpbmNyeXB0LCBpbiwgb3V0LCBsZW4pOworfQorCisjZW5kaWYgLyogRlRQX1NSUCAqLworCisKKworI2lmZGVmIE5PVF9VU0VECisvKgorICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgZnJvbSB0aGUgVW5peCBGVFAgY2xpZW50LiAgQmUgc3VyZSB0bworICBtYWtlIHN1cmUgdGhhdCB0aGUgZnVuY3Rpb25hbGl0eSBpcyBub3QgbG9zdC4gIEVzcGVjaWFsbHkKKyAgdGhlIFByb3h5IHN0dWZmIGV2ZW4gdGhvdWdoIHdlIGhhdmUgbm90IHlldCBpbXBsZW1lbnRlZCBpdC4KKyovCisKKy8qIFNlbmQgbXVsdGlwbGUgZmlsZXMgICovCisKK3N0YXRpYyBpbnQKK2Z0cF9tcHV0KGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICoqYXJndjsgeworICAgIHJlZ2lzdGVyIGludCBpOworICAgIHNpZ190IG9sZGludHI7CisgICAgaW50IG9pbnRlcjsKKyAgICBjaGFyICp0cDsKKyAgICBzaWd0eXBlIG1jYW5jZWwoKTsKKworICAgIGlmIChhcmdjIDwgMiAmJiAhYW5vdGhlcigmYXJnYywgJmFyZ3YsICJsb2NhbC1maWxlcyIpKSB7CisgICAgICAgIHByaW50ZigidXNhZ2U6ICVzIGxvY2FsLWZpbGVzXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgZnRwY29kZSA9IC0xOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1uYW1lID0gYXJndlswXTsKKyAgICBtZmxhZyA9IDE7CisgICAgb2xkaW50ciA9IHNpZ25hbChTSUdJTlQsIG1jYW5jZWwpOworCisgICAgLyogUmVwbGFjZSB3aXRoIGNhbGxzIHRvIGNjX2V4ZWN1dGUoKSAqLworICAgIHNldGptcChqY2FuY2VsKTsKKyNpZmRlZiBGVFBfUFJPWFkKKyAgICBpZiAocHJveHkpIHsKKyAgICAgICAgY2hhciAqY3AsICp0cDIsIHRtcGJ1ZltDS01BWFBBVEhdOworCisgICAgICAgIHdoaWxlICgoY3AgPSByZW1nbG9iKGFyZ3YsMCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICgqY3AgPT0gMCkgeworICAgICAgICAgICAgICAgIG1mbGFnID0gMDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZmxhZyAmJiBjb25maXJtKGFyZ3ZbMF0sIGNwKSkgeworICAgICAgICAgICAgICAgIHRwID0gY3A7CisgICAgICAgICAgICAgICAgaWYgKG1jYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqdHAgJiYgIWlzbG93ZXIoKnRwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHArKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoISp0cCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHAgPSBjcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwMiA9IHRtcGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKnRwMiA9ICp0cCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3VwcGVyKCp0cDIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0cDIgPSAnYScgKyAqdHAyIC0gJ0EnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwMisrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRwID0gdG1wYnVmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnRmbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIHRwID0gZG90cmFucyh0cCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtYXBmbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIHRwID0gZG9tYXAodHApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZW5kcmVxdWVzdCgoc3VuaXF1ZSkgPyAiU1RPVSIgOiAiU1RPUiIsIGNwLCB0cCwgMCwgLTEsIC0xLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1mbGFnICYmIGZyb21hdHR5KSB7CisgICAgICAgICAgICAgICAgICAgIG9pbnRlciA9IGludGVyYWN0aXZlOworICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25maXJtKCJDb250aW51ZSB3aXRoIiwibXB1dCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZmxhZysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlID0gb2ludGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzaWduYWwoU0lHSU5ULCBvbGRpbnRyKTsKKyAgICAgICAgbWZsYWcgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIEZUUF9QUk9YWSAqLworICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgcmVnaXN0ZXIgY2hhciAqKmNwcCwgKipnYXJnczsKKworICAgICAgICBpZiAobWZsYWcgJiYgY29uZmlybShhcmd2WzBdLCBhcmd2W2ldKSkgeworICAgICAgICAgICAgdHAgPSBhcmd2W2ldOworICAgICAgICAgICAgc2VuZHJlcXVlc3QoKGZ0cF91c24pID8gIlNUT1UiIDogIlNUT1IiLCBhcmd2W2ldLCB0cCwgMCwtMSwtMSwgMCk7CisgICAgICAgICAgICBpZiAoIW1mbGFnICYmIGZyb21hdHR5KSB7CisgICAgICAgICAgICAgICAgb2ludGVyID0gaW50ZXJhY3RpdmU7CisgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgPSAxOworICAgICAgICAgICAgICAgIGlmIChjb25maXJtKCJDb250aW51ZSB3aXRoIiwibXB1dCIpKSB7CisgICAgICAgICAgICAgICAgICAgIG1mbGFnKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludGVyYWN0aXZlID0gb2ludGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGdhcmdzID0gZnRwZ2xvYihhcmd2W2ldKTsKKyAgICAgICAgaWYgKGdsb2JlcnIgIT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRmKCIlc1xuIiwgZ2xvYmVycik7CisgICAgICAgICAgICBpZiAoZ2FyZ3MpIHsKKyAgICAgICAgICAgICAgICBibGtmcmVlKGdhcmdzKTsKKyAgICAgICAgICAgICAgICBmcmVlKChjaGFyICopZ2FyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjcHAgPSBnYXJnczsgY3BwICYmICpjcHAgIT0gTlVMTDsgY3BwKyspIHsKKyAgICAgICAgICAgIGlmIChtZmxhZyAmJiBjb25maXJtKGFyZ3ZbMF0sICpjcHApKSB7CisgICAgICAgICAgICAgICAgdHAgPSAqY3BwOworICAgICAgICAgICAgICAgIHNlbmRyZXF1ZXN0KChzdW5pcXVlKSA/ICJTVE9VIjoiU1RPUiIsICpjcHAsIHRwLCAwLCAtMSwgLTEsIDApOworICAgICAgICAgICAgICAgIGlmICghbWZsYWcgJiYgZnJvbWF0dHkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2ludGVyID0gaW50ZXJhY3RpdmU7CisgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpcm0oIkNvbnRpbnVlIHdpdGgiLCJtcHV0IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1mbGFnKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgPSBvaW50ZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChnYXJncyAhPSBOVUxMKSB7CisgICAgICAgICAgICBibGtmcmVlKGdhcmdzKTsKKyAgICAgICAgICAgIGZyZWUoKGNoYXIgKilnYXJncyk7CisgICAgICAgIH0KKyAgICB9CisgICAgc2lnbmFsKFNJR0lOVCwgb2xkaW50cik7CisgICAgbWZsYWcgPSAwOworfQorCisvKiBHZXQgbXVsdGlwbGUgZmlsZXMgKi8KKworc3RhdGljIGludAorZnRwX21nZXQoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKiphcmd2OyB7CisgICAgaW50IHJjID0gLTE7CisgICAgc2lnX3Qgb2xkaW50cjsKKyAgICBpbnQgb2ludGVyOworICAgIGNoYXIgKmNwLCAqdHAsICp0cDIsIHRtcGJ1ZltDS01BWFBBVEhdOworICAgIHNpZ3R5cGUgbWNhbmNlbCgpOworCisgICAgaWYgKGFyZ2MgPCAyICYmICFhbm90aGVyKCZhcmdjLCAmYXJndiwgInJlbW90ZS1maWxlcyIpKSB7CisgICAgICAgIHByaW50ZigidXNhZ2U6ICVzIHJlbW90ZS1maWxlc1xuIiwgYXJndlswXSk7CisgICAgICAgIGZ0cGNvZGUgPSAtMTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgbW5hbWUgPSBhcmd2WzBdOworICAgIG1mbGFnID0gMTsKKyAgICBvbGRpbnRyID0gc2lnbmFsKFNJR0lOVCxtY2FuY2VsKTsKKyAgICAvKiBSZXBsYWNlIHdpdGggY2FsbHMgdG8gY2NfZXhlY3V0ZSgpICovCisgICAgc2V0am1wKGpjYW5jZWwpOworICAgIHdoaWxlICgoY3AgPSByZW1nbG9iKGFyZ3YscHJveHkpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmICgqY3AgPT0gJ1wwJykgeworICAgICAgICAgICAgbWZsYWcgPSAwOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1mbGFnICYmIGNvbmZpcm0oYXJndlswXSwgY3ApKSB7CisgICAgICAgICAgICB0cCA9IGNwOworICAgICAgICAgICAgaWYgKG1jYXNlKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCp0cCAmJiAhaXNsb3dlcigqdHApKSB7CisgICAgICAgICAgICAgICAgICAgIHRwKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghKnRwKSB7CisgICAgICAgICAgICAgICAgICAgIHRwID0gY3A7CisgICAgICAgICAgICAgICAgICAgIHRwMiA9IHRtcGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgqdHAyID0gKnRwKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXN1cHBlcigqdHAyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0cDIgPSAnYScgKyAqdHAyIC0gJ0EnOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdHArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwMisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRwID0gdG1wYnVmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmMgPSAocmVjdnJlcXVlc3QoIlJFVFIiLCB0cCwgY3AsICJ3YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAgIT0gY3AgfHwgIWludGVyYWN0aXZlKSA9PSAwLDAsTlVMTCwwLDAsMCk7CisgICAgICAgICAgICBpZiAoIW1mbGFnICYmIGZyb21hdHR5KSB7CisgICAgICAgICAgICAgICAgb2ludGVyID0gaW50ZXJhY3RpdmU7CisgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgPSAxOworICAgICAgICAgICAgICAgIGlmIChjb25maXJtKCJDb250aW51ZSB3aXRoIiwibWdldCIpKSB7CisgICAgICAgICAgICAgICAgICAgIG1mbGFnKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludGVyYWN0aXZlID0gb2ludGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHNpZ25hbChTSUdJTlQsb2xkaW50cik7CisgICAgbWZsYWcgPSAwOworICAgIHJldHVybihyYyk7Cit9CisKKy8qIERlbGV0ZSBtdWx0aXBsZSBmaWxlcyAqLworCitzdGF0aWMgaW50CittZGVsZXRlKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICoqYXJndjsgeworICAgIHNpZ190IG9sZGludHI7CisgICAgaW50IG9pbnRlcjsKKyAgICBjaGFyICpjcDsKKyAgICBzaWd0eXBlIG1jYW5jZWwoKTsKKworICAgIGlmIChhcmdjIDwgMiAmJiAhYW5vdGhlcigmYXJnYywgJmFyZ3YsICJyZW1vdGUtZmlsZXMiKSkgeworICAgICAgICBwcmludGYoInVzYWdlOiAlcyByZW1vdGUtZmlsZXNcbiIsIGFyZ3ZbMF0pOworICAgICAgICBmdHBjb2RlID0gLTE7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIG1uYW1lID0gYXJndlswXTsKKyAgICBtZmxhZyA9IDE7CisgICAgb2xkaW50ciA9IHNpZ25hbChTSUdJTlQsIG1jYW5jZWwpOworICAgIC8qIFJlcGxhY2Ugd2l0aCBjYWxscyB0byBjY19leGVjdXRlKCkgKi8KKyAgICBzZXRqbXAoamNhbmNlbCk7CisgICAgd2hpbGUgKChjcCA9IHJlbWdsb2IoYXJndiwwKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoKmNwID09ICdcMCcpIHsKKyAgICAgICAgICAgIG1mbGFnID0gMDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChtZmxhZyAmJiBjb25maXJtKGFyZ3ZbMF0sIGNwKSkgeworICAgICAgICAgICAgcmMgPSAoZnRwY21kKCJERUxFIixjcCwtMSwtMSxmdHBfdmJtKSA9PSBSRVBMWV9DT01QTEVURSk7CisgICAgICAgICAgICBpZiAoIW1mbGFnICYmIGZyb21hdHR5KSB7CisgICAgICAgICAgICAgICAgb2ludGVyID0gaW50ZXJhY3RpdmU7CisgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgPSAxOworICAgICAgICAgICAgICAgIGlmIChjb25maXJtKCJDb250aW51ZSB3aXRoIiwgIm1kZWxldGUiKSkgeworICAgICAgICAgICAgICAgICAgICBtZmxhZysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZSA9IG9pbnRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzaWduYWwoU0lHSU5ULCBvbGRpbnRyKTsKKyAgICBtZmxhZyA9IDA7CisgICAgcmV0dXJuKHJjKTsKK30KKworLyogR2V0IGEgZGlyZWN0b3J5IGxpc3Rpbmcgb2YgbXVsdGlwbGUgcmVtb3RlIGZpbGVzICovCisKK3N0YXRpYyBpbnQKK21scyhhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqKmFyZ3Y7IHsKKyAgICBzaWdfdCBvbGRpbnRyOworICAgIGludCBvaW50ZXIsIGk7CisgICAgY2hhciAqY21kLCBtb2RlWzFdLCAqZGVzdDsKKyAgICBzaWd0eXBlIG1jYW5jZWwoKTsKKyAgICBpbnQgcmMgPSAtMTsKKworICAgIGlmIChhcmdjIDwgMiAmJiAhYW5vdGhlcigmYXJnYywgJmFyZ3YsICJyZW1vdGUtZmlsZXMiKSkKKyAgICAgIGdvdG8gdXNhZ2U7CisgICAgaWYgKGFyZ2MgPCAzICYmICFhbm90aGVyKCZhcmdjLCAmYXJndiwgImxvY2FsLWZpbGUiKSkgeworICAgICAgdXNhZ2U6CisgICAgICAgIHByaW50ZigidXNhZ2U6ICVzIHJlbW90ZS1maWxlcyBsb2NhbC1maWxlXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgZnRwY29kZSA9IC0xOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBkZXN0ID0gYXJndlthcmdjIC0gMV07CisgICAgYXJndlthcmdjIC0gMV0gPSBOVUxMOworICAgIGlmIChzdHJjbXAoZGVzdCwgIi0iKSAmJiAqZGVzdCAhPSAnfCcpCisgICAgICBpZiAoIWdsb2J1bGl6ZSgmZGVzdCkgfHwKKyAgICAgICAgICAhY29uZmlybSgib3V0cHV0IHRvIGxvY2FsLWZpbGU6IiwgZGVzdCkpIHsKKyAgICAgICAgICBmdHBjb2RlID0gLTE7CisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgIH0KKyAgICBjbWQgPSBhcmd2WzBdWzFdID09ICdsJyA/ICJOTFNUIiA6ICJMSVNUIjsKKyAgICBtbmFtZSA9IGFyZ3ZbMF07CisgICAgbWZsYWcgPSAxOworICAgIG9sZGludHIgPSBzaWduYWwoU0lHSU5ULCBtY2FuY2VsKTsKKyAgICAvKiBSZXBsYWNlIHdpdGggY2FsbHMgdG8gY2NfZXhlY3V0ZSgpICovCisgICAgc2V0am1wKGpjYW5jZWwpOworICAgIGZvciAoaSA9IDE7IG1mbGFnICYmIGkgPCBhcmdjLTE7ICsraSkgeworICAgICAgICAqbW9kZSA9IChpID09IDEpID8gJ3cnIDogJ2EnOworICAgICAgICByYyA9IHJlY3ZyZXF1ZXN0KGNtZCwgZGVzdCwgYXJndltpXSwgbW9kZSwgMCwwLE5VTEwsMCwwLDApOworICAgICAgICBpZiAoIW1mbGFnICYmIGZyb21hdHR5KSB7CisgICAgICAgICAgICBvaW50ZXIgPSBpbnRlcmFjdGl2ZTsKKyAgICAgICAgICAgIGludGVyYWN0aXZlID0gMTsKKyAgICAgICAgICAgIGlmIChjb25maXJtKCJDb250aW51ZSB3aXRoIiwgYXJndlswXSkpIHsKKyAgICAgICAgICAgICAgICBtZmxhZyArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVyYWN0aXZlID0gb2ludGVyOworICAgICAgICB9CisgICAgfQorICAgIHNpZ25hbChTSUdJTlQsIG9sZGludHIpOworICAgIG1mbGFnID0gMDsKKyAgICByZXR1cm4ocmMpOworfQorCitzdGF0aWMgY2hhciAqCityZW1nbG9iKGFyZ3YsZG9zd2l0Y2gpIGNoYXIgKmFyZ3ZbXTsgaW50IGRvc3dpdGNoOyB7CisgICAgY2hhciB0ZW1wWzE2XTsKKyAgICBzdGF0aWMgY2hhciBidWZbQ0tNQVhQQVRIXTsKKyAgICBzdGF0aWMgRklMRSAqZnRlbXAgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICoqYXJnczsKKyAgICBpbnQgb2xkaGFzaDsKKyAgICBjaGFyICpjcCwgKm1vZGU7CisKKyAgICBpZiAoIW1mbGFnKSB7CisgICAgICAgIGlmICghZG9nbG9iKSB7CisgICAgICAgICAgICBhcmdzID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChmdGVtcCkgeworICAgICAgICAgICAgICAgICh2b2lkKSBmY2xvc2UoZnRlbXApOworICAgICAgICAgICAgICAgIGZ0ZW1wID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgfQorICAgIGlmICghZG9nbG9iKSB7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgICAgYXJncyA9IGFyZ3Y7CisgICAgICAgIGlmICgoY3AgPSAqKythcmdzKSA9PSBOVUxMKQorICAgICAgICAgIGFyZ3MgPSBOVUxMOworICAgICAgICByZXR1cm4oY3ApOworICAgIH0KKyAgICBpZiAoZnRlbXAgPT0gTlVMTCkgeworICAgICAgICAodm9pZCkgc3RyY3B5KHRlbXAsIF9QQVRIX1RNUCk7CisjaWZkZWYgTUtURU1QCisjaWZuZGVmIE1LU1RFTVAKKyAgICAgICAgKHZvaWQpIG1rdGVtcCh0ZW1wKTsKKyNlbmRpZiAvKiBNS1NURU1QICovCisjZW5kaWYgLyogTUtURU1QICovCisgICAgICAgIHZlcmJvc2UgPSAwOworICAgICAgICBvbGRoYXNoID0gaGFzaCwgaGFzaCA9IDA7CisjaWZkZWYgRlRQX1BST1hZCisgICAgICAgIGlmIChkb3N3aXRjaCkgeworICAgICAgICAgICAgcHN3aXRjaCghcHJveHkpOworICAgICAgICB9CisjZW5kaWYgLyogRlRQX1BST1hZICovCisgICAgICAgIGZvciAobW9kZSA9ICJ3YiI7ICorK2FyZ3YgIT0gTlVMTDsgbW9kZSA9ICJhYiIpCisgICAgICAgICAgcmVjdnJlcXVlc3QgKCJOTFNUIiwgdGVtcCwgKmFyZ3YsIG1vZGUsIDApOworI2lmZGVmIEZUUF9QUk9YWQorICAgICAgICBpZiAoZG9zd2l0Y2gpIHsKKyAgICAgICAgICAgIHBzd2l0Y2goIXByb3h5KTsKKyAgICAgICAgfQorI2VuZGlmIC8qIEZUUF9QUk9YWSAqLworICAgICAgICBoYXNoID0gb2xkaGFzaDsKKyAgICAgICAgZnRlbXAgPSBmb3Blbih0ZW1wLCAiciIpOworICAgICAgICB1bmxpbmsodGVtcCk7CisgICAgICAgIGlmIChmdGVtcCA9PSBOVUxMICYmICghZHB5YWN0aXZlIHx8IGZ0cF9kZWIpKSB7CisgICAgICAgICAgICBwcmludGYoIkNhbid0IGZpbmQgbGlzdCBvZiByZW1vdGUgZmlsZXMsIG9vcHNcbiIpOworICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmZ2V0cyhidWYsIENLTUFYUEFUSCwgZnRlbXApID09IE5VTEwpIHsKKyAgICAgICAgZmNsb3NlKGZ0ZW1wKSwgZnRlbXAgPSBOVUxMOworICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgfQorICAgIGlmICgoY3AgPSBja3N0cmNocihidWYsJ1xuJykpICE9IE5VTEwpCisgICAgICAqY3AgPSAnXDAnOworICAgIHJldHVybihidWYpOworfQorI2VuZGlmIC8qIE5PVF9VU0VEICovCisjZW5kaWYgLyogVENQU09DS0VUICh0b3Agb2YgZmlsZSkgKi8KKyNlbmRpZiAvKiBTWVNGVFAgKHRvcCBvZiBmaWxlKSAqLworI2VuZGlmIC8qIE5PRlRQICh0b3Agb2YgZmlsZSkgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja2NrZXIuaCBiL2NrZXJtaXQtOC4wLjIxMS9ja2NrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzkyYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrY2tlci5oCkBAIC0wLDAgKzEsMTQxOCBAQAorLyogY2tja2VyLmggLS0gU3ltYm9sIGFuZCBtYWNybyBkZWZpbml0aW9ucyBmb3IgQy1LZXJtaXQgKi8KKworLyoKKyAgQXV0aG9yOiBGcmFuayBkYSBDcnV6IDxmZGNAY29sdW1iaWEuZWR1PiwKKyAgQ29sdW1iaWEgVW5pdmVyc2l0eSBBY2FkZW1pYyBJbmZvcm1hdGlvbiBTeXN0ZW1zLCBOZXcgWW9yayBDaXR5LgorCisgIENvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisqLworCisjaWZuZGVmIENLQ0tFUl9ICisjZGVmaW5lIENLQ0tFUl9ICisKKyNkZWZpbmUgSV9BTV9LRVJNSVQgIDAJCQkvKiBQZXJzb25hbGl0aWVzICovCisjZGVmaW5lIElfQU1fVEVMTkVUICAxCisjZGVmaW5lIElfQU1fUkxPR0lOICAyCisjZGVmaW5lIElfQU1fSUtTRCAgICAzCisjZGVmaW5lIElfQU1fRlRQICAgICA0CisjZGVmaW5lIElfQU1fSFRUUCAgICA1CisjZGVmaW5lIElfQU1fU1NIU1VCICA2CisjZGVmaW5lIElfQU1fU1NIICAgICA3CisKKyNpZm5kZWYgTk9TVFJFQU1JTkcKKyNpZm5kZWYgU1RSRUFNSU5HCisjZGVmaW5lIFNUUkVBTUlORworI2VuZGlmIC8qIFNUUkVBTUlORyAqLworI2VuZGlmIC8qIE5PU1RSRUFNSU5HICovCisvKgorICBJZiBORVdERUZBVUxUUyBpcyBkZWZpbmVkIHRoZW46CisgICAtIFJFQ0VJVkUgUEFDS0VULUxFTkdUSCBpcyA0MDk1IHJhdGhlciB0aGFuIDkwCisgICAtIFdJTkRPVyBpcyAzMCByYXRoZXIgdGhhbiAxCisgICAtIEJMT0NLLUNIRUNLIGlzIDMgcmF0aGVyIHRoYW4gMQorICAgLSBGSUxFIFRZUEUgaXMgQklOQVJZIHJhdGhlciB0aGFuIFRFWFQKKyovCisjaWZkZWYgQklHQlVGT0sJCQkJLyogKHdhcyBPUzIpICovCisjaWZuZGVmIE5FV0RFRkFVTFRTCisjZGVmaW5lIE5FV0RFRkFVTFRTCisjZW5kaWYgLyogTkVXREVGQVVMVFMgKi8KKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworCisjaWZkZWYgTk9JQ1AJCQkJLyogTm8gSW50ZXJhY3RpdmUgQ29tbWFuZCBQYXJzZXIgKi8KKyNpZm5kZWYgTk9TUEwJCQkJLyogaW1wbGllcy4uLiAqLworI2RlZmluZSBOT1NQTAkJCQkvKiBObyBTY3JpcHQgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBOT0NTRVRTCQkJCS8qIE5vIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gKi8KKyNkZWZpbmUgTk9DU0VUUwkJCQkvKiBiZWNhdXNlIHRoZSBvbmx5IHdheSB0byBzZXQgaXQgdXAgKi8KKyNlbmRpZiAvKiBOT0NTRVRTICovCQkJLyogaXMgd2l0aCBpbnRlcmFjdGl2ZSBjb21tYW5kcyAqLworI2VuZGlmIC8qIE5PSUNQICovCisKKyNpZmRlZiBwZHAxMQkJCQkvKiBUaGVyZSBpcyBhIG1heGltdW0gbnVtYmVyIG9mICovCisjaWZuZGVmIE5PQ0tTUEVFRAkJCS8qIG9mIC1EJ3MgYWxsb3dlZCBvbiB0aGUgQ0MgKi8KKyNkZWZpbmUgTk9DS1NQRUVECQkJLyogY29tbWFuZCBsaW5lLCBzbyBzb21lIG9mIHRoZW0gKi8KKyNlbmRpZiAvKiBOT0NLU1BFRUQgKi8JCQkvKiBoYXZlIHRvIGdvIGhlcmUuLi4gKi8KKyNpZm5kZWYgTk9SRURJUkVDVAorI2RlZmluZSBOT1JFRElSRUNUCisjZW5kaWYgLyogTk9SRURJUkVDVCAqLworI2lmZGVmIFdIQVRBTUkKKyN1bmRlZiBXSEFUQU1JCisjZW5kaWYgLyogV0hBVEFNSSAqLworI2VuZGlmIC8qIHBkcDExICovCisKKyNpZmRlZiBVSURCVUZMRU4KKyNkZWZpbmUgTE9HSU5MRU4gVUlEQlVGTEVOCisjZWxzZQorI2RlZmluZSBMT0dJTkxFTiAzMgkJCS8qIExlbmd0aCBvZiBzZXJ2ZXIgbG9naW4gZmllbGQgKi8KKyNlbmRpZiAvKiBVSURCVUZMRU4gKi8KKworLyogQmVsbCB2YWx1ZXMgKi8KKworI2RlZmluZSBYWUJfTk9ORSAgMAkJCS8qIE5vIGJlbGwgKi8KKyNkZWZpbmUgWFlCX0FVRCAgIDEJCQkvKiBBdWRpYmxlIGJlbGwgKi8KKyNkZWZpbmUgWFlCX1ZJUyAgIDIJCQkvKiBWaXNpYmxlIGJlbGwgKi8KKyNkZWZpbmUgWFlCX0JFRVAgIDAJCQkvKiBBdWRpYmxlIEJlZXAgKi8KKyNkZWZpbmUgWFlCX1NZUyAgIDQJCQkvKiBBdWRpYmxlIFN5c3RlbSBTb3VuZHMgKi8KKworLyogRmlsZSBzdGF0dXMgYml0cyAqLworCisjZGVmaW5lIEZTX09LICAgMQkJCS8qIEZpbGUgdHJhbnNmZXJyZWQgT0sgKi8KKyNkZWZpbmUgRlNfUkVGVSAyCQkJLyogRmlsZSB3YXMgcmVmdXNlZCAqLworI2RlZmluZSBGU19ESVNDIDQJCQkvKiBGaWxlIHdhcyBkaXNjYXJkZWQgKi8KKyNkZWZpbmUgRlNfSU5UUiA4CQkJLyogVHJhbnNmZXIgd2FzIGludGVycnVwdGVkIGJ5IHVzZXIgKi8KKyNkZWZpbmUgRlNfRVJSICAxNgkJCS8qIEZhdGFsIGVycm9yIGR1cmluZyB0cmFuc2ZlciAqLworCisvKiBDb250cm9sLWNoYXJhY3RlciAodW4pcHJlZml4aW5nIG9wdGlvbnMgKi8KKworI2RlZmluZSBQWF9BTEwgIDAJCQkvKiBQcmVmaXggYWxsIGNvbnRyb2wgY2hhcnMgKi8KKyNkZWZpbmUgUFhfQ0FVICAxCQkJLyogVW5wcmVmaXggY2F1dGlvdXNseSAqLworI2RlZmluZSBQWF9XSUwgIDIJCQkvKiBVbnByZWZpeCB3aXRoIHdpbGQgYWJhbmRvbiAqLworI2RlZmluZSBQWF9OT04gIDMJCQkvKiBVbnByZWZpeCBhbGwgKD0gcHJlZml4IG5vbmUpICovCisKKy8qIERlc3RpbmF0aW9uIGNvZGVzICovCisKKyNkZWZpbmUgIERFU1RfRCAwCS8qICBESVNLICovCisjZGVmaW5lICBERVNUX1MgMQkvKiAgU0NSRUVOICovCisjZGVmaW5lICBERVNUX1AgMgkvKiAgUFJJTlRFUiAqLworI2RlZmluZSAgREVTVF9OIDMJLyogIE5PV0hFUkUgKGNhbGlicmF0aW9uIHJ1bikgKi8KKworLyogRmlsZSB0cmFuc2ZlciBwcm90b2NvbHMgKi8KKworI2RlZmluZSAgUFJPVE9fSyAgICAwCS8qICAgS2VybWl0ICAgKi8KKyNpZmRlZiBDS19YWVoKKyNkZWZpbmUgIFBST1RPX1ggICAgMQkvKiAgIFhNT0RFTSAgICAgKi8KKyNkZWZpbmUgIFBST1RPX1hDICAgMgkvKiAgIFhNT0RFTS1DUkMgKi8KKyNkZWZpbmUgIFBST1RPX1kgICAgMwkvKiAgIFlNT0RFTSAgICAgKi8KKyNkZWZpbmUgIFBST1RPX0cgICAgNAkvKiAgIFlNT0RFTS1nICovCisjZGVmaW5lICBQUk9UT19aICAgIDUJLyogICBaTU9ERU0gICAqLworI2RlZmluZSAgUFJPVE9fTyAgICA2ICAgLyogICBPVEhFUiAgICAqLworI2RlZmluZSAgTlBST1RPUyAgICA3ICAgLyogICBIb3cgbWFueSAqLworI2Vsc2UKKyNkZWZpbmUgIE5QUk9UT1MgICAgMSAgIC8qICAgSG93IG1hbnkgKi8KKyNlbmRpZiAvKiBDS19YWVogKi8KKworc3RydWN0IGNrX3AgewkJCQkvKiBDLUtlcm1pdCBQcm90b2NvbCBpbmZvIHN0cnVjdHVyZSAqLworICAgIGNoYXIgKiBwX25hbWU7CQkJLyogUHJvdG9jb2wgbmFtZSAqLworICAgIGludCBycGt0bGVuOwkJCS8qIFBhY2tldCBsZW5ndGggLSByZWNlaXZlICovCisgICAgaW50IHNwa3RsZW47CQkJLyogUGFja2V0IGxlbmd0aCAtIHNlbmQgKi8KKyAgICBpbnQgc3BrdGZsZzsJCQkvKiAuLi4gKi8KKyAgICBpbnQgd2luc2l6ZTsJCQkvKiBXaW5kb3cgc2l6ZSAqLworICAgIGludCBwcmVmaXg7CQkJCS8qIENvbnRyb2wtY2hhciBwcmVmaXhpbmcgb3B0aW9ucyAqLworICAgIGludCBmbmNhOwkJCQkvKiBGaWxlbmFtZSBjb2xsaXNpb24gYWN0aW9uICovCisgICAgaW50IGZuY247CQkJCS8qIEZpbGVuYW1lIGNvbnZlcnNpb24gKi8KKyAgICBpbnQgZm5zcDsJCQkJLyogU2VuZCBmaWxlbmFtZSBwYXRoIHN0cmlwcGluZyAqLworICAgIGludCBmbnJwOwkJCQkvKiBSZWNlaXZlIGZpbGVuYW1lIHBhdGggc3RyaXBwaW5nICovCisgICAgY2hhciAqIGhfYl9pbml0OwkJLyogSG9zdCByZWNlaXZlIGluaXRpYXRpb24gc3RyaW5nIC0gdGV4dCAgICovCisgICAgY2hhciAqIGhfdF9pbml0OwkJLyogSG9zdCByZWNlaXZlIGluaXRpYXRpb24gc3RyaW5nIC0gYmluYXJ5ICovCisgICAgY2hhciAqIGhfeF9pbml0OwkJLyogSG9zdCBzZXJ2ZXIgc3RyaW5nICovCisgICAgY2hhciAqIHBfYl9zY21kOwkJLyogU0VORCBjbWQgZm9yIGV4dGVybmFsIHByb3RvY29sIC0gdGV4dCAgICovCisgICAgY2hhciAqIHBfdF9zY21kOwkJLyogU0VORCBjbWQgZm9yIGV4dGVybmFsIHByb3RvY29sIC0gYmluYXJ5ICovCisgICAgY2hhciAqIHBfYl9yY21kOwkJLyogUkVDViBjbWQgZm9yIGV4dGVybmFsIHByb3RvY29sIC0gdGV4dCAgICovCisgICAgY2hhciAqIHBfdF9yY21kOwkJLyogUkVDViBjbWQgZm9yIGV4dGVybmFsIHByb3RvY29sIC0gYmluYXJ5ICovCit9OworCitzdHJ1Y3QgZmlsZWxpc3QgewkJCS8qIFNlbmQtZmlsZSBsaXN0IGVsZW1lbnQgKi8KKyAgICBjaGFyICogZmxfbmFtZTsJCQkvKiBGaWxlbmFtZSAqLworICAgIGludCBmbF9tb2RlOwkJCS8qIFRyYW5zZmVyIG1vZGUgKi8KKyAgICBjaGFyICogZmxfYWxpYXM7CQkJLyogTmFtZSB0byBzZW5kIHRoZSBmaWxlIHVuZGVyICovCisgICAgc3RydWN0IGZpbGVsaXN0ICogZmxfbmV4dDsJCS8qIFBvaW50ZXIgdG8gbmV4dCBlbGVtZW50ICovCit9OworCisvKiBLZXJtaXQgc3lzdGVtIElEcyBhbmQgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzLi4uICovCisKK3N0cnVjdCBzeXNkYXRhIHsKKyAgICBjaGFyICpzaWRfY29kZTsJLyogS2VybWl0IHN5c3RlbSBJRCBjb2RlICovCisgICAgY2hhciAqc2lkX25hbWU7CS8qIERlc2NyaXB0aXZlIG5hbWUgKi8KKyAgICBzaG9ydCBzaWRfdW5peGxpa2U7CS8qIFRyZWUtc3RydWN0dXJlZCBkaXJlY3Rvcnkgd2l0aCBzZXBhcmF0b3JzICovCisgICAgY2hhciAgc2lkX2RpcnNlcDsJLyogRGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXIgaWYgdW5peGxpa2UgKi8KKyAgICBzaG9ydCBzaWRfZGV2OwkvKiBDYW4gc3RhcnQgd2l0aCBkZXY6ICovCisgICAgc2hvcnQgc2lkX2Nhc2U7CS8qIEJpdCBtYXBwZWQ6IDEgPSBjYXNlIG1hdHRlcnMsIDIgPSBjYXNlIHByZXNlcnZlZCAqLworICAgIHNob3J0IHNpZF9yZWNmbTsgICAgLyogVGV4dCByZWNvcmQgc2VwYXJhdG9yICovCisvKgorICAgMCA9IHVua25vd24gb3Igbm9uc3RyZWFtCisgICAxID0gY3IKKyAgIDIgPSBsZgorICAgMyA9IGNybGYKKyovCit9OworCitzdHJ1Y3Qgc3NoX3BmIHsJCQkJLyogU1NIIHBvcnQgZm9yd2FyZGluZyAqLworICAgIGludCAgICBwMTsJCQkJLyogcG9ydCB0byBiZSBmb3J3YXJkZWQgKi8KKyAgICBjaGFyICogaG9zdDsJCQkvKiBob3N0ICovCisgICAgaW50ICAgIHAyOwkJCQkvKiBwb3J0ICovCit9OworCisjZGVmaW5lIFNFVF9PTiAgIDEJLyogR2VuZXJhbCB2YWx1ZXMgZm9yIHNldHRpbmdzIHRoYXQgY2FuIGJlIE9OICovCisjZGVmaW5lIFNFVF9PRkYgIDAJCQkvKiBPRkYsICovCisjZGVmaW5lIFNFVF9BVVRPIDIJCQkvKiBvciBBVVRPICovCisKKyNkZWZpbmUgUEFUSF9PRkYgMAkvKiBQYXRobmFtZXMgb2ZmICh0byBiZSBzdHJpcHBlZCkgKi8KKyNkZWZpbmUgUEFUSF9SRUwgMSAgICAgIC8qIFBhdGhuYW1lcyBvbiwgbGVmdCByZWxhdGl2ZSBpZiBwb3NzaWJsZSAqLworI2RlZmluZSBQQVRIX0FCUyAyICAgICAgLyogUGF0aG5hbWVzIGFic29sdXRlIGFsd2F5cyAqLworI2RlZmluZSBQQVRIX0FVVE8gNAkvKiBQYXRobmFtZXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5ICovCisKKy8qIEdFVCBPcHRpb25zICovCisKKyNkZWZpbmUgR09QVF9ERUwgMQkJCS8qIERlbGV0ZSBzb3VyY2UgZmlsZSAqLworI2RlZmluZSBHT1BUX1JFQyAyCQkJLyogUmVjdXJzaXZlICovCisjZGVmaW5lIEdPUFRfUkVTIDQJCQkvKiBSZWNvdmVyIChSZXNlbmQpICovCisjZGVmaW5lIEdPUFRfQ01EIDgJCQkvKiBGaWxlbmFtZSBpcyBhIENvbW1hbmQgKi8KKworLyogR0VUIFRyYW5zZmVyIE1vZGVzICovCisKKyNkZWZpbmUgR01PRF9UWFQgMAkJCS8qIFRleHQgKi8KKyNkZWZpbmUgR01PRF9CSU4gMQkJCS8qIEJpbmFyeSAqLworI2RlZmluZSBHTU9EX0FVVCAyCQkJLyogQXV0byAqLworI2RlZmluZSBHTU9EX0xCTCAzCQkJLyogTGFiZWxlZCAqLworCisvKiBHRVQgRmlsZW5hbWUgT3B0aW9ucyAqLworCisjZGVmaW5lIEdOQU1fTElUIDAJCQkvKiBMaXRlcmFsICovCisjZGVmaW5lIEdOQU1fQ05WIDEJCQkvKiBDb252ZXJ0ZWQgKi8KKworLyogR0VUIFBhdGhuYW1lIE9wdGlvbnMgKi8KKworI2RlZmluZSBHUFRIX09GRiAwCQkJLyogUGF0aG5hbWVzIE9mZiAqLworI2RlZmluZSBHUFRIX1JFTCAxCQkJLyogUGF0aG5hbWVzIFJlbGF0aXZlICovCisjZGVmaW5lIEdQVEhfQUJYIDIJCQkvKiBQYXRobmFtZXMgQWJzb2x1dGUgKi8KKworI2lmbmRlZiBOT1NQTAorLyoKKyAgVGhlIElGIFJFTU9URS1PTkxZIGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9ubHkgaW4gdmVyc2lvbnMKKyAgdGhhdCBhY3R1YWxseSBjYW4gYmUgdXNlZCBpbiByZW1vdGUgbW9kZSwgYW5kIG9ubHkgaWYgd2UgaGF2ZQorICBhbiBpbnRlcmFjdGl2ZSBjb21tYW5kIHBhcnNlci4KKyovCisjZGVmaW5lIENLX0lGUk8KKyNpZmRlZiBNQUMKKyN1bmRlZiBDS19JRlJPCisjZWxzZQorI2lmZGVmIEdFTURPUworI3VuZGVmIENLX0lGUk8KKyNlbmRpZiAvKiBHRU1ET1MgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisvKiBTeXN0ZW1zIHdob3NlIENPTk5FQ1QgbW9kdWxlcyBjYW4gZXhlY3V0ZSBBcHBsaWNhdGlvbiBQcm9ncmFtIENvbW1hbmRzICovCisKKyNpZmRlZiBOT1NQTAkJCQkvKiBTY3JpcHQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgKi8KKyNpZmRlZiBDS19BUEMJCQkJLyogaXMgcmVxdWlyZWQgZm9yIEFQQy4gKi8KKyN1bmRlZiBDS19BUEMKKyNlbmRpZiAvKiBDS19BUEMgKi8KKyNpZm5kZWYgTk9BUEMKKyNkZWZpbmUgTk9BUEMKKyNlbmRpZiAvKiBOT0FQQyAqLworI2lmbmRlZiBOT0FVVE9ETAorI2RlZmluZSBOT0FVVE9ETAorI2VuZGlmIC8qIE5PQVVUT0RMICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT0FQQwkJCQkvKiBVbmxlc3MgdGhleSBzYWlkIE5PIEFQQyAqLworI2lmbmRlZiBDS19BUEMJCQkJLyogQW5kIHRoZXkgZGlkbid0IGFscmVhZHkgZGVmaW5lIGl0ICovCisjaWZkZWYgT1MyCQkJCS8qIE9TLzIgZ2V0cyBpdCAqLworI2RlZmluZSBDS19BUEMKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBVTklYCQkJCS8qIFVOSVggZ2V0cyBpdCAqLworI2RlZmluZSBDS19BUEMKKyNlbmRpZiAvKiBVTklYICovCisjaWZkZWYgVk1TCQkJCS8qIFZNUyB0b28gKi8KKyNkZWZpbmUgQ0tfQVBDCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogQ0tfQVBDICovCisjZW5kaWYgLyogTk9BUEMgKi8KKworI2lmZGVmIENLX0FQQwkJCQkvKiBBUEMgYnVmZmVyIGxlbmd0aCAqLworI2lmbmRlZiBBUENCVUZMRU4JCQkvKiBTaG91bGQgYmUgbm8gYmlnZ2VyIHRoYW4gKi8KKyNpZmRlZiBOT1NQTAkJCQkvKiBjb21tYW5kIGJ1ZmZlciBsZW5ndGggKi8KKyNkZWZpbmUgQVBDQlVGTEVOIDYwOAkJCS8qIChzZWUgY2t1Y21kLmgpIGJ1dCB3ZSBjYW4ndCAqLworI2Vsc2UJCQkJCS8qIHJlZmVyZW5jZSBja3VjbWQuaCBzeW1ib2xzIGhlcmUgKi8KKyNkZWZpbmUgQVBDQlVGTEVOIDQwOTYKKyNlbmRpZiAvKiBOT1NQTCAqLworI2VuZGlmIC8qIEFQQ0JVRkxFTiAqLworI2RlZmluZSBBUENfT0ZGICAgMAkvKiBBUEMgT0ZGIChkaXNhYmxlZCkgKi8KKyNkZWZpbmUgQVBDX09OICAgIDEJLyogQVBDIE9OIChlbmFibGVkIGZvciBub24tZGFuZ2Vyb3VzIGNvbW1hbmRzKSAqLworI2RlZmluZSBBUENfVU5DSCAgMgkvKiBBUEMgVU5DSEVDS0VEIChlbmFibGVkIGZvciBBTEwgY29tbWFuZHMpIGJpdG1hc2sgKi8KKyNkZWZpbmUgQVBDX05PSU5QIDQgICAgIC8qIEFQQyAoZW5hYmxlZCB3aXRoIG5vIGlucHV0IGFsbG93ZWQgLSBiaXRtYXNrKSAqLworI2RlZmluZSBBUENfSU5BQ1RJVkUgMAkvKiBBUEMgbm90IGluIHVzZSAqLworI2RlZmluZSBBUENfUkVNT1RFICAgMQkvKiBBUEMgaW4gdXNlIGZyb20gUmVtb3RlICovCisjZGVmaW5lIEFQQ19MT0NBTCAgICAyCS8qIEFQQyBiZWluZyB1c2VkIGZyb20gd2l0aGluIEtlcm1pdCAqLworI2lmbmRlZiBOT0FVVE9ETAorI2lmbmRlZiBDS19BVVRPREwJLyogQXV0b2Rvd25sb2FkICovCisjaWZkZWYgT1MyCisjZGVmaW5lIENLX0FVVE9ETAorI2Vsc2UKKyNpZmRlZiBVTklYCisjZGVmaW5lIENLX0FVVE9ETAorI2Vsc2UKKyNpZmRlZiBWTVMKKyNkZWZpbmUgQ0tfQVVUT0RMCisjZWxzZQorI2lmZGVmIENLX0FVVE9ETAorI3VuZGVmIENLX0FVVE9ETAorI2VuZGlmIC8qIENLX0FVVE9ETCAgKi8KKyNlbmRpZiAvKiBOT0FVVE9ETCAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19BVVRPREwgKi8KKworI2Vsc2UgIC8qIENLX0FQQyBub3QgZGVmaW5lZCAqLworCisjaWZkZWYgTk9JQ1AKKyNpZmRlZiBVTklYCisjaWZuZGVmIENLX0FVVE9ETAorI2RlZmluZSBDS19BVVRPREwKKyNlbmRpZiAvKiBDS19BVVRPREwgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZWxzZSAgLyogTm90IE5PSUNQLi4uICovCisjaWZkZWYgQ0tfQVVUT0RMCisjdW5kZWYgQ0tfQVVUT0RMCisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKyNlbmRpZiAvKiBDS19BUEMgKi8KKworI2lmZGVmIE5PQVVUT0RMCisjaWZkZWYgQ0tfQVVUT0RMCisjdW5kZWYgQ0tfQVVUT0RMCisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisjZW5kaWYgLyogTk9BVVRPREwgKi8KKworLyogQ29kZXMgZm9yIHdoYXQgd2UgYXJlIGRvaW5nIG5vdyAtIGJpdCBtYXNrIHZhbHVlcyAqLworCisjZGVmaW5lIFdfTk9USElORyAgICAwCQkJLyogTm90aGluZyAqLworI2RlZmluZSBXX0lOSVQgICAgICAgMQkJCS8qIEluaXRpYWxpemluZyBwcm90b2NvbCAqLworI2RlZmluZSBXX1NFTkQgICAgICAgMgkJCS8qIFNFTkRpbmcgb3IgTUFJTGluZyAqLworI2RlZmluZSBXX1JFQ1YgICAgICAgNAkJCS8qIFJFQ0VJVkVpbmcgb3IgR0VUdGluZyAqLworI2RlZmluZSBXX1JFTU8gICAgICAgOAkJCS8qIERvaW5nIGEgUkVNT1RFIGNvbW1hbmQgKi8KKyNkZWZpbmUgV19DT05ORUNUICAgMTYJCQkvKiBDT05ORUNUIG1vZGUgKi8KKyNkZWZpbmUgV19DT01NQU5EICAgMzIJCQkvKiBDb21tYW5kIG1vZGUgKi8KKyNkZWZpbmUgV19ESUFMSU5HICAgNjQJCQkvKiBEaWFsaW5nIGEgbW9kZW0gKi8KKyNkZWZpbmUgV19GVFAgICAgICAxMjgJCQkvKiBGVFAgKi8KKyNkZWZpbmUgV19GVF9ERUxFICAgNjQJCQkvKiBGVFAgTURFTEVURSAqLworI2RlZmluZSBXX0tFUk1JVCAoV19JTklUfFdfU0VORHxXX1JFQ1Z8V19SRU1PKSAvKiBLZXJtaXQgcHJvdG9jb2wgKi8KKyNkZWZpbmUgV19YRkVSIChXX0lOSVR8V19TRU5EfFdfUkVDVnxXX1JFTU98V19GVFApIC8qIEZpbGUgeGZlciBhbnkgcHJvdG9jb2wgKi8KKworI2lmbmRlZiBOT1dIQVRBTUkKKyNpZm5kZWYgV0hBVEFNSQorI2RlZmluZSBXSEFUQU1JCisjZW5kaWYgLyogV0hBVEFNSSAqLworI2VuZGlmIC8qIE5PV0hBVEFNSSAqLworCisjaWZkZWYgV0hBVEFNSQkJCQkvKiBCaXQgbWFzayBwb3NpdGlvbnMgZm9yIFdIQVRBTUkgKi8KKyNkZWZpbmUgV01JX1NFUlZFICAgMQkJCS8qIFNlcnZlciBtb2RlICovCisjZGVmaW5lIFdNSV9GTU9ERSAgIDIJCQkvKiBGaWxlIHRyYW5zZmVyIG1vZGUgKi8KKyNkZWZpbmUgV01JX0ZOQU1FICAgNAkJCS8qIEZpbGUgbmFtZSBjb252ZXJzaW9uICovCisjZGVmaW5lIFdNSV9TVFJFQU0gIDgJCQkvKiBJIGhhdmUgYSByZWxpYWJsZSB0cmFuc3BvcnQgKi8KKyNkZWZpbmUgV01JX0NMRUFSICAxNgkJCS8qIEkgaGF2ZSBhIGNsZWFyIGNoYW5uZWwgKi8KKyNkZWZpbmUgV01JX0ZMQUcgICAzMgkJCS8qIEZsYWcgdGhhdCBXSEFUQU1JIGZpZWxkIGlzIHZhbGlkICovCisvKiBXSEFUQU1JMiBiaXRzLi4uICovCisjZGVmaW5lIFdNSTJfWE1PREUgIDEJCQkvKiBUcmFuc2ZlciBtb2RlIGF1dG8oMCkvbWFudWFsKDEpICovCisjZGVmaW5lIFdNSTJfUkVDVSAgIDIJCQkvKiBUcmFuc2ZlciBpcyByZWN1cnNpdmUgKi8KKyNkZWZpbmUgV01JMl9GTEFHICAzMgkJCS8qIEZsYWcgdGhhdCBXSEFUQU1JMiBmaWVsZCBpcyB2YWxpZCAqLworI2VuZGlmIC8qIFdIQVRBTUkgKi8KKworLyogVGVybWluYWwgdHlwZXMgKi8KKyNkZWZpbmUgVlQxMDAgICAgIDAJCQkvKiBBbHNvIGZvciBWVDUyIG1vZGUgKi8KKyNkZWZpbmUgVEVLVFJPTklYIDEKKworLyogTm9ybWFsIHBhY2tldCBhbmQgd2luZG93IHNpemUgKi8KKworI2RlZmluZSBNQVhQQUNLIDk0CQkJLyogTWF4aW11bSB1bmV4dGVuZGVkIHBhY2tldCBzaXplICovCisJCQkJCS8qIENhbid0IGJlIG1vcmUgdGhhbiA5NC4gKi8KKyNpZmRlZiBwZHAxMQkJCQkvKiBNYXhpbXVtIHNsaWRpbmcgd2luZG93IHNsb3RzICovCisjZGVmaW5lIE1BWFdTICA4CisjZWxzZQorI2RlZmluZSBNQVhXUyAzMgkJCS8qIENhbid0IGJlIG1vcmUgdGhhbiAzMi4gKi8KKyNlbmRpZiAvKiBwZHAxMSAqLworCisvKiBNYXhpbXVtIGxvbmcgcGFja2V0IHNpemUgZm9yIHNlbmRpbmcgcGFja2V0cyAqLworLyogT3ZlcnJpZGUgdGhlc2UgZnJvbSBjYyBjb21tYW5kIGxpbmUgdmlhIC1ETUFYU1A9bm5uICovCisKKyNpZmRlZiBJUklYCQkJCS8qIElyaXggNi40IGFuZCBlYXJsaWVyIGhhcyAqLworI2lmbmRlZiBNQVhTUAkJCQkvKiBUZWxuZXQgc2VydmVyIGJ1ZyAqLworI2lmZGVmIElSSVg2NQorI2RlZmluZSBNQVhTUCA5MDI0CisjZWxzZQorI2RlZmluZSBNQVhTUCA0MDAwCisjZW5kaWYgLyogSVJJWDY1ICovCisjZW5kaWYgLyogTUFYU1AgKi8KKyNlbmRpZiAvKiBJUklYICovCisKKyNpZmRlZiBEWU5BTUlDCisjaWZuZGVmIE1BWFNQCisjZGVmaW5lIE1BWFNQIDkwMjQKKyNlbmRpZiAvKiBNQVhTUCAqLworI2Vsc2UgIC8qIG5vdCBEWU5BTUlDICovCisjaWZuZGVmIE1BWFNQCisjaWZkZWYgcGRwMTEKKyNkZWZpbmUgTUFYU1AgMTAyNAorI2Vsc2UKKyNkZWZpbmUgTUFYU1AgMjA0OAorI2VuZGlmIC8qIHBkcDExICovCisjZW5kaWYgLyogTUFYU1AgKi8KKyNlbmRpZiAvKiBEWU5BTUlDICovCisKKy8qIE1heGltdW0gbG9uZyBwYWNrZXQgc2l6ZSBmb3IgcmVjZWl2aW5nIHBhY2tldHMgKi8KKy8qIE92ZXJyaWRlIHRoZXNlIGZyb20gY2MgY29tbWFuZCBsaW5lIHZpYSAtRE1BWFJQPW5ubiAqLworCisjaWZkZWYgRFlOQU1JQworI2lmbmRlZiBNQVhSUAorI2RlZmluZSBNQVhSUCA5MDI0CisjZW5kaWYgLyogTUFYUlAgKi8KKyNlbHNlICAvKiBub3QgRFlOQU1JQyAqLworI2lmbmRlZiBNQVhSUAorI2lmZGVmIHBkcDExCisjZGVmaW5lIE1BWFJQIDEwMjQKKyNlbHNlCisjZGVmaW5lIE1BWFJQIDIwNDgKKyNlbmRpZiAvKiBwZHAxMSAqLworI2VuZGlmIC8qIE1BWFJQICovCisjZW5kaWYgLyogRFlOQU1JQyAqLworLyoKKyAgRGVmYXVsdCBzaXplcyBmb3Igd2luZG93ZWQgcGFja2V0IGJ1ZmZlcnMuCisgIE92ZXJyaWRlIHRoZXNlIGZyb20gY2MgY29tbWFuZCBsaW5lIHZpYSAtRFNCU0laPW5ubiwgLURSQlNJWj1ubm4uCisgIE9yIGp1c3QgLURCSUdCVUZPSy4KKyovCisjaWZuZGVmIE1BWEdFVFBBVEgJCQkvKiBNYXhpbXVtIG51bWJlciBvZiBkaXJlY3RvcmllcyAqLworI2lmZGVmIEJJR0JVRk9LCQkJCS8qIGZvciBHRVQgcGF0aC4uLiAqLworI2RlZmluZSBNQVhHRVRQQVRIIDEyOAorI2Vsc2UKKyNkZWZpbmUgTUFYR0VUUEFUSCAxNgorI2VuZGlmIC8qIEJJR0JVRk9LICovCisjZW5kaWYgLyogTUFYR0VUUEFUSCAqLworCisjaWZuZGVmIE5PU1BMCQkJCS8qIFF1ZXJ5IGJ1ZmZlciBsZW5ndGggKi8KKyNpZmRlZiBPUzIKKyNkZWZpbmUgUUJVRkwgNDA5NQorI2Vsc2UKKyNpZmRlZiBCSUdCVUZPSworI2RlZmluZSBRQlVGTCA0MDk1CisjZWxzZQorI2RlZmluZSBRQlVGTCAxMDIzCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZkZWYgRFlOQU1JQworI2lmbmRlZiBTQlNJWgorI2lmZGVmIEJJR0JVRk9LCQkJCS8qIElmIGJpZyBidWZmZXJzIGFyZSBzYWZlLi4uICovCisjZGVmaW5lIFNCU0laIDI5MDAwMAkJCS8qIEFsbG93IGZvciAxMCB4IDkwMjQgb3IgMjAgeCA0MDk2ICovCisjZWxzZQkJCQkJLyogT3RoZXJ3aXNlLi4uICovCisjaWZkZWYgcGRwMTEKKyNkZWZpbmUgU0JTSVogMzAyMAorI2Vsc2UKKyNkZWZpbmUgU0JTSVogOTA1MAkJCS8qIEFsbG93IGZvciAzIHggMzAwMCwgZXRjLiAqLworI2VuZGlmIC8qIHBkcDExICovCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKyNlbmRpZiAvKiBTQlNJWiAqLworCisjaWZuZGVmIFJCU0laCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgUkJTSVogMjkwMDAwCisjZWxzZQorI2lmZGVmIHBkcDExCisjZGVmaW5lIFJCU0laIDMwMjAKKyNlbHNlCisjZGVmaW5lIFJCU0laIDkwNTAKKyNlbmRpZiAvKiBwZHAxMSAqLworI2VuZGlmIC8qIEJJR0JVRk9LICovCisjZW5kaWYgLyogUkJTSVogKi8KKyNlbHNlICAvKiBub3QgRFlOQU1JQyAqLworI2lmZGVmIHBkcDExCisjZGVmaW5lIFNCU0laIDMwMjAKKyNkZWZpbmUgUkJTSVogMzAyMAorI2Vsc2UKKyNpZm5kZWYgU0JTSVoKKyNkZWZpbmUgU0JTSVogKE1BWFNQICogKE1BWFdTICsgMSkpCisjZW5kaWYgLyogU0JTSVogKi8KKyNpZm5kZWYgUkJTSVoKKyNkZWZpbmUgUkJTSVogKE1BWFJQICogKE1BWFdTICsgMSkpCisjZW5kaWYgLyogUkJTSVogKi8KKyNlbmRpZiAvKiBwZHAxMSAqLworI2VuZGlmIC8qIERZTkFNSUMgKi8KKworI2lmZGVmIEJJR0JVRk9LCisjZGVmaW5lIFBLVE1TR0xFTiAxMDIzCisjZWxzZQorI2RlZmluZSBQS1RNU0dMRU4gODAKKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworCisvKiBLZXJtaXQgcGFyYW1ldGVycyBhbmQgZGVmYXVsdHMgKi8KKworI2RlZmluZSBDVExRCSAgICcjJwkJCS8qIENvbnRyb2wgY2hhciBwcmVmaXggSSB3aWxsIHVzZSAqLworI2RlZmluZSBNWUVCUQkgICAnJicJCQkvKiA4dGgtQml0IHByZWZpeCBjaGFyIEkgd2lsbCB1c2UgKi8KKyNkZWZpbmUgTVlSUFRRCSAgICd+JwkJCS8qIFJlcGVhdCBjb3VudCBwcmVmaXggSSB3aWxsIHVzZSAqLworCisjZGVmaW5lIE1BWFRSWQkgICAgMTAJCQkvKiBUaW1lcyB0byByZXRyeSBhIHBhY2tldCAqLworI2RlZmluZSBNWVBBRE4JICAgIDAJCQkvKiBIb3cgbWFueSBwYWRkaW5nIGNoYXJzIEkgbmVlZCAqLworI2RlZmluZSBNWVBBREMJICAgICdcMCcJCS8qIFdoaWNoIHBhZGRpbmcgY2hhcmFjdGVyIEkgbmVlZCAqLworCisjZGVmaW5lIERNWVRJTQkgICAgOAkJCS8qIEluaXRpYWwgdGltZW91dCBpbnRlcnZhbCB0byB1c2UuICovCisjZGVmaW5lIFVSVElNRQkgICAgMTUJCQkvKiBUaW1lb3V0IGludGVydmFsIHRvIHVzZSBvbiBtZS4gKi8KKyNkZWZpbmUgRFNSVlRJTSAgICAgMAkJCS8qIERlZmF1bHQgc2VydmVyIGNtZCB3YWl0IHRpbWVvdXQuICovCisKKyNkZWZpbmUgREVGVFJOCSAgICAwCQkJLyogRGVmYXVsdCBsaW5lIHR1cm5hcm91bmQgaGFuZHNoYWtlICovCisKKyNkZWZpbmUgTVlFT0wJICAgIENSCQkJLyogSW5jb21pbmcgcGFja2V0IHRlcm1pbmF0b3IuICovCisKKyNpZmRlZiBORVdERUZBVUxUUworI2RlZmluZSBEUlBTSVoJICA0MDk1CQkJLyogRGVmYXVsdCBpbmNvbWluZyBwYWNrZXQgc2l6ZS4gKi8KKyNkZWZpbmUgREZXU0laICAgICAgMzAJCQkvKiBEZWZhdWx0IHdpbmRvdyBzaXplICovCisjZGVmaW5lIERGQkNUICAgICAgICAzCQkJLyogRGVmYXVsdCBibG9jay1jaGVjayB0eXBlICovCisjZWxzZQorI2RlZmluZSBEUlBTSVoJICAgIDkwCQkJLyogRGVmYXVsdCBpbmNvbWluZyBwYWNrZXQgc2l6ZS4gKi8KKyNkZWZpbmUgREZXU0laICAgICAgIDEJCQkvKiBEZWZhdWx0IHdpbmRvdyBzaXplICovCisjZGVmaW5lIERGQkNUICAgICAgICAzCQkJLyogRGVmYXVsdCBibG9jay1jaGVjayB0eXBlICovCisjZW5kaWYgLyogTkVXREVGQVVMVFMgKi8KKworLyogVGhlIEhQLVVYIDUgYW5kIDYgVGVsbmV0IHNlcnZlcnMgY2FuIG9ubHkgc3dhbGxvdyA1MTMgYnl0ZXMgYXQgb25jZSAqLworCisjaWZkZWYgSFBVWDUKKyNpZmRlZiBEUlBTSVoKKyN1bmRlZiBEUlBTSVoKKyNlbmRpZiAvKiBEUlBTSVogKi8KKyNkZWZpbmUgRFJQU0laIDUwMAorI2Vsc2UKKyNpZmRlZiBIUFVYNgorI2lmZGVmIERSUFNJWgorI3VuZGVmIERSUFNJWgorI2VuZGlmIC8qIERSUFNJWiAqLworI2RlZmluZSBEUlBTSVogNTAwCisjZW5kaWYgLyogSFBVWDYgKi8KKyNlbmRpZiAvKiBIUFVYNSAqLworCisjZGVmaW5lIERTUFNJWgkgICAgOTAJCQkvKiBEZWZhdWx0IG91dGJvdW5kIHBhY2tldCBzaXplLiAqLworI2RlZmluZSBEREVMQVkgICAgICAxCQkJLyogRGVmYXVsdCBkZWxheS4gKi8KKyNkZWZpbmUgRFNQRUVECSAgICA5NjAwCQkvKiBEZWZhdWx0IGxpbmUgc3BlZWQuICovCisKKyNpZmRlZiBPUzIJCQkJLyogRGVmYXVsdCBDT05ORUNULW1vZGUgKi8KKyNkZWZpbmUgREZFU0MgMjkJCQkvKiBlc2NhcGUgY2hhcmFjdGVyICovCisjZWxzZQorI2lmZGVmIE5FWFQJCQkJLyogQ3RybC1dIGZvciBQQyBhbmQgTmVYVCAqLworI2RlZmluZSBERkVTQyAyOQorI2Vsc2UKKyNpZmRlZiBHRU1ET1MJCQkJLyogQW5kIEF0YXJpIFNUICovCisjZGVmaW5lIERGRVNDIDI5CisjZWxzZQorI2RlZmluZSBERkVTQyAyOAkJCS8qIEN0cmwtYmFja3NsYXNoIGZvciBvdGhlcnMgKi8KKyNlbmRpZiAvKiBHRU1ET1MgKi8KKyNlbmRpZiAvKiBORVhUICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBOT1BVU0gJCQkJLyogTk9QVVNIIGltcGxpZXMgTk9KQyAqLworI2lmbmRlZiBOT0pDCQkJCS8qIChubyBqb2IgY29udHJvbCkgKi8KKyNkZWZpbmUgTk9KQworI2VuZGlmIC8qIE5PSkMgKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworI2lmZGVmIFVOSVgJCQkJLyogRGVmYXVsdCBmb3IgU0VUIFNVU1BFTkQgKi8KKyNpZmRlZiBOT0pDCQkJCS8qIFVOSVggYnV0IGpvYiBjb250cm9sIGRpc2FibGVkICovCisjZGVmaW5lIERGU1VTUCAgICAgIDAKKyNlbHNlCQkJCQkvKiBVTklYLCBqb2IgY29udHJvbCBlbmFibGVkLiAqLworI2RlZmluZSBERlNVU1AgICAgICAxCisjZW5kaWYgLyogTk9KQyAqLworI2Vsc2UKKyNkZWZpbmUgREZTVVNQICAgICAgMAorI2VuZGlmIC8qIFVOSVggKi8KKworI2lmbmRlZiBERkNETVNHCisjaWZkZWYgVU5JWE9ST1NLCisjZGVmaW5lIERGQ0RNU0cgInt7Li8ucmVhZG1lfXtSRUFETUUuVFhUfXtSRUFELk1FfX0iCisjZWxzZQorI2RlZmluZSBERkNETVNHICJ7e1JFQURNRS5UWFR9e1JFQUQuTUV9fSIKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyNlbmRpZiAvKiBERkNETVNHICovCisKKyNkZWZpbmUgTlNOREVYQ0VQVCA2NAkJLyogTWF4IHBhdHRlcm5zIGZvciAvRVhDRVBUOiBsaXN0ICovCisKKy8qIEZpbGVzICovCisKKyNkZWZpbmUgWkNURVJNICAgICAgMAkgICAgCS8qIENvbnNvbGUgdGVybWluYWwgKi8KKyNkZWZpbmUgWlNURElPICAgICAgMQkJLyogU3RhbmRhcmQgaW5wdXQvb3V0cHV0ICovCisjZGVmaW5lIFpJRklMRQkgICAgMgkJLyogQ3VycmVudCBpbnB1dCBmaWxlIChTRU5ELCBldGMpIChpbikgKi8KKyNkZWZpbmUgWk9GSUxFICAgICAgMwkgICAgCS8qIEN1cnJlbnQgb3V0cHV0IGZpbGUgKFJFQ0VJVkUsIEdFVCkgKG91dCkgKi8KKyNkZWZpbmUgWkRGSUxFICAgICAgNAkgICAgCS8qIEN1cnJlbnQgZGVidWdnaW5nIGxvZyBmaWxlIChvdXQpICovCisjZGVmaW5lIFpURklMRSAgICAgIDUJICAgIAkvKiBDdXJyZW50IHRyYW5zYWN0aW9uIGxvZyBmaWxlIChvdXQpICovCisjZGVmaW5lIFpQRklMRSAgICAgIDYJICAgIAkvKiBDdXJyZW50IHBhY2tldCBsb2cgZmlsZSAob3V0KSAqLworI2RlZmluZSBaU0ZJTEUgICAgICA3CQkvKiBDdXJyZW50IHNlc3Npb24gbG9nIGZpbGUgKG91dCkgKi8KKyNkZWZpbmUgWlNZU0ZOCSAgICA4CQkvKiBJbnB1dC9PdXRwdXQgZnJvbSBhIHN5c3RlbSBmdW5jdGlvbiAqLworI2RlZmluZSBaUkZJTEUgICAgICA5ICAgICAgICAgICAvKiBMb2NhbCBmaWxlIGZvciBSRUFEIChpbikgKi8KKyNkZWZpbmUgWldGSUxFICAgICAxMCAgICAgICAgICAgLyogTG9jYWwgZmlsZSBmb3IgV1JJVEUgKG91dCkgKi8KKyNkZWZpbmUgWk1GSUxFICAgICAxMQkJLyogTWlzY2VsbGFuZW91cyBmaWxlLCBlLmcuIGZvciBYTEFURSAqLworI2RlZmluZSBaRElGSUwgICAgIDEyCQkvKiBESUFMIGxvZyAqLworI2RlZmluZSBaTkZJTFMgICAgIDEzCSAgICAJLyogSG93IG1hbnkgZGVmaW5lZCBmaWxlIG51bWJlcnMgKi8KKworI2lmZGVmIENLQ0hBTk5FTElPCisKKy8qIEZpbGUgbW9kZXMgKi8KKworI2RlZmluZSBGTV9SRUEgICAgICAxCQkJLyogUmVhZCAqLworI2RlZmluZSBGTV9XUkkgICAgICAyCQkJLyogV3JpdGUgKi8KKyNkZWZpbmUgRk1fQVBQICAgICAgNAkJCS8qIEFwcGVuZCAqLworI2RlZmluZSBGTV9SV0EgICAgICA3CQkJLyogUmVhZC9Xcml0ZS9BcHBlbmQgbWFzayAqLworI2RlZmluZSBGTV9CSU4gICAgICA4CQkJLyogQmluYXJ5ICovCisjZGVmaW5lIEZNX1JXQiAgICAgMTUJCQkvKiBSZWFkL1dyaXRlL0FwcGVuZC9CaW5hcnkgbWFzayAqLworI2RlZmluZSBGTV9DTUQgICAgIDE2CQkJLyogQ29tbWFuZCAqLworI2RlZmluZSBGTV9FT0YgICAgIDY0CQkJLyogKHN0YXR1cykgQXQgRU9GICovCisKKy8qIEZpbGUgZXJyb3JzICovCisKKyNkZWZpbmUgRlhfTkVSICAgICAgMAkJCS8qIE5vIGVycm9yICovCisjZGVmaW5lIEZYX1NZUyAgICAgLTEJCQkvKiBTeXN0ZW0gZXJyb3IgKi8KKyNkZWZpbmUgRlhfRU9GICAgICAtMgkJCS8qIEVuZCBvZiBmaWxlICovCisjZGVmaW5lIEZYX05PUCAgICAgLTMJCQkvKiBDaGFubmVsIG5vdCBvcGVuICovCisjZGVmaW5lIEZYX0NITiAgICAgLTQJCQkvKiBDaGFubmVsIG91dCBvZiByYW5nZSAqLworI2RlZmluZSBGWF9STkcgICAgIC01CQkJLyogQXJndW1lbnQgcmFuZ2UgZXJyb3IgKi8KKyNkZWZpbmUgRlhfRk5GICAgICAtNgkJCS8qIEZpbGUgbm90IGZvdW5kICovCisjZGVmaW5lIEZYX0JGTiAgICAgLTcJCQkvKiBCYWQgb3IgbWlzc2luZyBmaWxlbmFtZSAqLworI2RlZmluZSBGWF9OTUYgICAgIC04CQkJLyogTm8gbW9yZSBmaWxlcyAqLworI2RlZmluZSBGWF9GT1AgICAgIC05CQkJLyogRm9yYmlkZGVuIG9wZXJhdGlvbiAqLworI2RlZmluZSBGWF9BQ0MgICAgLTEwCQkJLyogQWNjZXNzIGRlbmllZCAqLworI2RlZmluZSBGWF9CT00gICAgLTExCQkJLyogQmFkIGNvbWJpbmF0aW9uIG9mIG9wZW4gbW9kZXMgKi8KKyNkZWZpbmUgRlhfT0ZMICAgIC0xMgkJCS8qIEJ1ZmZlciBvdmVyZmxvdyAqLworI2RlZmluZSBGWF9MTlUgICAgLTEzCQkJLyogQ3VycmVudCBsaW5lIG51bWJlciB1bmtub3duICovCisjZGVmaW5lIEZYX1JPTyAgICAtMTQJCQkvKiBTZXQgUm9vdCB2aW9sYXRpb24gKi8KKyNkZWZpbmUgRlhfTllJICAgIC05OQkJCS8qIEZlYXR1cmUgbm90IGltcGxlbWVudGVkIHlldCAqLworI2RlZmluZSBGWF9VTksgICAtOTk5CQkJLyogVW5rbm93biBlcnJvciAqLworCitfUFJPVE9UWVAoIGludCB6X29wZW4sIChjaGFyICosIGludCkgKTsKK19QUk9UT1RZUCggaW50IHpfY2xvc2UsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCB6X291dCwgKGludCwgY2hhciAqLCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IHpfaW4sIChpbnQsIGNoYXIgKiwgaW50LCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IHpfZmx1c2gsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCB6X3NlZWssIChpbnQsIGxvbmcpICk7CitfUFJPVE9UWVAoIGludCB6X2xpbmUsIChpbnQsIGxvbmcpICk7CitfUFJPVE9UWVAoIGludCB6X2dldG1vZGUsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCB6X2dldGZudW0sIChpbnQpICk7CitfUFJPVE9UWVAoIGxvbmcgel9nZXRwb3MsIChpbnQpICk7CitfUFJPVE9UWVAoIGxvbmcgel9nZXRsaW5lLCAoaW50KSApOworX1BST1RPVFlQKCBsb25nIHpfY291bnQsIChpbnQsIGludCkgKTsKK19QUk9UT1RZUCggY2hhciAqIHpfZ2V0bmFtZSwgKGludCkgKTsKK19QUk9UT1RZUCggY2hhciAqIGNrZmVycm9yLCAoaW50KSApOworI2VuZGlmIC8qIENLQ0hBTk5FTElPICovCisKK19QUk9UT1RZUCggaW50IHNjYW5maWxlLCAoY2hhciAqLCBpbnQgKiwgaW50KSApOworCisvKiAgQnVmZmVyZWQgZmlsZSBpL28gLi4uICAqLworI2lmZGVmIE9TMgkJCQkvKiBLLTk1ICovCisjZGVmaW5lIElOQlVGU0laRSAzMjc2OAorI2RlZmluZSBPQlVGU0laRSAzMjc2OAorI2Vsc2UKKyNpZmRlZiBwZHAxMQorI2RlZmluZSBJTkJVRlNJWkUgNTEyCisjZGVmaW5lIE9CVUZTSVpFIDUxMgorI2Vsc2UKKy8qIEluIFZNUywgYWxsb3cgZm9yIGxvbmdlc3QgcG9zc2libGUgUk1TIHJlY29yZCAqLworI2lmZGVmIFZNUworI2RlZmluZSBJTkJVRlNJWkUgMzI3NjgJCQkvKiBGaWxlIGlucHV0IGJ1ZmZlciBzaXplICovCisjZGVmaW5lIE9CVUZTSVpFIDMyNzY4CQkJLyogRmlsZSBvdXRwdXQgYnVmZmVyIHNpemUgKi8KKyNlbHNlICAvKiBOb3QgVk1TICovCisjaWZkZWYgU1RSQVRVUworI2lmZGVmIERZTkFNSUMKKyNkZWZpbmUgSU5CVUZTSVpFIDMyNzY3CQkJLyogRmlsZSBpbnB1dCBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBPQlVGU0laRSAzMjc2NwkJCS8qIEZpbGUgb3V0cHV0IGJ1ZmZlciBzaXplICovCisjZWxzZSAvKiBTVFJBVFVTLCBub3QgRFlOQU1JQyAqLworI2RlZmluZSBJTkJVRlNJWkUgNDA5NgkJCS8qIEZpbGUgaW5wdXQgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgT0JVRlNJWkUgNDA5NgkJCS8qIEZpbGUgb3V0cHV0IGJ1ZmZlciBzaXplICovCisjZW5kaWYgLyogRFlOQU1JQyAqLworI2Vsc2UgLyogbm90IFNUUkFUVVMgKi8KKyNpZmRlZiBCSUdCVUZPSwkJCQkvKiBTeXN0ZW1zIHdoZXJlIG1lbW9yeSBpcyAqLworI2RlZmluZSBJTkJVRlNJWkUgMzI3NjgJCQkvKiBub3QgYSBwcm9ibGVtLi4uICovCisjZGVmaW5lIE9CVUZTSVpFIDMyNzY4CisjZWxzZSAvKiBOb3QgQklHQlVGT0sgKi8KKyNkZWZpbmUgSU5CVUZTSVpFIDEwMjQKKyNkZWZpbmUgT0JVRlNJWkUgMTAyNAorI2VuZGlmIC8qIEJJR0JVRk9LICovCisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIHBkcDExICovCisjZW5kaWYgLyogT1MyICovCisKKy8qIEZpbGUtdHJhbnNmZXIgY2hhcmFjdGVyIGluL291dCBtYWNyb3MgZm9yIGJ1ZmZlcmVkIGkvbyAqLworCisvKiBHZXQgdGhlIG5leHQgZmlsZSBieXRlICovCisjaWZuZGVmIENLQ01BSQorI2lmbmRlZiBOT1hGRVIKK2V4dGVybiBjaGFyICoqIHNuZGFycmF5OworI2VuZGlmIC8qIE5PWEZFUiAqLworI2VuZGlmIC8qIENLQ01BSSAqLworI2lmZGVmIE5PU1BMCisjZGVmaW5lIHptaW5jaGFyKCkgKCgoLS16aW5jbnQpPj0wKSA/ICgoaW50KSgqemlucHRyKyspICYgMDM3NykgOiB6aW5maWxsKCkpCisjZWxzZQorI2lmZGVmIE5PWEZFUgorI2RlZmluZSB6bWluY2hhcigpICgoKC0temluY250KT49MCkgPyAoKGludCkoKnppbnB0cisrKSAmIDAzNzcpIDogemluZmlsbCgpKQorI2Vsc2UKKyNkZWZpbmUgem1pbmNoYXIoKSBcCisoc25kYXJyYXk/YWduYnl0ZSgpOigoKC0temluY250KT49MCkgPyAoKGludCkoKnppbnB0cisrKSAmIDAzNzcpIDogemluZmlsbCgpKSkKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisvKiBTdHVmZiBhIGNoYXJhY3RlciBpbnRvIHRoZSBpbnB1dCBidWZmZXIgKi8KKyNkZWZpbmUgem1zdHVmZihjKSB6aW5wdHItLSwgKnppbnB0ciA9IGMsIHppbmNudCsrCisKKy8qIFB1dCBhIGNoYXJhY3RlciB0byBhIGZpbGUgKi8KKyNkZWZpbmUgem1jaG91dChjKSBcCisoKCp6b3V0cHRyKys9KGNoYXIpKGMpKSwoKCgrK3pvdXRjbnQpPj16b2J1ZnNpemUpP3pvdXRkdW1wKCk6MCkpCisKKy8qIFNjcmVlbiBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBYWUZEX04gMAkJCS8qIEZpbGUgdHJhbnNmZXIgZGlzcGxheTogTm9uZSwgT2ZmICovCisjZGVmaW5lIFhZRkRfUiAxCQkJLyogUmVndWxhciwgRG90cyAqLworI2RlZmluZSBYWUZEX0MgMgkJCS8qIEN1cnNvci1wb3NpdGlvbmluZyAoZS5nLiBjdXJzZXMpICovCisjZGVmaW5lIFhZRkRfUyAzCQkJLyogQ1JUIFNjcmVlbiAqLworI2RlZmluZSBYWUZEX0IgNAkJCS8qIEJyaWVmICovCisjZGVmaW5lIFhZRkRfRyA1ICAgICAgICAgICAgICAgICAgICAgICAgLyogR1VJICovCisKKyNpZmRlZiBOT0RJU1BMQVkKKyNkZWZpbmUgeHhzY3JlZW4oYSxiLGMsZCkKKyNkZWZpbmUgY2tzY3JlZW4oYSxiLGMsZCkKKyNlbHNlCitfUFJPVE9UWVAoIFZPSUQgY2tzY3JlZW4sIChpbnQsIGNoYXIsIGxvbmcsIGNoYXIgKikgKTsKKyNpZmRlZiBWTVMKKyNkZWZpbmUgeHhzY3JlZW4oYSxiLGMsZCkgXAoraWYgKGxvY2FsICYmIGZkaXNwbGEgIT0gWFlGRF9OKSBcCitja3NjcmVlbigoaW50KWEsKGNoYXIpYiwobG9uZyljLChjaGFyICopZCkKKyNlbHNlCisjZGVmaW5lIHh4c2NyZWVuKGEsYixjLGQpIFwKK2lmIChsb2NhbCAmJiAhYmFja2dyZCAmJiBmZGlzcGxhICE9IFhZRkRfTikgXAorY2tzY3JlZW4oKGludClhLChjaGFyKWIsKGxvbmcpYywoY2hhciAqKWQpCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogTk9ESVNQTEFZICovCisKKyNkZWZpbmUgU0NSX0ZOIDEgICAgCS8qIGZpbGVuYW1lICovCisjZGVmaW5lIFNDUl9BTiAyICAgIAkvKiBhcy1uYW1lICovCisjZGVmaW5lIFNDUl9GUyAzIAkvKiBmaWxlLXNpemUgKi8KKyNkZWZpbmUgU0NSX1hEIDQgICAgCS8qIHgtcGFja2V0IGRhdGEgKi8KKyNkZWZpbmUgU0NSX1NUIDUgICAgICAJLyogRmlsZSBzdGF0dXM6ICovCisjZGVmaW5lICAgU1RfT0sgICAwICAgCS8qICBUcmFuc2ZlcnJlZCBPSyAqLworI2RlZmluZSAgIFNUX0RJU0MgMSAJLyogIERpc2NhcmRlZCAqLworI2RlZmluZSAgIFNUX0lOVCAgMiAgICAgLyogIEludGVycnVwdGVkICovCisjZGVmaW5lICAgU1RfU0tJUCAzIAkvKiAgU2tpcHBlZCAqLworI2RlZmluZSAgIFNUX0VSUiAgNCAJLyogIEZhdGFsIEVycm9yICovCisjZGVmaW5lICAgU1RfUkVGVSA1ICAgICAvKiAgUmVmdXNlZCAodXNlIEF0dHJpYnV0ZSBjb2RlcyBmb3IgcmVhc29uKSAqLworI2RlZmluZSAgIFNUX0lOQyAgNgkvKiAgSW5jb21wbGV0ZWx5IHJlY2VpdmVkICovCisjZGVmaW5lICAgU1RfTVNHICA3CS8qICBJbmZvcm1hdGlvbmFsIG1lc3NhZ2UgKi8KKyNkZWZpbmUgICBTVF9TSU0gIDgJLyogIFRyYW5zZmVyIHNpbXVsYXRlZCAoZS5nLiB3b3VsZCBiZSBzZW50KSAqLworI2RlZmluZSBTQ1JfUE4gNiAgICAJLyogcGFja2V0IG51bWJlciAqLworI2RlZmluZSBTQ1JfUFQgNyAgICAJLyogcGFja2V0IHR5cGUgb3IgcHNldWRvdHlwZSAqLworI2RlZmluZSBTQ1JfVEMgOCAgICAJLyogdHJhbnNhY3Rpb24gY29tcGxldGUgKi8KKyNkZWZpbmUgU0NSX0VNIDkgICAgCS8qIGVycm9yIG1lc3NhZ2UgKi8KKyNkZWZpbmUgU0NSX1dNIDEwICAgCS8qIHdhcm5pbmcgbWVzc2FnZSAqLworI2RlZmluZSBTQ1JfVFUgMTEJLyogYXJiaXRyYXJ5IHVuZGVsaW1pdGVkIHRleHQgKi8KKyNkZWZpbmUgU0NSX1ROIDEyICAgCS8qIGFyYml0cmFyeSBuZXcgdGV4dCwgZGVsaW1pdGVkIGF0IGJlZ2lubmluZyAqLworI2RlZmluZSBTQ1JfVFogMTMgICAJLyogYXJiaXRyYXJ5IHRleHQsIGRlbGltaXRlZCBhdCBlbmQgKi8KKyNkZWZpbmUgU0NSX1FFIDE0CS8qIHF1YW50aXR5IGVxdWFscyAoZS5nLiAiZm9vOiA3IikgKi8KKyNkZWZpbmUgU0NSX0NXIDE1CS8qIGNsb3NlIHNjcmVlbiB3aW5kb3cgKi8KKyNkZWZpbmUgU0NSX0NEIDE2ICAgICAgIC8qIGRpc3BsYXkgY3VycmVudCBkaXJlY3RvcnkgKi8KKworLyogU2tpcCByZWFzb25zICovCisKKyNkZWZpbmUgU0tQX0RBVCAxCQkJLyogRGF0ZS1UaW1lIChPbGRlcikgKi8KKyNkZWZpbmUgU0tQX0VRVSAyCQkJLyogRGF0ZS1UaW1lIChFcXVhbCkgKi8KKyNkZWZpbmUgU0tQX1RZUCAzCQkJLyogVHlwZSAqLworI2RlZmluZSBTS1BfU0laIDQJCQkvKiBTaXplICovCisjZGVmaW5lIFNLUF9OQU0gNQkJCS8qIE5hbWUgY29sbGlzaW9uICovCisjZGVmaW5lIFNLUF9FWEwgNgkJCS8qIEV4Y2VwdGlvbiBsaXN0ICovCisjZGVmaW5lIFNLUF9ET1QgNwkJCS8qIERvdCBmaWxlICovCisjZGVmaW5lIFNLUF9CS1UgOAkJCS8qIEJhY2t1cCBmaWxlICovCisjZGVmaW5lIFNLUF9SRVMgOQkJCS8qIFJlY292ZXJ5IG5vdCBuZWVkZWQgKi8KKyNkZWZpbmUgU0tQX0FDQyAxMAkJCS8qIEFjY2VzcyBkZW5pZWQgKi8KKyNkZWZpbmUgU0tQX05SRiAxMQkJCS8qIE5vdCBhIHJlZ3VsYXIgZmlsZSAqLworI2RlZmluZSBTS1BfU0lNIDEyCQkJLyogU2ltdWxhdGlvbiAoV09VTEQgQkUgU0VOVCkgKi8KKyNkZWZpbmUgU0tQX1hVUCAxMyAvKiBTaW11bGF0aW9uOiBXb3VsZCBiZSBzZW50IGJlY2F1c2UgcmVtb3RlIGZpbGUgb2xkZXIgKi8KKyNkZWZpbmUgU0tQX1hOWCAxNCAvKiBTaW11bGF0aW9uOiBkaXR0bywgYmVjYXVzZSByZW1vdGUgZmlsZSBkb2VzIG5vdCBleGlzdCAqLworCisvKiBNYWNyb3MgKi8KKworI2lmbmRlZiBDS0NNQUkKK2V4dGVybiBpbnQgdGNwX2luY29taW5nOwkJLyogVXNlZCBieSBFTkFCTEUgbWFjcm8gKi8KKyNlbmRpZiAvKiBDS0NNQUkgKi8KKworI2lmbmRlZiBUQ1BTT0NLRVQKKy8qCisgIEVOQUJMRUQgdGVsbHMgd2hldGhlciBhIHNlcnZlci1zaWRlIHNlcnZpY2UgaXMgZW5hYmxlZC4KKyAgMCA9IGRpc2FibGVkLCAxID0gbG9jYWwsIDIgPSByZW1vdGUuCisgIEEgInNldCBob3N0ICoiIGNvbm5lY3Rpb24gaXMgdGVjaG5pY2FsbHkgbG9jYWwgYnV0IGxvZ2ljYWxseSByZW1vdGUKKyovCisjZGVmaW5lIEVOQUJMRUQoeCkgKChsb2NhbCAmJiAoeCAmIDEpKSB8fCAoIWxvY2FsICYmICh4ICYgMikpKQorI2Vsc2UKKyNkZWZpbmUgRU5BQkxFRCh4KSAoKChsb2NhbCAmJiAhdGNwX2luY29taW5nKSAmJiAoeCAmIDEpKSB8fCBcCisoKCFsb2NhbCB8fCB0Y3BfaW5jb21pbmcpICYmICh4JjIpKSkKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworLyogVGhlc2UgYXJlIGZyb20gdGhlIGJvb2sgKi8KKworI2RlZmluZSB0b2NoYXIoY2gpICAoKChjaCkgKyBTUCApICYgMHhGRiApCS8qIE51bWJlciB0byBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgeHVuY2hhcihjaCkgKCgoY2gpIC0gU1AgKSAmIDB4RkYgKQkvKiBDaGFyYWN0ZXIgdG8gbnVtYmVyICovCisjZGVmaW5lIGN0bChjaCkgICAgICgoKGNoKSBeIDY0ICkgJiAweEZGICkJLyogQ29udHJvbC9VbmNvbnRyb2wgdG9nZ2xlICovCisjZGVmaW5lIHVucGFyKGNoKSAgICgoKGNoKSAmIDEyNykgJiAweEZGICkJLyogQ2xlYXIgcGFyaXR5IGJpdCAqLworCisjaWZuZGVmIE5PTE9DQUwJCQkJLyogQ09OTkVDVCByZXR1cm4gc3RhdHVzIGNvZGVzICovCisKKy8qIFVzZXJzIHdpbGwgc2VlIHRoZSBudW1iZXJzIHNvIHRoZXkgY2FuJ3QgYmUgY2hhbmdlZCAqLworLyogTnVtYmVycyA+PSAxMDAgaW5kaWNhdGUgY29ubmVjdGlvbiBsb3NzICovCisKKyNkZWZpbmUgQ1NYX05PTkUgICAgICAgIDAJCS8qIE5vIENPTk5FQ1QgeWV0IHNvIG5vIHN0YXR1cyAqLworI2RlZmluZSBDU1hfRVNDQVBFICAgICAgMQkJLyogVXNlciBFc2NhcGVkIGJhY2sgKi8KKyNkZWZpbmUgQ1NYX1RSSUdHRVIgICAgIDIJCS8qIFRyaWdnZXIgd2FzIGVuY291bnRlcmVkICovCisjZGVmaW5lIENTWF9JS1NEICAgICAgICAzCQkvKiBJS1NEIGF1dG9zeW5jaHJvbml6YXRpb24gKi8KKyNkZWZpbmUgQ1NYX0FQQyAgICAgICAgIDQJCS8qIEFwcGxpY2F0aW9uIFByb2dyYW0gQ29tbWFuZCAqLworI2RlZmluZSBDU1hfSURMRSAgICAgICAgNQkJLyogSWRsZSBsaW1pdCBleGNlZWRlZCAqLworI2RlZmluZSBDU1hfVE5fRVJSICAgICAgNgkJLyogVGVsbmV0IEVycm9yICovCisjZGVmaW5lIENTWF9NQUNSTyAgICAgICA3ICAgICAgICAgICAgICAgLyogTWFjcm8gYm91bmQgdG8ga2V5c3Ryb2tlICovCisjZGVmaW5lIENTWF9USU1FICAgICAgICA4ICAgICAgICAgICAgICAgLyogVGltZSBMaW1pdCBleGNlZWRlZCAqLworI2RlZmluZSBDU1hfSU5URVJOQUwgIDEwMAkJLyogSW50ZXJuYWwgZXJyb3IgKi8KKyNkZWZpbmUgQ1NYX0NBUlJJRVIgICAxMDEJCS8qIENhcnJpZXIgcmVxdWlyZWQgYnV0IG5vdCBkZXRlY3RlZCAqLworI2RlZmluZSBDU1hfSU9FUlJPUiAgIDEwMgkJLyogSS9PIGVycm9yIG9uIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgQ1NYX0hPU1RESVNDICAxMDMJCS8qIERpc2Nvbm5lY3RlZCBieSBob3N0ICovCisjZGVmaW5lIENTWF9VU0VSRElTQyAgMTA0CQkvKiBEaXNjb25uZWN0ZWQgYnkgdXNlciAqLworI2RlZmluZSBDU1hfU0VTU0lPTiAgIDEwNQkJLyogU2Vzc2lvbiBMaW1pdCBleGNlZWRlZCAqLworI2RlZmluZSBDU1hfVE5fUE9MICAgIDEwNgkJLyogUmVqZWN0ZWQgZHVlIHRvIFRlbG5ldCBQb2xpY3kgKi8KKyNkZWZpbmUgQ1NYX0tJTExfU0lHICAxMDcgICAgICAgICAgICAgICAvKiBSZWNlaXZlZCBLaWxsIFNpZ25hbCAqLworCisvKiBTRVQgVEVSTUlOQUwgSURMRS1BQ1RJT04gdmFsdWVzICovCisKKyNkZWZpbmUgSURMRV9SRVQgIDAJCQkvKiBSZXR1cm4gdG8gcHJvbXB0ICovCisjZGVmaW5lIElETEVfRVhJVCAxCQkJLyogRXhpdCBmcm9tIEtlcm1pdCAqLworI2RlZmluZSBJRExFX0hBTkcgMgkJCS8qIEhhbmd1cCB0aGUgY29ubmVjdGlvbiAqLworI2RlZmluZSBJRExFX09VVCAgMwkJCS8qIE9VVFBVVCBhIHN0cmluZyAqLworI2RlZmluZSBJRExFX1ROT1AgNAkJCS8qIFRFTE5FVCBOT1AgKi8KKyNkZWZpbmUgSURMRV9UQVlUIDUJCQkvKiBURUxORVQgQVlUICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisvKiBNb2RlbSBhbmQgZGlhbGluZyBkZWZpbml0aW9ucyAqLworCisjaWZuZGVmIE5PRElBTAorCisvKiBNb2RlbSBjYXBhYmlsaXRpZXMgKGJpdCB2YWx1ZXMpICovCisjZGVmaW5lIENLRF9BVCAgIDEJCQkvKiBIYXllcyBBVCBjb21tYW5kcyBhbmQgcmVzcG9uc2VzICovCisjZGVmaW5lIENLRF9WMjUgIDIJCQkvKiBWLjI1YmlzIGNvbW1hbmRzIGFuZCByZXNwb25zZXMgKi8KKyNkZWZpbmUgQ0tEX1NCICAgNAkJCS8qIFNwZWVkIGJ1ZmZlcmluZyAqLworI2RlZmluZSBDS0RfRUMgICA4CQkJLyogRXJyb3IgY29ycmVjdGlvbiAqLworI2RlZmluZSBDS0RfREMgIDE2CQkJLyogRGF0YSBjb21wcmVzc2lvbiAqLworI2RlZmluZSBDS0RfSFcgIDMyCQkJLyogSGFyZHdhcmUgZmxvdyBjb250cm9sICovCisjZGVmaW5lIENLRF9TVyAgNjQJCQkvKiAoTG9jYWwpIHNvZnR3YXJlIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBDS0RfS1MgMTI4CQkJLyogS2VybWl0IHNwb29maW5nICovCisjZGVmaW5lIENLRF9UQiAyNTYJCQkvKiBNYWRlIGJ5IFRlbGViaXQgKi8KKyNkZWZpbmUgQ0tEX0lEIDUxMgkJCS8qIEhhcyBDYWxsZXIgSUQgKi8KKworLyogRElBTCBjb21tYW5kIHJlc3VsdCBjb2RlcyAqLworI2RlZmluZSBESUFfVU5LICAgLTEJCQkvKiBObyBESUFMIGNvbW1hbmQgZ2l2ZW4geWV0ICovCisjZGVmaW5lIERJQV9PSyAgICAgMAkJCS8qIERJQUwgc3VjY2VlZGVkICovCisjZGVmaW5lIERJQV9OT01PICAgMQkJCS8qIE1vZGVtIHR5cGUgbm90IHNwZWNpZmllZCAqLworI2RlZmluZSBESUFfTk9MSSAgIDIJCQkvKiBDb21tdW5pY2F0aW9uIGxpbmUgbm90IHNwZWMnZCAqLworI2RlZmluZSBESUFfT1BFTiAgIDMJCQkvKiBMaW5lIGNhbid0IGJlIG9wZW5lZCAqLworI2RlZmluZSBESUFfTk9TUCAgIDQJCQkvKiBTcGVlZCBub3Qgc3BlY2lmaWVkICovCisjZGVmaW5lIERJQV9IQU5HICAgNQkJCS8qIEhhbmd1cCBmYWlsdXJlICovCisjZGVmaW5lIERJQV9JRSAgICAgNgkJCS8qIEludGVybmFsIGVycm9yIChtYWxsb2MsIGV0YykgKi8KKyNkZWZpbmUgRElBX0lPICAgICA3CQkJLyogSS9PIGVycm9yICovCisjZGVmaW5lIERJQV9USU1PICAgOAkJCS8qIERpYWwgdGltZW91dCBleHBpcmVkICovCisjZGVmaW5lIERJQV9JTlRSICAgOQkJCS8qIERpYWxpbmcgaW50ZXJydXB0ZWQgYnkgdXNlciAqLworI2RlZmluZSBESUFfTlJEWSAgMTAJCQkvKiBNb2RlbSBub3QgcmVhZHkgKi8KKyNkZWZpbmUgRElBX1BBUlQgIDExCQkJLyogUGFydGlhbCBkaWFsIGNvbW1hbmQgT0sgKi8KKyNkZWZpbmUgRElBX0RJUiAgIDEyCQkJLyogRGlhbGluZyBkaXJlY3RvcnkgZXJyb3IgKi8KKyNkZWZpbmUgRElBX0hVUCAgIDEzCQkJLyogTW9kZW0gd2FzIGh1bmcgdXAgT0sgKi8KKyNkZWZpbmUgRElBX05SU1AgIDE5CQkJLyogTm8gcmVzcG9uc2UgZnJvbSBtb2RlbSAqLworI2RlZmluZSBESUFfRVJSICAgMjAJCQkvKiBNb2RlbSBjb21tYW5kIGVycm9yICovCisjZGVmaW5lIERJQV9OT0lOICAyMQkJCS8qIEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSBtb2RlbSAqLworI2RlZmluZSBESUFfQlVTWSAgMjIJCQkvKiBQaG9uZSBidXN5ICovCisjZGVmaW5lIERJQV9OT0NBICAyMwkJCS8qIE5vIGNhcnJpZXIgKi8KKyNkZWZpbmUgRElBX05PRFQgIDI0CQkJLyogTm8gZGlhbHRvbmUgKi8KKyNkZWZpbmUgRElBX1JJTkcgIDI1CQkJLyogUmluZywgaW5jb21pbmcgY2FsbCAqLworI2RlZmluZSBESUFfTk9BTiAgMjYJCQkvKiBObyBhbnN3ZXIgKi8KKyNkZWZpbmUgRElBX0RJU0MgIDI3CQkJLyogRGlzY29ubmVjdGVkICovCisjZGVmaW5lIERJQV9WT0lDICAyOAkJCS8qIEFuc3dlcmVkIGJ5IHZvaWNlICovCisjZGVmaW5lIERJQV9OT0FDICAyOQkJCS8qIEFjY2VzcyBkZW5pZWQsIGZvcmJpZGRlbiBjYWxsICovCisjZGVmaW5lIERJQV9CTENLICAzMAkJCS8qIEJsYWNrbGlzdGVkICovCisjZGVmaW5lIERJQV9ERUxBICAzMQkJCS8qIERlbGF5ZWQgKi8KKyNkZWZpbmUgRElBX0ZBWCAgIDMyCQkJLyogRmF4ICovCisjZGVmaW5lIERJQV9ESUdJICAzMyAgICAgICAgICAgICAgICAgICAgLyogRGlnaXRhbCBMaW5lICovCisjZGVmaW5lIERJQV9UQVBJICAzNAkJCS8qIFRBUEkgZGlhbGluZyBmYWlsdXJlICovCisjZGVmaW5lIERJQV9VRVJSICA5OAkJCS8qIFVua25vd24gZXJyb3IgKi8KKyNkZWZpbmUgRElBX1VOU1AgIDk5CQkvKiBVbnNwZWNpZmllZCBmYWlsdXJlIGRldGVjdGVkIGJ5IG1vZGVtICovCisKKyNkZWZpbmUgTURNSU5GCXN0cnVjdCBtZG1pbmYKKworTURNSU5GIHsJCQkvKiBTdHJ1Y3R1cmUgZm9yIG1vZGVtLXNwZWNpZmljIGluZm9ybWF0aW9uICovCisKKyAgICBjaGFyICogbmFtZTsJCS8qIERlc2NyaXB0aXZlIG5hbWUgKi8KKyAgICBjaGFyICogcHVsc2U7CQkvKiBDb21tYW5kIHRvIGZvcmNlIHB1bHNlIGRpYWxpbmcgKi8KKyAgICBjaGFyICogdG9uZTsJCS8qIENvbW1hbmQgdG8gZm9yY2UgdG9uZSBkaWFsaW5nICovCisgICAgaW50ICAgIGRpYWxfdGltZTsJCS8qIFRpbWUgbW9kZW0gYWxsb3dzIGZvciBkaWFsaW5nIChzZWNzKSAqLworICAgIGNoYXIgKiBwYXVzZV9jaGFyczsJCS8qIENoYXJhY3RlcihzKSB0byB0ZWxsIG1vZGVtIHRvIHBhdXNlICovCisgICAgaW50CSAgIHBhdXNlX3RpbWU7CQkvKiBUaW1lIGFzc29jaWF0ZWQgd2l0aCBwYXVzZSBjaGFycyAoc2VjcykgKi8KKyAgICBjaGFyICogd2FrZV9zdHI7CQkvKiBTdHJpbmcgdG8gd2FrZXVwIG1vZGVtICYgcHV0IGluIGNtZCBtb2RlICovCisgICAgaW50CSAgIHdha2VfcmF0ZTsJCS8qIERlbGF5IGJldHdlZW4gd2FrZV9zdHIgY2hhcmFjdGVycyAobXNlY3MpICovCisgICAgY2hhciAqIHdha2VfcHJvbXB0OwkJLyogU3RyaW5nIHByb21wdCBhZnRlciB3YWtlX3N0ciAqLworICAgIGNoYXIgKiBkbW9kZV9zdHI7CQkvKiBTdHJpbmcgdG8gcHV0IG1vZGVtIGluIGRpYWxpbmcgbW9kZSAqLworICAgIGNoYXIgKiBkbW9kZV9wcm9tcHQ7CS8qIFN0cmluZyBwcm9tcHQgZm9yIGRpYWxpbmcgbW9kZSAqLworICAgIGNoYXIgKiBkaWFsX3N0cjsJCS8qIERpYWxpbmcgc3RyaW5nLCB3aXRoICIlcyIgZm9yIG51bWJlciAqLworICAgIGludCAgICBkaWFsX3JhdGU7CQkvKiBJbnRlcmNoYXIgZGVsYXkgdG8gbW9kZW0gKG1zZWMpICovCisgICAgaW50ICAgIGVzY190aW1lOwkJLyogRXNjYXBlIHNlcXVlbmNlIGd1YXJkIHRpbWUgKG1zZWMpICovCisgICAgaW50ICAgIGVzY19jaGFyOwkJLyogRXNjYXBlIGNoYXJhY3RlciAqLworICAgIGNoYXIgKiBodXBfc3RyOwkJLyogSGFuZ3VwIHN0cmluZyAqLworICAgIGNoYXIgKiBod2ZjX3N0cjsJCS8qIEhhcmR3YXJlIGZsb3cgY29udHJvbCBzdHJpbmcgKi8KKyAgICBjaGFyICogc3dmY19zdHI7CQkvKiBTb2Z0d2FyZSBmbG93IGNvbnRyb2wgc3RyaW5nICovCisgICAgY2hhciAqIG5vZmNfc3RyOwkJLyogTm8gZmxvdyBjb250cm9sIHN0cmluZyAqLworICAgIGNoYXIgKiBlY19vbl9zdHI7CQkvKiBFcnJvciBjb3JyZWN0aW9uIG9uIHN0cmluZyAqLworICAgIGNoYXIgKiBlY19vZmZfc3RyOwkJLyogRXJyb3IgY29ycmVjdGlvbiBvZmYgc3RyaW5nICovCisgICAgY2hhciAqIGRjX29uX3N0cjsJCS8qIERhdGEgY29tcHJlc3Npb24gb24gc3RyaW5nICovCisgICAgY2hhciAqIGRjX29mZl9zdHI7CQkvKiBEYXRhIGNvbXByZXNzaW9uIG9mZiBzdHJpbmcgKi8KKyAgICBjaGFyICogYWFfb25fc3RyOwkJLyogQXV0b2Fuc3dlciBvbiBzdHJpbmcgKi8KKyAgICBjaGFyICogYWFfb2ZmX3N0cjsJCS8qIEF1dG9hbnN3ZXIgb2ZmIHN0cmluZyAqLworICAgIGNoYXIgKiBzYl9vbl9zdHI7CQkvKiBTcGVlZCBidWZmZXJpbmcgb24gc3RyaW5nICovCisgICAgY2hhciAqIHNiX29mZl9zdHI7CQkvKiBTcGVlZCBidWZmZXJpbmcgb2ZmIHN0cmluZyAqLworICAgIGNoYXIgKiBzcF9vbl9zdHI7CQkvKiBTcGVha2VyIG9uIHN0cmluZyAqLworICAgIGNoYXIgKiBzcF9vZmZfc3RyOwkJLyogU3BlYWtlciBvZmYgc3RyaW5nICovCisgICAgY2hhciAqIHZvbDFfc3RyOwkJLyogVm9sdW1lIGxvdyBzdHJpbmcgKi8KKyAgICBjaGFyICogdm9sMl9zdHI7CQkvKiBWb2x1bWUgbWVkIHN0cmluZyAqLworICAgIGNoYXIgKiB2b2wzX3N0cjsJCS8qIFZvbHVtZSBoaWdoIHN0cmluZyAqLworICAgIGNoYXIgKiBpZ25vcmVkdDsJCS8qIElnbm9yZSBkaWFsdG9uZSBzdHJpbmcgKi8KKyAgICBjaGFyICogaW5pMjsJCS8qIExhc3QtbWludXRlIGluaXQgc3RyaW5nICovCisgICAgbG9uZyAgIG1heF9zcGVlZDsJCS8qIE1heGltdW0gaW50ZXJmYWNlIHNwZWVkICovCisgICAgbG9uZyAgIGNhcGFzOwkJLyogQ2FwYWJpbGl0eSBiaXRzICovCisgICAgLyogZnVuY3Rpb24gdG8gcmVhZCBtb2RlbSdzIHJlc3BvbnNlIHN0cmluZyB0byBhIG5vbi1kaWFsaW5nIGNvbW1hbmQgKi8KKyAgICBfUFJPVE9UWVAoIGludCAoKm9rX2ZuKSwgKGludCxpbnQpICk7Cit9OworI2VuZGlmIC8qIE5PRElBTCAqLworCisvKiBTeW1ib2xzIGZvciBGaWxlIEF0dHJpYnV0ZXMgKi8KKworI2RlZmluZSBBVF9YQUxMICAwCQkJLyogQWxsIG9mIHRoZW0gKi8KKyNkZWZpbmUgQVRfQUxMWSAgMQkJCS8qIEFsbCBvZiB0aGVtIG9uIChZZXMpICovCisjZGVmaW5lIEFUX0FMTE4gIDIJCQkvKiBBbGwgb2YgdGhlbSBvZmYgKG5vKSAqLworI2RlZmluZSBBVF9MRU5LICAzCQkJLyogTGVuZ3RoIGluIEsgKi8KKyNkZWZpbmUgQVRfRlRZUCAgNAkJCS8qIEZpbGUgVHlwZSAqLworI2RlZmluZSBBVF9EQVRFICA1CQkJLyogQ3JlYXRpb24gZGF0ZSAqLworI2RlZmluZSBBVF9DUkVBICA2CQkJLyogQ3JlYXRvciAqLworI2RlZmluZSBBVF9BQ0NUICA3CQkJLyogQWNjb3VudCAqLworI2RlZmluZSBBVF9BUkVBICA4CQkJLyogQXJlYSAqLworI2RlZmluZSBBVF9QU1dEICA5CQkJLyogUGFzc3dvcmQgZm9yIGFyZWEgKi8KKyNkZWZpbmUgQVRfQkxLUyAxMAkJCS8qIEJsb2Nrc2l6ZSAqLworI2RlZmluZSBBVF9BQ0NFIDExCQkJLyogQWNjZXNzICovCisjZGVmaW5lIEFUX0VOQ08gMTIJCQkvKiBFbmNvZGluZyAqLworI2RlZmluZSBBVF9ESVNQIDEzCQkJLyogRGlzcG9zaXRpb24gKi8KKyNkZWZpbmUgQVRfTFBSTyAxNAkJCS8qIExvY2FsIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgQVRfR1BSTyAxNQkJCS8qIEdlbmVyaWMgUHJvdGVjdGlvbiAqLworI2RlZmluZSBBVF9TWVNJIDE2CQkJLyogU3lzdGVtIElEICovCisjZGVmaW5lIEFUX1JFQ0YgMTcJCQkvKiBSZWNvcmQgRm9ybWF0ICovCisjZGVmaW5lIEFUX1NZU1AgMTgJCQkvKiBTeXN0ZW0tRGVwZW5kZW50IFBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgQVRfTEVOQiAxOQkJCS8qIExlbmd0aCBpbiBCeXRlcyAqLworI2RlZmluZSBBVF9FT0EgIDIwCQkJLyogRW5kIG9mIEF0dHJpYnV0ZXMgKi8KKworLyogS2VybWl0IHBhY2tldCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IHBrdGluZm8gewkJCS8qIFBhY2tldCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KKyAgICBDSEFSICpiZl9hZHI7CQkJLyogIGJ1ZmZlciBhZGRyZXNzICovCisgICAgaW50ICAgYmZfbGVuOwkJCS8qICBidWZmZXIgbGVuZ3RoICovCisgICAgQ0hBUiAqcGtfYWRyOwkJCS8qIFBhY2tldCBhZGRyZXNzIHdpdGhpbiBidWZmZXIgKi8KKyAgICBpbnQgICBwa19sZW47CQkJLyogIGxlbmd0aCBvZiBkYXRhIHdpdGhpbiBidWZmZXIgKi8KKyAgICBpbnQgICBwa190eXA7CQkJLyogIHBhY2tldCB0eXBlICovCisgICAgaW50ICAgcGtfc2VxOwkJCS8qICBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyICovCisgICAgaW50ICAgcGtfcnRyOwkJCS8qICByZXRyYW5zbWlzc2lvbiBjb3VudCAqLworfTsKKworLyogU2VuZCBNb2RlcyAoaW5kaWNhdGluZyB3aGljaCB0eXBlIG9mIFNFTkQgY29tbWFuZCB3YXMgdXNlZCkgKi8KKworI2RlZmluZSBTTV9TRU5EICAgICAwCisjZGVmaW5lIFNNX01TRU5EICAgIDEKKyNkZWZpbmUgU01fUkVTRU5EICAgMgorI2RlZmluZSBTTV9QU0VORCAgICAzCisjZGVmaW5lIFNNX01BSUwgICAgIDQKKyNkZWZpbmUgU01fUFJJTlQgICAgNQorCisjZGVmaW5lIE9QVEJVRkxFTiAyNTYKKworLyogRmlsZS1yZWxhdGVkIHN5bWJvbHMgYW5kIHN0cnVjdHVyZXMgKi8KKy8qIFVzZWQgYnkgU0VUIEZJTEUgY29tbWFuZCBidXQgYWxzbyBieSBwcm90b2NvbCBhbmQgaS9vIG1vZHVsZXMgKi8KKworI2RlZmluZSBYTU9ERV9BIDAJLyogVHJhbnNmZXIgbW9kZSBBdXRvbWF0aWMgKi8KKyNkZWZpbmUgWE1PREVfTSAxCS8qIFRyYW5zZmVyIG1vZGUgTWFudWFsICAgICovCisKKyNkZWZpbmUgICBYWUZJTE4gMCAgCS8qICBOYW1pbmcgICovCisjZGVmaW5lICAgICBYWUZOX0wgMAkvKiAgICBMaXRlcmFsICovCisjZGVmaW5lICAgICBYWUZOX0MgMQkvKiAgICBDb252ZXJ0ZWQgKi8KKyNkZWZpbmUgICBYWUZJTFQgMSAgCS8qICBUeXBlICAgICovCisjZGVmaW5lICAgICBYWUZUX1QgMCAgICAvKiAgICBUZXh0ICAqLworI2RlZmluZSAgICAgWFlGVF9CIDEgICAgLyogICAgQmluYXJ5ICovCisjZGVmaW5lICAgICBYWUZUX0kgMiAgICAvKiAgICBJbWFnZSBvciBCbG9jayAoVk1TKSAqLworI2RlZmluZSAgICAgWFlGVF9MIDMJLyogICAgTGFiZWxlZCAodGFnZ2VkIGJpbmFyeSkgKFZNUyBvciBPUy8yKSAqLworI2RlZmluZSAgICAgWFlGVF9VIDQgICAgLyogICAgQmluYXJ5IFVuZGVmaW5lZCAoVk1TKSAqLworI2RlZmluZSAgICAgWFlGVF9NIDUJLyogICAgTWFjQmluYXJ5IChNYWNpbnRvc2gpICovCisjZGVmaW5lICAgICBYWUZUX1ggNgkvKiAgICBURU5FWCAoRlRQIFRZUEUgTCA4KSAqLworI2RlZmluZSAgICAgWFlGVF9EIDk5ICAgLyogICAgRGVidWcgKGZvciBzZXNzaW9uIGxvZ3MpICovCisjZGVmaW5lICAgWFlGSUxXIDIgICAgICAvKiAgV2FybmluZyAqLworI2RlZmluZSAgIFhZRklMRCAzICAgICAgLyogIERpc3BsYXkgKi8KKyNkZWZpbmUgICBYWUZJTEMgNCAgICAgIC8qICBDaGFyYWN0ZXIgc2V0ICovCisjZGVmaW5lICAgWFlGSUxGIDUgICAgICAvKiAgUmVjb3JkIEZvcm1hdCAqLworI2RlZmluZSAgICAgWFlGRl9TICAwICAgLyogICAgU3RyZWFtICovCisjZGVmaW5lICAgICBYWUZGX1YgIDEgICAvKiAgICBWYXJpYWJsZSAqLworI2RlZmluZSAgICAgWFlGRl9WQiAyICAgLyogICAgVmFyaWFibGUgd2l0aCBSQ1cncyAqLworI2RlZmluZSAgICAgWFlGRl9GICAzICAgLyogICAgRml4ZWQgbGVuZ3RoICovCisjZGVmaW5lICAgICBYWUZGX1UgIDQgICAvKiAgICBVbmRlZmluZWQgKi8KKyNkZWZpbmUgICBYWUZJTFIgNiAgICAgIC8qICBSZWNvcmQgbGVuZ3RoICovCisjZGVmaW5lICAgWFlGSUxPIDcgICAgICAvKiAgT3JnYW5pemF0aW9uICovCisjZGVmaW5lICAgICBYWUZPX1MgMCAgICAvKiAgICBTZXF1ZW50aWFsICovCisjZGVmaW5lICAgICBYWUZPX0kgMSAgICAvKiAgICBJbmRleGVkICovCisjZGVmaW5lICAgICBYWUZPX1IgMiAgICAvKiAgICBSZWxhdGl2ZSAqLworI2RlZmluZSAgIFhZRklMUCA4ICAgICAgLyogIFByaW50ZXIgY2FycmlhZ2UgY29udHJvbCAqLworI2RlZmluZSAgICAgWFlGUF9OIDAgICAgLyogICAgTmV3bGluZSAoaW1iZWRkZWQgY29udHJvbCBjaGFyYWN0ZXJzKSAqLworI2RlZmluZSAgICAgWFlGUF9GIDEgICAgLyogICAgRk9SVFJBTiAoc3BhY2UsIDEsICssIGV0YywgaW4gY29sdW1uIDEgKi8KKyNkZWZpbmUgICAgIFhZRlBfUCAyICAgIC8qICAgIFNwZWNpYWwgcHJpbnRlciBjYXJyaWFnZSBjb250cm9scyAqLworI2RlZmluZSAgICAgWFlGUF9YIDQgICAgLyogICAgTm9uZSAqLworI2RlZmluZSAgIFhZRklMWCA5ICAgICAgLyogIENvbGxpc2lvbiBBY3Rpb24gKi8KKyNkZWZpbmUgICAgIFhZRlhfQSAzICAgIC8qICAgIEFwcGVuZCAqLworI2RlZmluZSAgICAgWFlGWF9RIDUgICAgLyogICAgQXNrICovCisjZGVmaW5lICAgICBYWUZYX0IgMiAgICAvKiAgICBCYWNrdXAgKi8KKyNkZWZpbmUgICAgIFhZRlhfRCA0ICAgIC8qICAgIERpc2NhcmQgKi8KKyNkZWZpbmUgICAgIFhZRlhfUiAwICAgIC8qICAgIFJlbmFtZSAqLworI2RlZmluZSAgICAgWFlGWF9YIDEgICAgLyogICAgUmVwbGFjZSAqLworI2RlZmluZSAgICAgWFlGWF9VIDYgICAgLyogICAgVXBkYXRlICovCisjZGVmaW5lICAgICBYWUZYX00gNyAgICAvKiAgICBNb2R0aW1lcyBkaWZmZXIgKi8KKyNkZWZpbmUgICBYWUZJTEIgMTAgICAgIC8qICBCbG9ja3NpemUgKi8KKyNkZWZpbmUgICBYWUZJTFogMTEgICAgIC8qICBEaXNwb3NpdGlvbiAqLworI2RlZmluZSAgICAgWFlGWl9OIDAgICAgLyogICAgTmV3LCBDcmVhdGUgKi8KKyNkZWZpbmUgICAgIFhZRlpfQSAxICAgIC8qICAgIE5ldywgYXBwZW5kIGlmIGZpbGUgZXhpc3RzLCBlbHNlIGNyZWF0ZSAqLworI2RlZmluZSAgICAgWFlGWl9PIDIgICAgLyogICAgT2xkLCBmaWxlIG11c3QgZXhpc3QgKi8KKyNkZWZpbmUgICBYWUZJTFMgMTIgICAgIC8qICBGaWxlIEJ5dGUgU2l6ZSAqLworI2RlZmluZSAgIFhZRklMTCAxMyAgICAgLyogIEZpbGUgTGFiZWwgKFZNUykgKi8KKyNkZWZpbmUgICBYWUZJTEkgMTQgICAgIC8qICBGaWxlIEluY29tcGxldGUgKi8KKyNkZWZpbmUgICBYWUZJTFEgMTUgICAgIC8qICBGaWxlIHBhdGggYWN0aW9uIChzdHJpcCBvciBub3QpICovCisjZGVmaW5lICAgWFlGSUxHIDE2ICAgICAvKiAgRmlsZSBkb3dubG9hZCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgICBYWUZJTEEgMTcgICAgIC8qICBMaW5lIHRlcm1pbmF0b3IgZm9yIGxvY2FsIHRleHQgZmlsZXMgKi8KKyNkZWZpbmUgICAgIFhZRkFfTCAwMTIgIC8qICAgIExGIChhcyBpbiBVTklYKSAqLworI2RlZmluZSAgICAgWFlGQV9DIDAxNSAgLyogICAgQ1IgKGFzIGluIE9TLTkgb3IgTWFjIE9TKSAqLworI2RlZmluZSAgICAgWFlGQV8yIDAwMCAgLyogIENSTEYgLS0gTm90ZTogdGhpcyBtdXN0IGJlIGRlZmluZWQgYXMgMCAqLworI2RlZmluZSAgIFhZRklMWSAxOCAgICAgLyogIERlc3RpbmF0aW9uICovCisjZGVmaW5lICAgWFlGSUxWIDE5CS8qICBFT0YgRGV0ZWN0aW9uIE1ldGhvZCAqLworI2RlZmluZSAgICAgWFlFT0ZfTCAwICAgLyogICAgRmlsZSBsZW5ndGggKi8KKyNkZWZpbmUgICAgIFhZRU9GX1ogMSAgIC8qICAgIEN0cmwtWiBpbiBmaWxlICovCisjZGVmaW5lICAgWFlGSUxIICAgMjAgICAvKiAgT1VUUFVUIHBhcmFtZXRlcnMgLSBidWZmZXJlZCwgYmxvY2tpbmcsIGV0YyAqLworI2RlZmluZSAgIFhZRklCUCAgIDIxCS8qICBCSU5BUlktUEFUVEVSTiAqLworI2RlZmluZSAgIFhZRklUUCAgIDIyICAgLyogIFRFWFQtUEFUVEVSTiAqLworI2RlZmluZSAgIFhZRklQQSAgIDIzICAgLyogIFBBVFRFUk5TIE9OL09GRiAqLworI2RlZmluZSAgIFhZRklMVSAgIDI0ICAgLyogIFVDUyAuLi4gKi8KKyNkZWZpbmUgICBYWUZfUFJNICAyNSAgIC8qICBQRVJNSVNTSU9OUywgUFJPVEVDVElPTiAqLworI2RlZmluZSAgIFhZRl9JTlNQIDI2ICAgLyogIElOU1BFQ1RJT04gKFNDQU4pICovCisjZGVmaW5lICAgWFlGX0RGTFQgMjcgICAvKiAgREVGQVVMVCAoY2hhcmFjdGVyIHNldHMpICovCisjZGVmaW5lICAgWFlGX1NTUEEgMjggICAvKiAgU1RSSU5HU1BBQ0UgKi8KKyNkZWZpbmUgICBYWUZfTFNJWiAyOSAgIC8qICBMSVNUU0laRSAqLworCisvKiBGaWxlIFR5cGUgKHJldHVybiBjb2RlKSBkZWZpbml0aW9ucyBhbmQgY29ycmVzcG9uZGluZyBuYW1lIHN0cmluZ3MgKi8KKworI2RlZmluZSBGVF83QklUIDAJCQkvKiA3LWJpdCB0ZXh0ICovCisjZGVmaW5lIEZUXzhCSVQgMQkJCS8qIDgtYml0IHRleHQgKi8KKyNkZWZpbmUgRlRfVVRGOCAyCQkJLyogVVRGOCAqLworI2RlZmluZSBGVF9VQ1MyIDMJCQkvKiBVQ1MyICovCisjZGVmaW5lIEZUX1RFWFQgNAkJCS8qIFVua25vd24gdGV4dCAqLworI2RlZmluZSBGVF9CSU4gIDUJCQkvKiBCaW5hcnkgKi8KKyNkZWZpbmUgU0NBTkZJTEVCVUYgNDkxNTIJCS8qIFNpemUgb2YgZmlsZSBzY2FuICg0OEspICovCisKKy8qIENvbm5lY3Rpb24gY2xvc2VkIHJlYXNvbnMgKi8KKworI2RlZmluZSBXQ19SRU1PICAgMAkJCS8qIENsb3NlZCBieSByZW1vdGUgKi8KKyNkZWZpbmUgV0NfQ0xPUyAgIDEJCQkvKiBDbG9zZWQgZnJvbSBvdXIgZW5kICovCisjZGVmaW5lIFdDX1RFTE9QVCAyCQkJLyogVGVsbmV0IG5lZ290aWF0aW9uIGZhaWx1cmUgKi8KKworI2lmZGVmIEJJR0JVRk9LCisjZGVmaW5lIEZUUEFUVEVSTlMgMjU2CisjZWxzZQorI2RlZmluZSBGVFBBVFRFUk5TIDY0CisjZW5kaWYgLyogQklHQlVGT0sgKi8KKworI2RlZmluZSBTWVNfVU5LICAgIDAJCQkvKiBTZWxlY3RlZCBzZXJ2ZXIgc3lzdGVtIHR5cGVzICovCisjZGVmaW5lIFNZU19VTklYICAgMQorI2RlZmluZSBTWVNfV0lOMzIgIDIKKyNkZWZpbmUgU1lTX1ZNUyAgICAzCisjZGVmaW5lIFNZU19PUzIgICAgNAorI2RlZmluZSBTWVNfRE9TICAgIDUKKyNkZWZpbmUgU1lTX1RPUFMxMCA2CisjZGVmaW5lIFNZU19UT1BTMjAgNworI2RlZmluZSBTWVNfVk9TICAgIDgKKyNkZWZpbmUgU1lTX0RHICAgICA5CisjZGVmaW5lIFNZU19PU0sgICAgMTAKKyNkZWZpbmUgU1lTX01BWCAgICAxMQorCisjaWZkZWYgQ0tfU01BTEwKKyNkZWZpbmUgUFdCVUZMIDYzCisjZWxzZQorI2RlZmluZSBQV0JVRkwgMjU1CisjZW5kaWYgLyogQ0tfU01BTEwgKi8KKworI2lmZGVmIE9TMgorc3RydWN0IHR0X2luZm9fcmVjIHsJCQkvKiBUZXJtaW5hbCBlbXVsYXRpb24gaW5mbyAqLworICAgIGNoYXIgICp4X25hbWU7CisgICAgY2hhciAqeF9hbGlhc2VzWzRdOworICAgIGNoYXIgICp4X2lkOworfTsKKyNlbmRpZiAvKiBPUzIgKi8KKworLyogQkVFUCBUWVBFUyAqLworI2RlZmluZSBCUF9CRUwgIDAJCQkvKiBUZXJtaW5hbCBiZWxsICovCisjZGVmaW5lIEJQX05PVEUgMQkJCS8qIEluZm8gKi8KKyNkZWZpbmUgQlBfV0FSTiAyCQkJLyogV2FybmluZyAqLworI2RlZmluZSBCUF9GQUlMIDMJCQkvKiBFcnJvciAqLworCisjaWZuZGVmIE5PSUtTRAorI2lmZGVmIElLU0RCCQkJCS8qIElLU0QgRGF0YWJhc2UgZGVmaW5pdGlvbnMgKi8KKworLyogRmllbGQgdmFsdWVzICovCisKKyNkZWZpbmUgREJGX0lOVVNFICAgIDEJCQkvKiBGbGFnIGJpdHMuLi4gSW4gdXNlICovCisjZGVmaW5lIERCRl9VU0VSICAgICAyCQkJLyogUmVhbCB1c2VyICh2ZXJzdXMgYW5vbnltb3VzKSAqLworI2RlZmluZSBEQkZfTE9HR0VEICAgNAkJCS8qIExvZ2dlZCBpbiAodmVyc3VzIG5vdCkgKi8KKworLyogRGF0YSBEZWZpbml0aW9ucy4uLiAqLworCisvKiBOdW1lcmljIGZpZWxkcywgaGV4LCByaWdodCBqdXN0aWZpZWQsIDAtZmlsbGVkIG9uIGxlZnQgKi8KKworI2RlZmluZSBkYl9GTEFHUyAgICAgMAkJCS8qIEZpZWxkIDA6IEZsYWdzICovCisjZGVmaW5lIERCX0ZMQUdTICAgICAwCQkJLyogT2Zmc2V0OiAwICovCisjZGVmaW5lIGRCX0ZMQUdTICAgICA0CQkJLyogTGVuZ3RoOiA0IChoZXggZGlnaXRzKSAqLworCisjZGVmaW5lIGRiX0FUWVBFICAgICAxCQkJLyogRmllbGQgMTogQXV0aGVudGljYXRpb24gdHlwZSAqLworI2RlZmluZSBEQl9BVFlQRSAgICAgNAkJCS8qIDQgaGV4IGRpZ2l0cyAqLworI2RlZmluZSBkQl9BVFlQRSAgICAgNAorCisjZGVmaW5lIGRiX0FNT0RFICAgICAyCQkJLyogRmllbGQgMjogQXV0aGVudGljYXRpb24gbW9kZSAqLworI2RlZmluZSBEQl9BTU9ERSAgICAgOAkJCS8qIDQgaGV4IGRpZ2l0cyAqLworI2RlZmluZSBkQl9BTU9ERSAgICAgNAorCisjZGVmaW5lIGRiX1NUQVRFICAgICAzCQkJLyogRmllbGQgMzogU3RhdGUgLSA0IGhleCBkaWdpdHMqLworI2RlZmluZSBEQl9TVEFURSAgICAxMgkJCS8qIDQgaGV4IGRpZ2l0cyAqLworI2RlZmluZSBkQl9TVEFURSAgICAgNAorCisjZGVmaW5lIGRiX01ZUElEICAgICA0CQkJLyogRmllbGQgNDogTXkgUElEICovCisjZGVmaW5lIERCX01ZUElEICAgIDE2CQkJLyogMTYgaGV4IGRpZ2l0cyBsZWZ0IHBhZGRlZCB3aXRoIDAgKi8KKyNkZWZpbmUgZEJfTVlQSUQgICAgMTYKKworI2RlZmluZSBkYl9TQUREUiAgICAgNQkJCS8qIEZpZWxkIDU6IFNlcnZlciAobXkpIElQIGFkZHJlc3MgKi8KKyNkZWZpbmUgREJfU0FERFIgICAgMzIJCQkvKiAxNiBoZXggZGlnaXRzIGxlZnQgcGFkZGVkIHdpdGggMCAqLworI2RlZmluZSBkQl9TQUREUiAgICAxNgorCisjZGVmaW5lIGRiX0NBRERSICAgICA2CQkJLyogRmllbGQgNjogQ2xpZW50IElQIGFkZHJlc3MgKi8KKyNkZWZpbmUgREJfQ0FERFIgICAgNDgJCQkvKiAxNiBoZXggZGlnaXRzIGxlZnQgcGFkZGVkIHdpdGggMCAqLworI2RlZmluZSBkQl9DQUREUiAgICAxNgorCisvKiBEYXRlLXRpbWUgZmllbGRzICgxNyByaWdodC1hZGp1c3RlZCBpbiAxOCBmb3IgWTEwSyByZWFkaW5lc3MpICovCisKKyNkZWZpbmUgZGJfU1RBUlQgICAgIDcJCQkvKiBGaWVsZCA3OiBTZXNzaW9uIHN0YXJ0IGRhdGUtdGltZSAqLworI2RlZmluZSBEQl9TVEFSVCAgICA2NQkJCS8qIDY0IGlzIGxlYWRpbmcgc3BhY2UgZm9yIFkxMEsgKi8KKyNkZWZpbmUgZEJfU1RBUlQgICAgMTcKKworI2RlZmluZSBkYl9MQVNUVSAgICAgOAkJCS8qIEZpZWxkIDg6IExhc3QgbGFzdHUgZGF0ZS10aW1lICovCisjZGVmaW5lIERCX0xBU1RVICAgIDgzCQkJLyogODIgaXMgbGVhZGluZyBzcGFjZSBmb3IgWTEwSyAqLworI2RlZmluZSBkQl9MQVNUVSAgICAxNworCisjZGVmaW5lIGRiX1VMRU4gICAgICA5CQkJLyogRmllbGQgOTogTGVuZ3RoIG9mIFVzZXJuYW1lICovCisjZGVmaW5lIERCX1VMRU4gICAgMTAwCQkJLyogNCBoZXggZGlnaXRzICovCisjZGVmaW5lIGRCX1VMRU4gICAgICA0CisKKyNkZWZpbmUgZGJfRExFTiAgICAgMTAJCQkvKiBGaWVsZCAxMDogTGVuZ3RoIG9mIERpcmVjdG9yeSAqLworI2RlZmluZSBEQl9ETEVOICAgIDEwNAkJCS8qIDQgaGV4IGRpZ2l0cyAqLworI2RlZmluZSBkQl9ETEVOICAgICAgNAorCisjZGVmaW5lIGRiX0lMRU4gICAgIDExCQkJLyogRmllbGQgMTE6IExlbmd0aCBvZiBJbmZvICovCisjZGVmaW5lIERCX0lMRU4gICAgMTA4CQkJLyogNCBoZXggZGlnaXRzICovCisjZGVmaW5lIGRCX0lMRU4gICAgICA0CisKKyNkZWZpbmUgZGJfUEFEMSAgICAgMTIJCQkvKiBGaWVsZCAxMjogKFJlc2VydmVkKSAqLworI2RlZmluZSBEQl9QQUQxICAgIDExMgkJCS8qIGZpbGxlZCB3aXRoIHNwYWNlcyAqLworI2RlZmluZSBkQl9QQUQxICAgIDkxMgorCisvKiBTdHJpbmcgZmllbGRzLCBhbGwgcmlnaHQtcGFkZGVkIHdpdGggYmxhbmtzICovCisKKyNkZWZpbmUgZGJfVVNFUiAgICAgMTMJCQkvKiBGaWVsZCAxMzogVXNlcm5hbWUgKi8KKyNkZWZpbmUgREJfVVNFUiAgIDEwMjQJCQkvKiByaWdodC1wYWRkZWQgd2l0aCBzcGFjZXMgKi8KKyNkZWZpbmUgZEJfVVNFUiAgIDEwMjQKKworI2RlZmluZSBkYl9ESVIgICAgICAxNAkJCS8qIEZpZWxkIDE0OiBDdXJyZW50IGRpcmVjdG9yeSAqLworI2RlZmluZSBEQl9ESVIgICAgMjA0OAkJCS8qIHJpZ2h0LXBhZGRlZCB3aXRoIHNwYWNlcyAqLworI2RlZmluZSBkQl9ESVIgICAgMTAyNAorCisjZGVmaW5lIGRiX0lORk8gICAgIDE1CQkJLyogRmllbGQgMTU6IFN0YXRlLXNwZWNpZmljIGluZm8gKi8KKyNkZWZpbmUgREJfSU5GTyAgIDMwNzIJCQkvKiByaWdodC1wYWRkZWQgd2l0aCBzcGFjZXMgKi8KKyNkZWZpbmUgZEJfSU5GTyAgIDEwMjQKKworI2RlZmluZSBEQl9SRUNMICAgNDA5NgkJCS8qIERhdGFiYXNlIHJlY29yZCBsZW5ndGggKi8KKworLyogT2Zmc2V0LCBsZW5ndGgsIGFuZCB0eXBlIG9mIGVhY2ggZmllbGQgdGhydSBpdHMgZGJfWFhYIHN5bWJvbCAqLworCisjZGVmaW5lIERCVF9IRVggMQkJCS8qIEhleGFkZWNpbWFsIG51bWJlciAqLworI2RlZmluZSBEQlRfU1RSIDIJCQkvKiBTdHJpbmcgKi8KKyNkZWZpbmUgREJUX0RBVCAzCQkJLyogRGF0ZS1UaW1lIHl5eXltbWRkIGhoOm1tOnNzICovCisjZGVmaW5lIERCVF9VTkQgOQkJCS8qIFVuZGVmaW5lZCBhbmQgYmxhbmsgKi8KKworc3RydWN0IGlrc2RiZmxkIHsKKyAgICBpbnQgb2ZmOwkJCQkvKiBQb3NpdGlvbiAob2Zmc2V0KSAqLworICAgIGludCBsZW47CQkJCS8qIExlbmd0aCAoYnl0ZXMpICovCisgICAgaW50IHR5cDsJCQkJLyogRGF0YSB0eXBlICovCit9OworX1BST1RPVFlQKGludCBkYmluaXQsICh2b2lkKSk7CitfUFJPVE9UWVAoaW50IGluaXRzbG90LCAoaW50KSk7CitfUFJPVE9UWVAoaW50IGdldHNsb3QsICh2b2lkKSk7CitfUFJPVE9UWVAoaW50IGZyZWVzbG90LCAoaW50KSk7CitfUFJPVE9UWVAoaW50IHVwZHNsb3QsIChpbnQpKTsKK19QUk9UT1RZUChpbnQgc2xvdHN0YXRlLCAoaW50LCBjaGFyICosIGNoYXIgKiwgY2hhciAqKSk7CitfUFJPVE9UWVAoaW50IHNsb3RkaXIsIChjaGFyICosIGNoYXIgKikpOworI2VuZGlmIC8qIElLU0RCICovCisjZW5kaWYgLyogTk9JS1NEICovCisKKy8qIEFOU0kgZm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIHByb3RvY29sLXJlbGF0ZWQgZnVuY3Rpb25zLiAqLworCitfUFJPVE9UWVAoIGludCBpbnB1dCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBpbmlidWZzLCAoaW50LCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBtYWtlYnVmLCAoaW50LCBpbnQsIENIQVIgW10sIHN0cnVjdCBwa3RpbmZvICopICk7CitfUFJPVE9UWVAoIGludCBta3NidWYsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBta3JidWYsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBzcGFjaywgKGNoYXIsIGludCwgaW50LCBDSEFSICopICk7CitfUFJPVE9UWVAoIFZPSUQgcHJvdG8sICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgcnBhY2ssICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgYWNrLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IG5hY2ssIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBhY2tuLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgYWNrMSwgKENIQVIgKikgKTsKK19QUk9UT1RZUCggaW50IGFja25zLCAoaW50LCBDSEFSICopICk7CisjaWZkZWYgU1RSRUFNSU5HCitfUFJPVE9UWVAoIGludCBmYXN0YWNrLCAodm9pZCkgKTsKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KK19QUk9UT1RZUCggaW50IHJlc2VuZCwgKGludCkgKTsKK19QUk9UT1RZUCggaW50IGVycnBrdCwgKENIQVIgKikgKTsKK19QUk9UT1RZUCggVk9JRCBsb2dwa3QsIChjaGFyLCBpbnQsIENIQVIgKiwgaW50KSApOworX1BST1RPVFlQKCBDSEFSIGRvcGFyLCAoQ0hBUikgKTsKK19QUk9UT1RZUCggaW50IGNoazEsIChDSEFSICosIGludCkgKTsKK19QUk9UT1RZUCggdW5zaWduZWQgaW50IGNoazIsIChDSEFSICosIGludCkgKTsKK19QUk9UT1RZUCggdW5zaWduZWQgaW50IGNoazMsIChDSEFSICosIGludCkgKTsKK19QUk9UT1RZUCggaW50IHNpcGt0LCAoY2hhcikgKTsKK19QUk9UT1RZUCggaW50IHNvcGt0LCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHNpbml0LCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCByaW5pdCwgKENIQVIgKikgKTsKK19QUk9UT1RZUCggaW50IHNwYXIsIChDSEFSICopICk7CitfUFJPVE9UWVAoIGludCByY3ZmaWwsIChjaGFyICopICk7CitfUFJPVE9UWVAoIENIQVIgKiBycGFyLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGduZmlsZSwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBnZXRzYnVmLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgZ2V0cmJ1ZiwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBmcmVlc2J1ZiwgKGludCkgKTsKK19QUk9UT1RZUCggaW50IGZyZWVyYnVmLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgZHVtcHNidWYsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgZHVtcHJidWYsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIGZyZWVycGt0LCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgY2hrd2luLCAoaW50LCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IHJzYXR0ciwgKENIQVIgKikgKTsKK19QUk9UT1RZUCggY2hhciAqZ2V0cmVhc29uLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgc2NtZCwgKGNoYXIsIENIQVIgKikgKTsKK19QUk9UT1RZUCggaW50IGVuY3N0ciwgKENIQVIgKikgKTsKK19QUk9UT1RZUCggaW50IGRlY29kZSwgKENIQVIgKiwgaW50ICgqKShjaGFyKSwgaW50KSApOworX1BST1RPVFlQKCBpbnQgYmRlY29kZSwgKENIQVIgKiwgaW50ICgqKShjaGFyKSkgKTsKK19QUk9UT1RZUCggaW50IGZucGFyc2UsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBzeXNjbWQsIChjaGFyICosIGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IGN3ZCwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IHJlbXNldCwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IGluaXRhdHRyLCAoc3RydWN0IHphdHRyICopICk7CitfUFJPVE9UWVAoIGludCBnYXR0ciwgKENIQVIgKiwgc3RydWN0IHphdHRyICopICk7CitfUFJPVE9UWVAoIGludCBhZGVidSwgKGNoYXIgKiwgc3RydWN0IHphdHRyICopICk7CitfUFJPVE9UWVAoIGludCBjYW5uZWQsIChDSEFSICopICk7CitfUFJPVE9UWVAoIGludCBvcGVudCwgKHN0cnVjdCB6YXR0ciAqKSApOworX1BST1RPVFlQKCBpbnQgY2tvcGVueCwgKHN0cnVjdCB6YXR0ciAqKSApOworX1BST1RPVFlQKCBpbnQgb3BlbmEsIChjaGFyICosIHN0cnVjdCB6YXR0ciAqKSApOworX1BST1RPVFlQKCBpbnQgb3BlbmksIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBvcGVubywgKGNoYXIgKiwgc3RydWN0IHphdHRyICosIHN0cnVjdCBmaWxpbmZvICopICk7CitfUFJPVE9UWVAoIGludCBvcGVuYywgKGludCwgY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgcmVvZiwgKGNoYXIgKiwgc3RydWN0IHphdHRyICopICk7CitfUFJPVE9UWVAoIFZPSUQgcmVvdCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBzZmlsZSwgKGludCkgKTsKK19QUk9UT1RZUCggaW50IHNhdHRyLCAoaW50LCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBzZGF0YSwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBzZW9mLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgc3hlb2YsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBzZW90LCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHdpbmRvdywgKGludCkgKTsKK19QUk9UT1RZUCggaW50IGNsc2lmLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGNsc29mLCAoaW50KSApOworX1BST1RPVFlQKCBDSEFSIHNldGdlbiwgKGNoYXIsIGNoYXIgKiwgY2hhciAqLCBjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBnZXRwa3QsIChpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IG1heGRhdGEsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgcHV0c3J2LCAoY2hhcikgKTsKK19QUk9UT1RZUCggaW50IHB1dHRybSwgKGNoYXIpICk7CitfUFJPVE9UWVAoIGludCBwdXRxdWUsIChjaGFyKSApOworX1BST1RPVFlQKCBpbnQgcHV0ZmlsLCAoY2hhcikgKTsKK19QUk9UT1RZUCggaW50IHB1dG1maWwsIChjaGFyKSApOworX1BST1RPVFlQKCBpbnQgenB1dGZpbCwgKGNoYXIpICk7CitfUFJPVE9UWVAoIFZPSUQgemRzdHVmZiwgKENIQVIpICk7CitfUFJPVE9UWVAoIGludCB0aW5pdCwgKGludCkgKTsKK19QUk9UT1RZUCggVk9JRCBwa3Rpbml0LCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCByZXNldGMsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIHhzaW5pdCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBhZGpwa2wsIChpbnQsaW50LGludCkgKTsKK19QUk9UT1RZUCggaW50IGNoa3RpbW8sIChpbnQsaW50KSApOworX1BST1RPVFlQKCBpbnQgbnh0cGt0LCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCByY2FsY3BzeiwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBzcmluaXQsIChpbnQsIGludCwgaW50KSApOworX1BST1RPVFlQKCBWT0lEIHRzdGF0cywgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgZnN0YXRzLCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCBpbnRtc2csIChsb25nKSApOworX1BST1RPVFlQKCBWT0lEIGVybXNnLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgY2hraW50LCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCBzZGVidSwgKGludCkgKTsKK19QUk9UT1RZUCggVk9JRCByZGVidSwgKENIQVIgKiwgaW50KSApOworX1BST1RPVFlQKCBjaGFyICogZGJjaHIsICggaW50ICkgKTsKKyNpZmRlZiBDT01NRU5UCitfUFJPVE9UWVAoIFNJR1RZUCBzdHB0cmFwLCAoaW50LCBpbnQpICk7CitfUFJPVE9UWVAoIFNJR1RZUCB0cmFwLCAoaW50LCBpbnQpICk7CisjZWxzZQorX1BST1RPVFlQKCBTSUdUWVAgc3RwdHJhcCwgKGludCkgKTsKK19QUk9UT1RZUCggU0lHVFlQIHRyYXAsIChpbnQpICk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworX1BST1RPVFlQKCBjaGFyICogY2tfZXJyc3RyLCAodm9pZCkgKTsKKyNpZm5kZWYgTk9YRkVSCitfUFJPVE9UWVAoIGludCBhZ25ieXRlLCAodm9pZCkgKTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KK19QUk9UT1RZUCggaW50IHhnbmJ5dGUsIChpbnQsIGludCwgaW50ICgqKSh2b2lkKSkgKTsKK19QUk9UT1RZUCggaW50IHhwbmJ5dGUsIChpbnQsIGludCwgaW50LCBpbnQgKCopKGNoYXIpKSApOworCisvKiBVc2VyIGludGVyZmFjZSBmdW5jdGlvbnMgbmVlZGVkIGJ5IG1haW4gcHJvZ3JhbSwgZXRjLiAqLworCitfUFJPVE9UWVAoIGludCBkb2NvbmVjdCwgKGludCxpbnQpICk7CitfUFJPVE9UWVAoIFZPSUQgc2V0ZmxvdywgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgcHJlc2NhbiwgKGludCkgKTsKK19QUk9UT1RZUCggVk9JRCBzZXRpbnQsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIGRvaW5pdCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgZG9mYXN0LCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCBjbWRpbmksICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgZG90YWtlLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgY21kbGluLCAodm9pZCkgKTsKKyNpZmRlZiBPUzIKK19QUk9UT1RZUCggaW50IGNvbmVjdCwgKGludCkgKTsKKyNlbHNlIC8qIE9TMiAqLworX1BST1RPVFlQKCBpbnQgY29uZWN0LCAodm9pZCkgKTsKKyNlbmRpZiAvKiBPUzIgKi8KK19QUk9UT1RZUCggaW50IGNrY2dldGMsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBja2NwdXRjLCAoaW50KSApOworX1BST1RPVFlQIChpbnQgbWRtaHVwLCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCBoZXJhbGQsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIGZpeGNtZCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBkb2FyZywgKGNoYXIpICk7CitfUFJPVE9UWVAoIGludCBkb3hhcmcsIChjaGFyICoqLCBpbnQpICk7CitfUFJPVE9UWVAoIFZPSUQgdXNhZ2UsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIGRvY2xlYW4sIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBzbmRobHAsICgpICk7CitfUFJPVE9UWVAoIGludCBzbmRzdHJpbmcsIChjaGFyICopICk7CitfUFJPVE9UWVAoIFZPSUQgY2tob3N0LCAoY2hhciAqLCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBnZXR0Y3MsIChpbnQsIGludCkgKTsKK19QUk9UT1RZUCggVk9JRCBnZXRkaWFsZW52LCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCBzZXRwcmVmaXgsIChpbnQpICk7CitfUFJPVE9UWVAoVk9JRCBpbml0cHJvdG8sKGludCxjaGFyICosY2hhciAqLGNoYXIgKixjaGFyICosY2hhciAqLGNoYXIqLGNoYXIqKSk7CitfUFJPVE9UWVAoIFZPSUQgaW5pdHBhdCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgaW5pdGNzZXRzLCAodm9pZCkgKTsKK19QUk9UT1RZUCggY2hhciAqIGdldHN5c2lkLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgZ2V0c3lzaXgsIChjaGFyICopICk7CisjaWZkZWYgQ0tfVElNRVJTCitfUFJPVE9UWVAoIFZPSUQgcnR0aW5pdCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBnZXRydHQsIChpbnQsIGludCkgKTsKKyNlbmRpZiAvKiBDS19USU1FUlMgKi8KKworX1BST1RPVFlQKCBpbnQgaXNfYV90dHksIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBzbmRkaXIsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBzbmRkZWwsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBzbmR0eXBlLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgZG9vdXRwdXQsIChjaGFyICosIGludCkgKTsKK19QUk9UT1RZUCggaW50IGlzYWJzb2x1dGUsIChjaGFyICopICk7CitfUFJPVE9UWVAoIFZPSUQgd2hvYXJld2UsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgY2tta2RpciwgKGludCwgY2hhciAqLCBjaGFyICoqLCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IGF1dG9leGl0Y2hrLCAoQ0hBUikgKTsKK19QUk9UT1RZUCggVk9JRCBmY3BzLCAodm9pZCkgKTsKKyNpZmRlZiBPUzIKK19QUk9UT1RZUCggVk9JRCBsb2djaGFyLCAodW5zaWduZWQgc2hvcnQpICk7CisjZWxzZSAvKiBPUzIgKi8KK19QUk9UT1RZUCggVk9JRCBsb2djaGFyLCAoY2hhcikgKTsKKyNlbmRpZiAvKiBPUzIgKi8KK19QUk9UT1RZUCggVk9JRCBsb2dzdHIsIChjaGFyICosIGludCkgKTsKKworX1BST1RPVFlQKCBWT0lEIGRvbG9nZW5kLCAodm9pZCkgKTsKKyNpZmRlZiBOT0xPQ0FMCisjZGVmaW5lIGRvbG9nc2hvdygpCisjZWxzZQorX1BST1RPVFlQKCBsb25nIGRvbG9nc2hvdywgKGludCkgKTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBOT0RJU1BMQVkKKyNkZWZpbmUgZnhkaW5pdChhKQorI2Vsc2UKK19QUk9UT1RZUCggVk9JRCBmeGRpbml0LCAoaW50KSApOworI2VuZGlmIC8qIE5PRElTUExBWSAqLworCitfUFJPVE9UWVAoIGludCBmaWxlc2VsZWN0LCAoY2hhciAqLAorCQkJICAgIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwKKwkJCSAgICBsb25nLCBsb25nLAorCQkJICAgIGludCwgaW50LAorCQkJICAgIGNoYXIgKiopICk7CisKKworX1BST1RPVFlQKCBjaGFyICogd2hvYW1pLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHNob2VzYywgKGludCkgKTsKKworI2lmZGVmIENLX0FQQworX1BST1RPVFlQKCBpbnQgY2hrc3BrdCwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IGtzdGFydCwgKENIQVIpICk7CitfUFJPVE9UWVAoIFZPSUQgYXV0b2Rvd24sIChpbnQpKTsKKyNpZmRlZiBDS19YWVoKK19QUk9UT1RZUCggaW50IHpzdGFydCwgKENIQVIpICk7CisjZW5kaWYgLyogQ0tfWFlaICovCisjaWZkZWYgT1MyCitfUFJPVE9UWVAodm9pZCBhcGNfY29tbWFuZCwgKGludCwgY2hhciopKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19BUEMgKi8KKworLyogVXNlciBRdWVyeSBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyAqLworCitzdHJ1Y3QgdHh0Ym94IHsKKyAgICBjaGFyICogdF9idWY7CQkJLyogRGVzdGluYXRpb24gYnVmZmVyIGFkZHJlc3MgKi8KKyAgICBpbnQgICAgdF9sZW47CQkJLyogRGVzdGluYXRpb24gYnVmZmVyIGxlbmd0aCAqLworICAgIGNoYXIgKiB0X2xibDsJCQkvKiBMYWJlbCBmb3IgdGhpcyBmaWVsZCAqLworICAgIGNoYXIgKiB0X2RmbHQ7CQkJLyogRGVmYXVsdCByZXNwb25zZSBmb3IgdGhpcyBmaWVsZCAqLworICAgIGludCAgICB0X2VjaG87CQkJLyogMCA9IG5vLCAxID0geWVzLCAyID0gYXN0ZXJpc2tzICovCit9OworCisjZGVmaW5lIERFRkFVTFRfVVFfVElNRU9VVCAgMAorX1BST1RPVFlQKGludCB1cV9vaywgKGNoYXIgKixjaGFyICosaW50LGNoYXIgKiosaW50KSApOworX1BST1RPVFlQKGludCB1cV90eHQsIChjaGFyICosY2hhciAqLGludCxjaGFyICoqLGNoYXIgKixpbnQsY2hhciAqLGludCkpOworX1BST1RPVFlQKGludCB1cV9tdHh0LCAoY2hhciAqLGNoYXIgKiosaW50LHN0cnVjdCB0eHRib3hbXSkgKTsKK19QUk9UT1RZUChpbnQgdXFfZmlsZSwgKGNoYXIgKixjaGFyICosaW50LGNoYXIgKiosY2hhciAqLGNoYXIgKixpbnQpKTsKKworI2lmZGVmIENLX1VSTAorc3RydWN0IHVybGRhdGEgeworICAgIGNoYXIgKiBzYXY7CQkJLyogVGhlIFVSTCBpdHNlbGYgKi8KKyAgICBjaGFyICogc3ZjOwkJCS8qIFNlcnZpY2UgKi8KKyAgICBjaGFyICogdXNyOwkJCS8qIFVzZXIgKi8KKyAgICBjaGFyICogcHN3OwkJCS8qIFBhc3N3b3JkICovCisgICAgY2hhciAqIGhvczsJCQkvKiBIb3N0ICovCisgICAgY2hhciAqIHBvcjsJCQkvKiBQb3J0ICovCisgICAgY2hhciAqIHB0aDsJCQkvKiBQYXRoICovCit9OworX1BST1RPVFlQKGludCB1cmxwYXJzZSwgKGNoYXIgKiwgc3RydWN0IHVybGRhdGEgKikpOworI2VuZGlmIC8qIENLX1VSTCAqLworCisjZW5kaWYgLyogQ0tDS0VSX0ggKi8KKworLyogRW5kIG9mIGNrY2tlci5oICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2tjbGliLmMgYi9ja2VybWl0LTguMC4yMTEvY2tjbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiZjExMQotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja2NsaWIuYwpAQCAtMCwwICsxLDI4ODMgQEAKK2NoYXIgKiBja2xpYnYgPSAiQy1LZXJtaXQgbGlicmFyeSwgOC4wLjAzMywgMTYgTWFyIDIwMDMiOworCisjZGVmaW5lIENLQ0xJQl9DCisKKy8qIEMgSyBDIEwgSSBCIC4gQyAgLS0gIEMtS2VybWl0IExpYnJhcnkgcm91dGluZXMuICovCisKKy8qCisgIEF1dGhvcjogRnJhbmsgZGEgQ3J1eiA8ZmRjQGNvbHVtYmlhLmVkdT4sCisgIENvbHVtYmlhIFVuaXZlcnNpdHkgQWNhZGVtaWMgSW5mb3JtYXRpb24gU3lzdGVtcywgTmV3IFlvcmsgQ2l0eS4KKworICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorKi8KKworLyoKKyAgR2VuZXJhbC1wdXJwb3NlLCBzeXN0ZW0vcGxhdGZvcm0vY29tcGlsZXItaW5kZXBlbmRlbnQgcm91dGluZXMgZm9yIHVzZQorICBieSBhbGwgbW9kdWxlcy4gIE1hbnkgYXJlIHJlcGxhY2VtZW50cyBmb3IgY29tbW9ubHkgdXNlZCBDIGxpYnJhcnkKKyAgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCBmb3VuZCBvbiBldmVyeSBwbGF0Zm9ybSwgYW5kL29yIHRoYXQgbGFjayBuZWVkZWQKKyAgZnVuY3Rpb25hbGl0eSAoZS5nLiBjYXNlbGVzcyBzdHJpbmcgc2VhcmNoL2NvbXBhcmUpIG9yIHNhZmV0eSBmZWF0dXJlcy4KKworICAgIGNrc3RybmNweSgpICAtIFNpbWlsYXIgdG8gc3RybmNweSgpIGJ1dCBkaWZmZXJlbnQgKHNlZSBjb21tZW50cykuCisgICAgY2tzdHJuY2F0KCkgIC0gU2ltaWxhciB0byBzdHJuY2F0KCkgYnV0IGRpZmZlcmVudCAoc2VlIGNvbW1lbnRzKS4KKyAgICBjaGFydG9zdHIoKSAgLSBDb252ZXJ0cyBhIGNoYXIgdG8gYSBzdHJpbmcgKHNlbGYgb3IgY3RybCBjaGFyIG5hbWUpLgorICAgIGNrc3RyY2hyKCkgICAtIFBvcnRhYmxlIHN0cmNocigpLgorICAgIGNrc3RycGJyaygpICAtIFBvcnRhYmxlIHN0cnBicmsoKS4KKyAgICBja2xvd2VyKCkgICAgLSBMb3dlcmNhc2UgYSBzdHJpbmcgKGluIHBsYWNlKS4KKyAgICBja3VwcGVyKCkgICAgLSBVcHBlcmNhc2UgYSBzdHJpbmcgKGluIHBsYWNlKS4KKyAgICBja2luZGV4KCkgICAgLSBMZWZ0IG9yIHJpZ2h0IGluZGV4LgorICAgIGNrc3Ryc3RyKCkgICAtIFBvcnRhYmxlIHN0cnN0cigpLgorICAgIGNraXRvYSgpICAgICAtIENvbnZlcnRzIGludCB0byBzdHJpbmcuCisgICAgY2t1aXRvYSgpICAgIC0gQ29udmVydHMgdW5zaWduZWQgaW50IHRvIHN0cmluZy4KKyAgICBja2x0b2EoKSAgICAgLSBDb252ZXJ0cyBsb25nIHRvIHN0cmluZy4KKyAgICBja3VsdG9hKCkgICAgLSBDb252ZXJ0cyB1bnNpZ25lZCBsb25nIHRvIHN0cmluZy4KKyAgICBja2N0b2EoKSAgICAgLSBDb252ZXJ0cyBjaGFyIHRvIHN0cmluZy4KKyAgICBja21ha21zZygpICAgLSBDb25zdHJ1Y3RzIGEgbWVzc2FnZSBmcm9tIDQgc291cmNlIHN0cmluZ3MuCisgICAgY2ttYWt4bXNnKCkgIC0gQ29uc3RydWN0cyBhIG1lc3NhZ2UgZnJvbSAxMiBzb3VyY2Ugc3RyaW5ncy4KKyAgICBja21hdGNoKCkgICAgLSBQYXR0ZXJuIG1hdGNoaW5nLgorICAgIGNrbWVtY3B5KCkgICAtIFBvcnRhYmxlIG1lbWNweSgpLgorICAgIGNrcmNoYXIoKSAgICAtIFJpZ2h0bW9zdCBjaGFyYWN0ZXIgb2YgYSBzdHJpbmcuCisgICAgY2tzdHJjbXAoKSAgIC0gUG9zc2libHkgY2FzZWxlc3Mgc3RyaW5nIGNvbXBhcmlzb24uCisgICAgY2tzdHJwcmUoKSAgIC0gQ2FzZWxlc3Mgc3RyaW5nIHByZWZpeCBjb21wYXJpc29uLgorICAgIHNoX3NvcnQoKSAgICAtIFNvcnRzIGFuIGFycmF5IG9mIHN0cmluZ3MsIG1hbnkgb3B0aW9ucy4KKyAgICBicnN0cmlwKCkgICAgLSBTdHJpcHMgZW5jbG9zaW5nIGJyYWNlcyAoYW5kIGRvdWJsZXF1b3RlcykuCisgICAgbWFrZWxpc3QoKSAgIC0gU3BsaXRzICJ7e2l0ZW19e2l0ZW19Li4ufSIgaW50byBhbiBhcnJheS4KKyAgICBtYWtlc3RyKCkgICAgLSBDYXJlZnVsIG1hbGxvYygpIGZyb250IGVuZC4KKyAgICB4bWFrZXN0cigpICAgLSBkaXR0byAoc2VlIGNvbW1lbnRzKS4KKyAgICBja3JhZGl4KCkgICAgLSBDb252ZXJ0IG51bWJlciByYWRpeCAoMi0zNikuCisgICAgYjh0b2I2NCgpICAgIC0gQ29udmVydCBkYXRhIHRvIGJhc2UgNjQuCisgICAgYjY0dG9iOCgpICAgIC0gQ29udmVydCBiYXNlIDY0IHRvIGRhdGEuCisgICAgY2hrbnVtKCkgICAgIC0gQ2hlY2tzIGlmIHN0cmluZyBpcyBhIChwb3NzaWJseSBzaWduZWQpIGludGVnZXIuCisgICAgcmRpZ2l0cygpICAgIC0gQ2hlY2tzIGlmIHN0cmluZyBpcyBjb21wb3NlZCBvbmx5IG9mIGRlY2ltYWwgZGlnaXRzLgorICAgIGlzZmxvYXQoKSAgICAtIENoZWNrcyBpZiBzdHJpbmcgaXMgYSB2YWxpZCBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgICAgcGFybmFtKCkgICAgIC0gUmV0dXJucyBwYXJpdHkgbmFtZSBzdHJpbmcuCisgICAgaGhtbXNzKCkgICAgIC0gQ29udmVydHMgc2Vjb25kcyB0byBoaDptbTpzcyBzdHJpbmcuCisgICAgbHNldCgpICAgICAgIC0gV3JpdGUgZml4ZWQtbGVuZ3RoIGZpZWxkIGxlZnQtYWRqdXN0ZWQgaW50byBhIHJlY29yZC4KKyAgICByc2V0KCkgICAgICAgLSBXcml0ZSBmaXhlZC1sZW5ndGggZmllbGQgcmlnaHQtYWRqdXN0ZWQgaW50byBhIHJlY29yZC4KKyAgICB1bG9uZ3RvaGV4KCkgLSBDb252ZXJ0cyBhbiB1bnNpZ25lZCBsb25nIHRvIGEgaGV4IHN0cmluZy4KKyAgICBoZXh0b3Vsb25nKCkgLSBDb252ZXJ0cyBhIGhleCBzdHJpbmcgdG8gYW4gdW5zaWduZWQgbG9uZy4KKyAgICBja3NwbGl0KCkgICAgLSBTcGxpdHMgYSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiB3b3Jkcy4KKworICBQcm90b3R5cGVzIGFyZSBpbiBja2NsaWIuaC4KKworICBOb3RlOiBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGNvbnRhaW4gYW55IGV4dGVybiBkZWNsYXJhdGlvbnMuCisqLworI2luY2x1ZGUgImNrY3N5bS5oIgorI2luY2x1ZGUgImNrY2RlYi5oIgorI2luY2x1ZGUgImNrY2FzYy5oIgorCisvKiBQdWJsaWMgdmFyaWFibGVzICovCisKK2ludCBkYmxxdW8gPSAxOyAvKiBOb256ZXJvIGlmIGRvdWJsZXF1b3RlcyBjYW4gYmUgdXNlZCBmb3IgZ3JvdXBpbmcgKi8KKworY2hhciAqCitjY250YWJbXSA9IHsJLyogTmFtZXMgb2YgQVNDSUkgKEMwKSBjb250cm9sIGNoYXJhY3RlcnMgMC0zMSAqLworICAgICJOVUwiLCAiU09IIiwgIlNUWCIsICJFVFgiLCAiRU9UIiwgIkVOUSIsICJBQ0siLCAiQkVMIiwKKyAgICAiQlMiLCAgIkhUIiwgICJMRiIsICAiVlQiLCAgIkZGIiwgICJDUiIsICAiU08iLCAgIlNJIiwKKyAgICAiRExFIiwgIkRDMSIsICJEQzIiLCAiREMzIiwgIkRDNCIsICJOQUsiLCAiU1lOIiwgIkVUQiIsCisgICAgIkNBTiIsICJFTSIsICAiU1VCIiwgIkVTQyIsICJGUyIsICAiR1MiLCAgIlJTIiwgICJVUyIKK307CisKK2NoYXIgKgorYzF0YWJbXSA9IHsJLyogTmFtZXMgb2YgSVNPIDY0MjkgKEMxKSBjb250cm9sIGNoYXJhY3RlcnMgMC0zMiAqLworICAgICJYWFgiLCAiWFhYIiwgIkJQSCIsICJOQkgiLCAiSU5EIiwgIk5FTCIsICJTU0EiLCAiRVNBIiwKKyAgICAiSFRTIiwgIkhUSiIsICJWVFMiLCAiUExEIiwgIlBMVSIsICJSSSIsICAiU1MyIiwgIlNTMyIsCisgICAgIkRDUyIsICJQVTEiLCAiUFUyIiwgIlNUUyIsICJDQ0giLCAiTVciLCAgIlNQQSIsICJFUEEiLAorICAgICJTT1MiLCAiWFhYIiwgIlNDSSIsICJDU0kiLCAiU1QiLCAgIk9TQyIsICJQTSIsICAiQVBDIiwgIk5CUyIKK307CisKKyNkZWZpbmUgUlhSRVNVTFQgMTI3CitzdGF0aWMgY2hhciByeGRpZ2l0c1tdID0gIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7CitzdGF0aWMgY2hhciByeHJlc3VsdFtSWFJFU1VMVCsxXTsKKworLyogIEMgSyBTIFQgUiBOIEMgUCBZICovCisKKy8qCisgIENvcGllcyBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbnRvIGEgYnVmZmVyIHdob3NlIHRvdGFsIGxlbmd0aCBpcyBnaXZlbiwKKyAgZW5zdXJpbmcgdGhhdCB0aGUgcmVzdWx0IGlzIE5VTC10ZXJtaW5hdGVkIGV2ZW4gaWYgaXQgaGFzIHRvIGJlIHRydW5jYXRlZC4KKworICBDYWxsIHdpdGg6CisgICAgZGVzdCA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisgICAgc3JjICA9IHBvaW50ZXIgdG8gc291cmNlIHN0cmluZworICAgIGxlbiAgPSBsZW5ndGggb2YgZGVzdGluYXRpb24gYnVmZmVyICh0aGUgYWN0dWFsIGxlbmd0aCwgbm90IG9uZSBsZXNzKS4KKworICBSZXR1cm5zOgorICAgIGludCwgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQsIDAgb3IgbW9yZS4KKworICBOT1RFOiBUaGlzIGlzIE5PVCBhIHJlcGxhY2VtZW50IGZvciBzdHJuY3B5KCk6CisgICAuIHN0cm5jcHkoKSBkb2VzIG5vdCByZXF1aXJlIGl0cyBzb3VyY2Ugc3RyaW5nIHRvIGJlIE5VTC10ZXJtaW5hdGVkLgorICAgLiBzdHJuY3B5KCkgZG9lcyBub3QgbmVjZXNzYXJpbHkgTlVMLXRlcm1pbmF0ZSBpdHMgcmVzdWx0LgorICAgLiBzdHJuY3B5KCkgcmlnaHQtcGFkcyBkZXN0IHdpdGggTlVMcyBpZiBpdCBpcyBsb25nZXIgdGhhbiBzcmMuCisgICAuIHN0cm5jcHkoKSB0cmVhdHMgdGhlIGxlbmd0aCBhcmd1bWVudCBhcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgICAuIGNrc3RybmNweSgpIHRyZWF0cyB0aGUgbGVuZ3RoIGFyZ3VtZW50IGFzIHRoZSBzaXplIG9mIHRoZSBkZXN0IGJ1ZmZlci4KKyAgIC4gY2tzdHJuY3B5KCkgZG9lc24ndCBkdW1wIGNvcmUgaWYgZ2l2ZW4gTlVMTCBzdHJpbmcgcG9pbnRlcnMuCisgICAuIGNrc3RybmNweSgpIHJldHVybnMgYSBudW1iZXIuCisKKyAgVXNlIGNrc3RybmNweSgpIHdoZW4geW91IHdhbnQgdG86CisgICAuIENvcHkgYW4gZW50aXJlIHN0cmluZyBpbnRvIGEgYnVmZmVyIHdpdGhvdXQgb3ZlcnJ1bi4KKyAgIC4gR2V0IHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBiYWNrLgorCisgIFVzZSBzdHJuY3B5KCkgd2hlbiB5b3Ugd2FudCB0bzoKKyAgIC4gQ29weSBhIHBpZWNlIG9mIGEgc3RyaW5nLgorKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCitja3N0cm5jcHkoY2hhciAqIGRlc3QsIGNvbnN0IGNoYXIgKiBzcmMsIGludCBsZW4pCisjZWxzZQorY2tzdHJuY3B5KGRlc3Qsc3JjLGxlbikgY2hhciAqIGRlc3QsICogc3JjOyBpbnQgbGVuOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaW50IGk7CisgICAgaWYgKGxlbiA8IDEgfHwgIXNyYyB8fCAhZGVzdCkgewkvKiBOb3RoaW5nIG9yIG5vd2hlcmUgdG8gY29weSAqLworCWlmIChkZXN0KSAqZGVzdCA9IE5VTDsKKwlyZXR1cm4oMCk7CisgICAgfQorI2lmbmRlZiBOT0NLU1RSTkNQWQorICAgIGZvciAoaSA9IDA7IHNyY1tpXSAmJiAoaSA8IGxlbi0xKTsgaSsrKSAvKiBBcmdzIE9LLCBjb3B5ICovCisgICAgICBkZXN0W2ldID0gc3JjW2ldOworICAgIGRlc3RbaV0gPSBOVUw7CisjZWxzZQorICAgIGkgPSBzdHJsZW4oc3JjKTsKKyAgICBpZiAoaSA+IGxlbikgaSA9IGxlbjsKKyAgICBzdHJuY3B5KGRlc3Qsc3JjLGkpOworICAgIGRlc3RbbGVuXSA9IE5VTDsKKyNlbmRpZiAvKiBOT0NLU1RSTkNQWSAqLworICAgIHJldHVybihpKTsKK30KKworLyogIEMgSyBTIFQgUiBOIEMgQSBUICovCisKKy8qCisgIEFwcGVuZHMgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdG8gYSBidWZmZXIgd2hvc2UgdG90YWwgbGVuZ3RoIGlzIGdpdmVuLAorICBlbnN1cmluZyB0aGF0IHRoZSByZXN1bHQgaXMgTlVMLXRlcm1pbmF0ZWQgZXZlbiBpZiBpdCBoYWQgdG8gYmUgdHJ1bmNhdGVkLgorCisgIENhbGwgd2l0aDoKKyAgICBkZXN0ID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIgY29udGFpbmluZyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcKKyAgICBzcmMgID0gcG9pbnRlciB0byBudWxsLXRlcm1pbmF0ZWQgc291cmNlIHN0cmluZworICAgIGxlbiAgPSBsZW5ndGggb2YgZGVzdGluYXRpb24gYnVmZmVyICh0aGUgYWN0dWFsIGxlbmd0aCwgbm90IG9uZSBsZXNzKS4KKworICBSZXR1cm5zOgorICAgIGludCwgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQsIDAgb3IgbW9yZS4KKyovCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tzdHJuY2F0KGNoYXIgKiBkZXN0LCBjb25zdCBjaGFyICogc3JjLCBpbnQgbGVuKQorI2Vsc2UKK2Nrc3RybmNhdChkZXN0LHNyYyxsZW4pIGNoYXIgKiBkZXN0LCAqIHNyYzsgaW50IGxlbjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHJlZ2lzdGVyIGludCBpLCBqOworI2lmZGVmIE5PQ0tTVFJOQ1BZCisgICAgcmVnaXN0ZXIgY2hhciAqIHMxLCAqIHMyOworI2VuZGlmIC8qIE5PQ0tTVFJOQ1BZICovCisgICAgaWYgKGxlbiA8IDEgfHwgIXNyYyB8fCAhZGVzdCkgewkvKiBOb3RoaW5nIG9yIG5vd2hlcmUgdG8gY29weSAqLworCWlmIChkZXN0KSAqZGVzdCA9IE5VTDsKKwlyZXR1cm4oMCk7CisgICAgfQorI2lmbmRlZiBOT0NLU1RSTkNQWQorICAgIC8qIEFyZ3MgT0ssIGNvcHkgKi8KKyAgICBmb3IgKGkgPSAwLCBqID0gc3RybGVuKGRlc3QpOyBzcmNbaV0gJiYgKGkgPCBsZW4tai0xKTsgaSsrKQorICAgICAgZGVzdFtpK2pdID0gc3JjW2ldOworICAgIGRlc3RbaStqXSA9IE5VTDsKKyNlbHNlCisgICAgaiA9IDA7CisgICAgczEgPSBkZXN0OworICAgIHdoaWxlICgqczErKykgaisrOwkJCS8qIGogPSBzdHJsZW4oZGVzdCk7ICovCisgICAgczEtLTsJCQkJLyogKGJhY2sgdXAgb3ZlciBOVUwpICovCisKKyAgICBpID0gMDsKKyAgICBzMiA9IHNyYzsKKyAgICB3aGlsZSAoKnMyKyspIGkrKzsJCQkvKiBpID0gc3RybGVuKHNyYyk7ICovCisKKyAgICBpZiAoaSA+IChsZW4taikpCisgICAgICBpID0gbGVuIC0gajsKKyAgICBpZiAoaSA8PSAwKQorICAgICAgcmV0dXJuKDApOworCisjaWZkZWYgQ09NTUVOVAorICAgIHN0cm5jcHkoJmRlc3Rbal0sc3JjLGkpOworI2Vsc2UKKyAgICBqID0gaTsJCQkJLyogVGhpcyBzaG91bGQgYmUgYSBiaXQgZmFzdGVyLi4uICAgICovCisgICAgczIgPSBzcmM7CQkJCS8qIGRlcGVuZHMgb24gc3RyY3B5IGltcGxlbWVudGF0aW9uOyAqLworICAgIHdoaWxlICgoKnMxKysgPSAqczIrKykgJiYgai0tKQkvKiBhdCBsZWFzdCBpdCBzaG91bGRuJ3QgYmUgc2xvd2VyLiAgKi8KKyAgICAgIDsKKyAgICBkZXN0W2xlbi0xXSA9IE5VTDsJCQkvKiBJbiBjYXNlIG9mIGVhcmx5IGV4aXQuICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjZW5kaWYgLyogTk9DS1NUUk5DUFkgKi8KKyAgICByZXR1cm4oaSk7Cit9CisKKy8qICBDIEsgTSBBIEsgTSBTIEcgICovCisKKy8qCisgICBDb25zdHJ1Y3RzIGEgbWVzc2FnZSBmcm9tIHVwIHRvIDQgcGllY2VzIHdpdGggbGVuZ3RoIGNoZWNraW5nLgorICAgUmVzdWx0IGlzIGFsd2F5cyBOVUwgdGVybWluYXRlZC4gIENhbGwgd2l0aDoKKyAgICAgYnVmOiBQb2ludGVyIHRvIGJ1ZmZlciBmb3IgY29uc3RydWN0aW5nIG1lc3NhZ2UuCisgICAgIGxlbjogTGVuZ3RoIG9mIGJ1ZmZlci4KKyAgICAgczEtczQ6IFN0cmluZyBwb2ludGVycyAoY2FuIGJlIE5VTEwpLgorICAgUmV0dXJuczoKKyAgICAgMDogTm90aGluZyB3YXMgY29waWVkLgorICAgICBuOiAocG9zaXRpdmUgbnVtYmVyKSBuIGJ5dGVzIGNvcGllZCwgYWxsIGFyZ3MgY29waWVkIHN1Y2Nlc3NmdWxseS4KKyAgICAtbjogbiBieXRlcyB3ZXJlIGNvcGllZCwgZGVzdGluYXRpb24gYnVmZmVyIG5vdCBiaWcgZW5vdWdoIGZvciBhbGwuCisgICBBbHNvIHNlZToKKyAgICAgY2ttYWt4bXNnKCkgLS0gYWNjZXB0cyAxMiBzdHJpbmcgYXJncy4KKyAgICAgY2tpdG9hKCksIGNrbHRvYSgpLCBja2N0b2EoKSwgY2tpdG94KCksIGV0Yy4KKyAgICAgVXNlIGNrbWFrW3hdbXNnKCkgcGx1cyBjaz90bz8oKSBhcyBhIHNhZmUgcmVwbGFjZW1lbnQgZm9yIHNwcmludGYoKS4KKyovCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2ttYWttc2coY2hhciAqIGJ1ZiwgaW50IGxlbiwgY2hhciAqczEsIGNoYXIgKnMyLCBjaGFyICpzMywgY2hhciAqczQpCisjZWxzZSAvKiBDS19BTlNJQyAqLworY2ttYWttc2coYnVmLGxlbixzMSxzMixzMyxzNCkgY2hhciAqYnVmLCAqczEsICpzMiwgKnMzLCAqczQ7IGludCBsZW47CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpbnQgaSwgbiA9IDAsIG0gPSAwOworICAgIGNoYXIgKnM7CisgICAgY2hhciAqcCwgKmFbNF07CisKKyAgICBpZiAoIWJ1ZikgcmV0dXJuKG4pOwkJLyogTm8gZGVzdGluYXRpb24gKi8KKyAgICBpZiAobGVuIDwgMSkgcmV0dXJuKG4pOwkJLyogTm8gc2l6ZSAqLworCisgICAgcyA9IGJ1ZjsJCQkJLyogUG9pbnQgdG8gZGVzdGluYXRpb24gKi8KKyAgICBhWzBdID0gczE7IGFbMV0gPSBzMjsgYVsyXSA9IHMzOyBhWzNdID0gczQ7CS8qIEFycmF5IG9mIHNvdXJjZSBzdHJpbmdzICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewkJLyogTG9vcCB0aHJ1IGFycmF5ICovCisJcCA9IGFbaV07CQkJLyogUG9pbnQgdG8gdGhpcyBlbGVtZW50ICovCisJaWYgKHApIHsJCQkvKiBJZiBwb2ludGVyIG5vdCBudWxsICovCisJICAgIG4gPSBja3N0cm5jcHkocyxwLGxlbik7CS8qIENvcHkgc2FmZWx5ICovCisJICAgIG0gKz0gbjsJCQkvKiBBY2N1bXVsYXRlIHRvdGFsICovCisJICAgIGlmIChwW25dKQkJCS8qIERpZG4ndCBnZXQgd2hvbGUgdGhpbmc/ICovCisJICAgICAgcmV0dXJuKC1tKTsJCS8qIHJldHVybiBpbmRpY2F0aW5nIGJ1ZmZlciBmdWxsICovCisJICAgIGxlbiAtPSBuOwkJCS8qIERlZHVjdCBmcm9tIHNwYWNlIGxlZnQgKi8KKwkgICAgcyArPSBuOwkJCS8qIE90aGVyd2lzZSBhZHZhbmNlIGRlc3QgcG9pbnRlciAqLworCX0KKyAgICB9CisgICAgcmV0dXJuKG0pOwkJCQkvKiBSZXR1cm4gdG90YWwgYnl0ZXMgY29waWVkICovCit9CisKKworLyogIEMgSyBNIEEgSyBYIE0gUyBHICAqLworCisvKiAgRXhhY3RseSBsaWtlIGNrbWFrbXNnKCksIGJ1dCBhY2NlcHRzIDEyIHN0cmluZyBhcmd1bWVudHMuICovCisKK2ludAorI2lmZGVmIENLX0FOU0lDCitja21ha3htc2coY2hhciAqIGJ1ZiwgaW50IGxlbiwKKwkgIGNoYXIgKnMxLCBjaGFyICpzMiwgY2hhciAqczMsIGNoYXIgICpzNCwgY2hhciAgKnM1LCBjaGFyICpzNiwKKwkgIGNoYXIgKnM3LCBjaGFyICpzOCwgY2hhciAqczksIGNoYXIgKnMxMCwgY2hhciAqczExLCBjaGFyICpzMTIpCisjZWxzZSAvKiBDS19BTlNJQyAqLworY2ttYWt4bXNnKGJ1ZixsZW4sczEsczIsczMsczQsczUsczYsczcsczgsczksczEwLHMxMSxzMTIpCisgIGNoYXIgKmJ1ZiwgKnMxLCAqczIsICpzMywgKnM0LCAqczUsICpzNiwgKnM3LCAqczgsICpzOSwgKnMxMCwgKnMxMSwgKnMxMjsKKyAgaW50IGxlbjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGludCBpLCBuID0gMCwgbSA9IDA7CisgICAgY2hhciAqczsKKyAgICBjaGFyICpwLCAqYVsxMl07CisKKyAgICBpZiAoIWJ1ZikgcmV0dXJuKG4pOwkJLyogTm8gZGVzdGluYXRpb24gKi8KKyAgICBpZiAobGVuIDwgMSkgcmV0dXJuKG4pOwkJLyogTm8gc2l6ZSAqLworCisgICAgcyA9IGJ1ZjsJCQkJLyogUG9pbnQgdG8gZGVzdGluYXRpb24gKi8KKyAgICBhWzBdID0gczE7IGFbMV0gPSAgczI7IGFbMl0gID0gczM7ICBhWzNdID0gczQ7IC8qIFNvdXJjZS1zdHJpbmcgYXJyYXkgKi8KKyAgICBhWzRdID0gczU7IGFbNV0gPSAgczY7IGFbNl0gID0gczc7ICBhWzddID0gczg7CisgICAgYVs4XSA9IHM5OyBhWzldID0gczEwOyBhWzEwXSA9IHMxMTsgYVsxMV0gPSBzMTI7CisgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsJCS8qIExvb3AgdGhydSBhcnJheSAqLworCXAgPSBhW2ldOwkJCS8qIFBvaW50IHRvIHRoaXMgZWxlbWVudCAqLworCWlmIChwKSB7CQkJLyogSWYgcG9pbnRlciBub3QgbnVsbCAqLworCSAgICBuID0gY2tzdHJuY3B5KHMscCxsZW4pOwkvKiBDb3B5IHNhZmVseSAqLworCSAgICBtICs9IG47CQkJLyogQWNjdW11bGF0ZSB0b3RhbCAqLworCSAgICBpZiAocFtuXSkJCQkvKiBEaWRuJ3QgZ2V0IHdob2xlIHRoaW5nPyAqLworCSAgICAgIHJldHVybigtbSk7CQkvKiByZXR1cm4gaW5kaWNhdGluZyBidWZmZXIgZnVsbCAqLworCSAgICBsZW4gLT0gbjsJCQkvKiBEZWR1Y3QgZnJvbSBzcGFjZSBsZWZ0ICovCisJICAgIHMgKz0gbjsJCQkvKiBPdGhlcndpc2UgYWR2YW5jZSBkZXN0IHBvaW50ZXIgKi8KKwl9CisgICAgfQorICAgIHJldHVybihtKTsJCQkJLyogUmV0dXJuIHRvdGFsIGJ5dGVzIGNvcGllZCAqLworfQorCisvKiAgQyBIIEEgUiBUIE8gUyBUIFIgICovCisKKy8qICBDb252ZXJ0cyBhIGNoYXJhY3RlciB0byBhIHN0cmluZywgaW50ZXJwcmV0aW5nIGNvbnRyb2xzLiAgKi8KKworY2hhciAqCitjaGFydG9zdHIoeCkgaW50IHg7IHsJCQkvKiBDYWxsIHdpdGggY2hhciB4ICovCisgICAgc3RhdGljIGNoYXIgYnVmWzJdOwkJCS8qIFJldHVybnMgc3RyaW5nIHBvaW50ZXIuICovCisgICAgaWYgKHggPCAzMikKKyAgICAgIHJldHVybihjY250YWJbeF0pOworICAgIGlmICh4ID09IDEyNykKKyAgICAgIHJldHVybigiREVMIik7CisgICAgaWYgKHggPiAxMjcgJiYgeCA8IDE2MSkKKyAgICAgIHJldHVybihjMXRhYlt4IC0gMTI4XSk7CisgICAgaWYgKHggPT0gMHhBRCkKKyAgICAgIHJldHVybigiU0hZIik7CisgICAgYnVmWzFdID0gTlVMOworICAgIGJ1ZlswXSA9ICh1bnNpZ25lZCkoeCAmIDB4ZmYpOworICAgIHJldHVybigoY2hhciAqKWJ1Zik7Cit9CisKKy8qICBDIEsgUiBDIEggQSBSICovCisKKy8qICBSZXR1cm5zIHRoZSByaWdodG1vc3QgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nICovCisKK2ludAorY2tyY2hhcihzKSBjaGFyICogczsgeworICAgIHJlZ2lzdGVyIENIQVIgYyA9ICdcMCcsICpwOworICAgIHAgPSAoQ0hBUiAqKXM7CisgICAgaWYgKCFwKSBwID0gKENIQVIgKikiIjsJCS8qIE51bGwgcG9pbnRlciA9PSBlbXB0eSBzdHJpbmcgKi8KKyAgICBpZiAoISpwKSByZXR1cm4oMCk7CisgICAgd2hpbGUgKCpwKQkJCQkvKiBDcmF3bCB0byBlbmQgb2Ygc3RyaW5nICovCisgICAgICBjID0gKnArKzsKKyAgICByZXR1cm4oKHVuc2lnbmVkKShjICYgMHhmZikpOwkvKiBSZXR1cm4gZmluYWwgY2hhcmFjdGVyICovCit9CisKKy8qICBDIEsgUyBUIFIgQyBIIFIgICovCisKKy8qICBSZXBsYWNlbWVudCBmb3Igc3RyY2hyKCksIHdoaWNoIGlzIG5vdCB1bml2ZXJzYWwuICAqLworLyogIENhbGwgd2l0aDoKKyAgICAgcyA9IHBvaW50ZXIgdG8gc3RyaW5nIHRvIGxvb2sgaW4uCisgICAgIGMgPSBjaGFyYWN0ZXIgdG8gbG9vayBmb3IuCisgICAgUmV0dXJuczoKKyAgICAgTlVMTCBpZiBjIG5vdCBmb3VuZCBpbiBzIG9yIHVwb24gYW55IGtpbmQgb2YgZXJyb3IsIG9yOgorICAgICBwb2ludGVyIHRvIGZpcnN0IG9jY3VycmVuY2Ugb2YgYyBpbiBzLCBzZWFyY2hpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0LgorKi8KK2NoYXIgKgorI2lmZGVmIENLX0FOU0lDCitja3N0cmNocihjaGFyICogcywgY2hhciBjKQorI2Vsc2UKK2Nrc3RyY2hyKHMsYykgY2hhciAqcywgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogY2tzdHJjaHIgKi8geworICAgIGlmICghcykKKyAgICAgIHJldHVybihOVUxMKTsKKyAgICB3aGlsZSAoKnMgJiYgKnMgIT0gYykKKyAgICAgIHMrKzsKKyAgICByZXR1cm4oKCpzID09IGMpID8gcyA6IE5VTEwpOworfQorCisvKiAgQyBLIFMgVCBSIFIgQyBIIFIgICovCisKKy8qICBSZXBsYWNlbWVudCBmb3Igc3RycmNocigpLCB3aGljaCBpcyBub3QgdW5pdmVyc2FsLiAgKi8KKy8qICBDYWxsIHdpdGg6CisgICAgIHMgPSBwb2ludGVyIHRvIHN0cmluZyB0byBsb29rIGluLgorICAgICBjID0gY2hhcmFjdGVyIHRvIGxvb2sgZm9yLgorICAgIFJldHVybnM6CisgICAgIE5VTEwgaWYgYyBub3QgZm91bmQgaW4gcyBvciB1cG9uIGFueSBraW5kIG9mIGVycm9yLCBvcjoKKyAgICAgcG9pbnRlciB0byBmaXJzdCBvY2N1cnJlbmNlIG9mIGMgaW4gcywgc2VhcmNoaW5nIGZyb20gcmlnaHQgdG8gbGVmdC4KKyovCitjaGFyICoKKyNpZmRlZiBDS19BTlNJQworY2tzdHJyY2hyKGNoYXIgKiBzLCBjaGFyIGMpCisjZWxzZQorY2tzdHJyY2hyKHMsYykgY2hhciAqcywgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogY2tzdHJjaHIgKi8geworICAgIGNoYXIgKiBzMiA9IE5VTEw7CisgICAgaWYgKCFzKQorICAgICAgcmV0dXJuKE5VTEwpOworICAgIHdoaWxlICgqcykgeworCWlmICgqcyA9PSBjKQorCSAgczIgPSBzOworCXMrKzsKKyAgICB9CisgICAgcmV0dXJuKHMyKTsKK30KKworCisvKiBDIEsgUyBUIFIgUCBCIFIgSyAgLS0gIFBvcnRhYmxlIHJlcGxhY2VtZW50IGZvciBzdHJwYnJrKCkgICovCisKKy8qIFJldHVybnMgcG9pbnRlciB0byBmaXJzdCBjaGFyIGluIHMxIHRoYXQgaXMgYWxzbyBpbiBzMiwgb3IgTlVMTCAqLworCitjaGFyICoKK2Nrc3RycGJyayhzMSwgczIpIGNoYXIgKiBzMSwgKiBzMjsgeworICAgIGNoYXIgYzEsIGMyLCAqIHMzOworICAgIGlmICghczEgfHwgIXMyKSByZXR1cm4oTlVMTCk7CisgICAgaWYgKCEqczEgfHwgISpzMikgcmV0dXJuKE5VTEwpOworICAgIHdoaWxlICgoYzEgPSAqczErKykpIHsKKwlzMyA9IHMyOworCXdoaWxlICgoYzIgPSAqczMrKykpIHsKKwkgICAgaWYgKGMyID09IGMxKQorCSAgICAgIHJldHVybihzMS0xKTsKKwl9CisgICAgfQorICAgIHJldHVybihOVUxMKTsKK30KKworLyogIEMgSyBMIE8gVyBFIFIgIC0tICBMb3dlcmNhc2UgYSBzdHJpbmcgSU4gUExBQ0UgKi8KKworLyogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKi8KKworaW50Citja2xvd2VyKHMpIGNoYXIgKnM7IHsKKyAgICBpbnQgbiA9IDA7CisgICAgaWYgKCFzKSByZXR1cm4oMCk7CisgICAgd2hpbGUgKCpzKSB7CisgICAgICAgIGlmIChpc3VwcGVyKCpzKSkgKnMgPSAoY2hhcikgdG9sb3dlcigqcyk7CisgICAgICAgIHMrKywgbisrOworICAgIH0KKyAgICByZXR1cm4obik7Cit9CisKKy8qICBDIEsgVSBQIFAgRSBSICAtLSAgVXBwZXJjYXNlIGEgc3RyaW5nIElOIFBMQUNFICovCisKKy8qIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICovCisKK2ludAorY2t1cHBlcihzKSBjaGFyICpzOyB7CisgICAgaW50IG4gPSAwOworICAgIGlmICghcykgcmV0dXJuKDApOworICAgIHdoaWxlICgqcykgeworICAgICAgICBpZiAoaXNsb3dlcigqcykpICpzID0gKGNoYXIpIHRvdXBwZXIoKnMpOworICAgICAgICBzKyssIG4rKzsKKyAgICB9CisgICAgcmV0dXJuKG4pOworfQorCisvKiAgQyBLIEwgVCBPIEEgIC0tICBMb25nIHRvIHN0cmluZyAgLS0gIEZPUiBESVNDSVBMSU5FRCBVU0UgT05MWSAgKi8KKworI2RlZmluZSBOVU1CVUYgMTAyNAorc3RhdGljIGNoYXIgbnVtYnVmW05VTUJVRiszMl0gPSB7IE5VTCwgTlVMIH07CitzdGF0aWMgaW50IG51bWJwID0gMDsKKy8qCisgIGNrbHRvYSgpIGFuZCBja2l0b2EoKSBhcmUgbGlrZSBhdG9sKCkgYW5kIGF0b2koKSBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24sCisgIHJldHVybmluZyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gbnVtYmVyIHdpdGhvdXQKKyAgdGhlIGNhbGxlciBoYXZpbmcgdG8gd29ycnkgYWJvdXQgYWxsb2NhdGluZyBvciBkZWZpbmluZyBhIGJ1ZmZlciBmaXJzdC4KKyAgVGhleSBtYW5hZ2UgdGhlaXIgb3duIGludGVybmFsIGJ1ZmZlciwgc28gc3VjY2Vzc2l2ZSBjYWxscyByZXR1cm4gZGlmZmVyZW50CisgIHBvaW50ZXJzLiAgSG93ZXZlciwgdG8ga2VlcCBtZW1vcnkgY29uc3VtcHRpb24gZnJvbSBncm93aW5nIHdpdGhvdXQgYm91bmQsCisgIHRoZSBidWZmZXIgcmVjeWNsZXMgaXRzZWxmLiAgU28gYWZ0ZXIgc2V2ZXJhbCBodW5kcmVkIGNhbGxzIChkZXBlbmRpbmcgb24KKyAgdGhlIHNpemUgb2YgdGhlIG51bWJlcnMpLCBzb21lIG9mIHRoZSBlYXJsaWVyIHBvaW50ZXJzIG1pZ2h0IHdlbGwgZmluZAorICB0aGVtc2VsdmVzIHJlZmVyZW5jaW5nIHNvbWV0aGluZyBkaWZmZXJlbnQuICBNb3JhbDogWW91IGNhbid0IHdpbiBpbiBDLgorICBUaGVyZWZvcmUsIHRoZXNlIHJvdXRpbmVzIGFyZSBpbnRlbmRlZCBtYWlubHkgZm9yIGdlbmVyYXRpbmcgbnVtZXJpYyBzdHJpbmdzCisgIGZvciBzaG9ydC10ZXJtIHVzZSwgZS5nLiBmb3IgcGFzc2luZyBudW1iZXJzIGluIHN0cmluZyBmb3JtIGFzIHBhcmFtZXRlcnMgdG8KKyAgZnVuY3Rpb25zLiAgRm9yIGxvbmctdGVybSB1c2UsIHRoZSByZXN1bHQgbXVzdCBiZSBjb3BpZWQgdG8gYSBzYWZlIHBsYWNlLgorKi8KK2NoYXIgKgorI2lmZGVmIENLX0FOU0lDCitja2x0b2EobG9uZyBuKQorI2Vsc2UKK2NrbHRvYShuKSBsb25nIG47CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGNrbHRvYSAqLyB7CisgICAgY2hhciBidWZbMzJdOwkJCS8qIEludGVybmFsIHdvcmtpbmcgYnVmZmVyICovCisgICAgY2hhciAqIHAsICogcywgKiBxOworICAgIGludCBrLCB4LCBsZW4gPSAwLCBzaWduID0gMDsKKyAgICBpZiAobiA8IDBMKSB7CQkJLyogU2lnbiAqLworCW4gPSAwTCAtIG47CisJc2lnbiA9IDE7CisgICAgfQorICAgIGJ1ZlszMV0gPSBOVUw7CisgICAgZm9yIChrID0gMzA7IGsgPiAwOyBrLS0pIHsJCS8qIENvbnZlcnQgbnVtYmVyIHRvIHN0cmluZyAqLworCXggPSBuICUgMTBMOworCWJ1ZltrXSA9IHggKyAnMCc7CisJbiA9IG4gLyAxMEw7CisJaWYgKCFuKQorCSAgYnJlYWs7CisgICAgfQorICAgIGlmIChzaWduKSBidWZbLS1rXSA9ICctJzsJCS8qIEFkZCBzaWduIGlmIG5lY2Vzc2FyeSAqLworICAgIGxlbiA9IDMxIC0gazsKKyAgICBpZiAobGVuICsgbnVtYnAgPiBOVU1CVUYpCisgICAgICBudW1icCA9IDA7CisgICAgcCA9IG51bWJ1ZiArIG51bWJwOworICAgIHEgPSBwOworICAgIHMgPSBidWYgKyBrOworICAgIHdoaWxlICgoKnArKyA9ICpzKyspKSA7CQkvKiBDb3B5ICovCisgICAgKnArKyA9IE5VTDsKKyAgICBudW1icCArPSBsZW4rMTsKKyAgICByZXR1cm4ocSk7CQkJCS8qIFJldHVybiBwb2ludGVyICovCit9CisKKy8qICBDIEsgVSBMIFQgTyBBICAtLSAgVW5zaWduZWQgbG9uZyB0byBzdHJpbmcgICovCisKK2NoYXIgKgorI2lmZGVmIENLX0FOU0lDCitja3VsdG9hKHVuc2lnbmVkIGxvbmcgbikKKyNlbHNlCitja3VsdG9hKG4pIHVuc2lnbmVkIGxvbmcgbjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogY2tsdG9hICovIHsKKyAgICBjaGFyIGJ1ZlszMl07CQkJLyogSW50ZXJuYWwgd29ya2luZyBidWZmZXIgKi8KKyAgICBjaGFyICogcCwgKiBzLCAqIHE7CisgICAgaW50IGssIHgsIGxlbiA9IDA7CisgICAgYnVmWzMxXSA9IE5VTDsKKyAgICBmb3IgKGsgPSAzMDsgayA+IDA7IGstLSkgewkJLyogQ29udmVydCBudW1iZXIgdG8gc3RyaW5nICovCisJeCA9IG4gJSAxMEw7CisJYnVmW2tdID0geCArICcwJzsKKwluID0gbiAvIDEwTDsKKwlpZiAoIW4pCisJICBicmVhazsKKyAgICB9CisgICAgbGVuID0gMzEgLSBrOworICAgIGlmIChsZW4gKyBudW1icCA+IE5VTUJVRikKKyAgICAgIG51bWJwID0gMDsKKyAgICBwID0gbnVtYnVmICsgbnVtYnA7CisgICAgcSA9IHA7CisgICAgcyA9IGJ1ZiArIGs7CisgICAgd2hpbGUgKCgqcCsrID0gKnMrKykpIDsJCS8qIENvcHkgKi8KKyAgICBudW1icCArPSBsZW4rMTsKKyAgICByZXR1cm4ocSk7CQkJCS8qIFJldHVybiBwb2ludGVyICovCit9CisKK2NoYXIgKgorI2lmZGVmIENLX0FOU0lDCitja2x0b3gobG9uZyBuKQkJCQkvKiBMb25nIGludCB0byAiMHguLiIgaGV4IHN0cmluZyAqLworI2Vsc2UKK2NrbHRveChuKSBsb25nIG47CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGNrbHRveCAqLyB7CisgICAgY2hhciBidWZbMzJdOwkJCS8qIEludGVybmFsIHdvcmtpbmcgYnVmZmVyICovCisgICAgY2hhciAqcCwgKnEsICpzLCAqYnAgPSBidWYgKyAyOworICAgIGludCBrOworICAgIGJ1ZlswXSA9ICcwJzsKKyAgICBidWZbMV0gPSAneCc7CisgICAgc3ByaW50ZihicCwgIiVseCIsIG4pOworICAgIGsgPSBzdHJsZW4oYnApOworICAgIGlmIChrJjEpIHsKKwlzcHJpbnRmKGJwLCAiMCVseCIsIG4pOworCWsrKzsKKyAgICB9CisgICAgayArPSAyOwkJCQkvKiAiMHgiICovCisgICAgaWYgKG51bWJwICsgayA+PSBOVU1CVUYpCisgICAgICBudW1icCA9IDA7CisgICAgcCA9IG51bWJ1ZiArIG51bWJwOworICAgIHEgPSBwOworICAgIHMgPSBidWY7CisgICAgd2hpbGUgKCgqcCsrID0gKnMrKykpIDsJCS8qIENvcHkgKi8KKyAgICAqcCsrID0gTlVMOworICAgIG51bWJwICs9IGsrMTsKKyAgICByZXR1cm4ocSk7CQkJCS8qIFJldHVybiBwb2ludGVyICovCit9CisKKworLyogIEMgSyBJIFQgTyBBICAtLSAgSW50IHRvIHN0cmluZyAgLS0gRk9SIERJU0NJUExJTkVEIFVTRSBPTkxZICAqLworCitjaGFyICoKK2NraXRvYShuKSBpbnQgbjsgewkJCS8qIFNlZSBjb21tZW50cyB3aXRoIGNrbHRvYSgpLiAqLworICAgIGxvbmcgbm47CisgICAgbm4gPSBuOworICAgIHJldHVybihja2x0b2Eobm4pKTsKK30KKworCitjaGFyICoJCQkJCS8qIFVuc2lnbmVkIGludCB0byBzdHJpbmcgKi8KK2NrdWl0b2EobikgdW5zaWduZWQgaW50IG47IHsKKyAgICB1bnNpZ25lZCBsb25nIG5uOworICAgIG5uID0gbjsKKyAgICByZXR1cm4oY2t1bHRvYShubikpOworfQorCitjaGFyICoKK2NraXRveChuKSBpbnQgbjsgewkJCS8qIEludCB0byBoZXggKi8KKyAgICBsb25nIG5uOworICAgIG5uID0gbjsKKyAgICByZXR1cm4oY2tsdG94KG5uKSk7Cit9CisKK2NoYXIgKgorI2lmZGVmIENLX0FOU0lDCitja2N0b2EoY2hhciBjKQkJCQkvKiBDaGFyIHRvIHN0cmluZyAqLworI2Vsc2UKK2NrY3RvYShjKSBjaGFyIGM7CisjZW5kaWYKKy8qIGNrY3RvYSAqLyB7CisgICAgc3RhdGljIGNoYXIgYnVmWzMyXTsKKyAgICBzdGF0aWMgaW50IGN1cnJlbnQgPSAwOworICAgIGlmIChjdXJyZW50ID49IDMwKQorICAgICAgY3VycmVudCA9IDA7CisgICAgYnVmW2N1cnJlbnQrK10gPSBjOworICAgIGJ1ZltjdXJyZW50KytdID0gJ1wwJzsKKyAgICByZXR1cm4oKGNoYXIgKikoYnVmICsgY3VycmVudCAtIDIpKTsKK30KKworY2hhciAqCisjaWZkZWYgQ0tfQU5TSUMKK2NrY3RveChDSEFSIGMsIGludCBmbGFnKQkJLyogVW5zaWduZWQgY2hhciB0byBoZXggKi8KKyNlbHNlCitja2N0b3goYywgZmxhZykgQ0hBUiBjOyBpbnQgZmxhZzsKKyNlbmRpZgorLyogY2tjdG94ICovIHsKKyAgICBzdGF0aWMgY2hhciBidWZbNDhdOworICAgIHN0YXRpYyBpbnQgY3VycmVudCA9IDA7CisgICAgaW50IHg7CisgICAgY2hhciBoOworICAgIGlmIChjdXJyZW50ID4gNDUpCisgICAgICBjdXJyZW50ID0gMDsKKyAgICB4ID0gKGMgPj4gNCkgJiAweDBmOworICAgIGggPSByeGRpZ2l0c1t4XTsKKyAgICBpZiAoIWZsYWcgJiYgaXN1cHBlcihyeGRpZ2l0c1t4XSkpCisgICAgICBoID0gdG9sb3dlcihyeGRpZ2l0c1t4XSk7CisgICAgYnVmW2N1cnJlbnQrK10gPSBoOworICAgIHggPSBjICYgMHgwZjsKKyAgICBoID0gcnhkaWdpdHNbeF07CisgICAgaWYgKCFmbGFnICYmIGlzdXBwZXIocnhkaWdpdHNbeF0pKQorICAgICAgaCA9IHRvbG93ZXIocnhkaWdpdHNbeF0pOworICAgIGJ1ZltjdXJyZW50KytdID0gaDsKKyAgICBidWZbY3VycmVudCsrXSA9ICdcMCc7CisgICAgcmV0dXJuKChjaGFyICopKGJ1ZiArIGN1cnJlbnQgLSAzKSk7Cit9CisKKy8qICBDIEsgSSBOIEQgRSBYICAtLSAgQy1LZXJtaXQncyBpbmRleCBmdW5jdGlvbiAgKi8KKy8qCisgIFdlIGNhbid0IGRlcGVuZCBvbiBDIGxpYnJhcmllcyB0byBoYXZlIG9uZSwgc28gaGVyZSBpcyBvdXIgb3duLgorICBDYWxsIHdpdGg6CisgICAgczEgLSBTdHJpbmcgdG8gbG9vayBmb3IuCisgICAgczIgLSBTdHJpbmcgdG8gbG9vayBpbi4KKyAgICAgdCAtIE9mZnNldCBmcm9tIHJpZ2h0IG9yIGxlZnQgb2YgczIsIDAgYmFzZWQ7IC0xIGZvciByaWdodG1vc3QgY2hhciBpbiBzMi4KKyAgICAgciAtIDAgZm9yIGxlZnQtdG8tcmlnaHQgc2VhcmNoLCBub24tMCBmb3IgcmlnaHQtdG8tbGVmdC4KKyAgaWNhc2UgIDAgZm9yIGNhc2UgaW5kZXBlbmRlbmNlLCBub24tMCBpZiBhbHBoYWJldGljIGNhc2UgbWF0dGVycy4KKyAgUmV0dXJucyAwIGlmIHN0cmluZyBub3QgZm91bmQsIG90aGVyd2lzZSBhIDEtYmFzZWQgcmVzdWx0LgorICBBbHNvIHJldHVybnMgMCBvbiBhbnkga2luZCBvZiBlcnJvciwgZS5nLiBqdW5rIHBhcmFtZXRlcnMuCisqLworaW50Citja2luZGV4KHMxLHMyLHQscixpY2FzZSkgY2hhciAqczEsICpzMjsgaW50IHQsIHIsIGljYXNlOyB7CisgICAgaW50IGxlbjEgPSAwLCBsZW4yID0gMCwgaSwgaiwgeCwgb3QgPSB0OyAvKiBvdCA9IG9yaWdpbmFsIHQgKi8KKyAgICBjaGFyICogczsKKworICAgIGlmICghczEgfHwgIXMyKSByZXR1cm4oMCk7CisgICAgcyA9IHMxOworICAgIHdoaWxlICgqcysrKSBsZW4xKys7CQkvKiBsZW5ndGggb2Ygc3RyaW5nIHRvIGxvb2sgZm9yICovCisgICAgcyA9IHMyOworICAgIHdoaWxlICgqcysrKSBsZW4yKys7CQkvKiBsZW5ndGggb2Ygc3RyaW5nIHRvIGxvb2sgaW4gKi8KKyAgICBzID0gczI7CisgICAgaWYgKHQgPCAwKSB0ID0gbGVuMiAtIDE7CisKKyAgICBqID0gbGVuMiAtIGxlbjE7CQkJLyogbGVuZ3RoIGRpZmZlcmVuY2UgKi8KKworICAgIGlmIChqIDwgMCB8fCAociA9PSAwICYmIHQgPiBqKSkJLyogc2VhcmNoIHN0cmluZyBpcyBsb25nZXIgKi8KKyAgICAgIHJldHVybigwKTsKKyAgICBpZiAociA9PSAwKSB7CQkJLyogSW5kZXggKi8KKwlzID0gczIgKyB0OwkJCS8qIFBvaW50IHRvIGJlZ2lubmluZyBvZiB0YXJnZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IChqIC0gdCk7IGkrKykgeyAvKiBOb3cgY29tcGFyZSAqLworCSAgICB4ID0gY2tzdHJjbXAoczEscysrLGxlbjEsaWNhc2UpOworCSAgICBpZiAoIXgpCisJICAgICAgcmV0dXJuKGkrMSt0KTsKKwl9CisgICAgfSBlbHNlIHsJCQkJLyogUmV2ZXJzZSBJbmRleCAqLworICAgICAgICBpID0gbGVuMiAtIGxlbjE7CQkvKiBXaGVyZSB0byBzdGFydCBsb29raW5nICovCisgICAgICAgIGlmIChvdCA+IDApCQkJLyogRmlndXJlIGluIG9mZnNldCBpZiBhbnkgKi8KKwkgIGkgLT0gdDsKKwlmb3IgKGogPSBpOyBqID4gLTE7IGotLSkgeworCSAgICBpZiAoIWNrc3RyY21wKHMxLCZzMltqXSxsZW4xLGljYXNlKSkKKwkgICAgICByZXR1cm4oaisxKTsKKwl9CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworLyogIEMgSyBTIFQgUiBTIFQgUiAgLS0gIFBvcnRhYmxlIHJlcGxhY2VtZW50IGZvciBzdHJzdHIoKSAgKi8KKworLyogIFJldHVybnMgcG9pbnRlciB0byBmaXJzdCBvY2N1cnJlbmNlIG9mIHMxIGluIHMyLCBvciBOVUxMICovCisKK2NoYXIgKgorY2tzdHJzdHIoczEsIHMyKSBjaGFyICogczEsICogczI7IHsKKyAgICBpbnQgazsKKyAgICBrID0gY2tpbmRleChzMixzMSwwLDAsMSk7CisgICAgcmV0dXJuKChrIDwgMSkgPyBOVUxMIDogJnMxW2stMV0pOworfQorCisKKy8qICBCIFIgUyBUIFIgSSBQICAtLSAgU3RyaXAgZW5jbG9zaW5nIGJyYWNlcyBmcm9tIGFyZyBzdHJpbmcsIGluIHBsYWNlLiAqLworLyoKKyAgQ2FsbCB3aXRoOgorICAgIFBvaW50ZXIgdG8gc3RyaW5nIHRoYXQgY2FuIGJlIHBva2VkLgorICBSZXR1cm5zOgorICAgIFBvaW50ZXIgdG8gc3RyaW5nIHdpdGhvdXQgZW5jbG9zaW5nIGJyYWNlcy4KKyAgICBJZiBvcmlnaW5hbCBzdHJpbmcgd2FzIG5vdCBicmFjZWQsIHRoaXMgaXMgdGhlIGFyZyBwb2ludGVyOworICAgIG90aGVyd2lzZSBpdCBpcyAxICsgdGhlIGFyZyBwb2ludGVyLCB3aXRoIHRoZSBtYXRjaGluZyBjbG9zaW5nCisgICAgYnJhY2UgemVybydkIG91dC4gIElmIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYSBicmFjZSBidXQgZG9lcworICAgIG5vdCBlbmQgd2l0aCBhIG1hdGNoaW5nIGJyYWNlLCB0aGUgb3JpZ2luYWwgcG9pbnRlciB0byB0aGUgb3JpZ2luYWwKKyAgICBzdHJpbmcgaXMgcmV0dXJuZWQuICBJZiB0aGUgYXJnIHBvaW50ZXIgaXMgTlVMTCwgYSBwb2ludGVyIHRvIGFuCisgICAgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorKi8KKyNpZmRlZiBDT01NRU5UCisKKy8qIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHZlcnNpb24sIGhhbmRsaW5nIG9ubHkgYnJhY2VzICovCisKK2NoYXIgKgorYnJzdHJpcChwKSBjaGFyICpwOyB7CisgICAgaWYgKCFwKSByZXR1cm4oIiIpOworICAgIGlmICgqcCA9PSAneycpIHsKKwlpbnQgeDsKKwl4ID0gKGludClzdHJsZW4ocCkgLSAxOworCWlmIChwW3hdID09ICd9JykgeworCSAgICBwW3hdID0gTlVMOworCSAgICBwKys7CisJfQorICAgIH0KKyAgICByZXR1cm4ocCk7Cit9CisKKyNlbHNlCisvKiBOZXcgdmVyc2lvbiBoYW5kbGVzIGJyYWNlcyBhbmQgZG91YmxlcXVvdGVzICovCisKK2NoYXIgKgorYnJzdHJpcChwKSBjaGFyICpwOyB7CisgICAgaWYgKCFwKSByZXR1cm4oIiIpOworICAgIGlmICgqcCA9PSAneycgfHwgKCpwID09ICciJyAmJiBkYmxxdW8pKSB7CisJaW50IHg7CisJeCA9IChpbnQpc3RybGVuKHApIC0gMTsKKwlpZiAoeCA+IDApIHsKKwkgICAgaWYgKCgqcCA9PSAneycgJiYgcFt4XSA9PSAnfScpIHx8CisJCSgqcCA9PSAnIicgJiYgcFt4XSA9PSAnIicpKSB7CisJCWlmICh4ID4gMCAmJiBwW3gtMV0gIT0gQ01EUSkgeworCQkgICAgcFt4XSA9IE5VTDsKKwkJICAgIHArKzsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4ocCk7Cit9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjaWZkZWYgQ09NTUVOVAorCisvKiBFdmVuIG5ld2VyIGV4cGVyaW1lbnRhbCB2ZXJzaW9uIC0tIGJyZWFrcyBtYW55IHRoaW5ncyAqLworCitjaGFyICoKK2Zuc3RyaXAocCkgY2hhciAqcDsgeworICAgIGludCBpLCBqLCBrLCBuLCBsZW47CisgICAgZXh0ZXJuIGludCBjbWRfcXVvdGluZzsJCS8qIEJhZCAtIG5vIGV4dGVybnMgYWxsb3dlZCEgKi8KKworICAgIGlmICghcCkKKyAgICAgIHJldHVybigiIik7CisKKyAgICBpZiAoKnAgPT0gJ3snKSB7CisgICAgICAgIGxlbiA9IHN0cmxlbihwKTsKKyAgICAgICAgbiA9IDA7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrICkgeworICAgICAgICAgICAgaWYgKHBbal0gPT0gJ3snICYmCisJCSghY21kX3F1b3RpbmcgfHwgaiA9PSAwIHx8IHBbai0xXSAhPSBDTURRKSkgeworICAgICAgICAgICAgICAgIGZvciAobiA9IDEsIGkgPSBqKzE7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBbaV0gPT0gJ3snICYmICghY21kX3F1b3RpbmcgfHwgcFtpLTFdICE9IENNRFEpKQorCQkgICAgICBuKys7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBbaV0gPT0gJ30nICYmICghY21kX3F1b3RpbmcgfHwgcFtpLTFdICE9IENNRFEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSBqOyBrIDwgaSAtIDE7IGsrKykKKwkJCSAgICAgIHBba10gPSBwW2srMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBsZW47IGkrKyApCisJCQkgICAgICBwW2ktMV0gPSBwW2krMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGkgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuID09IDEpIHsgLyogSW1wbGllZCByaWdodCBicmFjZSBhdCBlbmQgb2YgZmllbGQgKi8KKyAgICAgICAgICAgIGZvciAoayA9IGo7IGsgPCBsZW47IGsrKykKKwkgICAgICBwW2tdID0gcFtrKzFdOworICAgICAgICAgICAgbGVuIC09IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCpwID09ICciJykgeworICAgICAgICBsZW4gPSBzdHJsZW4ocCk7CisgICAgICAgIG4gPSAwOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworICAgICAgICAgICAgaWYgKHBbal0gPT0gJyInICYmCisJCSghY21kX3F1b3RpbmcgfHwgaiA9PSAwIHx8IHBbai0xXSAhPSBDTURRKSkgeworICAgICAgICAgICAgICAgIG4rKzsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IGogKyAxOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBbaV0gPT0gJyInICYmICghY21kX3F1b3RpbmcgfHwgcFtpLTFdICE9IENNRFEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuLS07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IGo7IGsgPCBpIC0gMTsgaysrKQorCQkJICBwW2tdID0gcFtrKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBsZW47IGkrKykKKwkJCSAgcFtpLTFdID0gcFtpKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBqID0gaSAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPT0gMSkgeyAvKiBJbXBsaWVkIGRvdWJsZSBxdW90ZSBhdCBlbmQgb2YgZmllbGQgKi8KKyAgICAgICAgICAgIGZvciAoayA9IGo7IGsgPCBsZW47IGsrKyApCisJICAgICAgcFtrXSA9IHBbaysxXTsKKyAgICAgICAgICAgIGxlbiAtPSAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybihwKTsKK30KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBDT01NRU5UCisvKgorICBOb3QgdXNlZCAtLSBOb3RlOiB0aGVzZSBub3Qgb25seSB3cml0ZSBpbnRvIHRoZWlyIGFyZywgYnV0IHdyaXRlIHBhc3QKKyAgcGFzdCB0aGUgZW5kLgorKi8KK2NoYXIgKgorYnJhY2UoZm4pIGNoYXIgKmZuOyB7CisgICAgaW50IHNwYWNlcyA9IDA7CisgICAgY2hhciAqIHAsIGNoLCBjaDI7CisgICAgZm9yIChwID0gZm47ICpwOyBwKyspIHsKKwlpZiAoKnAgPT0gU1ApIHsKKwkgICAgc3BhY2VzID0gMTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAoc3BhY2VzKSB7CisgICAgICAgIHAgPSBmbjsKKyAgICAgICAgY2ggPSAqcDsKKyAgICAgICAgKnAgPSAneyc7CisgICAgICAgIHArKzsKKworICAgICAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgICAgIGNoMiA9ICpwOworICAgICAgICAgICAgKnAgPSBjaDsKKyAgICAgICAgICAgIGNoID0gY2gyOworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgICpwID0gY2g7CisgICAgICAgIHArKzsKKyAgICAgICAgKnAgPSAnfSc7CisgICAgICAgIHArKzsKKyAgICAgICAgKnAgPSAnXDAnOworICAgIH0KKyAgICByZXR1cm4oZm4pOworfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworLyogZCBxIHUgbyB0IGUgIC0tICBQdXRzIGRvdWJsZXF1b3RlcyBhcm91bmQgYXJnIGluIHBsYWNlLiAqLworLyoKKyAgIENhbGwgd2l0aDoKKyAgICAgUG9pbnRlciB0byBidWZmZXIgYW5kIGl0cyB0b3RhbCBsZW5ndGggYW5kIGZsYWcgPSAwIHRvIHVzZQorICAgICBkb3VibGVxdW90ZXMsIDEgdG8gdXNlIGJyYWNlcy4KKyAgIFJldHVybnM6CisgICAgIE51bWJlcjogbGVuZ3RoIG9mIHJlc3VsdC4KKyovCitpbnQKK2RxdW90ZShmbiwgbGVuLCBmbGFnKSBjaGFyICpmbjsgaW50IGxlbjsgaW50IGZsYWc7IHsKKyAgICBpbnQgc3BhY2VzID0gMCwgayA9IDA7CisgICAgY2hhciAqIHAsIGNoLCBjaDI7CisgICAgaWYgKCFmbikKKyAgICAgIHJldHVybigwKTsKKworICAgIGsgPSBzdHJsZW4oZm4pOworICAgIGZvciAocCA9IGZuOyAqcDsgcCsrKSB7CisJaWYgKCpwID09IFNQKSB7CisgICAgICAgICAgICBzcGFjZXMgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNwYWNlcykgeworCWlmIChrICsgMiA+PSBsZW4pCisJICByZXR1cm4oayk7CisgICAgICAgIHAgPSBmbjsKKyAgICAgICAgY2ggPSAqcDsKKyAgICAgICAgKnAgPSBmbGFnID8gJ3snIDogJyInOworICAgICAgICBwKys7CisKKyAgICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgICAgICBjaDIgPSAqcDsKKyAgICAgICAgICAgICpwID0gY2g7CisgICAgICAgICAgICBjaCA9IGNoMjsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgICAgICAqcCA9IGNoOworICAgICAgICBwKys7CisgICAgICAgICpwID0gZmxhZyA/ICd9JyA6ICciJzsKKyAgICAgICAgcCsrOworICAgICAgICAqcCA9ICdcMCc7CisgICAgfQorICAgIHJldHVybihrKzIpOworfQorCisKKy8qICBVIE4gVCBBIEIgSSBGIFkgIC0tLSAgVW50YWJpZnkgczEgaW50byBzMiwgYXNzdW1pbmcgdGFicyBldmVyeSA4IHNwYWNlICovCisKK2ludAordW50YWJpZnkoczEsczIsbWF4KSBjaGFyICogczEsICogczI7IGludCBtYXg7IHsKKyAgICBpbnQgaSwgaiwgaywgeCwgejsKKyAgICB4ID0gc3RybGVuKHMxKTsKKyAgICBmb3IgKGkgPSAwLCBrID0gMDsgayA8IHg7IGsrKykgeworCWlmIChzMVtrXSAhPSAnXHQnKSB7CisJICAgIGlmIChpID49IG1heC0xKSB7CisJCXMyW21heC0xXSA9ICdcMCc7CisJCXJldHVybigtMSk7CisJICAgIH0KKwkgICAgczJbaSsrXSA9IHMxW2tdOworCSAgICBjb250aW51ZTsKKwl9CisJeiA9IDggLSBpJTg7CisJaWYgKHogPT0gMCkgeiA9IDg7CisJZm9yIChqID0gMDsgaiA8IHogJiYgaSA8IG1heDsgaisrKQorCSAgczJbaSsrXSA9ICcgJzsKKyAgICB9CisgICAgczJbaV0gPSAnXDAnOworICAgIHJldHVybigwKTsKK30KKworCisvKiAgTSBBIEsgRSBMIEkgUyBUICAtLS0gIEJyZWFrcyB7e3MxfXtzMn0uLntzbn19IGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncyAqLworLyoKKyAgQ2FsbCB3aXRoOgorICAgIHMgICAgPSBwb2ludGVyIHRvIHN0cmluZyB0byBicmVhayB1cC4KKyAgICBsaXN0ID0gYXJyYXkgb2Ygc3RyaW5nIHBvaW50ZXJzLgorICAgIGxlbiAgPSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYXJyYXkuCisgIE5PVEU6IFRoZSBhcnJheSBtdXN0IGJlIHByZWluaXRpYWxpemVkIHRvIGFsbCBOVUxMIHBvaW50ZXJzLgorICBJZiBhbnkgYXJyYXkgZWxlbWVudCBpcyBub3QgTlVMTCwgaXQgaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4gbWFsbG9jJ2QKKyAgYW5kIGlzIHRoZXJlZm9yZSBmcmVlZC4gIERvIE5PVCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhbiB1bmluaXRpYWxpemVkCisgIGFycmF5LCBvciB3aXRoIGFuIGFycmF5IHRoYXQgaGFzIGhhZCBhbnkgc3RhdGljIGVsZW1lbnRzIGFzc2lnbmVkIHRvIGl0LgorKi8KK1ZPSUQKK21ha2VsaXN0KHMsbGlzdCxsZW4pIGNoYXIgKiBzOyBjaGFyICpsaXN0W107IGludCBsZW47IHsKKyAgICBpbnQgaSwgbiwgcSwgYmMgPSAwOworICAgIGNoYXIgKnAgPSBOVUxMLCAqczIgPSBOVUxMOworICAgIGRlYnVnKEYxMTAsIm1ha2VsaXN0IHMiLHMsMCk7CisgICAgaWYgKCFzKSB7CQkJCS8qIENoZWNrIGZvciBudWxsIG9yIGVtcHR5IHN0cmluZyAqLworCWxpc3RbMF0gPSBOVUxMOworCXJldHVybjsKKyAgICB9CisgICAgbiA9IHN0cmxlbihzKTsKKyAgICBpZiAobiA9PSAwKSB7CisJbGlzdFswXSA9IE5VTEw7CisJcmV0dXJuOworICAgIH0KKyAgICBpZiAoKHMyID0gKGNoYXIgKiltYWxsb2MobisxKSkpIHsJLyogU2FmZSBjb3B5IGZvciBwb2tpbmcgKi8KKwlzdHJjcHkoczIscyk7CQkJLyogKG5vIG5lZWQgZm9yIGNrc3RybmNweSBoZXJlKSAqLworCXMgPSBzMjsKKyAgICB9CisgICAgcyA9IGJyc3RyaXAocyk7CQkJLyogU3RyaXAgYnJhY2VzICovCisgICAgbiA9IHN0cmxlbihzKTsJCQkvKiBHZXQgbGVuZ3RoICovCisgICAgaWYgKCpzICE9ICd7JykgewkJCS8qIE91dGVyIGJyYWNlcyBvbmx5ICovCisJaWYgKChwID0gKGNoYXIgKiltYWxsb2MobisxKSkpIHsgLyogU28ganVzdCBvbmUgcGF0dGVybiAqLworCSAgICBzdHJjcHkocCxzKTsJCS8qIChubyBuZWVkIGZvciBja3N0cm5jcHkgaGVyZSkgKi8KKwkgICAgaWYgKGxpc3RbMF0pCisJICAgICAgZnJlZShsaXN0WzBdKTsKKwkgICAgbGlzdFswXSA9IHA7CisJfQorCWlmIChzMikgZnJlZShzMik7CisJcmV0dXJuOworICAgIH0KKyAgICBxID0gMDsJCQkJLyogSW5uZXIgb25lcyB0b28gKi8KKyAgICBpID0gMDsJCQkJLyogc28gYSBsaXN0IG9mIHBhdHRlcm5zLiAqLworICAgIG4gPSAwOworICAgIHdoaWxlICgqcyAmJiBpIDwgbGVuKSB7CisJaWYgKCpzID09IENNRFEpIHsJCS8qIFF1b3RlLi4uICovCisJICAgIHEgPSAxOworCSAgICBzKys7CisJICAgIG4rKzsKKwkgICAgY29udGludWU7CisJfQorCWlmICgqcyA9PSAneycgJiYgIXEpIHsJCS8qIE9wZW5pbmcgYnJhY2UgKi8KKwkgICAgaWYgKGJjKysgPT0gMCkgewkJLyogQmVnaW5uaW5nIG9mIGEgZ3JvdXAgKi8KKwkJcCA9ICsrczsKKwkJbiA9IDA7CisJICAgIH0gZWxzZSB7CQkJLyogSXQncyBhIGJyYWNlIGluc2lkZSB0aGUgZ3JvdXAgKi8KKwkJbisrOworCQlzKys7CisJICAgIH0KKwkgICAgY29udGludWU7CisJfSBlbHNlIGlmICgqcyA9PSAnfScgJiYgIXEpIHsJLyogQ2xvc2luZyBicmFjZSAqLworCSAgICBpZiAoLS1iYyA9PSAwKSB7CQkvKiBFbmQgb2YgYSBncm91cCAqLworCQkqcysrID0gTlVMOworCQlkZWJ1ZyhGMTExLCJtYWtlbGlzdCBlbGVtZW50IixwLGkpOworCQlpZiAobGlzdFtpXSkKKwkJICBmcmVlKGxpc3RbaV0pOworCQlpZiAoKGxpc3RbaV0gPSAoY2hhciAqKW1hbGxvYyhuKzEpKSkgeworCQkgICAgY2tzdHJuY3B5KGxpc3RbaV0scCxuKzEpOyAvKiBOb3RlOiBuKzEgKi8KKwkJICAgIGkrKzsKKwkJfQorCQl3aGlsZSAoKnMgPT0gU1ApIHMrKzsKKwkJcCA9IHM7CisJCW4gPSAwOworCQljb250aW51ZTsKKwkgICAgfSBlbHNlIHsJCQkvKiBXaXRoaW4gYSBncm91cCAqLworCQluKys7CisJCXMrKzsKKwkgICAgfQorCX0gZWxzZSB7CQkJLyogUmVndWxhciBjaGFyYWN0ZXIgKi8KKwkgICAgcSA9IDA7CisJICAgIHMrKzsKKwkgICAgbisrOworCX0KKyAgICB9CisgICAgaWYgKCpwICYmIGkgPCBsZW4pIHsJCS8qIExhc3Qgb25lICovCisJaWYgKGxpc3RbaV0pCisJICBmcmVlKGxpc3RbaV0pOworCWlmICgobGlzdFtpXSA9IChjaGFyICopbWFsbG9jKG4rMSkpKSB7CisJICAgIGNrc3RybmNweShsaXN0W2ldLHAsbisxKTsKKwkgICAgZGVidWcoRjExMSwibWFrZWxpc3QgbGFzdCBlbGVtZW50IixwLGkpOworCX0KKyAgICB9CisgICAgaSsrOwkJCQkvKiBDbGVhciBvdXQgdGhlIHJlc3Qgb2YgdGhlIGxpc3QgKi8KKyAgICBmb3IgKCA7IGkgPCBsZW47IGkrKykgeworCWlmIChsaXN0W2ldKQorCSAgZnJlZSAobGlzdFtpXSk7CisJbGlzdFtpXSA9IE5VTEw7CisgICAgfQorICAgIGlmIChzMikgZnJlZShzMik7Cit9CisKKy8qCisgICBNIEEgSyBFIFMgVCBSICAtLSAgQ3JlYXRlcyBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmcuCisKKyAgIE1ha2VzIGEgbmV3IGNvcHkgb2Ygc3RyaW5nIHMgYW5kIHNldHMgcG9pbnRlciBwIHRvIGl0cyBhZGRyZXNzLgorICAgSGFuZGxlcyBkZWdlbmVyYXRlIGNhc2VzLCBsaWtlIHdoZW4gYnVmZmVycyBvdmVybGFwIG9yIGFyZSB0aGUgc2FtZSwKKyAgIG9uZSBvciBib3RoIGFyZ3VtZW50cyBhcmUgTlVMTCwgZXRjLgorCisgICBUaGUgc291cmNlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlIE5VTC10ZXJtaW5hdGVkLiAgVGhlcmVmb3JlIGl0IGNhbiBub3QKKyAgIGJlIGEgVUNTLTIgc3RyaW5nIG9yIGFyYml0cmFyeSBiaW5hcnkgZGF0YS4KKworICAgVGhlIHRhcmdldCBwb2ludGVyIG11c3QgYmUgZWl0aGVyIE5VTEwgb3IgZWxzZSBhIHBvaW50ZXIgdG8gYSBwcmV2aW91c2x5CisgICBtYWxsb2MnZWQgYnVmZmVyLiAgSWYgbm90LCBleHBlY3QgYSBjb3JlIGR1bXAgb3Igc2VnbWVudGF0aW9uIGZhdWx0LgorCisgICBOb3RlOiBUaGUgY2FsbGVyIGNhbiB0ZWxsIHdoZXRoZXIgdGhpcyByb3V0aW5lIGZhaWxlZCBhcyBmb2xsb3dzOgorCisgICAgIG1hbGxvYygmcCxxKTsKKyAgICAgaWYgKHEgJiAhcCkgeyBtYWtlc3RyKCkgZmFpbGVkIH07CisKKyAgIFJlYWxseSB0aGlzIHJvdXRpbmUgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBsZW5ndGgsIGJ1dCBzaW5jZSBpdCBkb2Vzbid0CisgICB3ZSBzZXQgdGhlIGdsb2JhbCB2YXJpYWJsZSBtYWtlc3RybGVuIHRvIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdCBzdHJpbmcuCisqLworaW50IG1ha2VzdHJsZW4gPSAwOworCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK21ha2VzdHIoY2hhciAqKnAsIGNvbnN0IGNoYXIgKnMpCisjZWxzZQorbWFrZXN0cihwLHMpIGNoYXIgKipwLCAqczsKKyNlbmRpZgorLyogbWFrZXN0ciAqLyB7CisgICAgaW50IHggPSAwOworICAgIGNoYXIgKnEgPSBOVUxMOworI2lmZGVmIENLX0FOU0lDCisgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqIHMyOworI2Vsc2UKKyAgICByZWdpc3RlciBjaGFyICogczI7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyAgICByZWdpc3RlciBjaGFyICogcTI7CisKKyAgICBpZiAoKnAgPT0gcykJCQkvKiBUaGUgdHdvIHBvaW50ZXJzIGFyZSB0aGUgc2FtZS4gKi8KKyAgICAgIHJldHVybjsJCQkJLyogRG9uJ3QgZG8gYW55dGhpbmcuICovCisKKyAgICBpZiAoIXMpIHsJCQkJLyogTmV3IGRlZmluaXRpb24gaXMgbnVsbD8gKi8KKwlpZiAoKnApCQkJCS8qIEZyZWUgb2xkIHN0b3JhZ2UuICovCisJICBmcmVlKCpwKTsKKwkqcCA9IE5VTEw7CQkJLyogUmV0dXJuIG51bGwgcG9pbnRlci4gKi8KKwltYWtlc3RybGVuID0gMDsKKwlyZXR1cm47CisgICAgfQorICAgIHMyID0gczsJCQkJLyogTWF5YmUgbmV3IHN0cmluZyB3aWxsIGZpdCAqLworCisjaWZkZWYgQ09NTUVOVAorLyoKKyAgVGhpcyBpcyBhIGZhaXJseSBiaWcgd2luLCBhbGxvd2luZyB1cyB0byBza2lwIHRoZSBtYWxsb2MoKSBhbmQgZnJlZSBpZiB0aGUKKyAgZGVzdGluYXRpb24gc3RyaW5nIGFscmVhZHkgZXhpc3RzIGFuZCBpcyBub3Qgc2hvcnRlciB0aGFuIHRoZSBzb3VyY2Ugc3RyaW5nLgorICBCdXQgaXQgZG9lc24ndCBhbGxvdyBmb3IgcG9zc2libGUgb3ZlcmxhcCBvZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uLgorKi8KKyAgICBpZiAoKnApIHsJCQkJLyogaW50byBvbGQgc3RvcmFnZS4uLiAqLworCWNoYXIgKiBwMiA9ICpwOworCWNoYXIgYzsKKwl3aGlsZSAoYyA9ICpwMikgeworCSAgICBpZiAoISgqcDIrKyA9ICpzMisrKSkKKwkgICAgICBicmVhazsKKwkgICAgeCsrOworCX0KKwltYWtlc3RybGVuID0geDsKKwlpZiAoYykgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qIERpZG4ndCBmaXQgKi8KKworICAgIHggPSAwOworICAgIHdoaWxlICgqczIrKykgeCsrOwkJCS8qIEdldCAocmVzdCBvZikgbGVuZ3RoIG9mIHMuICAqLworCisgICAgaWYgKHggPj0gMCkgewkJCS8qIEdldCBsZW5ndGgsIGV2ZW4gb2YgZW1wdHkgc3RyaW5nLiAqLworCXEgPSBtYWxsb2MoeCsxKTsJCS8qIEdldCBhbmQgcG9pbnQgdG8gdGVtcCBzdG9yYWdlLiAqLworCWlmIChxKSB7CisJICAgIG1ha2VzdHJsZW4gPSB4OwkJLyogUmVtZW1iZXIgbGVuZ3RoIGZvciBzdGF0cyAqLworCSAgICBzMiA9IHM7CQkJLyogUG9pbnQgYmFjayB0byBiZWdpbm5pbmcgb2Ygc291cmNlICovCisJICAgIHEyID0gcTsJCQkvKiBDb3B5IGRlc3QgcG9pbnRlciB0byBpbmNyZW1lbnQuLi4gKi8KKwkgICAgd2hpbGUgKCgqcTIrKyA9ICpzMisrKSkgOwkvKiBJbnN0ZWFkIG9mIGNhbGxpbmcgc3RyY3B5KCkuICovCisvKgorICBOb3RlOiBIUCBmbGV4ZWxpbnQgc2F5cyB0aGF0IHRoZSBhYm92ZSBsb29wIGNhbiByZXN1bHQgaW4gY3JlYXRpb24gKCsrKSBhbmQKKyAgYWNjZXNzICgqKSBvZiBvdXQtb2YtYm91bmRzIHBvaW50ZXJzLiAgSSByZWFsbHkgZG9uJ3Qgc2VlIGl0LgorKi8KKwl9CisjaWZkZWYgREVCVUcKKwllbHNlIHsJCQkJLyogVGhpcyB3b3VsZCBiZSBhIHJlYWxseSBiYWQgZXJyb3IgKi8KKwkgICAgY2hhciB0bXBbMjRdOwkJLyogU28gZ2V0IGEgZ29vZCByZWNvcmQgb2YgaXQuICovCisJICAgIGlmICh4ID4gMjMpIHsKKwkJY2tzdHJuY3B5KHRtcCxzLDIwKTsKKwkJc3RyY3B5KHRtcCsyMCwiLi4uIik7CisJCXRtcFsyM10gPSBOVUw7CisJICAgIH0gZWxzZSB7CisJCXN0cmNweSh0bXAscyk7CQkvKiBXZSBhbHJlYWR5IGNoZWNrZWQgdGhlIGxlbmd0aCAqLworCSAgICB9CisJICAgIGRlYnVnKEYxMTAsIk1BS0VTVFIgTUFMTE9DIEZBSUxVUkUgIix0bXAsMCk7CisJfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgfSBlbHNlCisgICAgICBxID0gTlVMTDsJCQkJLyogTGVuZ3RoIG9mIHN0cmluZyBpcyB6ZXJvICovCisKKyAgICBpZiAoKnApCQkJCS8qIE5vdyBmcmVlIHRoZSBvcmlnaW5hbCBzdG9yYWdlLiAqLworICAgICAgZnJlZSgqcCk7CisgICAgKnAgPSBxOworfQorCisvKiAgWCBNIEEgSyBFIFMgVCBSICAtLSAgTm9uLWRlc3RydWN0aXZlIG1ha2VzdHIoKSBpZiBzIGlzIE5VTEwuICAqLworCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK3htYWtlc3RyKGNoYXIgKipwLCBjb25zdCBjaGFyICpzKQorI2Vsc2UKK3htYWtlc3RyKHAscykgY2hhciAqKnAsICpzOworI2VuZGlmCisvKiB4bWFrZXN0ciAqLyB7CisgICAgaWYgKHMpIG1ha2VzdHIocCxzKTsKK30KKworI2lmbmRlZiBVU0VfTUVNQ1BZCisvKiBDIEsgTSBFIE0gQyBQIFkgIC0tICBQb3J0YWJsZSAoYnV0IHNsb3cpIG1lbWNweSgpICovCisKKy8qIENvcGllcyBuIGJ5dGVzIGZyb20gcyB0byBwLCBhbGxvd2luZyBmb3Igb3ZlcmxhcC4gKi8KKy8qIEZvciB1c2Ugd2hlbiByZWFsIG1lbWNweSgpIG5vdCBhdmFpbGFibGUuICovCisKK1ZPSUQKK2NrbWVtY3B5KHAscyxuKSBjaGFyICpwLCAqczsgaW50IG47IHsKKyAgICBjaGFyICogcSA9IE5VTEw7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgaW50IHg7CisKKyAgICBpZiAoIXMgfHwgIXAgfHwgbiA8PSAwIHx8IHAgPT0gcykJLyogVmVyaWZ5IGFyZ3MgKi8KKyAgICAgIHJldHVybjsKKyAgICB4ID0gcCAtIHM7CQkJCS8qIENoZWNrIGZvciBvdmVybGFwICovCisgICAgaWYgKHggPCAwKQorICAgICAgeCA9IDAgLSB4OworICAgIGlmICh4IDwgbikgewkJCS8qIFRoZXkgb3ZlcmxhcCAqLworCXEgPSBwOworCWlmICghKHAgPSAoY2hhciAqKW1hbGxvYyhuKSkpCS8qIFNvIHVzZSBhIHRlbXBvcmFyeSBidWZmZXIgKi8KKwkgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykJCS8qIENvcHkgbiBieXRlcyAqLworICAgICAgcFtpXSA9IHNbaV07CisgICAgaWYgKHEpIHsJCQkJLyogSWYgd2UgdXNlZCBhIHRlbXBvcmFyeSBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQkJLyogY29weSBmcm9tIGl0IHRvIGRlc3RpbmF0aW9uICovCisJICBxW2ldID0gcFtpXTsKKwlpZiAocCkgZnJlZShwKTsJCQkvKiBhbmQgZnJlZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciAqLworICAgIH0KK30KKyNlbmRpZiAvKiBVU0VfTUVNQ1BZICovCisKKworLyogIEMgSyBTIFQgUiBDIE0gUCAgLS0gIFN0cmluZyBjb21wYXJpc29uIHdpdGggY2FzZS1tYXR0ZXJzIHNlbGVjdGlvbiAqLworLyoKKyAgQ2FsbCB3aXRoIHBvaW50ZXJzIHRvIHRoZSB0d28gc3RyaW5ncywgczEgYW5kIHMyLCBhIGxlbmd0aCwgbiwKKyAgYW5kIGMgPT0gMCBmb3IgY2FzZWxlc3MgY29tcGFyaXNvbiwgbm9uemVybyBmb3IgY2FzZSBtYXR0ZXJzLgorICBDYWxsIHdpdGggbiA9PSAtMSB0byBjb21wYXJlIHdpdGhvdXQgYSBsZW5ndGggbGltaXQuCisgIENvbXBhcmVzIHVwIHRvIG4gY2hhcmFjdGVycyBvZiB0aGUgdHdvIHN0cmluZ3MgYW5kIHJldHVybnM6CisgICAgMSBpZiBzMSA+IHMyCisgICAgMCBpZiBzMSA9IHMyCisgICAtMSBpZiBzMSA8IHMyCisgIE5vdGU6IGNhc2UgaGFuZGxpbmcgaXMgb25seSBhcyBnb29kIGFzIGlzdXBwZXIoKSBhbmQgdG9sb3dlcigpLgorKi8KK2ludAorY2tzdHJjbXAoczEsczIsbixjKSBjaGFyICpzMSwgKnMyOyByZWdpc3RlciBpbnQgbiwgYzsgeworICAgIHJlZ2lzdGVyIENIQVIgdDEsIHQyOworICAgIGlmIChuID09IDApIHJldHVybigwKTsKKyAgICBpZiAoIXMxKSBzMSA9ICIiOwkJCS8qIFdhdGNoIG91dCBmb3IgbnVsbCBwb2ludGVycy4gKi8KKyAgICBpZiAoIXMyKSBzMiA9ICIiOworICAgIGlmICghKnMxKSByZXR1cm4oKnMyID8gLTEgOiAwKTsKKyAgICBpZiAoISpzMikgcmV0dXJuKDEpOworICAgIHdoaWxlIChuLS0pIHsKKwl0MSA9IChDSEFSKSAqczErKzsJCS8qIEdldCBuZXh0IGNoYXJhY3RlciBmcm9tIGVhY2guICovCisJdDIgPSAoQ0hBUikgKnMyKys7CisJaWYgKCF0MSkgcmV0dXJuKHQyID8gLTEgOiAwKTsKKwlpZiAoIXQyKSByZXR1cm4oMSk7CisJaWYgKCFjKSB7CQkJLyogSWYgY2FzZSBkb2Vzbid0IG1hdHRlciAqLworCSAgICBpZiAoaXN1cHBlcih0MSkpIHQxID0gdG9sb3dlcih0MSk7IC8qIENvbnZlcnQgY2FzZS4gKi8KKwkgICAgaWYgKGlzdXBwZXIodDIpKSB0MiA9IHRvbG93ZXIodDIpOworCX0KKwlpZiAodDEgPCB0MikgcmV0dXJuKC0xKTsJLyogczEgPCBzMiAqLworCWlmICh0MSA+IHQyKSByZXR1cm4oMSk7CQkvKiBzMSA+IHMyICovCisgICAgfQorICAgIHJldHVybigwKTsJCQkJLyogVGhleSdyZSBlcXVhbCAqLworfQorCisvKiAgQyBLIFMgVCBSIFAgUiBFICAtLSAgQ2FzZWxlc3Mgc3RyaW5nIHByZWZpeCBjb21wYXJpc29uICAqLworCisvKiBSZXR1cm5zIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyIGluIHRoZSAyIHN0cmluZ3MgdGhhdCBkb2Vzbid0IG1hdGNoICovCisKK2ludAorY2tzdHJwcmUoczEsczIpIGNoYXIgKnMxLCAqczI7IHsKKyAgICBDSEFSIHQxLCB0MjsKKyAgICBpbnQgbiA9IDA7CisgICAgaWYgKCFzMSkgczEgPSAiIjsKKyAgICBpZiAoIXMyKSBzMiA9ICIiOworICAgIHdoaWxlICgxKSB7CisJdDEgPSAoQ0hBUikgKnMxKys7CisJdDIgPSAoQ0hBUikgKnMyKys7CisJaWYgKCF0MSB8fCAhdDIpIHJldHVybihuKTsKKwlpZiAoaXN1cHBlcih0MSkpIHQxID0gdG9sb3dlcih0MSk7CisJaWYgKGlzdXBwZXIodDIpKSB0MiA9IHRvbG93ZXIodDIpOworCWlmICh0MSAhPSB0MikKKwkgIHJldHVybihuKTsKKwluKys7CisgICAgfQorfQorCisjZGVmaW5lIEdMT0JCSU5HCisKKy8qICBDIEsgTSBBIFQgQyBIICAtLSAgTWF0Y2ggYSBzdHJpbmcgYWdhaW5zdCBhIHBhdHRlcm4gICovCisvKgorICBDYWxsIHdpdGg6CisgICAgcGF0dGVybiB0byBiZSBtYXRjaGVkLgorICAgIHN0cmluZyB0byBsb29rIGZvciB0aGUgcGF0dGVybiBpbi4KKyAgICBpY2FzZSBpcyAxIGlmIGNhc2Utc2Vuc2l0aXZlLCAwIG90aGVyd2lzZS4KKyAgICBvcHRzIGlzIGEgYml0bWFzazoKKyAgICAgIEJpdCAwICg9MSk6CisJMSA9IE1hdGNoIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCAnLicKKwkwID0gRG9uJ3QgbWF0Y2ggdGhlbSAodXNlZCB3aXRoIFVOSVggZmlsZW5hbWVzKS4KKyAgICAgIEJpdCAxICg9Mik6CisJMSA9IEZpbGUgZ2xvYmJpbmcgKGRpcnNlcHMgYXJlIGZlbmNlcyk7CisJMCA9IERpcnNlcHMgYXJlIG5vdCBmZW5jZXMuCisgICAgICBCaXQgMiAoPTQpOgorCTEgPSBBbGxvdyBeIGFuZCAkIGFuY2hvcnMgYXQgYmVnaW5uaW5nIGFuZCBlbmQgb2YgcGF0dGVybi4KKwkwID0gRG9uJ3QgYWxsb3cgdGhlbSAobm9ybWFsIGNhc2UgZm9yIGZpbGVuYW1lIG1hdGNoaW5nKS4KKyAgICAgIEJpdCAzIChhbmQgYmV5b25kKTogVW5kZWZpbmVkLgorICBXb3JrcyBvbmx5IHdpdGggTlVMLXRlcm1pbmF0ZWQgc3RyaW5ncy4KKyAgUGF0dGVybiBtYXkgY29udGFpbiBhbnkgbnVtYmVyIG9mID8gYW5kL29yICouCisgIElmIENLUkVHRVggaXMgZGVmaW5lZCwgYWxzbyBbYWJjXSwgW2Etel0sIGFuZC9vciB7c3RyaW5nLHN0cmluZywuLi59LgorICAoTm90ZTogUkVHRVggaXMgYSBtaXNub21lciwgc2VlIGJlbG93LikKKworICBSZXR1cm5zOgorICAgIDAgaWYgc3RyaW5nIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4sCisgICAgPj0gMSwgdGhlIDEtYmFzZWQgcG9zaXRpb24gaW4gdGhlIHN0cmluZyB3aGVyZSB0aGUgbWF0Y2ggd2FzIGZvdW5kLgorCisgIFRvIGJlIGRvbmU6CisgICAgRmluZCBhIHdheSB0byBpZGVudGlmeSB0aGUgcGllY2Ugb2YgdGhlIHN0cmluZyB0aGF0IG1hdGNoZWQgdGhlIHBhdHRlcm4sCisgICAgYXMgaW4gU25vYm9sICJMSU5FIChQQVQgLiBSRVNVTFQpIi4gIFRoaXMgaXMgbm93IHBhcnRpYWxseSBkb25lIGJ5CisgICAgc2V0dGluZyBtYXRjaHBvcyBhbmQgbWF0Y2hlbmQgKGV4Y2VwdCBtYXRjaGVuZCBuZWVkcyBzb21lIHR1bmluZykuICBCdXQKKyAgICB0aGVzZSBhcmUgdXNlbGVzcyB1bmxlc3MgYSBjb3B5IG9mIHRoZSBzdHJpbmcgaXMga2VwdCwgb3IgYSBjb3B5IG9mIHRoZQorICAgIG1hdGNoaW5nIHBhcnQgaXMgbWFkZS4gIEJ1dCB0aGF0IHdvdWxkIGJlIHRvbyBjb3N0bHkgaW4gcGVyZm9ybWFuY2UgLS0KKyAgICB0aGlzIHJvdXRpbmUgaGFzIHRvIGJlIGZhc3QgYmVjYXVzZSBpdCdzIHVzZWQgZm9yIHdpbGRjYXJkIGV4cGFuc2lvbi4KKworICBOb3RlOgorICAgIFBhdHRlcm5zIGFyZSBub3QgdGhlIHNhbWUgYXMgcmVndWxhciBleHByZXNzaW9ucywgaW4gd2hpY2ggJyonIG1lYW5zCisgICAgMCBvciBtb3JlIHJlcGV0aXRpb25zIG9mIHRoZSBwcmVjZWRpbmcgaXRlbS4gIEZvciBleGFtcGxlICJhKmIiIGFzIGEKKyAgICBwYXR0ZXJuIG1hdGNoZXMgYW55IHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoICdhJyBhbmQgZW5kcyB3aXRoICdiJzsgYXMgYQorICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBpdCBtYXRjaGVzIGFueSBzdHJpbmcgb2YgemVybyBvciBtb3JlIGEncyBmb2xsb3dlZCBieQorICAgIG9uZSBiLiAgUmVndWxhciBleHByZXNzaW9ucyBhcmUgZXNwZWNpYWxseSB1c2VmdWwgaW4gbWF0Y2hpbmcgc3RyaW5ncyBvZgorICAgIChzYXkpIGRpZ2l0cywgb3IgbGV0dGVycywgZS5nLiAiWzAtOV0qIiBtYXRjaGVzIGFueSBzdHJpbmcgb2YgZGlnaXRzLgorKi8KK3N0YXRpYyBjaGFyICogbXlwYXQgPSBOVUxMOwkJLyogRm9yIHJld3JpdGluZyBwYXR0ZXJuICovCitzdGF0aWMgaW50IG1hdGNocG9zID0gMDsKK2ludCBtYXRjaGVuZCA9IDA7CitzdGF0aWMgaW50IG1hdGNoZGVwdGggPSAwOworc3RhdGljIGludCBzdHJpbmdwb3MgPSAwOworc3RhdGljIGNoYXIgKiBvc3RyaW5nID0gTlVMTDsKKworI2RlZmluZSBNQVRDSFJFVFVSTih4LHkpIHsgcmM9eTsgd2hlcmU9eDsgZ290byB4Y2ttYXRjaDsgfQorc3RhdGljIGNoYXIgKiBsYXN0cGF0ID0gTlVMTDsKKworaW50Citja21hdGNoKHBhdHRlcm4sIHN0cmluZywgaWNhc2UsIG9wdHMpIGNoYXIgKnBhdHRlcm4sKnN0cmluZzsgaW50IGljYXNlLCBvcHRzOyB7CisgICAgaW50IHEgPSAwLCBpID0gMCwgayA9IC0xLCB4LCBmbGFnID0gMDsKKyAgICBpbnQgcmMgPSAwOwkJCQkvKiBSZXR1cm4gY29kZSAqLworICAgIGludCB3aGVyZSA9IC0xOworICAgIENIQVIgY3A7CQkJCS8qIEN1cnJlbnQgY2hhcmFjdGVyIGZyb20gcGF0dGVybiAqLworICAgIENIQVIgY3M7CQkJCS8qIEN1cnJlbnQgY2hhcmFjdGVyIGZyb20gc3RyaW5nICovCisgICAgaW50IHBsZW4sIGRvdCwgZ2xvYmJpbmcsIHhzdGFyID0gMDsKKyAgICBpbnQgYnJvbmx5ID0gMDsJCQkvKiBXaG9sZSBwYXR0ZXJuIGlzIHthLGIsYywuLi59ICovCisKKyAgICBkZWJ1ZyhGMTExLCJDS01BVENIIEVOVFJZIHBhdCBvcHQiLHBhdHRlcm4sb3B0cyk7CisgICAgZGVidWcoRjExMSwiQ0tNQVRDSCBFTlRSWSBzdHIgZGVwIixzdHJpbmcsbWF0Y2hkZXB0aCk7CisgICAgLyogZGVidWcoRjEwMSwiQ0tNQVRDSCBFTlRSWSBpY2FzZSIsIiIsaWNhc2UpOyAqLworCisgICAgZ2xvYmJpbmcgPSBvcHRzICYgMjsKKworICAgIGlmICghc3RyaW5nKSBzdHJpbmcgPSAiIjsKKyAgICBpZiAoIXBhdHRlcm4pIHBhdHRlcm4gPSAiIjsKKyAgICBpZiAoISpwYXR0ZXJuKSB7CQkJLyogRW1wdHkgcGF0dGVybiBtYXRjaGVzIGFueXRoaW5nICovCisJbWF0Y2hkZXB0aCsrOwkJCS8qIChpdCB3YXNuJ3QgaW5jcmVtZW50ZWQgeWV0KSAqLworCU1BVENIUkVUVVJOKDAsMSk7CisgICAgfQorICAgIGlmIChtYXRjaGRlcHRoID09IDApIHsJCS8qIFRvcC1sZXZlbCBjYWxsPyAqLworCXN0cmluZ3BvcyA9IDA7CQkJLyogUmVzZXQgaW5kaWNlcyBldGMuICovCisJbWF0Y2hwb3MgPSAwOworCW1hdGNoZW5kID0gMDsKKwlvc3RyaW5nID0gc3RyaW5nOworCWxhc3RwYXQgPSBwYXR0ZXJuOworCWlmICgqcGF0dGVybiA9PSAneycpCQkvKiBFbnRpcmUgcGF0dGVybiBpcyB7YSxiLmN9ICovCisJICBicm9ubHkgPSAxOwkJCS8qIE1heWJlICovCisJZG90ID0gKG9wdHMgJiAxKSB8fAkJLyogTWF0Y2ggbGVhZGluZyBkb3QgKGlmIGZpbGUpICovCisJICAgIChvcHRzICYgMiA9PSAwKSB8fAkJLyogYWx3YXlzIGlmIG5vdCBmaWxlICovCisJICAgIChwYXR0ZXJuWzBdID09ICcuJyk7CS8qIG9yIGlmIHBhdHRlcm4gc3RhcnRzIHdpdGggJy4nICovCisKKwlwbGVuID0gc3RybGVuKHBhdHRlcm4pOwkJLyogTGVuZ3RoIG9mIHBhdHRlcm4gKi8KKy8qIFRoaXMgd291bGQgYmUgdXNlZCBpbiBjYWxjdWxhdGluZyBsZW5ndGggb2YgbWF0Y2hpbmcgc2VnbWVudCAqLworCWlmIChwbGVuID4gMCkJCQkvKiBVc2VyJ3MgcGF0dGVybiBlbmRzIHdpdGggJyonICovCisJICBpZiAocGF0dGVybltwbGVuIC0gMV0gPT0gJyonKQorCSAgICB4c3RhciA9IDE7CisJaWYgKHBhdHRlcm5bMF0gPT0gJyonKSB7CS8qIFVzZXIncyBwYXR0ZXJuIHN0YXJ0cyB3aXRoICcqJyAqLworCSAgICBtYXRjaHBvcyA9IDE7CisJICAgIGRlYnVnKEYxMTEsIkNLTUFUQ0ggMSIsc3RyaW5nLCBtYXRjaHBvcyk7CisJfQorCWlmIChvcHRzICYgNCkgewkJCS8qIF4uLiQgYWxsb3dlZCAodG9wIGxldmVsIG9ubHkpICovCisJICAgIC8qIFJld3JpdGUgcGF0dGVybiB0byBhY2NvdW50IGZvciBeLi4kIGFuY2hvcmluZy4uLiAqLworCisJICAgIGlmIChteXBhdCkgZnJlZShteXBhdCk7CS8qIEdldCBzcGFjZSBmb3IgIipwYXR0ZXJuKiIgKi8KKwkgICAgbXlwYXQgPSAoY2hhciAqKW1hbGxvYyhwbGVuICsgNCk7CisJICAgIGlmIChteXBhdCkgewkJLyogR290IHNwYWNlPyAqLworCQljaGFyICogcyA9IHBhdHRlcm4sICogcCA9IG15cGF0OyAvKiBTZXQgd29ya2luZyBwb2ludGVycyAqLworCQlpZiAoKnMgPT0gJ14nKSB7CS8qIEZpcnN0IHNvdXJjZSBjaGFyIGlzIF4gKi8KKwkJICAgIHMrKzsJCS8qIHNvIHNraXAgcGFzdCBpdCAqLworCQl9IGVsc2UgaWYgKCpzICE9ICcqJykgewkvKiBvdGhlcndpc2UgKi8KKwkJICAgICpwKysgPSAnKic7CQkvKiBwcmVwZW5kICcqJyB0byBwYXR0ZXJuICovCisJCX0KKwkJd2hpbGUgKCpzKSB7CQkvKiBDb3B5IHJlc3Qgb2YgcGF0dGVybiAqLworCQkgICAgaWYgKCEqKHMrMSkpIHsJLyogRmluYWwgcGF0dGVybiBjaGFyYWN0ZXI/ICovCisJCQlpZiAoKnMgIT0gJyQnKSB7IC8qIElmIGl0J3Mgbm90ICckJyAqLworCQkJICAgICpwKysgPSAqczsJLyogQ29weSBpdCBpbnRvIHRoZSBwYXR0ZXJuICovCisJCQkgICAgaWYgKCpzKysgIT0gJyonKSAvKiBBbmQgaWYgaXQncyBhbHNvIG5vdCAnKicgKi8KKwkJCSAgICAgICpwKysgPSAnKic7IC8qIGFwcGVuZCAnKicuICovCisJCQl9CisJCQlicmVhazsJCS8qIERvbmUgKi8KKwkJICAgIH0gZWxzZQkJLyogTm90IGZpbmFsIGNoYXJhY3RlciAqLworCQkgICAgICAqcCsrID0gKnMrKzsJLyogSnVzdCBjb3B5IGl0ICovCisJCX0KKwkJKnAgPSBOVUw7CQkvKiBUZXJtaW5hdGUgdGhlIG5ldyBwYXR0ZXJuICovCisJCXBhdHRlcm4gPSBteXBhdDsJLyogTWFrZSB0aGUgc3dpdGNoICovCisJICAgIH0KKwkgICAgZGVidWcoRjExMCwiQ0tNQVRDSCBJTklUIHBhdCIscGF0dGVybiwwKTsKKwl9CisgICAgfQorICAgIG1hdGNoZGVwdGgrKzsJCQkvKiBOb3cgaW5jcmVtZW50IGNhbGwgZGVwdGggKi8KKworI2lmZGVmIFVOSVgKKyAgICBpZiAoIWRvdCkgewkJCQkvKiBGb3IgVU5JWCBmaWxlIGdsb2JiaW5nICovCisJaWYgKCpzdHJpbmcgPT0gJy4nICYmICpwYXR0ZXJuICE9ICcuJyAmJiAhbWF0Y2hkb3QpIHsKKwkgICAgaWYgKAorI2lmZGVmIENLUkVHRVgKKwkJKnBhdHRlcm4gIT0gJ3snICYmICpwYXR0ZXJuICE9ICdbJworI2Vsc2UKKwkJMQorI2VuZGlmIC8qIENLUkVHRVggKi8KKwkJKSB7CisJCWRlYnVnKEYxMTAsImNrbWF0Y2ggc2tpcCIsc3RyaW5nLDApOworCQlNQVRDSFJFVFVSTigxLDApOworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZiAvKiBVTklYICovCisgICAgd2hpbGUgKDEpIHsKKwlrKys7CisJY3AgPSAqcGF0dGVybjsJCQkvKiBDaGFyYWN0ZXIgZnJvbSBwYXR0ZXJuICovCisJY3MgPSAqc3RyaW5nOwkJCS8qIENoYXJhY3RlciBmcm9tIHN0cmluZyAqLworCisjaWZkZWYgQ09NTUVOVAorCWRlYnVnKEYwMDAsIkNLTUFUQ0ggcGF0IGNwIixwYXR0ZXJuLGNwKTsKKwlkZWJ1ZyhGMDAwLCJDS01BVENIIHN0ciBjcyIsc3RyaW5nLGNzKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKwlpZiAoIWNzKSB7CQkJLyogRW5kIG9mIHN0cmluZyAtIGRvbmUuICovCisJICAgIHggPSAoIWNwIHx8IChjcCA9PSAnKicgJiYgISoocGF0dGVybisxKSkpID8gMSA6IDA7CisJICAgIGlmICh4KSB7CisJCWlmICghbWF0Y2hwb3MpIHsKKwkJICAgIG1hdGNocG9zID0gc3RyaW5ncG9zOworCQkgICAgZGVidWcoRjExMSwiQ0tNQVRDSCBBIixzdHJpbmcsIG1hdGNocG9zKTsKKwkJfQorCQltYXRjaGVuZCA9IHN0cmluZ3BvczsKKwkJTUFUQ0hSRVRVUk4oMixtYXRjaHBvcyk7CisJICAgIH0KKwkgICAgZGVidWcoRjExMSwiQ0tNQVRDSCBaRVJPIGQiLHN0cmluZywgbWF0Y2hwb3MpOworCSAgICBtYXRjaHBvcyA9IDA7CisJICAgIE1BVENIUkVUVVJOKDE2LG1hdGNocG9zKTsKKwl9CisgICAgICAgIGlmICghaWNhc2UpIHsJCQkvKiBJZiBpZ25vcmluZyBjYXNlICovCisJICAgIGlmIChpc3VwcGVyKGNwKSkJCS8qIGNvbnZlcnQgYm90aCB0byBsb3dlcmNhc2UuICovCisJICAgICAgY3AgPSB0b2xvd2VyKGNwKTsKKwkgICAgaWYgKGlzdXBwZXIoY3MpKQorCSAgICAgIGNzID0gdG9sb3dlcihjcyk7CisgICAgICAgIH0KKwlpZiAocSkgewkJCS8qIFRoaXMgY2hhcmFjdGVyIHdhcyBxdW90ZWQgKi8KKwkgICAgZGVidWcoRjAwMCwiQ0tNQVRDSCBRVU9URUQiLHBhdHRlcm4sY3ApOworCSAgICBxID0gMDsJCQkvKiBUdXJuIG9mZiBxdW90ZSBmbGFnICovCisKKwkgICAgaWYgKGNzID09IGNwKSB7CQkvKiBDb21wYXJlIGRpcmVjdGx5ICovCisJCWlmICghbWF0Y2hwb3MpIHsJLyogTWF0Y2hlcyAqLworCQkgICAgbWF0Y2hwb3MgPSBzdHJpbmdwb3M7CisJCSAgICBkZWJ1ZyhGMTExLCJDS01BVENIIFxcIG5ldyBtYXRjaCIsc3RyaW5nLCBtYXRjaHBvcyk7CisJCX0KKwkJcGF0dGVybisrOworCSAgICB9IGVsc2UgewkJCS8qIERvZXNuJ3QgbWF0Y2ggKi8KKwkJcGF0dGVybiA9IGxhc3RwYXQ7CS8qIEJhY2sgdXAgdGhlIHBhdHRlcm4gKi8KKwkJbWF0Y2hwb3MgPSAwOworCQlkZWJ1ZyhGMTExLCJDS01BVENIIFxcIG5vIG1hdGNoIixwYXR0ZXJuLCBtYXRjaHBvcyk7CisJICAgIH0KKwkgICAgc3RyaW5nKys7CisJICAgIHN0cmluZ3BvcysrOworCSAgICBjb250aW51ZTsKKwl9CisJaWYgKGNwID09IENNRFEgJiYgIXEpIHsJCS8qIFF1b3RlIGluIHBhdHRlcm4gKi8KKwkgICAgZGVidWcoRjAwMCwiQ0tNQVRDSCBRVU9URSIscGF0dGVybixjcCk7CisJICAgIHEgPSAxOwkJCS8qIFNldCBmbGFnICovCisJICAgIHBhdHRlcm4rKzsJCQkvKiBBZHZhbmNlIHRvIG5leHQgcGF0dGVybiBjaGFyYWN0ZXIgKi8KKwkgICAgY29udGludWU7CQkJLyogYW5kIGNvbnRpbnVlLiAqLworCX0KKwlpZiAoY3MgJiYgY3AgPT0gJz8nKSB7CQkvKiAnPycgbWF0Y2hlcyBhbnkgY2hhciAqLworCSAgICBpZiAoIW1hdGNocG9zKSB7CisJCW1hdGNocG9zID0gc3RyaW5ncG9zOworCQlkZWJ1ZyhGMTExLCJDS01BVENIIEQiLHN0cmluZywgbWF0Y2hwb3MpOworCSAgICB9CisJICAgIGRlYnVnKEYxMTAsIkNLTUFUQ0ggPyBwYXQiLHBhdHRlcm4sMCk7CisJICAgIGRlYnVnKEYxMTAsIkNLTUFUQ0ggPyBzdHIiLHN0cmluZywwKTsKKwkgICAgcGF0dGVybisrLCBzdHJpbmcrKzsKKwkgICAgc3RyaW5ncG9zKys7CisJICAgIGNvbnRpbnVlOworI2lmZGVmIENLUkVHRVgKKwl9IGVsc2UgaWYgKGNwID09ICdbJykgewkJLyogSGF2ZSBicmFja2V0ICovCisJICAgIGludCBxID0gMDsJCQkvKiBNeSBvd24gcHJpdmF0ZSBxICovCisJICAgIGNoYXIgKiBwc2F2ZSA9IE5VTEw7CS8qIGFuZCBiYWNrdXAgcG9pbnRlciAqLworCSAgICBDSEFSIGNsaXN0WzI1Nl07CQkvKiBDaGFyYWN0ZXIgbGlzdCBmcm9tIGJyYWNrZXRzICovCisJICAgIENIQVIgYywgYzEsIGMyOworCSAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCS8qIG1lbXNldCgpIGV0YyBub3QgcG9ydGFibGUgKi8KKwkgICAgICBjbGlzdFtpXSA9IE5VTDsKKwkgICAgcHNhdmUgPSArK3BhdHRlcm47CQkvKiBXaGVyZSBwYXR0ZXJuIHN0YXJ0cyAqLworCSAgICBkZWJ1ZyhGMTExLCJDS01BVENIIFtdICIscGF0dGVybi0xLCBtYXRjaHBvcyk7CisJICAgIGZvciAoZmxhZyA9IDA7ICFmbGFnOyBwYXR0ZXJuKyspIHsgLyogTG9vcCB0aHJ1IHBhdHRlcm4gKi8KKwkJYyA9IChDSEFSKSpwYXR0ZXJuOwkvKiBDdXJyZW50IGNoYXIgKi8KKwkJaWYgKHEpIHsJCS8qIFF1b3RlIHdpdGhpbiBicmFja2V0cyAqLworCQkgICAgcSA9IDA7CisJCSAgICBjbGlzdFtjXSA9IDE7CisJCSAgICBjb250aW51ZTsKKwkJfQorCQlpZiAoIWljYXNlKQkJLyogQ2FzZSBjb252ZXJzaW9uICovCisJCSAgaWYgKGlzdXBwZXIoYykpCisJCSAgICBjID0gdG9sb3dlcihjKTsKKwkJc3dpdGNoIChjKSB7CQkvKiBIYW5kbGUgdW5xdW90ZWQgY2hhcmFjdGVyICovCisJCSAgY2FzZSBOVUw6CQkvKiBFbmQgb2Ygc3RyaW5nICovCisJCSAgICBNQVRDSFJFVFVSTig0LDApOwkvKiBObyBtYXRjaGluZyAnXScgc28gZmFpbCAqLworCQkgIGNhc2UgQ01EUToJCS8qIE5leHQgY2hhciBpcyBxdW90ZWQgKi8KKwkJICAgIHEgPSAxOwkJLyogU2V0IGZsYWcgKi8KKwkJICAgIGNvbnRpbnVlOwkJLyogYW5kIGNvbnRpbnVlLiAqLworCQkgIGNhc2UgJy0nOgkJLyogQSByYW5nZSBpcyBzcGVjaWZpZWQgKi8KKwkJICAgIGMxID0gKHBhdHRlcm4gPiBwc2F2ZSkgPyAoQ0hBUikqKHBhdHRlcm4tMSkgOiBOVUw7CisJCSAgICBjMiA9IChDSEFSKSoocGF0dGVybisxKTsgLyogSUdOT1JFIE9VVC1PRi1CT1VORFMgV0FSTklORyAqLworCQkgICAgaWYgKGMyID09ICddJykgYzIgPSBOVUw7IC8qIChpdCBjYW4ndCBoYXBwZW4pICovCisJCSAgICBpZiAoYzEgPT0gTlVMKSBjMSA9IGMyOworCQkgICAgZm9yIChjID0gYzE7IGMgPD0gYzI7IGMrKykgeworCQkJY2xpc3RbY10gPSAxOworCQkJaWYgKCFpY2FzZSkgeworCQkJICAgIGlmIChpc2xvd2VyKGMpKSB7CisJCQkJY2xpc3RbdG91cHBlcihjKV0gPSAxOworCQkJICAgIH0gZWxzZSBpZiAoaXN1cHBlcihjKSkgeworCQkJCWNsaXN0W3RvbG93ZXIoYyldID0gMTsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCSAgICBjb250aW51ZTsKKwkJICBjYXNlICddJzoJCS8qIEVuZCBvZiBicmFja2V0ZWQgc2VxdWVuY2UgKi8KKwkJICAgIGZsYWcgPSAxOwkJLyogRG9uZSB3aXRoIEZPUiBsb29wICovCisJCSAgICBicmVhazsJCS8qIENvbXBhcmUgd2hhdCB3ZSBoYXZlICovCisJCSAgZGVmYXVsdDoJCS8qIEp1c3QgYSBjaGFyICovCisJCSAgICBjbGlzdFtjXSA9IDE7CS8qIFJlY29yZCBpdCAqLworCQkgICAgaWYgKCFpY2FzZSkgeworCQkJaWYgKGlzbG93ZXIoYykpIHsKKwkJCSAgICBjbGlzdFt0b3VwcGVyKGMpXSA9IDE7CisJCQl9IGVsc2UgaWYgKGlzdXBwZXIoYykpIHsKKwkJCSAgICBjbGlzdFt0b2xvd2VyKGMpXSA9IDE7CisJCQl9CisJCSAgICB9CisJCSAgICBjb250aW51ZTsKKwkJfQorCSAgICB9CisJICAgIGlmICghY2xpc3RbKHVuc2lnbmVkKWNzXSkgewkvKiBNYXRjaD8gKi8KKwkJTUFUQ0hSRVRVUk4oNSwwKTsJLyogTm9wZSwgZG9uZS4gKi8KKwkgICAgfQorCSAgICBpZiAoIW1hdGNocG9zKSB7CisJCW1hdGNocG9zID0gc3RyaW5ncG9zOworCQlkZWJ1ZyhGMTExLCJDS01BVENIIFtdIG1hdGNoIixzdHJpbmcsIG1hdGNocG9zKTsKKwkgICAgfQorCSAgICBzdHJpbmcrKzsJCQkvKiBZZXMsIGFkdmFuY2Ugc3RyaW5nIHBvaW50ZXIgKi8KKwkgICAgc3RyaW5ncG9zKys7CisJICAgIGNvbnRpbnVlOwkJCS8qIGFuZCBnbyBvbi4gKi8KKwl9IGVsc2UgaWYgKGNwID09ICd7JykgewkJLyogQnJhY2VzIGVuY2xvc2luZyBsaXN0IG9mIHN0cmluZ3MgKi8KKwkgICAgY2hhciAqIHAsICogcywgKiBzMiwgKiBidWYgPSBOVUxMOworCSAgICBpbnQgbiwgYmMgPSAwOworCSAgICBpbnQgbGVuID0gMDsKKwkgICAgZGVidWcoRjExMSwiQ0tNQVRDSCB7fSAiLHN0cmluZywgbWF0Y2hwb3MpOworCSAgICBmb3IgKHAgPSBwYXR0ZXJuKys7ICpwOyBwKyspIHsKKwkJaWYgKCpwID09ICd7JykgYmMrKzsKKwkJaWYgKCpwID09ICd9JykgYmMtLTsKKwkJaWYgKGJjIDwgMSkgYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGJjICE9IDApIHsJCS8qIEJyYWNlcyBkb24ndCBtYXRjaCAqLworCQlNQVRDSFJFVFVSTig2LDApOwkvKiBGYWlsICovCisJICAgIH0gZWxzZSB7CQkJLyogQnJhY2VzIGRvIG1hdGNoICovCisJCWludCBxID0gMCwgZG9uZSA9IDA7CisJCWxlbiA9ICpwID8gc3RybGVuKHArMSkgOiAwOyAvKiBMZW5ndGggb2YgcmVzdCBvZiBwYXR0ZXJuICovCisJCWlmIChsZW4pCisJCSAgYnJvbmx5ID0gMDsKKwkJaWYgKGJyb25seSAmJiAobWF0Y2hkZXB0aCAhPSAxKSkKKwkJICBicm9ubHkgPSAwOworCQluID0gcCAtIHBhdHRlcm47CSAgICAvKiBTaXplIG9mIGxpc3QgaW4gYnJhY2VzICovCisJCWlmICgoYnVmID0gKGNoYXIgKiltYWxsb2MobisxKSkpIHsgLyogQ29weSBzbyB3ZSBjYW4gcG9rZSBpdCAqLworCQkgICAgY2hhciAqIHRwID0gTlVMTDsKKwkJICAgIGludCBrLCBzb2ZhcjsKKwkJICAgIGNrc3RybmNweShidWYscGF0dGVybixuKzEpOworCQkgICAgc29mYXIgPSBzdHJpbmcgLSBvc3RyaW5nIC0gbWF0Y2hwb3MgKyAxOworCQkgICAgaWYgKHNvZmFyIDwgMCkgc29mYXIgPSAwOworCQkgICAgZGVidWcoRjExMSwiQ0tNQVRDSCAuLiBzdHJpbmciLHN0cmluZyxzb2Zhcik7CisJCSAgICBkZWJ1ZyhGMTExLCJDS01BVENIIC4uIG9zdHJpbmciLG9zdHJpbmcsc29mYXIpOworCQkgICAgbiA9IDA7CisJCSAgICBmb3IgKHMgPSBzMiA9IGJ1ZjsgMTsgcysrKSB7IC8qIExvb3AgdGhyb3VnaCBzZWdtZW50cyAqLworCQkJbisrOworCQkJaWYgKHEpIHsJLyogVGhpcyBjaGFyIGlzIHF1b3RlZCAqLworCQkJICAgIHEgPSAwOworCQkJICAgIGlmICghKnMpCisJCQkgICAgICBkb25lID0gMTsKKwkJCSAgICBjb250aW51ZTsKKwkJCX0KKwkJCWlmICgqcyA9PSBDTURRICYmICFxKSB7CS8qIFF1b3RlIG5leHQgY2hhciAqLworCQkJICAgIHEgPSAxOworCQkJICAgIGNvbnRpbnVlOworCQkJfQorCQkJaWYgKCEqcyB8fCAqcyA9PSAnLCcpIHsJLyogRW5kIG9mIHRoaXMgc2VnbWVudCAqLworCQkJICAgIGludCB0cGxlbiA9IDA7CisJCQkgICAgaWYgKCEqcykJLyogSWYgZW5kIG9mIGJ1ZmZlciAqLworCQkJICAgICAgZG9uZSA9IDE7CS8qIHRoZW4gZW5kIG9mIGxhc3Qgc2VnbWVudCAqLworCQkJICAgICpzID0gTlVMOwkvKiBPdmVyd3JpdGUgY29tbWEgd2l0aCBOVUwgKi8KKwkJCSAgICBkZWJ1ZyhGMTExLCJDS01BVENIIHt9IHNlZ21lbnQiLHMyLGRvbmUpOworCQkJICAgIHRwbGVuID0gbiArIGxlbiArIHNvZmFyICsgMjsKKwkJCSAgICBpZiAoISpzMikgewkvKiBFbXB0eSBzZWdtZW50LCBubyBhZHZhbmNlbWVudCAqLworCQkJCWsgPSAwOworCQkJICAgIH0gZWxzZSBpZiAoKHRwID0gKGNoYXIgKiltYWxsb2ModHBsZW4pKSkgeworCQkJCWludCBzYXZwb3MsIG9wdHMyOworCQkJCWNoYXIgKiBwcDsKKwkJCQlwcCA9IG1hdGNocG9zID4gMCA/CisJCQkJICAgICZvc3RyaW5nW21hdGNocG9zLTFdIDoKKwkJCQkgICAgb3N0cmluZzsKKwkJCQlpZiAoYnJvbmx5KSB7CisJCQkJICAgIGlmIChtYXRjaHBvcyA+IDApCisJCQkJICAgICAgY2tzdHJuY3B5KHRwLHBwLHNvZmFyKzEpOworCQkJCSAgICBlbHNlCisJCQkJICAgICAgY2tzdHJuY3B5KHRwLHBwLHNvZmFyKTsKKwkJCQl9IGVsc2UgeworCQkJCSAgICB0cFswXSA9ICcqJzsKKwkJCQkgICAgdHBbMV0gPSBOVUw7CisJCQkJICAgIGlmIChtYXRjaHBvcyA+IDApCisJCQkJICAgICAgY2tzdHJuY3B5KCZ0cFsxXSxwcCxzb2ZhcisxKTsKKwkJCQkgICAgZWxzZQorCQkJCSAgICAgIGNrc3RybmNweSgmdHBbMV0scHAsc29mYXIpOworCQkJCX0KKwkJCQlja3N0cm5jYXQodHAsczIsdHBsZW4pOyAvKiBDdXJyZW50IHNlZ21lbnQgKi8KKwkJCQlja3N0cm5jYXQodHAscCsxLHRwbGVuKTsgLyogcmVzdCBvZiBwYXR0ZXJuICovCisKKwkJCQlkZWJ1ZyhGMTAxLCJDS01BVENIIHt9IG1hdGNocG9zIiwiIixtYXRjaHBvcyk7CisJCQkJc2F2cG9zID0gbWF0Y2hwb3M7CisJCQkJbWF0Y2hwb3MgPSAwOworI2lmZGVmIERFQlVHCisJCQkJaWYgKGRlYmxvZykgeworCQkJCSAgICBkZWJ1ZyhGMTExLCJDS01BVENIIHt9IHRwIix0cCxtYXRjaHBvcyk7CisJCQkJICAgIGRlYnVnKEYxMTEsIkNLTUFUQ0gge30gc3RyaW5nIiwKKwkJCQkJICBzdHJpbmcsbWF0Y2hwb3MpOworCQkJCSAgICBkZWJ1ZyhGMTExLCJDS01BVENIIHt9IG9zdHJpbmciLAorCQkJCQkgIG9zdHJpbmcsc2F2cG9zKTsKKwkJCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCQkvKiBJZiBzZWdtZW50IHN0YXJ0cyB3aXRoIGRvdCAqLworCQkJCS8qIHRoZW4gc2V0IG1hdGNoZG90IG9wdGlvbi4uICovCisJCQkJb3B0czIgPSBvcHRzOworCQkJCWlmICgqczIgPT0gJy4nKSBvcHRzMiB8PSAxOworCQkJCWRlYnVnKEYxMTEsIkNLTUFUQ0gge30gcmVjdXJzaW5nIixzMixvcHRzMik7CisJCQkJayA9IGNrbWF0Y2godHAsCisJCQkJCSAgICAoc3RyaW5nID4gb3N0cmluZykgPworCQkJCQkgICAgJm9zdHJpbmdbc2F2cG9zLTFdIDogc3RyaW5nLAorCQkJCQkgICAgaWNhc2Usb3B0czIpOworI2lmZGVmIERFQlVHCisJCQkJaWYgKGRlYmxvZykgeworCQkJCSAgICBkZWJ1ZyhGMTAxLCJDS01BVENIIHt9IGsiLCIiLGspOworCQkJCSAgICBkZWJ1ZyhGMTAxLCJDS01BVENIIHt9IHNhdnBvcyIsIiIsc2F2cG9zKTsKKwkJCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCQlmcmVlKHRwKTsKKwkJCQl0cCA9IE5VTEw7CisJCQkJaWYgKGsgPT0gMCkgeworCQkJCSAgICBtYXRjaHBvcyA9IHNhdnBvczsKKwkJCQl9CisJCQkJaWYgKGsgPiAwKSB7IC8qIElmIGl0IG1hdGNoZWQgd2UncmUgZG9uZSAqLworCQkJCSAgICBNQVRDSFJFVFVSTig3LGspOworCQkJCX0KKwkJCSAgICB9IGVsc2UgewkvKiBNYWxsb2MgZmFpbHVyZSAqLworCQkJCU1BVENIUkVUVVJOKDE0LDApOworCQkJICAgIH0KKwkJCSAgICBpZiAoaykgewkvKiBTdWNjZXNzZnVsIGNvbXBhcmlzb24gKi8KKwkJCQlpZiAoIW1hdGNocG9zKSB7CisJCQkJICAgIG1hdGNocG9zID0gc3RyaW5ncG9zOworCQkJCSAgICBkZWJ1ZyhGMTExLCJDS01BVENIIHt9IG1hdGNoIiwKKwkJCQkJICBzdHJpbmcsIG1hdGNocG9zKTsKKwkJCQl9CisJCQkJc3RyaW5nICs9IG4tMTsgLyogQWR2YW5jZSBwb2ludGVycyAqLworCQkJCXBhdHRlcm4gPSBwKzE7CisJCQkJYnJlYWs7CisJCQkgICAgfQorCQkJICAgIGlmIChkb25lKQkvKiBJZiBubyBtb3JlIHNlZ21lbnRzICovCisJCQkgICAgICBicmVhazsJLyogYnJlYWsgb3V0IG9mIHNlZ21lbnQgbG9vcC4gKi8KKwkJCSAgICBzMiA9IHMrMTsJLyogT3RoZXJ3aXNlLCBvbiB0byBuZXh0IHNlZ21lbnQgKi8KKwkJCSAgICBuID0gMDsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGZyZWUoYnVmKTsKKwkJfQorCSAgICB9CisjZW5kaWYgLyogQ0tSRUdFWCAqLworCX0gZWxzZSBpZiAoY3AgPT0gJyonKSB7CQkvKiBQYXR0ZXJuIGNoYXIgaXMgYXN0ZXJpc2sgKi8KKwkgICAgY2hhciAqIHBzYXZlOworCSAgICBjaGFyICogcCwgKiBzID0gTlVMTDsJLyogbWVhbmluZyBtYXRjaCBhbnl0aGluZyAqLworCSAgICBpbnQgaywgbiwgcSA9IDA7CisJICAgIHdoaWxlICgqcGF0dGVybiA9PSAnKicpCS8qIENvbGxhcHNlIHN1Y2Nlc3NpdmUgYXN0ZXJpc2tzICovCisJICAgICAgcGF0dGVybisrOworCSAgICBwc2F2ZSA9IHBhdHRlcm47CQkvKiBGaXJzdCBub24tYXN0ZXJpc2sgYWZ0ZXIgYXN0ZXJpc2sgKi8KKwkgICAgbGFzdHBhdCA9IHBhdHRlcm4gLSAxOwkvKiBEaXR0bywgZ2xvYmFsICovCisJICAgIGRlYnVnKEYxMTEsIkNLTUFUQ0ggKiAiLHN0cmluZyxtYXRjaHBvcyk7CisJICAgIGZvciAobiA9IDAsIHAgPSBwc2F2ZTsgKnA7IHArKyxuKyspIHsgLyogRmluZCBuZXh0IG1ldGEgY2hhciAqLworCQlpZiAoIXEpIHsKKwkJICAgIGlmICgqcCA9PSAnPycgfHwgKnAgPT0gJyonIHx8ICpwID09IENNRFEKKyNpZmRlZiBDS1JFR0VYCisJCQl8fCAqcCA9PSAnWycgfHwgKnAgPT0gJ3snCisjZW5kaWYgLyogQ0tSRUdFWCAqLworCQkJKQorCQkgICAgICBicmVhazsKKyNpZmRlZiBHTE9CQklORworCQkgICAgaWYgKGdsb2JiaW5nCisjaWZkZWYgVU5JWE9ST1NLCisJCQkmJiAqcCA9PSAnLycKKyNlbHNlCisjaWZkZWYgVk1TCisJCQkmJiAoKnAgPT0gJy4nIHx8ICpwID09ICddJyB8fAorCQkJICAgICpwID09ICc8JyB8fCAqcCA9PSAnPicgfHwKKwkJCSAgICAqcCA9PSAnOicgfHwgKnAgPT0gJzsnKQorI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorCQkJJiYgKnAgPT0gJzonCisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKwkJCSYmICpwID09ICc+JworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworCQkJKQorCQkgICAgICBicmVhazsKKyNlbmRpZiAvKiBHTE9CQklORyAqLworCQl9CisJICAgIH0KKwkgICAgZGVidWcoRjExMSwiQ0tNQVRDSCAqIG4gc3RyaW5nIixzdHJpbmcsbik7CisJICAgIGRlYnVnKEYxMTEsIkNLTUFUQ0ggKiBuIHBhdHRybiIscGF0dGVybixuKTsKKwkgICAgZGVidWcoRjExMSwiQ0tNQVRDSCAqIG4gcCIscCxuKTsKKwkgICAgaWYgKG4gPiAwKSB7CQkvKiBMaXRlcmFsIHN0cmluZyB0byBtYXRjaCAgKi8KKwkJcyA9IChjaGFyICopbWFsbG9jKG4rMSk7CisJCWlmIChzKSB7CisJCSAgICBja3N0cm5jcHkocyxwc2F2ZSxuKzEpOyAvKiBDb3B5IGN1eiBubyBwb2tpbmcgb3JpZ2luYWwgKi8KKwkJICAgIGlmICgqcCkgeworCQkJayA9IGNraW5kZXgocyxzdHJpbmcsMCwwLGljYXNlKTsgLyogMS1iYXNlZCBpbmRleCgpICovCisJCQlkZWJ1ZyhGMTEwLCJDS01BVENIICogSW5kZXgoKSBzdHJpbmciLHN0cmluZywwKTsKKwkJCWRlYnVnKEYxMTAsIkNLTUFUQ0ggKiBJbmRleCgpIHBhdHRybiIscywwKTsKKwkJCWRlYnVnKEYxMDEsIkNLTUFUQ0ggKiBJbmRleCgpIHJlc3VsdCIsIiIsayk7CisJCSAgICB9IGVsc2UgewkJLyogU3RyaW5nIGlzIHJpZ2h0LWFuY2hvcmVkICovCisJCQlrID0gY2tpbmRleChzLHN0cmluZywtMSwxLGljYXNlKTsgLyogcmluZGV4KCkgKi8KKwkJCWRlYnVnKEYxMTEsIkNLTUFUQ0ggKiBSaW5kZXgoKSIsc3RyaW5nLGspOworCQkJZGVidWcoRjExMCwiQ0tNQVRDSCAqIFJpbmRleCgpIHBhdHRybiIscywwKTsKKwkJCWRlYnVnKEYxMDEsIkNLTUFUQ0ggKiBSaW5kZXgoKSByZXN1bHQiLCIiLGspOworCQkgICAgfQorCQkgICAgZnJlZShzKTsKKwkJICAgIGlmIChrIDwgMSkgeworCQkJTUFUQ0hSRVRVUk4oOCwwKTsKKwkJICAgIH0KKwkJICAgIGRlYnVnKEYxMTEsIkNLTUFUQ0ggKiBzdHJpbmdwb3MgbWF0Y2hwb3MiLAorCQkJICBja2l0b2Eoc3RyaW5ncG9zKSwgbWF0Y2hwb3MpOworCQkgICAgaWYgKCFtYXRjaHBvcykgeworCQkJbWF0Y2hwb3MgPSBzdHJpbmcgLSBvc3RyaW5nICsgazsKKwkJCWRlYnVnKEYxMTEsIkNLTUFUQ0ggKiBuZXcgbWF0Y2ggIiwgc3RyaW5nLCBtYXRjaHBvcyk7CisJCSAgICB9CisJCSAgICBzdHJpbmcgKz0gayArIG4gLSAxOworCQkgICAgc3RyaW5ncG9zICs9IGsgKyBuIC0gMTsKKwkJICAgIHBhdHRlcm4gKz0gbjsKKwkJICAgIGRlYnVnKEYxMTEsIkNLTUFUQ0ggKiBuZXcgc3RyaW5nIiwgc3RyaW5nLCBzdHJpbmdwb3MpOworCQkgICAgZGVidWcoRjExMCwiQ0tNQVRDSCAqIG5ldyBwYXR0cm4iLCBwYXR0ZXJuLCAwKTsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJICAgIH0gZWxzZSBpZiAoISpwKSB7CQkvKiBBc3RlcmlzayBhdCBlbmQgbWF0Y2hlcyB0aGUgcmVzdCAqLworCQlpZiAoIWdsb2JiaW5nKSB7CS8qIChpZiBub3QgZmlsZW5hbWUgZ2xvYmJpbmcpICovCisJCSAgICBpZiAoIW1hdGNocG9zKSB7CisJCQltYXRjaHBvcyA9IHN0cmluZ3BvczsKKwkJCWRlYnVnKEYxMTEsIkNLTUFUQ0ggKiQgIixzdHJpbmcsIG1hdGNocG9zKTsKKwkJICAgIH0KKwkJICAgIG1hdGNoZW5kID0gc3RyaW5ncG9zOworCQkgICAgTUFUQ0hSRVRVUk4oOSxtYXRjaHBvcyk7CisJCX0KKyNpZmRlZiBHTE9CQklORworCQl3aGlsZSAoKnN0cmluZykgeworCQkgICAgaWYgKGdsb2JiaW5nCS8qIEZpbGVzcGVjIHNvIGRvbid0IGNyb3NzIGZpZWxkcyAqLworI2lmZGVmIE9TMgorCQkJJiYgKnN0cmluZyA9PSAnLycgfHwgKnN0cmluZyA9PSAnXFwnIHx8CisJCQkqc3RyaW5nID09ICc6JworI2Vsc2UKKyNpZmRlZiBVTklYT1JPU0sKKwkJCSYmICpzdHJpbmcgPT0gJy8nCisjZWxzZQorI2lmZGVmIFZNUworCQkJJiYgKCpzdHJpbmcgPT0gJy4nIHx8ICpzdHJpbmcgPT0gJ10nIHx8CisJCQkgICAgKnN0cmluZyA9PSAnPCcgfHwgKnN0cmluZyA9PSAnPicgfHwKKwkJCSAgICAqc3RyaW5nID09ICc6JyB8fCAqc3RyaW5nID09ICc7JykKKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKwkJCSYmICpzdHJpbmcgPT0gJzonCisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKwkJCSYmICpzdHJpbmcgPT0gJz4nCisjZWxzZQorCQkJJiYgKnN0cmluZyA9PSAnLycgLyogKGNhdGNoLWFsbCkgKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKwkJCSkgeworCQkJbWF0Y2hlbmQgPSBzdHJpbmdwb3M7CisJCQlNQVRDSFJFVFVSTigxMCwwKTsKKwkJICAgIH0KKwkJICAgIGlmICghbWF0Y2hwb3MpIHsKKwkJCW1hdGNocG9zID0gc3RyaW5ncG9zOworCQkJZGVidWcoRjExMSwiQ0tNQVRDSCAqJCBtYXRjaCIsc3RyaW5nLCBtYXRjaHBvcyk7CisJCSAgICB9CisJCSAgICBzdHJpbmcrKzsKKwkJICAgIHN0cmluZ3BvcysrOworCQl9CisjZW5kaWYgLyogR0xPQkJJTkcgKi8KKwkJaWYgKCFtYXRjaHBvcykgeworCQkgICAgbWF0Y2hwb3MgPSBzdHJpbmdwb3M7CisJCSAgICBkZWJ1ZyhGMTExLCJDS01BVENIICoqIG1hdGNoIixzdHJpbmcsIG1hdGNocG9zKTsKKwkJfQorCQltYXRjaGVuZCA9IHN0cmluZ3BvczsKKwkJTUFUQ0hSRVRVUk4oMTEsbWF0Y2hwb3MpOworCisJICAgIH0gZWxzZSB7CQkJLyogQSBtZXRhIGNoYXIgZm9sbG93cyBhc3RlcmlzayAqLworCQlpZiAoISpzdHJpbmcpCisJCSAgTUFUQ0hSRVRVUk4oMTcsIG1hdGNocG9zID0gMCk7CisJCXdoaWxlICgqc3RyaW5nICYmIChrID0gY2ttYXRjaChwLHN0cmluZyxpY2FzZSxvcHRzKSA8IDEpKSB7CisJCSAgICBzdHJpbmcrKzsKKwkJICAgIHN0cmluZ3BvcysrOworCQl9CisJCWRlYnVnKEYxMTEsIkNLTUFUQ0ggKjxtZXRhPiBrIixzdHJpbmcsIGspOworCQlpZiAoIW1hdGNocG9zICYmIGsgPiAwKSB7CisJCSAgICBtYXRjaHBvcyA9IHN0cmluZ3BvczsKKwkJICAgIGRlYnVnKEYxMTEsIkNLTUFUQ0ggKjxtZXRhPiIsc3RyaW5nLCBtYXRjaHBvcyk7CisJCX0KKwkJTUFUQ0hSRVRVUk4oMTIsICgqc3RyaW5nKSA/IG1hdGNocG9zIDogMCk7CisJICAgIH0KKwl9IGVsc2UgaWYgKGNzID09IGNwKSB7CisJICAgIHBhdHRlcm4rKywgc3RyaW5nKys7CisJICAgIHN0cmluZ3BvcysrOworCSAgICBpZiAoIW1hdGNocG9zKSB7CisJCW1hdGNocG9zID0gc3RyaW5ncG9zOworCQlkZWJ1ZyhGMTExLCJDS01BVENIIGNzPWNwIixzdHJpbmcsIG1hdGNocG9zKTsKKwkgICAgfQorCSAgICBjb250aW51ZTsKKwl9IGVsc2UgeworCSAgICBNQVRDSFJFVFVSTigxMywwKTsKKwl9CisgICAgfQorICB4Y2ttYXRjaDoKKyAgICB7CisjaWZkZWYgREVCVUcKKwljaGFyIG1zZ2J1Zls5Nl07CisjZW5kaWYgLyogREVCVUcgKi8KKwlpZiAobWF0Y2hkZXB0aCA+IDApCisJICBtYXRjaGRlcHRoLS07CisJbWF0Y2hwb3MgPSByYzsKKyNpZmRlZiBERUJVRworCWNrbWFreG1zZyhtc2didWYsOTYsCisJCSAgIkNLTUFUQ0ggUkVUVVJOWyIsCisJCSAgY2tpdG9hKHdoZXJlKSwKKwkJICAiXSBtYXRjaHBvcz0iLAorCQkgIGNraXRvYShtYXRjaHBvcyksCisJCSAgIiBtYXRjaGRlcHRoPSIsCisJCSAgY2tpdG9hKG1hdGNoZGVwdGgpLAorCQkgICIgc3RyaW5nPSIsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMCisJCSAgKTsKKwlkZWJ1ZyhGMTEwLG1zZ2J1ZixzdHJpbmcsMCk7CisjZW5kaWYgLyogREVCVUcgKi8KKwlyZXR1cm4ocmMpOworICAgIH0KK30KKworCisjaWZkZWYgQ0tGTE9BVAorLyogIEkgUyBGIEwgTyBBIFQgIC0tIFZlcmlmeSB0aGF0IGFyZyByZXByZXNlbnRzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyICovCisKKy8qCisgIFBvcnRhYmxlIHJlcGxhY2VtZW50IGZvciBhdG9mKCksIHN0cnRvZCgpLCBzY2FuZigpLCBldGMuCisKKyAgQ2FsbCB3aXRoOgorICAgIHMgPSBwb2ludGVyIHRvIHN0cmluZworICAgIGZsYWcgPT0gMCBtZWFucyBlbnRpcmUgc3RyaW5nIG11c3QgYmUgYSAoZmxvYXRpbmctcG9pbnRpbmcpIG51bWJlci4KKyAgICBmbGFnICE9IDAgbWVhbnMgdG8gdGVybWluYXRlIHNjYW4gb24gZmlyc3QgY2hhcmFjdGVyIHRoYXQgaXMgbm90IGxlZ2FsLgorCisgIFJldHVybnM6CisgICAgMSBpZiByZXN1bHQgaXMgYSBsZWdhbCBudW1iZXI7CisgICAgMiBpZiByZXN1bHQgaGFzIGEgZnJhY3Rpb25hbCBwYXJ0OworICAgIDAgaWYgbm90IG9yIGlmIHN0cmluZyBlbXB0eS4KKworICBTaWRlIGVmZmVjdDoKKyAgICBTZXRzIGdsb2JhbCBmbG9hdHZhbCB0byBmbG9hdGluZy1wb2ludCB2YWx1ZSBpZiBzdWNjZXNzZnVsLgorCisgIE51bWJlciBuZWVkIG5vdCBjb250YWluIGEgZGVjaW1hbCBwb2ludCAtLSBpbnRlZ2VyIGlzIHN1YmNhc2Ugb2YgZmxvYXQuCisgIFNjaWVudGlmaWMgbm90YXRpb24gbm90IHN1cHBvcnRlZC4KKyovCitDS0ZMT0FUIGZsb2F0dmFsID0gMC4wOwkJCS8qIEZvciByZXR1cm5pbmcgdmFsdWUgKi8KKworaW50Citpc2Zsb2F0KHMsZmxhZykgY2hhciAqczsgaW50IGZsYWc7IHsKKyAgICBpbnQgc3RhdGUgPSAwOworICAgIGludCBzaWduID0gMDsKKyAgICBjaGFyIGM7CisgICAgQ0tGTE9BVCBkID0gMC4wLCBmID0gMC4wOworCisgICAgaWYgKCFzKSByZXR1cm4oMCk7CisgICAgaWYgKCEqcykgcmV0dXJuKDApOworCisgICAgd2hpbGUgKGlzc3BhY2UoKnMpKSBzKys7CisKKyAgICBpZiAoKnMgPT0gJy0nKSB7CQkJLyogSGFuZGxlIG9wdGlvbmFsIHNpZ24gKi8KKwlzaWduID0gMTsKKwlzKys7CisgICAgfSBlbHNlIGlmICgqcyA9PSAnKycpCisgICAgICBzKys7CisgICAgd2hpbGUgKChjID0gKnMrKykpIHsJCS8qIEhhbmRsZSBudW1lcmljIHBhcnQgKi8KKwlzd2l0Y2ggKHN0YXRlKSB7CisJICBjYXNlIDA6CQkJLyogTWFudGlzc2EuLi4gKi8KKwkgICAgaWYgKGlzZGlnaXQoYykpIHsKKwkJZiA9IGYgKiAxMC4wICsgKENLRkxPQVQpKGMgLSAnMCcpOworCQljb250aW51ZTsKKwkgICAgfSBlbHNlIGlmIChjID09ICcuJykgeworCQlzdGF0ZSA9IDE7CisJCWQgPSAxLjA7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGlmIChmbGFnKQkJCS8qIE5vdCBkaWdpdCBvciBwZXJpb2QgKi8KKwkgICAgICBnb3RvIGRvbmU7CQkvKiBicmVhayBpZiBmbGFnICE9IDAgKi8KKwkgICAgcmV0dXJuKDApOwkJCS8qIG90aGVyd2lzZSBmYWlsLiAqLworCSAgY2FzZSAxOgkJCS8qIEZyYWN0aW9uLi4uICovCisJICAgIGlmIChpc2RpZ2l0KGMpKSB7CisJCWQgKj0gMTAuMDsKKwkJZiArPSAoQ0tGTE9BVCkoYyAtICcwJykgLyBkOworCQljb250aW51ZTsKKwkgICAgfQorCSAgZGVmYXVsdDoKKwkgICAgaWYgKGZsYWcpCQkJLyogSWxsZWdhbCBjaGFyYWN0ZXIgKi8KKwkgICAgICBnb3RvIGRvbmU7CQkvKiBCcmVhayAqLworCSAgICByZXR1cm4oMCk7CQkJLyogb3IgZmFpbCwgZGVwZW5kaW5nIG9uIGZsYWcgKi8KKwl9CisgICAgfQorICBkb25lOgorICAgIGlmIChzaWduKSBmID0gMC4wIC0gZjsJCS8qIEFwcGx5IHNpZ24gdG8gcmVzdWx0ICovCisgICAgZmxvYXR2YWwgPSBmOwkJCS8qIFNldCByZXN1bHQgKi8KKyAgICByZXR1cm4oZCA/IDIgOiAxKTsJCQkvKiBTdWNjZWVkICovCit9CisjZW5kaWYgLyogQ0tGTE9BVCAqLworCisvKiBTb3J0aW5nIHJvdXRpbmVzLi4uICovCisKKy8qIFMgSCBfIFMgTyBSIFQgIC0tICBTaGVsbCBzb3J0IC0tIHNvcnRzIHN0cmluZyBhcnJheSBzIGluIHBsYWNlLiAqLworCisvKgorICBIaWdobHkgZGVmZW5zaXZlIGFuZCByZWxhdGl2ZWx5IHF1aWNrLgorICBVc2VzIHNoZWxsIHNvcnQgYWxnb3JpdGhtLgorCisgIEFyZ3M6CisgICBzID0gcG9pbnRlciB0byBhcnJheSBvZiBzdHJpbmdzLgorICAgcCA9IHBvaW50ZXIgdG8gYSBzZWNvbmQgYXJyYXkgdG8gc29ydCBpbiBwYXJhbGxlbCBzLCBvciBOVUxMIGZvciBub25lLgorICAgbiA9IG51bWJlciBvZiBlbGVtZW50cyBpbiBzLgorICAgayA9IHBvc2l0aW9uIG9mIGtleS4KKyAgIHIgPSBhc2NlbmRpbmcgbGV4aWNhbCBvcmRlciBpZiB6ZXJvLCByZXZlcnNlIGxleGljYWwgb3JkZXIgaWYgbm9uemVyby4KKyAgIGMgPSAwIGZvciBjYXNlIGluZGVwZW5kZW5jZSwgMSBmb3IgY2FzZSBtYXR0ZXJzLCAyIGZvciBudW1lcmljLgorCisgIElmIGsgaXMgcGFzdCB0aGUgcmlnaHQgZW5kIG9mIGEgc3RyaW5nLCB0aGUgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZW1wdHkKKyAgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMuCisKKyAgSGludDoKKyAgIFRvIHNvcnQgYSBwaWVjZSBvZiBhbiBhcnJheSwgY2FsbCB3aXRoIHMgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQKKyAgIGFuZCBuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc29ydC4KKworICBSZXR1cm4gdmFsdWU6CisgICBOb25lLiAgQWx3YXlzIHN1Y2NlZWRzLCB1bmxlc3MgYW55IG9mIHNbMF0uLnNbbi0xXSBhcmUgYmFkIHBvaW50ZXJzLAorICAgaW4gd2hpY2ggY2FzZSBtZW1vcnkgdmlvbGF0aW9ucyBhcmUgcG9zc2libGUsIGJ1dCBDIG9mZmVycyBubyBkZWZlbnNlCisgICBhZ2FpbnN0IHRoaXMsIHNvIG5vIHdheSB0byBncmFjZWZ1bGx5IHJldHVybiBhbiBlcnJvciBjb2RlLgorKi8KK1ZPSUQKK3NoX3NvcnQocyxwLG4sayxyLGMpIGNoYXIgKipzLCAqKnA7IGludCBuLCBrLCByLCBjOyB7CisgICAgaW50IG0sIGksIGosIHg7CisgICAgY2hhciAqdCwgKnQxLCAqdDIsICp1ID0gTlVMTDsKKyNpZmRlZiBDS0ZMT0FUCisgICAgQ0tGTE9BVCBmMSwgZjI7CisjZWxzZQorICAgIGxvbmcgbjEsIG4yOworI2VuZGlmIC8qIENLRkxPQVQgKi8KKworICAgIGlmICghcykgcmV0dXJuOwkJCS8qIE5vdGhpbmcgdG8gc29ydD8gKi8KKyAgICBpZiAobiA8IDIpIHJldHVybjsJCQkvKiBOb3QgZW5vdWdoIGVsZW1lbnRzIHRvIHNvcnQ/ICovCisgICAgaWYgKGsgPCAwKSBrID0gMDsJCQkvKiBLZXkgKi8KKworICAgIG0gPSBuOwkJCQkvKiBJbml0aWFsIGdyb3VwIHNpemUgaXMgd2hvbGUgYXJyYXkgKi8KKyAgICB3aGlsZSAoMSkgeworCW0gPSBtIC8gMjsJCQkvKiBEaXZpZGUgZ3JvdXAgc2l6ZSBpbiBoYWxmICovCisJaWYgKG0gPCAxKQkJCS8qIFNtYWxsIGFzIGNhbiBiZSwgc28gZG9uZSAqLworCSAgYnJlYWs7CisJZm9yIChqID0gMDsgaiA8IG4tbTsgaisrKSB7CS8qIFNvcnQgZWFjaCBncm91cCAqLworCSAgICB0ID0gdDIgPSBzW2orbV07CQkvKiBDb21wYXJlIHRoaXMgb25lLi4uICovCisJICAgIGlmICghdCkJCQkvKiBCdXQgaWYgaXQncyBOVUxMICovCisJICAgICAgdDIgPSAiIjsJCQkvKiBtYWtlIGl0IHRoZSBlbXB0eSBzdHJpbmcgKi8KKwkgICAgaWYgKHApCQkJLyogSGFuZGxlIHBhcmFsbGVsIGFycmF5LCBpZiBhbnkgKi8KKwkgICAgICB1ID0gcFtqK21dOworCSAgICBpZiAoayA+IDAgJiYgKnQyKSB7CisJCWlmICgoaW50KXN0cmxlbih0MikgPCBrKSAvKiBJZiBrZXkgdG9vIGJpZyAqLworCQkgIHQyID0gIiI7CQkvKiBtYWtlIGtleSB0aGUgZW1wdHkgc3RyaW5nICovCisJCWVsc2UJCQkvKiBLZXkgaXMgaW4gc3RyaW5nICovCisJCSAgdDIgPSB0ICsgazsJCS8qIHNvIHBvaW50IHRvIGtleSBwb3NpdGlvbiAqLworCSAgICB9CisJICAgIGZvciAoaSA9IGo7IGkgPj0gMDsgaSAtPSBtKSB7IC8qIExvb3AgdGhydSBjb21wYXJhbmRzIHNbaS4uXSovCisJCXQxID0gc1tpXTsKKwkJaWYgKCF0MSkJCS8qIFNhbWUgZGVhbCAqLworCQkgIHQxID0gIiI7CisJCWlmIChrID4gMCAmJiAqdDEpIHsKKwkJICAgIGlmICgoaW50KXN0cmxlbih0MSkgPCBrKQorCQkgICAgICB0MSA9ICIiOworCQkgICAgZWxzZQorCQkgICAgICB0MSA9IHNbaV0razsKKwkJfQorCQlpZiAoYyA9PSAyKSB7CQkvKiBOdW1lcmljIGNvbXBhcmlzb24gKi8KKwkJICAgIHggPSAwOworI2lmZGVmIENLRkxPQVQKKwkJICAgIGYyID0gMC4wOworCQkgICAgZjEgPSAwLjA7CisJCSAgICBpZiAoaXNmbG9hdCh0MSwxKSkgeworCQkJZjEgPSBmbG9hdHZhbDsKKwkJCWlmIChpc2Zsb2F0KHQyLDEpKQorCQkJICBmMiA9IGZsb2F0dmFsOworCQkJZWxzZQorCQkJICBmMSA9IDAuMDsKKwkJICAgIH0KKwkJICAgIGlmIChmMiA8IGYxKQorCQkgICAgICB4ID0gMTsKKwkJICAgIGVsc2UKKwkJICAgICAgeCA9IC0xOworI2Vsc2UKKwkJICAgIG4yID0gMEw7CisJCSAgICBuMSA9IDBMOworCQkgICAgaWYgKHJkaWdpdHModDEpKSB7CisJCQluMSA9IGF0b2wodDEpOworCQkJaWYgKHJkaWdpdHModDIpKQorCQkJICBuMiA9IGF0b2wodDIpOworCQkJZWxzZQorCQkJICBuMSA9IDBMOworCQkgICAgfQorCQkgICAgaWYgKG4yIDwgbjEpCisJCSAgICAgIHggPSAxOworCQkgICAgZWxzZQorCQkgICAgICB4ID0gLTE7CisjZW5kaWYgLyogQ0tGTE9BVCAqLworCQl9IGVsc2UgeworCQkgICAgeCA9IGNrc3RyY21wKHQxLHQyLC0xLGMpOyAvKiBDb21wYXJlICovCisJCX0KKwkJaWYgKHIgPT0gMCAmJiB4IDwgMCkKKwkJICBicmVhazsKKwkJaWYgKHIgIT0gMCAmJiB4ID4gMCkKKwkJICBicmVhazsKKwkJc1tpK21dID0gc1tpXTsKKwkJaWYgKHApIHBbaSttXSA9IHBbaV07CisJICAgIH0KKwkgICAgc1tpK21dID0gdDsKKwkgICAgaWYgKHApIHBbaSttXSA9IHU7CisJfQorICAgIH0KK30KKworCisvKiBDIEsgUiBBIEQgSSBYICAtLSAgUmFkaXggY29udmVydGVyICovCisvKgorICAgQ2FsbCB3aXRoOgorICAgICBzOiAgIGEgbnVtYmVyIGluIHN0cmluZyBmb3JtYXQuCisgICAgIGluOiAgaW50LCBzcGVjaWZ5aW5nIHRoZSByYWRpeCBvZiBzLCAyLTM2LgorICAgICBvdXQ6IGludCwgc3BlY2lmeWluZyB0aGUgcmFkaXggdG8gY29udmVydCB0bywgMi0zNi4KKyAgIFJldHVybnM6CisgICAgIE5VTEwgb24gZXJyb3IgKGlsbGVnYWwgcmFkaXgsIGlsbGVnYWwgbnVtYmVyLCBldGMuKS4KKyAgICAgIi0xIiBvbiBvdmVyZmxvdyAobnVtYmVyIHRvbyBiaWcgZm9yIHVuc2lnbmVkIGxvbmcpLgorICAgICBPdGhlcndpc2U6IFBvaW50ZXIgdG8gcmVzdWx0LgorKi8KK2NoYXIgKgorY2tyYWRpeChzLGluLG91dCkgY2hhciAqIHM7IGludCBpbiwgb3V0OyB7CisgICAgY2hhciBjLCAqciA9IHJ4cmVzdWx0OworICAgIGludCBkLCBtaW51cyA9IDA7CisgICAgdW5zaWduZWQgbG9uZyB6eiA9IDBMOworICAgIGxvbmcgeiA9IDBMOworICAgIGlmIChpbiA8IDIgfHwgaW4gPiAzNikJCS8qIFZlcmlmeSBsZWdhbCBpbnB1dCByYWRpeCAqLworICAgICAgcmV0dXJuKE5VTEwpOworICAgIGlmIChvdXQgPCAyIHx8IG91dCA+IDM2KQkJLyogYW5kIG91dHB1dCByYWRpeC4gKi8KKyAgICAgIHJldHVybihOVUxMKTsKKyAgICBpZiAoKnMgPT0gJysnKSB7CQkJLyogR2V0IHNpZ24gaWYgYW55ICovCisJcysrOworICAgIH0gZWxzZSBpZiAoKnMgPT0gJy0nKSB7CisJbWludXMrKzsKKwlzKys7CisgICAgfQorICAgIHdoaWxlICgqcyA9PSBTUCB8fCAqcyA9PSAnMCcpCS8qIFRyaW0gbGVhZGluZyBibGFua3Mgb3IgMCdzICovCisgICAgICBzKys7CisvKgorICBGb3IgZGV0ZWN0aW5nIG92ZXJmbG93LCB3ZSB1c2UgYSBzaWduZWQgY29weSBvZiB0aGUgdW5zaWduZWQgbG9uZworICBhY2N1bXVsYXRvci4gIElmIGl0IGdvZXMgbmVnYXRpdmUsIHdlIGtub3cgd2UnbGwgb3ZlcmZsb3cgTkVYVCB0aW1lCisgIHRocm91Z2ggdGhlIGxvb3AuCisqLworICAgIGZvciAoOyAqczsgIHMrKykgewkJCS8qIENvbnZlcnQgZnJvbSBpbnB1dCByYWRpeCB0byAqLworCWMgPSAqczsJCQkJLyogdW5zaWduZWQgbG9uZyAqLworCWlmIChpc2xvd2VyKGMpKSBjID0gdG91cHBlcihjKTsKKwlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJICBkID0gYyAtICcwJzsKKwllbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKKwkgIGQgPSBjIC0gJ0EnICsgMTA7CisJZWxzZQorCSAgcmV0dXJuKE5VTEwpOworCWlmIChkID49IGluKQkJCS8qIENoZWNrIGZvciBpbGxlZ2FsIGRpZ2l0ICovCisJICByZXR1cm4oTlVMTCk7CisJenogPSB6eiAqIGluICsgZDsKKwlpZiAoeiA8IDBMKQkJCS8qIENsZXZlcig/KSBvdmVyZmxvdyBkZXRlY3RvciAqLworCSAgcmV0dXJuKCItMSIpOworICAgICAgICB6ID0geno7CisgICAgfQorICAgIGlmICghenopIHJldHVybigiMCIpOworICAgIHIgPSAmcnhyZXN1bHRbUlhSRVNVTFRdOwkJLyogQ29udmVydCBmcm9tIHVuc2lnbmVkIGxvbmcgKi8KKyAgICAqci0tID0gTlVMOwkJCQkvKiB0byBvdXRwdXQgcmFkaXguICovCisgICAgd2hpbGUgKHp6ID4gMCAmJiByID4gcnhyZXN1bHQpIHsKKwlkID0genogJSAodW5zaWduZWQpb3V0OworCSpyLS0gPSByeGRpZ2l0c1tkXTsKKwl6eiA9IHp6IC8gKHVuc2lnbmVkKW91dDsKKyAgICB9CisgICAgaWYgKG1pbnVzKSAqci0tID0gJy0nOwkJLyogUmVwbGFjZSBvcmlnaW5hbCBzaWduICovCisgICAgcmV0dXJuKChjaGFyICopKHIrMSkpOworfQorCisjaWZuZGVmIE5PQjY0CisvKiBCYXNlLTY0IGNvbnZlcnNpb24gcm91dGluZXMgKi8KKworc3RhdGljIGNoYXIgYjY0W10gPSB7CQkJLyogRW5jb2RpbmcgdmVjdG9yICovCisjaWZkZWYgcGRwMTEKKyAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IgorI2Vsc2UKKyAgJ0EnLCdCJywnQycsJ0QnLCdFJywnRicsJ0cnLCdIJywnSScsJ0onLCdLJywnTCcsJ00nLCdOJywnTycsJ1AnLCdRJywnUicsJ1MnLAorICAnVCcsJ1UnLCdWJywnVycsJ1gnLCdZJywnWicsJ2EnLCdiJywnYycsJ2QnLCdlJywnZicsJ2cnLCdoJywnaScsJ2onLCdrJywnbCcsCisgICdtJywnbicsJ28nLCdwJywncScsJ3InLCdzJywndCcsJ3UnLCd2JywndycsJ3gnLCd5JywneicsJzAnLCcxJywnMicsJzMnLCc0JywKKyAgJzUnLCc2JywnNycsJzgnLCc5JywnKycsJy8nLCc9JywnXDAnCisjZW5kaWYgLyogcGRwMTEgKi8KK307CitzdGF0aWMgaW50IGI2NHRibFtdID0gewkJCS8qIERlY29kaW5nIHZlY3RvciAqLworICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLAorICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLAorICAgIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNjIsIC0xLCAtMSwgLTEsIDYzLAorICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCAtMSwgLTEsIC0xLCAtMiwgLTEsIC0xLAorICAgIC0xLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LAorICAgIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLAorICAgIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xCit9OworCisvKgorICAgQiA4IFQgTyBCIDYgNCAgLS0gIENvbnZlcnRzIDgtYml0IGRhdGEgdG8gQmFzZTY0IGVuY29kaW5nLgorCisgICBDYWxsIHdpdGg6CisgICAgIHMgICA9IFBvaW50ZXIgdG8gOC1iaXQgZGF0YTsKKyAgICAgbiAgID0gTnVtYmVyIG9mIHNvdXJjZSBieXRlcyB0byBlbmNvZGUgKFNFRSBOT1RFKS4KKyAgICAgICAgICAgSWYgaXQncyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcsIHlvdSBjYW4gdXNlIC0xIGhlcmUuCisgICAgIG91dCA9IEFkZHJlc3Mgb2Ygb3V0cHV0IGJ1ZmZlci4KKyAgICAgbGVuID0gTGVuZ3RoIG9mIG91dHB1dCBidWZmZXIgKHNob3VsZCA+IDQvMyBsb25nZXIgdGhhbiBpbnB1dCkuCisKKyAgIFJldHVybnM6CisgICAgID49IDAgaWYgT0ssIG51bWJlciBvZiBieXRlcyBwbGFjZWQgaW4gb3V0cHV0IGJ1ZmZlciwKKyAgICAgICAgICB3aXRoIHRoZSBzdWJzZXF1ZW50IGJ5dGUgc2V0IHRvIE5VTCBpZiBzcGFjZSBwZXJtaXRzLgorICAgICAtMSBvbiBlcnJvciAob3V0cHV0IGJ1ZmZlciBzcGFjZSBleGhhdXN0ZWQpLgorCisgICBOT1RFOgorICAgICBJZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGJlIGNhbGxlZCByZXBlYXRlZGx5LCBlLmcuIHRvIGVuY29kZSBhIGRhdGEKKyAgICAgc3RyZWFtIGEgY2h1bmsgYXQgYSB0aW1lLCB0aGUgc291cmNlIGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMworICAgICBpbiBhbGwgY2FsbHMgYnV0IHRoZSBmaW5hbCBvbmUgdG8gYXZvaWQgdGhlIGdlbmVyYXRpb24gb2YgZXh0cmFuZW91cworICAgICBwYWQgY2hhcmFjdGVycyB0aGF0IHdvdWxkIHRocm93IHRoZSBkZWNvZGVyIG91dCBvZiBzeW5jLiAgV2hlbiBlbmNvZGluZworICAgICBvbmx5IGEgc2luZ2xlIHN0cmluZywgdGhpcyBpcyBub3QgYSBjb25zaWRlcmF0aW9uLiAgTm8gaW50ZXJuYWwgc3RhdGUKKyAgICAgaXMga2VwdCwgc28gdGhlcmUgaXMgbm8gcmVzZXQgZnVuY3Rpb24uCisqLworaW50CitiOHRvYjY0KHMsbixvdXQsbGVuKSBjaGFyICogcywqIG91dDsgaW50IG4sIGxlbjsgeworICAgIGludCBiMywgYjQsIGksIHggPSAwOworICAgIHVuc2lnbmVkIGludCB0OworCisgICAgaWYgKG4gPCAwKSBuID0gc3RybGVuKHMpOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkgKz0gMyx4ICs9IDQpIHsgLyogTG9vcCB0aHJvdWdoIHNvdXJjZSBieXRlcyAqLworCWIzID0gYjQgPSAwOworCXQgPSAodW5zaWduZWQpKCh1bnNpZ25lZCkoKHVuc2lnbmVkIGludClzW2ldICYgMHhmZikgPDwgOCk7CisJaWYgKG4gLSAxID4gaSkgewkJLyogRG8gd2UgaGF2ZSBhbm90aGVyIGFmdGVyIHRoaXM/ICovCisgICAgICAgICAgICB0IHw9ICh1bnNpZ25lZCkoc1tpKzFdICYgMHhmZik7IC8qIFllcywgT1IgaXQgaW4gKi8KKyAgICAgICAgICAgIGIzID0gMTsJCQkvKiBBbmQgcmVtZW1iZXIgKi8KKyAgICAgICAgfQorICAgICAgICB0IDw8PSA4OwkJCS8qIE1vdmUgb3ZlciAqLworICAgICAgICBpZiAobiAtIDIgPiBpKSB7CQkvKiBBbm90aGVyIG9uZSBhZnRlciB0aGF0PyAqLworICAgICAgICAgICAgdCB8PSAodW5zaWduZWQpKHNbaSsyXSAmIDB4ZmYpOyAvKiBZZXMsIE9SIGl0IGluICovCisgICAgICAgICAgICBiNCA9IDE7CQkJLyogYW5kIHJlbWVtYmVyICovCisgICAgICAgIH0KKwlpZiAoeCArIDQgPiBsZW4pCQkvKiBDaGVjayBvdXRwdXQgc3BhY2UgKi8KKwkgIHJldHVybigtMSk7CisJb3V0W3grM10gPSBiNjRbYjQgPyAodCAmIDB4M2YpIDogNjRdOyAvKiA2NCA9IGNvZGUgZm9yICc9JyAqLworICAgICAgICB0ID4+PSA2OworICAgICAgICBvdXRbeCsyXSA9IGI2NFtiMyA/ICh0ICYgMHgzZikgOiA2NF07CisgICAgICAgIHQgPj49IDY7CisgICAgICAgIG91dFt4KzFdID0gYjY0W3QgJiAweDNmXTsKKyAgICAgICAgdCA+Pj0gNjsKKyAgICAgICAgb3V0W3hdICAgPSBiNjRbdCAmIDB4M2ZdOworICAgIH0KKyAgICBpZiAoeCA8IGxlbikgb3V0W3hdID0gTlVMOwkJLyogTnVsbC10ZXJtaW5hdGUgdGhlIHN0cmluZyAqLworICAgIHJldHVybih4KTsKK30KKworCisvKgorICAgQiA2IDQgVCBPIEIgOCAgLS0gIENvbnZlcnRzIEJhc2U2NCBzdHJpbmcgdG8gOC1iaXQgZGF0YS4KKworICAgQ2FsbCB3aXRoOgorICAgICBzICAgPSBwb2ludGVyIHRvIEJhc2U2NCBzdHJpbmcgKHdoaXRlc3BhY2UgaWdub3JlZCkuCisgICAgIG4gICA9IGxlbmd0aCBvZiBzdHJpbmcsIG9yIC0xIGlmIG51bGwgdGVybWluYXRlZCwgb3IgMCB0byByZXNldC4KKyAgICAgb3V0ID0gYWRkcmVzcyBvZiBvdXRwdXQgYnVmZmVyLgorICAgICBsZW4gPSBsZW5ndGggb2Ygb3V0cHV0IGJ1ZmZlci4KKworICAgUmV0dXJuczoKKyAgICAgPj0gMCBpZiBPSywgbnVtYmVyIG9mIGJ5dGVzIHBsYWNlZCBpbiBvdXRwdXQgYnVmZmVyLAorICAgICAgICAgIHdpdGggdGhlIHN1YnNlcXVlbnQgYnl0ZSBzZXQgdG8gTlVMIGlmIHNwYWNlIHBlcm1pdHMuCisgICAgIDwgIDAgb24gZXJyb3I6CisgICAgICAgLTEgPSBvdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCBmb3IgaW5wdXQuCisgICAgICAgLTIgPSBpbnB1dCBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMuCisgICAgICAgLTMgPSBpbnRlcm5hbCBjb2RpbmcgZXJyb3IuCisKKyAgIE5PVEU6CisgICAgIENhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSB0byBkZWNvZGUgYSBCYXNlNjQgc3RyZWFtLCBvbmUgY2h1bmsgYXQgYQorICAgICB0aW1lLiAgSG93ZXZlciwgaWYgaXQgaXMgdG8gYmUgY2FsbGVkIGZvciBtdWx0aXBsZSBzdHJlYW1zIGluCisgICAgIHN1Y2Nlc3Npb24sIGl0cyBpbnRlcm5hbCBzdGF0ZSBtdXN0IGJlIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgICAgdGhlIG5ldyBzdHJlYW0uCisqLworaW50CitiNjR0b2I4KHMsbixvdXQsbGVuKSBjaGFyICogcywqIG91dDsgaW50IG4sIGxlbjsgeyAvKiBEZWNvZGUgKi8KKyAgICBzdGF0aWMgaW50IGJpdHMgPSAwOworICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgciA9IDA7CisgICAgaW50IGksIGsgPSAwLCB4LCB0OworICAgIHVuc2lnbmVkIGNoYXIgYzsKKworICAgIGlmIChuID09IDApIHsJCQkvKiBSZXNldCBzdGF0ZSAqLworCWJpdHMgPSAwOworCXIgPSAwOworCXJldHVybigwKTsKKyAgICB9CisgICAgeCA9IChuIDwgMCkgPyBzdHJsZW4ocykgOiBuOwkvKiBTb3VyY2UgbGVuZ3RoICovCisKKyAgICBuID0gKCh4ICsgMykgLyA0KSAqIDM7CQkvKiBDb21wdXRlIGRlc3RpbmF0aW9uIGxlbmd0aCAqLworICAgIGlmICh4ID4gMCAmJiBzW3gtMV0gPT0gJz0nKSBuLS07CS8qIEFjY291bnQgZm9yIHBhZGRpbmcgKi8KKyAgICBpZiAoeCA+IDEgJiYgc1t4LTJdID09ICc9Jykgbi0tOworICAgIGlmIChuID4gbGVuKQkJCS8qIERlc3RpbmF0aW9uIG5vdCBiaWcgZW5vdWdoICovCisgICAgICByZXR1cm4oLTEpOwkJCS8qIEZhaWwgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCB4OyBpKyspIHsJCS8qIExvb3AgdGhydSBzb3VyY2UgKi8KKwljID0gKENIQVIpc1tpXTsJCQkvKiBOZXh0IGNoYXIgKi8KKyAgICAgICAgdCA9IGI2NHRibFtjXTsJCQkvKiBDb2RlIGZvciB0aGlzIGNoYXIgKi8KKwlpZiAodCA9PSAtMikgewkJCS8qIFdoaXRlc3BhY2Ugb3IgQ3RybCAqLworCSAgICBuLS07CQkJLyogSWdub3JlICovCisJICAgIGNvbnRpbnVlOworCX0gZWxzZSBpZiAodCA9PSAtMSkgewkJLyogSWxsZWdhbCBjb2RlICovCisJICAgIHJldHVybigtMik7CQkJLyogRmFpbC4gKi8KKwl9IGVsc2UgaWYgKHQgPiA2MyB8fCB0IDwgMCkJLyogSWxsZWdhbCB2YWx1ZSAqLworCSAgcmV0dXJuKC0zKTsJCQkvKiBmYWlsLiAqLworCWJpdHMgKz0gNjsJCQkvKiBDb3VudCBiaXRzICovCisJciA8PD0gNjsJCQkvKiBNYWtlIHNwYWNlICovCisJciB8PSAodW5zaWduZWQpIHQ7CQkvKiBPUiBpbiBuZXcgY29kZSAqLworCWlmIChiaXRzID49IDgpIHsJCS8qIEhhdmUgYSBieXRlIHlldD8gKi8KKwkgICAgYml0cyAtPSA4OwkJCS8qIE91dHB1dCBpdCAqLworCSAgICBjID0gKHVuc2lnbmVkKSAoKHIgPj4gYml0cykgJiAweGZmKTsKKwkgICAgb3V0W2srK10gPSBjOworCX0KKyAgICB9CisgICAgaWYgKGsgPCBsZW4pIG91dFtrXSA9IE5VTDsJCS8qIE51bGwtdGVybWluYXRlIGluIGNhc2UgaXQncyAqLworICAgIHJldHVybihrKTsJCQkJLyogYSB0ZXh0IHN0cmluZyAqLworfQorI2VuZGlmIC8qIE5PQjY0ICovCisKKy8qIEMgSCBLIE4gVSBNICAtLSAgU2VlIGlmIGFyZ3VtZW50IHN0cmluZyBpcyBhbiBpbnRlZ2VyICAqLworCisvKiBSZXR1cm5zIDEgaWYgT0ssIHplcm8gaWYgbm90IE9LICovCisvKiBJZiBPSywgc3RyaW5nIHNob3VsZCBiZSBhY2NlcHRhYmxlIHRvIGF0b2koKSAqLworLyogQWxsb3dzIGxlYWRpbmcgc3BhY2UsIHNpZ24gKi8KKworaW50CitjaGtudW0ocykgY2hhciAqczsgewkJCS8qIENoZWNrIE51bWVyaWMgU3RyaW5nICovCisgICAgaW50IHggPSAwOwkJCQkvKiBGbGFnIGZvciBwYXN0IGxlYWRpbmcgc3BhY2UgKi8KKyAgICBpbnQgeSA9IDA7CQkJCS8qIEZsYWcgZm9yIGRpZ2l0IHNlZW4gKi8KKyAgICBjaGFyIGM7CisgICAgZGVidWcoRjExMCwiY2hrbnVtIixzLDApOworICAgIGlmICghcykgcmV0dXJuKDApOworICAgIGlmICghKnMpIHJldHVybigwKTsKKyAgICB3aGlsZSAoKGMgPSAqcysrKSkgewkJLyogRm9yIGVhY2ggY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgKi8KKwlzd2l0Y2ggKGMpIHsKKwkgIGNhc2UgU1A6CQkJLyogQWxsb3cgbGVhZGluZyBzcGFjZXMgKi8KKwkgIGNhc2UgSFQ6CisJICAgIGlmICh4ID09IDApIGNvbnRpbnVlOworCSAgICBlbHNlIHJldHVybigwKTsKKwkgIGNhc2UgJysnOgkJCS8qIEFsbG93IGxlYWRpbmcgc2lnbiAqLworCSAgY2FzZSAnLSc6CisJICAgIGlmICh4ID09IDApIHggPSAxOworCSAgICBlbHNlIHJldHVybigwKTsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgkJCS8qIEFmdGVyIHRoYXQsIG9ubHkgZGVjaW1hbCBkaWdpdHMgKi8KKwkgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisJCXggPSB5ID0gMTsKKwkJY29udGludWU7CisJICAgIH0gZWxzZSByZXR1cm4oMCk7CisJfQorICAgIH0KKyAgICByZXR1cm4oeSk7Cit9CisKKworLyogIFIgRCBJIEcgSSBUIFMgIC0tIFZlcmlmeSB0aGF0IGFsbCBjaGFyYWN0ZXJzIGluIGFyZyBBUkUgRElHSVRTICAqLworCisvKiAgUmV0dXJucyAxIGlmIHNvLCAwIGlmIG5vdCBvciBpZiBzdHJpbmcgaXMgZW1wdHkgKi8KKworaW50CityZGlnaXRzKHMpIGNoYXIgKnM7IHsKKyAgICBpZiAoIXMpIHJldHVybigwKTsKKyAgICBkbyB7CisgICAgICAgIGlmICghaXNkaWdpdCgqcykpIHJldHVybigwKTsKKyAgICAgICAgcysrOworICAgIH0gd2hpbGUgKCpzKTsKKyAgICByZXR1cm4oMSk7Cit9CisKKy8qICBQIEEgUiBOIEEgTSAgLS0gIFJldHVybiBwYXJpdHkgbmFtZSAqLworCitjaGFyICoKKyNpZmRlZiBDS19BTlNJQworcGFybmFtKGNoYXIgYykKKyNlbHNlCitwYXJuYW0oYykgY2hhciBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBwYXJuYW0gKi8geworICAgIHN3aXRjaCAoYykgeworCWNhc2UgJ2UnOiByZXR1cm4oImV2ZW4iKTsKKwljYXNlICdvJzogcmV0dXJuKCJvZGQiKTsKKwljYXNlICdtJzogcmV0dXJuKCJtYXJrIik7CisJY2FzZSAncyc6IHJldHVybigic3BhY2UiKTsKKwljYXNlIDA6ICAgcmV0dXJuKCJub25lIik7CisJZGVmYXVsdDogIHJldHVybigiaW52YWxpZCIpOworICAgIH0KK30KKworY2hhciAqCQkJCQkvKiBDb252ZXJ0IHNlY29uZHMgdG8gaGg6bW06c3MgKi8KKyNpZmRlZiBDS19BTlNJQworaGhtbXNzKGxvbmcgeCkKKyNlbHNlCitoaG1tc3MoeCkgbG9uZyB4OworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBoaG1tc3MoeCkgKi8geworICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMF07CisgICAgbG9uZyBzLCBoLCBtOworICAgIGggPSB4IC8gMzYwMEw7CQkJLyogSG91cnMgKi8KKyAgICB4ID0geCAlIDM2MDBMOworICAgIG0gPSB4IC8gNjBMOwkJCS8qIE1pbnV0ZXMgKi8KKyAgICBzID0geCAlIDYwTDsJCQkvKiBTZWNvbmRzICovCisgICAgaWYgKHggPiAtMUwpCisgICAgICBzcHJpbnRmKGJ1ZiwiJTAybGQ6JTAybGQ6JTAybGQiLGgsbSxzKTsKKyAgICBlbHNlCisgICAgICBidWZbMF0gPSBOVUw7CisgICAgcmV0dXJuKChjaGFyICopYnVmKTsKK30KKworLyogTCBTIEUgVCAgLS0gIFNldCBzIGludG8gcCwgcmlnaHQgcGFkZGluZyB0byBsZW5ndGggbiB3aXRoIGNoYXIgYzsgKi8KKy8qCisgICBzIGlzIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLgorICAgSWYgbGVuZ3RoKHMpID4gbiwgb25seSBuIGJ5dGVzIGFyZSBtb3ZlZC4KKyAgIFRoZSByZXN1bHQgaXMgTk9UIE5VTCB0ZXJtaW5hdGVkIHVubGVzcyBjID09IE5VTCBhbmQgbGVuZ3RoKHMpIDwgbi4KKyAgIFRoZSBpbnRlbmRlZCBvZiB0aGlzIHJvdXRpbmUgaXMgZm9yIGZpbGxpbmcgaW4gZml4ZWQtbGVuZ3RoIHJlY29yZCBmaWVsZHMuCisqLworVk9JRAorbHNldChwLHMsbixjKSBjaGFyICpzOyBjaGFyICpwOyBpbnQgbjsgaW50IGM7IHsKKyAgICBpbnQgeDsKKyNpZm5kZWYgVVNFX01FTUNQWQorICAgIGludCBpOworI2VuZGlmIC8qIFVTRV9NRU1DUFkgKi8KKyAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICB4ID0gc3RybGVuKHMpOworICAgIGlmICh4ID4gbikgeCA9IG47CisjaWZkZWYgVVNFX01FTUNQWQorICAgIG1lbWNweShwLHMseCk7CisgICAgaWYgKG4gPiB4KQorICAgICAgbWVtc2V0KHAreCxjLG4teCk7CisjZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCB4OyBpKyspCisgICAgICAqcCsrID0gKnMrKzsKKyAgICBmb3IgKDsgaSA8IG47IGkrKykKKyAgICAgICpwKysgPSBjOworI2VuZGlmIC8qIFVTRV9NRU1DUFkgKi8KK30KKworLyogUiBTIEUgVCAgLS0gIFJpZ2h0LWFkanVzdCBzIGluIHAsIGxlZnQgcGFkZGluZyB0byBsZW5ndGggbiB3aXRoIGNoYXIgYyAqLworCitWT0lECityc2V0KHAscyxuLGMpIGNoYXIgKnM7IGNoYXIgKnA7IGludCBuOyBpbnQgYzsgeworICAgIGludCB4OworI2lmbmRlZiBVU0VfTUVNQ1BZCisgICAgaW50IGk7CisjZW5kaWYgLyogVVNFX01FTUNQWSAqLworICAgIGlmICghcykgcyA9ICIiOworICAgIHggPSBzdHJsZW4ocyk7CisgICAgaWYgKHggPiBuKSB4ID0gbjsKKyNpZmRlZiBVU0VfTUVNQ1BZCisgICAgbWVtc2V0KHAsYyxuLXgpOworICAgIG1lbWNweShwK24teCxzLHgpOworI2Vsc2UKKyAgICBmb3IgKGkgPSAwOyBpIDwgKG4gLSB4KTsgaSsrKQorICAgICAgKnArKyA9IGM7CisgICAgZm9yICg7IGkgPCBuOyBpKyspCisgICAgICAqcCsrID0gKnMrKzsKKyNlbmRpZiAvKiBVU0VfTUVNQ1BZICovCit9CisKKy8qICBVIEwgTyBOIEcgVCBPIEggRSBYICAtLSAgVW5zaWduZWQgbG9uZyB0byBoZXggICovCisKKy8qCisgIENvbnZlcnRzIHVuc2lnbmVkIGxvbmcgYXJnIHRvIGhleCBhbmQgcmV0dXJucyBzdHJpbmcgcG9pbnRlciB0bworICByaWdodG1vc3QgbiBoZXggZGlnaXRzIGxlZnQgcGFkZGVkIHdpdGggMCdzLiAgQWxsb3dzIGZvciBsb25ncworICB1cCB0byA2NCBiaXRzLiAgUmV0dXJucyBwb2ludGVyIHRvIHJlc3VsdC4KKyovCitjaGFyICoKKyNpZmRlZiBDS19BTlNJQwordWxvbmd0b2hleCggdW5zaWduZWQgbG9uZyB6LCBpbnQgbiApCisjZWxzZQordWxvbmd0b2hleCh6LG4pIHVuc2lnbmVkIGxvbmcgejsgaW50IG47IAorI2VuZGlmCS8qIENLX0FOU0lDICovCisvKiB1bG9uZ3RvaGV4ICovIHsKKyAgICBzdGF0aWMgY2hhciBoZXhidWZbMTddOworICAgIGludCBpID0gMTYsIHgsIGsgPSAwOworICAgIGhleGJ1ZlsxNl0gPSAnXDAnOworICAgIGlmIChuID4gMTYpIG4gPSAxNjsKKyAgICBrID0gMiAqIChzaXplb2YobG9uZykpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwlpZiAoaSA+IGsgfHwgeiA9PSAwKSB7CisJICAgIGhleGJ1ZlsxNS1pXSA9ICcwJzsKKwl9IGVsc2UgeworCSAgICB4ID0geiAmIDB4MGY7CisJICAgIHogPSB6ID4+IDQ7CisJICAgIGhleGJ1ZlsxNS1pXSA9IHggKyAoKHggPCAxMCkgPyAnMCcgOiAweDM3KTsKKwl9CisgICAgfQorICAgIHJldHVybigoY2hhciAqKSgmaGV4YnVmWzE2LWldKSk7Cit9CisKKy8qICBIIEUgWCBUIE8gVSBMIE8gTiBHICAtLSAgSGV4IHN0cmluZyB0byB1bnNpZ25lZCBsb25nICAqLworCisvKgorICBDb252ZXJ0cyBuIGNoYXJzIGZyb20gcyBmcm9tIGhleCB0byB1bnNpZ25lZCBsb25nLgorICBSZXR1cm5zOgorICAgMEwgb3IgcG9zaXRpdmUsIGdvb2QgcmVzdWx0ICgwTCBpcyByZXR1cm5lZCBpZiBhcmcgaXMgTlVMTCBvciBlbXB0eSkuCisgIC0xTCBvbiBlcnJvcjogbm9uLWhleCBhcmcgb3Igb3ZlcmZsb3cuCisqLworbG9uZworaGV4dG91bG9uZyhzLG4pIGNoYXIgKnM7IGludCBuOyB7CisgICAgY2hhciBidWZbNjRdOworICAgIHVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMEw7CisgICAgaW50IGQsIGNvdW50ID0gMDsKKyAgICBpbnQgZmxhZyA9IDA7CisgICAgaWYgKCFzKSBzID0gIiI7CisgICAgaWYgKCEqcykgeworCXJldHVybigwTCk7CisgICAgfQorICAgIGlmIChuIDwgMSkKKyAgICAgIHJldHVybigwTCk7CisgICAgaWYgKG4gPiA2MykgbiA9IDYzOworICAgIHN0cm5jcHkoYnVmLHMsbik7CisgICAgYnVmW25dID0gJ1wwJzsKKyAgICBzID0gYnVmOworICAgIHdoaWxlICgqcykgeworCWQgPSAqcysrOworCWlmICgoZCA9PSAnMCcgfHwgZCA9PSAnICcpKSB7CisJICAgIGlmICghZmxhZykKKwkgICAgICBjb250aW51ZTsKKwl9IGVsc2UgeworCSAgICBmbGFnID0gMTsKKwl9CisJaWYgKGlzbG93ZXIoZCkpCisJICBkID0gdG91cHBlcihkKTsKKwlpZiAoZCA+PSAnMCcgJiYgZCA8PSAnOScpIHsKKwkgICAgZCAtPSAweDMwOworCX0gZWxzZSBpZiAoZCA+PSAnQScgJiYgZCA8PSAnRicpIHsKKwkgICAgZCAtPSAweDM3OworCX0gZWxzZSB7CisJICAgIHJldHVybigtMUwpOworCX0KKwlpZiAoKytjb3VudCA+IChzaXplb2YobG9uZykgKiAyKSkKKwkgIHJldHVybigtMUwpOworCXJlc3VsdCA9IChyZXN1bHQgPDwgNCkgfCAoZCAmIDB4MGYpOworICAgIH0KKyAgICByZXR1cm4ocmVzdWx0KTsKK30KKworLyoKKyAgYyBrIHMgcCBsIGkgdCAgLS0gIFNwbGl0cyBhIHN0cmluZyBpbnRvIHdvcmRzLCBvcjoKKyAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RzIGEgZ2l2ZW4gd29yZCBmcm9tIGEgc3RyaW5nLgorCisgIEFsbG93cyBmb3IgZ3JvdXBpbmcuCisgIE9wZXJhdGVzIG9uIGEgY29weSBvZiB0aGUgc3RyaW5nOyBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgc3RyaW5nLgorICBBbGwgc3RyaW5ncyBOVUwtdGVybWluYXRlZC4KKworICBDYWxsIHdpdGg6CisgICAgZmMgPSBmdW5jdGlvbiBjb2RlOgorICAgICAgICAgMSA9IHNwbGl0LCAwID0gd29yZC4KKyAgICBuMSA9IGRlc2lyZWQgd29yZCBudW1iZXIgaWYgZmMgPT0gMC4KKyAgICBzMSA9IHNvdXJjZSBzdHJpbmcuCisgICAgczIgPSBicmVhayBzdHJpbmcgKE5VTEwgdG8gYWNjZXB0IGRlZmF1bHQgPSBhbGwgbm9uLWFscGhhbnVtKS4KKyAgICBzMyA9IGluY2x1ZGUgc3RyaW5nIChOVUxMIHRvIGFjY2VwdCBkZWZhdWx0ID0gYWxsIGFscGhhbnVtKS4KKyAgICBuMiA9IGdyb3VwaW5nIG1hc2sgKE9SIGRlc2lyZWQgb25lcyB0b2dldGhlcik6CisgICAgICAgICAxID0gZG91YmxlcXVvdGVzLCAgMiA9IGJyYWNlcywgICAgNCA9IGFwb3N0cm9waGVzLAorICAgICAgICAgOCA9IHBhcmVucywgICAgICAgMTYgPSBicmFja2V0cywgMzIgPSBhbmdsZSBicmFja2V0cywKKyAgICAgICAgLTEgPSA2MyA9IGFsbCBvZiB0aGVzZS4KKyAgICBuMyA9IGdyb3VwIHF1b3RlIGNoYXJhY3RlciwgQVNDSUkgdmFsdWUsIHVzZWQgYW5kIHRlc3RlZCBvbmx5IGZvcgorICAgICAgICAgTElTUCBxdW90ZSwgZS5nLiAoYSAnYiBjICcoZCBlIGYpKS4KKyAgICBuNCA9IDAgdG8gY29sbGFwc2UgYWRqYWNlbnQgc2VwYXJhdG9yczsKKyAgICAgICAgIG5vbnplcm8gbm90IHRvIGNvbGxhcHNlIHRoZW0uCisKKyAgUmV0dXJuczoKKyAgICBQb2ludGVyIHRvIHN0cnVjdCBzdHJpbmdhcnJheSwgd2l0aCBzaXplOgorICAgICAgLTEgPSBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKyAgICAgIC0yID0gdG9vIG1hbnkgd29yZHMgaW4gc3RyaW5nLgorICAgICAgIG4gPSBudW1iZXIgb2Ygd29yZHMgKDAgb3IgbW9yZSkuCisKKyAgV2l0aDoKKyAgICB3b3JkYXJyYXkgPSBhcnJheSBvZiBwb2ludGVycyB0byBuIHdvcmRzIChuID09IDEgaWYgZmMgPT0gMCksIDEtYmFzZWQuCisgICAgRWFjaCBwb2ludGVyIGlzIHRvIGEgbWFsbG9jJ2Qgc3RyaW5nLiAgVGhpcyBhcnJheSBpcyByZWN5Y2xlZCB1cG9uIGVhY2gKKyAgICBjYWxsOyBpZiB5b3UgbmVlZCB0byBrZWVwIHRoZSBzdHJpbmdzLCBtYWtlIGNvcGllcyBvZiB0aGVtLiAgVGhpcyByb3V0aW5lCisgICAgbXVzdCBoYXZlIGNvbnRyb2wgb2YgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uLgorCisgIElmIGEgZ2l2ZW4gY2hhcmFjdGVyIGlzIGluY2x1ZGVkIGluIHRoZSBpbmNsdWRlIGxpc3QsIGl0IGlzIG5vdCB0cmVhdGVkCisgIGFzIGEgc2VwYXJhdG9yIG9yIGFzIGEgZ3JvdXBpbmcgY2hhcmFjdGVyLgorCisgIEdyb3VwcyBtYXkgYmUgbmVzdGVkIG9ubHkgaWYgdGhleSBhcmUgZm9ybWVkIHdpdGggYnJhY2VzLCBwYXJlbnMsIG9yCisgIGJyYWNrZXRzLCBidXQgbm90IHdpdGggcXVvdGVzIG9yIGFwb3N0cm9waGVzIHNpbmNlIEFTQ0lJIHF1b3RlcyBoYXZlIG5vCisgIGludHJpbnNpYyBoYW5kZWRuZXNzLiAgR3JvdXAtc3RhcnQgYW5kIGVuZCBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGFzCisgIHNlcGFyYXRvcnMgZXZlbiBpbiB0aGUgYWJzZW5jZSBvZiBvdGhlciBzZXBhcmF0b3JzLCBzbyBhIHN0cmluZyBzdWNoIGFzCisgICJhe2J9YyIgcmVzdWx0cyBpbiB0aHJlZSB3b3Jkcywgbm90IG9uZS4KKworICBTYW1wbGUgY2FsbCB0byBzcGxpdCBhIHN0cmluZyBpbnRvIGFuIGFycmF5OgorICAgIHN0cnVjdCBzdHJpbmdhcnJheSAqIHE7CisgICAgcSA9IGNrc3BsaXQoMSwwLHMxLHMyLHMzLC0xLDApOworICAgICAgICBxLT5hX3NpemUgPSBzaXplICg+PTApIG9yIGZhaWx1cmUgY29kZSAoPDApCisgICAgICAgIHEtPmFfaGVhZCA9IHBvaW50ZXIgdG8gYXJyYXkgKGVsZW1lbnRzIDAgdGhydSBxLT5hc2l6ZSAtIDEpLgorCisgIFNhbXBsZSBjYWxsIHRvIGV4dHJhY3Qgd29yZCBuIGZyb20gYSBzdHJpbmc6CisgICAgc3RydWN0IHN0cmluZ2FycmF5ICogcTsKKyAgICBxID0gY2tzcGxpdCgwLG4sczEsczIsczMsLTEsMCk7CisgICAgICAgIHEtPmFfc2l6ZSA9IHNpemUgKDEpIG9yIGZhaWx1cmUgY29kZSAoPDApCisgICAgICAgIHEtPmFfaGVhZCA9IHBvaW50ZXIgdG8gYXJyYXkgKGVsZW1lbnQgMSBpcyB0aGUgZGVzaXJlZCB3b3JkKS4KKyovCisKKy8qIFN0YXRlcyAqLworCisjZGVmaW5lIFNUX0JXICAwCQkJLyogQmV0d2VlbiBXb3JkcyAqLworI2RlZmluZSBTVF9JVyAgMQkJCS8qIEluIFdvcmQgKi8KKyNkZWZpbmUgU1RfSUcgIDIJCQkvKiBTdGFydCBHcm91cCAqLworCisvKiBDaGFyYWN0ZXIgQ2xhc3NlcyAoYml0bWFwKSAqLworCisjZGVmaW5lIENMX1NFUCAxCQkJLyogU2VwYXJhdG9yICovCisjZGVmaW5lIENMX09QTiAyCQkJLyogR3JvdXAgT3BlbiAqLworI2RlZmluZSBDTF9DTFMgNAkJCS8qIEdyb3VwIENsb3NlICovCisjZGVmaW5lIENMX0RBVCA4CQkJLyogRGF0YSAqLworI2RlZmluZSBDTF9RVU8gMTYJCQkvKiBHcm91cCBxdW90ZSAqLworCisjaWZkZWYgQklHQlVGT0sKKyNpZm5kZWYgTUFYV09SRFMKKyNkZWZpbmUgTUFYV09SRFMgNDA5NgkJCS8qIE1heCBudW1iZXIgb2Ygd29yZHMgKi8KKyNlbmRpZiAvKiBNQVhXT1JEUyAqLworI2lmbmRlZiBORVNUTUFYCisjZGVmaW5lIE5FU1RNQVggNjQJCQkvKiBNYXhpbXVtIG5lc3RpbmcgbGV2ZWwgKi8KKyNlbmRpZiAvKiBORVNUTUFYICovCisjZWxzZQorI2lmbmRlZiBNQVhXT1JEUworI2RlZmluZSBNQVhXT1JEUyAxMjgJCQkvKiBNYXggbnVtYmVyIG9mIHdvcmRzICovCisjZW5kaWYgLyogTUFYV09SRFMgKi8KKyNpZm5kZWYgTkVTVE1BWAorI2RlZmluZSBORVNUTUFYIDE2CQkJLyogTWF4aW11bSBuZXN0aW5nIGxldmVsICovCisjZW5kaWYgLyogTkVTVE1BWCAqLworI2VuZGlmIC8qIEJJR0JVRk9LICovCisKKy8qIHN0YXRpYyAqLyBjaGFyICoqIHdvcmRhcnJheSA9IE5VTEw7CS8qIFJlc3VsdCBhcnJheSBvZiB3b3JkIHBvaW50ZXJzICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3RyaW5nYXJyYXkgY2tfc3ZhbCA9ICB7CS8qIFJldHVybiB2YWx1ZSBzdHJ1Y3R1cmUgKi8KKyAgICBOVUxMLAkJCQkvKiBQb2ludGVyIHRvIGFycmF5ICovCisgICAgMAkJCQkJLyogU2l6ZSAqLworfTsKK3N0YXRpYyBpbnQgKiB3b3Jkc2l6ZSA9IE5VTEw7CisKK3N0YXRpYyBWT0lECitzZXR3b3JkKG4scyxsZW4pIGludCBuLCBsZW47IGNoYXIgKiBzOyB7CisgICAgcmVnaXN0ZXIgY2hhciAqIHA7CisgICAgcmVnaXN0ZXIgaW50IGksIGs7CisKKyAgICBpZiAoIXMpIHMgPSAiIjsKKworICAgIGlmICghd29yZGFycmF5KSB7CQkJLyogQWxsb2NhdGUgcmVzdWx0IGFycmF5IChvbmx5IG9uY2UpICovCisJaWYgKCEod29yZGFycmF5ID0gKGNoYXIgKiopbWFsbG9jKChNQVhXT1JEUysxKSAqIHNpemVvZihjaGFyICopKSkpCisJICByZXR1cm47CisJaWYgKCEod29yZHNpemUgPSAoaW50ICopbWFsbG9jKChNQVhXT1JEUysxKSAqIHNpemVvZihpbnQpKSkpCisJICByZXR1cm47CisJZm9yIChpID0gMDsgaSA8PSBNQVhXT1JEUzsgaSsrKQl7IC8qIEluaXRpYWxpemUgcmVzdWx0IGFycmF5ICovCisJICAgIHdvcmRhcnJheVtpXSA9IE5VTEw7CisJICAgIHdvcmRzaXplW2ldID0gMDsKKwl9CisgICAgfQorICAgIGlmICh3b3Jkc2l6ZVtuXSA8IGxlbiAvKiB8fCAhd29yZGFycmF5W25dICovICkgeworCWsgPSAobGVuIDwgMTYpID8gMTYgOiBsZW4gKyAobGVuIC8gNCk7CisJd29yZGFycmF5W25dID0gKGNoYXIgKikgbWFsbG9jKGsrMSk7CisJd29yZHNpemVbbl0gPSAod29yZGFycmF5W25dKSA/IGsgOiAwOworCWlmICh3b3JkYXJyYXlbbl0pIHsKKwkgICAgcCA9IHdvcmRhcnJheVtuXTsKKwkgICAgd2hpbGUgKCgqcCsrID0gKnMrKykgJiYgay0tID4gMCkgOworCX0KKyAgICB9IGVsc2UgaWYgKGxlbiA+IDApIHsKKwlrID0gd29yZHNpemVbbl07CQkvKiAoSW4gY2FzZSBsZW4gYXJnIGlzIGEgbGllKSAqLworCXAgPSB3b3JkYXJyYXlbbl07CisJd2hpbGUgKCgqcCsrID0gKnMrKykgJiYgay0tID4gMCkgeworI2lmZGVmIENPTU1FTlQKKwkgICAgaWYgKCgqKHMtMSkgPT0gQ01EUSkgJiYgKnMgIT0gQ01EUSkgeworCQlrKys7CisJCXAtLTsKKwkgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKwl9CisgICAgfSBlbHNlIGlmICh3b3JkYXJyYXlbbl0pIHsKKwl3b3JkYXJyYXlbbl1bMF0gPSBOVUw7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqIHNwbGl0YnVmID0gTlVMTDsKK3N0YXRpYyBpbnQgbnNwbGl0YnVmID0gMDsKKworLyogbjQgPSAxIHRvIE5PVCBjb2xsYXBzZSBhZGphY2VudCBzZXBhcmF0b3JzICovCisKKworc3RydWN0IHN0cmluZ2FycmF5ICoKK2Nrc3BsaXQoZmMsbjEsczEsczIsczMsbjIsbjMsbjQpIGludCBmYyxuMSxuMixuMyxuNDsgY2hhciAqczEsICpzMiwgKnMzOyB7CisgICAgaW50IHNwbGl0dGluZyA9IDA7CQkJLyogV2hhdCBJIHdhcyBhc2tlZCB0byBkbyAqLworICAgIGludCBpLCBrLCBrbyA9IDAsIG4sIHgsIG1heCA9IE1BWFdPUkRTOyAvKiBXb3JrZXJzICovCisgICAgY2hhciAqIHMgPSBOVUxMLCAqIHNzLCAqIHA7CQkvKiBXb3JrZXJzICovCisgICAgY2hhciAqIHNlcCA9ICIiOwkJCS8qIERlZmF1bHQgYnJlYWsgc2V0ICovCisgICAgY2hhciAqIG5vdHNlcCA9ICIiOwkJCS8qIERlZmF1bHQgaW5jbHVkZSBzZXQgKi8KKyAgICBpbnQgICAgZ3JvdXBpbmcgPSAwOwkJLyogR3JvdXBpbmcgb3B0aW9uICovCisgICAgY2hhciAqIGdyX29wbiA9ICJcInsnKFs8IjsJCS8qIEdyb3VwIG9wZW4gYnJhY2tldHMgKi8KKyAgICBjaGFyICogZ3JfY2xzID0gIlwifScpXT4iOwkJLyogR3JvdXAgY2xvc2UgYnJhY2tldHMgKi8KKyAgICBpbnQgICAgZ3Jfc3RrW05FU1RNQVhdOwkJLyogTmVzdGluZyBicmFja2V0IHN0YWNrICovCisgICAgaW50ICAgIGdyX2x2bCA9IDA7CQkJLyogTmVzdGluZyBsZXZlbCAqLworICAgIGludCAgICB3b3JkbnVtID0gMDsJCQkvKiBDdXJyZW50IHdvcmQgbnVtYmVyICovCisgICAgY2hhciAgIGMgPSAnQSc7CQkJLyogQ3VycmVudCBjaGFyIChkdW1teSBzdGFydCB2YWx1ZSkgKi8KKyAgICBpbnQgICAgY2xhc3MgPSAwOwkJCS8qIEN1cnJlbnQgY2hhcmFjdGVyIGNsYXNzICovCisgICAgaW50ICAgIHN0YXRlID0gU1RfQlc7CQkvKiBDdXJyZW50IEZTQSBzdGF0ZSAqLworICAgIGludCAgICBsZW4gPSAwOwkJCS8qIExlbmd0aCBvZiBjdXJyZW50IHdvcmQgKi8KKyAgICBpbnQgICAgc2xlbiA9IDA7CQkJLyogTGVuZ3RoIG9mIHMxICovCisgICAgaW50ICAgIGdxdW90ZSA9IDA7CQkJLyogUXVvdGVkIGdyb3VwICovCisgICAgaW50ICAgIGNxdW90ZSA9IDA7CQkJLyogUXVvdGVkIGNoYXJhY3RlciAqLworICAgIGludCAgICBjb2xsYXBzZSA9IDE7CQkvKiBDb2xsYXBzZSBhZGphY2VudCBzZXBhcmF0b3JzICovCisKKyAgICBpZiAobjQpIGNvbGxhcHNlID0gMDsJCS8qIERvbid0IGNvbGxhcHNlICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkVTVE1BWDsgaSsrKQkvKiBJbml0aWFsaXplIG5lc3Rpbmcgc3RhY2sgKi8KKyAgICAgIGdyX3N0a1tpXSA9IDA7CisKKyAgICBzZXR3b3JkKDEsTlVMTCwwKTsKKyAgICBja19zdmFsLmFfaGVhZCA9IHdvcmRhcnJheTsJCS8qIEluaXRpYWxpemUgcmV0dXJuIHZhbHVlIHN0cnVjdCAqLworICAgIGNrX3N2YWwuYV9zaXplID0gMDsKKworICAgIGlmICghczEpIHMxID0gIiI7CQkJLyogczEgPSBzb3VyY2Ugc3RyaW5nICovCisgICAgaWYgKCEqczEpIHsJCQkJLyogSWYgbm9uZSwgbm90aGluZyB0byBkbyAqLworCXJldHVybigmY2tfc3ZhbCk7CisgICAgfQorICAgIHNwbGl0dGluZyA9IGZjOwkJCS8qIE91ciBqb2IgKi8KKyAgICBpZiAoc3BsaXR0aW5nKSB7CQkJLyogSWYgc3BsaXR0aW5nIG4gPSB3b3JkIGNvdW50ICovCisJbiA9IDA7CQkJCS8qIEluaXRpYWxpemUgaXQgKi8KKyAgICB9IGVsc2UgewkJCQkvKiBPdGhlcndpc2UgKi8KKwlpZiAobjEgPCAxKSB7CQkJLyogSWYgMCAob3IgbGVzcykgKi8KKwkgICAgY2tfc3ZhbC5hX3NpemUgPSAwOwkJLyogbm90aGluZyB0byBkby4gKi8KKwkgICAgcmV0dXJuKCZja19zdmFsKTsKKwl9CisJbiA9IG4xOwkJCQkvKiBuID0gZGVzaXJlZCB3b3JkIG51bWJlci4gKi8KKyAgICB9CisgICAgc2xlbiA9IDA7CQkJCS8qIEdldCBsZW5ndGggb2YgczEgKi8KKyAgICBkZWJ1ZyhGMTExLCJja3NwbGl0IixzMSxuKTsKKworICAgIHAgPSBzMTsKKyNpZmRlZiBDT01NRU5UCisgICAgd2hpbGUgKCpwKyspIHNsZW4rKzsJCS8qIE1ha2UgcG9rZWFibGUgY29weSBvZiBzMSAqLworICAgIGlmICghc3BsaXRidWYgfHwgc2xlbiA+IG5zcGxpdGJ1ZikgeyAvKiBBbGxvY2F0ZSBidWZmZXIgaWYgbmVlZGVkICovCisJaW50IHh4OworCWlmIChzcGxpdGJ1ZikKKwkgIGZyZWUoc3BsaXRidWYpOworCXh4ID0gKHNsZW4gPCAyNTUpID8gMjU1IDogeHggKyAoeHggLyA0KTsKKwlkZWJ1ZyhGMTAxLCJja3NwbGl0IHNwbGl0YnVmIiwiIix4eCk7CisJc3BsaXRidWYgPSAoY2hhciAqKW1hbGxvYyh4eCsxKTsKKwlpZiAoIXNwbGl0YnVmKSB7CQkvKiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLi4uICovCisJICAgIGNrX3N2YWwuYV9zaXplID0gLTE7CisJICAgIHJldHVybigmY2tfc3ZhbCk7CisJfQorCW5zcGxpdGJ1ZiA9IHh4OwkJCS8qIFJlbWVtYmVyIHNpemUgb2YgYnVmZmVyICovCisgICAgfQorI2Vsc2UKKy8qCisgIFRoZSBpZGVhIGlzIHRvIGp1c3QgY29weSB0aGUgc3RyaW5nIGludG8gc3BsaXRidWYgKGlmIGl0IGV4aXN0cykuICBUaGlzCisgIGdpdmVzIHVzIGJvdGggdGhlIGNvcHkgYW5kIHRoZSBsZW5ndGggc28gd2Ugb25seSBuZWVkIHRvIGdyb3ZlbCB0aHJvdWdoIHRoZQorICBzdHJpbmcgb25jZSBpbiBtb3N0IGNhc2VzLiAgT25seSB3aGVuIHNwbGl0YnVmIGRvZXNuJ3QgZXhpc3Qgb3IgaXMgdG9vIHNob3J0CisgIGRvIHdlIHJlLW1hbGxvYygpLCB3aGljaCBzaG91bGQgYmUgdmVyeSBpbmZyZXF1ZW50IHNvIHdobyBjYXJlcyBpZiB3ZSBoYXZlCisgIHRvIGdvIHRocm91Z2ggdGhlIHN0cmluZyBhZ2FpbiBpbiB0aGF0IGNhc2UuCisqLworICAgIHAgPSBzMTsKKyAgICBzID0gc3BsaXRidWY7CisgICAgaWYgKHNwbGl0YnVmKSB7CQkJLyogTWFrZSBwb2tlYWJsZSBjb3B5IG9mIHMxICovCisJd2hpbGUgKCgqcysrID0gKnArKykgJiYgKHNsZW4rKyA8IG5zcGxpdGJ1ZikpIC8qIFRyeSB0byBjb3B5ICovCisJICA7CisgICAgfQorICAgIGlmICghc3BsaXRidWYgfHwgc2xlbiA+PSBuc3BsaXRidWYpIHsgLyogTmVlZCB0byBkbyBtb3JlLi4uICovCisJaW50IHh4OworCWlmIChzcGxpdGJ1ZikJCQkvKiBGcmVlIHByZXZpb3VzIGJ1ZiBpZiBhbnkgKi8KKwkgIGZyZWUoc3BsaXRidWYpOworCXdoaWxlICgqcCsrKSBzbGVuKys7CQkvKiBHZXQgKHJlc3Qgb2YpIGxlbmd0aCAqLworCXh4ID0gKHNsZW4gPCAyNTUpID8gMjU1IDogc2xlbiArIChzbGVuIC8gNCk7IC8qIFNpemUgb2YgbmV3IGJ1ZmZlciAqLworCXNwbGl0YnVmID0gKGNoYXIgKiltYWxsb2MoeHgrMSk7IC8qIEFsbG9jYXRlIGl0ICovCisJaWYgKCFzcGxpdGJ1ZikgewkJIC8qIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuLi4gKi8KKwkgICAgY2tfc3ZhbC5hX3NpemUgPSAtMTsKKwkgICAgcmV0dXJuKCZja19zdmFsKTsKKwl9CisJbnNwbGl0YnVmID0geHg7CQkJLyogUmVtZW1iZXIgKG5ldykgYnVmZmVyIHNpemUgKi8KKwlzID0gc3BsaXRidWY7CisJcCA9IHMxOworCXdoaWxlICgoKnMrKyA9ICpwKyspKSA7CisgICAgfQorCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHMgPSBzcGxpdGJ1ZjsKKyAgICBzZXAgPSBzMjsJCQkJLyogczIgPSBicmVhayBzZXQgKi8KKyAgICBpZiAoIXNlcCkgc2VwID0gIiI7CisgICAgbm90c2VwID0gczM7CQkJLyogczMgPSBpbmNsdWRlIHNldCAqLworICAgIGlmICghbm90c2VwKSBub3RzZXAgPSAiIjsKKyAgICBpZiAobjIgPCAwKSBuMiA9IDYzOwkJLyogbjIgPSBncm91cGluZyBtYXNrICovCisgICAgZ3JvdXBpbmcgPSBuMjsKKyAgICBwID0gIiI7CQkJCS8qIFBvaW50ZXIgdG8gY3VycmVudCB3b3JkICovCisgICAgd2hpbGUgKGMpIHsJCQkJLyogTG9vcCB0aHJvdWdoIHN0cmluZyAqLworCWMgPSAqczsKKwljbGFzcyA9IDA7CisJaWYgKCFjcXVvdGUgJiYgYyA9PSBDTURRKSB7CS8qIElmIENNRFEgKi8KKwkgICAgY3F1b3RlKys7CQkJLyogbmV4dCBvbmUgaXMgcXVvdGVkICovCisJICAgIGdvdG8gbmV4dGM7CQkJLyogZ28gZ2V0IGl0ICovCisJfQorCWlmIChjcXVvdGUgJiYgYyA9PSBDTURRKSB7CS8qIFF1b3RlZCBDTURRIGlzIHNwZWNpYWwgKi8KKwkgICAgaWYgKHN0YXRlICE9IFNUX0JXKSB7CS8qIGJlY2F1c2UgaXQgY2FuIHN0aWxsIHNlcGFyYXRlICovCisJCWNoYXIgKiBzMiA9IHMtMTsKKwkJd2hpbGUgKHMyID4gcCkgeyAqczIgPSAqKHMyLTEpOyBzMi0tOyB9CisJCXArKzsKKwkgICAgfQorCSAgICBjcXVvdGUgPSAwOworCX0KKwlpZiAoY3F1b3RlKSB7CQkJLyogT3RoZXIgcXVvdGVkIGNoYXJhY3RlciAqLworCSAgICBpZiAoc3RhdGUgIT0gU1RfQlcpIHsJLyogY2FuJ3Qgc2VwYXJhdGUgb3IgZ3JvdXAgKi8KKwkJY2hhciAqIHMyID0gcy0xOworCQl3aGlsZSAoczIgPiBwKSB7ICpzMiA9ICooczItMSk7IHMyLS07IH0KKwkJcCsrOworCSAgICB9CisJICAgIGNsYXNzID0gQ0xfREFUOwkJLyogc28gdHJlYXQgaXQgYXMgZGF0YSAqLworCSAgICBjcXVvdGUgPSAwOworCSAgICB4ID0gMTsKKwl9IGVsc2UgewkJCS8qIENoYXJhY3RlciBpcyBub3QgcXVvdGVkICovCisJICAgIGlmIChjIDwgU1ApIHsJCS8qIEdldCBpdHMgY2xhc3MgKi8KKwkJeCA9IDA7CQkJLyogeCA9PSAwIG1lYW5zICJpcyBzZXBhcmF0b3IiICovCisJICAgIH0gZWxzZSBpZiAoKnNlcCkgewkJLyogQnJlYWsgc2V0IGdpdmVuICovCisJCXNzID0gc2VwOworCQl3aGlsZSAoKnNzICYmICpzcyAhPSBjKSBzcysrOyAvKiAoaW5zdGVhZCBvZiBja3N0cmNocigpKSAqLworCQl4ID0gKCpzcyAhPSBjKTsKKwkgICAgfSBlbHNlIHsJCQkvKiBEZWZhdWx0IGJyZWFrIHNldCBpcyAqLworCQl4ID0gKChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgLyogYWxsIGJ1dCBhbHBoYW51bWVyaWNzICovCisJCSAgICAgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fAorCQkgICAgIChjID49ICdBJyAmJiBjIDw9ICdaJykKKwkJICAgICApOworCSAgICB9CisJICAgIGlmICh4ID09IDAgJiYgKm5vdHNlcCAmJiBjKSB7IC8qIEluY2x1ZGUgc2V0IGlmIGdpdmVuICovCisJCXNzID0gbm90c2VwOworCQl3aGlsZSAoKnNzICYmICpzcyAhPSBjKSBzcysrOyAvKiAoaW5zdGVhZCBvZiBja3N0cmNocigpKSAqLworCQl4ID0gKCpzcyA9PSBjKTsKKwkgICAgfQorCSAgICBpZiAoYyA9PSBuMyAmJiBncm91cGluZyAmJiBzdGF0ZSA9PSBTVF9CVykgeyAvKiBHcm91cCBxdW90ZT8gKi8KKwkJY2xhc3MgPSBDTF9RVU87CisJICAgIH0gZWxzZSB7CisJCWNsYXNzID0geCA/IENMX0RBVCA6IENMX1NFUDsgLyogQ2xhc3MgPSBkYXRhIG9yIHNlcGFyYXRvciAqLworCSAgICB9CisJICAgIGlmIChncm91cGluZykgewkJLyogR3JvdXBpbmc/ICovCisJCWludCBqOwkJCS8qIExvb2sgZm9yIGdyb3VwIHN0YXJ0ICovCisJCWZvciAoayA9IDA7IGsgPCA2OyBrKyspIHsgLyogR3JvdXAtc3RhcnQgY2hhcj8gKi8KKwkJICAgIGogPSAxIDw8IGs7CQkvKiBHZXQgaXRzIG1hc2sgYml0IHZhbHVlICovCisJCSAgICBpZiAoZ3JvdXBpbmcgJiBqKSB7CisJCQlpZiAoYyA9PSBncl9vcG5ba10pIHsgLyogU2VsZWN0ZWQgZ3JvdXAgb3BlbmVyPyAqLworCQkJICAgIGtvID0gazsKKwkJCSAgICBjbGFzcyB8PSBDTF9PUE47CisJCQkgICAgaWYgKGMgPT0gJyInIHx8IGMgPT0gJ1wnJykgeyAvKiBUaGVzZSBjYW4gYWxzbyAqLworCQkJCWNsYXNzIHw9IENMX0NMUzsgICAgICAgICAvKiBiZSBjbG9zZXJzICovCisJCQkJYnJlYWs7CisJCQkgICAgfQorCQkJfSBlbHNlIGlmIChjID09IGdyX2Nsc1trXSkgeyAvKiBHcm91cCBjbG9zZXI/ICovCisJCQkgICAgY2xhc3MgfD0gQ0xfQ0xTOworCQkJICAgIGJyZWFrOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisJc3dpdGNoIChzdGF0ZSkgewkJLyogU3RhdGUgc3dpdGNoZXIuLi4gKi8KKwkgIGNhc2UgU1RfQlc6CQkJLyogQkVUV0VFTldPUkRTICovCisJICAgIGlmIChjbGFzcyAmIENMX09QTikgewkvKiBHcm91cCBvcGVuZXIgKi8KKwkJaWYgKGdyX2x2bCA9PSAwICYmICFncXVvdGUpIHsgLyogSWYgbm90IGluIGdyb3VwICovCisJCSAgICBwID0gczsJCS8qIHBvaW50IHRvIGJlZ2lubmluZyBvZiB3b3JkICovCisJCX0KKwkJZ3JfbHZsKys7CQkvKiBQdXNoIGNsb3NlciBvbiBuZXN0aW5nIHN0YWNrICovCisJCWlmIChncl9sdmwgPj0gTkVTVE1BWCkKKwkJICBnb3RvIHh4c3BsaXQ7CisJCWdyX3N0a1tncl9sdmxdID0gZ3JfY2xzW2tvXTsKKwkJc3RhdGUgPSBTVF9JRzsJCS8qIFN3aXRjaCB0byBJTkdST1VQIHN0YXRlICovCisJICAgIH0gZWxzZSBpZiAoY2xhc3MgJiBDTF9EQVQpIHsgLyogRGF0YSBjaGFyYWN0ZXIgKi8KKwkJZ3JfbHZsID0gMDsJCS8qIENsZWFyIGdyb3VwIG5lc3Rpbmcgc3RhY2sgKi8KKwkJZ3Jfc3RrW2dyX2x2bF0gPSAwOworCQlsZW4gPSAwOworCQlwID0gczsJCQkvKiBQb2ludCB0byBiZWdpbm5pbmcgb2Ygd29yZCAqLworCQlpZiAoZ3F1b3RlKSB7CQkvKiBBZGp1c3QgZm9yIHF1b3RlICovCisJCSAgICBsZW4rKzsKKwkJICAgIHAtLTsKKwkJICAgIGdxdW90ZSA9IDA7CisJCX0KKwkJc3RhdGUgPSBTVF9JVzsJCS8qIFN3aXRjaCB0byBJTldPUkQgc3RhdGUgKi8KKwkgICAgfSBlbHNlIGlmIChjbGFzcyAmIENMX1FVTykgeyAvKiBHcm91cCBxdW90ZSAqLworCQlncXVvdGUgPSBncl9sdmwrMTsJLyogUmVtZW1iZXIgcXVvdGVkIGxldmVsICovCisJCXAgPSBzIC0gMTsKKwkJbGVuID0gMTsKKwkgICAgfQorCSAgICBpZiAoY29sbGFwc2UpCisJICAgICAgYnJlYWs7CisKKwkgIGNhc2UgU1RfSVc6CQkJLyogSU5XT1JEIChidXQgbm90IGluIGEgZ3JvdXApICovCisJICAgIGlmIChjbGFzcyAmIENMX1NFUCkgewkvKiBFbmRzIG9uIGFueSBraW5kIG9mIHNlcGFyYXRvciAqLworCQkqcyA9IE5VTDsJCS8qIFRlcm1pbmF0ZSB0aGlzIHdvcmQgKi8KKwkJd29yZG51bSsrOwkJLyogQ291bnQgaXQgKi8KKwkJaWYgKHNwbGl0dGluZykgewkvKiBEaXNwb3NlIG9mIGl0IGFwcHJvcHJpYXRlbHkgKi8KKwkJICAgIGlmICh3b3JkbnVtID4gbWF4KSB7ICAgLyogQWRkIHRvIGFycmF5IGlmIHNwbGl0dGluZyAqLworCQkJY2tfc3ZhbC5hX3NpemUgPSAtMjsKKwkJCXJldHVybigmY2tfc3ZhbCk7CisJCSAgICB9CisJCSAgICBzZXR3b3JkKHdvcmRudW0scCxsZW4pOworCQl9IGVsc2UgaWYgKHdvcmRudW0gPT0gbikgeyAvKiBTZWFyY2hpbmcgZm9yIHdvcmQgbiAqLworCQkgICAgc2V0d29yZCgxLHAsbGVuKTsKKwkJICAgIGNrX3N2YWwuYV9zaXplID0gMTsKKwkJICAgIHJldHVybigmY2tfc3ZhbCk7CisJCX0KKwkJc3RhdGUgPSBTVF9CVzsJCS8qIFN3aXRjaCB0byBCRVRXRUVOV09SRFMgc3RhdGUgKi8KKwkJbGVuID0gMDsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgY2FzZSBTVF9JRzoJCQkvKiBJTkdST1VQICovCisJICAgIGlmIChjbGFzcyAmIENMX0NMUykgewkvKiBIYXZlIGdyb3VwIGNsb3Nlcj8gKi8KKwkJaWYgKGMgPT0gZ3Jfc3RrW2dyX2x2bF0pIHsgLyogRG9lcyBpdCBtYXRjaCBjdXJyZW50IG9wZW5lcj8gKi8KKwkJICAgIGdyX2x2bC0tOwkJICAgLyogWWVzLCBwb3Agc3RhY2sgKi8KKwkJICAgIGlmIChncl9sdmwgPCAwKQkgICAvKiBEb24ndCBwb3AgaXQgdG9vIG11Y2ggKi8KKwkJICAgICAgZ3JfbHZsID0gMDsKKwkJICAgIGlmIChncl9sdmwgPT0gMCkgewkvKiBJZiBhdCB0b3Agb2Ygc3RhY2sgKi8KKwkJCWlmIChncXVvdGUpCisJCQkgIHMrKzsKKwkJCWMgPSAqczsKKwkJCSpzID0gTlVMOwkvKiB3ZSBoYXZlIHdvcmQuICovCisKKwkJCXdvcmRudW0rKzsJLyogQ291bnQgYW5kIGRpc3Bvc2Ugb2YgaXQuICovCisJCQlsZW4tLTsKKwkJCWlmIChzcGxpdHRpbmcpIHsKKwkJCSAgICBpZiAod29yZG51bSA+IG1heCkgeworCQkJCWNrX3N2YWwuYV9zaXplID0gLTI7CisJCQkJcmV0dXJuKCZja19zdmFsKTsKKwkJCSAgICB9CisJCQkgICAgc2V0d29yZCh3b3JkbnVtLHArMSxsZW4pOworCQkJfSBlbHNlIGlmICh3b3JkbnVtID09IG4pIHsKKwkJCSAgICBzZXR3b3JkKDEscCsxLGxlbik7CisJCQkgICAgY2tfc3ZhbC5hX3NpemUgPSAxOworCQkJICAgIHJldHVybigmY2tfc3ZhbCk7CisJCQl9CisJCQlzdGF0ZSA9IFNUX0JXOwkvKiBTd2l0Y2ggdG8gQkVUV0VFTldPUkRTIHN0YXRlICovCisJCQlsZW4gPSAwOworCQkgICAgfQorCQkgICAgaWYgKGdyX2x2bCA8IGdxdW90ZSkKKwkJICAgICAgZ3F1b3RlID0gMDsKKwkJfQorCSAgICB9IGVsc2UgaWYgKGNsYXNzICYgQ0xfT1BOKSB7IC8qIEhhdmUgZ3JvdXAgb3BlbmVyICovCisJCWdyX2x2bCsrOwkJIC8qIFB1c2ggb24gbmVzdGluZyBzdGFjayAqLworCQlpZiAoZ3JfbHZsID49IE5FU1RNQVgpIGdvdG8geHhzcGxpdDsKKwkJZ3Jfc3RrW2dyX2x2bF0gPSBncl9jbHNba29dOworCSAgICB9CisJfSAvKiBzd2l0Y2ggKi8KKworICAgICAgbmV4dGM6CisJcysrOwkJCQkvKiBOZXh0IGNoYXIgKi8KKwlpZiAoc3RhdGUpCisJICBsZW4rKzsKKyAgICB9IC8qIHdoaWxlIChjKSAqLworCisgICAgaWYgKGdyX2x2bCA+IDApIHsJCQkvKiBJbiBjYXNlIG9mIGFuIHVuY2xvc2VkIGdyb3VwICovCisJaWYgKHNwbGl0dGluZykgewkJLyogbWFrZSBpdCB0aGUgbGFzdCB3b3JkLiAqLworCSAgICBpZiAoKyt3b3JkbnVtID4gbWF4KSB7CisJCWNrX3N2YWwuYV9zaXplID0gLTI7CisJCXJldHVybigmY2tfc3ZhbCk7CisJICAgIH0KKwkgICAgc2V0d29yZCh3b3JkbnVtLHArMSxsZW4pOworCX0gZWxzZSBpZiAod29yZG51bSA9PSBuKSB7CisJICAgIHNldHdvcmQoMSxwKzEsbGVuKTsKKwkgICAgY2tfc3ZhbC5hX3NpemUgPSAxOworCSAgICByZXR1cm4oJmNrX3N2YWwpOworCX0KKyAgICB9CisgICAgaWYgKCFzcGxpdHRpbmcpIHsJCQkvKiBXYW50ZWQgd29yZCBuIGJ1dCB0aGVyZSB3YXMgbm9uZT8gKi8KKwlzZXR3b3JkKDEsTlVMTCwwKTsKKwlja19zdmFsLmFfc2l6ZSA9IDA7CisJcmV0dXJuKCZja19zdmFsKTsKKyAgICB9IGVsc2UgewkJCQkvKiBTdWNjZWVkIG90aGVyd2lzZSAqLworCWNrX3N2YWwuYV9zaXplID0gd29yZG51bTsKKwlpZiAod29yZG51bSA8IE1BWFdPUkRTKQorCSAgc2V0d29yZCh3b3JkbnVtKzEsTlVMTCwwKTsKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisJZm9yIChpID0gMTsgaSA8PSB3b3JkbnVtOyBpKyspCisJICBkZWJ1ZyhGMTExLCJja3NwbGl0IHJlc3VsdCIsd29yZGFycmF5W2ldLGkpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJldHVybigmY2tfc3ZhbCk7CisKKyAgeHhzcGxpdDoJCQkJLyogRXJyb3IgcmV0dXJuICovCisgICAgY2tfc3ZhbC5hX3NpemUgPSAtMjsKKyAgICByZXR1cm4oJmNrX3N2YWwpOworfQorCisvKiBFbmQgb2YgY2tjbGliLmMgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja2NsaWIuaCBiL2NrZXJtaXQtOC4wLjIxMS9ja2NsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjU4NjY0Ci0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrY2xpYi5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiBja2NsaWIuaCAtLSBDLUtlcm1pdCBsaWJyYXJ5IHJvdXRpbmUgcHJvdG90eXBlcyAqLworLyoKKyAgQXV0aG9yOiBGcmFuayBkYSBDcnV6IDxmZGNAY29sdW1iaWEuZWR1PiwKKyAgQ29sdW1iaWEgVW5pdmVyc2l0eSBBY2FkZW1pYyBJbmZvcm1hdGlvbiBTeXN0ZW1zLCBOZXcgWW9yayBDaXR5LgorCisgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisqLworI2lmbmRlZiBDS0NMSUJfSAorI2RlZmluZSBDS0NMSUJfSAorCitzdHJ1Y3Qgc3RyaW5nYXJyYXkgeworICAgIGNoYXIgKiogYV9oZWFkOworICAgIGludCBhX3NpemU7Cit9OworCisjaWZkZWYgQ0tfQU5TSUMKK19QUk9UT1RZUCggaW50IGNrc3RybmNweSwgKGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBja3N0cm5jYXQsIChjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSApOworI2Vsc2UKK19QUk9UT1RZUCggaW50IGNrc3RybmNweSwgKGNoYXIgKiwgY2hhciAqLCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBja3N0cm5jYXQsIChjaGFyICosIGNoYXIgKiwgaW50KSApOworI2VuZGlmIC8qIENLX0FOU0lDICovCisKK19QUk9UT1RZUCggaW50IGNrbWFrbXNnLCAgKGNoYXIgKiwgaW50LCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBja21ha3htc2csIChjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqKSApOworCitfUFJPVE9UWVAoIGNoYXIgKiBja3N0cnBicmssIChjaGFyICosIGNoYXIgKikgKTsKK19QUk9UT1RZUCggY2hhciAqIGNrc3Ryc3RyLCAoY2hhciAqLCBjaGFyICopICk7CitfUFJPVE9UWVAoIGNoYXIgKiBjaGFydG9zdHIsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBja2xvd2VyLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgY2t1cHBlciwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IGNraW5kZXgsIChjaGFyICosIGNoYXIgKiwgaW50LCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggY2hhciAqIGNrY3RvYSwgKGNoYXIpICk7CitfUFJPVE9UWVAoIGNoYXIgKiBja2N0b3gsIChDSEFSLCBpbnQpICk7CitfUFJPVE9UWVAoIGNoYXIgKiBja2l0b2EsIChpbnQpICk7CitfUFJPVE9UWVAoIGNoYXIgKiBja3VpdG9hLCAodW5zaWduZWQgaW50KSApOworX1BST1RPVFlQKCBjaGFyICogY2tsdG9hLCAobG9uZykgKTsKK19QUk9UT1RZUCggY2hhciAqIGNrdWx0b2EsICh1bnNpZ25lZCBsb25nKSApOworX1BST1RPVFlQKCBjaGFyICogY2tpdG94LCAoaW50KSApOworX1BST1RPVFlQKCBjaGFyICogY2tsdG94LCAobG9uZykgKTsKK19QUk9UT1RZUCggaW50IGNrbWF0Y2gsIChjaGFyICosIGNoYXIgKiwgaW50LCBpbnQgKSApOworX1BST1RPVFlQKCBWT0lEIGNrbWVtY3B5LCAoY2hhciAqLCBjaGFyICosIGludCkgKTsKK19QUk9UT1RZUCggY2hhciAqIGNrc3RyY2hyLCAoY2hhciAqLCBjaGFyKSApOworX1BST1RPVFlQKCBjaGFyICogY2tzdHJyY2hyLCAoY2hhciAqLCBjaGFyKSApOworX1BST1RPVFlQKCBpbnQgY2tyY2hhciwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IGNrc3RyY21wLCAoY2hhciAqLCBjaGFyICosIGludCwgaW50KSApOworI2RlZmluZSB4eHN0cmNtcChhLGIsYykgY2tzdHJjbXAoYSxiLGMsMCkKK19QUk9UT1RZUCggaW50IGNrc3RycHJlLCAoY2hhciAqLCBjaGFyICopICk7CitfUFJPVE9UWVAoIFZPSUQgc2hfc29ydCwgKGNoYXIgKiosIGNoYXIgKiosIGludCwgaW50LCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggY2hhciAqIGJyc3RyaXAsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGNoYXIgKiBmbnN0cmlwLCAoY2hhciAqKSApOworI2lmZGVmIENPTU1FTlQKK19QUk9UT1RZUCggY2hhciAqIGJyYWNlLCAoY2hhciAqKSApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KK19QUk9UT1RZUCggaW50IGRxdW90ZSwgKGNoYXIgKiwgaW50LCBpbnQpICk7CitfUFJPVE9UWVAoIGludCB1bnRhYmlmeSwgKGNoYXIgKiwgY2hhciAqLCBpbnQpICk7CitfUFJPVE9UWVAoIFZPSUQgbWFrZWxpc3QsIChjaGFyICosIGNoYXIgKltdLCBpbnQpICk7CisjaWZuZGVmIENLX0FOU0lDCitfUFJPVE9UWVAoIFZPSUQgbWFrZXN0ciwgKGNoYXIgKiosIGNoYXIgKikgKTsKK19QUk9UT1RZUCggVk9JRCB4bWFrZXN0ciwgKGNoYXIgKiosIGNoYXIgKikgKTsKKyNlbHNlIC8qIENLX0FOU0lDICovCitfUFJPVE9UWVAoIFZPSUQgbWFrZXN0ciwgKGNoYXIgKiosIGNvbnN0IGNoYXIgKikgKTsKK19QUk9UT1RZUCggVk9JRCB4bWFrZXN0ciwgKGNoYXIgKiosIGNvbnN0IGNoYXIgKikgKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworX1BST1RPVFlQKCBpbnQgY2hrbnVtLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgcmRpZ2l0cywgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggY2hhciAqIGNrcmFkaXgsIChjaGFyICosaW50LGludCkgKTsKKworLyogQmFzZS02NCBjb252ZXJzaW9uIG5lZWRlZCBmb3Igc2NyaXB0IHByb2dyYW1taW5nIGFuZCBIVFRQICovCisKKyNpZm5kZWYgTk9CNjQKK19QUk9UT1RZUCggaW50IGI4dG9iNjQsIChjaGFyICosaW50LGNoYXIgKixpbnQpKTsKK19QUk9UT1RZUCggaW50IGI2NHRvYjgsIChjaGFyICosaW50LGNoYXIgKixpbnQpKTsKKyNlbmRpZiAvKiBOT0I2NCAqLworCisjaWZkZWYgQ0tGTE9BVAorX1BST1RPVFlQKCBpbnQgaXNmbG9hdCwgKGNoYXIgKixpbnQpICk7CisjaWZuZGVmIENLQ0xJQl9DCisjaWZuZGVmIENLV0FSVF9DCitleHRlcm4gQ0tGTE9BVCBmbG9hdHZhbDsKKyNlbmRpZiAvKiBDS1dBUlRfQyAqLworI2VuZGlmIC8qIENLQ0xJQl9DICovCisjZW5kaWYgLyogQ0tGTE9BVCAqLworCitfUFJPVE9UWVAoIGNoYXIgKiBwYXJuYW0sIChjaGFyKSApOworX1BST1RPVFlQKCBjaGFyICpoaG1tc3MsIChsb25nKSApOworCitfUFJPVE9UWVAoIFZPSUQgbHNldCwgKGNoYXIgKiwgY2hhciAqLCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggVk9JRCByc2V0LCAoY2hhciAqLCBjaGFyICosIGludCwgaW50KSApOworX1BST1RPVFlQKCBjaGFyICogdWxvbmd0b2hleCwgKHVuc2lnbmVkIGxvbmcsIGludCkgKTsKK19QUk9UT1RZUCggbG9uZyBoZXh0b3Vsb25nLCAoY2hhciAqLCBpbnQpICk7CitfUFJPVE9UWVAoIHN0cnVjdCBzdHJpbmdhcnJheSAqIGNrc3BsaXQsIChpbnQsaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLGNoYXIgKixjaGFyICosaW50LGludCxpbnQpICk7CisKKyNlbmRpZiAvKiBDS0NMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrY21haS5jIGIvY2tlcm1pdC04LjAuMjExL2NrY21haS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTA0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2tjbWFpLmMKQEAgLTAsMCArMSwzNTkyIEBACisjZGVmaW5lIEVESVREQVRFICAiMTAgQXByIDIwMDQiCQkvKiBVcGRhdGUgdGhlc2Ugd2l0aCBlYWNoIGVkaXQgKi8KKyNkZWZpbmUgRURJVE5EQVRFICIyMDA0MDQxMCIJCS8qIEtlZXAgdGhlbSBpbiBzeW5jICovCisvKiBTYXQgQXByIDEwIDEyOjA1OjQ5IDIwMDQgKi8KKworLyoKKyAgY2tjc3ltLmggaXMgdXNlZCBmb3IgZm9yIGRlZmluaW5nIHN5bWJvbHMgdGhhdCBub3JtYWxseSB3b3VsZCBiZSBkZWZpbmVkCisgIHVzaW5nIC1EIG9yIC1kIG9uIHRoZSBjYyBjb21tYW5kIGxpbmUsIGZvciB1c2Ugd2l0aCBjb21waWxlcnMgdGhhdCBkb24ndAorICBzdXBwb3J0IHRoaXMgZmVhdHVyZS4gIE11c3QgYmUgYmVmb3JlIGFueSB0ZXN0cyBmb3IgcHJlcHJvY2Vzc29yIHN5bWJvbHMuCisqLworI2luY2x1ZGUgImNrY3N5bS5oIgorLyoKKyAgQ29uc29saWRhdGVkIHByb2dyYW0gdmVyc2lvbiBpbmZvcm1hdGlvbiAoZm9yIFVOSVggYWxzbyBzZWUgY2t1dmVyLmgpLgorICBTZWUgbWFrZXZlcigpIGJlbG93IGZvciBob3cgdGhleSBhcmUgdXNlZC4KKyovCisvKiAjaWZkZWYgQ09NTUVOVCAqLyAgICAgICAgICAgICAgICAgICAgLyogVW5jb21tZW50IHRoaXMgZm9yIHRlc3QgdmVyc2lvbiAqLworI2lmbmRlZiBPUzIKKyNpZm5kZWYgQkVUQVRFU1QKKyNkZWZpbmUgQkVUQVRFU1QKKyNlbmRpZiAvKiBCRVRBVEVTVCAqLworI2VuZGlmIC8qIE9TMiAqLworLyogI2VuZGlmICovIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIEJFVEFURVNUCisjaWZkZWYgT1MyCisjaWZkZWYgX19EQVRFX18KKyNkZWZpbmUgQkVUQURBVEUKKyNlbmRpZiAvKiBfX0RBVEVfXyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIEJFVEFURVNUICovCisKKyNpZm5kZWYgTUFDCisvKgorICBOb3RlOiBpbml0aWFsaXplIGNrX3NfdGVzdCB0byAiIiBpZiB0aGlzIGlzIG5vdCBhIHRlc3QgdmVyc2lvbi4KKyAgVXNlICgqY2tfc190ZXN0ICE9ICdcMCcpIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHByaW50IHRlc3QtcmVsYXRlZCBtZXNzYWdlcy4KKyovCisjaWZuZGVmIEJFVEFURVNUCisjaWZuZGVmIE9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVU5JWCwgVk1TLCBldGMuLi4gKGkuZS4gQy1LZXJtaXQpICovCitjaGFyICpja19zX3Rlc3QgPSAiIjsJCQkvKiAiRGV2IiwiQWxwaGEiLCJCZXRhIiwiUkMiLCBvciAiIiAqLworY2hhciAqY2tfc190dmVyID0gIiI7CQkJLyogVGVzdCB2ZXJzaW9uIG51bWJlciBvciAiIiAqLworI2Vsc2UgIC8qIE9TMiAqLworY2hhciAqY2tfc190ZXN0ID0gIiI7CQkJLyogKGkuZS4gSzk1KSAqLworY2hhciAqY2tfc190dmVyID0gIiI7CisjZW5kaWYgLyogT1MyICovCisjZWxzZQorY2hhciAqY2tfc190ZXN0ID0gIiI7CQkJLyogRGV2ZWxvcG1lbnQgKi8KK2NoYXIgKmNrX3NfdHZlciA9ICIiOworI2VuZGlmIC8qIEJFVEFURVNUICovCisjZWxzZSAvKiBNQUMgKi8KK2NoYXIgKmNrX3NfdGVzdCA9ICJQcmUtQWxwaGEiOyAgICAgICAgICAvKiBNYWMgS2VybWl0IGlzIGFsd2F5cyBhIHRlc3QuLi4gKi8KK2NoYXIgKmNrX3NfdHZlciA9ICIiOworI2VuZGlmIC8qIE1BQyAqLworCisjaWZkZWYgQkVUQURBVEUgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0ZSBvZiB0aGlzIHZlcnNpb24gb3IgZWRpdCAqLworY2hhciAqY2tfc19kYXRlID0gX19EQVRFX187ICAgICAgICAgICAgIC8qIENvbXBpbGF0aW9uIGRhdGUgKi8KKyNlbHNlCitjaGFyICpja19zX2RhdGUgPSBFRElUREFURTsJCS8qIFNlZSB0b3AgKi8KKworI2VuZGlmIC8qIEJFVEFEQVRFICovCitjaGFyICpidWlsZGlkID0gRURJVE5EQVRFOwkJLyogU2VlIHRvcCAqLworCisjaWZkZWYgVU5JWAorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKUMtS2VybWl0IDguMC4yMTEiOworI2VuZGlmIC8qIFVOSVggKi8KKworY2hhciAqY2tfc192ZXIgPSAiOC4wLjIxMSI7ICAgICAgICAgICAgIC8qIEMtS2VybWl0IHZlcnNpb24gc3RyaW5nICovCitsb25nICBja19sX3ZlciA9ICA4MDAyMTFMOyAgICAgICAgICAgICAgLyogQy1LZXJtaXQgdmVyc2lvbiBudW1iZXIgKi8KKworI2lmZGVmIE9TMgorY2hhciAqY2tfc194dmVyID0gIjIuMi4wIjsJCS8qIFByb2R1Y3Qtc3BlY2lmaWMgdmVyc2lvbiBzdHJpbmcgKi8KK2xvbmcgIGNrX2xfeHZlciA9IDIyMDBMOyAgICAgICAgICAgICAgICAvKiBQcm9kdWN0LXNwZWNpZmljIHZlcnNpb24gbnVtYmVyICovCisjZWxzZQorI2lmZGVmIE1BQworY2hhciAqY2tfc194dmVyID0gIjAuOTk1IjsgICAgICAgICAgICAgIC8qIFByb2R1Y3Qtc3BlY2lmaWMgdmVyc2lvbiBzdHJpbmcgKi8KK2xvbmcgIGNrX2xfeHZlciA9IDk5NUw7ICAgICAgICAgICAgICAgICAvKiBQcm9kdWN0LXNwZWNpZmljIHZlcnNpb24gbnVtYmVyICovCisjZWxzZQorY2hhciAqY2tfc194dmVyID0gIiI7ICAgICAgICAgICAgICAgICAgIC8qIERvbid0IHRvdWNoIHRoZXNlLi4uICovCitsb25nICBja19sX3h2ZXIgPSAwTDsgICAgICAgICAgICAgICAgICAgLyogdGhleSBhcmUgY29tcHV0ZWQgYXQgcnVudGltZSAqLworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgT1MyCisjaWZkZWYgSUtTRE9OTFkKKyNpZmRlZiBOVAorY2hhciAqY2tfc19uYW1lID0gIklLUy1OVCI7CisjZWxzZSAvKiBOVCAqLworY2hhciAqY2tfc19uYW1lID0gIklLUy1PUy8yIjsKKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UgLyogSUtTRE9OTFkgKi8KK2NoYXIgKmNrX3NfbmFtZSA9ICJLZXJtaXQgOTUiOyAgICAgICAgICAvKiBQcm9ncmFtIG5hbWUgKi8KKyNlbmRpZiAvKiBJS1NET05MWSAqLworI2Vsc2UKKyNpZmRlZiBNQUMKK2NoYXIgKmNrX3NfbmFtZSA9ICJNYWMgS2VybWl0IjsKKyNlbHNlCitjaGFyICpja19zX25hbWUgPSAiQy1LZXJtaXQiOworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIE9TMiAqLworCitjaGFyICpja19zX3dobyA9ICIiOyAgICAgICAgICAgICAgICAgICAgLyogV2hlcmUgY3VzdG9taXplZCwgIiIgPSBub3QuICovCitjaGFyICpja19wYXRjaCA9ICIiOyAgICAgICAgICAgICAgICAgICAgLyogUGF0Y2ggaW5mbywgaWYgYW55LiAqLworCisjZGVmaW5lIENLVkVSTEVOIDEyOAorY2hhciB2ZXJzaW94W0NLVkVSTEVOXTsgICAgICAgICAgICAgICAgIC8qIFZlcnNpb24gc3RyaW5nIGJ1ZmZlciAgKi8KK2NoYXIgKnZlcnNpbyA9IHZlcnNpb3g7ICAgICAgICAgICAgICAgICAvKiBUaGVzZSBhcmUgZmlsbGVkIGluIGF0ICovCitsb25nIHZlcm51bSwgeHZlcm51bTsgICAgICAgICAgICAgICAgICAgLyogcnVudGltZSBmcm9tIGFib3ZlLiAgICAqLworCisjZGVmaW5lIENLQ01BSQorCisjaW5jbHVkZSAiY2tjYXNjLmgiICAgICAgICAgICAgICAgICAgICAgLyogQVNDSUkgY2hhcmFjdGVyIHN5bWJvbHMgKi8KKyNpbmNsdWRlICJja2NkZWIuaCIgICAgICAgICAgICAgICAgICAgICAvKiBEZWJ1ZyAmIG90aGVyIHN5bWJvbHMgKi8KKworY2hhciAqIG15bmFtZSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgIC8qIFRoZSBuYW1lIEkgYW0gY2FsbGVkIGJ5ICovCisjaWZuZGVmIE9TMgorY2hhciAqIGV4ZWRpciA9IE5VTEw7ICAgICAgICAgICAgICAgICAgIC8qIERpcmVjdG9yeSBJIHdhcyBleGVjdXRlZCBmcm9tICovCisjZW5kaWYgLyogT1MyICovCitjaGFyICogbXlob21lID0gTlVMTDsJCQkvKiBIb21lIGRpcmVjdG9yeSBvdmVycmlkZSAqLworCisvKiAgQyBLIEMgTSBBIEkgIC0tICBDLUtlcm1pdCBNYWluIHByb2dyYW0gICovCisKKy8qCisgIEF1dGhvcjogRnJhbmsgZGEgQ3J1eiAoZmRjQGNvbHVtYmlhLmVkdSksCisgIENvbHVtYmlhIFVuaXZlcnNpdHkgQWNhZGVtaWMgSW5mb3JtYXRpb24gU3lzdGVtcywgTmV3IFlvcmsgQ2l0eS4KKworQ09QWVJJR0hUIE5PVElDRToKKyovCisKKyNpZmRlZiBPUzIKK2NoYXIgKndpa3NkY3ByW10gPSB7CisiV2luZG93cyBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSBEYWVtb24gKFdJS1NEKToiLAorIkNvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXciLAorIllvcmsuICBBbGwgcmlnaHRzIHJlc2VydmVkLiIsCisiICIsCisiUEVSTUlTU0lPTlM6IiwKKyIgIiwKKyIgIFRoZSBXSUtTRCBzb2Z0d2FyZSBtYXkgYmUgb2J0YWluZWQgZGlyZWN0bHksIGluIGJpbmFyeSBmb3JtIG9ubHksIGZyb20iLAorIiAgdGhlIEtlcm1pdCBQcm9qZWN0IGF0IENvbHVtYmlhIFVuaXZlcnNpdHkgYnkgYW55IGluZGl2aWR1YWwgZm9yIGhpcyBvciIsCisiICBoZXIgT1dOIFVTRSwgYW5kIGJ5IGFueSBjb21wYW55IG9yIG90aGVyIG9yZ2FuaXphdGlvbiBmb3IgaXRzIG93biIsCisiICBJTlRFUk5BTCBESVNUUklCVVRJT04gYW5kIHVzZSwgaW5jbHVkaW5nIGluc3RhbGxhdGlvbiBvbiBzZXJ2ZXJzIHRoYXQiLAorIiAgYXJlIGFjY2Vzc2VkIGJ5IGN1c3RvbWVycyBvciBjbGllbnRzLCBXSVRIT1VUIEVYUExJQ0lUIExJQ0VOU0UuICBBbGwiLAorIiAgb3RoZXIgZm9ybXMgb2YgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBsaWNlbnNlZCBmcm9tIHRoZSBLZXJtaXQgUHJvamVjdCIsCisiICBhdCBDb2x1bWJpYSBVbml2ZXJzaXR5LiAgVGhlc2UgcGVybWlzc2lvbnMgYXBwbHkgb25seSB0byB0aGUgbm9uc2VjdXJlIiwKKyIgIHZlcnNpb24gb2YgV0lLU0QuIiwKKyIgIiwKKyJESVNDTEFJTUVSOiIsCisiICIsCisiICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEFTIElTLCBXSVRIT1VUIFJFUFJFU0VOVEFUSU9OIEZST00gVEhFIiwKKyIgIFRSVVNURUVTIE9GIENPTFVNQklBIFVOSVZFUlNJVFkgSU4gVEhFIENJVFkgT0YgTkVXIFlPUksgQVMgVE8gSVRTIiwKKyIgIEZJVE5FU1MgRk9SIEFOWSBQVVJQT1NFLCBBTkQgV0lUSE9VVCBXQVJSQU5UWSBCWSBUSEUgVFJVU1RFRVMgT0YiLAorIiAgQ09MVU1CSUEgVU5JVkVSU0lUWSBJTiBUSEUgQ0lUWSBPRiBORVcgWU9SSyBPRiBBTlkgS0lORCwgRUlUSEVSIiwKKyIgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRCIsCisiICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIiwKKyIgIFRIRSBUUlVTVEVFUyBPRiBDT0xVTUJJQSBVTklWRVJTSVRZIElOIFRIRSBDSVRZIE9GIE5FVyBZT1JLIFNIQUxMIE5PVCIsCisiICBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTLCBJTkNMVURJTkcgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIiwKKyIgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTSBBUklTSU5HIE9VVCBPUiBJTiIsCisiICBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPRiBUSEUgU09GVFdBUkUsIEVWRU4gSUYgSVQgSEFTIEJFRU4gT1IgSVMiLAorIiAgSEVSRUFGVEVSIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gIFlPVSBTSEFMTCIsCisiICBJTkRFTU5JRlkgQU5EIEhPTEQgSEFSTUxFU1MgVEhFIFRSVVNURUVTIE9GIENPTFVNQklBIFVOSVZFUlNJVFkgSU4iLAorIiAgVEhFIENJVFkgT0YgTkVXIFlPUkssIElUUyBFTVBMT1lFRVMgQU5EIEFHRU5UUyBGUk9NIEFORCBBR0FJTlNUIEFOWSIsCisiICBBTkQgQUxMIENMQUlNUywgREVNQU5EUywgTE9TUywgREFNQUdFIE9SIEVYUEVOU0UgKElOQ0xVRElORyIsCisiICBBVFRPUk5FWVMnIEZFRVMpIEFSSVNJTkcgT1VUIE9GIFlPVVIgVVNFIE9GIFRISVMgU09GVFdBUkUuIiwKKyIgIiwKKyJUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgcGVybWlzc2lvbnMgbm90aWNlLCBhbmQgZGlzY2xhaW1lciBtYXkgbm90IGJlIiwKKyJyZW1vdmVkLCBhbHRlcmVkLCBvciBvYnNjdXJlZCBhbmQgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUiLAorIldJS1NEIHNvZnR3YXJlLiAgVGhlIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YiLAorIk5ldyBZb3JrIHJlc2VydmUgdGhlIHJpZ2h0IHRvIHJldm9rZSB0aGlzIHBlcm1pc3Npb24gaWYgYW55IG9mIHRoZSB0ZXJtcyIsCisib2YgdXNlIHNldCBmb3J0aCBhYm92ZSBhcmUgYnJlYWNoZWQuIiwKKyIgIiwKKyJGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgY29udGFjdCB0aGUgS2VybWl0IFByb2plY3QsIENvbHVtYmlhIFVuaXZlcnNpdHksIiwKKyI2MTIgV2VzdCAxMTV0aCBTdHJlZXQsIE5ldyBZb3JrIE5ZIDEwMDI1LTc3OTksIFVTQTsgUGhvbmUgKzEgKDIxMikgODU0IDM3MDMsIiwKKyJGYXggKzEgKDIxMikgNjYyIDY0NDIsIGtlcm1pdEBjb2x1bWJpYS5lZHUsIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8iLAorIiIKK307CisjZW5kaWYgLyogT1MyICovCisKK2NoYXIgKmNvcHlyaWdodFtdID0geworCisjaWZkZWYgcGRwMTEKKyJDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHksIE5ZQy4iLAorIkFsbCByaWdodHMgcmVzZXJ2ZWQuIiwKKyIgIiwKKyNlbHNlCisjaWZkZWYgT1MyCisiQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LCBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyIsCisiWW9yay4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB1bmRlciBsaWNlbnNlIiwKKyJhbmQgbWF5IG5vdCBiZSByZXByb2R1Y2VkIHdpdGhvdXQgbGljZW5zZSB0byBkbyBzby4gIFRoaXMgY29weXJpZ2h0IG5vdGljZSIsCisibXVzdCBub3QgYmUgcmVtb3ZlZCwgYWx0ZXJlZCwgb3Igb2JzY3VyZWQuIiwKKyIgIiwKKyIgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQVMgSVMsIFdJVEhPVVQgUkVQUkVTRU5UQVRJT04gRlJPTSBUSEUiLAorIiAgVFJVU1RFRVMgT0YgQ09MVU1CSUEgVU5JVkVSU0lUWSBJTiBUSEUgQ0lUWSBPRiBORVcgWU9SSyBBUyBUTyBJVFMiLAorIiAgRklUTkVTUyBGT1IgQU5ZIFBVUlBPU0UsIEFORCBXSVRIT1VUIFdBUlJBTlRZIEJZIFRIRSBUUlVTVEVFUyBPRiIsCisiICBDT0xVTUJJQSBVTklWRVJTSVRZIElOIFRIRSBDSVRZIE9GIE5FVyBZT1JLIE9GIEFOWSBLSU5ELCBFSVRIRVIiLAorIiAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIFRIRSBJTVBMSUVEIiwKKyIgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iLAorIiAgVEhFIFRSVVNURUVTIE9GIENPTFVNQklBIFVOSVZFUlNJVFkgSU4gVEhFIENJVFkgT0YgTkVXIFlPUksgU0hBTEwgTk9UIiwKKyIgIEJFIExJQUJMRSBGT1IgQU5ZIERBTUFHRVMsIElOQ0xVRElORyBTUEVDSUFMLCBJTkRJUkVDVCwgSU5DSURFTlRBTCwiLAorIiAgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNIEFSSVNJTkcgT1VUIE9SIElOIiwKKyIgIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9GIFRIRSBTT0ZUV0FSRSwgRVZFTiBJRiBJVCBIQVMgQkVFTiBPUiBJUyIsCisiICBIRVJFQUZURVIgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiAgWU9VIFNIQUxMIiwKKyIgIElOREVNTklGWSBBTkQgSE9MRCBIQVJNTEVTUyBUSEUgVFJVU1RFRVMgT0YgQ09MVU1CSUEgVU5JVkVSU0lUWSBJTiIsCisiICBUSEUgQ0lUWSBPRiBORVcgWU9SSywgSVRTIEVNUExPWUVFUyBBTkQgQUdFTlRTIEZST00gQU5EIEFHQUlOU1QgQU5ZIiwKKyIgIEFORCBBTEwgQ0xBSU1TLCBERU1BTkRTLCBMT1NTLCBEQU1BR0UgT1IgRVhQRU5TRSAoSU5DTFVESU5HIiwKKyIgIEFUVE9STkVZUycgRkVFUykgQVJJU0lORyBPVVQgT0YgWU9VUiBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4iLAorIiAiLAorI2Vsc2UKKyJDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsIiwKKyIgIFRoZSBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLiIsCisiICBBbGwgcmlnaHRzIHJlc2VydmVkLiIsCisiICIsCisiUEVSTUlTU0lPTlM6IiwKKyIgIiwKKyJUaGUgQy1LZXJtaXQgc29mdHdhcmUgbWF5IGJlIG9idGFpbmVkIGRpcmVjdGx5IGZyb20gdGhlIEtlcm1pdCBQcm9qZWN0IGF0IiwKKyJDb2x1bWJpYSBVbml2ZXJzaXR5IChvciBmcm9tIGFueSBzb3VyY2UgZXhwbGljaXRseSBsaWNlbnNlZCBieSB0aGUgS2VybWl0IiwKKyJQcm9qZWN0IG9yIGltcGxpY2l0bHkgbGljZW5zZWQgYnkgQ2xhdXNlIChBKSBiZWxvdykgYnkgYW55IGluZGl2aWR1YWwgZm9yIiwKKyJoaXMgb3IgaGVyIE9XTiBVU0UsIGFuZCBieSBhbnkgY29tcGFueSBvciBvdGhlciBvcmdhbml6YXRpb24gZm9yIGl0cyBvd24iLAorIklOVEVSTkFMIERJU1RSSUJVVElPTiBhbmQgdXNlLCBpbmNsdWRpbmcgaW5zdGFsbGF0aW9uIG9uIHNlcnZlcnMgdGhhdCBhcmUiLAorImFjY2Vzc2VkIGJ5IGN1c3RvbWVycyBvciBjbGllbnRzLCBXSVRIT1VUIEVYUExJQ0lUIExJQ0VOU0UuIiwKKyIgIiwKKyJDb25kaXRpb25zIGZvciBSRURJU1RSSUJVVElPTiBhcmUgYXMgZm9sbG93czoiLAorIiAiLAorIihBKSBUaGUgQy1LZXJtaXQgc29mdHdhcmUsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5IGZvcm0sIG1heSBiZSIsCisiICAgIGluY2x1ZGVkIFdJVEhPVVQgRVhQTElDSVQgTElDRU5TRSBpbiBkaXN0cmlidXRpb25zIG9mIE9QRVJBVElORyIsCisiICAgIFNZU1RFTVMgdGhhdCBoYXZlIE9TSSAoT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSwgd3d3Lm9wZW5zb3VyY2Uub3JnKSIsCisiICAgIGFwcHJvdmVkIGxpY2Vuc2VzLCBldmVuIGlmIG5vbi1PcGVuLVNvdXJjZSBhcHBsaWNhdGlvbnMgKGJ1dCBub3QiLAorIiAgICBvcGVyYXRpbmcgc3lzdGVtcykgYXJlIGluY2x1ZGVkIGluIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbi4gIFN1Y2giLAorIiAgICBkaXN0cmlidXRpb25zIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIENELVJPTSwgRlRQIHNpdGUsIiwKKyIgICAgV2ViIHNpdGUsIG9yIHByZWluc3RhbGxlZCBzb2Z0d2FyZSBvbiBhIG5ldyBHRU5FUkFMLVBVUlBPU0UiLAorIiAgICBjb21wdXRlciwgYXMgbG9uZyBhcyB0aGUgcHJpbWFyeSBjaGFyYWN0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbiBpcyIsCisiICAgIGFuIE9wZW4gU291cmNlIG9wZXJhdGluZyBzeXN0ZW0gd2l0aCBhY2NvbXBhbnlpbmcgdXRpbGl0aWVzLiAgVGhlIiwKKyIgICAgQy1LZXJtaXQgc291cmNlIGNvZGUgbWF5IG5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgdGhlIGNvbnNlbnQgb2YgdGhlIiwKKyIgICAgS2VybWl0IFByb2plY3QsIHdoaWNoIHdpbGwgbm90IGJlIHVucmVhc29uYWJseSB3aXRoaGVsZCAodGhpcyBpcyIsCisiICAgIHNpbXBseSBhIG1hdHRlciBvZiBrZWVwaW5nIGEgY29uc2lzdGVudCBhbmQgc3VwcG9ydGFibGUgY29kZSBiYXNlKS4iLAorIiAiLAorIihCKSBJbmNsdXNpb24gb2YgQy1LZXJtaXQgc29mdHdhcmUgaW4gd2hvbGUgb3IgaW4gcGFydCwgaW4gYW55IGZvcm0sIGluIiwKKyIgICAgb3Igd2l0aCBhbnkgcHJvZHVjdCBub3QgY292ZXJlZCBieSBDbGF1c2UgKEEpLCBvciBpdHMgZGlzdHJpYnV0aW9uIiwKKyIgICAgYnkgYW55IGNvbW1lcmNpYWwgZW50ZXJwcmlzZSB0byBpdHMgYWN0dWFsIG9yIHBvdGVudGlhbCBjdXN0b21lcnMiLAorIiAgICBvciBjbGllbnRzIGV4Y2VwdCBhcyBpbiBDbGF1c2UgKEEpLCByZXF1aXJlcyBhIGxpY2Vuc2UgZnJvbSB0aGUiLAorIiAgICBLZXJtaXQgUHJvamVjdCwgQ29sdW1iaWEgVW5pdmVyc2l0eTsgY29udGFjdCBrZXJtaXRAY29sdW1iaWEuZWR1LiIsCisiICIsCisiVGhlIG5hbWUgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIiwKKyJwcm9kdWN0cyBkZXJpdmVkIGZyb20gb3IgaW5jbHVkaW5nIHRoZSBDLUtlcm1pdCBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIiwKKyJwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIiwKKyIgIiwKKyJESVNDTEFJTUVSOiIsCisiICIsCisiICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEFTIElTLCBXSVRIT1VUIFJFUFJFU0VOVEFUSU9OIEZST00gVEhFIiwKKyIgIFRSVVNURUVTIE9GIENPTFVNQklBIFVOSVZFUlNJVFkgSU4gVEhFIENJVFkgT0YgTkVXIFlPUksgQVMgVE8gSVRTIiwKKyIgIEZJVE5FU1MgRk9SIEFOWSBQVVJQT1NFLCBBTkQgV0lUSE9VVCBXQVJSQU5UWSBCWSBUSEUgVFJVU1RFRVMgT0YiLAorIiAgQ09MVU1CSUEgVU5JVkVSU0lUWSBJTiBUSEUgQ0lUWSBPRiBORVcgWU9SSyBPRiBBTlkgS0lORCwgRUlUSEVSIiwKKyIgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRCIsCisiICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIiwKKyIgIFRIRSBUUlVTVEVFUyBPRiBDT0xVTUJJQSBVTklWRVJTSVRZIElOIFRIRSBDSVRZIE9GIE5FVyBZT1JLIFNIQUxMIE5PVCIsCisiICBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTLCBJTkNMVURJTkcgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIiwKKyIgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTSBBUklTSU5HIE9VVCBPRiBPUiIsCisiICBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPRiBUSEUgU09GVFdBUkUsIEVWRU4gSUYgSVQgSEFTIEJFRU4gT1IgSVMiLAorIiAgSEVSRUFGVEVSIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gIFlPVSBTSEFMTCIsCisiICBJTkRFTU5JRlkgQU5EIEhPTEQgSEFSTUxFU1MgVEhFIFRSVVNURUVTIE9GIENPTFVNQklBIFVOSVZFUlNJVFkgSU4iLAorIiAgVEhFIENJVFkgT0YgTkVXIFlPUkssIElUUyBFTVBMT1lFRVMgQU5EIEFHRU5UUyBGUk9NIEFORCBBR0FJTlNUIEFOWSIsCisiICBBTkQgQUxMIENMQUlNUywgREVNQU5EUywgTE9TUywgREFNQUdFIE9SIEVYUEVOU0UgKElOQ0xVRElORyIsCisiICBBVFRPUk5FWVMnIEZFRVMpIEFSSVNJTkcgT1VUIE9GIFlPVVIgVVNFIE9GIFRISVMgU09GVFdBUkUuIiwKKyIgIiwKKyJUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgcGVybWlzc2lvbnMgbm90aWNlLCBhbmQgZGlzY2xhaW1lciBtYXkgbm90IGJlIiwKKyJyZW1vdmVkLCBhbHRlcmVkLCBvciBvYnNjdXJlZCBhbmQgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUiLAorIkMtS2VybWl0IHNvZnR3YXJlLiAgVGhlIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YiLAorIk5ldyBZb3JrIHJlc2VydmUgdGhlIHJpZ2h0IHRvIHJldm9rZSB0aGlzIHBlcm1pc3Npb24gaWYgYW55IG9mIHRoZSB0ZXJtcyIsCisib2YgdXNlIHNldCBmb3J0aCBhYm92ZSBhcmUgYnJlYWNoZWQuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBwZHAxMSAqLworCisjaWZkZWYgT1MyCisiUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAxOTk1LCBPeSBPbmxpbmUgU29sdXRpb25zIEx0ZC4sIEp5dmFza3lsYSwgRmlubGFuZC4iLAorI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyJQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDE5OTAsIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kuIiwKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisiUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4iLAorIlBvcnRpb25zIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBieSBBVCZULiIsCisiUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCBFcmljIFlvdW5nIDxlYXlAY3J5cHRvc29mdC5jb20+LiIsCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmIENLX1NSUAorIlBvcnRpb25zIENvcHlyaWdodCAoQykgMTk5NywgU3RhbmZvcmQgVW5pdmVyc2l0eS4iLAorI2VuZGlmIC8qIENLX1NSUCAqLworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisKKyNpZm5kZWYgcGRwMTEKKyIgIiwKKyJGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgY29udGFjdCB0aGUgS2VybWl0IFByb2plY3QsIENvbHVtYmlhIFVuaXZlcnNpdHksIiwKKyI2MTIgV2VzdCAxMTV0aCBTdHJlZXQsIE5ldyBZb3JrIE5ZIDEwMDI1LTc3OTksIFVTQTsgcGhvbmUgKzEgKDIxMikgODU0IDM3MDMsIiwKKyJmYXggKzEgKDIxMikgNjYzIDgyMDIgb3IgKzEgKDIxMikgNjYyIDY0NDIsIGVtYWlsIGtlcm1pdEBjb2x1bWJpYS5lZHUsIiwKKyJXZWIgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LyBvciBodHRwOi8vd3d3Lmtlcm1pdC1wcm9qZWN0Lm9yZy8uIiwKKyNlbmRpZiAvKiBwZHAxMSAqLworIiJ9OworCisvKgorRE9DVU1FTlRBVElPTjoKKworICJVc2luZyBDLUtlcm1pdCIgYnkgRnJhbmsgZGEgQ3J1eiBhbmQgQ2hyaXN0aW5lIE0uIEdpYW5vbmUsCisgIERpZ2l0YWwgUHJlc3MgLyBCdXR0ZXJ3b3J0aC1IZWluZW1hbm4sIFdvYnVybiBNQSwgVVNBLgorICBTZWNvbmQgZWRpdGlvbiAoMTk5NyksIElTQk4gMS01NTU1OC0xNjQtMS4KKyAgT3JkZXIgZnJvbSBEaWdpdGFsIFByZXNzOiAgICArMSAoODAwKSAzNjYtMjY2NQorICBPciBmcm9tIENvbHVtYmlhIFVuaXZlcnNpdHk6ICsxICgyMTIpIDg1NC0zNzAzCisKK0ZvciBLZXJtaXQgOTUsIGFsc286CisKKyAgIktlcm1pdCA5NSIgYnkgQ2hyaXN0aW5lIE0uIEdpYW5vbmUgYW5kIEZyYW5rIGRhIENydXosCisgIE1hbm5pbmcgUHVibGljYXRpb25zLCBHcmVlbndpY2ggQ1QsIFVTQSAoMTk5OCkgLSBPbmxpbmUuCisKK0FDS05PV0xFREdNRU5UUzoKKworICBUaGUgS2VybWl0IGZpbGUgdHJhbnNmZXIgcHJvdG9jb2wgd2FzIGRldmVsb3BlZCBhdCB0aGUgQ29sdW1iaWEgVW5pdmVyc2l0eQorICBDZW50ZXIgZm9yIENvbXB1dGluZyBBY3Rpdml0aWVzIChDVUNDQSksIHdoaWNoIHdhcyBzaW5jZSByZW5hbWVkIHRvIENvbHVtYmlhCisgIFVuaXZlcnNpdHkgQWNhZGVtaWMgSW5mb3JtYXRpb24gU3lzdGVtcyAoQWNJUykuICBLZXJtaXQgaXMgbmFtZWQgYWZ0ZXIKKyAgS2VybWl0IHRoZSBGcm9nLCBzdGFyIG9mIHRoZSB0ZWxldmlzaW9uIHNlcmllcyBUSEUgTVVQUEVUIFNIT1c7IHRoZSBuYW1lIGlzCisgIHVzZWQgYnkgcGVybWlzc2lvbiBvZiBIZW5zb24gQXNzb2NpYXRlcywgSW5jLgorCisgIFRoYW5rcyB0byBhdCBsZWFzdCB0aGUgZm9sbG93aW5nIHBlb3BsZSBmb3IgdGhlaXIgY29udHJpYnV0aW9ucyB0byB0aGlzCisgIHByb2dyYW0gb3ZlciB0aGUgeWVhcnMsIGFuZCBhcG9sb2dpZXMgdG8gYW55b25lIHdobyB3YXMgaW5hZHZlcnRhbnRseQorICBvbWl0dGVkOgorCisgICBDaHJpcyBBZGllLCBFZGluYnVyZ2ggVSwgU2NvdGxhbmQgKE9TLzIpCisgICBSb2JlcnQgQWRzZXR0LCBVbml2ZXJzaXR5IG9mIFdhdGVybG9vLCBDYW5hZGEKKyAgIExhcnJ5IEFmcmluLCBDbGVtc29uIFUKKyAgIFJ1c3MgQWxsYmVyeSwgU3RhbmZvcmQgVQorICAgSmVmZnJleSBBbHRtYW4sIENvbHVtYmlhIFVuaXZlcnNpdHkKKyAgIEdyZWcgQW5kcmV3cywgVGVsZWJpdCBDb3JwCisgICBCYXJyeSBBcmNoZXIsIFUgb2YgTWlzc291cmkKKyAgIFJvYmVydCBBbmRlcnNzb24sIEludGVybmF0aW9uYWwgU3lzdGVtcyBBL1MsIE9zbG8sIE5vcndheQorICAgQ2hyaXMgQXJtc3Ryb25nLCBCcm9va2hhdmVuIE5hdGlvbmFsIExhYiAoT1MvMikKKyAgIFdpbGxpYW0gQmFkZXIsIFNvZnR3YXJlIENvbnN1bHRpbmcgU2VydmljZXMsIE5hemFyZXRoLCBQQQorICAgRnVhdCBCYXJhbiwgQ29sdW1iaWEgVQorICAgU3RhbiBCYXJiZXIsIFJpY2UgVQorICAgSmltIEJhcmJvdXIsIFUgb2YgQ29sb3JhZG8KKyAgIERvbm4gQmF1bWdhcnRuZXIsIERlbGwKKyAgIE5lbHNvbiBCZWViZSwgVSBvZiBVdGFoCisgICBHZXJyeSBCZWxhbmdlciwgQ29nbml0cm9uaWNzCisgICBLYXJsIEJlcnJ5LCBVTUIKKyAgIE1hcmsgQmVycnltYW4sIFNBSUMKKyAgIERlYW4gVyBCZXR0aW5nZXIsIFNVTlkKKyAgIEdhcnkgQmlsa3VzCisgICBQZXRlciBCaW5kZXJ1cCwgRGVubWFyaworICAgRGF2aWQgQm9sZW4sIEFkdmFuY2VkIE5ldHdvcmtzIGFuZCBTZXJ2aWNlcywgSW5jLgorICAgTWFyYyBCb3VjaGVyLCBVIG9mIE1vbnRyZWFsCisgICBDaGFybGVzIEJyb29rcywgRUROCisgICBCb2IgQnJvd24KKyAgIE1pa2UgQnJvd24sIFB1cmR1ZSBVCisgICBKYWNrIEJyeWFucywgQ2FsaWZvcm5pYSBTdGF0ZSBVIGF0IExvbmcgQmVhY2gKKyAgIE1hcmsgQnVkYSwgREVDIChWTVMpCisgICBGZXJuYW5kbyBDYWJyYWwsIFBhZHJhbyBpWCwgQnJhc2lsaWEKKyAgIEJqb3JuIENhcmxzc29uLCBTdG9ja2hvbG0gVW5pdmVyc2l0eSBDb21wdXRlciBDZW50cmUgUVosIFN3ZWRlbgorICAgQmlsbCBDYXRjaGluZ3MsIChmb3JtZXJseSBvZikgQ29sdW1iaWEgVQorICAgQm9iIENhdHRhbmksIENvbHVtYmlhIFUgQ1MgRGVwdAorICAgRGF2aWRlIENlcnZvbmUsIFJvY2hlc3RlciBVCisgICBTZXRoIENoYWlrbGluLCBEZW5tYXJrCisgICBKb2huIENoYW5kbGVyLCBIYXJ2YXJkIFUgLyBTbWl0aHNvbmlhbiBBc3Ryb25vbWljYWwgT2JzZXJ2YXRvcnkKKyAgIEJlcm5hcmQgQ2hlbiwgVUNMQQorICAgQW5kcmV3IEEgQ2hlcm5vdiwgUkVMQ09NIFRlYW0sIE1vc2NvdworICAgSm9obiBMIENobWllbGV3c2tpLCBBVCZULCBMaXNsZSwgSUwKKyAgIEhvd2FyZCBDaHUsIFUgb2YgTWljaGlnYW4KKyAgIEJpbGwgQ29hbHNvbiwgTWNEb25uZWxsIERvdWdsYXMKKyAgIEJlcnRpZSBDb29wZXJzbWl0aCwgTG9uZG9uCisgICBDaGV0IENyZWlkZXIsIFUgb2YgV2VzdGVybiBPbnRhcmlvCisgICBBbGFuIENyb3Nzd2VsbCwgQ29sdW1iaWEgVQorICAgSmVmZiBEYW1lbnMsIChmb3JtZXJseSBvZikgQ29sdW1iaWEgVQorICAgTWFyayBEYXZpZXMsIEJhdGggVSwgVUsKKyAgIFNpbi1pdGlyb3UgRGV6YXdhLCBGdWppZmlsbSwgSmFwYW4KKyAgIEpvZSBSLiBEb3VwbmlrLCBVdGFoIFN0YXRlIFUKKyAgIEZyYW5rIERyZWFubywgSG9uZXl3ZWxsCisgICBKb2huIER1bmxhcCwgVSBvZiBXYXNoaW5ndG9uCisgICBBbGV4IER1cHV5LCBTTUFSVC5DT00KKyAgIERhdmlkIER5Y2ssIEpvaG4gRmx1a2UgTWZnIENvLgorICAgU3RlZmFhbiBBLiBFZWNrZWxzLCBFdXJva29tLCBMdXhlbWJvdXJnCisgICBOaWNrIEVmdGh5bWlvdQorICAgUGF1bCBFZ2dlcnQsIFR3aW4gU3VuLCBJbmMuLCBFbCBTZWd1bmRvLCBDQQorICAgQmVybmllIEVpYmVuLCBERUMKKyAgIFBldGVyIEVpY2hob3JuLCBBc3N5c3QgSW50ZXJuYXRpb25hbAorICAgS3Jpc3RvZmZlciBFcmlrc3NvbiwgUGVyaWRvdCBLb25zdWx0IEFCLCBPZXJlYnJvLCBTd2VkZW4KKyAgIEpvaG4gUi4gRXZhbnMsIElSUywgS2Fuc2FzIENpdHkKKyAgIEdsZW5uIEV2ZXJoYXJ0LCBSQ0EgTGFicworICAgQ2hhcmxpZSBGaW5hbiwgQ3JheSBSZXNlYXJjaAorICAgSGVybSBGaXNjaGVyLCBFbmNpbm8sIENBIChleHRlbnNpdmUgY29udHJpYnV0aW9ucyB0byB2ZXJzaW9uIDQuMCkKKyAgIENhcmwgRm9uZ2hlaXNlciwgQ1dSVQorICAgTWlrZSBGcmVlbWFuLCBCb25uZXZpbGxlIFBvd2VyIEF1dGhvcml0eQorICAgTWFyY2VsbG8gRnJ1dGlnLCBDYXRob2xpYyBVbml2ZXJzaXR5LCBTYW8gUGF1bG8sIEJyYXppbCAoWC4yNSBzdXBwb3J0KQorICAgSGlyb2Z1bWkgRnVqaWksIEphcGFuIE5hdCdsIExhYiBmb3IgSGlnaCBFbmVyZ3kgUGh5c2ljcywgVG9reW8gKEthbmppKQorICAgQ2h1Y2sgRnVsbGVyLCBXZXN0aW5naG91c2UgQ29ycG9yYXRlIENvbXB1dGVyIFNlcnZpY2VzCisgICBBbmR5IEZ5ZmUsIENhbHRlY2gKKyAgIENocmlzdGluZSBNLiBHaWFub25lLCBDb2x1bWJpYSBVCisgICBKb2huIEdpbG1vcmUsIFVDIEJlcmtlbGV5CisgICBNYWRodXN1ZGFuIEdpeXlhcnB1cmFtLCBIUAorICAgUmFpbmVyIEdsYXNjaGljaywgU2llbWVucyBBRywgUGFkZXJib3JuCisgICBXaWxsaWFtIEguIEdsYXNzCisgICBHZXJtYW4gR29sZHN6bWlkdCwgSUJNCisgICBDaHVjayBHb29kaGFydCwgTkFTQQorICAgQWxpc3RhaXIgR29ybWFuLCBOZXcgWmVhbGFuZAorICAgUmljaGFyZCBHcmF0aW9uLCBBREZBLCBBdXN0cmFsaWEKKyAgIENocmlzIEdyZWVuLCBFc3NleCBVLCBVSworICAgQWxhbiBHcmllZywgRHVuZGVlIFRlY2gsIFNjb3RsYW5kCisgICBZZWt0YSBHdXJzZWwsIE1JVAorICAgSmltIEd1eXRvbiwgUmFuZCBDb3JwCisgICBNaWNoYWVsIEhhZXJ0ZWwKKyAgIEJydW5vIEhhaWJsZQorICAgQm9iIEhhaW4sIFVNTgorICAgTWFyaW9uIEhha2Fuc29uLCBPUlNUCisgICBSaWNoYXJkIEhhbWlsdG9uCisgICBKb2huIEhhbWlsc3RvbiwgSW93YSBTdGF0ZSBVCisgICBTaW1vbiBIYW5pYSwgTmV0aGVybGFuZHMKKyAgIFN0YW4gSGFua3MsIFJpY2UgVS4KKyAgIEtlbiBIYXJyZW5zdGVpbiwgU1JJCisgICBFdWdlbmlhIEhhcnJpcywgRGF0YSBHZW5lcmFsIChBT1MvVlMpCisgICBEYXZpZCBIYXJyaXNvbiwgS2luZ3N0b24gV2FycmVuIENvcnAKKyAgIEx1Y2FzIEhhcnQsIE9yZWdvbiBTdGF0ZSBVbml2ZXJzaXR5CisgICBKYW1lcyBIYXJ2ZXksIEluZGlhbmEvUHVyZHVlIFUgKFZNUykKKyAgIFJvYiBIZWFsZXkKKyAgIENodWNrIEhlZHJpY2ssIFJ1dGdlcnMgVQorICAgUm9uIEhlaWJ5LCBUZWNobmljYWwgU3lzdGVtcyBEaXZpc2lvbiwgTW90b3JvbGEgQ29tcHV0ZXIgR3JvdXAKKyAgIFN0ZXZlIEhlbW1pbmdlciwgVGVrdHJvbml4CisgICBDaHJpc3RpYW4gSGVtc2luZywgUldUSCBBYWNoZW4sIEdlcm1hbnkgKE9TLTkpCisgICBSYW5kb2xwaCBIZXJiZXIsIFVTIERPRSwKKyAgIEFuZHJldyBIZXJiZXJ0LCBNb25hc2ggVW5pdiwgQXVzdHJhbGlhCisgICBNYXJjdXMgSGVyYmVydCwgR2VybWFueQorICAgTWlrZSBIaWNrZXksIElUSQorICAgRGFuIEhpbGRlYnJhbmQsIFFOWCBTb2Z0d2FyZSBTeXN0ZW1zIEluYywgS2FuYXRhLCBPTiAoUU5YKQorICAgUiBFIEhpbGwKKyAgIFN0ZXBoYW4gSG9mZm1hbi1FbWRlbgorICAgU3ZlbiBIb2xtc3Ryb20sIEFCQiBVdGlsaXRpZXMgQUIsIFN3ZWRlbgorICAgQmlsbCBIb21lciwgQ3JheSBSZXNlYXJjaAorICAgUmF5IEh1bnRlciwgVGhlIFdvbGxvbmdvbmcgR3JvdXAKKyAgIFJhbmR5IEh1bnR6aWdlciwgTmF0aW9uYWwgTGlicmFyeSBvZiBNZWRpY2luZQorICAgTGFycnkgSmFjb2JzLCBUcmFuc2FyYworICAgU3RldmUgSmVua2lucywgTGFuY2FzdGVyIFVuaXZlcnNpdHksIFVLCisgICBEYXZlIEpvaG5zb24sIEdyYWRpZW50IFRlY2hub2xvZ2llcworICAgTWFyayBCIEpvaG5zb24sIEFwcGxlIENvbXB1dGVyCisgICBKeWtlIEpva2luZW4sIFRhbXBlcmUgVW5pdmVyc2l0eSBvZiBUZWNobm9sb2d5LCBGaW5sYW5kIChRTlgpCisgICBFcmljIEYgSm9uZXMsIEFUJlQKKyAgIEx1a2UgSm9uZXMsIEFUJlQKKyAgIFBldGVyIEpvbmVzLCBVIG9mIFF1ZWJlYyBNb250cmVhbAorICAgUGhpbCBKdWxpYW4sIFNBUyBJbnN0aXR1dGUKKyAgIFBldGVyIEthYmFsLCBVIG9mIFF1ZWJlYworICAgTWljIEthY3ptYXJjemlrLCBVIG9mIFRleGFzIGF0IEF1c3RpbgorICAgU2VyZ2V5IEthcnRhc2hvZmYsIEluc3QuIG9mIFByZWNpc2UgTWVjaGFuaWNzICYgQ29tcHV0ZXIgRXF1aXBtZW50LCBNb3Njb3cKKyAgIEhvd2llIEtheWUsIENvbHVtYmlhIFUKKyAgIFJvYiBLZWRvaW4sIExpbm90eXBlIENvLCBIYXVwcGF1Z2UsIE5ZIChPUy8yKQorICAgUGhpbCBLZWVnc3RyYQorICAgTWFyayBLZW5uZWR5LCBJQk0KKyAgIFRlcnJ5IEtlbm5lZHksIFN0IFBldGVyJ3MgQ29sbGVnZSwgSmVyc2V5IENpdHksIE5KIChWTVMgYW5kIG1vcmUpCisgICAiQ2FybG8gS2lkIiwgVGVjaG5pY2FsIFVuaXZlcnNpdHkgb2YgRGVsZnQsIE5ldGhlcmxhbmRzCisgICBUaW0gS2llbnR6bGUKKyAgIFBhdWwgS2ltb3RvLCBDb3JuZWxsIFUKKyAgIERvdWdsYXMgS2luZ3N0b24sIG1vcmdhbi5jb20KKyAgIExhd3JlbmNlIEtpcmJ5LCBXaWx0c2hpcmUsIFVLCisgICBUb20gS2xvb3MsIFNlcXVlbnQgQ29tcHV0ZXIgU3lzdGVtcworICAgSmltIEtudXRzb24sIFUgb2YgVGV4YXMgYXQgQXVzdGluCisgICBKb2huIFQuIEtvaGwgKEJTREkpCisgICBTY290dCBLcmFtZXIsIFNSSSBJbnRlcm5hdGlvbmFsLCBNZW5sbyBQYXJrLCBDQQorICAgSm9obiBLcmF5bmFjaywgVVMgUG9zdGFsIFNlcnZpY2UKKyAgIERhdmlkIEtyaWNrZXIsIEVuY29yZSBDb21wdXRlcgorICAgVGhvbWFzIEtydWVnZXIsIFVXTQorICAgQm8gS3VsbG1hciwgQUJDIEtsdWJiZW4sIFN0b2NraG9sbSwgYW5kIENlbnRyYWwgQmFuayBvZiBTd2VkZW4sIEtpc3RhCisgICBSLiBCcmFkIEt1bW1lciwgQVQmVCBCZWxsIExhYnMsIEF0bGFudGEsIEdBCisgICBKb2huIEt1bnplLCBVQyBCZXJrZWxleQorICAgRGF2aWQgTGFuZSwgQlNTSSAvIEJlbGxTb3V0aCAoU3RyYXR1cyBWT1MsIFguMjUpCisgICBCb2IgTGFyc29uLCBVU0MgKE9TLTkpCisgICBCZXJ0IExhdmVybWFuLCBHcm9uaW5nZW4gVSwgTmV0aGVybGFuZHMKKyAgIFN0ZXZlIExheXRvbgorICAgRGF2aWQgTGF3eWVyLCBVQyBJcnZpbmUKKyAgIERhdmlkIExlVmluZSwgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBDb3Jwb3JhdGlvbgorICAgRGFuaWVsIFMuIExld2FydCwgVUlVQworICAgUy5PLiBMaWRpZSwgTGVoaWdoIFUKKyAgIFRvciBMaWxscXZpc3QsIEhlbHNpbmtpIFUsIEZpbmxhbmQKKyAgIERhdmlkLU1pY2hhZWwgTGluY2tlLCBVIG9mIFN0IEdhbGxlbiwgU3dpdHplcmxhbmQKKyAgIFJvYmVydCBMaXBlIChmb3IgU0NPIG1ha2VmaWxlIGVudHJpZXMgJiBhZHZpY2UpCisgICBEZWFuIExvbmcKKyAgIE1pa2UgTG9uZywgQW5hbG9nIERldmljZXMsIE5vcndvb2QgTUEKKyAgIEtldmluIExvd2V5LCBVIG9mIFNhc2thdGNoZXdhbiAoT1MvMikKKyAgIEFuZHkgTG93cnksIENvbHVtYmlhIFUKKyAgIEphbWVzIEx1bW1lbCwgQ2FwcmljYSBUZWxlY29tcHV0aW5nIFJlc291cmNlcyAoUU5YKQorICAgRGF2aWQgTWFjS2VuemllLCBFbnZpcm9ubWVudGFsIERlZmVuc2UgRnVuZCwgVSBvZiBNYXJ5bGFuZAorICAgSm9obiBNYWNraW4sIFVuaXZlcnNpdHkgb2YgU2lkbmV5LCBBdXN0cmFsaWEKKyAgIE1hcnRpbiBNYWNsYXJlbiwgQmF0aCBVLCBVSworICAgQ2hyaXMgTWFpbywgQ29sdW1iaWEgVSBDUyBEZXB0CisgICBNb250c2VycmF0IE1hbmUsIEhQLCBHcmVub2JsZSwgRnJhbmNlCisgICBGdWx2aW8gTWFyaW5vLCBPbGl2ZXR0aSwgSXZyZWEsIEl0YWx5CisgICBBcnRodXIgTWFyc2gsIGRpcmNzYS5vcmcuYXUKKyAgIFBldGVyIE1hdXpleSwgTHVjZW50IFRlY2hub2xvZ2llcworICAgVHllIE1jUXVlZW4sIFV0YWggU3RhdGUgVQorICAgVGVkIE1lZGluCisgICBIZWxsbXV0aCBNaWNoYWVsaXMsIEhhbnNlYXRpc2NoZXIgQ29tcHV0ZXJzZXJ2aWNlIEdtYkgsIEhhbWJ1cmcsIEdlcm1hbnkKKyAgIExlc2xpZSBNaWtlc2VsbCwgQW1lcmljYW4gRmFybSBCdXJlYXUKKyAgIFRvZGQgTWlsbGVyLCBDb3VydGVzYW4gQ29uc3VsdGluZworICAgTWFydGluIE1pbm93LCBERUMgKFZNUykKKyAgIFBhd2FuIE1pc3JhLCBCZWxsY29yZQorICAgS2VuIE1pemlhbGtvLCBJQk0sIE1hbmFzc2FzLCBWQQorICAgV29sZmdhbmcgTW9lbGxlciwgREVDVVMgR2VybWFueQorICAgUmF5IE1vb2R5LCBQdXJkdWUgVQorICAgQnJ1Y2UgSiBNb29yZSwgQWxsZW4tQnJhZGxleSBDbywgSGlnaGxhbmQgSGVpZ2h0cywgT0ggKEF0YXJpIFNUKQorICAgU3RldmUgTW9ybGV5LCBDb252ZXgKKyAgIFBldGVyIE1vc3NlbCwgQ29sdW1iaWEgVQorICAgVG9ueSBNb3ZzaG9uLCBOWVUKKyAgIExvdSBNdWNjaW9saSwgU3dhbnNvbiBBbmFseXNpcyBTeXN0ZW1zCisgICBEYW4gTXVycGh5CisgICBOZWFsIFAuIE11cnBoeSwgSGFyc29mIFN5c3RlbXMsIFdvbmRlciBMYWtlIElMCisgICBHYXJ5IE11c3NhcgorICAgSm9obiBOYWxsLCBGU1UKKyAgIEphY2sgTmVsc29uLCBVIG9mIFBpdHRzYnVyZ2gKKyAgIEppbSBOb2JsZSwgUGxhbm5pbmcgUmVzZWFyY2ggQ29ycG9yYXRpb24gKE1hY2ludG9zaCkKKyAgIElhbiBPJ0JyaWVuLCBCYXRoIFUsIFVLCisgICBNZWxpc3NhIE8nTmVpbGwsIFNGVQorICAgSm9obiBPd2VucworICAgVGhvbWFzIFBpbmtsLCBIZWFsdGggQnVzaW5lc3MgU3lzdGVtcyBJbmMuCisgICBNaWNoYWVsIFBpbnMsIElvd2EgQ29tcHV0ZXIgQWlkZWQgRW5naW5lZXJpbmcgTmV0d29yaworICAgQW5kcmUnIFBpcmFyZCwgVW5pdmVyc2l0eSBvZiBMaWVnZSwgQmVsZ2l1bQorICAgUGF1bCBQbGFjZXdheSwgT2hpbyBTdGF0ZSBVCisgICBQaWV0IFcuIFBsb21wLCBJQ0NFLCBHcm9uaW5nZW4gVW5pdmVyc2l0eSwgTmV0aGVybGFuZHMKKyAgIEtlbiBQb3VsdG9uLCBIUCBMYWJzCisgICBNYW5mcmVkIFByYW5nZSwgT2FrbGFuZCBVCisgICBDaHJpc3RvcGhlciBQcmF0dCwgQVBWIEJha2VyLCBVSworICAgRnJhbmsgUHJpbmRsZSwgTkFEQworICAgVG9ueSBRdWVydWJpbiwgVSBvZiBIYXdhaWkKKyAgIEplYW4tUGllcnJlIFJhZGxleQorICAgQW50b24gUmFuZworICAgU2NvdHQgUmliZQorICAgQWxhbiBSb2JpZXR0ZSwgT3hmb3JkIFVuaXZlcnNpdHksIFVLCisgICBNaWNoZWwgUm9iaXRhaWxsZSwgVSBvZiBNb250cmVhbCAoTWFjKQorICAgSHV3IFJvZ2VycywgU2Nod2VpemVyaXNjaGUgS3JlZGl0YW5zdGFsdCwgWnVlcmljaAorICAgTmlnZWwgUm9sZXMsIENhbWJyaWRnZSwgRW5nbGFuZAorICAgS2FpIFV3ZSBSb21tZWwsIFRlY2huaXNjaGUgVW5pdmVyc2l0YWV0IE11ZW5jaGVuIChPUy8yKQorICAgTGFycnkgUm9zZW5tYW4gKEFtaWdhKQorICAgSmF5IFJvdW1hbiwgVSBvZiBNaWNoaWdhbgorICAgSmFjayBSb3VzZSwgU0FTIEluc3RpdHV0ZSAoRGF0YSBHZW5lcmFsIGFuZC9vciBBcG9sbG8pCisgICBTdGV3IFJ1YmVuc3RlaW4sIEhhcnZhcmQgVSAoVk1TKQorICAgR2VyaGFyZCBSdWVja2xlLCBGSCBEYXJtc3RhZHQsIEZiLiBFL0F1dG9tYXRpc2llcnVuZ3N0ZWNobmlrCisgICBKb2huIFNhbnRvcywgRUcmSAorICAgQmlsbCBTY2hpbGl0LCBDb2x1bWJpYSBVCisgICBVbGxpIFNjaGx1ZXRlciwgUldUSCBBYWNoZW4sIEdlcm1hbnkgKE9TLTksIGV0YykKKyAgIE1pY2hhZWwgU2NobWlkdCwgVSBvZiBQYWRlcmJvcm4sIEdlcm1hbnkKKyAgIEVyaWMgU2Nobm9lYmVsZW4sIENvbnZleAorICAgQmVubiBTY2hyZWliZXIsIERFQworICAgRGFuIFNjaHVsbG1hbiwgREVDIChtb2RlbXMsIERJQUwgY29tbWFuZCwgZXRjKQorICAgSm9obiBTY2h1bHR6LCAzTQorICAgU3RldmVuIFNjaHVsdHosIENvbnRlbCAoUERQLTExKQorICAgQVBQUCBTY29yZXIsIExlZWRzIFBvbHl0ZWNobmljLCBVSworICAgR29yZG9uIFNjb3R0LCBNaWNybyBGb2N1cywgTmV3YnVyeSBVSworICAgR2lzYmVydCBXLiBTZWxrZSwgV0lkTywgQm9ubiwgR2VybWFueQorICAgRGF2aWQgU2luZ2VyLCBJQk0gQWxtYWRlbiBSZXNlYXJjaCBMYWJzCisgICBEYXZpZCBTaXplbGFuZCwgVSBvZiBMb25kb24gTWVkaWNhbCBTY2hvb2wKKyAgIEZyaWRyaWsgU2t1bGFzb24sIEljZWxhbmQKKyAgIFJpY2sgU2xhZGtleSAoTGludXgpCisgICBEYXZlIFNsYXRlCisgICBCcmFkbGV5IFNtaXRoLCBVQ0xBCisgICBGcmVkIFNtaXRoLCBNZXJrIC8gQ29tcHV0cml0aW9uCisgICBSaWNoYXJkIFMgU21pdGgsIENhbCBTdGF0ZQorICAgUnlhbiBTdGFuaXNmZXIsIFVOVAorICAgQmVydGlsIFN0ZW5zdHJvZW0sIFN0b2NraG9sbSBVbml2ZXJzaXR5IENvbXB1dGVyIENlbnRyZSAoUVopLCBTd2VkZW4KKyAgIEphbWVzIFN0dXJkZXZhbnQsIENBUCBHRU1FTkkgQU1FUklDQSwgTWlubmVhcG9saXMKKyAgIFBldGVyIFN2YW5iZXJnLCBSb3lhbCBUZWNobi4gSFMsIFN3ZWRlbgorICAgSmFtZXMgUi4gU3dlbnNvbiwgQWNjdS1XZWF0aGVyLCBJbmMuCisgICBUZWQgVCdzbywgTUlUIChMaW51eCkKKyAgIEFuZHkgVGFuZW5iYXVtLCBWcmlqZSBVLCBBbXN0ZXJkYW0sIE5ldGhlcmxhbmRzCisgICBHbGVuIFRob2JlCisgICBNYXJra3UgVG9pamFsYSwgSGVsc2lua2kgVSBvZiBUZWNobm9sb2d5CisgICBUZWVtdSBUb3JtYSwgSGVsc2lua2kgVSBvZiBUZWNobm9sb2d5CisgICBMaW51cyBUb3J2YWxkcywgSGVsc2lua2kKKyAgIFJpY2sgVHJveGVsLCBOSUgKKyAgIFdhcnJlbiBUdWNrZXIsIFRyaWRvbSBDb3JwLCBNb3VudGFpbiBQYXJrLCBHQQorICAgRGF2ZSBUd2V0ZW4sIEFNRVMtTkFTCisgICBHIFVkZGVib3JnLCBTd2VkZW4KKyAgIFdhbHRlciBVbmRlcndvb2QsIEZvcmQgQWVyb3NwYWNlCisgICBQaWV0ZXIgVmFuIERlciBMaW5kZW4sIENlbnRyZSBNb25kaWFsLCBQYXJpcworICAgR2UgdmFuIEdlbGRvcnAsIE5ldGhlcmxhbmRzCisgICBGcmVkIHZhbiBLZW1wZW4sIE1JTklYIFVzZXIgR3JvdXAsIFZvb3Job3V0LCBOZXRoZXJsYW5kcworICAgV2F5bmUgVmFuIFBlbHQsIEdFL0NSRAorICAgTWFyayBWYXNvbGwsIE9rbGFob21hIFN0YXRlIFUgKFY3IFVOSVgpCisgICBLb25zdGFudGluIFZpbm9ncmFkb3YsIElDU1RJLCBNb3Njb3cKKyAgIFBhdWwgVml4aWUsIERFQworICAgQmVybmllIFZvbHosIFByb2Nlc3MgU29mdHdhcmUKKyAgIEVkdWFyZCBWb3BpY2thLCBQcmFndWUgVW5pdmVyc2l0eSBvZiBFY29ub21pY3MsIEN6ZWNoIFJlcHVibGljCisgICBEaW1pdHJpIFZ1bGlzLCBDVU5ZCisgICBSb2dlciBXYWxsYWNlLCBSYXl0aGVvbgorICAgU3RlcGhlbiBXYWx0b24sIENhbGlmIFN0YXRlIFUsIE5vcnRocmlkZ2UgKEFtaWdhKQorICAgSmFtaWUgV2F0c29uLCBBZGFzb2Z0LCBTd2l0emVybGFuZCAoQUlYKQorICAgUmljayBXYXRzb24sIFUgb2YgVGV4YXMgKE1hY2ludG9zaCkKKyAgIFNjb3R0IFdlaWthcnQgKEFzc29jaWF0aW9uIGZvciBQcm9ncmVzc2l2ZSBDb21tdW5pY2F0aW9ucykKKyAgIFJvYmVydCBXZWluZXIsIFByb2dyYW1taW5nIFBsdXMsIE5ldyBZb3JrIENpdHkKKyAgIExhdXJlbiBXZWluc3RlaW4sIFZvcnRleCBUZWNobmxvZ3kKKyAgIERhdmlkIFdleGVsYmxhdCwgQVQmVAorICAgQ2xhcmsgV2llcmRhLCBJbGx1bWluYXRpIE9ubGluZQorICAgSm9hY2hpbSBXaWVzZWwsIFUgb2YgS2FybHNydWhlCisgICBMb24gV2lsbGV0dCwgVSBvZiBVdGFoCisgICBNaWNoYWVsIFdpbGxpYW1zLCBVQ0xBCisgICBOYXRlIFdpbGxpYW1zLCBVIG9mIE1vbnRhbmEKKyAgIERhdmlkIFdpbHNvbgorICAgSm9lbGxlbiBXaW5kc29yLCBVIG9mIEFyaXpvbmEKKyAgIFBhdHJpY2sgV29sZmUsIEt1Y2sgJiBBc3NvY2lhdGVzLCBJbmMuCisgICBHcmVnZyBXb25kZXJseSwgT2tsYWhvbWEgU3RhdGUgVSAoVjcgVU5JWCkKKyAgIEZhcnJlbGwgV29vZHMsIENvbmN1cnJlbnQgKGZvcm1lcmx5IE1hc3Njb21wKQorICAgRGF2ZSBXb29sbGV5LCBDQVAgQ29tbXVuaWNhdGlvbiBTeXN0ZW1zLCBMb25kb24KKyAgIEphY2sgV29vbGxleSwgU0NUIENvcnAKKyAgIEZyYW5rIFdvcnRuZXIKKyAgIEtlbiBZYXAsIGZvcm1lcmx5IG9mIFUgb2YgUm9jaGVzdGVyCisgICBKb2huIFplZWZmLCBBbm4gQXJib3IsIE1JCisqLworCisjaW5jbHVkZSAiY2tja2VyLmgiICAgICAgICAgICAgICAgICAgICAgLyogS2VybWl0IHN5bWJvbHMgKi8KKyNpbmNsdWRlICJja2NuZXQuaCIgICAgICAgICAgICAgICAgICAgICAvKiBOZXR3b3JrIHN5bWJvbHMgKi8KKworI2lmZGVmIENLX1NTTAorI2luY2x1ZGUgImNrX3NzbC5oIgorI2VuZGlmIC8qIENLX1NTTCAqLworCisjaWZuZGVmIE5PU1BMCisjaW5jbHVkZSAiY2t1dXNyLmgiCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIE9TMk9OTFkKKyNkZWZpbmUgSU5DTF9WSU8gICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkZWQgZm9yIGNrb2Nvbi5oICovCisjaW5jbHVkZSA8b3MyLmg+CisjdW5kZWYgQ09NTUVOVAorI2VuZGlmIC8qIE9TMk9OTFkgKi8KKworI2lmZGVmIE5UCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHRhcGkuaD4KKyNpbmNsdWRlICJja250YXAuaCIKKyNlbmRpZiAvKiBOVCAqLworCisjaWZuZGVmIE5PU0VSVkVSCisvKiBUZXh0IG1lc3NhZ2UgZGVmaW5pdGlvbnMuLiBlYWNoIHNob3VsZCBiZSAyNTYgY2hhcnMgbG9uZywgb3IgbGVzcy4gKi8KKyNpZmRlZiBNSU5JWAorY2hhciAqc3J2dHh0ID0gIlxyXG5cCitFbnRlcmluZyBzZXJ2ZXIgbW9kZS5cclxuXDAiOworI2Vsc2UKKyNpZmRlZiBPTERNU0cKKy8qCisgIEl0IHNlZW1zIHRoZXJlIHdhcyBhIGxhcmdlIGluc3RhbGxhdGlvbiB0aGF0IHdhcyB1c2luZyBDLUtlcm1pdCA1QSgxNjUpCisgIG9yIHRoZXJlYWJvdXRzLCB3aGljaCBoYWQgZGVwbG95ZWQgdGhvdXNhbmRzIG9mIE1TLURPUyBLZXJtaXQgc2NyaXB0cyBpbgorICBzY2F0dGVyZWQgbG9jYXRpb25zIHRoYXQgbG9va2VkIGZvciBzdHJpbmdzIGluIHRoZSBvbGQgc2VydmVyIG1lc3NhZ2UsCisgIHdoaWNoIGNoYW5nZWQgaW4gNUEoMTgzKSwgQXVndXN0IDE5OTIuCisqLworY2hhciAqc3J2dHh0ID0gIlxyXG5cCitDLUtlcm1pdCBzZXJ2ZXIgc3RhcnRpbmcuICBSZXR1cm4gdG8geW91ciBsb2NhbCBtYWNoaW5lIGJ5IHR5cGluZ1xyXG5cCitpdHMgZXNjYXBlIHNlcXVlbmNlIGZvciBjbG9zaW5nIHRoZSBjb25uZWN0aW9uLCBhbmQgaXNzdWUgZnVydGhlclxyXG5cCitjb21tYW5kcyBmcm9tIHRoZXJlLiAgVG8gc2h1dCBkb3duIHRoZSBDLUtlcm1pdCBzZXJ2ZXIsIGlzc3VlIHRoZVxyXG5cCitGSU5JU0ggb3IgQllFIGNvbW1hbmQgYW5kIHRoZW4gcmVjb25uZWN0LlxuXAorXHJcblwwIjsKKyNlbHNlCisjaWZkZWYgT1NLCitjaGFyICpzcnZ0eHQgPSAiXHJcMDEyXAorRW50ZXJpbmcgc2VydmVyIG1vZGUuICBJZiB5b3VyIGxvY2FsIEtlcm1pdCBzb2Z0d2FyZSBpcyBtZW51IGRyaXZlbiwgdXNlXHJcMDEyXAordGhlIG1lbnVzIHRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIHNlcnZlci4gIE90aGVyd2lzZSwgZW50ZXIgdGhlIGVzY2FwZVxyXDAxMlwKK3NlcXVlbmNlIHRvIHJldHVybiB0byB5b3VyIGxvY2FsIEtlcm1pdCBwcm9tcHQgYW5kIGlzc3VlIGNvbW1hbmRzIGZyb21cclwwMTJcCit0aGVyZS4gVXNlIFNFTkQgYW5kIEdFVCBmb3IgZmlsZSB0cmFuc2Zlci4gVXNlIFJFTU9URSBIRUxQIGZvciBhIGxpc3Qgb2ZcclwwMTJcCitvdGhlciBhdmFpbGFibGUgc2VydmljZXMuICBVc2UgQllFIG9yIEZJTklTSCB0byBlbmQgc2VydmVyIG1vZGUuXHJcMDEyXDAiOworI2Vsc2UgLyogVU5JWCwgVk1TLCBBT1MvVlMsIGFuZCBhbGwgb3RoZXJzICovCitjaGFyICpzcnZ0eHQgPSAiXHJcblwKK0VudGVyaW5nIHNlcnZlciBtb2RlLiAgSWYgeW91ciBsb2NhbCBLZXJtaXQgc29mdHdhcmUgaXMgbWVudSBkcml2ZW4sIHVzZVxyXG5cCit0aGUgbWVudXMgdG8gc2VuZCBjb21tYW5kcyB0byB0aGUgc2VydmVyLiAgT3RoZXJ3aXNlLCBlbnRlciB0aGUgZXNjYXBlXHJcblwKK3NlcXVlbmNlIHRvIHJldHVybiB0byB5b3VyIGxvY2FsIEtlcm1pdCBwcm9tcHQgYW5kIGlzc3VlIGNvbW1hbmRzIGZyb21cclxuXAordGhlcmUuICBVc2UgU0VORCBhbmQgR0VUIGZvciBmaWxlIHRyYW5zZmVyLiAgVXNlIFJFTU9URSBIRUxQIGZvciBhIGxpc3Qgb2ZcclxuXAorb3RoZXIgYXZhaWxhYmxlIHNlcnZpY2VzLiAgVXNlIEJZRSBvciBGSU5JU0ggdG8gZW5kIHNlcnZlciBtb2RlLlxyXG5cMCI7CisjZW5kaWYgLyogT1NLICovCisjZW5kaWYgLyogT0xETVNHICovCisjZW5kaWYgLyogTUlOSVggKi8KKyNlbHNlICAvKiBzZXJ2ZXIgbW9kZSBkaXNhYmxlZCAqLworY2hhciAqc3J2dHh0ID0gIiI7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKworaW50IGluaXRmbGcgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5c2luaXQoKSBoYXMgZXhlY3V0ZWQuLi4gKi8KK2ludCBob3djYWxsZWQgPSBJX0FNX0tFUk1JVDsgICAgICAgICAgICAvKiBIb3cgSSB3YXMgY2FsbGVkICovCitpbnQgaG10b3BsaW5lID0gMDsKK2ludCBxdWl0dGluZyA9IDA7CQkJLyogSSdtIGluIHRoZSBhY3Qgb2YgcXVpdHRpbmcgKi8KKworI2lmZGVmIElLU0RDT05GCitjaGFyICogaWtzZGNvbmYgPSBJS1NEQ09ORjsgICAgICAgICAgICAgLyogSUtTRCBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCAgICBpa3NkY2YgICA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBIYXMgSUtTRCBjLmYuIGJlZW4gcHJvY2Vzc2VkPyAqLworI2VuZGlmIC8qIElLU0RDT05GICovCisKK2ludCBzcnZjZG1zZyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBbU2VydmVyXSBDRCBtZXNzYWdlICovCitjaGFyICogY2Rtc2dmaWxlWzhdID0geyBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwgfTsKK2NoYXIgKiBjZG1zZ3N0ciA9IE5VTEw7CitjaGFyICogY2tjZHBhdGggPSBOVUxMOworCisjaWZkZWYgTkxDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGV4dC1maWxlIGxpbmUgdGVybWluYXRvciAqLworQ0hBUiBmZW9sID0gTkxDSEFSOworI2Vsc2UKK0NIQVIgZmVvbCA9IDA7CisjZW5kaWYgLyogTkxDSEFSICovCisKK2ludCBmYmxrc2l6ID0gREJMS1NJWjsgICAgICAgICAgLyogRmlsZSBibG9ja3NpemUgKi8KK2ludCBmcmVjbCA9IERMUkVDTDsgICAgICAgICAgICAgLyogRmlsZSByZWNvcmQgbGVuZ3RoICovCitpbnQgZnJlY2ZtID0gWFlGRl9TOyAgICAgICAgICAgIC8qIEZpbGUgcmVjb3JkIGZvcm1hdCAoZGVmYXVsdCA9IHN0cmVhbSkgKi8KK2ludCBmb3JnID0gWFlGT19TOyAgICAgICAgICAgICAgLyogRmlsZSBvcmdhbml6YXRpb24gKHNlcXVlbnRpYWwpICovCitpbnQgZmNjdHJsID0gWFlGUF9OOyAgICAgICAgICAgIC8qIEZpbGUgY2FycmlhZ2UgY29udHJvbCAoY3RybCBjaGFycykgKi8KK2ludCBmaWxlY2FzZSA9IEZJTEVDQVNFOyAgICAgICAgLyogQ2FzZSBtYXR0ZXJzIGluIGZpbGVuYW1lcyAqLworaW50IHN0YXRoYWNrID0gMTsgICAgICAgICAgICAgICAvKiBGYXN0IGRpcmVjdG9yeSBsb29rdXBzIGJ5IGRlZmF1bHQgKi8KKworY2hhciB1aWRidWZbVUlEQlVGTEVOXSA9IHsgTlVMLCBOVUwgfTsgIC8qIFVzZXIgSUQgYnVmZmVyICovCitpbnQgY2ZpbGVmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXBwbGljYXRpb24gKCJrZXJiYW5nIikgZmlsZSBmbGFnICovCitjaGFyIGNtZGZpbFtDS01BWFBBVEggKyAxXSA9IHsgTlVMLCBOVUwgfTsgLyogQXBwbGljYXRpb24gZmlsZSBuYW1lICovCitpbnQgaGF2ZXVybCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVVJMIGdpdmVuIG9uIGNvbW1hbmQgbGluZSAqLworCisjaWZuZGVmIE5PWEZFUgorLyogTXVsdGktcHJvdG9jb2wgc3VwcG9ydCAqLworCitzdHJ1Y3QgY2tfcCBwdGFiW05QUk9UT1NdID0geyAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgS2VybWl0IHBhcnQgLi4uICovCisgIHsgIktlcm1pdCIsCisgICAgRFJQU0laLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVjZWl2ZSBwYWNrZXQgc2l6ZSAqLworICAgIERTUFNJWiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlbmQgcGFja2V0IHNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZW5kLXBhY2tldC1zaXplLXNldCBmbGFnICovCisgICAgREZXU0laLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2luZG93IHNpemUgKi8KKworI2lmZGVmIE5FV0RFRkFVTFRTCisgICAgUFhfQ0FVLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBjaGFyIHVucHJlZml4aW5nLi4uICovCisjZWxzZQorICAgIFBYX0FMTCwKKyNlbmRpZiAvKiBORVdERUZBVUxUUyAqLworCisjaWZkZWYgVk1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBmaWxlbmFtZSBjb2xsaXNpb24gYWN0aW9uICovCisgICAgWFlGWF9YLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUkVQTEFDRSBmb3IgVkFYL1ZNUyAqLworI2Vsc2UKKyAgICBYWUZYX0IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCQUNLVVAgZm9yIGV2ZXJ5Ym9keSBlbHNlICovCisjZW5kaWYgLyogVk1TICovCisKKyNpZmRlZiBPUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBmaWxlIG5hbWUgY29udmVyc2lvbiAqLworICAgIFhZRk5fTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpdGVyYWwgZm9yIE9TMiAqLworI2Vsc2UKKyAgICBYWUZOX0MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0ZWQgZm9yIG90aGVycyAqLworI2VuZGlmIC8qIE9TMiAqLworCisgICAgUEFUSF9PRkYsICAgICAgICAgICAgICAgICAgIC8qIFNlbmQgcGF0aG5hbWVzIE9GRiAqLworICAgIFBBVEhfQVVUTywgICAgICAgICAgICAgICAgICAvKiBSZWNlaXZlIHBhdGhuYW1lcyBBVVRPICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEhvc3QgcmVjZWl2ZSBpbml0aWF0aW9uIHN0cmluZyAoYmluYXJ5KSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBIb3N0IHJlY2VpdmUgaW5pdGlhdGlvbiBzdHJpbmcgKHRleHQpICAgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogSG9zdCBzZXJ2ZXIgc3RyaW5nICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4dGVybmFsIHByb3RvY29sIHNlbmQgY29tbWFuZCAoYmluYXJ5KSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHRlcm5hbCBwcm90b2NvbCBzZW5kIGNvbW1hbmQgKHRleHQpICAgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogRXh0ZXJuYWwgcHJvdG9jb2wgcmVjZWl2ZSBjb21tYW5kIChiaW4pICovCisgICAgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgIC8qIEV4dGVybmFsIHByb3RvY29sIHJlY2VpdmUgY29tbWFuZCAodHh0KSAqLworI2lmZGVmIENLX1hZWgorLAoreyJYTU9ERU0iLCAgICAxMjgsMTI4LC0xLC0xLCAgIDEsLTEsLTEsMCwwLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEx9LAoreyJYTU9ERU0tQ1JDIiwxMjgsMTI4LC0xLC0xLCAgLTEsLTEsLTEsMCwwLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEx9LAoreyJZTU9ERU0iLCAgIC0xLCAtMSwtMSwtMSwgICAgLTEsLTEsLTEsMCwwLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEx9LAoreyJZTU9ERU0tZyIsIC0xLCAtMSwtMSwtMSwgICAgLTEsLTEsLTEsMCwwLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEx9LAoreyJaTU9ERU0iLCAgIC0xLCAtMSwtMSwtMSxQWF9XSUwsLTEsLTEsMCwwLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEx9LAoreyJPdGhlciIsICAgIC0xLCAtMSwtMSwtMSwgICAgLTEsLTEsLTEsMCwwLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEx9CisjZW5kaWYgLyogQ0tfWFlaICovCit9OworCisvKiBEZWNsYXJhdGlvbnMgZm9yIFNlbmQtSW5pdCBQYXJhbWV0ZXJzICovCisKK2ludCBzcHNpeiA9IERTUFNJWiwgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHBhY2tldCBzaXplIHRvIHNlbmQgKi8KKyAgICBzcG1heCA9IERTUFNJWiwgICAgICAgICAgICAgICAgICAgICAvKiBCaWdnZXN0IHBhY2tldCBzaXplIHdlIGNhbiBzZW5kICovCisgICAgbGFzdHNwbWF4ID0gRFNQU0laLCAgICAgICAgICAgICAgICAgLyogU2VuZC1wYWNrZXQgc2l6ZSBsYXN0IHVzZWQgKi8KKyAgICBzcHNpenIgPSBEU1BTSVosICAgICAgICAgICAgICAgICAgICAvKiBTZW5kLXBhY2tldCBzaXplIHJlcXVlc3RlZCAqLworICAgIHNwc2l6ZiA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgdG8gb3ZlcnJpZGUgc2l6ZSBuZWdvdGlhdGlvbiAqLworICAgIHJwc2l6ID0gRFJQU0laLCAgICAgICAgICAgICAgICAgICAgIC8qIEJpZ2dlc3Qgd2Ugd2FudCB0byByZWNlaXZlICovCisgICAgdXJwc2l6ID0gRFJQU0laLCAgICAgICAgICAgICAgICAgICAgLyogVXNlci1yZXF1ZXN0ZWQgcmVjZWl2ZSBwa3Qgc2l6ZSAqLworICAgIG1heHJwcyA9IE1BWFJQLCAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gaW5jb21pbmcgbG9uZyBwYWNrZXQgc2l6ZSAqLworICAgIG1heHNwcyA9IE1BWFNQLCAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gb3V0Ym91bmQgbC5wLiBzaXplICovCisgICAgbWF4dHJ5ID0gTUFYVFJZLCAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSByZXRyaWVzIHBlciBwYWNrZXQgKi8KKyAgICB3c2xvdHMgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaW5kb3cgc2l6ZSBjdXJyZW50bHkgaW4gdXNlICovCisgICAgd3Nsb3RyID0gREZXU0laLCAgICAgICAgICAgICAgICAgICAgLyogV2luZG93IHNpemUgZnJvbSBTRVQgV0lORE9XICovCisgICAgd3Nsb3RuID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2luZG93IHNpemUgbmVnb3RpYXRlZCBpbiBTLXBrdCAqLworICAgIHRpbWVvdXRzID0gMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBzdGF0aXN0aWNzIHJlcG9ydGluZyAqLworICAgIHNwYWNrZXRzID0gMCwgICAgICAgICAgICAgICAgICAgICAgIC8qICAuLi4gKi8KKyAgICBycGFja2V0cyA9IDAsICAgICAgICAgICAgICAgICAgICAgICAvKiAgLi4uICovCisgICAgcmV0cmFucyA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogIC4uLiAqLworICAgIGNydW5jaGVkID0gMCwgICAgICAgICAgICAgICAgICAgICAgIC8qICAuLi4gKi8KKyAgICB3bWF4ID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgLi4uICovCisgICAgd2N1ciA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIC4uLiAqLworICAgIHNydmlkbCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlcnZlciBpZGxlIHRpbWVvdXQgKi8KKyAgICBzcnZkaXMgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXJ2ZXIgZmlsZSB4ZmVyIGRpc3BsYXkgKi8KKyAgICBzcnZ0aW0gPSBEU1JWVElNLCAgICAgICAgICAgICAgICAgICAvKiBTZXJ2ZXIgY29tbWFuZCB3YWl0IHRpbWVvdXQgKi8KKyAgICBzcnZwaW5nID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXJ2ZXIga2VlcGFsaXZlICovCisvKgorICB0aW1pbnQgaXMgdGhlIHRpbWVvdXQgaW50ZXJ2YWwgSSB1c2Ugd2hlbiB3YWl0aW5nIGZvciBhIHBhY2tldC4KKyAgcGt0dGltIGlzIHRoZSBTRVQgUkVDRUlWRSBUSU1FT1VUIHZhbHVlLCBzZW50IHRvIHRoZSBvdGhlciBLZXJtaXQuCisgIHJ0aW1vIGlzIHRoZSBTRVQgU0VORCBUSU1FT1VUIHZhbHVlLiAgcnRpbW8gaXMgdGhlIGluaXRpYWwgdmFsdWUgb2YKKyAgdGltaW50LiAgdGltaW50IGlzIGNoYW5nZWQgYnkgdGhlIHZhbHVlIGluIHRoZSBpbmNvbWluZyBuZWdvdGlhdGlvbgorICBwYWNrZXQgdW5sZXNzIGEgU0VUIFNFTkQgVElNRU9VVCBjb21tYW5kIHdhcyBnaXZlbi4KKyovCisgICAgdGltaW50ID0gRE1ZVElNLCAgICAgICAgICAgICAgICAgICAgLyogVGltZW91dCBpbnRlcnZhbCBJIHVzZSAqLworICAgIHBrdHRpbSA9IFVSVElNRSwgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVvdXQgSSB3YW50IHlvdSB0byB1c2UgKi8KKyAgICBydGltbyA9IERNWVRJTSwgICAgICAgICAgICAgICAgICAgICAvKiBOb3JtYWwgcGFja2V0IHdhaXQgdGltZW91dCAqLworICAgIHRpbWVmID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgdG8gb3ZlcnJpZGUgd2hhdCB5b3UgYXNrICovCisjaWZkZWYgQ0tfVElNRVJTCisgICAgcnR0ZmxnID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlIGR5bmFtaWMgcm91bmQtdHJpcCB0aW1lcnMgKi8KKyNlbHNlCisgICAgcnR0ZmxnID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlIGZpeGVkIHRpbWVyICovCisjZW5kaWYgLyogQ0tfVElNRVJTICovCisgICAgbWludGltZSA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgLyogTWluaW11bSB0aW1lb3V0ICovCisgICAgbWF4dGltZSA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSB0aW1lb3V0ICovCisKKyAgICBucGFkID0gTVlQQUROLCAgICAgICAgICAgICAgICAgICAgICAvKiBIb3cgbXVjaCBwYWRkaW5nIHRvIHNlbmQgKi8KKyAgICBteXBhZG4gPSBNWVBBRE4sICAgICAgICAgICAgICAgICAgICAvKiBIb3cgbXVjaCBwYWRkaW5nIHRvIGFzayBmb3IgKi8KKyAgICBiY3RyID0gREZCQ1QsICAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9jayBjaGVjayB0eXBlIHJlcXVlc3RlZCAqLworICAgIGJjdHUgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrIGNoZWNrIHR5cGUgdXNlZCAqLworICAgIGJjdGwgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrIGNoZWNrIGxlbmd0aCAqLworICAgIGNfc2F2ZSA9IC0xLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrIGNoZWNrIHNhdmluZyBhbmQgcmVzdG9yaW5nICovCisgICAgc3Nfc2F2ZSA9IC0xLCAgICAgICAgICAgICAgICAgICAgICAgLyogU2xvdy1zdGFydCBzYXZpbmcgYW5kIHJlc3RvcmluZyAqLworICAgIGVicSA9ICBNWUVCUSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDh0aCBiaXQgcHJlZml4ICovCisgICAgZWJxZmxnID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogOHRoLWJpdCBxdW90aW5nIGZsYWcgKi8KKyAgICBycWYgPSAtMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIHVzZWQgaW4gOGJxIG5lZ290aWF0aW9uICovCisgICAgcnEgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVjZWl2ZWQgOGJxIGJpZCAqLworICAgIHNxID0gJ1knLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlbnQgOGJxIGJpZCAqLworICAgIHJwdCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcGVhdCBjb3VudCAqLworICAgIHJwdHEgPSBNWVJQVFEsICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcGVhdCBwcmVmaXggKi8KKyAgICBycHRmbGcgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXBlYXQgcHJvY2Vzc2luZyBmbGFnICovCisgICAgcnB0ZW5hID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwZWF0IHByb2Nlc3NpbmcgZW5hYmxlZCAqLworICAgIHhmcmNhbiA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zZmVyIGNhbmNlbGxhdGlvbiBlbmFibGVkICovCisgICAgeGZyaW50ID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNmZXIgaW50ZXJydXB0aW9uIGVuYWJsZWQgKi8KKyAgICB4ZnJjaHIgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2ZlciBjYW5jZWwgY2hhciA9IEN0cmwtQyAqLworICAgIHhmcm51bSA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZWQgdGhyZWUgb2YgdGhlbSBieSBkZWZhdWx0ICovCisgICAgZ194ZnJ4bGEgPSAtMTsKKyAgICBjaGFyICogeGZybXNnID0gTlVMTDsgICAgICAgICAgICAgICAvKiBNZXNzYWdlIGZvciBmLnQuIGRpc3BsYXkgc2NyZWVuICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBOT0NTRVRTCitpbnQgeGZyeGxhID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiAqLworI2Vsc2UKK2ludCB4ZnJ4bGEgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmFibGVkIG9yIGRpc2FibGVkICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCisjaWZuZGVmIE5PWEZFUgoraW50IGVwa3RmbGcgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEUtUEFDS0VUIGNvbW1hbmQgYWN0aXZlICovCisKK2ludCBjYXBhcyAgPSA5LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3NpdGlvbiBvZiBDYXBhYmlsaXRpZXMgKi8KKyAgICBscGNhcGIgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb25nIFBhY2tldCBjYXBhYmlsaXR5ICovCisgICAgbHBjYXByID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHJlcXVlc3RlZCAqLworICAgIGxwY2FwdSA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICB1c2VkICovCisgICAgc3djYXBiID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2xpZGluZyBXaW5kb3cgY2FwYWJpbGl0eSAqLworICAgIHN3Y2FwciA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICByZXF1ZXN0ZWQgKGFsbG93ZWQpICovCisgICAgc3djYXB1ID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHVzZWQgKi8KKyAgICBhdGNhcGIgPSA4LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdHRyaWJ1dGUgY2FwYWJpbGl0eSAqLworICAgIGF0Y2FwciA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICByZXF1ZXN0ZWQgKi8KKyAgICBhdGNhcHUgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgdXNlZCAqLworICAgIHJzY2FwYiA9IDE2LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFU0VORCBjYXBhYmlsaXR5ICovCisgICAgcnNjYXByID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHJlcXVlc3RlZCBieSBkZWZhdWx0ICovCisgICAgcnNjYXB1ID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHVzZWQgKi8KKyAgICBsc2NhcGIgPSAzMiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2NraW5nIFNoaWZ0IGNhcGFiaWxpdHkgKi8KKyAgICBsc2NhcHIgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgcmVxdWVzdGVkIGJ5IGRlZmF1bHQgKi8KKyAgICBsc2NhcHUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgdXNlZCAqLworCisvKiBGbGFncyBmb3Igd2hldGhlciB0byB1c2UgcGFydGljdWxhciBhdHRyaWJ1dGVzICovCisKK2ludCBhdGVuY2kgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmNvZGluZyBpbiAqLworICAgIGF0ZW5jbyA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuY29kaW5nIG91dCAqLworICAgIGF0ZGF0aSA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGUgaW4gKi8KKyAgICBhdGRhdG8gPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRlIG91dCAqLworICAgIGF0ZGlzaSA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc3Bvc2l0aW9uIGluL291dCAqLworICAgIGF0ZGlzbyA9IDEsCisgICAgYXRsZW5pID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIGluL291dCAoYm90aCBraW5kcykgKi8KKyAgICBhdGxlbm8gPSAxLAorICAgIGF0YmxraSA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2Nrc2l6ZSBpbi9vdXQgKi8KKyAgICBhdGJsa28gPSAxLAorICAgIGF0dHlwaSA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgdHlwZSBpbi9vdXQgKi8KKyAgICBhdHR5cG8gPSAxLAorICAgIGF0c2lkaSA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN5c3RlbSBJRCBpbi9vdXQgKi8KKyAgICBhdHNpZG8gPSAxLAorICAgIGF0c3lzaSA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgLyogU3lzdGVtLWRlcGVuZGVudCBwYXJhbWV0ZXJzIGluL291dCAqLworICAgIGF0c3lzbyA9IDE7CisKK2ludCBkaXNwb3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNwb3NpdGlvbiAqLworCisjaWZkZWYgQ0tfUEVSTVMKK2ludCBhdGxwcmkgPSAxLAorICAgIGF0bHBybyA9IDEsCisgICAgYXRncHJpID0gMSwKKyAgICBhdGdwcm8gPSAxOworI2VuZGlmIC8qIENLX1BFUk1TICovCisKK2ludCBhdGZybWkgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWNvcmQgRm9ybWF0IGluL291dCAqLworICAgIGF0ZnJtbyA9IDE7CisKKyNpZmRlZiBTVFJBVFVTCitpbnQgYXRjcmVpID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3JlYXRvciBJRCBpbi9vdXQgKi8KKyAgICBhdGNyZW8gPSAxLAorICAgIGF0YWN0aSA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjY291bnQgaW4vb3V0ICovCisgICAgYXRhY3RvID0gMTsKKyNlbmRpZiAvKiBTVFJBVFVTICovCisKK2ludCBzcHJtbGVuID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTZW5kL1JlY2VpdmUgcHJvdG9jb2wgcGFyYW1ldGVyICovCitpbnQgcnBybWxlbiA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgLyogc3RyaW5nIGxlbmd0aCBsaW1pdHMgKi8KK2ludCBzZW5kaXBrdHMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAvKiBTZW5kIEkgcGFja2V0cyAqLworCitDSEFSIHBhZGNoID0gTVlQQURDLCAgICAgICAgICAgICAgICAgICAgLyogUGFkZGluZyBjaGFyYWN0ZXIgdG8gc2VuZCAqLworICAgIG15cGFkYyA9IE1ZUEFEQywgICAgICAgICAgICAgICAgICAgIC8qIFBhZGRpbmcgY2hhcmFjdGVyIHRvIGFzayBmb3IgKi8KKyAgICBzZW9sID0gTVlFT0wsICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQtT2YtTGluZSBjaGFyYWN0ZXIgdG8gc2VuZCAqLworICAgIGVvbCA9IE1ZRU9MLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZC1PZi1MaW5lIGNoYXJhY3RlciB0byBsb29rIGZvciAqLworICAgIGN0bHEgPSBDVExRLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgcHJlZml4IGluIGluY29taW5nIGRhdGEgKi8KKyAgICBteWN0bHEgPSBDVExRLCAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRib3VuZCBjb250cm9sIGNoYXJhY3RlciBwcmVmaXggKi8KKyAgICBteXJwdHEgPSBNWVJQVFE7ICAgICAgICAgICAgICAgICAgICAvKiBSZXBlYXQgcHJlZml4IEkgd2FudCB0byB1c2UgKi8KKworaW50IHJwdG1pbiA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcGVhdC1jb3VudCBtaW5pbXVtICovCisKK2ludCB1c2VwaXBlcyA9IDAsICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2VkIGZvciB4ZmVyIHRvL2Zyb20gcGlwZXMgKi8KKyAgICBnX3VzZXBpcGVzID0gLTE7CisKK2NoYXIgKiBmaWxlZmlsZSA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKiBGaWxlIGNvbnRhaW5pbmcgbGlzdCBvZiBmaWxlbmFtZXMgKi8KKy8qIENEIG1lc3NhZ2UgZmlsZW5hbWUgbGlzdCAqLworCitjaGFyIHdob2FyZXVbMTZdID0geyBOVUwsIE5VTCB9OyAgICAgICAgLyogU3lzdGVtIElEIG9mIG90aGVyIEtlcm1pdCAqLworaW50IHN5c2luZGV4ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBpbmRleCB0byBpdHMgc3lzdGVtIElEIHN0cnVjdCAqLworaW50IG15aW5kZXggID0gLTE7CitpbnQgd2VhcmVhbGlrZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogMiBLZXJtaXRzIGhhdmUgY29tcGF0aWJsZSBzeXNpZHMgKi8KK2NoYXIgKiBja3N5c2lkID0gICAgICAgICAgICAgICAgICAgICAgICAvKiBNeSBzeXN0ZW0gSUQgKi8KKyNpZmRlZiBVTklYCisgICAgIlUxIgorI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiRDciCisjZWxzZQorI2lmZGVmIE9TSworICAgICJVRCIKKyNlbHNlCisjaWZkZWYgQU1JR0EKKyAgICAiTDMiCisjZWxzZQorI2lmZGVmIE1BQworICAgICJBMyIKKyNlbHNlCisjaWZkZWYgT1MyCisjaWZkZWYgTlQKKyAgICAiVU4iCisjZWxzZSAvKiBOVCAqLworICAgICJVTyIKKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UgLyogT1MyICovCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICAiRjMiCisjZWxzZQorI2lmZGVmIEdFTURPUworICAgICJLMiIKKyNlbHNlCisjaWZkZWYgU1RSQVRVUworICAgICJNViIKKyNlbHNlCisgICAgIiIKKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogR0VNRE9TICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyAgICA7CisKK2ludCBvb3B0cyA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPLVBhY2tldCBPcHRpb25zICovCitpbnQgb21vZGUgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTy1QYWNrZXQgVHJhbnNmZXIgTW9kZSAqLworaW50IG9uYW1lID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE8tUGFja2V0IEZpbGVuYW1lIE9wdGlvbnMgKi8KK2ludCBvcGF0aCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPLVBhY2tldCBQYXRobmFtZSBPcHRpb25zICovCisKK3N0cnVjdCB6YXR0ciBpYXR0cjsgICAgICAgICAgICAgICAgICAgICAvKiBJbmNvbWluZyBmaWxlIGF0dHJpYnV0ZXMgKi8KKworI2lmZGVmIFZNUworLyogVk1TIGxhYmVsZWQgZmlsZSBkZWZhdWx0IG9wdGlvbnMgLSBuYW1lIG9ubHkuICovCitpbnQgbGZfb3B0cyA9IExCTF9OQU07CisjZWxzZQorI2lmZGVmIE9TMgorLyogT1MvMiBsYWJlbGVkIGZpbGUgZGVmYXVsdCBvcHRpb25zLCBhbGwgYXR0cmlidXRlcyBidXQgYXJjaGl2ZWQuICovCit1bnNpZ25lZCBsb25nIGludCBsZl9vcHRzID0gTEJMX0VYVHxMQkxfSElEfExCTF9ST3xMQkxfU1lTOworI2Vsc2UKK2ludCBsZl9vcHRzID0gMDsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKworLyogUGFja2V0LXJlbGF0ZWQgdmFyaWFibGVzICovCisKK2ludCBwa3RudW0gPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHBhY2tldCBudW1iZXIgKi8KKyAgICBzbmR0eXAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIG9mIHBhY2tldCBqdXN0IHNlbnQgKi8KKyAgICByY3Z0eXAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIG9mIHBhY2tldCBqdXN0IHJlY2VpdmVkICovCisgICAgcnNuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVjZWl2ZWQgcGFja2V0IHNlcXVlbmNlIG51bWJlciAqLworICAgIHJsbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlY2VpdmVkIHBhY2tldCBsZW5ndGggKi8KKyAgICBzaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHNpemUgb2Ygb3V0cHV0IHBrdCBkYXRhICovCisgICAgb3NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJldmlvdXMgb3V0cHV0IHBhY2tldCBkYXRhIHNpemUgKi8KKyAgICBtYXhzaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXggc2l6ZSBmb3IgYnVpbGRpbmcgZGF0YSBmaWVsZCAqLworICAgIHNwa3RsID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBwYWNrZXQgYmVpbmcgc2VudCAqLworICAgIHJwa3RsID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBwYWNrZXQganVzdCByZWNlaXZlZCAqLworICAgIHBrdHBhdXMgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVycGFja2V0IHBhdXNlIGludGVydmFsLCBtc2VjICovCisgICAgcnByaW50ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUkVNT1RFIFBSSU5UIGZsYWcgKi8KKyAgICBybWFpbGYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNQUlMIGZsYWcgKi8KKyAgICB4ZmVyc3RhdCA9IC0xLCAgICAgICAgICAgICAgICAgICAgICAvKiBTdGF0dXMgb2YgbGFzdCB0cmFuc2FjdGlvbiAqLworICAgIGZpbGVzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXR1cyBvZiBsYXN0IGZpbGUgdHJhbnNmZXIgKi8KKworQ0hBUiBwa3Rtc2didWZbUEtUTVNHTEVOKzFdOworQ0hBUiAqZXBrdG1zZyA9IHBrdG1zZ2J1ZjsKKworI2lmZGVmIHBkcDExCitpbnQgc3J2Y21kbGVuID0gTUFYUlA7ICAgICAgICAgICAgICAgICAgLyogc3J2Y21kIGJ1ZmZlciBsZW5ndGggKi8KKyNlbHNlCisjaWZkZWYgRFlOQU1JQworaW50IHNydmNtZGxlbiA9IE1BWFJQOworI2Vsc2UKK2ludCBzcnZjbWRsZW4gPSAwOworI2VuZGlmIC8qIERZTkFNSUMgKi8KKyNlbmRpZiAvKiBwZHAxMSAqLworCitDSEFSCisjaWZkZWYgcGRwMTEKKyAgICBzcnZjbWRidWZbTUFYUlArNF0sCisgICAgKnNydmNtZCA9IHNydmNtZGJ1ZiwKKyNlbHNlCisjaWZkZWYgRFlOQU1JQworICAgICpzcnZjbWQgPSAoQ0hBUiAqKTAsICAgICAgICAgICAgICAgIC8qIFdoZXJlIHRvIGRlY29kZSBzZXJ2ZXIgY29tbWFuZCAqLworI2Vsc2UKKyAgICBzcnZjbWRidWZbTUFYUlArNF0sCisgICAgKnNydmNtZCA9IHNydmNtZGJ1ZiwKKyNlbmRpZiAvKiBEWU5BTUlDICovCisjZW5kaWYgLyogcGRwMTEgKi8KKyAgICBwYWRidWZbOTZdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgZm9yIHNlbmQtcGFkZGluZyAqLworICAgICpyZWNwa3QsCisgICAgKnJkYXRhcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byByZWNlaXZlZCBwYWNrZXQgZGF0YSAqLworICAgICpkYXRhID0gKENIQVIgKikwLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gc2VuZC1wYWNrZXQgZGF0YSAqLworICAgICpzcnZwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gc3J2Y21kICovCisgICAgbXlzdGNoID0gU09ILCAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0Ym91bmQgcGFja2V0LXN0YXJ0IGNoYXJhY3RlciAqLworICAgIHN0Y2hyID0gU09IOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY29taW5nIHBhY2tldC1zdGFydCBjaGFyYWN0ZXIgKi8KKworLyogRmlsZS1yZWxhdGVkIHZhcmlhYmxlcyAqLworCisjaWZuZGVmIE5PTVNFTkQgICAgICAgICAgICAgICAgICAgICAgICAgLyogTXVsdGlwbGUgU0VORCAqLworc3RydWN0IGZpbGVsaXN0ICogZmlsZWhlYWQgPSBOVUxMOyAgICAgIC8qIFNFTkQgbGlzdCAqLworc3RydWN0IGZpbGVsaXN0ICogZmlsZXRhaWwgPSBOVUxMOworc3RydWN0IGZpbGVsaXN0ICogZmlsZW5leHQgPSBOVUxMOworaW50IGFkZGxpc3QgPSAwOworI2VuZGlmIC8qIE5PTVNFTkQgKi8KKworY2hhciBmaWxuYW1bQ0tNQVhQQVRIICsgMV07ICAgICAgICAgICAgIC8qIE5hbWUgb2YgY3VycmVudCBmaWxlLiAqLworY2hhciBvZmlsbmFtW0NLTUFYUEFUSCArIDFdOyAgICAgICAgICAgIC8qIE9yaWdpbmFsIG5hbWUuICovCisKK2ludCBwaXBlc2VuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBOb256ZXJvIGlmIHNlbmRpbmcgZnJvbSBwaXBlICovCisjaWZkZWYgUElQRVNFTkQKK2NoYXIgKiBzbmRmaWx0ZXIgPSBOVUxMOyAgICAgICAgICAgICAgICAvKiBTZW5kIGFuZCByZWNlaXZlIGZpbHRlcnMgKi8KK2NoYXIgKiByY3ZmaWx0ZXIgPSBOVUxMOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKK2NoYXIgKiogc25kYXJyYXkgPSBOVUxMOyAgICAgICAgICAgICAgICAvKiBTRU5EIC9BUlJBWSBwb2ludGVyIGFuZCByYW5nZSAqLworI2lmbmRlZiBOT1NQTAoraW50IHNuZHhsbyA9IC0xLCBzbmR4aGkgPSAtMSwgc25keGluID0gLTE7CisjZW5kaWYgLyogTk9TUEwgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1NFUlZFUgoraW50IG5nZXRwYXRoID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIEdFVCBzZWFyY2ggcGF0aCAqLworaW50IGZyb21nZXRwYXRoID0gMDsKK2NoYXIgKiBnZXRwYXRoW01BWEdFVFBBVEhdOworY2hhciAqIHhfdXNlciA9IE5VTEw7ICAgICAgICAgICAgICAgICAgIC8qIFNlcnZlciBsb2dpbiBpbmZvcm1hdGlvbiAqLworY2hhciAqIHhfcGFzc3dkID0gTlVMTDsKK2NoYXIgKiB4X2FjY3QgPSBOVUxMOworI2VuZGlmIC8qIE5PU0VSVkVSICovCisKK2ludCB4X2xvZ2luID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2dpbiByZXF1aXJlZCAqLworaW50IHhfbG9nZ2VkID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZXIgaXMgbG9nZ2VkIGluICovCisKK2V4dGVybiBpbnQgdGltZWxpbWl0OworCisjaWZkZWYgQ0tfTE9HSU4KK2ludCBsb2dpbnRpbW8gPSAzMDA7ICAgICAgICAgICAgICAgICAgICAvKiBMb2dpbiB0aW1lb3V0ICovCitjaGFyICogdXNlcmZpbGUgPSBOVUxMOyAgICAgICAgICAgICAgICAgLyogRm9yYmlkZGVuIHVzZXIgZmlsZSAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisjaWZkZWYgSUtTRAorY2hhciAqIGFub25maWxlID0gTlVMTDsgICAgICAgICAgICAgICAgIC8qIEFub255bW91cyBsb2dpbiBpbml0IGZpbGUgKi8KK2NoYXIgKiBhbm9ucm9vdCA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKiBBbm9ueW1vdXMgZmlsZS1zeXN0ZW0gcm9vdCAqLworaW50IGlrc190aW1vICA9IDMwMDsgICAgICAgICAgICAgICAgICAgIC8qIDUgbWludXRlcyBpZGxlIHRpbW8gKi8KK2ludCBpa3NfcmV0cnkgPSAzOyAgICAgICAgICAgICAgICAgICAgICAvKiAzIGF0dGVtcHRzIGF0IGxvZ2luICovCisjZW5kaWYgLyogSUtTRCAqLworCisjaWZkZWYgQ0tTWVNMT0cKK2V4dGVybiBWT0lEIHpzeXNsb2coKTsKK2V4dGVybiBpbnQgY2t4bG9nZ2luZywgY2t4c3lzbG9nOworI2VuZGlmIC8qIENLU1lTTE9HICovCisKK2ludCBuenhvcHRzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPcHRpb25zIGZvciBuenhwYW5kKCkgKi8KK2ludCBuZmlscyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZmlsZXMgaW4gZmlsZSBncm91cCAqLworbG9uZyBmc2l6ZSA9IDBMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpemUgb2YgY3VycmVudCBmaWxlICovCisjaWZkZWYgVU5JWAoraW50IHdpbGR4cGFuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIFdobyBleHBhbmRzIHdpbGRjYXJkcyAqLworI2Vsc2UgLyogVU5JWCAqLworI2lmZGVmIFNUUkFUVVMKK2ludCB3aWxkeHBhbmQgPSAxOworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisjaWZkZWYgVU5JWE9ST1NLCitpbnQgbWF0Y2hkb3QgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogV2hldGhlciB0byBtYXRjaCBkb3QgZmlsZXMgKi8KKyNlbHNlCitpbnQgbWF0Y2hkb3QgPSAxOworI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworaW50IG1hdGNoZmlmbyA9IDA7CQkJLyogV2hldGhlciB0byBtYXRjaCBGSUZPICJmaWxlcyIgKi8KK2ludCBjbGZpbHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBjb21tYW5kLWxpbmUgZmlsZXMgKi8KK2ludCBzdGF5ZmxnID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciAic3RheSIsIGkuZS4gIi1TIiAqLworaW50IHhmaW5pc2ggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIEZJTklTSCA9IEVYSVQgKi8KK2xvbmcgenR1c2VjID0gLTFMOyAgICAgICAgICAgICAgICAgICAgICAvKiBVc2VkIHdpdGggenRpbWUoKSAqLworbG9uZyB6dG1zZWMgPSAtMUw7ICAgICAgICAgICAgICAgICAgICAgIC8qIERpdHRvICovCisKKy8qIENvbW11bmljYXRpb24gZGV2aWNlIC8gY29ubmVjdGlvbiB2YXJpYWJsZXMgKi8KKworY2hhciB0dG5hbWVbVFROQU1MRU4rMV07ICAgICAgICAgICAgICAgIC8qIE5hbWUgb2YgY29tbXVuaWNhdGlvbiBkZXZpY2UgKi8KKworI2lmZGVmIE1BQworaW50IGNvbm5lY3RlZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIFRydWUgaWYgY29ubmVjdGVkICovCitpbnQgc3RhcnRjb25uZWN0ZWQ7ICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBzdGF0ZSBvZiBjb25uZWN0ZWQgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKworbG9uZyBzcGVlZCA9IC0xTDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW11bmljYXRpb24gZGV2aWNlIHNwZWVkICovCitpbnQgd2FzY2xvc2VkID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogQ29ubmVjdGlvbiB3YXMganVzdCBjbG9zZWQgKi8KK2ludCB3aHljbG9zZWQgPSBXQ19SRU1POyAgICAgICAgICAgICAgICAvKiB3aHkgaXQgd2FzIGNsb3NlZCAqLworaW50IHFueHBvcnRsb2NrID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIFFOWCBwb3J0IGxvY2tpbmcgb24vb2ZmICovCisKKyNpZm5kZWYgQ0xTT05ESVNDCisjZGVmaW5lIENMU09ORElTQyAwCisjZW5kaWYgLyogQ0xTT05ESVNDICovCisKK2ludCBjeGZsb3dbQ1hUX01BWCsxXTsgICAgICAgICAgICAgICAgICAvKiBTZWUgaW5pdGZsb3coKSAqLworCisjaWZuZGVmIE5PU0hPVworY2hhciAqIGZsb25hbWVbXSA9IHsgICAgICAgICAgICAgICAgICAgIC8qIEZsb3cgY29udHJvbCBuYW1lcyAqLworICAibm9uZSIsICJ4b24veG9mZiIsICJydHMvY3RzIiwgImR0ci9jZCIsICJldHgvYWNrIiwgInN0cmluZyIsCisgICJ4eHgxIiwgInh4eDIiLCAiZHRyL2N0cyIsICJrZWVwIiwgImF1dG8iCit9OworaW50IG5mbG9uYW1lID0gKHNpemVvZihmbG9uYW1lKSAvIHNpemVvZihjaGFyICopKTsKKworY2hhciAqIGN4bmFtZVtdID0geyAgICAgICAgICAgICAgICAgICAgIC8qIENvbm5lY3Rpb24gdHlwZSBuYW1lcyAqLworICAicmVtb3RlIiwgImRpcmVjdC1zZXJpYWwiLCAibW9kZW0iLCAidGNwL2lwIiwgInguMjUiLCAiZGVjbmV0IiwKKyAgImxhdCIsICJuZXRiaW9zIiwgIm5hbWVkLXBpcGUiLCAic3NoIiwgInBpcGUiCit9OworaW50IG5jeG5hbWUgPSAoc2l6ZW9mKGN4bmFtZSkgLyBzaXplb2YoY2hhciAqKSk7CisjZW5kaWYgLyogTk9TSE9XICovCisKK2ludCBwYXJpdHkgPSBERUZQQVIsICAgICAgICAgICAgICAgICAgICAvKiBQYXJpdHkgc3BlY2lmaWVkLCAwLCdlJywnbycsZXRjICovCisgICAgaHdwYXJpdHkgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogSGFyZHdhcmUgcGFyaXR5IGZvciBzZXJpYWwgcG9ydCAqLworICAgIHN0b3BiaXRzID0gLTEsICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3AgYml0cyBmb3Igc2VyaWFsIHBvcnQgKi8KKyAgICBjbHNvbmRpc2MgPSBDTFNPTkRJU0MsICAgICAgICAgICAgICAvKiBTZXJpYWwgcG9ydCBjbG9zZSBvbiBkaXNjb25uZWN0ICovCisgICAgYXV0b3BhciA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0b21hdGljIHBhcml0eSBjaGFuZ2UgZmxhZyAqLworICAgIHNvc2kgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0LUluL091dCBmbGFnICovCisgICAgZmxvdyA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxvdyBjb250cm9sIChzZWUgaW5pdGZsb3coKSkgKi8KKyAgICBhdXRvZmxvdyA9IDEsICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvbWF0aWMgZmxvdyBjb250cm9sICovCisgICAgdHVybiA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGluZSB0dXJuYXJvdW5kIGhhbmRzaGFrZSBmbGFnICovCisgICAgdHVybmNoID0gWE9OLCAgICAgICAgICAgICAgICAgICAgICAgLyogTGluZSB0dXJuYXJvdW5kIGNoYXJhY3RlciAqLworICAgIGR1cGxleCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIER1cGxleCwgZnVsbCBieSBkZWZhdWx0ICovCisgICAgZXNjYXBlID0gREZFU0MsICAgICAgICAgICAgICAgICAgICAgLyogRXNjYXBlIGNoYXJhY3RlciBmb3IgY29ubmVjdCAqLworICAgIGNrZGVsYXkgPSBEREVMQVksICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWwgZGVsYXkgYmVmb3JlIHNlbmRpbmcgKi8KKyAgICB0bmxtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hbCBuZXdsaW5lIG1vZGUgKi8KKworLyogTmV0d29ya3MgZm9yIFNFVCBIT1NUICovCisKKyNpZmRlZiBCSUdCVUZPSworI2RlZmluZSBNWUhPU1RMIDEwMjQKKyNlbHNlCisjZGVmaW5lIE1ZSE9TVEwgMTAwCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKworY2hhciBteWhvc3RbTVlIT1NUTF07ICAgICAgICAgICAgICAgICAgIC8qIExvY2FsIGhvc3QgbmFtZSAqLworaW50IG5ldHdvcmsgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldHdvcmsgdnMgc2VyaWFsIGNvbm5lY3Rpb24gKi8KK2ludCBpbnNlcnZlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBSdW5uaW5nIGFzIGFuIEludGVybmV0IHNlcnZlciAqLworaW50IGlzZ3Vlc3QgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZXIgaXMgYW5vbnltb3VzICovCitjaGFyICogY2xpZW50aG9zdCA9IE5VTEw7ICAgICAgICAgICAgICAgLyogUGVlciBob3N0IG5hbWUgb3IgYWRkcmVzcyAqLworaW50IHRjcF9pbmNvbWluZyA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIEluY29taW5nIFRDUCBjb25uZWN0aW9uPyAqLworCisjaWZkZWYgTkVUQ09OTgorI2lmZGVmIFRDUFNPQ0tFVAoraW50IG5ldHR5cGUgPSBORVRfVENQQjsgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgbmV0d29yayB0eXBlICovCisjZWxzZQorI2lmZGVmIFNVTlgyNQoraW50IG5ldHR5cGUgPSBORVRfU1gyNTsKKyNlbHNlCisjaWZkZWYgSUJNWDI1CitpbnQgbmV0dHlwZSA9IE5FVF9JWDI1OworI2Vsc2UKKyNpZmRlZiBIUFgyNQoraW50IG5ldHR5cGUgPSBORVRfSFgyNTsKKyNlbHNlCisjaWZkZWYgU1RSQVRVU1gyNQoraW50IG5ldHR5cGUgPSBORVRfVlgyNTsKKyNlbHNlCisjaWZkZWYgREVDTkVUCitpbnQgbmV0dHlwZSA9IE5FVF9ERUM7CisjZWxzZQorI2lmZGVmIFNVUEVSTEFUCitpbnQgbmV0dHlwZSA9IE5FVF9TTEFUOworI2Vsc2UKK2ludCBuZXR0eXBlID0gTkVUX05PTkU7CisjZW5kaWYgLyogU1VQRVJMQVQgKi8KKyNlbmRpZiAvKiBERUNORVQgKi8KKyNlbmRpZiAvKiBTVFJBVFVTWDI1ICovCisjZW5kaWYgLyogSFBYMjUgKi8KKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNlbmRpZiAvKiBTVU5YMjUgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNlbHNlICAvKiBORVRDT05OICovCitpbnQgbmV0dHlwZSA9IE5FVF9OT05FOworI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmZGVmIEFOWVgyNQoraW50IHJldmNhbGwgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFguMjUgcmV2ZXJzZSBjYWxsIG5vdCBzZWxlY3RlZCAqLworaW50IGNsb3NnciAgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFguMjUgY2xvc2VkIHVzZXIgZ3JvdXAgICovCitpbnQgY3VkYXRhID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogWC4yNSBjYWxsIHVzZXIgZGF0YSBub3Qgc3BlY2lmaWVkICovCitjaGFyIHVkYXRhW01BWENVREFUQV07ICAgICAgICAgICAgICAgICAgLyogWC4yNSBjYWxsIHVzZXIgZGF0YSAqLworCisjaWZkZWYgSUJNWDI1CisvKgorICBJIHdhcyB1bmFibGUgdG8gZmluZCBhbnkgcHJlLWRlZmluZWQgTUFYIHZhbHVlcyBmb3IgeDI1IGFkZHJlc3NlcyAtIHRoZQorICBhZGRyZXNzZXMgdGhhdCBJJ3ZlIHNlZW4gaGF2ZSBiZWVuIGFyb3VuZCAxMC0xMiBjaGFyYWN0ZXJzIDMyIGlzIHByb2JhYmx5CisgIGVub3VnaCwgNjQgaXMgaG9wZWZ1bGx5IHNhZmUgZm9yIGV2ZXJ5b25lLgorKi8KKyAgICB4MjVhZGRyX3QgbG9jYWxfbnVhID0geydcMCd9OyAgICAgICAvKiBsb2NhbCB4LjI1IGFkZHJlc3MgKi8KKyAgICB4MjVhZGRyX3QgcmVtb3RlX251YSA9IHsnXDAnfTsgICAgICAvKiByZW1vdGUgeC4yNSBhZGRyZXNzICovCisgICAgY2hhciB4MjVuYW1lWzMyXSA9IHsnXDAnfTsgICAgICAgICAgLyogeDI1IGRldmljZSBuYW1lLCBzeDI1YTAgb3Igc3gyNWExICovCisgICAgY2hhciB4MjVkZXZbNjRdID0gICIvZGV2L3gyNXBrdCI7ICAgLyogeDI1IGRldmljZSBpbiAvZGV2ICovCisgICAgaW50IHgyNXBvcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogcG9ydCB1c2VkIGZvciBYLjI1IC0gQUlYIG9ubHkgKi8KKyNlbmRpZiAvKiBJQk1YMjUgKi8KKworI2lmbmRlZiBJQk1YMjUKKy8qCisgIFRoaXMgY29uZGl0aW9uIGlzIHVucmVsYXRlZCB0byB0aGUgYWJvdmUgSUJNWDI1IGNvbmRpdGlvbi4KKyAgSUJNIFguMjUgZG9lc24ndCBoYXZlIFBBRCBzdXBwb3J0LgorKi8KKyAgICBDSEFSIHBhZHBhcm1zW01BWFBBRFBBUk1TKzFdOyAvKiBYLjMgcGFyYW1ldGVycyAqLworI2VuZGlmIC8qIElCTVgyNSAqLworI2VuZGlmIC8qIEFOWVgyNSAqLworCisvKiBPdGhlciBpdGVtcyAqLworCitpbnQgaXNpbnRlcnJ1cHRlZCA9IDA7ICAgICAgICAgICAgICAgICAgLyogVXNlZCBpbiBleGNlcHRpb24gaGFuZGxpbmcgKi8KK2ludCB3aGF0ID0gV19JTklUOyAgICAgICAgICAgICAgICAgICAgICAvKiBXaGF0IEkgYW0gZG9pbmcgKi8KK2ludCBsYXN0eGZlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMYXN0IHRyYW5zZmVyIChzZW5kIG9yIHJlY2VpdmUpICovCisKK2V4dGVybiBpbnQgbWRtdHlwOyAgICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSAoL25ldHdvcmspIHR5cGUgKi8KKworI2lmZGVmIE5UCitleHRlcm4gaW50IFN0YXJ0ZWRGcm9tRGlhbGVyOworI2lmZGVmIE5UU0lHCitleHRlcm4gaW50IFRsc0luZGV4OworI2VuZGlmIC8qIE5UU0lHICovCisjaWZkZWYgTlRBU00KK3Vuc2lnbmVkIGxvbmcgRVNQVG9SZXN0b3JlOyAgICAgICAgICAgICAvKiBEaXR0byAqLworI2VuZGlmIC8qIE5UQVNNICovCisjZW5kaWYgLyogTlQgKi8KKworI2lmZGVmIE9TMlBNCitpbnQgb3MycG0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT1MvMiBQcmVzZW50YXRpb24gTWFuYWdlciBmbGFnICovCisjZW5kaWYgLyogT1MyUE0gKi8KKworLyogVGVybWluYWwgc2NyZWVuIHNpemUsIGlmIGtub3duLCAtMSBtZWFucyB1bmtub3duLiAqLworCisjaWZkZWYgT1MyCisjaW5jbHVkZSAiY2tvY29uLmgiCisjaWZkZWYgS1VJCitpbnQgdHRfcm93c1tWTlVNXSA9IHsyNCwyNCwyNSwxfTsgICAgICAgLyogUm93cyAoaGVpZ2h0KSAqLworaW50IHR0X2NvbHNbVk5VTV0gPSB7ODAsODAsODAsODB9OyAgICAgIC8qIENvbHVtbnMgKHdpZHRoKSAqLworaW50IGNtZF9yb3dzID0gMjQsIGNtZF9jb2xzID0gODA7ICAgICAgIC8qIENvbW1hbmQvY29uc29sZSBzY3JlZW4gZGltZW5zaW9ucyAqLworI2Vsc2UgLyogS1VJICovCitpbnQgdHRfcm93c1tWTlVNXSA9IHstMSwyNCwyNSwxfTsgICAgICAgLyogUm93cyAoaGVpZ2h0KSAqLworaW50IHR0X2NvbHNbVk5VTV0gPSB7LTEsODAsODAsODB9OyAgICAgIC8qIENvbHVtbnMgKHdpZHRoKSAqLworaW50IGNtZF9yb3dzID0gLTEsIGNtZF9jb2xzID0gLTE7ICAgICAgIC8qIENvbW1hbmQvY29uc29sZSBzY3JlZW4gZGltZW5zaW9ucyAqLworI2VuZGlmIC8qIEtVSSAqLworaW50IGs5NXN0ZGlvID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZGlvIHRocmVhZHMgKi8KK2ludCB0dF9iZWxsID0gWFlCX0FVRCB8IFhZQl9TWVM7ICAgICAgICAvKiBCRUxMIEFVRElCTEUgKHN5c3RlbSBzb3VuZHMpICovCisjZWxzZSAvKiBPUzIgKi8KK2ludCB0dF9yb3dzID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBSb3dzIChoZWlnaHQpICovCitpbnQgdHRfY29scyA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ29sdW1ucyAod2lkdGgpICovCitpbnQgY21kX3Jvd3MgPSAyNCwgY21kX2NvbHMgPSA4MDsgICAgICAgLyogQ29tbWFuZC9jb25zb2xlIHNjcmVlbiBkaW1lbnNpb25zICovCitpbnQgdHRfYmVsbCA9IFhZQl9BVUQ7ICAgICAgICAgICAgICAgICAgLyogQkVMTCBPTiAqLworI2VuZGlmIC8qIE9TMiAqLworCitpbnQgdHRfcHJpbnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNwYXJlbnQgcHJpbnQgZGlzYWJsZWQgKi8KK2ludCB0dF9lc2NhcGUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAvKiBFc2NhcGluZyBiYWNrIGlzIGVuYWJsZWQgKi8KK2ludCB0dF9zY3JvbGwgPSAxOyAgICAgICAgICAgICAgICAgICAgICAvKiBTY3JvbGxpbmcgb3BlcmF0aW9ucyBhcmUgZW5hYmxlZCAqLworCitpbnQgdG5fZXhpdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhpdCBvbiBkaXNjb25uZWN0ICovCisKK2ludCBleGl0b25jbG9zZSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBFeGl0IG9uIGNsb3NlICovCitpbnQgZXhpdGhhbmd1cCA9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogSGFuZ3VwIG9uIGV4aXQgKi8KK2ludCBoYXZlbGluZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgTElORSBvciBTRVQgSE9TVCBpbiBlZmZlY3QgKi8KK2ludCB0bGV2ZWwgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUYWtlLWZpbGUgY29tbWFuZCBsZXZlbCAqLworaW50IGhpbnRzID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdoZXRoZXIgdG8gZ2l2ZSBoaW50cyAqLworCisjaWZkZWYgTk9MT0NBTAoraW50IHJlbW9ubHkgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbW90ZS1tb2RlLW9ubHkgYWR2aXNvcnkgKC1SKSAqLworaW50IG5vbG9jYWwgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbW90ZS1vbmx5IHN0cmljdGx5IGVuZm9yY2VkICovCisjZWxzZQoraW50IHJlbW9ubHkgPSAwOworaW50IG5vbG9jYWwgPSAwOworaW50IGN4X3N0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIENPTk5FQ1QgcmV0dXJuIHN0YXR1cyAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmbmRlZiBOT1NQTAorZXh0ZXJuIGludCBjbWRsdmw7ICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgbGV2ZWwgKi8KK2V4dGVybiBpbnQgbWFjbHZsOyAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBpbnZvY2F0aW9uIGxldmVsICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworaW50IHByb3RvY29sICA9IFBST1RPX0s7ICAgICAgICAgICAgICAgIC8qIEZpbGUgdHJhbnNmZXIgcHJvdG9jb2wgPSBLZXJtaXQgKi8KKworI2lmZGVmIE5FV0RFRkFVTFRTCitpbnQgcHJlZml4aW5nID0gUFhfQ0FVOworI2Vsc2UKK2ludCBwcmVmaXhpbmcgPSBQWF9BTEw7CisjZW5kaWYgLyogTkVXREVGQVVMVFMgKi8KKworZXh0ZXJuIHNob3J0IGN0bHBbXTsgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wtcHJlZml4IHRhYmxlICovCisKK2ludCBjYXJyaWVyID0gQ0FSX0FVVDsgICAgICAgICAgICAgICAgICAvKiBQYXkgYXR0ZW50aW9uIHRvIGNhcnJpZXIgc2lnbmFsICovCitpbnQgY2R0aW1vID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FycmllciB3YWl0IHRpbWVvdXQgKi8KK2ludCB4aXRzdGEgPSBHT09EX0VYSVQ7ICAgICAgICAgICAgICAgICAvKiBQcm9ncmFtIGV4aXQgc3RhdHVzICovCisKKyNpZmRlZiBWTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IGZpbGVuYW1lIGNvbGxpc2lvbiBhY3Rpb24gKi8KK2ludCBmbmNhY3QgPSBYWUZYX1g7ICAgICAgICAgICAgICAgICAgICAvKiBSRVBMQUNFIGZvciBWTVMgKi8KKyNlbHNlCitpbnQgZm5jYWN0ID0gWFlGWF9COyAgICAgICAgICAgICAgICAgICAgLyogQkFDS1VQIGZvciBldmVyeWJvZHkgZWxzZSAqLworI2VuZGlmIC8qIFZNUyAqLworCitpbnQgZm5jc2F2ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIHNhdmluZyAmIHJlc3RvcmluZyB0aGUgYWJvdmUgKi8KK2ludCBiZ3NldCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCQUNLR1JPVU5EIG1vZGUgc2V0IGV4cGxpY2l0bHkgKi8KKworaW50IGNtZGludCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdHMgYXJlIGFsbG93ZWQgKi8KKyNpZmRlZiBVTklYCitpbnQgeHN1c3BlbmQgPSBERlNVU1A7CQkJLyogV2hldGhlciBTVVNQRU5EIGNvbW1hbmQsIGV0YywgKi8KKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpcyB0byBiZSBhbGxvd2VkLiAqLworaW50IHhzdXNwZW5kID0gMDsKKyNlbmRpZiAvKiBVTklYICovCisKKy8qIFN0YXRpc3RpY3MgdmFyaWFibGVzICovCisKK2xvbmcgZmlsY250LCAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGZpbGVzIGluIHRyYW5zYWN0aW9uICovCisgICAgZmlscmVqLCAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmaWxlcyByZWplY3RlZCBpbiB0cmFuc2FjdGlvbiAqLworICAgIGZsY2ksICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXJzIGZyb20gbGluZSwgY3VycmVudCBmaWxlICovCisgICAgZmxjbywgICAgICAgICAgICAgICAgICAgICAgIC8qIENoYXJzIHRvIGxpbmUsIGN1cnJlbnQgZmlsZSAgKi8KKyAgICB0bGNpLCAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcnMgZnJvbSBsaW5lIGluIHRyYW5zYWN0aW9uICovCisgICAgdGxjbywgICAgICAgICAgICAgICAgICAgICAgIC8qIENoYXJzIHRvIGxpbmUgaW4gdHJhbnNhY3Rpb24gKi8KKyAgICBmZmMsICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcnMgdG8vZnJvbSBjdXJyZW50IGZpbGUgKi8KKyAgICB0ZmMsICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcnMgdG8vZnJvbSBmaWxlcyBpbiB0cmFuc2FjdGlvbiAqLworICAgIGNwcyA9IDBMLCAgICAgICAgICAgICAgICAgICAvKiBDaGFycy9zZWMgbGFzdCB0cmFuc2ZlciAqLworICAgIHBlYWtjcHMgPSAwTCwgICAgICAgICAgICAgICAvKiBQZWFrIGNoYXJzL3NlYyBsYXN0IHRyYW5zZmVyICovCisgICAgY2N1LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgY2hhcnMgdW5wcmVmaXhlZCBpbiB0cmFuc2FjdGlvbiAqLworICAgIGNjcCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIGNoYXJzIHByZWZpeGVkIGluIHRyYW5zYWN0aW9uICovCisgICAgcnB0bjsgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcGVhdGVkIGNoYXJhY3RlcnMgY29tcHJlc3NlZCAqLworCitpbnQgdHNlY3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2Vjb25kcyBmb3IgdHJhbnNhY3Rpb24gKi8KK2ludCBmc2VjcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZXItZmlsZSB0aW1lciAqLworCisjaWZkZWYgR0ZUSU1FUgorQ0tGTE9BVAorICBmcGZzZWNzID0gMC4wLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHBlci1maWxlIHRpbWVyICovCisgIGZwdHNlY3MgPSAwLjA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHBlci10cmFuc2FjdGlvbiB0aW1lciAqLworI2VuZGlmIC8qIEdGVElNRVIgKi8KKworLyogRmxhZ3MgKi8KKworaW50IGRlYmxvZyA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlYnVnIGxvZyBpcyBvcGVuICovCisgICAgZGVib2sgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVidWcgbG9nIGlzIG5vdCBkaXNhYmxlZCAqLworICAgIGRlYnhsZW4gPSA1NCwgICAgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgbGVuZ3RoIGZvciBkZWJ1ZyBzdHJpbmdzICovCisgICAgZGVic2VzID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgREVCVUcgU0VTU0lPTiAqLworICAgIGRlYnRpbSA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGUgdGltZXN0YW1wIGluIGRlYnVnIGxvZyAqLworICAgIHBrdGxvZyA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIHBhY2tldCBsb2dnaW5nICovCisgICAgc2VzbG9nID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2Vzc2lvbiBsb2dnaW5nICovCisgICAgZGlhbG9nID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBsb2dnaW5nICovCisgICAgdHJhbG9nID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNhY3Rpb24gbG9nZ2luZyAqLworICAgIHRsb2dmbXQgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zYWN0aW9uIGxvZyBmb3JtYXQgKHZlcmJvc2UpICovCisgICAgdGxvZ3NlcCA9IChpbnQpJywnLCAgICAgICAgICAgICAgICAgLyogVHJhbnNhY3Rpb24gbG9nIGZpZWxkIHNlcGFyYXRvciAqLworICAgIGRpc3BsYSA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgdHJhbnNmZXIgZGlzcGxheSBvbi9vZmYgKi8KKyAgICBzdGRvdWYgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBvdXRwdXQgdG8gc3Rkb3V0ICovCisgICAgc3RkaW5mID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgaW5wdXQgZnJvbSBzdGRpbiAqLworICAgIHhmbGcgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIFggaW5zdGVhZCBvZiBGIHBhY2tldCAqLworICAgIGhjZmxnICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvaW5nIEhvc3QgY29tbWFuZCAqLworICAgIGRlc3QgICA9IERFU1RfRCwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIGZvciBwYWNrZXQgZGF0YSAqLworICAgIHpjaGtvZCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHpjaGtvKCkgc2hvdWxkIHdvcmsgZm9yIGRpcnMgdG9vPyAqLworICAgIHpjaGtpZCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHpjaGtpKCkgc2hvdWxkIHdvcmsgZm9yIGRpcnMgdG9vPyAqLworCisvKiBJZiB5b3UgY2hhbmdlIHRoaXMsIGFsc28gc2VlIHN0cnVjdCBwdGFiIGFib3ZlLi4uICovCisKKyNpZmRlZiBPUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBmaWxlIG5hbWUgY29udmVyc2lvbiAqLworICAgIGZuY252ICA9IFhZRk5fTCwgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgaXMgTGl0ZXJhbCBpbiBPUy8yLCAqLworICAgIGZfc2F2ZSA9IFhZRk5fTCwgICAgICAgICAgICAgICAgICAgIC8qIChzYXZlZCBjb3B5IG9mIHNhbWUpICovCisjZWxzZQorICAgIGZuY252ICA9IFhZRk5fQywgICAgICAgICAgICAgICAgICAgIC8qIGVsc2V3aGVyZSBDb252ZXJ0IHRoZW0gKi8KKyAgICBmX3NhdmUgPSBYWUZOX0MsICAgICAgICAgICAgICAgICAgICAvKiAoZGl0dG8pICovCisjZW5kaWYgLyogT1MyICovCisKKyAgICBmbnNwYXRoID0gUEFUSF9PRkYsICAgICAgICAgICAgICAgICAvKiBTZW5kIGZpbGUgcGF0aCAqLworICAgIGZucnBhdGggPSBQQVRIX0FVVE8sICAgICAgICAgICAgICAgIC8qIFJlY2VpdmUgZmlsZSBwYXRoICovCisgICAgZmFja3BhdGggPSAxLCAgICAgICAgICAgICAgICAgICAgICAgLyogU2VuZCBiYWNrIHBhdGggaW4gQUNLIHRvIEYgKi8KKyAgICBiaW5hcnkgPSBYWUZUX0IsICAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IGZpbGUgdHJhbnNmZXIgbW9kZSAqLworICAgIGJfc2F2ZSA9IFhZRlRfQiwgICAgICAgICAgICAgICAgICAgIC8qIFNhdmVkIGZpbGUgbW9kZSAqLworICAgIGVvZm1ldGhvZCA9IDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEVPRiBkZXRlY3Rpb24gbWV0aG9kIChsZW5ndGgpICovCisKKyNpZmRlZiBPUzIKKyAgICBjdXJzb3Jfc2F2ZSA9IC0xLCAgICAgICAgICAgICAgICAgICAvKiBDdXJzb3Igc3RhdGUgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIHhmZXJtb2RlID0gWE1PREVfQSwgICAgICAgICAgICAgICAgIC8qIFRyYW5zZmVyIG1vZGUsIG1hbnVhbCBvciBhdXRvICovCisgICAgeGZpbGV0eXBlID0gLTEsICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNmZXIgb25seSB0ZXh0IChvciBiaW5hcnkpICovCisgICAgcmVjdXJzaXZlID0gMCwgICAgICAgICAgICAgICAgICAgICAgLyogUmVjdXJzaXZlIGRpcmVjdG9yeSB0cmF2ZXJzYWwgKi8KKyAgICBub2xpbmtzICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBmb2xsb3cgc3ltYm9saWMgbGlua3MgKi8KKyAgICBza2lwYnVwICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBTa2lwIGJhY2t1cCBmaWxlcyB3aGVuIHNlbmRpbmcgKi8KKyAgICBzZW5kbW9kZSA9IFNNX1NFTkQsICAgICAgICAgICAgICAgICAvKiBXaGljaCB0eXBlIG9mIFNFTkQgb3BlcmF0aW9uICovCisgICAgc2xvc3RhcnQgID0gMSwgICAgICAgICAgICAgICAgICAgICAgLyogU2xvdyBzdGFydCAoZ3JvdyBwYWNrZXQgbGVuZ3RocykgKi8KKyAgICBjbWFzayAgPSAwMzc3LCAgICAgICAgICAgICAgICAgICAgICAvKiBDT05ORUNUICh0ZXJtaW5hbCkgYnl0ZSBtYXNrICovCisgICAgZm1hc2sgID0gMDM3NywgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSBieXRlIG1hc2sgKi8KKyAgICBja3dhcm4gPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBmaWxlIHdhcm5pbmcgKi8KKyAgICBxdWlldCAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCZSBxdWlldCBkdXJpbmcgZmlsZSB0cmFuc2ZlciAqLworICAgIGxvY2FsICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgPSBsb2NhbCBtb2RlLCAwID0gcmVtb3RlIG1vZGUgKi8KKyAgICBjeHR5cGUgPSBDWFRfUkVNT1RFLCAgICAgICAgICAgICAgICAvKiBDb25uZWN0aW9uIHR5cGUgKi8KKyAgICBzZXJ2ZXIgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBJIEFtIFNlcnZlciAqLworICAgIHF1ZXJ5ID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIFF1ZXJ5IGFjdGl2ZSAqLworICAgIGp1c3RvbmUgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlcnZlciBzaG91bGQgZG8gSnVzdCBPbmUgY29tbWFuZCAqLworICAgIHVyc2VydmVyID0gMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIFlvdSBBcmUgU2VydmVyICovCisgICAgYnllX2FjdGl2ZSA9IDAsICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgQllFIGNvbW1hbmQgYWN0aXZlICovCisgICAgZGlyYWN0aXZlID0gMCwgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgRElSRUNUT1JZIGNvbW1hbmQgYWN0aXZlICovCisgICAgY2RhY3RpdmUgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgQ0QgY29tbWFuZCBhY3RpdmUgKi8KKyAgICBjZmxnICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb25uZWN0IGJlZm9yZSB0cmFuc2FjdGlvbiAqLworICAgIGNuZmxnICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbm5lY3QgYWZ0ZXIgdHJhbnNhY3Rpb24gKi8KKyAgICBjeHNlZW4gPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBjYW5jZWxsaW5nIGEgZmlsZSAqLworICAgIGN6c2VlbiA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIGNhbmNlbGxpbmcgZmlsZSBncm91cCAqLworICAgIGZhdGFsaW8gPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIGZhdGFsIGkvbyBlcnJvciAqLworICAgIGRpc2NhcmQgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIGZpbGUgdG8gYmUgZGlzY2FyZGVkICovCisgICAga2VlcCA9IFNFVF9BVVRPLCAgICAgICAgICAgICAgICAgICAgLyogS2VlcCBpbmNvbXBsZXRlIGZpbGVzID0gQVVUTyAqLworICAgIHVua2NzID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtlZXAgZmlsZSB3L3Vua25vd24gY2hhcmFjdGVyIHNldCAqLworI2lmZGVmIFZNUworICAgIGZpbGVwZWVrID0gMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3BlY3Rpb24gb2YgZmlsZXMgKi8KKyNlbHNlCisjaWZkZWYgZGF0Z2VuZXJhbAorICAgIGZpbGVwZWVrID0gMCwKKyNlbHNlCisgICAgZmlsZXBlZWsgPSAxLAorI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogVk1TICovCisgICAgbmFrc3RhdGUgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogSW4gYSBzdGF0ZSB3aGVyZSB3ZSBjYW4gc2VuZCBOQUtzICovCisgICAgZGJsY2hhciA9IC0xLCAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIHRvIGRvdWJsZSB3aGVuIHNlbmRpbmcgKi8KKyAgICBtb3ZpbmcgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNT1ZFID0gc2VuZCwgdGhlbiBkZWxldGUgKi8KKyAgICByZWxpYWJsZSA9IFNFVF9BVVRPLCAgICAgICAgICAgICAgICAvKiBOb256ZXJvIGlmIHRyYW5zcG9ydCBpcyByZWxpYWJsZSAqLworICAgIHhyZWxpYWJsZSA9IC0xLAorICAgIHNldHJlbGlhYmxlID0gMCwKKyAgICB1cmNsZWFyID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb256ZXJvIGZvciBjbGVhciBjaGFubmVsIHRvIHlvdSAqLworICAgIGNsZWFycnEgPSBTRVRfQVVUTywgICAgICAgICAgICAgICAgIC8qIFNFVCBDTEVBUkNIQU5FTCB2YWx1ZSAqLworICAgIGNsZWFyZWQgPSAwLAorICAgIHN0cmVhbWluZyA9IDAsICAgICAgICAgICAgICAgICAgICAgIC8qIE5vbnplcm8gaWYgc3RyZWFtaW5nIGlzIGFjdGl2ZSAqLworICAgIHN0cmVhbW9rID0gMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vbnplcm8gaWYgc3RyZWFtaW5nIG5lZ290aWF0ZWQgKi8KKyAgICBzdHJlYW1ycSA9IFNFVF9BVVRPLCAgICAgICAgICAgICAgICAvKiBTRVQgU1RSRUFNSU5HIHZhbHVlICovCisgICAgc3RyZWFtZWQgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogV2hldGhlciB3ZSBzdHJlYW1lZCBsYXN0IHRpbWUgKi8KKworY2hhciAqIHNuZF9tb3ZlID0gTlVMTDsgICAgICAgICAgICAgICAgIC8qIE1vdmUgZmlsZSBhZnRlciBzZW5kaW5nIGl0ICovCitjaGFyICogc25kX3JlbmFtZSA9IE5VTEw7ICAgICAgICAgICAgICAgLyogUmVuYW1lIGZpbGUgYWZ0ZXIgc2VuZGluZyBpdCAqLworY2hhciAqIHJjdl9tb3ZlID0gTlVMTDsgICAgICAgICAgICAgICAgIC8qIE1vdmUgZmlsZSBhZnRlciByZWNlaXZpbmcgaXQgKi8KK2NoYXIgKiByY3ZfcmVuYW1lID0gTlVMTDsgICAgICAgICAgICAgICAvKiBSZW5hbWUgZmlsZSBhZnRlciByZWNlaXZpbmcgaXQgKi8KKworY2hhciAqIGdfc25kX21vdmUgPSBOVUxMOworY2hhciAqIGdfc25kX3JlbmFtZSA9IE5VTEw7CitjaGFyICogZ19yY3ZfbW92ZSA9IE5VTEw7CitjaGFyICogZ19yY3ZfcmVuYW1lID0gTlVMTDsKKworbG9uZyBzZW5kc3RhcnQgPSAwTDsgICAgICAgICAgICAgICAgICAgIC8qIFNFTkQgc3RhcnQgcG9zaXRpb24gKi8KK2xvbmcgY2FsaWJyYXRlID0gMEw7ICAgICAgICAgICAgICAgICAgICAvKiBOb256ZXJvIGlmIGNhbGlicmF0aW9uIHJ1biAqLworCisjaWZkZWYgQ0tfVFJJR0dFUgorY2hhciAqdHRfdHJpZ2dlcltUUklHR0VSU10gPSB7IE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCB9OworQ0hBUiAqdHRfdHJtYXRjaFtUUklHR0VSU10gPSB7IE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCB9OworY2hhciAqdHJpZ2dlcnZhbCA9IE5VTEw7CisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworCitpbnQgY2t4bG9nZ2luZyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3Igc3lzbG9nZ2luZyBhY3RpdmUgKi8KK2ludCBpa2Rib3BlbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBJS1NEIGRhdGFiYXNlIGFjdGl2ZSAqLworaW50IGRiaW5pdGVkID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIElLU0RCIHJlY29yZCBpbml0J2QgKi8KKyNpZm5kZWYgQ0tTWVNMT0cKK2ludCBja3hzeXNsb2cgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBMb2dnaW5nIGxldmVsIDAgKi8KKyNlbHNlCisjaWZkZWYgU1lTTE9HTEVWRUwKK2ludCBja3hzeXNsb2cgPSBTWVNMT0dMRVZFTDsgICAgICAgICAgICAvKiBMb2dnaW5nIGxldmVsIHNwZWNpZmllZCAqLworI2Vsc2UKK2ludCBja3hzeXNsb2cgPSBTWVNMR19ERjsgICAgICAgICAgICAgICAvKiBEZWZhdWx0IGxvZ2dpbmcgbGV2ZWwgKi8KKyNlbmRpZiAvKiBTWVNMT0dMRVZFTCAqLworI2VuZGlmIC8qIENLU1lTTE9HICovCisKKyNpZm5kZWYgTk9IRUxQCisjaWZuZGVmIE5PQ01ETAorX1BST1RPVFlQKCBWT0lEIGluaW9wdGhscCwgKHZvaWQpICk7ICAgIC8qIENvbW1hbmQtbGluZSBoZWxwIGluaXRpYWxpemVyICovCisjZW5kaWYgLyogTk9DTURMICovCisjZW5kaWYgLyogTk9IRUxQICovCisKK19QUk9UT1RZUCggVk9JRCBnZXRleGVkaXIsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgcHV0bm90aGluZywgKGNoYXIpICk7CisKKyNpZmRlZiBJS1NECitfUFJPVE9UWVAoIFZPSUQgZG9pa3NkaW5pdCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgaWtzZGluaXQsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIGRvaWtsb2csICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgZGJpbml0LCAodm9pZCkgKTsKKyNlbmRpZiAvKiBJS1NEICovCisKKy8qIFZhcmlhYmxlcyBwYXNzZWQgZnJvbSBjb21tYW5kIHBhcnNlciB0byBwcm90b2NvbCBtb2R1bGUgKi8KKworI2lmbmRlZiBOT1NQTAorI2lmbmRlZiBOT0lDUAorI2lmZGVmIENLX0FQQworX1BST1RPVFlQKCBWT0lEIGFwY29uZWN0LCAodm9pZCkgKTsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKyNpZmRlZiBPUzIKK2V4dGVybiBpbnQgaW5pdHZpazsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworI2VuZGlmIC8qIE5PU1BMICovCitjaGFyICpjbGNtZHMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBjb21tYW5kLWxpbmUgY29tbWFuZHMgKi8KKworI2lmbmRlZiBOT1NFVEtFWQorZXh0ZXJuIEtFWSAqa2V5bWFwOworZXh0ZXJuIE1BQ1JPICptYWNyb3RhYjsKKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworCisjaWZuZGVmIE5PUFVTSAoraW50IG5vcHVzaCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBVU0ggZW5hYmxlZCAqLworI2Vsc2UKK2ludCBub3B1c2ggPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQVVNIIGRpc2FibGVkICovCisjZW5kaWYgLyogTk9QVVNIICovCisKK0NIQVIgc3N0YXRlICA9IChDSEFSKSAwOyAgICAgICAgICAgICAgICAvKiBTdGFydGluZyBzdGF0ZSBmb3IgYXV0b21hdG9uICovCitDSEFSIHpzdGF0ZSAgPSAoQ0hBUikgMDsgICAgICAgICAgICAgICAgLyogRm9yIHJlbWVtYmVyaW5nIHNzdGF0ZSAqLworY2hhciAqIHByaW50ZXJuYW1lID0gTlVMTDsgICAgICAgICAgICAgIC8qIE5VTEwgaWYgcHJpbnRlciBub3QgcmVkaXJlY3RlZCAqLworaW50IHByaW50cGlwZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBTRVQgUFJJTlRFUiAqLworaW50IG5vcHJpbnRlciA9IDA7CisKKyNpZm5kZWYgTk9YRkVSCitjaGFyICpjbWFyZyAgPSAiIjsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBjb21tYW5kIGRhdGEgKi8KK2NoYXIgKmNtYXJnMiA9ICIiOyAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIDJuZCBjb21tYW5kIGRhdGEgKi8KK2NoYXIgKipjbWxpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIGZpbGUgbGlzdCBpbiBhcmd2ICovCisKKyNpZmRlZiBDS19BVVRPREwgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvZG93bmxvYWQgKi8KK2ludCBhdXRvZGwgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGVkIGJ5IGRlZmF1bHQgKi8KKyNlbHNlCitpbnQgYXV0b2RsID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG9yIGlmIG5vdCBpbXBsZW1lbnRlZCkuICovCisjZW5kaWYgLyogQ0tfQVVUT0RMICovCitpbnQgYWRsX2VyciA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMSA9IHN0b3Agb24gZXJyb3IgKi8KKyNpZmRlZiBLVUkKK2ludCBhZGxfYXNrID0gMTsJCQkvKiAxID0gZmlsZSBkaWFsb2cgb24gYXV0b2Rvd25sb2FkICovCisjZWxzZQoraW50IGFkbF9hc2sgPSAwOwkJCS8qIDAgPSBubyBmaWxlIGRpYWxvZyAqLworI2VuZGlmIC8qIEtVSSAqLworI2lmZGVmIE9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFVVE9ET1dOTE9BRCBwYXJhbWV0ZXJzICovCitpbnQgYWRsX2ttb2RlID0gQURMX1BBQ0ssICAgICAgICAgICAgICAgLyogTWF0Y2ggUGFja2V0IHRvIHNpZ25hbCBkb3dubG9hZCAqLworICAgIGFkbF96bW9kZSA9IEFETF9QQUNLOworY2hhciAqIGFkbF9rc3RyID0gTlVMTDsgICAgICAgICAgICAgICAgIC8qIEtFUk1JVCBEb3dubG9hZCBTdHJpbmcgKi8KK2NoYXIgKiBhZGxfenN0ciA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKiBaTU9ERU0gRG93bmxvYWQgU3RyaW5nICovCisjZW5kaWYgLyogT1MyICovCisKK2ludCByZW1maWxlID0gMCwgcmVtcGlwZSA9IDAsIHJlbWFwcGQgPSAwOyAvKiBSRU1PVEUgb3V0cHV0IHJlZGlyZWN0aW9uICovCitjaGFyICogcmVtZGVzdCA9IE5VTEw7CisKKyNpZm5kZWYgTk9TRVJWRVIKKy8qCisgIFNlcnZlciBzZXJ2aWNlczoKKyAgIDAgPSBkaXNhYmxlZAorICAgMSA9IGVuYWJsZWQgaW4gbG9jYWwgbW9kZQorICAgMiA9IGVuYWJsZWQgaW4gcmVtb3RlIG1vZGUKKyAgIDMgPSBlbmFibGVkIGluIGJvdGggbG9jYWwgYW5kIHJlbW90ZSBtb2RlcworICBvbmx5IGFzIGluaXRpYWwgKGRlZmF1bHQpIHZhbHVlcy4KKyovCitpbnQgZW5feGl0ID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVhJVCAqLworaW50IGVuX2N3ZCA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENEL0NXRCAqLworaW50IGVuX2NweSA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPUFkgICAqLworaW50IGVuX2RlbCA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERFTEVURSAqLworaW50IGVuX21rZCA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1LRElSICovCitpbnQgZW5fcm1kID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUk1ESVIgKi8KK2ludCBlbl9kaXIgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBESVJFQ1RPUlkgKi8KK2ludCBlbl9maW4gPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGSU5JU0ggKi8KK2ludCBlbl9nZXQgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHRVQgKi8KKyNpZm5kZWYgTk9QVVNICitpbnQgZW5faG9zID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogSE9TVCBlbmFibGVkICovCisjZWxzZQoraW50IGVuX2hvcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhPU1QgZGlzYWJsZWQgKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KK2ludCBlbl9yZW4gPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRU5BTUUgKi8KK2ludCBlbl9zZW4gPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTRU5EICovCitpbnQgZW5fc2V0ID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0VUICovCitpbnQgZW5fc3BhID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU1BBQ0UgKi8KK2ludCBlbl90eXAgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUWVBFICovCitpbnQgZW5fd2hvID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0hPICovCisjaWZkZWYgZGF0YWdlbmVyYWwKKy8qIERhdGEgR2VuZXJhbCBBT1MvVlMgY2FuJ3QgZG8gdGhpcyAqLworaW50IGVuX2J5ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJZRSAqLworI2Vsc2UKK2ludCBlbl9ieWUgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQQ3MgaW4gbG9jYWwgbW9kZS4uLiAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCitpbnQgZW5fYXNnID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQVNTSUdOICovCitpbnQgZW5fcXVlID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUVVFUlkgKi8KK2ludCBlbl9yZXQgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRVRSSUVWRSAqLworaW50IGVuX21haSA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1BSUwgKi8KK2ludCBlbl9wcmkgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQUklOVCAqLworaW50IGVuX2VuYSA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVOQUJMRSAqLworI2Vsc2UKK2ludCBlbl94aXQgPSAwLCBlbl9jd2QgPSAwLCBlbl9jcHkgPSAwLCBlbl9kZWwgPSAwLCBlbl9ta2QgPSAwLCBlbl9ybWQgPSAwLAorICAgIGVuX2RpciA9IDAsIGVuX2ZpbiA9IDAsIGVuX2dldCA9IDAsIGVuX2hvcyA9IDAsIGVuX3JlbiA9IDAsIGVuX3NlbiA9IDAsCisgICAgZW5fc2V0ID0gMCwgZW5fc3BhID0gMCwgZW5fdHlwID0gMCwgZW5fd2hvID0gMCwgZW5fYnllID0gMCwgZW5fYXNnID0gMCwKKyAgICBlbl9xdWUgPSAwLCBlbl9yZXQgPSAwLCBlbl9tYWkgPSAwLCBlbl9wcmkgPSAwLCBlbl9lbmEgPSAwOworI2VuZGlmIC8qIE5PU0VSVkVSICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKy8qIE1pc2NlbGxhbmVvdXMgKi8KKworY2hhciAqKnhhcmd2OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdsb2JhbCBjb3BpZXMgb2YgYXJndiAqLworaW50IHhhcmdjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBhcmdjICAqLworaW50IHhhcmdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuIGltbXV0YWJsZSBjb3B5IG9mIGFyZ2MgKi8KK2NoYXIgKnhhcmcwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgb2YgYXJndlswXSAqLworY2hhciAqcGlwZWRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gLVAgKHBpcGUpIGRhdGEgKi8KKworZXh0ZXJuIGNoYXIgKmRmdHR5OyAgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgdHR5IG5hbWUgZnJvbSBjaz90aW8uYyAqLworZXh0ZXJuIGludCBkZmxvYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgbG9jYXRpb246IHJlbW90ZS9sb2NhbCAqLworZXh0ZXJuIGludCBkZnBydHk7ICAgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgcGFyaXR5ICovCitleHRlcm4gaW50IGRmZmxvdzsgICAgICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBmbG93IGNvbnRyb2wgKi8KKworI2lmZGVmIFROQ09ERQorZXh0ZXJuIGludCB0bl9kZWI7CisjZW5kaWYgLyogVE5DT0RFICovCisvKgorICBCdWZmZXJlZCBmaWxlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycy4gIFNlZSBnZXRwa3QoKSBpbiBja2NmbnMuYworICBhbmQgem91dGR1bXAoKSBpbiB0aGUgc3lzdGVtLWRlcGVuZGVudCBmaWxlIGkvbyBtb2R1bGUgKHVzdWFsbHkgY2s/ZmlvLmMpLgorKi8KKyNpZm5kZWYgRFlOQU1JQworLyogTm93IHdlIGFsbG9jYXRlIHRoZW0gZHluYW1pY2FsbHksIHNlZSBnZXRpb2JzKCkgYmVsb3cuICovCitjaGFyIHppbmJ1ZmZlcltJTkJVRlNJWkVdLCB6b3V0YnVmZmVyW09CVUZTSVpFXTsKKyNlbmRpZiAvKiBEWU5BTUlDICovCitjaGFyICp6aW5wdHIsICp6b3V0cHRyOworaW50IHppbmNudCwgem91dGNudDsKK2ludCB6b2J1ZnNpemUgPSBPQlVGU0laRTsKK2ludCB6b2ZidWZmZXIgPSAxOworaW50IHpvZmJsb2NrICA9IDE7CisKKyNpZmRlZiBTRVNMSU1JVAoraW50IHNlc2xpbWl0ID0gMDsKKyNlbmRpZiAvKiBTRVNMSU1JVCAqLworCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyNpbmNsdWRlICJja3VhdGguaCIKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworCitfUFJPVE9UWVAoIGludCBnZXRpb2JzLCAoVk9JRCkgKTsKKworLyogIE0gQSBJIE4gIC0tICBDLUtlcm1pdCBtYWluIHByb2dyYW0gICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2lmbmRlZiBOT0NDVFJBUAorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgImNrY3NpZy5oIgorY2tqbXBidWYgY21qYnVmOworI2lmZGVmIEdFTURPUyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNwZWNpYWwgZm9yIEF0YXJpIFNUICovCitjY19jbGVhbigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBjYW4ndCBiZSByaWdodD8gKi8KKyNlbmRpZiAvKiBHRU1ET1MgKi8KKyNlbmRpZiAvKiBOT0NDVFJBUCAqLworCisjaWZuZGVmIE5PWEZFUgorLyogSW5mbyBhc3NvY2lhdGVkIHdpdGggYSBzeXN0ZW0gSUQgKi8KKworc3RydWN0IHN5c2RhdGEgc3lzaWRsaXN0W10gPSB7ICAgICAgICAgIC8qIEFkZCBvdGhlcnMgYXMgbmVlZGVkLi4uICovCisgIHsgIjAiLCAgImFub255bW91cyIsICAgIDAsIE5VTCwgIDAsIDAsIDAgfSwKKyAgeyAiQTEiLCAiQXBwbGUgSUkiLCAgICAgMCwgTlVMLCAgMCwgMCwgMyB9LCAvKiBmaXggdGhpcyAqLworICB7ICJBMyIsICJNYWNpbnRvc2giLCAgICAxLCAnOicsICAwLCAyLCAxIH0sCisgIHsgIkQ3IiwgIlZNUyIsICAgICAgICAgIDAsICddJywgIDEsIDAsIDAgfSwKKyAgeyAiREEiLCAiUlNUUy9FIiwgICAgICAgMCwgJ10nLCAgMSwgMCwgMyB9LCAvKiAoaSB0aGluay4uLikgKi8KKyAgeyAiREIiLCAiUlQxMSIsICAgICAgICAgMCwgTlVMLCAgMSwgMCwgMyB9LCAvKiAobWF5YmUuLi4pICovCisgIHsgIkYzIiwgIkFPUy9WUyIsICAgICAgIDEsICc6JywgIDAsIDAsIDIgfSwKKyAgeyAiSTEiLCAiVk0vQ01TIiwgICAgICAgMCwgTlVMLCAgMCwgMCwgMCB9LAorICB7ICJJMiIsICJNVlMvVFNPIiwgICAgICAwLCBOVUwsICAwLCAwLCAwIH0sCisgIHsgIkk0IiwgIk1VU0lDIiwgICAgICAgIDAsIE5VTCwgIDAsIDAsIDAgfSwKKyAgeyAiSTciLCAiQ0lDUyIsICAgICAgICAgMCwgTlVMLCAgMCwgMCwgMCB9LAorICB7ICJJOSIsICJNVlMvUk9TQ09FIiwgICAwLCBOVUwsICAwLCAwLCAwIH0sCisgIHsgIksyIiwgIkF0YXJpIFNUIiwgICAgIDEsICdcXCcsIDEsIDAsIDMgfSwKKyAgeyAiTDMiLCAiQW1pZ2EiLCAgICAgICAgMSwgJy8nLCAgMSwgMCwgMiB9LAorICB7ICJNViIsICJTdHJhdHVzIFZPUyIsICAxLCAnPicsICAwLCAxLCAwIH0sCisgIHsgIk4zIiwgIkFwb2xsbyBBZWdpcyIsIDEsICcvJywgIDAsIDMsIDIgfSwKKyAgeyAiVTEiLCAiVU5JWCIsICAgICAgICAgMSwgJy8nLCAgMCwgMywgMiB9LAorICB7ICJVOCIsICJNUy1ET1MiLCAgICAgICAxLCAnXFwnLCAxLCAwLCAzIH0sCisgIHsgIlVEIiwgIk9TLTkiLCAgICAgICAgIDEsICcvJywgIDAsIDMsIDIgfSwKKyAgeyAiVU4iLCAiV2luZG93cy0zMiIsICAgMSwgJ1xcJywgMSwgMiwgMyB9LAorICB7ICJVTyIsICJPUy8yIiwgICAgICAgICAxLCAnXFwnLCAxLCAyLCAzIH0KK307CitzdGF0aWMgaW50IG54eHN5c2lkcyA9IChzaXplb2Yoc3lzaWRsaXN0KSAvIHNpemVvZihzdHJ1Y3Qgc3lzZGF0YSkpOworCisvKiBHaXZlbiBhIEtlcm1pdCBzeXN0ZW0gSUQgY29kZSwgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIG5hbWUgc3RyaW5nICovCisvKiBhbmQgc29tZSBwcm9wZXJ0aWVzIG9mIHRoZSBmaWxlbmFtZXMuLi4gKi8KKworY2hhciAqCitnZXRzeXNpZChzKSBjaGFyICogczsgeyAgICAgICAgICAgICAgICAgLyogR2V0IHN5c3RlbS10eXBlIG5hbWUgKi8KKyAgICBpbnQgaTsKKyAgICBpZiAoIXMpIHJldHVybigiIik7CisgICAgZm9yIChpID0gMDsgaSA8IG54eHN5c2lkczsgaSsrKQorICAgICAgaWYgKCFzdHJjbXAoc3lzaWRsaXN0W2ldLnNpZF9jb2RlLHMpKQorICAgICAgICByZXR1cm4oc3lzaWRsaXN0W2ldLnNpZF9uYW1lKTsKKyAgICByZXR1cm4ocyk7Cit9CisKK2ludAorZ2V0c3lzaXgocykgY2hhciAqczsgeyAgICAgICAgICAgICAgICAgIC8qIEdldCBzeXN0ZW0tdHlwZSBpbmRleCAqLworICAgIGludCBpOworICAgIGlmICghcykgcmV0dXJuKC0xKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnh4c3lzaWRzOyBpKyspCisgICAgICBpZiAoIXN0cmNtcChzeXNpZGxpc3RbaV0uc2lkX2NvZGUscykpCisgICAgICAgIHJldHVybihpKTsKKyAgICByZXR1cm4oLTEpOworfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisvKiBUZWxsIGlmIGEgcGF0aG5hbWUgaXMgYWJzb2x1dGUgKHZlcnN1cyByZWxhdGl2ZSkgKi8KKy8qIFRoaXMgc2hvdWxkIGJlIHBhcmNlbGVkIG91dCB0byBlYWNoIG9mIHRoZSBjaypmaW8uYyBtb2R1bGVzLi4uICovCitpbnQKK2lzYWJzb2x1dGUocGF0aCkgY2hhciAqIHBhdGg7IHsKKyAgICBpbnQgcmMgPSAwOworICAgIGludCB4OworICAgIGlmICghcGF0aCkKKyAgICAgIHJldHVybigwKTsKKyAgICBpZiAoISpwYXRoKQorICAgICAgcmV0dXJuKDApOworICAgIHggPSAoaW50KSBzdHJsZW4ocGF0aCk7CisgICAgZGVidWcoRjExMSwiaXNhYnNvbHV0ZSIscGF0aCx4KTsKKyNpZmRlZiBWTVMKKyAgICByYyA9IDA7CisgICAgeCA9IGNraW5kZXgoIlsiLHBhdGgsMCwwLDApOyAgICAgICAgLyogMS1iYXNlZCAqLworICAgIGlmICgheCkKKyAgICAgICB4ID0gY2tpbmRleCgiPCIscGF0aCwwLDAsMCk7CisgICAgZGVidWcoRjExMSwiaXNhYnNvbHV0ZSBsZWZ0IGJyYWNrZXQiLHBhdGgseCk7CisgICAgaWYgKCF4KSB7CisgICAgICAgIHggPSBja2luZGV4KCI6IixwYXRoLC0xLDEsMSk7CisgICAgICAgIGlmICh4KQorICAgICAgICAgIGRlYnVnKEYxMTEsImlzYWJzb2x1dGUgbG9naWNhbCIscGF0aCx4KTsKKyAgICB9CisgICAgaWYgKHggPiAwKQorICAgICAgaWYgKHBhdGhbeF0gIT0gJy4nKSAgICAgICAgICAgICAgIC8qIDAtYmFzZWQgKi8KKyAgICAgICAgcmMgPSAxOworI2Vsc2UKKyNpZmRlZiBVTklYCisgICAgaWYgKCpwYXRoID09ICcvJworI2lmZGVmIERUSUxERQorICAgICAgICB8fCAqcGF0aCA9PSAnficKKyNlbmRpZiAvKiBEVElMREUgKi8KKyAgICAgICAgKQorICAgICAgcmMgPSAxOworI2Vsc2UKKyNpZmRlZiBPUzIKKyAgICBpZiAoKnBhdGggPT0gJy8nIHx8ICpwYXRoID09ICdcXCcpCisgICAgICByYyA9IDE7CisgICAgZWxzZSBpZiAoaXNhbHBoYSgqcGF0aCkgJiYgeCA+IDIpCisgICAgICBpZiAoKihwYXRoKzEpID09ICc6JyAmJiAoKihwYXRoICsyKSA9PSAnLycgfHwgKihwYXRoKzIpID09ICdcXCcpKQorICAgICAgICByYyA9IDE7CisjZWxzZQorI2lmZGVmIEFNSUdBCisgICAgaWYgKCpwYXRoID09ICcvJworI2lmZGVmIERUSUxERQorICAgICAgICB8fCAqcGF0aCA9PSAnficKKyNlbmRpZiAvKiBEVElMREUgKi8KKyAgICAgICAgKQorICAgICAgcmMgPSAxOworI2Vsc2UKKyNpZmRlZiBPU0sKKyAgICBpZiAoKnBhdGggPT0gJy8nCisjaWZkZWYgRFRJTERFCisgICAgICAgIHx8ICpwYXRoID09ICd+JworI2VuZGlmIC8qIERUSUxERSAqLworICAgICAgICApCisgICAgICByYyA9IDE7CisjZWxzZQorI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgaWYgKCpwYXRoID09ICc6JykKKyAgICAgIHJjID0gMTsKKyNlbHNlCisjaWZkZWYgTUFDCisgICAgcmMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsbCBpbiBsYXRlci4uLiAqLworI2Vsc2UKKyNpZmRlZiBTVFJBVFVTCisgICAgcmMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsbCBpbiBsYXRlci4uLiAqLworI2Vsc2UKKyNpZmRlZiBHRU1ET1MKKyAgICBpZiAoKnBhdGggPT0gJy8nIHx8ICpwYXRoID09ICdcXCcpCisgICAgICByYyA9IDE7CisgICAgZWxzZSBpZiAoaXNhbHBoYSgqcGF0aCkgJiYgeCA+IDEpCisgICAgICBpZiAoKihwYXRoKzEpID09ICc6JykKKyAgICAgICAgcmMgPSAxOworI2VuZGlmIC8qIEdFTURPUyAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIEFNSUdBICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIFZNUyAqLworICAgIGRlYnVnKEYxMDEsImlzYWJzb2x1dGUgcmMiLCIiLHJjKTsKKyAgICByZXR1cm4ocmMpOworfQorCisvKiAgU2VlIGlmIEkgaGF2ZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBrZXlib2FyZCAgKi8KKworaW50Citpc19hX3R0eShuKSBpbnQgbjsgeworI2lmZGVmIFVOSVgKKyAgICBleHRlcm4gaW50IHR0ZmRmbGc7CisgICAgaWYgKHR0ZmRmbGcgPiAwKQorICAgICAgcmV0dXJuKDEpOworI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBLVUkKKyAgICByZXR1cm4gMTsKKyNlbHNlIC8qIEtVSSAqLworI2lmZGVmIE5UCisgICAgaWYgKGlzV2luOTUoKSkKKyAgICAgIHJldHVybigxKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oX2lzYXR0eShuKSk7CisjZWxzZQorI2lmZGVmIElLU0QKKyAgIGlmIChpbnNlcnZlcikKKyAgICAgcmV0dXJuKDEpOworICAgZWxzZQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgcmV0dXJuKGlzYXR0eShuKSk7CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBLVUkgKi8KK30KKworI2lmbmRlZiBOT1hGRVIKK1ZPSUQKK2luaXR4bGlzdCgpIHsKKyAgICBleHRlcm4gY2hhciAqIHNuZGV4Y2VwdFtdLCAqIHJjdmV4Y2VwdFtdOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBOU05ERVhDRVBUOyBpKyspIHsKKwlzbmRleGNlcHRbaV0gPSBOVUxMOworCXJjdmV4Y2VwdFtpXSA9IE5VTEw7CisgICAgfQorfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisvKiBJbml0aWFsaXplIGZsb3cgY29udHJvbCB0YWJsZSAqLworCitWT0lECitpbml0ZmxvdygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCB2YWx1ZXMgZm9yIGZsb3cgY29udHJvbCAqLworI2lmZGVmIFZNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBlYWNoIGtpbmQgb2YgY29ubmVjdGlvbi4gKi8KKyAgICAvKiBUaGUgVk1TIHRlbG5ldCB0ZXJtaW5hbCBkcml2ZXIgdHJlYXRzICJub25lIiBhcyByZXF1ZXN0IHRvIGxvc2UgY2hhcnMgKi8KKyAgICBjeGZsb3dbQ1hUX1JFTU9URV0gID0gRkxPX1hPTlg7ICAgICAvKiBSZW1vdGUgbW9kZS4uLiAqLworI2Vsc2UKKyNpZmRlZiBIUFVYCisgICAgLyogRGl0dG8gZm9yIEhQLVVYICovCisgICAgY3hmbG93W0NYVF9SRU1PVEVdICA9IEZMT19YT05YOyAgICAgLyogUmVtb3RlIG1vZGUuLi4gKi8KKyNlbHNlCisgICAgLyogVGhlIHRlbXB0YXRpb24gaXMgdG8gbWFrZSB0aGlzIG9uZSBGTE9fS0VFUCBidXQgZG9uJ3QhISEgKi8KKyAgICAvKiBJdCB0b3RhbGx5IHdyZWNrcyBiaW5hcnktZmlsZSB0cmFuc2ZlciB3aGVuIGNvbWluZyBpbiB2aWEgVGVsbmV0LiAqLworICAgIC8qIEluIFVOSVggYXQgbGVhc3QuLi4gKi8KKyAgICBjeGZsb3dbQ1hUX1JFTU9URV0gID0gRkxPX05PTkU7CisjZW5kaWYgLyogSFBVWCAqLworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgVk1TCisgICAgY3hmbG93W0NYVF9ESVJFQ1RdICA9IEZMT19YT05YOyAgICAgLyogRGlyZWN0IHNlcmlhbCBjb25uZWN0aW9ucy4uLiAqLworI2Vsc2UKKyAgICBjeGZsb3dbQ1hUX0RJUkVDVF0gID0gRkxPX05PTkU7CisjZW5kaWYgLyogVk1TICovCisKKyNpZmRlZiBDS19SVFNDVFMKKyAgICBjeGZsb3dbQ1hUX01PREVNXSAgID0gRkxPX1JUU0M7ICAgICAvKiBNb2RlbSBjb25uZWN0aW9ucy4uLiAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICBjeGZsb3dbQ1hUX01PREVNXSAgID0gRkxPX1hPTlg7CisjZWxzZQorICAgIGN4Zmxvd1tDWFRfTU9ERU1dICAgPSBGTE9fTk9ORTsKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBDS19SVFNDVFMgKi8KKworI2lmZGVmIFZNUworICAgIGN4Zmxvd1tDWFRfVENQSVBdICAgPSBGTE9fWE9OWDsgICAgIC8qIFRDUC9JUCBjb25uZWN0aW9ucy4uLiAqLworI2Vsc2UKKyAgICBjeGZsb3dbQ1hUX1RDUElQXSAgID0gRkxPX05PTkU7CisjZW5kaWYgLyogVk1TICovCisKKyAgICBjeGZsb3dbQ1hUX1NTSF0gICAgID0gRkxPX05PTkU7CisgICAgY3hmbG93W0NYVF9YMjVdICAgICA9IEZMT19OT05FOyAgICAgLyogT3RoZXIga2luZHMgb2YgbmV0d29ya3MuLi4gKi8KKyAgICBjeGZsb3dbQ1hUX0RFQ05FVF0gID0gRkxPX1hPTlg7CisgICAgY3hmbG93W0NYVF9MQVRdICAgICA9IEZMT19YT05YOworICAgIGN4Zmxvd1tDWFRfTkVUQklPU10gPSBGTE9fTk9ORTsKKyAgICBjeGZsb3dbQ1hUX05QSVBFXSAgID0gRkxPX05PTkU7CisgICAgY3hmbG93W0NYVF9QSVBFXSAgICA9IEZMT19OT05FOworICAgIGZsb3cgPSBjeGZsb3dbY3h0eXBlXTsgICAgICAgICAgICAgIC8qIEluaXRpYWwgZmxvdyBzZXR0aW5nLiAqLworICAgIGRlYnVnKEYxMDEsImluaXRmbG93IiwiIixmbG93KTsKK30KKworI2lmbmRlZiBOT1hGRVIKKy8qIEluaXRpYWxpemUgZmlsZSB0cmFuc2ZlciBwcm90b2NvbHMgKi8KKworVk9JRAoraW5pdHByb3RvKHksIHVwYnN0ciwgdXB0c3RyLCBzcnZzdHIsIHNuZGJzdHIsIHNuZHRzdHIsIHJjdmJzdHIsIHJjdnRzdHIpCisgICAgaW50IHk7CisgICAgY2hhciAqIHVwYnN0ciwgKiB1cHRzdHIsICogc3J2c3RyLCAqIHNuZGJzdHIsICogc25kdHN0ciwgKiByY3Zic3RyLAorICAgICogcmN2dHN0cjsKKy8qIGluaXRwcm90byAqLyB7CisKKyAgICBpZiAodXBic3RyKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IG51bGwgc3RyaW5ncyAqLworICAgICAgaWYgKCEqdXBic3RyKSAgICAgICAgICAgICAgICAgICAgIC8qIHRvIG51bGwgcG9pbnRlcnMgKi8KKyAgICAgICAgdXBic3RyID0gTlVMTDsKKworICAgIGlmICh1cHRzdHIpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgbnVsbCBzdHJpbmdzICovCisgICAgICBpZiAoISp1cHRzdHIpICAgICAgICAgICAgICAgICAgICAgLyogdG8gbnVsbCBwb2ludGVycyAqLworICAgICAgICB1cHRzdHIgPSBOVUxMOworCisgICAgaWYgKHNuZGJzdHIpCisgICAgICBpZiAoISpzbmRic3RyKQorICAgICAgICBzbmRic3RyID0gTlVMTDsKKworICAgIGlmIChzbmR0c3RyKQorICAgICAgaWYgKCEqc25kdHN0cikKKyAgICAgICAgc25kdHN0ciA9IE5VTEw7CisKKyAgICBpZiAocmN2YnN0cikKKyAgICAgIGlmICghKnJjdmJzdHIpCisgICAgICAgIHJjdmJzdHIgPSBOVUxMOworCisgICAgaWYgKHJjdnRzdHIpCisgICAgICBpZiAoISpyY3Z0c3RyKQorICAgICAgICByY3Z0c3RyID0gTlVMTDsKKworICAgIGlmIChzcnZzdHIpCisgICAgICBpZiAoISpzcnZzdHIpCisgICAgICAgIHNydnN0ciA9IE5VTEw7CisKKyAgICBwcm90b2NvbCA9IHk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgcHJvdG9jb2wgKi8KKworICAgIGlmIChwdGFiW3Byb3RvY29sXS5ycGt0bGVuID4gLTEpCisgICAgICB1cnBzaXogPSBwdGFiW3Byb3RvY29sXS5ycGt0bGVuOworICAgIGlmIChwdGFiW3Byb3RvY29sXS5zcGt0ZmxnID4gLTEpCisgICAgICBzcHNpemYgPSBwdGFiW3Byb3RvY29sXS5zcGt0ZmxnOworICAgIGlmIChwdGFiW3Byb3RvY29sXS5zcGt0bGVuID4gLTEpIHsKKyAgICAgICAgc3BzaXogPSBwdGFiW3Byb3RvY29sXS5zcGt0bGVuOworICAgICAgICBkZWJ1ZyhGMTAxLCJpbml0cHJvdG8gc3BzaXoiLCIiLHNwc2l6KTsKKyAgICAgICAgaWYgKHNwc2l6ZikgeworICAgICAgICAgICAgc3BzaXpyID0gc3BtYXggPSBzcHNpejsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImluaXRwcm90byBzcHNpenIiLCIiLHNwc2l6cik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHB0YWJbcHJvdG9jb2xdLndpbnNpemUgPiAtMSkKKyAgICAgIHdzbG90ciA9IHB0YWJbcHJvdG9jb2xdLndpbnNpemU7CisgICAgaWYgKHB0YWJbcHJvdG9jb2xdLnByZWZpeCA+IC0xKQorICAgICAgcHJlZml4aW5nID0gcHRhYltwcm90b2NvbF0ucHJlZml4OworICAgIGlmIChwdGFiW3Byb3RvY29sXS5mbmNhID4gLTEpCisgICAgICBmbmNhY3QgID0gcHRhYltwcm90b2NvbF0uZm5jYTsKKyAgICBpZiAocHRhYltwcm90b2NvbF0uZm5jbiA+IC0xKQorICAgICAgZm5jbnYgICA9IHB0YWJbcHJvdG9jb2xdLmZuY247CisgICAgaWYgKHB0YWJbcHJvdG9jb2xdLmZuc3AgPiAtMSkKKyAgICAgIGZuc3BhdGggPSBwdGFiW3Byb3RvY29sXS5mbnNwOworICAgIGlmIChwdGFiW3Byb3RvY29sXS5mbnJwID4gLTEpCisgICAgICBmbnJwYXRoID0gcHRhYltwcm90b2NvbF0uZm5ycDsKKworICAgIG1ha2VzdHIoJihwdGFiW3Byb3RvY29sXS5oX2JfaW5pdCksdXBic3RyKTsKKyAgICBtYWtlc3RyKCYocHRhYltwcm90b2NvbF0uaF90X2luaXQpLHVwdHN0cik7CisgICAgbWFrZXN0cigmKHB0YWJbcHJvdG9jb2xdLmhfeF9pbml0KSxzcnZzdHIpOworICAgIG1ha2VzdHIoJihwdGFiW3Byb3RvY29sXS5wX2Jfc2NtZCksc25kYnN0cik7CisgICAgbWFrZXN0cigmKHB0YWJbcHJvdG9jb2xdLnBfdF9zY21kKSxzbmR0c3RyKTsKKyAgICBtYWtlc3RyKCYocHRhYltwcm90b2NvbF0ucF9iX3JjbWQpLHJjdmJzdHIpOworICAgIG1ha2VzdHIoJihwdGFiW3Byb3RvY29sXS5wX3RfcmNtZCkscmN2dHN0cik7Cit9CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9DTURMCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2RvY21kbGluZSh2b2lkICogdGhyZWFkaW5mbykKKyNlbHNlIC8qIENLX0FOU0lDICovCitkb2NtZGxpbmUodGhyZWFkaW5mbykgVk9JRCAqIHRocmVhZGluZm87CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyNpZmRlZiBOVFNJRworICAgIHNldGludCgpOworICAgIGlmICh0aHJlYWRpbmZvKSB7ICAgICAgICAgICAgICAgICAgIC8qIFRocmVhZCBsb2NhbCBzdG9yYWdlLi4uICovCisgICAgICAgVGxzU2V0VmFsdWUoVGxzSW5kZXgsdGhyZWFkaW5mbyk7CisgICAgICAgZGVidWcoIEYxMDAsICJkb2NtZGxpbmUgY2FsbGVkIHdpdGggdGhyZWFkaW5mbyBibG9jayIsICIiLCAwICk7CisgICAgfSBlbHNlCisgICAgICBkZWJ1ZyggRjEwMCwgImRvY21kbGluZSB0aHJlYWRpbmZvIGlzIE5VTEwiLCIiLDApOworI2VuZGlmIC8qIE5UU0lHICovCisjaWZkZWYgQ0tfTE9HSU4KKyNpZmRlZiBOVAorI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpCisgICAgICBzZXRudGNyZWRzKCk7CisjZW5kaWYgLyogSUtTRCAqLworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICBwcm90bygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUYWtlIGFueSByZXF1ZXN0ZWQgYWN0aW9uLCB0aGVuICovCisgICAgaWYgKCFxdWlldCkgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHV0IGN1cnNvciBiYWNrIGF0IGxlZnQgbWFyZ2luLCAqLworICAgICAgY29ub2xsKCIiKTsKKyNpZm5kZWYgTk9MT0NBTAorICAgIGlmIChjbmZsZykgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlLWNvbm5lY3QgaWYgcmVxdWVzdGVkICovCisgICAgICAgIGNuZmxnID0gMDsKKyAgICAgICAgZG9jb25lY3QoMCwwKTsKKyAgICAgICAgaWYgKHR0Y2hrKCkgPCAwKQorICAgICAgICAgIGRvbG9nZW5kKCk7CisgICAgfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmZGVmIE5UU0lHCisgICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisgICByZXR1cm47Cit9CisKK3ZvaWQKK2lrc2xvZ2luKCkgeworICAgIGlmIChzc3RlbG5ldAorI2lmZGVmIElLU0QKKyAgICAgICAgfHwgaW5zZXJ2ZXIgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlcm5ldCBzZXJ2ZXIgKi8KKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgICkgeworICAgICAgICBjaGFyICpzOworICAgICAgICBleHRlcm4gaW50IGZkaXNwbGE7ICAgICAgICAgICAgIC8qIEZpbGUtdHJhbnNmZXIgZGlzcGxheSBmb3JtYXQgKi8KKyAgICAgICAgZXh0ZXJuIGNoYXIgKiBpa3Byb21wdDsgICAgICAgICAvKiBJS1NEIHByb21wdCAqLworCisjaWZkZWYgSUtTRAorI2lmZGVmIENLX0xPR0lOCisgICAgICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICAgICAgeF9sb2dpbiA9IDE7ICAgICAgICAgICAgICAgIC8qIExvZ2luIHJlcXVpcmVkICovCisgICAgICAgICAgICB4X2xvZ2dlZCA9IDA7ICAgICAgICAgICAgICAgLyogTm90IGxvZ2dlZCBpbiB5ZXQgKi8KKyAgICAgICAgICAgIGNtc2V0cChpa3Byb21wdCk7ICAgICAgICAgICAvKiBTZXQgdXAgSUtTRCdzIHByb21wdCAqLworI2lmbmRlZiBOT1NFUlZFUgorICAgICAgICAgICAgZW5fbWFpID0gMDsgICAgICAgICAgICAgICAgIC8qIE1BSUwgaXMgZGlzYWJsZWQgKi8KKyAgICAgICAgICAgIGVuX3dobyA9IDA7ICAgICAgICAgICAgICAgICAvKiBSRU1PVEUgV0hPIGlzIGRpc2FibGVkICovCisgICAgICAgICAgICBlbl9ob3MgPSAwOyAgICAgICAgICAgICAgICAgLyogUkVNT1RFIEhPU1QgaXMgZGlzYWJsZWQgKi8KKyAgICAgICAgICAgIGVuX3ByaSA9IDA7ICAgICAgICAgICAgICAgICAvKiBQUklOVCBpcyBkaXNhYmxlZCAqLworI2VuZGlmIC8qIE5PU0VSVkVSICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4X2xvZ2luID0gMDsgICAgICAgICAgICAgICAgLyogTG9naW4gbm90IHJlcXVpcmVkICovCisgICAgICAgICAgICB4X2xvZ2dlZCA9IDE7ICAgICAgICAgICAgICAgLyogQWxyZWFkeSBsb2dnZWQgaW4gKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIENLX0xPR0lOICovCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICBub2xvY2FsID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBMSU5FL0hPU1Qgbm90IGFsbG93ZWQgKi8KKyAgICAgICAgZmRpc3BsYSA9IFhZRkRfTjsgICAgICAgICAgICAgICAvKiBObyBmaWxlLXRyYW5zZmVyIGRpc3BsYXkgKi8KKyNpZmRlZiBORVRDT05OCisgICAgICAgIGNsaWVudGhvc3QgPSBja2dldHBlZXIoKTsgICAgICAgLyogR2V0IGNsaWVudCdzIGhvc3RuYW1lICovCisgICAgICAgIGRlYnVnKEYxMTAsImlrc2xvZ2luIGNsaWVudGhvc3QiLGNsaWVudGhvc3QsMCk7CisjZW5kaWYgLyogTkVUQ09OTiAqLworICAgICAgICB6dGltZSgmcyk7ICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBjdXJyZW50IGRhdGUgYW5kIHRpbWUgKi8KKworI2lmZGVmIENLX0xPR0lOCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICAgICAgaWYgKHhfbG9naW4pIHsKKyAgICAgICAgICAgIHhfbG9nZ2VkID0gY2tfdG5fYXV0aF92YWxpZCgpOyAvKiBEaWQgVGVsbmV0IEF1dGggc3VjY2VlZD8gKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImlrc2xvZ2luIiwieF9sb2dnZWQiLHhfbG9nZ2VkKTsKKworI2lmZGVmIE5UCisgICAgICAgICAgICAvKiBPbiBXaW5kb3dzIDl4LCB3ZSBkbyBub3QgaGF2ZSB0aGUgYWJpbGl0eSBpbiAgKi8KKyAgICAgICAgICAgIC8qIHp2dXNlcigpIGF0IHByZXNlbnQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBuYW1lICAqLworICAgICAgICAgICAgLyogYXBwcm92ZWQgaW4gYSBLZXJiZXJvcyBwcmluY2lwYWwgaXMgcmVhbGx5IGEgICovCisgICAgICAgICAgICAvKiBhbiBhY2NvdW50IGluIHRoZSBXaW5kb3dzIEFjY2VzcyBDb250cm9sIExpc3QgKi8KKyAgICAgICAgICAgIGlmIChpc1dpbjk1KCkgJiYgeF9sb2dnZWQgPT0gQVVUSF9WQUxJRAorICAgICAgICAgICAgICAgICAmJiAoY2tfdG5fYXV0aGVudGljYXRlZCgpICE9IEFVVEhUWVBFX05UTE0pCisjaWZkZWYgQ0tfU1JQCisgICAgICAgICAgICAgICAgICYmIChja190bl9hdXRoZW50aWNhdGVkKCkgIT0gQVVUSFRZUEVfU1JQKQorI2VuZGlmIC8qIENLX1NSUCAqLworICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfVVNFUik7CisgICAgICAgICAgICAgICAgeF9sb2dnZWQgPSBBVVRIX1VTRVI7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HOlxyXG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGYoCisiIFRoZSBUZWxuZXQgYXV0aGVudGljYXRpb24gbWV0aG9kIHVzZWQgY2Fubm90IHByb3ZpZGUgZm9yIGF1dG9tYXRlZFxyXG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGYoCisiIGxvZ2luIHRvIFdpbmRvd3MgOTUgb3IgV2luZG93cyA5OC4gIEEgcGFzc3dvcmQgbXVzdCBiZSBlbnRlcmVkXHJcbiIpOworICAgICAgICAgICAgICAgIHByaW50ZigKKyIgbG9jYWxseSB0byB2YWxpZGF0ZSB5b3VyIHVzZXJpZC4gIFRlbG5ldCBhdXRoZW50aWNhdGlvbiAoYW5kIGVuY3J5cHRpb24pXHJcbiIKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHByaW50ZigKKyIgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGhvc3QgKGFuZCBwcm90ZWN0IHRoZSBwcml2YWN5IG9mIHlvdXIgcGFzc3dvcmQuKVwKK1xyXG4iCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOVCAqLworCisgICAgICAgICAgICBpZiAoeF9sb2dnZWQgPT0gQVVUSF9WQUxJRCkgeworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICAgIGlmICgoc3NsX2FjdGl2ZV9mbGFnIHx8IHRsc19hY3RpdmVfZmxhZykgJiYKKyAgICAgICAgICAgICAgICAgICAgKCFURUxPUFRfVShURUxPUFRfQVVUSEVOVElDQVRJT04pIHx8CisgICAgICAgICAgICAgICAgICAgICBja190bl9hdXRoZW50aWNhdGVkKCkgPT0gQVVUSFRZUEVfTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgY2tfdG5fYXV0aGVudGljYXRlZCgpID09IEFVVEhUWVBFX0FVVE8pCisgICAgICAgICAgICAgICAgICAgICkgeworI2lmZGVmIFNTTF9LUkI1CisgICAgICAgICAgICAgICAgICAgIGlmICh0bHNfaXNfa3JiNSgwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJBdXRoZW50aWNhdGVkIHVzaW5nIEtlcmJlcm9zIDVcclxuIik7CisjaWZkZWYgQ0tTWVNMT0cKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfTEkgJiYgY2t4bG9nZ2luZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybiBjaGFyIHN6VXNlck5hbWVBdXRoZW50aWNhdGVkW107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tzeXNsb2coU1lTTEdfTEksIDEsICJBVVRIX1ZBTElEIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2VyYmVyb3MgNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFNTTF9LUkI1ICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQXV0aGVudGljYXRlZCB1c2luZyBYLjUwOSBjZXJ0aWZpY2F0ZVxyXG4iKTsKKyNpZmRlZiBDS1NZU0xPRworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNreHN5c2xvZyA+PSBTWVNMR19MSSAmJiBja3hsb2dnaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWRbXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBja3N5c2xvZyhTWVNMR19MSSwgMSwgIkFVVEhfVkFMSUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLjUwOSBjZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkF1dGhlbnRpY2F0ZWQgdXNpbmcgJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVUSFRZUEVfTkFNRShja190bl9hdXRoZW50aWNhdGVkKCkpKTsKKyNpZmRlZiBDS1NZU0xPRworICAgICAgICAgICAgICAgICAgICAgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfTEkgJiYgY2t4bG9nZ2luZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm4gY2hhciBzelVzZXJOYW1lQXV0aGVudGljYXRlZFtdOworICAgICAgICAgICAgICAgICAgICAgICAgICBja3N5c2xvZyhTWVNMR19MSSwgMSwgIkFVVEhfVkFMSUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIVFlQRV9OQU1FKGNrX3RuX2F1dGhlbnRpY2F0ZWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6VXNlck5hbWVBdXRoZW50aWNhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgenZ1c2VyKHVpZGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKHp2cGFzcygiIikgPT0gMCkKKyAgICAgICAgICAgICAgICAgIHhfbG9nZ2VkID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoeF9sb2dnZWQgPT0gQVVUSF9VU0VSICYmICFzdHJjbXAodWlkYnVmLCJhbm9ueW1vdXMiKSkgeworICAgICAgICAgICAgICAgIGV4dGVybiBjaGFyIHN6VXNlck5hbWVBdXRoZW50aWNhdGVkW107CisgICAgICAgICAgICAgICAgenZ1c2VyKHVpZGJ1Zik7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwic3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgIHN6VXNlck5hbWVBdXRoZW50aWNhdGVkLDApOworICAgICAgICAgICAgICAgIGlmICh6dnBhc3Moc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWQpID09IDApIHsKKyAgICAgICAgICAgICAgICAgIC8qIEFub255bW91cyBsb2dpbiBmYWlsZWQuICBGb3JjZSBhIHVzZXJuYW1lIHByb21wdC4gKi8KKyAgICAgICAgICAgICAgICAgIHhfbG9nZ2VkID0gMDsKKyAgICAgICAgICAgICAgICAgIHVpZGJ1ZlswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCFURUxPUFRfVShURUxPUFRfQVVUSEVOVElDQVRJT04pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgY2tfdG5fYXV0aGVudGljYXRlZCgpID09IEFVVEhUWVBFX05VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBja190bl9hdXRoZW50aWNhdGVkKCkgPT0gQVVUSFRZUEVfQVVUTykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQXV0aGVudGljYXRlZCB1c2luZyBYLjUwOSBjZXJ0aWZpY2F0ZVxyXG4iKTsKKyNpZmRlZiBDS1NZU0xPRworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNreHN5c2xvZyA+PSBTWVNMR19MSSAmJiBja3hsb2dnaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWRbXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBja3N5c2xvZyhTWVNMR19MSSwgMSwgIkFVVEhfVVNFUiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlguNTA5IGNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzelVzZXJOYW1lQXV0aGVudGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkF1dGhlbnRpY2F0ZWQgdXNpbmcgJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhUWVBFX05BTUUoY2tfdG5fYXV0aGVudGljYXRlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNpZmRlZiBDS1NZU0xPRworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX0xJICYmIGNreGxvZ2dpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrc3lzbG9nKFNZU0xHX0xJLCAxLCAiQVVUSF9VU0VSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhUWVBFX05BTUUoY2tfdG5fYXV0aGVudGljYXRlZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6VXNlck5hbWVBdXRoZW50aWNhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBDS1NZU0xPRworICAgICAgICAgICAgICAgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfTEkgJiYgY2t4bG9nZ2luZyAmJgorICAgICAgICAgICAgICAgICAgICB4X2xvZ2dlZCA9PSBBVVRIX1VTRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWRbXTsKKyAgICAgICAgICAgICAgICAgICAgY2tzeXNsb2coU1lTTEdfTEksIDEsICJBVVRIX1VTRVIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIVFlQRV9OQU1FKGNrX3RuX2F1dGhlbnRpY2F0ZWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6VXNlck5hbWVBdXRoZW50aWNhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgICAgICAgICAgeF9sb2dnZWQgPSAwOworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKCIodW5rbm93bikiLHVpZGJ1ZikKKyNpZmRlZiBOVAorICAgICAgICAgICAgICAgICAgICB8fCAhc3RyaWNtcCgiYWRtaW5pc3RyYXRvciIsdWlkYnVmKQorI2lmZGVmIFVOSVgKKyAgICAgICAgICAgICAgICAgICAgfHwgIXN0cmNtcCgicm9vdCIsdWlkYnVmKQorI2Vsc2UKKyNpZmRlZiBQbGFuOQorICAgICAgICAgICAgICAgICAgICB8fCAhc3RyY21wKCJyb290Iix1aWRidWYpCisjZWxzZQorI2lmZGVmIE9TSworICAgICAgICAgICAgICAgICAgICB8fCAhc3RyY21wKCJyb290Iix1aWRidWYpCisjZW5kaWYgLyogT1NLICovCisjZW5kaWYgLyogUGxhbjkgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgdWlkYnVmWzBdID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKworI2lmZGVmIElLU0QKKyAgICAgICAgaWYgKGluc2VydmVyKQorICAgICAgICAgIHByaW50ZigiXHJcbkludGVybmV0IEtlcm1pdCBTZXJ2aWNlIHJlYWR5IGF0ICVzJXNcclxuIixzLHZlcnNpbyk7CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgICAgcHJpbnRmKCJcclxuQy1LZXJtaXQgcmVhZHkgYXQgJXMlc1xyXG4iLHMsdmVyc2lvKTsKKyAgICAgICAgaWYgKCpteWhvc3QpCisgICAgICAgICAgcHJpbnRmKCIlc1xyXG4iLCBteWhvc3QpOworICAgICAgICBwcmludGYoIlxyXG4iKTsKKyAgICB9CisjaWZkZWYgQ0tfTE9HSU4KKyNpZmRlZiBJS1NECisgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgIGludCBpOworICAgICAgICBleHRlcm4gaW50IGFyZ194OyAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yICcteCcgb24gY29tbWFuZCBsaW5lICovCisjaWZuZGVmIE5PU1BMCisgICAgICAgIGV4dGVybiBzdHJ1Y3QgbXRhYiAqbWFjdGFiOyAgICAgICAgIC8qIEZvciBPTl9MT0dJTiBtYWNyby4gKi8KKyAgICAgICAgZXh0ZXJuIGludCBubWFjOworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICAgICAgZGVidWcoRjExMCwiTUFJTiBjbGllbnRob3N0IixjbGllbnRob3N0LDApOworICAgICAgICBzcnZpZGwgPSB0aW1lbGltaXQgPSBsb2dpbnRpbW87IC8qIEZvciBpbnRlcmFjdGl2ZSBsb2dpbiAqLworICAgICAgICBydGltZXIoKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRpbWVyICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpa3NfcmV0cnkgJiYgIXhfbG9nZ2VkOyBpKyspIHsgLyogQ291bnQgcmV0cmllcyAqLworICAgICAgICAgICAgaWYgKGd0aW1lcigpID4gbG9naW50aW1vKQorICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBUTkNPREUKKyAgICAgICAgICAgIHRuX3dhaXQoImxvZ2luIGxvb3AiKTsKKyAgICAgICAgICAgIHRuX3B1c2goKTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIk1BSU4gTE9HSU4gdHJ5IiwiIixpKTsKKyAgICAgICAgICAgIHdoYXQgPSBXX05PVEhJTkc7ICAgICAgICAgICAvKiBCZWNhdXNlIHByb3RvKCkgY2hhbmdlcyB0aGlzICovCisKKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJNQUlOIExPR0lOIiwKKyAgICAgICAgICAgICAgICAgICJURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQKKyAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAvKiBLZXJtaXQgc2VydmVyIG5lZ290aWF0ZWQgKi8KKyAgICAgICAgICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0KSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiSUtTRCBzdGFydGluZyBpbiBzZXJ2ZXIgbW9kZSIsIiIsMCk7CisgICAgICAgICAgICAgICAgYXJnX3ggPSAxOyAgICAgICAgICAgICAgLyogRW50ZXIgc2VydmVyIG1vZGUgKi8KKyAgICAgICAgICAgICAgICBzc3RhdGUgPSAneCc7CisjaWZkZWYgSUtTRFBPUEJBQ0sKKyAgICAgICAgICAgICAgICBqdXN0b25lID0gMTsgICAgICAgICAgICAvKiBFeGVjdXRlIG9uZSBjb21tYW5kIGF0IGEgdGltZS4gKi8KKyNlbmRpZiAvKiBJS1NEUE9QQkFDSyAqLworICAgICAgICAgICAgICAgIHByb3RvKCk7ICAgICAgICAgICAgICAgIC8qIEVudGVyIHByb3RvY29sIGlmIHJlcXVlc3RlZC4gKi8KKyNpZmRlZiBOVFNJRworICAgICAgICAgICAgICAgIGNrX2loKCk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyAgICAgICAgICAgICAgICBpZiAoeF9sb2dnZWQpICAgICAgICAgICAvKiBMb2dnZWQgaW4gKi8KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBpbiBjbGllbnQvc2VydmVyIG1vZGUgKi8KKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiSUtTRCBzdGFydGluZyB3aXRoIFVzZXJuYW1lIHByb21wdCIsIiIsMCk7CisgICAgICAgICAgICAgICAgeF9sb2dnZWQgPSBja3hsb2dpbigoQ0hBUiAqKXVpZGJ1ZixOVUxMLE5VTEwsMSk7CisgICAgICAgICAgICAgICAgaWYgKHNzdGF0ZSkgeyAgICAgICAgICAgLyogUmVjZWl2ZWQgYSBwYWNrZXQgYXQgcHJvbXB0ICovCisjaWZkZWYgSUtTRFBPUEJBQ0sKKyAgICAgICAgICAgICAgICAgICAganVzdG9uZSA9IDE7ICAgICAgICAvKiBHbyBoYW5kbGUgaXQgKi8KKyNlbmRpZiAvKiBJS1NEUE9QQkFDSyAqLworICAgICAgICAgICAgICAgICAgICBwcm90bygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXhfbG9nZ2VkKSB7ICAgICAgICAvKiBJbiBjYXNlIHdlIGFyZSBhdCB0aGUgcHJvbXB0Li4uICovCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQWNjZXNzIGRlbmllZC5cbiIpOworICAgICAgICAgICAgICAgICAgICB1aWRidWZbMF0gPSAnXDAnOyAgIC8qIEZvcmdldCB0aGUgbmFtZSBpZiB3ZSBoYXZlIG9uZSAqLworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgICAgICAgICB9CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworICAgICAgICB9CisgICAgICAgIHNydmlkbCA9IHRpbWVsaW1pdCA9IGlrc190aW1vOyAgLyogUmVzZXQgY29tbWFuZCB0aW1lbGltaXQgKi8KKyAgICAgICAgZGVidWcoRjEwMSwiTUFJTiBMT0dJTiIsIiIseF9sb2dnZWQpOworICAgICAgICBpZiAoIXhfbG9nZ2VkKSB7ICAgICAgICAgICAgICAgIC8qIExvZ2lucyBmYWlsZWQuICovCisgICAgICAgICAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9zdGFydCkKKyAgICAgICAgICAgICAgZXJycGt0KChDSEFSICopIkxvZ2luIFRpbWVvdXQiKTsKKyAgICAgICAgICAgIG1zbGVlcCg1MDApOworICAgICAgICAgICAgZG9leGl0KEJBRF9FWElULDApOworICAgICAgICB9CisgICAgICAgIHdoYXQgPSBXX05PVEhJTkc7ICAgICAgICAgICAgICAgLyogU3RheSBpbiBrbm93biBzdGF0ZSAqLworI2lmbmRlZiBOT1NFUlZFUgorICAgICAgICBpZiAoaXNndWVzdCkgeworICAgICAgICAgICAgZW5fcHJpID0gMDsgICAgICAgICAgICAgICAgIC8qIE5vIHByaW50aW5nIGZvciBhbm9ueW1vdXMgdXNlcnMgKi8KKyAgICAgICAgICAgIGVuX21haSA9IDA7ICAgICAgICAgICAgICAgICAvKiBObyBlbWFpbCBmb3IgYW5vbnltb3VzIHVzZXJzICovCisgICAgICAgICAgICBlbl9ta2QgPSAwOyAgICAgICAgICAgICAgICAgLyogT3IgZGlyZWN0b3J5IGNyZWF0aW9uICovCisgICAgICAgICAgICBlbl9ybWQgPSAwOyAgICAgICAgICAgICAgICAgLyogT3IgZGlyZWN0b3J5IHJlbW92YWwgKi8KKyAgICAgICAgICAgIGVuX2VuYSA9IDA7ICAgICAgICAgICAgICAgICAvKiBPciBFTkFCTGluZyBESVNBQkxFZCBpdGVtcyAqLworICAgICAgICB9CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKworI2lmbmRlZiBOT1NQTAorLyoKKyAgSWYgYSBtYWNybyBuYW1lZCAib25fbG9naW4iIGlzIGRlZmluZWQsIGV4ZWN1dGUgaXQuICBBbHNvIHJlbW92ZSBpdCBmcm9tIHRoZQorICBtYWNybyB0YWJsZSBzbyB0aGUgdXNlciBjYW5ub3Qgc2VlIHdoYXQgaXQgZG9lcy4gIEV4ZWN1dGUgaXQgYXMgcGFydCBvZiB0aGUKKyAgaWtzZC5jb25mIGZpbGUuCisqLworICAgICAgICBpZiAobm1hYykgeyAgICAgICAgICAgICAgICAgICAgIC8qIEFueSBtYWNyb3MgZGVmaW5lZD8gKi8KKyAgICAgICAgICAgIGludCBrOyAgICAgICAgICAgICAgICAgICAgICAvKiBZZXMgKi8KKyAgICAgICAgICAgIGNoYXIgKiBjbWQgPSAib25fbG9naW4iOyAgICAvKiBNU1ZDIDIueCBjb21waWxlciBlcnJvciAqLworICAgICAgICAgICAgayA9IG1sb29rKG1hY3RhYixjbWQsbm1hYyk7IC8qIExvb2sgdXAgIm9uX2V4aXQiICovCisgICAgICAgICAgICBpZiAoayA+PSAwKSB7ICAgICAgICAgICAgICAgLyogSWYgZm91bmQsICovCisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICAgICAgICBpbnQgc2F2ZWQgPSBpa3NkY2Y7CisgICAgICAgICAgICAgICAgaWtzZGNmID0gMDsKKyNlbmRpZiAvKiBJS1NEQ09ORiAqLworICAgICAgICAgICAgICAgIGlmIChkb2RvKGssIiIsMCkgPiAtMSkgIC8qIHNldCBpdCB1cCwgKi8KKyAgICAgICAgICAgICAgICAgIHBhcnNlcigxKTsgICAgICAgICAgICAvKiBleGVjdXRlIGl0ICovCisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICAgICAgICBpa3NkY2YgPSBzYXZlZDsKKyNlbmRpZiAvKiBJS1NEQ09ORiAqLworICAgICAgICAgICAgICAgIGRlbG1hYyhjbWQsMSk7ICAgICAgICAgIC8qIGFuZCBkZWxldGUgaXQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgfSAvKiBpZiAoaW5zZXJ2ZXIpICovCisjZWxzZSAvKiBDS19MT0dJTiAqLworICAgIGlmIChpbnNlcnZlcikKKyAgICAgICAgc3J2aWRsID0gdGltZWxpbWl0ID0gaWtzX3RpbW87ICAvKiBTZXQgaWRsZSBsaW1pdHMgZm9yIElLUyAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisjZW5kaWYgLyogSUtTRCAqLworfQorCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2ZhaWxjbWRsaW5lKHZvaWQgKiBmb28pCisjZWxzZSAvKiBDS19BTlNJQyAqLworZmFpbGNtZGxpbmUoZm9vKSBWT0lEICogZm9vOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisjaWZkZWYgR0VNRE9TCisgICAgY2NfY2xlYW4oKTsKKyNlbmRpZiAvKiBHRU1ET1MgKi8KKyNpZm5kZWYgTk9MT0NBTAorICAgIGlmIChjbmZsZykgZG9jb25lY3QoMCwwKTsgICAgICAgICAgIC8qIGNvbm5lY3QgYWdhaW4gaWYgcmVxdWVzdGVkLiAqLworICAgIGlmICh0dGNoaygpIDwgMCkKKyAgICAgIGRvbG9nZW5kKCk7CisjZW5kaWYgLyogTk9MT0NBTCAqLworfQorI2VuZGlmIC8qIE5PQ01ETCAqLworCisjaWZuZGVmIE5PSUNQCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2RvdGFrZWluaSh2b2lkICogdGhyZWFkaW5mbykgICAgICAgICAgICAvKiBFeGVjdXRlIGluaXQgZmlsZS4gKi8KKyNlbHNlICAvKiBDS19BTlNJQyAqLworZG90YWtlaW5pKHRocmVhZGluZm8pIFZPSUQgKiB0aHJlYWRpbmZvOyAvKiBFeGVjdXRlIGluaXQgZmlsZS4gKi8KKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogZG90YWtlaW5pICovIHsKKyNpZmRlZiBOVFNJRworICAgIHNldGludCgpOworICAgIGlmICh0aHJlYWRpbmZvKSB7ICAgICAgICAgICAgICAgICAgIC8qIFRocmVhZCBsb2NhbCBzdG9yYWdlLi4uICovCisgICAgICAgVGxzU2V0VmFsdWUoVGxzSW5kZXgsdGhyZWFkaW5mbyk7CisgICAgICAgZGVidWcoRjEwMCwgImRvdGFrZWluaSBjYWxsZWQgd2l0aCB0aHJlYWRpbmZvIGJsb2NrIiwiIiwgMCk7CisgICAgfSBlbHNlCisgICAgICBkZWJ1ZyhGMTAwLCAiZG90YWtlaW5pIC0gdGhyZWFkaW5mbyBpcyBOVUxMIiwgIiIsIDApOworI2VuZGlmIC8qIE5UU0lHICovCisjaWZkZWYgQ0tfTE9HSU4KKyNpZmRlZiBOVAorI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpCisgICAgICBzZXRudGNyZWRzKCk7CisjZW5kaWYgLyogSUtTRCAqLworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICBjbWRpbmkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXRzIHRsZXZlbCAqLworCisgICAgZGVidWcoRjExMSwiZG90YWtlaW5pIiwiaW5zZXJ2ZXIiLGluc2VydmVyKTsKKyAgICBkZWJ1ZyhGMTExLCJkb3Rha2VpbmkiLCJzc3RlbG5ldCIsc3N0ZWxuZXQpOworCisjaWZkZWYgQ09NTUVOVAorLyogV3JvbmcgcGxhY2UgZm9yIHRoaXMuLi4gKi8KKyNpZm5kZWYgTk9YRkVSCisjaWZkZWYgQ0tfRkFTVAorICAgIGRvZmFzdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ5IG5vdyBGQVNUIGRlZmF1bHRzIHNob3VsZCBiZSBPSyAqLworI2VuZGlmIC8qIENLX0ZBU1QgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICBkb2luaXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3cgZG8gdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgKi8KKyAgICBkZWJ1ZyhGMTAxLCJtYWluIGV4ZWN1dGluZyBpbml0IGZpbGUiLCIiLHRsZXZlbCk7CisgICAgd2hpbGUgKHRsZXZlbCA+IC0xKSB7CisgICAgICAgIHNzdGF0ZSA9IChDSEFSKSBwYXJzZXIoMSk7ICAgICAgLyogRXhlY3V0ZSBvbmUgY29tbWFuZCBhdCBhIHRpbWUuICovCisgICAgICAgIGlmIChzc3RhdGUpIHByb3RvKCk7ICAgICAgICAgICAgLyogRW50ZXIgcHJvdG9jb2wgaWYgcmVxdWVzdGVkLiAqLworI2lmZGVmIE5UU0lHCisgICAgICAgIGNrX2loKCk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyAgICB9CisgICAgZGVidWcoRjEwMSwibWFpbiBleGl0cyBpbml0IGZpbGUiLCIiLHRsZXZlbCk7CisKKyNpZmRlZiBOVFNJRworICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisgICAgcmV0dXJuOworfQorCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2ZhaWx0YWtlaW5pKHZvaWQgKiB0aHJlYWRpbmZvKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2ZhaWx0YWtlaW5pKHRocmVhZGluZm8pIFZPSUQgKiB0aHJlYWRpbmZvOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBmYWlsdGFrZWluaSAqLyB7CisjaWZkZWYgR0VNRE9TCisgICAgY2NfY2xlYW4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXRhcmk6IENsZWFuIHVwIGFmdGVyIF5DLXRyYXAuICovCisjZW5kaWYgLyogR0VNRE9TICovCisgICAgaWYgKCFjZmlsZWYpIHsKKyAgICAgICAgY29ub2xsKCJJbnRlcnJ1cHQgZHVyaW5nIGluaXRpYWxpemF0aW9uIG9yIGNvbW1hbmQtbGluZSBwcm9jZXNzaW5nLiIpOworICAgICAgICBjb25vbGwoIkMtS2VybWl0IHF1aXR0aW5nLi4uIik7CisgICAgfQorICAgIGRvZXhpdChCQURfRVhJVCwtMSk7ICAgICAgICAgICAgICAgIC8qIEV4aXQgd2l0aCBiYWQgc3RhdHVzLiAqLworfQorCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2RvaWNwKHZvaWQgKiB0aHJlYWRpbmZvKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2RvaWNwKHRocmVhZGluZm8pIFZPSUQgKiB0aHJlYWRpbmZvOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBkb2ljcCAqLyB7CisjaWZkZWYgTlRTSUcKKyAgICBzZXRpbnQoKTsKKyAgICBpZiAodGhyZWFkaW5mbykgeyAgICAgICAgICAgICAgICAgICAvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZS4uLiAqLworICAgICAgIGlmICghVGxzU2V0VmFsdWUoVGxzSW5kZXgsdGhyZWFkaW5mbykpCisgICAgICAgICAgZGVidWcoRjEwMSwiZG9pY3AgVGxzU2V0VmFsdWUgZmFpbGVkIiwiIixHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgZGVidWcoRjEwMSwgImRvaWNwIGEgdGhyZWFkaW5mbyBibG9jayAtIFRsc0luZGV4IiwgIiIsIFRsc0luZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWJ1ZyhGMTAwLCAiZG9pY3AgcmVjZWl2ZWQgYSBudWxsIHRocmVhZGluZm8iLCAiIiwgMCk7CisgICAgfQorI2VuZGlmIC8qIE5UU0lHICovCisjaWZkZWYgQ0tfTE9HSU4KKyNpZmRlZiBOVAorI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpCisgICAgICBzZXRudGNyZWRzKCk7CisjZW5kaWYgLyogSUtTRCAqLworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyNpZmRlZiBNQUMKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBleHRlcm4gY2hhciAqbGZpbGVzOyAgICAgICAgICAgIC8qIEZha2UgcG9pbnRlciBjYXN0ICovCisKKyAgICAgICAgaWYgKGNvbm5lY3RlZCkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwgImRvaWNwOiBjYWxsaW5nIG1hY3BhcnNlciIsICIiLCAwKTsKKyAgICAgICAgICAgIHNzdGF0ZSA9IG5ld3BhcnNlcigxLCAxLCAwTCk7CisKKyAgICAgICAgICAgIC8qIGlnbm9yZSBudWxsIGNvbW1hbmQgc3RhdGUgKi8KKyAgICAgICAgICAgIGlmIChzc3RhdGUgPT0gJ24nKQorICAgICAgICAgICAgICBzc3RhdGUgPSAnXDAnOworCisgICAgICAgICAgICBpZiAoc3N0YXRlKQorICAgICAgICAgICAgICBwcm90bygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHByb2Nlc3MgdGFrZSBmaWxlcyB0aGUgZmluZGVyIGdhdmUgdXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgodGxldmVsID09IC0xKSAmJiBsZmlsZXMpCisgICAgICAgICAgICAgIHN0YXJ0bGZpbGUoKTsKKworICAgICAgICAgICAgZGVidWcoRjEwMCwgImRvaWNwOiBjYWxsaW5nIHBhcnNlciIsICIiLCAwKTsKKyAgICAgICAgICAgIHNzdGF0ZSA9IChDSEFSKSBwYXJzZXIoMCk7CisgICAgICAgICAgICBpZiAoc3N0YXRlID09ICdjJykgICAgICAgICAgLyogaWYgTUFDIGNvbm5lY3QgKi8KKyAgICAgICAgICAgICAgc3N0YXRlID0gMDsKKyAgICAgICAgICAgIGlmIChzc3RhdGUpCisgICAgICAgICAgICAgIHByb3RvKCk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZSAvKiBOb3QgTUFDICovCisKKyNpZm5kZWYgTk9TUEwKKy8qCisgIElmIGludGVyYWN0aXZlIGNvbW1hbmRzIHdlcmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSAodXNpbmcgdGhlCisgIC1DICJjb21tYW5kLCBjb21tYW5kLCAuLi4iIG9wdGlvbiksIGFzc2lnbiB0aGVtIHRvIGEgbWFjcm8gY2FsbGVkCisgICJjbF9jb21tYW5kcyIsIHRoZW4gZXhlY3V0ZSB0aGUgbWFjcm8gYW5kIGxlYXZlIGl0IGRlZmluZWQgZm9yCisgIHN1YnNlcXVlbnQgcmUtZXhlY3V0aW9uIGlmIGRlc2lyZWQuCisqLworICAgIGlmIChjbGNtZHMpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciAtQyBjb21tYW5kcyAqLworICAgICAgICBpbnQgeDsKKyAgICAgICAgeCA9IGFkZG1hYygiY2xfY29tbWFuZHMiLGNsY21kcyk7IC8qIFB1dCBtYWNybyBpbiB0YWJsZSAqLworICAgICAgICBpZiAoeCA+IC0xKSB7ICAgICAgICAgICAgICAgICAgIC8qIElmIHN1Y2Nlc3NmdWwsICovCisgICAgICAgICAgICBkb2RvKHgsTlVMTCxDRl9DTURMKTsgICAgICAgLyogc2V0IHVwIGZvciBtYWNybyBleGVjdXRpb24gKi8KKyAgICAgICAgICAgIHdoaWxlIChtYWNsdmwgPiAtMSkgeyAgICAgICAvKiBMb29wIGdldHRpbmcgbWFjcm8gY29tbWFuZHMuICovCisgICAgICAgICAgICAgICAgc3N0YXRlID0gKENIQVIpIHBhcnNlcigxKTsKKyAgICAgICAgICAgICAgICBpZiAoc3N0YXRlKSBwcm90bygpOyAgICAvKiBFbnRlciBwcm90b2NvbCBpZiByZXF1ZXN0ZWQuICovCisjaWZkZWYgTlRTSUcKKyAgICAgICAgICAgICAgICBja19paCgpOworI2VuZGlmIC8qIE5UU0lHICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjEwMCwiZG9pY3AgY2FsbGluZyBoZXJhbGQiLCIiLDApOworICAgICAgICBoZXJhbGQoKTsKKyAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICB3aGlsZSgxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb29wIGdldHRpbmcgY29tbWFuZHMuICovCisgICAgICAgIHNzdGF0ZSA9IChDSEFSKSBwYXJzZXIoMCk7CisgICAgICAgIGlmIChzc3RhdGUpIHByb3RvKCk7ICAgICAgICAgICAgLyogRW50ZXIgcHJvdG9jb2wgaWYgcmVxdWVzdGVkLiAqLworI2lmZGVmIE5UU0lHCisgICAgICAgY2tfaWgoKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgIH0KKyNpZmRlZiBOVFNJRworICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisjZW5kaWYgLyogTUFDICovCit9CisKK1ZPSUQKKyNpZmRlZiBDS19BTlNJQworZmFpbGljcCh2b2lkICogdGhyZWFkaW5mbykKKyNlbHNlIC8qIENLX0FOU0lDICovCitmYWlsaWNwKHRocmVhZGluZm8pIFZPSUQgKiB0aHJlYWRpbmZvOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisjaWZkZWYgR0VNRE9TCisgICAgY2NfY2xlYW4oKTsKKyNlbmRpZiAvKiBHRU1ET1MgKi8KKyAgICBmaXhjbWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3AgY29tbWFuZCBzdGFja3MsIGV0Yy4gKi8KKyAgICBjbGNtZHMgPSBOVUxMOworICAgIGRlYnVnKEYxMDAsImNrY21haSBnb3QgaW50ZXJydXB0IiwiIiwwKTsKK30KKyNlbmRpZiAvKiBOT0lDUCAqLworCisjaWZuZGVmIE5PSUNQCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2RvY21kZmlsZSh2b2lkICogdGhyZWFkaW5mbykgICAgICAgICAgICAvKiBFeGVjdXRlIGFwcGxpY2F0aW9uIGZpbGUgKi8KKyNlbHNlIC8qIENLX0FOU0lDICovCitkb2NtZGZpbGUodGhyZWFkaW5mbykgVk9JRCAqIHRocmVhZGluZm87CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGRvY21kZmlsZSAqLyB7CisjaWZkZWYgTlRTSUcKKyAgICBjb25jYigoY2hhcillc2NhcGUpOworICAgIHNldGludCgpOworICAgIGlmICh0aHJlYWRpbmZvKSB7ICAgICAgICAgICAgICAgICAgIC8qIFRocmVhZCBsb2NhbCBzdG9yYWdlLi4uICovCisgICAgICAgIFRsc1NldFZhbHVlKFRsc0luZGV4LHRocmVhZGluZm8pOworICAgICAgICBkZWJ1ZyhGMTAwLCAiZG9jbWRmaWxlIGNhbGxlZCB3aXRoIHRocmVhZGluZm8gYmxvY2siLCIiLCAwKTsKKyAgICB9IGVsc2UgZGVidWcoRjEwMCwgImRvY21kZmlsZSAtIHRocmVhZGluZm8gaXMgTlVMTCIsICIiLCAwKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworI2lmZGVmIENLX0xPR0lOCisjaWZkZWYgSUtTRAorI2lmZGVmIE5UCisgICAgaWYgKGluc2VydmVyKQorICAgICAgc2V0bnRjcmVkcygpOworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogSUtTRCAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisgICAgZGVidWcoRjExMCwibWFpbiBjbWRmaWwiLGNtZGZpbCwwKTsKKyNpZm5kZWYgTk9TUEwKKyAgICBhZGRtYWMoIlxcJTAiLGNtZGZpbCk7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICBkb3Rha2UoY21kZmlsKTsgICAgICAgICAgICAgICAgICAgICAvKiBleGVjdXRlIGl0ICovCisgICAgd2hpbGUgKHRsZXZlbCA+IC0xKSB7ICAgICAgICAgICAgICAgLyogdW50aWwgaXQgcnVucyBvdXQuICovCisgICAgICAgIHNzdGF0ZSA9IHBhcnNlcigxKTsgICAgICAgICAgICAgLyogTG9vcCBnZXR0aW5nIGNvbW1hbmRzLiAqLworICAgICAgICBpZiAoc3N0YXRlKSBwcm90bygpOyAgICAgICAgICAgIC8qIEVudGVyIHByb3RvY29sIGlmIHJlcXVlc3RlZC4gKi8KKyNpZmRlZiBOVFNJRworICAgICAgICBja19paCgpOworI2VuZGlmIC8qIE5UU0lHICovCisgICAgfQorICAgIGNmaWxlZiA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHdlIGRpZCB0aGlzICovCisKKyNpZmRlZiBOVFNJRworICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisgICAgcmV0dXJuOworfQorCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2ZhaWxjbWRmaWxlKHZvaWQgKiB0aHJlYWRpbmZvKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2ZhaWxjbWRmaWxlKHRocmVhZGluZm8pIFZPSUQgKiB0aHJlYWRpbmZvOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBmYWlsY21kZmlsZSAqLyB7CisjaWZkZWYgR0VNRE9TCisgICAgY2NfY2xlYW4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXRhcmk6IENsZWFuIHVwIGFmdGVyIF5DLXRyYXAuICovCisjZW5kaWYgLyogR0VNRE9TICovCisgICAgaWYgKCFjZmlsZWYpIHsKKyAgICAgICAgY29ub2xsKCJJbnRlcnJ1cHQgZHVyaW5nIGluaXRpYWxpemF0aW9uIG9yIGNvbW1hbmQtbGluZSBwcm9jZXNzaW5nLiIpOworICAgICAgICBjb25vbGwoIkMtS2VybWl0IHF1aXR0aW5nLi4uIik7CisgICAgfQorICAgIGRvZXhpdChCQURfRVhJVCwtMSk7ICAgICAgICAgICAgICAgIC8qIEV4aXQgd2l0aCBiYWQgc3RhdHVzLiAqLworfQorI2VuZGlmIC8qIE5PSUNQICovCisKKyNpZm5kZWYgTk9YRkVSCitWT0lECitzZXRwcmVmaXgoeikgaW50IHo7IHsgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbCBjb250cm9sLWNoYXIgcHJlZml4aW5nICovCisjaWZkZWYgQ0tfU1BFRUQKKyAgICBpbnQgaSwgdmFsOworCisgICAgcHJlZml4aW5nID0gejsKKyAgICBwdGFiW3Byb3RvY29sXS5wcmVmaXggPSBwcmVmaXhpbmc7CisgICAgZGVidWcoRjEwMSwic2V0cHJlZml4IiwiIixwcmVmaXhpbmcpOworICAgIHN3aXRjaCAoeikgeworICAgICAgY2FzZSBQWF9BTEw6ICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgLyogRG9uJ3QgbGV0IENsZWFyLUNoYW5uZWwgYmUgZGVwZW5kZW50IG9uIHByZWZpeGluZyAqLworICAgICAgICBjbGVhcnJxID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIFR1cm4gb2ZmIGNsZWFyY2hhbm5lbCwgZmFsbCB0aHJ1ICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgY2FzZSBQWF9OT046ICAgICAgICAgICAgICAgICAgICAgIC8qIE5vbmUgKi8KKyAgICAgICAgdmFsID0gKHogPT0gUFhfQUxMKSA/IDEgOiAwOworICAgICAgICBmb3IgKGkgPQorI2lmZGVmIFVOUFJFRklYWkVSTworICAgICAgICAgICAgIDAKKyNlbHNlCisgICAgICAgICAgICAgMQorI2VuZGlmIC8qIFVOUFJFRklYWkVSTyAqLworICAgICAgICAgICAgIDsgaSA8IDMyOyBpKyspCisgICAgICAgICAgY3RscFtpXSA9IHZhbDsKKyAgICAgICAgZm9yIChpID0gMTI3OyBpIDwgMTYwOyBpKyspIGN0bHBbaV0gPSB2YWw7CisgICAgICAgIGN0bHBbKHVuc2lnbmVkKTI1NV0gPSB2YWw7CisgICAgICAgIGlmICh6ID09IFBYX05PTikgeyAgICAgICAgICAgICAgLyogVGhlc2UgYXJlIG5ldmVyIHNhZmUgKi8KKyAgICAgICAgICAgIGlmIChuZXR3b3JrKSB7ICAgICAgICAgICAgICAvKiBBc3N1bWUgbmV0d29yayA9IHRlbG5ldCBvciBybG9naW4gKi8KKyAgICAgICAgICAgICAgICBjdGxwW0NSXSA9IDE7ICAgICAgICAgICAvKiBQcmVmaXggQ1IgYmVjYXVzZSBvZiBOVlQgcnVsZXMgKi8KKyAgICAgICAgICAgICAgICBjdGxwW1hPTl0gPSBjdGxwW1hPRkZdID0gMTsgLyogQmVjYXVzZSBvZiBUZWxuZXQgc2VydmVyICovCisgICAgICAgICAgICAgICAgY3RscFsxMjddID0gY3RscFsyNTVdID0gMTsgIC8qIFRlbG5ldCBJQUMgKi8KKyAgICAgICAgICAgICAgICBjdGxwW215c3RjaF0gPSBjdGxwW215c3RjaCsxMjhdID0gMTsgLyogS2VybWl0IHBhY2tldCBzdGFydCAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjdGxwW0NSXSA9IGN0bHBbMjU1XSA9IGN0bHBbbXlzdGNoXSA9IGN0bHBbbXlzdGNoKzEyOF0gPSAxOworICAgICAgICAgICAgICAgIGlmIChmbG93ID09IEZMT19YT05YKSAgICAgICAvKiBYb24vWG9mZiBmb3JjZXMgcHJlZml4aW5nICovCisgICAgICAgICAgICAgICAgICBjdGxwW1hPTl0gPSBjdGxwW1hPRkZdID0gY3RscFtYT04rMTI4XSA9IGN0bHBbWE9GRisxMjhdID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQWF9DQVU6ICAgICAgICAgICAgICAgICAgICAgIC8qIENhdXRpb3VzIG9yIE1pbmltYWwgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgIC8qIERvbid0IGxldCBDTEVBUi1DSEFOTkVMIGJlIGRlcGVuZGVudCBvbiBQcmVmaXhpbmcgKi8KKyAgICAgICAgY2xlYXJycSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBUdXJuIG9mZiBjbGVhcmNoYW5uZWwgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICBjYXNlIFBYX1dJTDogICAgICAgICAgICAgICAgICAgICAgLyogTWluaW1hbCAoIndpbGQiKSAqLworICAgICAgICBjdGxwWzBdID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIERvZXMgbm90IGluY2x1ZGUgMCAqLworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMzI7IGkrKykKKyAgICAgICAgICBjdGxwW2ldID0gMDsKKyAgICAgICAgZm9yIChpID0gMTI3OyBpIDwgMTYwOyBpKyspCisgICAgICAgICAgY3RscFtpXSA9IDA7CisgICAgICAgIGN0bHBbbXlzdGNoXSA9IGN0bHBbbXlzdGNoKzEyOF0gPSAxOyAvKiBLZXJtaXQgc3RhcnQgb2YgcGFja2V0ICovCisgICAgICAgIGlmIChzZW9sICE9IDEzKQorICAgICAgICAgIGN0bHBbc2VvbF0gPSBjdGxwW3Nlb2wrMTI4XSA9IDE7IC8qIEtlcm1pdCBlbmQgKi8KKyAgICAgICAgY3RscFsxM10gPSBjdGxwWzE0MV0gPSAxOyAgICAgICAvKiBJbiBjYXNlIG9mIFRFTE5FVCAoTlZUIHJ1bGVzKSAqLworICAgICAgICBjdGxwWyh1bnNpZ25lZCkyNTVdID0gMTsgICAgICAgIC8qIERpdHRvICovCisKKyAgICAgICAgLyogXkQsIF5KLCBeTSwgb3IgXlUgZm9sbG93ZWQgYnkgdGlsZGUgdHJpZ2dlciBSbG9naW4gZXNjYXBlICovCisKKyAgICAgICAgY3RscFs0XSAgPSBjdGxwWzQrMTI4XSAgPSAxOyAgICAvKiBJbiBjYXNlIG9mIFJMT0dJTiAqLworICAgICAgICBjdGxwWzEwXSA9IGN0bHBbMTArMTI4XSA9IDE7ICAgIC8qIEluIGNhc2Ugb2YgUkxPR0lOICovCisgICAgICAgIGN0bHBbMjFdID0gY3RscFsyMSsxMjhdID0gMTsgICAgLyogSW4gY2FzZSBvZiBSTE9HSU4gKi8KKworICAgICAgICBpZiAoZmxvdyA9PSBGTE9fWE9OWCB8fCAgICAgICAgIC8qIFhvbi9Yb2ZmIGZvcmNlcyBwcmVmaXhpbmcgdGhlc2UgKi8KKyAgICAgICAgICAgIHByZWZpeGluZyA9PSBQWF9DQVUgfHwgICAgICAvKiBTbyBkb2VzIENBVVRJT1VTICovCisgICAgICAgICAgICBuZXR3b3JrKSAgICAgICAgICAgICAgICAgICAgLyogTmV0d29ya3MgdG9vLi4uICovCisgICAgICAgICAgY3RscFtYT05dID0gY3RscFtYT0ZGXSA9IGN0bHBbWE9OKzEyOF0gPSBjdGxwW1hPRkYrMTI4XSA9IDE7CisgICAgICAgIGlmIChwcmVmaXhpbmcgPT0gUFhfQ0FVKSB7ICAgICAgLyogQ2F1dGlvdXMgLSBhZGQgc29tZSBtb3JlICovCisjaWZkZWYgVU5QUkVGSVhaRVJPCisgICAgICAgICAgICBjdGxwWzBdID0gMTsKKyNlbmRpZiAvKiBVTlBSRUZJWFpFUk8gKi8KKyAgICAgICAgICAgIGN0bHBbM10gICA9IGN0bHBbMTZdICA9IDE7ICAgICAgICAgICAgIC8qIF5DLCBETEUgKi8KKyAgICAgICAgICAgIGN0bHBbMTRdICA9IGN0bHBbMTVdICA9IDE7ICAgICAgICAgICAgIC8qIFNPL1NJICovCisgICAgICAgICAgICBjdGxwWzI0XSAgPSBjdGxwWzI1XSAgPSAxOyAgICAgICAgICAgICAvKiBWTVMgbWlnaHQgbmVlZCB0aGVzZSAqLworICAgICAgICAgICAgY3RscFsyNl0gID0gY3RscFsyNisxMjhdID0gMTsgICAgICAgICAgLyogVU5JWCBzdXNwZW5kICovCisgICAgICAgICAgICBjdGxwWzI4XSAgPSBjdGxwWzI5XSAgPSBjdGxwWzMwXSAgPSAxOyAvKiBBc3NvcnRlZCBlc2MgY2hhcnMgKi8KKyAgICAgICAgICAgIGN0bHBbMTMxXSA9IGN0bHBbMTQxXSA9IGN0bHBbMTQ0XSA9IDE7IC8qIGFuZCA4LWJpdCB2ZXJzaW9ucyAqLworICAgICAgICAgICAgY3RscFsodW5zaWduZWQpMjU1XSA9IGN0bHBbMTU2XSA9IGN0bHBbMTU3XSA9IGN0bHBbMTU4XSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIENLX1NQRUVEICovCit9CisjZW5kaWYgLyogTk9YRkVSICovCisKK1ZPSUQKK21ha2V2ZXIoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIHZlcnNpb24gc3RyaW5nIGZyb20gcGllY2VzICovCisgICAgaW50IHgsIHk7CisjaWZuZGVmIE9TMgorI2lmbmRlZiBNQUMKKyAgICBja19zX3h2ZXIgPSBja19zX3ZlcjsgICAgICAgICAgICAgICAvKiBGaWxsIGluIEMtS2VybWl0IHZlcnNpb24gbnVtYmVyICovCisgICAgY2tfbF94dmVyID0gY2tfbF92ZXI7ICAgICAgICAgICAgICAgLyogZm9yIFVOSVgsIFZNUywgZXRjLiAqLworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIHggPSBzdHJsZW4oY2tfc19uYW1lKTsKKyAgICB5ID0gc3RybGVuKGNrX3NfeHZlcik7CisgICAgaWYgKHkgKyB4ICsgMSA8IENLVkVSTEVOKSB7CisgICAgICAgIGNrbWFrbXNnKHZlcnNpbyxDS1ZFUkxFTixja19zX25hbWUsIiAiLGNrX3NfeHZlcixOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBja3N0cm5jcHkodmVyc2lvLCJDLUtlcm1pdCIsQ0tWRVJMRU4pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHggKz0geSArIDE7CisgICAgaWYgKCpja19zX3dobykgeworICAgICAgICB5ID0gc3RybGVuKGNrX3Nfd2hvKTsKKyAgICAgICAgaWYgKENLVkVSTEVOIDwgeCArIHkgKyAxKQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2tzdHJuY2F0KHZlcnNpbywiLSIsQ0tWRVJMRU4pOworICAgICAgICBja3N0cm5jYXQodmVyc2lvLGNrX3Nfd2hvLENLVkVSTEVOKTsKKyAgICB9CisgICAgeCArPSB5ICsgMTsKKyAgICB5ID0gc3RybGVuKGNrX3NfdGVzdCk7CisgICAgaWYgKHkgPiAwICYmIHkgKyB4ICsgMSA8IENLVkVSTEVOKSB7CisgICAgICAgIGNrc3RybmNhdCh2ZXJzaW8sIiAiLENLVkVSTEVOKTsKKyAgICAgICAgY2tzdHJuY2F0KHZlcnNpbyxja19zX3Rlc3QsQ0tWRVJMRU4pOworICAgICAgICB4ICs9IHkgKyAxOworICAgICAgICB5ID0gc3RybGVuKGNrX3NfdHZlcik7CisgICAgICAgIGlmICh5ID4gMCAmJiB5ICsgeCArIDEgPCBDS1ZFUkxFTikgeworICAgICAgICAgICAgY2tzdHJuY2F0KHZlcnNpbywiLiIsQ0tWRVJMRU4pOworICAgICAgICAgICAgY2tzdHJuY2F0KHZlcnNpbyxja19zX3R2ZXIsQ0tWRVJMRU4pOworICAgICAgICAgICAgeCArPSB5ICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICB5ID0gc3RybGVuKGNrX3NfZGF0ZSk7CisgICAgaWYgKHkgPiAwICYmIHkgKyB4ICsgMiA8IENLVkVSTEVOKSB7CisgICAgICAgIGNrc3RybmNhdCh2ZXJzaW8sIiwgIixDS1ZFUkxFTik7CisgICAgICAgIGNrc3RybmNhdCh2ZXJzaW8sY2tfc19kYXRlLENLVkVSTEVOKTsKKyAgICB9CisgICAgdmVybnVtID0gY2tfbF92ZXI7CisgICAgeHZlcm51bSA9IGNrX2xfeHZlcjsKKyAgICBkZWJ1ZyhGMTEwLCJLZXJtaXQgdmVyc2lvbiIsdmVyc2lvLDApOworfQorCit1bmlvbiBja19zaG9ydCBzaG9ydGJ5dGVzOyAgICAgICAgICAgICAgLyogRm9yIGRldGVybWluaW5nIGJ5dGUgb3JkZXIgKi8KK2ludCBieXRlb3JkZXIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiAwID0gQmlnIEVuZGlhbjsgMSA9IExpdHRsZSBFbmRpYW4gKi8KK2ludCBiaWdlbmRpYW4gPSAxOworLyogTk9URTogTVVTVCBCRSAwIG9yIDEgLSBub3RoaW5nIGVsc2UgKi8KKworI2lmbmRlZiBOT1NQTAorI2RlZmluZSBTQ1JJUFRMRU4gMTAyNDAKKyNlbmRpZgkvKiBOT1NQTCAqLworCisjaWZkZWYgTkVUQ09OTgorI2lmbmRlZiBOT0NNREwKKyNpZm5kZWYgTk9VUkwKK1ZPSUQKK2RvdXJsKCkgeworICAgIGludCByYyA9IDA7CisgICAgY2hhciAqIHBvcnQgPSBOVUxMOworICAgIGV4dGVybiBpbnQgdHRucHJvdG87CisgICAgZXh0ZXJuIHN0cnVjdCB1cmxkYXRhIGdfdXJsOworCisjaWZkZWYgQ09NTUVOVAorICAgIC8qIE5PVEU6IGRlYnVnKCkgZG9lc24ndCB3b3JrIHlldCAtIG11c3QgdXNlIHByaW50ZidzICovCisgICAgcHJpbnRmKCJVUkw6ICAlc1xuIixnX3VybC5zYXYgPyBnX3VybC5zYXYgOiAiKG5vbmUpIik7CisgICAgcHJpbnRmKCJUeXBlOiAlc1xuIixnX3VybC5zdmMgPyBnX3VybC5zdmMgOiAiKG5vbmUpIik7CisgICAgcHJpbnRmKCJVc2VyOiAlc1xuIixnX3VybC51c3IgPyBnX3VybC51c3IgOiAiKG5vbmUpIik7CisgICAgcHJpbnRmKCJQYXNzOiAlc1xuIixnX3VybC5wc3cgPyBnX3VybC5wc3cgOiAiKG5vbmUpIik7CisgICAgcHJpbnRmKCJIb3N0OiAlc1xuIixnX3VybC5ob3MgPyBnX3VybC5ob3MgOiAiKG5vbmUpIik7CisvKiAgcHJpbnRmKCJQb3J0OiAlc1xuIixnX3VybC5wb3IgPyBnX3VybC5wb3IgOiAiKG5vbmUpIik7ICovCisgICAgcHJpbnRmKCJQYXRoOiAlc1xuIixnX3VybC5wdGggPyBnX3VybC5wdGggOiAiKG5vbmUpIik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgaWYgKCFja3N0cmNtcChnX3VybC5zdmMsImlrc2QiLC0xLDApIHx8CisgICAgICAgICFja3N0cmNtcChnX3VybC5zdmMsImtlcm1pdCIsLTEsMCkpIHsKKyAgICAgICAgZXh0ZXJuIGNoYXIgcHdidWZbXTsKKyAgICAgICAgZXh0ZXJuIGludCBwd2ZsZzsKKyNpZmRlZiBPUzIKKyAgICAgICAgZXh0ZXJuIGludCBwd2NyeXB0OworI2VuZGlmIC8qIE9TMiAqLworCisgICAgICAgIGlmICghZ191cmwuaG9zKSB7CisgICAgICAgICAgICBwcmludGYoIj9JbmNvbXBsZXRlIElLU0QgVVJMXG4iKTsKKyAgICAgICAgICAgIGRvZXhpdChCQURfRVhJVCwxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdfdXJsLnVzcikKKyAgICAgICAgICAgIG1ha2VzdHIoJmdfdXJsLnVzciwiYW5vbnltb3VzIik7CisgICAgICAgIGlmICghZ191cmwucHN3KSB7CisgICAgICAgICAgICBjaGFyICogdG1wYnVmID0gTlVMTDsKKyAgICAgICAgICAgIGlmICghKHRtcGJ1ZiA9IChjaGFyICopbWFsbG9jKDEwMjQpKSkKKyAgICAgICAgICAgICAgICBmYXRhbCgiZG91cmw6IG91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIGlmICghY2tzdHJjbXAoZ191cmwudXNyLCJhbm9ueW1vdXMiLC0xLDApKSB7CisgICAgICAgICAgICAgICAgY2ttYWttc2codG1wYnVmLDEwMjQsdWlkYnVmLCJAIixteWhvc3QsTlVMTCk7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmZ191cmwucHN3LHRtcGJ1Zik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlYWRwYXNzKCIgUGFzc3dvcmQ6Iix0bXBidWYsMTAyNCk7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmZ191cmwucHN3LHRtcGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHRtcGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgcG9ydCA9ICJrZXJtaXQiOworICAgICAgICB0dG5wcm90byA9IE5QX1RFTE5FVDsKKyAgICAgICAgbmV0dHlwZSA9IE5FVF9UQ1BCOworICAgICAgICBtZG10eXAgPSAtbmV0dHlwZTsKKyAgICAgICAgbG9jYWwgPSAtMTsKKyAgICAgICAgY2tzdHJuY3B5KHVpZGJ1ZixnX3VybC51c3IsVUlEQlVGTEVOKTsKKyAgICAgICAgaWYgKGdfdXJsLnBzdykgeworICAgICAgICAgICAgY2tzdHJuY3B5KHB3YnVmLGdfdXJsLnBzdyxQV0JVRkwpOworICAgICAgICAgICAgcHdmbGcgPSAxOworI2lmZGVmIE9TMgorICAgICAgICAgICAgcHdjcnlwdCA9IDA7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIH0KKyAgICAgICAgY2ttYWttc2codHRuYW1lLAorICAgICAgICAgICAgICAgICBUVE5BTUxFTiwKKyAgICAgICAgICAgICAgICAgZ191cmwuaG9zLAorICAgICAgICAgICAgICAgICAiOiIsCisgICAgICAgICAgICAgICAgIGdfdXJsLnBvciA/IGdfdXJsLnBvciA6IHBvcnQsCisgICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcmMgPSB0dG9wZW4odHRuYW1lLCZsb2NhbCxtZG10eXAsMCk7CisgICAgICAgIGlmIChyYyA+IC0xKSB7CisgICAgICAgICAgICBuZXR3b3JrID0gMTsKKyAgICAgICAgICAgIGV4aXRvbmNsb3NlID0gMTsKKyNpZmRlZiBDS0xPR0RJQUwKKyAgICAgICAgICAgIGRvbG9nbmV0KCk7CisjZW5kaWYgLyogQ0tMT0dESUFMICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIj9Db25uZWN0aW9uIGZhaWxlZDogJXNcbiIsZ191cmwuc2F2KTsKKyAgICAgICAgICAgIGRvZXhpdChCQURfRVhJVCwxKTsKKyAgICAgICAgfQorICAgICAgICAvKiBBbHNvIG5lZWQgdG8gY2hlY2sgaGVyZSBmb3Igc2VjdXJlIGF1dGhlbnRpY2F0aW9uIGFscmVhZHkgZG9uZSAqLworCisjaWZkZWYgTk9TUEwKKyAgICAgICAgY2ZsZyA9IDE7CisjZWxzZQorCXsKKyAgICAgICAgICAgIGNoYXIgKiBzY3JpcHQgPSBOVUxMOworICAgICAgICAgICAgaWYgKCEoc2NyaXB0ID0gKGNoYXIgKiltYWxsb2MoU0NSSVBUTEVOKSkpCisgICAgICAgICAgICAgIGZhdGFsKCJkb3VybDogb3V0IG9mIG1lbW9yeSIpOworICAgICAgICAgICAgaWYgKCFnX3VybC5wdGgpIHsgICAgICAgICAgIC8qIFdyaXRlIHRoZSBhcHByb3ByaWF0ZSBzY3JpcHQgKi8KKwkJY2ZsZyA9IDE7CisgICAgICAgICAgICAgICAgY2ttYWt4bXNnKHNjcmlwdCxTQ1JJUFRMRU4sCisJCQkgICJpZiBub3QgZXEge1xcdihhdXRoc3RhdGUpfSB7dXNlcn0gIiwKKwkJCSAgImlmIG5vdCBlcSB7XFx2KGF1dGhzdGF0ZSl9IHt2YWxpZH0geyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3RlIGxvZ2luICIsIC8qIE5vIHBhdGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ191cmwudXNyLCAgICAgICAvKiBKdXN0IGxvZyBpbiBhbmQgQ09OTkVDVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAiICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdfdXJsLnBzdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgaWYgZmFpbCBleGl0IDEge0lLU0QgbG9naW4gZmFpbGVkfSB9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgY29ubmVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwpOworCQkvKiBwcmludGYoIkNMQ01EUyAxOiAlc1xuIixzY3JpcHQpOyAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBkb2VzIHRoZSBwYXRoIHNwZWNpZnkgYSBmaWxlIG9yIGEgZGlyZWN0b3J5PyAqLworICAgICAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4oZ191cmwucHRoKTsKKyAgICAgICAgICAgICAgICBpZiAoSVNESVJTRVAoZ191cmwucHRoW2xlbi0xXSkpIHsKKwkJICAgIGNrbWFreG1zZyhzY3JpcHQsU0NSSVBUTEVOLCAvKiBEaXJlY3RvcnkgbmFtZSBnaXZlbiAqLworCQkJICAgICAgImlmIG5vdCBlcSB7XFx2KGF1dGhzdGF0ZSl9IHt1c2VyfSBcCitpZiBub3QgZXEge1xcdihhdXRoc3RhdGUpfSB7dmFsaWR9IHsgcmVtb3RlIGxvZ2luICIsCisJCQkgICAgICBnX3VybC51c3IsCisJCQkgICAgICAiICIsCisJCQkgICAgICBnX3VybC5wc3csCisJCQkgICAgICAiLCBpZiBmYWlsIGV4aXQgMSB7SUtTRCBsb2dpbiBmYWlsZWR9IH0iLAorCQkJICAgICAgIiwgc2V0IG1hY3JvIGVycm9yIG9uIiwKKwkJCSAgICAgICIsIHNldCB4ZmVyIGRpc3BsIGJyaWVmIiwKKwkJCSAgICAgICIsIHNldCB4ZmVyIGJlbGwgb2ZmIiwKKwkJCSAgICAgICIsIHJlbW90ZSBjZCAiLAorCQkJICAgICAgZ191cmwucHRoLAorCQkJICAgICAgIiwgbGluZW91dCBkaXJlY3RvcnkiLAorCQkJICAgICAgIiwgY29ubmVjdCIKKwkJCSAgICAgICk7CisJCSAgICAvKiBwcmludGYoIkNMQ01EUyAyOiAlc1xuIixzY3JpcHQpOyAqLworCQl9IGVsc2UgeworCQkgICAgY2ttYWt4bXNnKHNjcmlwdCxTQ1JJUFRMRU4sIC8qIFBhdGggZ2l2ZW4sIHRyeSB0byBHRVQgKi8KKwkJCSAgICAgICJpZiBub3QgZXEge1xcdihhdXRoc3RhdGUpfSB7dXNlcn0gXAoraWYgbm90IGVxIHtcXHYoYXV0aHN0YXRlKX0ge3ZhbGlkfSB7IHJlbW90ZSBsb2dpbiAiLAorCQkJICAgICAgZ191cmwudXNyLAorCQkJICAgICAgIiAiLAorCQkJICAgICAgZ191cmwucHN3LAorCQkJICAgICAgIiwgaWYgZmFpbCBleGl0IDEge0lLU0QgbG9naW4gZmFpbGVkfSB9IiwKKwkJCSAgICAgICIsIHNldCB4ZmVyIGRpc3BsIGJyaWVmIiwKKwkJCSAgICAgICIsIHNldCB4ZmVyIGJlbGwgb2ZmIiwKKwkJCSAgICAgICIsIGdldCAiLAorCQkJICAgICAgZ191cmwucHRoLAorCQkJICAgICAgIiwgLnJjIDo9IFxcdihzdGF0dXMpIiwKKwkJCSAgICAgICIsIGlmIG9wZW4gY29ubmVjdGlvbiBieWUiLAorCQkJICAgICAgIiwgZXhpdCBcXG0ocmMpIgorCQkJICAgICAgKTsKKwkJICAgIC8qIHByaW50ZigiQ0xDTURTIDI6ICVzXG4iLHNjcmlwdCk7ICovCisJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsY21kcyA9IHNjcmlwdDsJCS8qIE1ha2UgdGhpcyBvdXIgLUMgY21kbGluZSBtYWNybyAqLworCSAgICAvKiBwcmludGYoIkhBVkVVUkw9JWRcbiIsaGF2ZXVybCk7ICovCisgICAgICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChja3N0cmNtcChnX3VybC5zdmMsInRlbG5ldCIsLTEsMCkgJiYKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICAgICAgICBja3N0cmNtcChnX3VybC5zdmMsInNzaCIsLTEsMCkgJiYKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisgICAgICAgICAgICBja3N0cmNtcChnX3VybC5zdmMsImZ0cCIsLTEsMCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCAlcyBVUkxzIG5vdCBzdXBwb3J0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgZ191cmwuc3ZjID8gZ191cmwuc3ZjIDogIiIpOworICAgICAgICAgICAgZG9leGl0KEJBRF9FWElULDEpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmIC8qIE5PQ01ETCAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKyNlbmRpZiAvKiBOT1VSTCAqLworCisvKgorICBtYWluKCkuLi4KKworICBJZiB5b3UgZ2V0IGNvbXBsYWludHMgYWJvdXQgIm1haW46IHJldHVybiB0eXBlIGlzIG5vdCBibGFoIiwKKyAgZGVmaW5lIE1BSU5UWVBFIG9uIHRoZSBDQyBjb21tYW5kIGxpbmUsIGUuZy4gIkNGTEFHUz0tRE1BSU5UWVBFPWJsYWgiCisgICh3aGVyZSAiYmxhaCIgaXMgaW50LCBsb25nLCBvciB3aGF0ZXZlcikuCisKKyAgSWYgdGhlIGNvbXBsYWludCBpcyAiQXR0ZW1wdCB0byByZXR1cm4gYSB2YWx1ZSBmcm9tIGEgZnVuY3Rpb24gb2YgdHlwZSB2b2lkIgorICB0aGVuIGFkZCAtRE1BSU5JU1ZPSUQuCisqLworI2lmbmRlZiBNQUlOVFlQRQorI2lmbmRlZiBNQUlOSVNWT0lECisjZGVmaW5lIE1BSU5UWVBFIGludAorI2VuZGlmIC8qIE1BSU5JU1ZPSUQgKi8KKyNlbmRpZiAvKiBNQUlOVFlQRSAqLworCisjaWZkZWYgTUFJTklTVk9JRAorI2lmbmRlZiBNQUlOVFlQRQorI2RlZmluZSBNQUlOVFlQRSB2b2lkCisjZW5kaWYgLyogTUFJTlRZUEUgKi8KKyNlbmRpZiAvKiBNQUlOSVNWT0lEICovCisKKyNpZmRlZiBhZWdpcworLyogT24gdGhlIEFwb2xsbywgaW50ZXJjZXB0IG1haW4gdG8gaW5zZXJ0IGEgY2xlYW51cCBoYW5kbGVyICovCitpbnQKK2NrY21haShhcmdjLGFyZ3YpIGludCBhcmdjOyBjaGFyICoqYXJndjsKKyNlbHNlCisjaWZkZWYgTUFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjaW50b3NoICovCitpbnQKK21haW4gKHZvaWQpCisjZWxzZQorI2lmZGVmIF9fR05VQ19fICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdDQyBjb21waWxlciAqLworaW50CittYWluKGFyZ2MsYXJndikgaW50IGFyZ2M7IGNoYXIgKiphcmd2OworI2Vsc2UKKyNpZmRlZiBfX0RFQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBERUMgQWxwaGEgd2l0aCBERUMgQyBjb21waWxlciAqLworI2lmZGVmIF9fQUxQSEEKK2ludAorbWFpbihhcmdjLGFyZ3YpIGludCBhcmdjOyBjaGFyICoqYXJndjsKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBERUMgQyBjb21waWxlciwgbm90IEFscGhhICovCisjZGVmaW5lIE1BSU5JU1ZPSUQKK1ZPSUQKK21haW4oYXJnYyxhcmd2KSBpbnQgYXJnYzsgY2hhciAqKmFyZ3Y7CisjZW5kaWYgIC8qIF9fQUxQSEEgKi8KKyNlbHNlCisjaWZkZWYgU1RSQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RyYXR1cyBWT1MgKi8KK2ludAorbWFpbihhcmdjLGFyZ3YpIGludCBhcmdjOyBjaGFyICoqYXJndjsKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBLLTk1ICovCisjaWZkZWYgT1MyCisjaWZkZWYgS1VJCisjZGVmaW5lIE1BSU5JU1ZPSUQKK3ZvaWQKK01haW4oIGludCBhcmdjLCBjaGFyICoqIGFyZ3YgKQorI2Vsc2UgLyogS1VJICovCisjZGVmaW5lIE1BSU5JU1ZPSUQKK1ZPSUQKK21haW4oYXJnYyxhcmd2KSBpbnQgYXJnYzsgY2hhciAqKmFyZ3Y7CisjZW5kaWYgLyogS1VJICovCisjZWxzZSAgLyogTm90IEs5NSAqLworTUFJTlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBvdGhlcnMuLi4gKi8KK21haW4oYXJnYyxhcmd2KSBpbnQgYXJnYzsgY2hhciAqKmFyZ3Y7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIF9fREVDQyAqLworI2VuZGlmIC8qIF9fR05VQ19fICovCisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogYWVnaXMgKi8KKworLyogbWFpbiAqLyB7CisKKyAgICBjaGFyICpwOworCisjaWZuZGVmIE5PU0VUS0VZCisgICAgaW50IGk7CisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKworI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgc2hvcnQgKnBmaGEgPSAwMTYwMDAwMDAwMzY7ICAgICAgICAgLyogR2V0IGFyb3VuZCBMQU5HX1JUIHByb2JsZW0gKi8KKyAgICAqcGZoYSA9IChzaG9ydCkgMDsgICAgICAgICAgICAgICAgICAvKiBObyB1c2VyIHByb3RlY3Rpb24gZmF1bHQgaGFuZGxlciAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisKKy8qIERvIHNvbWUgaW5pdGlhbGl6YXRpb24gKi8KKworI2lmbmRlZiBNQUMKKyAgICB4YXJnYyA9IHhhcmdzID0gYXJnYzsgICAgICAgICAgICAgICAvKiBNYWtlIGdsb2JhbCBjb3BpZXMgb2YgYXJnYyAqLworICAgIHhhcmd2ID0gYXJndjsgICAgICAgICAgICAgICAgICAgICAgIC8qIC4uLmFuZCBhcmd2LiAqLworICAgIHhhcmcwID0gYXJndlswXTsKKyNpZmRlZiBOVAorICAgIHNldE9TVmVyKCk7CisjZW5kaWYgLyogTlQgKi8KKyAgICB6c3RyaXAoYXJndlswXSwmcCk7ICAgICAgICAgICAgICAgICAvKiBHZXQgbmFtZSB3ZSB3ZXJlIGludm9rZWQgd2l0aCAqLworICAgIG1ha2VzdHIoJm15bmFtZSxwKTsKKyAgICBpZiAoIWNrc3RyY21wKG15bmFtZSwidGVsbmV0IiwtMSwwKSkgICAgICAgaG93Y2FsbGVkID0gSV9BTV9URUxORVQ7CisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICBlbHNlIGlmICghY2tzdHJjbXAobXluYW1lLCJrdGVsbmV0IiwtMSwwKSkgaG93Y2FsbGVkID0gSV9BTV9URUxORVQ7CisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyAgICBlbHNlIGlmICghY2tzdHJjbXAobXluYW1lLCJybG9naW4iLC0xLDApKSAgaG93Y2FsbGVkID0gSV9BTV9STE9HSU47CisgICAgZWxzZSBpZiAoIWNrc3RyY21wKG15bmFtZSwiaWtzZCIsLTEsMCkpICAgIGhvd2NhbGxlZCA9IElfQU1fSUtTRDsKKyNpZmRlZiBORVdGVFAKKyAgICBlbHNlIGlmICghY2tzdHJjbXAobXluYW1lLCJmdHAiLC0xLDApKSAgICAgaG93Y2FsbGVkID0gSV9BTV9GVFA7CisjZW5kaWYgLyogTkVXRlRQICovCisjaWZuZGVmIE5PSFRUUAorICAgIGVsc2UgaWYgKCFja3N0cmNtcChteW5hbWUsImh0dHAiLC0xLDApKSAgICBob3djYWxsZWQgPSBJX0FNX0hUVFA7CisjZW5kaWYgLyogTk9IVFRQICovCisjaWZkZWYgT1MyCisgICAgZWxzZSBpZiAoIWNrc3RyY21wKG15bmFtZSwidGVsbmV0LmV4ZSIsLTEsMCkpICBob3djYWxsZWQgPSBJX0FNX1RFTE5FVDsKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgZWxzZSBpZiAoIWNrc3RyY21wKG15bmFtZSwic3NoIiwtMSwwKSkgIGhvd2NhbGxlZCA9IElfQU1fU1NIOworICAgIGVsc2UgaWYgKCFja3N0cmNtcChteW5hbWUsInNzaC5leGUiLC0xLDApKSAgaG93Y2FsbGVkID0gSV9BTV9TU0g7CisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworI2lmZGVmIENLX0tFUkJFUk9TCisgICAgZWxzZSBpZiAoIWNrc3RyY21wKG15bmFtZSwia3RlbG5ldC5leGUiLC0xLDApKSBob3djYWxsZWQgPSBJX0FNX1RFTE5FVDsKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworICAgIGVsc2UgaWYgKCFja3N0cmNtcChteW5hbWUsInJsb2dpbi5leGUiLC0xLDApKSAgaG93Y2FsbGVkID0gSV9BTV9STE9HSU47CisjaWZkZWYgTlQKKyAgICBlbHNlIGlmICghY2tzdHJjbXAobXluYW1lLCJpa3NkbnQiLC0xLDApKSAgICBob3djYWxsZWQgPSBJX0FNX0lLU0Q7CisgICAgZWxzZSBpZiAoIWNrc3RyY21wKG15bmFtZSwiaWtzZG50LmV4ZSIsLTEsMCkpICAgIGhvd2NhbGxlZCA9IElfQU1fSUtTRDsKKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIE5FV0ZUUAorICAgIGVsc2UgaWYgKCFja3N0cmNtcChteW5hbWUsImZ0cC5leGUiLC0xLDApKSAgICAgaG93Y2FsbGVkID0gSV9BTV9GVFA7CisjZW5kaWYgLyogTkVXRlRQICovCisjaWZuZGVmIE5PSFRUUAorICAgIGVsc2UgaWYgKCFja3N0cmNtcChteW5hbWUsImh0dHAuZXhlIiwtMSwwKSkgICAgaG93Y2FsbGVkID0gSV9BTV9IVFRQOworI2VuZGlmIC8qIE5PSFRUUCAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIGVsc2UgaWYgKCFja3N0cmNtcChteW5hbWUsImtlcm1pdC1zc2hzdWIiLC0xLDApKSBob3djYWxsZWQgPSBJX0FNX1NTSFNVQjsKKworI2lmbmRlZiBOT0lDUAorICAgIGNtZGluaSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE11c3QgY29tZSBiZWZvcmUgcHJlc2NhbiAqLworICAgIGRlYnVnKEYxMDAsIm1haW4gY21kaW5pKCkgZG9uZSIsIiIsMCk7CisjZW5kaWYgLyogTk9JQ1AgKi8KKyAgICBwcmVzY2FuKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmUtQ2hlY2sgZm9yIGRlYnVnZ2luZywgZXRjICovCisjZW5kaWYgLyogTUFDICovCisgICAgZGVidWcoRjEwMSwiTUFJTiBmZW9sIiwiIixmZW9sKTsKKyAgICBtYWtldmVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQdXQgdG9nZXRoZXIgdmVyc2lvbiBzdHJpbmdzICovCisjaWZuZGVmIE5PU0VUS0VZICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgJiBpbml0aWFsaXplIHRoZSBrZXltYXAgKi8KKyAgICAvKiBUaGlzIGNvZGUgaGFzIGJlZW4gbW92ZWQgdG8gYmVmb3JlIHN5c2luaXQoKSBmb3IgSzk1RyAqLworICAgIGlmICghKGtleW1hcCA9IChLRVkgKikgbWFsbG9jKHNpemVvZihLRVkpKktNU0laRSkpKQorICAgICAgZmF0YWwoIm1haW46IG5vIG1lbW9yeSBmb3Iga2V5bWFwIik7CisgICAgaWYgKCEobWFjcm90YWIgPSAoTUFDUk8gKikgbWFsbG9jKHNpemVvZihNQUNSTykqS01TSVpFKSkpCisgICAgICBmYXRhbCgibWFpbjogbm8gbWVtb3J5IGZvciBtYWNyb3RhYiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBLTVNJWkU7IGkrKykgeworICAgICAgIGtleW1hcFtpXSA9IChLRVkpIGk7CisgICAgICAgbWFjcm90YWJbaV0gPSBOVUxMOworICAgIH0KKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworCisgICAgc2hvcnRieXRlcy54X3Nob3J0ID0gMHhBQkNEOyAgICAgICAgLyogR2V0IEVuZGlhbm5lc3MgKi8KKyAgICBpZiAoc2hvcnRieXRlcy54X2NoYXJbMF0gPT0gMHhDRCkgeyAvKiAwID0gQmlnIEVuZGlhbiAqLworICAgICAgICBieXRlb3JkZXIgPSAxOyAgICAgICAgICAgICAgICAgIC8qIDEgPSBMaXR0bGUgRW5kaWFuICovCisgICAgICAgIGJpZ2VuZGlhbiA9IDA7ICAgICAgICAgICAgICAgICAgLyogKGZvciBjbGFyaXR5IGluIHByb2dyYW1taW5nKSAqLworICAgIH0gZWxzZSB7CisgICAgICAgIGJ5dGVvcmRlciA9IDA7ICAgICAgICAgICAgICAgICAgLyogQmlnIEVuZGlhbiAqLworICAgICAgICBiaWdlbmRpYW4gPSAxOworICAgIH0KKyAgICBpZiAoc3lzaW5pdCgpIDwgMCkgICAgICAgICAgICAgICAgICAvKiBTeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uLiAqLworICAgICAgZmF0YWwoIkNhbid0IGluaXRpYWxpemUhIik7CisgICAgZWxzZQorICAgICAgaW5pdGZsZyA9IDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHdlIGRpZC4gKi8KKyAgICBkZWJ1ZyhGMTExLCJja2NtYWkgbXluYW1lIixteW5hbWUsaG93Y2FsbGVkKTsKKworI2lmZGVmIFVOSVgKKyAgICBnZXRleGVkaXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21wdXRlIGV4ZWRpciB2YXJpYWJsZSAqLworI2VuZGlmIC8qIFVOSVggKi8KKworI2lmZGVmIENLU1lTTE9HCisjaWZkZWYgU1lTTE9HTEVWRUwKKy8qCisgIElmIGJ1aWx0IHdpdGggLURTWVNMT0dMRVZFTCBvbiBjYyBjb21tYW5kIGxpbmUsIHRoaXMgbWVhbnMgd2UgYWx3YXlzCisgIGRvIHN5c2xvZ2dpbmcgYXQgdGhlIGluZGljYXRlZCBsZXZlbC4KKyovCisgICAgenN5c2xvZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3BlbiBzeXNsb2cgKi8KKyNlbHNlIC8qIFNZU0xPR0xFVkVMICovCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlcikKKyAgICAgIHpzeXNsb2coKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuIHN5c2xvZyAqLworI2VuZGlmIC8qIElLU0QgKi8KKyNlbmRpZiAvKiBTWVNMT0dMRVZFTCAqLworI2VuZGlmIC8qIENLU1lTTE9HICovCisKKyNpZmRlZiBDS19LRVJCRVJPUworICAgIGluaV9rZXJiKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgS2VyYmVyb3MgZGF0YSAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisjaWZkZWYgQ0tfU1NMCisgICAgc3NsX29uY2VfaW5pdCgpOworI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIFROQ09ERQorICAgIHRuX3NldF9tb2RlcygpOyAgICAgICAgICAgICAgICAgICAgIC8qIEluaXQgVGVsbmV0IE9wdGlvbiB0YWJsZXMgKi8KKyNlbmRpZiAvKiBUTkNPREUgKi8KKworI2lmZGVmIENLX1RUR1dTSVogICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgc2NyZWVuIGRpbWVuc2lvbnMgKi8KKyNpZmRlZiBPUzIKKyAgICB0dGdjd3N6KCk7CisjZWxzZSAvKiBPUzIgKi8KKyAgICBpZiAodHRnd3NpeigpID4gMCkgeworICAgICAgICBpZiAodHRfcm93cyA+IDAgJiYgdHRfY29scyA+IDApIHsKKyAgICAgICAgICAgIGNtZF9yb3dzID0gdHRfcm93czsKKyAgICAgICAgICAgIGNtZF9jb2xzID0gdHRfY29sczsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisKKyNpZm5kZWYgT1MyCisjaWZkZWYgVENQU09DS0VUCisjaWZkZWYgQ0tfU09DS1MKKyAgICBTT0NLU2luaXQoYXJndlswXSk7ICAgICAgICAgICAgICAgICAvKiBJbnRlcm5ldCByZWxheSBwYWNrYWdlLi4uICovCisjZW5kaWYgLyogQ0tfU09DS1MgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIGluaXRmbG93KCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZmxvdy1jb250cm9sIHRhYmxlICovCisKKyNpZm5kZWYgTk9JQ1AKKyNpZmRlZiBDS0ZMT0FUCisgICAgaW5pdGZsb2F0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVkdWNlIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbiAqLworI2VuZGlmIC8qIENLRkxPQVQgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworCisjaWZuZGVmIE5PWEZFUgorICAgIGluaXR4bGlzdCgpOwkJCS8qIEluaXQgZXhjZXB0aW9uIGxpc3RzICovCisKKyNpZmRlZiBDS19YWVogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHByb3RvY29scy4uLiAgKi8KKworI2lmZGVmIFhZWl9JTlRFUk5BTCAvKiBYWVpNT0RFTSBhcmUgaW50ZXJuYWwgLi4uICovCisKKyNpZmRlZiBDT01NRU5UCisgICAgLyogQ2FuJ3QgZG8gdGhpcyBmb3IgWE1PREVNIGJlY2F1c2UgaWYgZmlsZW5hbWUgY29udGFpbnMgYSAiQyIgZXRjLi4uICovCisgICAgaW5pdHByb3RvKFBST1RPX1gsICJyeCAlcyIsInJ4ICVzIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaW5pdHByb3RvKFBST1RPX1hDLCJyYyAlcyIsInJjICVzIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisjZWxzZSAvKiBDT01NRU5UICovCisgICAgaW5pdHByb3RvKFBST1RPX1gsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGluaXRwcm90byhQUk9UT19YQyxOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgaW5pdHByb3RvKFBST1RPX1ksICJyYiIsInJiIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaW5pdHByb3RvKFBST1RPX0csICJyYiIsInJiIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaW5pdHByb3RvKFBST1RPX1osICJyeiIsInJ6IiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICBpbml0cHJvdG8oUFJPVE9fSywia2VybWl0IC1pciIsImtlcm1pdCAtciIsImtlcm1pdCAteCIsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgLyogS2VybWl0IE11c3QgYmUgbGFzdCAqLworCisjZWxzZSAvKiBYWVpNT0RFTSBhcmUgZXh0ZXJuYWwgcHJvdG9jb2xzIC4uLiAqLworCisgLyogICAgICAgICAgICAgICAgICBzMSAgICAgIHMyICAgICBzMyAgICBzNCAgICAgIHM1ICAgICAgICAgczYgICAgICBzNyAgICAgKi8KKyBpbml0cHJvdG8oUFJPVE9fWCwgInJ4ICVzIiwicnggJXMiLE5VTEwsInN4ICVzIiwic3ggLWEgJXMiLCJyeCAlcyIsICJyeCAlcyIpOworIGluaXRwcm90byhQUk9UT19YQywicmMgJXMiLCJyYyAlcyIsTlVMTCwic3ggJXMiLCJzeCAtYSAlcyIsInJjICVzIiwgInJjICVzIik7CisgaW5pdHByb3RvKFBST1RPX1ksICJyYiIsICAgInJiIiwgICBOVUxMLCJzYiAlcyIsInNiIC1hICVzIiwicmIiLCAgICAicmIiICAgKTsKKyBpbml0cHJvdG8oUFJPVE9fRywgInJiIiwgICAicmIiLCAgIE5VTEwsInNiICVzIiwic2IgLWEgJXMiLCJyYiIsICAgICJyYiIgICApOworIGluaXRwcm90byhQUk9UT19aLCAicnoiLCAgICJyeiIsICAgTlVMTCwic3ogJXMiLCJzeiAtYSAlcyIsInJ6IiwgICAgInJ6IiAgICk7CisgaW5pdHByb3RvKFBST1RPX0ssICJrZXJtaXQgLWlyIiwia2VybWl0IC1yIiwia2VybWl0IC14IixOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAvKiBLZXJtaXQgbXVzdCBiZSBsYXN0ICovCisKKyNlbmRpZiAvKiBYWVpfSU5URVJOQUwgKi8KKworI2Vsc2UgIC8qIE5vIFhZWk1PREVNIHN1cHBvcnQgKi8KKworICAgaW5pdHByb3RvKFBST1RPX0ssImtlcm1pdCAtaXIiLCJrZXJtaXQgLXIiLCJrZXJtaXQgLXgiLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworCisjZW5kaWYgLyogQ0tfWFlaICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyAgICBjb25ub2koKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb25zb2xlIGludGVycnVwdHMgb2ZmICovCisKKyNpZm5kZWYgTk9YRkVSCisjaWZkZWYgT1MyCisgICAgLyogSW5pdGlhbGl6ZSBLZXJtaXQgYW5kIFptb2RlbSBBdXRvLURvd25sb2FkIFN0cmluZ3MgKi8KKyAgICBhZGxfa3N0ciA9IHN0cmR1cCgiS0VSTUlUIFJFQURZIFRPIFNFTkQuLi4iKTsKKyAgICBhZGxfenN0ciA9IHN0cmR1cCgicnpcciIpOworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgUEFUVEVSTlMKKyAgICBpbml0cGF0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGZpbGVuYW1lIHBhdHRlcm5zICovCisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT0NTRVRTCisgICAgaW5pdGNzZXRzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBjaGFyYWN0ZXIgc2V0cyAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmbmRlZiBOT0lDUAorI2lmZGVmIERGQ0RNU0cKKyAgICBtYWtlc3RyKCZjZG1zZ3N0cixERkNETVNHKTsKKyAgICBtYWtlbGlzdChjZG1zZ3N0cixjZG1zZ2ZpbGUsOCk7ICAgICAvKiBJbml0aWFsaXplIENEIG1lc3NhZ2UgZmlsZW5hbWVzICovCisjZW5kaWYgLyogREZDRE1TRyAqLworI2VuZGlmIC8qIE5PSUNQICovCisKKyAgICBzc3RhdGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBkZWZhdWx0IHN0YXJ0IHN0YXRlLiAqLworI2lmZGVmIERZTkFNSUMKKyAgICBpZiAoZ2V0aW9icygpIDwgMCkKKyAgICAgIGZhdGFsKCJDYW4ndCBhbGxvY2F0ZSBpL28gYnVmZmVycyEiKTsKKyNlbmRpZiAvKiBEWU5BTUlDICovCisKKyNpZm5kZWYgTk9TUEwKKyNpZm5kZWYgTk9SQU5ET00KKyAgICB7CisgICAgICAgIGNoYXIgc3RhY2tkYXRhWzI1Nl07CisgICAgICAgIHVuc2lnbmVkIGludCBjID0gMTIzNCwgbjsKKyAgICAgICAgLyogdHJ5IHRvIG1ha2UgYSByYW5kb20gdW5zaWduZWQgaW50IHRvIGZlZWQgc3JhbmQoKSAqLworI2lmbmRlZiBWTVMKKwkvKiB0aW1lLmggYW5kIE11bHRpTmV0IGRvIG5vdCBnZXQgYWxvbmcgKi8KKyAgICAgICAgYyA9IHRpbWUoTlVMTCk7CisjZW5kaWYgLyogVk1TICovCisgICAgICAgIGMgKj0gZ2V0cGlkKCk7CisJLyogUmVmZXJlbmNlZCBiZWZvcmUgc2V0Li4uIERFTElCRVJBVEVMWSAqLworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgc2l6ZW9mKHN0YWNrZGF0YSk7IG4rKykgLyogSUdOT1JFIFdBUk5JTkcgKi8KKwkgIGMgKz0gc3RhY2tkYXRhW25dOwkJLyogREVMSUJFUkFURUxZIFVTRUQgQkVGT1JFIFNFVCAqLworICAgICAgICBzcmFuZCgodW5zaWduZWQgaW50KWMpOworICAgIH0KKyNlbmRpZiAvKiBOT1JBTkRPTSAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICBja2hvc3QobXlob3N0LE1ZSE9TVEwpOyAgICAgICAgICAgICAvKiBOYW1lIG9mIGxvY2FsIGhvc3QgKi8KKyAgICBkZWJ1ZyhGMTEwLCJtYWluIGNraG9zdCIsbXlob3N0LDApOworI2lmZGVmIElLU0QKKyAgICBpZiAoIWluc2VydmVyKSB7CisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICBja3N0cm5jcHkodHRuYW1lLGRmdHR5LFRUTkFNTEVOKTsgLyogU2V0IHVwIGRlZmF1bHQgdHR5IG5hbWUuICovCisgICAgICAgIGxvY2FsID0gbm9sb2NhbCA/IDAgOiBkZmxvYzsgICAgLyogQW5kIHdoZXRoZXIgaXQncyBsb2NhbCBvciByZW1vdGUuICovCisgICAgICAgIHBhcml0eSA9IGRmcHJ0eTsgICAgICAgICAgICAgICAgLyogU2V0IGluaXRpYWwgcGFyaXR5LCAqLworI2lmbmRlZiBOT1hGRVIKKyAgICAgICAgbXlpbmRleCA9IGdldHN5c2l4KGNrc3lzaWQpOyAgICAvKiBTeXN0ZW0gaW5kZXggKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICAgICAgaWYgKGxvY2FsKSBpZiAodHRvcGVuKHR0bmFtZSwmbG9jYWwsMCwwKSA8IDApIHsKKyNpZm5kZWYgT1MyCisgICAgICAgICAgICBjb25vbCgiQ2FuJ3Qgb3BlbiBkZXZpY2U6ICIpOworICAgICAgICAgICAgY29ub2xsKHR0bmFtZSk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICBsb2NhbCA9IDA7CisgICAgICAgICAgICBja3N0cm5jcHkodHRuYW1lLENUVE5BTSxUVE5BTUxFTik7CisgICAgICAgIH0KKyAgICAgICAgc2V0ZmxvdygpOyAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgYXBwcm9wcmlhdGUgZmxvdyBjb250cm9sICovCisgICAgICAgIHNwZWVkID0gdHRnc3BkKCk7ICAgICAgICAgICAgICAgLyogR2V0IHRyYW5zbWlzc2lvbiBzcGVlZC4gKi8KKyNpZmRlZiBJS1NECisgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKworI2lmZGVmIEFOWVgyNSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBYLjI1IGltcGxlbWVudGF0aW9ucyAqLworI2lmbmRlZiBJQk1YMjUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4Y2VwdCBJQk0gaGF2ZSBQQUQgc3VwcG9ydCAqLworICAgIGluaXRwYWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgWC4yNSBQQUQgKi8KKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNlbmRpZiAvKiBBTllYMjUgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICBpZiAoaW5pYnVmcyhTQlNJWixSQlNJWikgPCAwKSAgICAgICAvKiBBbGxvY2F0ZSBwYWNrZXQgYnVmZmVycyAqLworICAgICAgZmF0YWwoIkNhbid0IGFsbG9jYXRlIHBhY2tldCBidWZmZXJzISIpOworI2lmbmRlZiBOT0NLU1BFRUQKKyAgICBzZXRwcmVmaXgocHJlZml4aW5nKTsgICAgICAgICAgICAgICAvKiBTZXQgdXAgY29udHJvbCBjaGFyIHByZWZpeGluZyAqLworI2VuZGlmIC8qIE5PQ0tTUEVFRCAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PSUNQCisgICAgaWYgKHNzdGVsbmV0CisjaWZkZWYgSUtTRAorICAgICAgICB8fCBpbnNlcnZlcgorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgKSB7CisgICAgICAgIGludCBvbiA9IDEsIHggPSAwOworICAgICAgICBleHRlcm4gaW50IGNreGVjaCwgdHRuZXQsIHR0bnByb3RvLCBjbWRtc2s7CisjaWZkZWYgU09fU05EQlVGCisgICAgICAgIGV4dGVybiBpbnQgdGNwX3NlbmRidWY7CisjZW5kaWYKKyNpZmRlZiBTT19SQ1ZCVUYKKyAgICAgICAgZXh0ZXJuIGludCB0Y3BfcmVjdmJ1ZjsKKyNlbmRpZgorI2lmZGVmIFNPX0tFRVBBTElWRQorICAgICAgICBleHRlcm4gaW50IHRjcF9rZWVwYWxpdmU7CisjZW5kaWYKKyNpZmRlZiBTT19MSU5HRVIKKyAgICAgICAgZXh0ZXJuIGludCB0Y3BfbGluZ2VyLCB0Y3BfbGluZ2VyX3RtbzsKKyNlbmRpZiAvKiBTT19MSU5HRVIgKi8KKyNpZmRlZiBTT19ET05UUk9VVEUKKyAgICAgICAgZXh0ZXJuIGludCB0Y3BfZG9udHJvdXRlOworI2VuZGlmIC8qIFNPX0RPTlRST1VURSAqLworI2lmZGVmIFRDUF9OT0RFTEFZCisgICAgICAgIGV4dGVybiBpbnQgdGNwX25vZGVsYXk7CisjZW5kaWYgLyogVENQX05PREVMQVkgKi8KKyNpZmRlZiBJS1NECisgICAgICAgIGV4dGVybiBpbnQgaWtsb2dvcGVuOworI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgZXh0ZXJuIGludCB0dG1kbTsKKworI2lmZGVmIFVOSVgKKyAgICAgICAgaWYgKGlzYXR0eSgwKSkKKyAgICAgICAgICBmYXRhbCgiSW50ZXJuZXQgS2VybWl0IFNlcnZpY2UgY2Fubm90IGJlIHN0YXJ0ZWQgYXQgYSB0ZXJtaW5hbC4iKTsKKyNlbmRpZiAvKiBVTklYICovCisKKyAgICAgICAgcmVsaWFibGUgPSB4cmVsaWFibGUgPSBTRVRfT047ICAvKiBJS1NEIGhhcyByZWxpYWJsZSBjb25uZWN0aW9uICovCisjaWZuZGVmIFZNUworICAgICAgICBmbG93ID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGZsb3cgY29udHJvbCBuZWVkZWQgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyAgICAgICAgYmdzZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgaW4gYmFja2dyb3VuZCAqLworICAgICAgICBub3B1c2ggPSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGV4dGVybmFsIHByb2Nlc3NlcyAqLworICAgICAgICBwYXJpdHkgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIDggYml0cyAuLi4gKi8KKyAgICAgICAgY21kbXNrID0gMHhmZjsgICAgICAgICAgICAgICAgICAvKiBhbGwgdGhlIHdheSAqLworICAgICAgICBjbWFzayA9IDB4ZmY7CisKKyNpZmRlZiBJS1NECisgICAgICAgIGlmIChpbnNlcnZlcikgeyAgICAgICAgICAgICAgICAgLyogSWYgSUtTRCAqLworICAgICAgICAgICAgZG9pa3NkaW5pdCgpOyAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgSUtTRCBjb25maWd1cmF0aW9uIGZpbGUgKi8KKyAgICAgICAgICAgIHdoaWxlICh0bGV2ZWwgPiAtMSkKKyAgICAgICAgICAgICAgcGFyc2VyKDEpOyAgICAgICAgICAgICAgICAvKiAoSWdub3JlIGFueSBmaWxlLXhmZXIgY29tbWFuZHMpICovCisgICAgICAgICAgICBpa3NkY2YgPSAxOyAgICAgICAgICAgICAgICAgLyogSUtTRCBjLmYuIGhhcyBiZWVuIHByb2Nlc3NlZCAqLworICAgICAgICB9CisgICAgICAgIGlmICghaWtsb2dvcGVuKSAoVk9JRCkgZG9pa2xvZygpOyAvKiBPcGVuIEtlcm1pdC1zcGVjaWZpYyBsb2cgKi8KKyNlbmRpZiAvKiBJS1NEICovCisKKyNpZmRlZiBVTklYCisgICAgICAgIHNldGJ1ZihzdGRvdXQsTlVMTCk7ICAgICAgICAgICAgLyogRG9uJ3QgYnVmZmVyIHRoZSBvdXRwdXQgKi8KKyAgICAgICAgY2tzdHJuY3B5KHR0bmFtZSwiMCIsVFROQU1MRU4pOyAvKiBub3QgIi9kZXYvdHR5Ii4uLiAqLworI2VuZGlmIC8qIFVOSVggKi8KKyAgICAgICAgbG9jYWwgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBhcmUgaW4gcmVtb3RlIG1vZGUgKi8KKyAgICAgICAgY2t4ZWNoID0gMTsgICAgICAgICAgICAgICAgICAgICAvKiBXZSB3aWxsIGVjaG8gKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgbmV0dHlwZSA9IE5FVF9UQ1BCOyAgICAgICAgICAgICAvKiBTbyB0dG9wZW4oKSB0cmVhdHMgdGhlIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgbWRtdHlwID0gLW5ldHR5cGU7ICAgICAgICAgICAgICAvKiBhcyBhIG5ldHdvcmsgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgZGVidWcoRjEwMCwibWFpbiBhYm91dCB0byBjYWxsIHR0b3BlbigpIGluc2VydmVyIiwiIiwwKTsKKyAgICAgICAgaWYgKHR0b3Blbih0dG5hbWUsJmxvY2FsLG1kbXR5cCwwKSA8IDApIHsgLyogT3BlbiBjb21tIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIGZhdGFsKCJjYW4ndCBpbml0aWFsaXplIGkvbyIpOworICAgICAgICB9CisjaWZkZWYgT1MyCisgICAgICAgIGxvY2FsID0gMDsKKyAgICAgICAgbmV0d29yayA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBEb2VzIHVzZSBuZXR3b3JraW5nIGNvZGUgKi8KKyNlbHNlICAvKiBPUzIgKi8KKyAgICAgICAgbmV0d29yayA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBEb2VzIG5vdCB1c2UgbmV0d29ya2luZyBjb2RlICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHR0bWRtID0gLTE7ICAgICAgICAgICAgICAgICAgICAgLyogRG9lcyBub3QgdXNlIGEgbW9kZW0gKi8KKyAgICAgICAgc3N0ZWxuZXQgPSAxOyAgICAgICAgICAgICAgICAgICAvKiBEbyBzZXJ2ZXItc2lkZSBUZWxuZXQgbmVnb3RhdGlvbnMgKi8KKyAgICAgICAgZGVidWcoRjExMSwiTUFJTiIsInNzdGVsbmV0Iixzc3RlbG5ldCk7CisgICAgICAgIHR0bmV0ID0gTkVUX1RDUEI7ICAgICAgICAgICAgICAgLyogTmV0d29yayB0eXBlIGlzIFRDUCBzb2NrZXRzICovCisgICAgICAgIHR0bnByb3RvID0gTlBfVEVMTkVUOyAgICAgICAgICAgLyogTmV0d29yZCBwcm90b2NvbCBpcyBUZWxuZXQgKi8KKyNpZmRlZiBJS1NEQgorICAgICAgICBkYmluaXQoKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZGF0YWJhc2UgcmVjb3JkICovCisjZW5kaWYgLyogSUtTREIgKi8KKyNpZm5kZWYgT1MyCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICAgICAgLyogQmVmb3JlIGluaXRpYWxpemF0aW5nIFRlbG5ldC9SbG9naW4gbmVnb3RpYXRpb25zLCBpbml0IEtlcmJlcm9zICovCisgICAgICAgIGNrX2F1dGhfaW5pdChja2dldHBlZXIoKSwiIiwiIiwwKTsKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworCisjaWZkZWYgTk9OX0JMT0NLX0lPCisgICAgICAgIG9uID0gMTsKKyAgICAgICAgeCA9IHNvY2tldF9pb2N0bCgwLEZJT05CSU8sJm9uKTsKKyAgICAgICAgZGVidWcoRjEwMSwibWFpbiBGSU9OQklPIiwiIix4KTsKKyNlbmRpZiAvKiBOT05fQkxPQ0tfSU8gKi8KKyNpZmRlZiBTT19PT0JJTkxJTkUKKyAgICAgICAgb24gPSAxOworICAgICAgICB4ID0gc2V0c29ja29wdCgwLCBTT0xfU09DS0VULCBTT19PT0JJTkxJTkUsIChjaGFyICopJm9uLCBzaXplb2Yob24pKTsKKyAgICAgICAgZGVidWcoRjEwMSwibWFpbiBTT19PT0JJTkxJTkUiLCIiLHgpOworI2VuZGlmIC8qIFNPX09PQklOTElORSAqLworCisjaWZuZGVmIE5PVENQT1BUUworI2lmbmRlZiBkYXRhZ2VuZXJhbAorI2lmZGVmIFNPTF9TT0NLRVQKKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgICAgICBub19kZWxheSgwLHRjcF9ub2RlbGF5KTsKKyNlbmRpZiAvKiBUQ1BfTk9ERUxBWSAqLworI2lmZGVmIFNPX0tFRVBBTElWRQorICAgICAgICBrZWVwYWxpdmUoMCx0Y3Bfa2VlcGFsaXZlKTsKKyNlbmRpZiAvKiBTT19LRUVQQUxJVkUgKi8KKyNpZmRlZiBTT19MSU5HRVIKKyAgICAgICAgY2tfbGluZ2VyKDAsdGNwX2xpbmdlciwgdGNwX2xpbmdlcl90bW8pOworI2VuZGlmIC8qIFNPX0xJTkdFUiAqLworI2lmZGVmIFNPX0RPTlRST1VURQorICAgICAgICBkb250cm91dGUoMCx0Y3BfZG9udHJvdXRlKTsKKyNlbmRpZiAvKiBTT19ET05UUk9VVEUgKi8KKyNpZmRlZiBTT19TTkRCVUYKKyAgICAgICAgc2VuZGJ1ZigwLHRjcF9zZW5kYnVmKTsKKyNlbmRpZiAvKiBTT19TTkRCVUYgKi8KKyNpZmRlZiBTT19SQ1ZCVUYKKyAgICAgICAgcmVjdmJ1ZigwLHRjcF9yZWN2YnVmKTsKKyNlbmRpZiAvKiBTT19SQ1ZCVUYgKi8KKyNlbmRpZiAvKiBTT0xfU09DS0VUICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBOT1RDUE9QVFMgKi8KKworI2lmZGVmIENLX1NTTAorICAgICAgICBpZiAoY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpKSB7CisgICAgICAgICAgICBpZiAoIXNzbF90bl9pbml0KFNTTF9TRVJWRVIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJpb19lcnIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBCSU9fcHJpbnRmKGJpb19lcnIsImRvX3NzbGVheV9pbml0KCkgZmFpbGVkXHJcbiIpOworICAgICAgICAgICAgICAgICAgICBFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiZG9fc3NsZWF5X2luaXQoKSBmYWlsZWRcclxuIik7CisgICAgICAgICAgICAgICAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoICh0dG5wcm90bykgeworCQkgIGNhc2UgTlBfU1NMOgorCQkgIGNhc2UgTlBfVExTOgorCQkgIGNhc2UgTlBfU1NMX1RFTE5FVDoKKwkJICBjYXNlIE5QX1RMU19URUxORVQ6CisgICAgICAgICAgICAgICAgICAgIGRvZXhpdChCQURfRVhJVCwxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlIHdlIHdpbGwgY29udGludWUgdG8gYWNjZXB0IHRoZSBjb25uZWN0aW9uICAgKi8KKyAgICAgICAgICAgICAgICAvKiB3aXRob3V0IFNTTCBvciBUTFMgc3VwcG9ydCB1bmxlc3MgcmVxdWlyZWQuICovCisgICAgICAgICAgICAgICAgaWYgKCBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfU1RBUlRfVExTKSAhPSBUTl9OR19NVSApCisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfU19NRV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgaWYgKCBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpICE9IFROX05HX01VICkKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfU1RBUlRfVExTKSA9IFROX05HX1JGOworICAgICAgICAgICAgICAgIGlmICggVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX1NUQVJUX1RMUykgIT0gVE5fTkdfTVUgKQorICAgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfU1RBUlRfVExTKSA9IFROX05HX1JGOworICAgICAgICAgICAgICAgIGlmICggVEVMT1BUX0RFRl9DX1VfTU9ERShURUxPUFRfU1RBUlRfVExTKSAhPSBUTl9OR19NVSApCisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfQ19VX01PREUoVEVMT1BUX1NUQVJUX1RMUykgPSBUTl9OR19SRjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBja19zc2xfaW5jb21pbmcoMCkgPCAwICkgeworICAgICAgICAgICAgICAgICAgICBkb2V4aXQoQkFEX0VYSVQsMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyNpZmRlZiBUTkNPREUKKyAgICAgICAgdG5faW5pKCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCBUZWxuZXQgbmVnb3RpYXRpb24gbm93ICovCisjZW5kaWYgLyogVE5DT0RFICovCisjZW5kaWYgLyogT1MyICovCisgICAgfQorICAgIGRlYnVnKEYxMDEsIm1haW4gYXJnYyBhZnRlciBwcmVzY2FuKCkiLCIiLGFyZ2MpOworCisgICAgLyogTm93IHByb2Nlc3MgYW55IHJlbGV2YW50IGVudmlyb25tZW50IHZhcmlhYmxlcyAqLworCisjaWZuZGVmIE5PRElBTAorICAgIGdldGRpYWxlbnYoKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIERpYWxpbmcgKi8KKyNpZmRlZiBORVRDT05OCisgICAgbmRpbml0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBuZXR3b3JrIGRpcmVjdG9yeSBpbmZvICovCisgICAgZ2V0bmV0ZW52KCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV0d29yayBkaXJlY3RvcmllcyAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworI2lmbmRlZiBOT1hGRVIKKyNpZmRlZiBDS19GQVNUCisgICAgZG9mYXN0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnkgbm93IEZBU1QgZGVmYXVsdHMgc2hvdWxkIGJlIE9LICovCisjZW5kaWYgLyogQ0tfRkFTVCAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PQ01ETAorICAgIGlrc2xvZ2luKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJS1NEIExvZ2luIGFuZCBvdGhlciBzdHVmZiAqLworI2lmZGVmIElLU0QKKyNpZmRlZiBOVAorICAgIGlmICggaW5zZXJ2ZXIgKQorICAgICAgc2V0bnRjcmVkcygpOworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogSUtTRCAqLworI2VuZGlmIC8qIE5PQ01ETCAqLworCisgICAgaWYgKGhvd2NhbGxlZCA9PSBJX0FNX1NTSFNVQikgeworICAgICAgICByZWxpYWJsZSA9IDE7CQkJLyogV2Ugc2F5IHRoZSBjb25uZWN0aW9uIGlzIHJlbGlhYmxlICovCisgICAgICAgIHhyZWxpYWJsZSA9IDE7CQkJLyogQW5kIHRoYXQgd2Ugc2FpZCBpdCB3YXMgKi8KKyAgICAgICAgc2V0cmVsaWFibGUgPSAxOwkJLyogQW5kIHByZXRlbmQgdGhlICJ1c2VyIiBkaWQgdG9vICovCisgICAgICAgIHhmaW5pc2ggPSAxOwkJCS8qIEZvciBSRU1PVEUgSEVMUCByZXNwb25zZSAqLworICAgICAgICBtZG10eXAgPSAwOwkJCS8qIEZvciB0dG9wZW4oKSAqLworICAgICAgICBja3N0cm5jcHkodHRuYW1lLCIwIixUVE5BTUxFTisxKTsgIC8qIFVzZSBmaWxlIGRlc2NyaXB0b3IgMCAqLworICAgICAgICBsb2NhbCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFuZCBmb3JjZSByZW1vdGUgbW9kZSAqLworICAgICAgICB0dG9wZW4odHRuYW1lLCZsb2NhbCxtZG10eXAsMCk7IC8qIE9wZW4gdGhlICJjb25uZWN0aW9uIiAqLworICAgICAgICBzc3RhdGUgPSAneCc7CQkJLyogSW5pdGlhbCBzdGF0ZSBpcyBTZXJ2ZXIgKi8KKyAgICAgICAgcHJvdG8oKTsJCQkvKiBFbnRlciBwcm90b2NvbCAqLworICAgICAgICBkb2V4aXQoR09PRF9FWElULHhpdHN0YSk7CS8qIEV4aXQgd2hlbiBkb25lICovCisgICAgfQorICAgIGRlYnVnKEYxMTEsImhvd2NhbGxlZCIsbXluYW1lLGhvd2NhbGxlZCk7CisKKyNpZmRlZiBOT0NDVFJBUAorICAgIGRvdGFrZWluaSgwKTsKKyNlbHNlIC8qIE5PQ0NUUkFQICovCisgICAgZGVidWcoRjEwMCwibWFpbiBhYm91dCB0byBjY19leGVjdXRlIiwiIiwwKTsKKyAgICBzZXRpbnQoKTsKKyAgICBjY19leGVjdXRlKCBja2phZGRyKGNtamJ1ZiksIGRvdGFrZWluaSwgZmFpbHRha2VpbmkgKTsKKyNlbmRpZiAvKiBOT0NDVFJBUCAqLworCisgICAgZGVidWcoRjExMSwibWFpbiAyIGNmaWxlZiIsY21kZmlsLGNmaWxlZik7CisgICAgaWYgKGNtZGZpbFswXSkgeyAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgZ290IG9uZSAoc2VlIHByZXNjYW4oKSkuLi4gKi8KKyNpZmRlZiBOT0NDVFJBUAorICAgICAgICBkb2NtZGZpbGUoMCk7ICAgICAgICAgICAgICAgICAgIC8qIGV4ZWN1dGUgaXQuICovCisjZWxzZSAvKiBOT0NDVFJBUCAqLworICAgICAgICBzZXRpbnQoKTsKKyAgICAgICAgY2NfZXhlY3V0ZSggY2tqYWRkcihjbWpidWYpLCBkb2NtZGZpbGUsIGZhaWxjbWRmaWxlICk7CisjZW5kaWYgLyogTk9DQ1RSQVAgKi8KKyAgICB9CisjaWZuZGVmIE9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJlc2VydmUgbmFtZSBzbyB3ZSBjYW4gZGVsZXRlIGl0ICovCisgICAgKmNtZGZpbCA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgLyogRG9uZSwgbnVsbGlmeSB0aGUgZmlsZSBuYW1lICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKworI2lmbmRlZiBOT0NNREwKKy8qIExvb2sgZm9yIGEgVU5JWC1zdHlsZSBjb21tYW5kIGxpbmUuLi4gKi8KKworICAgIHdoYXQgPSBXX05PVEhJTkc7CisKKyAgICBkZWJ1ZyhGMTAxLCJtYWluIGFyZ2MiLCIiLGFyZ2MpOworI2lmbmRlZiBOT0hFTFAKKyAgICBpbmlvcHRobHAoKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGNtZGxpbmUgYXJnIGhlbHAgKi8KKyNlbmRpZiAvKiBOT0hFTFAgKi8KKyAgICBpZiAoCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAhY2ZpbGVmICYmCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBhcmdjID4gMSkgeyAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgbGluZSBhcmd1bWVudHM/ICovCisgICAgICAgIHNzdGF0ZSA9IChDSEFSKSBjbWRsaW4oKTsgICAgICAgLyogWWVzLCBwYXJzZS4gKi8KKyNpZmRlZiBORVRDT05OCisjaWZuZGVmIE5PVVJMCisgICAgICAgIGlmIChoYXZldXJsKSB7ICAgICAgICAgICAgICAgICAgLyogV2FzIGEgVVJMIGdpdmVuPyAqLworICAgICAgICAgICAgZG91cmwoKTsgICAgICAgICAgICAgICAgICAgIC8qIGlmIHNvLCBkbyBpdC4gKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIE5PVVJMICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworI2lmbmRlZiBOT1hGRVIKKyAgICAgICAgenN0YXRlID0gc3N0YXRlOyAgICAgICAgICAgICAgICAvKiBSZW1lbWJlciBzc3RhdGUgYXJvdW5kIHByb3RvY29sICovCisgICAgICAgIGRlYnVnKEYxMDEsIm1haW4genN0YXRlIiwiIix6c3RhdGUpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgaWYgKGNmbGcpIHsgICAgICAgICAgICAgICAgICAgICAvKiBDb25uZWN0IGZpcnN0IGlmIHJlcXVlc3RlZCAqLworICAgICAgICAgICAgZG9jb25lY3QoMCwwKTsKKyAgICAgICAgICAgIGlmICh0dGNoaygpIDwgMCkKKyAgICAgICAgICAgICAgZG9sb2dlbmQoKTsKKyAgICAgICAgICAgIGNmbGcgPSAwOworICAgICAgICB9CisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZuZGVmIE5PWEZFUgorICAgICAgICBpZiAoc3N0YXRlKSB7CisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgICAgIGlmIChkaXNwbGEpIGNvbmNiKChjaGFyKWVzY2FwZSk7IC8qIChmb3IgY29uc29sZSAiaW50ZXJydXB0cyIpICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworI2lmZGVmIE5PQ0NUUkFQCisgICAgICAgICAgICBkb2NtZGxpbmUoMSk7CisjZWxzZSAvKiBOT0NDVFJBUCAqLworICAgICAgICAgICAgc2V0aW50KCk7CisgICAgICAgICAgICBjY19leGVjdXRlKCBja2phZGRyKGNtamJ1ZiksIGRvY21kbGluZSwgZmFpbGNtZGxpbmUgKTsKKyNlbmRpZiAvKiBOT0NDVFJBUCAqLworICAgICAgICB9CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9JQ1AKKy8qCisgIElmIGEgY29tbWFuZC1saW5lIGFjdGlvbiBhcmd1bWVudCB3YXMgZ2l2ZW4gYW5kIC1TICgic3RheSIpIHdhcyBub3QgZ2l2ZW4sCisgIGV4aXQgbm93LgorKi8KKyAgICAgICAgaWYgKChjZmxnIHx8IGNuZmxnIHx8IHpzdGF0ZSkgJiYgIXN0YXlmbGcpCisjZW5kaWYgLyogTk9JQ1AgKi8KKyAgICAgICAgICBkb2V4aXQoR09PRF9FWElULHhpdHN0YSk7ICAgICAvKiBFeGl0IHdpdGggZ29vZCBzdGF0dXMgKi8KKworI2lmbmRlZiBOT0xPQ0FMCisjaWZuZGVmIE5PSUNQCisgICAgICAgIGlmIChsb2NhbCkgeworI2lmZGVmIE5FVENPTk4KKyAgICAgICAgICAgIGlmICgoY2ZsZyB8fCBjbmZsZykgJiYgdG5fZXhpdCAmJiB0dGNoaygpIDwgMCkKKyAgICAgICAgICAgICAgZG9leGl0KEdPT0RfRVhJVCx4aXRzdGEpOyAvKiBFeGl0IHdpdGggZ29vZCBzdGF0dXMgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisgICAgICAgICAgICBpZiAoZXhpdG9uY2xvc2UgJiYgIW5ldHdvcmsgJiYKKyAgICAgICAgICAgICAgICAoY2FycmllciAhPSBDQVJfT0ZGICYmICh0dGdtZG0oKSAmIEJNX0RDRCkgPT0gMCkpCisgICAgICAgICAgICAgIGRvZXhpdChHT09EX0VYSVQseGl0c3RhKTsgLyogRXhpdCB3aXRoIGdvb2Qgc3RhdHVzICovCisgICAgICAgICAgICBpZiAoZXhpdG9uY2xvc2UgJiYgbmV0d29yayAmJiB0dGNoaygpIDwgMCkKKyAgICAgICAgICAgICAgZG9leGl0KEdPT0RfRVhJVCx4aXRzdGEpOyAvKiBFeGl0IHdpdGggZ29vZCBzdGF0dXMgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIE5PSUNQICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIH0KKyNlbmRpZiAvKiBOT0NNREwgKi8KKworI2lmZGVmIE5PSUNQICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGludGVyYWN0aXZlIGNvbW1hbmQgcGFyc2VyICovCisjaWZuZGVmIE5PQ01ETAorICAgIGVsc2UgeworCisgICAgICAgIC8qIENvbW1hbmQtbGluZS1vbmx5IHZlcnNpb24gKi8KKyAgICAgICAgZmF0YWwoIj9ObyBjb21tYW5kLWxpbmUgb3B0aW9ucyBnaXZlbiAtIHR5cGUgJ2tlcm1pdCAtaCcgZm9yIGhlbHAiKTsKKyAgICB9CisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVpdGhlciBvbmUhICovCisgICAgICAgIHNzdGF0ZSA9ICd4JzsKKyAgICAgICAganVzdG9uZSA9IDA7CisgICAgICAgIHByb3RvKCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU28gZ28gaW50byBzZXJ2ZXIgbW9kZSAqLworICAgICAgICBkb2V4aXQoR09PRF9FWElULHhpdHN0YSk7ICAgICAgIC8qIGV4aXQgd2l0aCBnb29kIHN0YXR1cyAqLworCisjZW5kaWYgLyogTk9DTURMICovCisjZWxzZSAvKiBub3QgTk9JQ1AgKi8KKy8qCisgIElmIG5vIGFjdGlvbiByZXF1ZXN0ZWQgb24gY29tbWFuZCBsaW5lLCBvciBpZiAtUyAoInN0YXkiKSB3YXMgaW5jbHVkZWQsCisgIGVudGVyIHRoZSBpbnRlcmFjdGl2ZSBjb21tYW5kIHBhcnNlci4KKyovCisgICAgaWYgKCFjbGNtZHMpCisgICAgICBoZXJhbGQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzcGxheSBwcm9ncmFtIGhlcmFsZC4gKi8KKworI2lmZGVmIE5PQ0NUUkFQCisgICAgZGVidWcoRjEwMCwibWFpbiBOT0NDVFJBUCBzZXR0aW5nIGludGVycnVwdCB0cmFwIiwiIiwwKTsKKyAgICBzZXRpbnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdXAgY29tbWFuZCBpbnRlcnJ1cHQgdHJhcHMgKi8KKyAgICBkb2ljcChOVUxMKTsKKyNlbHNlIC8qIE5PQ0NUUkFQICovCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgZGVidWcoRjEwMCwibWFpbiBzZXR0aW5nIGludGVycnVwdCB0cmFwIiwiIiwwKTsKKyAgICAgICAgc2V0aW50KCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdXAgY29tbWFuZCBpbnRlcnJ1cHQgdHJhcHMgKi8KKyAgICAgICAgaWYgKCFjY19leGVjdXRlKGNramFkZHIoY21qYnVmKSwgZG9pY3AsIGZhaWxpY3ApKQorICAgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBOT0NDVFJBUCAqLworI2VuZGlmIC8qIE5PSUNQICovCisjaWZuZGVmIE1BSU5JU1ZPSUQKKyAgICByZXR1cm4oMSk7CisjZW5kaWYgLyogTUFJTklTVk9JRCAqLworfQorCisjaWZkZWYgRFlOQU1JQworLyogQWxsb2NhdGUgZmlsZSBpL28gYnVmZmVycyAqLworCitjaGFyICp6aW5idWZmZXIgPSBOVUxMLCAqem91dGJ1ZmZlciA9IE5VTEw7CisKK2ludAorZ2V0aW9icygpIHsKKyAgICB6aW5idWZmZXIgPSAoY2hhciAqKW1hbGxvYyhJTkJVRlNJWkUpOworICAgIGlmICghemluYnVmZmVyKSByZXR1cm4oLTEpOworICAgIHpvdXRidWZmZXIgPSAoY2hhciAqKW1hbGxvYyh6b2J1ZnNpemUpOworICAgIGRlYnVnKEYxMDEsInpvdXRidWZmZXIgbWFsbG9jIiwiIix6b2J1ZnNpemUpOworICAgIGlmICghem91dGJ1ZmZlcikgcmV0dXJuKC0xKTsKKyAgICBkZWJ1ZyhGMTAwLCJnZXRpb2JzIG9rIiwiIiwwKTsKKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogRFlOQU1JQyAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrY21kYi5jIGIvY2tlcm1pdC04LjAuMjExL2NrY21kYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNWNlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2tjbWRiLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgIEMgSyBDIE0gRCBCIC4gQyAgLS0gIG1hbGxvYyBkZWJ1Z2dlci4KKyovCisKKy8qCisgIEF1dGhvcjogSG93aWUgS2F5ZSwgQ29sdW1iaWEgVW5pdmVyc2l0eSBDZW50ZXIgZm9yIENvbXB1dGluZyBBY3Rpdml0aWVzLgorCisgIENvcHlyaWdodCAoQykgMTk4NSwgMTk5OSwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisqLworLyogVXNlIHRoZSByZWFsIG9uZXMgaW4gdGhpcyBtb2R1bGUhICovCisjaWZkZWYgbWFsbG9jCisjdW5kZWYgbWFsbG9jCisjZW5kaWYgLyogbWFsbG9jICovCisjaWZkZWYgY2FsbG9jCisjdW5kZWYgY2FsbG9jCisjZW5kaWYgLyogY2FsbG9jICovCisjaWZkZWYgcmVhbGxvYworI3VuZGVmIHJlYWxsb2MKKyNlbmRpZiAvKiByZWFsbG9jICovCisjaWZkZWYgZnJlZQorI3VuZGVmIGZyZWUKKyNlbmRpZiAvKiBmcmVlICovCisKKyNpbmNsdWRlICJja2NzeW0uaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNrY2RlYi5oIgorCisjaWZkZWYgQ09IRVJFTlQKK19QUk9UT1RZUCAoIEZJTEUgKiBmZG9wZW4sIChpbnQsIGNoYXIgKikgKTsKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisvKgorICBtZW1kZWJ1ZzoKKyAgdmFyaWFibGUgdG8gY29udHJvbCBtZW1vcnkgZGVidWdnaW5nLgorICBpZiBtZW1kZWJ1ZyA9PSAgMSwgdGhlbiBhY3Rpb24gaXMgYWx3YXlzIHRha2VuLgorICBpZiBtZW1kZWJ1ZyA9PSAgMCwgdGhlbiBubyBhY3Rpb24gaXMgdGFrZW4uCisgIGlmIG1lbWRlYnVnID09IC0xLCB0aGVuIHRoZSB1c2VyIGlzIGFza2VkICh3b3JrcyB3ZWxsIHdpdGggZ2RiKS4KKyovCitpbnQgbWVtZGVidWcgPSAtMTsKK2ludCBkaXNhYmxlZCA9IDA7CitpbnQgaW5pdGVkID0gMDsKKy8qCisgIFRvIHVzZSB0aGlzIHBhY2thZ2UsIGNvbXBpbGUgeW91ciBwcm9ncmFtIHdpdGg6CisgIC1EbWFsbG9jPWRtYWxsb2MgLURmcmVlPWRmcmVlID1EY2FsbG9jPWRjYWxsb2MgLi4uIC1ETURFQlVHCisgIGFuZCB0aGVuIGxpbmsgaXQgd2l0aCBja2NtZGIuYy4KKyovCisjaWZkZWYgTURFQlVHCisKKyNpZm5kZWYgTV9TSVpFX1QKKyNpZmRlZiBORVhUCisjZGVmaW5lIE1fU0laRV9UIHNpemVfdAorI2Vsc2UKKyNpZmRlZiBTVU5PUzQxCisjZGVmaW5lIE1fU0laRV9UIHVuc2lnbmVkCisjZWxzZQorI2RlZmluZSBNX1NJWkVfVCBpbnQKKyNlbmRpZiAvKiBTVU5PUzQxICovCisjZW5kaWYgLyogTkVYVCAqLworI2VuZGlmIC8qIE1fU0laRV9UICovCisKKyNpZmRlZiBDS19BTlNJQworX1BST1RPVFlQKCB2b2lkIGZyZWUsICh2b2lkICopICk7CitfUFJPVE9UWVAoIHZvaWQgKiBtYWxsb2MsIChzaXplX3QpICk7CitfUFJPVE9UWVAoIHZvaWQgKiByZWFsbG9jLCAodm9pZCAqLCBzaXplX3QpICk7CisjZWxzZQorX1BST1RPVFlQKCBWT0lEIGZyZWUsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGNoYXIgKiBtYWxsb2MsIChNX1NJWkVfVCkgKTsKK19QUk9UT1RZUCggY2hhciAqIHJlYWxsb2MsIChjaGFyICosIE1fU0laRV9UKSApOworI2VuZGlmIC8qIE5FWFQgKi8KKworX1BST1RPVFlQKCBWT0lEIG1faW5zZXJ0LCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgbV9kZWxldGUsIChjaGFyICopICk7CisKK19QUk9UT1RZUCggY2hhciAqIGRtYWxsb2MsIChpbnQpICk7CitfUFJPVE9UWVAoIGNoYXIgKiBkY2FsbG9jLCAoaW50LCBpbnQpICk7CitfUFJPVE9UWVAoIGNoYXIgKiBkcmVhbGxvYywgKGNoYXIgKiwgaW50KSApOworCitfUFJPVE9UWVAoIGNoYXIgKnNldF9yYW5nZV9jaGVjaywgKGNoYXIgKiwgaW50KSApOworX1BST1RPVFlQKCBjaGFyICpjaGVja19yYW5nZSwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggc3RhdGljIGNoYXIgKm1heWJlX2NoZWNrX3JhbmdlLCAoY2hhciAqKSApOworCitfUFJPVE9UWVAoIHN0YXRpYyBWT0lEIG1heWJlX3F1aXQsIChjaGFyICopICk7CitfUFJPVE9UWVAoIHN0YXRpYyBpbnQgYXNrLCAoY2hhciAqKSApOworCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oeCx5KSAoKHgpIDwgKHkpID8gKHgpIDogKHkpKQorI2VuZGlmIC8qIG1pbiAqLworI2RlZmluZSBSQU5HRSAiQUJDREVGR0hJSktMTU5PUCIKKyNkZWZpbmUgSU5UU0laRSAgc2l6ZW9mKGludCkKKyNkZWZpbmUgTE9OR1NJWkUgc2l6ZW9mKGxvbmcpCisjZGVmaW5lIFJTSVpFICAgIHNpemVvZihSQU5HRSkKKyNkZWZpbmUgUkZST05UICAgbWluKChSU0laRS8yKSxMT05HU0laRSkKKyNkZWZpbmUgUkJBQ0sgICAgbWluKChSU0laRS1SRlJPTlQpLExPTkdTSVpFKQorCitjaGFyICoKK2RtYWxsb2Moc2l6ZSkgaW50IHNpemU7IHsKKyAgICBjaGFyICpjcDsKKworICAgIGNwID0gbWFsbG9jKHNpemUgKyBSU0laRSArIElOVFNJWkUpOworICAgIGlmIChjcCkgeworICAgICAgICBjcCA9IHNldF9yYW5nZV9jaGVjayhjcCwgc2l6ZSk7CisgICAgICAgIG1faW5zZXJ0KGNwKTsKKyAgICB9CisgICAgcmV0dXJuKGNwKTsKK30KKworY2hhciAqCitkY2FsbG9jKG5lbGVtLCBlbHNpemUpIGludCBuZWxlbSwgZWxzaXplOyB7CisgICAgY2hhciAqY3A7CisKKyAgICBjcCA9IGRtYWxsb2MobmVsZW0gKiBlbHNpemUpOworICAgIGlmIChjcCkKKyAgICAgICAgbWVtc2V0KGNwLCAwLCBuZWxlbSAqIGVsc2l6ZSk7CisgICAgcmV0dXJuKGNwKTsKK30KKworY2hhciAqCitkcmVhbGxvYyhicCxzaXplKSBjaGFyICpicDsgaW50IHNpemU7IHsKKyAgICBjaGFyICpjcDsKKworICAgIGlmIChicCA9PSBOVUxMKSB7CisgICAgICAgIG1heWJlX3F1aXQoIkZyZWVpbmcgTlVMTCBwb2ludGVyIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9kZWxldGUoYnApOworICAgICAgICBjcCA9IGNoZWNrX3JhbmdlKGJwKTsKKyAgICB9CisgICAgY3AgPSByZWFsbG9jKGNwLCBzaXplICsgUlNJWkUgKyBJTlRTSVpFKTsKKyAgICBpZiAoY3ApIHsKKyAgICAgICAgY3AgPSBzZXRfcmFuZ2VfY2hlY2soY3AsIHNpemUpOworICAgICAgICBtX2luc2VydChjcCk7CisgICAgfQorICAgIHJldHVybihjcCk7Cit9CisKK1ZPSUQKK2RmcmVlKGNwKSBjaGFyICpjcDsgeworICAgIGlmIChjcCA9PSBOVUxMKQorICAgICAgICBtYXliZV9xdWl0KCJGcmVlaW5nIE5VTEwgcG9pbnRlciIpOworICAgIGVsc2UgeworICAgICAgICBzd2l0Y2gobV9kZWxldGUoY3ApKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNwID0gbWF5YmVfY2hlY2tfcmFuZ2UoY3ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNwID0gY2hlY2tfcmFuZ2UoY3ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2lmbmRlZiBDS19BTlNJQworICAgIHJldHVybihmcmVlKGNwKSk7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK30KKworY2hhciAqCitzZXRfcmFuZ2VfY2hlY2soY3Asc2l6ZSkgY2hhciAqY3A7IGludCBzaXplOyB7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgaW50IHRtcCA9IHNpemU7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBJTlRTSVpFOyBpKyspIHsgICAgICAvKiBzZXQgdGhlIHNpemUgaW4gdGhlIHN0cmluZyAqLworICAgICAgICBjcFtpXSA9IHRtcCAmIDB4ZmY7CisgICAgICAgIHRtcCA+Pj0gODsKKyAgICB9CisgICAgY3AgKz0gSU5UU0laRTsgICAgICAgICAgICAgICAgICAgICAgLyogc2tpcCB0aGUgc2l6ZSAqLworCisgICAgZm9yKGkgPSAwOyBpIDwgUkZST05UOyBpKyspICAgICAgICAgLyogc2V0IHRoZSBmcm9udCBvZiB0aGUgcmFuZ2UgY2hlY2sgKi8KKyAgICAgICAgY3BbaV0gPSBSQU5HRVtpXTsgICAgICAgICAgICAgICAvKiBzdHJpbmcgKi8KKworICAgIGNwICs9IFJGUk9OVDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgdGhlIGZyb250IHJhbmdlIGNoZWNrICovCisKKyAgICBmb3IoaSA9IDA7IGkgPCBSQkFDSzsgaSsrKSAgICAgICAgICAvKiBzZXQgdGhlIGJhY2sgb2RmIHRoZSByYW5nZSBjaGVjayAqLworICAgICAgICBjcFtpK3NpemVdID0gUkFOR0VbaStSRlJPTlRdOworCisgICAgcmV0dXJuKGNwKTsKK30KKworLyoKKyAgUHV0IGNhbGxzIHRvIHRoaXMgcm91dGluZSBpbiB5b3VyIGNvZGUgYW55IHBsYWNlIHdoZXJlIHlvdSB3YW50IHRvCisgIGNoZWNrIHdoZXRoZXIgeW91J3ZlIGNvcGllZCB0b28gbWFueSBjaGFyYWN0ZXJzIGludG8gYSBtYWxsb2MnZCBzcGFjZS4KKyovCitjaGFyICoKK2NoZWNrX3JhbmdlKGNwKSBjaGFyICpjcDsgeworICAgIHJlZ2lzdGVyIGNoYXIgKmJwID0gY3AgLSBSRlJPTlQgLSBJTlRTSVpFOworICAgIGNoYXIgKnhwID0gYnA7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgaW50IHNpemUgPSAwOworCisgICAgZm9yKGkgPSAwIDsgaSA8IElOVFNJWkU7IGkrKykgeyAgICAgLyogZ2V0IHRoZSBzaXplIG91dCBvZiB0aGUgc3RyaW5nICovCisgICAgICAgIHNpemUgPDw9IDg7CisgICAgICAgIHNpemUgfD0gYnBbSU5UU0laRS1pLTFdICYgMHhmZjsKKyAgICB9CisgICAgYnAgKz0gSU5UU0laRTsKKworICAgIGZvcihpID0gMDsgaSA8IFJGUk9OVDsgaSsrKSAgICAgICAgIC8qIGNoZWNrIGZyb250IHJhbmdlIGNoZWNrICovCisgICAgICAgIGlmIChicFtpXSAhPSBSQU5HRVtpXSkgeworICAgICAgICAgICAgbWF5YmVfcXVpdCgibGVmdHNpZGUgbWFsbG9jIGJ1ZmZlciBvdmVycnVuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGJwICs9IFJGUk9OVDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgZnJvbnQgcmFuZ2UgY2hlY2sgKi8KKworICAgIGZvcihpID0gMDsgaSA8IFJCQUNLOyBpKyspICAgICAgICAgIC8qIGNoZWNrIGJhY2sgcmFuZ2UgY2hlY2sgKi8KKyAgICAgICAgaWYgKGJwW2krc2l6ZV0gIT0gUkFOR0VbaStSRlJPTlRdKSB7CisgICAgICAgICAgICBtYXliZV9xdWl0KCJyaWdodHNpZGUgbWFsbG9jIGJ1ZmZlciBvdmVycnVuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIHJldHVybih4cCk7Cit9CisKK3N0YXRpYyBjaGFyICoKK21heWJlX2NoZWNrX3JhbmdlKGNwKSBjaGFyICpjcDsgeworICAgIHJlZ2lzdGVyIGNoYXIgKmJwID0gY3AgLSBSRlJPTlQgLSBJTlRTSVpFOworICAgIGNoYXIgKnhwID0gYnA7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgaW50IHNpemUgPSAwOworCisgICAgZm9yKGkgPSAwIDsgaSA8IElOVFNJWkU7IGkrKykgeyAgICAgLyogZ2V0IHRoZSBzaXplIG91dCBvZiB0aGUgc3RyaW5nICovCisgICAgICAgIHNpemUgPDw9IDg7CisgICAgICAgIHNpemUgfD0gYnBbSU5UU0laRS1pLTFdICYgMHhmZjsKKyAgICB9CisgICAgYnAgKz0gSU5UU0laRTsKKworICAgIGZvcihpID0gMDsgaSA8IFJGUk9OVDsgaSsrKSAgICAgICAgIC8qIGNoZWNrIGZyb250IHJhbmdlIGNoZWNrICovCisgICAgICAgIGlmIChicFtpXSAhPSBSQU5HRVtpXSkgeworICAgICAgICAgICAgcmV0dXJuKGNwKTsKKyAgICAgICAgfQorICAgIGJwICs9IFJGUk9OVDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgZnJvbnQgcmFuZ2UgY2hlY2sgKi8KKworICAgIGZvcihpID0gMDsgaSA8IFJCQUNLOyBpKyspICAgICAgICAgIC8qIGNoZWNrIGJhY2sgcmFuZ2UgY2hlY2sgKi8KKyAgICAgICAgaWYgKGJwW2krc2l6ZV0gIT0gUkFOR0VbaStSRlJPTlRdKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwicmlnaHRzaWRlIG1hbGxvYyBidWZmZXIgb3ZlcnJ1blxuIik7CisgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICByZXR1cm4oeHApOworfQorCisjZGVmaW5lIEJVQ0tFVFMgMTAwMDAKK2NoYXIgKm1fdXNlZFtCVUNLRVRTXTsKK2NoYXIgKm1fdXNlZDJbQlVDS0VUU107CisKK1ZPSUQKK21faW5zZXJ0KGNwKSByZWdpc3RlciBjaGFyICpjcDsgeworICAgIHJlZ2lzdGVyIGludCBpOworCisgICAgaWYgKGRpc2FibGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IoaSA9IDA7IGkgPCBCVUNLRVRTOyBpKyspCisgICAgICAgIGlmIChtX3VzZWRbaV0gPT0gMCkgeworICAgICAgICAgICAgbV91c2VkW2ldID0gY3A7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICBkaXNhYmxlZCArKzsKK30KKworc3RhdGljIFZPSUQKK21faW5zZXJ0MihjcCkgcmVnaXN0ZXIgY2hhciAqY3A7IHsKKyAgICByZWdpc3RlciBpbnQgaTsKKworICAgIGlmIChkaXNhYmxlZCkKKyAgICAgICAgcmV0dXJuOworICAgIGZvcihpID0gMDsgaSA8IEJVQ0tFVFM7IGkrKykKKyAgICAgICAgaWYgKG1fdXNlZDJbaV0gPT0gMCkgeworICAgICAgICAgICAgbV91c2VkMltpXSA9IGNwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgZGlzYWJsZWQgKys7Cit9CisKK2ludAorbV9kZWxldGUoY3ApIHJlZ2lzdGVyIGNoYXIgKmNwOyB7CisgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBCVUNLRVRTOyBpKyspCisgICAgICAgIGlmIChtX3VzZWRbaV0gPT0gY3ApIHsKKyAgICAgICAgICAgIG1fdXNlZFtpXSA9IDA7CisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0KKyAgICBmb3IoaSA9IDA7IGkgPCBCVUNLRVRTOyBpKyspCisgICAgICAgIGlmIChtX3VzZWQyW2ldID09IGNwKSB7CisgICAgICAgICAgICBtX3VzZWQyW2ldID0gMDsKKyAgICAgICAgICAgIHJldHVybigyKTsKKyAgICAgICAgfQorICAgIGlmIChkaXNhYmxlZCkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgbWF5YmVfcXVpdCgiRnJlZWluZyB1bm1hbGxvYydlZCBwb2ludGVyIik7CisgICAgcmV0dXJuKDApOworfQorCitWT0lECittX2luaXQoKSB7CisgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICBpbml0ZWQgPSAxOworICAgIGRpc2FibGVkID0gMDsKKyNpZmRlZiBORVhUCisgICAgbWFsbG9jX2RlYnVnKDIrNCs4KzE2KTsKKyNlbmRpZiAvKiBORVhUICovCisKKyAgICBmb3IoaSA9IDA7IGkgPCBCVUNLRVRTOyBpKyspCisgICAgICBtX3VzZWRbaV0gPSAwOworfQorCitWT0lECittX2RvbmUoKSB7CisgICAgcmVnaXN0ZXIgaW50IGksaj0wOworCisgICAgaWYgKGRpc2FibGVkKQorICAgICAgICByZXR1cm47CisgICAgZm9yKGkgPSAwOyBpIDwgQlVDS0VUUzsgaSsrKQorICAgICAgICBpZiAobV91c2VkW2ldICE9IDApIHsKKyAgICAgICAgICAgIGlmIChtZW1kZWJ1ZykgeworICAgICAgICAgICAgICAgIGlmIChqID09IDApCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJ1bmZyZWUnZWQgYnVmZmVycywgaW5kaWNlczogIik7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVkLCAiLCBpKTsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBpZiAoaikKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgICAgZm9yKGkgPSAwOyBpIDwgQlVDS0VUUzsgaSsrKQorICAgICAgICBpZiAobV91c2VkMltpXSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobWVtZGVidWcpIHsKKyAgICAgICAgICAgICAgICBpZiAoaiA9PSAwKQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwidW5mcmVlJ2VkIHJlZ2lzdGVyZWQgYnVmZmVycywgaW5kaWNlczogIik7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVkLCAiLCBpKTsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBpZiAoaikKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgICAgaWYgKGopCisgICAgICAgIG1heWJlX3F1aXQoIlVuZnJlZSdlZCBtYWxsb2MgYnVmZmVycyIpOworfQorCitWT0lECittX2NoZWNrcmFuZ2VzKCkgeworICAgIGludCBpOworCisgICAgZm9yICggaSA9IDA7IGkgPCBCVUNLRVRTOyBpKyspCisgICAgICAgIGlmIChtX3VzZWRbaV0pCisgICAgICAgICAgICBjaGVja19yYW5nZShtX3VzZWRbaV0pOworfQorCitzdGF0aWMgVk9JRAorbWF5YmVfcXVpdChzdHIpIGNoYXIgKnN0cjsgeworICAgIGRlYnVnKEYxMDAsIm1kZWJ1ZyBtYXliZV9xdWl0IiwiIiwwKTsKKyAgICBpZiAobWVtZGVidWcgPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIGZwcmludGYoc3RkZXJyLCIlc1xuIixzdHIpOworICAgIGlmIChtZW1kZWJ1ZyA9PSAxKQorICAgICAgICBhYm9ydCgpOworICAgIGlmIChtZW1kZWJ1ZyA9PSAtMSkKKyAgICAgICAgaWYgKGFzaygiUXVpdD8gIikpCisgICAgICAgICAgICBhYm9ydCgpOworfQorCitzdGF0aWMgaW50Cithc2soc3RyKSBjaGFyICpzdHI7IHsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIEZJTEUgKmluOworICAgIGludCBmZDsKKworICAgIGZkID0gZHVwKGZpbGVubyhzdGRpbikpOworICAgIGluID0gZmRvcGVuKGZkLCAiciIpOworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsc3RyKTsKKyAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICAgIGlmIChmZ2V0cyhidWYsIDk5LCBpbikgPT0gTlVMTCkgLyogRU9GPyAqLworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICBpZiAoYnVmWzBdID09ICduJyB8fCBidWZbMF0gPT0gJ04nKSB7CisgICAgICAgICAgICBmY2xvc2UoaW4pOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgICAgIGlmIChidWZbMF0gPT0gJ3knIHx8IGJ1ZlswXSA9PSAnWScpIHsKKyAgICAgICAgICAgIGZjbG9zZShpbik7CisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0KKyAgICAgICAgZnByaW50ZihzdGRlcnIsInBsZWFzZSBhbnN3ZXIgeS9uLlxuIik7CisgICAgfQorfQorI2VuZGlmIC8qIE1ERUJVRyAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrY25ldC5jIGIvY2tlcm1pdC04LjAuMjExL2NrY25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWU1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2tjbmV0LmMKQEAgLTAsMCArMSwxNDIwNSBAQAorY2hhciAqY2tuZXR2ID0gIk5ldHdvcmsgc3VwcG9ydCwgOC4wLjI4MywgNyBGZWIgMjAwNCI7CisKKy8qICBDIEsgQyBOIEUgVCAgLS0gIE5ldHdvcmsgc3VwcG9ydCAgKi8KKworLyoKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisKKy8qCisgIFJFTUlOREVSOiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB0aGF0IG90aGVyIG1vZHVsZXMgZGVwZW5kIG11c3QKKyAgYWxzbyBiZSBtYWRlIHRvIGNrbG5ldC5jIChmb3IgVk9TKSB1bnRpbCBzdWNoIHRpbWUgYXMgY2tsbmV0LmMgYW5kIHRoaXMKKyAgbW9kdWxlIGFyZSBtZXJnZWQgYmFjayB0b2dldGhlci4KKworICBOT1RFIFRPIENPTlRSSUJVVE9SUzogVGhpcyBmaWxlLCBhbmQgYWxsIHRoZSBvdGhlciBzaGFyZWQgKGNrYyBhbmQgY2t1KQorICBDLUtlcm1pdCBzb3VyY2UgZmlsZXMsIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIEMgcHJlcHJvY2Vzc29ycyB0aGF0IHN1cHBvcnQKKyAgb25seSAjaWZkZWYsICNlbHNlLCAjZW5kaWYsICNkZWZpbmUsIGFuZCAjdW5kZWYuICBQbGVhc2UgZG8gbm90IHVzZSAjaWYsCisgIGxvZ2ljYWwgb3BlcmF0b3JzLCBvciBvdGhlciBwcmVwcm9jZXNzb3IgZmVhdHVyZXMgaW4gdGhpcyBtb2R1bGUuICBBbHNvLAorICBkb24ndCB1c2UgYW55IEFOU0kgQyBjb25zdHJ1Y3RzIGV4Y2VwdCB3aXRoaW4gI2lmZGVmIENLX0FOU0lDLi4jZW5kaWYuCisKKyAgQXV0aG9yczoKKworICBGcmFuayBkYSBDcnV6IChmZGNAY29sdW1iaWEuZWR1KSwKKyAgICBDb2x1bWJpYSBVbml2ZXJzaXR5IEFjYWRlbWljIEluZm9ybWF0aW9uIFN5c3RlbXMsIE5ldyBZb3JrIENpdHkuCisgIEplZmZyZXkgRSBBbHRtYW4gKGphbHRtYW5Ac2VjdXJlLWVuZHBvaW50cy5jb20pIC0tIFByaW1hcnkgCisgICAgbWFpbnRhaW5lci9kZXZlbG9wZXIgc2luY2UgYWJvdXQgMTk5Ni4KKyAgbmV0b3BlbigpIHJvdXRpbmUgZm9yIFRDUC9JUCBvcmlnaW5hbGx5IGJ5IEtlbiBZYXAsIFJvY2hlc3RlciBVbml2ZXJzaXR5CisgICAgKGtlbkBjcy5yb2NoZXN0ZXIuZWR1KSAobm8gbG9uZ2VyIGF0IHRoYXQgYWRkcmVzcykuCisgIE1pc3NpbmcgcGllY2VzIGZvciBFeGNlbGFuIHNvY2tldHMgbGlicmFyeSBmcm9tIFdpbGxpYW0gQmFkZXIuCisgIFRlbG5ldCBwcm90b2NvbCBieSBGcmFuayBkYSBDcnV6IGFuZCBKZWZmcmV5IEFsdG1hbi4KKyAgUmxvZ2luIHByb3RvY29sIGJ5IEplZmZyZXkgRSBBbHRtYW4uCisgIFNTTCBzdXBwb3J0IGFkYXB0ZWQgYnkgSmVmZnJleSBFIEFsdG1hbiBmcm9tIHdvcmsgZG9uZSBieQorICAgIFRpbSBIdWRzb24gPHRqaEBjcnlwdG9zb2Z0LmNvbT4gKzYxIDcgMzI3ODE1ODEKKyAgVExTIHN1cHBvcnQgYnkgSmVmZnJleSBFIEFsdG1hbi4KKyAgSFRUUCBzdXBwb3J0IGJ5IEplZmZyZXkgRSBBbHRtYW4uCisgIFRHViBNdWx0aU5ldCBjb2RlIGJ5IEZyYW5rIGRhIENydXouCisgIE11bHRpTmV0IGNvZGUgYWRhcHRlZCB0byBXSU4vVENQIGJ5IFJheSBIdW50ZXIgb2YgVFdHLgorICBNdWx0aU5ldCBjb2RlIGFkYXB0ZWQgdG8gREVDIFRDUC9JUCBieSBMZWUgVGliYmVydCBvZiBERUMgYW5kIEZyYW5rIGRhIENydXouCisgIFRDUC9JUCBzdXBwb3J0IGFkYXB0ZWQgdG8gSUJNIFRDUC9JUCAxLjIuMSwyLjAgZm9yIE9TLzIgYnkgS2FpIFV3ZSBSb21tZWwuCisgIENNVS1PcGVuVk1TL0lQIG1vZGlmaWNhdGlvbnMgYnkgTWlrZSBPJ01hbGxleSwgRGlnaXRhbCAoREVDKS4KKyAgWC4yNSBzdXBwb3J0IGJ5IE1hcmNlbGxvIEZydXRpZywgQ2F0aG9saWMgVW5pdmVyc2l0eSwKKyAgICBSaW8gZGUgSmFuZWlybywgQnJhemlsIChmcnV0aWdAcm5wLmltcGEuYnIpIHdpdGggZml4ZXMgZnJvbQorICAgIFN0ZWZhYW4gRWVja2VscywgRXVyb2tvbSwgTHV4ZW1ib3VyZy4KKyAgICBEYXZpZCBMYW5lIGFkZGVkIHN1cHBvcnQgZm9yIFN0cmF0dXMgVk9TIFguMjUgMTk5Ni4KKyAgICBTdGVwaGVuIFJpZWhtIGFkZGVkIHN1cHBvcnQgZm9yIElCTSBBSVggWC4yNSBpbiBBcHJpbCAxOTk4LgorICBPdGhlciBjb250cmlidXRpb25zIGFzIGluZGljYXRlZCBpbiB0aGUgY29kZS4KKyovCisjZGVmaW5lIENLQ05FVF9DCisjaW5jbHVkZSAiY2tjc3ltLmgiCisjaW5jbHVkZSAiY2tjZGViLmgiCisjaW5jbHVkZSAiY2tja2VyLmgiCisjaW5jbHVkZSAiY2tjYXNjLmgiCisjaWZkZWYgSTM4NklYICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGFzIHRvIGNvbWUgYmVmb3JlIGNrY25ldC5oIGluICovCisjaW5jbHVkZSA8ZXJybm8uaD4gICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyB2ZXJzaW9uLCBidXQgYWZ0ZXIgaW4gb3RoZXJzICovCisjZW5kaWYgLyogSTM4NklYICovCisjaW5jbHVkZSAiY2tjbmV0LmgiICAgICAgICAgICAgICAgICAgICAgLyogd2hpY2ggaW5jbHVkZXMgY2tjdGVsLmggKi8KKyNpZmRlZiBDS19TU0wKKyNpbmNsdWRlICJja19zc2wuaCIKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworI2lmZGVmIENLX0ROU19TUlYKKyNpZmRlZiBPUzIKKyNpZmRlZiBOVAorI2luY2x1ZGUgPHdzaGVscGVyLmg+CisjZWxzZSAvKiBOVCAqLworLyogIUVycm9yIE9TLzIgZG9lcyBub3Qgc3VwcG9ydCBETlMgU2VydmljZSBSZWNvcmRzLiAqLworI2VuZGlmIC8qIE5UICovCisjZWxzZSAvKiBPUzIgKi8KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpZmRlZiBVU0VfTkFNRVNFUl9DT01QQVQKKyNpbmNsdWRlIDxhcnBhL25hbWVzZXJfY29tcGF0Lmg+CisjZW5kaWYJLyogVVNFX05BTUVTRVJfQ09NUEFUICovCisjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisjaW5jbHVkZSA8cmVzb2x2Lmg+CisjaWZuZGVmIFBTMkFJWDEwCisjaWZuZGVmIEJTRDQKKyNpZm5kZWYgSTM4NklYCisjaWZuZGVmIFJUQUlYCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZiAvKiBSVEFJWCAqLworI2VuZGlmIC8qIEkzODZJWCAqLworI2VuZGlmIC8qIEJTRDQgKi8KKyNlbmRpZiAvKiBQUzJBSVgxMCAqLworI2VuZGlmIC8qIE9TMiAqLworI2lmbmRlZiBUX1NSVgorI2RlZmluZSBUX1NSViAzMworI2VuZGlmIC8qIFRfU1JWICovCisjaWZuZGVmIFRfVFhUCisjZGVmaW5lIFRfVFhUIDE2CisjZW5kaWYgLyogVF9UWFQgKi8KKworLyogZm9yIG9sZCBVbml4ZXMgYW5kIGZyaWVuZHMgLi4uICovCisjaWZuZGVmIE1BWEhPU1ROQU1FTEVOCisjZGVmaW5lIE1BWEhPU1ROQU1FTEVOIDY0CisjZW5kaWYgLyogTUFYSE9TVE5BTUVMRU4gKi8KKworI2RlZmluZSBNQVhfRE5TX05BTUVMRU4gKDE1KihNQVhIT1NUTkFNRUxFTiArIDEpKzEpCisjZW5kaWYgLyogQ0tfRE5TX1NSViAqLworCisjaWZkZWYgTk9ORVQKKyNpZmRlZiBUQ1BJUExJQgorI3VuZGVmIFRDUElQTElCCisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyNlbmRpZiAvKiBOT05FVCAqLworCisjaWZuZGVmIE5PTUhIT1NUCisjaWZkZWYgZGF0YWdlbmVyYWwKKyNkZWZpbmUgTk9NSEhPU1QKKyNlbHNlCisjaWZkZWYgSFBVWDVXSU5UQ1AKKyNkZWZpbmUgTk9NSEhPU1QKKyNlbmRpZiAvKiBIUFVYNVdJTlRDUCAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogTk9NSEhPU1QgKi8KKworI2lmZGVmIElOQUREUlgKKyAgc3RydWN0IGluX2FkZHIgaW5hZGRyeDsKKyNlbmRpZiAvKiBJTkFERFJYICovCisKK2ludCB0dG5ldCA9IE5FVF9OT05FOyAgICAgICAgICAgICAgICAgICAvKiBOZXR3b3JrIHR5cGUgKi8KK2ludCB0dG5wcm90byA9IE5QX0RFRkFVTFQ7ICAgICAgICAgICAgICAvKiBOZXR3b3JrIHZpcnR1YWwgdGVybWluYWwgcHJvdG9jb2wgKi8KKworLyogMCA9IGRvbid0IGxvd2VyY2FzZSB1c2VybmFtZSBmb3IgUmxvZ2luL1RlbG5ldCBwcm90b2NvbCAqLworLyogbm9uemVybyA9IGRvIGxvd2VyY2FzZSBpdC4gIEFkZCBhIFNFVCBjb21tYW5kIGlmIG5lY2Vzc2FyeS4uLiAqLworI2lmZGVmIFZNUworaW50IGNrX2xjbmFtZSA9IDE7CisjZWxzZQoraW50IGNrX2xjbmFtZSA9IDA7CisjZW5kaWYgLyogVk1TICovCisKK2V4dGVybiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHRlcm5hbCB2YXJpYWJsZXMgKi8KKyAgZHVwbGV4LCBkZWJzZXMsIHNlc2xvZywgc2Vzc2Z0LCB3YXNjbG9zZWQsCisgIHR0eWZkLCBxdWlldCwgbXNnZmxnLCB3aGF0LCBuZXR0eXBlLCB0dG1kbTsKKyNpZmRlZiBJS1NECitleHRlcm4gaW50IGluc2VydmVyOworI2VuZGlmIC8qIElLU0QgKi8KKworY2hhciBteWlwYWRkclsyMF0gPSB7ICdcMCcgfTsgICAgICAgICAgIC8qIEdsb2JhbCBjb3B5IG9mIG15IElQIGFkZHJlc3MgKi8KKworI2lmZGVmIE5FVENPTk4KKy8qIERvbid0IG5lZWQgYW55IG9mIHRoaXMgaWYgdGhlcmUgaXMgbm8gbmV0d29yayBzdXBwb3J0LiAqLworCisvKgorICBORVRMRUJVRiBpcyAobXVzdCBiZSkgZGVmaW5lZCBmb3IgdGhvc2UgcGxhdGZvcm1zIHRoYXQgY2FsbCB0aGlzCisgIG1vZHVsZSB0byBkbyBuZXR3b3JrIGkvbyAoZS5nLiBuZXRpbmMoKSwgbmV0dGNoaygpLCBldGMpIHJhdGhlcgorICB0aGFuIGRvaW5nIGl0IHRoZW1zZWx2ZXMgKHR0aW5jKCksIHR0Y2hrKCksIGV0YykuICBJbiB0aGlzIGNhc2UKKyAgdGhlIFRlbG5ldCBsb2NhbC1lY2hvIGJ1ZmZlcnMgYW5kIHJvdXRpbmVzIGFyZSBkZWZpbmVkIGFuZCByZWZlcmVuY2VkCisgIGhlcmUsIHJhdGhlciB0aGFuIGluIHRoZSBjaz90aW8uYyBtb2R1bGUuCisqLworI2lmZGVmIE5FVExFQlVGCisjZGVmaW5lIExFQlVGU0laIDQwOTYKK2ludCB0dHB1c2ggPSAtMSwgbGVfZGF0YSA9IDA7ICAgICAgICAgICAvKiBUaGVzZSBhcmUgc2VlbiBmcm9tIG91dHNpZGUgKi8KK3N0YXRpYyBDSEFSIGxlX2J1ZltMRUJVRlNJWl07ICAgICAgICAgICAvKiBUaGVzZSBhcmUgdXNlZCBpbnRlcm5hbGx5ICovCitzdGF0aWMgaW50IGxlX3N0YXJ0ID0gMCwgbGVfZW5kID0gMDsKK2ludCB0dF9wdXNoX2luaXRlZCA9IDA7CisjZW5kaWYgLyogTkVUTEVCVUYgKi8KKworI2lmZGVmIENLX1NPQ0tTICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNPQ0tTIEludGVybmV0IHJlbGF5IHBhY2thZ2UgKi8KKyNpZmRlZiBDS19TT0NLUzUgICAgICAgICAgICAgICAgICAgICAgICAvKiBTT0NLUyA1ICovCisjZGVmaW5lIGFjY2VwdCAgU09DS1NhY2NlcHQKKyNkZWZpbmUgYmluZCAgICBTT0NLU2JpbmQKKyNkZWZpbmUgY29ubmVjdCBTT0NLU2Nvbm5lY3QKKyNkZWZpbmUgZ2V0c29ja25hbWUgU09DS1NnZXRzb2NrbmFtZQorI2RlZmluZSBsaXN0ZW4gU09DS1NsaXN0ZW4KKyNlbHNlICAvKiBOb3QgU09DS1MgNSAqLworI2RlZmluZSBhY2NlcHQgIFJhY2NlcHQKKyNkZWZpbmUgYmluZCAgICBSYmluZAorI2RlZmluZSBjb25uZWN0IFJjb25uZWN0CisjZGVmaW5lIGdldHNvY2tuYW1lIFJnZXRzb2NrbmFtZQorI2RlZmluZSBsaXN0ZW4gUmxpc3RlbgorI2VuZGlmIC8qIENLX1NPQ0tTNSAqLworI2VuZGlmIC8qIENLX1NPQ0tTICovCisKKyNpZmRlZiBERUNfVENQSVAKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8aW5ldC5oPgorI2VuZGlmIC8qIERFQ19UQ1BJUCAqLworCisvKiBBbHNvIHNlZSBja2NuZXQuaCAtLSBobW1tLCB3aHkgZG9uJ3Qgd2UgYWx3YXlzIGluY2x1ZGUgaW5ldC5oPyAqLworCisjaWZkZWYgSFBVWAorI2lmbmRlZiBIUFVYNyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhQVVggNy4wMCBkb2Vzbid0IGhhdmUgaXQgKi8KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4gICAgICAgICAgICAgICAgICAvKiBGb3IgaW5ldF9udG9hKCkgcHJvdG90eXBlICovCisjZW5kaWYgLyogSFBVWDcgKi8KKyNlbmRpZiAvKiBIUFVYICovCisKKyNpZmRlZiBDTVVfVENQSVAKKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYgLyogQ01VX1RDUElQICovCisKKyNpZm5kZWYgTk9EQ0xUSU1FVkFMCisjaWZkZWYgRENMVElNRVZBTCAgICAgICAgICAgICAgICAgICAgICAgLyogVW5peFdhcmUgNyAqLworc3RydWN0IHRpbWV2YWwgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFuZCBkZWZpbmUgdGhlc2Ugb3Vyc2VsdmVzLiAqLworICAgIGxvbmcgdHZfc2VjOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIChzZWUgY29tbWVudHMgaW4gY2t1dGlvLmMpICovCisgICAgbG9uZyB0dl91c2VjOworfTsKK3N0cnVjdCB0aW1lem9uZSB7CisgICAgaW50IHR6X21pbnV0ZXN3ZXN0OworICAgIGludCB0el9kc3R0aW1lOworfTsKKyNlbmRpZiAvKiBEQ0xUSU1FVkFMICovCisjZW5kaWYgLyogTk9EQ0xUSU1FVkFMICovCisKKyNpZmRlZiBXSU5UQ1AKKworI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisvKgorICBUaGUgV0lOL1RDUCBjb2RlIHBhdGggaXMgdGhlIHNhbWUgYXMgdGhhdCBmb3IgTXVsdGlOZXQuCisgIE9ubHkgdGhlIHJvdXRpbmUgbmFtZXMgaGF2ZSBjaGFuZ2VkIC4uLgorKi8KKyNkZWZpbmUgc29ja2V0X3JlYWQgICAgIG5ldHJlYWQKKyNkZWZpbmUgc29ja2V0X2lvY3RsICAgIGlvY3RsCisjZGVmaW5lIHNvY2tldF93cml0ZSAgICBuZXR3cml0ZQorI2RlZmluZSBzb2NrZXRfY2xvc2UgICAgbmV0Y2xvc2UKKworI2lmZGVmIE9MRF9UV0cgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29tZSByb3V0aW5lcyBoYXZlIGV2b2x2ZWQgKi8KKyAgICAgICAgZXh0ZXJuIGludCB2bXNlcnJubywgdWVycm5vOworI2RlZmluZSBzb2NrZXRfZXJybm8gICAgdWVycm5vCisjZGVmaW5lIHNvY2tldF9wZXJyb3IgICBwZXJyb3IgICAgICAgICAvKiB3aGljaCB1c2VzIGVycm5vLCBub3QgdWVycm5vISAqLworI2Vsc2UKKyNkZWZpbmUgc29ja2V0X2Vycm5vICAgIGVycm5vCisjZGVmaW5lIHNvY2tldF9wZXJyb3IgICB3aW4kcGVycm9yCisjZW5kaWYgLyogT0xEX1RXRyAqLworCisjZWxzZSAvKiBOb3QgV0lOVENQICovCisKKyNpZmRlZiBPU0YxMworI2lmZGVmIENLX0FOU0lDCisjaWZkZWYgX05PX1BST1RPCisjdW5kZWYgX05PX1BST1RPCisjZW5kaWYgLyogX05PX1BST1RPICovCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyNlbmRpZiAvKiBPU0YxMyAqLworCisjaWZuZGVmIEkzODZJWAorI2luY2x1ZGUgPGVycm5vLmg+ICAgICAgICAgICAgICAgICAgICAgIC8qIEFscmVhZHkgaW5jbHVkZWQgYWJvdmUgKi8KKyNlbmRpZiAvKiBJMzg2SVggKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPiAgICAgICAgICAgICAgICAgICAgIC8qIEV2ZXJ5Ym9keSBuZWVkcyB0aGlzICovCisKKyNpZmRlZiBaSUxPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBaaWxvZyBoYXMgZGlmZmVyZW50IG5hbWUgZm9yIHRoaXMgKi8KKyNpbmNsdWRlIDxzZXRyZXQuaD4KKyNlbHNlCisjaW5jbHVkZSA8c2V0am1wLmg+CisjZW5kaWYgLyogWklMT0cgKi8KKworI2VuZGlmIC8qIFdJTlRDUCAqLworCisjaWZkZWYgZGF0YWdlbmVyYWwgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBHZW5lcmFsIEFPUy9WUyAqLworI2luY2x1ZGUgPDp1c3I6aW5jbHVkZTp2c190Y3BfZXJybm8uaD4KKyNpbmNsdWRlIDw6dXNyOmluY2x1ZGU6c3lzOnZzX3RjcF90eXBlcy5oPgorI2lmZGVmIFNFTEVDVAorLyoKKyAgTk9URTogVGhpcyBjYW4gYmUgY29tcGlsZWQgYW5kIGxpbmtlZCBPSyB3aXRoIFNFTEVDVCBkZWZpbmVkCisgIGJ1dCBpdCBkb2Vzbid0IHdvcmsgYXQgYWxsLiAgQW55Ym9keSB3aG8gY2FyZXMgYW5kIGtub3dzIGhvdworICB0byBmaXggaXQsIGZlZWwgZnJlZS4KKyovCisjaW5jbHVkZSA8OnVzcjppbmNsdWRlOnN5czp2c190Y3BfdGltZS5oPgorI2VuZGlmIC8qIFNFTEVDVCAqLworI2luY2x1ZGUgPDp1c3I6aW5jbHVkZTpzeXM6c29ja2V0Lmg+CisjaW5jbHVkZSA8OnVzcjppbmNsdWRlOm5ldGluZXQ6aW4uaD4KKyNpbmNsdWRlIDw6dXNyOmluY2x1ZGU6bmV0ZGIuaD4KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworCisjaWZuZGVmIHNvY2tldF9lcnJubworI2RlZmluZSBzb2NrZXRfZXJybm8gZXJybm8KKyNlbmRpZiAvKiBzb2NrZXRfZXJybm8gKi8KKworI2lmZGVmIFROQ09ERQorZXh0ZXJuIGludCB0bl9kZWI7CisjZW5kaWYgLyogVE5DT0RFICovCisKK2ludCB0Y3BfcmRucyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXZlcnNlIEROUyBsb29rdXAgKi8KKyNpZmRlZiBERUNfVENQSVBfT0xECisgICAgU0VUX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9lc24ndCBzZWVtIHRvIHdvcmsgaW4gVUNYICovCisjZWxzZQorICAgICBTRVRfQVVUTworI2VuZGlmIC8qIERFQ19UQ1BJUCAqLworICAgICAgOworI2lmZGVmIENLX0ROU19TUlYKK2ludCB0Y3BfZG5zX3NydiA9IFNFVF9PRkY7CisjZW5kaWYgLyogQ0tfRE5TX1NSViAqLworCitfUFJPVE9UWVAoIGNoYXIgKiBjbWN2dGRhdGUsIChjaGFyICosIGludCkgKTsKKworI2lmZGVmIFJMT0dDT0RFCitfUFJPVE9UWVAoIGludCBybG9nX2N0cmwsIChDSEFSICosIGludCkgKTsKK19QUk9UT1RZUCggc3RhdGljIGludCBybG9nX29vYiwgKENIQVIgKiwgaW50KSApOworI2lmbmRlZiBUQ1BJUExJQgorX1BST1RPVFlQKCBzdGF0aWMgU0lHVFlQIHJsb2dvb2JoLCAoIGludCApICk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KK19QUk9UT1RZUCggc3RhdGljIGludCBybG9nX2luaSwgKENIQVIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgKTsKK2ludCBybG9nX21vZGUgPSBSTF9DT09LRUQ7CitpbnQgcmxvZ19zdG9wcGVkID0gMDsKK2ludCBybG9nX2luYmFuZCA9IDA7CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKworI2lmbmRlZiBOT0lDUAorZXh0ZXJuIGludCBkb2Nvbng7ICAgICAgICAgICAgICAgICAgICAgIC8qIENPTk5FQ1QtY2xhc3MgY29tbWFuZCBhY3RpdmUgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworCisjaWZkZWYgSUJNWDI1CisvKiBUaGlzIHZhcmlhYmxlIHNob3VsZCBwcm9iYWJseSBiZSBnZW5lcmFsaXNlZCBmb3IgdHJ1ZSBjbGllbnQvc2VydmVyCisgKiBzdXBwb3J0IC0gaWU6IHRoZSBmZCBvZiB0aGUgbGlzdGVuaW5nIHNlcnZlciwgYWNjZXB0ZWQgY2FsbHMgc2hvdWxkCisgKiBiZSBmb3JrZWQgb3IgYXQgbGVhc3QgaGFuZGxlZCB2aWEgYSBzZWNvbmQgZmQgKGZvciBJQk0ncyBYLjI1IC0KKyAqIHR0eWZkIGFsd2F5cyBob2xkcyB0aGUgYWN0aXZlIGZkIC0gaWUgdGhlIHNlcnZlciBiZWNvbWVzIGluYWN0aXZlCisgKiBhcyBsb25nIGFzIGEgY2xpZW50IGlzIGNvbm5lY3RlZCwgYW5kIGJlY29tZXMgYWN0aXZlIGFnYWluIHdoZW4gdGhlCisgKiBjb25uZWN0aW9uIGlzIGNsb3NlZCkKKyAqLworaW50IHgyNXNlcnZlcmZkID0gMDsgICAgICAgICAgICAvKiBleHRlcm4gaW4gY2tjbmV0LmggKi8KK2ludCB4MjVzZXFubyA9IDA7ICAgICAgICAgICAgICAgLyogQ29ubmVjdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KK2ludCB4MjVsYXN0bXNnID0gLTE7ICAgICAgICAgICAgLyogQSBjaGVhcHNrYXRlJ3Mgc3RhdGUgdGFibGUgKi8KKworI2RlZmluZSBYMjVfQ0xPU0VEICAgICAgMCAgICAgICAvKiBEZWZhdWx0IHN0YXRlOiBubyBjb25uZWN0aW9uLCBubyBTVFJFQU0gKi8KKyNkZWZpbmUgWDI1X1NFVFVQICAgICAgIDEgICAgICAgLyogWC4yNSBoYXMgYmVlbiBzZXQgdXAgKG5vIGNvbm5lY3Rpb24pICovCisjZGVmaW5lIFgyNV9DT05ORUNURUQgICAyICAgICAgIC8qIFguMjUgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZCAqLworaW50IHgyNV9zdGF0ZSA9IFgyNV9DTE9TRUQ7ICAgICAvKiBEZWZhdWx0IHN0YXRlICovCisjZW5kaWYgLyogSUJNWDI1ICovCisKKyNpZm5kZWYgREVCVUcKKyNkZWZpbmUgZGVibG9nIDAKKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgQ0tfTkFXUyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVnb3RpYXRlIEFib3V0IFdpbmRvdyBTaXplICovCisjaWZkZWYgUkxPR0NPREUKK19QUk9UT1RZUCggaW50IHJsb2dfbmF3cywgKHZvaWQpICk7CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNlbmRpZiAvKiBDS19OQVdTICovCisKKyNpZmRlZiBPUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgdGVybWluYWwgdHlwZSBuYW1lIHN0cmluZyAqLworI2luY2x1ZGUgImNrdXVzci5oIgorI2lmbmRlZiBOVAorI2luY2x1ZGUgPG9zMi5oPgorI3VuZGVmIENPTU1FTlQKKyNlbmRpZiAvKiBOVCAqLworI2luY2x1ZGUgImNrb2Nvbi5oIgorZXh0ZXJuIGludCB0dF90eXBlLCBtYXhfdHQ7CitleHRlcm4gc3RydWN0IHR0X2luZm9fcmVjIHR0X2luZm9bXTsKK2V4dGVybiBjaGFyIHR0bmFtZVtdOworI2Vsc2UKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorI2luY2x1ZGUgImNrdXVzci5oIgorI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBOVAorZXh0ZXJuIGludCB3aW5zb2NrX3ZlcnNpb247CisjZW5kaWYgLyogTlQgKi8KKworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisjaW5jbHVkZSAiY2t1YXRoLmgiCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKworI2luY2x1ZGUgImNrY3NpZy5oIgorCisjaWZuZGVmIE9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIHRpbWVvdXQgbG9uZ2p1bXBzICovCitzdGF0aWMgY2tqbXBidWYgbmpidWY7CisjZW5kaWYgLyogT1MyICovCisKKyNkZWZpbmUgTkFNRUNQWUwgMTAyNCAgICAgICAgICAgICAgICAgICAvKiBMb2NhbCBjb3B5IG9mIGhvc3RuYW1lICovCitjaGFyIG5hbWVjb3B5W05BTUVDUFlMXTsgICAgICAgICAgICAgICAgLyogUmVmZXJlbmNlZCBieSBja2N0ZWwuYyAqLworY2hhciBuYW1lY29weTJbTkFNRUNQWUxdOwkJLyogUmVmZXJlbmNlZCBieSBja2N0ZWwuYyAqLworI2lmbmRlZiBOT0hUVFAKK2NoYXIgaHR0cF9ob3N0X3BvcnRbTkFNRUNQWUxdOyAgICAgICAgICAvKiBvcmlnIGhvc3QvcG9ydCBuZWNlc3NhcnkgZm9yIGh0dHAgKi8KK2NoYXIgaHR0cF9pcFsyMF0gPSB7ICdcMCcgfTsgICAgICAgICAgICAvKiBpcCBhZGRyZXNzIG9mIGhvc3QgKi8KK2NoYXIgaHR0cF9wb3J0ID0gMDsKK2ludCAgaHR0cF9zc2wgPSAwOworY2hhciAqIGh0dHBfYWdlbnQgPSAwOworaW50ICBodHRwZmQgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvY2tldCBmb3IgaHR0cCBjb25uZWN0aW9ucyAqLworaW50ICBodHRwX2NvZGUgPSAwOworI2RlZmluZSBIVFRQQlVGTEVOICAxMDI0CitjaGFyIGh0dHBfcmVwbHlfc3RyW0hUVFBCVUZMRU5dID0gIiI7CisjZW5kaWYgLyogTk9IVFRQICovCisKK2NoYXIgaXBhZGRyWzIwXSA9IHsgJ1wwJyB9OyAgICAgICAgICAgICAvKiBHbG9iYWwgY29weSBvZiBJUCBhZGRyZXNzICovCit1bnNpZ25lZCBsb25nIG15eGlwYWRkciA9IDBMOyAgICAgICAgICAgLyogRGl0dG8gYXMgYSBudW1iZXIgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisKK2NoYXIgKnRjcF9hZGRyZXNzID0gTlVMTDsgICAgICAgICAgICAgICAvKiBQcmVmZXJyZWQgSVAgQWRkcmVzcyAqLworZXh0ZXJuIGNoYXIgdWlkYnVmW107ICAgICAgICAgICAgICAgICAgIC8qIFVzZXIgSUQgYnVmZmVyICovCitleHRlcm4gY2hhciBwd2J1ZltdOyAgICAgICAgICAgICAgICAgICAgLyogUGFzc3dvcmQgYnVmZmVyICovCisKKyNpZm5kZWYgTk9IVFRQCitjaGFyICogdGNwX2h0dHBfcHJveHkgPSBOVUxMOyAgICAgICAgICAgLyogTmFtZVs6cG9ydF0gb2YgaHR0cCBwcm94eSBzZXJ2ZXIgKi8KK2ludCAgICB0Y3BfaHR0cF9wcm94eV9lcnJubyA9IDA7CitjaGFyICogdGNwX2h0dHBfcHJveHlfdXNlciA9IE5VTEw7CitjaGFyICogdGNwX2h0dHBfcHJveHlfcHdkICA9IE5VTEw7CitjaGFyICogdGNwX2h0dHBfcHJveHlfYWdlbnQgPSBOVUxMOworI2RlZmluZSBIVFRQQ1BZTCAxMDI0CitzdGF0aWMgY2hhciBwcm94eWNvcHlbSFRUUENQWUxdOworI2VuZGlmIC8qIE5PSFRUUCAqLworCisjaWZkZWYgT1MyCitleHRlcm4gaW50IHR0X3Jvd3NbXSwgdHRfY29sc1tdOworZXh0ZXJuIGludCB0dF9zdGF0dXNbVk5VTV07CisjZWxzZSAvKiBPUzIgKi8KK2V4dGVybiBpbnQgdHRfcm93cywgdHRfY29sczsgICAgICAgICAgICAvKiBFdmVyeWJvZHkgaGFzIHRoaXMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworZXh0ZXJuIGludCBjbWRfY29scywgY21kX3Jvd3M7CisKKyNpZmRlZiBTVFJFQU1JTkcgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgYmxvY2tpbmcgd3JpdGVzIGZvciBzdHJlYW1pbmcgKi8KK2V4dGVybiBpbnQgc3RyZWFtaW5nOworI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCisjaWZkZWYgTlQKK2V4dGVybiBpbnQgV1NBU2FmZVRvQ2FuY2VsOworaW50IHdpbjk1c2VsZWN0YnVnID0gMDsgICAgICAgICAgICAgICAgIC8qIEZvciBUQ1AvSVAgc3RhY2tzIHdob3NlIHNlbGVjdCgpICovCisvKiBhbHdheXMgZmFpbHMgb24gd3JpdGUgcmVxdWVzdHMgc3VjaCBhcyBDaXNjbyBhbmQgUXVhcnRlcmRlY2sgKi8KKyNkZWZpbmUgc3RyaWNtcCBfc3RyaWNtcAorI2VuZGlmIC8qIE5UICovCisKKyNpZm5kZWYgTk9UQ1BPUFRTCisKKy8qIFNraXAgYWxsIHRoaXMgaWYgTk9UQ1BPUFRTIHNwZWNpZmllZC4gKi8KKworI2lmZGVmIFNPTF9TT0NLRVQKKworI2lmZGVmIFRDUF9OT0RFTEFZCitpbnQgdGNwX25vZGVsYXkgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogTmFnbGUgYWxnb3JpdGhtIFRDUF9OT0RFTEFZICovCisjZW5kaWYgLyogVENQX05PREVMQVkgKi8KKworI2lmZGVmIFNPX0RPTlRST1VURQoraW50IHRjcF9kb250cm91dGUgPSAwOworI2VuZGlmIC8qIFNPX0RPTlRST1VURSAqLworCisjaWZkZWYgU09fTElOR0VSCitpbnQgdGNwX2xpbmdlciAgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogU09fTElOR0VSICovCitpbnQgdGNwX2xpbmdlcl90bW8gPSAwOyAgICAgICAgICAgICAgICAgLyogU09fTElOR0VSIHRpbWVvdXQgKi8KKyNlbmRpZiAvKiBTT19MSU5HRVIgKi8KKworI2lmZGVmIEhQVVggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ1dCB0aGUgZGF0YSBzdHJ1Y3R1cmVzICovCisjaWZuZGVmIEhQVVg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmVlZGVkIGZvciBsaW5nZXIgYXJlIG5vdCAqLworI2lmbmRlZiBIUFVYOSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmluZWQgaW4gSFAtVVggdmVyc2lvbnMgKi8KKyNpZm5kZWYgSFBVWDEwICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmlvciB0byA4LjAwLiAqLworI2lmZGVmIFNPX0xJTkdFUgorI3VuZGVmIFNPX0xJTkdFUgorI2VuZGlmIC8qIFNPX0xJTkdFUiAqLworI2VuZGlmIC8qIEhQVVgxMCAqLworI2VuZGlmIC8qIEhQVVg5ICovCisjZW5kaWYgLyogSFBVWDggKi8KKyNlbmRpZiAvKiBIUFVYICovCisKKyNpZm5kZWYgU09fT09CSU5MSU5FICAgICAgICAgICAgICAgICAgICAvKiBIb3BlZnVsbHkgb25seSBIUC1VWCA3LjAgKi8KKyNkZWZpbmUgU09fT09CSU5MSU5FIDB4MDEwMAorI2VuZGlmIC8qIFNPX09PQklOTElORSAqLworCisjaWZuZGVmIFRDUFNOREJVRlNJWgorI2lmZGVmIFZNUworI2lmZGVmIF9fYWxwaGEKKyNkZWZpbmUgVENQU05EQlVGU0laIDE2Mzg0CisjZW5kaWYgLyogX19hbHBoYSAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFRDUFNOREJVRlNJWiAqLworCisjaWZuZGVmIFRDUFNOREJVRlNJWgorI2RlZmluZSBUQ1BTTkRCVUZTSVogLTEKKyNlbmRpZiAvKiBUQ1BTTkRCVUZTSVogKi8KKworI2lmZGVmIFNPX1NOREJVRgoraW50IHRjcF9zZW5kYnVmID0gVENQU05EQlVGU0laOworI2VuZGlmIC8qIFNPX1NOREJVRiAqLworCisjaWZkZWYgU09fUkNWQlVGCitpbnQgdGNwX3JlY3ZidWYgPSAtMTsKKyNlbmRpZiAvKiBTT19SQ1ZCVUYgKi8KKworI2lmZGVmIFNPX0tFRVBBTElWRQoraW50IHRjcF9rZWVwYWxpdmUgPSAxOworI2VuZGlmIC8qIFNPX0tFRVBBTElWRSAqLworCisjZW5kaWYgLyogU09MX1NPQ0tFVCAqLworI2VuZGlmIC8qIE5PVENQT1BUUyAqLworCisjaWZuZGVmIE5FVENPTk4KKy8qCisgIE5ldHdvcmsgc3VwcG9ydCBub3QgZGVmaW5lZC4KKyAgRHVtbXkgZnVuY3Rpb25zIGhlcmUgaW4gY2FzZSAjaWZkZWYncyBmb3Jnb3R0ZW4gZWxzZXdoZXJlLgorKi8KK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuIG5ldHdvcmsgY29ubmVjdGlvbiAqLworbmV0b3BlbihuYW1lLCBsY2wsIG5ldHQpIGNoYXIgKm5hbWU7IGludCAqbGNsLCBuZXR0OyB7CisgICAgcmV0dXJuKC0xKTsKK30KK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbG9zZSBuZXR3b3JrIGNvbm5lY3Rpb24gKi8KK25ldGNsb3MoKSB7CisgICAgcmV0dXJuKC0xKTsKK30KK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBuZXR3b3JrIGlucHV0IGJ1ZmZlciAqLworbmV0dGNoaygpIHsKKyAgICByZXR1cm4oLTEpOworfQoraW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsdXNoIG5ldHdvcmsgaW5wdXQgYnVmZmVyICovCituZXRmbHVpKCkgeworICAgIHJldHVybigtMSk7Cit9CitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VuZCBuZXR3b3JrIEJSRUFLICovCituZXRicmVhaygpIHsKKyAgICByZXR1cm4oLTEpOworfQoraW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGNoYXJhY3RlciBmcm9tIG5ldHdvcmsgKi8KK25ldGluYyh0aW1vKSBpbnQgdGltbzsgeworICAgIHJldHVybigtMSk7Cit9CitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGNoYXJhY3RlciB0byBuZXR3b3JrICovCisjaWZkZWYgQ0tfQU5TSUMKK25ldHRvYyhDSEFSIGMpCisjZWxzZQorbmV0dG9jKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogbmV0dG9jICovIHsKKyAgICByZXR1cm4oLTEpOworfQoraW50CituZXR0b2wocyxuKSBDSEFSICpzOyBpbnQgbjsgeworICAgIHJldHVybigtMSk7Cit9CisKKyNlbHNlIC8qIE5FVENPTk4gaXMgZGVmaW5lZCAobXVjaCBvZiB0aGlzIG1vZHVsZS4uLikgKi8KKworI2lmZGVmIE5FVExFQlVGCitWT0lECitsZV9pbml0KCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9jYWxFY2hvSW5pdCgpICovCisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IExFQlVGU0laOyBpKyspCisgICAgICBsZV9idWZbaV0gPSAnXDAnOworICAgIGxlX3N0YXJ0ID0gMDsKKyAgICBsZV9lbmQgPSAwOworICAgIGxlX2RhdGEgPSAwOworICAgIHR0X3B1c2hfaW5pdGVkID0gMTsKK30KKworVk9JRAorbGVfY2xlYW4oKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvY2FsRWNob0NsZWFudXAoKSAqLworICAgIGxlX2luaXQoKTsKKyAgICByZXR1cm47Cit9CisKK2ludAorbGVfaW5idWYoKSB7CisgICAgaW50IHJjID0gMDsKKyAgICBpZiAobGVfc3RhcnQgIT0gbGVfZW5kKSB7CisgICAgICAgIHJjID0gKGxlX2VuZCAtCisgICAgICAgICAgICAgIGxlX3N0YXJ0ICsKKyAgICAgICAgICAgICAgTEVCVUZTSVopICUgTEVCVUZTSVo7CisgICAgfQorICAgIHJldHVybihyYyk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitsZV9wdXRjaGFyKENIQVIgY2gpCisjZWxzZQorbGVfcHV0Y2hhcihjaCkgQ0hBUiBjaDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogbGVfcHV0Y2hhciAqLyB7CisgICAgaWYgKChsZV9zdGFydCAtIGxlX2VuZCArIExFQlVGU0laKSVMRUJVRlNJWiA9PSAxKSB7CisgICAgICAgIGRlYnVnKEYxMTAsImxlX3B1dGNoYXIiLCJidWZmZXIgaXMgZnVsbCIsMCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGxlX2J1ZltsZV9lbmQrK10gPSBjaDsKKyAgICBpZiAobGVfZW5kID09IExFQlVGU0laKQorICAgICAgbGVfZW5kID0gMDsKKyAgICBsZV9kYXRhID0gMTsKKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitsZV9wdXRzKENIQVIgKiBzLCBpbnQgbikKKyNlbHNlCitsZV9wdXRzKHMsbikgQ0hBUiAqIHM7IGludCBuOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBsZV9wdXRzICovIHsKKyAgICBpbnQgcmMgPSAwOworICAgIGludCBpID0gMDsKKyAgICBDSEFSICogcCA9IChDSEFSICopImxlX3B1dHMiOworICAgIGhleGR1bXAocCxzLG4pOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICByYyA9IGxlX3B1dGNoYXIoKGNoYXIpc1tpXSk7CisgICAgZGVidWcoRjEwMSwibGVfcHV0cyIsIiIscmMpOworICAgIHJldHVybihyYyk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitsZV9wdXRzdHIoQ0hBUiAqIHMpCisjZWxzZQorbGVfcHV0c3RyKHMpIENIQVIgKiBzOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBsZV9wdXRzICovIHsKKyAgICBDSEFSICogcDsKKyAgICBpbnQgcmMgPSAwOworICAgIHAgPSAoQ0hBUiAqKSJsZV9wdXRzdHIiOworICAgIGhleGR1bXAocCxzLChpbnQpc3RybGVuKChjaGFyICopcykpOworICAgIGZvciAocCA9IHM7ICpwICYmICFyYzsgcCsrKQorICAgICAgcmMgPSBsZV9wdXRjaGFyKCpwKTsKKyAgICByZXR1cm4ocmMpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworbGVfZ2V0Y2hhcihDSEFSICogcGNoKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2xlX2dldGNoYXIocGNoKSBDSEFSICogcGNoOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBsZV9nYXRjaGFyICovIHsKKyAgICBpbnQgcmMgPSAwOworICAgIGlmIChsZV9zdGFydCAhPSBsZV9lbmQpIHsKKyAgICAgICAgKnBjaCA9IGxlX2J1ZltsZV9zdGFydF07CisgICAgICAgIGxlX2J1ZltsZV9zdGFydF0gPSAwOworICAgICAgICBsZV9zdGFydCsrOworCisgICAgICAgIGlmIChsZV9zdGFydCA9PSBMRUJVRlNJWikKKyAgICAgICAgICBsZV9zdGFydCA9IDA7CisKKyAgICAgICAgaWYgKGxlX3N0YXJ0ID09IGxlX2VuZCkgeworICAgICAgICAgICAgbGVfZGF0YSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmMrKzsKKyAgICB9IGVsc2UgeworICAgICAgICAqcGNoID0gMDsKKyAgICB9CisgICAgcmV0dXJuKHJjKTsKK30KKyNlbmRpZiAvKiBORVRMRUJVRiAqLworCisjaWZkZWYgVk1TCisvKgorICBJbiBlZGl0IDE5MCwgd2UgbW92ZWQgdG5faW5pKCkgdG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIG5ldG9wZW4oKS4KKyAgQnV0IHRuX2luaSgpIGNhbGxzIHR0b2woKSwgYW5kIHR0b2woKSBjaGVja3MgdG8gc2VlIGlmIGl0J3MgYSBuZXQKKyAgY29ubmVjdGlvbiwgYnV0IHRoZSBmbGFnIGZvciB0aGF0IGlzbid0IHNldCB1bnRpbCBhZnRlciBuZXRvcGVuKCkKKyAgaXMgZmluaXNoZWQuICBTaW5jZSwgaW4gdGhpcyBtb2R1bGUsIHdlIGFyZSBhbHdheXMgZG9pbmcgbmV0d29yaworICBvdXRwdXQgYW55d2F5LCB3ZSBqdXN0IGNhbGwgbmV0dG9sKCkgZGlyZWN0bHksIGluc3RlYWQgb2YgZ29pbmcgdGhydQorICB0dG9sKCkuICBPbmx5IG5lZWRlZCBmb3IgVk1TLCBzaW5jZSBVTklYLCBBT1MvVlMsIGFuZCBWT1MgY2FuIGhhbmRsZQorICBuZXQgY29ubmVjdGlvbnMganVzdCBsaWtlIHJlZ3VsYXIgY29ubmVjdGlvbnMgaW4gdHRvbCgpLCBhbmQgT1MvMgorICBoYXMgYSBzcGVjaWFsIHJvdXRpbmUgZm9yIHRoaXMuCisqLworI2RlZmluZSB0dG9sIG5ldHRvbAorI2VuZGlmIC8qIFZNUyAqLworCitpbnQgdGNwc3JmZCA9IC0xOworCisjaWZkZWYgQ0tfS0VSQkVST1MKKworY2hhciAqIGtyYjVfZF9wcmluY2lwYWwgPSBOVUxMOyAgICAgICAgIC8qIERlZmF1bHQgcHJpbmNpcGFsICovCitjaGFyICoga3JiNV9kX2luc3RhbmNlID0gTlVMTDsgICAgICAgICAgLyogRGVmYXVsdCBpbnN0YW5jZSAqLworY2hhciAqIGtyYjVfZF9yZWFsbSA9IE5VTEw7ICAgICAgICAgICAgIC8qIERlZmF1bHQgcmVhbG0gKi8KK2NoYXIgKiBrcmI1X2RfY2MgPSBOVUxMOyAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IGNyZWRlbnRpYWxzIGNhY2hlICovCitjaGFyICoga3JiNV9kX3NydiAgID0gTlVMTDsgICAgICAgICAgICAgLyogRGVmYXVsdCBTZXJ2aWNlICovCitpbnQgICAga3JiNV9kX2xpZmV0aW1lID0gNjAwOyAgICAgICAgICAgLyogRGVmYXVsdCBsaWZldGltZSAoMTAgaG91cnMpICovCitpbnQgICAga3JiNV9kX2ZvcndhcmRhYmxlID0gMDsgICAgICAgICAgLyogY3JlZHMgbm90IGZvcndhcmRhYmxlICovCitpbnQgICAga3JiNV9kX3Byb3hpYWJsZSA9IDA7ICAgICAgICAgICAgLyogY3JlZHMgbm90IHByb3hpYWJsZSAqLworaW50ICAgIGtyYjVfZF9yZW5ld2FibGUgPSAwOyAgICAgICAgICAgIC8qIGNyZWRzIG5vdCByZW5ld2FibGUgKDAgbWluKSAqLworaW50ICAgIGtyYjVfYXV0b2dldCA9IDE7ICAgICAgICAgICAgICAgIC8qIEF1dG9nZXQgVEdUcyAqLworaW50ICAgIGtyYjVfYXV0b2RlbCA9IDA7ICAgICAgICAgICAgICAgIC8qIEF1dG8gZGVsZXRlIFRHVHMgKi8KK2ludCAgICBrcmI1X2RfZ2V0azQgPSAwOyAgICAgICAgICAgICAgICAvKiBLNSBLaW5pdCBnZXRzIEs0IFRHVHMgKi8KK2ludCAgICBrcmI1X2NoZWNrYWRkcnMgPSAxOyAgICAgICAgICAgICAvKiBDaGVjayBUR1QgQWRkcnMgKi8KK2ludCAgICBrcmI1X2Rfbm9fYWRkcmVzc2VzID0gMDsgICAgICAgICAvKiBEbyBub3QgaW5jbHVkZSBJUCBBZGRyZXNzZXMgKi8KK2NoYXIgKiBrcmI1X2RfYWRkcnNbS1JCNV9OVU1fT0ZfQUREUlMrMV09e05VTEwsTlVMTH07IC8qIEFkZHJzIHRvIGluY2x1ZGUgKi8KK2ludCAgICBrcmI1X2Vycm5vID0gMDsgICAgICAgICAgICAgICAgICAvKiBMYXN0IEs1IGVycm5vICovCitjaGFyICoga3JiNV9lcnJtc2cgPSBOVUxMOyAgICAgICAgICAgICAgLyogTGFzdCBLNSBlcnJtc2cgKi8KK2NoYXIgKiBrNV9rZXl0YWIgPSBOVUxMOworCitjaGFyICoga3JiNF9kX3ByaW5jaXBhbCA9IE5VTEw7ICAgICAgICAgLyogRGVmYXVsdCBwcmluY2lwYWwgKi8KK2NoYXIgKiBrcmI0X2RfcmVhbG0gPSBOVUxMOyAgICAgICAgICAgICAvKiBEZWZhdWx0IHJlYWxtICovCitjaGFyICoga3JiNF9kX3NydiAgID0gTlVMTDsgICAgICAgICAgICAgLyogRGVmYXVsdCBTZXJ2aWNlICovCitpbnQgICAga3JiNF9kX2xpZmV0aW1lID0gNjAwOyAgICAgICAgICAgLyogRGVmYXVsdCBsaWZldGltZSAoMTAgaG91cnMpICovCitpbnQgICAga3JiNF9kX3ByZWF1dGggPSAxOyAgICAgICAgICAgICAgLyogVXNlIHByZWF1dGggcmVxdWVzdHMgKi8KK2NoYXIgKiBrcmI0X2RfaW5zdGFuY2UgPSBOVUxMOyAgICAgICAgICAvKiBEZWZhdWx0IGluc3RhbmNlICovCitpbnQgICAga3JiNF9hdXRvZ2V0ID0gMTsgICAgICAgICAgICAgICAgLyogQXV0b2dldCBUR1RzICovCitpbnQgICAga3JiNF9hdXRvZGVsID0gMDsgICAgICAgICAgICAgICAgLyogQXV0byBkZWxldGUgVEdUcyAqLworaW50ICAgIGtyYjRfY2hlY2thZGRycyA9IDE7ICAgICAgICAgICAgIC8qIENoZWNrIFRHVCBBZGRycyAqLworY2hhciAqIGs0X2tleXRhYiA9IE5VTEw7CisKK2ludCAgICBrcmI0X2Vycm5vID0gMDsgICAgICAgICAgICAgICAgICAvKiBMYXN0IEs0IGVycm5vICovCitjaGFyICoga3JiNF9lcnJtc2cgPSBOVUxMOyAgICAgICAgICAgICAgLyogTGFzdCBLNCBlcnJtc2cgKi8KKworc3RydWN0IGtyYl9vcF9kYXRhIGtyYl9vcCA9IHsgICAgICAgICAgIC8qIE9wZXJhdGlvbmFsIGRhdGEgc3RydWN0dXJlICovCisgICAgMCwgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKHZlcnNpb24sIGNhY2hlZmlsZSkgKi8KK307CisKK3N0cnVjdCBrcmI0X2luaXRfZGF0YSBrcmI0X2luaXQgPSB7ICAgICAvKiBLZXJiZXJvcyA0IElOSVQgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCit9OworCitzdHJ1Y3Qga3JiNV9pbml0X2RhdGEga3JiNV9pbml0ID0geyAgICAgLyogS2VyYmVyb3MgNSBJTklUIGRhdGEgc3RydWN0dXJlICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgMCwgMCwKKyAgICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0sCisgICAgMAorfTsKKworc3RydWN0IGtyYjVfbGlzdF9jcmVkX2RhdGEga3JiNV9sYyA9IHsgIC8qIExpc3QgQ3JlZGVudGlhbHMgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICAwLCAwLCAwCit9OworCitpbnQga3JiX2FjdGlvbiA9IC0xOyAgICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgYWN0aW9uIHRvIHBlcmZvcm0gKi8KKworI2lmbmRlZiBDS19BVVRIRU5USUNBVElPTgorY2hhciAqCitja19rcmI0X2dldHJlYWxtKCkgeworICAgIHJldHVybigiIik7Cit9CitjaGFyICoKK2NrX2tyYjVfZ2V0cmVhbG0oY2MpIGNoYXIgKiBjYzsgeworICAgIHJldHVybigiIik7Cit9CitjaGFyICoKK2NrX2tyYjRfZ2V0cHJpbmNpcGFsKCkgeworICAgIHJldHVybigiIik7Cit9CitjaGFyICoKK2NrX2tyYjVfZ2V0cHJpbmNpcGFsKGNjKSBjaGFyICogY2M7IHsKKyAgICByZXR1cm4oIiIpOworfQorI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisKKy8qICBJIE4gSSBfIEsgRSBSIEIgIC0tICBJbml0aWFsaXplIEtlcmJlcm9zIGRhdGEgICovCisKK1ZPSUQKK2luaV9rZXJiKCkgeworICAgIGludCBpOworCisgICAga3JiX2FjdGlvbiA9IC0xOyAgICAgICAgICAgICAgICAgICAgLyogTm8gYWN0aW9uIHNwZWNpZmllZCAqLworCisgICAga3JiX29wLnZlcnNpb24gPSAwOyAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgdmVyc2lvbiAobm9uZSkgKi8KKyAgICBrcmJfb3AuY2FjaGUgPSBOVUxMOyAgICAgICAgICAgICAgICAvKiBDYWNoZSBmaWxlIChub25lKSAqLworCisvKiBLZXJiZXJvcyA1ICovCisKKyAgICBrcmI1X2luaXQuZm9yd2FyZGFibGUgPSBrcmI1X2RfZm9yd2FyZGFibGU7IC8qIEluaXQgc3dpdGNoIHZhbHVlcy4uLiAqLworICAgIGtyYjVfaW5pdC5wcm94aWFibGUgICA9IGtyYjVfZF9wcm94aWFibGU7CisgICAga3JiNV9pbml0LmxpZmV0aW1lICAgID0ga3JiNV9kX2xpZmV0aW1lOworICAgIGtyYjVfaW5pdC5yZW5ldyAgICAgICA9IDA7CisgICAga3JiNV9pbml0LnJlbmV3YWJsZSAgID0ga3JiNV9kX3JlbmV3YWJsZTsKKyAgICBrcmI1X2luaXQudmFsaWRhdGUgICAgPSAwOworICAgIGtyYjVfaW5pdC5ub19hZGRyZXNzZXMgPSBrcmI1X2Rfbm9fYWRkcmVzc2VzOworICAgIGtyYjVfaW5pdC5nZXRrNCAgICAgICA9IGtyYjVfZF9nZXRrNDsKKyAgICBpZiAoa3JiNV9pbml0LnBvc3RkYXRlKSB7CisgICAgICAgIGZyZWUoa3JiNV9pbml0LnBvc3RkYXRlKTsKKyAgICAgICAga3JiNV9pbml0LnBvc3RkYXRlID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGtyYjVfaW5pdC5zZXJ2aWNlKSB7CisgICAgICAgIGZyZWUoa3JiNV9pbml0LnNlcnZpY2UpOworICAgICAgICBrcmI1X2luaXQuc2VydmljZSA9IE5VTEw7CisgICAgfQorICAgIGlmICgha3JiNV9kX2NjIHx8ICFrcmI1X2RfY2NbMF0pIHsgIC8qIFNldCBkZWZhdWx0IGNhY2hlICovCisgICAgICAgIGNoYXIgKiBwOworICAgICAgICBwID0gY2tfa3JiNV9nZXRfY2NfbmFtZSgpOworICAgICAgICBtYWtlc3RyKCZrcmI1X2RfY2MsKHAgJiYgcFswXSkgPyBwIDogTlVMTCk7CisgICAgfQorICAgIGlmICgha3JiNV9kX3JlYWxtIHx8ICFrcmI1X2RfcmVhbG1bMF0pIHsgLyogU2V0IGRlZmF1bHQgcmVhbG0gKi8KKyAgICAgICAgY2hhciAqIHA7CisgICAgICAgIHAgPSBja19rcmI1X2dldHJlYWxtKGtyYjVfZF9jYyk7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZF9yZWFsbSwocCAmJiBwWzBdKSA/IHAgOiBOVUxMKTsKKyAgICB9CisgICAgbWFrZXN0cigma3JiNV9pbml0Lmluc3RhbmNlLGtyYjVfZF9pbnN0YW5jZSk7CisgICAgbWFrZXN0cigma3JiNV9pbml0LnJlYWxtLGtyYjVfZF9yZWFsbSk7IC8qIFNldCByZWFsbSBmcm9tIGRlZmF1bHQgKi8KKyAgICBpZiAoa3JiNV9pbml0LnBhc3N3b3JkKSB7CisgICAgICAgIG1lbXNldChrcmI1X2luaXQucGFzc3dvcmQsMHhGRixzdHJsZW4oa3JiNV9pbml0LnBhc3N3b3JkKSk7CisgICAgICAgIGZyZWUoa3JiNV9pbml0LnBhc3N3b3JkKTsKKyAgICAgICAga3JiNV9pbml0LnBhc3N3b3JkID0gTlVMTDsKKyAgICB9CisgICAgaWYgKCFrcmI1X2RfcHJpbmNpcGFsKSB7ICAgICAgICAgICAgLyogRGVmYXVsdCBwcmluY2lwYWwgKi8KKyAgICAgICAgLyogYSBOdWxsIHByaW5jaXBhbCBpbmRpY2F0ZXMgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkICovCisgICAgICAgIGNoYXIgKiBwID0gY2tfa3JiNV9nZXRwcmluY2lwYWwoa3JiNV9kX2NjKTsKKyAgICAgICAgaWYgKCFwIHx8ICEoKnApKQorICAgICAgICAgIHAgPSAoY2hhciAqKXVpZGJ1ZjsgICAgICAgICAgIC8qIFByaW5jaXBhbCA9IHVzZXIgKi8KKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZrcmI1X2RfcHJpbmNpcGFsLChwICYmIHBbMF0pID8gcCA6IE5VTEwpOworICAgIH0KKyAgICBtYWtlc3RyKCZrcmI1X2luaXQucHJpbmNpcGFsLGtyYjVfZF9wcmluY2lwYWwpOworICAgIGZvciAoaSA9IDA7IGkgPD0gS1JCNV9OVU1fT0ZfQUREUlM7IGkrKykgeworICAgICAgICBpZiAoa3JiNV9pbml0LmFkZHJzW2ldKQorICAgICAgICAgIGZyZWUoa3JiNV9pbml0LmFkZHJzW2ldKTsKKyAgICAgICAga3JiNV9pbml0LmFkZHJzW2ldID0gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8PSBLUkI1X05VTV9PRl9BRERSUyAmJiBrcmI1X2RfYWRkcnNbaV07IGkrKykgeworICAgICAgICBtYWtlc3RyKCZrcmI1X2luaXQuYWRkcnNbaV0sa3JiNV9kX2FkZHJzW2ldKTsKKyAgICB9CisKKyAgICAvKiBLZXJiZXJvcyA0ICovCisKKyAgICBrcmI0X2luaXQubGlmZXRpbWUgPSBrcmI0X2RfbGlmZXRpbWU7CisgICAga3JiNF9pbml0LnByZWF1dGggID0ga3JiNF9kX3ByZWF1dGg7CisgICAgbWFrZXN0cigma3JiNF9pbml0Lmluc3RhbmNlLGtyYjRfZF9pbnN0YW5jZSk7CisgICAgaWYgKCFrcmI0X2RfcmVhbG0gfHwgIWtyYjRfZF9yZWFsbVswXSkgey8qIFNldCBkZWZhdWx0IHJlYWxtICovCisgICAgICAgIGNoYXIgKiBwOworICAgICAgICBwID0gY2tfa3JiNF9nZXRyZWFsbSgpOworICAgICAgICAgICAgICAgIG1ha2VzdHIoJmtyYjRfZF9yZWFsbSwocCAmJiBwWzBdKSA/IHAgOiBOVUxMKTsKKyAgICB9CisgICAgbWFrZXN0cigma3JiNF9pbml0LnJlYWxtLGtyYjRfZF9yZWFsbSk7CisgICAgaWYgKGtyYjRfaW5pdC5wYXNzd29yZCkgeworICAgICAgICBtZW1zZXQoa3JiNF9pbml0LnBhc3N3b3JkLDB4RkYsc3RybGVuKGtyYjRfaW5pdC5wYXNzd29yZCkpOworICAgICAgICBmcmVlKGtyYjRfaW5pdC5wYXNzd29yZCk7CisgICAgICAgIGtyYjRfaW5pdC5wYXNzd29yZCA9IE5VTEw7CisgICAgfQorICAgIGlmICgha3JiNF9kX3ByaW5jaXBhbCkgeyAgICAgICAgICAgIC8qIERlZmF1bHQgcHJpbmNpcGFsICovCisgICAgICAgIC8qIGEgTnVsbCBwcmluY2lwYWwgaW5kaWNhdGVzIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCAqLworICAgICAgICBjaGFyICogcCA9IGNrX2tyYjRfZ2V0cHJpbmNpcGFsKCk7CisgICAgICAgIGlmICghcCB8fCAhKCpwKSkKKyAgICAgICAgICBwID0gKGNoYXIgKil1aWRidWY7ICAgICAgICAgICAvKiBQcmluY2lwYWwgPSB1c2VyICovCisgICAgICAgIG1ha2VzdHIoJihrcmI0X2RfcHJpbmNpcGFsKSwocCAmJiBwWzBdKSA/IHAgOiBOVUxMKTsKKyAgICB9CisgICAgbWFrZXN0cigmKGtyYjRfaW5pdC5wcmluY2lwYWwpLGtyYjRfZF9wcmluY2lwYWwpOworfQorCisvKiAgRCBPIEEgVSBUIEggIC0tICBBVVRIRU5USUNBVEUgYWN0aW9uIHJvdXRpbmUgICovCisKK2ludAorZG9hdXRoKGN4KSBpbnQgY3g7IHsgICAgICAgICAgICAgICAgICAgIC8qIEFVVEhFTlRJQ0FURSBhY3Rpb24gcm91dGluZSAqLworICAgIGludCByYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBjb2RlICovCisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorI2lmZGVmIE9TMgorICAgIGlmICghY2tfc2VjdXJpdHlfbG9hZGRsbCgpKSAgICAgICAgIC8qIExvYWQgdmFyaW91cyBETExzICovCisgICAgICByZXR1cm4ocmMpOworI2VuZGlmIC8qIE9TMiAqLworICAgIGlmIChrcmJfb3AudmVyc2lvbiA9PSA0KSB7ICAgICAgICAgIC8qIFZlcnNpb24gPSA0ICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICBzaG9fYXV0aChBVVRIVFlQRV9LRVJCRVJPU19WNCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBpZiAoIWNrX2tyYjRfaXNfaW5zdGFsbGVkKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiP0tlcmJlcm9zIDQgaXMgbm90IGluc3RhbGxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChrcmJfYWN0aW9uKSB7ICAgICAgICAgICAvKiBQZXJmb3JtIFY0IGZ1bmN0aW9ucyAqLworICAgICAgICAgIGNhc2UgS1JCX0FfSU46ICAgICAgICAgICAgICAgIC8qIElOSVQgKi8KKyAgICAgICAgICAgIHJjIHw9ICEoY2tfa3JiNF9pbml0VEdUKCZrcmJfb3AsJmtyYjRfaW5pdCkgPCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgS1JCX0FfREU6ICAgICAgICAgICAgICAgIC8qIERFU1RST1kgKi8KKyAgICAgICAgICAgIHJjIHw9ICEoY2tfa3JiNF9kZXN0cm95KCZrcmJfb3ApIDwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEtSQl9BX0xDOiAgICAgICAgICAgICAgICAvKiBMSVNULUNSRURFTlRJQUxTICovCisgICAgICAgICAgICByYyB8PSAhKGNrX2tyYjRfbGlzdF9jcmVkcygma3JiX29wKSA8IDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGtyYl9vcC52ZXJzaW9uID09IDUpIHsgICAgICAgICAgLyogVjUgZnVuY3Rpb25zICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICBzaG9fYXV0aChBVVRIVFlQRV9LRVJCRVJPU19WNSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBpZiAoIWNrX2tyYjVfaXNfaW5zdGFsbGVkKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiP0tlcmJlcm9zIDUgaXMgbm90IGluc3RhbGxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChrcmJfYWN0aW9uKSB7CisgICAgICAgICAgY2FzZSBLUkJfQV9JTjogICAgICAgICAgICAgICAgLyogSU5JVCAqLworICAgICAgICAgICAgcmMgfD0gIShja19rcmI1X2luaXRUR1QoJmtyYl9vcCwma3JiNV9pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfaW5pdC5nZXRrNCA/ICZrcmI0X2luaXQgOiAwKSA8IDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBLUkJfQV9ERTogICAgICAgICAgICAgICAgLyogREVTVFJPWSAqLworICAgICAgICAgICAgcmMgfD0gIShja19rcmI1X2Rlc3Ryb3koJmtyYl9vcCkgPCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgS1JCX0FfTEM6ICAgICAgICAgICAgICAgIC8qIExJU1QtQ1JFREVOVElBTFMgKi8KKyAgICAgICAgICAgIGlmIChrcmJfb3AudmVyc2lvbiA9PSAwKQorICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICByYyB8PSAhKGNrX2tyYjVfbGlzdF9jcmVkcygma3JiX29wLCZrcmI1X2xjKSA8IDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorI2lmbmRlZiBOT0lDUAorI2lmbmRlZiBOT1NIT1cKKyAgICByYyA9IHNob19hdXRoKDApOyAgICAgICAgICAgICAgICAgICAvKiBTaG93IGFsbCAqLworI2VuZGlmIC8qIE5PU0hPVyAqLworI2VuZGlmIC8qIE5PSUNQICovCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyAgICByZXR1cm4ocmMpOworfQorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKyNpZmRlZiBUQ1BTT0NLRVQKKyNpZm5kZWYgT1MyCisjaWZuZGVmIE5PTElTVEVOICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGluY29taW5nIGNvbm5lY3Rpb25zICovCisKKyNpZm5kZWYgSU5BRERSX0FOWQorI2RlZmluZSBJTkFERFJfQU5ZIDAKKyNlbmRpZiAvKiBJTkFERFJfQU5ZICovCisKK19QUk9UT1RZUCggaW50IHR0YnVmciwgKCBWT0lEICkgKTsKK19QUk9UT1RZUCggaW50IHRjcHNydl9vcGVuLCAoY2hhciAqLCBpbnQgKiwgaW50LCBpbnQgKSApOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdGNwc3J2X3BvcnQgPSAwOworCisjZW5kaWYgLyogTk9MSVNURU4gKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworc3RhdGljIGNoYXIgc3ZjYnVmWzgwXTsgICAgICAgICAgICAgICAgIC8qIFRDUCBzZXJ2aWNlIHN0cmluZyAqLworc3RhdGljIGludCBzdmNudW0gPSAwOyAgICAgICAgICAgICAgICAgIC8qIFRDUCBwb3J0IG51bWJlciAqLworCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKy8qCisgIFRDUElQTElCIG1lYW5zIHVzZSBzZXBhcmF0ZSBzb2NrZXQgY2FsbHMgZm9yIGkvbywgd2hpbGUgb24gVU5JWCB0aGUKKyAgbm9ybWFsIGZpbGUgc3lzdGVtIGNhbGxzIGFyZSB1c2VkIGZvciBUQ1AvSVAgc29ja2V0cyB0b28uCisgIE1lYW5zICJERUNfVENQSVAgb3IgTVVMVElORVQgb3IgV0lOVENQIG9yIE9TMiBvciBCRUJPWCIgKHNlZSBja2NuZXQuaCksCisqLworCisjaWZkZWYgVENQSVBMSUIKKworLyogRm9yIGJ1ZmZlcmVkIG5ldHdvcmsgcmVhZHMuLi4gKi8KKy8qCisgIElmIHRoZSBidWZmZXJpbmcgY29kZSBpcyB3cml0dGVuIHJpZ2h0LCBpdCBzaG91bGRuJ3QgbWF0dGVyCisgIGhvdyBsb25nIHRoaXMgYnVmZmVyIGlzLgorKi8KKyNpZmRlZiBPUzIKKyNpZmRlZiBOVAorI2RlZmluZSBUVElCVUZMIDY0MjQwICAgICAgICAgICAgICAgICAgIC8qIDQ0ICogMTQ2MCAoTVNTKSAqLworI2Vsc2UKKyNkZWZpbmUgVFRJQlVGTCAzMjEyMCAgICAgICAgICAgICAgICAgICAvKiAyMiAqIDE0NjAgKE1TUykgKi8KKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UgLyogT1MyICovCisjZGVmaW5lIFRUSUJVRkwgODE5MSAgICAgICAgICAgICAgICAgICAgLyogTGV0J3MgdXNlIDhLLiAqLworI2VuZGlmIC8qIE9TMiAqLworCitDSEFSIHR0aWJ1ZltUVElCVUZMKzFdOworCisvKgorICBzZWxlY3QoKSBpcyB1c2VkIGluIHByZWZlcmVuY2UgdG8gYWxhcm0oKS9zaWduYWwoKSwgYnV0IGRpZmZlcmVudCBzeXN0ZW1zCisgIHVzZSBkaWZmZXJlbnQgZm9ybXMgb2Ygc2VsZWN0KCkuLi4KKyovCisjaWZuZGVmIE5PU0VMRUNUICAgICAgICAgLyogT3B0aW9uIHRvIG92ZXJyaWRlIEJTRFNFTEVDVCAqLworI2lmZGVmIEJFTExWMTAKKy8qCisgIE5vdGU6IEFsdGhvdWdoIEJFTExWMTAgZG9lcyBoYXZlIFRDUC9JUCBzdXBwb3J0LCBhbmQgZG9lcyB1c2UgdGhlIHVuaXF1ZQorICBmb3JtIG9mIHNlbGVjdCgpIHRoYXQgaXMgZXZpZGVudCBpbiB0aGlzIG1vZHVsZSAoYW5kIGluIGNrdXRpby5jKSwgaXQgZG9lcworICBub3QgaGF2ZSBhIHNvY2tldHMgbGlicmFyeSBhbmQgc28gd2UgY2FuJ3QgYnVpbGQgS2VybWl0IFRDUC9JUCBzdXBwb3J0IGZvcgorICBpdC4gIEZvciB0aGlzLCBzb21lYm9keSB3b3VsZCBoYXZlIHRvIHdyaXRlIFRDUC9JUCBzdHJlYW1zIGNvZGUuCisqLworI2RlZmluZSBCRUxMU0VMRUNUCisjaWZuZGVmIEZEX1NFVFNJWkUKKyNkZWZpbmUgRkRfU0VUU0laRSAxMjgKKyNlbmRpZiAvKiBGRF9TRVRTSVpFICovCisjZWxzZQorI2lmZGVmIFdJTlRDUCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZNUyB3aXRoIFdvbGxvbmdvbmcgV0lOL1RDUCAqLworI2lmbmRlZiBPTERfVFdHICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRXRyAzLjIgaGFzIG9ubHkgc2VsZWN0KHJlYWQpICovCisjZGVmaW5lIEJTRFNFTEVDVAorI2VuZGlmIC8qIE9MRF9UV0cgKi8KKyNlbHNlCisjaWZkZWYgQ01VX1RDUElQICAgICAgICAgICAgICAgICAgICAgICAgLyogTElCQ01VIGNhbiBkbyBzZWxlY3QgKi8KKyNkZWZpbmUgQlNEU0VMRUNUCisjZWxzZQorI2lmZGVmIERFQ19UQ1BJUAorI2RlZmluZSBCU0RTRUxFQ1QKKyNlbHNlCisjaWZkZWYgT1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT1MvMiB3aXRoIFRDUC9JUCAqLworI2lmZGVmIE5UCisjZGVmaW5lIEJTRFNFTEVDVAorI2Vsc2UgLyogTlQgKi8KKyNkZWZpbmUgSUJNU0VMRUNUCisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBERUNfVENQSVAgKi8KKyNlbmRpZiAvKiBDTVVfVENQSVAgKi8KKyNlbmRpZiAvKiBXSU5UQ1AgKi8KKyNlbmRpZiAvKiBCRUxMVjEwICovCisjZW5kaWYgLyogTk9TRUxFQ1QgKi8KKy8qCisgIE90aGVycyAoVEdWLCBUQ1B3YXJlLCAuLi4pIHVzZSBhbGFybSgpL3NpZ25hbCgpLiAgVGhlIEJTRFNFTEVDVCBjYXNlIGRvZXMgbm90CisgIGNvbXBpbGUgYXQgYWxsOyB0aGUgSUJNU0VMRUNUIGNhc2UgY29tcGlsZXMgYW5kIGxpbmtzIGJ1dCBjcmFzaGVzIGF0IHJ1bnRpbWUuCisgIE5PVEU6IElmIGFueSBvZiB0aGVzZSBjYW4gYmUgY29udmVydGVkIHRvIHNlbGVjdCgpLCB0aGV5IHNob3VsZCBiZSBmb3IgdHdvCisgIHJlYXNvbnM6ICgxKSBJdCdzIGEgbG90IGZhc3RlcjsgKDIpIGNlcnRhaW4gc29ja2V0cyBsaWJyYXJpZXMgZG8gbm90IGxpa2UKKyAgdGhlaXIgc29ja2V0X3JlYWQoKSBjYWxscyB0byBiZSBpbnRlcnJ1cHRlZDsgc3Vic2VxdWVudCBzb2NrZXRfcmVhZCgpJ3MgdGVuZAorICB0byBmYWlsIHdpdGggRUJVU1kuICBUaGlzIGhhcHBlbmVkIGluIHRoZSBVQ1ggY2FzZSBiZWZvcmUgaXQgd2FzIGNvbnZlcnRlZAorICB0byB1c2Ugc2VsZWN0KCkuCisqLworI2lmbmRlZiBPUzIKKyNpZm5kZWYgVk1TCitzdGF0aWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlc2UgYXJlIHVzZWQgaW4gQ0tWVElPLkMgKi8KKyNlbmRpZiAvKiBWTVMgKi8gICAgICAgICAgICAgICAgICAgICAgICAvKiBBbmQgaW4gQ0tPTkVULkMgICAgICAgICAgICAqLworI2VuZGlmIC8qIE9TMiAqLworaW50CisgIHR0aWJwID0gMCwKKyAgdHRpYm4gPSAwOworLyoKKyAgUmVhZCBieXRlcyBmcm9tIG5ldHdvcmsgaW50byBpbnRlcm5hbCBidWZmZXIgdHRpYnVmW10uCisgIFRvIGJlIGNhbGxlZCB3aGVuIGlucHV0IGJ1ZmZlciBpcyBlbXB0eSwgaS5lLiB3aGVuIHR0aWJuID09IDAuCisKKyAgT3RoZXIgbmV0d29yayByZWFkaW5nIHJvdXRpbmVzLCBsaWtlIHR0aW5jLCB0dGlubCwgdHR4aW4sIHNob3VsZCBjaGVjayB0aGUKKyAgaW50ZXJuYWwgYnVmZmVyIGZpcnN0LCBhbmQgY2FsbCB0aGlzIHJvdXRpbmUgZm9yIGEgcmVmaWxsIGlmIG5lY2Vzc2FyeS4KKworICBSZXR1cm5zIC0xIG9uIGVycm9yLCAwIGlmIG5vdGhpbmcgaGFwcGVucy4gIFdoZW4gZGF0YSBpcyByZWFkIHN1Y2Nlc3NmdWxseSwKKyAgcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgYW5kIHNldHMgZ2xvYmFsIHR0aWJuIHRvIHRoYXQgbnVtYmVyIGFuZAorICB0dGlicCAodGhlIGJ1ZmZlciBwb2ludGVyKSB0byB6ZXJvLgorKi8KK19QUk9UT1RZUCggaW50IHR0YnVmciwgKCBWT0lEICkgKTsKK2ludAordHRidWZyKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRUIEJ1ZmZlciBSZWFkICovCisgICAgaW50IGNvdW50OworCisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCKSAgICAgICAgICAgICAgLyogRmlyc3QgbWFrZSBzdXJlIGN1cnJlbnQgbmV0IGlzICovCisgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAgICAgICAgICAgLyogVENQL0lQOyBpZiBub3QsIGRvIG5vdGhpbmcuICovCisKKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VENQSVBNdXRleChTRU1fSU5ERUZJTklURV9XQUlUKTsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIGlmICh0dGlibiA+IDApIHsgICAgICAgICAgICAgICAgICAgIC8qIE91ciBpbnRlcm5hbCBidWZmZXIgaXMgbm90IGVtcHR5LCAqLworI2lmZGVmIE9TMgorICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICByZXR1cm4odHRpYm4pOyAgICAgICAgICAgICAgICAgIC8qIHNvIGtlZXAgdXNpbmcgaXQuICovCisgICAgfQorCisgICAgaWYgKHR0eWZkID09IC0xKSB7ICAgICAgICAgICAgICAgICAgLyogTm8gY29ubmVjdGlvbiwgZXJyb3IgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9CisKKyAgICB0dGlicCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbHNlIHJlc2V0IHBvaW50ZXIgdG8gYmVnaW5uaW5nICovCisKKyNpZmRlZiBXSU5UQ1AKKyAgICBjb3VudCA9IDUxMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIHdvcmtzIGZvciBXSU4vVENQICovCisjZWxzZQorI2lmZGVmIERFQ19UQ1BJUAorICAgIGNvdW50ID0gNTEyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVDWCAqLworI2Vsc2UKKyNpZmRlZiBPUzIKKyAgICBjb3VudCA9IFRUSUJVRkw7CisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTXVsdGluZXQsIGV0Yy4gKi8KKyAgICBjb3VudCA9IHR0Y2hrKCk7ICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBuZXR3b3JrIGlucHV0IGJ1ZmZlciwgKi8KKyAgICBpZiAodHRpYm4gPiAwKSB7ICAgICAgICAgICAgICAgICAgICAvKiB3aGljaCBjYW4gcHV0IGEgY2hhciB0aGVyZSEgKi8KKyAgICAgICAgZGVidWcoRjExMSwidHRidWZyIiwidHRjaGsoKSByZXR1cm5zIixjb3VudCk7CisjaWZkZWYgT1MyCisgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHJldHVybih0dGlibik7CisgICAgfQorICAgIGlmIChjb3VudCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIGVycm9yIC0gY29ubmVjdGlvbiBjbG9zZWQgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY291bnQgPiBUVElCVUZMKSAgICAgICAgICAgLyogVG9vIG1hbnkgdG8gcmVhZCAqLworICAgICAgY291bnQgPSBUVElCVUZMOworICAgIGVsc2UgaWYgKGNvdW50ID09IDApICAgICAgICAgICAgICAgIC8qIE5vbmUsIHNvIGZvcmNlIGJsb2NraW5nIHJlYWQgKi8KKyAgICAgIGNvdW50ID0gMTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBERUNfVENQSVAgKi8KKyNlbmRpZiAvKiBXSU5UQ1AgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dGJ1ZnIgY291bnQgMSIsIiIsY291bnQpOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKHNzbF9hY3RpdmVfZmxhZyB8fCB0bHNfYWN0aXZlX2ZsYWcpIHsKKyAgICAgICAgaW50IGVycm9yOworICAgICAgc3NsX3JlYWQ6CisgICAgICAgIGlmIChzc2xfYWN0aXZlX2ZsYWcpCisgICAgICAgICAgY291bnQgPSBTU0xfcmVhZChzc2xfY29uLCB0dGlidWYsIGNvdW50KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvdW50ID0gU1NMX3JlYWQodGxzX2NvbiwgdHRpYnVmLCBjb3VudCk7CisgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfYWN0aXZlX2ZsYWc/c3NsX2Nvbjp0bHNfY29uLGNvdW50KTsKKyAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX05PTkU6CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ0dGJ1ZnIgU1NMX0VSUk9SX05PTkUiLCJjb3VudCIsY291bnQpOworICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHR0aWJwID0gMDsgICAgICAgICAgICAgIC8qIFJlc2V0IGJ1ZmZlciBwb2ludGVyLiAqLworICAgICAgICAgICAgICAgIHR0aWJuID0gY291bnQ7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4odHRpYm4pOyAgICAgICAgICAvKiBSZXR1cm4gYnVmZmVyIGNvdW50LiAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IDApIHsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5ldGNsb3MoKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsInR0YnVmciBTU0xfRVJST1JfV0FOVF9XUklURSIsIiIsMCk7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsInR0YnVmciBTU0xfRVJST1JfV0FOVF9SRUFEIiwiIiwwKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICAgIGlmICggY291bnQgPT0gMCApIHsgLyogRU9GICovCisgICAgICAgICAgICAgICAgICBuZXRjbG9zKCk7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGludCByYyA9IC0xOworI2lmZGVmIE5UCisgICAgICAgICAgICAgICAgICBpbnQgZ2xlID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ0dGJ1ZnIgU1NMX0VSUk9SX1NZU0NBTEwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRMYXN0RXJyb3IoKSIsZ2xlKTsKKyAgICAgICAgICAgICAgICAgIHJjID0gb3Myc29ja2V0ZXJyb3IoZ2xlKTsKKyAgICAgICAgICAgICAgICAgIGlmIChyYyA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICByYyA9IC0yOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHJjID09IC0yICkKKyAgICAgICAgICAgICAgICAgICAgICByYyA9IC0xOworI2VuZGlmIC8qIE5UICovCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgcmV0dXJuKHJjKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ0dGJ1ZnIgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVAiLCIiLDApOworICAgICAgICAgICAgbmV0Y2xvcygpOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TU0w6CisgICAgICAgICAgICAgIGlmIChiaW9fZXJyIT1OVUxMKSB7CisgICAgICAgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgc3NsX2VycltdOworICAgICAgICAgICAgICAgICAgQklPX3ByaW50ZihiaW9fZXJyLCJ0dGJ1ZnIgU1NMX0VSUk9SX1NTTFxuIik7CisgICAgICAgICAgICAgICAgICBFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworICAgICAgICAgICAgICAgICAgbGVuID0gQklPX3JlYWQoYmlvX2Vycixzc2xfZXJyLFNTTF9FUlJfQkZTWik7CisgICAgICAgICAgICAgICAgICBzc2xfZXJyW2xlbiA8IFNTTF9FUlJfQkZTWiA/IGxlbiA6IFNTTF9FUlJfQkZTWl0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwidHRidWZyIFNTTF9FUlJPUl9TU0wiLHNzbF9lcnIsMCk7CisgICAgICAgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKHNzbF9lcnIpOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNzbF9kZWJ1Z19mbGFnKSB7CisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ0dGJ1ZnIgU1NMX0VSUk9SX1NTTCIsIiIsMCk7CisgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJ0dGJ1ZnIgU1NMX0VSUk9SX1NTTFxuIik7CisgICAgICAgICAgICAgICAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICAgICAgICAgIH0KKyNpZmRlZiBDT01NRU5UCisJICAgICAgbmV0Y2xvcygpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ0dGJ1ZnIgU1NMX0VSUk9SX1pFUk9fUkVUVVJOIiwiIiwwKTsKKyAgICAgICAgICAgIG5ldGNsb3MoKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgZGVidWcoRjEwMCwidHRidWZyIFNTTF9FUlJPUl8/Pz8/PyIsIiIsMCk7CisgICAgICAgICAgICAgIG5ldGNsb3MoKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisjaWZkZWYgQ09NTUVOVAorLyoKKyBUaGlzIGlzIGZvciBub25ibG9ja2luZyByZWFkcywgd2hpY2ggd2UgZG9uJ3QgZG8gYW55IG1vcmUuICBUaGlzIGNvZGUgZGlkbid0Cisgd29yayBhbnl3YXksIGluIHRoZSBzZW5zZSB0aGF0IGEgYnJva2VuIGNvbm5lY3Rpb24gd2FzIG5ldmVyIHNlbnNlZC4KKyovCisgICAgaWYgKChjb3VudCA9IHNvY2tldF9yZWFkKHR0eWZkLCZ0dGlidWZbdHRpYnArdHRpYm5dLGNvdW50KSkgPCAxKSB7CisgICAgICAgIGlmIChjb3VudCA9PSAtMSAmJiBzb2NrZXRfZXJybm8gPT0gRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsInR0YnVmciBmaW5kcyBub3RoaW5nIiwiIiwwKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ0dGJ1ZnIgc29ja2V0X3JlYWQgZXJyb3IiLCIiLHNvY2tldF9lcnJubyk7CisjaWZkZWYgT1MyCisgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIGRlYnVnKEYxMDAsInR0YnVmciBzb2NrZXQgZW9mIiwiIiwwKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisjZWxzZSAvKiBDT01NRU5UICovCisKKy8qIFRoaXMgaXMgZm9yIGJsb2NraW5nIHJlYWRzICovCisKKyNpZm5kZWYgVk1TCisjaWZkZWYgU09fT09CSU5MSU5FCisgICAgeworICAgICAgICBpbnQgb3V0b2ZiYW5kID0gMDsKKyNpZmRlZiBCRUxMU0VMRUNUCisgICAgICAgIGlmIChzZWxlY3QoMTI4LCBOVUxMLCBOVUxMLCBlZmRzLCAwKSA+IDAgJiYgRkRfSVNTRVQodHR5ZmQsIGVmZHMpKQorICAgICAgICAgIG91dG9mYmFuZCA9IDE7CisjZWxzZQorI2lmZGVmIEJTRFNFTEVDVAorICAgICAgICBmZF9zZXQgZWZkczsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgICAgIEZEX1pFUk8oJmVmZHMpOworICAgICAgICBGRF9TRVQodHR5ZmQsICZlZmRzKTsKKyAgICAgICAgdHYudHZfc2VjICA9IHR2LnR2X3VzZWMgPSAwTDsKKyAgICAgICAgZGVidWcoRjEwMCwiT3V0LW9mLUJhbmQgQlNEU0VMRUNUIiwiIiwwKTsKKyNpZmRlZiBOVAorICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAxOworI2VuZGlmIC8qIE5UICovCisgICAgICAgIGlmIChzZWxlY3QoRkRfU0VUU0laRSwgTlVMTCwgTlVMTCwgJmVmZHMsICZ0dikgPiAwICYmCisgICAgICAgICAgICBGRF9JU1NFVCh0dHlmZCwgJmVmZHMpKQorICAgICAgICAgIG91dG9mYmFuZCA9IDE7CisjaWZkZWYgTlQKKyAgICAgICAgV1NBU2FmZVRvQ2FuY2VsID0gMDsKKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UgLyogIUJTRFNFTEVDVCAqLworI2lmZGVmIElCTVNFTEVDVAorLyogSXMgdXNlZCBieSBPUy8yIC4uLiAqLworLyogLi4uIGFuZCBpdCBjYW1lIGluIGhhbmR5ISAgRm9yIG91ciBUQ1AvSVAgbGF5ZXIsIGl0IGF2b2lkcyBhbGwgdGhlIGZkX3NldCAqLworLyogYW5kIHRpbWV2YWwgc3R1ZmYgc2luY2UgdGhpcyBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSBpdCBpcyB1c2VkLiAqLworICAgICAgICBpbnQgc29ja2V0ID0gdHR5ZmQ7CisgICAgICAgIGRlYnVnKEYxMDAsIk91dC1vZi1CYW5kIElCTVNFTEVDVCIsIiIsMCk7CisgICAgICAgIGlmICgoc2VsZWN0KCZzb2NrZXQsIDAsIDAsIDEsIDBMKSA9PSAxKSAmJiAoc29ja2V0ID09IHR0eWZkKSkKKyAgICAgICAgICBvdXRvZmJhbmQgPSAxOworI2Vsc2UgLyogIUlCTVNFTEVDVCAqLworLyoKKyAgSWYgd2UgY2FuJ3QgdXNlIHNlbGVjdCgpLCB0aGVuIHdlIHVzZSB0aGUgcmVndWxhciBhbGFybSgpL3NpZ25hbCgpCisgIHRpbWVvdXQgbWVjaGFuaXNtLgorKi8KKyAgICAgIGRlYnVnKEYxMDEsIk91dC1vZi1CYW5kIGRhdGEgbm90IHN1cHBvcnRlZCIsIiIsMCk7CisgICAgICBvdXRvZmJhbmQgPSAwOworCisjZW5kaWYgLyogSUJNU0VMRUNUICovCisjZW5kaWYgLyogQlNEU0VMRUNUICovCisjZW5kaWYgLyogQkVMTFNFTEVDVCAqLworICAgICAgaWYgKG91dG9mYmFuZCkgeworICAgICAgICAgLyogR2V0IHRoZSBVcmdlbnQgRGF0YSAqLworICAgICAgICAgLyogaWYgT09CSU5MSU5FIGlzIGRpc2FibGVkIHRoaXMgc2hvdWxkIGJlIG9ubHkgYSBzaW5nbGUgYnl0ZSAgICAgICovCisgICAgICAgICAvKiBNUyBXaW5zb2NrIGhhcyBhIGJ1ZyBpbiBXaW5kb3dzIDk1LiAgRXh0cmEgYnl0ZXMgYXJlIGRlbGl2ZXJlZCAgKi8KKyAgICAgICAgIC8qIFRoYXQgd2VyZSBuZXZlciBzZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIE9TMgorICAgICAgICAgIFJlcXVlc3RUQ1BJUE11dGV4KFNFTV9JTkRFRklOSVRFX1dBSVQpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgIGNvdW50ID0gc29ja2V0X3JlY3YodHR5ZmQsJnR0aWJ1Zlt0dGlicCt0dGlibl0sY291bnQsTVNHX09PQik7CisjaWZkZWYgT1MyCisgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICBpZiAoY291bnQgPD0gMCkgeworICAgICAgICAgICAgICBpbnQgc19lcnJubyA9IHNvY2tldF9lcnJubzsKKyAgICAgICAgICAgICAgZGVidWcoRjEwMSwgInR0YnVmciBzb2NrZXRfcmVjdiBNU0dfT09CIiwiIixjb3VudCk7CisgICAgICAgICAgICAgIGRlYnVnKEYxMDEsICJ0dGJ1ZnIgc29ja2V0X2Vycm5vIiwiIixzX2Vycm5vKTsKKyNpZmRlZiBPUzJPTkxZCisgICAgICAgICAgICAgIGlmIChjb3VudCA8IDAgJiYgKHNfZXJybm8gPT0gMCB8fCBzX2Vycm5vID09IDIzKSkgeworICAgICAgICAgICAgICAgICAgLyogVGhlc2UgYXBwZWFyIGluIE9TLzIgLSBkb24ndCBrbm93IHdoeSAgICovCisgICAgICAgICAgICAgICAgICAvKiBpZ25vcmUgaXQgYW5kIHJlYWQgYXMgbm9ybWFsIGRhdGEgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIC8qIGFuZCBicmVhaywgdGhlbiB3ZSB3aWxsIGF0dGVtcHQgdG8gcmVhZCAqLworICAgICAgICAgICAgICAgICAgLyogdGhlIHBvcnQgdXNpbmcgbm9ybWFsIHJlYWQoKSB0ZWNobmlxdWVzICovCisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ0dGJ1ZnIgaGFuZGluZyBhcyBpbi1iYW5kIGRhdGEiLCIiLDApOworICAgICAgICAgICAgICAgICAgY291bnQgPSAxOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgbmV0Y2xvcygpOyAgICAgICAgICAgICAgICAgICAgLyogKioqICoqKiAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICAgIH0KKyNlbHNlIC8qIE9TMk9OTFkgKi8KKyAgICAgICAgICAgICAgbmV0Y2xvcygpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICoqKiAqKiogKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyNlbmRpZiAvKiBPUzJPTkxZICovCisgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogd2UgZ290IG91dC1vZi1iYW5kIGRhdGEgKi8KKyAgICAgICAgICAgICAgaGV4ZHVtcCgidHRidWZyIG91dC1vZi1iYW5kIGNoYXJzIiwmdHRpYnVmW3R0aWJwK3R0aWJuXSxjb3VudCk7CisjaWZkZWYgQkVUQURFQlVHCisgICAgICAgICAgICAgIGJsZWVwKEJQX05PVEUpOworI2VuZGlmIC8qIEJFVEFERUJVRyAqLworI2lmZGVmIFJMT0dDT0RFICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJsYWggKi8KKyAgICAgICAgICAgICAgaWYgKHR0bnByb3RvID09IE5QX1JMT0dJTiAgfHwKKyAgICAgICAgICAgICAgICAgIHR0bnByb3RvID09IE5QX0s0TE9HSU4gfHwgdHRucHJvdG8gPT0gTlBfRUs0TE9HSU4gfHwKKyAgICAgICAgICAgICAgICAgICgodHRucHJvdG8gPT0gTlBfSzVMT0dJTiB8fCB0dG5wcm90byA9PSBOUF9FSzVMT0dJTikgJiYgCisgICAgICAgICAgICAgICAgICAhcmxvZ19pbmJhbmQpCisgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICBXaGVuIHVyZ2VudCBkYXRhIGlzIHJlYWQgd2l0aCBNU0dfT09CIGFuZCBub3QgT09CSU5MSU5FCisgICAgICAgICAgICAgICAgICAgIHRoZW4gdXJnZW50IGRhdGEgYW5kIG5vcm1hbCBkYXRhIGFyZSBub3QgbWl4ZWQuICBTbworICAgICAgICAgICAgICAgICAgICB0cmVhdCB0aGUgZW50aXJlIGJ1ZmZlciBhcyB1cmdlbnQgZGF0YS4KKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBybG9nX29vYigmdHRpYnVmW3R0aWJwK3R0aWJuXSwgY291bnQpOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgIHJldHVybiB0dGJ1ZnIoKTsKKyAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogUkxPR0NPREUgKi8gLyogYmxhaCAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICBJIGhhdmVuJ3Qgd3JpdHRlbiB0aGlzIHlldCwgbm9yIGRvIEkga25vdyB3aGF0IGl0IHNob3VsZCBkbworICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHR0bnByb3RvID09IE5QX1RFTE5FVCkgeworICAgICAgICAgICAgICAgICAgICB0bl9vb2IoKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogRm9yIGFueSBwcm90b2NvbHMgd2UgZG9uJ3QgaGF2ZSBhIHNwZWNpYWwgb3V0LW9mLWJhbmQgICovCisgICAgICAgICAgICAgICAgICAvKiBoYW5kbGVyIGZvciwganVzdCBwdXQgdGhlIGJ5dGVzIGluIHRoZSBub3JtYWwgYnVmZmVyICAgKi8KKyAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICB0dGlicCArPSAwOyAgICAgICAvKiBSZXNldCBidWZmZXIgcG9pbnRlci4gKi8KKyAgICAgICAgICAgICAgICAgIHR0aWJuICs9IGNvdW50OworI2lmZGVmIERFQlVHCisgICAgICAgICAgICAgICAgICAvKiBHb3Qgc29tZSBieXRlcy4gKi8KKyAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsInR0YnVmciBjb3VudCAyIiwiIixjb3VudCk7CisgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgIHR0aWJ1Zlt0dGlicCt0dGlibl0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwidHRidWZyIHR0aWJ1ZiIsdHRpYnVmLHR0aWJwKTsKKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgIHJldHVybih0dGlibik7ICAgIC8qIFJldHVybiBidWZmZXIgY291bnQuICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFNPX09PQklOTElORSAqLworI2VuZGlmIC8qIFZNUyAqLworCisgICAgY291bnQgPSBzb2NrZXRfcmVhZCh0dHlmZCwmdHRpYnVmW3R0aWJwK3R0aWJuXSxjb3VudCk7CisgICAgaWYgKGNvdW50IDw9IDApIHsKKyAgICAgICAgaW50IHNfZXJybm8gPSBzb2NrZXRfZXJybm87CisgICAgICAgIGRlYnVnKEYxMDEsInR0YnVmciBzb2NrZXRfcmVhZCIsIiIsY291bnQpOworICAgICAgICBkZWJ1ZyhGMTAxLCJ0dGJ1ZnIgc29ja2V0X2Vycm5vIiwiIixzX2Vycm5vKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgaWYgKGNvdW50ID09IDAgfHwgb3Myc29ja2V0ZXJyb3Ioc19lcnJubykgPCAwKSB7CisgICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworICAgICAgICByZXR1cm4oLTEpOworI2Vsc2UgLyogT1MyICovCisgICAgICAgIG5ldGNsb3MoKTsgICAgICAgICAgICAgICAgICAgICAgLyogKioqICoqKiAqLworICAgICAgICByZXR1cm4oLTIpOworI2VuZGlmIC8qIE9TMiAqLworICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovIC8qIChibG9ja2luZyB2cyBub25ibG9jayByZWFkcy4uLikgKi8KKyAgICBlbHNlIHsKKyAgICAgICAgdHRpYnAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBidWZmZXIgcG9pbnRlci4gKi8KKyAgICAgICAgdHRpYm4gKz0gY291bnQ7CisjaWZkZWYgREVCVUcKKyAgICAgICAgZGVidWcoRjEwMSwidHRidWZyIGNvdW50IDIiLCIiLGNvdW50KTsgLyogR290IHNvbWUgYnl0ZXMuICovCisgICAgICAgIGlmIChjb3VudCA+IDApCisgICAgICAgICAgdHRpYnVmW3R0aWJwK3R0aWJuXSA9ICdcMCc7CisgICAgICAgIGRlYnVnKEYxMTEsInR0YnVmciB0dGlidWYiLCZ0dGlidWZbdHRpYnBdLHR0aWJuKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgT1MyCisgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHJldHVybih0dGlibik7ICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGJ1ZmZlciBjb3VudC4gKi8KKyAgICB9Cit9CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKworI2lmbmRlZiBJQk1TRUxFQ1QKKyNpZm5kZWYgQkVMTFNFTEVDVAorI2lmbmRlZiBCU0RTRUxFQ1QgICAgICAgICAgICAgICAvKiBOb24tVENQSVBMSUIgY2FzZSAqLworI2lmZGVmIFNFTEVDVAorI2RlZmluZSBCU0RTRUxFQ1QKKyNlbmRpZiAvKiBTRUxFQ1QgKi8KKyNlbmRpZiAvKiBCU0RTRUxFQ1QgKi8KKyNlbmRpZiAvKiBCRUxMU0VMRUNUICovCisjZW5kaWYgLyogSUJNU0VMRUNUICovCisKKyNkZWZpbmUgVEVMTkVUX1BPUlQgMjMgICAgICAgICAgLyogU2hvdWxkIGRvIGxvb2t1cCwgYnV0IGl0IHdvbid0IGNoYW5nZSAqLworI2RlZmluZSBSTE9HSU5fUE9SVCA1MTMKKyNkZWZpbmUgS0VSTUlUX1BPUlQgMTY0OQorI2RlZmluZSBLTE9HSU5fUE9SVCA1NDMKKyNkZWZpbmUgRUtMT0dJTl9QT1JUIDIxMDUKKworI2lmbmRlZiBOT05FVAorLyoKKyAgQy1LZXJtaXQgbmV0d29yayBvcGVuL2Nsb3NlIGZ1bmN0aW9ucyBmb3IgQlNELXNvY2tldHMuCisgIE11Y2ggb2YgdGhpcyBjb2RlIHNoYXJlZCBieSBTdW5MaW5rIFguMjUsIHdoaWNoIGFsc28gdXNlcyB0aGUgc29ja2V0IGxpYnJhcnkuCisqLworCisvKiAgTiBFIFQgTyBQIE4gIC0tICBPcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLiAgKi8KKy8qCisgIENhbGwgd2l0aDoKKyAgICBuYW1lIG9mIGhvc3QgKG9yIGhvc3Q6c2VydmljZSksCisgICAgbGNsIC0gbG9jYWwtbW9kZSBmbGFnIHRvIGJlIHNldCBpZiB0aGlzIGZ1bmN0aW9uIHN1Y2NlZWRzLAorICAgIG5ldHdvcmsgdHlwZSAtIHZhbHVlIGRlZmluZWQgaW4gY2t1bmV0LmguCisqLworI2lmZGVmIFRDUFNPQ0tFVAorc3RydWN0IGhvc3RlbnQgKgorI2lmZGVmIENLX0FOU0lDCitja19jb3B5aG9zdGVudChzdHJ1Y3QgaG9zdGVudCAqIGgpCisjZWxzZSAvKiBDS19BTlNJQyAqLworY2tfY29weWhvc3RlbnQoaCkgc3RydWN0IGhvc3RlbnQgKiBoOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgLyoKKyAgICAgKiAgVGhlIGhvc3RlbnQgc3RydWN0dXJlIGlzIGR5bmFtaWMgaW4gbmF0dXJlLgorICAgICAqICBzdHJ1Y3QgIGhvc3RlbnQgeworICAgICAqICBjaGFyICAgICogaF9uYW1lOworICAgICAqICBjaGFyICAgICogKiBoX2FsaWFzZXM7CisgICAgICogIHNob3J0ICAgaF9hZGRydHlwZTsKKyAgICAgKiAgc2hvcnQgICBoX2xlbmd0aDsKKyAgICAgKiAgY2hhciAgICAqICogaF9hZGRyX2xpc3Q7CisgICAgICogICNkZWZpbmUgaF9hZGRyICBoX2FkZHJfbGlzdFswXQorICAgICAqLworI2RlZmluZSBIT1NURU5UQ05UIDUKKyAgICBzdGF0aWMgc3RydWN0IGhvc3RlbnQgaG9zdHNbSE9TVEVOVENOVF0gPSB7e05VTEwsTlVMTCwwLDAsTlVMTH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLE5VTEwsMCwwLE5VTEx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCxOVUxMLDAsMCxOVUxMfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsTlVMTCwwLDAsTlVMTH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLE5VTEwsMCwwLE5VTEx9fTsKKyAgICBzdGF0aWMgaW50ICAgIG5leHQgPSAwOworICAgIGludCAgICBpLGNudDsKKyAgICBjaGFyICoqIHBwOworCisgICAgaWYgKCBoID09IE5VTEwgKQorICAgICAgICByZXR1cm4oTlVMTCk7CisKKyAgICBpZiAobmV4dCA9PSBIT1NURU5UQ05UKQorICAgICAgICBuZXh0ID0gMDsKKworICAgIGlmICggaG9zdHNbbmV4dF0uaF9uYW1lICkgeworICAgICAgICBmcmVlKGhvc3RzW25leHRdLmhfbmFtZSk7CisgICAgICAgIGhvc3RzW25leHRdLmhfbmFtZSA9IE5VTEw7CisgICAgfQorICAgIGlmICggaG9zdHNbbmV4dF0uaF9hbGlhc2VzICkgeworICAgICAgICBwcCA9IGhvc3RzW25leHRdLmhfYWxpYXNlczsKKyAgICAgICAgd2hpbGUgKCAqcHAgKSB7CisgICAgICAgICAgICBmcmVlKCpwcCk7CisgICAgICAgICAgICBwcCsrOworICAgICAgICB9CisgICAgICAgIGZyZWUoaG9zdHNbbmV4dF0uaF9hbGlhc2VzKTsKKyAgICB9CisjaWZkZWYgSEFERFJMSVNUCisgICAgaWYgKCBob3N0c1tuZXh0XS5oX2FkZHJfbGlzdCApIHsKKyAgICAgICAgcHAgPSBob3N0c1tuZXh0XS5oX2FkZHJfbGlzdDsKKyAgICAgICAgd2hpbGUgKCAqcHAgKSB7CisgICAgICAgICAgICBmcmVlKCpwcCk7CisgICAgICAgICAgICBwcCsrOworICAgICAgICB9CisgICAgICAgIGZyZWUoaG9zdHNbbmV4dF0uaF9hZGRyX2xpc3QpOworICAgIH0KKyNlbmRpZiAvKiBIQUREUkxJU1QgKi8KKworICAgIG1ha2VzdHIoJmhvc3RzW25leHRdLmhfbmFtZSxoLT5oX25hbWUpOworICAgIGlmIChoLT5oX2FsaWFzZXMpIHsKKyAgICAgICAgZm9yICggY250PTAscHA9aC0+aF9hbGlhc2VzOyBwcCAmJiAqcHA7IHBwKyssY250KyspIDsKKyAgICAgICAgLyogVGhlIGZvbGxvd2luZyBjYW4gZ2l2ZSB3YXJuaW5ncyBpbiBub24tQU5TSSBidWlsZHMgKi8KKyAgICAgICAgaG9zdHNbbmV4dF0uaF9hbGlhc2VzID0gKGNoYXIgKiopIG1hbGxvYyhzaXplb2YoY2hhciAqKSAqIChjbnQrMSkpOworICAgICAgICBmb3IgKCBpPTA7IGk8Y250OyBpKyspIHsKKyAgICAgICAgICAgIGhvc3RzW25leHRdLmhfYWxpYXNlc1tpXSA9IE5VTEw7CisgICAgICAgICAgICBtYWtlc3RyKCZob3N0c1tuZXh0XS5oX2FsaWFzZXNbaV0saC0+aF9hbGlhc2VzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBob3N0c1tuZXh0XS5oX2FsaWFzZXNbaV0gPSBOVUxMOworICAgIH0gZWxzZQorICAgICAgICBob3N0c1tuZXh0XS5oX2FsaWFzZXMgPSBOVUxMOworCisgICAgaG9zdHNbbmV4dF0uaF9hZGRydHlwZSA9IGgtPmhfYWRkcnR5cGU7CisgICAgaG9zdHNbbmV4dF0uaF9sZW5ndGggPSBoLT5oX2xlbmd0aDsKKworI2lmZGVmIEhBRERSTElTVAorI2lmZGVmIGhfYWRkcgorICAgIGlmIChoLT5oX2FkZHJfbGlzdCkgeworICAgICAgICBmb3IgKCBjbnQ9MCxwcD1oLT5oX2FkZHJfbGlzdDsgcHAgJiYgKnBwOyBwcCsrLGNudCsrKSA7CisgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY2FuIGdpdmUgd2FybmluZ3Mgbm9uLUFOU0kgYnVpbGRzICovCisgICAgICAgIGhvc3RzW25leHRdLmhfYWRkcl9saXN0ID0gKGNoYXIgKiopIG1hbGxvYyhzaXplb2YoY2hhciAqKSAqIChjbnQrMSkpOworICAgICAgICBmb3IgKCBpPTA7IGk8Y250OyBpKyspIHsKKyAgICAgICAgICAgIGhvc3RzW25leHRdLmhfYWRkcl9saXN0W2ldID0gbWFsbG9jKGgtPmhfbGVuZ3RoKTsKKyAgICAgICAgICAgIGJjb3B5KGgtPmhfYWRkcl9saXN0W2ldLGhvc3RzW25leHRdLmhfYWRkcl9saXN0W2ldLGgtPmhfbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBob3N0c1tuZXh0XS5oX2FkZHJfbGlzdFtpXSA9IE5VTEw7CisgICAgfSBlbHNlCisgICAgICAgIGhvc3RzW25leHRdLmhfYWRkcl9saXN0ID0gTlVMTDsKKyNlbHNlCisgICAgYmNvcHkoaC0+aF9hZGRyLCAmaG9zdHNbbmV4dF0uaF9hZGRyLCBoLT5oX2xlbmd0aCk7CisjZW5kaWYgLyogaF9hZGRyICovCisjZWxzZSAvKiBIQUREUkxJU1QgKi8KKyAgICBiY29weShoLT5oX2FkZHIsICZob3N0c1tuZXh0XS5oX2FkZHIsIGgtPmhfbGVuZ3RoKTsKKyNlbmRpZiAvKiBIQUREUkxJU1QgKi8KKworICAgIHJldHVybigmaG9zdHNbbmV4dCsrXSk7Cit9CisKKyNpZmRlZiBFWENFTEFOCisvKgorICBNb3N0IG90aGVyIEJTRCBzb2NrZXRzIGltcGxlbWVudGF0aW9ucyBkZWZpbmUgdGhlc2UgaW4gaGVhZGVyIGZpbGVzCisgIGFuZCBsaWJyYXJpZXMuCisqLworc3RydWN0IHNlcnZlbnQgeworICAgIHVuc2lnbmVkIHNob3J0IHNfcG9ydDsKK307CisKK3N0cnVjdCBob3N0ZW50IHsKKyAgICBzaG9ydCBoX2FkZHJ0eXBlOworICAgIHN0cnVjdCBpbl9hZGRyIGhfYWRkcjsKKyAgICBpbnQgaF9sZW5ndGg7Cit9OworCitzdHJ1Y3Qgc2VydmVudCAqCitnZXRzZXJ2YnluYW1lKHNlcnZpY2UsIGNvbm5lY3Rpb24pIGNoYXIgKnNlcnZpY2UsKmNvbm5lY3Rpb247IHsKKyAgICBzdGF0aWMgc3RydWN0IHNlcnZlbnQgc2VydnJlYzsKKyAgICBpbnQgcG9ydDsKKworICAgIHBvcnQgPSAwOworICAgIGlmIChzdHJjbXAoc2VydmljZSwgInRlbG5ldCIpID09IDApIHBvcnQgPSAyMzsKKyAgICBlbHNlIGlmIChzdHJjbXAoc2VydmljZSwgInNtdHAiKSA9PSAwKSBwb3J0ID0gMjU7CisgICAgZWxzZSBwb3J0ID0gYXRvaShzZXJ2aWNlKTsKKworICAgIGRlYnVnKEYxMDEsImdldHNlcnZieW5hbWUgcmV0dXJuIHBvcnQgIiwiIixwb3J0KTsKKworICAgIGlmIChwb3J0ID4gMCkgeworICAgICAgICBzZXJ2cmVjLnNfcG9ydCA9IGh0b25zKHBvcnQpOworICAgICAgICByZXR1cm4oJnNlcnZyZWMpOworICAgIH0KKyAgICByZXR1cm4oKHN0cnVjdCBzZXJ2ZW50ICopIE5VTEwpOworfQorCitzdHJ1Y3QgaG9zdGVudCAqCitnZXRob3N0YnluYW1lKGhvc3RuYW1lKSBjaGFyICpob3N0bmFtZTsgeworICAgIHJldHVybigoc3RydWN0IGhvc3RlbnQgKikgTlVMTCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcKK2luZXRfYWRkcihuYW1lKSBjaGFyICpuYW1lOyB7CisgICAgdW5zaWduZWQgbG9uZyBhZGRyOworCisgICAgYWRkciA9IHJob3N0KCZuYW1lKTsKKyAgICBkZWJ1ZyhGMTExLCJpbmV0X2FkZHIgIixuYW1lLChpbnQpYWRkcik7CisgICAgcmV0dXJuKGFkZHIpOworfQorCitjaGFyICoKK2luZXRfbnRvYShpbikgc3RydWN0IGluX2FkZHIgaW47IHsKKyAgICBzdGF0aWMgY2hhciBuYW1lWzgwXTsKKyAgICBja21ha3htc2cobmFtZSwgY2t1aXRvYShpbi5zX25ldCksIi4iLGNrdWl0b2EoaW4uc19ob3N0KSwiLiIsCisgICAgICAgICAgICAgICBja3VpdG9hKGluLnNfbGgpLCIuIiwgY2t1aXRvYShpbi5zX2ltcG5vKSk7CisgICAgcmV0dXJuKG5hbWUpOworfQorI2Vsc2UKKyNpZmRlZiBERUNfVENQSVAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVQ1ggKi8KKworaW50IHVjeF9wb3J0X2J1ZyA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIEV4cGxhaW5lZCBiZWxvdyAqLworCisjaWZuZGVmIF9fREVDQyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVkFYQyBvciBHQ0MgKi8KKworI2RlZmluZSBnZXRzZXJ2YnluYW1lIG15X2dldHNlcnZieW5hbWUKKworI2lmZGVmIENLX0FOU0lDCitnbG9iYWxyZWYgaW50ICgqQyQkR0FfVUNYX0dFVFNFUlZCWU5BTUUpKCk7CitleHRlcm4gdm9pZCBDJCRUUkFOU0xBVEUoKTsKK2V4dGVybiB2b2lkIEMkJFNPQ0tfVFJBTlNMQVRFKCk7CisjZWxzZQorZ2xvYmFscmVmIGludCAoKkMkJEdBX1VDWF9HRVRTRVJWQllOQU1FKSgpOworZXh0ZXJuIFZPSUQgQyQkVFJBTlNMQVRFKCk7CitleHRlcm4gVk9JRCBDJCRTT0NLX1RSQU5TTEFURSgpOworI2VuZGlmIC8qIENLX0FOU0lDICovCisKK3N0cnVjdCBzZXJ2ZW50ICoKK215X2dldHNlcnZieW5hbWUgKHNlcnZpY2UsIHByb3RvKSBjaGFyICpzZXJ2aWNlLCAqcHJvdG87IHsKKyAgICBzdGF0aWMgc3RydWN0IHNlcnZlbnQgc2VudDsKKyAgICBzdHJ1Y3QgaW9zYiB7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhdHVzOworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3RbMl07CisgICAgICAgIH0gc2I7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgc3BhcmU7CisgICAgfSBzOworICAgIHN0cnVjdCB7CisgICAgICAgIHN0cnVjdCBpb3NiICpzOworICAgICAgICBjaGFyICpzZXJ2OworICAgICAgICBjaGFyICpwcm90OworICAgIH0gcGFyOworICAgIHVuc2lnbmVkIGxvbmcgZTsKKyAgICBjaGFyIHNidWZbMzBdLCBwYnVmWzMwXTsKKyAgICBjaGFyICpwOworCisgICAgZGVidWcoRjExMSwiVUNYIGdldHNlcnZieW5hbWUiLHNlcnZpY2UsKGludClDJCRHQV9VQ1hfR0VUU0VSVkJZTkFNRSk7CisKKyAgICBwID0gc2J1ZjsKKyAgICBja3N0cm5jcHkocCwgc2VydmljZSwgMjkpOworICAgIHdoaWxlICgqcCA9IHRvdXBwZXIoKnApLCAqcCsrKSB7fQorICAgIHAgPSBwYnVmOworICAgIGNrc3RybmNweShwLCBwcm90bywgMjkpOworICAgIHdoaWxlICgqcCA9IHRvdXBwZXIoKnApLCAqcCsrKSB7fQorCisgICAgcGFyLnMgPSAmczsKKworICAgIHBhci5zZXJ2ID0gIiI7CisgICAgcGFyLnByb3QgPSAiIjsKKyAgICAvKiByZXNldCBmaWxlIHBvaW50ZXIgb3Igc29tZXRoaW5nIGxpa2UgdGhhdCE/IT8gKi8KKyAgICBlID0gKCpDJCRHQV9VQ1hfR0VUU0VSVkJZTkFNRSkoJnBhciwgJnNlbnQsIHBhci5zKTsKKyAgICBwYXIuc2VydiA9IHNidWY7CisgICAgcGFyLnByb3QgPSBwYnVmOyAgICAgICAgICAgIC8qIHRoYXQgaXMgZG9uJ3QgY2FyZSAqLworICAgIGUgPSAoKkMkJEdBX1VDWF9HRVRTRVJWQllOQU1FKSgmcGFyLCAmc2VudCwgcGFyLnMpOworICAgIGlmICgobG9uZyllID09IC0xTCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZSAmIDEpID09IDBMKSB7CisgICAgICAgIEMkJFRSQU5TTEFURShlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgocy5zYi5zdFswXSAmIDEpID09IDApIHsKKyAgICAgICAgQyQkU09DS19UUkFOU0xBVEUoJnMuc2Iuc3RbMF0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisvKgorICBzZW50LnNfcG9ydCBpcyBzdXBwb3NlZCB0byBiZSByZXR1cm5lZCBieSBVQ1ggaW4gbmV0d29yayBieXRlIG9yZGVyLgorICBIb3dldmVyLCBVQ1ggMi4wIHRocm91Z2ggMi4wQyBkaWQgbm90IGRvIHRoaXM7IDIuMEQgYW5kIGxhdGVyIGRvIGl0LgorICBCdXQgdGhlcmUgaXMgbm8gd2F5IG9mIGtub3dpbmcgd2hpY2ggVUNYIHZlcnNpb24sIHNvIHdlIGhhdmUgYSB1c2VyLXNldHRhYmxlCisgIHJ1bnRpbWUgdmFyaWFibGUuICBOb3RlOiBVQ1ggMi4wIHdhcyBvbmx5IGZvciB0aGUgVkFYLgorKi8KKyAgICBkZWJ1ZyhGMTAxLCJVQ1ggZ2V0c2VydmJ5bmFtZSBwb3J0IiwiIixzZW50LnNfcG9ydCk7CisgICAgZGVidWcoRjEwMSwiVUNYIGdldHNlcnZieW5hbWUgbnRvaHMocG9ydCkiLCIiLG50b2hzKHNlbnQuc19wb3J0KSk7CisgICAgaWYgKHVjeF9wb3J0X2J1ZykgeworICAgICAgICBzZW50LnNfcG9ydCA9IGh0b25zKHNlbnQuc19wb3J0KTsKKyAgICAgICAgZGVidWcoRjEwMCwiVUNYLVBPUlQtQlVHIE9OOiBzd2FwcGluZyBieXRlcyIsIiIsMCk7CisgICAgICAgIGRlYnVnKEYxMDEsIlVDWCBzd2FwcGVkIHBvcnQiLCIiLHNlbnQuc19wb3J0KTsKKyAgICAgICAgZGVidWcoRjEwMSwiVUNYIHN3YXBwZWQgbnRvaHMocG9ydCkiLCIiLG50b2hzKHNlbnQuc19wb3J0KSk7CisgICAgfQorICAgIHJldHVybiAmc2VudDsKK30KKyNlbmRpZiAvKiBfX0RFQ0MgKi8KKyNlbmRpZiAvKiBERUNfVENQSVAgKi8KKyNlbmRpZiAvKiBFWENFTEFOICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZm5kZWYgTk9UQ1BPUFRTCisjaWZuZGVmIGRhdGFnZW5lcmFsCitpbnQKK2NrX2xpbmdlcihzb2NrLCBvbm9mZiwgdGltbykgaW50IHNvY2s7IGludCBvbm9mZjsgaW50IHRpbW87IHsKKy8qCisgIFRoZSBmb2xsb3dpbmcsIGZyb20gV2lsbGlhbSBCYWRlciwgdHVybnMgb2ZmIHRoZSBzb2NrZXQgbGluZ2VyIHBhcmFtZXRlciwKKyAgd2hpY2ggbWFrZXMgYSBjbG9zZSgpIGJsb2NrIHVudGlsIGFsbCBkYXRhIGlzIHNlbnQuICAiSSBkb24ndCB0aGluayB0aGF0CisgIGRpc2FibGluZyBsaW5nZXIgY2FuIGV2ZXIgY2F1c2Uga2VybWl0IHRvIGxvc2UgZGF0YSwgYnV0IHlvdSB0ZWxuZXQgdG8gYQorICBmbGFreSBzZXJ2ZXIgKG9yIHRvIG91ciBtb2RlbSBzZXJ2ZXIgd2hlbiB0aGUgbW9kZW0gaXMgaW4gdXNlKSwgZGlzYWJsaW5nCisgIGxpbmdlciBwcmV2ZW50cyBrZXJtaXQgZnJvbSBoYW5naW5nIG9uIHRoZSBjbG9zZSBpZiB5b3UgdHJ5IHRvIGV4aXQuIgorCisgIE1vZGlmaWVkIGJ5IEplZmYgQWx0bWFuIHRvIGJlIGdlbmVyYWxseSB1c2VmdWwuCisqLworI2lmZGVmIFNPTF9TT0NLRVQKKyNpZmRlZiBTT19MSU5HRVIKKyAgICBzdHJ1Y3QgbGluZ2VyIHNldF9saW5nZXJfb3B0OworICAgIHN0cnVjdCBsaW5nZXIgZ2V0X2xpbmdlcl9vcHQ7CisgICAgU09DS09QVF9UIHg7CisKKyNpZmRlZiBJS1NECisgICAgaWYgKCFpbnNlcnZlcikKKyNlbmRpZiAvKiBJS1NEICovCisgICAgICBpZiAoc29jayA9PSAtMSB8fAorICAgICAgICBuZXR0eXBlICE9IE5FVF9UQ1BBICYmIG5ldHR5cGUgIT0gTkVUX1RDUEIgJiYKKyAgICAgICAgbmV0dHlwZSAhPSBORVRfU1NIIHx8IHR0bWRtID49IDApIHsKKyAgICAgICAgdGNwX2xpbmdlciA9IG9ub2ZmOworICAgICAgICB0Y3BfbGluZ2VyX3RtbyA9IHRpbW87CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisgICAgeCA9IHNpemVvZihnZXRfbGluZ2VyX29wdCk7CisgICAgaWYgKGdldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fTElOR0VSLAorICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZnZXRfbGluZ2VyX29wdCwgJngpKSB7CisgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBja19saW5nZXIgY2FuJ3QgZ2V0IFNPX0xJTkdFUiIsY2tfZXJyc3RyKCksZXJybm8pOworICAgIH0gZWxzZSBpZiAoeCAhPSBzaXplb2YoZ2V0X2xpbmdlcl9vcHQpKSB7CisjaWZkZWYgT1MyCisgICAgICAgIHN0cnVjdCBfbGluZ2VyMTYgeworICAgICAgICAgICAgc2hvcnQgc19saW5nZXI7CisgICAgICAgICAgICBzaG9ydCBzX29ub2ZmOworICAgICAgICB9IGdldF9saW5nZXJfb3B0MTYsIHNldF9saW5nZXJfb3B0MTY7CisgICAgICAgIGlmICggeCA9PSBzaXplb2YoZ2V0X2xpbmdlcl9vcHQxNikgKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJUQ1Agc2V0bGluZ2VyIHdhcm5pbmc6IFNPX0xJTkdFUiIsImxlbiBpcyAxNi1iaXQiLHgpOworICAgICAgICAgICAgaWYgKGdldHNvY2tvcHQoc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmdldF9saW5nZXJfb3B0MTYsICZ4KQorICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsCisgICAgICAgICAgICAgICAgICAgICAgIlRDUCBja19saW5nZXIgY2FuJ3QgZ2V0IFNPX0xJTkdFUiIsY2tfZXJyc3RyKCksZXJybm8pOworICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRfbGluZ2VyX29wdDE2LnNfb25vZmYgIT0gb25vZmYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xpbmdlcl9vcHQxNi5zX2xpbmdlciAhPSB0aW1vKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldF9saW5nZXJfb3B0MTYuc19vbm9mZiAgPSBvbm9mZjsKKyAgICAgICAgICAgICAgICBzZXRfbGluZ2VyX29wdDE2LnNfbGluZ2VyID0gdGltbzsKKyAgICAgICAgICAgICAgICBpZiAoc2V0c29ja29wdChzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09fTElOR0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnNldF9saW5nZXJfb3B0MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNldF9saW5nZXJfb3B0MTYpKQorICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDUCBja19saW5nZXIgY2FuJ3Qgc2V0IFNPX0xJTkdFUiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNrX2VycnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubworICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB0Y3BfbGluZ2VyID0gZ2V0X2xpbmdlcl9vcHQxNi5zX29ub2ZmOworICAgICAgICAgICAgICAgICAgICB0Y3BfbGluZ2VyX3RtbyA9IGdldF9saW5nZXJfb3B0MTYuc19saW5nZXI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDUCBja19saW5nZXIgbmV3IFNPX0xJTkdFUiIsIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9saW5nZXJfb3B0MTYuc19vbm9mZik7CisgICAgICAgICAgICAgICAgICAgIHRjcF9saW5nZXIgPSBzZXRfbGluZ2VyX29wdDE2LnNfb25vZmY7CisgICAgICAgICAgICAgICAgICAgIHRjcF9saW5nZXJfdG1vID0gc2V0X2xpbmdlcl9vcHQxNi5zX2xpbmdlcjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJUQ1AgY2tfbGluZ2VyIFNPX0xJTkdFUiB1bmNoYW5nZWQiLCIiLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRfbGluZ2VyX29wdDE2LnNfb25vZmYpOworICAgICAgICAgICAgICAgIHRjcF9saW5nZXIgPSBnZXRfbGluZ2VyX29wdDE2LnNfb25vZmY7CisgICAgICAgICAgICAgICAgdGNwX2xpbmdlcl90bW8gPSBnZXRfbGluZ2VyX29wdDE2LnNfbGluZ2VyOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBja19saW5nZXIgZXJyb3I6IFNPX0xJTkdFUiIsImxlbiIseCk7CisgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBja19saW5nZXIgU09fTElOR0VSIiwKKyAgICAgICAgICAgICAgImV4cGVjdGVkIGxlbiIsc2l6ZW9mKGdldF9saW5nZXJfb3B0KSk7CisgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBja19saW5nZXIgU09fTElOR0VSIiwibGluZ2VyX29wdC5sX29ub2ZmIiwKKyAgICAgICAgICAgICAgZ2V0X2xpbmdlcl9vcHQubF9vbm9mZik7CisgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBsaW5nZXIgU09fTElOR0VSIiwibGluZ2VyX29wdC5sX2xpbmdlciIsCisgICAgICAgICAgICAgICBnZXRfbGluZ2VyX29wdC5sX2xpbmdlcik7CisgICAgfSBlbHNlIGlmIChnZXRfbGluZ2VyX29wdC5sX29ub2ZmICE9IG9ub2ZmIHx8CisgICAgICAgICAgICAgICBnZXRfbGluZ2VyX29wdC5sX2xpbmdlciAhPSB0aW1vKSB7CisgICAgICAgIHNldF9saW5nZXJfb3B0Lmxfb25vZmYgID0gb25vZmY7CisgICAgICAgIHNldF9saW5nZXJfb3B0LmxfbGluZ2VyID0gdGltbzsKKyAgICAgICAgaWYgKHNldHNvY2tvcHQoc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgU09fTElOR0VSLAorICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZzZXRfbGluZ2VyX29wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNldF9saW5nZXJfb3B0KSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBja19saW5nZXIgY2FuJ3Qgc2V0IFNPX0xJTkdFUiIsY2tfZXJyc3RyKCksZXJybm8pOworICAgICAgICAgICAgdGNwX2xpbmdlciA9IGdldF9saW5nZXJfb3B0Lmxfb25vZmY7CisgICAgICAgICAgICB0Y3BfbGluZ2VyX3RtbyA9IGdldF9saW5nZXJfb3B0LmxfbGluZ2VyOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICBkZWJ1ZyhGMTAxLAorICAgICAgICAgICAgICAgICAgICJUQ1AgY2tfbGluZ2VyIG5ldyBTT19MSU5HRVIiLAorICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgIHNldF9saW5nZXJfb3B0Lmxfb25vZmYKKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgIHRjcF9saW5nZXIgPSBzZXRfbGluZ2VyX29wdC5sX29ub2ZmOworICAgICAgICAgICAgIHRjcF9saW5nZXJfdG1vID0gc2V0X2xpbmdlcl9vcHQubF9saW5nZXI7CisgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVidWcoRjEwMSwiVENQIGNrX2xpbmdlciBTT19MSU5HRVIgdW5jaGFuZ2VkIiwiIiwKKyAgICAgICAgICAgICAgZ2V0X2xpbmdlcl9vcHQubF9vbm9mZik7CisgICAgICAgIHRjcF9saW5nZXIgPSBnZXRfbGluZ2VyX29wdC5sX29ub2ZmOworICAgICAgICB0Y3BfbGluZ2VyX3RtbyA9IGdldF9saW5nZXJfb3B0LmxfbGluZ2VyOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisjZWxzZQorICAgIGRlYnVnKEYxMDAsIlRDUCBja19saW5nZXIgU09fTElOR0VSIG5vdCBkZWZpbmVkIiwiIiwwKTsKKyNlbmRpZiAvKiBTT19MSU5HRVIgKi8KKyNlbHNlCisgICAgZGVidWcoRjEwMCwiVENQIGNrX2xpbmdlciBTT19TT0NLRVQgbm90IGRlZmluZWQiLCIiLDApOworI2VuZGlmIC8qIFNPTF9TT0NLRVQgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorc2VuZGJ1Zihzb2NrLHNpemUpIGludCBzb2NrOyBpbnQgc2l6ZTsgeworLyoKKyAgVGhlIGZvbGxvd2luZywgZnJvbSBXaWxsaWFtIEJhZGVyLCBhbGxvd3MgY2hhbmdpbmcgb2Ygc29ja2V0IGJ1ZmZlciBzaXplcywKKyAgaW4gY2FzZSB0aGF0IG1pZ2h0IGFmZmVjdCBwZXJmb3JtYW5jZS4KKworICBNb2RpZmllZCBieSBKZWZmIEFsdG1hbiB0byBiZSBnZW5lcmFsbHkgdXNlZnVsLgorKi8KKyNpZmRlZiBTT0xfU09DS0VUCisjaWZkZWYgU09fU05EQlVGCisgICAgaW50IGksIGo7CisgICAgU09DS09QVF9UIHg7CisKKyNpZmRlZiBJS1NECisgICAgaWYgKCFpbnNlcnZlcikKKyNlbmRpZiAvKiBJS1NEICovCisgICAgICBpZiAoc29jayA9PSAtMSB8fAorICAgICAgICBuZXR0eXBlICE9IE5FVF9UQ1BBICYmIG5ldHR5cGUgIT0gTkVUX1RDUEIgJiYgbmV0dHlwZSAhPSBORVRfU1NICisgICAgICAgICAgICAgICAgfHwgdHRtZG0gPj0gMCkgeworICAgICAgICB0Y3Bfc2VuZGJ1ZiA9IHNpemU7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICB4ID0gc2l6ZW9mKGkpOworICAgIGlmIChnZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIgKikmaSwgJngpKSB7CisgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBzZW5kYnVmIGNhbid0IGdldCBTT19TTkRCVUYiLGNrX2VycnN0cigpLGVycm5vKTsKKyAgICB9IGVsc2UgaWYgKHggIT0gc2l6ZW9mKGkpKSB7CisjaWZkZWYgT1MyCisgICAgICAgIHNob3J0IGkxNixqMTY7CisgICAgICAgIGlmICh4ID09IHNpemVvZihpMTYpKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJUQ1Agc2VuZGJ1ZiB3YXJuaW5nOiBTT19TTkRCVUYiLCJsZW4gaXMgMTYtYml0Iix4KTsKKyAgICAgICAgICAgIGlmIChnZXRzb2Nrb3B0KHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULCBTT19TTkRCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZpMTYsICZ4KQorICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBzZW5kYnVmIGNhbid0IGdldCBTT19TTkRCVUYiLAorICAgICAgICAgICAgICAgICAgICAgIGNrX2VycnN0cigpLGVycm5vKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgdGNwX3NlbmRidWYgPSBpMTY7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiVENQIHNlbmRidWYgU09fU05EQlVGIHJldHJpZXZlZCIsIiIsaTE2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaTE2ICE9IHNpemUpIHsKKyAgICAgICAgICAgICAgICBqMTYgPSBzaXplOworICAgICAgICAgICAgICAgIGlmIChzZXRzb2Nrb3B0KHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT19TTkRCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmajE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihqMTYpKQorICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiVENQIHNlbmRidWYgY2FuJ3Qgc2V0IFNPX1NOREJVRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNrX2VycnN0cigpLGVycm5vKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJUQ1Agc2VuZGJ1ZiBvbGQgU09fU05EQlVGIiwiIixpMTYpOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJUQ1Agc2VuZGJ1ZiBuZXcgU09fU05EQlVGIiwiIixqMTYpOworICAgICAgICAgICAgICAgICAgICB0Y3Bfc2VuZGJ1ZiA9IHNpemU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiVENQIHNlbmRidWYgU09fU05EQlVGIHVuY2hhbmdlZCIsIiIsaTE2KTsKKyAgICAgICAgICAgICAgICB0Y3Bfc2VuZGJ1ZiA9IHNpemU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgZGVidWcoRjExMSwiVENQIHNlbmRidWYgZXJyb3I6IFNPX1NOREJVRiIsImxlbiIseCk7CisgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBzZW5kYnVmIFNPX1NOREJVRiIsImV4cGVjdGVkIGxlbiIsc2l6ZW9mKGkpKTsKKyAgICAgICAgZGVidWcoRjExMSwiVENQIHNlbmRidWYgU09fU05EQlVGIiwiaSIsaSk7CisgICAgfSBlbHNlIGlmIChzaXplIDw9IDApIHsKKyAgICAgICAgdGNwX3NlbmRidWYgPSBpOworICAgICAgICBkZWJ1ZyhGMTAxLCJUQ1Agc2VuZGJ1ZiBTT19TTkRCVUYgcmV0cmlldmVkIiwiIixpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChpICE9IHNpemUpIHsKKyAgICAgICAgaiA9IHNpemU7CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIgKikmaiwgc2l6ZW9mKGopKSkgeworICAgICAgICAgICAgZGVidWcoRjExMSwiVENQIHNlbmRidWYgY2FuJ3Qgc2V0IFNPX1NOREJVRiIsY2tfZXJyc3RyKCksZXJybm8pOworICAgICAgICAgICAgdGNwX3NlbmRidWYgPSBpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWcoRjEwMSwiVENQIHNlbmRidWYgb2xkIFNPX1NOREJVRiIsIiIsaSk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJUQ1Agc2VuZGJ1ZiBuZXcgU09fU05EQlVGIiwiIixqKTsKKyAgICAgICAgICAgIHRjcF9zZW5kYnVmID0gc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVidWcoRjEwMSwiVENQIHNlbmRidWYgU09fU05EQlVGIHVuY2hhbmdlZCIsIiIsaSk7CisgICAgICAgIHRjcF9zZW5kYnVmID0gc2l6ZTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2Vsc2UKKyAgICBkZWJ1ZyhGMTAwLCJUQ1Agc2VuZGJ1ZiBTT19TTkRCVUYgbm90IGRlZmluZWQiLCIiLDApOworI2VuZGlmIC8qIFNPX1NOREJVRiAqLworI2Vsc2UKKyAgICBkZWJ1ZyhGMTAwLCJUQ1Agc2VuZGJ1ZiBTT19TT0NLRVQgbm90IGRlZmluZWQiLCIiLDApOworI2VuZGlmIC8qIFNPTF9TT0NLRVQgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorcmVjdmJ1Zihzb2NrLHNpemUpIGludCBzb2NrOyBpbnQgc2l6ZTsgeworLyoKKyAgVGhlIGZvbGxvd2luZywgZnJvbSBXaWxsaWFtIEJhZGVyLCBhbGxvd3MgY2hhbmdpbmcgb2Ygc29ja2V0IGJ1ZmZlciBzaXplcywKKyAgaW4gY2FzZSB0aGF0IG1pZ2h0IGFmZmVjdCBwZXJmb3JtYW5jZS4KKworICBNb2RpZmllZCBieSBKZWZmIEFsdG1hbiB0byBiZSBnZW5lcmFsbHkgdXNlZnVsLgorKi8KKyNpZmRlZiBTT0xfU09DS0VUCisjaWZkZWYgU09fUkNWQlVGCisgICAgaW50IGksIGo7CisgICAgU09DS09QVF9UIHg7CisKKyNpZmRlZiBJS1NECisgICAgaWYgKCFpbnNlcnZlcikKKyNlbmRpZiAvKiBJS1NEICovCisgICAgICBpZiAoc29jayA9PSAtMSB8fAorCSAgbmV0dHlwZSAhPSBORVRfVENQQSAmJiBuZXR0eXBlICE9IE5FVF9UQ1BCICYmCisJICBuZXR0eXBlICE9IE5FVF9TU0ggfHwgdHRtZG0gPj0gMCkgeworICAgICAgICB0Y3BfcmVjdmJ1ZiA9IHNpemU7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisgICAgeCA9IHNpemVvZihpKTsKKyAgICBpZiAoZ2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyICopJmksICZ4KSkgeworICAgICAgICBkZWJ1ZyhGMTExLCJUQ1AgcmVjdmJ1ZiBjYW4ndCBnZXQgU09fUkNWQlVGIixja19lcnJzdHIoKSxlcnJubyk7CisgICAgfSBlbHNlIGlmICh4ICE9IHNpemVvZihpKSkgeworI2lmZGVmIE9TMgorICAgICAgICBzaG9ydCBpMTYsajE2OworICAgICAgICBpZiAoIHggPT0gc2l6ZW9mKGkxNikgKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJUQ1AgcmVjdmJ1ZiB3YXJuaW5nOiBTT19SQ1ZCVUYiLCJsZW4gaXMgMTYtYml0Iix4KTsKKyAgICAgICAgICAgIGlmIChnZXRzb2Nrb3B0KHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZpMTYsICZ4KQorICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIlRDUCByZWN2YnVmIGNhbid0IGdldCBTT19SQ1ZCVUYiLAorICAgICAgICAgICAgICAgICAgICAgIGNrX2VycnN0cigpLGVycm5vKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgdGNwX3JlY3ZidWYgPSBpMTY7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiVENQIHJlY3ZidWYgU09fUkNWQlVGIHJldHJpZXZlZCIsIiIsaTE2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaTE2ICE9IHNpemUpIHsKKyAgICAgICAgICAgICAgICBqMTYgPSBzaXplOworICAgICAgICAgICAgICAgIGlmIChzZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIgKikmajE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihqMTYpKSkgeworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJUQ1AgcmVjdmJ1ZiBjYW4nIHNldCBTT19SQ1ZCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBja19lcnJzdHIoKSxlcnJubyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiVENQIHJlY3ZidWYgb2xkIFNPX1JDVkJVRiIsIiIsaTE2KTsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiVENQIHJlY3ZidWYgbmV3IFNPX1JDVkJVRiIsIiIsajE2KTsKKyAgICAgICAgICAgICAgICAgICAgdGNwX3JlY3ZidWYgPSBzaXplOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsIlRDUCByZWN2YnVmIFNPX1JDVkJVRiB1bmNoYW5nZWQiLCIiLGkxNik7CisgICAgICAgICAgICAgICAgdGNwX3JlY3ZidWYgPSBzaXplOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIGRlYnVnKEYxMTEsIlRDUCByZWN2YnVmIGVycm9yOiBTT19SQ1ZCVUYiLCJsZW4iLHgpOworICAgICAgICBkZWJ1ZyhGMTExLCJUQ1AgcmVjdmJ1ZiBTT19SQ1ZCVUYiLCJleHBlY3RlZCBsZW4iLHNpemVvZihpKSk7CisgICAgICAgIGRlYnVnKEYxMTEsIlRDUCByZWN2YnVmIFNPX1JDVkJVRiIsImkiLGkpOworICAgIH0gZWxzZSBpZiAoc2l6ZSA8PSAwKSB7CisgICAgICAgIHRjcF9yZWN2YnVmID0gaTsKKyAgICAgICAgZGVidWcoRjEwMSwiVENQIHJlY3ZidWYgU09fUkNWQlVGIHJldHJpZXZlZCIsIiIsaSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAoaSAhPSBzaXplKSB7CisgICAgICAgIGogPSBzaXplOworICAgICAgICBpZiAoc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyICopJmosIHNpemVvZihqKSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIlRDUCByZWN2YnVmIGNhbid0IHNldCBTT19SQ1ZCVUYiLGNrX2VycnN0cigpLGVycm5vKTsKKyAgICAgICAgICAgIHRjcF9yZWN2YnVmID0gaTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIlRDUCByZWN2YnVmIG9sZCBTT19SQ1ZCVUYiLCIiLGkpOworICAgICAgICAgICAgZGVidWcoRjEwMSwiVENQIHJlY3ZidWYgbmV3IFNPX1JDVkJVRiIsIiIsaik7CisgICAgICAgICAgICB0Y3BfcmVjdmJ1ZiA9IHNpemU7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRlYnVnKEYxMDEsIlRDUCByZWN2YnVmIFNPX1JDVkJVRiB1bmNoYW5nZWQiLCIiLGkpOworICAgICAgICB0Y3BfcmVjdmJ1ZiA9IHNpemU7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbHNlCisgICAgZGVidWcoRjEwMCwiVENQIHJlY3ZidWYgU09fUkNWQlVGIG5vdCBkZWZpbmVkIiwiIiwwKTsKKyNlbmRpZiAvKiBTT19SQ1ZCVUYgKi8KKyNlbHNlCisgICAgZGVidWcoRjEwMCwiVENQIHJlY3ZidWYgU09fU09DS0VUIG5vdCBkZWZpbmVkIiwiIiwwKTsKKyNlbmRpZiAvKiBTT0xfU09DS0VUICovCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAora2VlcGFsaXZlKHNvY2ssb25vZmYpIGludCBzb2NrOyBpbnQgb25vZmY7IHsKKyNpZmRlZiBTT0xfU09DS0VUCisjaWZkZWYgU09fS0VFUEFMSVZFCisgICAgaW50IGdldF9rZWVwYWxpdmVfb3B0OworICAgIGludCBzZXRfa2VlcGFsaXZlX29wdDsKKyAgICBTT0NLT1BUX1QgeDsKKworICAgIGRlYnVnKEYxMTEsIlRDUCBrZWVwYWxpdmUiLCJzb2NrIixzb2NrKTsKKyAgICBkZWJ1ZyhGMTExLCJUQ1Aga2VlcGFsaXZlIiwibmV0dHlwZSIsbmV0dHlwZSk7CisgICAgZGVidWcoRjExMSwiVENQIGtlZXBhbGl2ZSIsInR0bWRtIix0dG1kbSk7CisKKyNpZmRlZiBJS1NECisgICAgaWYgKCFpbnNlcnZlcikKKyNlbmRpZiAvKiBJS1NEICovCisgICAgICBpZiAoc29jayA9PSAtMSB8fAorICAgICAgICBuZXR0eXBlICE9IE5FVF9UQ1BBICYmIG5ldHR5cGUgIT0gTkVUX1RDUEIgJiYgbmV0dHlwZSAhPSBORVRfU1NICisgICAgICAgICAgICAgICAgfHwgdHRtZG0gPj0gMCkgeworICAgICAgICB0Y3Bfa2VlcGFsaXZlID0gb25vZmY7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICB4ID0gc2l6ZW9mKGdldF9rZWVwYWxpdmVfb3B0KTsKKyAgICBpZiAoZ2V0c29ja29wdChzb2NrLAorICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIgKikmZ2V0X2tlZXBhbGl2ZV9vcHQsICZ4KSkgeworICAgICAgICBkZWJ1ZyhGMTExLCJUQ1Aga2VlcGFsaXZlIGNhbid0IGdldCBTT19LRUVQQUxJVkUiLGNrX2VycnN0cigpLGVycm5vKTsKKyAgICB9IGVsc2UgaWYgKHggIT0gc2l6ZW9mKGdldF9rZWVwYWxpdmVfb3B0KSkgeworI2lmZGVmIE9TMgorICAgICAgICBzaG9ydCBnZXRfa2VlcGFsaXZlX29wdDE2OworICAgICAgICBzaG9ydCBzZXRfa2VlcGFsaXZlX29wdDE2OworICAgICAgICBpZiAoeCA9PSBzaXplb2YoZ2V0X2tlZXBhbGl2ZV9vcHQxNikpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBrZWVwYWxpdmUgd2FybmluZzogU09fS0VFUEFMSVZFIiwKKyAgICAgICAgICAgICAgICAgICJsZW4gaXMgMTYtYml0Iix4KTsKKyAgICAgICAgICAgIGlmIChnZXRzb2Nrb3B0KHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZnZXRfa2VlcGFsaXZlX29wdDE2LCAmeCkKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLAorICAgICAgICAgICAgICAgICAgICAgICJUQ1Aga2VlcGFsaXZlIGNhbid0IGdldCBTT19LRUVQQUxJVkUiLAorICAgICAgICAgICAgICAgICAgICAgIGNrX2VycnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgIGVycm5vCisgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0X2tlZXBhbGl2ZV9vcHQxNiAhPSBvbm9mZikgeworICAgICAgICAgICAgICAgIHNldF9rZWVwYWxpdmVfb3B0MTYgPSBvbm9mZjsKKyAgICAgICAgICAgICAgICBpZiAoc2V0c29ja29wdChzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09fS0VFUEFMSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnNldF9rZWVwYWxpdmVfb3B0MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNldF9rZWVwYWxpdmVfb3B0MTYpKQorICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDUCBrZWVwYWxpdmUgY2FuJ3QgY2xlYXIgU09fS0VFUEFMSVZFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2tfZXJyc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIHRjcF9rZWVwYWxpdmUgPSBnZXRfa2VlcGFsaXZlX29wdDE2OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUQ1Aga2VlcGFsaXZlIG5ldyBTT19LRUVQQUxJVkUiLCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfa2VlcGFsaXZlX29wdDE2KTsKKyAgICAgICAgICAgICAgICAgICAgdGNwX2tlZXBhbGl2ZSA9IHNldF9rZWVwYWxpdmVfb3B0MTY7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiVENQIGtlZXBhbGl2ZSBTT19LRUVQQUxJVkUgdW5jaGFuZ2VkIiwiIiwKKyAgICAgICAgICAgICAgICAgICAgICBnZXRfa2VlcGFsaXZlX29wdDE2KTsKKyAgICAgICAgICAgICAgICB0Y3Bfa2VlcGFsaXZlID0gb25vZmY7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgZGVidWcoRjExMSwiVENQIGtlZXBhbGl2ZSBlcnJvcjogU09fS0VFUEFMSVZFIiwibGVuIix4KTsKKyAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgIlRDUCBrZWVwYWxpdmUgU09fS0VFUEFMSVZFIiwKKyAgICAgICAgICAgICAgImV4cGVjdGVkIGxlbiIsCisgICAgICAgICAgICAgIHNpemVvZihnZXRfa2VlcGFsaXZlX29wdCkKKyAgICAgICAgICAgICAgKTsKKyAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgIlRDUCBrZWVwYWxpdmUgU09fS0VFUEFMSVZFIiwKKyAgICAgICAgICAgICAgImtlZXBhbGl2ZV9vcHQiLAorICAgICAgICAgICAgICBnZXRfa2VlcGFsaXZlX29wdAorICAgICAgICAgICAgICApOworICAgIH0gZWxzZSBpZiAoZ2V0X2tlZXBhbGl2ZV9vcHQgIT0gb25vZmYpIHsKKyAgICAgICAgICAgIHNldF9rZWVwYWxpdmVfb3B0ID0gb25vZmY7CisgICAgICAgICAgICBpZiAoc2V0c29ja29wdChzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09fS0VFUEFMSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnNldF9rZWVwYWxpdmVfb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzZXRfa2VlcGFsaXZlX29wdCkpCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgICAgICAgICAiVENQIGtlZXBhbGl2ZSBjYW4ndCBjbGVhciBTT19LRUVQQUxJVkUiLAorICAgICAgICAgICAgICAgICAgICAgIGNrX2VycnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgIGVycm5vCisgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB0Y3Bfa2VlcGFsaXZlID0gZ2V0X2tlZXBhbGl2ZV9vcHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsCisgICAgICAgICAgICAgICAgICAgICAgIlRDUCBrZWVwYWxpdmUgbmV3IFNPX0tFRVBBTElWRSIsCisgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgc2V0X2tlZXBhbGl2ZV9vcHQKKyAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHRjcF9rZWVwYWxpdmUgPSBvbm9mZjsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIlRDUCBrZWVwYWxpdmUgU09fS0VFUEFMSVZFIHVuY2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgIGdldF9rZWVwYWxpdmVfb3B0CisgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgdGNwX2tlZXBhbGl2ZSA9IG9ub2ZmOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2Vsc2UKKyAgICBkZWJ1ZyhGMTAwLCJUQ1Aga2VlcGFsaXZlIFNPX0tFRVBBTElWRSBub3QgZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYgLyogU09fS0VFUEFMSVZFICovCisjZWxzZQorICAgIGRlYnVnKEYxMDAsIlRDUCBrZWVwYWxpdmUgU09fU09DS0VUIG5vdCBkZWZpbmVkIiwiIiwwKTsKKyNlbmRpZiAvKiBTT0xfU09DS0VUICovCisgICAgcmV0dXJuKDApOworfQorCitpbnQKK2RvbnRyb3V0ZShzb2NrLG9ub2ZmKSBpbnQgc29jazsgaW50IG9ub2ZmOyB7CisjaWZkZWYgU09MX1NPQ0tFVAorI2lmZGVmIFNPX0RPTlRST1VURQorICAgIGludCBnZXRfZG9udHJvdXRlX29wdDsKKyAgICBpbnQgc2V0X2RvbnRyb3V0ZV9vcHQ7CisgICAgU09DS09QVF9UIHg7CisKKyNpZmRlZiBJS1NECisgICAgaWYgKCFpbnNlcnZlcikKKyNlbmRpZiAvKiBJS1NEICovCisgICAgICBpZiAoc29jayA9PSAtMSB8fAorICAgICAgICBuZXR0eXBlICE9IE5FVF9UQ1BBICYmIG5ldHR5cGUgIT0gTkVUX1RDUEIgJiYgbmV0dHlwZSAhPSBORVRfU1NICisgICAgICAgICAgICAgICAgfHwgdHRtZG0gPj0gMCkgeworICAgICAgICB0Y3BfZG9udHJvdXRlID0gb25vZmY7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICB4ID0gc2l6ZW9mKGdldF9kb250cm91dGVfb3B0KTsKKyAgICBpZiAoZ2V0c29ja29wdChzb2NrLAorICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSwgKGNoYXIgKikmZ2V0X2RvbnRyb3V0ZV9vcHQsICZ4KSkgeworICAgICAgICBkZWJ1ZyhGMTExLCJUQ1AgZG9udHJvdXRlIGNhbid0IGdldCBTT19ET05UUk9VVEUiLGNrX2VycnN0cigpLGVycm5vKTsKKyAgICB9IGVsc2UgaWYgKHggIT0gc2l6ZW9mKGdldF9kb250cm91dGVfb3B0KSkgeworI2lmZGVmIE9TMgorICAgICAgICBzaG9ydCBnZXRfZG9udHJvdXRlX29wdDE2OworICAgICAgICBzaG9ydCBzZXRfZG9udHJvdXRlX29wdDE2OworICAgICAgICBpZiAoeCA9PSBzaXplb2YoZ2V0X2RvbnRyb3V0ZV9vcHQxNikpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBkb250cm91dGUgd2FybmluZzogU09fRE9OVFJPVVRFIiwKKyAgICAgICAgICAgICAgICAgICJsZW4gaXMgMTYtYml0Iix4KTsKKyAgICAgICAgICAgIGlmIChnZXRzb2Nrb3B0KHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULCBTT19ET05UUk9VVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZnZXRfZG9udHJvdXRlX29wdDE2LCAmeCkKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLAorICAgICAgICAgICAgICAgICAgICAgICJUQ1AgZG9udHJvdXRlIGNhbid0IGdldCBTT19ET05UUk9VVEUiLAorICAgICAgICAgICAgICAgICAgICAgIGNrX2VycnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgIGVycm5vCisgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0X2RvbnRyb3V0ZV9vcHQxNiAhPSBvbm9mZikgeworICAgICAgICAgICAgICAgIHNldF9kb250cm91dGVfb3B0MTYgPSBvbm9mZjsKKyAgICAgICAgICAgICAgICBpZiAoc2V0c29ja29wdChzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09fRE9OVFJPVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnNldF9kb250cm91dGVfb3B0MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNldF9kb250cm91dGVfb3B0MTYpKQorICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDUCBkb250cm91dGUgY2FuJ3QgY2xlYXIgU09fRE9OVFJPVVRFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2tfZXJyc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIHRjcF9kb250cm91dGUgPSBnZXRfZG9udHJvdXRlX29wdDE2OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUQ1AgZG9udHJvdXRlIG5ldyBTT19ET05UUk9VVEUiLCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZG9udHJvdXRlX29wdDE2KTsKKyAgICAgICAgICAgICAgICAgICAgdGNwX2RvbnRyb3V0ZSA9IHNldF9kb250cm91dGVfb3B0MTY7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiVENQIGRvbnRyb3V0ZSBTT19ET05UUk9VVEUgdW5jaGFuZ2VkIiwiIiwKKyAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9udHJvdXRlX29wdDE2KTsKKyAgICAgICAgICAgICAgICB0Y3BfZG9udHJvdXRlID0gb25vZmY7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgZGVidWcoRjExMSwiVENQIGRvbnRyb3V0ZSBlcnJvcjogU09fRE9OVFJPVVRFIiwibGVuIix4KTsKKyAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgIlRDUCBkb250cm91dGUgU09fRE9OVFJPVVRFIiwKKyAgICAgICAgICAgICAgImV4cGVjdGVkIGxlbiIsCisgICAgICAgICAgICAgIHNpemVvZihnZXRfZG9udHJvdXRlX29wdCkKKyAgICAgICAgICAgICAgKTsKKyAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgIlRDUCBkb250cm91dGUgU09fRE9OVFJPVVRFIiwKKyAgICAgICAgICAgICAgImRvbnRyb3V0ZV9vcHQiLAorICAgICAgICAgICAgICBnZXRfZG9udHJvdXRlX29wdAorICAgICAgICAgICAgICApOworICAgIH0gZWxzZSBpZiAoZ2V0X2RvbnRyb3V0ZV9vcHQgIT0gb25vZmYpIHsKKyAgICAgICAgICAgIHNldF9kb250cm91dGVfb3B0ID0gb25vZmY7CisgICAgICAgICAgICBpZiAoc2V0c29ja29wdChzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09fRE9OVFJPVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnNldF9kb250cm91dGVfb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzZXRfZG9udHJvdXRlX29wdCkpCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgICAgICAgICAiVENQIGRvbnRyb3V0ZSBjYW4ndCBjbGVhciBTT19ET05UUk9VVEUiLAorICAgICAgICAgICAgICAgICAgICAgIGNrX2VycnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgIGVycm5vCisgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB0Y3BfZG9udHJvdXRlID0gZ2V0X2RvbnRyb3V0ZV9vcHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsCisgICAgICAgICAgICAgICAgICAgICAgIlRDUCBkb250cm91dGUgbmV3IFNPX0RPTlRST1VURSIsCisgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgc2V0X2RvbnRyb3V0ZV9vcHQKKyAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHRjcF9kb250cm91dGUgPSBvbm9mZjsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIlRDUCBkb250cm91dGUgU09fRE9OVFJPVVRFIHVuY2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgIGdldF9kb250cm91dGVfb3B0CisgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgdGNwX2RvbnRyb3V0ZSA9IG9ub2ZmOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2Vsc2UKKyAgICBkZWJ1ZyhGMTAwLCJUQ1AgZG9udHJvdXRlIFNPX0RPTlRST1VURSBub3QgZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYgLyogU09fRE9OVFJPVVRFICovCisjZWxzZQorICAgIGRlYnVnKEYxMDAsIlRDUCBkb250cm91dGUgU09fU09DS0VUIG5vdCBkZWZpbmVkIiwiIiwwKTsKKyNlbmRpZiAvKiBTT0xfU09DS0VUICovCisgICAgcmV0dXJuKDApOworfQorCitpbnQKK25vX2RlbGF5KHNvY2ssb25vZmYpICBpbnQgc29jazsgaW50IG9ub2ZmOyB7CisjaWZkZWYgU09MX1NPQ0tFVAorI2lmZGVmIFRDUF9OT0RFTEFZCisgICAgaW50IGdldF9ub2RlbGF5X29wdDsKKyAgICBpbnQgc2V0X25vZGVsYXlfb3B0OworICAgIFNPQ0tPUFRfVCB4OworCisjaWZkZWYgSUtTRAorICAgIGlmICghaW5zZXJ2ZXIpCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgaWYgKHNvY2sgPT0gLTEgfHwKKyAgICAgICAgbmV0dHlwZSAhPSBORVRfVENQQSAmJiBuZXR0eXBlICE9IE5FVF9UQ1BCICYmIG5ldHR5cGUgIT0gTkVUX1NTSAorICAgICAgICAgICAgICAgIHx8IHR0bWRtID49IDApIHsKKyAgICAgICAgdGNwX25vZGVsYXkgPSBvbm9mZjsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKyAgICB4ID0gc2l6ZW9mKGdldF9ub2RlbGF5X29wdCk7CisgICAgaWYgKGdldHNvY2tvcHQoc29jayxJUFBST1RPX1RDUCxUQ1BfTk9ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZnZXRfbm9kZWxheV9vcHQsJngpKSB7CisgICAgICAgIGRlYnVnKEYxMTEsCisgICAgICAgICAgICAgICJUQ1Agbm9fZGVsYXkgY2FuJ3QgZ2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgICAgICAgICAgY2tfZXJyc3RyKCksCisgICAgICAgICAgICAgIGVycm5vKTsKKyAgICB9IGVsc2UgaWYgKHggIT0gc2l6ZW9mKGdldF9ub2RlbGF5X29wdCkpIHsKKyNpZmRlZiBPUzIKKyAgICAgICAgc2hvcnQgZ2V0X25vZGVsYXlfb3B0MTY7CisgICAgICAgIHNob3J0IHNldF9ub2RlbGF5X29wdDE2OworICAgICAgICBpZiAoeCA9PSBzaXplb2YoZ2V0X25vZGVsYXlfb3B0MTYpKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJUQ1Agbm9fZGVsYXkgd2FybmluZzogVENQX05PREVMQVkiLCJsZW4gaXMgMTYtYml0Iix4KTsKKyAgICAgICAgICAgIGlmIChnZXRzb2Nrb3B0KHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJUFBST1RPX1RDUCwgVENQX05PREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZnZXRfbm9kZWxheV9vcHQxNiwgJngpCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgICAgICAgICAiVENQIG5vX2RlbGF5IGNhbid0IGdldCBUQ1BfTk9ERUxBWSIsCisgICAgICAgICAgICAgICAgICAgICAgY2tfZXJyc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgZXJybm8pOworICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRfbm9kZWxheV9vcHQxNiAhPSBvbm9mZikgeworICAgICAgICAgICAgICAgIHNldF9ub2RlbGF5X29wdDE2ID0gb25vZmY7CisgICAgICAgICAgICAgICAgaWYgKHNldHNvY2tvcHQoc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUFBST1RPX1RDUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ1BfTk9ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZzZXRfbm9kZWxheV9vcHQxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2V0X25vZGVsYXlfb3B0MTYpKQorICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDUCBub19kZWxheSBjYW4ndCBjbGVhciBUQ1BfTk9ERUxBWSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNrX2VycnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubyk7CisgICAgICAgICAgICAgICAgICAgIHRjcF9ub2RlbGF5ID0gZ2V0X25vZGVsYXlfb3B0MTY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDUCBub19kZWxheSBuZXcgVENQX05PREVMQVkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X25vZGVsYXlfb3B0MTYpOworICAgICAgICAgICAgICAgICAgICB0Y3Bfbm9kZWxheSA9IG9ub2ZmOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsIlRDUCBub19kZWxheSBUQ1BfTk9ERUxBWSB1bmNoYW5nZWQiLCIiLAorICAgICAgICAgICAgICAgICAgICAgIGdldF9ub2RlbGF5X29wdDE2KTsKKyAgICAgICAgICAgICAgICB0Y3Bfbm9kZWxheSA9IG9ub2ZmOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBub19kZWxheSBlcnJvcjogVENQX05PREVMQVkiLCJsZW4iLHgpOworICAgICAgICBkZWJ1ZyhGMTExLCJUQ1Agbm9fZGVsYXkgVENQX05PREVMQVkiLCJleHBlY3RlZCBsZW4iLAorICAgICAgICAgICAgICBzaXplb2YoZ2V0X25vZGVsYXlfb3B0KSk7CisgICAgICAgIGRlYnVnKEYxMTEsIlRDUCBub19kZWxheSBUQ1BfTk9ERUxBWSIsIm5vZGVsYXlfb3B0IixnZXRfbm9kZWxheV9vcHQpOworICAgIH0gZWxzZSBpZiAoZ2V0X25vZGVsYXlfb3B0ICE9IG9ub2ZmKSB7CisgICAgICAgIHNldF9ub2RlbGF5X29wdCA9IG9ub2ZmOworICAgICAgICBpZiAoc2V0c29ja29wdChzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICBJUFBST1RPX1RDUCwKKyAgICAgICAgICAgICAgICAgICAgICAgVENQX05PREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnNldF9ub2RlbGF5X29wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNldF9ub2RlbGF5X29wdCkpKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLAorICAgICAgICAgICAgICAgICAgIlRDUCBub19kZWxheSBjYW4ndCBjbGVhciBUQ1BfTk9ERUxBWSIsCisgICAgICAgICAgICAgICAgICBja19lcnJzdHIoKSwKKyAgICAgICAgICAgICAgICAgIGVycm5vCisgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgdGNwX25vZGVsYXkgPSBnZXRfbm9kZWxheV9vcHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJUQ1Agbm9fZGVsYXkgbmV3IFRDUF9OT0RFTEFZIiwiIixzZXRfbm9kZWxheV9vcHQpOworICAgICAgICAgICAgdGNwX25vZGVsYXkgPSBvbm9mZjsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVidWcoRjEwMSwiVENQIG5vX2RlbGF5IFRDUF9OT0RFTEFZIHVuY2hhbmdlZCIsIiIsZ2V0X25vZGVsYXlfb3B0KTsKKyAgICAgICAgdGNwX25vZGVsYXkgPSBvbm9mZjsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKyNlbHNlCisgICAgZGVidWcoRjEwMCwiVENQIG5vX2RlbGF5IFRDUF9OT0RFTEFZIG5vdCBkZWZpbmVkIiwiIiwwKTsKKyNlbmRpZiAvKiBUQ1BfTk9ERUxBWSAqLworI2Vsc2UKKyAgICBkZWJ1ZyhGMTAwLCJUQ1Agbm9fZGVsYXkgU09fU09DS0VUIG5vdCBkZWZpbmVkIiwiIiwwKTsKKyNlbmRpZiAvKiBTT0xfU09DS0VUICovCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBOT1RDUE9QVFMgKi8KKworI2lmZGVmIFNVTlgyNQorI2lmbmRlZiBYMjVfV1JfRkFDSUxJVFkKKy8qIEZvciBTb2xhcmlzIDIuMyAvIFN1bkxpbmsgOC54IC0gc2VlIGNvbW1lbnRzIGluIGNrY25ldC5oICovCit2b2lkCitiemVybyhzLG4pIGNoYXIgKnM7IGludCBuOyB7CisgICAgbWVtc2V0KHMsMCxuKTsKK30KKyNlbmRpZiAvKiBYMjVfV1JfRkFDSUxJVFkgKi8KKyNlbmRpZiAvKiBTVU5YMjUgKi8KKworI2lmZGVmIFRDUFNPQ0tFVAorI2lmbmRlZiBPUzIKKyNpZm5kZWYgTk9MSVNURU4KKworI2lmZGVmIEJTRFNFTEVDVAorI2lmbmRlZiBWTVMKKyNpZm5kZWYgQkVMTFYxMAorI2lmbmRlZiBkYXRhZ2VuZXJhbAorI2lmZGVmIGhwOTAwMHM1MDAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhQLTkwMDAvNTAwIEhQLVUgNS4yMSAqLworI2luY2x1ZGUgPHRpbWUuaD4KKyNlbHNlCisKKy8qKioqKiogVEhJUyBTRUNUSU9OIEFEREVEIEJZIFNURVZFIFJBTkNFIC0gT1M5IE5FVFdPUksgU0VSVkVSCisqICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKgorKiAgICAgICBEdWUgdG8gT1M5J3MgTGFjayBvZiBhIHNlbGVjdCgpIGNhbGwsIHRoZSBmb2xsb3dpbmcgc2VlbXMgdG8gYmUKKyogICAgICAgZW5vdWdoIHRvIGZvb2wgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgaW50byBjb21waWxpbmcuIFRoZSBvbmx5CisqICAgICAgIGVmZmVjdCB0aGF0IEkgY2FuIHNlZSBpcyB1c2luZyBjb250cm9sIEwgdG8gcmVmcmVzaCB0aGUgc3RhdHVzCisqICAgICAgIGRpc3BsYXkgZ2V0cyBxdWVkIHVwIHVudGlsIHNvbWUgbmV0d29yayBwYWNrZXRzIGFycml2ZS4KKyoKKyogICAgICAgVGhpcyBzb2x1dGlvbiBpcyBieSBubyBtZWFucyBlbGVnYW50IGJ1dCB3b3JrcyBlbm91Z2ggdG8gYmUKKyogICAgICAgYSAodGhlKSBzb2x1dGlvbi4KKyoKKyogICAgICAgQWxzbyB3aXRoIHRoZSBkZWZpbmVzIEkgaGFkIHNwZWNpZmllZCBpbiBteSBtYWtlZmlsZSBJIGhhZCB0bworKiAgICAgICBoYXZlIGFuICNlbmRpZiByaWdodCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHdoZW4gY29tcGlsaW5nLgorKiAgICAgICBJIGRpZCBub3QgYm90aGVyIHNwZWRpbmcgdGltZSB0byBmaW5kIG91dCB3aHkuCisqCisqICAgICAgIENPUFRTICAgPSAtdG89b3NrIC1kPU9TSyAtZD1UQ1BTT0NLRVQgLWQ9U0VMRUNUIC1kPVZPSUQ9dm9pZCAtZD1TSUdfViBcCisqICAgICAgICAgIC1kPURZTkFNSUMgLWQ9UEFSU0VOU0UgLWQ9S0FOSkkgLWQ9TVlDVVJTRVMgLWQ9WkZDREFUIFwKKyogICAgICAgICAgLWQ9Q0tfQVBDIC1kPUNLX1JFRElSIC1kPVJFTkFNRSAtZD1DS19UVFlGRCAtZD1OT09MRE1PREVNUyBcCisqICAgICAgICAgIC1kPUNLX0FOU0lDIC1kPUNLX1hZWiAtdHA9NjgwNDBkIC1sPW5ldGRiLmwgLWw9c29ja2xpYi5sIFwKKyogICAgICAgICAgLWw9dGVybWxpYi5sIC1sPW1hdGgubCAtbD1zeXNfY2xpYi5sCisqCisqICAgICAgIHN0ZXZlckBvemVtYWlsLmNvbS5hdQorKi8KKworI2lmZGVmICBPU0sKKyNkZWZpbmUgQlNEU0VMRUNUICAgICAgICAgICAgICAgICAgICAgICAvKiBzd2l0Y2ggb24gQlNEIHNlbGVjdCBjb2RlICovCisjZGVmaW5lIEZEX1NFVFNJWkUgMzIgICAgICAgICAgICAgICAgICAgLyogTWF4ICMgb2YgcGF0aHMgaW4gT1M5ICovCisjZGVmaW5lIEZEX1pFUk8ocCkgICAgICAgICAgICAgICAgICAgICAgKCgqcCk9MCkKKyNkZWZpbmUgRkRfU0VUKG4sYikgICAgICAgICAgICAgICAgICAgICAoKCpiKXw9KDE8PChuKSkpCisjZGVmaW5lIEZEX0lTU0VUKG4sYikgICAgICAgICAgIDEgICAgICAgLyogYWx3YXlzIHNheSBkYXRhIGlzIHJlYWR5ICovCisjZGVmaW5lIHNlbGVjdChhLGIsYyxkLGUpICAgICAgIDEgICAgICAgLyogYWx3YXlzIHNheSAxIHBhdGggaGFzIGRhdGEgKi8KK3R5cGVkZWYgaW50ICAgICBmZF9zZXQ7ICAgICAgICAgICAgICAgICAvKiBrZWVwIEJTRCBDb2RlIEhhcHB5ICovCitzdHJ1Y3QgdGltZXZhbCB7aW50IHR2X3NlYyx0dl91c2VjO307ICAgLyoga2VlcCBCU0QgQ29kZSBIYXBweSAqLworCisvKioqKioqIEVORCBPRiBPUzkgTU9EUyBGUk9NIFNURVZFIFJBTkNFICoqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIE9TSyAqLworCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZiAvKiBocDkwMDBzNTAwICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBCRUxMVjEwICovCisjZW5kaWYgLyogVk1TICovCisjaWZkZWYgU0VMRUNUX0gKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYgLyogU0VMRUNUX0ggKi8KKyNlbmRpZiAvKiBCU0RTRUxFQ1QgKi8KKworI2lmZGVmIFNFTEVDVAorI2lmZGVmIENLX1NDT1Y1CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmIC8qIENLX1NDT1Y1ICovCisjZW5kaWYgLyogU0VMRUNUICovCisKKyNpZmRlZiBOT1RVU0VECisvKiBUIEMgUCBTIE8gQyBLIEUgVCBfIE8gUCBFIE4gLS0gT3BlbiBhIHByZWV4aXN0aW5nIHNvY2tldCBudW1iZXIgKi8KKworaW50Cit0Y3Bzb2NrZXRfb3BlbihuYW1lLGxjbCxuZXR0LHRpbW8pIGNoYXIgKiBuYW1lOyBpbnQgKiBsY2w7IGludCBuZXR0OyBpbnQgdGltbyB7CisgICAgaW50IG9uID0gMTsKKyAgICBzdGF0aWMgc3RydWN0IHNlcnZlbnQgKnNlcnZpY2UsIHNlcnZyZWM7CisgICAgc3RhdGljIHN0cnVjdCBob3N0ZW50ICpob3N0OworICAgIHN0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FkZHI7CisgICAgc3RhdGljCisjaWZkZWYgVUNYNTAKKyAgICAgIHVuc2lnbmVkCisjZW5kaWYgLyogVUNYNTAgKi8KKyAgICAgIGludCBzYWRkcmxlbjsKKyNpZmRlZiBCU0RTRUxFQ1QKKyAgICBmZF9zZXQgcmZkczsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyNlbHNlCisjaWZkZWYgQkVMTFNFTEVDVAorICAgIGZkX3NldCByZmRzOworI2Vsc2UKKyAgICBmZF9zZXQgcmZkczsKKyAgICBmZF9zZXQgcmZkczsKKyAgICBzdHJ1Y3QgdGltZXZhbCB7CisgICAgICAgIGxvbmcgdHZfc2VjOworICAgICAgICBsb25nIHR2X3VzZWM7CisgICAgfSB0djsKKyNlbmRpZiAvKiBCRUxMU0VMRUNUICovCisjZW5kaWYgLyogQlNEU0VMRUNUICovCisKKyAgICBkZWJ1ZyhGMTAxLCJ0Y3Bzb2NrZXRfb3BlbiBuZXR0IiwiIixuZXR0KTsKKyAgICAqaXBhZGRyID0gJ1wwJzsKKworICAgIGlmIChuZXR0ICE9IE5FVF9UQ1BCKQorICAgICAgcmV0dXJuKC0xKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJTRCBzb2NrZXQgc3VwcG9ydCAqLworCisgICAgbmV0Y2xvcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xvc2UgYW55IHByZXZpb3VzIGNvbm5lY3Rpb24uICovCisgICAgY2tzdHJuY3B5KG5hbWVjb3B5LCBuYW1lLCBOQU1FQ1BZTCk7IC8qIENvcHkgdGhlIGhvc3RuYW1lLiAqLworICAgIGlmICh0dG5wcm90byAhPSBOUF9UQ1BSQVcpCisgICAgICB0dG5wcm90byA9IE5QX05PTkU7ICAgICAgICAgICAgICAgLyogTm8gcHJvdG9jb2wgc2VsZWN0ZWQgeWV0LiAqLworICAgIGRlYnVnKEYxMTAsInRjcHNvY2tldF9vcGVuIG5hbWVjb3B5IixuYW1lY29weSwwKTsKKworICAgIC8qIEFzc2lnbiB0aGUgc29ja2V0IG51bWJlciB0byB0dHlmZCBhbmQgdGhlbiBmaWxsIGluIHRjcCBzdHJ1Y3R1cmVzICovCisgICAgdHR5ZmQgPSBhdG9pKCZuYW1lWzFdKTsKKyAgICBkZWJ1ZyhGMTExLCJ0Y3Bzb2NrZXRfb3BlbiIsInR0eWZkIix0dHlmZCk7CisKKyNpZm5kZWYgTk9UQ1BPUFRTCisjaWZkZWYgU09MX1NPQ0tFVAorICAgIHNldHNvY2tvcHQodHR5ZmQsIFNPTF9TT0NLRVQsIFNPX09PQklOTElORSwoY2hhciAqKSAmb24sIHNpemVvZiBvbik7CisKKyNpZm5kZWYgZGF0YWdlbmVyYWwKKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgIG5vX2RlbGF5KHR0eWZkLHRjcF9ub2RlbGF5KTsKKyNlbmRpZiAvKiBUQ1BfTk9ERUxBWSAqLworI2lmZGVmIFNPX0tFRVBBTElWRQorICAgIGtlZXBhbGl2ZSh0dHlmZCx0Y3Bfa2VlcGFsaXZlKTsKKyNlbmRpZiAvKiBTT19LRUVQQUxJVkUgKi8KKyNpZmRlZiBTT19MSU5HRVIKKyAgICBja19saW5nZXIodHR5ZmQsdGNwX2xpbmdlciwgdGNwX2xpbmdlcl90bW8pOworI2VuZGlmIC8qIFNPX0xJTkdFUiAqLworI2lmZGVmIFNPX1NOREJVRgorICAgIHNlbmRidWYodHR5ZmQsdGNwX3NlbmRidWYpOworI2VuZGlmIC8qIFNPX1NOREJVRiAqLworI2lmZGVmIFNPX1JDVkJVRgorICAgIHJlY3ZidWYodHR5ZmQsdGNwX3JlY3ZidWYpOworI2VuZGlmIC8qIFNPX1JDVkJVRiAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogU09MX1NPQ0tFVCAqLworI2VuZGlmIC8qIE5PVENQT1BUUyAqLworCisjaWZkZWYgTlRfVENQX09WRVJMQVBQRUQKKyAgICBPdmVybGFwcGVkV3JpdGVJbml0KCk7CisgICAgT3ZlcmxhcHBlZFJlYWRJbml0KCk7CisjZW5kaWYgLyogTlRfVENQX09WRVJMQVBQRUQgKi8KKworCisgICAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBob3N0IHdlIGFyZSBjb25uZWN0ZWQgdG8gKi8KKworICAgIHNhZGRybGVuID0gc2l6ZW9mKHNhZGRyKTsKKyAgICBnZXRwZWVybmFtZSh0dHlmZCwoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCZzYWRkcmxlbik7CisKKyAgICBja3N0cm5jcHkoaXBhZGRyLChjaGFyICopaW5ldF9udG9hKHNhZGRyLnNpbl9hZGRyKSwyMCk7CisKKyAgICBpZiAodGNwX3JkbnMgPT0gU0VUX09OCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAgICAgfHwgdGNwX3JkbnMgPT0gU0VUX0FVVE8gJiYKKyAgICAgICAgIChja19rcmI1X2lzX2luc3RhbGxlZCgpIHx8IGNrX2tyYjRfaXNfaW5zdGFsbGVkKCkpCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyNpZm5kZWYgTk9IVFRQCisgICAgICAgICAgJiYgKHRjcF9odHRwX3Byb3h5ID09IE5VTEwpCisjZW5kaWYgLyogTk9IVFRQICovCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgJiYgIShzc2xfb25seV9mbGFnIHx8IHRsc19vbmx5X2ZsYWcpCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV2ZXJzZSBETlMgKi8KKyAgICAgICAgaWYgKCFxdWlldCkgeworICAgICAgICAgICAgcHJpbnRmKCIgUmV2ZXJzZSBETlMgTG9va3VwLi4uICIpOworICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaG9zdCA9IGdldGhvc3RieWFkZHIoKGNoYXIgKikmc2FkZHIuc2luX2FkZHIsNCxQRl9JTkVUKTsKKyAgICAgICAgZGVidWcoRjExMCwidGNwc29ja2V0X29wZW4gZ2V0aG9zdGJ5YWRkciIsaG9zdCA/ICJPSyIgOiAiRkFJTEVEIiwwKTsKKyAgICAgICAgaWYgKGhvc3QpIHsKKyAgICAgICAgICAgIGhvc3QgPSBja19jb3B5aG9zdGVudChob3N0KTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsInRjcHNvY2tldF9vcGVuIGdldGhvc3RieWFkZHIgIT0gTlVMTCIsIiIsMCk7CisgICAgICAgICAgICBpZiAoIXF1aWV0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIoT0spXG4iKTsKKyAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNrc3RybmNweShuYW1lLCBob3N0LT5oX25hbWUsIDgwKTsKKyAgICAgICAgICAgIGNrc3RybmNhdChuYW1lLCAiOiIsIDgwKTsKKyAgICAgICAgICAgIGNrc3RybmNhdChuYW1lLGNrdWl0b2EobnRvaHMoc2FkZHIuc2luX3BvcnQpKSwgODApOworICAgICAgICAgICAgaWYgKCFxdWlldAorI2lmbmRlZiBOT0lDUAorICAgICAgICAgICAgICAgICYmICFkb2NvbngKKyNlbmRpZiAvKiBOT0lDUCAqLworICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgcHJpbnRmKCIlcyBjb25uZWN0ZWQgb24gcG9ydCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBob3N0LT5oX25hbWUsCisgICAgICAgICAgICAgICAgICAgbnRvaHMoc2FkZHIuc2luX3BvcnQpCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfSBlbHNlIGlmICghcXVpZXQpCisgICAgICAgICAgcHJpbnRmKCJGYWlsZWRcbiIpOworICAgIH0gZWxzZSBpZiAoIXF1aWV0KQorICAgICAgcHJpbnRmKCIoT0spXG4iKTsKKworICAgIGlmICh0Y3BfcmRucyAhPSBTRVRfT04gfHwgIWhvc3QpIHsKKyAgICAgICAgY2tzdHJuY3B5KG5hbWUsaXBhZGRyLDgwKTsKKyAgICAgICAgY2tzdHJuY2F0KG5hbWUsIjoiLDgwKTsKKyAgICAgICAgY2tzdHJuY2F0KG5hbWUsY2t1aXRvYShudG9ocyhzYWRkci5zaW5fcG9ydCkpLDgwKTsKKyAgICAgICAgaWYgKCFxdWlldAorI2lmZGVmIE5PSUNQCisgICAgICAgICAgICAmJiAhZG9jb254CisjZW5kaWYgLyogTk9JQ1AgKi8KKyAgICAgICAgICAgICkKKyAgICAgICAgICBwcmludGYoIiVzIGNvbm5lY3RlZCBvbiBwb3J0ICVkXG4iLGlwYWRkcixudG9ocyhzYWRkci5zaW5fcG9ydCkpOworICAgIH0KKyAgICBpZiAoIXF1aWV0KSBmZmx1c2goc3Rkb3V0KTsKKyAgICB0dG5ldCA9IG5ldHQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ1AvSVAgKHNvY2tldHMpIG5ldHdvcmsgKi8KKworI2lmZGVmIFJMT0dDT0RFCisgICAgaWYgKG50b2hzKHNhZGRyLnNpbl9wb3J0KSA9PSA1MTMpCisgICAgICAgIHR0bnByb3RvID0gTlBfTE9HSU47CisgICAgZWxzZQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisgICAgLyogQXNzdW1lIHRoZSBzZXJ2aWNlIGlzIFRFTE5FVC4gKi8KKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVENQUkFXKQorICAgICAgICB0dG5wcm90byA9IE5QX1RFTE5FVDsgICAgICAgICAgIC8qIFllcywgc2V0IGdsb2JhbCBmbGFnLiAqLworI2lmZGVmIENLX1NFQ1VSSVRZCisgICAgLyogQmVmb3JlIEluaXRpYWxpemF0aW9uIFRlbG5ldC9SbG9naW4gTmVnb3RpYXRpb25zIEluaXQgS2VyYmVyb3MgKi8KKyAgICBja19hdXRoX2luaXQoKHRjcF9yZG5zICYmIGhvc3QgJiYgaG9zdC0+aF9uYW1lICYmIGhvc3QtPmhfbmFtZVswXSkgPworICAgICAgICAgICAgICAgIGhvc3QtPmhfbmFtZSA6IGlwYWRkciwKKyAgICAgICAgICAgICAgICBpcGFkZHIsCisgICAgICAgICAgICAgICAgdWlkYnVmLAorICAgICAgICAgICAgICAgIHR0eWZkCisgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBDS19TRUNVUklUWSAqLworICAgIGlmICh0bl9pbmkoKSA8IDApICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0L1Jlc2V0IFRFTE5FVCBuZWdvdGlhdGlvbnMgKi8KKyAgICAgIGlmICh0dGNoaygpIDwgMCkgICAgICAgICAgICAgICAgICAvKiBEaWQgaXQgZmFpbCBkdWUgdG8gY29ubmVjdCBsb3NzPyAqLworICAgICAgICByZXR1cm4oLTEpOworCisgICAgaWYgKCpsY2wgPCAwKSAqbGNsID0gMTsgICAgICAgICAgICAgLyogTG9jYWwgbW9kZS4gKi8KKworICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvbmUuICovCit9CisjZW5kaWYgLyogTk9UVVNFRCAqLworCisvKiAgVCBDIFAgUyBSIFYgXyBPIFAgRSBOICAtLSAgT3BlbiBhIFRDUC9JUCBTZXJ2ZXIgY29ubmVjdGlvbiAgKi8KKy8qCisgIENhbGxpbmcgY29udmVudGlvbnMgc2FtZSBhcyB0dG9wZW4oKSwgZXhjZXB0IHRoaXJkIGFyZ3VtZW50IGlzIG5ldHdvcmsKKyAgdHlwZSByYXRoZXIgdGhhbiBtb2RlbSB0eXBlLgorKi8KK2ludAordGNwc3J2X29wZW4obmFtZSxsY2wsbmV0dCx0aW1vKSBjaGFyICogbmFtZTsgaW50ICogbGNsOyBpbnQgbmV0dDsgaW50IHRpbW87IHsKKyAgICBjaGFyICpwOworICAgIGludCBpLCB4OworICAgIFNPQ0tPUFRfVCBvbiA9IDE7CisgICAgaW50IHJlYWR5X3RvX2FjY2VwdCA9IDA7CisgICAgc3RhdGljIHN0cnVjdCBzZXJ2ZW50ICpzZXJ2aWNlLCAqc2VydmljZTIsIHNlcnZyZWM7CisgICAgc3RhdGljIHN0cnVjdCBob3N0ZW50ICpob3N0OworICAgIHN0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FkZHI7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGxfYWRkcjsKKyAgICBHU09DS05BTUVfVCBsX3NsZW47CisjaWZkZWYgVUNYNTAKKyAgICBzdGF0aWMgdV9pbnQgc2FkZHJsZW47CisjZWxzZQorICAgIHN0YXRpYyBTT0NLT1BUX1Qgc2FkZHJsZW47CisjZW5kaWYgLyogVUNYNTAgKi8KKworI2lmZGVmIEJTRFNFTEVDVAorICAgIGZkX3NldCByZmRzOworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworI2Vsc2UKKyNpZmRlZiBCRUxMU0VMQ1QKKyAgICBmZF9zZXQgcmZkczsKKyNlbHNlCisgICAgZmRfc2V0IHJmZHM7CisgICAgc3RydWN0IHRpbWV2YWwgeworICAgICAgICBsb25nIHR2X3NlYzsKKyAgICAgICAgbG9uZyB0dl91c2VjOworICAgIH0gdHY7CisjZW5kaWYgLyogQkVMTFNFTEVDVCAqLworI2VuZGlmIC8qIEJTRFNFTEVDVCAqLworI2lmZGVmIENLX1NTTAorICAgIGludCBzc2xfZmFpbGVkID0gMDsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIGRlYnVnKEYxMDEsInRjcHNydl9vcGVuIG5ldHQiLCIiLG5ldHQpOworICAgICppcGFkZHIgPSAnXDAnOworCisgICAgaWYgKG5ldHQgIT0gTkVUX1RDUEIpCisgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAgICAgICAgICAgLyogQlNEIHNvY2tldCBzdXBwb3J0ICovCisKKyAgICBuZXRjbG9zKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbG9zZSBhbnkgcHJldmlvdXMgY29ubmVjdGlvbi4gKi8KKyAgICBja3N0cm5jcHkobmFtZWNvcHksIG5hbWUsIE5BTUVDUFlMKTsgLyogQ29weSB0aGUgaG9zdG5hbWUuICovCisjaWZkZWYgQ09NTUVOVAorICAgIC8qIERvbid0IGRvIHRoaXMuICovCisgICAgaWYgKHR0bnByb3RvICE9IE5QX1RDUFJBVykKKyAgICAgIHR0bnByb3RvID0gTlBfTk9ORTsgICAgICAgICAgICAgICAvKiBObyBwcm90b2NvbCBzZWxlY3RlZCB5ZXQuICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIGRlYnVnKEYxMTAsInRjcHNydl9vcGVuIG5hbWVjb3B5IixuYW1lY29weSwwKTsKKworICAgIHAgPSBuYW1lY29weTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhcyBhIHNlcnZpY2UgcmVxdWVzdGVkPyAqLworICAgIHdoaWxlICgqcCAhPSAnXDAnICYmICpwICE9ICc6JykKKyAgICAgIHArKzsgLyogTG9vayBmb3IgY29sb24gKi8KKyAgICBpZiAoKnAgPT0gJzonKSB7ICAgICAgICAgICAgICAgICAgICAvKiBIYXZlIGEgY29sb24gKi8KKyAgICAgICAgKnArKyA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAvKiBHZXQgc2VydmljZSBuYW1lIG9yIG51bWJlciAqLworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSB1c2Uga2VybWl0ICovCisgICAgICAgIHAgPSAia2VybWl0IjsKKyAgICB9CisgICAgZGVidWcoRjExMCwidGNwc3J2X29wZW4gc2VydmljZSByZXF1ZXN0ZWQiLHAsMCk7CisgICAgaWYgKGlzZGlnaXQoKnApKSB7ICAgICAgICAgICAgICAgICAgLyogVXNlIHNvY2tldCBudW1iZXIgd2l0aG91dCBsb29rdXAgKi8KKyAgICAgICAgc2VydmljZSA9ICZzZXJ2cmVjOworICAgICAgICBzZXJ2aWNlLT5zX3BvcnQgPSBodG9ucygodW5zaWduZWQgc2hvcnQpYXRvaShwKSk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIGxvb2t1cCB0aGUgc2VydmljZSBuYW1lICovCisgICAgICAgIHNlcnZpY2UgPSBnZXRzZXJ2YnluYW1lKHAsICJ0Y3AiKTsKKyAgICB9CisgICAgaWYgKCFzZXJ2aWNlICYmICFzdHJjbXAoImtlcm1pdCIscCkpIHsgLyogVXNlIEtlcm1pdCBzZXJ2aWNlIHBvcnQgKi8KKyAgICAgICAgc2VydmljZSA9ICZzZXJ2cmVjOworICAgICAgICBzZXJ2aWNlLT5zX3BvcnQgPSBodG9ucygxNjQ5KTsKKyAgICB9CisjaWZkZWYgUkxPR0NPREUKKyAgICBpZiAoc2VydmljZSAmJiAhc3RyY21wKCJsb2dpbiIscCkgJiYgc2VydmljZS0+c19wb3J0ICE9IGh0b25zKDUxMykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIiAgV2FybmluZzogbG9naW4gc2VydmljZSBvbiBwb3J0ICVkIGluc3RlYWQgb2YgcG9ydCA1MTNcbiIsCisgICAgICAgICAgICAgICAgIG50b2hzKHNlcnZpY2UtPnNfcG9ydCkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgRWRpdCBTRVJWSUNFUyBmaWxlIGlmIFJMT0dJTiBmYWlscyB0byBjb25uZWN0LlxuIik7CisgICAgICAgIGRlYnVnKEYxMDEsInRjcHNydl9vcGVuIGxvZ2luIG9uIHBvcnQiLCIiLG50b2hzKHNlcnZpY2UtPnNfcG9ydCkpOworICAgIH0KKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworICAgIGlmICghc2VydmljZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIHBvcnQgZm9yIHNlcnZpY2U6ICVzXG4iLCBwKTsKKyAgICAgICAgZGVidWcoRjExMSwidGNwc3J2X29wZW4gY2FuJ3QgZ2V0IHNlcnZpY2UiLHAsZXJybm8pOworICAgICAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHJhdGhlciB0aGFuIG1pc2xlYWQgKi8KKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICAvKiBJZiB3ZSBjdXJyZW50bHkgaGF2ZSBhIGxpc3RlbiBhY3RpdmUgYnV0IHBvcnQgaGFzIGNoYW5nZWQgdGhlbiBjbG9zZSAqLworCisgICAgZGVidWcoRjEwMSwidGNwc3J2X29wZW4gY2hlY2tpbmcgcHJldmlvdXMgY29ubmVjdGlvbiIsIiIsdGNwc3JmZCk7CisgICAgZGVidWcoRjEwMSwidGNwc3J2X29wZW4gcHJldmlvdXMgdGNwc3J2X3BvcnQiLCIiLHRjcHNydl9wb3J0KTsKKyAgICBpZiAodGNwc3JmZCAhPSAtMSAmJgorICAgICAgICB0Y3BzcnZfcG9ydCAhPSBudG9ocygodW5zaWduZWQgc2hvcnQpc2VydmljZS0+c19wb3J0KSkgeworICAgICAgICBkZWJ1ZyhGMTAwLCJ0Y3BzcnZfb3BlbiBjbG9zaW5nIHByZXZpb3VzIGNvbm5lY3Rpb24iLCIiLDApOworI2lmZGVmIFRDUElQTElCCisgICAgICAgIHNvY2tldF9jbG9zZSh0Y3BzcmZkKTsKKyNlbHNlCisgICAgICAgIGNsb3NlKHRjcHNyZmQpOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgIHRjcHNyZmQgPSAtMTsKKyAgICB9CisgICAgZGVidWcoRjEwMCwidGNwc3J2X29wZW4gdGNwc3JmZCIsIiIsdGNwc3JmZCk7CisgICAgaWYgKHRjcHNyZmQgPT0gLTEpIHsKKworICAgICAgICAvKiBTZXQgdXAgc29ja2V0IHN0cnVjdHVyZSBhbmQgZ2V0IGhvc3QgYWRkcmVzcyAqLworCisgICAgICAgIGJ6ZXJvKChjaGFyICopJnNhZGRyLCBzaXplb2Yoc2FkZHIpKTsKKyAgICAgICAgZGVidWcoRjEwMCwidGNwc3J2X29wZW4gYnplcm8gb2siLCIiLDApOworICAgICAgICBzYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgaWYgKHRjcF9hZGRyZXNzKSB7CisjaWZkZWYgSU5BRERSWAorICAgICAgICAgICAgaW5hZGRyeCA9IGluZXRfYWRkcih0Y3BfYWRkcmVzcyk7CisgICAgICAgICAgICBzYWRkci5zaW5fYWRkci5zX2FkZHIgPSAqKHVuc2lnbmVkIGxvbmcgKikmaW5hZGRyeDsKKyNlbHNlCisgICAgICAgICAgICBzYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIodGNwX2FkZHJlc3MpOworI2VuZGlmIC8qIElOQUREUlggKi8KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgc2FkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworICAgICAgICAvKiBHZXQgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBjb25uZWN0aW9uLiAqLworCisgICAgICAgIHNhZGRyLnNpbl9wb3J0ID0gc2VydmljZS0+c19wb3J0OworICAgICAgICBpcGFkZHJbMF0gPSAnXDAnOworCisgICAgICAgIGRlYnVnKEYxMDAsInRjcHNydl9vcGVuIGNhbGxpbmcgc29ja2V0IiwiIiwwKTsKKyAgICAgICAgaWYgKCh0Y3BzcmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPCAwKSB7CisgICAgICAgICAgICBwZXJyb3IoIlRDUCBzb2NrZXQgZXJyb3IiKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInRjcHNydl9vcGVuIHNvY2tldCBlcnJvciIsIiIsZXJybm8pOworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKyAgICAgICAgZXJybm8gPSAwOworCisgICAgICAgIC8qIFNwZWNpZnkgdGhlIFBvcnQgbWF5IGJlIHJldXNlZCAqLworCisgICAgICAgIGRlYnVnKEYxMDAsInRjcHNydl9vcGVuIGNhbGxpbmcgc2V0c29ja29wdCIsIiIsMCk7CisgICAgICAgIHggPSBzZXRzb2Nrb3B0KHRjcHNyZmQsCisgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsU09fUkVVU0VBRERSLChjaGFyICopJm9uLHNpemVvZiBvbik7CisgICAgICAgIGRlYnVnKEYxMDEsInRjcHNydl9vcGVuIHNldHNvY2tvcHQiLCIiLHgpOworCisgICAgICAgLyogTm93IGJpbmQgdG8gdGhlIHNvY2tldCAqLworICAgICAgICBwcmludGYoIlxuQmluZGluZyBzb2NrZXQgdG8gcG9ydCAlZCAuLi5cbiIsCisgICAgICAgICAgICAgICBudG9ocygodW5zaWduZWQgc2hvcnQpc2VydmljZS0+c19wb3J0KSk7CisgICAgICAgIGlmIChiaW5kKHRjcHNyZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2FkZHIsIHNpemVvZihzYWRkcikpIDwgMCkgeworICAgICAgICAgICAgaSA9IGVycm5vOyAgICAgICAgICAgICAgICAgIC8qIFNhdmUgZXJyb3IgY29kZSAqLworI2lmZGVmIFRDUElQTElCCisgICAgICAgICAgICBzb2NrZXRfY2xvc2UodGNwc3JmZCk7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgY2xvc2UodGNwc3JmZCk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgIHRjcHNyZmQgPSAtMTsKKyAgICAgICAgICAgIHRjcHNydl9wb3J0ID0gMDsKKyAgICAgICAgICAgIHR0eWZkID0gLTE7CisgICAgICAgICAgICB3YXNjbG9zZWQgPSAxOworICAgICAgICAgICAgZXJybm8gPSBpOyAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXBvcnQgdGhpcyBlcnJvciAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwidGNwc3J2X29wZW4gYmluZCBlcnJubyIsIiIsZXJybm8pOworICAgICAgICAgICAgcHJpbnRmKCI/VW5hYmxlIHRvIGJpbmQgdG8gc29ja2V0IChlcnJubyA9ICVkKVxuIixlcnJubyk7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMDAsInRjcHNydl9vcGVuIGJpbmQgT0siLCIiLDApOworICAgICAgICBwcmludGYoIkxpc3RlbmluZyAuLi5cbiIpOworICAgICAgICBpZiAobGlzdGVuKHRjcHNyZmQsIDE1KSA8IDApIHsKKyAgICAgICAgICAgIGkgPSBlcnJubzsgICAgICAgICAgICAgICAgICAvKiBTYXZlIGVycm9yIGNvZGUgKi8KKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICAgICAgc29ja2V0X2Nsb3NlKHRjcHNyZmQpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgIGNsb3NlKHRjcHNyZmQpOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgICAgICB0Y3BzcmZkID0gLTE7CisgICAgICAgICAgICB0Y3BzcnZfcG9ydCA9IDA7CisgICAgICAgICAgICB0dHlmZCA9IC0xOworICAgICAgICAgICAgd2FzY2xvc2VkID0gMTsKKyAgICAgICAgICAgIGVycm5vID0gaTsgICAgICAgICAgICAgICAgICAvKiBBbmQgcmVwb3J0IHRoaXMgZXJyb3IgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInRjcHNydl9vcGVuIGxpc3RlbiBlcnJubyIsIiIsZXJybm8pOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTAwLCJ0Y3BzcnZfb3BlbiBsaXN0ZW4gT0siLCIiLDApOworICAgICAgICB0Y3BzcnZfcG9ydCA9IG50b2hzKCh1bnNpZ25lZCBzaG9ydClzZXJ2aWNlLT5zX3BvcnQpOworICAgIH0KKworI2lmZGVmIENLX1NTTAorICAgIGlmIChja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkpIHsKKyAgICAgICAgaWYgKCFzc2xfdG5faW5pdChTU0xfU0VSVkVSKSkgeworICAgICAgICAgICAgc3NsX2ZhaWxlZCA9IDE7CisgICAgICAgICAgICBpZiAoYmlvX2VyciE9TlVMTCkgeworICAgICAgICAgICAgICAgIEJJT19wcmludGYoYmlvX2VyciwiZG9fc3NsZWF5X2luaXQoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIEVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJkb19zc2xlYXlfaW5pdCgpIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRsc19vbmx5X2ZsYWcgfHwgc3NsX29ubHlfZmxhZykgeworI2lmZGVmIFRDUElQTElCCisgICAgICAgICAgICAgICAgc29ja2V0X2Nsb3NlKHR0eWZkKTsKKyAgICAgICAgICAgICAgICBzb2NrZXRfY2xvc2UodGNwc3JmZCk7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgICAgIGNsb3NlKHR0eWZkKTsKKyAgICAgICAgICAgICAgICBjbG9zZSh0Y3BzcmZkKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgICAgIHR0eWZkID0gLTE7CisgICAgICAgICAgICAgICAgd2FzY2xvc2VkID0gMTsKKyAgICAgICAgICAgICAgICB0Y3BzcmZkID0gLTE7CisgICAgICAgICAgICAgICAgdGNwc3J2X3BvcnQgPSAwOworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiB3ZSB3aWxsIGNvbnRpbnVlIHRvIGFjY2VwdCB0aGUgY29ubmVjdGlvbiAgICovCisgICAgICAgICAgICAvKiB3aXRob3V0IFNTTCBvciBUTFMgc3VwcG9ydCB1bmxlc3MgcmVxdWlyZWQuICovCisgICAgICAgICAgICBpZiAoIFRFTE9QVF9ERUZfU19NRV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpICE9IFROX05HX01VICkKKyAgICAgICAgICAgICAgICBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfU1RBUlRfVExTKSA9IFROX05HX1JGOworICAgICAgICAgICAgaWYgKCBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpICE9IFROX05HX01VICkKKyAgICAgICAgICAgICAgICBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpID0gVE5fTkdfUkY7CisgICAgICAgICAgICBpZiAoIFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpICE9IFROX05HX01VICkKKyAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfU1RBUlRfVExTKSA9IFROX05HX1JGOworICAgICAgICAgICAgaWYgKCBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpICE9IFROX05HX01VICkKKyAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpID0gVE5fTkdfUkY7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBwcmludGYoIlxuV2FpdGluZyB0byBBY2NlcHQgYSBUQ1AvSVAgY29ubmVjdGlvbiBvbiBwb3J0ICVkIC4uLlxuIiwKKyAgICAgICAgICAgbnRvaHMoKHVuc2lnbmVkIHNob3J0KXNlcnZpY2UtPnNfcG9ydCkpOworICAgIHNhZGRybGVuID0gc2l6ZW9mKHNhZGRyKTsKKworI2lmZGVmIEJTRFNFTEVDVAorICAgIHR2LnR2X3NlYyAgPSB0di50dl91c2VjID0gMEw7CisgICAgaWYgKHRpbW8gPCAwKQorICAgICAgdHYudHZfdXNlYyA9IChsb25nKSAtdGltbyAqIDEwMDAwTDsKKyAgICBlbHNlCisgICAgICB0di50dl9zZWMgPSB0aW1vOworICAgIGRlYnVnKEYxMDEsInRjcHNydl9vcGVuIEJTRFNFTEVDVCIsIiIsdGltbyk7CisjZWxzZQorICAgIGRlYnVnKEYxMDEsInRjcHNydl9vcGVuIG5vdCBCU0RTRUxFQ1QiLCIiLHRpbW8pOworI2VuZGlmIC8qIEJTRFNFTEVDVCAqLworCisgICAgaWYgKHRpbW8pIHsKKyAgICAgICAgd2hpbGUgKCFyZWFkeV90b19hY2NlcHQpIHsKKyNpZmRlZiBCU0RTRUxFQ1QKKyAgICAgICAgICAgIEZEX1pFUk8oJnJmZHMpOworICAgICAgICAgICAgRkRfU0VUKHRjcHNyZmQsICZyZmRzKTsKKyAgICAgICAgICAgIHJlYWR5X3RvX2FjY2VwdCA9CisgICAgICAgICAgICAgICgoc2VsZWN0KEZEX1NFVFNJWkUsCisjaWZkZWYgSFBVWAorI2lmZGVmIEhQVVgxMDEwCisgICAgICAgICAgICAgICAgICAgICAgIChmZF9zZXQgKikKKyNlbHNlCisKKyAgICAgICAgICAgICAgICAgICAgICAgKGludCAqKQorI2VuZGlmIC8qIEhQVVgxMDEwICovCisjZWxzZQorI2lmZGVmIF9fREVDQworICAgICAgICAgICAgICAgICAgICAgICAoZmRfc2V0ICopCisjZW5kaWYgLyogX19ERUNDICovCisjZW5kaWYgLyogSFBVWCAqLworICAgICAgICAgICAgICAgICAgICAgICAmcmZkcywgTlVMTCwgTlVMTCwgJnR2KSA+IDApICYmCisgICAgICAgICAgICAgICBGRF9JU1NFVCh0Y3BzcmZkLCAmcmZkcykpOworI2Vsc2UgLyogQlNEU0VMRUNUICovCisjaWZkZWYgSUJNU0VMRUNUCisjZGVmaW5lIGNrX3NsZWVwaW50IDI1MAorICAgICAgICAgICAgcmVhZHlfdG9fYWNjZXB0ID0KKyAgICAgICAgICAgICAgKHNlbGVjdCgmdGNwc3JmZCwgMSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICB0aW1vIDwgMCA/IC10aW1vIDoKKyAgICAgICAgICAgICAgICAgICAgICAodGltbyA+IDAgPyB0aW1vICogMTAwMEwgOiBja19zbGVlcGludCkpID09IDEKKyAgICAgICAgICAgICAgICk7CisjZWxzZQorI2lmZGVmIEJFTExTRUxFQ1QKKyAgICAgICAgICAgIEZEX1pFUk8ocmZkcyk7CisgICAgICAgICAgICBGRF9TRVQodGNwc3JmZCwgcmZkcyk7CisgICAgICAgICAgICByZWFkeV90b19hY2NlcHQgPQorICAgICAgICAgICAgICAoKHNlbGVjdCgxMjgsIHJmZHMsIE5VTEwsIE5VTEwsIHRpbW8gPCAwID8gLXRpbW8gOgorICAgICAgICAgICAgICAgICAgICAgICh0aW1vID4gMCA/IHRpbW8gKiAxMDAwTCkpID4gMCkgJiYKKyAgICAgICAgICAgICAgIEZEX0lTU0VUKHRjcHNyZmQsIHJmZHMpKTsKKyNlbHNlCisvKiBUcnkgdGhpcyAtIHdoYXQncyB0aGUgd29yc3QgdGhhdCBjYW4gaGFwcGVuLi4uICovCisKKyAgICAgICAgICAgIEZEX1pFUk8oJnJmZHMpOworICAgICAgICAgICAgRkRfU0VUKHRjcHNyZmQsICZyZmRzKTsKKyAgICAgICAgICAgIHJlYWR5X3RvX2FjY2VwdCA9CisgICAgICAgICAgICAgICgoc2VsZWN0KEZEX1NFVFNJWkUsCisgICAgICAgICAgICAgICAgICAgICAgIChmZF9zZXQgKikgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dikgPiAwKSAmJgorICAgICAgICAgICAgICAgRkRfSVNTRVQodGNwc3JmZCwgJnJmZHMpKTsKKworI2VuZGlmIC8qIEJFTExTRUxFQ1QgKi8KKyNlbmRpZiAvKiBJQk1TRUxFQ1QgKi8KKyNlbmRpZiAvKiBCU0RTRUxFQ1QgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmVhZHlfdG9fYWNjZXB0IHx8IHRpbW8gPT0gMCkgeworICAgICAgICBpZiAoKHR0eWZkID0gYWNjZXB0KHRjcHNyZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzYWRkciwmc2FkZHJsZW4pKSA8IDApIHsKKyAgICAgICAgICAgIGkgPSBlcnJubzsgICAgICAgICAgICAgICAgICAvKiBzYXZlIGVycm9yIGNvZGUgKi8KKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICAgICAgc29ja2V0X2Nsb3NlKHRjcHNyZmQpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgIGNsb3NlKHRjcHNyZmQpOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgICAgICB0dHlmZCA9IC0xOworICAgICAgICAgICAgd2FzY2xvc2VkID0gMTsKKyAgICAgICAgICAgIHRjcHNyZmQgPSAtMTsKKyAgICAgICAgICAgIHRjcHNydl9wb3J0ID0gMDsKKyAgICAgICAgICAgIGVycm5vID0gaTsgICAgICAgICAgICAgICAgICAvKiBhbmQgcmVwb3J0IHRoaXMgZXJyb3IgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInRjcHNydl9vcGVuIGFjY2VwdCBlcnJubyIsIiIsZXJybm8pOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBzZXRzb2Nrb3B0KHR0eWZkLCBTT0xfU09DS0VULCBTT19PT0JJTkxJTkUsKGNoYXIgKikgJm9uLCBzaXplb2Ygb24pOworCisjaWZuZGVmIE5PVENQT1BUUworI2lmbmRlZiBkYXRhZ2VuZXJhbAorI2lmZGVmIFNPTF9TT0NLRVQKKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgICAgICBub19kZWxheSh0dHlmZCx0Y3Bfbm9kZWxheSk7CisgICAgICAgIGRlYnVnKEYxMDEsInRjcHNydl9vcGVuIG5vX2RlbGF5IiwiIix0Y3Bfbm9kZWxheSk7CisjZW5kaWYgLyogVENQX05PREVMQVkgKi8KKyNpZmRlZiBTT19LRUVQQUxJVkUKKyAgICAgICAga2VlcGFsaXZlKHR0eWZkLHRjcF9rZWVwYWxpdmUpOworICAgICAgICBkZWJ1ZyhGMTAxLCJ0Y3BzcnZfb3BlbiBrZWVwYWxpdmUiLCIiLHRjcF9rZWVwYWxpdmUpOworI2VuZGlmIC8qIFNPX0tFRVBBTElWRSAqLworI2lmZGVmIFNPX0xJTkdFUgorICAgICAgICBja19saW5nZXIodHR5ZmQsdGNwX2xpbmdlciwgdGNwX2xpbmdlcl90bW8pOworICAgICAgICBkZWJ1ZyhGMTAxLCJ0Y3BzcnZfb3BlbiBsaW5nZXIiLCIiLHRjcF9saW5nZXJfdG1vKTsKKyNlbmRpZiAvKiBTT19MSU5HRVIgKi8KKyNpZmRlZiBTT19TTkRCVUYKKyAgICAgICAgc2VuZGJ1Zih0dHlmZCx0Y3Bfc2VuZGJ1Zik7CisjZW5kaWYgLyogU09fU05EQlVGICovCisjaWZkZWYgU09fUkNWQlVGCisgICAgICAgIHJlY3ZidWYodHR5ZmQsdGNwX3JlY3ZidWYpOworI2VuZGlmIC8qIFNPX1JDVkJVRiAqLworI2VuZGlmIC8qIFNPTF9TT0NLRVQgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIE5PVENQT1BUUyAqLworCisgICAgICAgIHR0bmV0ID0gbmV0dDsgICAgICAgICAgICAgICAgICAgLyogVENQL0lQIChzb2NrZXRzKSBuZXR3b3JrICovCisgICAgICAgIHRjcF9pbmNvbWluZyA9IDE7ICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhbiBpbmNvbWluZyBjb25uZWN0aW9uICovCisgICAgICAgIHNzdGVsbmV0ID0gMTsgICAgICAgICAgICAgICAgICAgLyogRG8gc2VydmVyLXNpZGUgVGVsbmV0IHByb3RvY29sICovCisKKyAgICAgICAgLyogU2VlIGlmIHRoZSBzZXJ2aWNlIGlzIFRFTE5FVC4gKi8KKyAgICAgICAgeCA9ICh1bnNpZ25lZCBzaG9ydClzZXJ2aWNlLT5zX3BvcnQ7CisgICAgICAgIHNlcnZpY2UyID0gZ2V0c2VydmJ5bmFtZSgidGVsbmV0IiwgInRjcCIpOworICAgICAgICBpZiAoc2VydmljZTIgJiYgeCA9PSBzZXJ2aWNlMi0+c19wb3J0KSB7CisgICAgICAgICAgICBpZiAodHRucHJvdG8gIT0gTlBfVENQUkFXKSAgLyogWWVzIGFuZCBpZiByYXcgcG9ydCBub3QgcmVxdWVzdGVkICovCisgICAgICAgICAgICAgIHR0bnByb3RvID0gTlBfVEVMTkVUOyAgICAgLyogU2V0IHByb3RvY29sIHRvIFRFTE5FVC4gKi8KKyAgICAgICAgfQorCisgICAgICAgIGNrc3RybmNweShpcGFkZHIsKGNoYXIgKilpbmV0X250b2Eoc2FkZHIuc2luX2FkZHIpLDIwKTsKKyAgICAgICAgaWYgKHRjcF9yZG5zKSB7CisgICAgICAgICAgICBpZiAoIXF1aWV0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgUmV2ZXJzZSBETlMgTG9va3VwLi4uICIpOworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhvc3QgPSBnZXRob3N0YnlhZGRyKChjaGFyICopJnNhZGRyLnNpbl9hZGRyLDQsUEZfSU5FVCkpIHsKKyAgICAgICAgICAgICAgICBob3N0ID0gY2tfY29weWhvc3RlbnQoaG9zdCk7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwidGNwc3J2X29wZW4gZ2V0aG9zdGJ5YWRkciAhPSBOVUxMIiwiIiwwKTsKKyAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiKE9LKVxuIik7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuYW1lWzBdID0gJyonOworICAgICAgICAgICAgICAgIGNrc3RybmNweSgmbmFtZVsxXSxob3N0LT5oX25hbWUsNzgpOworICAgICAgICAgICAgICAgIHN0cm5jYXQobmFtZSwiOiIsODAtc3RybGVuKG5hbWUpKTsKKyAgICAgICAgICAgICAgICBzdHJuY2F0KG5hbWUscCw4MC1zdHJsZW4obmFtZSkpOworICAgICAgICAgICAgICAgIGlmICghcXVpZXQKKyNpZm5kZWYgTk9JQ1AKKyAgICAgICAgICAgICAgICAgICAgJiYgIWRvY29ueAorI2VuZGlmIC8qIE5PSUNQICovCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgY29ubmVjdGVkIG9uIHBvcnQgJXNcbiIsaG9zdC0+aF9uYW1lLHApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KSBwcmludGYoIkZhaWxlZC5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFxdWlldCkgcHJpbnRmKCIoT0spXG4iKTsKKworICAgICAgICBpZiAoIXRjcF9yZG5zIHx8ICFob3N0KSB7CisgICAgICAgICAgICBja3N0cm5jcHkobmFtZSxpcGFkZHIsODApOworICAgICAgICAgICAgY2tzdHJuY2F0KG5hbWUsIjoiLDgwKTsKKyAgICAgICAgICAgIGNrc3RybmNhdChuYW1lLGNrdWl0b2EobnRvaHMoc2FkZHIuc2luX3BvcnQpKSw4MCk7CisgICAgICAgICAgICBpZiAoIXF1aWV0CisjaWZuZGVmIE5PSUNQCisgICAgICAgICAgICAgICAgJiYgIWRvY29ueAorI2VuZGlmIC8qIE5PSUNQICovCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICBwcmludGYoIiVzIGNvbm5lY3RlZCBvbiBwb3J0ICVkXG4iLGlwYWRkcixudG9ocyhzYWRkci5zaW5fcG9ydCkpOworICAgICAgICB9CisgICAgICAgIGlmICghcXVpZXQpIGZmbHVzaChzdGRvdXQpOworCisjaWZkZWYgQ0tfU0VDVVJJVFkKKyAgICAgICAgLyogQmVmb3JlIEluaXRpYWxpemF0aW9uIFRlbG5ldC9SbG9naW4gTmVnb3RpYXRpb25zIEluaXQgS2VyYmVyb3MgKi8KKyAgICAgICAgY2tfYXV0aF9pbml0KCh0Y3BfcmRucyAmJiBob3N0ICYmIGhvc3QtPmhfbmFtZSAmJiBob3N0LT5oX25hbWVbMF0pID8KKyAgICAgICAgICAgICAgICAgICAgIChjaGFyICopaG9zdC0+aF9uYW1lIDogaXBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgaXBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgdWlkYnVmLAorICAgICAgICAgICAgICAgICAgICAgdHR5ZmQKKyAgICAgICAgICAgICAgICAgICAgICk7CisjZW5kaWYgLyogQ0tfU0VDVVJJVFkgKi8KKworI2lmZGVmIENLX1NTTAorICAgICAgICBpZiAoY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpICYmICFzc2xfZmFpbGVkKSB7CisgICAgICAgICAgICBpZiAoY2tfc3NsX2luY29taW5nKHR0eWZkKSA8IDApIHsKKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICAgICAgICAgICAgICBzb2NrZXRfY2xvc2UodHR5ZmQpOworICAgICAgICAgICAgICAgICAgICBzb2NrZXRfY2xvc2UodGNwc3JmZCk7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgICAgICAgICBjbG9zZSh0dHlmZCk7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlKHRjcHNyZmQpOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgICAgICAgICAgICAgIHR0eWZkID0gLTE7CisgICAgICAgICAgICAgICAgICAgIHdhc2Nsb3NlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHRjcHNyZmQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgdGNwc3J2X3BvcnQgPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyNpZm5kZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgLyogRmluZCBvdXQgb3VyIG93biBJUCBhZGRyZXNzLiAqLworICAgICAgICBsX3NsZW4gPSBzaXplb2YobF9hZGRyKTsKKyAgICAgICAgYnplcm8oKGNoYXIgKikmbF9hZGRyLCBsX3NsZW4pOworI2lmbmRlZiBFWENFTEFOCisgICAgICAgIGlmICghZ2V0c29ja25hbWUodHR5ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmbF9hZGRyLCAmbF9zbGVuKSkgeworICAgICAgICAgICAgY2hhciAqIHMgPSAoY2hhciAqKWluZXRfbnRvYShsX2FkZHIuc2luX2FkZHIpOworICAgICAgICAgICAgY2tzdHJuY3B5KG15aXBhZGRyLCBzLDIwKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImdldHNvY2tuYW1lIixteWlwYWRkciwwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIEVYQ0VMQU4gKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworCisgICAgICAgIGlmICh0bl9pbmkoKSA8IDApICAgICAgICAgICAgICAgLyogU3RhcnQgVEVMTkVUIG5lZ290aWF0aW9ucy4gKi8KKyAgICAgICAgICBpZiAodHRjaGsoKSA8IDApIHsgICAgICAgICAgICAvKiBEaXNjb25uZWN0ZWQ/ICovCisgICAgICAgICAgICAgIGkgPSBlcnJubzsgICAgICAgICAgICAgICAgLyogc2F2ZSBlcnJvciBjb2RlICovCisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICAgICAgc29ja2V0X2Nsb3NlKHRjcHNyZmQpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgICAgY2xvc2UodGNwc3JmZCk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgICAgdHR5ZmQgPSAtMTsKKyAgICAgICAgICAgICAgd2FzY2xvc2VkID0gMTsKKyAgICAgICAgICAgICAgdGNwc3JmZCA9IC0xOworICAgICAgICAgICAgICB0Y3BzcnZfcG9ydCA9IDA7CisgICAgICAgICAgICAgIGVycm5vID0gaTsgICAgICAgICAgICAgICAgLyogYW5kIHJlcG9ydCB0aGlzIGVycm9yICovCisgICAgICAgICAgICAgIGRlYnVnKEYxMDEsInRjcHNydl9vcGVuIGFjY2VwdCBlcnJubyIsIiIsZXJybm8pOworICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjEwMSwidGNwc3J2X29wZW4gc2VydmljZSIsIiIseCk7CisgICAgICAgIGlmICgqbGNsIDwgMCkgICAgICAgICAgICAgICAgICAgLyogU2V0IGxvY2FsIG1vZGUuICovCisgICAgICAgICAgKmxjbCA9IDE7CisKKyNpZmRlZiBDS19LRVJCRVJPUworI2lmZGVmIEtSQjVfVTJVCisgICAgICAgIGlmICggdHRucHJvdG8gPT0gTlBfSzVVMlUgKSB7CisgICAgICAgICAgICBpZiAoazVfdXNlcl90b191c2VyX3NlcnZlcl9hdXRoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGkgPSBlcnJubzsgICAgICAgICAgICAgICAgLyogc2F2ZSBlcnJvciBjb2RlICovCisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICAgICAgICBzb2NrZXRfY2xvc2UodGNwc3JmZCk7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgICAgIGNsb3NlKHRjcHNyZmQpOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgICAgICAgICAgdHR5ZmQgPSAtMTsKKyAgICAgICAgICAgICAgICB3YXNjbG9zZWQgPSAxOworICAgICAgICAgICAgICAgIHRjcHNyZmQgPSAtMTsKKyAgICAgICAgICAgICAgICB0Y3BzcnZfcG9ydCA9IDA7CisgICAgICAgICAgICAgICAgZXJybm8gPSBpOyAgICAgICAgICAgICAgICAvKiBhbmQgcmVwb3J0IHRoaXMgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ0Y3BzcnZfb3BlbiBhY2NlcHQgZXJybm8iLCIiLGVycm5vKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogS1JCNV9VMlUgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworICAgICAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIERvbmUuICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgaSA9IGVycm5vOyAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGVycm9yIGNvZGUgKi8KKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICBzb2NrZXRfY2xvc2UodGNwc3JmZCk7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworICAgICAgICBjbG9zZSh0Y3BzcmZkKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgICB0dHlmZCA9IC0xOworICAgICAgICB3YXNjbG9zZWQgPSAxOworICAgICAgICB0Y3BzcmZkID0gLTE7CisgICAgICAgIHRjcHNydl9wb3J0ID0gMDsKKyAgICAgICAgZXJybm8gPSBpOyAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmVwb3J0IHRoaXMgZXJyb3IgKi8KKyAgICAgICAgZGVidWcoRjEwMSwidGNwc3J2X29wZW4gYWNjZXB0IGVycm5vIiwiIixlcnJubyk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorfQorI2VuZGlmIC8qIE5PTElTVEVOICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogTk9ORVQgKi8KKworI2lmZGVmIFRDUFNPQ0tFVAorY2hhciAqCitja25hbWUyYWRkcihuYW1lKSBjaGFyICogbmFtZTsKK3sKKyNpZmRlZiBIUFVYNQorICAgIHJldHVybigiIik7CisjZWxzZQorICAgIHN0cnVjdCBob3N0ZW50ICpob3N0OworCisgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQorICAgICAgICByZXR1cm4oIiIpOworCisgICAgaG9zdCA9IGdldGhvc3RieW5hbWUobmFtZSk7CisgICAgaWYgKCBob3N0ICkgeworICAgICAgICBob3N0ID0gY2tfY29weWhvc3RlbnQoaG9zdCk7CisgICAgICAgIHJldHVybihpbmV0X250b2EoKigoc3RydWN0IGluX2FkZHIgKikgaG9zdC0+aF9hZGRyKSkpOworICAgIH0KKyAgICByZXR1cm4oIiIpOworI2VuZGlmIC8qIEhQVVg1ICovCit9CisKK2NoYXIgKgorY2thZGRyMm5hbWUoYWRkcikgY2hhciAqIGFkZHI7Cit7CisjaWZkZWYgSFBVWDUKKyAgICByZXR1cm4oIiIpOworI2Vsc2UKKyAgICBzdHJ1Y3QgaG9zdGVudCAqaG9zdDsKKyAgICBzdHJ1Y3QgaW5fYWRkciBzaW5fYWRkcjsKKworICAgIGlmIChhZGRyID09IE5VTEwgfHwgKmFkZHIgPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuKCIiKTsKKworICAgIHNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhZGRyKTsKKyAgICBob3N0ID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSZzaW5fYWRkciw0LEFGX0lORVQpOworICAgIGlmIChob3N0KSB7CisgICAgICAgIGhvc3QgPSBja19jb3B5aG9zdGVudChob3N0KTsKKyAgICAgICAgcmV0dXJuKChjaGFyICopaG9zdC0+aF9uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuKCIiKTsKKyNlbmRpZiAvKiBIUFVYNSAqLworfQorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCit1bnNpZ25lZCBsb25nIHBlZXJ4aXBhZGRyID0gMEw7CisKK2NoYXIgKgorY2tnZXRwZWVyKCkgeworI2lmZGVmIFRDUFNPQ0tFVAorICAgIHN0YXRpYyBjaGFyIG5hbWVidWZbMjU2XTsKKyAgICBzdGF0aWMgc3RydWN0IGhvc3RlbnQgKmhvc3Q7CisgICAgc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKKyNpZmRlZiBQVFgKKyAgICBzdGF0aWMgc2l6ZV90IHNhZGRybGVuOworI2Vsc2UKKyNpZmRlZiBBSVg0MgorICAgIC8qIEl0J3Mgc2l6ZV90IGluIDQuMiBidXQgaW50IGluIDQuMSBhbmQgZWFybGllci4gKi8KKyAgICAvKiBOb3RlOiB0aGUgNC4yIG1hbiBwYWdlIGxpZXM7IGJlbGlldmUgc29ja2V0LmguICovCisgICAgc3RhdGljIHNpemVfdCBzYWRkcmxlbjsKKyNlbHNlCisjaWZkZWYgVU5JWFdBUkUKKyAgICBzdGF0aWMgc2l6ZV90IHNhZGRybGVuOworI2Vsc2UgIC8qIFVOSVhXQVJFICovCisjaWZkZWYgREVDX1RDUElQCisgICAgc3RhdGljIHVuc2lnbmVkIGludCBzYWRkcmxlbjsKKyNlbHNlCisgICAgc3RhdGljIGludCBzYWRkcmxlbjsKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYV0FSRSAqLworI2VuZGlmIC8qIEFJWDQyICovCisjZW5kaWYgLyogUFRYICovCisgICAgc2FkZHJsZW4gPSBzaXplb2Yoc2FkZHIpOworICAgIGlmIChnZXRwZWVybmFtZSh0dHlmZCwoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCZzYWRkcmxlbikgPCAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsImNrZ2V0cGVlciBmYWlsdXJlIixja2l0b2EodHR5ZmQpLGVycm5vKTsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBob3N0ID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSZzYWRkci5zaW5fYWRkciw0LEFGX0lORVQpOworICAgIGlmIChob3N0KSB7CisgICAgICAgIGhvc3QgPSBja19jb3B5aG9zdGVudChob3N0KTsKKyAgICAgICAgY2tzdHJuY3B5KG5hbWVidWYsKGNoYXIgKilob3N0LT5oX25hbWUsODApOworICAgIH0gZWxzZSB7CisgICAgICAgIGNrc3RybmNweShuYW1lYnVmLChjaGFyICopaW5ldF9udG9hKHNhZGRyLnNpbl9hZGRyKSw4MCk7CisgICAgfQorICAgIHBlZXJ4aXBhZGRyID0gbnRvaGwoc2FkZHIuc2luX2FkZHIuc19hZGRyKTsKKyAgICBkZWJ1ZyhGMTExLCJja2dldHBlZXIiLG5hbWVidWYscGVlcnhpcGFkZHIpOworICAgIHJldHVybihuYW1lYnVmKTsKKyNlbHNlCisgICAgcmV0dXJuKE5VTEwpOworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworfQorCisvKiBHZXQgZnVsbHkgcXVhbGlmaWVkIElQIGhvc3RuYW1lICovCisKKyNpZm5kZWYgTk9ORVQKK2NoYXIgKgorI2lmZGVmIENLX0FOU0lDCitja2dldGZxaG9zdG5hbWUoY2hhciAqIG5hbWUpCisjZWxzZQorY2tnZXRmcWhvc3RuYW1lKG5hbWUpIGNoYXIgKiBuYW1lOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisjaWZkZWYgTk9DS0dFVEZRSE9TVAorCisgICAgcmV0dXJuKG5hbWUpOworCisjZWxzZSAvKiBJZiB0aGUgZm9sbG93aW5nIGNvZGUgZHVtcHMgY29yZSwgZGVmaW5lIE5PQ0tHRVRGUUhPU1QgYW5kIHJlYnVpbGQuICovCisKKyAgICBzdGF0aWMgY2hhciBuYW1lYnVmWzI1Nl07CisgICAgc3RydWN0IGhvc3RlbnQgKmhvc3Q9TlVMTDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcl9hZGRyOworICAgIGludCBpOworCisgICAgZGVidWcoRjExMCwiY2tnZXRmcWhuKCkiLG5hbWUsMCk7CisKKyAgICBja3N0cm5jcHkobmFtZWJ1ZixuYW1lLDI1Nik7CisgICAgbmFtZWJ1ZlsyNTVdID0gJ1wwJzsKKyAgICBpID0gY2tpbmRleCgiOiIsbmFtZWJ1ZiwwLDAsMCk7CisgICAgaWYgKGkpCisgICAgICBuYW1lYnVmW2ktMV0gPSAnXDAnOworCisgICAgYnplcm8oKGNoYXIgKikmcl9hZGRyLCBzaXplb2Yocl9hZGRyKSk7CisKKyAgICBob3N0ID0gZ2V0aG9zdGJ5bmFtZShuYW1lYnVmKTsKKyAgICBpZiAoaG9zdCkgeworICAgICAgICBob3N0ID0gY2tfY29weWhvc3RlbnQoaG9zdCk7CisgICAgICAgIGRlYnVnKEYxMDAsImNrZ2V0ZnFobigpIGdldGhvc3RieW5hbWUgIT0gTlVMTCIsIiIsMCk7CisgICAgICAgIHJfYWRkci5zaW5fZmFtaWx5ID0gaG9zdC0+aF9hZGRydHlwZTsKKyNpZmRlZiBIQUREUkxJU1QKKyNpZmRlZiBoX2FkZHIKKyAgICAgICAgLyogVGhpcyBpcyBmb3IgdHJ5aW5nIG11bHRpcGxlIElQIGFkZHJlc3NlcyAtIHNlZSA8bmV0ZGIuaD4gKi8KKyAgICAgICAgaWYgKCEoaG9zdC0+aF9hZGRyX2xpc3QpKQorICAgICAgICAgIGdvdG8gZXhpdF9mdW5jOworICAgICAgICBiY29weShob3N0LT5oX2FkZHJfbGlzdFswXSwKKyAgICAgICAgICAgICAgKGNhZGRyX3QpJnJfYWRkci5zaW5fYWRkciwKKyAgICAgICAgICAgICAgaG9zdC0+aF9sZW5ndGgKKyAgICAgICAgICAgICAgKTsKKyNlbHNlCisgICAgICAgIGJjb3B5KGhvc3QtPmhfYWRkciwgKGNhZGRyX3QpJnJfYWRkci5zaW5fYWRkciwgaG9zdC0+aF9sZW5ndGgpOworI2VuZGlmIC8qIGhfYWRkciAqLworI2Vsc2UgIC8qIEhBRERSTElTVCAqLworICAgICAgICBiY29weShob3N0LT5oX2FkZHIsIChjYWRkcl90KSZyX2FkZHIuc2luX2FkZHIsIGhvc3QtPmhfbGVuZ3RoKTsKKyNlbmRpZiAvKiBIQUREUkxJU1QgKi8KKyNpZm5kZWYgRVhDRUxBTgorICAgICAgICBkZWJ1ZyhGMTExLCJCQ09QWSIsImhvc3QtPmhfYWRkciIsaG9zdC0+aF9hZGRyKTsKKyNlbmRpZiAvKiBFWENFTEFOICovCisgICAgICAgIGRlYnVnKEYxMTEsIkJDT1BZIiwiIChjYWRkcl90KSZyX2FkZHIuc2luX2FkZHIiLAorICAgICAgICAgICAgICAoY2FkZHJfdCkmcl9hZGRyLnNpbl9hZGRyKTsKKyAgICAgICAgZGVidWcoRjExMSwiQkNPUFkiLCJob3N0LT5oX2xlbmd0aCIsaG9zdC0+aF9sZW5ndGgpOworCisjaWZkZWYgTlQKKyAgICAgICAgLyogV2luZG93cyA5NS85OCByZXF1aXJlcyBhIDEgc2Vjb25kIHdhaXQgYmV0d2VlbiBjYWxscyB0byBNaWNyb3NvZnQgKi8KKyAgICAgICAgLyogcHJvdmlkZWQgRE5TIGZ1bmN0aW9ucy4gIE90aGVyd2lzZSwgdGhlIFRUTCBvZiB0aGUgRE5TIHJlc3BvbnNlICovCisgICAgICAgIC8qIGlzIGlnbm9yZWQuICovCisgICAgICAgIGlmIChpc1dpbjk1KCkpCisgICAgICAgICAgc2xlZXAoMSk7CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgaG9zdCA9IGdldGhvc3RieWFkZHIoKGNoYXIgKikmcl9hZGRyLnNpbl9hZGRyLDQsUEZfSU5FVCk7CisgICAgICAgIGlmIChob3N0KSB7CisgICAgICAgICAgICBob3N0ID0gY2tfY29weWhvc3RlbnQoaG9zdCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJja2dldGZxaG4oKSBnZXRob3N0YnlhZGRyICE9IE5VTEwiLCIiLDApOworICAgICAgICAgICAgY2tzdHJuY3B5KG5hbWVidWYsIGhvc3QtPmhfbmFtZSwgMjU2KTsKKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIEhBRERSTElTVAorI2lmZGVmIGhfYWRkcgorICBleGl0X2Z1bmM6CisjZW5kaWYgLyogaF9hZGRyICovCisjZW5kaWYgLyogSEFERFJMSVNUICovCisKKyAgICBpZiAoaSA+IDApCisgICAgICBzdHJuY2F0KG5hbWVidWYsJm5hbWVbaS0xXSwyNTYtc3RybGVuKG5hbWVidWYpLXN0cmxlbigmbmFtZVtpLTFdKSk7CisgICAgZGVidWcoRjExMCwiY2tnZXRmcWhuKCkiLG5hbWVidWYsMCk7CisgICAgcmV0dXJuKG5hbWVidWYpOworI2VuZGlmIC8qIE5PQ0tHRVRGUUhPU1QgKi8KK30KKworVk9JRAorI2lmZGVmIENLX0FOU0lDCitzZXRucHJvdG8oY2hhciAqIHApCisjZWxzZQorc2V0bnByb3RvKHApIGNoYXIgKiBwOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKCFpc2RpZ2l0KCpwKSkgeworICAgICAgICBpZiAoIXN0cmNtcCgia2VybWl0IixwKSkKKyAgICAgICAgICB0dG5wcm90byA9IE5QX0tFUk1JVDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCgidGVsbmV0IixwKSkKKyAgICAgICAgICB0dG5wcm90byA9IE5QX1RFTE5FVDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCgiaHR0cCIscCkpCisgICAgICAgICAgdHRucHJvdG8gPSBOUF9UQ1BSQVc7CisjaWZkZWYgUkxPR0NPREUKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCgibG9naW4iLHApKQorICAgICAgICAgIHR0bnByb3RvID0gTlBfUkxPR0lOOworI2VuZGlmIC8qIFJMT0dDT0RFICovCisjaWZkZWYgQ0tfU1NMCisgICAgICAgIC8qIENvbW1vbmx5IHVzZWQgU1NMIHBvcnRzIChtaWdodCBub3QgYmUgaW4gc2VydmljZXMgZmlsZSkgKi8KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCgiaHR0cHMiLHApKSB7CisgICAgICAgICAgdHRucHJvdG8gPSBOUF9TU0w7CisgICAgICAgICAgc3NsX29ubHlfZmxhZyA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgic3NsLXRlbG5ldCIscCkpIHsKKyAgICAgICAgICB0dG5wcm90byA9IE5QX1RFTE5FVDsKKyAgICAgICAgICBzc2xfb25seV9mbGFnID0gMTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJ0ZWxuZXRzIixwKSkgeworICAgICAgICAgIHR0bnByb3RvID0gTlBfVEVMTkVUOworICAgICAgICAgIHNzbF9vbmx5X2ZsYWcgPSAxOworICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgQ0tfS0VSQkVST1MKKyNpZmRlZiBSTE9HQ09ERQorICAgICAgICBlbHNlIGlmICghc3RyY21wKCJrbG9naW4iLHApKSB7CisgICAgICAgICAgICBpZiAoY2tfa3JiNV9pc19pbnN0YWxsZWQoKSkKKyAgICAgICAgICAgICAgdHRucHJvdG8gPSBOUF9LNUxPR0lOOworICAgICAgICAgICAgZWxzZSBpZiAoY2tfa3JiNF9pc19pbnN0YWxsZWQoKSkKKyAgICAgICAgICAgICAgdHRucHJvdG8gPSBOUF9LNExPR0lOOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB0dG5wcm90byA9IE5QX1JMT0dJTjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJla2xvZ2luIixwKSkgeworICAgICAgICAgICAgaWYgKGNrX2tyYjVfaXNfaW5zdGFsbGVkKCkpCisgICAgICAgICAgICAgIHR0bnByb3RvID0gTlBfRUs1TE9HSU47CisgICAgICAgICAgICBlbHNlIGlmIChja19rcmI0X2lzX2luc3RhbGxlZCgpKQorICAgICAgICAgICAgICB0dG5wcm90byA9IE5QX0VLNExPR0lOOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB0dG5wcm90byA9IE5QX1JMT0dJTjsKKyAgICAgICAgfQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgIHR0bnByb3RvID0gTlBfTk9ORTsKKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGF0b2kocCkpIHsKKyAgICAgICAgICBjYXNlIDIzOiAgICAgICAgICAgICAgICAgICAgICAvKiBUZWxuZXQgKi8KKyAgICAgICAgICAgIHR0bnByb3RvID0gTlBfVEVMTkVUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1MTM6CisgICAgICAgICAgICB0dG5wcm90byA9IE5QX1JMT0dJTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTY0OToKKyAgICAgICAgICAgIHR0bnByb3RvID0gTlBfS0VSTUlUOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgY2FzZSA0NDM6CisgICAgICAgICAgICB0dG5wcm90byA9IE5QX1NTTDsKKyAgICAgICAgICAgIHNzbF9vbmx5X2ZsYWcgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxNTE6CisgICAgICAgICAgY2FzZSA5OTI6CisgICAgICAgICAgICB0dG5wcm90byA9IE5QX1RFTE5FVDsKKyAgICAgICAgICAgIHNzbF9vbmx5X2ZsYWcgPSAxOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAgICAgICBjYXNlIDU0MzoKKyAgICAgICAgICAgIGlmIChja19rcmI1X2lzX2luc3RhbGxlZCgpKQorICAgICAgICAgICAgICB0dG5wcm90byA9IE5QX0s1TE9HSU47CisgICAgICAgICAgICBlbHNlIGlmIChja19rcmI0X2lzX2luc3RhbGxlZCgpKQorICAgICAgICAgICAgICB0dG5wcm90byA9IE5QX0s0TE9HSU47CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHR0bnByb3RvID0gTlBfUkxPR0lOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyMTA1OgorICAgICAgICAgICAgaWYgKGNrX2tyYjVfaXNfaW5zdGFsbGVkKCkpCisgICAgICAgICAgICAgIHR0bnByb3RvID0gTlBfRUs1TE9HSU47CisgICAgICAgICAgICBlbHNlIGlmIChja19rcmI0X2lzX2luc3RhbGxlZCgpKQorICAgICAgICAgICAgICB0dG5wcm90byA9IE5QX0VLNExPR0lOOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB0dG5wcm90byA9IE5QX1JMT0dJTjsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisgICAgICAgICAgY2FzZSA4MDogICAgICAgICAgICAgICAgICAgICAgLyogSFRUUCAqLworICAgICAgICAgICAgdHRucHJvdG8gPSBOUF9UQ1BSQVc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdHRucHJvdG8gPSBOUF9OT05FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIGNrZ2V0c2VydmljZSgpIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwb3J0IG51bWJlciBmb3IgYSBnaXZlbiAqLworLyogc2VydmljZSB0YWtpbmcgaW50byBhY2NvdW50IHRoZSB1c2Ugb2YgRE5TIFNSViByZWNvcmRzLiAgICAgICAgICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2VydmVudCBzZXJ2cmVjOworc3RhdGljIHN0cnVjdCBzZXJ2ZW50ICoKK2NrZ2V0c2VydmljZShob3N0bmFtZSwgc2VydmljZW5hbWUsIGlwLCBpcGxlbikKKyAgICBjaGFyICpob3N0bmFtZTsgY2hhciAqIHNlcnZpY2VuYW1lOyBjaGFyICogaXA7IGludCBpcGxlbjsKK3sKKyAgICBzdHJ1Y3Qgc2VydmVudCAqIHNlcnZpY2UgPSBOVUxMOworI2lmZGVmIENLX0ROU19TUlYKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKiBkbnNfYWRkcnMgPSBOVUxMOworICAgIGludCBkbnNfbmFkZHJzID0gMDsKKyNlbmRpZiAvKiBDS19ETlNfU1JWICovCisKKyAgICBpZiAoaXNkaWdpdCgqc2VydmljZW5hbWUpKSB7ICAgICAgICAvKiBVc2Ugc29ja2V0IG51bWJlciB3aXRob3V0IGxvb2t1cCAqLworICAgICAgICBzZXJ2aWNlID0gJnNlcnZyZWM7CisgICAgICAgIHNlcnZpY2UtPnNfcG9ydCA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydClhdG9pKHNlcnZpY2VuYW1lKSk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIGxvb2t1cCB0aGUgc2VydmljZSBuYW1lICovCisjaWZkZWYgQ0tfRE5TX1NSVgorICAgICAgICBpZiAodGNwX2Ruc19zcnYgJiYgIXF1aWV0KSB7CisgICAgICAgICAgICBwcmludGYoIiBETlMgU1JWIExvb2t1cC4uLiAiKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICB9CisgICAgICAgIGlmICh0Y3BfZG5zX3NydiAmJgorICAgICAgICAgICAgbG9jYXRlX3Nydl9kbnMoaG9zdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0Y3AiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRuc19hZGRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkbnNfbmFkZHJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIC8qIFVzZSB0aGUgZmlyc3Qgb25lLiAgRXZlbnR1YWxseSB3ZSBzaG91bGQgY3ljbGUgdGhyb3VnaCBhbGwgKi8KKyAgICAgICAgICAgIC8qIHRoZSByZXR1cm5lZCBJUCBhZGRyZXNzZXMgYW5kIHBvcnQgbnVtYmVycy4gKi8KKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gTlVMTDsKKyNpZmRlZiBCRVRBREVCVUcKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgcHJpbnRmKCJcclxuIik7CisgICAgICAgICAgICBmb3IgKCBpPTA7aTxkbnNfbmFkZHJzO2krKyApIHsKKyAgICAgICAgICAgICAgICBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopICZkbnNfYWRkcnNbaV07CisgICAgICAgICAgICAgICAgcHJpbnRmKCJkbnNfYWRkcnNbJWRdID0gJXMgJWRcclxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopaW5ldF9udG9hKHNpbi0+c2luX2FkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMoc2luLT5zaW5fcG9ydCkpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIEJFVEFERUJVRyAqLworICAgICAgICAgICAgc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmZG5zX2FkZHJzWzBdOworICAgICAgICAgICAgaWYgKCBpcCAmJiBpcGxlbiA+IDAgKQorICAgICAgICAgICAgICAgIGNrc3RybmNweShpcCwoY2hhciAqKWluZXRfbnRvYShzaW4tPnNpbl9hZGRyKSxpcGxlbik7CisgICAgICAgICAgICBzZXJ2aWNlID0gJnNlcnZyZWM7CisgICAgICAgICAgICBzZXJ2aWNlLT5zX3BvcnQgPSBzaW4tPnNpbl9wb3J0OworCisgICAgICAgICAgICBmcmVlKGRuc19hZGRycyk7CisgICAgICAgICAgICBkbnNfYWRkcnMgPSBOVUxMOworICAgICAgICAgICAgZG5zX25hZGRycyA9IDA7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENLX0ROU19TUlYgKi8KKyAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRzZXJ2YnluYW1lKHNlcnZpY2VuYW1lLCAidGNwIik7CisgICAgfQorICAgIGlmICghc2VydmljZSkgeworICAgICAgICBpZiAoIWNrc3RyY21wKCJrZXJtaXQiLHNlcnZpY2VuYW1lLC0xLDApKSB7IC8qIEtlcm1pdCBzZXJ2aWNlIHBvcnQgKi8KKyAgICAgICAgICAgIHNlcnZpY2UgPSAmc2VydnJlYzsKKyAgICAgICAgICAgIHNlcnZpY2UtPnNfcG9ydCA9IGh0b25zKDE2NDkpOworICAgICAgICB9IGVsc2UgaWYgKCFja3N0cmNtcCgidGVsbmV0IixzZXJ2aWNlbmFtZSwtMSwwKSkgeyAvKiBUZWxuZXQgcG9ydCAqLworICAgICAgICAgICAgc2VydmljZSA9ICZzZXJ2cmVjOworICAgICAgICAgICAgc2VydmljZS0+c19wb3J0ID0gaHRvbnMoMjMpOworICAgICAgICB9IGVsc2UgaWYgKCFja3N0cmNtcCgiaHR0cCIsc2VydmljZW5hbWUsLTEsMCkpIHsKKyAgICAgICAgICAgIHNlcnZpY2UgPSAmc2VydnJlYzsKKyAgICAgICAgICAgIHNlcnZpY2UtPnNfcG9ydCA9IGh0b25zKDgwKTsKKyAgICAgICAgfQorI2lmZGVmIFJMT0dDT0RFCisgICAgICAgIGVsc2UgaWYgKCFja3N0cmNtcCgibG9naW4iLHNlcnZpY2VuYW1lLC0xLDApKSB7CisgICAgICAgICAgICBzZXJ2aWNlID0gJnNlcnZyZWM7CisgICAgICAgICAgICBzZXJ2aWNlLT5zX3BvcnQgPSBodG9ucyg1MTMpOworICAgICAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgLyogQ29tbW9ubHkgdXNlZCBTU0wgcG9ydHMgKG1pZ2h0IG5vdCBiZSBpbiBzZXJ2aWNlcyBmaWxlKSAqLworICAgICAgICBlbHNlIGlmICghY2tzdHJjbXAoImh0dHBzIixzZXJ2aWNlbmFtZSwtMSwwKSkgeworICAgICAgICAgICAgc2VydmljZSA9ICZzZXJ2cmVjOworICAgICAgICAgICAgc2VydmljZS0+c19wb3J0ID0gaHRvbnMoNDQzKTsKKyAgICAgICAgfSBlbHNlIGlmICghY2tzdHJjbXAoInNzbC10ZWxuZXQiLHNlcnZpY2VuYW1lLC0xLDApKSB7CisgICAgICAgICAgICBzZXJ2aWNlID0gJnNlcnZyZWM7CisgICAgICAgICAgICBzZXJ2aWNlLT5zX3BvcnQgPSBodG9ucygxNTEpOworICAgICAgICB9IGVsc2UgaWYgKCFja3N0cmNtcCgidGVsbmV0cyIsc2VydmljZW5hbWUsLTEsMCkpIHsKKyAgICAgICAgICAgIHNlcnZpY2UgPSAmc2VydnJlYzsKKyAgICAgICAgICAgIHNlcnZpY2UtPnNfcG9ydCA9IGh0b25zKDk5Mik7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBDS19LRVJCRVJPUworI2lmZGVmIFJMT0dDT0RFCisgICAgICAgIGVsc2UgaWYgKCFja3N0cmNtcCgia2xvZ2luIixzZXJ2aWNlbmFtZSwtMSwwKSkgeworICAgICAgICAgICAgc2VydmljZSA9ICZzZXJ2cmVjOworICAgICAgICAgICAgc2VydmljZS0+c19wb3J0ID0gaHRvbnMoNTQzKTsKKyAgICAgICAgfSBlbHNlIGlmICghY2tzdHJjbXAoImVrbG9naW4iLHNlcnZpY2VuYW1lLC0xLDApKSB7CisgICAgICAgICAgICBzZXJ2aWNlID0gJnNlcnZyZWM7CisgICAgICAgICAgICBzZXJ2aWNlLT5zX3BvcnQgPSBodG9ucygyMTA1KTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyAgICB9CisgICAgcmV0dXJuKHNlcnZpY2UpOworfQorCisvKiAgTiBFIFQgTyBQIEUgTiAgLS0gIE9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24gICovCisvKgorICBDYWxsaW5nIGNvbnZlbnRpb25zIHNhbWUgYXMgdHRvcGVuKCksIGV4Y2VwdCB0aGlyZCBhcmd1bWVudCBpcyBuZXR3b3JrCisgIHR5cGUgcmF0aGVyIHRoYW4gbW9kZW0gdHlwZS4gIERlc2lnbmVkIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0dG9wZW4uCisqLworCitpbnQKK25ldG9wZW4obmFtZSwgbGNsLCBuZXR0KSBjaGFyICpuYW1lOyBpbnQgKmxjbCwgbmV0dDsgeworICAgIGNoYXIgKnA7CisgICAgaW50IGksIHgsIGRucyA9IDA7CisjaWZkZWYgVENQU09DS0VUCisgICAgaW50IGlzY29ubmVjdCA9IDA7CisjaWZkZWYgU09fT09CSU5MSU5FCisgICAgaW50IG9uID0gMTsKKyNlbmRpZiAvKiBTT19PT0JJTkxJTkUgKi8KKyAgICBzdHJ1Y3Qgc2VydmVudCAqc2VydmljZT1OVUxMOworICAgIHN0cnVjdCBob3N0ZW50ICpob3N0PU5VTEw7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHJfYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBsX2FkZHI7CisgICAgR1NPQ0tOQU1FX1QgbF9zbGVuOworI2lmZGVmIEVYQ0VMQU4KKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VuZF9zb2NrZXQ7CisjZW5kaWYgLyogRVhDRUxBTiAqLworCisjaWZkZWYgSU5BRERSWAorLyogaW5ldF9hZGRyKCkgaXMgb2YgdHlwZSBzdHJ1Y3QgaW5fYWRkciAqLworI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgZXh0ZXJuIHN0cnVjdCBpbl9hZGRyIGluZXRfYWRkcigpOworI2Vsc2UKKyNpZmRlZiBIUFVYNVdJTlRDUAorICAgIGV4dGVybiBzdHJ1Y3QgaW5fYWRkciBpbmV0X2FkZHIoKTsKKyNlbmRpZiAvKiBIUFVYNVdJTlRDUCAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisgICAgc3RydWN0IGluX2FkZHIgaWF4OworI2Vsc2UKKyNpZmRlZiBJTkFERFJfTk9ORQorICAgIHN0cnVjdCBpbl9hZGRyIGlheDsKKyNlbHNlIC8qIElOQUREUl9OT05FICovCisgICAgbG9uZyBpYXg7CisjZW5kaWYgLyogSU5BRERSX05PTkUgKi8KKyNlbmRpZiAvKiBJTkFERFJYICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZmRlZiBDT01NRU5UCisvKiBUaGlzIGNhdXNlcyBiaWcgdHJvdWJsZSAqLworI2lmbmRlZiBJTkFERFJfTk9ORQorI2RlZmluZSBJTkFERFJfTk9ORSAweGZmZmZmZmZmCisjZW5kaWYgLyogSU5BRERSX05PTkUgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBTVU5YMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlIGZvciBTdW5MaW5rIFguMjUgc3VwcG9ydCAqLworI2RlZmluZSBYMjlQSUQgMSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFguMjkgUHJvdG9jb2wgSUQgKi8KK19QUk9UT1RZUChTSUdUWVAgeDI1b29iaCwgKGludCkgKTsKKyAgICBDT05OX0RCIHgyNWhvc3Q7CisjaWZuZGVmIFgyNV9XUl9GQUNJTElUWQorICAgIEZBQ0lMSVRZIHgyNWZhY2lsOworI2Vsc2UKKyAgICBGQUNJTElUWV9EQiB4MjVmYWNpbDsKKyNlbmRpZiAvKiBYMjVfV1JfRkFDSUxJVFkgKi8KKyAgICBzdGF0aWMgaW50IG5lZWRoID0gMTsKKyAgICBQSURfVCBwaWQ7CisgICAgZXh0ZXJuIGludCBsaW5raWQsIGxjbiwgeDI1dmVyOworI2VuZGlmIC8qIFNVTlgyNSAqLworI2lmZGVmIEFOWVgyNQorICAgIGV4dGVybiBpbnQgcmV2Y2FsbCwgY2xvc2dyLCBjdWRhdGE7CisgICAgZXh0ZXJuIGNoYXIgdWRhdGFbXTsKKyNlbmRpZiAvKiBBTllYMjUgKi8KKworI2lmZGVmIElCTVgyNSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhcmlhYmxlcyBmb3IgSUJNIFgyNSAqLworICAgIGV4dGVybiBpbnQgeDI1cG9ydDsgICAgICAgICAgICAgICAgIC8qIExvZ2ljYWwgcG9ydCB0byB1c2UgKi8KKyAgICBleHRlcm4geDI1YWRkcl90IGxvY2FsX251YTsgICAgICAgICAvKiBMb2NhbCBYLjI1IGFkZHJlc3MgKi8KKyAgICBleHRlcm4geDI1YWRkcl90IHJlbW90ZV9udWE7ICAgICAgICAvKiBSZW1vdGUgWC4yNSBhZGRyZXNzICovCisgICAgZXh0ZXJuIGNoYXIgeDI1bmFtZVtdOyAgICAgICAgICAgICAgLyogWDI1IGRldmljZSBuYW1lIChzeDI1YTApICovCisgICAgZXh0ZXJuIGNoYXIgeDI1ZGV2W107ICAgICAgICAgICAgICAgLyogWDI1IGRldmljZSBmaWxlIC9kZXYveDI1cGt0ICovCisgICAgdWxvbmcgYmluZF9mbGFncyA9IDA7ICAgICAgICAgICAgICAgLyogRmxhZ3MgZm9yIGJpbmRpbmcgdGhlIFgyNSBzdHJlYW0gKi8KKyAgICB1bG9uZyB0b2tlbiA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBUZW1wb3JhcnkgcmV0dXJuIGNvZGUgKi8KKyNlbmRpZiAvKiBJQk1YMjUgKi8KKworICAgIGRlYnVnKEYxMDEsIm5ldG9wZW4gbmV0dCIsIiIsbmV0dCk7CisgICAgKmlwYWRkciA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBJUCBhZGRyZXNzIHN0cmluZyAqLworCisjaWZkZWYgU1VOWDI1CisgICAgaWYgKG5ldHQgPT0gTkVUX1NYMjUpIHsgICAgICAgICAgICAgLyogSWYgbmV0d29yayB0eXBlIGlzIFguMjUgKi8KKyAgICAgICAgbmV0Y2xvcygpOyAgICAgICAgICAgICAgICAgICAgICAvKiBDbG9zZSBhbnkgcHJldmlvdXMgbmV0IGNvbm5lY3Rpb24gKi8KKyAgICAgICAgdHRucHJvdG8gPSBOUF9OT05FOyAgICAgICAgICAgICAvKiBObyBwcm90b2NvbCBzZWxlY3RlZCB5ZXQgKi8KKworICAgICAgICAvKiBTZXQgdXAgaG9zdCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgYnplcm8oKGNoYXIgKikmeDI1aG9zdCxzaXplb2YoeDI1aG9zdCkpOworICAgICAgICBpZiAoKHgyNWhvc3QuaG9zdGxlbiA9IHBreDEyMShuYW1lLHgyNWhvc3QuaG9zdCkpIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCJJbnZhbGlkIFguMTIxIGhvc3QgYWRkcmVzcyAlc1xuIixuYW1lKTsKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICB9CisgICAgICAgIHgyNWhvc3QuZGF0YWxlbiA9IFgyOVBJRExFTjsKKyAgICAgICAgeDI1aG9zdC5kYXRhWzBdID0gWDI5UElEOworCisgICAgICAgIC8qIFNldCBjYWxsIHVzZXIgZGF0YSBpZiBzcGVjaWZpZWQgKi8KKyAgICAgICAgaWYgKGN1ZGF0YSkgeworICAgICAgICAgICAgY2tzdHJuY3B5KChjaGFyICopeDI1aG9zdC5kYXRhK1gyOVBJRExFTix1ZGF0YSwoaW50KXN0cmxlbih1ZGF0YSkpOworICAgICAgICAgICAgeDI1aG9zdC5kYXRhbGVuICs9IChpbnQpc3RybGVuKHVkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE9wZW4gU3VuTGluayBYLjI1IHNvY2tldCAqLworICAgICAgICBpZiAoIXF1aWV0ICYmICpuYW1lKSB7CisgICAgICAgICAgICBwcmludGYoIiBUcnlpbmcgJXMuLi4gIiwgbmFtZSk7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHR0eWZkID0gc29ja2V0KEFGX1gyNSwgU09DS19TVFJFQU0sIDApKSA8IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldG9wZW4gc29ja2V0IGVycm9yIiwiIixlcnJubyk7CisgICAgICAgICAgICBwZXJyb3IgKCJYLjI1IHNvY2tldCBlcnJvciIpOworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXR0aW5nIFguMjUgb3V0LW9mLWJhbmQgZGF0YSBoYW5kbGVyICovCisgICAgICAgIHBpZCA9IGdldHBpZCgpOworICAgICAgICBpZiAoaW9jdGwodHR5ZmQsU0lPQ1NQR1JQLCZwaWQpKSB7CisgICAgICAgICAgICBwZXJyb3IoIlguMjUgc2V0IHByb2Nlc3MgZ3JvdXAgaWQgZXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgKFZPSUQpIHNpZ25hbChTSUdVUkcseDI1b29iaCk7CisKKyAgICAgICAgLyogU2V0IHJldmVyc2UgY2hhcmdlIGNhbGwgYW5kIGNsb3NlZCB1c2VyIGdyb3VwIGlmIHJlcXVlc3RlZCAqLworICAgICAgICBiemVybyAoKGNoYXIgKikmeDI1ZmFjaWwsc2l6ZW9mKHgyNWZhY2lsKSk7CisKKyNpZm5kZWYgWDI1X1dSX0ZBQ0lMSVRZCisvKiAgTmV3IFN1bkxpbmsgKDcuMCBvciA4LjAsIG5vdCBzdXJlIHdoaWNoKS4uLiAqLworICAgICAgICB4MjVmYWNpbC50eXBlID0gVF9SRVZFUlNFX0NIQVJHRTsgLyogUmV2ZXJzZSBDaGFyZ2UgKi8KKyAgICAgICAgeDI1ZmFjaWwuZl9yZXZlcnNlX2NoYXJnZSA9IHJldmNhbGwgPyAxIDogMDsKKyAgICAgICAgaWYgKGlvY3RsKHR0eWZkLFgyNV9TRVRfRkFDSUxJVFksJngyNWZhY2lsKSA8IDApIHsKKyAgICAgICAgICAgIHBlcnJvciAoIlNldHRpbmcgWC4yNSByZXZlcnNlIGNoYXJnZSIpOworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsb3NnciA+IC0xKSB7ICAgICAgICAgICAgICAvKiBDbG9zZWQgVXNlciBHcm91cCAoT3V0Z29pbmcpICovCisgICAgICAgICAgICBiemVybyAoKGNoYXIgKikmeDI1ZmFjaWwsc2l6ZW9mKHgyNWZhY2lsKSk7CisgICAgICAgICAgICB4MjVmYWNpbC50eXBlID0gVF9DVUc7CisgICAgICAgICAgICB4MjVmYWNpbC5mX2N1Z19yZXEgPSBDVUdfUkVRX0FDUzsKKyAgICAgICAgICAgIHgyNWZhY2lsLmZfY3VnX2luZGV4ID0gY2xvc2dyOworICAgICAgICAgICAgaWYgKGlvY3RsKHR0eWZkLFgyNV9TRVRfRkFDSUxJVFksJngyNWZhY2lsKSA8IDApIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IgKCJTZXR0aW5nIFguMjUgY2xvc2VkIHVzZXIgZ3JvdXAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2Vsc2UKKy8qICBPbGQgU3VuTGluayA2LjAgKG9yIDcuMD8pLi4uICovCisgICAgICAgIGlmIChyZXZjYWxsKSB4MjVmYWNpbC5yZXZlcnNlX2NoYXJnZSA9IHJldmNhbGw7CisgICAgICAgIGlmIChjbG9zZ3IgPiAtMSkgeworICAgICAgICAgICAgeDI1ZmFjaWwuY3VnX3JlcSA9IDE7CisgICAgICAgICAgICB4MjVmYWNpbC5jdWdfaW5kZXggPSBjbG9zZ3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlvY3RsKHR0eWZkLFgyNV9XUl9GQUNJTElUWSwmeDI1ZmFjaWwpIDwgMCkgeworICAgICAgICAgICAgcGVycm9yICgiU2V0dGluZyBYLjI1IGZhY2lsaXRpZXMiKTsKKyAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICB9CisjZW5kaWYgLyogWDI1X1dSX0ZBQ0lMSVRZICovCisKKyAgICAgICAgLyogIE5lZWQgWC4yNSBoZWFkZXIgd2l0aCBiaXRzIFEgYW5kIE0gKi8KKyAgICAgICAgaWYgKGlvY3RsICh0dHlmZCxYMjVfSEVBREVSLCZuZWVkaCkgPCAwKSB7CisgICAgICAgICAgICBwZXJyb3IgKCJTZXR0aW5nIFguMjUgaGVhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbm5lY3RzIHRvIHJlbW90ZSBob3N0IHZpYSBTdW5MaW5rIFguMjUgKi8KKyAgICAgICAgaWYgKGNvbm5lY3QodHR5ZmQsKHN0cnVjdCBzb2NrYWRkciAqKSZ4MjVob3N0LHNpemVvZih4MjVob3N0KSkgPCAwKSB7CisgICAgICAgICAgICBpID0gZXJybm87CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXRvcGVuIGNvbm5lY3QgZXJybm8iLCIiLGkpOworICAgICAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoIm5ldG9wZW4geDI1IGNvbm5lY3QiKTsKKyAgICAgICAgICAgICAgICB4MjVkaWFnKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoVk9JRCkgbmV0Y2xvcygpOworICAgICAgICAgICAgdHR5ZmQgPSAtMTsKKyAgICAgICAgICAgIHdhc2Nsb3NlZCA9IDE7CisgICAgICAgICAgICB0dG5wcm90byA9IE5QX05PTkU7CisgICAgICAgICAgICBlcnJubyA9IGk7CisgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEdldCBYLjI1IGxpbmsgaWRlbnRpZmljYXRpb24gdXNlZCBmb3IgdGhlIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgaWYgKGlvY3RsKHR0eWZkLFgyNV9HRVRfTElOSywmbGlua2lkKSA8IDApIHsKKyAgICAgICAgICAgIHBlcnJvciAoIkdldHRpbmcgWC4yNSBsaW5rIGlkIik7CisgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEdldCBYLjI1IGxvZ2ljYWwgY2hhbm5lbCBudW1iZXIgdXNlZCBmb3IgdGhlIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgaWYgKGlvY3RsKHR0eWZkLFgyNV9SRF9MQ0dOLCZsY24pIDwgMCkgeworICAgICAgICAgICAgcGVycm9yICgiR2V0dGluZyBYLjI1IGxjbiIpOworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgU3VuTGluayBYLjI1IHZlcnNpb24gKi8KKyAgICAgICAgaWYgKGlvY3RsKHR0eWZkLFgyNV9WRVJTSU9OLCZ4MjV2ZXIpIDwgMCkgeworICAgICAgICAgICAgcGVycm9yICgiR2V0dGluZyBTdW5MaW5rIFguMjUgdmVyc2lvbiIpOworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKyAgICAgICAgdHRuZXQgPSBuZXR0OyAgICAgICAgICAgICAgICAgICAvKiBTdW5saW5rIFguMjUgbmV0d29yayAqLworICAgICAgICB0dG5wcm90byA9IE5QX1gzOyAgICAgICAgICAgICAgIC8qIFBBRCBYLjMsIFguMjgsIFguMjkgcHJvdG9jb2wgKi8KKyAgICAgICAgaWYgKGxjbCkgaWYgKCpsY2wgPCAwKSAqbGNsID0gMTsgLyogTG9jYWwgbW9kZSAqLworICAgICAgICByZXR1cm4oMCk7CisgICAgfSBlbHNlIC8qIE5vdGUgdGhhdCBTVU5YMjUgc3VwcG9ydCBjYW4gY29leGlzdCB3aXRoIFRDUC9JUCBzdXBwb3J0LiAqLworI2VuZGlmIC8qIFNVTlgyNSAqLworCisjaWZkZWYgSUJNWDI1CisgICAgLyogcmllaG0gKi8KKyAgICBpZiAobmV0dCA9PSBORVRfSVgyNSkgeyAgICAgICAgICAgICAvKiBJQk0gQUlYIFguMjUgKi8KKyAgICAgICAgbmV0Y2xvcygpOyAgICAgICAgICAgICAgICAgICAgICAvKiBDbG9zZSBhbnkgcHJldmlvdXMgbmV0IGNvbm5lY3Rpb24gKi8KKyAgICAgICAgdHRucHJvdG8gPSBOUF9OT05FOyAgICAgICAgICAgICAvKiBObyBwcm90b2NvbCBzZWxlY3RlZCB5ZXQgKi8KKworICAgICAgICAvKiBmaW5kIG91dCB3aG8gd2UgYXJlIC0gdGhpcyBpcyBub3Qgc28gZWFzeSBvbiBBSVggKi8KKyAgICAgICAgLyogcmllaG06IG5lZWQgdG8gd3JpdGUgdGhlIGNvZGUgdGhhdCBmaW5kcyB0aGlzIG91dAorICAgICAgICAgKiBhdXRvbWF0aWNhbGx5LCBvciBhdCBsZWFzdCBhbGxvdyBpdCB0byBiZSBjb25maWd1cmVkCisgICAgICAgICAqIHNvbWVob3cKKyAgICAgICAgICovCisgICAgICAgIGlmICghbG9jYWxfbnVhWzBdICYmICF4MjVsb2NhbF9udWEobG9jYWxfbnVhKSkgeworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIFgyNSBBUEkgKG9uY2UgcGVyIHByb2Nlc3M/IG9uY2UgcGVyIGNvbm5lY3Rpb24/KSAqLworCisgICAgICAgIGRlYnVnKEYxMTAsICJPcGVuaW5nICIsIHgyNWRldiwgMCApOworICAgICAgICAvKiBzZXQgT19OREVMQVkgdG8gYWxsb3cgcG9sbGluZz8gKi8KKyAgICAgICAgaWYgKCh0dHlmZCA9IG9wZW4oeDI1ZGV2LCBPX1JEV1IpKSA8IDApIHsKKyAgICAgICAgICAgIHBlcnJvciAoIlguMjUgZGV2aWNlIG9wZW4gZXJyb3IiKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldG9wZW46IGRldmljZSBvcGVuIGVycm9yIiwiIixlcnJubyk7CisgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHB1c2ggdGhlIE5QSSBvbnRvIHRoZSBTVFJFQU0gKi8KKyAgICAgICAgaWYgKGlvY3RsKHR0eWZkLElfUFVTSCwibnBpIikgPCAwICkgeworICAgICAgICAgICAgY2xvc2UodHR5ZmQpOworICAgICAgICAgICAgdHR5ZmQgPSAtMTsKKyAgICAgICAgICAgIHdhc2Nsb3NlZCA9IDE7CisgICAgICAgICAgICBwZXJyb3IoICJrZXJtaXQ6IG5ldG9wZW4oKTogY291bGRuJ3QgcHVzaCBucGkgb24gdGhlIFgyNSBzdHJlYW0iICk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXRvcGVuOiBjYW4ndCBwdXNoIG5waSBvbiB0aGUgWDI1IHN0cmVhbSIsIiIsZXJybm8pOworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBzZXQgdXAgc2VydmVyIG1vZGUgLSBiaW5kIHRoZSB4MjUgcG9ydCBhbmQgd2FpdCBmb3IKKyAgICAgICAgICogaW5jb21pbmcgY29ubmVjdGlvbnMKKyAgICAgICAgICovCisgICAgICAgIGlmIChuYW1lWzBdID09ICcqJykgeyAgICAgICAgICAgLyogU2VydmVyICovCisgICAgICAgICAgICAvKiBzZXQgdXAgYSBzZXJ2ZXIgLSBzZWUgdGhlIHdhcm5pbmcgaW4geDI1YmluZCgpICovCisgICAgICAgICAgICBiaW5kX2ZsYWdzIHw9IFRPS0VOX1JFUVVFU1Q7CisKKyAgICAgICAgICAgIC8qIGJpbmQga2VybWl0IHRvIHRoZSBsb2NhbCBYMjUgYWRkcmVzcyAqLworICAgICAgICAgICAgdG9rZW4gPSB4MjViaW5kKHR0eWZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX251YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXN0cmxlbiggdWRhdGEgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyNXBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZF9mbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBpZiAodG9rZW4gPCAwKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwibmV0b3BlbjogY291bGRuJ3QgYmluZCB0byBsb2NhbCBYMjUgYWRkcmVzcyIsIiIsMCk7CisgICAgICAgICAgICAgICAgbmV0Y2xvcygpOworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBDdXJyZW50bHkgbm90IGNvbm5lY3RlZCB0byBhIHJlbW90ZSBob3N0ICovCisKKyAgICAgICAgICAgIHJlbW90ZV9udWFbMF0gPSAnXDAnOworCisgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZmQgc28gdGhhdCBpbmNvbWluZyBjYWxscyBjYW4gaGF2ZSB0aGVpciBvd24gZmQKKyAgICAgICAgICAgICAqIFRoaXMgaXMgYWxtb3N0IHN1cHBvcnQgZm9yIGEgdHJ1ZSBzZXJ2ZXIgKGllOiBhJ2xhIGZ0cGQpCisgICAgICAgICAgICAgKiBidXQgd2UncmUgbm90IHF1aXRlIHRoZXJlIHlldC4KKyAgICAgICAgICAgICAqIHVzZWQgaW4gbmV0Y2xvcygpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHgyNXNlcnZlcmZkID0gdHR5ZmQ7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogd2FpdCBmb3IgYW4gaW5jb21pbmcgY2FsbAorICAgICAgICAgICAgICogdGhpcyBzaG91bGQgaGFwcGVuIGluIHRoZSAic2VydmVyIiBjb21tYW5kIGFuZCBub3QgaW4KKyAgICAgICAgICAgICAqIHRoZSAic2V0IGhvc3QgKiIgY29tbWFuZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCh0dHlmZCA9IHgyNWdldGNhbGwodHR5ZmQpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGllbnQgKi8KKyAgICAgICAgICAgIC8qIEJpbmQga2VybWl0IHRvIHRoZSBsb2NhbCBYMjUgYWRkcmVzcyAqLworICAgICAgICAgICAgdG9rZW4gPSB4MjViaW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eWZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX251YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyNXBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZF9mbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBpZiAodG9rZW4gPCAwKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwibmV0b3BlbjogY291bGRuJ3QgYmluZCB0byBsb2NhbCBYMjUgYWRkcmVzcyIsIiIsMCk7CisgICAgICAgICAgICAgICAgbmV0Y2xvcygpOworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisvKiByaWVobTogdGhpcyBzaG91bGQgYmUgZG9uZSB2aWEgdGhlIENPTk5FQ1QgY29tbWFuZCwgbm90IEhPU1QhICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeDI1c2VydmVyZmQgPSAwOworICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIHJlbW90ZSBob3N0ICovCisgICAgICAgICAgICAgICAgLyogbmFtZSA9PSBhZGRyZXNzIG9mIHJlbW90ZSBob3N0IGFzIGNoYXIqICovCisgICAgICAgICAgICAgICAgaWYgKHgyNWNhbGwodHR5ZmQsIG5hbWUsIHVkYXRhKSA8IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXRvcGVuOiBjb3VsZG4ndCBjb25uZWN0IHRvIHJlbW90ZSBYMjUgYWRkcmVzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbmV0Y2xvcygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJjcHkocmVtb3RlX251YSwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHRuZXQgPSBuZXR0OyAgICAgICAgICAgICAgICAgICAvKiBBSVggWC4yNSBuZXR3b3JrICovCisgICAgICAgIGlmIChsY2wpIGlmICgqbGNsIDwgMCkgKmxjbCA9IDE7IC8qIExvY2FsIG1vZGUgKi8KKyAgICAgICAgcmV0dXJuKDApOworCisgICAgfSBlbHNlIC8qIE5vdGUgdGhhdCBJQk1YMjUgc3VwcG9ydCBjYW4gY29leGlzdCB3aXRoIFRDUC9JUCBzdXBwb3J0LiAqLworI2VuZGlmIC8qIElCTVgyNSAqLworCisvKiAgIEFkZCBzdXBwb3J0IGZvciBvdGhlciBuZXR3b3JrcyBoZXJlLiAqLworCisgICAgICBpZiAobmV0dCAhPSBORVRfVENQQikgcmV0dXJuKC0xKTsgLyogQlNEIHNvY2tldCBzdXBwb3J0ICovCisKKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICBuZXRjbG9zKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbG9zZSBhbnkgcHJldmlvdXMgY29ubmVjdGlvbi4gKi8KKyAgICBja3N0cm5jcHkobmFtZWNvcHksIG5hbWUsIE5BTUVDUFlMKTsgICAgICAgIC8qIENvcHkgdGhlIGhvc3RuYW1lLiAqLworICAgIGRlYnVnKEYxMTAsIm5ldG9wZW4gbmFtZWNvcHkiLG5hbWVjb3B5LDApOworCisjaWZuZGVmIE5PTElTVEVOCisgICAgaWYgKG5hbWVbMF0gPT0gJyonKQorICAgICAgcmV0dXJuKHRjcHNydl9vcGVuKG5hbWUsIGxjbCwgbmV0dCwgMCkpOworI2VuZGlmIC8qIE5PTElTVEVOICovCisKKyAgICBwID0gbmFtZWNvcHk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBXYXMgYSBzZXJ2aWNlIHJlcXVlc3RlZD8gKi8KKyAgICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSAnOicpIHArKzsgLyogTG9vayBmb3IgY29sb24gKi8KKyAgICBpZiAoKnAgPT0gJzonKSB7ICAgICAgICAgICAgICAgICAgICAvKiBIYXZlIGEgY29sb24gKi8KKyAgICAgICAgZGVidWcoRjExMCwibmV0b3BlbiBuYW1lIGhhcyBjb2xvbiIsbmFtZWNvcHksMCk7CisgICAgICAgICpwKysgPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHNlcnZpY2UgbmFtZSBvciBudW1iZXIgKi8KKyNpZmRlZiBDS19VUkwKKyAgICAgICAgLyoKKyAgICAgICAgICAgSGVyZSB3ZSBoYXZlIHRvIGNoZWNrIGZvciB2YXJpb3VzIHBvcHVsYXIgc3ludGF4ZXM6CisgICAgICAgICAgIGhvc3Q6cG9ydCAob3VyIG9yaWdpbmFsIHN5bnRheCkKKyAgICAgICAgICAgVVJMIHN1Y2ggYXMgdGVsbmV0Omhvc3Qgb3IgdGVsbmV0Oi8vaG9zdC8KKyAgICAgICAgICAgT3IgZXZlbiB0ZWxuZXQ6Ly91c2VyOnBhc3N3b3JkQGhvc3Q6cG9ydC9wYXRoLworICAgICAgICAgICBPciBhIG1hbGZvcm1lZCBVUkwgc3VjaCBhcyBnZW5lcmF0ZWQgYnkgTmV0c2NhcGUgNC4wIGxpa2U6CisgICAgICAgICAgIHRlbG5ldDp0ZWxuZXQgb3IgdGVsbmV0Ojpob3N0LgorICAgICAgICAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIFJFUExBQ0UgVEhJUyBDT0RFIFdJVEggdXJscGFyc2UoKSBidXQgbm90IG9uIHRoZSBkYXkgb2YgdGhlCisgICAgICAgICAqIEMtS2VybWl0IDguMCBSRUxFQVNFLgorICAgICAgICAgKi8KKworICAgICAgICBpZiAoKnAgPT0gJzonKSAgICAgICAgICAgICAgICAgIC8qIGEgc2Vjb25kIGNvbG9uICovCisgICAgICAgICAgKnArKyA9ICdcMCc7ICAgICAgICAgICAgICAgICAgLyogZ2V0IHJpZCBvZiB0aGF0IG9uZSB0b28gKi8KKyAgICAgICAgd2hpbGUgKCpwID09ICcvJykgKnArKyA9ICdcMCc7ICAvKiBhbmQgc2xhc2hlcyAqLworICAgICAgICB4ID0gc3RybGVuKHApOyAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiByZW1haW5kZXIgKi8KKyAgICAgICAgaWYgKHBbeC0xXSA9PSAnLycpICAgICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBhIHRyYWlsaW5nIHNsYXNoICovCisgICAgICAgICAgcFt4LTFdID0gJ1wwJzsgICAgICAgICAgICAgICAgLyogcmVtb3ZlIGl0LiAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJuZXRvcGVuIG5hbWVjb3B5IGFmdGVyIHN0cmlwcGluZyIsbmFtZWNvcHksMCk7CisgICAgICAgIGRlYnVnKEYxMTAsIm5ldG9wZW4gcCBhZnRlciBzdHJpcHBpbmciLHAsMCk7CisgICAgICAgIHNlcnZpY2UgPSBnZXRzZXJ2YnluYW1lKG5hbWVjb3B5LCJ0Y3AiKTsKKyAgICAgICAgaWYgKHNlcnZpY2UgfHwKKyNpZmRlZiBSTE9HQ09ERQorICAgICAgICAgICAgIWNrc3RyY21wKCJybG9naW4iLG5hbWVjb3B5LE5BTUVDUFlMLDApIHx8CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICFja3N0cmNtcCgidGVsbmV0cyIsbmFtZWNvcHksTkFNRUNQWUwsMCkgfHwKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICFja3N0cmNtcCgiaWtzZCIsbmFtZWNvcHksTkFNRUNQWUwsMCkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgY2hhciB0ZW1waG9zdFsyNTZdLCB0ZW1wc2VydmljZVs4MF0sIHRlbXBwYXRoWzI1Nl07CisgICAgICAgICAgICBjaGFyICogcSA9IHAsICpyID0gcCwgKncgPSBwOworICAgICAgICAgICAgaW50IHVpZGZvdW5kPTA7CisgICAgICAgICAgICBleHRlcm4gY2hhciBwd2J1ZltdOworICAgICAgICAgICAgZXh0ZXJuIGludCBwd2ZsZywgcHdjcnlwdDsKKworICAgICAgICAgICAgaWYgKHR0bnByb3RvID09IE5QX0RFRkFVTFQpCisgICAgICAgICAgICAgIHNldG5wcm90byhuYW1lY29weSk7CisKKyAgICAgICAgICAgIC8qIENoZWNrIGZvciB1c2VyaWQgYW5kIHBvc3NpYmx5IHBhc3N3b3JkICovCisgICAgICAgICAgICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSAnQCcpCisgICAgICAgICAgICAgICAgcCsrOyAvKiBsb29rIGZvciBAICovCisgICAgICAgICAgICBpZiAoKnAgPT0gJ0AnKSB7CisgICAgICAgICAgICAgICAgLyogZm91bmQgdXNlcm5hbWUgYW5kIHBlcmhhcHMgcGFzc3dvcmQgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJuZXRvcGVuIG5hbWVjb3B5IGZvdW5kIEAiLCIiLDApOworICAgICAgICAgICAgICAgICpwID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgd2hpbGUgKCp3ICE9ICdcMCcgJiYgKncgIT0gJzonKQorICAgICAgICAgICAgICAgICAgdysrOworICAgICAgICAgICAgICAgIGlmICgqdyA9PSAnOicpCisgICAgICAgICAgICAgICAgICAqdysrID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAvKiByIG5vdyBwb2ludHMgdG8gdXNlcm5hbWUsIHNhdmUgaXQgYW5kIHRoZSBwYXNzd29yZCAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsIm5ldG9wZW4gbmFtZWNvcHkgdXNlcm5hbWUiLHIsMCk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwibmV0b3BlbiBuYW1lY29weSBwYXNzd29yZCIsdywwKTsKKyAgICAgICAgICAgICAgICB1aWRmb3VuZD0xOworICAgICAgICAgICAgICAgIGlmICggc3RyY21wKHVpZGJ1ZixyKSB8fCAqdyApCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShwd2J1Zix3LFBXQlVGTCsxKTsKKyAgICAgICAgICAgICAgICBja3N0cm5jcHkodWlkYnVmLHIsVUlEQlVGTEVOKTsKKyAgICAgICAgICAgICAgICBwd2ZsZyA9IDE7CisgICAgICAgICAgICAgICAgcHdjcnlwdCA9IDA7CisgICAgICAgICAgICAgICAgcSA9IHA7ICAgICAgICAgICAgICAgICAgLyogSG9zdCBhZnRlciB1c2VyIGFuZCBwd2QgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcCA9IHE7ICAgICAgICAgICAgICAgICAgLyogTm8gdXNlcm5hbWUgb3IgcGFzc3dvcmQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdyB3ZSBtdXN0IGxvb2sgZm9yIHRoZSBvcHRpb25hbCBwb3J0LiAqLworICAgICAgICAgICAgZGVidWcoRjExMCwibmV0b3BlbiB4IHAiLHAsMCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJuZXRvcGVuIHggcSIscSwwKTsKKworICAgICAgICAgICAgLyogTG9vayBmb3IgdGhlIHBvcnQvc2VydmljZSBvciBhIGZpbGUvZGlyZWN0b3J5IHBhdGggKi8KKyAgICAgICAgICAgIHdoaWxlICgqcCAhPSAnXDAnICYmICpwICE9ICc6JyAmJiAqcCAhPSAnLycpCisgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnOicpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJuZXRvcGVuIGZvdW5kIHBvcnQiLHEsMCk7CisgICAgICAgICAgICAgICAgKnArKyA9ICdcMCc7ICAgICAgICAgICAgLyogRm91bmQgYSBwb3J0IG5hbWUgb3IgbnVtYmVyICovCisgICAgICAgICAgICAgICAgciA9IHA7CisKKyAgICAgICAgICAgICAgICAvKiBMb29rIGZvciB0aGUgZW5kIG9mIHBvcnQvc2VydmljZSBvciBhIGZpbGUvZGlyZWN0b3J5IHBhdGggKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSAnLycpCisgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gJy8nKQorICAgICAgICAgICAgICAgICAgICAqcCsrID0gJ1wwJzsKKworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsIm5ldG9wZW4gcG9ydCIsciwwKTsKKyAgICAgICAgICAgICAgICBja3N0cm5jcHkodGVtcHNlcnZpY2Usciw4MCk7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHRlbXBob3N0LHEsMjU2KTsKKyAgICAgICAgICAgICAgICBja3N0cm5jcHkodGVtcHBhdGgscCwyNTYpOworICAgICAgICAgICAgICAgIGNrc3RybmNweShuYW1lY29weSx0ZW1waG9zdCxOQU1FQ1BZTCk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwibmV0b3BlbiB0ZW1wc2VydmljZSIsdGVtcHNlcnZpY2UsMCk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwibmV0b3BlbiB0ZW1waG9zdCIsdGVtcGhvc3QsMCk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwibmV0b3BlbiB0ZW1wcGF0aCIsdGVtcHBhdGgsMCk7CisKKyAgICAgICAgICAgICAgICAvKiBtb3ZlIHBvcnQvc2VydmljZSB0byBhIGJ1ZmZlciB0aGF0IHdvbid0IGdvIGF3YXkgKi8KKyAgICAgICAgICAgICAgICB4ID0gc3RybGVuKG5hbWVjb3B5KTsKKyAgICAgICAgICAgICAgICBwID0gbmFtZWNvcHkgKyB4ICsgMTsKKyAgICAgICAgICAgICAgICBja3N0cm5jcHkocCwgdGVtcHNlcnZpY2UsIE5BTUVDUFlMIC0geCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEhhbmRsZSBhIHBhdGggaWYgd2UgZm91bmQgb25lICovCisgICAgICAgICAgICAgICAgaWYgKCpwID09ICcvJykKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9ICdcMCc7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHRlbXBwYXRoLHAsMjU2KTsKKworICAgICAgICAgICAgICAgIC8qIFdlIGRpZG4ndCBmaW5kIGFub3RoZXIgcG9ydCwgYnV0IGlmIHEgaXMgYSBzZXJ2aWNlICovCisgICAgICAgICAgICAgICAgLyogdGhlbiBhc3N1bWUgdGhhdCBuYW1lY29weSBpcyBhY3R1YWxseSBhIGhvc3QuICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoZ2V0c2VydmJ5bmFtZShxLCJ0Y3AiKSkgeworICAgICAgICAgICAgICAgICAgICBwID0gcTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworI2lmZGVmIFJMT0dDT0RFCisgICAgICAgICAgICAgICAgICAgIC8qIHJsb2dpbiBpcyBub3QgYSB2YWxpZCBzZXJ2aWNlICovCisgICAgICAgICAgICAgICAgICAgIGlmICghY2tzdHJjbXAoInJsb2dpbiIsbmFtZWNvcHksNiwwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KG5hbWVjb3B5LCJsb2dpbiIsTkFNRUNQWUwpOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogaWtzZCBpcyBub3QgYSB2YWxpZCBzZXJ2aWNlICovCisgICAgICAgICAgICAgICAgICAgIGlmICghY2tzdHJjbXAoImlrc2QiLG5hbWVjb3B5LDYsMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShuYW1lY29weSwia2VybWl0IixOQU1FQ1BZTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogUmVjb25zdHJ1Y3QgbmFtZWNvcHkgKi8KKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHRlbXBzZXJ2aWNlLG5hbWVjb3B5LDgwKTsKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHRlbXBob3N0LHEsMjU2KTsKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KG5hbWVjb3B5LHRlbXBob3N0LE5BTUVDUFlMKTsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwibmV0b3BlbiB0ZW1wc2VydmljZSIsdGVtcHNlcnZpY2UsMCk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsIm5ldG9wZW4gdGVtcGhvc3QiLHRlbXBob3N0LDApOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJuZXRvcGVuIHRlbXBwYXRoIix0ZW1wcGF0aCwwKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBtb3ZlIHBvcnQvc2VydmljZSB0byBhIGJ1ZmZlciB0aGF0IHdvbid0IGdvIGF3YXkgKi8KKyAgICAgICAgICAgICAgICAgICAgeCA9IHN0cmxlbihuYW1lY29weSk7CisgICAgICAgICAgICAgICAgICAgIHAgPSBuYW1lY29weSArIHggKyAxOworICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkocCwgdGVtcHNlcnZpY2UsIE5BTUVDUFlMIC0geCAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsIm5ldG9wZW4gVVJMIHJlc3VsdDogaG9zdCIsbmFtZWNvcHksMCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJuZXRvcGVuIFVSTCByZXN1bHQ6IHNlcnZpY2UiLHAsMCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJuZXRvcGVuIFVSTCByZXN1bHQ6IHBhdGgiLHRlbXBwYXRoLDApOworCisjaWZkZWYgSUtTX0dFVAorICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBzZXQgYSBwYXRoIHNwZWNpZmllZCwgd2UgbmVlZCB0byB0cnkgdG8gR0VUIGl0ICovCisgICAgICAgICAgICAvKiBCdXQgd2UgaGF2ZSBhbm90aGVyIHByb2JsZW0sIHdlIGhhdmUgdG8gbG9naW4gZmlyc3QuICBIb3cgKi8KKyAgICAgICAgICAgIC8qIGRvIHdlIHNwZWNpZnkgdGhhdCBhIGxvZ2luIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIEdFVD8gICAqLworICAgICAgICAgICAgLyogVGhlIHVzZXIncyBuYW1lIGlmIHNwZWNpZmllZCBpcyBpbiAndXNlcmlkJyBhbmQgdGhlICAgICAgICovCisgICAgICAgICAgICAvKiBwYXNzd29yZCBpZiBhbnkgaXMgaW4gJ3B3YnVmJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggdGVtcHBhdGhbMF0gKSB7CisgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBhY3Rpb247CisgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBjbWFyZzsKKworICAgICAgICAgICAgICAgIGlmICggIXVpZGZvdW5kICkgeworICAgICAgICAgICAgICAgICAgICAvKiBJZiBubyB1c2VyaWQgd2FzIHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZSBVUkwgYnV0CisgICAgICAgICAgICAgICAgICAgICAqIGEgcGF0aCB3YXMgc3BlY2lmaWVkLCB0aGVuIHdlCisgICAgICAgICAgICAgICAgICAgICAqIHNldCB0aGUgdXNlciBuYW1lIHRvIGFub255bW91cyBhbmQgdGhlIHBhc3N3b3JkCisgICAgICAgICAgICAgICAgICAgICAqIHRvIHRoZSBjdXJyZW50IHVzZXJpZC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShwd2J1Zix1aWRidWYsUFdCVUZMKTsKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHB3YnVmLCJAIixQV0JVRkwpOworICAgICAgICAgICAgICAgICAgICBwd2ZsZyA9IDE7CisgICAgICAgICAgICAgICAgICAgIHB3Y3J5cHQgPSAwOworICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkodWlkYnVmLCJhbm9ueW1vdXMiLFVJREJVRkxFTik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBJZiBhIGZpbGUgcGF0aCB3YXMgc3BlY2lmaWVkIHdlIHBlcmZvcm0gdGhlIEdFVAorICAgICAgICAgICAgICAgICAqIG9wZXJhdGlvbiBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBJZiBhIGRpcmVjdG9yeSB3YXMgZ2l2ZW4gaW5zdGVhZCBvZiBhIGZpbGUsIHRoZW4KKyAgICAgICAgICAgICAgICAgKiB3ZSBzaG91bGQgUkVNT1RFIENEIHRvIHRoZSBkaXJlY3RvcnkgYW5kIGxpc3QgaXRzCisgICAgICAgICAgICAgICAgICogY29udGVudHMuICBCdXQgaG93IGRvIHdlIHRlbGwgdGhlIGRpZmZlcmVuY2U/CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbWFrZXN0cigmY21hcmcsdGVtcHBhdGgpOworICAgICAgICAgICAgICAgIGFjdGlvbiA9ICdyJzsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NfR0VUICovCisgICAgICAgIH0KKyNlbmRpZiAvKiBDS19VUkwgKi8KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdGhlcndpc2UgdXNlIHRlbG5ldCAqLworICAgICAgICBwID0gInRlbG5ldCI7CisgICAgfQorLyoKKyAgQnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUsIG5hbWVjb3B5W10gc2hvdWxkIGhvbGQgdGhlIG51bGwtdGVybWluYXRlZAorICBob3N0bmFtZSBvciBhZGRyZXNzLCBhbmQgcCBzaG91bGQgcG9pbnQgdG8gdGhlIHNlcnZpY2UgbmFtZSBvciBudW1iZXIuCisqLworICAgIGRlYnVnKEYxMTAsIm5ldG9wZW4gaG9zdCIsbmFtZWNvcHksMCk7CisgICAgZGVidWcoRjExMCwibmV0b3BlbiBzZXJ2aWNlIHJlcXVlc3RlZCIscCwwKTsKKworICAgLyogVXNlIHRoZSBzZXJ2aWNlIHBvcnQgdG8gc2V0IHRoZSBkZWZhdWx0IHByb3RvY29sIHR5cGUgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKHR0bnByb3RvID09IE5QX0RFRkFVTFQpCisgICAgICAgc2V0bnByb3RvKHApOworCisgICAgY2tzdHJuY3B5KG5hbWVjb3B5MixuYW1lY29weSxOQU1FQ1BZTCk7CisgICAgc2VydmljZSA9IGNrZ2V0c2VydmljZShuYW1lY29weSxwLG5hbWVjb3B5LE5BTUVDUFlMKTsKKyAgICBpZiAoIXNlcnZpY2UpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBmaW5kIHBvcnQgZm9yIHNlcnZpY2UgJXNcbiIsIHApOworI2lmZGVmIFRHVk9SV0lOCisgICAgICAgIGRlYnVnKEYxMDEsIm5ldG9wZW4gY2FuJ3QgZ2V0IHNlcnZpY2UiLCIiLHNvY2tldF9lcnJubyk7CisjZWxzZQorICAgICAgICBkZWJ1ZyhGMTAxLCJuZXRvcGVuIGNhbid0IGdldCBzZXJ2aWNlIiwiIixlcnJubyk7CisjZW5kaWYgLyogVEdWT1JXSU4gKi8KKyAgICAgICAgZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgIC8qIChyYXRoZXIgdGhhbiBtaXNsZWFkKSAqLworICAgICAgICByZXR1cm4oLTEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghY2tzdHJjbXAobmFtZWNvcHksbmFtZWNvcHkyLC0xLDApKQorCSAgbmFtZWNvcHkyWzBdID0gJ1wwJzsKKyAgICAgICAgY2tzdHJuY3B5KHN2Y2J1Zixja3VpdG9hKG50b2hzKHNlcnZpY2UtPnNfcG9ydCkpLHNpemVvZihzdmNidWYpKTsKKyAgICAgICAgZGVidWcoRjExMCwibmV0b3BlbiBzZXJ2aWNlIG9rIixzdmNidWYsMCk7CisgICAgfQorCisjaWZkZWYgUkxPR0NPREUKKyAgICBpZiAoc2VydmljZSAmJiAhc3RyY21wKCJsb2dpbiIscCkgJiYgc2VydmljZS0+c19wb3J0ICE9IGh0b25zKDUxMykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIiAgV2FybmluZzogbG9naW4gc2VydmljZSBvbiBwb3J0ICVkIGluc3RlYWQgb2YgcG9ydCA1MTNcbiIsCisgICAgICAgICAgICAgICAgIG50b2hzKHNlcnZpY2UtPnNfcG9ydCkKKyAgICAgICAgICAgICAgICApOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgRWRpdCBTRVJWSUNFUyBmaWxlIGlmIFJMT0dJTiBmYWlscyB0byBjb25uZWN0LlxuIik7CisgICAgICAgIGRlYnVnKEYxMDEsInRjcHNydl9vcGVuIGxvZ2luIG9uIHBvcnQiLCIiLG50b2hzKHNlcnZpY2UtPnNfcG9ydCkpOworICAgIH0KKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworCisjaWZuZGVmIE5PSFRUUAorICAgLyogRm9yIEhUVFAgY29ubmVjdGlvbnMgd2UgbXVzdCBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgaG9zdG5hbWUgYW5kICovCisgICAvKiBzZXJ2aWNlIHJlcXVlc3RlZCBzbyB3ZSBjYW4gaW5jbHVkZSB0aGVtIGluIHRoZSBIb3N0IGhlYWRlci4gICAgKi8KKyAgICBja21ha21zZyhodHRwX2hvc3RfcG9ydCxzaXplb2YoaHR0cF9ob3N0X3BvcnQpLG5hbWVjb3B5LCI6IiwKKyAgICAgICAgICAgICAgY2tpdG9hKG50b2hzKHNlcnZpY2UtPnNfcG9ydCkpLE5VTEwpOworCisgICAgLyogJ25hbWVjb3B5JyBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgaG9zdCB0byB3aGljaCB3ZSB3YW50IHRvIGNvbm5lY3QgKi8KKyAgICAvKiAnc3ZjYnVmJyAgIGNvbnRhaW5zIHRoZSBzZXJ2aWNlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICdzZXJ2aWNlLT5zX3BvcnQnIGNvbnRhaW5zIHRoZSBwb3J0IG51bWJlciBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgICAgICovCisKKyAgICAvKiBJZiB3ZSBhcmUgdXNpbmcgYW4gaHR0cCBwcm94eSwgd2UgbmVlZCB0byBjcmVhdGUgYSBidWZmZXIgY29udGFpbmluZyAqLworICAgIC8qICAgaG9zdG5hbWU6cG9ydC1udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogdG8gcGFzcyB0byB0aGUgaHR0cF9jb25uZWN0KCkgZnVuY3Rpb24uICBUaGVuIHdlIG5lZWQgdG8gcmVwbGFjZSAgICAgKi8KKyAgICAvKiAnbmFtZWNvcHknIHdpdGggdGhlIG5hbWUgb2YgdGhlIHByb3h5IHNlcnZlciBhbmQgdGhlIHNlcnZpY2UtPnNfcG9ydCAqLworICAgIC8qIHdpdGggdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBwcm94eSAoZGVmYXVsdCBwb3J0IDgwKS4gICAgICAgICAgICAgICAgICovCisKKyAgICBpZiAoIHRjcF9odHRwX3Byb3h5ICkgeworICAgICAgICBja21ha21zZyhwcm94eWNvcHksc2l6ZW9mKHByb3h5Y29weSksbmFtZWNvcHksIjoiLAorICAgICAgICAgICAgICAgICBja3VpdG9hKG50b2hzKHNlcnZpY2UtPnNfcG9ydCkpLE5VTEwpOworICAgICAgICBja3N0cm5jcHkobmFtZWNvcHksdGNwX2h0dHBfcHJveHksTkFNRUNQWUwpOworCisgICAgICAgIHAgPSBuYW1lY29weTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhcyBhIHNlcnZpY2UgcmVxdWVzdGVkPyAqLworICAgICAgICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSAnOicpIHArKzsgLyogTG9vayBmb3IgY29sb24gKi8KKyAgICAgICAgaWYgKCpwID09ICc6JykgeyAgICAgICAgICAgICAgICAgICAgLyogSGF2ZSBhIGNvbG9uICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJuZXRvcGVuIG5hbWUgaGFzIGNvbG9uIixuYW1lY29weSwwKTsKKyAgICAgICAgICAgICpwKysgPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHNlcnZpY2UgbmFtZSBvciBudW1iZXIgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmNweSgrK3AsImh0dHAiKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlcnZpY2UgPSBja2dldHNlcnZpY2UobmFtZWNvcHkscCxuYW1lY29weSxOQU1FQ1BZTCk7CisgICAgICAgIGlmICghc2VydmljZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBmaW5kIHBvcnQgZm9yIHNlcnZpY2UgJXNcbiIsIHApOworI2lmZGVmIFRHVk9SV0lOCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXRvcGVuIGNhbid0IGdldCBzZXJ2aWNlIGZvciBwcm94eSIsIiIsc29ja2V0X2Vycm5vKTsKKyNlbHNlCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXRvcGVuIGNhbid0IGdldCBzZXJ2aWNlIGZvciBwcm94eSIsIiIsZXJybm8pOworI2VuZGlmIC8qIFRHVk9SV0lOICovCisgICAgICAgICAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgLyogKHJhdGhlciB0aGFuIG1pc2xlYWQpICovCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgICAgIGNrc3RybmNweShwLGNrdWl0b2EobnRvaHMoc2VydmljZS0+c19wb3J0KSksTkFNRUNQWUwtKHAtbmFtZWNvcHkpKTsKKworICAgIH0KKyNlbmRpZiAvKiBOT0hUVFAgKi8KKworICAgIC8qIFNldCB1cCBzb2NrZXQgc3RydWN0dXJlIGFuZCBnZXQgaG9zdCBhZGRyZXNzICovCisKKyAgICBiemVybygoY2hhciAqKSZyX2FkZHIsIHNpemVvZihyX2FkZHIpKTsKKyAgICBkZWJ1ZyhGMTAwLCJuZXRvcGVuIGJ6ZXJvIG9rIiwiIiwwKTsKKy8qCisgICBOT1RFOiBPcmlnaW5hbGx5IHRoZSBpbmV0X2FkZHIoKSBjaGVjayB3YXMgI2lmZGVmIE5ULCBidXQgaXMgZW5hYmxlZCBmb3IKKyAgIGFsbCBhcyBvZiAyMCBTZXAgOTcsIHRvIGFsbG93IHBlb3BsZSB0byAic2V0IGhvc3QiIHRvIGEgc3BlY2lmaWMgbnVtZXJpYyBJUAorICAgYWRkcmVzcyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIG11bHRpaG9tZWQgaG9zdCBzZXF1ZW5jZSBhbmQgd2luZGluZyB1cAorICAgYXQgYSBkaWZmZXJlbnQgcGxhY2UgdGhhbiB0aGUgb25lIHJlcXVlc3RlZC4KKyovCisjaWZkZWYgSU5BRERSX05PTkUKKyAgICBkZWJ1ZyhGMTAxLCJuZXRvcGVuIElOQUREUl9OT05FIGRlZmluZWQiLCIiLElOQUREUl9OT05FKTsKKyNlbHNlIC8qIElOQUREUl9OT05FICovCisgICAgZGVidWcoRjEwMCwibmV0b3BlbiBJTkFERFJfTk9ORSBub3QgZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYgLyogSU5BRERSX05PTkUgKi8KKyNpZmRlZiBJTkFERFJYCisgICAgZGVidWcoRjEwMCwibmV0b3BlbiBJTkFERFJYIGRlZmluZWQiLCIiLDApOworI2Vsc2UgLyogSU5BRERSWCAqLworICAgIGRlYnVnKEYxMDAsIm5ldG9wZW4gSU5BRERSWCBub3QgZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYgLyogSU5BRERSWCAqLworCisjaWZuZGVmIE5PTUhIT1NUCisjaWZkZWYgSU5BRERSWAorICAgIGlheCA9IGluZXRfYWRkcihuYW1lY29weSk7CisgICAgZGVidWcoRjExMSwibmV0b3BlbiBpbmV0X2FkZHIiLG5hbWVjb3B5LGlheC5zX2FkZHIpOworI2Vsc2UgLyogSU5BRERSWCAqLworI2lmZGVmIElOQUREUl9OT05FCisgICAgaWF4LnNfYWRkciA9IGluZXRfYWRkcihuYW1lY29weSk7CisgICAgZGVidWcoRjExMSwibmV0b3BlbiBpbmV0X2FkZHIiLG5hbWVjb3B5LGlheC5zX2FkZHIpOworI2Vsc2UgLyogSU5BRERSX05PTkUgKi8KKyNpZm5kZWYgZGF0YWdlbmVyYWwKKyAgICBpYXggPSAodW5zaWduZWQgaW50KSBpbmV0X2FkZHIobmFtZWNvcHkpOworI2Vsc2UKKyAgICBpYXggPSAtMUw7CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyAgICBkZWJ1ZyhGMTExLCJuZXRvcGVuIGluZXRfYWRkciIsbmFtZWNvcHksaWF4KTsKKyNlbmRpZiAvKiBJTkFERFJfTk9ORSAqLworI2VuZGlmIC8qIElOQUREUlggKi8KKworICAgIGRucyA9IDA7CisgICAgaWYgKAorI2lmZGVmIElOQUREUl9OT05FCisvKiBUaGlzIG1pZ2h0IGdpdmUgd2FybmluZ3Mgb24gNjQtYml0IHBsYXRmb3JtcyBidXQgdGhleSBzaG91bGQgYmUgaGFybWxlc3MgKi8KKy8qIGJlY2F1c2UgSU5BRERSX05PTkUgc2hvdWxkIGJlIGFsbCAxJ3MgYW55d2F5LCB0aHVzIHRoZSBPUiBwYXJ0IGlzICovCisvKiBwcm9iYWJseSBzdXBlcmZsdW91cyAtLSBub3Qgc3VyZSB3aHkgaXQncyBldmVuIHRoZXJlLCBtYXliZSBpdCBzaG91bGQgYmUgKi8KKy8qIHJlbW92ZWQuICovCisgICAgICAgIGlheC5zX2FkZHIgPT0gSU5BRERSX05PTkUgfHwgaWF4LnNfYWRkciA9PSAodW5zaWduZWQgbG9uZykgLTFMCisjZWxzZSAvKiBJTkFERFJfTk9ORSAqLworICAgICAgICBpYXggPCAwCisjZW5kaWYgLyogSU5BRERSX05PTkUgKi8KKyAgICAgICAgKSB7CisgICAgICAgIGlmICghcXVpZXQpIHsKKyAgICAgICAgICAgIHByaW50ZigiIEROUyBMb29rdXAuLi4gIik7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGhvc3QgPSBnZXRob3N0YnluYW1lKG5hbWVjb3B5KSkgIT0gTlVMTCkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwibmV0b3BlbiBnZXRob3N0YnluYW1lICE9IE5VTEwiLCIiLDApOworICAgICAgICAgICAgaG9zdCA9IGNrX2NvcHlob3N0ZW50KGhvc3QpOworICAgICAgICAgICAgZG5zID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHdlIHBlcmZvcm1lZCBkbnMgbG9va3VwICovCisgICAgICAgICAgICByX2FkZHIuc2luX2ZhbWlseSA9IGhvc3QtPmhfYWRkcnR5cGU7CisgICAgICAgICAgICBpZiAodGNwX3JkbnMgJiYgaG9zdC0+aF9uYW1lICYmIGhvc3QtPmhfbmFtZVswXQorI2lmbmRlZiBOT0hUVFAKKyAgICAgICAgICAgICAgICAgJiYgKHRjcF9odHRwX3Byb3h5ID09IE5VTEwpCisjZW5kaWYgLyogTk9IVFRQICovCisgICAgICAgICAgICAgICAgICkgeyAgICAgICAgICAgICAgICAgICAvKiBDb3B5aW5nIGludG8gb3VyIGFyZ3VtZW50PyAqLworICAgICAgICAgICAgICAgIGNrc3RybmNweShuYW1lLGhvc3QtPmhfbmFtZSw4MCk7ICAvKiBCYWQgQmFkIEJhZCAqLworICAgICAgICAgICAgICAgIGlmICggKDgwLXN0cmxlbihuYW1lKSkgPiAoc3RybGVuKHN2Y2J1ZikrMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQobmFtZSwiOiIsODAtc3RybGVuKG5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RybmNhdChuYW1lLHN2Y2J1Ziw4MC1zdHJsZW4obmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmZGVmIEhBRERSTElTVAorI2lmZGVmIGhfYWRkcgorICAgICAgICAgICAgLyogVGhpcyBpcyBmb3IgdHJ5aW5nIG11bHRpcGxlIElQIGFkZHJlc3NlcyAtIHNlZSA8bmV0ZGIuaD4gKi8KKyAgICAgICAgICAgIGlmICghKGhvc3QtPmhfYWRkcl9saXN0KSkKKyAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIGJjb3B5KGhvc3QtPmhfYWRkcl9saXN0WzBdLAorICAgICAgICAgICAgICAgICAgKGNhZGRyX3QpJnJfYWRkci5zaW5fYWRkciwKKyAgICAgICAgICAgICAgICAgIGhvc3QtPmhfbGVuZ3RoCisgICAgICAgICAgICAgICAgICApOworI2Vsc2UKKyAgICAgICAgICAgIGJjb3B5KGhvc3QtPmhfYWRkciwgKGNhZGRyX3QpJnJfYWRkci5zaW5fYWRkciwgaG9zdC0+aF9sZW5ndGgpOworI2VuZGlmIC8qIGhfYWRkciAqLworI2Vsc2UgIC8qIEhBRERSTElTVCAqLworICAgICAgICAgICAgYmNvcHkoaG9zdC0+aF9hZGRyLCAoY2FkZHJfdCkmcl9hZGRyLnNpbl9hZGRyLCBob3N0LT5oX2xlbmd0aCk7CisjZW5kaWYgLyogSEFERFJMSVNUICovCisjaWZuZGVmIEVYQ0VMQU4KKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIkJDT1BZIiwiaG9zdC0+aF9hZGRyIixob3N0LT5oX2FkZHIpOworI2VuZGlmIC8qIEVYQ0VMQU4gKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIkJDT1BZIiwiIChjYWRkcl90KSZyX2FkZHIuc2luX2FkZHIiLAorICAgICAgICAgICAgICAgICAgKGNhZGRyX3QpJnJfYWRkci5zaW5fYWRkcik7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJCQ09QWSIsIiByX2FkZHIuc2luX2FkZHIuc19hZGRyIiwKKyAgICAgICAgICAgICAgICAgIHJfYWRkci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICAgICAgZGVidWcoRjExMSwiQkNPUFkiLCJob3N0LT5oX2xlbmd0aCIsaG9zdC0+aF9sZW5ndGgpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIE5PTUhIT1NUICovCisKKyAgICBpZiAoIWRucykgeworI2lmZGVmIElOQUREUlgKKy8qIGluZXRfYWRkcigpIGlzIG9mIHR5cGUgc3RydWN0IGluX2FkZHIgKi8KKyAgICAgICAgc3RydWN0IGluX2FkZHIgaW5hOworICAgICAgICB1bnNpZ25lZCBsb25nIHV1OworICAgICAgICBkZWJ1ZyhGMTAwLCJuZXRvcGVuIGdldGhvc3RieW5hbWUgPT0gTlVMTDogSU5BRERSWCIsIiIsMCk7CisgICAgICAgIGluYSA9IGluZXRfYWRkcihuYW1lY29weSk7CisgICAgICAgIHV1ID0gKih1bnNpZ25lZCBpbnQgKikmaW5hOworI2Vsc2UgLyogTm90IElOQUREUlggKi8KKy8qIGluZXRfYWRkcigpIGlzIHVuc2lnbmVkIGxvbmcgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyB1dTsKKyAgICAgICAgZGVidWcoRjEwMCwibmV0b3BlbiBnZXRob3N0YnluYW1lID09IE5VTEw6IE5vdCBJTkFERFJYIiwiIiwwKTsKKyAgICAgICAgdXUgPSBpbmV0X2FkZHIobmFtZWNvcHkpOworI2VuZGlmIC8qIElOQUREUlggKi8KKyAgICAgICAgZGVidWcoRjEwMSwibmV0b3BlbiB1dSIsIiIsdXUpOworICAgICAgICBpZiAoCisjaWZkZWYgSU5BRERSX05PTkUKKyAgICAgICAgICAgICEodXUgPT0gSU5BRERSX05PTkUgfHwgdXUgPT0gKHVuc2lnbmVkIGludCkgLTFMKQorI2Vsc2UgICAvKiBJTkFERFJfTk9ORSAqLworICAgICAgICAgICAgdXUgIT0gKCh1bnNpZ25lZCBsb25nKS0xKQorI2VuZGlmIC8qIElOQUREUl9OT05FICovCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIHJfYWRkci5zaW5fYWRkci5zX2FkZHIgPSB1dTsKKyAgICAgICAgICAgIHJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiXHJcbiIpOyAgICAvKiBjb21wbGV0ZSBhbnkgcHJldmlvdXMgbWVzc2FnZSAqLworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBnZXQgYWRkcmVzcyBmb3IgJXNcbiIsIG5hbWVjb3B5KTsKKyNpZmRlZiBUR1ZPUldJTgorICAgICAgICAgICAgZGVidWcoRjEwMSwibmV0b3BlbiBjYW4ndCBnZXQgYWRkcmVzcyIsIiIsc29ja2V0X2Vycm5vKTsKKyNlbHNlCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXRvcGVuIGNhbid0IGdldCBhZGRyZXNzIiwiIixlcnJubyk7CisjZW5kaWYgLyogVEdWT1JXSU4gKi8KKyAgICAgICAgICAgIGVycm5vID0gMDsgICAgICAgICAgICAgICAgICAvKiBSYXRoZXIgdGhhbiBtaXNsZWFkICovCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2V0IGEgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgY29ubmVjdGlvbi4gKi8KKworICAgIHJfYWRkci5zaW5fcG9ydCA9IHNlcnZpY2UtPnNfcG9ydDsKKyAgICBja3N0cm5jcHkoaXBhZGRyLChjaGFyICopaW5ldF9udG9hKHJfYWRkci5zaW5fYWRkciksMjApOworICAgIGRlYnVnKEYxMTAsIm5ldG9wZW4gdHJ5aW5nIixpcGFkZHIsMCk7CisgICAgaWYgKCFxdWlldCAmJiAqaXBhZGRyKSB7CisgICAgICAgIHByaW50ZigiIFRyeWluZyAlcy4uLiAiLCBpcGFkZHIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB9CisKKyAgICAvKiBMb29wIHRvIHRyeSBhZGRpdGlvbmFsIElQIGFkZHJlc3NlcywgaWYgYW55LiAqLworCisgICAgZG8geworI2lmZGVmIEVYQ0VMQU4KKyAgICAgICAgc2VuZF9zb2NrZXQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIHNlbmRfc29ja2V0LnNpbl9hZGRyLnNfYWRkciA9IDA7CisgICAgICAgIHNlbmRfc29ja2V0LnNpbl9wb3J0ID0gMDsKKyAgICAgICAgaWYgKCh0dHlmZCA9IHNvY2tldChTT0NLX1NUUkVBTSwgKHN0cnVjdCBzb2NrcHJvdG8gKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZW5kX3NvY2tldCwgU09fUkVVU0VBRERSKSkgPCAwKQorI2Vsc2UgIC8qIEVYQ0VMQU4gKi8KKyNpZmRlZiBOVAorI2lmZGVmIENPTU1FTlRfWAorICAgICAgIC8qCisgICAgICAgICBNdXN0IG1ha2Ugc3VyZSB0aGF0IGFsbCBzb2NrZXRzIGFyZSBvcGVuZWQgaW4KKyAgICAgICAgIE5vbi1vdmVybGFwcGVkIG1vZGUgc2luY2Ugd2UgdXNlIHRoZSBzdGFuZGFyZAorICAgICAgICAgQyBSVEwgZnVuY3Rpb25zIHRvIHJlYWQgYW5kIHdyaXRlIGRhdGEuCisgICAgICAgICBCdXQgaXQgZG9lc24ndCBzZWVtIHRvIHdvcmsgYXMgcGxhbm5lZC4KKyAgICAgICAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW50IG9wdGlvblZhbHVlID0gU09fU1lOQ0hST05PVVNfTk9OQUxFUlQ7CisgICAgICAgICAgICAgIGlmIChzZXRzb2Nrb3B0KElOVkFMSURfU09DS0VULCBTT0xfU09DS0VULCBTT19PUEVOVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJm9wdGlvblZhbHVlLCBzaXplb2Yob3B0aW9uVmFsdWUpKQorICAgICAgICAgICAgICAgICAgIT0gTk9fRVJST1IpCisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIE5UICovCisKKyAgICAgICAgaWYgKCh0dHlmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkKKyNlbmRpZiAvKiBFWENFTEFOICovCisgICAgICAgICAgICB7CisjaWZkZWYgRVhDRUxBTgorICAgICAgICAgICAgICAgIGV4cGVycm9yKCJUQ1Agc29ja2V0IGVycm9yIik7CisjZWxzZQorI2lmZGVmIFZNUworICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiXHJcbiIpOyAvKiBjb21wbGV0ZSBhbnkgcHJldmlvdXMgc3Rkb3V0ICovCisjZW5kaWYgLyogVk1TICovCisjaWZkZWYgVEdWT1JXSU4KKyNpZmRlZiBPTERfVFdHCisgICAgICAgICAgICAgICAgZXJybm8gPSBzb2NrZXRfZXJybm87CisjZW5kaWYgLyogT0xEX1RXRyAqLworICAgICAgICAgICAgICAgIHNvY2tldF9wZXJyb3IoIlRDUCBzb2NrZXQgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXRvcGVuIHNvY2tldCBlcnJvciIsIiIsc29ja2V0X2Vycm5vKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgcGVycm9yKCJUQ1Agc29ja2V0IGVycm9yIik7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwibmV0b3BlbiBzb2NrZXQgZXJyb3IiLCIiLGVycm5vKTsKKyNlbmRpZiAvKiBUR1ZPUldJTiAqLworI2VuZGlmIC8qIEVYQ0VMQU4gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZXJybm8gPSAwOworCisjaWZkZWYgUkxPR0NPREUKKyAgICAgICAvKiBOb3QgcGFydCBvZiB0aGUgUkxPR0lOIFJGQywgYnV0IHRoZSBCU0QgaW1wbGVtZW50YXRpb24gICAgICovCisgICAgICAgLyogcmVxdWlyZXMgdGhhdCB0aGUgY2xpZW50IHBvcnQgYmUgYSBwcml2aWxpZ2VkIHBvcnQgKDwxMDI0KSAqLworICAgICAgIC8qIG9uIGEgVW5peCBzeXN0ZW0gdGhpcyB3b3VsZCByZXF1aXJlIFN1cGVyVXNlciBwZXJtaXNzaW9ucyAgKi8KKyAgICAgICAvKiB0aGVyZWJ5IHNheWluZyB0aGF0IHRoZSByb290IG9mIHRoZSBVbml4IHN5c3RlbSBoYXMgZ2l2ZW4gICovCisgICAgICAgLyogcGVybWlzc2lvbiBmb3IgdGhpcyBjb25uZWN0aW9uIHRvIGJlIGNyZWF0ZWQgICAgICAgICAgICAgICAqLworICAgICAgIGlmIChzZXJ2aWNlLT5zX3BvcnQgPT0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KVJMT0dJTl9QT1JUKSkgeworICAgICAgICAgICBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbHBvcnQgPSAxMDI0OyAgLyogbWF4IHJlc2VydmVkIHBvcnQgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgICAgaW50IHNfZXJybm87CisjZW5kaWYgLyogT1MyICovCisKKyAgICAgICAgICAgbHBvcnQtLTsgICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgd2UgZG8gbm90IHJldXNlIGEgcG9ydCAqLworICAgICAgICAgICBpZiAobHBvcnQgPT0gNTEyKQorICAgICAgICAgICAgIGxwb3J0ID0gMTAyMzsKKworICAgICAgICAgICBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgICAgIGlmICh0Y3BfYWRkcmVzcykgeworI2lmZGVmIElOQUREUlgKKyAgICAgICAgICAgICAgIGluYWRkcnggPSBpbmV0X2FkZHIodGNwX2FkZHJlc3MpOworICAgICAgICAgICAgICAgc2luLnNpbl9hZGRyLnNfYWRkciA9ICoodW5zaWduZWQgbG9uZyAqKSZpbmFkZHJ4OworI2Vsc2UKKyAgICAgICAgICAgICAgIHNpbi5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIodGNwX2FkZHJlc3MpOworI2VuZGlmIC8qIElOQUREUlggKi8KKyAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgc2luLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisgICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgICBzaW4uc2luX3BvcnQgPSBodG9ucyhscG9ydCk7CisgICAgICAgICAgICAgICBpZiAoYmluZCh0dHlmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZihzaW4pKSA+PSAwKQorICAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgIHNfZXJybm8gPSBzb2NrZXRfZXJybm87CisgICAgICAgICAgICAgICBpZiAoc19lcnJubyAmJiAvKiBPUzIgYmluZCBmYWlscyB3aXRoIDAsIGlmIGFscmVhZHkgaW4gdXNlICovCisjaWZkZWYgTlQKKyAgICAgICAgICAgICAgICAgICBzX2Vycm5vICE9IFdTQUVBRERSSU5VU0UKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgc19lcnJubyAhPSBTT0NFQUREUklOVVNFICYmCisgICAgICAgICAgICAgICAgICAgc19lcnJubyAhPSAoU09DRUFERFJJTlVTRSAtIFNPQ0JBU0VFUlIpCisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICAgICAgICAgICApCisjZWxzZSAvKiBPUzIgKi8KKyNpZmRlZiBUR1ZPUldJTgorICAgICAgICAgICAgICAgICBpZiAoc29ja2V0X2Vycm5vICE9IEVBRERSSU5VU0UpCisjZWxzZQorICAgICAgICAgICAgICAgICBpZiAoZXJybm8gIT0gRUFERFJJTlVTRSkKKyNlbmRpZiAvKiBUR1ZPUldJTiAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5CaW5kIGZhaWxlZCB3aXRoIGVycm5vICVkICBmb3IgcG9ydCAlZC5cbiIsCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzX2Vycm5vCisjZWxzZQorI2lmZGVmIFRHVk9SV0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfZXJybm8KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubworI2VuZGlmIC8qIFRHVk9SV0lOICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGxwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJybG9naW4gYmluZCBmYWlsZWQiLCIiLHNfZXJybm8pOworI2Vsc2UKKyNpZmRlZiBUR1ZPUldJTgorICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJybG9naW4gYmluZCBmYWlsZWQiLCIiLHNvY2tldF9lcnJubyk7CisjaWZkZWYgT0xEX1RXRworICAgICAgICAgICAgICAgICAgICAgICBlcnJubyA9IHNvY2tldF9lcnJubzsKKyNlbmRpZiAvKiBPTERfVFdHICovCisgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9wZXJyb3IoInJsb2dpbiBiaW5kIik7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJybG9naW4gYmluZCBmYWlsZWQiLCIiLGVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgICAgcGVycm9yKCJybG9naW4gYmluZCIpOworI2VuZGlmIC8qIFRHVk9SV0lOICovCisjZW5kaWYgLyogT1MyICovCisjZWxzZSAgLyogQ09NTUVOVCAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJybG9naW4gYmluZCBzX2Vycm5vIiwiIixzX2Vycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgICAgcGVycm9yKCJybG9naW4gYmluZCIpOworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcclxuIik7ICAvKiBjb21wbGV0ZSBhbnkgcHJldmlvdXMgbWVzc2FnZSAqLworI2VuZGlmIC8qIFZNUyAqLworI2lmZGVmIFRHVk9SV0lOCisgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsInJsb2dpbiBiaW5kIHNvY2tldF9lcnJubyIsIiIsc29ja2V0X2Vycm5vKTsKKyNpZmRlZiBPTERfVFdHCisgICAgICAgICAgICAgICAgICAgICAgIGVycm5vID0gc29ja2V0X2Vycm5vOworI2VuZGlmIC8qIE9MRF9UV0cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3BlcnJvcigicmxvZ2luIGJpbmQiKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsInJsb2dpbiBiaW5kIGVycm5vIiwiIixlcnJubyk7CisgICAgICAgICAgICAgICAgICAgICAgIHBlcnJvcigicmxvZ2luIGJpbmQiKTsKKyNlbmRpZiAvKiBUR1ZPUldJTiAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJybG9naW4gbG9jYWwgcG9ydCIsIiIsbHBvcnQpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgbmV0Y2xvcygpOworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgbHBvcnQtLTsKKyAgICAgICAgICAgICAgIGlmIChscG9ydCA9PSA1MTIgLyogbG93ZXN0IHJlc2VydmVkIHBvcnQgdG8gdXNlICovICkgeworICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5ObyByZXNlcnZlZCBwb3J0cyBhdmFpbGFibGUuXG4iKTsKKyAgICAgICAgICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgICAgIGRlYnVnKEYxMDEsInJsb2dpbiBscG9ydCIsIiIsbHBvcnQpOworICAgICAgICAgICB0dG5wcm90byA9IE5QX1JMT0dJTjsKKyAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBSTE9HQ09ERSAgKi8KKworICAgICAgIC8qIElmIGEgc3BlY2lmaWMgVENQIGFkZHJlc3Mgb24gdGhlIGxvY2FsIGhvc3QgaXMgZGVzaXJlZCB3ZSAqLworICAgICAgIC8qIG11c3QgYmluZCBpdCB0byB0aGUgc29ja2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmbmRlZiBkYXRhZ2VuZXJhbAorICAgICAgICAgaWYgKHRjcF9hZGRyZXNzKSB7CisgICAgICAgICAgICAgaW50IHNfZXJybm87CisKKyAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJuZXRvcGVuIGJpbmRpbmcgc29ja2V0IHRvIix0Y3BfYWRkcmVzcywwKTsKKyAgICAgICAgICAgICBiemVybygoY2hhciAqKSZzaW4sc2l6ZW9mKHNpbikpOworICAgICAgICAgICAgIHNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyNpZmRlZiBJTkFERFJYCisgICAgICAgICAgICAgaW5hZGRyeCA9IGluZXRfYWRkcih0Y3BfYWRkcmVzcyk7CisgICAgICAgICAgICAgc2luLnNpbl9hZGRyLnNfYWRkciA9ICoodW5zaWduZWQgbG9uZyAqKSZpbmFkZHJ4OworI2Vsc2UKKyAgICAgICAgICAgICBzaW4uc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKHRjcF9hZGRyZXNzKTsKKyNlbmRpZiAvKiBJTkFERFJYICovCisgICAgICAgICAgICAgc2luLnNpbl9wb3J0ID0gMDsKKyAgICAgICAgICAgICBpZiAoYmluZCh0dHlmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZihzaW4pKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgc19lcnJubyA9IHNvY2tldF9lcnJubzsgLyogU2F2ZSBlcnJvciBjb2RlICovCisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICAgICAgICAgc29ja2V0X2Nsb3NlKHR0eWZkKTsKKyNlbHNlIC8qIFRDUElQTElCICovCisgICAgICAgICAgICAgICAgIGNsb3NlKHR0eWZkKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgICAgICB0dHlmZCA9IC0xOworICAgICAgICAgICAgICAgICB3YXNjbG9zZWQgPSAxOworICAgICAgICAgICAgICAgICBlcnJubyA9IHNfZXJybm87ICAgICAgIC8qIGFuZCByZXBvcnQgdGhpcyBlcnJvciAqLworICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXRvcGVuIGJpbmQgZXJybm8iLCIiLGVycm5vKTsKKyAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKworLyogTm93IGNvbm5lY3QgdG8gdGhlIHNvY2tldCBvbiB0aGUgb3RoZXIgZW5kLiAqLworCisjaWZkZWYgRVhDRUxBTgorICAgICAgICBpZiAoY29ubmVjdCh0dHlmZCwgJnJfYWRkcikgPCAwKQorI2Vsc2UKKyNpZmRlZiBOVAorICAgICAgICAgIFdTQVNhZmVUb0NhbmNlbCA9IDE7CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgaWYgKGNvbm5lY3QodHR5ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcl9hZGRyLCBzaXplb2Yocl9hZGRyKSkgPCAwKQorI2VuZGlmIC8qIEVYQ0VMQU4gKi8KKyAgICAgICAgICB7CisjaWZkZWYgTlQKKyAgICAgICAgICAgICAgV1NBU2FmZVRvQ2FuY2VsID0gMDsKKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgICBpID0gc29ja2V0X2Vycm5vOworI2Vsc2UgLyogT1MyICovCisjaWZkZWYgVEdWT1JXSU4KKyAgICAgICAgICAgICAgaSA9IHNvY2tldF9lcnJubzsKKyNlbHNlCisgICAgICAgICAgICAgIGkgPSBlcnJubzsgICAgICAgICAgICAgICAgLyogU2F2ZSBlcnJvciBjb2RlICovCisjZW5kaWYgLyogVEdWT1JXSU4gKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBSTE9HQ09ERQorICAgICAgICAgICAgICBpZiAoCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgIGkgJiYgLyogT1MyIGJpbmQgZmFpbHMgd2l0aCAwLCBpZiBhbHJlYWR5IGluIHVzZSAqLworI2lmZGVmIE5UCisgICAgICAgICAgICAgICAgIGkgPT0gV1NBRUFERFJJTlVTRQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgKGkgPT0gU09DRUFERFJJTlVTRSB8fAorICAgICAgICAgICAgICAgICBpID09IChTT0NFQUREUklOVVNFIC0gU09DQkFTRUVSUikpCisjZW5kaWYgLyogTlQgKi8KKyNlbHNlIC8qIE9TMiAqLworI2lmZGVmIFRHVk9SV0lOCisgICAgICAgICAgICAgICAgICBzb2NrZXRfZXJybm8gPT0gRUFERFJJTlVTRQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgIGVycm5vID09IEVBRERSSU5VU0UKKyNlbmRpZiAvKiBUR1ZPUldJTiAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgJiYgdHRucHJvdG8gPT0gTlBfUkxPR0lOKSB7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICAgICAgICAgICBzb2NrZXRfY2xvc2UodHR5ZmQpOyAvKiBDbG9zZSBpdC4gKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgY2xvc2UodHR5ZmQpOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgLyogVHJ5IGEgZGlmZmVyZW50IGxwb3J0ICovCisgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBIQUREUkxJU1QKKyNpZmRlZiBoX2FkZHIKKyAgICAgICAgICAgICAgaWYgKGhvc3QgJiYgaG9zdC0+aF9hZGRyX2xpc3QgJiYgaG9zdC0+aF9hZGRyX2xpc3RbMV0pIHsKKyAgICAgICAgICAgICAgICAgIHBlcnJvcigiIik7CisgICAgICAgICAgICAgICAgICBob3N0LT5oX2FkZHJfbGlzdCsrOworICAgICAgICAgICAgICAgICAgYmNvcHkoaG9zdC0+aF9hZGRyX2xpc3RbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAoY2FkZHJfdCkmcl9hZGRyLnNpbl9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC0+aF9sZW5ndGgpOworCisgICAgICAgICAgICAgICAgICBja3N0cm5jcHkoaXBhZGRyLChjaGFyICopaW5ldF9udG9hKHJfYWRkci5zaW5fYWRkciksMjApOworICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwibmV0b3BlbiBoX2FkZHJfbGlzdCIsaXBhZGRyLDApOworICAgICAgICAgICAgICAgICAgaWYgKCFxdWlldCAmJiAqaXBhZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgVHJ5aW5nICVzLi4uICIsIGlwYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICAgICAgICAgIHNvY2tldF9jbG9zZSh0dHlmZCk7IC8qIENsb3NlIGl0LiAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAgIGNsb3NlKHR0eWZkKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBoX2FkZHIgKi8KKyNlbmRpZiAgLyogSEFERFJMSVNUICovCisgICAgICAgICAgICAgIG5ldGNsb3MoKTsKKyAgICAgICAgICAgICAgdHR5ZmQgPSAtMTsKKyAgICAgICAgICAgICAgd2FzY2xvc2VkID0gMTsKKyAgICAgICAgICAgICAgdHRucHJvdG8gPSBOUF9OT05FOworICAgICAgICAgICAgICBlcnJubyA9IGk7ICAgICAgICAgICAgICAgIC8qIEFuZCByZXBvcnQgdGhpcyBlcnJvciAqLworI2lmZGVmIEVYQ0VMQU4KKyAgICAgICAgICAgICAgaWYgKGVycm5vKSBleHBlcnJvcigibmV0b3BlbiBjb25uZWN0Iik7CisjZWxzZQorI2lmZGVmIFRHVk9SV0lOCisgICAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldG9wZW4gY29ubmVjdCBlcnJvciIsIiIsc29ja2V0X2Vycm5vKTsKKyAgICAgICAgICAgICAgLyogaWYgKGVycm5vKSBzb2NrZXRfcGVycm9yKCJuZXRvcGVuIGNvbm5lY3QiKTsgKi8KKyNpZmRlZiBPTERfVFdHCisgICAgICAgICAgICAgIGVycm5vID0gc29ja2V0X2Vycm5vOworI2VuZGlmIC8qIE9MRF9UV0cgKi8KKyAgICAgICAgICAgICAgaWYgKCFxdWlldCkKKyAgICAgICAgICAgICAgICBzb2NrZXRfcGVycm9yKCJuZXRvcGVuIGNvbm5lY3QiKTsKKyNlbHNlIC8qIFRHVk9SV0lOICovCisgICAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldG9wZW4gY29ubmVjdCBlcnJubyIsIiIsZXJybm8pOworI2lmZGVmIFZNUworICAgICAgICAgICAgICBpZiAoIXF1aWV0KQorICAgICAgICAgICAgICAgIHBlcnJvcigiXHJcbkZhaWxlZCIpOworI2Vsc2UKKyAgICAgICAgICAgICAgaWYgKCFxdWlldCkKKyAgICAgICAgICAgICAgICBwZXJyb3IoIkZhaWxlZCIpOworI2VuZGlmIC8qIFZNUyAqLworI2lmZGVmIERFQ19UQ1BJUAorICAgICAgICAgICAgICBpZiAoIXF1aWV0KQorICAgICAgICAgICAgICAgIHBlcnJvcigibmV0b3BlbiBjb25uZWN0Iik7CisjZW5kaWYgLyogREVDX1RDUElQICovCisjaWZkZWYgQ01VX1RDUElQCisgICAgICAgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgICAgICAgcGVycm9yKCJuZXRvcGVuIGNvbm5lY3QiKTsKKyNlbmRpZiAvKiBDTVVfVENQSVAgKi8KKyNlbmRpZiAvKiBUR1ZPUldJTiAqLworI2VuZGlmIC8qIEVYQ0VMQU4gKi8KKyAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICB9CisjaWZkZWYgTlQKKyAgICAgICAgV1NBU2FmZVRvQ2FuY2VsID0gMDsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICBpc2Nvbm5lY3QgPSAxOworICAgIH0gd2hpbGUgKCFpc2Nvbm5lY3QpOworCisjaWZkZWYgTk9OX0JMT0NLX0lPCisgICAgb24gPSAxOworICAgIHggPSBzb2NrZXRfaW9jdGwodHR5ZmQsRklPTkJJTywmb24pOworICAgIGRlYnVnKEYxMDEsIm5ldG9wZW4gRklPTkJJTyIsIiIseCk7CisjZW5kaWYgLyogTk9OX0JMT0NLX0lPICovCisKKyNpZmRlZiBOVF9UQ1BfT1ZFUkxBUFBFRAorICAgIE92ZXJsYXBwZWRXcml0ZUluaXQoKTsKKyAgICBPdmVybGFwcGVkUmVhZEluaXQoKTsKKyNlbmRpZiAvKiBOVF9UQ1BfT1ZFUkxBUFBFRCAqLworCisgICAgdHRuZXQgPSBuZXR0OyAgICAgICAgICAgICAgICAgICAgICAgLyogVENQL0lQIChzb2NrZXRzKSBuZXR3b3JrICovCisKKyNpZm5kZWYgTk9IVFRQCisgICAgLyogV2UgaGF2ZSBzdWNjZWVkZWQgaW4gY29ubmVjdGluZyB0byB0aGUgSFRUUCBQUk9YWS4gIFNvIG5vdyB3ZSAgICovCisgICAgLyogbmVlZCB0byBhdHRlbXB0IHRvIGNvbm5lY3QgdGhyb3VnaCB0aGUgcHJveHkgdG8gdGhlIGFjdHVhbCBob3N0ICovCisgICAgLyogSWYgdGhhdCBpcyBzdWNjZXNzZnVsLCB3ZSBoYXZlIHRvIHByZXRlbmQgdGhhdCB3ZSBtYWRlIGEgZGlyZWN0ICovCisgICAgLyogY29ubmVjdGlvbiB0byB0aGUgYWN0dWFsIGhvc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBpZiAoIHRjcF9odHRwX3Byb3h5ICkgeworI2lmZGVmIE9TMgorICAgICAgICBjaGFyICogYWdlbnQgPSAiS2VybWl0IDk1IjsgICAgICAgICAgICAgLyogRGVmYXVsdCB1c2VyIGFnZW50ICovCisjZWxzZQorICAgICAgICBjaGFyICogYWdlbnQgPSAiQy1LZXJtaXQiOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgICAgIGlmIChodHRwX2Nvbm5lY3QodHR5ZmQsCisJCQkgdGNwX2h0dHBfcHJveHlfYWdlbnQgPyB0Y3BfaHR0cF9wcm94eV9hZ2VudCA6IGFnZW50LAorCQkJIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX2h0dHBfcHJveHlfdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0Y3BfaHR0cF9wcm94eV9wd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eWNvcHkKKyAgICAgICAgICAgICAgICAgICAgICAgICApIDwgMCkgeworICAgICAgICAgICAgbmV0Y2xvcygpOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIGNrc3RybmNweShuYW1lY29weSxwcm94eWNvcHksTkFNRUNQWUwpOworICAgICAgICBwID0gbmFtZWNvcHk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBXYXMgYSBzZXJ2aWNlIHJlcXVlc3RlZD8gKi8KKyAgICAgICAgd2hpbGUgKCpwICE9ICdcMCcgJiYgKnAgIT0gJzonKSBwKys7IC8qIExvb2sgZm9yIGNvbG9uICovCisgICAgICAgICpwID0gJ1wwJzsKKyAgICB9CisjZW5kaWYgLyogTk9IVFRQICovCisKKyAgICAvKiBKZWZmIC0gRG9lcyB0aGlzIG5leHQgYmxvY2sgb2YgY29kZSB0aGF0IHNldCdzIHRoZSBwcm90b2NvbCAqLworICAgIC8qIG5lZWQgdG8gYmUgaGVyZSBhbnltb3JlPyAgNS8xMC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAvKiBUaGVyZSBhcmUgY2VydGFpbiBtYWdpYyBwb3J0IG51bWJlcnMgdGhhdCB3aGVuIHVzZWQgcmVxdWlyZSAqLworICAgIC8qIHRoZSB1c2Ugb2Ygc3BlY2lmaWMgcHJvdG9jb2xzLiAgQ2hlY2sgdGhpcyBub3cgYmVmb3JlIHdlICAgICovCisgICAgLyogc2V0IHRoZSBTT19PT0JJTkxJTkUgc3RhdGUgb3Igd2UgbWlnaHQgZ2V0IGl0IHdyb25nLiAgICAgICAgKi8KKyAgICB4ID0gbnRvaHMoKHVuc2lnbmVkIHNob3J0KXNlcnZpY2UtPnNfcG9ydCk7CisgICAgc3ZjbnVtID0geDsKKyAgICAvKiBTZWUgaWYgdGhlIHNlcnZpY2UgaXMgVEVMTkVULiAqLworICAgIGlmICh4ID09IFRFTE5FVF9QT1JUKSB7CisgICAgICAgIC8qIFllcywgc28gaWYgcmF3IHBvcnQgbm90IHJlcXVlc3RlZCAqLworICAgICAgICBpZiAodHRucHJvdG8gIT0gTlBfVENQUkFXICYmIHR0bnByb3RvICE9IE5QX05PTkUpCisgICAgICAgICAgdHRucHJvdG8gPSBOUF9URUxORVQ7ICAgICAgICAgLyogU2VsZWN0IFRFTE5FVCBwcm90b2NvbC4gKi8KKyAgICB9CisjaWZkZWYgUkxPR0NPREUKKyAgICBlbHNlIGlmICh4ID09IFJMT0dJTl9QT1JUKSB7CisgICAgICAgIHR0bnByb3RvID0gTlBfUkxPR0lOOworICAgIH0KKyNpZmRlZiBDS19LRVJCRVJPUworICAgIC8qIFRoZXJlIGlzIG5vIGdvb2Qgd2F5IHRvIGRvIHRoaXMuICBJZiB0aGUgdXNlciBkaWRuJ3QgdGVsbCAgICAqLworICAgIC8qIHdoaWNoIG9uZSB0byB1c2UgdXAgZnJvbnQuICBXZSBtYXkgZ3Vlc3Mgd3JvbmcgaWYgdGhlIHVzZXIgICAqLworICAgIC8qIGhhcyBib3RoIEtlcmJlcm9zIHZlcnNpb25zIGluc3RhbGxlZCBhbmQgdmFsaWQgVEdUcyBmb3IgZWFjaCAqLworICAgIGVsc2UgaWYgKHggPT0gS0xPR0lOX1BPUlQgJiYKKyAgICAgICAgICAgICB0dG5wcm90byAhPSBOUF9LNExPR0lOICYmCisgICAgICAgICAgICAgdHRucHJvdG8gIT0gTlBfSzVMT0dJTikgeworICAgICAgICBpZiAoY2tfa3JiNV9pc19pbnN0YWxsZWQoKSAmJgorICAgICAgICAgICAgY2tfa3JiNV9pc190Z3RfdmFsaWQoKSkKKyAgICAgICAgICB0dG5wcm90byA9IE5QX0s1TE9HSU47CisgICAgICAgIGVsc2UgaWYgKGNrX2tyYjRfaXNfaW5zdGFsbGVkKCkgJiYgY2tfa3JiNF9pc190Z3RfdmFsaWQoKSkKKyAgICAgICAgICB0dG5wcm90byA9IE5QX0s0TE9HSU47CisgICAgICAgIGVsc2UKKyAgICAgICAgICB0dG5wcm90byA9IE5QX0s0TE9HSU47CisgICAgfSBlbHNlIGlmICh4ID09IEVLTE9HSU5fUE9SVCAmJgorICAgICAgICAgICAgICAgdHRucHJvdG8gIT0gTlBfRUs0TE9HSU4gJiYKKyAgICAgICAgICAgICAgIHR0bnByb3RvICE9IE5QX0VLNUxPR0lOKSB7CisgICAgICAgIGlmIChja19rcmI1X2lzX2luc3RhbGxlZCgpICYmIGNrX2tyYjVfaXNfdGd0X3ZhbGlkKCkpCisgICAgICAgICAgdHRucHJvdG8gPSBOUF9FSzVMT0dJTjsKKyAgICAgICAgZWxzZSBpZiAoY2tfa3JiNF9pc19pbnN0YWxsZWQoKSAmJiBja19rcmI0X2lzX3RndF92YWxpZCgpKQorICAgICAgICAgIHR0bnByb3RvID0gTlBfRUs0TE9HSU47CisgICAgICAgIGVsc2UKKyAgICAgICAgICB0dG5wcm90byA9IE5QX0VLNExPR0lOOworICAgIH0KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2VuZGlmIC8qIFJMT0dDT0RFICovCisjaWZkZWYgSUtTX09QVElPTgorICAgIGVsc2UgaWYgKHggPT0gS0VSTUlUX1BPUlQpIHsgICAgICAgIC8qIElLUyB1c2VzIFRlbG5ldCBwcm90b2NvbCAqLworICAgICAgICBpZiAodHRucHJvdG8gPT0gTlBfTk9ORSkKKyAgICAgICAgICB0dG5wcm90byA9IE5QX0tFUk1JVDsKKyAgICB9CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCisjaWZkZWYgU09fT09CSU5MSU5FCisvKgorICBUaGUgc3ltYm9sIFNPX09PQklOTElORSBpcyBub3Qga25vd24gdG8gVWx0cml4IDIuMC4KKyAgSXQgbWVhbnMgImxlYXZlIG91dCBvZiBiYW5kIGRhdGEgaW5saW5lIi4gIFRoZSBub3JtYWwgdmFsdWUgaXMgMHgwMTAwLAorICBidXQgZG9uJ3QgdHJ5IHRoaXMgb24gc3lzdGVtcyB3aGVyZSB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4KKyovCisvKgorICBOb3RlIGZyb20gSmVmZiBBbHRtYW46IDEyLzEzLzk1CisgIEluIGltcGxlbWVudGluZyBybG9naW4gcHJvdG9jb2wgSSBoYXZlIGNvbWUgdG8gdGhlIGNvbmNsdXNpb24gdGhhdCBpdCBpcworICBhIHJlYWxseSBiYWQgaWRlYSB0byByZWFkIG91dC1vZi1iYW5kIGRhdGEgaW5saW5lLgorICBBdCBsZWFzdCBXaW5kb3dzIGFuZCBPUy8yIGRvZXMgbm90IGhhbmRsZSB0aGlzIHdlbGwuCisgIEFuZCBpZiB5b3UgbmVlZCB0byBrbm93IHRoYXQgZGF0YSBpcyBvdXQtb2YtYmFuZCwgdGhlbiBpdCBiZWNvbWVzCisgIGFic29sdXRlbHkgcG9pbnRsZXNzLgorCisgIFRoZXJlZm9yZSwgYXQgbGVhc3Qgb24gT1MyIGFuZCBXaW5kb3dzIChOVCkgSSBoYXZlIGNoYW5nZWQgdGhlIHZhbHVlIG9mCisgIG9uIHRvIDAsIHNvIHRoYXQgb3V0LW9mLWJhbmQgZGF0YSBzdGF5cyBvdXQtb2YtYmFuZC4KKworICAxMi8xOC85NQorICBBY3R1YWxseSwgT09CIGRhdGEgc2hvdWxkIGJlIHJlYWQgaW5saW5lIHdoZW4gcG9zc2libGUuICBFc3BlY2lhbGx5IHdpdGgKKyAgcHJvdG9jb2xzIHRoYXQgZG9uJ3QgY2FyZSBhYm91dCB0aGUgVXJnZW50IGZsYWcuICBUaGlzIGlzIHRydWUgd2l0aCBUZWxuZXQuCisgIFdpdGggUmxvZ2luLCB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIGNhdGNoIE9PQiBkYXRhLiAgSG93ZXZlciwgdGhlIGJlc3QKKyAgd2F5IHRvIGRvIHRoaXMgaXMgdG8gc2V0IGEgc2lnbmFsIGhhbmRsZXIgb24gU0lHVVJHLiAgVGhpcyBpc24ndCBwb3NzaWJsZQorICBvbiBPUy8yIGFuZCBXaW5kb3dzLiAgQnV0IGl0IGlzIGluIFVOSVguICBXZSB3aWxsIGFsc28gbmVlZCBPT0IgZGF0YSBmb3IKKyAgRlRQIHNvIGJldHRlciBjcmVhdGUgYSBnZW5lcmFsIG1lY2hhbmlzbS4KKworICBUaGUgcmVhc29uIGZvciBtYWtpbmcgT09CIGRhdGEgYmUgaW5saW5lIGlzIHRoYXQgdGhlIHN0YW5kYXJkIHR0aW5jL3R0b2MKKyAgY2FsbHMgY2FuIGJlIHVzZWQgZm9yIHJlYWRpbmcgdGhhdCBkYXRhIG9uIFVOSVggc3lzdGVtcy4gIElmIHdlIGRpZG4ndAorICBoYXZlIHRoZSBPT0JJTkxJTkUgb3B0aW9uIHNldCB0aGVuIHdlIHdvdWxkIGhhdmUgdG8gdXNlIHJlY3YoLE1TR19PT0IpCisgIHRvIHJlYWQgaXQuCisqLworI2lmZGVmIFJMT0dDT0RFCisjaWZkZWYgVENQSVBMSUIKKyAgICBpZiAodHRucHJvdG8gPT0gTlBfUkxPR0lOCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAgICAgfHwgdHRucHJvdG8gPT0gTlBfSzRMT0dJTiB8fCB0dG5wcm90byA9PSBOUF9FSzRMT0dJTgorICAgICAgICB8fCB0dG5wcm90byA9PSBOUF9LNUxPR0lOIHx8IHR0bnByb3RvID09IE5QX0VLNUxPR0lOCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyAgICAgICkKKyAgICAgIG9uID0gMDsKKyNlbHNlIC8qIFRDUElQTElCICovCisgICAgaWYgKHR0bnByb3RvID09IE5QX1JMT0dJTgorI2lmZGVmIENLX0tFUkJFUk9TCisgICAgICAgICB8fCB0dG5wcm90byA9PSBOUF9LNExPR0lOIHx8IHR0bnByb3RvID09IE5QX0VLNExPR0lOCisgICAgICAgICB8fCB0dG5wcm90byA9PSBOUF9LNUxPR0lOIHx8IHR0bnByb3RvID09IE5QX0VLNUxPR0lOCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyAgICAgICAgICkgeworICAgICAgICBkZWJ1ZyhGMTAwLCJJbnN0YWxsaW5nIHJsb2dvb2JoIG9uIFNJR1VSRyIsIiIsMCk7CisgICAgICAgIHNpZ25hbChTSUdVUkcsIHJsb2dvb2JoKTsKKyAgICAgICAgb24gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlYnVnKEYxMDAsIklnbm9yaW5nIFNJR1VSRyIsIiIsMCk7CisgICAgICAgIHNpZ25hbChTSUdVUkcsIFNJR19ERkwpOworICAgIH0KKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworI2VuZGlmIC8qIFJMT0dDT0RFICovCisKKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgIHNldHNvY2tvcHQodHR5ZmQsIFNPTF9TT0NLRVQsIFNPX09PQklOTElORSwoY2hhciAqKSAmb24sIHNpemVvZiBvbik7CisjZWxzZQorI2lmZGVmIEJTRDQzCisgICAgc2V0c29ja29wdCh0dHlmZCwgU09MX1NPQ0tFVCwgU09fT09CSU5MSU5FLChjaGFyICopICZvbiwgc2l6ZW9mIG9uKTsKKyNlbHNlCisjaWZkZWYgT1NGMQorICAgIHNldHNvY2tvcHQodHR5ZmQsIFNPTF9TT0NLRVQsIFNPX09PQklOTElORSwoY2hhciAqKSAmb24sIHNpemVvZiBvbik7CisjZWxzZQorI2lmZGVmIFBPU0lYCisgICAgc2V0c29ja29wdCh0dHlmZCwgU09MX1NPQ0tFVCwgU09fT09CSU5MSU5FLChjaGFyICopICZvbiwgc2l6ZW9mIG9uKTsKKyNlbHNlCisjaWZkZWYgTU9UU1Y4OFI0CisgICAgc2V0c29ja29wdCh0dHlmZCwgU09MX1NPQ0tFVCwgU09fT09CSU5MSU5FLChjaGFyICopICZvbiwgc2l6ZW9mIG9uKTsKKyNlbHNlCisjaWZkZWYgU09MQVJJUworLyoKKyAgTWF5YmUgdGhpcyBhcHBsaWVzIHRvIGFsbCBTVlI0IHZlcnNpb25zLCBidXQgdGhlIG90aGVyIChlbHNlKSB3YXkgaGFzIGJlZW4KKyAgY29tcGlsaW5nIGFuZCB3b3JraW5nIGZpbmUgb24gYWxsIHRoZSBvdGhlcnMsIHNvIGJlc3Qgbm90IHRvIGNoYW5nZSBpdC4KKyovCisgICAgc2V0c29ja29wdCh0dHlmZCwgU09MX1NPQ0tFVCwgU09fT09CSU5MSU5FLChjaGFyICopICZvbiwgc2l6ZW9mIG9uKTsKKyNlbHNlCisjaWZkZWYgT1NLCisgICAgc2V0c29ja29wdCh0dHlmZCwgU09MX1NPQ0tFVCwgU09fT09CSU5MSU5FLChjaGFyICopICZvbiwgc2l6ZW9mIG9uKTsKKyNlbHNlCisjaWZkZWYgT1MyCisgICAgeworICAgICAgICBpbnQgcmM7CisgICAgICAgIHJjID0gc2V0c29ja29wdCh0dHlmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBTT19PT0JJTkxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Ygb24KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGRlYnVnKEYxMTEsInNldHNvY2tvcHQgU09fT09CSU5MSU5FIixvbiA/ICJvbiIgOiAib2ZmIiAscmMpOworICAgIH0KKyNlbHNlCisjaWZkZWYgVk1TIC8qIG9yLCBhdCBsZWFzdCwgVk1TIHdpdGggZ2NjICovCisgICAgc2V0c29ja29wdCh0dHlmZCwgU09MX1NPQ0tFVCwgU09fT09CSU5MSU5FLChjaGFyICopICZvbiwgc2l6ZW9mIG9uKTsKKyNlbHNlCisjaWZkZWYgQ0xJWAorICAgIHNldHNvY2tvcHQodHR5ZmQsIFNPTF9TT0NLRVQsIFNPX09PQklOTElORSwoY2hhciAqKSAmb24sIHNpemVvZiBvbik7CisjZWxzZQorICAgIHNldHNvY2tvcHQodHR5ZmQsIFNPTF9TT0NLRVQsIFNPX09PQklOTElORSwgJm9uLCBzaXplb2Ygb24pOworI2VuZGlmIC8qIENMSVggKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBTT0xBUklTICovCisjZW5kaWYgLyogTU9UU1Y4OFI0ICovCisjZW5kaWYgLyogUE9TSVggKi8KKyNlbmRpZiAvKiBCU0Q0MyAqLworI2VuZGlmIC8qIE9TRjEgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFNPX09PQklOTElORSAqLworCisjaWZuZGVmIE5PVENQT1BUUworI2lmbmRlZiBkYXRhZ2VuZXJhbAorI2lmZGVmIFNPTF9TT0NLRVQKKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgIG5vX2RlbGF5KHR0eWZkLHRjcF9ub2RlbGF5KTsKKyNlbmRpZiAvKiBUQ1BfTk9ERUxBWSAqLworI2lmZGVmIFNPX0tFRVBBTElWRQorICAgIGtlZXBhbGl2ZSh0dHlmZCx0Y3Bfa2VlcGFsaXZlKTsKKyNlbmRpZiAvKiBTT19LRUVQQUxJVkUgKi8KKyNpZmRlZiBTT19MSU5HRVIKKyAgICBja19saW5nZXIodHR5ZmQsdGNwX2xpbmdlciwgdGNwX2xpbmdlcl90bW8pOworI2VuZGlmIC8qIFNPX0xJTkdFUiAqLworI2lmZGVmIFNPX1NOREJVRgorICAgIHNlbmRidWYodHR5ZmQsdGNwX3NlbmRidWYpOworI2VuZGlmIC8qIFNPX1NOREJVRiAqLworI2lmZGVmIFNPX1JDVkJVRgorICAgIHJlY3ZidWYodHR5ZmQsdGNwX3JlY3ZidWYpOworI2VuZGlmIC8qIFNPX1JDVkJVRiAqLworI2VuZGlmIC8qIFNPTF9TT0NLRVQgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIE5PVENQT1BUUyAqLworCisjaWZuZGVmIGRhdGFnZW5lcmFsCisgICAgLyogRmluZCBvdXQgb3VyIG93biBJUCBhZGRyZXNzLiAqLworICAgIC8qIFdlIG5lZWQgdGhlIGxfYWRkciBzdHJ1Y3R1cmUgZm9yIFtFXUtMT0dJTi4gKi8KKyAgICBsX3NsZW4gPSBzaXplb2YobF9hZGRyKTsKKyAgICBiemVybygoY2hhciAqKSZsX2FkZHIsIGxfc2xlbik7CisjaWZuZGVmIEVYQ0VMQU4KKyAgICBpZiAoIWdldHNvY2tuYW1lKHR0eWZkLCAoc3RydWN0IHNvY2thZGRyICopJmxfYWRkciwgJmxfc2xlbikpIHsKKyAgICAgICAgY2hhciAqIHMgPSAoY2hhciAqKWluZXRfbnRvYShsX2FkZHIuc2luX2FkZHIpOworICAgICAgICBja3N0cm5jcHkobXlpcGFkZHIsIHMsIDIwKTsKKyAgICAgICAgZGVidWcoRjExMCwiZ2V0c29ja25hbWUiLG15aXBhZGRyLDApOworICAgIH0KKyNlbmRpZiAvKiBFWENFTEFOICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKworLyoKKyAgVGhpcyBpcyByZWFsbHkgb25seSBuZWVkZWQgZm9yIEtlcmJlcm9zIElWIGJ1dCBpcyB1c2VmdWwgaW5mb3JtYXRpb24gaW4gYW55CisgIGNhc2UuICBJZiB3ZSBjb25uZWN0IHRvIGEgbmFtZSB0aGF0IGlzIHJlYWxseSBhIHBvb2wsIHdlIG5lZWQgdG8gZ2V0IHRoZQorICBuYW1lIG9mIHRoZSBtYWNoaW5lIHdlIGFyZSBhY3R1YWxseSBjb25uZWN0aW5nIHRvIGZvciBLNCB0byBhdXRoZW50aWNhdGUKKyAgcHJvcGVybHkuICBUaGlzIHdheSB3ZSBhbHNvIHVwZGF0ZSB0aGUgbmFtZXMgcHJvcGVybHkuCisKKyAgSG93ZXZlciwgaXQgaXMgYSBzZWN1cml0eSBob2xlIHdoZW4gdXNlZCB3aXRoIGluc2VjdXJlIEROUy4KKworICBOb3RlOiBUaGlzIGRvZXMgbm90IHdvcmsgb24gV2luZG93cyA5NSBvciBXaW5kb3dzIE5UIDMuNXguICBUaGlzIGlzIGJlY2F1c2UKKyAgb2YgdGhlIE1pY3Jvc29mdCBpbXBsZW1lbnRhdGlvbiBvZiBnZXRob3N0YnlhZGRyKCkgaW4gYm90aCBXaW5zb2NrIDEuMQorICBhbmQgV2luc29jayAyLjAgb24gdGhvc2UgcGxhdGZvcm1zLiAgVGhlaXIgYWxnb3JpdGhtIGlzOgorCisgIDEuIENoZWNrIHRoZSBIT1NURU5UIGNhY2hlLgorICAyLiBDaGVjayB0aGUgSE9TVFMgZmlsZSBhdCAlU3lzdGVtUm9vdCVcU3lzdGVtMzJcRFJJVkVSU1xFVEMuCisgIDMuIERvIGEgRE5TIHF1ZXJ5IGlmIHRoZSBETlMgc2VydmVyIGlzIGNvbmZpZ3VyZWQgZm9yIG5hbWUgcmVzb2x1dGlvbi4KKyAgNC4gRG8gYW4gYWRkaXRpb25hbCBOZXRCSU9TIHJlbW90ZSBhZGFwdGVyIHN0YXR1cyB0byBhbiBJUCBhZGRyZXNzIGZvciBpdHMKKyAgICAgTmV0QklPUyBuYW1lIHRhYmxlLiBUaGlzIHN0ZXAgaXMgc3BlY2lmaWMgb25seSB0byB0aGUgV2luZG93cyBOVCB2ZXJzaW9uCisgICAgIDMuNTEgaW1wbGVtZW50YXRpb24uCisKKyAgVGhlIHByb2JsZW0gaXMgdGhlIHVzZSBvZiB0aGUgSE9TVEVOVCBjYWNoZS4gIEl0IG1lYW5zIHRoYXQgZ2V0aG9zdGJ5YWRkcigpCisgIGNhbiBub3QgYmUgdXNlZCB0byByZXNvbHZlIHRoZSByZWFsIG5hbWUgb2YgbWFjaGluZSBpZiBpdCB3YXMgb3JpZ2luYWxseQorICBhY2Nlc3NlZCBieSBhbiBhbGlhcyB1c2VkIHRvIHJlcHJlc2VudCBhIGNsdXN0ZXIuCisqLworICAgICBpZiAoKHRjcF9yZG5zICYmIGRucyB8fCB0Y3BfcmRucyA9PSBTRVRfT04KKyNpZmRlZiBDS19LRVJCRVJPUworICAgICAgICAgfHwgdGNwX3JkbnMgPT0gU0VUX0FVVE8gJiYKKyAgICAgICAgICAoY2tfa3JiNV9pc19pbnN0YWxsZWQoKSB8fCBja19rcmI0X2lzX2luc3RhbGxlZCgpKQorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisgICAgICAgICApCisjaWZuZGVmIE5PSFRUUAorICAgICAgICAgICYmICh0Y3BfaHR0cF9wcm94eSA9PSBOVUxMKQorI2VuZGlmIC8qIE5PSFRUUCAqLworI2lmZGVmIENLX1NTTAorICAgICAgICAgICYmICEoc3NsX29ubHlfZmxhZyB8fCB0bHNfb25seV9mbGFnKQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgKSB7CisjaWZkZWYgTlQKKyAgICAgICAgaWYgKGlzV2luOTUoKSkKKyAgICAgICAgICBzbGVlcCgxKTsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICBpZiAoIXF1aWV0KSB7CisgICAgICAgICAgICBwcmludGYoIiBSZXZlcnNlIEROUyBMb29rdXAuLi4gIik7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9zdCA9IGdldGhvc3RieWFkZHIoKGNoYXIgKikmcl9hZGRyLnNpbl9hZGRyLDQsUEZfSU5FVCkpIHsKKyAgICAgICAgICAgIGNoYXIgKiBzOworICAgICAgICAgICAgaG9zdCA9IGNrX2NvcHlob3N0ZW50KGhvc3QpOworICAgICAgICAgICAgZGVidWcoRjEwMCwibmV0b3BlbiBnZXRob3N0YnluYW1lICE9IE5VTEwiLCIiLDApOworICAgICAgICAgICAgaWYgKCFxdWlldCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiKE9LKVxuIik7CisgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzID0gaG9zdC0+aF9uYW1lOworICAgICAgICAgICAgaWYgKCFzKSB7ICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbi4uLiAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsIm5ldG9wZW4gaG9zdC0+aF9uYW1lIGlzIE5VTEwiLCIiLDApOworICAgICAgICAgICAgICAgIHMgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIGluZXRfbnRvYSgpIG9uIEhQVVggMTAueHggKi8KKyAgICAgICAgICAgIC8qIFRoZSBjb21waWxlciBzYXlzICJJbnRlZ3JhbCB2YWx1ZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byAqLworICAgICAgICAgICAgLyogcG9pbnRlciBpbiBhc3NpZ25tZW50LiIgIFRoZSBwcm90b3R5cGUgaXMgcmlnaHQgdGhlcmUgKi8KKyAgICAgICAgICAgIC8qIGluIDxhcnBhL2luZXQuaD4gc28gd2hhdCdzIHRoZSBwcm9ibGVtPyAqLworICAgICAgICAgICAgLyogRGl0dG8gaW4gSFAtVVggNS54LCBidXQgbm90IDgueCBvciA5LnguLi4gKi8KKyAgICAgICAgICAgIGlmICghKnMpIHsgICAgICAgICAgICAgICAgICAvKiBObyBuYW1lIHNvIHN1YnN0aXR1dGUgdGhlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJuZXRvcGVuIGhvc3QtPmhfbmFtZSBpcyBlbXB0eSIsIiIsMCk7CisgICAgICAgICAgICAgICAgcyA9IGluZXRfbnRvYShyX2FkZHIuc2luX2FkZHIpOyAvKiBDb252ZXJ0IGFkZHJlc3MgdG8gc3RyaW5nICovCisgICAgICAgICAgICAgICAgaWYgKCFzKSAgICAgICAgICAgICAgICAgLyogVHJ1c3QgTm8gMSAqLworICAgICAgICAgICAgICAgICAgcyA9ICIiOworICAgICAgICAgICAgICAgIGlmICgqcykgeyAgICAgICAgICAgICAgIC8qIElmIGl0IHdvcmtlZCwgdXNlIHRoaXMgc3RyaW5nICovCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShpcGFkZHIscywyMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMgPSBpcGFkZHI7ICAgICAgICAgICAgIC8qIE90aGVyd2lzZSBzdGljayB3aXRoIHRoZSBJUCAqLworICAgICAgICAgICAgICAgIGlmICghKnMpICAgICAgICAgICAgICAgIC8qIG9yIGZhaWxpbmcgdGhhdCAqLworICAgICAgICAgICAgICAgICAgcyA9IG5hbWVjb3B5OyAgICAgICAgIC8qIHRoZSBuYW1lIHdlIHdlcmUgY2FsbGVkIHdpdGguICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnMpIHsgICAgICAgICAgICAgICAgICAgLyogQ29weWluZyBpbnRvIG91ciBhcmd1bWVudD8gKi8KKyAgICAgICAgICAgICAgICBja3N0cm5jcHkobmFtZSxzLDgwKTsgICAvKiBCYWQgQmFkIEJhZCAqLworICAgICAgICAgICAgICAgIGlmICggKDgwLXN0cmxlbihuYW1lKSkgPiAoc3RybGVuKHN2Y2J1ZikrMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQobmFtZSwiOiIsODAtc3RybGVuKG5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RybmNhdChuYW1lLHN2Y2J1Ziw4MC1zdHJsZW4obmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcXVpZXQgJiYgKnMKKyNpZm5kZWYgTk9JQ1AKKyAgICAgICAgICAgICAgICAmJiAhZG9jb254CisjZW5kaWYgLyogTk9JQ1AgKi8KKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAlcyBjb25uZWN0ZWQgb24gcG9ydCAlc1xuIixzLHApOworI2lmZGVmIEJFVEFERUJVRworICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgc2ltcGx5IGZvciB0ZXN0aW5nIHRoZSBETlMgZW50cmllcyAqLworICAgICAgICAgICAgICAgIGlmIChob3N0LT5oX2FsaWFzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqKiBhID0gaG9zdC0+aF9hbGlhc2VzOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIGFsaWFzID0+ICVzXG4iLCphKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGErKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBCRVRBREVCVUcgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghcXVpZXQpIHByaW50ZigiRmFpbGVkLlxuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFxdWlldCkgcHJpbnRmKCIoT0spXG4iKTsKKyAgICBpZiAoIXF1aWV0KSBmZmx1c2goc3Rkb3V0KTsKKworICAgIC8qIFRoaXMgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGRvbmUgYnV0IGp1c3QgaW4gY2FzZSAqLworICAgIGNrc3RybmNweShpcGFkZHIsKGNoYXIgKilpbmV0X250b2Eocl9hZGRyLnNpbl9hZGRyKSwyMCk7CisKKyNpZmRlZiBDS19TRUNVUklUWQorCisgICAgLyogQmVmb3JlIEluaXRpYWxpemF0aW9uIFRlbG5ldC9SbG9naW4gTmVnb3RpYXRpb25zIEluaXQgS2VyYmVyb3MgKi8KKyNpZm5kZWYgTk9IVFRQCisgICAgaWYgKHRjcF9odHRwX3Byb3h5KSB7CisgICAgICAgIGZvciAoaT1zdHJsZW4ocHJveHljb3B5KTsgaSA+PSAwIDsgaS0tKQorICAgICAgICAgICAgaWYgKCBwcm94eWNvcHlbaV0gPT0gJzonICkKKyAgICAgICAgICAgICAgICBwcm94eWNvcHlbaV0gPSAnXDAnOworICAgIH0KKyNlbmRpZiAvKiBOT0hUVFAgKi8KKyAgICBja19hdXRoX2luaXQoCisjaWZuZGVmIE5PSFRUUAorICAgICAgICAgICAgICAgICB0Y3BfaHR0cF9wcm94eSA/IHByb3h5Y29weSA6CisjZW5kaWYgLyogTk9IVFRQICovCisgICAgICAgICAgICAgICAgICh0Y3BfcmRucyAmJiBob3N0ICYmIGhvc3QtPmhfbmFtZSAmJiBob3N0LT5oX25hbWVbMF0pID8KKyAgICAgICAgICAgICAgICAgKGNoYXIgKilob3N0LT5oX25hbWUgOiAobmFtZWNvcHkyWzBdID8gbmFtZWNvcHkyIDogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVjb3B5WzBdID8gbmFtZWNvcHkgOiBpcGFkZHIpKSwKKyAgICAgICAgICAgICAgICAgaXBhZGRyLAorICAgICAgICAgICAgICAgICB1aWRidWYsCisgICAgICAgICAgICAgICAgIHR0eWZkCisgICAgICAgICAgICAgICAgICk7CisjZW5kaWYgLyogQ0tfU0VDVVJJVFkgKi8KKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpKSB7CisgICAgICAgIGlmICghc3NsX3RuX2luaXQoU1NMX0NMSUVOVCkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsIm5ldG9wZW4gc3NsX3RuX2luaXQoKSBmYWlsZWQiLCIiLDApOworICAgICAgICAgICAgaWYgKGJpb19lcnIhPU5VTEwpIHsKKyAgICAgICAgICAgICAgICBCSU9fcHJpbnRmKGJpb19lcnIsInNzbF90bl9pbml0KCkgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwic3NsX3RuX2luaXQoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0bHNfb25seV9mbGFnIHx8IHNzbF9vbmx5X2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJuZXRvcGVuIHNzbC90bHMgcmVxdWlyZWQiLCIiLDApOworICAgICAgICAgICAgICAgIG5ldGNsb3MoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB3ZSB3aWxsIGNvbnRpbnVlIHRvIGFjY2VwdCB0aGUgY29ubmVjdGlvbiAgICovCisgICAgICAgICAgICAvKiB3aXRob3V0IFNTTCBvciBUTFMgc3VwcG9ydCB1bmxlc3MgcmVxdWlyZWQuICovCisgICAgICAgICAgICBpZiAoIFRFTE9QVF9ERUZfU19NRV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpICE9IFROX05HX01VICkKKyAgICAgICAgICAgICAgICBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfU1RBUlRfVExTKSA9IFROX05HX1JGOworICAgICAgICAgICAgaWYgKCBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpICE9IFROX05HX01VICkKKyAgICAgICAgICAgICAgICBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpID0gVE5fTkdfUkY7CisgICAgICAgICAgICBpZiAoIFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpICE9IFROX05HX01VICkKKyAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfU1RBUlRfVExTKSA9IFROX05HX1JGOworICAgICAgICAgICAgaWYgKCBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpICE9IFROX05HX01VICkKKyAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpID0gVE5fTkdfUkY7CisgICAgICAgIH0gZWxzZSBpZiAoIGNrX3NzbF9vdXRnb2luZyh0dHlmZCkgPCAwICkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwiY2tfc3NsX291dGdvaW5nKCkgZmFpbGVkIiwiIiwwKTsKKyAgICAgICAgICAgIG5ldGNsb3MoKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyNpZmRlZiBSTE9HQ09ERQorICAgIGlmICh0dG5wcm90byA9PSBOUF9STE9HSU4KKyNpZmRlZiBDS19LRVJCRVJPUworICAgICAgICB8fCB0dG5wcm90byA9PSBOUF9LNExPR0lOIHx8IHR0bnByb3RvID09IE5QX0VLNExPR0lOCisgICAgICAgIHx8IHR0bnByb3RvID09IE5QX0s1TE9HSU4gfHwgdHRucHJvdG8gPT0gTlBfRUs1TE9HSU4KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworICAgICAgICApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpbWlsYXIgZGVhbCBmb3IgcmxvZ2luICovCisgICAgICAgIGlmIChybG9nX2luaSgoKHRjcF9yZG5zICYmIGhvc3QgJiYgaG9zdC0+aF9uYW1lICYmIGhvc3QtPmhfbmFtZVswXSkgPworICAgICAgICAgICAgICAgICAgICAgIChDSEFSICopaG9zdC0+aF9uYW1lIDogKENIQVIgKilpcGFkZHIpLAorICAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+c19wb3J0LAorICAgICAgICAgICAgICAgICAgICAgJmxfYWRkciwmcl9hZGRyCisgICAgICAgICAgICAgICAgICAgICApIDwgMCkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwicmxvZ2luIGluaXRpYWxpemF0aW9uIGZhaWxlZCIsIiIsMCk7CisgICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgfSBlbHNlCisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyAgICBpZiAodG5faW5pKCkgPCAwKSB7ICAgICAgICAgICAgICAgICAvKiBTdGFydCBUZWxuZXQgbmVnb3RpYXRpb25zLiAqLworICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgIHJldHVybigtMSk7ICAgICAgICAgICAgICAgICAgICAgLyogR29uZSwgc28gb3BlbiBmYWlsZWQuICAqLworICAgIH0KKyAgICBpZiAodHRjaGsoKSA8IDApIHsKKyAgICAgICAgbmV0Y2xvcygpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyNpZmRlZiBDS19LRVJCRVJPUworI2lmZGVmIEtSQjVfVTJVCisgICBpZiAoIHR0bnByb3RvID09IE5QX0s1VTJVICkgeworICAgICAgIGlmIChrNV91c2VyX3RvX3VzZXJfY2xpZW50X2F1dGgoKSkgeworICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgfQorICAgfQorI2VuZGlmIC8qIEtSQjVfVTJVICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKworICAgIGRlYnVnKEYxMDEsIm5ldG9wZW4gc2VydmljZSIsIiIsc3ZjbnVtKTsKKyAgICBkZWJ1ZyhGMTEwLCJuZXRvcGVuIG5hbWUiLG5hbWUsMCk7CisKKyAgICBpZiAobGNsKSBpZiAoKmxjbCA8IDApICAgICAgICAgICAgICAvKiBMb2NhbCBtb2RlLiAqLworICAgICAgKmxjbCA9IDE7CisjZW5kaWYgLyogVENQU09DS0VUICovCisgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uZS4gKi8KK30KKworLyogIE4gRSBUIEMgTCBPIFMgIC0tICBDbG9zZSBjdXJyZW50IG5ldHdvcmsgY29ubmVjdGlvbi4gICovCisKKyNpZm5kZWYgTk9MT0NBTAorX1BST1RPVFlQKFZPSUQgc2xyZXN0b3IsKFZPSUQpKTsKKyNpZmRlZiBDS19TU0wKK2ludCB0bHNfbm9yZXN0b3JlID0gMDsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKK2ludAorbmV0Y2xvcygpIHsKKyAgICBzdGF0aWMgaW50IGNsb3NlX2luX3Byb2dyZXNzID0gMDsKKyAgICBpbnQgeCA9IDAsIHksIHo7CisgICAgZGVidWcoRjEwMSwibmV0Y2xvcyIsIiIsdHR5ZmQpOworCisjaWZkZWYgTkVUTEVCVUYKKyAgICBpZiAoIXR0X3B1c2hfaW5pdGVkKQorICAgICAgbGVfaW5pdCgpOworI2VuZGlmIC8qIE5FVExFQlVGICovCisKKyAgICBpZiAodHR5ZmQgPT0gLTEpICAgICAgICAgICAgICAgICAgICAvKiBXYXMgb3Blbj8gKi8KKyAgICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYXNuJ3QuICovCisKKyAgICBpZiAoY2xvc2VfaW5fcHJvZ3Jlc3MpCisgICAgICByZXR1cm4oMCk7CisgICAgY2xvc2VfaW5fcHJvZ3Jlc3MgPSAxOyAgICAgICAgICAgICAgLyogUmVtZW1iZXIgKi8KKworI2lmbmRlZiBOT0xPQ0FMCisgICAgLyogVGhpcyBmdW5jdGlvbiBjYWxsIHNob3VsZCBub3QgYmUgaGVyZSBzaW5jZSB0aGlzIGlzIGEgZGlyZWN0IGNhbGwgKi8KKyAgICAvKiBmcm9tIGFuIEkvTyByb3V0aW5lIHRvIGEgdXNlciBpbnRlcmZhY2UgbGV2ZWwgZnVuY3Rpb24uICBIb3dldmVyLCAqLworICAgIC8qIHRoZSByZWFsaXR5IGlzIHRoYXQgd2UgZG8gbm90IGhhdmUgcHVyZSBpbnRlcmZhY2VzLiAgSWYgd2UgZXZlciAgICovCisgICAgLyogZGVjaWRlIHRvIGNsZWFuIHRoaXMgdXAgdGhlIFVJIGxldmVsIHNob3VsZCBhc3NpZ24gdGhpcyBmdW5jdGlvbiAgKi8KKyAgICAvKiB2aWEgYSBwb2ludGVyIGFzc2lnbm1lbnQuICAtIEplZmYgOS8xMC8xOTk5ICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIENLX1NTTAorICAgIGlmICghdGxzX25vcmVzdG9yZSkKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgIHNscmVzdG9yKCk7CisjZW5kaWYgLyogTk9MT0NBTCAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUQ1BJUE11dGV4KFNFTV9JTkRFRklOSVRFX1dBSVQpOworI2Vsc2UgLyogT1MyICovCisgICAgaWYgKHR0eWZkID4gLTEpICAgICAgICAgICAgICAgICAgICAgLyogV2FzLiAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgeworI2lmZGVmIFZNUworCSAgeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUdXJuIG9uIG5vbmJsb2NraW5nIHJlYWRzICovCisJICB6ID0gc29ja2V0X2lvY3RsKHR0eWZkLEZJT05CSU8sJnkpOworCSAgZGVidWcoRjExMSwibmV0Y2xvcyBGSU9OQklPIiwib24iLHopOworI2VuZGlmIC8qIFZNUyAqLworI2lmZGVmIFROQ09ERQorICAgICAgICAgIGlmICh0dG5wcm90byA9PSBOUF9URUxORVQpIHsKKyAgICAgICAgICAgIGlmICggIVRFTE9QVF9NRShURUxPUFRfTE9HT1VUKSApIHsKKwkJLyogU2VuZCBMT0dPVVQgb3B0aW9uIGJlZm9yZSBjbG9zZSAqLworCQlpZiAodG5fc29wdChETyxURUxPUFRfTE9HT1VUKSA+PSAwKSB7CisJCSAgICBURUxPUFRfVU5BTlNXRVJFRF9ETyhURUxPUFRfTE9HT1VUKSA9IDE7CisJCSAgICAvKiBJdCB3b3VsZCBiZSBuaWNlIHRvIGNhbGwgdG5fd2FpdCBidXQgd2UgY2FuJ3QgKi8KKwkJfQorCSAgICB9CisgICAgICAgICAgICB0bl9wdXNoKCk7CQkJLyogUGxhY2UgYW55IHdhaXRpbmcgZGF0YSBpbnRvIGlucHV0Ki8KKyAgICAgICAgICB9CisjZW5kaWYgLyogVE5DT0RFICovCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgaWYgKHNzbF9hY3RpdmVfZmxhZykgeworICAgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgQklPX3ByaW50ZihiaW9fZXJyLCJjYWxsaW5nIFNTTF9zaHV0ZG93blxuIik7CisgICAgICAgICAgICAgIFNTTF9zaHV0ZG93bihzc2xfY29uKTsKKyAgICAgICAgICAgICAgc3NsX2FjdGl2ZV9mbGFnID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRsc19hY3RpdmVfZmxhZykgeworICAgICAgICAgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisgICAgICAgICAgICAgICAgQklPX3ByaW50ZihiaW9fZXJyLCJjYWxsaW5nIFNTTF9zaHV0ZG93blxuIik7CisgICAgICAgICAgICAgIFNTTF9zaHV0ZG93bih0bHNfY29uKTsKKyAgICAgICAgICAgICAgdGxzX2FjdGl2ZV9mbGFnID0gMDsKKyAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgVk1TCisgICAgICAgICAgY2tfY2FuY2lvKCk7ICAgICAgICAgICAgICAgICAgLyogQ2FuY2VsIGFueSBvdXRzdGFuZGluZyByZWFkcy4gKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICAgIHggPSBzb2NrZXRfY2xvc2UodHR5ZmQpOyAgICAgIC8qIENsb3NlIGl0LiAqLworI2Vsc2UKKyNpZm5kZWYgT1MyCisjaWZkZWYgSUJNWDI1CisgICAgICAgIGlmICh0dG5ldCA9PSBORVRfSVgyNSkgeworICAgICAgICAgICAgLyogcmllaG06IHNob3VsZCBzZW5kIGEgZGlzY19yZXEgLSBidXQgb25seSBpZiBsaW5rIGlzIHN0aWxsIE9LICovCisgICAgICAgICAgICB4ID0geDI1Y2xlYXIoKTsKKyAgICAgICAgICAgIGNsb3NlKHR0eWZkKTsKKyAgICAgICAgICAgIGlmICh4MjVzZXJ2ZXJmZCkgeworICAgICAgICAgICAgICAgICAgLyogd2Ugd2VyZSB0aGUgcGFzc2l2ZSBjbGllbnQgb2YgYSBzZXJ2ZXIsIG5vdyB3ZQorICAgICAgICAgICAgICAgICAgICogZ28gYmFjayB0byBiZWluZyB0aGUgbm9ybWFsIGNsaWVudC4KKyAgICAgICAgICAgICAgICAgICAqIEkgaG9wZSB0aGF0IGtlcm1pdCBjYW4gY29wZSB3aXRoIHRoZSBsb2dpYyB0aGF0CisgICAgICAgICAgICAgICAgICAgKiB0aGVyZSBjYW4gc3RpbGwgYmUgYSBjb25uZWN0aW9uIGFmdGVyIG5ldGNsb3MKKyAgICAgICAgICAgICAgICAgICAqIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgdHR5ZmQgPSB4MjVzZXJ2ZXJmZDsKKyAgICAgICAgICAgICAgICAgIHgyNXNlcnZlcmZkID0gMDsKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgKiBuZWVkIHRvIGNsb3NlIHRoZSBzZXJ2ZXIgY29ubmVjdGlvbiB0b28gLSBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgKiBhbGwgZmlsZSBkZXNjcmlwdG9ycyBjb25uZWN0ZWQgdG8gdGhlIE5QSSBoYXZlIHRoZQorICAgICAgICAgICAgICAgICAgICogc2FtZSBzdGF0dXMuCisgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICogVGhlIHByb2JsZW0gaXMgdGhhdCBhbnkgd2FpdGluZyBjb25uZWN0aW9ucyBnZXQKKyAgICAgICAgICAgICAgICAgICAqIGxvc3QsIHRoZSBjbGllbnQgZG9lc24ndCByZWFsaXNlLCBhbmQgaGFuZ3MuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIG5ldGNsb3MoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgeDI1X3N0YXRlID0gWDI1X0NMT1NFRDsgICAgIC8qIHJpZWhtOiBkZWFkIGNvZGU/ICovCisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIElCTVgyNSAqLworICAgICAgICAgIHggPSBjbG9zZSh0dHlmZCk7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgIH0KKyAgICB0dHlmZCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXJrIGl0IGFzIGNsb3NlZC4gKi8KKyAgICB3YXNjbG9zZWQgPSAxOworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgVE5DT0RFCisjaWZkZWYgQ0tfRk9SV0FSRF9YCisgICAgZndkeF9jbG9zZV9hbGwoKTsgICAgICAgICAgICAgICAgICAgLyogU2h1dCBkb3duIGFueSBGb3J3YXJkIFggc29ja2V0cyAqLworI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworICAgIHRuX3Jlc2V0KCk7ICAgICAgICAgICAgICAgICAgIC8qIFRoZSBSZXNldCBUZWxuZXQgT3B0aW9uIHRhYmxlLiAgKi8KKyAgICBkZWJ1ZyhGMTAwLCJuZXRjbG9zZSBzZXR0aW5nIHRuX2luaXQgPSAwIiwiIiwwKTsKKyAgICB0bl9pbml0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZW1lbWJlciBhYm91dCB0ZWxuZXQgcHJvdG9jb2wuLi4gKi8KKyAgICBzc3RlbG5ldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGllbnQtc2lkZSBUZWxuZXQgKi8KKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICAqaXBhZGRyID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAvKiBaZXJvIHRoZSBJUCBhZGRyZXNzIHN0cmluZyAqLworICAgIHRjcF9pbmNvbWluZyA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIE5vIGxvbmdlciBpbmNvbWluZyAqLworICAgIC8qIERvbid0IHJlc2V0IHR0bnByb3RvIHNvIHRoYXQgd2UgY2FuIHJlbWVtYmVyIHdoaWNoIHByb3RvY29sIGlzIGluIHVzZSAqLworCisjaWZkZWYgVENQSVBMSUIKKy8qCisgIEVtcHR5IHRoZSBpbnRlcm5hbCBidWZmZXJzIHNvIHRoZXkgd29uJ3QgYmUgdXNlZCBhcyBpbnZhbGlkIGlucHV0IG9uCisgIHRoZSBuZXh0IGNvbm5lY3QgYXR0ZW1wdCAocmxvZ2luKS4KKyovCisgICAgdHRpYnAgPSAwOworICAgIHR0aWJuID0gMDsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworI2lmZGVmIENLX0tFUkJFUk9TCisgICAgLyogSWYgd2UgYXJlIGF1dG9tYXRpY2FsbHkgZGVzdHJveWluZyBLZXJiZXJvcyBjcmVkZW50aWFscyBvbiBDbG9zZSAqLworICAgIC8qIGRvIGl0IG5vdy4gKi8KKyNpZmRlZiBLUkI0CisgICAgaWYgKGtyYjRfYXV0b2RlbCA9PSBLUkJfREVMX0NMKSB7CisgICAgICAgIGV4dGVybiBzdHJ1Y3Qga3JiX29wX2RhdGEga3JiX29wOworICAgICAgICBrcmJfb3AudmVyc2lvbiA9IDQ7CisgICAgICAgIGtyYl9vcC5jYWNoZSA9IE5VTEw7CisgICAgICAgIGNrX2tyYjRfZGVzdHJveSgma3JiX29wKTsKKyAgICB9CisjZW5kaWYgLyogS1JCNCAqLworI2lmZGVmIEtSQjUKKyAgICBpZiAoa3JiNV9hdXRvZGVsID09IEtSQl9ERUxfQ0wpIHsKKyAgICAgICAgZXh0ZXJuIHN0cnVjdCBrcmJfb3BfZGF0YSBrcmJfb3A7CisgICAgICAgIGV4dGVybiBjaGFyICoga3JiNV9kX2NjOworICAgICAgICBrcmJfb3AudmVyc2lvbiA9IDU7CisgICAgICAgIGtyYl9vcC5jYWNoZSA9IGtyYjVfZF9jYzsKKyAgICAgICAgY2tfa3JiNV9kZXN0cm95KCZrcmJfb3ApOworICAgIH0KKyNlbmRpZiAvKiBLUkI1ICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyAgICBjbG9zZV9pbl9wcm9ncmVzcyA9IDA7ICAgICAgICAgICAgICAvKiBSZW1lbWJlciB3ZSBhcmUgZG9uZS4gKi8KKyAgICByZXR1cm4oeCk7Cit9CisKKyNpZmRlZiBPUzIKK2ludAorb3Myc29ja2V0ZXJyb3IoIGludCBzX2Vycm5vICkgeworI2lmZGVmIE9TMk9OTFkKKyAgICBpZiAoc19lcnJubyA+IDAgJiYgc19lcnJubyA8PSBTT0NCQVNFRVJSKSB7CisgICAgICAgIC8qIGluIE9TLzIsIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRocmVhZGluZyBpbiB0aGF0CisgICAgICAgICAqIHRoZSB2YWx1ZSBvZiBlcnJubyBpcyBub3QgdGhyZWFkIHNhZmUuICBJdCBjYW4gYmUKKyAgICAgICAgICogc2V0IHRvIGEgdmFsdWUgZnJvbSBhIHByZXZpb3VzIGxpYnJhcnkgY2FsbCBhbmQgaWYKKyAgICAgICAgICogaXQgd2FzIG5vdCBjbGVhcmVkIGl0IHdpbGwgYXBwZWFyIGhlcmUuICBPbmx5IHRyZWF0CisgICAgICAgICAqIHZhbGlkIHNvY2tldCBlcnJvciBjb2RlcyBhcyBlcnJvcnMgaW4gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGRlYnVnKEYxMDAsIm9zMnNvY2tldGVycm9yIGVycm5vLmgiLCIiLDApOworICAgICAgICBzb2NrZXRfZXJybm8gPSAwOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIE9TMk9OTFkgKi8KKworICAgIHN3aXRjaCAoc19lcnJubykgeworICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PIEVSUk9SICovCisgICAgICAgIGRlYnVnKEYxMDAsIm9zMnNvY2tldGVycm9yIE5PRVJST1IiLCIiLDApOworICAgICAgICByZXR1cm4oMCk7CisjaWZkZWYgTlQKKyAgICAgIGNhc2UgV1NBRUNPTk5SRVNFVDoKKyNlbHNlIC8qIE5UICovCisgICAgICBjYXNlIFNPQ0VDT05OUkVTRVQ6CisgICAgICBjYXNlIFNPQ0VDT05OUkVTRVQgLSBTT0NCQVNFRVJSOgorI2VuZGlmIC8qIE5UICovCisgICAgICAgIGRlYnVnKEYxMDAsIm9zMnNvY2tldGVycm9yIEVDT05SRVNFVCIsIiIsMCk7CisgICAgICAgIHRuX2RlYnVnKCJFQ09OUkVTRVQiKTsKKyAgICAgICAgbmV0Y2xvcygpOyAgICAgICAgICAgICAgLyogKioqICoqKiAqLworICAgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAvKiBDb25uZWN0aW9uIGlzIGJyb2tlbi4gKi8KKyNpZmRlZiBOVAorICAgICAgY2FzZSBXU0FFQ09OTkFCT1JURUQ6CisjZWxzZSAvKiBOVCAqLworICAgICAgY2FzZSBTT0NFQ09OTkFCT1JURUQ6CisgICAgICBjYXNlIFNPQ0VDT05OQUJPUlRFRCAtIFNPQ0JBU0VFUlI6CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgZGVidWcoRjEwMCwib3Myc29ja2V0ZXJyb3IgRUNPTk5BQk9SVEVEIiwiIiwwKTsKKyAgICAgICAgdG5fZGVidWcoIkVDT05OQUJPUlRFRCIpOworICAgICAgICBuZXRjbG9zKCk7ICAgICAgICAgICAgICAvKiAqKiogKioqICovCisgICAgICAgIHJldHVybigtMSk7ICAgICAgICAgICAgIC8qIENvbm5lY3Rpb24gaXMgYnJva2VuLiAqLworI2lmZGVmIE5UCisgICAgICBjYXNlIFdTQUVORVRSRVNFVDoKKyNlbHNlIC8qIE5UICovCisgICAgICBjYXNlIFNPQ0VORVRSRVNFVDoKKyAgICAgIGNhc2UgU09DRU5FVFJFU0VUIC0gU09DQkFTRUVSUjoKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICBkZWJ1ZyhGMTAwLCJvczJzb2NrZXRlcnJvciBFTkVUUkVTRVQiLCIiLDApOworICAgICAgICB0bl9kZWJ1ZygiRU5FVFJFU0VUIik7CisgICAgICAgIG5ldGNsb3MoKTsgICAgICAgICAgICAgIC8qICoqKiAqKiogKi8KKyAgICAgICAgcmV0dXJuKC0xKTsgICAgICAgICAgICAgLyogQ29ubmVjdGlvbiBpcyBicm9rZW4uICovCisjaWZkZWYgTlQKKyAgICAgIGNhc2UgV1NBRU5PVENPTk46CisjZWxzZSAvKiBOVCAqLworICAgICAgY2FzZSBTT0NFTk9UQ09OTjoKKyAgICAgIGNhc2UgU09DRU5PVENPTk4gLSBTT0NCQVNFRVJSOgorI2VuZGlmIC8qIE5UICovCisgICAgICAgIGRlYnVnKEYxMDAsIm9zMnNvY2tldGVycm9yIEVOT1RDT05OIiwiIiwwKTsKKyAgICAgICAgdG5fZGVidWcoIkVOT1RDT05OIik7CisgICAgICAgIG5ldGNsb3MoKTsgICAgICAgICAgICAgICAgICAgICAgLyogKioqICoqKiAqLworICAgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAgICAgICAgIC8qIENvbm5lY3Rpb24gaXMgYnJva2VuLiAqLworI2lmZGVmIE5UCisgICAgICBjYXNlIFdTQUVTSFVURE9XTjoKKyAgICAgICAgZGVidWcoRjEwMCwib3Myc29ja2V0ZXJyb3IgRVNIVVRET1dOIiwiIiwwKTsKKyAgICAgICAgdG5fZGVidWcoIkVTSFVURE9XTiIpOworICAgICAgICBuZXRjbG9zKCk7ICAgICAgICAgICAgICAgICAgICAgIC8qICoqKiAqKiogKi8KKyAgICAgICAgcmV0dXJuKC0xKTsgICAgICAgICAgICAgICAgICAgICAvKiBDb25uZWN0aW9uIGlzIGJyb2tlbi4gKi8KKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIE5UCisgICAgICBjYXNlIFdTQUVXT1VMREJMT0NLOgorI2Vsc2UKKyAgICAgIGNhc2UgU09DRVdPVUxEQkxPQ0s6CisgICAgICBjYXNlIFNPQ0VXT1VMREJMT0NLIC0gU09DQkFTRUVSUjoKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICBkZWJ1ZyhGMTAwLCJvczJzb2NrZXRlcnJvciBFV09VTERCTE9DSyIsIiIsMCk7CisgICAgICAgIHJldHVybigwKTsKKyNpZmRlZiBOVAorICAgICAgY2FzZSBFUlJPUl9JT19JTkNPTVBMRVRFOgorICAgICAgY2FzZSBFUlJPUl9JT19QRU5ESU5HOgorICAgICAgY2FzZSBFUlJPUl9PUEVSQVRJT05fQUJPUlRFRDoKKyAgICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIE5UICovCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4oLTIpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogT1MyICovCisKKy8qICBOIEUgVCBUIEMgSCBLICAtLSAgQ2hlY2sgaWYgbmV0d29yayB1cCwgYW5kIGhvdyBtYW55IGJ5dGVzIGNhbiBiZSByZWFkICovCisvKgorICBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3YWl0aW5nLCBvciAtMSBpZiBjb25uZWN0aW9uIGhhcyBiZWVuIGRyb3BwZWQuCisqLworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGhvdyBtYW55IGJ5dGVzIGFyZSByZWFkeSAqLworbmV0dGNoaygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciByZWFkaW5nIGZyb20gbmV0d29yayAqLworI2lmZGVmIFRDUElQTElCCisgICAgbG9uZyBjb3VudCA9IDA7CisgICAgaW50IHggPSAwLCB6OworICAgIGxvbmcgeTsKKyAgICBjaGFyIGM7CisgICAgaW50IHJjOworI2lmZGVmIE5UCisgICAgZXh0ZXJuIGludCBpb25vYmxvY2s7ICAgICAgICAgICAgICAgLyogRm9yIE92ZXJsYXBwZWQgSS9PICovCisjZW5kaWYgLyogTlQgKi8KKworICAgIGRlYnVnKEYxMDEsIm5ldHRjaGsgZW50cnkgdHRpYm4iLCIiLHR0aWJuKTsKKyAgICBkZWJ1ZyhGMTAxLCJuZXR0Y2hrIGVudHJ5IHR0aWJwIiwiIix0dGlicCk7CisKKyNpZmRlZiBORVRMRUJVRgorICAgIHsKKyAgICAgICAgaW50IG4gPSAwOworICAgICAgICBpZiAodHRwdXNoID49IDApCisgICAgICAgICAgbisrOworICAgICAgICBuICs9IGxlX2luYnVmKCk7CisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICByZXR1cm4obik7CisgICAgfQorI2VuZGlmIC8qIE5FVExFQlVGICovCisKKyNpZm5kZWYgT1MyCisjaWZuZGVmIEJFQk9YCisgICAgc29ja2V0X2Vycm5vID0gMDsgLyogVGhpcyBpcyBhIGZ1bmN0aW9uIGNhbGwgaW4gTlQsIGFuZCBCZU9TICovCisjZW5kaWYgLyogQkVCT1ggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIGlmICh0dHlmZCA9PSAtMSkgeworICAgICAgICBkZWJ1ZyhGMTAwLCJuZXR0Y2hrIHNvY2tldCBpcyBjbG9zZWQiLCIiLDApOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKy8qCisgIE5vdGU6IHRoaXMgc29ja2V0X2lvY3RsKCkgY2FsbCBkb2VzIE5PVCByZXR1cm4gYW4gZXJyb3IgaWYgdGhlCisgIGNvbm5lY3Rpb24gaGFzIGJlZW4gYnJva2VuLiAgKEF0IGxlYXN0IG5vdCBpbiBNdWx0aU5ldC4pCisqLworI2lmZGVmIENPTU1FTlQKKy8qICBBbm90aGVyIHRyaWNrIHRoYXQgY2FuIGJlIHRyaWVkIGhlcmUgaXMgc29tZXRoaW5nIGxpa2UgdGhpczogKi8KKworICAgIGlmICh0dG5ldCA9PSBORVRfVENQQikgeworICAgICAgICBjaGFyIGR1bW15OworICAgICAgICB4ID0gcmVhZCh0dHlmZCwmZHVtbXksMCk7ICAgICAgIC8qIFRyeSB0byByZWFkIG5vdGhpbmcgKi8KKyAgICAgICAgaWYgKHggPCAwKSB7ICAgICAgICAgICAgICAgICAgICAvKiAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIiAqLworICAgICAgICAgICAgcGVycm9yKCJUQ1AvSVAiKTsgICAgICAgICAgIC8qIG9yIHNvbWVzdWNoLi4uICovCisgICAgICAgICAgICB0dGNsb3MoMCk7ICAgICAgICAgICAgICAgICAgLyogQ2xvc2Ugb3VyIGVuZCB0b28uICovCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKHNzbF9hY3RpdmVfZmxhZykgeworI2lmbmRlZiBJS1NET05MWQorI2lmZGVmIE9TMgorICAgICAgICBpZiAoIElzQ29ubmVjdE1vZGUoKSApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldHRjaGsgKHNzbF9hY3RpdmVfZmxhZykgcmV0dXJucyIsIiIsY291bnQpOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogSUtTRE9OTFkgKi8KKyAgICAgICAgY291bnQgPSBTU0xfcGVuZGluZyhzc2xfY29uKTsKKyAgICAgICAgaWYgKGNvdW50IDwgMCkgeworICAgICAgICAgICAgZGVidWcoRjExMSwibmV0dGNoayIsIlNTTF9wZW5kaW5nIGVycm9yIixjb3VudCk7CisgICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgICAgIGlmICggY291bnQgPiAwICkKKyAgICAgICAgICAgIHJldHVybihjb3VudCk7ICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgcGVyZm9ybSBhIHJlYWQgKi8KKyAgICB9IGVsc2UgaWYgKHRsc19hY3RpdmVfZmxhZykgeworI2lmbmRlZiBJS1NET05MWQorI2lmZGVmIE9TMgorICAgICAgICBpZiAoIElzQ29ubmVjdE1vZGUoKSApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldHRjaGsgKHRsc19hY3RpdmVfZmxhZykgcmV0dXJucyIsIiIsY291bnQpOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogSUtTRE9OTFkgKi8KKyAgICAgICAgY291bnQgPSBTU0xfcGVuZGluZyh0bHNfY29uKTsKKyAgICAgICAgaWYgKGNvdW50IDwgMCkgeworICAgICAgICAgICAgZGVidWcoRjExMSwibmV0dGNoayIsIlRMU19wZW5kaW5nIGVycm9yIixjb3VudCk7CisgICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgICAgIGlmICggY291bnQgPiAwICkKKyAgICAgICAgICAgIHJldHVybihjb3VudCk7ICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgcGVyZm9ybSBhIHJlYWQgKi8KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIGlmIChzb2NrZXRfaW9jdGwodHR5ZmQsRklPTlJFQUQsCisjaWZkZWYgQ09NTUVOVAorICAgIC8qIE5vdyB3ZSd2ZSBjaGFuZ2VkIHRoZSBpb2N0bCguLiwuLix4KSBwcm90b3R5cGUgZm9yIERFQ0MgdG8gKHZvaWQgKikgKi8KKyNpZmRlZiBfX0RFQ0MKKyAgICAvKiBOT1RFOiAiJmNvdW50IiBtaWdodCBuZWVkIHRvIGJlICIoY2hhciAqKSZjb3VudCIgaW4gc29tZSBzZXR0aW5ncy4gKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIENhc3QgbmVlZGVkIGZvciBERUNDIDQuMSAmIGxhdGVyPyAqLworICAgICAgICAgICAgICAgICAgICAgLyogTWF5YmUsIGJ1dCBfX0RFQ0NfVkVSIG9ubHkgZXhpc3RzIGluIDUuMCBhbmQgbGF0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgIChjaGFyICopCisjZW5kaWYgLyogX19ERUNDICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgICAgJmNvdW50CisgICAgICAgICAgICAgICAgICAgICApIDwgMCkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJuZXR0Y2hrIHNvY2tldF9pb2N0bCBlcnJvciIsIiIsc29ja2V0X2Vycm5vKTsKKyAgICAgICAgLyogSWYgdGhlIGNvbm5lY3Rpb24gaXMgZ29uZSwgdGhlIGNvbm5lY3Rpb24gaXMgZ29uZS4gKi8KKyAgICAgICAgbmV0Y2xvcygpOworI2lmZGVmIE5UX1RDUF9PVkVSTEFQUEVECisgICAgICAgIC8qIElzIHRoZXJlIGFueXRoaW5nIGluIHRoZSBvdmVybGFwcGVkIEkvTyBidWZmZXJzPyAqLworICAgICAgICBjb3VudCArPSBPdmVybGFwcGVkRGF0YVdhaXRpbmcoKTsKKyNlbmRpZiAvKiBOVF9UQ1BfT1ZFUkxBUFBFRCAqLworICAgICAgICBjb3VudCArPSB0dGlibjsKKyAgICAgICAgcmV0dXJuKGNvdW50PjA/Y291bnQ6LTEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJuZXR0Y2hrIGNvdW50IiwiIixjb3VudCk7CisjaWZkZWYgTlRfVENQX09WRVJMQVBQRUQKKyAgICAvKiBJcyB0aGVyZSBhbnl0aGluZyBpbiB0aGUgb3ZlcmxhcHBlZCBJL08gYnVmZmVycz8gKi8KKyAgICBjb3VudCArPSBPdmVybGFwcGVkRGF0YVdhaXRpbmcoKTsKKyAgICBkZWJ1ZyhGMTAxLCJuZXR0Y2hrIGNvdW50IHcvb3ZlcmxhcHBlZCIsIiIsY291bnQpOworI2VuZGlmIC8qIE5UX1RDUF9PVkVSTEFQUEVEICovCisKKyNpZmRlZiBPUzIKKyNpZm5kZWYgSUtTRE9OTFkKKyAgICBpZiAoIElzQ29ubmVjdE1vZGUoKSApIHsKKyAgICAgICAgZGVidWcoRjEwMSwibmV0dGNoayAoRklPTlJFQUQpIHJldHVybnMiLCIiLGNvdW50KTsKKyAgICAgICAgcmV0dXJuKGNvdW50KTsKKyAgICB9CisjZW5kaWYgLyogSUtTRE9OTFkgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworLyogRm9yIHRoZSBzYWtlIG9mIGVmZmljaWVuY3ksIGlmIHRoZXJlIGlzIHN0aWxsIGRhdGEgaW4gdGhlIHR0aWJ1ZiAqLworLyogZG8gbm90IGdvIHRvIHRoZSBib3RoZXIgb2YgY2hlY2tpbmcgdG8gc2VlIG9mIHRoZSBjb25uZWN0aW9uIGlzICAqLworLyogc3RpbGwgdmFsaWQuICBUaGUgaGFuZGxlIGlzIHN0aWxsIGdvb2QsIHNvIGp1c3QgcmV0dXJuIHRoZSBjb3VudCAqLworLyogb2YgdGhlIGJ5dGVzIHRoYXQgd2UgYWxyZWFkeSBoYXZlIGxlZnQgdG8gcHJvY2Vzcy4gICAgICAgICAgICAgICAqLworI2lmZGVmIE9TMgorICAgIGlmICggY291bnQgPiAwIHx8IHR0aWJuID4gMCApIHsKKyAgICAgICAgY291bnQrPXR0aWJuOworICAgICAgICBkZWJ1ZyhGMTAxLCJuZXR0Y2hrIChjb3VudCt0dGlibiA+IDApIHJldHVybnMiLCIiLGNvdW50KTsKKyAgICAgICAgcmV0dXJuKGNvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXF1ZXN0VENQSVBNdXRleChTRU1fSU5ERUZJTklURV9XQUlUKTsKKyAgICAgICAgaWYgKCB0dGlibiA9PSAwICkKKyAgICAgICAgICAgIHR0aWJwID0gMDsgICAgICAvKiByZXNldCBmb3IgbmV4dCByZWFkICovCisgICAgfQorI2Vsc2UgLyogT1MyICovCisgICAgaWYgKCBjb3VudCA+IDAgfHwgdHRpYm4gPiAwICkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJuZXR0Y2hrIHJldHVybnMiLCIiLGNvdW50K3R0aWJuKTsKKyAgICAgICAgcmV0dXJuKGNvdW50K3R0aWJuKTsKKyAgICB9CisgICAgdHRpYm4gPSB0dGlicCA9IDA7CisjZW5kaWYgLyogT1MyICovCisKKy8qCisgIFRoZSBmb2xsb3dpbmcgY29kZSB3b3JrcyB3ZWxsIGluIG1vc3Qgc2V0dGluZ3MsIGJ1dCBtZXNzZXMgdGhpbmdzIHVwIGluCisgIG90aGVycywgaW5jbHVkaW5nIENNVS9UZWsgVENQL0lQIGFuZCBVQ1ggMi4wLCB3aGVyZSBpdCBzb21laG93IG1hbmFnZXMgdG8KKyAgbWFrZSBpdCBpbXBvc3NpYmxlIHRvIGV2ZXIgbWFrZSBhIG5ldyBjb25uZWN0aW9uIHRvIHRoZSBzYW1lIGhvc3QgYWdhaW4gd2l0aAorICBDT05ORUNULCBvbmNlIGl0IGhhcyBiZWVuIGxvZ2dlZCBvdXQgZnJvbSB0aGUgZmlyc3QgdGltZS4gIE5vdCBldmVuIGlmIHlvdQorICBIQU5HVVAgZmlyc3QsIG9yIFNFVCBIT1NUPENSPiwgb3IgU0VUIExJTkU8Q1I+LiAgUmVwb3J0ZWRseSwgaG93ZXZlciwgaXQKKyAgZG9lcyB3b3JrIE9LIGluIGxhdGVyIHJlbGVhc2VzIG9mIFVDWC4gIEJ1dCB0aGVyZSBpcyBubyB3YXkgd2UgY2FuCisgIGFjY29tbW9kYXRlIGJvdGggb2xkIGFuZCBuZXcgLS0gd2UgbWlnaHQgaGF2ZSBzdGF0aWMgbGlua2luZyBvciBkeW5hbWljCisgIGxpbmtpbmcsIGV0YyBldGMuICBJZiB3ZSBoYXZlIHN0YXRpYywgSSBvbmx5IGhhdmUgYWNjZXNzIHRvIDIuMCwgd2hlcmUgdGhpcworICBkb2Vzbid0IHdvcmssIGV0YyBldGMgYmxhaCBibGFoLgorCisgIEluIHRoZSBmb2xsb3dpbmcgbGluZXMsIHdlIGRlZmluZSBhIHN5bWJvbCBOT0NPVU5UIGZvciBidWlsZHMgd2hlcmUgd2Ugd2FudAorICB0byBvbWl0IHRoaXMgY29kZS4gIEJ5IGRlZmF1bHQsIGl0IGlzIG9taXR0ZWQgZm9yIENNVS9UZWsuICBZb3UgY2FuIGZvcmNlCisgIG9taXNzaW9uIG9mIGl0IGZvciBvdGhlciBjb21iaW5hdGlvbnMgYnkgZGVmaW5pbmcgTk9DT1VOVCBpbiBDRkxBR1MuICBZb3UKKyAgY2FuIGZvcmNlIGluY2x1c2lvbiBvZiB0aGlzIGNvZGUsIGV2ZW4gZm9yIENNVS9UZWssIGJ5IGluY2x1ZGluZyBOT05PQ09VTlQKKyAgaW4gQ0ZMQUdTLgorKi8KKyNpZmRlZiBOT05PQ09VTlQKKyNpZmRlZiBOT0NPVU5UCisjdW5kZWYgTk9DT1VOVAorI2VuZGlmIC8qIE5PQ09VTlQgKi8KKyNlbHNlCisjaWZuZGVmIE5PQ09VTlQKKyNpZmRlZiBDTVVfVENQSVAKKyNkZWZpbmUgTk9DT1VOVAorI2VuZGlmIC8qIENNVV9UQ1BJUCAqLworI2VuZGlmIC8qIE5PQ09VTlQgKi8KKyNlbmRpZiAvKiBOT05PQ09VTlQgKi8KKworCisgICAgLyogRnJvbSB0aGlzIHBvaW50IGZvcndhcmQgd2UgaGF2ZSBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGluIEs5NQorICAgICAqIGR1ZSB0byBpdHMgdXNlIG9mIG11bHRpcGxlIHRocmVhZHMuICBUaGVyZWZvcmUsIHdlIG11c3QgZW5zdXJlCisgICAgICogdGhhdCBvbmx5IG9uZSB0aHJlYWQgYXR0ZW1wdCB0byByZWFkL3dyaXRlIGZyb20gdGhlIHNvY2tldCBhdCBhCisgICAgICogdGltZS4gIE90aGVyd2lzZSwgaXQgaXMgcG9zc2libGUgZm9yIGEgYnVmZmVyIHRvIGJlIG92ZXJ3cml0dGVuLgorICAgICAqLworICAgIC8qIHdlIGtub3cgbm93IHRoYXQgY291bnQgPj0gMCBhbmQgdGhhdCB0dGlibiA9PSAwICovCisKKyAgICBpZiAoY291bnQgPT0gMAorI2lmZGVmIFJMT0dDT0RFCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAgICAgJiYgdHRucHJvdG8gIT0gTlBfRUs0TE9HSU4gJiYgdHRucHJvdG8gIT0gTlBfRUs1TE9HSU4KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2VuZGlmIC8qIFJMT0dDT0RFICovCisgICAgICAgICkgeworICAgICAgICBpbnQgc19lcnJubyA9IDA7CisjaWZuZGVmIE5PQ09VTlQKKy8qCisgIEhlcmUgd2UgbmVlZCB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSAwIGNvdW50IG9uIGFuIGFjdGl2ZQorICBjb25uZWN0aW9uLCBhbmQgYSAwIGNvdW50IGJlY2F1c2UgdGhlIHJlbW90ZSBlbmQgb2YgdGhlIHNvY2tldCBicm9rZSB0aGUKKyAgY29ubmVjdGlvbi4gIFRoZXJlIGlzIG5vIG1lY2hhbmlzbSBpbiBUR1YgTXVsdGlOZXQgKG9yIFdJTi9UQ1A/KSB0byBxdWVyeQorICB0aGUgc3RhdHVzIG9mIHRoZSBjb25uZWN0aW9uLCBzbyB3ZSBoYXZlIHRvIGRvIGEgcmVhZC4gIC0xIG1lYW5zIHRoZXJlIHdhcworICBubyBkYXRhIGF2YWlsYWJsZSAoc29ja2V0X2Vycm5vID09IEVXT1VMREJMT0NLKSwgMCBtZWFucyB0aGUgY29ubmVjdGlvbiBpcworICBkb3duLiAgQnV0IGlmLCBieSBjaGFuY2UsIHdlIGFjdHVhbGx5IGdldCBhIGNoYXJhY3Rlciwgd2UgaGF2ZSB0byBwdXQgaXQKKyAgd2hlcmUgaXQgd29uJ3QgYmUgbG9zdC4KKyovCisjaWZuZGVmIE5PTl9CTE9DS19JTworI2lmZGVmIE9TMgorI2lmZGVmIENLX1NTTAorICAgICAgICBSZXF1ZXN0U1NMTXV0ZXgoU0VNX0lOREVGSU5JVEVfV0FJVCk7CisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHkgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHVybiBvbiBub25ibG9ja2luZyByZWFkcyAqLworICAgICAgICB6ID0gc29ja2V0X2lvY3RsKHR0eWZkLEZJT05CSU8sJnkpOworICAgICAgICBkZWJ1ZyhGMTExLCJuZXR0Y2hrIEZJT05CSU8iLCJvbiIseik7CisjaWZkZWYgT1MyCisjaWZkZWYgQ0tfU1NMCisgICAgICAgIFJlbGVhc2VTU0xNdXRleCgpOworI2VuZGlmIC8qIENLX1NTTCAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTl9CTE9DS19JTyAqLworI2lmZGVmIE5UX1RDUF9PVkVSTEFQUEVECisgICAgICAgIGlvbm9ibG9jayA9IDE7ICAgICAgICAgICAgICAgICAgLyogRm9yIE92ZXJsYXBwZWQgSS9PICovCisjZW5kaWYgLyogTlRfVENQX09WRVJMQVBQRUQgKi8KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgaWYgKCBzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnICkgeworI2lmZGVmIE9TMgorCSAgc3NsX3JlYWQ6CisgICAgICAgICAgICB4ID0gU1NMX3JlYWQoIHNzbF9hY3RpdmVfZmxhZz9zc2xfY29uOnRsc19jb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0dGlidWZbdHRpYnArdHRpYm5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUVElCVUZMLXR0aWJwLXR0aWJuICk7CisgICAgICAgICAgICBzd2l0Y2ggKFNTTF9nZXRfZXJyb3Ioc3NsX2FjdGl2ZV9mbGFnP3NzbF9jb246dGxzX2Nvbix4KSkgeworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfTk9ORToKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJuZXR0Y2hrIFNTTF9FUlJPUl9OT05FIiwieCIseCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsIm5ldHRjaGsgU1NMX0VSUk9SX1dBTlRfV1JJVEUiLCIiLDApOworICAgICAgICAgICAgICAgIHggPSAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJuZXR0Y2hrIFNTTF9FUlJPUl9XQU5UX1JFQUQiLCIiLDApOworICAgICAgICAgICAgICAgIHggPSAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICAgICAgaWYgKCB4ID09IDAgKSB7IC8qIEVPRiAqLworICAgICAgICAgICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV0dGNoa19yZXR1cm47CisgICAgICAgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgTlQKKyAgICAgICAgICAgICAgICAgIGludCBnbGUgPSBHZXRMYXN0RXJyb3IoKTsKKyNlbmRpZiAvKiBOVCAqLworI2lmbmRlZiBOT05fQkxPQ0tfSU8KKyNpZmRlZiBPUzIKKyNpZmRlZiBDS19TU0wKKwkJICBSZXF1ZXN0U1NMTXV0ZXgoU0VNX0lOREVGSU5JVEVfV0FJVCk7CisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogT1MyICovCisJCSAgeSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUdXJuIG9mZiBub25ibG9ja2luZyByZWFkcyAqLworCQkgIHogPSBzb2NrZXRfaW9jdGwodHR5ZmQsRklPTkJJTywmeSk7CisJCSAgZGVidWcoRjExMSwibmV0dGNoayBGSU9OQklPIiwib2ZmIix6KTsKKyNpZmRlZiBPUzIKKyNpZmRlZiBDS19TU0wKKwkJICBSZWxlYXNlU1NMTXV0ZXgoKTsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT05fQkxPQ0tfSU8gKi8KKyNpZmRlZiBOVF9UQ1BfT1ZFUkxBUFBFRAorCQkgIGlvbm9ibG9jayA9IDA7ICAgICAgICAgICAgICAgICAgLyogRm9yIE92ZXJsYXBwZWQgSS9PICovCisjZW5kaWYgLyogTlRfVENQX09WRVJMQVBQRUQgKi8KKyNpZmRlZiBOVAorICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwibmV0dGNoayBTU0xfRVJST1JfU1lTQ0FMTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkdldExhc3RFcnJvcigpIixnbGUpOworICAgICAgICAgICAgICAgICAgcmMgPSBvczJzb2NrZXRlcnJvcihnbGUpOworICAgICAgICAgICAgICAgICAgaWYgKHJjID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgIHJjID0gLTI7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcmMgPT0gLTIgKQorICAgICAgICAgICAgICAgICAgICAgIHJjID0gLTE7CisJCSAgZ290byBuZXR0Y2hrX3JldHVybjsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQOgorICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsIm5ldHRjaGsgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVAiLCIiLDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1NMOgorICAgICAgICAgICAgICAgIGlmIChiaW9fZXJyIT1OVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgICAgIGV4dGVybiBjaGFyIHNzbF9lcnJbXTsKKyAgICAgICAgICAgICAgICAgICAgQklPX3ByaW50ZihiaW9fZXJyLCJuZXR0Y2hrKCkgU1NMX0VSUk9SX1NTTFxuIik7CisgICAgICAgICAgICAgICAgICAgIEVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IEJJT19yZWFkKGJpb19lcnIsc3NsX2VycixTU0xfRVJSX0JGU1opOworICAgICAgICAgICAgICAgICAgICBzc2xfZXJyW2xlbiA8IFNTTF9FUlJfQkZTWiA/IGxlbiA6IFNTTF9FUlJfQkZTWl0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJuZXR0Y2hrIFNTTF9FUlJPUl9TU0wiLHNzbF9lcnIsMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zihzc2xfZXJyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNzbF9kZWJ1Z19mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsIm5ldHRjaGsgU1NMX0VSUk9SX1NTTCIsIiIsMCk7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwibmV0dGNoaygpIFNTTF9FUlJPUl9TU0xcbiIpOworICAgICAgICAgICAgICAgICAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKwkJZ290byBuZXR0Y2hrX3JldHVybjsKKyNlbHNlCisgICAgICAgICAgICAgICAgeCA9IC0xOworCQlicmVhazsKKyNlbmRpZgorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1pFUk9fUkVUVVJOOgorICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsIm5ldHRjaGsgU1NMX0VSUk9SX1pFUk9fUkVUVVJOIiwiIiwwKTsKKyAgICAgICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIG5ldHRjaGtfcmV0dXJuOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJuZXR0Y2hrIFNTTF9FUlJPUl8/Pz8/PyIsIiIsMCk7CisgICAgICAgICAgICAgICAgbmV0Y2xvcygpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBuZXR0Y2hrX3JldHVybjsKKyAgICAgICAgICAgIH0KKyNlbHNlIC8qIE9TMiAqLworCSAgICAvKiBEbyBub3QgYmxvY2sgKi8KKwkgICAgeCA9IC0xOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgeworI2lmZGVmIE9TMgorICAgICAgICB4ID0gc29ja2V0X3JlYWQodHR5ZmQsJnR0aWJ1Zlt0dGlicCt0dGlibl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgVFRJQlVGTC10dGlicC10dGlibik7ICAvKiBSZXR1cm5zIC0xIGlmIG5vIGRhdGEgKi8KKyNlbHNlIC8qIE9TMiAqLworICAgICAgICB4ID0gc29ja2V0X3JlYWQodHR5ZmQsJmMsMSk7ICAgIC8qIFJldHVybnMgLTEgaWYgbm8gZGF0YSAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICB9CisgICAgICAgIHNfZXJybm8gPSBzb2NrZXRfZXJybm87ICAgICAgICAgLyogc29ja2V0X2Vycm5vIG1heSBiZSBhIGZ1bmN0aW9uICovCisgICAgICAgIGRlYnVnKEYxMDEsIm5ldHRjaGsgc29ja2V0X3JlYWQiLCIiLHgpOworCisjaWZuZGVmIE5PTl9CTE9DS19JTworI2lmZGVmIE9TMgorI2lmZGVmIENLX1NTTAorICAgICAgICBSZXF1ZXN0U1NMTXV0ZXgoU0VNX0lOREVGSU5JVEVfV0FJVCk7CisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHVybiBvZmYgbm9uYmxvY2tpbmcgcmVhZHMgKi8KKyAgICAgICAgeiA9IHNvY2tldF9pb2N0bCh0dHlmZCxGSU9OQklPLCZ5KTsKKyAgICAgICAgZGVidWcoRjExMSwibmV0dGNoayBGSU9OQklPIiwib2ZmIix6KTsKKyNpZmRlZiBPUzIKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgUmVsZWFzZVNTTE11dGV4KCk7CisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9OX0JMT0NLX0lPICovCisjaWZkZWYgTlRfVENQX09WRVJMQVBQRUQKKyAgICAgICAgaW9ub2Jsb2NrID0gMDsgICAgICAgICAgICAgICAgICAvKiBGb3IgT3ZlcmxhcHBlZCBJL08gKi8KKyNlbmRpZiAvKiBOVF9UQ1BfT1ZFUkxBUFBFRCAqLworCisgICAgICAgIGlmICh4ID09IC0xKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXR0Y2hrIHNvY2tldF9yZWFkIGVycm5vIiwiIixzX2Vycm5vKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGlmIChvczJzb2NrZXRlcnJvcihzX2Vycm5vKSA8IDApIHsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gbmV0dGNoa19yZXR1cm47CisgICAgICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIH0gZWxzZSBpZiAoeCA9PSAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJuZXR0Y2hrIGNvbm5lY3Rpb24gY2xvc2VkIiwiIiwwKTsKKyAgICAgICAgICAgIG5ldGNsb3MoKTsgICAgICAgICAgICAgICAgICAvKiAqKiogKioqICovCisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgZ290byBuZXR0Y2hrX3JldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoeCA+PSAxKSB7ICAgICAgICAgICAgICAgICAgIC8qIE9vcHMsIGFjdHVhbGx5IGdvdCBhIGJ5dGU/ICovCisjaWZkZWYgT1MyCisgICAgICAgICAgICAvKiBJbiBPUy8yIHdlIHJlYWQgZGlyZWN0bHkgaW50byB0dGlidWZbXSAqLworICAgICAgICAgICAgaGV4ZHVtcCgibmV0dGNoayBnb3QgcmVhbCBkYXRhIiwmdHRpYnVmW3R0aWJwK3R0aWJuXSx4KTsKKyAgICAgICAgICAgIHR0aWJuICs9IHg7CisjZWxzZSAvKiBPUzIgKi8KKyNpZmRlZiBDS19TU0wKKwkgICAgaWYgKCBzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnICkgeworCQloZXhkdW1wKCJuZXR0Y2hrIGdvdCByZWFsIGRhdGEiLCZ0dGlidWZbdHRpYnArdHRpYm5dLHgpOworCQl0dGlibiArPSB4OworCSAgICB9IGVsc2UgCisjZW5kaWYgLyogQ0tfU1NMICovCisJICAgIHsKKwkJZGVidWcoRjEwMSwibmV0dGNoayBzb2NrZXRfcmVhZCBjaGFyIiwiIixjKTsKKwkJZGVidWcoRjEwMSwibmV0dGNoayB0dGlicCIsIiIsdHRpYnApOworCQlkZWJ1ZyhGMTAxLCJuZXR0Y2hrIHR0aWJuIiwiIix0dGlibik7CisvKgorICBJbiB0aGUgY2FzZSBvZiBPdmVybGFwcGVkIEkvTyB0aGUgY2hhcmFjdGVyIHdvdWxkIGhhdmUgY29tZSBmcm9tCisgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciwgc28gcHV0IGl0IGJhY2suCisqLworCQlpZiAodHRpYnAgPiAwKSB7CisJCSAgICB0dGlicC0tOworCQkgICAgdHRpYnVmW3R0aWJwXSA9IGM7CisJCSAgICB0dGlibisrOworCQl9IGVsc2UgeworCQkgICAgdHRpYnVmW3R0aWJwK3R0aWJuXSA9IGM7CisJCSAgICB0dGlibisrOworCQl9CisJICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgfQorI2Vsc2UgLyogTk9DT1VOVCAqLworICAgICAgICBpZiAodHRuZXQgPT0gTkVUX1RDUEIpIHsKKyAgICAgICAgICAgIGNoYXIgZHVtbXk7CisgICAgICAgICAgICB4ID0gcmVhZCh0dHlmZCwmZHVtbXksMCk7ICAgLyogVHJ5IHRvIHJlYWQgbm90aGluZyAqLworICAgICAgICAgICAgaWYgKHggPCAwKSB7ICAgICAgICAgICAgICAgIC8qICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiICovCisgICAgICAgICAgICAgICAgcGVycm9yKCJUQ1AvSVAiKTsgICAgICAgLyogb3Igc29tZXN1Y2guLi4gKi8KKyAgICAgICAgICAgICAgICB0dGNsb3MoMCk7ICAgICAgICAgICAgICAvKiBDbG9zZSBvdXIgZW5kIHRvby4gKi8KKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gbmV0dGNoa19yZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBOT0NPVU5UICovCisgICAgfQorI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgS1JCNAorI2lmZGVmIFJMT0dDT0RFCisgICAgaWYgKHR0bnByb3RvID09IE5QX0VLNExPR0lOKQorICAgICAgY291bnQgKz0ga3JiNF9kZXNfYXZhaWwodHR5ZmQpOworI2VuZGlmIC8qIFJMT0dDT0RFICovCisjZW5kaWYgLyogS1JCNCAqLworI2lmZGVmIEtSQjUKKyNpZmRlZiBSTE9HQ09ERQorICAgIGlmICh0dG5wcm90byA9PSBOUF9FSzVMT0dJTikKKyAgICAgIGNvdW50ICs9IGtyYjVfZGVzX2F2YWlsKHR0eWZkKTsKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2lmZGVmIEtSQjVfVTJVCisgICAgaWYgKHR0bnByb3RvID09IE5QX0s1VTJVKQorICAgICAgY291bnQgKz0ga3JiNV91MnVfYXZhaWwodHR5ZmQpOworI2VuZGlmIC8qIEtSQjVfVTJVICovCisjZW5kaWYgLyogS1JCNSAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKyAgICBkZWJ1ZyhGMTAxLCJuZXR0Y2hrIHJldHVybnMiLCIiLGNvdW50K3R0aWJuKTsKKyAgICByYyA9IGNvdW50ICsgdHRpYm47CisKKyAgbmV0dGNoa19yZXR1cm46CisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICByZXR1cm4ocmMpOworCisjZWxzZSAvKiBOb3QgVENQSVBMSUIgKi8KKy8qCisgIFVOSVgganVzdCB1c2VzIHR0Y2hrKCksIGluIHdoaWNoIHRoZSBpb2N0bCgpIGNhbGxzIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAgc2VlbSB0byB3b3JrIE9LLgorKi8KKyAgICByZXR1cm4odHRjaGsoKSk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKy8qCisgIEJ1dCB3aGF0IGFib3V0IFguMjU/CisqLworfQorCisjaWZuZGVmIE9TMgorVk9JRAorbmV0dG91dChpKSBpbnQgaTsgeyAgICAgICAgICAgICAgICAgICAgIC8qIENhdGNoIHRoZSBhbGFybSBpbnRlcnJ1cHRzICovCisgICAgZGVidWcoRjEwMCwibmV0dG91dCBjYXVnaHQgdGltZW91dCIsIiIsMCk7CisgICAgdHRpbW9mZigpOworICAgIGNrbG9uZ2ptcChuamJ1ZiwgLTEpOworfQorI2VuZGlmIC8qICFPUzIgKi8KKworI2lmZGVmIFRDUElQTElCCisKK1ZPSUQKKyNpZmRlZiBDS19BTlNJQworZG9uZXRpbmModm9pZCAqIHRocmVhZGluZm8pCisjZWxzZSAvKiBDS19BTlNJQyAqLworZG9uZXRpbmModGhyZWFkaW5mbykgVk9JRCAqIHRocmVhZGluZm87CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGRvbmV0aW5jICovIHsKKyNpZmRlZiBOVFNJRworICAgIGV4dGVybiBpbnQgVGxzSW5kZXg7CisgICAgc2V0aW50KCk7CisgICAgaWYgKHRocmVhZGluZm8pIHsgICAgICAgICAgICAgICAgICAgLyogVGhyZWFkIGxvY2FsIHN0b3JhZ2UuLi4gKi8KKyAgICAgICAgVGxzU2V0VmFsdWUoVGxzSW5kZXgsdGhyZWFkaW5mbyk7CisgICAgfQorI2VuZGlmIC8qIE5UU0lHICovCisjaWZkZWYgQ0tfTE9HSU4KKyNpZmRlZiBOVAorI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpCisgICAgICBzZXRudGNyZWRzKCk7CisjZW5kaWYgLyogSUtTRCAqLworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAodHRidWZyKCkgPCAwKSAgICAgICAgICAgICAgIC8qIEtlZXAgdHJ5aW5nIHRvIHJlZmlsbCBpdC4gKi8KKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaWxsIHdlIGdldCBhbiBlcnJvci4gKi8KKyAgICAgICAgaWYgKHR0aWJuID4gMCkgICAgICAgICAgICAgICAgICAvKiBPciB3ZSBnZXQgYSBjaGFyYWN0ZXIuICovCisgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorI2VuZGlmIC8qIFRDUElQTElCICovCisKK1ZPSUQKKyNpZmRlZiBDS19BTlNJQworZmFpbG5ldGluYyh2b2lkICogdGhyZWFkaW5mbykKKyNlbHNlIC8qIENLX0FOU0lDICovCitmYWlsbmV0aW5jKHRocmVhZGluZm8pIFZPSUQgKiB0aHJlYWRpbmZvOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBmYWlsbmV0aW5jICovIHsKKyAgICA7IC8qIE5vdGhpbmcgdG8gZG8gb24gYW4gZXJyb3IgKi8KK30KKworLyogTiBFIFQgWCBJIE4gLS0gSW5wdXQgYmxvY2sgb2YgY2hhcmFjdGVycyBmcm9tIG5ldHdvcmsgKi8KKworaW50CituZXR4aW4obixidWYpIGludCBuOyBDSEFSICogYnVmOyB7CisgICAgaW50IGxlbiwgaSwgajsKKyNpZmRlZiBUQ1BJUExJQgorICAgIGludCByYzsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworCisgICAgaWYgKHR0eWZkID09IC0xKSB7CisgICAgICAgIGRlYnVnKEYxMDAsIm5ldHhpbiBzb2NrZXQgaXMgY2xvc2VkIiwiIiwwKTsKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9CisjaWZkZWYgQ0tfS0VSQkVST1MKKyNpZmRlZiBLUkI0CisjaWZkZWYgUkxPR0NPREUKKyAgICBpZiAodHRucHJvdG8gPT0gTlBfRUs0TE9HSU4pIHsKKyAgICAgICAgaWYgKChsZW4gPSBrcmI0X2Rlc19yZWFkKHR0eWZkLGJ1ZixuKSkgPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4obGVuKTsKKyAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNlbmRpZiAvKiBLUkI0ICovCisjaWZkZWYgS1JCNQorI2lmZGVmIFJMT0dDT0RFCisgICAgaWYgKHR0bnByb3RvID09IE5QX0VLNUxPR0lOKSB7CisgICAgICAgIGlmICgobGVuID0ga3JiNV9kZXNfcmVhZCh0dHlmZCxidWYsbiwwKSkgPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4obGVuKTsKKyAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBLUkI1X1UyVQorICAgIGlmICh0dG5wcm90byA9PSBOUF9LNVUyVSkgeworICAgICAgICBpZiAoKGxlbiA9IGtyYjVfdTJ1X3JlYWQodHR5ZmQsYnVmLG4pKSA8IDApCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybihsZW4pOworICAgIH0KKyNlbmRpZiAvKiBLUkI1X1UyVSAqLworI2VuZGlmIC8qIEtSQjUgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCisjaWZkZWYgVENQSVBMSUIKKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VENQSVBNdXRleChTRU1fSU5ERUZJTklURV9XQUlUKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpZiAodHRpYm4gPT0gMCkKKyAgICAgIGlmICgocmMgPSB0dGJ1ZnIoKSkgPD0gMCkgeworI2lmZGVmIE9TMgorICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICByZXR1cm4ocmMpOworICAgICAgfQorCisgICAgaWYgKHR0aWJuIDw9IG4pIHsKKyAgICAgICAgbGVuID0gdHRpYm47CisgICAgICAgIG1lbWNweShidWYsJnR0aWJ1Zlt0dGlicF0sbGVuKTsgICAgICAgICAvKiBzYWZlICovCisgICAgICAgIHR0aWJwICs9IGxlbjsKKyAgICAgICAgdHRpYm4gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShidWYsJnR0aWJ1Zlt0dGlicF0sbik7ICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgIHR0aWJwICs9IG47CisgICAgICAgIHR0aWJuIC09IG47CisgICAgICAgIGxlbiA9IG47CisgICAgfQorI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisjZWxzZSAvKiBUQ1BJUExJQiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKChqID0gbmV0aW5jKDApKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChqIDwgLTEpCisgICAgICAgICAgICAgIHJldHVybihqKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmW2ldID0gajsKKyAgICB9CisgICAgbGVuID0gaTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAvKiBUaGlzIHdvdWxkIGJlIGdyZWF0IGlmIGl0IHdvcmtlZC4gIEJ1dCB3aGF0IGlmIHRoZSBidWZmZXIgd2UgcmVhZCAgKi8KKyAgICAvKiBjb250YWlucyBhIHRlbG5ldCBuZWdvdGlhdGlvbiB0aGF0IGNoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSAgICAgICAgKi8KKyAgICAvKiBlbmNyeXB0aW9uLiAgSWYgc28sIHdlIHdvdWxkIGJlIGVpdGhlciBkZWNyeXB0aW5nIHVuZW5jcnlwdGVkIHRleHQgKi8KKyAgICAvKiBvciBub3QgZGVjcnlwdGluZyBlbmNyeXB0ZWQgdGV4dC4gIFNvIHdlIG11c3QgbW92ZSB0aGlzIGNhbGwgdG8gICAgKi8KKyAgICAvKiBhbGwgZnVuY3Rpb25zIHRoYXQgY2FsbCB0dHhpbigpLiAgSW4gT1MyIHRoYXQgbWVhbnMgb3MyX25ldHhpbigpICAgKi8KKyAgICAvKiB3aGVyZSB0aGUgVGVsbmV0IE5lZ290aWF0aW9ucyBhcmUgaGFuZGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAodV9lbmNyeXB0KQorICAgICAgY2tfdG5fZGVjcnlwdChidWYsbGVuKTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgcmV0dXJuKGxlbik7Cit9CisKKy8qICBOIEUgVCBJIE4gQyAtLSAgSW5wdXQgY2hhcmFjdGVyIGZyb20gbmV0d29yayAqLworCisjaWZkZWYgTkVUTEVCVUYKKyNkZWZpbmUgTEVCVUYKKyNlbmRpZiAvKiBORVRMRUJVRiAqLworI2lmZGVmIFRUTEVCVUYKKyNkZWZpbmUgTEVCVUYKKyNlbmRpZiAvKiBUVExFQlVGICovCisjaWZuZGVmIExFQlVGCisjaWZkZWYgT1MyCisjZGVmaW5lIExFQlVGCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTEVCVUYgKi8KKworaW50CituZXRpbmModGltbykgaW50IHRpbW87IHsKKyNpZmRlZiBUQ1BJUExJQgorICAgIGludCB4OyB1bnNpZ25lZCBjaGFyIGM7ICAgICAgICAgICAgIC8qIFRoZSBsb2NhbHMuICovCisKKyNpZmRlZiBORVRMRUJVRgorICAgIGlmICh0dHB1c2ggPj0gMCkgeworICAgICAgICBkZWJ1ZyhGMTExLCJuZXRpbmMiLCJ0dHB1c2giLHR0cHVzaCk7CisgICAgICAgIGMgPSB0dHB1c2g7CisgICAgICAgIHR0cHVzaCA9IC0xOworICAgICAgICByZXR1cm4oYyk7CisgICAgfQorICAgIGlmIChsZV9kYXRhKSB7CisgICAgICAgIGlmIChsZV9nZXRjaGFyKChDSEFSICopJmMpID4gMCkgeworICAgICAgICAgICAgZGVidWcoRjExMSwibmV0aW5jIGxlX2dldGNoYXIiLCJjIixjKTsKKyAgICAgICAgICAgIHJldHVybihjKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBORVRMRUJVRiAqLworCisgICAgaWYgKHR0eWZkID09IC0xKSB7CisgICAgICAgIGRlYnVnKEYxMDAsIm5ldGluYyBzb2NrZXQgaXMgY2xvc2VkIiwiIiwwKTsKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9CisKKyNpZmRlZiBDS19LRVJCRVJPUworI2lmZGVmIEtSQjQKKyNpZmRlZiBSTE9HQ09ERQorICAgIGlmICh0dG5wcm90byA9PSBOUF9FSzRMT0dJTikgeworICAgICAgICBpZiAoKHggPSBrcmI0X2Rlc19yZWFkKHR0eWZkLCZjLDEpKSA9PSAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGVsc2UgaWYgKHggPCAwKQorICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4oYyk7CisgICAgfQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisjZW5kaWYgLyogS1JCNCAqLworI2lmZGVmIEtSQjUKKyNpZmRlZiBSTE9HQ09ERQorICAgIGlmICh0dG5wcm90byA9PSBOUF9FSzVMT0dJTikgeworICAgICAgICBpZiAoKHggPSBrcmI1X2Rlc19yZWFkKHR0eWZkLCZjLDEsMCkpID09IDApCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgZWxzZSBpZiAoeCA8IDApCisgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybihjKTsKKyAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBLUkI1X1UyVQorICAgIGlmICh0dG5wcm90byA9PSBOUF9LNVUyVSkgeworICAgICAgICBpZiAoKHggPSBrcmI1X3UydV9yZWFkKHR0eWZkLCZjLDEpKSA9PSAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGVsc2UgaWYgKHggPCAwKQorICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4oYyk7CisgICAgfQorI2VuZGlmIC8qIEtSQjVfVTJVICovCisjZW5kaWYgLyogS1JCNSAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VENQSVBNdXRleChTRU1fSU5ERUZJTklURV9XQUlUKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpZiAodHRpYm4gPiAwKSB7ICAgICAgICAgICAgICAgICAgICAvKiBTb21ldGhpbmcgaW4gaW50ZXJuYWwgYnVmZmVyPyAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgZGVidWcoRjEwMCwibmV0aW5jIGNoYXIgaW4gYnVmIiwiIiwwKTsgLyogWWVzLiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzLiAqLworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVsc2UgbXVzdCByZWFkIGZyb20gbmV0d29yay4gKi8KKyAgICAgICAgeCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBc3N1bWUgZmFpbHVyZS4gKi8KKyNpZmRlZiBERUJVRworICAgICAgICBkZWJ1ZyhGMTAxLCJuZXRpbmMgZ29lcyB0byBuZXQsIHRpbW8iLCIiLHRpbW8pOworI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgQ0tfU1NMCisgICAgICAgIC8qCisgICAgICAgICAqIEluIHRoZSBjYXNlIG9mIE9wZW5TU0wsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlcmUgaXMgc3RpbGwKKyAgICAgICAgICogZGF0YSB3YWl0aW5nIGluIHRoZSBTU0wgc2Vzc2lvbiBidWZmZXJzIHRoYXQgaGFzIG5vdCB5ZXQKKyAgICAgICAgICogYmVlbiByZWFkIGJ5IEtlcm1pdC4gIElmIHRoaXMgaXMgdGhlIGNhc2Ugd2UgbXVzdCBwcm9jZXNzCisgICAgICAgICAqIGl0IHdpdGhvdXQgY2FsbGluZyBzZWxlY3QoKSBiZWNhdXNlIHNlbGVjdCgpIHdpbGwgbm90IHJldHVybgorICAgICAgICAgKiB3aXRoIGFuIGluZGljYXRpb24gdGhhdCB0aGVyZSBpcyBkYXRhIHRvIGJlIHJlYWQgZnJvbSB0aGUKKyAgICAgICAgICogc29ja2V0LiAgSWYgdGhlcmUgaXMgbm8gZGF0YSBwZW5kaW5nIGluIHRoZSBTU0wgc2Vzc2lvbgorICAgICAgICAgKiBidWZmZXJzIHRoZW4gZmFsbCB0aHJvdWdoIHRvIHRoZSBzZWxlY3QoKSBjb2RlIGFuZCB3YWl0IGZvcgorICAgICAgICAgKiBzb21lIGRhdGEgdG8gYXJyaXZlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNzbF9hY3RpdmVfZmxhZykgeworICAgICAgICAgICAgeCA9IFNTTF9wZW5kaW5nKHNzbF9jb24pOworICAgICAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwibmV0aW5jIiwiU1NMX3BlbmRpbmcgZXJyb3IiLHgpOworICAgICAgICAgICAgICAgIG5ldGNsb3MoKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCB4ID4gMCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHR0YnVmcigpID49IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSBuZXRpbmModGltbyk7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4ID0gLTE7CisgICAgICAgIH0gZWxzZSBpZiAodGxzX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgICAgICB4ID0gU1NMX3BlbmRpbmcodGxzX2Nvbik7CisgICAgICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJuZXRpbmMiLCJUTFNfcGVuZGluZyBlcnJvciIseCk7CisgICAgICAgICAgICAgICAgbmV0Y2xvcygpOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHggPiAwICkgeworICAgICAgICAgICAgICAgIGlmICggdHRidWZyKCkgPj0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IG5ldGluYyh0aW1vKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHggPSAtMTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworI2lmbmRlZiBMRUJVRgorICAgICAgICBpZiAodGltbyA9PSAwKSB7ICAgICAgICAgICAgICAgIC8qIFVudGltZWQgY2FzZS4gKi8KKyAgICAgICAgICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvcmV2ZXIgaWYgbmVjZXNzYXJ5LiAqLworICAgICAgICAgICAgICAgIGlmICh0dGJ1ZnIoKSA8IDApICAgICAgIC8qIFJlZmlsbCBidWZmZXIuICovCisgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgLyogRXJyb3IsIGZhaWwuICovCisgICAgICAgICAgICAgICAgaWYgKHR0aWJuID4gMCkgeyAgICAgICAgLyogU3VjY2Vzcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lZCBjYXNlLi4uICovCisjZW5kaWYgLyogTEVCVUYgKi8KKyAgICAgICAgICB7CisjaWZkZWYgTlRfVENQX09WRVJMQVBQRUQKKyAgICAgICAgICAgIC8qIFRoaXMgY29kZSBpcyBmb3IgdXNlIG9uIE5UIHdoZW4gd2UgYXJlIHVzaW5nICovCisgICAgICAgICAgICAvKiBPdmVybGFwcGVkIEkvTyB0byBoYW5kbGUgcmVhZHMuICBJbiB0aGUgY2FzZSAqLworICAgICAgICAgICAgLyogb2Ygb3V0c3RhbmRpbmcgcmVhZHMgc2VsZWN0KCkgZG9lc24ndCB3b3JrICAgKi8KKworICAgICAgICAgICAgaWYgKFdhaXRGb3JPdmVybGFwcGVkUmVhZERhdGEodGltbykpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHRidWZyKCkgPCAwKSAgIC8qIEtlZXAgdHJ5aW5nIHRvIHJlZmlsbCBpdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBUaWxsIHdlIGdldCBhbiBlcnJvci4gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHR0aWJuID4gMCkgeyAgICAvKiBPciB3ZSBnZXQgYSBjaGFyYWN0ZXIuICovCisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2Vsc2UgLyogTlRfVENQX09WRVJMQVBQRUQgKi8KKyNpZmRlZiBCU0RTRUxFQ1QKKyAgICAgICAgICAgIGZkX3NldCByZmRzOworICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgICAgICAgICBpbnQgdGltZW91dCA9IHRpbW8gPCAwID8gLXRpbW8gOiAxMDAwICogdGltbzsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldGluYyBCU0RTRUxFQ1QiLCIiLHRpbW8pOworCisgICAgICAgICAgICBmb3IgKCA7IHRpbWVvdXQgPj0gMDsgdGltZW91dCAtPSAodGltbyA/IDEwMCA6IDApKSB7CisgICAgICAgICAgICAgICAgaW50IHJjOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIm5ldGluYyIsInRpbWVvdXQiLHRpbWVvdXQpOworICAgICAgICAgICAgICAgIC8qIERvbid0IG1vdmUgc2VsZWN0KCkgaW5pdGlhbGl6YXRpb24gb3V0IG9mIHRoZSBsb29wLiAqLworICAgICAgICAgICAgICAgIEZEX1pFUk8oJnJmZHMpOworICAgICAgICAgICAgICAgIEZEX1NFVCh0dHlmZCwgJnJmZHMpOworICAgICAgICAgICAgICAgIHR2LnR2X3NlYyAgPSB0di50dl91c2VjID0gMEw7CisgICAgICAgICAgICAgICAgaWYgKHRpbW8pCisgICAgICAgICAgICAgICAgICB0di50dl91c2VjID0gKGxvbmcpIDEwMDAwMEw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgdHYudHZfc2VjID0gMzA7CisjaWZkZWYgTlQKKyAgICAgICAgICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAxOworI2VuZGlmIC8qIE5UICovCisgICAgICAgICAgICAgICAgcmMgPSBzZWxlY3QoRkRfU0VUU0laRSwKKyNpZm5kZWYgX19ERUNDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZkX3NldCAqKQorI2VuZGlmIC8qIF9fREVDQyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpOworICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNfZXJybm8gPSBzb2NrZXRfZXJybm87CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIm5ldGluYyIsInNlbGVjdCIscmMpOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJuZXRpbmMiLCJzb2NrZXRfZXJybm8iLHNfZXJybm8pOworICAgICAgICAgICAgICAgICAgICBpZiAoc19lcnJubykgeworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwibmV0aW5jIiwic2VsZWN0IixyYyk7CisjaWZkZWYgTlQKKyAgICAgICAgICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAwOworI2VuZGlmIC8qIE5UICovCisgICAgICAgICAgICAgICAgaWYgKCFGRF9JU1NFVCh0dHlmZCwgJnJmZHMpKSB7CisjaWZkZWYgTEVCVUYKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlX2luYnVmKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIExFQlVGICovCisgICAgICAgICAgICAgICAgICAgIC8qIElmIHdhaXRpbmcgZm9yZXZlciB3ZSBoYXZlIG5vIHdheSBvZiBrbm93aW5nIGlmIHRoZSAqLworICAgICAgICAgICAgICAgICAgICAvKiBzb2NrZXQgY2xvc2VkIHNvIHRyeSB3cml0aW5nIGEgMC1sZW5ndGggVENQIHBhY2tldCAgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogd2hpY2ggc2hvdWxkIGZvcmNlIGFuIGVycm9yIGlmIHRoZSBzb2NrZXQgaXMgY2xvc2VkICovCisgICAgICAgICAgICAgICAgICAgIGlmICghdGltbykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyYyA9IHNvY2tldF93cml0ZSh0dHlmZCwiIiwwKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNfZXJybm8gPSBzb2NrZXRfZXJybm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwibmV0aW5jIHNvY2tldF93cml0ZSBlcnJvciIsIiIsc19lcnJubyk7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9zMnNvY2tldGVycm9yKHNfZXJybm8pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsgLyogQ2FsbCBpdCBhbiBpL28gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR0YnVmcigpIDwgMCkgeyAvKiBLZWVwIHRyeWluZyB0byByZWZpbGwgaXQuICovCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogVGlsbCB3ZSBnZXQgYW4gZXJyb3IuICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHR0aWJuID4gMCkgeyAgICAvKiBPciB3ZSBnZXQgYSBjaGFyYWN0ZXIuICovCisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmZGVmIE5UCisgICAgICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAwOworI2VuZGlmIC8qIE5UICovCisjZWxzZSAvKiAhQlNEU0VMRUNUICovCisjaWZkZWYgSUJNU0VMRUNUCisvKgorICBXYXMgdXNlZCBieSBPUy8yLCBjdXJyZW50bHkgbm90IHVzZWQsIGJ1dCBtaWdodCBjb21lIGluIGhhbmR5IHNvbWUgZGF5Li4uCisgIC4uLiBhbmQgaXQgY2FtZSBpbiBoYW5keSEgIEZvciBvdXIgVENQL0lQIGxheWVyLCBpdCBhdm9pZHMgYWxsIHRoZSBmZF9zZXQKKyAgYW5kIHRpbWV2YWwgc3R1ZmYgc2luY2UgdGhpcyBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSBpdCBpcyB1c2VkLgorKi8KKyAgICAgICAgICAgIGludCBzb2NrZXQgPSB0dHlmZDsKKyAgICAgICAgICAgIGludCB0aW1lb3V0ID0gdGltbyA8IDAgPyAtdGltbyA6IDEwMDAgKiB0aW1vOworCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXRpbmMgSUJNU0VMRUNUIiwiIix0aW1vKTsKKyAgICAgICAgICAgIGZvciAoIDsgdGltZW91dCA+PSAwOyB0aW1lb3V0IC09ICh0aW1vID8gMTAwIDogMCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0KCZzb2NrZXQsIDEsIDAsIDAsIDEwMEwpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dGJ1ZnIoKSA8IDApIHsgLyogS2VlcCB0cnlpbmcgdG8gcmVmaWxsIGl0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAvKiBUaWxsIHdlIGdldCBhbiBlcnJvci4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dGlibiA+IDApIHsgLyogT3Igd2UgZ2V0IGEgY2hhcmFjdGVyLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBMRUJVRgorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxlX2luYnVmKCkgPiAwKSAgeworICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBMRUJVRiAqLworICAgICAgICAgICAgfQorI2Vsc2UgLyogIUlCTVNFTEVDVCAqLworI2lmZGVmIFdJTlNPQ0sKKyAgICAgICAvKiBBY3R1YWxseSwgdW5kZXIgV2luU29jayB3ZSBoYXZlIGEgYmV0dGVyIG1lY2hhbmlzbSB0aGFuIHNlbGVjdCgpICovCisgICAgICAgLyogZm9yIHNldHRpbmcgdGltZW91dHMgKFNPX1JDVlRJTUVPLCBTT19TTkRUSU1FTykgKi8KKyAgICAgICAgICAgIFNPQ0tFVCBzb2NrZXQgPSB0dHlmZDsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldGluYyBOVFNFTEVDVCIsIiIsdGltbyk7CisgICAgICAgICAgICBpZiAoc2V0c29ja29wdChzb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLCAoY2hhciAqKSZ0aW1vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0aW1vKSkgID09IE5PX0VSUk9SKQorICAgICAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgICAgICAgaWYgKHR0YnVmcigpIDwgMCkgICAgIC8qIEtlZXAgdHJ5aW5nIHRvIHJlZmlsbCBpdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAvKiBUaWxsIHdlIGdldCBhbiBlcnJvci4gKi8KKyAgICAgICAgICAgICAgICAgIGlmICh0dGlibiA+IDApIHsgICAgICAvKiBPciB3ZSBnZXQgYSBjaGFyYWN0ZXIuICovCisgICAgICAgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlIC8qIFdJTlNPQ0sgKi8KKy8qCisgIElmIHdlIGNhbid0IHVzZSBzZWxlY3QoKSwgdGhlbiB3ZSB1c2UgdGhlIHJlZ3VsYXIgYWxhcm0oKS9zaWduYWwoKQorICB0aW1lb3V0IG1lY2hhbmlzbS4KKyovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXRpbmMgYWxhcm0iLCIiLHRpbW8pOworICAgICAgICAgICAgeCA9IGFscm1fZXhlY3V0ZShja2phZGRyKG5qYnVmKSx0aW1vLG5ldHRvdXQsZG9uZXRpbmMsZmFpbG5ldGluYyk7CisgICAgICAgICAgICB0dGltb2ZmKCk7ICAgICAgICAgICAgICAgICAgLyogVGltZXIgb2ZmLiAqLworI2VuZGlmIC8qIFdJTlNPQ0sgKi8KKyNlbmRpZiAvKiBJQk1TRUxFQ1QgKi8KKyNlbmRpZiAvKiBCU0RTRUxFQ1QgKi8KKyNlbmRpZiAvKiBOVF9UQ1BfT1ZFUkxBUFBFRCAqLworICAgICAgICB9CisgICAgfQorCisjaWZkZWYgTEVCVUYKKyAgICBpZiAobGVfaW5idWYoKSA+IDApIHsgICAgICAgICAgICAgICAvKiBJZiBkYXRhIHdhcyBpbnNlcnRlZCBpbnRvIHRoZSAqLworICAgICAgICBpZiAobGVfZ2V0Y2hhcigoQ0hBUiAqKSZjKSA+IDApIHsvKiBMb2NhbCBFY2hvIGJ1ZmZlciB3aGlsZSB0aGUgICAqLworI2lmZGVmIE9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3YXMgdGFraW5nIHBsYWNlIGRvIG5vdCBtaXggICAqLworICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7ICAgICAgICAgICAvKiB0aGUgbGUgZGF0YSB3aXRoIHRoZSBuZXQgZGF0YSAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgIHJldHVybihjKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBMRUJVRiAqLworICAgIGlmICh4IDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiAtMSBpZiB3ZSBmYWlsZWQuICovCisgICAgICAgIGRlYnVnKEYxMDAsIm5ldGluYyB0aW1lZCBvdXQiLCIiLDApOworI2lmZGVmIE9TMgorICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICByZXR1cm4oLTEpOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSAqLworICAgICAgICBjID0gdHRpYnVmW3R0aWJwXTsgICAgICAgICAgICAgIC8qIFJldHVybiB0aGUgZmlyc3QgY2hhciBpbiB0dGlidWZbXSAqLworICAgICAgICBpZiAoZGVibG9nKSB7CisjaWZuZGVmIENPTU1FTlQKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldGluYyByZXR1cm5pbmciLCIiLGMpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIGlmIChjID09IDApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXRpbmMgMCB0dGlibiIsIiIsdHRpYm4pOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldGluYyAwIHR0aWJwIiwiIix0dGlicCk7CisjaWZkZWYgQkVUQURFQlVHCisgICAgICAgICAgICAgICAgeworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICBleHRlcm4gaW50IHR0X3R5cGVfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhSVNWVE5UKHR0X3R5cGVfbW9kZSkgKQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKCJuZXRpbmMgJnR0YnVmW3R0aWJwXSIsJnR0aWJ1Zlt0dGlicF0sdHRpYm4pOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBCRVRBREVCVUcgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0dGlicCsrOworICAgICAgICB0dGlibi0tOworI2lmZGVmIE9TMgorICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgaWYgKFRFTE9QVF9VKFRFTE9QVF9FTkNSWVBUSU9OKSkKKyAgICAgICAgICBja190bl9kZWNyeXB0KCZjLDEpOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgcmV0dXJuKGMpOworICAgIH0KKyNlbHNlIC8qIE5vdCB1c2luZyBUQ1BJUExJQiAqLworICAgIHJldHVybigtMSk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KK30KKworLyogIE4gRSBUIFQgTyBMICAtLSAgT3V0cHV0IGEgc3RyaW5nIG9mIGJ5dGVzIHRvIHRoZSBuZXR3b3JrICAqLworLyoKKyAgQ2FsbCB3aXRoIHMgPSBwb2ludGVyIHRvIHN0cmluZywgbiA9IGxlbmd0aC4KKyAgUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiBvbiBzdWNjZXNzLCBvcgorICAtMSBvbiBpL28gZXJyb3IsIC0yIGlmIGNhbGxlZCBpbXByb3Blcmx5LgorKi8KKworaW50CituZXR0b2wocyxuKSBDSEFSICpzOyBpbnQgbjsgeworI2lmZGVmIFRDUElQTElCCisgICAgaW50IGNvdW50ID0gMDsKKyAgICBpbnQgbGVuID0gbjsKKyAgICBpbnQgdHJ5ID0gMDsKKworICAgIGlmICh0dHlmZCA9PSAtMSkgeworICAgICAgICBkZWJ1ZyhGMTAwLCJuZXR0b2wgc29ja2V0IGlzIGNsb3NlZCIsIiIsMCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZGVidWcoRjEwMSwibmV0dG9sIFRDUElQTElCIHR0bmV0IiwiIix0dG5ldCk7CisjaWZkZWYgQ09NTUVOVAorICAgIGhleGR1bXAoIm5ldHRvbCIscyxuKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBDS19LRVJCRVJPUworI2lmZGVmIEtSQjQKKyNpZmRlZiBSTE9HQ09ERQorICAgIGlmICh0dG5wcm90byA9PSBOUF9FSzRMT0dJTikgeworICAgICAgICByZXR1cm4oa3JiNF9kZXNfd3JpdGUodHR5ZmQscyxuKSk7CisgICAgfQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisjZW5kaWYgLyogS1JCNCAqLworI2lmZGVmIEtSQjUKKyNpZmRlZiBSTE9HQ09ERQorICAgIGlmICh0dG5wcm90byA9PSBOUF9FSzVMT0dJTikgeworICAgICAgICByZXR1cm4oa3JiNV9kZXNfd3JpdGUodHR5ZmQscyxuLDApKTsKKyAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBLUkI1X1UyVQorICAgIGlmICh0dG5wcm90byA9PSBOUF9LNVUyVSkgeworICAgICAgICByZXR1cm4oa3JiNV91MnVfd3JpdGUodHR5ZmQscyxuKSk7CisgICAgfQorI2VuZGlmIC8qIEtSQjVfVTJVICovCisjZW5kaWYgLyogS1JCNSAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfRU5DUllQVElPTikpCisgICAgICBja190bl9lbmNyeXB0KHMsbik7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKHNzbF9hY3RpdmVfZmxhZyB8fCB0bHNfYWN0aXZlX2ZsYWcpIHsKKyAgICAgICAgaW50IGVycm9yLCByOworICAgICAgICAvKiBXcml0ZSB1c2luZyBTU0wgKi8KKyAgICAgIHNzbF9yZXRyeToKKyAgICAgICAgaWYgKHNzbF9hY3RpdmVfZmxhZykKKyAgICAgICAgICByID0gU1NMX3dyaXRlKHNzbF9jb24sIHMsIGxlbiAvKiA+MTAyND8xMDI0OmxlbiAqLyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByID0gU1NMX3dyaXRlKHRsc19jb24sIHMsIGxlbiAvKiA+MTAyND8xMDI0OmxlbiAqLyk7CisgICAgICAgIHN3aXRjaCAoU1NMX2dldF9lcnJvcihzc2xfYWN0aXZlX2ZsYWc/c3NsX2Nvbjp0bHNfY29uLHIpKSB7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfTk9ORToKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIm5ldHRvbCIsIlNTTF93cml0ZSIscik7CisgICAgICAgICAgICBpZiAoIHIgPT0gbGVuICkKKyAgICAgICAgICAgICAgICByZXR1cm4obik7CisgICAgICAgICAgICAgcyArPSByOworICAgICAgICAgICAgIGxlbiAtPSByOworICAgICAgICAgICAgIGdvdG8gc3NsX3JldHJ5OworICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJuZXR0b2wgU1NMX0VSUk9SX1dBTlRfV1JJVEUiLCIiLDApOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJuZXR0b2wgU1NMX0VSUk9SX1dBTlRfUkVBRCIsIiIsMCk7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICAgIGlmICggciA9PSAwICkgeyAvKiBFT0YgKi8KKyAgICAgICAgICAgICAgICAgIG5ldGNsb3MoKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBpbnQgcmMgPSAtMTsKKyNpZmRlZiBOVAorICAgICAgICAgICAgICAgICAgaW50IGdsZSA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwibmV0dG9sIFNTTF9FUlJPUl9TWVNDQUxMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0TGFzdEVycm9yKCkiLGdsZSk7CisgICAgICAgICAgICAgICAgICByYyA9IG9zMnNvY2tldGVycm9yKGdsZSk7CisgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtMjsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCByYyA9PSAtMiApCisgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgICAgICAgcmV0dXJuKHJjKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJuZXR0b2wgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVAiLCIiLDApOworICAgICAgICAgICAgbmV0Y2xvcygpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TU0w6CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJuZXR0b2wgU1NMX0VSUk9SX1NTTCIsIiIsMCk7CisgICAgICAgICAgICAgIGlmIChiaW9fZXJyIT1OVUxMKSB7CisgICAgICAgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgc3NsX2VycltdOworICAgICAgICAgICAgICAgICAgQklPX3ByaW50ZihiaW9fZXJyLCJuZXR0b2woKSBTU0xfRVJST1JfU1NMXG4iKTsKKyAgICAgICAgICAgICAgICAgIEVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisgICAgICAgICAgICAgICAgICBsZW4gPSBCSU9fcmVhZChiaW9fZXJyLHNzbF9lcnIsU1NMX0VSUl9CRlNaKTsKKyAgICAgICAgICAgICAgICAgIHNzbF9lcnJbbGVuIDwgU1NMX0VSUl9CRlNaID8gbGVuIDogU1NMX0VSUl9CRlNaXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJuZXR0b2wgU1NMX0VSUk9SX1NTTCIsc3NsX2VyciwwKTsKKyAgICAgICAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoc3NsX2Vycik7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3NsX2RlYnVnX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsIm5ldHRvbCBTU0xfRVJST1JfU1NMIiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIm5ldHRvbCgpIFNTTF9FUlJPUl9TU0xcbiIpOworICAgICAgICAgICAgICAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworICAgICAgICAgICAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgICAgICAgIHJldHVybigtMik7CisjZWxzZQorICAgICAgICAgICAgICByZXR1cm4oLTEpOworI2VuZGlmCisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJuZXR0b2wgU1NMX0VSUk9SX1pFUk9fUkVUVVJOIiwiIiwwKTsKKyAgICAgICAgICAgIG5ldGNsb3MoKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsIm5ldHRvbCBTU0xfRVJST1JfPz8/Pz8iLCIiLDApOworICAgICAgICAgICAgbmV0Y2xvcygpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICBuZXR0b2xfcmV0cnk6CisgICAgdHJ5Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVhc2UgdGhlIHRyeSBjb3VudGVyICovCisKKyAgICBpZiAodHRuZXQgPT0gTkVUX1RDUEIpIHsKKyNpZmRlZiBCU0RTRUxFQ1QKKyAgICAgICAgZmRfc2V0IHdmZHM7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworCisgICAgICAgIGRlYnVnKEYxMDEsIm5ldHRvbCBCU0RTRUxFQ1QiLCIiLDApOworICAgICAgICB0di50dl91c2VjID0gMEw7CisgICAgICAgIHR2LnR2X3NlYz0zMDsKKyNpZmRlZiBOVAorICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAxOworI2VuZGlmIC8qIE5UICovCisjaWZkZWYgU1RSRUFNSU5HCisgICAgICBkb19zZWxlY3Q6CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisgICAgICAgIEZEX1pFUk8oJndmZHMpOworICAgICAgICBGRF9TRVQodHR5ZmQsICZ3ZmRzKTsKKyAgICAgICAgaWYgKHNlbGVjdChGRF9TRVRTSVpFLCBOVUxMLAorI2lmZGVmIF9fREVDQworI2lmbmRlZiBfX0RFQ0NfVkVSCisgICAgICAgICAgICAgICAgICAgIChpbnQgKikKKyNlbmRpZiAvKiBfX0RFQ0NfVkVSICovCisjZW5kaWYgLyogX19ERUNDICovCisgICAgICAgICAgICAgICAgICAgJndmZHMsIE5VTEwsICZ0dikgPCAwKSB7CisgICAgICAgICAgICBpbnQgc19lcnJubyA9IHNvY2tldF9lcnJubzsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldHRvbCBzZWxlY3QgZmFpbGVkIiwiIixzX2Vycm5vKTsKKyNpZmRlZiBCRVRBREVCVUcKKyAgICAgICAgICAgIHByaW50ZigibmV0dG9sIHNlbGVjdCBmYWlsZWQ6ICVkXG4iLCBzX2Vycm5vKTsKKyNlbmRpZiAvKiBCRVRBREVCVUcgKi8KKyNpZmRlZiBOVAorICAgICAgICAgICAgV1NBU2FmZVRvQ2FuY2VsID0gMDsKKyAgICAgICAgICAgIGlmICghd2luOTVzZWxlY3RidWcpCisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUZEX0lTU0VUKHR0eWZkLCAmd2ZkcykpIHsKKyNpZmRlZiBTVFJFQU1JTkcKKyAgICAgICAgICAgIGlmIChzdHJlYW1pbmcpCisgICAgICAgICAgICAgIGdvdG8gZG9fc2VsZWN0OworI2VuZGlmIC8qIFNUUkVBTUlORyAqLworICAgICAgICAgICAgZGVidWcoRjExMSwibmV0dG9sIiwiIUZEX0lTU0VUIix0dHlmZCk7CisjaWZkZWYgTlQKKyAgICAgICAgICAgIFdTQVNhZmVUb0NhbmNlbCA9IDA7CisgICAgICAgICAgICBpZiAoIXdpbjk1c2VsZWN0YnVnKQorI2VuZGlmIC8qIE5UICovCisgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyNpZmRlZiBOVAorICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAwOworI2VuZGlmIC8qIE5UICovCisjZWxzZSAvKiBCU0RTRUxFQ1QgKi8KKyNpZmRlZiBJQk1TRUxFQ1QKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRyaWVzID0gMDsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldHRvbCBJQk1TRUxFQ1QiLCIiLDApOworICAgICAgICAgICAgd2hpbGUgKHNlbGVjdCgmdHR5ZmQsIDAsIDEsIDAsIDEwMDApICE9IDEpIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKHRyaWVzKysgPj0gNjApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaWYgYWZ0ZXIgNjAgc2Vjb25kcyB3ZSBjYW4ndCBnZXQgcGVybWlzc2lvbiB0byB3cml0ZSAqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXR0b2wgc2VsZWN0IGZhaWxlZCIsIiIsc29ja2V0X2Vycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChjb3VudCA9IG5ldHRjaGsoKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIm5ldHRvbCIsIm5ldHRjaGsoKSIsY291bnQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIElCTVNFTEVDVCAqLworI2VuZGlmIC8qIEJTRFNFTEVDVCAqLworICAgICAgICBpZiAoKGNvdW50ID0gc29ja2V0X3dyaXRlKHR0eWZkLHMsbikpIDwgMCkgeworICAgICAgICAgICAgaW50IHNfZXJybm8gPSBzb2NrZXRfZXJybm87IC8qIG1heWJlIGEgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldHRvbCBzb2NrZXRfd3JpdGUgZXJyb3IiLCIiLHNfZXJybm8pOworI2lmZGVmIE9TMgorICAgICAgICAgICAgaWYgKG9zMnNvY2tldGVycm9yKHNfZXJybm8pIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIHJldHVybigtMSk7ICAgICAgICAgICAgICAgICAvKiBDYWxsIGl0IGFuIGkvbyBlcnJvciAqLworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCA8IG4pIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIm5ldHRvbCBzb2NrZXRfd3JpdGUiLHMsY291bnQpOworICAgICAgICAgICAgaWYgKHRyeSA+IDI1KSB7CisgICAgICAgICAgICAgICAgLyogZG9uJ3QgdHJ5IG1vcmUgdGhhbiAyNSB0aW1lcyAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsIm5ldHRvbCB0cmllZCBtb3JlIHRoYW4gMjUgdGltZXMiLCIiLDApOworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgcyArPSBjb3VudDsKKyAgICAgICAgICAgICAgICBuIC09IGNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjExMSwibmV0dG9sIHJldHJ5IixzLG4pOworICAgICAgICAgICAgZ290byBuZXR0b2xfcmV0cnk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJuZXR0b2wgc29ja2V0X3dyaXRlIixzLGNvdW50KTsKKyAgICAgICAgICAgIHJldHVybihsZW4pOyAvKiBzdWNjZXNzIC0gcmV0dXJuIHRvdGFsIGxlbmd0aCAqLworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICByZXR1cm4oLTIpOworI2Vsc2UKKyAgICBkZWJ1ZyhGMTAwLCJuZXR0b2wgVENQSVBMSUIgbm90IGRlZmluZWQiLCIiLDApOworICAgIHJldHVybigtMik7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KK30KKworLyogIE4gRSBUIFQgTyBDICAtLSAgIE91dHB1dCBjaGFyYWN0ZXIgdG8gbmV0d29yayAqLworLyoKKyAgQ2FsbCB3aXRoIGNoYXJhY3RlciB0byBiZSB0cmFuc21pdHRlZC4KKyAgUmV0dXJucyAwIGlmIHRyYW5zbWlzc2lvbiB3YXMgc3VjY2Vzc2Z1bCwgb3IKKyAgLTEgdXBvbiBpL28gZXJyb3IsIG9yIC0yIGlmIGNhbGxlZCBpbXByb3Blcmx5LgorKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCituZXR0b2MoQ0hBUiBjKQorI2Vsc2UKK25ldHRvYyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIG5ldHRvYyAqLyB7CisjaWZkZWYgVU5JWAorICAgIHJldHVybih0dG9jKGMpKTsKKyNlbHNlCisjaWZkZWYgVENQSVBMSUIKKyAgICB1bnNpZ25lZCBjaGFyIGNjOworICAgIGlmICh0dHlmZCA9PSAtMSkgeworICAgICAgICBkZWJ1ZyhGMTAwLCJuZXR0b2Mgc29ja2V0IGlzIGNsb3NlZCIsIiIsMCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY2MgPSBjOworICAgIGRlYnVnKEYxMDEsIm5ldHRvYyBjYyIsIiIsY2MpOworCisjaWZkZWYgQ0tfS0VSQkVST1MKKyNpZmRlZiBLUkI0CisjaWZkZWYgUkxPR0NPREUKKyAgICBpZiAodHRucHJvdG8gPT0gTlBfRUs0TE9HSU4pIHsKKyAgICAgICAgcmV0dXJuKGtyYjRfZGVzX3dyaXRlKHR0eWZkLCZjYywxKT09MT8wOi0xKTsKKyAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNlbmRpZiAvKiBLUkI0ICovCisjaWZkZWYgS1JCNQorI2lmZGVmIFJMT0dDT0RFCisgICAgaWYgKHR0bnByb3RvID09IE5QX0VLNUxPR0lOKSB7CisgICAgICAgIHJldHVybihrcmI1X2Rlc193cml0ZSh0dHlmZCwmY2MsMSwwKT09MT8wOi0xKTsKKyAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBLUkI1X1UyVQorICAgIGlmICh0dG5wcm90byA9PSBOUF9LNVUyVSkgeworICAgICAgICByZXR1cm4oa3JiNV91MnVfd3JpdGUodHR5ZmQsJmNjLDEpPT0xPzA6LTEpOworICAgIH0KKyNlbmRpZiAvKiBLUkI1X1UyVSAqLworI2VuZGlmIC8qIEtSQjUgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICBpZiAoIFRFTE9QVF9NRShURUxPUFRfRU5DUllQVElPTikgKQorICAgICAgICAgICAgY2tfdG5fZW5jcnlwdCgmY2MsMSk7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmIENLX1NTTAorICAgIGlmIChzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgIGludCBsZW4sIGVycm9yOworICAgICAgICAvKiBXcml0ZSB1c2luZyBTU0wgKi8KKyAgICAgIHNzbF9yZXRyeToKKyAgICAgICAgaWYgKHNzbF9hY3RpdmVfZmxhZykKKyAgICAgICAgICBsZW4gPSBTU0xfd3JpdGUoc3NsX2NvbiwgJmNjLCAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGxlbiA9IFNTTF93cml0ZSh0bHNfY29uLCAmY2MsIDEpOworICAgICAgICBzd2l0Y2ggKFNTTF9nZXRfZXJyb3Ioc3NsX2FjdGl2ZV9mbGFnP3NzbF9jb246dGxzX2NvbixsZW4pKSB7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfTk9ORToKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIm5ldHRvYyIsIlNTTF93cml0ZSIsbGVuKTsKKyAgICAgICAgICAgIHJldHVybihsZW4gPT0gMSA/IDAgOiAtMSk7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgCSAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgICBpZiAoIGxlbiA9PSAwICkgeyAvKiBFT0YgKi8KKyAgICAgICAgICAgICAgICAgIG5ldGNsb3MoKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBpbnQgcmMgPSAtMTsKKyNpZmRlZiBOVAorICAgICAgICAgICAgICAgICAgaW50IGdsZSA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwibmV0dG9jIFNTTF9FUlJPUl9TWVNDQUxMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0TGFzdEVycm9yKCkiLGdsZSk7CisgICAgICAgICAgICAgICAgICByYyA9IG9zMnNvY2tldGVycm9yKGdsZSk7CisgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtMjsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCByYyA9PSAtMiApCisgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgICAgICAgcmV0dXJuKHJjKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICBjYXNlIFNTTF9FUlJPUl9TU0w6CisgICAgICAgICAgICAgIGlmIChiaW9fZXJyIT1OVUxMKSB7CisgICAgICAgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgc3NsX2VycltdOworICAgICAgICAgICAgICAgICAgQklPX3ByaW50ZihiaW9fZXJyLCJuZXR0b2MoKSBTU0xfRVJST1JfU1NMXG4iKTsKKyAgICAgICAgICAgICAgICAgIEVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisgICAgICAgICAgICAgICAgICBsZW4gPSBCSU9fcmVhZChiaW9fZXJyLHNzbF9lcnIsU1NMX0VSUl9CRlNaKTsKKyAgICAgICAgICAgICAgICAgIHNzbF9lcnJbbGVuIDwgU1NMX0VSUl9CRlNaID8gbGVuIDogU1NMX0VSUl9CRlNaXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJuZXR0b2MgU1NMX0VSUk9SX1NTTCIsc3NsX2VyciwwKTsKKyAgICAgICAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoc3NsX2Vycik7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3NsX2RlYnVnX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsIm5ldHRvYyBTU0xfRVJST1JfU1NMIiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIm5ldHRvYygpIFNTTF9FUlJPUl9TU0xcbiIpOworICAgICAgICAgICAgICAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG5ldGNsb3MoKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgaWYgKHR0bmV0ID09IE5FVF9UQ1BCKSB7CisjaWZkZWYgQlNEU0VMRUNUCisgICAgICAgIGZkX3NldCB3ZmRzOworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKworICAgICAgICBkZWJ1ZyhGMTAxLCJuZXR0b2MgQlNEU0VMRUNUIiwiIiwwKTsKKyAgICAgICAgdHYudHZfdXNlYyA9IDBMOworICAgICAgICB0di50dl9zZWMgPSAzMDsKKworI2lmZGVmIFNUUkVBTUlORworICAgICAgZG9fc2VsZWN0OgorI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCisgICAgICAgIEZEX1pFUk8oJndmZHMpOworICAgICAgICBGRF9TRVQodHR5ZmQsICZ3ZmRzKTsKKyAgICAgICAgaWYgKHNlbGVjdChGRF9TRVRTSVpFLCBOVUxMLAorI2lmZGVmIF9fREVDQworI2lmbmRlZiBfX0RFQ0NfVkVSCisgICAgICAgICAgICAgICAgICAgKGludCAqKQorI2VuZGlmIC8qIF9fREVDQ19WRVIgKi8KKyNlbmRpZiAvKiBfX0RFQ0MgKi8KKyAgICAgICAgICAgICAgICAgICAmd2ZkcywgTlVMTCwgJnR2KSA8IDApIHsKKyAgICAgICAgICAgIGludCBzX2Vycm5vID0gc29ja2V0X2Vycm5vOworICAgICAgICAgICAgZGVidWcoRjEwMSwibmV0dG9jIHNlbGVjdCBmYWlsZWQiLCIiLHNfZXJybm8pOworI2lmZGVmIEJFVEFERUJVRworICAgICAgICAgICAgcHJpbnRmKCJuZXR0b2Mgc2VsZWN0IGZhaWxlZDogJWRcbiIsIHNfZXJybm8pOworI2VuZGlmIC8qIEJFVEFERUJVRyAqLworI2lmZGVmIE5UCisgICAgICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAwOworICAgICAgICAgICAgaWYgKCF3aW45NXNlbGVjdGJ1ZykKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgICAgIGlmICghRkRfSVNTRVQodHR5ZmQsICZ3ZmRzKSkgeworI2lmZGVmIFNUUkVBTUlORworICAgICAgICAgICAgaWYgKHN0cmVhbWluZykKKyAgICAgICAgICAgICAgZ290byBkb19zZWxlY3Q7CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJuZXR0b2MiLCIhRkRfSVNTRVQiLHR0eWZkKTsKKyNpZmRlZiBOVAorICAgICAgICAgICAgV1NBU2FmZVRvQ2FuY2VsID0gMDsKKyAgICAgICAgICAgIGlmICghd2luOTVzZWxlY3RidWcpCisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorI2lmZGVmIE5UCisgICAgICAgIFdTQVNhZmVUb0NhbmNlbCA9IDA7CisjZW5kaWYgLyogTlQgKi8KKyNlbHNlIC8qIEJTRFNFTEVDVCAqLworI2lmZGVmIElCTVNFTEVDVAorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdHJpZXMgPSAwOworICAgICAgICAgICAgd2hpbGUgKHNlbGVjdCgmdHR5ZmQsIDAsIDEsIDAsIDEwMDApICE9IDEpIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKHRyaWVzKysgPj0gNjApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaWYgYWZ0ZXIgNjAgc2Vjb25kcyB3ZSBjYW4ndCBnZXQgcGVybWlzc2lvbiB0byB3cml0ZSAqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJuZXR0b2Mgc2VsZWN0IGZhaWxlZCIsIiIsc29ja2V0X2Vycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChjb3VudCA9IG5ldHRjaGsoKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIm5ldHRvYyIsIm5ldHRjaGsoKSIsY291bnQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIElCTVNFTEVDVCAqLworI2VuZGlmIC8qIEJTRFNFTEVDVCAqLworICAgICAgICBpZiAoc29ja2V0X3dyaXRlKHR0eWZkLCZjYywxKSA8IDEpIHsKKyAgICAgICAgICAgIGludCBzX2Vycm5vID0gc29ja2V0X2Vycm5vOyAgICAgICAgIC8qIG1heWJlIGEgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldHRvYyBzb2NrZXRfd3JpdGUgZXJyb3IiLCIiLHNfZXJybm8pOworI2lmZGVmIE9TMgorICAgICAgICAgICAgaWYgKG9zMnNvY2tldGVycm9yKHNfZXJybm8pIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjEwMSwibmV0dG9jIHNvY2tldF93cml0ZSIsIiIsIGNjKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0gZWxzZSByZXR1cm4oLTIpOworI2Vsc2UKKyAgICByZXR1cm4oLTIpOworI2VuZGlmIC8qIFRDUElQTElCICovCisjZW5kaWYgLyogVU5JWCAqLworfQorCisvKiAgTiBFIFQgRiBMIFUgSSAgLS0gIEZsdXNoIG5ldHdvcmsgaW5wdXQgYnVmZmVyICAqLworCisjaWZkZWYgVE5DT0RFCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK25ldGdldGMoaW50IHRpbW8pICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBmdW5jdGlvbiB0byBwb2ludCB0by4uLiAqLworI2Vsc2UgIC8qIENLX0FOU0lDICovCituZXRnZXRjKHRpbW8pIGludCB0aW1vOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLi4uaW4gdGhlIHRuX2Rvb3AoKSBjYWxsICovCisjaWZkZWYgVENQSVBMSUIKKyAgICByZXR1cm4gbmV0aW5jKHRpbW8pOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyAgICByZXR1cm4gdHRpbmModGltbyk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KK30KKyNlbmRpZiAvKiBUTkNPREUgKi8KKworaW50CituZXRmbHVpKCkgeworICAgIGludCBuOworICAgIGludCBjaDsKKyNpZmRlZiBORVRMRUJVRgorICAgIHR0cHVzaCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBwZWVrLWFoZWFkIGNoYXIgKi8KKyAgICB3aGlsZSAobGVfZGF0YSAmJiAobGVfaW5idWYoKSA+IDApKSB7CisgICAgICAgIENIQVIgY2ggPSAnXDAnOworICAgICAgICBpZiAobGVfZ2V0Y2hhcigmY2gpID4gMCkgeworICAgICAgICAgICAgZGVidWcoRjEwMSwidHRmbHVpIGxlX2luYnVmIGNoIiwiIixjaCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTkVUTEVCVUYgKi8KKworI2lmZGVmIFRDUElQTElCCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRDUElQTXV0ZXgoU0VNX0lOREVGSU5JVEVfV0FJVCk7CisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgVE5DT0RFCisgICAgaWYgKHR0bnByb3RvID09IE5QX1RFTE5FVCkgeworICAgICAgICAvKiBOZXRmbHVpIG11c3QgcHJvY2VzcyBUZWxuZXQgbmVnb3RpYXRpb25zIG9yIGdldCBvdXQgb2Ygc3luYyAqLworICAgICAgICBpZiAoKG4gPSBuZXR0Y2hrKCkpIDw9IDApCisgICAgICAgICAgZ290byBleGl0X2ZsdWk7CisgICAgICAgIHdoaWxlIChuLS0gPiAwKSB7CisgICAgICAgICAgICBjaCA9IG5ldGluYygxKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSBJQUMpIHsKKyAgICAgICAgICAgICAgICBleHRlcm4gaW50IGR1cGxleDsgIC8qIHRoaXMgcmVhbGx5IHNob3VsZG4ndCBiZSBoZXJlIGJ1dCAuLi4gKi8KKyAgICAgICAgICAgICAgICBpbnQgdHggPSB0bl9kb29wKChDSEFSKShjaCAmIDB4ZmYpLGR1cGxleCxuZXRnZXRjKTsKKyAgICAgICAgICAgICAgICBpZiAodHggPT0gMSkgZHVwbGV4ID0gMTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0eCA9PSAyKSBkdXBsZXggPSAwOworICAgICAgICAgICAgICAgIG4gPSBuZXR0Y2hrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICB7CisgICAgICAgIHR0aWJ1Zlt0dGlicCt0dGlibl0gPSAnXDAnOworICAgICAgICBkZWJ1ZyhGMTExLCJuZXRmbHVpIDEiLHR0aWJ1Zix0dGlibik7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICBpZiAoVEVMT1BUX1UoVEVMT1BUX0VOQ1JZUFRJT04pKSB7CisgICAgICAgICAgICBja190bl9kZWNyeXB0KCZ0dGlidWZbdHRpYnBdLHR0aWJuKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgdHRpYm4gPSB0dGlicCA9IDA7ICAgICAgICAgICAgICAvKiBGbHVzaCBpbnRlcm5hbCBidWZmZXIgKkZJUlNUKiAqLworICAgICAgICBpZiAodHR5ZmQgPCAxKQorICAgICAgICAgIGdvdG8gZXhpdF9mbHVpOworICAgICAgICBpZiAoKG4gPSBuZXR0Y2hrKCkpID4gMCkgeyAgICAgIC8qIE5vdyBzZWUgd2hhdCdzIHdhaXRpbmcgb24gdGhlIG5ldCAqLworICAgICAgICAgICAgaWYgKG4gPiBUVElCVUZMKSBuID0gVFRJQlVGTDsgICAgICAgLyogYW5kIHNwb25nZSBpdCB1cCAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwibmV0Zmx1aSAyIiwiIixuKTsgICAgICAgLyogLi4uICovCisgICAgICAgICAgICBuID0gc29ja2V0X3JlYWQodHR5ZmQsdHRpYnVmLG4pOyAvKiBpbnRvIG91ciBidWZmZXIgKi8KKyAgICAgICAgICAgIGlmIChuID49IDApIHR0aWJ1ZltuXSA9ICdcMCc7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJuZXRmbHVpIDMiLHR0aWJ1ZixuKTsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICBpZiAoVEVMT1BUX1UoVEVMT1BUX0VOQ1JZUFRJT04pKSB7CisgICAgICAgICAgICAgICAgY2tfdG5fZGVjcnlwdCgmdHRpYnVmW3R0aWJwXSxuKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICB0dGlidWZbMF0gPSAnXDAnOworICAgICAgICB9CisgICAgfQorI2Vsc2UgIC8qICFUQ1BJUExJQiAqLworICAgIGlmICh0dHlmZCA8IDEpCisgICAgICBnb3RvIGV4aXRfZmx1aTsKKyNpZmRlZiBUTkNPREUKKyAgICBpZiAodHRucHJvdG8gPT0gTlBfVEVMTkVUKSB7CisgICAgICAgIGlmICgobiA9IHR0Y2hrKCkpIDw9IDApCisgICAgICAgICAgZ290byBleGl0X2ZsdWk7CisgICAgICAgIHdoaWxlIChuLS0gPj0gMCkgeworICAgICAgICAgICAgLyogTmV0Zmx1aSBtdXN0IHByb2Nlc3MgVGVsbmV0IG5lZ290aWF0aW9ucyBvciBnZXQgb3V0IG9mIHN5bmMgKi8KKyAgICAgICAgICAgIGNoID0gdHRpbmMoMSk7CisgICAgICAgICAgICBpZiAoY2ggPT0gSUFDKSB7CisgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBkdXBsZXg7ICAvKiB0aGlzIHJlYWxseSBzaG91bGRuJ3QgYmUgaGVyZSBidXQgLi4uICovCisgICAgICAgICAgICAgICAgaW50IHR4ID0gdG5fZG9vcCgoQ0hBUikoY2ggJiAweGZmKSxkdXBsZXgsbmV0Z2V0Yyk7CisgICAgICAgICAgICAgICAgaWYgKHR4ID09IDEpIGR1cGxleCA9IDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHggPT0gMikgZHVwbGV4ID0gMDsKKyAgICAgICAgICAgICAgICBuID0gdHRjaGsoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICBpZiAoKG4gPSB0dGNoaygpKSA+IDApIHsKKyAgICAgICAgZGVidWcoRjEwMSwibmV0Zmx1aSBub24tVENQSVBMSUIiLCIiLG4pOworICAgICAgICB3aGlsZSAoKG4tLSkgJiYgdHRpbmMoMSkgPiAtMSkgIC8qIERvbid0IHdvcnJ5LCB0dGluYygpIGlzIGJ1ZmZlcmVkICovCisgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIGl0IGhhbmRsZXMgdGhlIGRlY3J5cHRpb24uLi4gKi8KKyAgICB9CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgZXhpdF9mbHVpOgorI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgcmV0dXJuKDApOworfQorCisjaWZkZWYgQ0tfS0VSQkVST1MKKy8qIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgcmVxdWlyZWQgZm9yIGVuY3J5cHRlZCBybG9naW4gKi8KKy8qIFRoZXkgYXJlIGNhbGxlZCB3aXRoIG5ldHRvYygpIG9yIG5ldHRvbCgpIGFyZSB0cmFuc21pdHRpbmcgICAgKi8KKy8qIGVuY3J5cHRlZCBkYXRhLiAgVGhleSBjYWxsIGEgZnVuY3Rpb24gdG8gZW5jcnlwdCB0aGUgZGF0YSAgICAgKi8KKy8qIGFuZCB0aGF0IGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8vcmVhZCBmcm9tIHRoZSAgKi8KKy8qIG5ldHdvcmsgaW4gYW4gdW5pbXBlZGVkIG1hbm5lci4gIEhlbmNlLCB0aGVzZSB0d28gc2ltcGxlIGZucy4gKi8KK2ludAorbmV0X3dyaXRlKGZkLCBidWYsIGxlbikKKyAgICBpbnQgZmQ7CisgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqYnVmOworICAgIGludCBsZW47Cit7CisgICAgaW50IGNjOworICAgIHJlZ2lzdGVyIGludCB3cmxlbiA9IGxlbjsKKyAgICBkbyB7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgY2MgPSBzb2NrZXRfd3JpdGUoZmQsIGJ1Ziwgd3JsZW4pOworI2Vsc2UKKyAgICAgICAgY2MgPSB3cml0ZShmZCxidWYsd3JsZW4pOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgIGlmIChjYyA8IDApIHsKKyAgICAgICAgICAgIGludCBzX2Vycm5vID0gc29ja2V0X2Vycm5vOworICAgICAgICAgICAgZGVidWcoRjEwMSwibmV0X3dyaXRlIGVycm9yIiwiIixzX2Vycm5vKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGlmIChvczJzb2NrZXRlcnJvcihzX2Vycm5vKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbHNlIC8qIE9TMiAqLworICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZiArPSBjYzsKKyAgICAgICAgICAgIHdybGVuIC09IGNjOworICAgICAgICB9CisgICAgfSB3aGlsZSAod3JsZW4gPiAwKTsKKyAgICByZXR1cm4obGVuKTsKK30KK2ludAorbmV0X3JlYWQoZmQsIGJ1ZiwgbGVuKQorICAgIGludCBmZDsKKyAgICByZWdpc3RlciBjaGFyICpidWY7CisgICAgcmVnaXN0ZXIgaW50IGxlbjsKK3sKKyAgICBpbnQgY2MsIGxlbjIgPSAwOworCisgICAgZG8geworI2lmZGVmIFRDUElQTElCCisgICAgICAgIGNjID0gc29ja2V0X3JlYWQoZmQsIGJ1ZiwgbGVuKTsKKyNlbHNlCisgICAgICAgIGNjID0gcmVhZChmZCxidWYsbGVuKTsKKyNlbmRpZgorICAgICAgICBpZiAoY2MgPCAwKSB7CisgICAgICAgICAgICBpbnQgc19lcnJubyA9IHNvY2tldF9lcnJubzsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIm5ldF9yZWFkIGVycm9yIiwiIixzX2Vycm5vKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGlmIChvczJzb2NrZXRlcnJvcihzX2Vycm5vKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIHJldHVybihjYyk7ICAgICAgICAgIC8qIGVycm5vIGlzIGFscmVhZHkgc2V0ICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY2MgPT0gMCkgeworICAgICAgICAgICAgbmV0Y2xvcygpOworICAgICAgICAgICAgcmV0dXJuKGxlbjIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmICs9IGNjOworICAgICAgICAgICAgbGVuMiArPSBjYzsKKyAgICAgICAgICAgIGxlbiAtPSBjYzsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGxlbiA+IDApOworICAgIHJldHVybihsZW4yKTsKK30KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2VuZGlmIC8qIE5PTkVUICovCisKKy8qIGdldGxvY2FsaXBhZGRyKCkgYXR0ZW1wdHMgdG8gcmVzb2x2ZSBhbiBJUCBBZGRyZXNzIGZvciB0aGUgbG9jYWwgbWFjaGluZS4KKyAqICAgSWYgdGhlIGhvc3QgaXMgbXVsdGktaG9tZWQgaXQgcmV0dXJucyBvbmx5IG9uZSBhZGRyZXNzLgorICoKKyAqIFR3byB0ZWNobmlxdWVzIGFyZSB1c2VkLgorICogKDEpIGdldCB0aGUgbG9jYWwgaG9zdCBuYW1lIGFuZCBwZXJmb3JtIGEgRE5TIGxvb2t1cCwgdGhlbiB0YWtlCisgKiAgICAgdGhlIGZpcnN0IGVudHJ5OworICogKDIpIG9wZW4gYSBVRFAgc29ja2V0LCB1c2UgaXQgdG8gY29ubmVjdCB0byBhIGZpY3RpdGlvdXMgaG9zdCAoaXQncyBPSywKKyAqICAgIG5vIGRhdGEgaXMgc2VudCksIHRoZW4gcmV0cmlldmUgdGhlIGxvY2FsIGFkZHJlc3MgZnJvbSB0aGUgc29ja2V0LgorICogTm90ZTogdGhlIHNlY29uZCB0ZWNobmlxdWUgd29uJ3Qgd29yayBvbiBNaWNyb3NvZnQgc3lzdGVtcy4gIFNlZQorICogQXJ0aWNsZSBJRDogUTEyOTA2NSBQUkI6IEdldHNvY2tuYW1lKCkgUmV0dXJucyBJUCBBZGRyZXNzIDAuMC4wLjAgZm9yIFVEUAorICovCisKKy8qIFRlY2huaXF1ZSBudW1iZXIgb25lIGNhbm5vdCB3b3JrIHJlbGlhYmx5IGlmIHRoZSBtYWNoaW5lIGlzIGEgbGFwdG9wCisgKiBhbmQgdGhlIGhvc3RuYW1lIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBoeXNpY2FsIGFkYXB0ZXIgd2hpY2ggaXMgbm90CisgKiBpbnN0YWxsZWQgYW5kIGEgUFBQIGNvbm5lY3Rpb24gaXMgYmVpbmcgdXNlZCBpbnN0ZWFkLiAgVGhpcyBpcyBiZWNhdXNlCisgKiB0aGUgaG9zdG5hbWUgRE5TIGxvb2t1cCB3aWxsIHN1Y2NlZWQgZm9yIHRoZSBwaHlzaWNhbCBhZGFwdGVyIGV2ZW4gdGhvdWdoCisgKiBpdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvIHVzZSBpdC4gIEluIE5UNCBTUDQsIHRoZSBnZXRob3N0YnluYW1lKCkKKyAqIHdoZW4gZ2l2ZW4gdGhlIHJlc3VsdCBvZiBnZXRob3N0bmFtZSgpIHJldHVybnMgbm90IHRoZSByZWFsIEROUyBlbnRyaWVzCisgKiBmb3IgdGhhdCBuYW1lK2RvbWFpbi4gIEluc3RlYWQgaXQgcmV0dXJucyBhbGwgb2YgdGhlIHN0YXRpYyBhbmQgZHluYW1pYworICogSVAgYWRkcmVzc2VzIGFzc2lnbmVkIHRvIGFueSBwaHlzaWNhbCBvciB2aXJ0dWFsIGFkYXB0ZXIgZGVmaW5lZCBpbiB0aGUKKyAqIHN5c3RlbSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IGl0IGlzIGluc3RhbGxlZC4gIFRoZSBvcmRlciBvZiB0aGUKKyAqIGFkZHJlc3NlcyBpcyBmaXhlZCBhY2NvcmRpbmcgdG8gdGhlIGJpbmRpbmcgb3JkZXIgaW4gdGhlIE5UIHJlZ2lzdHJ5LgorICovCisKKy8qCisgKiBJdCBhcHBlYXJzIHRoYXQgY2FsbGluZyBnZXRob3N0YnluYW1lKE5VTEwpIGlzIG1vcmUgcmVsaWFibGUgdGhhbgorICogY2FsbGluZyBnZXRob3N0YnluYW1lKGdldGhvc3RuYW1lKCkpIG9uIFdpbmRvd3MuICBTbyBvbiBXaW5kb3dzIHdlIHdpbGwKKyAqIG9ubHkgY2FsbCBnZXRob3N0YnluYW1lKE5VTEwpLgorICovCisKK2ludAorZ2V0bG9jYWxpcGFkZHIoKSB7CisjaWZuZGVmIGRhdGFnZW5lcmFsCisgICAgc3RydWN0IHNvY2thZGRyX2luIGxfc2E7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHJfc2E7CisgICAgR1NPQ0tOQU1FX1Qgc2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworICAgIGludCBzb2NrOworICAgIGludCByYzsKKyAgICBzdHJ1Y3QgaW5fYWRkciBsYWRkcjsKKworICAgIC8qIGlmIHN0aWxsIG5vdCByZXNvbHZlZCwgdGhlbiB0cnkgc2Vjb25kIHN0cmF0ZWd5ICovCisgICAgLyogVGhpcyBzZWNvbmQgc3RyYXRlZ3kgZG9lcyBub3Qgd29yayBvbiBXaW5kb3dzICovCisKKyAgICBtZW1zZXQoJmxfc2EsMCxzbGVuKTsKKyAgICBtZW1zZXQoJnJfc2EsMCxzbGVuKTsKKworICAgIC8qIGdldCBhIFVEUCBzb2NrZXQgKi8KKyAgICBzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIGlmIChzb2NrICE9IC0xKSB7CisgICAgICAgIC8qIGNvbm5lY3QgdG8gYXJiaXJhcnkgcG9ydCBhbmQgYWRkcmVzcyAoTk9UIGxvb3BiYWNrKSAqLworICAgICAgICByX3NhLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICByX3NhLnNpbl9wb3J0ID0gaHRvbnMoSVBQT1JUX0VDSE8pOworCisgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgYW4gImlsbGVnYWwgY29udmVyc2lvbiIgaW4gQU9TL1ZTICovCisgICAgICAgIC8qIChhbmQgd2hvIGtub3dzIHdoZXJlIGVsc2UpICovCisKKyNpZmRlZiBJTkFERFJYCisgICAgICAgIGluYWRkcnggPSBpbmV0X2FkZHIoIjEyOC4xMjcuNTAuMSIpOworICAgICAgICByX3NhLnNpbl9hZGRyLnNfYWRkciA9ICoodW5zaWduZWQgbG9uZyAqKSZpbmFkZHJ4OworI2Vsc2UKKyAgICAgICAgcl9zYS5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoIjEyOC4xMjcuNTAuMSIpOworI2VuZGlmIC8qIElOQUREUlggKi8KKyAgICAgICAgcmMgPSBjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnJfc2EsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKyAgICAgICAgaWYgKCFyYykgeyAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgbG9jYWwgYWRkcmVzcyAqLworICAgICAgICAgICAgZ2V0c29ja25hbWUoc29jaywoc3RydWN0IHNvY2thZGRyICopJmxfc2EsJnNsZW4pOworI2lmZGVmIFRDUElQTElCCisgICAgICAgICAgICBzb2NrZXRfY2xvc2Uoc29jayk7ICAgICAgICAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBzb2NrZXQgKi8KKyNlbHNlCisgICAgICAgICAgICBjbG9zZShzb2NrKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgaWYgKGxfc2Euc2luX2FkZHIuc19hZGRyICE9IElOQUREUl9BTlkpIHsKKyAgICAgICAgICAgICAgICBteXhpcGFkZHIgPSBudG9obChsX3NhLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KG15aXBhZGRyLChjaGFyICopaW5ldF9udG9hKGxfc2Euc2luX2FkZHIpLDIwKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJnZXRsb2NhbGlwYWRkciBzZXR0aW5nIGJ1ZiB0byIsbXlpcGFkZHIsMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBnZXRsb2NhbGlwYWRkcnMobXlpcGFkZHIsc2l6ZW9mKG15aXBhZGRyKSwwKTsKKyNlbHNlIC8qIGRhdGFnZW5lcmFsICovCisgICAgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworfQorCitpbnQKK2dldGxvY2FsaXBhZGRycyhidWYsYnVmc3osaW5kZXgpCisgICAgY2hhciAqIGJ1ZjsKKyAgICBpbnQgICAgYnVmc3o7CisgICAgaW50ICAgIGluZGV4OworLyogZ2V0bG9jYWxpcGFkZHJzICovIHsKKyNpZm5kZWYgZGF0YWdlbmVyYWwKKyAgICBjaGFyIGxvY2FsaG9zdFsyNTZdOworICAgIHN0cnVjdCBob3N0ZW50ICogaG9zdD1OVUxMOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBsX3NhOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByX3NhOworICAgIEdTT0NLTkFNRV9UIHNsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKyAgICBpbnQgcmM7CisjaWZkZWYgQ09NTUVOVAorICAgIGludCBzb2NrOworICAgIGNoYXIgbWVzc2FnZUJ1Zls2MF07CisgICAgc3RydWN0IGluX2FkZHIgbGFkZHI7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgbWVtc2V0KCZsX3NhLDAsc2xlbik7CisgICAgbWVtc2V0KCZyX3NhLDAsc2xlbik7CisKKyAgICAvKiBpbml0IGxvY2FsIGFkZHJlc3MgKHRvIHplcm8pICovCisgICAgbF9zYS5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCisjaWZkZWYgQ0tHSE5MSE9TVAorICAgIHJjID0gZ2V0aG9zdG5hbWUobG9jYWxob3N0LCAyNTYpOworICAgIGRlYnVnKEYxMTAsImdldGxvY2FsaXBhZGRycyBsb2NhbGhvc3QiLGxvY2FsaG9zdCwwKTsKKyNlbHNlCisgICAgLyogVGhpcyBkb2Vzbid0IHdvcmsgb24gc29tZSBwbGF0Zm9ybXMsIGUuZy4gU29sYXJpcyAqLworICAgIHJjID0gMDsKKyAgICBsb2NhbGhvc3RbMF0gPSAnXDAnOworI2lmZGVmIE5UCisgICAgaWYgKCB3aW5zb2NrX3ZlcnNpb24gPCAyMCApIHsKKyAgICAgICAgcmMgPSBnZXRob3N0bmFtZShsb2NhbGhvc3QsIDI1Nik7CisgICAgICAgIGRlYnVnKEYxMTAsImdldGxvY2FsaXBhZGRycyBsb2NhbGhvc3QiLGxvY2FsaG9zdCwwKTsKKyAgICB9CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBDS0dITkxIT1NUICovCisgICAgaWYgKCFyYykgeworICAgICAgICAvKiByZXNvbHZlIGhvc3QgbmFtZSBmb3IgbG9jYWwgYWRkcmVzcyAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJnZXRsb2NhbGlwYWRkcnMiLCJjYWxsaW5nIGdldGhvc3RieW5hbWUoKSIsMCk7CisgICAgICAgIGhvc3QgPSBnZXRob3N0YnluYW1lKGxvY2FsaG9zdCk7CisgICAgICAgIGRlYnVnKEYxMTEsImdldGxvY2FsaXBhZGRycyIsImdldGhvc3RieW5hbWUoKSByZXR1cm5lZCIsaG9zdCk7CisgICAgICAgIGlmIChob3N0KSB7CisjaWZkZWYgSEFERFJMSVNUCisgICAgICAgICAgICBob3N0ID0gY2tfY29weWhvc3RlbnQoaG9zdCk7CisgICAgICAgICAgICBpZiAoIGluZGV4IDwgMCB8fCBpbmRleCA+IDYzIHx8ICFob3N0LT5oX2FkZHJfbGlzdFtpbmRleF0gKSB7CisgICAgICAgICAgICAgICAgYnVmWzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbF9zYS5zaW5fYWRkci5zX2FkZHIgPQorICAgICAgICAgICAgICAqKCh1bnNpZ25lZCBsb25nICopIChob3N0LT5oX2FkZHJfbGlzdFtpbmRleF0pKTsKKyAgICAgICAgICAgIGNrc3RybmNweShidWYsKGNoYXIgKilpbmV0X250b2EobF9zYS5zaW5fYWRkciksMjApOworICAgICAgICAgICAgZGVidWcoRjExMCwiZ2V0bG9jYWxpcGFkZHJzIHNldHRpbmcgYnVmIHRvIixidWYsMCk7CisKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAvKiBUaGlzIGlzIGZvciByZXBvcnRpbmcgbXVsdGlwbGUgSVAgQWRkcmVzcyAqLworICAgICAgICAgICAgd2hpbGUgKGhvc3QtPmhfYWRkcl9saXN0ICYmIGhvc3QtPmhfYWRkcl9saXN0WzBdKSB7CisgICAgICAgICAgICAgICAgbF9zYS5zaW5fYWRkci5zX2FkZHIgPQorICAgICAgICAgICAgICAgICAgKigodW5zaWduZWQgbG9uZyAqKSAoaG9zdC0+aF9hZGRyX2xpc3RbMF0pKTsKKyAgICAgICAgICAgICAgICBja3N0cm5jcHkobWVzc2FnZUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopaW5ldF9udG9hKGxfc2Euc2luX2FkZHIpLDYwKTsKKyAgICAgICAgICAgICAgICBpZiAodGNwX2FkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobWVzc2FnZUJ1Zix0Y3BfYWRkcmVzcykpCisgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KG15aXBhZGRyLHRjcF9hZGRyZXNzLDIwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZ2V0bG9jYWxpcGFkZHJzIGlwIGFkZHJlc3MgbGlzdCIsIG1lc3NhZ2VCdWYsIDApOworICAgICAgICAgICAgICAgIGhvc3QtPmhfYWRkcl9saXN0Kys7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2Vsc2UgICAvKiBIQUREUkxJU1QgKi8KKyAgICAgICAgICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnVmWzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbF9zYS5zaW5fYWRkci5zX2FkZHIgPSAqKCh1bnNpZ25lZCBsb25nICopIChob3N0LT5oX2FkZHIpKTsKKyAgICAgICAgICAgIGNrc3RybmNweShidWYsKGNoYXIgKilpbmV0X250b2EobF9zYS5zaW5fYWRkciksYnVmc3opOworICAgICAgICAgICAgZGVidWcoRjExMCwiZ2V0bG9jYWxpcGFkZHJzIHNldHRpbmcgYnVmIHRvIixidWYsMCk7CisjZW5kaWYgIC8qIEhBRERSTElTVCAqLworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9IGVsc2UgZGVidWcoRjExMCwKKyAgICAgICAgICAgICAgICAgICAgICJnZXRsb2NhbGlwYWRkcnM6IGdldGhvc3RieW5hbWUoKSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgbG9jYWxob3N0LAorICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyAgICByZXR1cm4oLTEpOworfQorCisjaWZkZWYgUkxPR0NPREUgICAgICAgICAgICAgICAgIC8qIFRDUC9JUCBSTE9HSU4gcHJvdG9jb2wgc3VwcG9ydCBjb2RlICovCitpbnQKK3Jsb2dfbmF3cygpIHsKKyAgICBzdHJ1Y3QgcmxvZ19uYXdzIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBpZFs0XTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcm93cywgY29scywgeXBpeCwgeHBpeDsKKyAgICB9IG5hd3NidWY7CisKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpCisgICAgICByZXR1cm4gMDsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfUkxPR0lOCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAgICAgJiYgdHRucHJvdG8gIT0gTlBfSzRMT0dJTgorICAgICAgICAmJiB0dG5wcm90byAhPSBOUF9FSzRMT0dJTgorICAgICAgICAmJiB0dG5wcm90byAhPSBOUF9LNUxPR0lOCisgICAgICAgICYmIHR0bnByb3RvICE9IE5QX0VLNUxPR0lOCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyAgICAgICAgICkKKyAgICAgIHJldHVybiAwOworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9OQVdTKSkKKyAgICAgIHJldHVybiAwOworCisgICAgZGVidWcoRjEwMCwicmxvZ2luIFdpbmRvdyBTaXplIHNlbnQiLCIiLDApOworCisgICAgbmF3c2J1Zi5pZFswXSA9IG5hd3NidWYuaWRbMV0gPSAwMzc3OworICAgIG5hd3NidWYuaWRbMl0gPSBuYXdzYnVmLmlkWzNdID0gJ3MnOworI2lmZGVmIE9TMgorICAgIG5hd3NidWYucm93cyA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydCkgKFZzY3JuR2V0SGVpZ2h0KFZURVJNKQorICAgICAgICAgICAgICAgICAgICAgICAgICAtKHR0X3N0YXR1c1tWVEVSTV0/MTowKSkpOworICAgIG5hd3NidWYuY29scyA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydCkgVnNjcm5HZXRXaWR0aChWVEVSTSkpOworI2Vsc2UgLyogT1MyICovCisgICAgbmF3c2J1Zi5yb3dzID0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KSB0dF9yb3dzKTsKKyAgICBuYXdzYnVmLmNvbHMgPSBodG9ucygodW5zaWduZWQgc2hvcnQpIHR0X2NvbHMpOworI2VuZGlmIC8qIE9TMiAqLworICAgIG5hd3NidWYueXBpeCA9IGh0b25zKDApOyAgICAgICAgICAgIC8qIHkgcGl4ZWxzICovCisKKyAgICBuYXdzYnVmLnhwaXggPSBodG9ucygwKTsgICAgICAgICAgICAvKiB4IHBpeGVscyAqLworICAgIGlmICh0dG9sKChDSEFSICopKCZuYXdzYnVmKSwgc2l6ZW9mKG5hd3NidWYpKSA8IDApCisgICAgICByZXR1cm4oLTEpOworICAgIHJldHVybigwKTsKK30KKworI2lmZGVmIE9TMk9SVU5JWAorI2RlZmluZSBSTE9HT1VUQlVGCisjZW5kaWYgLyogT1MyICovCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK3Jsb2dfaW5pKENIQVIgKiBob3N0bmFtZSwgaW50IHBvcnQsCisgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKiBsX2FkZHIsIHN0cnVjdCBzb2NrYWRkcl9pbiAqIHJfYWRkcikKKyNlbHNlIC8qIENLX0FOU0lDICovCitybG9nX2luaShob3N0bmFtZSwgcG9ydCwgbF9hZGRyLCByX2FkZHIpCisgICAgQ0hBUiAqIGhvc3RuYW1lOworICAgIGludCBwb3J0OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqIGxfYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKiByX2FkZHI7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHJsb2dfaW5pICovIHsKKworI2lmZGVmIFJMT0dPVVRCVUYKKyAgICBjaGFyIG91dGJ1Zls1MTJdOworICAgIGludCAgb3V0Ynl0ZXM9MDsKKyNlbmRpZiAvKiBSTE9HT1VUQlVGICovCisgICAgaW50IGZsYWcgPSAwOworI2RlZmluZSBURVJNTEVOIDE2CisjZGVmaW5lIENPTlNQRExFTiAxNgorICAgIENIQVIgbG9jYWx1c2VyW1VJREJVRkxFTisxXTsKKyAgICBDSEFSIHJlbW90ZXVzZXJbVUlEQlVGTEVOKzFdOworICAgIGludCB1c2VybGVuID0gMDsKKyAgICBDSEFSIHRlcm1fc3BlZWRbVEVSTUxFTitDT05TUERMRU4rMV07CisjaWZkZWYgQ09OR1NQRAorICAgIGxvbmcgY29uc3BkID0gLTFMOworI2VuZGlmIC8qIENPTkdTUEQgKi8KKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IHR0X3R5cGUsIG1heF90dDsKKyAgICBleHRlcm4gc3RydWN0IHR0X2luZm9fcmVjIHR0X2luZm9bXTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpbnQgaSwgbjsKKworICAgIGludCByYyA9IDA7CisgICAgdG5fcmVzZXQoKTsgICAgICAgICAgICAgICAgIC8qIFRoaXMgY2FsbCB3aWxsIHJlc2V0IGFsbCBvZiB0aGUgVGVsbmV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wdGlvbnMgYW5kIHRoZW4gcXVpdC4gIFdlIG5lZWQgdG8gZG8gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgc2luY2Ugd2UgdXNlIHRoZSBUZWxuZXQgb3B0aW9ucyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvIGhvbGQgdmFyaW91cyBzdGF0ZSBpbmZvcm1hdGlvbiAgICAgICovCisgICAgZHVwbGV4ID0gMDsgICAgICAgICAgICAgICAgIC8qIFJsb2dpbiBpcyBhbHdheXMgcmVtb3RlIGVjaG8gKi8KKyAgICBybG9nX2luYmFuZCA9IDA7CisKKyNpZmRlZiBDS19UVEdXU0laCisvKgorICBCdXQgY29tcHV0ZSB0aGUgdmFsdWVzIGFueXdheSBiZWZvcmUgdGhlIGZpcnN0IHJlYWQgc2luY2UgdGhlIG91dC0KKyAgb2YtYmFuZCBOQVdTIHJlcXVlc3Qgd291bGQgYXJyaXZlIGJlZm9yZSB0aGUgZmlyc3QgZGF0YSBieXRlIChOVUxMKS4KKyovCisjaWZkZWYgT1MyCisgICAgLyogQ29uc29sZSB0ZXJtaW5hbCBzY3JlZW4gcm93cyBhbmQgY29sdW1ucyAqLworICAgIGRlYnVnKEYxMDEsInJsb2dfaW5pIHR0X3Jvd3MgMSIsIiIsVnNjcm5HZXRIZWlnaHQoVlRFUk0pCisgICAgICAgICAgIC0odHRfc3RhdHVzW1ZURVJNXT8xOjApKTsKKyAgICBkZWJ1ZyhGMTAxLCJybG9nX2luaSB0dF9jb2xzIDEiLCIiLFZzY3JuR2V0V2lkdGgoVlRFUk0pKTsKKyAgICAvKiBOb3Qga25vd24geWV0ICovCisgICAgaWYgKFZzY3JuR2V0V2lkdGgoVlRFUk0pIDwgMCB8fAorICAgICAgICBWc2NybkdldEhlaWdodChWVEVSTSktKHR0X3N0YXR1c1tWVEVSTV0/MTowKSA8IDApIHsKKyAgICAgICAgdHRnd3NpeigpOyAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZ2V0IHNjcmVlbiBkaW1lbnNpb25zICovCisgICAgfQorICAgIGRlYnVnKEYxMDEsCisgICAgICAgICAgInJsb2dfaW5pIHR0X3Jvd3MgMiIsCisgICAgICAgICAgIiIsCisgICAgICAgICAgVnNjcm5HZXRIZWlnaHQoVlRFUk0pLSh0dF9zdGF0dXNbVlRFUk1dPzE6MCkKKyAgICAgICAgICApOworICAgIGRlYnVnKEYxMDEsInJsb2dfaW5pIHR0X2NvbHMgMiIsIiIsVnNjcm5HZXRXaWR0aChWVEVSTSkpOworI2Vsc2UgLyogT1MyICovCisgICAgZGVidWcoRjEwMSwicmxvZ19pbmkgdHRfcm93cyAxIiwiIix0dF9yb3dzKTsKKyAgICBkZWJ1ZyhGMTAxLCJybG9nX2luaSB0dF9jb2xzIDEiLCIiLHR0X2NvbHMpOworICAgIGlmICh0dF9yb3dzIDwgMCB8fCB0dF9jb2xzIDwgMCkgeyAgIC8qIE5vdCBrbm93biB5ZXQgKi8KKyAgICAgICAgdHRnd3NpeigpOyAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZmluZCBvdXQgKi8KKyAgICB9CisgICAgZGVidWcoRjEwMSwicmxvZ19pbmkgdHRfcm93cyAyIiwiIix0dF9yb3dzKTsKKyAgICBkZWJ1ZyhGMTAxLCJybG9nX2luaSB0dF9jb2xzIDIiLCIiLHR0X2NvbHMpOworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKworICAgIHR0Zmx1aSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IGJ5IGZsdXNoaW5nIHRoZSBidWZmZXJzICovCisKKyAgICBybG9nX21vZGUgPSBSTF9DT09LRUQ7CisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIHVzZXIncyBsb2NhbCB1c2VybmFtZSAuLi4gKi8KKworICAgIGxvY2FsdXNlclswXSA9ICdcMCc7CisjaWZkZWYgTlQKKyAgICB7CisgICAgICAgIGNoYXIgbG9jYWx1aWRbVUlEQlVGTEVOKzFdOworICAgICAgICBja3N0cm5jcHkoKGNoYXIgKilsb2NhbHVzZXIsKGNoYXIgKilHZXRMb2NhbFVzZXIoKSxVSURCVUZMRU4pOworICAgIH0KKworICAgIGlmICggIWxvY2FsdXNlclswXSApCisjZW5kaWYgLyogTlQgKi8KKyAgICB7CisgICAgICAgIGNoYXIgKiB1c2VyID0gZ2V0ZW52KCJVU0VSIik7CisgICAgICAgIGlmICghdXNlcikKKyAgICAgICAgICB1c2VyID0gIiI7CisgICAgICAgIHVzZXJsZW4gPSBzdHJsZW4odXNlcik7CisgICAgICAgIGRlYnVnKEYxMTEsInJsb2dpbiBnZXRlbnYoVVNFUikiLHVzZXIsdXNlcmxlbik7CisgICAgICAgIGNrc3RybmNweSgoY2hhciAqKWxvY2FsdXNlcix1c2VyLFVJREJVRkxFTik7CisgICAgICAgIGRlYnVnKEYxMTAsInJsb2dfaW5pIGxvY2FsdXNlciAxIixsb2NhbHVzZXIsMCk7CisgICAgfQorICAgIGlmICggIWxvY2FsdXNlclswXSApCisgICAgICAgIHN0cmNweSgoY2hhciAqKWxvY2FsdXNlciwidW5rbm93biIpOworICAgIGVsc2UgaWYgKGNrX2xjbmFtZSkgeworICAgICAgICBja2xvd2VyKChjaGFyICopbG9jYWx1c2VyKTsKKyAgICAgICAgZGVidWcoRjExMCwicmxvZ19pbmkgbG9jYWx1c2VyIDIiLGxvY2FsdXNlciwwKTsKKyAgICB9CisKKyAgICAvKiBBbmQgdGhlIHVzZXJuYW1lIHRvIGxvZ2luIHdpdGggKi8KKyAgICBpZiAodWlkYnVmWzBdKSB7CisgICAgICAgIGNrc3RybmNweSgoY2hhciAqKXJlbW90ZXVzZXIsdWlkYnVmLFVJREJVRkxFTik7CisgICAgICAgIGRlYnVnKEYxMTAsInJsb2dfaW5pIHJlbW90ZXVzZXIgMSIscmVtb3RldXNlciwwKTsKKyAgICB9IGVsc2UgaWYgKGxvY2FsdXNlclswXSkgeworICAgICAgICBja3N0cm5jcHkoKGNoYXIgKilyZW1vdGV1c2VyLChjaGFyICopbG9jYWx1c2VyLFVJREJVRkxFTik7CisgICAgICAgIGRlYnVnKEYxMTAsInJsb2dfaW5pIHJlbW90ZXVzZXIgMiIscmVtb3RldXNlciwwKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZW1vdGV1c2VyWzBdID0gJ1wwJzsKKyAgICAgICAgZGVidWcoRjExMCwicmxvZ19pbmkgcmVtb3RldXNlciAzIixyZW1vdGV1c2VyLDApOworICAgIH0KKyAgICBpZiAoY2tfbGNuYW1lKQorICAgICAgY2tsb3dlcigoY2hhciAqKXJlbW90ZXVzZXIpOworICAgIGRlYnVnKEYxMTAsInJsb2dfaW5pIHJlbW90ZXVzZXIgNCIscmVtb3RldXNlciwwKTsKKworICAgIC8qIFRoZSBjb21tYW5kIHRvIGlzc3VlIGlzIHRoZSB0ZXJtaW5hbCB0eXBlIGFuZCBzcGVlZCAqLworICAgIHRlcm1fc3BlZWRbMF0gPSAnXDAnOworICAgIGlmICh0bl90ZXJtKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBURUxORVQgVEVSTUlOQUwtVFlQRSB2YWx1ZSAqLworICAgICAgICBpZiAoKnRuX3Rlcm0pIHsgICAgICAgICAgICAgICAgIC8qIChpZiBhbnkpIHRha2VzIHByZWNlZGVuY2UuICovCisgICAgICAgICAgICBja3N0cm5jcHkoKGNoYXIgKil0ZXJtX3NwZWVkLCB0bl90ZXJtLCBURVJNTEVOKTsKKyAgICAgICAgICAgIGZsYWcgPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIHRoZSBsb2NhbCB0ZXJtaW5hbCB0eXBlICovCisjaWZkZWYgT1MyCisgICAgICAgIC8qIEluIHRlcm1pbmFsLWVtdWxhdGluZyB2ZXJzaW9ucywgaXQncyB0aGUgU0VUIFRFUk0gVFlQRSB2YWx1ZSAqLworICAgICAgICBja3N0cm5jcHkodGVybV9zcGVlZCwgKHR0X3R5cGUgPj0gMCAmJiB0dF90eXBlIDw9IG1heF90dCkgPworICAgICAgICAgICAgICAgIHR0X2luZm9bdHRfdHlwZV0ueF9uYW1lIDogIm5ldHdvcmsiLCBURVJNTEVOKTsKKyNlbHNlCisgICAgICAgIC8qIEluIHRoZSBvdGhlcnMsIHdlIGp1c3QgbG9vayBhdCB0aGUgVEVSTSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworICAgICAgICB7CisgICAgICAgICAgICBjaGFyICpwID0gZ2V0ZW52KCJURVJNIik7CisgICAgICAgICAgICBpZiAocCkKKyAgICAgICAgICAgICAgY2tzdHJuY3B5KChjaGFyICopdGVybV9zcGVlZCxwLFRFUk1MRU4pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB0ZXJtX3NwZWVkWzBdID0gJ1wwJzsKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgIGZvciAocCA9IChjaGFyICopIHRlcm1fc3BlZWQ7ICpwOyBwKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gJy0nICYmICghc3RyY21wKHAsIi04MCIpIHx8ICFzdHJjbXAocCwiLTEzMiIpKSkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzdXBwZXIoKnApKQorICAgICAgICAgICAgICAgICAgKnAgPSB0b2xvd2VyKCpwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwID0gJ1wwJzsKKyNlbmRpZiAvKiBWTVMgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIE9TMiAqLworICAgIH0KKyAgICBuID0gc3RybGVuKChjaGFyICopdGVybV9zcGVlZCk7CisgICAgaWYgKG4gPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBhIHRlcm1pbmFsIHR5cGUgKi8KKyAgICAgICAgaWYgKCFmbGFnKSB7ICAgICAgICAgICAgICAgICAgICAvKiBJZiBub3QgdXNlci1zcGVjaWZpZWQgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspICAgICAvKiB0aGVuIGxvd2VyY2FzZSBpdC4gICAgKi8KKyAgICAgICAgICAgICAgaWYgKGlzdXBwZXIodGVybV9zcGVlZFtpXSkpCisgICAgICAgICAgICAgICAgdGVybV9zcGVlZFtpXSA9IHRvbG93ZXIodGVybV9zcGVlZFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjExMCwicmxvZ19pbmkgdGVybV9zcGVlZCAxIix0ZXJtX3NwZWVkLDApOworCisjaWZkZWYgQ09OR1NQRAorICAgICAgICAvKiBjb25zcGQoKSBpcyBub3QgeWV0IGRlZmluZWQgaW4gYWxsIGNrKnRpby5jIG1vZHVsZXMgKi8KKyAgICAgICAgY29uc3BkID0gY29uZ3NwZCgpOworICAgICAgICBpZiAoY29uc3BkID4gMEwpIHsKKyAgICAgICAgICAgIGNrc3RybmNhdCgoY2hhciAqKXRlcm1fc3BlZWQsIi8iLHNpemVvZih0ZXJtX3NwZWVkKSk7CisgICAgICAgICAgICBja3N0cm5jYXQoKGNoYXIgKil0ZXJtX3NwZWVkLGNrbHRvYShjb25zcGQpLHNpemVvZih0ZXJtX3NwZWVkKSk7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENPTkdTUEQgKi8KKyAgICAgICAgICBja3N0cm5jYXQoKGNoYXIgKil0ZXJtX3NwZWVkLCIvMTkyMDAiLHNpemVvZih0ZXJtX3NwZWVkKSk7CisgICAgICAgIGRlYnVnKEYxMTAsInJsb2dfaW5pIHRlcm1fc3BlZWQgMiIsdGVybV9zcGVlZCwwKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXJtX3NwZWVkWzBdID0gJ1wwJzsKKyAgICAgICAgZGVidWcoRjExMCwicmxvZ19pbmkgdGVybV9zcGVlZCAzIix0ZXJtX3NwZWVkLDApOworICAgIH0KKworI2lmZGVmIENLX0tFUkJFUk9TCisgICAgaWYgKHR0bnByb3RvID09IE5QX0s0TE9HSU4gfHwgdHRucHJvdG8gPT0gTlBfRUs0TE9HSU4gfHwKKyAgICAgICAgdHRucHJvdG8gPT0gTlBfSzVMT0dJTiB8fCB0dG5wcm90byA9PSBOUF9FSzVMT0dJTikgeworICAgICAgICBpbnQga3ZlciwgZW5jcnlwdCwgcmM7CisgICAgICAgIHN3aXRjaCAodHRucHJvdG8pIHsKKyAgICAgICAgICBjYXNlIE5QX0s0TE9HSU46CisgICAgICAgICAgICBrdmVyID0gNDsKKyAgICAgICAgICAgIGVuY3J5cHQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBOUF9FSzRMT0dJTjoKKyAgICAgICAgICAgIGt2ZXIgPSA0OworICAgICAgICAgICAgZW5jcnlwdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIE5QX0s1TE9HSU46CisgICAgICAgICAgICBrdmVyID0gNTsKKyAgICAgICAgICAgIGVuY3J5cHQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBOUF9FSzVMT0dJTjoKKyAgICAgICAgICAgIGt2ZXIgPSA1OworICAgICAgICAgICAgZW5jcnlwdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGt2ZXIgPSAwOworICAgICAgICAgICAgZW5jcnlwdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBja19rcmJfcmxvZ2luKGhvc3RuYW1lLCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWx1c2VyLCByZW1vdGV1c2VyLCB0ZXJtX3NwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9hZGRyLCByX2FkZHIsIGt2ZXIsIGVuY3J5cHQpOworICAgICAgICBpZiAoIXJjKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIHN1Y2Nlc3MgKi8KKyAgICAgICAgICAgIFRFTE9QVF9NRShURUxPUFRfTkFXUykgPSAxOworICAgICAgICAgICAgcmMgPSBybG9nX25hd3MoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ocmMpOworICAgIH0gZWxzZQorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisgICAgaWYgKHR0bnByb3RvID09IE5QX1JMT0dJTikgeworI2lmZGVmIFJMT0dPVVRCVUYKKyAgICAgICAgLyoKKyAgICAgICAgICogIFRoZSByY21kcyBzdGFydCB0aGUgY29ubmVjdGlvbiB3aXRoIGEgc2VyaWVzIG9mIGluaXQgZGF0YToKKyAgICAgICAgICoKKyAgICAgICAgICogICAgYSBwb3J0IG51bWJlciB1cG9uIHdoaWNoIGNsaWVudCBpcyBsaXN0ZW5pbmcgZm9yIHN0ZGVyciBkYXRhCisgICAgICAgICAqICAgIHRoZSB1c2VyJ3MgbmFtZSBvbiB0aGUgY2xpZW50IG1hY2hpbmUKKyAgICAgICAgICogICAgdGhlIHVzZXIncyBuYW1lIG9uIHRoZSBzZXJ2ZXIgbWFjaGluZQorICAgICAgICAgKiAgICB0aGUgdGVybWluYWxfdHlwZS9zcGVlZCBvciBjb21tYW5kIHRvIGV4ZWN1dGUKKyAgICAgICAgICovCisgICAgICAgIG91dGJ1ZltvdXRieXRlcysrXSA9IDA7CisgICAgICAgIHN0cmNweSgoY2hhciAqKW91dGJ1ZitvdXRieXRlcywoY2hhciAqKWxvY2FsdXNlcik7CisgICAgICAgIG91dGJ5dGVzICs9IHN0cmxlbigoY2hhciAqKWxvY2FsdXNlcikgKyAxOworICAgICAgICBzdHJjcHkoKGNoYXIgKilvdXRidWYrb3V0Ynl0ZXMsKGNoYXIgKilyZW1vdGV1c2VyKTsKKyAgICAgICAgb3V0Ynl0ZXMgKz0gc3RybGVuKChjaGFyICopcmVtb3RldXNlcikgKyAxOworICAgICAgICBzdHJjcHkoKGNoYXIgKilvdXRidWYrb3V0Ynl0ZXMsKGNoYXIgKil0ZXJtX3NwZWVkKTsKKyAgICAgICAgb3V0Ynl0ZXMgKz0gc3RybGVuKChjaGFyICopdGVybV9zcGVlZCkgKyAxOworICAgICAgICByYyA9IHR0b2woKENIQVIgKilvdXRidWYsb3V0Ynl0ZXMpOworI2Vsc2UgLyogUkxPR09VVEJVRiAqLworICAgICAgICB0dG9jKDApOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlbmQgYW4gaW5pdGlhbCBOVUwgYXMgd2FrZS11cCAqLworICAgICAgICAvKiBTZW5kIGVhY2ggdmFyaWFibGUgd2l0aCB0aGUgdHJhaWxpbmcgTlVMICovCisgICAgICAgIHJjID0gdHRvbChsb2NhbHVzZXIsc3RybGVuKChjaGFyICopbG9jYWx1c2VyKSsxKTsKKyAgICAgICAgaWYgKHJjID4gMCkKKyAgICAgICAgICByYyA9IHR0b2wocmVtb3RldXNlcixzdHJsZW4oKGNoYXIgKilyZW1vdGV1c2VyKSsxKTsKKyAgICAgICAgaWYgKHJjID4gMCkKKyAgICAgICAgICByYyA9IHR0b2wodGVybV9zcGVlZCxzdHJsZW4oKGNoYXIgKil0ZXJtX3NwZWVkKSsxKTsKKyNlbmRpZiAvKiBSTE9HT1VUQlVGICovCisKKyAgICAgICAgLyogTm93IHdlIGFyZSBzdXBwb3NlZCB0byBnZXQgYmFjayBhIHNpbmdsZSBOVUwgYXMgY29uZmlybWF0aW9uICovCisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgcmMgPSB0dGluYyg2MCk7CisgICAgICAgIGRlYnVnKEYxMDEsInJsb2dpbiBmaXJzdCB0dGluYyIsIiIscmMpOworICAgICAgICBpZiAocmMgPiAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJybG9naW4gdHRpbmMgMSIsIiIscmMpOworICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgIlJsb2dpbiBwcm90b2NvbCBlcnJvciAtIDB4JXggcmVjZWl2ZWQgaW5zdGVhZCBvZiAweDAwXG4iLCByYyk7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9IGVsc2UgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgZGVidWcoRjEwMSwicmxvZ2luIHR0aW5jIGVycm5vIiwiIixlcnJubyk7CisgICAgICAgICAgICAvKiBwcmludGYoIk5ldHdvcmsgZXJyb3I6ICVkXG4iLCBlcnJubyk7ICovCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworLyogdHdvIGNvbnRyb2wgbWVzc2FnZXMgYXJlIGRlZmluZWQ6CisKKyAgIGEgZG91YmxlIGZsYWcgYnl0ZSBvZiAnbycgaW5kaWNhdGVzIGEgb25lLWJ5dGUgbWVzc2FnZSB3aGljaCBpcworICAgaWRlbnRpY2FsIHRvIHdoYXQgd2FzIG9uY2UgY2FycmllZCBvdXQgb2YgYmFuZC4KKworICAgYSBkb3VibGUgZmxhZyBieXRlIG9mICdxJyBpbmRpY2F0ZXMgYSB6ZXJvLWJ5dGUgbWVzc2FnZS4gIFRoaXMKKyAgIG1lc3NhZ2UgaXMgaW50ZXJwcmV0ZWQgYXMgdHdvIFwzNzcgZGF0YSBieXRlcy4gIFRoaXMgaXMganVzdCBhCisgICBxdW90ZSBydWxlIHNvIHRoYXQgYmluYXJ5IGRhdGEgZnJvbSB0aGUgc2VydmVyIGRvZXMgbm90IGNvbmZ1c2UgdGhlCisgICBjbGllbnQuICAqLworCitpbnQgCitybG9nX2N0cmwoY3AsIG4pCisgICAgIHVuc2lnbmVkIGNoYXIgKmNwOworICAgICBpbnQgbjsKK3sKKyAgICBpZiAoKG4gPj0gNSkgJiYgKGNwWzJdID09ICdvJykgJiYgKGNwWzNdID09ICdvJykpIHsKKyAgICAgICAgaWYgKHJsb2dfb29iKCZjcFs0XSwxKSkKKyAgICAgICAgICAgIHJldHVybigtNSk7CisgICAgICAgIHJldHVybig1KTsKKyAgICB9IGVsc2UgaWYgKChuID49IDQpICYmIChjcFsyXSA9PSAncScpICYmIChjcFszXSA9PSAncScpKSB7CisgICAgICAgIC8qIHRoaXMgaXMgc29tZXdoYXQgb2YgYSBoYWNrICovCisgICAgICAgIGNwWzJdID0gJ1wzNzcnOworICAgICAgICBjcFszXSA9ICdcMzc3JzsKKyAgICAgICAgcmV0dXJuKDIpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQKK3Jsb2dfb29iKG9vYmRhdGEsIGNvdW50KSBDSEFSICogb29iZGF0YTsgaW50IGNvdW50OyB7CisgICAgaW50IGk7CisgICAgaW50IGZsdXNoID0gMDsKKworICAgIGRlYnVnKEYxMTEsInJsb2dpbiBvdXRfb2ZfYmFuZCIsImNvdW50Iixjb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpPGNvdW50OyBpKyspICAgeworICAgICAgICBkZWJ1ZyhGMTAxLCJybG9naW4gb3V0X29mX2JhbmQiLCIiLG9vYmRhdGFbaV0pOworICAgICAgICAgICAgICAgIGlmIChvb2JkYXRhW2ldICYgMHgwMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChvb2JkYXRhW2ldICYgMHgwMikgeyAvKiBGbHVzaCBCdWZmZXJlZCBEYXRhIG5vdCB5ZXQgZGlzcGxheWVkICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJybG9naW4gRmx1c2ggQnVmZmVyZWQgRGF0YSBjb21tYW5kIiwiIixvb2JkYXRhW2ldKTsKKworICAgICAgICAgICAgLyogT25seSBmbHVzaCB0aGUgZGF0YSBpZiBpbiBmYWN0IHdlIGFyZSBpbiBhIG1vZGUgdGhhdCB3b24ndCAqLworICAgICAgICAgICAgLyogZ2V0IG91dCBvZiBzeW5jLiAgSWUsIG5vdCB3aGVuIHdlIGFyZSBpbiBwcm90b2NvbCBtb2RlLiAgICAqLworICAgICAgICAgICAgc3dpdGNoICggd2hhdCApIHsKKyAgICAgICAgICAgIGNhc2UgV19OT1RISU5HOgorICAgICAgICAgICAgY2FzZSBXX0NPTk5FQ1Q6CisgICAgICAgICAgICBjYXNlIFdfQ09NTUFORDoKKyAgICAgICAgICAgICAgICBpZiAoIHJsb2dfaW5iYW5kICkKKyAgICAgICAgICAgICAgICAgICAgZmx1c2ggPSAxOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdHRmbHVpKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9vYmRhdGFbaV0gJiAweDEwKSB7ICAgICAgICAvKiBTd2l0Y2ggdG8gUkFXIG1vZGUgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInJsb2dpbiBSYXcgTW9kZSBjb21tYW5kIiwiIixvb2JkYXRhW2ldKTsKKyAgICAgICAgICAgIHJsb2dfbW9kZSA9IFJMX1JBVzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvb2JkYXRhW2ldICYgMHgyMCkgeyAgICAgICAgLyogU3dpdGNoIHRvIENPT0tFRCBtb2RlICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJybG9naW4gQ29va2VkIE1vZGUgY29tbWFuZCIsIiIsb29iZGF0YVtpXSk7CisgICAgICAgICAgICBybG9nX21vZGUgPSBSTF9DT09LRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9vYmRhdGFbaV0gJiAweDgwKQorICAgICAgICB7ICAgICAgICAvKiBTZW5kIFdpbmRvdyBTaXplIEluZm8gKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInJsb2dpbiBXaW5kb3cgU2l6ZSBjb21tYW5kIiwiIixvb2JkYXRhW2ldKTsKKyAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRvIHNlbmQgV1MgSW5mbyB3aGVuIFdpbmRvdyBTaXplIGNoYW5nZXMgKi8KKyAgICAgICAgICAgIGlmICggIVRFTE9QVF9NRShURUxPUFRfTkFXUykgKSB7CisgICAgICAgICAgICAgICAgVEVMT1BUX01FKFRFTE9QVF9OQVdTKSA9IDE7CisgICAgICAgICAgICAgICAgcmxvZ19uYXdzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKGZsdXNoKTsKK30KKyNpZm5kZWYgVENQSVBMSUIKK3N0YXRpYyBTSUdUWVAKK3Jsb2dvb2JoKHNpZykgaW50IHNpZzsgeworI2lmZGVmIFNPTEFSSVMKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPciBzaG91bGQgaXQgYmUgY2hhciBmb3IgYWxsPyAqLworI2Vsc2UKKyAgICBDSEFSCisjZW5kaWYgLyogU09MQVJJUyAqLworICAgICAgb29iZGF0YTsKKworICAgIC8qIGludCAgY291bnQgPSAwOyAqLyAvKiAobm90IHVzZWQpICovCisKKyAgICB3aGlsZSAocmVjdih0dHlmZCwgJm9vYmRhdGEsIDEsIE1TR19PT0IpIDwgMCkgeworICAgICAgLyoKKyAgICAgICAqIFdlIG5lZWQgdG8gZG8gc29tZSBzcGVjaWFsIHByb2Nlc3NpbmcgaGVyZS4KKyAgICAgICAqIEp1c3QgaW4gY2FzZSB0aGUgc29ja2V0IGlzIGJsb2NrZWQgZm9yIGlucHV0CisgICAgICAgKgorICAgICAgICovCisgICAgICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgICAgICBjYXNlIEVXT1VMREJMT0NLOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJybG9naW4gb3V0X29mX2JhbmQiLCIiLG9vYmRhdGEpOworICAgIGlmIChvb2JkYXRhID09IDB4MDIpIHsgICAgICAvKiBGbHVzaCBCdWZmZXJlZCBEYXRhIG5vdCB5ZXQgZGlzcGxheWVkICovCisgICAgICAgIGRlYnVnKEYxMDEsInJsb2dpbiBGbHVzaCBCdWZmZXJlZCBEYXRhIGNvbW1hbmQiLCIiLG9vYmRhdGEpOworICAgICAgICBuZXRmbHVpKCk7CisgICAgfQorICAgIGlmIChvb2JkYXRhICYgMHgxMCkgeyAgICAgICAgICAgICAgIC8qIFN3aXRjaCB0byByYXcgbW9kZSAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJybG9naW4gUmF3IE1vZGUgY29tbWFuZCIsIiIsb29iZGF0YSk7CisgICAgICAgIHJsb2dfbW9kZSA9IFJMX1JBVzsKKyAgICB9CisgICAgaWYgKG9vYmRhdGEgJiAweDIwKSB7ICAgICAgICAgICAgICAgLyogU3dpdGNoIHRvIGNvb2tlZCBtb2RlICovCisgICAgICAgIGRlYnVnKEYxMDEsInJsb2dpbiBDb29rZWQgTW9kZSBjb21tYW5kIiwiIixvb2JkYXRhKTsKKyAgICAgICAgcmxvZ19tb2RlID0gUkxfQ09PS0VEOworICAgIH0KKyAgICBpZiAob29iZGF0YSAmIDB4ODApIHsgICAgICAgICAgICAgICAgIC8qIFNlbmQgV2luZG93IFNpemUgSW5mbyAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJybG9naW4gV2luZG93IFNpemUgY29tbWFuZCIsIiIsb29iZGF0YSk7CisgICAgICAgIC8qIFJlbWVtYmVyIHRvIHNlbmQgV1MgSW5mbyB3aGVuIFdpbmRvdyBTaXplIGNoYW5nZXMgKi8KKyAgICAgICAgaWYgKCAhVEVMT1BUX01FKFRFTE9QVF9OQVdTKSApIHsKKyAgICAgICAgICAgIFRFTE9QVF9NRShURUxPUFRfTkFXUykgPSAxOworICAgICAgICAgICAgcmxvZ19uYXdzKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworCisvKiBTZW5kIG5ldHdvcmsgQlJFQUsgKi8KKy8qCisgIFJldHVybnMgLTEgb24gZXJyb3IsIDAgaWYgbm90aGluZyBoYXBwZW5zLCAxIGlmIEJSRUFLIHNlbnQgc3VjY2Vzc2Z1bGx5LgorKi8KK2ludAorbmV0YnJlYWsoKSB7CisgICAgQ0hBUiBidWZbM107CisgICAgaWYgKHR0bmV0ID09IE5FVF9UQ1BCKSB7CisgICAgICAgIGlmICh0dG5wcm90byA9PSBOUF9URUxORVQpIHsKKyNpZmRlZiBUTkNPREUKKyAgICAgICAgICAgIGJ1ZlswXSA9IChDSEFSKSBJQUM7IGJ1ZlsxXSA9IChDSEFSKSBCUkVBSzsgYnVmWzJdID0gKENIQVIpIDA7CisgICAgICAgICAgICBpZiAoCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgbmV0dG9sKChjaGFyICopIGJ1ZiwgMikKKyNlbHNlCisgICAgICAgICAgICAgICAgdHRvbChidWYsIDIpCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgPCAyKQorICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMgfHwgZGVibG9nKSB7CisgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgdG5fbXNnW107CisgICAgICAgICAgICAgICAgY2ttYWttc2codG5fbXNnLFROX01TR19MRU4sIlRFTE5FVCBTRU5UICIsVEVMQ01EKEJSRUFLKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLHRuX21zZywiIixCUkVBSyk7CisgICAgICAgICAgICAgICAgaWYgKGRlYnNlcyB8fCB0bl9kZWIpIHRuX2RlYnVnKHRuX21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oMSk7CisjZWxzZQorICAgICAgICAgICAgZGVidWcoRjEwMCwibmV0YnJlYWsgbm8gVE5DT0RFIiwiIiwwKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICAgICAgfQorICAgICAgICAvKiBJbnNlcnQgb3RoZXIgVENQL0lQIHByb3RvY29scyBoZXJlICovCisgICAgfQorICAgIC8qIEluc2VydCBvdGhlciBuZXR3b3JrcyBoZXJlICovCisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIE5FVENPTk4gKi8KKworCisjaWZkZWYgTkVUQ09OTgorI2lmZGVmIFNVTlgyNQorLyoKKyAgU3VuTGluayBYLjI1IHN1cHBvcnQgYnkgTWFyY2VsbG8gRnJ1dGlnLCBDYXRob2xpYyBVbml2ZXJzaXR5LAorICBSaW8gZGUgSmFuZWlybywgQnJhemlsLCAxOTkwLgorKi8KKworLyogUEFEIFguMywgWC4yOCBhbmQgWC4yOSBzdXBwb3J0ICovCisKK3N0YXRpYyBDSEFSIHgyOWVycltNQVhQQURQQVJNUyszXSA9IHsgWDI5X0VSUk9SLCBJTlZBTElEX1BBRF9QQVJNLCAnXDAnIH07CisKKy8qIEluaXRpYWxpemUgUEFEICovCisKK2V4dGVybiBDSEFSIHBhZHBhcm1zW107CisKK1ZPSUQKK2luaXRwYWQoKSB7CisgIHBhZHBhcm1zW1BBRF9CUkVBS19DSEFSQUNURVJdICAgICAgICA9IDA7ICAvKiBCcmVhayBjaGFyYWN0ZXIgKi8KKyAgcGFkcGFybXNbUEFEX0VTQ0FQRV0gICAgICAgICAgICAgICAgID0gMTsgIC8qIEVzY2FwZSBwZXJtaXR0ZWQgKi8KKyAgcGFkcGFybXNbUEFEX0VDSE9dICAgICAgICAgICAgICAgICAgID0gMTsgIC8qIEtlcm1pdCBQQUQgZG9lcyBlY2hvICovCisgIHBhZHBhcm1zW1BBRF9EQVRBX0ZPUldBUkRfQ0hBUl0gICAgICA9IDI7ICAvKiBmb3J3YXJkIGNoYXJhY3RlciBDUiAqLworICBwYWRwYXJtc1tQQURfREFUQV9GT1JXQVJEX1RJTUVPVVRdICAgPSAwOyAgLyogbm8gdGltZW91dCBmb3J3YXJkIGNvbmRpdGlvbiAqLworICBwYWRwYXJtc1tQQURfRkxPV19DT05UUk9MX0JZX1BBRF0gICAgPSAwOyAgLyogbm90IHVzZWQgKi8KKyAgcGFkcGFybXNbUEFEX1NVUFBSRVNTSU9OX09GX1NJR05BTFNdID0gMTsgIC8qIGFsbG93IFBBRCBzZXJ2aWNlIHNpZ25hbHMgKi8KKyAgcGFkcGFybXNbUEFEX0JSRUFLX0FDVElPTl0gICAgICAgICAgID0gMjE7IC8qIGJyayBhY3Rpb246IElOVCBwayArIGJyayBpbmQqLworICBwYWRwYXJtc1tQQURfU1VQUFJFU1NJT05fT0ZfREFUQV0gICAgPSAwOyAgLyogbm8gc3VwcmVzc2lvbiBvZiB1c2VyIGRhdGEgKi8KKyAgcGFkcGFybXNbUEFEX1BBRERJTkdfQUZURVJfQ1JdICAgICAgID0gMDsgIC8qIG5vIHBhZGRpbmcgYWZ0ZXIgQ1IgKi8KKyAgcGFkcGFybXNbUEFEX0xJTkVfRk9MRElOR10gICAgICAgICAgID0gMDsgIC8qIG5vIGxpbmUgZm9sZCAqLworICBwYWRwYXJtc1tQQURfTElORV9TUEVFRF0gICAgICAgICAgICAgPSAwOyAgLyogbGluZSBzcGVlZCAtIGRvbid0IGNhcmUgKi8KKyAgcGFkcGFybXNbUEFEX0ZMT1dfQ09OVFJPTF9CWV9VU0VSXSAgID0gMDsgIC8qIGZsb3cgY29udCBvZiBQQUQgLSBub3QgdXNlZCAqLworICBwYWRwYXJtc1tQQURfTEZfQUZURVJfQ1JdICAgICAgICAgICAgPSAwOyAgLyogbm8gTEYgaW5zZXJ0aW9uIGFmdGVyIENSICovCisgIHBhZHBhcm1zW1BBRF9QQURESU5HX0FGVEVSX0xGXSAgICAgICA9IDA7ICAvKiBubyBwYWRkaW5nIGFmdGVyIExGICovCisgIHBhZHBhcm1zW1BBRF9FRElUSU5HXSAgICAgICAgICAgICAgICA9IDE7ICAvKiBjYW4gZWRpdCAqLworICBwYWRwYXJtc1tQQURfQ0hBUl9ERUxFVEVfQ0hBUl0gICAgICAgPSA4OyAgLyogY2hhcmFjdGVyIGRlbGV0ZSBjaGFyYWN0ZXIgKi8KKyAgcGFkcGFybXNbUEFEX0JVRkZFUl9ERUxFVEVfQ0hBUl0gICAgID0gMjE7IC8qIGJ1ZmZlciBkZWxldGUgY2hhcmFjdGVyICovCisgIHBhZHBhcm1zW1BBRF9CVUZGRVJfRElTUExBWV9DSEFSXSAgICA9IDE4OyAvKiBidWZmZXIgZGlzcGxheSBjaGFyYWN0ZXIgKi8KK30KKworLyogU2V0IFBBRCBwYXJhbWV0ZXJzICovCisKK1ZPSUQKK3NldHBhZChzLG4pIENIQVIgKnM7IGludCBuOyB7CisgICAgaW50IGk7CisgICAgQ0hBUiAqcHMgPSBzOworCisgICAgaWYgKG4gPCAxKSB7CisgICAgICAgIGluaXRwYWQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKnBzID4gTUFYUEFEUEFSTVMpCisgICAgICAgICAgICAgIHgyOWVycltpKzJdID0gKnBzOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwYWRwYXJtc1sqcHNdID0gKihwcysxKTsKKyAgICAgICAgICAgIHBzICs9IDI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFJlYWQgUEFEIHBhcmFtZXRlcnMgKi8KKworVk9JRAorcmVhZHBhZChzLG4scikgQ0hBUiAqczsgaW50IG47IENIQVIgKnI7IHsKKyAgICBpbnQgaTsKKyAgICBDSEFSICpwcyA9IHM7CisgICAgQ0hBUiAqcHIgPSByOworCisgICAgKnByKysgPSBYMjlfUEFSQU1FVEVSX0lORElDQVRJT047CisgICAgaWYgKG4gPiAwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyssIHBzKyspIHsKKyAgICAgICAgICAgIGlmICgqcHMgPiBNQVhQQURQQVJNUykgeworICAgICAgICAgICAgICAgIHgyOWVycltpKzJdID0gKnBzKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpwcisrID0gKnBzOworICAgICAgICAgICAgICAgICpwcisrID0gcGFkcGFybXNbKnBzKytdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IE1BWFBBRFBBUk1TOyBpKyspIHsKKyAgICAgICAgICAgICpwcisrID0gaTsKKyAgICAgICAgICAgICpwcisrID0gcGFkcGFybXNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludAorcWJpdHBrdChzLG4pIENIQVIgKnM7IGludCBuOyB7CisgICAgQ0hBUiAqcHMgPSBzOworICAgIGludCB4MjljbWQgPSAqcHM7CisgICAgQ0hBUiAqcHNhID0gcysxOworICAgIENIQVIgeDI5cmVzcFsoTUFYUEFEUEFSTVMqMikrMV07CisKKyAgICBzd2l0Y2ggKHgyOWNtZCkgeworCisgICAgICAgIGNhc2UgWDI5X1NFVF9QQVJNUzoKKyAgICAgICAgICAgIHNldHBhZCAocHMrMSxuLzIpOworICAgICAgICAgICAgaWYgKChpbnQpc3RybGVuKChjaGFyICopeDI5ZXJyKSA+IDIpIHsKKyAgICAgICAgICAgICAgICB0dG9sKHgyOWVyciwoaW50KXN0cmxlbigoY2hhciAqKXgyOWVycikpOworICAgICAgICAgICAgICAgIHgyOWVyclsyXSA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKC0yKTsKKyAgICAgICAgY2FzZSBYMjlfUkVBRF9QQVJNUzoKKyAgICAgICAgICAgIHJlYWRwYWQgKHBzKzEsbi8yLHgyOXJlc3ApOworICAgICAgICAgICAgc2V0cWJpdCAoKTsKKyAgICAgICAgICAgIHR0b2woeDI5cmVzcCwobj4xKT8obisxKTooMipNQVhQQURQQVJNUysxKSk7CisgICAgICAgICAgICBpZiAoKGludClzdHJsZW4oKGNoYXIgKil4MjllcnIpID4gMikgeworICAgICAgICAgICAgICAgIHR0b2woeDI5ZXJyLChpbnQpc3RybGVuKChjaGFyICopeDI5ZXJyKSk7CisgICAgICAgICAgICAgICAgeDI5ZXJyWzJdID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc2V0cWJpdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWDI5X1NFVF9BTkRfUkVBRF9QQVJNUzoKKyAgICAgICAgICAgIHNldHBhZCAocHMrMSxuLzIpOworICAgICAgICAgICAgcmVhZHBhZCAocHMrMSxuLzIseDI5cmVzcCk7CisgICAgICAgICAgICBzZXRxYml0KCk7CisgICAgICAgICAgICB0dG9sKHgyOXJlc3AsKG4+MSk/KG4rMSk6KDIqTUFYUEFEUEFSTVMrMSkpOworICAgICAgICAgICAgaWYgKChpbnQpc3RybGVuKChjaGFyICopeDI5ZXJyKSA+IDIpIHsKKyAgICAgICAgICAgICAgICB0dG9sICh4MjllcnIsKGludClzdHJsZW4oKGNoYXIgKil4MjllcnIpKTsKKyAgICAgICAgICAgICAgICB4MjllcnIgWzJdID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc2V0cWJpdCgpOworICAgICAgICAgICAgcmV0dXJuICgtMik7CisgICAgICAgIGNhc2UgWDI5X0lOVklUQVRJT05fVE9fQ0xFQVI6CisgICAgICAgICAgICAoVk9JRCkgeDI1Y2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICBjYXNlIFgyOV9JTkRJQ0FUSU9OX09GX0JSRUFLOgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKKy8qIFBBRCBicmVhayBhY3Rpb24gcHJvY2Vzc29yICovCisKK1ZPSUQKK2JyZWFrYWN0KCkgeworICAgIGV4dGVybiBjaGFyIHgyNW9idWZbTUFYT1gyNV07CisgICAgZXh0ZXJuIGludCBvYnVmbDsKKyAgICBleHRlcm4gaW50IGFjdGl2ZTsKKyAgICBleHRlcm4gdW5zaWduZWQgY2hhciB0b3NlbmQ7CisgICAgc3RhdGljIENIQVIgaW5kYnJrWzNdID0geworICAgICAgICBYMjlfSU5ESUNBVElPTl9PRl9CUkVBSywKKyAgICAgICAgUEFEX1NVUFBSRVNTSU9OX09GX0RBVEEsCisgICAgICAgIDEKKyAgICB9OworICAgIENIQVIgaW50dWRhdCwgY2F1c2UsIGRpYWc7CisKKyAgICBpZiAoeDI1c3RhdCgpIDwgMCkgcmV0dXJuOyAgLyogSWdub3JlIGlmIG5vIHZpcnR1YWwgY2FsbCBlc3RhYmxpc2hlZCAqLworCisgICAgaWYgKHBhZHBhcm1zW1BBRF9CUkVBS19BQ1RJT05dICE9IDApIC8qIEZvcndhcmQgY29uZGl0aW9uICovCisgICAgICAgIGlmICh0dG9sKChDSEFSICopeDI1b2J1ZixvYnVmbCkgPCAwKSB7CisgICAgICAgICAgICBwZXJyb3IgKCJcclxuQ2FuJ3Qgc2VuZCBjaGFyYWN0ZXJzIik7CisgICAgICAgICAgICBhY3RpdmUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnplcm8gKHgyNW9idWYsc2l6ZW9mKHgyNW9idWYpKTsKKyAgICAgICAgICAgIG9idWZsID0gMDsKKyAgICAgICAgICAgIHRvc2VuZCA9IDA7CisgICAgICAgIH07CisKKyAgICBzd2l0Y2ggKHBhZHBhcm1zW1BBRF9CUkVBS19BQ1RJT05dKSB7CisKKyAgICAgICBjYXNlIDAgOiBicmVhazsgICAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovCisgICAgICAgY2FzZSAxIDogLyogc2VuZCBpbnRlcnJ1cHQgcGFja2V0IHdpdGggaW50ZXJydXB0IHVzZXIgZGF0YSBmaWVsZCA9IDEgKi8KKyAgICAgICAgICAgICAgICBpbnR1ZGF0ID0gMTsKKyAgICAgICAgICAgICAgICB4MjVpbnRyIChpbnR1ZGF0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIDIgOiAvKiBzZW5kIHJlc2V0IHBhY2tldCB3aXRoIGNhdXNlIGFuZCBkaWFnID0gMCAqLworICAgICAgICAgICAgICAgIGNhdXNlID0gZGlhZyA9IDA7CisgICAgICAgICAgICAgICAgeDI1cmVzZXQgKGNhdXNlLGRpYWcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgNSA6IC8qIHNlbmQgaW50ZXJydXB0IHBhY2tldCB3aXRoIGludGVycnVwdCB1c2VyIGRhdGEgZmllbGQgPSAwICovCisgICAgICAgICAgICAgICAgaW50dWRhdCA9IDA7CisgICAgICAgICAgICAgICAgeDI1aW50ciAoaW50dWRhdCk7CisgICAgICAgICAgICAgICAgc2V0cWJpdCAoKTsKKyAgICAgICAgICAgICAgICAvKiBzZW5kIGluZGljYXRpb24gb2YgYnJlYWsgd2l0aG91dCBhIHBhcmFtZXRlciBmaWVsZCAqLworICAgICAgICAgICAgICAgIHR0b2MoWDI5X0lORElDQVRJT05fT0ZfQlJFQUspOworICAgICAgICAgICAgICAgIHJlc2V0cWJpdCAoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIDggOiBhY3RpdmUgPSAwOyAgICAgICAgICAgICAvKiBsZWF2ZSBkYXRhIHRyYW5zZmVyICovCisgICAgICAgICAgICAgICAgY29ub2wgKCJcclxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAyMTogLyogc2VuZCBpbnRlcnJ1cHQgcGFja2V0IHdpdGggaW50ZXJydXB0IHVzZXIgZGF0YSBmaWVsZCA9IDAgKi8KKyAgICAgICAgICAgICAgICBpbnR1ZGF0ID0gMDsKKyAgICAgICAgICAgICAgICB4MjVpbnRyIChpbnR1ZGF0KTsKKyAgICAgICAgICAgICAgICBzZXRwYWQgKGluZGJyaysxLDIpOyAgICAvKiBzZXQgcGFkIHRvIGRpc2NhcmQgaW5wdXQgKi8KKyAgICAgICAgICAgICAgICBzZXRxYml0ICgpOworICAgICAgICAgICAgICAgIC8qIHNlbmQgaW5kaWNhdGlvbiBvZiBicmVhayB3aXRoIHBhcmFtZXRlciBmaWVsZCAqLworICAgICAgICAgICAgICAgIHR0b2wgKGluZGJyayxzaXplb2YoaW5kYnJrKSk7CisgICAgICAgICAgICAgICAgcmVzZXRxYml0ICgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICB9Cit9CisKKy8qIFguMjUgc3VwcG9ydCBmdW5jdGlvbnMgKi8KKworWDI1X0NBVVNFX0RJQUcgZGlhZzsKKworLyoKKyAgQ29udmVydCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgcmVwcmVzZW50aW5nIGFuIFguMTIxIGFkZHJlc3MKKyAgdG8gYSBwYWNrZWQgQkNEIGZvcm0uCisqLworaW50Citwa3gxMjEoc3RyLGJjZCkgY2hhciAqc3RyOyBDSEFSICpiY2Q7IHsKKyAgICBpbnQgaSwgajsKKyAgICB1X2NoYXIgYzsKKworICAgIGkgPSBqID0gMDsKKyAgICB3aGlsZSAoc3RyW2ldKSB7CisgICAgICAgIGlmIChpID49IDE1IHx8IHN0ciBbaV0gPCAnMCcgfHwgc3RyIFtpXSA+ICc5JykKKyAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgYyA9IHN0ciBbaV0gLSAnMCc7CisgICAgICAgIGlmIChpICYgMSkKKyAgICAgICAgICBiY2QgW2orK10gfD0gYzsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGJjZCBbal0gPSBjIDw8IDQ7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgcmV0dXJuIChpKTsKK30KKworLyogUmVhZHMgYW5kIHByaW50cyBYLjI1IGRpYWdub3N0aWMgKi8KKworaW50Cit4MjVkaWFnICgpIHsKKyAgICBpbnQgaTsKKworICAgIGJ6ZXJvICgoY2hhciAqKSZkaWFnLHNpemVvZihkaWFnKSk7CisgICAgaWYgKGlvY3RsKHR0eWZkLFgyNV9SRF9DQVVTRV9ESUFHLCZkaWFnKSkgeworICAgICAgICBwZXJyb3IgKCJSZWFkaW5nIFguMjUgZGlhZ25vc3RpYyIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBpZiAoZGlhZy5kYXRhbGVuID4gMCkgeworICAgICAgICBwcmludGYgKCJYLjI1IERpYWdub3N0aWMgOiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludClkaWFnLmRhdGFsZW47IGkrKykKKyAgICAgICAgICBwcmludGYoIiAlMDJoIixkaWFnLmRhdGFbaV0pKworICAgICAgICBwcmludGYgKCJcclxuIik7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworLyogWC4yNSBPdXQtb2YtQmFuZCBTaWduYWwgSGFuZGxlciAqLworCitTSUdUWVAKK3gyNW9vYmgoZm9vKSBpbnQgZm9vOyB7CisgICAgaW50IG9vYnR5cGU7CisgICAgdV9jaGFyIG9vYmRhdGE7CisgICAgaW50IHQ7CisKKyAgICAoVk9JRCkgc2lnbmFsKFNJR1VSRyx4MjVvb2JoKTsKKyAgICBkbyB7CisgICAgICAgIGlmIChpb2N0bCh0dHlmZCxYMjVfT09CX1RZUEUsJm9vYnR5cGUpKSB7CisgICAgICAgICAgICBwZXJyb3IgKCJHZXR0aW5nIHNpZ25hbCB0eXBlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvb2J0eXBlKSB7CisgICAgICAgICAgY2FzZSBJTlRfREFUQToKKyAgICAgICAgICAgIGlmIChyZWN2KHR0eWZkLChjaGFyICopJm9vYmRhdGEsMSxNU0dfT09CKSA8IDApIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IgKCJSZWNlaXZpbmcgWC4yNSBpbnRlcnJ1cHQgZGF0YSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQgPSBvb2JkYXRhOworICAgICAgICAgICAgcHJpbnRmICgiXHJcbkludGVycnVwdCByZWNlaXZlZCwgZGF0YSA9ICVkXHJcbiIsIHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBWQ19SRVNFVDoKKyAgICAgICAgICAgIHByaW50ZiAoIlxyXG5WaXJ0dWFsIGNpcmN1aXQgcmVzZXRcclxuIik7CisgICAgICAgICAgICB4MjVkaWFnICgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBOX1JFU0VUUzoKKyAgICAgICAgICAgIHByaW50ZiAoIlxyXG5SZXNldCB0aW1lb3V0XHJcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBOX0NMRUFSUzoKKyAgICAgICAgICAgIHByaW50ZiAoIlxyXG5DbGVhciB0aW1lb3V0XHJcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBNU0dfVE9PX0xPTkc6CisgICAgICAgICAgICBwcmludGYgKCJcclxuTWVzc2FnZSBkaXNjYXJkZWQsIHRvbyBsb25nXHJcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChvb2J0eXBlKSBwcmludGYoIlxyXG5Vbmtub3duIG9vYiB0eXBlICVkXHJcbiIsb29idHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKG9vYnR5cGUpOworfQorCisvKiBTZW5kIGEgWC4yNSBpbnRlcnJ1cHQgcGFja2V0ICovCisKK2ludAorI2lmZGVmIENLX0FOU0lDCit4MjVpbnRyKGNoYXIgaW50cikKKyNlbHNlCit4MjVpbnRyKGludHIpIGNoYXIgaW50cjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogeDI1aW50ciAqLyB7CisgICAgaWYgKHNlbmQodHR5ZmQsJmludHIsMSxNU0dfT09CKSA8IDApIHJldHVybigtMSk7CisgICAgZGVidWcoRjEwMCwiWC4yNSBpbnRyIiwiIiwwKTsKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qIFJlc2V0IFguMjUgdmlydHVhbCBjaXJjdWl0ICovCitpbnQKKyNpZmRlZiBDS19BTlNJQworeDI1cmVzZXQoY2hhciBjYXVzZSwgY2hhciBkaWFnbikKKyNlbHNlCit4MjVyZXNldChjYXVzZSwgZGlhZ24pIGNoYXIgY2F1c2U7IGNoYXIgZGlhZ247CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHgyNXJlc2V0ICovIHsKKyAgICBiemVybyAoKGNoYXIgKikmZGlhZyxzaXplb2YoZGlhZykpOworICAgIGRpYWcuZmxhZ3MgICA9IDA7CisgICAgZGlhZy5kYXRhbGVuID0gMjsKKyAgICBkaWFnLmRhdGFbMF0gPSBjYXVzZTsKKyAgICBkaWFnLmRhdGFbMV0gPSBkaWFnbjsKKyAgICBpZiAoaW9jdGwodHR5ZmQsWDI1X1dSX0NBVVNFX0RJQUcsJmRpYWcpIDwgMCkKKyAgICAgIHJldHVybigtMSk7CisgICAgZGVidWcoRjEwMCwiWC4yNSByZXNldCIsIiIsMCk7CisgICAgcmV0dXJuKDApOworfQorCisvKiBDbGVhciBYLjI1IHZpcnR1YWwgY2lyY3VpdCAqLworaW50Cit4MjVjbGVhcigpIHsKKyAgICBpbnQgaTsKKyAgICBkZWJ1ZyhGMTAwLCJYLjI1IGNsZWFyIiwiIiwwKTsKKyAgICBiemVybyAoKGNoYXIgKikmZGlhZyxzaXplb2YoZGlhZykpOworICAgIGRpYWcuZmxhZ3MgPSAoMSA8PCBESUFHX1RZUEUpOworICAgIGRpYWcuZGF0YWxlbiA9IDI7CisgICAgZGlhZy5kYXRhWzBdID0gMDsKKyAgICBkaWFnLmRhdGFbMV0gPSAwOworICAgIGlvY3RsICh0dHlmZCxYMjVfV1JfQ0FVU0VfRElBRywmZGlhZyk7IC8qIFNlbmQgQ2xlYXIgUmVxdWVzdCAqLworICAgIHJldHVybih0dGNsb3MoMCkpOyAgICAgICAgICAgICAgICAgIC8qIENsb3NlIHNvY2tldCAqLworfQorCisvKiBYLjI1IHN0YXR1cyAqLworaW50Cit4MjVzdGF0KCkgeworICAgIGlmICh0dHlmZCA9PSAtMSkgcmV0dXJuICgtMSk7CisgICAgcmV0dXJuKDApOworfQorCisvKiBTZXQgUV9CSVQgb24gKi8KK1ZPSUQKK3NldHFiaXQoKSB7CisgICAgc3RhdGljIGludCBxYml0b24gPSAxIDw8IFFfQklUOworICAgIGlvY3RsICh0dHlmZCxYMjVfU0VORF9UWVBFLCZxYml0b24pOworfQorCisvKiBTZXQgUV9CSVQgb2ZmICovCitWT0lECityZXNldHFiaXQoKSB7CisgICAgc3RhdGljIGludCBxYml0b2ZmID0gMDsKKyAgICBpb2N0bCAodHR5ZmQsWDI1X1NFTkRfVFlQRSwmcWJpdG9mZik7Cit9CisKKy8qIFJlYWQgbiBjaGFyYWN0ZXJzIGZyb20gWC4yNSBjaXJjdWl0IGludG8gYnVmICovCisKK2ludAoreDI1eGluKG4sYnVmKSBpbnQgbjsgQ0hBUiAqYnVmOyB7CisgICAgcmVnaXN0ZXIgaW50IHgsIGM7CisgICAgaW50IHFwa3Q7CisKKyAgICBkbyB7CisgICAgICAgIHggPSByZWFkKHR0eWZkLGJ1ZixuKTsKKyAgICAgICAgaWYgKGJ1ZlswXSAmICgxIDw8IFFfQklUKSkgeyAvKiBJZiBRX0JJVCBwYWNrZXQsIHByb2Nlc3MgaXQgKi8KKyAgICAgICAgICAgIC8qIElmIHJldHVybiAtMSA6IGludml0YXRpb24gdG8gY2xlYXI7IC0yIDogUEFEIGNoYW5nZXMgKi8KKyAgICAgICAgICAgIGlmICgoYz1xYml0cGt0KGJ1ZisxLHgtMikpIDwgMCkgcmV0dXJuKGMpOworICAgICAgICAgICAgcXBrdCA9IDE7CisgICAgICAgIH0gZWxzZSBxcGt0ID0gMDsKKyAgICB9IHdoaWxlIChxcGt0KTsKKworI2lmZGVmIENPTU1FTlQgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlZCBieSBTdGVwaGVuIFJpZWhtIDE5LjEyLjk3ICovCisgICAgLyogQlVHIQorICAgICAqIGlmIGJ1ZltdIGlzIGZ1bGwsIHRoZW4gdGhpcyBudWxsIGxhbmRzIGluIG5pcnZhbmEhCisgICAgICogSSB3YXMgdW5hYmxlIHRvIGZpbmQgYW55IGNvZGUgd2hpY2ggbmVlZHMgYSB0cmFpbGluZyBudWxsIGluIGJ1ZltdCisgICAgICovCisgICAgaWYgKHggPiAwKSBidWZbeF0gPSAnXDAnOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBpZiAoeCA8IDEpIHggPSAtMTsKKyAgICBkZWJ1ZyhGMTAxLCJ4MjV4aW4geCIsIiIseCk7CisKKyAgICByZXR1cm4oeCk7Cit9CisKKyNpZmRlZiBDT01NRU5UIC8qIE5PIExPTkdFUiBORUVERUQhICovCisvKiBYLjI1IHJlYWQgYSBsaW5lICovCisKK2ludAorI2lmZGVmIFBBUlNFTlNFCisjaWZkZWYgQ0tfQU5TSUMKK3gyNWlubChDSEFSICpkZXN0LCBpbnQgbWF4LGludCB0aW1vLCBDSEFSIGVvbCwgQ0hBUiBzdGFydCkKKyNlbHNlCit4MjVpbmwoZGVzdCxtYXgsdGltbyxlb2wsc3RhcnQpIGludCBtYXgsdGltbzsgQ0hBUiAqZGVzdCwgZW9sLCBzdGFydDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworI2Vsc2UgLyogbm90IFBBUlNFTlNFICovCisjaWZkZWYgQ0tfQU5TSUMKK3gyNWlubChDSEFSICpkZXN0LCBpbnQgbWF4LGludCB0aW1vLCBDSEFSIGVvbCkKKyNlbHNlCit4MjVpbmwoZGVzdCxtYXgsdGltbyxlb2wpIGludCBtYXgsdGltbzsgQ0hBUiAqZGVzdCwgZW9sOworI2VuZGlmIC8qIF9fU0RUQ19fICovCisjZW5kaWYgLypQQVJTRU5TRSAqLworIC8qIHgyNWlubCAqLyB7CisgICAgQ0hBUiAqcGRlc3Q7CisgICAgaW50IHBrdHlwZSwgZ290ZW9sLCByZXN0LCBuOworICAgIGludCBpLCBmbGFnID0gMDsKKyAgICBleHRlcm4gaW50IHR0cHJ0eSwgdHRwZmxnOworICAgIGludCB0dHBtc2s7CisKKyAgICB0dHBtc2sgPSAodHRwcnR5KSA/IDAxNzcgOiAwMzc3OyAgICAvKiBTZXQgcGFyaXR5IHN0cmlwcGluZyBtYXNrICovCisKKyAgICBkZWJ1ZyhGMTAxLCJ4MjVpbmwgbWF4IiwiIixtYXgpOworICAgIGRlYnVnKEYxMDEsIngyNWlubCBlb2wiLCIiLGVvbCk7CisgICAgcGRlc3QgID0gZGVzdDsKKyAgICByZXN0ICAgPSBtYXg7CisgICAgZ290ZW9sID0gMDsKKyAgICBkbyB7CisgICAgICAgIG4gPSByZWFkKHR0eWZkLHBkZXN0LHJlc3QpOworICAgICAgICBuLS07CisgICAgICAgIHBrdHlwZSA9ICpwZGVzdCAmIDB4N2Y7CisgICAgICAgIHN3aXRjaCAocGt0eXBlKSB7CisgICAgICAgICAgY2FzZSAxIDw8IFFfQklUOgorICAgICAgICAgICAgaWYgKHFiaXRwa3QocGRlc3QrMSwtLW4pIDwgMCkgcmV0dXJuKC0yKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoZmxhZyA9PSAwKSB7IC8qIGlmIG5vdCBpbiBwYWNrZXQsIHNlYXJjaCBzdGFydCAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IChpIDwgbikgJiYKKyAgICAgICAgICAgICAgICAgICAgICEoZmxhZyA9ICgoZGVzdFtpXSAmIDB4N2YpID09IHN0YXJ0KSk7CisgICAgICAgICAgICAgICAgICAgICBpKyspOworICAgICAgICAgICAgICAgIGlmIChmbGFnID09IDApIHsgLyogbm90IGZvdW5kLCBkaXNjYXJkIGp1bmsgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwieDI1aW5sIHNraXBwaW5nIiwiIixuKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogZm91bmQsIGRpc2NhcmQganVuayBiZWZvcmUgc3RhcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICAgICAgICAgIG4gPSBuIC0gaSArIDE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPD0gbjsgaysrLCBpKyspIGRlc3Rba10gPSBkZXN0W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwgbikgJiYgLyogc2VhcmNoIGZvciBlb2wgKi8KKyAgICAgICAgICAgICAgICAgIShnb3Rlb2w9KCgoKnBkZXN0ID0gKihwZGVzdCsxKSZ0dHBtc2spJjB4N2YpPT0gZW9sKSk7CisgICAgICAgICAgICAgICAgIGkrKyxwZGVzdCsrKTsKKyAgICAgICAgICAgICpwZGVzdCA9ICdcMCc7CisgICAgICAgICAgICByZXN0IC09IG47CisgICAgICAgIH0KKyAgICB9IHdoaWxlICgocmVzdCA+IDApICYmICghZ290ZW9sKSk7CisKKyAgICBpZiAoZ290ZW9sKSB7CisgICAgICAgIG4gPSBtYXggLSByZXN0OworICAgICAgICBkZWJ1ZyAoRjExMSwieDI1aW5sIFguMjUgZ290IiwoY2hhciAqKSBkZXN0LG4pOworICAgICAgICBpZiAodGltbykgdHRpbW9mZigpOworICAgICAgICBpZiAodHRwZmxnKysgPT0gMCAmJiB0dHBydHkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCh0dHBydHkgPSBwYXJjaGsoZGVzdCxzdGFydCxuKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwieDI1aW5sIHNlbnNlcyBwYXJpdHkiLCIiLHR0cHJ0eSk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwieDI1aW5sIHBhY2tldCBiZWZvcmUiLChjaGFyICopZGVzdCwwKTsKKyAgICAgICAgICAgICAgICB0dHBtc2sgPSAweDdmOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspCisgICAgICAgICAgICAgICAgICBkZXN0W2pdICY9IDB4N2Y7IC8qIFN0cmlwIHBhcml0eSBmcm9tIHBhY2tldCAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsIngyNWlubCBwYWNrZXQgYWZ0ZXIgIixkZXN0LDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJwYXJjaGsiLCIiLHR0cHJ0eSk7CisgICAgICAgICAgICAgICAgaWYgKHR0cHJ0eSA8IDApIHsgdHRwcnR5ID0gMDsgbiA9IC0xOyB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHRpbW9mZigpOworICAgICAgICByZXR1cm4obik7CisgICAgfQorICAgIHR0aW1vZmYoKTsKKyAgICByZXR1cm4oLTEpOworfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBTVU5YMjUgKi8KKworI2lmZGVmIElCTVgyNQorLyoKKyAqIElCTSBYMjUgc3VwcG9ydCAtIHVzaW5nIHRoZSBOUEkgc3RyZWFtcyBpbnRlcmZhY2UKKyAqIHdyaXR0ZW4gYnkgU3RlcGhlbiBSaWVobSwgcGMtcGx1cywgTXVuaWNoIEdlcm1hbnkKKyAqLworCisvKiByaWVobTogbWlzc2luZyBmdW5jdGlvbnMgLyBUT0RPIGxpc3QgKi8KKworLyoKKyAgeDI1aW50cigpIC0gU2VuZCBhbiBpbnRlcnJ1cHQgcGFja2V0CisqLworCisvKiByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZSBkZXBlbmRpbmcgb24gcGFja2V0IHR5cGUgKi8KK2NoYXIgKgoreDI1ZXJyKG4pIGludCBuOyB7CisgICAgc3RhdGljIGNoYXIgYnVmWzMwXTsKKyAgICBzd2l0Y2ggKG4pIHsKKyAgICAgIGNhc2UgTkJBREFERFI6ICAgICByZXR1cm4gImludmFsaWQgYWRkcmVzcyI7CisgICAgICBjYXNlIE5CQURPUFQ6ICAgICAgcmV0dXJuICJpbnZhbGlkIG9wdGlvbnMiOworICAgICAgY2FzZSBOQUNDRVNTOiAgICAgIHJldHVybiAibm8gcGVybWlzc2lvbiI7CisgICAgICBjYXNlIE5OT0FERFI6ICAgICAgcmV0dXJuICJ1bmFibGUgdG8gYWxsb2NhdGUgYWRkcmVzcyI7CisgICAgICBjYXNlIE5PVVRTVEFURTogICAgcmV0dXJuICJpbnZhbGlkIHN0YXRlIjsKKyAgICAgIGNhc2UgTkJBRFNFUTogICAgICByZXR1cm4gImludmFsaWQgc2VxdWVuY2UgbnVtYmVyIjsKKyAgICAgIGNhc2UgTlNZU0VSUjogICAgICByZXR1cm4gInN5c3RlbSBlcnJvciI7CisgICAgICBjYXNlIE5CQUREQVRBOiAgICAgcmV0dXJuICJpbnZhbGlkIGRhdGEgc2l6ZSI7CisgICAgICBjYXNlIE5CQURGTEFHOiAgICAgcmV0dXJuICJpbnZhbGlkIGZsYWciOworICAgICAgY2FzZSBOTk9UU1VQUE9SVDogIHJldHVybiAidW5zdXBwb3J0ZWQgcHJpbWl0aXZlIjsKKyAgICAgIGNhc2UgTkJPVU5EOiAgICAgICByZXR1cm4gImFkZHJlc3MgaW4gdXNlIjsKKyAgICAgIGNhc2UgTkJBRFFPU1BBUkFNOiByZXR1cm4gImJhZCBRT1MgcGFyYW1ldGVycyI7CisgICAgICBjYXNlIE5CQURRT1NUWVBFOiAgcmV0dXJuICJiYWQgUU9TIHR5cGUiOworICAgICAgY2FzZSBOQkFEVE9LRU46ICAgIHJldHVybiAiYmFkIHRva2VuIHZhbHVlIjsKKyAgICAgIGNhc2UgTk5PUFJPVE9JRDogICByZXR1cm4gInByb3RvY29sIGlkIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQiOworICAgICAgY2FzZSBOT0REQ1VEOiAgICAgIHJldHVybiAib2RkIGxlbmd0aCBjYWxsIHVzZXIgZGF0YSI7CisgICAgICBkZWZhdWx0OgorICAgICAgICBja21ha21zZyhidWYsc2l6ZW9mKGJ1ZiksIlVua25vd24gTlBJIGVycm9yICIsY2tpdG9hKG4pLE5VTEwsTlVMTCk7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorfQorCisvKiB0dXJuIGEgbWVhbmluZ2xlc3MgcHJpbWl0aXZlIG51bWJlciBpbnRvIGEgbWVhbmluZ2Z1bCBwcmltaXRpdmUgbmFtZSAqLworY2hhciAqCit4MjVwcmltKG4pIGludCBuOyB7CisgICAgc3RhdGljIGNoYXIgYnVmWzMwXTsKKyAgICBzd2l0Y2gobikgeworICAgICAgY2FzZSBOX0JJTkRfQUNLOiAgICAgcmV0dXJuICJOX0JJTkRfQUNLIjsKKyAgICAgIGNhc2UgTl9CSU5EX1JFUTogICAgIHJldHVybiAiTl9CSU5EX1JFUSI7CisgICAgICBjYXNlIE5fQ09OTl9DT046ICAgICByZXR1cm4gIk5fQ09OTl9DT04iOworICAgICAgY2FzZSBOX0NPTk5fSU5EOiAgICAgcmV0dXJuICJOX0NPTk5fSU5EIjsKKyAgICAgIGNhc2UgTl9DT05OX1JFUTogICAgIHJldHVybiAiTl9DT05OX1JFUSI7CisgICAgICBjYXNlIE5fQ09OTl9SRVM6ICAgICByZXR1cm4gIk5fQ09OTl9SRVMiOworICAgICAgY2FzZSBOX0RBVEFDS19JTkQ6ICAgcmV0dXJuICJOX0RBVEFBQ0tfSU5EIjsKKyAgICAgIGNhc2UgTl9EQVRBQ0tfUkVROiAgIHJldHVybiAiTl9EQVRBQUNLX1JFUSI7CisgICAgICBjYXNlIE5fREFUQV9JTkQ6ICAgICByZXR1cm4gIk5fREFUQV9JTkQiOworICAgICAgY2FzZSBOX0RBVEFfUkVROiAgICAgcmV0dXJuICJOX0RBVEFfUkVRIjsKKyAgICAgIGNhc2UgTl9ESVNDT05fSU5EOiAgIHJldHVybiAiTl9ESVNDT05fSU5EIjsKKyAgICAgIGNhc2UgTl9ESVNDT05fUkVROiAgIHJldHVybiAiTl9ESVNDT05fUkVRIjsKKyAgICAgIGNhc2UgTl9FUlJPUl9BQ0s6ICAgIHJldHVybiAiTl9FUlJPUl9BQ0siOworICAgICAgY2FzZSBOX0VYREFUQV9JTkQ6ICAgcmV0dXJuICJOX0VYREFUQV9JTkQiOworICAgICAgY2FzZSBOX0VYREFUQV9SRVE6ICAgcmV0dXJuICJOX0VYREFUQV9SRVEiOworICAgICAgY2FzZSBOX0lORk9fQUNLOiAgICAgcmV0dXJuICJOX0lORk9fQUNLIjsKKyAgICAgIGNhc2UgTl9JTkZPX1JFUTogICAgIHJldHVybiAiTl9JTkZPX1JFUSI7CisgICAgICBjYXNlIE5fT0tfQUNLOiAgICAgICByZXR1cm4gIk5fT0tfQUNLIjsKKyAgICAgIGNhc2UgTl9PUFRNR01UX1JFUTogIHJldHVybiAiTl9PUFRNR01UX1JFUSI7CisgICAgICBjYXNlIE5fUkVTRVRfQ09OOiAgICByZXR1cm4gIk5fUkVTRVRfQ09OIjsKKyAgICAgIGNhc2UgTl9SRVNFVF9JTkQ6ICAgIHJldHVybiAiTl9SRVNFVF9JTkQiOworICAgICAgY2FzZSBOX1JFU0VUX1JFUTogICAgcmV0dXJuICJOX1JFU0VUX1JFUSI7CisgICAgICBjYXNlIE5fUkVTRVRfUkVTOiAgICByZXR1cm4gIk5fUkVTRVRfUkVTIjsKKyAgICAgIGNhc2UgTl9VREVSUk9SX0lORDogIHJldHVybiAiTl9VREVSUk9SX0lORCI7CisgICAgICBjYXNlIE5fVU5CSU5EX1JFUTogICByZXR1cm4gIk5fVU5CSU5EX1JFUSI7CisgICAgICBjYXNlIE5fVU5JVERBVEFfUkVROiByZXR1cm4gIk5fVU5JVERBVEFfUkVRIjsKKyAgICAgIGNhc2UgTl9VTklUREFUQV9JTkQ6IHJldHVybiAiTl9VTklUREFUQV9JTkQiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2ttYWttc2coYnVmLHNpemVvZihidWYpLCJVTktOT1dOICgiLGNraXRvYShuKSwiKSIsTlVMTCk7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiB4MjVnZXRtc2coKQorICogRGVzY3JpcHRpb246IGdldCBhIFNUUkVBTVMgbWVzc2FnZSwgYW5kIGNoZWNrIGl0IGZvciBlcnJvcnMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogZmQgICAgICAgICAgIC0gZmlsZSBkZXNjcmlwdG9yIHRvIHgyNSBkZXZpY2UgKG9wZW5lZCkKKyAqIGNvbnRyb2wgICAgICAtIGNvbnRyb2wgYnVmZmVyIChwcmUtYWxsb2NhdGVkKQorICogY3RsX3NpemUgICAgIC0gc2l6ZSBvZiBjb250cm9sIGJ1ZmZlcgorICogZGF0YSAgICAgICAgIC0gZGF0YSBidWZmZXIgKHByZS1hbGxvY2F0ZWQpCisgKiBkYXRhX3NpemUgICAgLSBzaXplIG9mIGRhdGEgYnVmZmVyCisgKiBmbGFncyAgICAgICAgLSBmbGFncyBmb3IgZ2V0bXNnKCkKKyAqIGV4cGVjdGVkICAgICAtIGV4cGVjdGVkIFByaW1pdGl2ZSB0eXBlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgICA+PSAwICAgIE9LIChzaXplIG9mIGRhdGEgcmV0dXJuZWQpCisgKiAgICAgIC0xICAgICAgZXJyb3IKKyAqCisgKi8KK2ludAoreDI1Z2V0bXNnKCBmZCwgY29udHJvbCwgY3RsX3NpemUsIGRhdGEsIGRhdGFfc2l6ZSwgZ2V0X2ZsYWdzLCBleHBlY3RlZCApCisgICAgaW50ICAgICAgICAgICAgICAgICBmZDsgICAgICAgICAgICAgLyogWDI1IGRldmljZSAob3BlbmVkKSAqLworICAgIE5fbnBpX2N0bF90ICAgICAgICAgKmNvbnRyb2w7ICAgICAgIC8qIGNvbnRyb2wgYnVmZmVyIChwcmUtYWxsb2NhdGVkKSAqLworICAgIGludCAgICAgICAgICAgICAgICAgY3RsX3NpemU7ICAgICAgIC8qIHNpemUgb2YgY29udHJvbCBidWZmZXIgKi8KKyAgICBOX25waV9kYXRhX3QgICAgICAgICpkYXRhOyAgICAgICAgICAvKiBkYXRhIGJ1ZmZlciAocHJlLWFsbG9jYXRlZCkgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZTsgICAgICAvKiBzaXplIG9mIGRhdGEgYnVmZmVyICovCisgICAgaW50ICAgICAgICAgICAgICAgICAqZ2V0X2ZsYWdzOyAgICAgLyogZ2V0bXNnKCkgZmxhZ3MgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGV4cGVjdGVkOyAgICAgICAvKiBleHBlY3RlZCBwcmltaXRpdmUgdHlwZSAqLworLyogeDI1Z2V0bXNnICovIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJjID0gMDsgICAgICAgICAvKiByZXR1cm4gY29kZSAqLworICAgIHN0cnVjdCBzdHJidWYgICAgICAgKmdldF9jdGw9TlVMTDsgIC8qIGdldG1zZyBjb250cm9sICovCisgICAgc3RydWN0IHN0cmJ1ZiAgICAgICAqZ2V0X2RhdGE9TlVMTDsgLyogZ2V0bXNnIGRhdGEgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIG1vcmUgPSAwOyAgICAgICAvKiBmbGFnIGZvciBtb3JlIGRhdGEgZXRjICovCisgICAgaW50ICAgICAgICAgICAgICAgICBmaWxlX3N0YXR1cyA9IC0xOyAvKiBmaWxlIGFzeW5jIHN0YXR1cyAqLworICAgIE5fbnBpX2N0bF90ICAgICAgICAgKiByZXN1bHQ7ICAgICAgIC8qIHBvaW50ZXIgdG8gc2ltcGxpZnkgc3dpdGNoKCkgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIHBhY2tldF90eXBlID0gLTE7IC8qIHVua25vd24gcGFja2V0IHRodXMgZmFyICovCisKKyNpZmRlZiBUUkFDRQorICAgIHByaW50ZiggIlRSQUNFOiBlbnRlcmluZyB4MjVnZXRtc2dcbiIgKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworCisgICAgZGVidWcoIEYxMTAsICJ4MjVnZXRtc2cgd2FpdGluZyBmb3IgcGFja2V0ICIsIHgyNXByaW0oIGV4cGVjdGVkICksIDApOworICAgIC8qIHByZXBhcmUgdGhlIGNvbnRyb2wgc3RydWN0dXJlcyBmb3IgZ2V0bXNnICovCisgICAgaWYgKGNvbnRyb2wpIHsKKyAgICAgICAgaWYgKChnZXRfY3RsID0gKHN0cnVjdCBzdHJidWYqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHN0cmJ1ZikpKSA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcGVycm9yKCJrZXJtaXQgeDI1Z2V0bXNnKCk6IGdldF9jdGwgbWFsbG9jIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgIGRlYnVnKCBGMTAwLCAieDI1Z2V0bXNnIG1hbGxvYyBmYWlsZWQgZm9yIGdldF9jdGxcbiIsICIiLCAwKTsKKyAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICB9CisgICAgICAgIC8qIGFsbG93IGdldG1zZyB0byByZXR1cm4gYW4gdW5leHBlY3RlZCBwYWNrZXQgdHlwZSAod2hpY2ggbWF5IGJlCisgICAgICAgICAqIGxhcmdlciB0aGFuIHRoZSBleHBlY3RlZCBvbmUpCisgICAgICAgICAqLworICAgICAgICBnZXRfY3RsLT5tYXhsZW4gPSBOUElfTUFYX0NUTDsKKyAgICAgICAgZ2V0X2N0bC0+bGVuID0gMDsKKyAgICAgICAgZ2V0X2N0bC0+YnVmID0gKGNoYXIgKiljb250cm9sOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigKKyAia2VybWl0IHgyNWdldG1zZygpOiBpbnRlcm5hbCBlcnJvci4gY29udHJvbCBidWZmZXIgTVVTVCBiZSBwcmUtYWxsb2NhdGVkIVxuIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgZGVidWcoRjEwMCwieDI1Z2V0bXNnIGludGVybmFsIGVycm9yLiBubyBidWZmZXIgcHJlLWFsbG9jYXRlZCIsIiIsMCk7CisgICAgICAgIHJldHVybiggLTEgKTsKKyAgICB9CisgICAgaWYgKGRhdGEpIHsKKyAgICAgICAgaWYgKChnZXRfZGF0YSA9IChzdHJ1Y3Qgc3RyYnVmKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHJidWYpKSkgPT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwZXJyb3IoImtlcm1pdCB4MjVnZXRtc2coKTogZ2V0X2RhdGEgbWFsbG9jIGZhaWxlZFxuIik7CisgICAgICAgICAgICBkZWJ1ZyggRjEwMCwgIngyNWdldG1zZyBtYWxsb2MgZmFpbGVkIGZvciBnZXRfZGF0YVxuIiwgIiIsIDApOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBnZXRfZGF0YS0+bWF4bGVuID0gKE5QSV9NQVhfREFUQSA8IGRhdGFfc2l6ZSApID8KKyAgICAgICAgICBOUElfTUFYX0RBVEEgOgorICAgICAgICAgICAgZGF0YV9zaXplOworICAgICAgICBnZXRfZGF0YS0+bGVuID0gMDsKKyAgICAgICAgZ2V0X2RhdGEtPmJ1ZiA9IChjaGFyICopZGF0YTsKKyAgICB9CisKKyAgICAvKiBnZXQgYW4gWC4yNSBwYWNrZXQgLQorICAgICAqIGl0IG1heSBiZSBhbnkga2luZCBvZiBwYWNrZXQsIHNvIGNoZWNrIGZvciBzcGVjaWFsIGNhc2VzCisgICAgICogaXQgbWF5IGJlIHNwbGl0IGludG8gbXVsdGlwbGUgcGFydHMgLSBzbyBsb29wIGlmIG5lY2Vzc2FyeQorICAgICAqLworICAgIGRvIHsKKyNpZmRlZiBERUJVRworICAgICAgICBwcmludGYoICJrZXJtaXQ6IHgyNWdldG1zZygpOiBnZXR0aW5nIGEgbWVzc2FnZVxuIiApOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgaWYgKChtb3JlID0gZ2V0bXNnKGZkLCBnZXRfY3RsLCBnZXRfZGF0YSwgZ2V0X2ZsYWdzKSkgPCAwKSB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIHByaW50ZiggImtlcm1pdDogeDI1Z2V0bXNnKCk6IGdldG1zZyByZXR1cm5lZCBhbiBlcnJvclxuIiApOworICAgICAgICAgICAgcGVycm9yKCAiZ2V0bXNnIGVycm9yIHdhcyIgKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwgIngyNWdldG1zZyBnZXRtc2cgcmV0dXJuZWQgYW4gZXJyb3JcbiIsICIiLCBlcnJubyk7CisgICAgICAgICAgICBpZiAoKGVycm5vID09IEVBR0FJTikgJiYgKGdldF9kYXRhICYmIChnZXRfZGF0YS0+bGVuID4gMCkpICkgeworICAgICAgICAgICAgICAgIC8qIHdhcyBpbiBub24tYmxvY2tpbmcgbW9kZSwgbm90aGluZyB0byBnZXQsIGJ1dCB3ZSdyZQorICAgICAgICAgICAgICAgICAqIGFscmVhZHkgd2FpdGluZyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldCAtCisgICAgICAgICAgICAgICAgICogc3dpdGNoIHRvIGJsb2NraW5nIG1vZGUgZm9yIHRoZSBuZXh0IHJlYWQuCisgICAgICAgICAgICAgICAgICogZmlsZV9zdGF0dXMgdXNlZCB0byByZXNldCBmaWxlIHN0YXR1cyBiZWZvcmUgcmV0dXJuaW5nCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKChmaWxlX3N0YXR1cyA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKSkgPCAwCisgICAgICAgICAgICAgICAgICAgIHx8IGZjbnRsKGZkLCBGX1NFVEZMLCBmaWxlX3N0YXR1cyAmIH5PX05ERUxBWSkgPCAwKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHBlcnJvcigieDI1Z2V0bXNnKCk6IGNvdWxkbid0IGNoYW5nZSB4MjUgYmxvY2tpbmcgbW9kZSIpOworICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIngyNWdldG1zZyBmY250bCByZXR1cm5lZCBhbiBlcnJvclxuIiwgIiIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBuZXRjbG9zKCk7ICovCisgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgLyogbG9vcCBhZ2FpbiBpbnRvIGEgYmxvY2tpbmcgZ2V0bXNnKCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbm8gZGF0YSB0byBnZXQgaW4gbm9uLWJsb2NraW5nIG1vZGUgLSByZXR1cm4gZW1wdHkgaGFuZGVkICovCisgICAgICAgICAgICAgICAgcGVycm9yKCAieDI1Z2V0bXNnKCk6IGdldG1zZyBmYWlsZWQiICk7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwieDI1Z2V0bXNnIGdldG1zZyByZXR1cm5lZCBhbiBlcnJvclxuIiwgIiIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1vcmUgJiBNT1JFQ1RMKSB7CisgICAgICAgICAgICAvKiBwYW5pYyAtIHRoZSBjb250cm9sIGluZm9ybWF0aW9uIHdhcyBsYXJnZXIgdGhhbiB0aGUKKyAgICAgICAgICAgICAqIG1heGltdW0gY29udHJvbCBidWZmZXIgc2l6ZSEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogcmllaG06IGNsb3NlIGNvbm5lY3Rpb24/ICovCisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIHByaW50ZigieDI1Z2V0bXNnKCk6IHJlY2VpdmVkIHBhcnRpYWwgY29udHJvbCBwYWNrZXQgLSBwYW5pY1xuIik7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgICAgIGRlYnVnKCBGMTAxLCAieDI1Z2V0bXNnIGdldG1zZyBiYWQgY29udHJvbCBibG9ja1xuIiwgIiIsIGVycm5vKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHQgPSAoTl9ucGlfY3RsX3QgKiljb250cm9sKSB7CisgICAgICAgICAgICBwYWNrZXRfdHlwZSA9IHJlc3VsdC0+YmluZF9hY2suUFJJTV90eXBlOworICAgICAgICAgICAgaWYgKHBhY2tldF90eXBlICE9IE5fT0tfQUNLKSB7CisgICAgICAgICAgICAgICAgeDI1bGFzdG1zZyA9IHBhY2tldF90eXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisjaWZkZWYgREVCVUcKKyAgICAgICAgLyogcHJpbnRmKCAia2VybWl0OiB4MjVnZXRtc2coKTogZ2V0dGluZyAiICk7ICovCisgICAgICAgIGlmIChnZXRfY3RsLT5sZW4gPiAwKSB7CisgICAgICAgICAgICB4MjVkdW1wX3ByaW0ocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTEwLAorICAgICAgICAgICAgICAieDI1Z2V0bXNnIGdvdCBwYWNrZXQgIiwKKyAgICAgICAgICAgICAgeDI1cHJpbSggcmVzdWx0LT5iaW5kX2Fjay5QUklNX3R5cGUgKSwKKyAgICAgICAgICAgICAgMAorICAgICAgICAgICAgICApOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgICAgICAgaWYgKGdldF9jdGwtPmxlbiA+PSAoaW50KXNpemVvZihyZXN1bHQtPmJpbmRfYWNrLlBSSU1fdHlwZSkpIHsKKyAgICAgICAgICAgIC8qIG5vdCBhcyBwcmV0dHkgYXMgYSBzd2l0Y2goKSwgYnV0IHN3aXRjaCBjYW4ndCBoYW5kbGUKKyAgICAgICAgICAgICAqIHJ1bnRpbWUgdmFyaWFibGUgdmFsdWVzIDotKAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocGFja2V0X3R5cGUgPT0gZXhwZWN0ZWQgKSB7CisgICAgICAgICAgICAgICAgLyogZ290IHdoYXQgd2Ugd2FudGVkLCBzcGVjaWFsIGNhc2UgZm9yIERBVEFfSU5ECisgICAgICAgICAgICAgICAgICogcGFja2V0cyB0aG91Z2ggKi8KKyAgICAgICAgICAgICAgICAvKiByaWVobTogY2hlY2sgUS1iaXQgPyAqLworI2lmZGVmIERFQlVHCisgICAgICAgICAgICAgICAgcHJpbnRmKCJ4MjVnZXRtc2coKTogZ290IGV4cGVjdGVkIHBhY2tldFxucmMgaXMgJWRcbiIsIHJjKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICAgICAgICAgIGlmIChwYWNrZXRfdHlwZSA9PSBOX0RBVEFfSU5EICkgeworICAgICAgICAgICAgICAgICAgICAvKiBkYXRhIHJlY2VpdmVkLiBNYXkgYmUgaW5jb21wbGV0ZSwgZXZlbiB0aG91Z2gKKyAgICAgICAgICAgICAgICAgICAgICogZ2V0bXNnIHJldHVybmVkIE9LCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LT5kYXRhX2luZC5EQVRBX3hmZXJfZmxhZ3MgJiBOX01PUkVfREFUQV9GTEFHKQorICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSB8PSBNT1JFREFUQTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC0+ZGF0YV9pbmQuREFUQV94ZmVyX2ZsYWdzICYgTl9SQ19GTEFHKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAieDI1Z2V0bXNnKCk6IGRhdGEgcGFja2V0IHdhbnRzIGFja1xuIiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiggcGFja2V0X3R5cGUgPT0gTl9ESVNDT05fSU5EKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCAiWDI1IGRpY29ubmVjdGVkXG4iICk7CisgICAgICAgICAgICAgICAgLyogcmllaG06IG5lZWQgdG8gYWNrbm93bGVkZ2UgYSBkaXNjb25uZWN0aW9uPyAqLworICAgICAgICAgICAgICAgIHgyNWNsZWFyKCk7CisgICAgICAgICAgICAgICAgLyogeDI1dW5iaW5kKCB0dHlmZCApOyAqLworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYoIHBhY2tldF90eXBlID09IE5fRVJST1JfQUNLKSB7CisgICAgICAgICAgICAgICAgZXJybm8gPSByZXN1bHQtPmVycm9yX2Fjay5VTklYX2Vycm9yOworICAgICAgICAgICAgICAgIHBlcnJvciggIlgyNSBlcnJvciByZWNlaXZlZCIgKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIngyNWdldG1zZygpOiBmYWlsZWQgJXNcbiIsIHgyNWVycihwYWNrZXRfdHlwZSkpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZmRlZiBDT01NRU5UCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogUGFuaWMgLSBubyBjb250cm9sIGRhdGEgKi8KKyAgICAgICAgICAgIHByaW50ZiggImtlcm1pdDogeDI1Z2V0bXNnKCk6IG5vIGNvbnRyb2wgZGF0YSB3aXRoIHBhY2tldFxuIiApOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgICAgICBpZiAoZ2V0X2RhdGEgJiYgKGdldF9kYXRhLT5sZW4gPj0gMCkpIHsKKyAgICAgICAgICAgIGdldF9kYXRhLT5idWYgKz0gZ2V0X2RhdGEtPmxlbjsKKyAgICAgICAgICAgIGdldF9kYXRhLT5tYXhsZW4gLT0gZ2V0X2RhdGEtPmxlbjsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKChyYyA9PSAwKQorICAgICAgICAgICAgICYmIChnZXRfZGF0YSAmJiAoZ2V0X2RhdGEtPm1heGxlbiA+IDApKQorICAgICAgICAgICAgICYmIChtb3JlICYgTU9SRURBVEEpCisgICAgICAgICAgICAgKTsKKworICAgIC8qIHJldHVybiB0aGUgZmlsZSBzdGF0dXMgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLCB1bmxlc3MgaXRzIHN0aWxsCisgICAgICogc2V0IHRvIC0xLCBvciBvbmUgb2YgdGhlIGZjbnRsJ3MgZmFpbGVkICovCisgICAgaWYgKChmaWxlX3N0YXR1cyA+PSAwKSAmJiBmY250bChmZCwgRl9TRVRGTCwgZmlsZV9zdGF0dXMpIDwgMCkKKyAgICAgICAgcmMgPSAtMTsKKworICAgIC8qCisgICAgICogVmVyaWZ5IHRoYXQgd2UgcmVjZWl2ZWQgYW4gZXhwZWN0ZWQgcHJpbWl0aXZlCisgICAgICogdGhlcmUgaXMgYXBwYXJhbnRseSBhbiBlcnJvciBjYXNlIHdoZXJlIHRoZSBwcmltaXRpdmUgaXMgc2V0CisgICAgICogY29ycmVjdGx5LCBidXQgdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhIGluIHRoZSBjb250cm9sIHN0cnVjdHVyZQorICAgICAqLworICAgIGlmICgocGFja2V0X3R5cGUgIT0gZXhwZWN0ZWQpICYmIChnZXRfY3RsLT5sZW4gPj0gY3RsX3NpemUpICkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAieDI1Z2V0bXNnKCk6ICVzIE5PVCByZWNlaXZlZC4gUHJpbWl0aXZlIHJlY2VpdmVkIHdhcyAlc1xuIiwKKyAgICAgICAgICAgICAgICB4MjVwcmltKCBleHBlY3RlZCApLCB4MjVwcmltKCBwYWNrZXRfdHlwZSApKTsKKyAgICAgICAgZGVidWcoRjExMCwgIngyNWdldG1zZyBnb3QgYW4gdW5leHBlY3RlZCBwYWNrZXQgIiwKKyAgICAgICAgICAgICAgeDI1cHJpbShwYWNrZXRfdHlwZSksCisgICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAgKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisKKyAgICBpZiAocmMgPT0gMCkgeworICAgICAgICBpZiAoZ2V0X2RhdGEgJiYgKCBnZXRfZGF0YS0+bGVuID49IDApKSB7CisgICAgICAgICAgICByYyA9IGdldF9kYXRhLT5sZW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2V0X2N0bCkgIHsgZnJlZShnZXRfY3RsKTsgZ2V0X2N0bCA9IE5VTEw7IH0KKyAgICBpZiAoZ2V0X2RhdGEpIHsgZnJlZShnZXRfZGF0YSk7IGdldF9kYXRhID0gTlVMTDsgfQorCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCAia2VybWl0IHgyNWdldG1zZygpOiByZXR1cm5pbmcgJWRcbiIsIHJjICk7CisjZW5kaWYgLyogREVCVUcgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgZGVidWcoRjExMCwgIngyNWdldG1zZyByZXR1cm5pbmcgcGFja2V0ICIsIHgyNXByaW0oIHBhY2tldF90eXBlICksIDApOworCisjaWZkZWYgVFJBQ0UKKyAgICBwcmludGYoICJUUkFDRTogbGVhdmluZyB4MjVnZXRtc2dcbiIgKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworICAgIHJldHVybihyYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHgyNXB1dG1zZygpCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgIHNlbmQgYSBtZXNzYWdlIHRvIGEgWDI1IFNUUkVBTQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICAgIGZkICAgICAgICAgICAgICAtIGZpbGUgZGVzY3JpcHRvciB0byB4MjUgZGV2aWNlIChvcGVuZWQpCisgKiAgICAgIGNvbnRyb2wgICAgICAgICAtIGNvbnRyb2wgYnVmZmVyIChwcmUtYWxsb2NhdGVkKQorICogICAgICBkYXRhICAgICAgICAgICAgLSBkYXRhIGJ1ZmZlciAocHJlLWFsbG9jYXRlZCkKKyAqICAgICAgZGF0YV9sZW4gICAgICAgIC0gbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQKKyAqICAgICAgcHV0X2ZsYWdzICAgICAgIC0gZmxhZ3MgZm9yIHB1dG1zZygpCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgICA+PSAwICAgIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZAorICogICAgICAtMSAgICAgIGVycm9yCisgKi8KK2ludAoreDI1cHV0bXNnKGZkLCBjb250cm9sLCBkYXRhLCBkYXRhX2xlbiwgcHV0X2ZsYWdzKQorICAgIGludCAgICAgICAgICAgICAgICAgZmQ7ICAgICAgICAgICAgIC8qIFgyNSBkZXZpY2UgKG9wZW5lZCkgKi8KKyAgICBOX25waV9jdGxfdCAgICAgICAgICpjb250cm9sOyAgICAgICAvKiBjb250cm9sIGJ1ZmZlciAocHJlLWFsbG9jYXRlZCkgKi8KKyAgICBOX25waV9kYXRhX3QgICAgICAgICpkYXRhOyAgICAgICAgICAvKiBkYXRhIGJ1ZmZlciAocHJlLWFsbG9jYXRlZCkgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGRhdGFfbGVuOyAgICAgICAvKiBsZW5ndGggb2YgZGF0YSAobm90IHRoZSBzaXplIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ1ZmZlcikgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICpwdXRfZmxhZ3M7ICAgICAvKiBwdXRtc2coKSBmbGFncyAqLworLyogeDI1cHV0bXNnICovIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJjID0gMDsgICAgICAgICAvKiByZXR1cm4gY29kZSAqLworICAgIHVsb25nICAgICAgICAgICAgICAgdHlwZTsgICAgICAgICAgIC8qIHByaW1pdGl2ZSB0eXBlICovCisgICAgc3RydWN0IHN0cmJ1ZiAgICAgICAqcHV0X2N0bCA9IE5VTEw7IC8qIHB1dG1zZyBjb250cm9sICovCisgICAgc3RydWN0IHN0cmJ1ZiAgICAgICAqcHV0X2RhdGEgPSBOVUxMOyAvKiBwdXRtc2cgZGF0YSAqLworCisjaWZkZWYgVFJBQ0UKKyAgICBwcmludGYoICJUUkFDRTogZW50ZXJpbmcgeDI1cHV0bXNnXG4iICk7CisjZW5kaWYgLyogVFJBQ0UgKi8KKworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCAia2VybWl0OiB4MjVwdXRtc2coKTogcHV0dGluZyAiICk7CisgICAgeDI1ZHVtcF9wcmltKCBjb250cm9sICk7CisgICAgcHJpbnRmKCAiXHRkYXRhOlx0XHQiICk7CisgICAgeDI1ZHVtcF9kYXRhKCBkYXRhLCAwLCBkYXRhX2xlbiApOworICAgIGRlYnVnKEYxMTAsIngyNXB1dG1zZzogcHV0dGluZyBwYWNrZXQgIix4MjVwcmltKGNvbnRyb2wtPlBSSU1fdHlwZSksMCk7CisjZW5kaWYgLyogREVCVUcgKi8KKworICAgIGlmIChjb250cm9sKSB7CisgICAgICAgIHB1dF9jdGwgPSAoc3RydWN0IHN0cmJ1ZiAqKW1hbGxvYyggc2l6ZW9mKCBzdHJ1Y3Qgc3RyYnVmICkgKTsKKyAgICAgICAgaWYgKHB1dF9jdGwgPT0gTlVMTCkgeworICAgICAgICAgICAgcGVycm9yKCJrZXJtaXQgeDI1cHV0bXNnKCk6IHB1dF9jdGwgbWFsbG9jIGZhaWxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgICAgIHB1dF9jdGwtPm1heGxlbiA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiB1bnVzZWQgYnkgcHV0bXNnICovCisgICAgICAgIHB1dF9jdGwtPmxlbiA9IE5QSV9NQVhfQ1RMOworICAgICAgICBwdXRfY3RsLT5idWYgPSAoY2hhciAqKWNvbnRyb2w7CisgICAgfQorICAgIGlmIChkYXRhICYmICggZGF0YV9sZW4gPiAwKSkgeworICAgICAgICBwdXRfZGF0YSA9IChzdHJ1Y3Qgc3RyYnVmICopbWFsbG9jKCBzaXplb2YoIHN0cnVjdCBzdHJidWYgKSApOworICAgICAgICBpZiggcHV0X2RhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcGVycm9yKCJrZXJtaXQgeDI1cHV0bXNnKCk6IHB1dF9kYXRhIG1hbGxvYyBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBwdXRfZGF0YS0+bWF4bGVuID0gMDsgICAgICAgICAgICAgICAgICAgLyogdW51c2VkIGJ5IHB1dG1zZyAqLworICAgICAgICBwdXRfZGF0YS0+bGVuID0gZGF0YV9sZW47CisgICAgICAgIHB1dF9kYXRhLT5idWYgPSAoY2hhciAqKWRhdGE7CisgICAgfQorCisgICAgZXJybm8gPSAwOworICAgIHJjID0gcHV0bXNnIChmZCwgcHV0X2N0bCwgcHV0X2RhdGEsIDApOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgcHJpbnRmKCJ4MjVwdXRtc2coKTogY291bGRuJ3QgcHV0ICVzXG4iLHgyNXByaW0oY29udHJvbC0+UFJJTV90eXBlKSk7CisgICAgICAgIHBlcnJvcigia2VybWl0OiB4MjVwdXRtc2coKTogcHV0bXNnIGZhaWxlZCIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIHJpZWhtOiB0aGlzIHNob3VsZCBwZXJoYXBzIGJlIGRpc2NvdW50ZWQhICovCisgICAgeDI1bGFzdG1zZyA9IGNvbnRyb2wtPlBSSU1fdHlwZTsKKworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBERUJVRworICAgIHByaW50ZiggImtlcm1pdCBkZWJ1ZzogeDI1cHV0bXNnKCkgcmV0dXJuaW5nICVkXG4iLCBkYXRhX2xlbiApOworI2VuZGlmIC8qIERFQlVHICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIGRlYnVnKCBGMTAxLCAieDI1cHV0bXNnIGJsb2NrIHNpemUgcHV0ICIsICIiLCBkYXRhX2xlbik7CisKKyNpZmRlZiBUUkFDRQorICAgIHByaW50ZiggIlRSQUNFOiBsZWF2aW5nIHgyNXB1dG1zZ1xuIiApOworI2VuZGlmIC8qIFRSQUNFICovCisKKyAgICByZXR1cm4oIGRhdGFfbGVuICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGdW5jdGlvbjogeDI1YmluZAorKiBEZXNjcmlwdGlvbjogIFRoZSBiaW5kIHN1Ym1pdHRlZCB0byBOUEkgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkCisqICAgICAgICAgICAgICAgYnkgdGhlIHBhY2tldCBsYXllciBmb3IgaXQgdG8gbGlzdGVuIGZvciBzdWl0YWJsZSBpbmNvbWluZworKiAgICAgICAgICAgICAgIGNhbGxzLgorKgorKiBXQVJOSU5HOgorKgorKiBUaGlzIHJvdXRpbmUgbmVlZHMgdG8gYmUgY2FsbGVkIGluIGEgY29tcGxldGVseSBkaWZmZXJlbnQgbWFubmVyIGZvcgorKiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZS4gV2hlbiBzdGFydGluZyBhIGNsaWVudCwgdGhlCisqIG51bV93YWl0aW5nX2NhbGxzIGFuZCBDVUQgaW5mb3JtYXRpb24gc2hvdWxkIGFsbCBiZSBzZXQgdG8gMCEgVGhlCisqIGNsaWVudCdzIENVRCBtdXN0IGJlIGluc2VydGVkIGluIHRoZSBDT05OX1JFUSBkYXRhIGJsb2NrLgorKiBXaGVuIHN0YXJ0aW5nIGEgc2VydmVyLCB0aGUgQ1VEIG11c3QgYmUgc2V0IHRvIGEgQ1VEIHBhdHRlcm4sIGFuZAorKiB0aGUgbnVtYmVyIG9mIHdhaXRpbmcgY2FsbHMgc2hvdWxkIGJlIHNldCB0byBhIG51bWJlciBvdGhlciB0aGFuIDAuCisqIChudW0gd2FpdGluZyBjYWxscyBpcyB0aGUgbnVtYmVyIG9mIGluY29tbWluZyBjYWxscyB3aGljaCBhcmUgdG8gYmUKKyogcHV0IG9uIGhvbGQgd2hpbGUgdGhlIHNlcnZlciBpcyBzZXJ2aWNpbmcgYW5vdGhlciBjbGllbnQuKQorKgorKiBXaG8gaW52ZW50ZWQgdGhpcyBjcmFwPworKgorKiBQYXJhbWV0ZXJzOgorKiAgICAgICBmZCAgICAgICAgICAgICAgLSBYMjUgZGV2aWNlIChvcGVuZWQpCisqICAgICAgIGFkZHIgICAgICAgICAgICAtIGxvY2FsIGFkZHJlc3MKKyogICAgICAgY3VkICAgICAgICAgICAgIC0gVXNlciBEYXRhIChudWxsIHRlcm1pbmF0ZWQpCisqICAgICAgIGN1ZF9sZW4gICAgICAgICAtIFVzZXIgRGF0YSBsZW5ndGgKKyogICAgICAgbnVtX3dhaXRpbmdfY2FsbHMgLSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgY2FsbHMgYWxsb3dlZCBvbiB0aGlzIHN0cmVhbQorKiAgICAgICBsaW5lICAgICAgICAgICAgLSBsb2dpY2FsIHBvcnQgbnVtYmVyICgxKQorKiAgICAgICBmbGFncyAgICAgICAgICAgLSAwLCBERUZBVUxUX0xJU1RFTkVSIG9yIFRPS0VOX1JFUVVFU1QKKyoKKyogUmV0dXJuIFZhbHVlOgorKiAgICAgICBpZiBiaW5kaW5nIGlzIHN1Y2Nlc3NmdWwsIDAgaXMgcmV0dXJuZWQgZm9yIGEgY2xpZW50LCBhbmQgYSB0b2tlbiBpcworKiAgICAgICByZXR1cm5lZCBmb3IgYSBzZXJ2ZXIKKyoKKyogUmV0dXJuIGNvZGU6IDAgaWYgc3VjY2Vzc2Z1bAorKiAgICAgICAgICAgICAgLTEgaWYgdW5zdWNjZXNzZnVsCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordWxvbmcKK3gyNWJpbmQoZmQsIGFkZHIsIGN1ZCwgY3VkX2xlbiwgbnVtX3dhaXRpbmdfY2FsbHMsIGxpbmUsIGJpbmRfZmxhZ3MpCisgICAgaW50IGZkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWDI1IGRldmljZSAob3BlbmVkKSAqLworICAgIGNoYXIgKiBhZGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIGFkZHJlc3MgKi8KKyAgICBjaGFyICogY3VkOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsIFVzZXIgRGF0YSAobnVsbCB0ZXJtaW5hdGVkKSAqLworICAgIGludCBjdWRfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZXIgRGF0YSBsZW5ndGggKi8KKyAgICBpbnQgbnVtX3dhaXRpbmdfY2FsbHM7ICAgICAgICAgICAgICAvKiBPdXRzdGFuZGluZyBjYWxscyBhbGxvd2VkICovCisgICAgaW50IGxpbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9naWNhbCBwb3J0IG51bWJlciAqLworICAgIHVsb25nIGJpbmRfZmxhZ3M7ICAgICAgICAgICAvKiAwLCBERUZBVUxUX0xJU1RFTkVSIG9yIFRPS0VOX1JFUVVFU1QgKi8KKy8qIHgyNWJpbmQgKi8geworICAgIHVsb25nIHJjOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCisgICAgaW50IGdldF9mbGFnczsgICAgICAgICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgZmxhZyBwYXNzZWQgdG8gZ2V0bXNnICovCisgICAgaW50IHB1dF9mbGFncyA9IDA7ICAgICAgICAgICAgICAgICAgLyogb3V0cHV0IGZsYWdzIGZvciBwdXRtc2csIGFsd2F5cyAwICovCisgICAgdWxvbmcgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJpbWl0aXZlIHR5cGUgKi8KKyAgICBOX2JpbmRfcmVxX3QgKmJpbmRfcmVxOyAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIE5fQklORF9SRVEgcHJpbWl0aXZlICovCisgICAgTl9iaW5kX2Fja190ICpiaW5kX2FjazsgICAgICAgICAgICAgLyogcG9pbnRlciB0byBOX0JJTkRfQUNLIHByaW1pdGl2ZSAqLworICAgIGNoYXIgKmFkZHRsX2luZm87ICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gaW5mbyBpbiBhZGRpdGlvbiB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBOX0JJTkRfUkVRIHByaW1pdGl2ZSB0aGF0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFzc2VkIGluIHRoZSBjb250cm9sIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHB1dG1zZyAqLworICAgIGludCBhZGRyX2xlbiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBhZGRyZXNzIHN0cmluZyAqLworICAgIHVsb25nIGJpbmRfcmVxX3Rfc2l6ZTsgICAgICAgICAgICAgIC8qIGZvciBkZWJ1Z2dpbmcgb25seSAqLworCisjaWZkZWYgVFJBQ0UKKyAgICBwcmludGYoIlRSQUNFOiBlbnRlcmluZyB4MjViaW5kXG4iICk7CisjZW5kaWYgLyogVFJBQ0UgKi8KKworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCJUUkFDRTogeDI1YmluZCggJWQsICVzLCAlcywgJWQsICVkIClcbiIsCisgICAgICAgICAgIGZkLCBhZGRyLCBjdWQsIGxpbmUsIGJpbmRfZmxhZ3MKKyAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgLyoKKyAgICAgKiBBbGxvY2F0ZSAgYW5kIHplcm8gb3V0IHNwYWNlIHRvIGhvbGQgdGhlIGNvbnRyb2wgcG9ydGlvbiBvZiB0aGUKKyAgICAgKiBtZXNzYWdlIHBhc3NlZCB0byBwdXRtc2cuIFRoaXMgd2lsbCBjb250YWluIHRoZSBOX0JJTkRfUkVRCisgICAgICogcHJpbWl0aXZlIGFuZCBhbnkgYWRkaXRpb25hbCBpbmZvIHJlcXVpcmVkIGZvciB0aGF0LgorICAgICAqCisgICAgICogTm90ZTogYWxsb2NhdGVkIHNwYWNlIGlzIHRoZSBzaXplIG9mIHRoZSB1bmlvbiB0eXBlZGVmCisgICAgICogTl9ucGlfY3RsX3QgdG8gYWxsb3cgdGhlIHVzZSBmbyB0aGUgZ2VuZXJpYyB4MjVwdXRtc2cgcm91dGluZS4KKyAgICAgKi8KKyAgICBiaW5kX3JlcSA9IChOX2JpbmRfcmVxX3QgKikgbWFsbG9jKHNpemVvZiggTl9ucGlfY3RsX3QpKTsKKyAgICBpZiAoYmluZF9yZXEgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoImtlcm1pdDogeDI1YmluZCgpOiBiaW5kX3JlcSBtYWxsb2MgZmFpbGVkIik7CisgICAgICAgIGRlYnVnKEYxMDAsICJ4MjViaW5kIGJpbmRfcmVxIG1hbGxvYyBmYWlsZWQiLCAiIiwgMCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGJ6ZXJvKChjaGFyICopYmluZF9yZXEsIHNpemVvZihOX25waV9jdGxfdCkpOworCisgICAgLyogQnVpbGQgdGhlIEJpbmQgUmVxdWVzdCBQcmltaXRpdmUgKi8KKyAgICBiaW5kX3JlcS0+UFJJTV90eXBlID0gKHVsb25nKSBOX0JJTkRfUkVROworCisgICAgLyogTm90ZSB0aGF0IHRoZSBhZGRyZXNzIGxlbmd0aCBpcyBuKzIgYW5kIE5PVCBuLiBUd28gYnl0ZXMgTVVTVCBwcmVjZWVkCisgICAgICogdGhlIGFjdHVhbCBhZGRyZXNzIGluIGFuIE5fQklORF9SRVEuIFRoZSBmaXJzdCBieXRlIGNvbnRhaW5zIHRoZQorICAgICAqIGxpbmUgbnVtYmVyIGJlaW5nIHVzZWQgd2l0aCB0aGlzIGFkZHJlc3MsIGFuZCB0aGUgc2Vjb25kIGJ5dGUgaXMgdGhlCisgICAgICogWC4xMjEgYWRkcmVzcyBwcmVmaXgsIHdoaWNoIG11c3QgYmUgemVyby4KKyAgICAgKi8KKyAgICBhZGRyX2xlbiA9IHN0cmxlbihhZGRyKTsKKyAgICBiaW5kX3JlcS0+QUREUl9sZW5ndGggPSAodWxvbmcpIChhZGRyX2xlbiArIDIpOworICAgIGJpbmRfcmVxLT5BRERSX29mZnNldCA9ICh1bG9uZykoc2l6ZW9mKE5fYmluZF9yZXFfdCkpOworICAgIGJpbmRfcmVxLT5DT05JTkRfbnVtYmVyID0gKHVsb25nKW51bV93YWl0aW5nX2NhbGxzOyAvKiBzZXJ2ZXIgb25seSAqLworICAgIGJpbmRfcmVxLT5CSU5EX2ZsYWdzID0gKHVsb25nKSBiaW5kX2ZsYWdzOyAvKiAwIGluIGNsaWVudCAqLworICAgIGJpbmRfcmVxLT5QUk9UT0lEX2xlbmd0aCA9ICh1bG9uZykgY3VkX2xlbjsgLyogMCBpbiBjbGllbnQgKi8KKyAgICBpZiAoY3VkX2xlbiA9PSAwKSB7CisgICAgICAgIGJpbmRfcmVxLT5QUk9UT0lEX29mZnNldCA9ICh1bG9uZykgMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBuZWVkIHRvIHJlbWVtYmVyIHRoZSB0cmFpbGluZyBOVUxMIGluIHRoZSBhZGRyZXNzIC0gbm90CisgICAgICAgICAqIGNvdW50ZWQgaW4gdGhlIGFkZHJlc3MgbGVuZ3RoCisgICAgICAgICAqLworICAgICAgICBiaW5kX3JlcS0+UFJPVE9JRF9vZmZzZXQKKyAgICAgICAgICA9ICh1bG9uZykgKHNpemVvZihOX2JpbmRfcmVxX3QpICsgYmluZF9yZXEtPkFERFJfbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5vdyBmaWxsIGluIHRoZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlcXVpcmVkIHdpdGggdGhpcyBwcmltaXRpdmUKKyAgICAgKiAoYWRkcmVzcyBhbmQgcHJvdG9jb2wgaW5mb3JtYXRpb24gKENhbGwgVXNlciBEYXRhKSkKKyAgICAgKi8KKyAgICBhZGR0bF9pbmZvID0gKGNoYXIgKikgKCh2b2lkICopYmluZF9yZXEgKyBiaW5kX3JlcS0+QUREUl9vZmZzZXQpOworICAgIC8qCisgICAgICogVGhlIGJpdHdpc2UgIiYiIGVuc3VyZXMgdGhhdCB0aGUgbGluZSBudW1iZXIgaXMgb25seSBvbmUgYnl0ZSBsb25nCisgICAgICovCisgICAgKmFkZHRsX2luZm8rKyA9IChjaGFyKSBsaW5lICYgMHhmZjsKKyAgICAqYWRkdGxfaW5mbysrID0gKGNoYXIpIDA7IC8qIFguMTIxIGZvcm1hdCAqLworICAgIGJjb3B5KCBhZGRyLCBhZGR0bF9pbmZvLCBhZGRyX2xlbiApOyAvKiBpbmNsdWRlIHRyYWlsaW5nIG51bGwgKi8KKyAgICBhZGR0bF9pbmZvICs9IGFkZHJfbGVuOworICAgIGlmIChjdWRfbGVuID4gMCkKKyAgICAgIGJjb3B5KCBjdWQsIGFkZHRsX2luZm8sIGN1ZF9sZW4gKTsKKyAgICAvKgorICAgICAqIENhbGwgcHV0bXNnKCkgdG8gcHV0IHRoZSBiaW5kIHJlcXVlc3QgbWVzc2FnZSBvbiB0aGUgc3RyZWFtCisgICAgICovCisgICAgaWYgKHgyNXB1dG1zZyhmZCwKKyAgICAgICAgICAgICAgICAgIChOX25waV9jdGxfdCopYmluZF9yZXEsCisgICAgICAgICAgICAgICAgICAoTl9ucGlfZGF0YV90ICopTlVMTCwKKyAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAmcHV0X2ZsYWdzCisgICAgICAgICAgICAgICAgICApIDwgMCkgeworICAgICAgICBwcmludGYoICJrZXJtaXQ6IHgyNWJpbmQoKTogeDI1cHV0bXNnIGZhaWxlZFxuIiApOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qCisgICAgICogQWxsb2NhdGUgYW5kIHplcm8gb3V0IHNwYWNlIGZvciB0aGUgTl9CSU5EX0FDSyBwcmltaXRpdmUKKyAgICAgKi8KKyAgICBiaW5kX2FjayA9IChOX2JpbmRfYWNrX3QgKikgbWFsbG9jKHNpemVvZihOX25waV9jdGxfdCkpOworICAgIGlmIChiaW5kX2FjayA9PSBOVUxMKXsKKyAgICAgICAgcGVycm9yKCJrZXJtaXQ6IHgyNWJpbmQoKTogYmluZF9hY2sgbWFsbG9jIGZhaWxlZCIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBiemVybyhiaW5kX2Fjaywgc2l6ZW9mKE5fbnBpX2N0bF90KSk7CisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplIHRoZSBjb250cm9sIHN0cnVjdHVyZSBhbmQgZmxhZyB2YXJpYWJsZSBzZW50IHRvIGdldG1zZworICAgICAqLworICAgIGdldF9mbGFncz0wOworCisgICAgLyogZ2V0IHRoZSBBQ0sgZm9yIHRoZSBiaW5kICovCisjaWZkZWYgREVCVUcKKyAgICBwcmludGYoICJrZXJtaXQ6IHgyNWJpbmQoKSB0cnlpbmcgdG8gZ2V0IGEgQklORF9BQ0tcbiIgKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHVsb25nKXgyNWdldG1zZyggZmQsIChOX25waV9jdGxfdCopYmluZF9hY2ssCisgICAgICAgICAgICAoaW50KXNpemVvZiggTl9iaW5kX2Fja190ICksIChOX25waV9kYXRhX3QqKU5VTEwsIDAsICZnZXRfZmxhZ3MsCisgICAgICAgICAgICBOX0JJTkRfQUNLICk7CisKKyAgICAvKiB0dXJuIHF1YW50aXRpdmUgcmV0dXJuIGNvZGUgaW50byBhIHF1YWxpdGF0aXZlIG9uZSAqLworICAgIGlmIChyYyA+IDApIHJjID0gMDsKKworICAgIC8qIGlmIGFsbCB3ZW50IHdlbGwsIGdldCB0aGUgdG9rZW4gZnJvbSB0aGUgYWNrbm93bGVkZ2VtZW50IHBhY2tldCAqLworICAgIGlmICgoYmluZF9mbGFncyAmIFRPS0VOX1JFUVVFU1QgKSAmJiAoIHJjID49IDApKSB7CisgICAgICAgIHJjID0gYmluZF9hY2stPlRPS0VOX3ZhbHVlOworICAgIH0KKworICAgIC8qIGZyZWUgdXAgdGhlIG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZWFybGllciAqLworICAgIGZyZWUoYmluZF9yZXEpOworICAgIGZyZWUoYmluZF9hY2spOworCisjaWZkZWYgVFJBQ0UKKyAgICBwcmludGYoICJUUkFDRTogbGVhdmluZyB4MjViaW5kXG4iICk7CisjZW5kaWYgLyogVFJBQ0UgKi8KKworICAgIHJldHVybiggcmMgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZ1bmN0aW9uOiB4MjVjYWxsCisqIERlc2NyaXB0aW9uOiAgVGhpcyByb3V0aW5lIGJ1aWxkcyBhbmQgc2VuZHMgYW4gTl9DT05OX1JFUSBwcmltaXRpdmUsIHRoZW4KKyogICAgICAgICAgICAgICBjaGVja3MgZm9yIGFuIE5fQ09OTl9DT04gcHJpbWl0aXZlIGluIHJldHVybi4KKyoKKyogUGFyYW1ldGVyczoKKyogZmQgICAgLSBmaWxlIGRlc2NyaXB0b3Igb2Ygc3RyZWFtCisqIGNhZGRyIC0gY2FsbGVkIGFkZHJlc3MgKHJlbW90ZSBhZGRyZXNzKQorKgorKiBGdW5jdGlvbnMgUmVmZXJlbmNlZDoKKyogbWFsbG9jKCkKKyogYnplcm8oKQorKiBnZXRtc2coKQorKiBwdXRtc2coKQorKgorKiBSZXR1cm4gY29kZToKKyogMCAtIGlmIHN1Y2Nlc3NmdWwKKyogLTEgaWYgbm90IHN1Y2Nlc3NmdWwKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50Cit4MjVjYWxsKGZkLCByZW1vdGVfbnVhLCBjdWQpCisgICAgaW50IGZkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWDI1IGRldmljZSAob3BlbmVkKSAqLworICAgIGNoYXIgKiByZW1vdGVfbnVhOyAgICAgICAgICAgICAgICAgIC8qIHJlbW90ZSBhZGRyZXNzIHRvIGNhbGwgKi8KKyAgICBjaGFyICogY3VkOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxsIHVzZXIgZGF0YSAqLworLyogeDI1Y2FsbCAqLyB7CisgICAgaW50IHJjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KKyAgICBpbnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb25uZWN0aW9uIGZsYWdzICovCisgICAgaW50IGdldF9mbGFnczsgICAgICAgICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgZmxhZ3MgZm9yIGdldG1zZyAqLworICAgIHVsb25nIHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByaW1pdGl2ZSB0eXBlICovCisgICAgTl9jb25uX3JlcV90ICpjb25ucmVxX2N0bDsgICAgICAgICAgLyogcG9pbnRlciB0byBOX0NPTk5fUkVRIHByaW1pdGl2ZSAqLworICAgIE5fbnBpX2RhdGFfdCAqY29ubnJlcV9kYXRhOyAgICAgICAgIC8qIHBvaW50ZXIgdG8gTl9DT05OX1JFUSBkYXRhIChDVUQpICovCisgICAgaW50IGNvbm5yZXFfZGF0YV9sZW47ICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGZpbGxlZCBkYXRhIGJ1ZmZlciAqLworICAgIE5fY29ubl9jb25fdCAqY29ubmNvbl9jdGw7ICAgICAgICAgIC8qIHBvaW50ZXIgdG8gTl9DT05OX0NPTiBwcmltaXRpdmUgKi8KKyAgICBOX25waV9kYXRhX3QgKmNvbm5jb25fZGF0YTsgICAgICAgICAvKiBwb2ludGVyIHRvIGFueSBkYXRhIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBOX0NPTk5fQ09OIHByaW1pdGl2ZSAqLworICAgIGNoYXIgKmFkZHRsX2luZm87ICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYWRkaXRpb25hbCBpbmZvIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciBOX0NPTk5fUkVRIHByaW1pdGl2ZSAqLworICAgIGludCBhZGRyX2xlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBhZGRyZXNzICovCisKKyNpZmRlZiBUUkFDRQorICAgIHByaW50ZiggIlRSQUNFOiBlbnRlcmluZyB4MjVjYWxsXG4iICk7CisjZW5kaWYgLyogVFJBQ0UgKi8KKworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCAieDI1Y2FsbCggJWQsICVzIClcbiIsIGZkLCByZW1vdGVfbnVhICk7CisgICAgcHJpbnRmKCAiY29ubmVjdGluZyB0byAlcyBvbiBmZCAlZFxuIiwgcmVtb3RlX251YSwgZmQgKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgLyoKKyAgICAgKiBBbGxvY2F0ZSBhbmQgemVybyBvdXQgc3BhY2UgZm9yIHRoZSBOX0NPTk5fUkVRIHByaW1pdGl2ZQorICAgICAqIHVzZSB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJpYyBOUEkgcHJpbWl0aXZlIGNvbnRyb2wgYnVmZmVyCisgICAgICovCisgICAgY29ubnJlcV9jdGwgID0gKE5fY29ubl9yZXFfdCAqKSBtYWxsb2Moc2l6ZW9mKE5fbnBpX2N0bF90KSk7CisgICAgaWYgKGNvbm5yZXFfY3RsID09IE5VTEwpeworICAgICAgICBwZXJyb3IoImtlcm1pdDogeDI1Y2FsbCgpOiBjb25ucmVxX2N0bCBtYWxsb2MgZmFpbGVkIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGJ6ZXJvKGNvbm5yZXFfY3RsLHNpemVvZihOX25waV9jdGxfdCkpOworICAgIC8qCisgICAgICogQnVpbGQgdGhlIENvbm5lY3Rpb24gUmVxdWVzdCBQcmltaXRpdmUKKyAgICAgKi8KKyAgICBmbGFncyA9IDA7CisgICAgY29ubnJlcV9jdGwtPlBSSU1fdHlwZSA9ICh1bG9uZykgTl9DT05OX1JFUTsKKworICAgIC8qIE5vdGUgdGhhdCB0aGUgYWRkcmVzcyBsZW5ndGggaXMgbmNoYWkrMSBhbmQgbm90IG4rMi4gVGhlIGxpbmUgbnVtYmVyCisgICAgICogaXMgb25seSBwYXNzZWQgd2l0aCB0aGUgYWRkcmVzcyBmb3IgdGhlIGJpbmQuIFRoZSBmaXJzdCBieXRlIG9mCisgICAgICogdGhlIGFkZHJlc3MgZm9yIHRoZSBOX0NPTk4gcHJpbWl0aXZlcyBjb250YWlucyB0aGUgWC4xMjEKKyAgICAgKiBhZGRyZXNzIHByZWZpeCwgd2hpY2ggbXVzdCBiZSB6ZXJvLiBUaGUgcmVtYWluaW5nIGJ5dGVzIGFyZSB0aGUKKyAgICAgKiBhZGRyZXNzIGl0c2VsZi4KKyAgICAgKi8KKyAgICBhZGRyX2xlbiA9IHN0cmxlbiggcmVtb3RlX251YSApOworICAgIGNvbm5yZXFfY3RsLT5ERVNUX2xlbmd0aCA9ICh1bG9uZykgKGFkZHJfbGVuICsgMSk7CisgICAgY29ubnJlcV9jdGwtPkRFU1Rfb2Zmc2V0ID0gKHVsb25nKSBzaXplb2YoTl9jb25uX3JlcV90KTsKKyAgICAvKiBjb25ucmVxX2N0bC0+Q09OTl9mbGFncyA9ICh1bG9uZylFWF9EQVRBX09QVCB8IFJFQ19DT05GX09QVDsgKi8KKyAgICBjb25ucmVxX2N0bC0+Q09OTl9mbGFncyA9ICh1bG9uZykgMDsKKyAgICBjb25ucmVxX2N0bC0+UU9TX2xlbmd0aCA9ICh1bG9uZykgMDsgICAgICAgIC8qIHVuc3VwcG9ydGVkIGluIEFJWCA0LjEgKi8KKyAgICBjb25ucmVxX2N0bC0+UU9TX29mZnNldCA9ICh1bG9uZykgMDsgICAgICAgIC8qIHVuc3VwcG9ydGVkIGluIEFJWCA0LjEgKi8KKworICAgIGFkZHRsX2luZm8gPSAoY2hhciAqKSAoKHZvaWQqKWNvbm5yZXFfY3RsICsgY29ubnJlcV9jdGwtPkRFU1Rfb2Zmc2V0KTsKKyAgICAqYWRkdGxfaW5mbysrID0gKGNoYXIpIDA7IC8qIFguMTIxIGZvcm1hdCAqLworICAgIGJjb3B5KCByZW1vdGVfbnVhLCBhZGR0bF9pbmZvLCBhZGRyX2xlbiApOworCisgICAgLyoKKyAgICAgKiBzZXR1cCB0aGUgZGF0YSBidWZmZXIgZm9yIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QKKyAgICAgKi8KKyAgICBjb25ucmVxX2RhdGEgID0gKE5fbnBpX2RhdGFfdCAqKSBtYWxsb2Moc2l6ZW9mKE5fbnBpX2RhdGFfdCkpOworICAgIGlmIChjb25ucmVxX2RhdGEgPT0gTlVMTCl7CisgICAgICAgIHBlcnJvcigia2VybWl0OiB4MjVjYWxsKCk6IGNvbm5yZXFfZGF0YSBtYWxsb2MgZmFpbGVkIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGJ6ZXJvKGNvbm5yZXFfZGF0YSxzaXplb2YoTl9ucGlfZGF0YV90KSk7CisKKyAgICAvKiBmYWNpbGl0eSBzZWxlY3Rpb24gbmVlZHMgdG8gYmUgcHV0IGluIHRoZSBmcm9udCBvZiBjb25ucmVxX2RhdGEgKi8KKyAgICBjb25ucmVxX2RhdGFfbGVuID0gMDsKKyAgICBjb25ucmVxX2RhdGFfbGVuICs9IHgyNWZhY2lsaXRpZXMoIChjaGFyICopY29ubnJlcV9kYXRhICk7CisgICAgaWYgKGN1ZCAmJiAqY3VkKSB7CisgICAgICAgIGJjb3B5KGN1ZCwKKyAgICAgICAgICAgICAgKGNoYXIgKikoKGNoYXIgKiljb25ucmVxX2RhdGEgKyBjb25ucmVxX2RhdGFfbGVuKSwKKyAgICAgICAgICAgICAgc3RybGVuKGN1ZCkKKyAgICAgICAgICAgICAgKTsKKyAgICAgICAgY29ubnJlcV9kYXRhX2xlbiArPSBzdHJsZW4oIGN1ZCApOworICAgICAgICB9CisKKyAgICAvKgorICAgICAqIENhbGwgcHV0bXNnKCkgdG8gcHV0IHRoZSBjb25uZWN0aW9uIHJlcXVlc3QgbWVzc2FnZSBvbiB0aGUgc3RyZWFtCisgICAgICovCisgICAgcmMgPSB4MjVwdXRtc2coIGZkLCAoTl9ucGlfY3RsX3QqKWNvbm5yZXFfY3RsLCBjb25ucmVxX2RhdGEsCisgICAgICAgICAgICBjb25ucmVxX2RhdGFfbGVuLCAmZmxhZ3MgKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBbGxvY2F0ZSBhbmQgemVybyBvdXQgc3BhY2UgZm9yIHRoZSBOX0NPTk5fQ09OIHByaW1pdGl2ZQorICAgICAqLworICAgIGlmICgoY29ubmNvbl9jdGwgPSAoTl9jb25uX2Nvbl90ICopIG1hbGxvYyhzaXplb2YoTl9ucGlfY3RsX3QpKSkgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoImtlcm1pdDogeDI1Y2FsbCgpOiBjb25uY29uX2N0bCBtYWxsb2MgZmFpbGVkIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGJ6ZXJvKGNvbm5jb25fY3RsLCBzaXplb2YoTl9ucGlfY3RsX3QpKTsKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgYW5kIHplcm8gb3V0IHNwYWNlIGZvciBhbnkgZGF0YSBhc3NvY2lhdGVkIHdpdGggTl9DT05OX0NPTgorICAgICAqLworICAgIGlmICggKGNvbm5jb25fZGF0YSA9IChOX25waV9kYXRhX3QgKikgbWFsbG9jKE5QSV9NQVhfREFUQSkpID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKCJrZXJtaXQ6IHgyNWNhbGwoKTogY29ubmNvbl9kYXRhIG1hbGxvYyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgYnplcm8oY29ubmNvbl9kYXRhLCBOUElfTUFYX0RBVEEpOworCisgICAgLyogSW5pdGlhbGl6ZSBhbmQgYnVpbGQgdGhlIHN0cnVjdHVyZXMgZm9yIGdldG1zZyAqLworICAgIGdldF9mbGFncz0wOworCisgICAgcmMgPSB4MjVnZXRtc2coIGZkLCAoTl9ucGlfY3RsX3QqKWNvbm5jb25fY3RsLCAoaW50KXNpemVvZiggTl9jb25uX2Nvbl90ICksCisgICAgICAgICAgICBjb25uY29uX2RhdGEsIE5QSV9NQVhfREFUQSwgJmdldF9mbGFncywgTl9DT05OX0NPTiApOworCisgICAgLyogdHVybiBxdWFudGl0aXZlIHJldHVybiBjb2RlIGludG8gYSBxdWFsaXRhdGl2ZSBvbmUgKi8KKyAgICBpZiAocmMgPiAwKSByYyA9IDA7CisKKyAgICAvKiBGcmVlIHRoZSBzcGFjZSB0aGF0IHdlIG5vIGxvbmdlciBuZWVkICovCisgICAgaWYgKGNvbm5yZXFfY3RsKSB7IGZyZWUoY29ubnJlcV9jdGwpOyBjb25ucmVxX2N0bCA9IE5VTEw7IH0KKyAgICBpZiAoY29ubmNvbl9jdGwpIHsgZnJlZShjb25uY29uX2N0bCk7IGNvbm5jb25fY3RsID0gTlVMTDsgfQorICAgIGlmIChjb25uY29uX2RhdGEpIHsgZnJlZShjb25uY29uX2RhdGEpOyBjb25uY29uX2RhdGEgPSBOVUxMOyB9CisKKyNpZmRlZiBUUkFDRQorICAgIHByaW50ZiggIlRSQUNFOiBsZWF2aW5nIHgyNWNhbGxcbiIgKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworCisgICAgcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogeDI1Z2V0Y2FsbAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgY2hlY2tzIGZvciBhbiBpbmNvbW1pbmcgY2FsbCwgdmVyaWZpZWQKKyAqIHRoYXQgaXQgaXMgYSBDT05OSU5EIChjb25uZWN0aW9uIGluZGljYXRpb24pIG1lc3NhZ2UsIGFuZCB0aGVuCisgKiBhY2NlcHRzIHRoZSBjYWxsIGFuZCByZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIG5ldyBzdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogZmQgICAtIGZpbGUgZGVzY3JpcHRvciBvZiBsaXN0ZW5pbmcgc3RyZWFtCisgKgorICogUmV0dXJuIENvZGVzOgorICogY2FsbGZkICAgICAgIC0gZmlsZSBkZXNjcmlwdG9yIG9mIGNvbm5lY3RlZCBpbmNvbW1pbmcgY2FsbC4KKyAqICAgICAgICAgICAgICAtIHNldCB0byAtMSBpZiBhbiBlcnJvciBvY2N1cmVkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50Cit4MjVnZXRjYWxsKGZkKSBpbnQgZmQ7IHsKKyAgICBpbnQgeDI1Y2FsbGZkOyAgICAgICAgICAgICAgICAgICAgICAvKiBmZCBvZiBpbmNvbW1pbmcgY2FsbCAqLworICAgIE5fY29ubl9pbmRfdCAqY29ubmluZF9jdGw7ICAgICAgICAgIC8qIGNvbm5pbmQgY29udHJvbGwgYnVmZmVyICovCisgICAgTl9ucGlfZGF0YV90ICpjb25uaW5kX2RhdGE7ICAgICAgICAgLyogY29ubmluZCBkYXRhIGJ1ZmZlciAqLworICAgIGludCBnZXRfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzIGZvciBnZXRtc2cgKi8KKyAgICB1bG9uZyBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uIGZsYWdzICovCisgICAgaW50IHJjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KKworICAgIGV4dGVybiB4MjVhZGRyX3QgcmVtb3RlX251YTsgICAgICAgIC8qIHJlbW90ZSBYLjI1IGFkZHIgZ2xvYmFsIHZhciAqLworCisjaWZkZWYgVFJBQ0UKKyAgICBwcmludGYoICJUUkFDRTogZW50ZXJpbmcgeDI1Z2V0Y2FsbFxuIiApOworI2VuZGlmIC8qIFRSQUNFICovCisKKyAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgY29ubmVjdGlvbiBpbmRpY2F0aW9uIGJ1ZmZlcnMgKi8KKyAgICBpZiAoKGNvbm5pbmRfY3RsID0gKE5fY29ubl9pbmRfdCAqKW1hbGxvYyhzaXplb2YoTl9ucGlfY3RsX3QpKSkgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoImtlcm1pdDogeDI1Z2V0Y2FsbCgpOiBjb25uaW5kX2N0bCBtYWxsb2MgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKyAgICBiemVybyhjb25uaW5kX2N0bCwgc2l6ZW9mKE5fbnBpX2N0bF90KSk7CisKKyAgICBpZiAoKGNvbm5pbmRfZGF0YSA9IChOX25waV9kYXRhX3QgKiltYWxsb2MoTlBJX01BWF9EQVRBKSkgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoImtlcm1pdDogeDI1Z2V0Y2FsbCgpOiBjb25uaW5kX2RhdGEgbWFsbG9jIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisgICAgYnplcm8oY29ubmluZF9kYXRhLCBOUElfTUFYX0RBVEEpOworCisgICAgLyogaW5pdGlhbGlzZSBjb250cm9sIHN0cnVjdHVyZXMgKi8KKyAgICBnZXRfZmxhZ3MgPSAwOworCisgICAgLyogY2FsbCBnZXRtc2cgdG8gY2hlY2sgZm9yIGEgY29ubmVjdGlvbiBpbmRpY2F0aW9uICovCisgICAgaWYgKHgyNWdldG1zZyhmZCwKKyAgICAgICAgICAgICAgICAgIChOX25waV9jdGxfdCopY29ubmluZF9jdGwsCisgICAgICAgICAgICAgICAgICAoaW50KXNpemVvZihOX2Nvbm5faW5kX3QpLAorICAgICAgICAgICAgICAgICAgY29ubmluZF9kYXRhLAorICAgICAgICAgICAgICAgICAgTlBJX01BWF9EQVRBLAorICAgICAgICAgICAgICAgICAgJmdldF9mbGFncywKKyAgICAgICAgICAgICAgICAgIE5fQ09OTl9JTkQKKyAgICAgICAgICAgICAgICAgICkgPCAwKSB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcHJpbnRmKCAieDI1Z2V0Y2FsbCgpOiBlcnJubyBpczogJWRcbiIsIGVycm5vICk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgcGVycm9yICgieDI1Z2V0Y2FsbCgpOiBnZXRtc2cgZmFpbGVkIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgLyogYSBjb25uZWN0aW9uIGluZGljYXRpb24gd2FzIHJlY2VpdmVkCisgICAgICogLSBwdWxsIGl0IHRvIGJpdHMgYW5kIGFuc3dlciB0aGUgY2FsbAorICAgICAqLworICAgIHgyNXNlcW5vID0gY29ubmluZF9jdGwtPlNFUV9udW1iZXI7CisgICAgZmxhZ3MgPSBjb25uaW5kX2N0bC0+Q09OTl9mbGFnczsKKyNpZmRlZiBERUJVRworICAgIHByaW50ZiggInNldHRpbmcgcmVtb3RlX251YSB0byBhIG5ldyB2YWx1ZSBkdWUgdG8gaW5jb21taW5nIGNhbGxcbiIgKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIC8qCisgICAgICogbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGFkZHJlc3MgaXMgbnVsbCB0ZXJtaW5hdGVkLCBlbnN1cmUgdGhhdAorICAgICAqIGFmdGVyIGNvcHlpbmcgdGhhdCBpdCBpcyAoYXNzdW1wdGlvbjogcmVtb3RlX251YSBpcyBsb25nZXIgdGhhbgorICAgICAqIHRoZSBhZGRyZXNzICsgMSkKKyAgICAgKi8KKyAgICBiemVybyhyZW1vdGVfbnVhLCBzaXplb2YocmVtb3RlX251YSkpOworICAgIC8qIG5vdGU6IGNvbm5pbmRfY3RsIGNvbnRhaW5zIGEgeDEyMSBhZGRyZXNzLCB3aGljaCBoYXMgYSBudWxsIGFzCisgICAgICogdGhlIEZJUlNUIGNoYXJhY3RlciAtIHN0cmlwIGl0IG9mZiEKKyAgICAgKi8KKyAgICBja3N0cm5jcHkocmVtb3RlX251YSwKKyAgICAgICAgICAgIChjaGFyKikoKGNoYXIqKWNvbm5pbmRfY3RsICsgY29ubmluZF9jdGwtPlNSQ19vZmZzZXQgKyAxKSwKKyAgICAgICAgICAgIGNvbm5pbmRfY3RsLT5TUkNfbGVuZ3RoIC0gMQorICAgICAgICAgICAgKTsKKyNpZmRlZiBERUJVRworICAgIHByaW50ZiggInJlbW90ZV9udWEgc2V0IHRvIG5ldyB2YWx1ZSBvZiAlc1xuIiwgcmVtb3RlX251YSApOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgICAvKiBlcnJvcnMgaGFuZGxlZCBieSBjYWxsZWUgKi8KKyAgICB4MjVjYWxsZmQgPSB4MjVhY2NlcHQoeDI1c2Vxbm8sIGZsYWdzKTsKKworICAgIC8qIGZyZWUgdGhlIG1hbGxvYydkIGJ1ZmZlcnMgKi8KKyAgICBpZiAoY29ubmluZF9jdGwpIHsgZnJlZShjb25uaW5kX2N0bCk7IGNvbm5pbmRfY3RsID0gTlVMTDsgfQorICAgIGlmIChjb25uaW5kX2RhdGEpIHsgZnJlZShjb25uaW5kX2RhdGEpOyBjb25uaW5kX2RhdGEgPSBOVUxMOyB9CisKKyNpZmRlZiBUUkFDRQorICAgIHByaW50ZiggIlRSQUNFOiBsZWF2aW5nIHgyNWdldGNhbGxcbiIgKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworCisgICAgLyogcmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3IgKG9yIGVycm9yIGlmIDwgMCkgKi8KKyAgICByZXR1cm4oIHgyNWNhbGxmZCApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiB4MjVhY2NlcHQKKyAqCisgKiBEZXNjcmlwdGlvbjogYWNjZXB0IGFuIGluY29tbWluZyBjYWxsCisgKiAgICAgICAgICAgICAgVGhpcyBlc3NlbnRpYWxseSBtZWFucyBvcGVuaW5nIGEgbmV3IFNUUkVBTSBhbmQgc2VuZGluZworICogICAgICAgICAgICAgIGFuIGFja25vd2xlZGdlIGJhY2sgdG8gdGhlIGNhbGxlci4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgICBzZXFubyAgIC0gc2VxdWVuY2UgbnVtYmVyIGZvciBhY2tub3dsZWRnZW1lbnQKKyAqICAgICAgZmxhZ3MgICAtIGZsYWdzIHBhc3NlZCB0byB1cyBieSB0aGUgY2FsbGVyCisgKgorICogUmV0dXJuIENvZGVzOgorICogICAgICBmZCAgICAgIC0gZmlsZSBkZXNjcmlwdG9yIG9mIG5ldyBTVFJFQU0KKyAqICAgICAgICAgICAgICAgIHNldCB0byAtMSBpZiBhbiBlcnJvciBvY2N1cmVkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50Cit4MjVhY2NlcHQoc2Vxbm8sZmxhZ3MpCisgICAgdWxvbmcgc2Vxbm87ICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB1bG9uZyBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uZWN0aW9uIGZsYWdzICovCisvKiB4MjVhY2NlcHQgKi8geworICAgIGludCB4MjVjYWxsZmQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIGZkIGZvciBpbmNvbW1pbmcgY2FsbCAqLworICAgIGludCBnZXRfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IGZsYWdzIGZvciBnZXRtc2cgKi8KKyAgICBpbnQgcHV0X2ZsYWdzID0gMDsgICAgICAgICAgICAgICAgICAvKiBmbGFncyBmb3IgcHV0bXNnLCBhbHdheXMgMCAqLworICAgIGludCBhZGRyX2xlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBsb2NhbCBhZGRyZXNzICovCisgICAgdWxvbmcgdG9rZW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdGlvbiB0b2tlbiAqLworICAgIE5fY29ubl9yZXNfdCAqY29ubl9yZXM7ICAgICAgICAgICAgIC8qIE5fQ09OTl9SRVMgcHJpbWl0aXZlICovCisgICAgTl9va19hY2tfdCAqb2tfYWNrOyAgICAgICAgICAgICAgICAgLyogTl9PS19BQ0sgcHJpbWl0aXZlICovCisgICAgY2hhciAqYWRkdGxfaW5mbzsgICAgICAgICAgICAgICAgICAgLyogdGVtcCBwb2ludGVyICovCisgICAgaW50IHJjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHJldHVybiBjb2RlICovCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgZnJvbSBja2NtYWkuYyAqLworICAgIGV4dGVybiBpbnQgcmV2Y2FsbCwgY2xvc2dyLCBjdWRhdGE7CisgICAgZXh0ZXJuIGNoYXIgdWRhdGFbXTsKKyAgICBleHRlcm4geDI1YWRkcl90IGxvY2FsX251YTsgICAgICAgICAvKiBsb2NhbCBYLjI1IGFkZHJlc3MgKi8KKyAgICBleHRlcm4gY2hhciB4MjVuYW1lW107ICAgICAgICAgICAgICAvKiB4MjUgZGV2aWNlIG5hbWUgKHN4MjVhMCkgKi8KKyAgICBleHRlcm4gY2hhciB4MjVkZXZbXTsgICAgICAgICAgICAgICAvKiB4MjUgZGV2aWNlIGZpbGUgL2Rldi94MjVwa3QgKi8KKyAgICBleHRlcm4gaW50IHgyNXBvcnQ7ICAgICAgICAgICAgICAgICAvKiBsb2dpY2FsIHBvcnQgdG8gdXNlICovCisgICAgdWxvbmcgYmluZF9mbGFncyA9IDA7ICAgICAgICAgICAgICAgLyogZmxhZ3MgZm9yIGJpbmRpbmcgdGhlIFgyNSBzdHJlYW0gKi8KKworI2lmZGVmIFRSQUNFCisgICAgcHJpbnRmKCAiVFJBQ0U6IGVudGVyaW5nIHgyNWFjY2VwdFxuIiApOworI2VuZGlmIC8qIFRSQUNFICovCisKKyAgICAvKiBvcGVuIGEgbmV3IHBhY2tldCBsZXZlbCBzdHJlYW0gKi8KKyAgICBpZiAoKHgyNWNhbGxmZCA9IG9wZW4oeDI1ZGV2LCBPX1JEV1IpKSA8IDApIHsKKyAgICAgICAgcGVycm9yICgia2VybWl0OiB4MjVhY2NlcHQoKTogWC4yNSBkZXZpY2Ugb3BlbiBlcnJvciIpOworICAgICAgICBkZWJ1ZyhGMTAxLCJ4MjVhY2NlcHQoKSBkZXZpY2Ugb3BlbiBlcnJvciIsIiIsZXJybm8pOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIHB1c2ggdGhlIE5QSSBvbnRvIHRoZSBTVFJFQU0gKi8KKyAgICBpZiAoaW9jdGwoeDI1Y2FsbGZkLElfUFVTSCwibnBpIikgPCAwKSB7CisgICAgICAgIHBlcnJvciggImtlcm1pdDogeDI1YWNjZXB0KCk6IGNvdWxkbid0IHB1c2ggbnBpIG9uIHRoZSBYMjUgc3RyZWFtIiApOworICAgICAgICBkZWJ1ZyhGMTAxLCJ4MjVhY2NlcHQgY2FuJ3QgcHVzaCBucGkgb24gdGhlIFgyNSBzdHJlYW0iLCIiLGVycm5vKTsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgLyogYmluZCBrZXJtaXQgc2VydmVyIHRvIHRoZSBsb2NhbCBYMjUgYWRkcmVzcyAqLworICAgIC8qIHRha2VuIGZyb20gL3Vzci9zYW1wbGVzL3N4MjUvbnBpL25waXNlcnZlci5jIChBSVggNCkgKi8KKyAgICBiaW5kX2ZsYWdzIHw9IFRPS0VOX1JFUVVFU1Q7CisgICAgdG9rZW4gPSB4MjViaW5kKHgyNWNhbGxmZCxsb2NhbF9udWEsKGNoYXIgKilOVUxMLDAsMCx4MjVwb3J0LGJpbmRfZmxhZ3MpOworICAgIGlmICh0b2tlbiA8IDApIHsKKyAgICAgICAgcHJpbnRmKCAia2VybWl0OiB4MjVhY2NlcHQoKTogY291bGRuJ3QgYmluZCB0byBsb2NhbCBYMjUgYWRkcmVzc1xuIiApOworICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgY29ubmVjdGlvbiByZXNwb25zZSBwcmltaXRpdmUgKi8KKyAgICBpZiAoKGNvbm5fcmVzID0gKE5fY29ubl9yZXNfdCAqKW1hbGxvYyggTlBJX01BWF9DVEwgKSkgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoImtlcm1pdDogeDI1YWNjZXB0KCk6IGNvbm5fcmVzIG1hbGxvYyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICAgIGJ6ZXJvKChjaGFyICopY29ubl9yZXMsIE5QSV9NQVhfQ1RMKTsKKworICAgIC8qIHNldHVwIGNvbm5lY3Rpb24gcmVzcG9uc2UgcHJpbWl0aXZlICovCisgICAgYWRkcl9sZW4gPSBzdHJsZW4oIGxvY2FsX251YSApOworICAgIGNvbm5fcmVzLT5QUklNX3R5cGUgPSAodWxvbmcpTl9DT05OX1JFUzsKKyAgICBjb25uX3Jlcy0+VE9LRU5fdmFsdWUgPSB0b2tlbjsKKyAgICAvKiBub3RlIGFkZHJlc3MgbGVuZ3RoIGlzIG4rMSB0byBhY2NvbW9kYXRlIHRoZSBYLjEyMSBhZGRyZXNzIHByZWZpeCAqLworICAgIGNvbm5fcmVzLT5SRVNfbGVuZ3RoID0gKHVsb25nKShhZGRyX2xlbiArIDEpOworICAgIGNvbm5fcmVzLT5SRVNfb2Zmc2V0ID0gKHVsb25nKXNpemVvZiggTl9jb25uX3Jlc190ICk7CisgICAgY29ubl9yZXMtPlNFUV9udW1iZXIgPSBzZXFubzsKKyAgICBjb25uX3Jlcy0+Q09OTl9mbGFncyA9IDA7CisgICAgY29ubl9yZXMtPlFPU19sZW5ndGggPSAwOyAgICAgICAgICAgLyogdW5zdXBwb3J0ZWQgLSBtdXN0IGJlIDAgKCE/KSAqLworICAgIGNvbm5fcmVzLT5RT1Nfb2Zmc2V0ID0gMDsKKworICAgIGFkZHRsX2luZm8gPSAoY2hhciAqKSgoY2hhciAqKWNvbm5fcmVzICsgY29ubl9yZXMtPlJFU19vZmZzZXQpOworICAgICphZGR0bF9pbmZvKysgPSAoY2hhcikwOyAgICAvKiBYLjEyMSBhZGRyZXNzIHByZWZpeCAqLworICAgIGJjb3B5KCBsb2NhbF9udWEsIGFkZHRsX2luZm8sIGFkZHJfbGVuICk7CisKKyAgICAvKgorICAgICAqIHNlbmQgb2ZmIHRoZSBjb25uZWN0IHJlc3BvbnNlCisgICAgICovCisgICAgaWYgKHgyNXB1dG1zZyh4MjVjYWxsZmQsCisgICAgICAgICAgICAgICAgICAoTl9ucGlfY3RsX3QqKWNvbm5fcmVzLAorICAgICAgICAgICAgICAgICAgKE5fbnBpX2RhdGFfdCAqKU5VTEwsCisgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgJnB1dF9mbGFncworICAgICAgICAgICAgICAgICAgKSA8IDAgKSB7CisgICAgICAgIHBlcnJvcigia2VybWl0OiB4MjVhY2NlcHQoKTogcHV0bXNnIGNvbm5lY3QgcmVzcG9uc2UgZmFpbGVkIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBbGxvY2F0ZSBhbmQgemVybyBvdXQgc3BhY2UgZm9yIHRoZSBPS19BQ0sgcHJpbWl0aXZlCisgICAgICovCisgICAgaWYgKChva19hY2sgPSAoTl9va19hY2tfdCAqKSBtYWxsb2Moc2l6ZW9mKE5fbnBpX2N0bF90KSkpID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKCJrZXJtaXQ6IHgyNWNhbGwoKTogb2tfYWNrIG1hbGxvYyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgYnplcm8ob2tfYWNrLCBzaXplb2YoTl9ucGlfY3RsX3QpKTsKKworICAgIC8qIEluaXRpYWxpemUgYW5kIGJ1aWxkIHRoZSBzdHJ1Y3R1cmVzIGZvciBnZXRtc2cgKi8KKyAgICBnZXRfZmxhZ3M9MDsKKworICAgIHJjID0gKGludCl4MjVnZXRtc2coeDI1Y2FsbGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgKE5fbnBpX2N0bF90Kilva19hY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXNpemVvZihOX29rX2Fja190KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChOX25waV9kYXRhX3QqKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgJmdldF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5fT0tfQUNLCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgIC8qIHNlcXVlbmNlIG51bWJlciBpcyBvbmx5IGZvciBkaXNjb25uZWN0aW5nIHdoZW4gbm90IGNvbm5lY3RlZCAhPyAqLworICAgICAgICB4MjVzZXFubyA9IDA7CisgICAgfQorCisgICAgLyogZnJlZSB1cCBtYWxsb2MnZWQgYnVmZmVyIHNwYWNlICovCisgICAgaWYgKGNvbm5fcmVzKSB7IGZyZWUoY29ubl9yZXMpOyBjb25uX3JlcyA9IE5VTEw7IH0KKyAgICBpZiAob2tfYWNrKSB7IGZyZWUob2tfYWNrKTsgb2tfYWNrID0gTlVMTDsgfQorCisjaWZkZWYgVFJBQ0UKKyAgICBwcmludGYoICJUUkFDRTogbGVhdmluZyB4MjVhY2NlcHRcbiIgKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworCisgICAgcmV0dXJuKCAoIHJjID49IDAgKSA/IHgyNWNhbGxmZCA6IC0xICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHgyNXVuYmluZAorICoKKyAqIERlc2NyaXB0aW9uOiAgVGhpcyBzdWJyb3V0aW5lIGJ1aWxkcyBhbmQgc2VuZHMgYW4gdW5iaW5kIHJlcXVlc3QgYW5kIGdldHMKKyAqIHRoZSBhY2tub3dsZWRnZW1lbnQgZm9yIGl0LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBmZCAtIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgc3RyZWFtCisgKgorICogRnVuY3Rpb25zIFJlZmVyZW5jZWQ6CisgKiBnZXRtc2coKQorICogcHV0bXNnKCkKKyAqIG1hbGxvYygpCisgKiBiemVybygpCisgKgorICogUmV0dXJuIGNvZGU6CisgKiAwIC0gaWYgc3VjY2Vzc2Z1bAorICogLTEgLSBpZiBub3Qgc3VjY2Vzc2Z1bAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50Cit4MjV1bmJpbmQoZmQpIGludCBmZDsgeyAgICAgICAgICAgICAgICAgLyogWDI1IGRldmljZSAob3BlbmVkKSAqLworICAgIGludCByYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCisgICAgaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmluZCBmbGFncyAqLworICAgIGludCBnZXRfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IGZsYWcgZm9yIGdldG1zZyAqLworICAgIHVsb25nIHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByaW1pdGl2ZSB0eXBlICovCisgICAgTl91bmJpbmRfcmVxX3QgKnVuYmluZF9yZXE7ICAgICAgICAgLyogcG9pbnRlciB0byBOX1VOQklORF9SRVEgKi8KKyAgICBOX29rX2Fja190ICpva19hY2s7ICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIE5fT0tfQUNLICovCisKKyNpZmRlZiBUUkFDRQorICAgIHByaW50ZiggIlRSQUNFOiBlbnRlcmluZyB4MjV1bmJpbmRcbiIgKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworCisjaWZkZWYgREVCVUcKKyAgICAvKiBwcmludGYoICJ4MjV1bmJpbmQoICVkIClcbiIsIGZkICk7ICovCisjZW5kaWYgLyogREVCVUcgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ4MjV1bmJpbmQgY2xvc2luZyB4MjUgY29ubmVjdGlvbiAjIiwiIixmZCk7CisKKyAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyBvdXQgc3BhY2UgdG8gaG9sZCB0aGUgTl9VTkJJTkRfUkVRIHByaW1pdGl2ZSAqLworICAgIHVuYmluZF9yZXEgPSAoTl91bmJpbmRfcmVxX3QgKikgbWFsbG9jKHNpemVvZihOX25waV9jdGxfdCkpOworICAgIGlmICh1bmJpbmRfcmVxID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKCJrZXJtaXQ6IHgyNXVuYmluZCgpOiB1bmJpbmRfcmVxIG1hbGxvYyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgYnplcm8odW5iaW5kX3JlcSwgc2l6ZW9mKE5fbnBpX2N0bF90KSk7CisKKyAgICAvKgorICAgICAqIEJ1aWxkIHRoZSBVbmJpbmQgUmVxdWVzdCBQcmltaXRpdmUKKyAgICAgKi8KKyAgICBmbGFncyA9IDA7CisgICAgdW5iaW5kX3JlcS0+UFJJTV90eXBlID0gKHVsb25nKSBOX1VOQklORF9SRVE7CisKKyAgICAvKgorICAgICAqIENhbGwgcHV0bXNnKCkgdG8gcHV0IHRoZSBiaW5kIHJlcXVlc3QgbWVzc2FnZSBvbiB0aGUgc3RyZWFtCisgICAgICovCisgICAgaWYgKHgyNXB1dG1zZyhmZCwKKyAgICAgICAgICAgICAgICAgIChOX25waV9jdGxfdCopdW5iaW5kX3JlcSwKKyAgICAgICAgICAgICAgICAgIChOX25waV9kYXRhX3QgKilOVUxMLAorICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICZmbGFncworICAgICAgICAgICAgICAgICAgKSA8IDApIHsKKyAgICAgICAgcGVycm9yICgia2VybWl0OiB4MjV1bmJpbmQoKTogcHV0bXNnIGZhaWxlZCIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGFuZCBaZXJvIG91dCBzcGFjZSBmb3IgdGhlIE5fT0tfQUNLIHByaW1pdGl2ZSAqLworICAgIG9rX2FjayA9IChOX29rX2Fja190ICopIG1hbGxvYyhzaXplb2YoTl9ucGlfY3RsX3QpKTsKKyAgICBpZiAob2tfYWNrID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKCJrZXJtaXQgeDI1dW5iaW5kKCk6IG9rX2FjayBtYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgYnplcm8ob2tfYWNrLCBzaXplb2YoTl9ucGlfY3RsX3QpKTsKKworICAgIC8qIEluaXRpYWxpemUgYW5kIGJ1aWxkIHRoZSBjb250cm9sIHN0cnVjdHVyZSBmb3IgZ2V0bXNnICovCisgICAgZ2V0X2ZsYWdzPTA7CisKKyAgICAvKiBDYWxsIGdldG1zZygpIHRvIGNoZWNrIGZvciBhbiBhY2tub3dsZWRnZW1lbnQgKi8KKyAgICByYyA9IHgyNWdldG1zZyhmZCwKKyAgICAgICAgICAgICAgICAgICAoTl9ucGlfY3RsX3QqKW9rX2FjaywKKyAgICAgICAgICAgICAgICAgICAoaW50KXNpemVvZihOX29rX2Fja190KSwKKyAgICAgICAgICAgICAgICAgICAoTl9ucGlfZGF0YV90KilOVUxMLAorICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgJmdldF9mbGFncywKKyAgICAgICAgICAgICAgICAgICBOX09LX0FDSworICAgICAgICAgICAgICAgICAgICk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBwZXJyb3IgKCJrZXJtaXQ6IHgyNXVuYmluZDogZ2V0bXNnIGZhaWxlZCIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIEZyZWUgdXAgdGhlIHNwYWNlIHRoYXQgd2Ugbm8gbG9uZ2VyIG5lZWQgKi8KKyAgICBpZiAodW5iaW5kX3JlcSkgeyBmcmVlKHVuYmluZF9yZXEpOyB1bmJpbmRfcmVxID0gTlVMTDsgfQorICAgIGlmIChva19hY2spIHsgZnJlZShva19hY2spOyBva19hY2sgPSBOVUxMOyB9CisKKyNpZmRlZiBUUkFDRQorICAgIHByaW50ZiggIlRSQUNFOiBsZWF2aW5nIHgyNXVuYmluZFxuIiApOworI2VuZGlmIC8qIFRSQUNFICovCisKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHgyNXhpbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgICBSZWFkIG4gY2hhcmFjdGVycyBmcm9tIFguMjUgY2lyY3VpdCBpbnRvIGJ1ZiAoQUlYIG9ubHkpCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgICAgZGF0YV9idWZfbGVuICAgIG1heGltdW0gc2l6ZSBvZiBkYXRhIGJ1ZmZlcgorICogICAgICBkYXRhX2J1ZiAgICAgICAgcG9pbnRlciB0byBwcmUtYWxsb2NhdGVkIGJ1ZmZlciBzcGFjZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHJlYWQKKyAqLworaW50Cit4MjV4aW4oZGF0YV9idWZfbGVuLGRhdGFfYnVmKSBpbnQgZGF0YV9idWZfbGVuOyBDSEFSICpkYXRhX2J1ZjsgeworICAgIHN0cnVjdCBzdHJidWYgZ2V0bXNnX2N0bDsgICAgICAgICAgIC8qIHN0cmVhbXMgY29udHJvbCBzdHJ1Y3R1cmUgKi8KKyAgICBzdHJ1Y3Qgc3RyYnVmIGdldG1zZ19kYXRhOyAgICAgICAgICAvKiBzdHJlYW1zIGRhdGEgc3RydWN0dXJlICovCisgICAgaW50IHJjID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KKyAgICBpbnQgZ2V0bXNnX2ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiBwYWNrZXQgcHJpb3JpdHkgZmxhZ3MgKi8KKyAgICBjaGFyICogY3RsX2J1ZjsgICAgICAgICAgICAgICAgICAgICAvKiBucGkgY29udHJvbCBidWZmZXIgKi8KKyAgICBOX25waV9jdGxfdCAqIHJlc3VsdDsgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHNpbXBsaWZ5IHN3aXRjaCgpICovCisKKyNpZmRlZiBUUkFDRQorICAgIHByaW50ZiggIlRSQUNFOiBlbnRlcmluZyB4MjV4aW5cbiIgKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworCisgICAgLyogZW5zdXJlIHRoYXQgbm8gbWF4aW11bSdzIGFyZSBvdmVycmlkZGVuICovCisgICAgZGF0YV9idWZfbGVuID0gKE5QSV9NQVhfREFUQSA8IGRhdGFfYnVmX2xlbikgPyBOUElfTUFYX0RBVEEgOiBkYXRhX2J1Zl9sZW47CisKKyAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgcGFja2V0IGNvbnRyb2wgaW5mbyAqLworICAgIGlmICgoY3RsX2J1ZiA9IChjaGFyICopbWFsbG9jKE5QSV9NQVhfQ1RMKSkgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoICJrZXJtaXQ6IHgyNXhpbigpOiBjdGxfYnVmIG1hbGxvYyIgKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgIC8qIHJpZWhtOiBuZWVkIHplcm9lZCBidWZmZXIgZm9yIGdldG1zZz8gKi8KKyAgICBiemVybyggY3RsX2J1ZiwgTlBJX01BWF9DVEwgKTsKKyAgICAvKiBjbGVhciBkYXRhIGJ1ZmZlciAqLworICAgIGJ6ZXJvKCBkYXRhX2J1ZiwgZGF0YV9idWZfbGVuICk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgZ2V0bXNnX2ZsYWdzID0gMDsgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBmaXJzdCBwYWNrZXQgYXZhaWxhYmxlICovCisKKyAgICByYyA9IHgyNWdldG1zZyh0dHlmZCwKKyAgICAgICAgICAgICAgICAgICBjdGxfYnVmLAorICAgICAgICAgICAgICAgICAgIE5QSV9NQVhfQ1RMLAorICAgICAgICAgICAgICAgICAgIGRhdGFfYnVmLAorICAgICAgICAgICAgICAgICAgIGRhdGFfYnVmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAmZ2V0bXNnX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgIE5fREFUQV9JTkQKKyAgICAgICAgICAgICAgICAgICApOworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBERUJVRworICAgIGlmIChyYyA+PSAwKSB7CisgICAgICAgIHByaW50ZiggImtlcm1pdDogeDI1eGluKCk6IGdvdCAiICk7CisgICAgICAgIHgyNWR1bXBfZGF0YSggZGF0YV9idWYsIDAsIHJjICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCAieDI1eGluKCk6IGF0dGVtcHQgdG8gZ2V0IGRhdGEgcmVzdWx0ZWQgaW4gYW4gZXJyb3JcbiIgKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAvKiBmcmVlIGJ1ZmZlcnMgKi8KKyAgICBpZiAoY3RsX2J1ZikgeyBmcmVlKGN0bF9idWYpOyBjdGxfYnVmID0gTlVMTDsgfQorCisjaWZkZWYgVFJBQ0UKKyAgICBwcmludGYoICJUUkFDRTogbGVhdmluZyB4MjV4aVxuIiApOworI2VuZGlmIC8qIFRSQUNFICovCisKKyAgICByZXR1cm4ocmMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiB4MjV3cml0ZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgICB3cml0ZSBhIGJsb2NrIG9mIGNoYXJhY3RlcnMgdG8gdGhlIFgyNSBTVFJFQU0gKEFJWCkKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgICBmZCAgICAgICAgICAgICAgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIHRvCisgKiAgICAgIGRhdGFidWYgICAgICAgICBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIHdyaXRlCisgKiAgICAgIGRhdGFidWZzaXplICAgICAgICAgICAgIHNpemUgb2YgdGhlIGJ1ZmZlciB0byB3cml0ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgICAgc2l6ZSAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQKKyAqLworaW50Cit4MjV3cml0ZShmZCwgZGF0YWJ1ZiwgZGF0YWJ1ZnNpemUpCisgICAgaW50ICAgICAgICAgZmQ7ICAgICAgICAgICAgICAgICAgLyogWDI1IFNUUkVBTVMgZmlsZSBkZXNjcmlwdG9yICh0dHlmZCkgKi8KKyAgICBjaGFyICAgICAgICAqZGF0YWJ1ZjsgICAgICAgICAgICAgICAvKiBidWZmZXIgdG8gd3JpdGUgKi8KKyAgICBpbnQgICAgICAgICBkYXRhYnVmc2l6ZTsgICAgICAgICAgICAvKiBidWZmZXIgc2l6ZSAqLworLyogeDI1d3JpdGUgKi8geworICAgIE5fZGF0YV9yZXFfdCAqZGF0YV9yZXFfY3RsOworICAgIGludCByYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlIChzaXplIHRyYW5zbWl0dGVkKSAqLworICAgIGludCB3cml0ZV9mbGFncyA9IDA7ICAgICAgICAgICAgICAgIC8qIGFsd2F5cyAwICE/ICovCisKKyNpZmRlZiBUUkFDRQorICAgIHByaW50ZiggIlRSQUNFOiBlbnRlcmluZyB4MjV3cml0ZVxuIiApOworI2VuZGlmIC8qIFRSQUNFICovCisKKyAgICBpZiAoKGRhdGFfcmVxX2N0bCA9IChOX2RhdGFfcmVxX3QgKiltYWxsb2MoTlBJX01BWF9DVEwpICkgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoICJrZXJtaXQ6IHgyNXdyaXRlKCk6IGRhdGFfcmVxX2N0bCBtYWxsb2MiICk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRhdGFfcmVxX2N0bC0+UFJJTV90eXBlID0gTl9EQVRBX1JFUTsKKyAgICBkYXRhX3JlcV9jdGwtPkRBVEFfeGZlcl9mbGFncyA9IDA7CisKKyAgICAvKiByaWVobTogcG9zc2libGUgZXh0ZW5zaW9uCisgICAgICogcG9zc2libHkgbmVlZCB0byB0aGluayBhYm91dCBzcGxpdHRpbmcgdXAgdGhlIGRhdGEgYnVmZmVyCisgICAgICogaW50byBtdWx0aXBsZSBwYXJ0cyBpZiBkYXRhYnVmc2l6ZSA+IE5QSV9NQVhfREFUQQorICAgICAqLworCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCAia2VybWl0OiB4MjV3cml0ZSgpOiB3cml0aW5nIGRhdGEgdG8geDI1IHN0cmVhbVxuIiApOworICAgIHByaW50ZiggIlx0ZGF0YTpcdCIgKTsKKyAgICB4MjVkdW1wX2RhdGEoZGF0YWJ1ZiwgMCwgZGF0YWJ1ZnNpemUpOworI2VuZGlmIC8qIERFQlVHICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHJjID0geDI1cHV0bXNnKGZkLAorICAgICAgICAgICAgICAgICAgIChOX25waV9jdGxfdCopZGF0YV9yZXFfY3RsLAorICAgICAgICAgICAgICAgICAgIChOX25waV9kYXRhX3QqKWRhdGFidWYsCisgICAgICAgICAgICAgICAgICAgZGF0YWJ1ZnNpemUsCisgICAgICAgICAgICAgICAgICAgJndyaXRlX2ZsYWdzCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICBpZiAoZGF0YV9yZXEpIHsgZnJlZShkYXRhX3JlcV9jdGwpOyAgZGF0YV9yZXEgPSBOVUxMOyB9CisKKyNpZmRlZiBUUkFDRQorICAgIHByaW50ZiggIlRSQUNFOiBsZWF2aW5nIHgyNXdyaXRlXG4iICk7CisjZW5kaWYgLyogVFJBQ0UgKi8KKworICAgIHJldHVybihyYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHgyNWxvY2FsX251YQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIHJvdXRpbmUgaXMgb25seSBpbnRlcmVzdGluZyBmb3IgSUJNIGNvbXB1dGVycy4gSW4gb3JkZXIKKyAqICAgICAgdG8gc2V0IHVwIGEgY29ubmVjdGlvbiAoc2VlIHgyNWJpbmQoKSkgeW91IG5lZWQgdG8ga25vdyB0aGUKKyAqICAgICAgbG9jYWwgTlVBICh4MjUgYWRkcmVzcykuIFVuZm9ydHVuYXRlbHksIHlvdSBuZWVkIGFsbCB0aGlzIGNvZGUKKyAqICAgICAgdG8gZmluZCB0aGF0IG91dCwgSSBqdXN0IGhvcGUgdGhpcyB3b3JrcyBmb3IgZXZlcnlvbmUgZWxzZSEKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgICBhIHByZS1hbGxvY2F0ZWQgY2hhcmFjdGVyIGJ1ZmZlciwgbG9uZyBlbm91Z2ggdG8gaG9sZCBhbiBYLjI1IGFkZHJlc3MKKyAqICAgICAgYW5kIHRoZSB0YWlsaW5nIG51bGwuCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBhZGRyZXNzIHN0cmluZy4KKyAqICAgICAgMCA9IGVycm9yCisgKi8KK2ludAoreDI1bG9jYWxfbnVhKGNoYXIgKmJ1ZikgeworICAgIHN0cnVjdCBDdUF0ICpyZXNwb25zZTsgICAgICAvKiBzdHJ1Y3R1cmUgdG8gZmlsbCB3aXRoIGluZm8gZnJvbSBPRE0gKi8KKyAgICBDTEFTU19TWU1CT0wgcmV0Q2xhc3M7ICAgICAgLyogT0RNIGNsYXNzICovCisgICAgY2hhciBxdWVyeVs2NF07ICAgICAgICAgICAgIC8qIG9kbSBkYXRhYmFzZSBxdWVyeSAqLworICAgIGludCByYyA9IDA7ICAgICAgICAgICAgICAgICAvKiByZXR1cm4gdmFsdWUgKGxlbmd0aCBvZiBsb2NhbCBOVUEpICovCisgICAgZXh0ZXJuIGNoYXIgeDI1bmFtZVtdOyAgICAgIC8qIHgyNSBkZXZpY2UgbmFtZSAoc3gyNWEwKSAqLworCisjaWZkZWYgVFJBQ0UKKyAgICBwcmludGYoICJUUkFDRTogZW50ZXJpbmcgeDI1bG9jYWxfbnVhXG4iICk7CisjZW5kaWYgLyogVFJBQ0UgKi8KKworICAgIC8qIHNldCB1cCBxdWVyeSBzdHJpbmcgKi8KKyAgICBpZiAoeDI1bmFtZVswXSA9PSAnXDAnKSB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcHJpbnRmKCAia2VybWl0OiB4MjVsb2NhbF9udWEoKTogTm8geDI1IGRldmljZSBzZXQsIHRyeWluZyBzeDI1YTBcbiIgKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICBzdHJjcHkoIHgyNW5hbWUsICJzeDI1YTAiICk7CisgICAgfQorICAgIGNrbWFrbXNnKHF1ZXJ5LCBzaXplb2YocXVlcnkpLCAibmFtZSBsaWtlICIseDI1bmFtZSwKKyAgICAgICAgICAgICAiIGFuZCBhdHRyaWJ1dGUgbGlrZSBsb2NhbF9udWEiKTsKKworICAgIC8qIGluaXRpYWxpc2UgT0RNIGRhdGFiYXNlICovCisgICAgb2RtZXJybm8gPSAwOworICAgIGlmIChvZG1faW5pdGlhbGl6ZSgpID09IC0xKSB7CisgICAgICAgIHByaW50ZiggIngyNWxvY2FsX251YSgpOiBjYW4ndCBpbml0aWFsaXplIE9ETSBkYXRhYmFzZSIpOworICAgICAgICBzd2l0Y2ggKG9kbWVycm5vKSB7CisgICAgICAgICAgY2FzZSBPRE1JX0lOVkFMSURfUEFUSDoKKyAgICAgICAgICAgIHByaW50ZiggImludmFsaWQgcGF0aFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX01BTExPQ19FUlI6CisgICAgICAgICAgICBwcmludGYoICJtYWxsb2MgZmFpbGVkXG4iICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCAidW5rbm93biBlcnJvciAlZFxuUGxlYXNlIGNhbGwgSUJNXG4iLCBvZG1lcnJubyApOworICAgICAgICB9CisgICAgICAgIHJldHVybihyYyk7CisgICAgfQorCisgICAgLyogb3BlbiB0aGUgQ3VBdCBjbGFzcyAqLworICAgIHJldENsYXNzID0gb2RtX29wZW5fY2xhc3MoQ3VBdF9DTEFTUyk7CisgICAgaWYgKCgoaW50KXJldENsYXNzKSA9PSAtMSkgeworICAgICAgICBwcmludGYoICJrZXJtaXQ6IHgyNWxvY2FsX251YSgpOiBjYW4ndCBvcGVuIEN1QXQgY2xhc3MgaW4gb2RtLiAiICk7CisgICAgICAgIHN3aXRjaCAob2RtZXJybm8pIHsKKyAgICAgICAgICBjYXNlIE9ETUlfQ0xBU1NfRE5FOgorICAgICAgICAgICAgcHJpbnRmKCAiQ3VBdCBjbGFzcyBkb2Vzbid0IGV4aXN0XG4iICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIE9ETUlfQ0xBU1NfUEVSTVM6CisgICAgICAgICAgICBwcmludGYoICJwZXJtaXNzaW9uIHRvIEN1QXQgY2xhc3MgZmlsZSBkZW5pZWRcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgT0RNSV9NQUdJQ05PX0VSUjoKKyAgICAgICAgICAgIHByaW50ZiggIkN1QXQgaXMgYW4gaW52YWxpZCBPRE0gb2JqZWN0IGNsYXNzXG4iICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIE9ETUlfT1BFTl9FUlI6CisgICAgICAgICAgICBwcmludGYoICJjYW5ub3Qgb3BlbiBDdUF0IGNsYXNzIC0gYW5kIGRvbid0IGtub3cgd2h5IVxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX0lOVkFMSURfUEFUSDoKKyAgICAgICAgICAgIHByaW50ZiggImludmFsaWQgcGF0aFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX1RPT01BTllDTEFTU0VTOgorICAgICAgICAgICAgcHJpbnRmKCAidG9vIG1hbnkgb2JqZWN0IGNsYXNzZXMgaGF2ZSBiZWVuIG9wZW5lZFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZiggInVua25vd24gZXJyb3IgJWRcblBsZWFzZSBjYWxsIElCTVxuIiwgb2RtZXJybm8gKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ocmMpOworICAgIH0KKworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCJyZXRDbGFzcz0gJWRcbiIsIHJldENsYXNzKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgcmVzcG9uc2UgPSAoc3RydWN0IEN1QXQgKilvZG1fZ2V0X2ZpcnN0KCByZXRDbGFzcywgcXVlcnksIE5VTEwgKTsKKyAgICBpZiAoKChpbnQpcmVzcG9uc2UpID09IC0xKSB7CisgICAgICAgIHByaW50ZiggImtlcm1pdDogeDI1bG9jYWxfbnVhKCk6IG9kbSBxdWVyeSBmYWlsZWQgIiApOworICAgICAgICBzd2l0Y2ggKG9kbWVycm5vKSB7CisgICAgICAgICAgY2FzZSBPRE1JX0JBRF9DUklUOiAgICAgICAgICAgLyogUHJvZ3JhbW1pbmcgZXJyb3IgKi8KKyAgICAgICAgICAgIHByaW50ZiggImJhZCBzZWFyY2ggY3JpdGVyaWFcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgT0RNSV9DTEFTU19ETkU6CisgICAgICAgICAgICBwcmludGYoICJDdUF0IGNsYXNzIGRvZXNuJ3QgZXhpc3RcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgT0RNSV9DTEFTU19QRVJNUzoKKyAgICAgICAgICAgIHByaW50ZiggInBlcm1pc3Npb24gdG8gQ3VBdCBjbGFzcyBmaWxlIGRlbmllZFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX0lOVEVSTkFMX0VSUjoKKyAgICAgICAgICAgIHByaW50Zigib2RtIGludGVybmFsIGVycm9yXG5QbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3JcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgT0RNSV9JTlZBTElEX0NMWE46CisgICAgICAgICAgICBwcmludGYoIkN1QXQgaXMgaW52YWxpZCBvciBpbmNvbnNpc3RlbnQgb2RtIGNsYXNzIGNvbGxlY3Rpb25cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX0lOVkFMSURfUEFUSDoKKyAgICAgICAgICAgIHByaW50ZiggImludmFsaWQgcGF0aFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX01BR0lDTk9fRVJSOgorICAgICAgICAgICAgcHJpbnRmKCAiQ3VBdCBpcyBhbiBpbnZhbGlkIE9ETSBvYmplY3QgY2xhc3NcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgT0RNSV9NQUxMT0NfRVJSOgorICAgICAgICAgICAgcHJpbnRmKCAibWFsbG9jIGZhaWxlZFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX09QRU5fRVJSOgorICAgICAgICAgICAgcHJpbnRmKCAiY2Fubm90IG9wZW4gQ3VBdCBjbGFzcyAtIGFuZCBkb24ndCBrbm93IHdoeSFcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgT0RNSV9UT09NQU5ZQ0xBU1NFUzoKKyAgICAgICAgICAgIHByaW50ZiggInRvbyBtYW55IG9iamVjdCBjbGFzc2VzIGhhdmUgYmVlbiBvcGVuZWRcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoICJ1bmtub3duIGVycm9yICVkXG5QbGVhc2UgY2FsbCBJQk1cbiIsIG9kbWVycm5vICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHJjKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBmb3IgYSBtZWFuaW5nZnVsbCByZXNwb25zZSAqLworICAgIGlmIChyZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChyZXNwb25zZS0+dmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RyY3B5KGJ1ZiwgcmVzcG9uc2UtPnZhbHVlKTsKKyAgICAgICAgICAgIHJjID0gc3RybGVuKCBidWYgKTsKKyNpZmRlZiBERUJVRworLyoKKyAgICAgICAgICAgIHByaW50ZiggImF0dHJpYnV0ZSBuYW1lIGlzOiAlc1xuIiwgKGNoYXIgKilyZXNwb25zZS0+YXR0cmlidXRlICk7CisgICAgICAgICAgICBwcmludGYoICJJIHRoaW5rIG15IGFkZHJlc3MgaXMgJXNcbiIsIChjaGFyKilyZXNwb25zZS0+dmFsdWUgKTsKKyovCisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZiggImtlcm1pdDogeDI1bG9jYWxfbnVhKCk6IGNvdWxkbid0IGZpbmQgdGhlIGxvY2FsIE5VQVxuIiApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChvZG1lcnJubykgeworICAgICAgICAgIGNhc2UgT0RNSV9CQURfQ1JJVDoKKyAgICAgICAgICAgIHByaW50ZiggIkVycm9yOiBPRE1JX0JBRF9DUklUIC0gYmFkIGNyaXRlcmlhXG4iICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIE9ETUlfQ0xBU1NfRE5FOgorICAgICAgICAgICAgcHJpbnRmKCAiRXJyb3I6IE9ETUlfQ0xBU1NfRE5FIC0gY2xhc3MgZG9lc24ndCBleGlzdFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX0NMQVNTX1BFUk1TOgorICAgICAgICAgICAgcHJpbnRmKCAiRXJyb3I6IE9ETUlfQ0xBU1NfUEVSTVMgLSBjbGFzcyBwZXJtaXNzaW9uc1xuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX0lOVEVSTkFMX0VSUjoKKyAgICAgICAgICAgIHByaW50ZiggIkVycm9yOiBPRE1JX0lOVEVSTkFMX0VSUiAtIHBhbmljXG4iICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIE9ETUlfSU5WQUxJRF9DTFhOOgorICAgICAgICAgICAgcHJpbnRmKCAiRXJyb3I6IE9ETUlfSU5WQUxJRF9DTFhOIC0gaW52YWxpZCBjb2xsZWN0aW9uXG4iICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIE9ETUlfSU5WQUxJRF9QQVRIOgorICAgICAgICAgICAgcHJpbnRmKCAiRXJyb3I6IE9ETUlfSU5WQUxJRF9QQVRIIC0gaW52YWxpZCBwYXRoIC0gd2hhdCBwYXRoP1xuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX01BR0lDTk9fRVJSOgorICAgICAgICAgICAgcHJpbnRmKCAiRXJyb3I6IE9ETUlfTUFHSUNOT19FUlIgLSBpbnZhbGlkIG9iamVjdCBtYWdpY1xuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX01BTExPQ19FUlI6CisgICAgICAgICAgICBwcmludGYoICJFcnJvcjogT0RNSV9NQUxMT0NfRVJSIC0gbWFsbG9jIGZhaWxlZFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX09QRU5fRVJSOgorICAgICAgICAgICAgcHJpbnRmKCAiRXJyb3I6IE9ETUlfT1BFTl9FUlIgLSBjYW5ub3Qgb3BlbiBjbGFzc1xuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBPRE1JX1RPT01BTllDTEFTU0VTOgorICAgICAgICAgICAgcHJpbnRmKCAiRXJyb3I6IE9ETUlfVE9PTUFOWUNMQVNTRVMgLSB0b28gbWFueSBjbGFzc2VzXG4iICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCAiVW5rbm93biBlcnJvciFcbiIgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ocmMpOworICAgIH0KKworICAgIC8qIGNsb3NlIHRoZSBkYXRhYmFzZSBhZ2FpbiAqLworICAgIG9kbV9jbG9zZV9jbGFzcyggcmV0Q2xhc3MgKTsKKworICAgIC8qIGZvcmdldCBhYm91dCBPRE0gYWxsIHRvZ2V0aGVyICovCisgICAgb2RtX3Rlcm1pbmF0ZSgpOworCisjaWZkZWYgVFJBQ0UKKyAgICBwcmludGYoICJUUkFDRTogbGVhdmluZyB4MjVsb2NhbF9udWFcbiIgKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworCisgICAgZGVidWcoRjExMCwgIngyNWxvY2FsX251YSBsb2NhbCBhZGRyZXNzIGlzICIsIGJ1ZiwgMCk7CisgICAgcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogeDI1ZmFjaWxpdGllcworICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgICBidWlsZCB1cCB0aGUgZmFjaWxpdGllcyBkYXRhIHBhY2tldCBmb3IgYSBjb25uZWN0aW9uIHJlcXVlc3QKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgICBhIHByZS1hbGxvY2F0ZWQgY2hhciBidWZmZXIsIG5vcm1hbGx5IE5QSV9NQVhfREFUQSBiaWcuCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW5zZXJ0ZWQgaW50byB0aGUgYnVmZmVyCisgKi8KK2ludAoreDI1ZmFjaWxpdGllcyhidWZmZXIpIGNoYXIgKmJ1ZmZlcjsgeworICAgIGV4dGVybiBpbnQgcmV2Y2FsbDsKKyAgICBleHRlcm4gaW50IGNsb3NncjsKKyAgICBjaGFyICpwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wIHBvaW50ZXIgKi8KKyAgICBjaGFyICpzdGFydDsgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wIHBvaW50ZXIgKi8KKworI2lmZGVmIFRSQUNFCisgICAgcHJpbnRmKCAiVFJBQ0U6IGVudGVyaW5nIHgyNWZhY2lsaXRpZXNcbiIgKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworCisgICAgcCA9IGJ1ZmZlciArIDE7CisgICAgc3RhcnQgPSBwOworCisjaWZkZWYgREVCVUcKKyAgICBwcmludGYoICJrZXJtaXQ6IHgyNWZhY2lsaXRpZXMoKTogZ2V0dGluZyBYMjUgZmFjaWxpdGllc1xuIiApOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgICBpZiAocmV2Y2FsbCAhPSAwKSB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcHJpbnRmKCJyZXZlcnNlIGNoYXJnZTogJWRcbiIsIHJldmNhbGwgKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICAqKytwID0gMHgwMTsKKyAgICAgICAgKisrcCA9IHJldmNhbGw7CisgICAgfQorICAgIGlmIChjbG9zZ3IgPiAwKSB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcHJpbnRmKCJjbG9zZWQgdXNlciBncm91cDogJWRcbiIsIGNsb3NnciApOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICorK3AgPSAweDAzOworICAgICAgICAqKytwID0gY2xvc2dyOworICAgIH0KKworI2lmZGVmIERFQlVHCisgICAgaWYgKHAgPT0gc3RhcnQpIHsKKyAgICAgICAgcHJpbnRmKCAibm8gZmFjaWxpdGllc1xuIiApOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgLyogc2V0IHRoZSBzaXplIG9mIHRoZSBmYWNpbGl0aWVzIGJ1ZmZlciAqLworICAgICpidWZmZXIgPSAoY2hhcikoIHAgLSBzdGFydCApICYgMHhmZjsKKworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCAia2VybWl0OiB4MjVmYWNpbGl0aWVzKCk6IHJldHVybmluZyAlZFxuIiwgKGludCkocCAtIGJ1ZmZlcikgICk7CisjZW5kaWYgLyogREVCVUcgKi8KKworI2lmZGVmIFRSQUNFCisgICAgcHJpbnRmKCAiVFJBQ0U6IGxlYXZpbmcgeDI1ZmFjaWxpdGllc1xuIiApOworI2VuZGlmIC8qIFRSQUNFICovCisKKyAgICAvKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZhY2lsaXRpZXMgd2l0aCBzaXplIGJ5dGUgKi8KKyAgICAvKiAxID09IG5vIGZhY2lsaXRpZXMsIDAgYnl0ZSByZXR1cm5lZCBhcyBmYWNpbGl0aWVzIHNpemUgKi8KKyAgICByZXR1cm4oIChpbnQpKHAgLSBidWZmZXIpICk7Cit9CisKKy8qCisgKiByZXNldCB0aGUgY29ubmVjdGlvbgorICovCitpbnQKK3gyNXJlc2V0KGNhdXNlLCBkaWFnbikgY2hhciBjYXVzZTsgY2hhciBkaWFnbjsgeworICAgIC8qIG5vdCBpbXBsZW1lbnRlZCAqLworCisjaWZkZWYgVFJBQ0UKKyAgICBwcmludGYoICJUUkFDRTogZW50ZXJpbmcgeDI1cmVzZXRcbiIgKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworCisjaWZkZWYgVFJBQ0UKKyAgICBwcmludGYoICJUUkFDRTogbGVhdmluZyB4MjVyZXNldFxuIiApOworI2VuZGlmIC8qIFRSQUNFICovCisKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qCisgKiBjbGVhciB0aGUgeDI1IGNvbm5lY3Rpb24gLSBpZTogaGFuZyB1cAorICovCitpbnQKK3gyNWNsZWFyKCkgeworICAgIGludCBnZXRfZmxhZ3MgPSAwOyAgICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IGZsYWcgZm9yIGdldG1zZyAqLworICAgIGludCBwdXRfZmxhZ3MgPSAwOyAgICAgICAgICAgICAgICAgIC8qIHNlbmQgZmxhZ3MsIGFsd2F5cyAwICovCisgICAgdWxvbmcgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJpbWl0aXZlIHR5cGUgKi8KKyAgICBOX2Rpc2Nvbl9yZXFfdCAqZGlzY29uX3JlcTsgICAgICAgICAvKiBwb2ludGVyIHRvIE5fRElTQ09OX1JFUSAqLworICAgIE5fZGlzY29uX2luZF90ICpkaXNjb25faW5kOyAgICAgICAgIC8qIHBvaW50ZXIgdG8gTl9ESVNDT05fSU5EICovCisgICAgTl9ucGlfZGF0YV90ICpkaXNjb25fZGF0YTsgICAgICAgICAgLyogcG9pbnRlciB0byBOX0RJU0NPTl9JTkQgZGF0YSAqLworICAgIGludCByYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCisKKyNpZmRlZiBUUkFDRQorICAgIHByaW50ZiggIlRSQUNFOiBlbnRlcmluZyB4MjVjbGVhclxuIiApOworI2VuZGlmIC8qIFRSQUNFICovCisKKyNpZmRlZiBERUJVRworICAgIC8qIHByaW50ZiggIngyNWNsZWFyKCk6IGNoZWNraW5nIGxhc3QgbXNnOiAlc1xuIiwgeDI1cHJpbSh4MjVsYXN0bXNnKSk7ICovCisjZW5kaWYgLyogREVCVUcgKi8KKworICAgIC8qCisgICAgKiBUaGUgZm9sbG93aW5nIGNoZWNrcyBhcmUgdXNlZCB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBkaXNjb25uZWN0CisgICAgKiBvciB1bmJpbmQgdHdpY2UgLSB0aGlzIHNlZW1zIHRvIHRocm93IHRoZSBOUEkgaW50ZXJmYWNlIHJpZ2h0IG91dCBvZgorICAgICoga2lsdGVyLgorICAgICovCisgICAgc3dpdGNoKHgyNWxhc3Rtc2cpIHsKKyAgICAgIGNhc2UgTl9CSU5EX0FDSzoKKyAgICAgIGNhc2UgTl9DT05OX0NPTjoKKyAgICAgIGNhc2UgTl9DT05OX1JFUToKKyAgICAgIGNhc2UgTl9EQVRBX1JFUToKKyAgICAgIGNhc2UgTl9EQVRBX0lORDoKKyAgICAgICAgeworI2lmZGVmIERFQlVHCisgICAgICAgICAgICAvKiBwcmludGYoIngyNWNsZWFyKCk6IGFjdGl2ZWx5IGRpc2Nvbm5lY3RpbmdcbiIpOyAqLworI2VuZGlmIC8qIERFQlVHICovCisKKyAgICAgICAgICAgICAgICBkaXNjb25fcmVxID0gKE5fZGlzY29uX3JlcV90ICopbWFsbG9jKE5QSV9NQVhfQ1RMKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzY29uX3JlcSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcnJvcigia2VybWl0IHgyNWNsZWFyKCk6IGRpc2Nvbl9yZXEgbWFsbG9jIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIC8qIGZhbGx0aHJvdWdoLCB0cnkgdG8gdW5iaW5kIHRoZSBOUEkgYW55d2F5ICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzY29uX3JlcS0+UFJJTV90eXBlID0gTl9ESVNDT05fUkVROworICAgICAgICAgICAgICAgICAgICBkaXNjb25fcmVxLT5ESVNDT05fcmVhc29uID0gMDsgICAgICAvKiBub3QgdXNlZCBieSBBSVggKi8KKyAgICAgICAgICAgICAgICAgICAgZGlzY29uX3JlcS0+UkVTX2xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGRpc2Nvbl9yZXEtPlJFU19vZmZzZXQgPSAodWxvbmcpKHNpemVvZihOX2Rpc2Nvbl9yZXFfdCkpOworICAgICAgICAgICAgICAgICAgICBkaXNjb25fcmVxLT5TRVFfbnVtYmVyID0geDI1c2Vxbm87ICAvKiBnbG9iYWwgKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoeDI1cHV0bXNnKHR0eWZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOX25waV9jdGxfdCopZGlzY29uX3JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTl9ucGlfZGF0YV90KilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB1dF9mbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwZXJyb3IoIngyNXB1dG1zZyBmYWlsZWQgaW4geDI1Y2xlYXIoKSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRpc2Nvbl9pbmQgPSAoTl9kaXNjb25faW5kX3QgKiltYWxsb2MoTlBJX01BWF9DVEwpOworICAgICAgICAgICAgICAgICAgICBkaXNjb25fZGF0YSA9IChOX25waV9kYXRhX3QgKiltYWxsb2MoTlBJX01BWF9EQVRBKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKGRpc2Nvbl9pbmQgPT0gTlVMTCkgfHwgKGRpc2Nvbl9kYXRhID09IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwZXJyb3IoIngyNWNsZWFyKCk6IGRpc2Nvbl9pbmQgbWFsbG9jIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmYWxsdGhyb3VnaCwgdHJ5IHRvIHVuYmluZCB0aGUgTlBJIGFueXdheSAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoeDI1Z2V0bXNnKHR0eWZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOX25waV9jdGxfdCopZGlzY29uX2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOUElfTUFYX0NUTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTl9ucGlfZGF0YV90KilkaXNjb25fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOUElfTUFYX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdldF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOX09LX0FDSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPCAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJvcigieDI1Z2V0bXNnIGZhaWxlZCBpbiB4MjVjbGVhcigpIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFsbHRocm91Z2gsIHRyeSB0byB1bmJpbmQgdGhlIE5QSSBhbnl3YXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoeDI1bGFzdG1zZyAhPSBOX1VOQklORF9SRVEpIHsKKyAgICAgICAgcmMgPSB4MjV1bmJpbmQodHR5ZmQpOworICAgIH0KKworI2lmZGVmIFRSQUNFCisgICAgcHJpbnRmKCAiVFJBQ0U6IGxlYXZpbmcgeDI1Y2xlYXJcbiIgKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworCisgICAgcmV0dXJuKHJjKTsKK30KKworI2lmZGVmIERFQlVHCisvKgorICogb25seSBmb3IgZGVidWdnaW5nCisgKgorICogdHVybiB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBkYXRhYmxvY2sgaW50byBzb21ldGhpbmcKKyAqIGhhbGYtd2F5IHJlYWRhYmxlLiBCZWNhdXNlIHRoZSBsZW5ndGggaXMga25vd24sIHdlIGNhbiBwcmludAorICogdGhlIHN0cmluZyBpbmNsdWRpbmcgbnVsbCdzIGV0YyAoaW1wb3J0YW50LCBiZWNhdXNlIHRoZSBmaXJzdCghKQorICogYnl0ZSBvZiBhbiBYMTIxIGFkZHJlc3MgaXMgYSBudWxsISAoWDEyMSBhZGRyID09IDAgKyBYMjUgYWRkcikKKyAqLworeDI1ZHVtcF9kYXRhKGNoYXIgKmFkZHIsIHVsb25nIG9mZnNldCwgdWxvbmcgbGVuZ3RoKSB7CisgICAgY2hhciAqcHRyID0gYWRkciArIG9mZnNldDsKKyAgICB1bG9uZyBpID0gbGVuZ3RoOworICAgIC8qIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIGFsbCB1bnByaW50YWJsZSBjaGFycyAqLworICAgIGNoYXIgKmJ1ZiA9IChjaGFyICopbWFsbG9jKCBsZW5ndGggKiA0ICk7CisgICAgY2hhciAqYnB0ciA9IGJ1ZjsgICAvKiBwb2ludGVyIHRvIGN1cnJlbnQgcGxhY2UgaW4gdGhlIHByaW50IGJ1ZmZlciAqLworCisgICAgd2hpbGUgKGkgPiAwKSB7CisgICAgICAgIGlmIChpc3ByaW50KCpwdHIpKSB7CisgICAgICAgICAgICAqYnB0cisrID0gKnB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpicHRyKysgPSAnWyc7CisgICAgICAgICAgICBzdHJjcHkoYnB0cixja2N0b3goKnB0ciwxKSk7IGJwdHIgKz0gMjsKKyAgICAgICAgICAgICpicHRyKysgPSAnXSc7CisgICAgICAgIH0KKyAgICAgICAgcHRyKys7CisgICAgICAgIGktLTsKKyAgICB9CisgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgKmJwdHIgPSAnXDAnOworICAgICAgICBwcmludGYoICIlcyIsIGJ1ZiApOworICAgIH0KKyAgICBwcmludGYoICIgKCVkKyVkKVxuIiwgb2Zmc2V0LCBsZW5ndGggKTsKKworICAgIGlmIChidWYpIHsgZnJlZShidWYpOyBidWYgPSBOVUxMOyB9CisgICAgcmV0dXJuOworfQorCisvKgorICogb25seSBmb3IgZGVidWdnaW5nCisgKiBwcmludCBhcyBtdWNoIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCBhIHBhY2tldCBhcyBwb3NzaWJsZQorICovCit4MjVkdW1wX3ByaW0ocHJpbWl0aXZlKSAgICBOX25waV9jdGxfdCAqcHJpbWl0aXZlOyB7CisgICAgcHJpbnRmKCJQcmltaXRpdmUiKTsKKyAgICBzd2l0Y2ggKHByaW1pdGl2ZS0+UFJJTV90eXBlKSB7CisgICAgICBjYXNlIE5fQklORF9BQ0s6CisgICAgICAgIHByaW50ZiggIlx0Tl9CSU5EX0FDS1xuXHRhZGRyZXNzOlx0IiApOworICAgICAgICB4MjVkdW1wX2RhdGEoIChjaGFyICopcHJpbWl0aXZlLAorICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlLT5iaW5kX2Fjay5BRERSX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZS0+YmluZF9hY2suQUREUl9sZW5ndGggKTsKKyAgICAgICAgcHJpbnRmKCAiXHRwcm90byBpZDpcdCIgKTsKKyAgICAgICAgeDI1ZHVtcF9kYXRhKCAoY2hhciAqKXByaW1pdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZS0+YmluZF9hY2suUFJPVE9JRF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmUtPmJpbmRfYWNrLlBST1RPSURfbGVuZ3RoICk7CisgICAgICAgIHByaW50ZiggIlx0Y29ubmluZDpcdCVkXG5cdHRva2VuOlx0XHQlZFxuIiwKKyAgICAgICAgICAgICAgIHByaW1pdGl2ZS0+YmluZF9hY2suQ09OSU5EX251bWJlciwKKyAgICAgICAgICAgICAgIHByaW1pdGl2ZS0+YmluZF9hY2suVE9LRU5fdmFsdWUgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTl9CSU5EX1JFUToKKyAgICAgICAgcHJpbnRmKCAiXHROX0JJTkRfUkVRXG5cdGFkZHJlc3M6XHQiICk7CisgICAgICAgIHgyNWR1bXBfZGF0YSggKGNoYXIgKilwcmltaXRpdmUsCisgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmUtPmJpbmRfcmVxLkFERFJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlLT5iaW5kX3JlcS5BRERSX2xlbmd0aCApOworICAgICAgICBwcmludGYoICJcdHByb3RvIGlkOlx0IiApOworICAgICAgICB4MjVkdW1wX2RhdGEoIChjaGFyICopcHJpbWl0aXZlLAorICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlLT5iaW5kX3JlcS5QUk9UT0lEX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZS0+YmluZF9yZXEuUFJPVE9JRF9sZW5ndGggKTsKKyAgICAgICAgcHJpbnRmKCAiXHRjb25uaW5kOlx0JWRcblx0ZmxhZ3M6XHRcdCVkXG4iLAorICAgICAgICAgICAgICAgcHJpbWl0aXZlLT5iaW5kX3JlcS5DT05JTkRfbnVtYmVyLAorICAgICAgICAgICAgICAgcHJpbWl0aXZlLT5iaW5kX3JlcS5CSU5EX2ZsYWdzICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fQ09OTl9DT046CisgICAgICAgIHByaW50ZiggIlx0Tl9DT05OX0NPTlxuIiApOworICAgICAgICBwcmludGYoICJcdFJFU1x0XHQiICk7CisgICAgICAgIHgyNWR1bXBfZGF0YSggKGNoYXIgKilwcmltaXRpdmUsCisgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmUtPmNvbm5fY29uLlJFU19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmUtPmNvbm5fY29uLlJFU19sZW5ndGggKTsKKyAgICAgICAgcHJpbnRmKCAiXHRmbGFnczpcdCVkXG4iLCBwcmltaXRpdmUtPmNvbm5fY29uLkNPTk5fZmxhZ3MgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTl9DT05OX0lORDoKKyAgICAgICAgcHJpbnRmKCAiXHROX0NPTk5fSU5EXG4iICk7CisgICAgICAgIHByaW50ZiggIlx0c291cmNlOlx0XHQiICk7CisgICAgICAgIHgyNWR1bXBfZGF0YSggKGNoYXIgKilwcmltaXRpdmUsCisgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmUtPmNvbm5faW5kLlNSQ19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmUtPmNvbm5faW5kLlNSQ19sZW5ndGggKTsKKyAgICAgICAgcHJpbnRmKCAiXHRkZXN0aW5hdGlvbjpcdCIgKTsKKyAgICAgICAgeDI1ZHVtcF9kYXRhKCAoY2hhciAqKXByaW1pdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZS0+Y29ubl9pbmQuREVTVF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmUtPmNvbm5faW5kLkRFU1RfbGVuZ3RoICk7CisgICAgICAgIHByaW50ZiggIlx0U0VRX251bWJlcjpcdCVkXG4iLCBwcmltaXRpdmUtPmNvbm5faW5kLlNFUV9udW1iZXIgKTsKKyAgICAgICAgcHJpbnRmKCAiXHRmbGFnczpcdCVkXG4iLCBwcmltaXRpdmUtPmNvbm5faW5kLkNPTk5fZmxhZ3MgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTl9DT05OX1JFUToKKyAgICAgICAgcHJpbnRmKCAiXHROX0NPTk5fUkVRXG5cdGRlc3RpbmF0aW9uOlx0IiApOworICAgICAgICB4MjVkdW1wX2RhdGEoIChjaGFyICopcHJpbWl0aXZlLAorICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlLT5jb25uX3JlcS5ERVNUX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZS0+Y29ubl9yZXEuREVTVF9sZW5ndGggKTsKKyAgICAgICAgcHJpbnRmKCAiXHRmbGFnczpcdCVkXG4iLCBwcmltaXRpdmUtPmNvbm5fcmVxLkNPTk5fZmxhZ3MgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTl9DT05OX1JFUzoKKyAgICAgICAgcHJpbnRmKCAiXHROX0NPTk5fUkVTXG4iICk7CisgICAgICAgIHByaW50ZiggIlx0VE9LRU5fdmFsdWVcdCVkXG4iLCBwcmltaXRpdmUtPmNvbm5fcmVzLlRPS0VOX3ZhbHVlICk7CisgICAgICAgIHByaW50ZiggIlx0U0VRX251bWJlclx0JWRcbiIsIHByaW1pdGl2ZS0+Y29ubl9yZXMuU0VRX251bWJlciApOworICAgICAgICBwcmludGYoICJcdENPTk5fZmxhZ3NcdCVkXG4iLCBwcmltaXRpdmUtPmNvbm5fcmVzLkNPTk5fZmxhZ3MgKTsKKyAgICAgICAgcHJpbnRmKCAiXHRSRVNcdFx0IiApOworICAgICAgICB4MjVkdW1wX2RhdGEoIChjaGFyICopcHJpbWl0aXZlLAorICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlLT5jb25uX3Jlcy5SRVNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlLT5jb25uX3Jlcy5SRVNfbGVuZ3RoICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fREFUQUNLX0lORDoKKyAgICAgICAgcHJpbnRmKCAiXHROX0RBVEFDS19JTkRcbiIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTl9EQVRBQ0tfUkVROgorICAgICAgICBwcmludGYoICJcdE5fREFUQUNLX1JFUVxuIiApOworICAgICAgICBwcmludGYoICJcdGZsYWdzOlx0JWRcbiIsIHByaW1pdGl2ZS0+ZGF0YV9yZXEuREFUQV94ZmVyX2ZsYWdzICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fREFUQV9JTkQ6CisgICAgICAgIHByaW50ZiggIlx0Tl9EQVRBX0lORFxuIiApOworICAgICAgICBwcmludGYoICJcdGZsYWdzOlx0JWRcbiIsIHByaW1pdGl2ZS0+ZGF0YV9pbmQuREFUQV94ZmVyX2ZsYWdzICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fREFUQV9SRVE6CisgICAgICAgIHByaW50ZiggIlx0Tl9EQVRBX1JFUVxuIiApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOX0RJU0NPTl9JTkQ6CisgICAgICAgIHByaW50ZiggIlx0Tl9ESVNDT05fSU5EXG4iICk7CisgICAgICAgIHByaW50ZiggIlx0b3JpZ2luOlx0JWRcbiIsIHByaW1pdGl2ZS0+ZGlzY29uX2luZC5ESVNDT05fb3JpZyApOworICAgICAgICBwcmludGYoICJcdHJlYXNvbjpcdFx0JWRcbiIsIHByaW1pdGl2ZS0+ZGlzY29uX2luZC5ESVNDT05fcmVhc29uICk7CisgICAgICAgIHByaW50ZiggIlx0c2VxIG5vOlx0XHQlZFxuIiwgcHJpbWl0aXZlLT5kaXNjb25faW5kLlNFUV9udW1iZXIgKTsKKyAgICAgICAgcHJpbnRmKCAiXHRSRVM6XHQiICk7CisgICAgICAgIHgyNWR1bXBfZGF0YSggKGNoYXIgKilwcmltaXRpdmUsCisgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmUtPmRpc2Nvbl9pbmQuUkVTX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZS0+ZGlzY29uX2luZC5SRVNfbGVuZ3RoICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fRElTQ09OX1JFUToKKyAgICAgICAgcHJpbnRmKCAiXHROX0RJU0NPTl9SRVFcbiIgKTsKKyAgICAgICAgcHJpbnRmKCAiXHRESVNDT05fcmVhc29uOlx0JWRcbiIsCisgICAgICAgICAgICAgICBwcmltaXRpdmUtPmRpc2Nvbl9yZXEuRElTQ09OX3JlYXNvbiApOworICAgICAgICBwcmludGYoICJcdFJFUzpcdCIgKTsKKyAgICAgICAgeDI1ZHVtcF9kYXRhKCAoY2hhciAqKXByaW1pdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZS0+ZGlzY29uX3JlcS5SRVNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlLT5kaXNjb25fcmVxLlJFU19sZW5ndGggKTsKKyAgICAgICAgcHJpbnRmKCAiXHRTRVFfbnVtYmVyOlx0JWRcbiIsIHByaW1pdGl2ZS0+ZGlzY29uX3JlcS5TRVFfbnVtYmVyICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fRVJST1JfQUNLOgorICAgICAgICBwcmludGYoICJcdE5fRVJST1JfQUNLXG4iICk7CisgICAgICAgIHByaW50ZiggIlx0Q2F1c2VkIGJ5Olx0JXNcbiIsCisgICAgICAgICAgICAgICB4MjVwcmltKCBwcmltaXRpdmUtPmVycm9yX2Fjay5FUlJPUl9wcmltICkgKTsKKyAgICAgICAgcHJpbnRmKCAiXHROUEkgZXJyb3I6XHQlc1xuIiwKKyAgICAgICAgICAgICAgIHgyNWVyciggcHJpbWl0aXZlLT5lcnJvcl9hY2suTlBJX2Vycm9yICkpOworICAgICAgICBlcnJubyA9IHByaW1pdGl2ZS0+ZXJyb3JfYWNrLlVOSVhfZXJyb3I7CisgICAgICAgIHBlcnJvciggIlx0IiApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOX0VYREFUQV9JTkQ6CisgICAgICAgIHByaW50ZiggIlx0Tl9FWERBVEFfQUNLXG4iICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fRVhEQVRBX1JFUToKKyAgICAgICAgcHJpbnRmKCAiXHROX0VYREFUQV9SRVFcbiIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTl9JTkZPX0FDSzoKKyAgICAgICAgcHJpbnRmKCAiXHROX0lORk9fQUNLXG4iICk7CisgICAgICAgIHByaW50ZiggIlx0TlNEVSBzaXplOlx0JWRcbiIsIHByaW1pdGl2ZS0+aW5mb19hY2suTlNEVV9zaXplICk7CisgICAgICAgIHByaW50ZiggIlx0RU5TRFUgc2l6ZTpcdCVkXG4iLCBwcmltaXRpdmUtPmluZm9fYWNrLkVOU0RVX3NpemUgKTsKKyAgICAgICAgcHJpbnRmKCAiXHRDREFUQSBzaXplOlx0JWRcbiIsIHByaW1pdGl2ZS0+aW5mb19hY2suQ0RBVEFfc2l6ZSApOworICAgICAgICBwcmludGYoICJcdEREQVRBIHNpemU6XHQlZFxuIiwgcHJpbWl0aXZlLT5pbmZvX2Fjay5EREFUQV9zaXplICk7CisgICAgICAgIHByaW50ZiggIlx0QUREUiBzaXplOlx0JWRcbiIsIHByaW1pdGl2ZS0+aW5mb19hY2suQUREUl9zaXplICk7CisgICAgICAgIHByaW50ZiggIlx0TklEVSBzaXplOlx0JWRcbiIsIHByaW1pdGl2ZS0+aW5mb19hY2suTklEVV9zaXplICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fSU5GT19SRVE6CisgICAgICAgIHByaW50ZiggIlx0Tl9JTkZPX1JFUVxuIiApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOX09LX0FDSzoKKyAgICAgICAgcHJpbnRmKCAiXHROX09LX0FDS1xuIiApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOX09QVE1HTVRfUkVROgorICAgICAgICBwcmludGYoICJcdE5fT1BUTUdNVF9SRVFcbiIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTl9SRVNFVF9DT046CisgICAgICAgIHByaW50ZiggIlx0Tl9SRVNFVF9DT05cbiIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTl9SRVNFVF9JTkQ6CisgICAgICAgIHByaW50ZiggIlx0Tl9SRVNFVF9JTkRcbiIgKTsKKyAgICAgICAgcHJpbnRmKCAiXHRyZWFzb246XHRcdCVkXG4iLCBwcmltaXRpdmUtPnJlc2V0X2luZC5SRVNFVF9yZWFzb24gKTsKKyAgICAgICAgcHJpbnRmKCAiXHRvcmlnaW46XHRcdCVkXG4iLCBwcmltaXRpdmUtPnJlc2V0X2luZC5SRVNFVF9vcmlnICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fUkVTRVRfUkVROgorICAgICAgICBwcmludGYoICJcdE5fUkVTRVRfUkVRXG4iICk7CisgICAgICAgIHByaW50ZiggIlx0cmVhc29uOlx0XHQlZFxuIiwgcHJpbWl0aXZlLT5yZXNldF9yZXEuUkVTRVRfcmVhc29uICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fUkVTRVRfUkVTOgorICAgICAgICBwcmludGYoICJcdE5fUkVTRVRfUkVTXG4iICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fVURFUlJPUl9JTkQ6CisgICAgICAgIHByaW50ZiggIlx0Tl9VREVSUk9SX0lORFxuIiApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBOX1VOQklORF9SRVE6CisgICAgICAgIHByaW50ZiggIlx0Tl9VTkJJTkRfUkVRXG4iICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fVU5JVERBVEFfUkVROgorICAgICAgICBwcmludGYoICJcdE5fVU5JVERBVEFfUkVRXG4iICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5fVU5JVERBVEFfSU5EOgorICAgICAgICBwcmludGYoICJcdE5fVU5JVERBVEFfSU5EXG4iICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAodm9pZCkgcHJpbnRmKCAiVW5rbm93biBOUEkgZXJyb3IgJWQiLCBwcmltaXRpdmUtPlBSSU1fdHlwZSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisjZW5kaWYgLyogREVCVUcgKi8KKworLyogaXQgbG9va3MgbGlrZSBzaWduYWwgaGFuZGxpbmcgaXMgbm90IG5lZWRlZCB3aXRoIHN0cmVhbXMhICovCisvKiB4MjVvb2JoKCkgICAgLSBoYW5kbGUgU0lHVVJHIHNpZ25hbHMgLSB0YWtlIGZyb20gaXNvZGUgPyAqLworCisjZW5kaWYgLyogSUJNWDI1ICovCisKKyNpZm5kZWYgTk9IVFRQCisvKgorICBXaGljaCB0aW1lLmggZmlsZXMgdG8gaW5jbHVkZS4uLiBTZWUgY2tjZGViLmggZm9yIGRlZmF1bHRzLgorICBOb3RlIHRoYXQgMCwgMSwgMiwgb3IgYWxsIDMgb2YgdGhlc2UgY2FuIGJlIGluY2x1ZGVkIGFjY29yZGluZyB0bworICB0aGUgc3ltYm9sIGRlZmluaXRpb25zLgorKi8KKyNpZm5kZWYgTk9USU1FSAorI2lmZGVmIFRJTUVICisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmIC8qIFRJTUVIICovCisjZW5kaWYgLyogTk9USU1FSCAqLworCisjaWZuZGVmIE5PU1lTVElNRUgKKyNpZmRlZiBTWVNUSU1FSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYgLyogU1lTVElNRUggKi8KKyNlbmRpZiAvKiBOT1NZU1RJTUVIICovCisKKyNpZm5kZWYgTk9TWVNUSU1FQkgKKyNpZmRlZiBTWVNUSU1FQkgKKyNpbmNsdWRlIDxzeXMvdGltZWIuaD4KKyNlbmRpZiAvKiBTWVNUSU1FQkggKi8KKyNlbmRpZiAvKiBOT1NZU1RJTUVCSCAqLworCisjaWZuZGVmIFRJTUVICisjaWZuZGVmIFNZU1RJTUVICisjaWZuZGVmIFNZU1RJTUVCSAorI2lmZGVmIFBsYW45CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbHNlCisjaWZkZWYgQUlYNDEKKyNpbmNsdWRlIDx0aW1lLmg+CisjZWxzZQorI2lmZGVmIFNVTk9TNAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZWxzZQorI2lmZGVmIFNZU1RJTUVICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbHNlCisjaWZkZWYgUE9TSVgKKyNpbmNsdWRlIDxwb3NpeC90aW1lLmg+CisjZWxzZQorI2lmZGVmIENMSVgKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2Vsc2UKKyNpZmRlZiBPUzIKKyNpbmNsdWRlIDx0aW1lLmg+CisjZWxzZQorI2luY2x1ZGUgPHRpbWUuaD4KKy8qICNpbmNsdWRlIDx1dGltZS5oPiAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIENMSVggKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworI2VuZGlmIC8qIFNZU1RJTUVIICovCisjZW5kaWYgLyogU1VOT1M0ICovCisjZW5kaWYgLyogQUlYNDEgKi8KKyNlbmRpZiAvKiBQbGFuOSAqLworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgT1MyCisjaW5jbHVkZSA8c3lzL3V0aW1lLmg+CisjaWZkZWYgTlQKKyNkZWZpbmUgdXRpbWJ1ZiBfdXRpbWJ1ZgorI2VuZGlmIC8qIE5UICovCisjZGVmaW5lIHV0aW1lICAgX3V0aW1lCisjZWxzZQorI2lmZGVmIFNZU1VUSU1FSCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDxzeXMvdXRpbWUuaD4gaWYgcmVxdWVzdGVkLCAgKi8KKyNpbmNsdWRlIDxzeXMvdXRpbWUuaD4gICAgICAgICAgICAgICAgICAvKiBmb3IgZXh0cmEgZmllbGRzIHJlcXVpcmVkIGJ5ICovCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogODhPcGVuIHNwZWMuICovCisjaWZkZWYgVVRJTUVIICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3IgPHV0aW1lLmg+IGlmIHJlcXVlc3RlZCAqLworI2luY2x1ZGUgPHV0aW1lLmg+ICAgICAgICAgICAgICAgICAgICAgIC8qIChTVlI0LCBQT1NJWCkgKi8KKyNkZWZpbmUgU1lTVVRJTUVIICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgdGhpcyBmb3IgYm90aCBjYXNlcy4gKi8KKyNlbmRpZiAvKiBVVElNRUggKi8KKyNlbmRpZiAvKiBTWVNVVElNRUggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBIVFRQX1ZFUlNJT04KKyNkZWZpbmUgSFRUUF9WRVJTSU9OICJIVFRQLzEuMSIKKyNlbmRpZiAvKiBIVFRQX1ZFUlNJT04gKi8KKworI2lmZGVmIENNREFURTJUTQordGltZV90CisjaWZkZWYgQ0tfQU5TSUMKK2h0dHBfZGF0ZShjaGFyICogZGF0ZSkKKyNlbHNlCitodHRwX2RhdGUoZGF0ZSkgY2hhciAqIGRhdGU7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGh0dHBfZGF0ZSAqLyB7CisgICAgLyogSFRUUCBkYXRlcyBhcmUgb2YgdGhlIGZvcm06ICAiU3VuLCAwNiBPY3QgMTk5NyAyMDoxMTo0NyBHTVQiICovCisgICAgLyogVGhlcmUgYXJlIHR3byBvbGRlciBmb3JtYXRzIHdoaWNoIHdlIGFyZSByZXF1aXJlZCB0byBwYXJzZQorICAgICAqIHRoYXQgd2UgY3VycmVudGx5IGRvIG5vdDoKKyAgICAgKgorICAgICAqIFJGQyA4NTA6ICAgIlN1bmRheSwgMDYtT2N0LTk3IDIwOjExOjQ3IEdNVCIKKyAgICAgKiBhc2N0aW1lKCk6ICJTdW4gTm92ICA2IDIwOjExOjQ3IDE5OTciCisgICAgICoKKyAgICAgKiBIb3dldmVyLCBpdCBpcyByZXF1aXJlZCB0aGF0IGFsbCBkYXRlcyBiZSBzZW50IGluIHRoZSBmb3JtIHdlCisgICAgICogZG8gYWNjZXB0LiAgVGhlIG90aGVyIHR3byBmb3JtYXRzIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgICogcmVhbGx5IG9sZCBzZXJ2ZXJzLgorICAgICAqLworICAgIGV4dGVybiBjaGFyIGNtZGF0ZWJ1ZlsxOF07CisgICAgc3RydWN0IHRtIHRfdG07CisgICAgdGltZV90IHQ7CisgICAgY2hhciBsZGF0ZVszMl07CisgICAgaW50IGo7CisKKyAgICBqID0gY2tpbmRleCgiLCIsZGF0ZSwwLDAsMCk7CisgICAgY2tzdHJuY3B5KGxkYXRlLCZkYXRlW2orMV0sMjUpOworCisgICAgeyAgIC8qCisgICAgICAgICAgIGNtY3Z0YXRlKCkgZGF0ZSBjaGFuZ2VkIHRvIHJldHVybiBhIHN0cmluZyBwb2ludGVyLgorICAgICAgICAgICBmZGMsIDEyIEF1ZyAyMDAxLgorICAgICAgICAqLworICAgICAgICBjaGFyICogZHA7CisgICAgICAgIGRwID0gKGNoYXIgKiljbWN2dGRhdGUobGRhdGUsMCk7IC8qIENvbnZlcnQgdG8gbm9ybWFsIGZvcm0gKi8KKyAgICAgICAgaWYgKCFkcCkKKyAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIHRfdG0gPSAqY21kYXRlMnRtKGRwLDEpOworICAgIH0KKy8qCisgIEZyb20gTHVjYXMgSGFydCwgNSBEZWMgMjAwMToKKyAgIk9uIHRoZSBzeXN0ZW1zIHRvIHdoaWNoIEkgaGF2ZSBhY2Nlc3MgKFN1bk9TIDQuMS4xLCBTb2xhcmlzIDgsIGFuZCBUcnU2NCksCisgIHNldHRpbmcgdG1faXNkc3QgdG8gLTEgbWFpbnRhaW5zIHRoZSBjb3JyZWN0IHRpbWV6b25lIG9mZnNldHMsIGkuZS4sIHdyaXRlcworICB0aGUgc3BlY2lmaWVkIChHTVQpIHRpbWUgaWYgdGhlIGJ1ZmZlciBzaXplIGlzIDIxLCBvciB0aGUgY29udGVtcG9yYW5lb3VzCisgIGxvY2FsdGltZSBpZiB0aGUgYnVmZmVyIHNpemUgaXMgMjUuICBQZXJoYXBzIHRtX2lzZHN0IHNob3VsZCBiZSBzZXQgaW4KKyAgY21kYXRlMnRtKCksIHJhdGhlciB0aGFuIG9ubHkgaW4gaHR0cF9kYXRlLiIKKyovCisjaWZuZGVmIE5PVE1fSVNEU1QgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIHBsYXRmb3JtcyB3aGVyZSAqLworICAgIHRfdG0udG1faXNkc3QgPSAtMTsgICAgICAgICAgICAgICAgIC8qIHRtX2lzZHN0IGRvZXNuJ3QgZXhpc3QuICovCisjZW5kaWYgLyogTk9UTV9JU0RTVCAqLworCisgICAgdCA9IG1rdGltZSgmdF90bSk7ICAgICAgICAgICAgICAgICAgLyogTk9UIFBPUlRBQkxFICovCisKKyNpZmRlZiBYWF9USU1FWk9ORQorICAgIHQgLT0gX3RpbWV6b25lOworI2VuZGlmIC8qIFhYX1RJTUVaT05FICovCisKKyAgICByZXR1cm4odCk7Cit9CisjZW5kaWYgLyogQ01EQVRFMlRNICovCisKK2NoYXIgKgoraHR0cF9ub3coKSB7CisgICAgc3RhdGljIGNoYXIgbm93c3RyWzMyXTsKKyNpZmRlZiBDTURBVEUyVE0KKyAgICBzdHJ1Y3QgdG0gICpnbXQ7CisgICAgdGltZV90IGx0aW1lOyAgICAgICAgICAgICAgICAgICAgICAgLyogTk9UIFBPUlRBQkxFICovCisKKyAgICB0aW1lKCZsdGltZSk7CisKKyAgICBnbXQgPSBnbXRpbWUoJmx0aW1lKTsgICAgICAgICAgICAgICAvKiBQUk9CQUJMWSBOT1QgUE9SVEFCTEUgKi8KKyAgICBzdHJmdGltZShub3dzdHIsMzIsIiVhLCAlZCAlYiAlWSAlSDolTTolUyBHTVQiLGdtdCk7IC8qIE5PVCBQT1JUQUJMRSAqLworICAgIC8qIG5vdCBvbmx5IGlzIGl0IG5vdCBwb3J0YWJsZSBidXQgaXQncyBsb2NhbGUtZGVwZW5kZW50ICovCisjZWxzZQorLyoKKyAgVGhpcyBpcyBob3BlbGVzcy4gIEZpcnN0IG9mIGFsbCwgaXQgc2VlbXMgdGhhdCBIVFRQIHdhbnRzIERheSBhbmQgTW9udGgKKyAgTkFNRVM/ICBJbiBFbmdsaXNoPyAgV2hvc2UgaWRlYSB3YXMgdGhhdD8gIEV2ZW4gd29yc2UsIHRoZSBkYXRlL3RpbWUgbXVzdCBiZQorICBleHByZXNzZWQgaW4gWnVsdSAoVVRDIChHTVQpKSwgYW5kIGNvbnZlcnRpbmcgZnJvbSBsb2NhbCB0aW1lIHRvIEdNVCBpcyBhCisgIG5pZ2h0bWFyZS4gIEV2ZXJ5IHBsYXRmb3JtIGRvZXMgaXQgZGlmZmVyZW50bHksIGlmIGF0IGFsbCAtLSBldmVuIGlmIHdlCisgIHJlc3RyaWN0IG91cnNlbHZlcyB0byBVTklYLiAgRm9yIGV4YW1wbGUgKHF1b3RpbmcgZnJvbSByZWNlbnQgQy1LZXJtaXQgZWRpdAorICBoaXN0b3J5KSwgIkZpeGVkIGEgbG9uZ3N0YW5kaW5nIGJ1ZyBpbiB0aGUgQlNESSB2ZXJzaW9uLCBpbiB3aGljaCBpbmNvbWluZworICBmaWxlIGRhdGVzIHdlcmUgc2V0IGluIEdNVCByYXRoZXIgdGhhbiBsb2NhbCB0aW1lLiAgSXQgc2VlbXMgaW4gNC40QlNELAorICBsb2NhbHRpbWUoKSBkb2VzIG5vdCByZXR1cm4gdGhlIGxvY2FsIHRpbWUsIGJ1dCByYXRoZXIgWmVybyBNZXJpZGlhbiAoWnVsdSkKKyAgdGltZSAoR01UKSwgYW5kIG11c3QgYmUgYWRqdXN0ZWQgYnkgdGhlIHRtX2dtdG9mZiB2YWx1ZS4iICBTd2VsbC4gIEZvcgorICBncmVhdGVyIGFwcHJlY2lhdGlvbiBvZiB0aGUgc2NvcGUgb2YgdGhlIHByb2JsZW0sIGp1c3QgdGFrZSBhIGxvb2sgYXQgdGhlCisgIHRpbWUtcmVsYXRlZCAjaWZkZWZzIGluIGNrdXRpby5jLiAgVGhlIG9ubHkgcmlnaHQgd2F5IHRvIGRvIHRoaXMgaXMgdG8gYWRkCisgIG91ciBvd24gcG9ydGFibGUgQVBJIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gbG9jYWwgdGltZSBhbmQgR01UL1VUQy9adWx1CisgIHRoYXQgc2hpZWxkcyB1cyBub3Qgb25seSBmcm9tIFVOSVhpc21zIGxpa2UgdGltZV90IGFuZCBzdHJ1Y3QgdG0sIGJ1dCBhbHNvCisgIHRoZSB1bmJlbGlldmFibGUgYW1vdW50IG9mIGRpZmZlcmVuY2VzIGluIHRpbWUtcmVsYXRlZCBBUElzIC0tIGUuZy4gaXMKKyAgInRpbWV6b25lIiBhbiBleHRlcm5hbCB2YXJpYWJsZSBvciBhIGZ1bmN0aW9uOyB3aGljaCBoZWFkZXIgZmlsZShzKSBkbyB3ZQorICBpbmNsdWRlLCBldGMgZXRjIGV0Yy4gIEl0J3MgYSBtYWpvciBwcm9qZWN0LgorKi8KKyAgICBpbnQgeDsKKyAgICB4ID0gY21jdnRkYXRlKCIiLDEpOworCitFdmlkZW50bHkgdGhpcyBjb2RlIGlzIG5vdCB1c2VkIC0tIGlmIGl0IGlzLCBpdCBtdXN0IGJlIGZpeGVkIHRvIHVzZQorbmV3IChhdWcgMjAwMSkgY21jdnRkYXRlKCkgY2FsbGluZyBjb252ZW50aW9ucy4KKworICAgIGlmICh4IDwgMCkKKyAgICAgIHJldHVybigiIik7CisvKiAgeXl5eW1tZGQgaGg6bW06c3MgKi8KKy8qICAwMTIzNDU2Nzg5MDEyMzQ1NiAqLworICAgIG5vd3N0clswXSAgPSAnWCc7ICAgICAgICAgICAgICAgICAgIC8qIDFzdCBsZXR0ZXIgb2YgZGF5ICovCisgICAgbm93c3RyWzFdICA9ICd4JzsgICAgICAgICAgICAgICAgICAgLyogMm5kIGxldHRlciBvZiBkYXkgKi8KKyAgICBub3dzdHJbMl0gID0gJ3gnOyAgICAgICAgICAgICAgICAgICAvKiAzcmQgbGV0dGVyIG9mIGRheSAqLworICAgIG5vd3N0clszXSAgPSAnLCc7CisgICAgbm93c3RyWzRdICA9ICcgJzsKKyAgICBub3dzdHJbNV0gID0gY21kYXRlWzZdOworICAgIG5vd3N0cls2XSAgPSBjbWRhdGVbN107CisgICAgbm93c3RyWzddICA9ICcgJzsKKyAgICBub3dzdHJbOF0gID0gJyAnOyAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBsZXR0ZXIgb2YgbW9udGggKi8KKyAgICBub3dzdHJbOV0gID0gJyAnOyAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgbGV0dGVyIG9mIG1vbnRoICovCisgICAgbm93c3RyWzEwXSA9ICcgJzsgICAgICAgICAgICAgICAgICAgLyogdGhpcmQgbGV0dGVyIG9mIG1vbnRoICovCisgICAgbm93c3RyWzExXSA9ICcgJzsKKyAgICBub3dzdHJbMTJdID0gY21kYXRlWzBdOworICAgIG5vd3N0clsxM10gPSBjbWRhdGVbMV07CisgICAgbm93c3RyWzE0XSA9IGNtZGF0ZVsyXTsKKyAgICBub3dzdHJbMTVdID0gY21kYXRlWzNdOworICAgIG5vd3N0clsxNl0gPSAnICc7CisgICAgbm93c3RyWzE3XSA9IGNtZGF0ZVs5XTsKKyAgICBub3dzdHJbMThdID0gY21kYXRlWzEwXTsKKyAgICBub3dzdHJbMTldID0gY21kYXRlWzExXTsKKyAgICBub3dzdHJbMjBdID0gY21kYXRlWzEyXTsKKyAgICBub3dzdHJbMjFdID0gY21kYXRlWzEzXTsKKyAgICBub3dzdHJbMjJdID0gY21kYXRlWzE0XTsKKyAgICBub3dzdHJbMjNdID0gY21kYXRlWzE1XTsKKyAgICBub3dzdHJbMjRdID0gY21kYXRlWzE2XTsKKyAgICBub3dzdHJbMjVdID0gJyAnOworICAgIG5vd3N0clsyNl0gPSAnRyc7CisgICAgbm93c3RyWzI3XSA9ICdNJzsKKyAgICBub3dzdHJbMjhdID0gJ1QnOworICAgIG5vd3N0clsyOV0gPSAnXDAnOworI2VuZGlmIC8qIENNREFURTJUTSAqLworICAgIHJldHVybihub3dzdHIpOworfQorCisjaWZuZGVmIE9TMgorI2lmbmRlZiBDS19BVVRIRU5USUNBVElPTgorLyogZnJvbSBja3V1c3IuaCwgd2hpY2ggdGhpcyBtb2R1bGUgbm9ybWFsbHkgZG9lc24ndCBpbmNsdWRlICovCitfUFJPVE9UWVAoIGludCBkY2xhcnJheSwgKGNoYXIsIGludCkgKTsKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2VuZGlmIC8qIE9TMiAqLworLyoKKyAgQXNzaWduIGh0dHAgcmVzcG9uc2UgcGFpcnMgdG8gZ2l2ZW4gYXJyYXkuCisgIEZvciBiZXN0IHJlc3VsdHMsIHJlc3BvbnNlIHBhaXJzIHNob3VsZCBjb250YWluIG5vIHNwYWNlcy4KKworICBDYWxsIHdpdGg6CisgICAgcmVzcCAgPSAgcG9pbnRlciB0byByZXNwb25zZSBsaXN0LgorICAgIG4gICAgID0gIHNpemUgb2YgcmVzcG9uc2UgbGlzdC4KKyAgICBhcnJheSA9ICBhcnJheSBsZXR0ZXIuCisgIFJldHVybnM6CisgICAgMCBvbiBmYWlsdXJlLgorICAgID49IDEsIHNpemUgb2YgYXJyYXksIG9uIHN1Y2Nlc3MuCisqLworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCitodHRwX21rYXJyYXkoY2hhciAqKiByZXNwLCBpbnQgbiwgY2hhciBhcnJheSkKKyNlbHNlCitodHRwX21rYXJyYXkocmVzcCwgbiwgYXJyYXkpIGNoYXIgKiogcmVzcDsgaW50IG47IGNoYXIgYXJyYXk7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyNpZm5kZWYgTk9TUEwKKyAgICBpbnQgaSwgeDsKKyAgICBjaGFyICoqIGFwOworICAgIGV4dGVybiBjaGFyICoqIGFfcHRyW107CisgICAgZXh0ZXJuIGludCBhX2RpbVtdOworCisgICAgaWYgKCFhcnJheSB8fCBuIDw9IDApCisgICAgICByZXR1cm4oMCk7CisgICAgaWYgKCh4ID0gZGNsYXJyYXkoYXJyYXksbikpIDwgMCkgeworICAgICAgICBwcmludGYoIj9BcnJheSBkZWNsYXJhdGlvbiBmYWlsdXJlXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgLyogTm90ZTogYXJndW1lbnQgYXJyYXkgaXMgMC1iYXNlZCBidXQgS2VybWl0IGFycmF5IGlzIDEtYmFzZWQgKi8KKyAgICBhcCA9IGFfcHRyW3hdOworICAgIGFwWzBdID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB0aCBlbGVtZW50IGlzIGVtcHR5ICovCisgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpKyspIHsKKyAgICAgICAgYXBbaV0gPSByZXNwW2ktMV07ICAgICAgICAgICAgICAvKiBJZiByZXNwIGVsZW1lbnRzIHdlcmUgbWFsbG9jJ2QgKi8KKyAgICAgICAgcmVzcFtpLTFdID0gTlVMTDsKKyAgICB9CisgICAgYV9kaW1beF0gPSBuOworICAgIHJldHVybihuKTsKKyNlbHNlCisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIE5PU1BMICovCit9CisKKyNkZWZpbmUgSFRUUEhFQURDTlQgNjQKK2ludAoraHR0cF9nZXRfY2h1bmtfbGVuKCkKK3sKKyAgICBpbnQgbGVuID0gMDsKKyAgICBpbnQgaSA9IDAsIGogPSAtMTsKKyAgICBjaGFyIGJ1ZlsyNF07CisgICAgaW50IGNoOworCisgICAgd2hpbGUgKChjaCA9IGh0dHBfaW5jKDApKSA+PSAwICYmIGkgPCAyNCkgeworICAgICAgICBidWZbaV0gPSBjaDsKKyAgICAgICAgaWYgKCBidWZbaV0gPT0gJzsnICkgICAgICAgICAgICAvKiBGaW5kIGNodW5rLWV4dGVuc2lvbiAoaWYgYW55KSAqLworICAgICAgICAgICAgaiA9IGk7CisgICAgICAgIGlmICggYnVmW2ldID09IDEwICkgeyAgICAgICAgICAgLyogZm91bmQgZW5kIG9mIGxpbmUgKi8KKyAgICAgICAgICAgIGlmIChpID4gMCAmJiBidWZbaS0xXSA9PSAxMykKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICBidWZbaV0gPSAnXDAnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKyAgICBpZiAoIGkgPCAyNCApIHsgICAgICAgICAgICAgICAgICAgICAvKiBidWYgbm93IGNvbnRhaW5zIGxlbiBpbiBIZXggKi8KKyAgICAgICAgbGVuID0gaGV4dG91bG9uZyhidWYsIGogPT0gLTEgPyBpIDogai0xKTsKKyAgICB9CisKKyAgICByZXR1cm4obGVuKTsKK30KKworaW50CitodHRwX2lzY29ubmVjdGVkKCkKK3sKKyAgICByZXR1cm4oaHR0cGZkICE9IC0xKTsKK30KKworY2hhciAqCitodHRwX2hvc3QoKQoreworICAgIHJldHVybihodHRwZmQgIT0gLTEgPyBodHRwX2hvc3RfcG9ydCA6ICIiKTsKK30KKworY2hhciAqCitodHRwX3NlY3VyaXR5KCkKK3sKKyAgICBpZiAoIGh0dHBmZCA9PSAtMSApCisgICAgICAgIHJldHVybigiTlVMTCIpOworI2lmZGVmIENLX1NTTAorICAgIGlmICh0bHNfaHR0cF9hY3RpdmVfZmxhZykgeworICAgICAgICBTU0xfQ0lQSEVSICogY2lwaGVyOworICAgICAgICBjb25zdCBjaGFyICpjaXBoZXJfbGlzdDsKKyAgICAgICAgc3RhdGljIGNoYXIgYnVmWzEyOF07CisgICAgICAgIGJ1ZlswXSA9IE5VTDsKKyAgICAgICAgY2lwaGVyID0gU1NMX2dldF9jdXJyZW50X2NpcGhlcih0bHNfaHR0cF9jb24pOworICAgICAgICBjaXBoZXJfbGlzdCA9IFNTTF9DSVBIRVJfZ2V0X25hbWUoY2lwaGVyKTsKKyAgICAgICAgU1NMX0NJUEhFUl9kZXNjcmlwdGlvbihjaXBoZXIsYnVmLHNpemVvZihidWYpKTsKKyAgICAgICAgcmV0dXJuKGJ1Zik7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgIHJldHVybigiTlVMTCIpOworfQorCitpbnQKK2h0dHBfcmVvcGVuKCkKK3sKKyAgICBpbnQgcmMgPSAwOworICAgIGNoYXIgKiBzID0gTlVMTDsgICAgICAgICAgICAgICAgICAgIC8qIHN0cmR1cCBpcyBub3QgcG9ydGFibGUgKi8KKyAgICBpZiAoIHRjcF9odHRwX3Byb3h5ICkgeworICAgICAgICBjaGFyICogcDsKKyAgICAgICAgbWFrZXN0cigmcywoY2hhciAqKWh0dHBfaG9zdF9wb3J0KTsKKyAgICAgICAgcCA9IHM7CisgICAgICAgIHdoaWxlICgqcCAhPSAnXDAnICYmICpwICE9ICc6JykgcCsrOyAvKiBMb29rIGZvciBjb2xvbiAqLworICAgICAgICBpZiAoKnAgPT0gJzonKSB7ICAgICAgICAgICAgICAgICAgICAgLyogSGF2ZSBhIGNvbG9uICovCisgICAgICAgICAgICAqcCsrID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgc2VydmljZSBuYW1lIG9yIG51bWJlciAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcD0iaHR0cCI7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBodHRwX29wZW4ocyxwLGh0dHBfc3NsLE5VTEwsMCxodHRwX2FnZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtYWtlc3RyKCZzLChjaGFyICopaHR0cF9pcCk7CisgICAgICAgIHJjID0gaHR0cF9vcGVuKHMsY2t1aXRvYShodHRwX3BvcnQpLGh0dHBfc3NsLE5VTEwsMCxodHRwX2FnZW50KTsKKyAgICB9CisgICAgZnJlZShzKTsKKyAgICByZXR1cm4ocmMpOworfQorCisKK2ludAorI2lmZGVmIENLX0FOU0lDCitodHRwX29wZW4oY2hhciAqIGhvc3RuYW1lLCBjaGFyICogc3ZjbmFtZSwgaW50IHVzZV9zc2wsIGNoYXIgKiByZG5zX25hbWUsCisgICAgICAgICAgaW50IHJkbnNfbGVuLCBjaGFyICogYWdlbnQpCisjZWxzZSAvKiBDS19BTlNJQyAqLworaHR0cF9vcGVuKGhvc3RuYW1lLCBzdmNuYW1lLCB1c2Vfc3NsLCByZG5zX25hbWUsIHJkbnNfbGVuLCBhZ2VudCkKKyAgICBjaGFyICogaG9zdG5hbWU7CisgICAgY2hhciAqIHN2Y25hbWU7CisgICAgaW50ICAgIHVzZV9zc2w7CisgICAgY2hhciAqIHJkbnNfbmFtZTsKKyAgICBpbnQgICAgcmRuc19sZW47CisgICAgY2hhciAqIGFnZW50OworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgY2hhciBuYW1lY29weVtOQU1FQ1BZTF07CisgICAgY2hhciAqcDsKKyAgICBpbnQgaSwgeCwgZG5zID0gMDsKKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICBpbnQgaXNjb25uZWN0ID0gMDsKKyNpZmRlZiBTT19PT0JJTkxJTkUKKyAgICBpbnQgb24gPSAxOworI2VuZGlmIC8qIFNPX09PQklOTElORSAqLworICAgIHN0cnVjdCBzZXJ2ZW50ICpzZXJ2aWNlPU5VTEw7CisgICAgc3RydWN0IGhvc3RlbnQgKmhvc3Q9TlVMTDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcl9hZGRyOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisgICAgc3RydWN0IHNvY2thZGRyX2luIGxfYWRkcjsKKyAgICBHU09DS05BTUVfVCBsX3NsZW47CisjaWZkZWYgRVhDRUxBTgorICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZW5kX3NvY2tldDsKKyNlbmRpZiAvKiBFWENFTEFOICovCisKKyNpZmRlZiBJTkFERFJYCisvKiBpbmV0X2FkZHIoKSBpcyBvZiB0eXBlIHN0cnVjdCBpbl9hZGRyICovCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICBleHRlcm4gc3RydWN0IGluX2FkZHIgaW5ldF9hZGRyKCk7CisjZWxzZQorI2lmZGVmIEhQVVg1V0lOVENQCisgICAgZXh0ZXJuIHN0cnVjdCBpbl9hZGRyIGluZXRfYWRkcigpOworI2VuZGlmIC8qIEhQVVg1V0lOVENQICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpYXg7CisjZWxzZQorI2lmZGVmIElOQUREUl9OT05FCisgICAgc3RydWN0IGluX2FkZHIgaWF4OworI2Vsc2UgLyogSU5BRERSX05PTkUgKi8KKyAgICBsb25nIGlheDsKKyNlbmRpZiAvKiBJTkFERFJfTk9ORSAqLworI2VuZGlmIC8qIElOQUREUlggKi8KKworICAgIGlmICggcmRuc19uYW1lID09IE5VTEwgfHwgcmRuc19sZW4gPCAwICkKKyAgICAgICAgcmRuc19sZW4gPSAwOworCisgICAgKmh0dHBfaXAgPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgSVAgYWRkcmVzcyBzdHJpbmcgKi8KKyAgICBuYW1lY29weVswXSA9ICdcMCc7CisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKyAgICAgICAgZGVidWcoRjExMCwiaHR0cF9vcGVuIGhvc3RuYW1lIixob3N0bmFtZSwwKTsKKyAgICAgICAgZGVidWcoRjExMCwiaHR0cF9vcGVuIHN2Y25hbWUiLHN2Y25hbWUsMCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgaWYgKCFob3N0bmFtZSkgaG9zdG5hbWUgPSAiIjsKKyAgICBpZiAoIXN2Y25hbWUpIHN2Y25hbWUgPSAiIjsKKyAgICBpZiAoISpob3N0bmFtZSB8fCAhKnN2Y25hbWUpIHJldHVybigtMSk7CisKKyAgICAKKyAgICBzZXJ2aWNlID0gY2tnZXRzZXJ2aWNlKGhvc3RuYW1lLHN2Y25hbWUsaHR0cF9pcCwyMCk7CisKKyAgICBpZiAoc2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICggIXF1aWV0ICkKKyAgICAgICAgICAgIHByaW50ZigiP0ludmFsaWQgc2VydmljZTogJXNcclxuIixzdmNuYW1lKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICAvKiBGb3IgSFRUUCBjb25uZWN0aW9ucyB3ZSBtdXN0IHByZXNlcnZlIHRoZSBvcmlnaW5hbCBob3N0bmFtZSBhbmQgKi8KKyAgICAvKiBzZXJ2aWNlIHJlcXVlc3RlZCBzbyB3ZSBjYW4gaW5jbHVkZSB0aGVtIGluIHRoZSBIb3N0IGhlYWRlci4gICAgKi8KKyAgICBja21ha21zZyhodHRwX2hvc3RfcG9ydCxzaXplb2YoaHR0cF9ob3N0X3BvcnQpLGhvc3RuYW1lLCI6IiwKKyAgICAgICAgICAgICAgY2t1aXRvYShudG9ocyhzZXJ2aWNlLT5zX3BvcnQpKSxOVUxMKTsKKyAgICBodHRwX3BvcnQgPSBudG9ocyhzZXJ2aWNlLT5zX3BvcnQpOworICAgIGh0dHBfc3NsID0gdXNlX3NzbDsKKyAgICBkZWJ1ZyhGMTExLCJodHRwX29wZW4iLGh0dHBfaG9zdF9wb3J0LGh0dHBfcG9ydCk7CisKKyAgICAvKiAnaHR0cF9pcCcgY29udGFpbnMgdGhlIElQIGFkZHJlc3MgdG8gd2hpY2ggd2Ugd2FudCB0byBjb25uZWN0ICAgICAgICAqLworICAgIC8qICdzdmNuYW0nICAgY29udGFpbnMgdGhlIHNlcnZpY2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogJ3NlcnZpY2UtPnNfcG9ydCcgY29udGFpbnMgdGhlIHBvcnQgbnVtYmVyIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAgICAgKi8KKworICAgIC8qIElmIHdlIGFyZSB1c2luZyBhbiBodHRwIHByb3h5LCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIGJ1ZmZlciBjb250YWluaW5nICovCisgICAgLyogICBob3N0bmFtZTpwb3J0LW51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiB0byBwYXNzIHRvIHRoZSBodHRwX2Nvbm5lY3QoKSBmdW5jdGlvbi4gIFRoZW4gd2UgbmVlZCB0byByZXBsYWNlICAgICAqLworICAgIC8qICduYW1lY29weScgd2l0aCB0aGUgbmFtZSBvZiB0aGUgcHJveHkgc2VydmVyIGFuZCB0aGUgc2VydmljZS0+c19wb3J0ICovCisgICAgLyogd2l0aCB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIHByb3h5IChkZWZhdWx0IHBvcnQgODApLiAgICAgICAgICAgICAgICAgKi8KKworICAgIGlmICggdGNwX2h0dHBfcHJveHkgKSB7CisKKyAgICAgICAgY2ttYWttc2cocHJveHljb3B5LHNpemVvZihwcm94eWNvcHkpLGhvc3RuYW1lLCI6IiwKKyAgICAgICAgICAgICAgICAgY2t1aXRvYShudG9ocyhzZXJ2aWNlLT5zX3BvcnQpKSxOVUxMKTsKKyAgICAgICAgY2tzdHJuY3B5KG5hbWVjb3B5LHRjcF9odHRwX3Byb3h5LE5BTUVDUFlMKTsKKworICAgICAgICBwID0gbmFtZWNvcHk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBXYXMgYSBzZXJ2aWNlIHJlcXVlc3RlZD8gKi8KKyAgICAgICAgd2hpbGUgKCpwICE9ICdcMCcgJiYgKnAgIT0gJzonKSBwKys7IC8qIExvb2sgZm9yIGNvbG9uICovCisgICAgICAgIGlmICgqcCA9PSAnOicpIHsgICAgICAgICAgICAgICAgICAgIC8qIEhhdmUgYSBjb2xvbiAqLworICAgICAgICAgICAgZGVidWcoRjExMCwiaHR0cF9vcGVuIG5hbWUgaGFzIGNvbG9uIixuYW1lY29weSwwKTsKKyAgICAgICAgICAgICpwKysgPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHNlcnZpY2UgbmFtZSBvciBudW1iZXIgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmNweSgrK3AsImh0dHAiKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlcnZpY2UgPSBja2dldHNlcnZpY2UobmFtZWNvcHkscCxodHRwX2lwLDIwKTsKKyAgICAgICAgaWYgKCFzZXJ2aWNlKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGZpbmQgcG9ydCBmb3Igc2VydmljZSAlc1xuIiwgcCk7CisjaWZkZWYgVEdWT1JXSU4KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImh0dHBfb3BlbiBjYW4ndCBnZXQgc2VydmljZSBmb3IgcHJveHkiLCIiLHNvY2tldF9lcnJubyk7CisjZWxzZQorICAgICAgICAgICAgZGVidWcoRjEwMSwiaHR0cF9vcGVuIGNhbid0IGdldCBzZXJ2aWNlIGZvciBwcm94eSIsIiIsZXJybm8pOworI2VuZGlmIC8qIFRHVk9SV0lOICovCisgICAgICAgICAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgLyogKHJhdGhlciB0aGFuIG1pc2xlYWQpICovCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisKKyAgICAgICAgLyogY29weSB0aGUgcHJveHluYW1lIGFuZCByZW1vdmUgdGhlIHNlcnZpY2UgaWYgYW55IHNvIHdlIGNhbiB1c2UgCisgICAgICAgICAqIGl0IGFzIHRoZSBob3N0bmFtZSAKKyAgICAgICAgICovCisgICAgICAgIGNrc3RybmNweShuYW1lY29weSx0Y3BfaHR0cF9wcm94eSxOQU1FQ1BZTCk7CisgICAgICAgIHAgPSBuYW1lY29weTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhcyBhIHNlcnZpY2UgcmVxdWVzdGVkPyAqLworICAgICAgICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSAnOicpIHArKzsgLyogTG9vayBmb3IgY29sb24gKi8KKyAgICAgICAgaWYgKCpwID09ICc6JykgeyAgICAgICAgICAgICAgICAgICAgLyogSGF2ZSBhIGNvbG9uICovCisgICAgICAgICAgICAqcCA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmF0ZSBzdHJpbmcgKi8KKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIGhvc3RuYW1lID0gbmFtZWNvcHk7ICAgICAgICAgICAgICAgIC8qIHVzZSBwcm94eSBhcyBob3N0bmFtZSAqLworICAgIH0KKworICAgIC8qIFNldCB1cCBzb2NrZXQgc3RydWN0dXJlIGFuZCBnZXQgaG9zdCBhZGRyZXNzICovCisgICAgYnplcm8oKGNoYXIgKikmcl9hZGRyLCBzaXplb2Yocl9hZGRyKSk7CisgICAgZGVidWcoRjEwMCwiaHR0cF9vcGVuIGJ6ZXJvIG9rIiwiIiwwKTsKKworI2lmZGVmIElOQUREUl9OT05FCisgICAgZGVidWcoRjEwMSwiaHR0cF9vcGVuIElOQUREUl9OT05FIGRlZmluZWQiLCIiLElOQUREUl9OT05FKTsKKyNlbHNlIC8qIElOQUREUl9OT05FICovCisgICAgZGVidWcoRjEwMCwiaHR0cF9vcGVuIElOQUREUl9OT05FIG5vdCBkZWZpbmVkIiwiIiwwKTsKKyNlbmRpZiAvKiBJTkFERFJfTk9ORSAqLworI2lmZGVmIElOQUREUlgKKyAgICBkZWJ1ZyhGMTAwLCJodHRwX29wZW4gSU5BRERSWCBkZWZpbmVkIiwiIiwwKTsKKyNlbHNlIC8qIElOQUREUlggKi8KKyAgICBkZWJ1ZyhGMTAwLCJodHRwX29wZW4gSU5BRERSWCBub3QgZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYgLyogSU5BRERSWCAqLworCisjaWZuZGVmIE5PTUhIT1NUCisjaWZkZWYgSU5BRERSWAorICAgIGlheCA9IGluZXRfYWRkcihodHRwX2lwWzBdP2h0dHBfaXA6aG9zdG5hbWUpOworICAgIGRlYnVnKEYxMTEsImh0dHBfb3BlbiBpbmV0X2FkZHIiLGh0dHBfaXBbMF0/aHR0cF9pcDpob3N0bmFtZSxpYXguc19hZGRyKTsKKyNlbHNlIC8qIElOQUREUlggKi8KKyNpZmRlZiBJTkFERFJfTk9ORQorICAgIGlheC5zX2FkZHIgPSBpbmV0X2FkZHIoaHR0cF9pcFswXT9odHRwX2lwOmhvc3RuYW1lKTsKKyAgICBkZWJ1ZyhGMTExLCJodHRwX29wZW4gaW5ldF9hZGRyIixodHRwX2lwWzBdP2h0dHBfaXA6aG9zdG5hbWUsaWF4LnNfYWRkcik7CisjZWxzZSAvKiBJTkFERFJfTk9ORSAqLworI2lmbmRlZiBkYXRhZ2VuZXJhbAorICAgIGlheCA9ICh1bnNpZ25lZCBpbnQpIGluZXRfYWRkcihodHRwX2lwWzBdP2h0dHBfaXA6aG9zdG5hbWUpOworI2Vsc2UKKyAgICBpYXggPSAtMUw7CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyAgICBkZWJ1ZyhGMTExLCJodHRwX29wZW4gaW5ldF9hZGRyIixodHRwX2lwWzBdP2h0dHBfaXA6aG9zdG5hbWUsaWF4KTsKKyNlbmRpZiAvKiBJTkFERFJfTk9ORSAqLworI2VuZGlmIC8qIElOQUREUlggKi8KKworICAgIGRucyA9IDA7CisgICAgaWYgKAorI2lmZGVmIElOQUREUl9OT05FCisvKiBUaGlzIG1pZ2h0IGdpdmUgd2FybmluZ3Mgb24gNjQtYml0IHBsYXRmb3JtcyBidXQgdGhleSBzaG91bGQgYmUgaGFybWxlc3MgKi8KKy8qIGJlY2F1c2UgSU5BRERSX05PTkUgc2hvdWxkIGJlIGFsbCAxJ3MgYW55d2F5LCB0aHVzIHRoZSBPUiBwYXJ0IGlzICovCisvKiBwcm9iYWJseSBzdXBlcmZsdW91cyAtLSBub3Qgc3VyZSB3aHkgaXQncyBldmVuIHRoZXJlLCBtYXliZSBpdCBzaG91bGQgYmUgKi8KKy8qIHJlbW92ZWQuICovCisgICAgICAgIGlheC5zX2FkZHIgPT0gSU5BRERSX05PTkUgfHwgaWF4LnNfYWRkciA9PSAodW5zaWduZWQgbG9uZykgLTFMCisjZWxzZSAvKiBJTkFERFJfTk9ORSAqLworICAgICAgICBpYXggPCAwCisjZW5kaWYgLyogSU5BRERSX05PTkUgKi8KKyAgICAgICAgKSB7CisgICAgICAgIGlmICghcXVpZXQpIHsKKyAgICAgICAgICAgIHByaW50ZigiIEROUyBMb29rdXAuLi4gIik7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGhvc3QgPSBnZXRob3N0YnluYW1lKGh0dHBfaXBbMF0gPyBodHRwX2lwIDogaG9zdG5hbWUpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX29wZW4gZ2V0aG9zdGJ5bmFtZSAhPSBOVUxMIiwiIiwwKTsKKyAgICAgICAgICAgIGhvc3QgPSBja19jb3B5aG9zdGVudChob3N0KTsKKyAgICAgICAgICAgIGRucyA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBSZW1lbWJlciB3ZSBwZXJmb3JtZWQgZG5zIGxvb2t1cCAqLworICAgICAgICAgICAgcl9hZGRyLnNpbl9mYW1pbHkgPSBob3N0LT5oX2FkZHJ0eXBlOworICAgICAgICAgICAgaWYgKHRjcF9yZG5zICYmIGhvc3QtPmhfbmFtZSAmJiBob3N0LT5oX25hbWVbMF0gJiYgKHJkbnNfbGVuID4gMCkKKyAgICAgICAgICAgICAgICAgJiYgKHRjcF9odHRwX3Byb3h5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBja21ha21zZyhyZG5zX25hbWUscmRuc19sZW4saG9zdC0+aF9uYW1lLCI6IixzdmNuYW1lLE5VTEwpOworCisjaWZkZWYgSEFERFJMSVNUCisjaWZkZWYgaF9hZGRyCisgICAgICAgICAgICAvKiBUaGlzIGlzIGZvciB0cnlpbmcgbXVsdGlwbGUgSVAgYWRkcmVzc2VzIC0gc2VlIDxuZXRkYi5oPiAqLworICAgICAgICAgICAgaWYgKCEoaG9zdC0+aF9hZGRyX2xpc3QpKQorICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgYmNvcHkoaG9zdC0+aF9hZGRyX2xpc3RbMF0sCisgICAgICAgICAgICAgICAgICAoY2FkZHJfdCkmcl9hZGRyLnNpbl9hZGRyLAorICAgICAgICAgICAgICAgICAgaG9zdC0+aF9sZW5ndGgKKyAgICAgICAgICAgICAgICAgICk7CisjZWxzZQorICAgICAgICAgICAgYmNvcHkoaG9zdC0+aF9hZGRyLCAoY2FkZHJfdCkmcl9hZGRyLnNpbl9hZGRyLCBob3N0LT5oX2xlbmd0aCk7CisjZW5kaWYgLyogaF9hZGRyICovCisjZWxzZSAgLyogSEFERFJMSVNUICovCisgICAgICAgICAgICBiY29weShob3N0LT5oX2FkZHIsIChjYWRkcl90KSZyX2FkZHIuc2luX2FkZHIsIGhvc3QtPmhfbGVuZ3RoKTsKKyNlbmRpZiAvKiBIQUREUkxJU1QgKi8KKyNpZm5kZWYgRVhDRUxBTgorICAgICAgICAgICAgZGVidWcoRjExMSwiQkNPUFkiLCJob3N0LT5oX2FkZHIiLGhvc3QtPmhfYWRkcik7CisjZW5kaWYgLyogRVhDRUxBTiAqLworICAgICAgICAgICAgZGVidWcoRjExMSwiQkNPUFkiLCIgKGNhZGRyX3QpJnJfYWRkci5zaW5fYWRkciIsCisgICAgICAgICAgICAgICAgICAoY2FkZHJfdCkmcl9hZGRyLnNpbl9hZGRyKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIkJDT1BZIiwiIHJfYWRkci5zaW5fYWRkci5zX2FkZHIiLAorICAgICAgICAgICAgICAgICAgcl9hZGRyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJCQ09QWSIsImhvc3QtPmhfbGVuZ3RoIixob3N0LT5oX2xlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTk9NSEhPU1QgKi8KKworICAgIGlmICghZG5zKSB7CisjaWZkZWYgSU5BRERSWAorLyogaW5ldF9hZGRyKCkgaXMgb2YgdHlwZSBzdHJ1Y3QgaW5fYWRkciAqLworICAgICAgICBzdHJ1Y3QgaW5fYWRkciBpbmE7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdXU7CisgICAgICAgIGRlYnVnKEYxMDAsImh0dHBfb3BlbiBnZXRob3N0YnluYW1lID09IE5VTEw6IElOQUREUlgiLCIiLDApOworICAgICAgICBpbmEgPSBpbmV0X2FkZHIoaHR0cF9pcFswXT9odHRwX2lwOmhvc3RuYW1lKTsKKyAgICAgICAgdXUgPSAqKHVuc2lnbmVkIGludCAqKSZpbmE7CisjZWxzZSAvKiBOb3QgSU5BRERSWCAqLworLyogaW5ldF9hZGRyKCkgaXMgdW5zaWduZWQgbG9uZyAqLworICAgICAgICB1bnNpZ25lZCBsb25nIHV1OworICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX29wZW4gZ2V0aG9zdGJ5bmFtZSA9PSBOVUxMOiBOb3QgSU5BRERSWCIsIiIsMCk7CisgICAgICAgIHV1ID0gaW5ldF9hZGRyKGh0dHBfaXBbMF0/aHR0cF9pcDpob3N0bmFtZSk7CisjZW5kaWYgLyogSU5BRERSWCAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJodHRwX29wZW4gdXUiLCIiLHV1KTsKKyAgICAgICAgaWYgKAorI2lmZGVmIElOQUREUl9OT05FCisgICAgICAgICAgICAhKHV1ID09IElOQUREUl9OT05FIHx8IHV1ID09ICh1bnNpZ25lZCBpbnQpIC0xTCkKKyNlbHNlICAgLyogSU5BRERSX05PTkUgKi8KKyAgICAgICAgICAgIHV1ICE9ICgodW5zaWduZWQgbG9uZyktMSkKKyNlbmRpZiAvKiBJTkFERFJfTk9ORSAqLworICAgICAgICAgICAgKSB7CisgICAgICAgICAgICByX2FkZHIuc2luX2FkZHIuc19hZGRyID0gdXU7CisgICAgICAgICAgICByX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgVk1TCisgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlxyXG4iKTsgICAgLyogY29tcGxldGUgYW55IHByZXZpb3VzIG1lc3NhZ2UgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgZ2V0IGFkZHJlc3MgZm9yICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgaHR0cF9pcFswXT9odHRwX2lwOmhvc3RuYW1lKTsKKyNpZmRlZiBUR1ZPUldJTgorICAgICAgICAgICAgZGVidWcoRjEwMSwiaHR0cF9vcGVuIGNhbid0IGdldCBhZGRyZXNzIiwiIixzb2NrZXRfZXJybm8pOworI2Vsc2UKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImh0dHBfb3BlbiBjYW4ndCBnZXQgYWRkcmVzcyIsIiIsZXJybm8pOworI2VuZGlmIC8qIFRHVk9SV0lOICovCisgICAgICAgICAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgLyogUmF0aGVyIHRoYW4gbWlzbGVhZCAqLworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdldCBhIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGNvbm5lY3Rpb24uICovCisKKyAgICByX2FkZHIuc2luX3BvcnQgPSBzZXJ2aWNlLT5zX3BvcnQ7CisgICAgY2tzdHJuY3B5KGh0dHBfaXAsKGNoYXIgKilpbmV0X250b2Eocl9hZGRyLnNpbl9hZGRyKSwyMCk7CisgICAgZGVidWcoRjExMCwiaHR0cF9vcGVuIHRyeWluZyIsaHR0cF9pcCwwKTsKKyAgICBpZiAoIXF1aWV0ICYmICpodHRwX2lwKSB7CisgICAgICAgIHByaW50ZigiIFRyeWluZyAlcy4uLiAiLCBodHRwX2lwKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorCisgICAgLyogTG9vcCB0byB0cnkgYWRkaXRpb25hbCBJUCBhZGRyZXNzZXMsIGlmIGFueS4gKi8KKworICAgIGRvIHsKKyNpZmRlZiBFWENFTEFOCisgICAgICAgIHNlbmRfc29ja2V0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBzZW5kX3NvY2tldC5zaW5fYWRkci5zX2FkZHIgPSAwOworICAgICAgICBzZW5kX3NvY2tldC5zaW5fcG9ydCA9IDA7CisgICAgICAgIGlmICgoaHR0cGZkID0gc29ja2V0KFNPQ0tfU1RSRUFNLCAoc3RydWN0IHNvY2twcm90byAqKTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbmRfc29ja2V0LCBTT19SRVVTRUFERFIpKSA8IDApCisjZWxzZSAgLyogRVhDRUxBTiAqLworICAgICAgICBpZiAoKGh0dHBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkKKyNlbmRpZiAvKiBFWENFTEFOICovCisgICAgICAgICAgICB7CisjaWZkZWYgRVhDRUxBTgorICAgICAgICAgICAgICAgIGV4cGVycm9yKCJUQ1Agc29ja2V0IGVycm9yIik7CisjZWxzZQorI2lmZGVmIFRHVk9SV0lOCisjaWZkZWYgT0xEX1RXRworICAgICAgICAgICAgICAgIGVycm5vID0gc29ja2V0X2Vycm5vOworI2VuZGlmIC8qIE9MRF9UV0cgKi8KKyAgICAgICAgICAgICAgICBzb2NrZXRfcGVycm9yKCJUQ1Agc29ja2V0IGVycm9yIik7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiaHR0cF9vcGVuIHNvY2tldCBlcnJvciIsIiIsc29ja2V0X2Vycm5vKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgcGVycm9yKCJUQ1Agc29ja2V0IGVycm9yIik7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiaHR0cF9vcGVuIHNvY2tldCBlcnJvciIsIiIsZXJybm8pOworI2VuZGlmIC8qIFRHVk9SV0lOICovCisjZW5kaWYgLyogRVhDRUxBTiAqLworICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICAgICAgfQorICAgICAgICBlcnJubyA9IDA7CisKKyAgICAgICAvKiBJZiBhIHNwZWNpZmljIFRDUCBhZGRyZXNzIG9uIHRoZSBsb2NhbCBob3N0IGlzIGRlc2lyZWQgd2UgKi8KKyAgICAgICAvKiBtdXN0IGJpbmQgaXQgdG8gdGhlIHNvY2tldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgIGlmICh0Y3BfYWRkcmVzcykgeworICAgICAgICAgICAgIGludCBzX2Vycm5vOworCisgICAgICAgICAgICAgZGVidWcoRjExMCwiaHR0cF9vcGVuIGJpbmRpbmcgc29ja2V0IHRvIix0Y3BfYWRkcmVzcywwKTsKKyAgICAgICAgICAgICBiemVybygoY2hhciAqKSZzaW4sc2l6ZW9mKHNpbikpOworICAgICAgICAgICAgIHNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyNpZmRlZiBJTkFERFJYCisgICAgICAgICAgICAgaW5hZGRyeCA9IGluZXRfYWRkcih0Y3BfYWRkcmVzcyk7CisgICAgICAgICAgICAgc2luLnNpbl9hZGRyLnNfYWRkciA9ICoodW5zaWduZWQgbG9uZyAqKSZpbmFkZHJ4OworI2Vsc2UKKyAgICAgICAgICAgICBzaW4uc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKHRjcF9hZGRyZXNzKTsKKyNlbmRpZiAvKiBJTkFERFJYICovCisgICAgICAgICAgICAgc2luLnNpbl9wb3J0ID0gMDsKKyAgICAgICAgICAgICBpZiAoYmluZChodHRwZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBzaXplb2Yoc2luKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgIHNfZXJybm8gPSBzb2NrZXRfZXJybm87IC8qIFNhdmUgZXJyb3IgY29kZSAqLworI2lmZGVmIFRDUElQTElCCisgICAgICAgICAgICAgICAgIHNvY2tldF9jbG9zZShodHRwZmQpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgICAgICAgY2xvc2UoaHR0cGZkKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgICAgICAgICAgICBodHRwZmQgPSAtMTsKKyAgICAgICAgICAgICAgICAgZXJybm8gPSBzX2Vycm5vOyAgICAgICAvKiBhbmQgcmVwb3J0IHRoaXMgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiaHR0cF9vcGVuIGJpbmQgZXJybm8iLCIiLGVycm5vKTsKKyAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKworLyogTm93IGNvbm5lY3QgdG8gdGhlIHNvY2tldCBvbiB0aGUgb3RoZXIgZW5kLiAqLworCisjaWZkZWYgRVhDRUxBTgorICAgICAgICBpZiAoY29ubmVjdChodHRwZmQsICZyX2FkZHIpIDwgMCkKKyNlbHNlCisjaWZkZWYgTlQKKyAgICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAxOworI2VuZGlmIC8qIE5UICovCisgICAgICAgIGlmIChjb25uZWN0KGh0dHBmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyX2FkZHIsIHNpemVvZihyX2FkZHIpKSA8IDApCisjZW5kaWYgLyogRVhDRUxBTiAqLworICAgICAgICAgIHsKKyNpZmRlZiBOVAorICAgICAgICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAwOworI2VuZGlmIC8qIE5UICovCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgIGkgPSBzb2NrZXRfZXJybm87CisjZWxzZSAvKiBPUzIgKi8KKyNpZmRlZiBUR1ZPUldJTgorICAgICAgICAgICAgICBpID0gc29ja2V0X2Vycm5vOworI2Vsc2UKKyAgICAgICAgICAgICAgaSA9IGVycm5vOyAgICAgICAgICAgICAgICAvKiBTYXZlIGVycm9yIGNvZGUgKi8KKyNlbmRpZiAvKiBUR1ZPUldJTiAqLworI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIEhBRERSTElTVAorI2lmZGVmIGhfYWRkcgorICAgICAgICAgICAgICBpZiAoaG9zdCAmJiBob3N0LT5oX2FkZHJfbGlzdCAmJiBob3N0LT5oX2FkZHJfbGlzdFsxXSkgeworICAgICAgICAgICAgICAgICAgcGVycm9yKCIiKTsKKyAgICAgICAgICAgICAgICAgIGhvc3QtPmhfYWRkcl9saXN0Kys7CisgICAgICAgICAgICAgICAgICBiY29weShob3N0LT5oX2FkZHJfbGlzdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjYWRkcl90KSZyX2FkZHIuc2luX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBob3N0LT5oX2xlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweShodHRwX2lwLChjaGFyICopaW5ldF9udG9hKHJfYWRkci5zaW5fYWRkciksMjApOworICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiaHR0cF9vcGVuIGhfYWRkcl9saXN0IixodHRwX2lwLDApOworICAgICAgICAgICAgICAgICAgaWYgKCFxdWlldCAmJiAqaHR0cF9pcCkgeworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIFRyeWluZyAlcy4uLiAiLCBodHRwX2lwKTsKKyAgICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICAgICAgICAgICAgc29ja2V0X2Nsb3NlKGh0dHBmZCk7IC8qIENsb3NlIGl0LiAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAgIGNsb3NlKGh0dHBmZCk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisjZW5kaWYgLyogaF9hZGRyICovCisjZW5kaWYgIC8qIEhBRERSTElTVCAqLworICAgICAgICAgICAgICBodHRwX2Nsb3NlKCk7CisgICAgICAgICAgICAgIGh0dHBmZCA9IC0xOworICAgICAgICAgICAgICBlcnJubyA9IGk7ICAgICAgICAgICAgICAgIC8qIEFuZCByZXBvcnQgdGhpcyBlcnJvciAqLworI2lmZGVmIEVYQ0VMQU4KKyAgICAgICAgICAgICAgaWYgKGVycm5vKSBleHBlcnJvcigiaHR0cF9vcGVuIGNvbm5lY3QiKTsKKyNlbHNlCisjaWZkZWYgVEdWT1JXSU4KKyAgICAgICAgICAgICAgZGVidWcoRjEwMSwiaHR0cF9vcGVuIGNvbm5lY3QgZXJyb3IiLCIiLHNvY2tldF9lcnJubyk7CisgICAgICAgICAgICAgIC8qIGlmIChlcnJubykgc29ja2V0X3BlcnJvcigiaHR0cF9vcGVuIGNvbm5lY3QiKTsgKi8KKyNpZmRlZiBPTERfVFdHCisgICAgICAgICAgICAgIGVycm5vID0gc29ja2V0X2Vycm5vOworI2VuZGlmIC8qIE9MRF9UV0cgKi8KKyAgICAgICAgICAgICAgaWYgKCFxdWlldCkKKyAgICAgICAgICAgICAgICBzb2NrZXRfcGVycm9yKCJodHRwX29wZW4gY29ubmVjdCIpOworI2Vsc2UgLyogVEdWT1JXSU4gKi8KKyAgICAgICAgICAgICAgZGVidWcoRjEwMSwiaHR0cF9vcGVuIGNvbm5lY3QgZXJybm8iLCIiLGVycm5vKTsKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgICAgaWYgKCFxdWlldCkKKyAgICAgICAgICAgICAgICBwZXJyb3IoIlxyXG5GYWlsZWQiKTsKKyNlbHNlCisgICAgICAgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgICAgICAgcGVycm9yKCJGYWlsZWQiKTsKKyNlbmRpZiAvKiBWTVMgKi8KKyNpZmRlZiBERUNfVENQSVAKKyAgICAgICAgICAgICAgaWYgKCFxdWlldCkKKyAgICAgICAgICAgICAgICBwZXJyb3IoImh0dHBfb3BlbiBjb25uZWN0Iik7CisjZW5kaWYgLyogREVDX1RDUElQICovCisjaWZkZWYgQ01VX1RDUElQCisgICAgICAgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgICAgICAgcGVycm9yKCJodHRwX29wZW4gY29ubmVjdCIpOworI2VuZGlmIC8qIENNVV9UQ1BJUCAqLworI2VuZGlmIC8qIFRHVk9SV0lOICovCisjZW5kaWYgLyogRVhDRUxBTiAqLworICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgIH0KKyNpZmRlZiBOVAorICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAwOworI2VuZGlmIC8qIE5UICovCisgICAgICAgIGlzY29ubmVjdCA9IDE7CisgICAgfSB3aGlsZSAoIWlzY29ubmVjdCk7CisKKyNpZmRlZiBOT05fQkxPQ0tfSU8KKyAgICBvbiA9IDE7CisgICAgeCA9IHNvY2tldF9pb2N0bChodHRwZmQsRklPTkJJTywmb24pOworICAgIGRlYnVnKEYxMDEsImh0dHBfb3BlbiBGSU9OQklPIiwiIix4KTsKKyNlbmRpZiAvKiBOT05fQkxPQ0tfSU8gKi8KKworICAgIC8qIFdlIGhhdmUgc3VjY2VlZGVkIGluIGNvbm5lY3RpbmcgdG8gdGhlIEhUVFAgUFJPWFkuICBTbyBub3cgd2UgICAqLworICAgIC8qIG5lZWQgdG8gYXR0ZW1wdCB0byBjb25uZWN0IHRocm91Z2ggdGhlIHByb3h5IHRvIHRoZSBhY3R1YWwgaG9zdCAqLworICAgIC8qIElmIHRoYXQgaXMgc3VjY2Vzc2Z1bCwgd2UgaGF2ZSB0byBwcmV0ZW5kIHRoYXQgd2UgbWFkZSBhIGRpcmVjdCAqLworICAgIC8qIGNvbm5lY3Rpb24gdG8gdGhlIGFjdHVhbCBob3N0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgaWYgKCB0Y3BfaHR0cF9wcm94eSApIHsKKyNpZmRlZiBPUzIKKyAgICAgICAgaWYgKCFhZ2VudCkgCisJICBhZ2VudCA9ICJLZXJtaXQgOTUiOwkvKiBEZWZhdWx0IHVzZXIgYWdlbnQgKi8KKyNlbHNlCisgICAgICAgIGlmICghYWdlbnQpIAorCSAgYWdlbnQgPSAiQy1LZXJtaXQiOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgICAgIGlmIChodHRwX2Nvbm5lY3QoaHR0cGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9odHRwX3Byb3h5X2FnZW50ID8gdGNwX2h0dHBfcHJveHlfYWdlbnQgOiBhZ2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9odHRwX3Byb3h5X3VzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX2h0dHBfcHJveHlfcHdkLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHljb3B5CisgICAgICAgICAgICAgICAgICAgICAgICAgKSA8IDApIHsKKyAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBTT19PT0JJTkxJTkUKKyAgICAvKiBTZWUgbm90ZSBvbiBTT19PT0JJTkxJTkUgaW4gbmV0b3BlbigpICovCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICBzZXRzb2Nrb3B0KGh0dHBmZCwgU09MX1NPQ0tFVCwgU09fT09CSU5MSU5FLChjaGFyICopICZvbiwgc2l6ZW9mIG9uKTsKKyNlbHNlCisjaWZkZWYgQlNENDMKKyAgICBzZXRzb2Nrb3B0KGh0dHBmZCwgU09MX1NPQ0tFVCwgU09fT09CSU5MSU5FLChjaGFyICopICZvbiwgc2l6ZW9mIG9uKTsKKyNlbHNlCisjaWZkZWYgT1NGMQorICAgIHNldHNvY2tvcHQoaHR0cGZkLCBTT0xfU09DS0VULCBTT19PT0JJTkxJTkUsKGNoYXIgKikgJm9uLCBzaXplb2Ygb24pOworI2Vsc2UKKyNpZmRlZiBQT1NJWAorICAgIHNldHNvY2tvcHQoaHR0cGZkLCBTT0xfU09DS0VULCBTT19PT0JJTkxJTkUsKGNoYXIgKikgJm9uLCBzaXplb2Ygb24pOworI2Vsc2UKKyNpZmRlZiBNT1RTVjg4UjQKKyAgICBzZXRzb2Nrb3B0KGh0dHBmZCwgU09MX1NPQ0tFVCwgU09fT09CSU5MSU5FLChjaGFyICopICZvbiwgc2l6ZW9mIG9uKTsKKyNlbHNlCisjaWZkZWYgU09MQVJJUworLyoKKyAgTWF5YmUgdGhpcyBhcHBsaWVzIHRvIGFsbCBTVlI0IHZlcnNpb25zLCBidXQgdGhlIG90aGVyIChlbHNlKSB3YXkgaGFzIGJlZW4KKyAgY29tcGlsaW5nIGFuZCB3b3JraW5nIGZpbmUgb24gYWxsIHRoZSBvdGhlcnMsIHNvIGJlc3Qgbm90IHRvIGNoYW5nZSBpdC4KKyovCisgICAgc2V0c29ja29wdChodHRwZmQsIFNPTF9TT0NLRVQsIFNPX09PQklOTElORSwoY2hhciAqKSAmb24sIHNpemVvZiBvbik7CisjZWxzZQorI2lmZGVmIE9TSworICAgIHNldHNvY2tvcHQoaHR0cGZkLCBTT0xfU09DS0VULCBTT19PT0JJTkxJTkUsKGNoYXIgKikgJm9uLCBzaXplb2Ygb24pOworI2Vsc2UKKyNpZmRlZiBPUzIKKyAgICB7CisgICAgICAgIGludCByYzsKKyAgICAgICAgcmMgPSBzZXRzb2Nrb3B0KGh0dHBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBTT19PT0JJTkxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Ygb24KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGRlYnVnKEYxMTEsInNldHNvY2tvcHQgU09fT09CSU5MSU5FIixvbiA/ICJvbiIgOiAib2ZmIiAscmMpOworICAgIH0KKyNlbHNlCisjaWZkZWYgVk1TIC8qIG9yLCBhdCBsZWFzdCwgVk1TIHdpdGggZ2NjICovCisgICAgc2V0c29ja29wdChodHRwZmQsIFNPTF9TT0NLRVQsIFNPX09PQklOTElORSwoY2hhciAqKSAmb24sIHNpemVvZiBvbik7CisjZWxzZQorI2lmZGVmIENMSVgKKyAgICBzZXRzb2Nrb3B0KGh0dHBmZCwgU09MX1NPQ0tFVCwgU09fT09CSU5MSU5FLChjaGFyICopICZvbiwgc2l6ZW9mIG9uKTsKKyNlbHNlCisgICAgc2V0c29ja29wdChodHRwZmQsIFNPTF9TT0NLRVQsIFNPX09PQklOTElORSwgJm9uLCBzaXplb2Ygb24pOworI2VuZGlmIC8qIENMSVggKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBTT0xBUklTICovCisjZW5kaWYgLyogTU9UU1Y4OFI0ICovCisjZW5kaWYgLyogUE9TSVggKi8KKyNlbmRpZiAvKiBCU0Q0MyAqLworI2VuZGlmIC8qIE9TRjEgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFNPX09PQklOTElORSAqLworCisjaWZuZGVmIE5PVENQT1BUUworI2lmbmRlZiBkYXRhZ2VuZXJhbAorI2lmZGVmIFNPTF9TT0NLRVQKKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgIG5vX2RlbGF5KHR0eWZkLHRjcF9ub2RlbGF5KTsKKyNlbmRpZiAvKiBUQ1BfTk9ERUxBWSAqLworI2lmZGVmIFNPX0tFRVBBTElWRQorICAgIGtlZXBhbGl2ZSh0dHlmZCx0Y3Bfa2VlcGFsaXZlKTsKKyNlbmRpZiAvKiBTT19LRUVQQUxJVkUgKi8KKyNpZmRlZiBTT19MSU5HRVIKKyAgICBja19saW5nZXIodHR5ZmQsdGNwX2xpbmdlciwgdGNwX2xpbmdlcl90bW8pOworI2VuZGlmIC8qIFNPX0xJTkdFUiAqLworI2lmZGVmIFNPX1NOREJVRgorICAgIHNlbmRidWYodHR5ZmQsdGNwX3NlbmRidWYpOworI2VuZGlmIC8qIFNPX1NOREJVRiAqLworI2lmZGVmIFNPX1JDVkJVRgorICAgIHJlY3ZidWYodHR5ZmQsdGNwX3JlY3ZidWYpOworI2VuZGlmIC8qIFNPX1JDVkJVRiAqLworI2VuZGlmIC8qIFNPTF9TT0NLRVQgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIE5PVENQT1BUUyAqLworCisjaWZuZGVmIGRhdGFnZW5lcmFsCisgICAgLyogRmluZCBvdXQgb3VyIG93biBJUCBhZGRyZXNzLiAqLworICAgIC8qIFdlIG5lZWQgdGhlIGxfYWRkciBzdHJ1Y3R1cmUgZm9yIFtFXUtMT0dJTi4gKi8KKyAgICBsX3NsZW4gPSBzaXplb2YobF9hZGRyKTsKKyAgICBiemVybygoY2hhciAqKSZsX2FkZHIsIGxfc2xlbik7CisjaWZuZGVmIEVYQ0VMQU4KKyAgICBpZiAoIWdldHNvY2tuYW1lKGh0dHBmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZsX2FkZHIsICZsX3NsZW4pKSB7CisgICAgICAgIGNoYXIgKiBzID0gKGNoYXIgKilpbmV0X250b2EobF9hZGRyLnNpbl9hZGRyKTsKKyAgICAgICAgY2tzdHJuY3B5KG15aXBhZGRyLCBzLCAyMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImdldHNvY2tuYW1lIixteWlwYWRkciwwKTsKKyAgICB9CisjZW5kaWYgLyogRVhDRUxBTiAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisKKy8qIFNlZSBub3RlIGluIG5ldG9wZW4oKSBvbiBSZXZlcnNlIEROUyBsb29rdXBzICovCisgICAgIGlmICh0Y3BfcmRucyA9PSBTRVRfT04pIHsKKyNpZmRlZiBOVAorICAgICAgICBpZiAoaXNXaW45NSgpKQorICAgICAgICAgIHNsZWVwKDEpOworI2VuZGlmIC8qIE5UICovCisgICAgICAgIGlmICghcXVpZXQpIHsKKyAgICAgICAgICAgIHByaW50ZigiIFJldmVyc2UgRE5TIExvb2t1cC4uLiAiKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICB9CisgICAgICAgIGlmIChob3N0ID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSZyX2FkZHIuc2luX2FkZHIsNCxQRl9JTkVUKSkgeworICAgICAgICAgICAgY2hhciAqIHM7CisgICAgICAgICAgICBob3N0ID0gY2tfY29weWhvc3RlbnQoaG9zdCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX29wZW4gZ2V0aG9zdGJ5bmFtZSAhPSBOVUxMIiwiIiwwKTsKKyAgICAgICAgICAgIGlmICghcXVpZXQpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIihPSylcbiIpOworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA9IGhvc3QtPmhfbmFtZTsKKyAgICAgICAgICAgIGlmICghcykgeyAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGNhbiBoYXBwZW4uLi4gKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX29wZW4gaG9zdC0+aF9uYW1lIGlzIE5VTEwiLCIiLDApOworICAgICAgICAgICAgICAgIHMgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIGluZXRfbnRvYSgpIG9uIEhQVVggMTAueHggKi8KKyAgICAgICAgICAgIC8qIFRoZSBjb21waWxlciBzYXlzICJJbnRlZ3JhbCB2YWx1ZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byAqLworICAgICAgICAgICAgLyogcG9pbnRlciBpbiBhc3NpZ25tZW50LiIgIFRoZSBwcm90b3R5cGUgaXMgcmlnaHQgdGhlcmUgKi8KKyAgICAgICAgICAgIC8qIGluIDxhcnBhL2luZXQuaD4gc28gd2hhdCdzIHRoZSBwcm9ibGVtPyAqLworICAgICAgICAgICAgLyogRGl0dG8gaW4gSFAtVVggNS54LCBidXQgbm90IDgueCBvciA5LnguLi4gKi8KKyAgICAgICAgICAgIGlmICghKnMpIHsgICAgICAgICAgICAgICAgICAvKiBObyBuYW1lIHNvIHN1YnN0aXR1dGUgdGhlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX29wZW4gaG9zdC0+aF9uYW1lIGlzIGVtcHR5IiwiIiwwKTsKKyAgICAgICAgICAgICAgICBzID0gaW5ldF9udG9hKHJfYWRkci5zaW5fYWRkcik7IC8qIENvbnZlcnQgYWRkcmVzcyB0byBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAoIXMpICAgICAgICAgICAgICAgICAvKiBUcnVzdCBObyAxICovCisgICAgICAgICAgICAgICAgICBzID0gIiI7CisgICAgICAgICAgICAgICAgaWYgKCpzKSB7ICAgICAgICAgICAgICAgLyogSWYgaXQgd29ya2VkLCB1c2UgdGhpcyBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGh0dHBfaXAscywyMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMgPSBodHRwX2lwOyAgICAgICAgICAgICAvKiBPdGhlcndpc2Ugc3RpY2sgd2l0aCB0aGUgSVAgKi8KKyAgICAgICAgICAgICAgICBpZiAoISpzKSAgICAgICAgICAgICAgICAgLyogb3IgZmFpbGluZyB0aGF0ICovCisgICAgICAgICAgICAgICAgICBzID0gaHR0cF9ob3N0X3BvcnQ7ICAgIC8qIHRoZSBuYW1lIHdlIHdlcmUgY2FsbGVkIHdpdGguICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnMpICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHRoZSByZG5zIG5hbWUgKi8KKyAgICAgICAgICAgICAgICBja21ha21zZyhyZG5zX25hbWUscmRuc19sZW4scywiOiIsc3ZjbmFtZSxOVUxMKTsKKworICAgICAgICAgICAgaWYgKCFxdWlldCAmJiAqcworI2lmbmRlZiBOT0lDUAorICAgICAgICAgICAgICAgICYmICFkb2NvbngKKyNlbmRpZiAvKiBOT0lDUCAqLworICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIHByaW50ZigiICVzIGNvbm5lY3RlZCBvbiBwb3J0ICVzXG4iLHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNrdWl0b2EobnRvaHMoc2VydmljZS0+c19wb3J0KSkpOworI2lmZGVmIEJFVEFERUJVRworICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgc2ltcGx5IGZvciB0ZXN0aW5nIHRoZSBETlMgZW50cmllcyAqLworICAgICAgICAgICAgICAgIGlmIChob3N0LT5oX2FsaWFzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqKiBhID0gaG9zdC0+aF9hbGlhc2VzOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIGFsaWFzID0+ICVzXG4iLCphKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGErKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBCRVRBREVCVUcgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghcXVpZXQpIHByaW50ZigiRmFpbGVkLlxuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFxdWlldCkgcHJpbnRmKCIoT0spXG4iKTsKKyAgICBpZiAoIXF1aWV0KSBmZmx1c2goc3Rkb3V0KTsKKworCisgICAgaWYgKCB0Y3BfaHR0cF9wcm94eSApIHsKKyAgICAgICAgLyogRXJhc2UgdGhlIElQIGFkZHJlc3Mgc2luY2Ugd2UgY2Fubm90IHJldXNlIGl0ICovCisgICAgICAgIGh0dHBfaXBbMF0gPSAnXDAnOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoaXMgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGRvbmUgYnV0IGp1c3QgaW4gY2FzZSAqLworICAgICAgICBja3N0cm5jcHkoaHR0cF9pcCwoY2hhciAqKWluZXRfbnRvYShyX2FkZHIuc2luX2FkZHIpLDIwKTsKKyAgICB9CisgICAgbWFrZXN0cigmaHR0cF9hZ2VudCxhZ2VudCk7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAodXNlX3NzbCAmJiBja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkpIHsKKyAgICAgICAgaWYgKCFzc2xfaHR0cF9pbml0KGhvc3RuYW1lKSkgeworICAgICAgICAgICAgaWYgKGJpb19lcnIhPU5VTEwpIHsKKyAgICAgICAgICAgICAgICBCSU9fcHJpbnRmKGJpb19lcnIsInNzbF90bl9pbml0KCkgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwic3NsX3RuX2luaXQoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0gZWxzZSBpZiAoIGNrX3NzbF9odHRwX2NsaWVudChodHRwZmQsaG9zdG5hbWUpIDwgMCApIHsKKyAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEb25lLiAqLworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworaHR0cF9jbG9zZShWT0lEKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2h0dHBfY2xvc2UoKQorI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaW50IHggPSAwOworICAgIGRlYnVnKEYxMDEsImh0dHBfY2xvc2UiLCIiLGh0dHBmZCk7CisKKyAgICBpZiAoaHR0cGZkID09IC0xKSAgICAgICAgICAgICAgICAgICAgLyogV2FzIG9wZW4/ICovCisgICAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogV2Fzbid0LiAqLworCisjaWZuZGVmIE9TMgorICAgIGlmIChodHRwZmQgPiAtMSkgICAgICAgICAgICAgICAgICAgICAvKiBXYXMuICovCisjZW5kaWYgLyogT1MyICovCisgICAgICB7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgaWYgKHRsc19odHRwX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgICAgICAgIGlmIChzc2xfZGVidWdfZmxhZykKKyAgICAgICAgICAgICAgICBCSU9fcHJpbnRmKGJpb19lcnIsImNhbGxpbmcgU1NMX3NodXRkb3duXG4iKTsKKyAgICAgICAgICAgICAgU1NMX3NodXRkb3duKHRsc19odHRwX2Nvbik7CisgICAgICAgICAgICAgIHRsc19odHRwX2FjdGl2ZV9mbGFnID0gMDsKKyAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgICB4ID0gc29ja2V0X2Nsb3NlKGh0dHBmZCk7ICAgICAgLyogQ2xvc2UgaXQuICovCisjZWxzZQorI2lmbmRlZiBPUzIKKyAgICAgICAgICB4ID0gY2xvc2UoaHR0cGZkKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgfQorICAgIGh0dHBmZCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFyayBpdCBhcyBjbG9zZWQuICovCisgICAgLyogZG8gbm90IGVyYXNlIGh0dHBfaG9zdF9wb3J0LCBodHRwX2lwLCBodHRwX3BvcnQgc28gdGhleSAqLworICAgIC8qIGNhbiBiZSB1c2VkIGJ5IGh0dHBfcmVvcGVuKCkgKi8KKyAgICByZXR1cm4oeCk7Cit9CisKKworLyogaHR0cF90b2woKQorICogQ2FsbCB3aXRoIHMgPSBwb2ludGVyIHRvIHN0cmluZywgbiA9IGxlbmd0aC4KKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gb24gc3VjY2Vzcywgb3IKKyAqIC0xIG9uIGkvbyBlcnJvciwgLTIgaWYgY2FsbGVkIGltcHJvcGVybHkuCisgKi8KKworaW50CitodHRwX3RvbChzLG4pIENIQVIgKnM7IGludCBuOyB7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBpbnQgbGVuID0gbjsKKyAgICBpbnQgdHJ5ID0gMDsKKworICAgIGlmIChodHRwZmQgPT0gLTEpIHsKKyAgICAgICAgZGVidWcoRjEwMCwiaHR0cF90b2wgc29ja2V0IGlzIGNsb3NlZCIsIiIsMCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZGVidWcoRjEwMSwiaHR0cF90b2wgVENQSVBMSUIgdHRuZXQiLCIiLHR0bmV0KTsKKyNpZmRlZiBDT01NRU5UCisgICAgaGV4ZHVtcCgiaHR0cF90b2wiLHMsbik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKHRsc19odHRwX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgIGludCBlcnJvciwgcjsKKyAgICAgICAgLyogV3JpdGUgdXNpbmcgU1NMICovCisgICAgICBzc2xfcmV0cnk6CisgICAgICAgICAgciA9IFNTTF93cml0ZSh0bHNfaHR0cF9jb24sIHMsIGxlbiAvKiA+MTAyND8xMDI0OmxlbiAqLyk7CisgICAgICAgIHN3aXRjaCAoU1NMX2dldF9lcnJvcih0bHNfaHR0cF9jb24scikpIHsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9OT05FOgorICAgICAgICAgICAgZGVidWcoRjExMSwiaHR0cF90b2wiLCJTU0xfd3JpdGUiLHIpOworICAgICAgICAgICAgaWYgKCByID09IGxlbiApCisgICAgICAgICAgICAgICAgcmV0dXJuKG4pOworICAgICAgICAgICAgIHMgKz0gcjsKKyAgICAgICAgICAgICBsZW4gLT0gcjsKKyAgICAgICAgICAgICBnb3RvIHNzbF9yZXRyeTsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgZGVidWcoRjEwMCwiaHR0cF90b2wgU1NMX0VSUk9SX1dBTlRfV1JJVEUiLCIiLDApOworCSAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICAgICAgZGVidWcoRjEwMCwiaHR0cF90b2wgU1NMX0VSUk9SX1dBTlRfUkVBRCIsIiIsMCk7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICAgIGlmICggciA9PSAwICkgeyAvKiBFT0YgKi8KKyAgICAgICAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBpbnQgcmMgPSAtMTsKKyNpZmRlZiBOVAorICAgICAgICAgICAgICAgICAgaW50IGdsZSA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiaHR0cF90b2wgU1NMX0VSUk9SX1NZU0NBTEwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRMYXN0RXJyb3IoKSIsZ2xlKTsKKyAgICAgICAgICAgICAgICAgIHJjID0gb3Myc29ja2V0ZXJyb3IoZ2xlKTsKKyAgICAgICAgICAgICAgICAgIGlmIChyYyA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICByYyA9IC0yOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHJjID09IC0yICkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICAgICAgICAgIHJldHVybihyYyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQOgorICAgICAgICAgICAgZGVidWcoRjEwMCwiaHR0cF90b2wgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVAiLCIiLDApOworICAgICAgICAgICAgaHR0cF9jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TU0w6CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX3RvbCBTU0xfRVJST1JfU1NMIiwiIiwwKTsKKyAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX3RvbCBTU0xfRVJST1JfWkVST19SRVRVUk4iLCIiLDApOworICAgICAgICAgICAgaHR0cF9jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZGVidWcoRjEwMCwiaHR0cF90b2wgU1NMX0VSUk9SXz8/Pz8/IiwiIiwwKTsKKyAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgaHR0cF90b2xfcmV0cnk6CisgICAgdHJ5Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVhc2UgdGhlIHRyeSBjb3VudGVyICovCisKKyAgICB7CisjaWZkZWYgQlNEU0VMRUNUCisgICAgICAgIGZkX3NldCB3ZmRzOworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKworICAgICAgICBkZWJ1ZyhGMTAxLCJodHRwX3RvbCBCU0RTRUxFQ1QiLCIiLDApOworICAgICAgICB0di50dl91c2VjID0gMEw7CisgICAgICAgIHR2LnR2X3NlYz0zMDsKKyNpZmRlZiBOVAorICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAxOworI2VuZGlmIC8qIE5UICovCisjaWZkZWYgU1RSRUFNSU5HCisgICAgICBkb19zZWxlY3Q6CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisgICAgICAgIEZEX1pFUk8oJndmZHMpOworICAgICAgICBGRF9TRVQoaHR0cGZkLCAmd2Zkcyk7CisgICAgICAgIGlmIChzZWxlY3QoRkRfU0VUU0laRSwgTlVMTCwKKyNpZmRlZiBfX0RFQ0MKKyNpZm5kZWYgX19ERUNDX1ZFUgorICAgICAgICAgICAgICAgICAgICAoaW50ICopCisjZW5kaWYgLyogX19ERUNDX1ZFUiAqLworI2VuZGlmIC8qIF9fREVDQyAqLworICAgICAgICAgICAgICAgICAgICZ3ZmRzLCBOVUxMLCAmdHYpIDwgMCkgeworICAgICAgICAgICAgaW50IHNfZXJybm8gPSBzb2NrZXRfZXJybm87CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJodHRwX3RvbCBzZWxlY3QgZmFpbGVkIiwiIixzX2Vycm5vKTsKKyNpZmRlZiBCRVRBREVCVUcKKyAgICAgICAgICAgIHByaW50ZigiaHR0cF90b2wgc2VsZWN0IGZhaWxlZDogJWRcbiIsIHNfZXJybm8pOworI2VuZGlmIC8qIEJFVEFERUJVRyAqLworI2lmZGVmIE5UCisgICAgICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAwOworICAgICAgICAgICAgaWYgKCF3aW45NXNlbGVjdGJ1ZykKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgICAgIGlmICghRkRfSVNTRVQoaHR0cGZkLCAmd2ZkcykpIHsKKyNpZmRlZiBTVFJFQU1JTkcKKyAgICAgICAgICAgIGlmIChzdHJlYW1pbmcpCisgICAgICAgICAgICAgIGdvdG8gZG9fc2VsZWN0OworI2VuZGlmIC8qIFNUUkVBTUlORyAqLworICAgICAgICAgICAgZGVidWcoRjExMSwiaHR0cF90b2wiLCIhRkRfSVNTRVQiLHR0eWZkKTsKKyNpZmRlZiBOVAorICAgICAgICAgICAgV1NBU2FmZVRvQ2FuY2VsID0gMDsKKyAgICAgICAgICAgIGlmICghd2luOTVzZWxlY3RidWcpCisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorI2lmZGVmIE5UCisgICAgICAgIFdTQVNhZmVUb0NhbmNlbCA9IDA7CisjZW5kaWYgLyogTlQgKi8KKyNlbHNlIC8qIEJTRFNFTEVDVCAqLworI2lmZGVmIElCTVNFTEVDVAorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdHJpZXMgPSAwOworICAgICAgICAgICAgZGVidWcoRjEwMSwiaHR0cF90b2wgSUJNU0VMRUNUIiwiIiwwKTsKKyAgICAgICAgICAgIHdoaWxlIChzZWxlY3QoJmh0dHBmZCwgMCwgMSwgMCwgMTAwMCkgIT0gMSkgeworICAgICAgICAgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgICAgICAgICBpZiAodHJpZXMrKyA+PSA2MCkgeworICAgICAgICAgICAgICAgICAgICAvKiBpZiBhZnRlciA2MCBzZWNvbmRzIHdlIGNhbid0IGdldCBwZXJtaXNzaW9uIHRvIHdyaXRlICovCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImh0dHBfdG9sIHNlbGVjdCBmYWlsZWQiLCIiLHNvY2tldF9lcnJubyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgICAgICBpZiAoKGNvdW50ID0gaHR0cF90Y2hrKCkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJodHRwX3RvbCIsImh0dHBfdGNoaygpIixjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihjb3VudCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIElCTVNFTEVDVCAqLworI2VuZGlmIC8qIEJTRFNFTEVDVCAqLworI2lmZGVmIFRDUElQTElCCisgICAgICAgIGlmICgoY291bnQgPSBzb2NrZXRfd3JpdGUoaHR0cGZkLHMsbikpIDwgMCkgeworICAgICAgICAgICAgaW50IHNfZXJybm8gPSBzb2NrZXRfZXJybm87IC8qIG1heWJlIGEgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImh0dHBfdG9sIHNvY2tldF93cml0ZSBlcnJvciIsIiIsc19lcnJubyk7CisjaWZkZWYgT1MyCisgICAgICAgICAgICBpZiAob3Myc29ja2V0ZXJyb3Ioc19lcnJubykgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oLTIpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgcmV0dXJuKC0xKTsgICAgICAgICAgICAgICAgIC8qIENhbGwgaXQgYW4gaS9vIGVycm9yICovCisgICAgICAgIH0KKyNlbHNlIC8qIFRDUElQTElCICovCisgICAgICAgIGlmICgoY291bnQgPSB3cml0ZShodHRwZmQscyxuKSkgPCAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJodHRwX3RvbCBzb2NrZXRfd3JpdGUgZXJyb3IiLCIiLGVycm5vKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7ICAgICAgICAgICAgICAgICAvKiBDYWxsIGl0IGFuIGkvbyBlcnJvciAqLworICAgICAgICB9CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgaWYgKGNvdW50IDwgbikgeworICAgICAgICAgICAgZGVidWcoRjExMSwiaHR0cF90b2wgc29ja2V0X3dyaXRlIixzLGNvdW50KTsKKyAgICAgICAgICAgIGlmICh0cnkgPiAyNSkgeworICAgICAgICAgICAgICAgIC8qIGRvbid0IHRyeSBtb3JlIHRoYW4gMjUgdGltZXMgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX3RvbCB0cmllZCBtb3JlIHRoYW4gMjUgdGltZXMiLCIiLDApOworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgcyArPSBjb3VudDsKKyAgICAgICAgICAgICAgICBuIC09IGNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjExMSwiaHR0cF90b2wgcmV0cnkiLHMsbik7CisgICAgICAgICAgICBnb3RvIGh0dHBfdG9sX3JldHJ5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWcoRjExMSwiaHR0cF90b2wgc29ja2V0X3dyaXRlIixzLGNvdW50KTsKKyAgICAgICAgICAgIHJldHVybihsZW4pOyAvKiBzdWNjZXNzIC0gcmV0dXJuIHRvdGFsIGxlbmd0aCAqLworICAgICAgICB9CisgICAgfQorfQorCisKK2ludAoraHR0cF9pbmModGltbykgaW50IHRpbW87IHsKKyAgICBpbnQgeD0tMTsgdW5zaWduZWQgY2hhciBjOyAgICAgICAgICAgICAvKiBUaGUgbG9jYWxzLiAqLworCisgICAgaWYgKGh0dHBmZCA9PSAtMSkgeworICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX2luYyBzb2NrZXQgaXMgY2xvc2VkIiwiIiwwKTsKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9CisKKyNpZmRlZiBDS19TU0wKKyAgICAvKgorICAgICAqIEluIHRoZSBjYXNlIG9mIE9wZW5TU0wsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlcmUgaXMgc3RpbGwKKyAgICAgKiBkYXRhIHdhaXRpbmcgaW4gdGhlIFNTTCBzZXNzaW9uIGJ1ZmZlcnMgdGhhdCBoYXMgbm90IHlldAorICAgICAqIGJlZW4gcmVhZCBieSBLZXJtaXQuICBJZiB0aGlzIGlzIHRoZSBjYXNlIHdlIG11c3QgcHJvY2VzcworICAgICAqIGl0IHdpdGhvdXQgY2FsbGluZyBzZWxlY3QoKSBiZWNhdXNlIHNlbGVjdCgpIHdpbGwgbm90IHJldHVybgorICAgICAqIHdpdGggYW4gaW5kaWNhdGlvbiB0aGF0IHRoZXJlIGlzIGRhdGEgdG8gYmUgcmVhZCBmcm9tIHRoZQorICAgICAqIHNvY2tldC4gIElmIHRoZXJlIGlzIG5vIGRhdGEgcGVuZGluZyBpbiB0aGUgU1NMIHNlc3Npb24KKyAgICAgKiBidWZmZXJzIHRoZW4gZmFsbCB0aHJvdWdoIHRvIHRoZSBzZWxlY3QoKSBjb2RlIGFuZCB3YWl0IGZvcgorICAgICAqIHNvbWUgZGF0YSB0byBhcnJpdmUuCisgICAgICovCisgICAgaWYgKHRsc19odHRwX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgIGludCBlcnJvcjsKKworICAgICAgICB4ID0gU1NMX3BlbmRpbmcodGxzX2h0dHBfY29uKTsKKyAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJodHRwX2luYyIsIlNTTF9wZW5kaW5nIGVycm9yIix4KTsKKyAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0gZWxzZSBpZiAoIHggPiAwICkgeworCSAgc3NsX3JlYWQ6CisgICAgICAgICAgICB4ID0gU1NMX3JlYWQodGxzX2h0dHBfY29uLCAmYywgMSk7CisgICAgICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3IodGxzX2h0dHBfY29uLHgpOworICAgICAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfTk9ORToKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJodHRwX2luYyBTU0xfRVJST1JfTk9ORSIsIngiLHgpOworICAgICAgICAgICAgICAgIGlmICh4ID4gMCkgeworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4oYyk7ICAgICAgICAgIC8qIFJldHVybiBjaGFyYWN0ZXIuICovCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4IDwgMCkgeworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsImh0dHBfaW5jIFNTTF9FUlJPUl9XQU5UX1dSSVRFIiwiIiwwKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiaHR0cF9pbmMgU1NMX0VSUk9SX1dBTlRfUkVBRCIsIiIsMCk7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICAgICAgICBpZiAoIHggPT0gMCApIHsgLyogRU9GICovCisgICAgICAgICAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmMgPSAtMTsKKyNpZmRlZiBOVAorICAgICAgICAgICAgICAgICAgICBpbnQgZ2xlID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImh0dHBfaW5jIFNTTF9FUlJPUl9TWVNDQUxMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRMYXN0RXJyb3IoKSIsZ2xlKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBvczJzb2NrZXRlcnJvcihnbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IC0yOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcmMgPT0gLTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4ocmMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiaHR0cF9pbmMgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVAiLCIiLDApOworICAgICAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TU0w6CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiaHR0cF9pbmMgU1NMX0VSUk9SX1NTTCIsIiIsMCk7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiaHR0cF9pbmMgU1NMX0VSUk9SX1pFUk9fUkVUVVJOIiwiIiwwKTsKKyAgICAgICAgICAgICAgICBodHRwX2Nsb3NlKCk7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgUmVsZWFzZVRDUElQTXV0ZXgoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX2luYyBTU0xfRVJST1JfPz8/Pz8iLCIiLDApOworICAgICAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgeworI2lmZGVmIEJTRFNFTEVDVAorICAgICAgICBmZF9zZXQgcmZkczsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgICAgIGludCB0aW1lb3V0ID0gdGltbyA8IDAgPyAtdGltbyA6IDEwMDAgKiB0aW1vOworICAgICAgICBkZWJ1ZyhGMTAxLCJodHRwX2luYyBCU0RTRUxFQ1QiLCIiLHRpbW8pOworCisgICAgICAgIGZvciAoIDsgdGltZW91dCA+PSAwOyB0aW1lb3V0IC09ICh0aW1vID8gMTAwIDogMCkpIHsKKyAgICAgICAgICAgIGludCByYzsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImh0dHBfaW5jIiwidGltZW91dCIsdGltZW91dCk7CisgICAgICAgICAgICAvKiBEb24ndCBtb3ZlIHNlbGVjdCgpIGluaXRpYWxpemF0aW9uIG91dCBvZiB0aGUgbG9vcC4gKi8KKyAgICAgICAgICAgIEZEX1pFUk8oJnJmZHMpOworICAgICAgICAgICAgRkRfU0VUKGh0dHBmZCwgJnJmZHMpOworICAgICAgICAgICAgdHYudHZfc2VjICA9IHR2LnR2X3VzZWMgPSAwTDsKKyAgICAgICAgICAgIGlmICh0aW1vKQorICAgICAgICAgICAgICAgIHR2LnR2X3VzZWMgPSAobG9uZykgMTAwMDAwTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0di50dl9zZWMgPSAzMDsKKyNpZmRlZiBOVAorICAgICAgICAgICAgV1NBU2FmZVRvQ2FuY2VsID0gMTsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgcmMgPSBzZWxlY3QoRkRfU0VUU0laRSwKKyNpZm5kZWYgX19ERUNDCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZkX3NldCAqKQorI2VuZGlmIC8qIF9fREVDQyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpOworICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgIGludCBzX2Vycm5vID0gc29ja2V0X2Vycm5vOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImh0dHBfaW5jIiwic2VsZWN0IixyYyk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiaHR0cF9pbmMiLCJzb2NrZXRfZXJybm8iLHNfZXJybm8pOworICAgICAgICAgICAgICAgIGlmIChzX2Vycm5vKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjExMSwiaHR0cF9pbmMiLCJzZWxlY3QiLHJjKTsKKyNpZmRlZiBOVAorICAgICAgICAgICAgV1NBU2FmZVRvQ2FuY2VsID0gMDsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgaWYgKEZEX0lTU0VUKGh0dHBmZCwgJnJmZHMpKSB7CisgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIElmIHdhaXRpbmcgZm9yZXZlciB3ZSBoYXZlIG5vIHdheSBvZiBrbm93aW5nIGlmIHRoZSAqLworICAgICAgICAgICAgICAgIC8qIHNvY2tldCBjbG9zZWQgc28gdHJ5IHdyaXRpbmcgYSAwLWxlbmd0aCBUQ1AgcGFja2V0ICAqLworICAgICAgICAgICAgICAgIC8qIHdoaWNoIHNob3VsZCBmb3JjZSBhbiBlcnJvciBpZiB0aGUgc29ja2V0IGlzIGNsb3NlZCAqLworICAgICAgICAgICAgICAgIGlmICghdGltbykgeworI2lmZGVmIFRDUElQTElCCisgICAgICAgICAgICAgICAgICAgIGlmICgocmMgPSBzb2NrZXRfd3JpdGUoaHR0cGZkLCIiLDApKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzX2Vycm5vID0gc29ja2V0X2Vycm5vOworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiaHR0cF9pbmMgc29ja2V0X3dyaXRlIGVycm9yIiwiIixzX2Vycm5vKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvczJzb2NrZXRlcnJvcihzX2Vycm5vKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7IC8qIENhbGwgaXQgYW4gaS9vIGVycm9yICovCisgICAgICAgICAgICAgICAgICAgIH0KKyNlbHNlIC8qIFRDUElQTElCICovCisgICAgICAgICAgICAgICAgICAgIGlmICgocmMgPSB3cml0ZShodHRwZmQsIiIsMCkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiaHR0cF9pbmMgc29ja2V0X3dyaXRlIGVycm9yIiwiIixlcnJubyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOyAvKiBDYWxsIGl0IGFuIGkvbyBlcnJvciAqLworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZmRlZiBOVAorICAgICAgICBXU0FTYWZlVG9DYW5jZWwgPSAwOworI2VuZGlmIC8qIE5UICovCisjZWxzZSAvKiAhQlNEU0VMRUNUICovCisjaWZkZWYgSUJNU0VMRUNUCisgLyoKKyAgV2FzIHVzZWQgYnkgT1MvMiwgY3VycmVudGx5IG5vdCB1c2VkLCBidXQgbWlnaHQgY29tZSBpbiBoYW5keSBzb21lIGRheS4uLgorICAuLi4gYW5kIGl0IGNhbWUgaW4gaGFuZHkhICBGb3Igb3VyIFRDUC9JUCBsYXllciwgaXQgYXZvaWRzIGFsbCB0aGUgZmRfc2V0CisgIGFuZCB0aW1ldmFsIHN0dWZmIHNpbmNlIHRoaXMgaXMgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgaXQgaXMgdXNlZC4KKyAqLworICAgICAgICBpbnQgc29ja2V0ID0gaHR0cGZkOworICAgICAgICBpbnQgdGltZW91dCA9IHRpbW8gPCAwID8gLXRpbW8gOiAxMDAwICogdGltbzsKKworICAgICAgICBkZWJ1ZyhGMTAxLCJodHRwX2luYyBJQk1TRUxFQ1QiLCIiLHRpbW8pOworICAgICAgICBmb3IgKCA7IHRpbWVvdXQgPj0gMDsgdGltZW91dCAtPSAodGltbyA/IDEwMCA6IDApKSB7CisgICAgICAgICAgICBpZiAoc2VsZWN0KCZzb2NrZXQsIDEsIDAsIDAsIDEwMEwpID09IDEpIHsKKyAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2Vsc2UgLyogIUlCTVNFTEVDVCAqLworICAgICAgICBTRUxFQ1QgaXMgcmVxdWlyZWQgZm9yIHRoaXMgY29kZQorI2VuZGlmIC8qIElCTVNFTEVDVCAqLworI2VuZGlmIC8qIEJTRFNFTEVDVCAqLworICAgIH0KKworICAgIGlmICh0aW1vICYmIHggPCAwKSB7ICAgICAgICAvKiBzZWxlY3QoKSB0aW1lZCBvdXQgKi8KKyAgICAgICAgZGVidWcoRjEwMCwiaHR0cF9pbmMgc2VsZWN0KCkgdGltZWQgb3V0IiwiIiwwKTsKKyAgICAgICAgcmV0dXJuKC0xKTsgLyogQ2FsbCBpdCBhbiBpL28gZXJyb3IgKi8KKyAgICB9CisKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgaWYgKCB0bHNfaHR0cF9hY3RpdmVfZmxhZyApIHsKKyAgICAgICAgICAgIGludCBlcnJvcjsKKwkgIHNzbF9yZWFkMjoKKyAgICAgICAgICAgIHggPSBTU0xfcmVhZCh0bHNfaHR0cF9jb24sICZjLCAxKTsKKyAgICAgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcih0bHNfaHR0cF9jb24seCk7CisgICAgICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9OT05FOgorICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImh0dHBfaW5jIFNTTF9FUlJPUl9OT05FIiwieCIseCk7CisgICAgICAgICAgICAgICAgaWYgKHggPiAwKSB7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybihjKTsgICAgICAgICAgLyogUmV0dXJuIGNoYXJhY3Rlci4gKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPCAwKSB7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaHR0cF9jbG9zZSgpOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiaHR0cF9pbmMgU1NMX0VSUk9SX1dBTlRfV1JJVEUiLCIiLDApOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX2luYyBTU0xfRVJST1JfV0FOVF9SRUFEIiwiIiwwKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgICAgIGlmICggeCA9PSAwICkgeyAvKiBFT0YgKi8KKyAgICAgICAgICAgICAgICAgICAgaHR0cF9jbG9zZSgpOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCByYyA9IC0xOworI2lmZGVmIE5UCisgICAgICAgICAgICAgICAgICAgIGludCBnbGUgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiaHR0cF9pbmMgU1NMX0VSUk9SX1NZU0NBTEwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldExhc3RFcnJvcigpIixnbGUpOworICAgICAgICAgICAgICAgICAgICByYyA9IG9zMnNvY2tldGVycm9yKGdsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYyA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gLTI7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCByYyA9PSAtMiApCisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IC0xOworI2VuZGlmIC8qIE5UICovCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybihyYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUDoKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX2luYyBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUCIsIiIsMCk7CisgICAgICAgICAgICAgICAgaHR0cF9jbG9zZSgpOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NTTDoKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX2luYyBTU0xfRVJST1JfU1NMIiwiIiwwKTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgaHR0cF9jbG9zZSgpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJodHRwX2luYyBTU0xfRVJST1JfWkVST19SRVRVUk4iLCIiLDApOworICAgICAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICBSZWxlYXNlVENQSVBNdXRleCgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsImh0dHBfaW5jIFNTTF9FUlJPUl8/Pz8/PyIsIiIsMCk7CisgICAgICAgICAgICAgICAgaHR0cF9jbG9zZSgpOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIFRDUElQTElCCisgICAgICAgIHggPSBzb2NrZXRfcmVhZChodHRwZmQsJmMsMSk7CisjZWxzZQorICAgICAgICB4ID0gcmVhZChodHRwZmQsJmMsMSk7CisjZW5kaWYKKworICAgICAgICBpZiAoeCA8PSAwKSB7CisgICAgICAgICAgICBpbnQgc19lcnJubyA9IHNvY2tldF9lcnJubzsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInR0YnVmciBzb2NrZXRfcmVhZCIsIiIseCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ0dGJ1ZnIgc29ja2V0X2Vycm5vIiwiIixzX2Vycm5vKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGlmICh4ID09IDAgfHwgb3Myc29ja2V0ZXJyb3Ioc19lcnJubykgPCAwKSB7CisgICAgICAgICAgICAgICAgaHR0cF9jbG9zZSgpOworICAgICAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlbGVhc2VUQ1BJUE11dGV4KCk7CisgICAgICAgICAgICByZXR1cm4oLTEpOworI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgICBodHRwX2Nsb3NlKCk7ICAgICAgICAgICAgICAgICAgICAgIC8qICoqKiAqKiogKi8KKyAgICAgICAgICAgIHJldHVybigtMik7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKGMpOworfQorCit2b2lkCisjaWZkZWYgQ0tfQU5TSUMKK2h0dHBfc2V0X2NvZGVfcmVwbHkoY2hhciAqIG1zZykKKyNlbHNlCitodHRwX3NldF9jb2RlX3JlcGx5KG1zZykKKyAgICBjaGFyICogbXNnOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgY2hhciAqIHAgPSBtc2c7CisgICAgY2hhciBidWZbMTZdOworICAgIGludCBpPTA7CisKKyAgICB3aGlsZSAoICpwICE9IFNQICYmICpwICE9IE5VTCApIHsKKyAgICAgICAgYnVmW2ldID0gKnA7CisgICAgICAgIHArKzsKKyAgICAgICAgaSsrOworICAgIH0KKworICAgIGh0dHBfY29kZSA9IGF0b2koYnVmKTsKKworICAgIHdoaWxlICggKnAgPT0gU1AgKQorICAgICAgICBwKys7CisKKyAgICBja3N0cm5jcHkoaHR0cF9yZXBseV9zdHIscCxIVFRQQlVGTEVOKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2h0dHBfZ2V0KGNoYXIgKiBhZ2VudCwgY2hhciAqKiBoZHJsaXN0LCBjaGFyICogdXNlciwKKyAgICAgICAgIGNoYXIgKiBwd2QsIGNoYXIgYXJyYXksIGNoYXIgKiBsb2NhbCwgY2hhciAqIHJlbW90ZSwKKyAgICAgICAgIGludCBzdGRpbykKKyNlbHNlCitodHRwX2dldChhZ2VudCwgaGRybGlzdCwgdXNlciwgcHdkLCBhcnJheSwgbG9jYWwsIHJlbW90ZSwgc3RkaW8pCisgICAgY2hhciAqIGFnZW50OyBjaGFyICoqIGhkcmxpc3Q7IGNoYXIgKiB1c2VyOworICAgIGNoYXIgKiBwd2Q7IGNoYXIgYXJyYXk7IGNoYXIgKiBsb2NhbDsgY2hhciAqIHJlbW90ZTsKKyAgICBpbnQgc3RkaW87CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBjaGFyICogcmVxdWVzdCA9IE5VTEw7CisgICAgaW50ICAgIGksIGosIGxlbiA9IDAsIGhkY250ID0gMCwgcmMgPSAwOworICAgIGludCAgICBjaDsKKyAgICBpbnQgICAgaHR0cF9mbmQgPSAwOworICAgIGNoYXIgICBidWZbSFRUUEJVRkxFTl0sICpwOworICAgIGludCAgICBudWxsbGluZTsKKyNpZmRlZiBPUzIKKyAgICBzdHJ1Y3QgdXRpbWJ1ZiB1X3Q7CisjZWxzZSAvKiBPUzIgKi8KKyNpZmRlZiBTWVNVVElNRUgKKyAgICBzdHJ1Y3QgdXRpbWJ1ZiB1X3Q7CisjZWxzZQorICAgIHN0cnVjdCB1dGltYnVmIHsKKyAgICAgICAgdGltZV90IGF0aW1lOworICAgICAgICB0aW1lX3QgbXRpbWU7CisgICAgfSB1X3Q7CisjZW5kaWYgLyogU1lTVVRJTUggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB0aW1lX3QgbW9kX3QgPSAwOworICAgIHRpbWVfdCBzcnZfdCA9IDA7CisgICAgdGltZV90IGxvY2FsX3QgPSAwOworICAgIGNoYXIgcGFzc3dkWzY0XTsKKyAgICBjaGFyIGI2NGluWzEyOF07CisgICAgY2hhciBiNjRvdXRbMjU2XTsKKyAgICBjaGFyICogaGVhZGVyc1tIVFRQSEVBRENOVF07CisgICAgaW50IGNsb3NlY29uID0gMDsKKyAgICBpbnQgY2h1bmtlZCA9IDA7CisgICAgaW50IHpmaWxlID0gMDsKKyAgICBpbnQgZmlyc3QgPSAxOworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImh0dHBfZ2V0IGh0dHBmZCIsIiIsaHR0cGZkKTsKKyAgICAgICAgZGVidWcoRjExMCwiaHR0cF9hZ2VudCIsYWdlbnQsMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImh0dHBfdXNlciIsdXNlciwwKTsKKyAgICAgICAgZGVidWcoRjExMCwiaHR0cF9sb2NhbCIsbG9jYWwsMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImh0dHBfcmVtb3RlIixyZW1vdGUsMCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgaWYgKCFyZW1vdGUpIHJlbW90ZSA9ICIiOworCisgICAgaWYgKGh0dHBmZCA9PSAtMSkKKyAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAoYXJyYXkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEhUVFBIRUFEQ05UOyBpKyspCisgICAgICAgICAgaGVhZGVyc1tpXSA9IE5VTEw7CisgICAgfQorICAgIGxlbiA9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdFVCAqLworICAgIGxlbiArPSBzdHJsZW4oSFRUUF9WRVJTSU9OKTsKKyAgICBsZW4gKz0gc3RybGVuKHJlbW90ZSk7CisgICAgbGVuICs9IDE2OworCisgICAgaWYgKGhkcmxpc3QpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaGRybGlzdFtpXTsgaSsrKQorICAgICAgICAgICAgbGVuICs9IHN0cmxlbihoZHJsaXN0W2ldKSArIDI7CisgICAgfQorICAgIGxlbiArPSAoaW50KSBzdHJsZW4oaHR0cF9ob3N0X3BvcnQpICsgODsKKworICAgIGlmIChhZ2VudCkKKyAgICAgIGxlbiArPSAxMyArIHN0cmxlbihhZ2VudCk7CisgICAgaWYgKHVzZXIpIHsKKyAgICAgICAgaWYgKCFwd2QpIHsKKyAgICAgICAgICAgIHJlYWRwYXNzKCJQYXNzd29yZDogIixwYXNzd2QsNjQpOworICAgICAgICAgICAgcHdkID0gcGFzc3dkOworICAgICAgICB9CisgICAgICAgIGNrbWFrbXNnKGI2NGluLHNpemVvZihiNjRpbiksdXNlciwiOiIscHdkLE5VTEwpOworICAgICAgICBqID0gYjh0b2I2NChiNjRpbixzdHJsZW4oYjY0aW4pLGI2NG91dCwyNTYpOworICAgICAgICBtZW1zZXQocHdkLDAsc3RybGVuKHB3ZCkpOyAgICAgIC8qIE5PVCBQT1JUQUJMRSAqLworICAgICAgICBpZiAoaiA8IDApCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgYjY0b3V0W2pdID0gJ1wwJzsKKyAgICAgICAgbGVuICs9IGogKyAyNDsKKyAgICB9CisjaWZkZWYgSFRUUF9DTE9TRQorICAgIGxlbiArPSAxOTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbm5lY3Rpb246IGNsb3NlICovCisjZW5kaWYKKyAgICBsZW4gKz0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBibGFuayBsaW5lICsgbnVsbCAqLworCisgICAgcmVxdWVzdCA9IG1hbGxvYyhsZW4pOworICAgIGlmICghcmVxdWVzdCkKKyAgICAgIHJldHVybigtMSk7CisKKyAgICBzcHJpbnRmKHJlcXVlc3QsIkdFVCAlcyAlc1xyXG4iLHJlbW90ZSxIVFRQX1ZFUlNJT04pOyAgICAgICAvKiBzYWZlICovCisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIkhvc3Q6ICIsIGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsaHR0cF9ob3N0X3BvcnQsIGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgaWYgKGFnZW50KSB7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LCJVc2VyLWFnZW50OiAiLGxlbik7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LGFnZW50LGxlbik7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICAgIH0KKyAgICBpZiAodXNlcikgeworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiQXV0aG9yaXphdGlvbjogQmFzaWMgIixsZW4pOworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxiNjRvdXQsbGVuKTsKKyAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgfQorICAgIGlmICggaGRybGlzdCApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaGRybGlzdFtpXTsgaSsrKSB7CisgICAgICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxoZHJsaXN0W2ldLGxlbik7CisgICAgICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiXHJcbiIsbGVuKTsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBIVFRQX0NMT1NFCisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIkNvbm5lY3Rpb246IGNsb3NlXHJcbiIsbGVuKTsKKyNlbmRpZgorICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworCisgIGdldHJlcToKKyAgICBpZiAoaHR0cF90b2woKENIQVIgKilyZXF1ZXN0LHN0cmxlbihyZXF1ZXN0KSkgPCAwKQorICAgIHsKKyAgICAgICAgaHR0cF9jbG9zZSgpOworICAgICAgICBpZiAoIGZpcnN0ICkgeworICAgICAgICAgICAgZmlyc3QtLTsKKyAgICAgICAgICAgIGh0dHBfcmVvcGVuKCk7CisgICAgICAgICAgICBnb3RvIGdldHJlcTsKKyAgICAgICAgfQorICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIGdldGV4aXQ7CisgICAgfQorCisgICAgLyogUHJvY2VzcyB0aGUgaGVhZGVycyAqLworICAgIGxvY2FsX3QgPSB0aW1lKE5VTEwpOworICAgIG51bGxsaW5lID0gMDsKKyAgICBpID0gMDsKKyAgICBsZW4gPSAtMTsKKyAgICB3aGlsZSAoIW51bGxsaW5lICYmIChjaCA9IGh0dHBfaW5jKDApKSA+PSAwICYmIGkgPCBIVFRQQlVGTEVOKSB7CisgICAgICAgIGJ1ZltpXSA9IGNoOworICAgICAgICBpZiAoIGJ1ZltpXSA9PSAxMCApIHsgLyogZm91bmQgZW5kIG9mIGxpbmUgKi8KKyAgICAgICAgICAgIGlmIChpID4gMCAmJiBidWZbaS0xXSA9PSAxMykKKyAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgaWYgKGkgPCAxKQorICAgICAgICAgICAgICBudWxsbGluZSA9IDE7CisgICAgICAgICAgICBidWZbaV0gPSAnXDAnOworICAgICAgICAgICAgaWYgKGFycmF5ICYmICFudWxsbGluZSAmJiBoZGNudCA8IEhUVFBIRUFEQ05UKQorICAgICAgICAgICAgICBtYWtlc3RyKCZoZWFkZXJzW2hkY250KytdLGJ1Zik7CisgICAgICAgICAgICBpZiAoIWNrc3RyY21wKGJ1ZiwiSFRUUCIsNCwwKSkgeworICAgICAgICAgICAgICAgIGh0dHBfZm5kID0gMTsKKyAgICAgICAgICAgICAgICBqID0gY2tpbmRleCgiICIsYnVmLDAsMCwwKTsKKyAgICAgICAgICAgICAgICBwID0gJmJ1ZltqXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIGlzc3BhY2UoKnApICkKKyAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBwWzBdICkgeworICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6ICAgICAgICAgICAgIC8qIEluZm9ybWF0aW9uYWwgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgJzInOiAgICAgICAgICAgICAvKiBTdWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAnMyc6ICAgICAgICAgICAgIC8qIFJlZGlyZWN0aW9uICovCisgICAgICAgICAgICAgICAgICBjYXNlICc0JzogICAgICAgICAgICAgLyogQ2xpZW50IGZhaWx1cmUgKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgJzUnOiAgICAgICAgICAgICAvKiBTZXJ2ZXIgZmFpbHVyZSAqLworICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgIC8qIFVua25vd24gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFxdWlldCkKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkZhaWx1cmU6IFNlcnZlciByZXBvcnRzICVzXG4iLHApOworICAgICAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgICAgICBsb2NhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGh0dHBfc2V0X2NvZGVfcmVwbHkocCk7CisjaWZkZWYgQ01EQVRFMlRNCisgICAgICAgICAgICB9IGVsc2UgaWYgKCFja3N0cmNtcChidWYsIkxhc3QtTW9kaWZpZWQiLDEzLDApKSB7CisgICAgICAgICAgICAgICAgbW9kX3QgPSBodHRwX2RhdGUoJmJ1ZlsxNV0pOworICAgICAgICAgICAgfSBlbHNlIGlmICghY2tzdHJjbXAoYnVmLCJEYXRlIiw0LDApKSB7CisgICAgICAgICAgICAgICAgc3J2X3QgPSBodHRwX2RhdGUoJmJ1Zls0XSk7CisjZW5kaWYgLyogQ01EQVRFMlRNICovCisgICAgICAgICAgICB9IGVsc2UgaWYgKCFja3N0cmNtcChidWYsIkNvbm5lY3Rpb246IiwxMSwwKSkgeworICAgICAgICAgICAgICAgIGlmICggY2tpbmRleCgiY2xvc2UiLGJ1ZiwxMSwwLDApICE9IDAgKQorICAgICAgICAgICAgICAgICAgICBjbG9zZWNvbiA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFja3N0cmNtcChidWYsIkNvbnRlbnQtTGVuZ3RoOiIsMTUsMCkpIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBhdG9pKCZidWZbMTZdKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNrc3RyY21wKGJ1ZiwiVHJhbnNmZXItRW5jb2Rpbmc6IiwxOCwwKSkgeworICAgICAgICAgICAgICAgIGlmICggY2tpbmRleCgiY2h1bmtlZCIsYnVmLDE4LDAsMCkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgIGNodW5rZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNoIDwgMCAmJiBmaXJzdCkgeworICAgICAgICBmaXJzdC0tOworICAgICAgICBodHRwX2Nsb3NlKCk7CisgICAgICAgIGh0dHBfcmVvcGVuKCk7CisgICAgICAgIGdvdG8gZ2V0cmVxOworICAgIH0KKyAgICBpZiAoaHR0cF9mbmQgPT0gMCkgeworICAgICAgICByYyA9IC0xOworICAgICAgICBjbG9zZWNvbiA9IDE7CisgICAgICAgIGdvdG8gZ2V0ZXhpdDsKKyAgICB9CisKKyAgICAvKiBOb3cgd2UgaGF2ZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgKi8KKyAgICBpZiAoIGxvY2FsICYmIGxvY2FsWzBdICkgeworICAgICAgICBpZiAoem9wZW5vKFpPRklMRSxsb2NhbCxOVUxMLE5VTEwpKQorICAgICAgICAgICAgemZpbGUgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICByYyA9IC0xOworICAgIH0KKworICAgIGlmICggY2h1bmtlZCApIHsKKyAgICAgICAgd2hpbGUgKChsZW4gPSBodHRwX2dldF9jaHVua19sZW4oKSkgPiAwKSB7CisgICAgICAgICAgICB3aGlsZSAobGVuICYmIChjaCA9IGh0dHBfaW5jKDApKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICAgICAgaWYgKCB6ZmlsZSApCisgICAgICAgICAgICAgICAgICAgIHpjaG91dChaT0ZJTEUsKENIQVIpY2gpOworICAgICAgICAgICAgICAgIGlmICggc3RkaW8gKQorICAgICAgICAgICAgICAgICAgICBjb25vYygoQ0hBUiljaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNoID0gaHR0cF9pbmMoMCkpICE9IENSKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKChjaCA9IGh0dHBfaW5jKDApKSAhPSBMRikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChsZW4gJiYgKGNoID0gaHR0cF9pbmMoMCkpID49IDApIHsKKyAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgaWYgKCB6ZmlsZSApCisgICAgICAgICAgICAgICAgemNob3V0KFpPRklMRSwoQ0hBUiljaCk7CisgICAgICAgICAgICBpZiAoIHN0ZGlvICkKKyAgICAgICAgICAgICAgICBjb25vYygoQ0hBUiljaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIHpmaWxlICkKKyAgICAgICAgemNsb3NlKFpPRklMRSk7CisKKyAgICBpZiAoIGNodW5rZWQgKSB7ICAgICAgICAgICAgLyogUGFyc2UgVHJhaWxpbmcgSGVhZGVycyAqLworICAgICAgICBudWxsbGluZSA9IDA7CisgICAgICAgIHdoaWxlICghbnVsbGxpbmUgJiYgKGNoID0gaHR0cF9pbmMoMCkpID49IDAgJiYgaSA8IEhUVFBCVUZMRU4pIHsKKyAgICAgICAgICAgIGJ1ZltpXSA9IGNoOworICAgICAgICAgICAgaWYgKCBidWZbaV0gPT0gMTAgKSB7IC8qIGZvdW5kIGVuZCBvZiBsaW5lICovCisgICAgICAgICAgICAgICAgaWYgKGkgPiAwICYmIGJ1ZltpLTFdID09IDEzKQorICAgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgIGlmIChpIDwgMSkKKyAgICAgICAgICAgICAgICAgIG51bGxsaW5lID0gMTsKKyAgICAgICAgICAgICAgICBidWZbaV0gPSAnXDAnOworICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiAhbnVsbGxpbmUgJiYgaGRjbnQgPCBIVFRQSEVBRENOVCkKKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmaGVhZGVyc1toZGNudCsrXSxidWYpOworI2lmZGVmIENNREFURTJUTQorICAgICAgICAgICAgICAgIGlmICghY2tzdHJjbXAoYnVmLCJMYXN0LU1vZGlmaWVkIiwxMywwKSkgeworICAgICAgICAgICAgICAgICAgICBtb2RfdCA9IGh0dHBfZGF0ZSgmYnVmWzE1XSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2tzdHJjbXAoYnVmLCJEYXRlIiw0LDApKSB7CisgICAgICAgICAgICAgICAgICAgIHNydl90ID0gaHR0cF9kYXRlKCZidWZbNF0pOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDTURBVEUyVE0gKi8KKyAgICAgICAgICAgICAgICBlbHNlIGlmICghY2tzdHJjbXAoYnVmLCJDb25uZWN0aW9uOiIsMTEsMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBja2luZGV4KCJjbG9zZSIsYnVmLDExLDAsMCkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZWNvbiA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIHpmaWxlICkgeyAgICAgICAgICAgICAgLyogU2V0IHRpbWVzdGFtcCAqLworI2lmbmRlZiBOT1NFVFRJTUUKKyNpZmRlZiBPUzIKKyAgICAgICAgdV90LmFjdGltZSA9IHNydl90ID8gc3J2X3QgOiBsb2NhbF90OworICAgICAgICB1X3QubW9kdGltZSA9IG1vZF90ID8gbW9kX3QgOiBsb2NhbF90OworI2Vsc2UgLyogT1MyICovCisjaWZkZWYgU1lTVVRJTUVICisgICAgICAgIHVfdC5hY3RpbWUgPSBzcnZfdCA/IHNydl90IDogbG9jYWxfdDsKKyAgICAgICAgdV90Lm1vZHRpbWUgPSBtb2RfdCA/IG1vZF90IDogbG9jYWxfdDsKKyNlbHNlCisjaWZkZWYgQlNENDQKKyAgICAgICAgdV90WzBdLnR2X3NlYyA9IHNydl90ID8gc3J2X3QgOiBsb2NhbF90OworICAgICAgICB1X3RbMV0udHZfc2VjID0gbW9kX3QgPyBtb2RfdCA6IGxvY2FsX3Q7CisjZWxzZQorICAgICAgICB1X3QubXRpbWUgPSBzcnZfdCA/IHNydl90IDogbG9jYWxfdDsKKyAgICAgICAgdV90LmF0aW1lID0gbW9kX3QgPyBtb2RfdCA6IGxvY2FsX3Q7CisjZW5kaWYgLyogQlNENDQgKi8KKyNlbmRpZiAvKiBTWVNVVElNRUggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIHV0aW1lKGxvY2FsLCZ1X3QpOworI2VuZGlmIC8qIE5PU0VUVElNRSAqLworICAgIH0KKworICBnZXRleGl0OgorICAgIGlmIChhcnJheSkKKyAgICAgIGh0dHBfbWthcnJheShoZWFkZXJzLGhkY250LGFycmF5KTsKKworICAgIGlmICggY2xvc2Vjb24gKQorICAgICAgICBodHRwX2Nsb3NlKCk7CisgICAgZnJlZShyZXF1ZXN0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGRjbnQ7IGkrKykgeworICAgICAgICBpZiAoaGVhZGVyc1tpXSkKKyAgICAgICAgICBmcmVlKGhlYWRlcnNbaV0pOworICAgIH0KKyAgICByZXR1cm4ocmMpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworaHR0cF9oZWFkKGNoYXIgKiBhZ2VudCwgY2hhciAqKiBoZHJsaXN0LCBjaGFyICogdXNlciwKKyAgICAgICAgICBjaGFyICogcHdkLCBjaGFyIGFycmF5LCBjaGFyICogbG9jYWwsIGNoYXIgKiByZW1vdGUsCisgICAgICAgICAgaW50IHN0ZGlvKQorI2Vsc2UKK2h0dHBfaGVhZChhZ2VudCwgaGRybGlzdCwgdXNlciwgcHdkLCBhcnJheSwgbG9jYWwsIHJlbW90ZSwgc3RkaW8pCisgICAgY2hhciAqIGFnZW50OyBjaGFyICoqIGhkcmxpc3Q7IGNoYXIgKiB1c2VyOworICAgIGNoYXIgKiBwd2Q7IGNoYXIgYXJyYXk7IGNoYXIgKiBsb2NhbDsgY2hhciAqIHJlbW90ZTsKKyAgICBpbnQgc3RkaW87CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBjaGFyICogcmVxdWVzdCA9IE5VTEw7CisgICAgaW50ICAgIGksIGosIGxlbiA9IDAsIGhkY250ID0gMCwgcmMgPSAwOworICAgIGludCAgICBjaDsKKyAgICBpbnQgICAgaHR0cF9mbmQgPSAwOworICAgIGNoYXIgICBidWZbSFRUUEJVRkxFTl0sICpwOworICAgIGludCAgICBudWxsbGluZTsKKyAgICB0aW1lX3QgbW9kX3Q7CisgICAgdGltZV90IHNydl90OworICAgIHRpbWVfdCBsb2NhbF90OworICAgIGNoYXIgcGFzc3dkWzY0XTsKKyAgICBjaGFyIGI2NGluWzEyOF07CisgICAgY2hhciBiNjRvdXRbMjU2XTsKKyAgICBjaGFyICogaGVhZGVyc1tIVFRQSEVBRENOVF07CisgICAgaW50ICBjbG9zZWNvbiA9IDA7CisgICAgaW50ICBmaXJzdCA9IDE7CisKKyAgICBpZiAoaHR0cGZkID09IC0xKQorICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmIChhcnJheSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSFRUUEhFQURDTlQ7IGkrKykKKyAgICAgICAgICBoZWFkZXJzW2ldID0gTlVMTDsKKyAgICB9CisgICAgbGVuID0gOTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSEVBRCAqLworICAgIGxlbiArPSBzdHJsZW4oSFRUUF9WRVJTSU9OKTsKKyAgICBsZW4gKz0gc3RybGVuKHJlbW90ZSk7CisgICAgbGVuICs9IDE2OworCisgICAgaWYgKCBoZHJsaXN0ICkgeworICAgICAgICBmb3IgKGkgPSAwOyBoZHJsaXN0W2ldOyBpKyspCisgICAgICAgICAgICBsZW4gKz0gc3RybGVuKGhkcmxpc3RbaV0pICsgMjsKKyAgICB9CisgICAgbGVuICs9IHN0cmxlbihodHRwX2hvc3RfcG9ydCkgKyA4OworCisgICAgaWYgKGFnZW50KQorICAgICAgbGVuICs9IDEzICsgc3RybGVuKGFnZW50KTsKKyAgICBpZiAodXNlcikgeworICAgICAgICBpZiAoIXB3ZCkgeworICAgICAgICAgICAgcmVhZHBhc3MoIlBhc3N3b3JkOiAiLHBhc3N3ZCw2NCk7CisgICAgICAgICAgICBwd2QgPSBwYXNzd2Q7CisgICAgICAgIH0KKyAgICAgICAgY2ttYWttc2coYjY0aW4sc2l6ZW9mKGI2NGluKSx1c2VyLCI6Iixwd2QsTlVMTCk7CisgICAgICAgIGogPSBiOHRvYjY0KGI2NGluLHN0cmxlbihiNjRpbiksYjY0b3V0LDI1Nik7CisgICAgICAgIG1lbXNldChwd2QsMCxzdHJsZW4ocHdkKSk7ICAgICAgLyogTk9UIFBPUlRBQkxFICovCisgICAgICAgIGlmIChqIDwgMCkKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBiNjRvdXRbal0gPSAnXDAnOworICAgICAgICBsZW4gKz0gaiArIDI0OworICAgIH0KKyNpZmRlZiBIVFRQX0NMT1NFCisgICAgbGVuICs9IDE5OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29ubmVjdGlvbjogY2xvc2UgKi8KKyNlbmRpZgorICAgIGxlbiArPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJsYW5rIGxpbmUgKyBudWxsICovCisKKyAgICByZXF1ZXN0ID0gKGNoYXIgKiltYWxsb2MobGVuKTsKKyAgICBpZiAoIXJlcXVlc3QpCisgICAgICByZXR1cm4oLTEpOworCisgICAgc3ByaW50ZihyZXF1ZXN0LCJIRUFEICVzICVzXHJcbiIscmVtb3RlLEhUVFBfVkVSU0lPTik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIkhvc3Q6ICIsIGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsaHR0cF9ob3N0X3BvcnQsIGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgaWYgKGFnZW50KSB7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LCJVc2VyLWFnZW50OiAiLGxlbik7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LGFnZW50LGxlbik7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICAgIH0KKyAgICBpZiAodXNlcikgeworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiQXV0aG9yaXphdGlvbjogQmFzaWMgIixsZW4pOworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxiNjRvdXQsbGVuKTsKKyAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgfQorICAgIGlmICggaGRybGlzdCApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaGRybGlzdFtpXTsgaSsrKSB7CisgICAgICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxoZHJsaXN0W2ldLGxlbik7CisgICAgICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiXHJcbiIsbGVuKTsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBIVFRQX0NMT1NFCisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIkNvbm5lY3Rpb246IGNsb3NlXHJcbiIsbGVuKTsKKyNlbmRpZgorICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworCisgICAgaWYgKCBsb2NhbCAmJiBsb2NhbFswXSApIHsKKyAgICAgICAgaWYgKCF6b3Blbm8oWk9GSUxFLGxvY2FsLE5VTEwsTlVMTCkpIHsKKyAgICAgICAgICAgIGZyZWUocmVxdWVzdCk7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgfQorCisgIGhlYWRyZXE6CisgICAgaWYgKGh0dHBfdG9sKChDSEFSICopcmVxdWVzdCxzdHJsZW4ocmVxdWVzdCkpIDwgMCkKKyAgICB7CisgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICAgICAgaWYgKCBmaXJzdCApIHsKKyAgICAgICAgICAgIGZpcnN0LS07CisgICAgICAgICAgICBodHRwX3Jlb3BlbigpOworICAgICAgICAgICAgZ290byBoZWFkcmVxOworICAgICAgICB9CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gaGVhZGV4aXQ7CisgICAgfQorCisgICAgLyogUHJvY2VzcyB0aGUgaGVhZGVycyAqLworCisgICAgbG9jYWxfdCA9IHRpbWUoTlVMTCk7CisgICAgbnVsbGxpbmUgPSAwOworICAgIGkgPSAwOworICAgIHdoaWxlICghbnVsbGxpbmUgJiYgKGNoID0gaHR0cF9pbmMoMCkpID49IDAgJiYgaSA8IEhUVFBCVUZMRU4pIHsKKyAgICAgICAgYnVmW2ldID0gY2g7CisgICAgICAgIGlmIChidWZbaV0gPT0gMTApIHsgICAgICAgICAgICAgLyogZm91bmQgZW5kIG9mIGxpbmUgKi8KKyAgICAgICAgICAgIGlmIChpID4gMCAmJiBidWZbaS0xXSA9PSAxMykKKyAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgaWYgKGkgPCAxKQorICAgICAgICAgICAgICBudWxsbGluZSA9IDE7CisgICAgICAgICAgICBidWZbaV0gPSAnXDAnOworICAgICAgICAgICAgaWYgKGFycmF5ICYmICFudWxsbGluZSAmJiBoZGNudCA8IEhUVFBIRUFEQ05UKQorICAgICAgICAgICAgICBtYWtlc3RyKCZoZWFkZXJzW2hkY250KytdLGJ1Zik7CisgICAgICAgICAgICBpZiAoIWNrc3RyY21wKGJ1ZiwiSFRUUCIsNCwwKSkgeworICAgICAgICAgICAgICAgIGh0dHBfZm5kID0gMTsKKyAgICAgICAgICAgICAgICBqID0gY2tpbmRleCgiICIsYnVmLDAsMCwwKTsKKyAgICAgICAgICAgICAgICBwID0gJmJ1ZltqXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXNzcGFjZSgqcCkpCisgICAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwWzBdKSB7CisgICAgICAgICAgICAgICAgICBjYXNlICcxJzogICAgICAgICAgICAgLyogSW5mb3JtYXRpb25hbCBtZXNzYWdlICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAnMic6ICAgICAgICAgICAgIC8qIFN1Y2Nlc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlICczJzogICAgICAgICAgICAgLyogUmVkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgJzQnOiAgICAgICAgICAgICAvKiBDbGllbnQgZmFpbHVyZSAqLworICAgICAgICAgICAgICAgICAgY2FzZSAnNSc6ICAgICAgICAgICAgIC8qIFNlcnZlciBmYWlsdXJlICovCisgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgLyogVW5rbm93biAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KQorICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRmFpbHVyZTogU2VydmVyIHJlcG9ydHMgJXNcbiIscCk7CisgICAgICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGh0dHBfc2V0X2NvZGVfcmVwbHkocCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghY2tzdHJjbXAoYnVmLCJDb25uZWN0aW9uOiIsMTEsMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBja2luZGV4KCJjbG9zZSIsYnVmLDExLDAsMCkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZWNvbiA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggbG9jYWwgJiYgbG9jYWxbMF0gKSB7CisgICAgICAgICAgICAgICAgICAgIHpzb3V0KFpPRklMRSxidWYpOworICAgICAgICAgICAgICAgICAgICB6c291dChaT0ZJTEUsIlxyXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0ZGlvKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzXHJcbiIsYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjaCA8IDAgJiYgZmlyc3QpIHsKKyAgICAgICAgZmlyc3QtLTsKKyAgICAgICAgaHR0cF9jbG9zZSgpOworICAgICAgICBodHRwX3Jlb3BlbigpOworICAgICAgICBnb3RvIGhlYWRyZXE7CisgICAgfQorICAgIGlmICggaHR0cF9mbmQgPT0gMCApCisgICAgICAgIHJjID0gLTE7CisKKyAgICBpZiAoYXJyYXkpCisgICAgICBodHRwX21rYXJyYXkoaGVhZGVycyxoZGNudCxhcnJheSk7CisKKyAgaGVhZGV4aXQ6CisgICAgaWYgKCBsb2NhbCAmJiBsb2NhbFswXSApCisgICAgICAgIHpjbG9zZShaT0ZJTEUpOworICAgIGlmIChjbG9zZWNvbikKKyAgICAgICAgaHR0cF9jbG9zZSgpOworICAgIGZyZWUocmVxdWVzdCk7CisgICAgZm9yIChpID0gMDsgaSA8IGhkY250OyBpKyspIHsKKyAgICAgICAgaWYgKGhlYWRlcnNbaV0pCisgICAgICAgICAgZnJlZShoZWFkZXJzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuKHJjKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2h0dHBfaW5kZXgoY2hhciAqIGFnZW50LCBjaGFyICoqIGhkcmxpc3QsIGNoYXIgKiB1c2VyLCBjaGFyICogcHdkLAorICAgICAgICAgICAgIGNoYXIgYXJyYXksIGNoYXIgKiBsb2NhbCwgY2hhciAqIHJlbW90ZSwgaW50IHN0ZGlvKQorI2Vsc2UKK2h0dHBfaW5kZXgoYWdlbnQsIGhkcmxpc3QsIHVzZXIsIHB3ZCwgYXJyYXksIGxvY2FsLCByZW1vdGUsIHN0ZGlvKQorICAgIGNoYXIgKiBhZ2VudDsgY2hhciAqKiBoZHJsaXN0OyBjaGFyICogdXNlcjsgY2hhciAqIHB3ZDsKKyAgICBjaGFyIGFycmF5OyBjaGFyICogbG9jYWw7IGNoYXIgKiByZW1vdGU7IGludCBzdGRpbzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGNoYXIgKiByZXF1ZXN0ID0gTlVMTDsKKyAgICBpbnQgICAgaSwgaiwgbGVuID0gMCwgaGRjbnQgPSAwLCByYyA9IDA7CisgICAgaW50ICAgIGNoOworICAgIGludCAgICBodHRwX2ZuZCA9IDA7CisgICAgY2hhciAgIGJ1ZltIVFRQQlVGTEVOXSwgKnA7CisgICAgaW50ICAgIG51bGxsaW5lOworICAgIHRpbWVfdCBtb2RfdDsKKyAgICB0aW1lX3Qgc3J2X3Q7CisgICAgdGltZV90IGxvY2FsX3Q7CisgICAgY2hhciBwYXNzd2RbNjRdOworICAgIGNoYXIgYjY0aW5bMTI4XTsKKyAgICBjaGFyIGI2NG91dFsyNTZdOworICAgIGNoYXIgKiBoZWFkZXJzW0hUVFBIRUFEQ05UXTsKKyAgICBpbnQgIGNsb3NlY29uID0gMDsKKyAgICBpbnQgIGNodW5rZWQgPSAwOworICAgIGludCAgemZpbGUgPSAwOworICAgIGludCAgZmlyc3QgPSAxOworCisgICAgaWYgKGh0dHBmZCA9PSAtMSkKKyAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAoYXJyYXkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEhUVFBIRUFEQ05UOyBpKyspCisgICAgICAgICAgaGVhZGVyc1tpXSA9IE5VTEw7CisgICAgfQorICAgIGxlbiA9IDEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJTkRFWCAqLworICAgIGxlbiArPSBzdHJsZW4oSFRUUF9WRVJTSU9OKTsKKyAgICBsZW4gKz0gc3RybGVuKHJlbW90ZSk7CisgICAgbGVuICs9IDE2OworCisgICAgaWYgKCBoZHJsaXN0ICkgeworICAgICAgICBmb3IgKGkgPSAwOyBoZHJsaXN0W2ldOyBpKyspCisgICAgICAgICAgICBsZW4gKz0gc3RybGVuKGhkcmxpc3RbaV0pICsgMjsKKyAgICB9CisgICAgbGVuICs9IHN0cmxlbihodHRwX2hvc3RfcG9ydCkgKyA4OworCisgICAgaWYgKGFnZW50KQorICAgICAgICBsZW4gKz0gMTMgKyBzdHJsZW4oYWdlbnQpOworICAgIGlmICh1c2VyKSB7CisgICAgICAgIGlmICghcHdkKSB7CisgICAgICAgICAgICByZWFkcGFzcygiUGFzc3dvcmQ6ICIscGFzc3dkLDY0KTsKKyAgICAgICAgICAgIHB3ZCA9IHBhc3N3ZDsKKyAgICAgICAgfQorICAgICAgICBja21ha21zZyhiNjRpbixzaXplb2YoYjY0aW4pLHVzZXIsIjoiLHB3ZCxOVUxMKTsKKyAgICAgICAgaiA9IGI4dG9iNjQoYjY0aW4sc3RybGVuKGI2NGluKSxiNjRvdXQsMjU2KTsKKyAgICAgICAgbWVtc2V0KHB3ZCwwLHN0cmxlbihwd2QpKTsKKyAgICAgICAgaWYgKGogPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGI2NG91dFtqXSA9ICdcMCc7CisgICAgICAgIGxlbiArPSBqICsgMjQ7CisgICAgfQorI2lmZGVmIEhUVFBfQ0xPU0UKKyAgICBsZW4gKz0gMTk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb25uZWN0aW9uOiBjbG9zZSAqLworI2VuZGlmCisgICAgbGVuICs9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmxhbmsgbGluZSArIG51bGwgKi8KKworICAgIHJlcXVlc3QgPSBtYWxsb2MobGVuKTsKKyAgICBpZiAoIXJlcXVlc3QpCisgICAgICByZXR1cm4oLTEpOworCisgICAgc3ByaW50ZihyZXF1ZXN0LCJJTkRFWCAlc1xyXG4iLEhUVFBfVkVSU0lPTik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIkhvc3Q6ICIsIGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsaHR0cF9ob3N0X3BvcnQsIGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgaWYgKGFnZW50KSB7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LCJVc2VyLWFnZW50OiAiLGxlbik7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LGFnZW50LGxlbik7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICAgIH0KKyAgICBpZiAodXNlcikgeworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiQXV0aG9yaXphdGlvbjogQmFzaWMgIixsZW4pOworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxiNjRvdXQsbGVuKTsKKyAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgfQorICAgIGlmICggaGRybGlzdCApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaGRybGlzdFtpXTsgaSsrKSB7CisgICAgICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxoZHJsaXN0W2ldLGxlbik7CisgICAgICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiXHJcbiIsbGVuKTsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBIVFRQX0NMT1NFCisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIkNvbm5lY3Rpb246IGNsb3NlXHJcbiIsbGVuKTsKKyNlbmRpZgorICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICBpbmRleHJlcToKKyAgICBpZiAoaHR0cF90b2woKENIQVIgKilyZXF1ZXN0LHN0cmxlbihyZXF1ZXN0KSkgPCAwKQorICAgIHsKKyAgICAgICAgaHR0cF9jbG9zZSgpOworICAgICAgICBpZiAoIGZpcnN0ICkgeworICAgICAgICAgICAgZmlyc3QtLTsKKyAgICAgICAgICAgIGh0dHBfcmVvcGVuKCk7CisgICAgICAgICAgICBnb3RvIGluZGV4cmVxOworICAgICAgICB9CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gaW5kZXhleGl0OworICAgIH0KKworICAgIC8qIFByb2Nlc3MgdGhlIGhlYWRlcnMgKi8KKyAgICBsb2NhbF90ID0gdGltZShOVUxMKTsKKyAgICBudWxsbGluZSA9IDA7CisgICAgaSA9IDA7CisgICAgbGVuID0gLTE7CisgICAgd2hpbGUgKCFudWxsbGluZSAmJiAoY2ggPSBodHRwX2luYygwKSkgPj0gMCAmJiBpIDwgSFRUUEJVRkxFTikgeworICAgICAgICBidWZbaV0gPSBjaDsKKyAgICAgICAgaWYgKGJ1ZltpXSA9PSAxMCkgeyAgICAgICAgICAgICAvKiBmb3VuZCBlbmQgb2YgbGluZSAqLworICAgICAgICAgICAgaWYgKGkgPiAwICYmIGJ1ZltpLTFdID09IDEzKQorICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICBpZiAoaSA8IDEpCisgICAgICAgICAgICAgIG51bGxsaW5lID0gMTsKKyAgICAgICAgICAgIGJ1ZltpXSA9ICdcMCc7CisgICAgICAgICAgICBpZiAoYXJyYXkgJiYgIW51bGxsaW5lICYmIGhkY250IDwgSFRUUEhFQURDTlQpCisgICAgICAgICAgICAgIG1ha2VzdHIoJmhlYWRlcnNbaGRjbnQrK10sYnVmKTsKKyAgICAgICAgICAgIGlmICghY2tzdHJjbXAoYnVmLCJIVFRQIiw0LDApKSB7CisgICAgICAgICAgICAgICAgaHR0cF9mbmQgPSAxOworICAgICAgICAgICAgICAgIGogPSBja2luZGV4KCIgIixidWYsMCwwLDApOworICAgICAgICAgICAgICAgIHAgPSAmYnVmW2pdOworICAgICAgICAgICAgICAgIHdoaWxlIChpc3NwYWNlKCpwKSkKKyAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBwWzBdICkgeworICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6ICAgICAgICAgICAgIC8qIEluZm9ybWF0aW9uYWwgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgJzInOiAgICAgICAgICAgICAvKiBTdWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAnMyc6ICAgICAgICAgICAgIC8qIFJlZGlyZWN0aW9uICovCisgICAgICAgICAgICAgICAgICBjYXNlICc0JzogICAgICAgICAgICAgLyogQ2xpZW50IGZhaWx1cmUgKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgJzUnOiAgICAgICAgICAgICAvKiBTZXJ2ZXIgZmFpbHVyZSAqLworICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgIC8qIFVua25vd24gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFxdWlldCkKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkZhaWx1cmU6IFNlcnZlciByZXBvcnRzICVzXG4iLHApOworICAgICAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBodHRwX3NldF9jb2RlX3JlcGx5KHApOworICAgICAgICAgICAgfSBlbHNlIGlmICggIW51bGxsaW5lICkgeworICAgICAgICAgICAgICAgIGlmICghY2tzdHJjbXAoYnVmLCJDb25uZWN0aW9uOiIsMTEsMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBja2luZGV4KCJjbG9zZSIsYnVmLDExLDAsMCkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZWNvbiA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2tzdHJjbXAoYnVmLCJDb250ZW50LUxlbmd0aDoiLDE1LDApKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IGF0b2koJmJ1ZlsxNl0pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNrc3RyY21wKGJ1ZiwiVHJhbnNmZXItRW5jb2Rpbmc6IiwxOCwwKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGNraW5kZXgoImNodW5rZWQiLGJ1ZiwxOCwwLDApICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtlZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIsYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNoIDwgMCAmJiBmaXJzdCkgeworICAgICAgICBmaXJzdC0tOworICAgICAgICBodHRwX2Nsb3NlKCk7CisgICAgICAgIGh0dHBfcmVvcGVuKCk7CisgICAgICAgIGdvdG8gaW5kZXhyZXE7CisgICAgfQorICAgIGlmICggaHR0cF9mbmQgPT0gMCApIHsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgY2xvc2Vjb24gPSAxOworICAgICAgICBnb3RvIGluZGV4ZXhpdDsKKyAgICB9CisKKyAgICAvKiBOb3cgd2UgaGF2ZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgKi8KKyAgICBpZiAoIGxvY2FsICYmIGxvY2FsWzBdICkgeworICAgICAgICBpZiAoem9wZW5vKFpPRklMRSxsb2NhbCxOVUxMLE5VTEwpKQorICAgICAgICAgICAgemZpbGUgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICByYyA9IC0xOworICAgIH0KKworICAgIGlmICggY2h1bmtlZCApIHsKKyAgICAgICAgd2hpbGUgKChsZW4gPSBodHRwX2dldF9jaHVua19sZW4oKSkgPiAwKSB7CisgICAgICAgICAgICB3aGlsZSAobGVuICYmIChjaCA9IGh0dHBfaW5jKDApKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICAgICAgaWYgKCB6ZmlsZSApCisgICAgICAgICAgICAgICAgICAgIHpjaG91dChaT0ZJTEUsKENIQVIpY2gpOworICAgICAgICAgICAgICAgIGlmICggc3RkaW8gKQorICAgICAgICAgICAgICAgICAgICBjb25vYygoQ0hBUiljaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNoID0gaHR0cF9pbmMoMCkpICE9IENSKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKChjaCA9IGh0dHBfaW5jKDApKSAhPSBMRikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChsZW4gJiYgKGNoID0gaHR0cF9pbmMoMCkpID49IDApIHsKKyAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgaWYgKCB6ZmlsZSApCisgICAgICAgICAgICAgICAgemNob3V0KFpPRklMRSwoQ0hBUiljaCk7CisgICAgICAgICAgICBpZiAoIHN0ZGlvICkKKyAgICAgICAgICAgICAgICBjb25vYygoQ0hBUiljaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIHpmaWxlICkKKyAgICAgICAgemNsb3NlKFpPRklMRSk7CisKKyAgICBpZiAoIGNodW5rZWQgKSB7ICAgICAgICAgICAgLyogUGFyc2UgVHJhaWxpbmcgSGVhZGVycyAqLworICAgICAgICBudWxsbGluZSA9IDA7CisgICAgICAgIHdoaWxlICghbnVsbGxpbmUgJiYgKGNoID0gaHR0cF9pbmMoMCkpID49IDAgJiYgaSA8IEhUVFBCVUZMRU4pIHsKKyAgICAgICAgICAgIGJ1ZltpXSA9IGNoOworICAgICAgICAgICAgaWYgKCBidWZbaV0gPT0gMTAgKSB7IC8qIGZvdW5kIGVuZCBvZiBsaW5lICovCisgICAgICAgICAgICAgICAgaWYgKGkgPiAwICYmIGJ1ZltpLTFdID09IDEzKQorICAgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgIGlmIChpIDwgMSkKKyAgICAgICAgICAgICAgICAgIG51bGxsaW5lID0gMTsKKyAgICAgICAgICAgICAgICBidWZbaV0gPSAnXDAnOworICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiAhbnVsbGxpbmUgJiYgaGRjbnQgPCBIVFRQSEVBRENOVCkKKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmaGVhZGVyc1toZGNudCsrXSxidWYpOworICAgICAgICAgICAgICAgIGlmICghY2tzdHJjbXAoYnVmLCJDb25uZWN0aW9uOiIsMTEsMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBja2luZGV4KCJjbG9zZSIsYnVmLDExLDAsMCkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZWNvbiA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmMgPSAwOworCisgIGluZGV4ZXhpdDoKKyAgICBpZiAoYXJyYXkpCisgICAgICBodHRwX21rYXJyYXkoaGVhZGVycyxoZGNudCxhcnJheSk7CisKKyAgICBpZiAoY2xvc2Vjb24pCisgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICBmcmVlKHJlcXVlc3QpOworICAgIGZvciAoaSA9IDA7IGkgPCBoZGNudDsgaSsrKSB7CisgICAgICAgIGlmIChoZWFkZXJzW2ldKQorICAgICAgICAgIGZyZWUoaGVhZGVyc1tpXSk7CisgICAgfQorICAgIHJldHVybihyYyk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitodHRwX3B1dChjaGFyICogYWdlbnQsIGNoYXIgKiogaGRybGlzdCwgY2hhciAqIG1pbWUsIGNoYXIgKiB1c2VyLAorICAgICAgICAgY2hhciAqIHB3ZCwgY2hhciBhcnJheSwgY2hhciAqIGxvY2FsLCBjaGFyICogcmVtb3RlLAorICAgICAgICAgY2hhciAqIGRlc3QsIGludCBzdGRpbykKKyNlbHNlCitodHRwX3B1dChhZ2VudCwgaGRybGlzdCwgbWltZSwgdXNlciwgcHdkLCBhcnJheSwgbG9jYWwsIHJlbW90ZSwgZGVzdCwgc3RkaW8pCisgICAgY2hhciAqIGFnZW50OyBjaGFyICoqIGhkcmxpc3Q7IGNoYXIgKiBtaW1lOyBjaGFyICogdXNlcjsKKyAgICBjaGFyICogcHdkOyBjaGFyIGFycmF5OyBjaGFyICogbG9jYWw7IGNoYXIgKiByZW1vdGU7IGNoYXIgKiBkZXN0OworICAgIGludCBzdGRpbzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGNoYXIgKiByZXF1ZXN0PU5VTEw7CisgICAgaW50ICAgIGksIGosIGxlbiA9IDAsIGhkY250ID0gMCwgcmMgPSAwOworICAgIGludCAgICBjaDsKKyAgICBpbnQgICAgaHR0cF9mbmQgPSAwOworICAgIGNoYXIgICBidWZbSFRUUEJVRkxFTl0sICpwOworICAgIGludCAgICBudWxsbGluZTsKKyAgICB0aW1lX3QgbW9kX3Q7CisgICAgdGltZV90IHNydl90OworICAgIHRpbWVfdCBsb2NhbF90OworICAgIGNoYXIgcGFzc3dkWzY0XTsKKyAgICBjaGFyIGI2NGluWzEyOF07CisgICAgY2hhciBiNjRvdXRbMjU2XTsKKyAgICBpbnQgIGZpbGVsZW47CisgICAgY2hhciAqIGhlYWRlcnNbSFRUUEhFQURDTlRdOworICAgIGludCAgY2xvc2Vjb24gPSAwOworICAgIGludCAgY2h1bmtlZCA9IDA7CisgICAgaW50ICBmaXJzdCA9IDE7CisgICAgaW50ICB6ZmlsZSA9IDA7CisKKyAgICBpZiAoaHR0cGZkID09IC0xKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAoIW1pbWUpIG1pbWUgPSAiIjsKKyAgICBpZiAoIXJlbW90ZSkgcmVtb3RlID0gIiI7CisgICAgaWYgKCFsb2NhbCkgbG9jYWwgPSAiIjsKKyAgICBpZiAoISpsb2NhbCkgcmV0dXJuKC0xKTsKKworICAgIGlmIChhcnJheSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSFRUUEhFQURDTlQ7IGkrKykKKyAgICAgICAgICBoZWFkZXJzW2ldID0gTlVMTDsKKyAgICB9CisgICAgZmlsZWxlbiA9IHpjaGtpKGxvY2FsKTsKKyAgICBpZiAoZmlsZWxlbiA8IDApCisgICAgICByZXR1cm4oLTEpOworCisgICAgLyogQ29tcHV0ZSBsZW5ndGggb2YgcmVxdWVzdCBoZWFkZXIgKi8KKyAgICBsZW4gPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQVVQgKi8KKyAgICBsZW4gKz0gc3RybGVuKEhUVFBfVkVSU0lPTik7CisgICAgbGVuICs9IHN0cmxlbihyZW1vdGUpOworICAgIGxlbiArPSAxNjsKKworICAgIGlmICggaGRybGlzdCApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaGRybGlzdFtpXTsgaSsrKQorICAgICAgICAgICAgbGVuICs9IHN0cmxlbihoZHJsaXN0W2ldKSArIDI7CisgICAgfQorICAgIGxlbiArPSBzdHJsZW4oaHR0cF9ob3N0X3BvcnQpICsgODsKKworICAgIGlmIChhZ2VudCkKKyAgICAgIGxlbiArPSAxMyArIHN0cmxlbihhZ2VudCk7CisgICAgaWYgKHVzZXIpIHsKKyAgICAgICAgaWYgKCFwd2QpIHsKKyAgICAgICAgICAgIHJlYWRwYXNzKCJQYXNzd29yZDogIixwYXNzd2QsNjQpOworICAgICAgICAgICAgcHdkID0gcGFzc3dkOworICAgICAgICB9CisgICAgICAgIGNrbWFrbXNnKGI2NGluLHNpemVvZihiNjRpbiksdXNlciwiOiIscHdkLE5VTEwpOworICAgICAgICBqID0gYjh0b2I2NChiNjRpbixzdHJsZW4oYjY0aW4pLGI2NG91dCwyNTYpOworICAgICAgICBtZW1zZXQocHdkLDAsc3RybGVuKHB3ZCkpOworICAgICAgICBpZiAoaiA8IDApCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgYjY0b3V0W2pdID0gJ1wwJzsKKyAgICAgICAgbGVuICs9IGogKyAyNDsKKyAgICB9CisgICAgbGVuICs9IDE2ICsgc3RybGVuKG1pbWUpOyAgICAgICAgICAgLyogQ29udGVudC10eXBlOiAqLworICAgIGxlbiArPSAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRlbnQtbGVuZ3RoOiAqLworICAgIGxlbiArPSAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGU6ICovCisjaWZkZWYgSFRUUF9DTE9TRQorICAgIGxlbiArPSAxOTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbm5lY3Rpb246IGNsb3NlICovCisjZW5kaWYKKyAgICBsZW4gKz0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBibGFuayBsaW5lICsgbnVsbCAqLworCisgICAgcmVxdWVzdCA9IG1hbGxvYyhsZW4pOworICAgIGlmICghcmVxdWVzdCkKKyAgICAgIHJldHVybigtMSk7CisKKyAgICBzcHJpbnRmKHJlcXVlc3QsIlBVVCAlcyAlc1xyXG4iLHJlbW90ZSxIVFRQX1ZFUlNJT04pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJEYXRlOiAiLGxlbik7CisjaWZkZWYgQ01EQVRFMlRNCisgICAgY2tzdHJuY2F0KHJlcXVlc3QsaHR0cF9ub3coKSxsZW4pOworI2Vsc2UKKyAgICBzdHJjYXQocmVxdWVzdCwuLi4pOworI2VuZGlmIC8qIENNREFURTJUTSAqLworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJIb3N0OiAiLCBsZW4pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LGh0dHBfaG9zdF9wb3J0LCBsZW4pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICAgIGlmIChhZ2VudCkgeworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiVXNlci1hZ2VudDogIixsZW4pOworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxhZ2VudCxsZW4pOworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiXHJcbiIsbGVuKTsKKyAgICB9CisgICAgaWYgKHVzZXIpIHsKKyAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsIkF1dGhvcml6YXRpb246IEJhc2ljICIsbGVuKTsKKyAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsYjY0b3V0LGxlbik7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICAgIH0KKyAgICBpZiAoIGhkcmxpc3QgKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGhkcmxpc3RbaV07IGkrKykgeworICAgICAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsaGRybGlzdFtpXSxsZW4pOworICAgICAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIkNvbnRlbnQtdHlwZTogIixsZW4pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LG1pbWUsbGVuKTsKKyAgICBja3N0cm5jYXQocmVxdWVzdCwiXHJcbiIsbGVuKTsKKyAgICBzcHJpbnRmKGJ1ZiwiQ29udGVudC1sZW5ndGg6ICVkXHJcbiIsZmlsZWxlbik7IC8qIHNhZmUgKi8KKyAgICBja3N0cm5jYXQocmVxdWVzdCxidWYsbGVuKTsKKyNpZmRlZiBIVFRQX0NMT1NFCisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIkNvbm5lY3Rpb246IGNsb3NlXHJcbiIsbGVuKTsKKyNlbmRpZgorICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworCisgICAgLyogTm93IHdlIGhhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlICovCisgICAgaWYgKHpvcGVuaShaSUZJTEUsbG9jYWwpKSB7CisKKyAgICAgIHB1dHJlcToJCQkJLyogU2VuZCByZXF1ZXN0ICovCisgICAgICAgIGlmIChodHRwX3RvbCgoQ0hBUiAqKXJlcXVlc3Qsc3RybGVuKHJlcXVlc3QpKSA8PSAwKSB7CisgICAgICAgICAgICBodHRwX2Nsb3NlKCk7CisgICAgICAgICAgICBpZiAoIGZpcnN0ICkgeworICAgICAgICAgICAgICAgIGZpcnN0LS07CisgICAgICAgICAgICAgICAgaHR0cF9yZW9wZW4oKTsKKyAgICAgICAgICAgICAgICBnb3RvIHB1dHJlcTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHpjbG9zZShaSUZJTEUpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gcHV0ZXhpdDsKKyAgICAgICAgfQorICAgICAgICAvKiBSZXF1ZXN0IGhlYWRlcnMgaGF2ZSBiZWVuIHNlbnQgKi8KKworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKHpjaGluKFpJRklMRSwmY2gpID09IDApIHsKKyAgICAgICAgICAgIGJ1ZltpKytdID0gY2g7CisgICAgICAgICAgICBpZiAoaSA9PSBIVFRQQlVGTEVOKSB7CisgICAgICAgICAgICAgICAgaWYgKGh0dHBfdG9sKChDSEFSICopYnVmLEhUVFBCVUZMRU4pIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaHR0cF9jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIGZpcnN0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfcmVvcGVuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHB1dHJlcTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIGlmIChodHRwX3RvbCgoQ0hBUiAqKWJ1ZixpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBodHRwX2Nsb3NlKCk7CisgICAgICAgICAgICAgICAgaWYgKCBmaXJzdCApIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QtLTsKKyAgICAgICAgICAgICAgICAgICAgaHR0cF9yZW9wZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBwdXRyZXE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHpjbG9zZShaSUZJTEUpOworCisgICAgICAgIC8qIFByb2Nlc3MgdGhlIHJlc3BvbnNlIGhlYWRlcnMgKi8KKyAgICAgICAgbG9jYWxfdCA9IHRpbWUoTlVMTCk7CisgICAgICAgIG51bGxsaW5lID0gMDsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGxlbiA9IC0xOworICAgICAgICB3aGlsZSAoIW51bGxsaW5lICYmIChjaCA9IGh0dHBfaW5jKDApKSA+PSAwICYmIGkgPCBIVFRQQlVGTEVOKSB7CisgICAgICAgICAgICBidWZbaV0gPSBjaDsKKyAgICAgICAgICAgIGlmIChidWZbaV0gPT0gMTApIHsgICAgICAgICAvKiBmb3VuZCBlbmQgb2YgbGluZSAqLworICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBidWZbaS0xXSA9PSAxMykKKyAgICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IDEpCisgICAgICAgICAgICAgICAgICBudWxsbGluZSA9IDE7CisgICAgICAgICAgICAgICAgYnVmW2ldID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXkgJiYgIW51bGxsaW5lICYmIGhkY250IDwgSFRUUEhFQURDTlQpCisgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZoZWFkZXJzW2hkY250KytdLGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCFja3N0cmNtcChidWYsIkhUVFAiLDQsMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaHR0cF9mbmQgPSAxOworICAgICAgICAgICAgICAgICAgICBqID0gY2tpbmRleCgiICIsYnVmLDAsMCwwKTsKKyAgICAgICAgICAgICAgICAgICAgcCA9ICZidWZbal07CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpc3NwYWNlKCpwKSkKKyAgICAgICAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocFswXSkgeworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEnOiAgICAgICAgIC8qIEluZm9ybWF0aW9uYWwgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMic6ICAgICAgICAgLyogU3VjY2VzcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMyc6ICAgICAgICAgLyogUmVkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICBjYXNlICc0JzogICAgICAgICAvKiBDbGllbnQgZmFpbHVyZSAqLworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzUnOiAgICAgICAgIC8qIFNlcnZlciBmYWlsdXJlICovCisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgLyogVW5rbm93biAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxdWlldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJGYWlsdXJlOiBTZXJ2ZXIgcmVwb3J0cyAlc1xuIixwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaHR0cF9zZXRfY29kZV9yZXBseShwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNrc3RyY21wKGJ1ZiwiQ29ubmVjdGlvbjoiLDExLDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNraW5kZXgoImNsb3NlIixidWYsMTEsMCwwKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZWNvbiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNrc3RyY21wKGJ1ZiwiQ29udGVudC1MZW5ndGg6IiwxNSwwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYXRvaSgmYnVmWzE2XSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNrc3RyY21wKGJ1ZiwiVHJhbnNmZXItRW5jb2Rpbmc6IiwxOCwwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBja2luZGV4KCJjaHVua2VkIixidWYsMTgsMCwwKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua2VkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0ZGlvICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIsYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2ggPCAwICYmIGZpcnN0KSB7CisgICAgICAgICAgICBmaXJzdC0tOworICAgICAgICAgICAgaHR0cF9jbG9zZSgpOworICAgICAgICAgICAgaHR0cF9yZW9wZW4oKTsKKyAgICAgICAgICAgIGdvdG8gcHV0cmVxOworICAgICAgICB9CisgICAgICAgIGlmICggaHR0cF9mbmQgPT0gMCApIHsKKyAgICAgICAgICAgIGNsb3NlY29uID0gMTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBnb3RvIHB1dGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBBbnkgcmVzcG9uc2UgZGF0YT8gKi8KKyAgICAgICAgaWYgKCBkZXN0ICYmIGRlc3RbMF0gKSB7CisgICAgICAgICAgICBpZiAoem9wZW5vKFpPRklMRSxkZXN0LE5VTEwsTlVMTCkpCisgICAgICAgICAgICAgICAgemZpbGUgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGNodW5rZWQgKSB7CisgICAgICAgICAgICB3aGlsZSAoKGxlbiA9IGh0dHBfZ2V0X2NodW5rX2xlbigpKSA+IDApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAobGVuICYmIChjaCA9IGh0dHBfaW5jKDApKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgICAgICAgICBpZiAoIHpmaWxlICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHpjaG91dChaT0ZJTEUsKENIQVIpY2gpOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0ZGlvICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm9jKChDSEFSKWNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChjaCA9IGh0dHBfaW5jKDApKSAhPSBDUikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKChjaCA9IGh0dHBfaW5jKDApKSAhPSBMRikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAobGVuICYmIChjaCA9IGh0dHBfaW5jKDApKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICAgICAgaWYgKCB6ZmlsZSApCisgICAgICAgICAgICAgICAgICAgIHpjaG91dChaT0ZJTEUsKENIQVIpY2gpOworICAgICAgICAgICAgICAgIGlmICggc3RkaW8gKQorICAgICAgICAgICAgICAgICAgICBjb25vYygoQ0hBUiljaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHpmaWxlICkKKyAgICAgICAgICAgIHpjbG9zZShaT0ZJTEUpOworCisgICAgICAgIGlmICggY2h1bmtlZCApIHsgICAgICAgICAgICAvKiBQYXJzZSBUcmFpbGluZyBIZWFkZXJzICovCisgICAgICAgICAgICBudWxsbGluZSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoIW51bGxsaW5lICYmIChjaCA9IGh0dHBfaW5jKDApKSA+PSAwICYmIGkgPCBIVFRQQlVGTEVOKSB7CisgICAgICAgICAgICAgICAgYnVmW2ldID0gY2g7CisgICAgICAgICAgICAgICAgaWYgKCBidWZbaV0gPT0gMTAgKSB7IC8qIGZvdW5kIGVuZCBvZiBsaW5lICovCisgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBidWZbaS0xXSA9PSAxMykKKyAgICAgICAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgMSkKKyAgICAgICAgICAgICAgICAgICAgICBudWxsbGluZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiAhbnVsbGxpbmUgJiYgaGRjbnQgPCBIVFRQSEVBRENOVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmhlYWRlcnNbaGRjbnQrK10sYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFja3N0cmNtcChidWYsIkNvbm5lY3Rpb246IiwxMSwwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBja2luZGV4KCJjbG9zZSIsYnVmLDExLDAsMCkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2Vjb24gPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IC0xOworICAgIH0KKworICBwdXRleGl0OgorICAgIGlmICggYXJyYXkgKQorICAgICAgICBodHRwX21rYXJyYXkoaGVhZGVycyxoZGNudCxhcnJheSk7CisKKyAgICBpZiAoY2xvc2Vjb24pCisgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICBmcmVlKHJlcXVlc3QpOworICAgIGZvciAoaSA9IDA7IGkgPCBoZGNudDsgaSsrKSB7CisgICAgICAgIGlmIChoZWFkZXJzW2ldKQorICAgICAgICAgIGZyZWUoaGVhZGVyc1tpXSk7CisgICAgfQorICAgIHJldHVybihyYyk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitodHRwX2RlbGV0ZShjaGFyICogYWdlbnQsIGNoYXIgKiogaGRybGlzdCwgY2hhciAqIHVzZXIsCisgICAgICAgICAgY2hhciAqIHB3ZCwgY2hhciBhcnJheSwgY2hhciAqIHJlbW90ZSkKKyNlbHNlCitodHRwX2RlbGV0ZShhZ2VudCwgaGRybGlzdCwgdXNlciwgcHdkLCBhcnJheSwgcmVtb3RlKQorICAgIGNoYXIgKiBhZ2VudDsgY2hhciAqKiBoZHJsaXN0OyBjaGFyICogdXNlcjsKKyAgICBjaGFyICogcHdkOyBjaGFyIGFycmF5OyBjaGFyICogcmVtb3RlOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgY2hhciAqIHJlcXVlc3Q9TlVMTDsKKyAgICBpbnQgICAgaSwgaiwgbGVuID0gMCwgaGRjbnQgPSAwLCByYyA9IDA7CisgICAgaW50ICAgIGNoOworICAgIGludCAgICBodHRwX2ZuZCA9IDA7CisgICAgY2hhciAgIGJ1ZltIVFRQQlVGTEVOXSwgKnA7CisgICAgaW50ICAgIG51bGxsaW5lOworICAgIHRpbWVfdCBtb2RfdDsKKyAgICB0aW1lX3Qgc3J2X3Q7CisgICAgdGltZV90IGxvY2FsX3Q7CisgICAgY2hhciBwYXNzd2RbNjRdOworICAgIGNoYXIgYjY0aW5bMTI4XTsKKyAgICBjaGFyIGI2NG91dFsyNTZdOworICAgIGNoYXIgKiBoZWFkZXJzW0hUVFBIRUFEQ05UXTsKKyAgICBpbnQgIGNsb3NlY29uID0gMDsKKyAgICBpbnQgIGNodW5rZWQgPSAwOworICAgIGludCAgZmlyc3QgPSAxOworCisgICAgaWYgKGh0dHBmZCA9PSAtMSkKKyAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAoYXJyYXkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEhUVFBIRUFEQ05UOyBpKyspCisgICAgICAgICAgaGVhZGVyc1tpXSA9IE5VTEw7CisgICAgfQorCisgICAgLyogQ29tcHV0ZSBsZW5ndGggb2YgcmVxdWVzdCBoZWFkZXIgKi8KKyAgICBsZW4gPSAxMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogREVMRVRFICovCisgICAgbGVuICs9IHN0cmxlbihIVFRQX1ZFUlNJT04pOworICAgIGxlbiArPSBzdHJsZW4ocmVtb3RlKTsKKyAgICBsZW4gKz0gMTY7CisKKyAgICBpZiAoIGhkcmxpc3QgKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGhkcmxpc3RbaV07IGkrKykKKyAgICAgICAgICAgIGxlbiArPSBzdHJsZW4oaGRybGlzdFtpXSkgKyAyOworICAgIH0KKyAgICBsZW4gKz0gc3RybGVuKGh0dHBfaG9zdF9wb3J0KSArIDg7CisKKyAgICBpZiAoYWdlbnQpCisgICAgICBsZW4gKz0gMTMgKyBzdHJsZW4oYWdlbnQpOworICAgIGlmICh1c2VyKSB7CisgICAgICAgIGlmICghcHdkKSB7CisgICAgICAgICAgICByZWFkcGFzcygiUGFzc3dvcmQ6ICIscGFzc3dkLDY0KTsKKyAgICAgICAgICAgIHB3ZCA9IHBhc3N3ZDsKKyAgICAgICAgfQorICAgICAgICBja21ha21zZyhiNjRpbixzaXplb2YoYjY0aW4pLHVzZXIsIjoiLHB3ZCxOVUxMKTsKKyAgICAgICAgaiA9IGI4dG9iNjQoYjY0aW4sc3RybGVuKGI2NGluKSxiNjRvdXQsMjU2KTsKKyAgICAgICAgbWVtc2V0KHB3ZCwwLHN0cmxlbihwd2QpKTsKKyAgICAgICAgaWYgKGogPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGI2NG91dFtqXSA9ICdcMCc7CisgICAgICAgIGxlbiArPSBqICsgMjQ7CisgICAgfQorICAgIGxlbiArPSAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGU6ICovCisjaWZkZWYgSFRUUF9DTE9TRQorICAgIGxlbiArPSAxOTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbm5lY3Rpb246IGNsb3NlICovCisjZW5kaWYKKyAgICBsZW4gKz0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBibGFuayBsaW5lICsgbnVsbCAqLworCisgICAgcmVxdWVzdCA9IG1hbGxvYyhsZW4pOworICAgIGlmICghcmVxdWVzdCkKKyAgICAgIHJldHVybigtMSk7CisKKyAgICBzcHJpbnRmKHJlcXVlc3QsIkRFTEVURSAlcyAlc1xyXG4iLHJlbW90ZSxIVFRQX1ZFUlNJT04pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJEYXRlOiAiLGxlbik7CisjaWZkZWYgQ01EQVRFMlRNCisgICAgY2tzdHJuY2F0KHJlcXVlc3QsaHR0cF9ub3coKSxsZW4pOworI2Vsc2UKKyAgICBzdHJjYXQocmVxdWVzdCwuLi4pOworI2VuZGlmIC8qIENNREFURTJUTSAqLworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJIb3N0OiAiLCBsZW4pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LGh0dHBfaG9zdF9wb3J0LCBsZW4pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICAgIGlmIChhZ2VudCkgeworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiVXNlci1hZ2VudDogIixsZW4pOworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxhZ2VudCxsZW4pOworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiXHJcbiIsbGVuKTsKKyAgICB9CisgICAgaWYgKHVzZXIpIHsKKyAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsIkF1dGhvcml6YXRpb246IEJhc2ljICIsbGVuKTsKKyAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsYjY0b3V0LGxlbik7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICAgIH0KKyAgICBpZiAoIGhkcmxpc3QgKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGhkcmxpc3RbaV07IGkrKykgeworICAgICAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsaGRybGlzdFtpXSxsZW4pOworICAgICAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgSFRUUF9DTE9TRQorICAgIGNrc3RybmNhdChyZXF1ZXN0LCJDb25uZWN0aW9uOiBjbG9zZVxyXG4iLGxlbik7CisjZW5kaWYKKyAgICBja3N0cm5jYXQocmVxdWVzdCwiXHJcbiIsbGVuKTsKKyAgZGVscmVxOgorICAgIGlmIChodHRwX3RvbCgoQ0hBUiAqKXJlcXVlc3Qsc3RybGVuKHJlcXVlc3QpKSA8IDApCisgICAgeworICAgICAgICBodHRwX2Nsb3NlKCk7CisgICAgICAgIGlmICggZmlyc3QgKSB7CisgICAgICAgICAgICBmaXJzdC0tOworICAgICAgICAgICAgaHR0cF9yZW9wZW4oKTsKKyAgICAgICAgICAgIGdvdG8gZGVscmVxOworICAgICAgICB9CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gZGVsZXhpdDsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIHRoZSByZXNwb25zZSBoZWFkZXJzICovCisgICAgbG9jYWxfdCA9IHRpbWUoTlVMTCk7CisgICAgbnVsbGxpbmUgPSAwOworICAgIGkgPSAwOworICAgIGxlbiA9IC0xOworICAgIHdoaWxlICghbnVsbGxpbmUgJiYgKGNoID0gaHR0cF9pbmMoMCkpID49IDAgJiYgaSA8IEhUVFBCVUZMRU4pIHsKKyAgICAgICAgYnVmW2ldID0gY2g7CisgICAgICAgIGlmIChidWZbaV0gPT0gMTApIHsgICAgICAgICAvKiBmb3VuZCBlbmQgb2YgbGluZSAqLworICAgICAgICAgICAgaWYgKGkgPiAwICYmIGJ1ZltpLTFdID09IDEzKQorICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICBpZiAoaSA8IDEpCisgICAgICAgICAgICAgIG51bGxsaW5lID0gMTsKKyAgICAgICAgICAgIGJ1ZltpXSA9ICdcMCc7CisgICAgICAgICAgICBpZiAoYXJyYXkgJiYgIW51bGxsaW5lICYmIGhkY250IDwgSFRUUEhFQURDTlQpCisgICAgICAgICAgICAgICAgbWFrZXN0cigmaGVhZGVyc1toZGNudCsrXSxidWYpOworICAgICAgICAgICAgaWYgKCFja3N0cmNtcChidWYsIkhUVFAiLDQsMCkpIHsKKyAgICAgICAgICAgICAgICBodHRwX2ZuZCA9IDE7CisgICAgICAgICAgICAgICAgaiA9IGNraW5kZXgoIiAiLGJ1ZiwwLDAsMCk7CisgICAgICAgICAgICAgICAgcCA9ICZidWZbal07CisgICAgICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKnApKQorICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgIHN3aXRjaCAocFswXSkgeworICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6ICAgICAgICAgICAgIC8qIEluZm9ybWF0aW9uYWwgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgJzInOiAgICAgICAgICAgICAvKiBTdWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAnMyc6ICAgICAgICAgICAgIC8qIFJlZGlyZWN0aW9uICovCisgICAgICAgICAgICAgICAgICBjYXNlICc0JzogICAgICAgICAgICAgLyogQ2xpZW50IGZhaWx1cmUgKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgJzUnOiAgICAgICAgICAgICAvKiBTZXJ2ZXIgZmFpbHVyZSAqLworICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgIC8qIFVua25vd24gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFxdWlldCkKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkZhaWx1cmU6IFNlcnZlciByZXBvcnRzICVzXG4iLHApOworICAgICAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBodHRwX3NldF9jb2RlX3JlcGx5KHApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNrc3RyY21wKGJ1ZiwiQ29ubmVjdGlvbjoiLDExLDApKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggY2tpbmRleCgiY2xvc2UiLGJ1ZiwxMSwwLDApICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2Vjb24gPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNrc3RyY21wKGJ1ZiwiQ29udGVudC1MZW5ndGg6IiwxNSwwKSkgeworICAgICAgICAgICAgICAgICAgICBsZW4gPSBhdG9pKCZidWZbMTZdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFja3N0cmNtcChidWYsIlRyYW5zZmVyLUVuY29kaW5nOiIsMTgsMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBja2luZGV4KCJjaHVua2VkIixidWYsMTgsMCwwKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGYoIiVzXG4iLGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY2ggPCAwICYmIGZpcnN0KSB7CisgICAgICAgIGZpcnN0LS07CisgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICAgICAgaHR0cF9yZW9wZW4oKTsKKyAgICAgICAgZ290byBkZWxyZXE7CisgICAgfQorICAgIGlmICggaHR0cF9mbmQgPT0gMCApIHsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgY2xvc2Vjb24gPSAxOworICAgICAgICBnb3RvIGRlbGV4aXQ7CisgICAgfQorCisgICAgLyogQW55IHJlc3BvbnNlIGRhdGE/ICovCisgICAgaWYgKCBjaHVua2VkICkgeworICAgICAgICB3aGlsZSAoKGxlbiA9IGh0dHBfZ2V0X2NodW5rX2xlbigpKSA+IDApIHsKKyAgICAgICAgICAgIHdoaWxlIChsZW4gJiYgKGNoID0gaHR0cF9pbmMoMCkpID49IDApIHsKKyAgICAgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgICAgICBjb25vYygoQ0hBUiljaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNoID0gaHR0cF9pbmMoMCkpICE9IENSKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKChjaCA9IGh0dHBfaW5jKDApKSAhPSBMRikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChsZW4gJiYgKGNoID0gaHR0cF9pbmMoMCkpID49IDApIHsKKyAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgY29ub2MoKENIQVIpY2gpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBjaHVua2VkICkgeyAgICAgICAgICAgIC8qIFBhcnNlIFRyYWlsaW5nIEhlYWRlcnMgKi8KKyAgICAgICAgbnVsbGxpbmUgPSAwOworICAgICAgICB3aGlsZSAoIW51bGxsaW5lICYmIChjaCA9IGh0dHBfaW5jKDApKSA+PSAwICYmIGkgPCBIVFRQQlVGTEVOKSB7CisgICAgICAgICAgICBidWZbaV0gPSBjaDsKKyAgICAgICAgICAgIGlmICggYnVmW2ldID09IDEwICkgeyAvKiBmb3VuZCBlbmQgb2YgbGluZSAqLworICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBidWZbaS0xXSA9PSAxMykKKyAgICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IDEpCisgICAgICAgICAgICAgICAgICBudWxsbGluZSA9IDE7CisgICAgICAgICAgICAgICAgYnVmW2ldID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXkgJiYgIW51bGxsaW5lICYmIGhkY250IDwgSFRUUEhFQURDTlQpCisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmhlYWRlcnNbaGRjbnQrK10sYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNrc3RyY21wKGJ1ZiwiQ29ubmVjdGlvbjoiLDExLDApKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggY2tpbmRleCgiY2xvc2UiLGJ1ZiwxMSwwLDApICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2Vjb24gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIGRlbGV4aXQ6CisgICAgaWYgKGFycmF5KQorICAgICAgICBodHRwX21rYXJyYXkoaGVhZGVycyxoZGNudCxhcnJheSk7CisKKyAgICBpZiAoY2xvc2Vjb24pCisgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICBmcmVlKHJlcXVlc3QpOworICAgIGZvciAoaSA9IDA7IGkgPCBoZGNudDsgaSsrKSB7CisgICAgICAgIGlmIChoZWFkZXJzW2ldKQorICAgICAgICAgIGZyZWUoaGVhZGVyc1tpXSk7CisgICAgfQorICAgIHJldHVybihyYyk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitodHRwX3Bvc3QoY2hhciAqIGFnZW50LCBjaGFyICoqIGhkcmxpc3QsIGNoYXIgKiBtaW1lLCBjaGFyICogdXNlciwKKyAgICAgICAgICBjaGFyICogcHdkLCBjaGFyIGFycmF5LCBjaGFyICogbG9jYWwsIGNoYXIgKiByZW1vdGUsCisgICAgICAgICAgY2hhciAqIGRlc3QsIGludCBzdGRpbykKKyNlbHNlCitodHRwX3Bvc3QoYWdlbnQsIGhkcmxpc3QsIG1pbWUsIHVzZXIsIHB3ZCwgYXJyYXksIGxvY2FsLCByZW1vdGUsIGRlc3QsCisgICAgICAgICAgc3RkaW8pCisgICAgY2hhciAqIGFnZW50OyBjaGFyICoqIGhkcmxpc3Q7IGNoYXIgKiBtaW1lOyBjaGFyICogdXNlcjsKKyAgICBjaGFyICogcHdkOyBjaGFyIGFycmF5OyBjaGFyICogbG9jYWw7IGNoYXIgKiByZW1vdGU7IGNoYXIgKiBkZXN0OworICAgIGludCBzdGRpbzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGNoYXIgKiByZXF1ZXN0PU5VTEw7CisgICAgaW50ICAgIGksIGosIGxlbiA9IDAsIGhkY250ID0gMCwgcmMgPSAwOworICAgIGludCAgICBjaDsKKyAgICBpbnQgICAgaHR0cF9mbmQgPSAwOworICAgIGNoYXIgICBidWZbSFRUUEJVRkxFTl0sICpwOworICAgIGludCAgICBudWxsbGluZTsKKyAgICB0aW1lX3QgbW9kX3Q7CisgICAgdGltZV90IHNydl90OworICAgIHRpbWVfdCBsb2NhbF90OworICAgIGNoYXIgcGFzc3dkWzY0XTsKKyAgICBjaGFyIGI2NGluWzEyOF07CisgICAgY2hhciBiNjRvdXRbMjU2XTsKKyAgICBpbnQgIGZpbGVsZW47CisgICAgY2hhciAqIGhlYWRlcnNbSFRUUEhFQURDTlRdOworICAgIGludCAgY2xvc2Vjb24gPSAwOworICAgIGludCAgY2h1bmtlZCA9IDA7CisgICAgaW50ICB6ZmlsZSA9IDA7CisgICAgaW50ICBmaXJzdCA9IDE7CisKKyAgICBpZiAoaHR0cGZkID09IC0xKQorICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmIChhcnJheSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSFRUUEhFQURDTlQ7IGkrKykKKyAgICAgICAgICBoZWFkZXJzW2ldID0gTlVMTDsKKyAgICB9CisgICAgZmlsZWxlbiA9IHpjaGtpKGxvY2FsKTsKKyAgICBpZiAoZmlsZWxlbiA8IDApCisgICAgICByZXR1cm4oLTEpOworCisgICAgLyogQ29tcHV0ZSBsZW5ndGggb2YgcmVxdWVzdCBoZWFkZXIgKi8KKyAgICBsZW4gPSA5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQT1NUICovCisgICAgbGVuICs9IHN0cmxlbihIVFRQX1ZFUlNJT04pOworICAgIGxlbiArPSBzdHJsZW4ocmVtb3RlKTsKKyAgICBsZW4gKz0gMTY7CisKKyAgICBpZiAoIGhkcmxpc3QgKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGhkcmxpc3RbaV07IGkrKykKKyAgICAgICAgICAgIGxlbiArPSBzdHJsZW4oaGRybGlzdFtpXSkgKyAyOworICAgIH0KKyAgICBsZW4gKz0gc3RybGVuKGh0dHBfaG9zdF9wb3J0KSArIDg7CisKKyAgICBpZiAoYWdlbnQpCisgICAgICBsZW4gKz0gMTMgKyBzdHJsZW4oYWdlbnQpOworICAgIGlmICh1c2VyKSB7CisgICAgICAgIGlmICghcHdkKSB7CisgICAgICAgICAgICByZWFkcGFzcygiUGFzc3dvcmQ6ICIscGFzc3dkLDY0KTsKKyAgICAgICAgICAgIHB3ZCA9IHBhc3N3ZDsKKyAgICAgICAgfQorICAgICAgICBja21ha21zZyhiNjRpbixzaXplb2YoYjY0aW4pLHVzZXIsIjoiLHB3ZCxOVUxMKTsKKyAgICAgICAgaiA9IGI4dG9iNjQoYjY0aW4sc3RybGVuKGI2NGluKSxiNjRvdXQsMjU2KTsKKyAgICAgICAgbWVtc2V0KHB3ZCwwLHN0cmxlbihwd2QpKTsKKyAgICAgICAgaWYgKGogPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGI2NG91dFtqXSA9ICdcMCc7CisgICAgICAgIGxlbiArPSBqICsgMjQ7CisgICAgfQorICAgIGxlbiArPSAxNiArIHN0cmxlbihtaW1lKTsgICAgICAgICAgIC8qIENvbnRlbnQtdHlwZTogKi8KKyAgICBsZW4gKz0gMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250ZW50LWxlbmd0aDogKi8KKyAgICBsZW4gKz0gMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRlOiAqLworI2lmZGVmIEhUVFBfQ0xPU0UKKyAgICBsZW4gKz0gMTk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb25uZWN0aW9uOiBjbG9zZSAqLworI2VuZGlmCisgICAgbGVuICs9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmxhbmsgbGluZSArIG51bGwgKi8KKworICAgIHJlcXVlc3QgPSBtYWxsb2MobGVuKTsKKyAgICBpZiAoIXJlcXVlc3QpCisgICAgICByZXR1cm4oLTEpOworCisgICAgc3ByaW50ZihyZXF1ZXN0LCJQT1NUICVzICVzXHJcbiIscmVtb3RlLEhUVFBfVkVSU0lPTik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIkRhdGU6ICIsbGVuKTsKKyAgICBja3N0cm5jYXQocmVxdWVzdCxodHRwX25vdygpLGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIkhvc3Q6ICIsIGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsaHR0cF9ob3N0X3BvcnQsIGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgaWYgKGFnZW50KSB7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LCJVc2VyLWFnZW50OiAiLGxlbik7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LGFnZW50LGxlbik7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICAgIH0KKyAgICBpZiAodXNlcikgeworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiQXV0aG9yaXphdGlvbjogQmFzaWMgIixsZW4pOworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxiNjRvdXQsbGVuKTsKKyAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgfQorICAgIGlmICggaGRybGlzdCApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaGRybGlzdFtpXTsgaSsrKSB7CisgICAgICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxoZHJsaXN0W2ldLGxlbik7CisgICAgICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiXHJcbiIsbGVuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBja3N0cm5jYXQocmVxdWVzdCwiQ29udGVudC10eXBlOiAiLGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsbWltZSxsZW4pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworI2lmZGVmIEhUVFBfQ0xPU0UKKyAgICBja3N0cm5jYXQocmVxdWVzdCwiQ29ubmVjdGlvbjogY2xvc2VcclxuIixsZW4pOworI2VuZGlmCisgICAgc3ByaW50ZihidWYsIkNvbnRlbnQtbGVuZ3RoOiAlZFxyXG4iLGZpbGVsZW4pOyAvKiBzYWZlICovCisgICAgY2tzdHJuY2F0KHJlcXVlc3QsYnVmLGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisKKyAgICAvKiBOb3cgd2UgaGF2ZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgKi8KKyAgcG9zdG9wZW46CisgICAgaWYgKHpvcGVuaShaSUZJTEUsbG9jYWwpKSB7CisgICAgICBwb3N0cmVxOgorICAgICAgICBpZiAoaHR0cF90b2woKENIQVIgKilyZXF1ZXN0LHN0cmxlbihyZXF1ZXN0KSkgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBodHRwX2Nsb3NlKCk7CisgICAgICAgICAgICBpZiAoIGZpcnN0ICkgeworICAgICAgICAgICAgICAgIGZpcnN0LS07CisgICAgICAgICAgICAgICAgaHR0cF9yZW9wZW4oKTsKKyAgICAgICAgICAgICAgICBnb3RvIHBvc3RyZXE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgemNsb3NlKFpJRklMRSk7CisgICAgICAgICAgICBnb3RvIHBvc3RleGl0OworICAgICAgICB9CisKKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlICh6Y2hpbihaSUZJTEUsJmNoKSA9PSAwKSB7CisgICAgICAgICAgICBidWZbaSsrXSA9IGNoOworICAgICAgICAgICAgaWYgKGkgPT0gSFRUUEJVRkxFTikgeworICAgICAgICAgICAgICAgIGh0dHBfdG9sKChDSEFSICopYnVmLEhUVFBCVUZMRU4pOworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICBodHRwX3RvbCgoQ0hBUiAqKWJ1ZixIVFRQQlVGTEVOKTsKKyAgICAgICAgemNsb3NlKFpJRklMRSk7CisKKyAgICAgICAgLyogUHJvY2VzcyB0aGUgcmVzcG9uc2UgaGVhZGVycyAqLworICAgICAgICBsb2NhbF90ID0gdGltZShOVUxMKTsKKyAgICAgICAgbnVsbGxpbmUgPSAwOworICAgICAgICBpID0gMDsKKyAgICAgICAgbGVuID0gLTE7CisgICAgICAgIHdoaWxlICghbnVsbGxpbmUgJiYgKGNoID0gaHR0cF9pbmMoMCkpID49IDAgJiYgaSA8IEhUVFBCVUZMRU4pIHsKKyAgICAgICAgICAgIGJ1ZltpXSA9IGNoOworICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAxMCkgeyAgICAgICAgIC8qIGZvdW5kIGVuZCBvZiBsaW5lICovCisgICAgICAgICAgICAgICAgaWYgKGkgPiAwICYmIGJ1ZltpLTFdID09IDEzKQorICAgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgIGlmIChpIDwgMSkKKyAgICAgICAgICAgICAgICAgIG51bGxsaW5lID0gMTsKKyAgICAgICAgICAgICAgICBidWZbaV0gPSAnXDAnOworICAgICAgICAgICAgICAgIGlmIChhcnJheSAmJiAhbnVsbGxpbmUgJiYgaGRjbnQgPCBIVFRQSEVBRENOVCkKKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmhlYWRlcnNbaGRjbnQrK10sYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNrc3RyY21wKGJ1ZiwiSFRUUCIsNCwwKSkgeworICAgICAgICAgICAgICAgICAgICBodHRwX2ZuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGogPSBja2luZGV4KCIgIixidWYsMCwwLDApOworICAgICAgICAgICAgICAgICAgICBwID0gJmJ1ZltqXTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKnApKQorICAgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwWzBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6ICAgICAgICAgLyogSW5mb3JtYXRpb25hbCBtZXNzYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlICcyJzogICAgICAgICAvKiBTdWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlICczJzogICAgICAgICAvKiBSZWRpcmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzQnOiAgICAgICAgIC8qIENsaWVudCBmYWlsdXJlICovCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNSc6ICAgICAgICAgLyogU2VydmVyIGZhaWx1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAvKiBVbmtub3duICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkZhaWx1cmU6IFNlcnZlciByZXBvcnRzICVzXG4iLHApOworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBodHRwX3NldF9jb2RlX3JlcGx5KHApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2tzdHJjbXAoYnVmLCJDb25uZWN0aW9uOiIsMTEsMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2tpbmRleCgiY2xvc2UiLGJ1ZiwxMSwwLDApICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlY29uID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2tzdHJjbXAoYnVmLCJDb250ZW50LUxlbmd0aDoiLDE1LDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBhdG9pKCZidWZbMTZdKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2tzdHJjbXAoYnVmLCJUcmFuc2Zlci1FbmNvZGluZzoiLDE4LDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNraW5kZXgoImNodW5rZWQiLGJ1ZiwxOCwwLDApICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rZWQgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGRpbykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIsYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2ggPCAwICYmIGZpcnN0KSB7CisgICAgICAgICAgICBmaXJzdC0tOworICAgICAgICAgICAgaHR0cF9jbG9zZSgpOworICAgICAgICAgICAgaHR0cF9yZW9wZW4oKTsKKyAgICAgICAgICAgIGdvdG8gcG9zdG9wZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGh0dHBfZm5kID09IDApIHsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBjbG9zZWNvbiA9IDE7CisgICAgICAgICAgICBnb3RvIHBvc3RleGl0OworICAgICAgICB9CisKKyAgICAgICAgLyogQW55IHJlc3BvbnNlIGRhdGE/ICovCisgICAgICAgIGlmICggZGVzdCAmJiBkZXN0WzBdICkgeworICAgICAgICAgICAgaWYgKHpvcGVubyhaT0ZJTEUsZGVzdCxOVUxMLE5VTEwpKQorICAgICAgICAgICAgICAgIHpmaWxlID0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBjaHVua2VkICkgeworICAgICAgICAgICAgd2hpbGUgKChsZW4gPSBodHRwX2dldF9jaHVua19sZW4oKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiAmJiAoY2ggPSBodHRwX2luYygwKSkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB6ZmlsZSApCisgICAgICAgICAgICAgICAgICAgICAgICB6Y2hvdXQoWk9GSUxFLChDSEFSKWNoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGRpbyApCisgICAgICAgICAgICAgICAgICAgICAgICBjb25vYygoQ0hBUiljaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoY2ggPSBodHRwX2luYygwKSkgIT0gQ1IpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICgoY2ggPSBodHRwX2luYygwKSkgIT0gTEYpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2hpbGUgKGxlbiAmJiAoY2ggPSBodHRwX2luYygwKSkgPj0gMCkgeworICAgICAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgICAgIGlmICggemZpbGUgKQorICAgICAgICAgICAgICAgICAgICB6Y2hvdXQoWk9GSUxFLChDSEFSKWNoKTsKKyAgICAgICAgICAgICAgICBpZiAoIHN0ZGlvICkKKyAgICAgICAgICAgICAgICAgICAgY29ub2MoKENIQVIpY2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCB6ZmlsZSApCisgICAgICAgICAgICB6Y2xvc2UoWk9GSUxFKTsKKworICAgICAgICBpZiAoIGNodW5rZWQgKSB7ICAgICAgICAgICAgLyogUGFyc2UgVHJhaWxpbmcgSGVhZGVycyAqLworICAgICAgICAgICAgbnVsbGxpbmUgPSAwOworICAgICAgICAgICAgd2hpbGUgKCFudWxsbGluZSAmJiAoY2ggPSBodHRwX2luYygwKSkgPj0gMCAmJiBpIDwgSFRUUEJVRkxFTikgeworICAgICAgICAgICAgICAgIGJ1ZltpXSA9IGNoOworICAgICAgICAgICAgICAgIGlmICggYnVmW2ldID09IDEwICkgeyAvKiBmb3VuZCBlbmQgb2YgbGluZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgYnVmW2ktMV0gPT0gMTMpCisgICAgICAgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDEpCisgICAgICAgICAgICAgICAgICAgICAgbnVsbGxpbmUgPSAxOworICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXkgJiYgIW51bGxsaW5lICYmIGhkY250IDwgSFRUUEhFQURDTlQpCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZoZWFkZXJzW2hkY250KytdLGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2tzdHJjbXAoYnVmLCJDb25uZWN0aW9uOiIsMTEsMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2tpbmRleCgiY2xvc2UiLGJ1ZiwxMSwwLDApICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlY29uID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisKKyAgcG9zdGV4aXQ6CisgICAgaWYgKGFycmF5KQorICAgICAgICBodHRwX21rYXJyYXkoaGVhZGVycyxoZGNudCxhcnJheSk7CisgICAgaWYgKGNsb3NlY29uKQorICAgICAgICBodHRwX2Nsb3NlKCk7CisgICAgZnJlZShyZXF1ZXN0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGRjbnQ7IGkrKykgeworICAgICAgICBpZiAoaGVhZGVyc1tpXSkKKyAgICAgICAgICBmcmVlKGhlYWRlcnNbaV0pOworICAgIH0KKyAgICByZXR1cm4ocmMpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworaHR0cF9jb25uZWN0KGludCBzb2NrZXQsIGNoYXIgKiBhZ2VudCwgY2hhciAqKiBoZHJsaXN0LCBjaGFyICogdXNlciwKKyAgICAgICAgICAgICBjaGFyICogcHdkLCBjaGFyIGFycmF5LCBjaGFyICogaG9zdF9wb3J0KQorI2Vsc2UKK2h0dHBfY29ubmVjdChzb2NrZXQsIGFnZW50LCBoZHJsaXN0LCB1c2VyLCBwd2QsIGFycmF5LCBob3N0X3BvcnQpCisgICAgaW50IHNvY2tldDsKKyAgICBjaGFyICogYWdlbnQ7IGNoYXIgKiogaGRybGlzdDsgY2hhciAqIHVzZXI7CisgICAgY2hhciAqIHB3ZDsgY2hhciBhcnJheTsgY2hhciAqIGhvc3RfcG9ydDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGNoYXIgKiByZXF1ZXN0PU5VTEw7CisgICAgaW50ICAgIGksIGosIGxlbiA9IDAsIGhkY250ID0gMCwgcmMgPSAwOworICAgIGludCAgICBodHRwX2ZuZCA9IDA7CisgICAgY2hhciAgIGJ1ZltIVFRQQlVGTEVOXSwgKnAsIGNoOworICAgIGludCAgICBudWxsbGluZTsKKyAgICB0aW1lX3QgbW9kX3Q7CisgICAgdGltZV90IHNydl90OworICAgIHRpbWVfdCBsb2NhbF90OworICAgIGNoYXIgcGFzc3dkWzY0XTsKKyAgICBjaGFyIGI2NGluWzEyOF07CisgICAgY2hhciBiNjRvdXRbMjU2XTsKKyAgICBjaGFyICogaGVhZGVyc1tIVFRQSEVBRENOVF07CisgICAgaW50ICAgIGNvbm5lY3RlZCA9IDA7CisgICAgaW50ICAgIGNodW5rZWQgPSAwOworCisgICAgdGNwX2h0dHBfcHJveHlfZXJybm8gPSAwOworCisgICAgaWYgKHNvY2tldCA9PSAtMSkKKyAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAoYXJyYXkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEhUVFBIRUFEQ05UOyBpKyspCisgICAgICAgICAgaGVhZGVyc1tpXSA9IE5VTEw7CisgICAgfQorCisgICAgLyogQ29tcHV0ZSBsZW5ndGggb2YgcmVxdWVzdCBoZWFkZXIgKi8KKyAgICBsZW4gPSAxMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ09OTkVDVCAqLworICAgIGxlbiArPSBzdHJsZW4oSFRUUF9WRVJTSU9OKTsKKyAgICBsZW4gKz0gc3RybGVuKGhvc3RfcG9ydCk7CisgICAgbGVuICs9IChpbnQpIHN0cmxlbihodHRwX2hvc3RfcG9ydCkgKyA4OworICAgIGxlbiArPSAxNjsKKyAgICBsZW4gKz0gc3RybGVuKCJQcm94eS1Db25uZWN0aW9uOiBLZWVwLUFsaXZlXHJcbiIpOworICAgIGlmICggaGRybGlzdCApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaGRybGlzdFtpXTsgaSsrKQorICAgICAgICAgICAgbGVuICs9IHN0cmxlbihoZHJsaXN0W2ldKSArIDI7CisgICAgfQorICAgIGlmIChhZ2VudCAmJiBhZ2VudFswXSkKKyAgICAgIGxlbiArPSAxMyArIHN0cmxlbihhZ2VudCk7CisgICAgaWYgKHVzZXIgJiYgdXNlclswXSkgeworICAgICAgICBpZiAoIXB3ZCkgeworICAgICAgICAgICAgcmVhZHBhc3MoIlBhc3N3b3JkOiAiLHBhc3N3ZCw2NCk7CisgICAgICAgICAgICBwd2QgPSBwYXNzd2Q7CisgICAgICAgIH0KKyAgICAgICAgY2ttYWttc2coYjY0aW4sc2l6ZW9mKGI2NGluKSx1c2VyLCI6Iixwd2QsTlVMTCk7CisgICAgICAgIGogPSBiOHRvYjY0KGI2NGluLHN0cmxlbihiNjRpbiksYjY0b3V0LDI1Nik7CisgICAgICAgIG1lbXNldChwd2QsMCxzdHJsZW4ocHdkKSk7CisgICAgICAgIGlmIChqIDwgMCkKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBiNjRvdXRbal0gPSAnXDAnOworICAgICAgICBsZW4gKz0gaiArIDcyOworICAgIH0KKyAgICBsZW4gKz0gMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRlOiAqLworICAgIGxlbiArPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJsYW5rIGxpbmUgKyBudWxsICovCisKKyAgICByZXF1ZXN0ID0gbWFsbG9jKGxlbik7CisgICAgaWYgKCFyZXF1ZXN0KQorICAgICAgcmV0dXJuKC0xKTsKKworICAgIHNwcmludGYocmVxdWVzdCwiQ09OTkVDVCAlcyAlc1xyXG4iLGhvc3RfcG9ydCxIVFRQX1ZFUlNJT04pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJEYXRlOiAiLGxlbik7CisjaWZkZWYgQ01EQVRFMlRNCisgICAgY2tzdHJuY2F0KHJlcXVlc3QsaHR0cF9ub3coKSxsZW4pOworI2Vsc2UKKyAgICBzdHJjYXQocmVxdWVzdCwuLi4pOworI2VuZGlmIC8qIENNREFURTJUTSAqLworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJIb3N0OiAiLCBsZW4pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LGh0dHBfaG9zdF9wb3J0LCBsZW4pOworICAgIGNrc3RybmNhdChyZXF1ZXN0LCJcclxuIixsZW4pOworICAgIGlmIChhZ2VudCAmJiBhZ2VudFswXSkgeworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiVXNlci1hZ2VudDogIixsZW4pOworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxhZ2VudCxsZW4pOworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiXHJcbiIsbGVuKTsKKyAgICB9CisgICAgaWYgKHVzZXIgJiYgdXNlclswXSkgeworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiUHJveHktYXV0aG9yaXphdGlvbjogQmFzaWMgIixsZW4pOworICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxiNjRvdXQsbGVuKTsKKyAgICAgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlxyXG4iLGxlbik7CisgICAgICAgIGNrc3RybmNhdChyZXF1ZXN0LCJFeHRlbnNpb246IFNlY3VyaXR5L1JlbW90ZS1QYXNzcGhyYXNlXHJcbiIsbGVuKTsKKyAgICB9CisgICAgY2tzdHJuY2F0KHJlcXVlc3QsIlByb3h5LUNvbm5lY3Rpb246IEtlZXAtQWxpdmVcclxuIixsZW4pOworICAgIGlmICggaGRybGlzdCApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaGRybGlzdFtpXTsgaSsrKSB7CisgICAgICAgICAgICBja3N0cm5jYXQocmVxdWVzdCxoZHJsaXN0W2ldLGxlbik7CisgICAgICAgICAgICBja3N0cm5jYXQocmVxdWVzdCwiXHJcbiIsbGVuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBja3N0cm5jYXQocmVxdWVzdCwiXHJcbiIsbGVuKTsKKyAgICBsZW4gPSBzdHJsZW4ocmVxdWVzdCk7CisKKyNpZmRlZiBUQ1BJUExJQgorICAgIC8qIFNlbmQgcmVxdWVzdCAqLworICAgIGlmIChzb2NrZXRfd3JpdGUoc29ja2V0LChDSEFSICopcmVxdWVzdCxzdHJsZW4ocmVxdWVzdCkpIDwgMCkgeworICAgICAgcmMgPSAtMTsKKyAgICAgIGdvdG8gY29ubmV4aXQ7CisgICAgfQorI2Vsc2UKKyAgICBpZiAod3JpdGUoc29ja2V0LChDSEFSICopcmVxdWVzdCxzdHJsZW4ocmVxdWVzdCkpIDwgMCkgeyAvKiBTZW5kIHJlcXVlc3QgKi8KKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBjb25uZXhpdDsKKyAgICB9CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKworICAgIC8qIFByb2Nlc3MgdGhlIHJlc3BvbnNlIGhlYWRlcnMgKi8KKyAgICBsb2NhbF90ID0gdGltZShOVUxMKTsKKyAgICBudWxsbGluZSA9IDA7CisgICAgaSA9IDA7CisgICAgd2hpbGUgKCFudWxsbGluZSAmJgorI2lmZGVmIFRDUElQTElCCisgICAgICAgICAgIChzb2NrZXRfcmVhZChzb2NrZXQsJmNoLDEpID09IDEpICYmCisjZWxzZQorICAgICAgICAgICAocmVhZChzb2NrZXQsJmNoLDEpID09IDEpICYmCisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgaSA8IEhUVFBCVUZMRU4pIHsKKyAgICAgICAgYnVmW2ldID0gY2g7CisgICAgICAgIGlmIChidWZbaV0gPT0gMTApIHsgICAgICAgICAvKiBmb3VuZCBlbmQgb2YgbGluZSAqLworICAgICAgICAgICAgaWYgKGkgPiAwICYmIGJ1ZltpLTFdID09IDEzKQorICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICBpZiAoaSA8IDEpCisgICAgICAgICAgICAgIG51bGxsaW5lID0gMTsKKyAgICAgICAgICAgIGJ1ZltpXSA9ICdcMCc7CisKKyAgICAgICAgICAgIGlmIChhcnJheSAmJiAhbnVsbGxpbmUgJiYgaGRjbnQgPCBIVFRQSEVBRENOVCkKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZoZWFkZXJzW2hkY250KytdLGJ1Zik7CisgICAgICAgICAgICBpZiAoIWNrc3RyY21wKGJ1ZiwiSFRUUCIsNCwwKSkgeworICAgICAgICAgICAgICAgIGh0dHBfZm5kID0gMTsKKyAgICAgICAgICAgICAgICBqID0gY2tpbmRleCgiICIsYnVmLDAsMCwwKTsKKyAgICAgICAgICAgICAgICBwID0gJmJ1ZltqXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXNzcGFjZSgqcCkpCisgICAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgdGNwX2h0dHBfcHJveHlfZXJybm8gPSBhdG9pKHApOworICAgICAgICAgICAgICAgIHN3aXRjaCAocFswXSkgeworICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6ICAgICAgICAgICAgIC8qIEluZm9ybWF0aW9uYWwgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgJzInOiAgICAgICAgICAgICAvKiBTdWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAnMyc6ICAgICAgICAgICAgIC8qIFJlZGlyZWN0aW9uICovCisgICAgICAgICAgICAgICAgICBjYXNlICc0JzogICAgICAgICAgICAgLyogQ2xpZW50IGZhaWx1cmUgKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgJzUnOiAgICAgICAgICAgICAvKiBTZXJ2ZXIgZmFpbHVyZSAqLworICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgIC8qIFVua25vd24gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFxdWlldCkKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkZhaWx1cmU6IFNlcnZlciByZXBvcnRzICVzXG4iLHApOworICAgICAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBodHRwX3NldF9jb2RlX3JlcGx5KHApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzXG4iLGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIGh0dHBfZm5kID09IDAgKQorICAgICAgICByYyA9IC0xOworCisgICAgaWYgKGFycmF5KQorICAgICAgICBodHRwX21rYXJyYXkoaGVhZGVycyxoZGNudCxhcnJheSk7CisKKyAgY29ubmV4aXQ6CisgICAgaWYgKCAhY29ubmVjdGVkICkgeworICAgICAgICBpZiAoIHNvY2tldCA9PSB0dHlmZCApIHsKKyAgICAgICAgICAgIHR0Y2xvcygwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc29ja2V0ID09IGh0dHBmZCApIHsKKyAgICAgICAgICAgIGh0dHBfY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZyZWUocmVxdWVzdCk7CisgICAgZm9yIChpID0gMDsgaSA8IGhkY250OyBpKyspIHsKKyAgICAgICAgaWYgKGhlYWRlcnNbaV0pCisgICAgICAgICAgZnJlZShoZWFkZXJzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuKHJjKTsKK30KKyNlbmRpZiAvKiBOT0hUVFAgKi8KKworI2lmZGVmIENLX0ROU19TUlYKKworI2RlZmluZSBJTkNSX0NIRUNLKHgseSkgeCArPSB5OyBpZiAoeCA+IHNpemUgKyBhbnN3ZXIuYnl0ZXMpIGdvdG8gZG5zb3V0CisjZGVmaW5lIENIRUNLKHgseSkgaWYgKHggKyB5ID4gc2l6ZSArIGFuc3dlci5ieXRlcykgZ290byBkbnNvdXQKKyNkZWZpbmUgTlRPSFNQKHgseSkgeFswXSA8PCA4IHwgeFsxXTsgeCArPSB5CisKKyNpZm5kZWYgQ0tRVUVSWVRZUEUKKyNpZmRlZiBVTklYV0FSRQorI2lmbmRlZiBVVzcKKyNkZWZpbmUgQ0tRVUVSWVRZUEUgQ0hBUgorI2VuZGlmIC8qIFVXNyAqLworI2VuZGlmIC8qIFVOSVhXQVJFICovCisjZW5kaWYgLyogQ0tRVUVSWVRZUEUgKi8KKworI2lmbmRlZiBDS1FVRVJZVFlQRQorI2RlZmluZSBDS1FVRVJZVFlQRSBjaGFyCisjZW5kaWYgLyogQ0tRVUVSWVRZUEUgKi8KKworLyogMSBpcyBzdWNjZXNzLCAwIGlzIGZhaWx1cmUgKi8KK2ludAorbG9jYXRlX3Nydl9kbnMoaG9zdCwgc2VydmljZSwgcHJvdG9jb2wsIGFkZHJfcHAsIG5hZGRycykKKyAgICBjaGFyICpob3N0OworICAgIGNoYXIgKnNlcnZpY2U7CisgICAgY2hhciAqcHJvdG9jb2w7CisgICAgc3RydWN0IHNvY2thZGRyICoqYWRkcl9wcDsKKyAgICBpbnQgKm5hZGRyczsKK3sKKyAgICBpbnQgbm91dCwgaiwgY291bnQ7CisgICAgdW5pb24geworICAgICAgICB1bnNpZ25lZCBjaGFyIGJ5dGVzWzIwNDhdOworICAgICAgICBIRUFERVIgaGRyOworICAgIH0gYW5zd2VyOworICAgIHVuc2lnbmVkIGNoYXIgKnA9TlVMTDsKKyAgICBDS1FVRVJZVFlQRSBxdWVyeVtNQVhfRE5TX05BTUVMRU5dOworI2lmZGVmIENLX0FOU0lDCisgICAgY29uc3QgY2hhciAqIGg7CisjZWxzZQorICAgIGNoYXIgKiBoOworI2VuZGlmIC8qIENLX0FOU0lDICovCisgICAgc3RydWN0IHNvY2thZGRyICphZGRyID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IE5VTEw7CisgICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKKyAgICBpbnQgdHlwZSwgY2xhc3M7CisgICAgaW50IHByaW9yaXR5LCB3ZWlnaHQsIHNpemUsIGxlbiwgbnVtYW5zd2VycywgbnVtcXVlcmllcywgcmRsZW47CisgICAgdW5zaWduZWQgc2hvcnQgcG9ydDsKKyNpZmRlZiBDS19BTlNJQworICAgIGNvbnN0CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyAgICAgIGludCBoZHJzaXplID0gc2l6ZW9mKEhFQURFUik7CisgICAgc3RydWN0IHNydl9kbnNfZW50cnkgeworICAgICAgICBzdHJ1Y3Qgc3J2X2Ruc19lbnRyeSAqbmV4dDsKKyAgICAgICAgaW50IHByaW9yaXR5OworICAgICAgICBpbnQgd2VpZ2h0OworICAgICAgICB1bnNpZ25lZCBzaG9ydCBwb3J0OworICAgICAgICBjaGFyICpob3N0OworICAgIH07CisgICAgc3RydWN0IHNydl9kbnNfZW50cnkgKmhlYWQgPSBOVUxMOworICAgIHN0cnVjdCBzcnZfZG5zX2VudHJ5ICpzcnYgPSBOVUxMLCAqZW50cnkgPSBOVUxMOworICAgIGNoYXIgKiBzID0gTlVMTDsKKworICAgIG5vdXQgPSAwOworICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisgICAgaWYgKGFkZHIgPT0gTlVMTCkKKyAgICAgIHJldHVybiAwOworCisgICAgY291bnQgPSAxOworCisgICAgLyoKKyAgICAgKiBGaXJzdCBidWlsZCBhIHF1ZXJ5IG9mIHRoZSBmb3JtOgorICAgICAqCisgICAgICogICBzZXJ2aWNlLnByb3RvY29sLmhvc3QKKyAgICAgKgorICAgICAqIHdoaWNoIHdpbGwgbW9zdCBsaWtlbHkgYmUgc29tZXRoaW5nIGxpa2U6CisgICAgICoKKyAgICAgKiAgIF90ZWxuZXQuX3RjcC5ob3N0CisgICAgICoKKyAgICAgKi8KKyAgICBpZiAoKChpbnQpc3RybGVuKHNlcnZpY2UpICsgc3RybGVuKHByb3RvY29sKSArIHN0cmxlbihob3N0KSArIDUpCisgICAgICAgID4gTUFYX0ROU19OQU1FTEVOCisgICAgICAgICkKKyAgICAgIGdvdG8gZG5zb3V0OworCisgICAgLyogUmVhbG0gbmFtZXMgZG9uJ3QgKG5vcm1hbGx5KSBlbmQgd2l0aCAiLiIsIGJ1dCBpZiB0aGUgcXVlcnkKKyAgICAgICBkb2Vzbid0IGVuZCB3aXRoICIuIiBhbmQgZG9lc24ndCBnZXQgYW4gYW5zd2VyIGFzIGlzLCB0aGUKKyAgICAgICByZXNvbHYgY29kZSB3aWxsIHRyeSBhcHBlbmRpbmcgdGhlIGxvY2FsIGRvbWFpbi4gIFNpbmNlIHRoZQorICAgICAgIHJlYWxtIG5hbWVzIGFyZSBhYnNvbHV0ZXMsIGxldCdzIHN0b3AgdGhhdC4KKworICAgICAgIEJ1dCBvbmx5IGlmIGEgbmFtZSBoYXMgYmVlbiBzcGVjaWZpZWQuICBJZiB3ZSBhcmUgcGVyZm9ybWluZworICAgICAgIGEgc2VhcmNoIG9uIHRoZSBwcmVmaXggYWxvbmUgdGhlbiB0aGUgaW50ZW50aW9uIGlzIHRvIGFsbG93CisgICAgICAgdGhlIGxvY2FsIGRvbWFpbiBvciBkb21haW4gc2VhcmNoIGxpc3RzIHRvIGJlIGV4cGFuZGVkLgorICAgICovCisgICAgaCA9IGhvc3QgKyBzdHJsZW4gKGhvc3QpOworICAgIGNrbWFreG1zZyhxdWVyeSwgc2l6ZW9mKHF1ZXJ5KSwgIl8iLHNlcnZpY2UsIi5fIixwcm90b2NvbCwiLiIsIGhvc3QsCisgICAgICAgICAgICAgICgoaCA+IGhvc3QpICYmIChoWy0xXSAhPSAnLicpPyIuIjpOVUxMKSwKKyAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisKKyAgICBzaXplID0gcmVzX3NlYXJjaChxdWVyeSwgQ19JTiwgVF9TUlYsIGFuc3dlci5ieXRlcywgc2l6ZW9mKGFuc3dlci5ieXRlcykpOworCisgICAgaWYgKHNpemUgPCBoZHJzaXplKQorICAgICAgZ290byBkbnNvdXQ7CisKKyAgICAvKiBXZSBnb3QgYSByZXBseSAtIFNlZSBob3cgbWFueSBhbnN3ZXJzIGl0IGNvbnRhaW5zLiAqLworCisgICAgcCA9IGFuc3dlci5ieXRlczsKKworICAgIG51bXF1ZXJpZXMgPSBudG9ocyhhbnN3ZXIuaGRyLnFkY291bnQpOworICAgIG51bWFuc3dlcnMgPSBudG9ocyhhbnN3ZXIuaGRyLmFuY291bnQpOworCisgICAgcCArPSBzaXplb2YoSEVBREVSKTsKKworICAgIC8qCisgICAgICogV2UgbmVlZCB0byBza2lwIG92ZXIgYWxsIG9mIHRoZSBxdWVzdGlvbnMsIHNvIHdlIGhhdmUgdG8gaXRlcmF0ZQorICAgICAqIG92ZXIgZXZlcnkgcXVlcnkgcmVjb3JkLiAgZG5fZXhwYW5kKCkgaXMgYWJsZSB0byB0ZWxsIHVzIHRoZSBzaXplCisgICAgICogb2YgY29tcHJlc3NlZCBETlMgbmFtZXMsIHNvIHdlIHVzZSBpdC4KKyAgICAgKi8KKyAgICB3aGlsZSAobnVtcXVlcmllcy0tKSB7CisgICAgICAgIGxlbiA9IGRuX2V4cGFuZChhbnN3ZXIuYnl0ZXMsYW5zd2VyLmJ5dGVzK3NpemUscCxxdWVyeSxzaXplb2YocXVlcnkpKTsKKyAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgZ290byBkbnNvdXQ7CisgICAgICAgIElOQ1JfQ0hFQ0socCwgbGVuICsgNCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXZSdyZSBub3cgcG9pbnRpbmcgYXQgdGhlIGFuc3dlciByZWNvcmRzLiAgT25seSBwcm9jZXNzIHRoZW0gaWYKKyAgICAgKiB0aGV5J3JlIGFjdHVhbGx5IFRfU1JWIHJlY29yZHMgKHRoZXkgbWlnaHQgYmUgQ05BTUUgcmVjb3JkcywKKyAgICAgKiBmb3IgaW5zdGFuY2UpLgorICAgICAqCisgICAgICogQnV0IGluIGEgRE5TIHJlcGx5LCBpZiB5b3UgZ2V0IGEgQ05BTUUgeW91IGFsd2F5cyBnZXQgdGhlIGFzc29jaWF0ZWQKKyAgICAgKiAicmVhbCIgUlIgZm9yIHRoYXQgQ05BTUUuICBSRkMgMTAzNCwgMy42LjI6CisgICAgICoKKyAgICAgKiBDTkFNRSBSUnMgY2F1c2Ugc3BlY2lhbCBhY3Rpb24gaW4gRE5TIHNvZnR3YXJlLiAgV2hlbiBhIG5hbWUgc2VydmVyCisgICAgICogZmFpbHMgdG8gZmluZCBhIGRlc2lyZWQgUlIgaW4gdGhlIHJlc291cmNlIHNldCBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogZG9tYWluIG5hbWUsIGl0IGNoZWNrcyB0byBzZWUgaWYgdGhlIHJlc291cmNlIHNldCBjb25zaXN0cyBvZiBhIENOQU1FCisgICAgICogcmVjb3JkIHdpdGggYSBtYXRjaGluZyBjbGFzcy4gIElmIHNvLCB0aGUgbmFtZSBzZXJ2ZXIgaW5jbHVkZXMgdGhlIENOQU1FCisgICAgICogcmVjb3JkIGluIHRoZSByZXNwb25zZSBhbmQgcmVzdGFydHMgdGhlIHF1ZXJ5IGF0IHRoZSBkb21haW4gbmFtZQorICAgICAqIHNwZWNpZmllZCBpbiB0aGUgZGF0YSBmaWVsZCBvZiB0aGUgQ05BTUUgcmVjb3JkLiAgVGhlIG9uZSBleGNlcHRpb24gdG8KKyAgICAgKiB0aGlzIHJ1bGUgaXMgdGhhdCBxdWVyaWVzIHdoaWNoIG1hdGNoIHRoZSBDTkFNRSB0eXBlIGFyZSBub3QgcmVzdGFydGVkLgorICAgICAqCisgICAgICogSW4gb3RoZXIgd29yZHMsIENOQU1FcyBkbyBub3QgbmVlZCB0byBiZSBleHBhbmRlZCBieSB0aGUgY2xpZW50LgorICAgICAqLworICAgIHdoaWxlIChudW1hbnN3ZXJzLS0pIHsKKworICAgICAgICAvKiBGaXJzdCBpcyB0aGUgbmFtZTsgdXNlIGRuX2V4cGFuZCgpIHRvIGdldCB0aGUgY29tcHJlc3NlZCBzaXplLiAqLworICAgICAgICBsZW4gPSBkbl9leHBhbmQoYW5zd2VyLmJ5dGVzLGFuc3dlci5ieXRlcytzaXplLHAscXVlcnksc2l6ZW9mKHF1ZXJ5KSk7CisgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgIGdvdG8gZG5zb3V0OworICAgICAgICBJTkNSX0NIRUNLKHAsIGxlbik7CisKKyAgICAgICAgQ0hFQ0socCwyKTsgICAgICAgICAgICAgICAgICAgICAvKiBRdWVyeSB0eXBlICovCisgICAgICAgIHR5cGUgPSBOVE9IU1AocCwyKTsKKworICAgICAgICBDSEVDSyhwLCA2KTsgICAgICAgICAgICAgICAgICAgIC8qIFF1ZXJ5IGNsYXNzICovCisgICAgICAgIGNsYXNzID0gTlRPSFNQKHAsNik7ICAgICAgICAgICAgLyogQWxzbyBza2lwIG92ZXIgNC1ieXRlIFRUTCAqLworCisgICAgICAgIENIRUNLKHAsMik7ICAgICAgICAgICAgICAgICAgICAgLyogUmVjb3JkIGRhdGEgbGVuZ3RoICovCisgICAgICAgIHJkbGVuID0gTlRPSFNQKHAsMik7CisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoaXMgaXMgYW4gU1JWIHJlY29yZCwgcHJvY2VzcyBpdC4gIFJlY29yZCBmb3JtYXQgaXM6CisgICAgICAgICAqCisgICAgICAgICAqIFByaW9yaXR5CisgICAgICAgICAqIFdlaWdodAorICAgICAgICAgKiBQb3J0CisgICAgICAgICAqIFNlcnZlciBuYW1lCisgICAgICAgICAqLworICAgICAgICBpZiAoY2xhc3MgPT0gQ19JTiAmJiB0eXBlID09IFRfU1JWKSB7CisgICAgICAgICAgICBDSEVDSyhwLDIpOworICAgICAgICAgICAgcHJpb3JpdHkgPSBOVE9IU1AocCwyKTsKKyAgICAgICAgICAgIENIRUNLKHAsIDIpOworICAgICAgICAgICAgd2VpZ2h0ID0gTlRPSFNQKHAsMik7CisgICAgICAgICAgICBDSEVDSyhwLCAyKTsKKyAgICAgICAgICAgIHBvcnQgPSBOVE9IU1AocCwyKTsKKyAgICAgICAgICAgIGxlbiA9IGRuX2V4cGFuZChhbnN3ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyLmJ5dGVzICsgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihxdWVyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgIGdvdG8gZG5zb3V0OworICAgICAgICAgICAgSU5DUl9DSEVDSyhwLCBsZW4pOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdlIGdvdCBldmVyeXRoaW5nLiAgSW5zZXJ0IGl0IGludG8gb3VyIGxpc3QsIGJ1dCBtYWtlIHN1cmUKKyAgICAgICAgICAgICAqIGl0J3MgaW4gdGhlIHJpZ2h0IG9yZGVyLiAgUmlnaHQgbm93IHdlIGRvbid0IGRvIGFueXRoaW5nCisgICAgICAgICAgICAgKiB3aXRoIHRoZSB3ZWlnaHQgZmllbGQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3J2ID0gKHN0cnVjdCBzcnZfZG5zX2VudHJ5ICopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3J2X2Ruc19lbnRyeSkpOworICAgICAgICAgICAgaWYgKHNydiA9PSBOVUxMKQorICAgICAgICAgICAgICBnb3RvIGRuc291dDsKKworICAgICAgICAgICAgc3J2LT5wcmlvcml0eSA9IHByaW9yaXR5OworICAgICAgICAgICAgc3J2LT53ZWlnaHQgPSB3ZWlnaHQ7CisgICAgICAgICAgICBzcnYtPnBvcnQgPSBwb3J0OworICAgICAgICAgICAgbWFrZXN0cigmcywoY2hhciAqKXF1ZXJ5KTsgIC8qIHN0cmR1cCgpIGlzIG5vdCBwb3J0YWJsZSAqLworICAgICAgICAgICAgc3J2LT5ob3N0ID0gczsKKworICAgICAgICAgICAgaWYgKGhlYWQgPT0gTlVMTCB8fCBoZWFkLT5wcmlvcml0eSA+IHNydi0+cHJpb3JpdHkpIHsKKyAgICAgICAgICAgICAgICBzcnYtPm5leHQgPSBoZWFkOworICAgICAgICAgICAgICAgIGhlYWQgPSBzcnY7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENvbmZ1c2luZy4gIEluc2VydCBhbiBlbnRyeSBpbnRvIHRoaXMgc3BvdCBvbmx5IGlmOgorICAgICAgICAgICAgICAgICAqICAuIFRoZSBuZXh0IHBlcnNvbiBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgKGxvd2VyCisgICAgICAgICAgICAgICAgICogICAgcHJpb3JpdGllcyBhcmUgcHJlZmVycmVkKSwgb3I6CisgICAgICAgICAgICAgICAgICogIC4gVGhlcmUgaXMgbm8gbmV4dCBlbnRyeSAod2UncmUgYXQgdGhlIGVuZCkKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgZm9yIChlbnRyeSA9IGhlYWQ7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCisgICAgICAgICAgICAgICAgaWYgKChlbnRyeS0+bmV4dCAmJgorICAgICAgICAgICAgICAgICAgICAgZW50cnktPm5leHQtPnByaW9yaXR5ID4gc3J2LT5wcmlvcml0eSkgfHwKKyAgICAgICAgICAgICAgICAgICAgZW50cnktPm5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBzcnYtPm5leHQgPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgZW50cnktPm5leHQgPSBzcnY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgSU5DUl9DSEVDSyhwLCByZGxlbik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOb3cgd2UndmUgZ290IGEgbGlua2VkIGxpc3Qgb2YgZW50cmllcyBzb3J0ZWQgYnkgcHJpb3JpdHkuCisgICAgICogU3RhcnQgbG9va2luZyB1cCBBIHJlY29yZHMgYW5kIHJldHVybmluZyBhZGRyZXNzZXMuCisgICAgICovCisgICAgaWYgKGhlYWQgPT0gTlVMTCkKKyAgICAgIGdvdG8gZG5zb3V0OworCisgICAgZm9yIChlbnRyeSA9IGhlYWQ7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpIHsKKyAgICAgICAgaHAgPSBnZXRob3N0YnluYW1lKGVudHJ5LT5ob3N0KTsKKyAgICAgICAgaWYgKGhwICE9IDApIHsKKworICAgICAgICAgICAgLyogV2F0Y2ggb3V0IC0gbWVtc2V0KCkgYW5kIG1lbWNweSgpIGFyZSBub3QgcG9ydGFibGUuLi4gKi8KKworICAgICAgICAgICAgc3dpdGNoIChocC0+aF9hZGRydHlwZSkgeworICAgICAgICAgICAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaHAtPmhfYWRkcl9saXN0W2pdOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmYWRkcltub3V0KytdOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQgKChjaGFyICopIHNpbiwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2luLT5zaW5fZmFtaWx5ID0gaHAtPmhfYWRkcnR5cGU7CisgICAgICAgICAgICAgICAgICAgIHNpbi0+c2luX3BvcnQgPSBodG9ucyhlbnRyeS0+cG9ydCk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSAmc2luLT5zaW5fYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIGhwLT5oX2FkZHJfbGlzdFtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOyAgICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChub3V0ICsgMSA+PSBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxsb2MoKGNoYXIgKikgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWRkcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkbnNvdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChlbnRyeSA9IGhlYWQ7IGVudHJ5ICE9IE5VTEw7KSB7CisgICAgICAgIGZyZWUoZW50cnktPmhvc3QpOworICAgICAgICBlbnRyeS0+aG9zdCA9IE5VTEw7CisgICAgICAgIHNydiA9IGVudHJ5OworICAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgICAgICBmcmVlKHNydik7CisgICAgICAgIHNydiA9IE5VTEw7CisgICAgfQorCisgIGRuc291dDoKKyAgICBpZiAoc3J2KQorICAgICAgZnJlZShzcnYpOworCisgICAgaWYgKG5vdXQgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgLyogTm8gZ29vZCBzZXJ2ZXJzICovCisgICAgICAgIGlmIChhZGRyKQorICAgICAgICAgIGZyZWUoYWRkcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqYWRkcl9wcCA9IGFkZHI7CisgICAgKm5hZGRycyA9IG5vdXQ7CisgICAgcmV0dXJuIDE7Cit9CisjdW5kZWYgSU5DUl9DSEVDSworI3VuZGVmIENIRUNLCisjdW5kZWYgTlRPSFNQCisKKyNkZWZpbmUgSU5DUl9DSEVDSyh4LCB5KSB4ICs9IHk7IGlmICh4ID4gc2l6ZSArIGFuc3dlci5ieXRlcykgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwCisjZGVmaW5lIENIRUNLKHgsIHkpIGlmICh4ICsgeSA+IHNpemUgKyBhbnN3ZXIuYnl0ZXMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAorI2RlZmluZSBOVE9IU1AoeCwgeSkgeFswXSA8PCA4IHwgeFsxXTsgeCArPSB5CisKK2ludAorbG9jYXRlX3R4dF9ycihwcmVmaXgsIG5hbWUsIHJldHN0cikKKyAgICBjaGFyICpwcmVmaXgsICpuYW1lOworICAgIGNoYXIgKipyZXRzdHI7Cit7CisgICAgdW5pb24geworICAgICAgICB1bnNpZ25lZCBjaGFyIGJ5dGVzWzIwNDhdOworICAgICAgICBIRUFERVIgaGRyOworICAgIH0gYW5zd2VyOworICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgY2hhciBob3N0W01BWF9ETlNfTkFNRUxFTl0sICpoOworICAgIGludCBzaXplOworICAgIGludCB0eXBlLCBjbGFzcywgbnVtYW5zd2VycywgbnVtcXVlcmllcywgcmRsZW4sIGxlbjsKKworICAgIC8qCisgICAgICogRm9ybSBvdXIgcXVlcnksIGFuZCBzZW5kIGl0IHZpYSBETlMKKyAgICAgKi8KKworICAgIGlmIChuYW1lID09IE5VTEwgfHwgbmFtZVswXSA9PSAnXDAnKSB7CisgICAgICAgIHN0cmNweShob3N0LHByZWZpeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBzdHJsZW4ocHJlZml4KSArIHN0cmxlbihuYW1lKSArIDMgPiBNQVhfRE5TX05BTUVMRU4gKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLyogUmVhbG0gbmFtZXMgZG9uJ3QgKG5vcm1hbGx5KSBlbmQgd2l0aCAiLiIsIGJ1dCBpZiB0aGUgcXVlcnkKKyAgICAgICAgICAgZG9lc24ndCBlbmQgd2l0aCAiLiIgYW5kIGRvZXNuJ3QgZ2V0IGFuIGFuc3dlciBhcyBpcywgdGhlCisgICAgICAgICAgIHJlc29sdiBjb2RlIHdpbGwgdHJ5IGFwcGVuZGluZyB0aGUgbG9jYWwgZG9tYWluLiAgU2luY2UgdGhlCisgICAgICAgICAgIHJlYWxtIG5hbWVzIGFyZSBhYnNvbHV0ZXMsIGxldCdzIHN0b3AgdGhhdC4KKworICAgICAgICAgICBCdXQgb25seSBpZiBhIG5hbWUgaGFzIGJlZW4gc3BlY2lmaWVkLiAgSWYgd2UgYXJlIHBlcmZvcm1pbmcKKyAgICAgICAgICAgYSBzZWFyY2ggb24gdGhlIHByZWZpeCBhbG9uZSB0aGVuIHRoZSBpbnRlbnRpb24gaXMgdG8gYWxsb3cKKyAgICAgICAgICAgdGhlIGxvY2FsIGRvbWFpbiBvciBkb21haW4gc2VhcmNoIGxpc3RzIHRvIGJlIGV4cGFuZGVkLgorICAgICAgICAqLworICAgICAgICBoID0gaG9zdCArIHN0cmxlbiAoaG9zdCk7CisgICAgICAgIGNrbWFrbXNnKGhvc3Qsc2l6ZW9mKGhvc3QpLHByZWZpeCwgIi4iLCBuYW1lLAorICAgICAgICAgICAgICAgICAoKGggPiBob3N0KSAmJiAoaFstMV0gIT0gJy4nKSk/Ii4iOk5VTEwpOworCisgICAgfQorICAgIHNpemUgPSByZXNfc2VhcmNoKGhvc3QsIENfSU4sIFRfVFhULCBhbnN3ZXIuYnl0ZXMsIHNpemVvZihhbnN3ZXIuYnl0ZXMpKTsKKworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBwID0gYW5zd2VyLmJ5dGVzOworCisgICAgbnVtcXVlcmllcyA9IG50b2hzKGFuc3dlci5oZHIucWRjb3VudCk7CisgICAgbnVtYW5zd2VycyA9IG50b2hzKGFuc3dlci5oZHIuYW5jb3VudCk7CisKKyAgICBwICs9IHNpemVvZihIRUFERVIpOworCisgICAgLyoKKyAgICAgKiBXZSBuZWVkIHRvIHNraXAgb3ZlciB0aGUgcXVlc3Rpb25zIGJlZm9yZSB3ZSBjYW4gZ2V0IHRvIHRoZSBhbnN3ZXJzLAorICAgICAqIHdoaWNoIG1lYW5zIHdlIGhhdmUgdG8gaXRlcmF0ZSBvdmVyIGV2ZXJ5IHF1ZXJ5IHJlY29yZC4gIFdlIHVzZQorICAgICAqIGRuX2V4cGFuZCB0byB0ZWxsIHVzIGhvdyBsb25nIGVhY2ggY29tcHJlc3NlZCBuYW1lIGlzLgorICAgICAqLworCisgICAgd2hpbGUgKG51bXF1ZXJpZXMtLSkgeworICAgICAgICBsZW4gPSBkbl9leHBhbmQoYW5zd2VyLmJ5dGVzLCBhbnN3ZXIuYnl0ZXMgKyBzaXplLCBwLCBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihob3N0KSk7CisgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIElOQ1JfQ0hFQ0socCwgbGVuICsgNCk7ICAgICAgICAgLyogTmFtZSBwbHVzIHR5cGUgcGx1cyBjbGFzcyAqLworICAgIH0KKworICAgIC8qCisgICAgICogV2UncmUgbm93IHBvaW50aW5nIGF0IHRoZSBhbnN3ZXIgcmVjb3Jkcy4gIFByb2Nlc3MgdGhlIGZpcnN0CisgICAgICogVFhUIHJlY29yZCB3ZSBmaW5kLgorICAgICAqLworCisgICAgd2hpbGUgKG51bWFuc3dlcnMtLSkgeworCisgICAgICAgIC8qIEZpcnN0IHRoZSBuYW1lOyB1c2UgZG5fZXhwYW5kIHRvIGdldCB0aGUgY29tcHJlc3NlZCBzaXplICovCisgICAgICAgIGxlbiA9IGRuX2V4cGFuZChhbnN3ZXIuYnl0ZXMsIGFuc3dlci5ieXRlcyArIHNpemUsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICBob3N0LCBzaXplb2YoaG9zdCkpOworICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBJTkNSX0NIRUNLKHAsIGxlbik7CisKKyAgICAgICAgLyogTmV4dCBpcyB0aGUgcXVlcnkgdHlwZSAqLworICAgICAgICBDSEVDSyhwLCAyKTsKKyAgICAgICAgdHlwZSA9IE5UT0hTUChwLDIpOworCisgICAgICAgIC8qIE5leHQgaXMgdGhlIHF1ZXJ5IGNsYXNzOyBhbHNvIHNraXAgb3ZlciA0IGJ5dGUgVFRMICovCisgICAgICAgIENIRUNLKHAsNik7CisgICAgICAgIGNsYXNzID0gTlRPSFNQKHAsNik7CisKKyAgICAgICAgLyogUmVjb3JkIGRhdGEgbGVuZ3RoIC0gbWFrZSBzdXJlIHdlIGFyZW4ndCB0cnVuY2F0ZWQgKi8KKworICAgICAgICBDSEVDSyhwLDIpOworICAgICAgICByZGxlbiA9IE5UT0hTUChwLDIpOworCisgICAgICAgIGlmIChwICsgcmRsZW4gPiBhbnN3ZXIuYnl0ZXMgKyBzaXplKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhpcyBpcyBhIFRYVCByZWNvcmQsIHJldHVybiB0aGUgc3RyaW5nLiAgTm90ZSB0aGF0IHRoZQorICAgICAgICAgKiBzdHJpbmcgaGFzIGEgMS1ieXRlIGxlbmd0aCBpbiB0aGUgZnJvbnQKKyAgICAgICAgICovCisgICAgICAgIC8qIFhYWCBXaGF0IGFib3V0IGZsYWdnaW5nIG11bHRpcGxlIFRYVCByZWNvcmRzIGFzIGFuIGVycm9yPyAgKi8KKworICAgICAgICBpZiAoY2xhc3MgPT0gQ19JTiAmJiB0eXBlID09IFRfVFhUKSB7CisgICAgICAgICAgICBsZW4gPSAqcCsrOworICAgICAgICAgICAgaWYgKHAgKyBsZW4gPiBhbnN3ZXIuYnl0ZXMgKyBzaXplKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgKnJldHN0ciA9IG1hbGxvYyhsZW4gKyAxKTsKKyAgICAgICAgICAgIGlmICgqcmV0c3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVOT01FTTsKKyAgICAgICAgICAgIHN0cm5jcHkoKnJldHN0ciwgKGNoYXIgKikgcCwgbGVuKTsKKyAgICAgICAgICAgICgqcmV0c3RyKVtsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIC8qIEF2b2lkIGEgY29tbW9uIGVycm9yLiAqLworICAgICAgICAgICAgaWYgKCAoKnJldHN0cilbbGVuLTFdID09ICcuJyApCisgICAgICAgICAgICAgICAgKCpyZXRzdHIpW2xlbi0xXSA9ICdcMCc7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorI3VuZGVmIElOQ1JfQ0hFQ0sKKyN1bmRlZiBDSEVDSworI3VuZGVmIE5UT0hTUAorI2VuZGlmIC8qIENLX0ROU19TUlYgKi8KKworI2lmZGVmIFROQ09ERQorI2lmZGVmIENLX0ZPUldBUkRfWAorI2lmZGVmIFVOSVgKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNkZWZpbmUgRldEWF9VTklYX1NPQ0sKKyNpZm5kZWYgQUZfTE9DQUwKKyNkZWZpbmUgQUZfTE9DQUwgQUZfVU5JWAorI2VuZGlmCisjaWZuZGVmIFBGX0xPQ0FMCisjZGVmaW5lIFBGX0xPQ0FMIFBGX1VOSVgKKyNlbmRpZgorI2lmbmRlZiBTVU5fTEVOCisvKiBFdmFsdWF0ZSB0byBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBgc29ja2FkZHJfdW4nIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIFNVTl9MRU4ocHRyKSAoKHNpemVfdCkgKCgoc3RydWN0IHNvY2thZGRyX3VuICopIDApLT5zdW5fcGF0aCkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKChwdHIpLT5zdW5fcGF0aCkpCisjZW5kaWYKKyNlbmRpZiAvKiBVTklYICovCitpbnQKK2Z3ZHhfY3JlYXRlX2xpc3Rlbl9zb2NrZXQoc2NyZWVuKSBpbnQgc2NyZWVuOyB7CisjaWZkZWYgTk9QVVRFTlYKKyAgICByZXR1cm4oLTEpOworI2Vsc2UgLyogTk9QVVRFTlYgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FkZHI7CisgICAgaW50IGRpc3BsYXksIHBvcnQsIHNvY2s9LTEsIGk7CisgICAgc3RhdGljIGNoYXIgZW52WzUxMl07CisKKyAgICAvKgorICAgICAqIFggV2luZG93cyBTZXJ2ZXJzIHN1cHBvcnQgbXVsdGlwbGUgZGlzcGxheXMgYnkgbGlzdGVuaW5nIG9uCisgICAgICogb25lIHNvY2tldCBwZXIgZGlzcGxheS4gIERpc3BsYXkgMCBpcyBwb3J0IDYwMDA7IERpc3BsYXkgMSBpcworICAgICAqIHBvcnQgNjAwMTsgZXRjLgorICAgICAqCisgICAgICogV2Ugc3RhcnQgYnkgdHJ5aW5nIHRvIG9wZW4gcG9ydCA2MDAxIHNvIHRoYXQgZGlzcGxheSAwIGlzCisgICAgICogcmVzZXJ2ZWQgZm9yIHRoZSBsb2NhbCBYIFdpbmRvd3MgU2VydmVyLgorICAgICAqLworCisgICAgZm9yICggZGlzcGxheT0xOyBkaXNwbGF5IDwgMTAwMCA7IGRpc3BsYXkrKyAgKSB7CisKKyAgICAgICAgaWYgKChzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPCAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJmd2R4X2NyZWF0ZV9saXN0ZW5fc29ja2V0KCkiLCJzb2NrZXQoKSA8IDAiLHNvY2spOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIHBvcnQgPSA2MDAwICsgZGlzcGxheTsKKyAgICAgICAgYnplcm8oKGNoYXIgKikmc2FkZHIsIHNpemVvZihzYWRkcikpOworICAgICAgICBzYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgc2FkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKG15aXBhZGRyKTsKKyAgICAgICAgc2FkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKworICAgICAgICBpZiAoYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCBzaXplb2Yoc2FkZHIpKSA8IDApIHsKKyAgICAgICAgICAgIGkgPSBlcnJubzsgICAgICAgICAgICAgICAgICAvKiBTYXZlIGVycm9yIGNvZGUgKi8KKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICAgICAgc29ja2V0X2Nsb3NlKHNvY2spOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgIGNsb3NlKHNvY2spOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgICAgICBzb2NrID0gLTE7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmd2R4X2NyZWF0ZV9saXN0ZW5fc29ja2V0KCkiLCJiaW5kKCkgPCAwIiwwKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZGVidWcoRjEwMCwiZmR3eF9jcmVhdGVfbGlzdGVuX3NvY2tldCgpIGJpbmQgT0siLCIiLDApOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIGRpc3BsYXkgPiAxMDAwICkgeworICAgICAgICBkZWJ1ZyhGMTAwLCJmd2R4X2NyZWF0ZV9saXN0ZW5fc29ja2V0KCkgT3V0IG9mIERpc3BsYXlzIiwiIiwwKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBpZiAobGlzdGVuKHNvY2ssIDUpIDwgMCkgeworICAgICAgICBpID0gZXJybm87ICAgICAgICAgICAgICAgICAgLyogU2F2ZSBlcnJvciBjb2RlICovCisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgc29ja2V0X2Nsb3NlKHNvY2spOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyAgICAgICAgY2xvc2Uoc29jayk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICAgICAgZGVidWcoRjEwMSwiZmR3eF9jcmVhdGVfbGlzdGVuX3NvY2tldCgpIGxpc3RlbigpIGVycm5vIiwiIixlcnJubyk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMDAsImZ3ZHhfY3JlYXRlX2xpc3Rlbl9zb2NrZXQoKSBsaXN0ZW4gT0siLCIiLDApOworCisgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5saXN0ZW5fc29ja2V0ID0gc29jazsKKyAgICBpZiAoIW15aXBhZGRyWzBdKQorICAgICAgICBnZXRsb2NhbGlwYWRkcigpOworICAgIGlmICggbXlpcGFkZHJbMF0gKQorICAgICAgICBja21ha3htc2coZW52LHNpemVvZihlbnYpLCJESVNQTEFZPSIsbXlpcGFkZHIsIjoiLAorICAgICAgICAgICAgICAgICAgY2t1aXRvYShkaXNwbGF5KSwiOiIsY2t1aXRvYShzY3JlZW4pLAorICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgY2ttYWttc2coZW52LHNpemVvZihlbnYpLCJESVNQTEFZPSIsY2t1aXRvYShkaXNwbGF5KSwiOiIsCisgICAgICAgICAgICAgICAgIGNrdWl0b2Eoc2NyZWVuKSk7CisgICAgcHV0ZW52KGVudik7CisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIE5PUFVURU5WICovCit9CisKKworaW50Citmd2R4X29wZW5fY2xpZW50X2NoYW5uZWwoY2hhbm5lbCkgaW50IGNoYW5uZWw7IHsKKyAgICBjaGFyICogZW52OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKKyNpZmRlZiBGV0RYX1VOSVhfU09DSworICAgIHN0cnVjdCBzb2NrYWRkcl91biBzYWRkcl91biA9IHsgQUZfTE9DQUwgfTsKKyNlbmRpZiAvKiBGV0RYX1VOSVhfU09DSyAqLworICAgIGludCBjb2xvbiwgZG90LCBkaXNwbGF5LCBwb3J0LCBzb2NrLCBpLCBzY3JlZW47CisgICAgaW50IGZhbWlseTsKKyAgICBjaGFyIGJ1ZlsyNTZdLCAqIGhvc3Q9TlVMTCwgKiByZXN0PU5VTEw7CisjaWZkZWYgVENQX05PREVMQVkKKyAgICBpbnQgb249MTsKKyNlbmRpZiAvKiBUQ1BfTk9ERUxBWSAqLworCisgICAgZGVidWcoRjExMSwiZndkeF9jcmVhdGVfY2xpZW50X2NoYW5uZWwoKSIsImNoYW5uZWwiLGNoYW5uZWwpOworCisgICAgZm9yICggaT0wOyBpPE1BWEZXRFggOyBpKysgKSB7CisgICAgICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbaV0uaWQgPT0gY2hhbm5lbCkgeworICAgICAgICAgICAgLyogQWxyZWFkeSBvcGVuICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmd2R4X2NyZWF0ZV9jbGllbnRfY2hhbm5lbCgpIiwiYWxyZWFkeSBvcGVuIiwwKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVudiA9IGdldGVudigiRElTUExBWSIpOworICAgIGlmICggIWVudiApCisgICAgICAgIGVudiA9IHRuX2dldF9kaXNwbGF5KCk7CisgICAgaWYgKCBlbnYgKQorICAgICAgICBja3N0cm5jcHkoYnVmLGVudiwyNTYpOworICAgIGVsc2UKKyAgICAgICAgY2tzdHJuY3B5KGJ1ZiwiMTI3LjAuMC4xOjAuMCIsMjU2KTsKKworICAgIGJ6ZXJvKChjaGFyICopJnNhZGRyLHNpemVvZihzYWRkcikpOworICAgIHNhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCisgICAgaWYgKCFmd2R4X3BhcnNlX2Rpc3BsYXluYW1lKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICkgeworICAgICAgICBpZiAoIGhvc3QgKSBmcmVlKGhvc3QpOworICAgICAgICBpZiAoIHJlc3QgKSBmcmVlKHJlc3QpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGlmIChyZXN0KSBmcmVlKHJlc3QpOworCisjaWZuZGVmIEZXRFhfVU5JWF9TT0NLCisgIC8qIGlmICRESVNQTEFZIGluZGljYXRlcyB1c2Ugb2YgdW5peCBkb21haW4gc29ja2V0cywgYnV0IHdlIGRvbid0IHN1cHBvcnQgaXQsCisgICAqIHdlIGNoYW5nZSB0aGluZ3MgdG8gdXNlIGluZXQgc29ja2V0cyBvbiB0aGUgaXAgbG9vcGJhY2sgaW50ZXJmYWNlIGluc3RlYWQsCisgICAqIGFuZCBob3BlIHRoYXQgaXQgd29ya3MuCisgICAqLworICAgIGlmIChmYW1pbHkgPT0gRmFtaWx5TG9jYWwpIHsKKyAgICAgICAgZGVidWcoRjEwMCwiZndkeF9jcmVhdGVfY2xpZW50X2NoYW5uZWwoKSBGYW1pbHlMb2NhbCIsIiIsMCk7CisgICAgICAgIGZhbWlseSA9IEZhbWlseUludGVybmV0OworICAgICAgICBpZiAoaG9zdCkgZnJlZShob3N0KTsKKyAgICAgICAgaWYgKGhvc3QgPSBtYWxsb2Moc3RybGVuKCJsb2NhbGhvc3QiKSArIDEpKQorICAgICAgICAgICAgc3RyY3B5KGhvc3QsICJsb2NhbGhvc3QiKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgfQorI2Vsc2UgLyogRldEWF9VTklYX1NPQ0sgKi8KKyAgICBpZiAoZmFtaWx5ID09IEZhbWlseUxvY2FsKSB7CisgICAgICAgIGlmIChob3N0KSBmcmVlKGhvc3QpOworICAgICAgICBzb2NrID0gc29ja2V0KFBGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCk7CisgICAgICAgIGlmIChzb2NrIDwgMCkKKyAgICAgICAgICAgIHJldHVybigtMSk7CisKKyAgICAgICAgY2ttYWttc2coYnVmLHNpemVvZihidWYpLCIvdG1wLy5YMTEtdW5peC9YIixja2l0b2EoZGlzcGxheSksTlVMTCxOVUxMKTsKKyAgICAgICAgc3RybmNweShzYWRkcl91bi5zdW5fcGF0aCwgYnVmLCBzaXplb2Yoc2FkZHJfdW4uc3VuX3BhdGgpKTsKKyAgICAgICAgaWYgKGNvbm5lY3Qoc29jaywoc3RydWN0IHNvY2thZGRyICopJnNhZGRyX3VuLCBTVU5fTEVOKCZzYWRkcl91bikpIDwgMCkKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgIH0gZWxzZQorI2VuZGlmICAvKiBGV0RYX1VOSVhfU09DSyAqLworICAgIHsKKyAgICAgICAgLyogT3RoZXJ3aXNlLCB3ZSBhcmUgYXNzdW1pbmcgRmFtaWx5SW50ZXJuZXQgKi8KKyAgICAgICAgaWYgKGhvc3QpIHsKKyAgICAgICAgICAgIGNrc3RybmNweShidWYsaG9zdCxzaXplb2YoYnVmKSk7CisgICAgICAgICAgICBmcmVlKGhvc3QpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNrc3RybmNweShidWYsbXlpcGFkZHIsc2l6ZW9mKGJ1ZikpOworCisgICAgICAgIGRlYnVnKEYxMTEsImZ3ZHhfY3JlYXRlX2NsaWVudF9jaGFubmVsKCkiLCJkaXNwbGF5IixkaXNwbGF5KTsKKworICAgICAgICBwb3J0ID0gNjAwMCArIGRpc3BsYXk7CisgICAgICAgIHNhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisKKyAgICAgICAgZGVidWcoRjExMCwiZndkeF9jcmVhdGVfY2xpZW50X2NoYW5uZWwoKSBpcC1hZGRyZXNzIixidWYsMCk7CisgICAgICAgIHNhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihidWYpOworICAgICAgICBpZiAoIHNhZGRyLnNpbl9hZGRyLnNfYWRkciA9PSAodW5zaWduZWQgbG9uZykgLTEKKyNpZmRlZiBJTkFERFJfTk9ORQorICAgICAgICAgICAgIHx8IHNhZGRyLnNpbl9hZGRyLnNfYWRkciA9PSBJTkFERFJfTk9ORQorI2VuZGlmIC8qIElOQUREUl9OT05FICovCisgICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqaG9zdDsKKyAgICAgICAgICAgIGhvc3QgPSBnZXRob3N0YnluYW1lKGJ1Zik7CisgICAgICAgICAgICBpZiAoIGhvc3QgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIGhvc3QgPSBja19jb3B5aG9zdGVudChob3N0KTsKKyNpZmRlZiBIQUREUkxJU1QKKyNpZmRlZiBoX2FkZHIKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgZm9yIHRyeWluZyBtdWx0aXBsZSBJUCBhZGRyZXNzZXMgLSBzZWUgPG5ldGRiLmg+ICovCisgICAgICAgICAgICBpZiAoIShob3N0LT5oX2FkZHJfbGlzdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIGJjb3B5KGhvc3QtPmhfYWRkcl9saXN0WzBdLAorICAgICAgICAgICAgICAgICAgIChjYWRkcl90KSZzYWRkci5zaW5fYWRkciwKKyAgICAgICAgICAgICAgICAgICBob3N0LT5oX2xlbmd0aAorICAgICAgICAgICAgICAgICAgICk7CisjZWxzZQorICAgICAgICAgICAgYmNvcHkoaG9zdC0+aF9hZGRyLCAoY2FkZHJfdCkmc2FkZHIuc2luX2FkZHIsIGhvc3QtPmhfbGVuZ3RoKTsKKyNlbmRpZiAvKiBoX2FkZHIgKi8KKyNlbHNlICAvKiBIQUREUkxJU1QgKi8KKyAgICAgICAgICAgIGJjb3B5KGhvc3QtPmhfYWRkciwgKGNhZGRyX3QpJnNhZGRyLnNpbl9hZGRyLCBob3N0LT5oX2xlbmd0aCk7CisjZW5kaWYgLyogSEFERFJMSVNUICovCisgICAgICAgIH0KKworICAgICAgICBpZiAoKHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA8IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ3ZHhfY3JlYXRlX2NsaWVudF9jaGFubmVsKCkiLCJzb2NrZXQoKSA8IDAiLHNvY2spOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggY29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCBzaXplb2Yoc2FkZHIpKSA8IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ3ZHhfY3JlYXRlX2NsaWVudF9jaGFubmVsKCkiLCJjb25uZWN0KCkgZmFpbGVkIiwwKTsKKyNpZmRlZiBUQ1BJUExJQgorICAgICAgICAgICAgc29ja2V0X2Nsb3NlKHNvY2spOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyAgICAgICAgICAgIGNsb3NlKHNvY2spOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisKKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgICAgICBzZXRzb2Nrb3B0KHNvY2ssSVBQUk9UT19UQ1AsVENQX05PREVMQVksKGNoYXIgKikmb24sc2l6ZW9mKG9uKSk7CisjZW5kaWYgLyogVENQX05PREVMQVkgKi8KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYRldEWDsgaSsrKSB7CisgICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbaV0uaWQgPT0gLTEpIHsKKyAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFtpXS5mZCA9IHNvY2s7CisgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbaV0uaWQgPSBjaGFubmVsOworICAgICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFtpXS5uZWVkX3RvX3NlbmRfeGF1dGggPSAxOworICAgICAgICAgZGVidWcoRjExMSwiZndkeF9jcmVhdGVfY2xpZW50X2NoYW5uZWwoKSIsInNvY2tldCIsc29jayk7CisgICAgICAgICByZXR1cm4oMCk7CisgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKC0xKTsKK30KKworaW50Citmd2R4X3NlcnZlcl9hdmFpbCgpIHsKKyAgICBjaGFyICogZW52OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKKyNpZmRlZiBGV0RYX1VOSVhfU09DSworICAgIHN0cnVjdCBzb2NrYWRkcl91biBzYWRkcl91biA9IHsgQUZfTE9DQUwgfTsKKyNlbmRpZiAgLyogRldEWF9VTklYX1NPQ0sgKi8KKyAgICBpbnQgY29sb24sIGRvdCwgZGlzcGxheSwgcG9ydCwgc29jaywgaSwgc2NyZWVuOworICAgIGNoYXIgYnVmWzI1Nl0sICpob3N0PU5VTEwsICpyZXN0PU5VTEw7CisjaWZkZWYgVENQX05PREVMQVkKKyAgICBpbnQgb249MTsKKyNlbmRpZiAvKiBUQ1BfTk9ERUxBWSAqLworICAgIGludCBmYW1pbHk7CisKKyAgICBlbnYgPSBnZXRlbnYoIkRJU1BMQVkiKTsKKyAgICBpZiAoICFlbnYgKQorICAgICAgICBlbnYgPSB0bl9nZXRfZGlzcGxheSgpOworICAgIGlmICggZW52ICkKKyAgICAgICAgY2tzdHJuY3B5KGJ1ZixlbnYsMjU2KTsKKyAgICBlbHNlCisgICAgICAgIGNrc3RybmNweShidWYsIjEyNy4wLjAuMTowLjAiLDI1Nik7CisKKyAgICBiemVybygoY2hhciAqKSZzYWRkcixzaXplb2Yoc2FkZHIpKTsKKyAgICBzYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKworICAgIGlmICghZndkeF9wYXJzZV9kaXNwbGF5bmFtZShidWYsJmZhbWlseSwmaG9zdCwmZGlzcGxheSwmc2NyZWVuLCZyZXN0KSkgeworICAgICAgICBpZiAoIGhvc3QgKSBmcmVlKGhvc3QpOworICAgICAgICBpZiAoIHJlc3QgKSBmcmVlKHJlc3QpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGlmIChyZXN0KSBmcmVlKHJlc3QpOworCisjaWZuZGVmIEZXRFhfVU5JWF9TT0NLCisgIC8qIGlmICRESVNQTEFZIGluZGljYXRlcyB1c2Ugb2YgdW5peCBkb21haW4gc29ja2V0cywgYnV0IHdlIGRvbid0IHN1cHBvcnQgaXQsCisgICAqIHdlIGNoYW5nZSB0aGluZ3MgdG8gdXNlIGluZXQgc29ja2V0cyBvbiB0aGUgaXAgbG9vcGJhY2sgaW50ZXJmYWNlIGluc3RlYWQsCisgICAqIGFuZCBob3BlIHRoYXQgaXQgd29ya3MuCisgICAqLworICAgIGlmIChmYW1pbHkgPT0gRmFtaWx5TG9jYWwpIHsKKyAgICAgICAgZmFtaWx5ID0gRmFtaWx5SW50ZXJuZXQ7CisgICAgICAgIGlmIChob3N0KSBmcmVlKGhvc3QpOworICAgICAgICBpZiAoaG9zdCA9IG1hbGxvYyhzdHJsZW4oImxvY2FsaG9zdCIpICsgMSkpCisgICAgICAgICAgICBzdHJjcHkoaG9zdCwgImxvY2FsaG9zdCIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZSAvKiBGV0RYX1VOSVhfU09DSyAqLworICAgIGlmIChmYW1pbHkgPT0gRmFtaWx5TG9jYWwpIHsKKyAgICAgICAgZGVidWcoRjEwMCwiZndkeF9zZXJ2ZXJfYXZhaWwoKSBGYW1pbHlMb2NhbCIsIiIsMCk7CisgICAgICAgIGlmIChob3N0KSBmcmVlKGhvc3QpOworICAgICAgICBzb2NrID0gc29ja2V0KFBGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCk7CisgICAgICAgIGlmIChzb2NrIDwgMCkKKyAgICAgICAgICAgIHJldHVybigwKTsKKworICAgICAgICBja21ha21zZyhidWYsc2l6ZW9mKGJ1ZiksIi90bXAvLlgxMS11bml4L1giLGNraXRvYShkaXNwbGF5KSxOVUxMLE5VTEwpOworICAgICAgICBzdHJuY3B5KHNhZGRyX3VuLnN1bl9wYXRoLCBidWYsIHNpemVvZihzYWRkcl91bi5zdW5fcGF0aCkpOworICAgICAgICBpZiAoY29ubmVjdChzb2NrLChzdHJ1Y3Qgc29ja2FkZHIgKikmc2FkZHJfdW4sU1VOX0xFTigmc2FkZHJfdW4pKSA8IDApCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIGNsb3NlKHNvY2spOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorI2VuZGlmICAvKiBGV0RYX1VOSVhfU09DSyAqLworCisgICAgLyogT3RoZXJ3aXNlLCB3ZSBhcmUgYXNzdW1pbmcgRmFtaWx5SW50ZXJuZXQgKi8KKyAgICBpZiAoaG9zdCkgeworICAgICAgICBja3N0cm5jcHkoYnVmLGhvc3Qsc2l6ZW9mKGJ1ZikpOworICAgICAgICBmcmVlKGhvc3QpOworICAgIH0gZWxzZQorICAgICAgICBja3N0cm5jcHkoYnVmLG15aXBhZGRyLHNpemVvZihidWYpKTsKKworICAgIGRlYnVnKEYxMTEsImZ3ZHhfc2VydmVyX2F2YWlsKCkiLCJkaXNwbGF5IixkaXNwbGF5KTsKKworICAgIHBvcnQgPSA2MDAwICsgZGlzcGxheTsKKyAgICBzYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCisgICAgZGVidWcoRjExMCwiZndkeF9zZXJ2ZXJfYXZhaWwoKSBpcC1hZGRyZXNzIixidWYsMCk7CisgICAgc2FkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKGJ1Zik7CisgICAgaWYgKCBzYWRkci5zaW5fYWRkci5zX2FkZHIgPT0gKHVuc2lnbmVkIGxvbmcpIC0xCisjaWZkZWYgSU5BRERSX05PTkUKKyAgICAgICAgIHx8IHNhZGRyLnNpbl9hZGRyLnNfYWRkciA9PSBJTkFERFJfTk9ORQorI2VuZGlmIC8qIElOQUREUl9OT05FICovCisgICAgICAgICApCisgICAgeworICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqaG9zdDsKKyAgICAgICAgaG9zdCA9IGdldGhvc3RieW5hbWUoYnVmKTsKKyAgICAgICAgaWYgKCBob3N0ID09IE5VTEwgKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmd2R4X3NlcnZlcl9hdmFpbCgpIGdldGhvc3RieW5hbWUoKSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgIG15aXBhZGRyLDApOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBob3N0ID0gY2tfY29weWhvc3RlbnQoaG9zdCk7CisjaWZkZWYgSEFERFJMSVNUCisjaWZkZWYgaF9hZGRyCisgICAgICAgIC8qIFRoaXMgaXMgZm9yIHRyeWluZyBtdWx0aXBsZSBJUCBhZGRyZXNzZXMgLSBzZWUgPG5ldGRiLmg+ICovCisgICAgICAgIGlmICghKGhvc3QtPmhfYWRkcl9saXN0KSkKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGJjb3B5KGhvc3QtPmhfYWRkcl9saXN0WzBdLAorICAgICAgICAgICAgICAgKGNhZGRyX3QpJnNhZGRyLnNpbl9hZGRyLAorICAgICAgICAgICAgICAgaG9zdC0+aF9sZW5ndGgKKyAgICAgICAgICAgICAgICk7CisjZWxzZQorICAgICAgICBiY29weShob3N0LT5oX2FkZHIsIChjYWRkcl90KSZzYWRkci5zaW5fYWRkciwgaG9zdC0+aF9sZW5ndGgpOworI2VuZGlmIC8qIGhfYWRkciAqLworI2Vsc2UgIC8qIEhBRERSTElTVCAqLworICAgICAgICBiY29weShob3N0LT5oX2FkZHIsIChjYWRkcl90KSZzYWRkci5zaW5fYWRkciwgaG9zdC0+aF9sZW5ndGgpOworI2VuZGlmIC8qIEhBRERSTElTVCAqLworICAgIH0KKworICAgIGlmICgoc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkgeworICAgICAgICBkZWJ1ZyhGMTExLCJmd2R4X3NlcnZlcl9hdmFpbCgpIiwic29ja2V0KCkgPCAwIixzb2NrKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIGlmICggY29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCBzaXplb2Yoc2FkZHIpKSA8IDApIHsKKyAgICAgICAgZGVidWcoRjExMCwiZndkeF9zZXJ2ZXJfYXZhaWwoKSIsImNvbm5lY3QoKSBmYWlsZWQiLDApOworI2lmZGVmIFRDUElQTElCCisgICAgICAgIHNvY2tldF9jbG9zZShzb2NrKTsKKyNlbHNlIC8qIFRDUElQTElCICovCisgICAgICAgIGNsb3NlKHNvY2spOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyNpZmRlZiBUQ1BJUExJQgorICAgIHNvY2tldF9jbG9zZShzb2NrKTsKKyNlbHNlIC8qIFRDUElQTElCICovCisgICAgY2xvc2Uoc29jayk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICByZXR1cm4oMSk7Cit9CisKK2ludAorZndkeF9vcGVuX3NlcnZlcl9jaGFubmVsKCkgeworICAgIGludCBzb2NrLCByZWFkeV90b19hY2NlcHQsIHNvY2syLGNoYW5uZWwsaTsKKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgIGludCBvbj0xOworI2VuZGlmIC8qIFRDUF9OT0RFTEFZICovCisjaWZkZWYgVUNYNTAKKyAgICBzdGF0aWMgdV9pbnQgc2FkZHJsZW47CisjZWxzZQorICAgIHN0YXRpYyBTT0NLT1BUX1Qgc2FkZHJsZW47CisjZW5kaWYgLyogVUNYNTAgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FkZHI7CisgICAgY2hhciBzYls4XTsKKyAgICBleHRlcm4gY2hhciB0bl9tc2dbXTsKKyNpZmRlZiBCU0RTRUxFQ1QKKyAgICBmZF9zZXQgcmZkczsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyNlbHNlCisjaWZkZWYgQkVMTFNFTENUCisgICAgZmRfc2V0IHJmZHM7CisjZWxzZQorICAgIGZkX3NldCByZmRzOworICAgIHN0cnVjdCB0aW1ldmFsIHsKKyAgICAgICAgbG9uZyB0dl9zZWM7CisgICAgICAgIGxvbmcgdHZfdXNlYzsKKyAgICB9IHR2OworI2VuZGlmIC8qIEJFTExTRUxFQ1QgKi8KKyNlbmRpZiAvKiBCU0RTRUxFQ1QgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBuY2hhbm5lbDsKKyAgICB1bnNpZ25lZCBjaGFyICogcDsKKworICAgIHNvY2sgPSBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94Lmxpc3Rlbl9zb2NrZXQ7CisKKyAgdHJ5X2FnYWluOgorCisjaWZkZWYgQlNEU0VMRUNUCisgICAgdHYudHZfc2VjICA9IHR2LnR2X3VzZWMgPSAwTDsKKyAgICB0di50dl91c2VjID0gNTA7CisgICAgRkRfWkVSTygmcmZkcyk7CisgICAgRkRfU0VUKHNvY2ssICZyZmRzKTsKKyAgICByZWFkeV90b19hY2NlcHQgPQorICAgICAgICAoKHNlbGVjdChGRF9TRVRTSVpFLAorI2lmZGVmIEhQVVgKKyNpZmRlZiBIUFVYMTAxMAorICAgICAgICAgICAgICAgICAgKGZkX3NldCAqKQorI2Vsc2UKKworICAgICAgICAgICAgICAgICAgKGludCAqKQorI2VuZGlmIC8qIEhQVVgxMDEwICovCisjZWxzZQorI2lmZGVmIF9fREVDQworICAgICAgICAgICAgICAgICAgKGZkX3NldCAqKQorI2VuZGlmIC8qIF9fREVDQyAqLworI2VuZGlmIC8qIEhQVVggKi8KKyAgICAgICAgICAgICAgICAgICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpID4gMCkgJiYKKyAgICAgICAgICBGRF9JU1NFVChzb2NrLCAmcmZkcykpOworI2Vsc2UgLyogQlNEU0VMRUNUICovCisjaWZkZWYgSUJNU0VMRUNUCisgICAgcmVhZHlfdG9fYWNjZXB0ID0gKHNlbGVjdCgmc29jaywgMSwgMCwgMCwgNTApID09IDEpOworI2Vsc2UKKyNpZmRlZiBCRUxMU0VMRUNUCisgICAgRkRfWkVSTyhyZmRzKTsKKyAgICBGRF9TRVQoc29jaywgcmZkcyk7CisgICAgcmVhZHlfdG9fYWNjZXB0ID0KKyAgICAgICAgKChzZWxlY3QoMTI4LCByZmRzLCBOVUxMLCBOVUxMLCA1MCkgPiAwKSAmJgorICAgICAgICAgIEZEX0lTU0VUKHNvY2ssIHJmZHMpKTsKKyNlbHNlCisvKiBUcnkgdGhpcyAtIHdoYXQncyB0aGUgd29yc3QgdGhhdCBjYW4gaGFwcGVuLi4uICovCisKKyAgICB0di50dl9zZWMgID0gdHYudHZfdXNlYyA9IDBMOworICAgIHR2LnR2X3VzZWMgPSA1MDsKKyAgICBGRF9aRVJPKCZyZmRzKTsKKyAgICBGRF9TRVQoc29jaywgJnJmZHMpOworICAgIHJlYWR5X3RvX2FjY2VwdCA9CisgICAgICAgICgoc2VsZWN0KEZEX1NFVFNJWkUsCisgICAgICAgICAgICAgICAgICAoZmRfc2V0ICopICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpID4gMCkgJiYKKyAgICAgICAgICBGRF9JU1NFVChzb2NrLCAmcmZkcykpOworI2VuZGlmIC8qIEJFTExTRUxFQ1QgKi8KKyNlbmRpZiAvKiBJQk1TRUxFQ1QgKi8KKyNlbmRpZiAvKiBCU0RTRUxFQ1QgKi8KKworICAgIGlmICggIXJlYWR5X3RvX2FjY2VwdCApCisgICAgICAgIHJldHVybigwKTsKKworICAgIGlmICgoc29jazIgPSBhY2NlcHQoc29jaywoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCZzYWRkcmxlbikpIDwgMCkgeworICAgICAgICBpbnQgaSA9IGVycm5vOyAgICAgICAgICAgICAgICAgIC8qIHNhdmUgZXJyb3IgY29kZSAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJ0Y3BzcnZfb3BlbiBhY2NlcHQgZXJybm8iLCIiLGkpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qCisgICAgICogTm93IHdlIGhhdmUgdGhlIG9wZW4gc29ja2V0LiAgV2UgbXVzdCBub3cgZmluZCBhIGNoYW5uZWwgdG8gc3RvcmUKKyAgICAgKiBpdCBpbiwgYW5kIHRoZW4gbm90aWZ5IHRoZSBjbGllbnQuCisgICAgICovCisKKyAgICBmb3IgKCBjaGFubmVsPTA7Y2hhbm5lbDxNQVhGV0RYO2NoYW5uZWwrKyApIHsKKyAgICAgICAgaWYgKCBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbY2hhbm5lbF0uZmQgPT0gLTEgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCBjaGFubmVsID09IE1BWEZXRFggKSB7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgc29ja2V0X2Nsb3NlKHNvY2syKTsKKyNlbHNlIC8qIFRDUElQTElCICovCisgICAgICAgIGNsb3NlKHNvY2syKTsKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIGlmICggZndkeF9zZW5kX29wZW4oY2hhbm5lbCkgPCAwICkgeworI2lmZGVmIFRDUElQTElCCisgICAgICAgIHNvY2tldF9jbG9zZShzb2NrMik7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworICAgICAgICBjbG9zZShzb2NrMik7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICB9CisKKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgIHNldHNvY2tvcHQoc29jazIsSVBQUk9UT19UQ1AsVENQX05PREVMQVksKGNoYXIgKikmb24sc2l6ZW9mKG9uKSk7CisjZW5kaWYgLyogVENQX05PREVMQVkgKi8KKworICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFtjaGFubmVsXS5mZCA9IHNvY2syOworICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFtjaGFubmVsXS5pZCA9IGNoYW5uZWw7CisgICAgZ290byB0cnlfYWdhaW47CisKKyAgICByZXR1cm4oMCk7ICAvKiBuZXZlciByZWFjaGVkICovCit9CisKK2ludAorZndkeF9jbG9zZV9jaGFubmVsKGNoYW5uZWwpIGludCBjaGFubmVsOyB7CisgICAgaW50IGksZmQ7CisKKyAgICBmb3IgKCBpPTA7IGk8TUFYRldEWCA7IGkrKyApIHsKKyAgICAgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFtpXS5pZCA9PSBjaGFubmVsKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICggaSA9PSBNQVhGV0RYICkKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIGZkID0gVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW2ldLmZkOworICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFtpXS5mZCA9IC0xOworICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFtpXS5pZCA9IC0xOworICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFtpXS5uZWVkX3RvX3NlbmRfeGF1dGggPSAwOworCisjaWZkZWYgVENQSVBMSUIKKyAgICBzb2NrZXRfY2xvc2UoZmQpOworI2Vsc2UgLyogVENQSVBMSUIgKi8KKyAgICBjbG9zZShmZCk7CisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorZndkeF9jbG9zZV9hbGwoKSB7CisgICAgaW50IHgsZmQ7CisKKyAgICBkZWJ1ZyhGMTExLCJmd2R4X2Nsb3NlX2FsbCgpIiwKKyAgICAgICAgICAiVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5saXN0ZW5fc29ja2V0IiwKKyAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94Lmxpc3Rlbl9zb2NrZXQpOworCisgICAgaWYgKCBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94Lmxpc3Rlbl9zb2NrZXQgIT0gLTEgKSB7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgICAgc29ja2V0X2Nsb3NlKFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3gubGlzdGVuX3NvY2tldCk7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworICAgICAgICBjbG9zZShURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94Lmxpc3Rlbl9zb2NrZXQpOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3gubGlzdGVuX3NvY2tldCA9IC0xOworICAgIH0KKworICAgIGZvciAoeCA9IDA7IHggPCBNQVhGV0RYOyB4KyspIHsKKyAgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFt4XS5mZCAhPSAtMSkgeworICAgICAgZmQgPSBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbeF0uZmQ7CisgICAgICBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbeF0uZmQgPSAtMTsKKyAgICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFt4XS5pZCA9IC0xOworICAgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW3hdLm5lZWRfdG9fc2VuZF94YXV0aCA9IDA7CisgICAgICBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbeF0uc3VzcGVuZCA9IDA7CisjaWZkZWYgVENQSVBMSUIKKyAgICAgIHNvY2tldF9jbG9zZShmZCk7CisjZWxzZSAvKiBUQ1BJUExJQiAqLworICAgICAgY2xvc2UoZmQpOworI2VuZGlmIC8qIFRDUElQTElCICovCisgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSBmb3IgVW5peCAqLworI2lmbmRlZiBzb2NrZXRfd3JpdGUKKyNkZWZpbmUgc29ja2V0X3dyaXRlKGYscyxuKSAgICB3cml0ZShmLHMsbikKKyNlbmRpZiAvKiBzb2NrZXRfd3JpdGUgKi8KKyNpZm5kZWYgc29ja2V0X3JlYWQKKyNkZWZpbmUgc29ja2V0X3JlYWQoZixzLG4pICAgICByZWFkKGYscyxuKQorI2VuZGlmIC8qIHNvY2tldF9yZWFkICovCisKK2ludAorZndkeF93cml0ZV9kYXRhX3RvX2NoYW5uZWwoY2hhbm5lbCwgZGF0YSwgbGVuKQorICAgIGludCBjaGFubmVsOyBjaGFyICogZGF0YTsgaW50IGxlbjsKK3sKKyAgICBpbnQgc29jaywgY291bnQsIHRyeT0wLCBsZW5ndGggPSBsZW4sIGk7CisKKyAgICBpZiAoIGxlbiA8PSAwICkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgZm9yICggaT0wOyBpPE1BWEZXRFggOyBpKysgKSB7CisgICAgICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbaV0uaWQgPT0gY2hhbm5lbCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIGkgPT0gTUFYRldEWCApIHsKKyAgICAgICAgZGVidWcoRjExMCwiZndkeF93cml0ZV9kYXRhX3RvX2NoYW5uZWwiLAorICAgICAgICAgICAgICAgImF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gY2xvc2VkIGNoYW5uZWwiLDApOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIHNvY2sgPSBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbaV0uZmQ7CisgICAgZGVidWcoRjExMSwiZndkeF93cml0ZV9kYXRhX3RvX2NoYW5uZWwiLCJzb2NrZXQiLHNvY2spOworICAgIGhleGR1bXAoImZ3ZHhfd3JpdGVfZGF0YV90b19jaGFubmVsIixkYXRhLGxlbik7CisKKyAgZndkeF93cml0ZV9kYXRhX3RvX2NoYW5uZWxfcmV0cnk6CisKKyAgICBpZiAoKGNvdW50ID0gc29ja2V0X3dyaXRlKHNvY2ssZGF0YSxsZW4pKSA8IDApIHsKKyAgICAgICAgaW50IHNfZXJybm8gPSBzb2NrZXRfZXJybm87IC8qIG1heWJlIGEgZnVuY3Rpb24gKi8KKyAgICAgICAgZGVidWcoRjEwMSwiZndkeF93cml0ZV9kYXRhX3RvX2NoYW5uZWwgc29ja2V0X3dyaXRlIGVycm9yIiwiIixzX2Vycm5vKTsKKyNpZmRlZiBCRVRBVEVTVAorICAgICAgICBwcmludGYoImZ3ZHhfd3JpdGVfZGF0YV90b19jaGFubmVsIGVycm9yXHJcbiIpOworI2VuZGlmIC8qIEJFVEFURVNUICovCisjaWZkZWYgT1MyCisgICAgICAgIGlmIChvczJzb2NrZXRlcnJvcihzX2Vycm5vKSA8IDApCisgICAgICAgICAgICByZXR1cm4oLTIpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAgICAgLyogQ2FsbCBpdCBhbiBpL28gZXJyb3IgKi8KKyAgICB9CisgICAgaWYgKGNvdW50IDwgbGVuKSB7CisgICAgICAgIGRlYnVnKEYxMTEsImZ3ZHhfd3JpdGVfZGF0YV90b19jaGFubmVsIHNvY2tldF93cml0ZSIsZGF0YSxjb3VudCk7CisgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgIGRhdGEgKz0gY291bnQ7CisgICAgICAgICAgICBsZW4gLT0gY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjExMSwiZndkeF93cml0ZV9kYXRhX3RvX2NoYW5uZWwgcmV0cnkiLGRhdGEsbGVuKTsKKyAgICAgICAgaWYgKCBsZW4gPiAwICkKKyAgICAgICAgICAgIGdvdG8gZndkeF93cml0ZV9kYXRhX3RvX2NoYW5uZWxfcmV0cnk7CisgICAgfQorCisgICAgZGVidWcoRjExMSwiZndkeF93cml0ZV9kYXRhX3RvX2NoYW5uZWwgY29tcGxldGUiLGRhdGEsbGVuZ3RoKTsKKyAgICByZXR1cm4obGVuZ3RoKTsgLyogc3VjY2VzcyAtIHJldHVybiB0b3RhbCBsZW5ndGggKi8KK30KKworVk9JRAorZndkeF9jaGVja19zb2NrZXRzKGZkX3NldCAqaWJpdHMpCit7CisgICAgaW50IHgsIHNvY2ssIGNoYW5uZWwsIGJ5dGVzOworICAgIHN0YXRpYyBjaGFyIGJ1ZmZlclszMjAwMF07CisKKyAgICBkZWJ1ZyhGMTAwLCJmd2R4X2NoZWNrX3NvY2tldHMoKSIsIiIsMCk7CisgICAgaWYgKCBzc3RlbG5ldCAmJiAhVEVMT1BUX01FKFRFTE9QVF9GT1JXQVJEX1gpIHx8CisgICAgICAgICAhc3N0ZWxuZXQgJiYgIVRFTE9QVF9VKFRFTE9QVF9GT1JXQVJEX1gpKSB7CisgICAgICAgIGRlYnVnKEYxMTAsImZ3ZHhfY2hlY2tfc29ja2V0cygpIiwiVEVMT1BUX0ZPUldBUkRfWCBub3QgbmVnb3RpYXRlZCIsMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHggPSAwOyB4IDwgTUFYRldEWDsgeCsrKSB7CisgICAgICAgIGlmICggVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW3hdLmZkID09IC0xIHx8CisgICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW3hdLnN1c3BlbmQgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgc29jayA9IFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFt4XS5mZDsKKyAgICAgICAgaWYgKEZEX0lTU0VUKHNvY2ssIGliaXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhbm5lbCA9IFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFt4XS5pZDsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ3ZHhfY2hlY2tfc29ja2V0cygpIiwiY2hhbm5lbCBzZXQiLGNoYW5uZWwpOworCisgICAgICAgICAgICBieXRlcyA9IHNvY2tldF9yZWFkKHNvY2ssIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgaWYgKGJ5dGVzID4gMCkKKyAgICAgICAgICAgICAgICBmd2R4X3NlbmRfZGF0YV9mcm9tX2NoYW5uZWwoY2hhbm5lbCwgYnVmZmVyLCBieXRlcyk7CisgICAgICAgICAgICBlbHNlIGlmIChieXRlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgZndkeF9jbG9zZV9jaGFubmVsKGNoYW5uZWwpOworICAgICAgICAgICAgICAgIGZ3ZHhfc2VuZF9jbG9zZShjaGFubmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworaW50Citmd2R4X2luaXRfZmRfc2V0KGZkX3NldCAqaWJpdHMpCit7CisgICAgaW50IHgsc2V0PTAsY250PTA7CisKKyAgICBpZiAoIHNzdGVsbmV0ICYmICFURUxPUFRfTUUoVEVMT1BUX0ZPUldBUkRfWCkgfHwKKyAgICAgICAgICFzc3RlbG5ldCAmJiAhVEVMT1BUX1UoVEVMT1BUX0ZPUldBUkRfWCkpIHsKKyAgICAgICAgZGVidWcoRjExMCwiZndkeF9pbml0X2ZkX3NldCgpIiwiVEVMT1BUX0ZPUldBUkRfWCBub3QgbmVnb3RpYXRlZCIsMCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5saXN0ZW5fc29ja2V0ICE9IC0xKSB7CisgICAgICAgIHNldCsrOworICAgICAgICBGRF9TRVQoVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5saXN0ZW5fc29ja2V0LCBpYml0cyk7CisgICAgfQorICAgIGZvciAoeCA9IDA7IHggPCBNQVhGV0RYOyB4KyspIHsKKyAgICAgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFt4XS5mZCAhPSAtMSkgeworICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW3hdLnN1c3BlbmQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzZXQrKzsKKyAgICAgICAgICAgIEZEX1NFVChURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbeF0uZmQsIGliaXRzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2V0ICsgY250ID09IDApIHsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4oc2V0KTsKKyAgICB9Cit9CisKKyNpZmRlZiBOVAorVk9JRAorZndkeF90aHJlYWQoIFZPSUQgKiBkdW1teSApCit7CisgICAgZmRfc2V0IGlmZHM7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZXh0ZXJuIGludCBwcmlvcml0eTsKKyAgICBpbnQgbjsKKworICAgIHNldGludCgpOworICAgIFNldFRocmVhZFBydHkocHJpb3JpdHksaXNXaW45NSgpID8gMyA6IDExKTsKKworICAgIHdoaWxlICggIXNzdGVsbmV0ICYmIFRFTE9QVF9VKFRFTE9QVF9GT1JXQVJEX1gpIHx8CisgICAgICAgICAgICBzc3RlbG5ldCAmJiBURUxPUFRfTUUoVEVMT1BUX0ZPUldBUkRfWCkpCisgICAgeworICAgICAgICBGRF9aRVJPKCZpZmRzKTsKKyAgICAgICAgbiA9IGZ3ZHhfaW5pdF9mZF9zZXQoJmlmZHMpOworICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICAgIHR2LnR2X3NlYyA9IDA7CisgICAgICAgICAgICB0di50dl91c2VjID0gMjUwMDsKKyAgICAgICAgICAgIGlmICggc2VsZWN0KEZEX1NFVFNJWkUsICZpZmRzLCBOVUxMLCBOVUxMLCAmdHYpID4gMCApCisgICAgICAgICAgICAgICAgZndkeF9jaGVja19zb2NrZXRzKCZpZmRzKTsKKworICAgICAgICB9IGVsc2UgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LnRocmVhZF9zdGFydGVkID0gMDsKKyAgICAgICAgICAgIGNrVGhyZWFkRW5kKE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBDS19GT1JXQVJEX1ggKi8KKyNlbmRpZiAvKiBUTkNPREUgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2tjbmV0LmggYi9ja2VybWl0LTguMC4yMTEvY2tjbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkNTU3NgotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja2NuZXQuaApAQCAtMCwwICsxLDE0NDEgQEAKKy8qIGNrY25ldC5oIC0tIFN5bWJvbCBhbmQgbWFjcm8gZGVmaW5pdGlvbnMgZm9yIEMtS2VybWl0IG5ldHdvcmsgc3VwcG9ydCAqLworCisvKgorICBBdXRob3I6IEZyYW5rIGRhIENydXogPGZkY0Bjb2x1bWJpYS5lZHU+CisgIENvbHVtYmlhIFVuaXZlcnNpdHkgQWNhZGVtaWMgSW5mb3JtYXRpb24gU3lzdGVtcywgTmV3IFlvcmsgQ2l0eS4KKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorKi8KKyNpZm5kZWYgQ0tDTkVUX0gKKyNkZWZpbmUgQ0tDTkVUX0gKKworLyogTmV0d29yayB0eXBlcyAqLworCisjZGVmaW5lIE5FVF9OT05FIDAgICAgICAgICAgICAgICAgICAgICAgLyogTm9uZSAqLworI2RlZmluZSBORVRfVENQQiAxICAgICAgICAgICAgICAgICAgICAgIC8qIFRDUC9JUCBCZXJrZWxleSAoc29ja2V0KSAqLworI2RlZmluZSBORVRfVENQQSAyICAgICAgICAgICAgICAgICAgICAgIC8qIFRDUC9JUCBBVCZUIChzdHJlYW1zKSAqLworI2RlZmluZSBORVRfU1gyNSAzICAgICAgICAgICAgICAgICAgICAgIC8qIFNVTk9TIFN1bkxpbmsgWC4yNSAqLworI2RlZmluZSBORVRfREVDICA0ICAgICAgICAgICAgICAgICAgICAgIC8qIERFQ25ldCAqLworI2RlZmluZSBORVRfVlBTSSA1ICAgICAgICAgICAgICAgICAgICAgIC8qIFZBWCBQU0kgKi8KKyNkZWZpbmUgTkVUX1BJUEUgNiAgICAgICAgICAgICAgICAgICAgICAvKiBMQU4gTWFuYWdlciBOYW1lZCBQaXBlICovCisjZGVmaW5lIE5FVF9WWDI1IDcgICAgICAgICAgICAgICAgICAgICAgLyogU3RyYXR1cyBWT1MgWC4yNSAqLworI2RlZmluZSBORVRfQklPUyA4ICAgICAgICAgICAgICAgICAgICAgIC8qIElCTSBOZXRCaW9zICovCisjZGVmaW5lIE5FVF9TTEFUIDkgICAgICAgICAgICAgICAgICAgICAgLyogTWVyaWRpYW4gVGVjaG5vbG9naWVzJyBTdXBlckxBVCAqLworI2RlZmluZSBORVRfRklMRSAxMCAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgZnJvbSBhIGZpbGUgKi8KKyNkZWZpbmUgTkVUX0NNRCAgMTEgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIGZyb20gYSBzdWItcHJvY2VzcyAqLworI2RlZmluZSBORVRfRExMICAxMiAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgYSBETEwgZm9yIHVzZSBhcyBjb21tIGNoYW5uZWwqLworI2RlZmluZSBORVRfSVgyNSAxMyAgICAgICAgICAgICAgICAgICAgIC8qIElCTSBBSVggNC4xIFguMjUgKi8KKyNkZWZpbmUgTkVUX0hYMjUgMTQgICAgICAgICAgICAgICAgICAgICAvKiBIUC1VWCAxMCBYLjI1ICovCisjZGVmaW5lIE5FVF9QVFkgIDE1ICAgICAgICAgICAgICAgICAgICAgLyogUHNldWRvdGVybWluYWwgKi8KKyNkZWZpbmUgTkVUX1NTSCAgMTYgICAgICAgICAgICAgICAgICAgICAvKiBTU0ggKi8KKworI2lmZGVmIE9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIE9TLzIsIG9ubHkgdGhlIDMyLWJpdCAqLworI2lmbmRlZiBfXzMyQklUX18gICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcnNpb24gZ2V0cyBORVRCSU9TICovCisjaWZkZWYgQ0tfTkVUQklPUworI3VuZGVmIENLX05FVEJJT1MKKyNlbmRpZiAvKiBDS19ORVRCSU9TICovCisjZW5kaWYgLyogX18zMkJJVF9fICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBfTV9QUEMKKyNpZmRlZiBTVVBFUkxBVAorI3VuZGVmIFNVUEVSTEFUCisjZW5kaWYgLyogU1VQRVJMQVQgKi8KKyNlbmRpZiAvKiBfTV9QUEMgKi8KKworI2lmZGVmIE5QSVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBpdGVtcyBpbiBjb21tb24gdG8gKi8KKyNkZWZpbmUgTlBJUEVPUkJJT1MgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lZCBQaXBlcyBhbmQgTkVUQklPUyAqLworI2VuZGlmIC8qIE5QSVBFICovCisjaWZkZWYgQ0tfTkVUQklPUworI2lmbmRlZiBOUElQRU9SQklPUworI2RlZmluZSBOUElQRU9SQklPUworI2VuZGlmIC8qIE5QSVBFT1JCSU9TICovCisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworCisvKiBOZXR3b3JrIHZpcnR1YWwgdGVybWluYWwgcHJvdG9jb2xzIChmb3IgU0VUIEhPU1QgY29ubmVjdGlvbnMpICovCisvKiBGVFAsIEhUVFAgYW5kIFNTSCBoYXZlIHRoZWlyIG93biBzdGFja3MgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTlBfREVGQVVMVCAgICAyNTUKKyNkZWZpbmUgTlBfTk9ORSAgICAgICAgIDAgICAgICAgICAgICAgICAvKiBOb25lIChhc3luYykgKi8KKyNkZWZpbmUgTlBfVEVMTkVUICAgICAgIDEgICAgICAgICAgICAgICAvKiBUQ1AvSVAgdGVsbmV0ICovCisjZGVmaW5lIE5QX1ZUUCAgICAgICAgICAyICAgICAgICAgICAgICAgLyogSVNPIFZpcnR1YWwgVGVybWluYWwgUHJvdG9jb2wgKi8KKyNkZWZpbmUgTlBfWDMgICAgICAgICAgIDMgICAgICAgICAgICAgICAvKiBDQ0lUVCBYLjMgKi8KKyNkZWZpbmUgTlBfWDI4ICAgICAgICAgIDQgICAgICAgICAgICAgICAvKiBDQ0lUVCBYLjI4ICovCisjZGVmaW5lIE5QX1gyOSAgICAgICAgICA1ICAgICAgICAgICAgICAgLyogQ0NJVFQgWC4yOSAqLworI2RlZmluZSBOUF9STE9HSU4gICAgICAgNiAgICAgICAgICAgICAgIC8qIFRDUC9JUCBSZW1vdGUgbG9naW4gKi8KKyNkZWZpbmUgTlBfS0VSTUlUICAgICAgIDcgICAgICAgICAgICAgICAvKiBUQ1AvSVAgS2VybWl0ICovCisjZGVmaW5lIE5QX1RDUFJBVyAgICAgICA4ICAgICAgICAgICAgICAgLyogVENQL0lQIFJhdyBzb2NrZXQgKi8KKyNkZWZpbmUgTlBfVENQVU5LICAgICAgIDkgICAgICAgICAgICAgICAvKiBUQ1AvSVAgVW5rbm93biAqLworI2RlZmluZSBOUF9TU0wgICAgICAgICAxMCAgICAgICAgICAgICAgIC8qIFRDUC9JUCBTU0x2MjMgKi8KKyNkZWZpbmUgTlBfVExTICAgICAgICAgMTEgICAgICAgICAgICAgICAvKiBUQ1AvSVAgVExTdjEgKi8KKyNkZWZpbmUgTlBfU1NMX1RFTE5FVCAgMTIgICAgICAgICAgICAgICAvKiBUQ1AvSVAgVGVsbmV0IG92ZXIgU1NMdjIzICovCisjZGVmaW5lIE5QX1RMU19URUxORVQgIDEzICAgICAgICAgICAgICAgLyogVENQL0lQIFRlbG5ldCBvdmVyIFRMU3YxICovCisjZGVmaW5lIE5QX0s0TE9HSU4gICAgIDE0ICAgICAgICAgICAgICAgLyogVENQL0lQIEtlcmJlcml6ZWQgcmVtb3RlIGxvZ2luICovCisjZGVmaW5lIE5QX0VLNExPR0lOICAgIDE1ICAgICAgICAgICAgICAgLyogVENQL0lQIEVuY3J5cHRlZCBLZXJiZXJpemVkIC4uLiAqLworI2RlZmluZSBOUF9LNUxPR0lOICAgICAxNiAgICAgICAgICAgICAgIC8qIFRDUC9JUCBLZXJiZXJpemVkIHJlbW90ZSBsb2dpbiAqLworI2RlZmluZSBOUF9FSzVMT0dJTiAgICAxNyAgICAgICAgICAgICAgIC8qIFRDUC9JUCBFbmNyeXB0ZWQgS2VyYmVyaXplZCAuLi4gKi8KKyNkZWZpbmUgTlBfSzVVMlUgICAgICAgMTggICAgICAgICAgICAgICAvKiBUQ1AvSVAgS2VyYmVyb3MgNSBVc2VyIHRvIFVzZXIgKi8KKyNkZWZpbmUgTlBfQ1RFUk0gICAgICAgMTkgICAgICAgICAgICAgICAvKiBERUMgQ1RFUk0gKi8KKyNkZWZpbmUgTlBfTEFUICAgICAgICAgMjAgICAgICAgICAgICAgICAvKiBERUMgTEFUICovCisvKiBvdGhlcnMgaGVyZS4uLiAqLworCisjaWZkZWYgQ0tfU1NMCisjZGVmaW5lIElTX1RFTE5FVCgpICAgICAgKG5ldHR5cGUgPT0gTkVUX1RDUEIgJiYgKHR0bnByb3RvID09IE5QX1RFTE5FVCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHRucHJvdG8gPT0gTlBfU1NMX1RFTE5FVCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHRucHJvdG8gPT0gTlBfVExTX1RFTE5FVCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHRucHJvdG8gPT0gTlBfS0VSTUlUKSkKKyNlbHNlIC8qIENLX1NTTCAqLworI2RlZmluZSBJU19URUxORVQoKSAgICAgIChuZXR0eXBlID09IE5FVF9UQ1BCICYmICh0dG5wcm90byA9PSBOUF9URUxORVQgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR0bnByb3RvID09IE5QX0tFUk1JVCkpCisjZW5kaWYgLyogQ0tfU1NMICovCisKKyNpZmRlZiBDS19LRVJCRVJPUworI2lmZGVmIEtSQjUKKyNpZmRlZiBLUkI0CisjZGVmaW5lIElTX1JMT0dJTigpICAgICAgKG5ldHR5cGUgPT0gTkVUX1RDUEIgJiYgKHR0bnByb3RvID09IE5QX1JMT0dJTiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHRucHJvdG8gPT0gTlBfSzVMT0dJTiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHRucHJvdG8gPT0gTlBfRUs1TE9HSU4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR0bnByb3RvID09IE5QX0s0TE9HSU4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR0bnByb3RvID09IE5QX0VLNExPR0lOIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICApKQorI2Vsc2UgLyogS1JCNCAqLworI2RlZmluZSBJU19STE9HSU4oKSAgICAgIChuZXR0eXBlID09IE5FVF9UQ1BCICYmICh0dG5wcm90byA9PSBOUF9STE9HSU4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR0bnByb3RvID09IE5QX0s1TE9HSU4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR0bnByb3RvID09IE5QX0VLNUxPR0lOIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICApKQorI2VuZGlmIC8qIEtSQjQgKi8KKyNlbHNlIC8qIEtSQjUgKi8KKyNpZmRlZiBLUkI0CisjZGVmaW5lIElTX1JMT0dJTigpICAgICAgKG5ldHR5cGUgPT0gTkVUX1RDUEIgJiYgKHR0bnByb3RvID09IE5QX1JMT0dJTiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHRucHJvdG8gPT0gTlBfSzRMT0dJTiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHRucHJvdG8gPT0gTlBfRUs0TE9HSU4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICkpCisjZWxzZSAvKiBLUkI0ICovCitLRVJCRVJPUyBkZWZpbmVkIHdpdGhvdXQgZWl0aGVyIEtSQjQgb3IgS1JCNQorI2VuZGlmIC8qIEtSQjQgKi8KKyNlbmRpZiAvKiBLUkI1ICovCisjZWxzZSAvKiBDS19LRVJCRVJPUyAqLworI2RlZmluZSBJU19STE9HSU4oKSAgICAgIChuZXR0eXBlID09IE5FVF9UQ1BCICYmICh0dG5wcm90byA9PSBOUF9STE9HSU4pKQorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKyNkZWZpbmUgSVNfU1NIKCkgICAgICAgICAobmV0dHlwZSA9PSBORVRfU1NIKQorCisvKiBSTE9HSU4gTW9kZXMgKi8KKyNkZWZpbmUgICAgUkxfUkFXICAgICAwICAgICAgICAgICAgICAgICAvKiAgRG8gTm90IFByb2Nlc3MgWE9OL1hPRkYgKi8KKyNkZWZpbmUgICAgUkxfQ09PS0VEICAxICAgICAgICAgICAgICAgICAvKiAgRG8gUHJvY2VzcyBYT04vWE9GRiAqLworCisvKiBFbmNyeXB0aW9uIHR5cGVzICovCisKKyNkZWZpbmUgQ1hfTk9ORSAgICA5OTkKKworI2lmZGVmIEVOQ1RZUEVfQU5ZCisjZGVmaW5lIENYX0FVVE8gRU5DVFlQRV9BTlkKKyNlbHNlCisjZGVmaW5lIENYX0FVVE8gMAorI2VuZGlmIC8qIEVOQ1RZUEVfQU5ZICovCisKKyNpZmRlZiBFTkNUWVBFX0RFU19DRkI2NAorI2RlZmluZSBDWF9ERVNDNjQgRU5DVFlQRV9ERVNfQ0ZCNjQKKyNlbHNlCisjZGVmaW5lIENYX0RFU0M2NCAxCisjZW5kaWYgLyogRU5DVFlQRV9ERVNfQ0ZCNjQgKi8KKworI2lmZGVmIEVOQ1RZUEVfREVTX09GQjY0CisjZGVmaW5lIENYX0RFU082NCBFTkNUWVBFX0RFU19PRkI2NAorI2Vsc2UKKyNkZWZpbmUgQ1hfREVTTzY0IDIKKyNlbmRpZiAvKiBFTkNUWVBFX0RFU19PRkI2NCAqLworCisjaWZkZWYgRU5DVFlQRV9ERVMzX0NGQjY0CisjZGVmaW5lIENYX0RFUzNDNjQgRU5DVFlQRV9ERVMzX0NGQjY0CisjZWxzZQorI2RlZmluZSBDWF9ERVMzQzY0IDMKKyNlbmRpZiAvKiBFTkNUWVBFX0RFU19DRkI2NCAqLworCisjaWZkZWYgRU5DVFlQRV9ERVMzX09GQjY0CisjZGVmaW5lIENYX0RFU082NCBFTkNUWVBFX0RFUzNfT0ZCNjQKKyNlbHNlCisjZGVmaW5lIENYX0RFUzNPNjQgNAorI2VuZGlmIC8qIEVOQ1RZUEVfREVTX09GQjY0ICovCisKKyNpZmRlZiBFTkNUWVBFX0NBU1Q1XzQwX0NGQjY0CisjZGVmaW5lIENYX0M1NDBDNjQgRU5DVFlQRV9DQVNUNV80MF9DRkI2NAorI2Vsc2UKKyNkZWZpbmUgQ1hfQzU0MEM2NCA4CisjZW5kaWYgLyogRU5DVFlQRV9DQVNUNV80MF9DRkI2NCAqLworCisjaWZkZWYgRU5DVFlQRV9DQVNUNV80MF9PRkI2NAorI2RlZmluZSBDWF9DNTQwTzY0IEVOQ1RZUEVfQ0FTVDVfNDBfT0ZCNjQKKyNlbHNlCisjZGVmaW5lIENYX0M1NDBPNjQgOQorI2VuZGlmIC8qIEVOQ1RZUEVfQ0FTVDVfNDBfT0ZCNjQgKi8KKworI2lmZGVmIEVOQ1RZUEVfQ0FTVDEyOF9DRkI2NAorI2RlZmluZSBDWF9DMTI4QzY0IEVOQ1RZUEVfQ0FTVDEyOF9DRkI2NAorI2Vsc2UKKyNkZWZpbmUgQ1hfQzEyOEM2NCAxMAorI2VuZGlmIC8qIEVOQ1RZUEVfQ0FTVDEyOF9DRkI2NCAqLworCisjaWZkZWYgRU5DVFlQRV9DQVNUMTI4X09GQjY0CisjZGVmaW5lIENYX0MxMjhPNjQgRU5DVFlQRV9DQVNUMTI4X09GQjY0CisjZWxzZQorI2RlZmluZSBDWF9DMTI4TzY0IDExCisjZW5kaWYgLyogRU5DVFlQRV9DQVNUMTI4X09GQjY0ICovCisKKy8qIEJhc2ljIG5ldHdvcmsgZnVuY3Rpb24gcHJvdG90eXBlcywgY29tbW9uIHRvIGFsbC4gKi8KKworX1BST1RPVFlQKCBpbnQgbmV0b3BlbiwgKGNoYXIgKiwgaW50ICosIGludCkgKTsKK19QUk9UT1RZUCggaW50IG5ldGNsb3MsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgbmV0Zmx1aSwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBuZXR0Y2hrLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IG5ldGJyZWFrLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IG5ldGluYywgKGludCkgKTsKK19QUk9UT1RZUCggaW50IG5ldHhpbiwgKGludCwgQ0hBUiAqKSApOworX1BST1RPVFlQKCBpbnQgbmV0dG9sLCAoQ0hBUiAqLCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBuZXR0b2MsIChDSEFSKSApOworLyoKKyAgU3VuTGluayBYLjI1IHN1cHBvcnQgYnkgTWFyY2VsbG8gRnJ1dGlnLCBDYXRob2xpYyBVbml2ZXJzaXR5LAorICBSaW8gZGUgSmFuZWlybywgQnJhemlsLCAxOTkwLgorCisgIE1heWJlIHRoaXMgY2FuIGJlIGFkYXB0ZWQgdG8gVkFYIFBTSSBhbmQgb3RoZXIgWC4yNSBwcm9kdWN0cyB0b28uCisqLworI2lmbmRlZiBTVU5PUzQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgdmFsaWQgZm9yIFNVTk9TNCAqLworI2lmbmRlZiBTT0xBUklTCisjaWZkZWYgU1VOWDI1CisjdW5kZWYgU1VOWDI1CisjZW5kaWYgLyogU1VOWDI1ICovCisjZW5kaWYgLyogU09MQVJJUyAqLworI2VuZGlmIC8qIFNVTk9TNCAqLworCisjaWZkZWYgU1RSQVRVU1gyNQorI2RlZmluZSBBTllYMjUKKyNkZWZpbmUgTUFYX1VTRVJfREFUQSAxMjggLyogU1VOIGRlZmluZXMgdGhpcyBpbiBhIGhlYWRlciBmaWxlLCBJIGJlbGlldmUuICovCisjZW5kaWYgLyogU1RSQVRVU1gyNSAqLworCisjaWZkZWYgU1VOWDI1CisjZGVmaW5lIEFOWVgyNQorI2VuZGlmIC8qIFNVTlgyNSAqLworCisjaWZkZWYgSUJNWDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUlYIDQuMSBYLjI1ICovCisjaWZuZGVmIEFJWDQxCisjdW5kZWYgSUJNWDI1CisjZWxzZSAvKiBBSVg0MSAqLworI2RlZmluZSBBTllYMjUKKyNkZWZpbmUgTUFYX1VTRVJfREFUQSBOUElfTUFYX0RBVEEgICAgICAvKiB1c2VkIGZvciBidWZmZXIgc2l6ZXMgKi8KKyNlbmRpZiAvKiBBSVg0MSAqLworI2VuZGlmIC8qIElCTVgyNSAqLworCisjaWZkZWYgSFBYMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSFAtVVggMTAuKiBYLjI1ICovCisjaWZuZGVmIEhQVVgxMAorI3VuZGVmIEhQWDI1CisjZWxzZSAvKiBIUFVYMTAgKi8KKyNkZWZpbmUgQU5ZWDI1CisjZW5kaWYgLyogSFBVWDEwICovCisjZW5kaWYgLyogSFBYMjUgKi8KKworI2lmZGVmIEFOWVgyNQorI2lmbmRlZiBORVRDT05OICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFOWVgyNSBpbXBsaWVzIE5FVENPTk4gKi8KKyNkZWZpbmUgTkVUQ09OTgorI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2RlZmluZSBNQVhQQURQQVJNUyAgICAgICAgICAgICAgICAyMiAgIC8qIE51bWJlciBvZiBQQUQgcGFyYW1ldGVycyAqLworI2RlZmluZSBNQVhDVURBVEEgICAgICAgICAgICAgICAgICAxMiAgIC8qIE1heCBsZW5ndGggb2YgWC4yNSBjYWxsIHVzZXIgZGF0YSAqLworI2RlZmluZSBYMjlQSUQgICAgICAgICAgICAgICAgICAgICAgMSAgIC8qIFguMjkgcHJvdG9jb2wgSUQgKi8KKyNkZWZpbmUgWDI5UElETEVOICAgICAgICAgICAgICAgICAgIDQgICAvKiBYLjI5IHByb3RvY29sIElEIGxlbmd0aCAqLworCisjZGVmaW5lIFgyOV9TRVRfUEFSTVMgICAgICAgICAgICAgICAyCisjZGVmaW5lIFgyOV9SRUFEX1BBUk1TICAgICAgICAgICAgICA0CisjZGVmaW5lIFgyOV9TRVRfQU5EX1JFQURfUEFSTVMgICAgICA2CisjZGVmaW5lIFgyOV9JTlZJVEFUSU9OX1RPX0NMRUFSICAgICAxCisjZGVmaW5lIFgyOV9QQVJBTUVURVJfSU5ESUNBVElPTiAgICAwCisjZGVmaW5lIFgyOV9JTkRJQ0FUSU9OX09GX0JSRUFLICAgICAzCisjZGVmaW5lIFgyOV9FUlJPUiAgICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgSU5WQUxJRF9QQURfUEFSTSAgICAgICAgICAgIDEKKworI2RlZmluZSBQQURfQlJFQUtfQ0hBUkFDVEVSICAgICAgICAgMAorCisjZGVmaW5lIFBBRF9FU0NBUEUgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBRF9FQ0hPICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBBRF9EQVRBX0ZPUldBUkRfQ0hBUiAgICAgICAzCisjZGVmaW5lIFBBRF9EQVRBX0ZPUldBUkRfVElNRU9VVCAgICA0CisjZGVmaW5lIFBBRF9GTE9XX0NPTlRST0xfQllfUEFEICAgICA1CisjZGVmaW5lIFBBRF9TVVBQUkVTU0lPTl9PRl9TSUdOQUxTICA2CisjZGVmaW5lIFBBRF9CUkVBS19BQ1RJT04gICAgICAgICAgICA3CisjZGVmaW5lIFBBRF9TVVBQUkVTU0lPTl9PRl9EQVRBICAgICA4CisjZGVmaW5lIFBBRF9QQURESU5HX0FGVEVSX0NSICAgICAgICA5CisjZGVmaW5lIFBBRF9MSU5FX0ZPTERJTkcgICAgICAgICAgIDEwCisjZGVmaW5lIFBBRF9MSU5FX1NQRUVEICAgICAgICAgICAgIDExCisjZGVmaW5lIFBBRF9GTE9XX0NPTlRST0xfQllfVVNFUiAgIDEyCisjZGVmaW5lIFBBRF9MRl9BRlRFUl9DUiAgICAgICAgICAgIDEzCisjZGVmaW5lIFBBRF9QQURESU5HX0FGVEVSX0xGICAgICAgIDE0CisjZGVmaW5lIFBBRF9FRElUSU5HICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFBBRF9DSEFSX0RFTEVURV9DSEFSICAgICAgIDE2CisjZGVmaW5lIFBBRF9CVUZGRVJfREVMRVRFX0NIQVIgICAgIDE3CisjZGVmaW5lIFBBRF9CVUZGRVJfRElTUExBWV9DSEFSICAgIDE4CisKKyNkZWZpbmUgTUFYSVgyNSBNQVhfVVNFUl9EQVRBKjcKKyNkZWZpbmUgTUFYT1gyNSBNQVhfVVNFUl9EQVRBCisjZW5kaWYgLyogQU5ZWDI1ICovCisKKyNpZmRlZiBTVU5YMjUKKyNpZmRlZiBTT0xBUklTMjUgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcHJlc3VtYWJseSBTdW5MaW5rIDkueHggKi8KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2lvLmg+CisjaW5jbHVkZSA8c3VuZGV2L3N5bmNzdGF0Lmg+CisjaW5jbHVkZSA8bmV0eDI1L3gyNV9way5oPgorI2luY2x1ZGUgPG5ldHgyNS94MjVfY3RsLmg+CisjaW5jbHVkZSA8bmV0eDI1L3gyNV9pb2N0bC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4gICAgICAgICAgICAgICAgICAvKiBYLjI1IGluY2x1ZGVzLCBTdW4gb25seSAqLworI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgorI2lmbmRlZiBTT0xBUklTCisjaW5jbHVkZSA8c3lzL21idWYuaD4KKyNlbmRpZiAvKiBTT0xBUklTICovCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9wcm90b3N3Lmg+CisjaWZkZWYgU09MQVJJUworI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL2RvbWFpbi5oPgorI2VuZGlmIC8qIFNPTEFSSVMgKi8KKyNpbmNsdWRlIDxzeXMvc29ja2V0dmFyLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3VuZGV2L3N5bmNzdGF0Lmg+CisjaW5jbHVkZSA8bmV0eDI1L3gyNV9way5oPgorI2luY2x1ZGUgPG5ldHgyNS94MjVfY3RsLmg+CisjaW5jbHVkZSA8bmV0eDI1L3gyNV9pb2N0bC5oPgorI2VuZGlmIC8qIFNPTEFSSVMyNSAqLworI2VuZGlmIC8qIFNVTlgyNSAqLworCisjaWZkZWYgQU5ZWDI1CisKKyNpZmRlZiBJQk1YMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYLjI1IGluY2x1ZGVzLCBBSVggb25seSAqLworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R3dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHdsaWIuaD4KKworI2luY2x1ZGUgPHN5cy9zdHJlYW0uaD4KKyNpbmNsdWRlIDxzdHJvcHRzLmg+CisKKyNkZWZpbmUgTlBJXzIwICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXF1aXJlZCB0byBpbmNsdWRlIHRoZSB3aG9sZSBOUEkgKi8KKyNpbmNsdWRlIDxzeXMvbnBpXzIwLmg+CisjaW5jbHVkZSA8c3lzL25waWFwaS5oPgorI2luY2x1ZGUgPHN5cy9wa3RpbnRmLmg+CisKKyNpbmNsdWRlIDxvZG1pLmg+ICAgICAgICAgICAgICAgICAgICAgICAvKiByZXF1aXJlZCBmb3IgYWNjZXNzIHRvIHRoZSBPRE0gICAqLworI2luY2x1ZGUgPHN5cy9jZmdvZG0uaD4gICAgICAgICAgICAgICAgIC8qIGRhdGFiYXNlLCBuZWVkZWQgdG8gZmluZCBvdXQgdGhlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgTlVBLiBzZWUgeDI1bG9jYWxfbnVhKCkgICAgKi8KKworCisvKiBJQk0gWDI1IE5QSSBnZW5lcmljIHByaW1pdGl2ZSB0eXBlICovCit0eXBlZGVmIHVuaW9uIE5fbnBpX2N0bF90IHsKKyAgICB1bG9uZyAgICAgICAgICAgICAgIFBSSU1fdHlwZTsgICAgICAgICAgICAgIC8qIGdlbmVyaWMgcHJpbWl0aXZlIHR5cGUgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgIGJ1ZmZlcltOUElfTUFYX0NUTF07ICAgIC8qIG1heGltdW0gcHJpbWl0aXZlIHNpemUgKi8KKyAgICBOX2JpbmRfYWNrX3QgICAgICAgIGJpbmRfYWNrOworICAgIE5fYmluZF9yZXFfdCAgICAgICAgYmluZF9yZXE7CisgICAgTl9jb25uX2Nvbl90ICAgICAgICBjb25uX2NvbjsKKyAgICBOX2Nvbm5faW5kX3QgICAgICAgIGNvbm5faW5kOworICAgIE5fY29ubl9yZXFfdCAgICAgICAgY29ubl9yZXE7CisgICAgTl9jb25uX3Jlc190ICAgICAgICBjb25uX3JlczsKKyAgICBOX2RhdGFfcmVxX3QgICAgICAgIGRhdGFfcmVxOworICAgIE5fZGF0YV9pbmRfdCAgICAgICAgZGF0YV9pbmQ7CisgICAgTl9kaXNjb25faW5kX3QgICAgICBkaXNjb25faW5kOworICAgIE5fZGlzY29uX3JlcV90ICAgICAgZGlzY29uX3JlcTsKKyAgICBOX2Vycm9yX2Fja190ICAgICAgIGVycm9yX2FjazsKKyAgICBOX2V4ZGF0YV9pbmRfdCAgICAgIGV4ZGF0YV9pbmQ7CisgICAgTl9pbmZvX2Fja190ICAgICAgICBpbmZvX2FjazsKKyAgICBOX29rX2Fja190ICAgICAgICAgIG9rX2FjazsKKyAgICBOX3Jlc2V0X2Nvbl90ICAgICAgIHJlc2V0X2NvbjsKKyAgICBOX3Jlc2V0X3JlcV90ICAgICAgIHJlc2V0X3JlcTsKKyAgICBOX3Jlc2V0X2luZF90ICAgICAgIHJlc2V0X2luZDsKK30gTl9ucGlfY3RsX3Q7CisKKy8qIHNvbWUgZXh0cmEgZGVmaW5pdGlvbnMgdG8gaGVscCBvdXQgKi8KK3R5cGVkZWYgY2hhciAgICB4MjVhZGRyX3RbNDVdOyAgICAgICAgICAvKiBtYXggNDAgZGVmaW5lZCBieSBDQ0lUVCAqLwordHlwZWRlZiBjaGFyICAgIE5fbnBpX2RhdGFfdFtOUElfTUFYX0RBVEFdOworCisvKiBmZCBvciBzZXJ2ZXIgd2FpdGluZyBmb3IgY29ubmVjdGlvbnMsIHVzZWQgYnkgbmV0Y2xvcyBhbmQgbmV0b3BlbiAqLworZXh0ZXJuIGludCB4MjVzZXJ2ZXJmZDsKKworI2VuZGlmIC8qIElCTVgyNSAqLworCisjaWZkZWYgSFBYMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWC4yNSBpbmNsdWRlcywgSFAtVVggb25seSAqLworI2luY2x1ZGUgPHgyNS9jY2l0dHByb3RvLmg+CisjaW5jbHVkZSA8eDI1L3gyNS5oPgorI2luY2x1ZGUgPHgyNS94MjVhZGRyc3RyLmg+CisjaW5jbHVkZSA8eDI1L3gyNWNvZGVzLmg+CisjaW5jbHVkZSA8eDI1L3gyNWhkX2lvY3RsLmg+CisjaW5jbHVkZSA8eDI1L3gyNWlvY3Rscy5oPgorI2luY2x1ZGUgPHgyNS94MjVzdHIuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZiAvKiBIUFgyNSAqLworCisvKiBDLUtlcm1pdCBYLjMgLyBYLjI1IC8gWC4yOSAvIFguMTIxIHN1cHBvcnQgZnVuY3Rpb25zICovCisKKy8qIChyaWVobTogdGhpcyBsaXN0IG9mIGZ1bmN0aW9ucyBpc24ndCBxdWl0ZSByaWdodCBmb3IgQUlYKSAqLworCitfUFJPVE9UWVAoIGludCBzaG9wYWQsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBzaG94MjUsIChpbnQpICk7CitfUFJPVE9UWVAoIFZPSUQgaW5pdHBhZCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgc2V0cGFkLCAoQ0hBUiAqLCBpbnQpICk7CitfUFJPVE9UWVAoIFZPSUQgcmVhZHBhZCwgKENIQVIgKiwgaW50LCBDSEFSICopICk7CitfUFJPVE9UWVAoIGludCBxYml0cGt0LCAoQ0hBUiAqLCBpbnQpICk7CitfUFJPVE9UWVAoIFZPSUQgc2V0cWJpdCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgcmVzZXRxYml0LCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCBicmVha2FjdCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBwa3gxMjEsIChjaGFyICosIENIQVIgKikgKTsKK19QUk9UT1RZUCggU0lHVFlQIHgyNW9vYmgsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCB4MjVkaWFnLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHgyNWludHIsIChjaGFyKSApOworX1BST1RPVFlQKCBpbnQgeDI1cmVzZXQsIChjaGFyLCBjaGFyKSApOworX1BST1RPVFlQKCBpbnQgeDI1Y2xlYXIsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgeDI1c3RhdCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCB4MjVpbiwgKGludCwgQ0hBUiAqKSApOworX1BST1RPVFlQKCBpbnQgc2V0cGFkcCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBzZXR4MjUsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgeDI1eGluLCAoaW50LCBDSEFSICopICk7CitfUFJPVE9UWVAoIGludCB4MjVpbmwsIChDSEFSICosIGludCwgaW50LCBDSEFSKSApOworCisjaWZkZWYgSUJNWDI1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0dXAgeDI1ICovCitfUFJPVE9UWVAoIHVsb25nIHgyNWJpbmQsIChpbnQsIGNoYXIgKiwgY2hhciAqLCBpbnQsIGludCwgaW50LCB1bG9uZykgKTsKK19QUk9UT1RZUCggaW50IHgyNWNhbGwsIChpbnQsIGNoYXIgKiwgY2hhciAqKSApOyAvKiBjb25uZWN0IHRvIHJlbW90ZSAqLworX1BST1RPVFlQKCBpbnQgeDI1dW5iaW5kLCAoaW50KSApOyAgICAgIC8qIGRpc2Nvbm5lY3QgKi8KK19QUk9UT1RZUCggY2hhciAqeDI1cHJpbSwgKGludCkgKTsgICAgICAvKiBkaXNwbGF5IHByaW1pdGl2ZXMgKi8KK19QUk9UT1RZUCggaW50IHgyNWxvY2FsX251YSwgKGNoYXIgKikgKTsgLyogZmluZCBsb2NhbCBOVUEgKi8KKyNlbmRpZiAvKiBJQk1YMjUgKi8KKworI2VuZGlmIC8qIEFOWVgyNSAqLworCisvKiBDTVUtT3BlblZNUy9JUCAqLworCisjaWZkZWYgQ01VX1RDUElQICAgICAgICAgICAgICAgICAgICAgICAgLyogQ01VX1RDUElQIGltcGxpZXMgVENQU09DS0VUICovCisjaWZuZGVmIFRDUFNPQ0tFVAorI2RlZmluZSBUQ1BTT0NLRVQKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNpZm5kZWYgVENQSVBMSUIKKyNkZWZpbmUgVENQSVBMSUIKKyNlbmRpZiAvKiBUQ1BJUExJQiAqLworI2VuZGlmIC8qIENNVV9UQ1BJUCAqLworCisvKiBERUMgVENQL0lQIGZvciAoT3BlbilWTVMsIHByZXZpb3VzbHkga25vd24gYXMgVUNYICovCisKKyNpZmRlZiBERUNfVENQSVAgICAgICAgICAgICAgICAgICAgICAgICAvKiBERUNfVENQSVAgaW1wbGllcyBUQ1BTT0NLRVQgKi8KKyNpZm5kZWYgVENQU09DS0VUCisjZGVmaW5lIFRDUFNPQ0tFVAorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2lmbmRlZiBUQ1BJUExJQgorI2RlZmluZSBUQ1BJUExJQgorI2VuZGlmIC8qIFRDUElQTElCICovCisjZW5kaWYgLyogREVDX1RDUElQICovCisKKy8qIFNSSS9UR1YvQ2lzY28vUHJvY2VzcyBNdWx0aU5ldCwgVENQL0lQIGZvciBWQVgvVk1TICovCisKKyNpZmRlZiBNVUxUSU5FVCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNVUxUSU5FVCBpbXBsaWVzIFRDUFNPQ0tFVCAqLworI2lmbmRlZiBUQ1BTT0NLRVQKKyNkZWZpbmUgVENQU09DS0VUCisjZW5kaWYgLyogVENQU09DS0VUICovCisjaWZuZGVmIFRDUElQTElCCisjZGVmaW5lIFRDUElQTElCCisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyNpZm5kZWYgVEdWT1JXSU4gICAgICAgICAgICAgICAgICAgICAgICAvKiBNVUxUSU5FVCBhbmQgV0lOVENQICovCisjZGVmaW5lIFRHVk9SV0lOICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcmUgYSBsb3Qgb2YgY29kZS4uLiAqLworI2VuZGlmIC8qIFRHVk9SV0lOICovCisjZW5kaWYgLyogTVVMVElORVQgKi8KKworLyogV29sbG9uZ29uZyBUQ1AvSVAgZm9yIFZBWC9WTVMgKi8KKworI2lmZGVmIFdJTlRDUCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTlRDUCBpbXBsaWVzIFRDUFNPQ0tFVCAqLworI2lmbmRlZiBUQ1BTT0NLRVQKKyNkZWZpbmUgVENQU09DS0VUCisjZW5kaWYgLyogVENQU09DS0VUICovCisjaWZuZGVmIFRDUElQTElCCisjZGVmaW5lIFRDUElQTElCCisjZW5kaWYgLyogVENQSVBMSUIgKi8KKyNpZm5kZWYgVEdWT1JXSU4gICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU5UQ1AgYW5kIE1VTFRJTkVUICovCisjZGVmaW5lIFRHVk9SV0lOICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcmUgYSBsb3Qgb2YgY29kZS4uLiAqLworI2VuZGlmIC8qIFRHVk9SV0lOICovCisjZW5kaWYgLyogV0lOVENQICovCisKKy8qIFdvbGxvbmdvbmcgVENQL0lQIGZvciBBVCZUIFN5cyBWICovCisKKyNpZmRlZiBXT0xMT05HT05HICAgICAgICAgICAgICAgICAgICAgICAvKiBXT0xMT05HT05HIGltcGxpZXMgVENQU09DS0VUICovCisjaWZuZGVmIFRDUFNPQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgY29uZnVzZSBXT0xMT05HT05HICovCisjZGVmaW5lIFRDUFNPQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgLyogKHdoaWNoIGlzIGZvciBVTklYKSB3aXRoICovCisjZW5kaWYgLyogVENQU09DS0VUICovICAgICAgICAgICAgICAgICAgLyogV0lOVENQLCB3aGljaCBpcyBmb3IgVk1TISAqLworI2VuZGlmIC8qIFdPTExPTkdPTkcgKi8KKworI2lmZGVmIEVYQ0VMQU4gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVYQ0VMQU4gaW1wbGllcyBUQ1BTT0NLRVQgKi8KKyNpZm5kZWYgVENQU09DS0VUCisjZGVmaW5lIFRDUFNPQ0tFVAorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2VuZGlmIC8qIEVYQ0VMQU4gKi8KKworI2lmZGVmIElOVEVSTEFOICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOVEVSTEFOIGltcGxpZXMgVENQU09DS0VUICovCisjaWZuZGVmIFRDUFNPQ0tFVAorI2RlZmluZSBUQ1BTT0NLRVQKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNlbmRpZiAvKiBJTlRFUkxBTiAqLworCisjaWZkZWYgQkVCT1gKKyNpZm5kZWYgVENQU09DS0VUCisjZGVmaW5lIFRDUFNPQ0tFVAorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2lmbmRlZiBUQ1BJUExJQgorI2RlZmluZSBUQ1BJUExJQgorI2VuZGlmIC8qIFRDUElQTElCICovCisjZGVmaW5lIHNvY2tldF9lcnJubyAgICBoX2Vycm5vCisjZGVmaW5lIHNvY2tldF9yZWFkKHgseSx6KSAgICAgIHJlY3YoeCx5LHNpemVvZihjaGFyKSx6KQorI2RlZmluZSBzb2NrZXRfd3JpdGUoeCx5LHopICAgICBzZW5kKHgseSxzaXplb2YoY2hhcikseikKKyNkZWZpbmUgc29ja2V0X2lvY3RsICAgIGlvY3RsCisjZGVmaW5lIHNvY2tldF9jbG9zZSh4KSAgICAgICAgIGNsb3Nlc29ja2V0KHgpCisjaWZuZGVmIEZJT05CSU8KKyNkZWZpbmUgRklPTkJJTyAyCisjZW5kaWYgLyogRklPTkJJTyAqLworI2lmbmRlZiBGSU9OUkVBRAorI2RlZmluZSBGSU9OUkVBRCAgICAgICAxCisjZW5kaWYgLyogRklPTlJFQUQgKi8KKyNpZm5kZWYgU0lPQ0FUTUFSSworI2RlZmluZSBTSU9DQVRNQVJLICAgICAzCisjZW5kaWYgLyogU0lPQ0FUTUFSSyAqLworI2VuZGlmIC8qIEJFQk9YICovCisKKyNpZmRlZiBDT01NRU5UIC8qIG5vIGxvbmdlciB1c2VkIGJ1dCBtaWdodCBjb21lIGluIGhhbmR5IGFnYWluIGxhdGVyLi4uICovCisvKgorICBDS19SRUFEMCBjYW4gKGFuZCBzaG91bGQpIGJlIGRlZmluZWQgaWYgYW5kIG9ubHkgaWY6CisgIChhKSByZWFkKGZkLCZ4LDApIGNhbiBiZSB1c2VkIGhhcm1sZXNzbHkgb24gYSBUQ1AvSVAgc29ja2V0IGNvbm5lY3Rpb24uCisgIChiKSByZWFkKGZkLCZ4LDApIHJldHVybnMgMCBpZiB0aGUgY29ubmVjdGlvbiBpcyB1cCwgLTEgaWYgaXQgaXMgZG93bi4KKyovCisjaWZuZGVmIENLX1JFQUQwCisjaWZkZWYgVENQU09DS0VUCisjaWZkZWYgU1VOT1M0MSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQgd29ya3MgaW4gU3VuT1MgNC4xICovCisjZGVmaW5lIENLX1JFQUQwCisjZWxzZQorI2lmZGVmIE5FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBOZVhUU1RFUCAqLworI2RlZmluZSBDS19SRUFEMAorI2VuZGlmIC8qIE5FWFQgKi8KKyNlbmRpZiAvKiBTVU5PUzQxICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogQ0tfUkVBRDAgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qIFRlbG5ldCBwcm90b2NvbCAqLworCisjaWZkZWYgVENQU09DS0VUICAgICAgICAgICAgICAgICAgICAgICAgLyogVENQU09DS0VUIGltcGxpZXMgVE5DT0RFICovCisjaWZuZGVmIFROQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2hpY2ggbWVhbnMuLi4gKi8KKyNkZWZpbmUgVE5DT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21waWxlIGluIHRlbG5ldCBjb2RlICovCisjZW5kaWYgLyogVE5DT0RFICovCisKKy8qCisgICBQbGF0Zm9ybXMgd2hlcmUgd2UgbXVzdCBjYWxsIGdldGhvc3RuYW1lKGJ1ZixsZW4pIGFuZCB0aGVuCisgICBnZXRob3N0YnluYW1lKGJ1ZikgdG8gZ2V0IGxvY2FsIElQIGFkZHJlc3MsIHJhdGhlciB0aGFuIGNhbGxpbmcKKyAgIGdldGhvc3RieW5hbWUoIiIpLgorKi8KKyNpZm5kZWYgQ0tHSE5MSE9TVAorI2lmZGVmIGRhdGFnZW5lcmFsCisjZGVmaW5lIENLR0hOTEhPU1QKKyNlbHNlCisjaWZkZWYgU09MQVJJUworI2RlZmluZSBDS0dITkxIT1NUCisjZWxzZQorI2lmZGVmIFNVTk9TNAorI2RlZmluZSBDS0dITkxIT1NUCisjZWxzZQorI2lmZGVmIFVOSVhXQVJFCisjZGVmaW5lIENLR0hOTEhPU1QKKyNlbHNlCisjaWZkZWYgU0lOSVgKKyNkZWZpbmUgQ0tHSE5MSE9TVAorI2VuZGlmIC8qIFNJTklYICovCisjZW5kaWYgLyogVU5JWFdBUkUgKi8KKyNlbmRpZiAvKiBTVU5PUzQgKi8KKyNlbmRpZiAvKiBTT0xBUklTICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBDS0dITkxIT1NUICovCisKKyNpZm5kZWYgUkxPR0NPREUgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaGF0IGFib3V0IFJsb2dpbj8gKi8KKyNpZm5kZWYgTk9STE9HSU4KKy8qCisgIFJsb2dpbiBjYW4gYmUgZW5hYmxlZCBvbmx5IGZvciBVTklYIHZlcnNpb25zIHRoYXQgaGF2ZSBib3RoIFNJR1VSRworICAoU0NPIGRvZXNuJ3QpIGFuZCBDS19UVEdXU0laIChPU0YvMSBkb2Vzbid0KSwgc28gd2UgZG9uJ3QgYXNzdW1lIHRoYXQKKyAgYW55IG90aGVycyBoYXZlIHRoZXNlIHdpdGhvdXQgdmVyaWZ5aW5nIGZpcnN0LiAgTm90IHRoYXQgaXQgcmVhbGx5IG1ha2VzCisgIG11Y2ggZGlmZmVyZW5jZSBzaW5jZSB5b3UgY2FuIG9ubHkgdXNlIFJsb2dpbiBpZiB5b3UgYXJlIHJvb3QuLi4KKyovCisjaWZkZWYgU1VOT1M0MQorI2RlZmluZSBSTE9HQ09ERQorI2Vsc2UKKyNpZmRlZiBTT0xBUklTCisjZGVmaW5lIFJMT0dDT0RFCisjZWxzZQorI2lmZGVmIEhQVVg5CisjZGVmaW5lIFJMT0dDT0RFCisjZWxzZQorI2lmZGVmIEhQVVgxMAorI2RlZmluZSBSTE9HQ09ERQorI2Vsc2UKKyNpZmRlZiBPU0Y0MAorI2RlZmluZSBSTE9HQ09ERQorI2Vsc2UKKyNpZmRlZiBORVhUCisjZGVmaW5lIFJMT0dDT0RFCisjZWxzZQorI2lmZGVmIEFJWDQxCisjZGVmaW5lIFJMT0dDT0RFCisjZWxzZQorI2lmZGVmIFVOSVhXQVJFCisjZGVmaW5lIFJMT0dDT0RFCisjZWxzZQorI2lmZGVmIElSSVg1MQorI2RlZmluZSBSTE9HQ09ERQorI2Vsc2UKKyNpZmRlZiBJUklYNjAKKyNkZWZpbmUgUkxPR0NPREUKKyNlbHNlCisjaWZkZWYgUU5YCisjZGVmaW5lIFJMT0dDT0RFCisjZWxzZQorI2lmZGVmIF9fbGludXhfXworI2RlZmluZSBSTE9HQ09ERQorI2Vsc2UKKyNpZmRlZiBCU0Q0NAorI2RlZmluZSBSTE9HQ09ERQorI2VuZGlmIC8qIEJTRDQ0ICovCisjZW5kaWYgLyogX19saW51eF9fICovCisjZW5kaWYgLyogUU5YICovCisjZW5kaWYgLyogSVJJWDYwICovCisjZW5kaWYgLyogSVJJWDUxICovCisjZW5kaWYgLyogVU5JWFdBUkUgKi8KKyNlbmRpZiAvKiBBSVg0MSAqLworI2VuZGlmIC8qIE5FWFQgKi8KKyNlbmRpZiAvKiBPU0Y0MCAqLworI2VuZGlmIC8qIEhQVVgxMCAqLworI2VuZGlmIC8qIEhQVVg5ICovCisjZW5kaWYgLyogU09MQVJJUyAqLworI2VuZGlmIC8qIFNVTk9TNDEgKi8KKyNlbmRpZiAvKiBOT1JMT0dJTiAqLworI2lmZGVmIFZNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZNUyAqLworI2RlZmluZSBSTE9HQ09ERQorI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFJMT0dDT0RFICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZmRlZiBUTkNPREUKKy8qCisgIFRlbG5ldCBsb2NhbC1lY2hvIGJ1ZmZlciwgdXNlZCBmb3Igc2F2aW5nIHVwIHVzZXIgZGF0YSB0aGF0IGNhbid0IGJlCisgIHByb3Blcmx5IGRpc3BsYXllZCBhbmQvb3IgZXZhbHVhdGVkIHVudGlsIHBlbmRpbmcgVGVsbmV0IG5lZ290aWF0aW9ucyBhcmUKKyAgY29tcGxldGUuICBUVExFQlVGIGlzIGRlZmluZWQgZm9yIHBsYXRmb3JtcyAobGlrZSBVTklYKSB3aGVyZSBuZXQgaS9vIGlzCisgIGRvbmUgYnkgdGhlIHNhbWUgcm91dGluZXMgdGhhdCBkbyBzZXJpYWwgaS9vIChpbiB3aGljaCBjYXNlIHRoZSByZWxldmFudAorICBjb2RlIGdvZXMgaW50byB0aGUgY2s/dGlvLmMgbW9kdWxlLCBpbiB0aGUgdHRpbmMoKSwgdHRjaGsoKSwgZXRjLCByb3V0aW5lcyk7CisgIE5FVExFVEJVRiBpcyBkZWZpbmVkIGZvciBwbGF0Zm9ybXMgKGxpa2UgVk1TKSB0aGF0IHVzZSBkaWZmZXJlbnQgQVBJcyBmb3IKKyAgbmV0d29yayBhbmQgc2VyaWFsIGkvbywgYW5kIGVuYWJsZXMgdGhlIGNvcGllcyBvZiB0aGUgc2FtZSByb3V0aW5lcyB0aGF0CisgIGFyZSBpbiBja2NuZXQuYy4KKyovCisjaWZuZGVmIFRUTEVCVUYKKyNpZmRlZiBVTklYCisjZGVmaW5lIFRUTEVCVUYKKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKyNkZWZpbmUgVFRMRUJVRgorI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIFRUTEVCVUYgKi8KKworI2lmbmRlZiBORVRMRUJVRgorI2lmZGVmIFZNUworI2RlZmluZSBORVRMRUJVRgorI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE5FVExFQlVGICovCisjZW5kaWYgLyogVE5DT0RFICovCisKKyNpZmRlZiBTVU5YMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTVU5YMjUgaW1wbGllcyBUQ1BTT0NLRVQgKi8KKyNpZm5kZWYgVENQU09DS0VUICAgICAgICAgICAgICAgICAgICAgICAvKiBCdXQgZG9lc24ndCBpbXBseSBUTkNPREUgKi8KKyNkZWZpbmUgVENQU09DS0VUCisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogU1VOWDI1ICovCisKKyNpZm5kZWYgVENQU09DS0VUCisjaWZuZGVmIE5PX0ROU19TUlYKKyNkZWZpbmUgTk9fRE5TX1NSVgorI2VuZGlmIC8qIE5PX0ROU19TUlYgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworLyogVGhpcyBpcyBhbm90aGVyIFRDUFNPQ0tFVCBzZWN0aW9uLi4uICovCisKKyNpZmRlZiBUQ1BTT0NLRVQKKyNpZm5kZWYgTkVUQ09OTiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ1BTT0NLRVQgaW1wbGllcyBORVRDT05OICovCisjZGVmaW5lIE5FVENPTk4KKyNlbmRpZiAvKiBORVRDT05OICovCisKKyNpZm5kZWYgTk9fRE5TX1NSVgorI2lmZGVmIE5PTE9DQUwKKyNkZWZpbmUgTk9fRE5TX1NSVgorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZmRlZiBPUzJPTkxZCisjZGVmaW5lIE5PX0ROU19TUlYKKyNlbmRpZiAvKiBPUzJPTkxZICovCisjaWZkZWYgTlQKKyNpZmRlZiBfTV9QUEMKKyNkZWZpbmUgTk9fRE5TX1NSVgorI2VuZGlmIC8qIF9NX0ROUyAqLworI2VuZGlmIC8qIE5PX0ROU19TUlYgKi8KKyNpZmRlZiBWTVMKKyNkZWZpbmUgTk9fRE5TX1NSVgorI2VuZGlmIC8qIFZNUyAqLworI2lmZGVmIFNUUkFUVVMKKyNkZWZpbmUgTk9fRE5TX1NSVgorI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNpZmRlZiBkYXRhZ2VuZXJhbAorI2RlZmluZSBOT19ETlNfU1JWCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNpZmRlZiB1bHRyaXgKKyNkZWZpbmUgTk9fRE5TX1NSVgorI2VuZGlmIC8qIHVsdHJpeCAqLworI2lmZGVmIE5FWFQKKyNkZWZpbmUgTk9fRE5TX1NSVgorI2VuZGlmIC8qIE5FWFQgKi8KKyNlbmRpZiAvKiBOT19ETlNfU1JWICovCisKKyNpZm5kZWYgQ0tfRE5TX1NSViAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgRE5TIFNSViByZWNvcmRzIHRvIGRldGVybWluZSAqLworI2lmbmRlZiBOT19ETlNfU1JWICAgICAgICAgICAgICAgICAgICAgIC8qIGhvc3QgYW5kIHBvcnRzICovCisjZGVmaW5lIENLX0ROU19TUlYKKyNlbmRpZiAvKiBOT19ETlNfU1JWICovCisjZW5kaWYgLyogQ0tfRE5TX1NSViAqLworCisjaWZuZGVmIE5PTElTVEVOICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VsZWN0KCkgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCAqLworI2lmbmRlZiBTRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29taW5nIGNvbm5lY3Rpb25zLiAqLworI2lmbmRlZiBWTVMKKyNpZm5kZWYgT1MyCisjZGVmaW5lIE5PTElTVEVOCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogU0VMRUNUICovCisjZW5kaWYgLyogTk9MSVNURU4gKi8KKworLyogQlNEIHNvY2tldHMgbGlicmFyeSBoZWFkZXIgZmlsZXMgKi8KKworI2lmZGVmIFZNUworLyoKKyAgQmVjYXVzZSBiemVybygpIGFuZCBiY29weSgpIGFyZSBub3QgcG9ydGFibGUgYW1vbmcgVk1TIHZlcnNpb25zLAorICBvciBjb21waWxlcnMsIG9yIFRDUC9JUCBwcm9kdWN0cywgZXRjLgorKi8KKyNpZm5kZWYgYnplcm8KKyNkZWZpbmUgYnplcm8ocyxuKSBtZW1zZXQocywwLG4pCisjZW5kaWYgLyogYnplcm8gKi8KKyNpZm5kZWYgYmNvcHkKKyNkZWZpbmUgYmNvcHkoaCxhLGwpIG1lbWNweShhLGgsbCkKKyNlbmRpZiAvKiBiY29weSAqLworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgVU5JWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVU5JWCBzZWN0aW9uICovCisKKyNpZmRlZiBTVlI0CisvKgorICBUaGVzZSBzdWdnZXN0ZWQgYnkgUm9iIEhlYWxleSwgcmhlYWxleUBrYXMuaGVsaW9zLm1uLm9yZywgdG8gYXZvaWQKKyAgYnVncyBpbiBCZXJrZWxleSBjb21wYXRpYmlsaXR5IGxpYnJhcnkgb24gU3lzIFYgUjQgc3lzdGVtcywgYnV0IHVudGVzdGVkCisgIGJ5IG1lIChmZGMpLiAgUmVtb3ZlIHRoaXMgYml0IGlmIGl0IGdpdmVzIHlvdSB0cm91YmxlLgorICAoTGF0ZXIgY29ycmVjdGVkIGJ5IE1hcmMgQm91Y2hlciA8bWJvdWNoZXJAaXJvLnVtb250cmVhbC5jYT4gYmVjYXVzZQorICBiemVyby9iY29weSBhcmUgbm90IGFyZ3VtZW50LWNvbXBhdGlibGUgd2l0aCBtZW1zZXQvbWVtY3B5fG1lbW1vdmUuKQorKi8KKyNpZm5kZWYgYnplcm8KKyNkZWZpbmUgYnplcm8ocyxuKSBtZW1zZXQocywwLG4pCisjZW5kaWYKKyNpZmRlZiBTT0xBUklTCisjaWZkZWYgU1VOWDI1CisjdW5kZWYgYnplcm8KKy8qCisgIFdPVUxEIFlPVSBCRUxJRVZFLi4uIFRoYXQgdGhlIFNvbGFyaXMgWC4yNSAvb3B0L1NVTldjb21tL2xpYi9saWJzb2NreDI1CisgIGxpYnJhcnkgcmVmZXJlbmNlcyBiemVybywgZXZlbiB0aG91Z2ggdGhlIHVzZSBvZiBiemVybyBpcyBmb3JiaWRkZW4gaW4KKyAgU29sYXJpcz8gIExvb2sgZm9yIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGluIGNrY25ldC5jLgorKi8KK19QUk9UT1RZUCggdm9pZCBiemVybywgKGNoYXIgKiwgaW50KSApOworI2VuZGlmIC8qIFNVTlgyNSAqLworI2lmbmRlZiBiY29weQorI2RlZmluZSBiY29weShoLGEsbCkgbWVtY3B5KGEsaCxsKQorI2VuZGlmCisjZWxzZQorI2lmbmRlZiBiY29weQorI2RlZmluZSBiY29weShoLGEsbCkgbWVtbW92ZShhLGgsbCkKKyNlbmRpZgorI2VuZGlmIC8qIFNPTEFSSVMgKi8KKyNlbHNlIC8qICFTVlI0ICovCisjaWZkZWYgUFRYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VxdWVudCBEWU5JWCBQVFggMS4zICovCisjaWZuZGVmIGJ6ZXJvCisjZGVmaW5lIGJ6ZXJvKHMsbikgbWVtc2V0KHMsMCxuKQorI2VuZGlmCisjaWZuZGVmIGJjb3B5CisjZGVmaW5lIGJjb3B5KGgsYSxsKSBtZW1jcHkoYSxoLGwpCisjZW5kaWYKKyNlbmRpZiAvKiBQVFggKi8KKyNlbmRpZiAvKiBTVlI0ICovCisKKyNpZmRlZiBJTlRFUkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSYWNhbC1JbnRlcmxhbiBUQ1AvSVAgKi8KKyNpbmNsdWRlIDxpbnRlcmxhbi9zb2NrZXQuaD4KKyNpbmNsdWRlIDxpbnRlcmxhbi9pbF90eXBlcy5oPgorI2luY2x1ZGUgPGludGVybGFuL3RlbG5ldC5oPgorI2luY2x1ZGUgPGludGVybGFuL2lsX2Vycm5vLmg+CisjaW5jbHVkZSA8aW50ZXJsYW4vaW4uaD4KKyNpbmNsdWRlIDxpbnRlcmxhbi90ZWxuZXQuaD4gICAgICAgICAgICAvKiBXaHkgdHdpY2UgPyA/ID8gKi8KKyNlbHNlIC8qIE5vdCBJbnRlcmxhbiAqLworI2lmZGVmIEJFQk9YCisjaW5jbHVkZSA8c29ja2V0Lmg+CisjZWxzZSAvKiBOb3QgQkVCT1ggKi8gICAgICAgICAgICAgICAgICAgLyogTm9ybWFsIEJTRCBUQ1AvSVAgbGlicmFyeSAqLworI2lmZGVmIENPTU1FTlQKKyNpZm5kZWYgSFBVWAorI2luY2x1ZGUgPGFycGEvdGVsbmV0Lmg+CisjZW5kaWYgLyogSFBVWCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBTQ08yMzQKKyNpbmNsdWRlIDxzeXMvZXJybm8udGNwLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLnRjcC5oPgorI2VuZGlmIC8qIFNDTzIzNCAqLworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpZmRlZiBXT0xMT05HT05HCisjaW5jbHVkZSA8c3lzL2luLmg+CisjZWxzZQorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpZm5kZWYgU1Y2OFIzVjYgICAgICAgICAgICAgICAgLyogKG1heWJlIHRoaXMgc2hvdWxkIGJlIFNWUjMgaW4gZ2VuZXJhbCkgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPiAgICAgICAgLyogQWRkZWQgSnVuZSAyMDAxICovCisjZW5kaWYgLyogU1Y2OFIzVjYgKi8KKyNlbmRpZiAvKiBXT0xMT05HT05HICovCisjZW5kaWYgLyogQkVCT1ggKi8KKyNlbmRpZiAvKiBJTlRFUkxBTiAqLworCisjaWZuZGVmIEVYQ0VMQU4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2lmbmRlZiBJTlRFUkxBTgorI2lmZGVmIFdPTExPTkdPTkcKKyNkZWZpbmUgbWlub3IgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEbyBub3QgaW5jbHVkZSA8c3lzL21hY3Jvcy5oPiAqLworI2luY2x1ZGUgPHN5cy9pbmV0Lmg+CisjZWxzZQorI2lmbmRlZiBPWE9TCisjaWZuZGVmIEhQVVgKKyNpZm5kZWYgQkVCT1gKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNlbmRpZiAvKiBCRUJPWCAqLworI2VuZGlmIC8qIEhQVVggKi8KKyNlbHNlIC8qIE9YT1MgKi8KKy8qIEluIHRvbyBtYW55IHJlbGVhc2VzIG9mIFgvT1MsIDxhcnBhL2luZXQuaD4gZGVjbGFyZXMgaW5ldF9hZGRyKCkgYXMKKyAqIGBgc3RydWN0IGluX2FkZHInJy4gIFRoaXMgaXMgZGVmaW5pdGl2ZWx5IHdyb25nLCBhbmQgY291bGQgY2F1c2UKKyAqIGNvcmUgZHVtcHMuICBJbnN0ZWFkIG9mIGluY2x1ZGluZyB0aGF0IGJhZCBmaWxlLCBpbmV0X2FkZHIoKSBpcworICogY29ycmVjdGx5IGRlY2xhcmVkIGhlcmUuICBPZiBjb3Vyc2UsIGFsbCB0aGUgZGVjbGFyYXRpb25zIGRvbmUgdGhlcmUKKyAqIGhhcyBiZWVuIGNvcGllZCBoZXJlLgorICovCit1bnNpZ25lZCBsb25nIGluZXRfYWRkcigpOworY2hhciAgICAqaW5ldF9udG9hKCk7CitzdHJ1Y3QgIGluX2FkZHIgaW5ldF9tYWtlYWRkcigpOwordW5zaWduZWQgbG9uZyBpbmV0X25ldHdvcmsoKTsKKyNlbmRpZiAvKiBPWE9TICovCisjZW5kaWYgLyogV09MTE9OR09ORyAqLworI2VuZGlmIC8qIElOVEVSTEFOICovCisjZW5kaWYgLyogRVhDRUxBTiAqLworCisjaWZkZWYgRVhDRUxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhjZWxhbiBUQ1AvSVAgKi8KKyNpZm5kZWYgYnplcm8KKyNkZWZpbmUgYnplcm8ocyxuKSBtZW1zZXQocywwLG4pCisjZW5kaWYgLyogYnplcm8gKi8KKyNpZm5kZWYgYmNvcHkKKyNkZWZpbmUgYmNvcHkoaCxhLGwpIG1lbWNweShhLGgsbCkKKyNlbmRpZiAvKiBiY29weSAqLworI2luY2x1ZGUgPGV4X2Vycm5vLmg+CisjZW5kaWYgLyogRVhDRUxBTiAqLworCisjaWZkZWYgSTM4NklYICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW50ZXJhY3RpdmUgU3lzIFYgUjMgbmV0d29yay4gKi8KKy8qICNkZWZpbmUgVEVMT1BUUyAqLyAgICAgICAgICAgICAgICAgICAvKiBUaGlzIG1pZ2h0IG5lZWQgZGVmaW5pbmcuICovCisjZGVmaW5lIE9SR19OTE9ORyBFTkFNRVRPT0xPTkcgICAgICAgICAgLyogUmVzb2x2ZSBjb25mbGljdGluZyBzeW1ib2xzICovCisjdW5kZWYgRU5BTUVUT09MT05HICAgICAgICAgICAgICAgICAgICAgLyogaW4gPGVycm5vLmg+IGFuZCA8bmV0L2Vycm5vLmg+ICovCisjZGVmaW5lIE9SR19ORU1QVFkgRU5PVEVNUFRZCisjdW5kZWYgRU5PVEVNUFRZCisjaW5jbHVkZSA8bmV0L2Vycm5vLmg+CisjdW5kZWYgRU5BTUVUT09MT05HCisjZGVmaW5lIEVOQU1FVE9PTE9ORyBPUkdfTkxPTkcKKyN1bmRlZiBFTk9URU1QVFkKKyNkZWZpbmUgRU5PVEVNUFRZIE9SR19ORU1QVFkKKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPiAgICAgICAgICAgICAgICAvKiBmb3IgaW5ldF9hZGRyKCkgKi8KKyNlbmRpZiAvKiBJMzg2SVggKi8KKy8qCisgIERhdGEgdHlwZSBvZiB0aGUgaW5ldF9hZGRyKCkgZnVuY3Rpb24uLi4KKyAgV2UgZGVmaW5lIElOQUREUlggaWYgaXQgaXMgb2YgdHlwZSBzdHJ1Y3QgaW5hZGRyLgorICBJZiBpdCBpcyB1bmRlZmluZWQsIHVuc2lnbmVkIGxvbmcgaXMgYXNzdW1lZC4KKyAgTG9vayBhdCA8YXJwYS9pbmV0Lmg+IHRvIGZpbmQgb3V0LiAgVGhlIGZvbGxvd2luZyBrbm93biBjYXNlcyBhcmUKKyAgaGFuZGxlZCBoZXJlLiAgT3RoZXIgc3lzdGVtcyB0aGF0IG5lZWQgaXQgY2FuIGJlIGFkZGVkIGhlcmUsIG9yIGVsc2UKKyAgLURJTkFERFJYIGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgQ0ZMQUdTIG9uIHRoZSBjYyBjb21tYW5kIGxpbmUuCisqLworI2lmbmRlZiBOT0lOQUREUlgKKyNpZmRlZiBEVTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBERUMgVWx0cml4IDIuMCAqLworI2RlZmluZSBJTkFERFJYCisjZW5kaWYgLyogRFUyICovCisjZW5kaWYgLyogTk9JTkFERFJYICovCisKKyNlbHNlIC8qIE5vdCBVTklYICovCisKKyNpZmRlZiBWTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoT3BlbilWTVMgc2VjdGlvbiAqLworCisjaWZkZWYgTVVMVElORVQgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEdWIE11bHRpTmV0ICovCisvKgorICBJbiBDLUtlcm1pdCA3LjAgQmV0YS4wOCB3ZSBzdGFydGVkIGdldHRpbmcgc2NhZHMgb2YgY29tcGlsZSB0aW1lIHdhcm5pbmdzCisgIGluIE11bHRpbmV0IGJ1aWxkczogImJsYWgiIGlzIGltcGxpY2l0bHkgZGVjbGFyZWQgYXMgYSBmdW5jdGlvbiwgd2hlcmUgYmxhaAorICBpcyBzb2NrZXRfcmVhZC93cml0ZS9jbG9zZSwgbnRvaHMsIGh0b25zLCBnZXRwZWVybmFtZSwgYWNjZXB0LCBzZWxlY3QsIGV0Yy4KKyAgSSBoYXZlIG5vIGlkZWEgd2h5IC0tIHRoZXNlIHJvdXRpbmVzIGFyZSBkZWNsYXJlZCBpbiB0aGUgaGVhZGVyIGZpbGVzIGJlbG93LAorICBhbmQgdGhlIGluY2x1ZGVzIGhhdmVuJ3QgY2hhbmdlZC4gIFRoZSBleGVjdXRhYmxlIHN0aWxsIHNlZW1zIHRvIHdvcmsgT0suCisgIE1lc3Npbmcgd2l0aCB0aGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBpbmNsdWRlcyBpcyBkaXNhc3Ryb3VzLgorKi8KKyNpZmRlZiBNVUxUSU5FVF9OT19QUk9UT1RZUEVTCisjdW5kZWYgTVVMVElORVRfTk9fUFJPVE9UWVBFUworI2VuZGlmIC8qIE1VTFRJTkVUX05PX1BST1RPVFlQRVMgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworI3VuZGVmICBfX2NwbHVzcGx1cworI2VuZGlmIC8qICBfX2NwbHVzcGx1cyAqLworCisjaW5jbHVkZSAibXVsdGluZXRfcm9vdDpbbXVsdGluZXQuaW5jbHVkZV1lcnJuby5oIgorI2luY2x1ZGUgIm11bHRpbmV0X3Jvb3Q6W211bHRpbmV0LmluY2x1ZGUuc3lzXXR5cGVzLmgiCisjaW5jbHVkZSAibXVsdGluZXRfcm9vdDpbbXVsdGluZXQuaW5jbHVkZS5zeXNdc29ja2V0LmgiCisjaW5jbHVkZSAibXVsdGluZXRfcm9vdDpbbXVsdGluZXQuaW5jbHVkZV1uZXRkYi5oIgorI2luY2x1ZGUgIm11bHRpbmV0X3Jvb3Q6W211bHRpbmV0LmluY2x1ZGUubmV0aW5ldF1pbi5oIgorI2luY2x1ZGUgIm11bHRpbmV0X3Jvb3Q6W211bHRpbmV0LmluY2x1ZGUuYXJwYV1pbmV0LmgiCisjaW5jbHVkZSAibXVsdGluZXRfcm9vdDpbbXVsdGluZXQuaW5jbHVkZS5zeXNdaW9jdGwuaCIKKworI2lmZGVmIENPTU1FTlQKKy8qCisgIE5vIGxvbmdlciBuZWVkZWQgYmVjYXVzZSBub3cgYnplcm8vYmNvcHkgYXJlIG1hY3JvcyBkZWZpbmVkIGFzCisgIG1lbXNldC9tZW1tb3ZlIGluIGFsbCBWTVMgYnVpbGRzLgorKi8KKy8qCisgIFdlIHNob3VsZCBiZSBhYmxlIHRvIHBpY2sgdGhlc2UgdXAgZnJvbSA8c3RyaW5ncy5oPiBidXQgaXQncworICBub3QgcG9ydGFibGUgYmV0d2VlbiBWQVhDIGFuZCBERUNDLiAgQW5kIGV2ZW4gd2l0aCBERUNDIDUueCB3ZSBoYXZlIGEKKyAgZGlmZmVyZW5jZSBiZXR3ZWVuIFZBWCBhbmQgQWxwaGEuICBXZSBnZXQgd2FybmluZ3MgaGVyZSBvbiB0aGUgVkFYCisgIHdpdGggREVDQyA1LjYtMDAzIGJ1dCB0aGV5IGFyZSBub3QgZmF0YWwuCisqLworI2lmbmRlZiBfX0RFQ0NfVkVSCisjaWZuZGVmIGJ6ZXJvCitfUFJPVE9UWVAoIHZvaWQgYnplcm8sIChjaGFyICosIGludCkgKTsKKyNlbmRpZiAvKiBiemVybyAqLworI2lmbmRlZiBiY29weQorX1BST1RPVFlQKCB2b2lkIGJjb3B5LCAoY2hhciAqLCBjaGFyICosIGludCkgKTsKKyNlbmRpZiAvKiBiY29weSAqLworI2VuZGlmIC8qIF9fREVDQ19WRVIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBfX0RFQ0MKKy8qCisgICBJZiBjb21waWxpbmcgdW5kZXIgREVDIEMgdGhlIHNvY2tldCBjYWxscyBtdXN0IG5vdCBiZSBwcmVmaXhlZCB3aXRoCisgICBERUNDJC4gIFRoaXMgaXMgZG9uZSBieSB1c2luZyB0aGUgY29tcGlsZXIgc3dpdGNoIC9QcmVmaXg9QW5zaV9DODkuCisgICBIb3dldmVyLCB0aGlzIGNhdXNlcyBzb21lIGNhbGxzIHRoYXQgc2hvdWxkIGJlIHByZWZpeGVkIHRvIG5vdCBiZQorICAgKHdoaWNoIEkgdGhpbmsgaXMgYSBidWcgaW4gdGhlIGNvbXBpbGVyIC0gSSd2ZSBiZWVuIHRvbGQgdGhlc2UgY2FsbHMKKyAgIGFyZSBwcmVzZW50IGluIEFOU0kgY29tcGlsZXJzKS4gIEF0IGFueSByYXRlLCBzdWNoIGNhbGxzIGFyZSBmaXhlZAorICAgaGVyZSBieSBleHBsaWNpdGx5IHByZWZpeGluZyB0aGVtLgorKi8KKyNpZmRlZiBDT01NRU5UCisvKgorICAgQnV0IHRoaXMgY2F1c2VzIGVycm9ycyB3aXRoIFZNUyA2LjIgLyBERUMgQyA1LjMtMDA2IC8gTXVsdGlOZXQgNC4wQSBvbgorICAgYSBWQVggKGJ1dCBub3Qgb24gYW4gQWxwaGEpLiAgU28gbm93IHdoYXQgaGFwcGVucyBpZiB3ZSBza2lwIGRvaW5nIHRoaXM/CisqLworI2RlZmluZSBjbG9zZSBkZWNjJGNsb3NlCisjZGVmaW5lIGFsYXJtIGRlY2MkYWxhcm0KKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogX19ERUNDICovCisKKyNlbHNlIC8qIE5vdCBNVUxUSU5FVCAqLworCisjaWZkZWYgV0lOVENQICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOL1RDUCA9IFBhdGhXYXkgZm9yIFZNUyAqLworI2lmZGVmIE9MRF9UV0cKKyNpbmNsdWRlICJ0d2ckdGNwOltuZXRkaXN0LmluY2x1ZGUuc3lzXWVycm5vLmgiCisjaW5jbHVkZSAidHdnJHRjcDpbbmV0ZGlzdC5pbmNsdWRlLnN5c110eXBlczIuaCIgLyogYXZvaWQgc29tZSBkdXBsaWNhdGVzICovCisjZWxzZQorI2luY2x1ZGUgInR3ZyR0Y3A6W25ldGRpc3QuaW5jbHVkZV1zb2NrZXRfYWxpYXNlcy5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAidHdnJHRjcDpbbmV0ZGlzdC5pbmNsdWRlLnN5c110eXBlcy5oIgorI2VuZGlmIC8qIE9MRF9UV0cgKi8KKyNpbmNsdWRlICJ0d2ckdGNwOltuZXRkaXN0LmluY2x1ZGUuc3lzXXNvY2tldC5oIgorI2luY2x1ZGUgInR3ZyR0Y3A6W25ldGRpc3QuaW5jbHVkZV1uZXRkYi5oIgorI2luY2x1ZGUgInR3ZyR0Y3A6W25ldGRpc3QuaW5jbHVkZS5zeXNdZG9tYWluLmgiCisjaW5jbHVkZSAidHdnJHRjcDpbbmV0ZGlzdC5pbmNsdWRlLnN5c11wcm90b3N3LmgiCisjaW5jbHVkZSAidHdnJHRjcDpbbmV0ZGlzdC5pbmNsdWRlLm5ldGluZXRdaW4uaCIKKyNpbmNsdWRlICJ0d2ckdGNwOltuZXRkaXN0LmluY2x1ZGUuYXJwYV1pbmV0LmgiCisjaW5jbHVkZSAidHdnJHRjcDpbbmV0ZGlzdC5pbmNsdWRlLnN5c11pb2N0bC5oIgorCisjZWxzZSAvKiBOb3QgV0lOVENQICovCisKKyNpZmRlZiBERUNfVENQSVAKKyNpZmRlZiBVQ1g1MAorI2lmbmRlZiBJRl9ET1RfSAorI2RlZmluZSBJRl9ET1RfSAorI2VuZGlmIC8qICBJRl9ET1RfSCAqLworI2VuZGlmIC8qIFVDWDUwICovCisKKyNpZmRlZiBJRl9ET1RfSAorI2luY2x1ZGUgPGlmLmg+ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZWRlZCB0byBwdXQgdXAgdV9pbnQgdHlwZWRlZiAqLworI2Vsc2UKKyNpZmRlZiBORUVEVUlOVAordHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQ7CisjZW5kaWYgLyogTkVFRFVJTlQgKi8KKyNlbmRpZiAvKiBJRl9ET1RfSCAqLworCisjaW5jbHVkZSA8aW4uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHNvY2tldC5oPgorI2luY2x1ZGUgImNrdmlvYy5oIgorI2RlZmluZSBzb2NrZXRfZXJybm8gZXJybm8KKworI2lmZGVmIENPTU1FTlQKKy8qCisgIE5vIGxvbmdlciBuZWVkZWQgYmVjYXVzZSBub3cgYnplcm8vYmNvcHkgYXJlIG1hY3JvcyBkZWZpbmVkIGFzCisgIG1lbXNldC9tZW1tb3ZlIGluIGFsbCBWTVMgYnVpbGRzLgorKi8KKy8qCisgIFRyYW5zbGF0aW9uOiBJbiA8c3RyaW5ncy5oPiwgd2hpY2ggZXhpc3RzIG9ubHkgZm9yIERFQ0MgPj0gNS4yLCBiemVybygpCisgIGFuZCBiY29weSgpIGFyZSBkZWNsYXJlZCBvbmx5IGZvciBPcGVuVk1TID49IDcuMC4gIFRoaXMgc3RpbGwgbWlnaHQgbmVlZAorICBhZGp1c3RtZW50IGZvciBERUNDIDUuMCBhbmQgaGlnaGVyLgorKi8KKyNpZmRlZiBfX0RFQ0NfVkVSCisjaWZkZWYgVk1TVjcwCisvKgorICBOb3RlOiB5b3UgY2FuJ3QgdXNlICIjaWYgKF9fVk1TX1ZFUj49NzAwMDAwMDApIiBiZWNhdXNlIHRoYXQgaXMgbm90CisgIHBvcnRhYmxlIGFuZCBraWxscyBub24tVk1TIGJ1aWxkcy4KKyovCisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2Vsc2UKKyNpZm5kZWYgYnplcm8KKyNkZWZpbmUgYnplcm8ocyxuKSBtZW1zZXQocywwLG4pCisjZW5kaWYKKyNpZm5kZWYgYmNvcHkKKyNkZWZpbmUgYmNvcHkoaCxhLGwpIG1lbW1vdmUoYSxoLGwpCisjZW5kaWYKKyNlbmRpZiAvKiBWTVNWNzAgKi8KKyNlbHNlCisjaWZuZGVmIGJ6ZXJvCisjZGVmaW5lIGJ6ZXJvKHMsbikgbWVtc2V0KHMsMCxuKQorI2VuZGlmCisjaWZuZGVmIGJjb3B5CisjZGVmaW5lIGJjb3B5KGgsYSxsKSBtZW1tb3ZlKGEsaCxsKQorI2VuZGlmCisjZW5kaWYgLyogX19ERUNDX1ZFUiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2RlZmluZSBzb2NrZXRfcmVhZCAgICAgcmVhZAorI2RlZmluZSBzb2NrZXRfd3JpdGUgICAgd3JpdGUKKyNkZWZpbmUgc29ja2V0X2lvY3RsICAgIGlvY3RsCisjZGVmaW5lIHNvY2tldF9jbG9zZSAgICBjbG9zZQorCisjaWZkZWYgX19ERUNDCitpbnQgaW9jdGwgKGludCBkLCBpbnQgcmVxdWVzdCwgdm9pZCAqYXJncCk7CisjZWxzZQoraW50IGlvY3RsIChpbnQgZCwgaW50IHJlcXVlc3QsIGNoYXIgKmFyZ3ApOworI2VuZGlmIC8qIERFQ0MgKi8KKy8qCisgIFVDWCBzdXBwb3J0cyBzZWxlY3QoKSwgYnV0IGRvZXMgbm90IHByb3ZpZGUgdGhlIG5lZWRlZCBzeW1ib2wgYW5kCisgIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBpbiBhbnkgaGVhZGVyIGZpbGUsIHNvIC4uLgorKi8KKyNpbmNsdWRlIDx0eXBlcy5oPgorI2lmbmRlZiBOQkJZCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MSwgMTk5MworICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAgICAgIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAgICAgIEAoIyl0eXBlcy5oICAgICA4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjZGVmaW5lIE5CQlkgICAgOCAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGEgYnl0ZSAqLworCisvKgorICogU2VsZWN0IHVzZXMgYml0IG1hc2tzIG9mIGZpbGUgZGVzY3JpcHRvcnMgaW4gbG9uZ3MuICBUaGVzZSBtYWNyb3MKKyAqIG1hbmlwdWxhdGUgc3VjaCBiaXQgZmllbGRzICh0aGUgZmlsZXN5c3RlbSBtYWNyb3MgdXNlIGNoYXJzKS4KKyAqIEZEX1NFVFNJWkUgbWF5IGJlIGRlZmluZWQgYnkgdGhlIHVzZXIsIGJ1dCB0aGUgZGVmYXVsdCBoZXJlIHNob3VsZAorICogYmUgZW5vdWdoIGZvciBtb3N0IHVzZXMuCisgKi8KKyNpZm5kZWYgRkRfU0VUU0laRQorI2RlZmluZSBGRF9TRVRTSVpFICAgICAgMjU2CisjZW5kaWYKKwordHlwZWRlZiBsb25nICAgIGZkX21hc2s7CisjZGVmaW5lIE5GREJJVFMgKHNpemVvZihmZF9tYXNrKSAqIE5CQlkpICAgICAgICAvKiBiaXRzIHBlciBtYXNrICovCisKKyNpZm5kZWYgaG93bWFueQorI2RlZmluZSBob3dtYW55KHgsIHkpICAgKCgoeCkrKCh5KS0xKSkvKHkpKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGZkX3NldCB7CisgICAgICAgIGZkX21hc2sgZmRzX2JpdHNbaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKV07Cit9IGZkX3NldDsKKworI2RlZmluZSBGRF9TRVQobiwgcCkgICAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdIHw9ICgxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZGVmaW5lIEZEX0NMUihuLCBwKSAgICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJj0gfigxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZGVmaW5lIEZEX0lTU0VUKG4sIHApICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJiAoMSA8PCAoKG4pICUgTkZEQklUUykpKQorI2RlZmluZSBGRF9DT1BZKGYsIHQpICAgYmNvcHkoZiwgdCwgc2l6ZW9mKCooZikpKQorI2RlZmluZSBGRF9aRVJPKHApICAgICAgYnplcm8ocCwgc2l6ZW9mKCoocCkpKQorI2VuZGlmIC8qICFOQkJZICovCisKKyNlbHNlICAvKiBOb3QgREVDX1RDUElQICovCisKKyNpZmRlZiBDTVVfVENQSVAKKyNpbmNsdWRlIDx0eXBlcy5oPgorI2luY2x1ZGUgPGluLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzb2NrZXQuaD4KKyNpbmNsdWRlIDxpbmV0Lmg+CisjaW5jbHVkZSA8aW9jdGwuaD4KKyNpbmNsdWRlICJja3Zpb2MuaCIKKyNkZWZpbmUgc29ja2V0X2Vycm5vIGVycm5vCisKKy8qCisgKiBSb3V0aW5lcyBzdXBwbGllZCBpbiBMSUJDTVUuT0xCCisgKi8KKyNkZWZpbmUgc29ja2V0X2lvY3RsICAgIGlvY3RsCisjZGVmaW5lIHNvY2tldF9yZWFkICAgICBjbXVfcmVhZAorI2RlZmluZSBzb2NrZXRfd3JpdGUgICAgY211X3dyaXRlCisjZGVmaW5lIHNvY2tldF9jbG9zZSAgICBjbXVfY2xvc2UKKworI2VuZGlmIC8qIENNVV9UQ1BJUCAqLworI2VuZGlmIC8qIERFQ19UQ1BJUCAqLworI2VuZGlmIC8qIFdJTlRDUCAqLworI2VuZGlmIC8qIE1VTFRJTkVUICovCisKKyNlbHNlIC8qIE5vdCBWTVMgKi8KKworI2lmZGVmIE9TMgorI2luY2x1ZGUgImNrb25ldC5oIgorI2lmbmRlZiBOVAorI2luY2x1ZGUgPG5lcnJuby5oPgorI2VuZGlmCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBTVFJBVFVTICAvKiBTdHJhdHVzIFZPUyB1c2luZyBPUyBUQ1AvSVAgcHJvZHVjdHMgUzIzNSwgUzIzNiwgUzIzNyAqLworI2luY2x1ZGUgPHRjcF9zb2NrZXQuaD4KKy8qIFRoaXMgZ2V0cyB1c2VkIHNvbWUgcGxhY2VzIHdoZW4gVENQU09DS0VUIGlzIGRlZmluZWQuICovCisvKiBPUyBUQ1AgcHJvdmlkZXMgYnplcm8oKSwgYnV0IG5vdCBiY29weSgpLi4uIGdvIGZpZ3VyZS4gKi8KKyNkZWZpbmUgYmNvcHkocyxkLHopIG1lbWNweShkLHMseikKKyNlbmRpZiAvKiBTVFJBVFVTICovCisKKyNpZmRlZiBPU0sKKyNpZm5kZWYgT1NLWFhDCisjaW5jbHVkZSA8aW5ldC9pbi5oPgorI2luY2x1ZGUgPGluZXQvbmV0ZGIuaD4KKyNpbmNsdWRlIDxpbmV0L3NvY2tldC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxJTkVUL2luLmg+CisjaW5jbHVkZSA8SU5FVC9uZXRkYi5oPgorI2luY2x1ZGUgPElORVQvc29ja2V0Lmg+CisjZW5kaWYgLyogT1NLWFhDICovCisjaWZuZGVmIGJ6ZXJvCisjZGVmaW5lIGJ6ZXJvKHMsbikgbWVtc2V0KHMsMCxuKQorI2VuZGlmCisjaWZuZGVmIGJjb3B5CisjZGVmaW5lIGJjb3B5KGgsYSxsKSBtZW1jcHkoYSxoLGwpCisjZW5kaWYKK3R5cGVkZWYgY2hhciAqIGNhZGRyX3Q7IC8qIGNvcmUgYWRkcmVzcyB0eXBlICovCisjZW5kaWYgLyogT1NLICovCisKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZmRlZiBUQ1BTT0NLRVQKKyNpZm5kZWYgTk9IQUREUkxJU1QKKyNpZm5kZWYgSEFERFJMSVNUCisjaWZkZWYgU1VOT1M0MQorI2RlZmluZSBIQUREUkxJU1QKKyNlbmRpZiAvKiBTVU5PUzQxICovCisjaWZkZWYgU09MQVJJUworI2RlZmluZSBIQUREUkxJU1QKKyNlbmRpZiAvKiBTT0xBUklTICovCisjaWZkZWYgTElOVVgKKyNkZWZpbmUgSEFERFJMSVNUCisjZW5kaWYgLyogTElOVVggKi8KKyNpZmRlZiBBSVhSUworI2RlZmluZSBIQUREUkxJU1QKKyNlbmRpZiAvKiBBSVhSUyAqLworI2lmZGVmIEhQVVgKKyNkZWZpbmUgSEFERFJMSVNUCisjZW5kaWYgLyogSFBVWCAqLworI2lmZGVmIElSSVgKKyNkZWZpbmUgSEFERFJMSVNUCisjZW5kaWYgLyogSVJJWCAqLworI2lmZGVmIEkzODZJWAorI2RlZmluZSBIQUREUkxJU1QKKyNlbmRpZiAvKiBJMzg2SVggKi8KKyNlbmRpZiAvKiBIQUREUkxJU1QgKi8KKy8qIEEgc3lzdGVtIHRoYXQgZGVmaW5lcyBoX2FkZHIgYXMgaF9hZGRyX2xpc3RbMF0gc2hvdWxkIGJlIEhBRERSTElTVCAqLworI2lmbmRlZiBIQUREUkxJU1QKKyNpZmRlZiBoX2FkZHIKKyNkZWZpbmUgSEFERFJMSVNUCisjZW5kaWYgLyogaF9hZGRyICovCisjZW5kaWYgLyogSEFERFJMSVNUICovCisjZW5kaWYgLyogTk9IQUREUkxJU1QgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworI2lmZGVmIFROQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlJ3JlIGNvbXBpbGluZyB0ZWxuZXQgY29kZS4uLiAqLworI2lmbmRlZiBJS1NfT1BUSU9OCisjaWZuZGVmIFNUUkFUVVMKKyNkZWZpbmUgSUtTX09QVElPTgorI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisjaW5jbHVkZSAiY2tjdGVsLmgiCisjZWxzZQorZXh0ZXJuIGludCBzc3RlbG5ldDsKKyNpZmRlZiBJS1NECisjdW5kZWYgSUtTRAorI2VuZGlmIC8qIElLU0QgKi8KKyNpZm5kZWYgTk9JS1NECisjZGVmaW5lIE5PSUtTRAorI2VuZGlmIC8qIE5PSUtTRCAqLworI2lmZGVmIElLU19PUFRJT04KKyN1bmRlZiBJS1NfT1BUSU9OCisjZW5kaWYgLyogSUtTX09QVElPTiAqLworI2VuZGlmIC8qIFROQ09ERSAqLworCisjaWZuZGVmIE5PVENQT1BUUworLyoKKyAgQXV0b21hdGljYWxseSBkZWZpbmUgTk9UQ1BPUFRTIGZvciBjb25maWd1cmF0aW9ucyB3aGVyZSB0aGV5IGNhbid0IGJlCisgIHVzZWQgYXQgcnVudGltZSBvciBjYXVzZSB0b28gbXVjaCB0cm91YmxlIGF0IGNvbXBpbGUgdGltZS4KKyovCisjaWZkZWYgQ01VX1RDUElQICAgICAgICAgICAgICAgICAgICAgICAgLyogQ01VL1RlayAqLworI2RlZmluZSBOT1RDUE9QVFMKKyNlbmRpZiAvKiBDTVVfVENQSVAgKi8KKyNpZmRlZiBNVUxUSU5FVCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNdWx0aW5ldCBvbiBBbHBoYSAqLworI2lmZGVmIF9fYWxwaGEKKyNkZWZpbmUgTk9UQ1BPUFRTCisjZW5kaWYgLyogX19hbHBoYSAqLworI2VuZGlmIC8qIE1VTFRJTkVUICovCisjZW5kaWYgLyogTk9UQ1BPUFRTICovCisKKyNpZmRlZiBOT1RDUE9QVFMKKyNpZmRlZiBUQ1BfTk9ERUxBWQorI3VuZGVmIFRDUF9OT0RFTEFZCisjZW5kaWYgLyogVENQX05PREVMQVkgKi8KKyNpZmRlZiBTT19MSU5HRVIKKyN1bmRlZiBTT19MSU5HRVIKKyNlbmRpZiAvKiBTT19MSU5HRVIgKi8KKyNpZmRlZiBTT19LRUVQQUxJVkUKKyN1bmRlZiBTT19LRUVQQUxJVkUKKyNlbmRpZiAvKiBTT19LRUVQQUxJVkUgKi8KKyNpZmRlZiBTT19TTkRCVUYKKyN1bmRlZiBTT19TTkRCVUYKKyNlbmRpZiAvKiBTT19TTkRCVUYgKi8KKyNpZmRlZiBTT19SQ1ZCVUYKKyN1bmRlZiBTT19SQ1ZCVUYKKyNlbmRpZiAvKiBTT19SQ1ZCVUYgKi8KKyNlbmRpZiAvKiBOT1RDUE9QVFMgKi8KKworLyogVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBldmVuIHdoZW4gVENQU09DS0VUIGlzIG5vdCBhdmFpbGFibGUgKi8KK19QUk9UT1RZUCggY2hhciAqIGNrZ2V0cGVlciwgKFZPSUQpKTsKKworI2lmZGVmIFRDUFNPQ0tFVAorI2lmZGVmIFNPTF9TT0NLRVQKKyNpZmRlZiBUQ1BfTk9ERUxBWQorX1BST1RPVFlQKCBpbnQgbm9fZGVsYXksIChpbnQsIGludCkgKTsKKyNlbmRpZiAvKiBUQ1BfTk9ERUxBWSAqLworI2lmZGVmIFNPX0tFRVBBTElWRQorX1BST1RPVFlQKCBpbnQga2VlcGFsaXZlLCAoaW50LCBpbnQpICkgOworI2VuZGlmIC8qIFNPX0tFRVBBTElWRSAqLworI2lmZGVmIFNPX0xJTkdFUgorX1BST1RPVFlQKCBpbnQgY2tfbGluZ2VyLCAoaW50LCBpbnQsIGludCkgKSA7CisjZW5kaWYgLyogU09fTElOR0VSICovCisjaWZkZWYgU09fU05EQlVGCitfUFJPVE9UWVAoIGludCBzZW5kYnVmLChpbnQsIGludCkgKSA7CisjZW5kaWYgLyogU09fU05EQlVGICovCisjaWZkZWYgU09fUkNWQlVGCitfUFJPVE9UWVAoIGludCByZWN2YnVmLCAoaW50LCBpbnQpICkgOworI2VuZGlmIC8qIFNPX1JDVkJVRiAqLworI2lmZGVmIFNPX0RPTlRST1VURQorX1BST1RPVFlQKGludCBkb250cm91dGUsIChpbnQsIGludCkpOworI2VuZGlmIC8qIFNPX0RPTlRST1VURSAqLworI2VuZGlmIC8qIFNPTF9TT0NLRVQgKi8KK19QUk9UT1RZUCggaW50IGdldGxvY2FsaXBhZGRyLCAoVk9JRCkpOworX1BST1RPVFlQKCBpbnQgZ2V0bG9jYWxpcGFkZHJzLCAoY2hhciAqLGludCxpbnQpKTsKK19QUk9UT1RZUCggY2hhciAqIGNrZ2V0ZnFob3N0bmFtZSwoY2hhciAqKSk7CitfUFJPVE9UWVAoIHN0cnVjdCBob3N0ZW50ICogY2tfY29weWhvc3RlbnQsKHN0cnVjdCBob3N0ZW50ICopKTsKK19QUk9UT1RZUCggY2hhciAqIGNrbmFtZTJhZGRyLCAoY2hhciAqKSk7CitfUFJPVE9UWVAoIGNoYXIgKiBja2FkZHIybmFtZSwgKGNoYXIgKikpOworCisvKiBBSVggKi8KKworI2lmZGVmIEFJWFJTCisjaWZuZGVmIFRDUF9OT0RFTEFZCisjZGVmaW5lIFRDUF9OT0RFTEFZIDB4MQorI2VuZGlmIC8qIFRDUF9OT0RFTEFZICovCisjaWZuZGVmIFRDUF9NQVhTRUcKKyNkZWZpbmUgVENQX01BWFNFRyAweDIKKyNlbmRpZiAvKiBUQ1BfTUFYU0VHICovCisjaWZuZGVmIFRDUF9LRUVQQUxJVkUKKyNkZWZpbmUgVENQX0tFRVBBTElWRSAweDgKKyNlbmRpZiAvKiBUQ1BfS0VFUEFMSVZFICovCisjZW5kaWYgLyogQUlYUlMgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworI2lmZGVmIFJMT0dDT0RFCisjaWZuZGVmIENLX1RUR1dTSVoKK1NPUlJZX1JMT0dJTl9SRVFVSVJFU19UVEdXU0laX3NlZV9ja2NwbG0uZG9jCisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworI2VuZGlmIC8qIFJMT0dDT0RFICovCisKKyNpZmRlZiBDS19OQVdTCisjaWZuZGVmIENLX1RUR1dTSVoKK1NPUlJZX0NLX05BV1NfUkVRVUlSRVNfVFRHV1NJWl9zZWVfY2tjcGxtLmRvYworI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKyNlbmRpZiAvKiBDS19OQVdTICovCisKKyNpZm5kZWYgUEZfSU5FVAorI2lmZGVmICBBRl9JTkVUCisjZGVmaW5lIFBGX0lORVQgQUZfSU5FVAorI2VuZGlmIC8qIEFGX0lORVQgKi8KKyNlbmRpZiAvKiBQRl9JTkVUICovCisKKyNpZm5kZWYgSVBQT1JUX0VDSE8KKyNkZWZpbmUgSVBQT1JUX0VDSE8gNworI2VuZGlmIC8qIElQUE9SVF9FQ0hPICovCisKKyNpZmRlZiBDS19LRVJCRVJPUworI2lmZGVmIFJMT0dDT0RFCitfUFJPVE9UWVAoaW50IGNrX2tyYl9ybG9naW4sKENIQVIgKiwgaW50LCBDSEFSICosIENIQVIgKiwgQ0hBUiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKiwgaW50LCBpbnQpKTsKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKK19QUk9UT1RZUCggVk9JRCBpbmlfa2VyYiwgKCB2b2lkICkgKTsgICAvKiBLZXJiZXJvcyBpbml0aWFsaXphdGlvbiByb3V0aW5lICovCitfUFJPVE9UWVAoIGludCBkb2F1dGgsIChpbnQpICk7ICAgICAgICAgLyogQVVUSEVOVElDQVRFIGFjdGlvbiByb3V0aW5lICovCisKKyNpZmRlZiBDS19ETlNfU1JWCitfUFJPVE9UWVAoaW50IGxvY2F0ZV9zcnZfZG5zLChjaGFyICpob3N0LCBjaGFyICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHJvdG9jb2wsIHN0cnVjdCBzb2NrYWRkciAqKmFkZHJfcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5hZGRycykpOworI2VuZGlmIC8qIENLX0ROU19TUlYgKi8KKworI2lmbmRlZiBOT0hUVFAKK19QUk9UT1RZUChpbnQgaHR0cF9vcGVuLCAoY2hhciAqLCBjaGFyICosIGludCwgY2hhciAqLCBpbnQsIGNoYXIgKikpOworX1BST1RPVFlQKGludCBodHRwX3Jlb3BlbiwgKFZPSUQpKTsKK19QUk9UT1RZUChpbnQgaHR0cF9jbG9zZSwgKFZPSUQpKTsKK19QUk9UT1RZUChpbnQgaHR0cF9nZXQsIChjaGFyICosY2hhciAqKixjaGFyICosY2hhciAqLGNoYXIsY2hhciAqLGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpKTsKK19QUk9UT1RZUChpbnQgaHR0cF9oZWFkLCAoY2hhciAqLGNoYXIgKiosY2hhciAqLGNoYXIgKixjaGFyLGNoYXIgKixjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCkpOworX1BST1RPVFlQKGludCBodHRwX3B1dCwgKGNoYXIgKixjaGFyICoqLGNoYXIgKixjaGFyICosY2hhciAqLGNoYXIsY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgY2hhciAqLCBpbnQpKTsKK19QUk9UT1RZUChpbnQgaHR0cF9kZWxldGUsIChjaGFyICosY2hhciAqKixjaGFyICosY2hhciAqLGNoYXIsY2hhciAqKSk7CitfUFJPVE9UWVAoaW50IGh0dHBfY29ubmVjdCwgKGludCwgY2hhciAqLGNoYXIgKiosY2hhciAqLGNoYXIgKixjaGFyLGNoYXIgKikpOworX1BST1RPVFlQKGludCBodHRwX3Bvc3QsIChjaGFyICosY2hhciAqKixjaGFyICosY2hhciAqLGNoYXIgKixjaGFyLGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgIGNoYXIgKixjaGFyICosIGludCkpOworX1BST1RPVFlQKGludCBodHRwX2luZGV4LCAoY2hhciAqLGNoYXIgKiosY2hhciAqLGNoYXIgKixjaGFyLGNoYXIgKixjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpKTsKK19QUk9UT1RZUChpbnQgaHR0cF9pbmMsIChpbnQpKTsKK19QUk9UT1RZUChpbnQgaHR0cF9pc2Nvbm5lY3RlZCwgKHZvaWQpKTsKKworZXh0ZXJuIGNoYXIgKiB0Y3BfaHR0cF9wcm94eTsgICAgICAgICAgIC8qIE5hbWVbOnBvcnRdIG9mIGh0dHAgcHJveHkgc2VydmVyICovCitleHRlcm4gaW50ICAgIHRjcF9odHRwX3Byb3h5X2Vycm5vOyAgICAgLyogUmV0dXJuIHZhbHVlIGZyb20gc2VydmVyICovCitleHRlcm4gY2hhciAqIHRjcF9odHRwX3Byb3h5X3VzZXI7ICAgICAgLyogTmFtZSBvZiB1c2VyIGZvciBhdXRoZW50aWNhdGlvbiAqLworZXh0ZXJuIGNoYXIgKiB0Y3BfaHR0cF9wcm94eV9wd2Q7ICAgICAgIC8qIFBhc3N3b3JkIG9mIHVzZXIgKi8KKyNlbmRpZiAvKiBOT0hUVFAgKi8KKworI2lmZGVmIFRDUFNPQ0tFVAorCisvKiBUeXBlIG5lZWRlZCBhcyA1dGggYXJndW1lbnQgKGxlbmd0aCkgdG8gZ2V0L3NldHNvY2tvcHQoKSAqLworCisjaWZuZGVmIFNPQ0tPUFRfVAorI2RlZmluZSBTT0NLT1BUX1QgaW50CisjaWZkZWYgQUlYNDIKKyN1bmRlZiBTT0NLT1BUX1QKKyNkZWZpbmUgU09DS09QVF9UIHVuc2lnbmVkIGxvbmcKKyNlbHNlCisjaWZkZWYgUFRYCisjdW5kZWYgU09DS09QVF9UCisjZGVmaW5lIFNPQ0tPUFRfVCBzaXplX3QKKyNlbHNlCisjaWZkZWYgTlQKKyN1bmRlZiBTT0NLT1BUX1QKKyNkZWZpbmUgU09DS09QVF9UIGludAorI2Vsc2UgLyogTlQgKi8KKyNpZmRlZiBVTklYV0FSRQorI3VuZGVmIFNPQ0tPUFRfVAorI2RlZmluZSBTT0NLT1BUX1Qgc2l6ZV90CisjZWxzZSAvKiBVTklYV0FSRSAqLworI2lmZGVmIFZNUworI2lmZGVmIERFQ19UQ1BJUAorI2lmZGVmIF9fREVDQ19WRVIKKyN1bmRlZiBTT0NLT1BUX1QKKyNkZWZpbmUgU09DS09QVF9UIHNpemVfdAorI2VuZGlmIC8qIF9fREVDQ19WRVIgKi8KKyNlbmRpZiAvKiBERUNfVENQSVAgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYV0FSRSAqLworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogUFRYICovCisjZW5kaWYgLyogQUlYNDIgKi8KKyNlbmRpZiAvKiBTT0NLT1BUX1QgKi8KKworLyogRGl0dG8gZm9yIGdldHNvY2tuYW1lKCkgKi8KKworI2lmbmRlZiBHU09DS05BTUVfVAorI2RlZmluZSBHU09DS05BTUVfVCBpbnQKKyNpZmRlZiBQVFgKKyN1bmRlZiBHU09DS05BTUVfVAorI2RlZmluZSBHU09DS05BTUVfVCBzaXplX3QKKyNlbHNlCisjaWZkZWYgQUlYNDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZV90IGluIDQuMisrLCBpbnQgaW4gNC4xLS0gKi8KKyN1bmRlZiBHU09DS05BTUVfVAorI2RlZmluZSBHU09DS05BTUVfVCBzaXplX3QKKyNlbHNlCisjaWZkZWYgVU5JWFdBUkUKKyN1bmRlZiBHU09DS05BTUVfVAorI2RlZmluZSBHU09DS05BTUVfVCBzaXplX3QKKyNlbHNlCisjaWZkZWYgVk1TCisjaWZkZWYgREVDX1RDUElQCisjaWZkZWYgX19ERUNDX1ZFUgorI3VuZGVmIEdTT0NLTkFNRV9UCisjZGVmaW5lIEdTT0NLTkFNRV9UIHNpemVfdAorI2VuZGlmIC8qIF9fREVDQ19WRVIgKi8KKyNlbmRpZiAvKiBERUNfVENQSVAgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYV0FSRSAqLworI2VuZGlmIC8qIEFJWDQxICovCisjZW5kaWYgLyogUFRYICovCisjZW5kaWYgLyogR1NPQ0tOQU1FX1QgKi8KKworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCisjaWZkZWYgTUFDT1NYMTAKKyNpZmRlZiBiY29weQorI3VuZGVmIGJjb3B5CisjZW5kaWYKKyNpZmRlZiBiemVybworI3VuZGVmIGJ6ZXJvCisjZW5kaWYKKyNlbmRpZiAvKiBNQUNPU1gxMCAqLworCisjZW5kaWYgLyogQ0tDTkVUX0ggKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja2NwbG0udHh0IGIvY2tlcm1pdC04LjAuMjExL2NrY3BsbS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyZjQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja2NwbG0udHh0CkBAIC0wLDAgKzEsMzA3NiBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgQy1LZXJtaXQgUHJvZ3JhbSBMb2dpYyBNYW51YWwKKworICAgICBGcmFuayBkYSBDcnV6CisgICAgIFsxXVRoZSBLZXJtaXQgUHJvamVjdAorICAgICBbMl1Db2x1bWJpYSBVbml2ZXJzaXR5CisKKyAgIEFzIG9mOiBDLUtlcm1pdCA4LjAuMjExLCAxMCBBcHJpbCAyMDA0CisgICBUaGlzIHBhZ2UgbGFzdCB1cGRhdGVkOiBTYXQgQXByIDEwIDE2OjQ1OjMwIDIwMDQgKE5ldyBZb3JrIFVTQSBUaW1lKQorCisgICAgIElGIFlPVSBBUkUgUkVBRElORyBBIFBMQUlOLVRFWFQgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50LCBub3RlIHRoYXQKKyAgICAgdGhpcyBmaWxlIGlzIGEgcGxhaW4tdGV4dCBkdW1wIG9mIGEgV2ViIHBhZ2UuIFlvdSBjYW4gdmlzaXQgdGhlCisgICAgIG9yaWdpbmFsIChhbmQgcG9zc2libHkgbW9yZSB1cC10by1kYXRlKSBXZWIgcGFnZSBoZXJlOgorCisgIFszXWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbAorCisgICBbIFs0XUMtS2VybWl0IEhvbWUgXSBbIFs1XUtlcm1pdCBIb21lIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICBDT05URU5UUworCisgIDEuIFs2XUlOVFJPRFVDVElPTgorICAyLiBbN11GSUxFUworICAzLiBbOF1TT1VSQ0UgQ09ERSBQT1JUQUJJTElUWSBBTkQgU1RZTEUKKyAgNC4gWzldTU9EVUxFUworICAgICA0LkEuIFsxMF1Hcm91cCBBOiBMaWJyYXJ5IFJvdXRpbmVzCisgICAgIDQuQi4gWzExXUdyb3VwIEI6IEtlcm1pdCBGaWxlIFRyYW5zZmVyCisgICAgIDQuQy4gWzEyXUdyb3VwIEM6IENoYXJhY3Rlci1TZXQgQ29udmVyc2lvbgorICAgICA0LkQuIFsxM11Hcm91cCBEOiBVc2VyIEludGVyZmFjZQorICAgICA0LkUuIFsxNF1Hcm91cCBFOiBQbGF0Zm9ybS1EZXBlbmRlbnQgSS9PCisgICAgIDQuRi4gWzE1XUdyb3VwIEY6IE5ldHdvcmsgU3VwcG9ydAorICAgICA0LkcuIFsxNl1Hcm91cCBHOiBGb3JtYXR0ZWQgU2NyZWVuIFN1cHBvcnQKKyAgICAgNC5ILiBbMTddR3JvdXAgSDogUHNldWRvdGVybWluYWwgU3VwcG9ydAorICAgICA0LkkuIFsxOF1Hcm91cCBJOiBTZWN1cml0eQorICBJLiBbMTldQVBQRU5ESVggSTogRklMRSBQRVJNSVNTSU9OUworICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEuIElOVFJPRFVDVElPTgorCisgICBUaGUgS2VybWl0IFByb3RvY29sIGlzIHNwZWNpZmllZCBpbiB0aGUgYm9vayBLZXJtaXQsIEEgRmlsZSBUcmFuc2ZlcgorICAgUHJvdG9jb2wgYnkgRnJhbmsgZGEgQ3J1eiwgRGlnaXRhbCBQcmVzcyAvIEJ1dHRlcndvcnRoIEhlaW5lbWFubiwKKyAgIE5ld3RvbiwgTUEsIFVTQSAoMTk4NyksIDM3OSBwYWdlcywgSVNCTiAwLTkzMjM3Ni04OC02LiBJdCBpcyBhc3N1bWVkCisgICB0aGUgcmVhZGVyIGlzIGZhbWlsaWFyIHdpdGggdGhlIEtlcm1pdCBwcm90b2NvbCBzcGVjaWZpY2F0aW9uLgorCisgICBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXAgYW1vbmcgdGhlIG1vZHVsZXMgYW5kIGZ1bmN0aW9ucworICAgb2YgQy1LZXJtaXQgNUEgYW5kIGxhdGVyLCBhbmQgb3RoZXIgcHJvZ3JhbW1pbmcgY29uc2lkZXJhdGlvbnMuCisgICBDLUtlcm1pdCBpcyBkZXNpZ25lZCB0byBiZSBwb3J0YWJsZSB0byBhbnkga2luZCBvZiBjb21wdXRlciB0aGF0IGhhcyBhCisgICBDIGNvbXBpbGVyLiBUaGUgc291cmNlIGNvZGUgaXMgYnJva2VuIGludG8gbWFueSBmaWxlcyB0aGF0IGFyZSBncm91cGVkCisgICBhY2NvcmRpbmcgdG8gdGhlaXIgZnVuY3Rpb24sIGFzIHNob3duIGluIHRoZSBbMjBdQ29udGVudHMuCisKKyAgIEMtS2VybWl0IGhhcyBzZWVuIGNvbnN0YW50IGRldmVsb3BtZW50IHNpbmNlIDE5ODUuIFRocm91Z2hvdXQgaXRzCisgICBoaXN0b3J5LCB0aGVyZSBoYXMgYmVlbiBhIG5ldmVyZW5kaW5nIHR1Zy1vZi13YXIgYW1vbmc6CisKKyAgICBhLiBGdW5jdGlvbmFsaXR5OiBhZGRpbmcgbmV3IGZlYXR1cmVzLCBmaXhpbmcgYnVncywgaW1wcm92aW5nCisgICAgICAgcGVyZm9ybWFuY2UuCisgICAgYi4gQWRkaW5nIHN1cHBvcnQgZm9yIG5ldyBwbGF0Zm9ybXMuCisgICAgYy4gIkJ1enp3b3JkIDEuMCBjb21wbGlhbmNlIi4KKworICAgVGhlIGxhdHRlciBjYXRlZ29yeSBpcyB0aGUgbW9zdCBmcnVzdHJhdGluZywgc2luY2UgaXQgZ2VuZXJhbGx5CisgICBpbnZvbHZlcyBtYXNzaXZlIGNoYW5nZXMganVzdCB0byBrZWVwIHRoZSBzb2Z0d2FyZSBkb2luZyB3aGF0IGl0IGRpZAorICAgYmVmb3JlIGluIHNvbWUgbmV3IHNldHRpbmc6IGUuZy4gdGhlIEsmUi10by1BTlNJQyBjb252ZXJzaW9uICh3aGljaAorICAgaGFkIHRvIGJlIGRvbmUsIG9mIGNvdXJzZSwgd2l0aG91dCBicmVha2luZyBLJlIpOyBZMksgKG5vdCBhIGJpZyBkZWFsCisgICBpbiBvdXIgY2FzZSk7IHRoZSBtYW55IGFuZCB2YXJpZWQgVU5JWCBhbmQgb3RoZXIgQVBJICJzdGFuZGFyZHMiOworICAgSVB2Ni4KKworICAgWyBbMjFdQ29udGVudHMgXSBbIFsyMl1DLUtlcm1pdCBdIFsgWzIzXUtlcm1pdCBIb21lIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAyLiBGSUxFUworCisgICBDLUtlcm1pdCBzb3VyY2UgZmlsZXMgYmVnaW4gd2l0aCB0aGUgdHdvIGxldHRlcnMgImNrIiwgZm9yIGV4YW1wbGUKKyAgIGNrdXRpby5jLiBGaWxlbmFtZXMgYXJlIGtlcHQgc2hvcnQgKDYuMykgZm9yIG1heGltdW0gcG9ydGFiaWxpdHkgYW5kCisgICAob2J2aW91c2x5IEkgaG9wZSkgZG8gbm90IGNvbnRhaW4gc3BhY2VzIG9yIG1vcmUgdGhhbiBvbmUgcGVyaW9kLiBUaGUKKyAgIHRoaXJkIGNoYXJhY3RlciBpbiB0aGUgbmFtZSBkZW5vdGVzIHNvbWV0aGluZyBhYm91dCB0aGUgZnVuY3Rpb24gZ3JvdXAKKyAgIGFuZCB0aGUgZXhwZWN0ZWQgbGV2ZWwgb2YgcG9ydGFiaWxpdHk6CisKKyAgICAgYSAgICAgR2VuZXJhbCBkZXNjcmlwdGl2ZSBtYXRlcmlhbCBhbmQgZG9jdW1lbnRhdGlvbiAodGV4dCkKKyAgICAgYiAgICAgQk9PIGZpbGUgZW5jb2RlcnMgYW5kIGRlY29kZXJzIChvYnNvbGV0ZSkKKyAgICAgYyAgICAgQWxsIHBsYXRmb3JtcyB3aXRoIEMgY29tcGlsZXJzICgqKQorICAgICBkICAgICBEYXRhIEdlbmVyYWwgQU9TL1ZTCisgICAgIGUgICAgIFJlc2VydmVkIGZvciAiY2tlcm1pdCIgZmlsZXMsIGxpa2UgY2tlcm1pdC5pbmksIGNrZXJtaXQyLnR4dAorICAgICBmICAgICAocmVzZXJ2ZWQpCisgICAgIGcgICAgIChyZXNlcnZlZCkKKyAgICAgaCAgICAgKHJlc2VydmVkKQorICAgICBpICAgICBDb21tb2RvcmUgQW1pZ2EgKEludHVpdGlvbikKKyAgICAgaiAgICAgKHVudXNlZCkKKyAgICAgayAgICAgKHVudXNlZCkKKyAgICAgbCAgICAgU3RyYXR1cyBWT1MKKyAgICAgbSAgICAgTWFjaW50b3NoIHdpdGggTWFjIE9TIDEtOQorICAgICBuICAgICBNaWNyb3NvZnQgV2luZG93cyBOVC8yMDAwL1hQCisgICAgIG8gICAgIE9TLzIgYW5kL29yIE1pY3Jvc29mdCBXaW5kb3dzIDl4L01FL05ULzIwMDAvWFAKKyAgICAgcCAgICAgUGxhbiA5IGZyb20gQmVsbCBMYWJzCisgICAgIHEgICAgIChyZXNlcnZlZCkKKyAgICAgciAgICAgREVDIFBEUC0xMSB3aXRoIFJTVFMvRSAobmV2ZXIgdXNlZCwgb3BlbiBmb3IgcmVhc3NpZ21lbnQpCisgICAgIHMgICAgIEF0YXJpIFNUIEdFTURPUyAobGFzdCBzdXBwb3J0ZWQgaW4gdmVyc2lvbiA1QSgxODkpKQorICAgICB0ICAgICBERUMgUERQLTExIHdpdGggUlQtMTEgKG5ldmVyIHVzZWQsIG9wZW4gZm9yIHJlYXNzaWdtZW50KQorICAgICB1ICAgICBVbml4LWJhc2VkIG9wZXJhdGluZyBzeXN0ZW1zICgqKQorICAgICB2ICAgICBWTVMgYW5kIE9wZW5WTVMKKyAgICAgdyAgICAgV2FydCAoTGV4LWxpa2UgcHJlcHJvY2Vzc29yLCBwbGF0Zm9ybSBpbmRlcGVuZGVudCkKKyAgICAgeCAgICAgKHJlc2VydmVkKQorICAgICB5ICAgICAocmVzZXJ2ZWQpCisgICAgIHogICAgIChyZXNlcnZlZCkKKyAgICAgMC0zICAgKHJlc2VydmVkKQorICAgICA0ICAgICBJQk0gQVMvNDAwCisgICAgIDUtOCAgIChyZXNlcnZlZCkKKyAgICAgOSAgICAgTWljcm93YXJlIE9TLTkKKyAgICAgXyAgICAgRW5jcnlwdGlvbiBtb2R1bGVzCisKKyAgICgqKSBJbiBmYWN0IHRoZXJlIGlzIGxpdHRsZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZSBja2MqLiogYW5kIGNrdSouKgorICAgY2F0ZWdvcmllcy4gSXQgd291bGQgbWFrZSBtb3JlIHNlbnNlIGZvciBhbGwgY2t1Ki4qIG1vZHVsZXMgdG8gYmUKKyAgIGNrYyouKiBvbmVzLCBleGNlcHQgY2t1ZmlvLmMsIGNrdXRpby5jLCBja3Vjb24uYywgY2t1Y25zLmMsIGFuZAorICAgY2t1cHR5LmMsIHdoaWNoIHRydWx5IGFyZSBzcGVjaWZpYyB0byBVbml4LiBUaGUgcmVzdCAoY2t1dXMqLmMsCisgICBja3VjbWQuYywgZXRjKSBhcmUgcXVpdGUgcG9ydGFibGUuCisKKyAgIE9uZSBoaW50IGJlZm9yZSBwcm9jZWVkaW5nOiBmdW5jdGlvbnMgYXJlIHNjYXR0ZXJlZCBhbGwgb3ZlciB0aGUKKyAgIGNrYyouYyBhbmQgY2t1Ki5jIG1vZHVsZXMsIHdoZXJlIGZ1bmN0aW9uIHNpemUgaGFzIGJlZ3VuIHRvIHRha2UKKyAgIHByZWNlZGVuY2Ugb3ZlciB0aGUgZGVzaXJhYmlsaXR5IG9mIGdyb3VwaW5nIHJlbGF0ZWQgZnVuY3Rpb25zCisgICB0b2dldGhlciwgdGhlIGFpbSBiZWluZyB0byBrZWVwIGFueSBwYXJ0aWN1bGFyIG1vZHVsZSBmcm9tIGdyb3dpbmcKKyAgIGRpc3Byb3BvcnRpb25hdGVseSBsYXJnZS4gVGhlIGVhc2llc3Qgd2F5IChpbiBVTklYKSB0byBmaW5kIG91dCBpbgorICAgd2hhdCBzb3VyY2UgZmlsZSBhIGdpdmVuIGZ1bmN0aW9uIGlzIGRlZmluZWQgaXMgbGlrZSB0aGlzICh3aGVyZSB0aGUKKyAgIGRlc2lyZWQgZnVuY3Rpb24gaXMgZm9vKCkuLi4pOgorCisgIGdyZXAgXmZvb1woIGNrKi5jCisKKyAgIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gaGFzIGJlZW4gdG8gbWFrZSBmdW5jdGlvbgorICAgbmFtZXMgYWx3YXlzIHN0YXJ0IG9uIHRoZSBsZWZ0IG1hcmdpbiB3aXRoIHRoZWlyIGNvbnRlbnRzIGluZGVudGVkLAorICAgZm9yIGV4YW1wbGU6CisKK3N0YXRpYyBjaGFyICoKK2Zvbyh4LHkpIGludCB4LCB5OyB7CisgICAgLi4uCit9CisKKyAgIEFsc28gbm90ZSB0aGUgc3R5bGUgZm9yIGJyYWNrZXQgcGxhY2VtZW50LiBUaGlzIGFsbG93cworICAgYnJhY2tldC1tYXRjaGluZyB0ZXh0IGVkaXRvcnMgKHN1Y2ggYXMgRU1BQ1MpIHRvIGhlbHAgeW91IG1ha2Ugc3VyZQorICAgeW91IGtub3cgd2hpY2ggb3BlbmluZyBicmFja2V0IGEgY2xvc2luZyBicmFja2V0IG1hdGNoZXMsIHBhcnRpY3VsYXJseQorICAgd2hlbiB0aGUgb3BlbmluZyBicmFja2V0IGlzIGFib3ZlIHRoZSB2aXNpYmxlIHNjcmVlbiwgYW5kIGl0IGFsc28KKyAgIG1ha2VzIGl0IGVhc3kgdG8gZmluZCB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gKHNlYXJjaCBmb3IgJ30nIG9uIHRoZQorICAgbGVmdCBtYXJnaW4pLgorCisgICBPZiBjb3Vyc2UgRU1BQ1MgdGFncyB3b3JrIG5pY2VseSB3aXRoIHRoaXMgZm9ybWF0IHRvbzoKKworICAkIGNkIGtlcm1pdC1zb3VyY2UtZGlyZWN0b3J5CisgICQgZXRhZ3MgY2tbY3VdKi5jCisgICQgZW1hY3MKKyAgRXNjLVggVmlzaXQtVGFncy1UYWJsZTxDUj48Q1I+CisKKyAgIChidXQgcmVtZW1iZXIgdGhhdCB0aGUgc291cmNlIGZpbGUgZm9yIGNrY3Byby5jIGlzIFsyNF1ja2Nwcm8udyEpCisKKyAgIEFsc286CisKKyAgICAgKiBUYWJzIHNob3VsZCBiZSBzZXQgZXZlcnkgOCBzcGFjZXMsIGFzIG9uIGEgVlQxMDAuCisgICAgICogQWxsIGxpbmVzIG11c3Qgbm8gbW9yZSB0aGFuIDc5IGNoYXJhY3RlcnMgd2lkZSBhZnRlciB0YWIKKyAgICAgICBleHBhbnNpb24uCisgICAgICogTm90ZSB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBwaHlzaWNhbCB0YWJzIChBU0NJSSA5KSBhbmQgdGhlCisgICAgICAgaW5kZW50YXRpb24gY29udmVudGlvbnMsIHdoaWNoIGFyZTogNCBmb3IgYmxvY2sgY29udGVudHMsIDIgZm9yCisgICAgICAgbW9zdCBvdGhlciBzdHVmZiAob2J2aW91c2x5IHRoaXMgaXMgbm90IGEgcG9ydGFiaWxpdHkgaXNzdWUsIGp1c3QKKyAgICAgICBzdHlsZSkuCisKKyAgIFsgWzI1XUNvbnRlbnRzIF0gWyBbMjZdQy1LZXJtaXQgXSBbIFsyN11LZXJtaXQgSG9tZSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4gU09VUkNFIENPREUgUE9SVEFCSUxJVFkgQU5EIFNUWUxFCisKKyAgIEMtS2VybWl0IHdhcyBkZXNpZ25lZCBpbiAxOTg1IGFzIGEgcGxhdGZvcm0taW5kZXBlbmRlbnQgcmVwbGFjZW1lbnQKKyAgIGZvciB0aGUgZWFybGllciBVbml4IEtlcm1pdC4gYy1LZXJtaXQncyBkZXNpZ24gd2FzIGV4cGVjdGVkIHRvIHByb21vdGUKKyAgIHBvcnRhYmlsaXR5LCBhbmQganVkZ2luZyBmcm9tIHRoZSBudW1iZXIgb2YgcGxhdGZvcm1zIHRvIHdoaWNoIGl0IGhhcworICAgYmVlbiBhZGFwdGVkIHNpbmNlIHRoZW4sIHRoZSBtb2RlbCBpcyBlZmZlY3RpdmUsIGlmIG5vdCBpZGVhbAorICAgKG9idmlvdXNseSBpZiB3ZSBoYWQgaXQgYWxsIHRvIGRvIG92ZXIsIHdlJ2QgY2hhbmdlIGEgZmV3IHRoaW5ncykuIFRvCisgICBhbnN3ZXIgdGhlIG9mdC1yZXBlYXRlZCBxdWVzdGlvbjogIldoeSBhcmUgdGhlcmUgc28gbWFueSAjaWZkZWZzPyIsCisgICBpdCdzIGJlY2F1c2U6CisKKyAgICAgKiBNYW55IG9mIHRoZW0gYXJlIHJlbGF0ZWQgdG8gZmVhdHVyZSBzZWxlY3Rpb24gYW5kIHByb2dyYW0gc2l6ZSwKKyAgICAgICBhbmQgc28gbmVlZCB0byBiZSB0aGVyZSBhbnl3YXkuCisgICAgICogVGhvc2UgdGhhdCB0cmVhdCBjb21waWxlciwgbGlicmFyeSwgcGxhdGZvcm0sIGhlYWRlci1maWxlLCBhbmQKKyAgICAgICBzaW1pbGFyIGRpZmZlcmVuY2VzIGhhdmUgYnVpbHQgdXAgb3ZlciB0aW1lIGFzIGh1bmRyZWRzIG9mIHBlb3BsZQorICAgICAgIGFsbCBvdmVyIHRoZSB3b3JsZCBhZGFwdGVkIEMtS2VybWl0IHRvIHRoZWlyIHBhcnRpY3VsYXIKKyAgICAgICBlbnZpcm9ubWVudHMgYW5kIHNlbnQgYmFjayB0aGVpciBjaGFuZ2VzLiBUaGVyZSBtaWdodCBiZSBtb3JlCisgICAgICAgcG9saXRpY2FsbHktY29ycmVjdCB3YXlzIHRvIGFjaGlldmUgcG9ydGFiaWxpdHksIGJ1dCB0aGlzIG9uZSBpcworICAgICAgIG5hdHVyYWwgYW5kIHByb3Zlbi4gVGhlIGJhc2ljIGlkZWEgaXMgdG8gaW50cm9kdWNlIGNoYW5nZXMgdGhhdAorICAgICAgIGNhbiBiZSBzZWxlY3RlZCBieSBkZWZpbmluZyBhIHN5bWJvbCwgd2hpY2gsIGlmIG5vdCBkZWZpbmVkLAorICAgICAgIGxlYXZlcyB0aGUgcHJvZ3JhbSBleGFjdGx5IGFzIGl0IHdhcyBiZWZvcmUgdGhlIGNoYW5nZXMuCisgICAgICogQWx0aG91Z2ggaXQgbWlnaHQgYmUgcG9zc2libGUgdG8gImNsZWFuIHVwIiB0aGUgIiNpZmRlZiBtZXNzIiwKKyAgICAgICBub2JvZHkgaGFzIGFjY2VzcyB0byBhbGwgdGhlIGh1bmRyZWRzIG9mIHBsYXRmb3JtcyBzZXJ2ZWQgYnkgdGhlCisgICAgICAgI2lmZGVmcyB0byBjaGVjayB0aGUgcmVzdWx0cy4KKworICAgQW5kIHRvIGFuc3dlciB0aGUgc2Vjb25kLW1vc3Qtb2Z0LXJlcGVhdGVkIHF1ZXN0aW9uOiAiV2h5IGRvbid0IHlvdQorICAganVzdCB1c2UgR05VIGF1dG9jb25maWcgLyBhdXRvbWFrZSAvIGF1dG93aGF0ZXZlciBpbnN0ZWFkIG9mCisgICBoYXJkLWNvZGluZyBhbGwgdGhvc2UgI2lmZGVmcz8iIEFuc3dlcnM6CisKKyAgICAgKiBUaGUgR05VIHRvb2xzIGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCB0aGUgcGxhdGZvcm1zIHdoZXJlCisgICAgICAgQy1LZXJtaXQgbXVzdCBiZSBidWlsdCBhbmQgSSB3b3VsZG4ndCBuZWNlc3NhcmlseSB0cnVzdCB0aGVtIGlmCisgICAgICAgdGhleSB3ZXJlLgorICAgICAqIEVhY2ggcGxhdGZvcm0gaXMgYSBtb3ZpbmcgdGFyZ2V0LCBzbyB0aGUgdG9vbHMgdGhlbXNlbHZlcyB3b3VsZAorICAgICAgIG5lZWQgdG8gdXBkYXRlZCBiZWZvcmUgS2VybWl0IGNvdWxkIGJlIHVwZGF0ZWQuCisgICAgICogSXQgd291bGQgb25seSBhZGQgYW5vdGhlciBsYXllciBvZiBjb21wbGV4aXR5IHRvIGFuIGFscmVhZHkKKyAgICAgICBjb21wbGV4IHByb2Nlc3MuCisgICAgICogQ29udmVyc2lvbiBhdCB0aGlzIHBvaW50IHdvdWxkIG5vdCBiZSBwcmFjdGljYWwgdW5sZXNzIHRoZXJlIHdhcyBhCisgICAgICAgd2F5IHRvIHRlc3QgdGhlIHJlc3VsdHMgb24gYWxsIHRoZSBodW5kcmVkcyBvZiBwbGF0Zm9ybXMgd2hlcmUKKyAgICAgICBDLUtlcm1pdCBpcyBzdXBwb3NlZCB0byBidWlsZC4KKworICAgV2hlbiB3cml0aW5nIGNvZGUgZm9yIHRoZSBzeXN0ZW0taW5kZW5kZW50IEMtS2VybWl0IG1vZHVsZXMsIHBsZWFzZQorICAgc3RpY2sgdG8gdGhlIGZvbGxvd2luZyBjb2RpbmcgY29udmVudGlvbnMgdG8gZW5zdXJlIHBvcnRhYmlsaXR5IHRvIHRoZQorICAgd2lkZXN0IHBvc3NpYmxlIHZhcmlldHkgb2YgQyBwcmVwcm9jZXNzb3JzLCBjb21waWxlcnMsIGFuZCBsaW5rZXJzLCBhcworICAgd2VsbCBhcyBjZXJ0YWluIG5ldHdvcmsgYW5kL29yIGVtYWlsIHRyYW5zcG9ydHMuIFRoZSBzYW1lIGhvbGRzIHRydWUKKyAgIGZvciBtYW55IG9mIHRoZSAic3lzdGVtIGRlcGVuZGVudCIgbW9kdWxlcyB0b287IHBhcnRpY3VsYXJseSB0aGUgVW5peAorICAgb25lcywgc2luY2UgdGhleSBtdXN0IGJlIGJ1aWxkYWJsZSBieSBhIHdpZGUgdmFyaWV0eSBvZiBjb21waWxlcnMgYW5kCisgICBsaW5rZXJzLCBuZXcgYW5kIG9sZC4KKworICAgVGhpcyBsaXN0IGRvZXMgbm90IHB1cnBvcnQgdG8gYmUgY29tcHJlaGVuc2l2ZSwgYW5kIGFsdGhvdWdoIHNvbWUKKyAgIGl0ZW1zIG9uIGl0IG1pZ2h0IHNlZW0gZmFyLWZldGNoZWQsIHRoZXkgd291bGQgbm90IGJlIGxpc3RlZCB1bmxlc3MgSQorICAgaGFkIGVuY291bnRlcmVkIHRoZW0gc29tZXdoZXJlLCBzb21lIHRpbWUuIEkgd2lzaCBJIGhhZCBrZXB0IGJldHRlcgorICAgcmVjb3JkcyBzbyBJIGNvdWxkIGNpdGUgc3BlY2lmaWMgcGxhdGZvcm1zIGFuZCBjb21waWxlcnMuCisKKyAgICAgKiBUcnkgdG8ga2VlcCB2YXJpYWJsZSBhbmQgZnVuY3Rpb24gbmFtZXMgdW5pcXVlIHdpdGhpbiA2CisgICAgICAgY2hhcmFjdGVycywgZXNwZWNpYWxseSBpZiB0aGV5IGFyZSB1c2VkIGFjcm9zcyBtb2R1bGVzLCBzaW5jZSA2IGlzCisgICAgICAgdGhlIG1heGltdW0gZm9yIHNvbWUgb2xkIGxpbmtlcnMgKGFjdHVhbGx5LCB0aGlzIGdvZXMgYmFjayB0bworICAgICAgIFRPUFMtMTAgYW5kIC0yMCBhbmQgb3RoZXIgb2xkIERFQyBPUydzIHdoZXJlIEMtS2VybWl0IG5ldmVyIHJhbgorICAgICAgIGFueXdheTsgYSBtb3JlIHJlYWxpc3RpYyBtYXhpbXVtIGlzIHByb2JhYmx5IHNvbWV3aGVyZSBiZXR3ZWVuIDgKKyAgICAgICBhbmQgMTYpLiBXZSBrbm93IGZvciBjZXJ0YWluIHRoYXQgVkFYIEMgaGFzIGEgMzEtY2hhcmFjdGVyIG1heAorICAgICAgIGJlY2F1c2UgaXQgY29tcGxhaW5zIC0tIG90aGVycyBtaWdodCBub3QgY29tcGxhaW4sIGJ1dCBqdXN0CisgICAgICAgc2lsZW50bHkgdHJ1bmNhdGUsIHRodXMgZm9sZGluZyB0d28gb3IgbW9yZSByb3V0aW5lcy92YXJpYWJsZXMKKyAgICAgICBpbnRvIG9uZS4KKyAgICAgKiBLZWVwIHByZXByb2Nlc3NvciBzeW1ib2xzIHVuaXF1ZSB3aXRoaW4gOCBjaGFyYWN0ZXJzOyB0aGF0J3MgdGhlCisgICAgICAgbWF4IGZvciBzb21lIHByZXByb2Nlc3NvcnMgKHNvcnJ5LCBJIGNhbid0IGdpdmUgYSBzcGVjaWZpYworICAgICAgIGV4YW1wbGUsIGJ1dCBpbiAxOTg4IG9yIHRoZXJlYWJvdXRzLCBJIGhhZCB0byBjaGFuZ2UgY2hhcmFjdGVyLXNldAorICAgICAgIHN5bWJvbHMgbGlrZSBUQ19MQVRJTjEgYW5kIFRDX0xBVElOMiB0byBUQ18xTEFUSU4gYW5kIFRDXzJMQVRJTgorICAgICAgIGJlY2F1c2UgdGhlIGRpZ2l0cyB3ZXJlIGJlaW5nIHRydW5jYXRlZCBhbmQgaWdub3JlZCBvbiBhIHBsYXRmb3JtCisgICAgICAgd2hlcmUgSSBhY3R1YWxseSBoYWQgdG8gYnVpbGQgQy1LZXJtaXQgNUE7IHVuZm9ydHVuYXRlbHkgSSBkaWRuJ3QKKyAgICAgICBub3RlIHdoaWNoIHBsYXRmb3JtIC0tIG1heWJlIHNvbWUgZWFybHkgVWx0cml4IHZlcnNpb24/KQorICAgICAqIERvbid0IGNyZWF0ZSBwcmVwcm9jZXNzb3Igc3ltYm9scywgb3IgdmFyaWFibGUgb3IgZnVuY3Rpb24gbmFtZXMsCisgICAgICAgdGhhdCBzdGFydCB3aXRoIHVuZGVyc2NvcmUgKF8pLiBUaGVzZSBhcmUgdXN1YWxseSByZXNlcnZlZCBmb3IKKyAgICAgICBpbnRlcm5hbCB1c2UgYnkgdGhlIGNvbXBpbGVyIGFuZCBoZWFkZXIgZmlsZXMuCisgICAgICogRG9uJ3QgcHV0ICNpbmNsdWRlIGRpcmVjdGl2ZXMgaW5zaWRlIGZ1bmN0aW9ucyBvciB7IGJsb2NrcyB9LgorICAgICAqIERvbid0IHVzZSB0aGUgI2lmIG9yICNlbGlmIHByZXByb2Nlc3NvciBjb25zdHJ1Y3Rpb25zLCBvbmx5IHVzZQorICAgICAgICNpZmRlZiwgI2lmbmRlZiwgI2RlZmluZSwgI3VuZGVmLCBhbmQgI2VuZGlmLgorICAgICAqIFB1dCB0b2tlbnMgYWZ0ZXIgI2VuZGlmIGluIGNvbW1lbnQgYnJhY2tldHMsIGUuZy4KKyAgICAgICAjZW5kaWYgLyogRk9PICovLgorICAgICAqIERvbid0IGluZGVudCBwcmVwcm9jZXNzb3Igc3RhdGVtZW50cyAtICMgbXVzdCBhbHdheXMgYmUgZmlyc3QgY2hhcgorICAgICAgIG9uIGxpbmUuCisgICAgICogRG9uJ3QgcHV0IHdoaXRlc3BhY2UgYWZ0ZXIgIyBpbiBwcmVwcm9jZXNzb3Igc3RhdGVtZW50cy4KKyAgICAgKiBEb24ndCB1c2UgI3ByYWdtYSwgZXZlbiB3aXRoaW4gI2lmZGVmcyAtLSBpdCBtYWtlcyBzb21lCisgICAgICAgcHJlcHJvY2Vzc29ycyBnaXZlIHVwLgorICAgICAqIFNhbWUgZ29lcyBmb3IgI21vZHVsZSwgI2lmLCBldGMgLSAjaWZkZWZzIGRvIE5PVCBwcm90ZWN0IHRoZW0uCisgICAgICogRG9uJ3QgdXNlIGxvZ2ljYWwgb3BlcmF0b3JzIGluIHByZXByb2Nlc3NvciBjb25zdHJ1Y3Rpb25zLgorICAgICAqIEF2b2lkICNpZmRlZnMgaW5zaWRlIGFyZ3VtZW50IGxpc3QgdG8gZnVuY3Rpb24gY2FsbHMgKEkgY2FuJ3QKKyAgICAgICByZW1lbWJlciB3aHkgdGhpcyBvbmUgaXMgaGVyZSwgYnV0IHByb2JhYmx5IG5lZWRuJ3QgYmU7IHdlIGRvIHRoaXMKKyAgICAgICBhbGwgdGhlIHRpbWUpLgorICAgICAqIEFsd2F5cyBjYXN0IHN0cmxlbigpIGluIGV4cHJlc3Npb25zIHRvIGludDoKKyAgICAgICBpZiAoKGludClzdHJsZW4oZm9vKSA8IHgpLi4uCisgICAgICogQW55IHZhcmlhYmxlIHdob3NlIHZhbHVlIG1pZ2h0IGV4Y2VlZCAxNjM4MyBzaG91bGQgYmUgZGVjbGFyZWQgYXMKKyAgICAgICBsb25nLCBvciBpZiB0aGF0IGlzIG5vdCBwb3NzaWJsZSwgdGhlbiBhcyB1bnNpZ25lZC4KKyAgICAgKiBBdm9pZCB0eXBlZGVmczsgdGhleSBtaWdodCBiZSBwb3J0YWJsZSBidXQgdGhleSBhcmUgdmVyeSBjb25mdXNpbmcKKyAgICAgICBhbmQgdGhlcmUncyBubyB3YXkgdG8gdGVzdCBmb3IgdGhlaXIgcHJlc2VuY2Ugb3IgYWJzZW5jZSBhdAorICAgICAgIGNvbXBpbGUgdGltZS4gVXNlIHByZXByb2Nlc3NvciBzeW1ib2xzIGluc3RlYWQgaWYgcG9zc2libGU7IGF0CisgICAgICAgbGVhc3QgeW91IGNhbiB0ZXN0IHRoZWlyIGRlZmluaXRpb25zLgorICAgICAqIFVuc2lnbmVkIGxvbmcgaXMgbm90IHBvcnRhYmxlOyB1c2UgYSBwcmVwcm9jZXNzb3Igc3ltYm9sIChLZXJtaXQKKyAgICAgICB1c2VzIFVMT05HIGZvciB0aGlzKS4KKyAgICAgKiBMb25nIGxvbmcgaXMgbm90IHBvcnRhYmxlLiBJZiB5b3UgcmVhbGx5IG5lZWQgaXQsIGJlIGNyZWF0aXZlLgorICAgICAqIFNpbWlsYXJseSAxMjM0TEwgaXMgbm90IHBvcnRhYmxlLCBub3IgYWxtb3N0IGFueSBvdGhlciBjb25zdGFudAorICAgICAgIG1vZGlmaWVyIG90aGVyIHRoYW4gTC4KKyAgICAgKiBVbnNpZ25lZCBjaGFyIGlzIG5vdCBwb3J0YWJsZSwgdXNlIENIQVIgKGEgcHJlcHJvY2Vzc29yIHN5bWJvbAorICAgICAgIGRlZmluZWQgaW4gdGhlIEtlcm1pdCBoZWFkZXIgZmlsZXMpIGFuZCBhbHdheXMgdGFrZSBwcmVjYXV0aW9ucworICAgICAgIGFnYWluc3QgY2hhcmFjdGVyIHNpZ25hZ2UgKG1vcmUgYWJvdXQgdGhpcyBbMjhdYmVsb3cpLgorICAgICAqIERvbid0IHVzZSBpbml0aWFsaXplcnMgd2l0aCBhdXRvbWF0aWMgYXJyYXlzIG9yIHN0cnVjdHM6IGl0J3Mgbm90CisgICAgICAgcG9ydGFibGUuCisgICAgICogRG9uJ3QgdXNlIGJpZyBhdXRvbWF0aWMgYXJyYXlzIG9yIHN0cnVjdHMgaW4gZnVuY3Rpb25zIHRoYXQgbWlnaHQKKyAgICAgICBiZSBjYWxsZWQgcmVjdXJzaXZlbHk7IHNvbWUgcGxhdGZvcm1zIGhhdmUgZml4ZWQtc2l6ZSBzdGFja3MgKGUuZy4KKyAgICAgICBXaW5kb3dzIDl4OiAyNTZLKSBhbmQgcmVjdXJzaXZlIGZ1bmN0aW9ucyBjcmFzaCB3aXRoIHN0YWNrCisgICAgICAgb3ZlcmZsb3cuIEV2ZW4gd2hlbiB0aGVyZSBpcyBub3QgYSBjb21waWxlciBsaW1pdGF0aW9uLCB0aGlzCisgICAgICAgY2F1c2VzIG1lbW9yeSB0byBiZSBjb25zdW1lZCB3aXRob3V0IGJvdW5kLCBhbmQgY2FuIGVuZCB1cCBmaWxsaW5nCisgICAgICAgc3dhcCBzcGFjZS4KKyAgICAgKiBEb24ndCBhc3N1bWUgdGhhdCBzdHJ1Y3QgYXNzaWdubWVudCBwZXJmb3JtcyBhIGNvcHksIG9yIHRoYXQgaXQKKyAgICAgICBldmVuIGV4aXN0cy4KKyAgICAgKiBEb24ndCB1c2Ugc2l6ZW9mIHRvIGdldCB0aGUgc2l6ZSBvZiBhbiBhcnJheTsgc29tZW9uZSBtaWdodCBjb21lCisgICAgICAgYWxvbmcgbGF0ZXIgYW5kIGFuZCBjaGFuZ2UgaXQgZnJvbSBzdGF0aWMgdG8gbWFsbG9jJ2QuIEFsd2F5cyB1c2UKKyAgICAgICBhIHN5bWJvbCB0byByZWZlciB0byB0aGUgYXJyYXkncyBzaXplLgorICAgICAqIERvbid0IHB1dCBwcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zIGludG8gaGVhZGVyIGZpbGVzIHRoYXQKKyAgICAgICBhcmUgdXNlZCBieSBtb2R1bGVzIHRoYXQgZG9uJ3QgY29udGFpbiB0aGF0IGZ1bmN0aW9uOyB0aGUgbGluaworICAgICAgIHN0ZXAgY2FuIGZhaWwgd2l0aCB1bnJlc29sdmVkIHJlZmVyZW5jZXMgKGUuZy4gb24gQU9TL1ZTKS4KKyAgICAgKiBBdm9pZCB0aGUgY29uc3RydWN0aW9uICorK3AgKHRoZSBvcmRlciBvZiBldmFsdWF0aW9uIHZhcmllczsgaXQKKyAgICAgICBzaG91bGRuJ3QgYnV0IGF0IGxlYXN0IG9uZSBjb21waWxlciBoYWQgYSBidWcgdGhhdCBtYWRlIG1lIGluY2x1ZGUKKyAgICAgICB0aGlzIGl0ZW0pLgorICAgICAqIERvbid0IHVzZSB0cmlwbGUgYXNzaWdubWVudHMsIGxpa2UgYSA9IGIgPSBjID0gMDsgKG9yIHF1YWRydXBsZSwKKyAgICAgICBldGMpLiBTb21lIGNvbXBpbGVycyBnZW5lcmF0ZSBiYWQgY29kZSBmb3IgdGhlc2UsIG9yIGNyYXNoLCBldGMKKyAgICAgICAoc29tZSB2ZXJzaW9uIG9mIERFQyBDIGFzIEkgcmVjYWxsKS4KKyAgICAgKiBTb21lIGNvbXBpbGVycyBkb24ndCBhbGxvdyBzdHJ1Y3R1cmUgbWVtYmVycyB0byBoYXZlIHRoZSBzYW1lCisgICAgICAgbmFtZXMgYXMgb3RoZXIgaWRlbnRpZmllcnMuIFRyeSB0byBnaXZlIHN0cnVjdHVyZSBtZW1iZXJzIHVuaXF1ZQorICAgICAgIG5hbWVzLgorICAgICAqIERvbid0IGFzc3VtZSBhbnl0aGluZyBhYm91dCBvcmRlciBvZiBldmFsdWF0aW9uIGluIGJvb2xlYW4KKyAgICAgICBleHByZXNzaW9ucywgb3IgdGhhdCB0aGV5IHdpbGwgc3RvcCBlYXJseSBpZiBhIHJlcXVpcmVkIGNvbmRpdGlvbgorICAgICAgIGlzIG5vdCB0cnVlLCBlLmcuOgorICBpZiAoaSA+IDAgJiYgcFtpLTFdID09IGJsYWgpCisgICAgICAgY2FuIHN0aWxsIGR1bXAgY29yZSBpZiBpID09IDAgKGhvcGVmdWxseSB0aGlzIGlzIG5vdCB0cnVlIG9mIGFueQorICAgICAgIG1vZGVybiBjb21waWxlciwgYnV0IEkgd291bGQgbm90IGhhdmUgc2FpZCB0aGlzIGlmIGl0IGRpZCBub3QKKyAgICAgICBhY3R1YWxseSBoYXBwZW4gc29tZXdoZXJlKS4KKyAgICAgKiBEb24ndCBoYXZlIGEgc3dpdGNoKCkgc3RhdGVtZW50IHdpdGggbm8gY2FzZXMgKGUuZy4gYmVjYXVzZSBvZgorICAgICAgICNpZmRlZnMpOyB0aGlzIGlzIGEgZmF0YWwgZXJyb3IgaW4gc29tZSBjb21waWxlcnMuCisgICAgICogRG9uJ3QgcHV0IGxvdHMgb2YgY29kZSBpbiBhIHN3aXRjaCBjYXNlOyBtb3ZlIGl0IG91dCB0byBhIHNlcGFyYXRlCisgICAgICAgZnVuY3Rpb247IHNvbWUgY29tcGlsZXJzIHJ1biBvdXQgb2YgbWVtb3J5IHdoZW4gcHJlc2VudGVkIHdpdGggYQorICAgICAgIGh1Z2Ugc3dpdGNoKCkgc3RhdGVtZW50IC0tIGl0J3Mgbm90IHRoZSBudW1iZXIgb2YgY2FzZXMgdGhhdAorICAgICAgIG1hdHRlcnM7IGl0J3MgdGhlIG92ZXJhbGwgYW1vdW50IG9mIGNvZGUuCisgICAgICogU29tZSBjb21waWxlcnMgbWlnaHQgYWxzbyBsaW1pdCB0aGUgbnVtYmVyIG9mIHN3aXRjaCgpIGNhc2VzLCBlLmcuCisgICAgICAgdG8gMjU0LgorICAgICAqIERvbid0IHB1dCBhbnl0aGluZyBiZXR3ZWVuICJzd2l0Y2goKSB7IiBhbmQgImNhc2U6IiAtLSBzd2l0Y2gKKyAgICAgICBibG9ja3MgYXJlIG5vdCBsaWtlIG90aGVyIGJsb2Nrcy4KKyAgICAgKiBEb24ndCBqdW1wIGludG8gb3Igb3V0IG9mIHN3aXRjaGVzLgorICAgICAqIERvbid0IG1ha2UgY2hhcmFjdGVyLXN0cmluZyBjb25zdGFudHMgbG9uZ2VyIHRoYW4gYWJvdXQgMjUwIGJ5dGVzLgorICAgICAgIExvbmdlciBzdHJpbmdzIHNob3VsZCBiZSBicm9rZW4gdXAgaW50byBhcnJheXMgb2Ygc3RyaW5ncy4KKyAgICAgKiBEb24ndCB3cml0ZSBpbnRvIGNoYXJhY3Rlci1zdHJpbmcgY29uc3RhbnRzIChvYnZpb3VzbHkpLiBFdmVuIHdoZW4KKyAgICAgICB5b3Uga25vdyB5b3UgYXJlIG5vdCB3cml0aW5nIHBhc3QgdGhlIGVuZDsgdGhlIGNvbXBpbGVyIG9yIGxpbmtlcgorICAgICAgIG1pZ2h0IGhhdmUgcHV0IHRoZW0gaW50byByZWFkLW9ubHkgYW5kL29yIHNoYXJlZCBtZW1vcnksIGFuZC9vcgorICAgICAgIGNvYWxlc2NlZCBtdWx0aXBsZSBlcXVhbCBjb25zdGFudHMgc28gaWYgeW91IGNoYW5nZSBvbmUgeW91IGNoYW5nZQorICAgICAgIHRoZW0gYWxsLgorICAgICAqIERvbid0IGRlcGVuZCBvbiAnXHInIGJlaW5nIGNhcnJpYWdlIHJldHVybi4KKyAgICAgKiBEb24ndCBkZXBlbmQgb24gJ1xuJyBiZWluZyBsaW5lZmVlZCBvciBmb3IgdGhhdCBtYXR0ZXIgYW55IFNJTkdMRQorICAgICAgIGNoYXJhY3Rlci4KKyAgICAgKiBEb24ndCBkZXBlbmQgb24gJ1xyJyBhbmQgJ1xuJyBiZWluZyBkaWZmZXJlbnQgKGUuZy4gYXMgc2VwYXJhdGUKKyAgICAgICBzd2l0Y2goKSBjYXNlcykuCisgICAgICogSW4gb3RoZXIgd29yZHMsIGRvbid0IHVzZSBcbiBvciBcciB0byBzdGFuZCBmb3Igc3BlY2lmaWMKKyAgICAgICBjaGFyYWN0ZXJzOyB1c2UgXDAxMiBhbmQgXDAxNSBpbnN0ZWFkLgorICAgICAqIERvbid0IGNvZGUgZm9yICJidXp6d29yZCAxLjAgY29tcGxpYW5jZSIsIHVubGVzcyAiYnV6endvcmQiIGlzIEsmUgorICAgICAgIGFuZCAiMS4wIiBpcyB0aGUgZmlyc3QgZWRpdGlvbi4KKyAgICAgKiBEb24ndCB1c2Ugb3IgZGVwZW5kIG9uIGFueXRoaW5nX3QgKHNpemVfdCwgcGlkX3QsIGV0YyksIGV4Y2VwdAorICAgICAgIHRpbWVfdCwgd2l0aG91dCAjaWZkZWYgcHJvdGVjdGlvbiAodGltZV90IGlzIHRoZSBvbmx5IG9uZSBJJ3ZlCisgICAgICAgZm91bmQgdGhhdCBpcyBhY2NlcHRlZCBldmVyeXdoZXJlKS4gVGhpcyBpcyBhIHRvdWdoIG9uZSBiZWNhdXNlCisgICAgICAgdGhlIHNhbWUgZnVuY3Rpb24gbWlnaHQgcmVxdWlyZSAoc2F5KSBhIHNpemVfdCBhcmcgb24gb25lCisgICAgICAgcGxhdGZvcm0sIHdoZXJlYXMgc2l6ZV90IGlzIHVuaGVhcmQgb2Ygb24gYW5vdGhlcjsgb3Igd29yc2UsIGl0CisgICAgICAgbWlnaHQgcmVxdWlyZSBhIHRvdGFsbHkgZGlmZmVyZW50IGRhdGEgdHlwZSwgbGlrZSBpbnQgb3IgbG9uZyBvcgorICAgICAgIHNvbWUgb3RoZXIgdHlwZWRlZidkIHRoaW5nLiBJdCBoYXMgb2Z0ZW4gcHJvdmVkIG5lY2Vzc2FyeSB0bworICAgICAgIGRlZmluZSBhIHN5bWJvbCB0byBzdGFuZCBmb3IgdGhlIHR5cGUgb2YgYSBwYXJ0aWN1bGFyIGFyZ3VtZW50IHRvCisgICAgICAgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgb3Igc3lzdGVtIGZ1bmN0aW9uIHRvIGdldCBhcm91bmQgdGhpcworICAgICAgIHByb2JsZW0uCisgICAgICogRG9uJ3QgdXNlIG9yIGRlcGVuZCBvbiBpbnRlcm5hdGlvbmFsaXphdGlvbiAoImkxOG4iKSBmZWF0dXJlcywKKyAgICAgICB3Y2hhcl90LCBsb2NhbGVzLCBldGMsIGluIHBvcnRhYmxlIGNvZGU7IHRoZXkgYXJlIG5vdCBwb3J0YWJsZS4KKyAgICAgICBBbnl3YXksIGxvY2FsZXMgYXJlIG5vdCB0aGUgcmlnaHQgbW9kZWwgZm9yIEtlcm1pdCdzCisgICAgICAgbXVsdGktY2hhcmFjdGVyLXNldCBzdXBwb3J0LiBLZXJtaXQgZG9lcyBhbGwgY2hhcmFjdGVyLXNldAorICAgICAgIGNvbnZlcnNpb24gaXRzZWxmIGFuZCBkb2VzIG5vdCB1c2UgYW55IGV4dGVybmFsIGxpYnJhcmllcyBvcgorICAgICAgIGZ1bmN0aW9ucy4KKyAgICAgKiBJbiBwYXJ0aWN1bGFyLCBkb24ndCB1c2UgYW55IGxpYnJhcnkgZnVuY3Rpb25zIHRoYXQgZGVhbCB3aXRoIHdpZGUKKyAgICAgICBjaGFyYWN0ZXJzIG9yIFVuaWNvZGUgaW4gYW55IGZvcm0uIFRoZXNlIGFyZSBub3Qgb25seSBub25wb3J0YWJsZSwKKyAgICAgICBidXQgYSBjb25zdGFudGx5IHNoaWZ0aW5nIHRhcmdldCAoZS5nLiB0aGUgb25lcyBpbiBnbGliYykuCisgICAgICogRG9uJ3QgbWFrZSBhbnkgYXNzdW1wdGlvbiBhYm91dCBzaWduYWwgaGFuZGxlciB0eXBlLiBJdCBjYW4gYmUKKyAgICAgICB2b2lkLCBpbnQsIGxvbmcsIG9yIGFueXRoaW5nIGVsc2UuIEFsd2F5cyBkZWNsYXJlIHNpZ25hbCBoYW5kbGVycworICAgICAgIGFzIFNJR1RZUCAoc2VlIGRlZmluaXRpb24gaW4gY2tjZGViLmggYW5kIGF1Z21lbnQgaXQgaWYgbmVjZXNzYXJ5KQorICAgICAgIGFuZCBhbHdheXMgdXNlIFNJR1JFVFVSTiBhdCBleGl0IHBvaW50cyBmcm9tIHNpZ25hbCBoYW5kbGVycy4KKyAgICAgKiBTaWduYWxzIHNob3VsZCBhbHdheXMgYmUgcmUtYXJtZWQgdG8gYmUgdXNlZCBhZ2FpbiAodGhpcyBiYXJlbHkKKyAgICAgICBzY3JhdGNoZXMgdGhlIHN1cmZhY2UgLS0gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gQlNEL1Y3IGFuZCBTeXN0ZW0KKyAgICAgICBWIGFuZCBQT1NJWCBzaWduYWwgaGFuZGxpbmcgYXJlIG51bWVyb3VzLCBhbmQgc29tZSBwbGF0Zm9ybXMgZG8KKyAgICAgICBub3QgZXZlbiBzdXBwb3J0IHNpZ25hbHMsIGFsYXJtcywgb3IgbG9uZ2ptcHMgY29ycmVjdGx5IG9yIGF0IGFsbAorICAgICAgIC0tIGF2b2lkIGFsbCBvZiB0aGlzIGlmIHlvdSBjYW4pLgorICAgICAqIE9uIHRoZSBvdGhlciBoYW5kLCBkb24ndCBhc3N1bWUgdGhhdCBzaWduYWxzIGFyZSBkaXNhcm1lZCBhZnRlcgorICAgICAgIGJlaW5nIHJhaXNlZC4gSW4gc29tZSBwbGF0Zm9ybXMgeW91IGhhdmUgdG8gcmUtYXJtIHRoZW0sIGluIG90aGVycworICAgICAgIHRoZXkgc3RheSBhcm1lZC4KKyAgICAgKiBEb24ndCBjYWxsIG1hbGxvYygpIGFuZCBmcmllbmRzIGZyb20gYSBzaWduYWwgaGFuZGxlcjsgZG9uJ3QgZG8KKyAgICAgICBhbnl0aGluZyBidXQgc2V0dGluZyBpbnRlZ2VyIGdsb2JhbCB2YXJpYWJsZXMgaW4gYSBzaWduYWwgaGFuZGxlci4KKyAgICAgKiBtYWxsb2MoKSBkb2VzIG5vdCBpbml0aWFsaXplIGFsbG9jYXRlZCBtZW1vcnkgLS0gaXQgbmV2ZXIgc2FpZCBpdAorICAgICAgIGRpZC4gRG9uJ3QgZXhwZWN0IGl0IHRvIGJlIGFsbCAwJ3MuCisgICAgICogRGlkIFlvdSBLbm93OiBtYWxsb2MoKSBjYW4gc3VjY2VlZCBhbmQgdGhlIHByb2dyYW0gY2FuIHN0aWxsIGR1bXAKKyAgICAgICBjb3JlIGxhdGVyIHdoZW4gaXQgYXR0ZW1wdHMgdG8gdXNlIHRoZSBtYWxsb2MnZCBtZW1vcnk/IChUaGlzCisgICAgICAgaGFwcGVucyB3aGVuIGFsbG9jYXRpb24gaXMgZGVmZXJyZWQgdW50aWwgdXNlIGFuZCBzd2FwIHNwYWNlIGlzCisgICAgICAgZnVsbC4pCisgICAgICogbWVtc2V0KCksIG1lbW1vdmUoKSwgYW5kIG1lbWNweSgpIGFyZSBub3QgcG9ydGFibGUsIGRvbid0IHVzZSB0aGVtCisgICAgICAgd2l0aG91dCBwcm90ZWN0aW5nIHRoZW0gaW4gaWZkZWZzICh3ZSBoYXZlIFVTRV9NRU1DUFkgZm9yIHRoaXMpLgorICAgICAgIGJ6ZXJvKCkvYmNvcHkoKSB0b28sIGV4Y2VwdCB3ZSdyZSBndWFyYW50ZWVkIHRvIGhhdmUKKyAgICAgICBiemVybygpL2Jjb3B5KCkgd2hlbiB1c2luZyB0aGUgc29ja2V0cyBsaWJyYXJ5IChub3QgcmVhbGx5KS4gU2VlCisgICAgICAgZXhhbXBsZXMgaW4gdGhlIHNvdXJjZS4KKyAgICAgKiBEb24ndCBhc3N1bWUgdGhhdCBzdHJuY3B5KCkgc3RvcHMgb24gdGhlIGZpcnN0IG51bGwgYnl0ZSAtLSBtb3N0CisgICAgICAgdmVyc2lvbnMgYWx3YXlzIGNvcHkgdGhlIG51bWJlciBvZiBieXRlcyBnaXZlbiBpbiBhcmcgMywgcGFkZGluZworICAgICAgIG91dCB3aXRoIDAncyBhbmQgb3ZlcndyaXRpbmcgd2hhdGV2ZXIgd2FzIHRoZXJlIGJlZm9yZS4gVXNlCisgICAgICAgQy1LZXJtaXQgY2tzdHJuY3B5KCkgaWYgeW91IHdhbnQgcHJlZGljdGFibGUgbm9uLXBhZGRpbmcgYmVoYXZpb3IsCisgICAgICAgZ3VhcmFudGVlZCBOVUwtdGVybWluYXRpb24sIGFuZCBhIHVzZWZ1bCByZXR1cm4gY29kZS4KKyAgICAgKiBESUQgWU9VIEtOT1cuLiB0aGF0IHNvbWUgdmVyc2lvbnMgb2YgaW5ldF9ibGFoKCkgcm91dGluZXMgcmV0dXJuCisgICAgICAgSVAgYWRkcmVzc2VzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciwgd2hpbGUgb3RoZXJzIHJldHVybiB0aGVtIGxvY2FsCisgICAgICAgbWFjaGluZSBieXRlIG9yZGVyPyBTbyBwYXNzaW5nIHRoZW0gdG8gbnRvaHMoKSBvciB3aGF0ZXZlciBpcyBub3QKKyAgICAgICBhbHdheXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLgorICAgICAqIERvbid0IHVzZSBBTlNJLWZvcm1hdCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgd2l0aG91dCAjaWZkZWYKKyAgICAgICBDS19BTlNJQywgYW5kIGFsd2F5cyBwcm92aWRlIGFuICNlbHNlIGZvciB0aGUgbm9uLUFOU0kgY2FzZS4KKyAgICAgKiBVc2UgdGhlIEtlcm1pdCBfUFJPVE9UWVAoKSBtYWNybyBmb3IgZGVjbGFyaW5nIGZ1bmN0aW9uCisgICAgICAgcHJvdG90eXBlczsgaXQgd29ya3MgaW4gYm90aCB0aGUgQU5TSSBhbmQgbm9uLUFOU0kgY2FzZXMuCisgICAgICogRG9uJ3QgZGVwZW5kIG9uIGFueSBvdGhlciBBTlNJIHByZXByb2Nlc3NvciBmZWF0dXJlcyBsaWtlCisgICAgICAgInBhc3RpbmciIC0tIHRoZXkgYXJlIG9mdGVuIG1pc3Npbmcgb3Igbm9ub3BlcmF0aW9uYWwuCisgICAgICogRG9uJ3QgYXNzdW1lIGFueSBDKysgc3ludGF4IG9yIHNlbWFudGljcy4KKyAgICAgKiBEb24ndCB1c2UgLy8gYXMgYSBjb21tZW50IGludHJvZHVjZXIuIEMgaXMgbm90IEMrKy4KKyAgICAgKiBEb24ndCBkZWNsYXJlIGEgc3RyaW5nIGFzICJjaGFyIGZvb1tdIiBpbiBvbmUgbW9kdWxlIGFuZCAiZXh0ZXJuCisgICAgICAgY2hhciAqIGZvbyIgaW4gYW5vdGhlciwgb3IgdmljZS12ZXJzYTogdGhpcyBjYXVzZXMgY29yZSBkdW1wcy4KKyAgICAgKiBXaXRoIGNvbXBpbGVyIG1ha2VycyBmYWxsaW5nIGFsbCBvdmVyIHRoZW1zZWx2ZXMgdHJ5aW5nIHRvIG91dGRvCisgICAgICAgZWFjaCBvdGhlciBpbiBBTlNJIHN0cmljdG5lc3MsIGl0IGhhcyBiZWNvbWUgaW5jcmVhc2luZ2x5CisgICAgICAgbmVjZXNzYXJ5IHRvIGNhc3QgRVZFUllUSElORy4gVGhpcyBpcyBpbmNyZWFzaW5nbHkgdHJ1ZSBmb3IgY2hhcgorICAgICAgIHZzIHVuc2lnbmVkIGNoYXIuIFdlIG5lZWQgdG8gdXNlIHVuc2lnbmVkIGNoYXJzIGlmIHdlIHdhbnQgdG8gZGVhbAorICAgICAgIHdpdGggOC1iaXQgY2hhcmFjdGVyIHNldHMsIGJ1dCBtb3N0IGNoYXJhY3Rlci0gYW5kIHN0cmluZy1vcmllbnRlZAorICAgICAgIEFQSXMgd2FudCAoc2lnbmVkKSBjaGFyIGFyZ3VtZW50cywgc28gZXhwbGljaXQgY2FzdHMgYXJlCisgICAgICAgbmVjZXNzYXJ5LiBJdCB3b3VsZCBiZSBuaWNlIGlmIGV2ZXJ5IGNvbXBpbGVyIGhhZCBhCisgICAgICAgLWZ1bnNpZ25lZC1jaGFyIG9wdGlvbiAoYXMgZ2NjIGRvZXMpLCBidXQgdGhleSBkb24ndC4KKyAgICAgKiBhW3hdLCB3aGVyZSB4IGlzIGFuIHVuc2lnbmVkIGNoYXIsIGNhbiBwcm9kdWNlIGEgd2lsZCBtZW1vcnkKKyAgICAgICByZWZlcmVuY2UgaWYgeCwgd2hlbiBwcm9tb3RlZCB0byBhbiBpbnQsIGJlY29tZXMgbmVnYXRpdmUuIENhc3QgaXQKKyAgICAgICB0byAodW5zaWduZWQpLCBldmVuIHRob3VnaCBpdCBBTFJFQURZIElTIHVuc2lnbmVkLgorICAgICAqIEJlIGNhcmVmdWwgaG93IHlvdSBkZWNsYXJlIGZ1bmN0aW9ucyB0aGF0IGhhdmUgY2hhciBvciBsb25nCisgICAgICAgYXJndW1lbnRzOyBmb3IgQU5TSSBjb21waWxlcnMgeW91IE1VU1QgdXNlIEFOU0kgZGVjbGFyYXRpb25zIHRvCisgICAgICAgYXZvaWQgcHJvbW90aW9uIHByb2JsZW1zLCBidXQgeW91IGNhbid0IHVzZSBBTlNJIGRlY2xhcmF0aW9ucyB3aXRoCisgICAgICAgbm9uLUFOU0kgY29tcGlsZXJzLiBUaHVzIGRlY2xhcmF0aW9ucyBvZiBzdWNoIGZ1bmN0aW9ucyBtdXN0IGJlCisgICAgICAgaGlkZW91c2x5IGVudHdpbmVkIGluICNpZmRlZnMuIEV4YW1wbGU6IGxhdHRlcjoKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgUHV0IGNoYXJhY3RlciBpbiBzZXJ2ZXIgY29tbWFuZCBidWZmZXIgICovCisgICNpZmRlZiBDS19BTlNJQworICBwdXRzcnYoY2hhciBjKQorICAjZWxzZQorICBwdXRzcnYoYykgY2hhciBjOworICAjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyAgLyogcHV0c3J2ICovIHsKKyAgICAgICpzcnZwdHIrKyA9IGM7CisgICAgICAqc3J2cHRyID0gJ1wwJzsgICAgICAgICAgIC8qIE1ha2Ugc3VyZSBidWZmZXIgaXMgbnVsbC10ZXJtaW5hdGVkICovCisgICAgICByZXR1cm4oMCk7CisgIH0KKyAgICAgKiBCZSBjYXJlZnVsIGhvdyB5b3UgcmV0dXJuIGNoYXJhY3RlcnMgZnJvbSBmdW5jdGlvbnMgdGhhdCByZXR1cm4KKyAgICAgICBpbnQgdmFsdWVzIC0tICJnZXRjLWxpa2UgZnVuY3Rpb25zIiAtLSBpbiB0aGUgQU5TSSB3b3JsZC4gVW5sZXNzCisgICAgICAgeW91IGV4cGxpY2l0bHkgY2FzdCB0aGUgcmV0dXJuIHZhbHVlIHRvICh1bnNpZ25lZCksIGl0IGlzIGxpa2VseQorICAgICAgIHRvIGJlICJwcm9tb3RlZCIgdG8gYW4gaW50IGFuZCBoYXZlIGl0cyBzaWduIGV4dGVuZGVkLgorICAgICAqIEF0IGxlYXN0IG9uZSBjb21waWxlciAodGhlIG9uZSBvbiBERUMgT1NGLzEgMS4zKSB0cmVhdHMgIi8qIiBhbmQKKyAgICAgICAiKi8iIHdpdGhpbiBzdHJpbmcgY29uc3RhbnRzIGFzIGNvbW1lbnQgYmVnaW4gYW5kIGVuZC4gTm8gYW1vdW50CisgICAgICAgb2YgI2lmZGVmcyB3aWxsIGdldCBhcm91bmQgdGhpcyBvbmUuIFlvdSBzaW1wbHkgY2FuJ3QgcHV0IHRoZXNlCisgICAgICAgc2VxdWVuY2VzIGluIGEgc3RyaW5nIGNvbnN0YW50LCBlLmcuICIvdXNyL2xvY2FsL2RvYy8qLioiLgorICAgICAqIEF2b2lkIHB1dHRpbmcgbXVsdGlwbGUgbWFjcm8gcmVmZXJlbmNlcyBvbiBhIHNpbmdsZSBsaW5lLCBlLmcuOgorICBwdXRjaGFyKEJTKTsgcHV0Y2hhcihTUCk7IHB1dGNoYXIoQlMpCisKKyAgIFRoaXMgb3ZlcmZsb3dzIHRoZSBDUFAgb3V0cHV0IGJ1ZmZlciBvZiBtb3JlIHRoYW4gYSBmZXcgQworICAgcHJlcHJvY2Vzc29ycyAodGhpcyBoYXBwZW5lZCwgZm9yIGV4YW1wbGUsIHdpdGggU3VuT1MgNC4xIGNjLCB3aGljaAorICAgZXZpZGVudGx5IGhhcyBhIDFLIG1hY3JvIGV4cGFuc2lvbiBidWZmZXIpLgorCisgICBDLUtlcm1pdCBuZWVkcyBjb25zdGFudCBhZGp1c3RtZW50IHRvIG5ldyBPUyBhbmQgY29tcGlsZXIgcmVsZWFzZXMuCisgICBFdmVyeSBuZXcgT1MgcmVsZWFzZSBzaHVmZmxlcyBoZWFkZXIgZmlsZXMgb3IgdGhlaXIgY29udGVudHMsIG9yCisgICBwcm90b3R5cGVzLCBvciBkYXRhIHR5cGVzLCBvciBsZXZlbHMgb2YgQU5TSSBzdHJpY3RuZXNzLCBldGMuIEV2ZXJ5CisgICB0aW1lIHlvdSBtYWtlIGFuIGFkanVzdG1lbnQgdG8gcmVtb3ZlIGEgbmV3IGNvbXBpbGF0aW9uIGVycm9yLCBCRSBWRVJZCisgICBDQVJFRlVMIHRvICNpZmRlZiBpdCBvbiBhIHN5bWJvbCB1bmlxdWUgdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uIHNvCisgICB0aGF0IHRoZSBwcmV2aW91cyBjb25maWd1cmF0aW9uIChhbmQgYWxsIG90aGVyIGNvbmZpZ3VyYXRpb25zIG9uIGFsbAorICAgb3RoZXIgcGxhdGZvcm1zKSByZW1haW4gYXMgYmVmb3JlLgorCisgICBBc3N1bWUgbm90aGluZy4gRG9uJ3QgYXNzdW1lIGhlYWRlciBmaWxlcyBhcmUgd2hlcmUgdGhleSBhcmUgc3VwcG9zZWQKKyAgIHRvIGJlLCB0aGF0IHRoZXkgY29udGFpbiB3aGF0IHlvdSB0aGluayB0aGV5IGNvbnRhaW4sIHRoYXQgdGhleSBkZWZpbmUKKyAgIHNwZWNpZmljIHN5bWJvbHMgdG8gaGF2ZSBjZXJ0YWluIHZhbHVlcyAtLSBvciBkZWZpbmUgdGhlbSBhdCBhbGwhCisgICBEb24ndCBhc3N1bWUgc3lzdGVtIGhlYWRlciBmaWxlcyBwcm90ZWN0IHRoZW1zZWx2ZXMgYWdhaW5zdCBtdWx0aXBsZQorICAgaW5jbHVzaW9uLiBEb24ndCBhc3N1bWUgdGhhdCBwYXJ0aWN1bGFyIHN5c3RlbSBvciBsaWJyYXJ5IGNhbGxzIGFyZQorICAgYXZhaWxhYmxlLCBvciB0aGF0IHRoZSBhcmd1bWVudHMgYXJlIHdoYXQgeW91IHRoaW5rIHRoZXkgYXJlIC0tIG9yZGVyLAorICAgZGF0YSB0eXBlLCBwYXNzZWQgYnkgcmVmZXJlbmNlIHZzIHZhbHVlLCBldGMuIEJlIGNvbnNlcnZhdGl2ZSB3aGVuCisgICBhdHRlbXB0aW5nIHRvIHdyaXRlIHBvcnRhYmxlIGNvZGUuIEF2b2lkIGFsbCBhZHZhbmNlZCBmZWF0dXJlcy4KKworICAgSWYgeW91IHNlZSBzb21ldGhpbmcgdGhhdCBkb2VzIG5vdCBtYWtlIHNlbnNlLCBkb24ndCBhc3N1bWUgaXQncyBhCisgICBtaXN0YWtlIC0tIGl0IG1pZ2h0IGJlIHRoZXJlIGZvciBhIHJlYXNvbiwgYW5kIGNoYW5naW5nIGl0IG9yIHJlbW92aW5nCisgICBpcyBsaWtlbHkgdG8gY2F1c2UgY29tcGlsYXRpb24sIGxpbmtpbmcsIG9yIHJ1bnRpbWUgZmFpbHVyZXMgc29tZXRpbWUsCisgICBzb21ld2hlcmUuIFNvbWUgaHVnZSBwZXJjZW50YWdlIG9mIHRoZSBjb2RlLCBlc3BlY2lhbGx5IGluIHRoZQorICAgcGxhdGZvcm0tZGVwZW5kZW50IG1vZHVsZXMsIGlzIHdvcmthcm91bmRzIGZvciBjb21waWxlciwgbGlua2VyLCBvcgorICAgQVBJIGJ1Z3MuCisKKyAgIEJ1dCBmaW5hbGx5Li4uIGZlZWwgZnJlZSB0byB2aW9sYXRlIGFueSBvciBhbGwgb2YgdGhlc2UgcnVsZXMgaW4KKyAgIHBsYXRmb3JtLXNwZWNpZmljIG1vZHVsZXMgZm9yIGVudmlyb25tZW50cyBpbiB3aGljaCB0aGUgcnVsZXMgYXJlCisgICBjZXJ0YWluIG5vdCB0byBhcHBseS4gRm9yIGV4YW1wbGUsIGluIFZNUy1zcGVjaWZpYyBjb2RlLCBpdCBpcyBPSyB0bworICAgdXNlICNpZiwgYmVjYXVzZSBWQVggQywgREVDIEMsIGFuZCBWTVMgR0NDIGFsbCBzdXBwb3J0IGl0LgorCisgICBbIFsyOV1Db250ZW50cyBdIFsgWzMwXUMtS2VybWl0IF0gWyBbMzFdS2VybWl0IEhvbWUgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMS4gTWVtb3J5IExlYWtzCisKKyAgIFRoZSBDIGxhbmd1YWdlIGFuZCBzdGFuZGFyZCBDIGxpYnJhcnkgYXJlIG5vdG9yaW91c2x5IGluYWRlcXVhdGUgYW5kCisgICB1bnNhZmUuIFN0cmluZ3MgYXJlIGFycmF5cyBvZiBjaGFyYWN0ZXJzLCB1c3VhbGx5IHJlZmVyZW5jZWQgdGhyb3VnaAorICAgcG9pbnRlcnMuIFRoZXJlIGlzIG5vIG5hdGl2ZSBzdHJpbmcgZGF0YXR5cGUuIEJ1ZmZlcnMgYXJlIGZpeGVkIHNpemUsCisgICBhbmQgQyBwcm92aWRlcyBubyBydW50aW1lIGJvdW5kcyBjaGVja2luZywgdGh1cyBhbGxvd2luZyBvdmVyd3JpdGluZworICAgb2Ygb3RoZXIgZGF0YSBvciBldmVuIHByb2dyYW0gY29kZS4gV2l0aCB0aGUgcG9wdWxhcml6YXRpb24gb2YgdGhlCisgICBJbnRlcm5ldCwgdGhlICJidWZmZXIgZXhwbG9pdCIgaGFzIGJlY29tZSBhIHByZWZlcnJlZCBtZXRob2QgZm9yCisgICBoYWNrZXJzIHRvIGhpamFjayBwcml2aWxlZ2VkIHByb2dyYW1zOyBsb25nIGRhdGEgc3RyaW5ncyBhcmUgZmVkIHRvIGEKKyAgIHByb2dyYW0gaW4gaG9wZXMgdGhhdCBpdCB1c2VzIHVuc2FmZSBDIGxpYnJhcnkgY2FsbHMgc3VjaCBhcyBzdHJjcHkoKQorICAgb3Igc3ByaW50ZigpIHRvIGNvcHkgc3RyaW5ncyBpbnRvIGF1dG9tYXRpYyBhcnJheXMsIHRodXMgb3ZlcndyaXRpbmcKKyAgIHRoZSBjYWxsIHN0YWNrLCBhbmQgdGhlcmVmb3JlIHRoZSByb3V0aW5lJ3MgcmV0dXJuIGFkZHJlc3MuIFdoZW4gc3VjaAorICAgYSBob2xlIGlzIGRpc2NvdmVyZWQsIGEgInN0cmluZyIgY2FuIGJlIGNvbnN0cnVjdGVkIHRoYXQgY29udGFpbnMKKyAgIG1hY2hpbmUgY29kZSB0byBoaWphY2sgdGhlIHByb2dyYW0ncyBwcml2aWxlZ2VzIGFuZCBwZW5ldHJhdGUgdGhlCisgICBzeXN0ZW0uCisKKyAgIFRoaXMgcHJvYmxlbSBpcyBwYXJ0aWFsbHkgYWRkcmVzc2VkIGJ5IHRoZSBzdHJuLi4uKCkgcm91dGluZXMsIHdoaWNoCisgICBzaG91bGQgYWx3YXlzIGJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0byB0aGVpciBzdHIuLi4oKSBlcXVpdmFsZW50cworICAgKGV4Y2VwdCB3aGVuIHRoZSBjb3B5IG9wZXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHByZWNoZWNrZWQsIG9yIHRoZXJlCisgICBpcyBhIGdvb2QgcmVhc29uIGZvciBub3QgdXNpbmcgdGhlbSwgZS5nLiB0aGUgc29tZXRpbWVzIHVuZGVzaXJhYmxlCisgICBzaWRlIGVmZmVjdCBvZiBzdHJuY3B5KCkgemVyb2luZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBidWZmZXIpLiBUaGUKKyAgIG1vc3QgZ2FwaW5nIHdob2xlLCBob3dldmVyLCBpcyBzcHJpbnRmKCksIHdoaWNoIHBlcmZvcm1zIG5vIGxlbmd0aAorICAgY2hlY2tpbmcgb24gaXRzIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW5kIGlzIG5vdCBlYXN5IHRvIHJlcGxhY2UuCisgICBBbHRob3VnaCBzbnByaW50ZigpIHJvdXRpbmVzIGFyZSBzdGFydGluZyB0byBhcHBlYXIsIHRoZXkgYXJlIG5vdCB5ZXQKKyAgIHdpZGVzcHJlYWQsIGFuZCBjZXJ0YWlubHkgbm90IHVuaXZlcnNhbCwgbm9yIGFyZSB0aGV5IGVzcGVjaWFsbHkKKyAgIHBvcnRhYmxlLCBvciBldmVuIGZ1bGwtZmVhdHVyZWQuCisKKyAgIEZvciB0aGVzZSByZWFzb25zLCB3ZSBoYXZlIHN0YXJ0ZWQgdG8gYnVpbGQgdXAgb3VyIG93biBsaXR0bGUgbGlicmFyeQorICAgb2YgQyBMaWJyYXJ5IHJlcGxhY2VtZW50cywgY2tjbGliLltjaF0uIFRoZXNlIGFyZSBzYWZlIGFuZCBoaWdobHkKKyAgIHBvcnRhYmxlIHByaW1pdGl2ZXMgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBzdHJpbmcgbWFuaXB1bGF0aW9uLAorICAgc3VjaCBhczoKKworICAgY2tzdHJuY3B5KCkKKyAgICAgICAgICBMaWtlIHN0cm5jcHkgYnV0IHJldHVybnMgYSB1c2VmdWwgdmFsdWUsIGRvZXNuJ3QgemVybyBidWZmZXIuCisKKyAgIGNraXRvYSgpCisgICAgICAgICAgT3Bwb3NpdGUgb2YgYXRvaSgpCisKKyAgIGNrbHRvYSgpCisgICAgICAgICAgT3Bwb3NpdGUgb2YgYXRvbCgpCisKKyAgIGNrY3RvYSgpCisgICAgICAgICAgUmV0dXJucyBjaGFyYWN0ZXIgYXMgc3RyaW5nCisKKyAgIGNrbWFrbXNnKCkKKyAgICAgICAgICBVc2VkIHdpdGggY2s/dG8/KCkgYXMgYSBzYWZlIHNwcmludGYoKSByZXBsYWNlbWVudCBmb3IgdXAgdG8gNAorICAgICAgICAgIGl0ZW1zCisKKyAgIGNrbWFreG1zZygpCisgICAgICAgICAgTGlrZSBja21ha21zZygpIGJ1dCBhY2NlcHRzIHVwIHRvIDEyIGl0ZW1zCisKKyAgIE1vcmUgYWJvdXQgbGlicmFyeSBmdW5jdGlvbnMgaW4gWzMyXVNlY3Rpb24gNC5BLgorCisgICBbIFszM11Db250ZW50cyBdIFsgWzM0XUMtS2VybWl0IF0gWyBbMzVdS2VybWl0IEhvbWUgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMi4gVGhlICJjaGFyIiB2cyAidW5zaWduZWQgY2hhciIgRGlsZW1tYQorCisgICBUaGlzIGlzIG9uZSBvZiB0aGUgbW9zdCBhZ2dyYXZhdGluZyBhbmQgdmV4aW5nIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUKKyAgIEMgbGFuZ3VhZ2UuIEJ5IGRlc2lnbiwgY2hhcnMgKGFuZCBjaGFyIConcykgYXJlIFNJR05FRC4gQnV0IGluIHRoZQorICAgbW9kZXJuIGVyYSwgaG93ZXZlciwgd2UgbmVlZCB0byBwcm9jZXNzIGNoYXJhY3RlcnMgdGhhdCBjYW4gaGF2ZSAob3IKKyAgIGluY2x1ZGUpIDgtYml0IHZhbHVlcywgYXMgaW4gdGhlIElTTyBMYXRpbi0xLCBJQk0gQ1AgODUwLCBvciBVVEYtOAorICAgY2hhcmFjdGVyIHNldHMsIHNvIHRoaXMgZGF0YSBtdXN0IGJlIHRyZWF0ZWQgYXMgdW5zaWduZWQuIEJ1dCBzb21lIEMKKyAgIGNvbXBpbGVycyAoc3VjaCBhcyB0aG9zZSBiYXNlZCBvbiB0aGUgQmVsbCBVTklYIFY3IGNvbXBpbGVyKSBkbyBub3QKKyAgIHN1cHBvcnQgInVuc2lnbmVkIGNoYXIiIGFzIGEgZGF0YSB0eXBlLiBUaGVyZWZvcmUgd2UgaGF2ZSB0aGUgbWFjcm8gb3IKKyAgIHR5cGVkZWYgQ0hBUiwgd2hpY2ggd2UgdXNlIHdoZW4gd2UgbmVlZCBjaGFycyB0byBiZSB1bnNpZ25lZCwgYnV0CisgICB3aGljaCwgdW5mb3J0dW5hdGVseSwgcmVzb2x2ZXMgaXRzZWxmIHRvICJjaGFyIiBvbiB0aG9zZSBjb21waWxlcnMKKyAgIHRoYXQgZG9uJ3Qgc3VwcG9ydCAidW5zaWduZWQgY2hhciIuIEFORCBTTy4uLiBXZSBoYXZlIHRvIGRvIGEgbG90IG9mCisgICBmaWRkbGluZyBhdCBydW50aW1lIHRvIGF2b2lkIHNpZ24gZXh0ZW5zaW9uIGFuZCBzbyBmb3J0aC4KKworICAgU29tZSBtb2Rlcm4gY29tcGlsZXJzIChlLmcuIElCTSwgREVDLCBNaWNyb3NvZnQpIGhhdmUgb3B0aW9ucyB0aGF0IHNheQorICAgIm1ha2UgYWxsIGNoYXJzIGJlIHVuc2lnbmVkIiAoZS5nLiBHQ0MgIi1mdW5zaWduZWQtY2hhciIpIGFuZCB3ZSB1c2UKKyAgIHRoZW0gd2hlbiB0aGV5IGFyZSBhdmFpbGFibGUuIE90aGVyIGNvbXBpbGVycyBkb24ndCBoYXZlIHRoaXMgb3B0aW9uLAorICAgYW5kIGF0IHRoZSBzYW1lIHRpbWUsIGFyZSBiZWNvbWluZyBpbmNyZWFzaW5nbHkgc3RyaWN0IGFib3V0IHR5cGUKKyAgIG1pc21hdGNoZXMsIGFuZCBzcGV3IG91dCB0b3JyZW50cyBvZiB3YXJuaW5ncyB3aGVuIHdlIHVzZSBhIENIQVIgd2hlcmUKKyAgIGEgY2hhciBpcyBleHBlY3RlZCwgb3IgdmljZSB2ZXJzYS4gV2UgZml4IHRoZXNlIG9uZSBieSBvbmUgdXNpbmcKKyAgIGNhc3RzLCBhbmQgdGhlIGNvZGUgYmVjb21lcyBpbmNyZWFzaW5nbHkgdWdseS4gQnV0IHRoZXJlIHJlbWFpbnMgYQorICAgc2VyaW91cyBwcm9ibGVtLCBuYW1lbHkgdGhhdCBjZXJ0YWluIGxpYnJhcnkgYW5kIGtlcm5lbCBmdW5jdGlvbnMgaGF2ZQorICAgYXJndW1lbnRzIHRoYXQgYXJlIGRlY2xhcmVkIGFzIHNpZ25lZCBjaGFycyAob3IgcG9pbnRlcnMgdG8gdGhlbSksCisgICB3aGVyZWFzIG91ciBjaGFyYWN0ZXIgZGF0YSBpcyB1bnNpZ25lZC4gRmluZSwgd2UgY2FuIGNhbiB1c2UgY2FzdHMKKyAgIGhlcmUgdG9vIC0tIGJ1dCB3aG8ga25vd3Mgd2hhdCBoYXBwZW5zIGluc2lkZSB0aGVzZSByb3V0aW5lcy4KKworICAgWyBbMzZdQ29udGVudHMgXSBbIFszN11DLUtlcm1pdCBdIFsgWzM4XUtlcm1pdCBIb21lIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LiBNT0RVTEVTCisKKyAgIFdoZW4gQy1LZXJtaXQgaXMgb24gdGhlIGZhciBlbmQgb2YgYSBjb25uZWN0aW9uLCBpdCBpcyBzYWlkIHRvIGJlIGluCisgICByZW1vdGUgbW9kZS4gV2hlbiBDLUtlcm1pdCBoYXMgbWFkZSBhIGNvbm5lY3Rpb24gdG8gYW5vdGhlciBjb21wdXRlciwKKyAgIGl0IGlzIGluIGxvY2FsIG1vZGUuIChJZiBDLUtlcm1pdCBpcyAiaW4gdGhlIG1pZGRsZSIgb2YgYSBtdWx0aWhvcAorICAgY29ubmVjdGlvbiwgaXQgaXMgc3RpbGwgaW4gbG9jYWwgbW9kZS4pCisKKyAgIE9uIGFub3RoZXIgYXhpcywgQy1LZXJtaXQgY2FuIGJlIGluIGFueSBvZiBzZXZlcmFsIG1ham9yIHN0YXRlczoKKworICAgQ29tbWFuZCBTdGF0ZQorICAgICAgICAgIFJlYWRpbmcgYW5kIHdyaXRpbmcgZnJvbSB0aGUgam9iJ3MgY29udHJvbGxpbmcgdGVybWluYWwgb3IKKyAgICAgICAgICAiY29uc29sZSIuIEluIHRoaXMgbW9kZSwgYWxsIGkvbyBpcyBoYW5kbGVkIGJ5IHRoZSBHcm91cCBFCisgICAgICAgICAgY29ueHh4KCkgKGNvbnNvbGUgaS9vKSByb3V0aW5lcy4KKworICAgUHJvdG9jb2wgU3RhdGUKKyAgICAgICAgICBSZWFkaW5nIGFuZCB3cml0aW5nIGZyb20gdGhlIGNvbW11bmljYXRvbnMgZGV2aWNlLiBJbiB0aGlzCisgICAgICAgICAgbW9kZSwgYWxsIGkvbyBpcyBoYW5kbGVkIGJ5IHRoZSBHcm91cCBFIHR0eHh4KCkgKHRlcm1pbmFsIGkvbykKKyAgICAgICAgICByb3V0aW5lcy4KKworICAgVGVybWluYWwgU3RhdGUKKyAgICAgICAgICBSZWFkaW5nIGZyb20gdGhlIGtleWJvYXJkIHdpdGggY29ueHh4KCkgcm91dGluZXMgYW5kIHdyaXRpbmcgdG8KKyAgICAgICAgICB0aGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlIHdpdGggdHR4eHgoKSByb3V0aW5lcyBBTkQgdmljZS12ZXJzYS4KKworICAgV2hlbiBpbiBsb2NhbCBtb2RlLCB0aGUgY29uc29sZSBhbmQgY29tbXVuaWNhdGlvbnMgZGV2aWNlIGFyZQorICAgZGlzdGluY3QuIER1cmluZyBmaWxlIHRyYW5zZmVyLCBLZXJtaXQgbWF5IHB1dCB1cCBhIGZpbGUtdHJhbnNmZXIKKyAgIGRpc3BsYXkgb24gdGhlIGNvbnNvbGUgYW5kIHNhbXBsZSB0aGUgY29uc29sZSBmb3IgaW50ZXJydXB0aW9uCisgICBzaWduYWxzLgorCisgICBXaGVuIGluIHJlbW90ZSBtb2RlLCB0aGUgY29uc29sZSBhbmQgY29tbXVuaWNhdGlvbnMgZGV2aWNlIGFyZSB0aGUKKyAgIHNhbWUsIGFuZCB0aGVyZWZvcmUgdGhlcmUgY2FuIGJlIG5vIGZpbGUtdHJhbnNmZXIgZGlzcGxheSBvbiB0aGUKKyAgIGNvbnNvbGUgb3IgaW50ZXJydXB0aW9ucyBmcm9tIGl0IChleGNlcHQgZm9yICJpbi1iYW5kIiBpbnRlcnJ1cHRpb25zCisgICBzdWNoIGFzIF5DXkNeQykuCisKKyAgIFsgWzM5XUNvbnRlbnRzIF0gWyBbNDBdQy1LZXJtaXQgXSBbIFs0MV1LZXJtaXQgSG9tZSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC5BLiBHcm91cCBBOiBMaWJyYXJ5IEZ1bmN0aW9ucworCisgICBMaWJyYXJ5IGZ1bmN0aW9ucywgc3RyaWN0bHkgcG9ydGFibGUsIGNhbiBiZSB1c2VkIGJ5IGFsbCBtb2R1bGVzIG9uCisgICBhbGwgcGxhdGZvcm1zOiBbNDJdY2tjbGliLmgsIFs0M11ja2NsaWIuYy4KKworICAgKFRvIGJlIGZpbGxlZCBpbi4uLiBGb3Igbm93LCBzZWUgWzQ0XVNlY3Rpb24gMy4xIGFuZCB0aGUgY29tbWVudHMgaW4KKyAgIGNrY2xpYi5jLikKKworICAgWyBbNDVdQ29udGVudHMgXSBbIFs0Nl1DLUtlcm1pdCBdIFsgWzQ3XUtlcm1pdCBIb21lIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LkIuIEdyb3VwIEI6IEtlcm1pdCBGaWxlIFRyYW5zZmVyCisKKyAgIFRoZSBLZXJtaXQgcHJvdG9jb2wga2VybmVsLiBUaGVzZSBmaWxlcywgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCAiY2tjCisgICBhcmUgc3VwcG9zZWQgdG8gYmUgdG90YWxseSBwb3J0YWJsZSBDLCBhbmQgYXJlIGV4cGVjdGVkIHRvIGNvbXBpbGUKKyAgIGNvcnJlY3RseSBvbiBhbnkgcGxhdGZvcm0gd2l0aCBhbnkgQyBjb21waWxlci4gIlBvcnRhYmxlIiBkb2VzIG5vdAorICAgbWVhbiB0aGUgc2FtZSBhcyBhcyAiQU5TSSIgLS0gdGhlc2UgbW9kdWxlcyBtdXN0IGNvbXBpbGUgb24gMTAtIGFuZAorICAgMjAteWVhciBvbGQgY29tcHV0ZXJzLCB3aXRoIEMgcHJlcHJvY2Vzc29ycywgY29tcGlsZXJzLCBhbmQvb3IgbGlua2VycworICAgdGhhdCBoYXZlIGFsbCBzb3J0cyBvZiByZXN0cmljdGlvbnMuIFRoZSBHcm91cCBCIG1vZHVsZXMgZG8gbm90CisgICBpbmNsdWRlIGFueSBoZWFkZXIgZmlsZXMgb3RoZXIgdGhhbiB0aG9zZSB0aGF0IGNvbWUgd2l0aCBLZXJtaXQKKyAgIGl0c2VsZi4gVGhleSBkbyBub3QgY29udGFpbiBhbnkgbGlicmFyeSBjYWxscyBleGNlcHQgZnJvbSB0aGUgc3RhbmRhcmQKKyAgIEMgbGlicmFyeSAoZS5nLiBwcmludGYoKSkuIFRoZXkgbW9zdCBjZXJ0YWlubHkgZG8gbm90IGNvbnRhaW4gYW55CisgICBzeXN0ZW0gY2FsbHMuIEZpbGVzOgorCisgICBbNDhdY2tjc3ltLmgKKyAgICAgICAgICBGb3IgdXNlIGJ5IEMgY29tcGlsZXJzIHRoYXQgZG9uJ3QgYWxsb3cgLUQgb24gdGhlIGNvbW1hbmQgbGluZS4KKworICAgWzQ5XWNrY2FzYy5oCisgICAgICAgICAgQVNDSUkgY2hhcmFjdGVyIHN5bWJvbCBkZWZpbml0aW9ucy4KKworICAgWzUwXWNrY3NpZy5oCisgICAgICAgICAgU3lzdGVtLWluZGVwZW5kZW50IHNpZ25hbC1oYW5kbGluZyBkZWZpbml0aW9ucyBhbmQgcHJvdG90eXBlcy4KKworICAgWzUxXWNrY2RlYi5oCisgICAgICAgICAgT3JpZ2luYWxseSwgZGVidWdnaW5nIGRlZmluaXRpb25zLiBOb3cgdGhpcyBmaWxlIGFsc28gY29udGFpbnMKKyAgICAgICAgICBhbGwgZGVmaW5pdGlvbnMgYW5kIHByb3RvdHlwZXMgdGhhdCBhcmUgc2hhcmVkIGJ5IGFsbCBtb2R1bGVzCisgICAgICAgICAgaW4gYWxsIGdyb3Vwcy4KKworICAgWzUyXWNrY2tlci5oCisgICAgICAgICAgS2VybWl0IHByb3RvY29sIHN5bWJvbCBkZWZpbml0aW9ucy4KKworICAgWzUzXWNrY3hsYS5oCisgICAgICAgICAgQ2hhcmFjdGVyLXNldC1yZWxhdGVkIHN5bWJvbCBkZWZpbml0aW9ucyAoc2VlIG5leHQgc2VjdGlvbikuCisKKyAgIFs1NF1ja2NtYWkuYworICAgICAgICAgIFRoZSBtYWluIHByb2dyYW0uIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgb2YgYWxsCisgICAgICAgICAgdGhlIHByb3RvY29sLXJlbGF0ZWQgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGFyZSBzaGFyZWQgYW1vbmcgdGhlCisgICAgICAgICAgb3RoZXIgbW9kdWxlcy4KKworICAgWzU1XWNrY3Byby53CisgICAgICAgICAgVGhlIHByb3RvY29sIG1vZHVsZSBpdHNlbGYsIHdyaXR0ZW4gaW4gIndhcnQiLCBhIGxleC1saWtlCisgICAgICAgICAgcHJlcHJvY2Vzc29yIHRoYXQgaXMgZGlzdHJpYnV0ZWQgd2l0aCBLZXJtaXQgdW5kZXIgdGhlIG5hbWUKKyAgICAgICAgICBDS1dBUlQuQy4KKworICAgWzU2XWNrY2Zucy5jLCBbNTddY2tjZm4yLmMsIFs1OF1ja2NmbjMuYworICAgICAgICAgIFRoZSBwcm90b2NvbCBzdXBwb3J0IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBwcm90b2NvbCBtb2R1bGUuCisKKyAgIFs1OV1Hcm91cCBCIG1vZHVsZXMgbWF5IGNhbGwgdXBvbiBmdW5jdGlvbnMgZnJvbSBbNjBdR3JvdXAgRSwgYnV0IG5vdAorICAgZnJvbSBbNjFdR3JvdXAgRCBtb2R1bGVzICh3aXRoIHRoZSBzaW5nbGUgZXhjZXB0aW9uIHRoYXQgdGhlIG1haW4KKyAgIHByb2dyYW0gaW52b2tlcyB0aGUgdXNlciBpbnRlcmZhY2UsIHdoaWNoIGlzIGluIEdyb3VwIEQpLiAoVGhpcyBsYXN0CisgICBhc3NlcnRpb24gaXMgcmVhbGx5IG9ubHkgYSBjb25qZWN0dXJlLikKKworICAgWyBbNjJdQ29udGVudHMgXSBbIFs2M11DLUtlcm1pdCBdIFsgWzY0XUtlcm1pdCBIb21lIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LkMuIEdyb3VwIEM6IENoYXJhY3Rlci1TZXQgQ29udmVyc2lvbgorCisgICBDaGFyYWN0ZXIgc2V0IHRyYW5zbGF0aW9uIHRhYmxlcyBhbmQgZnVuY3Rpb25zLiBVc2VkIGJ5IHRoZSBbNjVdR3JvdXAKKyAgIEIsIHByb3RvY29sIG1vZHVsZXMsIGJ1dCBtYXkgYmUgc3BlY2lmaWMgdG8gZGlmZmVyZW50IGNvbXB1dGVycy4gKFNvCisgICBmYXIsIGFsbCBjaGFyYWN0ZXIgY2hhcmFjdGVyIHNldHMgc3VwcG9ydGVkIGJ5IEMtS2VybWl0IGFyZSBzdXBwb3J0ZWQKKyAgIGluIFs2Nl1ja3V4bGEuYyBhbmQgWzY3XWNrdXhsYS5oLCBpbmNsdWRpbmcgTWFjaW50b3NoIGFuZCBJQk0KKyAgIGNoYXJhY3RlciBzZXRzKS4gVGhlc2UgbW9kdWxlcyBzaG91bGQgYmUgY29tcGxldGVseSBwb3J0YWJsZSwgYW5kIG5vdAorICAgcmVseSBvbiBhbnkga2luZCBvZiBzeXN0ZW0gb3IgbGlicmFyeSBzZXJ2aWNlcy4KKworICAgWzY4XWNrY3hsYS5oCisgICAgICAgICAgQ2hhcmFjdGVyLXNldCBkZWZpbml0aW9ucyB1c2FibGUgYnkgYWxsIHZlcnNpb25zIG9mIEMtS2VybWl0LgorCisgICBjaz94bGEuaAorICAgICAgICAgIENoYXJhY3Rlci1zZXQgZGVmaW5pdGlvbnMgZm9yIGNvbXB1dGVyICI/IiwgZS5nLiBbNjldY2t1eGxhLmgKKyAgICAgICAgICBmb3IgVU5JWCwgWzcwXWNrbXhsYS5oIGZvciBNYWNpbnRvc2guCisKKyAgIFs3MV1jaz94bGEKKyAgICAgICAgICBDaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIHRhYmxlcyBhbmQgZnVuY3Rpb25zIGZvciBjb21wdXRlcgorICAgICAgICAgICI/IiwgRm9yIGV4YW1wbGUsIENLVVhMQS5DIGZvciBVTklYLCBDS01YTEEuQyBmb3IgTWFjaW50b3NoLiBTbworICAgICAgICAgIGZhciwgdGhlc2UgYXJlIHRoZSBvbmx5IHR3byBzdWNoIG1vZHVsZXMuIFRoZSBVTklYIG1vZHVsZSBpcworICAgICAgICAgIHVzZWQgZm9yIGFsbCB2ZXJzaW9ucyBvZiBDLUtlcm1pdCBleGNlcHQgdGhlIE1hY2ludG9zaCB2ZXJzaW9uLgorCisgICBbNzJdY2tjdW5pLmgKKyAgICAgICAgICBVbmljb2RlIGRlZmluaXRpb25zCisKKyAgIFs3M11ja2N1bmkuYworICAgICAgICAgIFVuaWNvZGUgbW9kdWxlCisKKyAgIEhlcmUncyBob3cgdG8gYWRkIGEgbmV3IGZpbGUgY2hhcmFjdGVyIHNldCBpbiB0aGUgb3JpZ2luYWwKKyAgIChub24tVW5pY29kZSBtb2R1bGVzKS4gQXNzdW1pbmcgaXQgaXMgYmFzZWQgb24gdGhlIFJvbWFuIChMYXRpbikKKyAgIGFscGhhYmV0LiBMZXQncyBjYWxsIGl0ICJCYXJiYXJpYW4iLiBGaXJzdCwgaW4gY2s/eGxhLmgsIGFkZCBhCisgICBkZWZpbml0aW9uIGZvciBGQ19CQVJCQSAoOCBjaGFycyBtYXhpbXVtIGxlbmd0aCkgYW5kIGluY3JlYXNlCisgICBNQVhGQ1NFVFMgYnkgMS4gVGhlbiwgaW4gY2s/eGxhLmM6CisKKyAgICAgKiBBZGQgYSBiYXJiYXJpYW4gZW50cnkgaW50byB0aGUgZmNzaW5mbyBhcnJheS4KKyAgICAgKiBBZGQgYSAiYmFyYmFyaWFuIiBlbnRyeSB0byBmaWxlIGNoYXJhY3RlciBzZXQga2V5d29yZCB0YWJsZSwKKyAgICAgICBmY3N0YWIuCisgICAgICogQWRkIGEgImJhcmJhcmlhbiIgZW50cnkgdG8gdGVybWluYWwgY2hhcmFjdGVyIHNldCBrZXl3b3JkIHRhYmxlLAorICAgICAgIHR0Y3N0YWIuCisgICAgICogQWRkIGEgdHJhbnNsYXRpb24gdGFibGUgZnJvbSBMYXRpbi0xIHRvIGJhcmJhcmlhbjogeWwxYmFbXS4KKyAgICAgKiBBZGQgYSB0cmFuc2xhdGlvbiB0YWJsZSBmcm9tIGJhcmJhcmlhbiB0byBMYXRpbi0xOiB5YmFsMVtdLgorICAgICAqIEFkZCBhIHRyYW5zbGF0aW9uIGZ1bmN0aW9uIGZyb20gQmFyYmFyaWFuIHRvIEFTQ0lJOiB4YmFhcygpLgorICAgICAqIEFkZCBhIHRyYW5zbGF0aW9uIGZ1bmN0aW9uIGZyb20gQmFyYmFyaWFuIHRvIExhdGluLTE6IHhiYWwxKCkuCisgICAgICogQWRkIGEgdHJhbnNsYXRpb24gZnVuY3Rpb24gZnJvbSBMYXRpbi0xIHRvIEJhcmJhcmlhbjogeGwxYmEoKS4KKyAgICAgKiBldGMgZXRjIGZvciBlYWNoIHRyYW5zZmVyIGNoYXJhY3RlciBzZXQuLi4KKyAgICAgKiBBZGQgdHJhbnNsYXRpb24gZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIHhscyBhbmQgeGxyIHRhYmxlcy4KKworICAgT3RoZXIgdHJhbnNsYXRpb25zIGludm9sdmluZyBCYXJiYXJpYW4gKGUuZy4gZnJvbSBCYXJiYXJpYW4gdG8KKyAgIExhdGluLUN5cmlsbGljKSBhcmUgcGVyZm9ybWVkIHRocm91Z2ggdGhlc2UgdGFibGVzIGFuZCBmdW5jdGlvbnMuIFNlZQorICAgY2t1eGxhLmggYW5kIGNrdXhsYS5jIGZvciBleHRlbnNpdmUgZXhhbXBsZXMuCisKKyAgIFRvIGFkZCBhIG5ldyBUcmFuc2ZlciBDaGFyYWN0ZXIgU2V0LCBlLmcuIExhdGluIEFscGhhYmV0IDkgKGZvciB0aGUKKyAgIEV1cm8gc3ltYm9sKSwgYWdhaW4gaW4gdGhlICJvbGQiIGNoYXJhY3Rlci1zZXQgbW9kdWxlczoKKworICAgSW4gY2tjeGxhLmg6CisKKyAgICAgICAgICArIEFkZCBhIFRDX3h4eHggZGVmaW5pdGlvbiBhbmQgaW5jcmVhc2UgTUFYVENTRVRTIGFjY29yZGluZ2x5LgorCisgICBJbiBjaz94bGEuaCAoc2luY2UgYW55IHRyYW5zZmVyIGNoYXJzZXQgaXMgYWxzbyBhIGZpbGUgY2hhcnNldCk6CisKKyAgICAgICAgICArIEFkZCBhbiBGQ194eHh4IGRlZmluaXRpb24gYW5kIGluY3JlYXNlIE1BWEZDU0VUUyBhY2NvcmRpbmdseS4KKworICAgSW4gY2s/eGxhLmM6CisKKyAgICAgICAgICArIEFkZCBhIHRjc2luZm9bXSBlbnRyeS4KKyAgICAgICAgICArIE1ha2UgYSB0Y3N0YWJbXSBrZXl3b3JkIHRhYmxlIGVudHJ5LgorICAgICAgICAgICsgTWFrZSBhbiBmY3NpbmZvW10gdGFibGUgZW50cnkuCisgICAgICAgICAgKyBNYWtlIGFuIGZjc3RhYltdIGtleXdvcmQgdGFibGUgZW50cnkuCisgICAgICAgICAgKyBNYWtlIGEgdGNzdGFiW10ga2V5d29yZCB0YWJsZSBlbnRyeS4KKyAgICAgICAgICArIElmIG5lY2Vzc2FyeSwgbWFrZSBhIGxhbmdpbmZvW10gdGFibGUgZW50cnkuCisgICAgICAgICAgKyBNYWtlIGVudHJpZXMgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgYXJyYXlzLgorICAgICAgICAgICsgUHJvdmlkZSBhbnkgbmVlZGVkIGZ1bmN0aW9ucy4KKworICAgQXMgb2YgQy1LZXJtaXQgNy4wLCBjaGFyYWN0ZXIgc2V0cyBhcmUgYWxzbyBoYW5kbGVkIGluIHBhcmFsbGVsIGJ5IHRoZQorICAgbmV3IChhbmQgdmVyeSBsYXJnZSkgVW5pY29kZSBtb2R1bGUsIGNrY3VuaS5bY2hdLiBFdmVudHVhbGx5IHdlIHNob3VsZAorICAgcGhhc2Ugb3V0IHRoZSBvbGQgd2F5LCBkZXNjcmliZWQganVzdCBhYm92ZSwgYW5kIG9wZXJhdGUgZW50aXJlbHkgaW4KKyAgIChhbmQgdGhyb3VnaCkgVW5pY29kZS4gVGhlIGFkdmFudGFnZXMgYXJlIG1hbnkuIFRoZSBkaXNhZHZhbnRhZ2VzIGFyZQorICAgc2l6ZSBhbmQgcGVyZm9ybWFuY2UuIFRvIGFkZCBhIGNoYXJhY3RlciB0byB0aGUgVW5pY29kZSBtb2R1bGVzOgorCisgICBJbiBja2N1bmkuaDoKKworICAgICAgICAgICsgKFRvIGJlIGZpbGxlZCBpbi4uLikKKworICAgSW4gY2tjdW5pLmM6CisKKyAgICAgICAgICArIChUbyBiZSBmaWxsZWQgaW4uLi4pCisKKyAgIFsgWzc0XUNvbnRlbnRzIF0gWyBbNzVdQy1LZXJtaXQgXSBbIFs3Nl1LZXJtaXQgSG9tZSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC5ELiBHcm91cCBEOiBVc2VyIEludGVyZmFjZQorCisgICBUaGlzIGlzIHRoZSBjb2RlIHRoYXQgY29tbXVuaWNhdGVzIHdpdGggdGhlIHVzZXIsIGdldHMgaGVyIGNvbW1hbmRzLAorICAgaW5mb3JtcyBoZXIgb2YgdGhlIHJlc3VsdHMuIEl0IG1heSBiZSBjb21tYW5kLWxpbmUgb3JpZW50ZWQsCisgICBpbnRlcmFjdGl2ZSBwcm9tcHRpbmcgZGlhbG9nLCBtZW51cyBhbmQgYXJyb3cga2V5cywgd2luZG93cyBhbmQgbWljZSwKKyAgIHNwZWVjaCByZWNvZ25pdGlvbiwgdGVsZXBhdGh5LCBldGMuIFRoZSBvbmUgcHJvdmlkZWQgaXMgY29tbWFuZC1hbmQKKyAgIHByb21wdCwgd2l0aCB0aGUgYWJpbGl0eSB0byByZWFkIGNvbW1hbmRzIGZyb20gdmFyaW91cyBzb3VyY2VzOiB0aGUKKyAgIGNvbnNvbGUga2V5Ym9hcmQsIGEgZmlsZSwgb3IgYSBtYWNybyBkZWZpbml0aW9uLiBUaGUgdXNlciBpbnRlcmZhY2UKKyAgIGhhcyB0aHJlZSBtYWpvciBmdW5jdGlvbnM6CisKKyAgICAxLiBTZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmlsZSB0cmFuc2ZlciBhbmQgdGhlbiBzdGFydHMgaXQuIFRoaXMKKyAgICAgICBpcyBkb25lIGJ5IHNldHRpbmcgY2VydGFpbiAobWFueSkgZ2xvYmFsIHZhcmlhYmxlcywgc3VjaCBhcyB0aGUKKyAgICAgICBwcm90b2NvbCBtYWNoaW5lIHN0YXJ0IHN0YXRlLCB0aGUgZmlsZSBzcGVjaWZpY2F0aW9uLCBmaWxlIHR5cGUsCisgICAgICAgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzLCBwYWNrZXQgbGVuZ3RoLCB3aW5kb3cgc2l6ZSwgY2hhcmFjdGVyCisgICAgICAgc2V0LCBldGMuCisgICAgMi4gRGlzcGxheXMgbWVzc2FnZXMgb24gdGhlIHVzZXIncyBzY3JlZW4gZHVyaW5nIHRoZSBmaWxlIHRyYW5zZmVyLAorICAgICAgIHVzaW5nIHRoZSBzY3JlZW4oKSBmdW5jdGlvbiwgd2hpY2ggaXMgY2FsbGVkIGJ5IHRoZSBncm91cC0xCisgICAgICAgbW9kdWxlcy4KKyAgICAzLiBFeGVjdXRlcyBhbnkgY29tbWFuZHMgZGlyZWN0bHkgdGhhdCBkbyBub3QgcmVxdWlyZSBLZXJtaXQKKyAgICAgICBwcm90b2NvbCwgc3VjaCBhcyB0aGUgQ09OTkVDVCBjb21tYW5kLCBsb2NhbCBmaWxlIG1hbmFnZW1lbnQKKyAgICAgICBjb21tYW5kcywgcGFyYW1ldGVyLXNldHRpbmcgY29tbWFuZHMsIEZUUCBjbGllbnQgY29tbWFuZHMsIGV0Yy4KKworICAgSWYgeW91IHBsYW4gdG8gaW1iZWQgdGhlIFs3N11Hcm91cCBCLCBmaWxlcyBpbnRvIGEgcHJvZ3JhbSB3aXRoIGEKKyAgIGRpZmZlcmVudCB1c2VyIGludGVyZmFjZSwgeW91ciBpbnRlcmZhY2UgbXVzdCBzdXBwbHkgYW4gYXBwcm9wcmlhdGUKKyAgIHNjcmVlbigpIGZ1bmN0aW9uLCBwbHVzIGEgY291cGxlIHJlbGF0ZWQgb25lcyBsaWtlIGNoa2ludCgpIGFuZAorICAgaW50bXNnKCkgZm9yIGhhbmRsaW5nIGtleWJvYXJkIChvciBtb3VzZSwgZXRjKSBpbnRlcnJ1cHRpb25zIGR1cmluZworICAgZmlsZSB0cmFuc2Zlci4gVGhlIGJlc3Qgd2F5IHRvIGZpbmQgb3V0IGFib3V0IHRoaXMgaXMgdG8gbGluayBhbGwgdGhlCisgICBDLUtlcm1pdCBtb2R1bGVzIHRvZ2V0aGVyIGV4Y2VwdCB0aGUgY2t1dSoubyBhbmQgY2t1Y29uLm8gbW9kdWxlcywgYW5kCisgICBzZWUgd2hpY2ggbWlzc2luZyBzeW1ib2xzIHR1cm4gdXAuCisKKyAgIEMtS2VybWl0J3MgY2hhcmFjdGVyLW9yaWVudGVkIHVzZXIgaW50ZXJmYWNlIChhcyBvcHBvc2VkIHRvIHRoZQorICAgTWFjaW50b3NoIHZlcnNpb24ncyBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UpIGNvbnNpc3RzIG9mIHRoZQorICAgZm9sbG93aW5nIG1vZHVsZXMuIEMtS2VybWl0IGNhbiBiZSBidWlsdCB3aXRoIGFuIGludGVyYWN0aXZlIGNvbW1hbmQKKyAgIHBhcnNlciwgYSBjb21tYW5kLWxpbmUtb3B0aW9uLW9ubHkgcGFyc2VyLCBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSwKKyAgIG9yIGFueSBjb21iaW5hdGlvbiwgYW5kIGl0IGNhbiBldmVuIGJlIGJ1aWx0IHdpdGggbm8gdXNlciBpbnRlcmZhY2UgYXQKKyAgIGFsbCAoaW4gd2hpY2ggY2FzZSBpdCBydW5zIGFzIGEgcmVtb3RlLW1vZGUgS2VybWl0IHNlcnZlcikuCisKKyAgIFs3OF1ja3VjbWQuaAorICAgWzc5XWNrdWNtZC5jCisgICAgICAgICAgVGhlIGNvbW1hbmQgcGFyc2luZyBwcmltaXRpdmVzIHVzZWQgYnkgdGhlIGludGVyYWN0aXZlIGNvbW1hbmQKKyAgICAgICAgICBwYXJzZXIgdG8gcGFyc2Uga2V5d29yZHMsIG51bWJlcnMsIGZpbGVuYW1lcywgZXRjLCBhbmQgdG8gZ2l2ZQorICAgICAgICAgIGhlbHAsIGNvbXBsZXRlIGZpZWxkcywgc3VwcGx5IGRlZmF1bHRzLCBhbGxvdyBhYmJyZXZpYXRpb25zIGFuZAorICAgICAgICAgIGVkaXRpbmcsIGV0Yy4gVGhpcyBwYWNrYWdlIGlzIHRvdGFsbHkgaW5kZXBlbmRlbnQgb2YgS2VybWl0LAorICAgICAgICAgIGJ1dCBkb2VzIGRlcGVuZCBvbiB0aGUgWzgwXUdyb3VwIEUgZnVuY3Rpb25zLgorCisgICBbODFdY2t1dXNyLmgKKyAgICAgICAgICBEZWZpbml0aW9ucyBvZiBzeW1ib2xzIHVzZWQgaW4gS2VybWl0J3MgY29tbWFuZHMuCisKKyAgIGNrdXVzKi5jCisgICAgICAgICAgS2VybWl0J3MgaW50ZXJhY3RpdmUgY29tbWFuZCBwYXJzZXIsIGluY2x1ZGluZyB0aGUgc2NyaXB0CisgICAgICAgICAgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2U6IFs4Ml1ja3V1c3IuYyAoaW5jbHVkZXMgdG9wLWxldmVsIGtleXdvcmQKKyAgICAgICAgICB0YWJsZXMpOyBbODNdY2t1dXMyLmMgKEhFTFAgY29tbWFuZCB0ZXh0KTsgWzg0XWNrdXVzMy5jIChtb3N0CisgICAgICAgICAgb2YgdGhlIFNFVCBjb21tYW5kKTsgWzg1XWNrdXVzNC5jIChpbmNsdWRlcyB2YXJpYWJsZXMgYW5kCisgICAgICAgICAgZnVuY3Rpb25zKTsgY2t1dXNbNTY3XS5jIChtaXNjZWxsYW5lb3VzKTsKKworICAgWzg2XWNrdXVzeS5jCisgICAgICAgICAgVGhlIGNvbW1hbmQtbGluZS1vcHRpb24gcGFyc2VyLgorCisgICBbODddY2t1dXN4LmMKKyAgICAgICAgICBVc2VyIGludGVyZmFjZSBmdW5jdGlvbnMgY29tbW9uIHRvIGJvdGggdGhlIGludGVyYWN0aXZlIGFuZAorICAgICAgICAgIGNvbW1hbmQtbGluZSBwYXJzZXJzLgorCisgICBbODhdY2t1dmVyLmgKKyAgICAgICAgICBWZXJzaW9uIGhlcmFsZHMgZm9yIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMuCisKKyAgIFs4OV1ja3VzY3IuYworICAgICAgICAgIFRoZSAob2xkLCB1dWNwLWxpa2UpIFNDUklQVCBjb21tYW5kCisKKyAgIFs5MF1ja3VkaWEuYworICAgICAgICAgIFRoZSBESUFMIGNvbW1hbmQuIEluY2x1ZGVzIHNwZWNpZmljIGtub3dsZWRnZSBvZiBtYW55IHR5cGVzIG9mCisgICAgICAgICAgbW9kZW1zLgorCisgICBOb3RlIHRoYXQgbm9uZSBvZiB0aGUgYWJvdmUgZmlsZXMgaXMgYWN0dWFsbHkgVW5peC1zcGVjaWZpYy4gT3ZlciB0aW1lCisgICB0aGV5IGhhdmUgcHJvdmVuIHRvIGJlIHBvcnRhYmxlIGFtb25nIGFsbCBwbGF0Zm9ybXMgd2hlcmUgQy1LZXJtaXQgaXMKKyAgIGJ1aWx0OiBVbml4LCBWTVMsIEFPUy9WUywgQW1pZ2EsIE9TLTksIFZPUywgZXRjIGV0Yy4gVGh1cyB0aGUgdGhpcmQKKyAgIGxldHRlciBzaG91bGQgbW9yZSBwcm9wZXJseSBiZSAiYyIsIGJ1dCBjaGFuZ2luZyBpdCB3b3VsZCBiZSB0b28KKyAgIGNvbmZ1c2luZy4KKworICAgY2s/Y29uLmMsIGNrdWNucy5jCisgICAgICAgICAgVGhlIENPTk5FQ1QgY29tbWFuZC4gVGVybWluYWwgY29ubmVjdGlvbiwgYW5kIGluIHNvbWUgY2FzZXMKKyAgICAgICAgICAoTWFjaW50b3NoLCBXaW5kb3dzKSBhbHNvIHRlcm1pbmFsIGVtdWxhdGlvbi4gTk9URTogQXMgb2YKKyAgICAgICAgICBDLUtlcm1pdCA3LjAsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IENPTk5FQ1QgbW9kdWxlcyBmb3IgVU5JWDoKKyAgICAgICAgICBbOTFdY2t1Y29uLmMgLS0gdGhlIHRyYWRpdGlvbmFsLCBwb3J0YWJsZSwgZm9yaygpLWJhc2VkIHZlcnNpb24KKyAgICAgICAgICAtLSBhbmQgWzkyXWNrdWNucy5jLCBhIG5ldyB2ZXJzaW9uIHRoYXQgdXNlcyBzZWxlY3QoKSByYXRoZXIKKyAgICAgICAgICB0aGFuIGZvcmtzIHNvIGl0IGNhbiBoYW5kbGUgZW5jcnlwdGlvbi4gY2t1Y25zLmMgaXMgdGhlCisgICAgICAgICAgcHJlZmVycmVkIHZlcnNpb24gZm9yIFVuaXg7IGNrdWNvbi5jIGlzIG5vdCBsaWtlbHkgdG8ga2VlcCBwYWNlCisgICAgICAgICAgd2l0aCBpdCBpbiB0ZXJtcyBvZiB1cGdyYWRlcywgZXRjLiBIb3dldmVyLCBzaW5jZSBzZWxlY3QoKSBpcworICAgICAgICAgIG5vdCBwb3J0YWJsZSB0byBldmVyeSBwbGF0Zm9ybSwgY2t1Y29uLmMgd2lsbCBiZSBrZXB0CisgICAgICAgICAgaW5kZWZpbml0ZWx5IGZvciB0aG9zZSBwbGF0Zm9ybXMgdGhhdCBjYW4ndCB1c2UgY2t1Y25zLmMuIE5PVEU6CisgICAgICAgICAgU3VuTGluayBYLjI1IHN1cHBvcnQgaXMgYXZhaWxhYmxlIG9ubHkgaW4gY2t1Y29uLmMuCisKKyAgIGNrXyouKiwgY2t1YXQqLioKKyAgICAgICAgICBNb2R1bGVzIGhhdmluZyB0byBkbyB3aXRoIGF1dGhlbnRpY2F0aW9uIGFuZCBlbmNyeXB0aW9uLiBTaW5jZQorICAgICAgICAgIHRoZSByZWxheGF0aW9uIG9mIFVTQSBleHBvcnQgbGF3cywgdGhleSBhcmUgaW5jbHVkZWQgd2l0aCB0aGUKKyAgICAgICAgICBnZW5lcmFsIHNvdXJjZS1jb2RlIGRpc3RyaWJ1dGlvbi4gU2VjdXJlIEMtS2VybWl0IGJpbmFyaWVzIGNhbgorICAgICAgICAgIGJlIGJ1aWx0IHVzaW5nIHNwZWNpYWwgdGFyZ2V0cyBpbiB0aGUgc3RhbmRhcmQgbWFrZWZpbGUuCisgICAgICAgICAgSG93ZXZlciwgc2VjdXJlIHByZWJ1aWx0IGJpbmFyaWVzIG1heSBub3QgYmUgZGlzdHJpYnV0ZWQuCisKKyAgIEZvciBvdGhlciBpbXBsZW1lbnRhdGlvbnMsIHRoZSBmaWxlcyBtYXksIGFuZCBwcm9iYWJseSBkbywgaGF2ZQorICAgZGlmZmVyZW50IG5hbWVzLiBGb3IgZXhhbXBsZSwgdGhlIE1hY2ludG9zaCBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UKKyAgIGZpbGVuYW1lcyBzdGFydCB3aXRoICJja20iLiBLZXJtaXQgOTUgdXNlcyB0aGUgY2t1Y21kIGFuZCBja3V1cyoKKyAgIG1vZHVsZXMsIGJ1dCBoYXMgaXRzIG93biBDT05ORUNUIGNvbW1hbmQgbW9kdWxlcy4gQW5kIHNvIG9uLgorCisgICBIZXJlIGlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgQy1LZXJtaXQncyAidXNlciBpbnRlcmZhY2UgaW50ZXJmYWNlIiwKKyAgIGZyb20gY2t1dXNyLmMuIEl0IGlzIG5vd2hlcmUgbmVhciBjb21wbGV0ZTsgaW4gcGFydGljdWxhciwgaHVuZHJlZHMgb2YKKyAgIGdsb2JhbCB2YXJpYWJsZXMgYXJlIHNoYXJlZCBhbW9uZyB0aGUgbWFueSBtb2R1bGVzLiBUaGVzZSBzaG91bGQsIHNvbWUKKyAgIGRheSwgYmUgY29sbGVjdGVkIGludG8gY2xhc3NlcyBvciBzdHJ1Y3R1cmVzIHRoYXQgY2FuIGJlIHBhc3NlZCBhcm91bmQKKyAgIGFzIG5lZWRlZDsgbm90IG9ubHkgZm9yIHB1cml0eSdzIHNha2UsIGJ1dCBhbHNvIHRvIGFsbG93IGZvciBtdWx0aXBsZQorICAgc2ltdWx0YW5lb3VzIGNvbW11bmljYXRpb24gc2Vzc2lvbnMgYW5kIG9yIHVzZXIgaW50ZXJmYWNlcy4gT3VyIGxpc3QKKyAgIG9mIHRoaW5ncyB0byBkbyBpcyBlbmRsZXNzLCBhbmQgcmVvcmdhbml6aW5nIHRoZSBzb3VyY2UgaXMgYWxtb3N0CisgICBhbHdheXMgYXQgdGhlIGJvdHRvbS4KKworICAgVGhlIGNrdXVzKi5jIG1vZHVsZXMgKGxpa2UgbWFueSBvZiB0aGUgY2tjKi5jIG1vZHVsZXMpIGRlcGVuZCBvbiB0aGUKKyAgIGV4aXN0ZW5jZSBvZiBDIGxpYnJhcnkgZmVhdHVyZXMgbGlrZSBmb3BlbiwgZmdldHMsIGZlb2YsIChmKXByaW50ZiwKKyAgIGFyZ3YvYXJnYywgZXRjLiBPdGhlciBmdW5jdGlvbnMgdGhhdCBhcmUgbGlrZWx5IHRvIHZhcnkgYW1vbmcKKyAgIG9wZXJhdGluZyBzeXN0ZW1zIC0tIGxpa2Ugc2V0dGluZyB0ZXJtaW5hbCBtb2RlcyBvciBpbnRlcnJ1cHRzIC0tIGFyZQorICAgaW52b2tlZCB2aWEgY2FsbHMgdG8gZnVuY3Rpb25zIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIFs5M11Hcm91cCBFCisgICBwbGF0Zm9ybS1kZXBlbmRlbnQgbW9kdWxlcywgY2s/W2Z0XWlvLmMuIFRoZSBjb21tYW5kIGxpbmUgcGFyc2VyCisgICBwcm9jZXNzZXMgYW55IGFyZ3VtZW50cyBmb3VuZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhcyBwYXNzZWQgdG8gbWFpbigpCisgICB2aWEgYXJndi9hcmdjLiBUaGUgaW50ZXJhY3RpdmUgcGFyc2VyIHVzZXMgdGhlIGZhY2lsaXRpZXMgb2YgdGhlIGNtZAorICAgcGFja2FnZSAoZGV2ZWxvcGVkIGZvciB0aGlzIHByb2dyYW0sIGJ1dCwgaW4gdGhlb3J5LCB1c2FibGUgYnkgYW55CisgICBwcm9ncmFtKS4gQW55IGNvbW1hbmQgcGFyc2VyIG1heSBiZSBzdWJzdGl0dXRlZCBmb3IgdGhpcyBvbmUuIFRoZSBvbmx5CisgICByZXF1aXJlbWVudHMgZm9yIHRoZSBLZXJtaXQgY29tbWFuZCBwYXJzZXIgYXJlIHRoZXNlOgorCisgICAgMS4gU2V0IHBhcmFtZXRlcnMgdmlhIGdsb2JhbCB2YXJpYWJsZXMgbGlrZSBkdXBsZXgsIHNwZWVkLCB0dG5hbWUsCisgICAgICAgZXRjLiBTZWUgWzk0XWNrY21haS5jIGZvciB0aGUgZGVjbGFyYXRpb25zIGFuZCBkZXNjcmlwdGlvbnMgb2YKKyAgICAgICB0aGVzZSB2YXJpYWJsZXMuCisgICAgMi4gSWYgYSBjb21tYW5kIGNhbiBiZSBleGVjdXRlZCB3aXRob3V0IHRoZSB1c2Ugb2YgS2VybWl0IHByb3RvY29sLAorICAgICAgIHRoZW4gZXhlY3V0ZSB0aGUgY29tbWFuZCBkaXJlY3RseSBhbmQgc2V0IHRoZSBzc3RhdGUgKHN0YXJ0IHN0YXRlKQorICAgICAgIHZhcmlhYmxlIHRvIDAuIEV4YW1wbGVzIGluY2x1ZGUgU0VUIGNvbW1hbmRzLCBsb2NhbCBkaXJlY3RvcnkKKyAgICAgICBsaXN0aW5ncywgdGhlIENPTk5FQ1QgY29tbWFuZC4KKyAgICAzLiBJZiBhIGNvbW1hbmQgcmVxdWlyZXMgdGhlIEtlcm1pdCBwcm90b2NvbCwgc2V0IHRoZSBmb2xsb3dpbmcKKyAgICAgICB2YXJpYWJsZXM6Cisgc3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZGF0YQorICAgJ3gnIChlbnRlciBzZXJ2ZXIgbW9kZSkgICAgICAgICAgICAobm9uZSkKKyAgICdyJyAoc2VuZCBhICdnZXQnIGNvbW1hbmQpICAgICAgICAgY21hcmcsIGNtYXJnMgorICAgJ3YnIChlbnRlciByZWNlaXZlIG1vZGUpICAgICAgICAgICBjbWFyZzIKKyAgICdnJyAoc2VuZCBhIGdlbmVyaWMgY29tbWFuZCkgICAgICAgY21hcmcKKyAgICdzJyAoc2VuZCBmaWxlcykgICAgICAgICAgICAgICAgICAgbmZpbHMsIGNtYXJnICYgY21hcmcyIE9SIGNtbGlzdAorICAgJ2MnIChzZW5kIGEgcmVtb3RlIGhvc3QgY29tbWFuZCkgICBjbWFyZworCisgICAgICAgY21saXN0IGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHN0cmluZ3MuCisgICAgICAgY21hcmcsIGNtYXJnMiBhcmUgcG9pbnRlcnMgdG8gc3RyaW5ncy4KKyAgICAgICBuZmlscyBpcyBhbiBpbnRlZ2VyIChobW1tLCBwcm9iYWJseSBzaG91bGQgYmUgYW4gdW5zaWduZWQgbG9uZykuCisKKyAgICAgICAgY21hcmcgY2FuIGJlOgorICAgICAgICAgICAgICAgIEEgZmlsZW5hbWUgc3RyaW5nIChwb3NzaWJseSB3aWxkKSwgb3I6CisgICAgICAgICAgICAgICAgYSBwb2ludGVyIHRvIGEgcHJlZmFicmljYXRlZCBnZW5lcmljIGNvbW1hbmQgc3RyaW5nLCBvcjoKKyAgICAgICAgICAgICAgICBhIHBvaW50ZXIgdG8gYSBob3N0IGNvbW1hbmQgc3RyaW5nLgorCisgICAgICAgIGNtYXJnMiBpczoKKyAgICAgICAgICAgICAgICBUaGUgbmFtZSB0byBzZW5kIGEgc2luZ2xlIGZpbGUgdW5kZXIsIG9yOgorICAgICAgICAgICAgICAgIHRoZSBuYW1lIHVuZGVyIHdoaWNoIHRvIHN0b3JlIGFuIGluY29taW5nIGZpbGU7IG11c3Qgbm90CisgICAgICAgICAgICAgICAgYmUgd2lsZC4KKyAgICAgICAgICAgICAgICBJZiBpdCdzIHRoZSBuYW1lIGZvciByZWNlaXZpbmcsIGEgbnVsbCB2YWx1ZSBtZWFucyB0bworICAgICAgICAgICAgICAgIHN0b3JlIHRoZSBmaWxlIHVuZGVyIHRoZSBuYW1lIGl0IGFycml2ZXMgd2l0aC4KKworICAgICAgICBjbWxpc3QgaXM6CisgICAgICAgICAgICAgICAgQSBsaXN0IG9mIG5vbndpbGQgZmlsZW5hbWVzLCBzdWNoIGFzIHBhc3NlZCB2aWEgYXJndi4KKworICAgICAgICBuZmlscyBpcyBhbiBpbnRlZ2VyLCBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIC0xOiBmaWxlc3BlYyAocG9zc2libHkgd2lsZCkgaW4gY21hcmcsIG11c3QgYmUgZXhwYW5kZWQKKyAgICAgICAgICAgICAgICBpbnRlcm5hbGx5LgorICAgICAgICAgICAgICAgIDA6IHNlbmQgZnJvbSBzdGRpbiAoc3RhbmRhcmQgaW5wdXQpLgorICAgICAgICAgICAgICAgID4wOiBudW1iZXIgb2YgZmlsZXMgdG8gc2VuZCwgZnJvbSBjbWxpc3QuCisKKyAgIFRoZSBzY3JlZW4oKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgc2NyZWVuIGR1cmluZyBmaWxlCisgICB0cmFuc2Zlci4gVGhlIHRsb2coKSBmdW5jdGlvbiB3cml0ZXMgdG8gYSB0cmFuc2FjdGlvbiBsb2cgKGlmIFRMT0cgaXMKKyAgIGRlZmluZWQpLiBUaGUgZGVidWcoKSBmdW5jdGlvbiB3cml0ZXMgdG8gYSBkZWJ1Z2dpbmcgbG9nIChpZiBERUJVRyBpcworICAgZGVmaW5lZCkuIFRoZSBpbnRtc2coKSBhbmQgY2hraW50KCkgZnVuY3Rpb25zIHByb3ZpZGUgdGhlIHVzZXIgaS9vIGZvcgorICAgaW50ZXJydXB0aW5nIGZpbGUgdHJhbnNmZXJzLgorCisgICBbIFs5NV1Db250ZW50cyBdIFsgWzk2XUMtS2VybWl0IF0gWyBbOTddS2VybWl0IEhvbWUgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDQuRS4gR3JvdXAgRTogUGxhdGZvcm0tRGVwZW5kZW50IEkvTworCisgICBQbGF0Zm9ybS1kZXBlbmRlbnQgZnVuY3Rpb24gZGVmaW5pdGlvbnMuIEFsbCB0aGUgS2VybWl0IG1vZHVsZXMsCisgICBpbmNsdWRpbmcgdGhlIGNvbW1hbmQgcGFja2FnZSwgY2FsbCB1cG9uIHRoZXNlIGZ1bmN0aW9ucywgd2hpY2ggYXJlCisgICBkZXNpZ25lZCB0byBwcm92aWRlIHN5c3RlbS1pbmRlcGVuZGVudCBwcmltaXRpdmVzIGZvciBjb250cm9sbGluZyBhbmQKKyAgIG1hbmlwdWxhdGluZyBkZXZpY2VzIGFuZCBmaWxlcy4gRm9yIFVuaXgsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZAorICAgaW4gdGhlIGZpbGVzIFs5OF1ja3VmaW8uYyAoZmlsZXMpLCBbOTldY2t1dGlvLmMgKGNvbW11bmljYXRpb25zKSwgYW5kCisgICBbMTAwXWNrdXNpZy5jIChzaWduYWwgaGFuZGxpbmcpLgorCisgICBGb3IgVk1TLCB0aGUgZmlsZXMgYXJlIFsxMDFdY2t2ZmlvLmMsIGNrdnRpby5jLCBhbmQgWzEwMl1ja3VzaWcuYyAoVk1TCisgICBjYW4gdXNlIHRoZSBzYW1lIHNpZ25hbCBoYW5kbGluZyByb3V0aW5lcyBhcyBVbml4KS4gSXQgZG9lc24ndCByZWFsbHkKKyAgIG1hdHRlciB3aGF0IHRoZSBmaWxlcyBhcmUgY2FsbGVkLCBleGNlcHQgZm9yIEtlcm1pdCBkaXN0cmlidXRpb24KKyAgIHB1cnBvc2VzIChncm91cGluZyByZWxhdGVkIGZpbGVzIHRvZ2V0aGVyIGFscGhhYmV0aWNhbGx5KSwgb25seSB0aGF0CisgICBlYWNoIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdpdGggdGhlIG5hbWUgaW5kaWNhdGVkLCBvYnNlcnZlcyB0aGUgc2FtZQorICAgY2FsbGluZyBhbmQgcmV0dXJuIGNvbnZlbnRpb25zLCBhbmQgaGFzIHRoZSBzYW1lIHR5cGUuCisKKyAgIFRoZSBHcm91cCBFIG1vZHVsZXMgY29udGFpbiBib3RoIGZ1bmN0aW9ucyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0CisgICBhcmUgYWNjZXNzZWQgYnkgbW9kdWxlcyBpbiB0aGUgb3RoZXIgZ3JvdXBzLiBUaGVzZSBhcmUgbm93IGRlc2NyaWJlZC4KKworICAgKEJ5IHRoZSB3YXksIEkgZ290IHRoaXMgbGlzdCBieSBsaW5raW5nIGFsbCB0aGUgQy1LZXJtaXQgbW9kdWxlcworICAgdG9nZXRoZXIgZXhjZXB0IGNrdXRpbyBhbmQgY2t1ZmlvLiBUaGVzZSBhcmUgdGhlIHN5bWJvbHMgdGhhdCBsZAorICAgcmVwb3J0ZWQgYXMgdW5kZWZpbmVkLiBCdXQgdGhhdCB3YXMgYSBsb25nIHRpbWUgYWdvLCBwcm9iYWJseSBjaXJjYQorICAgVmVyc2lvbiA2LikKKworICA0LkUuMS4gR2xvYmFsIFZhcmlhYmxlcworCisgICBjaGFyICpERUxDTUQ7CisgICAgICAgICAgUG9pbnRlciB0byBzdHJpbmcgY29udGFpbmluZyBjb21tYW5kIGZvciBkZWxldGluZyBmaWxlcy4KKyAgICAgICAgICBFeGFtcGxlOiBjaGFyICpERUxDTUQgPSAicm0gLWYgIjsgKFVOSVgpCisgICAgICAgICAgRXhhbXBsZTogY2hhciAqREVMQ01EID0gImRlbGV0ZSAiOyAoVk1TKQorICAgICAgICAgIE5vdGUgdHJhaWxpbmcgc3BhY2UuIEZpbGVuYW1lIGlzIGNvbmNhdGVuYXRlZCB0byBlbmQgb2YgdGhpcworICAgICAgICAgIHN0cmluZy4gTk9URTogREVMQ01EIGlzIHVzZWQgb25seSBpbiB2ZXJzaW9ucyB0aGF0IGRvIG5vdAorICAgICAgICAgIHByb3ZpZGUgdGhlaXIgb3duIGJ1aWx0LWluIERFTEVURSBjb21tYW5kLgorCisgICBjaGFyICpESVJDTUQ7CisgICAgICAgICAgUG9pbnRlciB0byBzdHJpbmcgY29udGFpbmluZyBjb21tYW5kIGZvciBsaXN0aW5nIGZpbGVzIHdoZW4gYQorICAgICAgICAgIGZpbGVzcGVjIGlzIGdpdmVuLgorICAgICAgICAgIEV4YW1wbGU6IGNoYXIgKkRJUkNNRCA9ICIvYmluL2xzIC1sICI7IChVTklYKQorICAgICAgICAgIEV4YW1wbGU6IGNoYXIgKkRJUkNNRCA9ICJkaXJlY3RvcnkgIjsgKFZNUykKKyAgICAgICAgICBOb3RlIHRyYWlsaW5nIHNwYWNlLiBGaWxlbmFtZSBpcyBjb25jYXRlbmF0ZWQgdG8gZW5kIG9mIHRoaXMKKyAgICAgICAgICBzdHJpbmcuIE5PVEU6IERJUkNNRCBpcyB1c2VkIG9ubHkgaW4gdmVyc2lvbnMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwcm92aWRlIHRoZWlyIG93biBidWlsdC1pbiBESVJFQ1RPUlkgY29tbWFuZC4KKworICAgY2hhciAqRElSQ00yOworICAgICAgICAgIFBvaW50ZXIgdG8gc3RyaW5nIGNvbnRhaW5pbmcgY29tbWFuZCBmb3IgbGlzdGluZyBmaWxlcyB3aGVuIGEKKyAgICAgICAgICBmaWxlc3BlYyBpcyBub3QgZ2l2ZW4uIChjdXJyZW50bHkgbm90IHVzZWQsIGhhbmRsZWQgaW4gYW5vdGhlcgorICAgICAgICAgIHdheS4pCisgICAgICAgICAgRXhhbXBsZTogY2hhciAqRElSQ01EMiA9ICIvYmluL2xzIC1sZCAqIjsKKyAgICAgICAgICBOT1RFOiBESVJDTUQyIGlzIHVzZWQgb25seSBpbiB2ZXJzaW9ucyB0aGF0IGRvIG5vdCBwcm92aWRlCisgICAgICAgICAgdGhlaXIgb3duIGJ1aWx0LWluIERJUkVDVE9SWSBjb21tYW5kLgorCisgICBjaGFyICpQV0RDTUQ7CisgICAgICAgICAgUG9pbnRlciB0byBzdHJpbmcgY29udGFpbmluZyBjb21tYW5kIHRvIGRpc3BsYXkgY3VycmVudAorICAgICAgICAgIGRpcmVjdG9yeS4KKyAgICAgICAgICBFeGFtcGxlOiBjaGFyICpQV0RDTUQgPSAicHdkICI7CisgICAgICAgICAgTk9URTogUFdEQ01EIGlzIHVzZWQgb25seSBpbiB2ZXJzaW9ucyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZWlyCisgICAgICAgICAgb3duIGJ1aWx0LWluIFBXRCBjb21tYW5kLgorCisgICBjaGFyICpTUEFDTUQ7CisgICAgICAgICAgUG9pbnRlciB0byBjb21tYW5kIHRvIGRpc3BsYXkgZnJlZSBkaXNrIHNwYWNlIGluIGN1cnJlbnQKKyAgICAgICAgICBkZXZpY2UvZGlyZWN0b3J5LgorICAgICAgICAgIEV4YW1wbGU6IGNoYXIgKlNQQUNNRCA9ICJkZiAuIjsKKyAgICAgICAgICBOT1RFOiBTUEFDTUQgaXMgdXNlZCBvbmx5IGluIHZlcnNpb25zIHRoYXQgZG8gbm90IHByb3ZpZGUgdGhlaXIKKyAgICAgICAgICBvd24gYnVpbHQtaW4gU1BBQ0UgY29tbWFuZC4KKworICAgY2hhciAqU1BBQ00yOworICAgICAgICAgIFBvaW50ZXIgdG8gY29tbWFuZCB0byBkaXNwbGF5IGZyZWUgZGlzayBzcGFjZSBpbiBhbm90aGVyCisgICAgICAgICAgZGV2aWNlL2RpcmVjdG9yeS4KKyAgICAgICAgICBFeGFtcGxlOiBjaGFyICpTUEFDTTIgPSAiZGYgIjsKKyAgICAgICAgICBOb3RlIHRyYWlsaW5nIHNwYWNlLiBEZXZpY2Ugb3IgZGlyZWN0b3J5IG5hbWUgaXMgYWRkZWQgdG8gdGhpcworICAgICAgICAgIHN0cmluZy4gTk9URTogU1BBQ01EMiBpcyB1c2VkIG9ubHkgaW4gdmVyc2lvbnMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwcm92aWRlIHRoZWlyIG93biBidWlsdC1pbiBTUEFDRSBjb21tYW5kLgorCisgICBjaGFyICpUWVBDTUQ7CisgICAgICAgICAgUG9pbnRlciB0byBjb21tYW5kIGZvciBkaXNwbGF5aW5nIHRoZSBjb250ZW50cyBvZiBhIGZpbGUuCisgICAgICAgICAgRXhhbXBsZTogY2hhciAqVFlQQ01EID0gImNhdCAiOworICAgICAgICAgIE5vdGUgdHJhaWxpbmcgc3BhY2UuIERldmljZSBvciBkaXJlY3RvcnkgbmFtZSBpcyBhZGRlZCB0byB0aGlzCisgICAgICAgICAgc3RyaW5nLiBOT1RFOiBUWVBDTUQgaXMgdXNlZCBvbmx5IGluIHZlcnNpb25zIHRoYXQgZG8gbm90CisgICAgICAgICAgcHJvdmlkZSB0aGVpciBvd24gYnVpbHQtaW4gVFlQRSBjb21tYW5kLgorCisgICBjaGFyICpXSE9DTUQ7CisgICAgICAgICAgUG9pbnRlciB0byBjb21tYW5kIGZvciBkaXNwbGF5aW5nIGxvZ2dlZC1pbiB1c2Vycy4KKyAgICAgICAgICBFeGFtcGxlOiBjaGFyICpXSE9DTUQgPSAid2hvICI7CisgICAgICAgICAgTm90ZSB0cmFpbGluZyBzcGFjZS4gU3BlY2lmaWMgdXNlciBuYW1lIG1heSBiZSBhZGRlZCB0byB0aGlzCisgICAgICAgICAgc3RyaW5nLgorCisgICBpbnQgYmFja2dyZCA9IDA7CisgICAgICAgICAgRmxhZyBmb3Igd2hldGhlciBwcm9ncmFtIGlzIHJ1bm5pbmcgaW4gZm9yZWdyb3VuZCAoMCkgb3IKKyAgICAgICAgICBiYWNrZ3JvdW5kIChub256ZXJvKS4gQmFja2dyb3VuZCBvcGVyYXRpb24gaW1wbGllcyB0aGF0IHNjcmVlbgorICAgICAgICAgIG91dHB1dCBzaG91bGQgbm90IGJlIGRvbmUgYW5kIHRoYXQgYWxsIGVycm9ycyBzaG91bGQgYmUgZmF0YWwuCisKKyAgIGludCBja3hlY2g7CisgICAgICAgICAgRmxhZyBmb3Igd2hvIGlzIHRvIGVjaG8gY29uc29sZSB0eXBlaW46CisgICAgICAgICAgMTogVGhlIHByb2dyYW0gKHN5c3RlbSBpcyBub3QgZWNob2luZykuCisgICAgICAgICAgMDogVGhlIE9TLCBmcm9udCBlbmQsIHRlcm1pbmFsLCBldGMgKG5vdCB0aGlzIHByb2dyYW0pLgorCisgICBjaGFyICpja3hzeXM7CisgICAgICAgICAgUG9pbnRlciB0byBzdHJpbmcgdGhhdCBuYW1lcyB0aGUgY29tcHV0ZXIgYW5kIG9wZXJhdGluZyBzeXN0ZW0uCisgICAgICAgICAgRXhhbXBsZTogY2hhciAqY2t4c3lzID0gIiBOZVhUIE1hY2ggMS4wIjsKKyAgICAgICAgICBUZWxscyB3aGF0IGNvbXB1dGVyIHN5c3RlbSBja3h2IGFwcGxpZXMgdG8uIEluIFVOSVggS2VybWl0LAorICAgICAgICAgIHRoaXMgdmFyaWFibGUgaXMgYWxzbyB1c2VkIHRvIHByaW50IHRoZSBwcm9ncmFtIGhlcmFsZCwgYW5kIGluCisgICAgICAgICAgdGhlIFNIT1cgVkVSU0lPTiBjb21tYW5kLgorCisgICBjaGFyICpja3h2OworICAgICAgICAgIFBvaW50ZXIgdG8gdmVyc2lvbi9lZGl0IGluZm8gb2YgY2s/dGlvLmMgbW9kdWxlLgorICAgICAgICAgIEV4YW1wbGU6IGNoYXIgKmNreHYgPSAiVU5JWCBDb21tdW5pY2F0aW9ucyBTdXBwb3J0LCA2LjAuMTY5LCA2CisgICAgICAgICAgU2VwIDk2IjsKKyAgICAgICAgICBVc2VkIGJ5IFNIT1cgVkVSU0lPTiBjb21tYW5kLgorCisgICBjaGFyICpja3pzeXM7CisgICAgICAgICAgTGlrZSBja3hzeXMsIGJ1dCBicmllZmVyLgorICAgICAgICAgIEV4YW1wbGU6IGNoYXIgKmNrenN5cyA9ICIgNC4zIEJTRCI7CisgICAgICAgICAgVGVsbHMgd2hhdCBwbGF0Zm9ybSBja3p2IGFwcGxpZXMgdG8uIFVzZWQgYnkgdGhlIFNIT1cgVkVSU0lPTgorICAgICAgICAgIGNvbW1hbmQuCisKKyAgIGNoYXIgKmNrenY7CisgICAgICAgICAgUG9pbnRlciB0byB2ZXJzaW9uL2VkaXQgaW5mbyBvZiBjaz9maW8uYyBtb2R1bGUuCisgICAgICAgICAgRXhhbXBsZTogY2hhciAqY2t6diA9ICJVTklYIEZpbGUgc3VwcG9ydCwgNi4wLjExMywgNiBTZXAgOTYiOworICAgICAgICAgIFVzZWQgYnkgU0hPVyBWRVJTSU9OIGNvbW1hbmQuCisKKyAgIGludCBkZmZsb3c7CisgICAgICAgICAgRGVmYXVsdCBmbG93IGNvbnRyb2wuIDAgPSBub25lLCAxID0gWG9uL1hvZmYsIC4uLiAoc2VlIEZMT194eHgKKyAgICAgICAgICBzeW1ib2xzIGluIGNrY2RlYi5oKQorICAgICAgICAgIFNldCBieSBHcm91cCBFIG1vZHVsZS4gVXNlZCBieSBbMTAzXWNrY21haS5jIHRvIGluaXRpYWxpemUgZmxvdworICAgICAgICAgIGNvbnRyb2wgdmFyaWFibGUuCisKKyAgIGludCBkZmxvYzsKKyAgICAgICAgICBEZWZhdWx0IGxvY2F0aW9uLiAwID0gcmVtb3RlLCAxID0gbG9jYWwuIFNldCBieSBHcm91cCBFIG1vZHVsZS4KKyAgICAgICAgICBVc2VkIGJ5IGNrY21haS5jIHRvIGluaXRpYWxpemUgbG9jYWwgdmFyaWFibGUuIFVzZWQgaW4gdmFyaW91cworICAgICAgICAgIHBsYWNlcyBpbiB0aGUgdXNlciBpbnRlcmZhY2UuCisKKyAgIGludCBkZnBydHk7CisgICAgICAgICAgRGVmYXVsdCBwYXJpdHkuIDAgPSBub25lLCAnZScgPSBldmVuLCAnbycgPSBvZGQsICdtJyA9IG1hcmssCisgICAgICAgICAgJ3MnID0gc3BhY2UuIFNldCBieSBHcm91cCBFIG1vZHVsZS4gVXNlZCBieSBja2NtYWkuYyB0bworICAgICAgICAgIGluaXRpYWxpemUgcGFyaXR5IHZhcmlhYmxlLgorCisgICBjaGFyICpkZnR0eTsKKyAgICAgICAgICBEZWZhdWx0IGNvbW11bmljYXRpb24gZGV2aWNlLiBTZXQgYnkgR3JvdXAgRSBtb2R1bGUuIFVzZWQgaW4KKyAgICAgICAgICBtYW55IHBsYWNlcy4gVGhpcyB2YXJpYWJsZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdGhlIHRoZSBzeW1ib2wKKyAgICAgICAgICBDVFROQU0sIHdoaWNoIGlzIGRlZmluZWQgaW4gY2tjZGViLmgsIGUuZy4gYXMgIi9kZXYvdHR5IiBmb3IKKyAgICAgICAgICBVTklYLCAiVFQ6IiBmb3IgVk1TLCBldGMuIEV4YW1wbGU6IGNoYXIgKmRmdHR5ID0gQ1RUTkFNOworCisgICBjaGFyICptdGNoc1tdOworICAgICAgICAgIEFycmF5IG9mIHN0cmluZyBwb2ludGVycyB0byBmaWxlbmFtZXMgdGhhdCBtYXRjaGVkIHRoZSBtb3N0CisgICAgICAgICAgcmVjZW50IHdpbGRjYXJkIG1hdGNoLCBpLmUuIHRoZSBtb3N0IHJlY2VudCBjYWxsIHRvIHp4cGFuZCgpLgorICAgICAgICAgIFVzZWQgKGF0IGxlYXN0KSBieSBjb21tYW5kIHBhcnNpbmcgcGFja2FnZSBmb3IgcGFydGlhbCBmaWxlbmFtZQorICAgICAgICAgIGNvbXBsZXRpb24uCisKKyAgIGludCB0aWxkZV9leHBhbmQ7CisgICAgICAgICAgRmxhZyBmb3Igd2hldGhlciB0byBhdHRlbXB0IHRvIGV4cGFuZCBsZWFkaW5nIHRpbGRlcyBpbgorICAgICAgICAgIGRpcmVjdG9yeSBuYW1lcyAodXNlZCBpbiBVTklYIG9ubHksIGFuZCB0aGVuIG9ubHkgd2hlbiB0aGUKKyAgICAgICAgICBzeW1ib2wgRFRJTERFIGlzIGRlZmluZWQuCisKKyAgIGludCB0dG5wcm90bzsKKyAgICAgICAgICBUaGUgcHJvdG9jb2wgYmVpbmcgdXNlZCB0byBjb21tdW5pY2F0ZSBvdmVyIGEgbmV0d29yayBkZXZpY2UuCisgICAgICAgICAgVmFsdWVzIGFyZSBkZWZpbmVkIGluIGNrY25ldC5oLiBFeGFtcGxlOiBOUF9URUxORVQgaXMgbmV0d29yaworICAgICAgICAgIHByb3RvY29sICJ0ZWxuZXQiLgorCisgICBpbnQgbWF4bmFtOworICAgICAgICAgIFRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgYSBmaWxlbmFtZSwgZXhjbHVzaXZlIG9mIGFueSBkZXZpY2Ugb3IKKyAgICAgICAgICBkaXJlY3RvcnkgaW5mb3JtYXRpb24sIGluIHRoZSBmb3JtYXQgb2YgdGhlIGhvc3Qgb3BlcmF0aW5nCisgICAgICAgICAgc3lzdGVtLgorCisgICBpbnQgbWF4cGF0aDsKKyAgICAgICAgICBUaGUgbWF4aW11bSBsZW5ndGggZm9yIGEgZnVsbHkgc3BlY2lmaWVkIGZpbGVuYW1lLCBpbmNsdWRpbmcKKyAgICAgICAgICBkZXZpY2UgZGVzaWduYXRvciwgZGlyZWN0b3J5IG5hbWUsIG5ldHdvcmsgbm9kZSBuYW1lLCBldGMsIGluCisgICAgICAgICAgdGhlIGZvcm1hdCBvZiB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaW5jbHVkaW5nIGFsbAorICAgICAgICAgIHB1bmN0dWF0aW9uLgorCisgICBpbnQgdHR5ZmQ7CisgICAgICAgICAgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBjb21tdW5pY2F0aW9uIGRldmljZS4gLTEgaWYgdGhlcmUgaXMgbm8KKyAgICAgICAgICBvcGVuIG9yIHVzYWJsZSBjb25uZWN0aW9uLCBpbmNsdWRpbmcgd2hlbiBDLUtlcm1pdCBpcyBpbiByZW1vdGUKKyAgICAgICAgICBtb2RlLiBTaW5jZSB0aGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBldmVyeXdoZXJlLCByZWZlcmVuY2VzIHRvCisgICAgICAgICAgaXQgYXJlIGluICNpZmRlZiBDS19UVFlGRC4uI2VuZGlmLgorCisgICBbIFsxMDRdQ29udGVudHMgXSBbIFsxMDVdQy1LZXJtaXQgXSBbIFsxMDZdS2VybWl0IEhvbWUgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDQuRS4yLiBGdW5jdGlvbnMKKworICAgVGhlc2UgYXJlIGRpdmlkZWQgaW50byB0aHJlZSBjYXRlZ29yaWVzOiBmaWxlLXJlbGF0ZWQgZnVuY3Rpb25zIChCLjEpLAorICAgY29tbXVuaWNhdGlvbiBmdW5jdGlvbnMgKEIuMiksIGFuZCBtaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAoQi4zKS4KKworICAgIDQuRS4yLjEuIEZpbGUtUmVsYXRlZCBGdW5jdGlvbnMKKworICAgSW4gbW9zdCBpbXBsZW1lbnRhdGlvbnMsIHRoZXNlIGFyZSBjb2xsZWN0ZWQgdG9nZXRoZXIgaW50byBhIG1vZHVsZQorICAgY2FsbGVkIGNrP2Zpby5jLCB3aGVyZSA/ID0gInUiIChbMTA3XWNrdXRpby5jIGZvciBVbml4KSwgInYiCisgICAoWzEwOF1ja3Z0aW8uYyBmb3IgVk1TKSwgWzEwOV1ldGMuIFRvIGJlIHRvdGFsbHkgcGxhdGZvcm0taW5kZXBlbmRlbnQsCisgICBDLUtlcm1pdCBtYWludGFpbnMgaXRzIG93biBmaWxlIG51bWJlcnMsIGFuZCBwcm92aWRlcyB0aGUgZnVuY3Rpb25zCisgICBkZXNjcmliZWQgaW4gdGhpcyBzZWN0aW9uIHRvIGRlYWwgd2l0aCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCisgICBUaGUgZmlsZSBudW1iZXJzIGFyZSByZWZlcnJlZCB0byBzeW1ib2xpY2FsbHksIGFuZCBhcmUgZGVmaW5lZCBhcworICAgZm9sbG93cyBpbiBja2NrZXIuaDoKKworICAjZGVmaW5lIFpDVEVSTSAgICAgIDAgICAgICAgICAgIC8qIENvbnNvbGUgdGVybWluYWwgKi8KKyAgI2RlZmluZSBaU1RESU8gICAgICAxICAgICAgICAgICAvKiBTdGFuZGFyZCBpbnB1dC9vdXRwdXQgKi8KKyAgI2RlZmluZSBaSUZJTEUgICAgICAyICAgICAgICAgICAvKiBDdXJyZW50IGlucHV0IGZpbGUgZm9yIFNFTkQgY29tbWFuZCAqLworICAjZGVmaW5lIFpPRklMRSAgICAgIDMgICAgICAgICAgIC8qIEN1cnJlbnQgb3V0cHV0IGZpbGUgZm9yIFJFQ0VJVkUgY29tbWFuZCAqLworICAjZGVmaW5lIFpERklMRSAgICAgIDQgICAgICAgICAgIC8qIEN1cnJlbnQgZGVidWdnaW5nIGxvZyBmaWxlICovCisgICNkZWZpbmUgWlRGSUxFICAgICAgNSAgICAgICAgICAgLyogQ3VycmVudCB0cmFuc2FjdGlvbiBsb2cgZmlsZSAqLworICAjZGVmaW5lIFpQRklMRSAgICAgIDYgICAgICAgICAgIC8qIEN1cnJlbnQgcGFja2V0IGxvZyBmaWxlICovCisgICNkZWZpbmUgWlNGSUxFICAgICAgNyAgICAgICAgICAgLyogQ3VycmVudCBzZXNzaW9uIGxvZyBmaWxlICovCisgICNkZWZpbmUgWlNZU0ZOICAgICAgOCAgICAgICAgICAgLyogSW5wdXQgZnJvbSBhIHN5c3RlbSBmdW5jdGlvbiAocGlwZSkgKi8KKyAgI2RlZmluZSBaUkZJTEUgICAgICA5ICAgICAgICAgICAvKiBMb2NhbCBmaWxlIGZvciBSRUFEIGNvbW1hbmQgKi8gIChORVcpCisgICNkZWZpbmUgWldGSUxFICAgICAxMCAgICAgICAgICAgLyogTG9jYWwgZmlsZSBmb3IgV1JJVEUgY29tbWFuZCAqLyAoTkVXKQorICAjZGVmaW5lIFpNRklMRSAgICAgMTEgICAgICAgICAgIC8qIEF1eGlsbGlhcnkgZmlsZSBmb3IgaW50ZXJuYWwgdXNlICovIChORVcpCisgICNkZWZpbmUgWk5GSUxTICAgICAxMiAgICAgICAgICAgLyogSG93IG1hbnkgZGVmaW5lZCBmaWxlIG51bWJlcnMgKi8KKworICAgSW4gdGhlIGRlc2NyaXB0aW9ucyBiZWxvdywgZm4gcmVmZXJzIHRvIGEgZmlsZW5hbWUsIGFuZCBuIHJlZmVycyB0bworICAgb25lIG9mIHRoZXNlIGZpbGUgbnVtYmVycy4gRnVuY3Rpb25zIGFyZSBvZiB0eXBlIGludCB1bmxlc3Mgb3RoZXJ3aXNlCisgICBub3RlZCwgYW5kIGFyZSBsaXN0ZWQgbW9zdGx5IGFscGhhYmV0aWNhbGx5LgorCisgICBpbnQKKyAgICAgICAgICBjaGtmbihuKSBpbnQgbjsKKyAgICAgICAgICBDaGVja3MgdGhlIGZpbGUgbnVtYmVyIG4uIFJldHVybnM6CisgICAgICAgICAgIC0xOiBGaWxlIG51bWJlciBuIGlzIG91dCBvZiByYW5nZQorICAgICAgICAgICAgMDogbiBpcyBpbiByYW5nZSwgYnV0IGZpbGUgaXMgbm90IG9wZW4KKyAgICAgICAgICAgIDE6IG4gaW4gcmFuZ2UgYW5kIGZpbGUgaXMgb3BlbgorCisgICBpbnQKKyAgICAgICAgICBpc3dpbGQoZmlsc3BlYykgY2hhciAqZmlsZXNwZWM7CisgICAgICAgICAgQ2hlY2tzIGlmIHRoZSBmaWxlIHNwZWNpZmljYXRpb24gaXMgIndpbGQiLCBpLmUuIGNvbnRhaW5zCisgICAgICAgICAgbWV0YWNoYXJhY3RlcnMgb3Igb3RoZXIgbm90YXRpb25zIGludGVuZGVkIHRvIG1hdGNoIG11bHRpcGxlCisgICAgICAgICAgZmlsZW5hbWVzLiBSZXR1cm5zOgorICAgICAgICAgICAgMDogbm90IHdpbGQKKyAgICAgICAgICAgIDE6IHdpbGQuCisKKyAgIGludAorICAgICAgICAgIGlzZGlyKHN0cmluZykgY2hhciAqc3RyaW5nOworICAgICAgICAgIENoZWNrcyBpZiB0aGUgc3RyaW5nIGlzIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4gVGhlCisgICAgICAgICAgaWRlYSBpcyB0byBjaGVjayB3aGV0aGVyIHRoZSBzdHJpbmcgY2FuIGJlICJjZCdkIiB0bywgc28gaW4KKyAgICAgICAgICBzb21lIGNhc2VzIChlLmcuIERPUykgaXQgbWlnaHQgYWxzbyBpbmRpY2F0ZSBhbnkgZmlsZQorICAgICAgICAgIHN0cnVjdHVyZWQgZGV2aWNlLCBzdWNoIGFzIGEgZGlzayBkcml2ZSAobGlrZSBBOikuIE90aGVyCisgICAgICAgICAgbm9uemVybyByZXR1cm5zIGluZGljYXRlIHN5c3RlbS1kZXBlbmRlbnQgaW5mb3JtYXRpb247IGUuZy4gaW4KKyAgICAgICAgICBWTVMgaXNkaXIoIlsuRk9PXSIpIHJldHVybnMgMSBidXQgaXNkaXIoIkZPTy5ESVI7MSIpIHJldHVybnMgMgorICAgICAgICAgIHRvIGluZGljYXRlIHRoZSBkaXJlY3RvcnktZmlsZSBuYW1lIGlzIGluIGEgZm9ybWF0IHRoYXQgbmVlZHMKKyAgICAgICAgICBjb252ZXJzaW9uIGJlZm9yZSBpdCBjYW4gYmUgY29tYmluZWQgd2l0aCBhIGZpbGVuYW1lLiBSZXR1cm5zOgorICAgICAgICAgICAgMDogbm90IGEgZGlyZWN0b3J5IChpbmNsdWRpbmcgYW55IGtpbmQgb2YgZXJyb3IpCisgICAgICAgICAgICAxOiBpdCBpcyBhbiBleGlzdGluZyBkaXJlY3RvcnkKKworICAgY2hhciAqCisgICAgICAgICAgemZjZGF0KG5hbWUpIGNoYXIgKm5hbWU7CisgICAgICAgICAgUmV0dXJucyBtb2RpZmljYXRpb24gKHByZWZlcmFibHksIG90aGVyd2lzZSBjcmVhdGlvbikgZGF0ZS90aW1lCisgICAgICAgICAgb2YgZmlsZSB3aG9zZSBuYW1lIGlzIGdpdmVuIGluIHRoZSBhcmd1bWVudCBzdHJpbmcuIFJldHVybgorICAgICAgICAgIHZhbHVlIGlzIGEgcG9pbnRlciB0byBhIHN0cmluZyBvZiB0aGUgZm9ybSB5eXl5bW1kZCBoaDptbTpzcywKKyAgICAgICAgICBmb3IgZXhhbXBsZSAxOTkzMTIzMSAyMzo1OTo1OSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgbG9jYWwgdGltZQorICAgICAgICAgIChubyB0aW1lem9uZSBvciBkYXlsaWdodCBzYXZpbmdzIHRpbWUgZmluYWdsaW5nIHJlcXVpcmVkKS4KKyAgICAgICAgICBSZXR1cm5zIHRoZSBudWxsIHN0cmluZyAoIiIpIG9uIGZhaWx1cmUuIFRoZSB0ZXh0IHBvaW50ZWQgdG8gYnkKKyAgICAgICAgICB0aGUgc3RyaW5nIHBvaW50ZXIgbWlnaHQgYmUgaW4gYSBzdGF0aWMgYnVmZmVyLCBhbmQgc28gc2hvdWxkCisgICAgICAgICAgYmUgY29waWVkIHRvIGEgc2FmZSBwbGFjZSBieSB0aGUgY2FsbGVyIGJlZm9yZSBhbnkgc3Vic2VxdWVudAorICAgICAgICAgIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisKKyAgIHN0cnVjdCB6Zm5mcCAqCisgICAgICAgICAgemZucWZwKGZuLCBidWZsZW4sIGJ1ZikgY2hhciAqIGZuOyBpbnQgYnVmbGVuOyBjaGFyICogYnVmOworICAgICAgICAgIEdpdmVuIHRoZSBmaWxlbmFtZSBmbiwgdGhlIGNvcnJlc3BvbmRpbmcgZnVsbHkgcXVhbGlmaWVkLAorICAgICAgICAgIGFic29sdXRlIGZpbGVuYW1lIGlzIHBsYWNlZCBpbnRvIHRoZSBidWZmZXIgYnVmLCB3aG9zZSBsZW5ndGgKKyAgICAgICAgICBpcyBidWZsZW4uIE9uIGZhaWx1cmUgcmV0dXJucyBhIE5VTEwgcG9pbnRlci4gT24gc3VjY2VzcworICAgICAgICAgIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RydWN0IHpmbmZwIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gdGhlCisgICAgICAgICAgZnVsbCBwYXRobmFtZSBhbmQgdG8ganVzdCB0aGUgZmlsZW5hbWUsIGFuZCBhbiBpbnQgZ2l2aW5nIHRoZQorICAgICAgICAgIGxlbmd0aCBvZiB0aGUgZnVsbCBwYXRobmFtZS4gQWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBmdW5jdGlvbiBpbgorICAgICAgICAgIG1haW5saW5lIGNvZGUgbXVzdCBiZSBwcm90ZWN0ZWQgYnkgI2lmZGVmIFpGTlFGUC4uI2VuZGlmLAorICAgICAgICAgIGJlY2F1c2UgaXQgaXMgbm90IHByZXNlbnQgaW4gYWxsIG9mIHRoZSBjaypmaW8uYyBtb2R1bGVzLiBTbyBpZgorICAgICAgICAgIHlvdSBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBpbiBhIHZlcnNpb24gdGhhdCBkaWQgbm90IGhhdmUgaXQKKyAgICAgICAgICBiZWZvcmUsIGJlIHN1cmUgdG8gYWRkICNkZWZpbmUgWkZOUUZQIGluIHRoZSBhcHByb3ByaWF0ZSBzcG90CisgICAgICAgICAgaW4gY2tjZGViLmggb3IgaW4gdGhlIGJ1aWxkLXByb2NlZHVyZSBDRkxBR1MuCisKKyAgIGludAorICAgICAgICAgIHpjbXBmbihzMSxzMikgY2hhciAqIHMyLCAqIHMyOworICAgICAgICAgIENvbXBhcmVzIHR3byBmaWxlbmFtZXMgdG8gc2VlIGlmIHRoZXkgcmVmZXIgdG8gdGhlIHNhbWUuCisgICAgICAgICAgSW50ZXJuYWxseSwgdGhlIGFyZ3VtZW50cyBjYW4gYmUgY29udmVydGVkIHRvIGZ1bGx5IHF1YWxpZmllZAorICAgICAgICAgIHBhdGhuYW1lcywgZS5nLiB3aXRoIHpmbnFmcCgpLCByZWFscGF0aCgpLCBvciBzb21lc3VjaC4gSW4gVW5peAorICAgICAgICAgIG9yIG90aGVyIHN5c3RlbXMgd2hlcmUgc3ltYm9saWMgbGlua3MgZXhpc3QsIHRoZSBsaW5rIHNob3VsZCBiZQorICAgICAgICAgIHJlc29sdmVkIGJlZm9yZSBtYWtpbmcgdGhlIGNvbXBhcmlzb24gb3IgbG9va2luZyBhdCB0aGUgaW5vZGVzLgorICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAwOiBGaWxlcyBhcmUgbm90IGlkZW50aWNhbC4KKyAgICAgICAgICAgIDE6IEZpbGVzIGFyZSBpZGVudGljYWwuCisKKyAgIGludAorICAgICAgICAgIHpmc2Vlayhwb3MpIGxvbmcgcG9zOworICAgICAgICAgIFBvc2l0aW9ucyB0aGUgaW5wdXQgcG9pbnRlciBvbiB0aGUgY3VycmVudCBpbnB1dCBmaWxlIHRvIHRoZQorICAgICAgICAgIGdpdmVuIHBvc2l0aW9uLiBUaGUgcG9zIGFyZ3VtZW50IGlzIDAtYmFzZWQsIHRoZSBvZmZzZXQKKyAgICAgICAgICAoZGlzdGFuY2UgaW4gYnl0ZXMpIGZyb20gYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiBOZWVkZWQgZm9yCisgICAgICAgICAgUkVTRU5ELCBQU0VORCwgYW5kIG90aGVyIHJlY292ZXJ5IG9wZXJhdGlvbnMuIFRoaXMgZnVuY3Rpb24gaXMKKyAgICAgICAgICBub3QgbmVjZXNzYXJpbHkgcG9zc2libGUgb24gYWxsIHN5c3RlbXMsIGUuZy4gcmVjb3JkLW9yaWVudGVkCisgICAgICAgICAgc3lzdGVtcy4gSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBvbiBiaW5hcnkgZmlsZXMgKGkuZS4gZmlsZXMgd2UKKyAgICAgICAgICBhcmUgc2VuZGluZyBpbiBiaW5hcnkgbW9kZSkgYW5kIHN0cmVhbS1vcmllbnRlZCBmaWxlIHN5c3RlbXMuCisgICAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgLTE6IG9uIGZhaWx1cmUuCisgICAgICAgICAgICAwOiBPbiBzdWNjZXNzLgorCisgICBpbnQKKyAgICAgICAgICB6Y2hkaXIoZGlybmFtKSBjaGFyICpkaXJuYW07CisgICAgICAgICAgQ2hhbmdlcyBjdXJyZW50IG9yIGRlZmF1bHQgZGlyZWN0b3J5IHRvIHRoZSBvbmUgZ2l2ZW4gaW4KKyAgICAgICAgICBkaXJuYW0uIFJldHVybnM6CisgICAgICAgICAgICAwOiBPbiBmYWlsdXJlLgorICAgICAgICAgICAgMTogb24gc3VjY2Vzcy4KKworICAgbG9uZworICAgICAgICAgIHpjaGtpKGZuKSBjaGFyICpmbjsKKyAgICAgICAgICBDaGVjayB0byBzZWUgaWYgZmlsZSB3aXRoIG5hbWUgZm4gaXMgYSByZWd1bGFyLCByZWFkYWJsZSwKKyAgICAgICAgICBleGlzdGluZyBmaWxlLCBzdWl0YWJsZSBmb3IgS2VybWl0IHRvIHNlbmQgLS0gbm90IGEgZGlyZWN0b3J5LAorICAgICAgICAgIG5vdCBhIHN5bWJvbGljIGxpbmssIGV0Yy4gUmV0dXJuczoKKyAgICAgICAgICAgLTM6IGlmIGZpbGUgZXhpc3RzIGJ1dCBpcyBub3QgYWNjZXNzaWJsZSAoZS5nLgorICAgICAgICAgIHJlYWQtcHJvdGVjdGVkKTsKKyAgICAgICAgICAgLTI6IGlmIGZpbGUgZXhpc3RzIGJ1dCBpcyBub3Qgb2YgYSByZWFkYWJsZSB0eXBlIChlLmcuIGEKKyAgICAgICAgICBkaXJlY3RvcnkpOworICAgICAgICAgICAtMTogb24gZXJyb3IgKGUuZy4gZmlsZSBkb2VzIG5vdCBleGlzdCwgb3IgZm4gaXMgZ2FyYmFnZSk7CisgICAgICAgICAgPj0wOiAobGVuZ3RoIG9mIGZpbGUpIGlmIGZpbGUgZXhpc3RzIGFuZCBpcyByZWFkYWJsZS4KKyAgICAgICAgICBBbHNvIHNlZSBpc2RpcigpLCB6Z2V0ZnMoKS4KKworICAgaW50CisgICAgICAgICAgemNoa3BpZChwaWQpIHVuc2lnbmVkIGxvbmcgcGlkOworICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAxOiBJZiB0aGUgZ2l2ZW4gcHJvY2VzcyBJRCAoZS5nLiBwaWQgaW4gVU5JWCkgaXMgdmFsaWQgYW5kCisgICAgICAgICAgYWN0aXZlCisgICAgICAgICAgICAwOiBvdGhlcndpc2UuCisKKyAgIGxvbmcKKyAgICAgICAgICB6Z2V0ZnMoZm4pIGNoYXIgKmZuOworICAgICAgICAgIEdldHMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIGZpbGUsIHJlZ2FyZGxlc3Mgb2YgYWNjZXNzaWJpbGl0eS4KKyAgICAgICAgICBVc2VkIGZvciBkaXJlY3RvcnkgbGlzdGluZ3MuIFVubGlrZSB6Y2hraSgpLCBzaG91bGQgcmV0dXJuIHRoZQorICAgICAgICAgIHNpemUgb2YgYW55IGtpbmQgb2YgZmlsZSwgZXZlbiBhIGRpcmVjdG9yeS4gemdldGZzKCkgYWxzbworICAgICAgICAgIHNob3VsZCBzZXJ2ZSBhcyBhIG1pbmkgImdldCBmaWxlIGluZm8iIGZ1bmN0aW9uIHRoYXQgY2FuIGJlCisgICAgICAgICAgdXNlZCB1bnRpbCB3ZSBkZXNpZ24gYSBiZXR0ZXIgb25lLCBieSBhbHNvIHNldHRpbmcgc29tZSBnbG9iYWwKKyAgICAgICAgICB2YXJpYWJsZXM6CisgICAgICAgICAgICBpbnQgemdmc19saW5rICAgPSAxLzAgPSBmaWxlIGlzIChub3QpIGEgc3ltYm9saWMgbGluay4KKyAgICAgICAgICAgIGludCB6Z2ZzX2RpciAgICA9IDEvMCA9IGZpbGUgaXMgKG5vdCkgYSBkaXJlY3RvcnkuCisgICAgICAgICAgICBjaGFyIGxpbmtuYW1lW10gPSBpZiB6Z2ZzX2xpbmsgIT0gMCwgbmFtZSBvZiBmaWxlIGxpbmsgcG9pbnRzCisgICAgICAgICAgdG8uCisgICAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgLTE6IG9uIGVycm9yIChlLmcuIGZpbGUgZG9lcyBub3QgZXhpc3QsIG9yIGZuIGlzIGdhcmJhZ2UpOworICAgICAgICAgID49MDogKGxlbmd0aCBvZiBmaWxlKSBpZiBmaWxlIGV4aXN0cyBhbmQgaXMgcmVhZGFibGUuCisKKyAgIGludAorICAgICAgICAgIHpjaGtvKGZuKSBjaGFyICpmbjsKKyAgICAgICAgICBDaGVja3MgdG8gc2VlIGlmIGEgZmlsZSBvZiB0aGUgZ2l2ZW4gbmFtZSBjYW4gYmUgY3JlYXRlZC4KKyAgICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAtMTogaWYgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCwgb3Igb24gYW55IGtpbmQgb2YgZXJyb3IuCisgICAgICAgICAgICAwOiBpZiBmaWxlIGNhbiBiZSBjcmVhdGVkLgorCisgICBpbnQKKyAgICAgICAgICB6Y2hrc3BhKGZuLGxlbikgY2hhciAqZjsgbG9uZyBsZW47CisgICAgICAgICAgQ2hlY2tzIHRvIHNlZSBpZiB0aGVyZSBpcyBzdWZmaWNpZW50IHNwYWNlIHRvIHN0b3JlIHRoZSBmaWxlCisgICAgICAgICAgbmFtZWQgZm4sIHdoaWNoIGlzIGxlbiBieXRlcyBsb25nLiBJZiB5b3UgY2FuJ3Qgd3JpdGUgYQorICAgICAgICAgIGZ1bmN0aW9uIHRvIGRvIHRoaXMsIHRoZW4ganVzdCBtYWtlIGEgZHVtbXkgdGhhdCBhbHdheXMgcmV0dXJucworICAgICAgICAgIDE7IGhpZ2hlciBsZXZlbCBjb2RlIHdpbGwgcmVjb3ZlciBmcm9tIGRpc2stZnVsbCBlcnJvcnMuIFRoZQorICAgICAgICAgIHJlY2VpdmluZyBLZXJtaXQgdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIHJlZnVzZSBhbiBpbmNvbWluZyBmaWxlCisgICAgICAgICAgYmFzZWQgb24gaXRzIHNpemUsIHZpYSB0aGUgYXR0cmlidXRlIG1lY2hhbmlzbS4gUmV0dXJuczoKKyAgICAgICAgICAgLTE6IG9uIGVycm9yLgorICAgICAgICAgICAgMDogaWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZS4KKyAgICAgICAgICAgIDE6IGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZS4KKworICAgaW50CisgICAgICAgICAgemNoaW4obixjKSBpbnQgbjsgaW50ICpjOworICAgICAgICAgIEdldHMgYSBjaGFyYWN0ZXIgZnJvbSBmaWxlIG51bWJlciBuLCByZXR1cm4gaXQgaW4gYyAoY2FsbCB3aXRoCisgICAgICAgICAgJmMpLiBSZXR1cm5zOgorICAgICAgICAgICAtMTogb24gZmFpbHVyZSwgaW5jbHVkaW5nIEVPRi4KKyAgICAgICAgICAgIDA6IG9uIHN1Y2Nlc3Mgd2l0aCBjaGFyYWN0ZXIgaW4gYy4KKworICAgaW50CisgICAgICAgICAgemNob3V0KG4sYykgaW50IG47IGNoYXIgYzsKKyAgICAgICAgICBXcml0ZXMgdGhlIGNoYXJhY3RlciBjIHRvIGZpbGUgbnVtYmVyIG4uIFJldHVybnM6CisgICAgICAgICAgIC0xOiBvbiBlcnJvci4KKyAgICAgICAgICAgIDA6IG9uIHN1Y2Nlc3MuCisKKyAgIGludAorICAgICAgICAgIHpjbG9zZShuKSBpbnQgbjsKKyAgICAgICAgICBDbG9zZXMgZmlsZSBudW1iZXIgbi4gUmV0dXJuczoKKyAgICAgICAgICAgLTE6IG9uIGVycm9yLgorICAgICAgICAgICAgMTogb24gc3VjY2Vzcy4KKworICAgaW50CisgICAgICAgICAgemRlbGV0KGZuKSBjaGFyICpuYW1lOworICAgICAgICAgIEF0dGVtcHRzIHRvIGRlbGV0ZSAocmVtb3ZlLCBlcmFzZSkgdGhlIG5hbWVkIGZpbGUuIFJldHVybnM6CisgICAgICAgICAgIC0xOiBvbiBlcnJvci4KKyAgICAgICAgICAgIDE6IGlmIGZpbGUgd2FzIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorCisgICBjaGFyICoKKyAgICAgICAgICB6Z3Blcm0oY2hhciAqIGYpCisgICAgICAgICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN5c3RlbS1kZXBlbmRlbnQgbnVtZXJpYworICAgICAgICAgIHBlcm1pc3Npb25zL3Byb3RlY3Rpb24gc3RyaW5nIGZvciBmaWxlIGYsIG9yIE5VTEwgdXBvbiBmYWlsdXJlLgorICAgICAgICAgIFVzZWQgaWYgQ0tfUEVSTVMgaXMgZGVmaW5lZC4KKworICAgY2hhciAqCisgICAgICAgICAgemlwZXJtKGNoYXIgKiBmKQorICAgICAgICAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzeXN0ZW0tZGVwZW5kZW50IHN5bWJvbGljCisgICAgICAgICAgcGVybWlzc2lvbnMvcHJvdGVjdGlvbiBzdHJpbmcgZm9yIGZpbGUgZiwgb3IgTlVMTCB1cG9uIGZhaWx1cmUuCisgICAgICAgICAgVXNlZCBpZiBDS19QRVJNUyBpcyBkZWZpbmVkLiBFeGFtcGxlOiBJbiBVTklYIHpncGVybShmKSBtaWdodAorICAgICAgICAgIHJldHVybiAiMTAwNzcwIiwgYnV0IHppcGVybSgpIG1pZ2h0IHJldHVybiAiLXJ3eHJ3eC0tLSIuIEluCisgICAgICAgICAgVk1TLCB6Z3Blcm0oKSB3b3VsZCByZXR1cm4gYSBoZXhhZGVjaW1hbCBzdHJpbmcsIGJ1dCB6aXBlcm0oKQorICAgICAgICAgIHdvdWxkIHJldHVybiBzb21ldGhpbmcgbGlrZSAiKFJXRUQsUldFRCxSRSwpIi4KKworICAgY2hhciAqCisgICAgICAgICAgemd0ZGlyKCkKKyAgICAgICAgICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGZvbGRlciwKKyAgICAgICAgICBldGMsIG9yIGEgTlVMTCBwb2ludGVyIGlmIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBjYW5ub3QgYmUKKyAgICAgICAgICBkZXRlcm1pbmVkLiBJZiBwb3NzaWJsZSwgdGhlIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uIHNob3VsZCBiZQorICAgICAgICAgIChhKSBmdWxseSBzcGVjaWZpZWQsIGUuZy4gYXMgYSBjb21wbGV0ZSBwYXRobmFtZSwgYW5kIChiKSBiZQorICAgICAgICAgIHN1aXRhYmxlIGZvciBhcHBlbmRpbmcgYSBmaWxlbmFtZS4gVGh1cywgZm9yIGV4YW1wbGUsIFVuaXgKKyAgICAgICAgICBkaXJlY3RvcnkgbmFtZXMgc2hvdWxkIGVuZCB3aXRoICcvJy4gVk1TIGRpcmVjdG9yeSBuYW1lcyBzaG91bGQKKyAgICAgICAgICBsb29rIGxpa2UgREVWOltOQU1FXSAocmF0aGVyIHRoYW4sIHNheSwgTkFNRS5ESVI7MSkuCisKKyAgIGNoYXIgKgorICAgICAgICAgIHpob21lKCkKKyAgICAgICAgICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZSB1c2VyJ3MgaG9tZQorICAgICAgICAgIGRpcmVjdG9yeSwgb3IgTlVMTCB1cG9uIGVycm9yLiBTaG91bGQgYmUgZm9ybWF0dGVkIGxpa2UKKyAgICAgICAgICB6Z3RkaXIoKSAocS52LikuCisKKyAgIGludAorICAgICAgICAgIHppbmZpbGwoKQorICAgICAgICAgIEZpbGwgYnVmZmVyIGZyb20gaW5wdXQgZmlsZS4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBtYWNybworICAgICAgICAgIHptaW5jaGFyKCksIHdoaWNoIGlzIGRlZmluZWQgaW4gY2tja2VyLmguIHptaW5jaGFyKCkgbWFuYWdlcworICAgICAgICAgIGl0cyBvd24gYnVmZmVyLCBhbmQgY2FsbHMgemluZmlsbCgpIHRvIGZpbGwgaXQgd2hlbmV2ZXIgaXQKKyAgICAgICAgICBiZWNvbWVzIGVtcHR5LiBJdCBpcyB1c2VkIG9ubHkgZm9yIHNlbmRpbmcgZmlsZXMsIGFuZCByZWFkcworICAgICAgICAgIGNoYXJhY3RlcnMgb25seSBmcm9tIGZpbGUgbnVtYmVyIFpJRklMRS4gemluZmlsbCgpIHJldHVybnMgLTEKKyAgICAgICAgICB1cG9uIGVuZCBvZiBmaWxlLCAtMiB1cG9uIGZhdGFsIGVycm9yLCBhbmQgLTMgdXBvbiB0aW1lb3V0CisgICAgICAgICAgKGUuZy4gd2hlbiByZWFkaW5nIGZyb20gYSBwaXBlKTsgb3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIGZpcnN0CisgICAgICAgICAgY2hhcmFjdGVyIGZyb20gdGhlIGJ1ZmZlciBpdCBqdXN0IHJlYWQuCisKKyAgIGludAorICAgICAgICAgIHprc2VsZigpCisgICAgICAgICAgS2lsbHMgdGhlIGN1cnJlbnQgam9iLCBzZXNzaW9uLCBwcm9jZXNzLCBldGMsIGxvZ3Mgb3V0LAorICAgICAgICAgIGRpc2FwcGVhcnMuIFVzZWQgYnkgdGhlIEtlcm1pdCBzZXJ2ZXIgd2hlbiBpdCByZWNlaXZlcyBhIEJZRQorICAgICAgICAgIGNvbW1hbmQuIE9uIGZhaWx1cmUsIHJldHVybnMgLTEuIE9uIHN1Y2Nlc3MsIGRvZXMgbm90IHJldHVybiBhdAorICAgICAgICAgIGFsbCEgVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCB1bnRpbCBhbGwgb3RoZXIgc3RlcHMKKyAgICAgICAgICBoYXZlIGJlZW4gdGFrZW4gdG8gY2xvc2UgZmlsZXMsIGV0Yy4KKworICAgVk9JRAorICAgICAgICAgIHpzdHJpcChmbiwmZm4yKSBjaGFyICpmbjEsICoqZm4yOworICAgICAgICAgIFN0cmlwcyBkZXZpY2UgYW5kIGRpcmVjdG9yeSwgZXRjLCBmcm9tIGZpbGUgc3BlY2lmaWNhdGlvbiBmbiwKKyAgICAgICAgICBsZWF2aW5nIG9ubHkgdGhlIGZpbGVuYW1lIChpbmNsdWRpbmcgImV4dGVuc2lvbiIgb3IgImZpbGV0eXBlIgorICAgICAgICAgIC0tIHRoZSBwYXJ0IGFmdGVyIHRoZSBkb3QpLiBGb3IgZXhhbXBsZSBEVUEwOltQUk9HUkFNU11PT0ZBLkM7MworICAgICAgICAgIGJlY29tZXMgT09GQS5DLCBvciAvdXNyL2ZkYy9vb2ZhLmMgYmVjb21lcyBvb2ZhLmMuIFJldHVybnMgYQorICAgICAgICAgIHBvaW50ZXIgdG8gcmVzdWx0IGluIGZuMi4KKworICAgaW50CisgICAgICAgICAgenNldHBlcm0oY2hhciAqIGZpbGUsIHVuc2lnbmVkIGludCBjb2RlKQorICAgICAgICAgIFNldCBwZXJtaXNzaW9ucyBvZiBmaWxlIHRvIGdpdmVuIHN5c3RlbS1kZXBlbmRlbnQgY29kZS4gICAwOiBPbgorICAgICAgICAgIGZhaWx1cmUuCisgICAgICAgICAgICAxOiBvbiBzdWNjZXNzLgorCisgICBpbnQKKyAgICAgICAgICB6c2V0cm9vdChjaGFyICogZGlyKQorICAgICAgICAgIFNldHMgdGhlIHJvb3QgZm9yIHRoZSB1c2VyJ3MgZmlsZSBhY2Nlc3MsIGxpa2UgVW5peCBjaHJvb3QoKSwKKyAgICAgICAgICBidXQgZG9lcyBub3QgcmVxdWlyZSBwcml2aWxlZ2UuIEluIFVuaXgsIHRoaXMgbXVzdCBiZQorICAgICAgICAgIGltcGxlbWVudGVkIGVudGlyZWx5IGJ5IEtlcm1pdCdzIG93biBmaWxlIGFjY2VzcyByb3V0aW5lcy4KKyAgICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgMTogU3VjY2VzcworICAgICAgICAgICAtMTogSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAtMjoKKyAgICAgICAgICAgLTM6IEludGVybmFsIGVycm9yCisgICAgICAgICAgIC00OiBBY2Nlc3MgdG8gZ2l2ZW4gZGlyZWN0b3J5IGRlbmllZAorICAgICAgICAgICAtNTogTmV3IHJvb3Qgbm90IHdpdGhpbiBvbGQgcm9vdAorCisgICBpbnQKKyAgICAgICAgICB6aW5yb290KGNoYXIgKiBmaWxlKQorICAgICAgICAgIElmIG5vIHJvb3QgaXMgc2V0ICh6c2V0cm9vdCgpKSwgcmV0dXJucyAxLgorICAgICAgICAgIE90aGVyd2lzZSwgaWYgZ2l2ZW4gZmlsZSBpcyBpbiB0aGUgcm9vdCwgcmV0dXJucyAxLgorICAgICAgICAgIE90aGVyd2lzZSwgcmV0dXJucyAwLgorCisgICBWT0lECisgICAgICAgICAgemx0b3IoZm4sZm4yKSBjaGFyICpmbjEsICpmbjI7CisgICAgICAgICAgTG9jYWwtVG8tUmVtb3RlIGZpbGVuYW1lIHRyYW5zbGF0aW9uLiBPQlNPTEVURTogcmVwbGFjZWQgYnkKKyAgICAgICAgICBuemx0b3IoKSAocS52LikuIFRyYW5zbGF0ZXMgdGhlIGxvY2FsIGZpbGVuYW1lIGZuIGludG8gYSBmb3JtYXQKKyAgICAgICAgICBzdWl0YWJsZSBmb3IgdHJhbnNtaXNzaW9uIHRvIGFuIGFyYml0cmFyeSB0eXBlIG9mIGNvbXB1dGVyLCBhbmQKKyAgICAgICAgICBjb3BpZXMgdGhlIHJlc3VsdCBpbnRvIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBmbjIuCisgICAgICAgICAgVHJhbnNsYXRpb24gbWF5IGludm9sdmUgKGEpIHN0cmlwcGluZyB0aGUgZGV2aWNlIGFuZC9vcgorICAgICAgICAgIGRpcmVjdG9yeS9wYXRoIG5hbWUsIChiKSBjb252ZXJ0aW5nIGxvd2VyY2FzZSB0byB1cHBlcmNhc2UsIChjKQorICAgICAgICAgIHJlbW92aW5nIHNwYWNlcyBhbmQgc3RyYW5nZSBjaGFyYWN0ZXJzLCBvciBjb252ZXJ0aW5nIHRoZW0gdG8KKyAgICAgICAgICBzb21lIGlubm9jdW91cyBhbHBoYWJldGljIGNoYXJhY3RlciBsaWtlIFgsIChkKSBkaXNjYXJkaW5nIG9yCisgICAgICAgICAgY29udmVydGluZyBleHRyYSBwZXJpb2RzICh0aGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiBvbmUpLgorICAgICAgICAgIERvZXMgaXRzIGJlc3QuIFJldHVybnMgbm8gdmFsdWUuIG5hbWUyIGlzIGEgcG9pbnRlciB0byBhCisgICAgICAgICAgYnVmZmVyLCBmdXJuaXNoZWQgYnkgdGhlIGNhbGxlciwgaW50byB3aGljaCB6bHRvcigpIHdyaXRlcyB0aGUKKyAgICAgICAgICByZXN1bHRpbmcgbmFtZS4gTm8gbGVuZ3RoIGNoZWNraW5nIGlzIGRvbmUuCisKKyAgICNpZmRlZiBOWkxUT1IKKyAgICAgICAgICBWT0lECisgICAgICAgICAgbnpsdG9yKGZuLGZuMixjb252ZXJ0LHBhdGhuYW1lcyxtYXgpIGNoYXIgKmZuMSwqZm4yOyBpbnQKKyAgICAgICAgICBjb252ZXJ0LHBhdGhuYW1lcyxtYXg7CisgICAgICAgICAgUmVwbGFjZXMgemx0b3IoKS4gVGhpcyBuZXcgdmVyc2lvbiBoYW5kbGVzIHBhdGhuYW1lcyBhbmQgY2hlY2tzCisgICAgICAgICAgbGVuZ3RoLiBmbjEgYW5kIGZuMiBhcmUgYXMgaW4gemx0b3IoKS4gVGhpcyB2ZXJzaW9uIGlzIGNhbGxlZAorICAgICAgICAgIHVuY29uZGl0aW9uYWxseSBmb3IgZWFjaCBmaWxlLCByYXRoZXIgdGhhbiBvbmx5IHdoZW4gZmlsZW5hbWUKKyAgICAgICAgICBjb252ZXJzaW9uIGlzIGVuYWJsZWQuIFBhdGhuYW1lcyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworICAgICAgICAgICAgUEFUSF9PRkY6IFBhdGhuYW1lLCBpZiBhbnksIGlzIHRvIGJlIHN0cmlwcGVkCisgICAgICAgICAgICBQQVRIX1JFTDogVGhlIHJlbGF0aXZlIHBhdGhuYW1lIGlzIHRvIGJlIGluY2x1ZGVkCisgICAgICAgICAgICBQQVRIX0FCUzogVGhlIGZ1bGwgcGF0aG5hbWUgaXMgdG8gYmUgaW5jbHVkZWQKKworICAgICAgICAgIEFmdGVyIGhhbmRsaW5nIHBhdGhuYW1lcywgY29udmVyc2lvbiBpcyBkb25lIHRvIHRoZSByZXN1bHQgYXMKKyAgICAgICAgICBpbiB0aGUgemx0b3IoKSBkZXNjcmlwdGlvbiBpZiBjb252ZXJ0ICE9IDA7IGlmIHJlbGF0aXZlIG9yCisgICAgICAgICAgYWJzb2x1dGUgcGF0aG5hbWVzIGFyZSBpbmNsdWRlZCwgdGhleSBhcmUgY29udmVydGVkIHRvIFVOSVgKKyAgICAgICAgICBmb3JtYXQsIGkuZS4gd2l0aCBzbGFzaCAoLykgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IuIFRoZSBtYXgKKyAgICAgICAgICBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgZm4yLiBJZiBjb252ZXJ0ID4gMCwKKyAgICAgICAgICB0aGUgcmVndWxhciBjb252ZXJzaW9ucyBhcmUgZG9uZTsgaWYgY29udmVydCA8IDAsIG1pbmltYWwKKyAgICAgICAgICBjb252ZXJzaW9ucyBhcmUgZG9uZSAod2Ugc2tpcCB1cHBlcmNhc2luZyB0aGUgbGV0dGVycywgd2UgYWxsb3cKKyAgICAgICAgICBtb3JlIHRoYW4gb25lIHBlcmlvZCwgZXRjOyB0aGlzIGNhbiBiZSB1c2VkIHdoZW4gd2Uga25vdyBvdXIKKyAgICAgICAgICBwYXJ0bmVyIGlzIFVOSVggb3Igc2ltaWxhcikuCisKKyAgICNlbmRpZiAvKiBOWkxUT1IgKi8KKworICAgaW50CisgICAgICAgICAgbnp4cGFuZChmbixmbGFncykgY2hhciAqZm47IGludCBmbGFnczsKKyAgICAgICAgICBSZXBsYWNlcyB6eHBhbmQoKSwgd2hpY2ggaXMgb2Jzb2xldGUgYXMgb2YgQy1LZXJtaXQgNy4wLgorICAgICAgICAgIENhbGwgd2l0aDoKKyAgICAgICAgICAgIGZuID0gUG9pbnRlciB0byBmaWxlbmFtZSBvciBwYXR0ZXJuLgorICAgICAgICAgICAgZmxhZ3MgPSBvcHRpb24gYml0czoKKyAgICAgICAgICAgICAgZmxhZ3MgJiBaWF9GSUxPTkxZICBNYXRjaCByZWd1bGFyIGZpbGVzCisgICAgICAgICAgICAgIGZsYWdzICYgWlhfRElST05MWSAgTWF0Y2ggZGlyZWN0b3JpZXMKKyAgICAgICAgICAgICAgZmxhZ3MgJiBaWF9SRUNVUlNFICBEZXNjZW5kIHRocm91Z2ggZGlyZWN0b3J5IHRyZWUKKyAgICAgICAgICAgICAgZmxhZ3MgJiBaWF9NQVRDSERPVCBNYXRjaCAiZG90IGZpbGVzIgorICAgICAgICAgICAgICBmbGFncyAmIFpYX05PQkFDS1VQIERvbid0IG1hdGNoICJiYWNrdXAgZmlsZXMiCisgICAgICAgICAgICAgIGZsYWdzICYgWlhfTk9MSU5LUyAgRG9uJ3QgZm9sbG93IHN5bWxpbmtzLgorCisgICAgICAgICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgbWF0Y2ggZm4sIHdpdGggZGF0YSBzdHJ1Y3R1cmVzCisgICAgICAgICAgc2V0IHVwIHNvIHRoZSBmaXJzdCBmaWxlIChpZiBhbnkpIHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhlIG5leHQKKyAgICAgICAgICB6bmV4dCgpIGNhbGwuIElmIFpYX0ZJTE9OTFkgYW5kIFpYX0RJUk9OTFkgYXJlIGJvdGggc2V0LCBvcgorICAgICAgICAgIG5laXRoZXIgb25lIGlzIHNldCwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGFyZSBtYXRjaGVkLiBOb3RlczoKKworICAgICAgICAgMS4gSXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlIG51bWJlciByZXR1cm5lZCBieSBuenhwYW5kKCkgcmVmbGVjdAorICAgICAgICAgICAgdGhlIGFjdHVhbCBudW1iZXIgb2YgZmlsZW5hbWVzIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieQorICAgICAgICAgICAgem5leHQoKSBjYWxscy4gSW4gb3RoZXIgd29yZHM6CisgIGZvciAobiA9IG56eHBhbmQoc3RyaW5nLGZsYWdzKTsgbiA+IDA7IG4tLSkgeworICAgICAgem5leHQoYnVmKTsKKyAgICAgIHByaW50ZigiJXNcbiIsIGJ1Zik7CisgIH0KKyAgICAgICAgICAgIHNob3VsZCBwcmludCBhbGwgdGhlIGZpbGUgbmFtZXM7IG5vIG1vcmUsIG5vIGxlc3MuCisgICAgICAgICAyLiBJbiBVTklYLCBET1MsIE9TLTksIGV0Yywgd2hlcmUgZGlyZWN0b3JpZXMgY29udGFpbiBlbnRyaWVzCisgICAgICAgICAgICBmb3IgdGhlbXNlbHZlcyAoLikgYW5kIHRoZSBzdXBlcmlvciBkaXJlY3RvcnkgKC4uKSwgdGhlc2UKKyAgICAgICAgICAgIHNob3VsZCBOT1QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMsCisgICAgICAgICAgICBpbmNsdWRpbmcgd2hlbiBaWF9NQVRDSERPVCBpcyBzZXQuCisgICAgICAgICAzLiBBZGRpdGlvbmFsIG9wdGlvbiBiaXRzIG1pZ2h0IGJlIGFkZGVkIGluIHRoZSBmdXR1cmUsIGUuZy4gZm9yCisgICAgICAgICAgICBzb3J0aW5nIChzb3J0IGJ5IGRhdGUvbmFtZS9zaXplLCByZXZlcnNlL2FzY2VuZGluZywgZXRjKS4KKyAgICAgICAgICAgIEN1cnJlbnRseSB0aGlzIGlzIGRvbmUgb25seSBpbiBoaWdoZXIgbGV2ZWwgY29kZSAodGhyb3VnaCBhCisgICAgICAgICAgICBoYWNrIGluIHdoaWNoIHRoZSBuenhwYW5kKCkgZXhwb3J0cyBpdHMgZmlsZW5hbWUgYXJyYXksIHdoaWNoCisgICAgICAgICAgICBpcyBub3QgcG9ydGFibGUgYmVjYXVzZSBub3QgYWxsIE9TJ3MgY2FuIHVzZSB0aGlzIG1lY2hhbmlzbSkuCisKKyAgIGludAorICAgICAgICAgIHptYWlsKGFkZHIsZm4pIGNoYXIgKmFkZHIsIGZuOworICAgICAgICAgIFNlbmQgdGhlIGxvY2FsLCBleGlzdGluZyBmaWxlIGZuIGFzIGUtbWFpbCB0byB0aGUgYWRkcmVzcyBhZGRyLgorICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAwOiBvbiBzdWNjZXNzCisgICAgICAgICAgICAyOiBpZiBtYWlsIGRlbGl2ZXJlZCBidXQgdGVtcCBmaWxlIGNhbid0IGJlIGRlbGV0ZWQKKyAgICAgICAgICAgLTI6IGlmIG1haWwgY2FuJ3QgYmUgZGVsaXZlcmVkCisKKyAgIGludAorICAgICAgICAgIHpta2RpcihwYXRoKSBjaGFyICpwYXRoOworICAgICAgICAgIFRoZSBwYXRoIGNhbiBiZSBhIGZpbGUgc3BlY2lmaWNhdGlvbiB0aGF0IG1pZ2h0IGNvbnRhaW4KKyAgICAgICAgICBkaXJlY3RvcnkgaW5mb3JtYXRpb24sIGluIHdoaWNoIHRoZSBmaWxlbmFtZSBpcyBleHBlY3RlZCB0byBiZQorICAgICAgICAgIGluY2x1ZGVkLCBvciBhbiB1bmFtYmlndW91cyBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbiAoZS5nLiBpbgorICAgICAgICAgIFVOSVggaXQgbXVzdCBlbmQgd2l0aCAiLyIpLiBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gY3JlYXRlIGFueQorICAgICAgICAgIGRpcmVjdG9yaWVzIGluIHRoZSBnaXZlbiBwYXRoIHRoYXQgZG9uJ3QgYWxyZWFkeSBleGlzdC4gUmV0dXJucworICAgICAgICAgIDAgb3IgZ3JlYXRlciBzdWNjZXNzOiBubyBkaXJlY3RvcmllcyBuZWVkZWQgY3JlYXRpb24sIG9yIGVsc2UKKyAgICAgICAgICBhbGwgZGlyZWN0b3JpZXMgdGhhdCBuZWVkZWQgY3JlYXRpb24gd2VyZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseTsKKyAgICAgICAgICB0aGUgcmV0dXJuIGNvZGUgaXMgdGhlIG51bWJlciBvZiBkaXJlY3RvcmllcyB0aGF0IHdlcmUgY3JlYXRlZC4KKyAgICAgICAgICBSZXR1cm5zIC0xIG9uIGZhaWx1cmUgdG8gY3JlYXRlIGFueSBvZiB0aGUgbmVlZGVkIGRpcmVjdG9yaWVzLgorCisgICBpbnQKKyAgICAgICAgICB6cm1kaXIocGF0aCkgY2hhciAqcGF0aDsKKyAgICAgICAgICBBdHRlbXB0cyB0byByZW1vdmUgdGhlIGdpdmVuIGRpcmVjdG9yeS4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsCisgICAgICAgICAgLTEgb24gZmFpbHVyZS4gVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgb3BlbiAtLSBzaG91bGQgaXQKKyAgICAgICAgICBmYWlsIGlmIHRoZSBkaXJlY3RvcnkgY29udGFpbnMgYW55IGZpbGVzIG9yIHN1YmRpcmVjdG9yaWVzLAorICAgICAgICAgIGV0Yy4gSXQgaXMgcHJvYmFibHkgYmVzdCBmb3IgdGhpcyByb3V0aW5lIHRvIGJlaGF2ZSBpbiB3aGF0ZXZlcgorICAgICAgICAgIG1hbm5lciBpcyBjdXN0b21hcnkgb24gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm07IGUuZy4gaW4gVU5JWCwKKyAgICAgICAgICBWTVMsIERPUywgZXRjLCB3aGVyZSBkaXJlY3RvcmllcyBjYW4gbm90IGJlIHJlbW92ZWQgdW5sZXNzIHRoZXkKKyAgICAgICAgICBhcmUgZW1wdHkuCisKKyAgIFZPSUQKKyAgICAgICAgICB6bmV3bihmbixzKSBjaGFyICpmbiwgKipzOworICAgICAgICAgIFRyYW5zZm9ybXMgdGhlIG5hbWUgZm4gaW50byBhIGZpbGVuYW1lIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZQorICAgICAgICAgIHVuaXF1ZS4gSWYgdGhlIGZpbGUgZm4gZG9lcyBub3QgZXhpc3QsIHRoZW4gdGhlIG5ldyBuYW1lIGlzIHRoZQorICAgICAgICAgIHNhbWUgYXMgZm47IE90aGVyd2lzZSwgaXQncyBkaWZmZXJlbnQuIHRoaXMgZnVuY3Rpb24gZG9lcyBpdHMKKyAgICAgICAgICBiZXN0LCByZXR1cm5zIG5vIHZhbHVlLiBOZXcgbmFtZSBpcyBjcmVhdGVkIGluIGNhbGxlcidzIHNwYWNlLgorICAgICAgICAgIENhbGwgbGlrZSB0aGlzOiB6bmV3bihvbGQsJm5ldyk7LiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhCisgICAgICAgICAgcG9pbnRlciB0byB0aGUgbmV3IG5hbWUuIFRoaXMgcG9pbnRlciBpcyBzZXQgYnkgem5ld24oKSB0bworICAgICAgICAgIHBvaW50IHRvIGEgc3RhdGljIHN0cmluZyBpbiBpdHMgb3duIHNwYWNlLCBzbyBiZSBzdXJlIHRvIHRoZQorICAgICAgICAgIHJlc3VsdCB0byBhIHNhZmUgcGxhY2UgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhZ2Fpbi4KKworICAgaW50CisgICAgICAgICAgem5leHQoZm4pIGNoYXIgKmZuOworICAgICAgICAgIENvcGllcyB0aGUgbmV4dCBmaWxlIG5hbWUgZnJvbSBhIGZpbGUgbGlzdCBjcmVhdGVkIGJ5IHp4cGFuZCgpCisgICAgICAgICAgaW50byB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgZm4gKHNlZSB6eHBhbmQpLiBJZiBubyBtb3JlCisgICAgICAgICAgZmlsZXMsIHRoZW4gdGhlIG51bGwgc3RyaW5nIGlzIHBsYWNlZCB0aGVyZS4gUmV0dXJucyAwIGlmIHRoZXJlCisgICAgICAgICAgYXJlIG5vIG1vcmUgZmlsZW5hbWVzLCB3aXRoIDB0aCBlbGVtZW50IHRoZSBhcnJheSBwb2ludGVkIHRvIGJ5CisgICAgICAgICAgZm4gc2V0IHRvIE5VTC4gSWYgdGhlcmUgaXMgYSBmaWxlbmFtZSwgaXQgaXMgc3RvcmVkIGluIHRoZQorICAgICAgICAgIGFycmF5IHBvaW50ZWQgdG8gYnkgZm4gYW5kIGEgcG9zaXRpdmUgbnVtYmVyIGlzIHJldHVybmVkLiBOT1RFOgorICAgICAgICAgIFRoaXMgaXMgYSBjaGFuZ2UgZnJvbSBlYXJsaWVyIGRlZmluaXRpb25zIG9mIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAocHJlLTE5OTkpLCB3aGljaCByZXR1cm5lZCB0aGUgbnVtYmVyIG9mIGZpbGVzIHJlbWFpbmluZzsgdGh1cworICAgICAgICAgIDAgd2FzIHRoZSByZXR1cm4gdmFsdWUgd2hlbiByZXR1cm5pbmcgdGhlIGZpbmFsIGZpbGUuIEhvd2V2ZXIsCisgICAgICAgICAgbm8gbWFpbmxpbmUgY29kZSBldmVyIGRlcGVuZGVkIG9uIHRoZSByZXR1cm4gdmFsdWUsIHNvIHRoaXMKKyAgICAgICAgICBjaGFuZ2Ugc2hvdWxkIGJlIHNhZmUuCisKKyAgIGludAorICAgICAgICAgIHpvcGVuaShuLGZuKSBpbnQgbjsgY2hhciAqZm47CisgICAgICAgICAgT3BlbnMgdGhlIGZpbGUgbmFtZWQgZm4gZm9yIGlucHV0IGFzIGZpbGUgbnVtYmVyIG4uIFJldHVybnM6CisgICAgICAgICAgICAwOiBvbiBmYWlsdXJlLgorICAgICAgICAgICAgMTogb24gc3VjY2Vzcy4KKworICAgaW50CisgICAgICAgICAgem9wZW5vKG4sZm4senosZmNiKSBpbnQgbjsgY2hhciAqbmFtZTsgc3RydWN0IHphdHRyICp6ejsgc3RydWN0CisgICAgICAgICAgZmlsaW5mbyAqZmNiOworICAgICAgICAgIEF0dGVtcHRzIHRvIG9wZW4gdGhlIG5hbWVkIGZpbGUgZm9yIG91dHB1dCBhcyBmaWxlIG51bWJlciBuLiB6egorICAgICAgICAgIGlzIGEgS2VybWl0IGZpbGUgYXR0cmlidXRlIHN0cnVjdHVyZSBhcyBkZWZpbmVkIGluIGNrY2RlYi5oLAorICAgICAgICAgIGNvbnRhaW5pbmcgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSwgaW5jbHVkaW5nIGl0cworICAgICAgICAgIHNpemUsIGNyZWF0aW9uIGRhdGUsIGFuZCBzbyBmb3J0aC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYXR0ZW1wdAorICAgICAgICAgIHRvIGhvbm9yIGFzIG1hbnkgb2YgdGhlc2UgYXMgcG9zc2libGUuIGZjYiBpcyBhICJmaWxlIGNvbnRyb2wKKyAgICAgICAgICBibG9jayIgaW4gdGhlIHRyYWRpdGlvbmFsIHNlbnNlLCBkZWZpbmVkIGluIGNrY2RlYi5oLAorICAgICAgICAgIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gY29tcGxpY2F0ZWQgZmlsZSBzeXN0ZW1zCisgICAgICAgICAgbGlrZSBWTVMgKFJNUyksIElCTSBNVlMsIGV0YywgbGlrZSBibG9ja3NpemUsIHJlY29yZCBsZW5ndGgsCisgICAgICAgICAgb3JnYW5pemF0aW9uLCByZWNvcmQgZm9ybWF0LCBjYXJyaWFnZSBjb250cm9sLCBldGMuIFJldHVybnM6CisgICAgICAgICAgICAwOiBvbiBmYWlsdXJlLgorICAgICAgICAgICAgMTogb24gc3VjY2Vzcy4KKworICAgaW50CisgICAgICAgICAgem91dGR1bXAoKQorICAgICAgICAgIER1bXBzIGEgZmlsZSBvdXRwdXQgYnVmZmVyLiBVc2VkIHdpdGggdGhlIG1hY3JvIHptY2hvdXQoKQorICAgICAgICAgIGRlZmluZWQgaW4gY2tja2VyLmguIFVzZWQgb25seSB3aXRoIGZpbGUgbnVtYmVyIFpPRklMRSwgaS5lLgorICAgICAgICAgIHRoZSBmaWxlIHRoYXQgaXMgYmVpbmcgcmVjZWl2ZWQgYnkgS2VybWl0IGR1cmluZyBmaWxlIHRyYW5zZmVyLgorICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgIC0xOiBvbiBmYWlsdXJlLgorICAgICAgICAgICAgMDogb24gc3VjY2Vzcy4KKworICAgaW50CisgICAgICAgICAgenByaW50KHAsZm4pIGNoYXIgKnAsICpmOworICAgICAgICAgIFByaW50cyB0aGUgZmlsZSB3aXRoIG5hbWUgZm4gb24gYSBsb2NhbCBwcmludGVyLCB3aXRoIG9wdGlvbnMKKyAgICAgICAgICBwLiBSZXR1cm5zOgorICAgICAgICAgICAgMDogb24gc3VjY2VzcworICAgICAgICAgICAgMzogaWYgZmlsZSBzZW50IHRvIHByaW50ZXIgYnV0IGNhbid0IGJlIGRlbGV0ZWQKKyAgICAgICAgICAgLTM6IGlmIGZpbGUgY2FuJ3QgYmUgcHJpbnRlZAorCisgICBpbnQKKyAgICAgICAgICB6cmVuYW1lKGZuLGZuMikgY2hhciAqZm4sICpmbjI7CisgICAgICAgICAgQ2hhbmdlcyB0aGUgbmFtZSBvZiBmaWxlIGZuIHRvIGZuMi4gSWYgZm4yIGlzIHRoZSBuYW1lIG9mIGFuCisgICAgICAgICAgZXhpc3RpbmcgZGlyZWN0b3J5LCBvciBhIGZpbGUtc3RydWN0dXJlZCBkZXZpY2UsIHRoZW4gZmlsZSBmbgorICAgICAgICAgIGlzIG1vdmVkIHRvIHRoYXQgZGlyZWN0b3J5IG9yIGRldmljZSwga2VlcGluZyBpdHMgb3JpZ2luYWwKKyAgICAgICAgICBuYW1lLiBJZiBmbjIgbGFja3MgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIHdoZW4gcGFzc2VkIHRvIHRoaXMKKyAgICAgICAgICBmdW5jdGlvbiwgYW4gYXBwcm9wcmlhdGUgb25lIGlzIHN1cHBsaWVkLiBSZXR1cm5zOgorICAgICAgICAgICAtMTogb24gZmFpbHVyZS4KKyAgICAgICAgICAgIDA6IG9uIHN1Y2Nlc3MuCisKKyAgIGludAorICAgICAgICAgIHpjb3B5KHNvdXJjZSxkZXN0KSBjaGFyICogc291cmNlLCAqIGRlc3Q7CisgICAgICAgICAgQ29waWVzIHRoZSBzb3VyY2UgZmlsZSB0byB0aGUgZGVzdGluYXRpb24uIE9uZSBmaWxlIG9ubHkuIE5vCisgICAgICAgICAgd2lsZGNhcmRzLiBUaGUgZGVzdGluYXRpb24gc3RyaW5nIG1heSBiZSBhIGZpbGVuYW1lIG9yIGEKKyAgICAgICAgICBkaXJlY3RvcnkgbmFtZS4gUmV0dXJuczoKKyAgICAgICAgICAgIDA6IG9uIHN1Y2Nlc3MuCisgICAgICAgICAgIDwwOiBvbiBmYWlsdXJlOgorICAgICAgICAgICAgLTI6IHNvdXJjZSBmaWxlIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZS4KKyAgICAgICAgICAgIC0zOiBzb3VyY2UgZmlsZSBub3QgZm91bmQuCisgICAgICAgICAgICAtNDogcGVybWlzc2lvbiBkZW5pZWQuCisgICAgICAgICAgICAtNTogc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgdGhlIHNhbWUgZmlsZS4KKyAgICAgICAgICAgIC02OiBpL28gZXJyb3IuCisgICAgICAgICAgICAtMTogb3RoZXIgZXJyb3IuCisKKyAgIGNoYXIgKgorICAgICAgICAgIHpsb2NhbHRpbWUoY2hhciAqKQorICAgICAgICAgIENhbGwgd2l0aDogInl5eXltbWRkIGhoOm1tOnNzIiBHTVQvVVRDIGRhdGUtdGltZS4gUmV0dXJucworICAgICAgICAgIHBvaW50ZXIgdG8gbG9jYWwgZGF0ZS10aW1lIHN0cmluZyAieXl5eW1tZGQgaGg6bW06c3MiIG9uCisgICAgICAgICAgc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorCisgICBWT0lECisgICAgICAgICAgenJ0b2woZm4sZm4yKSBjaGFyICpmbiwgKmZuMjsKKyAgICAgICAgICBSZW1vdGUtVG8tTG9jYWwgZmlsZW5hbWUgdHJhbnNsYXRpb24uIE9CU09MRVRFOiByZXBsYWNlZCBieQorICAgICAgICAgIG56cnRvbCgpLiBUcmFuc2xhdGVzIGEgInN0YW5kYXJkIiBmaWxlbmFtZSB0byBhIGxvY2FsIGZpbGVuYW1lLgorICAgICAgICAgIEZvciBleGFtcGxlLCBpbiBVbml4IHRoaXMgZnVuY3Rpb24gbWlnaHQgY29udmVydCBhbgorICAgICAgICAgIGFsbC11cHBlcmNhc2UgbmFtZSB0byBsb3dlcmNhc2UsIGJ1dCBsZWF2ZSBsb3dlci0gb3IgbWl4LWNhc2UKKyAgICAgICAgICBuYW1lcyBhbG9uZS4gRG9lcyBpdHMgYmVzdCwgcmV0dXJucyBubyB2YWx1ZS4gTmV3IG5hbWUgaXMgaW4KKyAgICAgICAgICBzdHJpbmcgcG9pbnRlZCB0byBieSBmbjIuIE5vIGxlbmd0aCBjaGVja2luZyBpcyBkb25lLgorCisgICAjaWZkZWYgTlpMVE9SCisgICBpbnQKKyAgICAgICAgICBuenJ0b2woZm4sZm4yLGNvbnZlcnQscGF0aG5hbWVzLG1heCkgY2hhciAqZm4xLCpmbjI7IGludAorICAgICAgICAgIGNvbnZlcnQscGF0aG5hbWVzLG1heDsKKyAgICAgICAgICBSZXBsYWNlcyB6cnRvbC4gTGlrZSB6cnRvbCBidXQgaGFuZGxlcyBwYXRobmFtZXMgYW5kIGNoZWNrcworICAgICAgICAgIGxlbmd0aC4gU2VlIG56bHRvciBmb3IgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVycy4KKworICAgI2VuZGlmIC8qIE5aTFRPUiAqLworCisgICBpbnQKKyAgICAgICAgICB6c2F0dHIoeHgpIHN0cnVjdCB6YXR0ciAqeHg7CisgICAgICAgICAgRmlsbHMgaW4gYSBLZXJtaXQgZmlsZSBhdHRyaWJ1dGUgc3RydWN0dXJlIGZvciB0aGUgZmlsZSB3aGljaAorICAgICAgICAgIGlzIHRvIGJlIHNlbnQsIG5hbWVseSB0aGUgY3VycmVudGx5IG9wZW4gWklGSUxFLiBOb3RlIHRoYXQgdGhpcworICAgICAgICAgIGlzIG5vdCBhIHZlcnkgZ29vZCBkZXNpZ24sIGJ1dCB3ZSdyZSBzdHVjayB3aXRoIGl0LiBDYWxsZXJzCisgICAgICAgICAgbXVzdCBlbnN1cmUgdGhhdCB6c2F0dHIoKSBpcyBjYWxsZWQgb25seSBvbiByZWFsIGZpbGVzLCBub3Qgb24KKyAgICAgICAgICBwaXBlcywgaW50ZXJuYWxseSBnZW5lcmF0ZWQgZmlsZS1saWtlIG9iamVjdHMgc3VjaCBhcyBzZXJ2ZXIKKyAgICAgICAgICBSRU1PVEUgY29tbWFuZCByZXNwb25zZXMsIGV0Yy4gUmV0dXJuczoKKyAgICAgICAgICAgLTE6IG9uIGZhaWx1cmUuCisgICAgICAgICAgICAwOiBvbiBzdWNjZXNzIHdpdGggdGhlIHN0cnVjdHVyZSBmaWxsZWQgaW4uCisgICAgICAgICAgSWYgYW55IHN0cmluZyBtZW1iZXIgaXMgbnVsbCwgaXQgc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlCisgICAgICAgICAgY2FsbGVyLgorICAgICAgICAgIElmIGFueSBudW1lcmljIG1lbWJlciBpcyAtMSwgaXQgc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlCisgICAgICAgICAgY2FsbGVyLgorCisgICBpbnQKKyAgICAgICAgICB6c2hjbWQocykgY2hhciAqczsKKyAgICAgICAgICBzIGNvbnRhaW5zIHRvIHBvaW50ZXIgdG8gYSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBob3N0CisgICAgICAgICAgY29tcHV0ZXIncyBzaGVsbCwgY29tbWFuZCBwYXJzZXIsIG9yIG9wZXJhdGluZyBzeXN0ZW0uIElmIHRoZQorICAgICAgICAgIHN5c3RlbSBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGZyb20gYSB2YXJpZXR5IG9mIGNvbW1hbmQKKyAgICAgICAgICBwcm9jZXNzb3JzIChzaGVsbHMpLCB0aGVuIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGVtcGxveSB0aGUKKyAgICAgICAgICB1c2VyJ3MgcHJlZmVycmVkIHNoZWxsLiBJZiBwb3NzaWJsZSwgdGhlIHVzZXIncyBqb2IKKyAgICAgICAgICAoZW52aXJvbm1lbnQsIHByb2Nlc3MsIGV0Yykgc2hvdWxkIGJlIHNldCB1cCB0byBjYXRjaCBrZXlib2FyZAorICAgICAgICAgIGludGVycnVwdGlvbiBzaWduYWxzIHRvIGFsbG93IHRoZSB1c2VyIHRvIGhhbHQgdGhlIHN5c3RlbQorICAgICAgICAgIGNvbW1hbmQgYW5kIHJldHVybiB0byBLZXJtaXQuIFRoZSBjb21tYW5kIG11c3QgcnVuIGluIG9yZGluYXJ5LAorICAgICAgICAgIHVucHJpdmlsZWdlZCB1c2VyIG1vZGUuIElmIHBvc3NpYmxlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZAorICAgICAgICAgIHJldHVybiAtMSBvbiBmYWlsdXJlIHRvIHN0YXJ0IHRoZSBjb21tYW5kLCBvciBlbHNlIGl0IHNob3VsZAorICAgICAgICAgIHJldHVybiAxIGlmIHRoZSBjb21tYW5kIHN1Y2NlZWRlZCBhbmQgMCBpZiBpdCBmYWlsZWQuCisKKyAgIGludAorICAgICAgICAgIHBleGl0c3RhdHVzCisgICAgICAgICAgenNoY21kKCkgYW5kIHpzeXNjbWQoKSBzaG91bGQgc2V0IHRoaXMgdG8gdGhlIGNvbW1hbmQncyBhY3R1YWwKKyAgICAgICAgICBleGl0IHN0YXR1cyBjb2RlIGlmIHBvc3NpYmxlLgorCisgICBpbnQKKyAgICAgICAgICB6c3lzY21kKHMpIGNoYXIgKnM7CisgICAgICAgICAgcyBjb250YWlucyB0byBwb2ludGVyIHRvIGEgY29tbWFuZCB0byBiZSBleGVjdXRlZCBieSB0aGUgaG9zdAorICAgICAgICAgIGNvbXB1dGVyJ3Mgc2hlbGwsIGNvbW1hbmQgcGFyc2VyLCBvciBvcGVyYXRpbmcgc3lzdGVtLiBJZiB0aGUKKyAgICAgICAgICBzeXN0ZW0gYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBmcm9tIGEgdmFyaWV0eSBvZiBjb21tYW5kCisgICAgICAgICAgcHJvY2Vzc29ycyAoc2hlbGxzKSwgdGhlbiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBlbXBsb3kgdGhlCisgICAgICAgICAgc3lzdGVtIHN0YW5kYXJkIHNoZWxsIChlLmcuIC9iaW4vc2ggZm9yIFVuaXgpLCBzbyB0aGF0IHRoZQorICAgICAgICAgIHJlc3VsdHMgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgZm9yIGV2ZXJ5Ym9keS4gSWYgcG9zc2libGUsIHRoZQorICAgICAgICAgIHVzZXIncyBqb2IgKGVudmlyb25tZW50LCBwcm9jZXNzLCBldGMpIHNob3VsZCBiZSBzZXQgdXAgdG8KKyAgICAgICAgICBjYXRjaCBrZXlib2FyZCBpbnRlcnJ1cHRpb24gc2lnbmFscyB0byBhbGxvdyB0aGUgdXNlciB0byBoYWx0CisgICAgICAgICAgdGhlIHN5c3RlbSBjb21tYW5kIGFuZCByZXR1cm4gdG8gS2VybWl0LiBUaGUgY29tbWFuZCBtdXN0IHJ1bgorICAgICAgICAgIGluIG9yZGluYXJ5LCB1bnByaXZpbGVnZWQgdXNlciBtb2RlLiBJZiBwb3NzaWJsZSwgdGhpcyBmdW5jdGlvbgorICAgICAgICAgIHNob3VsZCByZXR1cm4gLTEgb24gZmFpbHVyZSB0byBzdGFydCB0aGUgY29tbWFuZCwgb3IgZWxzZSBpdAorICAgICAgICAgIHNob3VsZCByZXR1cm4gMSBpZiB0aGUgY29tbWFuZCBzdWNjZWVkZWQgYW5kIDAgaWYgaXQgZmFpbGVkLgorCisgICBWT0lECisgICAgICAgICAgel9leGVjKHMsYXJncykgY2hhciAqIHM7IGNoYXIgKiBhcmdzW107CisgICAgICAgICAgVGhpcyBvbmUgZXhlY3V0ZXMgdGhlIGNvbW1hbmQgcyAod2hpY2ggaXMgc2VhcmNoZWQgZm9yIHVzaW5nCisgICAgICAgICAgdGhlIHN5c3RlbSdzIG5vcm1hbCBzZWFyY2hpbmcgbWVjaGFuaXNtLCBzdWNoIGFzIFBBVEggaW4gVU5JWCksCisgICAgICAgICAgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnQgdmVjdG9yLCB3aGljaCBmb2xsb3dzIHRoZSBjb252ZW50aW9ucworICAgICAgICAgIG9mIFVOSVggYXJndltdOiB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCBwb2ludGVkIHRvIGJ5IGVsZW1lbnQKKyAgICAgICAgICAwLCB0aGUgZmlyc3QgYXJnIGJ5IGVsZW1lbnQgMSwgYW5kIHNvIG9uLiBBIG51bGwgYXJnc1tdIHBvaW50ZXIKKyAgICAgICAgICBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgYXJ1Z21lbnQgbGlzdC4gQWxsIG9wZW4gZmlsZXMgbXVzdAorICAgICAgICAgIHJlbWFpbiBvcGVuIHNvIHRoZSBleGVjJ2QgcHJvY2VzcyBjYW4gdXNlIHRoZW0uIFJldHVybnMgb25seSBpZgorICAgICAgICAgIHVuc3VjY2Vzc2Z1bC4KKworICAgaW50CisgICAgICAgICAgenNpbmwobixzLHgpIGludCBuLCB4OyBjaGFyICpzOworICAgICAgICAgIFJlYWRzIGEgbGluZSBmcm9tIGZpbGUgbnVtYmVyIG4uIFdyaXRlcyB0aGUgbGluZSBpbnRvIHRoZQorICAgICAgICAgIGFkZHJlc3MgcyBwcm92aWRlZCBieSB0aGUgY2FsbGVyLiBXcml0aW5nIHRlcm1pbmF0ZXMgd2hlbgorICAgICAgICAgIG5ld2xpbmUgaXMgcmVhZCwgYnV0IHdpdGggbmV3bGluZSBkaXNjYXJkZWQuIFdyaXRpbmcgYWxzbworICAgICAgICAgIHRlcm1pbmF0ZXMgdXBvbiBFT0Ygb3IgaWYgbGVuZ3RoIHggaXMgZXhoYXVzdGVkLiBSZXR1cm5zOgorICAgICAgICAgICAtMTogb24gRU9GIG9yIGVycm9yLgorICAgICAgICAgICAgMDogb24gc3VjY2Vzcy4KKworICAgaW50CisgICAgICAgICAgenNvdXQobixzKSBpbnQgbjsgY2hhciAqczsKKyAgICAgICAgICBXcml0ZXMgdGhlIHN0cmluZyBzIG91dCB0byBmaWxlIG51bWJlciBuLiBSZXR1cm5zOgorICAgICAgICAgICAtMTogb24gZmFpbHVyZS4KKyAgICAgICAgICAgIDA6IG9uIHN1Y2Nlc3MuCisKKyAgIGludAorICAgICAgICAgIHpzb3V0bChuLHMpIGludCBuOyBjaGFyICpzOworICAgICAgICAgIFdyaXRlcyB0aGUgc3RyaW5nIHMgb3V0IHRvIGZpbGUgbnVtYmVyIG4gYW5kIGFkZHMgYSBsaW5lCisgICAgICAgICAgKHJlY29yZCkgdGVybWluYXRvciAoYm91bmRhcnkpIGFwcHJvcHJpYXRlIGZvciB0aGUgc3lzdGVtIGFuZAorICAgICAgICAgIHRoZSBmaWxlIGZvcm1hdC4gUmV0dXJuczoKKyAgICAgICAgICAgLTE6IG9uIGZhaWx1cmUuCisgICAgICAgICAgICAwOiBvbiBzdWNjZXNzLgorCisgICBpbnQKKyAgICAgICAgICB6c291dHgobixzLHgpIGludCBuLCB4OyBjaGFyICpzOworICAgICAgICAgIFdyaXRlcyBleGFjdGx5IHggY2hhcmFjdGVycyBmcm9tIHN0cmluZyBzIHRvIGZpbGUgbnVtYmVyIG4uIElmCisgICAgICAgICAgcyBoYXMgZmV3ZXIgdGhhbiB4IGNoYXJhY3RlcnMsIHRoZW4gdGhlIGVudGlyZSBzdHJpbmcgcyBpcworICAgICAgICAgIHdyaXR0ZW4uIFJldHVybnM6CisgICAgICAgICAgIC0xOiBvbiBmYWlsdXJlLgorICAgICAgICAgID49IDA6IG9uIHN1Y2Nlc3MsIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSB3cml0dGVuLgorCisgICBpbnQKKyAgICAgICAgICB6c3RpbWUoZm4seXkseCkgY2hhciAqZm47IHN0cnVjdCB6YXR0ciAqeXk7IGludCB4OworICAgICAgICAgIFNldHMgdGhlIGNyZWF0aW9uIGRhdGUgKGFuZCBvdGhlciBhdHRyaWJ1dGVzKSBvZiBhbiBleGlzdGluZworICAgICAgICAgIGZpbGUsIG9yIGNvbXBhcmVzIGEgZmlsZSdzIGNyZWF0aW9uIGRhdGUgd2l0aCBhIGdpdmVuIGRhdGUuCisgICAgICAgICAgQ2FsbCB3aXRoOgorCisgICBmbjogcG9pbnRlciB0byBuYW1lIG9mIGV4aXN0aW5nIGZpbGUuCisgICB5eTogUG9pbnRlciB0byBhIEtlcm1pdCBmaWxlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUgaW4gd2hpY2ggeXktPmRhdGUudmFsCisgICBpcyBhIGRhdGUgb2YgdGhlIGZvcm0geXl5eW1tZGQgaGg6bW06c3MsIGUuZy4gMTk5MDAyMDggMTM6MDA6MDAsIHdoaWNoCisgICBpcyB0byBiZSB1c2VkIGZvciBzZXR0aW5nIG9yIGNvbXBhcmluZyB0aGUgZmlsZSBkYXRlLiBPdGhlciBhdHRyaWJ1dGVzCisgICBpbiB0aGUgc3RydWN0IGNhbiBhbHNvIGJlIHNldCwgc3VjaCBhcyB0aGUgcHJvdGVjdGlvbi9wZXJtaXNzaW9uIChTZWUKKyAgIFsxMTBdQXBwZW5kaXggSSksIHdoZW4gaXQgbWFrZXMgc2Vuc2UgKGUuZy4gInl5LT5scHJvdGVjdC52YWwiIGNhbiBiZQorICAgc2V0IGlmIHRoZSByZW1vdGUgc3lzdGVtIElEIG1hdGNoZXMgdGhlIGxvY2FsIG9uZSkuCisgICAgeDogQSBmdW5jdGlvbiBjb2RlOiAwIG1lYW5zIHRvIHNldCB0aGUgZmlsZSdzIGNyZWF0aW9uIGRhdGUgYXMgZ2l2ZW4uCisgICAxIG1lYW5zIGNvbXBhcmUgdGhlIGRhdGUgZnJvbSB0aGUgeXkgc3RydWN0IHdpdGggdGhlIGZpbGUncyBkYXRlLgorCisgICAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgLTE6IG9uIGFueSBraW5kIG9mIGVycm9yLgorICAgICAgICAgICAgMDogaWYgeCBpcyAwIGFuZCB0aGUgZmlsZSBkYXRlIHdhcyBzZXQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICAgICAgMDogaWYgeCBpcyAxIGFuZCBkYXRlIGZyb20gYXR0cmlidXRlIHN0cnVjdHVyZSA+IGZpbGUKKyAgICAgICAgICBjcmVhdGlvbiBkYXRlLgorICAgICAgICAgICAgMTogaWYgeCBpcyAxIGFuZCBkYXRlIGZyb20gYXR0cmlidXRlIHN0cnVjdHVyZSA8PSBmaWxlCisgICAgICAgICAgY3JlYXRpb24gZGF0ZS4KKworICAgVk9JRAorICAgICAgICAgIHpzdHJpcChuYW1lLG5hbWUyKSBjaGFyICpuYW1lLCAqKm5hbWUyOworICAgICAgICAgIFN0cmlwcyBwYXRobmFtZSBmcm9tIGZpbGVuYW1lICJuYW1lIi4gQ29uc3RydWN0cyB0aGUgcmVzdWx0aW5nCisgICAgICAgICAgc3RyaW5nIGluIGEgc3RhdGljIGJ1ZmZlciBpbiBpdHMgb3duIHNwYWNlIGFuZCByZXR1cm5zIGEKKyAgICAgICAgICBwb2ludGVyIHRvIGl0IGluIG5hbWUyLiBBbHNvIHN0cmlwcyBkZXZpY2UgbmFtZSwgZmlsZSB2ZXJzaW9uCisgICAgICAgICAgbnVtYmVycywgYW5kIG90aGVyICJub24tbmFtZSIgbWF0ZXJpYWwuCisKKyAgIGludAorICAgICAgICAgIHp4Y21kKG4scykgY2hhciAqczsKKyAgICAgICAgICBSdW5zIGEgc3lzdGVtIGNvbW1hbmQgc28gaXRzIG91dHB1dCBjYW4gYmUgYWNjZXNzZWQgYXMgaWYgaXQKKyAgICAgICAgICB3ZXJlIGZpbGUgbi4gVGhlIGNvbW1hbmQgaXMgcnVuIGluIG9yZGluYXJ5LCB1bnByaXZpbGVnZWQgdXNlcgorICAgICAgICAgIG1vZGUuCisgICAgICAgICAgSWYgbiBpcyBaU1RESU8gb3IgWkNURVJNLCByZXR1cm5zIC0xLgorICAgICAgICAgIElmIG4gaXMgWklGSUxFIG9yIFpSRklMRSwgdGhlbiBLZXJtaXQgcmVhZHMgZnJvbSB0aGUgY29tbWFuZCwKKyAgICAgICAgICBvdGhlcndpc2UgS2VybWl0IHdyaXRlcyB0byB0aGUgY29tbWFuZC4KKyAgICAgICAgICBSZXR1cm5zIDAgb24gZXJyb3IsIDEgb24gc3VjY2Vzcy4KKworICAgaW50CisgICAgICAgICAgenhwYW5kKGZuKSBjaGFyICpmbjsKKyAgICAgICAgICBPQlNPTEVURTogUmVwbGFjZWQgYnkgbnp4cGFuZCgpLCBxLnYuCisKKyAgICNpZmRlZiBaWFJFV0lORAorICAgaW50CisgICAgICAgICAgenhyZXdpbmQoKQorICAgICAgICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlcyByZXR1cm5lZCBieSB0aGUgbW9zdCByZWNlbnQKKyAgICAgICAgICBuenhwYW5kKCkgY2FsbCwgYW5kIHJlc2V0cyB0aGUgbGlzdCB0byB0aGUgYmVnaW5uaW5nIHNvIHRoZQorICAgICAgICAgIG5leHQgem5leHQoKSBjYWxsIHJldHVybnMgdGhlIGZpcnN0IGZpbGUuIFJldHVybnMgLTEgaWYgenhwYW5kCisgICAgICAgICAgaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQuIElmIHRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLAorICAgICAgICAgIFpYUkVXSU5EIHNob3VsZCBiZSBkZWZpbmVkOyBvdGhlcndpc2UgaXQgc2hvdWxkIG5vdCBiZQorICAgICAgICAgIHJlZmVyZW5jZWQuCisKKyAgICNlbmRpZiAvKiBaWFJFV0lORCAqLworCisgICBpbnQKKyAgICAgICAgICB4c3lzdGVtKGNtZCkgY2hhciAqY21kOworICAgICAgICAgIEV4ZWN1dGVzIHRoZSBzeXN0ZW0gY29tbWFuZCB3aXRob3V0IHJlZGlyZWN0aW5nIGFueSBvZiBpdHMgaS9vLAorICAgICAgICAgIHNpbWlsYXIgKHdlbGwsIGlkZW50aWNhbCkgdG8gc3lzdGVtKCkgaW4gVW5peC4gQnV0IGJlZm9yZQorICAgICAgICAgIHBhc3NpbmcgdGhlIGNvbW1hbmQgdG8gdGhlIHN5c3RlbSwgeHN5c3RlbSgpIGVuc3VyZXMgdGhhdCBhbGwKKyAgICAgICAgICBwcml2aWxlZ2VzIGFyZSB0dXJuZWQgb2ZmLCBzbyB0aGF0IHRoZSBzeXN0ZW0gY29tbWFuZCBleGVjdXRlcworICAgICAgICAgIGluIG9yZGluYXJ5IHVucHJpdmlsZWdlZCB1c2VyIG1vZGUuIElmIHBvc3NpYmxlLCB4c3lzdGVtKCkKKyAgICAgICAgICByZXR1cm5zIHRoZSByZXR1cm4gY29kZSBvZiB0aGUgY29tbWFuZCB0aGF0IHdhcyBleGVjdXRlZC4KKworICAgIDQuRS4yLjIuIElLU0QgVmFyaWFibGVzIGFuZCBGdW5jdGlvbnMKKworICAgVGhlc2UgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhbnkgQy1LZXJtaXQgdmVyc2lvbiB0aGF0IGlzIHRvIGJlCisgICBpbnN0YWxsZWQgYXMgYW4gSW50ZXJuZXQgS2VybWl0IFNlcnZpY2UgRGFlbW9uIChJS1NEKS4gSUtTRCBpcworICAgZXhwZWN0ZWQgdG8gYmUgc3RhcnRlZCBieSB0aGUgSW50ZXJuZXQgRGFlbW9uIChlLmcuIGluZXRkKSB3aXRoIGl0cworICAgc3RhbmRhcmQgaS9vIHJlZGlyZWN0ZWQgdG8gdGhlIGluY29taW5nIGNvbm5lY3Rpb24uCisKKyAgIGludCBja3hhbm9uOworICAgICAgICAgIE5vbnplcm8gaWYgYW5vbnltb3VzIGxvZ2lucyBhbGxvd2VkLgorCisgICBleHRlcm4gaW50IGluc2VydmVyOworICAgICAgICAgIE5vbnplcm8gaWYgc3RhcnRlZCBpbiBJS1NEIG1vZGUuCisKKyAgIGV4dGVybiBpbnQgaXNndWVzdDsKKyAgICAgICAgICBOb256ZXJvIGlmIElLU0QgYW5kIHVzZXIgbG9nZ2VkIGluIGFub255bW91c2x5LgorCisgICBleHRlcm4gY2hhciAqIGhvbWRpcjsKKyAgICAgICAgICBQb2ludGVyIHRvIHVzZXIncyBob21lIGRpcmVjdG9yeS4KKworICAgZXh0ZXJuIGNoYXIgKiBhbm9ucm9vdDsKKyAgICAgICAgICBQb2ludGVyIHRvIGZpbGUtc3lzdGVtIHJvb3QgZm9yIGFub255bW91cyB1c2Vycy4KKworICAgRXhpc3RpbmcgZnVuY3Rpb25zIG11c3QgbWFrZSAiaWYgKGluc2VydmVyICYmIGlzZ3Vlc3QpIiBjaGVja3MgZm9yCisgICBhY3Rpb25zIHRoYXQgd291bGQgbm90IGJlIGxlZ2FsIGZvciBndWVzdHM6IHpkZWxldGUoKSwgenJtZGlyKCksCisgICB6cHJpbnQoKSwgem1haWwoKSwgZXRjLgorCisgICBpbnQKKyAgICAgICAgICB6dnVzZXIobmFtZSkgY2hhciAqIG5hbWU7CisgICAgICAgICAgVmVyaWZpZXMgdGhhdCB1c2VyICJuYW1lIiBleGlzdHMgYW5kIGlzIGFsbG93ZWQgdG8gbG9nIGluLiBJZgorICAgICAgICAgIHRoZSBuYW1lIGlzICJmdHAiIG9yICJhbm9ueW1vdXMiIGFuZCBja3hhbm9uICE9IDAsIGEgZ3Vlc3QKKyAgICAgICAgICBsb2dpbiBpcyBzZXQgdXAuIFJldHVybnMgMCBpZiB1c2VyIG5vdCBhbGxvd2VkIHRvIGxvZyBpbiwKKyAgICAgICAgICBub256ZXJvIGlmIHVzZXIgbWF5IGxvZyBpbi4KKworICAgaW50CisgICAgICAgICAgenZwYXNzKHN0cmluZykgY2hhciAqIHN0cmluZzsKKyAgICAgICAgICBWZXJpZmllcyBwYXNzd29yZCBvZiB0aGUgdXNlciBmcm9tIHRoZSBtb3N0IHJlY2VudCB6dnVzZXIoKQorICAgICAgICAgIGNhbGwuIFJldHVybnMgbm9uemVybyBpZiBwYXNzd29yZCBpcyB2YWxpZCBmb3IgdXNlciwgMCBpZiBpdAorICAgICAgICAgIGlzbid0LiBNYWtlcyBhbnkgYXBwcm9wcmlhdGUgc3lzdGVtIGxvZyBlbnRyaWVzIChJS1NEIGxvZ2lucywKKyAgICAgICAgICBmYWlsZWQgbG9naW4gYXR0ZW1wdHMsIGV0YykuIElmIHBhc3N3b3JkIGlzIHZhbGlkLCBsb2dzIHRoZQorICAgICAgICAgIHVzZXIgaW4gYXMgaGVyc2VsZiAoaWYgcmVhbCB1c2VyKSwgb3Igc2V0cyB1cCByZXN0cmljdGVkCisgICAgICAgICAgYW5vbnltb3VzIGFjY2VzcyBpZiB1c2VyIGlzIGd1ZXN0IChlLmcuIGNoYW5nZXMgZmlsZS1zeXN0ZW0KKyAgICAgICAgICByb290IHRvIGFub25yb290IGFuZCBzZXRzIGlzZ3Vlc3QgPSAxKS4KKworICAgVk9JRAorICAgICAgICAgIHpzeXNsb2coKQorICAgICAgICAgIEJlZ2lucyBhbnkgZGVzaXJlZCBzeXN0ZW0gbG9nZ2luZyBvZiBhbiBJS1NEIHNlc3Npb24uCisKKyAgIFZPSUQKKyAgICAgICAgICB6dmxvZ291dCgpCisgICAgICAgICAgVGVybWluYXRlcyBhbiBJS1NEIHNlc3Npb24uIEluIG1vc3QgY2FzZXMgdGhpcyBpcyBzaW1wbHkgYQorICAgICAgICAgIHdyYXBwZXIgZm9yIGV4aXQoKSBvciBkb2V4aXQoKSwgd2l0aCBzb21lIHN5c3RlbSBsb2dnaW5nIGFkZGVkLgorCisgICAgNC5FLjIuMy4gUHJpdmlsZWdlIEZ1bmN0aW9ucworCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgYnkgQy1LZXJtaXQgdG8gYWRhcHQgaXRzZWxmIHRvIG9wZXJhdGluZworICAgc3lzdGVtcyB3aGVyZSB0aGUgcHJvZ3JhbSBjYW4gYmUgbWFkZSB0byBydW4gaW4gYSAicHJpdmlsZWdlZCIgbW9kZSwKKyAgIGUuZy4gc2V0dWlkIG9yIHNldGdpZCBpbiBVbml4LiBDLUtlcm1pdCBzaG91bGQgTk9UIHJlYWQgYW5kIHdyaXRlCisgICBmaWxlcyBvciBzdGFydCBzdWJwcm9jZXNzZXMgYXMgYSBwcml2aWxlZ2VkIHByb2dyYW0uIFRoaXMgd291bGQKKyAgIHByZXNlbnQgYSBzZXJpb3VzIHRocmVhdCB0byBzeXN0ZW0gc2VjdXJpdHkuIFRoZSBzZWN1cml0eSBwYWNrYWdlIGhhcworICAgYmVlbiBpbnN0YWxsZWQgdG8gcHJldmVudCBzdWNoIHNlY3VyaXR5IGJyZWFjaGVzIGJ5IHR1cm5pbmcgb2ZmIHRoZQorICAgcHJvZ3JhbSdzIHNwZWNpYWwgcHJpdmlsZWdlcyBhdCBhbGwgdGltZXMgZXhjZXB0IHdoZW4gdGhleSBhcmUgbmVlZGVkLgorCisgICBJbiBVTklYLCB0aGUgb25seSBuZWVkIEtlcm1pdCBoYXMgZm9yIHByaXZpbGVnZWQgc3RhdHVzIGlzIGFjY2VzcyB0bworICAgdGhlIFVVQ1AgbG9ja2ZpbGUgZGlyZWN0b3J5LCBpbiBvcmRlciB0byByZWFkLCBjcmVhdGUsIGFuZCBkZXN0cm95CisgICBsb2NrZmlsZXMsIGFuZCB0byBvcGVuIGNvbW11bmljYXRpb24gZGV2aWNlcyB0aGF0IGFyZSBub3JtYWxseQorICAgcHJvdGVjdGVkIGFnYWluc3QgdGhlIHVzZXIgKHNlZSB0aGUgWzExMV1Vbml4IEMtS2VybWl0IEluc3RhbGxhdGlvbgorICAgSW5zdHJ1Y3Rpb25zIGZvciBkaXNjdXNzaW9uKS4gVGhlcmVmb3JlLCBwcml2aWxlZ2VzIHNob3VsZCBvbmx5IGJlCisgICBlbmFibGVkIGZvciB0aGVzZSBvcGVyYXRpb25zIGFuZCBkaXNhYmxlZCBhdCBhbGwgb3RoZXIgdGltZXMuIFRoaXMKKyAgIHJlbGlldmVzIHRoZSBwcm9ncmFtbWVyIG9mIHRoZSByZXNwb25zaWJpbGl0eSBvZiBwdXR0aW5nIGV4cGVuc2l2ZSBhbmQKKyAgIHVucmVsaWFibGUgYWNjZXNzIGNoZWNrcyBhcm91bmQgZXZlcnkgZmlsZSBhY2Nlc3MgYW5kIHN1YnByb2Nlc3MKKyAgIGNyZWF0aW9uLgorCisgICBTdHJpY3RseSBzcGVha2luZywgdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcmVxdWlyZWQgaW4gYWxsIEMtS2VybWl0CisgICBpbXBsZW1lbnRhdGlvbnMsIGJlY2F1c2UgdGhlaXIgdXNlIChzbyBmYXIsIGF0IGxlYXN0KSBpcyBpbnRlcm5hbCB0bworICAgdGhlIEdyb3VwIEUgbW9kdWxlcy4gSG93ZXZlciwgdGhleSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYWxsIEMtS2VybWl0CisgICBpbXBsZW1lbnRhdGlvbnMgZm9yIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgc3VwcG9ydCB0aGUgbm90aW9uIG9mIGEKKyAgIHByaXZpbGVnZWQgcHJvZ3JhbSAoVU5JWCwgUlNUUy9FLCB3aGF0IG90aGVycz8pLgorCisgICBpbnQKKyAgICAgICAgICBwcml2X2luaSgpCisgICAgICAgICAgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgcnVubmluZyBpbiBwcml2aWxlZ2VkIHN0YXR1cy4KKyAgICAgICAgICBJZiBzbywgdHVybiBvZmYgdGhlIHByaXZpbGVnZXMsIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGV5IGNhbiBiZQorICAgICAgICAgIHR1cm5lZCBvbiBhZ2FpbiB3aGVuIG5lZWRlZC4gQ2FsbGVkIGZyb20gc3lzaW5pdCgpIGF0IHByb2dyYW0KKyAgICAgICAgICBzdGFydHVwIHRpbWUuIFJldHVybnM6CisgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MKKyAgICAgICAgICAgIG5vbnplcm8gb24gZmFpbHVyZSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvZ3JhbSBzaG91bGQgaGFsdAorICAgICAgICAgIGltbWVkaWF0ZWx5LgorCisgICBpbnQKKyAgICAgICAgICBwcml2X29uKCkKKyAgICAgICAgICBJZiB0aGUgcHJvZ3JhbSBpcyBub3QgcHJpdmlsZWdlZCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuCisgICAgICAgICAgSWYgdGhlIHByb2dyYW0gaXMgcHJpdmlsZWdlZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGl0IHRvCisgICAgICAgICAgcHJpdmlsZWdlZCBzdGF0dXMuIHByaXZfaW5pKCkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGZpcnN0LgorICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MKKyAgICAgICAgICAgIG5vbnplcm8gb24gZmFpbHVyZQorCisgICBpbnQKKyAgICAgICAgICBwcml2X29mZigpCisgICAgICAgICAgVHVybnMgcHJpdmlsZWdlcyBvZmYgKGlmIHRoZXkgYXJlIG9uKSBpbiBzdWNoIGEgd2F5IHRoYXQgdGhleQorICAgICAgICAgIGNhbiBiZSB0dXJuZWQgYmFjayBvbiBhZ2Fpbi4gUmV0dXJuczoKKyAgICAgICAgICAgIDAgb24gc3VjY2VzcworICAgICAgICAgICAgbm9uemVybyBvbiBmYWlsdXJlCisKKyAgIGludAorICAgICAgICAgIHByaXZfY2FuKCkKKyAgICAgICAgICBUdXJucyBwcml2aWxlZ2VzIG9mZiBpbiBzdWNoIGEgd2F5IHRoYXQgdGhleSBjYW5ub3QgYmUgdHVybmVkCisgICAgICAgICAgYmFjayBvbi4gUmV0dXJuczoKKyAgICAgICAgICAgIDAgb24gc3VjY2VzcworICAgICAgICAgICAgbm9uemVybyBvbiBmYWlsdXJlCisKKyAgIGludAorICAgICAgICAgIHByaXZfY2hrKCkKKyAgICAgICAgICBBdHRlbXB0cyB0byB0dXJucyBwcml2aWxlZ2VzIG9mZiBpbiBzdWNoIGEgd2F5IHRoYXQgdGhleSBjYW4gYmUKKyAgICAgICAgICB0dXJuZWQgb24gYWdhaW4gbGF0ZXIuIFRoZW4gY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgd2VyZQorICAgICAgICAgIHJlYWxseSB0dXJuZWQgb2ZmLiBJZiB0aGV5IHdlcmUgbm90IHJlYWxseSB0dXJuZWQgb2ZmLCB0aGVuCisgICAgICAgICAgdGhleSBhcmUgY2FuY2VsbGVkIHBlcm1hbmVudGx5LiBSZXR1cm5zOgorICAgICAgICAgICAgMCBvbiBzdWNjZXNzCisgICAgICAgICAgICBub256ZXJvIG9uIGZhaWx1cmUKKworICAgIDQuRS4yLjQuIENvbnNvbGUtUmVsYXRlZCBGdW5jdGlvbnMKKworICAgVGhlc2UgcmVsYXRlIHRvIHRoZSBwcm9ncmFtJ3MgImNvbnNvbGUiLCBvciBjb250cm9sbGluZyB0ZXJtaW5hbCwgaS5lLgorICAgdGhlIHRlcm1pbmFsIHRoYXQgdGhlIHVzZXIgaXMgbG9nZ2VkIGluIG9uIGFuZCB0eXBlcyBjb21tYW5kcyBhdCwgb3IKKyAgIG9uIGEgUEMgb3Igd29ya3N0YXRpb24sIHRoZSBhY3R1YWwga2V5Ym9hcmQgYW5kIHNjcmVlbi4KKworICAgaW50CisgICAgICAgICAgY29uYmluKGVzYykgY2hhciBlc2M7CisgICAgICAgICAgUHV0cyB0aGUgY29uc29sZSBpbnRvICJiaW5hcnkiIG1vZGUsIHNvIHRoYXQgS2VybWl0J3MgY29tbWFuZAorICAgICAgICAgIHBhcnNlciBjYW4gY29udHJvbCBlY2hvaW5nIGFuZCBvdGhlciB0cmVhdG1lbnQgb2YgY2hhcmFjdGVycworICAgICAgICAgIHRoYXQgdGhlIHVzZXIgdHlwZXMuIGVzYyBpcyB0aGUgY2hhcmFjdGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvCisgICAgICAgICAgZ2V0IEtlcm1pdCdzIGF0dGVudGlvbiBkdXJpbmcgcGFja2V0IG1vZGU7IHB1dHMgdGhpcyBpbiBhCisgICAgICAgICAgZ2xvYmFsIHBsYWNlLiBTZXRzIHRoZSBja3hlY2ggdmFyaWFibGUuIFJldHVybnM6CisgICAgICAgICAgIC0xOiBvbiBlcnJvci4KKyAgICAgICAgICAgIDA6IG9uIHN1Y2Nlc3MuCisKKyAgIGludAorICAgICAgICAgIGNvbmNiKGVzYykgY2hhciBlc2M7CisgICAgICAgICAgUHV0IGNvbnNvbGUgaW4gImNicmVhayIgKHNpbmdsZS1jaGFyYWN0ZXIgd2FrZXVwKSBtb2RlLiBUaGF0CisgICAgICAgICAgaXMsIGVuc3VyZSB0aGF0IGVhY2ggY29uc29sZSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlIHRvIHRoZQorICAgICAgICAgIHByb2dyYW0gaW1tZWRpYXRlbHkgd2hlbiB0aGUgdXNlciB0eXBlcyBpdC4gT3RoZXJ3aXNlIGp1c3QgbGlrZQorICAgICAgICAgIGNvbmJpbigpLiBSZXR1cm5zOgorICAgICAgICAgICAtMTogb24gZXJyb3IuCisgICAgICAgICAgICAwOiBvbiBzdWNjZXNzLgorCisgICBpbnQKKyAgICAgICAgICBjb25jaGsoKQorICAgICAgICAgIFJldHVybnMgYSBudW1iZXIsIDAgb3IgZ3JlYXRlciwgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICAgICAgICAgd2FpdGluZyB0byBiZSByZWFkIGZyb20gdGhlIGNvbnNvbGUsIGkuZS4gdGhlIG51bWJlciBvZgorICAgICAgICAgIGNoYXJhY3RlcnMgdGhhdCB0aGUgdXNlciBoYXMgdHlwZWQgdGhhdCBoYXZlIG5vdCBiZWVuIHJlYWQgeWV0CisgICAgICAgICAgYnkgS2VybWl0LgorCisgICBsb25nCisgICAgICAgICAgY29uZ3NwZCgpOworICAgICAgICAgIFJldHVybnMgdGhlIHNwZWVkICgiYmF1ZCByYXRlIikgb2YgdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLCBpZgorICAgICAgICAgIGtub3duLCBvdGhlcndpc2UgLTFMLgorCisgICBpbnQKKyAgICAgICAgICBjb25na3ModGltbykgaW50IHRpbW87CisgICAgICAgICAgR2V0IEtleWJvYXJkIFNjYW5jb2RlLiBSZWFkcyBhIGtleWJvYXJkIHNjYW4gY29kZSBmcm9tIHRoZQorICAgICAgICAgIHBoeXNpY2FsIGNvbnNvbGUga2V5Ym9hcmQuIElmIHRoZSB0aW1vIHBhcmFtZXRlciBpcyBncmVhdGVyCisgICAgICAgICAgdGhhbiB6ZXJvLCB0aGVuIHRpbWVzIG91dCBhbmQgcmV0dXJucyAtMiBpZiBubyBjaGFyYWN0ZXIKKyAgICAgICAgICBhcHBlYXJzIHdpdGhpbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNlY29uZHMuIFVwb24gYW55IG90aGVyIGtpbmQKKyAgICAgICAgICBvZiBlcnJvciwgcmV0dXJucyAtMS4gVXBvbiBzdWNjZXNzIHJldHVybnMgYSBzY2FuIGNvZGUsIHdoaWNoCisgICAgICAgICAgbWF5IGJlIGFueSBwb3NpdGl2ZSBpbnRlZ2VyLiBGb3Igc2l0dWF0aW9ucyB3aGVyZSBzY2FuIGNvZGVzCisgICAgICAgICAgY2Fubm90IGJlIHJlYWQgKGZvciBleGFtcGxlLCB3aGVuIGFuIEFTQ0lJIHRlcm1pbmFsIGlzIHVzZWQgYXMKKyAgICAgICAgICB0aGUgam9iJ3MgY29udHJvbGxpbmcgdGVybWluYWwpLCB0aGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0bworICAgICAgICAgIGNvbmluYygpLCBpLmUuIGl0IHJldHVybnMgYW4gOC1iaXQgY2hhcmFjdGVyIHZhbHVlLiBjb25na3MoKSBpcworICAgICAgICAgIGZvciB1c2Ugd2l0aCB3b3Jrc3RhdGlvbnMgd2hvc2Uga2V5Ym9hcmRzIGhhdmUgQWx0ZXJuYXRlLAorICAgICAgICAgIENvbW1hbmQsIE9wdGlvbiwgYW5kIHNpbWlsYXIgbW9kaWZpZXIga2V5cywgYW5kIEZ1bmN0aW9uIGtleXMKKyAgICAgICAgICB0aGF0IGdlbmVyYXRlIGNvZGVzIGdyZWF0ZXIgdGhhbiAyNTUuCisKKyAgIGludAorICAgICAgICAgIGNvbmdtKCkKKyAgICAgICAgICBDb25zb2xlIGdldCBtb2Rlcy4gR2V0cyB0aGUgY3VycmVudCBjb25zb2xlIHRlcm1pbmFsIG1vZGVzIGFuZAorICAgICAgICAgIHNhdmVzIHRoZW0gc28gdGhhdCBjb25yZXMoKSBjYW4gcmVzdG9yZSB0aGVtIGxhdGVyLiBSZXR1cm5zIDEKKyAgICAgICAgICBpZiBpdCBnb3QgdGhlIG1vZGVzIE9LLCAwIGlmIGl0IGRpZCBub3RoaW5nIChlLmcuIGJlY2F1c2UKKyAgICAgICAgICBLZXJtaXQgaXMgbm90IGNvbm5lY3RlZCB3aXRoIGFueSB0ZXJtaW5hbCksIC0xIG9uIGVycm9yLgorCisgICBpbnQKKyAgICAgICAgICBjb25pbmModGltbykgaW50IHRpbW87CisgICAgICAgICAgQ29uc29sZSBJbnB1dCBDaGFyYWN0ZXIuIFJlYWRzIGEgY2hhcmFjdGVyIGZyb20gdGhlIGNvbnNvbGUuIElmCisgICAgICAgICAgdGhlIHRpbW8gcGFyYW1ldGVyIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGVuIGNvbmluYygpIHRpbWVzCisgICAgICAgICAgb3V0IGFuZCByZXR1cm5zIC0yIGlmIG5vIGNoYXJhY3RlciBhcHBlYXJzIHdpdGhpbiB0aGUgZ2l2ZW4KKyAgICAgICAgICBudW1iZXIgb2Ygc2Vjb25kcy4gVXBvbiBhbnkgb3RoZXIga2luZCBvZiBlcnJvciwgcmV0dXJucyAtMS4KKyAgICAgICAgICBVcG9uIHN1Y2Nlc3MsIHJldHVybnMgdGhlIGNoYXJhY3RlciBpdHNlbGYsIHdpdGggYSB2YWx1ZSBpbiB0aGUKKyAgICAgICAgICByYW5nZSAwLTI1NSBkZWNpbWFsLgorCisgICBWT0lECisgICAgICAgICAgY29uaW50KGYscykgU0lHVFlQICgqZikoKSwgKCpzKSgpOworICAgICAgICAgIFNldHMgdGhlIGNvbnNvbGUgdG8gZ2VuZXJhdGUgYW4gaW50ZXJydXB0IGlmIHRoZSB1c2VyIHR5cGVzIGEKKyAgICAgICAgICBrZXlib2FyZCBpbnRlcnJ1cHQgY2hhcmFjdGVyLCBhbmQgdG8gdHJhbnNmZXIgY29udHJvbCB0aGUKKyAgICAgICAgICBzaWduYWwtaGFuZGxpbmcgZnVuY3Rpb24gZi4gRm9yIHN5c3RlbXMgd2l0aCBqb2IgY29udHJvbCwgcyBpcworICAgICAgICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHN1c3BlbmRzIHRoZSBqb2IuIFNldHMgdGhlCisgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlICJiYWNrZ3JkIiB0byB6ZXJvIGlmIEtlcm1pdCBpcyBydW5uaW5nIGluIHRoZQorICAgICAgICAgIGZvcmVncm91bmQsIGFuZCB0byBub256ZXJvIGlmIEtlcm1pdCBpcyBydW5uaW5nIGluIHRoZQorICAgICAgICAgIGJhY2tncm91bmQuIFNlZSBja2NkZWIuaCBmb3IgdGhlIGRlZmluaXRpb24gb2YgU0lHVFlQLiBObworICAgICAgICAgIHJldHVybiB2YWx1ZS4KKworICAgVk9JRAorICAgICAgICAgIGNvbm5vaSgpCisgICAgICAgICAgQ29uc29sZSBubyBpbnRlcnJ1cHRzLiBEaXNhYmxlIGtleWJvYXJkIGludGVycnVwdHMgb24gdGhlCisgICAgICAgICAgY29uc29sZS4gTm8gcmV0dXJuIHZhbHVlLgorCisgICBpbnQKKyAgICAgICAgICBjb25vYyhjKSBjaGFyIGM7CisgICAgICAgICAgV3JpdGVzIGNoYXJhY3RlciBjIHRvIHRoZSBjb25zb2xlIHRlcm1pbmFsLiBSZXR1cm5zOgorICAgICAgICAgIDAgb24gZmFpbHVyZSwgMSBvbiBzdWNjZXNzLgorCisgICBpbnQKKyAgICAgICAgICBjb25vbChzKSBjaGFyICpzOworICAgICAgICAgIFdyaXRlcyBzdHJpbmcgcyB0byB0aGUgY29uc29sZS4gUmV0dXJucyAtMSBvbiBlcnJvciwgMCBvcgorICAgICAgICAgIGdyZWF0ZXIgb24gc3VjY2Vzcy4KKworICAgaW50CisgICAgICAgICAgY29ub2xhKHMpIGNoYXIgKnNbXTsgeworICAgICAgICAgIFdyaXRlcyBhbiBhcnJheSBvZiBzdHJpbmdzIHRvIHRoZSBjb25zb2xlLiBSZXR1cm5zIC0xIG9uIGVycm9yLAorICAgICAgICAgIDAgb3IgZ3JlYXRlciBvbiBzdWNjZXNzLgorCisgICBpbnQKKyAgICAgICAgICBjb25vbGwocykgY2hhciAqczsKKyAgICAgICAgICBXcml0ZXMgc3RyaW5nIHMgdG8gdGhlIGNvbnNvbGUsIGZvbGxvd2VkIGJ5IHRoZSBuZWNlc3NhcnkgbGluZQorICAgICAgICAgIHRlcm1pbmF0aW9uIGNoYXJhY3RlcnMgdG8gcHV0IHRoZSBjb25zb2xlIGN1cnNvciBhdCB0aGUKKyAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbGluZS4gUmV0dXJucyAtMSBvbiBlcnJvciwgMCBvciBncmVhdGVyCisgICAgICAgICAgb24gc3VjY2Vzcy4KKworICAgaW50CisgICAgICAgICAgY29ucmVzKCkKKyAgICAgICAgICBSZXN0b3JlcyB0aGUgY29uc29sZSB0ZXJtaW5hbCB0byB0aGUgbW9kZXMgb2J0YWluZWQgYnkgY29uZ20oKS4KKyAgICAgICAgICBSZXR1cm5zOiAtMSBvbiBlcnJvciwgMCBvbiBzdWNjZXNzLgorCisgICBpbnQKKyAgICAgICAgICBjb254byh4LHMpIGludCB4OyBjaGFyICpzOworICAgICAgICAgIFdyaXRlIHggY2hhcmFjdGVycyBmcm9tIHN0cmluZyBzIHRvIHRoZSBjb25zb2xlLiBSZXR1cm5zIDAgb3IKKyAgICAgICAgICBncmVhdGVyIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLgorCisgICBjaGFyICoKKyAgICAgICAgICBjb25rYmcoKTsKKyAgICAgICAgICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZGVzaWduYXRvciBvZiB0aGUgY29uc29sZSBrZXlib2FyZAorICAgICAgICAgIHR5cGUuIEZvciBleGFtcGxlLCBvbiBhIFBDLCB0aGlzIGZ1bmN0aW9uIHdvdWxkIHJldHVybiAiODgiLAorICAgICAgICAgICIxMDEiLCBldGMuIFVwb24gZmFpbHVyZSwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVtcHR5CisgICAgICAgICAgc3RyaW5nLgorCisgICAgNC5FLjIuNS4gQ29tbXVuaWNhdGlvbnMgRnVuY3Rpb25zCisKKyAgIFRoZSBjb21tdW5pY2F0aW9uIGRldmljZSBpcyB0aGUgZGV2aWNlIHVzZWQgZm9yIHRlcm1pbmFsIGVtdWxhdGlvbiBhbmQKKyAgIGZpbGUgdHJhbnNmZXIuIEl0IG1heSBvciBtYXkgbm90IGJlIHRoZSBzYW1lIGRldmljZSBhcyB0aGUgY29uc29sZSwKKyAgIGFuZCBpdCBtYXkgb3IgbWF5IG5vdCBiZSBhIHRlcm1pbmFsIChzZXJpYWwtcG9ydCkgZGV2aWNlOyBpdCBjb3VsZAorICAgYWxzbyBiZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gRm9yIGJyZXZpdHksIHRoZSBjb21tdW5pY2F0aW9uIGRldmljZSBpcworICAgcmVmZXJyZWQgdG8gaGVyZSBhcyB0aGUgInR0eSIuIFdoZW4gdGhlIGNvbW11bmljYXRpb24gZGV2aWNlIGlzIHRoZQorICAgc2FtZSBhcyB0aGUgY29uc29sZSBkZXZpY2UsIEtlcm1pdCBpcyBzYWlkIHRvIGJlIGluIHJlbW90ZSBtb2RlLiBXaGVuCisgICB0aGUgdHdvIGRldmljZXMgYXJlIGRpZmZlcmVudCwgS2VybWl0IGlzIGluIGxvY2FsIG1vZGUuCisKKyAgIGludAorICAgICAgICAgIHR0Y2hrKCkKKyAgICAgICAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGhhdmUgYXJyaXZlZCBhdCB0aGUKKyAgICAgICAgICBjb21tdW5pY2F0aW9uIGRldmljZSBidXQgaGF2ZSBub3QgeWV0IGJlZW4gcmVhZCBieSB0dGluYygpLAorICAgICAgICAgIHR0aW5sKCksIGFuZCBmcmllbmRzLiBJZiBjb21tdW5pY2F0aW9uIGlucHV0IGlzIGJ1ZmZlcmVkIChhbmQKKyAgICAgICAgICBpdCBzaG91bGQgYmUpLCB0aGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlciBvZiB1bnJlYWQKKyAgICAgICAgICBjaGFyYWN0ZXJzIGluIEtlcm1pdCdzIGJ1ZmZlciBQTFVTIHRoZSBudW1iZXIgb2YgdW5yZWFkCisgICAgICAgICAgY2hhcmFjdGVycyBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIGludGVybmFsIGJ1ZmZlci4gVGhlIGNhbGwKKyAgICAgICAgICBtdXN0IGJlIG5vbmRlc3RydWN0aXZlIGFuZCBub25ibG9ja2luZywgYW5kIGFzIGluZXhwZW5zaXZlIGFzCisgICAgICAgICAgcG9zc2libGUuIFJldHVybnM6CisgICAgICAgICAgICAwOiBvciBncmVhdGVyIG9uIHN1Y2Nlc3MsCisgICAgICAgICAgICAwOiBpbiBjYXNlIG9mIGludGVybmFsIGVycm9yLAorICAgICAgICAgICAtMTogb3IgbGVzcyB3aGVuIGl0IGRldGVybWluZXMgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gYnJva2VuLAorICAgICAgICAgIG9yIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24uCisKKyAgICAgICAgICBUaGF0IGlzLCBhIG5lZ2F0aXZlIHJldHVybiBmcm9tIHR0Y2hrKCkgc2hvdWxkIHJlbGlhYmx5CisgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyB1c2FibGUgY29ubmVjdGlvbi4gRnVydGhlcm1vcmUsCisgICAgICAgICAgdHRjaGsoKSBzaG91bGQgYmUgY2FsbGFibGUgYXQgYW55IHRpbWUgdG8gc2VlIGlmIHRoZSBjb25uZWN0aW9uCisgICAgICAgICAgaXMgb3Blbi4gV2hlbiB0aGUgY29ubmVjdGlvbiBpcyBvcGVuLCBldmVyeSBlZmZvcnQgbXVzdCBiZSBtYWRlCisgICAgICAgICAgdG8gZW5zdXJlIHRoYXQgdHRjaGsgcmV0dXJucyBhbiBhY2N1cmF0ZSBudW1iZXIgb2YgY2hhcmFjdGVycworICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVhZCwgcmF0aGVyIHRoYW4ganVzdCAwIChubyBjaGFyYWN0ZXJzKSBvciAxICgxCisgICAgICAgICAgb3IgbW9yZSBjaGFyYWN0ZXJzKSwgYXMgd291bGQgYmUgdGhlIGNhc2Ugd2hlbiB3ZSB1c2Ugc2VsZWN0KCkuCisgICAgICAgICAgVGhpcyBhc3BlY3Qgb2YgdHRjaGsncyBvcGVyYXRpb24gaXMgY3JpdGljYWwgdG8gc3VjY2Vzc2Z1bAorICAgICAgICAgIG9wZXJhdGlvbiBvZiBzbGlkaW5nIHdpbmRvd3MgYW5kIHN0cmVhbWluZywgYnV0ICJub25kZXN0cnVjdGl2ZQorICAgICAgICAgIGJ1ZmZlciBwZWVraW5nIiBpcyBhbiBvYnNjdXJlIG9wZXJhdGluZyBzeXN0ZW0gZmVhdHVyZSwgYW5kIHNvCisgICAgICAgICAgd2hlbiBpdCBpcyBub3QgYXZhaWxhYmxlLCB3ZSBoYXZlIHRvIGRvIGl0IG91cnNlbHZlcyBieQorICAgICAgICAgIG1hbmFnaW5nIG91ciBvd24gaW50ZXJuYWwgYnVmZmVyIGF0IGEgbGV2ZWwgYmVsb3cgdHRpbmMoKSwKKyAgICAgICAgICB0dGlubCgpLCBldGMsIGFzIGluIHRoZSBVTklYIHZlcnNpb24gKG5vbi1GSU9OUkVBRCBjYXNlKS4KKworICAgICAgICAgIEFuIGV4dGVybmFsIGdsb2JhbCB2YXJpYWJsZSwgY2xzb25kaXNjLCBpZiBub256ZXJvLCBtZWFucyB0aGF0CisgICAgICAgICAgaWYgYSBzZXJpYWwgY29ubmVjdGlvbiBkcm9wcyAoY2FycmllciBvbi10by1vZmYgdHJhbnNpdGlvbgorICAgICAgICAgIGRldGVjdGVkIGJ5IHR0Y2hrKCkpLCB0aGUgZGV2aWNlIHNob3VsZCBiZSBjbG9zZWQgYW5kIHJlbGVhc2VkCisgICAgICAgICAgYXV0b21hdGljYWxseS4KKworICAgaW50CisgICAgICAgICAgdHRjbG9zKCkKKyAgICAgICAgICBDbG9zZXMgdGhlIGNvbW11bmljYXRpb24gZGV2aWNlICh0dHkgb3IgbmV0d29yaykuIElmIHRoZXJlIHdlcmUKKyAgICAgICAgICBhbnkga2luZCBvZiBleGNsdXNpdmUgYWNjZXNzIGxvY2tzIGNvbm5lY3RlZCB3aXRoIHRoZSB0dHksCisgICAgICAgICAgdGhlc2UgYXJlIHJlbGVhc2VkLiBJZiB0aGUgdHR5IGhhcyBhIG1vZGVtIGNvbm5lY3Rpb24sIGl0IGlzCisgICAgICAgICAgaHVuZyB1cC4gRm9yIHRydWUgdHR5IGRldmljZXMsIHRoZSBvcmlnaW5hbCB0dHkgZGV2aWNlIG1vZGVzCisgICAgICAgICAgYXJlIHJlc3RvcmVkLiBSZXR1cm5zOgorICAgICAgICAgICAtMTogb24gZmFpbHVyZS4KKyAgICAgICAgICAgIDA6IG9uIHN1Y2Nlc3MuCisKKyAgIGludAorICAgICAgICAgIHR0Zmx1aSgpCisgICAgICAgICAgRmx1c2ggY29tbXVuaWNhdGlvbnMgaW5wdXQgYnVmZmVyLiBJZiBhbnkgY2hhcmFjdGVycyBoYXZlCisgICAgICAgICAgYXJyaXZlZCBidXQgaGF2ZSBub3QgeWV0IGJlZW4gcmVhZCwgZGlzY2FyZCB0aGVzZSBjaGFyYWN0ZXJzLgorICAgICAgICAgIElmIGNvbW11bmljYXRpb25zIGlucHV0IGlzIGJ1ZmZlcmVkIGJ5IEtlcm1pdCAoYW5kIGl0IHNob3VsZAorICAgICAgICAgIGJlKSwgdGhpcyBmdW5jdGlvbiBmbHVzaGVzIEtlcm1pdCdzIGJ1ZmZlciBhcyB3ZWxsIGFzIHRoZQorICAgICAgICAgIG9wZXJhdGluZyBzeXN0ZW0ncyBpbnRlcm5hbCBpbnB1dCBidWZmZXIuIFJldHVybnM6CisgICAgICAgICAgIC0xOiBvbiBmYWlsdXJlLgorICAgICAgICAgICAgMDogb24gc3VjY2Vzcy4KKworICAgaW50CisgICAgICAgICAgdHRmbHVvKCkKKyAgICAgICAgICBGbHVzaCB0dHkgb3V0cHV0IGJ1ZmZlci4gSWYgYW55IGNoYXJhY3RlcnMgaGF2ZSBiZWVuIHdyaXR0ZW4KKyAgICAgICAgICBidXQgbm90IGFjdHVhbGx5IHRyYW5zbWl0dGVkIChlLmcuIGJlY2F1c2UgdGhlIHN5c3RlbSBoYXMgYmVlbgorICAgICAgICAgIGZsb3ctY29udHJvbGxlZCksIHJlbW92ZSB0aGVtIGZyb20gdGhlIHN5c3RlbSdzIG91dHB1dCBidWZmZXIuCisgICAgICAgICAgKE5vdGUsIHRoaXMgZnVuY3Rpb24gaXMgbm90IGFjdHVhbGx5IHVzZWQsIGJ1dCBpdCBpcworICAgICAgICAgIHJlY29tbWVuZGVkIHRoYXQgYWxsIEMtS2VybWl0IHByb2dyYW1tZXJzIGFkZCBpdCBmb3IgZnV0dXJlCisgICAgICAgICAgdXNlLCBldmVuIGlmIGl0IGlzIG9ubHkgYSBkdW1teSBmdW5jdGlvbiB0aGF0IHJldHVybnMgMAorICAgICAgICAgIGFsd2F5cy4pCisKKyAgIGludAorICAgICAgICAgIHR0Z21kbSgpCisgICAgICAgICAgTG9va3MgZm9yIHRoZSBtb2RlbSBzaWduYWxzIENUUywgRFNSLCBhbmQgQ1RTLCBhbmQgcmV0dXJucworICAgICAgICAgIHRob3NlIHRoYXQgYXJlIG9uIGluIGFzIGl0cyByZXR1cm4gdmFsdWUsIGluIGEgYml0IG1hc2sgYXMKKyAgICAgICAgICBkZXNjcmliZWQgZm9yIHR0d21kbSwgaW4gd2hpY2ggYSBiaXQgaXMgb24gKDEpIG9yIG9mZiAoMCkKKyAgICAgICAgICBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBzaWduYWwgaXMgb24gKGFzc2VydGVkKQorICAgICAgICAgIG9yIG9mZiAobm90IGFzc2VydGVkKS4gUmV0dXJuIHZhbHVlczoKKyAgICAgICAgICAgLTM6IE5vdCBpbXBsZW1lbnRlZAorICAgICAgICAgICAtMjogaWYgdGhlIGxpbmUgZG9lcyBub3QgaGF2ZSBtb2RlbSBjb250cm9sCisgICAgICAgICAgIC0xOiBvbiBlcnJvcgorICAgICAgICAgID49MDogb24gc3VjY2Vzcywgd2l0aCBiaXQgbWFzayBjb250YWluaW5nIHRoZSBtb2RlbSBzaWduYWxzLgorCisgICBsb25nCisgICAgICAgICAgdHRnc3BkKCkKKyAgICAgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IHR0eSBzcGVlZCBpbiBCSVRTIChub3QgQ0hBUkFDVEVSUykgcGVyCisgICAgICAgICAgc2Vjb25kLCBvciAtMSBpZiBpdCBpcyBub3Qga25vd24gb3IgaWYgdGhlIHR0eSBpcyByZWFsbHkgYQorICAgICAgICAgIG5ldHdvcmssIG9yIHVwb24gYW55IGtpbmQgb2YgZXJyb3IuIE9uIHN1Y2Nlc3MsIHRoZSBzcGVlZAorICAgICAgICAgIHJldHVybmVkIGlzIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJpdHMgcGVyIHNlY29uZCwgbGlrZSAxMjAwLAorICAgICAgICAgIDk2MDAsIDE5MjAwLCBldGMuCisKKyAgIGludAorICAgICAgICAgIHR0Z3dzaXooKQorICAgICAgICAgIEdldCB0ZXJtaW5hbCB3aW5kb3cgc2l6ZS4gUmV0dXJucyAtMSBvbiBlcnJvciwgMCBpZiB0aGUgd2luZG93CisgICAgICAgICAgc2l6ZSBjYW4ndCBiZSBvYnRhaW5lZCwgMSBpZiB0aGUgd2luZG93IHNpemUgaGFzIGJlZW4KKyAgICAgICAgICBzdWNjZXNzZnVsbHkgb2J0YWluZWQuIFVwb24gc3VjY2VzcywgdGhlIGV4dGVybmFsIGdsb2JhbAorICAgICAgICAgIHZhcmlhYmxlcyB0dF9yb3dzIGFuZCB0dF9jb2xzIGFyZSBzZXQgdG8gdGhlIG51bWJlciBvZiBzY3JlZW4KKyAgICAgICAgICByb3dzIGFuZCBudW1iZXIgb2Ygc2NyZWVuIGNvbHVtbnMsIHJlc3BlY3RpdmVseS4gQXMgdGhpcworICAgICAgICAgIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBhbGwgY2sqdGlvLmMgbW9kdWxlcywgY2FsbHMgdG8KKyAgICAgICAgICBpdCBtdXN0IGJlIHdyYXBwZWQgaW4gI2lmZGVmIENLX1RUR1dTSVouLiNlbmRpZi4gTk9URTogVGhpcworICAgICAgICAgIGZ1bmN0aW9uIG11c3QgYmUgYXZhaWxhYmxlIHRvIHVzZSB0aGUgVEVMTkVUIE5BV1MgZmVhdHVyZQorICAgICAgICAgIChOZWdvdGlhdGUgQWJvdXQgV2luZG93IFNpemUpIGFzIHdlbGwgYXMgUmxvZ2luLgorCisgICBpbnQKKyAgICAgICAgICB0dGhhbmcoKQorICAgICAgICAgIEhhbmcgdXAgdGhlIGN1cnJlbnQgdHR5IGRldmljZS4gRm9yIHJlYWwgdHR5IGRldmljZXMsIHR1cm4gb2ZmCisgICAgICAgICAgRFRSIGZvciBhYm91dCAxLzMtMS8yIHNlY29uZCAob3Igb3RoZXIgbGVuZ3RoIG9mIHRpbWUsCisgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0pLiBJZiB0aGUgdHR5IGlzIHJlYWxseSBhIG5ldHdvcmsKKyAgICAgICAgICBjb25uZWN0aW9uLCBjbG9zZSBpdC4gUmV0dXJuczoKKyAgICAgICAgICAgLTE6IG9uIGZhaWx1cmUuCisgICAgICAgICAgICAwOiBpZiBpdCBkb2VzIG5vdCBldmVuIHRyeSB0byBoYW5nIHVwLgorICAgICAgICAgICAgMTogaWYgaXQgYmVsaWV2ZXMgaXQgaHVuZyB1cCBzdWNjZXNzZnVsbHkuCisKKyAgIFZPSUQKKyAgICAgICAgICB0dGltb2ZmKCkKKyAgICAgICAgICBUdXJucyBvZmYgYWxsIHBlbmRpbmcgdGltZXIgaW50ZXJydXB0cy4KKworICAgaW50CisgICAgICAgICAgdHRpbmModGltbykgaW50IHRpbW87IChmdW5jdGlvbiBpcyBvbGQsIHJldHVybiBjb2RlcyBhcmUgbmV3KQorICAgICAgICAgIFJlYWRzIG9uZSBjaGFyYWN0ZXIgZnJvbSB0aGUgY29tbXVuaWNhdGlvbiBkZXZpY2UuIElmIHRpbW8gaXMKKyAgICAgICAgICBncmVhdGVyIHRoYW4gemVybywgd2FpdCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNlY29uZHMgYW5kIHRoZW4KKyAgICAgICAgICB0aW1lIG91dCBpZiBubyBjaGFyYWN0ZXIgYXJyaXZlcywgb3RoZXJ3aXNlIHdhaXQgZm9yZXZlciBmb3IgYQorICAgICAgICAgIGNoYXJhY3Rlci4gUmV0dXJuczoKKyAgICAgICAgICAgLTM6IGludGVybmFsIGVycm9yIChlLmcuIHR0eSBtb2RlcyBzZXQgd3JvbmcpCisgICAgICAgICAgIC0yOiBjb21tdW5pY2F0aW9ucyBkaXNjb25uZWN0CisgICAgICAgICAgIC0xOiB0aW1lb3V0IG9yIG90aGVyIGVycm9yCisgICAgICAgICAgPj0wOiB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHJlYWQuCisgICAgICAgICAgSXQgaXMgSElHSExZIFJFQ09NTUVOREVEIHRoYXQgdHRpbmMoKSBiZSBpbnRlcm5hbGx5IGJ1ZmZlcmVkIHNvCisgICAgICAgICAgdGhhdCBjYWxscyB0byBpdCBhcmUgcmVsYXRpdmVseSBpbmV4cGVuc2l2ZS4gSWYgaXQgaXMgcG9zc2libGUKKyAgICAgICAgICB0byB0byBpbXBsZW1lbnQgdHRpbmMoKSBhcyBhIG1hY3JvLCBhbGwgdGhlIGJldHRlciwgZm9yIGV4YW1wbGUKKyAgICAgICAgICBzb21ldGhpbmcgbGlrZToKKworICAjZGVmaW5lIHR0aW5jKHQpICggKC0tdHhidWZuID49IDApID8gdHhidWZbdHRidWZwKytdIDogdHhidWZyKHQpICkKKworICAgICAgICAgIChzZWUgZGVzY3JpcHRpb24gb2YgdHhidWZyKCkgYmVsb3cpCisKKyAgIGludAorICAgICAgICAgIHR0aW5sKGRlc3QsbWF4LHRpbW8sZW9sLHN0YXJ0LHR1cm4pIGludCBtYXgsdGltbyx0dXJuOyBDSEFSCisgICAgICAgICAgKmRlc3QsIGVvbCwgc3RhcnQ7CisgICAgICAgICAgdHRpbmwoKSBpcyBLZXJtaXQncyBwYWNrZXQgcmVhZGVyLiBSZWFkcyBhIHBhY2tldCBmcm9tIHRoZQorICAgICAgICAgIGNvbW11bmljYXRpb25zIGRldmljZSwgb3IgdXAgdG8gbWF4IGNoYXJhY3RlcnMsIHdoaWNoZXZlcgorICAgICAgICAgIG9jY3VycyBmaXJzdC4gQSBsaW5lIGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgc3RhcnRpbmcgd2l0aAorICAgICAgICAgIHRoZSBzdGFydCBjaGFyYWN0ZXIgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgY2hhcmFjdGVyIGdpdmVuIGluCisgICAgICAgICAgZW9sIG9yIHVudGlsIHRoZSBsZW5ndGggaXMgZXhoYXVzdGVkLCBvciwgaWYgdHVybiAhPSAwLCB1bnRpbAorICAgICAgICAgIHRoZSBsaW5lIHR1cm5hcm91bmQgY2hhcmFjdGVyICh0dXJuKSBpcyByZWFkLiBJZiB0dXJuIGlzIDAsCisgICAgICAgICAgdHRpbmwoKSAqc2hvdWxkKiB1c2UgdGhlIHBhY2tldCBsZW5ndGggZmllbGQgdG8gZGV0ZWN0IHRoZSBlbmQsCisgICAgICAgICAgdG8gYWxsb3cgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBlb2wgY2hhcmFjdGVyIGFwcGVhcnMKKyAgICAgICAgICB1bnByZWZpeGVkIGluIHRoZSBwYWNrZXQgZGF0YS4gKFRoZSB0dXJuYXJvdW5kIGNoYXJhY3RlciBpcyBmb3IKKyAgICAgICAgICBoYWxmLWR1cGxleCBsaW5lbW9kZSBjb25uZWN0aW9ucy4pCisKKyAgICAgICAgICBJZiB0aW1vIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0dGlubCgpIHRpbWVzIG91dCBpZiB0aGUgZW9sCisgICAgICAgICAgY2hhcmFjdGVyIGlzIG5vdCBlbmNvdW50ZXJlZCB3aXRoaW4gdGhlIGdpdmVuIG51bWJlciBvZiBzZWNvbmRzCisgICAgICAgICAgYW5kIHJldHVybnMgLTEuCisKKyAgICAgICAgICBUaGUgY2hhcmFjdGVycyB0aGF0IHdlcmUgaW5wdXQgYXJlIGNvcGllZCBpbnRvICJkZXN0IiB3aXRoCisgICAgICAgICAgdGhlaXIgcGFyaXR5IGJpdHMgc3RyaXBwZWQgaWYgcGFyaXR5IGlzIG5vdCBub25lLiBUaGUgZmlyc3QKKyAgICAgICAgICBjaGFyYWN0ZXIgY29waWVkIGludG8gZGVzdCBzaG91bGQgYmUgdGhlIHN0YXJ0IGNoYXJhY3RlciwgYW5kCisgICAgICAgICAgdGhlIGxhc3Qgc2hvdWxkIGJlIHRoZSBmaW5hbCBjaGFyYWN0ZXIgb2YgdGhlIHBhY2tldCAodGhlIGxhc3QKKyAgICAgICAgICBibG9jayBjaGVjayBjaGFyYWN0ZXIpLiB0dGlubCgpIHNob3VsZCBhbHNvIGFic29yYiBhbmQgZGlzY2FyZAorICAgICAgICAgIHRoZSBlb2wgYW5kIHR1cm4gY2hhcmFjdGVycywgYW5kIGFueSBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgYXJlCisgICAgICAgICAgd2FpdGluZyB0byBiZSByZWFkLCB1cCB1bnRpbCB0aGUgbmV4dCBzdGFydCBjaGFyYWN0ZXIsIHNvIHRoYXQKKyAgICAgICAgICBzdWJzZXF1ZW50IGNhbGxzIHRvIHR0Y2hrKCkgd2lsbCBub3Qgc3VjY2VlZCBzaW1wbHkgYmVjYXVzZQorICAgICAgICAgIHRoZXJlIGFyZSBzb21lIHRlcm1pbmF0b3JzIHN0aWxsIHNpdHRpbmcgaW4gdGhlIGJ1ZmZlciB0aGF0CisgICAgICAgICAgdHRpbmwoKSBkaWRuJ3QgcmVhZC4gVGhpcyBvcGVyYXRpb24sIGlmIHBlcmZvcm1lZCwgTVVTVCBOT1QKKyAgICAgICAgICBCTE9DSyAoc28gaWYgaXQgY2FuJ3QgYmUgcGVyZm9ybWVkIGluIGEgZ3VhcmFudGVlZCBub25ibG9ja2luZworICAgICAgICAgIHdheSwgZG9uJ3QgZG8gaXQpLgorCisgICAgICAgICAgT24gc3VjY2VzcywgdHRpbmwoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLgorICAgICAgICAgIE9wdGlvbmFsbHksIHR0aW5sKCkgY2FuIHNlbnNlIHRoZSBwYXJpdHkgb2YgaW5jb21pbmcgcGFja2V0cy4KKyAgICAgICAgICBJZiBpdCBkb2VzIHRoaXMsIHRoZW4gaXQgc2hvdWxkIHNldCB0aGUgZ2xvYmFsIHZhcmlhYmxlIHR0cHJ0eQorICAgICAgICAgIGFjY29yZGluZ2x5LiB0dGlubCgpIHNob3VsZCBiZSBjb2RlZCB0byBiZSBhcyBlZmZpY2llbnQgYXMKKyAgICAgICAgICBwb3NzaWJsZSwgc2luY2UgaXQgaXMgYXQgdGhlICJpbm5lciBsb29wIiBvZiBwYWNrZXQgcmVjZXB0aW9uLgorICAgICAgICAgIHR0aW5sKCkgcmV0dXJuczoKKyAgICAgICAgICAgLTE6IFRpbWVvdXQgb3Igb3RoZXIgcG9zc2libHkgY29ycmVjdGFibGUgZXJyb3IuCisgICAgICAgICAgIC0yOiBJbnRlcnJ1cHRlZCBmcm9tIGtleWJvYXJkLgorICAgICAgICAgICAtMzogVW5jb3JyZWN0YWJsZSBpL28gZXJyb3IgLS0gY29ubmVjdGlvbiBsb3N0LCBjb25maWd1cmF0aW9uCisgICAgICAgICAgcHJvYmxlbSwgZXRjLgorICAgICAgICAgID49MDogb24gc3VjY2VzcywgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBhY3R1YWxseQorICAgICAgICAgIHJlYWQgYW5kIHBsYWNlZCBpbiB0aGUgZGVzdCBidWZmZXIsIG5vdCBjb3VudGluZyB0aGUgdHJhaWxpbmcKKyAgICAgICAgICBudWxsLgorCisgICBpbnQKKyAgICAgICAgICB0dG9jKGMpIGNoYXIgYzsKKyAgICAgICAgICBPdXRwdXRzIHRoZSBjaGFyYWN0ZXIgYyB0byB0aGUgY29tbXVuaWNhdGlvbiBsaW5lLiBJZiB0aGUKKyAgICAgICAgICBvcGVyYXRpb24gZmFpbHMgdG8gY29tcGxldGUgd2l0aGluIHR3byBzZWNvbmRzLCB0aGlzIGZ1bmN0aW9uCisgICAgICAgICAgcmV0dXJucyAtMS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICAgICAgICAgYWN0dWFsbHkgd3JpdHRlbiB0byB0aGUgdHR5ICgwIG9yIDEpLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5CisgICAgICAgICAgYmUgdXNlZCBmb3IgaW50ZXJhY3RpdmUsIGNoYXJhY3Rlci1tb2RlIG9wZXJhdGlvbnMsIGxpa2UKKyAgICAgICAgICB0ZXJtaW5hbCBjb25uZWN0aW9uLCBzY3JpcHQgZXhlY3V0aW9uLCBkaWFsZXIgaS9vLCB3aGVyZSB0aGUKKyAgICAgICAgICBvdmVyaGVhZCBvZiB0aGUgc2lnbmFscyBhbmQgYWxhcm1zIGRvZXMgbm90IGNyZWF0ZSBhCisgICAgICAgICAgYm90dGxlbmVjay4gKFRISVMgREVTQ1JJUFRJT04gTkVFRFMgSU1QUk9WRU1FTlQgLS0gSWYgdGhlCisgICAgICAgICAgb3BlcmF0aW9uIGZhaWxzIHdpdGhpbiBhICJjZXJ0YWluIGFtb3VudCBvZiB0aW1lIi4uLiB3aGljaAorICAgICAgICAgIG1pZ2h0IGJlIGRlcGVuZGVudCBvbiB0aGUgY29tbXVuaWNhdGlvbiBtZXRob2QsIHNwZWVkLCBldGMuIEluCisgICAgICAgICAgcGFydGljdWxhciwgZmxvdy1jb250cm9sIGRlYWRsb2NrcyBtdXN0IGJlIGFjY291bnRlZCBmb3IgYW5kCisgICAgICAgICAgYnJva2VuIG91dCBvZiB0byBwcmV2ZW50IHRoZSBwcm9ncmFtIGZyb20gaGFuZ2luZyBpbmRlZmluaXRlbHksCisgICAgICAgICAgZXRjLikKKworICAgaW50CisgICAgICAgICAgdHRvbChzLG4pIGludCBuOyBjaGFyICpzOworICAgICAgICAgIEtlcm1pdCdzIHBhY2tldCB3cml0ZXIuIFdyaXRlcyB0aGUgbiBjaGFyYWN0ZXJzIG9mIHRoZSBzdHJpbmcKKyAgICAgICAgICBwb2ludGVkIHRvIHRvIGJ5IHMuIE5PVEU6IEl0IGlzIHR0b2wncyByZXNwb25zaWJpbGl0eSB0byB3cml0ZQorICAgICAgICAgIEFMTCBvZiB0aGUgY2hhcmFjdGVycywgbm90IGp1c3Qgc29tZSBvZiB0aGVtLiBSZXR1cm5zOgorICAgICAgICAgICAtMTogb24gYSBwb3NzaWJseSBjb3JyZWN0YWJsZSBlcnJvciAoc28gaXQgY2FuIGJlIHJldHJpZWQpLgorICAgICAgICAgICAtMzogb24gYSBmYXRhbCBlcnJvciwgZS5nLiBjb25uZWN0aW9uIGxvc3QuCisgICAgICAgICAgPj0wOiBvbiBzdWNjZXNzLCB0aGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gKHRoZQorICAgICAgICAgIHNwZWNpZmljIG51bWJlciBpcyBub3QgYWN0dWFsbHkgdXNlZCBmb3IgYW55dGhpbmcpLgorCisgICBpbnQKKyAgICAgICAgICB0dG9wZW4odHRuYW1lLGxjbCxtb2RlbSx0aW1vKSBjaGFyICp0dG5hbWU7IGludCAqbGNsLCBtb2RlbSwKKyAgICAgICAgICB0aW1vOworICAgICAgICAgIE9wZW5zIGEgdHR5IGRldmljZSwgaWYgaXQgaXMgbm90IGFscmVhZHkgb3Blbi4gdHRvcGVuIG11c3QKKyAgICAgICAgICBjaGVjayB0byBtYWtlIHN1cmUgdGhlIFNBTUUgZGV2aWNlIGlzIG5vdCBhbHJlYWR5IG9wZW47IGlmIGl0CisgICAgICAgICAgaXMsIHR0b3BlbiByZXR1cm5zIHN1Y2Nlc3NmdWxseSB3aXRob3V0IGRvaW5nIGFueXRoaW5nLiBJZiBhCisgICAgICAgICAgRElGRkVSRU5UIGRldmljZSBpcyBjdXJyZW50bHkgb3BlbiwgdHRvcGVuKCkgbXVzdCBjYWxsIHR0Y2xvcygpCisgICAgICAgICAgdG8gY2xvc2UgaXQgYmVmb3JlIG9wZW5pbmcgdGhlIG5ldyBvbmUuCisKKyAgICAgICAgUGFyYW1ldGVyczoKKworICAgICAgICAgICAgICB0dG5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIHN0cmluZyAtIGRldmljZSBuYW1lIG9yIG5ldHdvcmsgaG9zdAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUuCisKKyAgICAgICAgICAgICAgbGNsOgorICAgICAgICAgICAgICAgICAgICAgIElmIGNhbGxlZCB3aXRoIGxjbCA8IDAsIHNldHMgdmFsdWUgb2YgbGNsIGFzCisgICAgICAgICAgICAgICAgICAgICAgZm9sbG93czoKKyAgICAgICAgICAgICAgICAgICAgICAwOiB0aGUgdGVybWluYWwgbmFtZWQgYnkgdHRuYW1lIGlzIHRoZSBqb2IncworICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsaW5nIHRlcm1pbmFsLgorICAgICAgICAgICAgICAgICAgICAgIDE6IHRoZSB0ZXJtaW5hbCBuYW1lZCBieSB0dG5hbWUgaXMgbm90IHRoZSBqb2IncworICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsaW5nIHRlcm1pbmFsLgorICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBkZXZpY2UgaXMgYWxyZWFkeSBvcGVuLCBvciBpZiB0aGUgcmVxdWVzdGVkCisgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIGNhbid0IGJlIG9wZW5lZCwgdGhlbiBsY2wgcmVtYWlucyAoYW5kIGlzCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYXMpIC0xLgorCisgICAgICAgICAgICAgIG1vZGVtOgorICAgICAgICAgICAgICAgICAgICAgIExlc3MgdGhhbiB6ZXJvOiB0aGlzIGlzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbmV0d29yaworICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIGFuZCB0dG5hbWUgaXMgYSBuZXR3b3JrIGhvc3QgbmFtZS4gTmV0d29yaworICAgICAgICAgICAgICAgICAgICAgIHR5cGVzIChmcm9tIFsxMTJdY2tjbmV0Lmg6CisKKyAgTkVUX1RDUEIgMSAgIFRDUC9JUCBCZXJrZWxleSAoc29ja2V0KSAgKGltcGxlbWVudGVkIGluIFsxMTNdY2t1dGlvLmMpCisgIE5FVF9UQ1BBIDIgICBUQ1AvSVAgQVQmVCAoc3RyZWFtcykgICAgIChub3QgeWV0IGltcGxlbWVudGVkKQorICBORVRfREVDICAzICAgREVDbmV0ICAgICAgICAgICAgICAgICAgICAobm90IHlldCBpbXBsZW1lbnRlZCkKKworICAgICAgICAgICAgICAgICAgICAgIFplcm8gb3IgZ3JlYXRlcjogdHRuYW1lIGlzIGEgdGVybWluYWwgZGV2aWNlIG5hbWUuCisgICAgICAgICAgICAgICAgICAgICAgWmVybyBtZWFucyBhIGRpcmVjdCBjb25uZWN0aW9uIChkb24ndCB1c2UgbW9kZW0KKyAgICAgICAgICAgICAgICAgICAgICBzaWduYWxzKS4gUG9zaXRpdmUgbWVhbnMgdXNlIG1vZGVtIHNpZ25hbHMKKyAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc2V0dGluZyBvZiB0dGNhcnIgKHNlZQorICAgICAgICAgICAgICAgICAgICAgIHR0c2NhcnIoKSkuCisKKyAgICAgICAgICAgICAgdGltbzoKKyAgICAgICAgICAgICAgICAgICAgICA+IDA6IG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIG9wZW4oKSB0byByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgdGltaW5nIG91dC4KKyAgICAgICAgICAgICAgICAgICAgICA8PTA6IG5vIHRpbWVyLCB3YWl0IGZvcmV2ZXIgKGUuZy4gZm9yIGluY29taW5nCisgICAgICAgICAgICAgICAgICAgICAgY2FsbCkuCisgICAgICAgICAgICAgICAgICAgICAgRm9yIHJlYWwgdHR5IGRldmljZXMsIHR0b3BlbigpIGF0dGVtcHRzIHRvIGdhaW4KKyAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSB0dHkgZGV2aWNlLCBmb3IgZXhhbXBsZSBpbgorICAgICAgICAgICAgICAgICAgICAgIFVOSVggYnkgY3JlYXRpbmcgYSAibG9ja2ZpbGUiIChpbiBvdGhlciBvcGVyYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1zLCBsaWtlIFZNUywgZXhjbHVzaXZlIGFjY2VzcyBwcm9iYWJseQorICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzIG5vIHNwZWNpYWwgYWN0aW9uKS4KKworICAgICAgICBTaWRlIGVmZmVjdHM6CisgICAgICAgICAgICAgICAgQ29waWVzIGl0cyBhcmd1bWVudHMgYW5kIHRoZSB0dHkgZmlsZSBkZXNjcmlwdG9yIHRvCisgICAgICAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIG90aGVyCisgICAgICAgICAgICAgICAgdHR5LXJlbGF0ZWQgZnVuY3Rpb25zLCB3aXRoIHRoZSBsY2wgdmFsdWUgYWx0ZXJlZCBhcworICAgICAgICAgICAgICAgIGRlc2NyaWJlZCBhYm92ZS4gR2V0cyBhbGwgcGFyYW1ldGVycyBhbmQgc2V0dGluZ3MKKyAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgYW5kIHB1dHMgdGhlbSBpbiBhIGdsb2JhbCBhcmVhLAorICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVzdG9yZWQgYnkgdHRyZXMoKSwgZS5nLiB3aGVuIHRoZQorICAgICAgICAgICAgICAgIGRldmljZSBpcyBjbG9zZWQuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgICAgICAgIDA6IG9uIHN1Y2Nlc3MKKyAgICAgICAgICAgICAgICAgLTU6IGlmIGRldmljZSBpcyBpbiB1c2UKKyAgICAgICAgICAgICAgICAgLTQ6IGlmIGFjY2VzcyB0byBkZXZpY2UgaXMgZGVuaWVkCisgICAgICAgICAgICAgICAgIC0zOiBpZiBhY2Nlc3MgdG8gbG9jayBtZWNoYW5pc20gZGVuaWVkCisgICAgICAgICAgICAgICAgIC0yOiB1cG9uIHRpbWVvdXQgd2FpdGluZyBmb3IgZGV2aWNlIHRvIG9wZW4KKyAgICAgICAgICAgICAgICAgLTE6IG9uIG90aGVyIGVycm9yCisKKyAgIGludAorICAgICAgICAgIHR0cGt0KHNwZWVkLGZsb3cscGFyaXR5KSBsb25nIHNwZWVkOyBpbnQgZmxvdywgcGFyaXR5OworICAgICAgICAgIFB1dHMgdGhlIGN1cnJlbnRseSBvcGVuIHR0eSBkZXZpY2UgaW50byB0aGUgYXBwcm9wcmlhdGUgbW9kZXMKKyAgICAgICAgICBmb3IgdHJhbnNtaXR0aW5nIGFuZCByZWNlaXZpbmcgS2VybWl0IHBhY2tldHMuCisKKyAgICAgICAgQXJndW1lbnRzOgorCisgICAgICAgICAgICAgIHNwZWVkOgorICAgICAgICAgICAgICAgICAgICAgIGlmIHNwZWVkID4gLTEsIGFuZCB0aGUgZGV2aWNlIGlzIGEgdHJ1ZSB0dHkgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIGFuZCBLZXJtaXQgaXMgaW4gbG9jYWwgbW9kZSwgdHRwa3QgYWxzbyBzZXRzIHRoZQorICAgICAgICAgICAgICAgICAgICAgIHNwZWVkLgorCisgICAgICAgICAgICAgIGZsb3c6CisgICAgICAgICAgICAgICAgICAgICAgaWYgaW4gdGhlIHJhbmdlIDAtMywgdHRwa3Qgc2VsZWN0cyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHR5cGUgb2YgZmxvdyBjb250cm9sLiBDdXJyZW50bHkgMCBpcworICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYXMgbm8gZmxvdyBjb250cm9sLCAxIGlzIFhvbi9Yb2ZmLCBhbmQgbm8KKyAgICAgICAgICAgICAgICAgICAgICBvdGhlciB0eXBlcyBhcmUgZGVmaW5lZC4gSWYgKGFuZCB0aGlzIGlzIGEgaG9ycmlibGUKKyAgICAgICAgICAgICAgICAgICAgICBoYWNrLCBidXQgaXQgZ29lcyBiYWNrIG1hbnkgeWVhcnMgYW5kIHdpbGwgYmUgaGFyZAorICAgICAgICAgICAgICAgICAgICAgIHRvIGVyYWRpY2F0ZSkgZmxvdyBpcyA0LCB0aGVuIHRoZSBhcHByb3ByaWF0ZSB0dHkKKyAgICAgICAgICAgICAgICAgICAgICBtb2RlcyBhcmUgc2V0IGZvciBtb2RlbSBkaWFsaW5nLCBhIHNwZWNpYWwgY2FzZSBpbgorICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdlIHRhbGsgdG8gYSBtb2RlbS1jb250cm9sbGVkIGxpbmUgd2l0aG91dAorICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmluZyBjYXJyaWVyLiBJZiBmbG93IGlzIDUsIHRoZW4gd2UgcmVxdWlyZQorICAgICAgICAgICAgICAgICAgICAgIGNhcnJpZXIuCisKKyAgICAgICAgICAgICAgcGFyaXR5OgorICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgc2ltcGx5IGNvcGllZCBpbnRvIGEgZ2xvYmFsIHZhcmlhYmxlIHNvCisgICAgICAgICAgICAgICAgICAgICAgdGhhdCBvdGhlciBmdW5jdGlvbnMgKGxpa2UgdHRpbmwsIHR0aW5jLCBldGMpIGNhbgorICAgICAgICAgICAgICAgICAgICAgIHVzZSBpdC4KKworICAgICAgICBTaWRlIGVmZmVjdHM6CisgICAgICAgICAgICAgICAgQ29waWVzIGl0cyBhcmd1bWVudHMgdG8gZ2xvYmFsIHZhcmlhYmxlcywgZmx1c2hlcyB0aGUKKyAgICAgICAgICAgICAgICB0ZXJtaW5hbCBkZXZpY2UgaW5wdXQgYnVmZmVyLgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAgICAgIC0xOiBvbiBlcnJvci4KKyAgICAgICAgICAgICAgICAgIDA6IG9uIHN1Y2Nlc3MuCisKKyAgIGludAorICAgICAgICAgIHR0c2V0ZmxvdyhpbnQpCisgICAgICAgICAgRW5hYmxlcyB0aGUgZ2l2ZW4gdHlwZSBvZiBmbG93IGNvbnRyb2wgb24gdGhlIG9wZW4gc2VyaWFsCisgICAgICAgICAgY29tbXVuaWNhdGlvbnMgZGV2aWNlIGltbWVkaWF0ZWx5LiBBcmd1bWVudHMgYXJlIHRoZSBGTE9feHh4CisgICAgICAgICAgdmFsdWVzIGZyb20gY2tjZGViLmgsIGV4Y2VwdCBGTE9fRElBTCwgRkxPX0RJQVgsIG9yIEZMT19BVVRPLAorICAgICAgICAgIHdoaWNoIGFyZSBub3QgYWN0dWFsIGZsb3ctY29udHJvbCB0eXBlcy4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsCisgICAgICAgICAgLTEgb24gZmFpbHVyZS4KKworICAgI2lmZGVmIFRUU1BETElTVAorICAgbG9uZyAqCisgICAgICAgICAgdHRzcGRsaXN0KCkKKyAgICAgICAgICBSZXR1cm5zIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBsb25ncywgb3IgTlVMTCBvbiBmYWlsdXJlLiBPbgorICAgICAgICAgIHN1Y2Nlc3MsIGVsZW1lbnQgMCBvZiB0aGUgYXJyYXkgY29udGFpbnMgbnVtYmVyLCBuLCBpbmRpY2F0aW5nCisgICAgICAgICAgaG93IG1hbnkgZm9sbG93LiBFbGVtZW50cyAxLW4gYXJlIHNlcmlhbCBzcGVlZHMsIGV4cHJlc3NlZCBpbgorICAgICAgICAgIGJpdHMgcGVyIHNlY29uZCwgdGhhdCBhcmUgbGVnYWwgb24gdGhpcyBwbGF0Zm9ybS4gVGhlIHVzZXIKKyAgICAgICAgICBpbnRlcmZhY2UgbWF5IHVzZSB0aGlzIGxpc3QgdG8gY29uc3RydWN0IGEgbWVudSwga2V5d29yZCB0YWJsZSwKKyAgICAgICAgICBldGMuCisKKyAgICNlbmRpZiAvKiBUVFNQRExJU1QgKi8KKworICAgaW50CisgICAgICAgICAgdHRyZXMoKQorICAgICAgICAgIFJlc3RvcmVzIHRoZSB0dHkgZGV2aWNlIHRvIHRoZSBtb2RlcyBhbmQgc2V0dGluZ3MgdGhhdCB3ZXJlIGluCisgICAgICAgICAgZWZmZWN0IGF0IHRoZSB0aW1lIGl0IHdhcyBvcGVuZWQgKHNlZSB0dG9wZW4pLiBSZXR1cm5zOgorICAgICAgICAgICAtMTogb24gZXJyb3IuCisgICAgICAgICAgICAwOiBvbiBzdWNjZXNzLgorCisgICBpbnQKKyAgICAgICAgICB0dHJ1bmNtZChzdHJpbmcpIGNoYXIgKiBzdHJpbmc7CisgICAgICAgICAgUnVucyB0aGUgZ2l2ZW4gY29tbWFuZCBvbiB0aGUgbG9jYWwgc3lzdGVtLCBidXQgcmVkaXJlY3RzIGl0cworICAgICAgICAgIGlucHV0IGFuZCBvdXRwdXQgdG8gdGhlIGNvbW11bmljYXRpb24gKFNFVCBMSU5FLCBTRVQgUE9SVCwgb3IKKyAgICAgICAgICBTRVQgSE9TVCkgZGV2aWNlLiBSZXR1cm5zOgorICAgICAgICAgICAgMDogb24gZmFpbHVyZS4KKyAgICAgICAgICAgIDE6IG9uIHN1Y2Nlc3MuCisKKyAgIGludAorICAgICAgICAgIHR0c2NhcnIoY2FycmllcikgaW50IGNhcnJpZXI7CisgICAgICAgICAgQ29waWVzIGl0cyBhcmd1bWVudCB0byBhIHZhcmlhYmxlIHRoYXQgaXMgZ2xvYmFsIHRvIHRoZSBvdGhlcgorICAgICAgICAgIHR0eS1yZWxhdGVkIGZ1bmN0aW9ucywgYW5kIHRoZW4gcmV0dXJucyBpdC4gVGhlIHZhbHVlcyBmb3IKKyAgICAgICAgICBjYXJyaWVyIGFyZSBkZWZpbmVkIGluIGNrY2RlYi5oOiBDQVJfT04sIENBUl9PRkYsIENBUl9BVVRPLgorICAgICAgICAgIHR0b3BlbigpLCB0dHBrdCgpLCBhbmQgdHR2dCgpIHVzZSB0aGlzIHZhcmlhYmxlIHdoZW4gZGVjaWRpbmcKKyAgICAgICAgICBob3cgdG8gb3BlbiB0aGUgdHR5IGRldmljZSBhbmQgd2hhdCBtb2RlcyB0byBzZWxlY3QuIFRoZQorICAgICAgICAgIG1lYW5pbmdzIGFyZSB0aGVzZToKKworICAgQ0FSX09GRjogSWdub3JlIGNhcnJpZXIgYXQgYWxsIHRpbWVzLgorICAgQ0FSX09OOiBSZXF1aXJlIGNhcnJpZXIgYXQgYWxsIHRpbWVzLCBleGNlcHQgd2hlbiBkaWFsaW5nLiBUaGlzIG1lYW5zLAorICAgZm9yIGV4YW1wbGUsIHRoYXQgdHRvcGVuKCkgY291bGQgaGFuZyBmb3JldmVyIHdhaXRpbmcgZm9yIGNhcnJpZXIgaWYKKyAgIGl0IGlzIG5vdCBwcmVzZW50LgorICAgQ0FSX0FVVE86IElmIHRoZSBtb2RlbSB0eXBlIGlzIHplcm8gKGkuZS4gdGhlIGNvbm5lY3Rpb24gaXMgZGlyZWN0KSwKKyAgIHRoaXMgaXMgdGhlIHNhbWUgYXMgQ0FSX09GRi4gSWYgdGhlIG1vZGVtIHR5cGUgaXMgcG9zaXRpdmUsIHRoZW4gaGVlZAorICAgY2FycmllciBkdXJpbmcgQ09OTkVDVCAodHR2dCBtb2RlKSwgYnV0IGlnbm9yZSBpdCBhdCBvdGhlciB0aW1lcworICAgKHBhY2tldCBtb2RlLCBkdXJpbmcgU0VUIExJTkUsIGV0YykuIENvbXBhdGlibGUgd2l0aCBwcmUtNUEgdmVyc2lvbnMKKyAgIG9mIEMtS2VybWl0LiBUaGlzIHNob3VsZCBiZSB0aGUgZGVmYXVsdCBjYXJyaWVyIG1vZGUuCisKKyAgICAgICAgICBLZXJtaXQncyBESUFMIGNvbW1hbmQgaWdub3JlcyB0aGUgY2FycmllciBzZXR0aW5nLCBidXQKKyAgICAgICAgICB0dG9wZW4oKSwgdHR2dCgpLCBhbmQgdHRwa3QoKSBhbGwgaG9ub3IgdGhlIGNhcnJpZXIgb3B0aW9uIGluCisgICAgICAgICAgZWZmZWN0IGF0IHRoZSB0aW1lIHRoZXkgYXJlIGNhbGxlZC4gTm9uZSBvZiB0aGlzIGFwcGxpZXMgdG8KKyAgICAgICAgICByZW1vdGUgbW9kZSAodGhlIHR0eSBkZXZpY2UgaXMgdGhlIGpvYidzIGNvbnRyb2xsaW5nIHRlcm1pbmFsKQorICAgICAgICAgIG9yIHRvIG5ldHdvcmsgaG9zdCBjb25uZWN0aW9ucyAobW9kZW0gdHlwZSBpcyBuZWdhdGl2ZSkuCisKKyAgIGludAorICAgICAgICAgIHR0c25kYigpCisgICAgICAgICAgU2VuZHMgYSBCUkVBSyBzaWduYWwgb24gdGhlIHR0eSBkZXZpY2UuIE9uIGEgcmVhbCB0dHkgZGV2aWNlLAorICAgICAgICAgIHNlbmQgYSByZWFsIEJSRUFLIGxhc3RpbmcgYXBwcm94aW1hdGVseSAyNzUgbWlsbGlzZWNvbmRzLiBJZgorICAgICAgICAgIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBzaW11bGF0ZSBhIEJSRUFLIGJ5IChmb3IgZXhhbXBsZSkKKyAgICAgICAgICBkcm9wcGluZyBkb3duIHNvbWUgdmVyeSBsb3cgYmF1ZCByYXRlLCBsaWtlIDUwLCBhbmQgc2VuZGluZyBhCisgICAgICAgICAgYnVuY2ggb2YgbnVsbCBjaGFyYWN0ZXJzLiBPbiBhIG5ldHdvcmsgY29ubmVjdGlvbiwgZG8gdGhlCisgICAgICAgICAgYXBwcm9wcmlhdGUgbmV0d29yayBwcm90b2NvbCBmb3IgQlJFQUsuIFJldHVybnM6CisgICAgICAgICAgIC0xOiBvbiBlcnJvci4KKyAgICAgICAgICAgIDA6IG9uIHN1Y2Nlc3MuCisKKyAgIGludAorICAgICAgICAgIHR0c25kbGIoKQorICAgICAgICAgIExpa2UgdHRzbmRiKCksIGJ1dCBzZW5kcyBhICJMb25nIEJSRUFLIiAoYXBwcm94IDEuNSBzZWNvbmRzKS4KKyAgICAgICAgICBGb3IgbmV0d29yayBjb25uZWN0aW9ucywgaXQgaXMgaWRlbnRpY2FsIHRvIHR0c25kYigpLgorICAgICAgICAgIEN1cnJlbnRseSwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaWYgQ0tfTEJSSyBpcyBkZWZpbmVkIChhcworICAgICAgICAgIGl0IGlzIGZvciBVTklYIGFuZCBWTVMpLgorCisgICBpbnQKKyAgICAgICAgICB0dHNzcGQoY3BzKSBpbnQgY3BzOworICAgICAgICAgIEZvciBzZXJpYWwgZGV2aWNlcyBvbmx5LCBzZXQgdGhlIGRldmljZSB0cmFuc21pc3Npb24gc3BlZWQgdG8KKyAgICAgICAgICAobm90ZSBjYXJlZnVsbHkpIFRFTiBUSU1FUyB0aGUgYXJndW1lbnQuIFRoZSBhcmd1bWVudCBpcyBpbgorICAgICAgICAgIGNoYXJhY3RlcnMgcGVyIHNlY29uZCwgYnV0IHRyYW5zbWlzc2lvbiBzcGVlZHMgYXJlIGluIGJpdHMgcGVyCisgICAgICAgICAgc2Vjb25kLiBjcHMgYXJlIHVzZWQgcmF0aGVyIHRoYW4gYnBzIGJlY2F1c2UgaGlnaCBzcGVlZHMgbGlrZQorICAgICAgICAgIDM4NDAwIGFyZSBub3QgZXhwcmVzc2libGUgaW4gYSAxNi1iaXQgaW50IGJ1dCBsb25ncyBjYW5ub3QgYmUKKyAgICAgICAgICB1c2VkIGJlY2F1c2Uga2V5d29yZC10YWJsZSB2YWx1ZXMgYXJlIGludHMgYW5kIG5vdCBsb25ncy4gSWYKKyAgICAgICAgICB0aGUgYXJndW1lbnQgaXMgNywgdGhlbiB0aGUgYnBzIGlzIDc1LCBub3QgNzAuIElmIHRoZSBhcmd1bWVudAorICAgICAgICAgIGlzIDg4OCwgdGhpcyBpcyBhIHNwZWNpYWwgY29kZSBmb3IgNzUvMTIwMCBzcGxpdC1zcGVlZAorICAgICAgICAgIG9wZXJhdGlvbiAoNzUgYnBzIG91dCwgMTIwMCBicHMgaW4pLiBSZXR1cm5zOgorICAgICAgICAgICAtMTogb24gZXJyb3IsIG1lYW5pbmcgdGhlIHJlcXVlc3RlZCBzcGVlZCBpcyBub3QgdmFsaWQgb3IKKyAgICAgICAgICBhdmFpbGFibGUuCisgICAgICAgICAgPj0wOiBvbiBzdWNjZXNzIChkb24ndCB0cnkgdG8gdXNlIHRoaXMgdmFsdWUgZm9yIGFueXRoaW5nKS4KKworICAgaW50CisgICAgICAgICAgdHR2dChzcGVlZCxmbG93KSBsb25nIHNwZWVkOyBpbnQgZmxvdzsKKyAgICAgICAgICBQdXRzIHRoZSBjdXJyZW50bHkgb3BlbiB0dHkgZGV2aWNlIGludG8gdGhlIGFwcHJvcHJpYXRlIG1vZGVzCisgICAgICAgICAgZm9yIHRlcm1pbmFsIGVtdWxhdGlvbi4gVGhlIGFyZ3VtZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4KKyAgICAgICAgICB0dHBrdCgpLiBTaWRlIGVmZmVjdHM6IHR0dnQoKSBzdG9yZXMgaXRzIGFyZ3VtZW50cyBpbiBnbG9iYWwKKyAgICAgICAgICB2YXJpYWJsZXMsIGFuZCBzZXRzIGEgZmxhZyB0aGF0IGl0IGhhcyBiZWVuIGNhbGxlZCBzbyB0aGF0CisgICAgICAgICAgc3Vic2VxdWVudCBjYWxscyBjYW4gYmUgaWdub3JlZCBzbyBsb25nIGFzIHRoZSBhcmd1bWVudHMgYXJlCisgICAgICAgICAgdGhlIHNhbWUgYXMgaW4gdGhlIGxhc3QgZWZmZWN0aXZlIGNhbGwuIE90aGVyIGZ1bmN0aW9ucywgc3VjaAorICAgICAgICAgIGFzIHR0b3BlbigpLCB0dGNsb3NlKCksIHR0cmVzKCksIHR0dnQoKSwgZXRjLCB0aGF0IGNoYW5nZSB0aGUKKyAgICAgICAgICB0dHkgZGV2aWNlIGluIGFueSB3YXkgbXVzdCB1bnNldCB0aGlzIGZsYWcuIEluIFVOSVggS2VybWl0LAorICAgICAgICAgIHRoaXMgZmxhZyBpcyBjYWxsZWQgdHZ0ZmxnLgorCisgICBpbnQKKyAgICAgICAgICB0dHdtZG0obWRtc2lnLHRpbW8pIGludCBtZG1zaWcsIHRpbW87CisgICAgICAgICAgV2FpdHMgdXAgdG8gdGltbyBzZWNvbmRzIGZvciBhbGwgb2YgdGhlIGdpdmVuIG1vZGVtIHNpZ25hbHMgdG8KKyAgICAgICAgICBhcHBlYXIuIG1kbXNpZyBpcyBhIGJpdCBtYXNrLCBpbiB3aGljaCBhIGJpdCBpcyBvbiAoMSkgb3Igb2ZmCisgICAgICAgICAgKDApIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIHNpZ25hbCBpcyB0byBiZQorICAgICAgICAgIHdhaXRlZCBmb3IuIFRoZXNlIHN5bWJvbHMgYXJlIGRlZmluZWQgaW4gY2tjZGViLmg6CisgICAgICAgICAgICBCTV9DVFMgKGJpdCAwKSBtZWFucyB3YWl0IGZvciBDbGVhciBUbyBTZW5kCisgICAgICAgICAgICBCTV9EU1IgKGJpdCAxKSBtZWFucyB3YWl0IGZvciBEYXRhIFNldCBSZWFkeQorICAgICAgICAgICAgQk1fRENEIChiaXQgMikgbWVhbnMgd2FpdCBmb3IgQ2FycmllciBEZXRlY3QKKyAgICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAtMzogTm90IGltcGxlbWVudGVkLgorICAgICAgICAgICAtMjogVGhpcyBsaW5lIGRvZXMgbm90IGhhdmUgbW9kZW0gY29udHJvbC4KKyAgICAgICAgICAgLTE6IFRpbWVvdXQ6IHRpbWUgbGltaXQgZXhjZWVkZWQgYmVmb3JlIGFsbCBzaWduYWxzIHdlcmUKKyAgICAgICAgICBkZXRlY3RlZC4KKyAgICAgICAgICAgIDE6IFN1Y2Nlc3MuCisKKyAgIGludAorICAgICAgICAgIHR0eGluKG4sYnVmKSBpbnQgbjsgQ0hBUiAqYnVmOworICAgICAgICAgIFJlYWRzIHggY2hhcmFjdGVycyBmcm9tIHRoZSB0dHkgZGV2aWNlIGludG8gdGhlIHNwZWNpZmllZCBidWYsCisgICAgICAgICAgc3RyaXBwaW5nIHBhcml0eSBpZiBwYXJpdHkgaXMgbm90IG5vbmUuIFRoaXMgY2FsbCB3YWl0cworICAgICAgICAgIGZvcmV2ZXIsIHRoZXJlIGlzIG5vIHRpbWVvdXQuIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUKKyAgICAgICAgICBjYWxsZWQgb25seSB3aGVuIHlvdSBrbm93IHRoYXQgYXQgbGVhc3QgeCBjaGFyYWN0ZXJzIGFyZQorICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVhZCAoYXMgZGV0ZXJtaW5lZCwgZm9yIGV4YW1wbGUsIGJ5IHR0Y2hrKCkpLgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHVzZSB0aGUgc2FtZSBidWZmZXIgYXMgdHRpbmMoKS4KKworICAgaW50CisgICAgICAgICAgdHhidWZyKHRpbW8pIGludCB0aW1vOworICAgICAgICAgIFJlYWRzIGNoYXJhY3RlcnMgaW50byB0aGUgaW50ZXJuYWwgY29tbXVuaWNhdGlvbnMgaW5wdXQgYnVmZmVyLgorICAgICAgICAgIHRpbW8gaXMgYSB0aW1lb3V0IGludGVydmFsLCBpbiBzZWNvbmRzLiAwIG1lYW5zIG5vIHRpbWVvdXQsCisgICAgICAgICAgd2FpdCBmb3JldmVyLiBDYWxsZWQgYnkgdHRpbmMoKSAoYW5kIHBvc3NpYmx5IHR0eGluKCkgYW5kCisgICAgICAgICAgdHRpbmwoKSkgd2hlbiB0aGUgY29tbXVuaWNhdGlvbnMgaW5wdXQgYnVmZmVyIGlzIGVtcHR5LiBUaGUKKyAgICAgICAgICBidWZmZXIgc2hvdWxkIGJlIGNhbGxlZCB0dHhidWZbXSwgaXRzIGxlbmd0aCBpcyBkZWZpbmVkIGJ5IHRoZQorICAgICAgICAgIHN5bWJvbCBUWEJVRkwuIFRoZSBnbG9iYWwgdmFyaWFibGUgdHhidWZuIGlzIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICBjaGFyYWN0ZXJzIGF2YWlsYWJsZSB0byBiZSByZWFkIGZyb20gdHR4YnVmW10sIGFuZCB0eGJ1ZnAgaXMKKyAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIHJlYWQuIFNob3VsZCBub3QgYmUKKyAgICAgICAgICBjYWxsZWQgaWYgdHhidWZuID4gMCwgaW4gd2hpY2ggY2FzZSB0aGUgYnVmZmVyIGRvZXMgbm90IG5lZWQKKyAgICAgICAgICByZWZpbGxpbmcuIFRoaXMgcm91dGluZSByZXR1cm5zOgorICAgICAgICAgICAgLTI6IENvbW11bmljYXRpb25zIGRpc2Nvbm5lY3QKKyAgICAgICAgICAgIC0xOiBUaW1lb3V0CisgICAgICAgICAgPj0wOiBBIGNoYXJhY3RlciAoMCAtIDI1NSkgT24gc3VjY2VzcywgdGhlIGZpcnN0IGNoYXJhY3RlciB0aGF0CisgICAgICAgICAgd2FzIHJlYWQsIHdpdGggdGhlIHZhcmlhYmxlcyB0eGJ1Zm4gYW5kIHR4YnVmcCBzZXQKKyAgICAgICAgICBhcHByb3ByaWF0ZWx5IGZvciBhbnkgcmVtYWluaW5nIGNoYXJhY3RlcnMuCisgICAgICAgICAgTk9URTogQ3VycmVudGx5IHRoaXMgcm91dGluZSBpcyB1c2VkIGludGVybmFsbHkgb25seSBieSB0aGUKKyAgICAgICAgICBVTklYIGFuZCBWTVMgdmVyc2lvbnMuIFRoZSBhaW0gaXMgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gYWxsCisgICAgICAgICAgdmVyc2lvbnMgc28gdGhlcmUgaXMgb25lIHNpbmdsZSBjb2hlcmVudCBhbmQgZWZmaWNpZW50IHdheSBvZgorICAgICAgICAgIHJlYWRpbmcgZnJvbSB0aGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlIG9yIG5ldHdvcmsuCisKKyAgICA0LkUuMi42LiBNaXNjZWxsYW5lb3VzIHN5c3RlbS1kZXBlbmRlbnQgZnVuY3Rpb25zCisKKyAgIFZPSUQKKyAgICAgICAgICB6dGltZShzKSBjaGFyICoqczsKKyAgICAgICAgICBSZXR1cm5zIGEgcG9pbnRlciwgcywgdG8gdGhlIGN1cnJlbnQgZGF0ZS1hbmQtdGltZSBzdHJpbmcgaW4gcy4KKyAgICAgICAgICBUaGlzIHN0cmluZyBtdXN0IGJlIGluIHRoZSBmaXhlZC1maWVsZCBmb3JtYXQgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgICAgdGhlIEMgcnVudGltZSBhc2N0aW1lKCkgZnVuY3Rpb24sIGxpa2U6ICJTdW4gU2VwIDE2IDEzOjIzOjQ1CisgICAgICAgICAgMTk3M1xuIiBzbyB0aGF0IGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbiBjYW4gZXh0cmFjdCB0aGUKKyAgICAgICAgICBkaWZmZXJlbnQgZmllbGRzLiBUaGUgcG9pbnRlciB2YWx1ZSBpcyBmaWxsZWQgaW4gYnkgenRpbWUsIGFuZAorICAgICAgICAgIHRoZSBkYXRhIGl0IHBvaW50cyB0byBpcyBub3Qgc2FmZSwgc28gc2hvdWxkIGJlIGNvcGllZCB0byBhCisgICAgICAgICAgc2FmZSBwbGFjZSBiZWZvcmUgdXNlLiB6dGltZSgpIGhhcyBubyByZXR1cm4gdmFsdWUuIEFzIGEgc2lkZQorICAgICAgICAgIGVmZmVjdCwgdGhpcyByb3V0aW5lIGNhbiBhbHNvIGZpbGwgaW4gdGhlIGZvbGxvd2luZyB0d28KKyAgICAgICAgICBleHRlcm5hbCB2YXJpYWJsZXMgKHdoaWNoIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUKKyAgICAgICAgICBzeXN0ZW0tZGVwZW5kZW5kZW50IG1vZHVsZXMgZm9yIGVhY2ggcGxhdGZvcm0pOgorICAgICAgICAgICAgbG9uZyB6dHVzZWM6IEZyYWN0aW9uIG9mIHNlY29uZHMgb2YgY2xvY2sgdGltZSwgbWljcm9zZWNvbmRzLgorICAgICAgICAgICAgbG9uZyB6dG1zZWM6IEZyYWN0aW9uIG9mIHNlY29uZHMgb2YgY2xvY2sgdGltZSwgbWlsbGlzZWNvbmRzLgorICAgICAgICAgIElmIHRoZXNlIHZhcmlhYmxlcyBhcmUgbm90IHNldCBieSB6c3RpbWUoKSwgdGhleSByZW1haW4gYXQKKyAgICAgICAgICB0aGVpciBpbml0aWFsIHZhbHVlIG9mIC0xTC4KKworICAgaW50CisgICAgICAgICAgZ3RpbWVyKCkKKyAgICAgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBlbGFwc2VkIHRpbWUgY291bnRlciBpbgorICAgICAgICAgIHNlY29uZHMgKHNlZSBydGltZXIpLCBvciAwIG9uIGFueSBraW5kIG9mIGVycm9yLgorCisgICAjaWZkZWYgR0ZUSU1FUgorICAgICAgICAgIENLRkxPQVQKKyAgICAgICAgICBnZnRpbWVyKCkKKyAgICAgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBlbGFwc2VkIHRpbWUgY291bnRlciBpbgorICAgICAgICAgIHNlY29uZHMsIGFzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBjYXBhYmxlIG9mIHJlcHJlc2VudGluZworICAgICAgICAgIG5vdCBvbmx5IHdob2xlIHNlY29uZHMsIGJ1dCBhbHNvIHRoZSBmcmFjdGlvbmFsIHBhcnQsIHRvIHRoZQorICAgICAgICAgIG1pbGxpc2Vjb25kIG9yIG1pY3Jvc2Vjb25kIGxldmVsLCB3aGF0ZXZlciBwcmVjaXNpb24gaXMKKyAgICAgICAgICBhdmFpbGFibGUuIFJlcXVpcmVzIGEgZnVuY3Rpb24gdG8gZ2V0IHRpbWVzIGF0IHN1YnNlY29uZAorICAgICAgICAgIHByZWNpc2lvbiwgYXMgd2VsbCBhcyBmbG9hdGluZy1wb2ludCBzdXBwb3J0LiBUaGF0J3Mgd2h5IGl0J3MKKyAgICAgICAgICAjaWZkZWYnZC4KKworICAgI2VuZGlmIC8qIEdGVElNRVIgKi8KKworICAgaW50CisgICAgICAgICAgbXNsZWVwKG0pIGludCBtOworICAgICAgICAgIFNsZWVwcyAocGF1c2VzLCBkb2VzIG5vdGhpbmcpIGZvciBtIG1pbGxpc2Vjb25kcyAoYSBtaWxsaXNlY29uZAorICAgICAgICAgIGlzIG9uZSB0aG91c2FuZHRoIG9mIGEgc2Vjb25kKS4gUmV0dXJuczoKKyAgICAgICAgICAgLTE6IG9uIGZhaWx1cmUuCisgICAgICAgICAgICAwOiBvbiBzdWNjZXNzLgorCisgICBWT0lECisgICAgICAgICAgcnRpbWVyKCkKKyAgICAgICAgICBTZXRzIHRoZSBlbGFwc2VkIHRpbWUgY291bnRlciB0byB6ZXJvLiBJZiB5b3Ugd2FudCB0byB0aW1lIGhvdworICAgICAgICAgIGxvbmcgYW4gb3BlcmF0aW9uIHRha2VzLCBjYWxsIHJ0aW1lcigpIHdoZW4gaXQgc3RhcnRzIGFuZAorICAgICAgICAgIGd0aW1lciB3aGVuIGl0IGVuZHMuIHJ0aW1lcigpIGhhcyBubyByZXR1cm4gdmFsdWUuCisKKyAgICNpZmRlZiBHRlRJTUVSCisgICAgICAgICAgVk9JRAorICAgICAgICAgIHJmdGltZXIoKQorICAgICAgICAgIFNldHMgdGhlIGVsYXBzZWQgdGltZSBjb3VudGVyIHRvIHplcm8uIElmIHlvdSB3YW50IHRvIHRpbWUgaG93CisgICAgICAgICAgbG9uZyBhbiBvcGVyYXRpb24gdGFrZXMsIGNhbGwgcmZ0aW1lcigpIHdoZW4gaXQgc3RhcnRzIGFuZAorICAgICAgICAgIGdmdGltZXIgd2hlbiBpdCBlbmRzLiByZnRpbWVyKCkgaGFzIG5vIHJldHVybiB2YWx1ZS4gTm90ZToKKyAgICAgICAgICByZnRpbWVyKCkgaXMgdG8gYmUgdXNlZCB3aXRoIGdmdGltZXIoKSBhbmQgcnRpbWVyKCkgaXMgdG8gYmUKKyAgICAgICAgICB1c2VkIHdpdGggZ3RpbWVyKCkuIFNlZSB0aGUgcmZ0aW1lcigpIGRlc2NyaXB0aW9uLgorCisgICAjZW5kaWYgLyogR0ZUSU1FUiAqLworCisgICBpbnQKKyAgICAgICAgICBzeXNpbml0KCkKKyAgICAgICAgICBEb2VzIHdoYXRldmVyIG5lZWRzIGRvaW5nIHVwb24gcHJvZ3JhbSBzdGFydC4gSW4gcGFydGljdWxhciwgaWYKKyAgICAgICAgICB0aGUgcHJvZ3JhbSBpcyBydW5uaW5nIGluIGFueSBraW5kIG9mIHByaXZpbGVnZWQgbW9kZSwgdHVybnMKKyAgICAgICAgICBvZmYgdGhlIHByaXZpbGVnZXMgKHNlZSBwcml2X2luaSgpKS4gUmV0dXJuczoKKyAgICAgICAgICAgLTE6IG9uIGVycm9yLgorICAgICAgICAgICAgMDogb24gc3VjY2Vzcy4KKworICAgaW50CisgICAgICAgICAgc3lzY2xlYW51cCgpCisgICAgICAgICAgRG9lcyB3aGF0ZXZlciBuZWVkcyBkb2luZyB1cG9uIHByb2dyYW0gZXhpdC4gUmV0dXJuczoKKyAgICAgICAgICAgLTE6IG9uIGVycm9yLgorICAgICAgICAgICAgMDogb24gc3VjY2Vzcy4KKworICAgaW50CisgICAgICAgICAgcHN1c3BlbmQoKQorICAgICAgICAgIFN1c3BlbmRzIHRoZSBLZXJtaXQgcHJvY2VzcywgcHV0cyBpdCBpbiB0aGUgYmFja2dyb3VuZCBzbyBpdAorICAgICAgICAgIGNhbiBiZSBjb250aW51ZWQgKCJmb3JlZ3JvdW5kZWQiKSBsYXRlci4gUmV0dXJuczoKKyAgICAgICAgICAgLTE6IGlmIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgICAgIDA6IG9uIHN1Y2Nlc3MuCisKKyAgIFsgWzExNF1Db250ZW50cyBdIFsgWzExNV1DLUtlcm1pdCBdIFsgWzExNl1LZXJtaXQgSG9tZSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC5GLiBHcm91cCBGOiBOZXR3b3JrIFN1cHBvcnQKKworICAgQXMgb2YgdmVyc2lvbiA1QSwgQy1LZXJtaXQgaW5jbHVkZXMgc3VwcG9ydCBmb3Igc2V2ZXJhbCBuZXR3b3Jrcy4KKyAgIE9yaWdpbmFsbHksIHRoaXMgd2FzIGp1c3Qgd29ya2VkIGludG8gdGhlIHR0b3BlbigpLCB0dGNsb3MoKSwgdHRpbmMoKSwKKyAgIHR0aW5sKCksIGFuZCBzaW1pbGFyIHJvdXRpbmVzIGluIFsxMTddY2t1dGlvLmMuIEJ1dCB0aGlzIG1hZGUgaXQKKyAgIGltcG9zc2libGUgdG8gc2hhcmUgdGhpcyBjb2RlIHdpdGggbm9uLVVOSVggdmVyc2lvbnMsIGxpa2UgVk1TLAorICAgQU9TL1ZTLCBPUy8yLCBldGMuIFNvIGFzIG9mIGVkaXQgMTY4LCBuZXR3b3JrIGNvZGUgaGFzIGJlZW4gc2VwYXJhdGVkCisgICBvdXQgaW50byBpdHMgb3duIG1vZHVsZSBhbmQgaGVhZGVyIGZpbGUsIGNrY25ldC5jIGFuZCBja2NuZXQuaDoKKworICAgICBbMTE4XWNrY25ldC5oOiBOZXR3b3JrLXJlbGF0ZWQgc3ltYm9sIGRlZmluaXRpb25zLgorICAgICBbMTE5XWNrY25ldC5jOiBOZXR3b3JrIGkvbyAoVENQL0lQLCBYLjI1LCBldGMpLCBzaGFyZWQgYnkgbW9zdAorICAgcGxhdGZvcm1zLgorICAgICBbMTIwXWNrbG5ldC5jOiBOZXR3b3JrIGkvbyAoVENQL0lQLCBYLjI1LCBldGMpIHNwZWNpZmljIHRvIFN0cmF0dXMKKyAgIFZPUy4KKworICAgVGhlIHJvdXRpbmVzIGFuZCB2YXJpYWJsZXMgaW4gdGhlc2UgbW9kdWxlcyBmYWxsIGludG8gdHdvIGNhdGVnb3JpZXM6CisKKyAgICAxLiBTdXBwb3J0IGZvciBzcGVjaWZpYyBuZXR3b3JrIHBhY2thZ2VzIGxpa2UgU3VuTGluayBYLjI1IGFuZCBUR1YKKyAgICAgICBNdWx0aU5ldCwgYW5kOgorICAgIDIuIHN1cHBvcnQgZm9yIHNwZWNpZmljIG5ldHdvcmsgdmlydHVhbCB0ZXJtaW5hbCBwcm90b2NvbHMgbGlrZSBDQ0lUVAorICAgICAgIFguMyBhbmQgVENQL0lQIFRlbG5ldC4KKworICAgQ2F0ZWdvcnkgKDEpIGZ1bmN0aW9ucyBhcmUgYW5hbG9ncyB0byB0aGUgdHQqKCkgZnVuY3Rpb25zLCBhbmQgaGF2ZQorICAgbmFtZXMgbGlrZSBuZXRvcGVuLCBuZXRjbG9zLCBuZXR0aW5jLCBldGMuIEdyb3VwIEEtRCBtb2R1bGVzIGRvIG5vdAorICAgKGFuZCBtdXN0IG5vdCkga25vdyBhbnl0aGluZyBhYm91dCB0aGVzZSBmdW5jdGlvbnMgLS0gdGhleSBjb250aW51ZSB0bworICAgY2FsbCB0aGUgb2xkIEdyb3VwIEUgZnVuY3Rpb25zICh0dG9wZW4sIHR0aW5jLCBldGMpLiBDYXRlZ29yeSAoMikKKyAgIGZ1bmN0aW9ucyBhcmUgcHJvdG9jb2wgc3BlY2lmaWMgYW5kIGhhdmUgbmFtZXMgcHJlZml4ZWQgYnkgYSBwcm90b2NvbAorICAgaWRlbnRpZmllciwgbGlrZSB0biBmb3IgdGVsbmV0IHgyNSBmb3IgWC4yNS4KKworICAgY2tjbmV0LmggY29udGFpbnMgcHJvdG90eXBlcyBmb3IgYWxsIHRoZXNlIGZ1bmN0aW9ucywgYXMgd2VsbCBhcworICAgc3ltYm9sIGRlZmluaXRpb25zIGZvciBuZXR3b3JrIHR5cGVzLCBwcm90b2NvbHMsIGFuZCBuZXR3b3JrLSBhbmQKKyAgIHByb3RvY29sLSBzcGVjaWZpYyBzeW1ib2xzLCBhcyB3ZWxsIGFzICNpbmNsdWRlcyBmb3IgdGhlIGhlYWRlciBmaWxlcworICAgbmVjZXNzYXJ5IGZvciBlYWNoIG5ldHdvcmsgYW5kIHByb3RvY29sLgorCisgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdG8gYmUgcHJvdmlkZWQgZm9yIG5ldHdvcmtzIHRoYXQgZG8gbm90CisgICB1c2Ugbm9ybWFsIHN5c3RlbSBpL28gKG9wZW4sIHJlYWQsIHdyaXRlLCBjbG9zZSk6CisKKyAgIGludAorICAgICAgICAgIG5ldG9wZW4oKQorICAgICAgICAgIFRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0dG9wZW4oKSB3aGVuIGEgbmV0d29yayBjb25uZWN0aW9uIGlzCisgICAgICAgICAgcmVxdWVzdGVkLiBDYWxsaW5nIGNvbnZlbnRpb25zIGFuZCBwdXJwb3NlIHNhbWUgYXMgR3JvdXAgRQorICAgICAgICAgIHR0b3BlbigpLgorCisgICBpbnQKKyAgICAgICAgICBuZXRjbG9zKCkKKyAgICAgICAgICBUbyBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdHRjbG9zKCkgd2hlbiBhIG5ldHdvcmsgY29ubmVjdGlvbiBpcworICAgICAgICAgIGJlaW5nIGNsb3NlZC4gQ2FsbGluZyBjb252ZW50aW9ucyBhbmQgcHVycG9zZSBzYW1lIGFzIEdyb3VwIEUKKyAgICAgICAgICB0dGNsb3MoKS4KKworICAgaW50CisgICAgICAgICAgbmV0dGNoaygpCisgICAgICAgICAgVG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIHR0Y2hrKCkuIENhbGxpbmcgY29udmVudGlvbnMgYW5kCisgICAgICAgICAgcHVycG9zZSBzYW1lIGFzIEdyb3VwIEUgdHRjaGsoKS4KKworICAgaW50CisgICAgICAgICAgbmV0Zmx1aSgpCisgICAgICAgICAgVG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIHR0Zmx1aSgpLiBDYWxsaW5nIGNvbnZlbnRpb25zIGFuZAorICAgICAgICAgIHB1cnBvc2Ugc2FtZSBhcyBHcm91cCBFIHR0Zmx1aSgpLgorCisgICBpbnQKKyAgICAgICAgICBuZXRicmVhaygpCisgICAgICAgICAgVG8gc2VuZCBhIG5ldHdvcmsgYnJlYWsgKGF0dGVudGlvbikgc2lnbmFsLiBDYWxsaW5nIGNvbnZlbnRpb25zCisgICAgICAgICAgYW5kIHB1cnBvc2Ugc2FtZSBhcyBHcm91cCBFIHR0c25kYnJrKCkuCisKKyAgIGludAorICAgICAgICAgIG5ldGluYygpCisgICAgICAgICAgVG8gZ2V0IGEgY2hhcmFjdGVyIGZyb20gdGhlIG5ldHdvcmsuIENhbGxpbmcgY29udmVudGlvbnMgc2FtZQorICAgICAgICAgIGFzIEdyb3VwIEUgdHRzbmRicmsoKS4KKworICAgaW50CisgICAgICAgICAgbmV0dG9jKCkKKyAgICAgICAgICBTZW5kIGEgImNoYXJhY3RlciIgKGJ5dGUpIHRvIHRoZSBuZXR3b3JrLiBDYWxsaW5nIGNvbnZlbnRpb25zCisgICAgICAgICAgc2FtZSBhcyBHcm91cCBFIHR0b2MoKS4KKworICAgaW50CisgICAgICAgICAgbmV0dG9sKCkKKyAgICAgICAgICBTZW5kIGEgImxpbmUiIChzZXF1ZW5jZSBvZiBieXRlcykgdG8gdGhlIG5ldHdvcmsuIENhbGxpbmcKKyAgICAgICAgICBjb252ZW50aW9ucyBzYW1lIGFzIEdyb3VwIEUgdHRvbCgpLgorCisgICBDb25jZWl2YWJseSwgc29tZSBzeXN0ZW1zIHN1cHBvcnQgbmV0d29yayBjb25uZWN0aW9ucyBzaW1wbHkgYnkKKyAgIGxldHRpbmcgeW91IG9wZW4gYSBkZXZpY2Ugb2YgYSBjZXJ0YWluIG5hbWUgYW5kIGxldHRpbmcgeW91IGRvIGkvbyB0bworICAgaXQuIE90aGVycyAobGlrZSB0aGUgQmVya2VsZXkgc29ja2V0cyBUQ1AvSVAgbGlicmFyeSBvbiBVTklYKSByZXF1aXJlCisgICB5b3UgdG8gb3BlbiB0aGUgY29ubmVjdGlvbiBpbiBhIHNwZWNpYWwgd2F5LCBidXQgdGhlbiBkbyBub3JtYWwgaS9vCisgICAocmVhZCwgd3JpdGUpLiBJbiBzdWNoIGEgY2FzZSwgeW91IHdvdWxkIHVzZSBuZXRvcGVuKCksIGJ1dCB5b3Ugd291bGQKKyAgIG5vdCB1c2UgbmV0dGluYywgbmV0dG9jLCBldGMuCisKKyAgIFZNUyBUQ1AvSVAgcHJvZHVjdHMgaGF2ZSB0aGVpciBvd24gc2V0IG9mIGZ1bmN0aW9ucyBmb3IgYWxsIG5ldHdvcmsKKyAgIG9wZXJhdGlvbnMsIHNvIGluIHRoYXQgY2FzZSB0aGUgZnVsbCByYW5nZSBvZiBuZXR4eHgoKSBmdW5jdGlvbnMgaXMKKyAgIHVzZWQuCisKKyAgIFRoZSB0ZWNobmlxdWUgaXMgdG8gcHV0IGEgdGVzdCBpbiBlYWNoIGNvcnJlc3BvbmRpbmcgdHR4eHgoKSBmdW5jdGlvbgorICAgdG8gc2VlIGlmIGEgbmV0d29yayBjb25uZWN0aW9uIGlzIGFjdGl2ZSAob3IgaXMgYmVpbmcgcmVxdWVzdGVkKSwgdGVzdAorICAgZm9yIHdoaWNoIGtpbmQgb2YgbmV0d29yayBpdCBpcywgYW5kIGlmIG5lY2Vzc2FyeSByb3V0ZSB0aGUgY2FsbCB0bworICAgdGhlIGNvcnJlc3BvbmRpbmcgbmV0eHh4KCkgZnVuY3Rpb24uIFRoZSBuZXR4eHgoKSBmdW5jdGlvbiBtdXN0IGFsc28KKyAgIGNvbnRhaW4gY29kZSB0byB0ZXN0IGZvciB0aGUgbmV0d29yayB0eXBlLCB3aGljaCBpcyBhdmFpbGFibGUgdmlhIHRoZQorICAgZ2xvYmFsIHZhcmlhYmxlIHR0bmV0LgorCisgICBbIFsxMjFdQ29udGVudHMgXSBbIFsxMjJdQy1LZXJtaXQgXSBbIFsxMjNdS2VybWl0IEhvbWUgXQorICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC5GLjEuIFRlbG5ldCBQcm90b2NvbAorCisgICAoVGhpcyBzZWN0aW9uIG5lZWRzIGEgZ3JlYXQgZGVhbCBvZiB1cGRhdGluZy4uLikKKworICAgQXMgb2YgZWRpdCAxOTUsIFRlbG5ldCBwcm90b2NvbCBpcyBzcGxpdCBvdXQgaW50byBpdHMgb3duIGZpbGVzLCBzaW5jZQorICAgaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHJlbW90ZSBtb2RlLCB3aGljaCBkb2VzIG5vdCBoYXZlIGEgbmV0d29yaworICAgY29ubmVjdGlvbjoKKworICAgICAgWzEyNF1ja2N0ZWwuaDogVGVsbmV0IHByb3RvY29sIHN5bWJvbCBkZWZpbml0aW9ucy4KKyAgICAgIFsxMjVdY2tjdGVsLmM6IFRlbG5ldCBwcm90b2NvbC4KKworICAgVGhlIFRlbG5ldCBwcm90b2NvbCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYW5kCisgICByb3V0aW5lczoKKworICAgaW50IHRuX2luaXQKKyAgICAgICAgICBOb256ZXJvIGlmIHRlbG5ldCBwcm90b2NvbCBpbml0aWFsaXplZCwgemVybyBvdGhlcndpc2UuCisKKyAgIGludAorICAgICAgICAgIHRuX2luaXQoKQorICAgICAgICAgIEluaXRpYWxpemUgdGhlIHRlbG5ldCBwcm90b2NvbCAoc2VuZCBpbml0aWFsIG9wdGlvbnMpLgorCisgICBpbnQKKyAgICAgICAgICB0bl9zb3B0KCkKKyAgICAgICAgICBTZW5kIGEgdGVsbmV0IG9wdGlvbi4KKworICAgaW50CisgICAgICAgICAgdG5fZG9vcCgpCisgICAgICAgICAgUmVjZWl2ZSBhbmQgYWN0IG9uIGEgdGVsbmV0IG9wdGlvbiBmcm9tIHRoZSByZW1vdGUuCisKKyAgIGludAorICAgICAgICAgIHRuX3N0dHlwKCkKKyAgICAgICAgICBTZW5kIHRlcm1pbmFsIHR5cGUgdXNpbmcgdGVsbmV0IHByb3RvY29sLgorICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC5GLjIuIEZUUCBQcm90b2NvbAorCisgICAoVG8gYmUgZmlsbGVkIGluLi4uKQorICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC5GLjMuIEhUVFAgUHJvdG9jb2wKKworICAgKFRvIGJlIGZpbGxlZCBpbi4uLikKKyAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuRi40LiBYLjI1IE5ldHdvcmtzCisKKyAgIFRoZXNlIHJvdXRpbmVzIHdlcmUgd3JpdHRlbiBTdW5MaW5rIFguMjUgYW5kIGhhdmUgc2luY2UgYmVlbiBhZGFwdGVkCisgICB0byBhdCBsZWFzdCBvbiBvbmUgb3RoZXI6IElCTSBBSVhMaW5rL1guMjUuCisKKyAgIGludAorICAgICAgICAgIHgyNWRpYWcoKQorICAgICAgICAgIFJlYWRzIGFuZCBwcmludHMgWC4yNSBkaWFnbm9zdGljcworCisgICBpbnQKKyAgICAgICAgICB4MjVvb2JoKCkKKyAgICAgICAgICBYLjI1IG91dCBvZiBiYW5kIHNpZ25hbCBoYW5kbGVyCisKKyAgIGludAorICAgICAgICAgIHgyNWludHIoKQorICAgICAgICAgIFNlbmRzIFguMjUgaW50ZXJydXB0IHBhY2tldAorCisgICBpbnQKKyAgICAgICAgICB4MjVyZXNldCgpCisgICAgICAgICAgUmVzZXRzIFguMjUgdmlydHVhbCBjaXJjdWl0CisKKyAgIGludAorICAgICAgICAgIHgyNWNsZWFyKCkKKyAgICAgICAgICBDbGVhciBYLjI1IHZpcnR1YWwgY2lyY3VpdAorCisgICBpbnQKKyAgICAgICAgICB4MjVzdGF0KCkKKyAgICAgICAgICBYLjI1IHN0YXR1cworCisgICBpbnQKKyAgICAgICAgICBzZXRxYml0KCkKKyAgICAgICAgICBTZXRzIFguMjUgUS1iaXQKKworICAgaW50CisgICAgICAgICAgcmVzZXRxYml0KCkKKyAgICAgICAgICBSZXNldHMgWC4yNSBRLWJpdAorCisgICBpbnQKKyAgICAgICAgICB4MjV4aW4oKQorICAgICAgICAgIFJlYWRzIG4gY2hhcmFjdGVycyBmcm9tIFguMjUgY2lyY3VpdC4KKworICAgaW50CisgICAgICAgICAgeDI1aW5sKCkKKyAgICAgICAgICBSZWFkIGEgS2VybWl0IHBhY2tldCBmcm9tIFguMjUgY2lyY3VpdC4KKworICAgWyBbMTI2XUNvbnRlbnRzIF0gWyBbMTI3XUMtS2VybWl0IF0gWyBbMTI4XUtlcm1pdCBIb21lIF0KKyAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuRi41LiBBZGRpbmcgTmV3IE5ldHdvcmsgVHlwZXMKKworICAgRXhhbXBsZTogQWRkaW5nIHN1cHBvcnQgZm9yIElCTSBYLjI1IGFuZCBIZXdsZXR0IFBhY2thcmQgWC4yNS4gRmlyc3QsCisgICBhZGQgbmV3IG5ldHdvcmsgdHlwZSBzeW1ib2xzIGZvciBlYWNoIG9uZS4gVGhlcmUgYXJlIGFscmVhZHkgc29tZQorICAgbmV0d29yayB0eXBlcyBkZWZpbmVkIGZvciBvdGhlciBYLjI1IHBhY2thZ2VzOgorCisgIE5FVF9TWDI1IGlzIHRoZSBuZXR3b3JrLXR5cGUgSUQgZm9yIFN1bkxpbmsgWC4yNS4KKyAgTkVUX1ZYMjUgaXMgdGhlIG5ldHdvcmstdHlwZSBJRCBmb3IgVk9TIFguMjUuCisKKyAgIFNvIGZpcnN0IHlvdSBzaG91bGQgbmV3IHN5bWJvbHMgZm9yIHRoZSBuZXcgbmV0d29yayB0eXBlcywgZ2l2aW5nIHRoZW0KKyAgIHRoZSBuZXh0IG51bWJlcnMgaW4gdGhlIHNlcXVlbmNlLCBlLmcuOgorCisjZGVmaW5lIE5FVF9IWDI1IDExICAgICAgICAgICAgICAgICAgICAgLyogSGV3bGV0dC1QYWNrYXJkIFguMjUgKi8KKyNkZWZpbmUgTkVUX0lYMjUgMTIgICAgICAgICAgICAgICAgICAgICAvKiBJQk0gWC4yNSAqLworCisgICBUaGlzIGlzIGluIGNrY25ldC5oLgorCisgICBUaGVuIHdlIG5lZWQgc3ltYm9scyB0byBzYXkgdGhhdCB3ZSBhcmUgYWN0dWFsbHkgY29tcGlsaW5nIGluIHRoZSBjb2RlCisgICBmb3IgdGhlc2UgcGxhdGZvcm1zLiBUaGVzZSB3b3VsZCBiZSBkZWZpbmVkIG9uIHRoZSBjYyBjb21tYW5kIGxpbmU6CisKKyAgLURJQk1YMjUgIChmb3IgSUJNKQorICAtREhQWDI1ICAgKGZvciBIUCkKKworICAgU28gd2UgY2FuIGJ1aWxkIEMtS2VybWl0IHZlcnNpb25zIGZvciBBSVggYW5kIEhQLVVYIGJvdGggd2l0aCBhbmQKKyAgIHdpdGhvdXQgWC4yNSBzdXBwb3J0IChzaW5jZSBub3QgYWxsIEFJWCBhbmQgSUJNIHN5c3RlbXMgaGF2ZSB0aGUKKyAgIG5lZWRlZCBsaWJyYXJpZXMsIGFuZCBzbyBhbiBleGVjdXRhYmxlIHRoYXQgd2FzIGxpbmtlZCB3aXRoIHRoZW0gbWlnaHQKKyAgIG5vIGxvYWQpLgorCisgICBUaGVuIGluIGNrY25ldC5oOgorCisjaWZkZWYgSUJNWDI1CisjZGVmaW5lIEFOWVgyNQorI2VuZGlmIC8qIElCTVgyNSAqLworCisjaWZkZWYgSFBYMjUKKyNkZWZpbmUgQU5ZWDI1CisjZW5kaWYgLyogSFBYMjUgKi8KKworICAgQW5kIHRoZW4gdXNlIEFOWVgyNSBmb3IgY29kZSB0aGF0IGlzIGNvbW1vbiB0byBhbGwgb2YgdGhlbSwgYW5kIElCTVgyNQorICAgb3IgSFBYMjUgZm9yIGNvZGUgc3BlY2lmaWMgdG8gSUJNIG9yIEhQLgorCisgICBJdCBtaWdodCBhbHNvIGhhcHBlbiB0aGF0IHNvbWUgY29kZSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gdHdvIG9yIG1vcmUKKyAgIG9mIHRoZXNlLCBidXQgbm90IHRoZSBvdGhlcnMuIFN1cHBvc2UsIGZvciBleGFtcGxlLCB0aGF0IHlvdSB3cml0ZQorICAgY29kZSB0aGF0IGFwcGxpZXMgdG8gYm90aCBJQk0gYW5kIEhQLCBidXQgbm90IFN1biBvciBWT1MgWC4yNS4gVGhlbgorICAgeW91IGFkZCB0aGUgZm9sbG93aW5nIGRlZmluaXRpb24gdG8gY2tjbmV0Lmg6CisKKyNpZm5kZWYgSFBPUklCTVgyNQorI2lmZGVmIEhQWDI1CisjZGVmaW5lIEhQT1JJQk1YMjUKKyNlbHNlCisjaWZkZWYgSUJNWDI1CisjZGVmaW5lIEhQT1JJQk1YMjUKKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNlbmRpZiAvKiBIUFgyNSAqLworI2VuZGlmIC8qIEhQT1JJQk1YMjUgKi8KKworICAgWW91IGNhbiBOT1QgdXNlIGNvbnN0cnVjdGlvbnMgbGlrZSAiI2lmIGRlZmluZWQgKEhQWDI1IHx8IElCTVgyNSkiOworICAgdGhleSBhcmUgbm90IHBvcnRhYmxlLgorCisgICBbIFsxMjldQ29udGVudHMgXSBbIFsxMzBdQy1LZXJtaXQgXSBbIFsxMzFdS2VybWl0IEhvbWUgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDQuRy4gR3JvdXAgRzogRm9ybWF0dGVkIFNjcmVlbiBTdXBwb3J0CisKKyAgIFNvIGZhciwgdGhpcyBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmdWxsc2NyZWVuIGxvY2FsLW1vZGUgZmlsZSB0cmFuc2ZlcgorICAgZGlzcGxheS4gSW4gdGhlIGZ1dHVyZSwgaXQgbWlnaHQgYmUgZXh0ZW5kZWQgdG8gb3RoZXIgdXNlcy4gVGhlCisgICBmdWxsc2NyZWVuIGRpc3BsYXkgY29kZSBpcyBpbiBhbmQgYXJvdW5kIHRoZSByb3V0aW5lIHNjcmVlbmMoKSBpbgorICAgWzEzMl1ja3V1c3guYy4KKworICAgSW4gdGhlIFVOSVggdmVyc2lvbiwgd2UgdXNlIHRoZSBjdXJzZXMgbGlicmFyeSwgcGx1cyBvbmUgY2FsbCBmcm9tIHRoZQorICAgdGVybWNhcCBsaWJyYXJ5LiBJbiBvdGhlciB2ZXJzaW9ucyAoT1MvMiwgVk1TLCBldGMpIHdlIGluc2VydCBkdW1teQorICAgcm91dGluZXMgdGhhdCBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIGN1cnNlcyByb3V0aW5lcy4gU28gZmFyLCB0aGVyZQorICAgYXJlIHR3byBtZXRob2RzIGZvciBzaW11bGF0aW5nIGN1cnNlcyByb3V0aW5lczoKKworICAgIDEuIEluIFZNUywgd2UgdXNlIHRoZSBTY3JlZW4gTWFuYWdlbWVudCBMaWJyYXJ5IChTTUcpLCBhbmQgaW5zZXJ0CisgICAgICAgc3R1YnMgdG8gY29udmVydCBjdXJzZXMgY2FsbHMgaW50byBTTUcgY2FsbHMuCisgICAgMi4gSW4gT1MvMiwgd2UgdXNlIHRoZSBNWUNVUlNFUyBjb2RlLCBpbiB3aGljaCB0aGUgc3R1YiByb3V0aW5lcworICAgICAgIGFjdHVhbGx5IGVtaXQgdGhlIGFwcHJvcHJpYXRlIGVzY2FwZSBzZXF1ZW5jZXMgdGhlbXNlbHZlcy4KKworICAgSGVyZSBhcmUgdGhlIHN0dWIgcm91dGluZXM6CisKKyAgIGludAorICAgICAgICAgIHRnZXRlbnQoY2hhciAqYnVmLCBjaGFyICp0ZXJtKQorICAgICAgICAgIEFyZ3VtZW50cyBhcmUgaWdub3JlZC4gUmV0dXJucyAxIGlmIHRoZSB1c2VyIGhhcyBhIHN1cHBvcnRlZAorICAgICAgICAgIHRlcm1pbmFsIHR5cGUsIDAgb3RoZXJ3aXNlLiBTZXRzIGEgZ2xvYmFsIHZhcmlhYmxlIChmb3IKKyAgICAgICAgICBleGFtcGxlLCAiaXN2dDUyIiBvciAiaXNkYXNoZXIiKSB0byBpbmRpY2F0ZSB0aGUgdGVybWluYWwgdHlwZS4KKworICAgVk9JRAorICAgICAgICAgIG1vdmUoaW50IHJvdywgaW50IGNvbCkKKyAgICAgICAgICBTZW5kcyB0aGUgZXNjYXBlIHNlcXVlbmNlIHRvIHBvc2l0aW9uIHRoZSBjdXJzb3IgYXQgdGhlCisgICAgICAgICAgaW5kaWNhdGVkIHJvdyBhbmQgY29sdW1uLiBUaGUgbnVtYmVycyBhcmUgMC1iYXNlZCwgZS5nLiB0aGUKKyAgICAgICAgICBob21lIHBvc2l0aW9uIGlzIDAsMC4KKworICAgaW50CisgICAgICAgICAgY2xlYXIoKQorICAgICAgICAgIFNlbmRzIHRoZSBlc2NhcGUgc2VxdWVuY2UgdG8gY2xlYXIgdGhlIHNjcmVlbi4KKworICAgaW50CisgICAgICAgICAgY2xydG9lb2woKQorICAgICAgICAgIFNlbmRzIHRoZSBlc2NhcGUgc2VxdWVuY2UgdG8gY2xlYXIgZnJvbSB0aGUgY3VycmVudCBjdXJzb3IKKyAgICAgICAgICBwb3NpdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgorCisgICBJbiB0aGUgTVlDVVJTRVMgY2FzZSwgY29kZSBtdXN0IGJlIGFkZGVkIHRvIGVhY2ggb2YgdGhlIGxhc3QgdGhyZWUKKyAgIHJvdXRpbmVzIHRvIGVtaXQgdGhlIGFwcHJvcHJpYXRlIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIGEgbmV3IHRlcm1pbmFsCisgICB0eXBlLgorCisgICBjbGVhcm9rKGN1cnNjciksIHdyZWZyZXNoKCkKKyAgICAgICAgICBJbiByZWFsIGN1cnNlcywgdGhlc2UgdHdvIGNhbGxzIGFyZSByZXF1aXJlZCB0byByZWZyZXNoIHRoZQorICAgICAgICAgIHNjcmVlbiwgZm9yIGV4YW1wbGUgYWZ0ZXIgaXQgd2FzIGZyYWN0dXJlZCBieSBhIGJyb2FkY2FzdAorICAgICAgICAgIG1lc3NhZ2UuIFRoZXNlIGFyZSB1c2VmdWwgb25seSBpZiB0aGUgdW5kZXJseWluZyBzY3JlZW4KKyAgICAgICAgICBtYW5hZ2VtZW50IHNlcnZpY2Uga2VlcHMgYSBjb3B5IG9mIHRoZSBlbnRpcmUgc2NyZWVuLCBhcyBjdXJzZXMKKyAgICAgICAgICBhbmQgU01HIGRvLiBDLUtlcm1pdCBkb2VzIG5vdCBkbyB0aGlzIGl0c2VsZi4KKworICAgWyBbMTMzXUNvbnRlbnRzIF0gWyBbMTM0XUMtS2VybWl0IF0gWyBbMTM1XUtlcm1pdCBIb21lIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LkguIEdyb3VwIEg6IFBzZXVkb3Rlcm1pbmFsIFN1cHBvcnQKKworICAgKFRvIGJlIGZpbGxlZCBpbi4uLikKKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LkkuIEdyb3VwIEk6IFNlY3VyaXR5CisKKyAgIChUbyBiZSBmaWxsZWQgaW4uLi4pCisKKyAgIFsgWzEzNl1Db250ZW50cyBdIFsgWzEzN11DLUtlcm1pdCBdIFsgWzEzOF1LZXJtaXQgSG9tZSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgQVBQRU5ESVggSS4gRklMRSBQRVJNSVNTSU9OUworCisgIEkuMS4gRm9ybWF0IG9mIFN5c3RlbS1EZXBlbmRlbnQgRmlsZSBQZXJtaXNzaW9ucyBpbiBBLVBhY2tldHMKKworICAgVGhlIGZvcm1hdCBvZiB0aGlzIGZpZWxkICh0aGUgIiwiIGF0dHJpYnV0ZSkgaXMgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nCisgICB0byB0aGUgU3lzdGVtIElEICgiLiIgQXR0cmlidXRlKS4KKworICAgRm9yIFVOSVggKFN5c3RlbSBJRCA9IFUxKSwgaXQncyB0aGUgZmFtaWxpYXIgMy1kaWdpdCBvY3RhbCBudW1iZXIsIHRoZQorICAgbG93LW9yZGVyIDkgYml0cyBvZiB0aGUgZmlsZW1vZGU6IE93bmVyLCBHcm91cCwgV29ybGQsIGUuZy4gNjYwID0KKyAgIHJlYWQvd3JpdGUgYWNjZXNzIGZvciBvd25lciBhbmQgZ3JvdXAsIG5vbmUgZm9yIHdvcmxkLCByZWNvcmRlZCBhcyBhCisgICAzLWRpZ2l0IG9jdGFsIHN0cmluZy4gSGlnaC1vcmRlciBVTklYIHBlcm1pc3Npb24gYml0cyBhcmUgbm90CisgICB0cmFuc21pdHRlZC4KKworICAgRm9yIFZNUyAoU3lzdGVtIElEID0gRDcpLCBpdCdzIGEgNC1kaWdpdCBoZXggc3RyaW5nLCByZXByZXNlbnRpbmcgdGhlCisgICAxNi1iaXQgZmlsZSBwcm90ZWN0aW9uIFdHT1MgZmllbGRzIChXb3JsZCxHcm91cCxPd25lcixTeXN0ZW0pLCBpbiB0aGF0CisgICBvcmRlciAod2hpY2ggaXMgdGhlIHJldmVyc2Ugb2YgaG93IHRoZXkncmUgc2hvd24gaW4gYSBkaXJlY3RvcnkKKyAgIGxpc3RpbmcpOyBpbiBlYWNoIGZpZWxkLCBCaXQgMCA9IFJlYWQsIDEgPSBXcml0ZSwgMiA9IEV4ZWN1dGUsIDMgPQorICAgRGVsZXRlLiBBIGJpdCB2YWx1ZSBvZiAwIG1lYW5zIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCwgMSBtZWFucworICAgcGVybWlzc2lvbiBpcyBkZW5pZWQuIFNhbXBsZToKKworICByLTAxLTAwLV5BLyFGV0VSTUlULkVYRSciCisgIHMtMDEtMDAtXkFFIVkvYW1kL3dhdHN1bi93L2ZkYy9uZXcvd2VybWl0LmV4ZS5EVgorICByLTAyLTAxLV5BXSJBLiJENyIiQjgjMTE5OTgwMTAxIDE4OjE0OjA1ISM4NTMxJjg3Mjk2MCwkQTIwQi0hNygjNTEyQCAjLlkKKyAgcy0wMi0wMS1eQSUiWS41IQorCisgICBBIFZNUyBkaXJlY3RvcnkgbGlzdGluZyBzaG93cyB0aGUgZmlsZSdzIHByb3RlY3Rpb24gYXMgKEUsUldFRCxSRUQsUkUpCisgICB3aGljaCByZWFsbHkgbWVhbnMgKFM9RSxPPVJXRUQsRz1SRUQsVz1SRSksIHdoaWNoIGlzIHJldmVyc2Ugb3JkZXIKKyAgIGZyb20gdGhlIGludGVybmFsIHN0b3JhZ2UsIHNvIChSRSxSRUQsUldFRCxFKS4gTm93IHRyYW5zbGF0ZSBlYWNoCisgICBsZXR0ZXIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYml0OgorCisgIFJFPTAxMDEsIFJFRD0xMTAxLCBSV0VEPTExMTEsIEU9MDAxMAorCisgICBOb3cgcmV2ZXJzZSB0aGUgYml0czoKKworICBSRT0xMDEwLCBSRUQ9MDAxMCwgUldFRD0wMDAwLCBFPTExMDEKKworICAgVGhpcyBnaXZlcyB0aGUgMTYtYml0IHF1YW50aXR5OgorCisgIDEwMTAwMDEwMDAwMDExMDEKKworICAgVGhpcyBpcyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFZNUyBmaWxlIHBlcm1pc3Npb247IGluCisgICBoZXg6CisKKyAgQTIwQgorCisgICBhcyBzaG93biBpbiB0aGUgc2FtcGxlIHBhY2tldCBhYm92ZS4KKworICAgVGhlIFZNUyBmb3JtYXQgcHJvYmFibHkgd291bGQgYWxzbyBhcHBseSB0byBSU1ggb3IgYW55IG90aGVyIEZJTEVTLTExCisgICBzeXN0ZW0uCisKKyAgSS4yLiBIYW5kbGluZyBvZiBHZW5lcmljIFByb3RlY3Rpb24KKworICAgVG8gYmUgdXNlZCB3aGVuIHRoZSB0d28gc3lzdGVtcyBhcmUgZGlmZmVyZW50IChhbmQvb3IgZG8gbm90IHJlY29nbml6ZQorICAgb3IgdW5kZXJzdGFuZCBlYWNoIG90aGVyJ3MgbG9jYWwgcHJvdGVjdGlvbiBjb2RlcykuCisKKyAgIEZpcnN0IG9mIGFsbCwgdGhlIGJvb2sgaXMgd3JvbmcuIFRoaXMgc2hvdWxkIG5vdCBiZSB0aGUgV29ybGQKKyAgIHByb3RlY3Rpb24sIGJ1dCB0aGUgT3duZXIgcHJvdGVjdGlvbi4gVGhlIG90aGVyIGZpZWxkcyBzaG91bGQgYmUgc2V0CisgICBhY2NvcmRpbmcgdG8gc3lzdGVtIGRlZmF1bHRzIChlLmcuIFVOSVggdW1hc2ssIFZNUyBkZWZhdWx0IHByb3RlY3Rpb24sCisgICBldGMpLCBleGNlcHQgdGhhdCBubyBub24tT3duZXIgZmllbGQgc2hvdWxkIGdpdmUgbW9yZSBwZXJtaXNzaW9ucyB0aGFuCisgICB0aGUgT3duZXIgZmllbGQuCisKKyAgIFsgWzEzOV1Ub3AgXSBbIFsxNDBdQ29udGVudHMgXSBbIFsxNDFdQy1LZXJtaXQgSG9tZSBdIFsgWzE0Ml1LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisKKyAgICBDLUtlcm1pdCBQcm9ncmFtIExvZ2ljIE1hbnVhbCAvIFsxNDNdVGhlIEtlcm1pdCBQcm9qZWN0IC8KKyAgICBbMTQ0XUNvbHVtYmlhIFVuaXZlcnNpdHkgLyBbMTQ1XWtlcm1pdEBjb2x1bWJpYS5lZHUgLyAxMCBBcHJpbCAyMDA0CisKK1JlZmVyZW5jZXMKKworICAgMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworICAgMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUvCisgICAzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwKKyAgIDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgIDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgICA2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjeDEKKyAgIDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbCN4MgorICAgOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI3gzCisgICA5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjeDQKKyAgMTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbCN4NC5BCisgIDExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjeDQuQgorICAxMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI3g0LkMKKyAgMTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbCN4NC5ECisgIDE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjeDQuRQorICAxNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI3g0LkYKKyAgMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbCN4NC5HCisgIDE3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjeDQuSAorICAxOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI3g0LkkKKyAgMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbCN4YTEKKyAgMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbCNjb250ZW50cworICAyMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI2NvbnRlbnRzCisgIDIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgIDIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorICAyNC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjcHJvLncKKyAgMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbCNjb250ZW50cworICAyNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorICAyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAgMjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbCN4My4yCisgIDI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjY29udGVudHMKKyAgMzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgMzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgIDMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjeDQuQQorICAzMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI2NvbnRlbnRzCisgIDM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgIDM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorICAzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI2NvbnRlbnRzCisgIDM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgIDM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorICAzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI2NvbnRlbnRzCisgIDQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgIDQxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorICA0Mi4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjbGliLmgKKyAgNDMuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY2xpYi5jCisgIDQ0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjeDMuMQorICA0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI2NvbnRlbnRzCisgIDQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgIDQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorICA0OC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjc3ltLmgKKyAgNDkuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY2FzYy5oCisgIDUwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2NzaWcuaAorICA1MS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjZGViLmgKKyAgNTIuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY2tlci5oCisgIDUzLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2N4bGEuaAorICA1NC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjbWFpLmMKKyAgNTUuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY3Byby53CisgIDU2LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2NmbnMuYworICA1Ny4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjZm4yLmMKKyAgNTguIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY2ZuMy5jCisgIDU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjeDQuQgorICA2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI3g0LkUKKyAgNjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbCN4NC5ECisgIDYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjY29udGVudHMKKyAgNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgNjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgIDY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjeDQuQgorICA2Ni4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1eGxhLmMKKyAgNjcuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXhsYS5oCisgIDY4LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2N4bGEuaAorICA2OS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1eGxhLmgKKyAgNzAuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrbXhsYS5oCisgIDcxLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9jaz94bGEKKyAgNzIuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY3VuaS5oCisgIDczLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2N1bmkuYworICA3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI2NvbnRlbnRzCisgIDc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgIDc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorICA3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI3g0LkIKKyAgNzguIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdWNtZC5oCisgIDc5LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3VjbWQuYworICA4MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI3g0LkUKKyAgODEuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXVzci5oCisgIDgyLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V1c3IuYworICA4My4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1dXMyLmMKKyAgODQuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXVzMy5jCisgIDg1LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V1czQuYworICA4Ni4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1dXN5LmMKKyAgODcuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXVzeC5jCisgIDg4LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V2ZXIuaAorICA4OS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1c2NyLmMKKyAgOTAuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdWRpYS5jCisgIDkxLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3Vjb24uYworICA5Mi4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1Y25zLmMKKyAgOTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbCN4NC5FCisgIDk0LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2NtYWkuYworICA5NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI2NvbnRlbnRzCisgIDk2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgIDk3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorICA5OC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1ZmlvLmMKKyAgOTkuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXRpby5jCisgMTAwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3VzaWcuYworIDEwMS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t2ZmlvLmMKKyAxMDIuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXNpZy5jCisgMTAzLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2NtYWkuYworIDEwNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI2NvbnRlbnRzCisgMTA1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTA2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDEwNy4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1dGlvLmMKKyAxMDguIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdnRpby5jCisgMTA5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjeDIKKyAxMTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbCN4YTEKKyAxMTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbAorIDExMi4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjbmV0LmgKKyAxMTMuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXRpby5jCisgMTE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjY29udGVudHMKKyAxMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAxMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMTE3LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V0aW8uYworIDExOC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjbmV0LmgKKyAxMTkuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY25ldC5jCisgMTIwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2xuZXQuYworIDEyMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI2NvbnRlbnRzCisgMTIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDEyNC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjdGVsLmgKKyAxMjUuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY3RlbC5jCisgMTI2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjY29udGVudHMKKyAxMjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAxMjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMTI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwjY29udGVudHMKKyAxMzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAxMzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMTMyLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V1c3guYworIDEzMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI2NvbnRlbnRzCisgMTM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDEzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI2NvbnRlbnRzCisgMTM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDEzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI3RvcAorIDE0MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sI2NvbnRlbnRzCisgMTQxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDE0My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAxNDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1LworIDE0NS4gbWFpbHRvOmtlcm1pdEBjb2x1bWJpYS5lZHUKZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja2Nwcm8udyBiL2NrZXJtaXQtOC4wLjIxMS9ja2Nwcm8udwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDlkMWZhCi0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrY3Byby53CkBAIC0wLDAgKzEsMzU5MSBAQAorY2hhciAqcHJvdHYgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLSotQy0qLSAqLworIkMtS2VybWl0IFByb3RvY29sIE1vZHVsZSA4LjAuMTU4LCAxMSBTZXAgMjAwMiI7CisKK2ludCBrYWN0aXZlID0gMDsJCQkvKiBLZXJtaXQgcHJvdG9jb2wgaXMgYWN0aXZlICovCisKKyNkZWZpbmUgUEtUWkVST0hBQ0sKKworLyogQyBLIEMgUCBSIE8gIC0tIEMtS2VybWl0IFByb3RvY29sIE1vZHVsZSwgaW4gV2FydCBwcmVwcm9jZXNzb3Igbm90YXRpb24uICovCisvKgorICBBdXRob3I6IEZyYW5rIGRhIENydXogPGZkY0Bjb2x1bWJpYS5lZHU+LAorICBDb2x1bWJpYSBVbml2ZXJzaXR5IEFjYWRlbWljIEluZm9ybWF0aW9uIFN5c3RlbXMsIE5ldyBZb3JrIENpdHkuCisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisjaWZuZGVmIE5PWEZFUgorI2luY2x1ZGUgImNrY3N5bS5oIgorI2luY2x1ZGUgImNrY2RlYi5oIgorI2luY2x1ZGUgImNrY2FzYy5oIgorI2luY2x1ZGUgImNrY2tlci5oIgorI2lmZGVmIE9TMgorI2lmbmRlZiBOVAorI2RlZmluZSBJTkNMX05PUE0KKyNkZWZpbmUgSU5DTF9WSU8JCQkvKiBOZWVkZWQgZm9yIGNrb2Nvbi5oICovCisjaW5jbHVkZSA8b3MyLmg+CisjdW5kZWYgQ09NTUVOVAorI2VuZGlmIC8qIE5UICovCisjaW5jbHVkZSAiY2tvY29uLmgiCisjZW5kaWYgLyogT1MyICovCisKKy8qCisgTm90ZSAtLSBUaGlzIGZpbGUgbWF5IGFsc28gYmUgcHJlcHJvY2Vzc2VkIGJ5IHRoZSBVTklYIExleCBwcm9ncmFtLCBidXQKKyB5b3UgbXVzdCBpbmRlbnQgdGhlIGFib3ZlICNpbmNsdWRlIHN0YXRlbWVudHMgYmVmb3JlIHVzaW5nIExleCwgYW5kIHRoZW4KKyByZXN0b3JlIHRoZW0gdG8gdGhlIGxlZnQgbWFyZ2luIGluIHRoZSByZXN1bHRpbmcgQyBwcm9ncmFtIGJlZm9yZSBjb21waWxhdGlvbi4KKyBBbHNvLCB0aGUgaW52b2NhdGlvbiBvZiB0aGUgIndhcnQoKSIgZnVuY3Rpb24gYmVsb3cgbXVzdCBiZSByZXBsYWNlZCBieSBhbgorIGludm9jYXRpb24gIG9mIHRoZSAieXlsZXgoKSIgZnVuY3Rpb24uICBJdCBtaWdodCBhbHNvIGJlIG5lY2Vzc2FyeSB0byByZW1vdmUKKyBjb21tZW50cyBpbiB0aGUgKCUpKCUpLi4uKCUpKCUpIHNlY3Rpb24uCisqLworCisvKiBTdGF0ZSBkZWZpbml0aW9ucyBmb3IgV2FydCAob3IgTGV4KSAqLworJXN0YXRlcyBpcGt0IHJmaWxlIHJhdHRyIHJkcGt0IHNzaW5pdCBzc2ZpbGUgc3NhdHRyIHNzZGF0YSBzc2VvZiBzc2VvdAorJXN0YXRlcyBzZXJ2ZSBnZW5lcmljIGdldCByZ2VuIHNzb3BrdCByb3BrdAorCitfUFJPVE9UWVAoc3RhdGljIFZPSUQgeHhwcm90bywodm9pZCkpOworX1BST1RPVFlQKHN0YXRpYyBWT0lEIHdoZXJlbXNnLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IHdhcnQsKHZvaWQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IHNnZXRpbml0LChpbnQsaW50KSk7CitfUFJPVE9UWVAoaW50IHNuZHNwYWNlLChpbnQpKTsKKworLyogRXh0ZXJuYWwgQy1LZXJtaXQgdmFyaWFibGUgZGVjbGFyYXRpb25zICovCisgIGV4dGVybiBjaGFyICp2ZXJzaW8sICpzcnZ0eHQsICpjbWFyZywgKmNtYXJnMiwgKipjbWxpc3QsICpyZl9lcnI7CisgIGV4dGVybiBjaGFyICogcmZzcGVjLCAqIHNmc3BlYywgKiBzcmZzcGVjLCAqIHJyZnNwZWM7CisgIGV4dGVybiBjaGFyICogcHJmc3BlYywgKiBwc2ZzcGVjLCAqIHBzcmZzcGVjLCAqIHBycmZzcGVjOworICBleHRlcm4gY2hhciAqY2Rtc2dmaWxlW107CisgIGV4dGVybiBjaGFyICogc25kX21vdmUsICogc25kX3JlbmFtZSwgKiBzcmltc2c7CisgIGV4dGVybiBjaGFyIGZpbG5hbVtdLCBvZmlsbmFtW10sIGZzcGVjW10sIHR0bmFtZVtdLCBvZm4xW107CisgIGV4dGVybiBDSEFSIHNzdGF0ZSwgKnNydnB0ciwgKmRhdGE7CisgIGV4dGVybiBpbnQgdGltaW50LCBydGltbywgbmZpbHMsIGhjZmxnLCB4ZmxnLCBmbG93LCBtZG10eXAsIG5ldHdvcms7CisgIGV4dGVybiBpbnQgb29wdHMsIG9tb2RlLCBvbmFtZSwgb3BhdGgsIG5vcHVzaCwgaXNndWVzdCwgeGNtZHNyYywgcmNkYWN0aXZlOworICBleHRlcm4gaW50IHJlamVjdGlvbiwgbW92aW5nLCBmbmNhY3QsIGJ5ZV9hY3RpdmUsIHVyc2VydmVyLCBmYXRhbGlvOworICBleHRlcm4gaW50IHByb3RvY29sLCBwcmVmaXhpbmcsIGZpbGNudCwgY2FycmllciwgZm5zcGF0aCwgaW50ZXJydXB0ZWQ7CisgIGV4dGVybiBpbnQgcmVjdXJzaXZlLCBpbnNlcnZlciwgbnp4b3B0cywgaWRsZXRtbywgc3J2aWRsLCB4ZnJpbnQ7CisgIGV4dGVybiBzdHJ1Y3QgY2tfcCBwdGFiW107CisgIGV4dGVybiBpbnQgcmVtZmlsZSwgcmVtcGlwZSwgeGZlcnN0YXQsIGZpbGVzdGF0dXMsIHdlYXJlYWxpa2UsIGZhY2twYXRoOworICBleHRlcm4gaW50IHBhdHRlcm5zLCBmaWxlcGVlaywgZ25mZXJyb3I7CisgIGV4dGVybiBjaGFyICogcmVtZGVzdDsKKworI2lmZGVmIFBLVFpFUk9IQUNLCisjZGVmaW5lIFBLVFpFUk9MRU4gMzIKK3N0YXRpYyBjaGFyIGlwa3RhY2tbUEtUWkVST0xFTl07CitzdGF0aWMgaW50IGlwa3RsZW4gPSAwOworI2VuZGlmIC8qIFBLVFpFUk9IQUNLICovCisKK3N0YXRpYyBpbnQgc190aW1pbnQgPSAtMTsJCS8qIEZvciBzYXZpbmcgdGltZW91dCB2YWx1ZSAqLworc3RhdGljIGludCBteWpvYiA9IDA7CitzdGF0aWMgaW50IGhhdmVmcyA9IDA7CisjaWZkZWYgQ0tfTE9HSU4KK3N0YXRpYyBpbnQgbG9ndHJpZXMgPSAwOworI2VuZGlmIC8qIENLX0xPR0lOICovCisKK3N0YXRpYyBpbnQgY2FuY2VsID0gMDsKK2ludCBmYWNrYnVnID0gMDsKKworI2lmZGVmIFNUUkVBTUlORworZXh0ZXJuIGludCBzdHJlYW1pbmcsIHN0cmVhbW9rOworCitzdGF0aWMgVk9JRAorc3RyZWFtb24oKSB7CisgICAgaWYgKHN0cmVhbW9rKSB7CisJZGVidWcoRjEwMCwic3RyZWFtb24iLCIiLDApOworCXN0cmVhbWluZyA9IDE7CisJdGltaW50ID0gMDsJCQkvKiBObyB0aW1lb3V0cyB3aGlsZSBzdHJlYW1pbmcuICovCisgICAgfQorfQorCisjaWZkZWYgQ09NTUVOVAkJCQkvKiAobm90IHVzZWQpICovCitzdGF0aWMgVk9JRAorc3RyZWFtb2ZmKCkgeworICAgIGlmIChzdHJlYW1pbmcpIHsKKwlkZWJ1ZyhGMTAwLCJzdHJlYW1vZmYiLCIiLDApOworCXN0cmVhbWluZyA9IDA7CisJdGltaW50ID0gc190aW1pbnQ7CQkvKiBSZXN0b3JlIHRpbWVvdXQgKi8KKyAgICB9Cit9CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2Vsc2UgLyogU1RSRUFNSU5HICovCisjZGVmaW5lIHN0cmVhbW9uKCkKKyNkZWZpbmUgc3RyZWFtb2ZmKCkKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKworI2lmbmRlZiBOT1NQTAorX1BST1RPVFlQKCBpbnQgYWRkbWFjLCAoY2hhciAqLCBjaGFyICopICk7CitfUFJPVE9UWVAoIGludCB6enN0cmluZywgKGNoYXIgKiwgY2hhciAqKiwgaW50ICopICk7CisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZm5kZWYgTk9JQ1AKK19QUk9UT1RZUCggaW50IGNtZHNyYywgKHZvaWQpICk7CisjZW5kaWYgLyogTk9JQ1AgKi8KKworI2lmbmRlZiBOT1NFUlZFUgorICBleHRlcm4gY2hhciAqIHhfdXNlciwgKiB4X3Bhc3N3ZCwgKiB4X2FjY3Q7CisgIGV4dGVybiBpbnQgeF9sb2dpbiwgeF9sb2dnZWQ7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKworI2luY2x1ZGUgImNrY25ldC5oIgorCisjaWZkZWYgVE5DT0RFCisgIGV4dGVybiBpbnQgdHRucHJvdG87CQkJLyogTmV0d29yayBwcm90b2NvbCAqLworI2VuZGlmIC8qIFROQ09ERSAqLworCisjaWZkZWYgQ0tfU1BFRUQKKyAgZXh0ZXJuIHNob3J0IGN0bHBbXTsJCQkvKiBDb250cm9sLWNoYXJhY3RlciBwcmVmaXggdGFibGUgKi8KKyNlbmRpZiAvKiBDS19TUEVFRCAqLworCisjaWZkZWYgVE5DT0RFCisgIGV4dGVybiBpbnQgdG5fYl9ubG0sIHRuX2JfeGZlciwgdG5fbmxtOworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgZXh0ZXJuIGludCB0bl9ub19lbmNyeXB0X3hmZXI7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2VuZGlmIC8qIFROQ09ERSAqLworCisjaWZkZWYgVENQU09DS0VUCisjaWZuZGVmIE5PTElTVEVOCisgIGV4dGVybiBpbnQgdGNwc3JmZDsKKyNlbmRpZiAvKiBOT0xJU1RFTiAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCisgIGV4dGVybiBpbnQgY3hzZWVuLCBjenNlZW4sIHNlcnZlciwgc3J2ZGlzLCBsb2NhbCwgZGlzcGxhLCBiY3R1LCBiY3RyLCBiY3RsOworICBleHRlcm4gaW50IHF1aWV0LCB0c2VjcywgcGFyaXR5LCBiYWNrZ3JkLCBuYWtzdGF0ZSwgYXRjYXB1LCB3c2xvdG4sIHdpbmxvOworICBleHRlcm4gaW50IHdzbG90cywgc3VjY2VzcywgeGl0c3RhLCBycHJpbnRmLCBkaXNjYXJkLCBjZHRpbW8sIGtlZXAsIGZkaXNwbGE7CisgIGV4dGVybiBpbnQgdGltZWYsIHN0ZGluZiwgcnNjYXB1LCBzZW5kbW9kZSwgZXBrdGZsZywgZXBrdHJjdmQsIGVwa3RzZW50OworICBleHRlcm4gaW50IGJpbmFyeSwgZm5jbnY7CisgIGV4dGVybiBsb25nIHNwZWVkLCBmZmMsIGNyYzE2LCBjYWxpYnJhdGUsIGRlc3Q7CisjaWZkZWYgQ09NTUVOVAorICBleHRlcm4gY2hhciAqVFlQQ01ELCAqRElSQ01ELCAqRElSQ00yOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZm5kZWYgT1MyCisgIGV4dGVybiBjaGFyICpTUEFDTUQsICpTUEFDTTIsICpXSE9DTUQ7CisjZW5kaWYgLyogT1MyICovCisgIGV4dGVybiBDSEFSICpyZGF0YXA7CisgIGV4dGVybiBzdHJ1Y3QgemF0dHIgaWF0dHI7CisKKyNpZmRlZiBWTVMKKyAgZXh0ZXJuIGludCBiYXRjaDsKKyNlbmRpZiAvKiBWTVMgKi8KKworI2lmZGVmIEdGVElNRVIKKyAgZXh0ZXJuIENLRkxPQVQgZnB0c2VjczsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisKKyAgZXh0ZXJuIENIQVIgKnNydmNtZDsKKyAgZXh0ZXJuIENIQVIgKmVwa3Rtc2c7CisKKyNpZmRlZiBDS19UTVBESVIKK2V4dGVybiBpbnQgZl90bXBkaXI7CQkJLyogRGlyZWN0b3J5IGNoYW5nZWQgdGVtcG9yYXJpbHkgKi8KK2V4dGVybiBjaGFyIHNhdmRpcltdOwkJCS8qIEZvciBzYXZpbmcgY3VycmVudCBkaXJlY3RvcnkgKi8KK2V4dGVybiBjaGFyICogZGxkaXI7CisjZW5kaWYgLyogQ0tfVE1QRElSICovCisKKyAgZXh0ZXJuIGludCBxdWVyeTsJCQkvKiBRdWVyeS1hY3RpdmUgZmxhZyAqLworI2lmbmRlZiBOT1NQTAorICBleHRlcm4gaW50IGNtZGx2bDsKKyAgY2hhciBxdWVyeWJ1ZltRQlVGTCsxXSA9IHsgTlVMLCBOVUwgfTsgLyogUVVFUlkgcmVzcG9uc2UgYnVmZmVyICovCisgIGNoYXIgKnFidWZwID0gcXVlcnlidWY7CQkvKiBQb2ludGVyIHRvIGl0ICovCisgIGludCBxYnVmbiA9IDA7CQkJLyogTGVuZ3RoIG9mIGRhdGEgaW4gaXQgKi8KKyNlbHNlCisgIGV4dGVybiBpbnQgdGxldmVsOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9JQ1AKKyAgZXh0ZXJuIGludCBlc2NhcGU7CisjZW5kaWYgLyogTk9JQ1AgKi8KKy8qCisgIElmIHRoZSBmb2xsb3dpbmcgZmxhZyBpcyBub256ZXJvIHdoZW4gdGhlIHByb3RvY29sIG1vZHVsZSBpcyBlbnRlcmVkLAorICB0aGVuIHNlcnZlciBtb2RlIHBlcnNpc3RzIGZvciBleGFjdGx5IG9uZSB0cmFuc2FjdGlvbiwgcmF0aGVyIHRoYW4KKyAgbG9vcGluZyB1bnRpbCBCWUUgb3IgRklOSVNIIGlzIHJlY2VpdmVkLgorKi8KK2V4dGVybiBpbnQganVzdG9uZTsKKworc3RhdGljIGludCByX3NhdmUgPSAtMTsKK3N0YXRpYyBpbnQgcF9zYXZlID0gLTE7CisKKy8qIEZ1bmN0aW9uIHRvIGxldCByZW1vdGUtbW9kZSB1c2VyIGtub3cgd2hlcmUgdGhlaXIgZmlsZShzKSB3ZW50ICovCisKK2ludCB3aGVyZWZsZyA9IDE7CQkJLyogVW5zZXQgd2l0aCBTRVQgWEZFUiBSRVBPUlQgKi8KKworc3RhdGljIFZPSUQKK3doZXJlbXNnKCkgeworICAgIGV4dGVybiBpbnQgcXVpZXQsIGZpbHJlajsKKyAgICBpbnQgbjsKKyAgICBuID0gZmlsY250IC0gZmlscmVqOworICAgIGRlYnVnKEYxMDEsIndoZXJlbXNnIG4iLCIiLG4pOworCisgICAgZGVidWcoRjExMCwid2hlcmVtc2cgcHJmc3BlYyIscHJmc3BlYywwKTsKKyAgICBkZWJ1ZyhGMTEwLCJ3aGVyZW1zZyByZnNwZWMiLHJmc3BlYywwKTsKKyAgICBkZWJ1ZyhGMTEwLCJ3aGVyZW1zZyBwc2ZzcGVjIixwc2ZzcGVjLDApOworICAgIGRlYnVnKEYxMTAsIndoZXJlbXNnIHNmc3BlYyIsc2ZzcGVjLDApOworCisgICAgZGVidWcoRjExMCwid2hlcmVtc2cgcHJyZnNwZWMiLHBycmZzcGVjLDApOworICAgIGRlYnVnKEYxMTAsIndoZXJlbXNnIHJyZnNwZWMiLHJyZnNwZWMsMCk7CisgICAgZGVidWcoRjExMCwid2hlcmVtc2cgcHNyZnNwZWMiLHBzcmZzcGVjLDApOworICAgIGRlYnVnKEYxMTAsIndoZXJlbXNnIHNyZnNwZWMiLHNyZnNwZWMsMCk7CisKKyAgICBpZiAoIXF1aWV0ICYmICFsb2NhbCkgeworCWlmIChuID09IDEpIHsKKwkgICAgc3dpdGNoIChteWpvYikgeworCSAgICAgIGNhc2UgJ3MnOgorCQlpZiAoc2ZzcGVjKSB7CisJCSAgICBwcmludGYoIiBTRU5UOiBbJXNdIixzZnNwZWMpOworCQkgICAgaWYgKHNyZnNwZWMpCisJCSAgICAgIHByaW50ZigiIFRvOiBbJXNdIixzcmZzcGVjKTsKKwkJICAgIHByaW50ZigiICglcylcbiIsIHN1Y2Nlc3MgPyAiT0siIDogIkZBSUxFRCIpOworCQl9CisJCWJyZWFrOworCSAgICAgIGNhc2UgJ3InOgorCSAgICAgIGNhc2UgJ3YnOgorCQlpZiAocnJmc3BlYykgeworCQkgICAgcHJpbnRmKCIgUkNWRDogWyVzXSIscnJmc3BlYyk7CisJCSAgICBpZiAocmZzcGVjKQorCQkgICAgICBwcmludGYoIiBUbzogWyVzXSIscmZzcGVjKTsKKwkJICAgIHByaW50ZigiICglcylcbiIsIHN1Y2Nlc3MgPyAiT0siIDogIkZBSUxFRCIpOworCQl9CisJICAgIH0KKwl9IGVsc2UgaWYgKG4gPiAxKSB7CisJICAgIHN3aXRjaCAobXlqb2IpIHsKKwkgICAgICBjYXNlICdzJzoKKwkJaWYgKHNmc3BlYykgeworCQkgICAgcHJpbnRmKCIgU0VOVDogKCVkIGZpbGVzKSIsbik7CisJCSAgICBpZiAoc3Jmc3BlYykKKwkJICAgICAgcHJpbnRmKCIgTGFzdDogWyVzXSIsc3Jmc3BlYyk7CisJCSAgICBwcmludGYoIiAoJXMpXG4iLCBzdWNjZXNzID8gIk9LIiA6ICJGQUlMRUQiKTsKKwkJfQorCQlicmVhazsKKwkgICAgICBjYXNlICdyJzoKKwkgICAgICBjYXNlICd2JzoKKwkJaWYgKHJyZnNwZWMpIHsKKwkJICAgIHByaW50ZigiIFJDVkQ6ICglZCBmaWxlcykiLG4pOworCQkgICAgaWYgKHJmc3BlYykKKwkJICAgICAgcHJpbnRmKCIgTGFzdDogWyVzXSIscmZzcGVjKTsKKwkJICAgIHByaW50ZigiICglcylcbiIsIHN1Y2Nlc3MgPyAiT0siIDogIkZBSUxFRCIpOworCQl9CisJICAgIH0KKwl9IGVsc2UgaWYgKG4gPT0gMCkgeworCSAgICBpZiAobXlqb2IgPT0gJ3MnKQorCSAgICAgIHByaW50ZigiIFNFTlQ6ICgwIGZpbGVzKSAgICAgICAgICBcbiIpOworCSAgICBlbHNlIGlmIChteWpvYiA9PSAncicgfHwgbXlqb2IgPT0gJ3YnKQorCSAgICAgIHByaW50ZigiIFJDVkQ6ICgwIGZpbGVzKSAgICAgICAgICBcbiIpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyBWT0lECityZGVidWcoKSB7CisgICAgaWYgKHNlcnZlcikKKyAgICAgIGRlYnVnKEYxMTEsIlJFU1VNRSIsInNlcnZlcj0xIixqdXN0b25lKTsKKyAgICBlbHNlCisgICAgICBkZWJ1ZyhGMTExLCJSRVNVTUUiLCJzZXJ2ZXI9MCIsanVzdG9uZSk7Cit9CisKKy8qIEZsYWdzIGZvciB0aGUgRU5BQkxFIGFuZCBESVNBQkxFIGNvbW1hbmRzICovCitleHRlcm4gaW50CisgIGVuX2NweSwgZW5fY3dkLCBlbl9kZWwsIGVuX2RpciwgZW5fZmluLCBlbl9nZXQsIGVuX2J5ZSwgZW5fbWFpLCBlbl9wcmksCisgIGVuX2hvcywgZW5fcmVuLCBlbl9zZW4sIGVuX3NwYSwgZW5fc2V0LCBlbl90eXAsIGVuX3dobywgZW5fcmV0LCBlbl94aXQsCisgIGVuX21rZCwgZW5fcm1kOworI2lmbmRlZiBOT1NQTAorZXh0ZXJuIGludCBlbl9hc2csIGVuX3F1ZTsKKyNlbmRpZiAvKiBOT1NQTCAqLworZXh0ZXJuIGludCB3aGF0LCBsYXN0eGZlcjsKKworLyogR2xvYmFsIHZhcmlhYmxlcyBkZWNsYXJlZCBoZXJlICovCisKKyAgaW50IHdoYXRydSA9IDA7CQkJLyogV2hhdCBhcmUgeW91LiAqLworICBpbnQgd2hhdHJ1MiA9IDA7CQkJLyogV2hhdCBhcmUgeW91LCBjb250J2QuICovCisKKy8qIExvY2FsIHZhcmlhYmxlcyAqLworCisgIHN0YXRpYyBjaGFyIHZzdGF0ZSA9IDA7ICAJCS8qIFNhdmVkIFN0YXRlICAgKi8KKyAgc3RhdGljIGNoYXIgdmNtZCA9IDA7ICAgIAkJLyogU2F2ZWQgQ29tbWFuZCAqLworICBzdGF0aWMgaW50IHJlZ2V0ID0gMDsJCQkvKiBGbGFnIGZvciBleGVjdXRpbmcgUkVHRVQgKi8KKyAgc3RhdGljIGludCByZXRyaWV2ZSA9IDA7CQkvKiBGbGFnIGZvciBleGVjdXRpbmcgUkVUUklFVkUgKi8KKyAgc3RhdGljIGludCBvcGt0ID0gMDsJCQkvKiBTZW5kIEV4dGVuZGVkIEdFVCBwYWNrZXQgKi8KKworICBzdGF0aWMgaW50IHg7CQkJCS8qIEdlbmVyYWwtcHVycG9zZSBpbnRlZ2VyICovCisgIHN0YXRpYyBjaGFyICpzOwkJCS8qIEdlbmVyYWwtcHVycG9zZSBzdHJpbmcgcG9pbnRlciAqLworCisvKiBNYWNyb3MgLSBOb3RlLCBCRUdJTiBpcyBwcmVkZWZpbmVkIGJ5IFdhcnQgKGFuZCBMZXgpIGFzICJzdGF0ZSA9ICIsICovCisvKiBCRUdJTiBpcyBOT1QgYSBHT1RPISAqLworI2RlZmluZSBUSU5JVCBpZiAodGluaXQoMSkgPCAwKSByZXR1cm4oLTkpCisjZGVmaW5lIFNFUlZFIHsgVElOSVQ7IHJlc2V0YygpOyBuYWtzdGF0ZT0xOyB3aGF0PVdfTk9USElORzsgY21hcmcyPSIiOyBcCitzZW5kbW9kZT1TTV9TRU5EOyBoYXZlZnM9MDsgcmVjdXJzaXZlPXJfc2F2ZTsgZm5zcGF0aD1wX3NhdmU7IEJFR0lOIHNlcnZlOyB9CisjZGVmaW5lIFJFU1VNRSB7IHJkZWJ1ZygpOyBpZiAoIXNlcnZlcikgeyB3aGVyZW1zZygpOyByZXR1cm4oMCk7IH0gZWxzZSBcCitpZiAoanVzdG9uZSkgeyBqdXN0b25lPTA7IHdoZXJlbXNnKCk7IHJldHVybigwKTsgfSBlbHNlIHsgU0VSVkU7IH0gfQorCisjaWZkZWYgR0ZUSU1FUgorI2RlZmluZSBRVUlUIHg9cXVpZXQ7IHF1aWV0PTE7IGNsc2lmKCk7IGNsc29mKDEpOyB0c2Vjcz1ndGltZXIoKTsgXAorIGZwdHNlY3M9Z2Z0aW1lcigpOyBxdWlldD14OyByZXR1cm4oc3VjY2VzcykKKyNlbHNlCisjZGVmaW5lIFFVSVQgeD1xdWlldDsgcXVpZXQ9MTsgY2xzaWYoKTsgY2xzb2YoMSk7IHRzZWNzPWd0aW1lcigpOyBxdWlldD14OyBcCisgcmV0dXJuKHN1Y2Nlc3MpCisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisvKgorICBCeSBsYXRlIDE5OTksIHRoZSBiaWcgc3dpdGNoKCkgc3RhdGVtZW50IGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgc3RhdGUKKyAgdGFibGUgYmVnYW4gY2hva2luZyBldmVuIGdjYywgc28gaGVyZSB3ZSBleHRyYWN0IHRoZSBjb2RlIGZyb20gdGhlIGxhcmdlcgorICBzdGF0ZXMgaW50byBzdGF0aWMgcm91dGluZXMgdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBjYXNlcyBhbmQgdGhlCisgIHN3aXRjaCgpIG92ZXJhbGwuICBUaGUgcm91dGluZXMgZm9sbG93IHRoZSBzdGF0ZSB0YWJsZTsgdGhlIHByb3RvdHlwZXMgYXJlCisgIGhlcmUuICBFYWNoIG9mIHRoZXNlIHJvdXRpbmVzIHNpbXBseSBjb250YWlucyB0aGUgdGV4dCBmcm9tIHRoZQorICBjb3JyZXNwb25kaW5nIGNhc2UsIGJ1dCB3aXRoIHJldHVybigtMSkgYWRkZWQgaW4gYXBwcm9wcmlhdGUgcGxhY2VzOyBzZWUKKyAgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSBzdGF0ZSB0YWJsZSBzd2l0Y2hlci4KKyovCitzdGF0aWMgaW50IHJjOwkJCQkvKiBSZXR1cm4gY29kZSBmb3IgdGhlc2Ugcm91dGluZXMgKi8KK3N0YXRpYyBpbnQgcmN2X3NfcGt0KCk7CQkJLyogUmVjZWl2ZWQgYW4gUyBwYWNrZXQgKi8KK3N0YXRpYyBpbnQgcmN2X2ZpcnN0ZGF0YSgpOwkJLyogUmVjZWl2ZWQgZmlyc3QgRGF0YSBwYWNrZXQgKi8KK3N0YXRpYyBpbnQgcmN2X3Nob3J0cmVwbHkoKTsJCS8qIFNob3J0IHJlcGx5IHRvIGEgUkVNT1RFIGNvbW1hbmQgICovCitzdGF0aWMgaW50IHNydl9xdWVyeSgpOwkJCS8qIFNlcnZlciBhbnN3ZXJzIGFuIHF1ZXJ5ICovCitzdGF0aWMgaW50IHNydl9jb3B5KCk7CQkJLyogU2VydmVyIGV4ZWN1dGVzIFJFTU9URSBDT1BZICovCitzdGF0aWMgaW50IHNydl9yZW5hbWUoKTsJCS8qIFNlcnZlciBleGVjdXRlcyBSRU1PVEUgUkVOQU1FICovCitzdGF0aWMgaW50IHNydl9sb2dpbigpOwkJCS8qIFNlcnZlciBleGVjdXRlcyBSRU1PVEUgTE9HSU4gKi8KK3N0YXRpYyBpbnQgc3J2X3RpbWVvdXQoKTsJCS8qIFNlcnZlciB0aW1lcyBvdXQgKi8KKworJSUKKworLyoKKyAgUHJvdG9jb2wgZW50cnkgcG9pbnRzLCBvbmUgZm9yIGVhY2ggc3RhcnQgc3RhdGUgKHNzdGF0ZSkuCisgIFRoZSBsb3dlcmNhc2UgbGV0dGVycyBhcmUgaW50ZXJuYWwgImlucHV0cyIgZnJvbSB0aGUgdXNlciBpbnRlcmZhY2UuCisgIE5PVEU6IFRoZSBzdGFydCBzdGF0ZSBsZXR0ZXJzIHRoYXQgYXBwZWFyIG9uIHRoZSBsZWZ0IG1hcmdpbiBpbW1lZGlhdGVseQorICBiZWxvdyBjYW4gTk9UIGJlIHVzZWQgYXMgcGFja2V0IHR5cGVzIE9SIGFzIEctcGFja2V0IHN1YmNvZGVzLgorKi8KKworcyB7IFRJTklUOwkJCQkvKiBTZW5kIGZpbGUocykgKi8KKyAgICBpZiAoc2luaXQoKSA+IDApIEJFR0lOIHNzaW5pdDsKKyAgICAgICBlbHNlIFJFU1VNRTsgfQorCit2IHsgVElOSVQ7IG5ha3N0YXRlID0gMTsgQkVHSU4gZ2V0OyB9CS8qIFJlY2VpdmUgZmlsZShzKSAqLworCityIHsJCQkJCS8qIENsaWVudCBzZW5kcyBhIEdFVCBjb21tYW5kICovCisgICAgVElOSVQ7CisgICAgdnN0YXRlID0gZ2V0OworICAgIHJlZ2V0ID0gMDsKKyAgICByZXRyaWV2ZSA9IDA7CisgICAgb3BrdCA9IDA7CisgICAgdmNtZCA9IDA7CisjaWZkZWYgUEtUWkVST0hBQ0sKKyAgICBpcGt0YWNrWzBdID0gTlVMOworI2VuZGlmIC8qIFBLVFpFUk9IQUNLICovCisgICAgaWYgKHNpcGt0KCdJJykgPj0gMCkKKyAgICAgIEJFR0lOIGlwa3Q7CisgICAgZWxzZQorICAgICAgUkVTVU1FOworfQorCitoIHsJCQkJCS8qIENsaWVudCBzZW5kcyBhIFJFVFJJRVZFIGNvbW1hbmQgKi8KKyAgICBUSU5JVDsKKyAgICB2c3RhdGUgPSBnZXQ7CisgICAgcmVnZXQgPSAwOworICAgIHJldHJpZXZlID0gMTsKKyAgICBvcGt0ID0gMDsKKyAgICB2Y21kID0gMDsKKyAgICBpZiAoc2lwa3QoJ0knKSA+PSAwKQorICAgICAgQkVHSU4gaXBrdDsKKyAgICBlbHNlCisgICAgICBSRVNVTUU7Cit9CitqIHsJCQkJCS8qIENsaWVudCBzZW5kcyBhIFJFR0VUIGNvbW1hbmQgKi8KKyAgICBUSU5JVDsKKyAgICB2c3RhdGUgPSBnZXQ7CisgICAgcmVnZXQgPSAxOworICAgIHJldHJpZXZlID0gMDsKKyAgICBvcGt0ID0gMDsKKyAgICB2Y21kID0gMDsKKyAgICBpZiAoc2lwa3QoJ0knKSA+PSAwKQorICAgICAgQkVHSU4gaXBrdDsKKyAgICBlbHNlCisgICAgICBSRVNVTUU7Cit9CitvIHsJCQkJCS8qIENsaWVudCBzZW5kcyBFeHRlbmRlZCBHRVQgUGFja2V0ICovCisgICAgVElOSVQ7CisgICAgdnN0YXRlID0gZ2V0OworICAgIHJlZ2V0ID0gb29wdHMgJiBHT1BUX1JFUzsKKyAgICByZXRyaWV2ZSA9IG9vcHRzICYgR09QVF9ERUw7CisgICAgb3BrdCA9IDE7CisgICAgdmNtZCA9IDA7CisgICAgaWYgKHNpcGt0KCdJJykgPj0gMCkKKyAgICAgIEJFR0lOIGlwa3Q7CisgICAgZWxzZQorICAgICAgUkVTVU1FOworfQorYyB7CQkJCQkvKiBDbGllbnQgc2VuZHMgYSBIb3N0IGNvbW1hbmQgKi8KKyAgICBUSU5JVDsKKyAgICB2c3RhdGUgPSByZ2VuOworICAgIHZjbWQgPSAnQyc7CisgICAgaWYgKHNpcGt0KCdJJykgPj0gMCkKKyAgICAgIEJFR0lOIGlwa3Q7CisgICAgZWxzZQorICAgICAgUkVTVU1FOworfQorayB7IFRJTklUOwkJCQkvKiBDbGllbnQgc2VuZHMgYSBLZXJtaXQgY29tbWFuZCAqLworICAgIHZzdGF0ZSA9IHJnZW47CisgICAgdmNtZCA9ICdLJzsKKyAgICBpZiAoc2lwa3QoJ0knKSA+PSAwKQorICAgICAgQkVHSU4gaXBrdDsKKyAgICBlbHNlCisgICAgICBSRVNVTUU7Cit9CitnIHsJCQkJCS8qIENsaWVudCBzZW5kcyBhIFJFTU9URSBjb21tYW5kICovCisgICAgVElOSVQ7CisgICAgdnN0YXRlID0gcmdlbjsKKyAgICB2Y21kID0gJ0cnOworICAgIGlmIChzaXBrdCgnSScpID49IDApCisgICAgICBCRUdJTiBpcGt0OworICAgIGVsc2UKKyAgICAgIFJFU1VNRTsKK30KK3ggewkJCQkJLyogRW50ZXIgc2VydmVyIG1vZGUgKi8KKyAgICBpbnQgeDsKKyAgICB4ID0ganVzdG9uZTsKKyAgICBpZiAoIUVOQUJMRUQoZW5fZGVsKSkgewkJLyogSWYgREVMRVRFIGlzIGRpc2FibGVkICovCisJaWYgKGZuY2FjdCA9PSBYWUZYX0IgfHwJCS8qIHVuZG8gYW55IGZpbGUgY29sbGlzaW9uIGFjdGlvbiAqLworCSAgICBmbmNhY3QgPT0gWFlGWF9VIHx8CQkvKiB0aGF0IGNvdWxkIHJlc3VsdCBpbiBkZWxldGlvbiBvciAqLworCSAgICBmbmNhY3QgPT0gWFlGWF9BIHx8CQkvKiBtb2RpZmljYXRpb24gb2YgZXhpc3RpbmcgZmlsZXMuICovCisJICAgIGZuY2FjdCA9PSBYWUZYX1gpIHsKKyNpZm5kZWYgTk9JQ1AKKwkgICAgZXh0ZXJuIGludCBnX2ZuY2FjdDsKKwkgICAgZ19mbmNhY3QgPSBmbmNhY3Q7CQkvKiBTYXZlIGN1cnJlbnQgc2V0dGluZyAqLworI2VuZGlmIC8qIE5PSUNQICovCisJICAgIGZuY2FjdCA9IFhZRlhfUjsJCS8qIENoYW5nZSB0byBSRU5BTUUgKi8KKwkgICAgZGVidWcoRjEwMSwic2VydmVyIERFTEVURSBkaXNhYmxlZCBzbyBmbmNhY3QgUkVOQU1FIiwiIixmbmNhY3QpOworCX0KKyAgICB9CisgICAgU0VSVkU7CQkJCS8qIHRpbml0KCkgY2xlYXJzIGp1c3RvbmUuLi4gKi8KKyAgICBqdXN0b25lID0geDsKKyNpZmRlZiBJS1NEQgorICAgIGlmIChpa2Rib3Blbikgc2xvdHN0YXRlKHdoYXQsICJTRVJWRVIiLCAiIiwgIiIpOworI2VuZGlmIC8qIElLU0RCICovCit9CisKK2EgeworICAgIGludCBiMSA9IDAsIGIyID0gMDsKKyAgICBpZiAoIWRhdGEpIFRJTklUOwkJCS8qICJBQkVORCIgLS0gVGVsbCBvdGhlciBzaWRlLiAqLworI2lmbmRlZiBwZHAxMQorICAgIGlmIChlcGt0ZmxnKSB7CQkJLyogSWYgYmVjYXVzZSBvZiBFLVBBQ0tFVCBjb21tYW5kICovCisJYjEgPSBiY3RsOyBiMiA9IGJjdHU7CQkvKiBTYXZlIGJsb2NrIGNoZWNrIHR5cGUgKi8KKwliY3RsID0gYmN0dSA9IDE7CQkvKiBzZXQgaXQgdG8gMSAqLworICAgIH0KKyNlbmRpZiAvKiBwZHAxMSAqLworICAgIGVycnBrdCgoQ0hBUiAqKSJVc2VyIGNhbmNlbGxlZCIpOwkvKiBTZW5kIHRoZSBwYWNrZXQgKi8KKyNpZm5kZWYgcGRwMTEKKyAgICBpZiAoZXBrdGZsZykgewkJCS8qIFJlc3RvcmUgdGhlIGJsb2NrIGNoZWNrICovCisJZXBrdGZsZyA9IDA7CisJYmN0bCA9IGIxOyBiY3R1ID0gYjI7CisgICAgfQorI2VuZGlmIC8qIHBkcDExICovCisgICAgc3VjY2VzcyA9IDA7CisgICAgcmV0dXJuKDApOwkJCQkvKiBSZXR1cm4gZnJvbSBwcm90b2NvbC4gKi8KK30KKworLyoKKyAgRHluYW1pYyBzdGF0ZXM6IDxjdXJyZW50LXN0YXRlcz5pbnB1dC1jaGFyYWN0ZXIgeyBhY3Rpb24gfQorICBuYWtzdGF0ZSAhPSAwIG1lYW5zIHdlJ3JlIGluIGEgcmVjZWl2aW5nIHN0YXRlLCBpbiB3aGljaCB3ZSBzZW5kIEFDS3MgJiBOQUtzLgorKi8KKworPHJnZW4sZ2V0LHNlcnZlLHJvcGt0PlMgewkJLyogUmVjZWl2ZSBTZW5kLUluaXQgcGFja2V0LiAqLworICAgIHJjID0gcmN2X3NfcGt0KCk7CisgICAgY2FuY2VsID0gMDsJCQkJLyogUmVzZXQgY2FuY2VsbGF0aW9uIGNvdW50ZXIgKi8KKyAgICBkZWJ1ZyhGMTAxLCJyY3Zfc19wa3QiLCIiLHJjKTsKKyAgICBpZiAocmMgPiAtMSkgcmV0dXJuKHJjKTsJCS8qIChzZWUgYmVsb3cpICovCit9CisKKy8qIFN0YXRlcyBpbiB3aGljaCB3ZSBnZXQgcmVwbGllcyBiYWNrIGZyb20gY29tbWFuZHMgc2VudCB0byBhIHNlcnZlci4gKi8KKy8qIENvbXBsaWNhdGVkIGJlY2F1c2UgZGlyZWN0aW9uIG9mIHByb3RvY29sIGNoYW5nZXMsIHBhY2tldCBudW1iZXIgICAgKi8KKy8qIHN0YXlzIGF0IHplcm8gdGhyb3VnaCBJLUctUyBzZXF1ZW5jZSwgYW5kIGNvbXBsaWNhdGVkIGV2ZW4gbW9yZSBieSAgKi8KKy8qIHNsaWRpbmcgd2luZG93cyBidWZmZXIgYWxsb2NhdGlvbi4gKi8KKworPGlwa3Q+WSB7CQkJCS8qIEdldCBhY2sgZm9yIEktcGFja2V0ICovCisgICAgaW50IHggPSAwOworI2lmZGVmIFBLVFpFUk9IQUNLCisgICAgY2tzdHJuY3B5KGlwa3RhY2ssKGNoYXIgKilyZGF0YXAsUEtUWkVST0xFTik7IC8qIFNhdmUgYSBjb3B5IG9mIHRoZSBBQ0sgKi8KKyAgICBpcGt0bGVuID0gc3RybGVuKGlwa3RhY2spOworI2VuZGlmIC8qIFBLVFpFUk9IQUNLICovCisgICAgc3BhcihyZGF0YXApOwkJCS8qIFNldCBwYXJhbWV0ZXJzICovCisgICAgY2FuY2VsID0gMDsKKyAgICB3aW5sbyA9IDA7CQkJCS8qIFNldCB3aW5kb3ctbG93IGJhY2sgdG8gemVybyAqLworICAgIGRlYnVnKEYxMDEsIjxpcGt0Plkgd2lubG8iLCIiLHdpbmxvKTsKKyAgICB1cnNlcnZlciA9IDE7CQkJLyogU28gSSBrbm93IEknbSB0YWxraW5nIHRvIGEgc2VydmVyICovCisgICAgaWYgKHZjbWQpIHsJCQkJLyogSWYgc2VuZGluZyBhIGdlbmVyaWMgY29tbWFuZCAqLworCWlmICh0aW5pdCgwKSA8IDApIHJldHVybigtOSk7CS8qIEluaXRpYWxpemUgbWFueSB0aGluZ3MgKi8KKwl4ID0gc2NtZCh2Y21kLChDSEFSICopY21hcmcpOwkvKiBEbyB0aGF0ICovCisJaWYgKHggPj0gMCkgeCA9IDA7CQkvKiAoYmVjYXVzZSBvZiBPLVBhY2tldCkgKi8KKwlkZWJ1ZyhGMTAxLCJwcm90byBHIHBhY2tldCBzY21kIiwiIix4KTsKKwl2Y21kID0gMDsJCQkvKiBhbmQgdGhlbiB1bi1yZW1lbWJlciBpdC4gKi8KKyAgICB9IGVsc2UgaWYgKHZzdGF0ZSA9PSBnZXQpIHsKKwlkZWJ1ZyhGMTAxLCJSRUdFVCBzc3RhdGUiLCIiLHNzdGF0ZSk7CisJeCA9IHNyaW5pdChyZWdldCwgcmV0cmlldmUsIG9wa3QpOyAvKiBHRVQgb3IgUkVHRVQsIGV0YyAqLworICAgIH0KKyAgICBpZiAoeCA8IDApIHsJCQkvKiBJZiBjb21tYW5kIHdhcyB0b28gbG9uZyAqLworCWlmICghc3JpbXNnKQorCSAgc3JpbXNnID0gIkVycm9yIHNlbmRpbmcgc3RyaW5nIjsKKwllcnJwa3QoKENIQVIgKilzcmltc2cpOwkJLyogY2FuY2VsIGJvdGggc2lkZXMuICovCisJc3VjY2VzcyA9IDA7CisJUkVTVU1FOworICAgIH0gZWxzZSBpZiAoeCA+IDApIHsJCQkvKiBOZWVkIHRvIHNlbmQgbW9yZSBPLVBhY2tldHMgKi8KKwlCRUdJTiBzc29wa3Q7CisgICAgfSBlbHNlIHsKKwlydGltZXIoKTsJCQkvKiBSZXNldCB0aGUgZWxhcHNlZCBzZWNvbmRzIHRpbWVyLiAqLworI2lmZGVmIEdGVElNRVIKKwlyZnRpbWVyKCk7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworCXdpbmxvID0gMDsJCQkvKiBXaW5kb3cgYmFjayB0byAwLCBhZ2Fpbi4gKi8KKwlkZWJ1ZyhGMTAxLCI8aXBrdD5ZIHZzdGF0ZSIsIiIsdnN0YXRlKTsKKwluYWtzdGF0ZSA9IDE7CQkJLyogQ2FuIHNlbmQgTkFLcyBmcm9tIGhlcmUuICovCisJQkVHSU4gdnN0YXRlOwkJCS8qIFN3aXRjaCB0byBkZXNpcmVkIHN0YXRlICovCisgICAgfQorfQorCis8c3NvcGt0PlkgewkJCQkvKiBHb3QgQUNLIHRvIE8tUGFja2V0ICovCisgICAgZGVidWcoRjEwMCwiQ1BDUFJPIDxzc29wa3Q+WSIsIiIsMCk7CisgICAgeCA9IHNvcGt0KCk7CisgICAgZGVidWcoRjEwMSwiQ1BDUFJPIDxzc29wa3Q+WSB4IiwiIix4KTsKKyAgICBpZiAoeCA8IDApIHsJCQkvKiBJZiBlcnJvciAqLworCWVycnBrdCgoQ0hBUiAqKXNyaW1zZyk7CQkvKiBjYW5jZWwgYm90aCBzaWRlcy4gKi8KKwlzdWNjZXNzID0gMDsKKwlSRVNVTUU7CisgICAgfSBlbHNlIGlmICh4ID09IDApIHsJCS8qIFRoaXMgd2FzIHRoZSBsYXN0IE8tUGFja2V0ICovCisJcnRpbWVyKCk7CQkJLyogUmVzZXQgdGhlIGVsYXBzZWQgc2Vjb25kcyB0aW1lci4gKi8KKyNpZmRlZiBHRlRJTUVSCisJcmZ0aW1lcigpOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKwl3aW5sbyA9IDA7CQkJLyogV2luZG93IGJhY2sgdG8gMCwgYWdhaW4uICovCisJZGVidWcoRjEwMSwiPHNzb3BrdD5ZIHdpbmxvIiwiIix3aW5sbyk7CisJbmFrc3RhdGUgPSAxOwkJCS8qIENhbiBzZW5kIE5BS3MgZnJvbSBoZXJlLiAqLworCUJFR0lOIHZzdGF0ZTsJCQkvKiBTd2l0Y2ggdG8gZGVzaXJlZCBzdGF0ZSAqLworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJDUENQUk8gPHNzb3BrdD5ZIG5vdCBjaGFuZ2luZyBzdGF0ZSIsIiIseCk7Cit9CisKKzxpcGt0PkUgewkJCQkvKiBJZ25vcmUgRXJyb3IgcmVwbHkgdG8gSSBwYWNrZXQgKi8KKyAgICBpbnQgeCA9IDA7CisgICAgd2lubG8gPSAwOwkJCQkvKiBTZXQgd2luZG93LWxvdyBiYWNrIHRvIHplcm8gKi8KKyAgICBkZWJ1ZyhGMTAxLCI8aXBrdD5FIHdpbmxvIiwiIix3aW5sbyk7CisgICAgaWYgKHZjbWQpIHsJCQkJLyogSW4gY2FzZSBvdGhlciBLZXJtaXQgZG9lc24ndCAqLworCWlmICh0aW5pdCgwKSA8IDApIHJldHVybigtOSk7CisJeCA9IHNjbWQodmNtZCwoQ0hBUiAqKWNtYXJnKTsJLyogdW5kZXJzdGFuZCBJLXBhY2tldHMuICovCisJaWYgKHggPj0gMCkgeCA9IDA7CQkvKiAoYmVjYXVzZSBvZiBPLVBhY2tldCkgKi8KKwl2Y21kID0gMDsJCQkvKiBPdGhlcndpc2UgYWN0IGFzIGFib3ZlLi4uICovCisgICAgfSBlbHNlIGlmICh2c3RhdGUgPT0gZ2V0KSB4ID0gc3Jpbml0KHJlZ2V0LCByZXRyaWV2ZSwgb3BrdCk7CisgICAgaWYgKHggPCAwKSB7CQkJLyogSWYgY29tbWFuZCB3YXMgdG9vIGxvbmcgKi8KKwllcnJwa3QoKENIQVIgKilzcmltc2cpOwkJLyogY2FuY2VsIGJvdGggc2lkZXMuICovCisJc3VjY2VzcyA9IDA7CisJUkVTVU1FOworICAgIH0gZWxzZSBpZiAoeCA+IDApIHsJCQkvKiBOZWVkIHRvIHNlbmQgbW9yZSBPLVBhY2tldHMgKi8KKwlCRUdJTiBzc29wa3Q7CisgICAgfSBlbHNlIHsKKwlmcmVlcnBrdCh3aW5sbyk7CQkvKiBEaXNjYXJkIHRoZSBFcnJvciBwYWNrZXQuICovCisJZGVidWcoRjEwMSwiPGlwa3Q+RSB3aW5sbyIsIiIsd2lubG8pOworCXdpbmxvID0gMDsJCQkvKiBCYWNrIHRvIHBhY2tldCAwIGFnYWluLiAqLworCW5ha3N0YXRlID0gMTsJCQkvKiBDYW4gc2VuZCBOQUtzIGZyb20gaGVyZS4gKi8KKwlCRUdJTiB2c3RhdGU7CisgICAgfQorfQorCis8Z2V0PlkgewkJLyogUmVzZW5kIG9mIHByZXZpb3VzIEktcGt0IEFDSywgc2FtZSBzZXEgbnVtYmVyICovCisgICAgZnJlZXJwa3QoMCk7CQkJLyogRnJlZSB0aGUgQUNLJ3MgcmVjZWl2ZSBidWZmZXIgKi8KKyAgICByZXNlbmQoMCk7CQkJCS8qIFNlbmQgdGhlIEdFVCBwYWNrZXQgYWdhaW4uICovCit9CisKKy8qIFN0YXRlcyBpbiB3aGljaCB3ZSdyZSBiZWluZyBhIHNlcnZlciAqLworCis8c2VydmUsZ2V0PkkgewkJCQkvKiBHZXQgSS1wYWNrZXQgKi8KKyNpZm5kZWYgTk9TRVJWRVIKKyAgICBzcGFyKHJkYXRhcCk7CQkJLyogU2V0IHBhcmFtZXRlcnMgZnJvbSBpdCAqLworICAgIGFjazEocnBhcigpKTsJCQkvKiBSZXNwb25kIHdpdGggb3VyIG93biBwYXJhbWV0ZXJzICovCisjaWZkZWYgQ09NTUVOVAorICAgIHBrdGluaXQoKTsJCQkJLyogUmVpbml0aWFsaXplIHBhY2tldCBudW1iZXJzICovCisjZWxzZQorI2lmZGVmIENPTU1FTlQKKyAgICAvKiBUaGlzIGNhbid0IGJlIHJpZ2h0IC0gaXQgdW5kb2VzIHRoZSBzdHVmZiB3ZSBqdXN0IG5lZ290aWF0ZWQgKi8KKyAgICB4ID0ganVzdG9uZTsKKyAgICB0aW5pdCgxKTsJCQkJLyogUmVpbml0aWFsaXplIEVWRVJZVEhJTkcgKi8KKyAgICBqdXN0b25lID0geDsJCQkvKiBCdXQgdGhpcy4uLiAqLworI2Vsc2UKKyAgICB0aW5pdCgwKTsJCQkJLyogSW5pdGlhbGl6ZSBtb3N0IHRoaW5ncyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKyAgICBjYW5jZWwgPSAwOwkJCQkvKiBSZXNldCBjYW5jZWxsYXRpb24gY291bnRlciAqLworfQorCis8c2VydmU+UiB7CQkJCS8qIEdFVCAqLworI2lmbmRlZiBOT1NFUlZFUgorICAgIGlmICh4X2xvZ2luICYmICF4X2xvZ2dlZCkgeworCWVycnBrdCgoQ0hBUiAqKSJMb2dpbiByZXF1aXJlZCIpOworCVNFUlZFOworICAgIH0gZWxzZSBpZiAoc2dldGluaXQoMCwwKSA8IDApIHsKKwlSRVNVTUU7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBDS1NZU0xPRworCWlmIChja3hzeXNsb2cgPj0gU1lTTEdfUFIgJiYgY2t4bG9nZ2luZykKKwkgIGNrc3lzbG9nKFNZU0xHX1BSLCAxLCAic2VydmVyIiwgIkdFVCIsIChjaGFyICopc3J2Y21kKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworCUJFR0lOIHNzaW5pdDsKKyAgICB9CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KK30KKworPHNlcnZlPkggewkJCQkvKiBHRVQgL0RFTEVURSAoUkVUUklFVkUpICovCisjaWZuZGVmIE5PU0VSVkVSCisgICAgaWYgKHhfbG9naW4gJiYgIXhfbG9nZ2VkKSB7CisJZXJycGt0KChDSEFSICopIkxvZ2luIHJlcXVpcmVkIik7CisJUkVTVU1FOworICAgIH0gZWxzZSBpZiAoIUVOQUJMRUQoZW5fZGVsKSkgeworCWVycnBrdCgoQ0hBUiAqKSJEZWxldGluZyBmaWxlcyBpcyBkaXNhYmxlZCIpOworCVJFU1VNRTsKKyAgICB9IGVsc2UgaWYgKHNnZXRpbml0KDAsMCkgPCAwKSB7CisJUkVTVU1FOworICAgIH0gZWxzZSB7CisJbW92aW5nID0gMTsKKyNpZmRlZiBDS1NZU0xPRworCWlmIChja3hzeXNsb2cgPj0gU1lTTEdfUFIgJiYgY2t4bG9nZ2luZykKKwkgIGNrc3lzbG9nKFNZU0xHX1BSLCAxLCAic2VydmVyIiwgIkdFVCAvREVMRVRFIiwgKGNoYXIgKilzcnZjbWQpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisJQkVHSU4gc3Npbml0OworICAgIH0KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCis8c2VydmU+ViB7CQkJCS8qIEdFVCAvUkVDVVJTSVZFICovCisjaWZuZGVmIE5PU0VSVkVSCisgICAgcmVjdXJzaXZlID0gMTsJCQkvKiBTZXQgdGhlc2UgYmVmb3JlIHNnZXRpbml0KCkgKi8KKyAgICBpZiAoZm5zcGF0aCA9PSBQQVRIX09GRikKKyAgICAgIGZuc3BhdGggPSBQQVRIX1JFTDsJCS8qIERvbid0IHdvcnJ5LCB0aGV5IHdpbGwgYmUgKi8KKyAgICBpZiAoeF9sb2dpbiAmJiAheF9sb2dnZWQpIHsJCS8qIHJlc2V0IG5leHQgdGltZSB0aHJvdWdoLiAqLworCWVycnBrdCgoQ0hBUiAqKSJMb2dpbiByZXF1aXJlZCIpOworCVJFU1VNRTsKKyAgICB9IGVsc2UgaWYgKHNnZXRpbml0KDAsMCkgPCAwKSB7CisJUkVTVU1FOworICAgIH0gZWxzZSB7CisjaWZkZWYgQ0tTWVNMT0cKKwlpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisJICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJHRVQgL1JFQ1VSU0lWRSIsIChjaGFyICopc3J2Y21kKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworCUJFR0lOIHNzaW5pdDsKKyAgICB9CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KK30KKworPHNlcnZlPlcgewkJCQkvKiBHRVQgL1JFQ1VSU0lWRSAvREVMRVRFICovCisjaWZuZGVmIE5PU0VSVkVSCisgICAgcmVjdXJzaXZlID0gMTsJCQkvKiBTZXQgdGhlc2UgYmVmb3JlIHNnZXRpbml0KCkgKi8KKyAgICBpZiAoZm5zcGF0aCA9PSBQQVRIX09GRikKKyAgICAgIGZuc3BhdGggPSBQQVRIX1JFTDsJCS8qIERvbid0IHdvcnJ5LCB0aGV5IHdpbGwgYmUgKi8KKyAgICBtb3ZpbmcgPSAxOwkJCQkvKiByZXNldCBuZXh0IHRpbWUgdGhyb3VnaC4gKi8KKyAgICBpZiAoeF9sb2dpbiAmJiAheF9sb2dnZWQpIHsKKwllcnJwa3QoKENIQVIgKikiTG9naW4gcmVxdWlyZWQiKTsKKwlSRVNVTUU7CisgICAgfSBlbHNlIGlmICghRU5BQkxFRChlbl9kZWwpKSB7CisJZXJycGt0KChDSEFSICopIkRlbGV0aW5nIGZpbGVzIGlzIGRpc2FibGVkIik7CisJUkVTVU1FOworICAgIH0gZWxzZSBpZiAoc2dldGluaXQoMCwwKSA8IDApIHsKKwlSRVNVTUU7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBDS1NZU0xPRworCWlmIChja3hzeXNsb2cgPj0gU1lTTEdfUFIgJiYgY2t4bG9nZ2luZykKKwkgIGNrc3lzbG9nKFNZU0xHX1BSLDEsInNlcnZlciIsCisJCSAgICJHRVQgL1JFQ1VSU0lWRSAvREVMRVRFIiwoY2hhciAqKXNydmNtZCk7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKwlCRUdJTiBzc2luaXQ7CisgICAgfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCit9CisKKzxzZXJ2ZT5KIHsJCQkJLyogR0VUIC9SRUNPVkVSIChSRUdFVCkgKi8KKyNpZm5kZWYgTk9TRVJWRVIKKyAgICBpZiAoeF9sb2dpbiAmJiAheF9sb2dnZWQpIHsKKwllcnJwa3QoKENIQVIgKikiTG9naW4gcmVxdWlyZWQiKTsKKwlTRVJWRTsKKyAgICB9IGVsc2UgaWYgKHNnZXRpbml0KDEsMCkgPCAwKSB7CisJUkVTVU1FOworICAgIH0gZWxzZSB7CisjaWZkZWYgQ0tTWVNMT0cKKwlpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisJICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJHRVQgL1JFQ09WRVIiLCAoY2hhciAqKXNydmNtZCk7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKwlCRUdJTiBzc2luaXQ7CisgICAgfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCit9CisKKzxzZXJ2ZT5PIHsJCQkJLyogRXh0ZW5kZWQgR0VUICovCisjaWZuZGVmIE5PU0VSVkVSCisgICAgaWYgKHhfbG9naW4gJiYgIXhfbG9nZ2VkKSB7CQkvKiAoYW55IGNvbWJpbmF0aW9uIG9mIG9wdGlvbnMpICovCisJZXJycGt0KChDSEFSICopIkxvZ2luIHJlcXVpcmVkIik7CisJU0VSVkU7CisgICAgfSBlbHNlIGlmICgoeCA9IHNnZXRpbml0KDAsMSkpIDwgMCkgeworCWRlYnVnKEYxMDEsIkNLQ1BSTyA8c2VydmU+TyBzZ2V0aW5pdCBmYWlsIiwiIix4KTsKKwlSRVNVTUU7CisgICAgfSBlbHNlIGlmICh4ID09IDApIHsKKwlkZWJ1ZyhGMTAxLCJDS0NQUk8gPHNlcnZlPk8gc2dldGluaXQgZG9uZSIsIiIseCk7CisjaWZkZWYgQ0tTWVNMT0cKKwlpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisJICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJFWFRFTkRFRCBHRVQiLCAoY2hhciAqKXNydmNtZCk7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKwlCRUdJTiBzc2luaXQ7CisgICAgfSBlbHNlIHsJCQkJLyogT3RoZXJ3aXNlIHN0YXkgaW4gdGhpcyBzdGF0ZSAqLworCWRlYnVnKEYxMDEsIkNLQ1BSTyA8c2VydmU+TyBzZ2V0aW5pdCBUQkMiLCIiLHgpOworCWFjaygpOworCUJFR0lOIHJvcGt0OworICAgIH0KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCis8cm9wa3Q+TyB7CisjaWZuZGVmIE5PU0VSVkVSCisgICAgaWYgKHhfbG9naW4gJiYgIXhfbG9nZ2VkKSB7CQkvKiAoYW55IGNvbWJpbmF0aW9uIG9mIG9wdGlvbnMpICovCisJZXJycGt0KChDSEFSICopIkxvZ2luIHJlcXVpcmVkIik7CisJU0VSVkU7CisgICAgfSBlbHNlIGlmICgoeCA9IHNnZXRpbml0KDAsMSkpIDwgMCkgeworCWRlYnVnKEYxMDEsIkNLQ1BSTyA8cm9wa3Q+TyBzZ2V0aW5pdCBmYWlsIiwiIix4KTsKKwlSRVNVTUU7CisgICAgfSBlbHNlIGlmICh4ID09IDApIHsKKwlkZWJ1ZyhGMTAxLCJDS0NQUk8gPHJvcGt0Pk8gc2dldGluaXQgZG9uZSIsIiIseCk7CisjaWZkZWYgQ0tTWVNMT0cKKwlpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisJICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJFWFRFTkRFRCBHRVQiLCAoY2hhciAqKXNydmNtZCk7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKwlCRUdJTiBzc2luaXQ7CisgICAgfSBlbHNlIHsJCQkJLyogT3RoZXJ3aXNlIHN0YXkgaW4gdGhpcyBzdGF0ZSAqLworCWRlYnVnKEYxMDEsIkNLQ1BSTyA8cm9wa3Q+TyBzZ2V0aW5pdCBUQkMiLCIiLHgpOworCWFjaygpOworICAgIH0KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCis8c2VydmU+RyB7CQkJCS8qIEdlbmVyaWMgc2VydmVyIGNvbW1hbmQgKi8KKyNpZm5kZWYgTk9TRVJWRVIKKyAgICBzcnZwdHIgPSBzcnZjbWQ7CQkJLyogUG9pbnQgdG8gY29tbWFuZCBidWZmZXIgKi8KKyAgICBkZWNvZGUocmRhdGFwLHB1dHNydiwwKTsJCS8qIERlY29kZSBwYWNrZXQgZGF0YSBpbnRvIGl0ICovCisgICAgcHV0c3J2KE5VTCk7CQkJLyogSW5zZXJ0IGEgY291cGxlIG51bGxzICovCisgICAgcHV0c3J2KE5VTCk7CQkJLyogZm9yIHRlcm1pbmF0aW9uICovCisgICAgaWYgKHNydmNtZFswXSkgeworCXNzdGF0ZSA9IHNydmNtZFswXTsJCS8qIFNldCByZXF1ZXN0ZWQgc3RhcnQgc3RhdGUgKi8KKwlpZiAoeF9sb2dpbiAmJiAheF9sb2dnZWQgJiYJLyogTG9naW4gcmVxdWlyZWQ/ICovCisJICAgIC8qIExvZ2luLCBMb2dvdXQsIGFuZCBIZWxwIGFyZSBhbGxvd2VkIHdoZW4gbm90IGxvZ2dlZCBpbiAqLworCSAgICBzc3RhdGUgIT0gJ0knICYmIHNzdGF0ZSAhPSAnTCcgJiYgc3N0YXRlICE9ICdIJykgeworCSAgICBlcnJwa3QoKENIQVIgKikiTG9naW4gcmVxdWlyZWQiKTsKKwkgICAgU0VSVkU7CisJfSBlbHNlIHsKKwkgICAgbmFrc3RhdGUgPSAwOwkJLyogTm93IEknbSB0aGUgc2VuZGVyLiAqLworCSAgICB3aGF0ID0gV19SRU1POwkJLyogRG9pbmcgYSBSRU1PVEUgY29tbWFuZC4gKi8KKyNpZmRlZiBTVFJFQU1JTkcKKwkgICAgaWYgKCFzdHJlYW1pbmcpCisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJICAgICAgaWYgKHRpbWludCA8IDEpCisJCXRpbWludCA9IGNoa3RpbW8ocnRpbW8sdGltZWYpOyAvKiBTd2l0Y2ggdG8gcGVyLXBhY2tldCB0aW1lciAqLworCSAgICBiaW5hcnkgPSBYWUZUX1Q7CQkvKiBTd2l0Y2ggdG8gdGV4dCBtb2RlICovCisJICAgIEJFR0lOIGdlbmVyaWM7CQkvKiBTd2l0Y2ggdG8gZ2VuZXJpYyBjb21tYW5kIHN0YXRlICovCisJfQorICAgIH0gZWxzZSB7CisJZXJycGt0KChDSEFSICopIkJhZGx5IGZvcm1lZCBzZXJ2ZXIgY29tbWFuZCIpOyAvKiByZXBvcnQgZXJyb3IgKi8KKwlSRVNVTUU7CQkJLyogJiBnbyBiYWNrIHRvIHNlcnZlciBjb21tYW5kIHdhaXQgKi8KKyAgICB9CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KK30KKworPHNlcnZlPkMgewkJCQkvKiBSZWNlaXZlIEhvc3QgY29tbWFuZCAqLworI2lmbmRlZiBOT1NFUlZFUgorICAgIGlmICh4X2xvZ2luICYmICF4X2xvZ2dlZCkgeworCWVycnBrdCgoQ0hBUiAqKSJMb2dpbiByZXF1aXJlZCIpOworCVNFUlZFOworICAgIH0gZWxzZSBpZiAoIUVOQUJMRUQoZW5faG9zKSkgeworCWVycnBrdCgoQ0hBUiAqKSJSRU1PVEUgSE9TVCBkaXNhYmxlZCIpOworCVJFU1VNRTsKKyAgICB9IGVsc2UgaWYgKG5vcHVzaCkgeworCWVycnBrdCgoQ0hBUiAqKSJIT1NUIGNvbW1hbmRzIG5vdCBhdmFpbGFibGUiKTsKKwlSRVNVTUU7CisgICAgfSBlbHNlIHsKKwlzcnZwdHIgPSBzcnZjbWQ7CQkvKiBQb2ludCB0byBjb21tYW5kIGJ1ZmZlciAqLworCWRlY29kZShyZGF0YXAscHV0c3J2LDApOwkvKiBEZWNvZGUgY29tbWFuZCBwYWNrZXQgaW50byBpdCAqLworCXB1dHNydihOVUwpOwkJCS8qIE51bGwtdGVybWluYXRlICovCisJbmFrc3RhdGUgPSAwOwkJCS8qIE5vdyBzZW5kaW5nLCBub3QgcmVjZWl2aW5nICovCisJYmluYXJ5ID0gWFlGVF9UOwkJLyogU3dpdGNoIHRvIHRleHQgbW9kZSAqLworCWlmIChzeXNjbWQoKGNoYXIgKilzcnZjbWQsIiIpKSB7IC8qIFRyeSB0byBleGVjdXRlIHRoZSBjb21tYW5kICovCisJICAgIHdoYXQgPSBXX1JFTU87CQkvKiBEb2luZyBhIFJFTU9URSBjb21tYW5kLiAqLworI2lmZGVmIFNUUkVBTUlORworCSAgICBpZiAoIXN0cmVhbWluZykKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKwkgICAgICBpZiAodGltaW50IDwgMSkKKwkJdGltaW50ID0gY2hrdGltbyhydGltbyx0aW1lZik7IC8qIFN3aXRjaCB0byBwZXItcGFja2V0IHRpbWVyICovCisjaWZkZWYgQ0tTWVNMT0cKKwkgICAgaWYgKGNreHN5c2xvZyA+PSBTWVNMR19QUiAmJiBja3hsb2dnaW5nKQorCSAgICAgIGNrc3lzbG9nKFNZU0xHX1BSLCAxLCAic2VydmVyIiwgIlJFTU9URSBIT1NUIiwgKGNoYXIgKilzcnZjbWQpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisJICAgIEJFR0lOIHNzaW5pdDsJCS8qIElmIE9LLCBzZW5kIGJhY2sgaXRzIG91dHB1dCAqLworCX0gZWxzZSB7CQkJLyogT3RoZXJ3aXNlICovCisJICAgIGVycnBrdCgoQ0hBUiAqKSJDYW4ndCBkbyBzeXN0ZW0gY29tbWFuZCIpOyAvKiByZXBvcnQgZXJyb3IgKi8KKwkgICAgUkVTVU1FOwkJCS8qICYgZ28gYmFjayB0byBzZXJ2ZXIgY29tbWFuZCB3YWl0ICovCisJfQorICAgIH0KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCis8c2VydmU+cSB7CQkJCS8qIEludGVycnVwdGVkIG9yIGNvbm5lY3Rpb24gbG9zdCAqLworICAgIHJjID0gc3J2X3RpbWVvdXQoKTsKKyAgICBkZWJ1ZyhGMTAxLCJzcnZfdGltZW91dCIsIiIscmMpOworICAgIGlmIChyYyA+IC0xKSByZXR1cm4ocmMpOwkJLyogKHNlZSBiZWxvdykgKi8KK30KKworPHNlcnZlPk4gewkJCQkvKiBTZXJ2ZXIgZ290IGEgTkFLIGluIGNvbW1hbmQtd2FpdCAqLworI2lmbmRlZiBOT1NFUlZFUgorICAgIGVycnBrdCgoQ0hBUiAqKSJEaWQgeW91IHNheSBSRUNFSVZFIGluc3RlYWQgb2YgR0VUPyIpOworICAgIFJFU1VNRTsKKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCis8c2VydmU+LiB7CQkJCS8qIEFueSBvdGhlciBjb21tYW5kIGluIHRoaXMgc3RhdGUgKi8KKyNpZm5kZWYgTk9TRVJWRVIKKyAgICBpZiAoYyAhPSAoJ0UnIC0gU1ApICYmIGMgIT0gKCdZJyAtIFNQKSkgLyogZXhjZXB0IEUgYW5kIFkgcGFja2V0cy4gKi8KKyAgICAgIGVycnBrdCgoQ0hBUiAqKSJVbmltcGxlbWVudGVkIHNlcnZlciBmdW5jdGlvbiIpOworICAgIC8qIElmIHdlIGFuc3dlciBhbiBFIHdpdGggYW4gRSwgd2UgZ2V0IGFuIGluZmluaXRlIGxvb3AuICovCisgICAgLyogQSBZIChBQ0spIGNhbiBzaG93IHVwIGhlcmUgaWYgd2Ugc2VudCBiYWNrIGEgc2hvcnQtZm9ybSByZXBseSB0byAqLworICAgIC8qIGEgRyBwYWNrZXQgYW5kIGl0IHdhcyBlY2hvZWQuICBBQ0tzIGNhbiBiZSBzYWZlbHkgaWdub3JlZCBoZXJlLiAqLworICAgIFJFU1VNRTsJCQkJLyogR28gYmFjayB0byBzZXJ2ZXIgY29tbWFuZCB3YWl0LiAqLworI2VuZGlmIC8qIE5PU0VSVkVSICovCit9CisKKzxnZW5lcmljPkkgewkJCQkvKiBMb2dpbi9PdXQgKi8KKyAgICByYyA9IHNydl9sb2dpbigpOworICAgIGRlYnVnKEYxMDEsIjxnZW5lcmljPkkgc3J2X2xvZ2luIiwiIixyYyk7CisgICAgaWYgKHJjID4gLTEpIHJldHVybihyYyk7CQkvKiAoc2VlIGJlbG93KSAqLworfQorCis8Z2VuZXJpYz5DIHsJCQkJLyogR290IFJFTU9URSBDRCBjb21tYW5kICovCisjaWZuZGVmIE5PU0VSVkVSCisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisgICAgICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJSRU1PVEUgQ0QiLCAoY2hhciAqKXNydmNtZCk7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyAgICBpZiAoIUVOQUJMRUQoZW5fY3dkKSkgeworCWVycnBrdCgoQ0hBUiAqKSJSRU1PVEUgQ0QgZGlzYWJsZWQiKTsKKwlSRVNVTUU7CisgICAgfSBlbHNlIHsKKwljaGFyICogcCA9IE5VTEw7CisJeCA9IGN3ZCgoY2hhciAqKShzcnZjbWQrMSkpOwkvKiBUcnkgdG8gY2hhbmdlIGRpcmVjdG9yeSAqLworI2lmZGVmIElLU0RCCisJaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwiUkVNT1RFIENEIiwgKGNoYXIgKikoc3J2Y21kKzIpLCAiIik7CisjZW5kaWYgLyogSUtTREIgKi8KKwlpZiAoIXgpIHsJCQkvKiBGYWlsZWQgKi8KKwkgICAgZXJycGt0KChDSEFSICopIkNhbid0IGNoYW5nZSBkaXJlY3RvcnkiKTsKKwkgICAgUkVTVU1FOwkJCS8qIEJhY2sgdG8gc2VydmVyIGNvbW1hbmQgd2FpdCAqLworCX0gZWxzZSBpZiAoeCA9PSAyKSB7CQkvKiBVc2VyIHdhbnRzIG1lc3NhZ2UgKi8KKwkgICAgaWYgKCFFTkFCTEVEKGVuX3R5cCkpIHsJLyogTWVzc2FnZXMgKFJFTU9URSBUWVBFKSBkaXNhYmxlZD8gKi8KKwkJZXJycGt0KChDSEFSICopIlJFTU9URSBUWVBFIGRpc2FibGVkIik7CisJCVJFU1VNRTsKKwkgICAgfSBlbHNlIHsJCQkvKiBUWVBFIGlzIGVuYWJsZWQgKi8KKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJICAgIGlmICh6Y2hraShjZG1zZ2ZpbGVbaV0pID4gLTEpIHsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJCWJpbmFyeSA9IFhZRlRfVDsJLyogVXNlIHRleHQgbW9kZSBmb3IgdGhpcy4gKi8KKwkJaWYgKGkgPCA4ICYmIHNuZHR5cGUoY2Rtc2dmaWxlW2ldKSkgeyAvKiBIYXZlIHJlYWRtZSBmaWxlPyAqLworCQkgICAgQkVHSU4gc3Npbml0OwkvKiBPSyAqLworCQl9IGVsc2UgewkJLyogbm90IE9LICovCisJCSAgICBwID0gemd0ZGlyKCk7CisJCSAgICBpZiAoIXApIHAgPSAiIjsKKwkJICAgIHN1Y2Nlc3MgPSAoKnApID8gMSA6IDA7CisJCSAgICBhY2sxKChDSEFSICopcCk7CS8qIEFDSyB3aXRoIG5ldyBkaXJlY3RvcnkgbmFtZSAqLworCQkgICAgc3VjY2VzcyA9IDE7CisJCSAgICBSRVNVTUU7CQkvKiB3YWl0IGZvciBuZXh0IHNlcnZlciBjb21tYW5kICovCisJCX0KKwkgICAgfQorCX0gZWxzZSB7CQkJLyogVXNlciBkb2Vzbid0IHdhbnQgbWVzc2FnZSAqLworCSAgICBwID16Z3RkaXIoKTsKKwkgICAgaWYgKCFwKSBwID0gIiI7CisJICAgIHN1Y2Nlc3MgPSAoKnApID8gMSA6IDA7CisJICAgIGFjazEoKENIQVIgKilwKTsKKwkgICAgc3VjY2VzcyA9IDE7CisJICAgIFJFU1VNRTsJCQkvKiBXYWl0IGZvciBuZXh0IHNlcnZlciBjb21tYW5kICovCisJfQorICAgIH0KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCis8Z2VuZXJpYz5BIHsJCQkJLyogR290IFJFTU9URSBQV0QgY29tbWFuZCAqLworI2lmbmRlZiBOT1NFUlZFUgorI2lmZGVmIENLU1lTTE9HCisgICAgaWYgKGNreHN5c2xvZyA+PSBTWVNMR19QUiAmJiBja3hsb2dnaW5nKQorICAgICAgY2tzeXNsb2coU1lTTEdfUFIsIDEsICJzZXJ2ZXIiLCAiUkVNT1RFIFBXRCIsIE5VTEwpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgaWYgKCFFTkFCTEVEKGVuX2N3ZCkpIHsKKwllcnJwa3QoKENIQVIgKikiUkVNT1RFIENEIGRpc2FibGVkIik7CisJUkVTVU1FOworICAgIH0gZWxzZSB7CisJaWYgKGVuY3N0cigoQ0hBUiAqKXpndGRpcigpKSA+IC0xKSB7IC8qIEVuY29kZSBjdXJyZW50IGRpcmVjdG9yeSAqLworCSAgICBhY2sxKGRhdGEpOwkJCS8qIElmIGl0IGZpdHMsIHNlbmQgaXQgYmFjayBpbiBBQ0sgKi8KKwkgICAgc3VjY2VzcyA9IDE7CisJfSBlbHNlIHsJCQkvKiBGYWlsZWQgKi8KKwkgICAgYWNrKCk7CQkJLyogU2VuZCBlbXB0eSBBQ0sgKi8KKwkgICAgc3VjY2VzcyA9IDA7CQkvKiBhbmQgaW5kaWNhdGUgZmFpbHVyZSBsb2NhbGx5ICovCisJfQorCVJFU1VNRTsJCQkJLyogQmFjayB0byBzZXJ2ZXIgY29tbWFuZCB3YWl0ICovCisgICAgfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCit9CisKKzxnZW5lcmljPkQgewkJCQkvKiBSRU1PVEUgRElSRUNUT1JZIGNvbW1hbmQgKi8KKyNpZm5kZWYgTk9TRVJWRVIKKyAgICBjaGFyICpuMjsKKyNpZmRlZiBDS1NZU0xPRworICAgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfUFIgJiYgY2t4bG9nZ2luZykKKyAgICAgIGNrc3lzbG9nKFNZU0xHX1BSLCAxLCAic2VydmVyIiwgIlJFTU9URSBESVJFQ1RPUlkiLCAoY2hhciAqKXNydmNtZCk7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyAgICBpZiAoIUVOQUJMRUQoZW5fZGlyKSkgewkJLyogSWYgRElSIGlzIGRpc2FibGVkLCAqLworCWVycnBrdCgoQ0hBUiAqKSJSRU1PVEUgRElSRUNUT1JZIGRpc2FibGVkIik7IC8qIHJlZnVzZS4gKi8KKwlSRVNVTUU7CisgICAgfSBlbHNlIHsJCQkJLyogRElSIGlzIGVuYWJsZWQuICovCisjaWZkZWYgSUtTREIKKwlpZiAoaWtkYm9wZW4pIHNsb3RzdGF0ZSh3aGF0LCJSRU1PVEUgRElSIiwgKGNoYXIgKikoc3J2Y21kKzIpLCAiIik7CisjZW5kaWYgLyogSUtTREIgKi8KKwlpZiAoIUVOQUJMRUQoZW5fY3dkKSkgewkJLyogQnV0IENXRCBpcyBkaXNhYmxlZCAqLworCSAgICB6c3RyaXAoKGNoYXIgKikoc3J2Y21kKzIpLCZuMik7IC8qIGFuZCB0aGV5IGluY2x1ZGVkIGEgcGF0aG5hbWUsICovCisJICAgIGlmIChzdHJjbXAoKGNoYXIgKikoc3J2Y21kKzIpLG4yKSkgeyAvKiBzbyByZWZ1c2UuICovCisJCWVycnBrdCgoQ0hBUiAqKSJBY2Nlc3MgZGVuaWVkIik7CisJCVJFU1VNRTsJCQkvKiBSZW1lbWJlciwgdGhpcyBpcyBub3QgYSBnb3RvISAqLworCSAgICB9CisJfQorCWlmIChzdGF0ZSA9PSBnZW5lcmljKSB7CQkJLyogSXQncyBPSyB0byBnbyBhaGVhZC4gKi8KKyNpZmRlZiBDT01NRU5UCisJICAgIG4yID0gKCooc3J2Y21kKzIpKSA/IERJUkNNRCA6IERJUkNNMjsKKwkgICAgaWYgKHN5c2NtZChuMiwoY2hhciAqKShzcnZjbWQrMikpKSAgLyogSWYgaXQgY2FuIGJlIGRvbmUgKi8KKyNlbHNlCisJICAgIGludCB4OworCSAgICBpZiAoKHggPSBzbmRkaXIoKGNoYXIqKShzcnZjbWQrMikpKSA+IDApCisjZW5kaWYgLyogQ09NTUVOVCAqLworCSAgICB7CisJCUJFR0lOIHNzaW5pdDsJCS8qIHNlbmQgdGhlIHJlc3VsdHMgYmFjazsgKi8KKwkgICAgfSBlbHNlIHsJCQkvKiBvdGhlcndpc2UgKi8KKwkJaWYgKHggPCAwKQorCQkgIGVycnBrdCgoQ0hBUiAqKSJObyBmaWxlcyBtYXRjaCIpOworCQllbHNlCisJCSAgZXJycGt0KChDSEFSICopIkNhbid0IGxpc3QgZGlyZWN0b3J5Iik7CisJCVJFU1VNRTsJCQkvKiByZXR1cm4gdG8gc2VydmVyIGNvbW1hbmQgd2FpdCAqLworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCis8Z2VuZXJpYz5FIHsJCQkJLyogUkVNT1RFIERFTEVURSAoRXJhc2UpICovCisjaWZuZGVmIE5PU0VSVkVSCisgICAgY2hhciAqbjI7CisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisgICAgICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJSRU1PVEUgREVMRVRFIiwgKGNoYXIgKilzcnZjbWQpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgaWYgKCFFTkFCTEVEKGVuX2RlbCkpIHsKKwllcnJwa3QoKENIQVIgKikiUkVNT1RFIERFTEVURSBkaXNhYmxlZCIpOworCVJFU1VNRTsKKyAgICB9IGVsc2UgewkJCQkvKiBERUxFVEUgaXMgZW5hYmxlZCAqLworI2lmZGVmIElLU0RCCisJaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwiUkVNT1RFIERFTEVURSIsIChjaGFyICopKHNydmNtZCsyKSwgIiIpOworI2VuZGlmIC8qIElLU0RCICovCisJaWYgKCFFTkFCTEVEKGVuX2N3ZCkpIHsJCS8qIGJ1dCBDV0QgaXMgZGlzYWJsZWQgKi8KKwkgICAgenN0cmlwKChjaGFyICopKHNydmNtZCsyKSwmbjIpOyAvKiBhbmQgdGhleSBpbmNsdWRlZCBhIHBhdGhuYW1lLCAqLworCSAgICBpZiAoc3RyY21wKChjaGFyICopKHNydmNtZCsyKSxuMikpIHsgLyogc28gcmVmdXNlLiAqLworCQllcnJwa3QoKENIQVIgKikiQWNjZXNzIGRlbmllZCIpOworCQlSRVNVTUU7CQkJLyogUmVtZW1iZXIsIHRoaXMgaXMgbm90IGEgZ290byEgKi8KKwkgICAgfQorCX0gZWxzZSBpZiAoaXNkaXIoKGNoYXIgKikoc3J2Y21kKzIpKSkgeyAvKiBBIGRpcmVjdG9yeSBuYW1lPyAqLworCSAgICBlcnJwa3QoKENIQVIgKikiSXQncyBhIGRpcmVjdG9yeSIpOworCSAgICBSRVNVTUU7CisJfQorCWlmIChzdGF0ZSA9PSBnZW5lcmljKSB7CQkvKiBJdCdzIE9LIHRvIGdvIGFoZWFkLiAqLworCSAgICBpbnQgeDsKKwkgICAgaWYgKCh4ID0gc25kZGVsKChjaGFyKikoc3J2Y21kKzIpKSkgPiAwKSB7CisJCUJFR0lOIHNzaW5pdDsJCS8qIElmIE9LIHNlbmQgcmVzdWx0cyBiYWNrICovCisJICAgIH0gZWxzZSB7CQkJLyogb3RoZXJ3aXNlICovCisJCWlmICh4IDwgMCkKKwkJICBlcnJwa3QoKENIQVIgKikiRmlsZSBub3QgZm91bmQiKTsgLyogcmVwb3J0IGZhaWx1cmUgKi8KKwkJZWxzZQorCQkgIGVycnBrdCgoQ0hBUiAqKSJERUxFVEUgZmFpbGVkIik7CisJCVJFU1VNRTsJCQkvKiAmIHJldHVybiB0byBzZXJ2ZXIgY29tbWFuZCB3YWl0ICovCisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCit9CisKKzxnZW5lcmljPkYgewkJCQkvKiBGSU5JU0ggKi8KKyNpZm5kZWYgTk9TRVJWRVIKKyNpZmRlZiBDS1NZU0xPRworICAgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfUFIgJiYgY2t4bG9nZ2luZykKKyAgICAgIGNrc3lzbG9nKFNZU0xHX1BSLCAxLCAic2VydmVyIiwgIkZJTklTSCIsIE5VTEwpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisjaWZkZWYgSUtTREIKKyAgICBpZiAoaWtkYm9wZW4pIHNsb3RzdGF0ZSh3aGF0LCJTRVJWRVIgRklOSVNIIiwgIiIsICIiKTsKKyNlbmRpZiAvKiBJS1NEQiAqLworICAgIGlmICghRU5BQkxFRChlbl9maW4pKSB7CisJZXJycGt0KChDSEFSICopIkZJTklTSCBkaXNhYmxlZCIpOworCVJFU1VNRTsKKyAgICB9IGVsc2UgeworCWFjaygpOwkJCQkvKiBBY2tub3dsZWRnZSAqLworCXh4c2NyZWVuKFNDUl9UQywwLDBMLCIiKTsJLyogRGlzcGxheSAqLworCXN1Y2Nlc3MgPSAxOworCXJldHVybigwKTsJCQkvKiBEb25lICovCisgICAgfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCit9CisKKzxnZW5lcmljPlggewkJCQkvKiBFWElUICovCisjaWZuZGVmIE5PU0VSVkVSCisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisgICAgICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJSRU1PVEUgRVhJVCIsIE5VTEwpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisjaWZkZWYgSUtTREIKKyAgICBpZiAoaWtkYm9wZW4pIHNsb3RzdGF0ZSh3aGF0LCJSRU1PVEUgRVhJVCIsICIiLCAiIik7CisjZW5kaWYgLyogSUtTREIgKi8KKyAgICBpZiAoIUVOQUJMRUQoZW5feGl0KSkgeworCWVycnBrdCgoQ0hBUiAqKSJFWElUIGRpc2FibGVkIik7CisJUkVTVU1FOworICAgIH0gZWxzZSB7CisJYWNrKCk7CQkJCS8qIEFja25vd2xlZGdlICovCisJeHhzY3JlZW4oU0NSX1RDLDAsMEwsIiIpOwkvKiBEaXNwbGF5ICovCisJZG9leGl0KEdPT0RfRVhJVCx4aXRzdGEpOworICAgIH0KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCis8Z2VuZXJpYz5MIHsJCQkJLyogQllFIChMb2dvdXQpICovCisjaWZuZGVmIE5PU0VSVkVSCisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisgICAgICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJCWUUiLCBOVUxMKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworI2lmZGVmIElLU0RCCisgICAgaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwiU0VSVkVSIEJZRSIsICIiLCAiIik7CisjZW5kaWYgLyogSUtTREIgKi8KKyAgICBpZiAoIUVOQUJMRUQoZW5fYnllKSkgeworCWVycnBrdCgoQ0hBUiAqKSJCWUUgZGlzYWJsZWQiKTsKKwlSRVNVTUU7CisgICAgfSBlbHNlIHsKKwlhY2soKTsJCQkJLyogQWNrbm93bGVkZ2UgKi8KKwlzdWNjZXNzID0gMTsKKwltc2xlZXAoNzUwKTsJCQkvKiBHaXZlIHRoZSBBQ0sgdGltZSB0byBnZXQgb3V0ICovCisJaWYgKGxvY2FsKQorCSAgdHRyZXMoKTsJCQkvKiBSZXNldCB0aGUgdGVybWluYWwgKi8KKwl4eHNjcmVlbihTQ1JfVEMsMCwwTCwiIik7CS8qIERpc3BsYXkgKi8KKwlkb2NsZWFuKDEpOwkJCS8qIENsZWFuIHVwIGZpbGVzLCBldGMgKi8KKyNpZmRlZiBERUJVRworCWRlYnVnKEYxMDAsIkMtS2VybWl0IEJZRSAtIExvZ2dpbiBvdXQuLi4iLCIiLDApOworCXpjbG9zZShaREZJTEUpOworI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgSUtTRAorI2lmZGVmIENLX0xPR0lOCisJaWYgKGluc2VydmVyKQorCSAgY2t4bG9nb3V0KCk7CisJZWxzZQorI2VuZGlmIC8qIENLX0xPR0lOICovCisjZW5kaWYgLyogSUtTRCAqLworI2lmZGVmIFRDUFNPQ0tFVAorI2lmbmRlZiBOT0xJU1RFTgorCSAgaWYgKG5ldHdvcmsgJiYgdGNwc3JmZCA+IDAgJiYgIWluc2VydmVyKQorCSAgICBkb2V4aXQoR09PRF9FWElULHhpdHN0YSk7CisJZWxzZQorI2VuZGlmIC8qIE5PTElTVEVOICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisJICByZXR1cm4oemtzZWxmKCkpOwkJLyogVHJ5IHRvIGxvZyBzZWxmIG91dCAqLworICAgIH0KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCis8Z2VuZXJpYz5IIHsJCQkJLyogUkVNT1RFIEhFTFAgKi8KKyNpZmRlZiBDS1NZU0xPRworICAgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfUFIgJiYgY2t4bG9nZ2luZykKKyAgICAgIGNrc3lzbG9nKFNZU0xHX1BSLCAxLCAic2VydmVyIiwgIlJFTU9URSBIRUxQIiwgTlVMTCk7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyNpZmRlZiBJS1NEQgorICAgIGlmIChpa2Rib3Blbikgc2xvdHN0YXRlKHdoYXQsIlJFTU9URSBIRUxQIiwgIiIsICIiKTsKKyNlbmRpZiAvKiBJS1NEQiAqLworI2lmbmRlZiBOT1NFUlZFUgorICAgIGlmIChzbmRobHAoTlVMTCkpIHsKKwlCRUdJTiBzc2luaXQ7CQkJLyogdHJ5IHRvIHNlbmQgaXQgKi8KKyAgICB9IGVsc2UgewkJCQkvKiBJZiBub3Qgb2ssICovCisJZXJycGt0KChDSEFSICopIkNhbid0IHNlbmQgaGVscCIpOyAvKiBzZW5kIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCAqLworCVJFU1VNRTsJCQkJLyogYW5kIHJldHVybiB0byBzZXJ2ZXIgY29tbWFuZCB3YWl0ICovCisgICAgfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCit9CisKKzxnZW5lcmljPlIgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRU1PVEUgUkVOQU1FICovCisgICAgcmMgPSBzcnZfcmVuYW1lKCk7CisgICAgZGVidWcoRjEwMSwic3J2X3JlbmFtZSIsIiIscmMpOworICAgIGlmIChyYyA+IC0xKSByZXR1cm4ocmMpOwkJLyogKHNlZSBiZWxvdykgKi8KK30KKworPGdlbmVyaWM+SyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFTU9URSBDT1BZICovCisgICAgcmMgPSBzcnZfY29weSgpOworICAgIGRlYnVnKEYxMDEsInNydl9jb3B5IiwiIixyYyk7CisgICAgaWYgKHJjID4gLTEpIHJldHVybihyYyk7CQkvKiAoc2VlIGJlbG93KSAqLworfQorCis8Z2VuZXJpYz5TIHsJCQkJLyogUkVNT1RFIFNFVCAqLworI2lmZGVmIENLU1lTTE9HCisgICAgaWYgKGNreHN5c2xvZyA+PSBTWVNMR19QUiAmJiBja3hsb2dnaW5nKQorICAgICAgY2tzeXNsb2coU1lTTEdfUFIsIDEsICJzZXJ2ZXIiLCAiUkVNT1RFIFNFVCIsIChjaGFyICopc3J2Y21kKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworI2lmbmRlZiBOT1NFUlZFUgorI2lmZGVmIElLU0RCCisgICAgaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwiUkVNT1RFIFNFVCIsIChjaGFyICopKHNydmNtZCsxKSwgIiIpOworI2VuZGlmIC8qIElLU0RCICovCisgICAgaWYgKCFFTkFCTEVEKGVuX3NldCkpIHsKKwllcnJwa3QoKENIQVIgKikiUkVNT1RFIFNFVCBkaXNhYmxlZCIpOworCVJFU1VNRTsKKyAgICB9IGVsc2UgeworCWlmIChyZW1zZXQoKGNoYXIgKikoc3J2Y21kKzEpKSkgeyAvKiBUcnkgdG8gZG8gd2hhdCB0aGV5IGFzayAqLworCSAgICBzdWNjZXNzID0gMTsKKwkgICAgYWNrKCk7CQkJLyogSWYgT0ssIHRoZW4gYWNrbm93bGVkZ2UgKi8KKwl9IGVsc2UJCQkJLyogT3RoZXJ3aXNlICovCisJICBlcnJwa3QoKENIQVIgKikiVW5rbm93biBSRU1PVEUgU0VUIHBhcmFtZXRlciIpOyAvKiBnaXZlIGVycm9yIG1zZyAqLworCVJFU1VNRTsJCQkJLyogUmV0dXJuIHRvIHNlcnZlciBjb21tYW5kIHdhaXQgKi8KKyAgICB9CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KK30KKworPGdlbmVyaWM+VCB7CQkJCS8qIFJFTU9URSBUWVBFICovCisjaWZuZGVmIE5PU0VSVkVSCisgICAgY2hhciAqbjI7CisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisgICAgICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJSRU1PVEUgVFlQRSIsIChjaGFyICopc3J2Y21kKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgIGlmICghRU5BQkxFRChlbl90eXApKSB7CisJZXJycGt0KChDSEFSICopIlJFTU9URSBUWVBFIGRpc2FibGVkIik7CisJUkVTVU1FOworICAgIH0gZWxzZSB7CisjaWZkZWYgSUtTREIKKwlpZiAoaWtkYm9wZW4pIHNsb3RzdGF0ZSh3aGF0LCJSRU1PVEUgVFlQRSIsIChjaGFyICopKHNydmNtZCsyKSwgIiIpOworI2VuZGlmIC8qIElLU0RCICovCisJaWYgKCFFTkFCTEVEKGVuX2N3ZCkpIHsJCS8qIElmIENXRCBkaXNhYmxlZCAqLworCSAgICB6c3RyaXAoKGNoYXIgKikoc3J2Y21kKzIpLCZuMik7IC8qIGFuZCB0aGV5IGluY2x1ZGVkIGEgcGF0aG5hbWUsICovCisJICAgIGlmIChzdHJjbXAoKGNoYXIgKikoc3J2Y21kKzIpLG4yKSkgeyAvKiByZWZ1c2UuICovCisJCWVycnBrdCgoQ0hBUiAqKSJBY2Nlc3MgZGVuaWVkIik7CisJCVJFU1VNRTsJCQkvKiBSZW1lbWJlciwgdGhpcyBpcyBub3QgYSBnb3RvISAqLworCSAgICB9CisJfQorCWlmIChzdGF0ZSA9PSBnZW5lcmljKSB7CQkvKiBJdCdzIE9LIHRvIGdvIGFoZWFkLiAqLworCSAgICBiaW5hcnkgPSBYWUZUX1Q7CQkvKiBVc2UgdGV4dCBtb2RlIGZvciB0aGlzLiAqLworCSAgICBpZiAoCQkJLyogKFJFU1VNRSBkaWRuJ3QgY2hhbmdlIHN0YXRlKSAqLworI2lmZGVmIENPTU1FTlQKKwkgICAgICBzeXNjbWQoVFlQQ01ELChjaGFyICopKHNydmNtZCsyKSkJLyogT2xkIHdheSAqLworI2Vsc2UKKwkgICAgICBzbmR0eXBlKChjaGFyICopKHNydmNtZCsyKSkgLyogTmV3IHdheSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkJKQorCSAgICAgIEJFR0lOIHNzaW5pdDsJCS8qIE9LICovCisJICAgIGVsc2UgewkJCS8qIG5vdCBPSyAqLworCQllcnJwa3QoKENIQVIgKikiQ2FuJ3QgdHlwZSBmaWxlIik7IC8qIGdpdmUgZXJyb3IgbWVzc2FnZSAqLworCQlSRVNVTUU7CQkJLyogd2FpdCBmb3IgbmV4dCBzZXJ2ZXIgY29tbWFuZCAqLworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCis8Z2VuZXJpYz5tIHsJCQkJLyogUkVNT1RFIE1LRElSICovCisjaWZuZGVmIE5PU0VSVkVSCisjaWZkZWYgQ0tfTUtESVIKKyNpZmRlZiBDS1NZU0xPRworICAgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfUFIgJiYgY2t4bG9nZ2luZykKKyAgICAgIGNrc3lzbG9nKFNZU0xHX1BSLCAxLCAic2VydmVyIiwgIlJFTU9URSBNS0RJUiIsIChjaGFyICopc3J2Y21kKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworI2lmZGVmIElLU0RCCisgICAgaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwiUkVNT1RFIE1LRElSIiwgKGNoYXIgKikoc3J2Y21kKzIpLCAiIik7CisjZW5kaWYgLyogSUtTREIgKi8KKyAgICBpZiAoIUVOQUJMRUQoZW5fbWtkKSkgeworCWVycnBrdCgoQ0hBUiAqKSJSRU1PVEUgTUtESVIgZGlzYWJsZWQiKTsKKwlSRVNVTUU7CisgICAgfSBlbHNlIGlmICghRU5BQkxFRChlbl9jd2QpKSB7CS8qIElmIENXRCBkaXNhYmxlZCAqLworCWVycnBrdCgoQ0hBUiAqKSJEaXJlY3RvcnkgYWNjZXNzIHJlc3RyaWN0ZWQiKTsKKwlSRVNVTUU7CQkJCS8qIFJlbWVtYmVyLCB0aGlzIGlzIG5vdCBhIGdvdG8hICovCisgICAgfQorICAgIGlmIChzdGF0ZSA9PSBnZW5lcmljKSB7CQkvKiBPSyB0byBnbyBhaGVhZC4gKi8KKwljaGFyICpwID0gTlVMTDsKKwl4ID0gY2tta2RpcigwLChjaGFyICopKHNydmNtZCsyKSwmcCwwLDEpOyAvKiBNYWtlIHRoZSBkaXJlY3RvcnkgKi8KKwlpZiAoIXApIHAgPSAiIjsKKwlpZiAoeCA+IC0xKSB7CisJICAgIGVuY3N0cigoQ0hBUiAqKXApOwkJLyogT0sgLSBlbmNvZGUgdGhlIG5hbWUgKi8KKwkgICAgYWNrMShkYXRhKTsJCQkvKiBTZW5kIHNob3J0LWZvcm0gcmVzcG9uc2UgKi8KKwkgICAgc3VjY2VzcyA9IDE7CisJICAgIFJFU1VNRTsKKwl9IGVsc2UgewkJCS8qIG5vdCBPSyAqLworCSAgICBpZiAoISpwKSBwID0gIkRpcmVjdG9yeSBjcmVhdGlvbiBmYWlsdXJlIjsKKwkgICAgZXJycGt0KChDSEFSICopcCk7CQkvKiBnaXZlIGVycm9yIG1lc3NhZ2UgKi8KKwkgICAgUkVTVU1FOwkJCS8qIFdhaXQgZm9yIG5leHQgc2VydmVyIGNvbW1hbmQgKi8KKwl9CisgICAgfQorI2Vsc2UKKyAgICBlcnJwa3QoKENIQVIgKikiUkVNT1RFIE1LRElSIG5vdCBhdmFpbGFibGUiKTsKKyAgICBSRVNVTUU7CisjZW5kaWYgLyogQ0tfTUtESVIgKi8KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCis8Z2VuZXJpYz5kIHsJCQkJLyogUkVNT1RFIFJNRElSICovCisjaWZuZGVmIE5PU0VSVkVSCisjaWZkZWYgQ0tfTUtESVIKKyNpZmRlZiBDS1NZU0xPRworICAgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfUFIgJiYgY2t4bG9nZ2luZykKKyAgICAgIGNrc3lzbG9nKFNZU0xHX1BSLCAxLCAic2VydmVyIiwgIlJFTU9URSBSTURJUiIsIChjaGFyICopc3J2Y21kKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworI2lmZGVmIElLU0RCCisgICAgaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwiUkVNT1RFIFJNRElSIiwgKGNoYXIgKikoc3J2Y21kKzIpLCAiIik7CisjZW5kaWYgLyogSUtTREIgKi8KKyAgICBpZiAoIUVOQUJMRUQoZW5fcm1kKSkgeworCWVycnBrdCgoQ0hBUiAqKSJSRU1PVEUgUk1ESVIgZGlzYWJsZWQiKTsKKwlSRVNVTUU7CisgICAgfSBlbHNlIGlmICghRU5BQkxFRChlbl9jd2QpKSB7CS8qIElmIENXRCBkaXNhYmxlZCAqLworCWVycnBrdCgoQ0hBUiAqKSJEaXJlY3RvcnkgYWNjZXNzIHJlc3RyaWN0ZWQiKTsKKwlSRVNVTUU7CQkJCS8qIFJlbWVtYmVyLCB0aGlzIGlzIG5vdCBhIGdvdG8hICovCisgICAgfQorICAgIGlmIChzdGF0ZSA9PSBnZW5lcmljKSB7CQkvKiBPSyB0byBnbyBhaGVhZC4gKi8KKwljaGFyICpwID0gTlVMTDsKKwl4ID0gY2tta2RpcigxLChjaGFyICopKHNydmNtZCsyKSwmcCwwLDEpOworCWlmICghcCkgcCA9ICIiOworCWlmICh4ID4gLTEpIHsKKwkgICAgZW5jc3RyKChDSEFSICopcCk7CQkvKiBPSyAtIGVuY29kZSB0aGUgbmFtZSAqLworCSAgICBhY2sxKGRhdGEpOwkJCS8qIFNlbmQgc2hvcnQtZm9ybSByZXNwb25zZSAqLworCSAgICBzdWNjZXNzID0gMTsKKwkgICAgUkVTVU1FOworCX0gZWxzZSB7CQkJLyogbm90IE9LICovCisJICAgIGlmICghKnApIHAgPSAiRGlyZWN0b3J5IHJlbW92YWwgZmFpbHVyZSI7CisJICAgIGVycnBrdCgoQ0hBUiAqKXApOwkJLyogZ2l2ZSBlcnJvciBtZXNzYWdlICovCisJICAgIFJFU1VNRTsJCQkvKiBXYWl0IGZvciBuZXh0IHNlcnZlciBjb21tYW5kICovCisJfQorICAgIH0KKyNlbHNlCisgICAgZXJycGt0KChDSEFSICopIlJFTU9URSBSTURJUiBub3QgYXZhaWxhYmxlIik7CisgICAgUkVTVU1FOworI2VuZGlmIC8qIENLX01LRElSICovCisjZW5kaWYgLyogTk9TRVJWRVIgKi8KK30KKworPGdlbmVyaWM+VSB7CQkJCS8qIFJFTU9URSBTUEFDRSAqLworI2lmbmRlZiBOT1NFUlZFUgorI2lmZGVmIENLU1lTTE9HCisgICAgaWYgKGNreHN5c2xvZyA+PSBTWVNMR19QUiAmJiBja3hsb2dnaW5nKQorICAgICAgY2tzeXNsb2coU1lTTEdfUFIsIDEsICJzZXJ2ZXIiLCAiUkVNT1RFIFNQQUNFIiwgKGNoYXIgKilzcnZjbWQpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgaWYgKCFFTkFCTEVEKGVuX3NwYSkpIHsKKwllcnJwa3QoKENIQVIgKikiUkVNT1RFIFNQQUNFIGRpc2FibGVkIik7CisJUkVTVU1FOworICAgIH0gZWxzZSB7CisJeCA9IHNydmNtZFsxXTsJCQkvKiBHZXQgYXJlYSB0byBjaGVjayAqLworCXggPSAoKHggPT0gTlVMKSB8fCAoeCA9PSBTUCkKKyNpZmRlZiBPUzIKKwkgICAgIHx8ICh4ID09ICchJykgfHwgKHNydmNtZFszXSA9PSAnOicpCisjZW5kaWYgLyogT1MyICovCisJICAgICApOworI2lmZGVmIElLU0RCCisJaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwKKwkJCSAgICAgICJSRU1PVEUgU1BBQ0UiLAorCQkJICAgICAgKHggPyAiIiA6IChjaGFyICopc3J2Y21kKSwKKwkJCSAgICAgICIiCisJCQkgICAgICApOworI2VuZGlmIC8qIElLU0RCICovCisJaWYgKCF4ICYmICFFTkFCTEVEKGVuX2N3ZCkpIHsJLyogQ1dEIGRpc2FibGVkICovCisJICAgIGVycnBrdCgoQ0hBUiAqKSJBY2Nlc3MgZGVuaWVkIik7IC8qIGFuZCBub24tZGVmYXVsdCBhcmVhIGdpdmVuLCAqLworCSAgICBSRVNVTUU7CQkJLyogcmVmdXNlLiAqLworCX0gZWxzZSB7CisjaWZkZWYgT1MyCitfUFJPVE9UWVAoaW50IHNuZHNwYWNlLChpbnQpKTsKKwkgICAgaWYgKHNuZHNwYWNlKHggPyB0b3VwcGVyKHNydmNtZFsyXSkgOiAwKSkgeworCQlCRUdJTiBzc2luaXQ7CQkvKiBzZW5kIHRoZSByZXBvcnQuICovCisJICAgIH0gZWxzZSB7CQkJLyogSWYgbm90IG9rLCAqLworCQllcnJwa3QoKENIQVIgKikiQ2FuJ3Qgc2VuZCBzcGFjZSIpOyAvKiBzZW5kIGVycm9yIG1lc3NhZ2UgKi8KKwkJUkVTVU1FOwkJCS8qIGFuZCByZXR1cm4gdG8gc2VydmVyIGNvbW1hbmQgd2FpdCAqLworCSAgICB9CisjZWxzZQorICAgICAgICAgICAgaWYgKG5vcHVzaCkKKyAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHggPSAoeCA/IHN5c2NtZChTUEFDTUQsIiIpIDogc3lzY21kKFNQQUNNMiwoY2hhciAqKShzcnZjbWQrMikpKTsKKwkgICAgaWYgKHgpIHsJCQkvKiBJZiB3ZSBnb3QgdGhlIGluZm8gKi8KKwkJQkVHSU4gc3Npbml0OwkJLyogc2VuZCBpdCAqLworCSAgICB9IGVsc2UgewkJCS8qIG90aGVyd2lzZSAqLworCQllcnJwa3QoKENIQVIgKikiQ2FuJ3QgY2hlY2sgc3BhY2UiKTsgLyogc2VuZCBlcnJvciBtZXNzYWdlICovCisJCVJFU1VNRTsJCQkvKiBhbmQgYXdhaXQgbmV4dCBzZXJ2ZXIgY29tbWFuZCAqLworCSAgICB9CisjZW5kaWYgLyogT1MyICovCisJfQorICAgIH0KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCis8Z2VuZXJpYz5XIHsJCQkJLyogUkVNT1RFIFdITyAqLworI2lmbmRlZiBOT1NFUlZFUgorI2lmZGVmIENLU1lTTE9HCisgICAgaWYgKGNreHN5c2xvZyA+PSBTWVNMR19QUiAmJiBja3hsb2dnaW5nKQorICAgICAgY2tzeXNsb2coU1lTTEdfUFIsIDEsICJzZXJ2ZXIiLCAiUkVNT1RFIFdITyIsIChjaGFyICopc3J2Y21kKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworI2lmZGVmIElLU0RCCisgICAgaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwiUkVNT1RFIFdITyIsIChjaGFyICopKHNydmNtZCsyKSwgIiIpOworI2VuZGlmIC8qIElLU0RCICovCisgICAgaWYgKCFFTkFCTEVEKGVuX3dobykpIHsKKwllcnJwa3QoKENIQVIgKikiUkVNT1RFIFdITyBkaXNhYmxlZCIpOworCVJFU1VNRTsKKyAgICB9IGVsc2UgeworI2lmZGVmIE9TMgorX1BST1RPVFlQKGludCBzbmR3aG8sKGNoYXIgKikpOworCSAgICBpZiAoc25kd2hvKChjaGFyICopKHNydmNtZCsyKSkpIHsKKwkJQkVHSU4gc3Npbml0OwkJLyogdHJ5IHRvIHNlbmQgaXQgKi8KKwkgICAgfSBlbHNlIHsJCQkvKiBJZiBub3Qgb2ssICovCisJCWVycnBrdCgoQ0hBUiAqKSJDYW4ndCBkbyB3aG8gY29tbWFuZCIpOyAvKiBzZW5kIGVycm9yIG1zZyAqLworCQlSRVNVTUU7CQkJLyogYW5kIHJldHVybiB0byBzZXJ2ZXIgY29tbWFuZCB3YWl0ICovCisJICAgIH0KKyNlbHNlCisJaWYgKHN5c2NtZChXSE9DTUQsKGNoYXIgKikoc3J2Y21kKzIpKSkgeworCSAgICBCRUdJTiBzc2luaXQ7CisJfSBlbHNlIHsKKwkgICAgZXJycGt0KChDSEFSICopIkNhbid0IGRvIHdobyBjb21tYW5kIik7CisJICAgIFJFU1VNRTsKKwl9CisjZW5kaWYgLyogT1MyICovCisgICAgfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCit9CisKKzxnZW5lcmljPlYgewkJCQkvKiBWYXJpYWJsZSBxdWVyeSBvciBzZXQgKi8KKyAgICByYyA9IHNydl9xdWVyeSgpOworICAgIGRlYnVnKEYxMDEsInNydl9xdWVyeSIsIiIscmMpOworICAgIGlmIChyYyA+IC0xKSByZXR1cm4ocmMpOworfQorCis8Z2VuZXJpYz5xIHsJCQkJLyogSW50ZXJydXB0ZWQgb3IgY29ubmVjdGlvbiBsb3N0ICovCisjaWZuZGVmIE5PU0VSVkVSCisgICAgaWYgKGZhdGFsaW8pIHsJCQkvKiBDb25uZWN0aW9uIGxvc3QgKi8KKyNpZmRlZiBDS1NZU0xPRworCWlmIChja3hzeXNsb2cgPj0gU1lTTEdfUFIgJiYgY2t4bG9nZ2luZykKKwkgIGNrc3lzbG9nKFNZU0xHX1BSLCAxLCAic2VydmVyIiwgIkludGVycnVwdGVkIiwgTlVMTCk7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKwlzdWNjZXNzID0gMDsKKwl4aXRzdGEgfD0gKHdoYXQgJiBXX0tFUk1JVCk7CisJUVVJVDsKKyAgICB9IGVsc2UgaWYgKGludGVycnVwdGVkKSB7CisJaWYgKCFFTkFCTEVEKGVuX2ZpbikpIHsJCS8qIEN0cmwtQyB0eXBlZCAqLworCSAgICBlcnJwa3QoKENIQVIgKikiUVVJVCBkaXNhYmxlZCIpOworCSAgICBSRVNVTUU7CisJfSBlbHNlIHsKKyNpZmRlZiBDS1NZU0xPRworCSAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisJICAgICAgY2tzeXNsb2coU1lTTEdfUFIsIDEsICJzZXJ2ZXIiLCAiSW50ZXJydXB0ZWQiLCBOVUxMKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworCSAgICBzdWNjZXNzID0gMDsKKwkgICAgeGl0c3RhIHw9ICh3aGF0ICYgV19LRVJNSVQpOworCSAgICBRVUlUOworCX0KKyAgICB9IGVsc2UgewkJCQkvKiBTaG91bGRuJ3QgaGFwcGVuICovCisJZGVidWcoRjEwMCwiU0VSVkVSIChnZW5lcmljKSBHT1QgVU5FWFBFQ1RFRCAncSciLCIiLDApOworCVFVSVQ7CisgICAgfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCit9CisKKzxnZW5lcmljPi4gewkJCQkvKiBBbnl0aGluZyBlbHNlIGluIHRoaXMgc3RhdGUuLi4gKi8KKyNpZm5kZWYgTk9TRVJWRVIKKyAgICBlcnJwa3QoKENIQVIgKikiVW5pbXBsZW1lbnRlZCBSRU1PVEUgY29tbWFuZCIpOyAvKiBDb21wbGFpbiAqLworICAgIFJFU1VNRTsJCQkJLyogYW5kIHJldHVybiB0byBzZXJ2ZXIgY29tbWFuZCB3YWl0ICovCisjZW5kaWYgLyogTk9TRVJWRVIgKi8KK30KKworPHJnZW4+cSB7CQkJCS8qIFNlbnQgQllFIGFuZCBjb25uZWN0aW9uIGJyb2tlbiAqLworICAgIGlmIChieWVfYWN0aXZlICYmIHR0Y2hrKCkgPCAwKSB7CisJbXNsZWVwKDUwMCk7CisJYnllX2FjdGl2ZSA9IDA7CisJdHRjbG9zKDApOwkJCS8qIENsb3NlIG91ciBlbmQgb2YgdGhlIGNvbm5lY3Rpb24gKi8KKwljbHNvZigwKTsKKwlyZXR1cm4oc3VjY2VzcyA9IDEpOworICAgIH0gZWxzZSB7CQkJCS8qIE90aGVyIGdlbmVyaWMgY29tbWFuZCAqLworCXJldHVybihzdWNjZXNzID0gMCk7CQkvKiBvciBjb25uZWN0aW9uIG5vdCBicm9rZW4gKi8KKyAgICB9Cit9CisKKzxyZ2VuPlkgewkJCQkvKiBTaG9ydC1Gb3JtIHJlcGx5ICovCisgICAgcmMgPSByY3Zfc2hvcnRyZXBseSgpOworICAgIGRlYnVnKEYxMDEsIjxyZ2VuPlkgcmN2X3Nob3J0cmVwbHkiLCIiLHJjKTsKKyAgICBpZiAocmMgPiAtMSkgcmV0dXJuKHJjKTsKK30KKworPHJnZW4scmZpbGU+RiB7CQkJCS8qIEZpbGUgaGVhZGVyICovCisgICAgLyogY2hhciAqbjI7ICovCisgICAgZXh0ZXJuIGludCByc247CisgICAgZGVidWcoRjEwMSwiPHJmaWxlPkYgd2lubG8gMSIsIiIsd2lubG8pOworICAgIHhmbGcgPSAwOwkJCQkvKiBOb3Qgc2NyZWVuIGRhdGEgKi8KKyAgICBpZiAoIWN6c2VlbikKKyAgICAgIGNhbmNlbCA9IDA7CQkJLyogUmVzZXQgY2FuY2VsbGF0aW9uIGNvdW50ZXIgKi8KKyNpZmRlZiBDQUxJQlJBVEUKKyAgICBpZiAoZGVzdCA9PSBERVNUX04pCisgICAgICBjYWxpYnJhdGUgPSAxOworI2VuZGlmIC8qIENBTElCUkFURSAqLworICAgIGlmICghcmN2ZmlsKGZpbG5hbSkpIHsJCS8qIEZpZ3VyZSBvdXQgbG9jYWwgZmlsZW5hbWUgKi8KKwllcnJwa3QoKENIQVIgKilyZl9lcnIpOwkJLyogVHJvdWJsZSAqLworCVJFU1VNRTsKKyAgICB9IGVsc2UgewkJCQkvKiBSZWFsIGZpbGUsIE9LIHRvIHJlY2VpdmUgKi8KKwljaGFyICogZm5wOworCWRlYnVnKEYxMTEsIjxyZmlsZT5GIHdpbmxvIDIiLGZzcGVjLHdpbmxvKTsKKwlpZiAoZmlsY250ID09IDEpCQkvKiByY3ZmaWwgc2V0IHRoaXMgdG8gMSBmb3IgMXN0IGZpbGUgKi8KKwkgIGNyYzE2ID0gMEw7CQkJLyogQ2xlYXIgZmlsZSBDUkMgKi8KKwlmbnAgPSBmc3BlYzsJCQkvKiBUaGlzIGlzIHRoZSBmdWxsIHBhdGggKi8KKwlpZiAoc2VydmVyICYmICFFTkFCTEVEKGVuX2N3ZCkgfHwgLyogaWYgRElTQUJMRSBDRCAqLworCSAgICAhZmFja3BhdGgJCQkgIC8qIG9yIEYtQUNLLVBBVEggT0ZGICovCisJICAgICkgeworCSAgICB6c3RyaXAoZnNwZWMsJmZucCk7CQkvKiBkb24ndCBzZW5kIGJhY2sgZnVsbCBwYXRoICovCisJfQorCWVuY3N0cigoQ0hBUiAqKWZucCk7CisJaWYgKGZhY2tidWcpCisJICBhY2soKTsKKwllbHNlCisJICBhY2sxKGRhdGEpOwkJCS8qIFNlbmQgaXQgYmFjayBpbiBBQ0sgKi8KKwlpbml0YXR0cigmaWF0dHIpOwkJLyogQ2xlYXIgZmlsZSBhdHRyaWJ1dGUgc3RydWN0dXJlICovCisJc3RyZWFtb24oKTsKKwlpZiAod2luZG93KHdzbG90bikgPCAwKSB7CS8qIEFsbG9jYXRlIG5lZ290aWF0ZWQgd2luZG93IHNsb3RzICovCisJICAgIGVycnBrdCgoQ0hBUiAqKSJDYW4ndCBvcGVuIHdpbmRvdyIpOworCSAgICBSRVNVTUU7CisJfQorI2lmZGVmIElLU0RCCisJaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwKKwkJCSAgICAgIHNlcnZlciA/ICJTRVJWRVIiIDogIiIsCisJCQkgICAgICAiUkVDRUlWRSIsCisJCQkgICAgICBmc3BlYworCQkJICAgICAgKTsKKyNlbmRpZiAvKiBJS1NEQiAqLworCUJFR0lOIHJhdHRyOwkJCS8qIE5vdyBleHBlY3QgQXR0cmlidXRlIHBhY2tldHMgKi8KKyAgICB9Cit9CisKKzxyZ2VuLHJmaWxlPlggewkJCQkvKiBYLXBhY2tldCBpbnN0ZWFkIG9mIGZpbGUgaGVhZGVyICovCisgICAgeGZsZyA9IDE7CQkJCS8qIFNjcmVlbiBkYXRhICovCisgICAgaWYgKCFjenNlZW4pCisgICAgICBjYW5jZWwgPSAwOwkJCS8qIFJlc2V0IGNhbmNlbGxhdGlvbiBjb3VudGVyICovCisgICAgYWNrKCk7CQkJCS8qIEFja25vd2xlZGdlIHRoZSBYLXBhY2tldCAqLworICAgIGluaXRhdHRyKCZpYXR0cik7CQkJLyogSW5pdGlhbGl6ZSBhdHRyaWJ1dGUgc3RydWN0dXJlICovCisgICAgc3RyZWFtb24oKTsKKyAgICBpZiAod2luZG93KHdzbG90bikgPCAwKSB7CQkvKiBhbGxvY2F0ZSBuZWdvdGlhdGVkIHdpbmRvdyBzbG90cyAqLworCWVycnBrdCgoQ0hBUiAqKSJDYW4ndCBvcGVuIHdpbmRvdyIpOworCVJFU1VNRTsKKyAgICB9CisjaWZuZGVmIE5PU1BMCisgICAgaWYgKHF1ZXJ5KSB7CQkJLyogSWYgdGhpcyBpcyB0aGUgcmVzcG9uc2UgdG8gKi8KKwlxYnVmcCA9IHF1ZXJ5YnVmOwkJLyogYSBxdWVyeSB0aGF0IHdlIHNlbnQsIGluaXRpYWxpemUgKi8KKwlxYnVmbiA9IDA7CQkJLyogdGhlIHJlc3BvbnNlIGJ1ZmZlciAqLworCXF1ZXJ5YnVmWzBdID0gTlVMOworICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHdoYXQgPSBXX1JFTU87CQkJLyogd2UncmUgZG9pbmcgYSBSRU1PVEUgY29tbWFuZCAqLworI2lmZGVmIElLU0RCCisgICAgaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwKKwkJCSAgc2VydmVyID8gIlNFUlZFUiIgOiAiIiwKKwkJCSAgIlJFQ0VJVkUiLAorCQkJICBmc3BlYworCQkJICApOworI2VuZGlmIC8qIElLU0RCICovCisgICAgQkVHSU4gcmF0dHI7CQkJLyogRXhwZWN0IEF0dHJpYnV0ZSBwYWNrZXRzICovCit9CisKKzxyYXR0cj5BIHsJCQkJLyogQXR0cmlidXRlIHBhY2tldCAqLworICAgIGlmIChnYXR0cihyZGF0YXAsJmlhdHRyKSA9PSAwKSB7CS8qIFJlYWQgaW50byBhdHRyaWJ1dGUgc3RydWN0dXJlICovCisjaWZkZWYgQ0tfUkVTRU5ECisJYWNrMSgoQ0hBUiAqKWlhdHRyLnJlcGx5LnZhbCk7CS8qIFJlcGx5IHdpdGggZGF0YSAqLworI2Vsc2UKKwlhY2soKTsJCQkJLyogSWYgT0ssIGFja25vd2xlZGdlICovCisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisgICAgfSBlbHNlIHsJCQkJLyogT3RoZXJ3aXNlICovCisJZXh0ZXJuIGxvbmcgZnNpemU7CisJY2hhciAqcjsKKwlyID0gZ2V0cmVhc29uKGlhdHRyLnJlcGx5LnZhbCk7CisJYWNrMSgoQ0hBUiAqKWlhdHRyLnJlcGx5LnZhbCk7CS8qIHJlZnVzZSB0byBhY2NlcHQgdGhlIGZpbGUgKi8KKwl4eHNjcmVlbihTQ1JfU1QsU1RfUkVGVSwwTCxyKTsJLyogcmVhc29uICovCisjaWZkZWYgVExPRworCWlmICh0cmFsb2cgJiYgIXRsb2dmbXQpCisJICBkb3hsb2cod2hhdCxmaWxuYW0sZnNpemUsYmluYXJ5LDEscik7CisjZW5kaWYgLyogVExPRyAqLworICAgIH0KK30KKworPHJhdHRyPkQgewkJCQkvKiBGaXJzdCBkYXRhIHBhY2tldCAqLworICAgIGRlYnVnKEYxMDAsIjxyYXR0cj4gRCBmaXJzdGRhdGEiLCIiLDApOworICAgIHJjID0gcmN2X2ZpcnN0ZGF0YSgpOworICAgIGRlYnVnKEYxMDEsInJjdl9maXJzdGRhdGEgcmMiLCIiLHJjKTsKKyAgICBpZiAocmMgPiAtMSkgcmV0dXJuKHJjKTsJCS8qIChzZWUgYmVsb3cpICovCit9CisKKzxyZmlsZT5CIHsJCQkJLyogRU9ULCBubyBtb3JlIGZpbGVzICovCisgICAgYWNrKCk7CQkJCS8qIEFja25vd2xlZGdlIHRoZSBCIHBhY2tldCAqLworICAgIHJlb3QoKTsJCQkJLyogRG8gRU9UIHRoaW5ncyAqLworI2lmZGVmIENLX1RNUERJUgorLyogSWYgd2Ugd2VyZSBjZCdkIHRlbXBvcmFyaWx5IHRvIGFub3RoZXIgZGV2aWNlIG9yIGRpcmVjdG9yeSAuLi4gKi8KKyAgICBpZiAoZl90bXBkaXIpIHsKKwlpbnQgeDsKKwl4ID0gemNoZGlyKChjaGFyICopIHNhdmRpcik7CS8qIC4uLiByZXN0b3JlIHByZXZpb3VzIGRpcmVjdG9yeSAqLworCWZfdG1wZGlyID0gMDsJCQkvKiBhbmQgcmVtZW1iZXIgd2UgZGlkIGl0LiAqLworCWRlYnVnKEYxMTEsImNrY3Byby53IEIgdG1wZGlyIHJlc3RvcmluZyIsc2F2ZGlyLHgpOworICAgIH0KKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKyAgICBSRVNVTUU7CQkJCS8qIGFuZCBxdWl0ICovCit9CisKKzxyZHBrdD5EIHsJCQkJLyogR290IERhdGEgcGFja2V0ICovCisgICAgZGVidWcoRjEwMSwiPHJkcGt0PkQgY3hzZWVuIiwiIixjeHNlZW4pOworICAgIGRlYnVnKEYxMDEsIjxyZHBrdD5EIGN6c2VlbiIsIiIsY3pzZWVuKTsKKyAgICBpZiAoY3hzZWVuIHx8IGN6c2VlbiB8fCBkaXNjYXJkKSB7CS8qIElmIGZpbGUgb3IgZ3JvdXAgaW50ZXJydXB0aW9uICovCisJQ0hBUiAqIG1zZzsKKwltc2cgPSBjenNlZW4gPyAoQ0hBUiAqKSJaIiA6IChDSEFSICopIlgiOworI2lmZGVmIFNUUkVBTUlORworCWlmIChzdHJlYW1pbmcpIHsJCS8qIE5lZWQgdG8gY2FuY2VsICovCisJICAgIGRlYnVnKEYxMTEsIjxyZHBrdD5EIHN0cmVhbWluZyBjYW5jZWwiLG1zZyxjYW5jZWwpOworCSAgICBpZiAoY2FuY2VsKysgPT0gMCkgewkvKiBPbmx5IGRvIHRoaXMgb25jZSAqLworCQlhY2sxKG1zZyk7CQkvKiBQdXQgIlgiIG9yICJaIiBpbiBBQ0sgKi8KKwkgICAgfSBlbHNlIGlmIChjenNlZW4pIHsKKwkJZXJycGt0KChDSEFSICopIlVzZXIgY2FuY2VsZWQiKTsKKwkJUkVTVU1FOworCSAgICB9IGVsc2UgeworCQlmYXN0YWNrKCk7CisJICAgIH0KKwl9IGVsc2UKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKwkgIGFjazEobXNnKTsKKyAgICB9IGVsc2UgewkJCQkvKiBObyBpbnRlcnJ1cHRpb24gKi8KKwlpbnQgcmMsIHFmOworI2lmbmRlZiBOT1NQTAorCXFmID0gcXVlcnk7CisjZWxzZQorCXFmID0gMDsKKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmZGVmIENLVFVOSU5HCisJcmMgPSAoYmluYXJ5ICYmICFwYXJpdHkpID8KKwkgIGJkZWNvZGUocmRhdGFwLHB1dGZpbCk6CisJICAgIGRlY29kZShyZGF0YXAsIHFmID8gcHV0dHJtIDogcHV0ZmlsLCAxKTsKKyNlbHNlCisJcmMgPSBkZWNvZGUocmRhdGFwLCBxZiA/IHB1dHRybSA6IHB1dGZpbCwgMSk7CisjZW5kaWYgLyogQ0tUVU5JTkcgKi8KKwlpZiAocmMgPCAwKSB7CisJICAgIGRpc2NhcmQgPSAoa2VlcCA9PSAwIHx8IChrZWVwID09IFNFVF9BVVRPICYmIGJpbmFyeSAhPSBYWUZUX1QpKTsKKwkgICAgZXJycGt0KChDSEFSICopIkVycm9yIHdyaXRpbmcgZGF0YSIpOyAvKiBJZiBmYWlsdXJlLCAqLworCSAgICBSRVNVTUU7CisJfSBlbHNlCQkJCS8qIERhdGEgd3JpdHRlbiBPSywgc2VuZCBBQ0sgKi8KKyNpZmRlZiBTVFJFQU1JTkcKKwkgIGlmIChzdHJlYW1pbmcpCisJICAgIGZhc3RhY2soKTsKKwllbHNlCisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJICBhY2soKTsKKyAgICB9Cit9CisKKzxyYXR0cj5aIHsJCQkJLyogRU9GIGltbWVkaWF0ZWx5IGFmdGVyIEEtUGFja2V0LiAqLworICAgIHJmX2VyciA9ICJDYW4ndCBjcmVhdGUgZmlsZSI7CisgICAgdGltaW50ID0gc190aW1pbnQ7CisgICAgaWYgKGRpc2NhcmQpIHsJCQkvKiBEaXNjYXJkaW5nIGEgcmVhbCBmaWxlLi4uICovCisJeCA9IDE7CisgICAgfSBlbHNlIGlmICh4ZmxnKSB7CQkJLyogSWYgc2NyZWVuIGRhdGEgKi8KKwlpZiAocmVtZmlsZSkgewkJCS8qIHJlZGlyZWN0ZWQgdG8gZmlsZSAqLworCSAgICBpZiAocmVtcGlwZSkJCS8qIG9yIHBpcGUgKi8KKwkgICAgICB4ID0gb3BlbmMoWk9GSUxFLHJlbWRlc3QpOyAvKiBQaXBlOiBzdGFydCBjb21tYW5kICovCisJICAgIGVsc2UKKwkgICAgICB4ID0gb3BlbmEocmVtZGVzdCwmaWF0dHIpOyAvKiBGaWxlOiBvcGVuIHdpdGggYXR0cmlidXRlcyAqLworCX0gZWxzZSB7CQkJLyogb3RoZXJ3aXNlICovCisJICAgIHggPSBvcGVudCgmaWF0dHIpOwkJLyogIm9wZW4iIHRoZSBzY3JlZW4gKi8KKwl9CisjaWZkZWYgQ0FMSUJSQVRFCisgICAgfSBlbHNlIGlmIChjYWxpYnJhdGUpIHsJCS8qIElmIGNhbGlicmF0aW9uIHJ1biAqLworCXggPSBja29wZW54KCZpYXR0cik7CQkvKiBkbyB0aGlzICovCisjZW5kaWYgLyogQ0FMSUJSQVRFICovCisgICAgfSBlbHNlIHsJCQkJLyogb3RoZXJ3aXNlICovCisJeCA9IG9wZW5hKGZpbG5hbSwmaWF0dHIpOwkvKiBvcGVuIHRoZSBmaWxlLCB3aXRoIGF0dHJpYnV0ZXMgKi8KKwlpZiAoeCA9PSAtMTcpIHsJCQkvKiBSRUdFVCBza2lwcGVkIGJlY2F1c2Ugc2FtZSBzaXplICovCisJICAgIGRpc2NhcmQgPSAxOworCSAgICByZWplY3Rpb24gPSAxOworCX0KKyAgICB9CisgICAgaWYgKCF4IHx8IHJlb2YoZmlsbmFtLCAmaWF0dHIpIDwgMCkgeyAvKiBDbG9zZSBvdXRwdXQgZmlsZSAqLworCWVycnBrdCgoQ0hBUiAqKSByZl9lcnIpOwkvKiBJZiBwcm9ibGVtLCBzZW5kIGVycm9yIG1zZyAqLworCVJFU1VNRTsJCQkJLyogYW5kIHF1aXQgKi8KKyAgICB9IGVsc2UgewkJCQkvKiBvdGhlcndpc2UgKi8KKwlpZiAoeCA9PSAtMTcpCisJICB4eHNjcmVlbihTQ1JfU1QsU1RfU0tJUCxTS1BfUkVTLCIiKTsKKwlhY2soKTsJCQkJLyogYWNrbm93bGVkZ2UgdGhlIEVPRiBwYWNrZXQgKi8KKwlCRUdJTiByZmlsZTsJCQkvKiBhbmQgYXdhaXQgYW5vdGhlciBmaWxlICovCisgICAgfQorfQorCis8cmRwa3Q+cSB7ICAJCQkJLyogQ3RybC1DIG9yIGNvbm5lY3Rpb24gbG9zcy4gKi8KKyAgICB0aW1pbnQgPSBzX3RpbWludDsKKyAgICB3aW5kb3coMSk7CQkJCS8qIFNldCB3aW5kb3cgc2l6ZSBiYWNrIHRvIDEuLi4gKi8KKyAgICBjeHNlZW4gPSAxOworICAgIHggPSBjbHNvZigxKTsJCQkvKiBDbG9zZSBmaWxlICovCisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsJCS8qIEZhaWxlZCAqLworfQorCis8cmRwa3Q+WiB7CQkJCS8qIEVuZCBPZiBGaWxlIChFT0YpIFBhY2tldCAqLworLyogIHdzbG90cyA9IDE7CSovCQkJLyogKGRvbid0IHNldCkgV2luZG93IHNpemUgYmFjayB0byAxICovCisjaWZuZGVmIENPSEVSRU5UIC8qIENvaGVyZW50IGNvbXBpbGVyIGJsb3dzIHVwIG9uIHRoaXMgc3dpdGNoKCkgc3RhdGVtZW50LiAqLworICAgIHggPSByZW9mKGZpbG5hbSwgJmlhdHRyKTsJCS8qIEhhbmRsZSB0aGUgRU9GIHBhY2tldCAqLworICAgIHN3aXRjaCAoeCkgewkJCS8qIHJlb2YoKSBzZXRzIHRoZSBzdWNjZXNzIGZsYWcgKi8KKyAgICAgIGNhc2UgLTU6CQkJCS8qIEhhbmRsZSBwcm9ibGVtcyAqLworCWVycnBrdCgoQ0hBUiAqKSJSRU5BTUUgZmFpbGVkIik7IC8qIEZhdGFsICovCisJUkVTVU1FOworCWJyZWFrOworICAgICAgY2FzZSAtNDoKKwllcnJwa3QoKENIQVIgKikiTU9WRSBmYWlsZWQiKTsJLyogRmF0YWwgKi8KKwlSRVNVTUU7CisJYnJlYWs7CisgICAgICBjYXNlIC0zOgkJCQkvKiBJZiBwcm9ibGVtLCBzZW5kIGVycm9yIG1zZyAqLworCWVycnBrdCgoQ0hBUiAqKSJDYW4ndCBwcmludCBmaWxlIik7IC8qIEZhdGFsICovCisJUkVTVU1FOworCWJyZWFrOworICAgICAgY2FzZSAtMjoKKwllcnJwa3QoKENIQVIgKikiQ2FuJ3QgbWFpbCBmaWxlIik7IC8qIEZhdGFsICovCisJUkVTVU1FOworCWJyZWFrOworICAgICAgY2FzZSAyOgkJCQkvKiBOb3QgZmF0YWwgKi8KKyAgICAgIGNhc2UgMzoKKwl4eHNjcmVlbihTQ1JfRU0sMCwwTCwiUmVjZWl2ZXIgY2FuJ3QgZGVsZXRlIHRlbXAgZmlsZSIpOworCVJFU1VNRTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJaWYgKHggPCAwKSB7CQkJLyogRmF0YWwgKi8KKwkgICAgZXJycGt0KChDSEFSICopIkNhbid0IGNsb3NlIGZpbGUiKTsKKwkgICAgUkVTVU1FOworCX0gZWxzZSB7CQkJLyogU3VjY2VzcyAqLworI2lmbmRlZiBOT1NQTAorCSAgICBpZiAocXVlcnkpCQkJLyogUXVlcnkgcmVwb25zZXMgZ2VuZXJhbGx5ICovCisJICAgICAgY29ub2xsKCIiKTsJCS8qIGRvbid0IGhhdmUgbGluZSB0ZXJtaW5hdG9ycyAqLworI2VuZGlmIC8qIE5PU1BMICovCisJICAgIGlmIChjenNlZW4pIHsJCS8qIEJhdGNoIGNhbmNlbGVkPyAqLworCQlpZiAoY2FuY2VsKysgPT0gMCkgewkvKiBJZiB3ZSBoYXZlbid0IHRyaWVkIHRoaXMgeWV0ICovCisJCSAgICBhY2sxKChDSEFSICopIloiKTsJLyogVHJ5IGl0IG9uY2UgKi8KKwkJfSBlbHNlIHsJCS8qIE90aGVyd2lzZSAqLworCQkgICAgZXJycGt0KChDSEFSICopIlVzZXIgY2FuY2VsZWQiKTsgLyogcXVpdGUgd2l0aCBFcnJvciAqLworCQkgICAgUkVTVU1FOworCQl9CisJICAgIH0gZWxzZQorCSAgICAgIGFjaygpOwkJCS8qIEFja25vd2xlZGdlIHRoZSBFT0YgcGFja2V0ICovCisJICAgIEJFR0lOIHJmaWxlOwkJLyogYW5kIGF3YWl0IGFub3RoZXIgZmlsZSAqLworCX0KKyAgICB9CisjZWxzZQorICAgIGlmIChyZW9mKGZpbG5hbSwgJmlhdHRyKSA8IDApIHsJLyogQ2xvc2UgdGhlIGZpbGUgKi8KKwllcnJwa3QoKENIQVIgKikiRXJyb3IgYXQgZW5kIG9mIGZpbGUiKTsKKwlSRVNVTUU7CisgICAgfSBlbHNlIHsJCQkJLyogcmVvZigpIHNldHMgc3VjY2VzcyBmbGFnICovCisJYWNrKCk7CisJQkVHSU4gcmZpbGU7CisgICAgfQorI2VuZGlmIC8qIENPSEVSRU5UICovCit9CisKKzxzc2luaXQ+WSB7CQkJCS8qIEFDSyBmb3IgU2VuZC1Jbml0ICovCisgICAgc3BhcihyZGF0YXApOwkJCS8qIHNldCBwYXJhbWV0ZXJzIGZyb20gaXQgKi8KKyAgICBjYW5jZWwgPSAwOworICAgIGJjdHUgPSBiY3RyOwkJCS8qIHN3aXRjaCB0byBhZ3JlZWQtdXBvbiBibG9jayBjaGVjayAqLworICAgIGJjdGwgPSAoYmN0dSA9PSA0KSA/IDIgOiBiY3R1OwkvKiBTZXQgYmxvY2stY2hlY2sgbGVuZ3RoICovCisjaWZkZWYgQ0tfUkVTRU5ECisgICAgaWYgKChzZW5kbW9kZSA9PSBTTV9SRVNFTkQpICYmICghYXRjYXB1IHx8ICFyc2NhcHUpKSB7IC8qIFJFU0VORCAqLworCWVycnBrdCgoQ0hBUiAqKSAiUkVTRU5EIGNhcGFiaWxpdGllcyBub3QgbmVnb3RpYXRlZCIpOworCVJFU1VNRTsKKyAgICB9IGVsc2UgeworI2VuZGlmIC8qIENLX1JFU0VORCAqLworCXdoYXQgPSBXX1NFTkQ7CQkJLyogUmVtZW1iZXIgd2UncmUgc2VuZGluZyAqLworCWxhc3R4ZmVyID0gV19TRU5EOworCXggPSBzZmlsZSh4ZmxnKTsJCS8qIFNlbmQgWCBvciBGIGhlYWRlciBwYWNrZXQgKi8KKwljYW5jZWwgPSAwOwkJCS8qIFJlc2V0IGNhbmNlbGxhdGlvbiBjb3VudGVyICovCisJaWYgKHgpIHsJCQkvKiBJZiB0aGUgcGFja2V0IHdhcyBzZW50IE9LICovCisJICAgIGlmICgheGZsZyAmJiBmaWxjbnQgPT0gMSkJLyogYW5kIGl0J3MgYSByZWFsIGZpbGUgKi8KKwkgICAgICBjcmMxNiA9IDBMOwkJLyogQ2xlYXIgdGhlIGZpbGUgQ1JDICovCisJICAgIHJlc2V0YygpOwkJCS8qIHJlc2V0IHBlci10cmFuc2FjdGlvbiBjb3VudGVycyAqLworCSAgICBydGltZXIoKTsJCQkvKiByZXNldCB0aW1lcnMgKi8KKyNpZmRlZiBHRlRJTUVSCisJICAgIHJmdGltZXIoKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisJICAgIHN0cmVhbW9uKCk7CQkJLyogdHVybiBvbiBzdHJlYW1pbmcgKi8KKyNpZmRlZiBJS1NEQgorCSAgICBpZiAoaWtkYm9wZW4pIHNsb3RzdGF0ZSh3aGF0LAorCQkJCSAgKHNlcnZlciA/ICJTRVJWRVIiIDogIiIpLAorCQkJCSAgIlNFTkQiLAorCQkJCSAgZmlsbmFtCisJCQkJICApOworI2VuZGlmIC8qIElLU0RCICovCisJICAgIEJFR0lOIHNzZmlsZTsJCS8qIGFuZCBzd2l0Y2ggdG8gcmVjZWl2ZS1maWxlIHN0YXRlICovCisJfSBlbHNlIHsJCQkvKiBvdGhlcndpc2Ugc2VuZCBlcnJvciBtc2cgJiBxdWl0ICovCisJICAgIHMgPSB4ZmxnID8gIkNhbid0IGV4ZWN1dGUgY29tbWFuZCIgOiAoY2hhciAqKWVwa3Rtc2c7CisJICAgIGlmICghKnMpIHMgPSAiQ2FuJ3Qgb3BlbiBmaWxlIjsKKwkgICAgZXJycGt0KChDSEFSICopcyk7CisJICAgIFJFU1VNRTsKKwl9CisjaWZkZWYgQ0tfUkVTRU5ECisgICAgfQorI2VuZGlmIC8qIENLX1JFU0VORCAqLworfQorCisvKgorICBUaGVzZSBzdGF0ZXMgYXJlIG5lY2Vzc2FyeSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgZ2V0IGEgc2VydmVyIGNvbW1hbmQKKyAgcGFja2V0IChSLCBHLCBvciBDKSByZXBseSB3aXRoIGFuIFMgcGFja2V0LCBidXQgdGhlIGNsaWVudCByZXRyYW5zbWl0cyB0aGUKKyAgY29tbWFuZCBwYWNrZXQuICBUaGUgaW5wdXQoKSBmdW5jdGlvbiBkb2Vzbid0IGNhdGNoIHRoaXMgYmVjYXVzZSB0aGUgcGFja2V0CisgIG51bWJlciBpcyBzdGlsbCB6ZXJvLgorKi8KKzxzc2luaXQ+UiB7CQkJCS8qIFIgcGFja2V0IHdhcyByZXRyYW5zbWl0dGVkLiAqLworICAgIHhzaW5pdCgpOwkJCQkvKiBSZXNlbmQgcGFja2V0IDAgKi8KK30KKworPHNzaW5pdD5HIHsJCQkJLyogU2FtZSBkZWFsIGlmIEcgcGFja2V0IGNvbWVzIGFnYWluICovCisgICAgeHNpbml0KCk7Cit9CisKKy8qIHNob3VsZCBwcm9iYWJseSBhZGQgY2FzZXMgZm9yIE8sIFcsIFYsIEgsIEosIC4uLiAqLworCis8c3Npbml0PkMgewkJCQkvKiBTYW1lIGRlYWwgaWYgQyBwYWNrZXQgY29tZXMgYWdhaW4gKi8KKyAgICB4c2luaXQoKTsKK30KKworPHNzZmlsZT5ZIHsJCQkJLyogQUNLIGZvciBGIG9yIFggcGFja2V0ICovCisgICAgc3J2cHRyID0gc3J2Y21kOwkJCS8qIFBvaW50IHRvIHN0cmluZyBidWZmZXIgKi8KKyAgICBkZWNvZGUocmRhdGFwLHB1dHNydiwwKTsJCS8qIERlY29kZSBkYXRhIGZpZWxkLCBpZiBhbnkgKi8KKyAgICBwdXRzcnYoTlVMKTsJCQkvKiBUZXJtaW5hdGUgd2l0aCBudWxsICovCisgICAgZmZjID0gMEw7CQkJCS8qIFJlc2V0IGZpbGUgYnl0ZSBjb3VudGVyICovCisgICAgZGVidWcoRjEwMSwiPHNzZmlsZT5ZIGN4c2VlbiIsIiIsY3hzZWVuKTsKKyAgICBpZiAoKnNydmNtZCkgewkJCS8qIElmIHJlbW90ZSBuYW1lIHdhcyByZWNvcmRlZCAqLworICAgICAgICBpZiAoc2VuZG1vZGUgIT0gU01fUkVTRU5EKSB7CisJICAgIGlmIChmZGlzcGxhID09IFhZRkRfQyB8fCBmZGlzcGxhID09IFhZRkRfUykKKwkgICAgICB4eHNjcmVlbihTQ1JfQU4sMCwwTCwoY2hhciAqKXNydmNtZCk7CisJICAgIHRsb2coRjExMCwiIHJlbW90ZSBuYW1lOiIsKGNoYXIgKikgc3J2Y21kLDBMKTsKKwkgICAgbWFrZXN0cigmcHNyZnNwZWMsKGNoYXIgKilzcnZjbWQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjeHNlZW58fGN6c2VlbikgewkJLyogSW50ZXJydXB0ZWQ/ICovCisJZGVidWcoRjEwMSwiPHNzZmlsZT5ZIGNhbmNlbGluZyIsIiIsMCk7CisJeCA9IGNsc2lmKCk7CQkJLyogQ2xvc2UgaW5wdXQgZmlsZSAqLworCXN4ZW9mKDEpOwkJCS8qIFNlbmQgRU9GKEQpICovCisJQkVHSU4gc3Nlb2Y7CQkJLyogYW5kIHN3aXRjaCB0byBFT0Ygc3RhdGUuICovCisgICAgfSBlbHNlIGlmIChhdGNhcHUpIHsJCS8qIElmIGF0dHJpYnV0ZXMgYXJlIHRvIGJlIHVzZWQgKi8KKwlpZiAoc2F0dHIoeGZsZyB8IHN0ZGluZiwgMSkgPCAwKSB7IC8qIHNlbmQgdGhlbSAqLworCSAgICBlcnJwa3QoKENIQVIgKikiQ2FuJ3Qgc2VuZCBhdHRyaWJ1dGVzIik7IC8qIGlmIHByb2JsZW0sIHNheSBzbyAqLworCSAgICBSRVNVTUU7CQkJLyogYW5kIHF1aXQgKi8KKwl9IGVsc2UgQkVHSU4gc3NhdHRyOwkJLyogaWYgb2ssIHN3aXRjaCB0byBhdHRyaWJ1dGUgc3RhdGUgKi8KKyAgICB9IGVsc2UgewkJCQkvKiBBdHRyaWJ1dGVzIG5vdCBuZWdvdGlhdGVkICovCisJaWYgKHdpbmRvdyh3c2xvdG4pIDwgMCkgewkvKiBPcGVuIHdpbmRvdyAqLworCSAgICBlcnJwa3QoKENIQVIgKikiQ2FuJ3Qgb3BlbiB3aW5kb3ciKTsKKwkgICAgUkVTVU1FOworCX0gZWxzZSBpZiAoKHggPSBzZGF0YSgpKSA9PSAtMikgeyAvKiBTZW5kIGZpcnN0IGRhdGEgcGFja2V0IGRhdGEgKi8KKwkgICAgd2luZG93KDEpOwkJCS8qIENvbm5lY3Rpb24gbG9zdCwgcmVzZXQgd2luZG93ICovCisJICAgIHggPSBjbHNpZigpOwkJLyogQ2xvc2UgaW5wdXQgZmlsZSAqLworCSAgICByZXR1cm4oc3VjY2VzcyA9IDApOwkvKiBSZXR1cm4gZmFpbHVyZSAqLworCX0gZWxzZSBpZiAoeCA9PSAtOSkgewkJLyogVXNlciBpbnRlcnJ1cHRlZCAqLworCSAgICBlcnJwa3QoKENIQVIgKikiVXNlciBjYW5jZWxsZWQiKTsgLyogU2VuZCBFcnJvciBwYWNrZXQgKi8KKwkgICAgd2luZG93KDEpOwkJCS8qIFNldCB3aW5kb3cgc2l6ZSBiYWNrIHRvIDEuLi4gKi8KKwkgICAgdGltaW50ID0gc190aW1pbnQ7CQkvKiBSZXN0b3JlIHRpbWVvdXQgKi8KKwkgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsJLyogRmFpbGVkICovCisJfSBlbHNlIGlmICh4IDwgMCkgewkJLyogRU9GIChlbXB0eSBmaWxlKSBvciBpbnRlcnJ1cHRlZCAqLworCSAgICB3aW5kb3coMSk7CQkJLyogcHV0IHdpbmRvdyBzaXplIGJhY2sgdG8gMSwgKi8KKwkgICAgZGVidWcoRjEwMSwiPHNzZmlsZT5ZIGN4c2VlbiIsIiIsY3hzZWVuKTsKKwkgICAgeCA9IGNsc2lmKCk7CQkvKiBJZiBub3Qgb2ssIGNsb3NlIGlucHV0IGZpbGUsICovCisJICAgIGlmICh4IDwgMCkJCQkvKiB0cmVhdGluZyBmYWlsdXJlIGFzIGludGVycnVwdGlvbiAqLworCSAgICAgIGN4c2VlbiA9IDE7CQkvKiBTZW5kIEVPRiBwYWNrZXQgKi8KKwkgICAgc2VvZihjeHNlZW58fGN6c2Vlbik7CisJICAgIEJFR0lOIHNzZW9mOwkJLyogYW5kIHN3aXRjaCB0byBFT0Ygc3RhdGUuICovCisJfSBlbHNlIHsJCQkvKiBGaXJzdCBkYXRhIHNlbnQgT0sgKi8KKwkgICAgQkVHSU4gc3NkYXRhOwkJLyogQWxsIG9rLCBzd2l0Y2ggdG8gc2VuZC1kYXRhIHN0YXRlICovCisJfQorICAgIH0KK30KKworPHNzYXR0cj5ZIHsJCQkJLyogR290IEFDSyB0byBBIHBhY2tldCAqLworICAgIGZmYyA9IDBMOwkJCQkvKiBSZXNldCBmaWxlIGJ5dGUgY291bnRlciAqLworICAgIGRlYnVnKEYxMDEsIjxzc2F0dHI+WSBjeHNlZW4iLCIiLGN4c2Vlbik7CisgICAgaWYgKGN4c2Vlbnx8Y3pzZWVuKSB7CQkvKiBJbnRlcnJ1cHRlZD8gKi8KKwlkZWJ1ZyhGMTAxLCI8c2F0dHI+WSBjYW5jZWxpbmciLCIiLDApOworCXggPSBjbHNpZigpOwkJCS8qIENsb3NlIGlucHV0IGZpbGUgKi8KKwlzeGVvZigxKTsJCQkvKiBTZW5kIEVPRihEKSAqLworCUJFR0lOIHNzZW9mOwkJCS8qIGFuZCBzd2l0Y2ggdG8gRU9GIHN0YXRlLiAqLworICAgIH0gZWxzZSBpZiAocnNhdHRyKHJkYXRhcCkgPCAwKSB7CS8qIFdhcyB0aGUgZmlsZSByZWZ1c2VkPyAqLworCWRpc2NhcmQgPSAxOwkJCS8qIFNldCB0aGUgZGlzY2FyZCBmbGFnICovCisJY2xzaWYoKTsJCQkvKiBDbG9zZSB0aGUgZmlsZSAqLworCXN4ZW9mKDEpOwkJCS8qIHNlbmQgRU9GIHdpdGggImRpc2NhcmQiIGNvZGUgKi8KKwlCRUdJTiBzc2VvZjsJCQkvKiBzd2l0Y2ggdG8gc2VuZC1FT0Ygc3RhdGUgKi8KKyAgICB9IGVsc2UgaWYgKCh4ID0gc2F0dHIoeGZsZyB8IHN0ZGluZiwgMCkpIDwgMCkgeyAvKiBTZW5kIG1vcmU/ICovCisJZXJycGt0KChDSEFSICopIkNhbid0IHNlbmQgYXR0cmlidXRlcyIpOyAvKiBUcm91YmxlLi4uICovCisJUkVTVU1FOworICAgIH0gZWxzZSBpZiAoeCA9PSAwKSB7CQkvKiBObyBtb3JlIHRvIHNlbmQgc28gbm93IHRoZSBkYXRhICovCisJaWYgKHdpbmRvdyh3c2xvdG4pIDwgMCkgewkvKiBBbGxvY2F0ZSBuZWdvdGlhdGVkIHdpbmRvdyBzbG90cyAqLworCSAgICBlcnJwa3QoKENIQVIgKikiQ2FuJ3Qgb3BlbiB3aW5kb3ciKTsKKwkgICAgUkVTVU1FOworCX0KKwlpZiAoKHggPSBzZGF0YSgpKSA9PSAtMikgewkvKiBGaWxlIGFjY2VwdGVkLCBzZW5kIGZpcnN0IGRhdGEgKi8KKwkgICAgd2luZG93KDEpOwkJCS8qIENvbm5lY3Rpb24gYnJva2VuICovCisJICAgIHggPSBjbHNpZigpOwkJLyogQ2xvc2UgZmlsZSAqLworCSAgICByZXR1cm4oc3VjY2VzcyA9IDApOwkvKiBSZXR1cm4gZmFpbHVyZSAqLworCX0gZWxzZSBpZiAoeCA9PSAtOSkgewkJLyogVXNlciBpbnRlcnJ1cHRlZCAqLworCSAgICBlcnJwa3QoKENIQVIgKikiVXNlciBjYW5jZWxsZWQiKTsgLyogU2VuZCBFcnJvciBwYWNrZXQgKi8KKwkgICAgd2luZG93KDEpOwkJCS8qIFNldCB3aW5kb3cgc2l6ZSBiYWNrIHRvIDEuLi4gKi8KKwkgICAgdGltaW50ID0gc190aW1pbnQ7CQkvKiBSZXN0b3JlIHRpbWVvdXQgKi8KKwkgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsJLyogRmFpbGVkICovCisJfSBlbHNlIGlmICh4IDwgMCkgewkJLyogSWYgZGF0YSB3YXMgbm90IHNlbnQgKi8KKwkgICAgd2luZG93KDEpOwkJCS8qIHB1dCB3aW5kb3cgc2l6ZSBiYWNrIHRvIDEsICovCisJICAgIGRlYnVnKEYxMDEsIjxzc2F0dHI+WSBjeHNlZW4iLCIiLGN4c2Vlbik7CisJICAgIGlmIChjbHNpZigpIDwgMCkJCS8qIENsb3NlIGlucHV0IGZpbGUgKi8KKwkgICAgICBjeHNlZW4gPSAxOwkJLyogU2VuZCBFT0YgcGFja2V0ICovCisJICAgIHNlb2YoY3hzZWVufHxjenNlZW4pOworCSAgICBCRUdJTiBzc2VvZjsJCS8qIGFuZCBzd2l0Y2ggdG8gRU9GIHN0YXRlLiAqLworCX0gZWxzZSB7CisJICAgIEJFR0lOIHNzZGF0YTsJCS8qIEFsbCBvaywgc3dpdGNoIHRvIHNlbmQtZGF0YSBzdGF0ZSAqLworCX0KKyAgICB9Cit9CisKKzxzc2RhdGE+cSB7ICAJCQkJLyogQ3RybC1DIG9yIGNvbm5lY3Rpb24gbG9zcy4gKi8KKyAgICB3aW5kb3coMSk7CQkJCS8qIFNldCB3aW5kb3cgc2l6ZSBiYWNrIHRvIDEuLi4gKi8KKyAgICBjeHNlZW4gPSAxOwkJCQkvKiBUbyBpbmRpY2F0ZSBpbnRlcnJ1cHRpb24gKi8KKyAgICB4ID0gY2xzaWYoKTsJCQkvKiBDbG9zZSBmaWxlICovCisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsJCS8qIEZhaWxlZCAqLworfQorCis8c3NkYXRhPlkgewkJCQkvKiBHb3QgQUNLIHRvIERhdGEgcGFja2V0ICovCisgICAgY2FubmVkKHJkYXRhcCk7CQkJLyogQ2hlY2sgaWYgZmlsZSB0cmFuc2ZlciBjYW5jZWxsZWQgKi8KKyAgICBkZWJ1ZyhGMTExLCI8c3NkYXRhPlkgY3hzZWVuIixyZGF0YXAsY3hzZWVuKTsKKyAgICBkZWJ1ZyhGMTExLCI8c3NkYXRhPlkgY3pzZWVuIixyZGF0YXAsY3pzZWVuKTsKKyAgICBpZiAoKHggPSBzZGF0YSgpKSA9PSAtMikgewkJLyogVHJ5IHRvIHNlbmQgbmV4dCBkYXRhICovCisJd2luZG93KDEpOwkJCS8qIENvbm5lY3Rpb24gbG9zdCwgcmVzZXQgd2luZG93ICovCisJeCA9IGNsc2lmKCk7CQkJLyogQ2xvc2UgZmlsZSAqLworCXJldHVybihzdWNjZXNzID0gMCk7CQkvKiBGYWlsZWQgKi8KKyAgICB9IGVsc2UgaWYgKHggPT0gLTkpIHsJCS8qIFVzZXIgaW50ZXJydXB0ZWQgKi8KKwllcnJwa3QoKENIQVIgKikiVXNlciBjYW5jZWxsZWQiKTsgLyogU2VuZCBFcnJvciBwYWNrZXQgKi8KKwl3aW5kb3coMSk7CQkJLyogU2V0IHdpbmRvdyBzaXplIGJhY2sgdG8gMS4uLiAqLworCXRpbWludCA9IHNfdGltaW50OwkJLyogUmVzdG9yZSBvcmlnaW5hbCB0aW1lb3V0ICovCisJcmV0dXJuKHN1Y2Nlc3MgPSAwKTsJCS8qIEZhaWxlZCAqLworICAgIH0gZWxzZSBpZiAoeCA8IDApIHsJCQkvKiBFT0YgLSBmaW5pc2hlZCBzZW5kaW5nIGRhdGEgKi8KKwlkZWJ1ZyhGMTAxLCI8c3NkYXRhPlkgY3hzZWVuIiwiIixjeHNlZW4pOworCXdpbmRvdygxKTsJCQkvKiBTZXQgd2luZG93IHNpemUgYmFjayB0byAxLi4uICovCisJaWYgKGNsc2lmKCkgPCAwKQkJLyogQ2xvc2UgaW5wdXQgZmlsZSAqLworCSAgY3hzZWVuID0gMTsJCQkvKiBTZW5kIEVPRiBwYWNrZXQgKi8KKwlkZWJ1ZyhGMTAxLCI8c3NkYXRhPlkgQ0FMTElORyBTRU9GKCkiLCIiLGN4c2Vlbik7CisJc2VvZihjeHNlZW58fGN6c2Vlbik7CisJQkVHSU4gc3Nlb2Y7CQkJLyogYW5kIGVudGVyIHNlbmQtZW9mIHN0YXRlICovCisgICAgfQorICAgIC8qIE5PVEU6IElmIHggPT0gMCBpdCBtZWFucyB3ZSdyZSBkcmFpbmluZzogc2VlIHNkYXRhKCkhICovCit9CisKKzxzc2VvZj5ZIHsJCQkJLyogR290IEFDSyB0byBFT0YgKi8KKyAgICBpbnQgZywgeGRpc2NhcmQ7CisgICAgY2FubmVkKHJkYXRhcCk7CQkJLyogQ2hlY2sgaWYgZmlsZSB0cmFuc2ZlciBjYW5jZWxsZWQgKi8KKyAgICBkZWJ1ZyhGMTExLCI8c3Nlb2Y+WSBjeHNlZW4iLHJkYXRhcCxjeHNlZW4pOworICAgIGRlYnVnKEYxMTEsIjxzc2VvZj5ZIGN6c2VlbiIscmRhdGFwLGN6c2Vlbik7CisgICAgZGVidWcoRjExMSwiPHNzZW9mPlkgZGlzY2FyZCIscmRhdGFwLGRpc2NhcmQpOworICAgIHhkaXNjYXJkID0gZGlzY2FyZDsKKyAgICBkaXNjYXJkID0gMDsKKyAgICBzdWNjZXNzID0gKGN4c2VlbiA9PSAwICYmIGN6c2VlbiA9PSAwKTsgLyogVHJhbnNmZXIgc3RhdHVzLi4uICovCisgICAgZGVidWcoRjEwMSwiPHNzZW9mPlkgc3VjY2VzcyIsIiIsc3VjY2Vzcyk7CisgICAgaWYgKHN1Y2Nlc3MgJiYgcmVqZWN0aW9uID4gMCkJICAgIC8qIElmIHJlamVjdGVkLCBzdWNjZWVkIGlmICovCisgICAgICBpZiAocmVqZWN0aW9uICE9ICcjJyAmJgkJICAgIC8qIHJlYXNvbiB3YXMgZGF0ZSAqLworCSAgcmVqZWN0aW9uICE9IDEgJiYgcmVqZWN0aW9uICE9ICc/JykgLyogb3IgbmFtZTsgKi8KKwlzdWNjZXNzID0gMDsJCQkgICAgLyogZmFpbCBvdGhlcndpc2UuICovCisgICAgY3hzZWVuID0gMDsJCQkJLyogVGhpcyBnb2VzIGJhY2sgdG8gemVyby4gKi8KKyAgICBpZiAoc3VjY2VzcykgewkJCS8qIE9ubHkgaWYgdHJhbnNmZXIgc3VjY2VlZGVkLi4uICovCisJeHhzY3JlZW4oU0NSX1NULFNUX09LLDBMLCIiKTsKKwlpZiAoIXhkaXNjYXJkKSB7CisJICAgIG1ha2VzdHIoJnNmc3BlYyxwc2ZzcGVjKTsJLyogUmVjb3JkIGZpbGVuYW1lcyBmb3IgV0hFUkUgKi8KKwkgICAgbWFrZXN0cigmc3Jmc3BlYyxwc3Jmc3BlYyk7CisJfQorCWlmIChtb3ZpbmcpIHsJCQkvKiBJZiBNT1ZFJ2luZyAqLworCSAgICB4ID0gemRlbGV0KGZpbG5hbSk7CQkvKiBUcnkgdG8gZGVsZXRlIHRoZSBzb3VyY2UgZmlsZSAqLworI2lmZGVmIFRMT0cKKwkgICAgaWYgKHRyYWxvZykgeworCQlpZiAoeCA+IC0xKSB7CisJCSAgICB0bG9nKEYxMTAsIiBkZWxldGVkIixmaWxuYW0sMCk7CisJCX0gZWxzZSB7CisJCSAgICB0bG9nKEYxMTAsIiBkZWxldGUgZmFpbGVkOiIsY2tfZXJyc3RyKCksMCk7CisJCX0KKwkgICAgfQorI2VuZGlmIC8qIFRMT0cgKi8KKwl9IGVsc2UgaWYgKHNuZF9tb3ZlKSB7CQkvKiBPciBtb3ZlIGl0ICovCisJICAgIGludCB4OworCSAgICB4ID0genJlbmFtZShmaWxuYW0sc25kX21vdmUpOworI2lmZGVmIFRMT0cKKwkgICAgaWYgKHRyYWxvZykgeworCQlpZiAoeCA+IC0xKSB7CisJCSAgICB0bG9nKEYxMTAsIiBtb3ZlZCB0byAiLHNuZF9tb3ZlLDApOworCQl9IGVsc2UgeworCQkgICAgdGxvZyhGMTEwLCIgbW92ZSBmYWlsZWQ6Iixja19lcnJzdHIoKSwwKTsKKwkJfQorCSAgICB9CisjZW5kaWYgLyogVExPRyAqLworCX0gZWxzZSBpZiAoc25kX3JlbmFtZSkgewkvKiBPciByZW5hbWUgaXQgKi8KKwkgICAgY2hhciAqcyA9IHNuZF9yZW5hbWU7CS8qIFJlbmFtaW5nIHN0cmluZyAqLworI2lmbmRlZiBOT1NQTAorCSAgICBpbnQgeTsJCQkvKiBQYXNzIGl0IHRocnUgdGhlIGV2YWx1YXRvciAqLworCSAgICBleHRlcm4gaW50IGNtZF9xdW90aW5nOwkvKiBmb3IgXHYoZmlsZW5hbWUpICovCisJICAgIGlmIChjbWRfcXVvdGluZykgewkJLyogQnV0IG9ubHkgaWYgY21kX3F1b3RpbmcgaXMgb24gKi8KKwkJeSA9IE1BWFJQOworCQlzID0gKGNoYXIgKilzcnZjbWQ7CisJCXp6c3RyaW5nKHNuZF9yZW5hbWUsJnMsJnkpOworCQlzID0gKGNoYXIgKilzcnZjbWQ7CisJICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworCSAgICBpZiAocykgaWYgKCpzKSB7CisJCWludCB4OworCQl4ID0genJlbmFtZShmaWxuYW0scyk7CisjaWZkZWYgVExPRworCSAgICBpZiAodHJhbG9nKSB7CisJCWlmICh4ID4gLTEpIHsKKwkJICAgIHRsb2coRjExMCwiIHJlbmFtZWQgdG8iLHMsMCk7CisJCX0gZWxzZSB7CisJCSAgICB0bG9nKEYxMTAsIiByZW5hbWUgZmFpbGVkOiIsY2tfZXJyc3RyKCksMCk7CisJCX0KKwkgICAgfQorI2VuZGlmIC8qIFRMT0cgKi8KKyNpZmRlZiBDT01NRU5UCisJCSpzID0gTlVMOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKGN6c2VlbikgewkJCS8qIENoZWNrIGdyb3VwIGludGVycnVwdGlvbiBmbGFnICovCisJZyA9IDA7CQkJCS8qIE5vIG1vcmUgZmlsZXMgaWYgaW50ZXJydXB0ZWQgKi8KKyAgICB9IGVsc2UgewkJCQkvKiBPdGhlcndpc2UuLi4gKi8KKyNpZmRlZiBDT01NRU5UCisJLyogVGhpcyBjb2RlIG1ha2VzIGFueSBvcGVuIGVycm9yIGZhdGFsIHRvIGEgZmlsZS1ncm91cCB0cmFuc2Zlci4gKi8KKwlnID0gZ25maWxlKCk7CisJZGVidWcoRjExMSwiPHNzZW9mPlkgZ25maWxlIixmaWxuYW0sZyk7CisJaWYgKGcgPiAwKSB7CQkJLyogQW55IG1vcmUgZmlsZXMgdG8gc2VuZD8gKi8KKwkgICAgaWYgKHNmaWxlKHhmbGcpKQkJLyogWWVzLCB0cnkgdG8gc2VuZCBuZXh0IGZpbGUgaGVhZGVyICovCisJICAgICAgQkVHSU4gc3NmaWxlOwkJLyogaWYgb2ssIGVudGVyIHNlbmQtZmlsZSBzdGF0ZSAqLworCSAgICBlbHNlIHsJCQkvKiBvdGhlcndpc2UgKi8KKwkJcyA9IHhmbGcgPyAiQ2FuJ3QgZXhlY3V0ZSBjb21tYW5kIiA6IChjaGFyICopZXBrdG1zZzsKKwkJaWYgKCEqcykgcyA9ICJDYW4ndCBvcGVuIGZpbGUiOworCQllcnJwa3QoKENIQVIgKilzKTsJLyogc2VuZCBlcnJvciBtZXNzYWdlICovCisJCVJFU1VNRTsJCQkvKiBhbmQgcXVpdCAqLworCSAgICB9CisJfSBlbHNlIHsJCQkvKiBObyBuZXh0IGZpbGUgKi8KKwkgICAgdHNlY3MgPSBndGltZXIoKTsJCS8qIGdldCBzdGF0aXN0aWNzIHRpbWVycyAqLworI2lmZGVmIEdGVElNRVIKKwkgICAgZnB0c2VjcyA9IGdmdGltZXIoKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisJICAgIHNlb3QoKTsJCQkvKiBzZW5kIEVPVCBwYWNrZXQgKi8KKwkgICAgQkVHSU4gc3Nlb3Q7CQkvKiBlbnRlciBzZW5kLWVvdCBzdGF0ZSAqLworCX0KKyNlbHNlICAvKiBDT01NRU5UICovCisJd2hpbGUgKDEpIHsJCQkvKiBLZWVwIHRyeWluZy4uLiAqLworCSAgICBnID0gZ25maWxlKCk7CQkvKiBHZXQgbmV4dCBmaWxlICovCisJICAgIGRlYnVnKEYxMTEsIjxzc2VvZj5ZIGduZmlsZSIsZmlsbmFtLGcpOworCSAgICBpZiAoZyA9PSAwICYmIGduZmVycm9yID09IDApIC8qIE5vIG1vcmUsIHN0b3AgdHJ5aW5nICovCisJICAgICAgYnJlYWs7CisJICAgIGlmIChnID4gMCkgewkJLyogSGF2ZSBvbmUgKi8KKwkJaWYgKHNmaWxlKHhmbGcpKSB7CS8qIFRyeSB0byBvcGVuIGFuZCBzZW5kIEYgcGFja2V0ICovCisJCSAgICBCRUdJTiBzc2ZpbGU7CS8qIElmIE9LLCBlbnRlciBzZW5kLWZpbGUgc3RhdGUgKi8KKwkJICAgIGJyZWFrOwkJLyogYW5kIGJyZWFrIG91dCBvZiBsb29wLiAqLworCQl9CisJICAgIH0gLyogT3RoZXJ3aXNlIGtlZXAgdHJ5aW5nIHRvIGdldCBvbmUgd2UgY2FuIHNlbmQuLi4gKi8KKwl9CisgICAgfQorICAgIGlmIChnID09IDApIHsKKwlkZWJ1ZyhGMTAxLCI8c3Nlb2Y+WSBubyBtb3JlIGZpbGVzIiwiIixjenNlZW4pOworCXRzZWNzID0gZ3RpbWVyKCk7CQkvKiBHZXQgc3RhdGlzdGljcyB0aW1lcnMgKi8KKyNpZmRlZiBHRlRJTUVSCisJZnB0c2VjcyA9IGdmdGltZXIoKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisJc2VvdCgpOwkJCQkvKiBTZW5kIEVPVCBwYWNrZXQgKi8KKwlCRUdJTiBzc2VvdDsJCQkvKiBFbnRlciBzZW5kLWVvdCBzdGF0ZSAqLworICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCit9CisKKzxzc2VvdD5ZIHsJCQkJLyogR290IEFDSyB0byBFT1QgKi8KKyAgICBkZWJ1ZyhGMTAxLCJzc2VvdCBqdXN0b25lIiwiIixqdXN0b25lKTsKKyAgICBSRVNVTUU7CQkJCS8qIEFsbCBkb25lLCBqdXN0IHF1aXQgKi8KK30KKworRSB7CQkJCQkvKiBHb3QgRXJyb3IgcGFja2V0LCBpbiBhbnkgc3RhdGUgKi8KKyAgICBjaGFyICpzID0gIiI7CisgICAgd2luZG93KDEpOwkJCQkvKiBDbG9zZSB3aW5kb3cgKi8KKyAgICB0aW1pbnQgPSBzX3RpbWludDsJCQkvKiBSZXN0b3JlIG9yaWdpbmFsIHRpbWVvdXQgKi8KKyAgICBpZiAoKmVwa3Rtc2cpCQkJLyogTWVzc2FnZSBmcm9tIEVycm9yIHBhY2tldCAqLworICAgICAgcyA9IChjaGFyICopZXBrdG1zZzsKKyAgICBpZiAoISpzKSB7CQkJCS8qIElmIG5vdCB0aGVyZSB0aGVuIG1heWJlIGhlcmUgKi8KKwlzID0gKGNoYXIgKilyZGF0YXA7CisJY2tzdHJuY3B5KChjaGFyICopZXBrdG1zZywoY2hhciAqKXJkYXRhcCxQS1RNU0dMRU4pOworICAgIH0KKyAgICBpZiAoISpzKQkJCQkvKiBIb3BlZnVsbHkgd2UnbGwgbmV2ZXIgc2VlIHRoaXMuICovCisgICAgICBzID0gIlVua25vd24gZXJyb3IiOworICAgIHN1Y2Nlc3MgPSAwOwkJCS8qIEZvciBJRiBTVUNDRVNTL0ZBSUwuICovCisgICAgZGVidWcoRjEwMSwiY2tjcHJvLncganVzdG9uZSBhdCBFIHBrdCIsIiIsanVzdG9uZSk7CisKKyAgICBzdWNjZXNzID0gMDsJCQkvKiBUcmFuc2ZlciBmYWlsZWQgKi8KKyAgICB4ZmVyc3RhdCA9IHN1Y2Nlc3M7CQkJLyogUmVtZW1iZXIgdHJhbnNmZXIgc3RhdHVzICovCisgICAgaWYgKCFlcGt0c2VudCkgeworCXggPSBxdWlldDsgcXVpZXQgPSAxOwkJLyogQ2xvc2UgZmlsZXMgc2lsZW50bHksICovCisJZXBrdHJjdmQgPSAxOwkJCS8qIFByZXZlbnQgbWVzc2FnZXMgZnJvbSBjbHNvZigpICovCisJY2xzaWYoKTsKKwljbHNvZigxKTsgCQkJLyogZGlzY2FyZGluZyBhbnkgb3V0cHV0IGZpbGUuICovCisJZXJtc2cocyk7CQkJLyogSXNzdWUgdGhlIG1lc3NhZ2UgKGNhbGxzIHNjcmVlbikuICovCisJcXVpZXQgPSB4OwkJCS8qIFJlc3RvcmUgcXVpZXQgc3RhdGUgKi8KKyAgICB9CisgICAgdHN0YXRzKCk7CQkJCS8qIEdldCBzdGF0cyAqLworLyoKKyAgSWYgd2UgYXJlIGV4ZWN1dGluZyBjb21tYW5kcyBmcm9tIGEgY29tbWFuZCBmaWxlIG9yIG1hY3JvLCBsZXQgdGhlIGNvbW1hbmQKKyAgZmlsZSBvciBtYWNybyBkZWNpZGUgd2hldGhlciB0byBleGl0LCBiYXNlZCBvbiBTRVQgeyBUQUtFLCBNQUNSTyB9IEVSUk9SLgorKi8KKyAgICBpZiAoCisjaWZuZGVmIE5PSUNQCisJIXhjbWRzcmMgJiYKKyNlbmRpZiAvKiBOT0lDUCAqLworCWJhY2tncmQgJiYgIXNlcnZlcikKKyAgICAgIGZhdGFsKCJQcm90b2NvbCBlcnJvciIpOworICAgIHhpdHN0YSB8PSAod2hhdCAmIFdfS0VSTUlUKTsJLyogU2F2ZSB0aGlzIGZvciBkb2V4aXQoKS4gKi8KKyNpZmRlZiBDS19UTVBESVIKKy8qIElmIHdlIHdlcmUgY2QnZCB0ZW1wb3JhcmlseSB0byBhbm90aGVyIGRldmljZSBvciBkaXJlY3RvcnkgLi4uICovCisgICAgaWYgKGZfdG1wZGlyKSB7CisJaW50IHg7CisJeCA9IHpjaGRpcigoY2hhciAqKSBzYXZkaXIpOwkvKiAuLi4gcmVzdG9yZSBwcmV2aW91cyBkaXJlY3RvcnkgKi8KKwlmX3RtcGRpciA9IDA7CQkJLyogYW5kIHJlbWVtYmVyIHdlIGRpZCBpdC4gKi8KKwlkZWJ1ZyhGMTExLCJja2Nwcm8udyBFIHRtcGRpciByZXN0b3JlZCIsc2F2ZGlyLHgpOworICAgIH0KKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKyNpZmRlZiBJS1NEQgorICAgIGlmIChpa2Rib3Blbikgc2xvdHN0YXRlKHdoYXQsIkVSUk9SIiwgKGNoYXIgKillcGt0bXNnLCAiIik7CisjZW5kaWYgLyogSUtTREIgKi8KKyAgICBSRVNVTUU7Cit9CisKK3EgeyBzdWNjZXNzID0gMDsgUVVJVDsgfQkJLyogQ3RybC1DIG9yIGNvbm5lY3Rpb24gbG9zcy4gKi8KKworLiB7CQkJCQkvKiBBbnl0aGluZyBub3QgYWNjb3VudGVkIGZvciBhYm92ZSAqLworICAgIGVycnBrdCgoQ0hBUiAqKSJVbmV4cGVjdGVkIHBhY2tldCB0eXBlIik7IC8qIEdpdmUgZXJyb3IgbWVzc2FnZSAqLworICAgIHdpbmRvdygxKTsKKyAgICB4aXRzdGEgfD0gKHdoYXQgJiBXX0tFUk1JVCk7CS8qIFNhdmUgdGhpcyBmb3IgZG9leGl0KCkuICovCisgICAgUkVTVU1FOwkJCQkvKiBhbmQgcXVpdCAqLworfQorCislJQorCisvKgorICBGcm9tIGhlcmUgZG93biB0byBwcm90bygpIGFyZSByb3V0aW5lcyB0aGF0IHdlcmUgbW92ZWQgb3V0IG9mIHRoZSBzdGF0ZQorICB0YWJsZSBzd2l0Y2hlciBiZWNhdXNlIHRoZSByZXN1bHRpbmcgc3dpdGNoKCkgaGFkIGJlY29tZSB0b28gbGFyZ2UuCisgIFRvIG1vdmUgdGhlIGNvbnRlbnRzIG9mIGEgc3RhdGUtdGFibGUgY2FzZSB0byBhIHJvdXRpbmU6CisgICAgMS4gQWRkIGEgcHJvdG90eXBlIHRvIHRoZSBsaXN0IGFib3ZlIHRoZSBzdGF0ZSB0YWJsZSBzd2l0Y2hlci4KKyAgICAyLiBNYWtlIGEgcm91dGluZSB3aXRoIGFuIGFwcHJvcHJpYXRlIG5hbWUsIHJldHVybmluZyBpbnQuCisgICAgMy4gTW92ZSB0aGUgY29kZSBpbnRvIGl0LgorICAgIDQuIFB1dCBhIGNhbGwgdG8gdGhlIG5ldyByb3V0aW5lIGluIHRoZSBmb3JtZXIgc3BvdDoKKyAgICAgICAgIHJjID0gbmFtZV9vZl9yb3V0aW5lKCk7CisgICAgICAgICBpZiAocmMgPiAtMSkgcmV0dXJuKHJjKTsKKyAgICA1LiBBZGQgInJldHVybigtMSk7IiBhZnRlciBldmVyeSBSRVNVTUUsIFNFUlZFLCBvciBCRUdJTiBtYWNybyBhbmQKKyAgICAgICBhdCB0aGUgZW5kIGlmIHRoZSBjb2RlIGlzIG9wZW4tZW5kZWQuCisqLworc3RhdGljIGludAorcmN2X2ZpcnN0ZGF0YSgpIHsKKyAgICBleHRlcm4gaW50IGRpc3BvczsKKyAgICBkZWJ1ZyhGMTAxLCJyY3ZfZmlyc3RkYXRhIiwiIixkaXNwb3MpOworCisgICAgaWYgKGRpc2NhcmQpIHsJCQkvKiBpZiB3ZSdyZSBkaXNjYXJkaW5nIHRoZSBmaWxlICovCisJYWNrMSgoQ0hBUiAqKSJYIik7CQkvKiBqdXN0IGFjayB0aGUgZGF0YSBsaWtlIHRoaXMuICovCisJY2FuY2VsKys7CQkJLyogYW5kIGNvdW50IGl0ICovCisJQkVHSU4gcmRwa3Q7CQkJLyogYW5kIHdhaXQgZm9yIG1vcmUgZGF0YSBwYWNrZXRzLiAqLworCXJldHVybigtMSk7CisgICAgfSBlbHNlIHsJCQkJLyogTm90IGRpc2NhcmRpbmcuICovCisJcmZfZXJyID0gIkNhbid0IG9wZW4gZmlsZSI7CisJaWYgKHhmbGcpIHsJCQkvKiBJZiBzY3JlZW4gZGF0YSAqLworCSAgICBpZiAocmVtZmlsZSkgewkJLyogcmVkaXJlY3RlZCB0byBmaWxlICovCisJCWlmIChyZW1waXBlKQkJLyogb3IgcGlwZSAqLworCQkgIHggPSBvcGVuYyhaT0ZJTEUscmVtZGVzdCk7IC8qIFBpcGU6IHN0YXJ0IGNvbW1hbmQgKi8KKwkJZWxzZQorCQkgIHggPSBvcGVuYShyZW1kZXN0LCZpYXR0cik7IC8qIEZpbGU6IG9wZW4gd2l0aCBhdHRyaWJ1dGVzICovCisJICAgIH0gZWxzZSB7CQkJLyogb3RoZXJ3aXNlICovCisJCXggPSBvcGVudCgmaWF0dHIpOwkvKiAib3BlbiIgdGhlIHNjcmVlbiAqLworCSAgICB9CisJfSBlbHNlIHsJCQkvKiBvdGhlcndpc2UgKi8KKyNpZmRlZiBDQUxJQlJBVEUKKwkgICAgaWYgKGNhbGlicmF0ZSkgewkJLyogSWYgY2FsaWJyYXRpb24gcnVuICovCisJCXggPSBja29wZW54KCZpYXR0cik7CS8qIG9wZW4gbm90aGluZyAqLworI2lmZGVmIFNUUkVBTUlORworCQlpZiAoc3RyZWFtaW5nKQkJLyogU3RyZWFtaW5nICovCisJCSAgZmFzdGFjaygpOwkJLyogQUNLIHdpdGhvdXQgQUNLaW5nLiAqLworCQllbHNlCisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJCSAgYWNrKCk7CQkvKiBTZW5kIHJlYWwgQUNLICovCisJCUJFR0lOIHJkcGt0OwkJLyogUHJvY2VlZCB0byBuZXh0IHN0YXRlICovCisJCXJldHVybigtMSk7CisJICAgIH0gZWxzZQorI2VuZGlmIC8qIENBTElCUkFURSAqLworI2lmZGVmIFVOSVgKKy8qCisgIEluIFVOSVggd2UgY2FuIHBpcGUgdGhlIGZpbGUgZGF0YSBpbnRvIHRoZSBtYWlsIHByb2dyYW0sIHdoaWNoIGlzIHRvIGJlCisgIHByZWZlcnJlZCB0byB3cml0aW5nIGl0IG91dCB0byBhIHRlbXAgZmlsZSBhbmQgdGhlbiBtYWlsaW5nIGl0IGFmdGVyd2FyZHMuCisgIFRoaXMgZGVwZW5kcyByYXRoZXIgaGVhdmlseSBvbiBhbGwgVU5JWGVzIGhhdmluZyBhIG1haWwgY29tbWFuZCB0aGF0CisgIGFjY2VwdHMgJy1zICJzdWJqZWN0Iicgb24gdGhlIGNvbW1hbmQgbGluZS4gIE1BSUxDTUQgKGUuZy4gbWFpbCwgTWFpbCwgbWFpbHgpCisgIGlzIGRlZmluZWQgaW4gY2t1ZmlvLmMuCisqLworCSAgICBpZiAoZGlzcG9zID09ICdNJykgewkvKiBNYWlsLi4uICovCisJCWNoYXIgKnM7CisJCWNoYXIgKiB0bXAgPSBOVUxMOworCQlpbnQgbiA9IDA7CisJCWV4dGVybiBjaGFyICpNQUlMQ01EOworCQlzID0gaWF0dHIuZGlzcC52YWwgKyAxOworCQluID0gKGludClzdHJsZW4oTUFJTENNRCkgKyAgICAvKiBNYWlsIGNvbW1hbmQgKi8KKwkJICAoaW50KXN0cmxlbihzKSArCSAgICAgIC8qIGFkZHJlc3MgKi8KKwkJICAoaW50KXN0cmxlbihvZmlsbmFtKSArIDMyOyAgLyogc3ViamVjdCAqLworCQlpZiAodG1wID0gKGNoYXIgKiltYWxsb2MobikpIHsKKwkJICAgIGNrbWFreG1zZyh0bXAsbiwKKwkJCSAgICAgIE1BSUxDTUQsIiAtcyBcIiIsb2ZpbG5hbSwiXCIgIixzLAorCQkJICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisJCSAgICBkZWJ1ZyhGMTExLCJyY3ZfZmlyc2RhdGEgbWFpbCIsdG1wLChpbnQpc3RybGVuKHRtcCkpOworCQkgICAgeCA9IG9wZW5jKFpPRklMRSwoY2hhciAqKXRtcCk7CisJCSAgICBmcmVlKHRtcCk7CisJCX0gZWxzZQorCQkgIHggPSAwOworCSAgICB9IGVsc2UgaWYgKGRpc3BvcyA9PSAnUCcpIHsgLyogRGl0dG8gZm9yIHByaW50ICovCisJCWNoYXIgKiB0bXAgPSBOVUxMOworCQlpbnQgbjsKKwkJZXh0ZXJuIGNoYXIgKlBSSU5UQ01EOworCQluID0gKGludClzdHJsZW4oUFJJTlRDTUQpICsgKGludClzdHJsZW4oaWF0dHIuZGlzcC52YWwrMSkgKyA0OworCQlpZiAodG1wID0gKGNoYXIgKiltYWxsb2MobikpIHsKKwkJICAgIHNwcmludGYodG1wLAkvKiBzYWZlIChwcmVjaGVja2VkKSAqLworCQkJICAgICIlcyAlcyIsIFBSSU5UQ01ELCBpYXR0ci5kaXNwLnZhbCArIDEpOworCQkgICAgeCA9IG9wZW5jKFpPRklMRSwoY2hhciAqKXRtcCk7CisJCSAgICBmcmVlKHRtcCk7CisJCX0gZWxzZQorCQkgIHggPSAwOworCSAgICB9IGVsc2UKKyNlbmRpZiAvKiBVTklYICovCisJICAgICAgeCA9IG9wZW5hKGZpbG5hbSwmaWF0dHIpOwkvKiBvcGVuIHRoZSBmaWxlLCB3aXRoIGF0dHJpYnV0ZXMgKi8KKwl9CisJaWYgKHgpIHsJCQkvKiBJZiBmaWxlIHdhcyBvcGVuZWQgb2sgKi8KKwkgICAgaW50IHJjLCBxZjsKKyNpZm5kZWYgTk9TUEwKKwkgICAgcWYgPSBxdWVyeTsKKyNlbHNlCisJICAgIHFmID0gMDsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZkZWYgQ0tUVU5JTkcKKwkgICAgcmMgPSAoYmluYXJ5ICYmICFwYXJpdHkpID8KKwkgICAgICBiZGVjb2RlKHJkYXRhcCxwdXRmaWwpOgorCSAgICAgICBkZWNvZGUocmRhdGFwLCBxZiA/IHB1dHRybSA6IHB1dGZpbCwgMSk7CisjZWxzZQorCSAgICByYyA9IGRlY29kZShyZGF0YXAsIHFmID8gcHV0dHJtIDogcHV0ZmlsLCAxKTsKKyNlbmRpZiAvKiBDS1RVTklORyAqLworCSAgICBpZiAocmMgPCAwKSB7CisJCWVycnBrdCgoQ0hBUiAqKSJFcnJvciB3cml0aW5nIGRhdGEiKTsKKwkJUkVTVU1FOworCQlyZXR1cm4oLTEpOworCSAgICB9CisjaWZkZWYgU1RSRUFNSU5HCisJICAgIGlmIChzdHJlYW1pbmcpCQkvKiBTdHJlYW1pbmcgd2FzIG5lZ290aWF0ZWQgKi8KKwkgICAgICBmYXN0YWNrKCk7CQkvKiBBQ0sgd2l0aG91dCBBQ0tpbmcuICovCisJICAgIGVsc2UKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKwkgICAgICBhY2soKTsJCQkvKiBhY2tub3dsZWRnZSBpdCAqLworCSAgICBCRUdJTiByZHBrdDsJCS8qIGFuZCBzd2l0Y2ggdG8gcmVjZWl2ZS1kYXRhIHN0YXRlICovCisJICAgIHJldHVybigtMSk7CisJfSBlbHNlIHsJCQkvKiBvdGhlcndpc2UgKi8KKwkgICAgZXJycGt0KChDSEFSICopIHJmX2Vycik7CS8qIHNlbmQgZXJyb3IgcGFja2V0ICovCisgICAgCSAgICBSRVNVTUU7CQkJLyogYW5kIHF1aXQuICovCisJICAgIHJldHVybigtMSk7CisJfQorICAgIH0KK30KKworc3RhdGljIGludAorcmN2X3Nob3J0cmVwbHkoKSB7CisjaWZkZWYgUEtUWkVST0hBQ0sKKyAgICBzdWNjZXNzID0gMDsKKyAgICBkZWJ1ZyhGMTExLCJyY3Zfc2hvcnRyZXBseSIscmRhdGFwLGlwa3RsZW4pOworICAgIGlmIChpcGt0YWNrWzBdICYmICFzdHJuY21wKGlwa3RhY2ssKGNoYXIgKilyZGF0YXAsaXBrdGxlbikpIHsKKwkvKiBObyBpdCdzIHRoZSBBQ0sgdG8gdGhlIEkgcGFja2V0IGFnYWluICovCisJeCA9IHNjbWQodmNtZCwoQ0hBUiAqKWNtYXJnKTsJLyogU28gc2VuZCB0aGUgUkVNT1RFIGNvbW1hbmQgYWdhaW4gKi8KKwkvKiBNYXliZSB0aGlzIHNob3VsZCBiZSByZXNlbmQoKSAqLworCWRlYnVnKEYxMTAsIklQS1RaRVJPSEFDSyIsaXBrdGFjayx4KTsKKwlpZiAoeCA8IDApIHsKKwkgICAgZXJycGt0KChDSEFSICopc3JpbXNnKTsKKwkgICAgUkVTVU1FOworCSAgICByZXR1cm4oLTEpOworCX0KKyAgICB9IGVsc2UgeworCWlwa3RhY2tbMF0gPSBOVUw7CisjZW5kaWYgLyogUEtUWkVST0hBQ0sgKi8KKwl1cnNlcnZlciA9IDE7CisjaWZuZGVmIE5PU0VSVkVSCisjaWZuZGVmIE5PU1BMCisJaWYgKHF1ZXJ5KSB7CQkJLyogSWYgdG8gcXVlcnksICovCisJICAgIHFidWZwID0gcXVlcnlidWY7CQkvKiAgaW5pdGlhbGl6ZSBxdWVyeSByZXNwb25zZSBidWZmZXIgKi8KKwkgICAgcWJ1Zm4gPSAwOworCSAgICBxdWVyeWJ1ZlswXSA9IE5VTDsKKwl9CisjZW5kaWYgLyogTk9TUEwgKi8KKwl4ID0gMTsKKwlpZiAocmVtZmlsZSkgewkJCS8qIFJlc3BvbnNlIHJlZGlyZWN0ZWQgdG8gZmlsZSAqLworCSAgICByZl9lcnIgPSAiQ2FuJ3Qgb3BlbiBmaWxlIjsKKwkgICAgaWYgKHJlbXBpcGUpCQkvKiBvciBwaXBlICovCisJICAgICAgeCA9CisjaWZuZGVmIE5PUFVTSAorCQl6eGNtZChaT0ZJTEUscmVtZGVzdCkJLyogUGlwZTogU3RhcnQgY29tbWFuZCAqLworI2Vsc2UKKwkJMAorI2VuZGlmIC8qIE5PUFVTSCAqLworCQk7CisJICAgIGVsc2UKKwkgICAgICB4ID0gb3BlbmEocmVtZGVzdCwmaWF0dHIpOyAvKiBGaWxlOiBPcGVuIHdpdGggYXR0cmlidXRlcyAqLworCSAgICBkZWJ1ZyhGMTExLCJyY3Zfc2hvcnRyZXBseSByZW1maWxlIixyZW1kZXN0LHgpOworCX0gZWxzZSB7CisJICAgIHggPSBvcGVudCgmaWF0dHIpOwkJLyogIm9wZW4iIHRoZSBzY3JlZW4gKi8KKwl9CisJaWYgKHgpIHsJCQkvKiBJZiBmaWxlIHdhcyBvcGVuZWQgb2sgKi8KKwkgICAgaWYgKGRlY29kZShyZGF0YXAsCisjaWZuZGVmIE5PU1BMCisJCSAgICAgICAocXVlcnkgfHwgIXJlbWZpbGUpID8gcHV0dHJtIDoKKyNlbHNlCisJCSAgICAgICAhcmVtZmlsZSA/IHB1dHRybSA6CisjZW5kaWYgLyogTk9TUEwgKi8KKwkJICAgICAgIHpwdXRmaWwsIDEpIDwgMCkgeyAvKiBOb3RlOiB6cHV0ZmlsLCBub3QgcHV0ZmlsLiAqLworCQllcnJwa3QoKENIQVIgKikiRXJyb3Igd3JpdGluZyBkYXRhIik7CisJCVJFU1VNRTsKKwkJcmV0dXJuKC0xKTsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKHJkYXRhcCkJCS8qIElmIHdlIGhhZCBkYXRhICovCisJCSAgaWYgKCpyZGF0YXApCQkvKiBhZGQgYSBsaW5lIHRlcm1pbmF0b3IgKi8KKwkJICAgIGlmIChyZW1maWxlKSB7CS8qIHRvIGZpbGUgKi8KKwkJCXpzb3V0bChaT0ZJTEUsIiIpOworCQkgICAgfSBlbHNlIHsJCS8qIG9yIHRvIHNjcmVlbi4gKi8KKyNpZm5kZWYgTk9JQ1AKKwkJCWlmICghcXVlcnkgfHwgIXhjbWRzcmMpCisjZW5kaWYgLyogTk9JQ1AgKi8KKwkJCSAgaWYgKCEocXVpZXQgJiYgcmNkYWN0aXZlKSkKKwkJCSAgICBjb25vbGwoIiIpOworCQkgICAgfQorCQlpZiAoYnllX2FjdGl2ZSAmJiBuZXR3b3JrKSB7IC8qIEkgc2VudCBCWUUgb3IgUkVNT1RFIExPR09VVCAqLworCQkgICAgbXNsZWVwKDUwMCk7CS8qIGNvbW1hbmQgYW5kIGdvdCB0aGUgQUNLLi4uICovCisJCSAgICBieWVfYWN0aXZlID0gMDsKKwkJICAgIHR0Y2xvcygwKTsKKwkJfQorCQljbHNvZigwKTsKKwkJaWYgKCFlcGt0c2VudCAmJiAhZXBrdHJjdmQpIC8qIElmIG5vIGVycm9yIHBhY2tldC4uLiAqLworCQkgIHN1Y2Nlc3MgPSAxOwkJLyogc3VjY2Vzcy4gKi8KKwkJUkVTVU1FOworCQlyZXR1cm4oLTEpOworCSAgICB9CisJfSBlbHNlIHsJCQkvKiBGaWxlIG5vdCBvcGVuZWQgT0sgKi8KKwkgICAgZXJycGt0KChDSEFSICopIHJmX2Vycik7CS8qIHNlbmQgZXJyb3IgbWVzc2FnZSAqLworCSAgICBSRVNVTUU7CQkJLyogYW5kIHF1aXQuICovCisJICAgIHJldHVybigtMSk7CisJfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCisjaWZkZWYgUEtUWkVST0hBQ0sKKyAgICB9CisjZW5kaWYgLyogUEtUWkVST0hBQ0sgKi8KKyAgICBkZWJ1ZyhGMTAxLCJyY3Zfc2hvcnRyZXBseSBmYWxsdGhydSIsIiIsc3VjY2Vzcyk7CisgICAgcmV0dXJuKC0xKTsKK30KKworCitzdGF0aWMgaW50CitzcnZfcXVlcnkoKSB7CisjaWZuZGVmIE5PU0VSVkVSCisjaWZuZGVmIE5PU1BMCisgICAgY2hhciBjOworI2lmZGVmIENLU1lTTE9HCisgICAgaWYgKGNreHN5c2xvZyA+PSBTWVNMR19QUiAmJiBja3hsb2dnaW5nKQorICAgICAgY2tzeXNsb2coU1lTTEdfUFIsIDEsICJzZXJ2ZXIiLCAiUkVNT1RFIFFVRVJZIiwgKGNoYXIgKilzcnZjbWQpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisjaWZkZWYgSUtTREIKKyAgICBpZiAoaWtkYm9wZW4pIHNsb3RzdGF0ZSh3aGF0LCJSRU1PVEUgUVVFUlkiLCAoY2hhciAqKShzcnZjbWQrMiksICIiKTsKKyNlbmRpZiAvKiBJS1NEQiAqLworICAgIGMgPSAqKHNydmNtZCsyKTsJCQkvKiBRID0gUXVlcnksIFMgPSBTZXQgKi8KKyAgICBpZiAoYyA9PSAnUScpIHsJCQkvKiBRdWVyeSAqLworCWlmICghRU5BQkxFRChlbl9xdWUpKSB7IC8qIFNlY3VyaXR5ICovCisJICAgIGVycnBrdCgoQ0hBUiAqKSJSRU1PVEUgUVVFUlkgZGlzYWJsZWQiKTsKKwkgICAgUkVTVU1FOworCSAgICByZXR1cm4oLTEpOworCX0gZWxzZSB7CQkJLyogUXVlcnkgYWxsb3dlZCAqLworCSAgICBpbnQgbjsgY2hhciAqcCwgKnE7CisJICAgIHFidWZwID0gcXVlcnlidWY7CQkvKiBXaXBlIG91dCBvbGQgc3R1ZmYgKi8KKwkgICAgcWJ1Zm4gPSAwOworCSAgICBxdWVyeWJ1ZlswXSA9IE5VTDsKKwkgICAgcCA9IChjaGFyICopIHNydmNtZCArIDM7CS8qIFBvaW50ZXIgZm9yIG1ha2luZyB3cmFwcGVyICovCisJICAgIG4gPSBzdHJsZW4oKGNoYXIgKilzcnZjbWQpOwkvKiBQb3NpdGlvbiBvZiBlbmQgKi8KKwkgICAgYyA9ICooc3J2Y21kKzQpOwkJLyogV2hpY2ggdHlwZSBvZiB2YXJpYWJsZSAqLworCisJICAgIGlmICgqKHNydmNtZCs2KSA9PSBDTURRKSB7CS8qIFN0YXJ0cyB3aXRoIGNvbW1hbmQgcXVvdGU/ICovCisJCXAgPSAoY2hhciAqKSBzcnZjbWQgKyA2OyAvKiBUYWtlIGl0IGxpdGVyYWxseSAqLworCQlpZiAoKnAgPT0gQ01EUSkgcCsrOworCSAgICB9IGVsc2UgewkJCS8qIFRoZXkgcGxheWVkIGJ5IHRoZSBydWxlcyAqLworCQlpZiAoYyA9PSAnSycpIHsJCS8qIEtlcm1pdCB2YXJpYWJsZSAqLworCQkgICAgaW50IGs7CisJCSAgICBrID0gKGludCkgc3RybGVuKHApOworCQkgICAgaWYgKGsgPiAwICYmIHBbay0xXSA9PSAnKScpIHsKKwkJCXAgPSAoY2hhciAqKShzcnZjbWQgKyA0KTsKKwkJCSooc3J2Y21kKzQpID0gQ01EUTsKKwkJCSooc3J2Y21kKzUpID0gJ2YnOyAvKiBGdW5jdGlvbiwgc28gbWFrZSBpdCBcZi4uLigpICovCisJCSAgICB9IGVsc2UgeworCQkJKihzcnZjbWQrMykgPSBDTURROyAvKiBTdHVmZiB3cmFwcGluZyBpbnRvIGJ1ZmZlciAqLworCQkJKihzcnZjbWQrNCkgPSAndic7ICAvKiBWYXJpYWJsZSwgc28gbWFrZSBpdCBcdiguLi4pICovCisJCQkqKHNydmNtZCs1KSA9ICcoJzsgIC8qIGFyb3VuZCB2YXJpYWJsZSBuYW1lICovCisJCQkqKHNydmNtZCtuKSA9ICcpJzsKKwkJCSooc3J2Y21kK24rMSkgPSBOVUw7CisJCSAgICB9CisJCX0gZWxzZSB7CisJCSAgICAqKHNydmNtZCszKSA9IENNRFE7IC8qIFN0dWZmIHdyYXBwaW5nIGludG8gYnVmZmVyICovCisJCSAgICAqKHNydmNtZCs0KSA9ICd2JzsgLyogIFZhcmlhYmxlLCBzbyBtYWtlIGl0IFx2KC4uLikgKi8KKwkJICAgICooc3J2Y21kKzUpID0gJygnOwkvKiBhcm91bmQgdmFyaWFibGUgbmFtZSAqLworCQkgICAgKihzcnZjbWQrbikgPSAnKSc7CisJCSAgICAqKHNydmNtZCtuKzEpID0gTlVMOworCQkgICAgaWYgKGMgPT0gJ1MnKSB7CS8qIFN5c3RlbSB2YXJpYWJsZSAqLworCQkJKihzcnZjbWQrNCkgPSAnJCc7IC8qICBzbyBpdCdzIFwkKC4uLikgKi8KKwkJICAgIH0gZWxzZSBpZiAoYyA9PSAnRycpIHsgLyogTm9uLVwgR2xvYmFsIHZhcmlhYmxlICovCisJCQkqKHNydmNtZCs0KSA9ICdtJzsgLyogIHNvIHdyYXAgaXQgaW4gXG0oLi4uKSAqLworCQkgICAgfQorCQl9CisJICAgIH0JCQkJLyogTm93IGV2YWx1YXRlIGl0ICovCisJICAgIG4gPSBRQlVGTDsJCQkvKiBNYXggbGVuZ3RoICovCisJICAgIHEgPSBxdWVyeWJ1ZjsJCS8qIFdoZXJlIHRvIHB1dCBpdCAqLworCSAgICBpZiAoenpzdHJpbmcocCwmcSwmbikgPCAwKSB7CisJCWVycnBrdCgobiA+IDApID8gKENIQVIgKikiQ2FuJ3QgZ2V0IHZhbHVlIgorCQkgICAgICAgICAgICAgICA6IChDSEFSICopIlZhbHVlIHRvbyBsb25nIgorCQkgICAgICAgKTsKKwkJUkVTVU1FOworCQlyZXR1cm4oLTEpOworCSAgICB9IGVsc2UgeworCQlpZiAoZW5jc3RyKChDSEFSICopcXVlcnlidWYpID4gLTEpIHsgLyogRW5jb2RlIGl0ICovCisJCSAgICBhY2sxKGRhdGEpOwkJLyogSWYgaXQgZml0cywgc2VuZCBpdCBiYWNrIGluIEFDSyAqLworCQkgICAgc3VjY2VzcyA9IDE7CisJCSAgICBSRVNVTUU7CisJCSAgICByZXR1cm4oLTEpOworCQl9IGVsc2UgaWYgKHNuZHN0cmluZyhxdWVyeWJ1ZikpIHsgLyogTG9uZyBmb3JtIHJlc3BvbnNlICovCisJCSAgICBCRUdJTiBzc2luaXQ7CisJCSAgICByZXR1cm4oLTEpOworCQl9IGVsc2UgewkJLyogc25kaGxwKCkgZmFpbHMgKi8KKwkJICAgIGVycnBrdCgoQ0hBUiAqKSJDYW4ndCBzZW5kIHZhbHVlIik7CisJCSAgICBSRVNVTUU7CisJCSAgICByZXR1cm4oLTEpOworCQl9CisJICAgIH0KKwl9CisgICAgfSBlbHNlIGlmIChjID09ICdTJykgewkJLyogU2V0IChhc3NpZ24pICovCisJaWYgKCFFTkFCTEVEKGVuX2FzZykpIHsJCS8qIFNlY3VyaXR5ICovCisJICAgIGVycnBrdCgoQ0hBUiAqKSJSRU1PVEUgQVNTSUdOIGRpc2FibGVkIik7CisJICAgIFJFU1VNRTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9IGVsc2UgewkJCS8qIE9LICovCisJICAgIGludCBuOworCSAgICBuID0geHVuY2hhcigqKHNydmNtZCszKSk7CS8qIExlbmd0aCBvZiBuYW1lICovCisJICAgIG4gPSAzICsgbiArIDE7CQkvKiBQb3NpdGlvbiBvZiBsZW5ndGggb2YgdmFsdWUgKi8KKwkgICAgKihzcnZjbWQrbikgPSBOVUw7CQkvKiBEb24ndCBuZWVkIGl0ICovCisJICAgIGlmIChhZGRtYWMoKGNoYXIgKikoc3J2Y21kKzQpLChjaGFyICopKHNydmNtZCtuKzEpKSA8IDApCisJICAgICAgZXJycGt0KChDSEFSICopIlJFTU9URSBBU1NJR04gZmFpbGVkIik7CisJICAgIGVsc2UgeworCQlhY2soKTsKKwkJc3VjY2VzcyA9IDE7CisJICAgIH0KKwkgICAgUkVTVU1FOworCSAgICByZXR1cm4oLTEpOworCX0KKyAgICB9IGVsc2UgeworCWVycnBrdCgoQ0hBUiAqKSJCYWRseSBmb3JtZWQgc2VydmVyIGNvbW1hbmQiKTsKKwlSRVNVTUU7CisJcmV0dXJuKC0xKTsKKyAgICB9CisjZWxzZQorICAgIGVycnBrdCgoQ0hBUiAqKSJWYXJpYWJsZSBxdWVyeS9zZXQgbm90IGF2YWlsYWJsZSIpOworICAgIFJFU1VNRTsKKyAgICByZXR1cm4oLTEpOworI2VuZGlmIC8qIE5PU1BMICovCisjZW5kaWYgLyogTk9TRVJWRVIgKi8KK30KKworc3RhdGljIGludAorc3J2X2NvcHkoKSB7CisjaWZuZGVmIE5PU0VSVkVSCisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisgICAgICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJSRU1PVEUgQ09QWSIsIChjaGFyICopc3J2Y21kKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworI2lmZGVmIFpDT1BZCisgICAgaWYgKCFFTkFCTEVEKGVuX2NweSkpIHsKKwllcnJwa3QoKENIQVIgKikiUkVNT1RFIENPUFkgZGlzYWJsZWQiKTsKKwlSRVNVTUU7CisJcmV0dXJuKC0xKTsKKyAgICB9IGVsc2UgeworCWNoYXIgKnN0cjEsICpzdHIyLCBmMVsyNTZdLCBmMlsyNTZdOworCWludCAgbGVuMSwgbGVuMjsKKyAgICAgICAgbGVuMSA9IHh1bmNoYXIoc3J2Y21kWzFdKTsJLyogU2VwYXJhdGUgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgbGVuMiA9IHh1bmNoYXIoc3J2Y21kWzIrbGVuMV0pOworICAgICAgICBzdHJuY3B5KGYxLChjaGFyICopKHNydmNtZCsyKSxsZW4xKTsKKyAgICAgICAgZjFbbGVuMV0gPSBOVUw7CisgICAgICAgIHN0cm5jcHkoZjIsKGNoYXIgKikoc3J2Y21kKzMrbGVuMSksbGVuMik7CisgICAgICAgIGYyW2xlbjJdID0gTlVMOworI2lmZGVmIElLU0RCCisJaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwiUkVNT1RFIENPUFkiLCBmMSwgZjIpOworI2VuZGlmIC8qIElLU0RCICovCisJaWYgKCFFTkFCTEVEKGVuX2N3ZCkpIHsJCS8qIElmIENXRCBpcyBkaXNhYmxlZCAqLworCSAgICB6c3RyaXAoZjEsJnN0cjEpOwkJLyogYW5kIHRoZXkgaW5jbHVkZWQgYSBwYXRobmFtZSwgKi8KKyAgICAgICAgICAgIHpzdHJpcChmMiwmc3RyMik7CisJICAgIGlmIChzdHJjbXAoZjEsc3RyMSkgfHwgc3RyY21wKGYyLHN0cjIpKSB7IC8qIFJlZnVzZS4gKi8KKwkJZXJycGt0KChDSEFSICopIkFjY2VzcyBkZW5pZWQiKTsKKwkJUkVTVU1FOwkJCS8qIFJlbWVtYmVyLCB0aGlzIGlzIG5vdCBhIGdvdG8hICovCisJCXJldHVybigtMSk7CisJICAgIH0KKwl9CisJaWYgKHN0YXRlID09IGdlbmVyaWMpIHsJCS8qIEl0J3MgT0sgdG8gZ28gYWhlYWQuICovCisgICAgICAgICAgICBpZiAoemNvcHkoZjEsZjIpKSB7CQkvKiBUcnkgKi8KKwkJZXJycGt0KChDSEFSICopIkNhbid0IGNvcHkgZmlsZSIpOyAvKiBnaXZlIGVycm9yIG1lc3NhZ2UgKi8KKwkgICAgfSBlbHNlIHsKKwkJc3VjY2VzcyA9IDE7CisJCWFjaygpOworCSAgICB9CisgICAgICAgICAgICBSRVNVTUU7CQkJLyogd2FpdCBmb3IgbmV4dCBzZXJ2ZXIgY29tbWFuZCAqLworCSAgICByZXR1cm4oLTEpOworCX0KKyAgICB9CisgICAgcmV0dXJuKC0xKTsKKyNlbHNlIC8qIG5vIFpDT1BZICovCisgICAgZXJycGt0KChDSEFSICopIlJFTU9URSBDT1BZIG5vdCBhdmFpbGFibGUiKTsgLyogZ2l2ZSBlcnJvciBtZXNzYWdlICovCisgICAgUkVTVU1FOwkJCQkvKiB3YWl0IGZvciBuZXh0IHNlcnZlciBjb21tYW5kICovCisgICAgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBaQ09QWSAqLworI2VuZGlmIC8qIE5PU0VSVkVSICovCit9CisKK3N0YXRpYyBpbnQKK3Nydl9yZW5hbWUoKSB7CisjaWZuZGVmIE5PU0VSVkVSCisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisgICAgICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJSRU1PVEUgUkVOQU1FIiwgKGNoYXIgKilzcnZjbWQpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisjaWZkZWYgWlJFTkFNRQorICAgIGlmICghRU5BQkxFRChlbl9yZW4pKSB7CisJZXJycGt0KChDSEFSICopIlJFTU9URSBSRU5BTUUgZGlzYWJsZWQiKTsKKwlSRVNVTUU7CisJcmV0dXJuKC0xKTsKKyAgICB9IGVsc2UgewkJCQkvKiBSRU5BTUUgaXMgZW5hYmxlZCAqLworCWNoYXIgKnN0cjEsICpzdHIyLCBmMVsyNTZdLCBmMlsyNTZdOworCWludCBsZW4xLCBsZW4yOworCWxlbjEgPSB4dW5jaGFyKHNydmNtZFsxXSk7CS8qIFNlcGFyYXRlIHRoZSBwYXJhbWV0ZXJzICovCisJbGVuMiA9IHh1bmNoYXIoc3J2Y21kWzIrbGVuMV0pOworCXN0cm5jcHkoZjEsKGNoYXIgKikoc3J2Y21kKzIpLGxlbjEpOworCWYxW2xlbjFdID0gTlVMOworCXN0cm5jcHkoZjIsKGNoYXIgKikoc3J2Y21kKzMrbGVuMSksbGVuMik7CisJZjJbbGVuMl0gPSBOVUw7CisJbGVuMiA9IHh1bmNoYXIoc3J2Y21kWzIrbGVuMV0pOworCXN0cm5jcHkoZjEsKGNoYXIgKikoc3J2Y21kKzIpLGxlbjEpOworCWYxW2xlbjFdID0gTlVMOworCXN0cm5jcHkoZjIsKGNoYXIgKikoc3J2Y21kKzMrbGVuMSksbGVuMik7CisJZjJbbGVuMl0gPSBOVUw7CisjaWZkZWYgSUtTREIKKwlpZiAoaWtkYm9wZW4pIHNsb3RzdGF0ZSh3aGF0LCJSRU1PVEUgUkVOQU1FIiwgZjEsIGYyKTsKKyNlbmRpZiAvKiBJS1NEQiAqLworCWlmICghRU5BQkxFRChlbl9jd2QpKSB7CQkvKiBJZiBDV0QgaXMgZGlzYWJsZWQgKi8KKwkgICAgenN0cmlwKGYxLCZzdHIxKTsJCS8qIGFuZCB0aGV5IGluY2x1ZGVkIGEgcGF0aG5hbWUsICovCisJICAgIHpzdHJpcChmMiwmc3RyMik7CisJICAgIGlmICggc3RyY21wKGYxLHN0cjEpIHx8IHN0cmNtcChmMixzdHIyKSApIHsgLyogcmVmdXNlLiAqLworCQllcnJwa3QoKENIQVIgKikiQWNjZXNzIGRlbmllZCIpOworCQlSRVNVTUU7CQkJLyogUmVtZW1iZXIsIHRoaXMgaXMgbm90IGEgZ290byEgKi8KKwkJcmV0dXJuKC0xKTsKKwkgICAgfQorCX0KKwlpZiAoc3RhdGUgPT0gZ2VuZXJpYykgewkJLyogSXQncyBPSyB0byBnbyBhaGVhZC4gKi8KKwkgICAgaWYgKHpyZW5hbWUoZjEsZjIpKSB7CS8qIFRyeSAqLworCQllcnJwa3QoKENIQVIgKikiQ2FuJ3QgcmVuYW1lIGZpbGUiKTsgLyogR2l2ZSBlcnJvciBtc2cgKi8KKwkgICAgfSBlbHNlIHsKKwkJc3VjY2VzcyA9IDE7CisJCWFjaygpOworCSAgICB9CisJICAgIFJFU1VNRTsJCQkvKiBXYWl0IGZvciBuZXh0IHNlcnZlciBjb21tYW5kICovCisJICAgIHJldHVybigtMSk7CisJfQorICAgIH0KKyAgICByZXR1cm4oLTEpOworI2Vsc2UgLyogbm8gWlJFTkFNRSAqLworICAgIC8qIEdpdmUgZXJyb3IgbWVzc2FnZSAqLworICAgIGVycnBrdCgoQ0hBUiAqKSJSRU1PVEUgUkVOQU1FIG5vdCBhdmFpbGFibGUiKTsKKyAgICBSRVNVTUU7CQkJCS8qIFdhaXQgZm9yIG5leHQgc2VydmVyIGNvbW1hbmQgKi8KKyAgICByZXR1cm4oLTEpOworI2VuZGlmIC8qIFpSRU5BTUUgKi8KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworfQorCitzdGF0aWMgaW50CitzcnZfbG9naW4oKSB7CisjaWZuZGVmIE5PU0VSVkVSCisgICAgY2hhciBmMVtMT0dJTkxFTisxXSwgZjJbTE9HSU5MRU4rMV0sIGYzW0xPR0lOTEVOKzFdOworICAgIENIQVIgKnA7CisgICAgaW50IGxlbiwgaTsKKworICAgIGRlYnVnKEYxMDEsIlJFTU9URSBMT0dJTiB4X2xvZ2luIiwiIix4X2xvZ2luKTsKKyAgICBkZWJ1ZyhGMTAxLCJSRU1PVEUgTE9HSU4geF9sb2dnZWQiLCIiLHhfbG9nZ2VkKTsKKworICAgIGYxWzBdID0gTlVMOyBmMlswXSA9IE5VTDsgZjNbMF0gPSBOVUw7CisgICAgbGVuID0gMDsKKyAgICBpZiAoc3J2Y21kWzFdKQkJCS8qIEZpcnN0IGxlbmd0aCBmaWVsZCAqLworICAgICAgbGVuID0geHVuY2hhcihzcnZjbWRbMV0pOwkJLyogU2VwYXJhdGUgdGhlIHBhcmFtZXRlcnMgKi8KKworICAgIGlmICh4X2xvZ2luKSB7CQkJLyogTG9naW4gcmVxdWlyZWQgKi8KKwlpZiAoeF9sb2dnZWQpIHsJCQkvKiBBbmQgYWxyZWFkeSBsb2dnZWQgaW4gKi8KKwkgICAgaWYgKGxlbiA+IDApIHsJCS8qIExvZ2dpbmcgaW4gYWdhaW4gKi8KKwkJZXJycGt0KChDSEFSICopIkFscmVhZHkgbG9nZ2VkIGluLiIpOworCSAgICB9IGVsc2UgewkJCS8qIExvZ2dpbmcgb3V0ICovCisJCWRlYnVnKEYxMDEsIlJFTU9URSBMT0dPVVQiLCIiLHhfbG9nZ2VkKTsKKyNpZmRlZiBDS1NZU0xPRworCQlpZiAoY2t4c3lzbG9nID49IFNZU0xHX1BSICYmIGNreGxvZ2dpbmcpCisJCSAgY2tzeXNsb2coU1lTTEdfUFIsIDEsICJzZXJ2ZXIiLCAiUkVNT1RFIExPR09VVCIsIE5VTEwpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisjaWZkZWYgSUtTREIKKwkJaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwiUkVNT1RFIExPR09VVCIsICIiLCAiIik7CisjZW5kaWYgLyogSUtTREIgKi8KKwkJdGxvZyhGMTEwLCJMb2dnZWQgb3V0Iix4X3VzZXIsMCk7CisJCWFjazEoKENIQVIgKikiTG9nZ2VkIG91dCIpOworCQlzdWNjZXNzID0gMTsKKwkJbXNsZWVwKDUwMCk7CisjaWZkZWYgQ0tfTE9HSU4KKwkJeF9sb2dnZWQgPSAwOworI2lmZGVmIElLU0QKKwkJaWYgKGluc2VydmVyKQorCQkgIGNreGxvZ291dCgpOworI2VuZGlmIC8qIElLU0QgKi8KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCSAgICB9CisJfSBlbHNlIHsJCQkvKiBOb3QgbG9nZ2VkIGluIHlldCAqLworCSAgICBkZWJ1ZyhGMTAxLCJSRU1PVEUgTE9HSU4gbGVuIiwiIixsZW4pOworCSAgICBpZiAobGVuID4gMCkgewkJLyogSGF2ZSB1c2VybmFtZSAqLworI2lmZGVmIENLU1lTTE9HCisJCWlmIChja3hzeXNsb2cgPj0gU1lTTEdfUFIgJiYgY2t4bG9nZ2luZykKKwkJICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJSRU1PVEUgTE9HSU4iLCBOVUxMKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworCQlpZiAobGVuID4gTE9HSU5MRU4pIHsKKwkJICAgIGVycnBrdCgoQ0hBUiAqKSJVc2VybmFtZSB0b28gbG9uZyIpOworCQl9CisJCXAgPSBzcnZjbWQgKyAyOwkJLyogUG9pbnQgdG8gaXQgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSAvKiBDb3B5IGl0ICovCisJCSAgZjFbaV0gPSBwW2ldOworCQlmMVtsZW5dID0gTlVMOwkJLyogVGVybWluYXRlIGl0ICovCisJCXAgKz0gbGVuOwkJLyogUG9pbnQgdG8gbmV4dCBsZW5ndGggZmllbGQgKi8KKwkJaWYgKCpwKSB7CQkvKiBJZiB3ZSBoYXZlIG9uZSAqLworCQkgICAgbGVuID0geHVuY2hhcigqcCsrKTsgLyogZGVjb2RlIGl0ICovCisJCSAgICBpZiAobGVuID4gMCAmJiBsZW4gPD0gTE9HSU5MRU4pIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgLyogU2FtZSBkZWFsIGZvciBwYXNzd29yZCAqLworCQkJICBmMltpXSA9IHBbaV07CisJCQlmMltsZW5dID0gTlVMOworCQkJcCArPSBsZW47CS8qIEFuZCBhY2NvdW50ICovCisJCQlpZiAoKnApIHsKKwkJCSAgICBsZW4gPSB4dW5jaGFyKCpwKyspOworCQkJICAgIGlmIChsZW4gPiAwICYmIGxlbiA8PSBMT0dJTkxFTikgeworCQkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCQkgIGYzW2ldID0gcFtpXTsJLyogU2V0IGJ1dCBuZXZlciB1c2VkICovCisJCQkJZjNbbGVuXSA9IE5VTDsgLyogKGJlY2F1c2UgYWNjb3VudCBub3QgdXNlZCkgKi8KKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCX0KKwkJZGVidWcoRjEwMSwiUkVNT1RFIExPR0lOIDEiLCIiLHhfbG9nZ2VkKTsKKyNpZmRlZiBJS1NECisjaWZkZWYgQ0tfTE9HSU4KKwkJaWYgKGluc2VydmVyKSB7CQkvKiBMb2cgaW4gdG8gc3lzdGVtIGZvciByZWFsICovCisJCSAgICB4X2xvZ2dlZCA9IGNreGxvZ2luKChDSEFSICopZjEsKENIQVIgKilmMixOVUxMLDApOworCQkgICAgZGVidWcoRjEwMSwiUkVNT1RFIExPR0lOIDIiLCIiLHhfbG9nZ2VkKTsKKwkJICAgIGlmICh4X2xvZ2dlZCkgewkvKiBDb3VudCBhdHRlbXB0cyAqLworCQkJbG9ndHJpZXMgPSAwOworCQkJanVzdG9uZSA9IDE7CisJCSAgICB9IGVsc2UgeworCQkJbG9ndHJpZXMrKzsKKwkJCXNsZWVwKGxvZ3RyaWVzKTsKKwkJICAgIH0KKwkJfSBlbHNlCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyNlbmRpZiAvKiBJS1NEICovCisJCSAgaWYgKHhfdXNlciAmJiB4X3Bhc3N3ZCkgeyAvKiBVc2VyIGFuZCBwYXNzd29yZCBtdXN0IG1hdGNoICovCisJCSAgICAgIGlmICghc3RyY21wKHhfdXNlcixmMSkpIC8qIFNFVCBTRVJWRVIgTE9HSU4gKi8KKwkJCWlmICghc3RyY21wKHhfcGFzc3dkLGYyKSkKKwkJCSAgeF9sb2dnZWQgPSAxOworCQkgICAgICBkZWJ1ZyhGMTAxLCJSRU1PVEUgTE9HSU4gMyIsIiIseF9sb2dnZWQpOworCQkgIH0gZWxzZSBpZiAoeF91c2VyKSB7CS8qIE9ubHkgdXNlcm5hbWUgZ2l2ZW4sIG5vIHBhc3N3b3JkICovCisJCSAgICAgIGlmICghc3RyY21wKHhfdXNlcixmMSkpIC8qIHNvIG9ubHkgdXNlcm5hbWUgbXVzdCBtYXRjaCAqLworCQkJeF9sb2dnZWQgPSAxOworCQkgICAgICBkZWJ1ZyhGMTAxLCJSRU1PVEUgTE9HSU4gNCIsIiIseF9sb2dnZWQpOworCQkgIH0KKyNpZmRlZiBDS19MT0dJTiAKKyAgICAgICAgICAgICAgICBlbHNlIHsKKwkJICAgIHhfbG9nZ2VkID0gY2t4bG9naW4oKENIQVIgKilmMSwoQ0hBUiAqKWYyLE5VTEwsMCk7CisJCSAgICBkZWJ1ZyhGMTAxLCJSRU1PVEUgTE9HSU4gNSIsIiIseF9sb2dnZWQpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCQlpZiAoeF9sb2dnZWQpIHsJCS8qIExvZ2dlZCBpbj8gKi8KKwkJICAgIHRsb2coRjExMCwiTG9nZ2VkIGluIiwgeF91c2VyLCAwKTsKKwkJICAgIGlmIChpc2d1ZXN0KQorCQkgICAgICBhY2sxKChDSEFSICopIkxvZ2dlZCBpbiBhcyBndWVzdCAtIHJlc3RyaWN0aW9ucyBhcHBseSIpOworCQkgICAgZWxzZQorCQkgICAgICBhY2sxKChDSEFSICopIkxvZ2dlZCBpbiIpOworCQkgICAgc3VjY2VzcyA9IDE7CisJCX0gZWxzZSB7CisJCSAgICB0bG9nKEYxMTAsIkxvZ2luIGZhaWxlZCIsIGYxLCAwKTsKKwkJICAgIGVycnBrdCgoQ0hBUiAqKSJBY2Nlc3MgZGVuaWVkLiIpOworI2lmZGVmIElLU0QKKyNpZmRlZiBDS19MT0dJTgorCQkgICAgaWYgKGluc2VydmVyICYmIGxvZ3RyaWVzID4gMikKKwkJICAgICAgY2t4bG9nb3V0KCk7CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyNlbmRpZiAvKiBJS1NEICovCisJCX0KKwkgICAgfSBlbHNlIHsJCQkvKiBMT0dPVVQgKi8KKwkJZXJycGt0KChDSEFSICopIkxvZ291dCBpZ25vcmVkIik7CisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsJCQkJLyogTG9naW4gbm90IHJlcXVpcmVkICovCisJaWYgKGxlbiA+IDApCisJICBlcnJwa3QoKENIQVIgKikiTG9naW4gaWdub3JlZC4iKTsKKwllbHNlCisJICBlcnJwa3QoKENIQVIgKikiTG9nb3V0IGlnbm9yZWQuIik7CisgICAgfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCisgICAgUkVTVU1FOworICAgIHJldHVybigtMSk7Cit9CisKK3N0YXRpYyBpbnQKK3Nydl90aW1lb3V0KCkgeworICAgIC8qIEs5NSBkb2VzIHRoaXMgaXRzIG93biB3YXkgKi8KKyAgICBpZiAoaWRsZXRtbykgeworI2lmZGVmIElLU0QKKyAgICAgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgICAgIHByaW50ZigiXHJcbklLU0QgSURMRSBUSU1FT1VUOiAlZCBzZWNcclxuIiwgc3J2aWRsKTsKKyAgICAgICAgICAgZG9leGl0KEdPT0RfRVhJVCx4aXRzdGEpOworICAgICAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCWlkbGV0bW8gPSAwOworCXByaW50ZigiXHJcblNFUlZFUiBJRExFIFRJTUVPVVQ6ICVkIHNlY1xyXG4iLCBzcnZpZGwpOworCXhpdHN0YSB8PSAod2hhdCAmIFdfS0VSTUlUKTsKKwlRVUlUOworICAgIH0KKyNpZm5kZWYgTk9TRVJWRVIKKyAgICBlbHNlIGlmIChmYXRhbGlvKSB7CQkJLyogQ29ubmVjdGlvbiBsb3N0ICovCisjaWZkZWYgQ0tTWVNMT0cKKwkgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfUFIgJiYgY2t4bG9nZ2luZykKKwkgICAgY2tzeXNsb2coU1lTTEdfUFIsIDEsICJzZXJ2ZXIiLCAiQ29ubmVjdGlvbiBsb3N0IiwgTlVMTCk7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyNpZmRlZiBJS1NEQgorCSAgaWYgKGlrZGJvcGVuKSBzbG90c3RhdGUod2hhdCwiU0VSVkVSIERJU0NPTk5FQ1QiLChjaGFyICopc3J2Y21kLCAiIik7CisjZW5kaWYgLyogSUtTREIgKi8KKwl4aXRzdGEgfD0gd2hhdDsKKwlRVUlUOworICAgIH0gZWxzZSBpZiAoaW50ZXJydXB0ZWQpIHsJCS8qIEludGVycnVwdGVkIGJ5IGhhbmQgKi8KKwlpZiAoIUVOQUJMRUQoZW5fZmluKSkgeworCSAgICBlcnJwa3QoKENIQVIgKikiUVVJVCBkaXNhYmxlZCIpOworCSAgICBSRVNVTUU7CisJICAgIHJldHVybigtMSk7CisJfSBlbHNlIHsKKwkgICAgaWYgKHdoYXQgPT0gV19TRU5EIHx8IHdoYXQgPT0gV19SRUNWIHx8IHdoYXQgPT0gV19SRU1PKSB7CisJCXN1Y2Nlc3MgPSAwOworI2lmZGVmIENLU1lTTE9HCisJCWlmIChja3hzeXNsb2cgPj0gU1lTTEdfUFIgJiYgY2t4bG9nZ2luZykKKwkJICBja3N5c2xvZyhTWVNMR19QUiwgMSwgInNlcnZlciIsICJJbnRlcnJ1cHRlZCIsIE5VTEwpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisJICAgIH0gZWxzZSBpZiAod2hhdCA9PSBXX05PVEhJTkcgJiYgZmlsY250ID09IDApIHsKKwkJc3VjY2VzcyA9IDE7CisJICAgIH0gLyogT3RoZXJ3aXNlIGxlYXZlIHN1Y2Nlc3MgYWxvbmUgKi8KKwkgICAgeGl0c3RhIHw9ICh3aGF0ICYgV19LRVJNSVQpOworCSAgICBRVUlUOworCX0KKyAgICB9IGVsc2UgewkJCQkvKiBTaG91bGRuJ3QgaGFwcGVuICovCisJZGVidWcoRjEwMCwiU0VSVkVSICh0b3ApIEdPVCBVTkVYUEVDVEVEICdxJyIsIiIsMCk7CisJUVVJVDsKKyAgICB9CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KK30KKworc3RhdGljIGludAorcmN2X3NfcGt0KCkgeworI2lmbmRlZiBOT1NFUlZFUgorICAgIGlmIChzdGF0ZSA9PSByZ2VuKQorICAgICAgdXJzZXJ2ZXIgPSAxOworICAgIGlmICgvKiBzdGF0ZSA9PSBzZXJ2ZSAmJiAqLyB4X2xvZ2luICYmICF4X2xvZ2dlZCkgeworCWVycnBrdCgoQ0hBUiAqKSJMb2dpbiByZXF1aXJlZCIpOworCVNFUlZFOworICAgIH0gZWxzZQorI2VuZGlmIC8qIE5PU0VSVkVSICovCisgICAgICBpZiAoc3RhdGUgPT0gc2VydmUgJiYgIUVOQUJMRUQoZW5fc2VuKSkgeyAvKiBOb3QgaW4gc2VydmVyIG1vZGUgKi8KKwllcnJwa3QoKENIQVIgKikiU0VORCBkaXNhYmxlZCIpOyAvKiB3aGVuIFNFTkQgaXMgZGlzYWJsZWQuICovCisJUkVTVU1FOworCXJldHVybigtMSk7CisgICAgfSBlbHNlIHsJCQkJLyogT0sgdG8gZ28gYWhlYWQuICovCisjaWZkZWYgQ0tfVE1QRElSCisJaWYgKGRsZGlyICYmICFmX3RtcGRpcikgewkvKiBJZiB0aGV5IGhhdmUgYSBkb3dubG9hZCBkaXJlY3RvcnkgKi8KKwkgICAgZGVidWcoRjExMCwicmVjZWl2ZSBkb3dubG9hZCBkaXIiLGRsZGlyLDApOworCSAgICBpZiAocyA9IHpndGRpcigpKSB7CQkvKiBHZXQgY3VycmVudCBkaXJlY3RvcnkgKi8KKwkJZGVidWcoRjExMCwicmVjZWl2ZSBjdXJyZW50IGRpciIscywwKTsKKwkJaWYgKHpjaGRpcihkbGRpcikpIHsJLyogQ2hhbmdlIHRvIGRvd25sb2FkIGRpcmVjdG9yeSAqLworCQkgICAgZGVidWcoRjEwMCwicmVjZWl2ZSB6Y2hkaXIgb2siLCIiLDApOworCQkgICAgY2tzdHJuY3B5KHNhdmRpcixzLFRNUERJUkxFTik7CisJCSAgICBmX3RtcGRpciA9IDE7CS8qIFJlbWVtYmVyIHRoYXQgd2UgZGlkIHRoaXMgKi8KKwkJfSBlbHNlCisJCSAgZGVidWcoRjEwMCwicmVjZWl2ZSB6Y2hkaXIgZmFpbGVkIiwiIiwwKTsKKwkgICAgfQorCX0KKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKwluYWtzdGF0ZSA9IDE7CQkJLyogQ2FuIHNlbmQgTkFLcyBmcm9tIGhlcmUuICovCisJcmluaXQocmRhdGFwKTsJCQkvKiBTZXQgcGFyYW1ldGVycyAqLworCWJjdHUgPSBiY3RyOwkJCS8qIFN3aXRjaCB0byBhZ3JlZWQtdXBvbiBibG9jayBjaGVjayAqLworCWJjdGwgPSAoYmN0dSA9PSA0KSA/IDIgOiBiY3R1OwkvKiBTZXQgYmxvY2stY2hlY2sgbGVuZ3RoICovCisJd2hhdCA9IFdfUkVDVjsJCQkvKiBSZW1lbWJlciB3ZSdyZSByZWNlaXZpbmcgKi8KKwlsYXN0eGZlciA9IFdfUkVDVjsKKwlyZXNldGMoKTsJCQkvKiBSZXNldCBjb3VudGVycyAqLworCXJ0aW1lcigpOwkJCS8qIFJlc2V0IHRpbWVyICovCisjaWZkZWYgR0ZUSU1FUgorCXJmdGltZXIoKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisJc3RyZWFtb24oKTsKKwlCRUdJTiByZmlsZTsJCQkvKiBHbyBpbnRvIHJlY2VpdmUtZmlsZSBzdGF0ZSAqLworICAgIH0KKyAgICByZXR1cm4oLTEpOworfQorCisKKy8qIEVORCBPRiBST1VUSU5FUyBNT1ZFRCBPVVQgT0YgU1RBVEUgTUFDSElORSAqLworCisKKy8qICBQIFIgTyBUIE8gIC0tICBQcm90b2NvbCBlbnRyeSBmdW5jdGlvbiAgKi8KKworc3RhdGljIGludCBpc190biA9IDA7CQkJLyogSXQncyBhIFRlbG5ldCBjb25uZWN0aW9uICovCisKKyNpZmRlZiBDS19TUEVFRAoraW50IGZfY3RscCA9IDA7CQkJCS8qIENvbnRyb2wtY2hhcmFjdGVyIHByZWZpeCB0YWJsZSAqLworI2lmZGVmIENPTU1FTlQKK3Nob3J0IHNfY3RscFsyNTZdOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBDS19TUEVFRCAqLworCisvKgorICBUaGlzIGlzIHNpbXBseSBhIHdyYXBwZXIgZm9yIHRoZSByZWFsIHByb3RvY29sIGZ1bmN0aW9uIGp1c3QgYmVsb3csCisgIHRoYXQgc2F2ZXMgYW55IGl0ZW1zIHRoYXQgbWlnaHQgYmUgY2hhbmdlZCBhdXRvbWF0aWNhbGx5IGJ5IHByb3RvY29sCisgIG5lZ290aWF0aW9ucyBhbmQgdGhlbiByZXN0b3JlcyB0aGVtIHVwb24gZXhpdCBmcm9tIHByb3RvY29sIG1vZGUuCisqLworVk9JRAorcHJvdG8oKSB7CisgICAgZXh0ZXJuIGludCBiX3NhdmUsIGZfc2F2ZSwgY19zYXZlLCBzc19zYXZlLCBzbG9zdGFydCwgcmVsaWFibGUsIHVyY2xlYXI7CisjaWZuZGVmIE5PQ1NFVFMKKyAgICBleHRlcm4gaW50IGZjaGFyc2V0LCBmY3Nfc2F2ZSwgdGNoYXJzZXQsIHRjc19zYXZlOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmZGVmIFBJUEVTRU5ECisgICAgZXh0ZXJuIGludCBwaXBlc2VuZDsKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgZXh0ZXJuIGludCBjdXJzb3JlbmFbXSwgY3Vyc29yX3NhdmUsIHRlcm1faW87CisgICAgZXh0ZXJuIEJZVEUgdm1vZGU7CisgICAgZXh0ZXJuIGludCBkaXNwbGF5X2RlbW87CisgICAgaW50IHRlcm1faW9fc2F2ZTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZkZWYgVE5DT0RFCisgICAgaW50IF91X2Jpbj0wLCBfbWVfYmluID0gMDsKKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgaW50IC8qIF91X3N0YXJ0PTAsICovIF9tZV9zdGFydCA9IDA7CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworI2VuZGlmIC8qIFROQ09ERSAqLworI2lmZGVmIFBBVFRFUk5TCisgICAgaW50IHBhX3NhdmU7CisgICAgaW50IGk7CisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyAgICBpbnQgc2Nhbl9zYXZlOworCisjaWZkZWYgUEFUVEVSTlMKKyAgICBwYV9zYXZlID0gcGF0dGVybnM7CisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyAgICBzY2FuX3NhdmUgPSBmaWxlcGVlazsKKworICAgIG15am9iID0gc3N0YXRlOworCisjaWZkZWYgQ0tfTE9HSU4KKyAgICBpZiAoaXNndWVzdCkgewkJCS8qIElmIHVzZXIgaXMgYW5vbnltb3VzICovCisJZW5fcHJpID0gMDsJCQkvKiBkaXNhYmxlIHByaW50aW5nICovCisJZW5fbWFpID0gMDsJCQkvKiBhbmQgZGlzYWJsZSBlbWFpbCAqLworCWVuX2RlbCA9IDA7CQkJLyogYW5kIGZpbGUgZGVsZXRpb24gKi8KKyAgICB9CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgY3Vyc29yX3NhdmUgPSBjdXJzb3JlbmFbdm1vZGVdOworICAgIGN1cnNvcmVuYVt2bW9kZV0gPSAwOworICAgIHRlcm1faW9fc2F2ZSA9IHRlcm1faW87CisgICAgdGVybV9pbyA9IDA7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIGJfc2F2ZSA9IGJpbmFyeTsJCQkvKiBTRVQgRklMRSBUWVBFICovCisgICAgZl9zYXZlID0gZm5jbnY7CQkJLyogU0VUIEZJTEUgTkFNRVMgKi8KKyAgICBjX3NhdmUgPSBiY3RyOworICAgIHBfc2F2ZSA9IGZuc3BhdGg7CisgICAgcl9zYXZlID0gcmVjdXJzaXZlOworICAgIHNfdGltaW50ID0gdGltaW50OworICAgIHNzX3NhdmUgPSBzbG9zdGFydDsKKyNpZm5kZWYgTk9DU0VUUworICAgIGZjc19zYXZlID0gZmNoYXJzZXQ7CisgICAgdGNzX3NhdmUgPSB0Y2hhcnNldDsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyNpZmRlZiBDT01NRU5UCisvKiBEb24ndCBkbyB0aGlzIGJlY2F1c2UgdGhlbiB1c2VyIGNhbiBuZXZlciBmaW5kIG91dCB3aGF0IGhhcHBlbmVkLiAqLworI2lmZGVmIENLX1NQRUVECisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgc19jdGxwW2ldID0gY3RscFtpXTsKKyAgICBmX2N0bHAgPSAxOworI2VuZGlmIC8qIENLX1NQRUVEICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIGlmIChyZWxpYWJsZSA9PSBTRVRfT04pCisgICAgICBzbG9zdGFydCA9IDA7CisgICAgaXNfdG4gPSAoIWxvY2FsICYmIHNzdGVsbmV0KQorI2lmZGVmIFROQ09ERQorICAgICAgfHwgKGxvY2FsICYmIG5ldHdvcmsgJiYgdHRucHJvdG8gPT0gTlBfVEVMTkVUKQorI2VuZGlmIC8qIFROQ09ERSAqLworCTsKKyNpZmRlZiBUTkNPREUKKyAgICBpZiAoaXNfdG4pIHsKKyAgICAgICAgaWYgKHRuX2JfeGZlciAmJiAhKHNzdGVsbmV0IHx8IGluc2VydmVyKSkgeworCSAgICAvKiBTYXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIFRlbG5ldCBCaW5hcnkgKi8KKwkgICAgX3VfYmluID0gVEVMT1BUX1UoVEVMT1BUX0JJTkFSWSk7CisJICAgIF9tZV9iaW4gPSBURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSk7CisKKwkgICAgLyogSWYgZWl0aGVyIGRpcmVjdGlvbiBpcyBub3QgQmluYXJ5IGF0dGVtcHQgdG8gbmVnb3RpYXRlIGl0ICovCisJICAgIGlmICghX3VfYmluICYmIFRFTE9QVF9VX01PREUoVEVMT1BUX0JJTkFSWSkgIT0gVE5fTkdfUkYpIHsKKwkJdG5fc29wdChETyxURUxPUFRfQklOQVJZKTsKKwkJVEVMT1BUX1VOQU5TV0VSRURfRE8oVEVMT1BUX0JJTkFSWSkgPSAxOworCSAgICB9CisJICAgIGlmICghX21lX2JpbiAmJiBURUxPUFRfTUVfTU9ERShURUxPUFRfQklOQVJZKSAhPSBUTl9OR19SRikgeworCQl0bl9zb3B0KFdJTEwsVEVMT1BUX0JJTkFSWSk7CisJCVRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoVEVMT1BUX0JJTkFSWSkgPSAxOworCSAgICB9CisJICAgIGlmICghKF9tZV9iaW4gJiYgX3VfYmluKSkKKwkgICAgICB0bl93YWl0KCJwcm90byBzZXQgYmluYXJ5IG1vZGUiKTsKKyAgICAgICAgfQorI2lmZGVmIElLU19PUFRJT04KKyNpZmRlZiBDS19YWVoKKyAgICAgICAgaWYgKHByb3RvY29sICE9IFBST1RPX0spIHsJLyogTm9uLUtlcm1pdCBwcm90b2NvbCBzZWxlY3RlZCAqLworICAgICAgICAgICAgaWYgKFRFTE9QVF9VKFRFTE9QVF9LRVJNSVQpICYmCisgICAgICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC51X3N0YXJ0KSB7CisgICAgICAgICAgICAgICAgaWtzX3dhaXQoS0VSTUlUX1JFUV9TVE9QLDApOyAvKiBTdG9wIHRoZSBvdGhlciBTZXJ2ZXIgKi8KKwkJLyogX3Vfc3RhcnQgPSAxOyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfS0VSTUlUKSAmJgorICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQpIHsKKyAgICAgICAgICAgICAgICB0bl9zaWtzKEtFUk1JVF9TVE9QKTsJLyogSSdtIG5vdCBzZXJ2ZXJpbmcgKi8KKwkgCVRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQgPSAwOworCQlfbWVfc3RhcnQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19YWVogKi8KKyAgICAgICAgaWYgKHNzdGF0ZSA9PSAneCcgfHwgc3N0YXRlID09ICd2JykgeyAvKiBSZXNwb25kaW5nIHRvIGEgcmVxdWVzdCAqLworICAgICAgICAgICAgaWYgKCFpbnNlcnZlciAmJiBURUxPUFRfVShURUxPUFRfS0VSTUlUKSAmJgorICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQudV9zdGFydCkgeworICAgICAgICAgICAgICAgIGlrc193YWl0KEtFUk1JVF9SRVFfU1RPUCwwKTsgLyogU3RvcCB0aGUgb3RoZXIgU2VydmVyICovCisJCS8qIF91X3N0YXJ0ID0gMTsgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChURUxPUFRfTUUoVEVMT1BUX0tFUk1JVCkgJiYKKyAgICAgICAgICAgICAgICAhVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9zdGFydCkgeworICAgICAgICAgICAgICAgIHRuX3Npa3MoS0VSTUlUX1NUQVJUKTsJLyogU2VuZCBLZXJtaXQtU2VydmVyIFN0YXJ0ICovCisJIAlURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsJCQkvKiBJbml0aWF0aW5nIGEgcmVxdWVzdCAqLworICAgICAgICAgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfS0VSTUlUKSAmJgorICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQpIHsKKyAgICAgICAgICAgICAgICB0bl9zaWtzKEtFUk1JVF9TVE9QKTsJLyogSSdtIG5vdCBzZXJ2ZXJpbmcgKi8KKwkgCVRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQgPSAwOworCQlfbWVfc3RhcnQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFRFTE9QVF9VKFRFTE9QVF9LRVJNSVQpICYmCisJICAgICAgICAhVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC51X3N0YXJ0KSB7CisJCS8qIFNlbmQgUmVxLVNlcnZlci1TdGFydCAqLworICAgICAgICAgICAgICAgIGlmICghaWtzX3dhaXQoS0VSTUlUX1JFUV9TVEFSVCwwKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3N0YXRlICE9ICdzJykgeworCQkJc3VjY2VzcyA9IDA7CS8qIE90aGVyIEtlcm1pdCByZWZ1c2VkIHRvIHNlcnZlICovCisJCQlpZiAobG9jYWwpCisJCQkgIHByaW50ZigiQSBLZXJtaXQgU2VydmVyIGlzIG5vdCBhdmFpbGFibGVcclxuIik7CisJCQlkZWJ1ZyhGMTEwLCJwcm90bygpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgS2VybWl0IFNlcnZlciBpcyBub3QgYXZhaWxhYmxlIiwwKTsKKwkJCXRsb2coRjExMCwiSUtTIGNsaWVudC9zZXJ2ZXIgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBIEtlcm1pdCBTZXJ2ZXIgaXMgbm90IGF2YWlsYWJsZSIsMCk7CisJCQlnb3RvIHh4cHJvdG94OworICAgICAgICAgICAgICAgICAgICB9CisJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgIGlmICh0bl9ub19lbmNyeXB0X3hmZXIgJiYgIShzc3RlbG5ldCB8fCBpbnNlcnZlcikpIHsKKyAgICAgICAgICAgIGNrX3RuX2VuY19zdG9wKCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgfQorI2VuZGlmIC8qIFROQ09ERSAqLworCisgICAgaWYgKCF4ZnJpbnQpIGNvbm5vaSgpOworICAgIHh4cHJvdG8oKTsJCQkJLyogQ2FsbCB0aGUgcmVhbCBwcm90b2NvbCBmdW5jdGlvbiAqLworCisjaWZkZWYgSUtTX09QVElPTgorICB4eHByb3RveDoKKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisgICAgeGZlcnN0YXQgPSBzdWNjZXNzOwkJCS8qIFJlbWVtYmVyIHRyYW5zZmVyIHN0YXR1cyAqLworICAgIGthY3RpdmUgPSAwOworCisjaWZkZWYgVE5DT0RFCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICBpZiAodG5fbm9fZW5jcnlwdF94ZmVyICYmICEoc3N0ZWxuZXQgfHwgaW5zZXJ2ZXIpKSB7CisgICAgICAgICAgICBja190bl9lbmNfc3RhcnQoKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfS0VSTUlUKSAmJgorICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0ICYmICFfbWVfc3RhcnQpIHsKKyAgICAgICAgdG5fc2lrcyhLRVJNSVRfU1RPUCk7CQkvKiBTZXJ2ZXIgaXMgc3RvcHBlZCAqLworIAlURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0ID0gMDsKKyAgICB9CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworICAgIGlmIChpc190biAmJiB0bl9iX3hmZXIgJiYgIShzc3RlbG5ldCB8fCBpbnNlcnZlcikpIHsKKyAgICAgICAgLyogaWYgd2UgbmVnb3RpYXRlZCBCaW5hcnkgbW9kZSB0cnkgdG8gcmVzZXQgaXQgKi8KKyAgICAgICAgaWYgKCFfdV9iaW4pIHsKKyAgICAgICAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgc3RhdGUgY2hhbmdlZCBkdXJpbmcgdGhlIHRyYW5zZmVyICovCisJICAgIGlmIChURUxPUFRfVShURUxPUFRfQklOQVJZKSkgeworCQl0bl9zb3B0KERPTlQsVEVMT1BUX0JJTkFSWSk7CisJCVRFTE9QVF9VTkFOU1dFUkVEX0RPTlQoVEVMT1BUX0JJTkFSWSkgPSAxOworCSAgICB9IGVsc2UKKwkgICAgICBfdV9iaW4gPSAxOwkJLyogU28gd2UgZG9uJ3QgY2FsbCB0bl93YWl0KCkgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoIV9tZV9iaW4pIHsKKyAgICAgICAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgc3RhdGUgY2hhbmdlZCBkdXJpbmcgdGhlIHRyYW5zZmVyICovCisJICAgIGlmIChURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkpIHsKKwkJdG5fc29wdChXT05ULFRFTE9QVF9CSU5BUlkpOworCQlURUxPUFRfVU5BTlNXRVJFRF9XT05UKFRFTE9QVF9CSU5BUlkpID0gMTsKKwkgICAgfSBlbHNlCisJICAgICAgX21lX2JpbiA9IDE7CQkvKiBTbyB3ZSBkb24ndCBjYWxsIHRuX3dhaXQoKSAqLworCX0KKwlpZiAoIShfbWVfYmluICYmIF91X2JpbikpCisJICB0bl93YWl0KCJwcm90byByZXNldCBiaW5hcnkgbW9kZSIpOworICAgIH0KKyNlbmRpZiAvKiBUTkNPREUgKi8KKworI2lmZGVmIFBBVFRFUk5TCisgICAgcGF0dGVybnMgPSBwYV9zYXZlOworI2VuZGlmIC8qIFBBVFRFUk5TICovCisgICAgZmlsZXBlZWsgPSBzY2FuX3NhdmU7CisKKyNpZmRlZiBTVFJFQU1JTkcKKyAgICBzdHJlYW1pbmcgPSAwOworICAgIC8qIHN0cmVhbW9rID0gMDsgKi8KKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKyNpZmRlZiBDT01NRU5UCisjaWZkZWYgQ0tfU1BFRUQKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICBjdGxwW2ldID0gc19jdGxwW2ldOworICAgIGZfY3RscCA9IDA7CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgdXJjbGVhciA9IDA7CisgICAgaWYgKCFzdWNjZXNzKSB7CisJeGl0c3RhIHw9ICh3aGF0ICYgV19LRVJNSVQpOworCXRsb2coRjExMCwiIGZhaWxlZDoiLChjaGFyICopZXBrdG1zZywwKTsKKyAgICB9CisgICAgZGVidWcoRjExMSwicHJvdG8geGZlcnN0YXQiLGVwa3Rtc2cseGZlcnN0YXQpOworICAgIHNsb3N0YXJ0ID0gc3Nfc2F2ZTsKKyAgICBpZiAoc190aW1pbnQgPiAtMSkgewkJLyogQmVjYXVzZSBvZiBSRU1PVEUgU0VUICovCisJdGltaW50ID0gc190aW1pbnQ7CisJc190aW1pbnQgPSAtMTsKKyAgICB9CisgICAgcmVjdXJzaXZlID0gcl9zYXZlOworICAgIGZuc3BhdGggPSBwX3NhdmU7CisgICAgaWYgKGNfc2F2ZSA+IC0xKSB7CQkJLyogQmVjYXVzZSBvZiBSRU1PVEUgU0VUICovCisJYmN0ciA9IGNfc2F2ZTsKKwljX3NhdmUgPSAtMTsKKyAgICB9CisgICAgZm5jbnYgICA9IGZfc2F2ZTsKKyAgICBiaW5hcnkgID0gYl9zYXZlOworI2lmZGVmIFBJUEVTRU5ECisgICAgcGlwZXNlbmQgPSAwOyAgICAJCQkvKiBOZXh0IHRpbWUgbWlnaHQgbm90IGJlIHBpcGVzZW5kICovCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgIGN1cnNvcmVuYVt2bW9kZV0gPSBjdXJzb3Jfc2F2ZTsKKyAgICB0ZXJtX2lvID0gdGVybV9pb19zYXZlOworICAgIGRpc3BsYXlfZGVtbyA9IDE7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworfQorCitzdGF0aWMgVk9JRAoreHhwcm90bygpIHsKKyAgICBpbnQgeDsKKyAgICBsb25nIGx4OworI2lmZGVmIENLX1hZWgorI2lmZGVmIFhZWl9JTlRFUk5BTAorX1BST1RPVFlQKCBpbnQgcHh5eiwgKGludCkgKTsKKyNlbmRpZiAvKiBYWVpfSU5URVJOQUwgKi8KKyNlbmRpZiAvKiBDS19YWVogKi8KKworICAgIGNoYXIgeHNzWzJdOwkJCS8qIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBzc3RhdGUgKi8KKyAgICB4c3NbMF0gPSBzc3RhdGU7CisgICAgeHNzWzFdID0gTlVMOworICAgIHNfdGltaW50ID0gdGltaW50OworCisgICAgZGVidWcoRjEwMSwieHhwcm90byBlbnRyeSBqdXN0b25lIiwiIixqdXN0b25lKTsKKyAgICBzdWNjZXNzID0gMDsKKworICAgIHJldHJpZXZlID0gMDsJCQkvKiBSZXNldCB0aGVzZSAuLi4gKi8KKyAgICByZWdldCA9IDA7CisgICAgb3BrdCA9IDA7CisKKyAgICBpZiAobG9jYWwgJiYgdHRjaGsoKSA8IDApIHsJCS8qIEdpdmluZyBCWUUgb3IgRklOICovCisJaWYgKGJ5ZV9hY3RpdmUpIHsJCS8qIGJ1dCB0aGVyZSBpcyBubyBjb25uZWN0aW9uICovCisJICAgIHR0Y2xvcygwKTsKKwkgICAgc3VjY2VzcyA9IDE7CisJICAgIHJldHVybjsKKwl9CisJLyogRGl0dG8gZm9yIGFueSBSRU1PVEUgY29tbWFuZCAqLworCWlmIChzc3RhdGUgPT0gJ2cnICYmIGNtYXJnICkgeworCSAgICBpZiAoKmNtYXJnID09ICdMJyB8fCAqY21hcmcgPT0gJ0YnIHx8ICpjbWFyZyA9PSAnWCcpCisJICAgICAgc3VjY2VzcyA9IDE7CisJICAgIGVsc2UKKwkgICAgICBwcmludGYoIj9ObyBjb25uZWN0aW9uXHJcbiIpOworCSAgICByZXR1cm47CisJfQorICAgIH0KKworLyogU2V0IHVwIHRoZSBjb21tdW5pY2F0aW9uIGxpbmUgZm9yIGZpbGUgdHJhbnNmZXIuICovCisvKiBOT1RFOiBBbGwgb2YgdGhlIHh4c2NyZWVuKCkgY2FsbHMgcHJpb3IgdG8gdGhlIHdhcnQoKSBpbnZvY2F0aW9uICovCisvKiBjb3VsZCBqdXN0IGFzIGVhc2lseSBiZSBwcmludGYncyBvciwgZm9yIHRoYXQgbWF0dGVyLCBoaW50cy4gKi8KKworICAgIGlmIChsb2NhbCAmJiAoc3BlZWQgPCAwTCkgJiYgKG5ldHdvcmsgPT0gMCkpIHsKKwl4eHNjcmVlbihTQ1JfRU0sMCwwTCwiU29ycnksIHlvdSBtdXN0ICdzZXQgc3BlZWQnIGZpcnN0Iik7CisJcmV0dXJuOworICAgIH0KKyAgICB4ID0gLTE7CisgICAgaWYgKHR0b3Blbih0dG5hbWUsJngsbWRtdHlwLGNkdGltbykgPCAwKSB7CisJZGVidWcoRjExMSwiZmFpbGVkOiBwcm90byB0dG9wZW4gbG9jYWwiLHR0bmFtZSxsb2NhbCk7CisJeHhzY3JlZW4oU0NSX0VNLDAsMEwsIkNhbid0IG9wZW4gbGluZSIpOworCXJldHVybjsKKyAgICB9CisgICAgaWYgKHggPiAtMSkgbG9jYWwgPSB4OworICAgIGRlYnVnKEYxMTEsInByb3RvIHR0b3BlbiBsb2NhbCIsdHRuYW1lLGxvY2FsKTsKKworICAgIGx4ID0gKGxvY2FsICYmICFuZXR3b3JrKSA/IHNwZWVkIDogLTE7CisjaWZkZWYgTkVUQ09OTgorI2lmZGVmIENLX1NQRUVECisgICAgaWYgKGlzX3RuKSB7CisJY3RscFsodW5zaWduZWQpMjU1XSA9IGN0bHBbQ1JdID0gMTsKKwlpZiAocGFyaXR5ID09ICdlJyB8fCBwYXJpdHkgPT0gJ20nKSBjdGxwWzEyN10gPSAxOworCWlmIChmbG93ID09IEZMT19YT05YKSB7CQkvKiBBbHNvIHdhdGNoIG91dCBmb3IgWG9uL1hvZmYgKi8KKwkgICAgY3RscFsxN10gPSBjdGxwWzE5XSA9IDE7CisJICAgIGN0bHBbMTcrMTI4XSA9IGN0bHBbMTkrMTI4XSA9IDE7CisJfQorICAgIH0KKyNlbmRpZiAvKiBDS19TUEVFRCAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKyAgICBpZiAodHRwa3QobHgsZmxvdyxwYXJpdHkpIDwgMCkgewkvKiBQdXQgbGluZSBpbiBwYWNrZXQgbW9kZSwgKi8KKwl4eHNjcmVlbihTQ1JfRU0sMCwwTCwiQ2FuJ3QgY29uZGl0aW9uIGxpbmUiKTsKKwlyZXR1cm47CisgICAgfQorICAgIGlmIChsb2NhbCAmJiAhbmV0d29yayAmJiBjYXJyaWVyICE9IENBUl9PRkYpIHsKKwlpbnQgeDsJCQkJLyogU2VyaWFsIGNvbm5lY3Rpb24gKi8KKwl4ID0gdHRnbWRtKCk7CQkJLyogd2l0aCBjYXJyaWVyIGNoZWNraW5nICovCisJaWYgKHggPiAtMSkgeworCSAgICBpZiAoISh4ICYgQk1fRENEKSkgeworCQlkZWJ1ZyhGMTAxLCJwcm90byB0dGdtZG0iLCIiLDApOworCQl4eHNjcmVlbihTQ1JfRU0sMCwwTCwiQ2FycmllciByZXF1aXJlZCBidXQgbm90IGRldGVjdGVkIik7CisJCXJldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisgICAgLyogU2VuZCByZW1vdGUgc2lkZSdzICJyZWNlaXZlIiBvciAic2VydmVyIiBzdGFydHVwIHN0cmluZywgaWYgYW55ICovCisgICAgaWYgKGxvY2FsICYmIGNraW5kZXgoKGNoYXIgKil4c3MsInNyZ2NqaGsiLDAsMCwxKSkgeworCWNoYXIgKnMgPSBOVUxMOworICAgICAgICBpZiAoCisjaWZkZWYgSUtTX09QVElPTgorCSAgICAvKiBEb24ndCBzZW5kIGF1dG8tYmxhaCBzdHJpbmcgaWYgd2Uga25vdyBvdGhlciBzaWRlIGlzIHNlcnZpbmcgKi8KKwkgICAgIVRFTE9QVF9VKFRFTE9QVF9LRVJNSVQpIHx8CisJICAgICFURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQKKyNlbHNlCisJICAgIDEKKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisJICAgICkgeworCSAgICBpZiAoc3N0YXRlID09ICdzJykgewkvKiBTZW5kaW5nIGZpbGUocykgKi8KKwkJcyA9IGJpbmFyeSA/IHB0YWJbcHJvdG9jb2xdLmhfYl9pbml0IDogcHRhYltwcm90b2NvbF0uaF90X2luaXQ7CisJICAgIH0gZWxzZSBpZiAocHJvdG9jb2wgPT0gUFJPVE9fSykgeyAvKiBDb21tYW5kIGZvciBzZXJ2ZXIgKi8KKwkJcyA9IHB0YWJbcHJvdG9jb2xdLmhfeF9pbml0OworCSAgICB9CisJfQorI2lmZGVmIENLX1NQRUVECisjaWZuZGVmIFVOUFJFRklYWkVSTworCWlmIChwcm90b2NvbCA9PSBQUk9UT19LKQkvKiBCZWNhdXNlIG9mIEMtc3RyaW5ncy4uLiAqLworCSAgY3RscFswXSA9IDE7CisjZW5kaWYgLyogVU5QUkVGSVhaRVJPICovCisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKwlpZiAocykgaWYgKCpzKSB7CQkvKiBJZiB3ZSBoYXZlIGEgY29tbWFuZCB0byBzZW5kLi4uICovCisJICAgIGNoYXIgdG1wYnVmWzM1Nl07CisJICAgIGludCB0bXBidWZzaXogPSAzNTY7CisJICAgIGludCBzdHVmZiA9IC0xLCBzdHVmZjIgPSAtMSwgbGVuID0gMDsKKwkgICAgZXh0ZXJuIGludCB0bmxtOworCSAgICBpZiAoc3N0YXRlID09ICdzJykgewkvKiBTZW5kaW5nIGZpbGUocykgKi8KKyNpZmRlZiBDS19YWVoKKwkJaWYgKHByb3RvY29sID09IFBST1RPX1gpIHsKKwkJICAgIGNoYXIgKiBzMjsKKwkJICAgIHMyID0gY21hcmcyWzBdID8gY21hcmcyIDogY21hcmc7CisJCSAgICBpZiAoKGludClzdHJsZW4ocykgKyAoaW50KXN0cmxlbihzMikgKyA0IDwgMzU2KQorCQkgICAgICBzcHJpbnRmKHRtcGJ1ZiwgcywgczIpOworCQkgICAgZWxzZQorCQkgICAgICB0bXBidWZbMF0gPSBOVUw7CisJCX0gZWxzZSB7CisjZW5kaWYgLyogQ0tfWFlaICovCisJCSAgICBja21ha21zZyh0bXBidWYsIDM1NiwgcywgTlVMTCwgTlVMTCwgTlVMTCk7CisjaWZkZWYgQ0tfWFlaCisJCX0KKyNlbmRpZiAvKiBDS19YWVogKi8KKwkgICAgfSBlbHNlIHsJCQkvKiBDb21tYW5kIGZvciBzZXJ2ZXIgKi8KKwkJY2tzdHJuY3B5KHRtcGJ1ZixzLDM1Nik7CisJICAgIH0KKwkgICAgY2tzdHJuY2F0KHRtcGJ1ZiwgIlwwMTUiLHNpemVvZih0bXBidWYpKTsKKwkgICAgaWYgKHRubG0pCQkJLyogVEVSTUlOQUwgTkVXTElORSBPTiAqLworCSAgICAgIHN0dWZmID0gTEY7CQkvKiBTdHVmZiBMRiAqLworI2lmZGVmIFROQ09ERQorCSAgICAvKiBURUxORVQgTkVXTElORSBNT0RFICovCisJICAgIGlmIChpc190bikgeworCQlzd2l0Y2ggKFRFTE9QVF9NRShURUxPUFRfQklOQVJZKSA/IHRuX2JfbmxtIDogdG5fbmxtKSB7CisJCSAgY2FzZSBUTkxfQ1I6CisJCSAgICBicmVhazsKKwkJICBjYXNlIFROTF9DUk5VTDoKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgVE5MX0NSTEY6CisJCSAgICBzdHVmZjIgPSBzdHVmZjsKKwkJICAgIHN0dWZmID0gTEY7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisjZW5kaWYgLyogVE5DT0RFICovCisKKyNpZmRlZiBORVRDT05OCisjaWZkZWYgVENQU09DS0VUCisjaWZkZWYgUkxPR0NPREUKKwkgICAgaWYgKG5ldHdvcmsgJiYgdHRucHJvdG8gPT0gTlBfUkxPR0lOKSB7CisJCXN3aXRjaCAodG5fYl9ubG0pIHsgLyogQWx3YXlzIEJJTkFSWSAqLworCQkgIGNhc2UgVE5MX0NSOgorCQkgICAgYnJlYWs7CisJCSAgY2FzZSBUTkxfQ1JOVUw6CisJCSAgICBzdHVmZjIgPSBzdHVmZjsKKwkJICAgIHN0dWZmICA9IE5VTDsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgVE5MX0NSTEY6CisJCSAgICBzdHVmZjIgPSBzdHVmZjsKKwkJICAgIHN0dWZmID0gTEY7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisKKwkgICAgbGVuID0gc3RybGVuKHRtcGJ1Zik7CisJICAgIGlmIChzdHVmZiA+PSAwICYmIGxlbiA8IHRtcGJ1ZnNpeiAtIDEpIHsKKwkJdG1wYnVmW2xlbisrXSA9IHN0dWZmOworCQlpZiAoc3R1ZmYyID49IDAgJiYgbGVuIDwgdG1wYnVmc2l6IC0gMSkKKwkJICB0bXBidWZbbGVuKytdID0gc3R1ZmYyOworCQl0bXBidWZbbGVuXSA9IE5VTDsKKwkgICAgfQorCSAgICB0dG9sKChDSEFSICopdG1wYnVmLGxlbik7CisJICAgIGlmIChwcm90b2NvbCA9PSBQUk9UT19LKQkvKiBHaXZlIHJlbW90ZSBLZXJtaXQgdGltZSB0byBzdGFydCAqLworCSAgICAgIG1zbGVlcCg0MDApOworCX0KKyAgICB9CisKKyNpZmRlZiBDS19YWVoKKyAgICBpZiAocHJvdG9jb2wgIT0gUFJPVE9fSykgewkJLyogTm9uLUtlcm1pdCBwcm90b2NvbCBzZWxlY3RlZCAqLworCWNoYXIgdG1wYnVmWzM1Nl07CisJaW50IHRtcGJ1ZnNpeiA9IDM1NjsKKwljaGFyICogcyA9ICIiOworCisjaWZkZWYgQ0tfVE1QRElSCisJaWYgKHNzdGF0ZSA9PSAndicpIHsJCS8qIElmIHJlY2VpdmluZyBhbmQuLi4gKi8KKwkgICAgaWYgKGRsZGlyICYmICFmX3RtcGRpcikgewkvKiBpZiB0aGV5IGhhdmUgYSBkb3dubG9hZCBkaXJlY3RvcnkgKi8KKwkJaWYgKHMgPSB6Z3RkaXIoKSkgewkvKiBHZXQgY3VycmVudCBkaXJlY3RvcnkgKi8KKwkJICAgIGlmICh6Y2hkaXIoZGxkaXIpKSB7IC8qIENoYW5nZSB0byBkb3dubG9hZCBkaXJlY3RvcnkgKi8KKwkJCWNrc3RybmNweShzYXZkaXIscyxUTVBESVJMRU4pOworCQkJZl90bXBkaXIgPSAxOwkvKiBSZW1lbWJlciB0aGF0IHdlIGRpZCB0aGlzICovCisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKworI2lmZGVmIFhZWl9JTlRFUk5BTAkJCS8qIEludGVybmFsICovCisJc3VjY2VzcyA9ICFweHl6KHNzdGF0ZSk7CisjZWxzZQorI2lmZGVmIENLX1JFRElSCQkJCS8qIEV4dGVybmFsICovCisJc3dpdGNoIChzc3RhdGUpIHsKKwkgIGNhc2UgJ3MnOgkJCS8qICdUaXMgYmV0dGVyIHRvIFNFTkQuLi4gKi8KKwkgICAgcyA9IGJpbmFyeSA/IHB0YWJbcHJvdG9jb2xdLnBfYl9zY21kIDogcHRhYltwcm90b2NvbF0ucF90X3NjbWQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAndic6CQkJLyogLi4uIHRoYW4gUkVDRUlWRSAqLworCSAgICBzID0gYmluYXJ5ID8gcHRhYltwcm90b2NvbF0ucF9iX3JjbWQgOiBwdGFiW3Byb3RvY29sXS5wX3RfcmNtZDsKKwkgICAgYnJlYWs7CisJfQorCWlmICghcykgcyA9ICIiOworCWlmICgqcykgeworCSAgICBpZiAoc3N0YXRlID09ICdzJykgeworCQlpZiAoKGludClzdHJsZW4ocykgKyAoaW50KXN0cmxlbihmc3BlYykgPCB0bXBidWZzaXopIHsKKwkJICAgIHNwcmludGYodG1wYnVmLHMsZnNwZWMpOyAvKiBzYWZlIChwcmVjaGVja2VkKSAqLworCQkgICAgdGxvZyhGMTEwLCJTZW5kaW5nIixmc3BlYywwTCk7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaWYgKChpbnQpc3RybGVuKHMpICsgKGludClzdHJsZW4oY21hcmcyKSA8IHRtcGJ1ZnNpeikgeworCQkgICAgc3ByaW50Zih0bXBidWYscyxjbWFyZzIpOyAvKiBzYWZlIChwcmVjaGVja2VkKSAqLworCQkgICAgdGxvZyhGMTEwLCJSZWNlaXZpbmciLGNtYXJnMiwwTCk7CisJCX0KKwkgICAgfQorCSAgICB0bG9nKEYxMTAsIiB2aWEgZXh0ZXJuYWwgcHJvdG9jb2w6Iix0bXBidWYsMCk7CisJICAgIGRlYnVnKEYxMTAsImNrY3BybyB0dHJ1bmNtZCIsdG1wYnVmLDApOworCSAgICBzdWNjZXNzID0gdHRydW5jbWQodG1wYnVmKTsKKwkgICAgdGxvZyhGMTEwLCIgc3RhdHVzOiIsc3VjY2VzcyA/ICJPSyIgOiAiRkFJTEVEIiwgMCk7CisJfSBlbHNlIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIG5vIGV4dGVybmFsIHByb3RvY29sIGRlZmluZWQgZm9yICVzXHJcbiIsCisJCSAgIHB0YWJbcHJvdG9jb2xdLnBfbmFtZQorCQkgICApOworCX0KKyNlbHNlCisJcHJpbnRmKAorIlNvcnJ5LCBvbmx5IEtlcm1pdCBwcm90b2NvbCBpcyBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIEtlcm1pdFxuIgorCSAgICAgICApOworI2VuZGlmIC8qIENLX1JFRElSICovCisjZW5kaWYgLyogWFlaX0lOVEVSTkFMICovCisJcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBDS19YWVogKi8KKworI2lmZGVmIE5UU0lHWAorICAgIGNvbnJhdygpOworICAgIGNvbm5vaSgpOworI2Vsc2UKKyAgICBpZiAoIWxvY2FsKQorICAgICAgY29ubm9pKCk7CQkJCS8qIE5vIGNvbnNvbGUgaW50ZXJydXB0cyBpZiByZW1vdGUgKi8KKyNlbmRpZiAvKiBOVFNJRyAqLworCisgICAga2FjdGl2ZSA9IDE7CisgICAgaWYgKHNzdGF0ZSA9PSAneCcpIHsJCS8qIElmIGVudGVyaW5nIHNlcnZlciBtb2RlLCAqLworCWV4dGVybiBpbnQgaG93Y2FsbGVkOworCXNlcnZlciA9IDE7CQkJLyogc2V0IGZsYWcsICovCisJZGVidWcoRjEwMSwic2VydmVyIGJhY2tncmQiLCIiLGJhY2tncmQpOworCWRlYnVnKEYxMDEsInNlcnZlciBxdWlldCIsIiIscXVpZXQpOworCWRlYnVnKEYxMDAsIlNIT1VMRCBOT1QgU0VFIFRISVMgSUYgSU4gQkFDS0dST1VORCEiLCIiLDApOworCWlmIChob3djYWxsZWQgPT0gSV9BTV9TU0hTVUIpIHsJLyogYW5kIGlzc3VlIGFwcHJvcHJpYXRlIG1lc3NhZ2UuICovCisJICAgIHR0b2woKENIQVIgKikiS0VSTUlUIFJFQURZIFRPIFNFUlZFLi4uXDAxNVwwMTIiLDI2KTsKKwl9IGVsc2UgaWYgKCFsb2NhbCkgeworCSAgICBpZiAoIXF1aWV0ICYmICFiYWNrZ3JkCisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICAgICAgICAgICYmICFURUxPUFRfTUUoVEVMT1BUX0tFUk1JVCkgLyogVXNlciB3YXMgdG9sZCBieSBuZWdvdGlhdGlvbiAqLworI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKwkJKSB7CisJCWNvbm9sbChzcnZ0eHQpOworCQljb25vbGwoIktFUk1JVCBSRUFEWSBUTyBTRVJWRS4uLiIpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgY29ub2woIkVudGVyaW5nIHNlcnZlciBtb2RlIG9uICIpOworCSAgICBjb25vbGwodHRuYW1lKTsKKwkgICAgY29ub2xsKCJUeXBlIEN0cmwtQyB0byBxdWl0LiIpOworCSAgICBpZiAoc3J2ZGlzKSBpbnRtc2coLTFMKTsKKyNpZmRlZiBUQ1BTT0NLRVQKKyNpZm5kZWYgTk9MSVNURU4KKwkgICAgaWYgKG5ldHdvcmsgJiYgdGNwc3JmZCA+IDApCisJICAgICAgdHRvbCgoQ0hBUiAqKSJLRVJNSVQgUkVBRFkgVE8gU0VSVkUuLi5cMDE1XDAxMiIsMjYpOworI2VuZGlmIC8qIE5PTElTVEVOICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisJfQorICAgIH0gZWxzZQorICAgICAgc2VydmVyID0gMDsKKyNpZmRlZiBWTVMKKyAgICBpZiAoIXF1aWV0ICYmICFiYWNrZ3JkKSAgICAvKiBTbyBtZXNzYWdlIGRvZXNuJ3Qgb3ZlcndyaXRlIHByb21wdCAqLworICAgICAgY29ub2xsKCIiKTsKKyAgICBpZiAobG9jYWwpIGNvbnJlcygpOyAgICAgICAvKiBTbyBDdHJsLUMgd2lsbCB3b3JrICovCisjZW5kaWYgLyogVk1TICovCisvKgorICBJZiBpbiByZW1vdGUgbW9kZSwgbm90IHNodXNoZWQsIG5vdCBpbiBiYWNrZ3JvdW5kLCBhbmQgYXQgdG9wIGNvbW1hbmQgbGV2ZWwsCisgIGlzc3VlIGEgaGVscGZ1bCBtZXNzYWdlIHRlbGxpbmcgd2hhdCB0byBkby4uLgorKi8KKyAgICBpZiAoIWxvY2FsICYmICFxdWlldCAmJiAhYmFja2dyZCkgeworCWlmIChzc3RhdGUgPT0gJ3YnKSB7CisJICAgIGNvbm9sbCgiUmV0dXJuIHRvIHlvdXIgbG9jYWwgS2VybWl0IGFuZCBnaXZlIGEgU0VORCBjb21tYW5kLiIpOworCSAgICBjb25vbGwoIiIpOworCSAgICBjb25vbGwoIktFUk1JVCBSRUFEWSBUTyBSRUNFSVZFLi4uIik7CisJfSBlbHNlIGlmIChzc3RhdGUgPT0gJ3MnKSB7CisJICAgIGNvbm9sbCgiUmV0dXJuIHRvIHlvdXIgbG9jYWwgS2VybWl0IGFuZCBnaXZlIGEgUkVDRUlWRSBjb21tYW5kLiIpOworCSAgICBjb25vbGwoIiIpOworCSAgICBjb25vbGwoIktFUk1JVCBSRUFEWSBUTyBTRU5ELi4uIik7CisJfSBlbHNlIGlmICggc3N0YXRlID09ICdnJyB8fCBzc3RhdGUgPT0gJ3InIHx8IHNzdGF0ZSA9PSAnaCcgfHwKKwkJICAgIHNzdGF0ZSA9PSAnaicgfHwgc3N0YXRlID09ICdjJyApIHsKKwkgICAgY29ub2xsKCJSZXR1cm4gdG8geW91ciBsb2NhbCBLZXJtaXQgYW5kIGdpdmUgYSBTRVJWRVIgY29tbWFuZC4iKTsKKwkgICAgY29ub2xsKCIiKTsKKwkgICAgY29ub2xsKChzc3RhdGUgPT0gJ3InIHx8IHNzdGF0ZSA9PSAnaicgfHwgc3N0YXRlID09ICdoJykgPworCQkgICAiS0VSTUlUIFJFQURZIFRPIEdFVC4uLiIgOgorCQkgICAiS0VSTUlUIFJFQURZIFRPIFNFTkQgU0VSVkVSIENPTU1BTkQuLi4iKTsKKwl9CisgICAgfQorI2lmZGVmIENPTU1FTlQKKyAgICBpZiAoIWxvY2FsKSBzbGVlcCgxKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisvKgorICBUaGUgJ3dhcnQoKScgZnVuY3Rpb24gaXMgZ2VuZXJhdGVkIGJ5IHRoZSB3YXJ0IHByb2dyYW0uICBJdCBnZXRzIGEKKyAgY2hhcmFjdGVyIGZyb20gdGhlIGlucHV0KCkgcm91dGluZSBhbmQgdGhlbiBiYXNlZCBvbiB0aGF0IGNoYXJhY3RlciBhbmQKKyAgdGhlIGN1cnJlbnQgc3RhdGUsIHNlbGVjdHMgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiwgYWNjb3JkaW5nIHRvIHRoZSBzdGF0ZQorICB0YWJsZSBhYm92ZSwgd2hpY2ggaXMgdHJhbnNmb3JtZWQgYnkgdGhlIHdhcnQgcHJvZ3JhbSBpbnRvIGEgYmlnIGNhc2UKKyAgc3RhdGVtZW50LiAgVGhlIGZ1bmN0aW9uIGlzIGFjdGl2ZSBmb3Igb25lIHRyYW5zYWN0aW9uLgorKi8KKyAgICBydGltZXIoKTsJCQkJLyogUmVzZXQgZWxhcHNlZC10aW1lIHRpbWVyICovCisjaWZkZWYgR0ZUSU1FUgorICAgIHJmdGltZXIoKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgcmVzZXRjKCk7CQkJCS8qICYgb3RoZXIgcGVyLXRyYW5zYWN0aW9uIGNvdW50ZXJzLiAqLworCisgICAgZGVidWcoRjEwMSwicHJvdG8gY2FsbGluZyB3YXJ0LCBqdXN0b25lIiwiIixqdXN0b25lKTsKKworICAgIHdhcnQoKTsJCQkJLyogRW50ZXIgdGhlIHN0YXRlIHRhYmxlIHN3aXRjaGVyLiAqLworLyoKKyAgTm90ZTogdGhlIGZvbGxvd2luZyBpcyBuZWNlc3NhcnkgaW4gY2FzZSB3ZSBoYXZlIGp1c3QgZG9uZSBhIHJlbW90ZS1tb2RlCisgIGZpbGUgdHJhbnNmZXIsIGluIHdoaWNoIGNhc2UgdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIG1vZGVzIGhhdmUgYmVlbgorICBjaGFuZ2VkIGJ5IHR0cGt0KCkuICBJbiBwYXJ0aWN1bGFyLCBzcGVjaWFsIGNoYXJhY3RlcnMgbGlrZSBDdHJsLUMgYW5kCisgIEN0cmwtXCBtaWdodCBoYXZlIGJlZW4gdHVybmVkIG9mZiAoc2VlIHR0cGt0KS4gIFNvIHRoaXMgY2FsbCB0byB0dHJlcygpIGlzCisgIGVzc2VudGlhbC4gIElNUE9SVEFOVDogcmVzdG9yZSBpbnRlcnJ1cHQgaGFuZGxlcnMgZmlyc3QsIG90aGVyd2lzZSBhbnkKKyAgdGVybWluYWwgaW50ZXJydXB0cyB0aGF0IG9jY3VyIGJlZm9yZSB0aGlzIGlzIGRvbmUgaW4gdGhlIG5vcm1hbCBwbGFjZQorICBsYXRlciB3aWxsIGNhdXNlIGEgY3Jhc2guCisqLworI2lmZGVmIE9TMgorICAgIHR0cmVzKCk7CQkJCS8qIFJlc2V0IHRoZSBjb21tdW5pY2F0aW9uIGRldmljZSAqLworI2Vsc2UKKyAgICBpZiAoIWxvY2FsKSB7CisJc2V0aW50KCk7CQkJLyogQXJtIGludGVycnVwdCBoYW5kbGVycyBGSVJTVCAqLworCW1zbGVlcCg1MDApOworCXR0cmVzKCk7CQkJLyogVGhlbiByZXN0b3JlIHRlcm1pbmFsLiAqLworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB4eHNjcmVlbihTQ1JfVEMsMCwwTCwiIik7CQkvKiBUcmFuc2FjdGlvbiBjb21wbGV0ZSAqLworICAgIHggPSBxdWlldDsKKyAgICBxdWlldD0xOworICAgIGNsc2lmKCk7CQkJCS8qIEZhaWxzYWZlIGluIGNhc2Ugd2UgbWlzc2VkICovCisgICAgY2xzb2YoMSk7CQkJCS8qIGEgY2FzZSBpbiB0aGUgc3RhdGUgbWFjaGluZS4gKi8KKyAgICBxdWlldCA9IHg7CisKKyAgICBpZiAoc2VydmVyKSB7CQkJLyogQmFjayBmcm9tIHBhY2tldCBwcm90b2NvbC4gKi8KKyAgICAJaWYgKCFxdWlldCAmJiAhYmFja2dyZAorI2lmZGVmIElLU0QKKwkgICAgJiYgIWluc2VydmVyCisjZW5kaWYgLyogSUtTRCAqLworCSAgICApIHsJCQkJLyogR2l2ZSBhcHByb3ByaWF0ZSBtZXNzYWdlICovCisJICAgIGNvbm9sbCgiIik7CisJICAgIGNvbm9sbCgiQy1LZXJtaXQgc2VydmVyIGRvbmUiKTsKKyAgICAgICAgfQorICAgICAgICBzZXJ2ZXIgPSAwOwkJCS8qIE5vdCBhIHNlcnZlciBhbnkgbW9yZSAqLworICAgIH0KK30KKworLyogIFMgRyBFIFQgSSBOIEkgVCAgLS0gIEhhbmRsZSBpbmNvbWluZyBHRVQtQ2xhc3MgcGFja2V0cyAgKi8KKworLyoKKyAgUmV0dXJuczoKKyAgIC0xOiBPbiBlcnJvcgorICAgIDA6IEdFVCBwYWNrZXQgcHJvY2Vzc2VkIE9LIC0gcmVhZHkgdG8gU2VuZC4KKyAgICAxOiBFeHRlbmRlZCBHRVQgcHJvY2Vzc2VkIE9LIC0gd2FpdCBmb3IgYW5vdGhlci4KKyovCitzdGF0aWMgaW50CitzZ2V0aW5pdChyZWdldCx4Z2V0KSBpbnQgcmVnZXQsIHhnZXQ7IHsJLyogU2VydmVyIGVuZCBvZiBHRVQgY29tbWFuZCAqLworICAgIGNoYXIgKiBmcyA9IE5VTEw7CQkJLyogUG9pbnRlciB0byBmaWxlc3BlYyAqLworICAgIGludCBpLCBuLCBkb25lID0gMDsKKyNpZmRlZiBQSVBFU0VORAorICAgIGV4dGVybiBpbnQgdXNlcGlwZXMsIHBpcGVzZW5kOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisgICAgZXh0ZXJuIGludCBub2xpbmtzOworCisgICAgaWYgKCFFTkFCTEVEKGVuX2dldCkpIHsJCS8qIE9ubHkgaWYgbm90IGRpc2FibGVkISAgKi8KKwllcnJwa3QoKENIQVIgKikiR0VUIGRpc2FibGVkIik7CisJcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICAvKiBPSyB0byBwcm9jZWVkICovCisKKyAgICBub2xpbmtzID0gcmVjdXJzaXZlOworICAgIGZpbGNudCA9IDA7CisKKyNpZmRlZiBXSEFUQU1JCisgICAgLyogSWYgdGhleSBhcmUgYWxpa2UgdGhpcyB3YXMgYWxyZWFkeSBkb25lIGluIHdob2FyZXdlKCkgKi8KKyAgICBkZWJ1ZyhGMTAxLCJzZ2V0aW5pdCB3aGF0cnUiLCIiLHdoYXRydSk7CisgICAgaWYgKHdoYXRydSAmIFdNSV9GTEFHKSB7CQkvKiBEaWQgd2UgZ2V0IFdIQVRBTUkgaW5mbz8gKi8KKwlkZWJ1ZyhGMTAxLCJzZ2V0aW5pdCBiaW5hcnkgKDEpIiwiIixiaW5hcnkpOworI2lmZGVmIFZNUworCWlmIChiaW5hcnkgIT0gWFlGVF9JICYmIGJpbmFyeSAhPSBYWUZUX0wpCisjZWxzZQorI2lmZGVmIE9TMgorCSAgaWYgKGJpbmFyeSAhPSBYWUZUX0wpCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVk1TICovCisJICAgIGJpbmFyeSA9ICh3aGF0cnUgJiBXTUlfRk1PREUpID8gLyogWWVzLCBzZXQgZmlsZSB0eXBlICovCisJICAgICAgWFlGVF9CIDogWFlGVF9UOwkvKiBhdXRvbWF0aWNhbGx5ICovCisJZGVidWcoRjEwMSwic2dldGluaXQgYmluYXJ5ICgyKSIsIiIsYmluYXJ5KTsKKwlpZiAoIXdlYXJlYWxpa2UpCisJICBmbmNudiA9ICh3aGF0cnUgJiBXTUlfRk5BTUUpID8gMSA6IDA7IC8qIEFuZCBuYW1lIGNvbnZlcnNpb24gKi8KKyAgICB9CisjZW5kaWYgLyogV0hBVEFNSSAqLworCisgICAgZnMgPSAoY2hhciAqKXNydmNtZDsKKyAgICBzcnZwdHIgPSBzcnZjbWQ7CQkJLyogUG9pbnQgdG8gc2VydmVyIGNvbW1hbmQgYnVmZmVyICovCisgICAgZGVjb2RlKHJkYXRhcCxwdXRzcnYsMCk7CQkvKiBEZWNvZGUgdGhlIEdFVCBjb21tYW5kIGludG8gaXQgKi8KKyAgICAvKiBBY2NlcHQgbXVsdGlwbGUgZmlsZXNwZWNzICovCisgICAgY21hcmcyID0gIiI7CQkJLyogRG9uJ3QgdXNlIGNtYXJnMiAqLworICAgIGNtYXJnID0gIiI7CQkJCS8qIERvbid0IHVzZSBjbWFyZyAqLworCisgICAgZG9uZSA9IDE7CQkJCS8qIE9ubHkgMSBwYWNrZXQgbmVlZGVkLi4uICovCisgICAgaWYgKHhnZXQpIHsJCQkJLyogU3BlY2lhbCBkZWNvZGluZyBmb3IgRXh0ZW5kZWQgR0VUICovCisJY2hhciBMLCBuZXh0LCBjOwkJLyogUExWIGl0ZW1zICovCisJaW50IGxlbiwgdmFsOwkJCS8qIE1vcmUgUExWIGl0ZW1zICovCisJY2hhciAqIHAgPSAoY2hhciAqKXNydmNtZDsJLyogU3RyaW5nIHRvIGRlY29kZSAqLworCisJZG9uZSA9IDA7CQkJLyogTWF5YmUgbW9yZSBwYWNrZXRzIG5lZWRlZCAqLworCWZzID0gTlVMTDsJCQkvKiBXZSBkb24ndCBrbm93IHRoZSBmaWxlc3BlYyB5ZXQgKi8KKwljID0gKnArKzsJCQkvKiBHZXQgZmlyc3QgcGFyYW1ldGVyICovCisKKwl3aGlsZSAoYykgewkJCS8qIEZvciBhbGwgcGFyYW1ldGVycy4uLiAqLworCSAgICBkZWJ1ZyhGMDAwLCJzZ2V0aW5pdCBjIiwiIixjKTsKKwkgICAgTCA9ICpwKys7CQkJLyogR2V0IGxlbmd0aCAqLworCSAgICBpZiAoTCA+PSBTUCkJCS8qIERlY29kZSBsZW5ndGggKi8KKwkgICAgICBsZW4gPSB4dW5jaGFyKEwpOworCSAgICBlbHNlIGlmIChjID09ICdAJykgewkvKiBBbGxvdyBtaXNzaW5nIEVPUCBsZW5ndGggZmllbGQgKi8KKwkJbGVuID0gMDsKKwkgICAgfSBlbHNlIHsKKwkJbGVuID0gKHh1bmNoYXIoKnArKykgKiA5NSk7CisJCWxlbiArPSB4dW5jaGFyKCpwKyspOworCSAgICB9CisJICAgIGRlYnVnKEYxMDEsInNnZXRpbml0IGxlbiIsIiIsbGVuKTsKKwkgICAgbmV4dCA9ICoocCtsZW4pOwkJLyogR2V0IG5leHQgcGFyYW1ldGVyICovCisJICAgICoocCtsZW4pID0gTlVMOwkJLyogWmVybyBpdCBvdXQgdG8gdGVybWluYWwgdmFsdWUgKi8KKwkgICAgZGVidWcoRjExMCwic2dldGluaXQgcCIscCwwKTsKKwkgICAgc3dpdGNoIChjKSB7CQkvKiBEbyB0aGUgcGFyYW1ldGVyICovCisJICAgICAgY2FzZSAnTyc6CQkJLyogR0VUIE9wdGlvbnMgKi8KKwkJdmFsID0gYXRvaShwKTsJCS8qIENvbnZlcnQgdG8gaW50ICovCisJCWRlYnVnKEYxMDEsInNnZXRpbml0IE8gdmFsIiwiIix2YWwpOworCQlpZiAodmFsICYgR09QVF9ERUwpIG1vdmluZyA9IDE7CisJCWlmICh2YWwgJiBHT1BUX1JFUykgcmVnZXQgPSAxOworCQlpZiAodmFsICYgR09QVF9SRUMpIHsKKwkJICAgIHJlY3Vyc2l2ZSA9IDE7CisJCSAgICBub2xpbmtzID0gMjsKKwkJICAgIGlmIChmbnNwYXRoID09IFBBVEhfT0ZGKQorCQkgICAgICBmbnNwYXRoID0gUEFUSF9SRUw7CisJCX0KKwkJYnJlYWs7CisJICAgICAgY2FzZSAnTSc6CQkJLyogVHJhbnNmZXIgTW9kZSAqLworCQl2YWwgPSBhdG9pKHApOworCQlkZWJ1ZyhGMTAxLCJzZ2V0aW5pdCBNIHZhbCIsIiIsdmFsKTsKKwkJaWYgKHZhbCA8IDEpCisJCSAgYnJlYWs7CisJCXBhdHRlcm5zID0gMDsJCS8qIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBwYXR0ZXJucyAqLworCQlmaWxlcGVlayA9IDA7CQkvKiBhbmQgRklMRSBTQ0FOICovCisJCWlmICh2YWwgPT0gR01PRF9UWFQpIGJpbmFyeSA9IFhZRlRfVDsgLyogVGV4dCAqLworCQlpZiAodmFsID09IEdNT0RfQklOKSBiaW5hcnkgPSBYWUZUX0I7IC8qIEJpbmFyeSAqLworCQlpZiAodmFsID09IEdNT0RfTEJMKSBiaW5hcnkgPSBYWUZUX0w7IC8qIExhYmVsZWQgKi8KKwkJYnJlYWs7CisJICAgICAgY2FzZSAnRic6CQkJLyogRmlsZW5hbWUgKi8KKwkJZnMgPSBwOworCQlkZWJ1ZyhGMTEwLCJzZ2V0aW5pdCBmaWxlbmFtZSIsZnMsMCk7CisJCWJyZWFrOworCSAgICAgIGNhc2UgJ0AnOgkJCS8qIEVuZCBPZiBQYXJhbWV0ZXJzICovCisJCWRvbmUgPSAxOworCQlkZWJ1ZyhGMTAwLCJzZ2V0aW5pdCBFT1AiLCIiLDApOworCQlicmVhazsKKwkgICAgICBkZWZhdWx0OgorCQllcnJwa3QoKENIQVIgKikiVW5rbm93biBHRVQgUGFyYW1ldGVyIik7CisJCWRlYnVnKEYxMDAsInNnZXRpbml0IHVua25vd24gcGFyYW1ldGVyIiwiIiwwKTsKKwkJcmV0dXJuKC0xKTsKKwkgICAgfQorCSAgICBwICs9IChsZW4gKyAxKTsKKwkgICAgYyA9IG5leHQ7CisJfQorICAgIH0KKyAgICBpZiAoIWZzKSBmcyA9ICIiOwkJCS8qIEEgZmlsZW5hbWUgaXMgcmVxdWlyZWQgKi8KKyAgICBpZiAoKmZzKSB7CisJaGF2ZWZzID0gMTsKKwluID0gMDsJCQkJLyogQ2hlY2sgZm9yIHF1b3RlZCBuYW1lICovCisJaWYgKChuID0gc3RybGVuKGZzKSkgPiAxKSB7CisJICAgIC8qIE5vdGU6IHRoaXMgZG9lcyBub3QgYWxsb3cgZm9yIG11bHRpcGxlIHF1b3RlZCBuYW1lcyAqLworCSAgICBpZiAoKGZzWzBdID09ICd7JyAmJiBmc1tuLTFdID09ICd9JykgfHwKKwkJKGZzWzBdID09ICciJyAmJiBmc1tuLTFdID09ICciJykpIHsKKwkJZnNbbi0xXSA9ICdcMCc7CisJCWZzKys7CisJCWRlYnVnKEYxMTEsInNnZXRpbml0IHVucXVvdGVkIGZpbGVuYW1lIixmcyxuKTsKKwkgICAgfSBlbHNlCisJICAgICAgbiA9IDA7CQkJLyogVGhpcyBtZWFucyBubyBxdW90aW5nICovCisJfQorCisjaWZkZWYgUElQRVNFTkQKKwlkZWJ1ZyhGMTExLCJzZ2V0aW5pdCIsZnMsdXNlcGlwZXMpOworCWlmICh1c2VwaXBlcyAmJiBFTkFCTEVEKGVuX2hvcykgJiYgKmZzID09ICchJykgeworCSAgICBjbWFyZyA9IGZzICsgMTsJCS8qIFBvaW50IHBhc3QgdGhlIGJhbmcgKi8KKwkgICAgKmZzID0gTlVMOworCSAgICBuZmlscyA9IC0xOworCSAgICBwaXBlc2VuZCA9IDE7CisJICAgIGRlYnVnKEYxMTEsInNnZXRpbml0IHBpcGVzZW5kIixjbWFyZyxwaXBlc2VuZCk7CisJfQorCWlmICghcGlwZXNlbmQpIHsJCS8qIElmIGl0J3Mgbm90IGEgcGlwZSAqLworI2VuZGlmIC8qIFBJUEVTRU5EICovCisJICAgIGlmIChuID09IDApIHsJCS8qIElmIHRoZSBuYW1lIHdhcyBub3QgcXVvdGVkICovCisjaWZuZGVmIE5PTVNFTkQKKwkJbmZpbHMgPSBmbnBhcnNlKGZzKTsJLyogQWxsb3cgaXQgdG8gYmUgYSBsaXN0IG9mIG5hbWVzICovCisJCWRlYnVnKEYxMTEsInNnZXRpbml0IEEiLGZzLG5maWxzKTsKKyNpZmRlZiBDT01NRU5UCisvKiBUaGlzIGRvZXNuJ3Qgd29yayBpZiBhIEdFVC1QQVRIIGlzIHNldC4gKi8KKwkJaWYgKG5maWxzID09IDEgJiYgIWlzd2lsZChmcykpIHsgLyogU2luZ2xlIGZpbGUgKi8KKwkJICAgIGNoYXIgKiBtOworCQkgICAgaWYgKCh4ID0gemNoa2koZnMpKSA8IDApIHsgLyogQ2hlY2sgaWYgaXQncyBzZW5kYWJsZSAqLworCQkJc3dpdGNoICh4KSB7CisJCQkgIGNhc2UgLTE6IG0gPSAiRmlsZSBub3QgZm91bmQiOyBicmVhazsKKwkJCSAgY2FzZSAtMjogbSA9ICJOb3QgYSByZWd1bGFyIGZpbGUiOyBicmVhazsKKwkJCSAgY2FzZSAtMzogbSA9ICJSZWFkIGFjY2VzcyBkZW5pZWQiOyBicmVhazsKKwkJCX0KKwkJCWVycnBrdCgoQ0hBUiAqKW0pOworCQkJcmV0dXJuKC0xKTsKKwkJICAgIH0KKwkJfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgICAgfSBlbHNlIHsJCQkvKiBJZiBpdCB3YXMgcXVvdGVkICovCisjZW5kaWYgLyogTk9NU0VORCAqLworCQluenhvcHRzID0gMDsKKyNpZmRlZiBVTklYT1JPU0sKKwkJaWYgKG1hdGNoZG90KSAgbnp4b3B0cyB8PSBaWF9NQVRDSERPVDsKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKwkJaWYgKHJlY3Vyc2l2ZSkgbnp4b3B0cyB8PSBaWF9SRUNVUlNFOworCQkvKiBUcmVhdCBhcyBhIHNpbmdsZSBmaWxlc3BlYyAqLworCQluZmlscyA9IDAgLSBuenhwYW5kKGZzLG56eG9wdHMpOworCQlkZWJ1ZyhGMTExLCJzZ2V0aW5pdCBCIixmcyxuZmlscyk7CisJCWNtYXJnID0gZnM7CisJICAgIH0KKyNpZmRlZiBQSVBFU0VORAorCX0KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworICAgIH0KKyAgICBpZiAoIWRvbmUpIHsJCQkvKiBOZWVkIG1vcmUgTyBwYWNrZXRzLi4uICovCisJZGVidWcoRjEwMCwic2dldGluaXQgTy1QYWNrZXQgVEJDIiwiIiwwKTsgLyogVG8gQmUgQ29udGludWVkICovCisJcmV0dXJuKDEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTAwLCJzZ2V0aW5pdCBPLVBhY2tldCBkb25lIC0gaGF2ZWZzIiwiIixoYXZlZnMpOworICAgIGlmICghaGF2ZWZzKSB7CQkJLyogRG9uZSAtIG1ha2Ugc3VyZSB3ZSBoYXZlIGZpbGVuYW1lICovCisJZXJycGt0KChDSEFSICopIkdFVCB3aXRob3V0IGZpbGVuYW1lIik7CisJcmV0dXJuKC0xKTsKKyAgICB9CisgICAgZnJlZXJwa3Qod2lubG8pOworICAgIHdpbmxvID0gMDsJCQkJLyogQmFjayB0byBwYWNrZXQgMCBhZ2Fpbi4gKi8KKyAgICBkZWJ1ZyhGMTAxLCJzZ2V0aW5pdCB3aW5sbyIsIiIsd2lubG8pOworICAgIG5ha3N0YXRlID0gMDsJCQkvKiBOb3cgSSdtIHRoZSBzZW5kZXIhICovCisgICAgaWYgKHJlZ2V0KSBzZW5kbW9kZSA9IFNNX1JFU0VORDsKKyAgICBpZiAoc2luaXQoKSA+IDApIHsJCQkvKiBTZW5kIFNlbmQtSW5pdCAqLworI2lmZGVmIFNUUkVBTUlORworCWlmICghc3RyZWFtaW5nKQorI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCSAgdGltaW50ID0gY2hrdGltbyhydGltbyx0aW1lZik7IC8qIFN3aXRjaCB0byBwZXItcGFja2V0IHRpbWVyICovCisJcmV0dXJuKDApOwkJCS8qIElmIHN1Y2Nlc3NmdWwsIHN3aXRjaCBzdGF0ZSAqLworICAgIH0gZWxzZSByZXR1cm4oLTEpOwkJCS8qIEVsc2UgYmFjayB0byBzZXJ2ZXIgY29tbWFuZCB3YWl0ICovCit9CisKKyNlbHNlICAvKiBOT1hGRVIgKi8KKworI2luY2x1ZGUgImNrY2RlYi5oIgorCitWT0lECitwcm90bygpIHsKKyAgICBleHRlcm4gaW50IHN1Y2Nlc3M7CisgICAgc3VjY2VzcyA9IDA7Cit9CisjZW5kaWYgLyogTk9YRkVSICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2tjc2lnLmggYi9ja2VybWl0LTguMC4yMTEvY2tjc2lnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmYjhiZgotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja2NzaWcuaApAQCAtMCwwICsxLDIxNCBAQAorLyogIEMgSyBDIFMgSSBHIC4gSCAgKi8KKworLyogIERlZmluaXRpb25zIGFuZCBwcm90b3R5cGVzIGZvciBzaWduYWwgaGFuZGxpbmcgICovCisKKy8qCisgIEF1dGhvcjogSmVmZnJleSBFIEFsdG1hbiAoamFsdG1hbkBzZWN1cmUtZW5kcG9pbnRzLmNvbSksCisgIFNlY3VyZSBFbmRwb2ludHMgSW5jLiwgTmV3IFlvcmsgQ2l0eS4KKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorKi8KKyNpZmRlZiBPUzIKKyNpZm5kZWYgTlQKKyNpZm5kZWYgX19IRVZfXyAgICAgICAgICAgICAgICAgLyogSU5DTF9TRU1BUEhPUkUgbWF5IGFsc28gZGVmaW5lIEhFViAqLworI2RlZmluZSBfX0hFVl9fCit0eXBlZGVmICBVTE9ORyAgICBIRVY7ICAgICAgICAgICAgICAgICAgLyogaGV2ICovCit0eXBlZGVmICBIRVYgICAgICAqUEhFVjsKKyNlbmRpZiAvKiBfX0hFVl9fICovCisjZW5kaWYgLyogTlQgKi8KK3N0cnVjdCBfdGhyZWFkaW5mbyB7CisgICAgaW50IGludXNlOworICAgIGludCBjaGlsZDsKKyAgICBpbnQgc2libGluZzsKKyNpZmRlZiBOVAorICAgIEhBTkRMRSBpZDsKKyAgICBIQU5ETEUgaGFuZGxlOworICAgIEhBTkRMRSBwYXJlbnQ7CisgICAgSEFORExFIENvbXBsZXRpb25TZW0gOworICAgIEhBTkRMRSBEaWVTZW0gOworI2Vsc2UgLyogTlQgKi8KKyAgICBUSUQgaWQ7CisgICAgVElEIHBhcmVudDsKKyAgICBIRVYgQ29tcGxldGlvblNlbTsKKyAgICBIRVYgRGllU2VtOworI2VuZGlmIC8qIE5UICovCit9OworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgQ0tfQU5TSUMKK3R5cGVkZWYgU0lHVFlQICgqY2tfc2lnZnVuYykodm9pZCAqKTsKK3R5cGVkZWYgU0lHVFlQICgqY2tfc2lnaGFuZCkoaW50KTsKKyNlbHNlCit0eXBlZGVmIFNJR1RZUCAoKmNrX3NpZ2Z1bmMpKCk7Cit0eXBlZGVmIFNJR1RZUCAoKmNrX3NpZ2hhbmQpKCk7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKworLyogTWFjcm9zIGZvciBQT1NJWCB2cyBvbGQtc3R5bGUgc2lnbmFsIGhhbmRsaW5nLiAqLworCisjaWZkZWYgQ0tfUE9TSVhfU0lHCit0eXBlZGVmIHNpZ2ptcF9idWYgY2tqbXBidWY7CisjZWxzZQorI2lmZGVmIE5UCisjZGVmaW5lIE5PQ1JZUFQKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaWZkZWYgTlRBU00KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDT05URVhUIGNvbnRleHQ7CisgICAgRFdPUkQgcmV0Y29kZTsKK30gY2tqbXBidWY7CisjZWxzZSAvKiBOVEFTTSAqLwordHlwZWRlZiBqbXBfYnVmIGNram1wYnVmOworI2VuZGlmIC8qIE5UQVNNICovCisjZWxzZQordHlwZWRlZiBqbXBfYnVmIGNram1wYnVmOworI2VuZGlmCisjZW5kaWYgLyogQ0tfUE9TSVhfU0lHICovCisvKgorICBTdXBwb3NlIHlvdSB3YW50IHRvIHBhc3MgdGhlIGFkZHJlc3Mgb2YgYSBqbXBfYnVmIGJhciB0byBhIGZ1bmN0aW9uIGZvby4KKyAgU2luY2Ugam1wX2J1ZiBpcyBub3JtYWxseSBkZWZpbmVkICh0eXBlZGVmJ2QpIGFzIGFuIGFycmF5LCB5b3Ugd291bGQgZG8KKyAgaXQgbGlrZSB0aGlzOiAgZm9vKGJhciksIHdoZXJlIGZvbyA9IGZvbyhqbXBfYnVmIGJhcikuICBCdXQgc3VwcG9zZSBhCisgIGptcF9idWYgaXMgKHNheSkgYSBzdHJ1Y3QgcmF0aGVyIHRoYW4gYW4gYXJyYXkuICBUaGVuIHlvdSBtdXN0IGRvCisgIGZvbygmYmFyKSB3aGVyZSBmb28gaXMgZm9vKGptcF9idWYgKiBiYXIpLiAgVGhpcyBpcyBjb250cm9sbGVkIGhlcmUgaW4KKyAgdGhlIHRyYWRpdGlvbmFsIGZhc2hpb24sIGJ5IGlmZGVmcy4gIEJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGF0IGptcF9idWYKKyAgaXMgYW4gYXJyYXkuICBEZWZpbmUgdGhlIHN5bWJvbCBKQk5PVEFSUkFZIGlmIGptcF9idWYgaXMgbm90IGFuIGFycmF5LgorKi8KKyNpZm5kZWYgSkJOT1RBUlJBWQorI2lmZGVmIE5UCisjZGVmaW5lIEpCTk9UQVJSQVkKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIEpCTk9UQVJSQVkgKi8KKworI2lmZGVmIEpCTk9UQVJSQVkKK3R5cGVkZWYgY2tqbXBidWYgKiBja2pwdHI7CisjZGVmaW5lIGNramFkZHIoeCkgJiB4CisjZGVmaW5lIGNramRyZWYoeCkgKiB4CisjaWZkZWYgQ0tfUE9TSVhfU0lHCisjZGVmaW5lIGNrc2V0am1wKHgpIHNpZ3NldGptcCh4LDEpCisjZGVmaW5lIGNrbG9uZ2ptcCh4LHkpIHNpZ2xvbmdqbXAoeCx5KQorI2Vsc2UKKyNpZmRlZiBOVAorX19pbmxpbmUgaW50Citja19paCh2b2lkKSB7CisgICAgZXh0ZXJuIGludCBUbHNJbmRleDsKKyNpZmRlZiBOVFNJRworICAgIHN0cnVjdCBfdGhyZWFkaW5mbyAqIHRocmVhZGluZm87CisgICAgdGhyZWFkaW5mbyA9IChzdHJ1Y3QgX3RocmVhZGluZm8gKikgVGxzR2V0VmFsdWUoVGxzSW5kZXgpOworICAgIGlmICh0aHJlYWRpbmZvKSB7CisgICAgICAgIGlmIChXYWl0QW5kUmVzZXRTZW0odGhyZWFkaW5mby0+RGllU2VtLDApKSB7CisgICAgICAgICAgICBja1RocmVhZERpZSh0aHJlYWRpbmZvKTsKKyAgICAgICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgICAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBleGVjdXRlICovCisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgIGVsc2UgZGVidWcoIEYxMDAsICJja19paCgpIHRocmVhZGluZm8gaXMgTlVMTCIsIiIsMCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIE5UU0lHICovCisgICAgcmV0dXJuIDA7Cit9CisjaWZkZWYgTlRTSUcKKyNkZWZpbmUgY2tzZXRqbXAoeCkgc2V0am1wKHgpCisjZGVmaW5lIGNrbG9uZ2ptcCh4LHkpIGxvbmdqbXAoeCx5KQorI2Vsc2UgLyogTlRTSUcgKi8KKyNpZmRlZiBOVEFTTQorX19pbmxpbmUgRFdPUkQKK2Nrc2V0am1wKCBja2pwdHIgam1wICkgeworICAgIGV4dGVybiBpbnQgaXNpbnRlcnJ1cHRlZDsKKyAgICBqbXAtPnJldGNvZGUgPSAwOworICAgIG1lbXNldCggJmptcC0+Y29udGV4dCwgMCwgc2l6ZW9mKENPTlRFWFQpICk7CisgICAgam1wLT5jb250ZXh0LkNvbnRleHRGbGFncyA9IENPTlRFWFRfRlVMTCA7CisgICAgaWYgKCAhR2V0VGhyZWFkQ29udGV4dCggR2V0Q3VycmVudFRocmVhZCgpLCAmam1wLT5jb250ZXh0ICkgKQorICAgICAgZGVidWcoIEYxMDEsICJja3NldGptcCBHZXRUaHJlYWRDb250ZXh0IGZhaWxlZCIsIiIsR2V0TGFzdEVycm9yKCkpOworICAgIGRlYnVnKEYxMDEsImNrc2V0am1wIHJldHVybnMiLCIiLGptcC0+cmV0Y29kZSk7CisgICAgaXNpbnRlcnJ1cHRlZCA9IDA7CisgICAgcmV0dXJuIChqbXAtPnJldGNvZGUpOworfQorCitfX2lubGluZSB2b2lkCitja2xvbmdqbXAoIGNranB0ciBqbXAsIGludCByZXR2YWwgKSB7CisgICAgZXh0ZXJuIEhBTkRMRSB0aWRDb21tYW5kOworICAgIGV4dGVybiBpbnQgdHR5ZmQsIG1kbXR5cCA7CisgICAgZXh0ZXJuIERXT1JEIENvbW1hbmRJRDsKKyAgICBleHRlcm4gaW50IGlzaW50ZXJydXB0ZWQ7CisKKyAgICBjb25ub2koKTsKKyAgICBpc2ludGVycnVwdGVkID0gMTsKKyAgICBqbXAtPnJldGNvZGUgPSAoIHJldHZhbCA/IHJldHZhbCA6IDEgKTsKKyAgICBkZWJ1ZyhGMTAxLCJhYm91dCB0byBTZXRUaHJlYWRDb250ZXh0IGZvciB0aHJlYWQiLCIiLCBDb21tYW5kSUQpOworICAgIGRlYnVnKEYxMDEsImZyb20gVGhyZWFkIiwiIixHZXRDdXJyZW50VGhyZWFkSWQoKSk7CisgICAgaWYgKCBtZG10eXAgPj0gMCApIHsKKyAgICAgICAgUHVyZ2VDb21tKCAoSEFORExFKSB0dHlmZCwgUFVSR0VfVFhBQk9SVCB8IFBVUkdFX1JYQUJPUlQgKTsKKyAgICB9CisgICAgaWYgKFNldFRocmVhZENvbnRleHQoIHRpZENvbW1hbmQsICZqbXAtPmNvbnRleHQgKSkKKyAgICAgIGRlYnVnKEYxMDAsImNrbG9uZ2ptcCBTZXRUaHJlYWRDb250ZXh0IHN1Y2Nlc3MiLCIiLDApOworICAgIGVsc2UKKyAgICAgIGRlYnVnKEYxMDEsImNrbG9uZ2ptcCBTZXRUaHJlYWRDb250ZXh0IGZhaWxlZCIsIiIsR2V0TGFzdEVycm9yKCkpOworICAgIG1zbGVlcCg1MCk7CisgICAgY21pbmkoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgY29tbWFuZCBwYXJzZXIgKi8KKyAgICBwdXRrZXkoMTMpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdHVmZiBhIGNhcnJpYWdlIHJldHVybiAqLworICAgLyogUG9zdEV2ZW50QXZhaWxTZW0oKTsgKi8KK30KKyNlbHNlIC8qIE5UQVNNICovCit2b2lkIGNyYXNoKCB2b2lkICkgOworI2RlZmluZSBja3NldGptcCh4KSBzZXRqbXAoeCkKK19faW5saW5lIHZvaWQKK2NrbG9uZ2ptcCggY2tqcHRyIGptcCwgaW50IHJldHZhbCApIHsKKyAgICBleHRlcm4gSEFORExFIHRpZENvbW1hbmQ7CisgICAgZXh0ZXJuIGludCB0dHlmZCwgbWRtdHlwOworICAgIGV4dGVybiBEV09SRCBDb21tYW5kSUQ7CisgICAgQ09OVEVYVCBjb250ZXh0OworCisgICAgaWYgKCBtZG10eXAgPj0gMCApIHsKKyAgICAgICAgUHVyZ2VDb21tKCAoSEFORExFKSB0dHlmZCwgUFVSR0VfVFhBQk9SVCB8IFBVUkdFX1JYQUJPUlQgKSA7CisgICAgfQorICAgIG1lbXNldCggJmNvbnRleHQsIDAsIHNpemVvZihDT05URVhUKSApOworICAgIGNvbnRleHQuQ29udGV4dEZsYWdzID0gQ09OVEVYVF9GVUxMOworICAgIGlmICggIUdldFRocmVhZENvbnRleHQoIHRpZENvbW1hbmQsICZjb250ZXh0ICkgKQorICAgICAgZGVidWcoIEYxMDEsICJja2xvbmdqbXAgR2V0VGhyZWFkQ29udGV4dCBmYWlsZWQiLCIiLEdldExhc3RFcnJvcigpKTsKKworICAgIC8qIEludmFsaWRhdGUgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgKi8KKyAgICBjb250ZXh0LkVpcCA9ICAodW5zaWduZWQgbG9uZykgY3Jhc2g7CisKKyAgICBkZWJ1ZyhGMTAxLCJhYm91dCB0byBTZXRUaHJlYWRDb250ZXh0IGZvciB0aHJlYWQiLCIiLCBDb21tYW5kSUQpOworICAgIGRlYnVnKEYxMDEsImZyb20gVGhyZWFkIiwiIixHZXRDdXJyZW50VGhyZWFkSWQoKSk7CisgICAgaWYgKFNldFRocmVhZENvbnRleHQoIHRpZENvbW1hbmQsICZjb250ZXh0ICkpCisgICAgICBkZWJ1ZyhGMTAwLCJja2xvbmdqbXAgU2V0VGhyZWFkQ29udGV4dCBzdWNjZXNzIiwiIiwwKTsKKyAgICBlbHNlCisgICAgICBkZWJ1ZyhGMTAxLCJja2xvbmdqbXAgU2V0VGhyZWFkQ29udGV4dCBmYWlsZWQiLCIiLEdldExhc3RFcnJvcigpKTsKK30KKyNlbmRpZiAvKiBOVEFTTSAqLworI2VuZGlmIC8qIE5UU0lHICovCisjZWxzZSAvKiBOVCAqLworI2RlZmluZSBja3NldGptcCh4KSBzZXRqbXAoeCkKKyNkZWZpbmUgY2tsb25nam1wKHgseSkgbG9uZ2ptcCh4LHkpCisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBDS19QT1NJWF9TSUcgKi8KKyNlbHNlICAvKiBqbXBfYnVmIGlzIGFuIGFycmF5ICovCit0eXBlZGVmIGNram1wYnVmIGNranB0cjsKKyNkZWZpbmUgY2tqYWRkcih4KSB4CisjZGVmaW5lIGNramRyZWYoeCkgeAorI2lmZGVmIENLX1BPU0lYX1NJRworI2RlZmluZSBja3NldGptcCh4KSBzaWdzZXRqbXAoeCwxKQorI2RlZmluZSBja2xvbmdqbXAoeCx5KSBzaWdsb25nam1wKHgseSkKKyNlbHNlCisjZGVmaW5lIGNrc2V0am1wKHgpIHNldGptcCh4KQorI2RlZmluZSBja2xvbmdqbXAoeCx5KSBsb25nam1wKHgseSkKKyNlbmRpZiAvKiBDS19QT1NJWF9TSUcgKi8KKyNlbmRpZiAvKiBKQk5PVEFSUkFZICovCisKK19QUk9UT1RZUCggaW50IGNjX2V4ZWN1dGUsIChja2pwdHIsIGNrX3NpZ2Z1bmMsIGNrX3NpZ2Z1bmMpICk7CitfUFJPVE9UWVAoIGludCBhbHJtX2V4ZWN1dGUsCisgICAgICAgICAgKGNranB0ciwKKyAgICAgICAgICAgaW50IC8qIHRpbW8gKi8sCisgICAgICAgICAgIGNrX3NpZ2hhbmQgLyogaGFuZGxlciAqLywKKyAgICAgICAgICAgY2tfc2lnZnVuYywgY2tfc2lnZnVuYykgKTsKK19QUk9UT1RZUCggaW50IGNjX2Fscm1fZXhlY3V0ZSwKKyAgICAgICAgICAoY2tqcHRyLAorICAgICAgICAgICBpbnQgLyogdGltbyAqLywKKyAgICAgICAgICAgY2tfc2lnaGFuZCAvKiBoYW5kbGVyICovLAorICAgICAgICAgICBja19zaWdmdW5jLAorICAgICAgICAgICBja19zaWdmdW5jKSApOworCisvKiBFbmQgb2YgY2t1c2lnLmggKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja2Nzc2wuaCBiL2NrZXJtaXQtOC4wLjIxMS9ja2Nzc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTMxZjEyCi0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrY3NzbC5oCkBAIC0wLDAgKzEsMTI2IEBACisjaWZkZWYgQ0tfU1NMCisjaWZuZGVmIENLX0FOU0lDCisjZGVmaW5lIE5PUFJPVE8KKyNlbmRpZiAvKiBDS19BTlNJQyAqLworI2luY2x1ZGUgImJpby5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgIng1MDkuaCIKKyNpbmNsdWRlICJwZW0uaCIKKyNpbmNsdWRlICJzc2wuaCIKKworZXh0ZXJuIEJJTyAqYmlvX2VycjsKK2V4dGVybiBTU0wgKnNzbF9jb247CitleHRlcm4gU1NMX0NUWCAqc3NsX2N0eDsKK2V4dGVybiBpbnQgc3NsX2RlYnVnX2ZsYWc7CitleHRlcm4gaW50IHNzbF9vbmx5X2ZsYWc7CitleHRlcm4gaW50IHNzbF9hY3RpdmVfZmxhZzsKK2V4dGVybiBpbnQgc3NsX3ZlcmlmeV9mbGFnOworZXh0ZXJuIGludCBzc2xfc2VjdXJlX2ZsYWc7CitleHRlcm4gaW50IHNzbF92ZXJib3NlX2ZsYWc7CitleHRlcm4gaW50IHNzbF9kaXNhYmxlZF9mbGFnOworZXh0ZXJuIGludCBzc2xfY2VydF9yZXF1aXJlZDsKK2V4dGVybiBpbnQgc3NsX2NlcnRzb2tfZmxhZzsKK2V4dGVybiBpbnQgc3NsX2R1bW15X2ZsYWc7CisKK2V4dGVybiBjaGFyICpzc2xfbG9nX2ZpbGU7CitleHRlcm4gY2hhciAqc3NsX3JzYV9jZXJ0X2ZpbGU7CitleHRlcm4gY2hhciAqc3NsX3JzYV9rZXlfZmlsZTsKK2V4dGVybiBjaGFyICpzc2xfZHNhX2NlcnRfZmlsZTsKK2V4dGVybiBjaGFyICpzc2xfZGhfa2V5X2ZpbGU7CitleHRlcm4gY2hhciAqc3NsX2NpcGhlcl9saXN0OworCitleHRlcm4gU1NMX0NUWCAqdGxzX2N0eDsKK2V4dGVybiBTU0wgKnRsc19jb247CitleHRlcm4gaW50IHRsc19vbmx5X2ZsYWc7CitleHRlcm4gaW50IHRsc19hY3RpdmVfZmxhZzsKK2V4dGVybiBpbnQgdGxzX3NlY3VyZV9mbGFnOworCitfUFJPVE9UWVAoaW50IHNzbF9kb19pbml0LChpbnQpKTsKK19QUk9UT1RZUChpbnQgc3NsX2Rpc3BsYXlfY29ubmVjdF9kZXRhaWxzLChTU0wgKixpbnQpKTsKK19QUk9UT1RZUChpbnQgc3NsX3NlcnZlcl92ZXJpZnlfY2FsbGJhY2ssKGludCwgWDUwOV9TVE9SRV9DVFggKikpOworX1BST1RPVFlQKGludCBzc2xfY2xpZW50X3ZlcmlmeV9jYWxsYmFjaywoaW50LCBYNTA5X1NUT1JFX0NUWCAqKSk7CisKKyNpZmRlZiBPUzIKKyNkZWZpbmUgU1NMX2dldF9lcnJvciAgICAgICAgICAgICAgICAgICAgY2tfU1NMX2dldF9lcnJvcgorI2RlZmluZSBTU0xfcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICBja19TU0xfcmVhZAorI2RlZmluZSBTU0xfcGVlayAgICAgICAgICAgICAgICAgICAgICAgICBja19TU0xfcGVlaworI2RlZmluZSBTU0xfY29ubmVjdCAgICAgICAgICAgICAgICAgICAgICBja19TU0xfY29ubmVjdAorI2RlZmluZSBTU0xfc2V0X2ZkICAgICAgICAgICAgICAgICAgICAgICBja19TU0xfc2V0X2ZkCisjZGVmaW5lIFNTTF9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgIGNrX1NTTF9mcmVlCisjZGVmaW5lIFNTTF9zaHV0ZG93biAgICAgICAgICAgICAgICAgICAgIGNrX1NTTF9zaHV0ZG93bgorI2RlZmluZSBTU0xfd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICBja19TU0xfd3JpdGUKKyNkZWZpbmUgU1NMX3BlbmRpbmcgICAgICAgICAgICAgICAgICAgICAgY2tfU1NMX3BlbmRpbmcKKyNkZWZpbmUgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncyAgICAgICAgICAgY2tfU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncworI2RlZmluZSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUgICAgICAgICBja19TU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUKKyNkZWZpbmUgU1NMX0NJUEhFUl9nZXRfbmFtZSAgICAgICAgICAgICAgY2tfU1NMX0NJUEhFUl9nZXRfbmFtZQorI2RlZmluZSBTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyICAgICAgICAgICBja19TU0xfZ2V0X2N1cnJlbnRfY2lwaGVyCisjZGVmaW5lIFNTTF9nZXRfc2hhcmVkX2NpcGhlcnMgICAgICAgICAgIGNrX1NTTF9nZXRfc2hhcmVkX2NpcGhlcnMKKyNkZWZpbmUgU1NMX2dldF9jaXBoZXJzICAgICAgICAgICAgICAgICAgY2tfU1NMX2dldF9jaXBoZXJzCisjZGVmaW5lIFNTTF9nZXRfY2lwaGVyX2xpc3QgICAgICAgICAgICAgIGNrX1NTTF9nZXRfY2lwaGVyX2xpc3QKKyNkZWZpbmUgU1NMX0NUWF9zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMgY2tfU1NMX0NUWF9zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMKKyNkZWZpbmUgU1NMX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUgICAgICAgY2tfU1NMX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUKKyNkZWZpbmUgU1NMX3VzZV9EU0FQcml2YXRlS2V5X2ZpbGUgICAgICAgY2tfU1NMX3VzZV9EU0FQcml2YXRlS2V5X2ZpbGUKKyNkZWZpbmUgU1NMX3VzZV9Qcml2YXRlS2V5X2ZpbGUgICAgICAgICAgY2tfU1NMX3VzZV9Qcml2YXRlS2V5X2ZpbGUKKyNkZWZpbmUgU1NMX3VzZV9jZXJ0aWZpY2F0ZV9maWxlICAgICAgICAgY2tfU1NMX3VzZV9jZXJ0aWZpY2F0ZV9maWxlCisjZGVmaW5lIFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZSAgICAgIGNrX1NTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZQorI2RlZmluZSBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlICAgICBja19TU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlCisjZGVmaW5lIFNTTF9zZXRfdmVyaWZ5ICAgICAgICAgICAgICAgICAgIGNrX1NTTF9zZXRfdmVyaWZ5CisjZGVmaW5lIFNTTF9uZXcgICAgICAgICAgICAgICAgICAgICAgICAgIGNrX1NTTF9uZXcKKyNkZWZpbmUgU1NMX0NUWF9jdHJsICAgICAgICAgICAgICAgICAgICAgY2tfU1NMX0NUWF9jdHJsCisjZGVmaW5lIFNTTF9DVFhfbmV3ICAgICAgICAgICAgICAgICAgICAgIGNrX1NTTF9DVFhfbmV3CisjZGVmaW5lIFNTTF9DVFhfZnJlZSAgICAgICAgICAgICAgICAgICAgIGNrX1NTTF9DVFhfZnJlZQorI2RlZmluZSBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYiAgICBja19TU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYgorI2RlZmluZSBTU0x2MjNfbWV0aG9kICAgICAgICAgICAgICAgICAgICBja19TU0x2MjNfbWV0aG9kCisjZGVmaW5lIFNTTHYzX21ldGhvZCAgICAgICAgICAgICAgICAgICAgIGNrX1NTTHYzX21ldGhvZAorI2RlZmluZSBUTFN2MV9tZXRob2QgICAgICAgICAgICAgICAgICAgICBja19UTFN2MV9tZXRob2QKKyNkZWZpbmUgU1NMdjIzX2NsaWVudF9tZXRob2QgICAgICAgICAgICAgY2tfU1NMdjIzX2NsaWVudF9tZXRob2QKKyNkZWZpbmUgU1NMdjNfY2xpZW50X21ldGhvZCAgICAgICAgICAgICAgY2tfU1NMdjNfY2xpZW50X21ldGhvZAorI2RlZmluZSBUTFN2MV9jbGllbnRfbWV0aG9kICAgICAgICAgICAgICBja19UTFN2MV9jbGllbnRfbWV0aG9kCisjZGVmaW5lIFNTTHYyM19zZXJ2ZXJfbWV0aG9kICAgICAgICAgICAgIGNrX1NTTHYyM19zZXJ2ZXJfbWV0aG9kCisjZGVmaW5lIFNTTHYzX3NlcnZlcl9tZXRob2QgICAgICAgICAgICAgIGNrX1NTTHYzX3NlcnZlcl9tZXRob2QKKyNkZWZpbmUgVExTdjFfc2VydmVyX21ldGhvZCAgICAgICAgICAgICAgY2tfVExTdjFfc2VydmVyX21ldGhvZAorI2RlZmluZSBTU0xfbGlicmFyeV9pbml0ICAgICAgICAgICAgICAgICBja19TU0xfbGlicmFyeV9pbml0CisjZGVmaW5lIFNTTF9zdGF0ZV9zdHJpbmcgICAgICAgICAgICAgICAgIGNrX1NTTF9zdGF0ZV9zdHJpbmcKKyNkZWZpbmUgU1NMX3N0YXRlX3N0cmluZ19sb25nICAgICAgICAgICAgY2tfU1NMX3N0YXRlX3N0cmluZ19sb25nCisjZGVmaW5lIFNTTF9hY2NlcHQgICAgICAgICAgICAgICAgICAgICAgIGNrX1NTTF9hY2NlcHQKKyNkZWZpbmUgU1NMX3NldF9jaXBoZXJfbGlzdCAgICAgICAgICAgICAgY2tfU1NMX3NldF9jaXBoZXJfbGlzdAorCisjZGVmaW5lIEVSUl9wcmludF9lcnJvcnMgICAgICAgICAgICAgICAgIGNrX0VSUl9wcmludF9lcnJvcnMKKyNkZWZpbmUgRVJSX3ByaW50X2Vycm9yc19mcCAgICAgICAgICAgICAgY2tfRVJSX3ByaW50X2Vycm9yc19mcAorI2RlZmluZSBFUlJfZXJyb3Jfc3RyaW5nICAgICAgICAgICAgICAgICBja19FUlJfZXJyb3Jfc3RyaW5nCisjZGVmaW5lIEVSUl9nZXRfZXJyb3IgICAgICAgICAgICAgICAgICAgIGNrX0VSUl9nZXRfZXJyb3IKKworI2RlZmluZSBCSU9fcHJpbnRmICAgICAgICAgICAgICAgICAgICAgICBja19CSU9fcHJpbnRmCisjZGVmaW5lIEJJT19jdHJsICAgICAgICAgICAgICAgICAgICAgICAgIGNrX0JJT19jdHJsCisjZGVmaW5lIEJJT19uZXcgICAgICAgICAgICAgICAgICAgICAgICAgIGNrX0JJT19uZXcKKyNkZWZpbmUgQklPX3NfZmlsZSAgICAgICAgICAgICAgICAgICAgICAgY2tfQklPX3NfZmlsZQorI2RlZmluZSBCSU9fc19tZW0gICAgICAgICAgICAgICAgICAgICAgICBja19CSU9fc19tZW0KKyNkZWZpbmUgQklPX3NfbnVsbCAgICAgICAgICAgICAgICAgICAgICAgY2tfQklPX3NfbnVsbAorI2RlZmluZSBCSU9fcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICBja19CSU9fcmVhZAorI2RlZmluZSBCSU9fbmV3X2ZpbGUgICAgICAgICAgICAgICAgICAgICBja19CSU9fbmV3X2ZpbGUKKyNkZWZpbmUgQklPX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgY2tfQklPX2ZyZWUKKworI2RlZmluZSBYNTA5X2dldF9pc3N1ZXJfbmFtZSAgICAgICAgICAgICBja19YNTA5X2dldF9pc3N1ZXJfbmFtZQorI2RlZmluZSBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyAgICBja19YNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZworI2RlZmluZSBYNTA5X05BTUVfb25lbGluZSAgICAgICAgICAgICAgICBja19YNTA5X05BTUVfb25lbGluZQorI2RlZmluZSBYNTA5X2dldF9zdWJqZWN0X25hbWUgICAgICAgICAgICBja19YNTA5X2dldF9zdWJqZWN0X25hbWUKKyNkZWZpbmUgWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydCAgY2tfWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydAorI2RlZmluZSBYNTA5X2dldF9kZWZhdWx0X2NlcnRfZGlyICAgICAgICBja19YNTA5X2dldF9kZWZhdWx0X2NlcnRfZGlyCisjZGVmaW5lIFg1MDlfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgIGNrX1g1MDlfZnJlZQorCisjZGVmaW5lIFJTQV9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgIGNrX1JTQV9mcmVlCisjZGVmaW5lIFJTQV9nZW5lcmF0ZV9rZXkgICAgICAgICAgICAgICAgIGNrX1JTQV9nZW5lcmF0ZV9rZXkKKworI2RlZmluZSBESF9uZXcgICAgICAgICAgICAgICAgICAgICAgICAgICBja19ESF9uZXcKKyNkZWZpbmUgREhfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgY2tfREhfZnJlZQorI2RlZmluZSBESF9nZW5lcmF0ZV9rZXkgICAgICAgICAgICAgICAgICBja19ESF9nZW5lcmF0ZV9rZXkKKyNkZWZpbmUgREhfZ2VuZXJhdGVfcGFyYW1ldGVycyAgICAgICAgICAgY2tfREhfZ2VuZXJhdGVfcGFyYW1ldGVycworCisjZGVmaW5lIERTQV9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgIGNrX0RTQV9mcmVlCisjZGVmaW5lIERTQV9nZW5lcmF0ZV9rZXkgICAgICAgICAgICAgICAgIGNrX0RTQV9nZW5lcmF0ZV9rZXkKKyNkZWZpbmUgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgICAgICAgICAgY2tfRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMKKworI2RlZmluZSBQRU1fcmVhZF9iaW9fREhwYXJhbXMgICAgICAgICAgICBja19QRU1fcmVhZF9iaW9fREhwYXJhbXMKKyNkZWZpbmUgQk5fYmluMmJuICAgICAgICAgICAgICAgICAgICAgICAgY2tfQk5fYmluMmJuCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogQ0tfU1NMICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2tjc3ltLmggYi9ja2VybWl0LTguMC4yMTEvY2tjc3ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0MGNhMwotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja2NzeW0uaApAQCAtMCwwICsxLDUgQEAKKy8qIFRoaXMgZmlsZSBpcyBmb3IgdXNlIHdpdGggY29tcGlsZXJzIHRoYXQgZG9uJ3QgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0bworICogI2RlZmluZSBzeW1ib2xzIG9uIHRoZSBDIGNvbXBpbGVyIGNvbW1hbmQgbGluZS4gIFRoaXMgZmlsZSBtdXN0CisgKiBiZSAjaW5jbHVkZSdkIGJlZm9yZSBhbGwgb3RoZXIgY2sqLmggZmlsZXMgc28gdGhhdCB0aGUgc3ltYm9scyAjZGVmaW5lJ2QKKyAqIGhlcmUgY2FuIGJlIHVzZWQgZm9yIGFueSBzdWJzZXF1ZW50IGNvbmRpdGlvbmFsIGNvZGUuCisgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja2N0ZWwuYyBiL2NrZXJtaXQtOC4wLjIxMS9ja2N0ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQzODIwCi0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrY3RlbC5jCkBAIC0wLDAgKzEsODk0NiBAQAorY2hhciAqY2t0ZWx2ID0gIlRlbG5ldCBzdXBwb3J0LCA4LjAuMjY5LCA0IE1hciAyMDA0IjsKKyNkZWZpbmUgQ0tDVEVMX0MKKworaW50IHNzdGVsbmV0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIHNlcnZlci1zaWRlIFRlbG5ldCBuZWdvdGlhdGlvbiAqLworCisvKiAgQyBLIEMgVCBFIEwgIC0tICBUZWxuZXQgc3VwcG9ydCAgKi8KKworLyoKKyAgQXV0aG9yczoKKyAgICBUZWxuZXQgcHJvdG9jb2wgYnkgRnJhbmsgZGEgQ3J1eiBhbmQgSmVmZnJleSBBbHRtYW4uCisgICAgVGVsbmV0IEZvcndhcmQgWCBieSBKZWZmcmV5IEFsdG1hbgorICAgIFRlbG5ldCBTVEFSVF9UTFMgc3VwcG9ydCBieSBKZWZmcmV5IEFsdG1hbgorICAgIFRlbG5ldCBBVVRIIGFuZCBFTkNSWVBUIHN1cHBvcnQgYnkgSmVmZnJleSBBbHRtYW4KKyAgICBUZWxuZXQgQ09NUE9SVCBzdXBwb3J0IGJ5IEplZmZyZXkgQWx0bWFuCisgICAgVGVsbmV0IE5FVy1FTlZJUk9OTUVOVCBzdXBwb3J0IGJ5IEplZmZyZXkgQWx0bWFuCisgICAgVGVsbmV0IE5BV1Mgc3VwcG9ydCBieSBGcmFuayBkYSBDcnV6IGFuZCBKZWZmcmV5IEFsdG1hbgorICAgIFRlbG5ldCBURVJNVFlQRSBzdXBwb3J0IGJ5IEplZmZyZXkgQWx0bWFuCisgICAgVGVsbmV0IEtFUk1JVCBzdXBwb3J0IGJ5IEplZmZyZXkgQWx0bWFuCisgICAgT3RoZXIgY29udHJpYnV0aW9ucyBhcyBpbmRpY2F0ZWQgaW4gdGhlIGNvZGUuCisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisKKy8qCisgIE5PVEUgVE8gQ09OVFJJQlVUT1JTOiBUaGlzIGZpbGUsIGFuZCBhbGwgdGhlIG90aGVyIHNoYXJlZCAoY2tjIGFuZCBja3UpCisgIEMtS2VybWl0IHNvdXJjZSBmaWxlcywgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggQyBwcmVwcm9jZXNzb3JzIHRoYXQgc3VwcG9ydAorICBvbmx5ICNpZmRlZiwgI2Vsc2UsICNlbmRpZiwgI2RlZmluZSwgYW5kICN1bmRlZi4gIFBsZWFzZSBkbyBub3QgdXNlICNpZiwKKyAgbG9naWNhbCBvcGVyYXRvcnMsIG9yIG90aGVyIHByZXByb2Nlc3NvciBmZWF0dXJlcyBpbiB0aGlzIG1vZHVsZS4gIEFsc28sCisgIGRvbid0IHVzZSBhbnkgQU5TSSBDIGNvbnN0cnVjdHMgZXhjZXB0IHdpdGhpbiAjaWZkZWYgQ0tfQU5TSUMuLiNlbmRpZi4KKyovCisKKyNpbmNsdWRlICJja2NzeW0uaCIKKyNpbmNsdWRlICJja2NkZWIuaCIKKworI2lmZGVmIFROQ09ERQorI2luY2x1ZGUgImNrY2tlci5oIgorI2RlZmluZSBURUxDTURTICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvIGRlZmluZSBuYW1lIGFycmF5ICovCisjZGVmaW5lIFRFTE9QVFMgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG8gZGVmaW5lIG5hbWUgYXJyYXkgKi8KKyNkZWZpbmUgU0xDX05BTUVTICAgICAgICAgICAgICAgICAgICAgICAvKiB0byBkZWZpbmUgbmFtZSBhcnJheSAqLworI2RlZmluZSBFTkNSWVBUX05BTUVTCisjZGVmaW5lIEFVVEhfTkFNRVMKKyNkZWZpbmUgVEVMT1BUX1NUQVRFUworI2RlZmluZSBURUxPUFRfTU9ERVMKKyNkZWZpbmUgVE5DX05BTUVTCisjaW5jbHVkZSAiY2tjbmV0LmgiCisjaW5jbHVkZSAiY2tjdGVsLmgiCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyNpbmNsdWRlICJja3VhdGguaCIKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX1NTTAorI2luY2x1ZGUgImNrX3NzbC5oIgorI2VuZGlmIC8qIENLX1NTTCAqLworCisjaWZuZGVmIE5PVEVSTQorI2lmZGVmIE9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciB0ZXJtaW5hbCB0eXBlIG5hbWUgc3RyaW5nICovCisjaW5jbHVkZSAiY2t1dXNyLmgiCisjaWZuZGVmIE5UCisjaW5jbHVkZSA8b3MyLmg+CisjdW5kZWYgQ09NTUVOVAorI2Vsc2UKKyNkZWZpbmUgaXNhc2NpaSBfX2lzYXNjaWkKKyNlbmRpZiAvKiBOVCAqLworI2luY2x1ZGUgImNrb2Nvbi5oIgorZXh0ZXJuIGludCB0dF90eXBlLCBtYXhfdHQ7CitleHRlcm4gc3RydWN0IHR0X2luZm9fcmVjIHR0X2luZm9bXTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT1RFUk0gKi8KKworI2lmZGVmIE9TMgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2lmZGVmIE5UCisjaW5jbHVkZSA8c2V0am1wZXguaD4KKyNlbHNlIC8qIE5UICovCisjaW5jbHVkZSA8c2V0am1wLmg+CisjZW5kaWYgLyogTlQgKi8KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJja2NzaWcuaCIKKyNpbmNsdWRlICJja29zeW4uaCIKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIENLX05BV1MgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZ290aWF0ZSBBYm91dCBXaW5kb3cgU2l6ZSAqLworI2lmZGVmIFJMT0dDT0RFCitfUFJPVE9UWVAoIGludCBybG9nX25hd3MsICh2b2lkKSApOworI2VuZGlmIC8qIFJMT0dDT0RFICovCisjZW5kaWYgLyogQ0tfTkFXUyAqLworCitpbnQgdG5faW5pdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVsbmV0IHByb3RvY29sIGluaXRpYWxpemVkIGZsYWcgKi8KK2ludCB0bl9iZWd1biA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBUZWxuZXQgcHJvdG9jb2wgc3RhcnRlZCBmbGFnICovCitzdGF0aWMgaW50IHRuX2ZpcnN0ID0gMTsgICAgICAgICAgICAgICAgLyogRmlyc3QgdGltZSBpbml0IGZsYWcgKi8KK2V4dGVybiBpbnQgdG5fZXhpdDsgICAgICAgICAgICAgICAgICAgICAvKiBFeGl0IG9uIGRpc2Nvbm5lY3QgKi8KK2V4dGVybiBpbnQgaW5zZXJ2ZXI7ICAgICAgICAgICAgICAgICAgICAvKiBSdW5uaW5nIGFzIElLU0QgKi8KK2NoYXIgKnRuX3Rlcm0gPSBOVUxMOyAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hbCB0eXBlIG92ZXJyaWRlICovCisKKyNpZmRlZiBDS19TTkRMT0MKK2NoYXIgKnRuX2xvYyA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAvKiBMb2NhdGlvbiBvdmVycmlkZSAqLworI2VuZGlmIC8qIENLX1NORExPQyAqLworaW50IHRuX25sbSA9IFROTF9DUkxGOyAgICAgICAgICAgICAgICAgIC8qIFRlbG5ldCBDUiAtPiBDUiBMRiBtb2RlICovCitpbnQgdG5fYl9ubG0gPSBUTkxfQ1I7ICAgICAgICAgICAgICAgICAgLyogVGVsbmV0IEJpbmFyeSBDUiBSQVcgbW9kZSAqLworaW50IHRuX2JfbWV1ID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlbG5ldCBCaW5hcnkgTUUgbWVhbnMgVSB0b28gKi8KK2ludCB0bl9iX3VtZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBUZWxuZXQgQmluYXJ5IFUgbWVhbnMgTUUgdG9vICovCitpbnQgdG5fd2FpdF9mbGcgPSAxOyAgICAgICAgICAgICAgICAgICAgLyogVGVsbmV0IFdhaXQgZm9yIE5lZ290aWF0aW9ucyAqLworaW50IHRuX2luZmluaXRlID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIFRlbG5ldCBCdWcgSW5maW5pdGUtTG9vcC1DaGVjayAqLworaW50IHRuX3JlbV9lY2hvID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIFdlIHdpbGwgZWNobyBpZiBXSUxMIEVDSE8gKi8KK2ludCB0bl9iX3hmZXIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBUZWxuZXQgQmluYXJ5IGZvciBYZmVycz8gKi8KK2ludCB0bl9zYl9idWcgPSAxOyAgICAgICAgICAgICAgICAgICAgICAvKiBUZWxuZXQgQlVHIC0gU0Igdy9vIFdJTEwgb3IgRE8gKi8KK2ludCB0bl9hdXRoX2tyYjVfZGVzX2J1ZyA9IDE7ICAgICAgICAgICAvKiBUZWxuZXQgQlVHIC0gQVVUSCBLUkI1IERFUyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICB0cnVuY2F0ZXMgbG9uZyBrZXlzICovCitpbnQgdG5fbm9fZW5jcnlwdF94ZmVyID0gMDsgICAgICAgICAgICAgLyogVHVybiBvZmYgVGVsbmV0IEVuY3J5cHQ/ICovCitpbnQgdG5fZGVsYXlfc2IgPSAxOyAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgU0JzIHVudGlsIHNhZmUgKi8KK2ludCB0bl9hdXRoX2hvdyA9IFROX0FVVEhfSE9XX0FOWTsKK2ludCB0bl9hdXRoX2VuYyA9IFROX0FVVEhfRU5DX0FOWTsKK2ludCB0bl9kZWIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUZWxuZXQgRGVidWcgbW9kZSAqLworaW50IHRuX3NmdSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1pY3Jvc29mdCBTRlUgY29tcGF0aWJpbGl0eSAqLworI2lmZGVmIENLX0ZPUldBUkRfWAorY2hhciAqIHRuX2Z3ZHhfeGF1dGhvcml0eSA9IE5VTEw7ICAgICAgIC8qIFhhdXRob3JpdHkgRmlsZSAqLworaW50ICAgIGZ3ZHhfbm9fZW5jcnlwdCA9IDA7ICAgICAgICAgICAgIC8qIEZvcndhcmQtWCByZXF1aXJlcyBlbmNyeXB0aW9uICovCisjZW5kaWYgLyogQ0tfRk9SV0FSRF9YICovCisKKyNpZmRlZiBPUzIKK2ludCB0dG51bSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMYXN0IFRlbG5ldCBUZXJtaW5hbCBUeXBlIHNlbnQgKi8KK2ludCB0dG51bWVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXMgZW5kIG9mIGxpc3QgYmVlbiBmb3VuZCAqLworI2VuZGlmIC8qIE9TMiAqLworCitjaGFyIHRuX21zZ1tUTl9NU0dfTEVOXTsgICAgICAgICAgICAgICAgLyogVGVsbmV0IGRhdGEgY2FuIGJlIHJhdGhlciBsb25nICovCitjaGFyIGhleGJ1ZltUTl9NU0dfTEVOXTsKK2NoYXIgdG5fbXNnX291dFtUTl9NU0dfTEVOXTsKKyNpZmRlZiBDS19GT1JXQVJEX1gKK0NIQVIgZndkeF9tc2dfb3V0W1ROX01TR19MRU5dOworI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworCisvKgorICBJbiBvcmRlciB0byBwcmV2ZW50IGFuIGluZmluaXRlIHRlbG5ldCBuZWdvdGlhdGlvbiBsb29wIHdlIG1haW50YWluIGEKKyAgY291bnQgb2YgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc2FtZSB0ZWxuZXQgbmVnb3RpYXRpb24gbWVzc2FnZSBpcworICBzZW50LiBXaGVuIHRoaXMgY291bnQgaGl0cyBNQVhUTkNOVCwgd2UgZG8gbm90IHNlbmQgYW55IG1vcmUgb2YgdGhlCisgIG1lc3NhZ2UuIFRoZSBjb3VudCBpcyBzdG9yZWQgaW4gdGhlIHRuY250c1tdW10gYXJyYXkuCisKKyAgVGhlIHRuY250c1tdW10gYXJyYXkgaXMgaW5kZXhlZCBieSBuZWdvdGlhdGlvbiBvcHRpb24gKFNVUFBSRVNTIEdPIEFIRUFELAorICBURVJNSU5BTCBUWVBFLCBOQVdTLCBldGMuIC0gc2VlIHRoZSB0bm9wdHNbXSBhcnJheSkgYW5kIHRoZSBmb3VyCisgIG5lZ290aWF0aW9uIG1lc3NhZ2UgdHlwZXMgKFdJTEwsIFdPTlQsIERPLCBET05UKS4gIEFsbCB0ZWxuZXQgbmVnb3RpYXRpb25zCisgIGFyZSBrZXB0IHRyYWNrIG9mIGluIHRoaXMgd2F5LgorCisgIFRoZSBjb3VudCBmb3IgYSBtZXNzYWdlIGlzIHplcm9lZCB3aGVuIHRoZSAib3Bwb3NpdGUiIG1lc3NhZ2UgaXMgc2VudC4KKyAgV0lMTCBpcyB0aGUgb3Bwb3NpdGUgb2YgV09OVCwgYW5kIERPIGlzIHRoZSBvcHBvc2l0ZSBvZiBET05ULgorICBGb3IgZXhhbXBsZSBzZW5kaW5nICJXSUxMIFNHQSIgaW5jcmVtZW50cyB0bmNudHNbVEVMT1BUX1NHQV1bMF0KKyAgYW5kIHplcm9lcyB0bmNudHNbVEVMT1BUX1NHQV1bMV0uCisKKyAgVGhlIGNvZGUgdGhhdCBkb2VzIHRoaXMgaXMgaW4gdG5fc29wdCgpLgorCisgIHJvZ2Vyc2hAZnNqLmNvLmpwLCAxOC8zLzE5OTUKKworICA4LzE2LzE5OTggLSB3aXRoIHRoZSByZWNlbnQgcmV3cml0ZSBvZiB0aGUgdGVsbmV0IHN0YXRlIG1hY2hpbmUgSSBkb24ndAorICB0aGluayB0aGlzIGNvZGUgaXMgbmVjZXNzYXJ5IGFueW1vcmUuICBIb3dldmVyLCBpdCBjYW4ndCBkbyBhbnkgaGFybSBzbworICBJIGFtIGxlYXZpbmcgaXQgaW4uICAgIC0gSmVmZgorCisgIDEyLzI4LzE5OTggLSBhbGwgcmVmZXJlbmNlcyB0byB0bmNudHNbXSBtdXN0IGJlIGRvbmUgd2l0aCBURUxPUFRfSU5ERVgob3B0KQorICBiZWNhdXNlIHRoZSBUZWxuZXQgb3B0aW9uIGxpc3QgaXMgbm8gbG9uZ2VyIGNvbnRpZ3VvdXMuICBXZSBhbHNvIG11c3QKKyAgYWxsb2NhdGUgTlRFTE9QVFMgKyAxIGJlY2F1c2UgdGhlIFRFTE9QVF9JTkRFWCgpIG1hY3JvIHJldHVybnMgTlRFTE9QVFMKKyAgZm9yIGFuIGludmFsaWQgb3B0aW9uIG51bWJlci4KKyovCisKKyNkZWZpbmUgTUFYVE5DTlQgNCAgICAgIC8qIFBlcm1pdHMgNCBpbnRlcm1lZGlhdGUgdGVsbmV0IGZpcmV3YWxscy9nYXRld2F5cyAqLworCitjaGFyIHRuY250c1tOVEVMT1BUUysxXVs0XTsgICAgICAgICAgICAgLyogQ291bnRzICovCitjaGFyIHRub3Bwc1s0XSA9IHsgMSwwLDMsMiB9OyAgICAgICAgICAgLyogT3Bwb3NpdGVzICovCisKKyNpZmRlZiBDS19FTlZJUk9OTUVOVAorI2lmZGVmIENLX0ZPUldBUkRfWAorI2RlZmluZSBUU0JVRlNJWiAyMDU2CisjZWxzZSAvKiBDS19GT1JXQVJEX1ggKi8KKyNkZWZpbmUgVFNCVUZTSVogMTAyNAorI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworY2hhciB0bl9lbnZfYWNjdFs2NF07CitjaGFyIHRuX2Vudl9kaXNwWzY0XTsKK2NoYXIgdG5fZW52X2pvYls2NF07CitjaGFyIHRuX2Vudl9wcm50WzY0XTsKK2NoYXIgdG5fZW52X3N5c1s2NF07CitjaGFyICogdG5fZW52X3VzZXJ2YXJbOF1bMl07CitpbnQgdG5fZW52X2ZsZyA9IDE7CisjZWxzZSAvKiBDS19FTlZJUk9OTUVOVCAqLworI2RlZmluZSBUU0JVRlNJWiA0MQoraW50IHRuX2Vudl9mbGcgPSAwOworI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisKKyNpZmRlZiBDT01NRU5UCisvKiBTSUdXSU5DSCBoYW5kbGVyIG1vdmVkIHRvIGNrdXVzeC5jICovCisjaWZuZGVmIE5PU0lHV0lOQ0gKKyNpZmRlZiBDS19OQVdTICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaW5kb3cgc2l6ZSBidXNpbmVzcyAqLworI2lmZGVmIFVOSVgKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogQ0tfTkFXUyAqLworI2VuZGlmIC8qIE5PU0lHV0lOQ0ggKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKK0NIQVIgc2JbVFNCVUZTSVpdOyAgICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgLSBpbmNvbWluZyBzdWJuZWdvdGlhdGlvbnMgKi8KK0NIQVIgc2Jfb3V0W1RTQlVGU0laXTsgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgLSBvdXRnb2luZyBzdWJuZWdvdGlhdGlvbnMgKi8KKworaW50IHRuX2R1cGxleCA9IDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIExvY2FsIGVjaG8gKi8KKworZXh0ZXJuIGNoYXIgdWlkYnVmW107ICAgICAgICAgICAgICAgICAgIC8qIFVzZXIgSUQgYnVmZmVyICovCitleHRlcm4gaW50IHF1aWV0LCB0dG5ldCwgdHRucHJvdG8sIGRlYnNlcywgd2hhdCwgZHVwbGV4LCBvbGRwbGV4LCBsb2NhbDsKK2V4dGVybiBpbnQgc2VzbG9nLCBzZXNzZnQsIHdoeWNsb3NlZDsKKyNpZmRlZiBPUzIKKyNpZm5kZWYgTk9URVJNCitleHRlcm4gaW50IHR0X3Jvd3NbXSwgdHRfY29sc1tdOworZXh0ZXJuIGludCB0dF9zdGF0dXNbVk5VTV07CitleHRlcm4gaW50IHNjcm5pbml0aWFsaXplZFtdOworI2VuZGlmIC8qIE5PVEVSTSAqLworI2Vsc2UgLyogT1MyICovCitleHRlcm4gaW50IHR0X3Jvd3MsIHR0X2NvbHM7ICAgICAgICAgICAgLyogRXZlcnlib2R5IGhhcyB0aGlzICovCisjZW5kaWYgLyogT1MyICovCitleHRlcm4gaW50IGNtZF9jb2xzLCBjbWRfcm93czsKK2V4dGVybiBjaGFyIG5hbWVjb3B5W107CitleHRlcm4gY2hhciBteWlwYWRkcltdOyAgICAgICAgICAgICAvKiBHbG9iYWwgY29weSBvZiBteSBJUCBhZGRyZXNzICovCisKKyNpZm5kZWYgVEVMT1BUX01BQ1JPCitpbnQKK3RlbG9wdF9pbmRleChvcHQpIGludCBvcHQ7IHsKKyAgICBpZiAob3B0ID49IDAgJiYgb3B0IDw9IFRFTE9QVF9TVERFUlIpCisgICAgICByZXR1cm4ob3B0KTsKKyAgICBlbHNlIGlmIChvcHQgPj0gVEVMT1BUX1BSQUdNQV9MT0dPTiAmJiBvcHQgPD0gVEVMT1BUX1BSQUdNQV9IRUFSVEJFQVQpCisgICAgICByZXR1cm4ob3B0LTg4KTsKKyAgICBlbHNlIGlmIChvcHQgPT0gVEVMT1BUX0lCTV9TQUspCisgICAgICByZXR1cm4ob3B0LTE0Nyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKE5URUxPUFRTKTsKK30KKworaW50Cit0ZWxvcHRfb2sob3B0KSBpbnQgb3B0OyB7CisgICAgcmV0dXJuKChvcHQgPj0gVEVMT1BUX0JJTkFSWSAmJiBvcHQgPD0gVEVMT1BUX1NUREVSUikgfHwKKyAgICAgICAgICAgKG9wdCA+PSBURUxPUFRfUFJBR01BX0xPR09OICYmIG9wdCA8PSBURUxPUFRfUFJBR01BX0hFQVJUQkVBVCkgfHwKKyAgICAgICAgICAgKG9wdCA9PSBURUxPUFRfSUJNX1NBSykpOworfQorCitDSEFSICoKK3RlbG9wdChvcHQpIGludCBvcHQ7IHsKKyAgICBpZiAodGVsb3B0X29rKG9wdCkpCisgICAgICByZXR1cm4oKENIQVIgKil0ZWxvcHRzW3RlbG9wdF9pbmRleChvcHQpXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKChDSEFSICopIlVOS05PV04iKTsKK30KKworaW50Cit0ZWxvcHRfbW9kZV9vayhvcHQpIGludCBvcHQ7IHsKKyAgICByZXR1cm4oKHVuc2lnbmVkIGludCkob3B0KSA8PSBUTl9OR19NVSk7Cit9CisKK0NIQVIgKgordGVsb3B0X21vZGUob3B0KSBpbnQgb3B0OyB7CisgICAgaWYgKHRlbG9wdF9tb2RlX29rKG9wdCkpCisgICAgICByZXR1cm4oKENIQVIgKil0ZWxvcHRfbW9kZXNbb3B0LVROX05HX1JGXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKChDSEFSICopIlVOS05PV04iKTsKK30KKyNlbmRpZiAvKiBURUxPUFRfTUFDUk8gKi8KKworc3RhdGljIGludAordG5fb3V0c3Qobm90cXVpZXQpIGludCBub3RxdWlldDsgeworICAgIGludCBvdXRzdGFuZGluZyA9IDA7CisgICAgaW50IHggPSAwOworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBpbnQgZSA9IDA7CisgICAgaW50IGQgPSAwOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKworICAgIGlmICh0bl93YWl0X2ZsZykgeworICAgICAgICBmb3IgKHggPSBURUxPUFRfRklSU1Q7IHggPD0gVEVMT1BUX0xBU1Q7IHgrKykgeworICAgICAgICAgICAgaWYgKFRFTE9QVF9PSyh4KSkgeworICAgICAgICAgICAgICAgIGlmIChURUxPUFRfVU5BTlNXRVJFRF9XSUxMKHgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggbm90cXVpZXQgKQorICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RlbG5ldCB3YWl0aW5nIGZvciByZXNwb25zZSB0byBXSUxMICVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVCh4KSk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInRuX291dHN0IiwidW5hbnN3ZXJlZCBXSUxMIix4KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0c3RhbmRpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoICFub3RxdWlldCApCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChURUxPUFRfVU5BTlNXRVJFRF9ETyh4KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIG5vdHF1aWV0ICkKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9UZWxuZXQgd2FpdGluZyBmb3IgcmVzcG9uc2UgdG8gRE8gJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUKHgpKTsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwidG5fb3V0c3QiLCJ1bmFuc3dlcmVkIERPIix4KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0c3RhbmRpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoICFub3RxdWlldCApCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChURUxPUFRfVU5BTlNXRVJFRF9XT05UKHgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggbm90cXVpZXQgKQorICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RlbG5ldCB3YWl0aW5nIGZvciByZXNwb25zZSB0byBXT05UICVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVCh4KSk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInRuX291dHN0IiwidW5hbnN3ZXJlZCBXT05UIix4KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0c3RhbmRpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoICFub3RxdWlldCApCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChURUxPUFRfVU5BTlNXRVJFRF9ET05UKHgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggbm90cXVpZXQgKQorICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RlbG5ldCB3YWl0aW5nIGZvciByZXNwb25zZSB0byBET05UICVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVCh4KSk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInRuX291dHN0IiwidW5hbnN3ZXJlZCBET05UIix4KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0c3RhbmRpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoICFub3RxdWlldCApCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChURUxPUFRfVU5BTlNXRVJFRF9TQih4KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIG5vdHF1aWV0ICkKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9UZWxuZXQgd2FpdGluZyBmb3IgcmVzcG9uc2UgdG8gU0IgJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUKHgpKTsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwidG5fb3V0c3QiLCJ1bmFuc3dlcmVkIFNCIix4KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0c3RhbmRpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoICFub3RxdWlldCApCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICAgICAgaWYgKGNrX3RuX2F1dGhfaW5fcHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfQVVUSEVOVElDQVRJT04pKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vdHF1aWV0KQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/VGVsbmV0IHdhaXRpbmcgZm9yIFdJTEwgJXMgc3VibmVnb3RpYXRpb25cclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFQoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgICAgICAgICAidG5fb3V0c3QiLAorICAgICAgICAgICAgICAgICAgICAgICJNRSBhdXRoZW50aWNhdGlvbiBpbiBwcm9ncmVzcyIsCisgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX0FVVEhFTlRJQ0FUSU9OCisgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBvdXRzdGFuZGluZyA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFRFTE9QVF9VKFRFTE9QVF9BVVRIRU5USUNBVElPTikpIHsKKyAgICAgICAgICAgICAgICBpZiAobm90cXVpZXQpCisgICAgICAgICAgICAgICAgICBwcmludGYoIj9UZWxuZXQgd2FpdGluZyBmb3IgRE8gJXMgc3VibmVnb3RpYXRpb25cclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFQoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgICAgICAgICAidG5fb3V0c3QiLAorICAgICAgICAgICAgICAgICAgICAgICJVIGF1dGhlbnRpY2F0aW9uIGluIHByb2dyZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfQVVUSEVOVElDQVRJT04KKyAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIG91dHN0YW5kaW5nID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICBpZiAoIW91dHN0YW5kaW5nKSB7CisgICAgICAgICAgICBlID0gY2tfdG5fZW5jcnlwdGluZygpOworICAgICAgICAgICAgZCA9IGNrX3RuX2RlY3J5cHRpbmcoKTsKKyAgICAgICAgICAgIGlmIChURUxPUFRfTUUoVEVMT1BUX0VOQ1JZUFRJT04pKSB7CisgICAgICAgICAgICAgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfRU5DUllQVElPTikuZW5jcnlwdC5zdG9wICYmIGUgfHwKKyAgICAgICAgICAgICAgICAgICAgIVRFTE9QVF9TQihURUxPUFRfRU5DUllQVElPTikuZW5jcnlwdC5zdG9wICYmICFlCisgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIG5vdHF1aWV0ICkKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9UZWxuZXQgd2FpdGluZyBmb3IgV0lMTCAlcyBzdWJuZWdvdGlhdGlvblxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFQoVEVMT1BUX0VOQ1JZUFRJT04pKTsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRuX291dHN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY3J5cHRpb24gbW9kZSBzd2l0Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfRU5DUllQVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBvdXRzdGFuZGluZyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFRFTE9QVF9VKFRFTE9QVF9FTkNSWVBUSU9OKSkgeworICAgICAgICAgICAgICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0VOQ1JZUFRJT04pLmVuY3J5cHQuc3RvcCAmJiBkIHx8CisgICAgICAgICAgICAgICAgICAgICFURUxPUFRfU0IoVEVMT1BUX0VOQ1JZUFRJT04pLmVuY3J5cHQuc3RvcCAmJiAhZAorICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBub3RxdWlldCApCisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/VGVsbmV0IHdhaXRpbmcgZm9yIERPICVzIHN1Ym5lZ290aWF0aW9uXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVChURUxPUFRfRU5DUllQVElPTikpOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidG5fb3V0c3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVjcnlwdGlvbiBtb2RlIHN3aXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfRU5DUllQVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBvdXRzdGFuZGluZyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgIH0gLyogaWYgKHRuX3dhaXRfZmxnKSAqLworCisjaWZkZWYgSUtTX09QVElPTgorICAgIC8qIEV2ZW4gaWYgd2UgYXJlIG5vdCB3YWl0aW5nIGZvciBUZWxuZXQgb3B0aW9ucyB3ZSBtdXN0IHdhaXQgZm9yICovCisgICAgLyogS2VybWl0IFRlbG5ldCBTdWJuZWdvdGlhdGlvbnMgaWYgd2UgaGF2ZSBzZW50IGEgcmVxdWVzdCB0byB0aGUgKi8KKyAgICAvKiBvdGhlciBndXkuICBPdGhlcndpc2Ugd2Ugd2lsbCBnZXQgb3V0IG9mIHN5bmMuICAgICAgICAgICAgICAgICAqLworICAgIGlmICghb3V0c3RhbmRpbmcpIHsKKyAgICAgICAgaWYgKFRFTE9QVF9VKFRFTE9QVF9LRVJNSVQpICYmCisgICAgICAgICAgICAoVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9yZXFfc3RhcnQgfHwKKyAgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3JlcV9zdG9wIHx8CisgICAgICAgICAgICAgIVRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQuc29wKQorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBpZiAoIG5vdHF1aWV0ICkKKyAgICAgICAgICAgICAgcHJpbnRmKCI/VGVsbmV0IHdhaXRpbmcgZm9yIFNCICVzIG5lZ290aWF0aW9uXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICBURUxPUFQoVEVMT1BUX0tFUk1JVCkpOworICAgICAgICAgICAgZGVidWcoRjExMSwidG5fb3V0c3QiLCJVIGtlcm1pdCBpbiBwcm9ncmVzcyIsVEVMT1BUX0tFUk1JVCk7CisgICAgICAgICAgICBvdXRzdGFuZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCisjaWZkZWYgVE5fQ09NUE9SVAorICAgIGlmICghb3V0c3RhbmRpbmcpIHsKKyAgICAgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfQ09NUE9SVCkpIHsKKyAgICAgICAgICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0NPTVBPUlQpLmNvbXBvcnQud2FpdF9mb3Jfc2IpIHsKKyAgICAgICAgICAgICAgICBpZiAobm90cXVpZXQpCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RlbG5ldCB3YWl0aW5nIGZvciBTQiAlcyBuZWdvdGlhdGlvblxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVChURUxPUFRfQ09NUE9SVCkpOworICAgICAgICAgICAgICAgZGVidWcoRjExMSwidG5fb3V0c3QiLCJDb21Qb3J0IFNCIGluIHByb2dyZXNzIixURUxPUFRfQ09NUE9SVCk7CisgICAgICAgICAgICAgICBvdXRzdGFuZGluZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9DT01QT1JUKS5jb21wb3J0LndhaXRfZm9yX21zKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vdHF1aWV0KQorICAgICAgICAgICAgICBwcmludGYoIj9UZWxuZXQgd2FpdGluZyBmb3IgU0IgJXMgTU9ERU1fU1RBVFVTIG5lZ290aWF0aW9uXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUKFRFTE9QVF9DT01QT1JUKSk7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ0bl9vdXRzdCIsIkNvbVBvcnQgU0IgTVMgaW4gcHJvZ3Jlc3MiLFRFTE9QVF9DT01QT1JUKTsKKyAgICAgICAgICAgICAgIG91dHN0YW5kaW5nID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisgICAgcmV0dXJuKG91dHN0YW5kaW5nKTsKK30KKworaW50Citpc3RuY29tcG9ydCgpIHsKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgaWYgKCFsb2NhbCkgcmV0dXJuKDApOworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKDApOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQpIHJldHVybigwKTsKKyAgICBpZiAoVEVMT1BUX01FKFRFTE9QVF9DT01QT1JUKSkKKyAgICAgIHJldHVybigxKTsKKyAgICBlbHNlCisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworICAgICAgcmV0dXJuKDApOworfQorCisvKiB0bl93YWl0KCkgLS0gV2FpdCBmb3IgcmVzcG9uc2UgdG8gVGVsbmV0IG5lZ290aWF0aW9uLiAqLworLyoKKyAgV2FpdCBmb3IgdXAgdG8gPHRpbWVvdXQ+IHNlY29uZHMgZm9yIHRoZSByZXNwb25zZSB0byBhcnJpdmUuCisgIFBsYWNlIGFsbCBub24tdGVsbmV0IGRhdGEgaW50byBUZWxuZXQgV2FpdCBCdWZmZXIuCisgIElmIHJlc3BvbnNlIGRvZXMgYXJyaXZlIHJldHVybiAxLCBlbHNlIHJldHVybiAwLgorKi8KKyNpZm5kZWYgVE5fV0FJVF9CVUZfU1oKKyNkZWZpbmUgVE5fV0FJVF9CVUZfU1ogNDA5NgorI2VuZGlmIC8qIFROX1dBSVRfQlVGX1NaICovCitzdGF0aWMgY2hhciB0bl93YWl0X2J1ZltUTl9XQUlUX0JVRl9TWl07CitzdGF0aWMgaW50ICB0bl93YWl0X2lkeCA9IDA7CisjaWZuZGVmIFROX1RJTUVPVVQKKyNkZWZpbmUgVE5fVElNRU9VVCAxMjAKKyNlbmRpZiAvKiBUTl9USU1FT1VUICovCitzdGF0aWMgaW50IHRuX3dhaXRfdG1vID0gVE5fVElNRU9VVDsKKworI2lmZGVmIENLU1BJTk5FUgorVk9JRAorcHJ0d2FpdChzdGF0ZSkgaW50IHN0YXRlOyB7CisgICAgc3dpdGNoIChzdGF0ZSAlIDQpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcHJpbnRmKCIvIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBwcmludGYoIi0iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIHByaW50ZigiXFwiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICAgIHByaW50ZigifCIpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisjZW5kaWYgLyogQ0tTUElOTkVSICovCisKK3N0YXRpYyBpbnQgbmZsYWcgPSAwOworCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5fd2FpdChjaGFyICogd2hlcmUpCisjZWxzZQordG5fd2FpdCh3aGVyZSkgY2hhciAqIHdoZXJlOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bl93YWl0ICovIHsKKyAgICBleHRlcm4gaW50IGNreGVjaCwgbG9jYWw7CisgICAgaW50IGNoID0gMCwgY291bnQgPSAwOworI2lmbmRlZiBOT0hJTlRTCisgICAgaW50IG5vaGludGdpdmVuID0gMTsKKyAgICBleHRlcm4gaW50IGhpbnRzOworI2VuZGlmIC8qIE5PSElOVFMgKi8KKyAgICBpbnQgb3V0c3RhbmRpbmc7CisjaWZkZWYgVE5fQ09NUE9SVAorICAgIGludCBzYXZjYXJyOworICAgIGV4dGVybiBpbnQgdHRjYXJyOworI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKworICAgIHJ0aW1lcigpOworCisgICAgZGVidWcoRjExMCwidG5fd2FpdCB3YWl0aW5nIGZvciIsd2hlcmUsMCk7CisgICAgdG5fd2FpdF90bW8gPSBUTl9USU1FT1VUOworICAgIGRlYnVnKEYxMTEsInRuX3dhaXQiLCJ0aW1lb3V0Iix0bl93YWl0X3Rtbyk7CisgICAgb3V0c3RhbmRpbmcgPSB0bl9vdXRzdCgwKTsKKyAgICBkZWJ1ZyhGMTExLCJ0bl93YWl0Iiwib3V0c3RhbmRpbmciLG91dHN0YW5kaW5nKTsKKyAgICBkZWJ1ZyhGMTExLCJ0bl93YWl0IiwidG5fd2FpdF9mbGciLHRuX3dhaXRfZmxnKTsKKworICAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgbWVhbnQgdG8gYmUgISh8fCkuICBXZSBvbmx5IHdhbnQgdG8gcmV0dXJuICovCisgICAgLyogaW1tZWRpYXRlbHkgaWYgYm90aCB0aGUgdG5fd2FpdF9mbGcgJiYgdG5fb3V0c3QoKSBhcmUgZmFsc2UgKi8KKyAgICBpZiAoIShvdXRzdGFuZGluZyB8fCB0bl93YWl0X2ZsZykpICAvKiBJZiBubyBuZWVkIHRvIHdhaXQgKi8KKyAgICAgIHJldHVybigxKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBEb24ndC4gKi8KKworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1ZygiPHdhaXQgZm9yIG91dHN0YW5kaW5nIG5lZ290aWF0aW9ucz4iKTsKKworI2lmZGVmIENLU1BJTk5FUgorICAgIGlmICghc3N0ZWxuZXQgJiYgIXF1aWV0KQorICAgICAgICBwcnR3YWl0KDApOworI2VuZGlmIC8qIENLU1BJTk5FUiAqLworCisgICAgLyogV2FpdCB1cCB0byBUTl9USU1FT1VUIHNlYyBmb3IgcmVzcG9uc2VzIHRvIG91dHN0YW5kaW5nIHRlbG5ldCBuZWdzICovCisgICAgZG8geworI2lmZGVmIE5UU0lHCisgICAgICAgIGNrX2loKCk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyAgICAgICAgY2ggPSB0dGluYygxKTsKKyAgICAgICAgaWYgKGNoID09IC0xKSB7ICAgICAgICAgICAgICAgICAvKiBUaW1lZCBvdXQgKi8KKyAgICAgICAgICAgIGlmICghc3N0ZWxuZXQgJiYgIXF1aWV0KSB7ICAvKiBMZXQgdXNlciBrbm93Li4uICovCisjaWZkZWYgQ0tTUElOTkVSCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcYiIpOworICAgICAgICAgICAgICAgIHBydHdhaXQoZ3RpbWVyKCkpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBpZiAobmZsYWcgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBOZWdvdGlhdGlvbnMuIik7CisgICAgICAgICAgICAgICAgICAgIG5mbGFnKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZmxhZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIuIik7CisgICAgICAgICAgICAgICAgICAgIG5mbGFnKys7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS1NQSU5ORVIgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA8IC0xKSB7CisgICAgICAgICAgICBwcmludGYoIlxyXG4/Q29ubmVjdGlvbiBjbG9zZWQgYnkgcGVlci5cclxuIik7CisgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcoIjxjb25uZWN0aW9uIGNsb3NlZCBieSBwZWVyPiIpOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICBjYXNlIElBQzoKKyNpZmRlZiBDS1NQSU5ORVIKKyAgICAgICAgICAgIGlmICghc3N0ZWxuZXQgJiYgIXF1aWV0KQorICAgICAgICAgICAgICBwcmludGYoIlxiIik7CisjZW5kaWYgLyogQ0tTUElOTkVSICovCisgICAgICAgICAgICBjaCA9IHRuX2Rvb3AoKENIQVIpKGNoICYgMHhmZiksaW5zZXJ2ZXI/Y2t4ZWNoOmR1cGxleCx0dGluYyk7CisjaWZkZWYgQ0tTUElOTkVSCisgICAgICAgICAgICBpZiAoIXNzdGVsbmV0ICYmICFxdWlldCkgeworICAgICAgICAgICAgICAgIHBydHdhaXQoZ3RpbWVyKCkpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLU1BJTk5FUiAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwidG5fd2FpdCB0bl9kb29wIiwiIixjaCk7CisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBkdXBsZXggPSAxOyAgICAgICAgICAgICAvKiBUdXJuIG9uIGVjaG9pbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5zZXJ2ZXIpCisgICAgICAgICAgICAgICAgICBja3hlY2ggPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZHVwbGV4ID0gMDsgICAgICAgICAgICAgLyogVHVybiBvZmYgZWNob2luZyAqLworICAgICAgICAgICAgICAgIGlmIChpbnNlcnZlcikKKyAgICAgICAgICAgICAgICAgIGNreGVjaCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICB0bl93YWl0X2J1Zlt0bl93YWl0X2lkeCsrXSA9IElBQzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA0OiAgICAgICAgICAgICAgICAgICAvKiBJS1MgZXZlbnQgKi8KKyAgICAgICAgICAgICAgY2FzZSA2OiAgICAgICAgICAgICAgICAgICAvKiBMb2dvdXQgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAtMToKKwkJaWYgKCFxdWlldCkKKyAgICAgICAgICAgICAgICBwcmludGYoIj9UZWxuZXQgT3B0aW9uIG5lZ290aWF0aW9uIGVycm9yLlxuIik7CisgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgICB0bl9kZWJ1ZygiPFRlbG5ldCBPcHRpb24gbmVnb3RpYXRpb24gZXJyb3I+Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgY2FzZSAtMjoKKyAgICAgICAgICAgICAgICBwcmludGYoIj9Db25uZWN0aW9uIGNsb3NlZCBieSBwZWVyLlxuIik7CisgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKCI8Q29ubmVjdGlvbiBjbG9zZWQgYnkgcGVlcj4iKTsKKwkJdHRjbG9zKDApOworICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKGNoIDwgMCkgeworICAgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKCI8VW5rbm93biBjb25uZWN0aW9uIGVycm9yPiIpOworICAgICAgICAgICAgICAgICAgcmV0dXJuKGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8qIHN3aXRjaCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyNpZmRlZiBDS1NQSU5ORVIKKyAgICAgICAgICAgIGlmICghc3N0ZWxuZXQgJiYgIXF1aWV0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcYiIpOworICAgICAgICAgICAgICAgIHBydHdhaXQoZ3RpbWVyKCkpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLU1BJTk5FUiAqLworICAgICAgICAgICAgdG5fd2FpdF9idWZbdG5fd2FpdF9pZHgrK10gPSAoQ0hBUikoY2ggJiAweGZmKTsKKyAgICAgICAgfSAvKiBzd2l0Y2ggKi8KKworICAgICAgICBvdXRzdGFuZGluZyA9IHRuX291dHN0KDApOworCisgICAgICAgIGlmICggb3V0c3RhbmRpbmcgJiYgY2ggIT0gSUFDICkgeworICAgICAgICAgICAgaW50IHRpbWVyID0gZ3RpbWVyKCk7CisgICAgICAgICAgICBpZiAoIHRpbWVyID4gdG5fd2FpdF90bW8gKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzc3RlbG5ldCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgICAgICJcclxuP1RlbG5ldCBQcm90b2NvbCBUaW1lb3V0IC0gY29ubmVjdGlvbiBjbG9zZWRcclxuIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgdG5fZGVidWcoCisgICAgICAgICAgICAgICAgICAgICAgICAiPHRlbG5ldCBwcm90b2NvbCB0aW1lb3V0IC0gY29ubmVjdGlvbiBjbG9zZWQ+Iik7CisgICAgICAgICAgICAgICAgICAgIHRuX291dHN0KDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBpZiB3ZSBkbyBub3QgY2xvc2UgdGhlIGNvbm5lY3Rpb24sIHRoZW4gd2Ugd2lsbCBibG9jayAqLworICAgICAgICAgICAgICAgIC8qIHRoZSBuZXh0IHRpbWUgd2UgaGl0IGEgd2FpdC4gIGFuZCBpZiB3ZSBkb24ndCB3ZSB3aWxsICovCisgICAgICAgICAgICAgICAgLyogZG8gdGhlIHdyb25nIHRoaW5nIGlmIHRoZSBob3N0IHNlbmRzIDB4RkYgYW5kIGRvZXMgICAgKi8KKyAgICAgICAgICAgICAgICAvKiBub3QgaW50ZW5kIGl0IHRvIGJlIGFuIElBQy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHR0Y2xvcygwKTsKKyAgICAgICAgICAgICAgICB3aHljbG9zZWQgPSBXQ19URUxPUFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0KKyNpZm5kZWYgTk9ISU5UUworICAgICAgICAgICAgZWxzZSBpZiAoIGhpbnRzICYmIHRpbWVyID4gMzAgJiYgbm9oaW50Z2l2ZW4gJiYgIWluc2VydmVyICkgeworI2lmZGVmIENLU1BJTk5FUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxiIik7CisjZWxzZSAvKiBDS1NQSU5ORVIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcclxuIik7CisjZW5kaWYgLyogQ0tTUElOTkVSICovCisgICAgICBwcmludGYoIioqKioqKioqKioqKioqKioqKioqKioqKipcclxuIik7CisgICAgICAgIHByaW50ZigiVGhlIFRlbG5ldCAlcyBpcyBub3Qgc2VuZGluZyByZXF1aXJlZCByZXNwb25zZXMuXHJcblxyXG4iLAorICAgICAgICAgICAgICAgIHNzdGVsbmV0PyJjbGllbnQiOiJzZXJ2ZXIiKTsKKyAgICAgIHRuX291dHN0KDEpOworICAgICAgcHJpbnRmKCJcbllvdSBjYW4gY29udGludWUgdG8gd2FpdCBvciB5b3UgY2FuIGNhbmNlbCB3aXRoIEN0cmwtQy5cclxuIik7CisgICAgICBwcmludGYoIkluIGNhc2UgdGhlIFRlbG5ldCBzZXJ2ZXIgbmV2ZXIgcmVzcG9uZHMgYXMgcmVxdWlyZWQsXHJcbiIpOworICAgICAgcHJpbnRmKCJ5b3UgY2FuIHRyeSBjb25uZWN0aW5nIHRvIHRoaXMgaG9zdCB3aXRoIFRFTE5FVCAvTk9XQUlULlxyXG4iKTsKKyAgICAgIHByaW50ZigiVXNlIFNFVCBISU5UUyBPRkYgdG8gc3VwcHJlc3MgZnVydGhlciBoaW50cy5cclxuIik7CisgICAgICBwcmludGYoIioqKioqKioqKioqKioqKioqKioqKioqKipcclxuIik7CisgICAgICBub2hpbnRnaXZlbiA9IDA7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9ISU5UUyAqLworICAgICAgICB9CisKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgIC8qIE11c3QgZGlzYWJsZSBjYXJyaWVyIGRldGVjdCBjaGVjayBpZiB3ZSBhcmUgdXNpbmcgVGVsbmV0IENvbXBvcnQgKi8KKyAgICAgICAgc2F2Y2FyciA9IHR0Y2FycjsKKyAgICAgICAgdHRzY2FycihDQVJfT0ZGKTsKKyAgICAgICAgY291bnQgPSB0dGNoaygpOworICAgICAgICB0dHNjYXJyKHNhdmNhcnIpOworI2Vsc2UgLyogVE5fQ09NUE9SVCAqLworICAgICAgICBjb3VudCA9IHR0Y2hrKCk7CisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworICAgIH0gd2hpbGUgKCh0bl93YWl0X2lkeCA8IFROX1dBSVRfQlVGX1NaKSAmJgorICAgICAgICAgICAgIChvdXRzdGFuZGluZyAmJiBjb3VudCA+PSAwKSk7CisKKyAgICBpZiAodG5fd2FpdF9pZHggPT0gVE5fV0FJVF9CVUZfU1opIHsKKyAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1ZygiPFRlbG5ldCBXYWl0IEJ1ZmZlciBmaWxsZWQ+Iik7CisgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgaWYgKCFzc3RlbG5ldCAmJiAhcXVpZXQpIHsKKyNpZmRlZiBDS1NQSU5ORVIKKyAgICAgICAgcHJpbnRmKCJcYiBcYiIpOworI2Vsc2UKKyAgICAgICAgaWYgKG5mbGFnID4gMCkgeworICAgICAgICAgICAgcHJpbnRmKCIgKE9LKVxuIik7CisgICAgICAgICAgICBuZmxhZyA9IC0xOworICAgICAgICB9CisjZW5kaWYgLyogQ0tTUElOTkVSICovCisgICAgfQorICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1ZygiPG5vIG91dHN0YW5kaW5nIG5lZ290aWF0aW9ucz4iKTsKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qIFB1c2ggZGF0YSBmcm9tIHRoZSBUZWxuZXQgV2FpdCBCdWZmZXIgaW50byB0aGUgSS9PIFF1ZXVlICovCisvKiBSZXR1cm4gMSBvbiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQKK3RuX3B1c2goKSB7CisjaWZkZWYgTkVUTEVCVUYKKyAgICBleHRlcm4gaW50IHR0X3B1c2hfaW5pdGVkOworI2VuZGlmIC8qIE5FVExFQlVGICovCisgICAgaWYgKHRuX3dhaXRfaWR4KSB7CisgICAgICAgIGhleGR1bXAoKENIQVIgKikidG5fcHVzaCIsdG5fd2FpdF9idWYsdG5fd2FpdF9pZHgpOworI2lmZGVmIE5FVExFQlVGCisgICAgICAgIGlmICghdHRfcHVzaF9pbml0ZWQpICAgICAgICAgICAgLyogTG9jYWwgaGFuZGxpbmcgKi8KKyAgICAgICAgICBsZV9pbml0KCk7CisgICAgICAgIGxlX3B1dHMoKENIQVIgKil0bl93YWl0X2J1Zix0bl93YWl0X2lkeCk7CisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXh0ZXJuYWwgaGFuZGxpbmcuLi4gKi8KKyNpZmRlZiBPUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBLOTUgaGFzIGl0cyBvd24gd2F5ICovCisgICAgICAgIGxlX3B1dHMoKENIQVIgKil0bl93YWl0X2J1Zix0bl93YWl0X2lkeCk7CisjZWxzZQorI2lmZGVmIFRUTEVCVUYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVOSVgsIGV0YyAqLworICAgICAgICBsZV9wdXRzKChDSEFSICopdG5fd2FpdF9idWYsdG5fd2FpdF9pZHgpOworI2Vsc2UKKy8qCisgIElmIHlvdSBzZWUgdGhpcyBtZXNzYWdlIGluIEFPUy9WUywgT1MtOSwgVk9TLCBldGMsIHlvdSBuZWVkIHRvIGNvcHkKKyAgdGhlICNpZmRlZiBUVExFQlVGLi4jZW5kaWYgY29kZSBmcm9tIGNrdXRpby5jIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgIHBsYWNlcyBpbiB5b3VyIGNrP3Rpby5jIG1vZHVsZS4KKyovCisgICAgICAgIHByaW50ZigidG5fcHVzaCBjYWxsZWQgYnV0IG5vdCBpbXBsZW1lbnRlZCAtIGRhdGEgbG9zdC5cbiIpOworI2VuZGlmIC8qIFRUTEVCVUYgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBORVRMRUJVRiAqLworICAgICAgICB0bl93YWl0X2lkeCA9IDA7CisgICAgfQorICAgIHRuX3dhaXRfdG1vID0gVE5fVElNRU9VVDsgICAgICAgICAgIC8qIFJlc2V0IHdhaXQgdGltZXIgc3RhdHMgKi8KKyAgICByZXR1cm4oMSk7Cit9CisKKy8qICBUIE4gXyBTIE8gUCBUICAqLworLyoKKyAgIFNlbmRzIGEgdGVsbmV0IG9wdGlvbiwgYXZvaWRzIGxvb3BzLgorICAgUmV0dXJucyAxIGlmIGNvbW1hbmQgd2FzIHNlbnQsIDAgaWYgbm90LCAtMSBvbiBlcnJvci4KKyovCitpbnQKK3RuX3NvcHQoY21kLG9wdCkgaW50IGNtZCwgb3B0OyB7ICAgICAgICAvKiBURUxORVQgU0VORCBPUFRJT04gKi8KKyAgICBDSEFSIGJ1Zls1XTsKKyAgICBjaGFyIG1zZ1sxMjhdOworICAgIGludCByYzsKKworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKC0xKTsgIC8qIE11c3QgYmUgVENQL0lQICovCisgICAgaWYgKHR0bnByb3RvICE9IE5QX1RFTE5FVCkgcmV0dXJuKC0xKTsgLyogTXVzdCBiZSB0ZWxuZXQgcHJvdG9jb2wgKi8KKyAgICBpZiAoIVRFTENNRF9PSyhjbWQpKSByZXR1cm4oLTEpOworICAgIGlmIChURUxPUFRfT0sob3B0KSkgeworICAgICAgICBpZiAoY21kID09IERPICYmIFRFTE9QVF9VTkFOU1dFUkVEX0RPKG9wdCkpIHJldHVybigwKTsKKyAgICAgICAgaWYgKGNtZCA9PSBXSUxMICYmIFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwob3B0KSkgcmV0dXJuKDApOworICAgICAgICBpZiAoY21kID09IERPTlQgJiYgVEVMT1BUX1VOQU5TV0VSRURfRE9OVChvcHQpKSByZXR1cm4oMCk7CisgICAgICAgIGlmIChjbWQgPT0gV09OVCAmJiBURUxPUFRfVU5BTlNXRVJFRF9XT05UKG9wdCkpIHJldHVybigwKTsKKyAgICB9CisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgaWYgKGNtZCA9PSBETyAmJiBvcHQgPT0gVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKQorICAgICAgYnVmWzBdID0gMDsKKworICAgIGlmICh0bl9pbmZpbml0ZSAmJiBURUxPUFRfT0sob3B0KSkgeyAvKiBTZWUgY29tbWVudCBhYm92ZSBhYm91dCAgICovCisgICAgICAgIGludCBpbmRleCA9IFRFTE9QVF9JTkRFWChvcHQpOyAgIC8qIHByZXZlbnRpbmcgaW5maW5pdGUgbG9vcHMgKi8KKyAgICAgICAgaW50IG0gPSBjbWQgLSBXSUxMOworCisgICAgICAgIGlmICh0bmNudHNbaW5kZXhdW21dID4gTUFYVE5DTlQpIHsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMgfHwgZGVibG9nKSB7CisgICAgICAgICAgICAgICAgY2ttYWttc2cobXNnLHNpemVvZihtc2cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRFTE5FVCBuZWdvdGlhdGlvbiBsb29wICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBURUxDTUQoY21kKSwgIiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUKG9wdCkpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsbXNnLCIiLG9wdCk7CisgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKG1zZyk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgICAgICB0bmNudHNbaW5kZXhdW21dKys7CisgICAgICAgIHRuY250c1tpbmRleF1bdG5vcHBzW21dXSA9IDA7CisgICAgfQorICAgIGJ1ZlswXSA9IChDSEFSKSBJQUM7CisgICAgYnVmWzFdID0gKENIQVIpIChjbWQgJiAweGZmKTsKKyAgICBidWZbMl0gPSAoQ0hBUikgKG9wdCAmIDB4ZmYpOworICAgIGJ1ZlszXSA9IChDSEFSKSAwOworI2lmZGVmIERFQlVHCisgICAgaWYgKCh0bl9kZWIgfHwgZGVic2VzIHx8IGRlYmxvZykgJiYgY21kICE9IFNCKQorICAgICAgICBja21ha21zZyhtc2csc2l6ZW9mKG1zZyksIlRFTE5FVCBTRU5UICIsVEVMQ01EKGNtZCksIiAiLAorICAgICAgICAgICAgICAgICAgVEVMT1BUKG9wdCkpOworI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyAgICBkZWJ1ZyhGMTAxLG1zZywiIixvcHQpOworICAgIGlmICgodG5fZGViIHx8IGRlYnNlcykgJiYgY21kICE9IFNCKQorICAgICAgdG5fZGVidWcobXNnKTsKKyAgICByYyA9ICh0dG9sKGJ1ZiwzKSA8IDMpOworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4oLTEpOworCisKKyAgICBpZiAoVEVMT1BUX09LKG9wdCkpIHsKKyAgICAgICAgaWYgKGNtZCA9PSBET05UICYmIFRFTE9QVF9VTkFOU1dFUkVEX0RPKG9wdCkpCisgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE8ob3B0KSA9IDA7CisgICAgICAgIGlmIChjbWQgPT0gV09OVCAmJiBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKG9wdCkpCisgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfV0lMTChvcHQpID0gMDsKKyAgICAgICAgaWYgKGNtZCA9PSBETyAmJiBURUxPUFRfVU5BTlNXRVJFRF9ET05UKG9wdCkpCisgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE9OVChvcHQpID0gMDsKKyAgICAgICAgaWYgKGNtZCA9PSBXSUxMICYmIFRFTE9QVF9VTkFOU1dFUkVEX1dPTlQob3B0KSkKKyAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XT05UKG9wdCkgPSAwOworICAgIH0KKyAgICByZXR1cm4oMSk7Cit9CisKKy8qIFNlbmQgYSB0ZWxuZXQgc3ViLW9wdGlvbiAqLworLyogUmV0dXJucyAxIGlmIGNvbW1hbmQgd2FzIHNlbnQsIDAgaWYgbm90LCAtMSBvbiBlcnJvciAqLworCitpbnQKK3RuX3NzYm9wdChvcHQsc3ViLGRhdGEsbGVuKSBpbnQgb3B0LCBzdWI7IENIQVIgKiBkYXRhOyBpbnQgbGVuOyB7CisgICAgQ0hBUiBidWZbMjU2XTsKKyAgICBpbnQgbixtLHJjOworCisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCKSByZXR1cm4oMCk7ICAgLyogTXVzdCBiZSBUQ1AvSVAgKi8KKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7IC8qIE11c3QgYmUgdGVsbmV0IHByb3RvY29sICovCisgICAgaWYgKCFURUxPUFRfT0sob3B0KSkgcmV0dXJuKC0xKTsKKyAgICBpZiAobGVuIDwgMCB8fCBsZW4gPiAyNTApIHsKKyAgICAgICAgZGVidWcoRjExMSwiVW5hYmxlIHRvIFNlbmQgVEVMTkVUIFNCIC0gZGF0YSB0b28gbG9uZyIsImxlbiIsbGVuKTsKKyAgICAgICAgcmV0dXJuKC0xKTsgICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIHRvbyBsb25nICovCisgICAgfQorI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgaWYgKHR0Y2hrKCkgPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4oMSk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgaWYgKCFkYXRhKSBsZW4gPSAwOworCisgICAgYnVmWzBdID0gKENIQVIpIElBQzsKKyAgICBidWZbMV0gPSAoQ0hBUikgKFNCICYgMHhmZik7CisgICAgYnVmWzJdID0gKENIQVIpIChvcHQgJiAweGZmKTsKKyAgICBidWZbM10gPSAoQ0hBUikgKHN1YiAmIDB4ZmYpOworICAgIGlmIChkYXRhICYmIGxlbiA+IDApIHsKKyAgICAgICAgbWVtY3B5KCZidWZbNF0sZGF0YSxsZW4pOworICAgIH0KKyAgICBidWZbNCtsZW5dID0gKENIQVIpIElBQzsKKyAgICBidWZbNStsZW5dID0gKENIQVIpIFNFOworCisjaWZkZWYgREVCVUcKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcyB8fCBkZWJsb2cpIHsKKyAgICAgICAgaWYgKG9wdCA9PSBURUxPUFRfU1RBUlRfVExTICYmIHN1YiA9PSAxKQorICAgICAgICAgIGNrbWFrbXNnKHRuX21zZ19vdXQsVE5fTVNHX0xFTiwiVEVMTkVUIFNFTlQgU0IgIiwKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUKG9wdCksIiBGT0xMT1dTIElBQyBTRSIsTlVMTCk7CisgICAgICAgIGVsc2UgaWYgKG9wdCA9PSBURUxPUFRfVFRZUEUgJiYgc3ViID09IDEpCisgICAgICAgICAgY2ttYWttc2codG5fbXNnX291dCxUTl9NU0dfTEVOLCJURUxORVQgU0VOVCBTQiAiLCBURUxPUFQob3B0KSwKKyAgICAgICAgICAgICAgICAgICAgIiBTRU5EIElBQyBTRSIsTlVMTCk7CisgICAgICAgIGVsc2UgaWYgKG9wdCA9PSBURUxPUFRfVFRZUEUgJiYgc3ViID09IDApCisgICAgICAgICAgY2ttYWt4bXNnKHRuX21zZ19vdXQsVE5fTVNHX0xFTiwiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQob3B0KSwiIElTICIsCisgICAgICAgICAgICAgICAgICAgIChjaGFyICopZGF0YSwiIElBQyBTRSIsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgIGVsc2UgaWYgKG9wdCA9PSBURUxPUFRfTkVXRU5WSVJPTikgeworICAgICAgICAgICAgaW50IGksIHF1b3RlOworICAgICAgICAgICAgY2ttYWttc2codG5fbXNnX291dCxUTl9NU0dfTEVOLCJURUxORVQgU0VOVCBTQiAiLAorICAgICAgICAgICAgICAgICAgICAgVEVMT1BUKFRFTE9QVF9ORVdFTlZJUk9OKSwiICIsCisgICAgICAgICAgICAgICAgICAgICBzdWIgPT0gVEVMUVVBTF9TRU5EID8gIlNFTkQiIDoKKyAgICAgICAgICAgICAgICAgICAgIHN1YiA9PSBURUxRVUFMX0lTID8gIklTIiA6CisgICAgICAgICAgICAgICAgICAgICBzdWIgPT0gVEVMUVVBTF9JTkZPID8iSU5GTyIgOiAiVU5LTk9XTiIgKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHF1b3RlID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1b3RlKSB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoaGV4YnVmLCIlMDJ4IixkYXRhW2ldKTsgLyogc2FmZSBidXQgdWdseSAqLworICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnX291dCxoZXhidWYsVE5fTVNHX0xFTik7CisgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGFbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRFTF9FTlZfVVNFUlZBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2dfb3V0LCIgVVNFUlZBUiAiLFROX01TR19MRU4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBURUxfRU5WX1ZBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2dfb3V0LCIgVkFSICIsVE5fTVNHX0xFTik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRFTF9FTlZfVkFMVUU6CisgICAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnX291dCwiIFZBTFVFICIsVE5fTVNHX0xFTik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRFTF9FTlZfRVNDOgorICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZ19vdXQsIiBFU0MgIixUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSUFDOgorICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZ19vdXQsIiBJQUMgIixUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGhleGJ1ZiwiJWMiLGRhdGFbaV0pOyAvKiBzYWZlIGJ1dCB1Z2x5ICovCisgICAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnX291dCxoZXhidWYsVE5fTVNHX0xFTik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnX291dCwiIElBQyBTRSIsVE5fTVNHX0xFTik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcHJpbnRmKGhleGJ1ZiwiJTAyeCIsc3ViKTsgICAgICAgICAgICAgLyogc2FmZSBidXQgdWdseSAqLworICAgICAgICAgICAgY2ttYWt4bXNnKHRuX21zZ19vdXQsVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQob3B0KSwKKyAgICAgICAgICAgICAgICAgICAgICAiICIsCisgICAgICAgICAgICAgICAgICAgICAgaGV4YnVmLAorICAgICAgICAgICAgICAgICAgICAgICIgPGRhdGE+IElBQyBTRSIsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAxLHRuX21zZ19vdXQsIiIsb3B0KTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykKKyAgICAgIHRuX2RlYnVnKHRuX21zZ19vdXQpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgcmMgPSAodHRvbChidWYsNitsZW4pIDwgNitsZW4pOworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisKKyAgICBpZiAocmMpCisgICAgICByZXR1cm4oLTEpOworICAgIHJldHVybigxKTsKK30KKworLyoKKyAgdG5fZmx1aSgpIC0tIFByb2Nlc3NlcyBhbGwgd2FpdGluZyBkYXRhIGZvciBUZWxuZXQgY29tbWFuZHMuCisgIEFsbCBub24tVGVsbmV0IGRhdGEgaXMgdG8gYmUgc3RvcmVkIGludG8gdGhlIFRlbG5ldCBXYWl0IEJ1ZmZlci4KKyAgUmV0dXJucyAxIG9uIHN1Y2Nlc3MuCisqLworaW50Cit0bl9mbHVpKCkgeworICAgIGV4dGVybiBpbnQgY2t4ZWNoOworICAgIGludCB4ID0gMDsKKworICAgIC8qIFdhaXQgdXAgdG8gNSBzZWMgZm9yIHJlc3BvbnNlcyB0byBvdXRzdGFuZGluZyB0ZWxuZXQgbmVnb3RpYXRpb25zICovCisgICAgd2hpbGUgKHggPj0gMCAmJiB0dGNoaygpID4gMCAgJiYgdG5fd2FpdF9pZHggPCBUTl9XQUlUX0JVRl9TWikgeworICAgICAgICB4ID0gdHRpbmMoMSk7CisgICAgICAgIHN3aXRjaCAoeCkgeworICAgICAgICAgIGNhc2UgSUFDOgorICAgICAgICAgICAgeCA9IHRuX2Rvb3AoKENIQVIpKHggJiAweGZmKSxpbnNlcnZlcj9ja3hlY2g6ZHVwbGV4LHR0aW5jKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInRuX2ZsdWkgdG5fZG9vcCIsIiIseCk7CisgICAgICAgICAgICBzd2l0Y2ggKHgpIHsKKyAgICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAvKiBUdXJuIG9uIGVjaG9pbmcgKi8KKyAgICAgICAgICAgICAgICBkdXBsZXggPSAxOworICAgICAgICAgICAgICAgIGlmIChpbnNlcnZlcikKKyAgICAgICAgICAgICAgICAgIGNreGVjaCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgLyogVHVybiBvZmYgZWNob2luZyAqLworICAgICAgICAgICAgICAgIGR1cGxleCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGluc2VydmVyKQorICAgICAgICAgICAgICAgICAgY2t4ZWNoID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHRuX3dhaXRfYnVmW3RuX3dhaXRfaWR4KytdID0gSUFDOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgIC8qIElLUyBldmVudCAqLworICAgICAgICAgICAgICBjYXNlIDY6ICAgICAgICAgICAgICAgICAgIC8qIExvZ291dCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICh4ID49IDApCisgICAgICAgICAgICAgIHRuX3dhaXRfYnVmW3RuX3dhaXRfaWR4KytdID0geDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oMSk7Cit9CisKK3Vuc2lnbmVkIGNoYXIgKgordG5fZ2V0X2Rpc3BsYXkoKQoreworICAgIGNoYXIgKiBkaXNwID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciB0bXBsb2NbMjU2XTsKKworICAgIC8qIE11c3QgY29tcHV0ZSB0aGUgRElTUExBWSBzdHJpbmcgd2UgYXJlIGdvaW5nIHRvIHNlbmQgdG8gdGhlIGhvc3QgKi8KKyAgICAvKiBJZiBvbmUgaXMgbm90IGFzc2lnbmVkLCBkbyBub3Qgc2VuZCBhIHN0cmluZyB1bmxlc3MgdGhlIHVzZXIgaGFzICovCisgICAgLyogZXhwbGljaXRlZGx5IHJlcXVlc3RlZCB3ZSB0cnkgdG8gc2VuZCBvbmUgdmlhIFgtRGlzcGxheSBMb2NhdGlvbiAqLworICAgIC8qIEJ1dCBkbyBub3Qgc2VuZCBhIHN0cmluZyBhdCBhbGwgaWYgRk9SV0FSRF9YIGlzIGluIHVzZS4gICAgICAgICAgKi8KKworICAgIGRlYnVnKEYxMTAsInRuX2dldF9kaXNwbGF5KCkgbXlpcGFkZHIiLG15aXBhZGRyLDApOworI2lmZGVmIENLX0VOVklST05NRU5UCisgICAgZGVidWcoRjExMCwidG5fZ2V0X2Rpc3BsYXkoKSB0bl9lbnZfZGlzcCIsdG5fZW52X2Rpc3AsMCk7CisgICAgaWYgKHRuX2Vudl9kaXNwWzBdKSB7CisgICAgICAgIGludCBjb2xvbiA9IGNraW5kZXgoIjoiLHRuX2Vudl9kaXNwLDAsMCwxKTsKKyAgICAgICAgaWYgKCAhY29sb24gKSB7CisgICAgICAgICAgICBja21ha21zZyh0bXBsb2MsMjU2LG15aXBhZGRyLCI6Iix0bl9lbnZfZGlzcCxOVUxMKTsKKyAgICAgICAgICAgIGRpc3AgPSB0bXBsb2M7CisgICAgICAgIH0gZWxzZSBpZiAoIGNraW5kZXgoImxvY2FsaG9zdDoiLHRuX2Vudl9kaXNwLDAsMCwwKSB8fAorICAgICAgICAgICAgICAgICAgICBja2luZGV4KCJ1bml4OiIsdG5fZW52X2Rpc3AsMCwwLDApIHx8CisgICAgICAgICAgICAgICAgICAgIGNraW5kZXgoIjEyNy4wLjAuMToiLHRuX2Vudl9kaXNwLDAsMCwwKSB8fAorICAgICAgICAgICAgICAgICAgICAhY2tzdHJjbXAoIjA6Iix0bl9lbnZfZGlzcCwyLDEpIHx8CisgICAgICAgICAgICAgICAgICAgIHRuX2Vudl9kaXNwWzBdID09ICc6JyApIHsKKyAgICAgICAgICAgIGNrbWFrbXNnKHRtcGxvYywyNTYsbXlpcGFkZHIsIjoiLCZ0bl9lbnZfZGlzcFtjb2xvbl0sTlVMTCk7CisgICAgICAgICAgICBkaXNwID0gdG1wbG9jOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGRpc3AgPSB0bl9lbnZfZGlzcDsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisgICAgICAgIGlmIChURUxPUFRfTUUoVEVMT1BUX1hESVNQTE9DKSB8fAorICAgICAgICAgICAgICBURUxPUFRfVShURUxPUFRfRk9SV0FSRF9YKSkgeworICAgICAgICBja21ha21zZyh0bXBsb2MsMjU2LG15aXBhZGRyLCI6MC4wIixOVUxMLE5VTEwpOworICAgICAgICBkaXNwID0gdG1wbG9jOworICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJ0bl9nZXRfZGlzcGxheSgpIHJldHVybnMiLGRpc3AsMCk7CisgICAgcmV0dXJuKChDSEFSICopZGlzcCk7Cit9CisKKyNpZmRlZiBDS19GT1JXQVJEX1gKK3N0YXRpYyBYYXV0aCBmYWtlX3hhdXRoID0gezAsMCxOVUxMLDAsTlVMTCwwLE5VTEwsMCxOVUxMfTsKK3N0YXRpYyBYYXV0aCAqcmVhbF94YXV0aD1OVUxMOworCisvKgorICogQXV0aG9yOiAgSmltIEZ1bHRvbiwgTUlUIFggQ29uc29ydGl1bQorICoKKyAqIGZ3ZHhfcGFyc2VfZGlzcGxheW5hbWUgLQorICogZGlzcGxheSBhIGRpc3BsYXkgc3RyaW5nIHVwIGludG8gaXRzIGNvbXBvbmVudCBwYXJ0cworICovCisjaWZkZWYgVU5JWAorI2RlZmluZSBVTklYX0NPTk5FQ1RJT04gInVuaXgiCisjZGVmaW5lIFVOSVhfQ09OTkVDVElPTl9MRU5HVEggNAorI2VuZGlmCisKKy8qCisgKiBwcml2YXRlIHV0aWxpdHkgcm91dGluZXMKKyAqLworCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK1htdUdldEhvc3RuYW1lIChjaGFyICpidWYsIGludCBtYXhsZW4pCisjZWxzZQorWG11R2V0SG9zdG5hbWUgKGJ1ZiwgbWF4bGVuKQorICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbWF4bGVuOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaW50IGxlbjsKKworI2lmZGVmIE5FRURfVVRTTkFNRQorICAgIC8qCisgICAgICogc2FtZSBob3N0IG5hbWUgY3JvY2sgYXMgaW4gc2VydmVyIGFuZCB4aW5pdC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgdXRzbmFtZSBuYW1lOworCisgICAgdW5hbWUgKCZuYW1lKTsKKyAgICBsZW4gPSBzdHJsZW4gKG5hbWUubm9kZW5hbWUpOworICAgIGlmIChsZW4gPj0gbWF4bGVuKSBsZW4gPSBtYXhsZW4gLSAxOworICAgIHN0cm5jcHkgKGJ1ZiwgbmFtZS5ub2RlbmFtZSwgbGVuKTsKKyAgICBidWZbbGVuXSA9ICdcMCc7CisjZWxzZQorICAgIGJ1ZlswXSA9ICdcMCc7CisgICAgKHZvaWQpIGdldGhvc3RuYW1lIChidWYsIG1heGxlbik7CisgICAgYnVmIFttYXhsZW4gLSAxXSA9ICdcMCc7CisgICAgbGVuID0gc3RybGVuKGJ1Zik7CisjZW5kaWYgLyogaHB1eCAqLworICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBjaGFyICoKKyNpZmRlZiBDS19BTlNJQworY29weXN0cmluZyAoY2hhciAqc3JjLCBpbnQgbGVuKQorI2Vsc2UKK2NvcHlzdHJpbmcgKHNyYywgbGVuKQorICAgIGNoYXIgKnNyYzsKKyAgICBpbnQgbGVuOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgY2hhciAqY3A7CisKKyAgICBpZiAoIXNyYyAmJiBsZW4gIT0gMCkgcmV0dXJuIE5VTEw7CisgICAgY3AgPSBtYWxsb2MgKGxlbiArIDEpOworICAgIGlmIChjcCkgeworICAgICAgICBpZiAoc3JjKSBzdHJuY3B5IChjcCwgc3JjLCBsZW4pOworICAgICAgICBjcFtsZW5dID0gJ1wwJzsKKyAgICB9CisgICAgcmV0dXJuIGNwOworfQorCitzdGF0aWMgY2hhciAqCisjaWZkZWYgQ0tfQU5TSUMKK2dldF9sb2NhbF9ob3N0bmFtZSAoY2hhciAqYnVmLCBpbnQgbWF4bGVuKQorI2Vsc2UKK2dldF9sb2NhbF9ob3N0bmFtZSAoYnVmLCBtYXhsZW4pCisgICAgY2hhciAqYnVmOworICAgIGludCBtYXhsZW47CisjZW5kaWYKK3sKKyAgICBidWZbMF0gPSAnXDAnOworICAgICh2b2lkKSBYbXVHZXRIb3N0bmFtZSAoYnVmLCBtYXhsZW4pOworICAgIHJldHVybiAoYnVmWzBdID8gYnVmIDogTlVMTCk7Cit9CisKKyNpZm5kZWYgVU5JWAorc3RhdGljIGNoYXIgKgorY29weWhvc3RuYW1lICgpCit7CisgICAgY2hhciBidWZbMjU2XTsKKworICAgIHJldHVybiAoZ2V0X2xvY2FsX2hvc3RuYW1lIChidWYsIHNpemVvZiBidWYpID8KKyAgICAgICAgICAgIGNvcHlzdHJpbmcgKGJ1Ziwgc3RybGVuIChidWYpKSA6IE5VTEwpOworfQorI2VuZGlmCisKKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2Z3ZHhfcGFyc2VfZGlzcGxheW5hbWUgKGNoYXIgKmRpc3BsYXluYW1lLCBpbnQgKmZhbWlseXAsIGNoYXIgKipob3N0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZHB5bnVtcCwgaW50ICpzY3JudW1wLCBjaGFyICoqcmVzdHApCisjZWxzZQorZndkeF9wYXJzZV9kaXNwbGF5bmFtZSAoZGlzcGxheW5hbWUsIGZhbWlseXAsIGhvc3RwLCBkcHludW1wLCBzY3JudW1wLCByZXN0cCkKKyAgICBjaGFyICpkaXNwbGF5bmFtZTsKKyAgICBpbnQgKmZhbWlseXA7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gKi8KKyAgICBjaGFyICoqaG9zdHA7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gKi8KKyAgICBpbnQgKmRweW51bXAsICpzY3JudW1wOyAgICAgICAgICAgICAvKiByZXR1cm4gKi8KKyAgICBjaGFyICoqcmVzdHA7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gKi8KKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGNoYXIgKnB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmsgdmFyaWFibGVzICovCisgICAgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yayB2YXJpYWJsZSAqLworICAgIGludCBmYW1pbHkgPSAtMTsgICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlIHRvIGJlIHJldHVybmVkICovCisgICAgY2hhciAqaG9zdCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgLyogbXVzdCBmcmVlIGlmIHNldCBhbmQgZXJyb3IgcmV0dXJuICovCisgICAgaW50IGRweW51bSA9IC0xOyAgICAgICAgICAgICAgICAgICAgLyogdmFsdWUgdG8gYmUgcmV0dXJuZWQgKi8KKyAgICBpbnQgc2NybnVtID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiB2YWx1ZSB0byBiZSByZXR1cm5lZCAqLworICAgIGNoYXIgKnJlc3QgPSBOVUxMOyAgICAgICAgICAgICAgICAgIC8qIG11c3QgZnJlZSBpZiBzZXQgYW5kIGVycm9yIHJldHVybiAqLworICAgIGludCBkbmV0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIDEgdGhlbiB1c2luZyBERUNuZXQgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIHRoZSBuYW1lICovCisgICAgaWYgKCFkaXNwbGF5bmFtZSB8fCAhZGlzcGxheW5hbWVbMF0pCisgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgaGF2ZSBhdCBsZWFzdCA6bnVtYmVyICovCisgICAgcHRyID0gKGNoYXIgKilzdHJjaHIoZGlzcGxheW5hbWUsICc6Jyk7CisgICAgaWYgKCFwdHIgfHwgIXB0clsxXSkgcmV0dXJuIDA7CisgICAgaWYgKHB0clsxXSA9PSAnOicpIHsKKyAgICAgICAgaWYgKHB0clsyXSA9PSAnXDAnKSByZXR1cm4gMDsKKyAgICAgICAgZG5ldCA9IDE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBnZXQgdGhlIGhvc3Qgc3RyaW5nOyBpZiBub25lIGlzIGdpdmVuLCB1c2UgdGhlIG1vc3QgZWZmaWVjaWVudCBwYXRoCisgICAgICovCisKKyAgICBsZW4gPSAocHRyIC0gZGlzcGxheW5hbWUpOyAgLyogbGVuZ3RoIG9mIGhvc3QgbmFtZSAqLworICAgIGlmIChsZW4gPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIGNob29zZSBtb3N0IGVmZmljaWVudCBwYXRoICovCisjaWZkZWYgVU5JWAorICAgICAgICBob3N0ID0gY29weXN0cmluZyAoVU5JWF9DT05ORUNUSU9OLCBVTklYX0NPTk5FQ1RJT05fTEVOR1RIKTsKKyAgICAgICAgZmFtaWx5ID0gRmFtaWx5TG9jYWw7CisjZWxzZQorICAgICAgICBpZiAoZG5ldCkgeworICAgICAgICAgICAgaG9zdCA9IGNvcHlzdHJpbmcgKCIwIiwgMSk7CisgICAgICAgICAgICBmYW1pbHkgPSBGYW1pbHlERUNuZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBob3N0ID0gY29weWhvc3RuYW1lICgpOworICAgICAgICAgICAgZmFtaWx5ID0gRmFtaWx5SW50ZXJuZXQ7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGhvc3QgPSBjb3B5c3RyaW5nIChkaXNwbGF5bmFtZSwgbGVuKTsKKyAgICAgICAgaWYgKGRuZXQpIHsKKyAgICAgICAgICAgIGZhbWlseSA9IGRuZXQ7CisgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgVU5JWAorICAgICAgICAgICAgaWYgKGhvc3QgJiYgc3RyY21wIChob3N0LCBVTklYX0NPTk5FQ1RJT04pID09IDApCisgICAgICAgICAgICAgIGZhbWlseSA9IEZhbWlseUxvY2FsOworICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgIGZhbWlseSA9IEZhbWlseUludGVybmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFob3N0KSByZXR1cm4gMDsKKworCisgICAgLyoKKyAgICAgKiBnZXQgdGhlIGRpc3BsYXkgbnVtYmVyOyB3ZSBrbm93IHRoYXQgdGhlcmUgaXMgc29tZXRoaW5nIGFmdGVyIHRoZQorICAgICAqIGNvbG9uIChvciBjb2xvbnMpIGZyb20gYWJvdmUuICBub3RlIHRoYXQgaG9zdCBpcyBub3cgc2V0IGFuZCBtdXN0CisgICAgICogYmUgZnJlZWQgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisKKyAgICBpZiAoZG5ldCkgcHRyKys7ICAgICAgICAgICAgICAgICAgICAvKiBza2lwIHRoZSBleHRyYSBERUNuZXQgY29sb24gKi8KKyAgICBwdHIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3ZlIHRvIHN0YXJ0IG9mIGRpc3BsYXkgbnVtICovCisgICAgeworICAgICAgICByZWdpc3RlciBjaGFyICpjcDsKKworICAgICAgICBmb3IgKGNwID0gcHRyOyAqY3AgJiYgaXNhc2NpaSgqY3ApICYmIGlzZGlnaXQoKmNwKTsgY3ArKykgOworICAgICAgICBsZW4gPSAoY3AgLSBwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIHByZXNlbnQgYW5kIHZhbGlkIGZvbGxvdyAqLworICAgICAgICBpZiAobGVuID09IDAgfHwgKCpjcCAmJiAqY3AgIT0gJy4nKSkgeworICAgICAgICAgICAgZnJlZSAoaG9zdCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGRweW51bSA9IGF0b2kgKHB0cik7ICAgICAgICAgICAgLyogaXQgd2lsbCBoYW5kbGUgbnVtLiBhcyB3ZWxsICovCisgICAgICAgIHB0ciA9IGNwOworICAgIH0KKworICAgIC8qCisgICAgICogbm93IGdldCBzY3JlZW4gbnVtYmVyIGlmIGdpdmVuOyBwdHIgbWF5IHBvaW50IHRvIG51bCBhdCB0aGlzIHBvaW50CisgICAgICovCisgICAgaWYgKHB0clswXSA9PSAnLicpIHsKKyAgICAgICAgcmVnaXN0ZXIgY2hhciAqY3A7CisKKyAgICAgICAgcHRyKys7CisgICAgICAgIGZvciAoY3AgPSBwdHI7ICpjcCAmJiBpc2FzY2lpKCpjcCkgJiYgaXNkaWdpdCgqY3ApOyBjcCsrKSA7CisgICAgICAgIGxlbiA9IChjcCAtIHB0cik7CisgICAgICAgIGlmIChsZW4gPT0gMCB8fCAoKmNwICYmICpjcCAhPSAnLicpKSB7ICAvKiBhbGwgcHJvcCBuYW1lICovCisgICAgICAgICAgICBmcmVlIChob3N0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgc2NybnVtID0gYXRvaSAocHRyKTsgICAgICAgICAgICAvKiBpdCB3aWxsIGhhbmRsZSBudW0uIGFzIHdlbGwgKi8KKyAgICAgICAgcHRyID0gY3A7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBhbmQgZmluYWxseSwgZ2V0IGFueSBhZGRpdGlvbmFsIHN0dWZmIHRoYXQgbWlnaHQgYmUgZm9sbG93aW5nIHRoZQorICAgICAqIHRoZSBzY3JlZW4gbnVtYmVyOyBwdHIgbXVzdCBwb2ludCB0byBhIHBlcmlvZCBpZiB0aGVyZSBpcyBhbnl0aGluZworICAgICAqLworCisgICAgaWYgKHB0clswXSA9PSAnLicpIHsKKyAgICAgICAgcHRyKys7CisgICAgICAgIGxlbiA9IHN0cmxlbiAocHRyKTsKKyAgICAgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgICAgIHJlc3QgPSBjb3B5c3RyaW5nIChwdHIsIGxlbik7CisgICAgICAgICAgICBpZiAoIXJlc3QpIHsKKyAgICAgICAgICAgICAgICBmcmVlIChob3N0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogYW5kIHdlIGFyZSBkb25lIQorICAgICAqLworCisgICAgaWYgKCBmYW1pbHlwICkKKyAgICAgICAgKmZhbWlseXAgPSBmYW1pbHk7CisgICAgaWYgKCBob3N0cCApCisgICAgICAgICpob3N0cCA9IGhvc3Q7CisgICAgZWxzZQorICAgICAgICBmcmVlKGhvc3QpOworICAgIGlmICggZHB5bnVtcCApCisgICAgICAgICpkcHludW1wID0gZHB5bnVtOworICAgIGlmICggc2NybnVtcCApCisgICAgICAgICpzY3JudW1wID0gc2NybnVtOworICAgIGlmICggcmVzdHAgKQorICAgICAgICAqcmVzdHAgPSByZXN0OworICAgIGVsc2UKKyAgICAgICAgZnJlZShyZXN0KTsKKyAgICByZXR1cm4gMTsKK30KKworCitpbnQKKyNpZmRlZiBDS19BTlNJQworZndkeF90bl9zYiggdW5zaWduZWQgY2hhciAqIHNiLCBpbnQgbiApCisjZWxzZQorZndkeF90bl9zYiggc2IsIG4gKSB1bnNpZ25lZCBjaGFyICogc2I7IGludCBuOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgdW5zaWduZWQgc2hvcnQgaGNoYW5uZWwsIG5jaGFubmVsOworICAgIHVuc2lnbmVkIGNoYXIgKiBwOworICAgIGludCBpOworICAgIGludCByYyA9IC0xOworCisgICAgLyogY2hlY2sgdG8gZW5zdXJlIHdlIGhhdmUgbmVnb3RpYXRlZCBGb3J3YXJkIFggKi8KKyAgICBpZiAoIHNzdGVsbmV0ICYmICFURUxPUFRfTUUoVEVMT1BUX0ZPUldBUkRfWCkgfHwKKyAgICAgICAgICFzc3RlbG5ldCAmJiAhVEVMT1BUX1UoVEVMT1BUX0ZPUldBUkRfWCkgKSB7CisgICAgICAgIGRlYnVnKEYxMDAsImZ3ZHhfdG5fc2IoKSBub3QgbmVnb3RpYXRlZCIsIiIsMCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBzd2l0Y2ggKHNiWzBdKSB7CisgICAgY2FzZSBGV0RYX1NDUkVFTjoKKyAgICAgICAgaWYgKHNzdGVsbmV0ICYmIG4gPT0gNCkKKyAgICAgICAgICAgIHJjID0gZndkeF9jcmVhdGVfbGlzdGVuX3NvY2tldChzYlsxXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRldEWF9PUEVOOgorICAgICAgICBpZiAoICFzc3RlbG5ldCAmJiBuID49IDUgKSB7CisgICAgICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgJm5jaGFubmVsOworICAgICAgICAgICAgaSA9IDE7CisgICAgICAgICAgICAvKiBJQUMgcXVvdGluZyBoYXMgYmVlbiBzdHJpcHBlZCBpbiB0bl9zYigpICovCisgICAgICAgICAgICBwWzBdID0gc2JbaSsrXTsKKyAgICAgICAgICAgIHBbMV0gPSBzYltpKytdOworICAgICAgICAgICAgaGNoYW5uZWwgPSBudG9ocyhuY2hhbm5lbCk7CisgICAgICAgICAgICByYyA9IGZ3ZHhfb3Blbl9jbGllbnRfY2hhbm5lbChoY2hhbm5lbCk7CisgICAgICAgICAgICBpZiAoIHJjIDwgMCApIHsKKyAgICAgICAgICAgICAgICAvKiBGYWlsZWQ7IFNlbmQgQ0xPU0UgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgIGZ3ZHhfc2VuZF9jbG9zZShoY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgcmMgPSAwOyAgICAgICAgIC8qIERvIG5vdCBjb25zaWRlciB0aGlzIHRvIGJlIGEgdGVsbmV0IGVycm9yICovCisgICAgICAgICAgICB9CisjaWZkZWYgTlQKKyAgICAgICAgICAgIGlmICggIVRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3gudGhyZWFkX3N0YXJ0ZWQgKSB7CisgICAgICAgICAgICAgICAgY2tUaHJlYWRCZWdpbiggJmZ3ZHhfdGhyZWFkLDMyNjU1LCAwLCBGQUxTRSwgMCApIDsKKyAgICAgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LnRocmVhZF9zdGFydGVkID0gMTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOVCAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRldEWF9DTE9TRToKKyAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopICZuY2hhbm5lbDsKKyAgICAgICAgaSA9IDE7CisgICAgICAgIC8qIElBQyBxdW90aW5nIGhhcyBiZWVuIHN0cmlwcGVkIGluIHRuX3NiKCkgKi8KKyAgICAgICAgcFswXSA9IHNiW2krK107CisgICAgICAgIHBbMV0gPSBzYltpKytdOworICAgICAgICBoY2hhbm5lbCA9IG50b2hzKG5jaGFubmVsKTsKKyAgICAgICAgZndkeF9jbG9zZV9jaGFubmVsKGhjaGFubmVsKTsKKyAgICAgICAgcmMgPSAwOyAvKiBubyBlcnJvcnMgd2hlbiBjbG9zaW5nICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRldEWF9EQVRBOgorICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgJm5jaGFubmVsOworICAgICAgICBpID0gMTsKKyAgICAgICAgLyogSUFDIHF1b3RpbmcgaGFzIGJlZW4gc3RyaXBwZWQgaW4gdG5fc2IoKSAqLworICAgICAgICBwWzBdID0gc2JbaSsrXTsKKyAgICAgICAgcFsxXSA9IHNiW2krK107CisgICAgICAgIGhjaGFubmVsID0gbnRvaHMobmNoYW5uZWwpOworICAgICAgICByYyA9IGZ3ZHhfc2VuZF94YXV0aF90b194c2VydmVyKGhjaGFubmVsLChjaGFyICopJnNiWzNdLG4tNSk7CisgICAgICAgIGlmICggcmMgPj0gMCAmJiBuLTUtcmMgPiAwKSB7CisgICAgICAgICAgICByYyA9IGZ3ZHhfd3JpdGVfZGF0YV90b19jaGFubmVsKGhjaGFubmVsLChjaGFyICopJnNiWzMrcmNdLG4tNS1yYyk7CisgICAgICAgICAgICBpZiAoIHJjIDwgMCApIHsKKyAgICAgICAgICAgICAgICAvKiBGYWlsZWQ7IFNlbmQgQ0xPU0UgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgIHJjID0gZndkeF9zZW5kX2Nsb3NlKGhjaGFubmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZXRFhfT1BUSU9OUzoKKyAgICAgICAgaWYgKCBzc3RlbG5ldCApIHsKKyNpZm5kZWYgRldEWF9TRVJWRVIKKyAgICAgICAgICAgIHJjID0gMDsKKyNlbHNlCisgICAgICAgICAgICByYyA9IGZ3ZHhfc2VydmVyX2FjY2VwdF9vcHRpb25zKChjaGFyKikmc2JbMl0sbi0zKTsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmMgPSBmd2R4X2NsaWVudF9yZXBseV9vcHRpb25zKChjaGFyICopJnNiWzJdLG4tMyk7CisgICAgICAgICAgICBpZiAoIHJjID49IDAgKSB7CisgICAgICAgICAgICAgICAgcmMgPSB0bl9zbmRmd2R4KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0RYX09QVF9EQVRBOgorICAgICAgICBzd2l0Y2ggKCBzYlsxXSApIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJjID0gMDsgICAgICAgICAgICAgLyogd2UgZG9uJ3QgcmVjb2duaXplLCBub3QgYW4gZXJyb3IgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgRldEWF9YT0ZGOgorICAgIGNhc2UgRldEWF9YT046CisgICAgICAgIGlmICggIXNzdGVsbmV0ICkgeworICAgICAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopICZuY2hhbm5lbDsKKyAgICAgICAgICAgIGkgPSAxOworICAgICAgICAgICAgLyogSUFDIHF1b3RpbmcgaGFzIGJlZW4gc3RyaXBwZWQgaW4gdG5fc2IoKSAqLworICAgICAgICAgICAgcFswXSA9IHNiW2krK107CisgICAgICAgICAgICBwWzFdID0gc2JbaSsrXTsKKyAgICAgICAgICAgIGhjaGFubmVsID0gbnRvaHMobmNoYW5uZWwpOworICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW2hjaGFubmVsXS5zdXNwZW5kID0KKyAgICAgICAgICAgICAgICAoc2JbMF0gPT0gRldEWF9YT0ZGKTsKKyAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuKHJjIDwgMCA/IC0xIDogMCk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitmd2R4X3NlbmRfeGF1dGhfdG9feHNlcnZlcihpbnQgY2hhbm5lbCwgdW5zaWduZWQgY2hhciAqIGRhdGEsIGludCBsZW4pCisjZWxzZQorZndkeF9zZW5kX3hhdXRoX3RvX3hzZXJ2ZXIoY2hhbm5lbCwgZGF0YSwgbGVuKQorICAgIGludCBjaGFubmVsOyB1bnNpZ25lZCBjaGFyICogZGF0YTsgaW50IGxlbjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGludCBuYW1lX2xlbiwgZGF0YV9sZW4sIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYRldEWCA7IGkrKykgeworICAgICAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW2ldLmlkID09IGNoYW5uZWwpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCBpID09IE1BWEZXRFggKQorICAgICAgICBnb3RvIGF1dGhfZXJyOworCisgICAgaWYgKCFURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbaV0ubmVlZF90b19zZW5kX3hhdXRoKQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAobGVuIDwgMTIpCisgICAgICAgIGdvdG8gYXV0aF9lcnI7CisKKyAgICAvKiBQYXJzZSB0aGUgbGVuZ3RocyBvZiB2YXJpYWJsZS1sZW5ndGggZmllbGRzLiAqLworICAgIGlmIChkYXRhWzBdID09IDB4NDIpIHsgICAgICAgICAgICAgIC8qIGJ5dGUgb3JkZXIgTVNCIGZpcnN0LiAqLworICAgICAgICAvKiBYYXV0aCBwYWNrZXRzIGFwcGVhciB0byBhbHdheXMgaGF2ZSB0aGlzIGZvcm1hdCAqLworICAgICAgICBpZiAoIGRhdGFbMV0gIT0gMHgwMCB8fAorICAgICAgICAgICAgIGRhdGFbMl0gIT0gMHgwMCB8fAorICAgICAgICAgICAgIGRhdGFbM10gIT0gMHgwQiB8fAorICAgICAgICAgICAgIGRhdGFbNF0gIT0gMHgwMCB8fAorICAgICAgICAgICAgIGRhdGFbNV0gIT0gMHgwMCApCisgICAgICAgICAgICBnb3RvIGF1dGhfZXJyOworCisgICAgICAgIG5hbWVfbGVuID0gKGRhdGFbNl0gPDwgOCkgKyBkYXRhWzddOworICAgICAgICBkYXRhX2xlbiA9IChkYXRhWzhdIDw8IDgpICsgZGF0YVs5XTsKKyAgICB9IGVsc2UgaWYgKGRhdGFbMF0gPT0gMHg2YykgeyAgICAgICAvKiBCeXRlIG9yZGVyIExTQiBmaXJzdC4gKi8KKyAgICAgICAgLyogWGF1dGggcGFja2V0cyBhcHBlYXIgdG8gYWx3YXlzIGhhdmUgdGhpcyBmb3JtYXQgKi8KKyAgICAgICAgaWYgKCBkYXRhWzFdICE9IDB4MDAgfHwKKyAgICAgICAgICAgICBkYXRhWzJdICE9IDB4MEIgfHwKKyAgICAgICAgICAgICBkYXRhWzNdICE9IDB4MDAgfHwKKyAgICAgICAgICAgICBkYXRhWzRdICE9IDB4MDAgfHwKKyAgICAgICAgICAgICBkYXRhWzVdICE9IDB4MDAgKQorICAgICAgICAgICAgZ290byBhdXRoX2VycjsKKworICAgICAgICBuYW1lX2xlbiA9IGRhdGFbNl0gKyAoZGF0YVs3XSA8PCA4KTsKKyAgICAgICAgZGF0YV9sZW4gPSBkYXRhWzhdICsgKGRhdGFbOV0gPDwgOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogYmFkIGJ5dGUgb3JkZXIgYnl0ZSAqLworICAgICAgICBnb3RvIGF1dGhfZXJyOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZSB3aG9sZSBwYWNrZXQgaXMgaW4gYnVmZmVyLiAqLworICAgIGlmIChsZW4gPCAxMiArICgobmFtZV9sZW4gKyAzKSAmIH4zKSArICgoZGF0YV9sZW4gKyAzKSAmIH4zKSkKKyAgICAgICAgZ290byBhdXRoX2VycjsKKyAgICAvKiBJZiB0aGUgVGVsbmV0IFNlcnZlciBhbGxvd3MgYSByZWFsIFhhdXRoIG1lc3NhZ2UgdG8gYmUgc2VudCAqLworICAgIC8qIFRoZW4gbGV0IHRoZSBtZXNzYWdlIGJlIHByb2Nlc3NlZCBieSB0aGUgWHNlcnZlci4gICAgICAgICAgICovCisgICAgaWYgKG5hbWVfbGVuICsgZGF0YV9sZW4gPiAwKSB7CisgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW2ldLm5lZWRfdG9fc2VuZF94YXV0aCA9IDA7CisgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBlbHNlCisgICAgLyogSWYgYW4gZW1wdHkgWGF1dGggbWVzc2FnZSB3YXMgcmVjZWl2ZWQuICBXZSBhcmUgZ29pbmcgdG8gICAqLworICAgIC8qIHNlbmQgb3VyIG93biBYYXV0aCBtZXNzYWdlIHVzaW5nIHRoZSByZWFsIFhhdXRoIGRhdGEuICBBbmQgKi8KKyAgICAvKiB0aGVuIHNlbmQgYW55IG90aGVyIGRhdGEgaW4gdGhlIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICovCisgICAgeworICAgICAgICBpbnQgYywgZXJyLCBkcHludW0sIHNjcm51bSwgZmFtaWx5LCBzYl9sZW47CisgICAgICAgIGNoYXIgKmRpc3BsYXksICpob3N0ID0gTlVMTCwgKnJlc3QgPSBOVUxMOworICAgICAgICB1bnNpZ25lZCBjaGFyICpzYiwgKnA7CisKKyAgICAgICAgLyogcGFyc2UgdGhlIGxvY2FsIERJU1BMQVkgZW52IHZhciAqLworICAgICAgICBkaXNwbGF5ID0gZ2V0ZW52KCJESVNQTEFZIik7CisgICAgICAgIGlmICggIWRpc3BsYXkgKQorICAgICAgICAgICAgZGlzcGxheSA9ICIxMjcuMC4wLjE6MC4wIjsKKworICAgICAgICBpZiAoZndkeF9wYXJzZV9kaXNwbGF5bmFtZShkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFtaWx5LCAmaG9zdCwgJmRweW51bSwgJnNjcm51bSwgJnJlc3QpKSB7CisgICAgICAgICAgICBjaGFyICogZGlzcF9ubyA9IGNraXRvYShkcHludW0pOyAgICAvKiBzaG91bGQgYmUgdW5zaWduZWQgKi8KKyAgICAgICAgICAgIGlmIChmYW1pbHkgPT0gRmFtaWx5TG9jYWwpIHsKKyAgICAgICAgICAgICAgICAvKiBjYWxsIHdpdGggYWRkcmVzcyA9ICI8bG9jYWwgaG9zdCBuYW1lPiIgKi8KKyAgICAgICAgICAgICAgICBjaGFyIGFkZHJlc3NbMzAwXSA9ICJsb2NhbGhvc3QiOworICAgICAgICAgICAgICAgIGdldGhvc3RuYW1lKGFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSAtIDEpOworICAgICAgICAgICAgICAgIHJlYWxfeGF1dGggPSBYYXVHZXRBdXRoQnlBZGRyKGZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oYWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oZGlzcF9ubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcF9ubywgMCwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChmYW1pbHkgPT0gRmFtaWx5SW50ZXJuZXQpIHsKKyAgICAgICAgICAgICAgICAvKiBjYWxsIHdpdGggYWRkcmVzcyA9IDQgYnl0ZXMgbnVtZXJpYyBpcCBhZGRyIChNU0IpICovCisgICAgICAgICAgICAgICAgc3RydWN0IGhvc3RlbnQgKmhpOworICAgICAgICAgICAgICAgIGlmIChoaSA9IGdldGhvc3RieW5hbWUoaG9zdCkpCisgICAgICAgICAgICAgICAgICAgIHJlYWxfeGF1dGggPSBYYXVHZXRBdXRoQnlBZGRyKGZhbWlseSwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGktPmhfYWRkciwgc3RybGVuKGRpc3Bfbm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwX25vLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaG9zdCkgZnJlZShob3N0KTsKKyAgICAgICAgaWYgKHJlc3QpIGZyZWUocmVzdCk7CisgICAgICAgIGlmICghcmVhbF94YXV0aCkgeworICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3guY2hhbm5lbFtpXS5uZWVkX3RvX3NlbmRfeGF1dGggPSAwOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJuY21wKHJlYWxfeGF1dGgtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAiTUlULU1BR0lDLUNPT0tJRS0xIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlYWxfeGF1dGgtPm5hbWVfbGVuZ3RoKSkgeworICAgICAgICAgICAgY2hhciBtc2dbNjRdOworCisgICAgICAgICAgICBuYW1lX2xlbiA9IHJlYWxfeGF1dGgtPm5hbWVfbGVuZ3RoOworICAgICAgICAgICAgZGF0YV9sZW4gPSAxNjsKKworICAgICAgICAgICAgaWYgKCBkYXRhWzBdID09IDB4NDIgKSB7CisgICAgICAgICAgICAgICAgbXNnWzBdID0gMHg0MjsgLyogTVNCIG9yZGVyICovCisgICAgICAgICAgICAgICAgbXNnWzFdID0gbXNnWzJdID0gMDsKKyAgICAgICAgICAgICAgICBtc2dbM10gPSAweDBCOworICAgICAgICAgICAgICAgIG1zZ1s0XSA9IG1zZ1s1XSA9IDA7CisgICAgICAgICAgICAgICAgbXNnWzZdID0gKG5hbWVfbGVuID4+IDgpOworICAgICAgICAgICAgICAgIG1zZ1s3XSA9IChuYW1lX2xlbiAmIDB4RkYpOworICAgICAgICAgICAgICAgIG1zZ1s4XSA9IChkYXRhX2xlbiA+PiA4KTsKKyAgICAgICAgICAgICAgICBtc2dbOV0gPSAoZGF0YV9sZW4gJiAweEZGKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXNnWzBdID0gMHg2YzsgLyogTFNCIG9yZGVyICovCisgICAgICAgICAgICAgICAgbXNnWzFdID0gMDsKKyAgICAgICAgICAgICAgICBtc2dbMl0gPSAweDBCOworICAgICAgICAgICAgICAgIG1zZ1szXSA9IG1zZ1s0XSA9IG1zZ1s1XSA9IDA7CisgICAgICAgICAgICAgICAgbXNnWzZdID0gKG5hbWVfbGVuICYgMHhGRik7CisgICAgICAgICAgICAgICAgbXNnWzddID0gKG5hbWVfbGVuID4+IDgpOworICAgICAgICAgICAgICAgIG1zZ1s4XSA9IChkYXRhX2xlbiAmIDB4RkYpOworICAgICAgICAgICAgICAgIG1zZ1s5XSA9IChkYXRhX2xlbiA+PiA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZ1sxMF0gPSBtc2dbMTFdID0gMDsKKyAgICAgICAgICAgIG1lbWNweSgmbXNnWzEyXSxyZWFsX3hhdXRoLT5uYW1lLDE4KTsKKyAgICAgICAgICAgIG1zZ1szMF0gPSBtc2dbMzFdID0gMDsKKyAgICAgICAgICAgIG1lbWNweSgmbXNnWzMyXSxyZWFsX3hhdXRoLT5kYXRhLDE2KTsKKworICAgICAgICAgICAgaWYgKGZ3ZHhfd3JpdGVfZGF0YV90b19jaGFubmVsKGNoYW5uZWwsKGNoYXIgKiltc2csNDgpIDwgMCkgeworICBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbaV0ubmVlZF90b19zZW5kX3hhdXRoID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW2ldLm5lZWRfdG9fc2VuZF94YXV0aCA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuKDEyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW2ldLm5lZWRfdG9fc2VuZF94YXV0aCA9IDA7CisgICAgICAgICAgICByZXR1cm4oMCk7ICAgICAgICAvKiB3ZSBkbyBub3Qga25vdyBob3cgdG8gaGFuZGxlIHRoaXMgdHlwZSB5ZXQgKi8KKyAgICAgICAgfQorICAgIH0KKworICBhdXRoX2VycjoKKyAgICAgICAgZGVidWcoRjEwMCwiZndkeF9zZW5kX3hhdXRoX3RvX3hzZXJ2ZXIgZXJyb3IiLCIiLDApOworICAgIHJldHVybigtMSk7Cit9CisKKworI2lmZGVmIENPTU1FTlQKK2ludAorI2lmZGVmIENLX0FOU0lDCitmd2R4X2F1dGhvcml6ZV9jaGFubmVsKGludCBjaGFubmVsLCB1bnNpZ25lZCBjaGFyICogZGF0YSwgaW50IGxlbikKKyNlbHNlCitmd2R4X2F1dGhvcml6ZV9jaGFubmVsKGNoYW5uZWwsIGRhdGEsIGxlbikKKyAgICBpbnQgY2hhbm5lbDsgdW5zaWduZWQgY2hhciAqIGRhdGE7IGludCBsZW47CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICAvKiBYWFggbWF5YmUgd2Ugc2hvdWxkIGhhdmUgc29tZSByZXRyeSBoYW5kbGluZyBpZiBub3QgdGhlIHdob2xlIGZpcnN0CisgICAgKiBhdXRob3JpemF0aW9uIHBhY2tldCBhcnJpdmVzIGNvbXBsZXRlCisgICAgKi8KKyAgICBpZiAoICFURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbY2hhbm5lbF0uYXV0aG9yaXplZCApIHsKKyAgICAgICAgaW50IG5hbWVfbGVuLCBkYXRhX2xlbjsKKworICAgICAgICBpZiAobGVuIDwgMTIpCisgICAgICAgICAgICBnb3RvIGF1dGhfZXJyOworCisgICAgICAgIC8qIFBhcnNlIHRoZSBsZW5ndGhzIG9mIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMuICovCisgICAgICAgIGlmIChkYXRhWzBdID09IDB4NDIpIHsgICAgICAgICAgLyogYnl0ZSBvcmRlciBNU0IgZmlyc3QuICovCisgICAgICAgICAgICAvKiBYYXV0aCBwYWNrZXRzIGFwcGVhciB0byBhbHdheXMgaGF2ZSB0aGlzIGZvcm1hdCAqLworICAgICAgICAgICAgaWYgKCBkYXRhWzFdICE9IDB4MDAgfHwKKyAgICAgICAgICAgICAgICAgZGF0YVsyXSAhPSAweDAwIHx8CisgICAgICAgICAgICAgICAgIGRhdGFbM10gIT0gMHgwQiB8fAorICAgICAgICAgICAgICAgICBkYXRhWzRdICE9IDB4MDAgfHwKKyAgICAgICAgICAgICAgICAgZGF0YVs1XSAhPSAweDAwICkKKyAgICAgICAgICAgICAgICBnb3RvIGF1dGhfZXJyOworCisgICAgICAgICAgICBuYW1lX2xlbiA9IChkYXRhWzZdIDw8IDgpICsgZGF0YVs3XTsKKyAgICAgICAgICAgIGRhdGFfbGVuID0gKGRhdGFbOF0gPDwgOCkgKyBkYXRhWzldOworICAgICAgICB9IGVsc2UgaWYgKGRhdGFbMF0gPT0gMHg2YykgeyAgIC8qIEJ5dGUgb3JkZXIgTFNCIGZpcnN0LiAqLworICAgICAgICAgICAgLyogWGF1dGggcGFja2V0cyBhcHBlYXIgdG8gYWx3YXlzIGhhdmUgdGhpcyBmb3JtYXQgKi8KKyAgICAgICAgICAgIGlmICggZGF0YVsxXSAhPSAweDAwIHx8CisgICAgICAgICAgICAgICAgIGRhdGFbMl0gIT0gMHgwQiB8fAorICAgICAgICAgICAgICAgICBkYXRhWzNdICE9IDB4MDAgfHwKKyAgICAgICAgICAgICAgICAgZGF0YVs0XSAhPSAweDAwIHx8CisgICAgICAgICAgICAgICAgIGRhdGFbNV0gIT0gMHgwMCApCisgICAgICAgICAgICAgICAgZ290byBhdXRoX2VycjsKKworICAgICAgICAgICAgbmFtZV9sZW4gPSBkYXRhWzZdICsgKGRhdGFbN10gPDwgOCk7CisgICAgICAgICAgICBkYXRhX2xlbiA9IGRhdGFbOF0gKyAoZGF0YVs5XSA8PCA4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGJhZCBieXRlIG9yZGVyIGJ5dGUgKi8KKyAgICAgICAgICAgIGdvdG8gYXV0aF9lcnI7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2hlY2sgaWYgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgbWF0Y2hlcy4gKi8KKyAgICAgICAgaWYgKG5hbWVfbGVuICE9IGZha2VfeGF1dGgubmFtZV9sZW5ndGggfHwKKyAgICAgICAgICAgICBtZW1jbXAoZGF0YSArIDEyLCBmYWtlX3hhdXRoLm5hbWUsIG5hbWVfbGVuKSAhPSAwKSB7CisgICAgICAgICAgICAvKiBjb25uZWN0aW9uIHVzZXMgZGlmZmVyZW50IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sICovCisgICAgICAgICAgICBnb3RvIGF1dGhfZXJyOworICAgICAgICB9CisgICAgICAgIC8qIENoZWNrIGlmIGF1dGhlbnRpY2F0aW9uIGRhdGEgbWF0Y2hlcyBvdXIgZmFrZSBkYXRhLiAqLworICAgICAgICBpZiAoZGF0YV9sZW4gIT0gZmFrZV94YXV0aC5kYXRhX2xlbmd0aCB8fAorICAgICAgICAgICAgIG1lbWNtcChkYXRhICsgMTIgKyAoKG5hbWVfbGVuICsgMykgJiB+MyksCisgICAgICAgICAgICAgICAgICAgICBmYWtlX3hhdXRoLmRhdGEsIGZha2VfeGF1dGguZGF0YV9sZW5ndGgpICE9IDApIHsKKyAgICAgICAgICAgIC8qIGF1dGggZGF0YSBkb2VzIG5vdCBtYXRjaCBmYWtlIGRhdGEgKi8KKyAgICAgICAgICAgIGdvdG8gYXV0aF9lcnI7CisgICAgICAgIH0KKyAgICAgICAgLyogc3Vic3RpdHV0ZSB0aGUgZmFrZSBkYXRhIHdpdGggcmVhbCBkYXRhIGlmIHdlIGhhdmUgYW55ICovCisgICAgICAgIGlmIChyZWFsX3hhdXRoICYmIHJlYWxfeGF1dGgtPmRhdGEpCisgICAgICAgICAgICBtZW1jcHkoZGF0YSArIDEyICsgKChuYW1lX2xlbiArIDMpICYgfjMpLAorICAgICAgICAgICAgICAgICAgIHJlYWxfeGF1dGgtPmRhdGEsIGRhdGFfbGVuKTsKKworICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94LmNoYW5uZWxbY2hhbm5lbF0uYXV0aG9yaXplZCA9IDE7CisgICAgfQorICAgIHJldHVybigwKTsKKyAgYXV0aF9lcnI6CisgICAgcmV0dXJuKC0xKTsKK30KKyNlbmRpZiAvKiBDT01NRU5UICovCisKK2ludAorI2lmZGVmIENLX0FOU0lDCitmd2R4X3NlbmRfY2xvc2UoaW50IGNoYW5uZWwpCisjZWxzZQorZndkeF9zZW5kX2Nsb3NlKGNoYW5uZWwpIGludCBjaGFubmVsOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgdW5zaWduZWQgc2hvcnQgbmNoYW5uZWw7CisgICAgaW50IGkscmM7CisgICAgQ0hBUiAqIHA7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBuY2hhbm5lbCA9IGh0b25zKGNoYW5uZWwpOworICAgIHAgPSAodW5zaWduZWQgY2hhciAqKSAmbmNoYW5uZWw7CisKKyAgICBpID0gMDsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgLyogSSBBbSBhIENvbW1hbmQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAgICAgLyogU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9GT1JXQVJEX1g7ICAgICAgICAgLyogRm9yd2FyZCBYICovCisgICAgc2Jfb3V0W2krK10gPSBGV0RYX0NMT1NFOyAgICAgICAgICAgICAgIC8qIE9wZW4gKi8KKyAgICBzYl9vdXRbaSsrXSA9IHBbMF07ICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgQnl0ZSBvZiBDaGFubmVsICovCisgICAgaWYgKCBwWzBdID09IElBQyApCisgICAgICAgIHNiX291dFtpKytdID0gSUFDOworICAgIHNiX291dFtpKytdID0gcFsxXTsgICAgICAgICAgICAgICAgICAgICAvKiBTZWNvbmQgQnl0ZSBvZiBDaGFubmVsICovCisgICAgaWYgKCBwWzFdID09IElBQyApCisgICAgICAgIHNiX291dFtpKytdID0gSUFDOworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgLyogbWFya2VkIGJ5IElBQyBTRSAqLworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGNrbWFreG1zZyhmd2R4X21zZ19vdXQsVE5fTVNHX0xFTiwiVEVMTkVUIFNFTlQgU0IgIiwKKyAgICAgICAgICAgICAgICAgIFRFTE9QVChURUxPUFRfRk9SV0FSRF9YKSwKKyAgICAgICAgICAgICAgICAgICIgQ0xPU0UgQ0hBTk5FTD0iLGNraXRvYShjaGFubmVsKSwiIElBQyBTRSIsCisgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMCisgICAgICAgICAgICAgICAgICApOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLGZ3ZHhfbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcoZndkeF9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitmd2R4X3NlbmRfb3BlbihpbnQgY2hhbm5lbCkKKyNlbHNlIC8qIENLX0FOU0lDICovCitmd2R4X3NlbmRfb3BlbihjaGFubmVsKSBpbnQgY2hhbm5lbDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHVuc2lnbmVkIHNob3J0IG5jaGFubmVsOworICAgIGludCBpLCByYzsKKyAgICBDSEFSICogcDsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIG5jaGFubmVsID0gaHRvbnMoY2hhbm5lbCk7CisgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopICZuY2hhbm5lbDsKKworICAgIGkgPSAwOworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0I7ICAgICAgICAgICAgICAgICAgLyogU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9GT1JXQVJEX1g7ICAgICAgICAgICAvKiBGb3J3YXJkIFggKi8KKyAgICBzYl9vdXRbaSsrXSA9IEZXRFhfT1BFTjsgICAgICAgICAgICAgICAgICAvKiBPcGVuICovCisgICAgc2Jfb3V0W2krK10gPSBwWzBdOyAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgQnl0ZSBvZiBDaGFubmVsICovCisgICAgaWYgKCBwWzBdID09IElBQyApCisgICAgICAgIHNiX291dFtpKytdID0gSUFDOworICAgIHNiX291dFtpKytdID0gcFsxXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlY29uZCBCeXRlIG9mIENoYW5uZWwgKi8KKyAgICBpZiAoIHBbMV0gPT0gSUFDICkKKyAgICAgICAgc2Jfb3V0W2krK10gPSBJQUM7CisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogRW5kIG9mIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0U7ICAgICAgICAgICAgICAgICAgLyogbWFya2VkIGJ5IElBQyBTRSAqLworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGNrbWFreG1zZyhmd2R4X21zZ19vdXQsVE5fTVNHX0xFTiwiVEVMTkVUIFNFTlQgU0IgIiwKKyAgICAgICAgICAgICAgICAgIFRFTE9QVChURUxPUFRfRk9SV0FSRF9YKSwKKyAgICAgICAgICAgICAgICAgICIgT1BFTiBDSEFOTkVMPSIsY2tpdG9hKGNoYW5uZWwpLCIgSUFDIFNFIiwKKyAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLGZ3ZHhfbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcoZndkeF9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAgIC8qIFNlbmQgaXQuICovCisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBpZiAocmMpCisgICAgICByZXR1cm4oLTEpOworICAgIHJldHVybigwKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2Z3ZHhfY2xpZW50X3JlcGx5X29wdGlvbnMoY2hhciAqb3B0cywgaW50IG4pCisjZWxzZQorZndkeF9jbGllbnRfcmVwbHlfb3B0aW9ucyhvcHRzLCBuKSBjaGFyICpvcHRzOyBpbnQgbjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGludCBpLGoscmM7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBpID0gMDsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBJIEFtIGEgQ29tbWFuZCAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNCOyAgICAgICAgICAgICAgICAgIC8qIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSBURUxPUFRfRk9SV0FSRF9YOyAgICAgICAgICAgLyogRm9yd2FyZCBYICovCisgICAgc2Jfb3V0W2krK10gPSBGV0RYX09QVElPTlM7ICAgICAgICAgICAgICAgLyogT3B0aW9ucyAqLworCisgICAgLyogTG9vayBmb3IgdGhlIG9wdGlvbnMgd2UgcmVjb2duaXplIGFuZCB3aWxsIHN1cHBvcnQgZm9yIHRoaXMgc2Vzc2lvbiAqLworICAgIC8qIGFuZCByZXBseSB3aXRoIHRoZWlyIGJ5dGVzIHNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmb3IgKGo9MDsgajxuOyBqKyssaSsrKSB7CisgICAgICAgIHNiX291dFtpXSA9IEZXRFhfT1BUX05PTkU7ICAgICAgICAgIC8qIEFkZCB6ZXJvIGJ5dGUgLSBubyBvcHRpb25zICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAvKiBJZiB3ZSBoYWQgYW55IG9wdGlvbnMgdG8gc3VwcG9ydCwgdGhpcyBpcyBob3cgd2Ugd291bGQgZG8gaXQgKi8KKyAgICAgICAgaWYgKCBqID09IDAgKSB7CisgICAgICAgICAgICBpZiAob3B0c1tqXSAmIEZXRFhfT1BUX1hYWFgpIHsKKyAgICAgICAgICAgICAgICAvKiBzZXQgZmxhZyB0byByZW1lbWJlciBvcHRpb24gaXMgaW4gdXNlICovCisgICAgICAgICAgICAgICAgZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgc2Jfb3V0W2ldIHw9IEZXRFhfT1BUX1hYWFg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfQorICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNFOyAgICAgICAgICAgICAgICAgIC8qIG1hcmtlZCBieSBJQUMgU0UgKi8KKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2coZndkeF9tc2dfb3V0LFROX01TR19MRU4sIlRFTE5FVCBTRU5UIFNCICIsCisgICAgICAgICAgICAgICAgICBURUxPUFQoVEVMT1BUX0ZPUldBUkRfWCksCisgICAgICAgICAgICAgICAgICAiIE9QVElPTlMgIixja2N0b3goc2Jfb3V0WzRdLDEpLCIgSUFDIFNFIiwKKyAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLGZ3ZHhfbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcoZndkeF9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAgIC8qIFNlbmQgaXQuICovCisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBpZiAocmMpCisgICAgICByZXR1cm4oLTEpOworICAgIHJldHVybigwKTsKK30KKworCitpbnQKK2Z3ZHhfc2VuZF9vcHRpb25zKCkgeworICAgIGludCBpLCByYzsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIGkgPSAwOworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAvKiBJIEFtIGEgQ29tbWFuZCAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNCOyAgICAgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gVEVMT1BUX0ZPUldBUkRfWDsgICAgICAgICAvKiBGb3J3YXJkIFggKi8KKyAgICBzYl9vdXRbaSsrXSA9IEZXRFhfT1BUSU9OUzsgICAgICAgICAgICAgLyogT3B0aW9ucyAqLworICAgIHNiX291dFtpXSAgID0gRldEWF9PUFRfTk9ORTsKKyAgICAvKiBhY3RpdmF0ZSBvcHRpb25zIGhlcmUgKi8KKyAgICBpKys7CisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogRW5kIG9mIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0U7ICAgICAgICAgICAgICAgICAgLyogbWFya2VkIGJ5IElBQyBTRSAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgY2ttYWttc2coZndkeF9tc2dfb3V0LFROX01TR19MRU4sIlRFTE5FVCBTRU5UIFNCICIsCisgICAgICAgICAgICAgICAgIFRFTE9QVChURUxPUFRfRk9SV0FSRF9YKSwKKyAgICAgICAgICAgICAgICAgIiBPUFRJT05TIDAwIElBQyBTRSIsTlVMTCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMDAsZndkeF9tc2dfb3V0LCIiLDApOworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyhmd2R4X21zZ19vdXQpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgcmMgPSAodHRvbCgoQ0hBUiAqKXNiX291dCxpKSA8IDApOyAgICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgIHJldHVybigtMSk7CisgICAgcmV0dXJuKDApOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworZndkeF9zZW5kX2RhdGFfZnJvbV9jaGFubmVsKGludCBjaGFubmVsLCBjaGFyICogZGF0YSwgaW50IGxlbikKKyNlbHNlCitmd2R4X3NlbmRfZGF0YV9mcm9tX2NoYW5uZWwoY2hhbm5lbCwgZGF0YSwgbGVuKQorICAgIGludCBjaGFubmVsOyBjaGFyICogZGF0YTsgaW50IGxlbjsKKyNlbmRpZgoreworICAgIHVuc2lnbmVkIHNob3J0IG5jaGFubmVsOworICAgIC8qIHN0YXRpYyAqLyBDSEFSIHNiX3ByaXZbMjA0OF07CisgICAgQ0hBUiAqIHA7CisgICAgaW50IGksIGosIGpfc2F2LCByYzsKKyAgICB1bnNpZ25lZCBpbnQgdG1wOworCisgICAgZGVidWcoRjExMSwiZndkeF9zZW5kX2RhdGFfZnJvbV9jaGFubmVsKCkiLCJjaGFubmVsIixjaGFubmVsKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIG5jaGFubmVsID0gaHRvbnMoY2hhbm5lbCk7CisgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopICZuY2hhbm5lbDsKKworICAgIGogPSAwOworICAgIHNiX3ByaXZbaisrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBJIEFtIGEgQ29tbWFuZCAqLworICAgIHNiX3ByaXZbaisrXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX3ByaXZbaisrXSA9IFRFTE9QVF9GT1JXQVJEX1g7ICAgICAgICAgICAvKiBGb3J3YXJkIFggKi8KKyAgICBzYl9wcml2W2orK10gPSBGV0RYX0RBVEE7ICAgICAgICAgICAgICAgICAgLyogRGF0YSAqLworICAgIHNiX3ByaXZbaisrXSA9IHBbMF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBCeXRlIG9mIENoYW5uZWwgKi8KKyAgICBpZiAoIHBbMF0gPT0gSUFDICkKKyAgICAgICAgc2JfcHJpdltqKytdID0gSUFDOworICAgIHNiX3ByaXZbaisrXSA9IHBbMV07ICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWNvbmQgQnl0ZSBvZiBDaGFubmVsICovCisgICAgaWYgKCBwWzFdID09IElBQyApCisgICAgICAgIHNiX3ByaXZbaisrXSA9IElBQzsKKyAgICBqX3NhdiA9IGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgdG1wID0gKHVuc2lnbmVkIGludClkYXRhW2ldOworICAgICAgICBpZiAoIHRtcCA9PSBJQUMgKSB7CisgICAgICAgICAgICBzYl9wcml2W2orK10gPSBJQUM7CisgICAgICAgICAgICBzYl9wcml2W2orK10gPSBJQUM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzYl9wcml2W2orK10gPSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBqID49IDIwNDUgJiYgKGkgPCBsZW4tMSkgKSB7CisgICAgICAgICAgICBzYl9wcml2W2orK10gPSAoQ0hBUikgSUFDOyAgLyogRW5kIG9mIFN1Ym5lZ290aWF0aW9uICovCisgICAgICAgICAgICBzYl9wcml2W2orK10gPSAoQ0hBUikgU0U7ICAgLyogbWFya2VkIGJ5IElBQyBTRSAqLworCisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICAgICAgICAgIGNrbWFreG1zZyggZndkeF9tc2dfb3V0LFROX01TR19MRU4sIlRFTE5FVCBTRU5UIFNCICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFQoVEVMT1BUX0ZPUldBUkRfWCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIERBVEEgQ0hBTk5FTD0iLGNraXRvYShjaGFubmVsKSwiICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMICk7CisgICAgICAgICAgICAgICAgdG5faGV4KGZ3ZHhfbXNnX291dCxUTl9NU0dfTEVOLCZzYl9wcml2W2pfc2F2XSxqLShqX3NhdisyKSk7CisgICAgICAgICAgICAgICAgY2tzdHJuY2F0KGZ3ZHhfbXNnX291dCwiIElBQyBTRSIsVE5fTVNHX0xFTik7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsZndkeF9tc2dfb3V0LCIiLDApOworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKGZ3ZHhfbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgICAgIHJjID0gKHR0b2woc2JfcHJpdixqKSA8IDApOyAgICAgICAgICAgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImZ3ZHhfc2VuZF9kYXRhX2Zyb21fY2hhbm5lbCgpIiwidHRvbCgpIGZhaWxlZCIsMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICBzYl9wcml2W2orK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogSSBBbSBhIENvbW1hbmQgKi8KKyAgICAgICAgICAgIHNiX3ByaXZbaisrXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgICAgICAgICAgc2JfcHJpdltqKytdID0gVEVMT1BUX0ZPUldBUkRfWDsgICAgICAgICAgIC8qIEZvcndhcmQgWCAqLworICAgICAgICAgICAgc2JfcHJpdltqKytdID0gRldEWF9EQVRBOyAgICAgICAgICAgICAgICAgIC8qIERhdGEgKi8KKyAgICAgICAgICAgIHNiX3ByaXZbaisrXSA9IHBbMF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBCeXRlIG9mIENoYW5uZWwgKi8KKyAgICAgICAgICAgIGlmICggcFswXSA9PSBJQUMgKQorICAgICAgICAgICAgICAgIHNiX3ByaXZbaisrXSA9IElBQzsKKyAgICAgICAgICAgIHNiX3ByaXZbaisrXSA9IHBbMV07ICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWNvbmQgQnl0ZSBvZiBDaGFubmVsICovCisgICAgICAgICAgICBpZiAoIHBbMV0gPT0gSUFDICkKKyAgICAgICAgICAgICAgICBzYl9wcml2W2orK10gPSBJQUM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzYl9wcml2W2orK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogRW5kIG9mIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2JfcHJpdltqKytdID0gKENIQVIpIFNFOyAgICAgICAgICAgICAgICAgIC8qIG1hcmtlZCBieSBJQUMgU0UgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGNrbWFreG1zZyggZndkeF9tc2dfb3V0LFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9GT1JXQVJEX1gpLAorICAgICAgICAgICAgICAgICAgICIgREFUQSAiLGNrY3RveChwWzBdLDEpLCIgIixja2N0b3gocFsxXSwxKSwiICIsCisgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgdG5faGV4KGZ3ZHhfbXNnX291dCxUTl9NU0dfTEVOLCZzYl9wcml2WzZdLGotOCk7CisgICAgICAgIGNrc3RybmNhdChmd2R4X21zZ19vdXQsIiBJQUMgU0UiLFROX01TR19MRU4pOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLGZ3ZHhfbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcoZndkeF9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woc2JfcHJpdixqKSA8IDApOyAgICAgICAgICAgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKCByYyApIHsKKyAgICAgICAgZGVidWcoRjExMCwiZndkeF9zZW5kX2RhdGFfZnJvbV9jaGFubmVsKCkiLCJ0dG9sKCkgZmFpbGVkIiwwKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKworICAgIHJldHVybigwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorI2lmZGVmIENLX0FOU0lDCitmd2R4X2FkZF9xdW90ZWRfdHdvYnl0ZSh1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBzaG9ydCB0d29ieXRlKQorI2Vsc2UKK2Z3ZHhfYWRkX3F1b3RlZF90d29ieXRlKHAsIHR3b2J5dGUpCisgICAgdW5zaWduZWQgY2hhciAqcDsgdW5zaWduZWQgc2hvcnQgdHdvYnl0ZTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogYWRkcyB0aGUgSUFDIHF1b3RlZCAoTVNCKSByZXByZXNlbnRhdGlvbiBvZiAnY2hhbm5lbCcgYXQgYnVmZmVyIHBvaW50ZXIgJ3AnLAorICogcmV0dXJuaW5nIHBvaW50ZXIgdG8gbmV3IGJ1ZmZlciBwb3NpdGlvbi4gTk8gT1ZFUkZMT1cgQ0hFQ0shCisgKi8KK3sKKyAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpKCh0d29ieXRlID4+IDgpICYgMHhGRik7CisgICAgaWYgKCoocCAtIDEpID09IDB4RkYpCisgICAgICAgICpwKysgPSAweEZGOworICAgICpwKysgPSAodW5zaWduZWQgY2hhcikodHdvYnl0ZSAmIDB4RkYpOworICAgIGlmICgqKHAgLSAxKSA9PSAweEZGKQorICAgICAgICAqcCsrID0gMHhGRjsKKyAgICByZXR1cm4gcDsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2Z3ZHhfY3JlYXRlX2Zha2VfeGF1dGgoY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuLCBpbnQgZGF0YV9sZW4pCisjZWxzZQorZndkeF9jcmVhdGVfZmFrZV94YXV0aChuYW1lLCBuYW1lX2xlbiwgZGF0YV9sZW4pCisgICAgY2hhciAqbmFtZTsgaW50IG5hbWVfbGVuOyBpbnQgZGF0YV9sZW47CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBjaGFyIHN0YWNrZGF0YVsyNTZdOworICAgIHVuc2lnbmVkIGludCBjLCBuOworCisgICAgaWYgKCFuYW1lX2xlbiB8fCAhZGF0YV9sZW4pCisgICAgICAgIHJldHVybiAxOworICAgIGZha2VfeGF1dGgubmFtZSA9IG1hbGxvYyhuYW1lX2xlbik7CisgICAgZmFrZV94YXV0aC5kYXRhID0gbWFsbG9jKGRhdGFfbGVuKTsKKyAgICBpZiAoIWZha2VfeGF1dGgubmFtZSB8fCAhZmFrZV94YXV0aC5kYXRhKQorICAgICAgICByZXR1cm4gMjsKKyAgICBmYWtlX3hhdXRoLm5hbWVfbGVuZ3RoID0gbmFtZV9sZW47CisgICAgbWVtY3B5KGZha2VfeGF1dGgubmFtZSwgbmFtZSwgbmFtZV9sZW4pOworICAgIGZha2VfeGF1dGguZGF0YV9sZW5ndGggPSBkYXRhX2xlbjsKKworICAgIC8qIHRyeSB0byBtYWtlIGEgcmFuZG9tIHVuc2lnbmVkIGludCB0byBmZWVkIHNyYW5kKCkgKi8KKyAgICBjID0gdGltZShOVUxMKTsKKyAgICBjICo9IGdldHBpZCgpOworICAgIGZvciAobiA9IDA7IG4gPCBzaXplb2Yoc3RhY2tkYXRhKTsgbisrKQorICAgICAgICBjICs9IHN0YWNrZGF0YVtuXTsKKyAgICBzcmFuZCgodW5zaWduZWQgaW50KWMpOworICAgIGZvciAoYyA9IDA7IGMgPCBkYXRhX2xlbjsgYysrKQorICAgICAgICBmYWtlX3hhdXRoLmRhdGFbY10gPSAodW5zaWduZWQgY2hhcilyYW5kKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT01NRU5UCisvKiBObyBsb25nZXIgdXNlZCAqLworaW50Citmd2R4X3NlbmRfeGF1dGgodm9pZCkKK3sKKyAgICBpbnQgYywgZXJyLCBkcHludW0sIGZhbWlseSwgc2JfbGVuLCByYzsKKyAgICBjaGFyICpkaXNwbGF5LCAqaG9zdCA9IE5VTEw7CisgICAgdW5zaWduZWQgY2hhciAqc2JfcHJpdiwgKnA7CisKKyAgICAvKiBwYXJzZSB0aGUgbG9jYWwgRElTUExBWSBlbnYgdmFyICovCisgICAgaWYgKCEoZGlzcGxheSA9IHRuX2dldF9kaXNwbGF5KCkpKQorICAgICAgICByZXR1cm4gKC0xKTsKKyAgICBpZiAoZndkeF9wYXJzZV9kaXNwbGF5bmFtZShkaXNwbGF5LCAmZmFtaWx5LCAmaG9zdCwgJmRweW51bSwgTlVMTCwgTlVMTCkpIHsKKyAgICAgICAgY2hhciAqIGRpc3Bfbm8gPSBja2l0b2EoZHB5bnVtKTsKKyAgICAgICAgaWYgKGZhbWlseSA9PSBGYW1pbHlMb2NhbCkgeworICAgICAgICAgICAgLyogY2FsbCB3aXRoIGFkZHJlc3MgPSAiPGxvY2FsIGhvc3QgbmFtZT4iICovCisgICAgICAgICAgICBjaGFyIGFkZHJlc3NbMzAwXSA9ICJsb2NhbGhvc3QiOworICAgICAgICAgICAgZ2V0aG9zdG5hbWUoYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpIC0gMSk7CisgICAgICAgICAgICByZWFsX3hhdXRoID0gWGF1R2V0QXV0aEJ5QWRkcihmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oYWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGRpc3Bfbm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcF9ubywgMCwgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmYW1pbHkgPT0gRmFtaWx5SW50ZXJuZXQpIHsKKyAgICAgICAgICAgIC8qIGNhbGwgd2l0aCBhZGRyZXNzID0gNCBieXRlcyBudW1lcmljIGlwIGFkZHIgKE1TQikgKi8KKyAgICAgICAgICAgIHN0cnVjdCBob3N0ZW50ICpoaTsKKyAgICAgICAgICAgIGlmIChoaSA9IGdldGhvc3RieW5hbWUoaG9zdCkpCisgICAgICAgICAgICAgICAgcmVhbF94YXV0aCA9IFhhdUdldEF1dGhCeUFkZHIoZmFtaWx5LCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpLT5oX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGRpc3Bfbm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bfbm8sIDAsIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorICAgIGlmIChob3N0KSB7CisgICAgICAgIGZyZWUoaG9zdCk7CisgICAgICAgIGhvc3QgPSBOVUxMOworICAgIH0KKyAgICBpZiAocmVhbF94YXV0aCkKKyAgICAgICAgZXJyID0gZndkeF9jcmVhdGVfZmFrZV94YXV0aChyZWFsX3hhdXRoLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxfeGF1dGgtPm5hbWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxfeGF1dGgtPmRhdGFfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBlbHNlCisgICAgICBlcnIgPSBmd2R4X2NyZWF0ZV9mYWtlX3hhdXRoKCJNSVQtTUFHSUMtQ09PS0lFLTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oIk1JVC1NQUdJQy1DT09LSUUtMSIpLCAxNik7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFNCIGJsb2NrLCBhbGxvYyBmb3Igd29yc3QgY2FzZSAgICAgICAgICAgICAgKi8KKyAgICAvKiB0aGUgZm9sbG93aW5nIHNwcmludGYoKSBjYWxscyBhcmUgc2FmZSBkdWUgdG8gbGVuZ3RoIGNoZWNraW5nICAgICAgICovCisgICAgLyogYnVmZmVyIGlzIHR3aWNlIGFzIGJpZyBhcyB0aGUgaW5wdXQganVzdCBpbiBjYXNlIGV2ZXJ5IGJ5dGUgd2FzIElBQyAqLworICAgIHNiX2xlbiA9IDUgKyAyICsgMiArIGZha2VfeGF1dGgubmFtZV9sZW5ndGggKyBmYWtlX3hhdXRoLmRhdGFfbGVuZ3RoICsgMjsKKyAgICBpZiAoIShzYl9wcml2ID0gbWFsbG9jKDIgKiBzYl9sZW4pKSkKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICBwID0gc2JfcHJpdjsKKyAgICBzcHJpbnRmKHAsICIlYyVjJWMlYyVjIiwgSUFDLCBTQiwgVEVMT1BUX0ZPUldBUkRfWCwKKyAgICAgICAgICAgIEZXRFhfT1BUX0RBVEEsIEZXRFhfT1BUX1hBVVRIKTsKKyAgICBwICs9IDU7CisgICAgcCA9IGZ3ZHhfYWRkX3F1b3RlZF90d29ieXRlKHAsIGZha2VfeGF1dGgubmFtZV9sZW5ndGgpOworICAgIHAgPSBmd2R4X2FkZF9xdW90ZWRfdHdvYnl0ZShwLCBmYWtlX3hhdXRoLmRhdGFfbGVuZ3RoKTsKKyAgICBmb3IgKGMgPSAwOyBjIDwgZmFrZV94YXV0aC5uYW1lX2xlbmd0aDsgYysrKSB7CisgICAgICAgICpwKysgPSBmYWtlX3hhdXRoLm5hbWVbY107CisgICAgICAgIGlmICgodW5zaWduZWQgY2hhcilmYWtlX3hhdXRoLm5hbWVbY10gPT0gMHhGRikKKyAgICAgICAgICAgICpwKysgPSAweEZGOworICAgIH0KKyAgICBmb3IgKGMgPSAwOyBjIDwgZmFrZV94YXV0aC5kYXRhX2xlbmd0aDsgYysrKSB7CisgICAgICAgICpwKysgPSBmYWtlX3hhdXRoLmRhdGFbY107CisgICAgICAgIGlmICgodW5zaWduZWQgY2hhcilmYWtlX3hhdXRoLmRhdGFbY10gPT0gMHhGRikKKyAgICAgICAgICAgICpwKysgPSAweEZGOworICAgIH0KKyAgICBzcHJpbnRmKHAsICIlYyVjIiwgSUFDLCBTRSk7CisgICAgcCArPSAyOworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgc3ByaW50Zihmd2R4X21zZ19vdXQsIlRFTE5FVCBTRU5UIFNCICVzIE9QVElPTl9EQVRBIFhBVVRIICIsCisgICAgICAgICAgICAgICAgIFRFTE9QVChURUxPUFRfRk9SV0FSRF9YKSk7CisgICAgICAgIHRuX2hleChmd2R4X21zZ19vdXQsVE5fTVNHX0xFTiwmc2JfcHJpdls1XSwocC1zYl9wcml2KS03KTsKKyAgICAgICAgY2tzdHJuY2F0KGZ3ZHhfbXNnX291dCwiIElBQyBTRSIsVE5fTVNHX0xFTik7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyAgICAvKiBBZGQgVGVsbmV0IERlYnVnIGluZm8gaGVyZSAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLGZ3ZHhfbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcoZndkeF9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKCB0dG9sKHNiX3ByaXYscC1zYl9wcml2KSA8IDAgKTsgICAgICAgICAgICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykgeworICAgICAgICBkZWJ1ZyhGMTEwLCJmd2R4X3NlbmRfeGF1dGgoKSIsInR0b2woKSBmYWlsZWQiLDApOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworCisgICAgZnJlZShzYl9wcml2KTsKKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2lmZGVmIEZXRFhfU0VSVkVSCisvKiBPbmx5IGlmIHdlIGV2ZXIgYmVjb21lIGEgc2VydmVyIC0gbm90IHlldCBwb3J0ZWQgdG8gS2VybWl0ICAgKi8KKy8qIEFuZCBldmVuIHNvIG1vc3Qgb2YgdGhpcyBjb2RlIGRvZXMgbm90IGJlbG9uZyBpbiB0aGlzIG1vZHVsZSAqLworCitpbnQKK2Z3ZHhfd3JpdGVfeGF1dGhmaWxlKHZvaWQpCit7CisgICAgaW50IGRweW51bSwgc2NybnVtLCBmYW1pbHk7CisgICAgY2hhciBteWhvc3RbMzAwXSwgKmhvc3QsICpyZXN0ID0gTlVMTDsKKyAgICBGSUxFICpmaWxlOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKKyAgICBzdHJ1Y3QgaG9zdGVudCAqaGk7CisKKyAgICBpZiAoIWZ3ZHhfZGlzcGxheSAmJiAhZndkeF94YXV0aGZpbGUpCisgICAgICAgIHJldHVybiAxOworICAgIGlmICghcGFyc2VfZGlzcGxheW5hbWUoZndkeF9kaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhbWlseSwgJmhvc3QsICZkcHludW0sICZzY3JudW0sICZyZXN0KSkKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKHJlc3QpIGZyZWUocmVzdCk7CisgICAgaWYgKGhvc3QpIGZyZWUoaG9zdCk7CisgICAgaWYgKGZhbWlseSAhPSBGYW1pbHlJbnRlcm5ldCkKKyAgICAgICAgcmV0dXJuIDM7IC8qIGV2ZXJ5IHRoaW5nIGJ1dCBGYW1pbHlJbnRlcm5ldCBpcyB1bmV4cGVjdGVkICovCisKKyAgICAvKiBYIGNvbm5lY3Rpb25zIHRvIGxvY2FsaG9zdDoxIGlzIGFjdHVhbGx5IHRyZWF0ZWQgYXMgbG9jYWwgdW5peCBzb2NrZXRzLAorICAgICAqIHNlZSB0aGUgJ3hhdXRoJyBtYW4gcGFnZS4KKyAgICAgKi8KKyAgICB4YXV0aC5mYW1pbHkgPSBGYW1pbHlMb2NhbDsKKyAgICBpZiAoZ2V0aG9zdG5hbWUobXlob3N0LCBzaXplb2YobXlob3N0KSAtIDEpKQorICAgICAgICByZXR1cm4gNTsKKyAgICB4YXV0aC5hZGRyZXNzX2xlbmd0aCA9IHN0cmxlbihteWhvc3QpOworICAgIGlmICghKHhhdXRoLmFkZHJlc3MgPSBtYWxsb2MoeGF1dGguYWRkcmVzc19sZW5ndGgpKSkKKyAgICAgICAgcmV0dXJuIDU7CisgICAgbWVtY3B5KHhhdXRoLmFkZHJlc3MsIG15aG9zdCwgeGF1dGguYWRkcmVzc19sZW5ndGgpOworCisgICAgLyogdGhlIGRpc3BsYXkgbnVtYmVyIGlzIHdyaXR0ZW4gYXMgYSBzdHJpbmcsIG5vdCBudW1lcmljICovCisgICAgaWYgKCEoeGF1dGgubnVtYmVyID0gbWFsbG9jKDYpKSkKKyAgICAgICAgcmV0dXJuIDY7CisgICAgc25wcmludGYoeGF1dGgubnVtYmVyLCA1LCAiJXUiLCBkcHludW0pOworICAgIHhhdXRoLm51bWJlcl9sZW5ndGggPSBzdHJsZW4oeGF1dGgubnVtYmVyKTsKKyAgICBpZiAoIShmaWxlID0gZm9wZW4oZndkeF94YXV0aGZpbGUsICJ3YiIpKSkKKyAgICAgICAgcmV0dXJuIDc7CisgICAgaWYgKCFYYXVXcml0ZUF1dGgoZmlsZSwgJnhhdXRoKSkKKyAgICAgICAgcmV0dXJuIDg7CisgICAgZmNsb3NlKGZpbGUpOworICAgIHNldGVudigiWEFVVEhPUklUWSIsIGZ3ZHhfeGF1dGhmaWxlLCAxKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50Citmd2R4X3NldHVwX3hhdXRoKHVuc2lnbmVkIGNoYXIgKnNwLCBpbnQgbGVuKQorLyogY2FsbGVkIHdpdGggJ2xlbicgeGF1dGggYnl0ZXMsIHN0YXJ0aW5nIGF0ICdzcCcKKyAqIHRoZSBkYXRhIGZvcm1hdCBpczogPHVpbnQxNiBuYW1lX2xlbmd0aD4gPHVpbnQxNiBkYXRhX2xlbmd0aD4gPG5hbWU+IDxkYXRhPgorICovCit7CisgICAgaW50IHhhdXRoZmQ7CisKKyAgICBpZiAoIWZ3ZHhfb3B0aW9uc1tGV0RYX09QVF9YQVVUSF0pCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChsZW4gPCA0KQorICAgICAgICByZXR1cm4gMjsKKworICAgIC8qIHNldHVwIHRoZSB4YXV0aCBzdHJ1Y3QgKi8KKyAgICB4YXV0aC5uYW1lX2xlbmd0aCA9IChzcFswXSA8PCA4KSArIHNwWzFdOworICAgIHhhdXRoLmRhdGFfbGVuZ3RoID0gKHNwWzJdIDw8IDgpICsgc3BbM107CisgICAgaWYgKGxlbiAhPSA0ICsgeGF1dGgubmFtZV9sZW5ndGggKyB4YXV0aC5kYXRhX2xlbmd0aCkKKyAgICAgICAgcmV0dXJuIDM7CisgICAgeGF1dGgubmFtZSA9IG1hbGxvYyh4YXV0aC5uYW1lX2xlbmd0aCk7CisgICAgeGF1dGguZGF0YSA9IG1hbGxvYyh4YXV0aC5kYXRhX2xlbmd0aCk7CisgICAgaWYgKCF4YXV0aC5uYW1lIHx8ICF4YXV0aC5kYXRhKQorICAgICAgICByZXR1cm4gNDsKKyAgICBtZW1jcHkoeGF1dGgubmFtZSwgc3AgKyA0LCB4YXV0aC5uYW1lX2xlbmd0aCk7CisgICAgbWVtY3B5KHhhdXRoLmRhdGEsIHNwICsgNCArIHhhdXRoLm5hbWVfbGVuZ3RoLCB4YXV0aC5kYXRhX2xlbmd0aCk7CisKKyAgICAvKiBTZXR1cCB0byBhbHdheXMgaGF2ZSBhIGxvY2FsIC5YYXV0aG9yaXR5LiAqLworICAgIGZ3ZHhfeGF1dGhmaWxlID0gbWFsbG9jKE1BWFBBVEhMRU4rMSk7CisgICAgc25wcmludGYoZndkeF94YXV0aGZpbGUsIE1BWFBBVEhMRU4sICIvdG1wL1hhdXRoWFhYWFhYIik7CisgICAgaWYgKCh4YXV0aGZkID0gbWtzdGVtcChmd2R4X3hhdXRoZmlsZSkpICE9IC0xKQorICAgICAgICAvKiB3ZSBjaGFuZ2UgZmlsZSBvd25lcnNoaXAgbGF0ZXIsIHdoZW4gd2Uga25vdyB3aG8gaXMgdG8gYmUgb3duZXIhICovCisgICAgICAgIGNsb3NlKHhhdXRoZmQpOworICAgIGVsc2UgeworICAgICAgICBmcmVlKGZ3ZHhfeGF1dGhmaWxlKTsKKyAgICAgICAgZndkeF94YXV0aGZpbGUgPSBOVUxMOworICAgICAgICByZXR1cm4gNTsKKyAgICB9CisvKiBNdXN0IGhhdmUgdGhlIHN1YnNoZWxsJ3MgbmV3IERJU1BMQVkgZW52IHZhciB0byB3cml0ZSB4YXV0aCB0byB4YXV0aGZpbGUgKi8KKyAgICBpZiAoZndkeF9kaXNwbGF5KQorICAgICAgICBpZiAoZndkeF93cml0ZV94YXV0aGZpbGUoKSkKKyAgICAgICAgICAgIHJldHVybiA2OworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZndkeF9zZXRfeGF1dGhmaWxlX293bmVyKGludCB1aWQpCit7CisgICAgc3RydWN0IHBhc3N3ZCAqcHdkOworCisgICAgaWYgKCFmd2R4X3hhdXRoZmlsZSB8fCAhKHB3ZCA9IGdldHB3dWlkKHVpZCkpKQorICAgICAgICByZXR1cm47CisgICAgY2hvd24oZndkeF94YXV0aGZpbGUsIHB3ZC0+cHdfdWlkLCBwd2QtPnB3X2dpZCk7Cit9CisKK2ludAorZndkeF9zZXJ2ZXJfYWNjZXB0X29wdGlvbnModW5zaWduZWQgY2hhciAqc3AsIGludCBsZW4pCisvKiBjYWxsZWQgd2l0aCAnbGVuJyBvcHRpb24gYnl0ZXMsIHN0YXJ0aW5nIGF0ICdzcCcgKi8KK3sKKyAgICBpbnQgYzsKKworICAgIGZvciAoYyA9IDA7IGMgPCBsZW4tMjsgYysrKSB7CisgICAgICAgIGlmIChjID09IDApIHsKKyAgICAgICAgICAgIGlmIChzcFtjXSAmIEZXRFhfT1BUX1hBVVRIKQorICAgICAgICAgICAgICAgIGZsYWcgPSAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBGV0RYX1NFUlZFUiAqLworI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworCisjaWZkZWYgSUtTX09QVElPTgorLyoKKyAgaWtzX3dhaXQoKSAtLSBXYWl0IGZvciBhbiBJS1Mgc3VibmVnb3RpYXRpb24gcmVzcG9uc2UuCisgIHNiIC0gaXMgZWl0aGVyIEtFUk1JVF9SRVFfU1RBUlQgb3IgS0VSTUlUX1JFUV9TVE9QIGRlcGVuZGluZyBvbiB0aGUgZGVzaXJlZAorICAgICAgIHN0YXRlIG9mIHRoZSBwZWVyJ3MgS2VybWl0IHNlcnZlci4KKyAgZmx1c2hvayAtIHNwZWNpZmllcyB3aGV0aGVyIGl0IGlzIG9rIHRvIHRocm93IGF3YXkgbm9uLVRlbG5ldCBkYXRhCisgICAgICAgaWYgc28sIHRoZW4gd2UgY2FsbCB0dGZsdWkoKSBpbnN0ZWFkIG9mIHRuX2ZsdWkoKS4KKyAgUmV0dXJuczoKKyAgIDEgaWYgdGhlIGRlc2lyZWQgc3RhdGUgaXMgYWNoaWV2ZWQgb3IgaWYgaXQgaXMgdW5rbm93bi4KKyAgIDAgaWYgdGhlIGRlc2lyZWQgc3RhdGUgaXMgbm90IGFjaGlldmVkLgorKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCitpa3Nfd2FpdChpbnQgc2IsIGludCBmbHVzaG9rKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2lrc193YWl0KHNiLGZsdXNob2spIGludCBzYjsgaW50IGZsdXNob2s7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpbnQgdG5fd2FpdF9zYXZlID0gdG5fd2FpdF9mbGc7CisgICAgaW50IHg7CisKKyAgICBpZiAoVEVMT1BUX1UoVEVMT1BUX0tFUk1JVCkpIHsKKyAgICAgICAgc3dpdGNoIChzYikgeworICAgICAgICAgIGNhc2UgS0VSTUlUX1JFUV9TVEFSVDoKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsCisgICAgICAgICAgICAgICAgICAiaWtzX3dhaXQgS0VSTUlUX1JFUV9TVEFSVCIsCisgICAgICAgICAgICAgICAgICAidV9zdGFydCIsCisgICAgICAgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQKKyAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB0bl9zaWtzKEtFUk1JVF9SRVFfU1RBUlQpOworICAgICAgICAgICAgdG5fd2FpdF9mbGcgPSAxOyAgICAgICAgICAgIC8qIEtlcm1pdCBPcHRpb24gTVVTVCB3YWl0ICovCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKGZsdXNob2spCisgICAgICAgICAgICAgICAgICB0bl93YWl0X2lkeCA9IDA7CisgICAgICAgICAgICAgICAgeCA9IHRuX3dhaXQoImlrc193YWl0KCkgbWVfaWtzX3JlcV9zdGFydCIpOworICAgICAgICAgICAgfSB3aGlsZSAoeCA9PSAwICYmIGZsdXNob2sgJiYgdG5fd2FpdF9pZHggPT0gVE5fV0FJVF9CVUZfU1opOworICAgICAgICAgICAgdG5fd2FpdF9mbGcgPSB0bl93YWl0X3NhdmU7CisgICAgICAgICAgICBpZiAoZmx1c2hvaykKKyAgICAgICAgICAgICAgdG5fd2FpdF9pZHggPSAwOworICAgICAgICAgICAgaWYgKHRuX3dhaXRfaWR4ID09IFROX1dBSVRfQlVGX1NaKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXZSBhcmUgYXR0ZW1wdGluZyB0byBzdGFydCBhIGtlcm1pdCBzZXJ2ZXIgb24gdGhlIHBlZXIKKyAgICAgICAgICAgICAgICAgKiB0aGUgbW9zdCBsaWtlbHkgcmVhc29uIGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBwZXJmb3JtIGEKKyAgICAgICAgICAgICAgICAgKiBmaWxlIHRyYW5zZmVyLiAgQnV0IHRoZXJlIGlzIGEgaHVnZSBhbW91bnQgb2Ygbm9uIHRlbG5ldAorICAgICAgICAgICAgICAgICAqIG5lZ290aWF0aW9uIGRhdGEgY29taW5nIGluIGFuZCBzbyB3ZSBoYXZlIG5vdCBiZWVuIGFibGUKKyAgICAgICAgICAgICAgICAgKiB0byBmaW5kIHRoZSByZXNwb25zZS4gIFNvIHdlIHdpbGwgbGllIGFuZCBhc3N1bWUgdGhhdAorICAgICAgICAgICAgICAgICAqIHJlc3BvbnNlIGlzICd5ZXMnLiAgVGhlIHdvcnNlIHRoYXQgd2lsbCBoYXBwZW4gaXMgdGhhdAorICAgICAgICAgICAgICAgICAqIGEgUkVTUF9TVE9QIGlzIHJlY2VpdmVkIGFmdGVyIHdlIGVudGVyIHByb3RvY29sIG1vZGUuCisgICAgICAgICAgICAgICAgICogQW5kIHRoZSBwcm90b2NvbCBvcGVyYXRpb24gd2lsbCBiZSBjYW5jZWxlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB0bl9wdXNoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bl9wdXNoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQudV9zdGFydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBLRVJNSVRfUkVRX1NUT1A6CisgICAgICAgICAgICBkZWJ1ZyhGMTExLAorICAgICAgICAgICAgICAgICAgImlrc193YWl0IEtFUk1JVF9SRVFfU1RPUCIsCisgICAgICAgICAgICAgICAgICAidV9zdGFydCIsCisgICAgICAgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQKKyAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB0bl9zaWtzKEtFUk1JVF9SRVFfU1RPUCk7CisgICAgICAgICAgICB0bl93YWl0X2ZsZyA9IDE7ICAgICAgICAgICAgLyogS2VybWl0IE9wdGlvbiBNVVNUIHdhaXQgKi8KKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpZiAoZmx1c2hvaykKKyAgICAgICAgICAgICAgICAgIHRuX3dhaXRfaWR4ID0gMDsKKyAgICAgICAgICAgICAgICB4ID0gdG5fd2FpdCgiaWtzX3dhaXQoKSBtZV9pa3NfcmVxX3N0b3AiKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHggPT0gMCAmJiBmbHVzaG9rICYmIHRuX3dhaXRfaWR4ID09IFROX1dBSVRfQlVGX1NaKTsKKyAgICAgICAgICAgIHRuX3dhaXRfZmxnID0gdG5fd2FpdF9zYXZlOworICAgICAgICAgICAgaWYgKGZsdXNob2spCisgICAgICAgICAgICAgIHRuX3dhaXRfaWR4ID0gMDsKKworICAgICAgICAgICAgaWYgKHRuX3dhaXRfaWR4ID09IFROX1dBSVRfQlVGX1NaKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXZSBhcmUgYXR0ZW1wdGluZyB0byBzdG9wIGEga2VybWl0IHNlcnZlciBvbiB0aGUgcGVlcgorICAgICAgICAgICAgICAgICAqIHRoZSBtb3N0IGxpa2VseSByZWFzb24gYmVpbmcgdGhhdCB3ZSB3YW50IHRvIGVudGVyCisgICAgICAgICAgICAgICAgICogQ09OTkVDVCBtb2RlLiAgQnV0IHRoZXJlIGlzIGEgaHVnZSBhbW91bnQgb2Ygbm9uIHRlbG5ldAorICAgICAgICAgICAgICAgICAqIG5lZ290aWF0aW9uIGRhdGEgY29taW5nIGluIGFuZCBzbyB3ZSBoYXZlIG5vdCBiZWVuIGFibGUKKyAgICAgICAgICAgICAgICAgKiB0byBmaW5kIHRoZSByZXNwb25zZS4gIFNvIHdlIHdpbGwgbGllIGFuZCBhc3N1bWUgdGhhdAorICAgICAgICAgICAgICAgICAqIHRoZSBhbnN3ZXIgaXMgJ3llcycgYW5kIGFsbG93IHRoZSBDT05ORUNUIGNvbW1hbmQgdG8KKyAgICAgICAgICAgICAgICAgKiBzdWNjZWVkLiAgVGhlIHdvcnN0IHRoYXQgaGFwcGVucyBpcyB0aGF0IENPTk5FQ1QgbW9kZQorICAgICAgICAgICAgICAgICAqIHN3YWxsb3dzIHRoZSBpbmNvbWluZyBkYXRhIGRpc3BsYXlpbmcgaXQgdG8gdGhlIHVzZXIKKyAgICAgICAgICAgICAgICAgKiBhbmQgdGhlbiBpdCByZXN1bWVzIEtlcm1pdCBjbGllbnQgbW9kZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB0bl9wdXNoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bl9wdXNoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKCFURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRuX3B1c2goKTsKKyAgICB9CisgICAgcmV0dXJuKDEpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworaWtzX3RuX3NiKENIQVIgKiBzYiwgaW50IG4pCisjZWxzZQoraWtzX3RuX3NiKHNiLCBuKSBDSEFSICogc2I7IGludCBuOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgZXh0ZXJuIGludCBzZXJ2ZXI7CisgICAgZXh0ZXJuIENIQVIgc3N0YXRlOworI2lmZGVmIE5PSUNQCisgICAgZXh0ZXJuIGludCBhdXRvZGw7CisgICAgaW50IGluYXV0b2RsID0gMCwgY21kYWRsID0gMTsKKyNlbHNlCisjaWZkZWYgQ0tfQVVUT0RMCisgICAgZXh0ZXJuIGludCBhdXRvZGwsIGluYXV0b2RsLCBjbWRhZGw7CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKyAgICBzd2l0Y2ggKHNiWzBdKSB7CisgICAgICBjYXNlIEtFUk1JVF9TVEFSVDogICAgICAgICAgICAgICAgLyogU1RBUlQgKi8KKyAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC51X3N0YXJ0ID0gMTsKKyAgICAgICAgcmV0dXJuKDQpOworCisgICAgICBjYXNlIEtFUk1JVF9TVE9QOiAgICAgICAgICAgICAgICAgLyogU1RPUCAqLworICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQgPSAwOworICAgICAgICByZXR1cm4oNCk7CisKKyAgICAgIGNhc2UgS0VSTUlUX1JFUV9TVEFSVDogICAgICAgICAgICAvKiBSRVEtU1RBUlQgKi8KKyNpZm5kZWYgTk9YRkVSCisgICAgICAgIGlmIChpbnNlcnZlcikgeworI2lmZGVmIENLX0FVVE9ETAorICAgICAgICAgICAgY21kYWRsID0gMTsgICAgICAgICAgICAgICAgIC8qIFR1cm4gb24gcGFja2V0IGRldGVjdGlvbiAqLworI2VuZGlmIC8qIENLX0FVVE9ETCAqLworICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9zdGFydCA9IDE7CisgICAgICAgICAgICB0bl9zaWtzKEtFUk1JVF9SRVNQX1NUQVJUKTsKKyAgICAgICAgfSBlbHNlIGlmIChURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0KSB7CisgICAgICAgICAgICB0bl9zaWtzKEtFUk1JVF9SRVNQX1NUQVJUKTsKKyAgICAgICAgfSBlbHNlIHsKKyNpZm5kZWYgSUtTRE9OTFkKKyNpZmRlZiBDS19BVVRPREwKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGlmIChsb2NhbCAmJiAoSXNDb25uZWN0TW9kZSgpICYmIGF1dG9kbCkgfHwKKyAgICAgICAgICAgICAgICAoIUlzQ29ubmVjdE1vZGUoKSAmJiAKKyAgICAgICAgICAgICAgICAgIChpbmF1dG9kbCB8fCBzc3RhdGUgPT0gJ3gnIHx8IHNzdGF0ZSA9PSAndicpKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgdG5fc2lrcyhLRVJNSVRfUkVTUF9TVEFSVCk7IC8qIFNUQVJUICovCisgICAgICAgICAgICBlbHNlCisKKyNlbHNlIC8qIE9TMiAqLworICAgICAgICAgICAgaWYgKChsb2NhbCAmJiB3aGF0ID09IFdfQ09OTkVDVCAmJiBhdXRvZGwpIHx8CisgICAgICAgICAgICAgICAgKGxvY2FsICYmIHdoYXQgIT0gV19DT05ORUNUICYmCisgICAgICAgICAgICAgICAgICAoaW5hdXRvZGwgfHwgc3N0YXRlID09ICd4JyB8fCBzc3RhdGUgPT0gJ3YnKQorICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAgIHRuX3Npa3MoS0VSTUlUX1JFU1BfU1RBUlQpOyAvKiBTVEFSVCAqLworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIENLX0FVVE9ETCAqLworI2VuZGlmIC8qIElLU0RPTkxZICovCisgICAgICAgICAgICAgIHRuX3Npa3MoS0VSTUlUX1JFU1BfU1RPUCk7CisgICAgICAgIH0KKyNlbHNlIC8qIE5PWEZFUiAqLworICAgICAgICAgIHRuX3Npa3MoS0VSTUlUX1JFU1BfU1RPUCk7CisjZW5kaWYgLyogTk9YRkVSICovCisgICAgICAgIHJldHVybig0KTsKKworICAgICAgY2FzZSBLRVJNSVRfUkVRX1NUT1A6ICAgICAgICAgICAgIC8qIFJFUS1TVE9QICovCisgICAgICAgIC8qIFRoZSBwcm90b2NvbCByZXF1aXJlcyB0aGF0IHRoZSByZXF1ZXN0IGJlIHJlc3BvbmRlZCB0byAqLworICAgICAgICAvKiBlaXRoZXIgYnkgY2hhbmdpbmcgc3RhdGVzIG9yIGJ5IHJlcG9ydGluZyB0aGUgY3VycmVudCAgKi8KKyAgICAgICAgLyogc3RhdGUuICAqLworCisgICAgICAgIC8qIFdlIG5lZWQgdG8gcHJvdmlkZSB0aGUgdXNlciBzb21lIHdheSBvZiBkaWN0YXRpbmcgd2hhdCAqLworICAgICAgICAvKiB0aGUgcG9saWNpZXMgc2hvdWxkIGJlLiAgRm9yIGluc3RhbmNlLCBpZiB3ZSBhcmUgaW4gICAgKi8KKyAgICAgICAgLyogQ09OTkVDVCBtb2RlIHdpdGggYXV0b2Rvd25sb2FkIE9OIGFuZCB3ZSBnZXQgYSBSRVEtU1RPUCovCisgICAgICAgIC8qIHdoYXQgc2hvdWxkIHRoZSBwcm9wZXIgcmVzcG9uc2UgYmU/ICAgICAgICAgICAgICAgICAgICAqLworI2lmbmRlZiBOT1hGRVIKKyAgICAgICAgaWYgKGluc2VydmVyCisjaWZkZWYgQ0tfQVVUT0RMCisgICAgICAgICAgICB8fCAhbG9jYWwgJiYgY21kYWRsCisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisgICAgICAgICAgICApIHsKKyNpZmRlZiBDS19BVVRPREwKKyAgICAgICAgICAgIGNtZGFkbCA9IDA7ICAgICAgICAgICAgICAgICAvKiBUdXJuIG9mZiBwYWNrZXQgZGV0ZWN0aW9uICovCisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisgICAgICAgICAgICB0bl9zaWtzKEtFUk1JVF9SRVNQX1NUT1ApOworICAgICAgICB9IGVsc2UgaWYgKHNlcnZlcikgeworICAgICAgICAgICAgZXh0ZXJuIGludCBlbl9maW47CisgICAgICAgICAgICBpZiAoZW5fZmluKSB7ICAgICAgICAgICAgICAgLyogSWYgdGhlIHNlcnZlciBpcyBhbGxvd2VkIHRvIHN0b3AgKi8KKyAgICAgICAgICAgICAgICB0bl9zaWtzKEtFUk1JVF9SRVNQX1NUT1ApOworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIFdlIGFyZSBub3QgYWxsb3dlZCB0byBzdG9wICovCisgICAgICAgICAgICAgICAgdG5fc2lrcyhLRVJNSVRfUkVTUF9TVEFSVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZm5kZWYgSUtTRE9OTFkKKyNpZmRlZiBDS19BVVRPREwKKyNpZmRlZiBPUzIKKyAgICAgICAgZWxzZSBpZiAobG9jYWwgJiYgKElzQ29ubmVjdE1vZGUoKSAmJiBhdXRvZGwpIHx8CisgICAgICAgICAgICAgICAgICAgKCFJc0Nvbm5lY3RNb2RlKCkgJiYgaW5hdXRvZGwpCisgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgYSBwc2V1ZG8tc2VydmVyIGFuZCB0aGUgb3RoZXIgc2lkZSByZXF1ZXN0cyAqLworICAgICAgICAgICAgLyogdGhhdCB3ZSBzdG9wLCB0ZWxsIHRoZW4gdGhhdCB3ZSBoYXZlIGV2ZW4gdGhvdWdoIHdlICAgKi8KKyAgICAgICAgICAgIC8qIGhhdmUgbm90LiAgT3RoZXJ3aXNlLCB0aGUgb3RoZXIgc2lkZSBtaWdodCByZWZ1c2UgdG8gICovCisgICAgICAgICAgICAvKiBlbnRlciBTRVJWRVIgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICB0bl9zaWtzKEtFUk1JVF9SRVNQX1NUT1ApOyAgLyogU1RPUCAqLworICAgICAgICB9CisjZWxzZSAvKiBPUzIgKi8KKyAgICAgICAgZWxzZSBpZiAoKGxvY2FsICYmIHdoYXQgPT0gV19DT05ORUNUICYmIGF1dG9kbCkgfHwKKyAgICAgICAgICAgICAgICAgICAobG9jYWwgJiYgd2hhdCAhPSBXX0NPTk5FQ1QgJiYgaW5hdXRvZGwpCisgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgYSBwc2V1ZG8tc2VydmVyIGFuZCB0aGUgb3RoZXIgc2lkZSByZXF1ZXN0cyAqLworICAgICAgICAgICAgLyogdGhhdCB3ZSBzdG9wLCB0ZWxsIHRoZW4gdGhhdCB3ZSBoYXZlIGV2ZW4gdGhvdWdoIHdlICAgKi8KKyAgICAgICAgICAgIC8qIGhhdmUgbm90LiAgT3RoZXJ3aXNlLCB0aGUgb3RoZXIgc2lkZSBtaWdodCByZWZ1c2UgdG8gICovCisgICAgICAgICAgICAvKiBlbnRlciBTRVJWRVIgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICB0bl9zaWtzKEtFUk1JVF9SRVNQX1NUT1ApOyAgLyogU1RPUCAqLworICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisjZW5kaWYgLyogSUtTRE9OTFkgKi8KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIE5PWEZFUiAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgbm90IGN1cnJlbnRseSBpbiBhbnkgbW9kZSB0aGF0IGFjY2VwdHMgKi8KKyAgICAgICAgICAgIC8qIEtlcm1pdCBwYWNrZXRzIHRoZW4gb2YgY291cnNlIHJlcG9ydCB0aGF0IHdlIGFyZSAqLworICAgICAgICAgICAgLyogbm90IGJlaW5nIGEgS2VybWl0IHNlcnZlci4gICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHRuX3Npa3MoS0VSTUlUX1JFU1BfU1RPUCk7ICAvKiBTVE9QICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKDQpOworCisgICAgICBjYXNlIEtFUk1JVF9TT1A6IHsgICAgICAgICAgICAgICAgLyogU09QICovCisjaWZuZGVmIE5PWEZFUgorICAgICAgICAgIGV4dGVybiBDSEFSIHN0Y2hyOyAgICAgICAgICAgIC8qIEluY29taW5nIFNPUCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICBzdGNociA9IHNiWzFdOworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQuc29wID0gMTsKKyAgICAgICAgICByZXR1cm4oNCk7CisgICAgICB9CisKKyAgICAgIGNhc2UgS0VSTUlUX1JFU1BfU1RBUlQ6ICAgICAgICAgICAvKiBTVEFSVCAqLworICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQgPSAxOworICAgICAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9yZXFfc3RhcnQpIHsKKyAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfcmVxX3N0YXJ0ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3JlcV9zdG9wKSB7CisgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGlzc3VlZCBhIHJlcXVlc3QgdG8gc3RvcCBhIEtlcm1pdCBTZXJ2ZXIgKi8KKyAgICAgICAgICAgIC8qIGFuZCB0aGUgcmVzcG9uc2UgaXMgU3RhcnQsIHRoZW4gd2UgbXVzdCByZXBvcnQgdGhpcyAqLworICAgICAgICAgICAgLyogdG8gdGhlIGNhbGxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3JlcV9zdG9wID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oNCk7CisKKyAgICAgIGNhc2UgS0VSTUlUX1JFU1BfU1RPUDogICAgICAgICAgICAvKiBTVE9QICovCisgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQudV9zdGFydCA9IDA7CisgICAgICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3JlcV9zdGFydCkgeworICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9yZXFfc3RhcnQgPSAwOworICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBpc3N1ZWQgYSByZXF1ZXN0IHRvIHN0YXJ0IGEgS2VybWl0IFNlcnZlciAqLworICAgICAgICAgICAgLyogYW5kIHRoZSByZXNwb25zZSBpcyBTdG9wLCB0aGVuIHdlIG11c3QgcmVwb3J0IHRoaXMgICAqLworICAgICAgICAgICAgLyogdG8gdGhlIGNhbGxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICB9IGVsc2UgaWYgKFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfcmVxX3N0b3ApIHsKKyAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfcmVxX3N0b3AgPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybig0KTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgfSAvKiBzd2l0Y2ggKHNiWzBdKSAqLworfQorI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKworLyogSW5pdGlhbGl6ZSB0ZWxuZXQgc2V0dGluZ3MgLSBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIE1FIGFuZCBVIG1vZGVzICovCitpbnQKK3RuX3NldF9tb2RlcygpIHsKKyAgICBpbnQgb3B0LGNtZDsKKyNpZmRlZiBDS19GT1JXQVJEX1gKKyAgICBpbnQgeDsKKyNlbmRpZiAvKiBDS19GT1JXQVJEX1ggKi8KKyNpZmRlZiBDS19FTlZJUk9OTUVOVAorICAgIHsKKyAgICAgICAgaW50IGksajsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgdG5fZW52X3VzZXJ2YXJbaV1bMF0gPSBOVUxMOworICAgICAgICAgICAgdG5fZW52X3VzZXJ2YXJbaV1bMV0gPSBOVUxMOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisKKyAgICAvKiBpbml0aWFsaXplIGFsbCBvcHRpb25zIHRvIHJlZnVzZSBpbiBib3RoIGRpcmVjdGlvbnMgKi8KKyAgICBmb3IgKG9wdCA9IDA7IG9wdCA8IE5URUxPUFRTOyBvcHQrKykgeworICAgICAgICBURUxPUFRfTUUob3B0KSA9IDA7CisgICAgICAgIFRFTE9QVF9VKG9wdCkgID0gMDsKKyAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfV0lMTChvcHQpID0gMDsKKyAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE8ob3B0KSAgID0gMDsKKyAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfV09OVChvcHQpID0gMDsKKyAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE9OVChvcHQpICAgPSAwOworICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9TQihvcHQpICAgPSAwOworICAgICAgICBURUxPUFRfTUVfTU9ERShvcHQpID0gVE5fTkdfUkY7CisgICAgICAgIFRFTE9QVF9VX01PREUob3B0KSA9IFROX05HX1JGOworICAgICAgICBURUxPUFRfREVGX1NfTUVfTU9ERShvcHQpID0gVE5fTkdfUkY7CisgICAgICAgIFRFTE9QVF9ERUZfU19VX01PREUob3B0KSA9IFROX05HX1JGOworICAgICAgICBURUxPUFRfREVGX0NfTUVfTU9ERShvcHQpID0gVE5fTkdfUkY7CisgICAgICAgIFRFTE9QVF9ERUZfQ19VX01PREUob3B0KSA9IFROX05HX1JGOworICAgICAgICBmb3IgKGNtZCA9IDA7IGNtZCA8IDQ7IGNtZCArKykKKyAgICAgICAgICB0bmNudHNbVEVMT1BUX0lOREVYKG9wdCldW2NtZF0gPSAwOworICAgIH0KKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9zdGFydCA9IDA7CisgICAgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC51X3N0YXJ0ID0gMDsKKyAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3JlcV9zdGFydCA9IDA7CisgICAgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9yZXFfc3RvcCA9IDA7CisgICAgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5zb3AgPSAwOworI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBURUxPUFRfU0IoVEVMT1BUX0VOQ1JZUFRJT04pLmVuY3J5cHQuc3RvcCA9IDA7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworCisjaWZkZWYgIENLX05BV1MKKyAgICBURUxPUFRfU0IoVEVMT1BUX05BV1MpLm5hd3MueCA9IDA7CisgICAgVEVMT1BUX1NCKFRFTE9QVF9OQVdTKS5uYXdzLnkgPSAwOworI2VuZGlmIC8qIENLX05BV1MgKi8KKworI2lmZGVmIENLX1NTTAorICAgIFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMudV9mb2xsb3dzID0gMDsKKyAgICBURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MgPSAwOworICAgIFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMuYXV0aF9yZXF1ZXN0ID0gMDsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIC8qIE5vdyBzZXQgdGhlIG9uZXMgd2Ugd2FudCB0byBhY2NlcHQgdG8gdGhlIHByb3BlciB2YWx1ZXMgKi8KKyAgICBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfU0dBKSA9IFROX05HX1JROworICAgIFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX1NHQSkgPSBUTl9OR19SUTsKKyAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfU0dBKSA9IFROX05HX0FDOworICAgIFRFTE9QVF9ERUZfQ19VX01PREUoVEVMT1BUX1NHQSkgPSBUTl9OR19BQzsKKworICAgIFRFTE9QVF9ERUZfU19NRV9NT0RFKFRFTE9QVF9CSU5BUlkpID0gVE5fTkdfQUM7CisgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfQklOQVJZKSA9IFROX05HX0FDOworICAgIFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9CSU5BUlkpID0gVE5fTkdfQUM7CisgICAgVEVMT1BUX0RFRl9DX1VfTU9ERShURUxPUFRfQklOQVJZKSA9IFROX05HX0FDOworCisgICAgVEVMT1BUX0RFRl9TX01FX01PREUoVEVMT1BUX0xPR09VVCkgPSBUTl9OR19BQzsKKyAgICBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9MT0dPVVQpID0gVE5fTkdfQUM7CisgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0xPR09VVCkgPSBUTl9OR19BQzsKKyAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9MT0dPVVQpID0gVE5fTkdfQUM7CisKKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgVEVMT1BUX0RFRl9TX01FX01PREUoVEVMT1BUX0tFUk1JVCkgPSBUTl9OR19SUTsKKyAgICBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9LRVJNSVQpID0gVE5fTkdfUlE7CisgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0tFUk1JVCkgPSBUTl9OR19SUTsKKyAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9LRVJNSVQpID0gVE5fTkdfUlE7CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUlE7CisgICAgVEVMT1BUX0RFRl9TX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUlE7CisgICAgVEVMT1BUX0RFRl9DX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SUTsKKyAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SUTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisKKyAgICBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfRUNITykgPSBUTl9OR19SUTsKKyNpZmRlZiBJS1NECisgICAgaWYgKCAhaW5zZXJ2ZXIgKQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgIFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX1RUWVBFKSA9IFROX05HX1JROworCisjaWZkZWYgQ0tfRU5WSVJPTk1FTlQKKyAgICBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9ORVdFTlZJUk9OKSA9IFROX05HX1JROworI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgIFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9IFROX05HX1JROworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpKSB7CisgICAgICAgIFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX1NUQVJUX1RMUykgPSBUTl9OR19SUTsKKyAgICAgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX1NUQVJUX1RMUykgPSBUTl9OR19BQzsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyNpZmRlZiBDS19OQVdTCisgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfTkFXUykgPSBUTl9OR19SUTsKKyNlbmRpZiAvKiBDS19OQVdTICovCisKKyAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9FQ0hPKSA9IFROX05HX0FDOworICAgIFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9UVFlQRSkgPSBUTl9OR19SUTsKKworI2lmZGVmIENLX0VOVklST05NRU5UCisgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX05FV0VOVklST04pID0gVE5fTkdfUlE7CisjZW5kaWYgLyogQ0tfRU5WSVJPTk1FTlQgKi8KKworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9IFROX05HX1JROworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisKKyNpZmRlZiBDS19OQVdTCisgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX05BV1MpID0gVE5fTkdfUlE7CisjZW5kaWYgLyogQ0tfTkFXUyAqLworCisjaWZkZWYgQ0tfU05ETE9DCisgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX1NORExPQykgPSBUTl9OR19SUTsKKyNlbmRpZiAvKiBDS19TTkRMT0MgKi8KKworI2lmZGVmIENLX0ZPUldBUkRfWAorICAgIFRFTE9QVF9ERUZfQ19VX01PREUoVEVMT1BUX0ZPUldBUkRfWCkgPSBUTl9OR19BQzsKKyAgICBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94Lmxpc3Rlbl9zb2NrZXQgPSAtMTsKKyAgICBmb3IgKHggPSAwOyB4IDwgTUFYRldEWDsgeCsrKSB7CisgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW3hdLmZkID0gLTE7CisgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW3hdLmlkID0gLTE7CisgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW3hdLm5lZWRfdG9fc2VuZF94YXV0aCA9IDA7CisgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW3hdLnN1c3BlbmQgPSAwOworICAgIH0KKyNlbmRpZiAvKiBDS19GT1JXQVJEX1ggKi8KKworI2lmZGVmIFROX0NPTVBPUlQKKyAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfQ09NUE9SVCkgPSBUTl9OR19SUTsKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWwgdmFsdWVzIGZvciBjdXJyZW50bHkga25vd24gbW9kZSAqLworICAgIGZvciAob3B0ID0gVEVMT1BUX0ZJUlNUOyBvcHQgPD0gVEVMT1BUX0xBU1Q7IG9wdCsrKSB7CisgICAgICAgIGlmIChURUxPUFRfT0sob3B0KSkgeworICAgICAgICAgICAgVEVMT1BUX01FX01PREUob3B0KSA9IHNzdGVsbmV0ID8KKyAgICAgICAgICAgICAgVEVMT1BUX0RFRl9TX01FX01PREUob3B0KSA6CisgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9DX01FX01PREUob3B0KTsKKyAgICAgICAgICAgIFRFTE9QVF9VX01PREUob3B0KSA9IHNzdGVsbmV0ID8KKyAgICAgICAgICAgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShvcHQpIDoKKyAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfVV9NT0RFKG9wdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKDEpOworfQorCisKKy8qIFNlbmQgRGVsYXllZCBTdWJuZWdvdGlhdGlvbnMgKi8KKworVk9JRAordG5fc2RzYigpIHsKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9UVFlQRSkudGVybS5uZWVkX3RvX3NlbmQpIHsKKyAgICAgICAgdG5fc3R0eXAoKTsKKyAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9UVFlQRSkudGVybS5uZWVkX3RvX3NlbmQgPSAwOworICAgIH0KKyNpZmRlZiBDS19FTlZJUk9OTUVOVAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX05FV0VOVklST04pLmVudi5uZWVkX3RvX3NlbmQgJiYKKyAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9ORVdFTlZJUk9OKS5lbnYuc3RyKSB7CisgICAgICAgIHRuX3NuZW52KChDSEFSICopVEVMT1BUX1NCKFRFTE9QVF9ORVdFTlZJUk9OKS5lbnYuc3RyLAorICAgICAgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX05FV0VOVklST04pLmVudi5sZW4pOworICAgICAgICBmcmVlKFRFTE9QVF9TQihURUxPUFRfTkVXRU5WSVJPTikuZW52LnN0cik7CisgICAgICAgIFRFTE9QVF9TQihURUxPUFRfTkVXRU5WSVJPTikuZW52LnN0cj1OVUxMOworICAgICAgICBURUxPUFRfU0IoVEVMT1BUX05FV0VOVklST04pLmVudi5sZW49MDsKKyAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9ORVdFTlZJUk9OKS5lbnYubmVlZF90b19zZW5kID0gMDsKKyAgICB9CisjaWZkZWYgQ0tfWERJU1BMT0MKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9YRElTUExPQykueGRpc3AubmVlZF90b19zZW5kKSB7CisgICAgICAgIHRuX3N4ZGlzcGxvYygpOworICAgICAgICBURUxPUFRfU0IoVEVMT1BUX1hESVNQTE9DKS54ZGlzcC5uZWVkX3RvX3NlbmQgPSAwOworICAgIH0KKyNlbmRpZiAvKiBDS19YRElTUExPQyAqLworI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisjaWZkZWYgQ0tfTkFXUworICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX05BV1MpLm5hd3MubmVlZF90b19zZW5kKSB7CisgICAgICAgIHRuX3NuYXdzKCk7CisgICAgICAgIFRFTE9QVF9TQihURUxPUFRfTkFXUykubmF3cy5uZWVkX3RvX3NlbmQgPSAwOworICAgIH0KKyNlbmRpZiAvKiBDS19OQVdTICovCisjaWZkZWYgQ0tfU05ETE9DCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU05ETE9DKS5zbmRsb2MubmVlZF90b19zZW5kKSB7CisgICAgICAgIHRuX3NuZGxvYygpOworICAgICAgICBURUxPUFRfU0IoVEVMT1BUX1NORExPQykuc25kbG9jLm5lZWRfdG9fc2VuZCA9IDA7CisgICAgfQorI2VuZGlmIC8qIENLX1NORExPQyAqLworI2lmZGVmIENLX0ZPUldBUkRfWAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94Lm5lZWRfdG9fc2VuZCkgeworICAgICAgICBpZiAoIHNzdGVsbmV0ICkKKyAgICAgICAgICAgIGZ3ZHhfc2VuZF9vcHRpb25zKCk7CisgICAgICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3gubmVlZF90b19zZW5kID0gMDsKKyAgICB9CisjZW5kaWYgLyogQ0tfRk9SV0FSRF9YICovCisjaWZkZWYgVE5fQ09NUE9SVAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0NPTVBPUlQpLmNvbXBvcnQubmVlZF90b19zZW5kKSB7CisgICAgICAgIHRuX3NuZGNvbXBvcnQoKTsKKyAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9DT01QT1JUKS5jb21wb3J0Lm5lZWRfdG9fc2VuZCA9IDA7CisgICAgfQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKworfQorCitpbnQKK3RuX3Jlc2V0KCkgeworICAgIGludCB4LG9wdCxjbWQ7CisKKyAgICB0bl93YWl0X2lkeCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgdG5fcHVzaCgpIGJ1ZmZlciAqLworICAgIHRuX3dhaXRfdG1vID0gVE5fVElNRU9VVDsgICAgICAgICAgIC8qIFJlc2V0IHdhaXQgdGltZXIgc3RhdHMgKi8KKworICAgIG5mbGFnID0gMDsKKworICAgIC8qIFJlc2V0IHRoZSBURUxORVQgT1BUSU9OUyBjb3VudHMgKi8KKyAgICBmb3IgKG9wdCA9IFRFTE9QVF9GSVJTVDsgb3B0IDw9IFRFTE9QVF9MQVNUOyBvcHQrKykgeworICAgICAgICBpZiAoVEVMT1BUX09LKG9wdCkpIHsKKyAgICAgICAgICAgIFRFTE9QVF9NRShvcHQpID0gMDsKKyAgICAgICAgICAgIFRFTE9QVF9VKG9wdCkgID0gMDsKKyAgICAgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwob3B0KSA9IDA7CisgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ETyhvcHQpICAgPSAwOworICAgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfV09OVChvcHQpID0gMDsKKyAgICAgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX0RPTlQob3B0KSAgID0gMDsKKyAgICAgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX1NCKG9wdCkgICA9IDA7CisgICAgICAgICAgICBURUxPUFRfTUVfTU9ERShvcHQpID0gc3N0ZWxuZXQgPworICAgICAgICAgICAgICBURUxPUFRfREVGX1NfTUVfTU9ERShvcHQpIDoKKyAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfTUVfTU9ERShvcHQpOworICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShvcHQpID0gc3N0ZWxuZXQgPworICAgICAgICAgICAgICBURUxPUFRfREVGX1NfVV9NT0RFKG9wdCkgOgorICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfQ19VX01PREUob3B0KTsKKworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBpZiAoZGVibG9nKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChURUxPUFRfTUVfTU9ERShvcHQpKSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFROX05HX1JGOgorICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ0bl9pbmkgTUUgUkVGVVNFICIsVEVMT1BUKG9wdCksMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBUTl9OR19BQzoKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwidG5faW5pIE1FIEFDQ0VQVCAiLFRFTE9QVChvcHQpLDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVE5fTkdfUlE6CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInRuX2luaSBNRSBSRVFVRVNUIixURUxPUFQob3B0KSwwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFROX05HX01VOgorICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ0bl9pbmkgTUUgUkVRVUlSRSIsVEVMT1BUKG9wdCksMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKFRFTE9QVF9VX01PREUob3B0KSkgeworICAgICAgICAgICAgICAgICAgY2FzZSBUTl9OR19SRjoKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwidG5faW5pIFUgIFJFRlVTRSAiLFRFTE9QVChvcHQpLDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVE5fTkdfQUM6CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInRuX2luaSBVICBBQ0NFUFQgIixURUxPUFQob3B0KSwwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFROX05HX1JROgorICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ0bl9pbmkgVSAgUkVRVUVTVCIsVEVMT1BUKG9wdCksMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBUTl9OR19NVToKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwidG5faW5pIFUgIFJFUVVJUkUiLFRFTE9QVChvcHQpLDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgICAgIGZvciAoY21kID0gMDsgY21kIDwgNDsgY21kICsrKQorICAgICAgICAgICAgICB0bmNudHNbVEVMT1BUX0lOREVYKG9wdCldW2NtZF0gPSAwOworICAgICAgICB9CisgICAgfQorI2lmZGVmIENLX0VOVklST05NRU5UCisgICAgaWYgKCF0bl9lbnZfZmxnKSB7CisgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9ORVdFTlZJUk9OKSA9IFROX05HX1JGOworICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9ORVdFTlZJUk9OKSA9IFROX05HX1JGOworICAgIH0KKyNlbmRpZiAvKiBDS19FTlZJUk9OTUVOVCAqLworI2lmZGVmIENLX1NORExPQworICAgIGlmICghdG5fbG9jKQorICAgICAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfU05ETE9DKSA9IFROX05HX1JGOworI2VuZGlmIC8qIENLX1NORExPQyAqLworI2lmZGVmIElLU19PUFRJT04KKyAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0ID0gMDsKKyAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQgPSAwOworICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfcmVxX3N0YXJ0ID0gMDsKKyAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3JlcV9zdG9wID0gMDsKKyAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnNvcCA9IDA7CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBURUxPUFRfU0IoVEVMT1BUX0VOQ1JZUFRJT04pLmVuY3J5cHQuc3RvcCA9IDA7CisgICAgVEVMT1BUX1NCKFRFTE9QVF9FTkNSWVBUSU9OKS5lbmNyeXB0Lm5lZWRfdG9fc2VuZCA9IDA7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmICBDS19OQVdTCisgICAgVEVMT1BUX1NCKFRFTE9QVF9OQVdTKS5uYXdzLm5lZWRfdG9fc2VuZCA9IDA7CisgICAgVEVMT1BUX1NCKFRFTE9QVF9OQVdTKS5uYXdzLnggPSAwOworICAgIFRFTE9QVF9TQihURUxPUFRfTkFXUykubmF3cy55ID0gMDsKKyNlbmRpZiAvKiBDS19OQVdTICovCisgICAgVEVMT1BUX1NCKFRFTE9QVF9UVFlQRSkudGVybS5uZWVkX3RvX3NlbmQgPSAwOworICAgIFRFTE9QVF9TQihURUxPUFRfVFRZUEUpLnRlcm0udHlwZVswXSA9ICdcMCc7CisjaWZkZWYgQ0tfRU5WSVJPTk1FTlQKKyAgICBURUxPUFRfU0IoVEVMT1BUX05FV0VOVklST04pLmVudi5uZWVkX3RvX3NlbmQgPSAwOworICAgIGlmICh0bl9maXJzdCkKKyAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9ORVdFTlZJUk9OKS5lbnYuc3RyPU5VTEw7CisgICAgZWxzZSBpZiAoVEVMT1BUX1NCKFRFTE9QVF9ORVdFTlZJUk9OKS5lbnYuc3RyKSB7CisgICAgICAgIGZyZWUoVEVMT1BUX1NCKFRFTE9QVF9ORVdFTlZJUk9OKS5lbnYuc3RyKTsKKyAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9ORVdFTlZJUk9OKS5lbnYuc3RyPU5VTEw7CisgICAgfQorICAgIFRFTE9QVF9TQihURUxPUFRfTkVXRU5WSVJPTikuZW52Lmxlbj0wOworI2lmZGVmIENLX1hESVNQTE9DCisgICAgVEVMT1BUX1NCKFRFTE9QVF9YRElTUExPQykueGRpc3AubmVlZF90b19zZW5kID0gMDsKKyNlbmRpZiAvKiBDS19YRElTUExPQyAqLworI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisjaWZkZWYgQ0tfU05ETE9DCisgICAgVEVMT1BUX1NCKFRFTE9QVF9TTkRMT0MpLnNuZGxvYy5uZWVkX3RvX3NlbmQgPSAwOworI2VuZGlmIC8qIENLX1NORExPQyAqLworI2lmZGVmIENLX0ZPUldBUkRfWAorICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3gubmVlZF90b19zZW5kID0gMDsKKyAgICBURUxPUFRfU0IoVEVMT1BUX0ZPUldBUkRfWCkuZm9yd2FyZF94Lmxpc3Rlbl9zb2NrZXQgPSAtMTsKKyAgICBmb3IgKHggPSAwOyB4IDwgTUFYRldEWDsgeCsrKSB7CisgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW3hdLmZkID0gLTE7CisgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW3hdLmlkID0gLTE7CisgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW3hdLm5lZWRfdG9fc2VuZF94YXV0aCA9IDA7CisgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC5jaGFubmVsW3hdLnN1c3BlbmQgPSAwOworICAgIH0KKyAgICAvKiBSZXNldCBYYXV0aCBkYXRhICovCisgICAgaWYgKCByZWFsX3hhdXRoICkgeworICAgICAgICBYYXVEaXNwb3NlQXV0aChyZWFsX3hhdXRoKTsKKyAgICAgICAgcmVhbF94YXV0aCA9IE5VTEw7CisgICAgfQorICAgIGlmICggZmFrZV94YXV0aC5uYW1lICkKKyAgICAgICAgZnJlZShmYWtlX3hhdXRoLm5hbWUpOworICAgIGlmICggZmFrZV94YXV0aC5kYXRhICkKKyAgICAgICAgZnJlZShmYWtlX3hhdXRoLmRhdGEpOworICAgIGlmICggZmFrZV94YXV0aC5hZGRyZXNzICkKKyAgICAgICAgZnJlZShmYWtlX3hhdXRoLmFkZHJlc3MpOworICAgIGlmICggZmFrZV94YXV0aC5udW1iZXIgKQorICAgICAgICBmcmVlKGZha2VfeGF1dGgubnVtYmVyKTsKKyAgICBtZW1zZXQoJmZha2VfeGF1dGgsMCxzaXplb2YoZmFrZV94YXV0aCkpOworI2lmZGVmIE5UCisgICAgVEVMT1BUX1NCKFRFTE9QVF9GT1JXQVJEX1gpLmZvcndhcmRfeC50aHJlYWRfc3RhcnRlZCA9IDA7CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBDS19GT1JXQVJEX1ggKi8KKyNpZmRlZiBDS19TU0wKKyAgICBpZiAodGxzX29ubHlfZmxhZyB8fCBzc2xfb25seV9mbGFnKSB7CisgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpID0gVE5fTkdfUkY7CisgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX1NUQVJUX1RMUykgPSBUTl9OR19SRjsKKyAgICB9CisgICAgVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy51X2ZvbGxvd3MgPSAwOworICAgIFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cyA9IDA7CisgICAgVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5hdXRoX3JlcXVlc3QgPSAwOworI2VuZGlmIC8qIENLX1NTTCAqLworCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIGlmICghY2tfY3J5cHRfaXNfaW5zdGFsbGVkKCkKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgfHwgdGxzX29ubHlfZmxhZyB8fCBzc2xfb25seV9mbGFnCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICkgeworICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworCisjaWZkZWYgVE5fQ09NUE9SVAorICAgIFRFTE9QVF9TQihURUxPUFRfQ09NUE9SVCkuY29tcG9ydC5uZWVkX3RvX3NlbmQgPSAwOworICAgIFRFTE9QVF9TQihURUxPUFRfQ09NUE9SVCkuY29tcG9ydC53YWl0X2Zvcl9zYiA9IDA7CisgICAgVEVMT1BUX1NCKFRFTE9QVF9DT01QT1JUKS5jb21wb3J0LndhaXRfZm9yX21zID0gMDsKKyAgICB0bmNfaW5pdCgpOworI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKworICAgIHRuX2ZpcnN0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGxvbmdlciB0aGUgZmlyc3QgdGltZSBpbml0ICovCisKKyNpZmRlZiBPUzIKKyAgICB0dG51bSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBUZXJtVHlwZSBuZWdvdGlhdGlvbiAqLworICAgIHR0bnVtZW5kID0gMDsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIHJldHVybigwKTsKK30KKworaW50Cit0bl9zdGFydCgpIHsKKyAgICBpbnQgd2FpdCwgeCwgb3B0OworCisgICAgaWYgKHRuX2luaXQgJiYgdG5fYmVndW4pCisgICAgICAgIHJldHVybigwKTsKKyAgICB0bl9iZWd1biA9IDE7CisKKyAgICBkZWJ1ZyhGMTExLCJ0bl9zdGFydCIsInNzdGVsbmV0Iixzc3RlbG5ldCk7CisgICAgd2FpdCA9IDA7CisgICAgaWYgKHRuX2R1cGxleCkgIHsKKyAgICAgICAgb2xkcGxleCA9IGR1cGxleDsgICAgICAgICAgICAgICAvKiBzYXZlIG9sZCBkdXBsZXggdmFsdWUgKi8KKyAgICAgICAgZHVwbGV4ID0gMTsgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgc2V0IHRvIGhhbGYgZHVwbGV4IGZvciB0ZWxuZXQgKi8KKyAgICB9CisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX1NUQVJUX1RMUykgJiYKKyAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX1NUQVJUX1RMUykgPj0gVE5fTkdfUlEpIHsKKyAgICAgICAgaWYgKHRuX3NvcHQoV0lMTCwgVEVMT1BUX1NUQVJUX1RMUykgPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoVEVMT1BUX1NUQVJUX1RMUykgPSAxOworICAgICAgICB3YWl0ID0gMTsKKyAgICB9CisgICAgaWYgKCFURUxPUFRfVShURUxPUFRfU1RBUlRfVExTKSAmJgorICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpID49IFROX05HX1JRKSB7CisgICAgICAgIGlmICh0bl9zb3B0KERPLCBURUxPUFRfU1RBUlRfVExTKSA8IDApCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE8oVEVMT1BUX1NUQVJUX1RMUykgPSAxOworICAgICAgICB3YWl0ID0gMTsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgIGRlYnVnKEYxMTAsInRuX2luaSgpIENLX0FVVEhFTlRJQ0FUSU9OIiwiIiwwKTsKKyAgICBpZiAodG5faW5pdCkgICAgICAgICAgICAgICAgLyogdG5faW5pKCkgbWlnaHQgYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5ICovCisgICAgICByZXR1cm4oMCk7CisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSAmJgorICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID49IFROX05HX1JRKSB7CisgICAgICAgIGlmICh0bl9zb3B0KFdJTEwsIFRFTE9QVF9BVVRIRU5USUNBVElPTikgPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9IDE7CisgICAgICAgIHdhaXQgPSAxOworICAgIH0KKyAgICBpZiAoIVRFTE9QVF9VKFRFTE9QVF9BVVRIRU5USUNBVElPTikgJiYKKyAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID49IFROX05HX1JRKSB7CisgICAgICAgIGlmICh0bl9zb3B0KERPLCBURUxPUFRfQVVUSEVOVElDQVRJT04pIDwgMCkKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ETyhURUxPUFRfQVVUSEVOVElDQVRJT04pID0gMTsKKyAgICAgICAgd2FpdCA9IDE7CisgICAgfQorI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBpZiAoVEVMT1BUX1VfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID09IFROX05HX1JGICYmCisgICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID09IFROX05HX1JGKSB7CisgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgIH0KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKworI2lmZGVmIENLX05BV1MKKyNpZm5kZWYgTk9MT0NBTAorICAgIGRlYnVnKEYxMTAsInRuX2luaSgpIENLX05BV1MgIU5PTE9DQUwiLCIiLDApOworICAgIGlmICghc3N0ZWxuZXQpIHsKKyAgICAgICAgLyogQ29uc29sZSB0ZXJtaW5hbCBzY3JlZW4gcm93cyBhbmQgY29sdW1ucyAqLworI2lmZGVmIE9TMgorICAgICAgICBkZWJ1ZyhGMTAxLAorICAgICAgICAgICAgICAidG5faW5pIHR0X3Jvd3MgMSIsCisgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICBWc2NybkdldEhlaWdodChWVEVSTSktKHR0X3N0YXR1c1tWVEVSTV0/MTowKQorICAgICAgICAgICAgICApOworICAgICAgICBkZWJ1ZyhGMTAxLCJ0bl9pbmkgdHRfY29scyAxIiwiIixWc2NybkdldFdpZHRoKFZURVJNKSk7CisgICAgICAgIC8qIE5vdCBrbm93biB5ZXQgKi8KKyAgICAgICAgaWYgKFZzY3JuR2V0V2lkdGgoVlRFUk0pIDwgMCB8fAorICAgICAgICAgICAgVnNjcm5HZXRIZWlnaHQoVlRFUk0pLSh0dF9zdGF0dXNbVlRFUk1dPzE6MCkgPCAwKSB7CisgICAgICAgICAgICB0dGd3c2l6KCk7ICAgICAgICAgICAgICAgICAgLyogVHJ5IHRvIGZpbmQgb3V0ICovCisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjEwMSwKKyAgICAgICAgICAgICAgInRuX2luaSB0dF9yb3dzIDIiLAorICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgVnNjcm5HZXRIZWlnaHQoVlRFUk0pLSh0dF9zdGF0dXNbVlRFUk1dPzE6MCkKKyAgICAgICAgICAgICAgKTsKKyAgICAgICAgZGVidWcoRjEwMSwidG5faW5pIHR0X2NvbHMgMiIsIiIsVnNjcm5HZXRXaWR0aChWVEVSTSkpOworICAgICAgICAvKiBOb3cgZG8gd2Uga25vdz8gKi8KKyAgICAgICAgaWYgKFZzY3JuR2V0V2lkdGgoVlRFUk0pID4gMCAmJgorICAgICAgICAgICAgVnNjcm5HZXRIZWlnaHQoVlRFUk0pLSh0dF9zdGF0dXNbVlRFUk1dPzE6MCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfTkFXUykgJiYKKyAgICAgICAgICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfTkFXUykgPj0gVE5fTkdfUlEpIHsKKyAgICAgICAgICAgICAgICBpZiAodG5fc29wdChXSUxMLCBURUxPUFRfTkFXUykgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKFRFTE9QVF9OQVdTKSA9IDE7CisgICAgICAgICAgICAgICAgd2FpdCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbHNlIC8qIE9TMiAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJ0bl9pbmkgdHRfcm93cyAxIiwiIix0dF9yb3dzKTsKKyAgICAgICAgZGVidWcoRjEwMSwidG5faW5pIHR0X2NvbHMgMSIsIiIsdHRfY29scyk7CisgICAgICAgIGlmICh0dF9yb3dzIDwgMCB8fCB0dF9jb2xzIDwgMCkgeyAvKiBOb3Qga25vd24geWV0ICovCisgICAgICAgICAgICB0dGd3c2l6KCk7ICAgICAgICAgICAgICAgICAgLyogVHJ5IHRvIGZpbmQgb3V0ICovCisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjEwMSwidG5faW5pIHR0X3Jvd3MgMiIsIiIsdHRfcm93cyk7CisgICAgICAgIGRlYnVnKEYxMDEsInRuX2luaSB0dF9jb2xzIDIiLCIiLHR0X2NvbHMpOworICAgICAgICBpZiAodHRfcm93cyA+IDAgJiYgdHRfY29scyA+IDApIHsgLyogTm93IGRvIHdlIGtub3c/ICovCisgICAgICAgICAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfTkFXUykgJiYKKyAgICAgICAgICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfTkFXUykgPj0gVE5fTkdfUlEpIHsKKyAgICAgICAgICAgICAgICBpZiAodG5fc29wdChXSUxMLCBURUxPUFRfTkFXUykgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKFRFTE9QVF9OQVdTKSA9IDE7CisgICAgICAgICAgICAgICAgd2FpdCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgeworICAgICAgICBpZiAoIVRFTE9QVF9VKFRFTE9QVF9OQVdTKSAmJgorICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfTkFXUykgPj0gVE5fTkdfUlEpIHsKKyAgICAgICAgICAgIGlmICh0bl9zb3B0KERPLCBURUxPUFRfTkFXUykgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE8oVEVMT1BUX05BV1MpID0gMTsKKyAgICAgICAgICAgIHdhaXQgPSAxOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENLX05BV1MgKi8KKworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9TR0EpICYmCisgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9TR0EpID49IFROX05HX1JRKSB7CisgICAgICAgIGlmICh0bl9zb3B0KFdJTEwsIFRFTE9QVF9TR0EpIDwgMCkKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKFRFTE9QVF9TR0EpID0gMTsKKyAgICAgICAgd2FpdCA9IDE7CisgICAgfQorICAgIGlmICghVEVMT1BUX1UoVEVMT1BUX1NHQSkgJiYKKyAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfU0dBKSA+PSBUTl9OR19SUSkgeworICAgICAgICBpZiAodG5fc29wdChETywgVEVMT1BUX1NHQSkgPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX0RPKFRFTE9QVF9TR0EpID0gMTsKKyAgICAgICAgd2FpdCA9IDE7CisgICAgfQorICAgIGlmICghdG5fZHVwbGV4KSB7CisgICAgICAgIGlmICghVEVMT1BUX1UoVEVMT1BUX0VDSE8pICYmCisgICAgICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9FQ0hPKSA+PSBUTl9OR19SUSkgeworICAgICAgICAgICAgaWYgKHRuX3NvcHQoRE8sIFRFTE9QVF9FQ0hPKSA8IDApCisgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ETyhURUxPUFRfRUNITykgPSAxOworICAgICAgICAgICAgd2FpdCA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX0VDSE8pICYmCisgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FQ0hPKSA+PSBUTl9OR19SUSkgeworICAgICAgICBpZiAodG5fc29wdChXSUxMLCBURUxPUFRfRUNITykgPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoVEVMT1BUX0VDSE8pID0gMTsKKyAgICAgICAgd2FpdCA9IDE7CisgICAgfQorCisgICAgZGVidWcoRjEwMCwidG5faW5pIGFib3V0IHRvIHNlbmQgV0lMTCBUVFlQRSBpZiByZXF1ZXN0ZWQiLCIiLDApOworLyoKKyAgVGFsa2luZyB0byBURUxORVQgcG9ydCwgc28gc2VuZCBXSUxMIFRFUk1JTkFMIFRZUEUgYW5kIERPIFNHQS4KKyAgQWxzbyBzZW5kIFdJTEwgTkFXUyBpZiB3ZSBrbm93IG91ciBzY3JlZW4gZGltZW5zaW9ucy4KKyovCisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX1RUWVBFKSAmJgorICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfVFRZUEUpID49IFROX05HX1JRKSB7CisgICAgICAgIGlmICgoeCA9IHRuX3NvcHQoV0lMTCxURUxPUFRfVFRZUEUpKSA8IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInRuX2luaSB0bl9zb3B0IFdJTEwgVFRZUEUgZmFpbGVkIiwiIix4KTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfV0lMTChURUxPUFRfVFRZUEUpID0gMTsKKyAgICAgICAgd2FpdCA9IDE7CisgICAgICAgIGRlYnVnKEYxMDAsInRuX2luaSBzZW50IFdJTEwgVFRZUEUgb2siLCIiLDApOworICAgIH0KKyAgICBpZiAoIVRFTE9QVF9VKFRFTE9QVF9UVFlQRSkgJiYKKyAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfVFRZUEUpID49IFROX05HX1JRKSB7CisgICAgICAgIGlmICgoeCA9IHRuX3NvcHQoRE8sVEVMT1BUX1RUWVBFKSkgPCAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ0bl9pbmkgdG5fc29wdCBETyBUVFlQRSBmYWlsZWQiLCIiLHgpOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ETyhURUxPUFRfVFRZUEUpID0gMTsKKyAgICAgICAgd2FpdCA9IDE7CisgICAgICAgIGRlYnVnKEYxMDAsInRuX2luaSBzZW50IERPIFRUWVBFIG9rIiwiIiwwKTsKKyAgICB9CisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkgJiYKKyAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0JJTkFSWSkgPj0gVE5fTkdfUlEpIHsKKyAgICAgICAgaWYgKHRuX3NvcHQoV0lMTCwgVEVMT1BUX0JJTkFSWSkgPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoVEVMT1BUX0JJTkFSWSkgPSAxOworICAgICAgICB3YWl0ID0gMTsKKyAgICB9CisgICAgaWYgKCFURUxPUFRfVShURUxPUFRfQklOQVJZKSAmJgorICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9CSU5BUlkpID49IFROX05HX1JRKSB7CisgICAgICAgIGlmICh0bl9zb3B0KERPLCBURUxPUFRfQklOQVJZKSA8IDApCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE8oVEVMT1BUX0JJTkFSWSkgPSAxOworICAgICAgICB3YWl0ID0gMTsKKyAgICB9CisjaWZkZWYgQ0tfU05ETE9DCisgICAgaWYgKHRuX2xvYykgeworICAgICAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfU05ETE9DKSAmJgorICAgICAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX1NORExPQykgPj0gVE5fTkdfUlEpIHsKKyAgICAgICAgICAgIGlmICh0bl9zb3B0KFdJTEwsIFRFTE9QVF9TTkRMT0MpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoVEVMT1BUX1NORExPQykgPSAxOworICAgICAgICAgICAgd2FpdCA9IDE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tfU05ETE9DICovCisjaWZkZWYgQ0tfRU5WSVJPTk1FTlQKKyNpZmRlZiBDS19GT1JXQVJEX1gKKyAgICBpZiAoIVRFTE9QVF9VKFRFTE9QVF9GT1JXQVJEX1gpICYmCisgICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9GT1JXQVJEX1gpID49IFROX05HX1JRKSB7CisgICAgICAgIGlmICh0bl9zb3B0KFdJTEwsIFRFTE9QVF9GT1JXQVJEX1gpIDwgMCkKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoVEVMT1BUX0ZPUldBUkRfWCkgPSAxOworICAgICAgICB3YWl0ID0gMTsKKyAgICB9CisjZW5kaWYgLyogRk9SV0FSRF9YICovCisjaWZkZWYgQ0tfWERJU1BMT0MKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfWERJU1BMT0MpICYmCisgICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfWERJU1BMT0MpID49IFROX05HX1JRKSB7CisgICAgICAgIGlmICh0bl9zb3B0KFdJTEwsIFRFTE9QVF9YRElTUExPQykgPCAwKQorICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfV0lMTChURUxPUFRfWERJU1BMT0MpID0gMTsKKyAgICAgICAgd2FpdCA9IDE7CisgICAgfQorI2VuZGlmIC8qIENLX1hESVNQTE9DICovCisgICAgLyogV2lsbCBzZW5kIHRlcm1pbmFsIGVudmlyb25tZW50LiAqLworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9ORVdFTlZJUk9OKSAmJgorICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfTkVXRU5WSVJPTikgPj0gVE5fTkdfUlEpIHsKKyAgICAgICAgaWYgKHRuX3NvcHQoV0lMTCwgVEVMT1BUX05FV0VOVklST04pIDwgMCkKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKFRFTE9QVF9ORVdFTlZJUk9OKSA9IDE7CisgICAgICAgIHdhaXQgPSAxOworICAgIH0KKyAgICBpZiAoIVRFTE9QVF9VKFRFTE9QVF9ORVdFTlZJUk9OKSAmJgorICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9ORVdFTlZJUk9OKSA+PSBUTl9OR19SUSkgeworICAgICAgICBpZiAodG5fc29wdChETywgVEVMT1BUX05FV0VOVklST04pIDwgMCkKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ETyhURUxPUFRfTkVXRU5WSVJPTikgPSAxOworICAgICAgICB3YWl0ID0gMTsKKyAgICB9CisjZW5kaWYgLyogQ0tfRU5WSVJPTk1FTlQgKi8KKworICAgIC8qIFRha2UgY2FyZSBvZiBhbnkgb3RoZXIgdGVsbmV0IG9wdGlvbnMgdGhhdCByZXF1aXJlIGhhbmRsaW5nLiAqLworCisgICAgZm9yIChvcHQgPSBURUxPUFRfRklSU1Q7IG9wdCA8PSBURUxPUFRfTEFTVDsgb3B0KyspIHsKKyAgICAgICAgc3dpdGNoIChvcHQpIHsKKyAgICAgICAgICBjYXNlIFRFTE9QVF9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICBjYXNlIFRFTE9QVF9FTkNSWVBUSU9OOgorICAgICAgICAgIGNhc2UgVEVMT1BUX1RUWVBFOgorICAgICAgICAgIGNhc2UgVEVMT1BUX05BV1M6CisgICAgICAgICAgY2FzZSBURUxPUFRfQklOQVJZOgorICAgICAgICAgIGNhc2UgVEVMT1BUX05FV0VOVklST046CisgICAgICAgICAgY2FzZSBURUxPUFRfU05ETE9DOgorICAgICAgICAgIGNhc2UgVEVMT1BUX1hESVNQTE9DOgorICAgICAgICAgIGNhc2UgVEVMT1BUX1NHQToKKyAgICAgICAgICBjYXNlIFRFTE9QVF9FQ0hPOgorICAgICAgICAgIGNhc2UgVEVMT1BUX0tFUk1JVDoKKyAgICAgICAgICBjYXNlIFRFTE9QVF9TVEFSVF9UTFM6CisgICAgICAgICAgY2FzZSBURUxPUFRfRk9SV0FSRF9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChURUxPUFRfT0sob3B0KSkgeworICAgICAgICAgICAgICAgIGlmICghVEVMT1BUX01FKG9wdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUob3B0KSA+PSBUTl9OR19SUSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodG5fc29wdChXSUxMLCBvcHQpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKG9wdCkgPSAxOworICAgICAgICAgICAgICAgICAgICB3YWl0ID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFURUxPUFRfVShvcHQpICYmCisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUob3B0KSA+PSBUTl9OR19SUSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodG5fc29wdChETywgb3B0KSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE8ob3B0KSA9IDE7CisgICAgICAgICAgICAgICAgICAgIHdhaXQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAod2FpdCkgeworICAgICAgICBpZiAodG5fd2FpdCgicHJlLWVuY3J5cHQiKSA8IDApIHsKKyAgICAgICAgICAgIHRuX3B1c2goKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgd2FpdCA9IDA7CisgICAgfQorCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIGlmICh0bl9pbml0KSAgICAgICAgICAgICAgICAvKiB0bl9pbmkoKSBtYXkgYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5ICovCisgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfRU5DUllQVElPTikgJiYKKyAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID49IFROX05HX1JRKSB7CisgICAgICAgIGlmICh0bl9zb3B0KFdJTEwsIFRFTE9QVF9FTkNSWVBUSU9OKSA8IDApCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfV0lMTChURUxPUFRfRU5DUllQVElPTikgPSAxOworICAgICAgICB3YWl0ID0gMTsKKyAgICB9CisgICAgaWYgKCFURUxPUFRfVShURUxPUFRfRU5DUllQVElPTikgJiYKKyAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPj0gVE5fTkdfUlEpIHsKKyAgICAgICAgaWYgKHRuX3NvcHQoRE8sIFRFTE9QVF9FTkNSWVBUSU9OKSA8IDApCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE8oVEVMT1BUX0VOQ1JZUFRJT04pID0gMTsKKyAgICAgICAgd2FpdCA9IDE7CisgICAgfQorCisgICAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIGVuY3J5cHQsIHdlIHdhbnQgdG8gZG8gaXQgYmVmb3JlIHdlIHNlbmQgYW55IG1vcmUgKi8KKyAgICAvKiBkYXRhLCBlc3BlY2lhbGx5IHRoZSB0ZXJtaW5hbCB0eXBlIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAgICAgICAqLworICAgIGlmICh3YWl0KSB7CisgICAgICAgIGlmICh0bl93YWl0KCJwb3N0LWVuY3J5cHQiKSA8IDApIHsKKyAgICAgICAgICAgIHRuX3B1c2goKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgd2FpdCA9IDA7CisgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKworICAgIHRuX3Nkc2IoKTsKKworICAgIGlmICh0bl9pbml0KSAgICAgICAgICAgICAgICAgICAvKiB0bl9pbmkoKSBtYXkgYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5ICovCisgICAgICAgIHJldHVybigwKTsKKworI2lmZGVmIElLU19PUFRJT04KKyAgICAvKiBLZXJtaXQgU2VydmVyIG5lZ290aWF0aW9uIG11c3QgZ28gbGFzdCAqLworICAgIC8qIFNlbmQgVSBiZWZvcmUgTUUgKi8KKworICAgIGlmICghVEVMT1BUX1UoVEVMT1BUX0tFUk1JVCkgJiYKKyAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfS0VSTUlUKSA+PSBUTl9OR19SUSkgeworICAgICAgICBpZiAodG5fc29wdChETywgVEVMT1BUX0tFUk1JVCkgPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX0RPKFRFTE9QVF9LRVJNSVQpID0gMTsKKyAgICAgICAgd2FpdCA9IDE7CisgICAgfQorICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9LRVJNSVQpICYmCisgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9LRVJNSVQpID49IFROX05HX1JRKSB7CisgICAgICAgIGlmICh0bl9zb3B0KFdJTEwsIFRFTE9QVF9LRVJNSVQpIDwgMCkKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKFRFTE9QVF9LRVJNSVQpID0gMTsKKyAgICAgICAgd2FpdCA9IDE7CisgICAgfQorI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKworICAgIGlmICh3YWl0KSB7CisgICAgICAgIGlmICh0bl93YWl0KCJlbmQgb2YgdGVsbmV0IG5lZ290aWF0aW9ucyIpIDwgMCkgeworICAgICAgICAgICAgdG5fcHVzaCgpOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICB3YWl0ID0gMDsKKyAgICB9CisKKyAgICB0bl9zZHNiKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZW5kIGRlbGF5ZWQgc3VibmVnb3RpYXRpb25zICovCisgICAgdG5fcHVzaCgpOworICAgIHJldHVybigwKTsKK30KKworLyogU3RhcnQgYSB0ZWxuZXQgY29ubmVjdGlvbi4gKi8KKy8qIFJldHVybnMgLTEgb24gZXJyb3IsIDAgaWYgbm90aGluZyBoYXBwZW5zLCAxIGlmIGluaXQgbXNncyBzZW50IG9rICovCisKK2ludAordG5faW5pKCkgeworICAgIGludCB4OworCisgICAgZGVidWcoRjEwMSwidG5faW5pIHR0bnByb3RvIiwiIix0dG5wcm90byk7CisgICAgZGVidWcoRjEwMSwidG5faW5pIHRuX2luaXQiLCIiLHRuX2luaXQpOworCisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCKSAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIGNvbm5lY3Rpb24gaXMgVENQL0lQICovCisgICAgICByZXR1cm4oMCk7CisgICAgaWYgKHRuX2luaXQpICAgICAgICAgICAgICAgICAgICAgICAgLyogSGF2ZSB3ZSBkb25lIHRoaXMgYWxyZWFkeT8gKi8KKyAgICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBkbyBpdCBhZ2Fpbi4gKi8KKworICAgIHRuX3Jlc2V0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRlbG5ldCBwYXJhbWV0ZXJzICovCisgICAgdG5fYmVndW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQ7IHdpbGwgYmUgc2V0IGJ5IHRuX3N0YXJ0KCkgKi8KKworICAgIHN3aXRjaCAoIHR0bnByb3RvICkgeworICAgICAgY2FzZSBOUF9STE9HSU46CisgICAgICBjYXNlIE5QX0s0TE9HSU46CisgICAgICBjYXNlIE5QX0VLNExPR0lOOgorICAgICAgY2FzZSBOUF9LNUxPR0lOOgorICAgICAgY2FzZSBOUF9FSzVMT0dJTjoKKyAgICAgIGNhc2UgTlBfSzVVMlU6CisgICAgICAgIHRuX2luaXQgPSAxOworICAgICAgICBkZWJ1ZyhGMTAwLCJ0bl9pbmkgdGVsbmV0IG5lZ290aWF0aW9ucyBpZ25vcmVkIiwidG5faW5pdCIsdG5faW5pdCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICAgIGNhc2UgTlBfTk9ORToKKyAgICAgIGNhc2UgTlBfU1NMOgorICAgICAgY2FzZSBOUF9UTFM6ICAgICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCB0YWxraW5nIHRvIGEgdGVsbmV0IHBvcnQsICovCisgICAgICAgIHR0bnByb3RvID0gTlBfVEVMTkVUOyAgICAgICAgICAgLyogcHJldGVuZCBpdCdzIHRlbG5ldCBhbnl3YXksICovCisgICAgICAgIG9sZHBsZXggPSBkdXBsZXg7ICAgICAgICAgICAgICAgLyogc2F2ZSBvbGQgZHVwbGV4IHZhbHVlICovCisgICAgICAgIGR1cGxleCA9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHNldCB0byBoYWxmIGR1cGxleCBmb3IgdGVsbmV0ICovCisgICAgICAgIGlmIChpbnNlcnZlcikKKyAgICAgICAgICBkZWJ1ZyhGMTAwLCJ0bl9pbmkgc2tpcHBpbmcgdGVsbmV0IG5lZ290aWF0aW9ucyIsIiIsMCk7CisgICAgICAgICAgZWxzZQorICAgICAgICB0bl93YWl0KCJ0bl9pbmkgLSB3YWl0aW5nIHRvIHNlZSBpZiB0ZWxuZXQgbmVnb3RpYXRpb25zIHdlcmUgc2VudCIpOworCXRuX3B1c2goKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgICAgY2FzZSBOUF9UQ1BSQVc6ICAgICAgICAgICAgICAgICAgIC8qIFJhdyBzb2NrZXQgcmVxdWVzdGVkLiAqLworICAgICAgICBkZWJ1ZyhGMTAwLCJ0bl9pbmkgdGVsbmV0IG5lZ290aWF0aW9ucyBpZ25vcmVkIiwidG5faW5pdCIsdG5faW5pdCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICAgIGNhc2UgTlBfS0VSTUlUOiAgICAgICAgICAgICAgICAgICAvKiBzd2l0Y2hpbmcgdG8gVGVsbmV0IHByb3RvY29sICovCisgICAgICBjYXNlIE5QX1NTTF9URUxORVQ6CisgICAgICBjYXNlIE5QX1RMU19URUxORVQ6CisgICAgICAgIGRlYnVnKEYxMDEsInRuX2luaSBzd2l0Y2hpbmcgZnJvbSBYWFggdG8gVGVsbmV0IiwiIix0dG5wcm90byk7CisgICAgICAgIHR0bnByb3RvID0gTlBfVEVMTkVUOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIFdlIGFyZSBhbHJlYWR5IHVzaW5nIGEgdmFyaWF0aW9uIG9uIFRlbG5ldCBwcm90b2NvbCAqLworICAgICAgICA7CisgICAgfQorCisgICAgeCA9IHRuX3N0YXJ0KCk7CisgICAgdG5faW5pdCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLiAqLworCisgICAgLyogRG9uJ3Qgc2VuZCBhbnl0aGluZyBlbHNlISAqLworICAgIGRlYnVnKEYxMDEsInRuX2luaSBkdXBsZXgiLCIiLGR1cGxleCk7CisgICAgZGVidWcoRjEwMSwidG5faW5pIGRvbmUsIHRuX2luaXQiLCIiLHRuX2luaXQpOworICAgIHJldHVybih4KTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RuX2hleChDSEFSICogYnVmLCBpbnQgYnVmbGVuLCBDSEFSICogZGF0YSwgaW50IGRhdGFsZW4pCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5faGV4KGJ1ZiwgYnVmbGVuLCBkYXRhLCBkYXRhbGVuKQorICAgIENIQVIgKiBidWY7CisgICAgaW50IGJ1ZmxlbjsKKyAgICBDSEFSICogZGF0YTsKKyAgICBpbnQgZGF0YWxlbjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGludCBpID0gMCwgaiA9IDAsIGsgPSAwOworICAgIENIQVIgdG1wWzE2XTsJCS8qIGluIGNhc2UgdmFsdWUgaXMgdHJlYXRlZCBhcyBuZWdhdGl2ZSAqLworI2lmZGVmIENPTU1FTlQKKyAgICBpbnQgd2FzX2hleCA9IDE7CisKKyAgICBmb3IgKGs9MDsgayA8IGRhdGFsZW47IGsrKykgeworICAgICAgICBpZiAoZGF0YVtrXSA8IDMyIHx8IGRhdGFba10gPj0gMTI3KSB7CisgICAgICAgICAgICBzcHJpbnRmKHRtcCwiJXMlMDJYICIsd2FzX2hleD8iIjoiXCIgIixkYXRhW2tdKTsKKyAgICAgICAgICAgIHdhc19oZXggPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3ByaW50Zih0bXAsIiVzJWMiLHdhc19oZXg/IlwiIjoiIixkYXRhW2tdKTsKKyAgICAgICAgICAgIHdhc19oZXggPSAwOworICAgICAgICB9CisgICAgICAgIGNrc3RybmNhdCgoY2hhciAqKWJ1Zix0bXAsYnVmbGVuKTsKKyAgICB9CisgICAgaWYgKCF3YXNfaGV4KQorICAgICAgICBja3N0cm5jYXQoKGNoYXIgKilidWYsIlwiICIsYnVmbGVuKTsKKyNlbHNlIC8qIENPTU1FTlQgKi8KKyAgICBpZiAoZGF0YWxlbiA8PSAwIHx8IGRhdGEgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCB8fCBidWZsZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgZm9yIChpID0gMDsgaSA8IGRhdGFsZW47IGkrKykgeworICAgICAgICBja3N0cm5jYXQoKGNoYXIgKilidWYsIlxyXG4gICIsYnVmbGVuKTsKKyAgICAgICAgZm9yIChqID0gMCA7IChqIDwgMTYpOyBqKyspIHsKKyAgICAgICAgICAgIGlmICgoaSArIGopIDwgZGF0YWxlbikKKyAgICAgICAgICAgICAgc3ByaW50ZigoY2hhciAqKXRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMlMDJ4ICIsCisgICAgICAgICAgICAgICAgICAgICAgKGogPT0gOCA/ICJ8ICIgOiAiIiksCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkgZGF0YVtpICsgal0KKyAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBzcHJpbnRmKChjaGFyICopdG1wLAorICAgICAgICAgICAgICAgICAgICAgICIlcyAgICIsCisgICAgICAgICAgICAgICAgICAgICAgKGogPT0gOCA/ICJ8ICIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2tzdHJuY2F0KChjaGFyICopYnVmLChjaGFyICopdG1wLGJ1Zmxlbik7CisgICAgICAgIH0KKyAgICAgICAgY2tzdHJuY2F0KChjaGFyICopYnVmLCIgIixidWZsZW4pOworICAgICAgICBmb3IgKGsgPSAwOyAoayA8IDE2KSAmJiAoKGkgKyBrKSA8IGRhdGFsZW4pOyBrKyspIHsKKyAgICAgICAgICAgIHNwcmludGYoKGNoYXIgKil0bXAsCisgICAgICAgICAgICAgICAgICAgICAiJXMlYyIsCisgICAgICAgICAgICAgICAgICAgICAoayA9PSA4ID8gIiAiIDogIiIpLAorICAgICAgICAgICAgICAgICAgICAgaXNwcmludCgoY2hhcikoZGF0YVtpK2tdKSkgPyBkYXRhW2kra10gOiAnLicKKyAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBja3N0cm5jYXQoKGNoYXIgKilidWYsKGNoYXIgKil0bXAsYnVmbGVuKTsKKyAgICAgICAgfQorICAgICAgICBpICs9IGogLSAxOworICAgIH0gLyogZW5kIGZvciAqLworICAgIGNrc3RybmNhdCgoY2hhciAqKWJ1ZiwiXHJcbiAgIixidWZsZW4pOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICByZXR1cm4oc3RybGVuKChjaGFyICopYnVmKSk7Cit9CisKK1ZPSUQKK3RuX2RlYnVnKHMpIGNoYXIgKnM7IHsKKyNpZmRlZiBOT0xPQ0FMCisgICAgcmV0dXJuOworI2Vsc2UgLyogTk9MT0NBTCAqLworI2lmZGVmIE9TMgorICAgIHZvaWQgY3dyaXRlKHVuc2lnbmVkIHNob3J0KTsKKyAgICBjaGFyICpwID0gczsKKyAgICBfUFJPVE9UWVAgKHZvaWQgb3MyYm9sZCwgKHZvaWQpKTsKKyAgICBleHRlcm4gaW50IHR0X3R5cGVfbW9kZTsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIGlmICghKHRuX2RlYiB8fCBkZWJzZXMpKQorICAgICAgcmV0dXJuOworICAgIGRlYnVnKEYxMTEsInRuX2RlYnVnIixzLHdoYXQpOworI2lmZGVmIE9TMgorICAgIGlmICgxKSB7CisgICAgICAgIGV4dGVybiB1bnNpZ25lZCBjaGFyIGNvbG9yY21kOworICAgICAgICBjb2xvcmNtZCBePSAweDggOworICAgICAgICBwcmludGYoIiVzXHJcbiIscyk7CisgICAgICAgIGNvbG9yY21kIF49IDB4OCA7CisgICAgfQorICAgIGlmICghc2NybmluaXRpYWxpemVkW1ZURVJNXSkgeworICAgICAgICBVU0hPUlQgeCx5OworICAgICAgICBjaGVja3NjcmVlbm1vZGUoKTsKKyAgICAgICAgR2V0Q3VyUG9zKCZ5LCAmeCk7CisgICAgICAgIFNhdmVDbWRNb2RlKHgrMSx5KzEpOworICAgICAgICBzY3JuaW5pdCgpOworICAgICAgICBSZXN0b3JlQ21kTW9kZSgpOworICAgIH0KKworICAgIGlmICggSVNWVE5UKHR0X3R5cGVfbW9kZSkgJiYgdHRudW0gIT0gLTEgJiYgIWRlYnNlcyApCisgICAgICAgIHJldHVybjsKKworICAgIFJlcXVlc3RWc2Nybk11dGV4KCBWVEVSTSwgU0VNX0lOREVGSU5JVEVfV0FJVCApIDsKKworICAgIG9zMmJvbGQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRvZ2dsZSBib2xkbmVzcyAqLworICAgIHdoaWxlICgqcCkKKyAgICAgIGN3cml0ZSgoQ0hBUikgKnArKyk7ICAgICAgICAgICAgICAvKiBHbyBib2xkbHkgLi4uICovCisgICAgb3MyYm9sZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVG9nZ2xlIGJvbGRuZXNzIGJhY2sgKi8KKyAgICBpZiAoZGVic2VzKSB7CisgICAgICAgIGRlYnNlcyA9IDA7CisgICAgICAgIGN3cml0ZSgoQ0hBUikgJ1wwMTUnKTsKKyAgICAgICAgY3dyaXRlKChDSEFSKSAnXDAxMicpOworICAgICAgICBkZWJzZXMgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGN3cml0ZSgoQ0hBUikgJ1wwMTUnKTsKKyAgICAgICAgY3dyaXRlKChDSEFSKSAnXDAxMicpOworICAgIH0KKyAgICBSZWxlYXNlVnNjcm5NdXRleChWVEVSTSkgOworI2Vsc2UKKyAgICBpZiAod2hhdCAhPSBXX0NPTk5FQ1QgJiYgd2hhdCAhPSBXX0RJQUxJTkcgJiYgCisgICAgICAgIHdoYXQgIT0gV19DT01NQU5EICYmIHdoYXQgIT0gV19OT1RISU5HKQorICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPTk5FQ1QvY29tbWFuZCBtdXN0IGJlIGFjdGl2ZSAqLworICAgIGNvbm9sbChzKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCit9CisKKy8qCisgIFByb2Nlc3MgaW4tYmFuZCBUZWxuZXQgbmVnb3RpYXRpb24gY2hhcmFjdGVycyBmcm9tIHRoZSByZW1vdGUgaG9zdC4KKyAgQ2FsbCB3aXRoIHRoZSB0ZWxuZXQgSUFDIGNoYXJhY3RlciBhbmQgdGhlIGN1cnJlbnQgZHVwbGV4IHNldHRpbmcKKyAgKDAgPSByZW1vdGUgZWNobywgMSA9IGxvY2FsIGVjaG8pLCBhbmQgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdG8gY2FsbAorICB0byByZWFkIG1vcmUgY2hhcmFjdGVycy4gIFJldHVybnM6CisgICAgNiBpZiBETyBMT0dPVVQgd2FzIHJlY2VpdmVkIGFuZCBhY2NlcHRlZAorICAgIDUgaWYgdGhlIEtlcm1pdCBzdGFydCBvZiBwYWNrZXQgY2hhcmFjdGVyIGhhcyBjaGFuZ2VkCisgICAgNCBpZiBzdGF0ZSBvZiByZW1vdGUgSW50ZXJuZXQgS2VybWl0IFNlcnZpY2UgaGFzIGNoYW5nZWQKKyAgICAzIGlmIGEgcXVvdGVkIElBQyB3YXMgcmVjZWl2ZWQKKyAgICAyIGlmIGxvY2FsIGVjaG8gbXVzdCBiZSBjaGFuZ2VkIHRvIHJlbW90ZQorICAgIDEgaWYgcmVtb3RlIGVjaG8gbXVzdCBiZSBjaGFuZ2VkIHRvIGxvY2FsCisgICAgMCBpZiBub3RoaW5nIGhhcHBlbnMgb3Igbm8gYWN0aW9uIG5lY2Vzc2FyeQorICAgLTEgb24gZmFpbHVyZSAoPSBpbnRlcm5hbCBvciBpL28gZXJyb3IpCisqLworI2lmZGVmIElLU19PUFRJT04KK2ludAordG5fc2lrcyhjbWQpIGludCBjbWQ7IHsgICAgICAgICAvKiBURUxORVQgU0VORCBJS1MgU1VCICovCisgICAgQ0hBUiBidWZbOF07CisjaWZuZGVmIE5PWEZFUgorICAgIGV4dGVybiBDSEFSIG15c3RjaDsgICAgICAgICAgICAgICAgIC8qIE91dGdvaW5nIFN0YXJ0IG9mIFBhY2tldCBDaGFyICovCisjZWxzZQorICAgIENIQVIgbXlzdGNoID0gJ1wxJzsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICBpbnQgbixtLHJjOworCisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCKSByZXR1cm4oMCk7ICAgLyogTXVzdCBiZSBUQ1AvSVAgKi8KKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7IC8qIE11c3QgYmUgdGVsbmV0IHByb3RvY29sICovCisgICAgaWYgKGNtZCA8IEtFUk1JVF9TVEFSVCB8fCBjbWQgPiBLRVJNSVRfUkVTUF9TVE9QKSAvKiBJbGxlZ2FsIHN1YmNvbW1hbmQgKi8KKyAgICAgIHJldHVybigtMSk7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgaWYgKGNtZCA9PSBLRVJNSVRfU1RBUlQgfHwgY21kID09IEtFUk1JVF9SRVNQX1NUQVJUKSB7CisgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQgPSAxOworICAgIH0gZWxzZSBpZiAoY21kID09IEtFUk1JVF9TVE9QIHx8IGNtZCA9PSBLRVJNSVRfUkVTUF9TVE9QKSB7CisgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQgPSAwOworICAgIH0gZWxzZSBpZiAoY21kID09IEtFUk1JVF9SRVFfU1RPUCkKKyAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfcmVxX3N0b3AgPSAxOworICAgIGVsc2UgaWYgKGNtZCA9PSBLRVJNSVRfUkVRX1NUQVJUKQorICAgICAgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9yZXFfc3RhcnQgPSAxOworCisgICAgaWYgKGNtZCA9PSBLRVJNSVRfU09QKSB7CisgICAgICAgIGJ1ZlswXSA9IChDSEFSKSBJQUM7CisgICAgICAgIGJ1ZlsxXSA9IChDSEFSKSBTQjsKKyAgICAgICAgYnVmWzJdID0gKENIQVIpIFRFTE9QVF9LRVJNSVQ7CisgICAgICAgIGJ1ZlszXSA9IChDSEFSKSAoY21kICYgMHhmZik7CisgICAgICAgIGJ1Zls0XSA9IChDSEFSKSBteXN0Y2g7CisgICAgICAgIGJ1Zls1XSA9IChDSEFSKSBJQUM7CisgICAgICAgIGJ1Zls2XSA9IChDSEFSKSBTRTsKKyAgICAgICAgYnVmWzddID0gKENIQVIpIDA7CisjaWZkZWYgREVCVUcKKyAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMgfHwgZGVibG9nKQorICAgICAgICAgICAgY2ttYWttc2coIHRuX21zZ19vdXQsVE5fTVNHX0xFTiwiVEVMTkVUIFNFTlQgU0IgS0VSTUlUIFNPUCAiLAorICAgICAgICAgICAgICAgICAgICAgIGNrY3RveChteXN0Y2gsMSksIiBJQUMgU0UiLE5VTEwpOworI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICAgICAgZGVidWcoRjEwMSx0bl9tc2dfb3V0LCIiLGNtZCk7CisgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICByYyA9ICggdHRvbChidWYsNykgPCA3ICk7ICAgICAgICAgICAgICAgIC8qIFNlbmQgaXQuICovCisjaWZkZWYgT1MyCisgICAgICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4oLTEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZlswXSA9IChDSEFSKSBJQUM7CisgICAgICAgIGJ1ZlsxXSA9IChDSEFSKSBTQjsKKyAgICAgICAgYnVmWzJdID0gKENIQVIpIFRFTE9QVF9LRVJNSVQ7CisgICAgICAgIGJ1ZlszXSA9IChDSEFSKSAoY21kICYgMHhmZik7CisgICAgICAgIGJ1Zls0XSA9IChDSEFSKSBJQUM7CisgICAgICAgIGJ1Zls1XSA9IChDSEFSKSBTRTsKKyAgICAgICAgYnVmWzZdID0gKENIQVIpIDA7CisKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcyB8fCBkZWJsb2cpIHsKKyAgICAgICAgICAgIGNoYXIgKiBzID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgICAgICAgIGNhc2UgS0VSTUlUX1NUQVJUOiBzID0gIlNUQVJUIjsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgS0VSTUlUX1NUT1A6IHMgPSAiU1RPUCI7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEtFUk1JVF9SRVFfU1RBUlQ6IHMgPSAiUkVRLVNUQVJUIjsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgS0VSTUlUX1JFUV9TVE9QOiBzID0gIlJFUS1TVE9QIjsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgS0VSTUlUX1JFU1BfU1RBUlQ6IHMgPSAiUkVTUC1TVEFSVCI7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEtFUk1JVF9SRVNQX1NUT1A6ICBzID0gIlJFU1AtU1RPUCI7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2ttYWttc2coIHRuX21zZ19vdXQsVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0Iga2VybWl0ICIscywiIElBQyBTRSIsTlVMTCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgICAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgICAgIGRlYnVnKEYxMDEsdG5fbXNnX291dCwiIixjbWQpOworICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgcmMgPSAoIHR0b2woYnVmLDYpIDwgNiApOyAgICAgICAgICAgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgICAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgICAgICBpZiAocmMpCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICByZXR1cm4oMSk7Cit9CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCisvKiB0bl9zYigpIHBlcmZvcm1zIFRlbG5ldCBTdWJuZWdvdGlhdGlvbiBQYXJzaW5nIGFuZCBEZWJ1Z2dpbmcgKi8KKy8qIHJldHVybnMgPD0gMCBvbiBlcnJvciwgMSBvbiBzdWNjZXNzICovCisvKiB0aGUgbGVuZ3RoIHJldHVybmVkIGluY2x1ZGVzIHRoZSBJQUMgU0UgYnl0ZXMgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEVMTkVUIFNCICovCit0bl9zYiggaW50IG9wdCwgaW50ICogbGVuLCBpbnQgKCpmbikoaW50KSApCisjZWxzZQordG5fc2IoIG9wdCwgbGVuLCBmbiApIGludCBvcHQ7IGludCAqIGxlbjsgaW50ICgqZm4pKCk7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHRuX3NiICovIHsKKyAgICBpbnQgYywgeCwgeSwgbiwgbSwgZmxhZzsKKyAgICBkZWJ1ZyhGMTAwLCJFbnRlcmluZyB0bl9zYigpIiwiIiwwKTsKKyAgICAqbGVuID0gMDsgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBMZW4gdG8gMCAqLworICAgIG4gPSBmbGFnID0gMDsgICAgICAgICAgICAgICAvKiBGbGFnIGZvciB3aGVuIGRvbmUgcmVhZGluZyBTQiAqLworICAgIHdoaWxlIChuIDwgVFNCVUZTSVopIHsgICAgICAvKiBMb29wIGxvb2tpbmcgZm9yIElBQyBTRSAqLworICAgICAgICBpZiAoKHkgPSAoKmZuKSgwKSkgPCAwKSAvKiBSZWFkIGEgYnl0ZSAqLworICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgeSAmPSAweGZmOyAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIGl0J3MganVzdCA4IGJpdHMuICovCisgICAgICAgIHNiW24rK10gPSAoY2hhcikgeTsgICAgIC8qIERlcG9zaXQgaW4gYnVmZmVyLiAqLworICAgICAgICBpZiAoc2VzbG9nICYmIHNlc3NmdCA9PSBYWUZUX0QpIHsgLyogVGFrZSBjYXJlIG9mIHNlc3Npb24gbG9nICovCisgICAgICAgICAgICBsb2djaGFyKChjaGFyKSB5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeSA9PSBJQUMpIHsgICAgICAgICAvKiBJZiB0aGlzIGlzIGFuIElBQyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGZsYWcpIHsgICAgICAgICAvKiBJZiBwcmV2aW91cyBjaGFyIHdhcyBJQUMgICAgICAgICAqLworICAgICAgICAgICAgICAgIG4tLTsgICAgICAgICAgICAvKiBpdCdzIHF1b3RlZCwga2VlcCBvbmUgSUFDICAgICAgICAqLworICAgICAgICAgICAgICAgIGZsYWcgPSAwOyAgICAgICAvKiBhbmQgdHVybiBvZmYgdGhlIGZsYWcuICAgICAgICAgICAqLworICAgICAgICAgICAgfSBlbHNlIGZsYWcgPSAxOyAgICAvKiBPdGhlcndpc2Ugc2V0IHRoZSBmbGFnLiAgICAgICAgICAqLworICAgICAgICB9IGVsc2UgaWYgKGZsYWcpIHsgICAgICAvKiBTb21ldGhpbmcgZWxzZSBmb2xsb3dpbmcgSUFDICAgICAqLworICAgICAgICAgICAgaWYgKHkgPT0gU0UpICAgICAgICAvKiBJZiBub3QgU0UsIGl0J3MgYSBwcm90b2NvbCBlcnJvciAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UgaWYgKHkgPT0gRE9OVCkgeyAvKiBVc2VkIERPTlQgaW5zdGVhZCBvZiBTRSAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsCisgICAgICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTdWJuZWdvdGlhdGlvbiBlcnJvciAtIHVzZWQgRE9OVCBpbnN0ZWFkIG9mIFNFISIsCisgICAgICAgICAgICAgICAgICAgICAgIiIKKyAgICAgICAgICAgICAgICAgICAgICAsMAorICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgICAgICB0bl9kZWJ1ZygKKyAgICAgICAgICAgICAgICAgICAgICJURUxORVQgU3VibmVnb3RpYXRpb24gZXJyb3IgLSB1c2VkIERPTlQgaW5zdGVhZCBvZiBTRSEiKTsKKyAgICAgICAgICAgICAgICBmbGFnID0gMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgLyogT3RoZXIgcHJvdG9jb2wgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBmbGFnID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWZkZWYgQ0tfRk9SV0FSRF9YCisgICAgICAgIGlmICggb3B0ID09IFRFTE9QVF9GT1JXQVJEX1ggJiYgc2JbMF0gPT0gRldEWF9EQVRBICYmCisgICAgICAgICAgICAgbiA+PSAoVFNCVUZTSVotNCkgJiYgIWZsYWcgKSB7CisgICAgICAgICAgICAvKiBkbyBub3QgbGV0IHRoZSBidWZmZXIgb3ZlciBmbG93ICovCisgICAgICAgICAgICAvKiB3cml0ZSB0aGUgZGF0YSB0byB0aGUgY2hhbm5lbCBhbmQgY29udGludWUgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgLyogdGhlIGluY29taW5nIGRhdGEgdW50aWwgSUFDIFNFIGlzIHJlYWNoZWQuICovCisgICAgICAgICAgICBzYltuKytdID0gSUFDOworICAgICAgICAgICAgc2JbbisrXSA9IFNFOworCisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGlmICggZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMgKSB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgY2ttYWttc2coIHRuX21zZyxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVEVMTkVUIFJDVkQgU0IgIixURUxPUFQob3B0KSwKKwkJCSAgIiBEQVRBKGJ1ZmZlci1mdWxsKSAiLE5VTEwpOworICAgICAgICAgICAgICAgIHRuX2hleCh0bl9tc2csVE5fTVNHX0xFTiwmc2JbMV0sbi0zKTsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZyA9PSAyKQorICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnLCIgU0UiLFROX01TR19MRU4pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZsYWcgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiIElBQyBET05UIixUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csIiBJQUMgU0UiLFROX01TR19MRU4pOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsdG5fbXNnLCIiLDApOworICAgICAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgICAgICAgICB0bl9kZWJ1Zyh0bl9tc2cpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyAgICAgICAgICAgIGlmICggZndkeF90bl9zYihzYixuKSA8IDAgKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiZnhkeF90bl9zYigpIGZhaWxlZCIsIiIsMCk7CisgICAgICAgICAgICAgICAgLyogV2UgY2FuJ3QgcmV0dXJuIHRob3VnaCBiZWNhdXNlIHRoYXQgd291bGQgbGVhdmUgICovCisgICAgICAgICAgICAgICAgLyogZGF0YSB0byBiZSBmb3J3YXJkZWQgaW4gdGhlIHF1ZXVlIHRvIHRoZSBiZSBzZW50ICovCisgICAgICAgICAgICAgICAgLyogdG8gdGhlIHRlcm1pbmFsIGVtdWxhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiByZXNldCBsZWF2ZSB0aGUgbXNnIHR5cGUgYW5kIGNoYW5uZWwgbnVtYmVyIGluIHBsYWNlICovCisgICAgICAgICAgICBuID0gMzsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0bl9zYiBlbmQgb2Ygd2hpbGUgbG9vcCIsImZsYWciLGZsYWcpOworICAgIGlmICghZmxhZykgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBnb3QgYSB2YWxpZCBTQiAqLworICAgICAgICBkZWJ1ZyhGMTExLCAiVEVMTkVUIFN1Ym5lZ290aWF0aW9uIHByZW1hdHVyZWx5IGJyb2tlbiIsIm9wdCIsb3B0KTsKKyAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgICAgIGNrbWFrbXNnKCB0bl9tc2csIFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAgICAgIlRFTE5FVCAiLCBURUxPUFQob3B0KSwKKyAgICAgICAgICAgICAgICAgICAgICAiIFN1Ym5lZ290aWF0aW9uIHByZW1hdHVyZWx5IGJyb2tlbiIsTlVMTAorICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICB0bl9kZWJ1Zyh0bl9tc2cpOworICAgICAgICB9CisgICAgICAgIC8qIFdhcyAtMSBidXQgdGhhdCB3b3VsZCBiZSBhbiBJL08gZXJyb3IsIHNvIGFic29yYiBpdCBhbmQgZ28gb24uICovCisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGNoYXIgKiBzWzE2XTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgc1tpXSA9ICIiOworICAgICAgICBpZiAob3B0ID09IFRFTE9QVF9OQVdTKSB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGkgPSAxOworICAgICAgICAgICAgc1swXSA9ICJVTktOT1dOIjsKKworICAgICAgICAgICAgc3dpdGNoIChzYlswXSkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgaWYgKG9wdCA9PSBURUxPUFRfRk9SV0FSRF9YKQorICAgICAgICAgICAgICAgICAgc1swXSA9ICJTQ1JFRU4iOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdCA9PSBURUxPUFRfS0VSTUlUKQorICAgICAgICAgICAgICAgICAgc1swXSA9ICJTVEFSVCI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0ID09IFRFTE9QVF9MRkxPVykKKyAgICAgICAgICAgICAgICAgIHNbMF0gPSAiT0ZGIjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHQgPT0gVEVMT1BUX0NPTVBPUlQpCisgICAgICAgICAgICAgICAgICBzWzBdID0gIlNJR05BVFVSRSI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc1swXSA9ICJJUyI7CisgICAgICAgICAgICAgICAgaWYgKG9wdCA9PSBURUxPUFRfRU5DUllQVElPTikgeworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYlsxXSA8IEVOQ1RZUEVfQ05UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzWzFdID0gZW5jdHlwZV9uYW1lc1tzYlsxXV07CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goc2JbMl0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbMl0gPSAiRkI2NF9JViI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzJdID0gIkZCNjRfSVZfT0siOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1syXSA9ICJGQjY0X0lWX0JBRCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzJdID0gIkZCNjRfQ0hBTExFTkdFIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbMl0gPSAiRkI2NF9SRVNQT05TRSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzWzFdID0gIlVOS05PV04iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvcHQgPT0gVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgc1sxXSA9IEFVVEhUWVBFX05BTUUoc2JbMV0pOworICAgICAgICAgICAgICAgICAgICBzWzJdID0gQVVUSE1PREVfTkFNRShzYlsyXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYlsxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzYlszXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzYlsxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIVFlQRV9OVExNOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIk5UTE1fQVVUSCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1szXSA9ICJBVVRIIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNiWzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVVEhUWVBFX1NTTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1szXSA9ICJTVEFSVCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIVFlQRV9OVExNOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIk5UTE1fQ0hBTExFTkdFIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIlJFSkVDVCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzYlsxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIVFlQRV9OVExNOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIk5UTE1fUkVTUE9OU0UiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiQUNDRVBUIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNiWzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVVEhUWVBFX05UTE06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiTlRMTV9BQ0NFUFQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogICAvKiBLRVJCRVJPU192NCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiAgIC8qIFNSUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIkNIQUxMRU5HRSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgIC8qIEtFUkJFUk9TX3Y1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiUkVTUE9OU0UiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVUSFRZUEVfU1NMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIlJFSkVDVCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2JbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVUSFRZUEVfTlRMTToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1szXSA9ICJOVExNX1JFSkVDVCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgIC8qIEtFUkJFUk9TX1Y0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6ICAgLyogU1JQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiUkVTUE9OU0UiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogICAvKiBLRVJCRVJPU19WNSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIkZPUldBUkQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNiWzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6ICAgLyogU1JQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiRk9SV0FSRCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgIC8qIEtFUkJFUk9TX1Y1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiRk9SV0FSRF9BQ0NFUFQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNiWzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6ICAgLyogU1JQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiRk9SV0FSRF9BQ0NFUFQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogLyogS0VSQkVST1NfVjUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1szXSA9ICJGT1JXQVJEX1JFSkVDVCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2JbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogICAvKiBTUlAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1szXSA9ICJGT1JXQVJEX1JFSkVDVCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAvKiBLRVJCRVJPU19WNSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIlRMU19WRVJJRlkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2JbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogLyogU1JQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiRVhQIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzYlsxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiAvKiBTUlAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1szXSA9ICJQQVJBTVMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfRk9SV0FSRF9YOgorICAgICAgICAgICAgICAgICAgICBzWzBdID0gIk9QRU4iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0xGTE9XOgorICAgICAgICAgICAgICAgICAgICBzWzBdID0gIk9OIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9LRVJNSVQ6CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiU1RPUCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfQ09NUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJTRVQtQkFVRFJBVEUiOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiU0VORCI7CisgICAgICAgICAgICAgICAgICAgIGhleGJ1ZlswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgbi0yOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggQVVUSFRZUEVfTkFNRV9PSyhzYltpXSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVUSE1PREVfTkFNRV9PSyhzYltpXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ttYWttc2coIHRuX21zZywgVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVUSFRZUEVfTkFNRShzYltpXSksIiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRITU9ERV9OQU1FKHNiW2krMV0pLCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBja21ha3htc2codG5fbXNnLCBUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVUSFRZUEVfTkFNRShzYltpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja2l0b2Eoc2JbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVUSE1PREVfTkFNRShzYltpKzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNraXRvYShzYltpKzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQoaGV4YnVmLHRuX21zZyxzaXplb2YoaGV4YnVmKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc1sxXSA9IGhleGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0VOQ1JZUFRJT046CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiU1VQUE9SVCI7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbi0yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzW2ldID0gZW5jdHlwZV9uYW1lc1tzYltpXV07CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX1NUQVJUX1RMUzoKKyAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJGT0xMT1dTIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzWzBdID0gIlNFTkQiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgc3dpdGNoIChvcHQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9GT1JXQVJEX1g6CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiQ0xPU0UiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0xGTE9XOgorICAgICAgICAgICAgICAgICAgICBzWzBdID0gIlJFU1RBUlQtQU5ZIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9LRVJNSVQ6CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiUkVRLVNUQVJUIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9DT01QT1JUOgorICAgICAgICAgICAgICAgICAgICBzWzBdID0gIlNFVC1EQVRBU0laRSI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfTkVXRU5WSVJPTjoKKyAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJJTkZPIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJSRVBMWSI7CisgICAgICAgICAgICAgICAgICAgIGk9NDsKKyAgICAgICAgICAgICAgICAgICAgc1sxXSA9IEFVVEhUWVBFX05BTUUoc2JbMV0pOworICAgICAgICAgICAgICAgICAgICBzWzJdID0gQVVUSE1PREVfTkFNRShzYlsyXSk7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2JbM10pIHsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNiWzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVUSFRZUEVfTlRMTToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIk5UTE1fQVVUSCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1szXSA9ICJBVVRIIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2JbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIVFlQRV9OVExNOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiTlRMTV9DSEFMTEVOR0UiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiUkVKRUNUIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2JbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIVFlQRV9OVExNOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiTlRMTV9SRVNQT05TRSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1szXSA9ICJBQ0NFUFQiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzYlsxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVVEhUWVBFX05UTE06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1szXSA9ICJOVExNX0FDQ0VQVCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVUSFRZUEVfS0VSQkVST1NfVjQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVUSFRZUEVfU1JQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiQ0hBTExFTkdFIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIVFlQRV9LRVJCRVJPU19WNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIlJFU1BPTlNFIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2JbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIVFlQRV9OVExNOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiTlRMTV9SRUpFQ1QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVVEhUWVBFX0tFUkJFUk9TX1Y0OgorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVVEhUWVBFX1NSUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIlJFU1BPTlNFIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIVFlQRV9LRVJCRVJPU19WNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIkZPUldBUkQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzYlsxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVVEhUWVBFX1NSUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIkZPUldBUkQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVVEhUWVBFX0tFUkJFUk9TX1Y1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbM10gPSAiRk9SV0FSRF9BQ0NFUFQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzYlsxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVVEhUWVBFX1NSUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIkZPUldBUkRfQUNDRVBUIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIVFlQRV9LRVJCRVJPU19WNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIkZPUldBUkRfUkVKRUNUIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2JbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIVFlQRV9TUlA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1szXSA9ICJGT1JXQVJEX1JFSkVDVCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVUSFRZUEVfS0VSQkVST1NfVjU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1szXSA9ICJUTFNfVkVSSUZZIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2JbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIVFlQRV9TUlA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1szXSA9ICJFWFAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzYlsxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVVEhUWVBFX1NSUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzNdID0gIlBBUkFNUyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0VOQ1JZUFRJT046CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiUkVQTFkiOworICAgICAgICAgICAgICAgICAgICBzWzFdID0gZW5jdHlwZV9uYW1lc1tzYlsxXV07CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzYlsyXSkgeworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNbMl0gPSAiRkI2NF9JViI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgICAgICBzWzJdID0gIkZCNjRfSVZfT0siOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgc1syXSA9ICJGQjY0X0lWX0JBRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgICAgICBzWzJdID0gIkZCNjRfQ0hBTExFTkdFIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNbMl0gPSAiRkI2NF9SRVNQT05TRSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfRk9SV0FSRF9YOgorICAgICAgICAgICAgICAgICAgICBzWzBdID0gIkRBVEEiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0xGTE9XOgorICAgICAgICAgICAgICAgICAgICBzWzBdID0gIlJFU1RBUlQtWE9OIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9LRVJNSVQ6CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiUkVRLVNUT1AiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0NPTVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJTRVQtUEFSSVRZIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgICAgICAgICBzWzBdID0gIk5BTUUiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0VOQ1JZUFRJT046CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiU1RBUlQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfRk9SV0FSRF9YOgorICAgICAgICAgICAgICAgICAgICBzWzBdID0gIk9QVElPTlMiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0tFUk1JVDoKKyAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJTT1AiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0NPTVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJTRVQtU1RPUFNJWkUiOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfRU5DUllQVElPTjoKKyAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJFTkQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0ZPUldBUkRfWDoKKyAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJPUFRJT05fREFUQSI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0VOQ1JZUFRJT046CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiUkVRVUVTVC1TVEFSVCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0NPTVBPUlQ6CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiU0VULUNPTlRST0wiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfRk9SV0FSRF9YOgorICAgICAgICAgICAgICAgICAgICBzWzBdID0gIlhPRkYiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0VOQ1JZUFRJT046CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiUkVRVUVTVC1FTkQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0NPTVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJOT1RJRlktTElORVNUQVRFIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9GT1JXQVJEX1g6CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiWE9OIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9FTkNSWVBUSU9OOgorICAgICAgICAgICAgICAgICAgICBzWzBdID0gIkVOQy1LRVlJRCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfQ09NUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICBzWzBdID0gIk5PVElGWS1NT0RFTVNUQVRFIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9LRVJNSVQ6CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiUkVTUC1TVEFSVCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfRU5DUllQVElPTjoKKyAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJERUMtS0VZSUQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0NPTVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJGTE9XQ09OVFJPTC1TVVNQRU5EIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9LRVJNSVQ6CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiUkVTUC1TVE9QIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9DT01QT1JUOgorICAgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiRkxPV0NPTlRST0wtUkVTVU1FIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9DT01QT1JUOgorICAgICAgICAgICAgICAgICAgICBzWzBdID0gIlNFVC1MSU5FU1RBVEUtTUFTSyI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHQpIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0NPTVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJTRVQtTU9ERU1TVEFURS1NQVNLIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9DT01QT1JUOgorICAgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiUFVSR0UtREFUQSI7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICBjYXNlIDEwMDoKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9DT01QT1JUOgorICAgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiU19TSUdOQVRVUkUiOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMToKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9DT01QT1JUOgorICAgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiU19TRVQtQkFVRFJBVEUiOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMjoKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9DT01QT1JUOgorICAgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiU19TRVQtREFUQVNJWkUiOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMzoKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9DT01QT1JUOgorICAgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiU19TRVQtUEFSSVRZIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDQ6CisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfQ09NUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICBzWzBdID0gIlNfU0VULVNUT1BTSVpFIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDU6CisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfQ09NUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICBzWzBdID0gIlNfU0VULUNPTlRST0wiOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwNjoKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9DT01QT1JUOgorICAgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiU19OT1RJRlktTElORVNUQVRFIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDc6CisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfQ09NUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICBzWzBdID0gIlNfTk9USUZZLU1PREVNU1RBVEUiOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwODoKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9DT01QT1JUOgorICAgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAiU19GTE9XQ09OVFJPTC1TVVNQRU5EIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDk6CisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfQ09NUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICBzWzBdID0gIlNfRkxPV0NPTlRST0wtUkVTVU1FIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTA6CisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfQ09NUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICBzWzBdID0gIlNfU0VULUxJTkVTVEFURS1NQVNLIjsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTE6CisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfQ09NUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICBzWzBdID0gIlNfU0VULU1PREVNU1RBVEUtTUFTSyI7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTEyOgorICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHQpIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0NPTVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgc1swXSA9ICJTX1BVUkdFLURBVEEiOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmZGVmIE1fWEVOSVgKKyAgICAgICAgeworICAgICAgICAgIGludCBsZW4sIHBhcmFtLCBwYXJhbV9sZW47CisgICAgICAgICAgY2ttYWttc2coIHRuX21zZywgVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgIlRFTE5FVCBSQ1ZEIFNCICIsCisgICAgICAgICAgICAgICAgICAgIFRFTE9QVChvcHQpLCIgIixOVUxMKTsKKyAgICAgICAgICBsZW4gPSBzdHJsZW4odG5fbXNnKTsKKyAgICAgICAgICBmb3IgKHBhcmFtID0gMDsgcGFyYW0gPD0gMTU7IHBhcmFtKyspIHsKKyAgICAgICAgICAgIHBhcmFtX2xlbiA9IHN0cmxlbihzW3BhcmFtXSk7CisgICAgICAgICAgICBpZiAocGFyYW1fbGVuID4gMCkgeworICAgICAgICAgICAgICBzdHJjcHkoJnRuX21zZ1tsZW5dLCBzW3BhcmFtXSk7CisgICAgICAgICAgICAgIGxlbiArPSBwYXJhbV9sZW47CisgICAgICAgICAgICAgIHRuX21zZ1tsZW4rK10gPSAnICc7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHRuX21zZ1tsZW5dID0gJ1wwJzsKKyAgICAgICAgfQorI2Vsc2UgLyogTV9YRU5JWCAqLworICAgICAgICBja21ha3htc2codG5fbXNnLFROX01TR19MRU4sIlRFTE5FVCBSQ1ZEIFNCICIsVEVMT1BUKG9wdCksIiAiLAorICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNbaV1bMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZyxzW2ldLFROX01TR19MRU4pOworICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnLCIgIixUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBNX1hFTklYICovCisgICAgICAgIHRuX2hleCgoQ0hBUiAqKXRuX21zZyxUTl9NU0dfTEVOLCZzYltpXSxuLTItaSk7CisgICAgICAgIGlmIChmbGFnID09IDIpCisgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiIFNFIixUTl9NU0dfTEVOKTsKKyAgICAgICAgZWxzZSBpZiAoZmxhZyA9PSAzKQorICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csIiBJQUMgRE9OVCIsVE5fTVNHX0xFTik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBja3N0cm5jYXQodG5fbXNnLCIgSUFDIFNFIixUTl9NU0dfTEVOKTsKKyAgICAgICAgZGVidWcoRjEwMCx0bl9tc2csIiIsMCk7CisgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgIHRuX2RlYnVnKHRuX21zZyk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsInRuX3NiIiwibGVuIixuKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgICpsZW4gPSBuOyAgICAgICAgICAgLyogcmV0dXJuIGxlbmd0aCAqLworICAgIHJldHVybigxKTsgICAgICAgICAgLyogc3VjY2VzcyAqLworfQorCitzdGF0aWMgY2hhciByb3dzX2J1ZlsxNl0gPSB7IDAsIDAgfTsgLyogTElORVMgRW52aXJvbm1lbnQgdmFyaWFibGUgKi8KK3N0YXRpYyBjaGFyIGNvbHNfYnVmWzE2XSA9IHsgMCwgMCB9OyAvKiBDT0xVTU5TIEVudmlvcm5tZW50IHZhcmlhYmxlICovCitzdGF0aWMgY2hhciB0ZXJtX2J1Zls2NF0gPSB7IDAsIDAgfTsgLyogVEVSTSBFbnZpcm9ubWVudCB2YXJpYWJsZSAqLworCisjaWZkZWYgQ0tfQ1VSU0VTCisjaWZuZGVmIFZNUworI2lmbmRlZiBDT0hFUkVOVAorX1BST1RPVFlQKGludCB0Z2V0ZW50LChjaGFyICosIGNoYXIgKikpOworI2VuZGlmIC8qIENPSEVSRU5UICovCisjZWxzZQorI2lmZGVmIF9fREVDQworX1BST1RPVFlQKGludCB0Z2V0ZW50LChjaGFyICosIGNoYXIgKikpOworI2VuZGlmIC8qIF9fREVDQyAqLworI2VuZGlmIC8qIFZNUyAqLworZXh0ZXJuIGNoYXIgKiB0cm1idWY7ICAgICAgICAgICAgICAgICAgIC8qIFJlYWwgY3Vyc2VzICovCisjZW5kaWYgLyogQ0tfQ1VSU0VTICovCisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCitzdGF0aWMgaW50Cit0bl9ub19lbmNyeXB0KCkKK3sKKyAgICAvKiBQcmV2ZW50IEVuY3J5cHRpb24gZnJvbSBiZWluZyBuZWdvdGlhdGVkICovCisgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKworICAgIC8qIENhbmNlbCBhbnkgbmVnb3RpYXRpb24gdGhhdCBtaWdodCBoYXZlIHN0YXJ0ZWQgKi8KKyAgICBja190bl9lbmNfc3RvcCgpOworCisgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfRU5DUllQVElPTikgfHwKKyAgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoVEVMT1BUX0VOQ1JZUFRJT04pKSB7CisgICAgICAgIFRFTE9QVF9NRShURUxPUFRfRU5DUllQVElPTikgPSAwOworICAgICAgICBpZiAodG5fc29wdChXT05ULFRFTE9QVF9FTkNSWVBUSU9OKSA8IDApCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XT05UKFRFTE9QVF9FTkNSWVBUSU9OKSA9IDE7CisgICAgfQorICAgIGlmIChURUxPUFRfVShURUxPUFRfRU5DUllQVElPTikgfHwKKyAgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX0RPKFRFTE9QVF9FTkNSWVBUSU9OKSkgeworICAgICAgICBURUxPUFRfVShURUxPUFRfRU5DUllQVElPTikgPSAwOworICAgICAgICBpZiAodG5fc29wdChET05ULFRFTE9QVF9FTkNSWVBUSU9OKSA8IDApCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ET05UKFRFTE9QVF9FTkNSWVBUSU9OKSA9IDE7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisKKy8qIFRoZSBmb2xsb3dpbmcgbm90ZSBjYW1lIGZyb20gdGhlIG9sZCBTR0EgbmVnb3RpYXRpb24gY29kZS4gIFRoaXMgc2hvdWxkICovCisvKiBubyBsb25nZXIgYmUgbmVjZXNzYXJ5IHdpdGggdGhlIE5ldyBUZWxuZXQgbmVnb3RpYXRpb24gc3RhdGUgbWFjaGluZS4gICAqLworLyoKKyAgTm90ZTogVGhlIGZvbGxvd2luZyBpcyBwcm9wZXIgYmVoYXZpb3IsIGFuZCByZXF1aXJlZCBmb3IgdGFsa2luZyB0byB0aGUKKyAgQXBlcnR1cyBpbnRlcmZhY2UgdG8gdGhlIE5PVElTIGxpYnJhcnkgc3lzdGVtLCBlLmcuIGF0IElvd2EgU3RhdGUgVToKKyAgc2Nob2xhci5pYXN0YXRlLmVkdS4gIFdpdGhvdXQgdGhpcyByZXBseSwgdGhlIHNlcnZlciBoYW5ncyBmb3JldmVyLiAgVGhpcworICBjb2RlIHNob3VsZCBub3QgYmUgbG9vcC1pbmR1Y2luZywgc2luY2UgQy1LZXJtaXQgbmV2ZXIgc2VuZHMgV0lMTCBTR0EgYXMKKyAgYW4gaW5pdGlhbCBiaWQsIHNvIGlmIERPIFNHQSBjb21lcywgaXQgaXMgbmV2ZXIgYW4gQUNLLgorKi8KKy8qCisgIFJldHVybiB2YWx1ZXM6CisgIC0xID0gVGVsbmV0IE9wdGlvbiBuZWdvdGlhdGlvbiBlcnJvcgorICAtMiA9IENvbm5lY3Rpb24gY2xvc2VkIGJ5IHBlZXIKKyAgLTMgPSBDb25uZWN0aW9uIGNsb3NlZCBieSB1cworICAwICA9IFN1Y2Nlc3MKKyAgMSAgPSBFY2hvaW5nIG9uCisgIDIgID0gRWNob2luZyBvZmYKKyAgMyAgPSBRdW90ZWQgSUFDCisgIDQgID0gSUtTIEV2ZW50CisgIDUgID0gKHVuYXNzaWduZWQpCisgIDYgID0gTG9nb3V0CisqLworCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEVMTkVUIERPIE9QVElPTiAqLwordG5feGRvb3AoQ0hBUiB6LCBpbnQgZWNobywgaW50ICgqZm4pKGludCkpCisjZWxzZQordG5feGRvb3AoeiwgZWNobywgZm4pIENIQVIgejsgaW50IGVjaG87IGludCAoKmZuKSgpOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bl94ZG9vcCAqLyB7CisgICAgaW50IGMsIHgsIHksIG4sIG07CisjaWZkZWYgSUtTX09QVElPTgorICAgIGV4dGVybiBpbnQgc2VydmVyOworI2lmZGVmIE5PSUNQCisgICAgZXh0ZXJuIGludCBhdXRvZGw7CisgICAgaW50IGluYXV0b2RsID0gMCwgY21kYWRsID0gMTsKKyNlbHNlCisjaWZkZWYgQ0tfQVVUT0RMCisgICAgZXh0ZXJuIGludCBhdXRvZGwsIGluYXV0b2RsLCBjbWRhZGw7CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisKKworLyogSGF2ZSBJQUMsIHJlYWQgY29tbWFuZCBjaGFyYWN0ZXIuICovCisKKyAgICB3aGlsZSAoKGMgPSAoKmZuKSgwKSkgPT0gLTEpOyAgICAgICAvKiBSZWFkIGNvbW1hbmQgY2hhcmFjdGVyICovCisgICAgaWYgKGMgPCAwKQorICAgICAgcmV0dXJuKGMpOworICAgIGMgJj0gMHhGRjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0cmlwIGhpZ2ggYml0cyAqLworCisgICAgaWYgKCFURUxDTURfT0soYykpIHsKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcyB8fCBkZWJsb2cpIHsKKyAgICAgICAgICAgIGNrbWFrbXNnKHRuX21zZyxUTl9NU0dfTEVOLCJURUxORVQgUkNWRCBVTktOT1dOICgiLAorICAgICAgICAgICAgICAgICAgICAgY2tpdG9hKGMpLCIpIixOVUxMKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsdG5fbXNnLCIiLGMpOworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgIHRuX2RlYnVnKHRuX21zZyk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGlmICh0dG5wcm90byA9PSBOUF9OT05FKSB7CisgICAgICAgIGRlYnVnKEYxMDAsInRuX2Rvb3AgZGlzY292ZXJlZCBhIFRlbG5ldCBjb21tYW5kIiwKKyAgICAgICAgICAgICAgInR0bnByb3RvID0gTlBfVEVMTkVUIiwwKTsKKyAgICAgICAgdHRucHJvdG8gPSBOUF9URUxORVQ7CisgICAgfQorICAgIGlmIChzZXNsb2cgJiYgc2Vzc2Z0ID09IFhZRlRfRCkgeyAgIC8qIENvcHkgdG8gc2Vzc2lvbiBsb2csIGlmIGFueS4gKi8KKyAgICAgICAgbG9nY2hhcigoY2hhcil6KTsKKyAgICAgICAgbG9nY2hhcigoY2hhciljKTsKKyAgICB9CisKKyAgICBpZiAoYyA9PSAoQ0hBUikgSUFDKSAgICAgICAgICAgICAgICAvKiBRdW90ZWQgSUFDICovCisgICAgICByZXR1cm4oMyk7CisKKyAgICBpZiAoYyA8IFNCKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBPdGhlciBjb21tYW5kIHdpdGggbm8gYXJndW1lbnRzLiAqLworI2lmZGVmIERFQlVHCisgICAgICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICAgICAgY2ttYWttc2codG5fbXNnLFROX01TR19MRU4sIlRFTE5FVCBSQ1ZEICIsVEVMQ01EKGMpLE5VTEwsTlVMTCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLHRuX21zZywiIixjKTsKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgICAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgc3dpdGNoIChjKSB7ICAgICAgICAgICAgICAgICAgICAvKiBXaGF0IHdlIHdvdWxkIGxpa2UgdG8gZG8gaGVyZSAgICAqLworICAgICAgICAgIGNhc2UgVE5fR0E6ICAgICAgICAgICAgICAgICAgIC8qIElzIHN1YnN0aXR1dGUgQVNDSUkgY2hhcmFjdGVycyAgICovCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIHRoZSBUZWxuZXQgQ29tbWFuZCBzbyB0aGF0ICAgKi8KKyAgICAgICAgICBjYXNlIFROX0VMOiAgICAgICAgICAgICAgICAgICAvKiB0aGUgY29tbWFuZCBtYXkgYmUgcHJvY2Vzc2VkIGJ5ICAqLworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgIC8qIGVpdGhlciB0aGUgaW50ZXJuYWwgZW11bGF0b3Igb3IgICovCisgICAgICAgICAgY2FzZSBUTl9FQzogICAgICAgICAgICAgICAgICAgLyogYnkgdGhlIHN1cGVyaW9yIHByb2Nlc3Mgb3Igc2hlbGwgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVE5fQVlUOgorI2lmZGVmIE9TMgorICAgICAgICAgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyAgICAgICAgICAgIHR0b2woKENIQVIgKikiW1llc11cMDE1XDAxMiIsNyk7CisjaWZkZWYgT1MyCisgICAgICAgICAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTl9BTzoKKyNpZmRlZiBCRVRBREVCVUcKKyAgICAgICAgICAgIGJsZWVwKEJQX05PVEUpOworI2VuZGlmIC8qIEJFVEFERUJVRyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTl9JUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQlJFQUs6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFROX0RNOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTl9OT1A6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTl9FT1I6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFROX0FCT1JUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTl9TVVNQOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTl9FT0Y6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFROX1NBSzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKy8qIFNCLCBXSUxMLCBXT05ULCBETywgb3IgRE9OVCBuZWVkIG1vcmUgYnl0ZXMuLi4gKi8KKworICAgIGlmICgoeCA9ICgqZm4pKDApKSA8IDApICAgICAgICAgICAgIC8qIEdldCB0aGUgb3B0aW9uLiAqLworICAgICAgcmV0dXJuKHgpOworICAgIHggJj0gMHhmZjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyaW0gdG8gOCBiaXRzLiAqLworCisgICAgaWYgKHNlc2xvZyAmJiBzZXNzZnQgPT0gWFlGVF9EKSB7ICAgLyogU2Vzc2lvbiBsb2cgKi8KKyAgICAgICAgbG9nY2hhcigoY2hhcikgeCk7CisgICAgfQorI2lmZGVmIERFQlVHCisgICAgaWYgKChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgJiYgYyAhPSBTQikgeworICAgICAgICBja21ha21zZyh0bl9tc2csVE5fTVNHX0xFTiwiVEVMTkVUIFJDVkQgIixURUxDTUQoYyksIiAiLFRFTE9QVCh4KSk7CisgICAgICAgIGRlYnVnKEYxMDEsdG5fbXNnLCIiLHgpOworICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAvKiBOb3cgaGFuZGxlIHRoZSBjb21tYW5kICovCisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIFdJTEw6CisjaWZkZWYgQ0tfU1NMCisgICAgICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpCisgICAgICAgICAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgQ0tfRk9SV0FSRF9YCisgICAgICAgICAgaWYgKHggPT0gVEVMT1BUX0ZPUldBUkRfWCkgeworICAgICAgICAgICAgICBpZiAoIWZ3ZHhfc2VydmVyX2F2YWlsKCkgfHwgIShmd2R4X25vX2VuY3J5cHQgfHwKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAgKHNzbF9hY3RpdmVfZmxhZyB8fCB0bHNfYWN0aXZlX2ZsYWcpCisjZWxzZSAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICAgMAorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICAgICB8fAorI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgICAgICAgKGNrX3RuX2VuY3J5cHRpbmcoKSAmJiBja190bl9kZWNyeXB0aW5nKCkpCisjZWxzZSAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICAgICAgIDAKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICAgICAgICkpIHsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0ZPUldBUkRfWCkgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9GT1JXQVJEX1gpID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfRk9SV0FSRF9YICovCisgICAgICAgIGlmICghVEVMT1BUX09LKHgpIHx8IFRFTE9QVF9VX01PREUoeCkgPT0gVE5fTkdfUkYpIHsKKyAgICAgICAgICAgIGlmICh0bl9zb3B0KERPTlQseCkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgaWYgKFRFTE9QVF9VTkFOU1dFUkVEX0RPKHgpKQorICAgICAgICAgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX0RPKHgpID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICghVEVMT1BUX1UoeCkpIHsKKyAgICAgICAgICAgIGlmICghVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodG5fc29wdChETyx4KSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkpCisgICAgICAgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkgPSAwOworICAgICAgICAgICAgVEVMT1BUX1UoeCkgPSAxOworCisgICAgICAgICAgICBzd2l0Y2ggKHgpIHsKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgY2FzZSBURUxPUFRfU1RBUlRfVExTOgorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgSWYgbXkgcHJvcG9zYWwgaXMgYWNjZXB0ZWQsIGF0IHRoaXMgcG9pbnQgdGhlIFRlbG5ldAorICAgICAgICAgICAgICAgICAgIHByb3RvY29sIGlzIHR1cm5lZCBvZmYgYW5kIGEgVExTIG5lZ290aWF0aW9uIHRha2VzCisgICAgICAgICAgICAgICAgICAgcGxhY2UuCisKKyAgICAgICAgICAgICAgICAgICBTdGFydCBieSBzZW5kaW5nIFNCIFNUQVJUX1RMUyBGT0xMT1dTICB0byBzaWduYWwKKyAgICAgICAgICAgICAgICAgICB3ZSBhcmUgcmVhZHkuICBXYWl0IGZvciB0aGUgcGVlciB0byBzZW5kIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gc3RhcnQgdGhlIFRMUyBuZWdvdGlhdGlvbi4KKworICAgICAgICAgICAgICAgICAgIElmIHRoZSBUTFMgbmVnb3RpYXRpb24gc3VjY2VlZHMgd2UgY2FsbCB0bl9pbmkoKQorICAgICAgICAgICAgICAgICAgIGFnYWluIHRvIHJlc2V0IHRoZSB0ZWxuZXQgc3RhdGUgbWFjaGluZSBhbmQgcmVzdGFydAorICAgICAgICAgICAgICAgICAgIHRoZSBuZWdvdGlhdGlvbiBwcm9jZXNzIG92ZXIgdGhlIG5vdyBzZWN1cmUgbGluay4KKworICAgICAgICAgICAgICAgICAgIElmIHRoZSBUTFMgbmVnb3RpYXRpb24gZmFpbHMsIHdlIGNhbGwgdHRjbG9zKCkKKyAgICAgICAgICAgICAgICAgICB0byB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24uCisKKyAgICAgICAgICAgICAgICAgICBPbmx5IHRoZSBzZXJ2ZXIgc2hvdWxkIHJlY2VpdmUgYSBXSUxMIFNUQVJUX1RMUworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHRuX3NzYm9wdChURUxPUFRfU1RBUlRfVExTLDEsTlVMTCwwKTsKKyAgICAgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX1NTTCAqLworCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICAgICAgICAgICAgY2FzZSBURUxPUFRfQVVUSEVOVElDQVRJT046IHsKKyAgICAgICAgICAgICAgICAgIC8qIFdlIG5vdyBoYXZlIHRvIHBlcmZvcm0gYSBTQiBTRU5EIHRvIGlkZW50aWZ5IHRoZSAgKi8KKyAgICAgICAgICAgICAgICAgIC8qIHN1cHBvcnRlZCBhdXRoZW50aWNhdGlvbiB0eXBlcyB0byB0aGUgb3RoZXIgc2lkZS4gKi8KKyAgICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgYXV0aGVudGljYXRpb25fdmVyc2lvbjsKKworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICAgICAgLyogaWYgd2UgaGF2ZSBhbiBvdXRzdGFuZGluZyBETyBTVEFSVF9UTFMgdGhlbiB3ZSBtdXN0IAorICAgICAgICAgICAgICAgICAgICogd2FpdCBmb3IgdGhlIHJlc3BvbnNlIGJlZm9yZSB3ZSBkZXRlcm1pbmUgd2hhdCB0byBkbworICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBpZiAoVEVMT1BUX1VOQU5TV0VSRURfRE8oVEVMT1BUX1NUQVJUX1RMUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLmF1dGhfcmVxdWVzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl92ZXJzaW9uID0gQVVUSFRZUEVfQVVUTzsKKyAgICAgICAgICAgICAgICAgIGNrX3RuX2F1dGhfcmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgICAgY2FzZSBURUxPUFRfRU5DUllQVElPTjoKKyAgICAgICAgICAgICAgICBpZiAoIShURUxPUFRfTUUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSB8fAorICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VKFRFTE9QVF9BVVRIRU5USUNBVElPTikpCisgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBpZiAodG5fc29wdChET05ULHgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgICAgICBURUxPUFRfVSh4KSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNrX3RuX2F1dGhfaW5fcHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9FTkNSWVBUSU9OKS5lbmNyeXB0Lm5lZWRfdG9fc2VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZXJmb3JtIHN1Ym5lZ290aWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBja19lbmNyeXB0X3NlbmRfc3VwcG9ydCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghKFRFTE9QVF9NRSh4KSB8fCBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKHgpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgVEVMT1BUX01FX01PREUoeCkgIT0gVE5fTkdfUkYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bl9zb3B0KFdJTEwsIHgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoeCkgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0tFUk1JVDoKKyAgICAgICAgICAgICAgICBpZiAoIVRFTE9QVF9NRSh4KSkgeworICAgICAgICAgICAgICAgICAgICAvKiBUZWxsIHRoZSBvdGhlciBzaWRlIHdoYXQgU3RhcnQgb2YgUGFja2V0IENoYXJhY3RlciAqLworICAgICAgICAgICAgICAgICAgICB0bl9zaWtzKEtFUk1JVF9TT1ApOyAvKiBTT1AgKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoIVRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoeCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKHgpICE9IFROX05HX1JGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG5fc29wdChXSUxMLCB4KSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKHgpID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0JJTkFSWToKKyAgICAgICAgICAgICAgICBpZiAoIVRFTE9QVF9NRSh4KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIVRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoeCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKHgpID49IFROX05HX1JRKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG5fc29wdChXSUxMLCB4KSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKHgpID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBURUxPUFRfRUNITzoKKyAgICAgICAgICAgICAgICBpZiAoZWNobykgeworICAgICAgICAgICAgICAgICAgICBpZiAoVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkpCisgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkgPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9UVFlQRToKKyAgICAgICAgICAgICAgICAvKiBTQiBUVFlQRSBTRU5EICovCisgICAgICAgICAgICAgICAgdG5fc3Nib3B0KFRFTE9QVF9UVFlQRSxURUxRVUFMX1NFTkQsTlVMTCwwKTsKKyAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9TQihURUxPUFRfVFRZUEUpPTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgQ0tfRU5WSVJPTk1FTlQKKyAgICAgICAgICAgICAgY2FzZSBURUxPUFRfTkVXRU5WSVJPTjogICAvKiBTQiBORVctRU5WSVJPTiBTRU5EICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2hhciByZXF1ZXN0WzZdOyAgICAgIC8qIHJlcXVlc3QgaXQgKi8KKyAgICAgICAgICAgICAgICAgIHNwcmludGYocmVxdWVzdCwiJWNVU0VSIixURUxfRU5WX1ZBUik7ICAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICAgICAgICB0bl9zc2JvcHQoVEVMT1BUX05FV0VOVklST04sVEVMUVVBTF9TRU5ELHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHJlcXVlc3QpKTsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX1NCKFRFTE9QVF9ORVdFTlZJUk9OKT0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19FTlZJUk9OTUVOVCAqLworICAgICAgICAgICAgfSAvKiBzd2l0Y2ggKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChURUxPUFRfVU5BTlNXRVJFRF9ETyh4KSkKKyAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ETyh4KSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdPTlQ6CisjaWZkZWYgQ0tfU1NMCisgICAgICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpCisgICAgICAgICAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgIGlmIChURUxPUFRfVSh4KSB8fCBURUxPUFRfVU5BTlNXRVJFRF9ETyh4KSkgeworICAgICAgICAgICAgLyogRGF2aWQgQm9ybWFuIHNheXMgd2Ugc2hvdWxkIG5vdCByZXNwb25kIERPTlQgd2hlbgorICAgICAgICAgICAgICogdGhlIFdPTlQgaXMgYSByZXNwb25zZSB0byBhIERPIHRoYXQgd2Ugc2VudC4KKyAgICAgICAgICAgICAqIE5vciBzaG91bGQgd2Ugc2VuZCBvbmUgaWYgdGhlIHN0YXRlIGlzIGFscmVhZHkgV09OVAorICAgICAgICAgICAgICogc3VjaCBhcyB3aGVuIHdlIGRvIG5vdCByZWNvZ25pemUgdGhlIG9wdGlvbiBzaW5jZQorICAgICAgICAgICAgICogb3B0aW9ucyBhcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIFdPTlQvRE9OVCBzdGF0ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCEoVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkgfHwgVEVMT1BUX1VOQU5TV0VSRURfRE9OVCh4KSkpCisgICAgICAgICAgICAgIGlmICh0bl9zb3B0KERPTlQseCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICBpZiAoVEVMT1BUX1VOQU5TV0VSRURfRE9OVCh4KSkKKyAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ET05UKHgpID0gMDsKKyAgICAgICAgICAgIGlmIChURUxPUFRfVU5BTlNXRVJFRF9ETyh4KSkKKyAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ETyh4KSA9IDA7CisgICAgICAgICAgICBpZiAoVEVMT1BUX1UoeCkpIHsKKyAgICAgICAgICAgICAgICBURUxPUFRfVSh4KSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2goeCkgeworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgY2FzZSBURUxPUFRfU1RBUlRfVExTOgorICAgICAgICAgICAgICAgIGlmIChzc3RlbG5ldCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoVEVMT1BUX1VfTU9ERSh4KSA9PSBUTl9OR19NVSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJUZWxuZXQgU3RhcnQtVExTIHJlZnVzZWQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0Y2xvcygwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoeWNsb3NlZCA9IFdDX1RFTE9QVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFRFTE9QVF9TQih4KS5zdGFydF90bHMuYXV0aF9yZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm4gaW50IGF1dGhlbnRpY2F0aW9uX3ZlcnNpb247CisgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfU0IoeCkuc3RhcnRfdGxzLmF1dGhfcmVxdWVzdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl92ZXJzaW9uID0gQVVUSFRZUEVfQVVUTzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrX3RuX2F1dGhfcmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgICAgIGlmIChzc3RlbG5ldCAmJiBURUxPUFRfVV9NT0RFKHgpID09IFROX05HX01VKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiVGVsbmV0IGF1dGhlbnRpY2F0aW9uIHJlZnVzZWQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgdHRjbG9zKDApOworICAgICAgICAgICAgICAgICAgICB3aHljbG9zZWQgPSBXQ19URUxPUFQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtMyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChURUxPUFRfVV9NT0RFKHgpID09IFROX05HX1JRKSB7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoeCkgPSBUTl9OR19BQzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNrX3RuX2F1dGhfaW5fcHJvZ3Jlc3MoKSkKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiVGVsbmV0IGF1dGhlbnRpY2F0aW9uIHJlZnVzZWQuXG4iKTsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgaWYgKHNzdGVsbmV0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bl9ub19lbmNyeXB0KCk8MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgICAgY2FzZSBURUxPUFRfRU5DUllQVElPTjoKKyAgICAgICAgICAgICAgICBja190bl9lbmNfc3RvcCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0tFUk1JVDoKKyAgICAgICAgICAgICAgICBURUxPUFRfU0IoeCkua2VybWl0LnVfc3RhcnQgPSAwOworICAgICAgICAgICAgICAgIFRFTE9QVF9TQih4KS5rZXJtaXQubWVfcmVxX3N0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICBURUxPUFRfU0IoeCkua2VybWl0Lm1lX3JlcV9zdG9wID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX05BV1M6IHsKKyAgICAgICAgICAgICAgICAgIC8qIFRoZSBjbGllbnQgZG9lcyBub3Qgc3VwcG9ydCBOQVdTLiAqLworICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIGEgaGVpZ2h0IG9mIDI0IGFuZCBhIHdpZHRoIG9mIDgwICovCisgICAgICAgICAgICAgICAgICBpZiAoc3N0ZWxuZXQKKyNpZmRlZiBJS1NECisgICAgICAgICAgICAgICAgICAgfHwgaW5zZXJ2ZXIKKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgaW50IHcgPSA4MCwgaCA9IDI0OworI2lmbmRlZiBOT0xPQ0FMCisgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjcF9pbmNvbWluZykgeworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICAgICB0dF9jb2xzW1ZURVJNXSA9IHc7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHR0X3Jvd3NbVlRFUk1dID0gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVnNjcm5TZXRXaWR0aChWVEVSTSwgdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFZzY3JuU2V0SGVpZ2h0KFZURVJNLCBoKyh0dF9zdGF0dXNbVlRFUk1dPzE6MCkpOworI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR0X2NvbHMgPSB3OworICAgICAgICAgICAgICAgICAgICAgICAgICB0dF9yb3dzID0gaDsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICAgICB0dF9jb2xzW1ZDTURdID0gdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHRfcm93c1tWQ01EXSA9IGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFZzY3JuU2V0V2lkdGgoVkNNRCwgdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFZzY3JuU2V0SGVpZ2h0KFZDTUQsIGgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRfY29scyA9IHc7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZF9yb3dzID0gaDsKKyAgICAgICAgICAgICAgICAgICAgICB9CisjZWxzZSAvKiBOT0xPQ0FMICovCisgICAgICAgICAgICAgICAgICAgICAgY21kX2NvbHMgPSB3OworICAgICAgICAgICAgICAgICAgICAgIGNtZF9yb3dzID0gaDsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgICAgICAgICAgICAgICAgICAgLyogQWRkIExJTkVTIGFuZCBDT0xVTU5TIHRvIHRoZSBlbnZpcm9ubWVudCAqLworICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKChjaGFyICopcm93c19idWYsMTYsIkxJTkVTPSIsY2tpdG9hKGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKChjaGFyICopY29sc19idWYsMTYsIkNPTFVNTlM9Iixja2l0b2EodyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCk7CisjaWZkZWYgT1MyT1JVTklYCisjaWZuZGVmIE5PUFVURU5WCisgICAgICAgICAgICAgICAgICAgICAgcHV0ZW52KHJvd3NfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICBwdXRlbnYoY29sc19idWYpOworI2VuZGlmIC8qIE5PUFVURU5WICovCisjZW5kaWYgLyogT1MyT1JVTklYICovCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9FQ0hPOgorICAgICAgICAgICAgICAgIGlmICghZWNobykgeworICAgICAgICAgICAgICAgICAgICBpZiAoVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkpCisgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkgPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKFRFTE9QVF9VTkFOU1dFUkVEX0RPTlQoeCkpCisgICAgICAgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE9OVCh4KSA9IDA7CisgICAgICAgICAgICBpZiAoVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkpCisgICAgICAgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChURUxPUFRfVV9NT0RFKHgpID09IFROX05HX01VKSB7CisgICAgICAgICAgICBja21ha21zZyggdG5fbXNnLFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAgICAgIlBlZXIgcmVmdXNlcyBURUxORVQgRE8gIixURUxPUFQoeCksCisgICAgICAgICAgICAgICAgICAgICAgIiBuZWdvdGlhdGlvbnMgLSB0ZXJtaW5hdGluZyBjb25uZWN0aW9uIixOVUxMCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLHRuX21zZywiIiwwKTsKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgICAgICAgICAgcHJpbnRmKCIlc1xuIix0bl9tc2cpOworICAgICAgICAgICAgdHRjbG9zKDApOworICAgICAgICAgICAgd2h5Y2xvc2VkID0gV0NfVEVMT1BUOworICAgICAgICAgICAgcmV0dXJuKC0zKTsKKyAgICAgICAgfQorI2lmZGVmIENPTU1FTlQKKyAgICAgICAgaWYgKHggPT0gVEVMT1BUX0VDSE8gJiYgIWVjaG8pIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGVjaG8gKi8KKyAgICAgICAgICByZXR1cm4oMSk7ICAgICAgICAgICAgICAgICAgIC8qIGJlY2F1c2Ugd2UgYWxsb3cgJ2R1cGxleCcgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIERPOgorI2lmZGVmIENLX1NTTAorICAgICAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKQorICAgICAgICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICBpZiAoIVRFTE9QVF9PSyh4KSB8fCBURUxPUFRfTUVfTU9ERSh4KSA9PSBUTl9OR19SRikgeworICAgICAgICAgICAgaWYgKHRuX3NvcHQoV09OVCx4KSA8IDApCisgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICBpZiAoVEVMT1BUX1VOQU5TV0VSRURfV0lMTCh4KSkKKyAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKHgpID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICghVEVMT1BUX01FKHgpKSB7CisgICAgICAgICAgICBpZiAoIVRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoeCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodG5fc29wdChXSUxMLHgpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVEVMT1BUX1VOQU5TV0VSRURfV0lMTCh4KSkKKyAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKHgpID0gMDsKKyAgICAgICAgICAgIFRFTE9QVF9NRSh4KSA9IDE7CisKKyAgICAgICAgICAgIHN3aXRjaCAoeCkgeworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9TVEFSVF9UTFM6CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICBJZiBteSBwcm9wb3NhbCBpcyBhY2NlcHRlZCBhdCB0aGlzIHBvaW50IHRoZSBUZWxuZXQKKyAgICAgICAgICAgICAgICAgICBwcm90b2NvbCBpcyB0dXJuZWQgb2ZmIGFuZCBhIFRMUyBuZWdvdGlhdGlvbiB0YWtlcworICAgICAgICAgICAgICAgICAgIHBsYWNlLgorCisgICAgICAgICAgICAgICAgICAgU3RhcnQgYnkgc2VuZGluZyBTQiBTVEFSVF9UTFMgRk9MTE9XUyAgdG8gc2lnbmFsCisgICAgICAgICAgICAgICAgICAgd2UgYXJlIHJlYWR5LiAgV2FpdCBmb3IgdGhlIHBlZXIgdG8gc2VuZCB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIHN0YXJ0IHRoZSBUTFMgbmVnb3RpYXRpb24uCisKKyAgICAgICAgICAgICAgICAgICBJZiB0aGUgVExTIG5lZ290aWF0aW9uIHN1Y2NlZWRzIHdlIGNhbGwgdG5faW5pKCkKKyAgICAgICAgICAgICAgICAgICBhZ2FpbiB0byByZXNldCB0aGUgdGVsbmV0IHN0YXRlIG1hY2hpbmUgYW5kIHJlc3RhcnQKKyAgICAgICAgICAgICAgICAgICB0aGUgbmVnb3RpYXRpb24gcHJvY2VzcyBvdmVyIHRoZSBub3cgc2VjdXJlIGxpbmsuCisKKyAgICAgICAgICAgICAgICAgICBJZiB0aGUgVExTIG5lZ290aWF0aW9uIGZhaWxzLCB3ZSBjYWxsIHR0Y2xvcygpCisgICAgICAgICAgICAgICAgICAgdG8gdGVybWluYXRlIHRoZSBjb25uZWN0aW9uLiAgVGhlbiB3ZSBzZXQgdGhlCisgICAgICAgICAgICAgICAgICAgVV9NT0RFIGFuZCBNRV9NT0RFIGZvciBURUxPUFRfU1RBUlRfVExTIHRvIFJFRlVTRQorICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGNhbGwgdHRvcGVuKCkgdG8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICB0byB0aGUgc2FtZSBob3N0IGJ1dCB0aGlzIHRpbWUgZG8gbm90IGF0dGVtcHQKKyAgICAgICAgICAgICAgICAgICBUTFMgc2VjdXJpdHkuCisKKyAgICAgICAgICAgICAgICAgICBPbmx5IHRoZSBjbGllbnQgc2hvdWxkIHJlY2VpdmUgRE8gU1RBUlRfVExTLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgdG5fc3Nib3B0KFRFTE9QVF9TVEFSVF9UTFMsMSxOVUxMLDApOworICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cyA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9BVVRIRU5USUNBVElPTjogeworICAgICAgICAgICAgICAgICAgLyogV2UgZG9uJ3Qga25vdyB3aGF0IGF1dGhlbnRpY2F0aW9uIHdlIGFyZSB1c2luZyB5ZXQgKi8KKyAgICAgICAgICAgICAgICAgIC8qIGJ1dCBpdCBpcyBub3QgTlVMTCB1bnRpbCBhIGZhaWx1cmUgaXMgZGV0ZWN0ZWQgc28gKi8KKyAgICAgICAgICAgICAgICAgIC8qIHVzZSBBVVRPIGluIHRoZSBtZWFudGltZS4gKi8KKyAgICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgYXV0aGVudGljYXRpb25fdmVyc2lvbjsKKyAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gPSBBVVRIVFlQRV9BVVRPOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgICAgY2FzZSBURUxPUFRfRU5DUllQVElPTjoKKyAgICAgICAgICAgICAgICBpZiAoIShURUxPUFRfTUUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSB8fAorICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VKFRFTE9QVF9BVVRIRU5USUNBVElPTikpCisgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBpZiAodG5fc29wdChXT05ULHgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgICAgICBURUxPUFRfTUUoeCkgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKFRFTE9QVF9VKHgpIHx8IFRFTE9QVF9VTkFOU1dFUkVEX0RPKHgpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgVEVMT1BUX1VfTU9ERSh4KSAhPSBUTl9OR19SRikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRuX3NvcHQoRE8sIHgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX0RPKHgpID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9LRVJNSVQ6CisvKiBJZiBjdXJyZW50bHkgcHJvY2Vzc2luZyBLZXJtaXQgc2VydmVyIHBhY2tldHMsIG11c3QgdGVsbCB0aGUgb3RoZXIgc2lkZSAqLworCisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwidG5fZG9vcCIsIndoYXQiLHdoYXQpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInRuX2Rvb3AiLCJzZXJ2ZXIiLHNlcnZlcik7CisjaWZkZWYgQ0tfQVVUT0RMCisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwidG5fZG9vcCIsImF1dG9kbCIsYXV0b2RsKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ0bl9kb29wIiwiaW5hdXRvZGwiLGluYXV0b2RsKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ0bl9kb29wIiwiY21kYWRsIixjbWRhZGwpOworI2VuZGlmIC8qIENLX0FVVE9ETCAqLworCisgICAgICAgICAgICAgICAgaWYgKHNlcnZlcgorI2lmZGVmIENLX0FVVE9ETAorICAgICAgICAgICAgICAgICAgICB8fCAobG9jYWwgJiYgKCh3aGF0ID09IFdfQ09OTkVDVCAmJiBhdXRvZGwpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoYXQgIT0gV19DT05ORUNUICYmIGluYXV0b2RsKSkpCisgICAgICAgICAgICAgICAgICAgIHx8ICghbG9jYWwgJiYgY21kYWRsKQorI2VuZGlmIC8qIENLX0FVVE9ETCAqLworICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgdG5fc2lrcyhLRVJNSVRfU1RBUlQpOyAgICAgIC8qIFNUQVJUICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghVEVMT1BUX1UoeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGVsbCB0aGUgb3RoZXIgc2lkZSB3aGF0IFN0YXJ0IG9mIFBhY2tldCBDaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgdG5fc2lrcyhLRVJNSVRfU09QKTsgICAgICAgICAgICAgLyogU09QICovCisgICAgICAgICAgICAgICAgICAgIGlmICghVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoeCkgIT0gVE5fTkdfUkYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bl9zb3B0KERPLCB4KSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ETyh4KSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCisgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0JJTkFSWToKKyAgICAgICAgICAgICAgICBpZiAoIVRFTE9QVF9VKHgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoeCkgPj0gVE5fTkdfUlEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bl9zb3B0KERPLCB4KSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ETyh4KSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX05BV1M6CisjaWZkZWYgQ0tfTkFXUworICAgICAgICAgICAgICAgIGlmICggIXRuX2RlbGF5X3NiIHx8ICF0bl9vdXRzdCgwKSB8fCB0bl9pbml0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiAodG5fc25hd3MoKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfTkFXUykubmF3cy5uZWVkX3RvX3NlbmQgPSAxOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19OQVdTICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0xPR09VVDoKKyAgICAgICAgICAgICAgICB0dGNsb3MoMCk7ICAgICAgICAgICAgICAvKiBBbmQgdGhlbiBoYW5ndXAgKi8KKyAgICAgICAgICAgICAgICB3aHljbG9zZWQgPSBXQ19URUxPUFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuKDYpOworI2lmZGVmIENLX1NORExPQworICAgICAgICAgICAgICAgY2FzZSBURUxPUFRfU05ETE9DOgorICAgICAgICAgICAgICAgICAgaWYgKCAhdG5fZGVsYXlfc2IgfHwgIXRuX291dHN0KDApIHx8IHRuX2luaXQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHRuX3NuZGxvYygpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9TTkRMT0MpLnNuZGxvYy5uZWVkX3RvX3NlbmQgPSAxOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfU05ETE9DICovCisjaWZkZWYgQ0tfRk9SV0FSRF9YCisgICAgICAgICAgICAgICBjYXNlIFRFTE9QVF9GT1JXQVJEX1g6CisgICAgICAgICAgICAgICAgICBpZiAoICF0bl9kZWxheV9zYiB8fCAhdG5fb3V0c3QoMCkgfHwgdG5faW5pdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoZndkeF9zZW5kX29wdGlvbnMoKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRuX3NvcHQoRE9OVCx4KSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ET05UKHgpID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfRk9SV0FSRF9YKS5mb3J3YXJkX3gubmVlZF90b19zZW5kID0gMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgICAgICAgY2FzZSBURUxPUFRfQ09NUE9SVDogeworICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgcmVsaWFibGU7CisgICAgICAgICAgICAgICAgaWYgKCF0bl9kZWxheV9zYiB8fCAhdG5fb3V0c3QoMCkgfHwgdG5faW5pdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodG5fc25kY29tcG9ydCgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfQ09NUE9SVCkuY29tcG9ydC5uZWVkX3RvX3NlbmQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBUZWxuZXQgLT4gU2VyaWFsIC0+ID8/PyBpcyBub3QgYSByZWxpYWJsZSBjb25uZWN0aW9uLiAqLworICAgICAgICAgICAgICAgIHJlbGlhYmxlID0gU0VUX09GRjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyAgICAgICAgICAgIH0gLyogc3dpdGNoICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoeCkpCisgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XSUxMKHgpID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBET05UOgorI2lmZGVmIENLX1NTTAorICAgICAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKQorICAgICAgICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICBpZiAoVEVMT1BUX01FKHgpIHx8IFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoeCkpIHsKKyAgICAgICAgICAgIC8qIERhdmlkIEJvcm1hbiBzYXlzIHdlIHNob3VsZCBub3QgcmVzcG9uZCBXT05UIHdoZW4KKyAgICAgICAgICAgICAqIHRoZSBET05UIGlzIGEgcmVzcG9uc2UgdG8gYSBXSUxMIHRoYXQgd2Ugc2VudC4KKyAgICAgICAgICAgICAqIE5vciBzaG91bGQgd2Ugc2VuZCBvbmUgaWYgdGhlIHN0YXRlIGlzIGFscmVhZHkgV09OVAorICAgICAgICAgICAgICogc3VjaCBhcyB3aGVuIHdlIGRvIG5vdCByZWNvZ25pemUgdGhlIG9wdGlvbiBzaW5jZQorICAgICAgICAgICAgICogb3B0aW9ucyBhcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIFdPTlQvRE9OVCBzdGF0ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCEoVEVMT1BUX1VOQU5TV0VSRURfV0lMTCh4KSB8fCBURUxPUFRfVU5BTlNXRVJFRF9XT05UKHgpKSkKKyAgICAgICAgICAgICAgaWYgKHRuX3NvcHQoV09OVCx4KSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKworICAgICAgICAgICAgaWYgKFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoeCkpCisgICAgICAgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfV0lMTCh4KSA9IDA7CisgICAgICAgICAgICBpZiAoVEVMT1BUX1VOQU5TV0VSRURfV09OVCh4KSkKKyAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XT05UKHgpID0gMDsKKyAgICAgICAgICAgIGlmIChURUxPUFRfTUUoeCkpCisgICAgICAgICAgICAgIFRFTE9QVF9NRSh4KSA9IDA7CisKKyAgICAgICAgICAgIHN3aXRjaCAoeCkgeworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgY2FzZSBURUxPUFRfU1RBUlRfVExTOgorICAgICAgICAgICAgICAgIGlmICghc3N0ZWxuZXQgJiYgVEVMT1BUX01FX01PREUoeCkgPT0gVE5fTkdfTVUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJUZWxuZXQgU3RhcnQtVExTIHJlZnVzZWQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgdHRjbG9zKDApOworICAgICAgICAgICAgICAgICAgICB3aHljbG9zZWQgPSBXQ19URUxPUFQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgICAgIGlmICghc3N0ZWxuZXQgJiYgVEVMT1BUX01FX01PREUoeCkgPT0gVE5fTkdfTVUpIHsKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRsc19hY3RpdmVfZmxhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUoeCkgPSBUTl9OR19BQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJUZWxuZXQgYXV0aGVudGljYXRpb24gcmVmdXNlZC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHRjbG9zKDApOworICAgICAgICAgICAgICAgICAgICAgICAgd2h5Y2xvc2VkID0gV0NfVEVMT1BUOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEVMT1BUX01FX01PREUoeCkgPT0gVE5fTkdfUlEpIHsKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUoeCkgPSBUTl9OR19BQzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNrX3RuX2F1dGhfaW5fcHJvZ3Jlc3MoKSkKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiVGVsbmV0IGF1dGhlbnRpY2F0aW9uIHJlZnVzZWQuXG4iKTsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgaWYgKCFzc3RlbG5ldCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodG5fbm9fZW5jcnlwdCgpPDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyAgICAgICAgICAgICAgY2FzZSBURUxPUFRfRU5DUllQVElPTjoKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgY2tfdG5fZW5jX3N0b3AoKTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVEVMT1BUX0tFUk1JVDoKKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgICAgICAgICAgICAgVEVMT1BUX1NCKHgpLmtlcm1pdC5tZV9zdGFydCA9IDA7CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAvKiBzd2l0Y2ggKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoVEVMT1BUX1VOQU5TV0VSRURfV0lMTCh4KSkKKyAgICAgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfV0lMTCh4KSA9IDA7CisgICAgICAgICAgaWYgKFRFTE9QVF9VTkFOU1dFUkVEX1dPTlQoeCkpCisgICAgICAgICAgICAgIFRFTE9QVF9VTkFOU1dFUkVEX1dPTlQoeCkgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChURUxPUFRfTUVfTU9ERSh4KSA9PSBUTl9OR19NVSkgeworICAgICAgICAgICAgY2ttYWttc2coIHRuX21zZyxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICJQZWVyIHJlZnVzZXMgVEVMTkVUIFdJTEwgIixURUxPUFQoeCksCisgICAgICAgICAgICAgICAgICAgICAgIiBuZWdvdGlhdGlvbnMgLSB0ZXJtaW5hdGluZyBjb25uZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsdG5fbXNnLCIiLDApOworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZyk7CisgICAgICAgICAgICBwcmludGYoIiVzXG4iLHRuX21zZyk7CisgICAgICAgICAgICB0dGNsb3MoMCk7CisgICAgICAgICAgICB3aHljbG9zZWQgPSBXQ19URUxPUFQ7CisgICAgICAgICAgICByZXR1cm4oLTMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTQjoKKyAgICAgICAgaWYgKCh5ID0gdG5fc2IoeCwmbixmbikpIDw9IDApCisgICAgICAgICAgcmV0dXJuKHkpOworCisjaWZkZWYgQ0tfU1NMCisgICAgICAgIC8qIERvIG5vdCBwcm9jZXNzIHN1Ym5lZ290aWF0aW9ucyBvdGhlciB0aGFuIFNUQVJUX1RMUyBhZnRlciB3ZSAqLworICAgICAgICAvKiBoYXZlIGFncmVlZCB0byBiZWdpbiB0aGUgVExTIG5lZ290aWF0aW9uIHNlcXVlbmNlLiAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cyAmJgorICAgICAgICAgICAgIHggIT0gVEVMT1BUX1NUQVJUX1RMUykKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgICAgIGlmICghVEVMT1BUX09LKHgpKSB7CisgICAgICAgICAgICBoZXhkdW1wKCJ1bmtub3duIHRlbG5ldCBzdWJuZWdvdGlhdGlvbiIsc2Isbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICggIShURUxPUFRfTUUoeCkgfHwgVEVMT1BUX1UoeCkpICkgeworICAgICAgICAgICAgaGV4ZHVtcCgidGVsbmV0IG9wdGlvbiBub3QgbmVnb3RpYXRlZCIsc2Isbik7CisgICAgICAgICAgICBpZiAoIXRuX3NiX2J1ZykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChURUxPUFRfVU5BTlNXRVJFRF9XSUxMKHgpKSB7CisgICAgICAgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfV0lMTCh4KSA9IDA7CisgICAgICAgICAgICAgICAgVEVMT1BUX1UoeCkgPSAxOworICAgICAgICAgICAgICAgIGNrbWFrbXNnKHRuX21zZyxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICJURUxORVQgRE8gIixURUxPUFQoeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIihpbXBsaWVkIGJ5IHJlY2VpcHQgb2YgU0IgLSBwcm90b2NvbCBlcnJvciBpZ25vcmVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCx0bl9tc2csIiIsMCk7CisgICAgICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVEVMT1BUX1VOQU5TV0VSRURfRE8oeCkpIHsKKyAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9ETyh4KSA9IDA7CisgICAgICAgICAgICAgICAgVEVMT1BUX01FKHgpID0gMTsKKyAgICAgICAgICAgICAgICBja21ha21zZyh0bl9tc2csVE5fTVNHX0xFTiwiVEVMTkVUIFdJTEwgIixURUxPUFQoeCksCisgICAgICAgICAgICAgICAgICAgICAgICAiIChpbXBsaWVkIGJ5IHJlY2VpcHQgb2YgU0IgLSBwcm90b2NvbCBlcnJvciBpZ25vcmVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLHRuX21zZywiIiwwKTsKKyAgICAgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnKTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9TQih4KT0wOworICAgICAgICBzd2l0Y2ggKHgpIHsKKyNpZmRlZiBDS19GT1JXQVJEX1gKKyAgICAgICAgICBjYXNlIFRFTE9QVF9GT1JXQVJEX1g6CisgICAgICAgICAgICByZXR1cm4oZndkeF90bl9zYihzYiwgbikpOworI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworI2lmZGVmIENLX1NTTAorICAgICAgICAgIGNhc2UgVEVMT1BUX1NUQVJUX1RMUzogeworICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICB0aGUgb3RoZXIgc2lkZSBpcyBzYXlpbmcgU0IgU1RBUlRfVExTIEZPTExPV1MKKyAgICAgICAgICAgICAgICAgdGhlIGluY29taW5nIGNoYW5uZWwgaXMgbm93IHJlYWR5IGZvciBzdGFydGluZyB0aGUKKyAgICAgICAgICAgICAgICAgVExTIG5lZ290aWF0aW9uLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpbnQgZGVmX3Rsc191X21vZGUsIGRlZl90bHNfbWVfbW9kZTsKKyAgICAgICAgICAgICAgaW50IGRlZl9lbmNfdV9tb2RlLCBkZWZfZW5jX21lX21vZGU7CisgICAgICAgICAgICAgIGludCByYyA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNiWzBdICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMudV9mb2xsb3dzID0gMTsKKyAgICAgICAgICAgICAgLyogUHJlc2VydmUgdGhlIGRlZmF1bHQgbW9kZXMgYW5kIG1ha2Ugc3VyZSB3ZSB3aWxsICovCisgICAgICAgICAgICAgIC8qIHJlZnVzZSBTVEFSVF9UTFMgd2hlbiB3ZSByZXRyeS4gKi8KKyAgICAgICAgICAgICAgaWYgKHNzdGVsbmV0KSB7CisgICAgICAgICAgICAgICAgICBkZWZfdGxzX3VfbW9kZSA9IFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX1NUQVJUX1RMUyk7CisgICAgICAgICAgICAgICAgICBkZWZfdGxzX21lX21vZGUgPSBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfU1RBUlRfVExTKTsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX1NUQVJUX1RMUykgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfU19NRV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpPSBUTl9OR19SRjsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgICBkZWZfZW5jX3VfbW9kZSA9IFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pOworICAgICAgICAgICAgICAgICAgZGVmX2VuY19tZV9tb2RlID0gVEVMT1BUX0RFRl9TX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pOworICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfU19NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKT0gVE5fTkdfUkY7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgZGVmX3Rsc191X21vZGUgPSBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpOworICAgICAgICAgICAgICAgICAgZGVmX3Rsc19tZV9tb2RlID0gVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX1NUQVJUX1RMUyk7CisgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfU1RBUlRfVExTKT0gVE5fTkdfUkY7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgICAgICAgZGVmX2VuY191X21vZGUgPSBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKTsKKyAgICAgICAgICAgICAgICAgIGRlZl9lbmNfbWVfbW9kZSA9IFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKTsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfQ19VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTik9IFROX05HX1JGOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvKiBOZWdvdGlhdGUgVExTICovCisgICAgICAgICAgICAgIHR0bnByb3RvID0gTlBfVExTOworICAgICAgICAgICAgICB0bl9pbml0ID0gMDsKKyAgICAgICAgICAgICAgdG5fYmVndW4gPSAwOworICAgICAgICAgICAgICBpZiAoY2tfdG5fdGxzX25lZ290aWF0ZSgpPDApIHsKKyAgICAgICAgICAgICAgICAgIC8qIHdlIGZhaWxlZC4gIGRpc2Nvbm5lY3QgYW5kIGlmIHdlIGFyZSB0aGUgY2xpZW50ICovCisgICAgICAgICAgICAgICAgICAvKiB0aGVuIHJlY29ubmVjdCBhbmQgdHJ5IHdpdGhvdXQgU1RBUlRfVExTLiAgICAgICAqLworICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBsaW5lOworICAgICAgICAgICAgICAgICAgaW50IHggPSAtMTsKKyAgICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgbWRtdHlwOworCisgICAgICAgICAgICAgICAgICBpZiAoc3N0ZWxuZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRMUyBmYWlsZWQ6ICBEaXNjb25uZWN0aW5nLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfU1RBUlRfVExTKSAgPSBkZWZfdGxzX3VfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfU1RBUlRfVExTKSA9IGRlZl90bHNfbWVfbW9kZTsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSAgPSBkZWZfZW5jX3VfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfU19NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IGRlZl9lbmNfbWVfbW9kZTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICAgICAgICAgICAgdHRjbG9zKDApOworICAgICAgICAgICAgICAgICAgICAgIHdoeWNsb3NlZCA9IFdDX1RFTE9QVDsKKyAgICAgICAgICAgICAgICAgICAgICB0dG5wcm90byA9IE5QX1RFTE5FVDsKKyAgICAgICAgICAgICAgICAgICAgICByYyA9IC0zOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyNpZm5kZWYgTk9MT0NBTAorICAgICAgICAgICAgICAgICAgICAgIGV4dGVybiB0bHNfbm9yZXN0b3JlOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRMUyBmYWlsZWQ6ICBEaXNjb25uZWN0aW5nLi4uXG4iKTsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSAgPSBkZWZfZW5jX3VfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IGRlZl9lbmNfbWVfbW9kZTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICAgICAgICAgICAgLyogaWYgU1RBUlRfVExTIGlzIG5vdCBSRVFVSVJFRCwgdGhlbiByZXRyeSB3aXRob3V0IGl0ICovCisgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZfdGxzX21lX21vZGUgIT0gVE5fTkdfTVUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybiBjaGFyIHR0bmFtZVtdOworI2lmbmRlZiBOT0xPQ0FMCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRsc19ub3Jlc3RvcmUgPSAxOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHRjbG9zKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICB3aHljbG9zZWQgPSBXQ19URUxPUFQ7CisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGxzX25vcmVzdG9yZSA9IDA7CisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICB0dG5wcm90byA9IE5QX1RFTE5FVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJSZWNvbm5lY3Rpbmcgd2l0aG91dCBUTFMuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dG9wZW4odHRuYW1lLCZ4LG1kbXR5cCwwKTwwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtMzsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZfdGxzX3VfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX1NUQVJUX1RMUykgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZl90bHNfbWVfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHRjbG9zKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICB3aHljbG9zZWQgPSBXQ19URUxPUFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHR0bnByb3RvID0gTlBfVEVMTkVUOworICAgICAgICAgICAgICAgICAgICAgICAgICByYyA9IC0zOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgICAgICAgICAgICAgICAgLyogd2Ugc3VjY2VlZGVkLiAgcmVzdGFydCB0ZWxuZXQgbmVnb3RpYXRpb25zIGZyb20gKi8KKyAgICAgICAgICAgICAgICAgIC8qIHRoZSBiZWdpbm5pbmcuICBIb3dldmVyLCBpZiB3ZSBoYXZlIHJlY2VpdmVkIGEgICovCisgICAgICAgICAgICAgICAgICAvKiBjbGllbnQgY2VydGlmaWNhdGUgYW5kIHdlIGFyZSBhIHNlcnZlciwgdGhlbiBkbyAqLworICAgICAgICAgICAgICAgICAgLyogbm90IG9mZmVyIFRFTE9QVF9BVVRILiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGlmICggY2tfdG5fYXV0aF92YWxpZCgpID09IEFVVEhfVkFMSUQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID0gVE5fTkdfQUM7CisgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9TX01FX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKT0gVE5fTkdfQUM7CisgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyAgICAgICAgICAgICAgICAgIHR0bnByb3RvID0gTlBfVEVMTkVUOworICAgICAgICAgICAgICAgICAgaWYgKHRuX2luaSgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR0Y2hrKCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLyogUmVzdG9yZSB0aGUgZGVmYXVsdCBtb2RlcyAqLworICAgICAgICAgICAgICBpZiAoc3N0ZWxuZXQpIHsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX1NUQVJUX1RMUykgID0gZGVmX3Rsc191X21vZGU7CisgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfU1RBUlRfVExTKSA9IGRlZl90bHNfbWVfbW9kZTsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSAgPSBkZWZfZW5jX3VfbW9kZTsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfU19NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IGRlZl9lbmNfbWVfbW9kZTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpICA9IGRlZl90bHNfdV9tb2RlOworICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX1NUQVJUX1RMUykgPSBkZWZfdGxzX21lX21vZGU7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9DX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgID0gZGVmX2VuY191X21vZGU7CisgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBkZWZfZW5jX21lX21vZGU7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJldHVybihyYyk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgICAgICAgY2FzZSBURUxPUFRfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICBpZiAoY2tfdG5fc2JfYXV0aCgoY2hhciAqKXNiLG4pIDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChzc3RlbG5ldCAmJiBURUxPUFRfVV9NT0RFKHgpID09IFROX05HX01VKSB7CisgICAgICAgICAgICAgICAgICAgIHR0Y2xvcygwKTsKKyAgICAgICAgICAgICAgICAgICAgd2h5Y2xvc2VkID0gV0NfVEVMT1BUOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTMpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXNzdGVsbmV0ICYmIFRFTE9QVF9NRV9NT0RFKHgpID09IFROX05HX01VKSB7CisgICAgICAgICAgICAgICAgICAgIHR0Y2xvcygwKTsKKyAgICAgICAgICAgICAgICAgICAgd2h5Y2xvc2VkID0gV0NfVEVMT1BUOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChURUxPUFRfTUVfTU9ERSh4KSA9PSBUTl9OR19SUSkKKyAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfTUVfTU9ERSh4KSA9IFROX05HX0FDOworICAgICAgICAgICAgICAgICAgICBpZiAoVEVMT1BUX1VfTU9ERSh4KSA9PSBUTl9OR19SUSkKKyAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfVV9NT0RFKHgpID0gVE5fTkdfQUM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChURUxPUFRfTUUoeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX01FKHgpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRuX3NvcHQoV09OVCx4KSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFRFTE9QVF9VKHgpKSB7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VKHgpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRuX3NvcHQoRE9OVCx4KSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgICAgIGlmICh0bl9ub19lbmNyeXB0KCk8MCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICB9IGVsc2UgeworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgICAgICBpZiAoIWNrX3RuX2F1dGhfaW5fcHJvZ3Jlc3MoKSkgeyAvKiB3ZSBhcmUgZmluaXNoZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNrX3RuX2F1dGhlbnRpY2F0ZWQoKSA9PSBBVVRIVFlQRV9TU0wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRMUyB3YXMgc3VjY2Vzc2Z1bC4gIERpc2FibGUgRU5DUllQVElPTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0VOQ1JZUFRJT04pLmVuY3J5cHQubmVlZF90b19zZW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBja19lbmNyeXB0X3NlbmRfc3VwcG9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9FTkNSWVBUSU9OKS5lbmNyeXB0Lm5lZWRfdG9fc2VuZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgY2FzZSBURUxPUFRfRU5DUllQVElPTjoKKyAgICAgICAgICAgIGlmIChja190bl9zYl9lbmNyeXB0KHNiLCBuKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoVEVMT1BUX1VfTU9ERSh4KSA9PSBUTl9OR19NVSB8fAorICAgICAgICAgICAgICAgICAgICBURUxPUFRfTUVfTU9ERSh4KSA9PSBUTl9OR19NVSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICB0dGNsb3MoMCk7CisgICAgICAgICAgICAgICAgICAgICAgd2h5Y2xvc2VkID0gV0NfVEVMT1BUOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFRFTE9QVF9NRV9NT0RFKHgpID09IFROX05HX1JRKQorICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKHgpID0gVE5fTkdfQUM7CisgICAgICAgICAgICAgICAgICAgIGlmIChURUxPUFRfVV9NT0RFKHgpID09IFROX05HX1JRKQorICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoeCkgPSBUTl9OR19BQzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFRFTE9QVF9NRSh4KSkgeworICAgICAgICAgICAgICAgICAgICBURUxPUFRfTUUoeCkgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAodG5fc29wdChXT05ULHgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoVEVMT1BUX1UoeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1UoeCkgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAodG5fc29wdChET05ULHgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgICAgICAgY2FzZSBURUxPUFRfS0VSTUlUOgorICAgICAgICAgICAgcmV0dXJuKGlrc190bl9zYihzYiwgbi0yKSk7CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgICBjYXNlIFRFTE9QVF9DT01QT1JUOgorICAgICAgICAgICAgcmV0dXJuKHRuY190bl9zYihzYiwgbi0yKSk7CisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworICAgICAgICAgIGNhc2UgVEVMT1BUX1RUWVBFOgorICAgICAgICAgICAgc3dpdGNoIChzYlswXSkgeworICAgICAgICAgICAgICBjYXNlIFRFTFFVQUxfU0VORDogICAgICAgIC8qIFNFTkQgdGVybWluYWwgdHlwZT8gKi8KKyAgICAgICAgICAgICAgICBpZiAoICF0bl9kZWxheV9zYiB8fCAhdG5fb3V0c3QoMCkgfHwgdG5faW5pdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRuX3N0dHlwKCkgPCAwKSAvKiBZZXMsIHNvIHNlbmQgaXQuICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfVFRZUEUpLnRlcm0ubmVlZF90b19zZW5kID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVEVMUVVBTF9JUzogeyAgICAgICAgLyogSVMgdGVybWluYWwgdHlwZT8gKi8KKyAgICAgICAgICAgICAgICAgIC8qIElTIHRlcm1pbmFsIHR5cGUgLS0gcmVtb3RlIGdhdmUgdXMgaXRzIGN1cnJlbnQgdHlwZSAqLworICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOworI2lmbmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgIENIQVIgb2xkdGVybVs2NF0sICpwOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgLyogSXNvbGF0ZSB0aGUgc3BlY2lmaWVkIHRlcm1pbmFsIHR5cGUgc3RyaW5nICovCisgICAgICAgICAgICAgICAgICB3aGlsZSAoc2JbaSsrXSAhPSBJQUMpIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSA0MCB8fCAgICAvKiBtYXggbGVuIG9mIHRlcm0gc3RyaW5nIC0gUkZDICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNiW2ldID09IElBQykgeworICAgICAgICAgICAgICAgICAgICAgICAgICBzYltpXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBPUzIKKyNpZm5kZWYgTk9URVJNCisgICAgICAgICAgICAgICAgICBzdHJ1cHIoJihzYlsxXSkpOyAgICAgLyogVXBwZXIgY2FzZSBpdCAqLworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtYXhfdHQ7IGkrKykgeyAvKiBmaW5kIGl0IGluIG91ciBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoJihzYlsxXSksdHRfaW5mb1tpXS54X25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGkgIT0gVFRfVlROVCkgLyogY2FuJ3Qgc3VwcG9ydCBWVE5UIGFzIHNlcnZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGVybWluYWwgdHlwZSB0byB0aGUgb25lIGNob3NlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSB0dF90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcm10eXBlKGksMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChpID4gbWF4X3R0ICYmCisgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKCYoc2JbMV0pLFRFTE9QVF9TQihURUxPUFRfVFRZUEUpLnRlcm0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBDb3VsZG4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgdGVybSB0eXBlICovCisgICAgICAgICAgICAgICAgICAgICAgc2JbNDBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoVEVMT1BUX1NCKFRFTE9QVF9UVFlQRSkudGVybS50eXBlLCYoc2JbMV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBTQiBUVFlQRSBTRU5EICovCisgICAgICAgICAgICAgICAgICAgICAgdG5fc3Nib3B0KFRFTE9QVF9UVFlQRSxURUxRVUFMX1NFTkQsTlVMTCwwKTsKKyAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9TQihURUxPUFRfVFRZUEUpPTE7CisgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9URVJNICovCisjZWxzZSAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgIHAgPSAoQ0hBUiAqKSBnZXRlbnYoIlRFUk0iKTsKKyAgICAgICAgICAgICAgICAgIGlmIChwKQorICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkoKGNoYXIgKilvbGR0ZXJtLChjaGFyICopcCw2Myk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG9sZHRlcm1bMF0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgY2tsb3dlcigoY2hhciAqKSYoc2JbMV0pKTsgLyogTG93ZXIgY2FzZSBuZXcgdGVybSAqLworICAgICAgICAgICAgICAgICAgY2ttYWttc2codGVybV9idWYsNjQsIlRFUk09IiwoY2hhciAqKSYoc2JbMV0pLE5VTEwsTlVMTCk7CisjaWZkZWYgT1MyT1JVTklYCisjaWZuZGVmIE5PUFVURU5WCisgICAgICAgICAgICAgICAgICBwdXRlbnYodGVybV9idWYpOworI2VuZGlmIC8qIE5PUFVURU5WICovCisjZW5kaWYgLyogT1MyT1JVTklYICovCisjaWZkZWYgQ0tfQ1VSU0VTCisjaWZuZGVmIE1ZQ1VSU0VTCisjaWZuZGVmIENPSEVSRU5UCisgICAgICAgICAgICAgICAgICBpZiAodHJtYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHRnZXRlbnQodHJtYnVmLChjaGFyICopJnNiWzFdKSA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5zdXBwb3J0ZWQgdGVybWluYWwuICBJZiBuZXcgYW5kIG9sZCB0ZXJtaW5hbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0eXBlcyBkbyBub3QgbWF0Y2gsIGFzayBmb3IgYW5vdGhlciB0eXBlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKChjaGFyICopb2xkdGVybSwoY2hhciAqKSZzYlsxXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNCIFRUWVBFIFNFTkQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuX3NzYm9wdChURUxPUFRfVFRZUEUsVEVMUVVBTF9TRU5ELE5VTEwsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9TQihURUxPUFRfVFRZUEUpPTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBNWUNVUlNFUyAqLworI2VuZGlmIC8qIENLX0NVUlNFUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBDS19FTlZJUk9OTUVOVAorI2lmZGVmIENLX1hESVNQTE9DCisgICAgICAgICAgY2FzZSBURUxPUFRfWERJU1BMT0M6ICAgICAgICAgLyogU2VuZCBYLURpc3BsYXkgTG9jYXRpb24gKi8KKyAgICAgICAgICAgIGlmIChzYlswXSA9PSBURUxRVUFMX1NFTkQpIHsvKiBTRU5EIFgtRGlzcGxheSBMb2M/ICovCisgICAgICAgICAgICAgICAgaWYgKCAhdG5fZGVsYXlfc2IgfHwgIXRuX291dHN0KDApIHx8IHRuX2luaXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bl9zeGRpc3Bsb2MoKSA8IDApICAgICAvKiBZZXMsIHNvIHNlbmQgaXQuICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfWERJU1BMT0MpLnhkaXNwLm5lZWRfdG9fc2VuZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSVMgLS0gWCBEaXNwbGF5IExvY2F0aW9uIChub3Qgc3VwcG9ydGVkKSAqLworICAgICAgICAgICAgZWxzZSBpZiAoc2JbMF0gPT0gVEVMUVVBTF9JUykgeworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICAvKiBJc29sYXRlIHRoZSBzcGVjaWZpZWQgWC1kaXNwbGF5IHN0cmluZyAqLworICAgICAgICAgICAgICAgIHdoaWxlIChzYltpKytdICE9IElBQykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBUU0JVRlNJWikKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNiW2ldID09IElBQykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2JbaV0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiVEVMTkVUIFNCIFhESVNQTE9DIElTIiwmc2JbMV0sMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19YRElTUExPQyAqLworI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisgICAgICAgICAgY2FzZSBURUxPUFRfTkFXUzoKKyAgICAgICAgICAgICAgaWYgKHNzdGVsbmV0CisjaWZkZWYgSUtTRAorICAgICAgICAgICAgICAgICAgIHx8IGluc2VydmVyCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgaW50IHcgPSAwLCBoID0gMDsKKyAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICAgIC8qIEF0IHRoaXMgcG9pbnQgc2JbXSBzaG91bGQgY29udGFpbiB3aWR0aCBhbmQgaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICBpZiAoc2JbaV0gPT0gSUFDKSBpKys7CisgICAgICAgICAgICAgICAgICB3ID0gKHNiW2krK10gPDwgOCk7ICAgLyogc2F2ZSB1cHBlciBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChzYltpXSA9PSBJQUMpIGkrKzsKKyAgICAgICAgICAgICAgICAgIHcgKz0gc2JbaSsrXTsgICAgICAgICAvKiBzYXZlIHRoZSB3aWR0aCAqLworICAgICAgICAgICAgICAgICAgaWYgKHNiW2ldID09IElBQykgaSsrOworICAgICAgICAgICAgICAgICAgaCA9IChzYltpKytdIDw8IDgpOyAgIC8qIHNhdmUgdXBwZXIgaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICBpZiAoc2JbaV0gPT0gSUFDKSBpKys7CisgICAgICAgICAgICAgICAgICBoICs9IHNiW2krK107CisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ0bl9kb29wIE5BV1MgU0IiLCJ3aWR0aCIsdyk7CisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ0bl9kb29wIE5BV1MgU0IiLCJoZWlnaHQiLGgpOworCisgICAgICAgICAgICAgICAgICBpZiAodyA9PSAwKQorICAgICAgICAgICAgICAgICAgICB3ID0gODA7CisgICAgICAgICAgICAgICAgICBpZiAoaCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBoID0gMjQ7CisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgICAgICAgICAgIGlmICh0Y3BfaW5jb21pbmcgfHwgaW5zZXJ2ZXIpIHsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAgICB0dF9jb2xzW1ZURVJNXSA9IHc7CisgICAgICAgICAgICAgICAgICAgICAgdHRfcm93c1tWVEVSTV0gPSBoOworICAgICAgICAgICAgICAgICAgICAgIFZzY3JuU2V0V2lkdGgoVlRFUk0sIHcpOworICAgICAgICAgICAgICAgICAgICAgIFZzY3JuU2V0SGVpZ2h0KFZURVJNLCBoKyh0dF9zdGF0dXNbVlRFUk1dPzE6MCkpOworI2lmZGVmIElLU0QKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX2NvbHMgPSB0dF9jb2xzW1ZDTURdID0gdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX3Jvd3MgPSB0dF9yb3dzW1ZDTURdID0gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVnNjcm5TZXRXaWR0aChWQ01ELCB3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVnNjcm5TZXRIZWlnaHQoVkNNRCwgaCk7CisgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyNlbHNlIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICAgIHR0X2NvbHMgPSB3OworICAgICAgICAgICAgICAgICAgICAgIHR0X3Jvd3MgPSBoOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAgICB0dF9jb2xzW1ZDTURdID0gdzsKKyAgICAgICAgICAgICAgICAgICAgICB0dF9yb3dzW1ZDTURdID0gaDsKKyAgICAgICAgICAgICAgICAgICAgICBWc2NyblNldFdpZHRoKFZDTUQsIHcpOworICAgICAgICAgICAgICAgICAgICAgIFZzY3JuU2V0SGVpZ2h0KFZDTUQsIGgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICAgIGNtZF9jb2xzID0gdzsKKyAgICAgICAgICAgICAgICAgICAgICBjbWRfcm93cyA9IGg7CisgICAgICAgICAgICAgICAgICB9CisjZWxzZSAvKiBOT0xPQ0FMICovCisgICAgICAgICAgICAgICAgICBjbWRfY29scyA9IHc7CisgICAgICAgICAgICAgICAgICBjbWRfcm93cyA9IGg7CisjZW5kaWYgLyogTk9MT0NBTCAqLworCisgICAgICAgICAgICAgICAgICAvKiBBZGQgTElORVMgYW5kIENPTFVNTlMgdG8gdGhlIGVudmlyb25tZW50ICovCisgICAgICAgICAgICAgICAgICBja21ha21zZygoY2hhciAqKXJvd3NfYnVmLDE2LCJMSU5FUz0iLGNraXRvYShoKSxOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgICAgY2ttYWttc2coKGNoYXIgKiljb2xzX2J1ZiwxNiwiQ09MVU1OUz0iLGNraXRvYSh3KSxOVUxMLE5VTEwpOworI2lmZGVmIE9TMk9SVU5JWAorI2lmbmRlZiBOT1BVVEVOVgorICAgICAgICAgICAgICAgICAgcHV0ZW52KHJvd3NfYnVmKTsKKyAgICAgICAgICAgICAgICAgIHB1dGVudihjb2xzX2J1Zik7CisjZW5kaWYgLyogTk9QVVRFTlYgKi8KKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBDS19FTlZJUk9OTUVOVAorICAgICAgICAgIGNhc2UgVEVMT1BUX05FV0VOVklST046CisgICAgICAgICAgICBzd2l0Y2ggKHNiWzBdKSB7CisgICAgICAgICAgICAgIGNhc2UgVEVMUVVBTF9JUzogICAgICAgICAgICAgICAgICAvKiBJUyAqLworICAgICAgICAgICAgICBjYXNlIFRFTFFVQUxfSU5GTzogICAgICAgICAgICAgICAgLyogSU5GTyAqLworICAgICAgICAgICAgICAgIGlmIChzYlswXSA9PSBURUxRVUFMX0lTKQorICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwidG5fZG9vcCBORVctRU5WIFNCIElTIiwiIixuLTMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsInRuX2Rvb3AgTkVXLUVOViBTQiBJTkZPIiwiIixuLTMpOworICAgICAgICAgICAgICAgIGlmIChzc3RlbG5ldCB8fCBpbnNlcnZlcikgeyAvKiBZZXMsIHJlY2VpdmUgaXQuICovCisgICAgICAgICAgICAgICAgICAgIGlmICh0bl9ybmVudigoQ0hBUiAqKSZzYlsxXSxuLTMpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBURUxRVUFMX1NFTkQ6ICAgICAgICAvKiBTRU5EICovCisgICAgICAgICAgICAgICAgaWYgKCBzc3RlbG5ldCB8fCBpbnNlcnZlciApICAgICAgICAgLyogaWdub3JlIGlmIHNlcnZlciAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHRha2UgdGhlIHNiW10gYW5kIGJ1aWxkIGEgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgLyogY29udGFpbmluZyBhbGwgb2YgdGhlIHZhcmlhYmxlcyBhbmQgdHlwZXMgdGhhdCAqLworICAgICAgICAgICAgICAgIC8qIHdlIGFyZSBzdXBwb3NlZCB0byBrZWVwIHRyYWNrIG9mIGFuZCBzZW5kIHRvICAgKi8KKyAgICAgICAgICAgICAgICAvKiB0aGUgaG9zdCwgdGhlbiBjYWxsIHRuX3NuZW52KCkuICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKiBPciB3ZSBjYW4gcHVudCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoICF0bl9kZWxheV9zYiB8fCAhdG5fb3V0c3QoMCkgfHwgdG5faW5pdCApIHsKKyAgICAgICAgICAgICAgICAgIGlmICh0bl9zbmVudigoQ0hBUiAqKSZzYlsxXSxuLTMpIDwgMCkgLyogWWVzLCBzZW5kIGl0LiAqLworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworI2lmbmRlZiBWTVMKKyAgICAgICAgICAgICAgICAgIENIQVIgKiB4eHg7CisgICAgICAgICAgICAgICAgICB4eHggPSAoQ0hBUiAqKSBtYWxsb2Mobi0xKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogeHh4OworICAgICAgICAgICAgICAgICAgeHh4ID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jKG4tMSk7CisjZW5kaWYgLyogVk1TICovCisgICAgICAgICAgICAgICAgICAvKiBQb3N0cG9uZSBzZW5kaW5nIHVudGlsIGVuZCBvZiB0bl9pbmkoKSAqLworICAgICAgICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9ORVdFTlZJUk9OKS5lbnYuc3RyID0geHh4OworICAgICAgICAgICAgICAgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfTkVXRU5WSVJPTikuZW52LnN0cikgeworICAgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopVEVMT1BUX1NCKFRFTE9QVF9ORVdFTlZJUk9OKS5lbnYuc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnNiWzFdLG4tMyk7CisgICAgICAgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX05FV0VOVklST04pLmVudi5zdHJbbi0zXSA9IElBQzsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfTkVXRU5WSVJPTikuZW52LnN0cltuLTJdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfTkVXRU5WSVJPTikuZW52LmxlbiA9IG4tMzsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfTkVXRU5WSVJPTikuZW52Lm5lZWRfdG9fc2VuZCA9IDE7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisjaWZkZWYgQ0tfU05ETE9DCisgICAgICAgICAgY2FzZSBURUxPUFRfU05ETE9DOiB7CisgICAgICAgICAgICAgIGlmICggZGVibG9nICkgeworICAgICAgICAgICAgICAgICAgc2Jbbi0yXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJURUxORVQgU2VuZC1Mb2NhdGlvbiIsc2IsMCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorI2VuZGlmIC8qIENLX1NORExPQyAqLworICAgICAgICAgIH0gLyogc3dpdGNoICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRFTE5FVCBETyBPUFRJT04gKi8KK3RuX2Rvb3AoQ0hBUiB6LCBpbnQgZWNobywgaW50ICgqZm4pKGludCkpCisjZWxzZQordG5fZG9vcCh6LCBlY2hvLCBmbikgQ0hBUiB6OyBpbnQgZWNobzsgaW50ICgqZm4pKCk7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHRuX2Rvb3AgKi8geworICAgIGludCB4PTAsIHk9MDsKKworICAgIGlmICh6ICE9IChDSEFSKSBJQUMpIHsKKyAgICAgICAgZGVidWcoRjEwMSwidG5fZG9vcCBiYWQgY2FsbCIsIiIseik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgICAgICAgICAgICAgIC8qIENoZWNrIG5ldHdvcmsgdHlwZSAqLworICAgICAgcmV0dXJuKDApOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQgJiYKKyAgICAgICAgIHR0bnByb3RvICE9IE5QX05PTkUpICAgICAgICAgICAvKiBDaGVjayBwcm90b2NvbCAqLworICAgICAgICByZXR1cm4oMCk7CisKKyAgICB4ID0gdG5feGRvb3AoeixlY2hvLGZuKTsKKyAgICBpZiAoeCA+PSAwICYmICF0bl9iZWd1bikgeworICAgICAgICB5ID0gdG5fc3RhcnQoKTsKKyAgICB9CisgICAgcmV0dXJuKHkgPCAwID8geSA6IHgpOworfQorCisjaWZkZWYgQ0tfRU5WSVJPTk1FTlQKKworLyogVGVsbmV0IHJlY2VpdmUgbmV3IGVudmlyb25tZW50ICovCisvKiBSZXR1cm5zIC0xIG9uIGVycm9yLCAwIGlmIG5vdGhpbmcgaGFwcGVucywgMSBvbiBzdWNjZXNzICovCisvKiBJbiBvcmRlciBmb3IgdGhpcyBjb2RlIHRvIHdvcmssIHNiW2xlbl0gPT0gSUFDICAgICAgICAgICovCisvKiBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoZSBVU0VSIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKK2ludAorI2lmZGVmIENLX0FOU0lDCit0bl9ybmVudihDSEFSICogc2IsIGludCBsZW4pCisjZWxzZQordG5fcm5lbnYoc2IsIGxlbikgQ0hBUiAqIHNiOyBpbnQgbGVuOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bl9ybmVudiAqLyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVjZWl2ZSBuZXcgZW52aXJvbm1lbnQgKi8KKyAgICBjaGFyIHZhcm5hbWVbMTddOworICAgIGNoYXIgdmFsdWVbNjVdOworICAgIGNoYXIgKiByZXBseSA9IDAsICogcyA9IDA7CisgICAgaW50IGksaixrLG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXb3JrZXIuICovCisgICAgaW50IHR5cGUgPSAwOyAvKiAwIGZvciBOT05FLCAxIGZvciBWQVIsIDIgZm9yIFVTRVJWQVIsICovCisgICAgICAgICAgICAgICAgICAvKiAzIGZvciBWQUxVRSBpbiBwcm9ncmVzcyAqLworCisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCKSByZXR1cm4oMCk7CisgICAgaWYgKHR0bnByb3RvICE9IE5QX1RFTE5FVCkgcmV0dXJuKDApOworICAgIGlmIChzYiA9PSBOVUxMKSByZXR1cm4oLTEpOworCisgICAgaWYgKGxlbiA9PSAwKSByZXR1cm4oMSk7CisKKyAgICAvKgorICAgIFBhaXJzIG9mIDx0eXBlPiBbVkFSPTAsIFZBTFVFPTEsIEVTQz0yLCBVU0VSVkFSPTNdIDx2YWx1ZT4gInVudGVybWluYXRlZCIKKyAgICBmb2xsb3cgaGVyZSB1bnRpbCBkb25lLi4uCisgICAgKi8KKyAgICBmb3IgKGkgPSAwLCBqID0gMCwgayA9IDAsIHR5cGUgPSAwLCB2YXJuYW1lWzBdPSAnXDAnOyBpIDw9IGxlbjsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAoc2JbaV0pIHsKKyAgICAgICAgY2FzZSBURUxfRU5WX1ZBUjogICAgICAgICAgICAgICAvKiBWQVIgKi8KKyAgICAgICAgY2FzZSBURUxfRU5WX1VTRVJWQVI6ICAgICAgICAgICAvKiBVU0VSVkFSICovCisgICAgICAgIGNhc2UgSUFDOiAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mIHRoZSBsaXN0ICovCisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAvKiBOb3RoaW5nIGluIHByb2dyZXNzICovCisgICAgICAgICAgICAgICAgLyogSWYgd2UgZ2V0IElBQyBvbmx5LCB0aGVuIHRoYXQgbWVhbnMgdGhlcmUgd2VyZSAqLworICAgICAgICAgICAgICAgIC8qIG5vIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZW5kLiAgd2UgYXJlIGRvbmUgKi8KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSAwICYmIHNiW2ldID09IElBQykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgIC8qIFZBUiBpbiBwcm9ncmVzcyAqLworICAgICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgIC8qIFVTRVJWQVIgaW4gcHJvZ3Jlc3MgKi8KKyAgICAgICAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAvKiBWQUxVRSBpbiBwcm9ncmVzcyAqLworICAgICAgICAgICAgICAgIHZhbHVlW2tdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICB2YXJuYW1lW2pdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ0bl9ybmVudiB2YXJuYW1lIix2YXJuYW1lLHR5cGUpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInRuX3JuZW52IHZhbHVlIix2YWx1ZSx0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCh2YXJuYW1lLCJVU0VSIikpIHsKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgICAgICAgICAgICAgICAgICBpZiAoY2tfdG5fYXV0aF92YWxpZCgpICE9IEFVVEhfVkFMSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybiBjaGFyIHN6VXNlck5hbWVSZXF1ZXN0ZWRbXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsInRuX3JuZW52ICE9IEFVVEhfVkFMSUQiLCIiLDApOworICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHN6VXNlck5hbWVSZXF1ZXN0ZWQsdmFsdWUsVUlEQlVGTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh1aWRidWYsdmFsdWUsVUlEQlVGTEVOKTsKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzc2xfYWN0aXZlX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRsc19pc191c2VyX3ZhbGlkKHNzbF9jb24sIHVpZGJ1ZikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybiBjaGFyIHN6VXNlck5hbWVBdXRoZW50aWNhdGVkW107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShzelVzZXJOYW1lQXV0aGVudGljYXRlZCx1aWRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlEQlVGTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1ZBTElEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRsc19hY3RpdmVfZmxhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdGxzX2lzX3VzZXJfdmFsaWQodGxzX2NvbiwgdWlkYnVmKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWRbXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHN6VXNlck5hbWVBdXRoZW50aWNhdGVkLHVpZGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSURCVUZMRU4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfVkFMSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgLyogQVVUSF9WQUxJRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwidG5fcm5lbnYgQVVUSF9WQUxJRCB1aWRidWYiLHVpZGJ1ZiwwKTsKKworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGNrc3RyY21wKHZhbHVlLHVpZGJ1ZiwtMSwwKTsgLyogY2FzZSBpbnNlbnNpdGl2ZSAqLworI2lmZGVmIE5UCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOVExNIGF1dGhlbnRpY2F0aW9uIHJldHVybnMgbmFtZXMgb2YgdGhlIGZvcm0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERPTUFJTlx1c2VyLiAgV2UgbmVlZCB0byBjaGVjayB0byBzZWUgb2YgdGhlICAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogVVNFUiBWQVIgY29udGFpbnMgYSBkb21haW4gbmFtZSBvciBub3QuICBJZiAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QsIHRoZW4gd2UgZG8gbm90IHdhbnQgdG8gY2hhbmdlIHN0YXRlIGlmICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSB1aWRidWYgbWF0Y2hlcyB0aGUgVVNFUiBWQVIgd2hlbiB0aGUgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogRE9NQUlOIGlzIGlnbm9yZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHggJiYgY2tfdG5fYXV0aGVudGljYXRlZCgpID09IEFVVEhUWVBFX05UTE0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHMxPU5VTEwsICogczI9TlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbGVuMSwgbGVuMiwgaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjEgPSBzdHJsZW4odmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIGk9bGVuMS0xIDsgaT49MCA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHZhbHVlW2ldID09ICdcXCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMSA9ICZ2YWx1ZVtpKzFdOyAgIC8qIERPTUFJTiBmb3VuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHMxID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjIgPSBzdHJsZW4odWlkYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaT1sZW4yLTEgOyBpPj0wIDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHVpZGJ1ZltpXSA9PSAnXFwnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMyID0gJnVpZGJ1ZltpKzFdOyAgIC8qIERPTUFJTiBmb3VuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzMiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gY2tzdHJjbXAodmFsdWUsczIsLTEsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5UICovCisjZWxzZSAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBja3N0cmNtcCh2YWx1ZSx1aWRidWYsLTEsMSk7IC8qIGNhc2Ugc2Vuc2l0aXZlICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgc3pVc2VyTmFtZVJlcXVlc3RlZFtdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh1aWRidWYsdmFsdWUsVUlEQlVGTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkoc3pVc2VyTmFtZVJlcXVlc3RlZCx2YWx1ZSxVSURCVUZMRU4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9VU0VSKTsKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3NsX2FjdGl2ZV9mbGFnIHx8IHRsc19hY3RpdmVfZmxhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRsc19pc191c2VyX3ZhbGlkKHNzbF9jb24sIHVpZGJ1ZikgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1ZBTElEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbHNlIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh1aWRidWYsdmFsdWUsVUlEQlVGTEVOKTsKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhcm5hbWVbMF0gPSAnXDAnOworICAgICAgICAgICAgdmFsdWVbMF0gPSAnXDAnOworICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICBrID0gMDsKKyAgICAgICAgICAgIHR5cGUgPSAoc2JbaV0gPT0gVEVMX0VOVl9VU0VSVkFSID8gMiA6ICAgICAgLyogVVNFUlZBUiAqLworICAgICAgICAgICAgICAgICAgICBzYltpXSA9PSBURUxfRU5WX1ZBUiA/IDEgOiAgLyogVkFSICovCisgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVEVMX0VOVl9WQUxVRTogLyogVkFMVUUgKi8KKyAgICAgICAgICAgIGlmICggdHlwZSA9PSAxIHx8IHR5cGUgPT0gMiApCisgICAgICAgICAgICAgICAgdHlwZSA9IDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBURUxfRU5WX0VTQzogICAgICAgLyogRVNDICovCisgICAgICAgICAgICAvKiBUYWtlIG5leHQgY2hhcmFjdGVyIGxpdGVyYWxseSAqLworICAgICAgICAgICAgaWYgKCArK2kgPj0gbGVuICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIG90aGVyd2lzZSwgZmFsbHRocm91Z2ggc28gYnl0ZSB3aWxsIGJlIGFkZGVkIHRvIHN0cmluZy4gKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSAxOiAgICAgLyogVkFSIGluIHByb2dyZXNzICovCisgICAgICAgICAgICBjYXNlIDI6ICAgICAvKiBVU0VSVkFSIGluIHByb2dyZXNzICovCisgICAgICAgICAgICAgICAgaWYgKCBqIDwgMTYgKQorICAgICAgICAgICAgICAgICAgICB2YXJuYW1lW2orK10gPSBzYltpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBpZiAoIGsgPCA2NCApCisgICAgICAgICAgICAgICAgICAgIHZhbHVlW2srK10gPSBzYltpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qIFRoZXNlIGFyZSBmb3IgTWljcm9zb2Z0IFNGVSB2ZXJzaW9uIDIgVGVsbmV0IFNlcnZlciAqLworI2RlZmluZSBTRlVUTE5UVkVSICJTRlVUTE5UVkVSIgorI2RlZmluZSBTRlVUTE5UTU9ERSAiU0ZVVExOVE1PREUiCisjZGVmaW5lIFNGVVRMTlRWRVJfVkFMVUUgICIyIgorI2RlZmluZSBTRlVUTE5UTU9ERV9WQUxVRSAiY29uc29sZSIJLyogVGhlIG90aGVyIHZhbHVlIGlzICJzdHJlYW0iICovCisKKy8qIFRlbG5ldCBzZW5kIG5ldyBlbnZpcm9ubWVudCAqLworLyogUmV0dXJucyAtMSBvbiBlcnJvciwgMCBpZiBub3RoaW5nIGhhcHBlbnMsIDEgb24gc3VjY2VzcyAqLworLyogSW4gb3JkZXIgZm9yIHRoaXMgY29kZSB0byB3b3JrLCBzYltsZW5dID09IElBQyAgICAgICAgICAqLworCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5fc25lbnYoQ0hBUiAqIHNiLCBpbnQgbGVuKQorI2Vsc2UKK3RuX3NuZW52KHNiLCBsZW4pIENIQVIgKiBzYjsgaW50IGxlbjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdG5fc25lbnYgKi8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlbmQgbmV3IGVudmlyb25tZW50ICovCisgICAgY2hhciB2YXJuYW1lWzE2XTsKKyAgICBjaGFyICogcmVwbHkgPSAwLCAqIHMgPSAwOworICAgIGludCBpLGosbjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdvcmtlci4gKi8KKyAgICBpbnQgdHlwZSA9IDA7ICAgICAgIC8qIDAgZm9yIE5PTkUsIDEgZm9yIFZBUiwgMiBmb3IgVVNFUlZBUiBpbiBwcm9ncmVzcyAqLworICAgIGV4dGVybiBpbnQgY2tfbGNuYW1lOworICAgIGNoYXIgbG9jYWx1aWRidWZbVUlEQlVGTEVOXTsJLyogKEluaXRpYWxpemVkIGp1c3QgYmVsb3cpICovCisgICAgY2hhciAqIHV1ID0gdWlkYnVmOworICAgIGNoYXIgKiBkaXNwID0gTlVMTDsKKworICAgIGxvY2FsdWlkYnVmWzBdID0gJ1wwJzsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpIHJldHVybigwKTsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7CisgICAgaWYgKCFzYikgcmV0dXJuKC0xKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworI2lmZGVmIENLX0ZPUldBUkRfWAorICAgIGlmIChURUxPUFRfVShURUxPUFRfRk9SV0FSRF9YKSkgeworICAgICAgICBkaXNwID0gTlVMTDsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19GT1JXQVJEX1ggKi8KKyAgICAgICAgZGlzcCA9IChjaGFyICopdG5fZ2V0X2Rpc3BsYXkoKTsKKworICAgIGlmIChja19sY25hbWUpIHsKKyAgICAgICAgY2tzdHJuY3B5KGxvY2FsdWlkYnVmLHVpZGJ1ZixVSURCVUZMRU4pOworICAgICAgICBja2xvd2VyKGxvY2FsdWlkYnVmKTsKKyAgICAgICAgdXUgPSBsb2NhbHVpZGJ1ZjsKKyAgICB9CisKKyAgICBoZXhkdW1wKChDSEFSICopInRuX3NuZW52IHNiW10iLHNiLGxlbik7CisgICAgZGVidWcoRjExMCwidG5fc25lbnYgdWlkYnVmIix1aWRidWYsMCk7CisgICAgZGVidWcoRjExMCwidG5fc25lbnYgbG9jYWx1aWRidWYiLGxvY2FsdWlkYnVmLDApOworICAgIGRlYnVnKEYxMTAsInRuX3NuZW52IHRuX2Vudl9zeXMiLHRuX2Vudl9zeXMsMCk7CisgICAgZGVidWcoRjExMCwidG5fc25lbnYgdG5fZW52X2Rpc3AiLHRuX2Vudl9kaXNwLDApOworICAgIGRlYnVnKEYxMTAsInRuX3NuZW52IGRpc3AiLGRpc3AsMCk7CisKKyAgICAvKiBGaXJzdCBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB3ZSB3aWxsIG5lZWQgKi8KKyAgICBmb3IgKGkgPSAwLCBqID0gMCwgbiA9IDAsIHR5cGUgPSAwLCB2YXJuYW1lWzBdPSAnXDAnOyBpIDw9IGxlbjsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAoc2JbaV0pIHsKKyAgICAgICAgICBjYXNlIFRFTF9FTlZfVkFSOiAgICAgICAgICAgICAvKiBWQVIgKi8KKyAgICAgICAgICBjYXNlIFRFTF9FTlZfVVNFUlZBUjogICAgICAgICAvKiBVU0VSVkFSICovCisgICAgICAgIGNhc2UgSUFDOiAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiB0aGUgbGlzdCAqLworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgaW4gcHJvZ3Jlc3MgKi8KKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBnZXQgSUFDIG9ubHksIHRoZW4gdGhhdCBtZWFucyBzZW5kIGFsbCAqLworICAgICAgICAgICAgICAgIC8qIFZBUiBhbmQgVVNFUlZBUi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCEoaiA9PSAwICYmIHNiW2ldID09IElBQykpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgLyogVkFSIGluIHByb2dyZXNzICovCisgICAgICAgICAgICAgICAgdmFybmFtZVtqXSA9ICdcMCcgOworICAgICAgICAgICAgICAgIGlmICghdmFybmFtZVswXSkgeyAgICAgIC8qIFNlbmQgQWxsICovCisgICAgICAgICAgICAgICAgICAgIGlmICh1dVswXSkKKyAgICAgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbih1dSkgKyA0ICsgMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRuX2Vudl9qb2JbMF0pCisgICAgICAgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4odG5fZW52X2pvYikgKyAzICsgMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRuX2Vudl9hY2N0WzBdKQorICAgICAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHRuX2Vudl9hY2N0KSArIDQgKyAyOworICAgICAgICAgICAgICAgICAgICBpZiAodG5fZW52X3BybnRbMF0pCisgICAgICAgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4odG5fZW52X3BybnQpICsgNyArIDI7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bl9lbnZfc3lzWzBdKQorICAgICAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHRuX2Vudl9zeXMpICsgMTAgKyAyOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcCkKKyAgICAgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbihkaXNwKSArIDcgKyAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCh2YXJuYW1lLCJVU0VSIikgJiYgdXVbMF0pCisgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbih1dSkgKyA0ICsgMjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKHZhcm5hbWUsIkpPQiIpICYmIHRuX2Vudl9qb2JbMF0pCisgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbih0bl9lbnZfam9iKSArIDMgKyAyOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodmFybmFtZSwiQUNDVCIpICYmIHRuX2Vudl9hY2N0WzBdKQorICAgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4odG5fZW52X2FjY3QpICsgNCArIDI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh2YXJuYW1lLCJQUklOVEVSIikgJiYgdG5fZW52X3BybnRbMF0pCisgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbih0bl9lbnZfcHJudCkgKyA3ICsgMjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKHZhcm5hbWUsIlNZU1RFTVRZUEUiKSAmJiB0bl9lbnZfc3lzWzBdKQorICAgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4odG5fZW52X3N5cykgKyAxMCArIDI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh2YXJuYW1lLCJESVNQTEFZIikgJiYgZGlzcCkKKyAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKGRpc3ApICsgNyArIDI7CisgICAgICAgICAgICAgICAgLyogSWYgd2UgZ2V0IElBQyBvbmx5LCB0aGVuIHRoYXQgbWVhbnMgc2VuZCBhbGwgKi8KKyAgICAgICAgICAgICAgICAvKiBWQVIgYW5kIFVTRVJWQVIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKCEoaiA9PSAwICYmIHNiW2ldID09IElBQykpCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgIC8qIFVTRVJWQVIgaW4gcHJvZ3Jlc3MgKi8KKyAgICAgICAgICAgICAgICB2YXJuYW1lW2pdID0gJ1wwJyA7CisgICAgICAgICAgICAgICAgaWYgKCF2YXJuYW1lWzBdKSB7ICAgICAgLyogU2VuZCBBbGwgKi8KKyAgICAgICAgICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICAgICAgICAgIGZvciAoIHg9MCA7IHg8OCA7IHgrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdG5fZW52X3VzZXJ2YXJbeF1bMF0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5fZW52X3VzZXJ2YXJbeF1bMV0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHRuX2Vudl91c2VydmFyW3hdWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbih0bl9lbnZfdXNlcnZhclt4XVsxXSkgKyAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggdG5fc2Z1ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBNaWNyb3NvZnQgVGVsbmV0IFNlcnZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4oU0ZVVExOVFZFUikgKyBzdHJsZW4oU0ZVVExOVFZFUl9WQUxVRSkgKyAyOworICAgICAgICAgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4oU0ZVVExOVE1PREUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKFNGVVRMTlRNT0RFX1ZBTFVFKSArIDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBDS19TTkRMT0MKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0bl9sb2MgJiYgdG5fbG9jWzBdICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKCJMT0NBVElPTiIpICsgc3RybGVuKHRuX2xvYykgKyAyOworI2VuZGlmIC8qIENLX1NORExPQyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0bl9zZnUgJiYgIXN0cmNtcCh2YXJuYW1lLFNGVVRMTlRWRVIpKQorICAgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbihTRlVUTE5UVkVSKSArIHN0cmxlbihTRlVUTE5UVkVSX1ZBTFVFKSArIDI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodG5fc2Z1ICYmICFzdHJjbXAodmFybmFtZSxTRlVUTE5UTU9ERSkpCisgICAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKFNGVVRMTlRNT0RFKSArIHN0cmxlbihTRlVUTE5UTU9ERV9WQUxVRSkgKyAyOworI2lmZGVmIENLX1NORExPQworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB0bl9sb2MgJiYgdG5fbG9jWzBdICYmICFzdHJjbXAodmFybmFtZSwiTE9DQVRJT04iKSkKKyAgICAgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4oIkxPQ0FUSU9OIikgKyBzdHJsZW4odG5fbG9jKSArIDI7CisjZW5kaWYgLyogQ0tfU05ETE9DICovCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgICAgICAgICBmb3IgKCB4PTAgOyB4PDggOyB4KysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRuX2Vudl91c2VydmFyW3hdWzBdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuX2Vudl91c2VydmFyW3hdWzFdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAodmFybmFtZSx0bl9lbnZfdXNlcnZhclt4XVswXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4odG5fZW52X3VzZXJ2YXJbeF1bMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuKHRuX2Vudl91c2VydmFyW3hdWzFdKSArIDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXJuYW1lWzBdID0gJ1wwJzsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgdHlwZSA9IChzYltpXSA9PSBURUxfRU5WX1VTRVJWQVIgPyAyIDogICAgICAvKiBVU0VSVkFSICovCisgICAgICAgICAgICAgICAgICAgIHNiW2ldID09IFRFTF9FTlZfVkFSID8gMSA6ICAgICAgICAgIC8qIFZBUiAqLworICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVEVMX0VOVl9WQUxVRTogICAgICAgICAgIC8qIFZBTFVFICovCisgICAgICAgICAgICAvKiBQcm90b2NvbCBFcnJvciAqLworICAgICAgICAgICAgZGVidWcoRjEwMCwgIlRFTE5FVCBTdWJuZWdvdGlhdGlvbiBlcnJvciAtIFZBTFVFIGluIFNFTkQiLCAiIiwwKTsKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgICAgICB0bl9kZWJ1ZygiVEVMTkVUIFN1Ym5lZ290aWF0aW9uIGVycm9yIC0gVkFMVUUgaW4gU0VORCIpOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgIGNhc2UgVEVMX0VOVl9FU0M6ICAgICAvKiBFU0MgKi8KKyAgICAgICAgICAgIGlmICgrK2kgPj0gbGVuKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKGogPCAxNiApCisgICAgICAgICAgICAgIHZhcm5hbWVbaisrXSA9IHNiW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJlcGx5ID0gbWFsbG9jKG4gKyAxNik7ICAgICAgICAgICAgICAvKiBMZWF2ZSByb29tIGZvciBJQUMgc3R1ZmYgKi8KKyAgICBpZiAoIXJlcGx5KSB7CisgICAgICAgIGRlYnVnKEYxMDAsICJURUxORVQgU3VibmVnb3RpYXRpb24gZXJyb3IgLSBtYWxsb2MgZmFpbGVkIiwgIiIsMCk7CisgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKQorICAgICAgICAgIHRuX2RlYnVnKCJURUxORVQgU3VibmVnb3RpYXRpb24gZXJyb3IgLSBtYWxsb2MgZmFpbGVkIik7CisKKyAgICAgICAgLyogU2VuZCBhIHJldHVybiBwYWNrZXQgd2l0aCBubyB2YXJpYWJsZXMgc28gdGhhdCB0aGUgaG9zdCAqLworICAgICAgICAvKiBtYXkgY29udGludWUgd2l0aCBhZGRpdGlvbmFsIG5lZ290aWF0aW9ucyAgICAgICAgICAgICAgICovCisgICAgICAgIGlmICh0bl9zc2JvcHQoVEVMT1BUX05FV0VOVklST04sVEVMUVVBTF9JUywiIiwwKSA8IDApCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIC8qIE5vdyBjb25zdHJ1Y3QgdGhlIHJlYWwgcmVwbHkgKi8KKworICAgIG4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IGF0IGJlZ2lubmluZyBvZiBidWZmZXIgKi8KKy8qCisgIFBhaXJzIG9mIDx0eXBlPiBbVkFSPTAsIFZBTFVFPTEsIEVTQz0yLCBVU0VSVkFSPTNdIDx2YWx1ZT4gInVudGVybWluYXRlZCIKKyAgZm9sbG93IGhlcmUgdW50aWwgZG9uZS4uLgorKi8KKyAgICBmb3IgKGkgPSAwLCBqID0gMCwgdHlwZSA9IDAsIHZhcm5hbWVbMF09ICdcMCc7IGkgPD0gbGVuOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChzYltpXSkgeworICAgICAgICAgIGNhc2UgVEVMX0VOVl9WQVI6ICAgICAgICAgICAgIC8qIFZBUiAqLworICAgICAgICAgIGNhc2UgVEVMX0VOVl9VU0VSVkFSOiAgICAgICAgIC8qIFVTRVJWQVIgKi8KKyAgICAgICAgICBjYXNlIElBQzogICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgdGhlIGxpc3QgKi8KKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgaW4gcHJvZ3Jlc3MgKi8KKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBnZXQgSUFDIG9ubHksIHRoZW4gdGhhdCBtZWFucyBzZW5kIGFsbCAqLworICAgICAgICAgICAgICAgIC8qIFZBUiBhbmQgVVNFUlZBUi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCEoaiA9PSAwICYmIHNiW2ldID09IElBQykpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAvKiBWQVIgaW4gcHJvZ3Jlc3MgKi8KKyAgICAgICAgICAgICAgICB2YXJuYW1lW2pdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBpZiAoIXZhcm5hbWVbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgLyogU2VuZCBBbGwgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHV1WzBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBseVtuXSA9IFRFTF9FTlZfVkFSOyAvKiBWQVIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxXSwiVVNFUiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlbbis1XSA9IFRFTF9FTlZfVkFMVUU7ICAgICAgICAgICAgIC8qIFZBTFVFICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnJlcGx5W24rNl0sdXUpOworICAgICAgICAgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4odXUpICsgNCArIDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRuX2Vudl9qb2JbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5W25dID0gVEVMX0VOVl9WQVI7IC8qIFZBUiAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuKzFdLCJKT0IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5W24rNF0gPSBURUxfRU5WX1ZBTFVFOyAgICAgLyogVkFMVUUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbis1XSx0bl9lbnZfam9iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHRuX2Vudl9qb2IpICsgMyArIDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRuX2Vudl9hY2N0WzBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBseVtuXSA9IFRFTF9FTlZfVkFSOyAvKiBWQVIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxXSwiQUNDVCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlbbis1XSA9IFRFTF9FTlZfVkFMVUU7ICAgICAvKiBWQUxVRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuKzZdLHRuX2Vudl9hY2N0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHRuX2Vudl9hY2N0KSArIDQgKyAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0bl9lbnZfcHJudFswXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlbbl0gPSBURUxfRU5WX1ZBUjsgLyogVkFSICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnJlcGx5W24rMV0sIlBSSU5URVIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5W24rOF0gPSBURUxfRU5WX1ZBTFVFOyAgICAgLyogVkFMVUUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbis5XSx0bl9lbnZfcHJudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbih0bl9lbnZfcHJudCkgKyA3ICsgMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodG5fZW52X3N5c1swXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlbbl0gPSBURUxfRU5WX1ZBUjsgLyogVkFSICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnJlcGx5W24rMV0sIlNZU1RFTVRZUEUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5W24rMTFdID0gVEVMX0VOVl9WQUxVRTsgLyogVkFMVUUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxMl0sdG5fZW52X3N5cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbih0bl9lbnZfc3lzKSArIDEwICsgMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlbbl0gPSBURUxfRU5WX1ZBUjsgLyogVkFSICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnJlcGx5W24rMV0sIkRJU1BMQVkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5W24rOF0gPSBURUxfRU5WX1ZBTFVFOyAgICAgLyogVkFMVUUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbis5XSxkaXNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKGRpc3ApICsgNyArIDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAodmFybmFtZSwiVVNFUiIpICYmIHV1WzBdKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5W25dID0gVEVMX0VOVl9WQVI7ICAgICAvKiBWQVIgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuKzFdLCJVU0VSIik7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5W24rNV0gPSBURUxfRU5WX1ZBTFVFOyAvKiBWQUxVRSAqLworICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnJlcGx5W24rNl0sdXUpOworICAgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbih1dSkgKyA0ICsgMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAodmFybmFtZSwiSk9CIikgJiYgdG5fZW52X2pvYlswXSkgeworICAgICAgICAgICAgICAgICAgICByZXBseVtuXSA9IFRFTF9FTlZfVkFSOyAgICAgLyogVkFSICovCisgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxXSwiSk9CIik7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5W24rNF0gPSBURUxfRU5WX1ZBTFVFOyAvKiBWQUxVRSAqLworICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnJlcGx5W24rNV0sdG5fZW52X2pvYik7CisgICAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHRuX2Vudl9qb2IpICsgMyArIDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHZhcm5hbWUsIkFDQ1QiKSAmJiB0bl9lbnZfYWNjdFswXSkgeworICAgICAgICAgICAgICAgICAgICByZXBseVtuXSA9IFRFTF9FTlZfVkFSOyAgICAgLyogVkFSICovCisgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxXSwiQUNDVCIpOworICAgICAgICAgICAgICAgICAgICByZXBseVtuKzVdID0gVEVMX0VOVl9WQUxVRTsgLyogVkFMVUUgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuKzZdLHRuX2Vudl9hY2N0KTsKKyAgICAgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4odG5fZW52X2FjY3QpICsgNCArIDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHZhcm5hbWUsIlBSSU5URVIiKSAmJiB0bl9lbnZfcHJudFswXSkgeworICAgICAgICAgICAgICAgICAgICByZXBseVtuXSA9IFRFTF9FTlZfVkFSOyAgICAgLyogVkFSICovCisgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxXSwiUFJJTlRFUiIpOworICAgICAgICAgICAgICAgICAgICByZXBseVtuKzhdID0gVEVMX0VOVl9WQUxVRTsgLyogVkFMVUUgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuKzldLHRuX2Vudl9wcm50KTsKKyAgICAgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4odG5fZW52X3BybnQpICsgNyArIDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHZhcm5hbWUsIlNZU1RFTVRZUEUiKSAmJiB0bl9lbnZfc3lzWzBdKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5W25dID0gVEVMX0VOVl9WQVI7ICAgICAvKiBWQVIgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuKzFdLCJTWVNURU1UWVBFIik7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5W24rMTFdID0gVEVMX0VOVl9WQUxVRTsgICAgICAgIC8qIFZBTFVFICovCisgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxMl0sdG5fZW52X3N5cyk7CisgICAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHRuX2Vudl9zeXMpICsgMTAgKyAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCh2YXJuYW1lLCJESVNQTEFZIikgJiYgZGlzcCkgeworICAgICAgICAgICAgICAgICAgICByZXBseVtuXSA9IFRFTF9FTlZfVkFSOyAgICAgLyogVkFSICovCisgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxXSwiRElTUExBWSIpOworICAgICAgICAgICAgICAgICAgICByZXBseVtuKzhdID0gVEVMX0VOVl9WQUxVRTsgLyogVkFMVUUgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuKzldLGRpc3ApOworICAgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbihkaXNwKSArIDcgKyAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIC8qIElmIHdlIGdldCBJQUMgb25seSwgdGhlbiB0aGF0IG1lYW5zIHNlbmQgYWxsICovCisgICAgICAgICAgICAgICAgICAvKiBWQVIgYW5kIFVTRVJWQVIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKCEoaiA9PSAwICYmIHNiW2ldID09IElBQykpCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6ICAgICAvKiBVU0VSVkFSIGluIHByb2dyZXNzICovCisgICAgICAgICAgICAgICAgICB2YXJuYW1lW2pdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgIGlmICghdmFybmFtZVswXSkgeworICAgICAgICAgICAgICAgICAgICAgIC8qIFNlbmQgQWxsICovCisgICAgICAgICAgICAgICAgICAgICAgaW50IHgseTsKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKCB4PTAgOyB4PDggOyB4KysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdG5fZW52X3VzZXJ2YXJbeF1bMF0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bl9lbnZfdXNlcnZhclt4XVsxXSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5W25dID0gVEVMX0VOVl9VU0VSVkFSOyAgICAgLyogVkFSICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gc3RybGVuKHRuX2Vudl91c2VydmFyW3hdWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxXSx0bl9lbnZfdXNlcnZhclt4XVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseVtuK3krMV0gPSBURUxfRU5WX1ZBTFVFOyAvKiBWQUxVRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuK3krMl0sdG5fZW52X3VzZXJ2YXJbeF1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiArPSB5K3N0cmxlbih0bl9lbnZfdXNlcnZhclt4XVsxXSkrMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRuX3NmdSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcGF0aWJpbGl0eSB3aXRoIE1pY3Jvc29mdCBUZWxuZXQgU2VydmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5W25dID0gVEVMX0VOVl9VU0VSVkFSOyAgICAgLyogVkFSICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxXSxTRlVUTE5UVkVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlbbisxMV0gPSBURUxfRU5WX1ZBTFVFOyAvKiBWQUxVRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnJlcGx5W24rMTJdLFNGVVRMTlRWRVJfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbihTRlVUTE5UVkVSKStzdHJsZW4oU0ZVVExOVFZFUl9WQUxVRSkrMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseVtuXSA9IFRFTF9FTlZfVVNFUlZBUjsgICAgIC8qIFZBUiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnJlcGx5W24rMV0sU0ZVVExOVE1PREUpOworICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseVtuKzEyXSA9IFRFTF9FTlZfVkFMVUU7IC8qIFZBTFVFICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxM10sU0ZVVExOVE1PREVfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbihTRlVUTE5UTU9ERSkrc3RybGVuKFNGVVRMTlRNT0RFX1ZBTFVFKSsyOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBpZiAodG5fbG9jICYmIHRuX2xvY1swXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseVtuXSA9IFRFTF9FTlZfVVNFUlZBUjsgICAgIC8qIFZBUiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnJlcGx5W24rMV0sIkxPQ0FUSU9OIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5W24rOV0gPSBURUxfRU5WX1ZBTFVFOyAvKiBWQUxVRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnJlcGx5W24rMTBdLHRuX2xvYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKCJMT0NBVElPTiIpICsgc3RybGVuKHRuX2xvYykgKyAyOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0gIGVsc2UgaWYgKHRuX3NmdSAmJiAhc3RyY21wKHZhcm5hbWUsU0ZVVExOVFZFUikpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXBseVtuXSA9IFRFTF9FTlZfVVNFUlZBUjsgICAgIC8qIFZBUiAqLworICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxXSxTRlVUTE5UVkVSKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXBseVtuKzExXSA9IFRFTF9FTlZfVkFMVUU7IC8qIFZBTFVFICovCisgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuKzEyXSxTRlVUTE5UVkVSX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgICBuICs9IHN0cmxlbihTRlVUTE5UVkVSKSArIHN0cmxlbihTRlVUTE5UVkVSX1ZBTFVFKSArIDI7CisgICAgICAgICAgICAgICAgICB9ICBlbHNlIGlmICh0bl9zZnUgJiYgIXN0cmNtcCh2YXJuYW1lLFNGVVRMTlRNT0RFKSkgeworICAgICAgICAgICAgICAgICAgICAgIHJlcGx5W25dID0gVEVMX0VOVl9VU0VSVkFSOyAgICAgLyogVkFSICovCisgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuKzFdLFNGVVRMTlRNT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXBseVtuKzEyXSA9IFRFTF9FTlZfVkFMVUU7IC8qIFZBTFVFICovCisgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuKzEzXSxTRlVUTE5UTU9ERV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4oU0ZVVExOVE1PREUpICsgc3RybGVuKFNGVVRMTlRNT0RFX1ZBTFVFKSArIDI7CisgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ0tfU05ETE9DCisgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0bl9sb2MgJiYgdG5fbG9jWzBdICYmICFzdHJjbXAodmFybmFtZSwiTE9DQVRJT04iKSl7CisgICAgICAgICAgICAgICAgICAgICAgcmVwbHlbbl0gPSBURUxfRU5WX1VTRVJWQVI7ICAgICAvKiBWQVIgKi8KKyAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnJlcGx5W24rMV0sIkxPQ0FUSU9OIik7CisgICAgICAgICAgICAgICAgICAgICAgcmVwbHlbbis5XSA9IFRFTF9FTlZfVkFMVUU7IC8qIFZBTFVFICovCisgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuKzEwXSx0bl9sb2MpOworICAgICAgICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKCJMT0NBVElPTiIpICsgc3RybGVuKHRuX2xvYykgKyAyOworICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX1NORExPQyAqLworICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgaW50IHgseTsKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKCB4PTAgOyB4PDggOyB4KysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdG5fZW52X3VzZXJ2YXJbeF1bMF0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bl9lbnZfdXNlcnZhclt4XVsxXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAodmFybmFtZSx0bl9lbnZfdXNlcnZhclt4XVswXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5W25dID0gVEVMX0VOVl9VU0VSVkFSOyAgICAgLyogVkFSICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gc3RybGVuKHRuX2Vudl91c2VydmFyW3hdWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcmVwbHlbbisxXSx0bl9lbnZfdXNlcnZhclt4XVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseVtuK3krMV0gPSBURUxfRU5WX1ZBTFVFOyAvKiBWQUxVRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZyZXBseVtuK3krMl0sdG5fZW52X3VzZXJ2YXJbeF1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiArPSB5K3N0cmxlbih0bl9lbnZfdXNlcnZhclt4XVsxXSkrMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhcm5hbWVbMF0gPSAnXDAnOworICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICB0eXBlID0gKHNiW2ldID09IFRFTF9FTlZfVVNFUlZBUiA/IDIgOiAgICAgIC8qIFVTRVJWQVIgKi8KKyAgICAgICAgICAgICAgICAgICAgc2JbaV0gPT0gVEVMX0VOVl9WQVIgPyAxIDogIC8qIFZBUiAqLworICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVEVMX0VOVl9WQUxVRTogLyogVkFMVUUgKi8KKyAgICAgICAgICAgIC8qIFByb3RvY29sIEVycm9yICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCAiVEVMTkVUIFN1Ym5lZ290aWF0aW9uIGVycm9yIC0gVkFMVUUgaW4gU0VORCIsICIiLDApOworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpCisgICAgICAgICAgICAgIHRuX2RlYnVnKCJURUxORVQgU3VibmVnb3RpYXRpb24gZXJyb3IgLSBWQUxVRSBpbiBTRU5EIik7CisgICAgICAgICAgICByZXR1cm4oMCk7ICAvKiBXYXMgLTEgYnV0IHRoYXQgd291bGQgYmUgdGFrZW4gYXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuIEkvTyBlcnJvciwgc28gYWJzb3JiIGl0IGFuZCBnbyBvbi4gKi8KKyAgICAgICAgICBjYXNlIFRFTF9FTlZfRVNDOiAgICAgLyogRVNDICovCisgICAgICAgICAgICAvKiBOb3Qgc3VyZSB3aGF0IHRoaXMgZm9yLiAgUXVvdGUgbmV4dCBjaGFyYWN0ZXI/ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdmFybmFtZVtqKytdID0gc2JbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRuX3NzYm9wdChURUxPUFRfTkVXRU5WSVJPTixURUxRVUFMX0lTLHJlcGx5LG4pIDwgMCkgeworICAgICAgICBmcmVlKHJlcGx5KTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgZnJlZShyZXBseSk7CisgICAgcmV0dXJuKDEpOworfQorI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisKKy8qIFRlbG5ldCBzZW5kIHRlcm1pbmFsIHR5cGUgKi8KKy8qIFJldHVybnMgLTEgb24gZXJyb3IsIDAgaWYgbm90aGluZyBoYXBwZW5zLCAxIGlmIHR5cGUgc2VudCBzdWNjZXNzZnVsbHkgKi8KKworaW50Cit0bl9zdHR5cCgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VuZCB0ZWxuZXQgdGVybWluYWwgdHlwZS4gKi8KKyAgICBjaGFyICp0dG47ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lIG9mIHRlcm1pbmFsIHR5cGUuICovCisjaWZkZWYgT1MyCisgICAgc3RhdGljIGludCBhbGlhcyA9IC0xOyAgICAgICAgICAgICAgLyogd2hpY2ggYWxpYXMgYXJlIHdlIHVzaW5nID8gKi8KKyAgICBpbnQgc2V0dHlwZSA9IDA7CisjZW5kaWYgLyogT1MyICovCisgICAgaW50IGksIHJjOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29ya2VyLiAqLworICAgIGludCB0bnRlcm1mbGcgPSAwOworCisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCKSByZXR1cm4oMCk7CisgICAgaWYgKHR0bnByb3RvICE9IE5QX1RFTE5FVCkgcmV0dXJuKDApOworCisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX1RUWVBFKSkgcmV0dXJuKDApOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgIHR0biA9IE5VTEw7CisKKyNpZm5kZWYgTk9URVJNCisjaWZkZWYgT1MyCisgICAgaWYgKCF0bl90ZXJtKSB7CisgICAgICAgIGlmICh0dG51bSA9PSAtMSkgeworICAgICAgICAgICAgdHRudW0gPSB0dF90eXBlOworICAgICAgICAgICAgc2V0dHlwZSA9IDA7CisgICAgICAgICAgICBhbGlhcyA9IC0xOworICAgICAgICB9IGVsc2UgaWYgKHR0bnVtZW5kKSB7CisgICAgICAgICAgICB0dG51bWVuZCA9IDA7CisgICAgICAgICAgICBzZXR0eXBlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0dF9pbmZvW3R0X3R5cGVdLnhfYWxpYXNlc1srK2FsaWFzXSA9PSBOVUxMKSAgeworICAgICAgICAgICAgICAgIGlmICgtLXR0X3R5cGUgPCAwKQorICAgICAgICAgICAgICAgICAgdHRfdHlwZSA9IG1heF90dDsKKyAgICAgICAgICAgICAgICBpZiAodHRudW0gPT0gdHRfdHlwZSkKKyAgICAgICAgICAgICAgICAgIHR0bnVtZW5kID0gMTsKKyAgICAgICAgICAgICAgICBzZXR0eXBlID0gMTsKKyAgICAgICAgICAgICAgICBhbGlhcyA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0dF90eXBlID49IDAgJiYgdHRfdHlwZSA8PSBtYXhfdHQpIHsKKyAgICAgICAgICAgIGlmIChhbGlhcyA9PSAtMSkKKyAgICAgICAgICAgICAgdHRuID0gdHRfaW5mb1t0dF90eXBlXS54X25hbWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHR0biA9IHR0X2luZm9bdHRfdHlwZV0ueF9hbGlhc2VzW2FsaWFzXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgdHRuID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBzZXR0eXBlID0gMDsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT1RFUk0gKi8KKworICAgIGlmICh0bl90ZXJtKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmFsIHR5cGUgb3ZlcnJpZGU/ICovCisgICAgICAgIGRlYnVnKEYxMTAsInRuX3N0dHlwIix0bl90ZXJtLDApOworICAgICAgICBpZiAoKnRuX3Rlcm0pIHsKKyAgICAgICAgICAgIHR0biA9IHRuX3Rlcm07CisgICAgICAgICAgICB0bnRlcm1mbGcgPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIGRlYnVnKEYxMDAsInRuX3N0dHlwIG5vIHRlcm0gb3ZlcnJpZGUiLCIiLDApOworCisjaWZuZGVmIGRhdGFnZW5lcmFsCisgICAgaWYgKCF0dG4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgbm8gb3ZlcnJpZGUsICovCisgICAgICAgIHR0biA9IGdldGVudigiVEVSTSIpOyAgICAgICAgICAgLyogZ2V0IGl0IGZyb20gdGhlIGVudmlyb25tZW50LiAqLworICAgIH0KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworICAgIGlmICgodHRuID09ICgoY2hhciAqKTApKSB8fCAoKGludClzdHJsZW4odHRuKSA+PSBUU0JVRlNJWikpCisgICAgICB0dG4gPSAiVU5LTk9XTiI7CisgICAgc2Jfb3V0WzBdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0WzFdID0gKENIQVIpIFNCOyAgICAgICAgICAgICAgICAgIC8qIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0WzJdID0gVEVMT1BUX1RUWVBFOyAgICAgICAgICAgICAgIC8qIFRlcm1pbmFsIFR5cGUgKi8KKyAgICBzYl9vdXRbM10gPSAoQ0hBUikgMDsgICAgICAgICAgICAgICAgICAgLyogSXMuLi4gKi8KKyAgICBmb3IgKGkgPSA0OyAqdHRuOyB0dG4rKyxpKyspIHsgICAgICAvKiBDb3B5IGFuZCB1cHBlcmNhc2UgaXQgKi8KKyNpZmRlZiBWTVMKKyAgICAgICAgaWYgKCF0bnRlcm1mbGcgJiYgKnR0biA9PSAnLScgJiYKKyAgICAgICAgICAgICghc3RyY21wKHR0biwiLTgwIikgfHwgIXN0cmNtcCh0dG4sIi0xMzIiKSkpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBWTVMgKi8KKyAgICAgICAgICBzYl9vdXRbaV0gPSAoY2hhcikgKCghdG50ZXJtZmxnICYmIGlzbG93ZXIoKnR0bikpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdXBwZXIoKnR0bikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR0bik7CisgICAgfQorICAgIHR0biA9IChjaGFyICopc2Jfb3V0OyAgICAgICAgICAgICAgICAgICAvKiBQb2ludCBiYWNrIHRvIGJlZ2lubmluZyAqLworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIHNiX291dFtpXSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgIC8qIEZvciBkZWJ1Z2dpbmcgKi8KKyAgICAgICAgY2ttYWt4bXNnKHRuX21zZ19vdXQsVE5fTVNHX0xFTiwiVEVMTkVUIFNFTlQgU0IgIiwKKyAgICAgICAgICAgICAgICAgVEVMT1BUKFRFTE9QVF9UVFlQRSksIiBJUyAiLChjaGFyICopc2Jfb3V0KzQsIiBJQUMgU0UiLAorICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgLyogRW5kIG9mIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0U7ICAgICAgICAgICAgICAgIC8qIG1hcmtlZCBieSBJQUMgU0UgKi8KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgZGVidWcoRjEwMCx0bl9tc2dfb3V0LCIiLDApOworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuKC0xKTsKKyNpZm5kZWYgTk9URVJNCisjaWZkZWYgT1MyCisgICAgaWYgKHNldHR5cGUpCisgICAgICAgIHNldHRlcm10eXBlKHR0X3R5cGUsMCk7CisgICAgZWxzZSB7CisgICAgICAgIGlwYWRsMjUoKTsKKyAgICAgICAgVnNjcm5Jc0RpcnR5KFZURVJNKTsKKyAgICB9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9URVJNICovCisgICAgcmV0dXJuKDEpOworfQorCisjaWZkZWYgQ0tfRU5WSVJPTk1FTlQKKyNpZmRlZiBDS19YRElTUExPQworCisvKiBUZWxuZXQgc2VuZCB4ZGlzcGxheSBsb2NhdGlvbiAqLworLyogUmV0dXJucyAtMSBvbiBlcnJvciwgMCBpZiBub3RoaW5nIGhhcHBlbnMsIDEgaWYgdHlwZSBzZW50IHN1Y2Nlc3NmdWxseSAqLworCitpbnQKK3RuX3N4ZGlzcGxvYygpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZW5kIHRlbG5ldCBYIGRpc3BsYXkgbG9jYXRpb24uICovCisgICAgY2hhciAqIGRpc3A9TlVMTDsKKyAgICBpbnQgaSxyYzsKKworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKDApOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQpIHJldHVybigwKTsKKworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9YRElTUExPQykpIHJldHVybigwKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworI2lmZGVmIENLX0ZPUldBUkRfWAorICAgIGlmIChURUxPUFRfVShURUxPUFRfRk9SV0FSRF9YKSkgeworICAgICAgICBkaXNwID0gTlVMTDsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19GT1JXQVJEX1ggKi8KKyAgICAgICAgZGlzcCA9IChjaGFyICopdG5fZ2V0X2Rpc3BsYXkoKTsKKyAgICBkZWJ1ZyhGMTEwLCJ0bl9zeGRpc3Bsb2MiLGRpc3AsMCk7CisKKyAgICBpZiAoIWRpc3ApIHsKKyAgICAgICAgLyogQ2FuJ3QgZG8gYm90aCwgc2VuZCBXT05UICovCisgICAgICAgIGlmICh0bl9zb3B0KFdPTlQsVEVMT1BUX1hESVNQTE9DKSA8IDApCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBURUxPUFRfVU5BTlNXRVJFRF9XT05UKFRFTE9QVF9YRElTUExPQykgPSAxOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgc2Jfb3V0WzBdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0WzFdID0gKENIQVIpIFNCOyAgICAgICAgICAgICAgICAgIC8qIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0WzJdID0gVEVMT1BUX1hESVNQTE9DOyAgICAgICAgICAgIC8qIFgtRGlzcGxheSBMb2NhdGlvbiAqLworICAgIHNiX291dFszXSA9IChDSEFSKSAwOyAgICAgICAgICAgICAgICAgICAvKiBJcy4uLiAqLworICAgIGZvciAoaSA9IDQ7ICpkaXNwOyBkaXNwKyssaSsrKSB7ICAgICAgLyogQ29weSBhbmQgdXBwZXJjYXNlIGl0ICovCisgICAgICAgIHNiX291dFtpXSA9IChjaGFyKSAqZGlzcDsKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgc2Jfb3V0W2ldID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgLyogRm9yIGRlYnVnZ2luZyAqLworICAgICAgICBja21ha3htc2coIHRuX21zZ19vdXQsVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICJURUxORVQgU0VOVCBTQiAiLFRFTE9QVChURUxPUFRfWERJU1BMT0MpLAorICAgICAgICAgICAgICAgICAgIiBJUyAiLChjaGFyICopc2Jfb3V0KzQsIiBJQUMgU0UiLAorICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgIC8qIEVuZCBvZiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNFOyAgICAgICAgICAgICAgICAvKiBtYXJrZWQgYnkgSUFDIFNFICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMDAsdG5fbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByYyA9ICh0dG9sKChDSEFSICopc2Jfb3V0LGkpIDwgMCk7ICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICByZXR1cm4oMSk7Cit9CisjZW5kaWYgLyogQ0tfWERJU1BMT0MgKi8KKyNlbmRpZiAvKiBDS19FTlZJUk9OTUVOVCAqLworCisjaWZkZWYgQ0tfRk9SV0FSRF9YCitpbnQKK3RuX3NuZGZ3ZHgoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZW5kIEZ3ZCBYIFNjcmVlbiBudW1iZXIgdG8gaG9zdCAqLworICAgIHVuc2lnbmVkIGNoYXIgc2NyZWVuID0gMDsKKyAgICBjaGFyICogZGlzcDsKKyAgICBpbnQgaSxyYzsKKworICAgIGlmICghVEVMT1BUX1UoVEVMT1BUX0ZPUldBUkRfWCkpIHJldHVybigwKTsKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICAvKgorICAgICAqIFRoZSBmb3JtYXQgb2YgdGhlIERJU1BMQVkgdmFyaWFibGUgaXMgWzxob3N0PjpdPGRpc3BsYXk+Wy48c2NyZWVuPl0KKyAgICAgKiB3aGVyZSA8aG9zdD4gaXMgYW4gb3B0aW9uYWwgRE5TIG5hbWUgb3IgaXAgYWRkcmVzcyB3aXRoIGEgZGVmYXVsdCBvZgorICAgICAqIHRoZSBsb2NhbGhvc3Q7IHRoZSBzY3JlZW4gZGVmYXVsdHMgdG8gMAorICAgICAqLworCisgICAgZGlzcCA9IHRuX2dldF9kaXNwbGF5KCk7CisgICAgaWYgKGRpc3ApIHsKKyAgICAgICAgaW50IGNvbG9uLGRvdDsKKyAgICAgICAgY29sb24gPSBja2luZGV4KCI6IixkaXNwLDAsMCwxKTsKKyAgICAgICAgZG90ICAgPSBja2luZGV4KCIuIiwmZGlzcFtjb2xvbl0sMCwwLDEpOworCisgICAgICAgIGlmICggZG90ICkgeworICAgICAgICAgICAgc2NyZWVuID0gYXRvaSgmZGlzcFtjb2xvbitkb3RdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNjcmVlbiA9IDA7CisgICAgfQorCisgICAgaSA9IDA7CisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogSSBBbSBhIENvbW1hbmQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gVEVMT1BUX0ZPUldBUkRfWDsgICAgICAgICAgIC8qIEZvcndhcmQgWCAqLworICAgIHNiX291dFtpKytdID0gRldEWF9TQ1JFRU47ICAgICAgICAgICAgICAgIC8qIFNjcmVlbiAqLworICAgIHNiX291dFtpKytdID0gc2NyZWVuOworICAgIGlmICggc2NyZWVuID09IElBQyApCisgICAgICAgIHNiX291dFtpKytdID0gSUFDOworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNFOyAgICAgICAgICAgICAgICAgIC8qIG1hcmtlZCBieSBJQUMgU0UgKi8KKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2coIHRuX21zZ19vdXQsVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0ZPUldBUkRfWCksCisgICAgICAgICAgICAgICAgICAgIiBTQ1JFRU4gIixja2N0b3goc2NyZWVuLDEpLCIgSUFDIFNFIiwKKyAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgZGVidWcoRjEwMCx0bl9tc2dfb3V0LCIiLDApOworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4oLTEpOworICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBDS19GT1JXQVJEX1ggKi8KKworI2lmZGVmIENLX1NORExPQworaW50Cit0bl9zbmRsb2MoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VuZCBsb2NhdGlvbi4gKi8KKyAgICBpbnQgaSxyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXb3JrZXIuICovCisgICAgY2hhciAqdHRsb2M7CisKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfU05ETE9DKSkgcmV0dXJuKDApOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgIHR0bG9jID0gKHRuX2xvYyA/IHRuX2xvYyA6ICIiKTsgICAgIC8qIEluIGNhc2Ugd2UgYXJlIGJlaW5nIGNhbGxlZCBldmVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhvdWdoIHRoZXJlIGlzIG5vIGxvY2F0aW9uLiAqLworICAgIHNiX291dFswXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBJIEFtIGEgQ29tbWFuZCAqLworICAgIHNiX291dFsxXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFsyXSA9IFRFTE9QVF9TTkRMT0M7ICAgICAgICAgICAgICAvKiBMb2NhdGlvbiAqLworICAgIGZvciAoaSA9IDM7ICp0dGxvYyAmJiBpIDwgVFNCVUZTSVo7IHR0bG9jKyssaSsrKSAvKiBDb3B5IGl0ICovCisgICAgICBzYl9vdXRbaV0gPSAoY2hhcikgKnR0bG9jOworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgLyogbWFya2VkIGJ5IElBQyBTRSAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgY2ttYWt4bXNnKHRuX21zZ19vdXQsVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICJURUxORVQgU0VOVCBTQiAiLFRFTE9QVChURUxPUFRfU05ETE9DKSwiICIsKGNoYXIgKilzYl9vdXQrMywKKyAgICAgICAgICAgICAgICAgICIgSUFDIFNFIiwgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMDAsdG5fbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByYyA9ICh0dG9sKChDSEFSICopc2Jfb3V0LGkpIDwgMCk7ICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICBzYl9vdXRbaS0yXSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGRlYnVnZ2luZyAqLworICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBDS19TTkRMT0MgKi8KKworI2lmZGVmIENLX05BV1MgICAgICAgICAgICAgICAgICAvKiAgTkFXUyA9IE5lZ290aWF0ZSBBYm91dCBXaW5kb3cgU2l6ZSAgKi8KK2ludAordG5fc25hd3MoKSB7ICAgICAgICAgICAgICAgICAgICAvKiAgU2VuZCB0ZXJtaW5hbCB3aWR0aCBhbmQgaGVpZ2h0LCBSRkMgMTA3MyAqLworI2lmbmRlZiBOT0xPQ0FMCisgICAgQ0hBUiBzYl9vdXRbMjRdOyAgICAgICAgICAgIC8qICBtdWx0aXBsZSB0aHJlYWRzICovCisgICAgaW50IGkgPSAwLHJjOworI2lmZGVmIE9TMgorICAgIGludCB4ID0gVnNjcm5HZXRXaWR0aChWVEVSTSksCisgICAgeSA9IFZzY3JuR2V0SGVpZ2h0KFZURVJNKSAtICh0dF9zdGF0dXNbVlRFUk1dID8gMSA6IDApOworI2Vsc2UgLyogT1MyICovCisgICAgaW50IHggPSB0dF9jb2xzLCB5ID0gdHRfcm93czsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKDApOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQpIHJldHVybigwKTsKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfTkFXUykpIHJldHVybigwKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICBpZiAoeCA8IDApIHggPSAwOworICAgIGlmICh5IDwgMCkgeSA9IDA7CisKKyAgICBpZiAoeCA9PSBURUxPUFRfU0IoVEVMT1BUX05BV1MpLm5hd3MueCAmJiAvKiBPbmx5IHNlbmQgaWYgY2hhbmdlZCAqLworICAgICAgICB5ID09IFRFTE9QVF9TQihURUxPUFRfTkFXUykubmF3cy55CisgICAgICAgICkKKyAgICAgIHJldHVybigwKTsKKyAgICBURUxPUFRfU0IoVEVMT1BUX05BV1MpLm5hd3MueCA9IHg7ICAvKiBSZW1lbWJlciB0aGUgc2l6ZSAgICAgKi8KKyAgICBURUxPUFRfU0IoVEVMT1BUX05BV1MpLm5hd3MueSA9IHk7CisKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgLyogU2VuZCB0aGUgc3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTQjsKKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9OQVdTOworICAgIHNiX291dFtpKytdID0gKENIQVIpICh4ID4+IDgpICYgMHhmZjsKKyAgICBpZiAoKENIQVIpIHNiX291dFtpLTFdID09IChDSEFSKSBJQUMpICAgLyogSUFDIGluIGRhdGEgbXVzdCBiZSBkb3VibGVkICovCisgICAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7CisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgKHggJiAweGZmKTsKKyAgICBpZiAoKENIQVIpIHNiX291dFtpLTFdID09IChDSEFSKSBJQUMpCisgICAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7CisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgKHkgPj4gOCkgJiAweGZmOworICAgIGlmICgoQ0hBUikgc2Jfb3V0W2ktMV0gPT0gKENIQVIpIElBQykKKyAgICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSAoeSAmIDB4ZmYpOworICAgIGlmICgoQ0hBUikgc2Jfb3V0W2ktMV0gPT0gKENIQVIpIElBQykKKyAgICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7CisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0U7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgY2ttYWt4bXNnKHRuX21zZ19vdXQsVE5fTVNHX0xFTiwiVEVMTkVUIFNFTlQgU0IgTkFXUyAiLAorICAgICAgICAgICAgICAgICAgY2tpdG9hKHgpLCIgIixja2l0b2EoeSksIiBJQUMgU0UiLAorICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLHRuX21zZ19vdXQsIiIsMCk7CisgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZ19vdXQpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgcmMgPSAodHRvbCgoQ0hBUiAqKXNiX291dCxpKSA8IDApOyAgICAgIC8qIFNlbmQgaXQuICovCisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybigtMSk7CisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIHJldHVybiAoMCk7Cit9CisjZW5kaWYgLyogQ0tfTkFXUyAqLworCisjaWZkZWYgVE5fQ09NUE9SVAorc3RhdGljIGNoYXIgKiB0bmNfc2lnbmF0dXJlID0gTlVMTDsKK3N0YXRpYyBpbnQgdG5jX2xzX21hc2sgPSAwOworc3RhdGljIGludCB0bmNfbHMgPSAwOworc3RhdGljIGludCB0bmNfbXNfbWFzayA9IDI1NTsKK3N0YXRpYyBpbnQgdG5jX21zID0gMDsKK3N0YXRpYyBpbnQgdG5jX29mbG93ID0gMDsKK3N0YXRpYyBpbnQgdG5jX2lmbG93ID0gMDsKK3N0YXRpYyBpbnQgdG5jX2JwcyA9IDA7CitzdGF0aWMgaW50IHRuY19kYXRhc2l6ZSA9IDA7CitzdGF0aWMgaW50IHRuY19wYXJpdHkgPSAwOworc3RhdGljIGludCB0bmNfc3RvcGJpdCA9IDA7CitzdGF0aWMgaW50IHRuY19icmVhayA9IDA7CitzdGF0aWMgaW50IHRuY19kdHIgPSAwOworc3RhdGljIGludCB0bmNfcnRzID0gMDsKK3N0YXRpYyBpbnQgdG5jX3N1c3BlbmRfeG1pdCA9IDA7CitzdGF0aWMgaW50IHRuY19icHNfaW5kZXggPSAtMTsKKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RuY19pbml0KHZvaWQpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX2luaXQoKQorI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfaW5pdCAqLyB7CisgICAgZGVidWcoRjEwMCwidG5jX2luaXQiLCIiLDApOworCisgICAgaWYgKHRuY19zaWduYXR1cmUpIHsKKyAgICAgICAgZnJlZSh0bmNfc2lnbmF0dXJlKTsKKyAgICAgICAgdG5jX3NpZ25hdHVyZSA9IE5VTEw7CisgICAgfQorICAgIHRuY19sc19tYXNrID0gMDsKKyAgICB0bmNfbHMgPSAwOworICAgIHRuY19tc19tYXNrID0gMjU1OworICAgIHRuY19tcyA9IDA7CisgICAgdG5jX29mbG93ID0gMDsKKyAgICB0bmNfaWZsb3cgPSAwOworICAgIHRuY19icHMgPSAwOworICAgIHRuY19kYXRhc2l6ZSA9IDA7CisgICAgdG5jX3Bhcml0eSA9IDA7CisgICAgdG5jX3N0b3BiaXQgPSAwOworICAgIHRuY19icmVhayA9IDA7CisgICAgdG5jX2R0ciA9IDA7CisgICAgdG5jX3J0cyA9IDA7CisgICAgdG5jX3N1c3BlbmRfeG1pdCA9IDA7CisgICAgdG5jX2Jwc19pbmRleCA9IC0xOworICAgIHJldHVybigwKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RuX3NuZGNvbXBvcnQodm9pZCkKKyNlbHNlIC8qIENLX0FOU0lDICovCit0bl9zbmRjb21wb3J0KCkKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdG5fc25kY29tcG9ydCAqLyB7CisgICAgaW50IGJhdWQsIGRhdGFzaXplLCBwYXJpdHksIHN0b3BzaXplLCBvZmxvdywgaWZsb3c7CisgICAgQ09OU1QgY2hhciAqIHNpZ25hdHVyZTsKKworICAgIGRlYnVnKEYxMDAsInRuY19zbmRjb21wb3J0IiwiIiwwKTsKKyAgICBzaWduYXR1cmUgPSB0bmNfZ2V0X3NpZ25hdHVyZSgpOworICAgIGJhdWQgPSB0bmNfZ2V0X2JhdWQoKTsKKyAgICBkYXRhc2l6ZSA9IHRuY19nZXRfZGF0YXNpemUoKTsKKyAgICBwYXJpdHkgPSB0bmNfZ2V0X3Bhcml0eSgpOworICAgIHN0b3BzaXplID0gdG5jX2dldF9zdG9wc2l6ZSgpOworICAgIG9mbG93ID0gdG5jX2dldF9vZmxvdygpOworICAgIGlmbG93ID0gdG5jX2dldF9pZmxvdygpOworICAgIHRuY19zZXRfbHNfbWFzaygyNTUpOworICAgIHRuY19zZXRfbXNfbWFzaygyNTUpOworICAgIHJldHVybigwKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RuY193YWl0KENIQVIgKiBtc2csIGludCBtcykKKyNlbHNlIC8qIENLX0FOU0lDICovCit0bmNfd2FpdChtc2csIG1zKSBDSEFSICogbXNnOyBpbnQgbXM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHRuY193YWl0ICovIHsKKyAgICBpbnQgcmMsIHRuX3dhaXRfc2F2ZSA9IHRuX3dhaXRfZmxnOworICAgIGRlYnVnKEYxMTEsInRuY193YWl0IiwiYmVnaW4iLG1zKTsKKyAgICBpZiAoIG1zICkKKyAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9DT01QT1JUKS5jb21wb3J0LndhaXRfZm9yX21zID0gMTsKKyAgICBlbHNlCisgICAgICAgIFRFTE9QVF9TQihURUxPUFRfQ09NUE9SVCkuY29tcG9ydC53YWl0X2Zvcl9zYiA9IDE7CisgICAgdG5fd2FpdF9mbGcgPSAxOworICAgIHJjID0gdG5fd2FpdCgoY2hhciAqKW1zZyk7CisgICAgdG5fcHVzaCgpOworICAgIGRlYnVnKEYxMTAsInRuY193YWl0IiwiZW5kIiwwKTsKKyAgICB0bl93YWl0X2ZsZyA9IHRuX3dhaXRfc2F2ZTsKKyAgICByZXR1cm4ocmMpOworfQorCisvKiBSZXR1cm5zIC0xIG9uIGVycm9yLCAwIG9uIHN1Y2Nlc3MgKi8KKy8qIEluIG9yZGVyIGZvciB0aGlzIGNvZGUgdG8gd29yaywgc2JbbGVuXSA9PSBJQUMgICAgICAgICAgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RuY190bl9zYihDSEFSICogc2IsIGludCBsZW4pCisjZWxzZQordG5jX3RuX3NiKHNiLCBsZW4pIENIQVIgKiBzYjsgaW50IGxlbjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdG5jX3RuX3NiICovIHsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpIHJldHVybigwKTsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7CisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX0NPTVBPUlQpKSByZXR1cm4oMCk7CisKKyAgICBpZiAoIXNiKSByZXR1cm4oLTEpOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgZGVidWcoRjExMSwidG5jX3RuX3NiIiwic2JbMF0iLHNiWzBdKTsKKyAgICBkZWJ1ZyhGMTExLCJ0bmNfdG5fc2IiLCJsZW4iLGxlbik7CisKKyAgICBzd2l0Y2ggKHNiWzBdKSB7CisgICAgICBjYXNlIFROQ19DMlNfU0lHTkFUVVJFOgorICAgICAgY2FzZSBUTkNfUzJDX1NJR05BVFVSRToKKyAgICAgICAgZGVidWcoRjExMSwidG5jX3RuX3NiIiwic2lnbmF0dXJlIixsZW4pOworICAgICAgICBpZiAobGVuID09IDEpIHsKKyAgICAgICAgICAgIHRuY19zZW5kX3NpZ25hdHVyZSgiS2VybWl0IFRlbG5ldCBDb20gUG9ydCBPcHRpb24iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfQ09NUE9SVCkuY29tcG9ydC53YWl0X2Zvcl9zYiA9IDA7CisgICAgICAgICAgICBpZiAodG5jX3NpZ25hdHVyZSkKKyAgICAgICAgICAgICAgZnJlZSh0bmNfc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIHRuY19zaWduYXR1cmUgPSBtYWxsb2MobGVuKTsKKyAgICAgICAgICAgIGlmICh0bmNfc2lnbmF0dXJlKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHRuY19zaWduYXR1cmUsJnNiWzFdLGxlbi0xKTsKKyAgICAgICAgICAgICAgICB0bmNfc2lnbmF0dXJlW2xlbi0xXSA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVE5DX0MyU19TRVRfQkFVRFJBVEU6CisgICAgICBjYXNlIFROQ19TMkNfU0VUX0JBVURSQVRFOiB7CisgICAgICAgICAgbG9uZyBiYXVkcmF0ZTsKKyAgICAgICAgICBjaGFyICogYnIgPSAoY2hhciAqKSZiYXVkcmF0ZTsKKyAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0NPTVBPUlQpLmNvbXBvcnQud2FpdF9mb3Jfc2IgPSAwOworICAgICAgICAgIGlmIChsZW4gPT0gMikgeworICAgICAgICAgICAgLyogQWN0dWFsIGJlaGF2aW9yIG9mIHRoZSBBY2Nlc3MgU2VydmVyLi4uICovCisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ0bmNfdG5fc2IiLCJiYXVkcmF0ZSBpbmRleCIsc2JbMV0pOworICAgICAgICAgICAgdG5jX2Jwc19pbmRleCA9IDE7CisgICAgICAgICAgICBzd2l0Y2ggKHNiWzFdKSB7CisgICAgICAgICAgICBjYXNlIFROQ19CUFNfMzAwOgorICAgICAgICAgICAgICB0bmNfYnBzID0gMzAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVE5DX0JQU182MDA6CisgICAgICAgICAgICAgIHRuY19icHMgPSA2MDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUTkNfQlBTXzEyMDA6CisgICAgICAgICAgICAgIHRuY19icHMgPSAxMjAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVE5DX0JQU18yNDAwOgorICAgICAgICAgICAgICB0bmNfYnBzID0gMjQwMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFROQ19CUFNfNDgwMDoKKyAgICAgICAgICAgICAgdG5jX2JwcyA9IDQ4MDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUTkNfQlBTXzk2MDA6CisgICAgICAgICAgICAgIHRuY19icHMgPSA5NjAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVE5DX0JQU18xNDQwMDoKKyAgICAgICAgICAgICAgdG5jX2JwcyA9IDE0NDAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVE5DX0JQU18xOTIwMDoKKyAgICAgICAgICAgICAgdG5jX2JwcyA9IDE5MjAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVE5DX0JQU18yODgwMDoKKyAgICAgICAgICAgICAgdG5jX2JwcyA9IDI4ODAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVE5DX0JQU18zODQwMDoKKyAgICAgICAgICAgICAgdG5jX2JwcyA9IDM4NDAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVE5DX0JQU181NzYwMDoKKyAgICAgICAgICAgICAgdG5jX2JwcyA9IDU3NjAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVE5DX0JQU18xMTUyMDA6CisgICAgICAgICAgICAgIHRuY19icHMgPSAxMTUyMDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUTkNfQlBTXzIzMDQwMDoKKyAgICAgICAgICAgICAgdG5jX2JwcyA9IDIzMDQwMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFROQ19CUFNfNDYwODAwOgorICAgICAgICAgICAgICB0bmNfYnBzID0gNDYwODAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHRuY19icHMgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSA1KSB7CisgICAgICAgICAgICAvKiBUaGlzIHNlY3Rpb24gYXR0ZW1wdHMgdG8gZm9sbG93IFJGQyAyMjE3ICovCisgICAgICAgICAgICAgIHRuY19icHNfaW5kZXggPSAwOworICAgICAgICAgICAgICBiclswXSA9IHNiWzFdOworICAgICAgICAgICAgICBiclsxXSA9IHNiWzJdOworICAgICAgICAgICAgICBiclsyXSA9IHNiWzNdOworICAgICAgICAgICAgICBiclszXSA9IHNiWzRdOworI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgICAgICAgICAgIC8qIEFPUy9WUyBkb2Vzbid0IGhhdmUgbnRvaGwoKSBidXQgTVYncyBhcmUgYmlnLWVuZGlhbiAqLworICAgICAgICAgICAgICB0bmNfYnBzID0gYmF1ZHJhdGU7CisjZWxzZQorICAgICAgICAgICAgICB0bmNfYnBzID0gbnRvaGwoYmF1ZHJhdGUpOworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInRuY190bl9zYiIsImJhdWRyYXRlIHJmYyIsdG5jX2Jwcyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZGVidWcoRjExMSwidG5jX3RuX3NiIiwiYmF1ZHJhdGUgaW52YWxpZCBsZW4iLGxlbik7CisgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBUTkNfQzJTX1NFVF9EQVRBU0laRToKKyAgICAgIGNhc2UgVE5DX1MyQ19TRVRfREFUQVNJWkU6CisgICAgICAgIFRFTE9QVF9TQihURUxPUFRfQ09NUE9SVCkuY29tcG9ydC53YWl0X2Zvcl9zYiA9IDA7CisgICAgICAgIGlmIChsZW4gPCAyKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIHRuY19kYXRhc2l6ZSA9IHNiWzFdOworICAgICAgICBkZWJ1ZyhGMTExLCJ0bmNfdG5fc2IiLCJkYXRhc2l6ZSIsc2JbMV0pOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUTkNfQzJTX1NFVF9QQVJJVFk6CisgICAgICBjYXNlIFROQ19TMkNfU0VUX1BBUklUWToKKyAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9DT01QT1JUKS5jb21wb3J0LndhaXRfZm9yX3NiID0gMDsKKyAgICAgICAgaWYgKGxlbiA8IDIpCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgdG5jX3Bhcml0eSA9IHNiWzFdOworICAgICAgICBkZWJ1ZyhGMTExLCJ0bmNfdG5fc2IiLCJwYXJpdHkiLHNiWzFdKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVE5DX0MyU19TRVRfU1RPUFNJWkU6CisgICAgICBjYXNlIFROQ19TMkNfU0VUX1NUT1BTSVpFOgorICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0NPTVBPUlQpLmNvbXBvcnQud2FpdF9mb3Jfc2IgPSAwOworICAgICAgICBpZiAobGVuIDwgMikKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB0bmNfc3RvcGJpdCA9IHNiWzFdOworICAgICAgICBkZWJ1ZyhGMTExLCJ0bmNfdG5fc2IiLCJzdG9wc2l6ZSIsc2JbMV0pOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUTkNfQzJTX1NFVF9DT05UUk9MOgorICAgICAgY2FzZSBUTkNfUzJDX1NFVF9DT05UUk9MOgorICAgICAgICBpZiAobGVuIDwgMikgeworICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9DT01QT1JUKS5jb21wb3J0LndhaXRfZm9yX3NiID0gMDsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgLyogVGhpcyBsaW5lIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gdGVzdGluZyBpcyBjb21wbGV0ZS4gKi8KKyAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9DT01QT1JUKS5jb21wb3J0LndhaXRfZm9yX3NiID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAgICAgc3dpdGNoICggc2JbMV0gKSB7CisgICAgICAgICAgY2FzZSBUTkNfQ1RMX09GTE9XX1JFUVVFU1Q6CisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgbG9jYWwgb3V0Ym91bmQgZmxvdyBjb250cm9sIGFuZCBzZW5kIHRvIHBlZXIgKi8KKwkgICAgLyogQ2lzY28gSU9TIHJldHVybnMgMCAoVE5DX0NUTF9PRkxPV19SRVFVRVNUKSB3aGVuIGF0dGVtcHRpbmcgKi8KKwkgICAgLyogdG8gc2V0IHRoZSBpbmJvdW5kIGZsb3cgY29udHJvbCBpZiBpdCBpcyBub3Qgc3VwcG9ydGVkICAgICAgKi8KKwkgICAgLyogc2VwYXJhdGVseSBmcm9tIG91dGJvdW5kIGZsb3cgY29udHJvbC4gIFNvIG11c3QgcmVzZXQgICAgICAgKi8KKwkgICAgLyogd2FpdCBmb3Igc2IgZmxhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInRuY190bl9zYiIsIm9mbG93IHJlcXVlc3QiLDApOworICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9DT01QT1JUKS5jb21wb3J0LndhaXRfZm9yX3NiID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVE5DX0NUTF9PRkxPV19OT05FOgorICAgICAgICAgIGNhc2UgVE5DX0NUTF9PRkxPV19YT05fWE9GRjoKKyAgICAgICAgICBjYXNlIFROQ19DVExfT0ZMT1dfUlRTX0NUUzoKKyAgICAgICAgICBjYXNlIFROQ19DVExfT0ZMT1dfRENEOgorICAgICAgICAgIGNhc2UgVE5DX0NUTF9PRkxPV19EU1I6CisgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0NPTVBPUlQpLmNvbXBvcnQud2FpdF9mb3Jfc2IgPSAwOworICAgICAgICAgICAgdG5jX29mbG93ID0gc2JbMV07CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ0bmNfdG5fc2IiLCJvZmxvdyIsc2JbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTkNfQ1RMX0JSRUFLX1JFUVVFU1Q6CisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgbG9jYWwgYnJlYWsgc3RhdGUgYW5kIHNlbmQgdG8gcGVlciAqLworICAgICAgICAgICAgZGVidWcoRjExMCwidG5jX3RuX3NiIiwiYnJlYWsgcmVxdWVzdCIsMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFROQ19DVExfQlJFQUtfT046CisgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0NPTVBPUlQpLmNvbXBvcnQud2FpdF9mb3Jfc2IgPSAwOworICAgICAgICAgICAgdG5jX2JyZWFrID0gMTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInRuY190bl9zYiIsImJyZWFrIG9uIiwwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBUTkNfQ1RMX0JSRUFLX09GRjoKKyAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfQ09NUE9SVCkuY29tcG9ydC53YWl0X2Zvcl9zYiA9IDA7CisgICAgICAgICAgICB0bmNfYnJlYWsgPSAwOworICAgICAgICAgICAgZGVidWcoRjExMCwidG5jX3RuX3NiIiwiYnJlYWsgb2ZmIiwwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBUTkNfQ1RMX0RUUl9SRVFVRVNUOgorICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGxvY2FsIGR0ciBzdGF0ZSBhbmQgc2VuZCB0byBwZWVyICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ0bmNfdG5fc2IiLCJkdHIgcmVxdWVzdCIsMCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgVE5DX0NUTF9EVFJfT046CisgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0NPTVBPUlQpLmNvbXBvcnQud2FpdF9mb3Jfc2IgPSAwOworICAgICAgICAgICAgdG5jX2R0ciA9IDE7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ0bmNfdG5fc2IiLCJkdHIgb24iLDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFROQ19DVExfRFRSX09GRjoKKyAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfQ09NUE9SVCkuY29tcG9ydC53YWl0X2Zvcl9zYiA9IDA7CisgICAgICAgICAgICB0bmNfZHRyID0gMDsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInRuY190bl9zYiIsImR0ciBvZmYiLDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFROQ19DVExfUlRTX1JFUVVFU1Q6CisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgbG9jYWwgcnRzIHN0YXRlIGFuZCBzZW5kIHRvIHBlZXIgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInRuY190bl9zYiIsInJ0cyByZXF1ZXN0IiwwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBUTkNfQ1RMX1JUU19PTjoKKyAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfQ09NUE9SVCkuY29tcG9ydC53YWl0X2Zvcl9zYiA9IDA7CisgICAgICAgICAgICB0bmNfcnRzID0gMTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInRuY190bl9zYiIsInJ0cyBvbiIsMCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgVE5DX0NUTF9SVFNfT0ZGOgorICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9DT01QT1JUKS5jb21wb3J0LndhaXRfZm9yX3NiID0gMDsKKyAgICAgICAgICAgIHRuY19ydHMgPSAwOworICAgICAgICAgICAgZGVidWcoRjExMCwidG5jX3RuX3NiIiwicnRzIG9mZiIsMCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgVE5DX0NUTF9JRkxPV19SRVFVRVNUOgorICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGxvY2FsIGluYm91bmQgZmxvdyBjb250cm9sIGFuZCBzZW5kIHRvIHBlZXIgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInRuY190bl9zYiIsImlmbG93IHJlcXVlc3QiLDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFROQ19DVExfSUZMT1dfTk9ORToKKyAgICAgICAgICBjYXNlIFROQ19DVExfSUZMT1dfWE9OX1hPRkY6CisgICAgICAgICAgY2FzZSBUTkNfQ1RMX0lGTE9XX1JUU19DVFM6CisgICAgICAgICAgY2FzZSBUTkNfQ1RMX0lGTE9XX0RUUjoKKyAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfQ09NUE9SVCkuY29tcG9ydC53YWl0X2Zvcl9zYiA9IDA7CisgICAgICAgICAgICB0bmNfaWZsb3cgPSBzYlsxXTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsInRuY190bl9zYiIsImlmbG93IixzYlsxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUTkNfQzJTX05PVElGWV9MSU5FU1RBVEU6CisgICAgICBjYXNlIFROQ19TMkNfU0VORF9MUzoKKyAgICAgICAgaWYgKGxlbiA8IDIpCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgdG5jX2xzID0gc2JbMV07CisgICAgICAgIGRlYnVnKEYxMTEsInRuY190bl9zYiIsImxpbmVzdGF0ZSIsc2JbMV0pOworICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICAgICAgaWYgKHRuY19scyAmIFROQ19NU19EQVRBX1JFQURZICkKKyAgICAgICAgICAgICAgdG5fZGVidWcoIiAgQ29tUG9ydCBMaW5lc3RhdGUgRGF0YSBSZWFkeSIpOworICAgICAgICAgICAgaWYgKHRuY19scyAmIFROQ19NU19PVkVSUlVOX0VSUk9SICkKKyAgICAgICAgICAgICAgdG5fZGVidWcoIiAgQ29tUG9ydCBMaW5lc3RhdGUgT3ZlcnJ1biBFcnJvciIpOworICAgICAgICAgICAgaWYgKHRuY19scyAmIFROQ19NU19QQVJJVFlfRVJST1IgKQorICAgICAgICAgICAgICB0bl9kZWJ1ZygiICBDb21Qb3J0IExpbmVzdGF0ZSBQYXJpdHkgRXJyb3IiKTsKKyAgICAgICAgICAgIGlmICh0bmNfbHMgJiBUTkNfTVNfRlJBTUVfRVJST1IgKQorICAgICAgICAgICAgICB0bl9kZWJ1ZygiICBDb21Qb3J0IExpbmVzdGF0ZSBGcmFtaW5nIEVycm9yIik7CisgICAgICAgICAgICBpZiAodG5jX2xzICYgVE5DX01TX0JSRUFLX0VSUk9SICkKKyAgICAgICAgICAgICAgdG5fZGVidWcoIiAgQ29tUG9ydCBMaW5lc3RhdGUgQnJlYWsgRGV0ZWN0IEVycm9yIik7CisgICAgICAgICAgICBpZiAodG5jX2xzICYgVE5DX01TX0hSX0VNUFRZICkKKyAgICAgICAgICAgICAgdG5fZGVidWcoIiAgQ29tUG9ydCBMaW5lc3RhdGUgSG9sZGluZyBSZWdpc3RlciBFbXB0eSIpOworICAgICAgICAgICAgaWYgKHRuY19scyAmIFROQ19NU19TUl9FTVBUWSApCisgICAgICAgICAgICAgIHRuX2RlYnVnKCIgIENvbVBvcnQgTGluZXN0YXRlIFNoaWZ0IFJlZ2lzdGVyIEVtcHR5Iik7CisgICAgICAgICAgICBpZiAodG5jX2xzICYgVE5DX01TX1RJTUVPVVRfRVJST1IgKQorICAgICAgICAgICAgICB0bl9kZWJ1ZygiICBDb21Qb3J0IExpbmVzdGF0ZSBUaW1lb3V0IEVycm9yIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVE5DX0MyU19OT1RJRllfTU9ERU1TVEFURToKKyAgICAgIGNhc2UgVE5DX1MyQ19TRU5EX01TOgorICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0NPTVBPUlQpLmNvbXBvcnQud2FpdF9mb3JfbXMgPSAwOworICAgICAgICBpZiAobGVuIDwgMikKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB0bmNfbXMgPSBzYlsxXTsKKyAgICAgICAgZGVidWcoRjExMSwidG5jX3RuX3NiIiwibW9kZW1zdGF0ZSIsc2JbMV0pOworICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICAgICAgaWYgKHRuY19tcyAmIFROQ19NU19DVFNfREVMVEEgKQorICAgICAgICAgICAgICB0bl9kZWJ1ZygiICBDb21Qb3J0IE1vZGVtc3RhdGUgQ1RTIFN0YXRlIENoYW5nZSIpOworICAgICAgICAgICAgaWYgKHRuY19tcyAmIFROQ19NU19EU1JfREVMVEEgKQorICAgICAgICAgICAgICB0bl9kZWJ1ZygiICBDb21Qb3J0IE1vZGVtc3RhdGUgRFNSIFN0YXRlIENoYW5nZSIpOworICAgICAgICAgICAgaWYgKHRuY19tcyAmIFROQ19NU19FREdFX1JJTkcgKQorICAgICAgICAgICAgICB0bl9kZWJ1ZygiICBDb21Qb3J0IE1vZGVtc3RhdGUgVHJhaWxpbmcgRWRnZSBSaW5nIERldGVjdG9yIE9uIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHRuX2RlYnVnKCIgIENvbVBvcnQgTW9kZW1zdGF0ZSBUcmFpbGluZyBFZGdlIFJpbmcgRGV0ZWN0b3IgT2ZmIik7CisgICAgICAgICAgICBpZiAodG5jX21zICYgVE5DX01TX1JMU0RfREVMVEEgKQorICAgICAgICAgICAgICB0bl9kZWJ1ZygiICBDb21Qb3J0IE1vZGVtc3RhdGUgUkxTRCBTdGF0ZSBDaGFuZ2UiKTsKKyAgICAgICAgICAgIGlmICh0bmNfbXMgJiBUTkNfTVNfQ1RTX1NJRyApCisgICAgICAgICAgICAgIHRuX2RlYnVnKCIgIENvbVBvcnQgTW9kZW1zdGF0ZSBDVFMgU2lnbmFsIE9uIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHRuX2RlYnVnKCIgIENvbVBvcnQgTW9kZW1zdGF0ZSBDVFMgU2lnbmFsIE9mZiIpOworICAgICAgICAgICAgaWYgKHRuY19tcyAmIFROQ19NU19EU1JfU0lHICkKKyAgICAgICAgICAgICAgdG5fZGVidWcoIiAgQ29tUG9ydCBNb2RlbXN0YXRlIERTUiBTaWduYWwgT24iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgdG5fZGVidWcoIiAgQ29tUG9ydCBNb2RlbXN0YXRlIERTUiBTaWduYWwgT2ZmIik7CisgICAgICAgICAgICBpZiAodG5jX21zICYgVE5DX01TX1JJX1NJRyApCisgICAgICAgICAgICAgIHRuX2RlYnVnKCIgIENvbVBvcnQgTW9kZW1zdGF0ZSBSaW5nIEluZGljYXRvciBPbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB0bl9kZWJ1ZygiICBDb21Qb3J0IE1vZGVtc3RhdGUgUmluZyBJbmRpY2F0b3IgT2ZmIik7CisgICAgICAgICAgICBpZiAodG5jX21zICYgVE5DX01TX1JMU0RfU0lHICkKKyAgICAgICAgICAgICAgdG5fZGVidWcoIiAgQ29tUG9ydCBNb2RlbXN0YXRlIFJMU0QgU2lnbmFsIE9uIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHRuX2RlYnVnKCIgIENvbVBvcnQgTW9kZW1zdGF0ZSBSTFNEIFNpZ25hbCBPZmYiKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUTkNfQzJTX0ZMT1dfU1VTUEVORDoKKyAgICAgIGNhc2UgVE5DX1MyQ19GTE9XX1NVU1BFTkQ6CisgICAgICAgIGRlYnVnKEYxMTAsInRuY190bl9zYiIsImZsb3cgc3VzcGVuZCIsMCk7CisgICAgICAgIHRuY19zdXNwZW5kX3htaXQgPSAxOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUTkNfQzJTX0ZMT1dfUkVTVU1FOgorICAgICAgY2FzZSBUTkNfUzJDX0ZMT1dfUkVTVU1FOgorICAgICAgICBkZWJ1ZyhGMTEwLCJ0bmNfdG5fc2IiLCJmbG93IHJlc3VtZSIsMCk7CisgICAgICAgIHRuY19zdXNwZW5kX3htaXQgPSAwOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUTkNfQzJTX1NFVF9MU19NQVNLOgorICAgICAgY2FzZSBUTkNfUzJDX1NFVF9MU19NQVNLOgorICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfQ09NUE9SVCkuY29tcG9ydC53YWl0X2Zvcl9zYiA9IDA7CisgICAgICAgICAgaWYgKGxlbiA8IDIpCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgZGVidWcoRjExMSwidG5jX3RuX3NiIiwibGluZXN0YXRlIG1hc2siLHNiWzFdKTsKKyAgICAgICAgdG5jX2xzX21hc2sgPSBzYlsxXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVE5DX0MyU19TRVRfTVNfTUFTSzoKKyAgICAgIGNhc2UgVE5DX1MyQ19TRVRfTVNfTUFTSzoKKyAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0NPTVBPUlQpLmNvbXBvcnQud2FpdF9mb3Jfc2IgPSAwOworICAgICAgICAgIGlmIChsZW4gPCAyKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGRlYnVnKEYxMTEsInRuY190bl9zYiIsIm1vZGVtc3RhdGUgbWFzayIsc2JbMV0pOworICAgICAgICB0bmNfbHNfbWFzayA9IHNiWzFdOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUTkNfQzJTX1BVUkdFOgorICAgICAgY2FzZSBUTkNfUzJDX1BVUkdFOgorICAgICAgICBpZiAobGVuIDwgMikKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBkZWJ1ZyhGMTExLCJ0bmNfdG5fc2IiLCJwdXJnZSIsc2JbMV0pOworICAgICAgICBzd2l0Y2ggKCBzYlsxXSApIHsKKyAgICAgICAgICBjYXNlIFROQ19QVVJHRV9SRUNFSVZFOgorICAgICAgICAgIGNhc2UgVE5DX1BVUkdFX1RSQU5TTUlUOgorICAgICAgICAgIGNhc2UgVE5DX1BVUkdFX0JPVEg6CisgICAgICAgICAgICAvKiBwdXJnZSBsb2NhbCBidWZmZXJzICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworQ09OU1QgY2hhciAqCisjaWZkZWYgQ0tfQU5TSUMKK3RuY19nZXRfc2lnbmF0dXJlKHZvaWQpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX2dldF9zaWduYXR1cmUoKQorI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfZ2V0X3NpZ25hdHVyZSAqLyB7CisgICAgLyogc2VuZCBJQUMgU0IgQ09NLVBPUlQgU0lHTkFUVVJFIElBQyBTRSAqLworICAgIC8qIHdhaXQgZm9yIHJlc3BvbnNlICovCisgICAgaW50IGkgPSAwLCByYzsKKworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKE5VTEwpOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQpIHJldHVybihOVUxMKTsKKworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9DT01QT1JUKSkgcmV0dXJuKE5VTEwpOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgaWYgKCB0bmNfc2lnbmF0dXJlICkKKyAgICAgICAgcmV0dXJuKHRuY19zaWduYXR1cmUpOworCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgLyogSSBBbSBhIENvbW1hbmQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gVEVMT1BUX0NPTVBPUlQ7ICAgICAgICAgICAgICAgLyogQ29tUG9ydCAqLworICAgIHNiX291dFtpKytdID0gVE5DX0MyU19TSUdOQVRVUkU7ICAgIC8qIFNpZ25hdHVyZSAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgLyogbWFya2VkIGJ5IElBQyBTRSAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgY2ttYWttc2codG5fbXNnX291dCxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0NPTVBPUlQpLAorICAgICAgICAgICAgICAgICAiIFNJR05BVFVSRSBJQUMgU0UiLCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgZGVidWcoRjEwMCx0bl9tc2dfb3V0LCIiLDApOworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4oTlVMTCk7CisKKyAgICBpZiAodG5jX3dhaXQoKENIQVIgKikiY29tcG9ydCBzaWduYXR1cmUgcmVxdWVzdCIsMCkgPCAwKSB7CisgICAgICAgIHRuX3B1c2goKTsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJ0bmNfZ2V0X3NpZ25hdHVyZSIsdG5jX3NpZ25hdHVyZSwwKTsKKyAgICByZXR1cm4odG5jX3NpZ25hdHVyZSk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit0bmNfc2VuZF9zaWduYXR1cmUoY2hhciAqIHNpZ25hdHVyZSkKKyNlbHNlIC8qIENLX0FOU0lDICovCit0bmNfc2VuZF9zaWduYXR1cmUoc2lnbmF0dXJlKSBjaGFyICogc2lnbmF0dXJlOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfc2VuZF9zaWduYXR1cmUgKi8geworICAgIC8qIHNlbmQgSUFDIFNCIENPTS1QT1JUIFNJR05BVFVSRSA8dGV4dD4gSUFDIFNFICovCisgICAgaW50IGkgPSAwLCBqID0gMCwgcmM7CisKKyAgICBkZWJ1ZyhGMTEwLCJ0bmNfc2VuZF9zaWduYXR1cmUiLHNpZ25hdHVyZSwwKTsKKworICAgIGlmICghc2lnbmF0dXJlIHx8ICFzaWduYXR1cmVbMF0pCisgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpIHJldHVybigwKTsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7CisKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfQ09NUE9SVCkpIHJldHVybigwKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0I7ICAgICAgICAgICAgICAgICAgLyogU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9DT01QT1JUOyAgICAgICAgICAgICAvKiBDb21Qb3J0ICovCisgICAgc2Jfb3V0W2krK10gPSBUTkNfQzJTX1NJR05BVFVSRTsgICAgICAvKiBTaWduYXR1cmUgKi8KKyAgICBmb3IgKDsgc2lnbmF0dXJlW2pdOyBpKyssaisrKQorICAgICAgc2Jfb3V0W2ldID0gc2lnbmF0dXJlW2pdOworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgLyogbWFya2VkIGJ5IElBQyBTRSAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgY2ttYWt4bXNnKHRuX21zZ19vdXQsVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICJURUxORVQgU0VOVCBTQiAiLFRFTE9QVChURUxPUFRfQ09NUE9SVCksCisgICAgICAgICAgICAgICAgICAiIFNJR05BVFVSRSAiLCBzaWduYXR1cmUsICIgSUFDIFNFIiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgZGVidWcoRjEwMCx0bl9tc2dfb3V0LCIiLDApOworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4oLTEpOworICAgIHJldHVybigwKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RuY19zZXRfYmF1ZCggbG9uZyBiYXVkICkKKyNlbHNlIC8qIENLX0FOU0lDICovCit0bmNfc2V0X2JhdWQoYmF1ZCkgbG9uZyBiYXVkOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfc2V0X2JhdWQgKi8geworICAgIC8qIHNlbmQgSUFDIFNCIENPTS1QT1JUIFNFVC1CQVVEIDx2YWx1ZSg0KT4gSUFDIFNFICAqLworICAgIC8qIHdhaXQgZm9yIHJlc3BvbnNlICovCisgICAgLyogMCBpcyB1c2VkIHRvIHJlcXVlc3QgdGhlIGN1cnJlbnQgYmF1ZCByYXRlIGFuZCAqLworICAgIC8qIG1heSBub3QgYmUgc2VudCBieSB0aGlzIGZ1bmMgKi8KKyAgICAvKiByZXR1cm4gbmV3IGhvc3QgdmFsdWUgKi8KKworICAgIC8qCisgICAgICogICB0aGUgYWJvdmUgY29tZXMgZnJvbSB0aGUgUkZDLiAgQnV0IHRoYXQgaXMgbm90IHdoYXQgSSBhbSBzZWVpbmcKKyAgICAgKiAgIGluc3RlYWQgSSBhcHBlYXIgdG8gYmUgc2VlaW5nIHRvIGZvbGxvd2luZzoKKyAgICAgKgorICAgICAqICAgICAgVmFsdWUgICAgICAgICAgICAgICBCYXVkCisgICAgICogICAgICAgICAgMSAgICAgICAgICAgICAgID8KKyAgICAgKiAgICAgICAgICAyICAgICAgICAgICAgICAgPworICAgICAqICAgICAgICAgIDMgICAgICAgICAgICAgICAzMDAKKyAgICAgKiAgICAgICAgICA0ICAgICAgICAgICAgICAgNjAwCisgICAgICogICAgICAgICAgNSAgICAgICAgICAgICAgIDEyMDAKKyAgICAgKiAgICAgICAgICA2ICAgICAgICAgICAgICAgMjQwMAorICAgICAqICAgICAgICAgIDcgICAgICAgICAgICAgICA0ODAwICAgICAgPworICAgICAqICAgICAgICAgIDggICAgICAgICAgICAgICA5NjAwCisgICAgICogICAgICAgICAgOSAgICAgICAgICAgICAgICAgICAgICAgICA/CisgICAgICogICAgICAgICAgMTAgICAgICAgICAgICAgIDE5MjAwICAgICA/CisgICAgICogICAgICAgICAgMTEgICAgICAgICAgICAgICAgICAgICAgICA/CisgICAgICogICAgICAgICAgMTIgICAgICAgICAgICAgIDM4NDAwCisgICAgICogICAgICAgICAgMTMgICAgICAgICAgICAgIDU3NjAwICAgICA/CisgICAgICogICAgICAgICAgMTQgICAgICAgICAgICAgIDExNTIwMAorICAgICAqICAgICAgICAgIDE1ICAgICAgICAgICAgICAyMzA0MDAgICAgPworICAgICAqICAgICAgICAgIDE2ICAgICAgICAgICAgICA0NjA4MDAgICAgPworICAgICAqLworCisgICAgaW50IGkgPSAwLCByYzsKKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgIC8qIEFPUy9WUyBkb2Vzbid0IGhhdmUgaHRvbmwoKSBidXQgTVYncyBhcmUgYmlnLWVuZGlhbiAqLworICAgIGxvbmcgbmV0X2JhdWQgPSBiYXVkOworI2Vsc2UKKyAgICBsb25nIG5ldF9iYXVkID0gaHRvbmwoYmF1ZCk7CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyAgICBDSEFSIGI7CisKKyAgICBkZWJ1ZyhGMTExLCJ0bmNfc2V0X2JhdWQiLCJiZWdpbiIsYmF1ZCk7CisKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpIHJldHVybigwKTsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7CisKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfQ09NUE9SVCkpIHJldHVybigwKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIGlmIChiYXVkIDw9IDApCisgICAgICAgIHJldHVybigwKTsKKworICAgIGlmICggbmV0X2JhdWQgIT0gMCAmJiBuZXRfYmF1ZCA9PSB0bmNfYnBzKQorICAgICAgICByZXR1cm4odG5jX2Jwcyk7CisKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBJIEFtIGEgQ29tbWFuZCAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNCOyAgICAgICAgICAgICAgICAgIC8qIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSBURUxPUFRfQ09NUE9SVDsgICAgICAgICAgICAgLyogQ29tUG9ydCAqLworICAgIHNiX291dFtpKytdID0gVE5DX0MyU19TRVRfQkFVRFJBVEU7ICAgLyogU2V0IEJhdWQgUmF0ZSAqLworCisgICAgaWYgKHRuY19icHNfaW5kZXgpIHsKKyAgICAgICAgLyogSU9TIEFjY2VzcyBTZXJ2ZXIgKi8KKyAgICAgICAgaWYgKGJhdWQgPD0gMzAwKQorICAgICAgICAgICAgYiA9IFROQ19CUFNfMzAwOworICAgICAgICBlbHNlIGlmIChiYXVkIDw9IDYwMCkKKyAgICAgICAgICAgIGIgPSBUTkNfQlBTXzYwMDsKKyAgICAgICAgZWxzZSBpZiAoYmF1ZCA8PSAxMjAwKQorICAgICAgICAgICAgYiA9IFROQ19CUFNfMTIwMDsKKyAgICAgICAgZWxzZSBpZiAoYmF1ZCA8PSAyNDAwKQorICAgICAgICAgICAgYiA9IFROQ19CUFNfMjQwMDsKKyAgICAgICAgZWxzZSBpZiAoYmF1ZCA8PSA0ODAwKQorICAgICAgICAgICAgYiA9IFROQ19CUFNfNDgwMDsKKyAgICAgICAgZWxzZSBpZiAoYmF1ZCA8PSA5NjAwKQorICAgICAgICAgICAgYiA9IFROQ19CUFNfOTYwMDsKKyAgICAgICAgZWxzZSBpZiAoYmF1ZCA8PSAxNDQwMCkKKyAgICAgICAgICAgIGIgPSBUTkNfQlBTXzE0NDAwOworICAgICAgICBlbHNlIGlmIChiYXVkIDw9IDE5MjAwKQorICAgICAgICAgICAgYiA9IFROQ19CUFNfMTkyMDA7CisgICAgICAgIGVsc2UgaWYgKGJhdWQgPD0gMjg4MDApCisgICAgICAgICAgICBiID0gVE5DX0JQU18yODgwMDsKKyAgICAgICAgZWxzZSBpZiAoYmF1ZCA8PSAzODQwMCkKKyAgICAgICAgICAgIGIgPSBUTkNfQlBTXzM4NDAwOworICAgICAgICBlbHNlIGlmIChiYXVkIDw9IDU3NjAwKQorICAgICAgICAgICAgYiA9IFROQ19CUFNfNTc2MDA7CisgICAgICAgIGVsc2UgaWYgKGJhdWQgPD0gMTE1MjAwKQorICAgICAgICAgICAgYiA9IFROQ19CUFNfMTE1MjAwOworICAgICAgICBlbHNlIGlmIChiYXVkIDw9IDIzMDQwMCkKKyAgICAgICAgICAgIGIgPSBUTkNfQlBTXzIzMDQwMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYiA9IFROQ19CUFNfNDYwODAwOworICAgICAgICBzYl9vdXRbaSsrXSA9IGI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUkZDIDIyMTcgKi8KKyAgICAgICAgc2Jfb3V0W2krK10gPSAoKGNoYXIgKikmbmV0X2JhdWQpWzBdOworICAgICAgICBzYl9vdXRbaSsrXSA9ICgoY2hhciAqKSZuZXRfYmF1ZClbMV07CisgICAgICAgIHNiX291dFtpKytdID0gKChjaGFyICopJm5ldF9iYXVkKVsyXTsKKyAgICAgICAgc2Jfb3V0W2krK10gPSAoKGNoYXIgKikmbmV0X2JhdWQpWzNdOworICAgIH0KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgICAvKiBtYXJrZWQgYnkgSUFDIFNFICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2codG5fbXNnX291dCxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9DT01QT1JUKSwKKyAgICAgICAgICAgICAgICAgICIgU0VULUJBVUQtUkFURSAiLCBja2x0b2EoYmF1ZCksIiBJQUMgU0UiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMDAsdG5fbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByYyA9ICh0dG9sKChDSEFSICopc2Jfb3V0LGkpIDwgMCk7ICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmICh0bmNfd2FpdCgoQ0hBUiAqKSJjb21wb3J0IHNldCBiYXVkIHJhdGUiLDApIDwgMCkgeworICAgICAgICB0bl9wdXNoKCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsInRuY19zZXRfYmF1ZCIsImVuZCIsdG5jX2Jwcyk7CisgICAgcmV0dXJuKHRuY19icHMpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX2dldF9iYXVkKHZvaWQpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX2dldF9iYXVkKCkKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdG5jX2dldF9iYXVkICovIHsKKyAgICAvKiBzZW5kIElBQyBTQiBDT00tUE9SVCBTRVQtQkFVRCA8dmFsdWUoNCk9MD4gSUFDIFNFICAqLworICAgIC8qIHdhaXQgZm9yIHJlc3BvbnNlICovCisgICAgaW50IGkgPSAwLCByYzsKKworICAgIGRlYnVnKEYxMTAsInRuY19nZXRfYmF1ZCIsImJlZ2luIiwwKTsKKworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKDApOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQpIHJldHVybigwKTsKKworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9DT01QT1JUKSkgcmV0dXJuKDApOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogSSBBbSBhIENvbW1hbmQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gVEVMT1BUX0NPTVBPUlQ7ICAgICAgICAgICAgIC8qIENvbVBvcnQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IFROQ19DMlNfU0VUX0JBVURSQVRFOyAgIC8qIFNldCBCYXVkIFJhdGUgKi8KKworICAgIGlmICh0bmNfYnBzX2luZGV4ID4gMCkgeworICAgICAgICAvKiBBY2Nlc3MgU2VydmVyICovCisgICAgICAgIHNiX291dFtpKytdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBSRkMgMjIxNyAqLworICAgICAgICBzYl9vdXRbaSsrXSA9IDA7CisgICAgICAgIHNiX291dFtpKytdID0gMDsKKyAgICAgICAgc2Jfb3V0W2krK10gPSAwOworICAgICAgICBzYl9vdXRbaSsrXSA9IDA7CisgICAgfQorICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNFOyAgICAgICAgICAgICAgICAgIC8qIG1hcmtlZCBieSBJQUMgU0UgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGNrbWFreG1zZyh0bl9tc2dfb3V0LFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0NPTVBPUlQpLAorICAgICAgICAgICAgICAgICAgIiBTRVQtQkFVRC1SQVRFICIsIGNrbHRvYSgwKSwiIElBQyBTRSIsIE5VTEwsCisgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMDAsdG5fbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByYyA9ICh0dG9sKChDSEFSICopc2Jfb3V0LGkpIDwgMCk7ICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmICh0bmNfd2FpdCgoQ0hBUiAqKSJjb21wb3J0IGdldCBiYXVkIHJhdGUiLDApIDwgMCkgeworICAgICAgICB0bl9wdXNoKCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsInRuY19nZXRfYmF1ZCIsImVuZCIsdG5jX2Jwcyk7CisgICAgcmV0dXJuKHRuY19icHMpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX3NldF9kYXRhc2l6ZShpbnQgZGF0YXNpemUpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX3NldF9kYXRhc2l6ZShkYXRhc2l6ZSkgaW50IGRhdGFzaXplOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfc2V0X2RhdGFzaXplICovIHsKKyAgICAvKiBJQUMgU0IgQ09NLVBPUlQgU0VUX0RBVEFTSVpFIDx2YWx1ZSgxKT4gSUFDIFNFICovCisgICAgLyogVmFsaWQgPHZhbHVlPnMgYXJlIDUgdGhyb3VnaCA4ICovCisgICAgLyogV2FpdCBmb3IgcmVzcG9uc2UgKi8KKyAgICAvKiByZXR1cm4gbmV3IGhvc3QgdmFsdWUgKi8KKworICAgIGludCBpID0gMCwgcmM7CisKKyAgICBkZWJ1ZyhGMTExLCJ0bmNfc2V0X2RhdGFzaXplIiwiYmVnaW4iLGRhdGFzaXplKTsKKworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKDApOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQpIHJldHVybigwKTsKKworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9DT01QT1JUKSkgcmV0dXJuKDApOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgaWYgKCAhKGRhdGFzaXplID49IDUgJiYgZGF0YXNpemUgPD0gOCkgKQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAoIGRhdGFzaXplICAhPSAwICYmICBkYXRhc2l6ZSA9PSB0bmNfZGF0YXNpemUgKQorICAgICAgICByZXR1cm4odG5jX2RhdGFzaXplKTsKKworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0I7ICAgICAgICAgICAgICAgICAgLyogU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9DT01QT1JUOyAgICAgICAgICAgICAvKiBDb21Qb3J0ICovCisgICAgc2Jfb3V0W2krK10gPSBUTkNfQzJTX1NFVF9EQVRBU0laRTsgICAvKiBTZXQgRGF0YVNpemUgKi8KKyAgICBzYl9vdXRbaSsrXSA9ICh1bnNpZ25lZCBjaGFyKShkYXRhc2l6ZSAmIDB4RkYpOworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNFOyAgICAgICAgICAgICAgICAgIC8qIG1hcmtlZCBieSBJQUMgU0UgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGNrbWFreG1zZyh0bl9tc2dfb3V0LFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0NPTVBPUlQpLAorICAgICAgICAgICAgICAgICAgIiBTRVQtREFUQVNJWkUgIiwgY2tpdG9hKGRhdGFzaXplKSwiIElBQyBTRSIsIE5VTEwsCisgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMDAsdG5fbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByYyA9ICh0dG9sKChDSEFSICopc2Jfb3V0LGkpIDwgMCk7ICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmICh0bmNfd2FpdCgoQ0hBUiAqKSJjb21wb3J0IHNldCBkYXRhc2l6ZSIsMCkgPCAwKSB7CisgICAgICAgIHRuX3B1c2goKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgZGVidWcoRjExMSwidG5jX3NldF9kYXRhc2l6ZSIsImVuZCIsdG5jX2RhdGFzaXplKTsKKyAgICByZXR1cm4odG5jX2RhdGFzaXplKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RuY19nZXRfZGF0YXNpemUodm9pZCkKKyNlbHNlIC8qIENLX0FOU0lDICovCit0bmNfZ2V0X2RhdGFzaXplKCkKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdG5jX2dldF9kYXRhc2l6ZSAqLyB7CisgICAgLyogSUFDIFNCIENPTS1QT1JUIFNFVF9EQVRBU0laRSA8dmFsdWUoMSk9MD4gSUFDIFNFICovCisgICAgLyogV2FpdCBmb3IgcmVzcG9uc2UgKi8KKyAgICBpbnQgaSA9IDAsIHJjOworCisgICAgZGVidWcoRjExMCwidG5jX2dldF9kYXRhc2l6ZSIsImJlZ2luIiwwKTsKKworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKDApOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQpIHJldHVybigwKTsKKworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9DT01QT1JUKSkgcmV0dXJuKDApOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogSSBBbSBhIENvbW1hbmQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gVEVMT1BUX0NPTVBPUlQ7ICAgICAgICAgICAgIC8qIENvbVBvcnQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IFROQ19DMlNfU0VUX0RBVEFTSVpFOyAgIC8qIFNldCBEYXRhU2l6ZSAqLworICAgIHNiX291dFtpKytdID0gMDsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgICAvKiBtYXJrZWQgYnkgSUFDIFNFICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2codG5fbXNnX291dCxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9DT01QT1JUKSwKKyAgICAgICAgICAgICAgICAgICIgU0VULURBVEFTSVpFICIsIGNrbHRvYSgwKSwiIElBQyBTRSIsIE5VTEwsCisgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMDAsdG5fbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByYyA9ICh0dG9sKChDSEFSICopc2Jfb3V0LGkpIDwgMCk7ICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmICh0bmNfd2FpdCgoQ0hBUiAqKSJjb21wb3J0IGdldCBkYXRhc2l6ZSIsMCkgPCAwKSB7CisgICAgICAgIHRuX3B1c2goKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgZGVidWcoRjExMSwidG5jX2dldF9kYXRhc2l6ZSIsImVuZCIsdG5jX2RhdGFzaXplKTsKKyAgICByZXR1cm4odG5jX2RhdGFzaXplKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RuY19zZXRfcGFyaXR5KGludCBwYXJpdHkpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX3NldF9wYXJpdHkocGFyaXR5KSBpbnQgcGFyaXR5OworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfc2V0X3Bhcml0eSAqLyB7CisgICAgLyogSUFDIFNCIENPTS1QT1JUIFNFVF9QQVJJVFkgPHZhbHVlKDEpPiBJQUMgU0UgKi8KKyAgICAvKiAgICAgICAgVmFsdWUgICAgIFBhcml0eQorICAgICAqICAgICAgICAgIDEgICAgICAgTm9uZQorICAgICAqICAgICAgICAgIDIgICAgICAgT2RkCisgICAgICogICAgICAgICAgMyAgICAgICBFdmVuCisgICAgICogICAgICAgICAgNCAgICAgICBNYXJrCisgICAgICogICAgICAgICAgNSAgICAgICBTcGFjZQorICAgICAqLworICAgIC8qIFdhaXQgZm9yIHJlc3BvbnNlLiAgUmV0dXJuIG5ldyBob3N0IHZhbHVlLiAqLworICAgIGludCBpID0gMCwgcmM7CisKKyAgICBkZWJ1ZyhGMTEwLCJ0bmNfc2V0X3Bhcml0eSIsImJlZ2luIixwYXJpdHkpOworCisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCKSByZXR1cm4oMCk7CisgICAgaWYgKHR0bnByb3RvICE9IE5QX1RFTE5FVCkgcmV0dXJuKDApOworCisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX0NPTVBPUlQpKSByZXR1cm4oMCk7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBpZiAoICEocGFyaXR5ID49IDEgJiYgcGFyaXR5IDw9IDUpICkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgaWYgKCBwYXJpdHkgIT0gMCAmJiBwYXJpdHkgPT0gdG5jX3Bhcml0eSApCisgICAgICAgIHJldHVybih0bmNfcGFyaXR5KTsKKworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0I7ICAgICAgICAgICAgICAgICAgLyogU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9DT01QT1JUOyAgICAgICAgICAgICAvKiBDb21Qb3J0ICovCisgICAgc2Jfb3V0W2krK10gPSBUTkNfQzJTX1NFVF9QQVJJVFk7ICAgICAvKiBTZXQgUGFyaXR5ICovCisgICAgc2Jfb3V0W2krK10gPSAodW5zaWduZWQgY2hhcikocGFyaXR5ICYgMHhGRik7CisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogRW5kIG9mIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0U7ICAgICAgICAgICAgICAgICAgLyogbWFya2VkIGJ5IElBQyBTRSAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgY2ttYWt4bXNnKHRuX21zZ19vdXQsVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICJURUxORVQgU0VOVCBTQiAiLFRFTE9QVChURUxPUFRfQ09NUE9SVCksCisgICAgICAgICAgICAgICAgICAiIFNFVC1QQVJJVFkgIiwgY2tpdG9hKHBhcml0eSksIiBJQUMgU0UiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLHRuX21zZ19vdXQsIiIsMCk7CisgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZ19vdXQpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgcmMgPSAodHRvbCgoQ0hBUiAqKXNiX291dCxpKSA8IDApOyAgICAgIC8qIFNlbmQgaXQuICovCisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAodG5jX3dhaXQoKENIQVIgKikiY29tcG9ydCBzZXQgcGFyaXR5IiwwKSA8IDApIHsKKyAgICAgICAgdG5fcHVzaCgpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0bmNfc2V0X3Bhcml0eSIsImVuZCIsdG5jX3Bhcml0eSk7CisgICAgcmV0dXJuKHRuY19wYXJpdHkpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX2dldF9wYXJpdHkodm9pZCkKKyNlbHNlIC8qIENLX0FOU0lDICovCit0bmNfZ2V0X3Bhcml0eSgpCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHRuY19nZXRfcGFyaXR5ICovIHsKKyAgICAvKiBJQUMgU0IgQ09NLVBPUlQgU0VUX1BBUklUWSA8dmFsdWUoMSk9MD4gSUFDIFNFICovCisgICAgLyogd2FpdCBmb3IgcmVzcG9uc2UgKi8KKyAgICBpbnQgaSA9IDAsIHJjOworCisgICAgZGVidWcoRjExMCwidG5jX2dldF9wYXJpdHkiLCJiZWdpbiIsMCk7CisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCKSByZXR1cm4oMCk7CisgICAgaWYgKHR0bnByb3RvICE9IE5QX1RFTE5FVCkgcmV0dXJuKDApOworCisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX0NPTVBPUlQpKSByZXR1cm4oMCk7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBJIEFtIGEgQ29tbWFuZCAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNCOyAgICAgICAgICAgICAgICAgIC8qIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSBURUxPUFRfQ09NUE9SVDsgICAgICAgICAgICAgLyogQ29tUG9ydCAqLworICAgIHNiX291dFtpKytdID0gVE5DX0MyU19TRVRfUEFSSVRZOyAgICAgLyogU2V0IFBhcml0eSAqLworICAgIHNiX291dFtpKytdID0gMDsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgICAvKiBtYXJrZWQgYnkgSUFDIFNFICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2codG5fbXNnX291dCxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9DT01QT1JUKSwKKyAgICAgICAgICAgICAgICAgICIgU0VULVBBUklUWSAiLCBja2l0b2EoMCksIiBJQUMgU0UiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLHRuX21zZ19vdXQsIiIsMCk7CisgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZ19vdXQpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgcmMgPSAodHRvbCgoQ0hBUiAqKXNiX291dCxpKSA8IDApOyAgICAgIC8qIFNlbmQgaXQuICovCisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAodG5jX3dhaXQoKENIQVIgKikiY29tcG9ydCBnZXQgcGFyaXR5IiwwKSA8IDApIHsKKyAgICAgICAgdG5fcHVzaCgpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0bmNfZ2V0X3Bhcml0eSIsImVuZCIsdG5jX3Bhcml0eSk7CisgICAgcmV0dXJuKHRuY19wYXJpdHkpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX3NldF9zdG9wc2l6ZShpbnQgc3RvcHNpemUpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX3NldF9zdG9wc2l6ZShzdG9wc2l6ZSkgaW50IHN0b3BzaXplOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfc2V0X3N0b3BzaXplICovIHsKKyAgICAvKiBJQUMgU0IgQ09NLVBPUlQgU0VUX1NUT1BTSVpFIDx2YWx1ZSgxKT4gSUFDIFNFICovCisgICAgLyogICAgICAgIFZhbHVlICAgICBTdG9wIEJpdCBTaXplCisgICAgICogICAgICAgICAgMSAgICAgICAxCisgICAgICogICAgICAgICAgMiAgICAgICAyCisgICAgICogICAgICAgICAgMyAgICAgICAxLjUKKyAgICAgKi8KKyAgICAvKiBXYWl0IGZvciByZXNwb25zZS4gIFJldHVybiBuZXcgaG9zdCB2YWx1ZS4gKi8KKyAgICBpbnQgaSA9IDAsIHJjOworCisgICAgZGVidWcoRjExMSwidG5jX3NldF9zdG9wc2l6ZSIsImJlZ2luIixzdG9wc2l6ZSk7CisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCKSByZXR1cm4oMCk7CisgICAgaWYgKHR0bnByb3RvICE9IE5QX1RFTE5FVCkgcmV0dXJuKDApOworCisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX0NPTVBPUlQpKSByZXR1cm4oMCk7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBpZiAoIShzdG9wc2l6ZSA+PSAxICYmIHN0b3BzaXplIDw9IDMpICkKKyAgICAgIHJldHVybigwKTsKKworICAgIGlmICggc3RvcHNpemUgIT0gMCAmJiBzdG9wc2l6ZSA9PSB0bmNfc3RvcGJpdCApCisgICAgICAgIHJldHVybih0bmNfc3RvcGJpdCk7CisKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBJIEFtIGEgQ29tbWFuZCAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNCOyAgICAgICAgICAgICAgICAgIC8qIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSBURUxPUFRfQ09NUE9SVDsgICAgICAgICAgICAgLyogQ29tUG9ydCAqLworICAgIHNiX291dFtpKytdID0gVE5DX0MyU19TRVRfU1RPUFNJWkU7ICAgLyogU2V0IFN0b3AgQml0cyAqLworICAgIHNiX291dFtpKytdID0gKHVuc2lnbmVkIGNoYXIpKHN0b3BzaXplICYgMHhGRik7CisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogRW5kIG9mIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0U7ICAgICAgICAgICAgICAgICAgLyogbWFya2VkIGJ5IElBQyBTRSAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgY2ttYWt4bXNnKHRuX21zZ19vdXQsVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICJURUxORVQgU0VOVCBTQiAiLFRFTE9QVChURUxPUFRfQ09NUE9SVCksCisgICAgICAgICAgICAgICAgICAiIFNFVC1TVE9QU0laRSAiLCBja2l0b2Eoc3RvcHNpemUpLCIgSUFDIFNFIiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgZGVidWcoRjEwMCx0bl9tc2dfb3V0LCIiLDApOworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4oLTEpOworCisgICAgaWYgKHRuY193YWl0KChDSEFSICopImNvbXBvcnQgc2V0IHN0b3BzaXplIiwwKSA8IDApIHsKKyAgICAgICAgdG5fcHVzaCgpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0bmNfc2V0X3N0b3BzaXplIiwiZW5kIix0bmNfc3RvcGJpdCk7CisgICAgcmV0dXJuKHRuY19zdG9wYml0KTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RuY19nZXRfc3RvcHNpemUodm9pZCkKKyNlbHNlIC8qIENLX0FOU0lDICovCit0bmNfZ2V0X3N0b3BzaXplKCkKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdG5jX2dldF9zdG9wc2l6ZSAqLyB7CisgICAgLyogSUFDIFNCIENPTS1QT1JUIFNFVF9TVE9QU0laRSA8dmFsdWUoMSk9MD4gSUFDIFNFICovCisgICAgLyogV2FpdCBmb3IgcmVzcG9uc2UgKi8KKyAgICBpbnQgaSA9IDAsIHJjOworCisgICAgZGVidWcoRjExMCwidG5jX2dldF9zdG9wc2l6ZSIsImJlZ2luIiwwKTsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpIHJldHVybigwKTsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7CisKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfQ09NUE9SVCkpIHJldHVybigwKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0I7ICAgICAgICAgICAgICAgICAgLyogU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9DT01QT1JUOyAgICAgICAgICAgICAvKiBDb21Qb3J0ICovCisgICAgc2Jfb3V0W2krK10gPSBUTkNfQzJTX1NFVF9TVE9QU0laRTsgICAvKiBTZXQgU3RvcCBCaXRzICovCisgICAgc2Jfb3V0W2krK10gPSAwOworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNFOyAgICAgICAgICAgICAgICAgIC8qIG1hcmtlZCBieSBJQUMgU0UgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGNrbWFreG1zZyh0bl9tc2dfb3V0LFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0NPTVBPUlQpLAorICAgICAgICAgICAgICAgICAgIiBTRVQtU1RPUFNJWkUgIiwgY2tpdG9hKDApLCIgSUFDIFNFIiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgZGVidWcoRjEwMCx0bl9tc2dfb3V0LCIiLDApOworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4oLTEpOworCisgICAgaWYgKHRuY193YWl0KChDSEFSICopImNvbXBvcnQgc2V0IHN0b3BzaXplIiwwKSA8IDApIHsKKyAgICAgICAgdG5fcHVzaCgpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0bmNfZ2V0X3N0b3BzaXplIiwiZW5kIix0bmNfc3RvcGJpdCk7CisgICAgcmV0dXJuKHRuY19zdG9wYml0KTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RuY19zZXRfb2Zsb3coaW50IGNvbnRyb2wpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX3NldF9vZmxvdyhjb250cm9sKSBpbnQgY29udHJvbDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdG5jX3NldF9vZmxvdyAqLyB7CisgICAgLyogSUFDIFNCIENPTV9QT1JUIFNFVF9DT05UUk9MIDx2YWx1ZSgxKT4gSUFDIFNFICovCisgICAgLyogICAgICAgIFZhbHVlICAgICBGbG93IENvbnRyb2wKKyAgICAgKiAgICAgICAgICAxICAgICAgIE5vIEZsb3cgQ29udHJvbAorICAgICAqICAgICAgICAgIDIgICAgICAgWG9uL1hvZmYKKyAgICAgKiAgICAgICAgICAzICAgICAgIFJ0cy9DdHMKKyAgICAgKiAgICAgICAgIDE3ICAgICAgIERDRAorICAgICAqICAgICAgICAgMTkgICAgICAgRFNSCisgICAgICovCisgICAgLyogd2FpdCBmb3IgcmVzcG9uc2UsIHJldHVybiBuZXcgaG9zdCB2YWx1ZS4gKi8KKyAgICBpbnQgaSA9IDAsIHJjOworCisgICAgZGVidWcoRjExMSwidG5jX3NldF9vZmxvdyIsImJlZ2luIixjb250cm9sKTsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpIHJldHVybigwKTsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7CisKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfQ09NUE9SVCkpIHJldHVybigwKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIGlmIChjb250cm9sICE9IDEgJiYgY29udHJvbCAhPSAyICYmIGNvbnRyb2wgIT0gMyAmJgorICAgICAgICBjb250cm9sICE9IDE3ICYmIGNvbnRyb2wgIT0gMTkpCisgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAoIGNvbnRyb2wgIT0gMCAmJiBjb250cm9sID09IHRuY19vZmxvdyApCisgICAgICAgIHJldHVybih0bmNfb2Zsb3cpOworCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogSSBBbSBhIENvbW1hbmQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gVEVMT1BUX0NPTVBPUlQ7ICAgICAgICAgICAgIC8qIENvbVBvcnQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IFROQ19DMlNfU0VUX0NPTlRST0w7ICAgIC8qIFNldCBDb250cm9sICovCisgICAgc2Jfb3V0W2krK10gPSAodW5zaWduZWQgY2hhcikoY29udHJvbCAmIDB4RkYpOworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNFOyAgICAgICAgICAgICAgICAgIC8qIG1hcmtlZCBieSBJQUMgU0UgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGNrbWFreG1zZyh0bl9tc2dfb3V0LFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0NPTVBPUlQpLAorICAgICAgICAgICAgICAgICAgIiBTRVQtQ09OVFJPTCAiLCBja2l0b2EoY29udHJvbCksIiBJQUMgU0UiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLHRuX21zZ19vdXQsIiIsMCk7CisgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZ19vdXQpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgcmMgPSAodHRvbCgoQ0hBUiAqKXNiX291dCxpKSA8IDApOyAgICAgIC8qIFNlbmQgaXQuICovCisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAodG5jX3dhaXQoKENIQVIgKikiY29tcG9ydCBzZXQgb3V0Ym91bmQgZmxvdyBjb250cm9sIiwwKSA8IDApIHsKKyAgICAgICAgdG5fcHVzaCgpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0bmNfc2V0X29mbG93IiwiZW5kIix0bmNfb2Zsb3cpOworICAgIHJldHVybih0bmNfb2Zsb3cpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX2dldF9vZmxvdyh2b2lkKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK3RuY19nZXRfb2Zsb3coKQorI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfZ2V0X29mbG93ICovIHsKKyAgICAvKiBJQUMgU0IgQ09NX1BPUlQgU0VUX0NPTlRST0wgPHZhbHVlKDEpPTA+IElBQyBTRSAqLworICAgIC8qIHdhaXQgZm9yIHJlc3BvbnNlICovCisgICAgaW50IGkgPSAwLCByYzsKKworICAgIGRlYnVnKEYxMTAsInRuY19nZXRfb2Zsb3ciLCJiZWdpbiIsMCk7CisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCKSByZXR1cm4oMCk7CisgICAgaWYgKHR0bnByb3RvICE9IE5QX1RFTE5FVCkgcmV0dXJuKDApOworCisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX0NPTVBPUlQpKSByZXR1cm4oMCk7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBJIEFtIGEgQ29tbWFuZCAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNCOyAgICAgICAgICAgICAgICAgIC8qIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSBURUxPUFRfQ09NUE9SVDsgICAgICAgICAgICAgLyogQ29tUG9ydCAqLworICAgIHNiX291dFtpKytdID0gVE5DX0MyU19TRVRfQ09OVFJPTDsgICAgLyogU2V0IENvbnRyb2wgKi8KKyAgICBzYl9vdXRbaSsrXSA9IFROQ19DVExfT0ZMT1dfUkVRVUVTVDsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgICAvKiBtYXJrZWQgYnkgSUFDIFNFICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2codG5fbXNnX291dCxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9DT01QT1JUKSwKKyAgICAgICAgICAgICAgICAgICIgU0VULUNPTlRST0wgIiwKKyAgICAgICAgICAgICAgICAgICBja2l0b2EoVE5DX0NUTF9PRkxPV19SRVFVRVNUKSwKKyAgICAgICAgICAgICAgICAgICAiIElBQyBTRSIsIE5VTEwsCisgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMDAsdG5fbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByYyA9ICh0dG9sKChDSEFSICopc2Jfb3V0LGkpIDwgMCk7ICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmICh0bmNfd2FpdCgoQ0hBUiAqKSJjb21wb3J0IGdldCBvdXRib3VuZCBmbG93IGNvbnRyb2wiLDApIDwgMCkgeworICAgICAgICB0bl9wdXNoKCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsInRuY19nZXRfb2Zsb3ciLCJlbmQiLHRuY19vZmxvdyk7CisgICAgcmV0dXJuKHRuY19vZmxvdyk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit0bmNfc2V0X2lmbG93KGludCBjb250cm9sKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK3RuY19zZXRfaWZsb3coY29udHJvbCkgaW50IGNvbnRyb2w7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHRuY19zZXRfaWZsb3cgKi8geworICAgIC8qIElBQyBTQiBDT01fUE9SVCBTRVRfQ09OVFJPTCA8dmFsdWUoMSk+IElBQyBTRSAqLworICAgIC8qICAgICAgICBWYWx1ZSAgICAgRmxvdyBDb250cm9sCisgICAgICogICAgICAgICAxNCAgICAgICBObyBGbG93IENvbnRyb2wKKyAgICAgKiAgICAgICAgIDE1ICAgICAgIFhvbi9Yb2ZmCisgICAgICogICAgICAgICAxNiAgICAgICBSdHMvQ3RzCisgICAgICogICAgICAgICAxOCAgICAgICBEVFIKKyAgICAgKi8KKyAgICAvKiB3YWl0IGZvciByZXNwb25zZSwgcmV0dXJuIG5ldyBob3N0IHZhbHVlLiAqLworICAgIGludCBpID0gMCwgcmM7CisKKyAgICBkZWJ1ZyhGMTExLCJ0bmNfc2V0X2lmbG93IiwiYmVnaW4iLGNvbnRyb2wpOworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKDApOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQpIHJldHVybigwKTsKKworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9DT01QT1JUKSkgcmV0dXJuKDApOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgaWYgKGNvbnRyb2wgIT0gMTQgJiYgY29udHJvbCAhPSAxNSAmJiBjb250cm9sICE9IDE2ICYmIGNvbnRyb2wgIT0gMTgpCisgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAoIGNvbnRyb2wgIT0gMCAmJiBjb250cm9sID09IHRuY19pZmxvdyApCisgICAgICAgIHJldHVybih0bmNfaWZsb3cpOworCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogSSBBbSBhIENvbW1hbmQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gVEVMT1BUX0NPTVBPUlQ7ICAgICAgICAgICAgIC8qIENvbVBvcnQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IFROQ19DMlNfU0VUX0NPTlRST0w7ICAgIC8qIFNldCBDb250cm9sICovCisgICAgc2Jfb3V0W2krK10gPSAodW5zaWduZWQgY2hhcikoY29udHJvbCAmIDB4RkYpOworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNFOyAgICAgICAgICAgICAgICAgIC8qIG1hcmtlZCBieSBJQUMgU0UgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGNrbWFreG1zZyh0bl9tc2dfb3V0LFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0NPTVBPUlQpLAorICAgICAgICAgICAgICAgICAgIiBTRVQtQ09OVFJPTCAiLCBja2l0b2EoY29udHJvbCksIiBJQUMgU0UiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLHRuX21zZ19vdXQsIiIsMCk7CisgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZ19vdXQpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgcmMgPSAodHRvbCgoQ0hBUiAqKXNiX291dCxpKSA8IDApOyAgICAgIC8qIFNlbmQgaXQuICovCisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBpZiAocmMpCisgICAgICByZXR1cm4oLTEpOworCisgICAgaWYgKHRuY193YWl0KChDSEFSICopImNvbXBvcnQgc2V0IGluYm91bmQgZmxvdyBjb250cm9sIiwwKSA8IDApIHsKKyAgICAgICAgdG5fcHVzaCgpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0bmNfc2V0X2lmbG93IiwiZW5kIix0bmNfaWZsb3cpOworICAgIHJldHVybih0bmNfaWZsb3cpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX2dldF9pZmxvdyh2b2lkKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK3RuY19nZXRfaWZsb3coKQorI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfZ2V0X2lmbG93ICovIHsKKyAgICAvKiBJQUMgU0IgQ09NX1BPUlQgU0VUX0NPTlRST0wgPHZhbHVlKDEpPTEzPiBJQUMgU0UgKi8KKyAgICAvKiB3YWl0IGZvciByZXNwb25zZSAqLworICAgIGludCBpID0gMCwgcmM7CisKKyAgICBkZWJ1ZyhGMTEwLCJ0bmNfZ2V0X2lmbG93IiwiYmVnaW4iLDApOworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKDApOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQpIHJldHVybigwKTsKKworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9DT01QT1JUKSkgcmV0dXJuKDApOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogSSBBbSBhIENvbW1hbmQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gVEVMT1BUX0NPTVBPUlQ7ICAgICAgICAgICAgIC8qIENvbVBvcnQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IFROQ19DMlNfU0VUX0NPTlRST0w7ICAgIC8qIFNldCBDb250cm9sICovCisgICAgc2Jfb3V0W2krK10gPSBUTkNfQ1RMX0lGTE9XX1JFUVVFU1Q7CisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogRW5kIG9mIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0U7ICAgICAgICAgICAgICAgICAgLyogbWFya2VkIGJ5IElBQyBTRSAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgY2ttYWt4bXNnKHRuX21zZ19vdXQsVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICJURUxORVQgU0VOVCBTQiAiLFRFTE9QVChURUxPUFRfQ09NUE9SVCksCisgICAgICAgICAgICAgICAgICAiIFNFVC1DT05UUk9MICIsCisgICAgICAgICAgICAgICAgICBja2l0b2EoVE5DX0NUTF9JRkxPV19SRVFVRVNUKSwKKyAgICAgICAgICAgICAgICAgICIgSUFDIFNFIiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgZGVidWcoRjEwMCx0bl9tc2dfb3V0LCIiLDApOworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4oLTEpOworCisgICAgaWYgKHRuY193YWl0KChDSEFSICopImNvbXBvcnQgZ2V0IGluYm91bmQgZmxvdyBjb250cm9sIiwwKSA8IDApIHsKKyAgICAgICAgdG5fcHVzaCgpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0bmNfZ2V0X2lmbG93IiwiZW5kIix0bmNfaWZsb3cpOworICAgIHJldHVybih0bmNfaWZsb3cpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX3NldF9icmVha19zdGF0ZShpbnQgb25vZmYpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX3NldF9icmVha19zdGF0ZShvbm9mZikgaW50IG9ub2ZmOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfc2V0X2JyZWFrX3N0YXRlICovIHsKKyAgICAvKiBJQUMgU0IgQ09NX1BPUlQgU0VUX0NPTlRST0wgPHZhbHVlKDEpPiBJQUMgU0UgKi8KKyAgICAvKiAgICAgICAgVmFsdWUgICAgIEJyZWFrIFN0YXRlCisgICAgICogICAgICAgICAgNSAgICAgICBPbgorICAgICAqICAgICAgICAgIDYgICAgICAgT2ZmCisgICAgICovCisgICAgLyogd2FpdCBmb3IgcmVzcG9uc2UsIHJldHVybiBuZXcgaG9zdCB2YWx1ZS4gKi8KKyAgICBpbnQgaSA9IDAsIHJjOworCisgICAgZGVidWcoRjExMSwidG5jX3NldF9icmVha19zdGF0ZSIsImJlZ2luIixvbm9mZik7CisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCKSByZXR1cm4oMCk7CisgICAgaWYgKHR0bnByb3RvICE9IE5QX1RFTE5FVCkgcmV0dXJuKDApOworCisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX0NPTVBPUlQpKSByZXR1cm4oMCk7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBpZiAoIG9ub2ZmICE9IDAgJiYgb25vZmYgPT0gdG5jX2JyZWFrICkKKyAgICAgICAgcmV0dXJuKHRuY19icmVhayk7CisKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBJIEFtIGEgQ29tbWFuZCAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNCOyAgICAgICAgICAgICAgICAgIC8qIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSBURUxPUFRfQ09NUE9SVDsgICAgICAgICAgICAgLyogQ29tUG9ydCAqLworICAgIHNiX291dFtpKytdID0gVE5DX0MyU19TRVRfQ09OVFJPTDsgICAgLyogU2V0IENvbnRyb2wgKi8KKyAgICBzYl9vdXRbaSsrXSA9IG9ub2ZmID8KKyAgICAgIFROQ19DVExfQlJFQUtfT04gOiBUTkNfQ1RMX0JSRUFLX09GRjsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgICAvKiBtYXJrZWQgYnkgSUFDIFNFICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2codG5fbXNnX291dCxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9DT01QT1JUKSwKKyAgICAgICAgICAgICAgICAgICIgU0VULUNPTlRST0wgIiwKKyAgICAgICAgICAgICAgICAgIG9ub2ZmID8gIkJSRUFLLU9OIiA6ICJCUkVBSy1PRkYiLAorICAgICAgICAgICAgICAgICAgIiBJQUMgU0UiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLHRuX21zZ19vdXQsIiIsMCk7CisgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZ19vdXQpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgcmMgPSAodHRvbCgoQ0hBUiAqKXNiX291dCxpKSA8IDApOyAgICAgIC8qIFNlbmQgaXQuICovCisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAodG5jX3dhaXQoKENIQVIgKikiY29tcG9ydCBzZXQgYnJlYWsgc3RhdGUiLDApIDwgMCkgeworICAgICAgICB0bl9wdXNoKCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsInRuY19zZXRfYnJlYWtfc3RhdGUiLCJlbmQiLHRuY19icmVhayk7CisgICAgcmV0dXJuKHRuY19icmVhayk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit0bmNfZ2V0X2JyZWFrX3N0YXRlKHZvaWQpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX2dldF9icmVha19zdGF0ZSgpCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHRuY19nZXRfYnJlYWtfc3RhdGUgKi8geworICAgIC8qIElBQyBTQiBDT01fUE9SVCBTRVRfQ09OVFJPTCA8dmFsdWUoMSk9ND4gSUFDIFNFICovCisgICAgLyogd2FpdCBmb3IgcmVzcG9uc2UgKi8KKyAgICBpbnQgaSA9IDAsIHJjOworCisgICAgZGVidWcoRjExMCwidG5jX2dldF9icmVha19zdGF0ZSIsImJlZ2luIiwwKTsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpIHJldHVybigwKTsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7CisKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfQ09NUE9SVCkpIHJldHVybigwKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0I7ICAgICAgICAgICAgICAgICAgLyogU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9DT01QT1JUOyAgICAgICAgICAgICAvKiBDb21Qb3J0ICovCisgICAgc2Jfb3V0W2krK10gPSBUTkNfQzJTX1NFVF9DT05UUk9MOyAgICAvKiBTZXQgQ29udHJvbCAqLworICAgIHNiX291dFtpKytdID0gVE5DX0NUTF9CUkVBS19SRVFVRVNUOworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNFOyAgICAgICAgICAgICAgICAgIC8qIG1hcmtlZCBieSBJQUMgU0UgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGNrbWFreG1zZyh0bl9tc2dfb3V0LFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0NPTVBPUlQpLAorICAgICAgICAgICAgICAgICAgIiBTRVQtQ09OVFJPTCAiLAorICAgICAgICAgICAgICAgICAgIkJSRUFLLVJFUVVFU1QiLAorICAgICAgICAgICAgICAgICAgIiBJQUMgU0UiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLHRuX21zZ19vdXQsIiIsMCk7CisgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZ19vdXQpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgcmMgPSAodHRvbCgoQ0hBUiAqKXNiX291dCxpKSA8IDApOyAgICAgIC8qIFNlbmQgaXQuICovCisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAodG5jX3dhaXQoKENIQVIgKikiY29tcG9ydCBnZXQgYnJlYWsgc3RhdGUiLDApIDwgMCkgeworICAgICAgICB0bl9wdXNoKCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsInRuY19nZXRfYnJlYWtfc3RhdGUiLCJlbmQiLHRuY19icmVhayk7CisgICAgcmV0dXJuKHRuY19icmVhayk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit0bmNfc2V0X2R0cl9zdGF0ZShpbnQgb25vZmYpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX3NldF9kdHJfc3RhdGUob25vZmYpIGludCBvbm9mZjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdG5jX3NldF9kdHJfc3RhdGUgKi8geworICAgIC8qIElBQyBTQiBDT01fUE9SVCBTRVRfQ09OVFJPTCA8dmFsdWUoMSk+IElBQyBTRSAqLworICAgIC8qICAgICAgICBWYWx1ZSAgICAgRHRyIFN0YXRlCisgICAgICogICAgICAgICAgOCAgICAgICBPbgorICAgICAqICAgICAgICAgIDkgICAgICAgT2ZmCisgICAgICovCisgICAgLyogd2FpdCBmb3IgcmVzcG9uc2UsIHJldHVybiBuZXcgaG9zdCB2YWx1ZS4gKi8KKyAgICBpbnQgaSA9IDAsIHJjOworCisgICAgZGVidWcoRjExMSwidG5jX3NldF9kdHJfc3RhdGUiLCJiZWdpbiIsb25vZmYpOworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKDApOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQpIHJldHVybigwKTsKKworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9DT01QT1JUKSkgcmV0dXJuKDApOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgaWYgKCBvbm9mZiAhPSAwICYmIG9ub2ZmID09IHRuY19kdHIgKQorICAgICAgICByZXR1cm4odG5jX2R0cik7CisKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBJIEFtIGEgQ29tbWFuZCAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNCOyAgICAgICAgICAgICAgICAgIC8qIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSBURUxPUFRfQ09NUE9SVDsgICAgICAgICAgICAgLyogQ29tUG9ydCAqLworICAgIHNiX291dFtpKytdID0gVE5DX0MyU19TRVRfQ09OVFJPTDsgICAgLyogU2V0IENvbnRyb2wgKi8KKyAgICBzYl9vdXRbaSsrXSA9IG9ub2ZmID8KKyAgICAgICAgVE5DX0NUTF9EVFJfT04gOiBUTkNfQ1RMX0RUUl9PRkY7CisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogRW5kIG9mIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0U7ICAgICAgICAgICAgICAgICAgLyogbWFya2VkIGJ5IElBQyBTRSAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgY2ttYWt4bXNnKHRuX21zZ19vdXQsVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICJURUxORVQgU0VOVCBTQiAiLFRFTE9QVChURUxPUFRfQ09NUE9SVCksCisgICAgICAgICAgICAgICAgICAiIFNFVC1DT05UUk9MICIsCisgICAgICAgICAgICAgICAgICBvbm9mZiA/ICJEVFItT04iIDogIkRUUi1PRkYiLAorICAgICAgICAgICAgICAgICAgIiBJQUMgU0UiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBkZWJ1ZyhGMTAwLHRuX21zZ19vdXQsIiIsMCk7CisgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZ19vdXQpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgcmMgPSAodHRvbCgoQ0hBUiAqKXNiX291dCxpKSA8IDApOyAgICAgIC8qIFNlbmQgaXQuICovCisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBpZiAocmMpCisgICAgICByZXR1cm4oLTEpOworCisgICAgaWYgKHRuY193YWl0KChDSEFSICopImNvbXBvcnQgc2V0IGR0ciBzdGF0ZSIsMCkgPCAwKSB7CisgICAgICAgIHRuX3B1c2goKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgZGVidWcoRjExMSwidG5jX3NldF9kdHJfc3RhdGUiLCJlbmQiLHRuY19kdHIpOworICAgIHJldHVybih0bmNfZHRyKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RuY19nZXRfZHRyX3N0YXRlKHZvaWQpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX2dldF9kdHJfc3RhdGUoKQorI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfZ2V0X2R0cl9zdGF0ZSAqLyB7CisgICAgLyogSUFDIFNCIENPTV9QT1JUIFNFVF9DT05UUk9MIDx2YWx1ZSgxKT03PiBJQUMgU0UgKi8KKyAgICAvKiB3YWl0IGZvciByZXNwb25zZSAqLworICAgIGludCBpID0gMCwgcmM7CisKKyAgICBkZWJ1ZyhGMTEwLCJ0bmNfZ2V0X2R0cl9zdGF0ZSIsImJlZ2luIiwwKTsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpIHJldHVybigwKTsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7CisKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfQ09NUE9SVCkpIHJldHVybigwKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0I7ICAgICAgICAgICAgICAgICAgLyogU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9DT01QT1JUOyAgICAgICAgICAgICAvKiBDb21Qb3J0ICovCisgICAgc2Jfb3V0W2krK10gPSBUTkNfQzJTX1NFVF9DT05UUk9MOyAgICAvKiBTZXQgQ29udHJvbCAqLworICAgIHNiX291dFtpKytdID0gVE5DX0NUTF9EVFJfUkVRVUVTVDsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgICAvKiBtYXJrZWQgYnkgSUFDIFNFICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2codG5fbXNnX291dCxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9DT01QT1JUKSwKKyAgICAgICAgICAgICAgICAgICIgU0VULUNPTlRST0wgIiwKKyAgICAgICAgICAgICAgICAgICJEVFItUkVRVUVTVCIsCisgICAgICAgICAgICAgICAgICAiIElBQyBTRSIsIE5VTEwsCisgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMDAsdG5fbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByYyA9ICh0dG9sKChDSEFSICopc2Jfb3V0LGkpIDwgMCk7ICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAodG5jX3dhaXQoKENIQVIgKikiY29tcG9ydCBnZXQgZHRyIHN0YXRlIiwwKSA8IDApIHsKKyAgICAgICAgdG5fcHVzaCgpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0bmNfZ2V0X2R0cl9zdGF0ZSIsImVuZCIsdG5jX2R0cik7CisgICAgcmV0dXJuKHRuY19kdHIpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX3NldF9ydHNfc3RhdGUoaW50IG9ub2ZmKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK3RuY19zZXRfcnRzX3N0YXRlKG9ub2ZmKSBpbnQgb25vZmY7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHRuY19zZXRfcnRzX3N0YXRlICovIHsKKyAgICAvKiBJQUMgU0IgQ09NX1BPUlQgU0VUX0NPTlRST0wgPHZhbHVlKDEpPiBJQUMgU0UgKi8KKyAgICAvKiAgICAgICAgVmFsdWUgICAgIFJ0cyBTdGF0ZQorICAgICAqICAgICAgICAgIDUgICAgICAgT24KKyAgICAgKiAgICAgICAgICA2ICAgICAgIE9mZgorICAgICAqLworICAgIC8qIHdhaXQgZm9yIHJlc3BvbnNlLCByZXR1cm4gbmV3IGhvc3QgdmFsdWUuICovCisgICAgaW50IGkgPSAwLCByYzsKKworICAgIGRlYnVnKEYxMTEsInRuY19zZXRfcnRzX3N0YXRlIiwiYmVnaW4iLG9ub2ZmKTsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpIHJldHVybigwKTsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7CisKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfQ09NUE9SVCkpIHJldHVybigwKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIGlmICggb25vZmYgIT0gMCAmJiBvbm9mZiA9PSB0bmNfcnRzICkKKyAgICAgICAgcmV0dXJuKHRuY19ydHMpOworCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogSSBBbSBhIENvbW1hbmQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gVEVMT1BUX0NPTVBPUlQ7ICAgICAgICAgICAgIC8qIENvbVBvcnQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IFROQ19DMlNfU0VUX0NPTlRST0w7ICAgIC8qIFNldCBDb250cm9sICovCisgICAgc2Jfb3V0W2krK10gPSBvbm9mZiA/CisgICAgICBUTkNfQ1RMX1JUU19PTiA6IFROQ19DVExfUlRTX09GRjsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgICAvKiBtYXJrZWQgYnkgSUFDIFNFICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2codG5fbXNnX291dCxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9DT01QT1JUKSwKKyAgICAgICAgICAgICAgICAgICIgU0VULUNPTlRST0wgIiwKKyAgICAgICAgICAgICAgICAgIG9ub2ZmID8gIlJUUy1PTiIgOiAiUlRTLU9GRiIsCisgICAgICAgICAgICAgICAgICAiIElBQyBTRSIsIE5VTEwsCisgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMDAsdG5fbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByYyA9ICh0dG9sKChDSEFSICopc2Jfb3V0LGkpIDwgMCk7ICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAodG5jX3dhaXQoKENIQVIgKikiY29tcG9ydCBzZXQgcnRzIHN0YXRlIiwwKSA8IDApIHsKKyAgICAgICAgdG5fcHVzaCgpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0bmNfc2V0X3J0c19zdGF0ZSIsImVuZCIsdG5jX3J0cyk7CisgICAgcmV0dXJuKHRuY19ydHMpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX2dldF9ydHNfc3RhdGUodm9pZCkKKyNlbHNlIC8qIENLX0FOU0lDICovCit0bmNfZ2V0X3J0c19zdGF0ZSgpCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHRuY19nZXRfcnRzX3N0YXRlICovIHsKKyAgICAvKiBJQUMgU0IgQ09NX1BPUlQgU0VUX0NPTlRST0wgPHZhbHVlKDEpPTEwPiBJQUMgU0UgKi8KKyAgICAvKiB3YWl0IGZvciByZXNwb25zZSAqLworICAgIGludCBpID0gMCwgcmM7CisKKyAgICBkZWJ1ZyhGMTEwLCJ0bmNfZ2V0X3J0c19zdGF0ZSIsImJlZ2luIiwwKTsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpIHJldHVybigwKTsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7CisKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfQ09NUE9SVCkpIHJldHVybigwKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0I7ICAgICAgICAgICAgICAgICAgLyogU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9DT01QT1JUOyAgICAgICAgICAgICAvKiBDb21Qb3J0ICovCisgICAgc2Jfb3V0W2krK10gPSBUTkNfQzJTX1NFVF9DT05UUk9MOyAgICAvKiBTZXQgQ29udHJvbCAqLworICAgIHNiX291dFtpKytdID0gVE5DX0NUTF9SVFNfUkVRVUVTVDsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgICAvKiBtYXJrZWQgYnkgSUFDIFNFICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2codG5fbXNnX291dCxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9DT01QT1JUKSwKKyAgICAgICAgICAgICAgICAgICIgU0VULUNPTlRST0wgIiwKKyAgICAgICAgICAgICAgICAgICJSVFMtUkVRVUVTVCIsCisgICAgICAgICAgICAgICAgICAiIElBQyBTRSIsIE5VTEwsCisgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMDAsdG5fbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByYyA9ICh0dG9sKChDSEFSICopc2Jfb3V0LGkpIDwgMCk7ICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmICh0bmNfd2FpdCgoQ0hBUiAqKSJjb21wb3J0IGdldCBydHMgc3RhdGUiLDApIDwgMCkgeworICAgICAgICB0bl9wdXNoKCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsInRuY19nZXRfcnRzX3N0YXRlIiwiZW5kIix0bmNfcnRzKTsKKyAgICByZXR1cm4odG5jX3J0cyk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit0bmNfc2V0X2xzX21hc2soaW50IG1hc2spCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX3NldF9sc19tYXNrKG1hc2spIGludCBtYXNrOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfc2V0X2xzX21hc2sgKi8geworICAgIC8qIElBQyBTQiBDT01fUE9SVCBTRVRfTElORVNUQVRFX01BU0sgPHZhbHVlKDEpPiBJQUMgU0UgKi8KKyAgICAvKiAgICAgICAgQml0ICAgICAgIE1lYW5pbmcKKyAgICAgKiAgICAgICAgICAwICAgICAgIERhdGEgUmVhZHkKKyAgICAgKiAgICAgICAgICAxICAgICAgIE92ZXJydW4gRXJyb3IKKyAgICAgKiAgICAgICAgICAyICAgICAgIFBhcml0eSBFcnJvcgorICAgICAqICAgICAgICAgIDMgICAgICAgRnJhbWluZyBFcnJvcgorICAgICAqICAgICAgICAgIDQgICAgICAgQnJlYWsgRGV0ZWN0IEVycm9yCisgICAgICogICAgICAgICAgNSAgICAgICBUcmFuc2ZlciBIb2xkaW5nIFJlZ2lzdGVyIEVtcHR5CisgICAgICogICAgICAgICAgNiAgICAgICBUcmFuc2ZlciBTaGlmdCBSZWdpc3RlciBFbXB0eQorICAgICAqICAgICAgICAgIDcgICAgICAgVGltZW91dCBFcnJvcgorICAgICAqLworICAgIGludCBpID0gMCwgcmM7CisKKyAgICBkZWJ1ZyhGMTExLCJ0bmNfc2V0X2xzX21hc2siLCJiZWdpbiIsbWFzayk7CisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCKSByZXR1cm4oMCk7CisgICAgaWYgKHR0bnByb3RvICE9IE5QX1RFTE5FVCkgcmV0dXJuKDApOworCisgICAgaWYgKCFURUxPUFRfTUUoVEVMT1BUX0NPTVBPUlQpKSByZXR1cm4oMCk7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBpZiAoIG1hc2sgIT0gMCAmJiBtYXNrID09IHRuY19sc19tYXNrICkKKyAgICAgICAgcmV0dXJuKHRuY19sc19tYXNrKTsKKworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0I7ICAgICAgICAgICAgICAgICAgLyogU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9DT01QT1JUOyAgICAgICAgICAgICAvKiBDb21Qb3J0ICovCisgICAgc2Jfb3V0W2krK10gPSBUTkNfQzJTX1NFVF9MU19NQVNLOworICAgIHNiX291dFtpKytdID0gKHVuc2lnbmVkIGNoYXIpKG1hc2sgJiAweEZGKTsKKyAgICBpZiAoc2Jfb3V0W2ktMV0gPT0gSUFDICkKKyAgICAgIHNiX291dFtpKytdID0gSUFDOworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNFOyAgICAgICAgICAgICAgICAgIC8qIG1hcmtlZCBieSBJQUMgU0UgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGNrbWFreG1zZyh0bl9tc2dfb3V0LFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0NPTVBPUlQpLAorICAgICAgICAgICAgICAgICAgIiBTRVQtTElORVNUQVRFLU1BU0sgIiwKKyAgICAgICAgICAgICAgICAgIGNraXRvYShtYXNrICYgMHhGRiksCisgICAgICAgICAgICAgICAgICAiIElBQyBTRSIsIE5VTEwsCisgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMDAsdG5fbXNnX291dCwiIiwwKTsKKyAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnX291dCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByYyA9ICh0dG9sKChDSEFSICopc2Jfb3V0LGkpIDwgMCk7ICAgICAgLyogU2VuZCBpdC4gKi8KKyNpZmRlZiBPUzIKKyAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgIGlmIChyYykKKyAgICAgIHJldHVybigtMSk7CisKKyAgICB0bmNfbHNfbWFzayA9IG1hc2s7CisgICAgZGVidWcoRjExMSwidG5jX3NldF9sc19tYXNrIiwiZW5kIix0bmNfbHNfbWFzayk7CisgICAgcmV0dXJuKDApOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX2dldF9sc19tYXNrKHZvaWQpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX2dldF9sc19tYXNrKCkKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdG5jX2dldF9sc19tYXNrICovIHsKKyAgICBkZWJ1ZyhGMTAxLCJ0bmNfZ2V0X2xzX21hc2siLCIiLHRuY19sc19tYXNrKTsKKyAgICByZXR1cm4odG5jX2xzX21hc2spOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX2dldF9scyh2b2lkKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK3RuY19nZXRfbHMoKQorI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfZ2V0X2xzICovIHsKKyAgICBpbnQgbHMgPSB0bmNfbHM7CisgICAgZGVidWcoRjEwMSwidG5jX2dldF9scyIsIiIsdG5jX2xzKTsKKyAgICByZXR1cm4obHMpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX3NldF9tc19tYXNrKGludCBtYXNrKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK3RuY19zZXRfbXNfbWFzayhtYXNrKSBpbnQgbWFzazsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdG5jX3NldF9tc19tYXNrICovIHsKKyAgICAvKiBJQUMgU0IgQ09NX1BPUlQgU0VUX01PREVNU1RBVEVfTUFTSyA8dmFsdWUoMSk+IElBQyBTRSAqLworICAgIC8qICAgICAgICBCaXQgICAgICAgTWVhbmluZworICAgICAqICAgICAgICAgIDAgICAgICAgRGVsdGEgQ2xlYXIgVG8gU2VuZAorICAgICAqICAgICAgICAgIDEgICAgICAgRGVsdGEgRGF0YSBTZXQgUmVhZHkKKyAgICAgKiAgICAgICAgICAyICAgICAgIFRyYWlsaW5nIEVkZ2UgUmluZyBEZXRlY3RvcgorICAgICAqICAgICAgICAgIDMgICAgICAgRGVsdGEgUmVjZWl2ZSBMaW5lIFNpZ25hbCAoQ2FycmllcikgRGV0ZWN0CisgICAgICogICAgICAgICAgNCAgICAgICBDbGVhciBUbyBTZW5kIFNpZ25hbCBTdGF0ZQorICAgICAqICAgICAgICAgIDUgICAgICAgRGF0YS1TZXQtUmVhZHkgU2lnbmFsIFN0YXRlCisgICAgICogICAgICAgICAgNiAgICAgICBSaW5nIEluZGljYXRvcgorICAgICAqICAgICAgICAgIDcgICAgICAgUmVjZWl2ZSBMaW5lIFNpZ25hbCAoQ2FycmllcikgRGV0ZWN0CisgICAgICovCisKKyAgICBpbnQgaSA9IDAsIHJjOworCisgICAgZGVidWcoRjExMSwidG5jX3NldF9tc19tYXNrIiwiYmVnaW4iLG1hc2spOworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKDApOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQpIHJldHVybigwKTsKKworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9DT01QT1JUKSkgcmV0dXJuKDApOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgaWYgKCBtYXNrICE9IDAgJiYgbWFzayA9PSB0bmNfbXNfbWFzayApCisgICAgICAgIHJldHVybih0bmNfbXNfbWFzayk7CisKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBJIEFtIGEgQ29tbWFuZCAqLworICAgIHNiX291dFtpKytdID0gKENIQVIpIFNCOyAgICAgICAgICAgICAgICAgIC8qIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSBURUxPUFRfQ09NUE9SVDsgICAgICAgICAgICAgLyogQ29tUG9ydCAqLworICAgIHNiX291dFtpKytdID0gVE5DX0MyU19TRVRfTVNfTUFTSzsKKyAgICBzYl9vdXRbaSsrXSA9ICh1bnNpZ25lZCBjaGFyKShtYXNrICYgMHhGRik7CisgICAgaWYgKHNiX291dFtpLTFdID09IElBQyApCisgICAgICBzYl9vdXRbaSsrXSA9IElBQzsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgICAvKiBtYXJrZWQgYnkgSUFDIFNFICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2codG5fbXNnX291dCxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9DT01QT1JUKSwKKyAgICAgICAgICAgICAgICAgICIgU0VULU1PREVNU1RBVEUtTUFTSyAiLAorICAgICAgICAgICAgICAgICAgY2tpdG9hKG1hc2sgJiAweEZGKSwKKyAgICAgICAgICAgICAgICAgICIgSUFDIFNFIiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgZGVidWcoRjEwMCx0bl9tc2dfb3V0LCIiLDApOworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgcmV0dXJuKC0xKTsKKworICAgIHRuY19tc19tYXNrID0gbWFzazsKKyAgICBkZWJ1ZyhGMTExLCJ0bmNfc2V0X21zX21hc2siLCJlbmQiLHRuY19tc19tYXNrKTsKKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit0bmNfZ2V0X21zX21hc2sodm9pZCkKKyNlbHNlIC8qIENLX0FOU0lDICovCit0bmNfZ2V0X21zX21hc2soKQorI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfZ2V0X21zX21hc2sgKi8geworICAgIGRlYnVnKEYxMDEsInRuY19nZXRfZ3NfbWFzayIsIiIsdG5jX21zX21hc2spOworICAgIHJldHVybih0bmNfbXNfbWFzayk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit0bmNfZ2V0X21zKHZvaWQpCisjZWxzZSAvKiBDS19BTlNJQyAqLwordG5jX2dldF9tcygpCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHRuY19nZXRfbXMgKi8geworICAgIGludCBtcyA9IHRuY19tczsKKyAgICBkZWJ1ZyhGMTAxLCJ0bmNfZ2V0X21zIiwiIix0bmNfbXMpOworICAgIHJldHVybihtcyk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit0bmNfc2VuZF9wdXJnZV9kYXRhKGludCBtb2RlKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK3RuY19zZW5kX3B1cmdlX2RhdGEobW9kZSkgaW50IG1vZGU7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHRuY19zZW5kX3B1cmdlX2RhdGEgKi8geworICAgIC8qIElBQyBTQiBDT01fUE9SVCBQVVJHRV9EQVRBIDx2YWx1ZSgxKT4gSUFDIFNFICovCisgICAgLyogICAgICAgIFZhbHVlICAgICBNZWFuaW5nCisgICAgICogICAgICAgICAgMSAgICAgICBQdXJnZSBhY2Nlc3Mgc2VydmVyIHJlY2VpdmUgZGF0YSBidWZmZXIKKyAgICAgKiAgICAgICAgICAyICAgICAgIFB1cmdlIGFjY2VzcyBzZXJ2ZXIgdHJhbnNtaXQgZGF0YSBidWZmZXIKKyAgICAgKiAgICAgICAgICAzICAgICAgIFB1cmdlIGFjY2VzcyBzZXJ2ZXIgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgZGF0YSBidWZmZXJzCisgICAgICovCisgICAgLyogTm8gcmVzcG9uc2UgKi8KKyAgICBpbnQgaSA9IDAsIHJjOworCisgICAgZGVidWcoRjExMSwidG5jX3NlbmRfcHVyZ2VfZGF0YSIsImJlZ2luIixtb2RlKTsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpIHJldHVybigwKTsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7CisKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfQ09NUE9SVCkpIHJldHVybigwKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIGlmICggIShtb2RlID49IDEgJiYgbW9kZSA8PSAzKSApCisgICAgICAgIHJldHVybigwKTsKKworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0I7ICAgICAgICAgICAgICAgICAgLyogU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9DT01QT1JUOyAgICAgICAgICAgICAvKiBDb21Qb3J0ICovCisgICAgc2Jfb3V0W2krK10gPSBUTkNfQzJTX1BVUkdFOworICAgIHNiX291dFtpKytdID0gKHVuc2lnbmVkIGNoYXIpKG1vZGUgJiAweEZGKTsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgICAvKiBtYXJrZWQgYnkgSUFDIFNFICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2codG5fbXNnX291dCxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9DT01QT1JUKSwKKyAgICAgICAgICAgICAgICAgICIgUFVSR0UtREFUQSAiLAorICAgICAgICAgICAgICAgICAgY2tpdG9hKG1vZGUgJiAweEZGKSwKKyAgICAgICAgICAgICAgICAgICIgSUFDIFNFIiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgZGVidWcoRjEwMCx0bl9tc2dfb3V0LCIiLDApOworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBkZWJ1ZyhGMTEwLCJ0bmNfc2VuZF9wdXJnZV9kYXRhIiwiZW5kIiwwKTsKKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit0bmNfZmxvd19zdXNwZW5kZWQodm9pZCkKKyNlbHNlIC8qIENLX0FOU0lDICovCit0bmNfZmxvd19zdXNwZW5kZWQoKQorI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfZmxvd19zdXNwZW5kZWQgKi8geworICAgIGRlYnVnKEYxMTEsInRuY19mbG93X3N1c3BlbmRlZCIsIiIsdG5jX3N1c3BlbmRfeG1pdCk7CisgICAgcmV0dXJuKHRuY19zdXNwZW5kX3htaXQpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5jX3N1c3BlbmRfZmxvdyh2b2lkKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK3RuY19zdXNwZW5kX2Zsb3coKQorI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmNfc3VzcGVuZF9mbG93ICovIHsKKyAgICAvKiBJQUMgU0IgQ09NX1BPUlQgRkxPV0NPTlRST0xfU1VTUEVORCBJQUMgU0UgKi8KKyAgICBpbnQgaSA9IDAsIHJjOworCisgICAgZGVidWcoRjExMCwidG5jX3N1c3BlbmRfZmxvdyIsImJlZ2luIiwwKTsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIpIHJldHVybigwKTsKKyAgICBpZiAodHRucHJvdG8gIT0gTlBfVEVMTkVUKSByZXR1cm4oMCk7CisKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfQ09NUE9SVCkpIHJldHVybigwKTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIHNiX291dFtpKytdID0gKENIQVIpIElBQzsgICAgICAgICAgICAgICAgIC8qIEkgQW0gYSBDb21tYW5kICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0I7ICAgICAgICAgICAgICAgICAgLyogU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IFRFTE9QVF9DT01QT1JUOyAgICAgICAgICAgICAvKiBDb21Qb3J0ICovCisgICAgc2Jfb3V0W2krK10gPSBUTkNfQzJTX0ZMT1dfU1VTUEVORDsKKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBJQUM7ICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgU3VibmVnb3RpYXRpb24gKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTRTsgICAgICAgICAgICAgICAgICAvKiBtYXJrZWQgYnkgSUFDIFNFICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha21zZyh0bl9tc2dfb3V0LFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICJURUxORVQgU0VOVCBTQiAiLFRFTE9QVChURUxPUFRfQ09NUE9SVCksCisgICAgICAgICAgICAgICAgICIgRkxPV0NPTlRST0wtU1VTUEVORCBJQUMgU0UiLCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgZGVidWcoRjEwMCx0bl9tc2dfb3V0LCIiLDApOworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4oLTEpOworICAgIGRlYnVnKEYxMTAsInRuY19zdXNwZW5kX2Zsb3ciLCJlbmQiLDApOworICAgIHJldHVybigwKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RuY19yZXN1bWVfZmxvdyh2b2lkKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK3RuY19yZXN1bWVfZmxvdygpCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHRuY19yZXN1bWVfZmxvdyAqLyB7CisgICAgLyogSUFDIFNCIENPTV9QT1JUIEZMT1dDT05UUk9MX1JFU1VNRSBJQUMgU0UgKi8KKyAgICBpbnQgaSA9IDAsIHJjOworCisgICAgZGVidWcoRjExMCwidG5jX3Jlc3VtZV9mbG93IiwiYmVnaW4iLDApOworICAgIGlmICh0dG5ldCAhPSBORVRfVENQQikgcmV0dXJuKDApOworICAgIGlmICh0dG5wcm90byAhPSBOUF9URUxORVQpIHJldHVybigwKTsKKworICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9DT01QT1JUKSkgcmV0dXJuKDApOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogSSBBbSBhIENvbW1hbmQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IChDSEFSKSBTQjsgICAgICAgICAgICAgICAgICAvKiBTdWJuZWdvdGlhdGlvbiAqLworICAgIHNiX291dFtpKytdID0gVEVMT1BUX0NPTVBPUlQ7ICAgICAgICAgICAgIC8qIENvbVBvcnQgKi8KKyAgICBzYl9vdXRbaSsrXSA9IFROQ19DMlNfRkxPV19SRVNVTUU7CisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgSUFDOyAgICAgICAgICAgICAgICAgLyogRW5kIG9mIFN1Ym5lZ290aWF0aW9uICovCisgICAgc2Jfb3V0W2krK10gPSAoQ0hBUikgU0U7ICAgICAgICAgICAgICAgICAgLyogbWFya2VkIGJ5IElBQyBTRSAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgY2ttYWttc2codG5fbXNnX291dCxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0NPTVBPUlQpLAorICAgICAgICAgICAgICAgICAiIEZMT1dDT05UUk9MLVJFU1VNRSBJQUMgU0UiLCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgZGVidWcoRjEwMCx0bl9tc2dfb3V0LCIiLDApOworICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2dfb3V0KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJjID0gKHR0b2woKENIQVIgKilzYl9vdXQsaSkgPCAwKTsgICAgICAvKiBTZW5kIGl0LiAqLworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4oLTEpOworICAgIGRlYnVnKEYxMTAsInRuY19yZXN1bWVfZmxvdyIsImVuZCIsMCk7CisgICAgcmV0dXJuKDApOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordG5zZXRmbG93KGludCBuZmxvdykKKyNlbHNlCit0bnNldGZsb3cobmZsb3cpIGludCBuZmxvdzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdG5zZXRmbG93ICovIHsKKworICAgIGludCByYyA9IC0xOworCisgICAgZGVidWcoRjExMSwidG5zZXRmbG93IiwiYmVnaW4iLG5mbG93KTsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIgfHwgdHRucHJvdG8gIT0gTlBfVEVMTkVUKQorICAgICAgICByZXR1cm4oLTEpOworCisgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfQ09NUE9SVCkpIHsKKyAgICAgICAgc3dpdGNoKG5mbG93KSB7CisgICAgICAgICAgY2FzZSBGTE9fWE9OWDoKKyAgICAgICAgICAgIHJjID0gdG5jX3NldF9vZmxvdygKKyAgICAgICAgICAgICAgICAgVE5DX0NUTF9PRkxPV19YT05fWE9GRgorICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKHJjID49IDApCisgICAgICAgICAgICAgIHJjID0gdG5jX3NldF9pZmxvdygKKyAgICAgICAgICAgICAgICAgICBUTkNfQ1RMX0lGTE9XX1hPTl9YT0ZGCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRkxPX1JUU0M6CisgICAgICAgICAgICByYyA9IHRuY19zZXRfb2Zsb3coCisgICAgICAgICAgICAgICAgIFROQ19DVExfT0ZMT1dfUlRTX0NUUworICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKHJjID49IDApCisgICAgICAgICAgICAgIHJjID0gdG5jX3NldF9pZmxvdygKKyAgICAgICAgICAgICAgICAgICBUTkNfQ1RMX0lGTE9XX1JUU19DVFMKKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBGTE9fS0VFUDoKKyAgICAgICAgICAgIC8qIGxlYXZlIHRoaW5ncyBleGFjdGx5IGFzIHRoZXkgYXJlICovCisgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEZMT19OT05FOgorICAgICAgICAgIGNhc2UgRkxPX0RJQUw6ICAvKiBkaWFsaW5nIGhhY2sgKi8KKyAgICAgICAgICBjYXNlIEZMT19ESUFYOiAgLyogY2FuY2VsIGRpYWxpbmcgaGFjayAqLworICAgICAgICAgICAgcmMgPSB0bmNfc2V0X29mbG93KAorICAgICAgICAgICAgICAgICBUTkNfQ1RMX09GTE9XX05PTkUKKyAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmIChyYyA+PSAwKQorICAgICAgICAgICAgICByYyA9IHRuY19zZXRfaWZsb3coCisgICAgICAgICAgICAgICAgICAgVE5DX0NUTF9JRkxPV19OT05FCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRkxPX0RUUkM6CisgICAgICAgICAgY2FzZSBGTE9fRVRYQToKKyAgICAgICAgICBjYXNlIEZMT19TVFJHOgorICAgICAgICAgIGNhc2UgRkxPX0RUUlQ6CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0bnNldGZsb3ciLCJlbmQiLHJjKTsKKyAgICByZXR1cm4ocmMgPj0gMCA/IDAgOiAtMSk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit0bnNldHRpbmdzKGludCBwYXIsIGludCBzdG9wKQorI2Vsc2UKK3Ruc2V0dGluZ3MocGFyLCBzdG9wKSBpbnQgcGFyLCBzdG9wOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bnNldHRpbmdzICovIHsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBpbnQgZGF0YXNpemUgPSAwOworICAgIGV4dGVybiBpbnQgaHdwYXJpdHk7CisKKyAgICBkZWJ1ZyhGMTExLCJ0bnNldHRpbmdzIGJlZ2luIiwicGFyIixwYXIpOworICAgIGRlYnVnKEYxMTEsInRuc2V0dGluZ3MgYmVnaW4iLCJzdG9wIixzdG9wKTsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIgfHwgdHRucHJvdG8gIT0gTlBfVEVMTkVUKQorICAgICAgcmV0dXJuKC0xKTsKKworICAgIGRhdGFzaXplID0gcGFyID8gVE5DX0RTXzcgOiBUTkNfRFNfODsKKyAgICBpZiAoIXBhcikgcGFyID0gaHdwYXJpdHk7CisKKyAgICBpZiAoVEVMT1BUX01FKFRFTE9QVF9DT01QT1JUKSkgeworICAgICAgICBzd2l0Y2ggKHBhcikgeworICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgcmMgPSB0bmNfc2V0X3Bhcml0eShUTkNfUEFSX0VWRU4pOworICAgICAgICAgICAgaWYgKHJjID49IDApCisgICAgICAgICAgICAgIHJjID0gdG5jX3NldF9kYXRhc2l6ZShkYXRhc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgIHJjID0gdG5jX3NldF9wYXJpdHkoVE5DX1BBUl9PREQpOworICAgICAgICAgICAgaWYgKHJjID49IDApCisgICAgICAgICAgICAgIHJjID0gdG5jX3NldF9kYXRhc2l6ZShkYXRhc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgIHJjID0gdG5jX3NldF9wYXJpdHkoVE5DX1BBUl9NQVJLKTsKKyAgICAgICAgICAgIGlmIChyYyA+PSAwKQorICAgICAgICAgICAgICByYyA9IHRuY19zZXRfZGF0YXNpemUoZGF0YXNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICByYyA9IHRuY19zZXRfcGFyaXR5KFROQ19QQVJfU1BBQ0UpOworICAgICAgICAgICAgaWYgKHJjID49IDApCisgICAgICAgICAgICAgIHJjID0gdG5jX3NldF9kYXRhc2l6ZShkYXRhc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICByYyA9IHRuY19zZXRfcGFyaXR5KFROQ19QQVJfTk9ORSk7CisgICAgICAgICAgICBpZiAocmMgPj0gMCkKKyAgICAgICAgICAgICAgcmMgPSB0bmNfc2V0X2RhdGFzaXplKGRhdGFzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBubyBjaGFuZ2UgKi8KKyAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2goc3RvcCkgeworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChyYyA+PSAwKQorICAgICAgICAgICAgICByYyA9IHRuY19zZXRfc3RvcHNpemUoVE5DX1NCXzIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKHJjID49IDApCisgICAgICAgICAgICAgIHJjID0gdG5jX3NldF9zdG9wc2l6ZShUTkNfU0JfMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogbm8gY2hhbmdlICovCisgICAgICAgICAgICBpZiAocmMgPj0gMCkKKyAgICAgICAgICAgICAgcmMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGRlYnVnKEYxMTEsInRuc2V0dGluZ3MiLCJlbmQiLHJjKTsKKyAgICByZXR1cm4oKHJjID49IDApID8gMCA6IC0xKTsKK30KKworLyogIFQgTiBHIE0gRCBNICAtLSAgVGVsbmV0IEdldCBtb2RlbSBzaWduYWxzICAqLworLyoKKyBMb29rcyBmb3IgdGhlIG1vZGVtIHNpZ25hbHMgQ1RTLCBEU1IsIGFuZCBDVFMsIGFuZCByZXR1cm5zIHRob3NlIHRoYXQgYXJlCisgb24gaW4gYXMgaXRzIHJldHVybiB2YWx1ZSwgaW4gYSBiaXQgbWFzayBhcyBkZXNjcmliZWQgZm9yIHR0d21kbS4KKyBSZXR1cm5zOgorICAtMyBOb3QgaW1wbGVtZW50ZWQKKyAgLTIgaWYgdGhlIGxpbmUgZG9lcyBub3QgaGF2ZSBtb2RlbSBjb250cm9sCisgIC0xIG9uIGVycm9yLgorICA+PSAwIG9uIHN1Y2Nlc3MsIHdpdGggYSBiaXQgbWFzayBjb250YWluaW5nIHRoZSBtb2RlbSBzaWduYWxzIHRoYXQgYXJlIG9uLgorKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCit0bmdtZG0odm9pZCkKKyNlbHNlCit0bmdtZG0oKQorI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0bmdtZG0gKi8geworCisgICAgaW50IHJjID0gLTE7CisKKyAgICBkZWJ1ZyhGMTEwLCJ0bmdtZG0iLCJiZWdpbiIsMCk7CisgICAgaWYgKHR0bmV0ICE9IE5FVF9UQ1BCIHx8IHR0bnByb3RvICE9IE5QX1RFTE5FVCkKKyAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAoVEVMT1BUX01FKFRFTE9QVF9DT01QT1JUKSkgeworICAgICAgICBpbnQgbW9kZW1zdGF0ZSA9IHRuY19nZXRfbXMoKTsKKyAgICAgICAgaW50IG1vZGVtID0gMDsKKyAgICAgICAgaWYgKG1vZGVtc3RhdGUgJiBUTkNfTVNfQ1RTX1NJRykKKyAgICAgICAgICBtb2RlbSB8PSBCTV9DVFM7CisgICAgICAgIGlmIChtb2RlbXN0YXRlICYgVE5DX01TX0RTUl9TSUcpCisgICAgICAgICAgbW9kZW0gfD0gQk1fRFNSOworICAgICAgICBpZiAobW9kZW1zdGF0ZSAmIFROQ19NU19SSV9TSUcpCisgICAgICAgICAgbW9kZW0gfD0gQk1fUk5HOworICAgICAgICBpZiAobW9kZW1zdGF0ZSAmIFROQ19NU19STFNEX1NJRykKKyAgICAgICAgICBtb2RlbSB8PSBCTV9EQ0Q7CisgICAgICAgIGRlYnVnKEYxMTEsInRuZ21kbSIsImVuZCIsbW9kZW0pOworICAgICAgICByZXR1cm4obW9kZW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlYnVnKEYxMTEsInRuZ21kbSIsImVuZCIsLTIpOworICAgICAgICByZXR1cm4oLTIpOworICAgIH0KK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3Ruc25kYihsb25nIHdhaXQpCisjZWxzZQordG5zbmRiKHdhaXQpIGxvbmcgd2FpdDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdG5zbmRiICovIHsKKyAgICBpbnQgcmMgPSAtMTsKKworICAgIGRlYnVnKEYxMTEsInRuc25kYiIsImJlZ2luIix3YWl0KTsKKyAgICBpZiAodHRuZXQgIT0gTkVUX1RDUEIgfHwgdHRucHJvdG8gIT0gTlBfVEVMTkVUKQorICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmIChURUxPUFRfTUUoVEVMT1BUX0NPTVBPUlQpKSB7CisgICAgICAgIHJjICA9IHRuY19zZXRfYnJlYWtfc3RhdGUoMSk7CisgICAgICAgIGlmIChyYyA+PSAwKSB7CisgICAgICAgICAgICBtc2xlZXAod2FpdCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFpaWnp6eiAqLworICAgICAgICAgICAgcmMgPSB0bmNfc2V0X2JyZWFrX3N0YXRlKDApOworICAgICAgICB9CisgICAgfQorICAgIGRlYnVnKEYxMTEsInRuc25kYiIsImVuZCIscmMpOworICAgIHJldHVybigocmMgPj0gMCkgPyAwIDogLTEpOworfQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyNlbmRpZiAvKiBUTkNPREUgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja2N0ZWwuaCBiL2NrZXJtaXQtOC4wLjIxMS9ja2N0ZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDViM2ZiCi0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrY3RlbC5oCkBAIC0wLDAgKzEsMTI1OSBAQAorLyogY2tjdGVsLmggLS0gU3ltYm9sIGFuZCBtYWNybyBkZWZpbml0aW9ucyBmb3IgQy1LZXJtaXQgdGVsbmV0IHN1cHBvcnQgKi8KKworLyoKKyAgQXV0aG9yczogSmVmZnJleSBFIEFsdG1hbiA8amFsdG1hbkBzZWN1cmUtZW5kcG9pbnRzLmNvbT4sCisgICAgICAgICAgICAgIFNlY3VyZSBFbmRwb2ludHMgSW5jLiwgTmV3IFlvcmsgQ2l0eQorICAgICAgICAgICBGcmFuayBkYSBDcnV6IDxmZGNAY29sdW1iaWEuZWR1PgorICBDb2x1bWJpYSBVbml2ZXJzaXR5IEFjYWRlbWljIEluZm9ybWF0aW9uIFN5c3RlbXMsIE5ldyBZb3JrIENpdHkuCisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKworICBOb3RlczoKKyAgLiBPbmx5IG9uZSBzb3VyY2UgZmlsZSBzaG91bGQgaW5jbHVkZSAjZGVmaW5lcyBmb3IKKyAgICBURUxDTURTLCBURUxPUFRTLCBURUxPUFRfU1RBVEVTLCBTTENfTkFNRVMsIGFuZCBBVVRIX05BTUVTLgorICAuIFRoaXMgZmlsZSBzaG91bGQgYmUgdXNlZCBpbnBsYWNlIG9mICJhcnBhL3RlbG5ldC5oIgorKi8KKworI2lmbmRlZiBDS0NURUxfSAorI2RlZmluZSBDS0NURUxfSAorI2lmZGVmIFROQ09ERQorLyoKKyAgRGVmaW5pdGlvbnMgZm9yIHRoZSBURUxORVQgcHJvdG9jb2wuCisgIGNhbid0IHJlbHkgb24gbGlicmFyeSBoZWFkZXIgZmlsZXMgZm9yIGFueSBvZiB0aGVtLgorKi8KKyNpZm5kZWYgSUFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCB0aGUgdGVsbmV0IGNvbW1hbmRzICovCisjZGVmaW5lIElBQyAyNTUKKyNlbmRpZiAvKiBJQUMgKi8KKyNpZm5kZWYgRE9OVAorI2RlZmluZSBET05UIDI1NAorI2VuZGlmIC8qIERPTlQgKi8KKyNpZm5kZWYgRE8KKyNkZWZpbmUgRE8gMjUzCisjZW5kaWYgLyogRE8gKi8KKyNpZm5kZWYgV09OVAorI2RlZmluZSBXT05UIDI1MgorI2VuZGlmIC8qIFdPTlQgKi8KKyNpZm5kZWYgV0lMTAorI2RlZmluZSBXSUxMIDI1MQorI2VuZGlmIC8qIFdJTEwgKi8KKyNpZm5kZWYgU0IKKyNkZWZpbmUgU0IgMjUwCisjZW5kaWYgLyogU0IgKi8KKyNpZm5kZWYgVE5fR0EKKyNkZWZpbmUgVE5fR0EgMjQ5CisjZW5kaWYgLyogVE5fR0EgKi8KKyNpZm5kZWYgVE5fRUwKKyNkZWZpbmUgVE5fRUwgMjQ4CisjZW5kaWYgLyogVE5fRUwgKi8KKyNpZm5kZWYgVE5fRUMKKyNkZWZpbmUgVE5fRUMgMjQ3CisjZW5kaWYgLyogVE5fRUMgKi8KKyNpZm5kZWYgVE5fQVlUCisjZGVmaW5lIFROX0FZVCAyNDYKKyNlbmRpZiAvKiBUTl9BWVQgKi8KKyNpZm5kZWYgVE5fQU8KKyNkZWZpbmUgVE5fQU8gMjQ1CisjZW5kaWYgLyogVE5fQU8gKi8KKyNpZm5kZWYgVE5fSVAKKyNkZWZpbmUgVE5fSVAgMjQ0CisjZW5kaWYgLyogVE5fSVAgKi8KKyNpZm5kZWYgQlJFQUsKKyNkZWZpbmUgQlJFQUsgMjQzCisjZW5kaWYgLyogQlJFQUsgKi8KKyNpZm5kZWYgVE5fRE0KKyNkZWZpbmUgVE5fRE0gMjQyCisjZW5kaWYgLyogVE5fRE0gKi8KKyNpZm5kZWYgVE5fTk9QCisjZGVmaW5lIFROX05PUCAyNDEKKyNlbmRpZiAvKiBUTl9OT1AgKi8KKyNpZm5kZWYgU0UKKyNkZWZpbmUgU0UgMjQwCisjZW5kaWYgLyogU0UgKi8KKyNpZm5kZWYgVE5fRU9SCisjZGVmaW5lIFROX0VPUiAyMzkKKyNlbmRpZiAvKiBUTl9FT1IgKi8KKyNpZm5kZWYgVE5fQUJPUlQKKyNkZWZpbmUgVE5fQUJPUlQgMjM4CisjZW5kaWYgLyogVE5fQUJPUlQgKi8KKyNpZm5kZWYgVE5fU1VTUAorI2RlZmluZSBUTl9TVVNQIDIzNworI2VuZGlmIC8qIFROX1NVU1AgKi8KKyNpZm5kZWYgVE5fRU9GCisjZGVmaW5lIFROX0VPRiAyMzYKKyNlbmRpZiAvKiBUTl9FT0YgKi8KKyNpZm5kZWYgTEFTVF9UTl9DTUQKKyNkZWZpbmUgTEFTVF9UTl9DTUQgMjM2CisKKyNkZWZpbmUgVE5fU0FLIDIwMCAgICAgICAgICAgICAgLyogSUJNIFNlY3VyZSBBdHRlbnRpb24gS2V5ICovCisjZW5kaWYgLyogTEFTVF9UTl9DTUQgKi8KKworI2RlZmluZSBTWU5DSCAgIDI0MiAgICAgICAgICAgICAvKiBmb3IgdGVsZnVuYyBjYWxscyAqLworCisjaWZkZWYgVEVMQ01EUworY2hhciAqdGVsY21kc1tdID0geworICAgICAgICAiRU9GIiwgIlNVU1AiLCAiQUJPUlQiLCAiRU9SIiwKKyAgICAgICAgIlNFIiwgIk5PUCIsICJETUFSSyIsICJCUksiLCAiSVAiLCAiQU8iLCAiQVlUIiwgIkVDIiwKKyAgICAgICAgIkVMIiwgIkdBIiwgIlNCIiwgIldJTEwiLCAiV09OVCIsICJETyIsICJET05UIiwgIklBQyIsIDAKK307CisjZWxzZSAvKiBURUxDTURTICovCitleHRlcm4gY2hhciAqdGVsY21kc1tdOworI2VuZGlmIC8qIFRFTENNRFMgKi8KKworI2RlZmluZSBURUxDTURfRklSU1QgICAgVE5fRU9GCisjZGVmaW5lIFRFTENNRF9MQVNUICAgICBJQUMKKyNkZWZpbmUgVEVMQ01EX09LKHgpICAgICgodW5zaWduZWQgaW50KSh4KSA8PSBURUxDTURfTEFTVCAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkoeCkgPj0gVEVMQ01EX0ZJUlNUIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkoeCkgPT0gVE5fU0FLKQorI2RlZmluZSBURUxDTUQoeCkgICAgICAgKFRFTENNRF9PSyh4KT8gKCh4KSA9PSBUTl9TQUs/IlNBSyI6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZWxjbWRzWyh4KS1URUxDTURfRklSU1RdKToiVU5LTk9XTiIpCisKKy8qIFRoZW4gdGhlIG9wdGlvbnMgKi8KKy8qIE5COiB0aGUgZm9sbG93aW5nIHBsYXRmb3JtcyBoYXZlIFRFTE9QVF9BVVRIRU5USUNBVElPTiBkZWZpbmVkIGFzICovCisvKiA0NSBpbnN0ZWFkIG9mIDM3LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIFRFTE9QVF9BVVRIRU5USUNBVElPTgorI2lmZGVmIF9fb3NmX18KKyN1bmRlZiBURUxPUFRfQVVUSEVOVElDQVRJT04KKyNlbmRpZiAvKiBfX29zZl9fICovCisjaWZuZGVmIElSSVgKKyN1bmRlZiBURUxPUFRfQVVUSEVOVElDQVRJT04KKyNlbmRpZiAvKiBJUklYICovCisjaWZuZGVmIHVsdHJpeAorI3VuZGVmIFRFTE9QVF9BVVRIRU5USUNBVElPTgorI2VuZGlmIC8qIHVsdHJpeCAqLworI2VuZGlmIC8qIFRFTE9QVF9BVVRIRU5USUNBVElPTiAqLworCisvKiB0ZWxuZXQgb3B0aW9ucyAqLworI2lmbmRlZiBURUxPUFRfQklOQVJZCisjZGVmaW5lIFRFTE9QVF9CSU5BUlkgICAwICAgICAgIC8qIDgtYml0IGRhdGEgcGF0aCAoUkZDIDg1NikqLworI2VuZGlmCisjaWZuZGVmIFRFTE9QVF9FQ0hPCisjZGVmaW5lIFRFTE9QVF9FQ0hPICAgICAxICAgICAgIC8qIGVjaG8gKFJGQyA4NTcpKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfUkNQCisjZGVmaW5lIFRFTE9QVF9SQ1AgICAgICAyICAgICAgIC8qIHByZXBhcmUgdG8gcmVjb25uZWN0IChOSUMgNTAwMDUpKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfU0dBCisjZGVmaW5lIFRFTE9QVF9TR0EgICAgICAzICAgICAgIC8qIHN1cHByZXNzIGdvIGFoZWFkIChSRkMgODU4KSAqLworI2VuZGlmCisjaWZuZGVmIFRFTE9QVF9OQU1TCisjZGVmaW5lIFRFTE9QVF9OQU1TICAgICA0ICAgICAgIC8qIGFwcHJveGltYXRlIG1lc3NhZ2Ugc2l6ZSAoRVRIRVJORVQpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX1NUQVRVUworI2RlZmluZSBURUxPUFRfU1RBVFVTICAgNSAgICAgICAvKiBnaXZlIHN0YXR1cyAoUkZDIDg1OSkgKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfVE0KKyNkZWZpbmUgVEVMT1BUX1RNICAgICAgIDYgICAgICAgLyogdGltaW5nIG1hcmsgKFJGQyA4NjApICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX1JDVEUKKyNkZWZpbmUgVEVMT1BUX1JDVEUgICAgIDcgICAgICAgLyogcmVtb3RlIGNvbnRyb2xsZWQgdHJhbnNtaXNzaW9uIGFuZCBlY2hvICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChSRkMgNzI2KSAqLworI2lmbmRlZiBURUxPUFRfTkFPTAorI2RlZmluZSBURUxPUFRfTkFPTCAgICAgOCAgICAgICAvKiBuZWdvdGlhdGUgYWJvdXQgb3V0cHV0IGxpbmUgd2lkdGggKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKE5JQyA1MDAwNSkgKi8KKyNpZm5kZWYgVEVMT1BUX05BT1AKKyNkZWZpbmUgVEVMT1BUX05BT1AgICAgIDkgICAgICAgLyogbmVnb3RpYXRlIGFib3V0IG91dHB1dCBwYWdlIHNpemUgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKE5JQyA1MDAwNSkgKi8KKyNpZm5kZWYgVEVMT1BUX05BT0NSRAorI2RlZmluZSBURUxPUFRfTkFPQ1JEICAgMTAgICAgICAvKiBuZWdvdGlhdGUgYWJvdXQgQ1IgZGlzcG9zaXRpb24gKFJGQyA2NTIpICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtIaXN0b3JpY10gKi8KKyNpZm5kZWYgVEVMT1BUX05BT0hUUworI2RlZmluZSBURUxPUFRfTkFPSFRTICAgMTEgICAgICAvKiBuZWdvdGlhdGUgYWJvdXQgaG9yaXpvbnRhbCB0YWJzdG9wcyAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoUkZDIDY1MykgW0hpc3RvcmljXSAqLworI2lmbmRlZiBURUxPUFRfTkFPSFRECisjZGVmaW5lIFRFTE9QVF9OQU9IVEQgICAxMiAgICAgIC8qIG5lZ290aWF0ZSBhYm91dCBob3JpeiB0YWIgZGlzcG9zaXRpb24gKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKFJGQyA2NTQpIFtIaXN0b3JpY10gKi8KKyNpZm5kZWYgVEVMT1BUX05BT0ZGRAorI2RlZmluZSBURUxPUFRfTkFPRkZEICAgMTMgICAgICAvKiBuZWdvdGlhdGUgYWJvdXQgZm9ybWZlZWQgZGlzcG9zaXRpb24gKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKFJGQyA2NTUpIFtIaXN0b3JpY10gKi8KKyNpZm5kZWYgVEVMT1BUX05BT1ZUUworI2RlZmluZSBURUxPUFRfTkFPVlRTICAgMTQgICAgICAvKiBuZWdvdGlhdGUgYWJvdXQgdmVydGljYWwgdGFiIHN0b3BzICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChSRkMgNjU2KSBbSGlzdG9yaWNdICovCisjaWZuZGVmIFRFTE9QVF9OQU9WVEQKKyNkZWZpbmUgVEVMT1BUX05BT1ZURCAgIDE1ICAgICAgLyogbmVnb3RpYXRlIGFib3V0IHZlcnRpY2FsIHRhYiBkaXNwb3NpdGlvbiAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoUkZDIDY1NykgW0hpc3RvcmljXSAqLworI2lmbmRlZiBURUxPUFRfTkFPTEZECisjZGVmaW5lIFRFTE9QVF9OQU9MRkQgICAxNiAgICAgIC8qIG5lZ290aWF0ZSBhYm91dCBvdXRwdXQgTEYgZGlzcG9zaXRpb24gKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKFJGQyA2NTgpIFtIaXN0b3JpY10gKi8KKyNpZm5kZWYgVEVMT1BUX1hBU0NJSQorI2RlZmluZSBURUxPUFRfWEFTQ0lJICAgMTcgICAgICAvKiBleHRlbmRlZCBhc2NpaSBjaGFyYWN0ZXIgc2V0ICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChSRkMgNjk4KSAqLworI2lmbmRlZiBURUxPUFRfTE9HT1VUCisjZGVmaW5lIFRFTE9QVF9MT0dPVVQgICAxOCAgICAgIC8qIGZvcmNlIGxvZ291dCAoUkZDIDcyNykgKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfQk0KKyNkZWZpbmUgVEVMT1BUX0JNICAgICAgIDE5ICAgICAgLyogYnl0ZSBtYWNybyAoUkZDIDczNSkgKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfREVUCisjZGVmaW5lIFRFTE9QVF9ERVQgICAgICAyMCAgICAgIC8qIGRhdGEgZW50cnkgdGVybWluYWwgKFJGQyAxMDQzLCA3MzIpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX1NVUERVUAorI2RlZmluZSBURUxPUFRfU1VQRFVQICAgMjEgICAgICAvKiBzdXBkdXAgcHJvdG9jb2wgKFJGQyA3MzYsIDczNCkgKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfU1VQRFVQT1VUUFVUCisjZGVmaW5lIFRFTE9QVF9TVVBEVVBPVVRQVVQgMjIgIC8qIHN1cGR1cCBvdXRwdXQgKFJGQyA3NDkpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX1NORExPQworI2RlZmluZSBURUxPUFRfU05ETE9DICAgMjMgICAgICAvKiBzZW5kIGxvY2F0aW9uIChSRkMgNzc5KSAqLworI2VuZGlmCisjaWZuZGVmIFRFTE9QVF9UVFlQRQorI2RlZmluZSBURUxPUFRfVFRZUEUgICAgMjQgICAgICAvKiB0ZXJtaW5hbCB0eXBlIChSRkMgMTA5MSkgKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfRU9SCisjZGVmaW5lIFRFTE9QVF9FT1IgICAgICAyNSAgICAgIC8qIGVuZCBvZiByZWNvcmQgKFJGQyA4ODUpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX1RVSUQKKyNkZWZpbmUgVEVMT1BUX1RVSUQgICAgIDI2ICAgICAgLyogVEFDQUNTIHVzZXIgaWRlbnRpZmljYXRpb24gKFJGQyA5MjcpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX09VVE1SSworI2RlZmluZSBURUxPUFRfT1VUTVJLICAgMjcgICAgICAvKiBvdXRwdXQgbWFya2luZyAoUkZDIDkzMykgKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfVFRZTE9DCisjZGVmaW5lIFRFTE9QVF9UVFlMT0MgICAyOCAgICAgIC8qIHRlcm1pbmFsIGxvY2F0aW9uIG51bWJlciAoUkZDIDk0NikgKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfMzI3MFJFR0lNRQorI2RlZmluZSBURUxPUFRfMzI3MFJFR0lNRSAyOSAgICAvKiAzMjcwIHJlZ2ltZSAoUkZDIDEwNDEpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX1gzUEFECisjZGVmaW5lIFRFTE9QVF9YM1BBRCAgICAzMCAgICAgIC8qIFguMyBQQUQgKFJGQyAxMDUzKSAqLworI2VuZGlmCisjaWZuZGVmIFRFTE9QVF9OQVdTCisjZGVmaW5lIFRFTE9QVF9OQVdTICAgICAzMSAgICAgIC8qIHdpbmRvdyBzaXplIChSRkMgMTA3MykgKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfVFNQRUVECisjZGVmaW5lIFRFTE9QVF9UU1BFRUQgICAzMiAgICAgIC8qIHRlcm1pbmFsIHNwZWVkIChSRkMgMTA3OSkgKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfTEZMT1cKKyNkZWZpbmUgVEVMT1BUX0xGTE9XICAgIDMzICAgICAgLyogcmVtb3RlIGZsb3cgY29udHJvbCAoUkZDIDEzNzIpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX0xJTkVNT0RFCisjZGVmaW5lIFRFTE9QVF9MSU5FTU9ERSAzNCAgICAgIC8qIExpbmVtb2RlIG9wdGlvbiAoUkZDIDExODQpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX1hESVNQTE9DCisjZGVmaW5lIFRFTE9QVF9YRElTUExPQyAzNSAgICAgIC8qIFggRGlzcGxheSBMb2NhdGlvbiAoUkZDIDEwOTYpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX09MRF9FTlZJUk9OCisjZGVmaW5lIFRFTE9QVF9PTERfRU5WSVJPTiAzNiAgIC8qIE9sZCAtIEVudmlyb25tZW50IHZhcmlhYmxlcyAoUkZDIDE0MDgpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX0FVVEhFTlRJQ0FUSU9OCisjZGVmaW5lIFRFTE9QVF9BVVRIRU5USUNBVElPTiAzNy8qIEF1dGhlbnRpY2F0ZSAoUkZDIDI5NDEpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX0VOQ1JZUFRJT04KKyNkZWZpbmUgVEVMT1BUX0VOQ1JZUFRJT04gMzggICAgLyogRW5jcnlwdGlvbiBvcHRpb24gKFJGQyAyOTQ2KSAqLworI2VuZGlmCisjaWZuZGVmIFRFTE9QVF9ORVdFTlZJUk9OCisjZGVmaW5lIFRFTE9QVF9ORVdFTlZJUk9OIDM5ICAgIC8qIE5ldyAtIEVudmlyb25tZW50IHZhcmlhYmxlcyAoUkZDIDE1NzIpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUXzMyNzBFCisjZGVmaW5lIFRFTE9QVF8zMjcwRSAgICA0MCAgICAgIC8qIDMyNzAgRXh0ZW5kZWQgKFJGQyAxNjQ3KSAqLworI2VuZGlmCisjaWZuZGVmIFRFTE9QVF9YQVVUSAorI2RlZmluZSBURUxPUFRfWEFVVEggICAgNDEgICAgICAvKiA/Pz8gKEVhcmhhcnQpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX0NIQVJTRVQKKyNkZWZpbmUgVEVMT1BUX0NIQVJTRVQgIDQyICAgICAgLyogQ2hhcmFjdGVyLXNldCAoUkZDIDIwNjYpICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX1JTUAorI2RlZmluZSBURUxPUFRfUlNQICAgICAgNDMgICAgICAvKiBSZW1vdGUgU2VyaWFsIFBvcnQgKEJhcm5lcykgKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfQ09NUE9SVAorI2RlZmluZSBURUxPUFRfQ09NUE9SVCAgNDQgICAgICAvKiBDb20gUG9ydCBDb250cm9sIChSRkMgMjIxNykgKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfU0xFCisjZGVmaW5lIFRFTE9QVF9TTEUgICAgICA0NSAgICAgIC8qIFN1cHByZXNzIExvY2FsIEVjaG8gKEF0bWFyKSAtIFtyZWplY3RlZF0gKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfU1RBUlRfVExTCisjZGVmaW5lIFRFTE9QVF9TVEFSVF9UTFMgNDYgICAgIC8qIFRlbG5ldCBvdmVyIFRyYW5zcG9ydCBMYXllciBTZWN1cml0eSAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoQm9lKSAqLworI2lmbmRlZiBURUxPUFRfS0VSTUlUCisjZGVmaW5lIFRFTE9QVF9LRVJNSVQgICA0NyAgICAgIC8qIEtlcm1pdCAoUkZDIDI4NDApICovCisjZW5kaWYKKyNpZm5kZWYgVEVMT1BUX1NFTkRfVVJMCisjZGVmaW5lIFRFTE9QVF9TRU5EX1VSTCA0OCAgICAgIC8qIFNlbmQgVVJMICovCisjZW5kaWYKKworI2lmbmRlZiBURUxPUFRfRk9SV0FSRF9YCisjZGVmaW5lIFRFTE9QVF9GT1JXQVJEX1ggNDkgICAgIC8qIFggV2luZG93cyBGb3J3YXJkaW5nIChBbHRtYW4pICovCisjZW5kaWYgLyogVEVMT1BUX0ZPUldBUkRfWCAqLworCisjaWZuZGVmIFRFTE9QVF9TVERFUlIKKyNkZWZpbmUgVEVMT1BUX1NUREVSUiAgICA1MCAgICAvKiBSZWRpcmVjdGVkIFN0ZGVyciAoQWx0bWFuKSAqLworI2VuZGlmIC8qIFRFTE9QVF9TVERFUlIgKi8KKworI2lmbmRlZiBURUxPUFRfUFJBR01BX0xPR09OCisjZGVmaW5lIFRFTE9QVF9QUkFHTUFfTE9HT04gMTM4IC8qIEVuY3J5cHRlZCBMb2dvbiBvcHRpb24gKFByYWdtYVN5cykgKi8KKyNlbmRpZgorI2lmbmRlZiBURUxPUFRfU1NQSV9MT0dPTgorI2RlZmluZSBURUxPUFRfU1NQSV9MT0dPTiAxMzkgICAvKiBNUyBTU1BJIExvZ29uIG9wdGlvbiAoUHJhZ21hU3lzKSAqLworI2VuZGlmCisjaWZuZGVmIFRFTE9QVF9QUkFHTUFfSEVBUlRCRUFUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlcnZlciBTZW5kIEhlYXJ0YmVhdCBvcHRpb24gKFByYWdtYVN5cykgKi8KKyNkZWZpbmUgVEVMT1BUX1BSQUdNQV9IRUFSVEJFQVQgMTQwCisjZW5kaWYKKworI2RlZmluZSBURUxPUFRfSUJNX1NBSyAyMDAgICAgICAvKiBJQk0gU2VjdXJlIEF0dGVudGlvbiBLZXkgKi8KKworLyoKKyAgSUJNIFNlY3VyZSBBdHRlbnRpb24gS2V5IChTQUspIE9wdGlvbgorCisgIEluIGFkZGl0aW9uIHRvIHRlcm1pbmFsIG5lZ290aWF0aW9uLCB0aGUgdGVsbmV0IGNvbW1hbmQgYWxsb3dzCisgIG5lZ290aWF0aW9uIGZvciB0aGUgU2VjdXJlIEF0dGVudGlvbiBLZXkgKFNBSykKKyAgb3B0aW9uLiBUaGlzIG9wdGlvbiwgd2hlbiBzdXBwb3J0ZWQsIHByb3ZpZGVzIHRoZSBsb2NhbCB1c2VyIHdpdGgKKyAgYSBzZWN1cmUgY29tbXVuaWNhdGlvbiBwYXRoIHRvIHRoZSByZW1vdGUKKyAgaG9zdCBmb3IgdGFza3Mgc3VjaCBhcyBjaGFuZ2luZyB1c2VyIElEcyBvciBwYXNzd29yZHMuIElmIHRoZSByZW1vdGUKKyAgaG9zdCBzdXBwb3J0cyB0aGUgU0FLIGZ1bmN0aW9uLCBhIHRydXN0ZWQKKyAgc2hlbGwgaXMgb3BlbmVkIG9uIHRoZSByZW1vdGUgaG9zdCB3aGVuIHRoZSB0ZWxuZXQgc2VuZCBzYWsKKyAgc3ViY29tbWFuZCBpcyBpc3N1ZWQuIFRoZSBTQUsgZnVuY3Rpb24gY2FuCisgIGFsc28gYmUgYXNzaWduZWQgdG8gYSBzaW5nbGUga2V5IGF2YWlsYWJsZSBpbiB0ZWxuZXQgaW5wdXQgbW9kZSwKKyAgdXNpbmcgdGhlIHNldCBzYWsgc3ViY29tbWFuZC4KKworICBUTl9TQUsKKworICBTZW5kcyB0aGUgVEVMTkVUIFNBSyAoU2VjdXJlIEF0dGVudGlvbiBLZXkpIHNlcXVlbmNlLCB3aGljaCBjYXVzZXMKKyAgdGhlIHJlbW90ZSBzeXN0ZW0gdG8gaW52b2tlIHRoZSB0cnVzdGVkIHNoZWxsLiBJZiB0aGUgU0FLIGlzIG5vdAorICBzdXBwb3J0ZWQsIHRoZW4gYW4gZXJyb3IgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgdGhhdCByZWFkczoKKyAgICBSZW1vdGUgc2lkZSBkb2VzIG5vdCBzdXBwb3J0IFNBSy4KKyovCisKKyNpZm5kZWYgVEVMT1BUX0VYT1BMCisjZGVmaW5lIFRFTE9QVF9FWE9QTCAgICAyNTUgICAgIC8qIEV4dGVuZGVkLW9wdGlvbnMtbGlzdCAoUkZDIDg2MSkgKi8KKyNlbmRpZgorCisjaWZkZWYgTlRFTE9QVFMKKyN1bmRlZiBOVEVMT1BUUworI2VuZGlmIC8qIE5URUxPUFRTICovCisvKiBUaGUgVGVsbmV0IE9wdGlvbiBzcGFjZSBpcyBubyBsb25nZXIgYmVpbmcgYWxsb2NhdGVkIGJ5IElDQU5OIGFzIGEgKi8KKy8qIGNvbnRpbnVvdXMgbGlzdC4gIEluIG90aGVyIHdvcmRzIGl0IGlzIGJlY29taW5nIHNwYXJzZS4gIEJ1dCB3ZSBkbyAqLworLyogbm90IHdhbnQgdG8gaGF2ZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgbG9uZyBsaXN0IG9mIHN0cmluZ3MgYW5kICovCisvKiBzdHJ1Y3RzIHdoaWNoIHdpbGwgbmV2ZXIgYmUgdXNlZC4gIFRoZXJlZm9yZSwgdGhlIE5URUxPUFRTIGRlZmluZSAgKi8KKy8qIGNhbiBubyBsb25nZXIgYmUgZXF1YWwgdG8gVEVMT1BUX0xBU1QrMS4gIEluIGZhY3QsIHRoZSBub3Rpb24gb2YgICAqLworLyogVEVMT1BUX0ZJUlNUIGFuZCBURUxPUFRfTEFTVCBubyBsb25nZXIgbWFrZSBzZW5zZS4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5URUxPUFRTICAgICAgICA1NQorCisjZGVmaW5lIFRFTE9QVF9GSVJTVCAgICAgVEVMT1BUX0JJTkFSWQorI2RlZmluZSBURUxPUFRfTEFTVCAgICAgIFRFTE9QVF9JQk1fU0FLCisKKy8qCisgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHNwZWVkIHVzIHVwIGF0IHJ1bnRpbWUgYnV0IGFyZSB0b28gY29tcGxleAorICBmb3Igc29tZSBwcmVwcm9jZXNzb3JzIC8gY29tcGlsZXJzOyBpZiB5b3VyIGNvbXBpbGVyIGJvbWJzIG9uIGNrY3RlbC5jCisgIHdpdGggIkluc3RydWN0aW9uIHRhYmxlIG92ZXJmbG93IiBvciBzb21lc3VjaCwgcmVidWlsZCB3aXRoIC1ETk9UT01BQ1JPUy4KKyovCisjaWZuZGVmIE5PVE9NQUNST1MKKyNpZm5kZWYgVEVMT1BUX01BQ1JPCisjZGVmaW5lIFRFTE9QVF9NQUNSTworI2VuZGlmIC8qIFRFTE9QVF9NQUNSTyAqLworI2VuZGlmIC8qIE5PVE9NQUNST1MgKi8KKworI2lmZGVmIFRFTE9QVF9NQUNSTworI2RlZmluZSBURUxPUFRfSU5ERVgoeCkgKCgoeCk+PTAgJiYgKHgpPD0gVEVMT1BUX1NUREVSUik/KHgpOlwKKyAgICAgICAgKCh4KT49VEVMT1BUX1BSQUdNQV9MT0dPTiAmJiAoeCk8PVRFTE9QVF9QUkFHTUFfSEVBUlRCRUFUKT8oeCktODc6IFwKKyAgICAgICAgKCh4KSA9PSBURUxPUFRfSUJNX1NBSyk/KHgpLTE0NjogTlRFTE9QVFMpCisKKyNkZWZpbmUgVEVMT1BUX09LKHgpICAgICgoKHgpID49IFRFTE9QVF9CSU5BUlkgJiYgKHgpIDw9IFRFTE9QVF9TVERFUlIpIHx8XAorICAgICAgICAgICAgICgoeCkgPj0gVEVMT1BUX1BSQUdNQV9MT0dPTiAmJiAoeCkgPD0gVEVMT1BUX1BSQUdNQV9IRUFSVEJFQVQpIHx8XAorICAgICAgICAgICAgICgoeCkgPT0gVEVMT1BUX0lCTV9TQUspKQorI2RlZmluZSBURUxPUFQoeCkgICAgICAgKFRFTE9QVF9PSyh4KT90ZWxvcHRzW1RFTE9QVF9JTkRFWCh4KV06IlVOS05PV04iKQorI2Vsc2UgLyogVEVMT1BUX01BQ1JPICovCitfUFJPVE9UWVAoaW50IHRlbG9wdF9pbmRleCwoaW50KSk7CitfUFJPVE9UWVAoaW50IHRlbG9wdF9vaywoaW50KSk7CitfUFJPVE9UWVAoQ0hBUiAqIHRlbG9wdCwgKGludCkpOworCisjZGVmaW5lIFRFTE9QVF9JTkRFWCh4KSB0ZWxvcHRfaW5kZXgoeCkKKyNkZWZpbmUgVEVMT1BUX09LKHgpICAgIHRlbG9wdF9vayh4KQorI2RlZmluZSBURUxPUFQoeCkgICAgICAgdGVsb3B0KHgpCisjZW5kaWYgLyogVEVMT1BUX01BQ1JPICovCisKKyNpZmRlZiBURUxPUFRTCitjaGFyICp0ZWxvcHRzW05URUxPUFRTKzJdID0geworLyogICAwICovICJCSU5BUlkiLCAgICJFQ0hPIiwgICAgICAgICAiUkNQIiwgICJTVVBQUkVTUy1HTy1BSEVBRCIsCisvKiAgIDQgKi8gIk5BTUUiLCAgICJTVEFUVVMiLCAiVElNSU5HLU1BUksiLCAiUkNURSIsCisvKiAgIDggKi8gIk5BT0wiLCAiTkFPUCIsICAiTkFPQ1JEIiwgIk5BT0hUUyIsCisvKiAgMTIgKi8gIk5BT0hURCIsICJOQU9GRkQiLCAiTkFPVlRTIiwgICJOQU9WVEQiLAorLyogIDE2ICovICJOQU9MRkQiLCAiRVhURU5ELUFTQ0lJIiwgIkxPR09VVCIsICJCWVRFLU1BQ1JPIiwKKy8qICAyMCAqLyAiREFUQS1FTlRSWS1URVJNSU5BTCIsICJTVVBEVVAiLCAiU1VQRFVQLU9VVFBVVCIsICAiU0VORC1MT0NBVElPTiIsCisvKiAgMjQgKi8gIlRFUk1JTkFMLVRZUEUiLCAgIkVORC1PRi1SRUNPUkQiLCAiVEFDQUNTLVVJRCIsICJPVVRQVVQtTUFSS0lORyIsCisvKiAgMjggKi8gIlRUWUxPQyIsICIzMjcwLVJFR0lNRSIsICJYLjMtUEFEIiwgIk5BV1MiLAorLyogIDMyICovICJUU1BFRUQiLCAiTEZMT1ciLCAiTElORU1PREUiLCAiWERJU1BMT0MiLAorLyogIDM2ICovICJPTEQtRU5WSVJPTiIsICJBVVRIRU5USUNBVElPTiIsICJFTkNSWVBUSU9OIiwgIk5FVy1FTlZJUk9OTUVOVCIsCisvKiAgNDAgKi8gIlROMzI3MEUiLCJ4YXV0aCIsIkNIQVJTRVQiLCAicmVtb3RlLXNlcmlhbC1wb3J0IiwKKy8qICA0NCAqLyAiQ09NLVBPUlQtQ09OVFJPTCIsInN1cHByZXNzLWxvY2FsLWVjaG8iLCJTVEFSVC1UTFMiLCJLRVJNSVQiLAorLyogIDQ4ICovICJzZW5kLXVybCIsIkZPUldBUkQtWCIsInN0ZGVyciIsCisvKiAxMzggKi8gInByYWdtYS1sb2dvbiIsICJzc3BpLWxvZ29uIiwgInByYWdtYS1oZWFydGJlYXQiLAorLyogMjAwICovICJpYm0tc2FrIiwKKyAgICAgICAgICAidW5rbm93biIsCisgICAgICAgIDAKK307CisjZWxzZSAvKlRFTE9QVFMgKi8KK2V4dGVybiBjaGFyICogdGVsb3B0c1tdOworI2VuZGlmIC8qIFRFTE9QVFMgKi8KKworLyogVEVMTkVUIE5ld2xpbmUgTW9kZSAqLworCisjZGVmaW5lIFROTF9DUiAgICAgMCAgICAgICAgICAgICAgICAgICAgLyogQ1Igc2VuZHMgYmFyZSBjYXJyaWFnZSByZXR1cm4gKi8KKyNkZWZpbmUgVE5MX0NSTlVMICAxICAgICAgICAgICAgICAgICAgICAvKiBDUiBhbmQgTlVMICovCisjZGVmaW5lIFROTF9DUkxGICAgMiAgICAgICAgICAgICAgICAgICAgLyogQ1IgYW5kIExGICovCisjZGVmaW5lIFROTF9MRiAgICAgMyAgICAgICAgICAgICAgICAgICAgLyogTEYgaW5zdGVhZCBvZiBDUiAqLworCisvKiBURUxORVQgTmVnb3RpYXRpb24gTW9kZSAqLworCisjZGVmaW5lICAgIFROX05HX1JGICAwICAgICAgICAgICAgICAgICAgLyogIE5lZ290aWF0aW9uIFJFRlVTRUQgKi8KKyNkZWZpbmUgICAgVE5fTkdfQUMgIDEgICAgICAgICAgICAgICAgICAvKiAgTmVnb3RpYXRpb24gQUNDRVBURUQgKi8KKyNkZWZpbmUgICAgVE5fTkdfUlEgIDIgICAgICAgICAgICAgICAgICAvKiAgTmVnb3RpYXRpb24gUkVRVUVTVEVEICovCisjZGVmaW5lICAgIFROX05HX01VICAzICAgICAgICAgICAgICAgICAgLyogIE5lZ290aWF0aW9uIFJFUVVJUkVEIChtdXN0KSAqLworCisKKy8qIFN5c3RlbXMgd2hlcmUgd2Uga25vdyB3ZSBjYW4gZGVmaW5lIFRFTE5FVCBOQVdTIGF1dG9tYXRpY2FsbHkuICovCisKKyNpZm5kZWYgQ0tfTkFXUyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbiBvdGhlciB3b3JkcywgaWYgYm90aCAqLworI2lmZGVmIENLX1RUR1dTSVogICAgICAgICAgICAgICAgICAgICAgIC8qIFROQ09ERSBhbmQgVFRHV1NJWiBhcmUgZGVmaW5lZCAqLworI2RlZmluZSBDS19OQVdTICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gd2UgY2FuIGRvIE5BV1MuICovCisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworI2VuZGlmIC8qIENLX05BV1MgKi8KKworI2lmZGVmIENLX0ZPUldBUkRfWAorI2lmbmRlZiBNQVhGV0RYCisjZGVmaW5lIE1BWEZXRFggNjQgICAgICAgICAgICAgICAgICAgICAgLyogTnVtIG9mIFggd2luZG93cyB0byBiZSBmd2QnZCAqLworI2VuZGlmIC8qIE1BWEZXRFggKi8KKyNlbmRpZiAvKiBDS19GT1JXQVJEX1ggKi8KKworLyogVGVsbmV0IFN0YXRlIHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zICovCitzdHJ1Y3QgX3RlbG9wdF9zdGF0ZSB7CisgIHVuc2lnbmVkIGNoYXIgZGVmX3NlcnZlcl9tZV9tb2RlOyAgIC8qIERlZmF1bHQgTmVnb3RpYXRpb24gTW9kZSAqLworICB1bnNpZ25lZCBjaGFyIGRlZl9zZXJ2ZXJfdV9tb2RlOyAgICAvKiBEZWZhdWx0IE5lZ290aWF0aW9uIE1vZGUgKi8KKyAgdW5zaWduZWQgY2hhciBkZWZfY2xpZW50X21lX21vZGU7ICAgLyogRGVmYXVsdCBOZWdvdGlhdGlvbiBNb2RlICovCisgIHVuc2lnbmVkIGNoYXIgZGVmX2NsaWVudF91X21vZGU7ICAgIC8qIERlZmF1bHQgTmVnb3RpYXRpb24gTW9kZSAqLworICB1bnNpZ25lZCBjaGFyIG1lX21vZGU7ICAgICAgICAgICAgICAvKiBUZWxuZXQgTmVnb3RpYXRpb24gTW9kZSAqLworICB1bnNpZ25lZCBjaGFyIHVfbW9kZTsgICAgICAgICAgICAgICAvKiBUZWxuZXQgTmVnb3RpYXRpb24gTW9kZSAqLworICB1bnNpZ25lZCBjaGFyIG1lOyAgICAgICAgICAgICAgICAgICAvKiBBbSBJID8gICAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBjaGFyIHU7ICAgICAgICAgICAgICAgICAgICAvKiBBcmUgeW91PyAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBjaGFyIHVuYW5zd2VyZWRfd2lsbDsgICAgICAvKiBTZW50IFdpbGwsIFdhaXRpbmcgZm9yIERPL0RPTlQgKi8KKyAgdW5zaWduZWQgY2hhciB1bmFuc3dlcmVkX2RvOyAgICAgICAgLyogU2VuZCBETywgV2FpdGluZyBmb3IgV0lMTC9XT05UICovCisgIHVuc2lnbmVkIGNoYXIgdW5hbnN3ZXJlZF93b250OyAgICAgIC8qIFNlbnQgV09OVCwgV2FpdGluZyBmb3IgRE9OVCAqLworICB1bnNpZ25lZCBjaGFyIHVuYW5zd2VyZWRfZG9udDsgICAgICAvKiBTZW50IERPTlQsIFdhaXRpbmcgZm9yIFdPTlQgKi8KKyAgdW5zaWduZWQgY2hhciB1bmFuc3dlcmVkX3NiOyAgICAgICAgLyogU2VudCBTQiwgICBXYWl0aW5nIGZvciBTQiAoc2VydmVyKSAqLworICB1bmlvbiB7CisjaWZkZWYgSUtTX09QVElPTgorICAgIHN0cnVjdCBfdGVsb3B0X2tlcm1pdCB7ICAgICAgICAgLyogS2VybWl0IE9wdGlvbiBTdGF0ZXMgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgbWVfc3RhcnQ7ICAgICAgIC8qIEkgaGF2ZSBhIFNlcnZlciBhY3RpdmUgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgbWVfcmVxX3N0YXJ0OyAgIC8qIFNlbnQgUmVxLVN0YXJ0LCBXYWl0aW5nIGZvciByZXNwb25zZSAqLworICAgICAgdW5zaWduZWQgY2hhciBtZV9yZXFfc3RvcDsgICAgLyogU2VudCBSZXEtU3RvcCwgV2FpdGluZyBmb3IgcmVzcG9uc2UgICovCisgICAgICB1bnNpZ25lZCBjaGFyIHVfc3RhcnQ7ICAgICAgICAvKiBZb3UgaGF2ZSBhIFNlcnZlciBhY3RpdmUgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgc29wOyAgICAgICAgICAgIC8qIEhhdmUgd2UgcmVjZWl2ZWQgdGhlIFNPUCBjaGFyPyAqLworICAgIH0ga2VybWl0OworI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgc3RydWN0IF90ZWxvcHRfZW5jcnlwdCB7ICAgICAgICAvKiBFbmNyeXB0aW9uIE9wdGlvbiBTdGF0ZXMgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZF90b19zZW5kOworICAgICAgdW5zaWduZWQgY2hhciAgc3RvcDsgICAgICAgICAgLyogSXMgZW5jcnlwdGlvbiBzdG9wcGVkPyAgICovCisgICAgfSBlbmNyeXB0OworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNpZmRlZiBDS19OQVdTCisgICAgc3RydWN0IF90ZWxvcHRfbmF3cyB7ICAgICAgICAgICAvKiBOQVdTIE9wdGlvbiBJbmZvcm1hdGlvbiAgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZF90b19zZW5kOworICAgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTGFzdCBXaWR0aCAgICAgICAgICAgICAgICovCisgICAgICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBMYXN0IEhlaWdodCAgICAgICAgICAgICAgKi8KKyAgICB9IG5hd3M7CisjZW5kaWYgLyogQ0tfTkFXUyAqLworI2lmZGVmIENLX1NTTAorICAgIHN0cnVjdCBfdGVsb3B0X3N0YXJ0X3RscyB7ICAgICAgLyogU3RhcnQgVExTIE9wdGlvbiAgICAgICAgICAgICAqLworICAgICAgIHVuc2lnbmVkIGNoYXIgdV9mb2xsb3dzOyAgICAgLyogdSByZWFkeSBmb3IgVExTIG5lZ290aWF0aW9uICAqLworICAgICAgIHVuc2lnbmVkIGNoYXIgbWVfZm9sbG93czsgICAgLyogbWUgcmVhZHkgZm9yIFRMUyBuZWdvdGlhdGlvbiAqLworICAgICAgIHVuc2lnbmVkIGNoYXIgYXV0aF9yZXF1ZXN0OyAgLyogUmN2ZCBXSUxMIEFVVEggYmVmb3JlIFdPTlQgU1RBUlRfVExTICovCisgICAgfSBzdGFydF90bHM7CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgc3RydWN0IF90ZWxvcHRfdGVybSB7ICAgICAgICAgIC8qIFRlcm1pbmFsIFR5cGUgICAgICAgICAgICAqLworICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZF90b19zZW5kOworICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZVs0MV07ICAgICAvKiBMYXN0IHRlcm1pbmFsIHR5cGUgICAgICAgKi8KKyAgICB9IHRlcm07CisjaWZkZWYgQ0tfRU5WSVJPTk1FTlQKKyAgICBzdHJ1Y3QgX3RlbG9wdF9uZXdfZW52IHsKKyAgICAgICB1bnNpZ25lZCBjaGFyIG5lZWRfdG9fc2VuZDsKKyAgICAgICB1bnNpZ25lZCBjaGFyICogc3RyOworICAgICAgIGludCAgICAgICAgICAgICBsZW47CisgICAgfSBlbnY7CisjaWZkZWYgQ0tfWERJU1BMT0MKKyAgICBzdHJ1Y3QgX3RlbG9wdF94ZGlzcCB7CisgICAgICAgdW5zaWduZWQgY2hhciBuZWVkX3RvX3NlbmQ7CisgICAgfSB4ZGlzcDsKKyNlbmRpZiAvKiBDS19YRElTUExPQyAqLworI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisjaWZkZWYgQ0tfU05ETE9DCisgICAgc3RydWN0IF90ZWxvcHRfc25kbG9jIHsKKyAgICAgICB1bnNpZ25lZCBjaGFyIG5lZWRfdG9fc2VuZDsKKyAgICB9IHNuZGxvYzsKKyNlbmRpZiAvKiBDS19TTkRMT0MgKi8KKyNpZmRlZiBDS19GT1JXQVJEX1gKKyAgICBzdHJ1Y3QgX3RlbG9wdF9md2RfeCB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZF90b19zZW5kOworICAgICAgICBpbnQgbGlzdGVuX3NvY2tldDsKKyAgICAgICAgc3RydWN0IF9jaGFubmVsIHsKKyAgICAgICAgICAgIGludCBmZDsKKyAgICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZF90b19zZW5kX3hhdXRoOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBzdXNwZW5kOworICAgICAgICB9IGNoYW5uZWxbTUFYRldEWF07CisjaWZkZWYgTlQKKyAgICAgICAgaW50IHRocmVhZF9zdGFydGVkOworI2VuZGlmIC8qIE5UICovCisgICAgfSBmb3J3YXJkX3g7CisjZW5kaWYgLyogQ0tfRk9SV0FSRF9YICovCisjaWZkZWYgVE5fQ09NUE9SVAorICAgICAgc3RydWN0IF90ZWxvcHRfY29tcG9ydCB7CisgICAgICAgICAgdW5zaWduZWQgY2hhciBuZWVkX3RvX3NlbmQ7CisgICAgICAgICAgdW5zaWduZWQgY2hhciB3YWl0X2Zvcl9zYjsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyIHdhaXRfZm9yX21zOworICAgICAgfSBjb21wb3J0OworI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyAgICAvKiBhZGRpdGlvbmFsIG9wdGlvbnMgc3VjaCBhcyBOZXcgRW52aXJvbm1lbnQgb3IgU2VuZCBMb2NhdGlvbiAqLworICB9IHNiOworfTsKK3R5cGVkZWYgc3RydWN0IF90ZWxvcHRfc3RhdGUgdGVsb3B0X3N0YXRlLCAqcF90ZWxvcHRfc3RhdGU7CisKKy8qIHRlbG9wdF9zdGF0ZXNbXSBpcyB0aGUgYXJyYXkgb2Ygc3RydWN0cyB3aGljaCB0aGUgc3RhdGUgb2YgZWFjaCB0ZWxuZXQgKi8KKy8qIG9wdGlvbiBpcyBzdG9yZWQuICBXZSBhbGxvY2F0ZSBvbmUgbW9yZSB0aGFuIHdlIG5lZWQgaW4gY2FzZSB3ZSBhcmUgICAgKi8KKy8qIHNlbnQgdGVsbmV0IG9wdGlvbnMgdGhhdCB3ZSBkbyBub3QgcmVjb2duaXplLiAgSWYgYnkgc29tZSBjaGFuY2UgdGhlICAgKi8KKy8qIFRFTE9QVF9PSygpIGNoZWNrIGlzIHNraXBwZWQsIFRFTE9QVF9JTkRFWCgpIHdpbGwgZm9yY2UgdGhlIG9wdGlvbiB0byAgKi8KKy8qIHVzZSB0aGUgZXh0cmEgY2VsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmZGVmIFRFTE9QVF9TVEFURVMKK3RlbG9wdF9zdGF0ZSB0ZWxvcHRfc3RhdGVzW05URUxPUFRTKzFdOworI2Vsc2UgLyogVEVMT1BUX1NUQVRFUyAqLworZXh0ZXJuIHRlbG9wdF9zdGF0ZSB0ZWxvcHRfc3RhdGVzW107CisjZW5kaWYgLyogVEVMT1BUX1NUQVRFUyAqLworCisjZGVmaW5lIFRFTE9QVF9NRSh4KSAodGVsb3B0X3N0YXRlc1tURUxPUFRfSU5ERVgoeCldLm1lKQorI2RlZmluZSBURUxPUFRfVSh4KSAgKHRlbG9wdF9zdGF0ZXNbVEVMT1BUX0lOREVYKHgpXS51KQorI2RlZmluZSBURUxPUFRfTUVfTU9ERSh4KSBcCisgICAgICAgICh0ZWxvcHRfc3RhdGVzW1RFTE9QVF9JTkRFWCh4KV0ubWVfbW9kZSkKKyNkZWZpbmUgVEVMT1BUX1VfTU9ERSh4KSAgXAorICAgICAgICAodGVsb3B0X3N0YXRlc1tURUxPUFRfSU5ERVgoeCldLnVfbW9kZSkKKyNkZWZpbmUgVEVMT1BUX1VOQU5TV0VSRURfV0lMTCh4KSBcCisgICAgICAgICh0ZWxvcHRfc3RhdGVzW1RFTE9QVF9JTkRFWCh4KV0udW5hbnN3ZXJlZF93aWxsKQorI2RlZmluZSBURUxPUFRfVU5BTlNXRVJFRF9ETyh4KSAgIFwKKyAgICAgICAgKHRlbG9wdF9zdGF0ZXNbVEVMT1BUX0lOREVYKHgpXS51bmFuc3dlcmVkX2RvKQorI2RlZmluZSBURUxPUFRfVU5BTlNXRVJFRF9XT05UKHgpIFwKKyAgICAgICAgKHRlbG9wdF9zdGF0ZXNbVEVMT1BUX0lOREVYKHgpXS51bmFuc3dlcmVkX3dvbnQpCisjZGVmaW5lIFRFTE9QVF9VTkFOU1dFUkVEX0RPTlQoeCkgICBcCisgICAgICAgICh0ZWxvcHRfc3RhdGVzW1RFTE9QVF9JTkRFWCh4KV0udW5hbnN3ZXJlZF9kb250KQorI2RlZmluZSBURUxPUFRfVU5BTlNXRVJFRF9TQih4KSAgIFwKKyAgICAgICAgKHRlbG9wdF9zdGF0ZXNbVEVMT1BUX0lOREVYKHgpXS51bmFuc3dlcmVkX3NiKQorI2RlZmluZSBURUxPUFRfU0IoeCkgXAorICAgICAgICAodGVsb3B0X3N0YXRlc1tURUxPUFRfSU5ERVgoeCldLnNiKQorI2RlZmluZSBURUxPUFRfREVGX1NfTUVfTU9ERSh4KSBcCisgICAgICAgICh0ZWxvcHRfc3RhdGVzW1RFTE9QVF9JTkRFWCh4KV0uZGVmX3NlcnZlcl9tZV9tb2RlKQorI2RlZmluZSBURUxPUFRfREVGX1NfVV9NT0RFKHgpICBcCisgICAgICAgICh0ZWxvcHRfc3RhdGVzW1RFTE9QVF9JTkRFWCh4KV0uZGVmX3NlcnZlcl91X21vZGUpCisjZGVmaW5lIFRFTE9QVF9ERUZfQ19NRV9NT0RFKHgpIFwKKyAgICAgICAgKHRlbG9wdF9zdGF0ZXNbVEVMT1BUX0lOREVYKHgpXS5kZWZfY2xpZW50X21lX21vZGUpCisjZGVmaW5lIFRFTE9QVF9ERUZfQ19VX01PREUoeCkgIFwKKyAgICAgICAgKHRlbG9wdF9zdGF0ZXNbVEVMT1BUX0lOREVYKHgpXS5kZWZfY2xpZW50X3VfbW9kZSkKKworI2lmZGVmIFRFTE9QVF9NT0RFUworY2hhciAqIHRlbG9wdF9tb2Rlc1s0XSA9IHsKKyAgICAiUkVGVVNFRCIsICJBQ0NFUFRFRCIsICJSRVFVRVNURUQiLCAiUkVRVUlSRUQiCit9OworI2Vsc2UgLyogVEVMT1BUX01PREVTICovCitleHRlcm4gY2hhciAqIHRlbG9wdF9tb2Rlc1tdOworI2VuZGlmIC8qIFRFTE9QVF9NT0RFUyAqLworCisjaWZkZWYgVEVMT1BUX01BQ1JPCisjZGVmaW5lIFRFTE9QVF9NT0RFX09LKHgpICgodW5zaWduZWQgaW50KSh4KSA8PSBUTl9OR19NVSkKKyNkZWZpbmUgVEVMT1BUX01PREUoeCkgKFRFTE9QVF9NT0RFX09LKHgpP3RlbG9wdF9tb2Rlc1soeCktVE5fTkdfUkZdOiJVTktOT1dOIikKKyNlbHNlIC8qIFRFTE9QVF9NQUNSTyAqLworX1BST1RPVFlQKGludCB0ZWxvcHRfbW9kZV9vaywoaW50KSk7CitfUFJPVE9UWVAoQ0hBUiAqIHRlbG9wdF9tb2RlLChpbnQpKTsKKworI2RlZmluZSBURUxPUFRfTU9ERV9PSyh4KSB0ZWxvcHRfbW9kZV9vayh4KQorI2RlZmluZSBURUxPUFRfTU9ERSh4KSAgICB0ZWxvcHRfbW9kZSh4KQorI2VuZGlmIC8qIFRFTE9QVF9NQUNSTyAqLworCisvKiBTdWItb3B0aW9uIHF1YWxpZmllcnMgKi8KKyNkZWZpbmUgVEVMUVVBTF9JUyAgICAgIDAgICAgICAgLyogb3B0aW9uIGlzLi4uICovCisjZGVmaW5lIFRFTFFVQUxfU0VORCAgICAxICAgICAgIC8qIHNlbmQgb3B0aW9uICovCisjZGVmaW5lIFRFTFFVQUxfSU5GTyAgICAyICAgICAgIC8qIEVOVklST046IGluZm9ybWF0aW9uYWwgdmVyc2lvbiBvZiBJUyAqLworI2RlZmluZSBURUxRVUFMX1JFUExZICAgMiAgICAgICAvKiBBVVRIRU5USUNBVElPTjogY2xpZW50IHZlcnNpb24gb2YgSVMgKi8KKyNkZWZpbmUgVEVMUVVBTF9OQU1FICAgIDMgICAgICAgLyogQVVUSEVOVElDQVRJT046IGNsaWVudCB2ZXJzaW9uIG9mIElTICovCisKKyNkZWZpbmUgVEVMX0VOVl9WQVIgICAgIDAKKyNkZWZpbmUgVEVMX0VOVl9WQUxVRSAgIDEKKyNkZWZpbmUgVEVMX0VOVl9FU0MgICAgIDIKKyNkZWZpbmUgVEVMX0VOVl9VU0VSVkFSIDMKKworI2RlZmluZSBMRkxPV19PRkYgICAgICAgICAgICAgICAwICAgICAgIC8qIERpc2FibGUgcmVtb3RlIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBMRkxPV19PTiAgICAgICAgICAgICAgICAxICAgICAgIC8qIEVuYWJsZSByZW1vdGUgZmxvdyBjb250cm9sICovCisjZGVmaW5lIExGTE9XX1JFU1RBUlRfQU5ZICAgICAgIDIgICAgICAgLyogUmVzdGFydCBvdXRwdXQgb24gYW55IGNoYXIgKi8KKyNkZWZpbmUgTEZMT1dfUkVTVEFSVF9YT04gICAgICAgMyAgICAgICAvKiBSZXN0YXJ0IG91dHB1dCBvbmx5IG9uIFhPTiAqLworCisvKgorICogTElORU1PREUgc3Vib3B0aW9ucworICovCisKKyNkZWZpbmUgTE1fTU9ERSAgICAgICAgIDEKKyNkZWZpbmUgTE1fRk9SV0FSRE1BU0sgIDIKKyNkZWZpbmUgTE1fU0xDICAgICAgICAgIDMKKworI2RlZmluZSBNT0RFX0VESVQgICAgICAgMHgwMQorI2RlZmluZSBNT0RFX1RSQVBTSUcgICAgMHgwMgorI2RlZmluZSBNT0RFX0FDSyAgICAgICAgMHgwNAorI2RlZmluZSBNT0RFX1NPRlRfVEFCICAgMHgwOAorI2RlZmluZSBNT0RFX0xJVF9FQ0hPICAgMHgxMAorCisjZGVmaW5lIE1PREVfTUFTSyAgICAgICAweDFmCisKKy8qIE5vdCBwYXJ0IG9mIHByb3RvY29sLCBidXQgbmVlZGVkIHRvIHNpbXBsaWZ5IHRoaW5ncy4uLiAqLworI2RlZmluZSBNT0RFX0ZMT1cgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgTU9ERV9FQ0hPICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIE1PREVfSU5CSU4gICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBNT0RFX09VVEJJTiAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgTU9ERV9GT1JDRSAgICAgICAgICAgICAgMHgxMDAwCisKKyNkZWZpbmUgU0xDX1NZTkNIICAgICAgIDEKKyNkZWZpbmUgU0xDX0JSSyAgICAgICAgIDIKKyNkZWZpbmUgU0xDX0lQICAgICAgICAgIDMKKyNkZWZpbmUgU0xDX0FPICAgICAgICAgIDQKKyNkZWZpbmUgU0xDX0FZVCAgICAgICAgIDUKKyNkZWZpbmUgU0xDX0VPUiAgICAgICAgIDYKKyNkZWZpbmUgU0xDX0FCT1JUICAgICAgIDcKKyNkZWZpbmUgU0xDX0VPRiAgICAgICAgIDgKKyNkZWZpbmUgU0xDX1NVU1AgICAgICAgIDkKKyNkZWZpbmUgU0xDX0VDICAgICAgICAgIDEwCisjZGVmaW5lIFNMQ19FTCAgICAgICAgICAxMQorI2RlZmluZSBTTENfRVcgICAgICAgICAgMTIKKyNkZWZpbmUgU0xDX1JQICAgICAgICAgIDEzCisjZGVmaW5lIFNMQ19MTkVYVCAgICAgICAxNAorI2RlZmluZSBTTENfWE9OICAgICAgICAgMTUKKyNkZWZpbmUgU0xDX1hPRkYgICAgICAgIDE2CisjZGVmaW5lIFNMQ19GT1JXMSAgICAgICAxNworI2RlZmluZSBTTENfRk9SVzIgICAgICAgMTgKKyNkZWZpbmUgU0xDX01DTCAgICAgICAgIDE5CisjZGVmaW5lIFNMQ19NQ1IgICAgICAgICAyMAorI2RlZmluZSBTTENfTUNXTCAgICAgICAgMjEKKyNkZWZpbmUgU0xDX01DV1IgICAgICAgIDIyCisjZGVmaW5lIFNMQ19NQ0JPTCAgICAgICAyMworI2RlZmluZSBTTENfTUNFT0wgICAgICAgMjQKKyNkZWZpbmUgU0xDX0lOU1JUICAgICAgIDI1CisjZGVmaW5lIFNMQ19PVkVSICAgICAgICAyNgorI2RlZmluZSBTTENfRUNSICAgICAgICAgMjcKKyNkZWZpbmUgU0xDX0VXUiAgICAgICAgIDI4CisjZGVmaW5lIFNMQ19FQk9MICAgICAgICAyOQorI2RlZmluZSBTTENfRUVPTCAgICAgICAgMzAKKworI2RlZmluZSBOU0xDICAgICAgICAgICAgMzAKKworLyoKKyAqIEZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSwgd2UgZGVmaW5lIFNMQ19OQU1FUyB0byBiZSB0aGUKKyAqIGxpc3Qgb2YgbmFtZXMgaWYgU0xDX05BTUVTIGlzIG5vdCBkZWZpbmVkLgorICovCisjZGVmaW5lIFNMQ19OQU1FTElTVCAgICAiMCIsICJTWU5DSCIsICJCUksiLCAiSVAiLCAiQU8iLCAiQVlUIiwgIkVPUiIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBQk9SVCIsICJFT0YiLCAiU1VTUCIsICJFQyIsICJFTCIsICJFVyIsICJSUCIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJMTkVYVCIsICJYT04iLCAiWE9GRiIsICJGT1JXMSIsICJGT1JXMiIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNQ0wiLCAiTUNSIiwgIk1DV0wiLCAiTUNXUiIsICJNQ0JPTCIsICJNQ0VPTCIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJTlNSVCIsICJPVkVSIiwgIkVDUiIsICJFV1IiLCAiRUJPTCIsICJFRU9MIiwgMAorI2lmZGVmICBTTENfTkFNRVMKK2NoYXIgKnNsY19uYW1lc1tdID0geworICAgICAgICBTTENfTkFNRUxJU1QKK307CisjZWxzZQorZXh0ZXJuIGNoYXIgKnNsY19uYW1lc1tdOworI2RlZmluZSBTTENfTkFNRVMgU0xDX05BTUVMSVNUCisjZW5kaWYKKworI2RlZmluZSBTTENfTkFNRV9PSyh4KSAgKCh1bnNpZ25lZCBpbnQpKHgpIDw9IE5TTEMpCisjZGVmaW5lIFNMQ19OQU1FKHgpICAgICAoU0xDX05BTUVfT0soeCk/c2xjX25hbWVzW3hdOiJVTktOT1dOIikKKworI2RlZmluZSBTTENfTk9TVVBQT1JUICAgICAgIDAKKyNkZWZpbmUgU0xDX0NBTlRDSEFOR0UgICAgICAxCisjZGVmaW5lIFNMQ19WQVJJQUJMRSAgICAgICAgMgorI2RlZmluZSBTTENfREVGQVVMVCAgICAgICAgIDMKKyNkZWZpbmUgU0xDX0xFVkVMQklUUyAgICAgICAweDAzCisKKyNkZWZpbmUgU0xDX0ZVTkMgICAgICAgICAgICAwCisjZGVmaW5lIFNMQ19GTEFHUyAgICAgICAgICAgMQorI2RlZmluZSBTTENfVkFMVUUgICAgICAgICAgIDIKKworI2RlZmluZSBTTENfQUNLICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgU0xDX0ZMVVNISU4gICAgICAgICAweDQwCisjZGVmaW5lIFNMQ19GTFVTSE9VVCAgICAgICAgMHgyMAorCisjZGVmaW5lIE9MRF9FTlZfVkFSICAgICAgICAgMQorI2RlZmluZSBPTERfRU5WX1ZBTFVFICAgICAgIDAKKyNkZWZpbmUgTkVXX0VOVl9WQVIgICAgICAgICAwCisjZGVmaW5lIE5FV19FTlZfVkFMVUUgICAgICAgMQorI2RlZmluZSBFTlZfRVNDICAgICAgICAgICAgIDIKKyNkZWZpbmUgRU5WX1VTRVJWQVIgICAgICAgICAzCisKKyNkZWZpbmUgRldEWF9TQ1JFRU4gICAgICAgICAwCisjZGVmaW5lIEZXRFhfT1BFTiAgICAgICAgICAgMQorI2RlZmluZSBGV0RYX0NMT1NFICAgICAgICAgIDIKKyNkZWZpbmUgRldEWF9EQVRBICAgICAgICAgICAzCisjZGVmaW5lIEZXRFhfT1BUSU9OUyAgICAgICAgNAorI2RlZmluZSBGV0RYX09QVF9EQVRBICAgICAgIDUKKyNkZWZpbmUgRldEWF9YT0ZGICAgICAgICAgICA2CisjZGVmaW5lIEZXRFhfWE9OICAgICAgICAgICAgNworCisjZGVmaW5lIEZXRFhfT1BUX05PTkUgICAgICAgMAorI2RlZmluZSBGV0RYX09QVF9YQVVUSCAgICAgIDEKKworLyoKKyAqIEFVVEhFTlRJQ0FUSU9OIHN1Ym9wdGlvbnMKKyAqLworCisvKgorICogV2hvIGlzIGF1dGhlbnRpY2F0aW5nIHdobyAuLi4KKyAqLworI2RlZmluZSBBVVRIX0NMSUVOVF9UT19TRVJWRVIgICAwICAgICAgIC8qIENsaWVudCBhdXRoZW50aWNhdGluZyBzZXJ2ZXIgKi8KKyNkZWZpbmUgQVVUSF9TRVJWRVJfVE9fQ0xJRU5UICAgMSAgICAgICAvKiBTZXJ2ZXIgYXV0aGVudGljYXRpbmcgY2xpZW50ICovCisjZGVmaW5lIEFVVEhfV0hPX01BU0sgICAgICAgICAgIDEKKworLyoKKyAqIGFtb3VudCBvZiBhdXRoZW50aWNhdGlvbiBkb25lCisgKi8KKyNkZWZpbmUgQVVUSF9IT1dfT05FX1dBWSAgICAgICAgMAorI2RlZmluZSBBVVRIX0hPV19NVVRVQUwgICAgICAgICAyCisjZGVmaW5lIEFVVEhfSE9XX01BU0sgICAgICAgICAgIDIKKworLyoKKyAqIHNob3VsZCB3ZSBiZSBlbmNyeXB0aW5nPworICovCisjZGVmaW5lIEFVVEhfRU5DUllQVF9PRkYgICAgICAgICAgICAgMAorI2RlZmluZSBBVVRIX0VOQ1JZUFRfVVNJTkdfVEVMT1BUICAgIDQKKyNkZWZpbmUgQVVUSF9FTkNSWVBUX0FGVEVSX0VYQ0hBTkdFIDE2CisjZGVmaW5lIEFVVEhfRU5DUllQVF9TVEFSVF9UTFMgICAgICAyMAorI2RlZmluZSBBVVRIX0VOQ1JZUFRfTUFTSyAgICAgICAgICAgMjAKKworLyoKKyAqIHdpbGwgd2UgYmUgZm9yd2FyZGluZz8KKyAqIGlmIHdlIHdhbnQgdG8gYWN0aXZhdGUgdGhlIHVzZSBvZiB0aGlzIGZsYWcgdGhlbgorICogICAjZGVmaW5lIFVTRV9JTklfQ1JFRF9GV0QKKyAqLworI2RlZmluZSBJTklfQ1JFRF9GV0RfT0ZGICAgICAgICAwCisjZGVmaW5lIElOSV9DUkVEX0ZXRF9PTiAgICAgICAgIDgKKyNkZWZpbmUgSU5JX0NSRURfRldEX01BU0sgICAgICAgOAorI2RlZmluZSBVU0VfSU5JX0NSRURfRldECisKKyNkZWZpbmUgQVVUSFRZUEVfTlVMTCAgICAgICAgICAgMAorI2RlZmluZSBBVVRIVFlQRV9LRVJCRVJPU19WNCAgICAxCisjZGVmaW5lIEFVVEhUWVBFX0tFUkJFUk9TX1Y1ICAgIDIKKyNkZWZpbmUgQVVUSFRZUEVfU1BYICAgICAgICAgICAgMworI2RlZmluZSBBVVRIVFlQRV9NSU5LICAgICAgICAgICA0CisjZGVmaW5lIEFVVEhUWVBFX1NSUCAgICAgICAgICAgIDUKKyNkZWZpbmUgQVVUSFRZUEVfUlNBICAgICAgICAgICAgNgorI2RlZmluZSBBVVRIVFlQRV9TU0wgICAgICAgICAgICA3CisjZGVmaW5lIEFVVEhUWVBFX0xPS0kgICAgICAgICAgMTAKKyNkZWZpbmUgQVVUSFRZUEVfU1NBICAgICAgICAgICAxMQorI2RlZmluZSBBVVRIVFlQRV9LRUFfU0ogICAgICAgIDEyCisjZGVmaW5lIEFVVEhUWVBFX0tFQV9JTlRFRyAgICAgMTMKKyNkZWZpbmUgQVVUSFRZUEVfRFNTICAgICAgICAgICAxNAorI2RlZmluZSBBVVRIVFlQRV9OVExNICAgICAgICAgIDE1CisjZGVmaW5lIEFVVEhUWVBFX0dTU0FQSV9LUkI1ICAgMTYgICAgICAgICAgICAgICAvKiBOb3QgYWxsb2NhdGVkIGJ5IElBTkEgKi8KKyNpZmRlZiBBVVRIVFlQRV9DTlQKKyN1bmRlZiBBVVRIVFlQRV9DTlQKKyNlbmRpZiAvKiBBVVRIVFlQRV9DTlQgKi8KKyNkZWZpbmUgQVVUSFRZUEVfQ05UICAgICAgICAgICAxNworCisvKgorICogQVVUSFRZUEVzIExhc3QgdXBkYXRlZCAyMSBNYXJjaCAxOTk5CisgKiBmcm9tIGh0dHA6Ly93d3cuaXNpLmVkdS9pbi1ub3Rlcy9pYW5hL2Fzc2lnbm1lbnRzL3RlbG5ldC1vcHRpb25zCisgKi8KKworI2RlZmluZSBBVVRIVFlQRV9BVVRPICAgICAgICAgICA5OQorCisjaWZkZWYgIEFVVEhfTkFNRVMKK2NoYXIgKmF1dGh0eXBlX25hbWVzW10gPSB7CisgICAgIk5VTEwiLCAgICAgICAgICAgICAgICAgICAgIC8qIFJGQyAyOTQxICovCisgICAgIktFUkJFUk9TX1Y0IiwgICAgICAgICAgICAgIC8qIFJGQyAyOTQxIC8gMTQxMSAqLworICAgICJLRVJCRVJPU19WNSIsICAgICAgICAgICAgICAvKiBSRkMgMjk0MSAqLworICAgICJTUFgiLCAgICAgICAgICAgICAgICAgICAgICAvKiBSRkMgMjk0MSAobm90IEludGVybmV0IFN0YW5kYXJkKSAqLworICAgICJNSU5LIiwgICAgICAgICAgICAgICAgICAgICAvKiBSRkMgMjk0MSAobm90IEludGVybmV0IFN0YW5kYXJkKSAqLworICAgICJTUlAiLCAgICAgICAgICAgICAgICAgICAgICAvKiBSRkMgMjk0NCAqLworICAgICJSU0EiLCAgICAgICAgICAgICAgICAgICAgICAvKiBSRkMgMjk0MSAobm90IEludGVybmV0IFN0YW5kYXJkKSAqLworICAgICJTU0wiLCAgICAgICAgICAgICAgICAgICAgICAvKiBSRkMgMjk0MSAobm90IEludGVybmV0IFN0YW5kYXJkKSAqLworICAgICJJQU5BXzgiLCAgICAgICAgICAgICAgICAgICAvKiBub3QgYXNzaWduZWQgYnkgSUFOQSAqLworICAgICJJQU5BXzkiLCAgICAgICAgICAgICAgICAgICAvKiBub3QgYXNzaWduZWQgYnkgSUFOQSAqLworICAgICJMT0tJIiwgICAgICAgICAgICAgICAgICAgICAvKiBSRkMgMjk0MSAobm90IEludGVybmV0IFN0YW5kYXJkKSAqLworICAgICJTU0EiLCAgICAgICAgICAgICAgICAgICAgICAvKiBTY2hvY2ggKi8KKyAgICAiS0VBX1NKIiwgICAgICAgICAgICAgICAgICAgLyogUkZDIDI5NTEgKi8KKyAgICAiS0VBX1NKX0lOVEVHIiwgICAgICAgICAgICAgLyogUkZDIDI5NTEgKi8KKyAgICAiRFNTIiwgICAgICAgICAgICAgICAgICAgICAgLyogUkZDIDI5NDMgKi8KKyAgICAiTlRMTSIsICAgICAgICAgICAgICAgICAgICAgLyogS2FobiA8bG91aXNrQG1pY3Jvc29mdC5jb20+ICovCisgICAgIkdTU0FQSS1LUkI1IiwgICAgICAgICAgICAgIC8qIGV4cGVyaW1lbnRhbCAtIGFsdG1hbiAqLworICAgIDAKK307CitjaGFyICogYXV0aG1vZGVfbmFtZXNbXSA9IHsKKyAgICAiQ0xJRU5UX1RPX1NFUlZFUnxPTkVfV0FZIiwKKyAgICAiU0VSVkVSX1RPX0NMSUVOVHxPTkVfV0FZIiwKKyAgICAiQ0xJRU5UX1RPX1NFUlZFUnxNVVRVQUwiLAorICAgICJTRVJWRVJfVE9fQ0xJRU5UfE1VVFVBTCIsCisgICAgIkNMSUVOVF9UT19TRVJWRVJ8T05FX1dBWXxFTkNSWVBUX1VTSU5HX1RFTE9QVCIsCisgICAgIlNFUlZFUl9UT19DTElFTlR8T05FX1dBWXxFTkNSWVBUX1VTSU5HX1RFTE9QVCIsCisgICAgIkNMSUVOVF9UT19TRVJWRVJ8TVVUVUFMfEVOQ1JZUFRfVVNJTkdfVEVMT1BUIiwKKyAgICAiU0VSVkVSX1RPX0NMSUVOVHxNVVRVQUx8RU5DUllQVF9VU0lOR19URUxPUFQiLAorICAgICJDTElFTlRfVE9fU0VSVkVSfE9ORV9XQVl8Q1JFRF9GV0QiLAorICAgICJTRVJWRVJfVE9fQ0xJRU5UfE9ORV9XQVl8Q1JFRF9GV0QiLAorICAgICJDTElFTlRfVE9fU0VSVkVSfE1VVFVBTHxDUkVEX0ZXRCIsCisgICAgIlNFUlZFUl9UT19DTElFTlR8TVVUVUFMfENSRURfRldEIiwKKyAgICAiQ0xJRU5UX1RPX1NFUlZFUnxPTkVfV0FZfEVOQ1JZUFRfVVNJTkdfVEVMT1BUfENSRURfRldEIiwKKyAgICAiU0VSVkVSX1RPX0NMSUVOVHxPTkVfV0FZfEVOQ1JZUFRfVVNJTkdfVEVMT1BUfENSRURfRldEIiwKKyAgICAiQ0xJRU5UX1RPX1NFUlZFUnxNVVRVQUx8RU5DUllQVF9VU0lOR19URUxPUFR8Q1JFRF9GV0QiLAorICAgICJTRVJWRVJfVE9fQ0xJRU5UfE1VVFVBTHxFTkNSWVBUX1VTSU5HX1RFTE9QVHxDUkVEX0ZXRCIsCisgICAgIkNMSUVOVF9UT19TRVJWRVJ8T05FX1dBWXxFTkNSWVBUX0FGVEVSX0VYQ0hBTkdFIiwKKyAgICAiU0VSVkVSX1RPX0NMSUVOVHxPTkVfV0FZfEVOQ1JZUFRfQUZURVJfRVhDSEFOR0UiLAorICAgICJDTElFTlRfVE9fU0VSVkVSfE1VVFVBTHxFTkNSWVBUX0FGVEVSX0VYQ0hBTkdFIiwKKyAgICAiU0VSVkVSX1RPX0NMSUVOVHxNVVRVQUx8RU5DUllQVF9BRlRFUl9FWENIQU5HRSIsCisgICAgIkNMSUVOVF9UT19TRVJWRVJ8T05FX1dBWXxFTkNSWVBUX1NUQVJUX1RMUyIsCisgICAgIlNFUlZFUl9UT19DTElFTlR8T05FX1dBWXxFTkNSWVBUX1NUQVJUX1RMUyIsCisgICAgIkNMSUVOVF9UT19TRVJWRVJ8TVVUVUFMfEVOQ1JZUFRfU1RBUlRfVExTIiwKKyAgICAiU0VSVkVSX1RPX0NMSUVOVHxNVVRVQUx8RU5DUllQVF9TVEFSVF9UTFMiLAorICAgICJDTElFTlRfVE9fU0VSVkVSfE9ORV9XQVl8RU5DUllQVF9BRlRFUl9FWENIQU5HRXxDUkVEX0ZXRCIsCisgICAgIlNFUlZFUl9UT19DTElFTlR8T05FX1dBWXxFTkNSWVBUX0FGVEVSX0VYQ0hBTkdFfENSRURfRldEIiwKKyAgICAiQ0xJRU5UX1RPX1NFUlZFUnxNVVRVQUx8RU5DUllQVF9BRlRFUl9FWENIQU5HRXxDUkVEX0ZXRCIsCisgICAgIlNFUlZFUl9UT19DTElFTlR8TVVUVUFMfEVOQ1JZUFRfQUZURVJfRVhDSEFOR0V8Q1JFRF9GV0QiLAorICAgICJDTElFTlRfVE9fU0VSVkVSfE9ORV9XQVl8RU5DUllQVF9TVEFSVF9UTFN8Q1JFRF9GV0QiLAorICAgICJTRVJWRVJfVE9fQ0xJRU5UfE9ORV9XQVl8RU5DUllQVF9TVEFSVF9UTFN8Q1JFRF9GV0QiLAorICAgICJDTElFTlRfVE9fU0VSVkVSfE1VVFVBTHxFTkNSWVBUX1NUQVJUX1RMU3xDUkVEX0ZXRCIsCisgICAgIlNFUlZFUl9UT19DTElFTlR8TVVUVUFMfEVOQ1JZUFRfU1RBUlRfVExTfENSRURfRldEIiwKKyAgICAwCit9OworI2Vsc2UKK2V4dGVybiBjaGFyICphdXRodHlwZV9uYW1lc1tdOworZXh0ZXJuIGNoYXIgKmF1dGhtb2RlX25hbWVzW107CisjZW5kaWYKKyNkZWZpbmUgQVVUSE1PREVfQ05UICAzMgorCisjZGVmaW5lIEFVVEhUWVBFX05BTUVfT0soeCkgICAgICgodW5zaWduZWQgaW50KSh4KSA8IEFVVEhUWVBFX0NOVCkKKyNkZWZpbmUgQVVUSFRZUEVfTkFNRSh4KSAgICAgIChBVVRIVFlQRV9OQU1FX09LKHgpP2F1dGh0eXBlX25hbWVzW3hdOiJVTktOT1dOIikKKworI2RlZmluZSBBVVRITU9ERV9OQU1FX09LKHgpICAgICAoKHVuc2lnbmVkIGludCkoeCkgPCBBVVRITU9ERV9DTlQpCisjZGVmaW5lIEFVVEhNT0RFX05BTUUoeCkgICAgICAoQVVUSE1PREVfTkFNRV9PSyh4KT9hdXRobW9kZV9uYW1lc1t4XToiVU5LTk9XTiIpCisKKy8qIEtlcmJlcm9zIEF1dGhlbnRpY2F0aW9uIE1lc3NhZ2UgSWRlbnRpZmllcnMgKi8KKyNkZWZpbmUgS1JCX0FVVEggICAgICAgICAgICAgICAgMCAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBkYXRhIGZvbGxvd3MgKi8KKyNkZWZpbmUgS1JCX1JFSkVDVCAgICAgICAgICAgICAgMSAgICAgICAvKiBSZWplY3RlZCAocmVhc29uIG1pZ2h0IGZvbGxvdykgKi8KKyNkZWZpbmUgS1JCX0FDQ0VQVCAgICAgICAgICAgICAgMiAgICAgICAvKiBBY2NlcHRlZCAqLworI2RlZmluZSBLUkI0X0NIQUxMRU5HRSAgICAgICAgICAzCisjZGVmaW5lIEtSQjRfUkVTUE9OU0UgICAgICAgICAgIDQKKyNkZWZpbmUgS1JCNV9SRVNQT05TRSAgICAgICAgICAgMyAgICAgICAvKiBSZXNwb25zZSBmb3IgbXV0dWFsIGF1dGguICovCisjZGVmaW5lIEtSQjVfRk9SV0FSRCAgICAgICAgICAgIDQgICAgICAgLyogRm9yd2FyZGVkIGNyZWRlbnRpYWxzIGZvbGxvdyAqLworI2RlZmluZSBLUkI1X0ZPUldBUkRfQUNDRVBUICAgICA1ICAgICAgIC8qIEZvcndhcmRlZCBjcmVkZW50aWFscyBhY2NlcHRlZCAqLworI2RlZmluZSBLUkI1X0ZPUldBUkRfUkVKRUNUICAgICA2ICAgICAgIC8qIEZvcndhcmRlZCBjcmVkZW50aWFscyByZWplY3RlZCAqLworI2RlZmluZSBLUkI1X1RMU19WRVJJRlkgICAgICAgICA3ICAgICAgIC8qIFRMUyBGaW5pc2hlZCBNc2cgdmVyaWZpZXIgKi8KKworLyogR1NTQVBJLUtSQjUgQXV0aGVudGljYXRpb24gTWVzc2FnZSBJZGVudGlmaWVycyAqLworI2RlZmluZSBHU1NfQVVUSF9EQVRBICAgICAgICAgICAwICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIGRhdGEgZm9sbG93cyAqLworI2RlZmluZSBHU1NfUkVKRUNUICAgICAgICAgICAgICAxICAgICAgIC8qIFJlamVjdGVkIChyZWFzb24gbWlnaHQgZm9sbG93KSAqLworI2RlZmluZSBHU1NfQUNDRVBUICAgICAgICAgICAgICAyICAgICAgIC8qIEFjY2VwdGVkICh1c2VybmFtZSBtaWdodCBmb2xsb3cpICovCisjZGVmaW5lIEdTU19DT05USU5VRSAgICAgICAgICAgIDMKKworLyogU2VjdXJlIFJlbW90ZSBQYXNzd29yZCBBdXRoZW50aWNhdGlvbiBNZXNzYWdlIElkZW50aWZpZXJzICovCisjZGVmaW5lIFNSUF9BVVRIICAgICAgICAgICAgICAgIDAgICAgICAgLyogQXV0aGVudGljYXRpb24gZGF0YSBmb2xsb3dzICovCisjZGVmaW5lIFNSUF9SRUpFQ1QgICAgICAgICAgICAgIDEgICAgICAgLyogUmVqZWN0ZWQgKHJlYXNvbiBtaWdodCBmb2xsb3cpICovCisjZGVmaW5lIFNSUF9BQ0NFUFQgICAgICAgICAgICAgIDIgICAgICAgLyogQWNjZXB0ZWQgKi8KKyNkZWZpbmUgU1JQX0NIQUxMRU5HRSAgICAgICAgICAgMworI2RlZmluZSBTUlBfUkVTUE9OU0UgICAgICAgICAgICA0CisjZGVmaW5lIFNSUF9FWFAgICAgICAgICAgICAgICAgIDggICAgICAgLyogKi8KKyNkZWZpbmUgU1JQX1BBUkFNUyAgICAgICAgICAgICAgOSAgICAgICAvKiAqLworCisvKiBUZWxuZXQgQXV0aCB1c2luZyBLRUEgYW5kIFNLSVBKQUNLICovCisKKyNkZWZpbmUgS0VBX0NFUlRBX1JBICAgICAgICAgICAgICAxCisjZGVmaW5lIEtFQV9DRVJUQl9SQl9JVkJfTk9OQ0VCICAgMgorI2RlZmluZSBLRUFfSVZBX1JFU1BPTlNFQl9OT05DRUEgIDMKKyNkZWZpbmUgS0VBX1JFU1BPTlNFQSAgICAgICAgICAgICA0CisKKy8qIFRpbSBIdWRzb24ncyBTU0wgQXV0aGVudGljYXRpb24gTWVzc2FnZSBJZGVudGlmaWVycyAqLworI2RlZmluZSBTU0xfU1RBUlQgICAgIDEKKyNkZWZpbmUgU1NMX0FDQ0VQVCAgICAyCisjZGVmaW5lIFNTTF9SRUpFQ1QgICAgMworCisvKiBNaWNyb3NvZnQgTlRMTSBBdXRoZW50aWNhdGlvbiBNZXNzYWdlIElkZW50aWZpZXJzICovCisjZGVmaW5lIE5UTE1fQVVUSCAgIDAKKyNkZWZpbmUgTlRMTV9DSEFMTEVOR0UgMQorI2RlZmluZSBOVExNX1JFU1BPTlNFICAyCisjZGVmaW5lIE5UTE1fQUNDRVBUIDMKKyNkZWZpbmUgTlRMTV9SRUpFQ1QgNAorCisvKiBHZW5lcmljIENvbnN0YW50cyAqLworI2RlZmluZSBBVVRIX1NVQ0NFU1MgICAgMAorI2RlZmluZSBBVVRIX0ZBSUxVUkUgICAgMjU1CisKKy8qCisgKiBFTkNSWVBUaW9uIHN1Ym9wdGlvbnMKKyAqLworI2RlZmluZSBFTkNSWVBUX0lTICAgICAgICAgICAgICAwICAgICAgIC8qIEkgcGljayBlbmNyeXB0aW9uIHR5cGUgLi4uICovCisjZGVmaW5lIEVOQ1JZUFRfU1VQUE9SVCAgICAgICAgIDEgICAgICAgLyogSSBzdXBwb3J0IGVuY3J5cHRpb24gdHlwZXMgLi4uICovCisjZGVmaW5lIEVOQ1JZUFRfUkVQTFkgICAgICAgICAgIDIgICAgICAgLyogSW5pdGlhbCBzZXR1cCByZXNwb25zZSAqLworI2RlZmluZSBFTkNSWVBUX1NUQVJUICAgICAgICAgICAzICAgICAgIC8qIEFtIHN0YXJ0aW5nIHRvIHNlbmQgZW5jcnlwdGVkICovCisjZGVmaW5lIEVOQ1JZUFRfRU5EICAgICAgICAgICAgIDQgICAgICAgLyogQW0gZW5kaW5nIGVuY3J5cHRlZCAqLworI2RlZmluZSBFTkNSWVBUX1JFUVNUQVJUICAgICAgICA1ICAgICAgIC8qIFJlcXVlc3QgeW91IHN0YXJ0IGVuY3J5cHRpbmcgKi8KKyNkZWZpbmUgRU5DUllQVF9SRVFFTkQgICAgICAgICAgNiAgICAgICAvKiBSZXF1ZXN0IHlvdSBzZW5kIGVuY3J5cHRpbmcgKi8KKyNkZWZpbmUgRU5DUllQVF9FTkNfS0VZSUQgICAgICAgNworI2RlZmluZSBFTkNSWVBUX0RFQ19LRVlJRCAgICAgICA4CisjZGVmaW5lIEVOQ1JZUFRfQ05UICAgICAgICAgICAgIDkKKworI2RlZmluZSBFTkNUWVBFX0FOWSAgICAgICAgICAgICAwCisjZGVmaW5lIEVOQ1RZUEVfREVTX0NGQjY0ICAgICAgIDEKKyNkZWZpbmUgRU5DVFlQRV9ERVNfT0ZCNjQgICAgICAgMgorI2RlZmluZSBFTkNUWVBFX0RFUzNfQ0ZCNjQgICAgICAzCisjZGVmaW5lIEVOQ1RZUEVfREVTM19PRkI2NCAgICAgIDQKKyNkZWZpbmUgRU5DVFlQRV9DQVNUNV80MF9DRkI2NCAgOAorI2RlZmluZSBFTkNUWVBFX0NBU1Q1XzQwX09GQjY0ICA5CisjZGVmaW5lIEVOQ1RZUEVfQ0FTVDEyOF9DRkI2NCAgIDEwCisjZGVmaW5lIEVOQ1RZUEVfQ0FTVDEyOF9PRkI2NCAgIDExCisjaWZkZWYgRU5DVFlQRV9DTlQKKyN1bmRlZiBFTkNUWVBFX0NOVAorI2VuZGlmCisjZGVmaW5lIEVOQ1RZUEVfQ05UICAgICAgICAgICAgIDEyCisKKyNpZmRlZiAgRU5DUllQVF9OQU1FUworY2hhciAqZW5jcnlwdF9uYW1lc1tdID0geworICAgICAgICAiSVMiLCAiU1VQUE9SVCIsICJSRVBMWSIsICJTVEFSVCIsICJFTkQiLAorICAgICAgICAiUkVRVUVTVC1TVEFSVCIsICJSRVFVRVNULUVORCIsICJFTkMtS0VZSUQiLCAiREVDLUtFWUlEIiwKKyAgICAgICAgMAorfTsKK2NoYXIgKmVuY3R5cGVfbmFtZXNbXSA9IHsKKyAgICAiQU5ZIiwKKyAgICAiREVTX0NGQjY0IiwgICAgICAgICAgICAgICAgLyogUkZDIDI5NTIgKi8KKyAgICAiREVTX09GQjY0IiwgICAgICAgICAgICAgICAgLyogUkZDIDI5NTMgKi8KKyAgICAiREVTM19DRkI2NCIsICAgICAgICAgICAgICAgLyogUkZDIDI5NDcgKi8KKyAgICAiREVTM19PRkI2NCIsICAgICAgICAgICAgICAgLyogUkZDIDI5NDggKi8KKyAgICAiVU5LTk9XTi01IiwKKyAgICAiVU5LTk9XTi02IiwKKyAgICAiVU5LTk9XTi03IiwKKyAgICAiQ0FTVDVfNDBfQ0ZCNjQiLCAgICAgICAgICAgLyogUkZDIDI5NTAgKi8KKyAgICAiQ0FTVDVfNDBfT0ZCNjQiLCAgICAgICAgICAgLyogUkZDIDI5NDkgKi8KKyAgICAiQ0FTVDEyOF9DRkI2NCIsICAgICAgICAgICAgLyogUkZDIDI5NTAqLworICAgICJDQVNUMTI4X09GQjY0IiwgICAgICAgICAgICAvKiBSRkMgMjk0OSAqLworICAgIDAKK307CisjZWxzZQorZXh0ZXJuIGNoYXIgKmVuY3J5cHRfbmFtZXNbXTsKK2V4dGVybiBjaGFyICplbmN0eXBlX25hbWVzW107CisjZW5kaWYKKworI2RlZmluZSBFTkNSWVBUX05BTUVfT0soeCkgICAgICAoKHVuc2lnbmVkIGludCkoeCkgPCBFTkNSWVBUX0NOVCkKKyNkZWZpbmUgRU5DUllQVF9OQU1FKHgpICAgICAgKEVOQ1JZUFRfTkFNRV9PSyh4KT9lbmNyeXB0X25hbWVzW3hdOiJVTktOT1dOIikKKworI2RlZmluZSBFTkNUWVBFX05BTUVfT0soeCkgICAgICAoKHVuc2lnbmVkIGludCkoeCkgPCBFTkNUWVBFX0NOVCkKKyNkZWZpbmUgRU5DVFlQRV9OQU1FKHgpICAgICAgKEVOQ1RZUEVfTkFNRV9PSyh4KT9lbmN0eXBlX25hbWVzW3hdOiJVTktOT1dOIikKKworLyogRm9yIHNldHRpbmcgdGhlIHN0YXRlIG9mIHZhbGlkVXNlciAqLworCisjZGVmaW5lIEFVVEhfUkVKRUNUICAgICAwICAgICAgIC8qIFJlamVjdGVkICovCisjZGVmaW5lIEFVVEhfVU5LTk9XTiAgICAxICAgICAgIC8qIFdlIGRvbid0IGtub3cgd2hvIGhlIGlzLCBidXQgaGUncyBva2F5ICovCisjZGVmaW5lIEFVVEhfT1RIRVIgICAgICAyICAgICAgIC8qIFdlIGtub3cgaGltLCBidXQgbm90IGhpcyBuYW1lICovCisjZGVmaW5lIEFVVEhfVVNFUiAgICAgICAzICAgICAgIC8qIFdlIGtub3cgaGUgbmFtZSAqLworI2RlZmluZSBBVVRIX1ZBTElEICAgICAgNCAgICAgICAvKiBXZSBrbm93IGhpbSwgYW5kIGhlIG5lZWRzIG5vIHBhc3N3b3JkICovCisKKy8qIEtlcm1pdCBPcHRpb24gU3VibmVnb3RpYXRpb25zICovCisKKyNkZWZpbmUgS0VSTUlUX1NUQVJUICAgICAgMAorI2RlZmluZSBLRVJNSVRfU1RPUCAgICAgICAxCisjZGVmaW5lIEtFUk1JVF9SRVFfU1RBUlQgIDIKKyNkZWZpbmUgS0VSTUlUX1JFUV9TVE9QICAgMworI2RlZmluZSBLRVJNSVRfU09QICAgICAgICA0CisjZGVmaW5lIEtFUk1JVF9SRVNQX1NUQVJUIDgKKyNkZWZpbmUgS0VSTUlUX1JFU1BfU1RPUCAgOQorCisvKiBGb3IgU0VUIFRFTE5FVCBBVVRIIEhPVyAgKi8KKyNkZWZpbmUgVE5fQVVUSF9IT1dfQU5ZICAgICAwCisjZGVmaW5lIFROX0FVVEhfSE9XX09ORV9XQVkgMQorI2RlZmluZSBUTl9BVVRIX0hPV19NVVRVQUwgIDIKKworLyogRm9yIFNFVCBURUxORVQgQVVUSCBFTkNSWVBUICovCisjZGVmaW5lIFROX0FVVEhfRU5DX0FOWSAgICAgMAorI2RlZmluZSBUTl9BVVRIX0VOQ19OT05FICAgIDEKKyNkZWZpbmUgVE5fQVVUSF9FTkNfVEVMT1BUICAyCisjZGVmaW5lIFROX0FVVEhfRU5DX0VYQ0ggICAgMyAgLyogbm90IHVzZWQgaW4gS2VybWl0ICovCisjZGVmaW5lIFROX0FVVEhfRU5DX1RMUyAgICAgNAorCisvKiBUZWxuZXQgcHJvdG9jb2wgZnVuY3Rpb25zIGRlZmluZWQgaW4gQy1LZXJtaXQgKi8KKworX1BST1RPVFlQKCBpbnQgdG5faW5pLCAodm9pZCkgKTsgICAgICAgIC8qIFRlbG5ldCBwcm90b2NvbCBzdXBwb3J0ICovCitfUFJPVE9UWVAoIGludCB0bl9yZXNldCwgKHZvaWQpKTsKK19QUk9UT1RZUCggaW50IHRuX3NldF9tb2RlcywgKHZvaWQpKTsKK19QUk9UT1RZUCggaW50IHRuX3NvcHQsIChpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IHRuX2Rvb3AsIChDSEFSLCBpbnQsIGludCAoKikoaW50KSApICk7CitfUFJPVE9UWVAoIGludCB0bl9zdHR5cCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCB0bl9zbmVudiwgKENIQVIgKiwgaW50KSApIDsKK19QUk9UT1RZUCggaW50IHRuX3JuZW52LCAoQ0hBUiAqLCBpbnQpICkgOworX1BST1RPVFlQKCBpbnQgdG5fd2FpdCwgKGNoYXIgKikgKSA7CitfUFJPVE9UWVAoIGludCB0bl9wdXNoLCAodm9pZCkgKSA7CitfUFJPVE9UWVAoIGludCB0bnNuZGJyaywgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgdG5fZGVidWcsIChjaGFyICopKTsKK19QUk9UT1RZUCggaW50IHRuX2hleCwgKENIQVIgKiwgaW50LCBDSEFSICosIGludCkpOworX1BST1RPVFlQKCB1bnNpZ25lZCBjaGFyICogdG5fZ2V0X2Rpc3BsYXksICh2b2lkKSk7CisjaWZkZWYgSUtTX09QVElPTgorX1BST1RPVFlQKCBpbnQgdG5fc2lrcywgKGludCkgKTsKK19QUk9UT1RZUCggaW50IGlrc193YWl0LCAoaW50LCBpbnQpICk7CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworI2lmZGVmIENLX05BV1MKK19QUk9UT1RZUCggaW50IHRuX3NuYXdzLCAodm9pZCkgKTsKKyNlbmRpZiAvKiBDS19OQVdTICovCisjaWZkZWYgQ0tfWERJU1BMT0MKK19QUk9UT1RZUCggaW50IHRuX3N4ZGlzcGxvYywgKHZvaWQpICk7CisjZW5kaWYgLyogQ0tfWERJU1BMT0MgKi8KKyNpZmRlZiBDS19TTkRMT0MKK19QUk9UT1RZUCggaW50IHRuX3NuZGxvYywgKHZvaWQpICk7CisjZW5kaWYgLyogQ0tfU05ETE9DICovCisjaWZkZWYgQ0tfRk9SV0FSRF9YCisvKiBGcm9tIFhhdXRoLmggKi8KK3R5cGVkZWYgc3RydWN0IHhhdXRoIHsKKyAgICB1bnNpZ25lZCBzaG9ydCAgIGZhbWlseTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgIGFkZHJlc3NfbGVuZ3RoOworICAgIGNoYXIgICAgICAgICAgICAqYWRkcmVzczsKKyAgICB1bnNpZ25lZCBzaG9ydCAgIG51bWJlcl9sZW5ndGg7CisgICAgY2hhciAgICAgICAgICAgICpudW1iZXI7CisgICAgdW5zaWduZWQgc2hvcnQgICBuYW1lX2xlbmd0aDsKKyAgICBjaGFyICAgICAgICAgICAgKm5hbWU7CisgICAgdW5zaWduZWQgc2hvcnQgICBkYXRhX2xlbmd0aDsKKyAgICBjaGFyICAgICAgICAgICAgKmRhdGE7Cit9IFhhdXRoOworCisjaW5jbHVkZSAgIDxzdGRpby5oPgorCisvKiBmcm9tIFguaCAqLworI2RlZmluZSBGYW1pbHlJbnRlcm5ldCAgICAgICAgICAwCisjZGVmaW5lIEZhbWlseURFQ25ldCAgICAgICAgICAgIDEKKyNkZWZpbmUgRmFtaWx5Q2hhb3MgICAgICAgICAgICAgMgorCisjIGRlZmluZSBGYW1pbHlMb2NhbCAoMjU2KSAgICAgIC8qIG5vdCBwYXJ0IG9mIFggc3RhbmRhcmQgKGkuZS4gWC5oKSAqLworIyBkZWZpbmUgRmFtaWx5V2lsZCAgKDY1NTM1KQorIyBkZWZpbmUgRmFtaWx5TmV0bmFtZSAgICAoMjU0KSAgIC8qIG5vdCBwYXJ0IG9mIFggc3RhbmRhcmQgKi8KKyMgZGVmaW5lIEZhbWlseUtyYjVQcmluY2lwYWwgKDI1MykgLyogS2VyYmVyb3MgNSBwcmluY2lwYWwgbmFtZSAqLworIyBkZWZpbmUgRmFtaWx5TG9jYWxIb3N0ICgyNTIpICAvKiBmb3IgbG9jYWwgbm9uLW5ldCBhdXRoZW50aWNhdGlvbiAqLworY2hhciAqWGF1RmlsZU5hbWUoKTsKKworWGF1dGggKlhhdVJlYWRBdXRoKAorRklMRSogICAvKiBhdXRoX2ZpbGUgKi8KKyk7CisKK2ludCBYYXVXcml0ZUF1dGgoCitGSUxFKiAgICAgICAgICAgLyogYXV0aF9maWxlICovLAorWGF1dGgqICAgICAgICAgIC8qIGF1dGggKi8KKyk7CisKK1hhdXRoICpYYXVHZXRBdXRoQnlOYW1lKAorY29uc3QgY2hhciogICAgIC8qIGRpc3BsYXlfbmFtZSAqLworKTsKKworWGF1dGggKlhhdUdldEF1dGhCeUFkZHIoCit1bnNpZ25lZCBpbnQgICAgLyogZmFtaWx5ICovLAordW5zaWduZWQgaW50ICAgIC8qIGFkZHJlc3NfbGVuZ3RoICovLAorY29uc3QgY2hhciogICAgIC8qIGFkZHJlc3MgKi8sCit1bnNpZ25lZCBpbnQgICAgLyogbnVtYmVyX2xlbmd0aCAqLywKK2NvbnN0IGNoYXIqICAgICAvKiBudW1iZXIgKi8sCit1bnNpZ25lZCBpbnQgICAgLyogbmFtZV9sZW5ndGggKi8sCitjb25zdCBjaGFyKiAgICAgLyogbmFtZSAqLworKTsKKwordm9pZCBYYXVEaXNwb3NlQXV0aCgKK1hhdXRoKiAgICAgICAgICAvKiBhdXRoICovCispOworCisKK19QUk9UT1RZUCggaW50IGZ3ZHhfY3JlYXRlX2xpc3Rlbl9zb2NrZXQsKGludCkpOworX1BST1RPVFlQKCBpbnQgZndkeF9vcGVuX2NsaWVudF9jaGFubmVsLChpbnQpKTsKK19QUk9UT1RZUCggaW50IGZ3ZHhfb3Blbl9zZXJ2ZXJfY2hhbm5lbCwoVk9JRCkpOworX1BST1RPVFlQKCBpbnQgZndkeF9jbG9zZV9jaGFubmVsLChpbnQpKTsKK19QUk9UT1RZUCggaW50IGZ3ZHhfd3JpdGVfZGF0YV90b19jaGFubmVsLChpbnQsIGNoYXIgKixpbnQpKTsKK19QUk9UT1RZUCggaW50IGZ3ZHhfc2VuZF9kYXRhX2Zyb21fY2hhbm5lbCwoaW50LCBjaGFyICosaW50KSk7CitfUFJPVE9UWVAoIGludCBmd2R4X2Nsb3NlX2FsbCwoVk9JRCkpOworX1BST1RPVFlQKCBpbnQgZndkeF90bl9zYiwodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK19QUk9UT1RZUCggaW50IHRuX3NuZGZ3ZHgsICh2b2lkKSk7CitfUFJPVE9UWVAoIGludCBmd2R4X3NlbmRfY2xvc2UsKGludCkpOworX1BST1RPVFlQKCBpbnQgZndkeF9zZW5kX29wZW4sKGludCkpOworX1BST1RPVFlQKCBpbnQgZndkeF9jbGllbnRfcmVwbHlfb3B0aW9ucywoY2hhciAqLCBpbnQpKTsKK19QUk9UT1RZUCggaW50IGZ3ZHhfc2VuZF9vcHRpb25zLChWT0lEKSk7CitfUFJPVE9UWVAoIFZPSUQgZndkeF9jaGVja19zb2NrZXRzLChmZF9zZXQgKikpOworX1BST1RPVFlQKCBpbnQgZndkeF9pbml0X2ZkX3NldCwoZmRfc2V0ICopKTsKK19QUk9UT1RZUCggaW50IGZ3ZHhfYXV0aG9yaXplX2NoYW5uZWwsIChpbnQsIHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CitfUFJPVE9UWVAoIGludCBmd2R4X2NyZWF0ZV9mYWtlX3hhdXRoLCAoY2hhciAqLCBpbnQsIGludCkpOworX1BST1RPVFlQKCBpbnQgZndkeF9zZW5kX3hhdXRoLCAoVk9JRCkpOworX1BST1RPVFlQKCBpbnQgZndkeF9zZXJ2ZXJfYXZhaWwsIChWT0lEKSk7CisjaWZkZWYgTlQKK19QUk9UT1RZUCggVk9JRCBmd2R4X3RocmVhZCwoVk9JRCAqKSk7CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBDS19GT1JXQVJEX1ggKi8KKworI2lmZGVmIFROX0NPTVBPUlQKKyNkZWZpbmUgVE5DX0MyU19TSUdOQVRVUkUgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVE5DX0MyU19TRVRfQkFVRFJBVEUgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVE5DX0MyU19TRVRfREFUQVNJWkUgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVE5DX0MyU19TRVRfUEFSSVRZICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVE5DX0MyU19TRVRfU1RPUFNJWkUgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVE5DX0MyU19TRVRfQ09OVFJPTCAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgVE5DX0MyU19OT1RJRllfTElORVNUQVRFICAgICAgICAgIDYKKyNkZWZpbmUgVE5DX0MyU19OT1RJRllfTU9ERU1TVEFURSAgICAgICAgIDcKKyNkZWZpbmUgVE5DX0MyU19GTE9XX1NVU1BFTkQgICAgICAgICAgICAgIDgKKyNkZWZpbmUgVE5DX0MyU19GTE9XX1JFU1VNRSAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgVE5DX0MyU19TRVRfTFNfTUFTSyAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgVE5DX0MyU19TRVRfTVNfTUFTSyAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgVE5DX0MyU19QVVJHRSAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgVE5DX1MyQ19TSUdOQVRVUkUgICAgICAgICAgICAgICAxMDAKKyNkZWZpbmUgVE5DX1MyQ19TRVRfQkFVRFJBVEUgICAgICAgICAgICAxMDEKKyNkZWZpbmUgVE5DX1MyQ19TRVRfREFUQVNJWkUgICAgICAgICAgICAxMDIKKyNkZWZpbmUgVE5DX1MyQ19TRVRfUEFSSVRZICAgICAgICAgICAgICAxMDMKKyNkZWZpbmUgVE5DX1MyQ19TRVRfU1RPUFNJWkUgICAgICAgICAgICAxMDQKKyNkZWZpbmUgVE5DX1MyQ19TRVRfQ09OVFJPTCAgICAgICAgICAgICAxMDUKKyNkZWZpbmUgVE5DX1MyQ19TRU5EX0xTICAgICAgICAgICAgICAgICAxMDYKKyNkZWZpbmUgVE5DX1MyQ19TRU5EX01TICAgICAgICAgICAgICAgICAxMDcKKyNkZWZpbmUgVE5DX1MyQ19GTE9XX1NVU1BFTkQgICAgICAgICAgICAxMDgKKyNkZWZpbmUgVE5DX1MyQ19GTE9XX1JFU1VNRSAgICAgICAgICAgICAxMDkKKyNkZWZpbmUgVE5DX1MyQ19TRVRfTFNfTUFTSyAgICAgICAgICAgICAxMTAKKyNkZWZpbmUgVE5DX1MyQ19TRVRfTVNfTUFTSyAgICAgICAgICAgICAxMTEKKyNkZWZpbmUgVE5DX1MyQ19QVVJHRSAgICAgICAgICAgICAgICAgICAxMTIKKworLyogVGhlIENPTVBPUlQgdmFsdWVzIGFyZSBub3QgZGVmaW5lZCBpbiBSRkMgMjIxNyAqLworI2RlZmluZSBUTkNfQlBTX1JFUVVFU1QgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFROQ19CUFNfMzAwICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVE5DX0JQU182MDAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUTkNfQlBTXzEyMDAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFROQ19CUFNfMjQwMCAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgVE5DX0JQU180ODAwICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBUTkNfQlBTXzk2MDAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFROQ19CUFNfMTQ0MDAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgVE5DX0JQU18xOTIwMCAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBUTkNfQlBTXzI4ODAwICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFROQ19CUFNfMzg0MDAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgVE5DX0JQU181NzYwMCAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBUTkNfQlBTXzExNTIwMCAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFROQ19CUFNfMjMwNDAwICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgVE5DX0JQU180NjA4MDAgICAgICAgICAgICAgICAgICAxNgorCisjZGVmaW5lIFROQ19EU19SRVFVRVNUICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVE5DX0RTXzUgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBUTkNfRFNfNiAgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFROQ19EU183ICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgVE5DX0RTXzggICAgICAgICAgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIFROQ19QQVJfUkVRVUVTVCAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVE5DX1BBUl9OT05FICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUTkNfUEFSX09ERCAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFROQ19QQVJfRVZFTiAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVE5DX1BBUl9NQVJLICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUTkNfUEFSX1NQQUNFICAgICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgVE5DX1NCX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUTkNfU0JfMSAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFROQ19TQl8xXzUgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVE5DX1NCXzIgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIFROQ19DVExfT0ZMT1dfUkVRVUVTVCAgICAgICAgICAgIDAKKyNkZWZpbmUgVE5DX0NUTF9PRkxPV19OT05FICAgICAgICAgICAgICAgMQorI2RlZmluZSBUTkNfQ1RMX09GTE9XX1hPTl9YT0ZGICAgICAgICAgICAyCisjZGVmaW5lIFROQ19DVExfT0ZMT1dfUlRTX0NUUyAgICAgICAgICAgIDMKKyNkZWZpbmUgVE5DX0NUTF9PRkxPV19EQ0QgICAgICAgICAgICAgICAxNworI2RlZmluZSBUTkNfQ1RMX09GTE9XX0RTUiAgICAgICAgICAgICAgIDE5CisKKyNkZWZpbmUgVE5DX0NUTF9CUkVBS19SRVFVRVNUICAgICAgICAgICAgNAorI2RlZmluZSBUTkNfQ1RMX0JSRUFLX09OICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFROQ19DVExfQlJFQUtfT0ZGICAgICAgICAgICAgICAgIDYKKworI2RlZmluZSBUTkNfQ1RMX0RUUl9SRVFVRVNUICAgICAgICAgICAgICA3CisjZGVmaW5lIFROQ19DVExfRFRSX09OICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgVE5DX0NUTF9EVFJfT0ZGICAgICAgICAgICAgICAgICAgOQorCisjZGVmaW5lIFROQ19DVExfUlRTX1JFUVVFU1QgICAgICAgICAgICAgMTAKKyNkZWZpbmUgVE5DX0NUTF9SVFNfT04gICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBUTkNfQ1RMX1JUU19PRkYgICAgICAgICAgICAgICAgIDEyCisKKyNkZWZpbmUgVE5DX0NUTF9JRkxPV19SRVFVRVNUICAgICAgICAgICAxMworI2RlZmluZSBUTkNfQ1RMX0lGTE9XX05PTkUgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFROQ19DVExfSUZMT1dfWE9OX1hPRkYgICAgICAgICAgMTUKKyNkZWZpbmUgVE5DX0NUTF9JRkxPV19SVFNfQ1RTICAgICAgICAgICAxNgorI2RlZmluZSBUTkNfQ1RMX0lGTE9XX0RUUiAgICAgICAgICAgICAgIDE4CisKKyNkZWZpbmUgVE5DX01TX0RBVEFfUkVBRFkgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUTkNfTVNfT1ZFUlJVTl9FUlJPUiAgICAgICAgICAgICAyCisjZGVmaW5lIFROQ19NU19QQVJJVFlfRVJST1IgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVE5DX01TX0ZSQU1FX0VSUk9SICAgICAgICAgICAgICAgOAorI2RlZmluZSBUTkNfTVNfQlJFQUtfRVJST1IgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFROQ19NU19IUl9FTVBUWSAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgVE5DX01TX1NSX0VNUFRZICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBUTkNfTVNfVElNRU9VVF9FUlJPUiAgICAgICAgICAgMTI4CisKKyNkZWZpbmUgVE5DX01TX0NUU19ERUxUQSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUTkNfTVNfRFNSX0RFTFRBICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFROQ19NU19FREdFX1JJTkcgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVE5DX01TX1JMU0RfREVMVEEgICAgICAgICAgICAgICAgOAorI2RlZmluZSBUTkNfTVNfQ1RTX1NJRyAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFROQ19NU19EU1JfU0lHICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgVE5DX01TX1JJX1NJRyAgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBUTkNfTVNfUkxTRF9TSUcgICAgICAgICAgICAgICAgMTI4CisKKyNkZWZpbmUgVE5DX1BVUkdFX1JFQ0VJVkUgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUTkNfUFVSR0VfVFJBTlNNSVQgICAgICAgICAgICAgICAyCisjZGVmaW5lIFROQ19QVVJHRV9CT1RIICAgICAgICAgICAgICAgICAgIDMKKworI2lmZGVmICBUTkNfTkFNRVMKK2NoYXIgKnRuY19uYW1lc1tdID0geworICAgICJTSUdOQVRVUkUiLCAiU0VULUJBVURSQVRFIiwgIlNFVC1EQVRBUkFURSIsICJTRVQtUEFSSVRZIiwgIlNFVC1TVE9QU0laRSIsCisgICAgIlNFVC1DT05UUk9MIiwgIk5PVElGWS1MSU5FU1RBVEUiLCAiTk9USUZZLU1PREVNU1RBVEUiLAorICAgICJGTE9XQ09OVFJPTC1TVVNQRU5EIiwgIkZMT1dDT05UUk9MLVJFU1VNRSIsICJTRVQtTElORVNUQVRFLU1BU0siLAorICAgICJTRVQtTU9ERU1TVEFURS1NQVNLIiwgIlBVUkdFLURBVEEiLAorICAgIDAKK307CisjZWxzZQorZXh0ZXJuIGNoYXIgKnRuY19uYW1lc1tdOworI2VuZGlmCisKKyNkZWZpbmUgVE5DX05BTUVfT0soeCkgICgoeCkgPj0gMCAmJiAoeCkgPD0gMTIgfHwgKHgpID49IDEwMCAmJiAoeCkgPD0gMTEyKQorI2RlZmluZSBUTkNfTkFNRSh4KSBcCisgICAgICAgICAgICAgKFROQ19OQU1FX09LKHgpP3RuY19uYW1lc1soeCk+PTEwMD8oeCktMTAwOih4KV06IlVOS05PV04iKQorCitfUFJPVE9UWVAoaW50IHRuY19pbml0LCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IHRuY193YWl0LChDSEFSICosIGludCkpOworX1BST1RPVFlQKGludCB0bmNfdG5fc2IsKENIQVIgKixpbnQpKTsKK19QUk9UT1RZUChDT05TVCBjaGFyICogdG5jX2dldF9zaWduYXR1cmUsICh2b2lkKSk7CitfUFJPVE9UWVAoaW50IHRuY19zZW5kX3NpZ25hdHVyZSwgKGNoYXIgKikpOworX1BST1RPVFlQKGludCB0bmNfc2V0X2JhdWQsKGxvbmcpKTsKK19QUk9UT1RZUChpbnQgdG5jX2dldF9iYXVkLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IHRuY19zZXRfZGF0YXNpemUsKGludCkpOworX1BST1RPVFlQKGludCB0bmNfZ2V0X2RhdGFzaXplLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IHRuY19zZXRfcGFyaXR5LChpbnQpKTsKK19QUk9UT1RZUChpbnQgdG5jX2dldF9wYXJpdHksKHZvaWQpKTsKK19QUk9UT1RZUChpbnQgdG5jX3NldF9zdG9wc2l6ZSwoaW50KSk7CitfUFJPVE9UWVAoaW50IHRuY19nZXRfc3RvcHNpemUsKHZvaWQpKTsKK19QUk9UT1RZUChpbnQgdG5jX3NldF9vZmxvdywoaW50KSk7CitfUFJPVE9UWVAoaW50IHRuY19nZXRfb2Zsb3csKHZvaWQpKTsKK19QUk9UT1RZUChpbnQgdG5jX3NldF9pZmxvdywoaW50KSk7CitfUFJPVE9UWVAoaW50IHRuY19nZXRfaWZsb3csKHZvaWQpKTsKK19QUk9UT1RZUChpbnQgdG5jX3NldF9icmVha19zdGF0ZSwoaW50KSk7CitfUFJPVE9UWVAoaW50IHRuY19nZXRfYnJlYWtfc3RhdGUsKHZvaWQpKTsKK19QUk9UT1RZUChpbnQgdG5jX3NldF9kdHJfc3RhdGUsKGludCkpOworX1BST1RPVFlQKGludCB0bmNfZ2V0X2R0cl9zdGF0ZSwodm9pZCkpOworX1BST1RPVFlQKGludCB0bmNfc2V0X3J0c19zdGF0ZSwoaW50KSk7CitfUFJPVE9UWVAoaW50IHRuY19nZXRfcnRzX3N0YXRlLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IHRuY19zZXRfbHNfbWFzaywoaW50KSk7CitfUFJPVE9UWVAoaW50IHRuY19nZXRfbHNfbWFzaywodm9pZCkpOworX1BST1RPVFlQKGludCB0bmNfZ2V0X2xzLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IHRuY19zZXRfbXNfbWFzaywoaW50KSk7CitfUFJPVE9UWVAoaW50IHRuY19nZXRfbXNfbWFzaywodm9pZCkpOworX1BST1RPVFlQKGludCB0bmNfZ2V0X21zLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IHRuY19zZW5kX3B1cmdlX2RhdGEsKGludCkpOworX1BST1RPVFlQKGludCB0bmNfZmxvd19zdXNwZW5kZWQsKHZvaWQpKTsKK19QUk9UT1RZUChpbnQgdG5jX3N1c3BlbmRfZmxvdywodm9pZCkpOworX1BST1RPVFlQKGludCB0bmNfcmVzdW1lX2Zsb3csKHZvaWQpKTsKKworLyogVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB0byBiZSBjYWxsZWQgYnkgY2s/dGlvLmMgcm91dGluZXMgKi8KK19QUk9UT1RZUChpbnQgdG5zZXRmbG93LChpbnQpKTsKK19QUk9UT1RZUChpbnQgdG5zZXR0aW5ncywoaW50LGludCkpOworX1BST1RPVFlQKGludCB0bmdtZG0sKHZvaWQpKTsKK19QUk9UT1RZUChpbnQgdG5zbmRiLChsb25nKSk7CitfUFJPVE9UWVAoaW50IGlzdG5jb21wb3J0LCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IHRuX3NuZGNvbXBvcnQsKHZvaWQpKTsKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisKKyNpZm5kZWYgQ0tDVEVMX0MgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGVzZSBhcmUgZGVjbGFyZWQgaW4gY2tjdGVsLmMgKi8KK2V4dGVybiBpbnQgdG5faW5pdDsgICAgICAgICAgICAgICAgICAgICAvKiBUZWxuZXQgcHJvdG9jb2wgaW5pdGlhbGl6ZWQgZmxhZyAqLworZXh0ZXJuIGNoYXIgKnRuX3Rlcm07ICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmFsIHR5cGUgb3ZlcnJpZGUgKi8KK2V4dGVybiBpbnQgc3N0ZWxuZXQ7ICAgICAgICAgICAgICAgICAgICAvKiBTZXJ2ZXIgc2lkZSB0ZWxuZXQ/ICovCitleHRlcm4gaW50IHRuX2RlYjsgICAgICAgICAgICAgICAgICAgICAgLyogVGVsbmV0IG9wdGlvbiBkZWJ1Z2dpbmcgZmxhZyAqLworZXh0ZXJuIGludCB0bl9hdXRoX2tyYjVfZGVzX2J1ZzsgICAgICAgIC8qIFRlbG5ldCBCVUcgKi8KKyNlbmRpZiAvKiBDS0NURUxfQyAqLworCisjZGVmaW5lIFROX01TR19MRU4gMTIyOTIKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyNlbmRpZiAvKiBDS0NURUxfSCAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrY3VuaS5jIGIvY2tlcm1pdC04LjAuMjExL2NrY3VuaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Nzk1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2tjdW5pLmMKQEAgLTAsMCArMSwxNjE3MyBAQAorY2hhciAqIGNrY3VuaSA9ICJVbmljb2RlIHN1cHBvcnQgOC4wLjExNSwgOSBPY3QgMjAwMiI7CisKKyNpZmRlZiBPUzIKKyNkZWZpbmUgS0VSTUlURk9OVAorI2VuZGlmIC8qIE9TMiAqLworCisvKiAgQyBLIEMgVSBOIEkgLiBDICAtLSAgVW5pY29kZS9UZXJtaW5hbCBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9ucyAgKi8KKworLyoKKyAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKworICBBdXRob3JzOgorICAgIEZyYW5rIGRhIENydXogPGZkY0Bjb2x1bWJpYS5lZHU+CisgICAgICBUaGUgS2VybWl0IFByb2plY3QsIENvbHVtYmlhIFVuaXZlcnNpdHksIE5ldyBZb3JrIENpdHkuCisgICAgSmVmZnJleSBFIEFsdG1hbiA8amFsdG1hbkBzZWN1cmUtZW5kcG9pbnRzLmNvbT4KKyAgICAgIFNlY3VyZSBFbmRwb2ludHMgSW5jLiwgTmV3IFlvcmsgQ2l0eQorCisgIEZ1bmN0aW9ucyB1X2JsYWgoKSB0cmFuc2xhdGUgZnJvbSBibGFoIHRvIFVuaWNvZGUgKGluY29taW5nIG1hdGVyaWFsKS4KKyAgRnVuY3Rpb25zIHR4X2JsYWgoKSB0cmFuc2xhdGUgZnJvbSBVbmljb2RlIHRvIGJsYWggKGtleXN0cm9rZXMpLgorICBGdW5jdGlvbiBwb2ludGVycyBhcmUga2VwdCBpbiBwYXJhbGxlbCBhcnJheXMgaW5kZXhlZCBieSBUWF9ibGFoIHZhbHVlcworICBkZWZpbmVkIGluIGNrY3VuaS5oLiAgIE5PVEU6IHR4X2RlY3NwZWMgYW5kIHR4X2RlY3RlY2ggYXJlIHVuZGVmaW5lZCBzaW5jZQorICB0aGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgbmV2ZXIgdHlwZWQsIG9ubHkgZGlzcGxheWVkLgorCisgIFRoZSBibGFoX3UoKSByb3V0aW5lcyBhY2NlcHQgYW4gdW5zaWduZWQgY2hhcmFjdGVyIHZhbHVlIGluIGNoYXJhY3Rlci1zZXQKKyAgYmxhaCwgYW5kIHJldHVybiB0aGUgVW5pY29kZSB0cmFuc2xhdGlvbiwgb3IgMHhmZmZkIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbm90CisgIGRlZmluZWQgaW4gVW5pY29kZS4gIFRoZSA4dGggYml0IG9mIHRoZSBhcmd1bWVudCBzaG91bGQgYmUgaWdub3JlZCwgYWBsYSBJU08KKyAgNDg3MyBhbmQgMjAyMi4KKworICBUaGUgdHhfYmxhaCgpIHJvdXRpbmVzIGFjY2VwdCBhIHVuaWNvZGUgdmFsdWUgYW5kIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCisgIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyIGluIGNoYXJhY3Rlci1zZXQgYmxhaCwgb3IgZWxzZSAtMSBpZiB0aGUgY2hhcmFjdGVyCisgIGRvZXMgbm90IGV4aXN0IGluIGJsYWguICBJbiB0aGlzIGNhc2UsIHRoZSBmdWxsIDgtYml0IHZhbHVlIGlzIHJldHVybmVkLAorICBzaW5jZSBJU08gMjAyMiBvbmx5IHdvcmtzIGluIHRoZSBob3N0LXRvLXRlcm1pbmFsIGRpcmVjdGlvbi4KKworICBOT1RFOiBLRVJNSVRGT05UIHNob3VsZCBiZSBkZWZpbmVkIG9ubHkgaWYgd2UgYXJlIHVzaW5nIHRoZSBuZXcgKHN0aWxsCisgIGh5cG90aGV0aWNhbCkgS2VybWl0IGZvbnQgdGhhdCBoYXMgYWxsIHRoZSBWVC9IZWF0aC9XeXNlL1RWSSBncmFwaGljCisgIGNoYXJhY3RlcnMgaW4gaXQuICBJTVBPUlRBTlQ6IGFsbCBLZXJtaXRmb250IGNvZGUgcG9pbnRzIG5lZWQgdXBkYXRpbmcgdG8KKyAgdGhlIHZhbHVlcyBpbiB0aGUgZmluYWwgcHJvcG9zYWwgdG8gdGhlIFVUQy4KKworICBMQVRFUiBOT1RFOiBUaGUgbmVlZGVkIGNoYXJhY3RlcnMgd2VyZSBhcHByb3ZlZCBmb3IgVW5pY29kZSAzLjEsIGFuZAorICB0aGVyZWZvcmUgbm90aGluZyBzcGVjaWFsIHNob3VsZCBiZSByZXF1aXJlZCB0byB1c2UgdGhlbSwgZXhjZXB0IHRoYXQgaXQKKyAgd2lsbCB0YWtlIHNvbWUgdGltZSBmb3IgdGhlbSB0byBzaG93IHVwIGluIGNvbW1lcmNpYWwgZm9udHMuCisKKyAgVE8gRE86IEEgbG90IG9mIHRoZSBmdW5jdGlvbnMgY2FuIGJlIHRpZ2h0ZW5lZCB1cCAtLSB1c2UgcmFuZ2VzIHdoZW4KKyAgcG9zc2libGUsIHNvcnQgc3dpdGNoIHN0YXRlbWVudHMgaW4gb3JkZXIgb2YgZnJlcXVlbmN5LCBldGMuCisqLworI2luY2x1ZGUgImNrY3N5bS5oIiAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVzLi4uICovCisjaW5jbHVkZSAiY2tjZGViLmgiCisjaW5jbHVkZSAiY2tja2VyLmgiCisjaW5jbHVkZSAiY2t1Y21kLmgiCisjaW5jbHVkZSAiY2tjeGxhLmgiCisjaW5jbHVkZSAiY2t1eGxhLmgiCisKKyNpZmRlZiBVTklDT0RFCisKKyNpZmRlZiBPUzIKKy8qCisgIFRoaXMgbWF0ZXJpYWwgaXMgbmVlZGVkIGZvciB0aGUgaW50ZWdyYXRpb24gb2YgVGV4dFBTIGludG8gS2VybWl0IDk1LgorICBXaGVuIHByaW50aW5nIGEgZmlsZSB3ZSB1c2UgdGhlIFNFVCBGSUxFIENIQVJBQ1RFUi1TRVQgdmFsdWUgYXMgdGhlIGlucHV0CisgIGNoYXJhY3Rlci1zZXQgYW5kIHRoZW4gY29udmVydCBpdCB0byB0aGUgc3BlY2lhbCBMYXRpbjEgc2V0IGNhbGxlZAorICBDb3VyaWVyTGF0aW4xIHVzaW5nIHRoZSBVbmljb2RlIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucy4KKyovCitzdHJ1Y3QgX3BhaXIgeyBpbnQgdHg7IGludCBmYzsgfSBUWEZDW10gPSB7CisgICAgVFhfQVNDSUksICAgICAgIEZDX1VTQVNDSUksCisgICAgVFhfQlJJVElTSCwgICAgIEZDX1VLQVNDSUksCisgICAgVFhfQ05fRlJFTkNILCAgIEZDX0ZDQVNDSUksCisgICAgVFhfQ1A0MzcsICAgICAgIEZDX0NQNDM3LAorICAgIFRYX0NQODUwLCAgICAgICBGQ19DUDg1MCwKKyAgICBUWF9DUDg1MiwgICAgICAgRkNfQ1A4NTIsCisgICAgVFhfQ1A4NTcsICAgICAgIC0yLAorICAgIFRYX0NQODYyLCAgICAgICBGQ19DUDg2MiwKKyAgICBUWF9DUDg2NCwgICAgICAgLTIsCisgICAgVFhfQ1A4NjYsICAgICAgIEZDX0NQODY2LAorICAgIFRYX0NQODY5LCAgICAgICAtMiwKKyAgICBUWF9DVUJBTiwgICAgICAgLTIsCisgICAgVFhfQ1pFQ0gsICAgICAgIC0yLAorICAgIFRYX0RBTklTSCwgICAgICAtMiwKKyAgICBUWF9ERUNNQ1MsICAgICAgRkNfREVDTUNTLAorICAgIFRYX0RFQ1NQRUMsICAgICAtMiwgICAgICAgICAgICAgLyogd2hpbGUgZGVmaW5lZCwgbm90IGluIGZjcyB0YWJsZXMgKi8KKyAgICBUWF9ERUNURUNILCAgICAgLTIsICAgICAgICAgICAgIC8qIHdoaWxlIGRlZmluZWQsIG5vdCBpbiBmY3MgdGFibGVzICovCisgICAgVFhfREdJLCAgICAgICAgIEZDX0RHTUNTLAorICAgIFRYX0RVVENILCAgICAgICBGQ19EVUFTQ0lJLAorICAgIFRYX0ZJTk5JU0gsICAgICBGQ19GSUFTQ0lJLAorICAgIFRYX0ZSRU5DSCwgICAgICBGQ19GUkFTQ0lJLAorICAgIFRYX0dFUk1BTiwgICAgICBGQ19HRUFTQ0lJLAorICAgIFRYX0hFNywgICAgICAgICBGQ19IRTcsCisgICAgVFhfSFBSOCwgICAgICAgIEZDX0hQUjgsCisgICAgVFhfSFVOR0FSSUFOLCAgIEZDX0hVQVNDSUksCisgICAgVFhfSVRBTElBTiwgICAgIEZDX0lUQVNDSUksCisgICAgVFhfSjIwMVIsICAgICAgIC0yLAorICAgIFRYX0oyMDFLLCAgICAgICAtMiwKKyAgICBUWF9LT0k3LCAgICAgICAgRkNfS09JNywKKyAgICBUWF9LT0k4LCAgICAgICAgRkNfS09JOCwKKyAgICBUWF9LT0k4UiwgICAgICAgRkNfS09JOFIsCisgICAgVFhfS09JOFUsICAgICAgIEZDX0tPSThVLAorICAgIFRYXzg4NTlfMSwgICAgICBGQ18xTEFUSU4sCisgICAgVFhfODg1OV8yLCAgICAgIEZDXzJMQVRJTiwKKyAgICBUWF84ODU5XzMsICAgICAgLTIsCisgICAgVFhfODg1OV80LCAgICAgIC0yLAorICAgIFRYXzg4NTlfNSwgICAgICBGQ19DWVJJTEwsCisgICAgVFhfODg1OV82LCAgICAgIC0yLAorICAgIFRYXzg4NTlfNywgICAgICAtMiwKKyAgICBUWF84ODU5XzgsICAgICAgRkNfSEVCUkVXLAorICAgIFRYXzg4NTlfOSwgICAgICAtMiwKKyAgICBUWF84ODU5XzEwLCAgICAgLTIsCisgICAgVFhfODg1OV8xNSwgICAgIC0yLAorICAgIFRYX01BQ0wxLCAgICAgICBGQ19BUFBRRCwKKyAgICBUWF9ORVhULCAgICAgICAgRkNfTkVYVCwKKyAgICBUWF9OT1JXRUdJQU4sICAgRkNfTk9BU0NJSSwKKyAgICBUWF9QT1JUVUdVRVNFLCAgRkNfUE9BU0NJSSwKKyAgICBUWF9TUEFOSVNILCAgICAgRkNfU1BBU0NJSSwKKyAgICBUWF9TV0VESVNILCAgICAgRkNfU1dBU0NJSSwKKyAgICBUWF9TV0lTUywgICAgICAgRkNfQ0hBU0NJSSwKKyAgICBUWF9JQ0VMQU5ESUMsICAgLTIsCisgICAgVFhfSklTNywgICAgICAgIC0yLAorICAgIFRYX1NISklTLCAgICAgICBGQ19TSEpJUywKKyAgICBUWF9KRVVDLCAgICAgICAgRkNfSkVVQywKKyAgICBUWF9KREVDLCAgICAgICAgRkNfSkRFQywKKyAgICBUWF9FTE9UOTI3LCAgICAgRkNfRUxPVCwKKyAgICBUWF9ER1BDR1JQSCwgICAgLTIsCisgICAgVFhfREdMREdSUEgsICAgIC0yLAorICAgIFRYX0RHV1BHUlBILCAgICAtMiwKKyAgICBUWF9IUExJTkUsICAgICAgLTIsCisgICAgVFhfSFBNQVRILCAgICAgIC0yLAorICAgIFRYX1FOWEdSUEgsICAgICAtMiwKKyAgICBUWF9TTklCUkFDSywgICAgLTIsCisgICAgVFhfU05JRVVSTywgICAgIC0yLAorICAgIFRYX1NOSUZBQ0VULCAgICAtMiwKKyAgICBUWF9TTklJQk0sICAgICAgLTIsCisgICAgVFhfU05JQkxBTkssICAgIC0yLAorICAgIFRYX0NQMTI1MiwgICAgICAtMiwKKyAgICBUWF9DUDEyNTAsICAgICAgRkNfQ1AxMjUwLAorICAgIFRYX0NQMTI1MSwgICAgICBGQ19DUDEyNTEsCisgICAgVFhfQ1AxMjUzLCAgICAgIC0yLAorICAgIFRYX0NQMTI1NCwgICAgICAtMiwKKyAgICBUWF9DUDEyNTcsICAgICAgLTIsCisgICAgVFhfQ1A4NTYsICAgICAgIC0yLAorICAgIFRYX0NQODU1LCAgICAgICBGQ19DUDg1NSwKKyAgICBUWF9DUDgxOSwgICAgICAgRkNfMUxBVElOLAorICAgIFRYX0NQOTEyLCAgICAgICBGQ18yTEFUSU4sCisgICAgVFhfQ1A5MTMsICAgICAgIC0yLAorICAgIFRYX0NQOTE0LCAgICAgICAtMiwKKyAgICBUWF9DUDkxNSwgICAgICAgRkNfQ1lSSUxMLAorICAgIFRYX0NQMTA4OSwgICAgICAtMiwKKyAgICBUWF9DUDgxMywgICAgICAgRkNfR1JFRUssCisgICAgVFhfQ1A5MTYsICAgICAgIEZDX0hFQlJFVywKKyAgICBUWF9DUDkyMCwgICAgICAgLTIsCisgICAgVFhfQ1AxMDUxLCAgICAgIC0yLAorICAgIFRYX0NQODU4LCAgICAgICBGQ19DUDg1OCwKKyAgICBUWF84ODU5XzE1LCAgICAgRkNfOUxBVElOLAorICAgIFRYX0NQOTIzLCAgICAgICBGQ19DUDkyMywKKyAgICBUWF9FTE9UOTI4LCAgICAgLTIsCisgICAgVFhfQ1AxMDAwMCwgICAgIC0yLAorICAgIFRYX0NQMzcsICAgICAgICAtMiwKKyAgICBUWF9DUDEyNTUsICAgICAgLTIsCisgICAgVFhfQ1AxMjU2LCAgICAgIC0yLAorICAgIFRYX0NQMTI1OCwgICAgICAtMiwKKyAgICBUWF9NQVpPVklBLCAgICAgRkNfTUFaT1ZJQSwKKyAgICBUWF9BUEwxLCAgICAgICAgLTIsCisgICAgVFhfQVBMMiwgICAgICAgIC0yLAorICAgIFRYX0FQTDMsICAgICAgICAtMiwKKyAgICBUWF9BUEw0LCAgICAgICAgLTIsCisgICAgVFhfQVBMNSwgICAgICAgIC0yLAorICAgIFRYX1RSQU5TUCwgICAgICBGQ19UUkFOU1AKK307CitpbnQgblRYRkMgPSBzaXplb2YoVFhGQykgLyBzaXplb2Yoc3RydWN0IF9wYWlyKTsKKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2ZjMnR4KGludCBmYykKKyNlbHNlCitmYzJ0eChpbnQgYykgaW50IGZjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG5UWEZDIDsgaSsrKQorICAgICAgaWYgKFRYRkNbaV0uZmMgPT0gZmMgJiYgVFhGQ1tpXS50eCA+PSAwKQorICAgICAgICByZXR1cm4oVFhGQ1tpXS50eCk7CisgICAgcmV0dXJuKFRYX0FTQ0lJKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3R4MmZjKGludCB0eCkKKyNlbHNlCit0eDJmYyhpbnQgeCkgaW50IHR4OworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG5UWEZDIDsgaSsrKQorICAgICAgaWYgKFRYRkNbaV0udHggPT0gdHggJiYgVFhGQ1tpXS5mYyA+PSAwKQorICAgICAgICByZXR1cm4oVFhGQ1tpXS5mYyk7CisgICAgcmV0dXJuKEZDX1VTQVNDSUkpOworfQorCisvKiBTRVQgVEVSTUlOQUwgUkVNT1RFIENIQVJBQ1RFUi1TRVQga2V5d29yZCB0YWJsZSAqLworCitzdHJ1Y3Qga2V5dGFiIHR4cnRhYltdID0geworICAgICJhcGwyLWlibSIsICAgICAgICAgVFhfQVBMNCwgICAgICAgMCwKKyAgICAiYXBsLTI3NDEiLCAgICAgICAgIFRYX0FQTDUsICAgICAgIDAsCisgICAgImFwbC1keWFkaWMiLCAgICAgICBUWF9BUEwyLCAgICAgICAwLAorICAgICJhcGwtaXNvIiwgICAgICAgICAgVFhfQVBMMSwgICAgICAgMCwKKyAgICAiYXBsLXBsdXMtMjAwMCIsICAgIFRYX0FQTDMsICAgICAgIDAsIC8qID0gQVBMLTIwMDAgKi8KKyAgICAiYXJhYmljLWlzbyIsICAgICAgIFRYXzg4NTlfNiwgICAgIDAsCisgICAgImFzY2lpIiwgICAgICAgICAgICBUWF9BU0NJSSwgICAgICAwLAorICAgICJicml0aXNoIiwgICAgICAgICAgVFhfQlJJVElTSCwgICAgMCwKKyAgICAiY2FuYWRpYW4tZnJlbmNoIiwgIFRYX0NOX0ZSRU5DSCwgIDAsCisgICAgImJ1bGdhcmlhLXBjIiwgICAgICBUWF9DUDg1NiwgICAgICAwLAorI2lmZGVmIENPTU1FTlQKKyAgICAiY3AwMzciLCAgICAgICAgICAgIFRYX0NQMzcsICAgICAgIDAsIC8qIFUuUy4gRUJDRElDICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICJjcDEwMDAwIiwgICAgICAgICAgVFhfQ1AxMDAwMCwgICAgMCwgLyogQXBwbGUgUXVpY2tkcmF3ICovCisgICAgImNwMTA1MSIsICAgICAgICAgICBUWF9DUDEwNTEsICAgICAwLCAvKiBTYW1lIGFzIEhQIFJvbWFuIDggKi8KKyAgICAiY3AxMDg5IiwgICAgICAgICAgIFRYX0NQMTA4OSwgICAgIDAsIC8qIFNhbWUgYXMgSVNPIDg4NTktNiAqLworICAgICJjcDEyNTAiLCAgICAgICAgICAgVFhfQ1AxMjUwLCAgICAgMCwgLyogTGF0aW4tMiBXaW5kb3dzICovCisgICAgImNwMTI1MSIsICAgICAgICAgICBUWF9DUDEyNTEsICAgICAwLCAvKiBDeXJpbGxpYyBXaW5kb3dzICovCisgICAgImNwMTI1MiIsICAgICAgICAgICBUWF9DUDEyNTIsICAgICAwLCAvKiBMYXRpbi0xIFdpbmRvd3MgKi8KKyAgICAiY3AxMjUzIiwgICAgICAgICAgIFRYX0NQMTI1MywgICAgIDAsIC8qIEdyZWVrIFdpbmRvd3MgKi8KKyAgICAiY3AxMjU0IiwgICAgICAgICAgIFRYX0NQMTI1NCwgICAgIDAsIC8qIFR1cmtleSBXaW5kb3dzICovCisgICAgImNwMTI1NSIsICAgICAgICAgICBUWF9DUDEyNTUsICAgICAwLCAvKiBIZWJyZXcgV2luZG93cyAqLworICAgICJjcDEyNTYiLCAgICAgICAgICAgVFhfQ1AxMjU2LCAgICAgMCwgLyogQXJhYmljIFdpbmRvd3MgKi8KKyAgICAiY3AxMjU3IiwgICAgICAgICAgIFRYX0NQMTI1NywgICAgIDAsIC8qIExhdGluLTQgV2luZG93cyAqLworICAgICJjcDEyNTgiLCAgICAgICAgICAgVFhfQ1AxMjU4LCAgICAgMCwgLyogVmlldCBOYW0gV2luZG93cyAqLworICAgICJjcDQzNyIsICAgICAgICAgICAgVFhfQ1A0MzcsICAgICAgMCwKKyAgICAiY3A4MTMiLCAgICAgICAgICAgIFRYX0NQODEzLCAgICAgIDAsIC8qIFNhbWUgYXMgSVNPIDg4NTktNyAqLworICAgICJjcDgxOSIsICAgICAgICAgICAgVFhfQ1A4MTksICAgICAgMCwgLyogU2FtZSBhcyBJU08gODg1OS0xICovCisgICAgImNwODUwIiwgICAgICAgICAgICBUWF9DUDg1MCwgICAgICAwLAorICAgICJjcDg1MiIsICAgICAgICAgICAgVFhfQ1A4NTIsICAgICAgMCwKKyAgICAiY3A4NTUiLCAgICAgICAgICAgIFRYX0NQODU1LCAgICAgIDAsIC8qIEN5cmlsbGljICovCisgICAgImNwODU2IiwgICAgICAgICAgICBUWF9DUDg1NiwgICAgICBDTV9JTlYsIC8qIEJ1bGdhcmlhICovCisgICAgImNwODU3IiwgICAgICAgICAgICBUWF9DUDg1NywgICAgICAwLCAvKiBMYXRpbi01ICovCisgICAgImNwODU4IiwgICAgICAgICAgICBUWF9DUDg1OCwgICAgICAwLCAvKiBFdXJvIG1vZGlmaWVkIGNwODUwICovCisgICAgImNwODYyLWhlYnJldyIsICAgICBUWF9DUDg2MiwgICAgICAwLCAvKiBIZWJyZXcgKi8KKyAgICAiY3A4NjQiLCAgICAgICAgICAgIFRYX0NQODY0LCAgICAgIDAsIC8qIEFyYWJpYyAqLworICAgICJjcDg2NiIsICAgICAgICAgICAgVFhfQ1A4NjYsICAgICAgMCwgLyogQ3lyaWxsaWMgKi8KKyAgICAiY3A4NjkiLCAgICAgICAgICAgIFRYX0NQODY5LCAgICAgIDAsIC8qIEdyZWVrICovCisgICAgImNwOTEyIiwgICAgICAgICAgICBUWF9DUDkxMiwgICAgICAwLCAvKiBTYW1lIGFzIElTTyA4ODU5LTIgKi8KKyAgICAiY3A5MTMiLCAgICAgICAgICAgIFRYX0NQOTEzLCAgICAgIDAsIC8qIFNhbWUgYXMgSVNPIDg4NTktMyAqLworICAgICJjcDkxNCIsICAgICAgICAgICAgVFhfQ1A5MTQsICAgICAgMCwgLyogU2FtZSBhcyBJU08gODg1OS00ICovCisgICAgImNwOTE1IiwgICAgICAgICAgICBUWF9DUDkxNSwgICAgICAwLCAvKiBTYW1lIGFzIElTTyA4ODU5LTUgKi8KKyAgICAiY3A5MTYiLCAgICAgICAgICAgIFRYX0NQOTE2LCAgICAgIDAsIC8qIFNhbWUgYXMgSVNPIDg4NTktOCAqLworICAgICJjcDkyMCIsICAgICAgICAgICAgVFhfQ1A5MjAsICAgICAgMCwgLyogU2FtZSBhcyBJU08gODg1OS05ICovCisgICAgImNwOTIzIiwgICAgICAgICAgICBUWF9DUDkyMywgICAgICAwLCAvKiBTYW1lIGFzIElTTyA4ODU5LTE1ICovCisjaWZkZWYgQ09NTUVOVAorLyogTm90IGltcGxlbWVudGVkIHlldCAqLworICAgICJjdWJhbiIsICAgICAgICAgICAgVFhfQ1VCQU4sICAgICAgMCwKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgImN5cmlsbGljLWlzbyIsICAgICBUWF84ODU5XzUsICAgICAwLAorI2lmZGVmIENPTU1FTlQKKy8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKyAgICAiY3plY2giLCAgICAgICAgICAgIFRYX0NaRUNILCAgICAgIDAsCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICJkYW5pc2giLCAgICAgICAgICAgVFhfREFOSVNILCAgICAgMCwKKyAgICAiZGVjLW0iLCAgICAgICAgICAgIFRYX0RFQ01DUywgICAgIENNX0FCUnxDTV9JTlYsCisgICAgImRlYy1tY3MiLCAgICAgICAgICBUWF9ERUNNQ1MsICAgICBDTV9JTlYsCisgICAgImRlYy1tdWx0aW5hdGlvbmFsIixUWF9ERUNNQ1MsICAgICAwLAorI2lmZGVmIENPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKyAgICAiZGVjLWthbmppIiwgICAgICAgIFRYX0pERUMsICAgICAgIDAsCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICJkZWMtc3BlY2lhbCIsICAgICAgVFhfREVDU1BFQywgICAgMCwKKyAgICAiZGVjLXRlY2huaWNhbCIsICAgIFRYX0RFQ1RFQ0gsICAgIDAsCisgICAgImRnLWludGVybmF0aW9uYWwiLCBUWF9ER0ksICAgICAgICAwLAorICAgICJkZy1saW5lZHJhd2luZyIsICAgVFhfREdMREdSUEgsICAgMCwKKyAgICAiZGctc3BlY2lhbGdyYXBoY3MiLFRYX0RHUENHUlBILCAgIDAsCisgICAgImRnLXdvcmRwcm9jZXNzaW5nIixUWF9ER1dQR1JQSCwgICAwLAorICAgICJkdXRjaCIsICAgICAgICAgICAgVFhfRFVUQ0gsICAgICAgMCwKKyAgICAiZWxvdDkyNy1ncmVlayIsICAgIFRYX0VMT1Q5MjcsICAgIDAsCisgICAgImVsb3Q5MjgtZ3JlZWsiLCAgICBUWF9FTE9UOTI4LCAgICAwLAorICAgICJmaW5uaXNoIiwgICAgICAgICAgVFhfRklOTklTSCwgICAgMCwKKyAgICAiZnJlbmNoIiwgICAgICAgICAgIFRYX0ZSRU5DSCwgICAgIDAsCisgICAgImdlcm1hbiIsICAgICAgICAgICBUWF9HRVJNQU4sICAgICAwLAorICAgICJncmVlay1pc28iLCAgICAgICAgVFhfODg1OV83LCAgICAgMCwKKyAgICAiaGVicmV3LTciLCAgICAgICAgIFRYX0hFNywgICAgICAgIDAsCisgICAgImhlYnJldy1pc28iLCAgICAgICBUWF84ODU5XzgsICAgICAwLAorICAgICJocC1saW5lLWRyYXdpbmciLCAgVFhfSFBMSU5FLCAgICAgMCwKKyAgICAiaHAtbWF0aC90ZWNobmljYWwiLFRYX0hQTUFUSCwgICAgIDAsCisgICAgImhwLXJvbWFuOCIsICAgICAgICBUWF9IUFI4LCAgICAgICAwLAorICAgICJodW5nYXJpYW4iLCAgICAgICAgVFhfSFVOR0FSSUFOLCAgMCwKKyAgICAiaXRhbGlhbiIsICAgICAgICAgIFRYX0lUQUxJQU4sICAgIDAsCisgICAgImphcGFuZXNlLXJvbWFuIiwgICBUWF9KMjAxUiwgICAgICAwLAorI2lmZGVmIENPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKyAgICAiamFwYW5lc2UtZXVjIiwgICAgIFRYX0pFVUMsICAgICAgIDAsCisgICAgImppczcta2FuamkiLCAgICAgICBUWF9KSVM3LCAgICAgICAwLAorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAia2F0YWthbmEiLCAgICAgICAgIFRYX0oyMDFLLCAgICAgIDAsCisgICAgImtvIiwgICAgICAgICAgICAgICBUWF9LT0k4LCAgICAgICBDTV9BQlJ8Q01fSU5WLAorICAgICJrb2kiLCAgICAgICAgICAgICAgVFhfS09JOCwgICAgICAgQ01fQUJSfENNX0lOViwKKyAgICAia29pOCIsICAgICAgICAgICAgIFRYX0tPSTgsICAgICAgIDAsCisgICAgImtvaTgtY3lyaWxsaWMiLCAgICBUWF9LT0k4LCAgICAgICBDTV9JTlYsCisgICAgImtvaThyIiwgICAgICAgICAgICBUWF9LT0k4UiwgICAgICAwLAorICAgICJrb2k4dSIsICAgICAgICAgICAgVFhfS09JOFUsICAgICAgMCwKKyAgICAibCIsICAgICAgICAgICAgICAgIFRYXzg4NTlfMSwgICAgIENNX0FCUnxDTV9JTlYsCisgICAgImxhIiwgICAgICAgICAgICAgICBUWF84ODU5XzEsICAgICBDTV9BQlJ8Q01fSU5WLAorICAgICJsYXQiLCAgICAgICAgICAgICAgVFhfODg1OV8xLCAgICAgQ01fQUJSfENNX0lOViwKKyAgICAibGF0aSIsICAgICAgICAgICAgIFRYXzg4NTlfMSwgICAgIENNX0FCUnxDTV9JTlYsCisgICAgImxhdGluIiwgICAgICAgICAgICBUWF84ODU5XzEsICAgICBDTV9BQlJ8Q01fSU5WLAorICAgICJsYXRpbjEtaXNvIiwgICAgICAgVFhfODg1OV8xLCAgICAgMCwKKyAgICAibGF0aW4yLWlzbyIsICAgICAgIFRYXzg4NTlfMiwgICAgIDAsCisgICAgImxhdGluMy1pc28iLCAgICAgICBUWF84ODU5XzMsICAgICAwLAorICAgICJsYXRpbjQtaXNvIiwgICAgICAgVFhfODg1OV80LCAgICAgMCwKKyAgICAibGF0aW41LWlzbyIsICAgICAgIFRYXzg4NTlfOSwgICAgIDAsCisgICAgImxhdGluNi1pc28iLCAgICAgICBUWF84ODU5XzEwLCAgICAwLAorICAgICJsYXRpbjktaXNvIiwgICAgICAgVFhfODg1OV8xNSwgICAgMCwKKyAgICAibWFjaW50b3NoLWxhdGluIiwgIFRYX01BQ0wxLCAgICAgIDAsCisgICAgIm1hem92aWEtcGMiLCAgICAgICBUWF9NQVpPVklBLCAgICAwLAorICAgICJuZXh0LW11bHRpbmF0aW9uYWwiLFRYX05FWFQsICAgICAgMCwKKyAgICAibm9yd2VnaWFuIiwgICAgICAgIFRYX05PUldFR0lBTiwgIDAsCisgICAgInBvcnR1Z3Vlc2UiLCAgICAgICBUWF9QT1JUVUdVRVNFLCAwLAorICAgICJxbngtY29uc29sZSIsICAgICAgVFhfUU5YR1JQSCwgICAgMCwKKyNpZmRlZiBDT01NRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgaW1wbGVtZW50ZWQgeWV0ICovCisgICAgInNoaWZ0LWppcyIsICAgICAgICBUWF9TSEpJUywgICAgICAwLAorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAic2hvcnQta29pIiwgICAgICAgIFRYX0tPSTcsICAgICAgIDAsCisgICAgInNuaS1ibGFua3MiLCAgICAgICBUWF9TTklCTEFOSywgICAwLAorICAgICJzbmktYnJhY2tldHMiLCAgICAgVFhfU05JQlJBQ0ssICAgMCwKKyAgICAic25pLWV1cm8iLCAgICAgICAgIFRYX1NOSUVVUk8sICAgIDAsCisgICAgInNuaS1mYWNldCIsICAgICAgICBUWF9TTklGQUNFVCwgICAwLAorICAgICJzbmktaWJtIiwgICAgICAgICAgVFhfU05JSUJNLCAgICAgMCwKKyAgICAic3BhbmlzaCIsICAgICAgICAgIFRYX1NQQU5JU0gsICAgIDAsCisgICAgInN3ZWRpc2giLCAgICAgICAgICBUWF9TV0VESVNILCAgICAwLAorICAgICJzd2lzcyIsICAgICAgICAgICAgVFhfU1dJU1MsICAgICAgMCwKKyAgICAidHJhbnNwYXJlbnQiLCAgICAgIFRYX1RSQU5TUCwgICAgIDAsCisjaWZkZWYgQ09NTUVOVAorICAgICJ1dGY3IiwgICAgICAgICAgICAgVFhfVVRGNywgICAgICAgMCwKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgInV0ZjgiLCAgICAgICAgICAgICBUWF9VVEY4LCAgICAgICAwLAorICAgICIiLCAwLCAwCit9OworaW50IG50eHJ0YWIgPSBzaXplb2YodHhydGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYikgLSAxOworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgS0FOSkkKKy8qCisgIEFsbCBLYW5qaS9Vbmljb2RlIHRyYW5zbGF0aW9ucyBhcmUgYmFzZWQgb24gdGhlIFVuaWNvZGUgMy4wCisgIFNoaWZ0LUpJUyBtYXBwaW5nLiAgT3RoZXIgY2hhcmFjdGVyIHNldHMsIGxpa2UgRVVDLUpQLCBKSVMtNywgZXRjLAorICBhcmUgdHJhbnNmb3JtZWQgYWxnb3JpdGhtaWNhbGx5IHRvL2Zyb20gU2hpZnQtSklTIGJlZm9yZS9hZnRlcgorICBjb252ZXJzaW9uIHRvL2Zyb20gVW5pY29kZS4gIFRoaXMgaXMgYmVjYXVzZSBLYW5qaS9Vbmljb2RlIG1hcHBpbmcKKyAgdGFibGVzIGFkZCBhYm91dCAxMjBLIHRvIHRoZSBwcm9ncmFtLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzCisgIGZvciBlYWNoIEthbmppIGNoYXJhY3RlciBzZXQuCisqLworc3RhdGljIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0LUpJUyB0byBVbmljb2RlICovCitzanVfODE0MFtdID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg4MTQwIHRocnUgMHg5ZmZjICovCisgICAgMHgzMDAwLCAweDMwMDEsIDB4MzAwMiwgMHhmZjBjLCAweGZmMGUsIDB4MzBmYiwgMHhmZjFhLCAweGZmMWIsCisgICAgMHhmZjFmLCAweGZmMDEsIDB4MzA5YiwgMHgzMDljLCAweDAwYjQsIDB4ZmY0MCwgMHgwMGE4LCAweGZmM2UsCisgICAgMHhmZmUzLCAweGZmM2YsIDB4MzBmZCwgMHgzMGZlLCAweDMwOWQsIDB4MzA5ZSwgMHgzMDAzLCAweDRlZGQsCisgICAgMHgzMDA1LCAweDMwMDYsIDB4MzAwNywgMHgzMGZjLCAweDIwMTUsIDB4MjAxMCwgMHhmZjBmLCAweDAwNWMsCisgICAgMHgzMDFjLCAweDIwMTYsIDB4ZmY1YywgMHgyMDI2LCAweDIwMjUsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWMsCisgICAgMHgyMDFkLCAweGZmMDgsIDB4ZmYwOSwgMHgzMDE0LCAweDMwMTUsIDB4ZmYzYiwgMHhmZjNkLCAweGZmNWIsCisgICAgMHhmZjVkLCAweDMwMDgsIDB4MzAwOSwgMHgzMDBhLCAweDMwMGIsIDB4MzAwYywgMHgzMDBkLCAweDMwMGUsCisgICAgMHgzMDBmLCAweDMwMTAsIDB4MzAxMSwgMHhmZjBiLCAweDIyMTIsIDB4MDBiMSwgMHgwMGQ3LCAweGZmZmQsCisgICAgMHgwMGY3LCAweGZmMWQsIDB4MjI2MCwgMHhmZjFjLCAweGZmMWUsIDB4MjI2NiwgMHgyMjY3LCAweDIyMWUsCisgICAgMHgyMjM0LCAweDI2NDIsIDB4MjY0MCwgMHgwMGIwLCAweDIwMzIsIDB4MjAzMywgMHgyMTAzLCAweGZmZTUsCisgICAgMHhmZjA0LCAweDAwYTIsIDB4MDBhMywgMHhmZjA1LCAweGZmMDMsIDB4ZmYwNiwgMHhmZjBhLCAweGZmMjAsCisgICAgMHgwMGE3LCAweDI2MDYsIDB4MjYwNSwgMHgyNWNiLCAweDI1Y2YsIDB4MjVjZSwgMHgyNWM3LCAweDI1YzYsCisgICAgMHgyNWExLCAweDI1YTAsIDB4MjViMywgMHgyNWIyLCAweDI1YmQsIDB4MjViYywgMHgyMDNiLCAweDMwMTIsCisgICAgMHgyMTkyLCAweDIxOTAsIDB4MjE5MSwgMHgyMTkzLCAweDMwMTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHgyMjA4LCAweDIyMGIsIDB4MjI4NiwgMHgyMjg3LCAweDIyODIsIDB4MjI4MywgMHgyMjJhLCAweDIyMjksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHgyMjI3LCAweDIyMjgsIDB4MDBhYywgMHgyMWQyLCAweDIxZDQsIDB4MjIwMCwgMHgyMjAzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4MjIyMCwgMHgyMmE1LCAweDIzMTIsIDB4MjIwMiwgMHgyMjA3LCAweDIyNjEsCisgICAgMHgyMjUyLCAweDIyNmEsIDB4MjI2YiwgMHgyMjFhLCAweDIyM2QsIDB4MjIxZCwgMHgyMjM1LCAweDIyMmIsCisgICAgMHgyMjJjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHgyMTJiLCAweDIwMzAsIDB4MjY2ZiwgMHgyNjZkLCAweDI2NmEsIDB4MjAyMCwgMHgyMDIxLCAweDAwYjYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDI1ZWYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmMTAsCisgICAgMHhmZjExLCAweGZmMTIsIDB4ZmYxMywgMHhmZjE0LCAweGZmMTUsIDB4ZmYxNiwgMHhmZjE3LCAweGZmMTgsCisgICAgMHhmZjE5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZjIxLCAweGZmMjIsIDB4ZmYyMywgMHhmZjI0LCAweGZmMjUsIDB4ZmYyNiwgMHhmZjI3LCAweGZmMjgsCisgICAgMHhmZjI5LCAweGZmMmEsIDB4ZmYyYiwgMHhmZjJjLCAweGZmMmQsIDB4ZmYyZSwgMHhmZjJmLCAweGZmMzAsCisgICAgMHhmZjMxLCAweGZmMzIsIDB4ZmYzMywgMHhmZjM0LCAweGZmMzUsIDB4ZmYzNiwgMHhmZjM3LCAweGZmMzgsCisgICAgMHhmZjM5LCAweGZmM2EsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmNDEsIDB4ZmY0MiwgMHhmZjQzLCAweGZmNDQsIDB4ZmY0NSwgMHhmZjQ2LCAweGZmNDcsCisgICAgMHhmZjQ4LCAweGZmNDksIDB4ZmY0YSwgMHhmZjRiLCAweGZmNGMsIDB4ZmY0ZCwgMHhmZjRlLCAweGZmNGYsCisgICAgMHhmZjUwLCAweGZmNTEsIDB4ZmY1MiwgMHhmZjUzLCAweGZmNTQsIDB4ZmY1NSwgMHhmZjU2LCAweGZmNTcsCisgICAgMHhmZjU4LCAweGZmNTksIDB4ZmY1YSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDMwNDEsCisgICAgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwgMHgzMDQ1LCAweDMwNDYsIDB4MzA0NywgMHgzMDQ4LCAweDMwNDksCisgICAgMHgzMDRhLCAweDMwNGIsIDB4MzA0YywgMHgzMDRkLCAweDMwNGUsIDB4MzA0ZiwgMHgzMDUwLCAweDMwNTEsCisgICAgMHgzMDUyLCAweDMwNTMsIDB4MzA1NCwgMHgzMDU1LCAweDMwNTYsIDB4MzA1NywgMHgzMDU4LCAweDMwNTksCisgICAgMHgzMDVhLCAweDMwNWIsIDB4MzA1YywgMHgzMDVkLCAweDMwNWUsIDB4MzA1ZiwgMHgzMDYwLCAweDMwNjEsCisgICAgMHgzMDYyLCAweDMwNjMsIDB4MzA2NCwgMHgzMDY1LCAweDMwNjYsIDB4MzA2NywgMHgzMDY4LCAweDMwNjksCisgICAgMHgzMDZhLCAweDMwNmIsIDB4MzA2YywgMHgzMDZkLCAweDMwNmUsIDB4MzA2ZiwgMHgzMDcwLCAweDMwNzEsCisgICAgMHgzMDcyLCAweDMwNzMsIDB4MzA3NCwgMHgzMDc1LCAweDMwNzYsIDB4MzA3NywgMHgzMDc4LCAweDMwNzksCisgICAgMHgzMDdhLCAweDMwN2IsIDB4MzA3YywgMHgzMDdkLCAweDMwN2UsIDB4MzA3ZiwgMHgzMDgwLCAweDMwODEsCisgICAgMHgzMDgyLCAweDMwODMsIDB4MzA4NCwgMHgzMDg1LCAweDMwODYsIDB4MzA4NywgMHgzMDg4LCAweDMwODksCisgICAgMHgzMDhhLCAweDMwOGIsIDB4MzA4YywgMHgzMDhkLCAweDMwOGUsIDB4MzA4ZiwgMHgzMDkwLCAweDMwOTEsCisgICAgMHgzMDkyLCAweDMwOTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHgzMGExLCAweDMwYTIsIDB4MzBhMywgMHgzMGE0LCAweDMwYTUsIDB4MzBhNiwgMHgzMGE3LCAweDMwYTgsCisgICAgMHgzMGE5LCAweDMwYWEsIDB4MzBhYiwgMHgzMGFjLCAweDMwYWQsIDB4MzBhZSwgMHgzMGFmLCAweDMwYjAsCisgICAgMHgzMGIxLCAweDMwYjIsIDB4MzBiMywgMHgzMGI0LCAweDMwYjUsIDB4MzBiNiwgMHgzMGI3LCAweDMwYjgsCisgICAgMHgzMGI5LCAweDMwYmEsIDB4MzBiYiwgMHgzMGJjLCAweDMwYmQsIDB4MzBiZSwgMHgzMGJmLCAweDMwYzAsCisgICAgMHgzMGMxLCAweDMwYzIsIDB4MzBjMywgMHgzMGM0LCAweDMwYzUsIDB4MzBjNiwgMHgzMGM3LCAweDMwYzgsCisgICAgMHgzMGM5LCAweDMwY2EsIDB4MzBjYiwgMHgzMGNjLCAweDMwY2QsIDB4MzBjZSwgMHgzMGNmLCAweDMwZDAsCisgICAgMHgzMGQxLCAweDMwZDIsIDB4MzBkMywgMHgzMGQ0LCAweDMwZDUsIDB4MzBkNiwgMHgzMGQ3LCAweDMwZDgsCisgICAgMHgzMGQ5LCAweDMwZGEsIDB4MzBkYiwgMHgzMGRjLCAweDMwZGQsIDB4MzBkZSwgMHgzMGRmLCAweGZmZmQsCisgICAgMHgzMGUwLCAweDMwZTEsIDB4MzBlMiwgMHgzMGUzLCAweDMwZTQsIDB4MzBlNSwgMHgzMGU2LCAweDMwZTcsCisgICAgMHgzMGU4LCAweDMwZTksIDB4MzBlYSwgMHgzMGViLCAweDMwZWMsIDB4MzBlZCwgMHgzMGVlLCAweDMwZWYsCisgICAgMHgzMGYwLCAweDMwZjEsIDB4MzBmMiwgMHgzMGYzLCAweDMwZjQsIDB4MzBmNSwgMHgzMGY2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDAzOTEsCisgICAgMHgwMzkyLCAweDAzOTMsIDB4MDM5NCwgMHgwMzk1LCAweDAzOTYsIDB4MDM5NywgMHgwMzk4LCAweDAzOTksCisgICAgMHgwMzlhLCAweDAzOWIsIDB4MDM5YywgMHgwMzlkLCAweDAzOWUsIDB4MDM5ZiwgMHgwM2EwLCAweDAzYTEsCisgICAgMHgwM2EzLCAweDAzYTQsIDB4MDNhNSwgMHgwM2E2LCAweDAzYTcsIDB4MDNhOCwgMHgwM2E5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDAzYjEsCisgICAgMHgwM2IyLCAweDAzYjMsIDB4MDNiNCwgMHgwM2I1LCAweDAzYjYsIDB4MDNiNywgMHgwM2I4LCAweDAzYjksCisgICAgMHgwM2JhLCAweDAzYmIsIDB4MDNiYywgMHgwM2JkLCAweDAzYmUsIDB4MDNiZiwgMHgwM2MwLCAweDAzYzEsCisgICAgMHgwM2MzLCAweDAzYzQsIDB4MDNjNSwgMHgwM2M2LCAweDAzYzcsIDB4MDNjOCwgMHgwM2M5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHgwNDEwLCAweDA0MTEsIDB4MDQxMiwgMHgwNDEzLCAweDA0MTQsIDB4MDQxNSwgMHgwNDAxLCAweDA0MTYsCisgICAgMHgwNDE3LCAweDA0MTgsIDB4MDQxOSwgMHgwNDFhLCAweDA0MWIsIDB4MDQxYywgMHgwNDFkLCAweDA0MWUsCisgICAgMHgwNDFmLCAweDA0MjAsIDB4MDQyMSwgMHgwNDIyLCAweDA0MjMsIDB4MDQyNCwgMHgwNDI1LCAweDA0MjYsCisgICAgMHgwNDI3LCAweDA0MjgsIDB4MDQyOSwgMHgwNDJhLCAweDA0MmIsIDB4MDQyYywgMHgwNDJkLCAweDA0MmUsCisgICAgMHgwNDJmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwgMHgwNDMzLCAweDA0MzQsIDB4MDQzNSwgMHgwNDUxLCAweDA0MzYsCisgICAgMHgwNDM3LCAweDA0MzgsIDB4MDQzOSwgMHgwNDNhLCAweDA0M2IsIDB4MDQzYywgMHgwNDNkLCAweGZmZmQsCisgICAgMHgwNDNlLCAweDA0M2YsIDB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywgMHgwNDQ0LCAweDA0NDUsCisgICAgMHgwNDQ2LCAweDA0NDcsIDB4MDQ0OCwgMHgwNDQ5LCAweDA0NGEsIDB4MDQ0YiwgMHgwNDRjLCAweDA0NGQsCisgICAgMHgwNDRlLCAweDA0NGYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDI1MDAsCisgICAgMHgyNTAyLCAweDI1MGMsIDB4MjUxMCwgMHgyNTE4LCAweDI1MTQsIDB4MjUxYywgMHgyNTJjLCAweDI1MjQsCisgICAgMHgyNTM0LCAweDI1M2MsIDB4MjUwMSwgMHgyNTAzLCAweDI1MGYsIDB4MjUxMywgMHgyNTFiLCAweDI1MTcsCisgICAgMHgyNTIzLCAweDI1MzMsIDB4MjUyYiwgMHgyNTNiLCAweDI1NGIsIDB4MjUyMCwgMHgyNTJmLCAweDI1MjgsCisgICAgMHgyNTM3LCAweDI1M2YsIDB4MjUxZCwgMHgyNTMwLCAweDI1MjUsIDB4MjUzOCwgMHgyNTQyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDRlOWMsCisgICAgMHg1NTE2LCAweDVhMDMsIDB4OTYzZiwgMHg1NGMwLCAweDYxMWIsIDB4NjMyOCwgMHg1OWY2LCAweDkwMjIsCisgICAgMHg4NDc1LCAweDgzMWMsIDB4N2E1MCwgMHg2MGFhLCAweDYzZTEsIDB4NmUyNSwgMHg2NWVkLCAweDg0NjYsCisgICAgMHg4MmE2LCAweDliZjUsIDB4Njg5MywgMHg1NzI3LCAweDY1YTEsIDB4NjI3MSwgMHg1YjliLCAweDU5ZDAsCisgICAgMHg4NjdiLCAweDk4ZjQsIDB4N2Q2MiwgMHg3ZGJlLCAweDliOGUsIDB4NjIxNiwgMHg3YzlmLCAweDg4YjcsCisgICAgMHg1Yjg5LCAweDVlYjUsIDB4NjMwOSwgMHg2Njk3LCAweDY4NDgsIDB4OTVjNywgMHg5NzhkLCAweDY3NGYsCisgICAgMHg0ZWU1LCAweDRmMGEsIDB4NGY0ZCwgMHg0ZjlkLCAweDUwNDksIDB4NTZmMiwgMHg1OTM3LCAweDU5ZDQsCisgICAgMHg1YTAxLCAweDVjMDksIDB4NjBkZiwgMHg2MTBmLCAweDYxNzAsIDB4NjYxMywgMHg2OTA1LCAweDcwYmEsCisgICAgMHg3NTRmLCAweDc1NzAsIDB4NzlmYiwgMHg3ZGFkLCAweDdkZWYsIDB4ODBjMywgMHg4NDBlLCAweDg4NjMsCisgICAgMHg4YjAyLCAweDkwNTUsIDB4OTA3YSwgMHg1MzNiLCAweDRlOTUsIDB4NGVhNSwgMHg1N2RmLCAweDgwYjIsCisgICAgMHg5MGMxLCAweDc4ZWYsIDB4NGUwMCwgMHg1OGYxLCAweDZlYTIsIDB4OTAzOCwgMHg3YTMyLCAweDgzMjgsCisgICAgMHg4MjhiLCAweDljMmYsIDB4NTE0MSwgMHg1MzcwLCAweDU0YmQsIDB4NTRlMSwgMHg1NmUwLCAweDU5ZmIsCisgICAgMHg1ZjE1LCAweDk4ZjIsIDB4NmRlYiwgMHg4MGU0LCAweDg1MmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NjYyLCAweDk2NzAsIDB4OTZhMCwgMHg5N2ZiLCAweDU0MGIsIDB4NTNmMywgMHg1Yjg3LCAweDcwY2YsCisgICAgMHg3ZmJkLCAweDhmYzIsIDB4OTZlOCwgMHg1MzZmLCAweDlkNWMsIDB4N2FiYSwgMHg0ZTExLCAweDc4OTMsCisgICAgMHg4MWZjLCAweDZlMjYsIDB4NTYxOCwgMHg1NTA0LCAweDZiMWQsIDB4ODUxYSwgMHg5YzNiLCAweDU5ZTUsCisgICAgMHg1M2E5LCAweDZkNjYsIDB4NzRkYywgMHg5NThmLCAweDU2NDIsIDB4NGU5MSwgMHg5MDRiLCAweDk2ZjIsCisgICAgMHg4MzRmLCAweDk5MGMsIDB4NTNlMSwgMHg1NWI2LCAweDViMzAsIDB4NWY3MSwgMHg2NjIwLCAweDY2ZjMsCisgICAgMHg2ODA0LCAweDZjMzgsIDB4NmNmMywgMHg2ZDI5LCAweDc0NWIsIDB4NzZjOCwgMHg3YTRlLCAweDk4MzQsCisgICAgMHg4MmYxLCAweDg4NWIsIDB4OGE2MCwgMHg5MmVkLCAweDZkYjIsIDB4NzVhYiwgMHg3NmNhLCAweDk5YzUsCisgICAgMHg2MGE2LCAweDhiMDEsIDB4OGQ4YSwgMHg5NWIyLCAweDY5OGUsIDB4NTNhZCwgMHg1MTg2LCAweGZmZmQsCisgICAgMHg1NzEyLCAweDU4MzAsIDB4NTk0NCwgMHg1YmI0LCAweDVlZjYsIDB4NjAyOCwgMHg2M2E5LCAweDYzZjQsCisgICAgMHg2Y2JmLCAweDZmMTQsIDB4NzA4ZSwgMHg3MTE0LCAweDcxNTksIDB4NzFkNSwgMHg3MzNmLCAweDdlMDEsCisgICAgMHg4Mjc2LCAweDgyZDEsIDB4ODU5NywgMHg5MDYwLCAweDkyNWIsIDB4OWQxYiwgMHg1ODY5LCAweDY1YmMsCisgICAgMHg2YzVhLCAweDc1MjUsIDB4NTFmOSwgMHg1OTJlLCAweDU5NjUsIDB4NWY4MCwgMHg1ZmRjLCAweDYyYmMsCisgICAgMHg2NWZhLCAweDZhMmEsIDB4NmIyNywgMHg2YmI0LCAweDczOGIsIDB4N2ZjMSwgMHg4OTU2LCAweDlkMmMsCisgICAgMHg5ZDBlLCAweDllYzQsIDB4NWNhMSwgMHg2Yzk2LCAweDgzN2IsIDB4NTEwNCwgMHg1YzRiLCAweDYxYjYsCisgICAgMHg4MWM2LCAweDY4NzYsIDB4NzI2MSwgMHg0ZTU5LCAweDRmZmEsIDB4NTM3OCwgMHg2MDY5LCAweDZlMjksCisgICAgMHg3YTRmLCAweDk3ZjMsIDB4NGUwYiwgMHg1MzE2LCAweDRlZWUsIDB4NGY1NSwgMHg0ZjNkLCAweDRmYTEsCisgICAgMHg0ZjczLCAweDUyYTAsIDB4NTNlZiwgMHg1NjA5LCAweDU5MGYsIDB4NWFjMSwgMHg1YmI2LCAweDViZTEsCisgICAgMHg3OWQxLCAweDY2ODcsIDB4Njc5YywgMHg2N2I2LCAweDZiNGMsIDB4NmNiMywgMHg3MDZiLCAweDczYzIsCisgICAgMHg3OThkLCAweDc5YmUsIDB4N2EzYywgMHg3Yjg3LCAweDgyYjEsIDB4ODJkYiwgMHg4MzA0LCAweDgzNzcsCisgICAgMHg4M2VmLCAweDgzZDMsIDB4ODc2NiwgMHg4YWIyLCAweDU2MjksIDB4OGNhOCwgMHg4ZmU2LCAweDkwNGUsCisgICAgMHg5NzFlLCAweDg2OGEsIDB4NGZjNCwgMHg1Y2U4LCAweDYyMTEsIDB4NzI1OSwgMHg3NTNiLCAweDgxZTUsCisgICAgMHg4MmJkLCAweDg2ZmUsIDB4OGNjMCwgMHg5NmM1LCAweDk5MTMsIDB4OTlkNSwgMHg0ZWNiLCAweDRmMWEsCisgICAgMHg4OWUzLCAweDU2ZGUsIDB4NTg0YSwgMHg1OGNhLCAweDVlZmIsIDB4NWZlYiwgMHg2MDJhLCAweDYwOTQsCisgICAgMHg2MDYyLCAweDYxZDAsIDB4NjIxMiwgMHg2MmQwLCAweDY1MzksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YjQxLCAweDY2NjYsIDB4NjhiMCwgMHg2ZDc3LCAweDcwNzAsIDB4NzU0YywgMHg3Njg2LCAweDdkNzUsCisgICAgMHg4MmE1LCAweDg3ZjksIDB4OTU4YiwgMHg5NjhlLCAweDhjOWQsIDB4NTFmMSwgMHg1MmJlLCAweDU5MTYsCisgICAgMHg1NGIzLCAweDViYjMsIDB4NWQxNiwgMHg2MTY4LCAweDY5ODIsIDB4NmRhZiwgMHg3ODhkLCAweDg0Y2IsCisgICAgMHg4ODU3LCAweDhhNzIsIDB4OTNhNywgMHg5YWI4LCAweDZkNmMsIDB4OTlhOCwgMHg4NmQ5LCAweDU3YTMsCisgICAgMHg2N2ZmLCAweDg2Y2UsIDB4OTIwZSwgMHg1MjgzLCAweDU2ODcsIDB4NTQwNCwgMHg1ZWQzLCAweDYyZTEsCisgICAgMHg2NGI5LCAweDY4M2MsIDB4NjgzOCwgMHg2YmJiLCAweDczNzIsIDB4NzhiYSwgMHg3YTZiLCAweDg5OWEsCisgICAgMHg4OWQyLCAweDhkNmIsIDB4OGYwMywgMHg5MGVkLCAweDk1YTMsIDB4OTY5NCwgMHg5NzY5LCAweDViNjYsCisgICAgMHg1Y2IzLCAweDY5N2QsIDB4OTg0ZCwgMHg5ODRlLCAweDYzOWIsIDB4N2IyMCwgMHg2YTJiLCAweGZmZmQsCisgICAgMHg2YTdmLCAweDY4YjYsIDB4OWMwZCwgMHg2ZjVmLCAweDUyNzIsIDB4NTU5ZCwgMHg2MDcwLCAweDYyZWMsCisgICAgMHg2ZDNiLCAweDZlMDcsIDB4NmVkMSwgMHg4NDViLCAweDg5MTAsIDB4OGY0NCwgMHg0ZTE0LCAweDljMzksCisgICAgMHg1M2Y2LCAweDY5MWIsIDB4NmEzYSwgMHg5Nzg0LCAweDY4MmEsIDB4NTE1YywgMHg3YWMzLCAweDg0YjIsCisgICAgMHg5MWRjLCAweDkzOGMsIDB4NTY1YiwgMHg5ZDI4LCAweDY4MjIsIDB4ODMwNSwgMHg4NDMxLCAweDdjYTUsCisgICAgMHg1MjA4LCAweDgyYzUsIDB4NzRlNiwgMHg0ZTdlLCAweDRmODMsIDB4NTFhMCwgMHg1YmQyLCAweDUyMGEsCisgICAgMHg1MmQ4LCAweDUyZTcsIDB4NWRmYiwgMHg1NTlhLCAweDU4MmEsIDB4NTllNiwgMHg1YjhjLCAweDViOTgsCisgICAgMHg1YmRiLCAweDVlNzIsIDB4NWU3OSwgMHg2MGEzLCAweDYxMWYsIDB4NjE2MywgMHg2MWJlLCAweDYzZGIsCisgICAgMHg2NTYyLCAweDY3ZDEsIDB4Njg1MywgMHg2OGZhLCAweDZiM2UsIDB4NmI1MywgMHg2YzU3LCAweDZmMjIsCisgICAgMHg2Zjk3LCAweDZmNDUsIDB4NzRiMCwgMHg3NTE4LCAweDc2ZTMsIDB4NzcwYiwgMHg3YWZmLCAweDdiYTEsCisgICAgMHg3YzIxLCAweDdkZTksIDB4N2YzNiwgMHg3ZmYwLCAweDgwOWQsIDB4ODI2NiwgMHg4MzllLCAweDg5YjMsCisgICAgMHg4YWNjLCAweDhjYWIsIDB4OTA4NCwgMHg5NDUxLCAweDk1OTMsIDB4OTU5MSwgMHg5NWEyLCAweDk2NjUsCisgICAgMHg5N2QzLCAweDk5MjgsIDB4ODIxOCwgMHg0ZTM4LCAweDU0MmIsIDB4NWNiOCwgMHg1ZGNjLCAweDczYTksCisgICAgMHg3NjRjLCAweDc3M2MsIDB4NWNhOSwgMHg3ZmViLCAweDhkMGIsIDB4OTZjMSwgMHg5ODExLCAweDk4NTQsCisgICAgMHg5ODU4LCAweDRmMDEsIDB4NGYwZSwgMHg1MzcxLCAweDU1OWMsIDB4NTY2OCwgMHg1N2ZhLCAweDU5NDcsCisgICAgMHg1YjA5LCAweDViYzQsIDB4NWM5MCwgMHg1ZTBjLCAweDVlN2UsIDB4NWZjYywgMHg2M2VlLCAweDY3M2EsCisgICAgMHg2NWQ3LCAweDY1ZTIsIDB4NjcxZiwgMHg2OGNiLCAweDY4YzQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg2YTVmLCAweDVlMzAsIDB4NmJjNSwgMHg2YzE3LCAweDZjN2QsIDB4NzU3ZiwgMHg3OTQ4LCAweDViNjMsCisgICAgMHg3YTAwLCAweDdkMDAsIDB4NWZiZCwgMHg4OThmLCAweDhhMTgsIDB4OGNiNCwgMHg4ZDc3LCAweDhlY2MsCisgICAgMHg4ZjFkLCAweDk4ZTIsIDB4OWEwZSwgMHg5YjNjLCAweDRlODAsIDB4NTA3ZCwgMHg1MTAwLCAweDU5OTMsCisgICAgMHg1YjljLCAweDYyMmYsIDB4NjI4MCwgMHg2NGVjLCAweDZiM2EsIDB4NzJhMCwgMHg3NTkxLCAweDc5NDcsCisgICAgMHg3ZmE5LCAweDg3ZmIsIDB4OGFiYywgMHg4YjcwLCAweDYzYWMsIDB4ODNjYSwgMHg5N2EwLCAweDU0MDksCisgICAgMHg1NDAzLCAweDU1YWIsIDB4Njg1NCwgMHg2YTU4LCAweDhhNzAsIDB4NzgyNywgMHg2Nzc1LCAweDllY2QsCisgICAgMHg1Mzc0LCAweDViYTIsIDB4ODExYSwgMHg4NjUwLCAweDkwMDYsIDB4NGUxOCwgMHg0ZTQ1LCAweDRlYzcsCisgICAgMHg0ZjExLCAweDUzY2EsIDB4NTQzOCwgMHg1YmFlLCAweDVmMTMsIDB4NjAyNSwgMHg2NTUxLCAweGZmZmQsCisgICAgMHg2NzNkLCAweDZjNDIsIDB4NmM3MiwgMHg2Y2UzLCAweDcwNzgsIDB4NzQwMywgMHg3YTc2LCAweDdhYWUsCisgICAgMHg3YjA4LCAweDdkMWEsIDB4N2NmZSwgMHg3ZDY2LCAweDY1ZTcsIDB4NzI1YiwgMHg1M2JiLCAweDVjNDUsCisgICAgMHg1ZGU4LCAweDYyZDIsIDB4NjJlMCwgMHg2MzE5LCAweDZlMjAsIDB4ODY1YSwgMHg4YTMxLCAweDhkZGQsCisgICAgMHg5MmY4LCAweDZmMDEsIDB4NzlhNiwgMHg5YjVhLCAweDRlYTgsIDB4NGVhYiwgMHg0ZWFjLCAweDRmOWIsCisgICAgMHg0ZmEwLCAweDUwZDEsIDB4NTE0NywgMHg3YWY2LCAweDUxNzEsIDB4NTFmNiwgMHg1MzU0LCAweDUzMjEsCisgICAgMHg1MzdmLCAweDUzZWIsIDB4NTVhYywgMHg1ODgzLCAweDVjZTEsIDB4NWYzNywgMHg1ZjRhLCAweDYwMmYsCisgICAgMHg2MDUwLCAweDYwNmQsIDB4NjMxZiwgMHg2NTU5LCAweDZhNGIsIDB4NmNjMSwgMHg3MmMyLCAweDcyZWQsCisgICAgMHg3N2VmLCAweDgwZjgsIDB4ODEwNSwgMHg4MjA4LCAweDg1NGUsIDB4OTBmNywgMHg5M2UxLCAweDk3ZmYsCisgICAgMHg5OTU3LCAweDlhNWEsIDB4NGVmMCwgMHg1MWRkLCAweDVjMmQsIDB4NjY4MSwgMHg2OTZkLCAweDVjNDAsCisgICAgMHg2NmYyLCAweDY5NzUsIDB4NzM4OSwgMHg2ODUwLCAweDdjODEsIDB4NTBjNSwgMHg1MmU0LCAweDU3NDcsCisgICAgMHg1ZGZlLCAweDkzMjYsIDB4NjVhNCwgMHg2YjIzLCAweDZiM2QsIDB4NzQzNCwgMHg3OTgxLCAweDc5YmQsCisgICAgMHg3YjRiLCAweDdkY2EsIDB4ODJiOSwgMHg4M2NjLCAweDg4N2YsIDB4ODk1ZiwgMHg4YjM5LCAweDhmZDEsCisgICAgMHg5MWQxLCAweDU0MWYsIDB4OTI4MCwgMHg0ZTVkLCAweDUwMzYsIDB4NTNlNSwgMHg1MzNhLCAweDcyZDcsCisgICAgMHg3Mzk2LCAweDc3ZTksIDB4ODJlNiwgMHg4ZWFmLCAweDk5YzYsIDB4OTljOCwgMHg5OWQyLCAweDUxNzcsCisgICAgMHg2MTFhLCAweDg2NWUsIDB4NTViMCwgMHg3YTdhLCAweDUwNzYsIDB4NWJkMywgMHg5MDQ3LCAweDk2ODUsCisgICAgMHg0ZTMyLCAweDZhZGIsIDB4OTFlNywgMHg1YzUxLCAweDVjNDgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg2Mzk4LCAweDdhOWYsIDB4NmM5MywgMHg5Nzc0LCAweDhmNjEsIDB4N2FhYSwgMHg3MThhLCAweDk2ODgsCisgICAgMHg3YzgyLCAweDY4MTcsIDB4N2U3MCwgMHg2ODUxLCAweDkzNmMsIDB4NTJmMiwgMHg1NDFiLCAweDg1YWIsCisgICAgMHg4YTEzLCAweDdmYTQsIDB4OGVjZCwgMHg5MGUxLCAweDUzNjYsIDB4ODg4OCwgMHg3OTQxLCAweDRmYzIsCisgICAgMHg1MGJlLCAweDUyMTEsIDB4NTE0NCwgMHg1NTUzLCAweDU3MmQsIDB4NzNlYSwgMHg1NzhiLCAweDU5NTEsCisgICAgMHg1ZjYyLCAweDVmODQsIDB4NjA3NSwgMHg2MTc2LCAweDYxNjcsIDB4NjFhOSwgMHg2M2IyLCAweDY0M2EsCisgICAgMHg2NTZjLCAweDY2NmYsIDB4Njg0MiwgMHg2ZTEzLCAweDc1NjYsIDB4N2EzZCwgMHg3Y2ZiLCAweDdkNGMsCisgICAgMHg3ZDk5LCAweDdlNGIsIDB4N2Y2YiwgMHg4MzBlLCAweDgzNGEsIDB4ODZjZCwgMHg4YTA4LCAweDhhNjMsCisgICAgMHg4YjY2LCAweDhlZmQsIDB4OTgxYSwgMHg5ZDhmLCAweDgyYjgsIDB4OGZjZSwgMHg5YmU4LCAweGZmZmQsCisgICAgMHg1Mjg3LCAweDYyMWYsIDB4NjQ4MywgMHg2ZmMwLCAweDk2OTksIDB4Njg0MSwgMHg1MDkxLCAweDZiMjAsCisgICAgMHg2YzdhLCAweDZmNTQsIDB4N2E3NCwgMHg3ZDUwLCAweDg4NDAsIDB4OGEyMywgMHg2NzA4LCAweDRlZjYsCisgICAgMHg1MDM5LCAweDUwMjYsIDB4NTA2NSwgMHg1MTdjLCAweDUyMzgsIDB4NTI2MywgMHg1NWE3LCAweDU3MGYsCisgICAgMHg1ODA1LCAweDVhY2MsIDB4NWVmYSwgMHg2MWIyLCAweDYxZjgsIDB4NjJmMywgMHg2MzcyLCAweDY5MWMsCisgICAgMHg2YTI5LCAweDcyN2QsIDB4NzJhYywgMHg3MzJlLCAweDc4MTQsIDB4Nzg2ZiwgMHg3ZDc5LCAweDc3MGMsCisgICAgMHg4MGE5LCAweDg5OGIsIDB4OGIxOSwgMHg4Y2UyLCAweDhlZDIsIDB4OTA2MywgMHg5Mzc1LCAweDk2N2EsCisgICAgMHg5ODU1LCAweDlhMTMsIDB4OWU3OCwgMHg1MTQzLCAweDUzOWYsIDB4NTNiMywgMHg1ZTdiLCAweDVmMjYsCisgICAgMHg2ZTFiLCAweDZlOTAsIDB4NzM4NCwgMHg3M2ZlLCAweDdkNDMsIDB4ODIzNywgMHg4YTAwLCAweDhhZmEsCisgICAgMHg5NjUwLCAweDRlNGUsIDB4NTAwYiwgMHg1M2U0LCAweDU0N2MsIDB4NTZmYSwgMHg1OWQxLCAweDViNjQsCisgICAgMHg1ZGYxLCAweDVlYWIsIDB4NWYyNywgMHg2MjM4LCAweDY1NDUsIDB4NjdhZiwgMHg2ZTU2LCAweDcyZDAsCisgICAgMHg3Y2NhLCAweDg4YjQsIDB4ODBhMSwgMHg4MGUxLCAweDgzZjAsIDB4ODY0ZSwgMHg4YTg3LCAweDhkZTgsCisgICAgMHg5MjM3LCAweDk2YzcsIDB4OTg2NywgMHg5ZjEzLCAweDRlOTQsIDB4NGU5MiwgMHg0ZjBkLCAweDUzNDgsCisgICAgMHg1NDQ5LCAweDU0M2UsIDB4NWEyZiwgMHg1ZjhjLCAweDVmYTEsIDB4NjA5ZiwgMHg2OGE3LCAweDZhOGUsCisgICAgMHg3NDVhLCAweDc4ODEsIDB4OGE5ZSwgMHg4YWE0LCAweDhiNzcsIDB4OTE5MCwgMHg0ZTVlLCAweDliYzksCisgICAgMHg0ZWE0LCAweDRmN2MsIDB4NGZhZiwgMHg1MDE5LCAweDUwMTYsIDB4NTE0OSwgMHg1MTZjLCAweDUyOWYsCisgICAgMHg1MmI5LCAweDUyZmUsIDB4NTM5YSwgMHg1M2UzLCAweDU0MTEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg1NDBlLCAweDU1ODksIDB4NTc1MSwgMHg1N2EyLCAweDU5N2QsIDB4NWI1NCwgMHg1YjVkLCAweDViOGYsCisgICAgMHg1ZGU1LCAweDVkZTcsIDB4NWRmNywgMHg1ZTc4LCAweDVlODMsIDB4NWU5YSwgMHg1ZWI3LCAweDVmMTgsCisgICAgMHg2MDUyLCAweDYxNGMsIDB4NjI5NywgMHg2MmQ4LCAweDYzYTcsIDB4NjUzYiwgMHg2NjAyLCAweDY2NDMsCisgICAgMHg2NmY0LCAweDY3NmQsIDB4NjgyMSwgMHg2ODk3LCAweDY5Y2IsIDB4NmM1ZiwgMHg2ZDJhLCAweDZkNjksCisgICAgMHg2ZTJmLCAweDZlOWQsIDB4NzUzMiwgMHg3Njg3LCAweDc4NmMsIDB4N2EzZiwgMHg3Y2UwLCAweDdkMDUsCisgICAgMHg3ZDE4LCAweDdkNWUsIDB4N2RiMSwgMHg4MDE1LCAweDgwMDMsIDB4ODBhZiwgMHg4MGIxLCAweDgxNTQsCisgICAgMHg4MThmLCAweDgyMmEsIDB4ODM1MiwgMHg4ODRjLCAweDg4NjEsIDB4OGIxYiwgMHg4Y2EyLCAweDhjZmMsCisgICAgMHg5MGNhLCAweDkxNzUsIDB4OTI3MSwgMHg3ODNmLCAweDkyZmMsIDB4OTVhNCwgMHg5NjRkLCAweGZmZmQsCisgICAgMHg5ODA1LCAweDk5OTksIDB4OWFkOCwgMHg5ZDNiLCAweDUyNWIsIDB4NTJhYiwgMHg1M2Y3LCAweDU0MDgsCisgICAgMHg1OGQ1LCAweDYyZjcsIDB4NmZlMCwgMHg4YzZhLCAweDhmNWYsIDB4OWViOSwgMHg1MTRiLCAweDUyM2IsCisgICAgMHg1NDRhLCAweDU2ZmQsIDB4N2E0MCwgMHg5MTc3LCAweDlkNjAsIDB4OWVkMiwgMHg3MzQ0LCAweDZmMDksCisgICAgMHg4MTcwLCAweDc1MTEsIDB4NWZmZCwgMHg2MGRhLCAweDlhYTgsIDB4NzJkYiwgMHg4ZmJjLCAweDZiNjQsCisgICAgMHg5ODAzLCAweDRlY2EsIDB4NTZmMCwgMHg1NzY0LCAweDU4YmUsIDB4NWE1YSwgMHg2MDY4LCAweDYxYzcsCisgICAgMHg2NjBmLCAweDY2MDYsIDB4NjgzOSwgMHg2OGIxLCAweDZkZjcsIDB4NzVkNSwgMHg3ZDNhLCAweDgyNmUsCisgICAgMHg5YjQyLCAweDRlOWIsIDB4NGY1MCwgMHg1M2M5LCAweDU1MDYsIDB4NWQ2ZiwgMHg1ZGU2LCAweDVkZWUsCisgICAgMHg2N2ZiLCAweDZjOTksIDB4NzQ3MywgMHg3ODAyLCAweDhhNTAsIDB4OTM5NiwgMHg4OGRmLCAweDU3NTAsCisgICAgMHg1ZWE3LCAweDYzMmIsIDB4NTBiNSwgMHg1MGFjLCAweDUxOGQsIDB4NjcwMCwgMHg1NGM5LCAweDU4NWUsCisgICAgMHg1OWJiLCAweDViYjAsIDB4NWY2OSwgMHg2MjRkLCAweDYzYTEsIDB4NjgzZCwgMHg2YjczLCAweDZlMDgsCisgICAgMHg3MDdkLCAweDkxYzcsIDB4NzI4MCwgMHg3ODE1LCAweDc4MjYsIDB4Nzk2ZCwgMHg2NThlLCAweDdkMzAsCisgICAgMHg4M2RjLCAweDg4YzEsIDB4OGYwOSwgMHg5NjliLCAweDUyNjQsIDB4NTcyOCwgMHg2NzUwLCAweDdmNmEsCisgICAgMHg4Y2ExLCAweDUxYjQsIDB4NTc0MiwgMHg5NjJhLCAweDU4M2EsIDB4Njk4YSwgMHg4MGI0LCAweDU0YjIsCisgICAgMHg1ZDBlLCAweDU3ZmMsIDB4Nzg5NSwgMHg5ZGZhLCAweDRmNWMsIDB4NTI0YSwgMHg1NDhiLCAweDY0M2UsCisgICAgMHg2NjI4LCAweDY3MTQsIDB4NjdmNSwgMHg3YTg0LCAweDdiNTYsIDB4N2QyMiwgMHg5MzJmLCAweDY4NWMsCisgICAgMHg5YmFkLCAweDdiMzksIDB4NTMxOSwgMHg1MThhLCAweDUyMzcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg1YmRmLCAweDYyZjYsIDB4NjRhZSwgMHg2NGU2LCAweDY3MmQsIDB4NmJiYSwgMHg4NWE5LCAweDk2ZDEsCisgICAgMHg3NjkwLCAweDliZDYsIDB4NjM0YywgMHg5MzA2LCAweDliYWIsIDB4NzZiZiwgMHg2NjUyLCAweDRlMDksCisgICAgMHg1MDk4LCAweDUzYzIsIDB4NWM3MSwgMHg2MGU4LCAweDY0OTIsIDB4NjU2MywgMHg2ODVmLCAweDcxZTYsCisgICAgMHg3M2NhLCAweDc1MjMsIDB4N2I5NywgMHg3ZTgyLCAweDg2OTUsIDB4OGI4MywgMHg4Y2RiLCAweDkxNzgsCisgICAgMHg5OTEwLCAweDY1YWMsIDB4NjZhYiwgMHg2YjhiLCAweDRlZDUsIDB4NGVkNCwgMHg0ZjNhLCAweDRmN2YsCisgICAgMHg1MjNhLCAweDUzZjgsIDB4NTNmMiwgMHg1NWUzLCAweDU2ZGIsIDB4NThlYiwgMHg1OWNiLCAweDU5YzksCisgICAgMHg1OWZmLCAweDViNTAsIDB4NWM0ZCwgMHg1ZTAyLCAweDVlMmIsIDB4NWZkNywgMHg2MDFkLCAweDYzMDcsCisgICAgMHg2NTJmLCAweDViNWMsIDB4NjVhZiwgMHg2NWJkLCAweDY1ZTgsIDB4Njc5ZCwgMHg2YjYyLCAweGZmZmQsCisgICAgMHg2YjdiLCAweDZjMGYsIDB4NzM0NSwgMHg3OTQ5LCAweDc5YzEsIDB4N2NmOCwgMHg3ZDE5LCAweDdkMmIsCisgICAgMHg4MGEyLCAweDgxMDIsIDB4ODFmMywgMHg4OTk2LCAweDhhNWUsIDB4OGE2OSwgMHg4YTY2LCAweDhhOGMsCisgICAgMHg4YWVlLCAweDhjYzcsIDB4OGNkYywgMHg5NmNjLCAweDk4ZmMsIDB4NmI2ZiwgMHg0ZThiLCAweDRmM2MsCisgICAgMHg0ZjhkLCAweDUxNTAsIDB4NWI1NywgMHg1YmZhLCAweDYxNDgsIDB4NjMwMSwgMHg2NjQyLCAweDZiMjEsCisgICAgMHg2ZWNiLCAweDZjYmIsIDB4NzIzZSwgMHg3NGJkLCAweDc1ZDQsIDB4NzhjMSwgMHg3OTNhLCAweDgwMGMsCisgICAgMHg4MDMzLCAweDgxZWEsIDB4ODQ5NCwgMHg4ZjllLCAweDZjNTAsIDB4OWU3ZiwgMHg1ZjBmLCAweDhiNTgsCisgICAgMHg5ZDJiLCAweDdhZmEsIDB4OGVmOCwgMHg1YjhkLCAweDk2ZWIsIDB4NGUwMywgMHg1M2YxLCAweDU3ZjcsCisgICAgMHg1OTMxLCAweDVhYzksIDB4NWJhNCwgMHg2MDg5LCAweDZlN2YsIDB4NmYwNiwgMHg3NWJlLCAweDhjZWEsCisgICAgMHg1YjlmLCAweDg1MDAsIDB4N2JlMCwgMHg1MDcyLCAweDY3ZjQsIDB4ODI5ZCwgMHg1YzYxLCAweDg1NGEsCisgICAgMHg3ZTFlLCAweDgyMGUsIDB4NTE5OSwgMHg1YzA0LCAweDYzNjgsIDB4OGQ2NiwgMHg2NTljLCAweDcxNmUsCisgICAgMHg3OTNlLCAweDdkMTcsIDB4ODAwNSwgMHg4YjFkLCAweDhlY2EsIDB4OTA2ZSwgMHg4NmM3LCAweDkwYWEsCisgICAgMHg1MDFmLCAweDUyZmEsIDB4NWMzYSwgMHg2NzUzLCAweDcwN2MsIDB4NzIzNSwgMHg5MTRjLCAweDkxYzgsCisgICAgMHg5MzJiLCAweDgyZTUsIDB4NWJjMiwgMHg1ZjMxLCAweDYwZjksIDB4NGUzYiwgMHg1M2Q2LCAweDViODgsCisgICAgMHg2MjRiLCAweDY3MzEsIDB4NmI4YSwgMHg3MmU5LCAweDczZTAsIDB4N2EyZSwgMHg4MTZiLCAweDhkYTMsCisgICAgMHg5MTUyLCAweDk5OTYsIDB4NTExMiwgMHg1M2Q3LCAweDU0NmEsIDB4NWJmZiwgMHg2Mzg4LCAweDZhMzksCisgICAgMHg3ZGFjLCAweDk3MDAsIDB4NTZkYSwgMHg1M2NlLCAweDU0NjgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg1Yjk3LCAweDVjMzEsIDB4NWRkZSwgMHg0ZmVlLCAweDYxMDEsIDB4NjJmZSwgMHg2ZDMyLCAweDc5YzAsCisgICAgMHg3OWNiLCAweDdkNDIsIDB4N2U0ZCwgMHg3ZmQyLCAweDgxZWQsIDB4ODIxZiwgMHg4NDkwLCAweDg4NDYsCisgICAgMHg4OTcyLCAweDhiOTAsIDB4OGU3NCwgMHg4ZjJmLCAweDkwMzEsIDB4OTE0YiwgMHg5MTZjLCAweDk2YzYsCisgICAgMHg5MTljLCAweDRlYzAsIDB4NGY0ZiwgMHg1MTQ1LCAweDUzNDEsIDB4NWY5MywgMHg2MjBlLCAweDY3ZDQsCisgICAgMHg2YzQxLCAweDZlMGIsIDB4NzM2MywgMHg3ZTI2LCAweDkxY2QsIDB4OTI4MywgMHg1M2Q0LCAweDU5MTksCisgICAgMHg1YmJmLCAweDZkZDEsIDB4Nzk1ZCwgMHg3ZTJlLCAweDdjOWIsIDB4NTg3ZSwgMHg3MTlmLCAweDUxZmEsCisgICAgMHg4ODUzLCAweDhmZjAsIDB4NGZjYSwgMHg1Y2ZiLCAweDY2MjUsIDB4NzdhYywgMHg3YWUzLCAweDgyMWMsCisgICAgMHg5OWZmLCAweDUxYzYsIDB4NWZhYSwgMHg2NWVjLCAweDY5NmYsIDB4NmI4OSwgMHg2ZGYzLCAweGZmZmQsCisgICAgMHg2ZTk2LCAweDZmNjQsIDB4NzZmZSwgMHg3ZDE0LCAweDVkZTEsIDB4OTA3NSwgMHg5MTg3LCAweDk4MDYsCisgICAgMHg1MWU2LCAweDUyMWQsIDB4NjI0MCwgMHg2NjkxLCAweDY2ZDksIDB4NmUxYSwgMHg1ZWI2LCAweDdkZDIsCisgICAgMHg3ZjcyLCAweDY2ZjgsIDB4ODVhZiwgMHg4NWY3LCAweDhhZjgsIDB4NTJhOSwgMHg1M2Q5LCAweDU5NzMsCisgICAgMHg1ZThmLCAweDVmOTAsIDB4NjA1NSwgMHg5MmU0LCAweDk2NjQsIDB4NTBiNywgMHg1MTFmLCAweDUyZGQsCisgICAgMHg1MzIwLCAweDUzNDcsIDB4NTNlYywgMHg1NGU4LCAweDU1NDYsIDB4NTUzMSwgMHg1NjE3LCAweDU5NjgsCisgICAgMHg1OWJlLCAweDVhM2MsIDB4NWJiNSwgMHg1YzA2LCAweDVjMGYsIDB4NWMxMSwgMHg1YzFhLCAweDVlODQsCisgICAgMHg1ZThhLCAweDVlZTAsIDB4NWY3MCwgMHg2MjdmLCAweDYyODQsIDB4NjJkYiwgMHg2MzhjLCAweDYzNzcsCisgICAgMHg2NjA3LCAweDY2MGMsIDB4NjYyZCwgMHg2Njc2LCAweDY3N2UsIDB4NjhhMiwgMHg2YTFmLCAweDZhMzUsCisgICAgMHg2Y2JjLCAweDZkODgsIDB4NmUwOSwgMHg2ZTU4LCAweDcxM2MsIDB4NzEyNiwgMHg3MTY3LCAweDc1YzcsCisgICAgMHg3NzAxLCAweDc4NWQsIDB4NzkwMSwgMHg3OTY1LCAweDc5ZjAsIDB4N2FlMCwgMHg3YjExLCAweDdjYTcsCisgICAgMHg3ZDM5LCAweDgwOTYsIDB4ODNkNiwgMHg4NDhiLCAweDg1NDksIDB4ODg1ZCwgMHg4OGYzLCAweDhhMWYsCisgICAgMHg4YTNjLCAweDhhNTQsIDB4OGE3MywgMHg4YzYxLCAweDhjZGUsIDB4OTFhNCwgMHg5MjY2LCAweDkzN2UsCisgICAgMHg5NDE4LCAweDk2OWMsIDB4OTc5OCwgMHg0ZTBhLCAweDRlMDgsIDB4NGUxZSwgMHg0ZTU3LCAweDUxOTcsCisgICAgMHg1MjcwLCAweDU3Y2UsIDB4NTgzNCwgMHg1OGNjLCAweDViMjIsIDB4NWUzOCwgMHg2MGM1LCAweDY0ZmUsCisgICAgMHg2NzYxLCAweDY3NTYsIDB4NmQ0NCwgMHg3MmI2LCAweDc1NzMsIDB4N2E2MywgMHg4NGI4LCAweDhiNzIsCisgICAgMHg5MWI4LCAweDkzMjAsIDB4NTYzMSwgMHg1N2Y0LCAweDk4ZmUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg2MmVkLCAweDY5MGQsIDB4NmI5NiwgMHg3MWVkLCAweDdlNTQsIDB4ODA3NywgMHg4MjcyLCAweDg5ZTYsCisgICAgMHg5OGRmLCAweDg3NTUsIDB4OGZiMSwgMHg1YzNiLCAweDRmMzgsIDB4NGZlMSwgMHg0ZmI1LCAweDU1MDcsCisgICAgMHg1YTIwLCAweDViZGQsIDB4NWJlOSwgMHg1ZmMzLCAweDYxNGUsIDB4NjMyZiwgMHg2NWIwLCAweDY2NGIsCisgICAgMHg2OGVlLCAweDY5OWIsIDB4NmQ3OCwgMHg2ZGYxLCAweDc1MzMsIDB4NzViOSwgMHg3NzFmLCAweDc5NWUsCisgICAgMHg3OWU2LCAweDdkMzMsIDB4ODFlMywgMHg4MmFmLCAweDg1YWEsIDB4ODlhYSwgMHg4YTNhLCAweDhlYWIsCisgICAgMHg4ZjliLCAweDkwMzIsIDB4OTFkZCwgMHg5NzA3LCAweDRlYmEsIDB4NGVjMSwgMHg1MjAzLCAweDU4NzUsCisgICAgMHg1OGVjLCAweDVjMGIsIDB4NzUxYSwgMHg1YzNkLCAweDgxNGUsIDB4OGEwYSwgMHg4ZmM1LCAweDk2NjMsCisgICAgMHg5NzZkLCAweDdiMjUsIDB4OGFjZiwgMHg5ODA4LCAweDkxNjIsIDB4NTZmMywgMHg1M2E4LCAweGZmZmQsCisgICAgMHg5MDE3LCAweDU0MzksIDB4NTc4MiwgMHg1ZTI1LCAweDYzYTgsIDB4NmMzNCwgMHg3MDhhLCAweDc3NjEsCisgICAgMHg3YzhiLCAweDdmZTAsIDB4ODg3MCwgMHg5MDQyLCAweDkxNTQsIDB4OTMxMCwgMHg5MzE4LCAweDk2OGYsCisgICAgMHg3NDVlLCAweDlhYzQsIDB4NWQwNywgMHg1ZDY5LCAweDY1NzAsIDB4NjdhMiwgMHg4ZGE4LCAweDk2ZGIsCisgICAgMHg2MzZlLCAweDY3NDksIDB4NjkxOSwgMHg4M2M1LCAweDk4MTcsIDB4OTZjMCwgMHg4OGZlLCAweDZmODQsCisgICAgMHg2NDdhLCAweDViZjgsIDB4NGUxNiwgMHg3MDJjLCAweDc1NWQsIDB4NjYyZiwgMHg1MWM0LCAweDUyMzYsCisgICAgMHg1MmUyLCAweDU5ZDMsIDB4NWY4MSwgMHg2MDI3LCAweDYyMTAsIDB4NjUzZiwgMHg2NTc0LCAweDY2MWYsCisgICAgMHg2Njc0LCAweDY4ZjIsIDB4NjgxNiwgMHg2YjYzLCAweDZlMDUsIDB4NzI3MiwgMHg3NTFmLCAweDc2ZGIsCisgICAgMHg3Y2JlLCAweDgwNTYsIDB4NThmMCwgMHg4OGZkLCAweDg5N2YsIDB4OGFhMCwgMHg4YTkzLCAweDhhY2IsCisgICAgMHg5MDFkLCAweDkxOTIsIDB4OTc1MiwgMHg5NzU5LCAweDY1ODksIDB4N2EwZSwgMHg4MTA2LCAweDk2YmIsCisgICAgMHg1ZTJkLCAweDYwZGMsIDB4NjIxYSwgMHg2NWE1LCAweDY2MTQsIDB4Njc5MCwgMHg3N2YzLCAweDdhNGQsCisgICAgMHg3YzRkLCAweDdlM2UsIDB4ODEwYSwgMHg4Y2FjLCAweDhkNjQsIDB4OGRlMSwgMHg4ZTVmLCAweDc4YTksCisgICAgMHg1MjA3LCAweDYyZDksIDB4NjNhNSwgMHg2NDQyLCAweDYyOTgsIDB4OGEyZCwgMHg3YTgzLCAweDdiYzAsCisgICAgMHg4YWFjLCAweDk2ZWEsIDB4N2Q3NiwgMHg4MjBjLCAweDg3NDksIDB4NGVkOSwgMHg1MTQ4LCAweDUzNDMsCisgICAgMHg1MzYwLCAweDViYTMsIDB4NWMwMiwgMHg1YzE2LCAweDVkZGQsIDB4NjIyNiwgMHg2MjQ3LCAweDY0YjAsCisgICAgMHg2ODEzLCAweDY4MzQsIDB4NmNjOSwgMHg2ZDQ1LCAweDZkMTcsIDB4NjdkMywgMHg2ZjVjLCAweDcxNGUsCisgICAgMHg3MTdkLCAweDY1Y2IsIDB4N2E3ZiwgMHg3YmFkLCAweDdkZGEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg3ZTRhLCAweDdmYTgsIDB4ODE3YSwgMHg4MjFiLCAweDgyMzksIDB4ODVhNiwgMHg4YTZlLCAweDhjY2UsCisgICAgMHg4ZGY1LCAweDkwNzgsIDB4OTA3NywgMHg5MmFkLCAweDkyOTEsIDB4OTU4MywgMHg5YmFlLCAweDUyNGQsCisgICAgMHg1NTg0LCAweDZmMzgsIDB4NzEzNiwgMHg1MTY4LCAweDc5ODUsIDB4N2U1NSwgMHg4MWIzLCAweDdjY2UsCisgICAgMHg1NjRjLCAweDU4NTEsIDB4NWNhOCwgMHg2M2FhLCAweDY2ZmUsIDB4NjZmZCwgMHg2OTVhLCAweDcyZDksCisgICAgMHg3NThmLCAweDc1OGUsIDB4NzkwZSwgMHg3OTU2LCAweDc5ZGYsIDB4N2M5NywgMHg3ZDIwLCAweDdkNDQsCisgICAgMHg4NjA3LCAweDhhMzQsIDB4OTYzYiwgMHg5MDYxLCAweDlmMjAsIDB4NTBlNywgMHg1Mjc1LCAweDUzY2MsCisgICAgMHg1M2UyLCAweDUwMDksIDB4NTVhYSwgMHg1OGVlLCAweDU5NGYsIDB4NzIzZCwgMHg1YjhiLCAweDVjNjQsCisgICAgMHg1MzFkLCAweDYwZTMsIDB4NjBmMywgMHg2MzVjLCAweDYzODMsIDB4NjMzZiwgMHg2M2JiLCAweGZmZmQsCisgICAgMHg2NGNkLCAweDY1ZTksIDB4NjZmOSwgMHg1ZGUzLCAweDY5Y2QsIDB4NjlmZCwgMHg2ZjE1LCAweDcxZTUsCisgICAgMHg0ZTg5LCAweDc1ZTksIDB4NzZmOCwgMHg3YTkzLCAweDdjZGYsIDB4N2RjZiwgMHg3ZDljLCAweDgwNjEsCisgICAgMHg4MzQ5LCAweDgzNTgsIDB4ODQ2YywgMHg4NGJjLCAweDg1ZmIsIDB4ODhjNSwgMHg4ZDcwLCAweDkwMDEsCisgICAgMHg5MDZkLCAweDkzOTcsIDB4OTcxYywgMHg5YTEyLCAweDUwY2YsIDB4NTg5NywgMHg2MThlLCAweDgxZDMsCisgICAgMHg4NTM1LCAweDhkMDgsIDB4OTAyMCwgMHg0ZmMzLCAweDUwNzQsIDB4NTI0NywgMHg1MzczLCAweDYwNmYsCisgICAgMHg2MzQ5LCAweDY3NWYsIDB4NmUyYywgMHg4ZGIzLCAweDkwMWYsIDB4NGZkNywgMHg1YzVlLCAweDhjY2EsCisgICAgMHg2NWNmLCAweDdkOWEsIDB4NTM1MiwgMHg4ODk2LCAweDUxNzYsIDB4NjNjMywgMHg1YjU4LCAweDViNmIsCisgICAgMHg1YzBhLCAweDY0MGQsIDB4Njc1MSwgMHg5MDVjLCAweDRlZDYsIDB4NTkxYSwgMHg1OTJhLCAweDZjNzAsCisgICAgMHg4YTUxLCAweDU1M2UsIDB4NTgxNSwgMHg1OWE1LCAweDYwZjAsIDB4NjI1MywgMHg2N2MxLCAweDgyMzUsCisgICAgMHg2OTU1LCAweDk2NDAsIDB4OTljNCwgMHg5YTI4LCAweDRmNTMsIDB4NTgwNiwgMHg1YmZlLCAweDgwMTAsCisgICAgMHg1Y2IxLCAweDVlMmYsIDB4NWY4NSwgMHg2MDIwLCAweDYxNGIsIDB4NjIzNCwgMHg2NmZmLCAweDZjZjAsCisgICAgMHg2ZWRlLCAweDgwY2UsIDB4ODE3ZiwgMHg4MmQ0LCAweDg4OGIsIDB4OGNiOCwgMHg5MDAwLCAweDkwMmUsCisgICAgMHg5NjhhLCAweDllZGIsIDB4OWJkYiwgMHg0ZWUzLCAweDUzZjAsIDB4NTkyNywgMHg3YjJjLCAweDkxOGQsCisgICAgMHg5ODRjLCAweDlkZjksIDB4NmVkZCwgMHg3MDI3LCAweDUzNTMsIDB4NTU0NCwgMHg1Yjg1LCAweDYyNTgsCisgICAgMHg2MjllLCAweDYyZDMsIDB4NmNhMiwgMHg2ZmVmLCAweDc0MjIsIDB4OGExNywgMHg5NDM4LCAweDZmYzEsCisgICAgMHg4YWZlLCAweDgzMzgsIDB4NTFlNywgMHg4NmY4LCAweDUzZWEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg1M2U5LCAweDRmNDYsIDB4OTA1NCwgMHg4ZmIwLCAweDU5NmEsIDB4ODEzMSwgMHg1ZGZkLCAweDdhZWEsCisgICAgMHg4ZmJmLCAweDY4ZGEsIDB4OGMzNywgMHg3MmY4LCAweDljNDgsIDB4NmEzZCwgMHg4YWIwLCAweDRlMzksCisgICAgMHg1MzU4LCAweDU2MDYsIDB4NTc2NiwgMHg2MmM1LCAweDYzYTIsIDB4NjVlNiwgMHg2YjRlLCAweDZkZTEsCisgICAgMHg2ZTViLCAweDcwYWQsIDB4NzdlZCwgMHg3YWVmLCAweDdiYWEsIDB4N2RiYiwgMHg4MDNkLCAweDgwYzYsCisgICAgMHg4NmNiLCAweDhhOTUsIDB4OTM1YiwgMHg1NmUzLCAweDU4YzcsIDB4NWYzZSwgMHg2NWFkLCAweDY2OTYsCisgICAgMHg2YTgwLCAweDZiYjUsIDB4NzUzNywgMHg4YWM3LCAweDUwMjQsIDB4NzdlNSwgMHg1NzMwLCAweDVmMWIsCisgICAgMHg2MDY1LCAweDY2N2EsIDB4NmM2MCwgMHg3NWY0LCAweDdhMWEsIDB4N2Y2ZSwgMHg4MWY0LCAweDg3MTgsCisgICAgMHg5MDQ1LCAweDk5YjMsIDB4N2JjOSwgMHg3NTVjLCAweDdhZjksIDB4N2I1MSwgMHg4NGM0LCAweGZmZmQsCisgICAgMHg5MDEwLCAweDc5ZTksIDB4N2E5MiwgMHg4MzM2LCAweDVhZTEsIDB4Nzc0MCwgMHg0ZTJkLCAweDRlZjIsCisgICAgMHg1Yjk5LCAweDVmZTAsIDB4NjJiZCwgMHg2NjNjLCAweDY3ZjEsIDB4NmNlOCwgMHg4NjZiLCAweDg4NzcsCisgICAgMHg4YTNiLCAweDkxNGUsIDB4OTJmMywgMHg5OWQwLCAweDZhMTcsIDB4NzAyNiwgMHg3MzJhLCAweDgyZTcsCisgICAgMHg4NDU3LCAweDhjYWYsIDB4NGUwMSwgMHg1MTQ2LCAweDUxY2IsIDB4NTU4YiwgMHg1YmY1LCAweDVlMTYsCisgICAgMHg1ZTMzLCAweDVlODEsIDB4NWYxNCwgMHg1ZjM1LCAweDVmNmIsIDB4NWZiNCwgMHg2MWYyLCAweDYzMTEsCisgICAgMHg2NmEyLCAweDY3MWQsIDB4NmY2ZSwgMHg3MjUyLCAweDc1M2EsIDB4NzczYSwgMHg4MDc0LCAweDgxMzksCisgICAgMHg4MTc4LCAweDg3NzYsIDB4OGFiZiwgMHg4YWRjLCAweDhkODUsIDB4OGRmMywgMHg5MjlhLCAweDk1NzcsCisgICAgMHg5ODAyLCAweDljZTUsIDB4NTJjNSwgMHg2MzU3LCAweDc2ZjQsIDB4NjcxNSwgMHg2Yzg4LCAweDczY2QsCisgICAgMHg4Y2MzLCAweDkzYWUsIDB4OTY3MywgMHg2ZDI1LCAweDU4OWMsIDB4NjkwZSwgMHg2OWNjLCAweDhmZmQsCisgICAgMHg5MzlhLCAweDc1ZGIsIDB4OTAxYSwgMHg1ODVhLCAweDY4MDIsIDB4NjNiNCwgMHg2OWZiLCAweDRmNDMsCisgICAgMHg2ZjJjLCAweDY3ZDgsIDB4OGZiYiwgMHg4NTI2LCAweDdkYjQsIDB4OTM1NCwgMHg2OTNmLCAweDZmNzAsCisgICAgMHg1NzZhLCAweDU4ZjcsIDB4NWIyYywgMHg3ZDJjLCAweDcyMmEsIDB4NTQwYSwgMHg5MWUzLCAweDlkYjQsCisgICAgMHg0ZWFkLCAweDRmNGUsIDB4NTA1YywgMHg1MDc1LCAweDUyNDMsIDB4OGM5ZSwgMHg1NDQ4LCAweDU4MjQsCisgICAgMHg1YjlhLCAweDVlMWQsIDB4NWU5NSwgMHg1ZWFkLCAweDVlZjcsIDB4NWYxZiwgMHg2MDhjLCAweDYyYjUsCisgICAgMHg2MzNhLCAweDYzZDAsIDB4NjhhZiwgMHg2YzQwLCAweDc4ODcsIDB4Nzk4ZSwgMHg3YTBiLCAweDdkZTAsCisgICAgMHg4MjQ3LCAweDhhMDIsIDB4OGFlNiwgMHg4ZTQ0LCAweDkwMTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MGI4LCAweDkxMmQsIDB4OTFkOCwgMHg5ZjBlLCAweDZjZTUsIDB4NjQ1OCwgMHg2NGUyLCAweDY1NzUsCisgICAgMHg2ZWY0LCAweDc2ODQsIDB4N2IxYiwgMHg5MDY5LCAweDkzZDEsIDB4NmViYSwgMHg1NGYyLCAweDVmYjksCisgICAgMHg2NGE0LCAweDhmNGQsIDB4OGZlZCwgMHg5MjQ0LCAweDUxNzgsIDB4NTg2YiwgMHg1OTI5LCAweDVjNTUsCisgICAgMHg1ZTk3LCAweDZkZmIsIDB4N2U4ZiwgMHg3NTFjLCAweDhjYmMsIDB4OGVlMiwgMHg5ODViLCAweDcwYjksCisgICAgMHg0ZjFkLCAweDZiYmYsIDB4NmZiMSwgMHg3NTMwLCAweDk2ZmIsIDB4NTE0ZSwgMHg1NDEwLCAweDU4MzUsCisgICAgMHg1ODU3LCAweDU5YWMsIDB4NWM2MCwgMHg1ZjkyLCAweDY1OTcsIDB4Njc1YywgMHg2ZTIxLCAweDc2N2IsCisgICAgMHg4M2RmLCAweDhjZWQsIDB4OTAxNCwgMHg5MGZkLCAweDkzNGQsIDB4NzgyNSwgMHg3ODNhLCAweDUyYWEsCisgICAgMHg1ZWE2LCAweDU3MWYsIDB4NTk3NCwgMHg2MDEyLCAweDUwMTIsIDB4NTE1YSwgMHg1MWFjLCAweGZmZmQsCisgICAgMHg1MWNkLCAweDUyMDAsIDB4NTUxMCwgMHg1ODU0LCAweDU4NTgsIDB4NTk1NywgMHg1Yjk1LCAweDVjZjYsCisgICAgMHg1ZDhiLCAweDYwYmMsIDB4NjI5NSwgMHg2NDJkLCAweDY3NzEsIDB4Njg0MywgMHg2OGJjLCAweDY4ZGYsCisgICAgMHg3NmQ3LCAweDZkZDgsIDB4NmU2ZiwgMHg2ZDliLCAweDcwNmYsIDB4NzFjOCwgMHg1ZjUzLCAweDc1ZDgsCisgICAgMHg3OTc3LCAweDdiNDksIDB4N2I1NCwgMHg3YjUyLCAweDdjZDYsIDB4N2Q3MSwgMHg1MjMwLCAweDg0NjMsCisgICAgMHg4NTY5LCAweDg1ZTQsIDB4OGEwZSwgMHg4YjA0LCAweDhjNDYsIDB4OGUwZiwgMHg5MDAzLCAweDkwMGYsCisgICAgMHg5NDE5LCAweDk2NzYsIDB4OTgyZCwgMHg5YTMwLCAweDk1ZDgsIDB4NTBjZCwgMHg1MmQ1LCAweDU0MGMsCisgICAgMHg1ODAyLCAweDVjMGUsIDB4NjFhNywgMHg2NDllLCAweDZkMWUsIDB4NzdiMywgMHg3YWU1LCAweDgwZjQsCisgICAgMHg4NDA0LCAweDkwNTMsIDB4OTI4NSwgMHg1Y2UwLCAweDlkMDcsIDB4NTMzZiwgMHg1Zjk3LCAweDVmYjMsCisgICAgMHg2ZDljLCAweDcyNzksIDB4Nzc2MywgMHg3OWJmLCAweDdiZTQsIDB4NmJkMiwgMHg3MmVjLCAweDhhYWQsCisgICAgMHg2ODAzLCAweDZhNjEsIDB4NTFmOCwgMHg3YTgxLCAweDY5MzQsIDB4NWM0YSwgMHg5Y2Y2LCAweDgyZWIsCisgICAgMHg1YmM1LCAweDkxNDksIDB4NzAxZSwgMHg1Njc4LCAweDVjNmYsIDB4NjBjNywgMHg2NTY2LCAweDZjOGMsCisgICAgMHg4YzVhLCAweDkwNDEsIDB4OTgxMywgMHg1NDUxLCAweDY2YzcsIDB4OTIwZCwgMHg1OTQ4LCAweDkwYTMsCisgICAgMHg1MTg1LCAweDRlNGQsIDB4NTFlYSwgMHg4NTk5LCAweDhiMGUsIDB4NzA1OCwgMHg2MzdhLCAweDkzNGIsCisgICAgMHg2OTYyLCAweDk5YjQsIDB4N2UwNCwgMHg3NTc3LCAweDUzNTcsIDB4Njk2MCwgMHg4ZWRmLCAweDk2ZTMsCisgICAgMHg2YzVkLCAweDRlOGMsIDB4NWMzYywgMHg1ZjEwLCAweDhmZTksIDB4NTMwMiwgMHg4Y2QxLCAweDgwODksCisgICAgMHg4Njc5LCAweDVlZmYsIDB4NjVlNSwgMHg0ZTczLCAweDUxNjUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg1OTgyLCAweDVjM2YsIDB4OTdlZSwgMHg0ZWZiLCAweDU5OGEsIDB4NWZjZCwgMHg4YThkLCAweDZmZTEsCisgICAgMHg3OWIwLCAweDc5NjIsIDB4NWJlNywgMHg4NDcxLCAweDczMmIsIDB4NzFiMSwgMHg1ZTc0LCAweDVmZjUsCisgICAgMHg2MzdiLCAweDY0OWEsIDB4NzFjMywgMHg3Yzk4LCAweDRlNDMsIDB4NWVmYywgMHg0ZTRiLCAweDU3ZGMsCisgICAgMHg1NmEyLCAweDYwYTksIDB4NmZjMywgMHg3ZDBkLCAweDgwZmQsIDB4ODEzMywgMHg4MWJmLCAweDhmYjIsCisgICAgMHg4OTk3LCAweDg2YTQsIDB4NWRmNCwgMHg2MjhhLCAweDY0YWQsIDB4ODk4NywgMHg2Nzc3LCAweDZjZTIsCisgICAgMHg2ZDNlLCAweDc0MzYsIDB4NzgzNCwgMHg1YTQ2LCAweDdmNzUsIDB4ODJhZCwgMHg5OWFjLCAweDRmZjMsCisgICAgMHg1ZWMzLCAweDYyZGQsIDB4NjM5MiwgMHg2NTU3LCAweDY3NmYsIDB4NzZjMywgMHg3MjRjLCAweDgwY2MsCisgICAgMHg4MGJhLCAweDhmMjksIDB4OTE0ZCwgMHg1MDBkLCAweDU3ZjksIDB4NWE5MiwgMHg2ODg1LCAweGZmZmQsCisgICAgMHg2OTczLCAweDcxNjQsIDB4NzJmZCwgMHg4Y2I3LCAweDU4ZjIsIDB4OGNlMCwgMHg5NjZhLCAweDkwMTksCisgICAgMHg4NzdmLCAweDc5ZTQsIDB4NzdlNywgMHg4NDI5LCAweDRmMmYsIDB4NTI2NSwgMHg1MzVhLCAweDYyY2QsCisgICAgMHg2N2NmLCAweDZjY2EsIDB4NzY3ZCwgMHg3Yjk0LCAweDdjOTUsIDB4ODIzNiwgMHg4NTg0LCAweDhmZWIsCisgICAgMHg2NmRkLCAweDZmMjAsIDB4NzIwNiwgMHg3ZTFiLCAweDgzYWIsIDB4OTljMSwgMHg5ZWE2LCAweDUxZmQsCisgICAgMHg3YmIxLCAweDc4NzIsIDB4N2JiOCwgMHg4MDg3LCAweDdiNDgsIDB4NmFlOCwgMHg1ZTYxLCAweDgwOGMsCisgICAgMHg3NTUxLCAweDc1NjAsIDB4NTE2YiwgMHg5MjYyLCAweDZlOGMsIDB4NzY3YSwgMHg5MTk3LCAweDlhZWEsCisgICAgMHg0ZjEwLCAweDdmNzAsIDB4NjI5YywgMHg3YjRmLCAweDk1YTUsIDB4OWNlOSwgMHg1NjdhLCAweDU4NTksCisgICAgMHg4NmU0LCAweDk2YmMsIDB4NGYzNCwgMHg1MjI0LCAweDUzNGEsIDB4NTNjZCwgMHg1M2RiLCAweDVlMDYsCisgICAgMHg2NDJjLCAweDY1OTEsIDB4Njc3ZiwgMHg2YzNlLCAweDZjNGUsIDB4NzI0OCwgMHg3MmFmLCAweDczZWQsCisgICAgMHg3NTU0LCAweDdlNDEsIDB4ODIyYywgMHg4NWU5LCAweDhjYTksIDB4N2JjNCwgMHg5MWM2LCAweDcxNjksCisgICAgMHg5ODEyLCAweDk4ZWYsIDB4NjMzZCwgMHg2NjY5LCAweDc1NmEsIDB4NzZlNCwgMHg3OGQwLCAweDg1NDMsCisgICAgMHg4NmVlLCAweDUzMmEsIDB4NTM1MSwgMHg1NDI2LCAweDU5ODMsIDB4NWU4NywgMHg1ZjdjLCAweDYwYjIsCisgICAgMHg2MjQ5LCAweDYyNzksIDB4NjJhYiwgMHg2NTkwLCAweDZiZDQsIDB4NmNjYywgMHg3NWIyLCAweDc2YWUsCisgICAgMHg3ODkxLCAweDc5ZDgsIDB4N2RjYiwgMHg3Zjc3LCAweDgwYTUsIDB4ODhhYiwgMHg4YWI5LCAweDhjYmIsCisgICAgMHg5MDdmLCAweDk3NWUsIDB4OThkYiwgMHg2YTBiLCAweDdjMzgsIDB4NTA5OSwgMHg1YzNlLCAweDVmYWUsCisgICAgMHg2Nzg3LCAweDZiZDgsIDB4NzQzNSwgMHg3NzA5LCAweDdmOGUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZjNiLCAweDY3Y2EsIDB4N2ExNywgMHg1MzM5LCAweDc1OGIsIDB4OWFlZCwgMHg1ZjY2LCAweDgxOWQsCisgICAgMHg4M2YxLCAweDgwOTgsIDB4NWYzYywgMHg1ZmM1LCAweDc1NjIsIDB4N2I0NiwgMHg5MDNjLCAweDY4NjcsCisgICAgMHg1OWViLCAweDVhOWIsIDB4N2QxMCwgMHg3NjdlLCAweDhiMmMsIDB4NGZmNSwgMHg1ZjZhLCAweDZhMTksCisgICAgMHg2YzM3LCAweDZmMDIsIDB4NzRlMiwgMHg3OTY4LCAweDg4NjgsIDB4OGE1NSwgMHg4Yzc5LCAweDVlZGYsCisgICAgMHg2M2NmLCAweDc1YzUsIDB4NzlkMiwgMHg4MmQ3LCAweDkzMjgsIDB4OTJmMiwgMHg4NDljLCAweDg2ZWQsCisgICAgMHg5YzJkLCAweDU0YzEsIDB4NWY2YywgMHg2NThjLCAweDZkNWMsIDB4NzAxNSwgMHg4Y2E3LCAweDhjZDMsCisgICAgMHg5ODNiLCAweDY1NGYsIDB4NzRmNiwgMHg0ZTBkLCAweDRlZDgsIDB4NTdlMCwgMHg1OTJiLCAweDVhNjYsCisgICAgMHg1YmNjLCAweDUxYTgsIDB4NWUwMywgMHg1ZTljLCAweDYwMTYsIDB4NjI3NiwgMHg2NTc3LCAweGZmZmQsCisgICAgMHg2NWE3LCAweDY2NmUsIDB4NmQ2ZSwgMHg3MjM2LCAweDdiMjYsIDB4ODE1MCwgMHg4MTlhLCAweDgyOTksCisgICAgMHg4YjVjLCAweDhjYTAsIDB4OGNlNiwgMHg4ZDc0LCAweDk2MWMsIDB4OTY0NCwgMHg0ZmFlLCAweDY0YWIsCisgICAgMHg2YjY2LCAweDgyMWUsIDB4ODQ2MSwgMHg4NTZhLCAweDkwZTgsIDB4NWMwMSwgMHg2OTUzLCAweDk4YTgsCisgICAgMHg4NDdhLCAweDg1NTcsIDB4NGYwZiwgMHg1MjZmLCAweDVmYTksIDB4NWU0NSwgMHg2NzBkLCAweDc5OGYsCisgICAgMHg4MTc5LCAweDg5MDcsIDB4ODk4NiwgMHg2ZGY1LCAweDVmMTcsIDB4NjI1NSwgMHg2Y2I4LCAweDRlY2YsCisgICAgMHg3MjY5LCAweDliOTIsIDB4NTIwNiwgMHg1NDNiLCAweDU2NzQsIDB4NThiMywgMHg2MWE0LCAweDYyNmUsCisgICAgMHg3MTFhLCAweDU5NmUsIDB4N2M4OSwgMHg3Y2RlLCAweDdkMWIsIDB4OTZmMCwgMHg2NTg3LCAweDgwNWUsCisgICAgMHg0ZTE5LCAweDRmNzUsIDB4NTE3NSwgMHg1ODQwLCAweDVlNjMsIDB4NWU3MywgMHg1ZjBhLCAweDY3YzQsCisgICAgMHg0ZTI2LCAweDg1M2QsIDB4OTU4OSwgMHg5NjViLCAweDdjNzMsIDB4OTgwMSwgMHg1MGZiLCAweDU4YzEsCisgICAgMHg3NjU2LCAweDc4YTcsIDB4NTIyNSwgMHg3N2E1LCAweDg1MTEsIDB4N2I4NiwgMHg1MDRmLCAweDU5MDksCisgICAgMHg3MjQ3LCAweDdiYzcsIDB4N2RlOCwgMHg4ZmJhLCAweDhmZDQsIDB4OTA0ZCwgMHg0ZmJmLCAweDUyYzksCisgICAgMHg1YTI5LCAweDVmMDEsIDB4OTdhZCwgMHg0ZmRkLCAweDgyMTcsIDB4OTJlYSwgMHg1NzAzLCAweDYzNTUsCisgICAgMHg2YjY5LCAweDc1MmIsIDB4ODhkYywgMHg4ZjE0LCAweDdhNDIsIDB4NTJkZiwgMHg1ODkzLCAweDYxNTUsCisgICAgMHg2MjBhLCAweDY2YWUsIDB4NmJjZCwgMHg3YzNmLCAweDgzZTksIDB4NTAyMywgMHg0ZmY4LCAweDUzMDUsCisgICAgMHg1NDQ2LCAweDU4MzEsIDB4NTk0OSwgMHg1YjlkLCAweDVjZjAsIDB4NWNlZiwgMHg1ZDI5LCAweDVlOTYsCisgICAgMHg2MmIxLCAweDYzNjcsIDB4NjUzZSwgMHg2NWI5LCAweDY3MGIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg2Y2Q1LCAweDZjZTEsIDB4NzBmOSwgMHg3ODMyLCAweDdlMmIsIDB4ODBkZSwgMHg4MmIzLCAweDg0MGMsCisgICAgMHg4NGVjLCAweDg3MDIsIDB4ODkxMiwgMHg4YTJhLCAweDhjNGEsIDB4OTBhNiwgMHg5MmQyLCAweDk4ZmQsCisgICAgMHg5Y2YzLCAweDlkNmMsIDB4NGU0ZiwgMHg0ZWExLCAweDUwOGQsIDB4NTI1NiwgMHg1NzRhLCAweDU5YTgsCisgICAgMHg1ZTNkLCAweDVmZDgsIDB4NWZkOSwgMHg2MjNmLCAweDY2YjQsIDB4NjcxYiwgMHg2N2QwLCAweDY4ZDIsCisgICAgMHg1MTkyLCAweDdkMjEsIDB4ODBhYSwgMHg4MWE4LCAweDhiMDAsIDB4OGM4YywgMHg4Y2JmLCAweDkyN2UsCisgICAgMHg5NjMyLCAweDU0MjAsIDB4OTgyYywgMHg1MzE3LCAweDUwZDUsIDB4NTM1YywgMHg1OGE4LCAweDY0YjIsCisgICAgMHg2NzM0LCAweDcyNjcsIDB4Nzc2NiwgMHg3YTQ2LCAweDkxZTYsIDB4NTJjMywgMHg2Y2ExLCAweDZiODYsCisgICAgMHg1ODAwLCAweDVlNGMsIDB4NTk1NCwgMHg2NzJjLCAweDdmZmIsIDB4NTFlMSwgMHg3NmM2LCAweGZmZmQsCisgICAgMHg2NDY5LCAweDc4ZTgsIDB4OWI1NCwgMHg5ZWJiLCAweDU3Y2IsIDB4NTliOSwgMHg2NjI3LCAweDY3OWEsCisgICAgMHg2YmNlLCAweDU0ZTksIDB4NjlkOSwgMHg1ZTU1LCAweDgxOWMsIDB4Njc5NSwgMHg5YmFhLCAweDY3ZmUsCisgICAgMHg5YzUyLCAweDY4NWQsIDB4NGVhNiwgMHg0ZmUzLCAweDUzYzgsIDB4NjJiOSwgMHg2NzJiLCAweDZjYWIsCisgICAgMHg4ZmM0LCAweDRmYWQsIDB4N2U2ZCwgMHg5ZWJmLCAweDRlMDcsIDB4NjE2MiwgMHg2ZTgwLCAweDZmMmIsCisgICAgMHg4NTEzLCAweDU0NzMsIDB4NjcyYSwgMHg5YjQ1LCAweDVkZjMsIDB4N2I5NSwgMHg1Y2FjLCAweDViYzYsCisgICAgMHg4NzFjLCAweDZlNGEsIDB4ODRkMSwgMHg3YTE0LCAweDgxMDgsIDB4NTk5OSwgMHg3YzhkLCAweDZjMTEsCisgICAgMHg3NzIwLCAweDUyZDksIDB4NTkyMiwgMHg3MTIxLCAweDcyNWYsIDB4NzdkYiwgMHg5NzI3LCAweDlkNjEsCisgICAgMHg2OTBiLCAweDVhN2YsIDB4NWExOCwgMHg1MWE1LCAweDU0MGQsIDB4NTQ3ZCwgMHg2NjBlLCAweDc2ZGYsCisgICAgMHg4ZmY3LCAweDkyOTgsIDB4OWNmNCwgMHg1OWVhLCAweDcyNWQsIDB4NmVjNSwgMHg1MTRkLCAweDY4YzksCisgICAgMHg3ZGJmLCAweDdkZWMsIDB4OTc2MiwgMHg5ZWJhLCAweDY0NzgsIDB4NmEyMSwgMHg4MzAyLCAweDU5ODQsCisgICAgMHg1YjVmLCAweDZiZGIsIDB4NzMxYiwgMHg3NmYyLCAweDdkYjIsIDB4ODAxNywgMHg4NDk5LCAweDUxMzIsCisgICAgMHg2NzI4LCAweDllZDksIDB4NzZlZSwgMHg2NzYyLCAweDUyZmYsIDB4OTkwNSwgMHg1YzI0LCAweDYyM2IsCisgICAgMHg3YzdlLCAweDhjYjAsIDB4NTU0ZiwgMHg2MGI2LCAweDdkMGIsIDB4OTU4MCwgMHg1MzAxLCAweDRlNWYsCisgICAgMHg1MWI2LCAweDU5MWMsIDB4NzIzYSwgMHg4MDM2LCAweDkxY2UsIDB4NWYyNSwgMHg3N2UyLCAweDUzODQsCisgICAgMHg1Zjc5LCAweDdkMDQsIDB4ODVhYywgMHg4YTMzLCAweDhlOGQsIDB4OTc1NiwgMHg2N2YzLCAweDg1YWUsCisgICAgMHg5NDUzLCAweDYxMDksIDB4NjEwOCwgMHg2Y2I5LCAweDc2NTIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YWVkLCAweDhmMzgsIDB4NTUyZiwgMHg0ZjUxLCAweDUxMmEsIDB4NTJjNywgMHg1M2NiLCAweDViYTUsCisgICAgMHg1ZTdkLCAweDYwYTAsIDB4NjE4MiwgMHg2M2Q2LCAweDY3MDksIDB4NjdkYSwgMHg2ZTY3LCAweDZkOGMsCisgICAgMHg3MzM2LCAweDczMzcsIDB4NzUzMSwgMHg3OTUwLCAweDg4ZDUsIDB4OGE5OCwgMHg5MDRhLCAweDkwOTEsCisgICAgMHg5MGY1LCAweDk2YzQsIDB4ODc4ZCwgMHg1OTE1LCAweDRlODgsIDB4NGY1OSwgMHg0ZTBlLCAweDhhODksCisgICAgMHg4ZjNmLCAweDk4MTAsIDB4NTBhZCwgMHg1ZTdjLCAweDU5OTYsIDB4NWJiOSwgMHg1ZWI4LCAweDYzZGEsCisgICAgMHg2M2ZhLCAweDY0YzEsIDB4NjZkYywgMHg2OTRhLCAweDY5ZDgsIDB4NmQwYiwgMHg2ZWI2LCAweDcxOTQsCisgICAgMHg3NTI4LCAweDdhYWYsIDB4N2Y4YSwgMHg4MDAwLCAweDg0NDksIDB4ODRjOSwgMHg4OTgxLCAweDhiMjEsCisgICAgMHg4ZTBhLCAweDkwNjUsIDB4OTY3ZCwgMHg5OTBhLCAweDYxN2UsIDB4NjI5MSwgMHg2YjMyLCAweGZmZmQsCisgICAgMHg2YzgzLCAweDZkNzQsIDB4N2ZjYywgMHg3ZmZjLCAweDZkYzAsIDB4N2Y4NSwgMHg4N2JhLCAweDg4ZjgsCisgICAgMHg2NzY1LCAweDgzYjEsIDB4OTgzYywgMHg5NmY3LCAweDZkMWIsIDB4N2Q2MSwgMHg4NDNkLCAweDkxNmEsCisgICAgMHg0ZTcxLCAweDUzNzUsIDB4NWQ1MCwgMHg2YjA0LCAweDZmZWIsIDB4ODVjZCwgMHg4NjJkLCAweDg5YTcsCisgICAgMHg1MjI5LCAweDU0MGYsIDB4NWM2NSwgMHg2NzRlLCAweDY4YTgsIDB4NzQwNiwgMHg3NDgzLCAweDc1ZTIsCisgICAgMHg4OGNmLCAweDg4ZTEsIDB4OTFjYywgMHg5NmUyLCAweDk2NzgsIDB4NWY4YiwgMHg3Mzg3LCAweDdhY2IsCisgICAgMHg4NDRlLCAweDYzYTAsIDB4NzU2NSwgMHg1Mjg5LCAweDZkNDEsIDB4NmU5YywgMHg3NDA5LCAweDc1NTksCisgICAgMHg3ODZiLCAweDdjOTIsIDB4OTY4NiwgMHg3YWRjLCAweDlmOGQsIDB4NGZiNiwgMHg2MTZlLCAweDY1YzUsCisgICAgMHg4NjVjLCAweDRlODYsIDB4NGVhZSwgMHg1MGRhLCAweDRlMjEsIDB4NTFjYywgMHg1YmVlLCAweDY1OTksCisgICAgMHg2ODgxLCAweDZkYmMsIDB4NzMxZiwgMHg3NjQyLCAweDc3YWQsIDB4N2ExYywgMHg3Y2U3LCAweDgyNmYsCisgICAgMHg4YWQyLCAweDkwN2MsIDB4OTFjZiwgMHg5Njc1LCAweDk4MTgsIDB4NTI5YiwgMHg3ZGQxLCAweDUwMmIsCisgICAgMHg1Mzk4LCAweDY3OTcsIDB4NmRjYiwgMHg3MWQwLCAweDc0MzMsIDB4ODFlOCwgMHg4ZjJhLCAweDk2YTMsCisgICAgMHg5YzU3LCAweDllOWYsIDB4NzQ2MCwgMHg1ODQxLCAweDZkOTksIDB4N2QyZiwgMHg5ODVlLCAweDRlZTQsCisgICAgMHg0ZjM2LCAweDRmOGIsIDB4NTFiNywgMHg1MmIxLCAweDVkYmEsIDB4NjAxYywgMHg3M2IyLCAweDc5M2MsCisgICAgMHg4MmQzLCAweDkyMzQsIDB4OTZiNywgMHg5NmY2LCAweDk3MGEsIDB4OWU5NywgMHg5ZjYyLCAweDY2YTYsCisgICAgMHg2Yjc0LCAweDUyMTcsIDB4NTJhMywgMHg3MGM4LCAweDg4YzIsIDB4NWVjOSwgMHg2MDRiLCAweDYxOTAsCisgICAgMHg2ZjIzLCAweDcxNDksIDB4N2MzZSwgMHg3ZGY0LCAweDgwNmYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4NGVlLCAweDkwMjMsIDB4OTMyYywgMHg1NDQyLCAweDliNmYsIDB4NmFkMywgMHg3MDg5LCAweDhjYzIsCisgICAgMHg4ZGVmLCAweDk3MzIsIDB4NTJiNCwgMHg1YTQxLCAweDVlY2EsIDB4NWYwNCwgMHg2NzE3LCAweDY5N2MsCisgICAgMHg2OTk0LCAweDZkNmEsIDB4NmYwZiwgMHg3MjYyLCAweDcyZmMsIDB4N2JlZCwgMHg4MDAxLCAweDgwN2UsCisgICAgMHg4NzRiLCAweDkwY2UsIDB4NTE2ZCwgMHg5ZTkzLCAweDc5ODQsIDB4ODA4YiwgMHg5MzMyLCAweDhhZDYsCisgICAgMHg1MDJkLCAweDU0OGMsIDB4OGE3MSwgMHg2YjZhLCAweDhjYzQsIDB4ODEwNywgMHg2MGQxLCAweDY3YTAsCisgICAgMHg5ZGYyLCAweDRlOTksIDB4NGU5OCwgMHg5YzEwLCAweDhhNmIsIDB4ODVjMSwgMHg4NTY4LCAweDY5MDAsCisgICAgMHg2ZTdlLCAweDc4OTcsIDB4ODE1NSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDVmMGMsCisgICAgMHg0ZTEwLCAweDRlMTUsIDB4NGUyYSwgMHg0ZTMxLCAweDRlMzYsIDB4NGUzYywgMHg0ZTNmLCAweDRlNDIsCisgICAgMHg0ZTU2LCAweDRlNTgsIDB4NGU4MiwgMHg0ZTg1LCAweDhjNmIsIDB4NGU4YSwgMHg4MjEyLCAweDVmMGQsCisgICAgMHg0ZThlLCAweDRlOWUsIDB4NGU5ZiwgMHg0ZWEwLCAweDRlYTIsIDB4NGViMCwgMHg0ZWIzLCAweDRlYjYsCisgICAgMHg0ZWNlLCAweDRlY2QsIDB4NGVjNCwgMHg0ZWM2LCAweDRlYzIsIDB4NGVkNywgMHg0ZWRlLCAweDRlZWQsCisgICAgMHg0ZWRmLCAweDRlZjcsIDB4NGYwOSwgMHg0ZjVhLCAweDRmMzAsIDB4NGY1YiwgMHg0ZjVkLCAweDRmNTcsCisgICAgMHg0ZjQ3LCAweDRmNzYsIDB4NGY4OCwgMHg0ZjhmLCAweDRmOTgsIDB4NGY3YiwgMHg0ZjY5LCAweDRmNzAsCisgICAgMHg0ZjkxLCAweDRmNmYsIDB4NGY4NiwgMHg0Zjk2LCAweDUxMTgsIDB4NGZkNCwgMHg0ZmRmLCAweDRmY2UsCisgICAgMHg0ZmQ4LCAweDRmZGIsIDB4NGZkMSwgMHg0ZmRhLCAweDRmZDAsIDB4NGZlNCwgMHg0ZmU1LCAweDUwMWEsCisgICAgMHg1MDI4LCAweDUwMTQsIDB4NTAyYSwgMHg1MDI1LCAweDUwMDUsIDB4NGYxYywgMHg0ZmY2LCAweDUwMjEsCisgICAgMHg1MDI5LCAweDUwMmMsIDB4NGZmZSwgMHg0ZmVmLCAweDUwMTEsIDB4NTAwNiwgMHg1MDQzLCAweDUwNDcsCisgICAgMHg2NzAzLCAweDUwNTUsIDB4NTA1MCwgMHg1MDQ4LCAweDUwNWEsIDB4NTA1NiwgMHg1MDZjLCAweDUwNzgsCisgICAgMHg1MDgwLCAweDUwOWEsIDB4NTA4NSwgMHg1MGI0LCAweDUwYjIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg1MGM5LCAweDUwY2EsIDB4NTBiMywgMHg1MGMyLCAweDUwZDYsIDB4NTBkZSwgMHg1MGU1LCAweDUwZWQsCisgICAgMHg1MGUzLCAweDUwZWUsIDB4NTBmOSwgMHg1MGY1LCAweDUxMDksIDB4NTEwMSwgMHg1MTAyLCAweDUxMTYsCisgICAgMHg1MTE1LCAweDUxMTQsIDB4NTExYSwgMHg1MTIxLCAweDUxM2EsIDB4NTEzNywgMHg1MTNjLCAweDUxM2IsCisgICAgMHg1MTNmLCAweDUxNDAsIDB4NTE1MiwgMHg1MTRjLCAweDUxNTQsIDB4NTE2MiwgMHg3YWY4LCAweDUxNjksCisgICAgMHg1MTZhLCAweDUxNmUsIDB4NTE4MCwgMHg1MTgyLCAweDU2ZDgsIDB4NTE4YywgMHg1MTg5LCAweDUxOGYsCisgICAgMHg1MTkxLCAweDUxOTMsIDB4NTE5NSwgMHg1MTk2LCAweDUxYTQsIDB4NTFhNiwgMHg1MWEyLCAweDUxYTksCisgICAgMHg1MWFhLCAweDUxYWIsIDB4NTFiMywgMHg1MWIxLCAweDUxYjIsIDB4NTFiMCwgMHg1MWI1LCAweDUxYmQsCisgICAgMHg1MWM1LCAweDUxYzksIDB4NTFkYiwgMHg1MWUwLCAweDg2NTUsIDB4NTFlOSwgMHg1MWVkLCAweGZmZmQsCisgICAgMHg1MWYwLCAweDUxZjUsIDB4NTFmZSwgMHg1MjA0LCAweDUyMGIsIDB4NTIxNCwgMHg1MjBlLCAweDUyMjcsCisgICAgMHg1MjJhLCAweDUyMmUsIDB4NTIzMywgMHg1MjM5LCAweDUyNGYsIDB4NTI0NCwgMHg1MjRiLCAweDUyNGMsCisgICAgMHg1MjVlLCAweDUyNTQsIDB4NTI2YSwgMHg1Mjc0LCAweDUyNjksIDB4NTI3MywgMHg1MjdmLCAweDUyN2QsCisgICAgMHg1MjhkLCAweDUyOTQsIDB4NTI5MiwgMHg1MjcxLCAweDUyODgsIDB4NTI5MSwgMHg4ZmE4LCAweDhmYTcsCisgICAgMHg1MmFjLCAweDUyYWQsIDB4NTJiYywgMHg1MmI1LCAweDUyYzEsIDB4NTJjZCwgMHg1MmQ3LCAweDUyZGUsCisgICAgMHg1MmUzLCAweDUyZTYsIDB4OThlZCwgMHg1MmUwLCAweDUyZjMsIDB4NTJmNSwgMHg1MmY4LCAweDUyZjksCisgICAgMHg1MzA2LCAweDUzMDgsIDB4NzUzOCwgMHg1MzBkLCAweDUzMTAsIDB4NTMwZiwgMHg1MzE1LCAweDUzMWEsCisgICAgMHg1MzIzLCAweDUzMmYsIDB4NTMzMSwgMHg1MzMzLCAweDUzMzgsIDB4NTM0MCwgMHg1MzQ2LCAweDUzNDUsCisgICAgMHg0ZTE3LCAweDUzNDksIDB4NTM0ZCwgMHg1MWQ2LCAweDUzNWUsIDB4NTM2OSwgMHg1MzZlLCAweDU5MTgsCisgICAgMHg1MzdiLCAweDUzNzcsIDB4NTM4MiwgMHg1Mzk2LCAweDUzYTAsIDB4NTNhNiwgMHg1M2E1LCAweDUzYWUsCisgICAgMHg1M2IwLCAweDUzYjYsIDB4NTNjMywgMHg3YzEyLCAweDk2ZDksIDB4NTNkZiwgMHg2NmZjLCAweDcxZWUsCisgICAgMHg1M2VlLCAweDUzZTgsIDB4NTNlZCwgMHg1M2ZhLCAweDU0MDEsIDB4NTQzZCwgMHg1NDQwLCAweDU0MmMsCisgICAgMHg1NDJkLCAweDU0M2MsIDB4NTQyZSwgMHg1NDM2LCAweDU0MjksIDB4NTQxZCwgMHg1NDRlLCAweDU0OGYsCisgICAgMHg1NDc1LCAweDU0OGUsIDB4NTQ1ZiwgMHg1NDcxLCAweDU0NzcsIDB4NTQ3MCwgMHg1NDkyLCAweDU0N2IsCisgICAgMHg1NDgwLCAweDU0NzYsIDB4NTQ4NCwgMHg1NDkwLCAweDU0ODYsIDB4NTRjNywgMHg1NGEyLCAweDU0YjgsCisgICAgMHg1NGE1LCAweDU0YWMsIDB4NTRjNCwgMHg1NGM4LCAweDU0YTgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg1NGFiLCAweDU0YzIsIDB4NTRhNCwgMHg1NGJlLCAweDU0YmMsIDB4NTRkOCwgMHg1NGU1LCAweDU0ZTYsCisgICAgMHg1NTBmLCAweDU1MTQsIDB4NTRmZCwgMHg1NGVlLCAweDU0ZWQsIDB4NTRmYSwgMHg1NGUyLCAweDU1MzksCisgICAgMHg1NTQwLCAweDU1NjMsIDB4NTU0YywgMHg1NTJlLCAweDU1NWMsIDB4NTU0NSwgMHg1NTU2LCAweDU1NTcsCisgICAgMHg1NTM4LCAweDU1MzMsIDB4NTU1ZCwgMHg1NTk5LCAweDU1ODAsIDB4NTRhZiwgMHg1NThhLCAweDU1OWYsCisgICAgMHg1NTdiLCAweDU1N2UsIDB4NTU5OCwgMHg1NTllLCAweDU1YWUsIDB4NTU3YywgMHg1NTgzLCAweDU1YTksCisgICAgMHg1NTg3LCAweDU1YTgsIDB4NTVkYSwgMHg1NWM1LCAweDU1ZGYsIDB4NTVjNCwgMHg1NWRjLCAweDU1ZTQsCisgICAgMHg1NWQ0LCAweDU2MTQsIDB4NTVmNywgMHg1NjE2LCAweDU1ZmUsIDB4NTVmZCwgMHg1NjFiLCAweDU1ZjksCisgICAgMHg1NjRlLCAweDU2NTAsIDB4NzFkZiwgMHg1NjM0LCAweDU2MzYsIDB4NTYzMiwgMHg1NjM4LCAweGZmZmQsCisgICAgMHg1NjZiLCAweDU2NjQsIDB4NTYyZiwgMHg1NjZjLCAweDU2NmEsIDB4NTY4NiwgMHg1NjgwLCAweDU2OGEsCisgICAgMHg1NmEwLCAweDU2OTQsIDB4NTY4ZiwgMHg1NmE1LCAweDU2YWUsIDB4NTZiNiwgMHg1NmI0LCAweDU2YzIsCisgICAgMHg1NmJjLCAweDU2YzEsIDB4NTZjMywgMHg1NmMwLCAweDU2YzgsIDB4NTZjZSwgMHg1NmQxLCAweDU2ZDMsCisgICAgMHg1NmQ3LCAweDU2ZWUsIDB4NTZmOSwgMHg1NzAwLCAweDU2ZmYsIDB4NTcwNCwgMHg1NzA5LCAweDU3MDgsCisgICAgMHg1NzBiLCAweDU3MGQsIDB4NTcxMywgMHg1NzE4LCAweDU3MTYsIDB4NTVjNywgMHg1NzFjLCAweDU3MjYsCisgICAgMHg1NzM3LCAweDU3MzgsIDB4NTc0ZSwgMHg1NzNiLCAweDU3NDAsIDB4NTc0ZiwgMHg1NzY5LCAweDU3YzAsCisgICAgMHg1Nzg4LCAweDU3NjEsIDB4NTc3ZiwgMHg1Nzg5LCAweDU3OTMsIDB4NTdhMCwgMHg1N2IzLCAweDU3YTQsCisgICAgMHg1N2FhLCAweDU3YjAsIDB4NTdjMywgMHg1N2M2LCAweDU3ZDQsIDB4NTdkMiwgMHg1N2QzLCAweDU4MGEsCisgICAgMHg1N2Q2LCAweDU3ZTMsIDB4NTgwYiwgMHg1ODE5LCAweDU4MWQsIDB4NTg3MiwgMHg1ODIxLCAweDU4NjIsCisgICAgMHg1ODRiLCAweDU4NzAsIDB4NmJjMCwgMHg1ODUyLCAweDU4M2QsIDB4NTg3OSwgMHg1ODg1LCAweDU4YjksCisgICAgMHg1ODlmLCAweDU4YWIsIDB4NThiYSwgMHg1OGRlLCAweDU4YmIsIDB4NThiOCwgMHg1OGFlLCAweDU4YzUsCisgICAgMHg1OGQzLCAweDU4ZDEsIDB4NThkNywgMHg1OGQ5LCAweDU4ZDgsIDB4NThlNSwgMHg1OGRjLCAweDU4ZTQsCisgICAgMHg1OGRmLCAweDU4ZWYsIDB4NThmYSwgMHg1OGY5LCAweDU4ZmIsIDB4NThmYywgMHg1OGZkLCAweDU5MDIsCisgICAgMHg1OTBhLCAweDU5MTAsIDB4NTkxYiwgMHg2OGE2LCAweDU5MjUsIDB4NTkyYywgMHg1OTJkLCAweDU5MzIsCisgICAgMHg1OTM4LCAweDU5M2UsIDB4N2FkMiwgMHg1OTU1LCAweDU5NTAsIDB4NTk0ZSwgMHg1OTVhLCAweDU5NTgsCisgICAgMHg1OTYyLCAweDU5NjAsIDB4NTk2NywgMHg1OTZjLCAweDU5NjksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg1OTc4LCAweDU5ODEsIDB4NTk5ZCwgMHg0ZjVlLCAweDRmYWIsIDB4NTlhMywgMHg1OWIyLCAweDU5YzYsCisgICAgMHg1OWU4LCAweDU5ZGMsIDB4NTk4ZCwgMHg1OWQ5LCAweDU5ZGEsIDB4NWEyNSwgMHg1YTFmLCAweDVhMTEsCisgICAgMHg1YTFjLCAweDVhMDksIDB4NWExYSwgMHg1YTQwLCAweDVhNmMsIDB4NWE0OSwgMHg1YTM1LCAweDVhMzYsCisgICAgMHg1YTYyLCAweDVhNmEsIDB4NWE5YSwgMHg1YWJjLCAweDVhYmUsIDB4NWFjYiwgMHg1YWMyLCAweDVhYmQsCisgICAgMHg1YWUzLCAweDVhZDcsIDB4NWFlNiwgMHg1YWU5LCAweDVhZDYsIDB4NWFmYSwgMHg1YWZiLCAweDViMGMsCisgICAgMHg1YjBiLCAweDViMTYsIDB4NWIzMiwgMHg1YWQwLCAweDViMmEsIDB4NWIzNiwgMHg1YjNlLCAweDViNDMsCisgICAgMHg1YjQ1LCAweDViNDAsIDB4NWI1MSwgMHg1YjU1LCAweDViNWEsIDB4NWI1YiwgMHg1YjY1LCAweDViNjksCisgICAgMHg1YjcwLCAweDViNzMsIDB4NWI3NSwgMHg1Yjc4LCAweDY1ODgsIDB4NWI3YSwgMHg1YjgwLCAweGZmZmQsCisgICAgMHg1YjgzLCAweDViYTYsIDB4NWJiOCwgMHg1YmMzLCAweDViYzcsIDB4NWJjOSwgMHg1YmQ0LCAweDViZDAsCisgICAgMHg1YmU0LCAweDViZTYsIDB4NWJlMiwgMHg1YmRlLCAweDViZTUsIDB4NWJlYiwgMHg1YmYwLCAweDViZjYsCisgICAgMHg1YmYzLCAweDVjMDUsIDB4NWMwNywgMHg1YzA4LCAweDVjMGQsIDB4NWMxMywgMHg1YzIwLCAweDVjMjIsCisgICAgMHg1YzI4LCAweDVjMzgsIDB4NWMzOSwgMHg1YzQxLCAweDVjNDYsIDB4NWM0ZSwgMHg1YzUzLCAweDVjNTAsCisgICAgMHg1YzRmLCAweDViNzEsIDB4NWM2YywgMHg1YzZlLCAweDRlNjIsIDB4NWM3NiwgMHg1Yzc5LCAweDVjOGMsCisgICAgMHg1YzkxLCAweDVjOTQsIDB4NTk5YiwgMHg1Y2FiLCAweDVjYmIsIDB4NWNiNiwgMHg1Y2JjLCAweDVjYjcsCisgICAgMHg1Y2M1LCAweDVjYmUsIDB4NWNjNywgMHg1Y2Q5LCAweDVjZTksIDB4NWNmZCwgMHg1Y2ZhLCAweDVjZWQsCisgICAgMHg1ZDhjLCAweDVjZWEsIDB4NWQwYiwgMHg1ZDE1LCAweDVkMTcsIDB4NWQ1YywgMHg1ZDFmLCAweDVkMWIsCisgICAgMHg1ZDExLCAweDVkMTQsIDB4NWQyMiwgMHg1ZDFhLCAweDVkMTksIDB4NWQxOCwgMHg1ZDRjLCAweDVkNTIsCisgICAgMHg1ZDRlLCAweDVkNGIsIDB4NWQ2YywgMHg1ZDczLCAweDVkNzYsIDB4NWQ4NywgMHg1ZDg0LCAweDVkODIsCisgICAgMHg1ZGEyLCAweDVkOWQsIDB4NWRhYywgMHg1ZGFlLCAweDVkYmQsIDB4NWQ5MCwgMHg1ZGI3LCAweDVkYmMsCisgICAgMHg1ZGM5LCAweDVkY2QsIDB4NWRkMywgMHg1ZGQyLCAweDVkZDYsIDB4NWRkYiwgMHg1ZGViLCAweDVkZjIsCisgICAgMHg1ZGY1LCAweDVlMGIsIDB4NWUxYSwgMHg1ZTE5LCAweDVlMTEsIDB4NWUxYiwgMHg1ZTM2LCAweDVlMzcsCisgICAgMHg1ZTQ0LCAweDVlNDMsIDB4NWU0MCwgMHg1ZTRlLCAweDVlNTcsIDB4NWU1NCwgMHg1ZTVmLCAweDVlNjIsCisgICAgMHg1ZTY0LCAweDVlNDcsIDB4NWU3NSwgMHg1ZTc2LCAweDVlN2EsIDB4OWViYywgMHg1ZTdmLCAweDVlYTAsCisgICAgMHg1ZWMxLCAweDVlYzIsIDB4NWVjOCwgMHg1ZWQwLCAweDVlY2YsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg1ZWQ2LCAweDVlZTMsIDB4NWVkZCwgMHg1ZWRhLCAweDVlZGIsIDB4NWVlMiwgMHg1ZWUxLCAweDVlZTgsCisgICAgMHg1ZWU5LCAweDVlZWMsIDB4NWVmMSwgMHg1ZWYzLCAweDVlZjAsIDB4NWVmNCwgMHg1ZWY4LCAweDVlZmUsCisgICAgMHg1ZjAzLCAweDVmMDksIDB4NWY1ZCwgMHg1ZjVjLCAweDVmMGIsIDB4NWYxMSwgMHg1ZjE2LCAweDVmMjksCisgICAgMHg1ZjJkLCAweDVmMzgsIDB4NWY0MSwgMHg1ZjQ4LCAweDVmNGMsIDB4NWY0ZSwgMHg1ZjJmLCAweDVmNTEsCisgICAgMHg1ZjU2LCAweDVmNTcsIDB4NWY1OSwgMHg1ZjYxLCAweDVmNmQsIDB4NWY3MywgMHg1Zjc3LCAweDVmODMsCisgICAgMHg1ZjgyLCAweDVmN2YsIDB4NWY4YSwgMHg1Zjg4LCAweDVmOTEsIDB4NWY4NywgMHg1ZjllLCAweDVmOTksCisgICAgMHg1Zjk4LCAweDVmYTAsIDB4NWZhOCwgMHg1ZmFkLCAweDVmYmMsIDB4NWZkNiwgMHg1ZmZiLCAweDVmZTQsCisgICAgMHg1ZmY4LCAweDVmZjEsIDB4NWZkZCwgMHg2MGIzLCAweDVmZmYsIDB4NjAyMSwgMHg2MDYwLCAweGZmZmQsCisgICAgMHg2MDE5LCAweDYwMTAsIDB4NjAyOSwgMHg2MDBlLCAweDYwMzEsIDB4NjAxYiwgMHg2MDE1LCAweDYwMmIsCisgICAgMHg2MDI2LCAweDYwMGYsIDB4NjAzYSwgMHg2MDVhLCAweDYwNDEsIDB4NjA2YSwgMHg2MDc3LCAweDYwNWYsCisgICAgMHg2MDRhLCAweDYwNDYsIDB4NjA0ZCwgMHg2MDYzLCAweDYwNDMsIDB4NjA2NCwgMHg2MDQyLCAweDYwNmMsCisgICAgMHg2MDZiLCAweDYwNTksIDB4NjA4MSwgMHg2MDhkLCAweDYwZTcsIDB4NjA4MywgMHg2MDlhLCAweDYwODQsCisgICAgMHg2MDliLCAweDYwOTYsIDB4NjA5NywgMHg2MDkyLCAweDYwYTcsIDB4NjA4YiwgMHg2MGUxLCAweDYwYjgsCisgICAgMHg2MGUwLCAweDYwZDMsIDB4NjBiNCwgMHg1ZmYwLCAweDYwYmQsIDB4NjBjNiwgMHg2MGI1LCAweDYwZDgsCisgICAgMHg2MTRkLCAweDYxMTUsIDB4NjEwNiwgMHg2MGY2LCAweDYwZjcsIDB4NjEwMCwgMHg2MGY0LCAweDYwZmEsCisgICAgMHg2MTAzLCAweDYxMjEsIDB4NjBmYiwgMHg2MGYxLCAweDYxMGQsIDB4NjEwZSwgMHg2MTQ3LCAweDYxM2UsCisgICAgMHg2MTI4LCAweDYxMjcsIDB4NjE0YSwgMHg2MTNmLCAweDYxM2MsIDB4NjEyYywgMHg2MTM0LCAweDYxM2QsCisgICAgMHg2MTQyLCAweDYxNDQsIDB4NjE3MywgMHg2MTc3LCAweDYxNTgsIDB4NjE1OSwgMHg2MTVhLCAweDYxNmIsCisgICAgMHg2MTc0LCAweDYxNmYsIDB4NjE2NSwgMHg2MTcxLCAweDYxNWYsIDB4NjE1ZCwgMHg2MTUzLCAweDYxNzUsCisgICAgMHg2MTk5LCAweDYxOTYsIDB4NjE4NywgMHg2MWFjLCAweDYxOTQsIDB4NjE5YSwgMHg2MThhLCAweDYxOTEsCisgICAgMHg2MWFiLCAweDYxYWUsIDB4NjFjYywgMHg2MWNhLCAweDYxYzksIDB4NjFmNywgMHg2MWM4LCAweDYxYzMsCisgICAgMHg2MWM2LCAweDYxYmEsIDB4NjFjYiwgMHg3Zjc5LCAweDYxY2QsIDB4NjFlNiwgMHg2MWUzLCAweDYxZjYsCisgICAgMHg2MWZhLCAweDYxZjQsIDB4NjFmZiwgMHg2MWZkLCAweDYxZmMsIDB4NjFmZSwgMHg2MjAwLCAweDYyMDgsCisgICAgMHg2MjA5LCAweDYyMGQsIDB4NjIwYywgMHg2MjE0LCAweDYyMWIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg2MjFlLCAweDYyMjEsIDB4NjIyYSwgMHg2MjJlLCAweDYyMzAsIDB4NjIzMiwgMHg2MjMzLCAweDYyNDEsCisgICAgMHg2MjRlLCAweDYyNWUsIDB4NjI2MywgMHg2MjViLCAweDYyNjAsIDB4NjI2OCwgMHg2MjdjLCAweDYyODIsCisgICAgMHg2Mjg5LCAweDYyN2UsIDB4NjI5MiwgMHg2MjkzLCAweDYyOTYsIDB4NjJkNCwgMHg2MjgzLCAweDYyOTQsCisgICAgMHg2MmQ3LCAweDYyZDEsIDB4NjJiYiwgMHg2MmNmLCAweDYyZmYsIDB4NjJjNiwgMHg2NGQ0LCAweDYyYzgsCisgICAgMHg2MmRjLCAweDYyY2MsIDB4NjJjYSwgMHg2MmMyLCAweDYyYzcsIDB4NjI5YiwgMHg2MmM5LCAweDYzMGMsCisgICAgMHg2MmVlLCAweDYyZjEsIDB4NjMyNywgMHg2MzAyLCAweDYzMDgsIDB4NjJlZiwgMHg2MmY1LCAweDYzNTAsCisgICAgMHg2MzNlLCAweDYzNGQsIDB4NjQxYywgMHg2MzRmLCAweDYzOTYsIDB4NjM4ZSwgMHg2MzgwLCAweDYzYWIsCisgICAgMHg2Mzc2LCAweDYzYTMsIDB4NjM4ZiwgMHg2Mzg5LCAweDYzOWYsIDB4NjNiNSwgMHg2MzZiLCAweGZmZmQsCisgICAgMHg2MzY5LCAweDYzYmUsIDB4NjNlOSwgMHg2M2MwLCAweDYzYzYsIDB4NjNlMywgMHg2M2M5LCAweDYzZDIsCisgICAgMHg2M2Y2LCAweDYzYzQsIDB4NjQxNiwgMHg2NDM0LCAweDY0MDYsIDB4NjQxMywgMHg2NDI2LCAweDY0MzYsCisgICAgMHg2NTFkLCAweDY0MTcsIDB4NjQyOCwgMHg2NDBmLCAweDY0NjcsIDB4NjQ2ZiwgMHg2NDc2LCAweDY0NGUsCisgICAgMHg2NTJhLCAweDY0OTUsIDB4NjQ5MywgMHg2NGE1LCAweDY0YTksIDB4NjQ4OCwgMHg2NGJjLCAweDY0ZGEsCisgICAgMHg2NGQyLCAweDY0YzUsIDB4NjRjNywgMHg2NGJiLCAweDY0ZDgsIDB4NjRjMiwgMHg2NGYxLCAweDY0ZTcsCisgICAgMHg4MjA5LCAweDY0ZTAsIDB4NjRlMSwgMHg2MmFjLCAweDY0ZTMsIDB4NjRlZiwgMHg2NTJjLCAweDY0ZjYsCisgICAgMHg2NGY0LCAweDY0ZjIsIDB4NjRmYSwgMHg2NTAwLCAweDY0ZmQsIDB4NjUxOCwgMHg2NTFjLCAweDY1MDUsCisgICAgMHg2NTI0LCAweDY1MjMsIDB4NjUyYiwgMHg2NTM0LCAweDY1MzUsIDB4NjUzNywgMHg2NTM2LCAweDY1MzgsCisgICAgMHg3NTRiLCAweDY1NDgsIDB4NjU1NiwgMHg2NTU1LCAweDY1NGQsIDB4NjU1OCwgMHg2NTVlLCAweDY1NWQsCisgICAgMHg2NTcyLCAweDY1NzgsIDB4NjU4MiwgMHg2NTgzLCAweDhiOGEsIDB4NjU5YiwgMHg2NTlmLCAweDY1YWIsCisgICAgMHg2NWI3LCAweDY1YzMsIDB4NjVjNiwgMHg2NWMxLCAweDY1YzQsIDB4NjVjYywgMHg2NWQyLCAweDY1ZGIsCisgICAgMHg2NWQ5LCAweDY1ZTAsIDB4NjVlMSwgMHg2NWYxLCAweDY3NzIsIDB4NjYwYSwgMHg2NjAzLCAweDY1ZmIsCisgICAgMHg2NzczLCAweDY2MzUsIDB4NjYzNiwgMHg2NjM0LCAweDY2MWMsIDB4NjY0ZiwgMHg2NjQ0LCAweDY2NDksCisgICAgMHg2NjQxLCAweDY2NWUsIDB4NjY1ZCwgMHg2NjY0LCAweDY2NjcsIDB4NjY2OCwgMHg2NjVmLCAweDY2NjIsCisgICAgMHg2NjcwLCAweDY2ODMsIDB4NjY4OCwgMHg2NjhlLCAweDY2ODksIDB4NjY4NCwgMHg2Njk4LCAweDY2OWQsCisgICAgMHg2NmMxLCAweDY2YjksIDB4NjZjOSwgMHg2NmJlLCAweDY2YmMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg2NmM0LCAweDY2YjgsIDB4NjZkNiwgMHg2NmRhLCAweDY2ZTAsIDB4NjYzZiwgMHg2NmU2LCAweDY2ZTksCisgICAgMHg2NmYwLCAweDY2ZjUsIDB4NjZmNywgMHg2NzBmLCAweDY3MTYsIDB4NjcxZSwgMHg2NzI2LCAweDY3MjcsCisgICAgMHg5NzM4LCAweDY3MmUsIDB4NjczZiwgMHg2NzM2LCAweDY3NDEsIDB4NjczOCwgMHg2NzM3LCAweDY3NDYsCisgICAgMHg2NzVlLCAweDY3NjAsIDB4Njc1OSwgMHg2NzYzLCAweDY3NjQsIDB4Njc4OSwgMHg2NzcwLCAweDY3YTksCisgICAgMHg2NzdjLCAweDY3NmEsIDB4Njc4YywgMHg2NzhiLCAweDY3YTYsIDB4NjdhMSwgMHg2Nzg1LCAweDY3YjcsCisgICAgMHg2N2VmLCAweDY3YjQsIDB4NjdlYywgMHg2N2IzLCAweDY3ZTksIDB4NjdiOCwgMHg2N2U0LCAweDY3ZGUsCisgICAgMHg2N2RkLCAweDY3ZTIsIDB4NjdlZSwgMHg2N2I5LCAweDY3Y2UsIDB4NjdjNiwgMHg2N2U3LCAweDZhOWMsCisgICAgMHg2ODFlLCAweDY4NDYsIDB4NjgyOSwgMHg2ODQwLCAweDY4NGQsIDB4NjgzMiwgMHg2ODRlLCAweGZmZmQsCisgICAgMHg2OGIzLCAweDY4MmIsIDB4Njg1OSwgMHg2ODYzLCAweDY4NzcsIDB4Njg3ZiwgMHg2ODlmLCAweDY4OGYsCisgICAgMHg2OGFkLCAweDY4OTQsIDB4Njg5ZCwgMHg2ODliLCAweDY4ODMsIDB4NmFhZSwgMHg2OGI5LCAweDY4NzQsCisgICAgMHg2OGI1LCAweDY4YTAsIDB4NjhiYSwgMHg2OTBmLCAweDY4OGQsIDB4Njg3ZSwgMHg2OTAxLCAweDY4Y2EsCisgICAgMHg2OTA4LCAweDY4ZDgsIDB4NjkyMiwgMHg2OTI2LCAweDY4ZTEsIDB4NjkwYywgMHg2OGNkLCAweDY4ZDQsCisgICAgMHg2OGU3LCAweDY4ZDUsIDB4NjkzNiwgMHg2OTEyLCAweDY5MDQsIDB4NjhkNywgMHg2OGUzLCAweDY5MjUsCisgICAgMHg2OGY5LCAweDY4ZTAsIDB4NjhlZiwgMHg2OTI4LCAweDY5MmEsIDB4NjkxYSwgMHg2OTIzLCAweDY5MjEsCisgICAgMHg2OGM2LCAweDY5NzksIDB4Njk3NywgMHg2OTVjLCAweDY5NzgsIDB4Njk2YiwgMHg2OTU0LCAweDY5N2UsCisgICAgMHg2OTZlLCAweDY5MzksIDB4Njk3NCwgMHg2OTNkLCAweDY5NTksIDB4NjkzMCwgMHg2OTYxLCAweDY5NWUsCisgICAgMHg2OTVkLCAweDY5ODEsIDB4Njk2YSwgMHg2OWIyLCAweDY5YWUsIDB4NjlkMCwgMHg2OWJmLCAweDY5YzEsCisgICAgMHg2OWQzLCAweDY5YmUsIDB4NjljZSwgMHg1YmU4LCAweDY5Y2EsIDB4NjlkZCwgMHg2OWJiLCAweDY5YzMsCisgICAgMHg2OWE3LCAweDZhMmUsIDB4Njk5MSwgMHg2OWEwLCAweDY5OWMsIDB4Njk5NSwgMHg2OWI0LCAweDY5ZGUsCisgICAgMHg2OWU4LCAweDZhMDIsIDB4NmExYiwgMHg2OWZmLCAweDZiMGEsIDB4NjlmOSwgMHg2OWYyLCAweDY5ZTcsCisgICAgMHg2YTA1LCAweDY5YjEsIDB4NmExZSwgMHg2OWVkLCAweDZhMTQsIDB4NjllYiwgMHg2YTBhLCAweDZhMTIsCisgICAgMHg2YWMxLCAweDZhMjMsIDB4NmExMywgMHg2YTQ0LCAweDZhMGMsIDB4NmE3MiwgMHg2YTM2LCAweDZhNzgsCisgICAgMHg2YTQ3LCAweDZhNjIsIDB4NmE1OSwgMHg2YTY2LCAweDZhNDgsIDB4NmEzOCwgMHg2YTIyLCAweDZhOTAsCisgICAgMHg2YThkLCAweDZhYTAsIDB4NmE4NCwgMHg2YWEyLCAweDZhYTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg2YTk3LCAweDg2MTcsIDB4NmFiYiwgMHg2YWMzLCAweDZhYzIsIDB4NmFiOCwgMHg2YWIzLCAweDZhYWMsCisgICAgMHg2YWRlLCAweDZhZDEsIDB4NmFkZiwgMHg2YWFhLCAweDZhZGEsIDB4NmFlYSwgMHg2YWZiLCAweDZiMDUsCisgICAgMHg4NjE2LCAweDZhZmEsIDB4NmIxMiwgMHg2YjE2LCAweDliMzEsIDB4NmIxZiwgMHg2YjM4LCAweDZiMzcsCisgICAgMHg3NmRjLCAweDZiMzksIDB4OThlZSwgMHg2YjQ3LCAweDZiNDMsIDB4NmI0OSwgMHg2YjUwLCAweDZiNTksCisgICAgMHg2YjU0LCAweDZiNWIsIDB4NmI1ZiwgMHg2YjYxLCAweDZiNzgsIDB4NmI3OSwgMHg2YjdmLCAweDZiODAsCisgICAgMHg2Yjg0LCAweDZiODMsIDB4NmI4ZCwgMHg2Yjk4LCAweDZiOTUsIDB4NmI5ZSwgMHg2YmE0LCAweDZiYWEsCisgICAgMHg2YmFiLCAweDZiYWYsIDB4NmJiMiwgMHg2YmIxLCAweDZiYjMsIDB4NmJiNywgMHg2YmJjLCAweDZiYzYsCisgICAgMHg2YmNiLCAweDZiZDMsIDB4NmJkZiwgMHg2YmVjLCAweDZiZWIsIDB4NmJmMywgMHg2YmVmLCAweGZmZmQsCisgICAgMHg5ZWJlLCAweDZjMDgsIDB4NmMxMywgMHg2YzE0LCAweDZjMWIsIDB4NmMyNCwgMHg2YzIzLCAweDZjNWUsCisgICAgMHg2YzU1LCAweDZjNjIsIDB4NmM2YSwgMHg2YzgyLCAweDZjOGQsIDB4NmM5YSwgMHg2YzgxLCAweDZjOWIsCisgICAgMHg2YzdlLCAweDZjNjgsIDB4NmM3MywgMHg2YzkyLCAweDZjOTAsIDB4NmNjNCwgMHg2Y2YxLCAweDZjZDMsCisgICAgMHg2Y2JkLCAweDZjZDcsIDB4NmNjNSwgMHg2Y2RkLCAweDZjYWUsIDB4NmNiMSwgMHg2Y2JlLCAweDZjYmEsCisgICAgMHg2Y2RiLCAweDZjZWYsIDB4NmNkOSwgMHg2Y2VhLCAweDZkMWYsIDB4ODg0ZCwgMHg2ZDM2LCAweDZkMmIsCisgICAgMHg2ZDNkLCAweDZkMzgsIDB4NmQxOSwgMHg2ZDM1LCAweDZkMzMsIDB4NmQxMiwgMHg2ZDBjLCAweDZkNjMsCisgICAgMHg2ZDkzLCAweDZkNjQsIDB4NmQ1YSwgMHg2ZDc5LCAweDZkNTksIDB4NmQ4ZSwgMHg2ZDk1LCAweDZmZTQsCisgICAgMHg2ZDg1LCAweDZkZjksIDB4NmUxNSwgMHg2ZTBhLCAweDZkYjUsIDB4NmRjNywgMHg2ZGU2LCAweDZkYjgsCisgICAgMHg2ZGM2LCAweDZkZWMsIDB4NmRkZSwgMHg2ZGNjLCAweDZkZTgsIDB4NmRkMiwgMHg2ZGM1LCAweDZkZmEsCisgICAgMHg2ZGQ5LCAweDZkZTQsIDB4NmRkNSwgMHg2ZGVhLCAweDZkZWUsIDB4NmUyZCwgMHg2ZTZlLCAweDZlMmUsCisgICAgMHg2ZTE5LCAweDZlNzIsIDB4NmU1ZiwgMHg2ZTNlLCAweDZlMjMsIDB4NmU2YiwgMHg2ZTJiLCAweDZlNzYsCisgICAgMHg2ZTRkLCAweDZlMWYsIDB4NmU0MywgMHg2ZTNhLCAweDZlNGUsIDB4NmUyNCwgMHg2ZWZmLCAweDZlMWQsCisgICAgMHg2ZTM4LCAweDZlODIsIDB4NmVhYSwgMHg2ZTk4LCAweDZlYzksIDB4NmViNywgMHg2ZWQzLCAweDZlYmQsCisgICAgMHg2ZWFmLCAweDZlYzQsIDB4NmViMiwgMHg2ZWQ0LCAweDZlZDUsIDB4NmU4ZiwgMHg2ZWE1LCAweDZlYzIsCisgICAgMHg2ZTlmLCAweDZmNDEsIDB4NmYxMSwgMHg3MDRjLCAweDZlZWMsIDB4NmVmOCwgMHg2ZWZlLCAweDZmM2YsCisgICAgMHg2ZWYyLCAweDZmMzEsIDB4NmVlZiwgMHg2ZjMyLCAweDZlY2MKK307CisKK3N0YXRpYyBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdC1KSVMgdG8gVW5pY29kZSAqLworc2p1X2UwNDBbXSA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4ZTA0MCB0aHJ1IDB4ZWFhNCAqLworICAgIDB4NmYzZSwgMHg2ZjEzLCAweDZlZjcsIDB4NmY4NiwgMHg2ZjdhLCAweDZmNzgsIDB4NmY4MSwgMHg2ZjgwLAorICAgIDB4NmY2ZiwgMHg2ZjViLCAweDZmZjMsIDB4NmY2ZCwgMHg2ZjgyLCAweDZmN2MsIDB4NmY1OCwgMHg2ZjhlLAorICAgIDB4NmY5MSwgMHg2ZmMyLCAweDZmNjYsIDB4NmZiMywgMHg2ZmEzLCAweDZmYTEsIDB4NmZhNCwgMHg2ZmI5LAorICAgIDB4NmZjNiwgMHg2ZmFhLCAweDZmZGYsIDB4NmZkNSwgMHg2ZmVjLCAweDZmZDQsIDB4NmZkOCwgMHg2ZmYxLAorICAgIDB4NmZlZSwgMHg2ZmRiLCAweDcwMDksIDB4NzAwYiwgMHg2ZmZhLCAweDcwMTEsIDB4NzAwMSwgMHg3MDBmLAorICAgIDB4NmZmZSwgMHg3MDFiLCAweDcwMWEsIDB4NmY3NCwgMHg3MDFkLCAweDcwMTgsIDB4NzAxZiwgMHg3MDMwLAorICAgIDB4NzAzZSwgMHg3MDMyLCAweDcwNTEsIDB4NzA2MywgMHg3MDk5LCAweDcwOTIsIDB4NzBhZiwgMHg3MGYxLAorICAgIDB4NzBhYywgMHg3MGI4LCAweDcwYjMsIDB4NzBhZSwgMHg3MGRmLCAweDcwY2IsIDB4NzBkZCwgMHhmZmZkLAorICAgIDB4NzBkOSwgMHg3MTA5LCAweDcwZmQsIDB4NzExYywgMHg3MTE5LCAweDcxNjUsIDB4NzE1NSwgMHg3MTg4LAorICAgIDB4NzE2NiwgMHg3MTYyLCAweDcxNGMsIDB4NzE1NiwgMHg3MTZjLCAweDcxOGYsIDB4NzFmYiwgMHg3MTg0LAorICAgIDB4NzE5NSwgMHg3MWE4LCAweDcxYWMsIDB4NzFkNywgMHg3MWI5LCAweDcxYmUsIDB4NzFkMiwgMHg3MWM5LAorICAgIDB4NzFkNCwgMHg3MWNlLCAweDcxZTAsIDB4NzFlYywgMHg3MWU3LCAweDcxZjUsIDB4NzFmYywgMHg3MWY5LAorICAgIDB4NzFmZiwgMHg3MjBkLCAweDcyMTAsIDB4NzIxYiwgMHg3MjI4LCAweDcyMmQsIDB4NzIyYywgMHg3MjMwLAorICAgIDB4NzIzMiwgMHg3MjNiLCAweDcyM2MsIDB4NzIzZiwgMHg3MjQwLCAweDcyNDYsIDB4NzI0YiwgMHg3MjU4LAorICAgIDB4NzI3NCwgMHg3MjdlLCAweDcyODIsIDB4NzI4MSwgMHg3Mjg3LCAweDcyOTIsIDB4NzI5NiwgMHg3MmEyLAorICAgIDB4NzJhNywgMHg3MmI5LCAweDcyYjIsIDB4NzJjMywgMHg3MmM2LCAweDcyYzQsIDB4NzJjZSwgMHg3MmQyLAorICAgIDB4NzJlMiwgMHg3MmUwLCAweDcyZTEsIDB4NzJmOSwgMHg3MmY3LCAweDUwMGYsIDB4NzMxNywgMHg3MzBhLAorICAgIDB4NzMxYywgMHg3MzE2LCAweDczMWQsIDB4NzMzNCwgMHg3MzJmLCAweDczMjksIDB4NzMyNSwgMHg3MzNlLAorICAgIDB4NzM0ZSwgMHg3MzRmLCAweDllZDgsIDB4NzM1NywgMHg3MzZhLCAweDczNjgsIDB4NzM3MCwgMHg3Mzc4LAorICAgIDB4NzM3NSwgMHg3MzdiLCAweDczN2EsIDB4NzNjOCwgMHg3M2IzLCAweDczY2UsIDB4NzNiYiwgMHg3M2MwLAorICAgIDB4NzNlNSwgMHg3M2VlLCAweDczZGUsIDB4NzRhMiwgMHg3NDA1LCAweDc0NmYsIDB4NzQyNSwgMHg3M2Y4LAorICAgIDB4NzQzMiwgMHg3NDNhLCAweDc0NTUsIDB4NzQzZiwgMHg3NDVmLCAweDc0NTksIDB4NzQ0MSwgMHg3NDVjLAorICAgIDB4NzQ2OSwgMHg3NDcwLCAweDc0NjMsIDB4NzQ2YSwgMHg3NDc2LCAweDc0N2UsIDB4NzQ4YiwgMHg3NDllLAorICAgIDB4NzRhNywgMHg3NGNhLCAweDc0Y2YsIDB4NzRkNCwgMHg3M2YxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4NzRlMCwgMHg3NGUzLCAweDc0ZTcsIDB4NzRlOSwgMHg3NGVlLCAweDc0ZjIsIDB4NzRmMCwgMHg3NGYxLAorICAgIDB4NzRmOCwgMHg3NGY3LCAweDc1MDQsIDB4NzUwMywgMHg3NTA1LCAweDc1MGMsIDB4NzUwZSwgMHg3NTBkLAorICAgIDB4NzUxNSwgMHg3NTEzLCAweDc1MWUsIDB4NzUyNiwgMHg3NTJjLCAweDc1M2MsIDB4NzU0NCwgMHg3NTRkLAorICAgIDB4NzU0YSwgMHg3NTQ5LCAweDc1NWIsIDB4NzU0NiwgMHg3NTVhLCAweDc1NjksIDB4NzU2NCwgMHg3NTY3LAorICAgIDB4NzU2YiwgMHg3NTZkLCAweDc1NzgsIDB4NzU3NiwgMHg3NTg2LCAweDc1ODcsIDB4NzU3NCwgMHg3NThhLAorICAgIDB4NzU4OSwgMHg3NTgyLCAweDc1OTQsIDB4NzU5YSwgMHg3NTlkLCAweDc1YTUsIDB4NzVhMywgMHg3NWMyLAorICAgIDB4NzViMywgMHg3NWMzLCAweDc1YjUsIDB4NzViZCwgMHg3NWI4LCAweDc1YmMsIDB4NzViMSwgMHg3NWNkLAorICAgIDB4NzVjYSwgMHg3NWQyLCAweDc1ZDksIDB4NzVlMywgMHg3NWRlLCAweDc1ZmUsIDB4NzVmZiwgMHhmZmZkLAorICAgIDB4NzVmYywgMHg3NjAxLCAweDc1ZjAsIDB4NzVmYSwgMHg3NWYyLCAweDc1ZjMsIDB4NzYwYiwgMHg3NjBkLAorICAgIDB4NzYwOSwgMHg3NjFmLCAweDc2MjcsIDB4NzYyMCwgMHg3NjIxLCAweDc2MjIsIDB4NzYyNCwgMHg3NjM0LAorICAgIDB4NzYzMCwgMHg3NjNiLCAweDc2NDcsIDB4NzY0OCwgMHg3NjQ2LCAweDc2NWMsIDB4NzY1OCwgMHg3NjYxLAorICAgIDB4NzY2MiwgMHg3NjY4LCAweDc2NjksIDB4NzY2YSwgMHg3NjY3LCAweDc2NmMsIDB4NzY3MCwgMHg3NjcyLAorICAgIDB4NzY3NiwgMHg3Njc4LCAweDc2N2MsIDB4NzY4MCwgMHg3NjgzLCAweDc2ODgsIDB4NzY4YiwgMHg3NjhlLAorICAgIDB4NzY5NiwgMHg3NjkzLCAweDc2OTksIDB4NzY5YSwgMHg3NmIwLCAweDc2YjQsIDB4NzZiOCwgMHg3NmI5LAorICAgIDB4NzZiYSwgMHg3NmMyLCAweDc2Y2QsIDB4NzZkNiwgMHg3NmQyLCAweDc2ZGUsIDB4NzZlMSwgMHg3NmU1LAorICAgIDB4NzZlNywgMHg3NmVhLCAweDg2MmYsIDB4NzZmYiwgMHg3NzA4LCAweDc3MDcsIDB4NzcwNCwgMHg3NzI5LAorICAgIDB4NzcyNCwgMHg3NzFlLCAweDc3MjUsIDB4NzcyNiwgMHg3NzFiLCAweDc3MzcsIDB4NzczOCwgMHg3NzQ3LAorICAgIDB4Nzc1YSwgMHg3NzY4LCAweDc3NmIsIDB4Nzc1YiwgMHg3NzY1LCAweDc3N2YsIDB4Nzc3ZSwgMHg3Nzc5LAorICAgIDB4Nzc4ZSwgMHg3NzhiLCAweDc3OTEsIDB4NzdhMCwgMHg3NzllLCAweDc3YjAsIDB4NzdiNiwgMHg3N2I5LAorICAgIDB4NzdiZiwgMHg3N2JjLCAweDc3YmQsIDB4NzdiYiwgMHg3N2M3LCAweDc3Y2QsIDB4NzdkNywgMHg3N2RhLAorICAgIDB4NzdkYywgMHg3N2UzLCAweDc3ZWUsIDB4NzdmYywgMHg3ODBjLCAweDc4MTIsIDB4NzkyNiwgMHg3ODIwLAorICAgIDB4NzkyYSwgMHg3ODQ1LCAweDc4OGUsIDB4Nzg3NCwgMHg3ODg2LCAweDc4N2MsIDB4Nzg5YSwgMHg3ODhjLAorICAgIDB4NzhhMywgMHg3OGI1LCAweDc4YWEsIDB4NzhhZiwgMHg3OGQxLCAweDc4YzYsIDB4NzhjYiwgMHg3OGQ0LAorICAgIDB4NzhiZSwgMHg3OGJjLCAweDc4YzUsIDB4NzhjYSwgMHg3OGVjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4NzhlNywgMHg3OGRhLCAweDc4ZmQsIDB4NzhmNCwgMHg3OTA3LCAweDc5MTIsIDB4NzkxMSwgMHg3OTE5LAorICAgIDB4NzkyYywgMHg3OTJiLCAweDc5NDAsIDB4Nzk2MCwgMHg3OTU3LCAweDc5NWYsIDB4Nzk1YSwgMHg3OTU1LAorICAgIDB4Nzk1MywgMHg3OTdhLCAweDc5N2YsIDB4Nzk4YSwgMHg3OTlkLCAweDc5YTcsIDB4OWY0YiwgMHg3OWFhLAorICAgIDB4NzlhZSwgMHg3OWIzLCAweDc5YjksIDB4NzliYSwgMHg3OWM5LCAweDc5ZDUsIDB4NzllNywgMHg3OWVjLAorICAgIDB4NzllMSwgMHg3OWUzLCAweDdhMDgsIDB4N2EwZCwgMHg3YTE4LCAweDdhMTksIDB4N2EyMCwgMHg3YTFmLAorICAgIDB4Nzk4MCwgMHg3YTMxLCAweDdhM2IsIDB4N2EzZSwgMHg3YTM3LCAweDdhNDMsIDB4N2E1NywgMHg3YTQ5LAorICAgIDB4N2E2MSwgMHg3YTYyLCAweDdhNjksIDB4OWY5ZCwgMHg3YTcwLCAweDdhNzksIDB4N2E3ZCwgMHg3YTg4LAorICAgIDB4N2E5NywgMHg3YTk1LCAweDdhOTgsIDB4N2E5NiwgMHg3YWE5LCAweDdhYzgsIDB4N2FiMCwgMHhmZmZkLAorICAgIDB4N2FiNiwgMHg3YWM1LCAweDdhYzQsIDB4N2FiZiwgMHg5MDgzLCAweDdhYzcsIDB4N2FjYSwgMHg3YWNkLAorICAgIDB4N2FjZiwgMHg3YWQ1LCAweDdhZDMsIDB4N2FkOSwgMHg3YWRhLCAweDdhZGQsIDB4N2FlMSwgMHg3YWUyLAorICAgIDB4N2FlNiwgMHg3YWVkLCAweDdhZjAsIDB4N2IwMiwgMHg3YjBmLCAweDdiMGEsIDB4N2IwNiwgMHg3YjMzLAorICAgIDB4N2IxOCwgMHg3YjE5LCAweDdiMWUsIDB4N2IzNSwgMHg3YjI4LCAweDdiMzYsIDB4N2I1MCwgMHg3YjdhLAorICAgIDB4N2IwNCwgMHg3YjRkLCAweDdiMGIsIDB4N2I0YywgMHg3YjQ1LCAweDdiNzUsIDB4N2I2NSwgMHg3Yjc0LAorICAgIDB4N2I2NywgMHg3YjcwLCAweDdiNzEsIDB4N2I2YywgMHg3YjZlLCAweDdiOWQsIDB4N2I5OCwgMHg3YjlmLAorICAgIDB4N2I4ZCwgMHg3YjljLCAweDdiOWEsIDB4N2I4YiwgMHg3YjkyLCAweDdiOGYsIDB4N2I1ZCwgMHg3Yjk5LAorICAgIDB4N2JjYiwgMHg3YmMxLCAweDdiY2MsIDB4N2JjZiwgMHg3YmI0LCAweDdiYzYsIDB4N2JkZCwgMHg3YmU5LAorICAgIDB4N2MxMSwgMHg3YzE0LCAweDdiZTYsIDB4N2JlNSwgMHg3YzYwLCAweDdjMDAsIDB4N2MwNywgMHg3YzEzLAorICAgIDB4N2JmMywgMHg3YmY3LCAweDdjMTcsIDB4N2MwZCwgMHg3YmY2LCAweDdjMjMsIDB4N2MyNywgMHg3YzJhLAorICAgIDB4N2MxZiwgMHg3YzM3LCAweDdjMmIsIDB4N2MzZCwgMHg3YzRjLCAweDdjNDMsIDB4N2M1NCwgMHg3YzRmLAorICAgIDB4N2M0MCwgMHg3YzUwLCAweDdjNTgsIDB4N2M1ZiwgMHg3YzY0LCAweDdjNTYsIDB4N2M2NSwgMHg3YzZjLAorICAgIDB4N2M3NSwgMHg3YzgzLCAweDdjOTAsIDB4N2NhNCwgMHg3Y2FkLCAweDdjYTIsIDB4N2NhYiwgMHg3Y2ExLAorICAgIDB4N2NhOCwgMHg3Y2IzLCAweDdjYjIsIDB4N2NiMSwgMHg3Y2FlLCAweDdjYjksIDB4N2NiZCwgMHg3Y2MwLAorICAgIDB4N2NjNSwgMHg3Y2MyLCAweDdjZDgsIDB4N2NkMiwgMHg3Y2RjLCAweDdjZTIsIDB4OWIzYiwgMHg3Y2VmLAorICAgIDB4N2NmMiwgMHg3Y2Y0LCAweDdjZjYsIDB4N2NmYSwgMHg3ZDA2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4N2QwMiwgMHg3ZDFjLCAweDdkMTUsIDB4N2QwYSwgMHg3ZDQ1LCAweDdkNGIsIDB4N2QyZSwgMHg3ZDMyLAorICAgIDB4N2QzZiwgMHg3ZDM1LCAweDdkNDYsIDB4N2Q3MywgMHg3ZDU2LCAweDdkNGUsIDB4N2Q3MiwgMHg3ZDY4LAorICAgIDB4N2Q2ZSwgMHg3ZDRmLCAweDdkNjMsIDB4N2Q5MywgMHg3ZDg5LCAweDdkNWIsIDB4N2Q4ZiwgMHg3ZDdkLAorICAgIDB4N2Q5YiwgMHg3ZGJhLCAweDdkYWUsIDB4N2RhMywgMHg3ZGI1LCAweDdkYzcsIDB4N2RiZCwgMHg3ZGFiLAorICAgIDB4N2UzZCwgMHg3ZGEyLCAweDdkYWYsIDB4N2RkYywgMHg3ZGI4LCAweDdkOWYsIDB4N2RiMCwgMHg3ZGQ4LAorICAgIDB4N2RkZCwgMHg3ZGU0LCAweDdkZGUsIDB4N2RmYiwgMHg3ZGYyLCAweDdkZTEsIDB4N2UwNSwgMHg3ZTBhLAorICAgIDB4N2UyMywgMHg3ZTIxLCAweDdlMTIsIDB4N2UzMSwgMHg3ZTFmLCAweDdlMDksIDB4N2UwYiwgMHg3ZTIyLAorICAgIDB4N2U0NiwgMHg3ZTY2LCAweDdlM2IsIDB4N2UzNSwgMHg3ZTM5LCAweDdlNDMsIDB4N2UzNywgMHhmZmZkLAorICAgIDB4N2UzMiwgMHg3ZTNhLCAweDdlNjcsIDB4N2U1ZCwgMHg3ZTU2LCAweDdlNWUsIDB4N2U1OSwgMHg3ZTVhLAorICAgIDB4N2U3OSwgMHg3ZTZhLCAweDdlNjksIDB4N2U3YywgMHg3ZTdiLCAweDdlODMsIDB4N2RkNSwgMHg3ZTdkLAorICAgIDB4OGZhZSwgMHg3ZTdmLCAweDdlODgsIDB4N2U4OSwgMHg3ZThjLCAweDdlOTIsIDB4N2U5MCwgMHg3ZTkzLAorICAgIDB4N2U5NCwgMHg3ZTk2LCAweDdlOGUsIDB4N2U5YiwgMHg3ZTljLCAweDdmMzgsIDB4N2YzYSwgMHg3ZjQ1LAorICAgIDB4N2Y0YywgMHg3ZjRkLCAweDdmNGUsIDB4N2Y1MCwgMHg3ZjUxLCAweDdmNTUsIDB4N2Y1NCwgMHg3ZjU4LAorICAgIDB4N2Y1ZiwgMHg3ZjYwLCAweDdmNjgsIDB4N2Y2OSwgMHg3ZjY3LCAweDdmNzgsIDB4N2Y4MiwgMHg3Zjg2LAorICAgIDB4N2Y4MywgMHg3Zjg4LCAweDdmODcsIDB4N2Y4YywgMHg3Zjk0LCAweDdmOWUsIDB4N2Y5ZCwgMHg3ZjlhLAorICAgIDB4N2ZhMywgMHg3ZmFmLCAweDdmYjIsIDB4N2ZiOSwgMHg3ZmFlLCAweDdmYjYsIDB4N2ZiOCwgMHg4YjcxLAorICAgIDB4N2ZjNSwgMHg3ZmM2LCAweDdmY2EsIDB4N2ZkNSwgMHg3ZmQ0LCAweDdmZTEsIDB4N2ZlNiwgMHg3ZmU5LAorICAgIDB4N2ZmMywgMHg3ZmY5LCAweDk4ZGMsIDB4ODAwNiwgMHg4MDA0LCAweDgwMGIsIDB4ODAxMiwgMHg4MDE4LAorICAgIDB4ODAxOSwgMHg4MDFjLCAweDgwMjEsIDB4ODAyOCwgMHg4MDNmLCAweDgwM2IsIDB4ODA0YSwgMHg4MDQ2LAorICAgIDB4ODA1MiwgMHg4MDU4LCAweDgwNWEsIDB4ODA1ZiwgMHg4MDYyLCAweDgwNjgsIDB4ODA3MywgMHg4MDcyLAorICAgIDB4ODA3MCwgMHg4MDc2LCAweDgwNzksIDB4ODA3ZCwgMHg4MDdmLCAweDgwODQsIDB4ODA4NiwgMHg4MDg1LAorICAgIDB4ODA5YiwgMHg4MDkzLCAweDgwOWEsIDB4ODBhZCwgMHg1MTkwLCAweDgwYWMsIDB4ODBkYiwgMHg4MGU1LAorICAgIDB4ODBkOSwgMHg4MGRkLCAweDgwYzQsIDB4ODBkYSwgMHg4MGQ2LCAweDgxMDksIDB4ODBlZiwgMHg4MGYxLAorICAgIDB4ODExYiwgMHg4MTI5LCAweDgxMjMsIDB4ODEyZiwgMHg4MTRiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4OTY4YiwgMHg4MTQ2LCAweDgxM2UsIDB4ODE1MywgMHg4MTUxLCAweDgwZmMsIDB4ODE3MSwgMHg4MTZlLAorICAgIDB4ODE2NSwgMHg4MTY2LCAweDgxNzQsIDB4ODE4MywgMHg4MTg4LCAweDgxOGEsIDB4ODE4MCwgMHg4MTgyLAorICAgIDB4ODFhMCwgMHg4MTk1LCAweDgxYTQsIDB4ODFhMywgMHg4MTVmLCAweDgxOTMsIDB4ODFhOSwgMHg4MWIwLAorICAgIDB4ODFiNSwgMHg4MWJlLCAweDgxYjgsIDB4ODFiZCwgMHg4MWMwLCAweDgxYzIsIDB4ODFiYSwgMHg4MWM5LAorICAgIDB4ODFjZCwgMHg4MWQxLCAweDgxZDksIDB4ODFkOCwgMHg4MWM4LCAweDgxZGEsIDB4ODFkZiwgMHg4MWUwLAorICAgIDB4ODFlNywgMHg4MWZhLCAweDgxZmIsIDB4ODFmZSwgMHg4MjAxLCAweDgyMDIsIDB4ODIwNSwgMHg4MjA3LAorICAgIDB4ODIwYSwgMHg4MjBkLCAweDgyMTAsIDB4ODIxNiwgMHg4MjI5LCAweDgyMmIsIDB4ODIzOCwgMHg4MjMzLAorICAgIDB4ODI0MCwgMHg4MjU5LCAweDgyNTgsIDB4ODI1ZCwgMHg4MjVhLCAweDgyNWYsIDB4ODI2NCwgMHhmZmZkLAorICAgIDB4ODI2MiwgMHg4MjY4LCAweDgyNmEsIDB4ODI2YiwgMHg4MjJlLCAweDgyNzEsIDB4ODI3NywgMHg4Mjc4LAorICAgIDB4ODI3ZSwgMHg4MjhkLCAweDgyOTIsIDB4ODJhYiwgMHg4MjlmLCAweDgyYmIsIDB4ODJhYywgMHg4MmUxLAorICAgIDB4ODJlMywgMHg4MmRmLCAweDgyZDIsIDB4ODJmNCwgMHg4MmYzLCAweDgyZmEsIDB4ODM5MywgMHg4MzAzLAorICAgIDB4ODJmYiwgMHg4MmY5LCAweDgyZGUsIDB4ODMwNiwgMHg4MmRjLCAweDgzMDksIDB4ODJkOSwgMHg4MzM1LAorICAgIDB4ODMzNCwgMHg4MzE2LCAweDgzMzIsIDB4ODMzMSwgMHg4MzQwLCAweDgzMzksIDB4ODM1MCwgMHg4MzQ1LAorICAgIDB4ODMyZiwgMHg4MzJiLCAweDgzMTcsIDB4ODMxOCwgMHg4Mzg1LCAweDgzOWEsIDB4ODNhYSwgMHg4MzlmLAorICAgIDB4ODNhMiwgMHg4Mzk2LCAweDgzMjMsIDB4ODM4ZSwgMHg4Mzg3LCAweDgzOGEsIDB4ODM3YywgMHg4M2I1LAorICAgIDB4ODM3MywgMHg4Mzc1LCAweDgzYTAsIDB4ODM4OSwgMHg4M2E4LCAweDgzZjQsIDB4ODQxMywgMHg4M2ViLAorICAgIDB4ODNjZSwgMHg4M2ZkLCAweDg0MDMsIDB4ODNkOCwgMHg4NDBiLCAweDgzYzEsIDB4ODNmNywgMHg4NDA3LAorICAgIDB4ODNlMCwgMHg4M2YyLCAweDg0MGQsIDB4ODQyMiwgMHg4NDIwLCAweDgzYmQsIDB4ODQzOCwgMHg4NTA2LAorICAgIDB4ODNmYiwgMHg4NDZkLCAweDg0MmEsIDB4ODQzYywgMHg4NTVhLCAweDg0ODQsIDB4ODQ3NywgMHg4NDZiLAorICAgIDB4ODRhZCwgMHg4NDZlLCAweDg0ODIsIDB4ODQ2OSwgMHg4NDQ2LCAweDg0MmMsIDB4ODQ2ZiwgMHg4NDc5LAorICAgIDB4ODQzNSwgMHg4NGNhLCAweDg0NjIsIDB4ODRiOSwgMHg4NGJmLCAweDg0OWYsIDB4ODRkOSwgMHg4NGNkLAorICAgIDB4ODRiYiwgMHg4NGRhLCAweDg0ZDAsIDB4ODRjMSwgMHg4NGM2LCAweDg0ZDYsIDB4ODRhMSwgMHg4NTIxLAorICAgIDB4ODRmZiwgMHg4NGY0LCAweDg1MTcsIDB4ODUxOCwgMHg4NTJjLCAweDg1MWYsIDB4ODUxNSwgMHg4NTE0LAorICAgIDB4ODRmYywgMHg4NTQwLCAweDg1NjMsIDB4ODU1OCwgMHg4NTQ4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ODU0MSwgMHg4NjAyLCAweDg1NGIsIDB4ODU1NSwgMHg4NTgwLCAweDg1YTQsIDB4ODU4OCwgMHg4NTkxLAorICAgIDB4ODU4YSwgMHg4NWE4LCAweDg1NmQsIDB4ODU5NCwgMHg4NTliLCAweDg1ZWEsIDB4ODU4NywgMHg4NTljLAorICAgIDB4ODU3NywgMHg4NTdlLCAweDg1OTAsIDB4ODVjOSwgMHg4NWJhLCAweDg1Y2YsIDB4ODViOSwgMHg4NWQwLAorICAgIDB4ODVkNSwgMHg4NWRkLCAweDg1ZTUsIDB4ODVkYywgMHg4NWY5LCAweDg2MGEsIDB4ODYxMywgMHg4NjBiLAorICAgIDB4ODVmZSwgMHg4NWZhLCAweDg2MDYsIDB4ODYyMiwgMHg4NjFhLCAweDg2MzAsIDB4ODYzZiwgMHg4NjRkLAorICAgIDB4NGU1NSwgMHg4NjU0LCAweDg2NWYsIDB4ODY2NywgMHg4NjcxLCAweDg2OTMsIDB4ODZhMywgMHg4NmE5LAorICAgIDB4ODZhYSwgMHg4NjhiLCAweDg2OGMsIDB4ODZiNiwgMHg4NmFmLCAweDg2YzQsIDB4ODZjNiwgMHg4NmIwLAorICAgIDB4ODZjOSwgMHg4ODIzLCAweDg2YWIsIDB4ODZkNCwgMHg4NmRlLCAweDg2ZTksIDB4ODZlYywgMHhmZmZkLAorICAgIDB4ODZkZiwgMHg4NmRiLCAweDg2ZWYsIDB4ODcxMiwgMHg4NzA2LCAweDg3MDgsIDB4ODcwMCwgMHg4NzAzLAorICAgIDB4ODZmYiwgMHg4NzExLCAweDg3MDksIDB4ODcwZCwgMHg4NmY5LCAweDg3MGEsIDB4ODczNCwgMHg4NzNmLAorICAgIDB4ODczNywgMHg4NzNiLCAweDg3MjUsIDB4ODcyOSwgMHg4NzFhLCAweDg3NjAsIDB4ODc1ZiwgMHg4Nzc4LAorICAgIDB4ODc0YywgMHg4NzRlLCAweDg3NzQsIDB4ODc1NywgMHg4NzY4LCAweDg3NmUsIDB4ODc1OSwgMHg4NzUzLAorICAgIDB4ODc2MywgMHg4NzZhLCAweDg4MDUsIDB4ODdhMiwgMHg4NzlmLCAweDg3ODIsIDB4ODdhZiwgMHg4N2NiLAorICAgIDB4ODdiZCwgMHg4N2MwLCAweDg3ZDAsIDB4OTZkNiwgMHg4N2FiLCAweDg3YzQsIDB4ODdiMywgMHg4N2M3LAorICAgIDB4ODdjNiwgMHg4N2JiLCAweDg3ZWYsIDB4ODdmMiwgMHg4N2UwLCAweDg4MGYsIDB4ODgwZCwgMHg4N2ZlLAorICAgIDB4ODdmNiwgMHg4N2Y3LCAweDg4MGUsIDB4ODdkMiwgMHg4ODExLCAweDg4MTYsIDB4ODgxNSwgMHg4ODIyLAorICAgIDB4ODgyMSwgMHg4ODMxLCAweDg4MzYsIDB4ODgzOSwgMHg4ODI3LCAweDg4M2IsIDB4ODg0NCwgMHg4ODQyLAorICAgIDB4ODg1MiwgMHg4ODU5LCAweDg4NWUsIDB4ODg2MiwgMHg4ODZiLCAweDg4ODEsIDB4ODg3ZSwgMHg4ODllLAorICAgIDB4ODg3NSwgMHg4ODdkLCAweDg4YjUsIDB4ODg3MiwgMHg4ODgyLCAweDg4OTcsIDB4ODg5MiwgMHg4OGFlLAorICAgIDB4ODg5OSwgMHg4OGEyLCAweDg4OGQsIDB4ODhhNCwgMHg4OGIwLCAweDg4YmYsIDB4ODhiMSwgMHg4OGMzLAorICAgIDB4ODhjNCwgMHg4OGQ0LCAweDg4ZDgsIDB4ODhkOSwgMHg4OGRkLCAweDg4ZjksIDB4ODkwMiwgMHg4OGZjLAorICAgIDB4ODhmNCwgMHg4OGU4LCAweDg4ZjIsIDB4ODkwNCwgMHg4OTBjLCAweDg5MGEsIDB4ODkxMywgMHg4OTQzLAorICAgIDB4ODkxZSwgMHg4OTI1LCAweDg5MmEsIDB4ODkyYiwgMHg4OTQxLCAweDg5NDQsIDB4ODkzYiwgMHg4OTM2LAorICAgIDB4ODkzOCwgMHg4OTRjLCAweDg5MWQsIDB4ODk2MCwgMHg4OTVlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ODk2NiwgMHg4OTY0LCAweDg5NmQsIDB4ODk2YSwgMHg4OTZmLCAweDg5NzQsIDB4ODk3NywgMHg4OTdlLAorICAgIDB4ODk4MywgMHg4OTg4LCAweDg5OGEsIDB4ODk5MywgMHg4OTk4LCAweDg5YTEsIDB4ODlhOSwgMHg4OWE2LAorICAgIDB4ODlhYywgMHg4OWFmLCAweDg5YjIsIDB4ODliYSwgMHg4OWJkLCAweDg5YmYsIDB4ODljMCwgMHg4OWRhLAorICAgIDB4ODlkYywgMHg4OWRkLCAweDg5ZTcsIDB4ODlmNCwgMHg4OWY4LCAweDhhMDMsIDB4OGExNiwgMHg4YTEwLAorICAgIDB4OGEwYywgMHg4YTFiLCAweDhhMWQsIDB4OGEyNSwgMHg4YTM2LCAweDhhNDEsIDB4OGE1YiwgMHg4YTUyLAorICAgIDB4OGE0NiwgMHg4YTQ4LCAweDhhN2MsIDB4OGE2ZCwgMHg4YTZjLCAweDhhNjIsIDB4OGE4NSwgMHg4YTgyLAorICAgIDB4OGE4NCwgMHg4YWE4LCAweDhhYTEsIDB4OGE5MSwgMHg4YWE1LCAweDhhYTYsIDB4OGE5YSwgMHg4YWEzLAorICAgIDB4OGFjNCwgMHg4YWNkLCAweDhhYzIsIDB4OGFkYSwgMHg4YWViLCAweDhhZjMsIDB4OGFlNywgMHhmZmZkLAorICAgIDB4OGFlNCwgMHg4YWYxLCAweDhiMTQsIDB4OGFlMCwgMHg4YWUyLCAweDhhZjcsIDB4OGFkZSwgMHg4YWRiLAorICAgIDB4OGIwYywgMHg4YjA3LCAweDhiMWEsIDB4OGFlMSwgMHg4YjE2LCAweDhiMTAsIDB4OGIxNywgMHg4YjIwLAorICAgIDB4OGIzMywgMHg5N2FiLCAweDhiMjYsIDB4OGIyYiwgMHg4YjNlLCAweDhiMjgsIDB4OGI0MSwgMHg4YjRjLAorICAgIDB4OGI0ZiwgMHg4YjRlLCAweDhiNDksIDB4OGI1NiwgMHg4YjViLCAweDhiNWEsIDB4OGI2YiwgMHg4YjVmLAorICAgIDB4OGI2YywgMHg4YjZmLCAweDhiNzQsIDB4OGI3ZCwgMHg4YjgwLCAweDhiOGMsIDB4OGI4ZSwgMHg4YjkyLAorICAgIDB4OGI5MywgMHg4Yjk2LCAweDhiOTksIDB4OGI5YSwgMHg4YzNhLCAweDhjNDEsIDB4OGMzZiwgMHg4YzQ4LAorICAgIDB4OGM0YywgMHg4YzRlLCAweDhjNTAsIDB4OGM1NSwgMHg4YzYyLCAweDhjNmMsIDB4OGM3OCwgMHg4YzdhLAorICAgIDB4OGM4MiwgMHg4Yzg5LCAweDhjODUsIDB4OGM4YSwgMHg4YzhkLCAweDhjOGUsIDB4OGM5NCwgMHg4YzdjLAorICAgIDB4OGM5OCwgMHg2MjFkLCAweDhjYWQsIDB4OGNhYSwgMHg4Y2JkLCAweDhjYjIsIDB4OGNiMywgMHg4Y2FlLAorICAgIDB4OGNiNiwgMHg4Y2M4LCAweDhjYzEsIDB4OGNlNCwgMHg4Y2UzLCAweDhjZGEsIDB4OGNmZCwgMHg4Y2ZhLAorICAgIDB4OGNmYiwgMHg4ZDA0LCAweDhkMDUsIDB4OGQwYSwgMHg4ZDA3LCAweDhkMGYsIDB4OGQwZCwgMHg4ZDEwLAorICAgIDB4OWY0ZSwgMHg4ZDEzLCAweDhjY2QsIDB4OGQxNCwgMHg4ZDE2LCAweDhkNjcsIDB4OGQ2ZCwgMHg4ZDcxLAorICAgIDB4OGQ3MywgMHg4ZDgxLCAweDhkOTksIDB4OGRjMiwgMHg4ZGJlLCAweDhkYmEsIDB4OGRjZiwgMHg4ZGRhLAorICAgIDB4OGRkNiwgMHg4ZGNjLCAweDhkZGIsIDB4OGRjYiwgMHg4ZGVhLCAweDhkZWIsIDB4OGRkZiwgMHg4ZGUzLAorICAgIDB4OGRmYywgMHg4ZTA4LCAweDhlMDksIDB4OGRmZiwgMHg4ZTFkLCAweDhlMWUsIDB4OGUxMCwgMHg4ZTFmLAorICAgIDB4OGU0MiwgMHg4ZTM1LCAweDhlMzAsIDB4OGUzNCwgMHg4ZTRhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4OGU0NywgMHg4ZTQ5LCAweDhlNGMsIDB4OGU1MCwgMHg4ZTQ4LCAweDhlNTksIDB4OGU2NCwgMHg4ZTYwLAorICAgIDB4OGUyYSwgMHg4ZTYzLCAweDhlNTUsIDB4OGU3NiwgMHg4ZTcyLCAweDhlN2MsIDB4OGU4MSwgMHg4ZTg3LAorICAgIDB4OGU4NSwgMHg4ZTg0LCAweDhlOGIsIDB4OGU4YSwgMHg4ZTkzLCAweDhlOTEsIDB4OGU5NCwgMHg4ZTk5LAorICAgIDB4OGVhYSwgMHg4ZWExLCAweDhlYWMsIDB4OGViMCwgMHg4ZWM2LCAweDhlYjEsIDB4OGViZSwgMHg4ZWM1LAorICAgIDB4OGVjOCwgMHg4ZWNiLCAweDhlZGIsIDB4OGVlMywgMHg4ZWZjLCAweDhlZmIsIDB4OGVlYiwgMHg4ZWZlLAorICAgIDB4OGYwYSwgMHg4ZjA1LCAweDhmMTUsIDB4OGYxMiwgMHg4ZjE5LCAweDhmMTMsIDB4OGYxYywgMHg4ZjFmLAorICAgIDB4OGYxYiwgMHg4ZjBjLCAweDhmMjYsIDB4OGYzMywgMHg4ZjNiLCAweDhmMzksIDB4OGY0NSwgMHg4ZjQyLAorICAgIDB4OGYzZSwgMHg4ZjRjLCAweDhmNDksIDB4OGY0NiwgMHg4ZjRlLCAweDhmNTcsIDB4OGY1YywgMHhmZmZkLAorICAgIDB4OGY2MiwgMHg4ZjYzLCAweDhmNjQsIDB4OGY5YywgMHg4ZjlmLCAweDhmYTMsIDB4OGZhZCwgMHg4ZmFmLAorICAgIDB4OGZiNywgMHg4ZmRhLCAweDhmZTUsIDB4OGZlMiwgMHg4ZmVhLCAweDhmZWYsIDB4OTA4NywgMHg4ZmY0LAorICAgIDB4OTAwNSwgMHg4ZmY5LCAweDhmZmEsIDB4OTAxMSwgMHg5MDE1LCAweDkwMjEsIDB4OTAwZCwgMHg5MDFlLAorICAgIDB4OTAxNiwgMHg5MDBiLCAweDkwMjcsIDB4OTAzNiwgMHg5MDM1LCAweDkwMzksIDB4OGZmOCwgMHg5MDRmLAorICAgIDB4OTA1MCwgMHg5MDUxLCAweDkwNTIsIDB4OTAwZSwgMHg5MDQ5LCAweDkwM2UsIDB4OTA1NiwgMHg5MDU4LAorICAgIDB4OTA1ZSwgMHg5MDY4LCAweDkwNmYsIDB4OTA3NiwgMHg5NmE4LCAweDkwNzIsIDB4OTA4MiwgMHg5MDdkLAorICAgIDB4OTA4MSwgMHg5MDgwLCAweDkwOGEsIDB4OTA4OSwgMHg5MDhmLCAweDkwYTgsIDB4OTBhZiwgMHg5MGIxLAorICAgIDB4OTBiNSwgMHg5MGUyLCAweDkwZTQsIDB4NjI0OCwgMHg5MGRiLCAweDkxMDIsIDB4OTExMiwgMHg5MTE5LAorICAgIDB4OTEzMiwgMHg5MTMwLCAweDkxNGEsIDB4OTE1NiwgMHg5MTU4LCAweDkxNjMsIDB4OTE2NSwgMHg5MTY5LAorICAgIDB4OTE3MywgMHg5MTcyLCAweDkxOGIsIDB4OTE4OSwgMHg5MTgyLCAweDkxYTIsIDB4OTFhYiwgMHg5MWFmLAorICAgIDB4OTFhYSwgMHg5MWI1LCAweDkxYjQsIDB4OTFiYSwgMHg5MWMwLCAweDkxYzEsIDB4OTFjOSwgMHg5MWNiLAorICAgIDB4OTFkMCwgMHg5MWQ2LCAweDkxZGYsIDB4OTFlMSwgMHg5MWRiLCAweDkxZmMsIDB4OTFmNSwgMHg5MWY2LAorICAgIDB4OTIxZSwgMHg5MWZmLCAweDkyMTQsIDB4OTIyYywgMHg5MjE1LCAweDkyMTEsIDB4OTI1ZSwgMHg5MjU3LAorICAgIDB4OTI0NSwgMHg5MjQ5LCAweDkyNjQsIDB4OTI0OCwgMHg5Mjk1LCAweDkyM2YsIDB4OTI0YiwgMHg5MjUwLAorICAgIDB4OTI5YywgMHg5Mjk2LCAweDkyOTMsIDB4OTI5YiwgMHg5MjVhLCAweDkyY2YsIDB4OTJiOSwgMHg5MmI3LAorICAgIDB4OTJlOSwgMHg5MzBmLCAweDkyZmEsIDB4OTM0NCwgMHg5MzJlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4OTMxOSwgMHg5MzIyLCAweDkzMWEsIDB4OTMyMywgMHg5MzNhLCAweDkzMzUsIDB4OTMzYiwgMHg5MzVjLAorICAgIDB4OTM2MCwgMHg5MzdjLCAweDkzNmUsIDB4OTM1NiwgMHg5M2IwLCAweDkzYWMsIDB4OTNhZCwgMHg5Mzk0LAorICAgIDB4OTNiOSwgMHg5M2Q2LCAweDkzZDcsIDB4OTNlOCwgMHg5M2U1LCAweDkzZDgsIDB4OTNjMywgMHg5M2RkLAorICAgIDB4OTNkMCwgMHg5M2M4LCAweDkzZTQsIDB4OTQxYSwgMHg5NDE0LCAweDk0MTMsIDB4OTQwMywgMHg5NDA3LAorICAgIDB4OTQxMCwgMHg5NDM2LCAweDk0MmIsIDB4OTQzNSwgMHg5NDIxLCAweDk0M2EsIDB4OTQ0MSwgMHg5NDUyLAorICAgIDB4OTQ0NCwgMHg5NDViLCAweDk0NjAsIDB4OTQ2MiwgMHg5NDVlLCAweDk0NmEsIDB4OTIyOSwgMHg5NDcwLAorICAgIDB4OTQ3NSwgMHg5NDc3LCAweDk0N2QsIDB4OTQ1YSwgMHg5NDdjLCAweDk0N2UsIDB4OTQ4MSwgMHg5NDdmLAorICAgIDB4OTU4MiwgMHg5NTg3LCAweDk1OGEsIDB4OTU5NCwgMHg5NTk2LCAweDk1OTgsIDB4OTU5OSwgMHhmZmZkLAorICAgIDB4OTVhMCwgMHg5NWE4LCAweDk1YTcsIDB4OTVhZCwgMHg5NWJjLCAweDk1YmIsIDB4OTViOSwgMHg5NWJlLAorICAgIDB4OTVjYSwgMHg2ZmY2LCAweDk1YzMsIDB4OTVjZCwgMHg5NWNjLCAweDk1ZDUsIDB4OTVkNCwgMHg5NWQ2LAorICAgIDB4OTVkYywgMHg5NWUxLCAweDk1ZTUsIDB4OTVlMiwgMHg5NjIxLCAweDk2MjgsIDB4OTYyZSwgMHg5NjJmLAorICAgIDB4OTY0MiwgMHg5NjRjLCAweDk2NGYsIDB4OTY0YiwgMHg5Njc3LCAweDk2NWMsIDB4OTY1ZSwgMHg5NjVkLAorICAgIDB4OTY1ZiwgMHg5NjY2LCAweDk2NzIsIDB4OTY2YywgMHg5NjhkLCAweDk2OTgsIDB4OTY5NSwgMHg5Njk3LAorICAgIDB4OTZhYSwgMHg5NmE3LCAweDk2YjEsIDB4OTZiMiwgMHg5NmIwLCAweDk2YjQsIDB4OTZiNiwgMHg5NmI4LAorICAgIDB4OTZiOSwgMHg5NmNlLCAweDk2Y2IsIDB4OTZjOSwgMHg5NmNkLCAweDg5NGQsIDB4OTZkYywgMHg5NzBkLAorICAgIDB4OTZkNSwgMHg5NmY5LCAweDk3MDQsIDB4OTcwNiwgMHg5NzA4LCAweDk3MTMsIDB4OTcwZSwgMHg5NzExLAorICAgIDB4OTcwZiwgMHg5NzE2LCAweDk3MTksIDB4OTcyNCwgMHg5NzJhLCAweDk3MzAsIDB4OTczOSwgMHg5NzNkLAorICAgIDB4OTczZSwgMHg5NzQ0LCAweDk3NDYsIDB4OTc0OCwgMHg5NzQyLCAweDk3NDksIDB4OTc1YywgMHg5NzYwLAorICAgIDB4OTc2NCwgMHg5NzY2LCAweDk3NjgsIDB4NTJkMiwgMHg5NzZiLCAweDk3NzEsIDB4OTc3OSwgMHg5Nzg1LAorICAgIDB4OTc3YywgMHg5NzgxLCAweDk3N2EsIDB4OTc4NiwgMHg5NzhiLCAweDk3OGYsIDB4OTc5MCwgMHg5NzljLAorICAgIDB4OTdhOCwgMHg5N2E2LCAweDk3YTMsIDB4OTdiMywgMHg5N2I0LCAweDk3YzMsIDB4OTdjNiwgMHg5N2M4LAorICAgIDB4OTdjYiwgMHg5N2RjLCAweDk3ZWQsIDB4OWY0ZiwgMHg5N2YyLCAweDdhZGYsIDB4OTdmNiwgMHg5N2Y1LAorICAgIDB4OTgwZiwgMHg5ODBjLCAweDk4MzgsIDB4OTgyNCwgMHg5ODIxLCAweDk4MzcsIDB4OTgzZCwgMHg5ODQ2LAorICAgIDB4OTg0ZiwgMHg5ODRiLCAweDk4NmIsIDB4OTg2ZiwgMHg5ODcwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4OTg3MSwgMHg5ODc0LCAweDk4NzMsIDB4OThhYSwgMHg5OGFmLCAweDk4YjEsIDB4OThiNiwgMHg5OGM0LAorICAgIDB4OThjMywgMHg5OGM2LCAweDk4ZTksIDB4OThlYiwgMHg5OTAzLCAweDk5MDksIDB4OTkxMiwgMHg5OTE0LAorICAgIDB4OTkxOCwgMHg5OTIxLCAweDk5MWQsIDB4OTkxZSwgMHg5OTI0LCAweDk5MjAsIDB4OTkyYywgMHg5OTJlLAorICAgIDB4OTkzZCwgMHg5OTNlLCAweDk5NDIsIDB4OTk0OSwgMHg5OTQ1LCAweDk5NTAsIDB4OTk0YiwgMHg5OTUxLAorICAgIDB4OTk1MiwgMHg5OTRjLCAweDk5NTUsIDB4OTk5NywgMHg5OTk4LCAweDk5YTUsIDB4OTlhZCwgMHg5OWFlLAorICAgIDB4OTliYywgMHg5OWRmLCAweDk5ZGIsIDB4OTlkZCwgMHg5OWQ4LCAweDk5ZDEsIDB4OTllZCwgMHg5OWVlLAorICAgIDB4OTlmMSwgMHg5OWYyLCAweDk5ZmIsIDB4OTlmOCwgMHg5YTAxLCAweDlhMGYsIDB4OWEwNSwgMHg5OWUyLAorICAgIDB4OWExOSwgMHg5YTJiLCAweDlhMzcsIDB4OWE0NSwgMHg5YTQyLCAweDlhNDAsIDB4OWE0MywgMHhmZmZkLAorICAgIDB4OWEzZSwgMHg5YTU1LCAweDlhNGQsIDB4OWE1YiwgMHg5YTU3LCAweDlhNWYsIDB4OWE2MiwgMHg5YTY1LAorICAgIDB4OWE2NCwgMHg5YTY5LCAweDlhNmIsIDB4OWE2YSwgMHg5YWFkLCAweDlhYjAsIDB4OWFiYywgMHg5YWMwLAorICAgIDB4OWFjZiwgMHg5YWQxLCAweDlhZDMsIDB4OWFkNCwgMHg5YWRlLCAweDlhZGYsIDB4OWFlMiwgMHg5YWUzLAorICAgIDB4OWFlNiwgMHg5YWVmLCAweDlhZWIsIDB4OWFlZSwgMHg5YWY0LCAweDlhZjEsIDB4OWFmNywgMHg5YWZiLAorICAgIDB4OWIwNiwgMHg5YjE4LCAweDliMWEsIDB4OWIxZiwgMHg5YjIyLCAweDliMjMsIDB4OWIyNSwgMHg5YjI3LAorICAgIDB4OWIyOCwgMHg5YjI5LCAweDliMmEsIDB4OWIyZSwgMHg5YjJmLCAweDliMzIsIDB4OWI0NCwgMHg5YjQzLAorICAgIDB4OWI0ZiwgMHg5YjRkLCAweDliNGUsIDB4OWI1MSwgMHg5YjU4LCAweDliNzQsIDB4OWI5MywgMHg5YjgzLAorICAgIDB4OWI5MSwgMHg5Yjk2LCAweDliOTcsIDB4OWI5ZiwgMHg5YmEwLCAweDliYTgsIDB4OWJiNCwgMHg5YmMwLAorICAgIDB4OWJjYSwgMHg5YmI5LCAweDliYzYsIDB4OWJjZiwgMHg5YmQxLCAweDliZDIsIDB4OWJlMywgMHg5YmUyLAorICAgIDB4OWJlNCwgMHg5YmQ0LCAweDliZTEsIDB4OWMzYSwgMHg5YmYyLCAweDliZjEsIDB4OWJmMCwgMHg5YzE1LAorICAgIDB4OWMxNCwgMHg5YzA5LCAweDljMTMsIDB4OWMwYywgMHg5YzA2LCAweDljMDgsIDB4OWMxMiwgMHg5YzBhLAorICAgIDB4OWMwNCwgMHg5YzJlLCAweDljMWIsIDB4OWMyNSwgMHg5YzI0LCAweDljMjEsIDB4OWMzMCwgMHg5YzQ3LAorICAgIDB4OWMzMiwgMHg5YzQ2LCAweDljM2UsIDB4OWM1YSwgMHg5YzYwLCAweDljNjcsIDB4OWM3NiwgMHg5Yzc4LAorICAgIDB4OWNlNywgMHg5Y2VjLCAweDljZjAsIDB4OWQwOSwgMHg5ZDA4LCAweDljZWIsIDB4OWQwMywgMHg5ZDA2LAorICAgIDB4OWQyYSwgMHg5ZDI2LCAweDlkYWYsIDB4OWQyMywgMHg5ZDFmLCAweDlkNDQsIDB4OWQxNSwgMHg5ZDEyLAorICAgIDB4OWQ0MSwgMHg5ZDNmLCAweDlkM2UsIDB4OWQ0NiwgMHg5ZDQ4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4OWQ1ZCwgMHg5ZDVlLCAweDlkNjQsIDB4OWQ1MSwgMHg5ZDUwLCAweDlkNTksIDB4OWQ3MiwgMHg5ZDg5LAorICAgIDB4OWQ4NywgMHg5ZGFiLCAweDlkNmYsIDB4OWQ3YSwgMHg5ZDlhLCAweDlkYTQsIDB4OWRhOSwgMHg5ZGIyLAorICAgIDB4OWRjNCwgMHg5ZGMxLCAweDlkYmIsIDB4OWRiOCwgMHg5ZGJhLCAweDlkYzYsIDB4OWRjZiwgMHg5ZGMyLAorICAgIDB4OWRkOSwgMHg5ZGQzLCAweDlkZjgsIDB4OWRlNiwgMHg5ZGVkLCAweDlkZWYsIDB4OWRmZCwgMHg5ZTFhLAorICAgIDB4OWUxYiwgMHg5ZTFlLCAweDllNzUsIDB4OWU3OSwgMHg5ZTdkLCAweDllODEsIDB4OWU4OCwgMHg5ZThiLAorICAgIDB4OWU4YywgMHg5ZTkyLCAweDllOTUsIDB4OWU5MSwgMHg5ZTlkLCAweDllYTUsIDB4OWVhOSwgMHg5ZWI4LAorICAgIDB4OWVhYSwgMHg5ZWFkLCAweDk3NjEsIDB4OWVjYywgMHg5ZWNlLCAweDllY2YsIDB4OWVkMCwgMHg5ZWQ0LAorICAgIDB4OWVkYywgMHg5ZWRlLCAweDllZGQsIDB4OWVlMCwgMHg5ZWU1LCAweDllZTgsIDB4OWVlZiwgMHhmZmZkLAorICAgIDB4OWVmNCwgMHg5ZWY2LCAweDllZjcsIDB4OWVmOSwgMHg5ZWZiLCAweDllZmMsIDB4OWVmZCwgMHg5ZjA3LAorICAgIDB4OWYwOCwgMHg3NmI3LCAweDlmMTUsIDB4OWYyMSwgMHg5ZjJjLCAweDlmM2UsIDB4OWY0YSwgMHg5ZjUyLAorICAgIDB4OWY1NCwgMHg5ZjYzLCAweDlmNWYsIDB4OWY2MCwgMHg5ZjYxLCAweDlmNjYsIDB4OWY2NywgMHg5ZjZjLAorICAgIDB4OWY2YSwgMHg5Zjc3LCAweDlmNzIsIDB4OWY3NiwgMHg5Zjk1LCAweDlmOWMsIDB4OWZhMCwgMHg1ODJmLAorICAgIDB4NjljNywgMHg5MDU5LCAweDc0NjQsIDB4NTFkYywgMHg3MTk5Cit9OworCisvKiBVbmljb2RlLXRvLUthbmppIHRhYmxlcy4uLiAqLworCitzdGF0aWMgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5pY29kZSB0byBTaGlmdC1KSVMgKi8KK3Vzal8wMzkxW10gPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAzOTEgdGhydSAweDAzOWMgKi8KKyAgICAweDgzOWYsIDB4ODNhMCwgMHg4M2ExLCAweDgzYTIsIDB4ODNhMywgMHg4M2E0LCAweDgzYTUsIDB4ODNhNiwKKyAgICAweDgzYTcsIDB4ODNhOCwgMHg4M2E5LCAweDgzYWEsIDB4ODNhYiwgMHg4M2FjLCAweDgzYWQsIDB4ODNhZSwKKyAgICAweDgzYWYsIDB4ZmZmZCwgMHg4M2IwLCAweDgzYjEsIDB4ODNiMiwgMHg4M2IzLCAweDgzYjQsIDB4ODNiNSwKKyAgICAweDgzYjYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweDgzYmYsIDB4ODNjMCwgMHg4M2MxLCAweDgzYzIsIDB4ODNjMywgMHg4M2M0LCAweDgzYzUsIDB4ODNjNiwKKyAgICAweDgzYzcsIDB4ODNjOCwgMHg4M2M5LCAweDgzY2EsIDB4ODNjYiwgMHg4M2NjLCAweDgzY2QsIDB4ODNjZSwKKyAgICAweDgzY2YsIDB4ZmZmZCwgMHg4M2QwLCAweDgzZDEsIDB4ODNkMiwgMHg4M2QzLCAweDgzZDQsIDB4ODNkNSwgMHg4M2Q2Cit9OworCitzdGF0aWMgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5pY29kZSB0byBTaGlmdC1KSVMgKi8KK3Vzal8wNDAxW10gPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDA0MDEgdGhydSAweDA0NTEgKi8KKyAgICAweDg0NDYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ODQ0MCwKKyAgICAweDg0NDEsIDB4ODQ0MiwgMHg4NDQzLCAweDg0NDQsIDB4ODQ0NSwgMHg4NDQ3LCAweDg0NDgsIDB4ODQ0OSwKKyAgICAweDg0NGEsIDB4ODQ0YiwgMHg4NDRjLCAweDg0NGQsIDB4ODQ0ZSwgMHg4NDRmLCAweDg0NTAsIDB4ODQ1MSwKKyAgICAweDg0NTIsIDB4ODQ1MywgMHg4NDU0LCAweDg0NTUsIDB4ODQ1NiwgMHg4NDU3LCAweDg0NTgsIDB4ODQ1OSwKKyAgICAweDg0NWEsIDB4ODQ1YiwgMHg4NDVjLCAweDg0NWQsIDB4ODQ1ZSwgMHg4NDVmLCAweDg0NjAsIDB4ODQ3MCwKKyAgICAweDg0NzEsIDB4ODQ3MiwgMHg4NDczLCAweDg0NzQsIDB4ODQ3NSwgMHg4NDc3LCAweDg0NzgsIDB4ODQ3OSwKKyAgICAweDg0N2EsIDB4ODQ3YiwgMHg4NDdjLCAweDg0N2QsIDB4ODQ3ZSwgMHg4NDgwLCAweDg0ODEsIDB4ODQ4MiwKKyAgICAweDg0ODMsIDB4ODQ4NCwgMHg4NDg1LCAweDg0ODYsIDB4ODQ4NywgMHg4NDg4LCAweDg0ODksIDB4ODQ4YSwKKyAgICAweDg0OGIsIDB4ODQ4YywgMHg4NDhkLCAweDg0OGUsIDB4ODQ4ZiwgMHg4NDkwLCAweDg0OTEsIDB4ZmZmZCwgMHg4NDc2Cit9OworCitzdGF0aWMgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5pY29kZSB0byBTaGlmdC1KSVMgKi8KK3Vzal8zMDAwW10gPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDMwMDAgdGhydSAweDMwZmYgKi8KKyAgICAweDgxNDAsIDB4ODE0MSwgMHg4MTQyLCAweDgxNTYsIDB4ZmZmZCwgMHg4MTU4LCAweDgxNTksIDB4ODE1YSwKKyAgICAweDgxNzEsIDB4ODE3MiwgMHg4MTczLCAweDgxNzQsIDB4ODE3NSwgMHg4MTc2LCAweDgxNzcsIDB4ODE3OCwKKyAgICAweDgxNzksIDB4ODE3YSwgMHg4MWE3LCAweDgxYWMsIDB4ODE2YiwgMHg4MTZjLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ODE2MCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ODI5ZiwgMHg4MmEwLCAweDgyYTEsIDB4ODJhMiwgMHg4MmEzLCAweDgyYTQsIDB4ODJhNSwKKyAgICAweDgyYTYsIDB4ODJhNywgMHg4MmE4LCAweDgyYTksIDB4ODJhYSwgMHg4MmFiLCAweDgyYWMsIDB4ODJhZCwKKyAgICAweDgyYWUsIDB4ODJhZiwgMHg4MmIwLCAweDgyYjEsIDB4ODJiMiwgMHg4MmIzLCAweDgyYjQsIDB4ODJiNSwKKyAgICAweDgyYjYsIDB4ODJiNywgMHg4MmI4LCAweDgyYjksIDB4ODJiYSwgMHg4MmJiLCAweDgyYmMsIDB4ODJiZCwKKyAgICAweDgyYmUsIDB4ODJiZiwgMHg4MmMwLCAweDgyYzEsIDB4ODJjMiwgMHg4MmMzLCAweDgyYzQsIDB4ODJjNSwKKyAgICAweDgyYzYsIDB4ODJjNywgMHg4MmM4LCAweDgyYzksIDB4ODJjYSwgMHg4MmNiLCAweDgyY2MsIDB4ODJjZCwKKyAgICAweDgyY2UsIDB4ODJjZiwgMHg4MmQwLCAweDgyZDEsIDB4ODJkMiwgMHg4MmQzLCAweDgyZDQsIDB4ODJkNSwKKyAgICAweDgyZDYsIDB4ODJkNywgMHg4MmQ4LCAweDgyZDksIDB4ODJkYSwgMHg4MmRiLCAweDgyZGMsIDB4ODJkZCwKKyAgICAweDgyZGUsIDB4ODJkZiwgMHg4MmUwLCAweDgyZTEsIDB4ODJlMiwgMHg4MmUzLCAweDgyZTQsIDB4ODJlNSwKKyAgICAweDgyZTYsIDB4ODJlNywgMHg4MmU4LCAweDgyZTksIDB4ODJlYSwgMHg4MmViLCAweDgyZWMsIDB4ODJlZCwKKyAgICAweDgyZWUsIDB4ODJlZiwgMHg4MmYwLCAweDgyZjEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDgxNGEsIDB4ODE0YiwgMHg4MTU0LCAweDgxNTUsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ODM0MCwgMHg4MzQxLCAweDgzNDIsIDB4ODM0MywgMHg4MzQ0LCAweDgzNDUsIDB4ODM0NiwKKyAgICAweDgzNDcsIDB4ODM0OCwgMHg4MzQ5LCAweDgzNGEsIDB4ODM0YiwgMHg4MzRjLCAweDgzNGQsIDB4ODM0ZSwKKyAgICAweDgzNGYsIDB4ODM1MCwgMHg4MzUxLCAweDgzNTIsIDB4ODM1MywgMHg4MzU0LCAweDgzNTUsIDB4ODM1NiwKKyAgICAweDgzNTcsIDB4ODM1OCwgMHg4MzU5LCAweDgzNWEsIDB4ODM1YiwgMHg4MzVjLCAweDgzNWQsIDB4ODM1ZSwKKyAgICAweDgzNWYsIDB4ODM2MCwgMHg4MzYxLCAweDgzNjIsIDB4ODM2MywgMHg4MzY0LCAweDgzNjUsIDB4ODM2NiwKKyAgICAweDgzNjcsIDB4ODM2OCwgMHg4MzY5LCAweDgzNmEsIDB4ODM2YiwgMHg4MzZjLCAweDgzNmQsIDB4ODM2ZSwKKyAgICAweDgzNmYsIDB4ODM3MCwgMHg4MzcxLCAweDgzNzIsIDB4ODM3MywgMHg4Mzc0LCAweDgzNzUsIDB4ODM3NiwKKyAgICAweDgzNzcsIDB4ODM3OCwgMHg4Mzc5LCAweDgzN2EsIDB4ODM3YiwgMHg4MzdjLCAweDgzN2QsIDB4ODM3ZSwKKyAgICAweDgzODAsIDB4ODM4MSwgMHg4MzgyLCAweDgzODMsIDB4ODM4NCwgMHg4Mzg1LCAweDgzODYsIDB4ODM4NywKKyAgICAweDgzODgsIDB4ODM4OSwgMHg4MzhhLCAweDgzOGIsIDB4ODM4YywgMHg4MzhkLCAweDgzOGUsIDB4ODM4ZiwKKyAgICAweDgzOTAsIDB4ODM5MSwgMHg4MzkyLCAweDgzOTMsIDB4ODM5NCwgMHg4Mzk1LCAweDgzOTYsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDgxNDUsIDB4ODE1YiwgMHg4MTUyLCAweDgxNTMsIDB4ZmZmZAorfTsKKworc3RhdGljIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuaWNvZGUgdG8gU2hpZnQtSklTICovCit1c2pfZmYwMFtdID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHhmZjAwIHRocnUgMHgwZmY5ZiAqLworICAgIDB4ZmZmZCwgMHg4MTQ5LCAweGZmZmQsIDB4ODE5NCwgMHg4MTkwLCAweDgxOTMsIDB4ODE5NSwgMHhmZmZkLAorICAgIDB4ODE2OSwgMHg4MTZhLCAweDgxOTYsIDB4ODE3YiwgMHg4MTQzLCAweGZmZmQsIDB4ODE0NCwgMHg4MTVlLAorICAgIDB4ODI0ZiwgMHg4MjUwLCAweDgyNTEsIDB4ODI1MiwgMHg4MjUzLCAweDgyNTQsIDB4ODI1NSwgMHg4MjU2LAorICAgIDB4ODI1NywgMHg4MjU4LCAweDgxNDYsIDB4ODE0NywgMHg4MTgzLCAweDgxODEsIDB4ODE4NCwgMHg4MTQ4LAorICAgIDB4ODE5NywgMHg4MjYwLCAweDgyNjEsIDB4ODI2MiwgMHg4MjYzLCAweDgyNjQsIDB4ODI2NSwgMHg4MjY2LAorICAgIDB4ODI2NywgMHg4MjY4LCAweDgyNjksIDB4ODI2YSwgMHg4MjZiLCAweDgyNmMsIDB4ODI2ZCwgMHg4MjZlLAorICAgIDB4ODI2ZiwgMHg4MjcwLCAweDgyNzEsIDB4ODI3MiwgMHg4MjczLCAweDgyNzQsIDB4ODI3NSwgMHg4Mjc2LAorICAgIDB4ODI3NywgMHg4Mjc4LCAweDgyNzksIDB4ODE2ZCwgMHhmZmZkLCAweDgxNmUsIDB4ODE0ZiwgMHg4MTUxLAorICAgIDB4ODE0ZCwgMHg4MjgxLCAweDgyODIsIDB4ODI4MywgMHg4Mjg0LCAweDgyODUsIDB4ODI4NiwgMHg4Mjg3LAorICAgIDB4ODI4OCwgMHg4Mjg5LCAweDgyOGEsIDB4ODI4YiwgMHg4MjhjLCAweDgyOGQsIDB4ODI4ZSwgMHg4MjhmLAorICAgIDB4ODI5MCwgMHg4MjkxLCAweDgyOTIsIDB4ODI5MywgMHg4Mjk0LCAweDgyOTUsIDB4ODI5NiwgMHg4Mjk3LAorICAgIDB4ODI5OCwgMHg4Mjk5LCAweDgyOWEsIDB4ODE2ZiwgMHg4MTYyLCAweDgxNzAsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHgwMGExLCAweDAwYTIsIDB4MDBhMywgMHgwMGE0LCAweDAwYTUsIDB4MDBhNiwgMHgwMGE3LAorICAgIDB4MDBhOCwgMHgwMGE5LCAweDAwYWEsIDB4MDBhYiwgMHgwMGFjLCAweDAwYWQsIDB4MDBhZSwgMHgwMGFmLAorICAgIDB4MDBiMCwgMHgwMGIxLCAweDAwYjIsIDB4MDBiMywgMHgwMGI0LCAweDAwYjUsIDB4MDBiNiwgMHgwMGI3LAorICAgIDB4MDBiOCwgMHgwMGI5LCAweDAwYmEsIDB4MDBiYiwgMHgwMGJjLCAweDAwYmQsIDB4MDBiZSwgMHgwMGJmLAorICAgIDB4MDBjMCwgMHgwMGMxLCAweDAwYzIsIDB4MDBjMywgMHgwMGM0LCAweDAwYzUsIDB4MDBjNiwgMHgwMGM3LAorICAgIDB4MDBjOCwgMHgwMGM5LCAweDAwY2EsIDB4MDBjYiwgMHgwMGNjLCAweDAwY2QsIDB4MDBjZSwgMHgwMGNmLAorICAgIDB4MDBkMCwgMHgwMGQxLCAweDAwZDIsIDB4MDBkMywgMHgwMGQ0LCAweDAwZDUsIDB4MDBkNiwgMHgwMGQ3LAorICAgIDB4MDBkOCwgMHgwMGQ5LCAweDAwZGEsIDB4MDBkYiwgMHgwMGRjLCAweDAwZGQsIDB4MDBkZSwgMHgwMGRmCit9OworCisvKiBOb3cgb25lIGh1bW9uZ291cyB0YWJsZSBmb3IgS2FuamkgKi8KKworc3RhdGljIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuaWNvZGUgdG8gU2hpZnQtSklTICovCit1c2pfNGUwMFtdID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg0ZTAwIHRocnUgMHg5ZmEwICovCisgICAgMHg4OGVhLCAweDkyOWEsIDB4ZmZmZCwgMHg4ZWI1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk2OWMsCisgICAgMHg4ZmU0LCAweDhlNGYsIDB4OGZlMywgMHg4OWJhLCAweGZmZmQsIDB4OTU3MywgMHg5NzVlLCAweGZmZmQsCisgICAgMHg5OGEwLCAweDg5NGUsIDB4ZmZmZCwgMHhmZmZkLCAweDhhOGUsIDB4OThhMSwgMHg5MGEyLCAweDk5YzAsCisgICAgMHg4Yjc1LCAweDk1YjgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZmU1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3YmMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWMwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OThhMiwgMHhmZmZkLCAweGZmZmQsIDB4OTI4NiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk4YTMsIDB4OGJmOCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OGE0LCAweGZmZmQsCisgICAgMHg4YWRiLCAweDkyNGYsIDB4ZmZmZCwgMHg4ZWU1LCAweDk4YTUsIDB4ZmZmZCwgMHhmZmZkLCAweDk4YTYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OThhNywgMHg5NDU0LCAweGZmZmQsIDB4OGI3NiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NDU2LCAweGZmZmQsIDB4OTNlMSwgMHg4Y2MxLCAweDk2NTIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTU2OCwgMHg5OGE4LCAweDhmZTYsCisgICAgMHg5OGE5LCAweDg5YjMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGJlMywgMHg4Y2VlLCAweDk2ZTcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWJhNCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3OTAsIDB4ZmZmZCwgMHg5M2ZiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YWEzLCAweGZmZmQsCisgICAgMHg4YjU0LCAweGZmZmQsIDB4OThhYSwgMHhmZmZkLCAweGZmZmQsIDB4OThhYiwgMHg5N2I5LCAweGZmZmQsCisgICAgMHg5NzVjLCAweDkxODgsIDB4OThhZCwgMHg4ZTk2LCAweDkzZjEsIDB4ZmZmZCwgMHg5OGIwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5NWQsIDB4OGNkZCwgMHhmZmZkLCAweDhjZGMsIDB4ODhlNCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ODZhLCAweDk4NjksIDB4ZmZmZCwgMHg4ZGIxLCAweDg4OWYsIDB4ZmZmZCwgMHg5OGIxLCAweDk4YjIsCisgICAgMHg5OGIzLCAweDk2NTMsIDB4OThiNCwgMHhmZmZkLCAweDhjZjAsIDB4ODhlNSwgMHg5NjkyLCAweGZmZmQsCisgICAgMHg4YjljLCAweGZmZmQsIDB4ZmZmZCwgMHg4YjlkLCAweDhiOWUsIDB4OTJlMCwgMHg5N2JhLCAweGZmZmQsCisgICAgMHg5OGI1LCAweGZmZmQsIDB4ZmZmZCwgMHg5OGI2LCAweGZmZmQsIDB4ZmZmZCwgMHg5OGI3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTA2YywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZjU5LCAweDkwNmQsIDB4OThiYywgMHhmZmZkLCAweDk4YmEsIDB4ZmZmZCwgMHg5OGJiLCAweDhiNzcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGRhMSwgMHg4OWVlLCAweGZmZmQsIDB4OThiOSwgMHg5OGI4LCAweDk1YTcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhlNjUsIDB4OGU2NCwgMHg5MWJjLCAweDk4YmQsCisgICAgMHg5NTc0LCAweDkwZTUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ODE1NywgMHg5OGJlLCAweDk4YzAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MWUzLCAweDk3ZGYsIDB4ODhjOCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OThiZiwgMHg4OWJjLCAweGZmZmQsCisgICAgMHg4YmMyLCAweGZmZmQsIDB4OTI4NywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YzhmLCAweDk4YzEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NDQzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhhZTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk4YzIsIDB4ODhjOSwgMHhmZmZkLCAweGZmZmQsIDB4OGNkZSwgMHg4YWVhLCAweDk1OWEsCisgICAgMHg5NGIwLCAweDhiNzgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODllZiwgMHhmZmZkLCAweDk4ZTUsIDB4OTM2MCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk0OGMsCisgICAgMHg5OGM0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk0YmEsIDB4ZmZmZCwgMHg5N2UwLCAweGZmZmQsCisgICAgMHg5MDRjLCAweGZmZmQsIDB4OGU2NiwgMHhmZmZkLCAweDhlOTcsIDB4ODliZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MmNmLCAweGZmZmQsIDB4ZmZmZCwgMHg5MjQxLCAweDk4YzgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ODhjYSwgMHg5MmUxLCAweDhmNWEsCisgICAgMHg4ZGIyLCAweDk3NDMsIDB4ZmZmZCwgMHg5MWNjLCAweGZmZmQsIDB4ODliZCwgMHhmZmZkLCAweDk4YzcsCisgICAgMHhmZmZkLCAweDk3NWQsIDB4OThjMywgMHg5OGM1LCAweDhkZWMsIDB4OThjNiwgMHg5YjQzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk4Y2UsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk4ZDEsCisgICAgMHg5OGNmLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWMwLCAweGZmZmQsIDB4OTViOSwgMHg5OGM5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OGNkLCAweDhjZjEsIDB4ZmZmZCwgMHhmZmZkLCAweDhlNjcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YWE0LCAweGZmZmQsIDB4ZmZmZCwgMHg5OGQyLCAweGZmZmQsCisgICAgMHg5OGNhLCAweGZmZmQsIDB4ZmZmZCwgMHg5N2UxLCAweGZmZmQsIDB4OGU5OCwgMHhmZmZkLCAweDk4Y2IsCisgICAgMHhmZmZkLCAweDk4ZDAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OGQzLCAweGZmZmQsCisgICAgMHg5OGNjLCAweGZmZmQsIDB4ZmZmZCwgMHg4YjlmLCAweGZmZmQsIDB4ODhjYiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YmEwLCAweDg5YmYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YjQ0LCAweGZmZmQsIDB4OTY5OSwgMHg5NThlLCAweDhjZjIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTA0ZSwgMHg5N2I1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1ZDYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGM1NywgMHg5MWEzLCAweDg5ZTIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGY3MiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OGQ3LCAweGZmZmQsCisgICAgMHg5OGRjLCAweDk4ZGEsIDB4ZmZmZCwgMHhmZmZkLCAweDk4ZDUsIDB4ZmZmZCwgMHhmZmZkLCAweDkxYWQsCisgICAgMHg5OGQ4LCAweGZmZmQsIDB4OThkYiwgMHg5OGQ5LCAweGZmZmQsIDB4OTVkYiwgMHhmZmZkLCAweDk4ZDYsCisgICAgMHhmZmZkLCAweDkwNGQsIDB4ZmZmZCwgMHg5NjkzLCAweDk4ZGQsIDB4OThkZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZjQzLCAweDk4ZWIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NDZmLCAweGZmZmQsIDB4OTU1NSwgMHg5OGU2LCAweGZmZmQsCisgICAgMHg5NWVlLCAweGZmZmQsIDB4ODliNCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OGVhLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OThlNCwgMHg5OGVkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkxNzEsIDB4ZmZmZCwgMHg4Y2MyLCAweGZmZmQsIDB4OTQ3YiwgMHhmZmZkLCAweGUwYzUsCisgICAgMHhmZmZkLCAweDk4ZWMsIDB4OTM3YywgMHhmZmZkLCAweDk4ZTEsIDB4ZmZmZCwgMHg4Y2Y0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjZjMsIDB4OThkZiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhlZDgsCisgICAgMHhmZmZkLCAweDk4ZTcsIDB4ZmZmZCwgMHg5NWVkLCAweDkyNmMsIDB4OThlMywgMHg4YzkxLCAweGZmZmQsCisgICAgMHg5OGUwLCAweDk4ZTgsIDB4OThlMiwgMHg5N2NmLCAweDk4ZTksIDB4OTg2MCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YmU0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjOTAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OGVlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk4ZWYsCisgICAgMHg5OGYzLCAweDg4Y2MsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1Y2UsCisgICAgMHg5OGYyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OThmMSwgMHg5OGY1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OThmNCwgMHhmZmZkLCAweDkyZTIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGM5MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk4ZjYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGVjMywgMHhmZmZkLCAweDkxYTQsIDB4OTJlMywgMHg4YmY0LCAweGZmZmQsCisgICAgMHg5OGY3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGI1NSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5OGY4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OThmYSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTY1NCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjODYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZTUwLCAweDk0ZjUsIDB4OThmOSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhkYzMsIDB4OTc2MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OThmYywgMHg5OTQyLCAweDk4ZmIsIDB4OGRjMiwgMHhmZmZkLCAweDhmOWQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YzU4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTk0MywgMHhmZmZkLCAweGZmZmQsIDB4OGJjZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk5NDAsIDB4OTk0MSwgMHhmZmZkLCAweGZmZmQsIDB4OTNhZCwgMHhmZmZkLCAweDkxOWMsCisgICAgMHhmZmZkLCAweDhiYTEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTY2YywgMHg5OTQ0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTdiYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OTQ1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OTQ4LCAweGZmZmQsIDB4OTk0NiwgMHhmZmZkLCAweDkxNmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTk0NywgMHg5OTQ5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTk0YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk5NGEsIDB4ZmZmZCwgMHg5NWM2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YjU2LCAweDk5NGQsIDB4OTk0ZSwgMHhmZmZkLCAweDg5YWQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk5NGMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGVmMiwgMHhmZmZkLCAweDk5NTEsIDB4OTk1MCwgMHg5OTRmLCAweGZmZmQsCisgICAgMHg5OGQ0LCAweGZmZmQsIDB4OTk1MiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmOWUsCisgICAgMHhmZmZkLCAweDk5NTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTc0NCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTZkNywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk5NTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTk1NCwgMHg5OTU3LCAweDk5NTYsIDB4ZmZmZCwgMHhmZmZkLCAweDk5NTgsCisgICAgMHg5OTU5LCAweDg4ZjIsIDB4ZmZmZCwgMHg4Y2IzLCAweDhjNWEsIDB4OGY1YiwgMHg5MjliLCAweDhiYTIsCisgICAgMHg5MGU2LCAweDhjZjUsIDB4ZmZmZCwgMHg4ZDhlLCAweDk5NWIsIDB4OTZjNiwgMHg5MzY1LCAweGZmZmQsCisgICAgMHg4ZTk5LCAweGZmZmQsIDB4OTk1YSwgMHhmZmZkLCAweDk5NWMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTM3ZCwgMHhmZmZkLCAweDhhOTUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTk1ZCwgMHhmZmZkLCAweGZmZmQsIDB4OTNmYywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MTUzLCAweDk5NWYsIDB4OTk2MCwgMHg5NGFhLCAweDhjZjYsIDB4OTg1YSwgMHg5OTYxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhiYTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTViYSwgMHg5MWI0LCAweDhiZWYsCisgICAgMHg5MzU0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjOTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5OTYyLCAweGZmZmQsIDB4OTk2MywgMHhmZmZkLCAweGZmZmQsIDB4OTNlMCwgMHg4OTdlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk5NjYsIDB4OGRmYiwgMHhmZmZkLCAweDk5NjUsIDB4OGRjNCwgMHhmZmZkLCAweDk5NjcsCisgICAgMHhlM2VjLCAweDk5NjgsIDB4OTY2MCwgMHg5OTY5LCAweGZmZmQsIDB4OTk2YSwgMHg5OTZiLCAweDhmZTcsCisgICAgMHhmZmZkLCAweDhlY2EsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YWE1LCAweGZmZmQsIDB4OTk2ZSwgMHhmZmZkLCAweDk5NmMsIDB4OTZiYiwgMHg5OTZkLCAweGZmZmQsCisgICAgMHg5NTc5LCAweDk5NmYsIDB4OTk3MCwgMHg5OTcxLCAweDkzN2UsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5OTc1LCAweDk5NzMsIDB4OTk3NCwgMHg5OTcyLCAweDhkZTEsIDB4OTk3NiwgMHg5NmU4LCAweDk3ZTIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTk3NywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwYTYsIDB4OTk3OCwgMHg4Zjc5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk5NzksIDB4ZmZmZCwgMHg5MjljLCAweDk3YmQsIDB4OTM4MCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OWMzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OTdhLCAweGVhYTMsIDB4OGJjMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5OTdiLCAweDk2N2QsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4Zjg4LCAweDkxZmEsCisgICAgMHhmZmZkLCAweDk5N2QsIDB4OTNlMiwgMHhmZmZkLCAweGZmZmQsIDB4OTk3ZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5OTgwLCAweDhhNGQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTk4MSwgMHg4YmE1LCAweGZmZmQsCisgICAgMHg5M2NhLCAweDg5OWEsIDB4OGY2ZiwgMHhmZmZkLCAweGZmZmQsIDB4OTQ5ZiwgMHg5OTgyLCAweGZmZmQsCisgICAgMHg5MzgxLCAweGZmZmQsIDB4ZmZmZCwgMHg5MDZlLCAweDk5ODMsIDB4ZmZmZCwgMHg5NWFhLCAweDkwZDgsCisgICAgMHg4YWEwLCAweGZmZmQsIDB4OGFhNywgMHg5OTg0LCAweGZmZmQsIDB4ZmZmZCwgMHg5OTg2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjNTksIDB4ZmZmZCwgMHhmZmZkLCAweDk5ODUsIDB4ZmZmZCwgMHhmZmZkLCAweDk3ZjEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGY4OSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk0YmIsIDB4OTVjYSwgMHhmZmZkLCAweDk5ODcsCisgICAgMHhmZmZkLCAweDk3OTgsIDB4OTk4OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OTg5LCAweGZmZmQsCisgICAgMHg5MzllLCAweGZmZmQsIDB4ZmZmZCwgMHg5OThhLCAweGZmZmQsIDB4ZmZmZCwgMHg5MGE3LCAweDhkZmMsCisgICAgMHg4Yzk0LCAweDk5OGIsIDB4OGU2OCwgMHg4ZDhmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MmU0LCAweDk5OGQsIDB4ZmZmZCwgMHhmZmZkLCAweDkxYTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGRlZCwgMHg5OThlLCAweDk5OGYsIDB4OTE0ZiwgMHhmZmZkLCAweDk5OGMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk5OTEsIDB4ZmZmZCwgMHg5NjU1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZDg0LCAweGZmZmQsIDB4ZmZmZCwgMHg5OTkwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4Yzk1LCAweDhkZGMsIDB4OTQ4ZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk5OTQsIDB4OTk5MiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1OWIsCisgICAgMHg4ZmU4LCAweDk5OWIsIDB4OGE4NCwgMHg5OTk1LCAweDk5OTMsIDB4OTE2ZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTk5NywgMHhmZmZkLCAweDk5OTYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YTYzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjODAsCisgICAgMHg5OTljLCAweDk3YWIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTk5OCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk5OWQsIDB4OTk5YSwgMHhmZmZkLCAweDk5OTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5N2NkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjZjcsCisgICAgMHg4OWMxLCAweGZmZmQsIDB4ZmZmZCwgMHg5N2YyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhmOTUsIDB4OTM3NywgMHg4ZDg1LCAweDk5YTAsIDB4OTlhMSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3ZTMsIDB4ZmZmZCwgMHhmZmZkLCAweDk4NGEsIDB4OTlhMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjZjgsIDB4ZmZmZCwgMHhmZmZkLCAweDk5YTIsIDB4ZmZmZCwgMHg4YTRlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk5YTQsIDB4ZmZmZCwgMHg5Njc1LCAweGZmZmQsIDB4OTJiYSwgMHhmZmZkLCAweDk3NDUsCisgICAgMHhmZmZkLCAweDk1ZDcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTlhNSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZThkMywgMHhmZmZkLCAweGZmZmQsIDB4OTNhZSwgMHhmZmZkLCAweDk5YTYsCisgICAgMHg4YWE4LCAweDk2YjEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGY5ZiwgMHg5OWE3LCAweDk1ZTUsCisgICAgMHg5OWFiLCAweGZmZmQsIDB4OTBhOCwgMHg5OWE4LCAweDhiY2UsIDB4ZmZmZCwgMHg5OWE5LCAweDhhYTksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGM0ZCwgMHg5OWFjLCAweGZmZmQsIDB4OTlhZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5OWFlLCAweDk5YWYsIDB4OGVkOSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4Y2Y5LCAweDk2ZGMsCisgICAgMHhmZmZkLCAweDk2ZTYsIDB4OTNmNSwgMHhmZmZkLCAweGZmZmQsIDB4OTVlZiwgMHg5OWIwLCAweGZmZmQsCisgICAgMHg5OWIxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTliMywgMHhmZmZkLCAweDk5YjUsCisgICAgMHg5OWI0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTliNiwgMHg4OWJiLCAweDk2NmIsCisgICAgMHhmZmZkLCAweDhkZmEsIDB4OTliNywgMHhmZmZkLCAweGZmZmQsIDB4OTE3OCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZmEwLCAweDhiYTcsIDB4ZmZmZCwgMHg5OWI4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTRkOSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk5YjksCisgICAgMHhmZmZkLCAweDk5YmEsIDB4ZmZmZCwgMHg5OWJiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5OWJjLCAweDk1NDMsIDB4OGJlNiwgMHg4OGUzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzYmQsCisgICAgMHg5OWJkLCAweDhmNWMsIDB4ZmZmZCwgMHg5MGU3LCAweGZmZmQsIDB4OTliZiwgMHg5OWJlLCAweDhmYTEsCisgICAgMHg4Y2RmLCAweDk5YzEsIDB4OTRiYywgMHhmZmZkLCAweGZmZmQsIDB4OTljMiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk0ZGEsIDB4OTFiMiwgMHg5MWVjLCAweDhiYTYsIDB4ZmZmZCwgMHhmZmZkLCAweDkzZWMsCisgICAgMHg5MjUwLCAweGZmZmQsIDB4OTQ4ZSwgMHhmZmZkLCAweDk2NmQsIDB4ZmZmZCwgMHg5OWM0LCAweGZmZmQsCisgICAgMHg5MGU4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YzU0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk5YzUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OWM2LCAweDg5NGIsCisgICAgMHg4OGYzLCAweDhhZWIsIDB4ZmZmZCwgMHg5MWE2LCAweDhiNzAsIDB4OTc5MSwgMHhmZmZkLCAweDk5YzksCisgICAgMHg4OWI1LCAweGZmZmQsIDB4ZmZmZCwgMHg5OWM4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhiYTgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTljYSwgMHhmZmZkLCAweDk2ZWYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OWNiLCAweGZmZmQsCisgICAgMHg5N2QwLCAweGZmZmQsIDB4OGNmYSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjYjQsCisgICAgMHg5OWNjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTljZSwgMHg5OWNkLCAweGZmZmQsCisgICAgMHg5MDdlLCAweDg5NTgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ODk3ZCwgMHg5OWNmLCAweGZmZmQsCisgICAgMHg5OWQwLCAweGZmZmQsIDB4ZmZmZCwgMHg4Y2I1LCAweGZmZmQsIDB4ZmZmZCwgMHg5OWQxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YjhlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGU1MSwgMHg5OWQyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Njk0LCAweDhkYjMsIDB4OGI3OSwgMHg5NzQ2LCAweDkxNmYsIDB4OTRiZCwgMHg4ZWZiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmNjYsIDB4ZmZmZCwgMHg4ZWU2LCAweDhlZjMsCisgICAgMHhmZmZkLCAweDhmOTYsIDB4ZmZmZCwgMHg5NGJlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk5ZDUsCisgICAgMHhmZmZkLCAweDg5NjIsIDB4OTE3MCwgMHg4Y2ZiLCAweDhjYzMsIDB4OGJlNSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5OWQ5LCAweDkyNDAsIDB4OTFmYywgMHg4YmE5LCAweDhmYTIsIDB4OTlkYSwgMHg5OWQ4LCAweDg5YzIsCisgICAgMHg5MWU0LCAweDhlYjYsIDB4OGU2YSwgMHg4OTQ1LCAweGZmZmQsIDB4ZmZmZCwgMHg4YTkwLCAweDhkODYsCisgICAgMHg4ZTY5LCAweGZmZmQsIDB4OTlkYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk5ZGMsIDB4ZmZmZCwgMHg4YjY4LCAweDhhNjUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZDg3LCAweDhiNjcsIDB4OTJkZCwgMHg4OTQ0LCAweDkzYWYsIDB4OTZiYywgMHg4ZDQwLCAweDk3OTksCisgICAgMHg5MzY2LCAweDhjZmMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YzRlLCAweGZmZmQsIDB4OTllNSwgMHhmZmZkLCAweDhiZTEsCisgICAgMHg5NjY5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NGRiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk5ZTQsIDB4ZmZmZCwgMHg4YWRjLCAweDk5ZGYsIDB4OTllMCwgMHg5OWUyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OWUzLCAweGZmZmQsCisgICAgMHg4YjdhLCAweDkwODEsIDB4ZmZmZCwgMHg5NWFiLCAweDk5ZTEsIDB4OTlkZCwgMHg4Y2UxLCAweGZmZmQsCisgICAgMHg5OWRlLCAweGZmZmQsIDB4OTg0MywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWYwLCAweGZmZmQsCisgICAgMHg5MmU2LCAweDhjZTAsIDB4OGQ5MCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OWU2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkzZGIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk5ZWEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZWZjLCAweGZmZmQsIDB4OGVmNCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5OWVkLCAweDk5ZWIsIDB4ZmZmZCwgMHg5NmExLCAweGZmZmQsIDB4OTllOCwgMHg5OWYxLCAweDk5ZWMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5OWVmLCAweDhjYzQsIDB4OTZiZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5OWYwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk5ZjIsIDB4ZmZmZCwgMHg5OWY0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZGVlLCAweDk4NjEsIDB4ZmZmZCwgMHg5OWU5LCAweDk5ZTcsCisgICAgMHg5OWYzLCAweGZmZmQsIDB4OTllZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTlmNiwgMHhmZmZkLCAweDlhNDIsIDB4OTlmOCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5OWZjLCAweGZmZmQsIDB4ZmZmZCwgMHg5YTQwLCAweDk5ZjksIDB4ZmZmZCwgMHhmZmZkLCAweDlhNWQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGRlNywgMHg4YTUwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5OWY3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhNDQsIDB4ODhmNCwgMHg5YTQzLCAweGZmZmQsCisgICAgMHg4OGEzLCAweDk1NjksIDB4OWE0MSwgMHhmZmZkLCAweDk5ZmEsIDB4ZmZmZCwgMHhmZmZkLCAweDk5ZjUsCisgICAgMHg5OWZiLCAweDhkYzYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YTQ1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg4ZjUsIDB4OWE0ZSwgMHhmZmZkLCAweGZmZmQsIDB4OWE0NiwgMHg5YTQ3LCAweGZmZmQsCisgICAgMHg4ZmEzLCAweDk2ODksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWE0YywgMHg5YTRiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTM0ZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWE0ZCwgMHhmZmZkLCAweGZmZmQsIDB4OWE0YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5NTMsIDB4ZmZmZCwgMHg4ZGI0LCAweDkwNGYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhNDgsCisgICAgMHg5MzgyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhNDksIDB4ZmZmZCwgMHg4OGEwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YTUzLCAweDk3NDIsCisgICAgMHhmZmZkLCAweDhmYTUsIDB4ZmZmZCwgMHg5YTU5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YTU4LCAweDlhNGYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MWMxLCAweGZmZmQsCisgICAgMHg5YTUwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkxZWQsIDB4OWE1NSwgMHg4ZmE0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhNTIsIDB4ZmZmZCwgMHhmZmZkLCAweDk2ZTIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YzViLCAweGZmZmQsIDB4ZmZmZCwgMHg5YTU2LCAweDlhNTcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhNTQsIDB4OWE1YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YTUxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YTYwLCAweDlhNjUsIDB4ZmZmZCwgMHg5YTYxLCAweGZmZmQsCisgICAgMHg5YTVjLCAweGZmZmQsIDB4ZmZmZCwgMHg5YTY2LCAweDkxNTAsIDB4ZmZmZCwgMHhmZmZkLCAweDlhNjgsCisgICAgMHhmZmZkLCAweDhkNDEsIDB4OWE1ZSwgMHg5MjlkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YTYyLCAweDlhNWIsIDB4OGFhYiwgMHhmZmZkLCAweDhhZWMsIDB4OGE4NSwgMHg5YTYzLCAweDlhNWYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjOTYsCisgICAgMHg5YTY5LCAweDlhNjcsIDB4OTE3MiwgMHg4YjY5LCAweDhiYWEsIDB4ZmZmZCwgMHg5YTY0LCAweGZmZmQsCisgICAgMHg4YmYyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OTYzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhNmQsIDB4OWE2YiwgMHhmZmZkLCAweDlhYTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhNzAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWE2YSwgMHhmZmZkLCAweDlhNmUsIDB4ZmZmZCwgMHhmZmZkLCAweDlhNmMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZTZiLCAweDlhNmYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhNzIsCisgICAgMHhmZmZkLCAweDlhNzcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWE3NSwgMHg5YTc0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MjUxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5YzMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhNzEsIDB4ZmZmZCwgMHg5YTczLCAweDhmYTYsCisgICAgMHg4OTUyLCAweGZmZmQsIDB4ZmZmZCwgMHg5YTc2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5ZGMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhODIsCisgICAgMHhmZmZkLCAweDhmZmEsIDB4OWE3ZCwgMHhmZmZkLCAweDlhN2IsIDB4ZmZmZCwgMHg5YTdjLCAweGZmZmQsCisgICAgMHg5YTdlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODk1YywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkxNTgsIDB4ZmZmZCwgMHg5YTc4LCAweGZmZmQsCisgICAgMHg5YTc5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YTlhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhODEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YWVkLCAweGZmZmQsIDB4OWE4NCwgMHg5YTgwLCAweDlhODMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1YWMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5M2QzLCAweGZmZmQsIDB4OTRiNiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YTg2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YTg1LCAweDhhNjQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWE4NywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhOGEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhODksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YTg4LCAweGZmZmQsIDB4OTQ1OCwgMHhmZmZkLCAweGZmZmQsIDB4OWE4YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YThjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhOGUsIDB4ZmZmZCwgMHg5YThkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhOTAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YTkzLCAweDlhOTEsIDB4OWE4ZiwgMHg5YTkyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YTk0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YTk1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlhOTYsIDB4ZmZmZCwgMHg5YTk3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhOTgsCisgICAgMHg5OTY0LCAweGZmZmQsIDB4OGVmYSwgMHg4ZTZjLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWYxLCAweGZmZmQsCisgICAgMHg4OGY2LCAweGZmZmQsIDB4ZmZmZCwgMHg5MjYzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YTk5LCAweGZmZmQsCisgICAgMHg4ZGEyLCAweGZmZmQsIDB4ODhjZCwgMHg5MDdkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlhOWEsIDB4OGNjNSwgMHhmZmZkLCAweGZmZmQsIDB4OGQ5MSwgMHhmZmZkLCAweDlhOWMsCisgICAgMHg5YTliLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWRlLCAweDlhOWQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YTlmLCAweDlhOWUsIDB4ZmZmZCwgMHg5YWEwLCAweGZmZmQsIDB4OWFhMSwgMHhmZmZkLCAweDhjOTcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODk4MCwgMHg5YWEyLCAweGZmZmQsIDB4ZmZmZCwgMHg5YWE0LCAweGZmZmQsCisgICAgMHg5YWEzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhYTYsIDB4ZmZmZCwgMHhmZmZkLCAweDkzNzksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YWE3LCAweDg4YjMsCisgICAgMHg4ZGRkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGM1YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MjZlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhYTgsCisgICAgMHg5YWE5LCAweGZmZmQsIDB4ZmZmZCwgMHg5YWFiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YWFjLCAweGZmZmQsIDB4OGRlMiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhiY2YsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTY1NiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YWFhLCAweDlhYWQsCisgICAgMHg4ZGJmLCAweDhkNDIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlhYjEsIDB4ZmZmZCwgMHhmZmZkLCAweDhkYTMsIDB4ZmZmZCwgMHg5MjUyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlhYWUsIDB4OTJkOCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhYjIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTA4MiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YWIwLCAweDlhYjMsIDB4ZmZmZCwgMHg4YzVlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YWI0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YWI1LCAweGZmZmQsIDB4OGQ0MywgMHg4YTVmLCAweDlhYjcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWFiOCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YWI5LCAweGZmZmQsIDB4ZmZmZCwgMHg5YWI2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YWFmLCAweGZmZmQsIDB4ZmZmZCwgMHg5YWJhLCAweGZmZmQsIDB4ZmZmZCwgMHg5YWJiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Njg0LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZmU5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWFiZCwgMHg5YWJlLCAweDlhYmMsIDB4ZmZmZCwgMHg5YWMwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk0NTcsIDB4ZmZmZCwgMHhmZmZkLCAweDg4ZTYsCisgICAgMHg5NTc1LCAweGZmZmQsIDB4ZmZmZCwgMHg5YWMxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmZmIsIDB4ZmZmZCwgMHhmZmZkLCAweDhlYjcsCisgICAgMHhmZmZkLCAweDk0N2MsIDB4OGFlZSwgMHhmZmZkLCAweDhkZTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Njc4LCAweGZmZmQsIDB4OTNiMCwgMHhmZmZkLCAweGZmZmQsIDB4OGM5OCwgMHg5MWNkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWFiZiwgMHg5YWMyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTFjMiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlhYzMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWFjNCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlhYzYsIDB4ZmZmZCwgMHhmZmZkLCAweDkyZTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGFhYywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhOWYsCisgICAgMHg4OTgxLCAweDk1ZjEsIDB4ZmZmZCwgMHhmZmZkLCAweDhmZWEsIDB4OTM2NywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGRlNCwgMHhmZmZkLCAweGZmZmQsIDB4OWFjYywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NWJiLCAweDk3ZGIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODlmMiwgMHg5YWM4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkxNTksIDB4OWFjYiwgMHhmZmZkLCAweDkzODMsIDB4ZmZmZCwgMHhmZmZkLCAweDkzNjgsCisgICAgMHg5Mzg0LCAweDk0YjcsIDB4OTJjYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZGM3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWFjNywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5OTYsIDB4ZmZmZCwgMHg5MzU1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YWM5LCAweGZmZmQsIDB4OWFjNSwgMHhmZmZkLCAweGZmZmQsIDB4OTA2ZiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlhY2QsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZjZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YmFiLCAweGZmZmQsIDB4OWFjZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWU2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkxOWQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkyYzQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhZDAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NjZlLCAweGZmZmQsIDB4ZmZmZCwgMHg5YWQxLCAweGZmZmQsIDB4ZmZmZCwgMHg5YWQ2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWFkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YWQ1LCAweDlhY2YsIDB4OWFkMiwgMHg5YWQ0LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZGE0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk1YzcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWFkNywgMHhmZmZkLCAweDkyNjQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODlmMywgMHhmZmZkLCAweDhmZWIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlhZDksIDB4ZmZmZCwgMHg5YWQ4LCAweGZmZmQsIDB4OGQ4OCwgMHhmZmZkLCAweDlhZGEsCisgICAgMHg5YWRjLCAweDlhZGIsIDB4ZmZmZCwgMHhmZmZkLCAweDlhZGUsIDB4ZmZmZCwgMHg5YWQzLCAweDlhZTAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhZGYsIDB4OWFkZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZTZkLCAweDkwNzAsIDB4ZmZmZCwgMHg5MTczLCAweDlhZTEsCisgICAgMHg5MGJhLCAweDg4ZWIsIDB4OTQ4NCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkyZDksCisgICAgMHhmZmZkLCAweDlhZTMsIDB4OWFlMiwgMHg5YWU0LCAweDlhZTUsIDB4OWFlNiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWFlNywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk1Y2YsIDB4OWFlOCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5YzQsCisgICAgMHg5YWU5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTc1YiwgMHg4YTRmLCAweGZmZmQsCisgICAgMHg5OWM3LCAweDhmNjcsIDB4OTFiZCwgMHg5YWVhLCAweDk2ZTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTZiMiwgMHhmZmZkLCAweGZmZmQsIDB4OWFlYywgMHhmZmZkLCAweDkxZTUsCisgICAgMHhmZmZkLCAweDkzNTYsIDB4OTFiZSwgMHg5NTc2LCAweDlhZWQsIDB4OWFlZSwgMHg4OTliLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhlYjgsIDB4OWFlZiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg4Y2UsCisgICAgMHg5YWYwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YWYxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5ODIsIDB4ZmZmZCwgMHhmZmZkLCAweDhhZWYsCisgICAgMHg5M2RlLCAweDk1ZjIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YWY1LCAweDkxNzQsCisgICAgMHg5YWY0LCAweDhjNWYsIDB4ZmZmZCwgMHhmZmZkLCAweDk2N2EsIDB4OWFmMywgMHhmZmZkLCAweDkzODUsCisgICAgMHg5YWY3LCAweGZmZmQsIDB4OWFmNiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YWY5LCAweGZmZmQsIDB4OWFmOCwgMHhmZmZkLCAweGZmZmQsIDB4ODk5YywgMHhmZmZkLCAweDlhZmEsCisgICAgMHg4ZmE3LCAweDlhZmMsIDB4OTI0NCwgMHhmZmZkLCAweDlhZmIsIDB4ZmZmZCwgMHg5NWIxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4Zjk3LCAweDkzN2EsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YjQwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGQ0NCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliNDEsIDB4OTQ0MCwgMHg5NGRjLCAweDk2Y2YsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTQ0NCwgMHhmZmZkLCAweGZmZmQsIDB4OWI0YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YjU3LCAweGZmZmQsIDB4ZmZmZCwgMHg5NzY0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk2YWQsIDB4ZmZmZCwgMHg5YmFhLCAweGZmZmQsIDB4OWI0MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YjQ1LCAweGZmZmQsIDB4OTFjMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NjU3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzNjksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWI0NiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk2ODUsIDB4ZmZmZCwgMHg4ZGM4LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZmE4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YjQ3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhlNmYsIDB4ZmZmZCwgMHg4ZTZlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4OGI3LCAweDhjYzYsIDB4ZmZmZCwgMHg5MGE5LCAweDg4Y2YsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliNGIsIDB4OWI0YywgMHhmZmZkLCAweDliNDksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ODk1NywgMHg4YWFkLCAweGZmZmQsCisgICAgMHg5YjQ4LCAweGZmZmQsIDB4OTZjMywgMHg5NTUwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OGE2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OGY3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhlNzAsCisgICAgMHhmZmZkLCAweDg4ZDAsIDB4ZmZmZCwgMHg4OGExLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliNTEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliNGYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NmJhLCAweGZmZmQsIDB4OWI1MiwgMHhmZmZkLCAweDliNTAsIDB4ZmZmZCwgMHhmZmZkLCAweDliNGUsCisgICAgMHg5MDUwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWI0ZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk1ZDgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjZTIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWI1NiwgMHg5YjU3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmYTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YjUzLCAweDk4NGIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NDZiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliNTUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGRhNSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWI1OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NTc3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWI1OSwgMHhmZmZkLCAweDliNTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk2YjksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTQ3ZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWI1YSwgMHg5NTUxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDliNWIsIDB4OWI1ZiwgMHg5YjVjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5YzUsIDB4OWI1ZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhlYjksIDB4ZmZmZCwgMHg5YjVkLCAweDhjOTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YjZiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YjY0LCAweDliNjEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkyODQsIDB4ZmZmZCwgMHg5YjYwLCAweGZmZmQsIDB4ZmZmZCwgMHg5YjYyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliNjMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWI2NSwgMHg5YjY2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhhZjAsIDB4ZmZmZCwgMHg5YjY4LCAweDliNjcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YjY5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGZlYywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWI2YywgMHhmZmZkLCAweDkyZGEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4OTY0LCAweGZmZmQsIDB4OWI2YSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YjZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YjZlLCAweGZmZmQsCisgICAgMHg5YjcxLCAweGZmZmQsIDB4ZmZmZCwgMHg5YjZmLCAweGZmZmQsIDB4OWI3MCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZTcxLCAweDliNzIsIDB4ZmZmZCwgMHhmZmZkLCAweDhkNDUsIDB4OWI3MywgMHhmZmZkLCAweDhlOWEsCisgICAgMHg5MWI2LCAweGZmZmQsIDB4OWI3NCwgMHg5Yjc1LCAweDhlNzksIDB4OGQ0NiwgMHhmZmZkLCAweDk2ZDAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YjQ3LCAweDhjYzcsIDB4OWI3NiwgMHg4YTc3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliNzcsIDB4ZmZmZCwgMHg5MWI3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Yjc4LCAweDliYTEsIDB4ZmZmZCwgMHg5Yjc5LCAweGZmZmQsIDB4OWI3YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YjdiLCAweGZmZmQsIDB4OWI3ZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YjdlLCAweGZmZmQsIDB4ZmZmZCwgMHg5YjgwLCAweGZmZmQsIDB4OTFlZSwgMHhmZmZkLCAweDg5NDYsCisgICAgMHg4ZWU3LCAweDg4YzAsIDB4ZmZmZCwgMHg5MTc2LCAweDhhYWUsIDB4OGViMywgMHhmZmZkLCAweDhkNDcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTM4NiwgMHhmZmZkLCAweDhmNDAsCisgICAgMHg4YWFmLCAweDkyODgsIDB4OTJlOCwgMHg4OGI2LCAweDhiNTgsIDB4OTVmMywgMHhmZmZkLCAweDhlYzAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGI3MSwgMHg5MGU5LCAweDhlYmEsIDB4OTc0NywgMHg5YjgxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YjdiLCAweGZmZmQsCisgICAgMHg4ZGM5LCAweGZmZmQsIDB4ZmZmZCwgMHg4YTUxLCAweDg5ODMsIDB4OGZhYSwgMHg4OWM2LCAweGZmZmQsCisgICAgMHg5YjgyLCAweDk3NjUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmNjgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGVlMiwgMHg5YjgzLCAweDhhZjEsIDB4OTNkMCwgMHg5NmE3LCAweDliODQsCisgICAgMHhmZmZkLCAweDliODUsIDB4ZmZmZCwgMHhmZmZkLCAweDk1NzgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Yjg3LCAweGZmZmQsIDB4OGFhNiwgMHg4YmY1LCAweDliODYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YWIwLCAweGZmZmQsIDB4OTA1MSwgMHg5YjhiLCAweDhlNDAsCisgICAgMHhmZmZkLCAweDg5YzcsIDB4OWI4YSwgMHhmZmZkLCAweDliODgsIDB4OWI4YywgMHg5Yjg5LCAweDk0NGEsCisgICAgMHg5ZWNiLCAweDkwNTIsIDB4ZmZmZCwgMHg5YjhkLCAweGZmZmQsIDB4ZmZmZCwgMHg5N2JlLCAweGZmZmQsCisgICAgMHg5YjhlLCAweGZmZmQsIDB4ZmZmZCwgMHg5YjkwLCAweGZmZmQsIDB4OTI5ZSwgMHg5YjhmLCAweGZmZmQsCisgICAgMHg5MGExLCAweGZmZmQsIDB4OGU5YiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MWNlLCAweDhlZjUsCisgICAgMHhmZmZkLCAweDk1OTUsIDB4OTBlYSwgMHhmZmZkLCAweDhlY2IsIDB4OWI5MSwgMHg4ZmFiLCAweDliOTIsCisgICAgMHg5YjkzLCAweDg4ZDEsIDB4OTFiOCwgMHg5MDcxLCAweGZmZmQsIDB4OWI5NCwgMHg5M2IxLCAweDhmYWMsCisgICAgMHhmZmZkLCAweDhmYWQsIDB4ZmZmZCwgMHg5Yjk1LCAweGZmZmQsIDB4ZmZmZCwgMHg5MGViLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGZhZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Yjk2LCAweGZmZmQsIDB4OWI5NywgMHhmZmZkLCAweDk2ZGUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Yjk4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGJjNCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhmNDEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Yjk5LCAweDliOWEsIDB4OGVkYSwgMHg5MDRiLCAweDkzZjIsIDB4OTA3MywgMHg5NGY2LCAweDk0NDEsCisgICAgMHg4YmM3LCAweDliOWIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGI4ZiwgMHg5YjljLCAweGZmZmQsCisgICAgMHg4YmZjLCAweGZmZmQsIDB4OTNjZCwgMHg4OWFlLCAweGZmZmQsIDB4OGU3MiwgMHg5YjlkLCAweDliYTAsCisgICAgMHg5YjlmLCAweDhiZmIsIDB4ZmZmZCwgMHg5YjllLCAweGZmZmQsIDB4OTM1NywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MWFlLCAweGZmZmQsCisgICAgMHg5MzZhLCAweDhlYzYsIDB4ZmZmZCwgMHhmZmZkLCAweDkxNzcsIDB4OTc5YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDliYTIsIDB4ZmZmZCwgMHg5YmEzLCAweDkzZDQsCisgICAgMHhmZmZkLCAweDhlNTIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YmE1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliYTYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDliYTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YWYyLCAweDliYTgsIDB4ZmZmZCwgMHhmZmZkLCAweDliYTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5YWEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MTVhLCAweDhhZTIsIDB4ZmZmZCwgMHg5YmFiLCAweDk2YTYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkxZDAsIDB4ZmZmZCwgMHg4YTc4LCAweGZmZmQsIDB4ZmZmZCwgMHg5YmFkLCAweDliYWYsCisgICAgMHg4YWRkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YmFjLCAweDliYWUsIDB4ZmZmZCwgMHg5YmIxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWJiMCwgMHhmZmZkLCAweDliYjIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliYjMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5M2JiLCAweDhiYWMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4OWUzLCAweDliYjQsIDB4OWJiOSwgMHhmZmZkLCAweGZmZmQsIDB4OWJiNywgMHhmZmZkLCAweDk1ZjUsCisgICAgMHg5NWY0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Mzg3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWJiNiwgMHg4ZjczLCAweGZmZmQsIDB4OWJiNSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwOTIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YmJhLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZGU4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliYzAsIDB4ZmZmZCwgMHhmZmZkLCAweDliYzEsIDB4OWJiYiwgMHg4YTUyLCAweDliYmMsCisgICAgMHg5YmM1LCAweDliYzQsIDB4OWJjMywgMHg5YmJmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDliYmUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWJjMiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk1ZjYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YmM5LCAweDliYzYsIDB4ZmZmZCwgMHg5YmM4LCAweGZmZmQsCisgICAgMHg5NzkyLCAweGZmZmQsIDB4OWJjNywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDliYmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkwOTMsIDB4ZmZmZCwgMHhmZmZkLCAweDliY2EsIDB4ZmZmZCwgMHhmZmZkLCAweDhkYjUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YmNiLCAweGZmZmQsIDB4ZmZmZCwgMHg5YmNjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWJjZiwgMHhmZmZkLCAweDliY2UsIDB4ZmZmZCwgMHhmZmZkLCAweDliY2QsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Mzg4LCAweDliYjgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YmQ1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWJkMSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWJkMCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDliZDIsIDB4ZmZmZCwgMHg5YmQzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDliZDYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTdlNCwgMHhmZmZkLCAweDliZDcsIDB4OWJkNCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliZDgsIDB4ZmZmZCwgMHhmZmZkLCAweDhhZGUsIDB4OWJkOSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWJkYiwgMHg5YmRhLCAweGZmZmQsIDB4ZmZmZCwgMHg5YmRjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YmRkLCAweGZmZmQsIDB4OTBlYywgMHg4ZjQyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhmODQsIDB4ZmZmZCwgMHg5MTgzLCAweGZmZmQsIDB4OGQ0OCwgMHg4ZGI2LCAweDhkNDksCisgICAgMHg4YjkwLCAweGZmZmQsIDB4ZmZmZCwgMHg5YmRlLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZGI3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjYzgsIDB4OWJkZiwgMHg5NmE0LCAweDk0NjIsIDB4OWJlMCwgMHhmZmZkLCAweDhkNGEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YWFhLCAweGZmZmQsIDB4OTI0NiwgMHg4YmQwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGU3MywgMHg5NTdhLCAweGZmZmQsIDB4ZmZmZCwgMHg5NGJmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YmUxLCAweDhhZjMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliZTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MjlmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliZTMsIDB4OWJlMiwgMHg5YmU1LCAweGZmZmQsIDB4OTJlOSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTA4MywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZTc0LCAweGZmZmQsIDB4OTBjOCwgMHhmZmZkLCAweDkxZDEsCisgICAgMHg4YjQxLCAweGZmZmQsIDB4ZmZmZCwgMHg5MmEwLCAweGZmZmQsIDB4ZmZmZCwgMHg5YmU2LCAweDliZTcsCisgICAgMHg4ZmVkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTY1OCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YmVhLCAweGZmZmQsIDB4ZmZmZCwgMHg5YmU5LCAweDliZTgsIDB4OTU5ZCwgMHhmZmZkLCAweDliZjEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk2NzksIDB4ZmZmZCwgMHg5YmViLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDliZWQsIDB4OTY4YiwgMHhmZmZkLCAweDliZWMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDliZWUsCisgICAgMHhmZmZkLCAweDk0YTYsIDB4OWJlZiwgMHg5NWJjLCAweDliZjAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGFiMSwgMHg5NWJkLCAweDk0NGUsIDB4OWJmMiwgMHg5YmYzLCAweGZmZmQsCisgICAgMHg4ZDRiLCAweDhhYjIsIDB4OWJmNCwgMHg4Y2I2LCAweDk3NjMsIDB4OTc0OCwgMHg4YWY0LCAweDliZjYsCisgICAgMHhmZmZkLCAweDkyYTEsIDB4ZmZmZCwgMHg4ZDRjLCAweDhmYWYsIDB4ZmZmZCwgMHhmZmZkLCAweDk0ZGQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGZiMCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmOTgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTJlYSwgMHg5NWY3LCAweDkzNTgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGQ0ZCwgMHhmZmZkLCAweDk1N2IsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YmY3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Mzc4LCAweDhkYzAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4Y2M5LCAweGZmZmQsIDB4OTJlYiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ODhjMSwgMHg4ZjhlLCAweDhkNGUsCisgICAgMHg5NzY2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDliZjgsIDB4OWJmOSwgMHg5NDcwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YmZhLCAweDk3ZjUsIDB4OTg0YywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDliZmMsCisgICAgMHg5YmZiLCAweGZmZmQsIDB4ZmZmZCwgMHg4YTY2LCAweGZmZmQsIDB4ZmZmZCwgMHg5YzQwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWM0MywgMHg5YzQ0LCAweGZmZmQsIDB4OWM0MiwgMHhmZmZkLCAweDk1NWYsCisgICAgMHg4ZmIxLCAweDljNDYsIDB4OWM0NSwgMHg5YzQxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YzQ3LCAweDljNDgsIDB4ZmZmZCwgMHhmZmZkLCAweDljNDksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YzRjLCAweDljNGEsIDB4ZmZmZCwgMHg5YzRiLCAweDljNGQsIDB4ZmZmZCwgMHg4OTg0LCAweDkyZWMsCisgICAgMHg5YzRlLCAweGZmZmQsIDB4OGM5YSwgMHg4OWY0LCAweDk0NTUsIDB4ZmZmZCwgMHg5YzRmLCAweDkzZjksCisgICAgMHhmZmZkLCAweDk1ZDksIDB4ZmZmZCwgMHg5YzUwLCAweDk4NGQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDljNTEsIDB4OTViZSwgMHg5YzU0LCAweDk4OWYsIDB4OThhZiwgMHhmZmZkLCAweDhlYWUsCisgICAgMHg5M2YzLCAweDljNTUsIDB4ZmZmZCwgMHg4YjdjLCAweDkyYTIsIDB4ODhmOCwgMHg5YzU2LCAweDk1YTQsCisgICAgMHg4ZDRmLCAweGZmZmQsIDB4ZmZmZCwgMHg5MjZmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkyZWQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTZlZCwgMHg4Y2I3LCAweDhjY2EsCisgICAgMHhmZmZkLCAweDljNTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWM1OCwgMHhmZmZkLCAweDljNWUsCisgICAgMHhmZmZkLCAweDhlZTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTJhMywgMHhmZmZkLCAweDhiYWQsCisgICAgMHg5YzU5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1NGEsIDB4ZmZmZCwgMHg5MjY1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDljNWEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YzViLCAweGZmZmQsIDB4OGJhZSwgMHhmZmZkLCAweDljNWMsIDB4ZmZmZCwgMHg5YzVkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDljNWYsIDB4ZmZmZCwgMHg5Mzk2LCAweGZmZmQsIDB4ZmZmZCwgMHg5YzYwLCAweDljNjEsCisgICAgMHhmZmZkLCAweDljNjIsIDB4ZmZmZCwgMHhmZmZkLCAweDljNTMsIDB4OWM1MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDljNjMsIDB4OGM2MCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NTQ2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhkY2EsIDB4OTU1NiwgMHg5MmE0LCAweDk1NmEsIDB4OWM2NCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZmIyLCAweDg5NjUsIDB4ZmZmZCwgMHg5YzY1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDljNjYsCisgICAgMHhmZmZkLCAweDk2ZjAsIDB4ZmZmZCwgMHhmZmZkLCAweDk0ZGUsIDB4ZmZmZCwgMHhmZmZkLCAweDljNjksCisgICAgMHg4OTlkLCAweDkwYWEsIDB4OWM2OCwgMHg5YzY3LCAweDhjNjEsIDB4OTFkMiwgMHhmZmZkLCAweDljNmQsCisgICAgMHg5YzZiLCAweGZmZmQsIDB4OWM2YSwgMHg5N2E1LCAweDhjZTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4Zjk5LCAweDljNmMsIDB4OTM2YiwgMHg4ZjVkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzYmUsCisgICAgMHg5YzcwLCAweDljNmYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YzZlLCAweGZmZmQsCisgICAgMHg5YzcxLCAweDhjZTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5YzcyLCAweDk1OWMsIDB4OGY3YSwgMHhmZmZkLCAweGZmZmQsIDB4OWM3MywgMHg5NGY3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5M2JmLCAweDkyYTUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkzNGYsIDB4ZmZmZCwgMHhmZmZkLCAweDljNzQsIDB4OGI0YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MDUzLCAweGZmZmQsIDB4OTU0YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhZjUsIDB4OTQ0NSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Yzc1LCAweDhlNzUsCisgICAgMHg5NjU5LCAweDk2NWEsIDB4ZmZmZCwgMHhmZmZkLCAweDg5OWUsIDB4OWM3YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Mjg5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDljNzcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWY1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Y2FiLCAweDljNzksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTQ0ZiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Yzc4LCAweGZmZmQsIDB4ZmZmZCwgMHg5Yzc2LCAweGZmZmQsIDB4OGQ5YSwgMHhmZmZkLCAweDljN2MsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YzgzLCAweDljODksCisgICAgMHg5YzgxLCAweGZmZmQsIDB4OTM3YiwgMHhmZmZkLCAweGZmZmQsIDB4OWM4NiwgMHg5NTdjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDljODAsIDB4ZmZmZCwgMHg5Yzg1LCAweDk3ZTUsIDB4OGU3NiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MWQzLCAweDljN2QsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGI3ZCwgMHg5Yzg4LCAweDkwYWIsCisgICAgMHg4OTg1LCAweDljODIsIDB4ODlmNiwgMHg5Yzg3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhiYWYsCisgICAgMHhmZmZkLCAweDljODQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWM4YSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDljOGMsIDB4OWM5NiwgMHg5Yzk0LCAweGZmZmQsIDB4ZmZmZCwgMHg5YzkxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWM5MCwgMHg5N2Y2LCAweGZmZmQsIDB4OWM5MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YmIwLCAweGZmZmQsIDB4OGQ1MCwgMHhmZmZkLCAweGZmZmQsIDB4OGY5YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDljOTksIDB4OWM4YiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDljOGYsCisgICAgMHg5YzdlLCAweGZmZmQsIDB4ODlmOCwgMHg5YzkzLCAweDljOTUsIDB4OTI3MCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZGE2LCAweDg5YjYsIDB4OWM4ZCwgMHg5Yzk4LCAweDljOTcsIDB4OGJiMSwgMHhmZmZkLCAweDkxYTcsCisgICAgMHg4YTg2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGM2MiwgMHhmZmZkLCAweDljOGUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDljOWEsIDB4ZmZmZCwgMHg5YzlkLCAweDljOWYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhlYmIsIDB4ZmZmZCwgMHg5Y2E1LCAweDkyZWUsIDB4OWM5YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWNhMywgMHhmZmZkLCAweDg5ZjcsIDB4ZmZmZCwgMHg5Y2ExLCAweDljYTIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWM5ZSwgMHg5Y2EwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjZTUsCisgICAgMHg5NzQ5LCAweGZmZmQsIDB4ZmZmZCwgMHg4YWIzLCAweGZmZmQsIDB4ZmZmZCwgMHg4OTc4LCAweDljYTQsCisgICAgMHhmZmZkLCAweDk0NTksIDB4ODhhYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTRkZiwgMHg5YzdiLCAweDljYWEsIDB4OWNhZSwgMHg5NmUzLCAweGZmZmQsCisgICAgMHg5Y2E3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzODksIDB4OWNhYywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGZlZSwgMHg5Y2FkLCAweDkzZDUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk4NjYsIDB4ZmZmZCwgMHg5Y2E5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Y2FmLCAweGZmZmQsIDB4OGQ5YiwgMHhmZmZkLCAweDkwYzksIDB4ZmZmZCwgMHhmZmZkLCAweDg4ZDIsCisgICAgMHg5Y2E4LCAweDljYTYsIDB4ZmZmZCwgMHg5MTc5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDljOWMsCisgICAgMHg4ZTUzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MWM0LCAweDljYmIsIDB4ZmZmZCwgMHg5MTdhLCAweDljYjYsIDB4ZmZmZCwgMHg5Y2IzLCAweDljYjQsCisgICAgMHhmZmZkLCAweDhlZTQsIDB4OWNiNywgMHg5Y2JhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Y2I1LCAweDhmNDQsIDB4ZmZmZCwgMHg5Y2I4LCAweGZmZmQsIDB4ZmZmZCwgMHg5Y2IyLCAweGZmZmQsCisgICAgMHg5NmZhLCAweDk2ZjksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWNiYywgMHg5Y2JkLCAweDg4ZDMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWNiMSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGJmMCwgMHg4OGE0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhYjQsCisgICAgMHhmZmZkLCAweDljYjksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDljYzEsCisgICAgMHg5Y2MwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDljYzUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDljYzYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDljYzQsIDB4OWNjNywgMHg5Y2JmLCAweDljYzMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWNjOCwgMHhmZmZkLCAweDljYzksIDB4ZmZmZCwgMHhmZmZkLCAweDljYmUsCisgICAgMHg4ZTljLCAweGZmZmQsIDB4OWNjMiwgMHg5MWQ0LCAweDhkNTEsIDB4OWNiMCwgMHg5MDU0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Y2Q2LCAweGZmZmQsIDB4OTVlNywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Y2NjLCAweDljY2QsIDB4OWNjZSwgMHhmZmZkLCAweGZmZmQsIDB4OWNkNSwgMHhmZmZkLCAweDljZDQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTY5ZCwgMHg4YWI1LCAweGZmZmQsIDB4OWNkMiwgMHhmZmZkLCAweDhjNjQsCisgICAgMHg4YTUzLCAweGZmZmQsIDB4ZmZmZCwgMHg5Y2NmLCAweGZmZmQsIDB4ZmZmZCwgMHg5N2I2LCAweDljZDEsCisgICAgMHg4OGQ0LCAweDljZDMsIDB4ZmZmZCwgMHg5Y2NhLCAweDljZDAsIDB4OWNkNywgMHg4YzYzLCAweDljY2IsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NzdjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTc0YSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDljZGEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWNkZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MTllLCAweGZmZmQsCisgICAgMHg5N2Y3LCAweDljZGYsIDB4ZmZmZCwgMHhmZmZkLCAweDljZGMsIDB4ZmZmZCwgMHg5Y2Q5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDljZDgsIDB4OWNkZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1YWUsIDB4ZmZmZCwgMHhmZmZkLCAweDkzYjIsCisgICAgMHhmZmZkLCAweDhjNjUsIDB4ZmZmZCwgMHg5Y2UwLCAweDljZGIsIDB4ZmZmZCwgMHg5Y2UxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGM5YiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWFmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWNlOSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YWI2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Y2U3LCAweGZmZmQsIDB4ZmZmZCwgMHg5Y2U4LCAweDhkYTcsCisgICAgMHg5Y2U2LCAweDljZTQsIDB4OWNlMywgMHg5Y2VhLCAweDljZTIsIDB4OWNlYywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4OWY5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Y2VlLCAweGZmZmQsIDB4ZmZmZCwgMHg5Y2VkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTJhNiwgMHhmZmZkLCAweDljZjEsIDB4ZmZmZCwgMHg5Y2VmLCAweDljZTUsCisgICAgMHg4YzljLCAweGZmZmQsIDB4OWNmMCwgMHhmZmZkLCAweDljZjQsIDB4OWNmMywgMHg5Y2Y1LCAweDljZjIsCisgICAgMHg5Y2Y2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Y2Y3LCAweDljZjgsIDB4OTVlOCwgMHhmZmZkLCAweDljZmEsIDB4OWNmOSwgMHg4ZjVlLCAweGZmZmQsCisgICAgMHg5MGFjLCAweDg5ZTQsIDB4ODlmYSwgMHhmZmZkLCAweDljZmIsIDB4ZmZmZCwgMHg4OGJkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTBjYSwgMHg5Y2ZjLCAweGZmZmQsIDB4ZTZjMSwgMHg5ZDQwLCAweDhjODEsCisgICAgMHhmZmZkLCAweDlkNDEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MGVkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWQ0MiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDQzLCAweDhiNTksCisgICAgMHg5ZDQ0LCAweGZmZmQsIDB4OWQ0NSwgMHg5ZDQ2LCAweDkxZDUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4Y2NiLCAweGZmZmQsIDB4ZmZmZCwgMHg5NmRmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk2NWIsCisgICAgMHg4ZjhhLCAweDlkNDcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwZWUsCisgICAgMHhlN2JiLCAweDk0ZTAsIDB4ZmZmZCwgMHg4ZWU4LCAweGZmZmQsIDB4OGRjYiwgMHg5ZDQ4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MWM1LCAweGZmZmQsIDB4OTVhNSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MWVmLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDRiLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDQ5LCAweGZmZmQsCisgICAgMHg5ZDRjLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDRhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZDRkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWFmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg4YjUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NTdkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk0ZTEsIDB4ZmZmZCwgMHhmZmZkLCAweDlkNGUsIDB4ZmZmZCwgMHg5ZDUxLCAweDhmYjMsCisgICAgMHg4YjVhLCAweGZmZmQsIDB4OWQ0ZiwgMHg5ZDU2LCAweDhmYjQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlkNTAsIDB4OTQ2MywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3N2QsIDB4OWQ1MiwgMHg5ZDUzLCAweDlkNTcsIDB4OTM4YSwgMHg5ZDU0LCAweDhkNTIsCisgICAgMHg5MGRjLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDY1LCAweDk0YjIsIDB4ZmZmZCwgMHg5MWYwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NGUyLCAweDlkYWIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk1ZjgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTJlZiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk2OTUsIDB4ZmZmZCwgMHg5ZDVhLCAweDg5OWYsIDB4OTI4YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWQ2MywgMHhmZmZkLCAweGZmZmQsIDB4OTI1MywgMHg5ZDVkLCAweDlkNjQsCisgICAgMHg5ZDVmLCAweDlkNjYsIDB4OWQ2MiwgMHhmZmZkLCAweDlkNjEsIDB4OTQ4ZiwgMHhmZmZkLCAweDlkNWIsCisgICAgMHg4OWZiLCAweDlkNTksIDB4OGI5MSwgMHg5MWYxLCAweDlkNTUsIDB4ZmZmZCwgMHhmZmZkLCAweDlkNTgsCisgICAgMHg4ZDUzLCAweDkwZDksIDB4ZmZmZCwgMHg4ZmI1LCAweDlkNjAsIDB4OTQ3MSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YjkyLCAweDhhNjcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhODcsIDB4OTA0MCwgMHg5ZDY4LCAweDlkNmQsCisgICAgMHhmZmZkLCAweDlkNjksIDB4ZmZmZCwgMHg4YzlkLCAweGZmZmQsIDB4OWQ2ZSwgMHg4ZTQxLCAweDhkODksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZjQ1LCAweDlkNWMsCisgICAgMHhmZmZkLCAweDhlOWQsIDB4OWQ2YiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhlNzcsCisgICAgMHg5ZDZjLCAweDg4YzIsIDB4ZmZmZCwgMHhmZmZkLCAweDlkNjcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkyYTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhiOTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhiYjIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlkNmEsCisgICAgMHg4OGE1LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZGMxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwNTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTJmMCwgMHhmZmZkLCAweGZmZmQsIDB4OTRkMiwgMHg5ZDcwLCAweDkxN2QsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkxYTgsIDB4ZmZmZCwgMHhmZmZkLCAweDhlNGEsIDB4OWQ3MSwgMHhmZmZkLCAweDlkNzMsCisgICAgMHg5ZDZmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTVkZiwgMHhmZmZkLCAweDkyYmIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkxN2IsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1ZjksCisgICAgMHg4ZWNjLCAweDlkODAsIDB4ZmZmZCwgMHg5ZDdlLCAweGZmZmQsIDB4ZmZmZCwgMHg5MDk4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGM5ZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDc4LCAweDhmYjcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTNlNiwgMHg5NDUwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZDc2LCAweGZmZmQsIDB4ZmZmZCwgMHg5MTdjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZWY2LCAweDlkN2IsIDB4ZmZmZCwgMHhmZmZkLCAweDhmYjYsIDB4ZmZmZCwgMHg5ZDc1LCAweDlkN2EsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTQ3MiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDc0LCAweGZmZmQsCisgICAgMHg4YzQwLCAweGZmZmQsIDB4ZmZmZCwgMHg4YTdjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlkN2MsCisgICAgMHg5N2E5LCAweDhkY2MsIDB4OTI1NCwgMHg5ZDc5LCAweGZmZmQsIDB4OTBkYSwgMHhmZmZkLCAweDhkNTQsCisgICAgMHg5MDg0LCAweDg5ODYsIDB4OTE1YiwgMHg5ZDc3LCAweDhiNjQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGM2NiwgMHhmZmZkLCAweDkyY2QsIDB4OWQ3ZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MTdlLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDgxLCAweGZmZmQsCisgICAgMHg5ZDgzLCAweGZmZmQsIDB4ZmZmZCwgMHg5MWI1LCAweDlkODksIDB4ZmZmZCwgMHg5ZDg0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlkODYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1NjAsCisgICAgMHg5MmYxLCAweGZmZmQsIDB4OWQ4NywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NzRiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTc2NywgMHg4YWI3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg4YWMsIDB4ZmZmZCwgMHg5ZDg1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlkODIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YWY2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5ODcsIDB4ZmZmZCwgMHg5ZDg4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTc2OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDhjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTFiOSwgMHhmZmZkLCAweDlkOTMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDhkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDhhLCAweDlkOTEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlkNzIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDhlLCAweGZmZmQsCisgICAgMHg5ZDkyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk0YzAsIDB4OTM4YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlkOGIsIDB4ZmZmZCwgMHg5ZDhmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGM2NywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZGVmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTBkYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDk3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MzQ1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlkOTQsCisgICAgMHhmZmZkLCAweDk2ODAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlkOTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZDk2LCAweGZmZmQsCisgICAgMHg5NmNjLCAweGZmZmQsIDB4OTBhMCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YzgyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZDlkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGU1NCwgMHg5ZDlhLCAweGZmZmQsIDB4OWQ5OSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTQ1MSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5M2IzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzNTAsIDB4OWQ5YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlkOWMsIDB4ZmZmZCwgMHg5NThmLCAweGZmZmQsIDB4OTQ2NCwgMHg4ZTQyLCAweGZmZmQsCisgICAgMHg5MGVmLCAweGZmZmQsIDB4OTY2ZiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhhNjgsIDB4ZmZmZCwgMHg5ZGEzLCAweDlkOWUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3NjksIDB4OWRhNSwgMHhmZmZkLCAweGZmZmQsIDB4OWRhMSwgMHhmZmZkLCAweDlkYTIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTE4MCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWRhMCwgMHhmZmZkLCAweDlkNWUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZGE0LCAweGZmZmQsIDB4OWQ5ZiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZGE5LCAweDlkYWEsIDB4OTM0NiwgMHg5ZGFjLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZTQzLCAweDlkYTcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhiNWIsIDB4ZmZmZCwgMHhmZmZkLCAweDlkYWQsCisgICAgMHhmZmZkLCAweDlkYTYsIDB4OWRiMSwgMHhmZmZkLCAweDlkYjAsIDB4ZmZmZCwgMHg5ZGFmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWRiMiwgMHhmZmZkLCAweGZmZmQsIDB4OWRiNCwgMHg4ZmVmLCAweGZmZmQsCisgICAgMHg5ZGIzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWRiNywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZGI1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlkYjYsIDB4OWQ5MCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZGI5LCAweDlkYjgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWQ5OCwgMHg5ZGJhLCAweDlkYWUsIDB4ZmZmZCwgMHhmZmZkLCAweDhlNzgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlkYmIsIDB4OWRiYywgMHg5ZGJlLCAweDlkYmQsCisgICAgMHg5ZGJmLCAweDg5ZmMsIDB4ZmZmZCwgMHg4ZDU1LCAweGZmZmQsIDB4ZmZmZCwgMHg5NWZhLCAweDkwYWQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGNjYywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZGMxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWRjNCwgMHhmZmZkLCAweDk1NzEsCisgICAgMHhmZmZkLCAweDhiN2UsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWRjMywgMHg5ZGMyLCAweDk0NzMsCisgICAgMHg5ZGM1LCAweDhiYjMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWRjNywgMHg5ZGM2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGFiOCwgMHg4ZTU1LCAweGZmZmQsIDB4ZmZmZCwgMHg5M2Q2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjNjgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MDk0LCAweGZmZmQsIDB4OWRjOCwgMHhmZmZkLCAweDkwYWUsIDB4OTM0NywgMHhmZmZkLCAweDk1N2UsCisgICAgMHg5ZGM5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWRjYSwgMHg5ZGNiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1YjYsCisgICAgMHg5YjdjLCAweDkwYzQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1NmIsIDB4ZmZmZCwgMHg4ZGQ2LCAweGZmZmQsCisgICAgMHg5NGUzLCAweDk0YzEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzNmMsCisgICAgMHhmZmZkLCAweDk3YmYsIDB4ZmZmZCwgMHg5ZGNkLCAweDhlY2UsIDB4ZmZmZCwgMHhmZmZkLCAweDlkY2UsCisgICAgMHhmZmZkLCAweDg4YjQsIDB4ZmZmZCwgMHhmZmZkLCAweDhiZDIsIDB4OTBjYiwgMHhmZmZkLCAweDk1ODAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZGNmLCAweDhlNjEsIDB4OTI2NiwgMHhmZmZkLCAweDhlN2EsCisgICAgMHg5MDU2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlkZDAsCisgICAgMHhmZmZkLCAweDk1ZmIsIDB4ZmZmZCwgMHhmZmZkLCAweDg5OTcsIDB4OGU3YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlkZDMsIDB4ZmZmZCwgMHg5ZGQxLCAweDlkZDQsIDB4OTdiNywgMHg5ZGQyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MGY5LCAweDlkZDUsIDB4ZmZmZCwgMHhmZmZkLCAweDkxYjAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWRkNiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhZjgsCisgICAgMHhmZmZkLCAweDlkZDgsIDB4ZmZmZCwgMHg5ZGQ3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZGQ5LCAweDlkZGEsIDB4OGFmOSwgMHhmZmZkLCAweGZmZmQsIDB4OTNmYSwgMHg5MjU1LCAweDhiOGMsCisgICAgMHg4ZTdjLCAweDkxODEsIDB4ZmZmZCwgMHhmZmZkLCAweDhmN2IsIDB4ODhhZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlkZGIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODlhMCwgMHg5ZGRmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGQ1NiwgMHg5ZGRlLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZGE5LCAweDhmYjgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWRkZCwgMHhmZmZkLCAweDhmYjksIDB4ZmZmZCwgMHg5NmJlLCAweDhkYTgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OGQ1LCAweDkwY2MsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlkZTQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwYWYsCisgICAgMHg4OTY2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGY3NCwgMHhmZmZkLCAweDk2ODYsCisgICAgMHg4ZGYwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGZiYSwgMHhmZmZkLCAweDkwYTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlkZTMsIDB4OWRlMSwgMHg5ZGUyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkyOGIsIDB4ZmZmZCwgMHhmZmZkLCAweDllNDUsCisgICAgMHhmZmZkLCAweDlkZTgsIDB4OGU5ZSwgMHg4ZDU3LCAweDlkZTYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlkZTcsIDB4ZmZmZCwgMHg5MDU3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlkZTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGU0ZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWRlYSwgMHg5ZGU5LCAweDlkZWUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWRlZiwgMHhmZmZkLCAweDlkZWIsIDB4ZmZmZCwgMHg4YTQxLCAweDlkZWMsCisgICAgMHg5ZGVkLCAweDk0ZDMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NTgxLCAweDhjNjksCisgICAgMHg5ZGYwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwYjAsIDB4ZmZmZCwgMHg4ZmJiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTI3MSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhiYzUsIDB4ZmZmZCwgMHg5ZGYxLCAweDlkZjUsIDB4ZmZmZCwgMHhmZmZkLCAweDg5YzksCisgICAgMHg5ZGYyLCAweDlkZjQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZGYzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhmOGIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MjY3LCAweDg4YzMsCisgICAgMHg5ZGY2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWRmNywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTJhOCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5N2VmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZTYyLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWU5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk2NWMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZTQxLCAweDlkZjksIDB4ZmZmZCwgMHhmZmZkLCAweDlkZmMsIDB4ZmZmZCwgMHg5ZGZiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlkZjgsIDB4ZmZmZCwgMHhmZmZkLCAweDllNDAsIDB4ZmZmZCwgMHhmZmZkLCAweDkzZGMsCisgICAgMHhmZmZkLCAweDlkZmEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZTQyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhmOGMsIDB4OWU0MywgMHhmZmZkLCAweDk3NmEsIDB4OTQ5OCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZTQ0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZTQ2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllNDcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZTQ4LCAweGZmZmQsIDB4OGJjOCwgMHg4OTY3LCAweDhkNTgsIDB4OWU0OSwgMHhmZmZkLCAweDllNGEsCisgICAgMHg4ZjkxLCAweDkxODIsIDB4ZmZmZCwgMHhmZmZkLCAweDk5ZDYsIDB4OTE1ZCwgMHg5MTVjLCAweDkxZDYsCisgICAgMHg4ZGM1LCAweGZmZmQsIDB4ZmZmZCwgMHg5OGYwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YzhlLCAweDk3NGMsIDB4ZmZmZCwgMHg5NWZjLCAweGZmZmQsIDB4OTU5ZSwgMHhmZmZkLCAweDllNGIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhkZjEsIDB4OTJiZCwgMHg5ZTRjLCAweDk4NGUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NjVkLCAweGZmZmQsIDB4OTJhOSwgMHg5ZTRkLCAweDhhZmEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZTRlLCAweDllNGYsCisgICAgMHg5NmQ4LCAweGZmZmQsIDB4OTZhMiwgMHg5Njk2LCAweDk2N2IsIDB4OGU0NCwgMHg5ZTUxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhlZTksIDB4ZmZmZCwgMHhmZmZkLCAweDk2NzAsIDB4ZmZmZCwgMHg5ZTUzLCAweDllNTYsCisgICAgMHg5ZTU1LCAweGZmZmQsIDB4OGFmNywgMHhmZmZkLCAweGZmZmQsIDB4OGI4MCwgMHhmZmZkLCAweDllNTIsCisgICAgMHhmZmZkLCAweDllNTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZTU3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkwOTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NzliLCAweDg4YzcsCisgICAgMHg4ZGRlLCAweDkxYmEsIDB4ZmZmZCwgMHg4ZWRiLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZmYxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllNWEsIDB4ZmZmZCwgMHhmZmZkLCAweDkzNmQsIDB4ZmZmZCwgMHg5ZTU4LCAweDkxYTksCisgICAgMHg5ZTU5LCAweDhmZjAsIDB4OTZkYiwgMHg5ZTViLCAweDllNWMsIDB4OTc4OCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWU2MSwgMHhmZmZkLCAweGZmZmQsIDB4OGQ1OSwgMHhmZmZkLCAweDk0NzQsCisgICAgMHg5ZTVlLCAweDkzOGMsIDB4OWRkYywgMHg5ZGUwLCAweGZmZmQsIDB4OGI2ZSwgMHhmZmZkLCAweDk0NjYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDllNjAsIDB4ZmZmZCwgMHg4ZmJjLCAweDk0YzIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWU2NiwgMHhmZmZkLCAweDk0ZjgsCisgICAgMHhmZmZkLCAweDllNWQsIDB4ZmZmZCwgMHg5ZTYzLCAweDllNjIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MGNkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTY4ZCwgMHhmZmZkLCAweDk3ZDEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTY4NywgMHhmZmZkLCAweDg5Y2EsIDB4OGU3ZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ODY3LCAweDllNjUsIDB4OTA5NSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZTY0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllNWYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjY2QsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZTZiLCAweDllNjksIDB4ZmZmZCwgMHg4OWNiLCAweDllNjcsCisgICAgMHg5ZTZkLCAweDllNzMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkxYzYsIDB4ZmZmZCwgMHhmZmZkLCAweDk1YmYsIDB4ZmZmZCwgMHg5ZTc1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTU0MSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZTc0LCAweDk0OTAsCisgICAgMHg5NjVlLCAweDhhYjksIDB4ZmZmZCwgMHg5MGY1LCAweDhmNWYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MmQxLCAweGZmZmQsIDB4OTc0ZCwgMHhmZmZkLCAweGZmZmQsIDB4OWU3MCwgMHg5ZTZmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWU3MSwgMHhmZmZkLCAweDllNmUsIDB4ZmZmZCwgMHhmZmZkLCAweDllNzYsCisgICAgMHhmZmZkLCAweDllNmMsIDB4ZmZmZCwgMHhmZmZkLCAweDllNmEsIDB4ZmZmZCwgMHg5ZTcyLCAweDllNjgsCisgICAgMHhmZmZkLCAweDkyOGMsIDB4ZmZmZCwgMHg5NmY2LCAweDhlYzQsIDB4OGRmMiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZGI4LCAweGZmZmQsIDB4ZmZmZCwgMHg5NjhmLCAweDhhNjAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTJjYywgMHg5M2M4LCAweDg5NjgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MGYwLCAweGZmZmQsIDB4ZmZmZCwgMHg5MGIyLCAweDhjNDksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZTc4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhkNWEsIDB4OGE5YywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllN2EsIDB4OGE5NCwgMHg5ZTgxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWU3ZCwgMHhmZmZkLCAweDkwZjEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YTZhLCAweDhkYWEsIDB4ZmZmZCwgMHhmZmZkLCAweDhhNjksIDB4OGRjZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZTdiLCAweDhjODUsIDB4OGM2YSwgMHg5MzhkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZTc5LCAweGZmZmQsCisgICAgMHg4OGM0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWU3YywgMHg5ZTdlLCAweGZmZmQsCisgICAgMHg4YmNiLCAweDhjNGIsIDB4ZmZmZCwgMHg4YWJhLCAweDhiNmEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllODIsIDB4ZmZmZCwgMHhmZmZkLCAweDhkZjcsIDB4OTY5MSwgMHhmZmZkLCAweDhlNTYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZTgzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1NGYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDllOGYsIDB4ZmZmZCwgMHg4OWIxLCAweDllODQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZTk1LCAweDllODUsCisgICAgMHhmZmZkLCAweDk3YzAsIDB4ZmZmZCwgMHg5ZThjLCAweGZmZmQsIDB4OTQ3ZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWU5NCwgMHhmZmZkLCAweDllODcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OGIyLCAweDllODksIDB4ZmZmZCwgMHhmZmZkLCAweDhkNWIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZThiLCAweGZmZmQsIDB4OWU4YSwgMHhmZmZkLCAweDllODYsCisgICAgMHg5ZTkxLCAweGZmZmQsIDB4OGZiZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5YWViLCAweDhjZTYsCisgICAgMHg5NzljLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWU4OCwgMHhmZmZkLCAweDkyZjIsCisgICAgMHg4YTQyLCAweDhkYWIsIDB4ZmZmZCwgMHg5ZTgwLCAweGZmZmQsIDB4OWU5MCwgMHg4YTgxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllOGUsIDB4OWU5MiwgMHhmZmZkLCAweDkzOGUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhZmMsIDB4ZmZmZCwgMHg5ZWIwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk2YzcsIDB4OWU5NywgMHg4YWZiLCAweGZmZmQsIDB4OWU5ZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTY1ZiwgMHhmZmZkLCAweDllOWYsIDB4OWVhMSwgMHhmZmZkLCAweDllYTUsCisgICAgMHg5ZTk5LCAweGZmZmQsIDB4OTI0OSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzOGYsCisgICAgMHg5ZWE5LCAweDllOWMsIDB4ZmZmZCwgMHg5ZWE2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDllYTAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MDU4LCAweDllYWEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTBiMSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllYTgsIDB4OGFiYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ODZmLCAweDllOTYsIDB4ZmZmZCwgMHhmZmZkLCAweDllYTQsIDB4ODhkNiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZTk4LCAweGZmZmQsIDB4ZmZmZCwgMHg5NmI4LCAweDllOWQsIDB4OTA0MSwgMHg5MmM1LCAweDllOTMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWVhMywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkwOWEsIDB4OWVhZCwgMHg4YTkxLCAweDhjOWYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllYWYsIDB4OWU5YSwgMHg5ZWFlLCAweGZmZmQsIDB4OWVhNywgMHg5ZTliLCAweGZmZmQsCisgICAgMHg5ZWFiLCAweGZmZmQsIDB4OWVhYywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZWJkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzY2MsIDB4ZmZmZCwgMHg5ZWEyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllYjksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWViYiwgMHhmZmZkLCAweDkyZDYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTc2YiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NTk2LCAweDllYjYsIDB4OTFjOCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllYmMsIDB4OTE1ZSwgMHhmZmZkLCAweDllYjMsIDB4OWVjMCwgMHg5ZWJmLCAweGZmZmQsCisgICAgMHg5M2VkLCAweDllYmUsIDB4OTNlOCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWVjMiwgMHg5ZWI1LCAweGZmZmQsIDB4OGJjNiwgMHg5ZWI4LCAweDhmN2MsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NDgwLCAweDllYmEsIDB4OGJjOSwgMHhmZmZkLCAweDllYjIsCisgICAgMHg5ZWI0LCAweDllYjEsIDB4ZmZmZCwgMHhmZmZkLCAweDk4NGYsIDB4OGE3OSwgMHg5ZWI3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllYzEsIDB4OGE1NCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGRlNSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OTdjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllZDIsIDB4ZmZmZCwgMHhmZmZkLCAweDk4NTAsIDB4OWVkNSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MDU5LCAweDllZDQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZWQzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDllZDAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZWM0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllZTEsIDB4OWVjMywgMHhmZmZkLCAweDllZDYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZWNlLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZWM5LCAweDllYzYsCisgICAgMHhmZmZkLCAweDllYzcsIDB4ZmZmZCwgMHg5ZWNmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhYTAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWVjYywgMHg4ZDVjLCAweDkyYzYsIDB4OTE4NCwgMHg5ZWNhLCAweGZmZmQsCisgICAgMHg5ZWM1LCAweGZmZmQsIDB4ZmZmZCwgMHg5ZWM4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NzZjLCAweDk2OGEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWVjZCwgMHg5ZWQ3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDllZGYsCisgICAgMHg5ZWQ4LCAweGZmZmQsIDB4ZmZmZCwgMHg5ZWU1LCAweGZmZmQsIDB4OWVlMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWVkZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllZGQsIDB4ZmZmZCwgMHg5MmNlLCAweGZmZmQsIDB4OTE4NSwgMHhmZmZkLCAweDllZGIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWVkOSwgMHhmZmZkLCAweGZmZmQsIDB4OWVlMCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWVlNiwgMHg5NGYzLCAweDllZWMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWVlNywgMHg5ZWVhLCAweDllZTQsIDB4ZmZmZCwgMHhmZmZkLCAweDkyOTQsCisgICAgMHhmZmZkLCAweDk1NTcsIDB4ZmZmZCwgMHg5ZWRhLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZWUyLCAweDhmYmUsCisgICAgMHhmZmZkLCAweDk2Y2QsIDB4OWVmNiwgMHg5ZWU5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjYTAsIDB4ODlhMSwgMHg4YTdlLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZWQxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGZiZiwgMHg5ZWVlLCAweGZmZmQsCisgICAgMHg5ZWY1LCAweDhlZjcsIDB4OGE5MiwgMHhmZmZkLCAweGZmZmQsIDB4OTI0ZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDllZWIsIDB4ZmZmZCwgMHhmZmZkLCAweDllZjAsCisgICAgMHg5ZWY0LCAweGZmZmQsIDB4ZmZmZCwgMHg4YmI0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YjZiLCAweDllZjIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhiNDAsCisgICAgMHhmZmZkLCAweDkzYzksIDB4OWVmMSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZWYzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWVlZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZWVmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhODAsCisgICAgMHg5MjY4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDllZmEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWVmOCwgMHg4Y2U3LCAweGZmZmQsCisgICAgMHg5ZWY3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmNDAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDllNzcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZWY5LCAweGZmZmQsIDB4OWVmYiwgMHg5ZWZjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWY0YiwgMHhmZmZkLCAweDlmNDcsIDB4ZmZmZCwgMHg5ZThkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZjQ2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZjQ1LCAweGZmZmQsIDB4ZmZmZCwgMHg5ZjQyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDllZTgsIDB4OWY0NCwgMHg5ZjQzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlmNDksIDB4ZmZmZCwgMHg5ODQ1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWY0YywgMHg4YmY5LCAweGZmZmQsIDB4ZmZmZCwgMHg5ZjQ4LCAweDlmNGEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NGE1LCAweGZmZmQsIDB4OWY0ZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWY1MSwgMHg5ZjRlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk3OTMsIDB4OWY0ZiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWVkYywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWY1MiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZjUzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ODk1NCwgMHhmZmZkLCAweDlmNTUsCisgICAgMHg4Yzg3LCAweDhlOWYsIDB4ZmZmZCwgMHg4YmQzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5YTIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTc3ZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmNTcsCisgICAgMHg5ZjU2LCAweDlmNTksIDB4OGI1YywgMHhmZmZkLCAweGZmZmQsIDB4OGJkNCwgMHg4YWJjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZjVjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmNWIsCisgICAgMHhmZmZkLCAweDlmNWQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5Y2MsIDB4ZmZmZCwgMHg5MjU2LCAweGZmZmQsCisgICAgMHg5ZjVlLCAweGZmZmQsIDB4ZmZmZCwgMHg4YWJkLCAweDlmNjAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlmNWYsIDB4ZmZmZCwgMHg5ZjYxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmNjIsCisgICAgMHhmZmZkLCAweDlmNjMsIDB4OGU3ZSwgMHg5MGIzLCAweDhkOWYsIDB4ZmZmZCwgMHg5NTkwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk1ZTAsIDB4OTg2MywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhlOTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZGNlLCAweDk3ZjAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZjY0LCAweDlmNjUsIDB4ZmZmZCwgMHg4ZTgwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmNjYsCisgICAgMHg5ZjY3LCAweGZmZmQsIDB4ZmZmZCwgMHg5ZjY5LCAweDlmNjgsIDB4ZmZmZCwgMHg5Njc3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhmN2QsIDB4OGVlYSwgMHg4ZTYzLCAweGZmZmQsIDB4OWY2YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWY2YywgMHg5MDQyLCAweGZmZmQsCisgICAgMHg5ZjZiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZjZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmNmUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWY2ZiwgMHg5ZjcwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmNzEsCisgICAgMHhmZmZkLCAweDlmNzMsIDB4OWY3MiwgMHg5Zjc0LCAweDg5YTMsIDB4OTI2OSwgMHhmZmZkLCAweDlmNzUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGU0NSwgMHg4YTZiLCAweDlmNzYsIDB4ZmZmZCwgMHhmZmZkLCAweDkzNjEsCisgICAgMHg5YWNhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGI0MiwgMHg5Zjc3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Zjc4LCAweGZmZmQsIDB4OTVlYSwgMHg5Njg4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTNjNSwgMHg5Zjc5LCAweDk0ZTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NGY5LCAweGZmZmQsIDB4ZmZmZCwgMHg5NmQxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmN2EsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZjdjLCAweDlmN2IsIDB4ZmZmZCwgMHhmZmZkLCAweDlmN2UsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZjdkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZjgxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhlODEsCisgICAgMHhmZmZkLCAweDk2YWYsIDB4ZmZmZCwgMHg5ZjgyLCAweDlmODMsIDB4ZmZmZCwgMHhmZmZkLCAweDhiNDMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Zjg0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Zjg2LCAweDlmODUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwODUsIDB4ZmZmZCwgMHhmZmZkLCAweDk1NTgsCisgICAgMHg4OTY5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NGMzLCAweGZmZmQsCisgICAgMHg5MmYzLCAweDhmNjAsIDB4OGI4MSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NGM0LCAweGZmZmQsCisgICAgMHg4ZWFjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWY4OCwgMHhmZmZkLCAweDhhYmUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODk5OCwgMHhmZmZkLCAweGZmZmQsIDB4OTNmMCwgMHg5Zjg3LCAweDhkNWQsCisgICAgMHg5MjcyLCAweGZmZmQsIDB4OWY4OSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZjkxLCAweGZmZmQsIDB4OWY4YSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MWJmLCAweGZmZmQsIDB4OGI4MiwgMHg5ZjkyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGM4OCwgMHhmZmZkLCAweGZmZmQsIDB4OGI0NCwgMHg5ZjkwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlmOGUsIDB4OWY4YiwgMHg5NzgwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MmJlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzZDcsIDB4OWY4YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Zjk0LCAweGZmZmQsIDB4OWY5MywgMHg4YzQyLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWFiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhkYjksIDB4OWY4ZCwgMHg5ZjhmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk2NzYsIDB4OTFmMiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Njk3LCAweGZmZmQsIDB4ZmZmZCwgMHg5ZjljLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlmOWQsIDB4ZmZmZCwgMHg4OWNkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NWE2LCAweDk2ZmIsIDB4OWY5ZiwgMHg4ZWExLCAweDhmYzAsIDB4OWY5OCwgMHg5ZjllLCAweDg5ODgsCisgICAgMHhmZmZkLCAweDhiYjUsIDB4ZmZmZCwgMHhmZmZkLCAweDlmOTUsIDB4OWY5YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkwZjIsIDB4OTQ5MSwgMHhmZmZkLCAweDk0ZTUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Zjk3LCAweGZmZmQsIDB4OTY0MCwgMHhmZmZkLCAweDlmOTksCisgICAgMHhmZmZkLCAweDlmYTIsIDB4ZmZmZCwgMHg5ZmEwLCAweGZmZmQsIDB4OWY5YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk2NDEsIDB4OTQ2NywgMHg4YjgzLCAweGZmZmQsIDB4OTM0NCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MjhkLCAweGZmZmQsIDB4OWZhMywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmYTEsCisgICAgMHg5MWQ3LCAweDlmOTYsIDB4ZmZmZCwgMHg4OTZhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NzZkLCAweDlmYWUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWZhZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwZjQsCisgICAgMHhmZmZkLCAweDlmYWEsIDB4ZmZmZCwgMHg5NzhjLCAweGZmZmQsIDB4ZmZmZCwgMHg5M2I0LCAweDlmYTQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTJjMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5NmIsIDB4OGQ1ZSwgMHg5ZmE3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGY0NiwgMHg5ZmFjLCAweGZmZmQsIDB4OWZhYiwgMHg5ZmE2LCAweGZmZmQsCisgICAgMHg5ZmE5LCAweGZmZmQsIDB4ZmZmZCwgMHg4YTg4LCAweGZmZmQsIDB4OWZhOCwgMHg5NDY4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3YWMsIDB4ZmZmZCwgMHhmZmZkLCAweDhmZjIsIDB4OTBmMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlmYjQsIDB4OWZiMiwgMHhmZmZkLCAweDk1NmMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZmFmLCAweDlmYjEsIDB4ZmZmZCwgMHg4OTU5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhkNWYsIDB4OTg1MSwgMHhmZmZkLCAweDhhNWMsIDB4ZmZmZCwgMHg5NTgyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk3ODEsIDB4ZmZmZCwgMHhmZmZkLCAweDhhNDMsCisgICAgMHg5MDVhLCAweDlmYjMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWZiOCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZmMxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk3NGYsIDB4ZmZmZCwgMHg5ZmI1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZmIwLCAweGZmZmQsIDB4OWZiNiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3ZGMsIDB4ZmZmZCwgMHg5MzkzLCAweDkzYzAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhNTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODk3NCwgMHhmZmZkLCAweGZmZmQsIDB4OWZiYywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZmJmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk3YzEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Nzg0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OWZjNiwgMHg5ZmMwLCAweDlmYmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5N2QyLCAweDlmYzMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhmNjksIDB4OWZjNSwgMHhmZmZkLCAweGZmZmQsIDB4OWZjYSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MzkxLCAweDlmYzgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZmMyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkyNTcsIDB4ZmZmZCwgMHhmZmZkLCAweDlmYzksIDB4ZmZmZCwgMHg5ZmJlLCAweGZmZmQsCisgICAgMHg5ZmM0LCAweGZmZmQsIDB4OWZjYiwgMHg4OGZhLCAweDlmYzEsIDB4ZmZmZCwgMHg5ZmNjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkwNWIsIDB4ZmZmZCwgMHg4ZjdlLCAweGZmZmQsIDB4OTVhMywgMHhmZmZkLCAweDhkYWMsCisgICAgMHhmZmZkLCAweDlmYjksIDB4OWZjNywgMHg5MzU5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTBiNCwgMHhmZmZkLCAweDhhODksCisgICAgMHg4ZGNmLCAweDhmYzIsIDB4OWZiYiwgMHg4ZjYxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YzZiLCAweGZmZmQsIDB4OWZiYSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlmZDAsIDB4OGY4ZCwgMHg4Y2I4LCAweGZmZmQsIDB4OWZkZiwgMHhmZmZkLCAweDlmZDksCisgICAgMHg4Yjk0LCAweDkzNmUsIDB4ZmZmZCwgMHg5ZmQ0LCAweDlmZGQsIDB4ODhhZCwgMHg4OTUxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5YjcsIDB4ZmZmZCwgMHg5ZmQ2LCAweDkxYWEsIDB4OWZjZCwgMHg5ZmNmLCAweDhkNjAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZmUwLCAweGZmZmQsIDB4OWZkYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZmQzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZmRhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTZhOSwgMHhmZmZkLCAweGZmZmQsIDB4OWZkOCwgMHg5ZmRjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4Y2NlLCAweGZmZmQsCisgICAgMHg4ZmMzLCAweGZmZmQsIDB4ZmZmZCwgMHg5MjU4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmZDIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk3NGUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZmQ1LCAweGZmZmQsIDB4ZmZmZCwgMHg5ZmNlLCAweDkzOTIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWZkMSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZmQ3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ODcwLCAweDhlYmMsCisgICAgMHg5NjllLCAweGZmZmQsIDB4OWZlMSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk0YWMsIDB4ZmZmZCwgMHhmZmZkLCAweDlmZWQsCisgICAgMHg4Y2I5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZjgwLCAweGZmZmQsCisgICAgMHg5ZmUzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk3YWQsIDB4OGQ2MSwgMHhmZmZkLCAweDlmZjAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODhlYywgMHhmZmZkLCAweGZmZmQsIDB4OWZlZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWZlMiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmZTgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWZlYSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NzZlLCAweDlmZTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTM0ZCwgMHhmZmZkLCAweGZmZmQsIDB4OWZlNywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWZlZiwgMHhmZmZkLCAweDlmZTksIDB4OTZjNSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlmZTQsIDB4ZmZmZCwgMHg4ZWEwLCAweDlmZmMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhhOGEsIDB4ZmZmZCwgMHg5ZmU2LCAweDlmZWIsIDB4OWZlYywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTFlYSwgMHg5MWQ4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmZjQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmZmEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWZmOCwgMHhmZmZkLCAweDkzNDgsIDB4ZmZmZCwgMHhmZmZkLCAweGUwNDIsCisgICAgMHg5ZmY1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZmY2LCAweDlmZGUsCisgICAgMHhmZmZkLCAweDhiOTksIDB4OTU1OSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZWJkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhkOTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk4NTIsCisgICAgMHhmZmZkLCAweDlmZjIsIDB4ZmZmZCwgMHhlMDQxLCAweDg5ODksIDB4OTE4NiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NDk5LCAweGZmZmQsIDB4OGFiZiwgMHg5N2Y4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NjlmLCAweDkyZDAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDlmZjksIDB4OWZmYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MTUxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMDQwLCAweDlmZjcsCisgICAgMHhmZmZkLCAweDlmZjEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGFjMSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjODksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMDRlLCAweGZmZmQsIDB4ZmZmZCwgMHhlMDQ5LCAweDkwZjYsIDB4ZmZmZCwgMHhmZmZkLCAweDhhODMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmODEsIDB4ZmZmZCwgMHhlMDUyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTA0YiwgMHg5MmFhLCAweGUwNDgsCisgICAgMHg5MmQ3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwNmIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMDQ1LCAweGZmZmQsIDB4ZTA0NCwgMHhmZmZkLCAweGUwNGQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMDQ3LCAweGUwNDYsIDB4ZTA0YywgMHhmZmZkLCAweDkwOWYsIDB4ZmZmZCwgMHhlMDQzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMDRmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwNTAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhYzAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwNTUsIDB4ZmZmZCwgMHhlMDU0LCAweGUwNTYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTA1OSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkzNjIsIDB4ZmZmZCwgMHhlMDUzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwNTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YzgzLCAweDkxZjcsIDB4ZTA1MSwgMHg5NDVhLCAweGZmZmQsIDB4ZmZmZCwgMHhlMDU4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwNWQsIDB4ZTA1YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMDVlLCAweGZmZmQsIDB4ZmZmZCwgMHhlMDYxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwNWEsCisgICAgMHg4ZDhhLCAweDk0NDcsIDB4ZmZmZCwgMHhmZmZkLCAweDlmYjcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Nzk0LCAweGUwNWMsIDB4ZmZmZCwgMHhlMDYwLCAweDkxZjMsCisgICAgMHhmZmZkLCAweGUwNWYsIDB4ZmZmZCwgMHhlMDRhLCAweGZmZmQsIDB4ZmZmZCwgMHhlODg5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTA2NCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMDY4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwNjYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwNjIsIDB4ZmZmZCwgMHhlMDYzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwNjcsCisgICAgMHhmZmZkLCAweGUwNjUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTU2ZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMDZkLCAweGZmZmQsIDB4ZTA2YSwgMHhlMDY5LCAweGZmZmQsIDB4ZTA2YywgMHg5M2QyLCAweGUwNmUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Mjk1LCAweDkxZWIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwYTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMDZmLCAweGZmZmQsIDB4ZTA3MSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMDcwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlmZjMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwNzIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5M2U1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMDczLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWNlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzOTQsCisgICAgMHg4YTQ0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4Yjg0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhlZGMsIDB4OGRkMCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk4NDYsIDB4OTA4NiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OThhLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTA3NSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwNzQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwNzgsIDB4OTI1OSwgMHhlMDdiLCAweGUwNzYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMDdhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMDc5LCAweDkzNWYsIDB4ODhkNywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5N2YzLCAweGZmZmQsIDB4ZmZmZCwgMHhlMDdkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5NDcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwODAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTA3ZSwgMHhmZmZkLCAweGUwN2MsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwNzcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk2NDIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTA4MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwODEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5OGIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwODQsIDB4OTViMCwgMHhmZmZkLCAweGUwODMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk2YjMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZmM1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MTUyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmYzQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3ZjksIDB4ZmZmZCwgMHhmZmZkLCAweGUwOGEsIDB4ZmZmZCwgMHg5MGY3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTA4NiwgMHhlMDhiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5OGMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTA4OSwgMHhmZmZkLCAweDk0ODEsIDB4ZTA4NSwgMHhlMDg4LCAweDhmYzYsCisgICAgMHhmZmZkLCAweDk0Y2YsIDB4ZmZmZCwgMHhmZmZkLCAweGUwOGMsIDB4ZmZmZCwgMHg4ZWNmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTBmOCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwOGYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMDg3LCAweGZmZmQsIDB4OGM0NiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwOGQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk3NmYsIDB4ZTA5MCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGVhYTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmNmUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMDkxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwOTIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk0NGQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwOTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMDk1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NDUyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Mzk1LCAweGUwOTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMDk5LCAweGZmZmQsCisgICAgMHg5N2QzLCAweGZmZmQsIDB4ZTA5NiwgMHhmZmZkLCAweGUwOTgsIDB4ODk4ZCwgMHhmZmZkLCAweGUwOTMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDlhN2EsCisgICAgMHhlMDlhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTE4NywgMHg4ZTU3LCAweGUwOWMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwOWIsIDB4OTA0MywgMHg5OWQ3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTA5ZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwOWYsIDB4ZmZmZCwgMHhlMDhlLCAweGUwOWUsIDB4ZmZmZCwgMHhmZmZkLCAweGUwYTAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NDlhLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTBhMSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMGEyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGEzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMGE0LCAweGZmZmQsIDB4OTJkYywgMHhmZmZkLCAweGUwYTYsIDB4ZTBhNSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMGE3LCAweGZmZmQsIDB4ZTBhOCwgMHhmZmZkLCAweGZmZmQsIDB4OGVkZCwgMHg5NTgzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTZlYSwgMHhlMGE5LCAweGUwYWEsIDB4OTE3NSwgMHg4ZWEyLCAweGUwYWIsCisgICAgMHhlMGFjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGFkLCAweDk1ZDAsCisgICAgMHg5NGM1LCAweGZmZmQsIDB4ZmZmZCwgMHhlMGFlLCAweDk0NzYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTJhYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMGFmLCAweDg5ZTUsIDB4ZmZmZCwgMHg4YjhkLCAweGZmZmQsIDB4OTZjNCwgMHhmZmZkLCAweDk2YjQsCisgICAgMHhmZmZkLCAweDg5YjIsIDB4OTg1MywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk2NzEsCisgICAgMHhmZmZkLCAweDk1YTgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTBiNSwgMHhmZmZkLCAweGUwYjAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkzYzEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGNhMSwgMHhlMGIxLCAweGZmZmQsCisgICAgMHg4ZGQyLCAweGUwYjMsIDB4ZTBiMiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwYjQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTBiNSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGI2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YjVkLCAweGZmZmQsIDB4ZTBiNywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwYjgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjYTIsIDB4ZmZmZCwgMHhmZmZkLCAweDk0YzYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTBiYSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZmYzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwYjksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGJiNiwgMHhlMGJiLCAweGUwYmQsIDB4ZmZmZCwgMHhlMGJjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGJlLCAweGZmZmQsCisgICAgMHg4Y2NmLCAweGZmZmQsIDB4ZTBiZiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhiZTcsCisgICAgMHhmZmZkLCAweDkxNWYsIDB4ZmZmZCwgMHg4ZDlkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMGMxLCAweGUwYzIsIDB4ZTBjMCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhlZWIsIDB4ZmZmZCwgMHhmZmZkLCAweDkzYzYsIDB4OGJiNywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwYzQsCisgICAgMHg5MjRiLCAweGUwYzMsIDB4ZmZmZCwgMHhmZmZkLCAweDk4NTQsIDB4OTQ4MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTBjNywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGM5LCAweGUwYzYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NmQyLCAweGUwYzgsIDB4ZTBjYSwgMHhmZmZkLCAweDk3YzIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTBjZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwY2QsIDB4OTI5NiwgMHg5NDRjLCAweGZmZmQsIDB4ZmZmZCwgMHg4Y2EzLCAweGUwY2MsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwY2IsIDB4ZmZmZCwgMHg5NzUwLCAweDk3NTEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGNmLCAweDg5OGUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhkOTYsIDB4OGU4MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGQwLCAweGUwZDEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwZDMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZjYyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMGQ1LCAweGZmZmQsIDB4ZTBkNCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMGQ2LCAweGZmZmQsIDB4OGE2YywgMHhmZmZkLCAweGZmZmQsIDB4ZTBkOCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMGQ3LCAweGZmZmQsIDB4ZTBkYSwgMHhlMGQ5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjYmEsIDB4ZmZmZCwgMHhmZmZkLCAweDk3YTYsCisgICAgMHhmZmZkLCAweDhiY2EsIDB4ZmZmZCwgMHg4OWE0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YmU4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhhZGYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTdlNiwgMHhlMGRjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGRlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMGRmLCAweGZmZmQsIDB4ODljZiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMGRiLCAweGZmZmQsIDB4OGU1OCwgMHhmZmZkLCAweGZmZmQsIDB4OTJiZiwgMHhlMGRkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGUyLCAweGZmZmQsCisgICAgMHg4ZWVjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTBlMCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGM1ZCwgMHhmZmZkLCAweGZmZmQsIDB4OTRjNywgMHhlMGUxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwZmMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMGU3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4Y2JiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4Yjg1LCAweGZmZmQsIDB4ZTBlNCwgMHg5NzlkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3YWUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTFmNCwgMHhmZmZkLCAweGZmZmQsIDB4ZTBlNiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTBlOCwgMHg5N2Q0LCAweDhiZDUsIDB4OTRmYSwgMHg5NDY5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTBlOSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwZWIsCisgICAgMHhmZmZkLCAweGUwZWUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTBlYSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwZWQsIDB4OGNlOCwgMHg4OTZjLCAweGUwZWYsIDB4ZmZmZCwgMHg5MDkwLCAweGUwZWMsCisgICAgMHg5N2RhLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGYyLCAweGVhYTIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUwZjAsIDB4ZTBmMywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwZTUsCisgICAgMHhlMGYxLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZGJhLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGY0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGY1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NzllLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGY2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMGY3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTBlMywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwZjgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YWMyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGVhMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTBmOSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwZmEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUwZmIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5NWEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMTQwLCAweGZmZmQsIDB4OTU1YSwgMHhlMTQxLCAweGZmZmQsIDB4ZmZmZCwgMHg4YWEyLCAweGUxNDIsCisgICAgMHhmZmZkLCAweGUxNDMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMTQ0LCAweGZmZmQsCisgICAgMHhlMTQ2LCAweGUxNDcsIDB4ZTE0NSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NTcyLCAweGUxNDksCisgICAgMHhlMTQ4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMTRiLCAweGUxNGEsIDB4ZTE0YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxNGQsIDB4ZTE0ZiwgMHhlMTRlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhkOTksIDB4ZmZmZCwgMHhlMTUxLCAweGZmZmQsIDB4ZTE1MCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YWMzLCAweGZmZmQsIDB4OTA3MiwgMHhmZmZkLCAweDkzNWIsIDB4ZmZmZCwgMHhlMTUyLCAweDkwYjYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZTU5LCAweGZmZmQsIDB4ODk5OSwgMHhlMTUzLCAweGZmZmQsCisgICAgMHg5NzcwLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWUxLCAweGUxNTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MzYzLCAweDk3NTIsIDB4OGQ2MiwgMHg5MDVjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkyNmEsCisgICAgMHg5OWIyLCAweGZmZmQsIDB4OTJhYywgMHg4OWU2LCAweGUxNTUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxNTYsIDB4ZmZmZCwgMHhlMTViLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUxNTksIDB4ZTE1OCwgMHg5ZGMwLCAweDhhNDUsIDB4ZTE1NywgMHhmZmZkLCAweDg4ZDgsCisgICAgMHhmZmZkLCAweDk0YTgsIDB4ZmZmZCwgMHhmZmZkLCAweDk0YzgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3YWYsIDB4ZTE1YywgMHhlMTVhLCAweDkyN2IsIDB4OTBhNCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NGE5LCAweGZmZmQsIDB4OTU0YywgMHhmZmZkLCAweGUxNWUsIDB4OTdhYSwgMHg4YzZjLCAweGUxNWYsCisgICAgMHhmZmZkLCAweGUxNWQsIDB4OTRkNCwgMHhlMTYwLCAweGZmZmQsIDB4ZTE2MSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4OGQ5LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZmY0LCAweGUxNjYsIDB4ZmZmZCwgMHhlMTYzLCAweDkzZWIsCisgICAgMHhlMTYyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhiNDUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTE2OSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMTY0LCAweGUxNjUsCisgICAgMHhmZmZkLCAweGUxNjgsIDB4ZTE2NywgMHg5NTQ0LCAweGZmZmQsIDB4ZmZmZCwgMHg5MTYxLCAweDkxNjAsCisgICAgMHhmZmZkLCAweDhiNWUsIDB4ZmZmZCwgMHhmZmZkLCAweGUxNmEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTE2YiwgMHhmZmZkLCAweGZmZmQsIDB4ZTE2YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMTZlLCAweGZmZmQsIDB4ZTE2ZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OTc1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUxNzYsIDB4OTRlNiwgMHhlMTcwLCAweGZmZmQsIDB4ZTE3MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMTc0LCAweDkwNWQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxNzUsIDB4ZTE3MywgMHg4ZWJlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTE2ZiwgMHhlMTcxLCAweGZmZmQsIDB4OTU2MSwgMHhmZmZkLCAweDhmYzcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTE3OCwgMHhmZmZkLCAweGZmZmQsIDB4ZTE3NywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTE3OSwgMHhmZmZkLCAweDhlYTQsIDB4OGRhZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Mzk3LCAweGUxN2EsIDB4ZmZmZCwgMHg5MmM5LCAweGZmZmQsIDB4ZmZmZCwgMHhlMTdjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTc5ZiwgMHhlMTdiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkxODksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMTgyLCAweGZmZmQsIDB4ZTE4NCwgMHhlMTg1LCAweDkyNzMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTE4MywgMHhmZmZkLCAweGUxODAsIDB4ZmZmZCwgMHhlMTdkLCAweGUxN2UsCisgICAgMHhmZmZkLCAweGUxODEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUxODgsIDB4ZmZmZCwgMHhlMTg2LCAweGZmZmQsIDB4ZTE4NywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxODksCisgICAgMHhlMThiLCAweGUxOGMsIDB4ZTE4ZCwgMHhmZmZkLCAweGUxOGUsIDB4ZmZmZCwgMHhmZmZkLCAweGUxOGEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMTkwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxOGYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMTkxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTdjMywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMTk0LCAweGUxOTIsCisgICAgMHhlMTkzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhZTAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTZmYywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWM4LCAweGZmZmQsCisgICAgMHhlMTk2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxOTUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUxOTcsIDB4ZTE5OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxOWMsCisgICAgMHhlMTk5LCAweGUxOWEsIDB4ZTE5YiwgMHhmZmZkLCAweGUxOWQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMTllLCAweGZmZmQsIDB4ZTE5ZiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMWEwLCAweGZmZmQsCisgICAgMHhlMWExLCAweGZmZmQsIDB4OTRhZCwgMHg5MzZmLCAweGUxYTIsIDB4OTQ5MiwgMHg5NTUzLCAweGZmZmQsCisgICAgMHhlMWEzLCAweGZmZmQsIDB4ZmZmZCwgMHhlMWE0LCAweDkzNDksIDB4ZmZmZCwgMHg4YTQ2LCAweDhkNjMsCisgICAgMHhlMWE1LCAweGZmZmQsIDB4ZmZmZCwgMHhlMWE2LCAweGZmZmQsIDB4ZmZmZCwgMHhlMWE3LCAweGZmZmQsCisgICAgMHg4ZTQ4LCAweGZmZmQsIDB4ZmZmZCwgMHhlMWE5LCAweGZmZmQsIDB4ZmZmZCwgMHhlMWE4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUxYWEsIDB4ZTFhYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NGU3LCAweGZmZmQsCisgICAgMHhlMWFjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxYWQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhODksCisgICAgMHhlMWFlLCAweGUxYWYsIDB4ZTFiMCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhlNGQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTFiMSwgMHg5NDc1LCAweGZmZmQsIDB4ZmZmZCwgMHg5NjdlLCAweGZmZmQsCisgICAgMHg4OTZkLCAweGZmZmQsIDB4ODk3NiwgMHhmZmZkLCAweGZmZmQsIDB4ZTFiMiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTFiNCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMWIzLCAweDkzOTAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MGI3LCAweDlmNTgsIDB4ZmZmZCwgMHhlMWI1LCAweDk2YmYsCisgICAgMHhmZmZkLCAweGUxYjYsIDB4ZmZmZCwgMHg4YWM0LCAweDk0ZDUsIDB4ZTFiNywgMHhmZmZkLCAweGUxYjgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTFiOSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NmRhLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTZkMywgMHhmZmZkLCAweDkyYmMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MThhLCAweGZmZmQsIDB4ZmZmZCwgMHhlMWJiLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZjgyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhmYzgsIDB4ZmZmZCwgMHhmZmZkLCAweGUxYmUsIDB4ZmZmZCwgMHhmZmZkLCAweGUxYmQsCisgICAgMHhlMWJjLCAweDk0ZmIsIDB4ZmZmZCwgMHg4YWM1LCAweDhjYTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMWM0LCAweGZmZmQsIDB4ZmZmZCwgMHhlMWMxLCAweDkwNWUsCisgICAgMHg5NmIwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxYzAsIDB4ZTFjMiwgMHhlMWMzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUxYmYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxYzUsCisgICAgMHhlMWM2LCAweGZmZmQsIDB4OTJhZCwgMHhmZmZkLCAweDhhZTEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Mjg1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxYzcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTFjOCwgMHhlMWNiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkwODcsIDB4ZmZmZCwgMHg5M2MyLCAweGZmZmQsIDB4ZTFjYywgMHg5NjcyLCAweGZmZmQsCisgICAgMHhlMWM5LCAweGZmZmQsIDB4ZmZmZCwgMHhlMWNhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUxY2YsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMWNlLCAweGUxY2QsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMWQxLCAweGZmZmQsIDB4ZmZmZCwgMHhlMWQwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUxZDIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMWQ0LCAweGZmZmQsCisgICAgMHhlMWQzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTVjYiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmNzUsIDB4OTdjNCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMWQ1LCAweGZmZmQsIDB4ZmZmZCwgMHg5M2I1LCAweGZmZmQsIDB4ZmZmZCwgMHhlMWQ2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUxZDcsIDB4ZmZmZCwgMHhlMWRiLCAweGUxZDksIDB4ZTFkYSwgMHhmZmZkLCAweGUxZDgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxZGMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTFkZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxZGUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTFkZiwgMHg5NmI1LCAweGUxZTAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTZlZSwgMHhlMWUxLCAweGZmZmQsIDB4OTI2ZCwgMHhmZmZkLCAweDk0OGEsCisgICAgMHhmZmZkLCAweDhiZTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTI1YSwgMHhlMWUyLCAweDhiYjgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MGNlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxZTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGRiYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxZTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTFlNSwgMHhmZmZkLCAweDhjYTQsIDB4OGRkMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMWU3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTM3NSwgMHg4ZGQ0LCAweDhiNmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTY0MywgMHhmZmZkLCAweDk0NmEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTM3NiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhkN2IsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTFlOSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGZjOSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5N2IwLCAweDhkNjQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjYTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTRhMSwgMHhmZmZkLCAweGUxZWIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxZWQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjZTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMWVjLCAweDkyZjQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxZWYsIDB4OGE1NiwgMHhlMWVhLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk0ZTgsIDB4ZmZmZCwgMHg4OTRmLCAweGZmZmQsIDB4OGRlYSwgMHhmZmZkLCAweDk4NzEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTFlZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMWYwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1YzksCisgICAgMHhmZmZkLCAweDkwZDcsIDB4ZTFmMiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxZjMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTFmMSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGE2ZCwgMHhmZmZkLCAweGUxZjksIDB4ZmZmZCwgMHhlMWY4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhlYTUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTFmYSwgMHhlMWY1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTFmYiwgMHhlMWY2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NGQ2LCAweGUxZjQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxZjcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTI0MSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyNDAsCisgICAgMHg5NjgxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUxZmMsIDB4ZmZmZCwgMHhmZmZkLCAweDg4ZTksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyNDMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTI0MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhmY2EsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyNDQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MTYyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyNDYsIDB4ZTI0NSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyNDcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMWU2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTFlOCwgMHhlMjQ5LCAweGUyNDgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGVhNiwgMHhmZmZkLCAweDk3ZTcsIDB4ZmZmZCwgMHg4ZWQwLCAweGZmZmQsCisgICAgMHhlMjRhLCAweDhjNTYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhiNWYsCisgICAgMHg4YjQ2LCAweDhlODMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NzUzLCAweGZmZmQsIDB4ZmZmZCwgMHhlMjUwLCAweGZmZmQsIDB4ZTI0ZiwgMHg5MTYzLCAweGUyNGMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTI0ZSwgMHhmZmZkLCAweGZmZmQsIDB4OGY2YSwgMHg5MDVmLCAweGUyNGQsCisgICAgMHhlMjRiLCAweGZmZmQsIDB4OTQ0OSwgMHhmZmZkLCAweGZmZmQsIDB4OGZjYiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NTViLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGRkNSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzOTgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTI1MSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyNTIsCisgICAgMHhlMjY4LCAweDhiZDYsIDB4ZmZmZCwgMHhmZmZkLCAweDk4NWMsIDB4OTE1NCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTI1MywgMHhmZmZkLCAweGZmZmQsIDB4ODlkMCwgMHg5MmY1LCAweDk1OWYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTI1NCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YjlhLCAweGUyNTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTI1NywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMjU4LCAweGZmZmQsCisgICAgMHg5NDQ4LCAweGZmZmQsIDB4ZmZmZCwgMHhlMjU5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyNWEsIDB4ZTI1YiwgMHhmZmZkLCAweGZmZmQsIDB4OGJkNywgMHg4OWQxLCAweDkzYzMsCisgICAgMHg4ZjQ3LCAweDhlODQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyNWMsIDB4ZmZmZCwgMHg4ZjQ4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5YzgsIDB4OTU2MiwgMHhmZmZkLCAweGZmZmQsIDB4ZTI1ZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NGU5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkxNjQsCisgICAgMHhmZmZkLCAweGUyNjAsIDB4ZmZmZCwgMHhlMjYxLCAweDk0ODksIDB4ZmZmZCwgMHg5MDYwLCAweGUyNWUsCisgICAgMHhmZmZkLCAweDkyODEsIDB4ZmZmZCwgMHhmZmZkLCAweGUyNWYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZmNjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OGRhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YjQ4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMjYyLCAweGZmZmQsIDB4ZmZmZCwgMHg5MmY2LCAweGZmZmQsIDB4ZTI2MywgMHg5MGM1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk2YWIsIDB4ZmZmZCwgMHhmZmZkLCAweDk1NDIsCisgICAgMHhlMjY0LCAweGUyNjUsIDB4OTI3NCwgMHhmZmZkLCAweDk3YzUsIDB4ZmZmZCwgMHhmZmZkLCAweGUyNjcsCisgICAgMHhlMjY2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZWVkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyNjksIDB4ODhlZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyNmMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMjZhLCAweDg5ZDIsIDB4OGM2ZCwgMHhlMjZiLCAweDhkNjUsCisgICAgMHg4ZDkyLCAweGZmZmQsIDB4OTVlNCwgMHhlMjZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NjczLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyNmYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTBjZiwgMHg4OTZlLCAweDg5YjgsCisgICAgMHg4OGFhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyNmUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyNzAsIDB4ZTI3MSwgMHg4ZmY1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyNzIsIDB4ZmZmZCwgMHg4YTZlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMjc0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjOGEsIDB4ZmZmZCwgMHg4Yjg2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyNzUsIDB4OGJmMywgMHhmZmZkLCAweGZmZmQsIDB4ZTI3NiwgMHhmZmZkLCAweDkwZmEsCisgICAgMHhmZmZkLCAweDkzY2IsIDB4ZmZmZCwgMHg5MGRlLCAweDhkZjMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMjc3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTI4MiwgMHg5MThiLCAweGZmZmQsIDB4ZTI3OSwgMHhlMjdiLCAweGUyNzgsCisgICAgMHhlMjdhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjNDEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyN2MsIDB4OGM0NSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4Yjg3LCAweDk3NzEsCisgICAgMHhlMjdlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMjgwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODk0ZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyODMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YTk2LCAweGUyODIsIDB4ZTI4MSwgMHhmZmZkLCAweGUyODUsCisgICAgMHhlMjdkLCAweGZmZmQsIDB4ZTI4NiwgMHg5N2E3LCAweGZmZmQsIDB4ZTI4NywgMHhmZmZkLCAweGUyODgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWFmMiwgMHhlMjhhLCAweGZmZmQsIDB4ZTI4OSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyOGIsIDB4ZTI4YywgMHhmZmZkLCAweDk3YjMsIDB4ZTI4ZCwgMHhmZmZkLCAweGU4ZWQsCisgICAgMHg4ZmNkLCAweGUyOGUsIDB4ZTI4ZiwgMHg4Zjc2LCAweGZmZmQsIDB4OTNiNiwgMHhlMjkwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTI0NywgMHhmZmZkLCAweGZmZmQsIDB4ZTI5MSwgMHhmZmZkLCAweDkyNWIsCisgICAgMHhlMjkyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YmEzLCAweGZmZmQsCisgICAgMHg5OTVlLCAweDkyN2MsIDB4OGViMSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhYzYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTI5MywgMHhmZmZkLCAweGUyYTAsIDB4ZmZmZCwgMHhlMjk2LCAweGZmZmQsCisgICAgMHg4Yjg4LCAweGZmZmQsIDB4ZTI5NSwgMHhlMmEyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyOTQsCisgICAgMHhmZmZkLCAweDhmY2UsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMjk4LCAweGUyOTksIDB4ZmZmZCwgMHg5MzRhLCAweGZmZmQsIDB4ZmZmZCwgMHhlMjlhLCAweGZmZmQsCisgICAgMHg4YTdkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTA3OSwgMHg5NTg0LCAweGZmZmQsCisgICAgMHhlMjljLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkxZTYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMjk3LCAweGZmZmQsIDB4ZTI5YiwgMHhlMjlkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhkZjksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTJhNCwgMHg5NTRkLCAweGZmZmQsCisgICAgMHg5NGE0LCAweDkzOTksIDB4ZmZmZCwgMHg4YmQ4LCAweGUyYTMsIDB4ZTJhMSwgMHhmZmZkLCAweDk0YjMsCisgICAgMHhlMjllLCAweDkyN2QsIDB4OTM5YiwgMHhmZmZkLCAweDkzOWEsIDB4ZmZmZCwgMHg4ZGY0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTJiNiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTJhNiwgMHhmZmZkLCAweGUyYTgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyYWIsIDB4ZmZmZCwgMHhlMmFjLCAweGZmZmQsCisgICAgMHhlMmE5LCAweGUyYWEsIDB4ZmZmZCwgMHhmZmZkLCAweGUyYTcsIDB4ZTJhNSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTI5ZiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWNkLCAweDg5ZDMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMmIzLCAweGZmZmQsIDB4ZTJiMCwgMHhmZmZkLCAweGUyYjUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTJiNCwgMHhmZmZkLCAweDk0OTMsIDB4OTZhNSwgMHhmZmZkLCAweDhlNWEsCisgICAgMHhlMmFlLCAweGUyYjcsIDB4ZTJiMiwgMHhmZmZkLCAweGUyYjEsIDB4ZTJhZCwgMHhmZmZkLCAweGUyYWYsCisgICAgMHhmZmZkLCAweDhhYzcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTI1YywgMHhmZmZkLCAweGZmZmQsIDB4OTBmYiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk0YTAsIDB4ZmZmZCwgMHhmZmZkLCAweGUyYmMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NGEyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MGRmLCAweGUyYjksIDB4ZmZmZCwgMHhmZmZkLCAweDk0Y2QsIDB4ZmZmZCwgMHhlMmJkLCAweDk1ZDEsCisgICAgMHhmZmZkLCAweDkyN2EsIDB4ZmZmZCwgMHhlMmI4LCAweGUyYmEsIDB4ZmZmZCwgMHhmZmZkLCAweGUyYmIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTJiZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZWMyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzYzQsIDB4ZTJjMywgMHhlMmMyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyYmYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTg1NSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMmM4LCAweGZmZmQsIDB4ZmZmZCwgMHhlMmNjLCAweGUyYzksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMmM1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyYzYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTJjYiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyYzAsIDB4OTlkMywgMHhlMmM3LCAweGUyYzEsIDB4ZmZmZCwgMHhmZmZkLCAweGUyY2EsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyZDAsCisgICAgMHhmZmZkLCAweDhhYzgsIDB4ZmZmZCwgMHhlMmNkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyY2UsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTJjZiwgMHhlMmQyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyZDEsCisgICAgMHg5NGY0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTJkMywgMHg5N2ZhLCAweDk1ZWIsCisgICAgMHhlMmQ4LCAweGZmZmQsIDB4ZmZmZCwgMHhlMmQ1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyZDQsIDB4OTBkMCwgMHhmZmZkLCAweGUyZDcsCisgICAgMHhlMmQ5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyZDYsIDB4ZmZmZCwgMHhlMmRkLCAweGZmZmQsCisgICAgMHhlMmRhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyZGIsCisgICAgMHhlMmM0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyZGMsIDB4ZTJkZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyZGYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWM0LCAweGZmZmQsIDB4ZTJlMCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NmUwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhiY2MsIDB4OGM0OCwgMHhlMmUxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk1YjIsIDB4ZmZmZCwgMHg5MDg4LCAweGZmZmQsIDB4OTZhZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMmUyLCAweGZmZmQsIDB4OTdiMSwgMHhmZmZkLCAweGZmZmQsIDB4OTQ5NCwgMHhmZmZkLCAweDkxNjUsCisgICAgMHg5NDUzLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZjZjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg4YmUsCisgICAgMHhmZmZkLCAweGUyZTcsIDB4ZTJlNSwgMHhmZmZkLCAweGUyZTMsIDB4OGE5ZiwgMHhmZmZkLCAweDhmY2YsCisgICAgMHhlMmU4LCAweGZmZmQsIDB4ZmZmZCwgMHhlMmU2LCAweGZmZmQsIDB4ZTJlNCwgMHhlMmVjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyZWIsIDB4ZTJlYSwgMHhlMmU5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUyZWQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTJlZSwgMHg5MGI4LCAweGZmZmQsCisgICAgMHhlMmVmLCAweGZmZmQsIDB4ZTJmMSwgMHhmZmZkLCAweGZmZmQsIDB4ZTJmMCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGNkMCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MTU3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTJmMywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MzljLCAweGZmZmQsCisgICAgMHhlMmYyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyZjQsIDB4ZmZmZCwgMHg5NWIzLCAweDkxOGMsCisgICAgMHg4ZDY2LCAweGZmZmQsIDB4ZTJmNSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk3YzYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUyZjcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTJmOCwgMHhmZmZkLCAweGUyZjksIDB4ZmZmZCwgMHhlMmZhLCAweGZmZmQsCisgICAgMHg4ZTg1LCAweGZmZmQsIDB4ZTJmYiwgMHg4YzZlLCAweGZmZmQsIDB4ZmZmZCwgMHg4YjhhLCAweGZmZmQsCisgICAgMHg4YjQ5LCAweGZmZmQsIDB4ZTM0MCwgMHhmZmZkLCAweDk2ZjEsIDB4OGQ2NywgMHhlMmZjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTM0MywgMHg5NmU0LCAweGZmZmQsIDB4OTQ1YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NTUyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmODMsIDB4ZTM0MiwgMHhmZmZkLCAweDhlZDEsCisgICAgMHg4ZDY4LCAweDhlODYsIDB4OGI4OSwgMHg5NWI0LCAweGUzNDEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MTY2LCAweDk2NjEsIDB4OGRmNSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZTg3LCAweDkyZGIsIDB4ZmZmZCwgMHhlMzQ2LCAweDk3ZGQsCisgICAgMHg4ZGQ3LCAweGZmZmQsIDB4ZTM0NywgMHg5MDYxLCAweGZmZmQsIDB4ZTM0OSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhmZDAsIDB4OGRhZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUzNDgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGY0OSwgMHg4Y2JjLCAweDkxNjcsIDB4ZTM0NCwgMHhlMzRhLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMzQ1LCAweDhjNmYsIDB4ZmZmZCwgMHhlMzRkLCAweGUzNTEsCisgICAgMHg4YzhiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMzRjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMzU1LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZDY5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3OGQsIDB4ODhiYSwgMHhlMzUyLCAweGZmZmQsIDB4ZmZmZCwgMHg4YjhiLCAweGZmZmQsCisgICAgMHhlMzRmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMzUwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkzOWQsIDB4ZTM0ZSwgMHhlMzRiLCAweGZmZmQsIDB4OGE0NywgMHg5MGUyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjYTYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTM1NywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUzNTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUzNTYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMzUzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjNzAsIDB4OTFiMSwgMHhlMzU4LCAweDkxOGUsIDB4ZmZmZCwgMHhmZmZkLCAweGUzNjUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTM2MSwgMHhlMzViLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMzVmLCAweDhlZjgsIDB4ODhkYiwgMHhlMzVhLCAweGUzNjIsCisgICAgMHhlMzY2LCAweDhkNmEsIDB4OTZkNCwgMHhmZmZkLCAweDkyZDQsIDB4ZTM1YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMzY0LCAweGZmZmQsIDB4ZTM1OSwgMHg5MjVkLCAweGZmZmQsIDB4ZTM1ZSwgMHg4OGJiLCAweDk2YzgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUzNWQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGJkOSwgMHg5NGVhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkxOGQsCisgICAgMHhmZmZkLCAweDk3Y2UsIDB4OGY4ZiwgMHhmZmZkLCAweGZmZmQsIDB4ZTM4ZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMzY3LCAweGZmZmQsIDB4OTBmYywgMHhmZmZkLCAweGUzNjMsIDB4ZTM2OCwgMHhlMzZhLCAweGZmZmQsCisgICAgMHg5MmY3LCAweGUzNmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUzNjksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NWQyLCAweDhhYzksIDB4ZmZmZCwgMHhmZmZkLCAweDk2YzksIDB4ZmZmZCwgMHhmZmZkLCAweDg4ZGMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTM2YywgMHhmZmZkLCAweDk3ZmIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMzZiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5OGYsIDB4ZmZmZCwgMHhmZmZkLCAweDkzZWEsIDB4ZTM2ZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUzNzUsIDB4ZTM2ZiwgMHhlMzc2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTM3MiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NDliLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZWM4LCAweGUzNzQsCisgICAgMHhmZmZkLCAweGUzNzEsIDB4ZTM3NywgMHhlMzcwLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZjYzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NjQ0LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZjZiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUzNzMsIDB4ZTM4MCwgMHhmZmZkLCAweGZmZmQsIDB4ZTM3YiwgMHhmZmZkLCAweGUzN2UsCisgICAgMHhmZmZkLCAweGUzN2MsIDB4ZTM4MSwgMHhlMzdhLCAweGZmZmQsIDB4ZTM2MCwgMHg5MGQxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk0YzksIDB4ZmZmZCwgMHhlMzdkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMzc4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTE0MCwgMHg4YzcxLCAweGZmZmQsIDB4OGY0YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwNDQsIDB4OTE1NSwgMHhlMzg0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUzODYsIDB4ZTM4NywgMHhmZmZkLCAweGZmZmQsIDB4ZTM4MywgMHhlMzg1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMzc5LCAweGUzODIsCisgICAgMHhmZmZkLCAweGUzOGEsIDB4ZTM4OSwgMHhmZmZkLCAweGZmZmQsIDB4OTY5YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YzRhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUzODgsIDB4ZmZmZCwgMHhlMzhjLCAweGUzOGIsIDB4ZTM4ZiwgMHhmZmZkLCAweGUzOTEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGU1YiwgMHhlMzhkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMzkyLCAweGUzOTMsIDB4ZmZmZCwgMHhmZmZkLCAweGUzOTQsIDB4ZmZmZCwgMHhlMzlhLCAweDkzNWEsCisgICAgMHhlMzk2LCAweGZmZmQsIDB4ZTM5NSwgMHhlMzk3LCAweGUzOTgsIDB4ZmZmZCwgMHhlMzk5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMzliLCAweGUzOWMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YWNhLCAweGZmZmQsCisgICAgMHhlMzlkLCAweGZmZmQsIDB4ZTM5ZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTM5ZiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUzYTAsIDB4ZTNhMSwgMHhlM2EyLCAweGZmZmQsCisgICAgMHhlM2EzLCAweGUzYTQsIDB4ZmZmZCwgMHhmZmZkLCAweGUzYTYsIDB4ZTNhNSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlM2E3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUzYTgsCisgICAgMHhlM2E5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUzYWMsCisgICAgMHhlM2FhLCAweGUzYWIsIDB4OGRkZiwgMHg4YzcyLCAweGZmZmQsIDB4ZmZmZCwgMHg5Mjc1LCAweGZmZmQsCisgICAgMHg5NGIxLCAweGZmZmQsIDB4OGY5MCwgMHhmZmZkLCAweGZmZmQsIDB4OTQ2YywgMHhmZmZkLCAweDk0ZWIsCisgICAgMHhlM2FkLCAweDljZWIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTNhZSwgMHhlM2IwLCAweGZmZmQsIDB4OTc4NSwgMHhlM2FmLCAweGUzYjIsCisgICAgMHhlM2IxLCAweGZmZmQsIDB4OTc3MiwgMHhmZmZkLCAweGUzYjMsIDB4ZmZmZCwgMHg5NGZjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUzYjQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTNiNywgMHhmZmZkLCAweGZmZmQsIDB4ZTNiNiwgMHhlM2I1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlM2I4LCAweDhjNTEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MTQxLCAweDhiNjAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlM2JjLCAweGUzYjksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTNiYSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlM2JkLCAweGZmZmQsCisgICAgMHhlM2JlLCAweGUzYmIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ODk0OCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5YTUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTNjMCwgMHhlM2MxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTNjMiwgMHhmZmZkLCAweDk3ODIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGY0YiwgMHhmZmZkLCAweGUzYzQsIDB4ZTNjMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MDg5LCAweGUzYzUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlM2M2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUzYzcsIDB4ZmZmZCwgMHg4YWUzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YWNiLCAweGZmZmQsIDB4ZmZmZCwgMHhlM2M4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUzYzksIDB4ZmZmZCwgMHg5NjdjLCAweDk3ODMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NzczLCAweDk4NTYsIDB4ZmZmZCwgMHg4ZDZjLCAweGUzY2MsIDB4OGVkMiwgMHhlM2NiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlM2NkLCAweDhlYTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MWNmLCAweGZmZmQsIDB4ZTNjZSwgMHhmZmZkLCAweGZmZmQsIDB4OGQ2YiwgMHhmZmZkLCAweDk2ZDUsCisgICAgMHhlM2NmLCAweGUzZDAsIDB4ZmZmZCwgMHhmZmZkLCAweGUzZDEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUzZDIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlM2QzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZWE4LCAweGZmZmQsIDB4ZmZmZCwgMHg5NmViLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlM2Q1LCAweGZmZmQsIDB4OTI1ZSwgMHhmZmZkLCAweGUzZDQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlM2Q3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTNkNiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTNkOCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MGI5LCAweGZmZmQsCisgICAgMHhlM2Q5LCAweGZmZmQsIDB4ZTNkYSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWI3LCAweGUzZGIsCisgICAgMHhmZmZkLCAweDkxOGYsIDB4ZTNkYywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlM2RkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk3ZmMsCisgICAgMHhlM2UwLCAweGZmZmQsIDB4ZTNkZiwgMHhlM2RlLCAweDkyYWUsIDB4ZmZmZCwgMHhlM2UxLCAweDkwNDUsCisgICAgMHhmZmZkLCAweGUzZTIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTNlMywgMHg5ODU3LCAweGUzZTQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUzZTUsIDB4ZTNlNywgMHhlM2U2LCAweDk0YTMsCisgICAgMHhmZmZkLCAweDkzZjcsIDB4ZmZmZCwgMHg5ODVkLCAweDk0YTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlM2U5LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZmQxLCAweGZmZmQsCisgICAgMHg5NTQ5LCAweGZmZmQsIDB4ZTNlYSwgMHhlM2U4LCAweGZmZmQsIDB4OGFjYywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjZDIsIDB4OGU4OCwgMHhmZmZkLCAweGZmZmQsIDB4OTRlYywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjYTgsIDB4OTY2MiwgMHhmZmZkLCAweGUzZWQsIDB4ZTNlYiwgMHhmZmZkLCAweDhkNmQsCisgICAgMHhmZmZkLCAweDhkNmUsIDB4ODhlNywgMHhmZmZkLCAweDhkZTYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTQ3OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OGRkLCAweGUzZjIsIDB4ZmZmZCwgMHg5MjVmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk0NzcsIDB4ZmZmZCwgMHg5MWQ5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlM2Y0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUzZjAsIDB4ZTNmMywgMHhlM2VlLCAweGZmZmQsIDB4ZTNmMSwgMHg5NjQ1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjZDMsIDB4ZmZmZCwgMHhmZmZkLCAweDg4ZmIsIDB4ZTNlZiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUzZjYsCisgICAgMHhmZmZkLCAweGUzZjcsIDB4ZmZmZCwgMHhmZmZkLCAweDkzYjcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YmI5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU0NDUsIDB4OTQ1YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGU4OSwgMHhmZmZkLCAweGZmZmQsIDB4OGJiYSwgMHg5MGM2LCAweDk4NjUsCisgICAgMHg5NmFjLCAweGUzZjUsIDB4OTBkMiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGI3MiwgMHhlM2Y4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlM2ZhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGUzZjksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGUzZmIsCisgICAgMHhmZmZkLCAweDkyNDUsIDB4ZmZmZCwgMHg5NDVkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkyYWYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNDQyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNDQxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlM2ZjLCAweGZmZmQsIDB4ZmZmZCwgMHg5MDc0LCAweGZmZmQsCisgICAgMHg5NTg1LCAweGU0NDQsIDB4ZmZmZCwgMHhlNDQzLCAweDhkNmYsIDB4OTg3MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU0NTQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTQ0OCwgMHhlNDQ5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZWVlLCAweGZmZmQsIDB4ZmZmZCwgMHhlNDQ3LCAweGZmZmQsCisgICAgMHg4ZDk4LCAweGU0NDYsIDB4ZmZmZCwgMHhmZmZkLCAweGU0NGEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MmIwLCAweDk1YTAsIDB4OTE0MiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkxZGEsCisgICAgMHhlNDRlLCAweGZmZmQsIDB4ZTQ0ZiwgMHhlNDRiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNDRjLCAweGZmZmQsIDB4ZTQ0ZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhkNzAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNDU1LCAweGZmZmQsIDB4ZTQ1MSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTU4NiwgMHhmZmZkLCAweDk2OGMsIDB4OTU0NywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNDUwLCAweGZmZmQsIDB4ZmZmZCwgMHhlNDUzLCAweGU0NTIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NjYzLCAweGU0NTYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNDU3LCAweGZmZmQsIDB4ZmZmZCwgMHg5MTU2LCAweGZmZmQsIDB4ZTQ1OCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNDVhLCAweGZmZmQsIDB4ZTQ1ZSwgMHhmZmZkLCAweGZmZmQsIDB4ZTQ1YiwgMHhlNDU5LCAweDk0NWUsCisgICAgMHhlNDVjLCAweGZmZmQsIDB4ZTQ1ZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWIwLCAweGZmZmQsCisgICAgMHhlNDY0LCAweGU0NWYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTQ2MCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU0NjEsIDB4ZmZmZCwgMHg5MTlmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNDYzLCAweGU0NjIsIDB4ZTQ2NSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU0NjYsCisgICAgMHhlNDY3LCAweGZmZmQsIDB4ZmZmZCwgMHg5MDYyLCAweGZmZmQsIDB4ODllNywgMHhmZmZkLCAweGU0NjgsCisgICAgMHg5N2Q1LCAweGZmZmQsIDB4OGVhOSwgMHhmZmZkLCAweGZmZmQsIDB4OGY0YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZThhLCAweDkyNzYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTQ2OSwgMHhlNDZhLCAweDg5NTAsIDB4ZmZmZCwgMHhlNDZiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU0NmMsIDB4ZTQ2ZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTQ2ZSwgMHhmZmZkLCAweGU0NmYsCisgICAgMHg4YmJiLCAweDlkYTgsIDB4ZTQ3MCwgMHhmZmZkLCAweDkwZTMsIDB4ZTQ3MSwgMHg4ZWM5LCAweGZmZmQsCisgICAgMHhlNDcyLCAweGZmZmQsIDB4OThhZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNDczLCAweDk1ZGMsCisgICAgMHg4YWRhLCAweGZmZmQsIDB4ZmZmZCwgMHg5MTQzLCAweDhmNzcsIDB4ZmZmZCwgMHg5NTkxLCAweDhmNGQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU0NzQsIDB4OGQ3MSwgMHhlNDc1LCAweDk0Y2EsIDB4ZmZmZCwgMHhlNDg0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNDc3LCAweGZmZmQsIDB4OTFjNywgMHg5NDk1LCAweDhjYmQsCisgICAgMHhlNDc2LCAweDkxNDQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNDc4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkyZjgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNDdhLCAweGU0NzksIDB4ZTQ3YywgMHhmZmZkLCAweGZmZmQsIDB4ZTQ3YiwgMHhmZmZkLCAweGU0N2QsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTQ4MCwgMHhmZmZkLCAweGU0N2UsIDB4ZmZmZCwgMHg4YWNkLCAweGZmZmQsCisgICAgMHhlNDgxLCAweGZmZmQsIDB4ZTQ4MiwgMHhlNDgzLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZGFmLCAweDk3YzcsCisgICAgMHhmZmZkLCAweGU0ODUsIDB4OTA0NiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OTkwLCAweGU0ODYsCisgICAgMHhlNDg3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNDg4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OGYwLCAweGZmZmQsIDB4ZTQ4OSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTQ4YSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk1ODcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGVjNSwgMHhmZmZkLCAweGU0OGMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGE0OCwgMHg4OGIwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNDhiLCAweGU0OGUsIDB4OTQ2ZCwgMHhmZmZkLCAweDkwNjMsCisgICAgMHhmZmZkLCAweDg5ZDQsIDB4ZmZmZCwgMHg5NjQ2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YzdjLCAweDhiZGEsIDB4ZmZmZCwgMHhlNDhkLCAweGZmZmQsIDB4ODllOCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGFhMSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5OTEsIDB4ZTQ5MiwgMHg5N2U4LCAweDkxZGIsIDB4ZmZmZCwgMHhmZmZkLCAweDk1NjMsCisgICAgMHhmZmZkLCAweGU0OWUsIDB4ZmZmZCwgMHg4OWQ1LCAweGU0OWMsIDB4ZmZmZCwgMHhlNDlhLCAweGU0OTEsCisgICAgMHhmZmZkLCAweGU0OGYsIDB4ZmZmZCwgMHhlNDkwLCAweGZmZmQsIDB4OGVlMSwgMHg4YmVhLCAweDkyOTcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5M2NmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg5NzAsIDB4ZmZmZCwgMHhlNDk0LCAweGU0OTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU0OTksIDB4ZTQ5NSwgMHhlNDk4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTZjZSwgMHhlNDk3LCAweDg5ZDYsIDB4OGE5ZCwgMHhlNDliLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU0OWQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YzczLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGExLCAweGU0YWEsCisgICAgMHhlNGFiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg4YTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGIyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4OGVmLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGE5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU0YTgsCisgICAgMHhmZmZkLCAweGU0YTMsIDB4ZTRhMiwgMHhmZmZkLCAweGU0YTAsIDB4ZTQ5ZiwgMHg5MjgzLCAweGZmZmQsCisgICAgMHg5MWY5LCAweGU0YTUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNGE0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTRhNywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkxOTAsIDB4OGM3NCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5NjAsCisgICAgMHhlNGE2LCAweGZmZmQsIDB4OGQ3MiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MTkxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGI4LCAweGZmZmQsIDB4ZTRiOSwgMHhmZmZkLCAweDg5ZDcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWFjLCAweGU0YjYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTRhYywgMHhmZmZkLCAweGU0YjQsCisgICAgMHhmZmZkLCAweGU0YmIsIDB4ZTRiNSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGIzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNDk2LCAweGZmZmQsIDB4ZmZmZCwgMHhlNGIxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTRhZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YWNlLCAweGU0YWYsCisgICAgMHhlNGJhLCAweGZmZmQsIDB4ZTRiMCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNGJjLCAweGZmZmQsIDB4ZTRhZSwgMHg5NDljLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3ODksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTRiNywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTRjZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU0YzUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTA5YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGI2NSwgMHhmZmZkLCAweDhiZGIsIDB4ZmZmZCwgMHhlNGMwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWQ5LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZmQyLCAweGZmZmQsCisgICAgMHhlNGMzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhkZDgsIDB4ZmZmZCwgMHhmZmZkLCAweDkzNzAsCisgICAgMHhlNGM4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk1ZWMsIDB4ZmZmZCwgMHhlNGJmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5ZDgsCisgICAgMHg4Y2Q0LCAweDk1NDgsIDB4ZTRjOSwgMHhmZmZkLCAweGU0YmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU0YzYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGQwLCAweGZmZmQsIDB4ZTRjMSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGMyLCAweDkzYjgsIDB4ZmZmZCwgMHhmZmZkLCAweGU0YzcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGM0LCAweDk2NDcsIDB4ZTRjYSwgMHg4OGRlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGJlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNGNjLCAweGZmZmQsIDB4ZTRjYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk0OGIsIDB4ZTRkMiwgMHhmZmZkLCAweGU0ZGQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhhOWUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTRlMCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNGNlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU0ZDMsIDB4OTc4ZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGRjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3NzQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5N2E4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkyOTgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YThiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk1OTIsIDB4ZTRlMiwgMHg5MzlmLCAweGZmZmQsIDB4ZmZmZCwgMHg4OGFmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU0ZGIsIDB4ZmZmZCwgMHhlNGQ3LCAweDkxOTIsIDB4ZTRkMSwgMHhlNGQ5LCAweGU0ZGUsCisgICAgMHhmZmZkLCAweDk0NGIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ODhhOCwgMHhmZmZkLCAweGU0ZDYsCisgICAgMHhmZmZkLCAweGU0ZGYsIDB4OTU5OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTRkYSwgMHhmZmZkLCAweGU0ZDUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZmQzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZjRlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhlYWEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk2ZDYsIDB4ZmZmZCwgMHhmZmZkLCAweDk1NjYsIDB4ZmZmZCwgMHhmZmZkLCAweGU0ZTUsCisgICAgMHhmZmZkLCAweGU0ZWUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTRkOCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGE5NywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZmY2LCAweGU0ZTMsIDB4ZmZmZCwgMHhlNGU4LCAweDkxOTMsIDB4ZmZmZCwgMHhmZmZkLCAweGU0ZTQsCisgICAgMHhmZmZkLCAweGU0ZWIsIDB4ZmZmZCwgMHhmZmZkLCAweDkyN2UsIDB4ZmZmZCwgMHhlNGVjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk3NzUsIDB4ZTRlMSwgMHg4YTU3LCAweGZmZmQsIDB4ZTRlNywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNGVhLCAweDk2YWEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGVkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU0ZTYsIDB4ZTRlOSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk2NDgsIDB4ZmZmZCwgMHg5ODQwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU0ZjEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU0ZjgsIDB4ZmZmZCwgMHhmZmZkLCAweGU0ZjAsCisgICAgMHg4ZWMxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGNmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk1Y2MsIDB4ZmZmZCwgMHg5NmEwLCAweGU0ZjcsIDB4ZTRmNiwgMHhmZmZkLCAweGU0ZjIsCisgICAgMHhlNGYzLCAweGZmZmQsIDB4ODk1NSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU0ZjUsCisgICAgMHhmZmZkLCAweGU0ZWYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MmQzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU0ZjQsIDB4ODhmYywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTFhMCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTVjMSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNGY5LCAweGU1NDAsIDB4ZmZmZCwgMHg5NGQ3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNGZjLCAweDhmZDQsIDB4OGVjNywgMHhlNTQyLCAweGZmZmQsIDB4ZmZmZCwgMHg4YmJjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTU0MywgMHhmZmZkLCAweDk1OTksCisgICAgMHhlNGZiLCAweGZmZmQsIDB4ZTRkNCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNGZhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ODZlLCAweDkzYTAsIDB4OTU5MywgMHhmZmZkLCAweGZmZmQsIDB4ZTU0YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1NTAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNTUxLCAweGZmZmQsCisgICAgMHhlNTQ0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk0OTYsIDB4ZmZmZCwgMHhmZmZkLCAweGU1NGUsCisgICAgMHhlNTQ2LCAweGZmZmQsIDB4ZTU0OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNTUyLCAweGU1NDcsIDB4ZmZmZCwgMHhmZmZkLCAweGU1NGIsIDB4ZmZmZCwgMHhmZmZkLCAweDg5OTIsCisgICAgMHhmZmZkLCAweDkzZTMsIDB4ZmZmZCwgMHhlNTRjLCAweGU1NGYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1NDUsIDB4ZmZmZCwgMHg5MTQ1LCAweGZmZmQsCisgICAgMHhlNTQ5LCAweDhlNDYsIDB4OTA2NCwgMHg4YzRmLCAweDk2ZjIsIDB4ZmZmZCwgMHg5NmY3LCAweDhmOTIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU1NTYsIDB4ZTU1NCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk4NmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU1NTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTc5NSwgMHhmZmZkLCAweGU1NTUsCisgICAgMHhlNTU3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTU1OCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1NWIsIDB4ZTU1OSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzYTEsIDB4ZTU1YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk0Y2IsIDB4ZTU0ZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmOTMsCisgICAgMHhmZmZkLCAweGU1NWMsIDB4ZTU2MSwgMHg5MTk0LCAweGZmZmQsIDB4ZmZmZCwgMHhlNTYwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTU0MSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNTYyLCAweDkxNjgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTU1ZCwgMHhlNTVmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNTVlLCAweGZmZmQsIDB4ZmZmZCwgMHg5ZjUwLCAweDlmNDEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTU2NCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTU2MywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTc5NiwgMHhmZmZkLCAweGUxYmEsCisgICAgMHhlNTY1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1NjYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTU2NywgMHg4Y2Q1LCAweGZmZmQsCisgICAgMHg4YjczLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1NjksIDB4OTk3YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGI5NSwgMHhmZmZkLCAweDk3YjgsIDB4ZmZmZCwgMHg4YmYxLCAweGU1NmEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1NmIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MjhlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU1NmMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkzZjgsIDB4ZmZmZCwgMHg4OGI4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODllMSwgMHhlNTcxLCAweGU1NzIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNTZkLCAweGZmZmQsIDB4OGU1YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNTZlLCAweDk0NjEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU1NmYsIDB4ZTU3MCwgMHhlNTdhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1NzQsCisgICAgMHhlNTc3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNTczLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1NzUsIDB4ZmZmZCwgMHhlNTc2LCAweDhlZDYsCisgICAgMHhmZmZkLCAweGU1NzgsIDB4ZmZmZCwgMHg5MjYwLCAweGZmZmQsIDB4OGM3NSwgMHg4YTYxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1N2IsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhhNWUsIDB4ZmZmZCwgMHhlNTgxLCAweGZmZmQsIDB4ZmZmZCwgMHhlNTdjLCAweGU1ODAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk0YjgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU1N2QsIDB4ZmZmZCwgMHhmZmZkLCAweGU1N2UsIDB4OTU2NywgMHg5NGQ4LCAweGU1ODIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MWZiLCAweGU1OGMsIDB4ZmZmZCwgMHhlNTg4LCAweGZmZmQsIDB4ZmZmZCwgMHg4OWU5LCAweGZmZmQsCisgICAgMHhlNTg2LCAweGZmZmQsIDB4OTY0OSwgMHhlNTg3LCAweGZmZmQsIDB4ZmZmZCwgMHhlNTg0LCAweGZmZmQsCisgICAgMHhlNTg1LCAweGU1OGEsIDB4ZTU4ZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTU4YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU1ODksIDB4ZTU4MywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Mjc3LCAweGZmZmQsIDB4ZTU5NCwgMHhmZmZkLCAweDk2YTgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTU5MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU1OTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1OGUsIDB4ZmZmZCwgMHhmZmZkLCAweGU1OTAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNTkxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1OGYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkwZTQsIDB4ZmZmZCwgMHg5ODU4LCAweGU1OTgsIDB4ZmZmZCwgMHhlNTk5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNTlmLCAweGZmZmQsIDB4OTA0OSwgMHhmZmZkLCAweGU1OWIsCisgICAgMHhmZmZkLCAweGU1OWUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1OTYsCisgICAgMHhlNTk1LCAweGZmZmQsIDB4ZmZmZCwgMHhlNWEwLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWRhLCAweGZmZmQsCisgICAgMHhlNTljLCAweGZmZmQsIDB4ZTVhMSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNTlkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1OWEsIDB4ZmZmZCwgMHg5MmIxLCAweGZmZmQsCisgICAgMHhlNTk3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk0ODgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTVhNSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTc1YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1YTQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTVhMywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNWFjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1YTYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNWFlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTc4NiwgMHhlNWIxLCAweGZmZmQsIDB4ZTVhOCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNWE5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1YWQsIDB4ZmZmZCwgMHhlNWIwLCAweGU1YWYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNWE3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNWFhLCAweGZmZmQsIDB4ZTViYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNWI0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1YjIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTViMywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNWI4LCAweGU1YjksCisgICAgMHhmZmZkLCAweDhhNDksIDB4ZmZmZCwgMHg4YjYxLCAweGZmZmQsIDB4ZmZmZCwgMHhlNWI3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTVhMiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTViNiwgMHhlNWJhLCAweGU1YjUsCisgICAgMHhmZmZkLCAweGU1YmMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTViZSwgMHhlNWJkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU1YzAsIDB4ZTViZiwgMHhlNTc5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1YzQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU1YzEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNWMyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU1YzMsIDB4ZmZmZCwgMHhlNWM1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YzhjLCAweGZmZmQsIDB4ZTVjNywgMHhmZmZkLCAweGU1YzYsIDB4ZmZmZCwgMHg4ZjRmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhkNzMsIDB4OWZhNSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTVjOCwgMHg4ZjcwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhNTgsCisgICAgMHhmZmZkLCAweGU1YzksIDB4ZmZmZCwgMHg4OTcxLCAweGZmZmQsIDB4OGZkNSwgMHhlNWNhLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhkNzQsIDB4ZTVjYiwgMHg4OGRmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NTVjLCAweGZmZmQsIDB4ZmZmZCwgMHhlNWNjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MDhhLCAweGZmZmQsIDB4ZTVkMywgMHhmZmZkLCAweGZmZmQsIDB4ZTVkMCwgMHhmZmZkLCAweDkyOGYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTVkMSwgMHhlNWNlLCAweDhiZGMsCisgICAgMHhmZmZkLCAweGU1Y2QsIDB4ZTVkNCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YzU1LCAweGZmZmQsIDB4ZmZmZCwgMHg5MWRjLCAweGZmZmQsIDB4ZTVkYSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTVkNiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MWIzLCAweGU1ZDUsCisgICAgMHhmZmZkLCAweGU1ZDgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNWNmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTVkOSwgMHhmZmZkLCAweGU1ZGIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NGVkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNWQ3LCAweGZmZmQsCisgICAgMHhlNWRjLCAweGU1ZGUsIDB4ZmZmZCwgMHhmZmZkLCAweDhjZDEsIDB4ZTVkMiwgMHhmZmZkLCAweDg4YmYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1ZGQsCisgICAgMHhmZmZkLCAweDhkZDksIDB4OTdmNCwgMHhlNWRmLCAweGU1ZTAsIDB4OTE5NSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk3YTAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1ZTEsIDB4OTc1NCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNWUyLCAweGU1ZTMsIDB4ZmZmZCwgMHhmZmZkLCAweDk1ZTIsIDB4ZTVlNCwgMHhmZmZkLCAweDhkYmUsCisgICAgMHhmZmZkLCAweDk3YTEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNWU5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTVlYSwgMHg4ZmQ2LCAweGU1ZTgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5Nzg3LCAweGU1ZTUsIDB4ZmZmZCwgMHhmZmZkLCAweGU1ZTcsIDB4OTBiYiwgMHg5MDllLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTVlNiwgMHhmZmZkLCAweGU1ZWIsIDB4ZmZmZCwgMHhmZmZkLCAweDk1YTEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTVlZCwgMHhmZmZkLCAweGU1ZWMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YThjLCAweGZmZmQsIDB4OTY0YSwgMHhlNWVlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTVmYSwgMHhlNWYwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTVmMSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTVmMiwgMHhlNWYzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNWY3LCAweGZmZmQsCisgICAgMHhlNWY4LCAweGZmZmQsIDB4ZmZmZCwgMHhlNWY2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU1ZjQsIDB4ZmZmZCwgMHhlNWVmLCAweGU1ZjUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU1ZjksIDB4ZThiNSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWE2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNWZjLCAweDhiZGQsCisgICAgMHhlNWZiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU2NDEsIDB4ZmZmZCwgMHhlNjQwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTY0MywgMHhmZmZkLCAweGZmZmQsIDB4ZTY0MiwgMHhmZmZkLCAweGU2NDQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGY1MCwgMHhmZmZkLCAweGU2NDUsIDB4ZmZmZCwgMHhmZmZkLCAweGU2NDYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjQ3LCAweDkwYmMsCisgICAgMHhmZmZkLCAweDk3NzYsIDB4ZmZmZCwgMHhlNjQ4LCAweGZmZmQsIDB4ZmZmZCwgMHg5NWEyLCAweDk0NjUsCisgICAgMHhlNjQ5LCAweGZmZmQsIDB4ZTY0YSwgMHg4Y2E5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhiNGIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjRiLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZThiLCAweDk0NjAsCisgICAgMHhlNjRjLCAweGZmZmQsIDB4OGE2ZiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU2NGQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjRmLCAweDk3OTcsCisgICAgMHhmZmZkLCAweGU2NGUsIDB4OTA2NSwgMHhmZmZkLCAweGU2NTAsIDB4ZmZmZCwgMHhmZmZkLCAweGU2NTEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTY1MiwgMHg4YWNmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTY1MywgMHhmZmZkLCAweGZmZmQsIDB4ZTY1NCwgMHhmZmZkLCAweGU2NTUsCisgICAgMHhlNjU2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGE3MCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTY1NywgMHhmZmZkLCAweGU2NTgsIDB4ZTY1OSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWYwLCAweGZmZmQsIDB4ZmZmZCwgMHg5MDQ3LCAweGU2NWEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU2NWIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNjVjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4Y2JlLCAweGZmZmQsIDB4OTJmOSwgMHhlNjVkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4Yzc2LCAweGZmZmQsIDB4OTA3NSwgMHhmZmZkLCAweGU2NjAsIDB4ZmZmZCwgMHg5M2EyLCAweGZmZmQsCisgICAgMHhlNjVmLCAweGZmZmQsIDB4ZmZmZCwgMHg4YzUwLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjVlLCAweDkxZjUsCisgICAgMHg4YjRjLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjYxLCAweGZmZmQsIDB4ZTY2MiwgMHhmZmZkLCAweDhmZDcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YzhkLCAweGZmZmQsIDB4ZTY2MywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTY0YiwgMHhmZmZkLCAweGZmZmQsIDB4OTBkZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhiOTYsIDB4ZmZmZCwgMHg5NmYzLCAweDkxNjksIDB4ZmZmZCwgMHhlNjY0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTA2NiwgMHg5MjkwLCAweDhmZDgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU2NjUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjY4LCAweGZmZmQsCisgICAgMHhlNjY5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZGJjLCAweDkxYzAsIDB4ZTY2NywgMHhmZmZkLCAweDhmZDksIDB4OTU1ZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjY2LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZThjLCAweGZmZmQsCisgICAgMHg4OTcyLCAweGZmZmQsIDB4ZTY2ZCwgMHg4Yzc3LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZThlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhlOGQsIDB4ZmZmZCwgMHg5ODZjLCAweGU2NmMsIDB4ZTY2YiwgMHg5MTQ2LCAweGZmZmQsCisgICAgMHg4YjZjLCAweDk4NjIsIDB4OGE1OSwgMHg4ZmRhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU2NmEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTY2ZiwgMHhmZmZkLCAweGU2NzAsIDB4ZTY2ZSwgMHhmZmZkLCAweDhjZDYsCisgICAgMHhmZmZkLCAweDk3NWYsIDB4ZmZmZCwgMHhmZmZkLCAweDhlOGYsIDB4OTQ0NiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU2NzMsIDB4ZmZmZCwgMHg5MGJlLCAweGZmZmQsIDB4OTI2MSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NzU1LCAweGZmZmQsIDB4ZTY3NiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4Y2VhLCAweGZmZmQsCisgICAgMHg5MGJkLCAweGU2NzIsIDB4ZmZmZCwgMHhlNjc3LCAweDhjZWIsIDB4ZTY3NCwgMHhlNjc1LCAweGZmZmQsCisgICAgMHhlNjcxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwZTAsIDB4OTNjNywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MjRlLCAweGZmZmQsIDB4ODlkYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk0ZWUsIDB4ZmZmZCwgMHhmZmZkLCAweDhiNjIsIDB4ZmZmZCwgMHhmZmZkLCAweDkyYjIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTY3YSwgMHhmZmZkLCAweGU2NzgsIDB4ZmZmZCwgMHhmZmZkLCAweDkyNmIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MGJmLCAweDhhZDAsIDB4ZTY3OSwgMHhmZmZkLCAweDkwN2EsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTdjOCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ODVmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTY3YiwgMHhlNjg3LCAweDkyYjMsIDB4ZmZmZCwgMHhlNjg2LCAweGZmZmQsCisgICAgMHhlNjgzLCAweGU2OGIsIDB4ZTY4NCwgMHhmZmZkLCAweGU2ODAsIDB4ZmZmZCwgMHg5MmZhLCAweGU2N2UsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjdjLCAweGZmZmQsIDB4OTc0MCwgMHg4ZTkwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU2ODEsIDB4ZmZmZCwgMHhlNjdkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU2ODUsCisgICAgMHg4Zjk0LCAweGZmZmQsIDB4OGNiZiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MWY4LCAweGZmZmQsCisgICAgMHg5NjY0LCAweDg5NzksIDB4ODhlMCwgMHhmZmZkLCAweDkzYTMsIDB4ZmZmZCwgMHhmZmZkLCAweGU2ODksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU2ODgsIDB4ZmZmZCwgMHg5M2U0LCAweGZmZmQsCisgICAgMHhlNjhkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU2ODIsIDB4ZmZmZCwgMHhlNjhjLCAweGU2OGUsCisgICAgMHhmZmZkLCAweDhjYWEsIDB4ZTY4YSwgMHg4ZDc1LCAweGZmZmQsIDB4OGVkMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNjhmLCAweDk3NzcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjkyLCAweGZmZmQsCisgICAgMHhlNjk1LCAweGZmZmQsIDB4ZmZmZCwgMHhlNjkzLCAweDk1NTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjkwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhiZGUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjk0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU2OTYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU2OWEsIDB4ZmZmZCwgMHhmZmZkLCAweGU2OTcsIDB4ZmZmZCwgMHhlNjk5LCAweGU2OTgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjliLCAweGZmZmQsCisgICAgMHg4ZWFmLCAweGZmZmQsIDB4ZTY5ZCwgMHhlNjljLCAweDk1ODgsIDB4ZmZmZCwgMHhmZmZkLCAweGU2OWYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4Yzc4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjllLCAweGU2YTAsIDB4ZmZmZCwgMHhmZmZkLCAweGU2YTEsCisgICAgMHg4YjYzLCAweGUzYmYsIDB4OGZmNywgMHhmZmZkLCAweGU2YTIsIDB4ZmZmZCwgMHhmZmZkLCAweDhjZWMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTZhMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNmE0LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZTVkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OWRjYywgMHhmZmZkLCAweGU2YTUsIDB4ZmZmZCwgMHhlNmE2LCAweGZmZmQsCisgICAgMHg4ZjUxLCAweGZmZmQsIDB4ZTZhNywgMHhlNmE4LCAweGZmZmQsIDB4ZmZmZCwgMHhlNmE5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU2YWEsIDB4ZTZhYiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkyNGEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTZhYywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU2YWUsCisgICAgMHhmZmZkLCAweGU2YWQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5M2E0LCAweGZmZmQsCisgICAgMHhlNmFmLCAweGZmZmQsIDB4OTY0YywgMHhmZmZkLCAweGU2YjAsIDB4ZmZmZCwgMHhlNmIxLCAweGZmZmQsCisgICAgMHhlNmIyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTZiMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTNkOCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhmZGIsIDB4ZTZiNCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGQ4YiwgMHg5OGFjLCAweGU2YjUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNmI2LCAweDk1NWUsIDB4ZTZiNywgMHhmZmZkLCAweGU2YmYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTZiOCwgMHhmZmZkLCAweGZmZmQsIDB4ZTZiYSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU2YjksIDB4ZTZiYiwgMHhmZmZkLCAweDk2NjUsIDB4ZTZiYywgMHhlNmJkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU2YmUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNmMwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGE0YywgMHg5MmU1LCAweGZmZmQsCisgICAgMHg5NTg5LCAweDhkZTAsIDB4OGQ3NiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1NmUsCisgICAgMHg4OWRkLCAweDk0Y2MsIDB4ZTZjMywgMHg4YWQxLCAweDkwZDMsIDB4ZTZjMiwgMHhlNmM3LCAweDkyOTksCisgICAgMHg5NmUxLCAweGZmZmQsIDB4ZTZjNSwgMHhlNmM2LCAweDhiNGQsIDB4ZmZmZCwgMHhlNmM4LCAweDk0ODMsCisgICAgMHg5MWRkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NGVmLCAweDkzNWMsIDB4ZTZjNCwgMHhmZmZkLCAweDk2NjYsCisgICAgMHg4OWVhLCAweGU2Y2EsIDB4OTg0NywgMHg5MmMwLCAweDk4NjQsIDB4ZmZmZCwgMHhmZmZkLCAweDhlOTEsCisgICAgMHhlNmM5LCAweGZmZmQsIDB4OTFhZiwgMHhmZmZkLCAweGZmZmQsIDB4ZTZkYSwgMHg5MTQ3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkzZjYsIDB4ZmZmZCwgMHg5NTZmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTZjZCwgMHg4ZTVlLCAweDhlOTIsIDB4ZmZmZCwgMHg4ZmRjLCAweGZmZmQsCisgICAgMHg5NDg1LCAweGZmZmQsIDB4OGNhYiwgMHhlNmNjLCAweGU2Y2IsIDB4ZmZmZCwgMHg5NThhLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGViZiwgMHhmZmZkLCAweGZmZmQsIDB4OTM3MSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTZjZiwgMHhlNmQwLCAweDhkNzcsIDB4ZTZjZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU2ZDEsIDB4ZTZkMiwgMHhmZmZkLCAweGU2ZDQsCisgICAgMHg5MWExLCAweGZmZmQsIDB4ZTZkMywgMHg4YWU0LCAweGZmZmQsIDB4ZTZkNiwgMHhmZmZkLCAweGU2ZDUsCisgICAgMHhlNmQ3LCAweGZmZmQsIDB4ZmZmZCwgMHhlNmQ5LCAweGU2ZGIsIDB4ZmZmZCwgMHhlNmRjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwZDQsIDB4ZmZmZCwgMHg4ZWNkLCAweGU2ZGQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YTcxLCAweGZmZmQsIDB4ZTZkZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MTk2LCAweGU2ZGYsIDB4ZmZmZCwgMHhlNmUwLCAweDk1OGIsIDB4ZmZmZCwgMHhmZmZkLCAweDhiNGUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU2ZTEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTJiNCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODk3YSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU2ZTIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZWVmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MDk2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MWFiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTZlNSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNmU0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTZlMywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNmViLCAweGU2ZTksIDB4ZmZmZCwgMHhmZmZkLCAweGU2ZTYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNmU4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTZlNywgMHhlNmVhLCAweGZmZmQsIDB4OGI5NywgMHhmZmZkLCAweGU2ZWUsCisgICAgMHhmZmZkLCAweDkwZDUsIDB4ZmZmZCwgMHhlNmVmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4Y2Q3LCAweGZmZmQsIDB4ZTZlYywgMHhlNmVkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk4NDgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MmI1LCAweGZmZmQsIDB4OTE0OCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU2ZjAsIDB4ZmZmZCwgMHhmZmZkLCAweGU2ZjMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNmYxLCAweGU2ZjIsIDB4OTc3OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzYTUsCisgICAgMHhlNmY2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTZmNCwgMHhlNmY1LCAweGU2ZjcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTc0OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNmZhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU2ZmIsIDB4ZTZmOSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTZmOCwgMHhmZmZkLCAweDkyZmIsIDB4ZmZmZCwgMHhmZmZkLCAweGU3NDAsCisgICAgMHhlNzQ0LCAweGU3NDEsIDB4ZTZmYywgMHhmZmZkLCAweGU3NDIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlNzQzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTc0YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU3NDUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwZDYsCisgICAgMHhlNzQ3LCAweGZmZmQsIDB4ZmZmZCwgMHhlNzQ5LCAweGU3NDYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTc0YywgMHhmZmZkLCAweDhmNTIsIDB4ZmZmZCwgMHhlNzRiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3NGQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU3NGUsIDB4ZmZmZCwgMHhmZmZkLCAweGU3NTEsIDB4ZTc1MCwgMHhmZmZkLCAweGU3NGYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTc1MywgMHhlNzUyLCAweGZmZmQsIDB4OTZmNCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU3NTUsIDB4ZmZmZCwgMHhlNzU0LCAweGU3NTYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU3NTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU3NTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTc1OCwgMHg5MDY3LCAweGU3NWEsIDB4ZmZmZCwgMHhmZmZkLCAweDhiZWIsCisgICAgMHhlNzViLCAweGU3NWQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNzVlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTc1ZiwgMHhlNzVjLCAweGZmZmQsCisgICAgMHhlNzYwLCAweGZmZmQsIDB4OGVkNCwgMHhlNzYxLCAweDhiNGYsIDB4OGM1MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGNhYywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNzYyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzZWUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTM1ZCwgMHhlNzYzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNzY2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZWIyLCAweGZmZmQsIDB4ZmZmZCwgMHhlNzY1LCAweGU3NjQsIDB4OGM3OSwgMHhlNzY3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YTcyLCAweGZmZmQsIDB4ZTc2OSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhkZGEsIDB4ZTc2OCwgMHhmZmZkLCAweGU3NzEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTc2YiwgMHhlNzZkLCAweDk1ZTMsIDB4ZTc2YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU3NmMsIDB4ZmZmZCwgMHhlNzcwLCAweGU3NmUsIDB4OGI1MCwgMHhmZmZkLCAweGU3NmYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNzcyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk0NzksIDB4OTdkNiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmNTMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNzczLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NzQxLCAweGU3NzUsIDB4ZmZmZCwgMHhlNzc0LCAweGZmZmQsIDB4ZmZmZCwgMHhlNzc4LCAweDk3NjAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTc3NywgMHhmZmZkLCAweDhhOGQsIDB4ZTc3NiwgMHhlNzdiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU3N2EsIDB4ZmZmZCwgMHhmZmZkLCAweGU3NzksIDB4OTM1MSwgMHhlNzdjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3N2QsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3N2UsIDB4ZmZmZCwgMHhmZmZkLCAweDhkOGMsCisgICAgMHhmZmZkLCAweDhjNDQsIDB4ZTc4MCwgMHhlNzgxLCAweGU3ODIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MDY4LCAweGU3ODMsIDB4ZmZmZCwgMHg4ZWFiLCAweGU3ODQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNzg1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk5OWYsCisgICAgMHg5OTllLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTc4NiwgMHhlMzkwLCAweGU3ODcsCisgICAgMHg5MjQzLCAweDkwNGEsIDB4OTQ1ZiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3ODgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTVkMywgMHg5MmQyLCAweDhkOWUsIDB4ZmZmZCwgMHhmZmZkLCAweDkyNDgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODk0OSwgMHhmZmZkLCAweDk2OTgsIDB4OTA3NiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YzdkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhiZGYsIDB4ZmZmZCwgMHhmZmZkLCAweDk1ZDQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTc4OSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTc4YiwgMHhmZmZkLCAweGZmZmQsIDB4ZTc4YSwgMHg4OWRlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkzZjQsIDB4ZTc4YywgMHg5NDk3LCAweGZmZmQsIDB4OTM1MiwgMHhmZmZkLCAweGU3OGQsCisgICAgMHg4ZjcxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3OGYsIDB4ZmZmZCwgMHhmZmZkLCAweDk2YzAsCisgICAgMHhlNzllLCAweGU3OTEsIDB4ZTc5MiwgMHhmZmZkLCAweGZmZmQsIDB4OTJjNywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MWRlLCAweDkxOTcsIDB4ZmZmZCwgMHg5M2E2LCAweGZmZmQsIDB4ZTc5MCwgMHg4Yjc0LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlNzk5LCAweGZmZmQsIDB4ZTc5NiwgMHhlN2EzLCAweDkzYTcsCisgICAgMHg5MjgwLCAweGU3OTMsIDB4ZmZmZCwgMHg5MmZjLCAweDkzNzIsIDB4ZTc5NCwgMHhlNzk4LCAweDkwODAsCisgICAgMHhmZmZkLCAweDk0ODcsIDB4OTJjYSwgMHhmZmZkLCAweGZmZmQsIDB4OTBjMCwgMHhlNzk3LCAweDkxYWMsCisgICAgMHg5MWEyLCAweGU3OTUsIDB4ODhhNywgMHg5ODQxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3OWEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MWRmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhmNTQsIDB4OTA2OSwgMHhmZmZkLCAweGZmZmQsIDB4ZTc5YywgMHhlNzliLCAweGZmZmQsCisgICAgMHg4OGVkLCAweGU3OWQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1NGUsIDB4ZmZmZCwgMHhlN2E1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkzZDksIDB4OTA4YiwgMHhmZmZkLCAweGZmZmQsIDB4OTI3OCwgMHhmZmZkLCAweDhiZjYsCisgICAgMHhmZmZkLCAweGU3YTQsIDB4OTc1NiwgMHg4OTVlLCAweGZmZmQsIDB4OTVkNSwgMHg4OWRmLCAweGU3OWYsCisgICAgMHhlN2EwLCAweGU3YTEsIDB4ZTdhMiwgMHg5M2I5LCAweDkyNDIsIDB4ODhlMSwgMHhlN2E2LCAweGZmZmQsCisgICAgMHhlN2E3LCAweGVhYTEsIDB4ZmZmZCwgMHhmZmZkLCAweDkxYmIsIDB4ZmZmZCwgMHhlN2E4LCAweGZmZmQsCisgICAgMHg4OTkzLCAweDkxNmIsIDB4ZmZmZCwgMHg4Y2FkLCAweGZmZmQsIDB4OTc3OSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlN2E5LCAweDkzNGIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTE5OCwgMHg4ZWQ1LCAweGU3YWEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTdhZCwgMHhmZmZkLCAweGZmZmQsIDB4OGY4NSwgMHhlN2FiLCAweDkxNGEsCisgICAgMHg5MTQ5LCAweGZmZmQsIDB4ODhlMiwgMHhmZmZkLCAweDk3YzksIDB4ZTdhZiwgMHhmZmZkLCAweDk0ZjAsCisgICAgMHhlN2IxLCAweGU3YjAsIDB4ZTdhZSwgMHhlMjg0LCAweDhhZDIsIDB4ZmZmZCwgMHhmZmZkLCAweGU3OGUsCisgICAgMHhmZmZkLCAweGU3YjMsIDB4ZTdiMiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3YjQsCisgICAgMHhmZmZkLCAweDk3NTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5M2RmLCAweGZmZmQsIDB4ZmZmZCwgMHg5NjRkLCAweGZmZmQsCisgICAgMHhlN2I1LCAweGZmZmQsIDB4OGVkNywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3YjYsCisgICAgMHhmZmZkLCAweGU3YjcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTdiOCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MzQwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDg4ZTgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGQ3OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5ODU5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlN2JjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjNTMsIDB4ZTdiOSwgMHhmZmZkLCAweGU3YmEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NTk0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGE3MywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTc1OCwgMHhmZmZkLCAweDhiYmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTM3MywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTdiZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTdiZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU3YmYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTM0MSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlN2MxLCAweGZmZmQsIDB4ZTdjMCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkzZDEsIDB4ZTdjMiwgMHg4ZjU1LCAweDhlZGUsIDB4OTQ3YSwgMHg5MjkxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGVmMCwgMHhmZmZkLCAweDkwOGMsIDB4ZmZmZCwgMHhlN2MzLCAweGZmZmQsCisgICAgMHhlN2M0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTA3YywgMHhlN2M1LCAweGZmZmQsIDB4ZTdjNiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU3YzcsIDB4OTc4ZiwgMHhmZmZkLCAweDhmNTYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTdjOSwgMHhlN2M4LCAweGZmZmQsIDB4OGQ3OSwgMHhmZmZkLCAweDhkOTMsCisgICAgMHg4ZTVmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTdjYywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmODYsCisgICAgMHhmZmZkLCAweGU3Y2IsIDB4ZmZmZCwgMHhlN2NhLCAweGZmZmQsIDB4OTFlNywgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4Y2VkLCAweGZmZmQsIDB4OTBjMSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk0YWUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmNTgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTdjZCwgMHhmZmZkLCAweDhmZGQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTdkMCwgMHhlN2NlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3Y2YsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3ZDIsIDB4ZTdkMSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZmY4LCAweGZmZmQsIDB4ZTdkMywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlN2Q0LCAweGU3ZDUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NGNlLCAweDhkZDEsCisgICAgMHg4ZWRmLCAweGU3ZDYsIDB4ZmZmZCwgMHhlN2Q3LCAweDk3YTIsIDB4OGY2NCwgMHg5NmVjLCAweDk3Y2EsCisgICAgMHhlN2Q4LCAweDhiZTAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlN2Q5LCAweGZmZmQsCisgICAgMHg5MzQyLCAweGZmZmQsIDB4ZmZmZCwgMHhlN2RjLCAweDhhOTgsIDB4OTA2YSwgMHhmZmZkLCAweGU3ZGEsCisgICAgMHhmZmZkLCAweGU3ZGIsIDB4ZmZmZCwgMHg5MmRlLCAweGZmZmQsIDB4ZmZmZCwgMHg5Njc0LCAweDhiZmEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTdkZSwgMHhlN2RmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3ZGQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3ZTEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTNkZCwgMHg4YTYyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU3ZTUsIDB4ZmZmZCwgMHhmZmZkLCAweGU3ZTIsIDB4ZTdlNCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlN2UwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU4NmUsIDB4ZmZmZCwgMHhmZmZkLCAweGU3ZTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk3ZTksIDB4ZmZmZCwgMHhmZmZkLCAweDhjZDgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3ZWQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkzNTMsIDB4ZTdlOCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlN2ViLCAweGU3ZTksIDB4ZmZmZCwgMHhlN2VlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlN2VmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3ZTcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTdmNCwgMHg4OTk0LCAweGZmZmQsIDB4ZmZmZCwgMHhlN2U2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTRhYiwgMHhmZmZkLCAweGU3ZWEsIDB4ZmZmZCwgMHg4ZmRlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhkN2EsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NjY3LCAweGZmZmQsCisgICAgMHg4YmUyLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZjY1LCAweGZmZmQsIDB4OTNiYSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkxNGMsIDB4ZmZmZCwgMHhlN2YyLCAweGZmZmQsIDB4ZTdlYywgMHhlN2YxLCAweGZmZmQsCisgICAgMHg5NmMxLCAweGZmZmQsIDB4OTJiNiwgMHhlN2YzLCAweGU3ZjAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTE0YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3ZjcsCisgICAgMHhmZmZkLCAweGU3ZjYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3ZjUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTY0ZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmOWIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU3ZjgsIDB4OTVkZCwgMHhmZmZkLCAweGZmZmQsIDB4ODk3MywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTU2NSwgMHg5MjkyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4Yjk4LCAweGZmZmQsIDB4ZTdmYSwgMHhmZmZkLCAweDhkN2MsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZTRiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3ZjksCisgICAgMHg5MDhkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MDhlLCAweGU4NDAsIDB4ZTg0MiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZmY5LCAweGZmZmQsIDB4ZTg0MSwgMHhlODQzLCAweGZmZmQsIDB4ZmZmZCwgMHg4YmQxLCAweGZmZmQsCisgICAgMHg5NTY0LCAweGZmZmQsIDB4ZmZmZCwgMHg4ZWUwLCAweDk4NDIsIDB4ZmZmZCwgMHhlN2ZjLCAweDhkZjYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTg1ZSwgMHhmZmZkLCAweGZmZmQsIDB4ZTg0NSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTg0NCwgMHhlODQ2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU3ZmIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5M2U3LCAweGZmZmQsIDB4OTM3NCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkyZDUsIDB4ZmZmZCwgMHhlODRiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MjYyLCAweGU4NDcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlODQ4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjNGMsIDB4ZmZmZCwgMHhlODRhLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGNhZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4NDksIDB4ZmZmZCwgMHg4ZmRmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhOTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4NGYsIDB4ZmZmZCwgMHg4ZGJkLCAweDkxOTksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTJjOCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhNWEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4NGQsIDB4ZTg0ZSwgMHg5MmMxLCAweGZmZmQsCisgICAgMHhlODRjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU4NTAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlODU2LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlODU5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlODU4LCAweDkzNGMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlODUxLCAweGU4NTIsCisgICAgMHhlODU1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTg1NywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhiYmUsIDB4ZmZmZCwgMHhmZmZkLCAweGU4NWEsIDB4ZTg1NCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlODUzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlODVlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4NWYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlODYwLCAweGZmZmQsIDB4ZmZmZCwgMHhlODVkLCAweGU4NWMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZmUwLCAweDkzYTgsIDB4ZTg1YiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU4NjQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlODYyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTg2MywgMHhlODYxLCAweGZmZmQsCisgICAgMHg5MWY2LCAweGZmZmQsIDB4ZTg2NSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU4NjYsIDB4ZmZmZCwgMHhmZmZkLCAweGU4NjgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhhZDMsIDB4ZTg2NywgMHg5NmY4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTg3MywgMHhlODY5LCAweGZmZmQsIDB4ZmZmZCwgMHhlODZjLCAweGZmZmQsCisgICAgMHhlODZhLCAweGZmZmQsIDB4ZTg2YiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTg2ZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlODZmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTg3MCwgMHhmZmZkLCAweGU4NzEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4NzQsIDB4ZTg3MiwgMHhlODc1LCAweGU4NzcsCisgICAgMHhmZmZkLCAweGU4NzYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkyYjcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NmU1LCAweGZmZmQsIDB4ZTg3OCwgMHg5MTRkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4NzksCisgICAgMHhmZmZkLCAweDk1YzIsIDB4ZTg3YSwgMHg4YTRhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5NWIsCisgICAgMHhmZmZkLCAweDhhZDUsIDB4ZmZmZCwgMHg4YWQ0LCAweGU4N2IsIDB4ZmZmZCwgMHhlODdjLCAweGZmZmQsCisgICAgMHhlODdkLCAweGU4N2UsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlODgwLCAweGZmZmQsIDB4OGFkNiwgMHg4YTc0LCAweDhkN2QsIDB4OTRiNCwgMHhmZmZkLCAweGU4ODIsCisgICAgMHhlODgxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTg4MywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODk3YiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU4ODYsIDB4ZmZmZCwgMHhlODg1LCAweGU4ODQsIDB4ZmZmZCwgMHhlODg3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlODhhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg4YzUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTg4OCwgMHhmZmZkLCAweGU4OGMsIDB4ZTg4YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4OGUsIDB4ZTg4ZCwgMHhlODhmLCAweGZmZmQsCisgICAgMHg5M2FjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4OTAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU4OTEsIDB4ZTg5MywgMHhmZmZkLCAweGZmZmQsIDB4ZTg5MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk1OGMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU4OTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlODk1LCAweGZmZmQsIDB4OGRlMywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlODk2LCAweGU4OTcsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTY2OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MTZhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg4YTIsCisgICAgMHg5MWM5LCAweGZmZmQsIDB4ZTg5OCwgMHhmZmZkLCAweDk1OGQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlODliLCAweGU4OTksIDB4OGQ3ZSwgMHhmZmZkLCAweGU4OWEsCisgICAgMHg4Y2MwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NWMzLCAweGU4OWQsIDB4ZTg5ZiwgMHhlODllLCAweGU4YTAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODk0MCwgMHg5MDc3LCAweDhmOWMsIDB4OGFkNywgMHhlOGExLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTQ4NiwgMHhmZmZkLCAweGU4YTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4OTQxLCAweGZmZmQsIDB4ZThhMiwgMHg5MmMyLCAweGZmZmQsIDB4OTdjYiwgMHg5M2E5LCAweGU4OWMsCisgICAgMHg5N2E0LCAweGZmZmQsIDB4OGNhZiwgMHhmZmZkLCAweGZmZmQsIDB4OTc3YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OGJmNywgMHg5N2IyLCAweGZmZmQsCisgICAgMHg4YzQ3LCAweGZmZmQsIDB4OTFlMCwgMHhlNDQwLCAweGZmZmQsIDB4ZThhNCwgMHg4YTRiLCAweDkwOGYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhNzUsIDB4ZThhNiwgMHhmZmZkLCAweGU4YTcsCisgICAgMHhlOGE1LCAweDhjODQsIDB4ZmZmZCwgMHg4ZGRiLCAweDhmZTEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4OTQyLCAweGZmZmQsIDB4ZmZmZCwgMHg5N2Q3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4YTksCisgICAgMHhlN2FjLCAweGZmZmQsIDB4ZThhOCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOGFjLCAweGU4YWEsIDB4ZThhYiwgMHhmZmZkLCAweGU4YWQsIDB4ZmZmZCwgMHhlOGFlLCAweDk3ZWEsCisgICAgMHhlOGFmLCAweGU4YjAsIDB4ZmZmZCwgMHg5MGM3LCAweDk0YjksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MDlkLCAweDhhZTUsIDB4ZmZmZCwgMHhmZmZkLCAweDk3NTksIDB4ODllYiwgMHg4ZjU3LCAweDhjZDksCisgICAgMHhmZmZkLCAweGU4YjMsIDB4ZmZmZCwgMHhlOGIyLCAweDhlOTMsIDB4ZThiNCwgMHhlOGIxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhlNDcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZThiOCwgMHhlNWFiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk5ZDQsIDB4ZmZmZCwgMHg5MDk3LCAweGU4YjYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTdhMywgMHg5M2VmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4OTRhLCAweGZmZmQsIDB4OTBlMSwgMHg4ZWI0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NWI1LCAweGZmZmQsIDB4ODk1ZiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5N2ViLCAweDk3OGIsCisgICAgMHhmZmZkLCAweGU4YjksIDB4ZmZmZCwgMHg5MzY0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZWY5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4YmEsIDB4ZmZmZCwgMHhlOGJiLCAweDkwNmIsCisgICAgMHhlOGJjLCAweGZmZmQsIDB4OTdlYywgMHhmZmZkLCAweGZmZmQsIDB4ZThiNywgMHhlOGJlLCAweGU4YzAsCisgICAgMHhmZmZkLCAweGU4YmYsIDB4ZmZmZCwgMHhlOGJkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOGMxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU4YzIsIDB4ZmZmZCwgMHhmZmZkLCAweDkxOWEsIDB4ZmZmZCwgMHg4OWUwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4YzMsIDB4ZmZmZCwgMHhmZmZkLCAweDk2YjYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZThjNCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOGM1LCAweGZmZmQsIDB4OTg0OSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ZTUwLCAweGU4YzYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZThjNywgMHhlOGM4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZThjYywgMHhmZmZkLCAweGU4YzksIDB4ZmZmZCwgMHhlOGNhLCAweGZmZmQsCisgICAgMHhlOGNiLCAweGU4Y2QsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTBjMiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NmY1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweDkwYzMsIDB4ZmZmZCwgMHhmZmZkLCAweGU4Y2UsIDB4ZmZmZCwgMHg5NGYxLCAweGZmZmQsCisgICAgMHhlOGNmLCAweGVhNzIsIDB4OTZjYSwgMHhmZmZkLCAweGU4ZDAsIDB4ZmZmZCwgMHhlOGQxLCAweGZmZmQsCisgICAgMHhlOGQyLCAweDhhNzYsIDB4ZmZmZCwgMHhlOGQ0LCAweGZmZmQsIDB4OTA3OCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU4ZDUsIDB4ZmZmZCwgMHhmZmZkLCAweDhjNDMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU4ZDYsIDB4ZThkYSwgMHhmZmZkLCAweGU4ZDgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU4ZDksIDB4ZmZmZCwgMHhmZmZkLCAweDhhOTMsIDB4ZThkNywgMHhlOGRiLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOGRjLCAweGZmZmQsIDB4ODhjNiwgMHhmZmZkLCAweGU4ZGQsCisgICAgMHhlOGRlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZmUyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4ZGYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YjY2LCAweGZmZmQsIDB4ZmZmZCwgMHhlOGUyLCAweGZmZmQsIDB4ZmZmZCwgMHhlOGUxLCAweGZmZmQsCisgICAgMHhlOGUwLCAweGZmZmQsIDB4ZmZmZCwgMHhlNjkxLCAweGZmZmQsIDB4OTVkYSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOGUzLCAweGU4ZTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOGU1LCAweGZmZmQsIDB4ZmZmZCwgMHhlOGU2LCAweGZmZmQsCisgICAgMHhlOGU3LCAweGZmZmQsIDB4ZmZmZCwgMHhlOGU4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YWQ4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4ZTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZThlYSwgMHg5NDQyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZThlYywgMHg4OWI5LCAweGZmZmQsIDB4ZThlZiwgMHhlOGVlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OTQzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhiYmYsCisgICAgMHhmZmZkLCAweDk1YzUsIDB4OTJiOCwgMHg4ZGEwLCAweGZmZmQsIDB4OGQ4MCwgMHg4Zjg3LCAweGZmZmQsCisgICAgMHg5MDdiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4ZjEsIDB4ZmZmZCwgMHhmZmZkLCAweGU4ZjAsCisgICAgMHg5NzYxLCAweDhhZTYsIDB4OTRkMCwgMHg5M2RhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwOWMsCisgICAgMHg5N2NjLCAweGZmZmQsIDB4OGM3YSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU4ZjQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4ZjMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk2NmEsIDB4OTNhYSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5NmYsIDB4ZmZmZCwgMHhmZmZkLCAweGU4ZjUsCisgICAgMHhlOGYyLCAweGZmZmQsIDB4ZmZmZCwgMHg5NTcwLCAweDk3OGEsIDB4ZThmNiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOGY3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOGY5LCAweDkxZTgsIDB4OGE3YSwgMHg4YTdiLCAweGU4ZjgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhhZTcsIDB4OGNiMCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YWU4LCAweGZmZmQsIDB4ZmZmZCwgMHg5MzVlLCAweGZmZmQsIDB4ZmZmZCwgMHg5N2RlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjZGEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOGZhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU4ZmIsCisgICAgMHhlOGZjLCAweGU5NDAsIDB4ZmZmZCwgMHhlOTQyLCAweGU5NDEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5NTk3LCAweGZmZmQsIDB4ZTk0MywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5NDQsCisgICAgMHhmZmZkLCAweGU5NDUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOTQ2LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOTQ4LCAweGU5NDcsIDB4ZmZmZCwgMHhlOTQ5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NGYyLCAweGUzY2EsIDB4ZmZmZCwgMHhmZmZkLCAweDkwNDgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGI1MSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU5NGEsIDB4ZmZmZCwgMHhlOTRiLCAweGZmZmQsIDB4OTlhYSwgMHg5ZjVhLCAweDk0ZDEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ODhmOSwgMHhmZmZkLCAweDg4YjksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhlOTQsIDB4OTY0ZiwgMHg4ZmZjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOTRjLCAweGZmZmQsIDB4OTZkZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU5NGQsIDB4OTc3YiwgMHhmZmZkLCAweDg5NjEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZTYwLCAweGZmZmQsIDB4ZTk0ZSwgMHg4OWVjLCAweGU5NGYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOTUwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTk1MiwgMHhlOTUzLCAweGZmZmQsCisgICAgMHhlOTU1LCAweGU5NTEsIDB4ZmZmZCwgMHhmZmZkLCAweGU5NTQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YWQ5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5NTYsIDB4ZmZmZCwgMHhlOTU3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTk1OCwgMHhlOTU5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTk1YSwgMHhmZmZkLCAweGZmZmQsIDB4ZTk1YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU5NWIsIDB4ZmZmZCwgMHhlOTVlLCAweGU5NjEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOTVkLCAweGU5NWYsIDB4ZTk2MCwgMHhmZmZkLCAweGZmZmQsIDB4ZTk2MiwgMHhmZmZkLCAweDhiYzAsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZWYxLCAweGU5NjMsCisgICAgMHhlOTY0LCAweDhkODEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTk2NSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YTVkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk0NmUsIDB4ZTk2NiwgMHhlOTY3LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5Mjc5LCAweDkzZTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5NjgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDk0OWQsIDB4ZmZmZCwgMHhmZmZkLCAweDkxY2EsIDB4ODk3NywgMHg4YmVjLCAweGZmZmQsCisgICAgMHg4YmVkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MjkzLCAweGU5NmQsIDB4OGJlZSwgMHhmZmZkLCAweGZmZmQsIDB4ODllZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOTZjLCAweGZmZmQsIDB4ZmZmZCwgMHhlOTZhLCAweGZmZmQsIDB4ZTk2YiwgMHhmZmZkLCAweGU5NjksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTk3NywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTk2ZSwgMHhlOTZmLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU5NzAsIDB4ZTk3MSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOTczLCAweGZmZmQsIDB4ZmZmZCwgMHhlOTcyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhmNzgsCisgICAgMHhmZmZkLCAweGU5NzQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTk3NiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4YjUyLCAweGU5NzUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTE5YiwgMHg4Y2IxLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU5NzgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MWNiLCAweGZmZmQsIDB4ZmZmZCwgMHhlOTc5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5M2FiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5N2EsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOTgwLCAweGZmZmQsCisgICAgMHhlOTdkLCAweGZmZmQsIDB4ZTk3YywgMHhlOTdlLCAweGZmZmQsIDB4ZTk3YiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTk4MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTk4MSwgMHhmZmZkLCAweGU5ODQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OGJjMSwgMHhlOTgzLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5ODUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTk4NiwgMHhmZmZkLCAweGU5ODgsIDB4ZTk4NywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU5ODksIDB4ZTk4YiwgMHhlOThhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZDljLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTk4YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOThkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YTViLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5OGUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOThmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDkwOTEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5OTAsCisgICAgMHhmZmZkLCAweGU5OTEsIDB4ZmZmZCwgMHhlOTkyLCAweGU5OTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4ZDgyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOTk0LCAweGU5OTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTk5NiwgMHhlOTk3LCAweGZmZmQsIDB4ZmZmZCwgMHhlOTk4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTRhZiwgMHhlOTlhLCAweGZmZmQsIDB4OTU0NSwgMHhlOTliLCAweGU5OTksCisgICAgMHhmZmZkLCAweGU5OWQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5OWMsIDB4ZmZmZCwgMHhmZmZkLCAweGU5OWUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOTlmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOWEwLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOWExLCAweGZmZmQsIDB4ZTlhMiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5YTMsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTlhNCwgMHhlOWE1LCAweGZmZmQsIDB4ZTlhNiwgMHhmZmZkLCAweGU5YTcsCisgICAgMHhlOWE4LCAweGU5YTksIDB4ZTlhYSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOWFiLCAweGU5YWMsCisgICAgMHhmZmZkLCAweDlmNTQsIDB4ZTlhZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlMmY2LCAweDhiNTMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhhNDAsIDB4OGRiMCwgMHhlOWFmLCAweGU5YWUsIDB4OTZhMywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZTliMSwgMHhlOWIyLCAweGU5YjAsCisgICAgMHhmZmZkLCAweGU5YjMsIDB4ZmZmZCwgMHhmZmZkLCAweDk2ODIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOWI0LCAweGZmZmQsIDB4OGI5YiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk4NDQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5YjUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOWI3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OGJjLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU5YjgsIDB4OTVhOSwgMHhlOWI2LCAweGZmZmQsIDB4ZmZmZCwgMHhlOWI5LCAweGU5YmEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5YmIsCisgICAgMHhlOWJjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOWJkLCAweGZmZmQsIDB4OTY4ZSwgMHg4ZTRjLCAweGZmZmQsIDB4OGRmOCwgMHg5MTRlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5YmUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU5YzEsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOWJmLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOWMyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhjZWYsIDB4ZTljMCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5YzMsCisgICAgMHhmZmZkLCAweGU5YzQsIDB4ZTljNSwgMHhmZmZkLCAweGU5YzksIDB4ZmZmZCwgMHg4ZTQ5LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MWUyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU5Y2EsIDB4ZTljNywgMHhlOWM2LCAweGU5YzgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4YzdlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOWNlLCAweGU5Y2QsIDB4ZTljYywgMHhmZmZkLCAweGZmZmQsIDB4ODhiMSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5ZDgsIDB4ZmZmZCwgMHhlOWQ0LCAweGZmZmQsCisgICAgMHhlOWQ1LCAweGU5ZDEsIDB4ZTlkNywgMHhmZmZkLCAweGU5ZDMsIDB4OGE4MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5ODZiLCAweGZmZmQsIDB4ZTlkNiwgMHhlOWQyLCAweGU5ZDAsIDB4ZTljZiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOWRhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGU5ZGQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5ZGMsIDB4ZTlkYiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTU2OCwgMHhlOWQ5LCAweDg4ZjEsCisgICAgMHhlOWRlLCAweGZmZmQsIDB4ZTllMCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDhhOGYsIDB4ZTljYiwgMHg4OTU2LCAweGZmZmQsIDB4ZmZmZCwgMHhlOWUyLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOWUxLCAweGU5ZGYsCisgICAgMHg5MjRjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTY5MCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk3ZDgsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTllMywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOWU0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5ZTUsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOWU2LCAweGZmZmQsCisgICAgMHhlOWU3LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTJiOSwgMHhmZmZkLCAweGU5ZTgsCisgICAgMHhmZmZkLCAweDk0YjUsIDB4ZmZmZCwgMHhlOWVkLCAweGU5ZTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlOWVhLCAweGZmZmQsIDB4ZmZmZCwgMHg5NjUwLCAweDk2YzIsIDB4ZmZmZCwgMHg5M2NlLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOWVlLCAweGZmZmQsIDB4ZmZmZCwgMHhlOWVmLCAweDkzYmMsCisgICAgMHhlOWVjLCAweGU5ZWIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OWE4LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZTlmNywgMHhmZmZkLCAweGZmZmQsIDB4ZTlmNiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4OTk1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5ZjQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlOWYzLCAweGZmZmQsIDB4ZmZmZCwgMHhlOWYxLCAweGZmZmQsCisgICAgMHg4YTliLCAweGZmZmQsIDB4ZTlmMCwgMHg4ZWIwLCAweDg5YTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4ZDgzLCAweGZmZmQsIDB4ZmZmZCwgMHhlOWZhLCAweGU5ZjksCisgICAgMHhmZmZkLCAweGU5ZjgsIDB4ZmZmZCwgMHhmZmZkLCAweGU5ZjUsIDB4ZmZmZCwgMHhlOWZiLCAweGZmZmQsCisgICAgMHhlOWZjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlYTQ0LCAweGVhNDMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGVhNDUsIDB4ZmZmZCwgMHhmZmZkLCAweDg5NGMsIDB4ZWE0MCwgMHhlYTQxLCAweGZmZmQsCisgICAgMHg4ZDk0LCAweDk2YjcsIDB4ZmZmZCwgMHhmZmZkLCAweGVhNDIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDk2NTEsIDB4ZmZmZCwgMHhmZmZkLCAweGVhNGEsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZWE0NiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZWE0YiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhNDgsCisgICAgMHhmZmZkLCAweGVhNDcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDhjN2IsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZWE0YywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhNGQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGVhNGUsIDB4ZmZmZCwgMHhlYTQ5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGU5ZjIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZWE0ZiwgMHhmZmZkLCAweDkyZGYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlYTUzLCAweGZmZmQsIDB4ZWE1NCwgMHhlYTUyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGVhNTEsIDB4ZWE1NywgMHhmZmZkLCAweGVhNTAsIDB4ZmZmZCwgMHhlYTU1LCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhNTYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlYTU5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGVhNTgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlYTViLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZWE1YywgMHhmZmZkLCAweGVhNWQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4OTg2OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlYTVhLCAweDkxZTksIDB4OGRlYiwgMHhmZmZkLCAweGZmZmQsIDB4ZWE1ZSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZWE1ZiwgMHhlYTYwLCAweGZmZmQsIDB4ZmZmZCwgMHhlYTYxLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZWE2MiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg4Y2IyLCAweGVhNjMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZWE2NCwgMHhmZmZkLCAweDhlYWQsCisgICAgMHhmZmZkLCAweGVhNjUsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlYTY2LCAweGZmZmQsIDB4ZmZmZCwgMHhlYTY3LCAweGVhNjgsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGVhNmIsIDB4ZWE2OSwgMHg5ODViLCAweGZmZmQsIDB4ZWE2YSwgMHhmZmZkLCAweDk3ZWQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZWE2YywgMHhmZmZkLCAweDk3ZDksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZWE2ZCwgMHg5NDllLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGVhNmUsIDB4ZWE3MCwgMHhmZmZkLCAweGZmZmQsIDB4ZWE3MSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlYTZmLCAweDhkOGQsIDB4OTZjYiwgMHg5NjgzLCAweDliZjUsIDB4ZmZmZCwgMHg5ZjgwLCAweDk2OWIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDg5YTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhNzMsIDB4OGI2ZiwgMHhlYTc0LCAweGVhNzUsCisgICAgMHhlYTc2LCAweGZmZmQsIDB4OGQ5NSwgMHhmZmZkLCAweGVhNzcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlMGQyLCAweDk2ZDksIDB4ZmZmZCwgMHg5MWUxLCAweGVhNzgsIDB4ZWE3YSwgMHhlYTc5LCAweGZmZmQsCisgICAgMHhlYTdiLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZWE3YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlYTdkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhN2UsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhODAsIDB4ZmZmZCwgMHhlYTgxLCAweGVhODIsCisgICAgMHhmZmZkLCAweGVhODMsIDB4ZmZmZCwgMHhlYTg0LCAweGVhODUsIDB4ZWE4NiwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhODcsCisgICAgMHhlYTg4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5MzQzLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg4Y2RiLCAweGZmZmQsIDB4ZWE4YSwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHg5MTZjLCAweGVhOGIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhOGMsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHg5NTQwLCAweGZmZmQsIDB4ZmZmZCwgMHhlYThkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZWE4ZSwgMHhlMjU2LCAweGZmZmQsIDB4ZmZmZCwgMHhlNmQ4LCAweGU4ZWIsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZWE4ZiwgMHhmZmZkLCAweGVhOTAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhOTIsCisgICAgMHhlYTkzLCAweGVhOTQsIDB4OTdlZSwgMHhlYTkxLCAweGZmZmQsIDB4ZmZmZCwgMHhlYTk1LCAweGVhOTYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZWE5OCwgMHhmZmZkLCAweGVhOTcsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZWE5YSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhlYTliLCAweGVhOTksCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4OTdiNCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZWE5YywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGVhOWQsIDB4ZTI3MywgMHhmZmZkLCAweGZmZmQsCisgICAgMHhlYTllLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAKK307CisKKyNlbmRpZiAvKiBLQU5KSSAqLworCisvKiBCbGFoLXRvLVVuaWNvZGUgdHJhbnNsYXRpb24gdGFibGVzICovCisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV90cmFuc3BhcmVudCA9IHsKKyAgICAyNTYsIFgyVV9DWEcsIDAsIDAsICJUcmFuc3BhcmVudCIsICJ0cmFuc3BhcmVudCIsIDAsICIiLAorICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKyAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorICAgIDB4MTgsIDB4MTksIDB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsCisgICAgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywKKyAgICAweDI4LCAweDI5LCAweDJBLCAweDJCLCAweDJDLCAweDJELCAweDJFLCAweDJGLAorICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisgICAgMHgzOCwgMHgzOSwgMHgzQSwgMHgzQiwgMHgzQywgMHgzRCwgMHgzRSwgMHgzRiwKKyAgICAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LAorICAgIDB4NDgsIDB4NDksIDB4NEEsIDB4NEIsIDB4NEMsIDB4NEQsIDB4NEUsIDB4NEYsCisgICAgMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywKKyAgICAweDU4LCAweDU5LCAweDVBLCAweDVCLCAweDVDLCAweDVELCAweDVFLCAweDVGLAorICAgIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCisgICAgMHg2OCwgMHg2OSwgMHg2QSwgMHg2QiwgMHg2QywgMHg2RCwgMHg2RSwgMHg2RiwKKyAgICAweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LAorICAgIDB4NzgsIDB4NzksIDB4N0EsIDB4N0IsIDB4N0MsIDB4N0QsIDB4N0UsIDB4N0YsCisgICAgMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKKyAgICAweDg4LCAweDg5LCAweDhBLCAweDhCLCAweDhDLCAweDhELCAweDhFLCAweDhGLAorICAgIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsCisgICAgMHg5OCwgMHg5OSwgMHg5QSwgMHg5QiwgMHg5QywgMHg5RCwgMHg5RSwgMHg5RiwKKyAgICAweEEwLCAweEExLCAweEEyLCAweEEzLCAweEE0LCAweEE1LCAweEE2LCAweEE3LAorICAgIDB4QTgsIDB4QTksIDB4QUEsIDB4QUIsIDB4QUMsIDB4QUQsIDB4QUUsIDB4QUYsCisgICAgMHhCMCwgMHhCMSwgMHhCMiwgMHhCMywgMHhCNCwgMHhCNSwgMHhCNiwgMHhCNywKKyAgICAweEI4LCAweEI5LCAweEJBLCAweEJCLCAweEJDLCAweEJELCAweEJFLCAweEJGLAorICAgIDB4QzAsIDB4QzEsIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzcsCisgICAgMHhDOCwgMHhDOSwgMHhDQSwgMHhDQiwgMHhDQywgMHhDRCwgMHhDRSwgMHhDRiwKKyAgICAweEQwLCAweEQxLCAweEQyLCAweEQzLCAweEQ0LCAweEQ1LCAweEQ2LCAweEQ3LAorICAgIDB4RDgsIDB4RDksIDB4REEsIDB4REIsIDB4REMsIDB4REQsIDB4REUsIDB4REYsCisgICAgMHhFMCwgMHhFMSwgMHhFMiwgMHhFMywgMHhFNCwgMHhFNSwgMHhFNiwgMHhFNywKKyAgICAweEU4LCAweEU5LCAweEVBLCAweEVCLCAweEVDLCAweEVELCAweEVFLCAweEVGLAorICAgIDB4RjAsIDB4RjEsIDB4RjIsIDB4RjMsIDB4RjQsIDB4RjUsIDB4RjYsIDB4RjcsCisgICAgMHhGOCwgMHhGOSwgMHhGQSwgMHhGQiwgMHhGQywgMHhGRCwgMHhGRSwgMHhGRgorfTsKKworLyogNy1iaXQgY2hhcmFjdGVyIHNldHM6IElTTyA2NDYsIERFQyBOUkNzLCBTaG9ydCBLT0ksIGFuZCBIZWJyZXctNyAqLworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfYXNjaWkgPSB7CisgICAgOTQsIDMzLCBYMlVfSVNPfFgyVV9TVEQsIEFMX1JPTUFOLCAiVVMgQVNDSUkiLCAiYXNjaWkiLCA2LCAiQiIsCisgICAgICAgICAgICAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisgICAgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisgICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLCAweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisgICAgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisgICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLCAweDAwN2MsIDB4MDA3ZCwgMHgwMDdlCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfYnJpdGlzaCA9IHsKKyAgICA5NCwgMzMsIFgyVV9JU098WDJVX1NURCwgQUxfUk9NQU4sICJCcml0aXNoIElTTyA2NDYiLCAiYnJpdGlzaCIsIDEsICJBIiwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwYTMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsIDB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKyAgICAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKyAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIDB4MDA3YywgMHgwMDdkLCAweDAwN2UKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9kdXRjaCA9IHsKKyAgICA5NCwgMzMsIFgyVV9ERUN8WDJVX1NURCwgQUxfUk9NQU4sICJEdXRjaCBOUkMiLCAiZHV0Y2giLCAwLCAiNCIsCisgICAgICAgICAgICAweDAwMjEsIDB4MDAyMiwgMHgwMGEzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisgICAgMHgwMGJlLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisgICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMGZmLCAweDAwYmQsIDB4MDA3YywgMHgwMDVlLCAweDAwNWYsCisgICAgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisgICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMGE4LCAweDAwYTQsIDB4MDBiYywgMHgwMDI3Cit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfZmlubmlzaCA9IHsKKyAgICA5NCwgMzMsIFgyVV9ERUN8WDJVX1NURCwgQUxfUk9NQU4sICJGaW5uaXNoIE5SQyIsICJmaW5uaXNoIiwgMCwgIjVDIiwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwYzQsIDB4MDBkNiwgMHgwMGM1LCAweDAwZGMsIDB4MDA1ZiwKKyAgICAweDAwZTksIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKyAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwZTQsIDB4MDBmNiwgMHgwMGU1LCAweDAwZmMKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9mcmVuY2ggPSB7CisgICAgOTQsIDMzLCBYMlVfSVNPfFgyVV9TVEQsIEFMX1JPTUFOLCAiRnJlbmNoIElTTyA2NDYiLCAiZnJlbmNoIiwgMCwgImZSIiwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwYTMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwZTAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwYjAsIDB4MDBlNywgMHgwMGE3LCAweDAwNWUsIDB4MDA1ZiwKKyAgICAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKyAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwZTksIDB4MDBmOSwgMHgwMGU4LCAweDAwYTgKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9mcl9jYW5hZGlhbiA9IHsKKyA5NCwzMyxYMlVfREVDfFgyVV9TVEQsQUxfUk9NQU4sIkZyZW5jaCBDYW5hZGlhbiBOUkMiLCJjYW5hZGlhbi1mcmVuY2giLDAsIjlRIiwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwZTAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwZTIsIDB4MDBlNywgMHgwMGVhLCAweDAwZWUsIDB4MDA1ZiwKKyAgICAweDAwZjQsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKyAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwZTksIDB4MDBmOSwgMHgwMGU4LCAweDAwZmIKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9nZXJtYW4gPSB7CisgICAgOTQsIDMzLCBYMlVfSVNPfFgyVV9TVEQsIEFMX1JPTUFOLCAiR2VybWFuIElTTyA2NDYiLCAiZ2VybWFuIiwgMjEsICJLIiwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwYTcsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwYzQsIDB4MDBkNiwgMHgwMGRjLCAweDAwNWUsIDB4MDA1ZiwKKyAgICAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKyAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwZTQsIDB4MDBmNiwgMHgwMGZjLCAweDAwZGYKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9odW5nYXJpYW4gPSB7CisgICAgOTQsIDMzLCBYMlVfSVNPfFgyVV9TVEQsIEFMX1JPTUFOLCAiSHVuZ2FyaWFuIElTTyA2NDYiLCJodW5nYXJpYW4iLDg2LCJpIiwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDBhNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwYzEsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwYzksIDB4MDBkNiwgMHgwMGRjLCAweDAwNWUsIDB4MDA1ZiwKKyAgICAweDAwZTEsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKyAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwZTksIDB4MDBmNiwgMHgwMGZjLCAweDAwMjIsIDB4MDJkZAorfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2l0YWxpYW4gPSB7CisgICAgOTQsIDMzLCBYMlVfSVNPfFgyVV9TVEQsIEFMX1JPTUFOLCAiSXRhbGlhbiBJU08gNjQ2IiwgIml0YWxpYW4iLCAxNSwgIlkiLAorICAgICAgICAgICAgMHgwMDIxLCAweDAwMjIsIDB4MDBhMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwgMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwgMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorICAgIDB4MDBhNywgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorICAgIDB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDBiMCwgMHgwMGU3LCAweDAwZTksIDB4MDA1ZSwgMHgwMDVmLAorICAgIDB4MDBmOSwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorICAgIDB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwgMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorICAgIDB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDBlMCwgMHgwMGYyLCAweDAwZTgsIDB4MDBlYworfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2ljZWxhbmRpYyA9IHsKKyAgICA5NCwgMzMsIFgyVV9ERUN8WDJVX1NURCwgQUxfUk9NQU4sICJJY2VsYW5kaWMgTlJDIiwgImljZWxhbmRpYyIsIDAsIE5VTEwsCisgICAgICAgICAgICAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisgICAgMHgwMGRlLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisgICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMGYwLCAweDAwZDgsIDB4MDBjNiwgMHgwMGQ2LCAweDAwNWYsCisgICAgMHgwMGZlLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisgICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMGYwLCAweDAwN2MsIDB4MDBlNiwgMHgwMGY2Cit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfamlzMDIwMXIgPSB7CisgICAgOTQsIDMzLCBYMlVfSVNPfFgyVV9TVEQsQUxfUk9NQU4sIkphcGFuZXNlIFJvbWFuIiwiamFwYW5lc2Utcm9tYW4iLDE0LCJKIiwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsIDB4MDBhNSwgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKyAgICAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKyAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIDB4MDA3YywgMHgwMDdkLCAweDIwM2UKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9qaXMwMjAxayA9IHsKKyAgICA5NCwgMzMsIFgyVV9JU098WDJVX1NURCxBTF9LQU5BLCJKYXBhbmVzZSBLYXRha2FuYSIsICJrYXRha2FuYSIsIDEzLCAiSSIsCisgICAgICAgICAgICAweGZmNjEsIDB4ZmY2MiwgMHhmZjYzLCAweGZmNjQsIDB4ZmY2NSwgMHhmZjY2LCAweGZmNjcsCisgICAgMHhmZjY4LCAweGZmNjksIDB4ZmY2YSwgMHhmZjZiLCAweGZmNmMsIDB4ZmY2ZCwgMHhmZjZlLCAweGZmNmYsCisgICAgMHhmZjcwLCAweGZmNzEsIDB4ZmY3MiwgMHhmZjczLCAweGZmNzQsIDB4ZmY3NSwgMHhmZjc2LCAweGZmNzcsCisgICAgMHhmZjc4LCAweGZmNzksIDB4ZmY3YSwgMHhmZjdiLCAweGZmN2MsIDB4ZmY3ZCwgMHhmZjdlLCAweGZmN2YsCisgICAgMHhmZjgwLCAweGZmODEsIDB4ZmY4MiwgMHhmZjgzLCAweGZmODQsIDB4ZmY4NSwgMHhmZjg2LCAweGZmODcsCisgICAgMHhmZjg4LCAweGZmODksIDB4ZmY4YSwgMHhmZjhiLCAweGZmOGMsIDB4ZmY4ZCwgMHhmZjhlLCAweGZmOGYsCisgICAgMHhmZjkwLCAweGZmOTEsIDB4ZmY5MiwgMHhmZjkzLCAweGZmOTQsIDB4ZmY5NSwgMHhmZjk2LCAweGZmOTcsCisgICAgMHhmZjk4LCAweGZmOTksIDB4ZmY5YSwgMHhmZjliLCAweGZmOWMsIDB4ZmY5ZCwgMHhmZjllLCAweGZmOWYsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfbm9yd2VnaWFuID0geyAgICAgLyogU2FtZSBhcyBEYW5pc2ggKi8KKyAgICA5NCwzMyxYMlVfSVNPfFgyVV9TVEQsQUxfUk9NQU4sIk5vcndlZ2lhbiBJU08gNjQ2IiwgIm5vcndlZ2lhbiIsIDYwLCAiYEU2IiwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwYzYsIDB4MDBkOCwgMHgwMGM1LCAweDAwNWUsIDB4MDA1ZiwKKyAgICAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKyAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwZTYsIDB4MDBmOCwgMHgwMGU1LCAweDAwN2UKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9kYW5pc2ggPSB7ICAgICAgICAvKiBTYW1lIGFzIE5vcndlZ2lhbiAqLworICAgIDk0LCAzMywgWDJVX0lTT3xYMlVfU1RELCBBTF9ST01BTiwgIkRhbmlzaCBJU08gNjQ2IiwgImRhbmlzaCIsIDYwLCAiYEU2IiwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwYzYsIDB4MDBkOCwgMHgwMGM1LCAweDAwNWUsIDB4MDA1ZiwKKyAgICAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKyAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwZTYsIDB4MDBmOCwgMHgwMGU1LCAweDAwN2UKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9wb3J0dWd1ZXNlID0geworICAgIDk0LDMzLFgyVV9JU098WDJVX1NURCxBTF9ST01BTiwiUG9ydHVndWVzZSBJU08gNjQ2IiwicG9ydHVndWVzZSIsMTYsIkwlNiIsCisgICAgICAgICAgICAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisgICAgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisgICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMGM2LCAweDAwZDgsIDB4MDBjNSwgMHgwMDVlLCAweDAwNWYsCisgICAgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisgICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMGU2LCAweDAwZjgsIDB4MDBlNSwgMHgwMDdlCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfc3BhbmlzaCA9IHsKKyAgICA5NCwgMzMsIFgyVV9JU098WDJVX1NURCwgQUxfUk9NQU4sICJTcGFuaXNoIElTTyA2NDYiLCAic3BhbmlzaCIsIDE3LCAiWiIsCisgICAgICAgICAgICAweDAwMjEsIDB4MDAyMiwgMHgwMGEzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisgICAgMHgwMGE3LCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisgICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMGExLCAweDAwZDEsIDB4MDBiZiwgMHgwMDVlLCAweDAwNWYsCisgICAgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisgICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMGIwLCAweDAwZjEsIDB4MDBlNywgMHgwMDdlCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfc3dlZGlzaCA9IHsKKyAgICA5NCwgMzMsIFgyVV9JU098WDJVX1NURCwgQUxfUk9NQU4sICJTd2VkaXNoIElTTyA2NDYiLCAic3dlZGlzaCIsIDExLCAiSEciLAorICAgICAgICAgICAgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwgMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwgMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorICAgIDB4MDBjOSwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorICAgIDB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDBjNCwgMHgwMGQ2LCAweDAwYzUsIDB4MDBkYywgMHgwMDVmLAorICAgIDB4MDBlOSwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorICAgIDB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwgMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorICAgIDB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDBlNCwgMHgwMGY2LCAweDAwZTUsIDB4MDBmYworfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X3N3aXNzID0geworICAgIDk0LCAzMywgWDJVX0RFQ3xYMlVfU1RELCBBTF9ST01BTiwgIlN3aXNzIE5SQyIsICJzd2lzcyIsIDAsICI9IiwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwZjksIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwZTAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwZTksIDB4MDBlNywgMHgwMGVhLCAweDAwZWUsIDB4MDBlOCwKKyAgICAweDAwZjQsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKyAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwZTQsIDB4MDBmNiwgMHgwMGZjLCAweDAwZmIKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9rb2k3ID0geworICAgIDk0LCAzMywgWDJVX1NURCwgQUxfQ1lSSUwsICJTaG9ydCBLT0kiLCAic2hvcnQta29pIiwgMCwgTlVMTCwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsIDB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKyAgICAweDA0MmUsIDB4MDQxMCwgMHgwNDExLCAweDA0MjYsIDB4MDQxNCwgMHgwNDE1LCAweDA0MjQsIDB4MDQxMywKKyAgICAweDA0MjUsIDB4MDQxOCwgMHgwNDE5LCAweDA0MWEsIDB4MDQxYiwgMHgwNDFjLCAweDA0MWQsIDB4MDQxZSwKKyAgICAweDA0MWYsIDB4MDQyZiwgMHgwNDIwLCAweDA0MjEsIDB4MDQyMiwgMHgwNDIzLCAweDA0MTYsIDB4MDQxMiwKKyAgICAweDA0MmMsIDB4MDQyYiwgMHgwNDE3LCAweDA0MjgsIDB4MDQyZCwgMHgwNDI5LCAweDA0MjcKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9lbG90OTI3ID0geworICAgIDk0LCAzMywgWDJVX1NURCwgQUxfR1JFRUssICJFTE9UIDkyNyIsICJlbG90OTI3LWdyZWVrIiwgMCwgTlVMTCwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsIDB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKyAgICAweDAwNjAsIDB4MDM5MSwgMHgwMzkyLCAweDAzOTMsIDB4MDM5NCwgMHgwMzk1LCAweDAzOTYsIDB4MDM5NywKKyAgICAweDAzOTgsIDB4MDM5OSwgMHgwMzlhLCAweDAzOWIsIDB4MDM5YywgMHgwMzlkLCAweDAzOWUsIDB4MDM5ZiwKKyAgICAweDAzYTAsIDB4MDNhMSwgMHgwM2EzLCAweDAzYTQsIDB4MDNhNSwgMHgwM2E2LCAweDAzYTcsIDB4MDNhOCwKKyAgICAweDAzYTksIDB4MDAyMCwgMHgwMDIwLCAweDAwN2IsIDB4MDA3YywgMHgwMDdkLCAweDAwN2UKK307CisKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2hlYnJldzcgPSB7CisgICAgOTQsIDMzLCBYMlVfU1RELCBBTF9IRUJSRVcsICJIZWJyZXctNyIsICJoZWJyZXctNyIsIDAsIE5VTEwsCisgICAgICAgICAgICAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisgICAgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisgICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLCAweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisgICAgMHgwNWQwLCAweDA1ZDEsIDB4MDVkMiwgMHgwNWQzLCAweDA1ZDQsIDB4MDVkNSwgMHgwNWQ2LCAweDA1ZDcsCisgICAgMHgwNWQ4LCAweDA1ZDksIDB4MDVkYSwgMHgwNWRiLCAweDA1ZGMsIDB4MDVkZCwgMHgwNWRlLCAweDA1ZGYsCisgICAgMHgwNWUwLCAweDA1ZTEsIDB4MDVlMiwgMHgwNWUzLCAweDA1ZTQsIDB4MDVlNSwgMHgwNWU2LCAweDA1ZTcsCisgICAgMHgwNWU4LCAweDA1ZTksIDB4MDVlYSwgMHgwMDdiLCAweDAwN2MsIDB4MDA3ZCwgMHgwMDdlCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfYXBsMSA9IHsKKyAgICA5NCwgMzMsIFgyVV9JU098WDJVX1NURCwgQUxfUk9NQU4sICJBUEwgSVNPIiwgImFwbC1pc28iLCA2OCwgImUiLAorICAgICAgICAgICAgMHgwMGE4LCAweDAwMjksIDB4MDAzYywgMHgyMjY0LCAweDAwM2QsIDB4MDAzZSwgMHgwMDVkLAorICAgIDB4MjIyOCwgMHgyMjI3LCAweDIyNjAsIDB4MDBmNywgMHgwMDJjLCAweDAwMmIsIDB4MDAyZSwgMHgwMDJmLAorICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwMjgsIDB4MDA1YiwgMHgwMDNiLCAweDAwZDcsIDB4MDAzYSwgMHgwMDVjLAorICAgIDB4MDBhZiwgMHgyMzdhLCAweDIyYTUsIDB4MjJjMiwgMHgyMzBhLCAweDIyMGEsIDB4MDA1ZiwgMHgyMjA3LAorICAgIDB4MjIwNiwgMHgyMzczLCAweDIyMTgsIDB4MDAyNywgMHgyNWFmLCAweDAwN2MsIDB4MjJhNCwgMHgyNWNiLAorICAgIDB4MjJjNiwgMHgwMDNmLCAweDIzNzQsIDB4MjMwOCwgMHgyMjNjLCAweDIxOTMsIDB4MjIyYSwgMHgyMzc1LAorICAgIDB4MjI4MywgMHgyMTkxLCAweDIyODIsIDB4MjE5MCwgMHgyMmEyLCAweDIxOTIsIDB4MjI2NSwgMHgwMDJkLAorICAgIDB4MjJjNCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorICAgIDB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA3YiwgMHgyMmEzLCAweDAwN2QsIDB4MDAyNAorfTsKKworLyogSVNPIDg4NTkgTGF0aW4gQWxwaGFiZXRzICovCisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV84ODU5XzEgPSB7CisgICAgOTYsIDMyLCBYMlVfSVNPfFgyVV9TVEQsIEFMX1JPTUFOLCAiSVNPIExhdGluLTEiLCAibGF0aW4xIiwgMTAwLCAiQSIsCisgICAgMHgwMEEwLCAweDAwQTEsIDB4MDBBMiwgMHgwMEEzLCAweDAwQTQsIDB4MDBBNSwgMHgwMEE2LCAweDAwQTcsCisgICAgMHgwMEE4LCAweDAwQTksIDB4MDBBQSwgMHgwMEFCLCAweDAwQUMsIDB4MDBBRCwgMHgwMEFFLCAweDAwQUYsCisgICAgMHgwMEIwLCAweDAwQjEsIDB4MDBCMiwgMHgwMEIzLCAweDAwQjQsIDB4MDBCNSwgMHgwMEI2LCAweDAwQjcsCisgICAgMHgwMEI4LCAweDAwQjksIDB4MDBCQSwgMHgwMEJCLCAweDAwQkMsIDB4MDBCRCwgMHgwMEJFLCAweDAwQkYsCisgICAgMHgwMEMwLCAweDAwQzEsIDB4MDBDMiwgMHgwMEMzLCAweDAwQzQsIDB4MDBDNSwgMHgwMEM2LCAweDAwQzcsCisgICAgMHgwMEM4LCAweDAwQzksIDB4MDBDQSwgMHgwMENCLCAweDAwQ0MsIDB4MDBDRCwgMHgwMENFLCAweDAwQ0YsCisgICAgMHgwMEQwLCAweDAwRDEsIDB4MDBEMiwgMHgwMEQzLCAweDAwRDQsIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsCisgICAgMHgwMEQ4LCAweDAwRDksIDB4MDBEQSwgMHgwMERCLCAweDAwREMsIDB4MDBERCwgMHgwMERFLCAweDAwREYsCisgICAgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwgMHgwMEUzLCAweDAwRTQsIDB4MDBFNSwgMHgwMEU2LCAweDAwRTcsCisgICAgMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLCAweDAwRUMsIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsCisgICAgMHgwMEYwLCAweDAwRjEsIDB4MDBGMiwgMHgwMEYzLCAweDAwRjQsIDB4MDBGNSwgMHgwMEY2LCAweDAwRjcsCisgICAgMHgwMEY4LCAweDAwRjksIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV84ODU5XzIgPSB7CisgICAgOTYsIDMyLCBYMlVfSVNPfFgyVV9TVEQsIEFMX1JPTUFOLCAiSVNPIExhdGluLTIiLCAibGF0aW4yIiwgMTAxLCAiQiIsCisgICAgMHgwMEEwLCAweDAxMDQsIDB4MDJEOCwgMHgwMTQxLCAweDAwQTQsIDB4MDEzRCwgMHgwMTVBLCAweDAwQTcsCisgICAgMHgwMEE4LCAweDAxNjAsIDB4MDE1RSwgMHgwMTY0LCAweDAxNzksIDB4MDBBRCwgMHgwMTdELCAweDAxN0IsCisgICAgMHgwMEIwLCAweDAxMDUsIDB4MDJEQiwgMHgwMTQyLCAweDAwQjQsIDB4MDEzRSwgMHgwMTVCLCAweDAyQzcsCisgICAgMHgwMEI4LCAweDAxNjEsIDB4MDE1RiwgMHgwMTY1LCAweDAxN0EsIDB4MDJERCwgMHgwMTdFLCAweDAxN0MsCisgICAgMHgwMTU0LCAweDAwQzEsIDB4MDBDMiwgMHgwMTAyLCAweDAwQzQsIDB4MDEzOSwgMHgwMTA2LCAweDAwQzcsCisgICAgMHgwMTBDLCAweDAwQzksIDB4MDExOCwgMHgwMENCLCAweDAxMUEsIDB4MDBDRCwgMHgwMENFLCAweDAxMEUsCisgICAgMHgwMTEwLCAweDAxNDMsIDB4MDE0NywgMHgwMEQzLCAweDAwRDQsIDB4MDE1MCwgMHgwMEQ2LCAweDAwRDcsCisgICAgMHgwMTU4LCAweDAxNkUsIDB4MDBEQSwgMHgwMTcwLCAweDAwREMsIDB4MDBERCwgMHgwMTYyLCAweDAwREYsCisgICAgMHgwMTU1LCAweDAwRTEsIDB4MDBFMiwgMHgwMTAzLCAweDAwRTQsIDB4MDEzQSwgMHgwMTA3LCAweDAwRTcsCisgICAgMHgwMTBELCAweDAwRTksIDB4MDExOSwgMHgwMEVCLCAweDAxMUIsIDB4MDBFRCwgMHgwMEVFLCAweDAxMEYsCisgICAgMHgwMTExLCAweDAxNDQsIDB4MDE0OCwgMHgwMEYzLCAweDAwRjQsIDB4MDE1MSwgMHgwMEY2LCAweDAwRjcsCisgICAgMHgwMTU5LCAweDAxNkYsIDB4MDBGQSwgMHgwMTcxLCAweDAwRkMsIDB4MDBGRCwgMHgwMTYzLCAweDAyRDkKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV84ODU5XzMgPSB7CisgICAgOTYsIDMyLCBYMlVfSVNPfFgyVV9TVEQsIEFMX1JPTUFOLCAiSVNPIExhdGluLTMiLCAibGF0aW4zIiwgMTA5LCAiQyIsCisgICAgMHgwMEEwLCAweDAxMjYsIDB4MDJEOCwgMHgwMEEzLCAweDAwQTQsIDB4ZmZmZCwgMHgwMTI0LCAweDAwQTcsCisgICAgMHgwMEE4LCAweDAxMzAsIDB4MDE1RSwgMHgwMTFFLCAweDAxMzQsIDB4MDBBRCwgMHhmZmZkLCAweDAxN0IsCisgICAgMHgwMEIwLCAweDAxMjcsIDB4MDBCMiwgMHgwMEIzLCAweDAwQjQsIDB4MDBCNSwgMHgwMTI1LCAweDAwQjcsCisgICAgMHgwMEI4LCAweDAxMzEsIDB4MDE1RiwgMHgwMTFGLCAweDAxMzUsIDB4MDBCRCwgMHhmZmZkLCAweDAxN0MsCisgICAgMHgwMEMwLCAweDAwQzEsIDB4MDBDMiwgMHhmZmZkLCAweDAwQzQsIDB4MDEwQSwgMHgwMTA4LCAweDAwQzcsCisgICAgMHgwMEM4LCAweDAwQzksIDB4MDBDQSwgMHgwMENCLCAweDAwQ0MsIDB4MDBDRCwgMHgwMENFLCAweDAwQ0YsCisgICAgMHhmZmZkLCAweDAwRDEsIDB4MDBEMiwgMHgwMEQzLCAweDAwRDQsIDB4MDEyMCwgMHgwMEQ2LCAweDAwRDcsCisgICAgMHgwMTFDLCAweDAwRDksIDB4MDBEQSwgMHgwMERCLCAweDAwREMsIDB4MDE2QywgMHgwMTVDLCAweDAwREYsCisgICAgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwgMHhmZmZkLCAweDAwRTQsIDB4MDEwQiwgMHgwMTA5LCAweDAwRTcsCisgICAgMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLCAweDAwRUMsIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsCisgICAgMHhmZmZkLCAweDAwRjEsIDB4MDBGMiwgMHgwMEYzLCAweDAwRjQsIDB4MDEyMSwgMHgwMEY2LCAweDAwRjcsCisgICAgMHgwMTFELCAweDAwRjksIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDE2RCwgMHgwMTVELCAweDAyRDkKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV84ODU5XzQgPSB7CisgICAgOTYsIDMyLCBYMlVfSVNPfFgyVV9TVEQsIEFMX1JPTUFOLCAiSVNPIExhdGluLTQiLCAibGF0aW40IiwgMTEwLCAiRCIsCisgICAgMHgwMEEwLCAweDAxMDQsIDB4MDEzOCwgMHgwMTU2LCAweDAwQTQsIDB4MDEyOCwgMHgwMTNCLCAweDAwQTcsCisgICAgMHgwMEE4LCAweDAxNjAsIDB4MDExMiwgMHgwMTIyLCAweDAxNjYsIDB4MDBBRCwgMHgwMTdELCAweDAwQUYsCisgICAgMHgwMEIwLCAweDAxMDUsIDB4MDJEQiwgMHgwMTU3LCAweDAwQjQsIDB4MDEyOSwgMHgwMTNDLCAweDAyQzcsCisgICAgMHgwMEI4LCAweDAxNjEsIDB4MDExMywgMHgwMTIzLCAweDAxNjcsIDB4MDE0QSwgMHgwMTdFLCAweDAxNEIsCisgICAgMHgwMTAwLCAweDAwQzEsIDB4MDBDMiwgMHgwMEMzLCAweDAwQzQsIDB4MDBDNSwgMHgwMEM2LCAweDAxMkUsCisgICAgMHgwMTBDLCAweDAwQzksIDB4MDExOCwgMHgwMENCLCAweDAxMTYsIDB4MDBDRCwgMHgwMENFLCAweDAxMkEsCisgICAgMHgwMTEwLCAweDAxNDUsIDB4MDE0QywgMHgwMTM2LCAweDAwRDQsIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsCisgICAgMHgwMEQ4LCAweDAxNzIsIDB4MDBEQSwgMHgwMERCLCAweDAwREMsIDB4MDE2OCwgMHgwMTZBLCAweDAwREYsCisgICAgMHgwMTAxLCAweDAwRTEsIDB4MDBFMiwgMHgwMEUzLCAweDAwRTQsIDB4MDBFNSwgMHgwMEU2LCAweDAxMkYsCisgICAgMHgwMTBELCAweDAwRTksIDB4MDExOSwgMHgwMEVCLCAweDAxMTcsIDB4MDBFRCwgMHgwMEVFLCAweDAxMkIsCisgICAgMHgwMTExLCAweDAxNDYsIDB4MDE0RCwgMHgwMTM3LCAweDAwRjQsIDB4MDBGNSwgMHgwMEY2LCAweDAwRjcsCisgICAgMHgwMEY4LCAweDAxNzMsIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDE2OSwgMHgwMTZCLCAweDAyRDkKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV84ODU5XzUgPSB7CisgICAgOTYsMzIsWDJVX0lTT3xYMlVfU1RELEFMX0NZUklMLCJJU08gTGF0aW4vQ3lyaWxsaWMiLCJjeXJpbGxpYy1pc28iLDE0NCwiTCIsCisgICAgMHgwMEEwLCAweDA0MDEsIDB4MDQwMiwgMHgwNDAzLCAweDA0MDQsIDB4MDQwNSwgMHgwNDA2LCAweDA0MDcsCisgICAgMHgwNDA4LCAweDA0MDksIDB4MDQwQSwgMHgwNDBCLCAweDA0MEMsIDB4MDBBRCwgMHgwNDBFLCAweDA0MEYsCisgICAgMHgwNDEwLCAweDA0MTEsIDB4MDQxMiwgMHgwNDEzLCAweDA0MTQsIDB4MDQxNSwgMHgwNDE2LCAweDA0MTcsCisgICAgMHgwNDE4LCAweDA0MTksIDB4MDQxQSwgMHgwNDFCLCAweDA0MUMsIDB4MDQxRCwgMHgwNDFFLCAweDA0MUYsCisgICAgMHgwNDIwLCAweDA0MjEsIDB4MDQyMiwgMHgwNDIzLCAweDA0MjQsIDB4MDQyNSwgMHgwNDI2LCAweDA0MjcsCisgICAgMHgwNDI4LCAweDA0MjksIDB4MDQyQSwgMHgwNDJCLCAweDA0MkMsIDB4MDQyRCwgMHgwNDJFLCAweDA0MkYsCisgICAgMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwgMHgwNDMzLCAweDA0MzQsIDB4MDQzNSwgMHgwNDM2LCAweDA0MzcsCisgICAgMHgwNDM4LCAweDA0MzksIDB4MDQzQSwgMHgwNDNCLCAweDA0M0MsIDB4MDQzRCwgMHgwNDNFLCAweDA0M0YsCisgICAgMHgwNDQwLCAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLCAweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsCisgICAgMHgwNDQ4LCAweDA0NDksIDB4MDQ0QSwgMHgwNDRCLCAweDA0NEMsIDB4MDQ0RCwgMHgwNDRFLCAweDA0NEYsCisgICAgMHgyMTE2LCAweDA0NTEsIDB4MDQ1MiwgMHgwNDUzLCAweDA0NTQsIDB4MDQ1NSwgMHgwNDU2LCAweDA0NTcsCisgICAgMHgwNDU4LCAweDA0NTksIDB4MDQ1QSwgMHgwNDVCLCAweDA0NUMsIDB4MDBBNywgMHgwNDVFLCAweDA0NUYKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV84ODU5XzYgPSB7CisgICAgOTYsIDMyLCBYMlVfSVNPfFgyVV9TVEQsQUxfQVJBQklDLCJJU08gTGF0aW4vQXJhYmljIiwiYXJhYmljLWlzbyIsMTI3LCJHIiwKKyAgICAweDAwQTAsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4MDBBNCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4MDYwQywgMHgwMEFELCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDA2MUIsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4MDYxRiwKKyAgICAweGZmZmQsIDB4MDYyMSwgMHgwNjIyLCAweDA2MjMsIDB4MDYyNCwgMHgwNjI1LCAweDA2MjYsIDB4MDYyNywKKyAgICAweDA2MjgsIDB4MDYyOSwgMHgwNjJBLCAweDA2MkIsIDB4MDYyQywgMHgwNjJELCAweDA2MkUsIDB4MDYyRiwKKyAgICAweDA2MzAsIDB4MDYzMSwgMHgwNjMyLCAweDA2MzMsIDB4MDYzNCwgMHgwNjM1LCAweDA2MzYsIDB4MDYzNywKKyAgICAweDA2MzgsIDB4MDYzOSwgMHgwNjNBLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweDA2NDAsIDB4MDY0MSwgMHgwNjQyLCAweDA2NDMsIDB4MDY0NCwgMHgwNjQ1LCAweDA2NDYsIDB4MDY0NywKKyAgICAweDA2NDgsIDB4MDY0OSwgMHgwNjRBLCAweDA2NEIsIDB4MDY0QywgMHgwNjRELCAweDA2NEUsIDB4MDY0RiwKKyAgICAweDA2NTAsIDB4MDY1MSwgMHgwNjUyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZAorfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1Xzg4NTlfNyA9IHsKKyAgICA5NiwgMzIsIFgyVV9JU098WDJVX1NURCxBTF9HUkVFSywiSVNPIExhdGluL0dyZWVrIiwgImdyZWVrLWlzbyIsIDEyNiwgIkYiLAorICAgIDB4MDBBMCwgMHgyMDE4LCAweDIwMTksIDB4MDBBMywgMHhGRkZELCAweEZGRkQsIDB4MDBBNiwgMHgwMEE3LAorICAgIDB4MDBBOCwgMHgwMEE5LCAweEZGRkQsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4RkZGRCwgMHgyMDE1LAorICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMzg0LCAweDAzODUsIDB4MDM4NiwgMHgwMEI3LAorICAgIDB4MDM4OCwgMHgwMzg5LCAweDAzOEEsIDB4MDBCQiwgMHgwMzhDLCAweDAwQkQsIDB4MDM4RSwgMHgwMzhGLAorICAgIDB4MDM5MCwgMHgwMzkxLCAweDAzOTIsIDB4MDM5MywgMHgwMzk0LCAweDAzOTUsIDB4MDM5NiwgMHgwMzk3LAorICAgIDB4MDM5OCwgMHgwMzk5LCAweDAzOUEsIDB4MDM5QiwgMHgwMzlDLCAweDAzOUQsIDB4MDM5RSwgMHgwMzlGLAorICAgIDB4MDNBMCwgMHgwM0ExLCAweGZmZmQsIDB4MDNBMywgMHgwM0E0LCAweDAzQTUsIDB4MDNBNiwgMHgwM0E3LAorICAgIDB4MDNBOCwgMHgwM0E5LCAweDAzQUEsIDB4MDNBQiwgMHgwM0FDLCAweDAzQUQsIDB4MDNBRSwgMHgwM0FGLAorICAgIDB4MDNCMCwgMHgwM0IxLCAweDAzQjIsIDB4MDNCMywgMHgwM0I0LCAweDAzQjUsIDB4MDNCNiwgMHgwM0I3LAorICAgIDB4MDNCOCwgMHgwM0I5LCAweDAzQkEsIDB4MDNCQiwgMHgwM0JDLCAweDAzQkQsIDB4MDNCRSwgMHgwM0JGLAorICAgIDB4MDNDMCwgMHgwM0MxLCAweDAzQzIsIDB4MDNDMywgMHgwM0M0LCAweDAzQzUsIDB4MDNDNiwgMHgwM0M3LAorICAgIDB4MDNDOCwgMHgwM0M5LCAweDAzQ0EsIDB4MDNDQiwgMHgwM0NDLCAweDAzQ0QsIDB4MDNDRSwgMHhmZmZkCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfODg1OV84ID0geworICAgIDk2LCAzMiwgWDJVX0lTT3xYMlVfU1RELEFMX0hFQlJFVywiSVNPIExhdGluL0hlYnJldyIsImhlYnJldy1pc28iLDEyMSwiSCIsCisgICAgMHgwMEEwLCAweGZmZmQsIDB4MDBBMiwgMHgwMEEzLCAweDAwQTQsIDB4MDBBNSwgMHgwMEE2LCAweDAwQTcsCisgICAgMHgwMEE4LCAweDAwQTksIDB4MDBENywgMHgwMEFCLCAweDAwQUMsIDB4MDBBRCwgMHgwMEFFLCAweDIwM0UsCisgICAgMHgwMEIwLCAweDAwQjEsIDB4MDBCMiwgMHgwMEIzLCAweDAwQjQsIDB4MDBCNSwgMHgwMEI2LCAweDAwQjcsCisgICAgMHgwMEI4LCAweDAwQjksIDB4MDBGNywgMHgwMEJCLCAweDAwQkMsIDB4MDBCRCwgMHgwMEJFLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDIwMTcsCisgICAgMHgwNUQwLCAweDA1RDEsIDB4MDVEMiwgMHgwNUQzLCAweDA1RDQsIDB4MDVENSwgMHgwNUQ2LCAweDA1RDcsCisgICAgMHgwNUQ4LCAweDA1RDksIDB4MDVEQSwgMHgwNURCLCAweDA1REMsIDB4MDVERCwgMHgwNURFLCAweDA1REYsCisgICAgMHgwNUUwLCAweDA1RTEsIDB4MDVFMiwgMHgwNUUzLCAweDA1RTQsIDB4MDVFNSwgMHgwNUU2LCAweDA1RTcsCisgICAgMHgwNUU4LCAweDA1RTksIDB4MDVFQSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV84ODU5XzkgPSB7CisgICAgOTYsIDMyLCBYMlVfSVNPfFgyVV9TVEQsIEFMX1JPTUFOLCAiSVNPIExhdGluLTUiLCAibGF0aW41IiwgMTQ4LCAiTSIsCisgICAgMHgwMEEwLCAweDAwQTEsIDB4MDBBMiwgMHgwMEEzLCAweDAwQTQsIDB4MDBBNSwgMHgwMEE2LCAweDAwQTcsCisgICAgMHgwMEE4LCAweDAwQTksIDB4MDBBQSwgMHgwMEFCLCAweDAwQUMsIDB4MDBBRCwgMHgwMEFFLCAweDAwQUYsCisgICAgMHgwMEIwLCAweDAwQjEsIDB4MDBCMiwgMHgwMEIzLCAweDAwQjQsIDB4MDBCNSwgMHgwMEI2LCAweDAwQjcsCisgICAgMHgwMEI4LCAweDAwQjksIDB4MDBCQSwgMHgwMEJCLCAweDAwQkMsIDB4MDBCRCwgMHgwMEJFLCAweDAwQkYsCisgICAgMHgwMEMwLCAweDAwQzEsIDB4MDBDMiwgMHgwMEMzLCAweDAwQzQsIDB4MDBDNSwgMHgwMEM2LCAweDAwQzcsCisgICAgMHgwMEM4LCAweDAwQzksIDB4MDBDQSwgMHgwMENCLCAweDAwQ0MsIDB4MDBDRCwgMHgwMENFLCAweDAwQ0YsCisgICAgMHgwMTFFLCAweDAwRDEsIDB4MDBEMiwgMHgwMEQzLCAweDAwRDQsIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsCisgICAgMHgwMEQ4LCAweDAwRDksIDB4MDBEQSwgMHgwMERCLCAweDAwREMsIDB4MDEzMCwgMHgwMTVFLCAweDAwREYsCisgICAgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwgMHgwMEUzLCAweDAwRTQsIDB4MDBFNSwgMHgwMEU2LCAweDAwRTcsCisgICAgMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLCAweDAwRUMsIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsCisgICAgMHgwMTFGLCAweDAwRjEsIDB4MDBGMiwgMHgwMEYzLCAweDAwRjQsIDB4MDBGNSwgMHgwMEY2LCAweDAwRjcsCisgICAgMHgwMEY4LCAweDAwRjksIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDEzMSwgMHgwMTVGLCAweDAwRkYKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV84ODU5XzEwID0geworICAgIDk2LCAzMiwgWDJVX0lTT3xYMlVfU1RELCBBTF9ST01BTiwgIklTTyBMYXRpbi02IiwgImxhdGluNiIsIDE1NywgIlYiLAorICAgIDB4MDBhMCwgMHgwMTA0LCAweDAxMTIsIDB4MDEyMiwgMHgwMTJhLCAweDAxMjgsIDB4MDEzNiwgMHgwMTNiLAorICAgIDB4MDE0MywgMHgwMTU2LCAweDAxNjAsIDB4MDE2NiwgMHgwMTdkLCAweDAwYWQsIDB4MDEzOCwgMHgwMTRhLAorICAgIDB4MDExMSwgMHgwMTA1LCAweDAxMTMsIDB4MDEyMywgMHgwMTJiLCAweDAxMjksIDB4MDEzNywgMHgwMTNjLAorICAgIDB4MDE0NCwgMHgwMTU3LCAweDAxNjEsIDB4MDE2NywgMHgwMTdlLCAweDAwYmQsIDB4MDBiZSwgMHgwMTRiLAorICAgIDB4MDEwMCwgMHgwMGMxLCAweDAwYzIsIDB4MDBjMywgMHgwMGM0LCAweDAwYzUsIDB4MDBjNiwgMHgwMTJlLAorICAgIDB4MDEwYywgMHgwMGM5LCAweDAxMTgsIDB4MDBjYiwgMHgwMTE2LCAweDAwY2QsIDB4MDBjZSwgMHgwMGNmLAorICAgIDB4MDExMCwgMHgwMTQ1LCAweDAxNGMsIDB4MDBkZSwgMHgwMGQ0LCAweDAwZDUsIDB4MDBkNiwgMHgwMTY4LAorICAgIDB4MDBkOCwgMHgwMTcyLCAweDAwZGEsIDB4MDBkYiwgMHgwMGRjLCAweDAwZGQsIDB4MDBkZSwgMHgwMTZhLAorICAgIDB4MDEwMSwgMHgwMGUxLCAweDAwZTIsIDB4MDBkMywgMHgwMGU0LCAweDAwZTUsIDB4MDBlNiwgMHgwMTJmLAorICAgIDB4MDEwZCwgMHgwMGU5LCAweDAxMTksIDB4MDBlYiwgMHgwMTE3LCAweDAwZWQsIDB4MDBlZSwgMHgwMGVmLAorICAgIDB4MDBmMCwgMHgwMGYxLCAweDAxNGQsIDB4MDBmMywgMHgwMGY0LCAweDAwZjUsIDB4MDBmNiwgMHgwMTY5LAorICAgIDB4MDBmOCwgMHgwMTczLCAweDAwZmEsIDB4MDBmYiwgMHgwMGZjLCAweDAwZmQsIDB4MDBmZSwgMHgwMTZiCit9OworCisvKiBMYXRpbi05IChJU08gODg1OS0xNSkgaXMgdGhlIHNhbWUgYXMgTGF0aW4tMSB3aXRoIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKKyAqICAgQTQgaXMgRXVybyBTeW1ib2wgICAgICAgICAgIDIwQUMKKyAqICAgQTYgaXMgQ2FwaXRhbCBTIENhcm9uICAgICAgIDAxNjAKKyAqICAgQTggaXMgU21hbGwgcyBjYXJvbiAgICAgICAgIDAxNjEKKyAqICAgQjQgaXMgQ2FwaXRhbCBaIGNhcm9uICAgICAgIDAxN0QKKyAqICAgQjggaXMgU21hbGwgeiBjYXJvbiAgICAgICAgIDAxN0UKKyAqICAgQkMgaXMgQ2FwaXRhbCBPRSBsaWdhdHVyZSAgIDAxNTIKKyAqICAgQkQgaXMgU21hbGwgb2UgbGlnYXR1cmUgICAgIDAxNTMKKyAqICAgQkUgaXMgQ2FwaXRhbCBZIGRpYWVyZXNpcyAgIDAxNzgKKyAqLworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfODg1OV8xNSA9IHsKKyAgICA5NiwgMzIsIFgyVV9JU098WDJVX1NURCwgQUxfUk9NQU4sICJJU08gTGF0aW4tOSIsICJsYXRpbjkiLCAwLCBOVUxMLAorICAgIDB4MDBBMCwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgyMEFDLCAweDAwQTUsIDB4MDE2MCwgMHgwMEE3LAorICAgIDB4MDE2MSwgMHgwMEE5LCAweDAwQUEsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLAorICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMTdELCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAorICAgIDB4MDE3RSwgMHgwMEI5LCAweDAwQkEsIDB4MDBCQiwgMHgwMTUyLCAweDAxNTMsIDB4MDE3OCwgMHgwMEJGLAorICAgIDB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LCAweDAwQzUsIDB4MDBDNiwgMHgwMEM3LAorICAgIDB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLCAweDAwQ0QsIDB4MDBDRSwgMHgwMENGLAorICAgIDB4MDBEMCwgMHgwMEQxLCAweDAwRDIsIDB4MDBEMywgMHgwMEQ0LCAweDAwRDUsIDB4MDBENiwgMHgwMEQ3LAorICAgIDB4MDBEOCwgMHgwMEQ5LCAweDAwREEsIDB4MDBEQiwgMHgwMERDLCAweDAwREQsIDB4MDBERSwgMHgwMERGLAorICAgIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LCAweDAwRTUsIDB4MDBFNiwgMHgwMEU3LAorICAgIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLCAweDAwRUQsIDB4MDBFRSwgMHgwMEVGLAorICAgIDB4MDBGMCwgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LCAweDAwRjUsIDB4MDBGNiwgMHgwMEY3LAorICAgIDB4MDBGOCwgMHgwMEY5LCAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLCAweDAwRkQsIDB4MDBGRSwgMHgwMEZGCit9OworCisvKiBEeWFkaWMgU3lzdGVtcyBEeWFsb2cvWCBBUEwsIGNvcnJlc3BvbmRzIHRvIEFQTFRFUk1JLlRURi4gKi8KKy8qIFVuaWNvZGUgbWFwcGluZ3MgYWNjb3JkaW5nIHRvIElTTy1JRUMgLyBKVEMgMSAvIFNDIDIyIE4gMzA2NywgMTk5OS0xMi0yOC4gKi8KKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2FwbDIgPSB7ICAgICAgICAgIC8qIER5YWRpYyBTeXN0ZW1zIEFQTCArIGJveCBkcmF3aW5ncyAqLworICAgIDk2LCAzMiwgWDJVX1NURCwgQUxfUk9NQU4sICJEeWFkaWMgU3lzdGVtcyBBUEwiLCAiYXBsLWR5YWRpYyIsIDAsIE5VTEwsCisgICAgMHgwMGEwLCAweDAwZDcsIDB4MjUwMiwgMHgyNTI0LCAweDAwYTIsIDB4MjUxMCwgMHgyNTE0LCAweDI1MzQsCisgICAgMHgyNTJjLCAweDI1MWMsIDB4MjUwMCwgMHgyNTNjLCAweDI1MTgsIDB4MjUwYywgMHgyMjA2LCAweDAwZjcsCisgICAgMHgyMjYwLCAweDIyYzQsIDB4MjM3NSwgMHgyMzc0LCAweDIzN2EsIDB4MjIwYSwgMHgyMjYxLCAweDIyNjUsCisgICAgMHgyMjY0LCAweDIyYTUsIDB4MjJhNCwgMHgyMTkwLCAweDIyMTgsIDB4MjM1ZCwgMHgyMzNmLCAweDIzNDAsCisgICAgMHgyMzRlLCAweDIzNTUsIDB4MjM0YiwgMHgyMzUyLCAweDIzNzIsIDB4MjM3MSwgMHgyMzY4LCAweDIzNWYsCisgICAgMHgyNWFmLCAweDIzNWUsIDB4MjMzOSwgMHgyMzZiLCAweDIzNmEsIDB4MjI2MiwgMHgyMzBhLCAweDIzMDgsCisgICAgMHgyMzQ5LCAweDIyMjksIDB4MjIyYSwgMHgyMzZjLCAweDAwYTMsIDB4MjMzZCwgMHgyMjk2LCAweDIyYTIsCisgICAgMHgyMmEzLCAweDIzMzcsIDB4MDBhZiwgMHgyMzczLCAweDAwYTgsIDB4MjVjYiwgMHgyMTkyLCAweDIyMjgsCisgICAgMHgyMjgyLCAweDIyODMsIDB4MjM1OSwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsCisgICAgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsCisgICAgMHgwMDRlLCAweDAwNGYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsCisgICAgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MjIwNywgMHgyMTkxLCAweDIxOTMKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9hcGwzID0geyAgICAgICAgICAvKiBBUEwtUGx1cyA9IEFQTC0yMDAwICovCisgICAgMTI4LCAwLCBYMlVfQ1hHLCBBTF9ST01BTiwgIkFQTC0yMDAwIiwgImFwbC0yMDAwIiwgMCwgTlVMTCwKKyAgICAweDIwYWMsIDB4MjJhMywgMHgyMmE0LCAweDIyYTUsIDB4MjE5MCwgMHgyMTkyLCAweDIxOTEsIDB4MjE5MywKKyAgICAweDIyNjQsIDB4MjI2NSwgMHgyMzcyLCAweDIzNzEsIDB4MjVhZiwgMHgyMzVlLCAweDIzMzksIDB4MjM1OSwKKyAgICAweDIzNmIsIDB4MjIwNiwgMHgyMjA3LCAweDIzNGIsIDB4MjM1MiwgMHgyMzU1LCAweDIzNGUsIDB4MjMwOCwKKyAgICAweDIzMGEsIDB4MjM0MCwgMHgyMzNmLCAweDIyODIsIDB4MjI4MywgMHgyMjI5LCAweDIyMmEsIDB4MjIyOCwKKyAgICAweDAwYTAsIDB4MDBhMSwgMHgwMGEyLCAweDAwYTMsIDB4MjJhMiwgMHgwMGE1LCAweDAwYTYsIDB4MDBhNywKKyAgICAweDAwYTgsIDB4MjM1ZCwgMHgyMmM0LCAweDAwYWIsIDB4MjI2MCwgMHgyMjYxLCAweDIzNmEsIDB4MDBhZiwKKyAgICAweDIyMTgsIDB4MjVjYiwgMHgyMzNkLCAweDIzNDksIDB4MjI5NiwgMHgyMzVmLCAweDAwYjYsIDB4MDBiNywKKyAgICAweDIzN2EsIDB4MjIwYSwgMHgyMzc3LCAweDAwYmIsIDB4MjM3MywgMHgyMzc0LCAweDIzNzUsIDB4MDBiZiwKKyAgICAweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsIDB4MDBjNCwgMHgwMGM1LCAweDAwYzYsIDB4MDBjNywKKyAgICAweDAwYzgsIDB4MDBjOSwgMHgwMGNhLCAweDAwY2IsIDB4MDBjYywgMHgwMGNkLCAweDAwY2UsIDB4MDBjZiwKKyAgICAweDIzNmMsIDB4MDBkMSwgMHgwMGQyLCAweDAwZDMsIDB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkNywKKyAgICAweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsIDB4MDBkYywgMHgwMGRkLCAweDIzMzcsIDB4MDBkZiwKKyAgICAweDAwZTAsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsIDB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywKKyAgICAweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKKyAgICAweDIzNjQsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsIDB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywKKyAgICAweDIyMDUsIDB4MDBmOSwgMHgwMGZhLCAweDAwZmIsIDB4MDBmYywgMHgwMGZkLCAweDIzNjgsIDB4MDBmZgorfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2FwbDQgPSB7ICAgICAgICAgIC8qIElCTSBBUEwyICovCisgICAgMTI4LCAwLCBYMlVfQ1hHLCBBTF9ST01BTiwgIklCTSBBUEwyIiwgImFwbDItaWJtIiwgMCwgTlVMTCwKKyAgICAweDAwYzcsIDB4MDBmYywgMHgwMGU5LCAweDAwZTIsIDB4MDBlNCwgMHgwMGUwLCAweDAwZTUsIDB4MDBlNywKKyAgICAweDAwZWEsIDB4MDBlYiwgMHgwMGU4LCAweDAwZWYsIDB4MDBlZSwgMHgwMGVjLCAweDAwYzQsIDB4MDBjNSwKKyAgICAweDI1YWYsIDB4MjM1ZSwgMHgyMzM5LCAweDAwZjQsIDB4MDBmNiwgMHgwMGYyLCAweDAwZmIsIDB4MDBmOSwKKyAgICAweDIyYTQsIDB4MDBkNiwgMHgwMGRjLCAweDAwZjgsIDB4MDBhMywgMHgyMmE1LCAweDIxOTAsIDB4MjMzNiwKKyAgICAweDAwZTEsIDB4MDBlZCwgMHgwMGYzLCAweDAwZmEsIDB4MDBmMSwgMHgwMGQxLCAweDAwYWEsIDB4MDBiYSwKKyAgICAweDAwYmYsIDB4MjMwOCwgMHgwMGFjLCAweDIxOTIsIDB4MjIyYSwgMHgwMGExLCAweDIzNTUsIDB4MjM0ZSwKKyAgICAweDI1OTEsIDB4MjU5MiwgMHgyNTkzLCAweDI1MDIsIDB4MjUyNCwgMHgyMzVmLCAweDIyMDYsIDB4MjIwNywKKyAgICAweDIxOTIsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsIDB4MjU1ZCwgMHgyMTkwLCAweDIzMGEsIDB4MjUxMCwKKyAgICAweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsIDB4MjUwMCwgMHgyNTNjLCAweDIxOTEsIDB4MjE5MywKKyAgICAweDI1NWEsIDB4MjU1NCwgMHgyNTY5LCAweDI1NjYsIDB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MjI2MSwKKyAgICAweDIzNzgsIDB4MjM3NywgMHgyMjM1LCAweDIzMzcsIDB4MjM0MiwgMHgyMzNiLCAweDIyYTIsIDB4MjJhMywKKyAgICAweDIyYzQsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsIDB4MjU4NCwgMHgwMGE2LCAweDAwY2MsIDB4MjU4MCwKKyAgICAweDIzN2EsIDB4MDBkZiwgMHgyMjgyLCAweDIyODMsIDB4MjM1ZCwgMHgyMzcyLCAweDIzNzQsIDB4MjM3MSwKKyAgICAweDIzM2QsIDB4MjI5NiwgMHgyNWNiLCAweDIyMjgsIDB4MjM3MywgMHgyMzQ5LCAweDAwYzUsIDB4MjIyOSwKKyAgICAweDIzM2YsIDB4MjM0MCwgMHgyMjY1LCAweDIyNjQsIDB4MjI2MCwgMHgwMGQ3LCAweDAwZjcsIDB4MjM1OSwKKyAgICAweDIyMTgsIDB4MjM3NSwgMHgyMzZiLCAweDIzNGIsIDB4MjM1MiwgMHgwMGFmLCAweDAwYTgsIDB4MDBhMAorfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2FwbDUgPSB7ICAgICAgICAgIC8qIEFQTC0yNzQxICovCisgICAgMTI4LCAwLCBYMlVfQ1hHLCBBTF9ST01BTiwgIkFQTC0yNzQxIiwgImFwbC0yNzQxIiwgMCwgTlVMTCwKKyAgICAweDIwYWMsIDB4MjJhMywgMHgyMmE0LCAweDIyYTUsIDB4MjE5MCwgMHgyMTkyLCAweDIxOTEsIDB4MjE5MywKKyAgICAweDIyNjQsIDB4MjI2NSwgMHgyMzcyLCAweDIzNzEsIDB4MjVhZiwgMHgyMzVlLCAweDIzMzksIDB4MjM1OSwKKyAgICAweDIzNmIsIDB4MjIwNiwgMHgyMjA3LCAweDIzNGIsIDB4MjM1MiwgMHgyMzU1LCAweDIzNGUsIDB4MjMwOCwKKyAgICAweDIzMGEsIDB4MjM0MCwgMHgyMzNmLCAweDIyODIsIDB4MjI4MywgMHgyMjI5LCAweDIyMmEsIDB4MjIyOCwKKyAgICAweDAwYTAsIDB4MDBhMSwgMHgwMGEyLCAweDAwYTMsIDB4MjJhMiwgMHgyMzc4LCAweDIyNjEsIDB4MjMzNiwKKyAgICAweDAwYTgsIDB4MjM1ZCwgMHgyMmM0LCAweDIzNmMsIDB4MjI2MCwgMHgyMjYxLCAweDIzNmEsIDB4MDBhZiwKKyAgICAweDIyMTgsIDB4MjVjYiwgMHgyMzNkLCAweDIzNDksIDB4MjI5NiwgMHgyMzVmLCAweDAwYjYsIDB4MDBiNywKKyAgICAweDIzN2EsIDB4MjIwYSwgMHgyMzc3LCAweDIyNjIsIDB4MjM3MywgMHgyMzc0LCAweDIzNzUsIDB4MDBiZiwKKyAgICAweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsIDB4MDBjNCwgMHgwMGM1LCAweDAwYzYsIDB4MDBjNywKKyAgICAweDAwYzgsIDB4MDBjOSwgMHgyMzQyLCAweDIzM2IsIDB4MjUxMCwgMHgwMGNkLCAweDI1MDAsIDB4MjUzYywKKyAgICAweDIzNmMsIDB4MDBkMSwgMHgyMzUwLCAweDIzNTcsIDB4MjM0NywgMHgyMzQ4LCAweDAwZDYsIDB4MDBkNywKKyAgICAweDAwZDgsIDB4MjUxOCwgMHgyNTBjLCAweDI1MDIsIDB4MDBkYywgMHgyNTI0LCAweDIzMzcsIDB4MDBkZiwKKyAgICAweDAwZTAsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsIDB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywKKyAgICAweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKKyAgICAweDIzNjQsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsIDB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywKKyAgICAweDIyMDUsIDB4MDBmOSwgMHgwMGZhLCAweDAwZmIsIDB4MDBmYywgMHgyMjM1LCAweDIzNjgsIDB4MjM2NQorfTsKKworLyogOC1iaXQgR09TVCBzdGFuZGFyZCBzZXRzICovCisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9rb2k4ID0geworICAgIDk2LCAzMiwgWDJVX1NURCwgQUxfQ1lSSUwsICJLT0ktOCIsICJrb2k4IiwgMCwgTlVMTCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweDA0NEUsIDB4MDQzMCwgMHgwNDMxLCAweDA0NDYsIDB4MDQzNCwgMHgwNDM1LCAweDA0NDQsIDB4MDQzMywKKyAgICAweDA0NDUsIDB4MDQzOCwgMHgwNDM5LCAweDA0M0EsIDB4MDQzQiwgMHgwNDNDLCAweDA0M0QsIDB4MDQzRSwKKyAgICAweDA0M0YsIDB4MDQ0RiwgMHgwNDQwLCAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLCAweDA0MzYsIDB4MDQzMiwKKyAgICAweDA0NEMsIDB4MDQ0QiwgMHgwNDM3LCAweDA0NDgsIDB4MDQ0RCwgMHgwNDQ5LCAweDA0NDcsIDB4MDQ0QSwKKyAgICAweDA0MkUsIDB4MDQxMCwgMHgwNDExLCAweDA0MjYsIDB4MDQxNCwgMHgwNDE1LCAweDA0MjQsIDB4MDQxMywKKyAgICAweDA0MjUsIDB4MDQxOCwgMHgwNDE5LCAweDA0MUEsIDB4MDQxQiwgMHgwNDFDLCAweDA0MUQsIDB4MDQxRSwKKyAgICAweDA0MUYsIDB4MDQyRiwgMHgwNDIwLCAweDA0MjEsIDB4MDQyMiwgMHgwNDIzLCAweDA0MTYsIDB4MDQxMiwKKyAgICAweDA0MkMsIDB4MDQyQiwgMHgwNDE3LCAweDA0MjgsIDB4MDQyRCwgMHgwNDI5LCAweDA0MjcsIDB4ZmZmZAorfTsKKworLyogT3RoZXIgS09JLTggYmFzZWQgc2V0cyAqLworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfa29pOHIgPSB7ICAgICAgICAgLyogKFJ1c3NpYSkgVGFibGUgZnJvbSBSRkMxNDg5ICovCisgICAgMTI4LCAwLCBYMlVfQ1AsIEFMX0NZUklMLCAiS09JOC1SIiwgImtvaThyIiwgMCwgTlVMTCwKKyAgICAweDI1MDAsIDB4MjUwMiwgMHgyNTBDLCAweDI1MTAsIDB4MjUxNCwgMHgyNTE4LCAweDI1MUMsIDB4MjUyNCwKKyAgICAweDI1MkMsIDB4MjUzNCwgMHgyNTNDLCAweDI1ODAsIDB4MjU4NCwgMHgyNTg4LCAweDI1OEMsIDB4MjU5MCwKKyAgICAweDI1OTEsIDB4MjU5MiwgMHgyNTkzLCAweDIzMjAsIDB4MjVBMCwgMHgyMjE5LCAweDIyMUEsIDB4MjI0OCwKKyAgICAweDIyNjQsIDB4MjI2NSwgMHgwMEEwLCAweDIzMjEsIDB4MDBCMCwgMHgwMEIyLCAweDAwQjcsIDB4MDBGNywKKyAgICAweDI1NTAsIDB4MjU1MSwgMHgyNTUyLCAweDA0NTEsIDB4MjU1MywgMHgyNTU0LCAweDI1NTUsIDB4MjU1NiwKKyAgICAweDI1NTcsIDB4MjU1OCwgMHgyNTU5LCAweDI1NUEsIDB4MjU1QiwgMHgyNTVDLCAweDI1NUQsIDB4MjU1RSwKKyAgICAweDI1NUYsIDB4MjU2MCwgMHgyNTYxLCAweDA0MDEsIDB4MjU2MiwgMHgyNTYzLCAweDI1NjQsIDB4MjU2NSwKKyAgICAweDI1NjYsIDB4MjU2NywgMHgyNTY4LCAweDI1NjksIDB4MjU2QSwgMHgyNTZCLCAweDI1NkMsIDB4MDBBOSwKKyAgICAweDA0NEUsIDB4MDQzMCwgMHgwNDMxLCAweDA0NDYsIDB4MDQzNCwgMHgwNDM1LCAweDA0NDQsIDB4MDQzMywKKyAgICAweDA0NDUsIDB4MDQzOCwgMHgwNDM5LCAweDA0M0EsIDB4MDQzQiwgMHgwNDNDLCAweDA0M0QsIDB4MDQzRSwKKyAgICAweDA0M0YsIDB4MDQ0RiwgMHgwNDQwLCAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLCAweDA0MzYsIDB4MDQzMiwKKyAgICAweDA0NEMsIDB4MDQ0QiwgMHgwNDM3LCAweDA0NDgsIDB4MDQ0RCwgMHgwNDQ5LCAweDA0NDcsIDB4MDQ0QSwKKyAgICAweDA0MkUsIDB4MDQxMCwgMHgwNDExLCAweDA0MjYsIDB4MDQxNCwgMHgwNDE1LCAweDA0MjQsIDB4MDQxMywKKyAgICAweDA0MjUsIDB4MDQxOCwgMHgwNDE5LCAweDA0MUEsIDB4MDQxQiwgMHgwNDFDLCAweDA0MUQsIDB4MDQxRSwKKyAgICAweDA0MUYsIDB4MDQyRiwgMHgwNDIwLCAweDA0MjEsIDB4MDQyMiwgMHgwNDIzLCAweDA0MTYsIDB4MDQxMiwKKyAgICAweDA0MkMsIDB4MDQyQiwgMHgwNDE3LCAweDA0MjgsIDB4MDQyRCwgMHgwNDI5LCAweDA0MjcsIDB4MDQyQQorfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2tvaTh1ID0geyAgICAgICAgIC8qIChVa3JhaW5lKSBGcm9tIFJGQzIzMTkgKi8KKyAgIDEyOCwgMCwgWDJVX0NQLCBBTF9DWVJJTCwgIktPSTgtVSIsICJrb2k4dSIsIDAsIE5VTEwsCisgICAgMHgyNTAwLCAweDI1MDIsIDB4MjUwQywgMHgyNTEwLCAweDI1MTQsIDB4MjUxOCwgMHgyNTFDLCAweDI1MjQsCisgICAgMHgyNTJDLCAweDI1MzQsIDB4MjUzQywgMHgyNTgwLCAweDI1ODQsIDB4MjU4OCwgMHgyNThDLCAweDI1OTAsCisgICAgMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyMzIwLCAweDI1QTAsIDB4MjIxOSwgMHgyMjFBLCAweDIyNDgsCisgICAgMHgyMjY0LCAweDIyNjUsIDB4MDBBMCwgMHgyMzIxLCAweDAwQjAsIDB4MDBCMiwgMHgwMEI3LCAweDAwRjcsCisgICAgMHgyNTUwLCAweDI1NTEsIDB4MjU1MiwgMHgwNDUxLCAweDA0NTQsIDB4MjU1NCwgMHgwNDU2LCAweDA0NTcsCisgICAgMHgyNTU3LCAweDI1NTgsIDB4MjU1OSwgMHgyNTVBLCAweDI1NUIsIDB4MDQ5MSwgMHgyNTVELCAweDI1NUUsCisgICAgMHgyNTVGLCAweDI1NjAsIDB4MjU2MSwgMHgwNDAxLCAweDA0MDQsIDB4MjU2MywgMHgwNDA2LCAweDA0MDcsCisgICAgMHgyNTY2LCAweDI1NjcsIDB4MjU2OCwgMHgyNTY5LCAweDI1NkEsIDB4MDQ5MCwgMHgyNTZDLCAweDAwQTksCisgICAgMHgwNDRFLCAweDA0MzAsIDB4MDQzMSwgMHgwNDQ2LCAweDA0MzQsIDB4MDQzNSwgMHgwNDQ0LCAweDA0MzMsCisgICAgMHgwNDQ1LCAweDA0MzgsIDB4MDQzOSwgMHgwNDNBLCAweDA0M0IsIDB4MDQzQywgMHgwNDNELCAweDA0M0UsCisgICAgMHgwNDNGLCAweDA0NEYsIDB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywgMHgwNDM2LCAweDA0MzIsCisgICAgMHgwNDRDLCAweDA0NEIsIDB4MDQzNywgMHgwNDQ4LCAweDA0NEQsIDB4MDQ0OSwgMHgwNDQ3LCAweDA0NEEsCisgICAgMHgwNDJFLCAweDA0MTAsIDB4MDQxMSwgMHgwNDI2LCAweDA0MTQsIDB4MDQxNSwgMHgwNDI0LCAweDA0MTMsCisgICAgMHgwNDI1LCAweDA0MTgsIDB4MDQxOSwgMHgwNDFBLCAweDA0MUIsIDB4MDQxQywgMHgwNDFELCAweDA0MUUsCisgICAgMHgwNDFGLCAweDA0MkYsIDB4MDQyMCwgMHgwNDIxLCAweDA0MjIsIDB4MDQyMywgMHgwNDE2LCAweDA0MTIsCisgICAgMHgwNDJDLCAweDA0MkIsIDB4MDQxNywgMHgwNDI4LCAweDA0MkQsIDB4MDQyOSwgMHgwNDI3LCAweDA0MkEKK307CisKKy8qIFBDIENvZGUgUGFnZXMgKi8KKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2NwNDM3ID0geworICAgIDEyOCwgMCwgWDJVX0NQLCBBTF9ST01BTiwiUEMgQ29kZSBQYWdlIDQzNyIsImNwNDM3IiwgMCwgTlVMTCwKKyAgICAweDAwYzcsIDB4MDBmYywgMHgwMGU5LCAweDAwZTIsIDB4MDBlNCwgMHgwMGUwLCAweDAwZTUsIDB4MDBlNywKKyAgICAweDAwZWEsIDB4MDBlYiwgMHgwMGU4LCAweDAwZWYsIDB4MDBlZSwgMHgwMGVjLCAweDAwYzQsIDB4MDBjNSwKKyAgICAweDAwYzksIDB4MDBlNiwgMHgwMGM2LCAweDAwZjQsIDB4MDBmNiwgMHgwMGYyLCAweDAwZmIsIDB4MDBmOSwKKyAgICAweDAwZmYsIDB4MDBkNiwgMHgwMGRjLCAweDAwYTIsIDB4MDBhMywgMHgwMGE1LCAweDIwYTcsIDB4MDE5MiwKKyAgICAweDAwZTEsIDB4MDBlZCwgMHgwMGYzLCAweDAwZmEsIDB4MDBmMSwgMHgwMGQxLCAweDAwYWEsIDB4MDBiYSwKKyAgICAweDAwYmYsIDB4MjMxMCwgMHgwMGFjLCAweDAwYmQsIDB4MDBiYywgMHgwMGExLCAweDAwYWIsIDB4MDBiYiwKKyAgICAweDI1OTEsIDB4MjU5MiwgMHgyNTkzLCAweDI1MDIsIDB4MjUyNCwgMHgyNTYxLCAweDI1NjIsIDB4MjU1NiwKKyAgICAweDI1NTUsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsIDB4MjU1ZCwgMHgyNTVjLCAweDI1NWIsIDB4MjUxMCwKKyAgICAweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsIDB4MjUwMCwgMHgyNTNjLCAweDI1NWUsIDB4MjU1ZiwKKyAgICAweDI1NWEsIDB4MjU1NCwgMHgyNTY5LCAweDI1NjYsIDB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MjU2NywKKyAgICAweDI1NjgsIDB4MjU2NCwgMHgyNTY1LCAweDI1NTksIDB4MjU1OCwgMHgyNTUyLCAweDI1NTMsIDB4MjU2YiwKKyAgICAweDI1NmEsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsIDB4MjU4NCwgMHgyNThjLCAweDI1OTAsIDB4MjU4MCwKKyAgICAweDAzYjEsIDB4MDBkZiwgMHgwMzkzLCAweDAzYzAsIDB4MDNhMywgMHgwM2MzLCAweDAwYjUsIDB4MDNjNCwKKyAgICAweDAzYTYsIDB4MDM5OCwgMHgwM2E5LCAweDAzYjQsIDB4MjIxZSwgMHgwM2M2LCAweDAzYjUsIDB4MjIyOSwKKyAgICAweDIyNjEsIDB4MDBiMSwgMHgyMjY1LCAweDIyNjQsIDB4MjMyMCwgMHgyMzIxLCAweDAwZjcsIDB4MjI0OCwKKyAgICAweDAwYjAsIDB4MjIxOSwgMHgwMGI3LCAweDIyMWEsIDB4MjA3ZiwgMHgwMGIyLCAvKiAweDI1YWUgKi8gMHgyNWEwLCAweDAwYTAKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9tYXpvdmlhID0geworICAgIDEyOCwgMCwgWDJVX0NQLCBBTF9ST01BTiwiUG9saXNoIE1hem92aWEgUEMgQ29kZSBQYWdlIiwibWF6b3ZpYSIsIDAsIE5VTEwsCisgICAgMHgwMGM3LCAweDAwZmMsIDB4MDBlOSwgMHgwMGUyLCAweDAwZTQsIDB4MDBlMCwgMHgwMTA1LCAweDAwZTcsIC8qIDgwICovCisgICAgMHgwMGVhLCAweDAwZWIsIDB4MDBlOCwgMHgwMGVmLCAweDAwZWUsIDB4MDEwNywgMHgwMGM0LCAweDAxMDQsIC8qIDg4ICovCisgICAgMHgwMTE4LCAweDAxMTksIDB4MDE0MiwgMHgwMGY0LCAweDAwZjYsIDB4MDEwNiwgMHgwMGZiLCAweDAwZjksIC8qIDkwICovCisgICAgMHgwMTVhLCAweDAwZDYsIDB4MDBkYywgMHgwMGEyLCAweDAxNDEsIDB4MDBhNSwgMHgwMTViLCAweDAxOTIsIC8qIDk4ICovCisgICAgMHgwMTc5LCAweDAxN2IsIDB4MDBmMywgMHgwMGQzLCAweDAxNDQsIDB4MDE0MywgMHgwMTdhLCAweDAxN2MsIC8qIGEwICovCisgICAgMHgwMGJmLCAweDIzMTAsIDB4MDBhYywgMHgwMGJkLCAweDAwYmMsIDB4MDBhMSwgMHgwMGFiLCAweDAwYmIsIC8qIGE4ICovCisgICAgMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLCAweDI1MjQsIDB4MjU2MSwgMHgyNTYyLCAweDI1NTYsIC8qIGIwICovCisgICAgMHgyNTU1LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LCAweDI1NWQsIDB4MjU1YywgMHgyNTViLCAweDI1MTAsIC8qIGI4ICovCisgICAgMHgyNTE0LCAweDI1MzQsIDB4MjUyYywgMHgyNTFjLCAweDI1MDAsIDB4MjUzYywgMHgyNTVlLCAweDI1NWYsIC8qIGMwICovCisgICAgMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LCAweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDI1NjcsIC8qIGM4ICovCisgICAgMHgyNTY4LCAweDI1NjQsIDB4MjU2NSwgMHgyNTU5LCAweDI1NTgsIDB4MjU1MiwgMHgyNTUzLCAweDI1NmIsIC8qIGQwICovCisgICAgMHgyNTZhLCAweDI1MTgsIDB4MjUwYywgMHgyNTg4LCAweDI1ODQsIDB4MjU4YywgMHgyNTkwLCAweDI1ODAsIC8qIGQ4ICovCisgICAgMHgwM2IxLCAweDAwZGYsIDB4MDM5MywgMHgwM2MwLCAweDAzYTMsIDB4MDNjMywgMHgwMGI1LCAweDAzYzQsIC8qIGUwICovCisgICAgMHgwM2E2LCAweDAzOTgsIDB4MDNhOSwgMHgwM2I0LCAweDIyMWUsIDB4MDNjNiwgMHgwM2I1LCAweDIyMjksIC8qIGU4ICovCisgICAgMHgyMjYxLCAweDAwYjEsIDB4MjI2NSwgMHgyMjY0LCAweDIzMjAsIDB4MjMyMSwgMHgwMGY3LCAweDIyNDgsIC8qIGYwICovCisgICAgMHgwMGIwLCAweDIyMTksIDB4MDBiNywgMHgyMjFhLCAweDIwN2YsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAgIC8qIGY4ICovCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfY3A4NTAgPSB7CisgICAgMTI4LCAwLCBYMlVfQ1AsIEFMX1JPTUFOLCJQQyBDb2RlIFBhZ2UgODUwIiwiY3A4NTAiLCAwLCBOVUxMLAorICAgIDB4MDBjNywgMHgwMGZjLCAweDAwZTksIDB4MDBlMiwgMHgwMGU0LCAweDAwZTAsIDB4MDBlNSwgMHgwMGU3LAorICAgIDB4MDBlYSwgMHgwMGViLCAweDAwZTgsIDB4MDBlZiwgMHgwMGVlLCAweDAwZWMsIDB4MDBjNCwgMHgwMGM1LAorICAgIDB4MDBjOSwgMHgwMGU2LCAweDAwYzYsIDB4MDBmNCwgMHgwMGY2LCAweDAwZjIsIDB4MDBmYiwgMHgwMGY5LAorICAgIDB4MDBmZiwgMHgwMGQ2LCAweDAwZGMsIDB4MDBmOCwgMHgwMGEzLCAweDAwZDgsIDB4MDBkNywgMHgwMTkyLAorICAgIDB4MDBlMSwgMHgwMGVkLCAweDAwZjMsIDB4MDBmYSwgMHgwMGYxLCAweDAwZDEsIDB4MDBhYSwgMHgwMGJhLAorICAgIDB4MDBiZiwgMHgwMGFlLCAweDAwYWMsIDB4MDBiZCwgMHgwMGJjLCAweDAwYTEsIDB4MDBhYiwgMHgwMGJiLAorICAgIDB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwgMHgyNTI0LCAweDAwYzEsIDB4MDBjMiwgMHgwMGMwLAorICAgIDB4MDBhOSwgMHgyNTYzLCAweDI1NTEsIDB4MjU1NywgMHgyNTVkLCAweDAwYTIsIDB4MDBhNSwgMHgyNTEwLAorICAgIDB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywgMHgyNTAwLCAweDI1M2MsIDB4MDBlMywgMHgwMGMzLAorICAgIDB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwgMHgyNTYwLCAweDI1NTAsIDB4MjU2YywgMHgwMGE0LAorICAgIDB4MDBmMCwgMHgwMGQwLCAweDAwY2EsIDB4MDBjYiwgMHgwMGM4LCAweDAxMzEsIDB4MDBjZCwgMHgwMGNlLAorICAgIDB4MDBjZiwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwgMHgyNTg0LCAweDAwYTYsIDB4MDBjYywgMHgyNTgwLAorICAgIDB4MDBkMywgMHgwMGRmLCAweDAwZDQsIDB4MDBkMiwgMHgwMGY1LCAweDAwZDUsIDB4MDBiNSwgMHgwMGZlLAorICAgIDB4MDBkZSwgMHgwMGRhLCAweDAwZGIsIDB4MDBkOSwgMHgwMGZkLCAweDAwZGQsIDB4MDBhZiwgMHgwMGI0LAorICAgIDB4MDBhZCwgMHgwMGIxLCAweDIwMTcsIDB4MDBiZSwgMHgwMGI2LCAweDAwYTcsIDB4MDBmNywgMHgwMGI4LAorICAgIDB4MDBiMCwgMHgwMGE4LCAweDAwYjcsIDB4MDBiOSwgMHgwMGIzLCAweDAwYjIsIDB4MjVhMCwgMHgwMGEwCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfY3A4NTIgPSB7CisgICAgMTI4LCAwLCBYMlVfQ1AsIEFMX1JPTUFOLCJQQyBDb2RlIFBhZ2UgODUyIiwiY3A4NTIiLCAwLCBOVUxMLAorICAgIDB4MDBjNywgMHgwMGZjLCAweDAwZTksIDB4MDBlMiwgMHgwMGU0LCAweDAxNmYsIDB4MDEwNywgMHgwMGU3LAorICAgIDB4MDE0MiwgMHgwMGViLCAweDAxNTAsIDB4MDE1MSwgMHgwMGVlLCAweDAxNzksIDB4MDBjNCwgMHgwMTA2LAorICAgIDB4MDBjOSwgMHgwMTM5LCAweDAxM2EsIDB4MDBmNCwgMHgwMGY2LCAweDAxM2QsIDB4MDEzZSwgMHgwMTVhLAorICAgIDB4MDE1YiwgMHgwMGQ2LCAweDAwZGMsIDB4MDE2NCwgMHgwMTY1LCAweDAxNDEsIDB4MDBkNywgMHgwMTBkLAorICAgIDB4MDBlMSwgMHgwMGVkLCAweDAwZjMsIDB4MDBmYSwgMHgwMTA0LCAweDAxMDUsIDB4MDE3ZCwgMHgwMTdlLAorICAgIDB4MDExOCwgMHgwMTE5LCAweDAwYWMsIDB4MDE3YSwgMHgwMTBjLCAweDAxNWYsIDB4MDBhYiwgMHgwMGJiLAorICAgIDB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwgMHgyNTI0LCAweDAwYzEsIDB4MDBjMiwgMHgwMTFhLAorICAgIDB4MDE1ZSwgMHgyNTYzLCAweDI1NTEsIDB4MjU1NywgMHgyNTVkLCAweDAxN2IsIDB4MDE3YywgMHgyNTEwLAorICAgIDB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywgMHgyNTAwLCAweDI1M2MsIDB4MDEwMiwgMHgwMTAzLAorICAgIDB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwgMHgyNTYwLCAweDI1NTAsIDB4MjU2YywgMHgwMGE0LAorICAgIDB4MDExMSwgMHgwMTEwLCAweDAxMGUsIDB4MDBjYiwgMHgwMTBmLCAweDAxNDcsIDB4MDBjZCwgMHgwMGNlLAorICAgIDB4MDExYiwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwgMHgyNTg0LCAweDAxNjIsIDB4MDE2ZSwgMHgyNTgwLAorICAgIDB4MDBkMywgMHgwMGRmLCAweDAwZDQsIDB4MDE0MywgMHgwMTQ0LCAweDAxNDgsIDB4MDE2MCwgMHgwMTYxLAorICAgIDB4MDE1NCwgMHgwMGRhLCAweDAxNTUsIDB4MDE3MCwgMHgwMGZkLCAweDAwZGQsIDB4MDE2MywgMHgwMGI0LAorICAgIDB4MDBhZCwgMHgwMmRkLCAweDAyZGIsIDB4MDJjNywgMHgwMmQ4LCAweDAwYTcsIDB4MDBmNywgMHgwMGI4LAorICAgIDB4MDBiMCwgMHgwMGE4LCAweDAyZDksIDB4MDE3MSwgMHgwMTU4LCAweDAxNTksIDB4MjVhMCwgMHgwMGEwCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfY3A4NTUgPSB7ICAgICAgICAgLyogQ1A4NTUgQ3lyaWxsaWMgdG8gVW5pY29kZSAqLworICAgIDEyOCwgMCwgWDJVX0NQLCBBTF9DWVJJTCwiUEMgQ29kZSBQYWdlIDg1NSIsImNwODU1IiwgMCwgTlVMTCwKKyAgICAweDA0NTIsIDB4MDQwMiwgMHgwNDUzLCAweDA0MDMsIDB4MDQ1MSwgMHgwNDAxLCAweDA0NTQsIDB4MDQwNCwKKyAgICAweDA0NTUsIDB4MDQwNSwgMHgwNDU2LCAweDA0MDYsIDB4MDQ1NywgMHgwNDA3LCAweDA0NTgsIDB4MDQwOCwKKyAgICAweDA0NTksIDB4MDQwOSwgMHgwNDVhLCAweDA0MGEsIDB4MDQ1YiwgMHgwNDBiLCAweDA0NWMsIDB4MDQwYywKKyAgICAweDA0NWUsIDB4MDQwZSwgMHgwNDVmLCAweDA0MGYsIDB4MDQ0ZSwgMHgwNDJlLCAweDA0NGEsIDB4MDQyYSwKKyAgICAweDA0MzAsIDB4MDQxMCwgMHgwNDMxLCAweDA0MTEsIDB4MDQ0NiwgMHgwNDI2LCAweDA0MzQsIDB4MDQxNCwKKyAgICAweDA0MzUsIDB4MDQxNSwgMHgwNDQ0LCAweDA0MjQsIDB4MDQzMywgMHgwNDEzLCAweDAwYWIsIDB4MDBiYiwKKyAgICAweDI1OTEsIDB4MjU5MiwgMHgyNTkzLCAweDI1MDIsIDB4MjUyNCwgMHgwNDQ1LCAweDA0MjUsIDB4MDQzOCwKKyAgICAweDA0MTgsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsIDB4MjU1ZCwgMHgwNDM5LCAweDA0MTksIDB4MjUxMCwKKyAgICAweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsIDB4MjUwMCwgMHgyNTNjLCAweDA0M2EsIDB4MDQxYSwKKyAgICAweDI1NWEsIDB4MjU1NCwgMHgyNTY5LCAweDI1NjYsIDB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MDBhNCwKKyAgICAweDA0M2IsIDB4MDQxYiwgMHgwNDNjLCAweDA0MWMsIDB4MDQzZCwgMHgwNDFkLCAweDA0M2UsIDB4MDQxZSwKKyAgICAweDA0M2YsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsIDB4MjU4NCwgMHgwNDFmLCAweDA0NGYsIDB4MjU4MCwKKyAgICAweDA0MmYsIDB4MDQ0MCwgMHgwNDIwLCAweDA0NDEsIDB4MDQyMSwgMHgwNDQyLCAweDA0MjIsIDB4MDQ0MywKKyAgICAweDA0MjMsIDB4MDQzNiwgMHgwNDE2LCAweDA0MzIsIDB4MDQxMiwgMHgwNDRjLCAweDA0MmMsIDB4MjExNiwKKyAgICAweDAwMmQsIDB4MDQ0YiwgMHgwNDJiLCAweDA0MzcsIDB4MDQxNywgMHgwNDQ4LCAweDA0MjgsIDB4MDQ0ZCwKKyAgICAweDA0MmQsIDB4MDQ0OSwgMHgwNDI5LCAweDA0NDcsIDB4MDQyNywgMHgwMGE3LCAweDI1YTAsIDB4MDAyMAorfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2NwODU2ID0geyAgICAgICAgIC8qIENQODU2IChCdWxnYXJpYSkgdG8gVW5pY29kZSAqLworICAgIDEyOCwgMCwgWDJVX0NQLCBBTF9DWVJJTCwiUEMgQ29kZSBQYWdlIDg1NiIsImNwODU2IiwgMCwgTlVMTCwKKyAgICAweDA0MTAsIDB4MDQxMSwgMHgwNDEyLCAweDA0MTMsIDB4MDQxNCwgMHgwNDE1LCAweDA0MTYsIDB4MDQxNywKKyAgICAweDA0MTgsIDB4MDQxOSwgMHgwNDFhLCAweDA0MWIsIDB4MDQxYywgMHgwNDFkLCAweDA0MWUsIDB4MDQxZiwKKyAgICAweDA0MjAsIDB4MDQyMSwgMHgwNDIyLCAweDA0MjMsIDB4MDQyNCwgMHgwNDI1LCAweDA0MjYsIDB4MDQyNywKKyAgICAweDA0MjgsIDB4MDQyOSwgMHgwNDJhLCAweDA0MmIsIDB4MDQyYywgMHgwNDJkLCAweDA0MmUsIDB4MDQyZiwKKyAgICAweDA0MzAsIDB4MDQzMSwgMHgwNDMyLCAweDA0MzMsIDB4MDQzNCwgMHgwNDM1LCAweDA0MzYsIDB4MDQzNywKKyAgICAweDA0MzgsIDB4MDQzOSwgMHgwNDNhLCAweDA0M2IsIDB4MDQzYywgMHgwNDNkLCAweDA0M2UsIDB4MDQzZiwKKyAgICAweDA0NDAsIDB4MDQ0MSwgMHgwNDQyLCAweDA0NDMsIDB4MDQ0NCwgMHgwNDQ1LCAweDA0NDYsIDB4MDQ0NywKKyAgICAweDA0NDgsIDB4MDQ0OSwgMHgwNDRhLCAweDA0NGIsIDB4MDQ0YywgMHgwNDRkLCAweDA0NGUsIDB4MDQ0ZiwKKyAgICAweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsIDB4MjUwMCwgMHgyNTNjLCAweDI1NjMsIDB4MjU1MSwKKyAgICAweDI1NWEsIDB4MjU1NCwgMHgyNTY5LCAweDI1NjYsIDB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MjUxMCwKKyAgICAweDI1OTEsIDB4MjU5MiwgMHgyNTkzLCAweDI1MDIsIDB4MjUyNCwgMHgyMTE2LCAweDAwYTcsIDB4MjU1NywKKyAgICAweDI1NWQsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsIDB4MjU4NCwgMHgyNThjLCAweDI1OTAsIDB4MjU4MCwKKyAgICAweDAzYjEsIDB4MDBkZiwgMHgwMzkzLCAweDAzYzAsIDB4MDNhMywgMHgwM2MzLCAweDAwYjUsIDB4MDNjNCwKKyAgICAweDAzYTYsIDB4MDM5OCwgMHgwM2E5LCAweDAzYjQsIDB4MjIxZSwgMHgwM2M2LCAweDAzYjUsIDB4MjIyOSwKKyAgICAweDIyNjEsIDB4MDBiMSwgMHgyMjY1LCAweDIyNjQsIDB4MjMyMCwgMHgyMzIxLCAweDAwZjcsIDB4MjI0OCwKKyAgICAweDAwYjAsIDB4MjIxOSwgMHgwMGI3LCAweDIyMWEsIDB4MjA3ZiwgMHgwMGIyLCAweDI1YTAsIDB4MDBhMAorfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2NwODU3ID0geworICAgIDEyOCwgMCwgWDJVX0NQLCBBTF9ST01BTiwiUEMgQ29kZSBQYWdlIDg1NyIsImNwODU3IiwgMCwgTlVMTCwKKyAgICAweDAwYzcsIDB4MDBmYywgMHgwMGU5LCAweDAwZTIsIDB4MDBlNCwgMHgwMGUwLCAweDAwZTUsIDB4MDBlNywgLyogMHg4MCAqLworICAgIDB4MDBlYSwgMHgwMGViLCAweDAwZTgsIDB4MDBlZiwgMHgwMGVlLCAweDAxMzEsIDB4MDBjNCwgMHgwMGM1LCAvKiAweDg4ICovCisgICAgMHgwMGM5LCAweDAwZTYsIDB4MDBjNiwgMHgwMGY0LCAweDAwZjYsIDB4MDBmMiwgMHgwMGZiLCAweDAwZjksIC8qIDB4OTAgKi8KKyAgICAweDAxMzAsIDB4MDBkNiwgMHgwMGRjLCAweDAwZjgsIDB4MDBhMywgMHgwMGQ4LCAweDAxNWUsIDB4MDE1ZiwgLyogMHg5OCAqLworICAgIDB4MDBlMSwgMHgwMGVkLCAweDAwZjMsIDB4MDBmYSwgMHgwMGYxLCAweDAwZDEsIDB4MDExZSwgMHgwMTFmLCAvKiAweGEwICovCisgICAgMHgwMGJmLCAweDAwYWUsIDB4MDBhYywgMHgwMGJkLCAweDAwYmMsIDB4MDBhMSwgMHgwMGFiLCAweDAwYmIsIC8qIDB4YTggKi8KKyAgICAweDI1OTEsIDB4MjU5MiwgMHgyNTkzLCAweDI1MDIsIDB4MjUyNCwgMHgwMGMxLCAweDAwYzIsIDB4MDBjMCwgLyogMHhiMCAqLworICAgIDB4MDBhOSwgMHgyNTYzLCAweDI1NTEsIDB4MjU1NywgMHgyNTVkLCAweDAwYTIsIDB4MDBhNSwgMHgyNTEwLCAvKiAweGI4ICovCisgICAgMHgyNTE0LCAweDI1MzQsIDB4MjUyYywgMHgyNTFjLCAweDI1MDAsIDB4MjUzYywgMHgwMGUzLCAweDAwYzMsIC8qIDB4YzAgKi8KKyAgICAweDI1NWEsIDB4MjU1NCwgMHgyNTY5LCAweDI1NjYsIDB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MDBhNCwgLyogMHhjOCAqLworICAgIDB4MDBiYSwgMHgwMGFhLCAweDAwY2EsIDB4MDBjYiwgMHgwMGM4LCAweDIwYWMsIDB4MDBjZCwgMHgwMGNlLCAvKiAweGQwICovCisgICAgMHgwMGNmLCAweDI1MTgsIDB4MjUwYywgMHgyNTg4LCAweDI1ODQsIDB4MDBhNiwgMHgwMGNjLCAweDI1ODAsIC8qIDB4ZDggKi8KKyAgICAweDAwZDMsIDB4MDBkZiwgMHgwMGQ0LCAweDAwZDIsIDB4MDBmNSwgMHgwMGQ1LCAweDAwYjUsIDB4ZmZmZCwgLyogMHhlMCAqLworICAgIDB4MDBkNywgMHgwMGRhLCAweDAwZGIsIDB4MDBkOSwgMHgwMGVjLCAweDAwZmYsIDB4MDBhZiwgMHgwMGI0LCAvKiAweGU4ICovCisgICAgMHgwMGFkLCAweDAwYjEsIDB4ZmZmZCwgMHgwMGJlLCAweDAwYjYsIDB4MDBhNywgMHgwMGY3LCAweDAwYjgsIC8qIDB4ZjAgKi8KKyAgICAweDAwYjAsIDB4MDBhOCwgMHgwMGI3LCAweDAwYjksIDB4MDBiMywgMHgwMGIyLCAweDI1YTAsIDB4MDBhMCAgLyogMHhmOCAqLworfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2NwODU4ID0geworICAgIDEyOCwgMCwgWDJVX0NQLCBBTF9ST01BTiwiUEMgQ29kZSBQYWdlIDg1OCIsImNwODU4IiwgMCwgTlVMTCwKKyAgICAweDAwYzcsIDB4MDBmYywgMHgwMGU5LCAweDAwZTIsIDB4MDBlNCwgMHgwMGUwLCAweDAwZTUsIDB4MDBlNywKKyAgICAweDAwZWEsIDB4MDBlYiwgMHgwMGU4LCAweDAwZWYsIDB4MDBlZSwgMHgwMGVjLCAweDAwYzQsIDB4MDBjNSwKKyAgICAweDAwYzksIDB4MDBlNiwgMHgwMGM2LCAweDAwZjQsIDB4MDBmNiwgMHgwMGYyLCAweDAwZmIsIDB4MDBmOSwKKyAgICAweDAwZmYsIDB4MDBkNiwgMHgwMGRjLCAweDAwZjgsIDB4MDBhMywgMHgwMGQ4LCAweDAwZDcsIDB4MDE5MiwKKyAgICAweDAwZTEsIDB4MDBlZCwgMHgwMGYzLCAweDAwZmEsIDB4MDBmMSwgMHgwMGQxLCAweDAwYWEsIDB4MDBiYSwKKyAgICAweDAwYmYsIDB4MDBhZSwgMHgwMGFjLCAweDAwYmQsIDB4MDBiYywgMHgwMGExLCAweDAwYWIsIDB4MDBiYiwKKyAgICAweDI1OTEsIDB4MjU5MiwgMHgyNTkzLCAweDI1MDIsIDB4MjUyNCwgMHgwMGMxLCAweDAwYzIsIDB4MDBjMCwKKyAgICAweDAwYTksIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsIDB4MjU1ZCwgMHgwMGEyLCAweDAwYTUsIDB4MjUxMCwKKyAgICAweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsIDB4MjUwMCwgMHgyNTNjLCAweDAwZTMsIDB4MDBjMywKKyAgICAweDI1NWEsIDB4MjU1NCwgMHgyNTY5LCAweDI1NjYsIDB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MDBhNCwKKyAgICAweDAwZjAsIDB4MDBkMCwgMHgwMGNhLCAweDAwY2IsIDB4MDBjOCwgMHgyMGFjLCAweDAwY2QsIDB4MDBjZSwKKyAgICAweDAwY2YsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsIDB4MjU4NCwgMHgwMGE2LCAweDAwY2MsIDB4MjU4MCwKKyAgICAweDAwZDMsIDB4MDBkZiwgMHgwMGQ0LCAweDAwZDIsIDB4MDBmNSwgMHgwMGQ1LCAweDAwYjUsIDB4MDBmZSwKKyAgICAweDAwZGUsIDB4MDBkYSwgMHgwMGRiLCAweDAwZDksIDB4MDBmZCwgMHgwMGRkLCAweDAwYWYsIDB4MDBiNCwKKyAgICAweDAwYWQsIDB4MDBiMSwgMHgyMDE3LCAweDAwYmUsIDB4MDBiNiwgMHgwMGE3LCAweDAwZjcsIDB4MDBiOCwKKyAgICAweDAwYjAsIDB4MDBhOCwgMHgwMGI3LCAweDAwYjksIDB4MDBiMywgMHgwMGIyLCAweDI1YTAsIDB4MDBhMAorfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2NwODYyID0geworICAgIDEyOCwgMCwgWDJVX0NQLCBBTF9IRUJSRVcsIlBDIENvZGUgUGFnZSA4NjIiLCJjcDg2MiIsIDAsIE5VTEwsCisgICAgMHgwNWQwLCAweDA1ZDEsIDB4MDVkMiwgMHgwNWQzLCAweDA1ZDQsIDB4MDVkNSwgMHgwNWQ2LCAweDA1ZDcsCisgICAgMHgwNWQ4LCAweDA1ZDksIDB4MDVkYSwgMHgwNWRiLCAweDA1ZGMsIDB4MDVkZCwgMHgwNWRlLCAweDA1ZGYsCisgICAgMHgwNWUwLCAweDA1ZTEsIDB4MDVlMiwgMHgwNWUzLCAweDA1ZTQsIDB4MDVlNSwgMHgwNWU2LCAweDA1ZTcsCisgICAgMHgwNWU4LCAweDA1ZTksIDB4MDVlYSwgMHgwMGEyLCAweDAwYTMsIDB4MDBhNSwgMHgyMGE3LCAweDAxOTIsCisgICAgMHgwMGUxLCAweDAwZWQsIDB4MDBmMywgMHgwMGZhLCAweDAwZjEsIDB4MDBkMSwgMHgwMGFhLCAweDAwYmEsCisgICAgMHgwMGJmLCAweDIzMTAsIDB4MDBhYywgMHgwMGJkLCAweDAwYmMsIDB4MDBhMSwgMHgwMGFiLCAweDAwYmIsCisgICAgMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLCAweDI1MjQsIDB4MjU2MSwgMHgyNTYyLCAweDI1NTYsCisgICAgMHgyNTU1LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LCAweDI1NWQsIDB4MjU1YywgMHgyNTViLCAweDI1MTAsCisgICAgMHgyNTE0LCAweDI1MzQsIDB4MjUyYywgMHgyNTFjLCAweDI1MDAsIDB4MjUzYywgMHgyNTVlLCAweDI1NWYsCisgICAgMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LCAweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDI1NjcsCisgICAgMHgyNTY4LCAweDI1NjQsIDB4MjU2NSwgMHgyNTU5LCAweDI1NTgsIDB4MjU1MiwgMHgyNTUzLCAweDI1NmIsCisgICAgMHgyNTZhLCAweDI1MTgsIDB4MjUwYywgMHgyNTg4LCAweDI1ODQsIDB4MjU4YywgMHgyNTkwLCAweDI1ODAsCisgICAgMHgwM2IxLCAweDAwZGYsIDB4MDM5MywgMHgwM2MwLCAweDAzYTMsIDB4MDNjMywgMHgwMGI1LCAweDAzYzQsCisgICAgMHgwM2E2LCAweDAzOTgsIDB4MDNhOSwgMHgwM2I0LCAweDIyMWUsIDB4MDNjNiwgMHgwM2I1LCAweDIyMjksCisgICAgMHgyMjYxLCAweDAwYjEsIDB4MjI2NSwgMHgyMjY0LCAweDIzMjAsIDB4MjMyMSwgMHgwMGY3LCAweDIyNDgsCisgICAgMHgwMGIwLCAweDIyMTksIDB4MDBiNywgMHgyMjFhLCAweDIwN2YsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9jcDg2NCA9IHsKKyAgICAxMjgsIDAsIFgyVV9DUCwgQUxfQVJBQklDLCJQQyBDb2RlIFBhZ2UgODY0IiwiY3A4NjQiLCAwLCBOVUxMLAorICAgIDB4MDBiMCwgMHgwMGI3LCAweDIyMTksIDB4MjIxYSwgMHgyNTkyLCAweDI1MDAsIDB4MjUwMiwgMHgyNTNjLAorICAgIDB4MjUyNCwgMHgyNTJjLCAweDI1MWMsIDB4MjUzNCwgMHgyNTEwLCAweDI1MGMsIDB4MjUxNCwgMHgyNTE4LAorICAgIDB4MDNiMiwgMHgyMjFlLCAweDAzYzYsIDB4MDBiMSwgMHgwMGJkLCAweDAwYmMsIDB4MjI0OCwgMHgwMGFiLAorICAgIDB4MDBiYiwgMHhmZWY3LCAweGZlZjgsIDB4ZmZmZCwgMHhmZmZkLCAweGZlZmIsIDB4ZmVmYywgMHhmZmZkLAorICAgIDB4MDBhMCwgMHgwMGFkLCAweGZlODIsIDB4MDBhMywgMHgwMGE0LCAweGZlODQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmU4ZSwgMHhmZThmLCAweGZlOTUsIDB4ZmU5OSwgMHgwNjBjLCAweGZlOWQsIDB4ZmVhMSwgMHhmZWE1LAorICAgIDB4MDY2MCwgMHgwNjYxLCAweDA2NjIsIDB4MDY2MywgMHgwNjY0LCAweDA2NjUsIDB4MDY2NiwgMHgwNjY3LAorICAgIDB4MDY2OCwgMHgwNjY5LCAweGZlZDEsIDB4MDYxYiwgMHhmZWIxLCAweGZlYjUsIDB4ZmViOSwgMHgwNjFmLAorICAgIDB4MDBhMiwgMHhmZTgwLCAweGZlODEsIDB4ZmU4MywgMHhmZTg1LCAweGZlY2EsIDB4ZmU4YiwgMHhmZThkLAorICAgIDB4ZmU5MSwgMHhmZTkzLCAweGZlOTcsIDB4ZmU5YiwgMHhmZTlmLCAweGZlYTMsIDB4ZmVhNywgMHhmZWE5LAorICAgIDB4ZmVhYiwgMHhmZWFkLCAweGZlYWYsIDB4ZmViMywgMHhmZWI3LCAweGZlYmIsIDB4ZmViZiwgMHhmZWMxLAorICAgIDB4ZmVjNSwgMHhmZWNiLCAweGZlY2YsIDB4MDBhNiwgMHgwMGFjLCAweDAwZjcsIDB4MDBkNywgMHhmZWM5LAorICAgIDB4MDY0MCwgMHhmZWQzLCAweGZlZDcsIDB4ZmVkYiwgMHhmZWRmLCAweGZlZTMsIDB4ZmVlNywgMHhmZWViLAorICAgIDB4ZmVlZCwgMHhmZWVmLCAweGZlZjMsIDB4ZmViZCwgMHhmZWNjLCAweGZlY2UsIDB4ZmVjZCwgMHhmZWUxLAorICAgIDB4ZmU3ZCwgMHgwNjUxLCAweGZlZTUsIDB4ZmVlOSwgMHhmZWVjLCAweGZlZjAsIDB4ZmVmMiwgMHhmZWQwLAorICAgIDB4ZmVkNSwgMHhmZWY1LCAweGZlZjYsIDB4ZmVkZCwgMHhmZWQ5LCAweGZlZjEsIDB4MjVhMCwgMHhmZmZkCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfY3A4NjYgPSB7CisgICAgMTI4LCAwLCBYMlVfQ1AsIEFMX0NZUklMLCJQQyBDb2RlIFBhZ2UgODY2IiwiY3A4NjYiLCAwLCBOVUxMLAorICAgIDB4MDQxMCwgMHgwNDExLCAweDA0MTIsIDB4MDQxMywgMHgwNDE0LCAweDA0MTUsIDB4MDQxNiwgMHgwNDE3LAorICAgIDB4MDQxOCwgMHgwNDE5LCAweDA0MWEsIDB4MDQxYiwgMHgwNDFjLCAweDA0MWQsIDB4MDQxZSwgMHgwNDFmLAorICAgIDB4MDQyMCwgMHgwNDIxLCAweDA0MjIsIDB4MDQyMywgMHgwNDI0LCAweDA0MjUsIDB4MDQyNiwgMHgwNDI3LAorICAgIDB4MDQyOCwgMHgwNDI5LCAweDA0MmEsIDB4MDQyYiwgMHgwNDJjLCAweDA0MmQsIDB4MDQyZSwgMHgwNDJmLAorICAgIDB4MDQzMCwgMHgwNDMxLCAweDA0MzIsIDB4MDQzMywgMHgwNDM0LCAweDA0MzUsIDB4MDQzNiwgMHgwNDM3LAorICAgIDB4MDQzOCwgMHgwNDM5LCAweDA0M2EsIDB4MDQzYiwgMHgwNDNjLCAweDA0M2QsIDB4MDQzZSwgMHgwNDNmLAorICAgIDB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwgMHgyNTI0LCAweDI1NjEsIDB4MjU2MiwgMHgyNTU2LAorICAgIDB4MjU1NSwgMHgyNTYzLCAweDI1NTEsIDB4MjU1NywgMHgyNTVkLCAweDI1NWMsIDB4MjU1YiwgMHgyNTEwLAorICAgIDB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywgMHgyNTAwLCAweDI1M2MsIDB4MjU1ZSwgMHgyNTVmLAorICAgIDB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwgMHgyNTYwLCAweDI1NTAsIDB4MjU2YywgMHgyNTY3LAorICAgIDB4MjU2OCwgMHgyNTY0LCAweDI1NjUsIDB4MjU1OSwgMHgyNTU4LCAweDI1NTIsIDB4MjU1MywgMHgyNTZiLAorICAgIDB4MjU2YSwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwgMHgyNTg0LCAweDI1OGMsIDB4MjU5MCwgMHgyNTgwLAorICAgIDB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywgMHgwNDQ0LCAweDA0NDUsIDB4MDQ0NiwgMHgwNDQ3LAorICAgIDB4MDQ0OCwgMHgwNDQ5LCAweDA0NGEsIDB4MDQ0YiwgMHgwNDRjLCAweDA0NGQsIDB4MDQ0ZSwgMHgwNDRmLAorICAgIDB4MDQwMSwgMHgwNDUxLCAweDA0MDQsIDB4MDQ1NCwgMHgwNDA3LCAweDA0NTcsIDB4MDQwZSwgMHgwNDVlLAorICAgIDB4MDBiMCwgMHgyMjE5LCAweDAwYjcsIDB4MjIxYSwgMHgyMTE2LCAweDAwYTQsIDB4MjVhMCwgMHgwMGEwCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfY3A4NjkgPSB7CisgICAgMTI4LCAwLCBYMlVfQ1AsIEFMX0dSRUVLLCJQQyBDb2RlIFBhZ2UgODY5IiwiY3A4NjkiLCAwLCBOVUxMLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4MDM4NiwgMHhmZmZkLAorICAgIDB4MDBiNywgMHgwMGFjLCAweDAwYTYsIDB4MjAxOCwgMHgyMDE5LCAweDAzODgsIDB4MjAxNSwgMHgwMzg5LAorICAgIDB4MDM4YSwgMHgwM2FhLCAweDAzOGMsIDB4ZmZmZCwgMHhmZmZkLCAweDAzOGUsIDB4MDNhYiwgMHgwMGE5LAorICAgIDB4MDM4ZiwgMHgwMGIyLCAweDAwYjMsIDB4MDNhYywgMHgwMGEzLCAweDAzYWQsIDB4MDNhZSwgMHgwM2FmLAorICAgIDB4MDNjYSwgMHgwMzkwLCAweDAzY2MsIDB4MDNjZCwgMHgwMzkxLCAweDAzOTIsIDB4MDM5MywgMHgwMzk0LAorICAgIDB4MDM5NSwgMHgwMzk2LCAweDAzOTcsIDB4MDBiZCwgMHgwMzk4LCAweDAzOTksIDB4MDBhYiwgMHgwMGJiLAorICAgIDB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwgMHgyNTI0LCAweDAzOWEsIDB4MDM5YiwgMHgwMzljLAorICAgIDB4MDM5ZCwgMHgyNTYzLCAweDI1NTEsIDB4MjU1NywgMHgyNTVkLCAweDAzOWUsIDB4MDM5ZiwgMHgyNTEwLAorICAgIDB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywgMHgyNTAwLCAweDI1M2MsIDB4MDNhMCwgMHgwM2ExLAorICAgIDB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwgMHgyNTYwLCAweDI1NTAsIDB4MjU2YywgMHgwM2EzLAorICAgIDB4MDNhNCwgMHgwM2E1LCAweDAzYTYsIDB4MDNhNywgMHgwM2E4LCAweDAzYTksIDB4MDNiMSwgMHgwM2IyLAorICAgIDB4MDNiMywgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwgMHgyNTg0LCAweDAzYjQsIDB4MDNiNSwgMHgyNTgwLAorICAgIDB4MDNiNiwgMHgwM2I3LCAweDAzYjgsIDB4MDNiOSwgMHgwM2JhLCAweDAzYmIsIDB4MDNiYywgMHgwM2JkLAorICAgIDB4MDNiZSwgMHgwM2JmLCAweDAzYzAsIDB4MDNjMSwgMHgwM2MzLCAweDAzYzIsIDB4MDNjNCwgMHgwMzg0LAorICAgIDB4MDBhZCwgMHgwMGIxLCAweDAzYzUsIDB4MDNjNiwgMHgwM2M3LCAweDAwYTcsIDB4MDNjOCwgMHgwMzg1LAorICAgIDB4MDBiMCwgMHgwMGE4LCAweDAzYzksIDB4MDNjYiwgMHgwM2IwLCAweDAzY2UsIDB4MjVhMCwgMHgwMGEwCit9OworCisvKiBXaW5kb3dzIGNvZGUgcGFnZXMgKi8KKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2NwMTI1MCA9IHsgICAgICAgIC8qIFdpbmRvd3MgTGF0aW4tMiAqLworICAgIDEyOCwgMCwgWDJVX0NQLCBBTF9ST01BTiwiV2luZG93cyBDb2RlIFBhZ2UgMTI1MCIsImNwMTI1MCIsIDAsIE5VTEwsCisgICAgMHgyMGFjLCAweGZmZmQsIDB4MjAxYSwgMHgwMTkyLCAweDIwMWUsIDB4MjAyNiwgMHgyMDIwLCAweDIwMjEsIC8qIDgwICovCisgICAgMHgwMDVlLCAweDIwMzEsIDB4MDE2MCwgMHgwMDNjLCAweDAxNWEsIDB4MDE2NCwgMHgwMTdkLCAweDAxNzksIC8qIDg4ICovCisgICAgMHhmZmZkLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFjLCAweDIwMWQsIDB4MjAyMiwgMHgyMDEyLCAweDIwMTQsIC8qIDkwICovCisgICAgMHhmZmZkLCAweDIxMjIsIDB4MDE2MSwgMHgwMDNlLCAweDAxNWIsIDB4MDE2NSwgMHgwMTdlLCAweDAxN2EsIC8qIDk4ICovCisgICAgMHgwMEEwLCAweDAyYzcsIDB4MDJkOCwgMHgwMTQxLCAweDAwQTQsIDB4MDEwNCwgMHgwMEE2LCAweDAwQTcsIC8qIEEwICovCisgICAgMHgwMEE4LCAweDAwYTksIDB4MDE1RSwgMHgwMGFiLCAweDAwYWMsIDB4MDAyRCwgMHgwMGFlLCAweDAxN0IsIC8qIEE4ICovCisgICAgMHgwMEIwLCAweDAwYjEsIDB4MDJEQiwgMHgwMTQyLCAweDAwQjQsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsIC8qIEIwICovCisgICAgMHgwMEI4LCAweDAxMDUsIDB4MDE1RiwgMHgwMGJiLCAweDAxM2QsIDB4MDJERCwgMHgwMTNFLCAweDAxN0MsIC8qIEI4ICovCisgICAgMHgwMTU0LCAweDAwQzEsIDB4MDBDMiwgMHgwMTAyLCAweDAwQzQsIDB4MDEzOSwgMHgwMTA2LCAweDAwQzcsIC8qIEMwICovCisgICAgMHgwMTBDLCAweDAwQzksIDB4MDExOCwgMHgwMENCLCAweDAxMUEsIDB4MDBDRCwgMHgwMENFLCAweDAxMEUsCisgICAgMHgwMTEwLCAweDAxNDMsIDB4MDE0NywgMHgwMEQzLCAweDAwRDQsIDB4MDE1MCwgMHgwMEQ2LCAweDAwRDcsCisgICAgMHgwMTU4LCAweDAxNkUsIDB4MDBEQSwgMHgwMTcwLCAweDAwREMsIDB4MDBERCwgMHgwMTYyLCAweDAwREYsCisgICAgMHgwMTU1LCAweDAwRTEsIDB4MDBFMiwgMHgwMTAzLCAweDAwRTQsIDB4MDEzQSwgMHgwMTA3LCAweDAwRTcsCisgICAgMHgwMTBELCAweDAwRTksIDB4MDExOSwgMHgwMEVCLCAweDAxMUIsIDB4MDBFRCwgMHgwMEVFLCAweDAxMEYsCisgICAgMHgwMTExLCAweDAxNDQsIDB4MDE0OCwgMHgwMEYzLCAweDAwRjQsIDB4MDE1MSwgMHgwMEY2LCAweDAwRjcsCisgICAgMHgwMTU5LCAweDAxNkYsIDB4MDBGQSwgMHgwMTcxLCAweDAwRkMsIDB4MDBGRCwgMHgwMTYzLCAweDAyRDkKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9jcDEyNTEgPSB7ICAgICAgICAvKiBXaW5kb3dzIEN5cmlsbGljICovCisgICAgMTI4LCAwLCBYMlVfQ1AsIEFMX0NZUklMLCJXaW5kb3dzIENvZGUgUGFnZSAxMjUxIiwiY3AxMjUxIiwgMCwgTlVMTCwKKyAgICAweDA0MDIsIDB4MDQwMywgMHgyMDFhLCAweDA0NTMsIDB4MjAxZSwgMHgyMDI2LCAweDIwMjAsIDB4MjAyMSwgLyogODAgKi8KKyAgICAweDIwYWMsIDB4MjAzMSwgMHgwNDA5LCAweDAwM2MsIDB4MDQwYSwgMHgwNDBjLCAweDA0MGIsIDB4MDQwZiwgLyogODggKi8KKyAgICAweDA0NTIsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWMsIDB4MjAxZCwgMHgyMDIyLCAweDIwMTIsIDB4MjAxNCwgLyogOTAgKi8KKyAgICAweDAwN2UsIDB4MjEyMiwgMHgwNDU5LCAweDAwM2UsIDB4MDQ1YSwgMHgwNDVjLCAweDA0NWIsIDB4MDQ1ZiwgLyogOTggKi8KKyAgICAweDAwQTAsIDB4MDQwZSwgMHgwNDVlLCAweDA0MDgsIDB4MDBBNCwgMHgwNDkwLCAweDAwQTYsIDB4MDBBNywgLyogYTAgKi8KKyAgICAweDA0MDEsIDB4MDBBOSwgMHgwNDA0LCAweDAwQUIsIDB4MDBBQywgMHgwMEFELCAweDAwQUUsIDB4MDQwNywgLyogYTggKi8KKyAgICAweDAwYjAsIDB4MDBiMSwgMHgwNDA2LCAweDA0NTYsIDB4MDQ5MSwgMHgwMEI1LCAweDAwQjYsIDB4MDBCNywgLyogYjAgKi8KKyAgICAweDA0NTEsIDB4MjExNiwgMHgwNDU0LCAweDAwQkIsIDB4MDQ1OCwgMHgwNDA1LCAweDA0NTUsIDB4MDQ1NywgLyogYjggKi8KKyAgICAweDA0MTAsIDB4MDQxMSwgMHgwNDEyLCAweDA0MTMsIDB4MDQxNCwgMHgwNDE1LCAweDA0MTYsIDB4MDQxNywgLyogYzAgKi8KKyAgICAweDA0MTgsIDB4MDQxOSwgMHgwNDFhLCAweDA0MWIsIDB4MDQxYywgMHgwNDFkLCAweDA0MWUsIDB4MDQxZiwgLyogYzggKi8KKyAgICAweDA0MjAsIDB4MDQyMSwgMHgwNDIyLCAweDA0MjMsIDB4MDQyNCwgMHgwNDI1LCAweDA0MjYsIDB4MDQyNywgLyogZDAgKi8KKyAgICAweDA0MjgsIDB4MDQyOSwgMHgwNDJhLCAweDA0MmIsIDB4MDQyYywgMHgwNDJkLCAweDA0MmUsIDB4MDQyZiwgLyogZDggKi8KKyAgICAweDA0MzAsIDB4MDQzMSwgMHgwNDMyLCAweDA0MzMsIDB4MDQzNCwgMHgwNDM1LCAweDA0MzYsIDB4MDQzNywgLyogZTAgKi8KKyAgICAweDA0MzgsIDB4MDQzOSwgMHgwNDNhLCAweDA0M2IsIDB4MDQzYywgMHgwNDNkLCAweDA0M2UsIDB4MDQzZiwgLyogZTggKi8KKyAgICAweDA0NDAsIDB4MDQ0MSwgMHgwNDQyLCAweDA0NDMsIDB4MDQ0NCwgMHgwNDQ1LCAweDA0NDYsIDB4MDQ0NywgLyogZjAgKi8KKyAgICAweDA0NDgsIDB4MDQ0OSwgMHgwNDRhLCAweDA0NGIsIDB4MDQ0YywgMHgwNDRkLCAweDA0NGUsIDB4MDQ0ZiAgLyogZjggKi8KK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9jcDEyNTIgPSB7ICAgICAgICAvKiBXaW5kb3dzIExhdGluLTEgKi8KKy8qCisgIFRoZSBmb2xsb3dpbmcgY29kZSBwb2ludHMgYWRkZWQgU2VwdGVtYmVyIDE5OTg6CisgIDB4ODA6IEV1cm8KKyAgMHg4RTogTGF0aW4gQ2FwaXRhbCBMZXR0ZXIgWiB3aXRoIENhcm9uCisgIDB4OUU6IExhdGluIFNtYWxsIExldHRlciBaIHdpdGggQ2Fyb24KKyAgQW5ub3VuY2VkIGJ5IE11cnJheSBTYXJnZW50IDxtdXJyYXlzQG1pY3Jvc29mdC5jb20+IHRvIFVuaWNvZGUgY29uc29ydGl1bSwKKyAgZW1haWwsIDMgU2VwdGVtYmVyIDE5OTguICBUaGUgY29kZSBwYWdlIHdhcyBjaGFuZ2VkIGluIEp1bmUgMTk5OC4gIFRoZQorICBjaGFuZ2UgaXMgcmVmbGVjdGVkIGluIFdpbmRvd3MgOTggYW5kICJyZWNlbnQgc2VydmljZSBwYWNrcyIgZm9yIFdpbmRvdyA5NQorICBhbmQgV2luZG93cyBOVCA0LjAuCisqLworICAgIDEyOCwgMCwgWDJVX0NQLCBBTF9ST01BTiwiV2luZG93cyBDb2RlIFBhZ2UgMTI1MiIsImNwMTI1MiIsIDAsIE5VTEwsCisgICAgMHgyMGFjLCAweGZmZmQsIDB4MjAxYSwgMHgwMTkyLCAweDIwMWUsIDB4MjAyNiwgMHgyMDIwLCAweDIwMjEsCisgICAgMHgwMDVlLCAweDIwMzEsIDB4MDE2MCwgMHgwMDNjLCAweDAxNTIsIDB4ZmZmZCwgMHgwMTdELCAweGZmZmQsCisgICAgMHhmZmZkLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFjLCAweDIwMWQsIDB4MjAyMiwgMHgyMDEyLCAweDIwMTQsCisgICAgMHgwMDdlLCAweDIxMjIsIDB4MDE2MSwgMHgwMDNlLCAweDAxNTMsIDB4ZmZmZCwgMHgwMTdFLCAweDAxNzgsCisgICAgMHgwMEEwLCAweDAwQTEsIDB4MDBBMiwgMHgwMEEzLCAweDAwQTQsIDB4MDBBNSwgMHgwMEE2LCAweDAwQTcsCisgICAgMHgwMEE4LCAweDAwQTksIDB4MDBBQSwgMHgwMEFCLCAweDAwQUMsIDB4MDBBRCwgMHgwMEFFLCAweDAwQUYsCisgICAgMHgwMEIwLCAweDAwQjEsIDB4MDBCMiwgMHgwMEIzLCAweDAwQjQsIDB4MDBCNSwgMHgwMEI2LCAweDAwQjcsCisgICAgMHgwMEI4LCAweDAwQjksIDB4MDBCQSwgMHgwMEJCLCAweDAwQkMsIDB4MDBCRCwgMHgwMEJFLCAweDAwQkYsCisgICAgMHgwMEMwLCAweDAwQzEsIDB4MDBDMiwgMHgwMEMzLCAweDAwQzQsIDB4MDBDNSwgMHgwMEM2LCAweDAwQzcsCisgICAgMHgwMEM4LCAweDAwQzksIDB4MDBDQSwgMHgwMENCLCAweDAwQ0MsIDB4MDBDRCwgMHgwMENFLCAweDAwQ0YsCisgICAgMHgwMEQwLCAweDAwRDEsIDB4MDBEMiwgMHgwMEQzLCAweDAwRDQsIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsCisgICAgMHgwMEQ4LCAweDAwRDksIDB4MDBEQSwgMHgwMERCLCAweDAwREMsIDB4MDBERCwgMHgwMERFLCAweDAwREYsCisgICAgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwgMHgwMEUzLCAweDAwRTQsIDB4MDBFNSwgMHgwMEU2LCAweDAwRTcsCisgICAgMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLCAweDAwRUMsIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsCisgICAgMHgwMEYwLCAweDAwRjEsIDB4MDBGMiwgMHgwMEYzLCAweDAwRjQsIDB4MDBGNSwgMHgwMEY2LCAweDAwRjcsCisgICAgMHgwMEY4LCAweDAwRjksIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9jcDEyNTMgPSB7ICAgICAgICAvKiBXaW5kb3dzIEdyZWVjZSAqLworICAgIDEyOCwgMCwgWDJVX0NQLCBBTF9HUkVFSywiV2luZG93cyBDb2RlIFBhZ2UgMTI1MyIsImNwMTI1MyIsIDAsIE5VTEwsCisgICAgMHgyMGFjLCAweGZmZmQsIDB4MjAxYSwgMHgwMTkyLCAweDIwMWUsIDB4MjAyNiwgMHgyMDIwLCAweDIwMjEsIC8qIDgwICovCisgICAgMHhmZmZkLCAweDIwMzEsIDB4ZmZmZCwgMHgwMDNjLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIC8qIDg4ICovCisgICAgMHhmZmZkLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFjLCAweDIwMWQsIDB4MjAyMiwgMHgyMDEyLCAweDIwMTQsIC8qIDkwICovCisgICAgMHhmZmZkLCAweDIxMjIsIDB4ZmZmZCwgMHgwMDNlLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIC8qIDk4ICovCisgICAgMHgwMEEwLCAweDAwYjcsIDB4MDM4NiwgMHgwMEEzLCAweDAwQTQsIDB4MDBBNSwgMHgwMEE2LCAweDAwQTcsIC8qIGEwICovCisgICAgMHgwMEE4LCAweDAwQTksIDB4MDBBQSwgMHgwMEFCLCAweDAwQUMsIDB4MDBBRCwgMHgwMEFFLCAweDAwQUYsIC8qIGE4ICovCisgICAgMHgwMEIwLCAweDAwQjEsIDB4MDBCMiwgMHgwMEIzLCAweDAwQjcsIDB4MDBCNSwgMHgwMEI2LCAweDAwQjcsIC8qIGIwICovCisgICAgMHgwMzg4LCAweDAzODksIDB4MDM4QSwgMHgwMEJCLCAweDAzOEMsIDB4MDBCRCwgMHgwMzhFLCAweDAzOEYsIC8qIGI4ICovCisgICAgMHgwMzkwLCAweDAzOTEsIDB4MDM5MiwgMHgwMzkzLCAweDAzOTQsIDB4MDM5NSwgMHgwMzk2LCAweDAzOTcsIC8qIGMwICovCisgICAgMHgwMzk4LCAweDAzOTksIDB4MDM5QSwgMHgwMzlCLCAweDAzOUMsIDB4MDM5RCwgMHgwMzlFLCAweDAzOUYsIC8qIGM4ICovCisgICAgMHgwM2EwLCAweDAzYTEsIDB4ZmZmZCwgMHgwM2EzLCAweDAzYTQsIDB4MDNhNSwgMHgwM2E2LCAweDAzYTcsIC8qIGQwICovCisgICAgMHgwM2E4LCAweDAzYTksIDB4MDNhQSwgMHgwM2FCLCAweDAzYUMsIDB4MDNhRCwgMHgwM2FFLCAweDAzYUYsIC8qIGQ4ICovCisgICAgMHgwM2IwLCAweDAzYjEsIDB4MDNiMiwgMHgwM2IzLCAweDAzYjQsIDB4MDNiNSwgMHgwM2I2LCAweDAzYjcsIC8qIGUwICovCisgICAgMHgwM2I4LCAweDAzYjksIDB4MDNiQSwgMHgwM2JCLCAweDAzYkMsIDB4MDNiRCwgMHgwM2JFLCAweDAzYkYsIC8qIGU4ICovCisgICAgMHgwM2MwLCAweDAzYzEsIDB4MDNjMiwgMHgwM2MzLCAweDAzYzQsIDB4MDNjNSwgMHgwM2M2LCAweDAzYzcsIC8qIGYwICovCisgICAgMHgwM2M4LCAweDAzYzksIDB4MDNjQSwgMHgwM2NCLCAweDAzY0MsIDB4MDNjRCwgMHgwM2NFLCAweGZmZmQgIC8qIGY4ICovCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfY3AxMjU0ID0geyAgICAgICAgLyogV2luZG93cyBUdXJrZXkgKi8KKyAgICAxMjgsIDAsIFgyVV9DUCwgQUxfUk9NQU4sIldpbmRvd3MgQ29kZSBQYWdlIDEyNTQiLCJjcDEyNTQiLCAwLCBOVUxMLAorICAgIDB4MjBhYywgMHhmZmZkLCAweDIwMWEsIDB4MDE5MiwgMHgyMDFlLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAvKiA4MCAqLworICAgIDB4MDA1ZSwgMHgyMDMxLCAweDAxNjAsIDB4MDAzYywgMHgwMTUyLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAvKiA4OCAqLworICAgIDB4ZmZmZCwgMHgyMDE4LCAweDIwMTksIDB4MjAxYywgMHgyMDFkLCAweDIwMjIsIDB4MjAxMiwgMHgyMDE0LCAvKiA5MCAqLworICAgIDB4MDA3ZSwgMHgyMTIyLCAweDAxNjEsIDB4MDAzZSwgMHgwMTUzLCAweGZmZmQsIDB4ZmZmZCwgMHgwMTc4LCAvKiA5OCAqLworICAgIDB4MDBBMCwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LAorICAgIDB4MDBBOCwgMHgwMEE5LCAweDAwQUEsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLAorICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAorICAgIDB4MDBCOCwgMHgwMEI5LCAweDAwQkEsIDB4MDBCQiwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMEJGLAorICAgIDB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LCAweDAwQzUsIDB4MDBDNiwgMHgwMEM3LAorICAgIDB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLCAweDAwQ0QsIDB4MDBDRSwgMHgwMENGLAorICAgIDB4MDExZSwgMHgwMEQxLCAweDAwRDIsIDB4MDBEMywgMHgwMEQ0LCAweDAwRDUsIDB4MDBENiwgMHgwMEQ3LAorICAgIDB4MDBEOCwgMHgwMEQ5LCAweDAwREEsIDB4MDBEQiwgMHgwMERDLCAweDAxMzAsIDB4MDE1ZSwgMHgwMERGLAorICAgIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LCAweDAwRTUsIDB4MDBFNiwgMHgwMEU3LAorICAgIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLCAweDAwRUQsIDB4MDBFRSwgMHgwMEVGLAorICAgIDB4MDExZiwgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LCAweDAwRjUsIDB4MDBGNiwgMHgwMEY3LAorICAgIDB4MDBGOCwgMHgwMEY5LCAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLCAweDAxMzEsIDB4MDE1ZiwgMHgwMEZGCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfY3AxMjU1ID0geyAgICAgICAgLyogV2luZG93cyBIZWJyZXcgKi8KKyAgICAxMjgsIDAsIFgyVV9DUCwgQUxfUk9NQU4sIldpbmRvd3MgQ29kZSBQYWdlIDEyNTUgKEhlYnJldykiLCJjcDEyNTUiLAorICAgIDAsIE5VTEwsCisgICAgMHgyMEFDLCAweEZGRkQsIDB4MjAxYSwgMHgwMTkyLCAweDIwMWUsIDB4MjAyNiwgMHgyMDIwLCAweDIwMjEsCisgICAgMHgwMmM2LCAweDIwMzAsIDB4ZmZmZCwgMHgyMDM5LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFjLCAweDIwMWQsIDB4MjAyMiwgMHgyMDEzLCAweDIwMTQsCisgICAgMHgwMmRjLCAweDIxMjIsIDB4ZmZmZCwgMHgyMDNhLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHgwMGEwLCAweDAwYTEsIDB4MDBhMiwgMHgwMGEzLCAweDIwYWEsIDB4MDBhNSwgMHgwMGE2LCAweDAwYTcsCisgICAgMHgwMGE4LCAweDAwYTksIDB4MDBkNywgMHgwMGFiLCAweDAwYWMsIDB4MDBhZCwgMHgwMGFlLCAweDAwYWYsCisgICAgMHgwMGIwLCAweDAwYjEsIDB4MDBiMiwgMHgwMGIzLCAweDAwYjQsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsCisgICAgMHgwMGI4LCAweDAwYjksIDB4MDBmNywgMHgwMGJiLCAweDAwYmMsIDB4MDBiZCwgMHgwMGJlLCAweDAwYmYsCisgICAgMHgwNWIwLCAweDA1YjEsIDB4MDViMiwgMHgwNWIzLCAweDA1YjQsIDB4MDViNSwgMHgwNWI2LCAweDA1YjcsCisgICAgMHgwNWI4LCAweDA1YjksIDB4ZmZmZCwgMHgwNWJiLCAweDA1YmMsIDB4MDViZCwgMHgwNWJlLCAweDA1YmYsCisgICAgMHgwNWMwLCAweDA1YzEsIDB4MDVjMiwgMHgwNWMzLCAweDA1ZjAsIDB4MDVmMSwgMHgwNWYyLCAweDA1ZjMsCisgICAgMHgwNWY0LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHgwNWQwLCAweDA1ZDEsIDB4MDVkMiwgMHgwNWQzLCAweDA1ZDQsIDB4MDVkNSwgMHgwNWQ2LCAweDA1ZDcsCisgICAgMHgwNWQ4LCAweDA1ZDksIDB4MDVkYSwgMHgwNWRiLCAweDA1ZGMsIDB4MDVkZCwgMHgwNWRlLCAweDA1ZGYsCisgICAgMHgwNWUwLCAweDA1ZTEsIDB4MDVlMiwgMHgwNWUzLCAweDA1ZTQsIDB4MDVlNSwgMHgwNWU2LCAweDA1ZTcsCisgICAgMHgwNWU4LCAweDA1ZTksIDB4MDVlYSwgMHhmZmZkLCAweGZmZmQsIDB4MjAwZSwgMHgyMDBmLCAweGZmZmQKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9jcDEyNTYgPSB7ICAgICAgICAvKiBXaW5kb3dzIEFyYWJpYyAqLworICAgIDEyOCwgMCwgWDJVX0NQLCBBTF9ST01BTiwiV2luZG93cyBDb2RlIFBhZ2UgMTI1NiAoQXJhYmljKSIsImNwMTI1NiIsCisgICAgMCwgTlVMTCwKKyAgICAweDIwYWMsIDB4MDY3ZSwgMHgyMDFhLCAweDAxOTIsIDB4MjAxZSwgMHgyMDI2LCAweDIwMjAsIDB4MjAyMSwKKyAgICAweDAyYzYsIDB4MjAzMCwgMHhmZmZkLCAweDIwMzksIDB4MDE1MiwgMHgwNjg2LCAweDA2OTgsIDB4ZmZmZCwgLyogODggKi8KKyAgICAweDA2YWYsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWMsIDB4MjAxZCwgMHgyMDIyLCAweDIwMTMsIDB4MjAxNCwgLyogOTAgKi8KKyAgICAweGZmZmQsIDB4MjEyMiwgMHhmZmZkLCAweDAwM2EsIDB4MDE1MywgMHgyMDBjLCAweDIwMGQsIDB4ZmZmZCwgLyogOTggKi8KKyAgICAweDAwQTAsIDB4MDYwYywgMHgwMEEyLCAweDAwQTMsIDB4MDBBNCwgMHgwMGE1LCAweDAwQTYsIDB4MDBBNywgLyogYTAgKi8KKyAgICAweDAwYTgsIDB4MDBBOSwgMHhmZmZkLCAweDAwQUIsIDB4MDBBQywgMHgwMEFELCAweDAwQUUsIDB4MDBhZiwgLyogYTggKi8KKyAgICAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBiNCwgMHgwMEI1LCAweDAwQjYsIDB4MDBCNywgLyogYjAgKi8KKyAgICAweDAwYjgsIDB4MDBCOSwgMHgwNjFiLCAweDAwQkIsIDB4MDBCQywgMHgwMEJELCAweDAwQkUsIDB4MDYxZiwgLyogYjggKi8KKyAgICAweGZmZmQsIDB4MDYyMSwgMHgwNjIyLCAweDA2MjMsIDB4MDYyNCwgMHgwNjI1LCAweDA2MjYsIDB4MDYyNywgLyogYzAgKi8KKyAgICAweDA2MjgsIDB4MDYyOSwgMHgwNjJhLCAweDA2MmIsIDB4MDYyYywgMHgwNjJkLCAweDA2MmUsIDB4MDYyZiwgLyogYzggKi8KKyAgICAweDA2MzAsIDB4MDYzMSwgMHgwNjMyLCAweDA2MzMsIDB4MDYzNCwgMHgwNjM1LCAweDA2MzYsIDB4MDBENywgLyogZDAgKi8KKyAgICAweDA2MzcsIDB4MDYzOCwgMHgwNjM5LCAweDA2M2EsIDB4MDY0MCwgMHgwNjQxLCAweDA2NDIsIDB4MDY0MywgLyogZDggKi8KKyAgICAweDAwZTAsIDB4MDY0NCwgMHgwMGUyLCAweDA2NDUsIDB4MDY0NiwgMHgwNjQ3LCAweDA2NDgsIDB4MDBlNywgLyogZTAgKi8KKyAgICAweDAwZTgsIDB4MDBFOSwgMHgwMGVhLCAweDAwZWIsIDB4MDY0OSwgMHgwNjRhLCAweDAwZWUsIDB4MDBlZiwgLyogZTggKi8KKyAgICAweDA2NGIsIDB4MDY0YywgMHgwNjRkLCAweDA2NGUsIDB4MDBmNCwgMHgwNjRmLCAweDA2NTAsIDB4MDBGNywgLyogZjAgKi8KKyAgICAweDA2NTEsIDB4MDBmOSwgMHgwNjUyLCAweDAwZmIsIDB4MDBmYywgMHgyMDBlLCAweDIwMGYsIDB4ZmZmZCAgLyogZjggKi8KK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9jcDEyNTcgPSB7ICAgICAgICAvKiBXaW5kb3dzIExhdGluLTQgKi8KKyAgICAxMjgsIDAsIFgyVV9DUCwgQUxfUk9NQU4sIldpbmRvd3MgQ29kZSBQYWdlIDEyNTciLCJjcDEyNTciLCAwLCBOVUxMLAorICAgIDB4MjBhYywgMHhmZmZkLCAweDIwMWEsIDB4ZmZmZCwgMHgyMDFlLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAvKiA4MCAqLworICAgIDB4ZmZmZCwgMHgyMDMxLCAweGZmZmQsIDB4MDAzYywgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAvKiA4OCAqLworICAgIDB4ZmZmZCwgMHgyMDE4LCAweDIwMTksIDB4MjAxYywgMHgyMDFkLCAweDIwMjIsIDB4MjAxMiwgMHgyMDE0LCAvKiA5MCAqLworICAgIDB4ZmZmZCwgMHgyMTIyLCAweGZmZmQsIDB4MDAzZSwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAvKiA5OCAqLworICAgIDB4MDBBMCwgMHhmZmZkLCAweDAwQTIsIDB4MDBBMywgMHgwMEE0LCAweGZmZmQsIDB4MDBBNiwgMHgwMEE3LCAvKiBhMCAqLworICAgIDB4MDBkOCwgMHgwMEE5LCAweDAxNTYsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMGM2LCAvKiBhOCAqLworICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHhmZmZkLCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LCAvKiBiMCAqLworICAgIDB4MDBmOCwgMHgwMEI5LCAweDAxNTcsIDB4MDBCQiwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMGU2LCAvKiBiOCAqLworICAgIDB4MDEwNCwgMHgwMTJlLCAweDAxMDAsIDB4MDEwNiwgMHgwMEM0LCAweDAwQzUsIDB4MDExOCwgMHgwMTEyLCAvKiBjMCAqLworICAgIDB4MDEwQywgMHgwMEM5LCAweDAxNzksIDB4MDExNiwgMHgwMTIyLCAweDAxMzYsIDB4MDEyYSwgMHgwMGI3LCAvKiBjOCAqLworICAgIDB4MDE2MCwgMHgwMTQzLCAweDAxNDUsIDB4MDBkMywgMHgwMTRjLCAweDAwRDUsIDB4MDBENiwgMHgwMEQ3LCAvKiBkMCAqLworICAgIDB4MDE3MiwgMHgwMTQxLCAweDAxNUEsIDB4MDE2YSwgMHgwMERDLCAweDAxN2IsIDB4MDE3ZCwgMHgwMERGLCAvKiBkOCAqLworICAgIDB4MDEwNSwgMHgwMTJmLCAweDAxMDEsIDB4MDEwNywgMHgwMEU0LCAweDAwRTUsIDB4MDExOSwgMHgwMTEzLCAvKiBlMCAqLworICAgIDB4MDEwRCwgMHgwMEU5LCAweDAxN2EsIDB4MDExNywgMHgwMTIzLCAweDAxMzcsIDB4MDEyYiwgMHgwMTNjLCAvKiBlOCAqLworICAgIDB4MDE2MSwgMHgwMTQ0LCAweDAxNDYsIDB4MDBmMywgMHgwMTRkLCAweDAwRjUsIDB4MDBGNiwgMHgwMEY3LCAvKiBmMCAqLworICAgIDB4MDE3MywgMHgwMTQyLCAweDAxNWIsIDB4MDE2YiwgMHgwMGZjLCAweDAxN2MsIDB4MDE3ZSwgMHhmZmZkICAvKiBmOCAqLworfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2NwMTI1OCA9IHsgICAgICAgIC8qIFdpbmRvd3MgVmlldCBOYW0gKi8KKyAgICAxMjgsIDAsIFgyVV9DUCwgQUxfUk9NQU4sIldpbmRvd3MgQ29kZSBQYWdlIDEyNTggKFZpZXQgTmFtKSIsImNwMTI1OCIsCisgICAgMCwgTlVMTCwKKyAgICAweDIwYWMsIDB4ZmZmZCwgMHgyMDFhLCAweDAxOTIsIDB4MjAxZSwgMHgyMDI2LCAweDIwMjAsIDB4MjAyMSwgLyogODAgKi8KKyAgICAweDAyYzYsIDB4MjAzMCwgMHhmZmZkLCAweDIwMzksIDB4MDE1MiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgLyogODggKi8KKyAgICAweGZmZmQsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWMsIDB4MjAxZCwgMHgyMDIyLCAweDIwMTMsIDB4MjAxNCwgLyogOTAgKi8KKyAgICAweDAyZGMsIDB4MjEyMiwgMHhmZmZkLCAweDIwM2EsIDB4MDE1MywgMHhmZmZkLCAweGZmZmQsIDB4MDE3OCwgLyogOTggKi8KKyAgICAweDAwQTAsIDB4MDBhMSwgMHgwMEEyLCAweDAwQTMsIDB4MDBBNCwgMHgwMGE1LCAweDAwQTYsIDB4MDBBNywgLyogYTAgKi8KKyAgICAweDAwYTgsIDB4MDBBOSwgMHgwMGFhLCAweDAwQUIsIDB4MDBBQywgMHgwMEFELCAweDAwQUUsIDB4MDBhZiwgLyogYTggKi8KKyAgICAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBiNCwgMHgwMEI1LCAweDAwQjYsIDB4MDBCNywgLyogYjAgKi8KKyAgICAweDAwYjgsIDB4MDBCOSwgMHgwMGJhLCAweDAwQkIsIDB4MDBCQywgMHgwMEJELCAweDAwQkUsIDB4MDBiZiwgLyogYjggKi8KKyAgICAweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAxMDIsIDB4MDBDNCwgMHgwMEM1LCAweDAwYzYsIDB4MDBjNywgLyogYzAgKi8KKyAgICAweDAwYzgsIDB4MDBDOSwgMHgwMGNhLCAweDAwY2IsIDB4MDMwMCwgMHgwMGNkLCAweDAwY2UsIDB4MDBjZiwgLyogYzggKi8KKyAgICAweDAxMTAsIDB4MDBkMSwgMHgwMzA5LCAweDAwZDMsIDB4MDBkNCwgMHgwMWEwLCAweDAwRDYsIDB4MDBENywgLyogZDAgKi8KKyAgICAweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsIDB4MDBEQywgMHgwMWFmLCAweDAzMDMsIDB4MDBERiwgLyogZDggKi8KKyAgICAweDAwZTAsIDB4MDBlMSwgMHgwMGUyLCAweDAxMDMsIDB4MDBFNCwgMHgwMEU1LCAweDAwZTYsIDB4MDBkNywgLyogZTAgKi8KKyAgICAweDAwZTgsIDB4MDBFOSwgMHgwMGVhLCAweDAwZWIsIDB4MDMwMSwgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwgLyogZTggKi8KKyAgICAweDAxMTEsIDB4MDBmMSwgMHgwMzIzLCAweDAwZjMsIDB4MDBmNCwgMHgwMWExLCAweDAwRjYsIDB4MDBGNywgLyogZjAgKi8KKyAgICAweDAwZjgsIDB4MDBmOSwgMHgwMGZhLCAweDAwZmIsIDB4MDBmYywgMHgwMWIwLCAweDIwYWIsIDB4MDBmZiAgLyogZjggKi8KK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9jcDM3ID0geyAgLyogRUJDRElDIFUuUy4gKi8KKyAgICAyNTYsIDAsIFgyVV9DUCwgQUxfUk9NQU4sIkNvZGUgUGFnZSAwMzcgRUJDRElDIChVLlMuKSIsImNwMDM3IiwgMCwgTlVMTCwKKyAgICAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDA5QywgMHgwMDA5LCAweDAwODYsIDB4MDA3RiwKKyAgICAweDAwOTcsIDB4MDA4RCwgMHgwMDhFLCAweDAwMEIsIDB4MDAwQywgMHgwMDBELCAweDAwMEUsIDB4MDAwRiwKKyAgICAweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsIDB4MDA5RCwgMHgwMDg1LCAweDAwMDgsIDB4MDA4NywKKyAgICAweDAwMTgsIDB4MDAxOSwgMHgwMDkyLCAweDAwOEYsIDB4MDAxQywgMHgwMDFELCAweDAwMUUsIDB4MDAxRiwKKyAgICAweDAwODAsIDB4MDA4MSwgMHgwMDgyLCAweDAwODMsIDB4MDA4NCwgMHgwMDBBLCAweDAwMTcsIDB4MDAxQiwKKyAgICAweDAwODgsIDB4MDA4OSwgMHgwMDhBLCAweDAwOEIsIDB4MDA4QywgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKyAgICAweDAwOTAsIDB4MDA5MSwgMHgwMDE2LCAweDAwOTMsIDB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDAwNCwKKyAgICAweDAwOTgsIDB4MDA5OSwgMHgwMDlBLCAweDAwOUIsIDB4MDAxNCwgMHgwMDE1LCAweDAwOUUsIDB4MDAxQSwKKyAgICAweDAwMjAsIDB4MDBBMCwgMHgwMEUyLCAweDAwRTQsIDB4MDBFMCwgMHgwMEUxLCAweDAwRTMsIDB4MDBFNSwKKyAgICAweDAwRTcsIDB4MDBGMSwgMHgwMEEyLCAweDAwMkUsIDB4MDAzQywgMHgwMDI4LCAweDAwMkIsIDB4MDA3QywKKyAgICAweDAwMjYsIDB4MDBFOSwgMHgwMEVBLCAweDAwRUIsIDB4MDBFOCwgMHgwMEVELCAweDAwRUUsIDB4MDBFRiwKKyAgICAweDAwRUMsIDB4MDBERiwgMHgwMDIxLCAweDAwMjQsIDB4MDAyQSwgMHgwMDI5LCAweDAwM0IsIDB4MDBBQywKKyAgICAweDAwMkQsIDB4MDAyRiwgMHgwMEMyLCAweDAwQzQsIDB4MDBDMCwgMHgwMEMxLCAweDAwQzMsIDB4MDBDNSwKKyAgICAweDAwQzcsIDB4MDBEMSwgMHgwMEE2LCAweDAwMkMsIDB4MDAyNSwgMHgwMDVGLCAweDAwM0UsIDB4MDAzRiwKKyAgICAweDAwRjgsIDB4MDBDOSwgMHgwMENBLCAweDAwQ0IsIDB4MDBDOCwgMHgwMENELCAweDAwQ0UsIDB4MDBDRiwKKyAgICAweDAwQ0MsIDB4MDA2MCwgMHgwMDNBLCAweDAwMjMsIDB4MDA0MCwgMHgwMDI3LCAweDAwM0QsIDB4MDAyMiwKKyAgICAweDAwRDgsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAweDAwNjgsIDB4MDA2OSwgMHgwMEFCLCAweDAwQkIsIDB4MDBGMCwgMHgwMEZELCAweDAwRkUsIDB4MDBCMSwKKyAgICAweDAwQjAsIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwKKyAgICAweDAwNzEsIDB4MDA3MiwgMHgwMEFBLCAweDAwQkEsIDB4MDBFNiwgMHgwMEI4LCAweDAwQzYsIDB4MDBBNCwKKyAgICAweDAwQjUsIDB4MDA3RSwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwKKyAgICAweDAwNzksIDB4MDA3QSwgMHgwMEExLCAweDAwQkYsIDB4MDBEMCwgMHgwMERELCAweDAwREUsIDB4MDBBRSwKKyAgICAweDAwNUUsIDB4MDBBMywgMHgwMEE1LCAweDAwQjcsIDB4MDBBOSwgMHgwMEE3LCAweDAwQjYsIDB4MDBCQywKKyAgICAweDAwQkQsIDB4MDBCRSwgMHgwMDVCLCAweDAwNUQsIDB4MDBBRiwgMHgwMEE4LCAweDAwQjQsIDB4MDBENywKKyAgICAweDAwN0IsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMEFELCAweDAwRjQsIDB4MDBGNiwgMHgwMEYyLCAweDAwRjMsIDB4MDBGNSwKKyAgICAweDAwN0QsIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwKKyAgICAweDAwNTEsIDB4MDA1MiwgMHgwMEI5LCAweDAwRkIsIDB4MDBGQywgMHgwMEY5LCAweDAwRkEsIDB4MDBGRiwKKyAgICAweDAwNUMsIDB4MDBGNywgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwKKyAgICAweDAwNTksIDB4MDA1QSwgMHgwMEIyLCAweDAwRDQsIDB4MDBENiwgMHgwMEQyLCAweDAwRDMsIDB4MDBENSwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMEIzLCAweDAwREIsIDB4MDBEQywgMHgwMEQ5LCAweDAwREEsIDB4MDA5RgorfTsKKworLyogT3RoZXIgcHJvcHJpZXRhcnkgOC1iaXQgc2V0cyAqLworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfZGVjbWNzID0geworICAgIDk2LCAzMiwgWDJVX0RFQ3xYMlVfU1RELCBBTF9ST01BTiwgIkRFQyBNdWx0aW5hdGlvbmFsIiwgImRlYy1tY3MiLCAwLCAiJTUiLAorICAgIDB4MDBBMCwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHhmZmZkLCAweDAwQTUsIDB4ZmZmZCwgMHgwMEE3LAorICAgIDB4MDBBNCwgMHgwMEE5LCAweDAwQUEsIDB4MDBBQiwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHhmZmZkLCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAorICAgIDB4ZmZmZCwgMHgwMEI5LCAweDAwQkEsIDB4MDBCQiwgMHgwMEJDLCAweDAwQkQsIDB4ZmZmZCwgMHgwMEJGLAorICAgIDB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LCAweDAwQzUsIDB4MDBDNiwgMHgwMEM3LAorICAgIDB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLCAweDAwQ0QsIDB4MDBDRSwgMHgwMENGLAorICAgIDB4ZmZmZCwgMHgwMEQxLCAweDAwRDIsIDB4MDBEMywgMHgwMEQ0LCAweDAwRDUsIDB4MDBENiwgMHgwMTUyLAorICAgIDB4MDBEOCwgMHgwMEQ5LCAweDAwREEsIDB4MDBEQiwgMHgwMERDLCAweDAwREQsIDB4ZmZmZCwgMHgwMERGLAorICAgIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LCAweDAwRTUsIDB4MDBFNiwgMHgwMEU3LAorICAgIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLCAweDAwRUQsIDB4MDBFRSwgMHgwMEVGLAorICAgIDB4ZmZmZCwgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LCAweDAwRjUsIDB4MDBGNiwgMHgwMTUzLAorICAgIDB4MDBGOCwgMHgwMEY5LCAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLCAweDAwRkQsIDB4ZmZmZCwgMHgwMEZGCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfaHByb21hbjggPSB7CisgICAgOTYsIDMyLCBYMlVfU1RELCBBTF9ST01BTiwgIkhld2xldHQgUGFja2FyZCBSb21hbiA4IiwgImhwLXJvbWFuOCIsIDAsIE5VTEwsCisgICAgMHgwMGEwLCAweDAwYzAsIDB4MDBjMiwgMHgwMGM4LCAweDAwY2EsIDB4MDBjYiwgMHgwMGNlLCAweDAwY2YsCisgICAgMHgwMGI0LCAweDAwYTYsIDB4MDBhOSwgMHgwMGE4LCAweDAwYWMsIDB4MDBkOSwgMHgwMGRiLCAweDIwYTQsCisgICAgMHgwMGFmLCAweDAwZGQsIDB4MDBmZCwgMHgwMGIwLCAweDAwYzcsIDB4MDBlNywgMHgwMGQxLCAweDAwZjEsCisgICAgMHgwMGExLCAweDAwYmYsIDB4MDBhNCwgMHgwMGEzLCAweDAwYTUsIDB4MDBhNywgMHgwMTkyLCAweDAwYTIsCisgICAgMHgwMGUyLCAweDAwZWEsIDB4MDBmNCwgMHgwMGZiLCAweDAwZTEsIDB4MDBlOSwgMHgwMGYzLCAweDAwZmEsCisgICAgMHgwMGUwLCAweDAwZTgsIDB4MDBmMiwgMHgwMGY5LCAweDAwZTQsIDB4MDBlYiwgMHgwMGY2LCAweDAwZmMsCisgICAgMHgwMGM1LCAweDAwZWUsIDB4MDBkOCwgMHgwMGM2LCAweDAwZTUsIDB4MDBlZCwgMHgwMGY4LCAweDAwZTYsCisgICAgMHgwMGM0LCAweDAwZWMsIDB4MDBkNiwgMHgwMGRjLCAweDAwYzksIDB4MDBlZiwgMHgwMGRmLCAweDAwZDQsCisgICAgMHgwMGMxLCAweDAwYzMsIDB4MDBlMywgMHgwMGQwLCAweDAwZjAsIDB4MDBjZCwgMHgwMGNjLCAweDAwZDMsCisgICAgMHgwMGQyLCAweDAwZDUsIDB4MDBmNSwgMHgwMTYwLCAweDAxNjEsIDB4MDBkYSwgMHgwMGI4LCAweDAwZmYsCisgICAgMHgwMGRlLCAweDAwZmUsIDB4MDBiNywgMHgwMGI1LCAweDAwYjYsIDB4MDBiZSwgMHgyMDE1LCAweDAwYmMsCisgICAgMHgwMGJkLCAweDAwYWEsIDB4MDBiYSwgMHgwMGFiLCAweDI1ODgsIDB4MDBiYiwgMHgwMGIxLCAweGZmZmQKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9kZ2kgPSB7CisgOTYsMzIsWDJVX1NURCxBTF9ST01BTiwiRGF0YSBHZW5lcmFsIEludGVybmF0aW9uYWwiLCJkZy1pbnRlcm5hdGlvbmFsIiwwLE5VTEwsCisgICAgMHgwMGEwLCAweDAwYWMsIDB4MDBiZCwgMHgwMGI1LCAweDAwYjIsIDB4MDBiMywgMHgwMGE0LCAweDAwYTIsCisgICAgMHgwMGEzLCAweDAwYWEsIDB4MDBiYSwgMHgwMGExLCAweDAwYmYsIDB4MDBhOSwgMHgwMGFlLCAweDIwMjEsCisgICAgMHgwMGJiLCAweDAwYWIsIDB4MDBiNiwgMHgyMTIyLCAweDAxOTIsIDB4MDBhNSwgMHgwMGIxLCAweDIyNjQsCisgICAgMHgyMjY1LCAweDAwYjcsIDB4MDBiOCwgMHgwMGE3LCAweDAwYjAsIDB4MDBhOCwgMHgwMGI0LCAweDIxOTEsCisgICAgMHgwMGMxLCAweDAwYzAsIDB4MDBjMiwgMHgwMGM0LCAweDAwYzMsIDB4MDBjNSwgMHgwMGM2LCAweDAwYzcsCisgICAgMHgwMGM5LCAweDAwYzgsIDB4MDBjYSwgMHgwMGNiLCAweDAwY2QsIDB4MDBjYywgMHgwMGNlLCAweDAwY2YsCisgICAgMHgwMGQxLCAweDAwZDMsIDB4MDBkMiwgMHgwMGQ0LCAweDAwZDYsIDB4MDBkNSwgMHgwMGQ4LCAweDAyNzYsCisgICAgMHgwMGRhLCAweDAwZDksIDB4MDBkYiwgMHgwMGRjLCAweGZmZmQsIDB4MDE3OCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHgwMGUxLCAweDAwZTAsIDB4MDBlMiwgMHgwMGU0LCAweDAwZTMsIDB4MDBlNSwgMHgwMGU2LCAweDAwZTcsCisgICAgMHgwMGU5LCAweDAwZTgsIDB4MDBlYSwgMHgwMGViLCAweDAwZWQsIDB4MDBlYywgMHgwMGVlLCAweDAwZWYsCisgICAgMHgwMGYxLCAweDAwZjMsIDB4MDBmMiwgMHgwMGY0LCAweDAwZjYsIDB4MDBmNSwgMHgwMGY4LCAweDAxNTMsCisgICAgMHgwMGZhLCAweDAwZjksIDB4MDBmYiwgMHgwMGZjLCAweDAwZGYsIDB4MDBmZiwgMHhmZmZkLCAweDI1ODgKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9uZXh0c3RlcCA9IHsKKyAgICAxMjgsIDAsIDAsIEFMX1JPTUFOLCJOZVhUU1RFUCBNdWx0aW5hdGlvbmFsIiwibmV4dC1tdWx0aW5hdGlvbmFsIiwwLE5VTEwsCisgICAgMHgwMGEwLCAweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsIDB4MDBjNCwgMHgwMGM1LCAweDAwYzcsCisgICAgMHgwMGM4LCAweDAwYzksIDB4MDBjYSwgMHgwMGNiLCAweDAwY2MsIDB4MDBjZCwgMHgwMGNlLCAweDAwY2YsCisgICAgMHgwMGQwLCAweDAwZDEsIDB4MDBkMiwgMHgwMGQzLCAweDAwZDQsIDB4MDBkNSwgMHgwMGQ2LCAweDAwZDksCisgICAgMHgwMGRhLCAweDAwZGIsIDB4MDBkYywgMHgwMGRkLCAweDAwZGUsIDB4MDBiNSwgMHgwMGQ3LCAweDAwZjcsCisgICAgMHgwMGE5LCAweDAwYTEsIDB4MDBhMiwgMHgwMGEzLCAweDIwNDQsIDB4MDBhNSwgMHgwMTkyLCAweDAwYTcsCisgICAgMHgwMGE0LCAweDIwMTksIDB4MjAxYywgMHgwMGFiLCAweDIwMzksIDB4MjAzYSwgMHhmYjAxLCAweGZiMDIsCisgICAgMHgwMGFlLCAweDIwMTMsIDB4MjAyMCwgMHgyMDIxLCAweDAwYjcsIDB4MDBhNiwgMHgwMGI2LCAweDIwMjIsCisgICAgMHgyMDFhLCAweDIwMWUsIDB4MjAxZCwgMHgwMGJiLCAweDIwMjYsIDB4MjAzMCwgMHgwMGFjLCAweDAwYmYsCisgICAgMHgwMGI5LCAweDAyY2IsIDB4MDBiNCwgMHgwMmM2LCAweDAyZGMsIDB4MDBhZiwgMHgwMmQ4LCAweDAyZDksCisgICAgMHgwMGE4LCAweDAwYjIsIDB4MDJkYSwgMHgwMGI4LCAweDAwYjMsIDB4MDJkZCwgMHgwMmRiLCAweDAyYzcsCisgICAgMHgyMDE0LCAweDAwYjEsIDB4MDBiYywgMHgwMGJkLCAweDAwYmUsIDB4MDBlMCwgMHgwMGUxLCAweDAwZTIsCisgICAgMHgwMGUzLCAweDAwZTQsIDB4MDBlNSwgMHgwMGU3LCAweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsCisgICAgMHgwMGVjLCAweDAwYzYsIDB4MDBlZCwgMHgwMGFhLCAweDAwZWUsIDB4MDBlZiwgMHgwMGYwLCAweDAwZjEsCisgICAgMHgwMTQxLCAweDAwZDgsIDB4MDE1MiwgMHgwMGJhLCAweDAwZjIsIDB4MDBmMywgMHgwMGY0LCAweDAwZjUsCisgICAgMHgwMGY2LCAweDAwZTYsIDB4MDBmOSwgMHgwMGZhLCAweDAwZmIsIDB4MDEzMSwgMHgwMGZjLCAweDAwZmQsCisgICAgMHgwMTQyLCAweDAwZjgsIDB4MDE1MywgMHgwMGRmLCAweDAwZmUsIDB4MDBmZiwgMHhmZmZkLCAweGZmZmQKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9tYWNsYXRpbiA9IHsKKyAgICAxMjgsIDAsIDAsIEFMX1JPTUFOLCJNYWNpbnRvc2ggTGF0aW4iLCJtYWNsYXRpbiIsIDAsIE5VTEwsCisgICAgMHgwMEM0LCAweDAwQzUsIDB4MDBDNywgMHgwMEM5LCAweDAwRDEsIDB4MDBENiwgMHgwMERDLCAweDAwRTEsCisgICAgMHgwMEUwLCAweDAwRTIsIDB4MDBFNCwgMHgwMEUzLCAweDAwRTUsIDB4MDBFNywgMHgwMEU5LCAweDAwRTgsCisgICAgMHgwMEVBLCAweDAwRUIsIDB4MDBFRCwgMHgwMEVDLCAweDAwRUUsIDB4MDBFRiwgMHgwMEYxLCAweDAwRjMsCisgICAgMHgwMEYyLCAweDAwRjQsIDB4MDBGNiwgMHgwMEY1LCAweDAwRkEsIDB4MDBGOSwgMHgwMEZCLCAweDAwRkMsCisgICAgMHgwMERELCAweDAwQjAsIDB4MDBBMiwgMHgwMEEzLCAweDAwQTcsIDB4MjAyMiwgMHgwMEI2LCAweDAwREYsCisgICAgMHgwMEFFLCAweDAwQTksIDB4MjEyMiwgMHgwMEI0LCAweDAwQTgsIDB4MjI2MCwgMHgwMEM2LCAweDAwRDgsCisgICAgMHgyMjFFLCAweDAwQjEsIDB4MjI2NCwgMHgyMjY1LCAweDAwQTUsIDB4MDBCNSwgMHgyMjAyLCAweDIyMTEsCisgICAgMHgyMjBGLCAweDAzQzAsIDB4MjIyQiwgMHgwMEFBLCAweDAwQkEsIDB4MjEyNiwgMHgwMEU2LCAweDAwRjgsCisgICAgMHgwMEJGLCAweDAwQTEsIDB4MDBBQywgMHgyMjFBLCAweDAxOTIsIDB4MjI0OCwgMHgyMjA2LCAweDAwQUIsCisgICAgMHgwMEJCLCAweDIwMjYsIDB4MDBBMCwgMHgwMEMwLCAweDAwQzMsIDB4MDBENSwgMHgwMTUyLCAweDAxNTMsCisgICAgMHgyMDEzLCAweDIwMTQsIDB4MjAxQywgMHgyMDFELCAweDIwMTgsIDB4MjAxOSwgMHgwMEY3LCAweDI1Q0EsCisgICAgMHgwMEZGLCAweDAxNzgsIDB4MjA0NCwgMHgwMEE0LCAweDAwRDAsIDB4MDBGMCwgMHgwMERFLCAweDAwRkUsCisgICAgMHgwMEZELCAweDAwQjcsIDB4MjAxQSwgMHgyMDFFLCAweDIwMzAsIDB4MDBDMiwgMHgwMENBLCAweDAwQzEsCisgICAgMHgwMENCLCAweDAwQzgsIDB4MDBDRCwgMHgwMENFLCAweDAwQ0YsIDB4MDBDQywgMHgwMEQzLCAweDAwRDQsCisgICAgMHhGOEZGLCAweDAwRDIsIDB4MDBEQSwgMHgwMERCLCAweDAwRDksIDB4MDEzMSwgMHgwMkM2LCAweDAyREMsCisgICAgMHgwMEFGLCAweDAyRDgsIDB4MDJEOSwgMHgwMkRBLCAweDAwQjgsIDB4MDJERCwgMHgwMkRCLCAweDAyQzcKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9xdWlja2RyYXcgPSB7CisgICAgMTI4LCAwLCAwLCBBTF9ST01BTiwiUXVpY2tEcmF3IiwicXVpY2tkcmF3IiwgMCwgTlVMTCwKKyAgICAweDAwQzQsIDB4MDBDNSwgMHgwMEM3LCAweDAwQzksIDB4MDBEMSwgMHgwMEQ2LCAweDAwREMsIDB4MDBFMSwKKyAgICAweDAwRTAsIDB4MDBFMiwgMHgwMEU0LCAweDAwRTMsIDB4MDBFNSwgMHgwMEU3LCAweDAwRTksIDB4MDBFOCwKKyAgICAweDAwRUEsIDB4MDBFQiwgMHgwMEVELCAweDAwRUMsIDB4MDBFRSwgMHgwMEVGLCAweDAwRjEsIDB4MDBGMywKKyAgICAweDAwRjIsIDB4MDBGNCwgMHgwMEY2LCAweDAwRjUsIDB4MDBGQSwgMHgwMEY5LCAweDAwRkIsIDB4MDBGQywKKyAgICAweDIwMjAsIDB4MDBCMCwgMHgwMEEyLCAweDAwQTMsIDB4MDBBNywgMHgyMDIyLCAweDAwQjYsIDB4MDBERiwKKyAgICAweDAwQUUsIDB4MDBBOSwgMHgyMTIyLCAweDAwQjQsIDB4MDBBOCwgMHgyMjYwLCAweDAwQzYsIDB4MDBEOCwKKyAgICAweDIyMUUsIDB4MDBCMSwgMHgyMjY0LCAweDIyNjUsIDB4MDBBNSwgMHgwMEI1LCAweDIyMDIsIDB4MjIxMSwKKyAgICAweDIyMEYsIDB4MDNDMCwgMHgyMjJCLCAweDAwQUEsIDB4MDBCQSwgMHgwM0E5LCAweDAwRTYsIDB4MDBGOCwKKyAgICAweDAwQkYsIDB4MDBBMSwgMHgwMEFDLCAweDIyMUEsIDB4MDE5MiwgMHgyMjQ4LCAweDIyMDYsIDB4MDBBQiwKKyAgICAweDAwQkIsIDB4MjAyNiwgMHgwMEEwLCAweDAwQzAsIDB4MDBDMywgMHgwMEQ1LCAweDAxNTIsIDB4MDE1MywKKyAgICAweDIwMTMsIDB4MjAxNCwgMHgyMDFDLCAweDIwMUQsIDB4MjAxOCwgMHgyMDE5LCAweDAwRjcsIDB4MjVDQSwKKyAgICAweDAwRkYsIDB4MDE3OCwgMHgyMDQ0LCAweDAwQTQsIDB4MjAzOSwgMHgyMDNBLCAweEZCMDEsIDB4RkIwMiwKKyAgICAweDIwMjEsIDB4MDBCNywgMHgyMDFBLCAweDIwMUUsIDB4MjAzMCwgMHgwMEMyLCAweDAwQ0EsIDB4MDBDMSwKKyAgICAweDAwQ0IsIDB4MDBDOCwgMHgwMENELCAweDAwQ0UsIDB4MDBDRiwgMHgwMENDLCAweDAwRDMsIDB4MDBENCwKKyAgICAweEY4RkYsIDB4MDBEMiwgMHgwMERBLCAweDAwREIsIDB4MDBEOSwgMHgwMTMxLCAweDAyQzYsIDB4MDJEQywKKyAgICAweDAwQUYsIDB4MDJEOCwgMHgwMkQ5LCAweDAyREEsIDB4MDBCOCwgMHgwMkRELCAweDAyREIsIDB4MDJDNworfTsKKworLyogREVDIHNwZWNpYWwgZ3JhcGhpY3MgLyB0ZWNobmljYWwgc2V0cyBmb3IgVlQgZW11bGF0aW9uICovCisKKyNpZmRlZiBLRVJNSVRGT05UCitzdHJ1Y3QgeF90b191bmljb2RlIHVfZGVjdGVjaCA9IHsKKyAgICA5NCwgMzMsIFgyVV9ERUN8WDJVX1NURCxBTF9ST01BTiwiREVDIFRlY2huaWNhbCIsICJkZWMtdGVjaG5pY2FsIiwgMCwgIj4iLAorICAgICAgICAgICAgMHhFNDAwLCAweDI1MGMsIDB4MjUwMCwgMHgyMzIwLCAweDIzMjEsIDB4MjUwMiwgMHhFMjA0LAorICAgIDB4RTIwMywgMHhFMjA5LCAweEUyMDgsIDB4RTIwMiwgMHhFMjAxLCAweEUyMDcsIDB4RTIwNiwgMHhFMjAwLAorICAgIDB4RTIwNSwgMHhFMjBELCAweEUyMEMsIDB4MjU3MiwgMHgyNTcxLCAweEUyMEUsIDB4RTIwRiwgMHgyMzJhLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHgyMjY0LCAweDIyNjAsIDB4MjI2NSwgMHgyMjJiLAorICAgIDB4MjIzNCwgMHgyMjFkLCAweDIyMWUsIDB4MDBmNywgMHgyMjA2LCAweDIyMDcsIDB4MDNhNiwgMHgwMzkzLAorICAgIDB4MjIzYywgMHgyMjQzLCAweDAzOTgsIDB4MDBkNywgMHgwMzliLCAweDIxZDQsIDB4MjFkMiwgMHgyMjYxLAorICAgIDB4MjIwZiwgMHgwM2E4LCAweEU0MDEsIDB4MDNhMywgMHhGRkZELCAweGZmZmQsIDB4MjIxYSwgMHgwM2E5LAorICAgIDB4MDM5ZSwgMHgwM2QyLCAweDIyODIsIDB4MjI4MywgMHgyMjI5LCAweDIyMmEsIDB4MjIyNywgMHgyMjI4LAorICAgIDB4MDBhYywgMHgwM2IxLCAweDAzYjIsIDB4MDNjNywgMHgwM2I0LCAweDAzYjUsIDB4MDNjNiwgMHgwM2IzLAorICAgIDB4MDNiNywgMHgwM2I5LCAweDAzYjgsIDB4MDNiYSwgMHgwM2JiLCAweEZGRkQsIDB4MDNiZCwgMHgyMjAyLAorICAgIDB4MDNjMCwgMHgwM2M4LCAweDAzYzEsIDB4MDNjMywgMHgwM2M0LCAweEZGRkQsIDB4MDE5MiwgMHgwM2M5LAorICAgIDB4MDNiZSwgMHgwM2M1LCAweDAzYjYsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTIsIDB4MjE5MworfTsKKyNlbHNlCitzdHJ1Y3QgeF90b191bmljb2RlIHVfZGVjdGVjaCA9IHsKKyAgICA5NCwgMzMsIFgyVV9ERUN8WDJVX1NURCxBTF9ST01BTiwiREVDIFRlY2huaWNhbCIsICJkZWMtdGVjaG5pY2FsIiwgMCwgIj4iLAorICAgICAgICAgICAgMHgyMjFhLCAweDI1MGMsIDB4MjUwMCwgMHgyMzIwLCAweDIzMjEsIDB4MjUwMiwgMHgyMzA4LCAvKiAyMS0yNyAqLworICAgIDB4MjMwYSwgMHgyMzA5LCAweDIzMGIsIDB4MjU2ZCwgMHgyNTcwLCAweDI1NmUsIDB4MjU2ZiwgMHgyNTI1LCAvKiAyOC0yZiAqLworICAgIDB4MjUxZCwgMHgyMjExLCAweDIyMTEsIDB4MjU3MiwgMHgyNTcxLCAweDIzMWQsIDB4MjMxZiwgMHgyMzJhLCAvKiAzMC0zNyAqLworICAgIDB4MDA1YiwgMHgyMDIyLCAweDAwNWQsIDB4MDBiMSwgMHgyMjY0LCAweDIyNjAsIDB4MjI2NSwgMHgyMjJiLCAvKiAzOC0zZiAqLworICAgIDB4MjIzNCwgMHgyMjFkLCAweDIyMWUsIDB4MDBmNywgMHgyNWIzLCAweDI1YmQsIDB4MDNhNiwgMHgwMzkzLCAvKiA0MC00NyAqLworICAgIDB4MjIzYywgMHgyMjQzLCAweDAzOTgsIDB4MDBkNywgMHgwMzliLCAweDIxZDQsIDB4MjFkMiwgMHgyMjYxLCAvKiA0OC00ZiAqLworICAgIDB4MjIwZiwgMHgwM2E4LCAweDIyMTgsIDB4MjIxMSwgMHgwMGE3LCAweDAwYjYsIDB4MjIxYSwgMHgwM2E5LCAvKiA1MC01NyAqLworICAgIDB4MDM5ZSwgMHgwM2QyLCAweDIyODIsIDB4MjI4MywgMHgyMjI5LCAweDIyMmEsIDB4MjIyNywgMHgyMjI4LCAvKiA1OC01ZiAqLworICAgIDB4MDBhYywgMHgwM2IxLCAweDAzYjIsIDB4MDNjNywgMHgwM2I0LCAweDAzYjUsIDB4MDNjNiwgMHgwM2IzLCAvKiA2MC02NyAqLworICAgIDB4MDNiNywgMHgwM2I5LCAweDAzYjgsIDB4MDNiYSwgMHgwM2JiLCAweDAzYmMsIDB4MDNiZCwgMHgyMjAyLCAvKiA2OC02ZiAqLworICAgIDB4MDNjMCwgMHgwM2M4LCAweDAzYzEsIDB4MDNjMywgMHgwM2M0LCAweDAwMjAsIDB4MDE5MiwgMHgwM2M5LCAvKiA3MC03NyAqLworICAgIDB4MDNiZSwgMHgwM2M1LCAweDAzYjYsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTIsIDB4MjE5MyAgICAgICAgICAvKiA3OC03ZSAqLworfTsKKyNlbmRpZiAvKiBLRVJNSVRGT05UICovCisKKyNpZmRlZiBLRVJNSVRGT05UCitzdHJ1Y3QgeF90b191bmljb2RlIHVfZGVjc3BlYyA9IHsKKyAgICA5NCwzMyxYMlVfREVDfFgyVV9TVEQsQUxfUk9NQU4sIkRFQyBTcGVjaWFsIEdyYXBoaWNzIiwiZGVjLXNwZWNpYWwiLDAsIjAiLAorICAgICAgICAgICAgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwgMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwgMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorICAgIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorICAgIDB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwgMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorICAgIDB4MjY2NiwgMHgyNTkxLCAweDI0MDksIDB4MjQwYywgMHgyNDBkLCAweDI0MGEsIDB4MDBiMCwgMHgwMGIxLAorICAgIDB4MjQyNCwgMHgyNDBiLCAweDI1MTgsIDB4MjUxMCwgMHgyNTBjLCAweDI1MTQsIDB4MjUzYywgMHgyM0JBLAorICAgIDB4MjNCQiwgMHgyNTAwLCAweDIzQkMsIDB4MjNCRCwgMHgyNTFjLCAweDI1MjQsIDB4MjUzNCwgMHgyNTJjLAorICAgIDB4MjUwMiwgMHgyMjY0LCAweDIyNjUsIDB4MDNjMCwgMHgyMjYwLCAweDAwYTMsIDB4MDBCNworfTsKKyNlbHNlCitzdHJ1Y3QgeF90b191bmljb2RlIHVfZGVjc3BlYyA9IHsKKyAgICA5NCwzMyxYMlVfREVDfFgyVV9TVEQsQUxfUk9NQU4sIkRFQyBTcGVjaWFsIEdyYXBoaWNzIiwiZGVjLXNwZWNpYWwiLDAsIjAiLAorICAgICAgICAgICAgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwgMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwgMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorICAgIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorICAgIDB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwgMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorICAgIDB4MjY2NiwgMHgyNTkxLCAweDI0MDksIDB4MjQwYywgMHgyNDBkLCAweDI0MGEsIDB4MDBiMCwgMHgwMGIxLAorICAgIDB4MjQyNCwgMHgyNDBiLCAweDI1MTgsIDB4MjUxMCwgMHgyNTBjLCAweDI1MTQsIDB4MjUzYywgMHgyNTk0LAorICAgIDB4MjUwMCwgMHgyNTAwLCAweDI1MDAsIDB4MjUwMCwgMHgyNTFjLCAweDI1MjQsIDB4MjUzNCwgMHgyNTJjLAorICAgIDB4MjUwMiwgMHgyMjY0LCAweDIyNjUsIDB4MDNhMCwgMHgyMjYwLCAweDAwYTMsIDB4MDBCNworfTsKKyNlbmRpZiAvKiBLRVJNSVRGT05UICovCisKKy8qCisgIEhhemVsdGluZSAxNTAwLzE1MjAgZ3JhcGhpYyBzZXQuICBJbmNsdWRlcyBzZXZlcmFsIGFwcHJveGltYXRpb25zOgorICAgLiAoMCw5KSBzaG91bGQgYmUgaGVhdnkgYmxhY2sgcmlnaHQgYXJyb3cuICBVbmljb2RlIGhhcyBvbmUgb2YgdGhlc2UKKyAgICAgYXQgVSsyN0ExIGJ1dC4uLgorICAgLiAoMyw5KSBzaG91bGQgYmUgaGVhdnkgYmxhY2sgZG93biBhcnJvdzsgVW5pY29kZSBkb2Vzbid0IGhhdmUgb25lLgorICAgICBTbyB3ZSB1c2UgdGhlIHdoaXRlIHZlcnNpb25zIG9mIHRoZSBoZWF2eSBhcnJvd3MgaW5zdGVhZC4KKyAgIC4gKDEsOSkgdGhlIGxldHRlcnMgIlBlIiBpbiBvbmUgY2VsbCwgZG9lc24ndCBleGlzdCBpbiBVbmljb2RlLgorICAgICBTdWJzdGl0dXRpb24gaXMganVzdCAiUCIuCisqLworc3RydWN0IHhfdG9fdW5pY29kZSB1X2h6MTUwMCA9IHsKKyAgICA5NCwzMyxYMlVfU1RELEFMX1JPTUFOLCJIYXplbHRpbWUgR3JhcGhpY3MiLCJoejE1MDAtZ3JhcGhpY3MiLDAsIjAiLAorLyogICAgIDAgICAgICAgMSAgICAgICAyICAgICAgIDMgICAgICAgNCAgICAgICA1ICAgICAgIDYgICAgICAgNyAgICAgICAgICovCisgICAgICAgICAgICAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIC8qIDAgKi8KKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwgLyogMSAqLworICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAvKiAyICovCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsIC8qIDMgKi8KKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgLyogNCAqLworICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLCAvKiA1ICovCisgICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIC8qIDYgKi8KKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsIDB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwgLyogNyAqLworICAgIDB4MjUwMCwgMHgyNTAyLCAweDI1M2MsIDB4MjUzNCwgMHgyNTJjLCAweDI1MTQsIDB4MjUwYywgMHgwMGIxLCAvKiA4ICovCisgICAgMHgyMWU4LCAweDAwNTAsIDB4MDBmNywgMHgyMWU5LCAweDI1MTAsIDB4MjUxOCwgMHgyNTFjLCAweDI1MjQsIC8qIDkgKi8KKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDI1MGMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgLyogYSAqLworICAgIDB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwgMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSAgICAgICAgICAvKiBiICovCisKK307CisKKyNpZmRlZiBLRVJNSVRGT05UCitzdHJ1Y3QgeF90b191bmljb2RlIHVfaGVhdGgxOWcgPSB7CisgICAgOTQsMzMsWDJVX1NURCxBTF9ST01BTiwiSGVhdGgtMTkgU3BlY2lhbCBHcmFwaGljcyIsImgxOS1zcGVjaWFsIiwwLE5VTEwsCisgICAgICAgICAgICAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisgICAgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisgICAgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLCAweDAwNWMsIDB4MDA1ZCwgMHgyNWNmLCAweGUzMGIsCisgICAgMHgyNTAyLCAweDI1MDAsIDB4MjUzYywgMHgyNTEwLCAweDI1MTgsIDB4MjUxNCwgMHgyNTBjLCAweDAwYjEsCisgICAgMHgyMTkyLCAweDI1OTIsIDB4MDBmNywgMHgyMTkzLCAweGUzMjEsIDB4ZTMyMCwgMHhlMzIyLCAweGUzMjgsCisgICAgMHgyNTgwLCAweGUzMjUsIDB4ZTMwYSwgMHgyNTJjLCAweDI1MjQsIDB4MjUzNCwgMHgyNTFjLCAweDI1NzMsCisgICAgMHgyNTcxLCAweDI1NzIsIDB4ZTMxMSwgMHhlMzE5LCAweGUzMDAsIDB4ZTMwOSwgMHgwMGI2Cit9OworI2Vsc2UKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9oZWF0aDE5ZyA9IHsKKyAgICA5NCwzMyxYMlVfU1RELEFMX1JPTUFOLCJIZWF0aC0xOSBTcGVjaWFsIEdyYXBoaWNzIiwiaDE5LXNwZWNpYWwiLDAsTlVMTCwKKyAgICAgICAgICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKyAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKyAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsIDB4MDA1YywgMHgwMDVkLCAweDI1Y2YsIDB4MjVlNSwKKyAgICAweDI1MDIsIDB4MjUwMCwgMHgyNTNjLCAweDI1MTAsIDB4MjUxOCwgMHgyNTE0LCAweDI1MGMsIDB4MDBiMSwKKyAgICAweDIxOTIsIDB4MjU5MiwgMHgwMGY3LCAweDIxOTMsIDB4MjU5MCwgMHgyNThjLCAweDI1OGMsIDB4MjU5MCwKKyAgICAweDI1ODAsIDB4MjU5MCwgMHgyNWU0LCAweDI1MmMsIDB4MjUyNCwgMHgyNTM0LCAweDI1MWMsIDB4MjU3MywKKyAgICAweDI1NzEsIDB4MjU3MiwgMHgyNTAwLCAweDI1MDAsIDB4MjUwMiwgMHgyNTAyLCAweDAwYjYKK307CisjZW5kaWYgLyogS0VSTUlURk9OVCAqLworCisvKiBERyBHcmFwaGljIHNldHMgLSAiS0VSTUlURk9OVCIgdGhlc2UgbGF0ZXIuLi4gKi8KKworLyogTWlzc2luZywgICAgYmFja3dhcmRzIHF1ZXN0aW9uIG1hcmsKKyAgIGVpZ2h0aCBub3RlCisgICAiRFQiIGNvbnRyb2wgcGljCisgICBob3Jpem9udGFsIHNjYW4gbGluZXMKKyovCitzdHJ1Y3QgeF90b191bmljb2RlIHVfZGdzcGVjID0geyAgICAgICAgLyogTmVlZHMgdG8gYmUgY2hlY2tlZCAqLworICAgIDk0LCAzMywgWDJVX1NURCxBTF9ST01BTiwiREcgU3BlY2lhbCBHcmFwaGljcyIsImRnLXNwZWNpYWxncmFwaGljcyIsMCxOVUxMLAorICAgICAgICAgICAgMHhmZmZkLCAweGZmZmQsIDB4MjQyNCwgMHgyNTk0LCAweDI1OTQsIDB4MjU4MSwgMHgyNTgxLAorICAgIDB4MjVhMSwgMHgyNjNhLCAweDI2M2IsIDB4MjY2NSwgMHgyNjYzLCAweDI2NjAsIDB4MjVjZiwgMHgyNWQ4LAorICAgIDB4MjVjYiwgMHgyNWQ5LCAweDI2NDIsIDB4MjY0MCwgMHgyNjZhLCAweDI2NmMsIDB4MjYzYywgMHgyMTk1LAorICAgIDB4MjU4MywgMHgyMWE4LCAweDIzMWUsIDB4MjE5NCwgMHgyMjA3LCAweDAwZmYsIDB4MjBhNywgMHgwMGFhLAorICAgIDB4MDBiYSwgMHgyMzFjLCAweDIzMWQsIDB4MjU5MSwgMHgyNTkxLCAweDI1OTMsIDB4MjU2MSwgMHgyNTYyLAorICAgIDB4MjU1NiwgMHgyNTU1LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LCAweDI1NWQsIDB4MjU1YywgMHgyNTViLAorICAgIDB4MjU1ZSwgMHgyNTVmLCAweDI1NWEsIDB4MjU1NCwgMHgyNTY5LCAweDI1NjYsIDB4MjU2MCwgMHgyNTUwLAorICAgIDB4MjU2YywgMHgyNTY3LCAweDI1NjgsIDB4MjU2NCwgMHgyNTY1LCAweDI1NTksIDB4MjU1OCwgMHgyNTUyLAorICAgIDB4MjU1MywgMHgyNTZiLCAweDI1NmEsIDB4MjU4OCwgMHgyNTg0LCAweDI1OGMsIDB4MjU5MCwgMHgyNTgwLAorICAgIDB4MDM5MywgMHgwM2MwLCAweDAzYTMsIDB4MDNhNiwgMHgwMzk4LCAweDAzZDUsIDB4MDNiNSwgMHgwM2EwLAorICAgIDB4MDM5ZSwgMHgwMGI3LCAweDAzYjcsIDB4MjVhMCwgMHgwMTc4LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLAorICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZAorfTsKKworLyogTWlzc2luZzogYXJyb3ctdG8tbGluZSwgdmFyaW91cyBvcmllbnRhdGlvbnMgKi8KKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2RnbGluZSA9IHsKKyAgICA5NCwgMzMsIFgyVV9TVEQsQUxfUk9NQU4sIkRHIExpbmUgRHJhd2luZyIsImRnLWxpbmVkcmF3aW5nIiwwLE5VTEwsCisgICAgICAgICAgICAweDI1MGMsIDB4MjUxMCwgMHgyNTE0LCAweDI1MTgsIDB4MjUyYywgMHgyNTI0LCAweDI1MWMsCisgICAgMHgyNTM0LCAweDI1M2MsIDB4MjUwMiwgMHgyNTAwLCAweDIxOWYsIDB4MjFlNSwgMHgyMWU0LCAweDIxYTEsCisgICAgMHgyNTA2LCAweDI1MGYsIDB4MjUxMywgMHgyNTE3LCAweDI1MWIsIDB4MjUzMywgMHgyNTJiLCAweDI1MjMsCisgICAgMHgyNTNiLCAweDI1NGIsIDB4MjUwMywgMHgyNTAxLCAweDI1MDQsIDB4MDBmNywgMHgwMGEyLCAweDIxMjIsCisgICAgMHgwMGFlLCAweDAwYTksIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfZGd3b3JkID0geworICAgIDk0LCAzMywgWDJVX1NURCxBTF9ST01BTiwiREcgV29yZCBQcm9jZXNzaW5nIiwiZGctd29yZHByb2Nlc3NpbmciLDAsTlVMTCwKKyAgICAgICAgICAgIDB4MjMwOCwgMHgyMzBhLCAweDIzMDksIDB4MjMwYiwgMHgwMTkyLCAweDIyM2MsIDB4MjIwMiwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHgyMzIwLCAweDIzMjEsIDB4MjIxYSwgMHhmZmZkLCAweDIyMWUsIDB4MjIxZCwKKyAgICAweDIwNzAsIDB4MDBiOSwgMHgwMGIyLCAweDAwYjMsIDB4MjA3NCwgMHgyMDc1LCAweDIwNzYsIDB4MjA3NywKKyAgICAweDIwNzgsIDB4MjA3OSwgMHgyMjYwLCAweGZmZmQsIDB4MjFlZiwgMHhmZmZkLCAweDIxZTUsIDB4MDBiNywKKyAgICAweDIwM2MsIDB4MDNiMSwgMHgwM2IyLCAweDAzYjMsIDB4MDNiNCwgMHgwM2I1LCAweDAzYjYsIDB4MDNiNywKKyAgICAweDAzYjgsIDB4MDNiOSwgMHgwM2JhLCAweDAzYmIsIDB4MDNiYywgMHgwM2JkLCAweDAzYmUsIDB4MDNiZiwKKyAgICAweDAzYzAsIDB4MDNjMSwgMHgwM2MzLCAweDAzYzQsIDB4MDNjNSwgMHgwM2M2LCAweDAzYzcsIDB4MDNjOCwKKyAgICAweDAzYzksIDB4MDNhOSwgMHgwMzk0LCAweDAwYjYsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwKKyAgICAweDIyYTYsIDB4MjVjNiwgMHgyNWI2LCAweDI1YjcsIDB4MjVjMCwgMHgyNWIyLCAweDI1YmMsIDB4MjMyNywKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDI1ZTMsIDB4MjVlMiwKKyAgICAweDIwODAsIDB4MjA4MSwgMHgyMDgyLCAweDIwODMsIDB4MjA4NCwgMHgyMDg1LCAweDIwODYsIDB4MjA4NywKKyAgICAweDIwODgsIDB4MjA4OSwgMHhmZmZkLCAweDIxOTEsIDB4MjE5MiwgMHgyMTkwLCAweDIxOTMKK307CisKKy8qIEhQIEdyYXBoaWMgc2V0cyAtICJLRVJNSVRGT05UIiB0aGVzZSBsYXRlci4uLiAqLworCisvKgorICBNYW55IGFyZSBtaXNzaW5nIGZyb20gVW5pY29kZSwKKyAgU2luZ2xlLXRvLXRyaXBsZS1saW5lIGJveC1kcmF3aW5nIGNoYXJhY3RlcnMuCisgIERvdWJsZS9kb3VibGUgY3Jvc3MgJiBzb21lIG90aGVycy4KKyovCitzdHJ1Y3QgeF90b191bmljb2RlIHVfaHBsaW5lID0geyAgICAgICAgLyogTmVlZHMgdG8gYmUgY2hlY2tlZCAqLworICAgIDk0LCAzMywgWDJVX1NURCxBTF9ST01BTiwiSFAgTGluZSBEcmF3aW5nIEdyYXBoaWNzIiwKKyAgICAiaHAtbGluZS1kcmF3aW5nIiwwLE5VTEwsCisgICAgICAgICAgICAweDI1MjAsIDB4MjUyOCwgMHgyNTJmLCAweDI1MzcsIDB4MjU1ZiwgMHgyNTYyLCAweDI1NjQsCisgICAgMHgyNTY3LCAweDI1NTEsIDB4MjU0MiwgMHgyNTNmLCAweDI1NTAsIDB4MjMwYSwgMHgyNTAyLCAweDI1M2MsCisgICAgMHgyNTRiLCAweDI1MjMsIDB4MjUyYiwgMHgyNTMzLCAweDI1M2IsIDB4MjUxYywgMHgyNTI0LCAweDI1MmMsCisgICAgMHgyNTM0LCAweDI1NTAsIDB4MjUwMywgMHgyNTAxLCAweDI1NmIsIDB4MjMwOCwgMHgyNTZhLCAweDI1NmMsCisgICAgMHgyNTVlLCAweDI1MTcsIDB4MjU0OSwgMHgyNTg4LCAweDI1OGMsIDB4MjU4ZSwgMHgyNTE0LCAweDI1MTgsCisgICAgMHgyNTEwLCAweDI1NTUsIDB4MjUyYywgMHgyNTU2LCAweDI1NTYsIDB4MjU0NywgMHgyNTQ4LCAweDI1NTUsCisgICAgMHgyMzBiLCAweDI1MGYsIDB4MjUwYywgMHgyNTFiLCAweDI1MTAsIDB4MjUyNCwgMHgyNTRhLCAweDI1MTMsCisgICAgMHgyNTg0LCAweDIzMDksIDB4MjU4MiwgMHgyNTYxLCAweDI1MDQsIDB4MjU1OSwgMHgyNTc2LCAweDI1NjUsCisgICAgMHgyNTVlLCAweDI1MTcsIDB4MjU0OSwgMHgyNTg4LCAweDI1OGMsIDB4MjU4ZSwgMHgyNTE0LCAweDI1MTgsCisgICAgMHgyNTEwLCAweDI1NTUsIDB4MjUyYywgMHgyNTU2LCAweDI1NTYsIDB4MjU0NywgMHgyNTQ4LCAweDI1NTUsCisgICAgMHgyMzBiLCAweDI1MGYsIDB4MjUwYywgMHgyNTFiLCAweDI1MTAsIDB4MjUyNCwgMHgyNTRhLCAweDI1MTMsCisgICAgMHgyNTg0LCAweDIzMDksIDB4MjU4MiwgMHgyNTYxLCAweDI1MDQsIDB4MjU1OSwgMHgyNTc2Cit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfaHBtYXRoID0geworICAgIDk0LCAzMywgWDJVX1NURCxBTF9ST01BTiwiSFAgTWF0aC9UZWNobmljYWwiLCJocC1tYXRoL3RlY2huaWNhbCIsMCxOVUxMLAorICAgICAgICAgICAgMHgyMjFhLCAweDIyMjMsIDB4MDBhNywgMHgyMjA3LCAweDAwYjEsIDB4MDNiMSwgMHgyMzIwLAorICAgIDB4MDBmNywgMHgyMjQzLCAweDAzYTAsIDB4MDM5MywgMHgwM2M4LCAweDIyNjEsIDB4MDNhNiwgMHgwMzllLAorICAgIDB4MjA3MCwgMHgwMGI5LCAweDAwYjIsIDB4MDBiMywgMHgyMDc0LCAweDIwNzUsIDB4MjA3NiwgMHgyMDc3LAorICAgIDB4MjA3OCwgMHgyMDc5LCAweDAzYTksIDB4MDM5YiwgMHgyMjFlLCAweDIzMjEsIDB4MjAyMCwgMHgwM2EzLAorICAgIDB4MDBiNiwgMHgwM2IxLCAweDAzYjIsIDB4MDNjOCwgMHgwM2Q1LCAweDAzYjUsIDB4MjIwMiwgMHgwM2JiLAorICAgIDB4MDNiNywgMHgwM2I5LCAweDAzOTgsIDB4MDNiYSwgMHgwM2M5LCAweDAzYmMsIDB4MDNiZCwgMHgwM2MxLAorICAgIDB4MDNjMCwgMHgwM2IzLCAweDAzYjgsIDB4MDNjMywgMHgwM2M0LCAweDAzYmUsIDB4MDM5NCwgMHgwM2I0LAorICAgIDB4MDBkNywgMHgwM2M1LCAweDAzYjYsIDB4MjE5MSwgMHgyMTkyLCAweDAzZDIsIDB4MjE5MCwgMHgyMTkzLAorICAgIDB4MDBiNiwgMHgwM2IxLCAweDAzYjIsIDB4MDNjOCwgMHgwM2Q1LCAweDAzYjUsIDB4MjIwMiwgMHgwM2JiLAorICAgIDB4MDNiNywgMHgwM2I5LCAweDAzOTgsIDB4MDNiYSwgMHgwM2M5LCAweDAzYmMsIDB4MDNiZCwgMHgwM2MxLAorICAgIDB4MDNjMCwgMHgwM2IzLCAweDAzYjgsIDB4MDNjMywgMHgwM2M0LCAweDAzYmUsIDB4MDM5NCwgMHgwM2I0LAorICAgIDB4MDBkNywgMHgwM2M1LCAweDAzYjYsIDB4MjE5MSwgMHgyMTkyLCAweDAzZDIsIDB4MjE5MAorfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X3R2aWcgPSB7CisgICAgMTUsNjUsMCwwLCJUZWxldmlkZW8gU3BlY2lhbCBHcmFwaGljcyIsInR2aS1zcGVjaWFsIiwwLE5VTEwsCisgICAgICAgICAgICAweDI1NzAsIDB4MjU2RCwgMHgyNTZFLCAweDI1NkYsIDB4MjUxNCwgMHgyNTBDLCAweDI1MTAsCisgICAgMHgyNTE4LCAweDI1M0MsIDB4MjUwMiwgMHgyNTAwLCAweDI1MjQsIDB4MjUxQywgMHgyNTJDLCAweDI1MzQKK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV93eXNlX2duID0geworI2lmZGVmIENPTU1FTlQKKyAgICAxNiwxNiwwLDAsIld5c2UgTm9ybWFsLU1vZGUgR3JhcGhpY3MiLCJ3eS1ncmFwaGljcy1ub3JtYWwiLDAsTlVMTCwKKyAgICAweDI1MkMsIDB4MjUxNCwgMHgyNTBDLCAweDI1MTAsIDB4MjUxQywgMHgyNTE4LCAweDI1MDIsIDB4MjU4OCwKKyAgICAweDI1M0MsIDB4MjUyNCwgMHgyNTAwLCAweDI1OTIsIDB4MjU1MCwgMHgyNTM0LCAweDI1NTEsIDB4MjU5MQorI2Vsc2UKKyAgICA4MCw0OCwwLDAsIld5c2UgTm9ybWFsLU1vZGUgR3JhcGhpY3MiLCJ3eS1ncmFwaGljcy1ub3JtYWwiLDAsTlVMTCwKKyAgICAweDI1MkMsIDB4MjUxNCwgMHgyNTBDLCAweDI1MTAsIDB4MjUxQywgMHgyNTE4LCAweDI1MDIsIDB4MjU4OCwKKyAgICAweDI1M0MsIDB4MjUyNCwgMHgyNTAwLCAweDI1OTIsIDB4MjU1MCwgMHgyNTM0LCAweDI1NTEsIDB4MjU5MSwKKyAgICAweDI1MkMsIDB4MjUxNCwgMHgyNTBDLCAweDI1MTAsIDB4MjUxQywgMHgyNTE4LCAweDI1MDIsIDB4MjU4OCwKKyAgICAweDI1M0MsIDB4MjUyNCwgMHgyNTAwLCAweDI1OTIsIDB4MjU1MCwgMHgyNTM0LCAweDI1NTEsIDB4MjU5MSwKKyAgICAweDI1MkMsIDB4MjUxNCwgMHgyNTBDLCAweDI1MTAsIDB4MjUxQywgMHgyNTE4LCAweDI1MDIsIDB4MjU4OCwKKyAgICAweDI1M0MsIDB4MjUyNCwgMHgyNTAwLCAweDI1OTIsIDB4MjU1MCwgMHgyNTM0LCAweDI1NTEsIDB4MjU5MSwKKyAgICAweDI1MkMsIDB4MjUxNCwgMHgyNTBDLCAweDI1MTAsIDB4MjUxQywgMHgyNTE4LCAweDI1MDIsIDB4MjU4OCwKKyAgICAweDI1M0MsIDB4MjUyNCwgMHgyNTAwLCAweDI1OTIsIDB4MjU1MCwgMHgyNTM0LCAweDI1NTEsIDB4MjU5MSwKKyAgICAweDI1MkMsIDB4MjUxNCwgMHgyNTBDLCAweDI1MTAsIDB4MjUxQywgMHgyNTE4LCAweDI1MDIsIDB4MjU4OCwKKyAgICAweDI1M0MsIDB4MjUyNCwgMHgyNTAwLCAweDI1OTIsIDB4MjU1MCwgMHgyNTM0LCAweDI1NTEsIDB4MjU5MQorI2VuZGlmIC8qIENPTU1FTlQgKi8KK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV93eXNlX2cxID0geworICAgIDc5LDQ4LDAsMCwiV3lzZSBHcmFwaGljcyAxIiwid3ktZ3JhcGhpY3MtMSIsMCxOVUxMLAorICAgIDB4MjA3MCwgMHgwMEI5LCAweDAwQjIsIDB4MDBCMywgMHgyMDc0LCAweDIwNzUsIDB4MjA3NSwgMHgyMDc3LAorICAgIDB4MjA3OCwgMHgyMDc5LCAweEZGRkQsIDB4RkZGRCwgMHgyNUJBLCAweDI1QzQsIDB4MjVCMiwgMHgyNUJDLAorICAgIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELAorICAgIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELAorICAgIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELAorICAgIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELAorICAgIDB4MjA4MCwgMHgyMDgxLCAweDIwODIsIDB4MjA4MywgMHgyMDg0LCAweDIwODUsIDB4MjA4NiwgMHgyMDg3LAorICAgIDB4MjA4OCwgMHgyMDg5LCAweDI1MTgsIDB4MjUxMCwgMHgyNTBDLCAweDI1MTQsIDB4MjUzQywgMHgyNThDLAorICAgIDB4MjU5MCwgMHgyNTAwLCAweDI1ODQsIDB4MjU4MCwgMHgyNTFDLCAweDI1MjQsIDB4MjUzNCwgMHgyNTJDLAorICAgIDB4MjUwMiwgMHhGRkZELCAweDI1NkUsIDB4MjU2RiwgMHgyNTcwLCAweDI1NkQsIDB4MjU4QworfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X3d5c2VfZzIgPSB7CisgICAgNDEsNjQsMCwwLCJXeXNlIEdyYXBoaWNzIDIiLCJ3eS1ncmFwaGljcy0yIiwwLE5VTEwsCisgICAgMHgyNTBDLCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweDI1MTAsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCisgICAgMHgyNTE0LCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweDI1MTgsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCisgICAgMHgyNTJDLCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweDI1MjQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCisgICAgMHgyNTFDLCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweDI1MzQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCisgICAgMHgyNTAwLCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweDI1MDIsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCisgICAgMHgyNTNDCit9OworCisjaWZkZWYgS0VSTUlURk9OVAorc3RydWN0IHhfdG9fdW5pY29kZSB1X3d5c2VfZzMgPSB7CisgICAgMzEsNjUsMCwwLCJXeXNlIEdyYXBoaWNzIDMiLCJ3eS1ncmFwaGljcy0zIiwwLE5VTEwsCisgICAgICAgICAgICAweDI1NzAsIDB4MjU2RCwgMHgyNTZFLCAweDI1NkYsIDB4MjUxNCwgMHgyNTBDLCAweDI1MTAsCisgICAgMHgyNTE4LCAweDI1M0MsIDB4MjUwMiwgMHgyNTAwLCAweDI1MjQsIDB4MjUxQywgMHgyNTJDLCAweDI1MzQsCisgICAgMHgyM0JBLCAweDIzQkQsIDB4MjY2NiwgMHhFMzI4LCAweEUzMjEsIDB4RTMyMCwgMHhFMzIyLCAweDI1OTAsCisgICAgMHgyNTg0LCAweDI1OEMsIDB4MjU4MCwgMHhFMzIzLCAweEUzMjYsIDB4RTMyNywgMHhFMzI5LCAweDI1OEMKK307CisjZWxzZQorc3RydWN0IHhfdG9fdW5pY29kZSB1X3d5c2VfZzMgPSB7CisgICAgMzEsNjUsMCwwLCJXeXNlIEdyYXBoaWNzIDMiLCJ3eS1ncmFwaGljcy0zIiwwLE5VTEwsCisgICAgICAgICAgICAweDI1NzAsIDB4MjU2RCwgMHgyNTZFLCAweDI1NkYsIDB4MjUxNCwgMHgyNTBDLCAweDI1MTAsCisgICAgMHgyNTE4LCAweDI1M0MsIDB4MjUwMiwgMHgyNTAwLCAweDI1MjQsIDB4MjUxQywgMHgyNTJDLCAweDI1MzQsCisgICAgMHgyNTAwLCAweDI1MDAsIDB4MjY2NiwgMHgyNTkwLCAweDI1OTAsIDB4MjU4YywgMHgyNThjLCAweDI1OTAsCisgICAgMHgyNTg0LCAweDI1OEMsIDB4MjU4MCwgMHgyNTg4LCAweDI1ODgsIDB4MjU4OCwgMHgyNTg4LCAweDI1OEMKK307CisjZW5kaWYgLyogS0VSTUlURk9OVCAqLworLyoKKyAgUU5YIENvbnNvbGUgIC0tICBUaGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgQ1A0MzcgZXhjZXB0IGZvciB0aGUgY29kZQorICBwb2ludCBhdCAweEVFIChlcHNpbG9uIHZzIGVsZW1lbnQtb2YpLCB3aGljaCBJIHRoaW5rIHdhcyBqdXN0IGEgbWlzdGFrZQorICBpbiByZWFkaW5nIGdseXBocyBieSB0aGUgUU5YIHBlb3BsZSwgYnV0IHdobyBrbm93cy4gIEFsc28gdGhlIGdseXBoIGF0CisgIDB4RUQgbWlnaHQgYmUgYSBmaSAoYXMgaXQgaXMgaW4gQ1A0MzcsIGFuZCBhcyBJIGhhdmUgaXQgaGVyZSkgb3IgaXQgbWlnaHQKKyAgYmUgYSBudWxsLXNldCBzeW1ib2wuCisqLworc3RydWN0IHhfdG9fdW5pY29kZSB1X3FueGdycGggPSB7CisgICAgMTI4LDAsMCwwLCJRTlggQ29uc29sZSIsInFueC1jb25zb2xlIiwwLE5VTEwsCisgICAgMHgwMGM3LCAweDAwZmMsIDB4MDBlOSwgMHgwMGUyLCAweDAwZTQsIDB4MDBlMCwgMHgwMGU1LCAweDAwZTcsIC8qIDEyOCAqLworICAgIDB4MDBlYSwgMHgwMGViLCAweDAwZTgsIDB4MDBlZiwgMHgwMGVlLCAweDAwZWMsIDB4MDBjNCwgMHgwMGM1LCAvKiAxMzYgKi8KKyAgICAweDAwYzksIDB4MDBlNiwgMHgwMGM2LCAweDAwZjQsIDB4MDBmNiwgMHgwMGYyLCAweDAwZmIsIDB4MDBmOSwgLyogMTQ0ICovCisgICAgMHgwMGZmLCAweDAwZDYsIDB4MDBkYywgMHgwMGEyLCAweDAwYTMsIDB4MDBhNSwgMHgyMGE3LCAweDAxOTIsIC8qIDE1MiAqLworICAgIDB4MDBlMSwgMHgwMGVkLCAweDAwZjMsIDB4MDBmYSwgMHgwMGYxLCAweDAwZDEsIDB4MDBhYSwgMHgwMGJhLCAvKiAxNjAgKi8KKyAgICAweDAwYmYsIDB4MjMxMCwgMHgwMGFjLCAweDAwYmQsIDB4MDBiYywgMHgwMGExLCAweDAwYWIsIDB4MDBiYiwgLyogMTY4ICovCisgICAgMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLCAweDI1MjQsIDB4MjU2MSwgMHgyNTYyLCAweDI1NTYsIC8qIDE3NiAqLworICAgIDB4MjU1NSwgMHgyNTYzLCAweDI1NTEsIDB4MjU1NywgMHgyNTVkLCAweDI1NWMsIDB4MjU1YiwgMHgyNTEwLCAvKiAxODQgKi8KKyAgICAweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsIDB4MjUwMCwgMHgyNTNjLCAweDI1NWUsIDB4MjU1ZiwgLyogMTkyICovCisgICAgMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LCAweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDI1NjcsIC8qIDIwMCAqLworICAgIDB4MjU2OCwgMHgyNTY0LCAweDI1NjUsIDB4MjU1OSwgMHgyNTU4LCAweDI1NTIsIDB4MjU1MywgMHgyNTZiLCAvKiAyMDggKi8KKyAgICAweDI1NmEsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsIDB4MjU4NCwgMHgyNThjLCAweDI1OTAsIDB4MjU4MCwgLyogMjE2ICovCisgICAgMHgyMjFkLCAweDAwZGYsIDB4MDM5MywgMHgwM2MwLCAweDAzYTMsIDB4MDNjMywgMHgwMGI1LCAweDAzYzQsIC8qIDIyNCAqLworICAgIDB4MDNhNiwgMHgwMzk4LCAweDAzYTksIDB4MDNiNCwgMHgyMjFlLCAweDAzYzYsIDB4MjIwOCwgMHgyMjI5LCAvKiAyMzIgKi8KKyAgICAweDIyNjEsIDB4MDBiMSwgMHgyMjY1LCAweDIyNjQsIDB4MjMyMCwgMHgyMzIxLCAweDAwZjcsIDB4MjI0OCwgLyogMjQwICovCisgICAgMHgwMGIwLCAweDIyMTksIDB4MDBiNywgMHgyMjFhLCAweDIwN2YsIDB4MDBiMiwgMHgyNWFlLCAweDAwYTAgIC8qIDI0OCAqLworfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X3NuaWJyYWNrID0geworICAgIDk0LCAzMywgMCwgMCwiU2llbWVucyBOaXhkb3JmIDk3ODAxIEJyYWNrZXRzIiwic25pLWJyYWNrZXRzIiwwLCJ3IiwKKyAgICAgICAgICAgIDB4MjU5MCwgMHgyNThjLCAweDI1ODQsIDB4MjU4MCwgMHgyNTkwLCAweDI1OGMsIDB4MjU4NCwgLyogYTAtNyAqLworICAgIDB4MjU4MCwgMHgyMzI5LCAweDIzMjcsIDB4MjVhZiwgMHgwMGI3LCAweDI1YjksIDB4MjVjMSwgMHgwMDNjLCAvKiBhOC1mICovCisgICAgMHgyNTNiLCAweDI1MzMsIDB4MjUyMywgMHgyNTJiLCAweDIzMjksIDB4MjMyYSwgMHgyMzA0LCAweDIzMDMsIC8qIGIwLTcgKi8KKyAgICAweDI1ZTQsIDB4MjVlNSwgMHgyNWUzLCAweDI1ZTIsIDB4MjUzZiwgMHgyMzFiLCAweDI1Y2YsIDB4MjVjYiwgLyogYjgtZiAqLworICAgIDB4MjUwMiwgMHgyNTAwLCAweDI1MGMsIDB4MjUxMCwgMHgyNTE0LCAweDI1MTgsIDB4MjUxYywgMHgyNTI0LCAvKiBjMC03ICovCisgICAgMHgyNTJjLCAweDI1MzQsIDB4MjUzYywgMHgyMTkyLCAweDIxOTAsIDB4MjE5MSwgMHgyMTkzLCAweDI1NzUsIC8qIGM4LWYgKi8KKyAgICAweDI1NzcsIDB4MjVkNCwgMHgyNTZkLCAweDI1NmUsIDB4MjU3MCwgMHgyNTZmLCAweDI1MWMsIDB4MjUyNCwgLyogZDAtNyAqLworICAgIDB4MjUyYywgMHgyNTM0LCAweDI1M2MsIDB4MjUzYywgMHgyNTkyLCAweDI1OTEsIDB4MjU5MiwgMHgyNTkzLCAvKiBkOC1mICovCisgICAgMHgyNTAzLCAweDI1MDEsIDB4MjUwZiwgMHgyNTEzLCAweDI1MTcsIDB4MjUxYiwgMHgyNTIzLCAweDI1MmIsIC8qIGUwLTcgKi8KKyAgICAweDI1MzMsIDB4MjUzYiwgMHgyNTRiLCAweDI3OWUsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTMsIDB4MjU3OSwgLyogZTgtZiAqLworICAgIDB4MjU3YiwgMHgyMjYxLCAweDI1NTQsIDB4MjU1NywgMHgyNTVhLCAweDI1NWQsIDB4MjUyMywgMHgyNTJiLCAvKiBmMC03ICovCisgICAgMHgyNTMzLCAweDI1M2IsIDB4MjU0YiwgMHgyNTRiLCAweDAzOTMsIDB4MDNjMywgMHgwM2M0ICAgICAgICAgIC8qIGY4LWYgKi8KK307CisKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9zbmlibGFua3MgPSB7CisgICAgOTQsIDMzLCAwLCAwLCJTaWVtZW5zIE5peGRvcmYgOTc4MDEgQmxhbmtzIiwic25pLWJsYW5rcyIsMCwieSIsCisgICAgICAgICAgICAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIC8qIGEwLTcgKi8KKyAgICAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgLyogYTgtZiAqLworICAgIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAvKiBiMC03ICovCisgICAgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIC8qIGI4LWYgKi8KKyAgICAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgLyogYzAtNyAqLworICAgIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAvKiBjOC1mICovCisgICAgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIC8qIGQwLTcgKi8KKyAgICAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgLyogZDgtZiAqLworICAgIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAvKiBlMC03ICovCisgICAgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIC8qIGU4LWYgKi8KKyAgICAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgLyogZjAtNyAqLworICAgIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCAgICAgICAgICAvKiBmOC1mICovCit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfc25pZmFjZXQgPSB7CisgICAgOTQsIDMzLCAwLCAwLCJTaWVtZW5zIE5peGRvcmYgOTc4MDEgRmFjZXQiLCJzbmktZmFjZXQiLDAsImMiLAorICAgICAgICAgICAgMHgwMDIwLCAweDI1ODEsIDB4MjU4MiwgMHgyNTgzLCAweDI1ODQsIDB4MjU4NSwgMHgyNTg3LCAvKiBhMS1hNyAqLworICAgIDB4MDA1ZiwgMHgyNTgxLCAweDI1ODIsIDB4MjU4MywgMHgyNTg0LCAweDI1ODUsIDB4MjU4NiwgMHgyNTg3LCAvKiBhOC1hZiAqLworICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAvKiBiMC1iNyAqLworICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAvKiBiOC1iZiAqLworICAgIDB4MjUwMywgMHgyNTAxLCAweDI1MGYsIDB4MjUxMywgMHgyNTE3LCAweDI1MWIsIDB4MjUyMywgMHgyNTJiLCAvKiBjMC1jNyAqLworICAgIDB4MjUzMywgMHgyNTNiLCAweDI1NGIsIDB4MjU4ZiwgMHgyNTk1LCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAvKiBjOC1jZiAqLworICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAvKiBkMC1kNyAqLworICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDI1OTEsIDB4MjU5MSwgMHgyNTg4LCAvKiBkOC1kZiAqLworICAgIDB4MjUwMywgMHgyNTAxLCAweDI1MGYsIDB4MjUxMywgMHgyNTE3LCAweDI1MWIsIDB4MjUyMywgMHgyNTJiLCAvKiBlMC1lNyAqLworICAgIDB4MjUzMywgMHgyNTNiLCAweDI1NGIsIDB4ZmZmZCwgMHhmZmZkLCAweDI1OTMsIDB4MjU5MywgMHgwMDIwLCAvKiBlOC1lZiAqLworICAgIDB4MjU4NSwgMHgyNTg2LCAweDI1ODcsIDB4MjU4OCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAvKiBmMC1mNyAqLworICAgIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHgyNTk0LCAweDI1OTQsIDB4ZmZmZCAgICAgICAgICAvKiBmOC1mZSAqLworfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X3NuaWlibSA9IHsKKyAgICA5NCwgMzMsIDAsIDAsIlNpZW1lbnMgTml4ZG9yZiA5NzgwMSBJQk0iLCJzbmktaWJtIiwwLCJ2IiwKKyAgICAgICAgICAgIDB4MjYzYSwgMHgyNjNiLCAweDI2NjUsIDB4MjY2NiwgMHgyNjYzLCAweDI2NjAsIDB4MjVjZiwKKyAgICAweDI1ZDgsIDB4MjVjYiwgMHgyNWQ5LCAweDI2NDIsIDB4MjY0MCwgMHgyNjZhLCAweDI2NmIsIDB4MjYzYywKKyAgICAweDI1YmEsIDB4MjVjNCwgMHgyMTk1LCAweDIwM2MsIDB4MDBiNiwgMHgyNWMxLCAweDI1ODIsIDB4MjFhOCwKKyAgICAweDIxOTEsIDB4MjE5MywgMHgyMTkyLCAweDIxOTAsIDB4MjMxOSwgMHgyMTk0LCAweDI1YjQsIDB4MjViZSwKKyAgICAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgLyogSGV4ICovCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIC8qIGJ5dGVzICovCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHgyMDcwLCAweDAwYjksIDB4MDBiMiwgMHgwMGIzLCAweDIwNzQsIDB4MjA3NSwgMHgyMDc2LCAweDIwNzcsCisgICAgMHgyMDc4LCAweDIwNzksIDB4MjA3YiwgMHgyMDdhLCAweGZmZmQsIDB4ZmZmZCwgMHgyMzIwLCAweDIzMjEsCisgICAgMHgyMDgwLCAweDIwODEsIDB4MjA4MiwgMHgyMDgzLCAweDIwODQsIDB4MjA4NSwgMHgyMDg2LCAweDIwODcsCisgICAgMHgyMDg4LCAweDIwODksIDB4MjA4YiwgMHgyMDhhLCAweDIyMWUsIDB4MDNiMSwgMHgwM2E2Cit9OworCitzdHJ1Y3QgeF90b191bmljb2RlIHVfc25pZXVybyA9IHsKKyAgICA5NCwgMzMsIDAsIDAsIlNpZW1lbnMgTml4ZG9yZiA5NzgwMSBFdXJvIiwic25pLWV1cm8iLDAsInUiLAorICAgICAgICAgICAgMHgwMGUwLCAweDAwZTEsIDB4MDBlMiwgMHgwMGU0LCAweDAwZTUsIDB4MDEwNSwgMHgwMGUzLAorICAgIDB4MDEwMywgMHgwMGU2LCAweDAwZTcsIDB4MDEwZCwgMHgwMTA3LCAweDAwZjAsIDB4MDExMSwgMHgwMTBmLAorICAgIDB4MDBlOCwgMHgwMGU5LCAweDAwZWEsIDB4MDBlYiwgMHgwMTFiLCAweDAxMTksIDB4MDExZiwgMHgwMTMxLAorICAgIDB4MDBlZSwgMHgwMGVjLCAweDAxZDAsIDB4MDBlZiwgMHgwMTMzLCAweDAxM2EsIDB4MDE0MiwgMHgwMTNlLAorICAgIDB4MDE0OCwgMHgwMTQ0LCAweDAwZjEsIDB4MDBmMiwgMHgwMGYzLCAweDAwZjQsIDB4MDBmNiwgMHgwMGY1LAorICAgIDB4MDBmOCwgMHgwMTUxLCAweDAxNTMsIDB4MDBmZSwgMHgwMTU5LCAweDAxNTUsIDB4MDE2MSwgMHgwMTViLAorICAgIDB4MDE1ZiwgMHgwMGRmLCAweDAxNjMsIDB4MDE2NSwgMHgwMGY5LCAweDAwZmEsIDB4MDBmYiwgMHgwMGZjLAorICAgIDB4MDE2ZiwgMHgwMTcxLCAweDAwZmQsIDB4MDBmZiwgMHgwMTdlLCAweDAxN2EsIDB4MDE3YywgMHgwMGM5LAorICAgIDB4MDBjNSwgMHgwMGM2LCAweDAwZDAsIDB4MDEzMCwgMHgwMTMyLCAweDAxNjcsIDB4MDBkOCwgMHgwMTUyLAorICAgIDB4MDBkZSwgMHgwMGM0LCAweDAwZDYsIDB4MDBkYywgMHgwMGE3LCAweDAwMjQsIDB4MDBhMywgMHgwMGFlLAorICAgIDB4MDBhOSwgMHgwM2E5LCAweDAwYjUsIDB4MDBiMCwgMHgwMGM3LCAweDIwYTcsIDB4MDNjMCwgMHgwMmQ4LAorICAgIDB4MDBiNCwgMHgwMmRkLCAweDAwZDEsIDB4MjUxNCwgMHgyNTE4LCAweDAwN2UsIDB4MDJjNworfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X3NtaWxleSA9IHsKKyAgICAzMiwwLFgyVV9DWEcsMCwiUEMgQzAgR3JhcGhpY3MiLCJzbWlsZXktZmFjZXMiLDAsTlVMTCwKKyAgICAweDAwYTAsIDB4MjYzYSwgMHgyNjNiLCAweDI2NjUsIDB4MjY2NiwgMHgyNjYzLCAweDI2NjAsIDB4MjAyMiwKKyAgICAweDI1ZDgsIDB4MjVlZiwgMHgyNWQ5LCAweDI2NDIsIDB4MjY0MCwgMHgyNjZhLCAweDI2NmMsIDB4MjYzYywKKyAgICAweDI1YmEsIDB4MjVjNCwgMHgyMTk1LCAweDIwM2MsIDB4MDBiNiwgMHgwMGE3LCAweDI1YWMsIDB4MjFhOCwKKyAgICAweDIxOTEsIDB4MjE5MywgMHgyMTkyLCAweDIxOTAsIDB4MjMxOSwgMHgyMTk0LCAweDI1YjIsIDB4MjViYworfTsKKworc3RydWN0IHhfdG9fdW5pY29kZSB1X2MwcGljcyA9IHsKKyAgICAxMjgsMCxYMlVfQ1hHLDAsIkMwL0MxIERpc3BsYXkgQ29udHJvbHMiLCJkaXNwbGF5LWNvbnRyb2xzIiwwLE5VTEwsCisgICAgMHgyNDAwLCAweDI0MDEsIDB4MjQwMiwgMHgyNDAzLCAweDI0MDQsIDB4MjQwNSwgMHgyNDA2LCAweDI0MDcsCisgICAgMHgyNDA4LCAweDI0MDksIDB4MjQwYSwgMHgyNDBiLCAweDI0MGMsIDB4MjQwZCwgMHgyNDBlLCAweDI0MGYsCisgICAgMHgyNDEwLCAweDI0MTEsIDB4MjQxMiwgMHgyNDEzLCAweDI0MTQsIDB4MjQxNSwgMHgyNDE2LCAweDI0MTcsCisgICAgMHgyNDE4LCAweDI0MTksIDB4MjQxYSwgMHgyNDFiLCAweDI0MWMsIDB4MjQxZCwgMHgyNDFlLCAweDI0MWYsCisgICAgMHgyNDIwLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweDI0MjEKK307CisKKyNpZmRlZiBLRVJNSVRGT05UCitzdHJ1Y3QgeF90b191bmljb2RlIHVfYzFwaWNzID0geworICAgIDMyLDAsWDJVX0NYRywwLCJDMSBEaXNwbGF5IENvbnRyb2xzIiwiYzEtZGlzcGxheS1jb250cm9scyIsMCxOVUxMLAorICAgIDB4ZTA4MCwgMHhlMDgxLCAweGUwODIsIDB4ZTA4MywgMHhlMDg0LCAweGUwODUsIDB4ZTA4NiwgMHhlMDg3LAorICAgIDB4ZTA4OCwgMHhlMDg5LCAweGUwOGEsIDB4ZTA4YiwgMHhlMDhjLCAweGUwOGQsIDB4ZTA4ZSwgMHhlMDhmLAorICAgIDB4ZTA5MCwgMHhlMDkxLCAweGUwOTIsIDB4ZTA5MywgMHhlMDk0LCAweGUwOTUsIDB4ZTA5NiwgMHhlMDk3LAorICAgIDB4ZTA5OCwgMHhlMDk5LCAweGUwOWEsIDB4ZTA5YiwgMHhlMDljLCAweGUwOWQsIDB4ZTA5ZSwgMHhlMDlmCit9OworI2Vsc2UKK3N0cnVjdCB4X3RvX3VuaWNvZGUgdV9jMXBpY3MgPSB7CisgICAgMzIsMCxYMlVfQ1hHLDAsIkMxIERpc3BsYXkgQ29udHJvbHMiLCJjMS1kaXNwbGF5LWNvbnRyb2xzIiwwLE5VTEwsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsCisgICAgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQsIDB4ZmZmZCwgMHhmZmZkLCAweGZmZmQKK307CisjZW5kaWYgLyogS0VSTUlURk9OVCAqLworCisKKy8qIEJsYWgtdG8tVW5pY29kZSBmdW5jdGlvbnMgKi8KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2FzY2lpX3UoQ0hBUiBjKQorI2Vsc2UKK2FzY2lpX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisvKgorICBOT1RFOiBTdHJpY3QgQU5TSSBjb21waWxlcnMgY29tcGxhaW4gYWJvdXQgIjwiIGFuZCBzaW1pbGFyIGNvbXBhcmlzb25zCisgIGJldHdlZW4gdW5zaWduZWQgYW5kIHNpZ25lZCBxdWFudGl0aWVzLCBhcyBmb3VuZCBpbiBhbGwgdGhlIHJvdXRpbmVzIG9mCisgIHRoZSAiYmxhaF91KCkiIGNsYXNzIC0tIGNhc3RzIG11c3QgYmUgYWRkZWQgdG8gc3F1ZWxjaCB0aGUgd2FybmluZ3MuCisqLworICAgIGlmIChjIDwgdV9hc2NpaS5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2FzY2lpLm9mZnNldCArIHVfYXNjaWkuc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9hc2NpaS5tYXBbYyAtIHVfYXNjaWkub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCiticml0aXNoX3UoQ0hBUiBjKQorI2Vsc2UKK2JyaXRpc2hfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBpZiAoYyA8IHVfYnJpdGlzaC5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2JyaXRpc2gub2Zmc2V0ICsgdV9icml0aXNoLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfYnJpdGlzaC5tYXBbYyAtIHVfYnJpdGlzaC5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2R1dGNoX3UoQ0hBUiBjKQorI2Vsc2UKK2R1dGNoX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgaWYgKGMgPCB1X2R1dGNoLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfZHV0Y2gub2Zmc2V0ICsgdV9kdXRjaC5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1X2R1dGNoLm1hcFtjIC0gdV9kdXRjaC5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2Zpbm5pc2hfdShDSEFSIGMpCisjZWxzZQorZmlubmlzaF91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIGlmIChjIDwgdV9maW5uaXNoLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfZmlubmlzaC5vZmZzZXQgKyB1X2Zpbm5pc2guc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9maW5uaXNoLm1hcFtjIC0gdV9maW5uaXNoLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworZnJlbmNoX3UoQ0hBUiBjKQorI2Vsc2UKK2ZyZW5jaF91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIGlmIChjIDwgdV9mcmVuY2gub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9mcmVuY2gub2Zmc2V0ICsgdV9mcmVuY2guc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9mcmVuY2gubWFwW2MgLSB1X2ZyZW5jaC5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2ZyX2NhbmFkaWFuX3UoQ0hBUiBjKQorI2Vsc2UKK2ZyX2NhbmFkaWFuX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgaWYgKGMgPCB1X2ZyX2NhbmFkaWFuLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfZnJfY2FuYWRpYW4ub2Zmc2V0ICsgdV9mcl9jYW5hZGlhbi5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1X2ZyX2NhbmFkaWFuLm1hcFtjIC0gdV9mcl9jYW5hZGlhbi5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2dlcm1hbl91KENIQVIgYykKKyNlbHNlCitnZXJtYW5fdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBpZiAoYyA8IHVfZ2VybWFuLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfZ2VybWFuLm9mZnNldCArIHVfZ2VybWFuLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfZ2VybWFuLm1hcFtjIC0gdV9nZXJtYW4ub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitodW5nYXJpYW5fdShDSEFSIGMpCisjZWxzZQoraHVuZ2FyaWFuX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgaWYgKGMgPCB1X2h1bmdhcmlhbi5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2h1bmdhcmlhbi5vZmZzZXQgKyB1X2h1bmdhcmlhbi5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1X2h1bmdhcmlhbi5tYXBbYyAtIHVfaHVuZ2FyaWFuLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworaXRhbGlhbl91KENIQVIgYykKKyNlbHNlCitpdGFsaWFuX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgaWYgKGMgPCB1X2l0YWxpYW4ub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9pdGFsaWFuLm9mZnNldCArIHVfaXRhbGlhbi5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1X2l0YWxpYW4ubWFwW2MgLSB1X2l0YWxpYW4ub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitpY2VsYW5kaWNfdShDSEFSIGMpCisjZWxzZQoraWNlbGFuZGljX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgaWYgKGMgPCB1X2ljZWxhbmRpYy5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2ljZWxhbmRpYy5vZmZzZXQgKyB1X2ljZWxhbmRpYy5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1X2ljZWxhbmRpYy5tYXBbYyAtIHVfaWNlbGFuZGljLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworamlzMDIwMXJfdShDSEFSIGMpCisjZWxzZQoramlzMDIwMXJfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBpZiAoYyA8IHVfamlzMDIwMXIub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9qaXMwMjAxci5vZmZzZXQgKyB1X2ppczAyMDFyLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfamlzMDIwMXIubWFwW2MgLSB1X2ppczAyMDFyLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworamlzMDIwMWtfdShDSEFSIGMpCisjZWxzZQoramlzMDIwMWtfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBpZiAoYyA8IHVfamlzMDIwMWsub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9qaXMwMjAxay5vZmZzZXQgKyB1X2ppczAyMDFrLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfamlzMDIwMWsubWFwW2MgLSB1X2ppczAyMDFrLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworbm9yd2VnaWFuX3UoQ0hBUiBjKQorI2Vsc2UKK25vcndlZ2lhbl91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIGlmIChjIDwgdV9ub3J3ZWdpYW4ub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9ub3J3ZWdpYW4ub2Zmc2V0ICsgdV9ub3J3ZWdpYW4uc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9ub3J3ZWdpYW4ubWFwW2MgLSB1X25vcndlZ2lhbi5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2RhbmlzaF91KENIQVIgYykKKyNlbHNlCitkYW5pc2hfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBpZiAoYyA8IHVfZGFuaXNoLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfZGFuaXNoLm9mZnNldCArIHVfZGFuaXNoLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfZGFuaXNoLm1hcFtjIC0gdV9kYW5pc2gub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitwb3J0dWd1ZXNlX3UoQ0hBUiBjKQorI2Vsc2UKK3BvcnR1Z3Vlc2VfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBpZiAoYyA8IHVfcG9ydHVndWVzZS5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X3BvcnR1Z3Vlc2Uub2Zmc2V0ICsgdV9wb3J0dWd1ZXNlLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfcG9ydHVndWVzZS5tYXBbYyAtIHVfcG9ydHVndWVzZS5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK3NwYW5pc2hfdShDSEFSIGMpCisjZWxzZQorc3BhbmlzaF91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIGlmIChjIDwgdV9zcGFuaXNoLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfc3BhbmlzaC5vZmZzZXQgKyB1X3NwYW5pc2guc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9zcGFuaXNoLm1hcFtjIC0gdV9zcGFuaXNoLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworc3dlZGlzaF91KENIQVIgYykKKyNlbHNlCitzd2VkaXNoX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgaWYgKGMgPCB1X3N3ZWRpc2gub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9zd2VkaXNoLm9mZnNldCArIHVfc3dlZGlzaC5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1X3N3ZWRpc2gubWFwW2MgLSB1X3N3ZWRpc2gub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitzd2lzc191KENIQVIgYykKKyNlbHNlCitzd2lzc191KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIGlmIChjIDwgdV9zd2lzcy5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X3N3aXNzLm9mZnNldCArIHVfc3dpc3Muc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9zd2lzcy5tYXBbYyAtIHVfc3dpc3Mub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCithcGwxX3UoQ0hBUiBjKQorI2Vsc2UKK2FwbDFfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBpZiAoYyA8IHVfYXBsMS5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2FwbDEub2Zmc2V0ICsgdV9hcGwxLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfYXBsMS5tYXBbYyAtIHVfYXBsMS5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2lkZW50X3UoQ0hBUiBjKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2lkZW50X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgcmV0dXJuKChVU0hPUlQpYyk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitpc29fODg1OV8xX3UoQ0hBUiBjKQorI2Vsc2UKK2lzb184ODU5XzFfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA+PSAweDgwICYmIGMgPCAweGEwKQorICAgICAgcmV0dXJuKGMpOworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfODg1OV8xLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfODg1OV8xLm9mZnNldCArIHVfODg1OV8xLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfODg1OV8xLm1hcFtjIC0gdV84ODU5XzEub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitpc29fODg1OV8yX3UoQ0hBUiBjKQorI2Vsc2UKK2lzb184ODU5XzJfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA+PSAweDgwICYmIGMgPCAweGEwKQorICAgICAgcmV0dXJuKGMpOworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfODg1OV8yLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfODg1OV8yLm9mZnNldCArIHVfODg1OV8yLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfODg1OV8yLm1hcFtjIC0gdV84ODU5XzIub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitpc29fODg1OV8zX3UoQ0hBUiBjKQorI2Vsc2UKK2lzb184ODU5XzNfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA+PSAweDgwICYmIGMgPCAweGEwKQorICAgICAgcmV0dXJuKGMpOworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfODg1OV8zLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfODg1OV8zLm9mZnNldCArIHVfODg1OV8zLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfODg1OV8zLm1hcFtjIC0gdV84ODU5XzMub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitpc29fODg1OV80X3UoQ0hBUiBjKQorI2Vsc2UKK2lzb184ODU5XzRfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA+PSAweDgwICYmIGMgPCAweGEwKQorICAgICAgcmV0dXJuKGMpOworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfODg1OV80Lm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfODg1OV80Lm9mZnNldCArIHVfODg1OV80LnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfODg1OV80Lm1hcFtjIC0gdV84ODU5XzQub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitpc29fODg1OV81X3UoQ0hBUiBjKQorI2Vsc2UKK2lzb184ODU5XzVfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA+PSAweDgwICYmIGMgPCAweGEwKQorICAgICAgcmV0dXJuKGMpOworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfODg1OV81Lm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfODg1OV81Lm9mZnNldCArIHVfODg1OV81LnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfODg1OV81Lm1hcFtjIC0gdV84ODU5XzUub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitrb2k4X3UoQ0hBUiBjKQorI2Vsc2UKK2tvaThfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA+PSAweDgwICYmIGMgPCAweGEwKQorICAgICAgcmV0dXJuKGMpOworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfa29pOC5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2tvaTgub2Zmc2V0ICsgdV9rb2k4LnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfa29pOC5tYXBbYyAtIHVfa29pOC5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2tvaThyX3UoQ0hBUiBjKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBLT0k4LVIgdG8gVW5pY29kZSAqLworI2Vsc2UKK2tvaThyX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgYyAmPSAweDdmOworICAgIGlmIChjIDwgdV9rb2k4ci5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2tvaThyLm9mZnNldCArIHVfa29pOHIuc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9rb2k4ci5tYXBbYyAtIHVfa29pOHIub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitrb2k4dV91KENIQVIgYykKKyNlbHNlCitrb2k4dV91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfa29pOHUub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9rb2k4dS5vZmZzZXQgKyB1X2tvaTh1LnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfa29pOHUubWFwW2MgLSB1X2tvaTh1Lm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworaXNvXzg4NTlfNl91KENIQVIgYykKKyNlbHNlCitpc29fODg1OV82X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPj0gMHg4MCAmJiBjIDwgMHhhMCkKKyAgICAgIHJldHVybihjKTsKKyAgICBjICY9IDB4N2Y7CisgICAgaWYgKGMgPCB1Xzg4NTlfNi5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1Xzg4NTlfNi5vZmZzZXQgKyB1Xzg4NTlfNi5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1Xzg4NTlfNi5tYXBbYyAtIHVfODg1OV82Lm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworaXNvXzg4NTlfN191KENIQVIgYykKKyNlbHNlCitpc29fODg1OV83X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPj0gMHg4MCAmJiBjIDwgMHhhMCkKKyAgICAgIHJldHVybihjKTsKKyAgICBjICY9IDB4N2Y7CisgICAgaWYgKGMgPCB1Xzg4NTlfNy5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1Xzg4NTlfNy5vZmZzZXQgKyB1Xzg4NTlfNy5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1Xzg4NTlfNy5tYXBbYyAtIHVfODg1OV83Lm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworaXNvXzg4NTlfOF91KENIQVIgYykKKyNlbHNlCitpc29fODg1OV84X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPj0gMHg4MCAmJiBjIDwgMHhhMCkKKyAgICAgIHJldHVybihjKTsKKyAgICBjICY9IDB4N2Y7CisgICAgaWYgKGMgPCB1Xzg4NTlfOC5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1Xzg4NTlfOC5vZmZzZXQgKyB1Xzg4NTlfOC5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1Xzg4NTlfOC5tYXBbYyAtIHVfODg1OV84Lm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworaGVicmV3N191KENIQVIgYykKKyNlbHNlCitoZWJyZXc3X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgYyAmPSAweDdmOworICAgIGlmIChjIDwgdV9oZWJyZXc3Lm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfaGVicmV3Ny5vZmZzZXQgKyB1X2hlYnJldzcuc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9oZWJyZXc3Lm1hcFtjIC0gdV9oZWJyZXc3Lm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworZWxvdDkyN191KENIQVIgYykKKyNlbHNlCitlbG90OTI3X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgYyAmPSAweDdmOworICAgIGlmIChjIDwgdV9lbG90OTI3Lm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfZWxvdDkyNy5vZmZzZXQgKyB1X2Vsb3Q5Mjcuc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9lbG90OTI3Lm1hcFtjIC0gdV9lbG90OTI3Lm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworaXNvXzg4NTlfOV91KENIQVIgYykKKyNlbHNlCitpc29fODg1OV85X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPj0gMHg4MCAmJiBjIDwgMHhhMCkKKyAgICAgIHJldHVybihjKTsKKyAgICBjICY9IDB4N2Y7CisgICAgaWYgKGMgPCB1Xzg4NTlfOS5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1Xzg4NTlfOS5vZmZzZXQgKyB1Xzg4NTlfOS5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1Xzg4NTlfOS5tYXBbYyAtIHVfODg1OV85Lm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworaXNvXzg4NTlfMTBfdShDSEFSIGMpCisjZWxzZQoraXNvXzg4NTlfMTBfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA+PSAweDgwICYmIGMgPCAweGEwKQorICAgICAgcmV0dXJuKGMpOworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfODg1OV8xMC5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1Xzg4NTlfMTAub2Zmc2V0ICsgdV84ODU5XzEwLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfODg1OV8xMC5tYXBbYyAtIHVfODg1OV8xMC5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2lzb184ODU5XzE1X3UoQ0hBUiBjKQorI2Vsc2UKK2lzb184ODU5XzE1X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPj0gMHg4MCAmJiBjIDwgMHhhMCkKKyAgICAgIHJldHVybihjKTsKKyAgICBjICY9IDB4N2Y7CisgICAgaWYgKGMgPCB1Xzg4NTlfMTUub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV84ODU5XzE1Lm9mZnNldCArIHVfODg1OV8xNS5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1Xzg4NTlfMTUubWFwW2MgLSB1Xzg4NTlfMTUub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCithcGwyX3UoQ0hBUiBjKQorI2Vsc2UKK2FwbDJfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA+PSAweDgwICYmIGMgPCAweGEwKQorICAgICAgcmV0dXJuKGMpOworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfYXBsMi5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2FwbDIub2Zmc2V0ICsgdV9hcGwyLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfYXBsMi5tYXBbYyAtIHVfYXBsMi5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2FwbDNfdShDSEFSIGMpCisjZWxzZQorYXBsM191KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfYXBsMy5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2FwbDMub2Zmc2V0ICsgdV9hcGwzLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfYXBsMy5tYXBbYyAtIHVfYXBsMy5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2FwbDRfdShDSEFSIGMpCisjZWxzZQorYXBsNF91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfYXBsNC5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2FwbDQub2Zmc2V0ICsgdV9hcGw0LnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfYXBsNC5tYXBbYyAtIHVfYXBsNC5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2FwbDVfdShDSEFSIGMpCisjZWxzZQorYXBsNV91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfYXBsNS5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2FwbDUub2Zmc2V0ICsgdV9hcGw1LnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfYXBsNS5tYXBbYyAtIHVfYXBsNS5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2tvaTdfdShDSEFSIGMpCisjZWxzZQora29pN191KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIGlmIChjIDwgdV9rb2k3Lm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfa29pNy5vZmZzZXQgKyB1X2tvaTcuc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9rb2k3Lm1hcFtjIC0gdV9rb2k3Lm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworZGVjbWNzX3UoQ0hBUiBjKQorI2Vsc2UKK2RlY21jc191KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjID49IDB4ODAgJiYgYyA8IDB4YTApCisgICAgICByZXR1cm4oYyk7CisgICAgYyAmPSAweDdmOworICAgIGlmIChjIDwgdV9kZWNtY3Mub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9kZWNtY3Mub2Zmc2V0ICsgdV9kZWNtY3Muc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9kZWNtY3MubWFwW2MgLSB1X2RlY21jcy5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK25leHRzdGVwX3UoQ0hBUiBjKQorI2Vsc2UKK25leHRzdGVwX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgcmV0dXJuKHVfbmV4dHN0ZXAubWFwWyhjICYgMHg3ZikgLSB1X25leHRzdGVwLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworZGdpX3UoQ0hBUiBjKQorI2Vsc2UKK2RnaV91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjID49IDB4ODAgJiYgYyA8IDB4YTApCisgICAgICByZXR1cm4oYyk7CisgICAgcmV0dXJuKHVfZGdpLm1hcFsoYyAmIDB4N2YpIC0gdV9kZ2kub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitocHJvbWFuOF91KENIQVIgYykKKyNlbHNlCitocHJvbWFuOF91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjID49IDB4ODAgJiYgYyA8IDB4YTApCisgICAgICByZXR1cm4oYyk7CisgICAgcmV0dXJuKHVfaHByb21hbjgubWFwWyhjICYgMHg3ZikgLSB1X2hwcm9tYW44Lm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworY3AzN191KENIQVIgYykKKyNlbHNlCitjcDM3X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgcmV0dXJuKHVfY3AzNy5tYXBbYyAmIDB4N2ZdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2NwNDM3X3UoQ0hBUiBjKQorI2Vsc2UKK2NwNDM3X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgcmV0dXJuKHVfY3A0MzcubWFwW2MgJiAweDdmXSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCittYXpvdmlhX3UoQ0hBUiBjKSAvKiBNYXpvdmlhID0gQ1A0Mzcgd2l0aCBzdWJzdGl0dXRpb25zICovCisjZWxzZQorbWF6b3ZpYV91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHJldHVybih1X21hem92aWEubWFwW2MgJiAweDdmXSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitjcDg1MF91KENIQVIgYykKKyNlbHNlCitjcDg1MF91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHJldHVybih1X2NwODUwLm1hcFtjICYgMHg3Zl0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworY3A4NThfdShDSEFSIGMpCisjZWxzZQorY3A4NThfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICByZXR1cm4odV9jcDg1OC5tYXBbYyAmIDB4N2ZdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2NwMTI1MF91KENIQVIgYykKKyNlbHNlCitjcDEyNTBfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICByZXR1cm4odV9jcDEyNTAubWFwW2MgJiAweDdmXSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitjcDEyNTFfdShDSEFSIGMpCisjZWxzZQorY3AxMjUxX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgcmV0dXJuKHVfY3AxMjUxLm1hcFtjICYgMHg3Zl0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworY3AxMjUyX3UoQ0hBUiBjKQorI2Vsc2UKK2NwMTI1Ml91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHJldHVybih1X2NwMTI1Mi5tYXBbYyAmIDB4N2ZdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2NwMTI1M191KENIQVIgYykKKyNlbHNlCitjcDEyNTNfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICByZXR1cm4odV9jcDEyNTMubWFwW2MgJiAweDdmXSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitjcDEyNTRfdShDSEFSIGMpCisjZWxzZQorY3AxMjU0X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgcmV0dXJuKHVfY3AxMjU0Lm1hcFtjICYgMHg3Zl0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworY3AxMjU1X3UoQ0hBUiBjKQorI2Vsc2UKK2NwMTI1NV91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHJldHVybih1X2NwMTI1NS5tYXBbYyAmIDB4N2ZdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2NwMTI1Nl91KENIQVIgYykKKyNlbHNlCitjcDEyNTZfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICByZXR1cm4odV9jcDEyNTYubWFwW2MgJiAweDdmXSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitjcDEyNTdfdShDSEFSIGMpCisjZWxzZQorY3AxMjU3X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgcmV0dXJuKHVfY3AxMjU3Lm1hcFtjICYgMHg3Zl0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworY3AxMjU4X3UoQ0hBUiBjKQorI2Vsc2UKK2NwMTI1OF91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHJldHVybih1X2NwMTI1OC5tYXBbYyAmIDB4N2ZdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2NwODUyX3UoQ0hBUiBjKQorI2Vsc2UKK2NwODUyX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgcmV0dXJuKHVfY3A4NTIubWFwW2MgJiAweDdmXSk7Cit9CisKK1VTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDeXJpbGxpYyAqLworI2lmZGVmIENLX0FOU0lDCitjcDg1NV91KENIQVIgYykKKyNlbHNlCitjcDg1NV91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHJldHVybih1X2NwODU1Lm1hcFtjICYgMHg3Zl0pOworfQorCitVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnVsZ2FyaWEgKi8KKyNpZmRlZiBDS19BTlNJQworY3A4NTZfdShDSEFSIGMpCisjZWxzZQorY3A4NTZfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICByZXR1cm4odV9jcDg1Ni5tYXBbYyAmIDB4N2ZdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2NwODU3X3UoQ0hBUiBjKQorI2Vsc2UKK2NwODU3X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgcmV0dXJuKHVfY3A4NTcubWFwW2MgJiAweDdmXSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitjcDg2Ml91KENIQVIgYykKKyNlbHNlCitjcDg2Ml91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHJldHVybih1X2NwODYyLm1hcFtjICYgMHg3Zl0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworY3A4NjRfdShDSEFSIGMpCisjZWxzZQorY3A4NjRfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICByZXR1cm4odV9jcDg2NC5tYXBbYyAmIDB4N2ZdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2NwODY2X3UoQ0hBUiBjKQorI2Vsc2UKK2NwODY2X3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgcmV0dXJuKHVfY3A4NjYubWFwW2MgJiAweDdmXSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitjcDg2OV91KENIQVIgYykKKyNlbHNlCitjcDg2OV91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHJldHVybih1X2NwODY5Lm1hcFtjICYgMHg3Zl0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworbWFjbGF0aW5fdShDSEFSIGMpCisjZWxzZQorbWFjbGF0aW5fdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICByZXR1cm4odV9tYWNsYXRpbi5tYXBbYyAmIDB4N2ZdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK3F1aWNrZHJhd191KENIQVIgYykKKyNlbHNlCitxdWlja2RyYXdfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICByZXR1cm4odV9xdWlja2RyYXcubWFwW2MgJiAweDdmXSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitkZWNzcGVjX3UoQ0hBUiBjKQorI2Vsc2UKK2RlY3NwZWNfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBjICY9IDB4N2Y7CisgICAgaWYgKGMgPCB1X2RlY3NwZWMub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9kZWNzcGVjLm9mZnNldCArIHVfZGVjc3BlYy5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybiAodV9kZWNzcGVjLm1hcFtjIC0gdV9kZWNzcGVjLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworZGVjdGVjaF91KENIQVIgYykKKyNlbHNlCitkZWN0ZWNoX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgYyAmPSAweDdmOworICAgIGlmIChjIDwgdV9kZWN0ZWNoLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfZGVjdGVjaC5vZmZzZXQgKyB1X2RlY3RlY2guc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9kZWN0ZWNoLm1hcFtjIC0gdV9kZWN0ZWNoLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworZGdzcGVjX3UoQ0hBUiBjKQorI2Vsc2UKK2Rnc3BlY191KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfZGdzcGVjLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfZGdzcGVjLm9mZnNldCArIHVfZGdzcGVjLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfZGdzcGVjLm1hcFtjIC0gdV9kZ3NwZWMub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitkZ2xpbmVfdShDSEFSIGMpCisjZWxzZQorZGdsaW5lX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgYyAmPSAweDdmOworICAgIGlmIChjIDwgdV9kZ2xpbmUub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9kZ2xpbmUub2Zmc2V0ICsgdV9kZ2xpbmUuc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9kZ2xpbmUubWFwW2MgLSB1X2RnbGluZS5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2Rnd29yZF91KENIQVIgYykKKyNlbHNlCitkZ3dvcmRfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBjICY9IDB4N2Y7CisgICAgaWYgKGMgPCB1X2Rnd29yZC5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2Rnd29yZC5vZmZzZXQgKyB1X2Rnd29yZC5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1X2Rnd29yZC5tYXBbYyAtIHVfZGd3b3JkLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworaHBsaW5lX3UoQ0hBUiBjKQorI2Vsc2UKK2hwbGluZV91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfaHBsaW5lLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfaHBsaW5lLm9mZnNldCArIHVfaHBsaW5lLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfaHBsaW5lLm1hcFtjIC0gdV9ocGxpbmUub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitocG1hdGhfdShDSEFSIGMpCisjZWxzZQoraHBtYXRoX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgYyAmPSAweDdmOworICAgIGlmIChjIDwgdV9ocG1hdGgub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9ocG1hdGgub2Zmc2V0ICsgdV9ocG1hdGguc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9ocG1hdGgubWFwW2MgLSB1X2hwbWF0aC5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK3FueGdycGhfdShDSEFSIGMpCisjZWxzZQorcW54Z3JwaF91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfcW54Z3JwaC5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X3FueGdycGgub2Zmc2V0ICsgdV9xbnhncnBoLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfcW54Z3JwaC5tYXBbYyAtIHVfcW54Z3JwaC5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK2h6MTUwMF91KENIQVIgYykKKyNlbHNlCitoejE1MDBfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBjICY9IDB4N2Y7CisgICAgaWYgKGMgPCB1X2h6MTUwMC5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X2h6MTUwMC5vZmZzZXQgKyB1X2h6MTUwMC5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1X2h6MTUwMC5tYXBbYyAtIHVfaHoxNTAwLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworc25pYmxhbmtzX3UoQ0hBUiBjKQorI2Vsc2UKK3NuaWJsYW5rc191KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfc25pYmxhbmtzLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfc25pYmxhbmtzLm9mZnNldCArIHVfc25pYmxhbmtzLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfc25pYmxhbmtzLm1hcFtjIC0gdV9zbmlibGFua3Mub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitzbmlicmFja191KENIQVIgYykKKyNlbHNlCitzbmlicmFja191KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfc25pYnJhY2sub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9zbmlicmFjay5vZmZzZXQgKyB1X3NuaWJyYWNrLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfc25pYnJhY2subWFwW2MgLSB1X3NuaWJyYWNrLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworc25pZmFjZXRfdShDSEFSIGMpCisjZWxzZQorc25pZmFjZXRfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBjICY9IDB4N2Y7CisgICAgaWYgKGMgPCB1X3NuaWZhY2V0Lm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfc25pZmFjZXQub2Zmc2V0ICsgdV9zbmlmYWNldC5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1X3NuaWZhY2V0Lm1hcFtjIC0gdV9zbmlmYWNldC5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK3NuaWlibV91KENIQVIgYykKKyNlbHNlCitzbmlpYm1fdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBjICY9IDB4N2Y7CisgICAgaWYgKGMgPCB1X3NuaWlibS5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X3NuaWlibS5vZmZzZXQgKyB1X3NuaWlibS5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1X3NuaWlibS5tYXBbYyAtIHVfc25paWJtLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworc25pZXVyb191KENIQVIgYykKKyNlbHNlCitzbmlldXJvX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgYyAmPSAweDdmOworICAgIGlmIChjIDwgdV9zbmlldXJvLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfc25pZXVyby5vZmZzZXQgKyB1X3NuaWV1cm8uc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9zbmlldXJvLm1hcFtjIC0gdV9zbmlldXJvLm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworaGVhdGgxOWdfdShDSEFSIGMpCisjZWxzZQoraGVhdGgxOWdfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBjICY9IDB4N2Y7CisgICAgaWYgKGMgPCB1X2hlYXRoMTlnLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfaGVhdGgxOWcub2Zmc2V0ICsgdV9oZWF0aDE5Zy5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1X2hlYXRoMTlnLm1hcFtjIC0gdV9oZWF0aDE5Zy5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK3R2aWdfdShDSEFSIGMpCisjZWxzZQordHZpZ191KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfdHZpZy5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X3R2aWcub2Zmc2V0ICsgdV90dmlnLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfdHZpZy5tYXBbYyAtIHVfdHZpZy5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK3d5c2VfZ25fdShDSEFSIGMpCisjZWxzZQord3lzZV9nbl91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfd3lzZV9nbi5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X3d5c2VfZ24ub2Zmc2V0ICsgdV93eXNlX2duLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfd3lzZV9nbi5tYXBbYyAtIHVfd3lzZV9nbi5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK3d5c2VfZzFfdShDSEFSIGMpCisjZWxzZQord3lzZV9nMV91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfd3lzZV9nMS5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X3d5c2VfZzEub2Zmc2V0ICsgdV93eXNlX2cxLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfd3lzZV9nMS5tYXBbYyAtIHVfd3lzZV9nMS5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK3d5c2VfZzJfdShDSEFSIGMpCisjZWxzZQord3lzZV9nMl91KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfd3lzZV9nMi5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X3d5c2VfZzIub2Zmc2V0ICsgdV93eXNlX2cyLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfd3lzZV9nMi5tYXBbYyAtIHVfd3lzZV9nMi5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK3d5c2VfZzNfdShDSEFSIGMpCisjZWxzZQord3lzZV9nM191KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfd3lzZV9nMy5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X3d5c2VfZzMub2Zmc2V0ICsgdV93eXNlX2czLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfd3lzZV9nMy5tYXBbYyAtIHVfd3lzZV9nMy5vZmZzZXRdKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK3NtaWxleV91KENIQVIgYykKKyNlbHNlCitzbWlsZXlfdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBjICY9IDB4N2Y7CisgICAgaWYgKGMgPCB1X3NtaWxleS5vZmZzZXQpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA+PSB1X3NtaWxleS5vZmZzZXQgKyB1X3NtaWxleS5zaXplKQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UKKyAgICAgIHJldHVybih1X3NtaWxleS5tYXBbYyAtIHVfc21pbGV5Lm9mZnNldF0pOworfQorCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworYzBwaWNzX3UoQ0hBUiBjKQorI2Vsc2UKK2MwcGljc191KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGMgJj0gMHg3ZjsKKyAgICBpZiAoYyA8IHVfYzBwaWNzLm9mZnNldCkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlIGlmIChjID49IHVfYzBwaWNzLm9mZnNldCArIHVfYzBwaWNzLnNpemUpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHVfYzBwaWNzLm1hcFtjIC0gdV9jMHBpY3Mub2Zmc2V0XSk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitjMXBpY3NfdShDSEFSIGMpCisjZWxzZQorYzFwaWNzX3UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgYyAmPSAweDdmOworICAgIGlmIChjIDwgdV9jMXBpY3Mub2Zmc2V0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPj0gdV9jMXBpY3Mub2Zmc2V0ICsgdV9jMXBpY3Muc2l6ZSkKKyAgICAgIHJldHVybihjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odV9jMXBpY3MubWFwW2MgLSB1X2MxcGljcy5vZmZzZXRdKTsKK30KKworI2lmZGVmIEtBTkpJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEthbmppL1VuaWNvZGUgZnVuY3Rpb25zICovCisKK3N0YXRpYyBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGF0aXN0aWNzIGNvdW50ZXJzICovCisgIGJhZCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUkVNT1ZFIFRIRVNFIExBVEVSLi4uICovCisgIGthbmppID0gMCwKKyAga2FuYSA9IDAsCisgIGdyZWVrID0gMCwKKyAgY3lyaWxsaWMgPSAwLAorICBzcGVjaWFsID0gMCwKKyAgcm9tYW4gPSAwOworCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworc2pfdG9fdW4oVVNIT1JUIHNqKSAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0LUpJUyB0byBVbmljb2RlICovCisjZWxzZQorc2pfdG9fdW4oc2opIFVTSE9SVCBzajsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworCisvKiBLYW5qaSBibG9ja3MgKi8KKworICAgIGlmIChzaiA+PSAweDgxNDApIHsgICAgICAgICAgICAgICAgIC8qIEFsbCBwb3NzaWJsZSBLYW5qaXMgKi8KKyAgICAgICAga2FuamkrKzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPcHRpbWlzdGljYWxseSBjb3VudCBhIEthbmppICovCisgICAgICAgIGlmIChzaiA8PSAweDlmZmMpIHsgICAgICAgICAgICAgLyogNzg2OS1lbGVtZW50IHRhYmxlICovCisgICAgICAgICAgICByZXR1cm4oc2p1XzgxNDBbc2ogLSAweDgxNDBdKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaiA+PSAweGUwNDAgJiYgc2ogPD0gMHhlYWE0KSB7IC8qIDI2NjAtZWxlbWVudCB0YWJsZSAqLworICAgICAgICAgICAgcmV0dXJuKHNqdV9lMDQwW3NqIC0gMHhlMDQwXSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2ogPj0gMHhmMDQwKSB7ICAgICAgLyogVXNlci1kZWZpbmVkIGFyZWFzICovCisgICAgICAgICAgICBpZiAoc2ogPD0gMHhmMGZjKSB7ICAgICAgICAgLyogdGVuIDE4OS1jaGFyIGNodW5rcyAqLworICAgICAgICAgICAgICAgIHJldHVybigweGUwMDAgKyAoc2ogLSAweGYwNDApKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2ogPj0gMHhmMTQwICYmIHNqIDw9IDB4ZjFmYykgeworICAgICAgICAgICAgICAgIHJldHVybigweGUwYmMgKyAoc2ogLSAweGYxNDApKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2ogPj0gMHhmMjQwICYmIHNqIDw9IDB4ZjJmYykgeworICAgICAgICAgICAgICAgIHJldHVybigweGUxNzggKyAoc2ogLSAweGYyNDApKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2ogPj0gMHhmMzQwICYmIHNqIDw9IDB4ZjNmYykgeworICAgICAgICAgICAgICAgIHJldHVybigweGUyMzQgKyAoc2ogLSAweGYzNDApKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2ogPj0gMHhmNDQwICYmIHNqIDw9IDB4ZjRmYykgeworICAgICAgICAgICAgICAgIHJldHVybigweGUyZjAgKyAoc2ogLSAweGY0NDApKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2ogPj0gMHhmNTQwICYmIHNqIDw9IDB4ZjVmYykgeworICAgICAgICAgICAgICAgIHJldHVybigweGUzYWMgKyAoc2ogLSAweGY1NDApKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2ogPj0gMHhmNjQwICYmIHNqIDw9IDB4ZjZmYykgeworICAgICAgICAgICAgICAgIHJldHVybigweGU0NjggKyAoc2ogLSAweGY2NDApKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2ogPj0gMHhmNzQwICYmIHNqIDw9IDB4ZjdmYykgeworICAgICAgICAgICAgICAgIHJldHVybigweGU1MjQgKyAoc2ogLSAweGY3NDApKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2ogPj0gMHhmODQwICYmIHNqIDw9IDB4ZjhmYykgeworICAgICAgICAgICAgICAgIHJldHVybigweGU1ZTAgKyAoc2ogLSAweGY4NDApKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2ogPj0gMHhmOTQwICYmIHNqIDw9IDB4ZjlmYykgeworICAgICAgICAgICAgICAgIHJldHVybigweGU2OWMgKyAoc2ogLSAweGY5NDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBrYW5qaS0tOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vbmUgb2YgdGhlIGFib3ZlLCB1bmNvdW50ICovCisgICAgfQorCisvKiBDMCAvIEhhbGZ3aWR0aC1Sb21hbiAvIEMxIGJsb2NrICgweDAwLTB4OWYsIG5vIGhvbGVzKSAqLworCisgICAgZWxzZSBpZiAoc2ogPCAweDAwYTApIHsKKyAgICAgICAgcm9tYW4rKzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3VudCBhIFJvbWFuICovCisgICAgICAgIGlmIChzaiA9PSAweDVjKSB7ICAgICAgICAgICAgICAgLyogWWVuIHNpZ24gKi8KKyAgICAgICAgICAgIHJldHVybigweDAwYTUpOworICAgICAgICB9IGVsc2UgaWYgKHNqID09IDB4N2UpIHsgICAgICAgIC8qIE92ZXJsaW5lIChtYWNyb24pICovCisgICAgICAgICAgICByZXR1cm4oMHgyMDNlKTsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIG9yIEhhbGZ3aWR0aCBSb21hbiAqLworICAgICAgICAgICAgcmV0dXJuKHNqKTsKKyAgICAgICAgfQorICAgIH0KKworLyogSGFsZndpZHRoIEthdGFrYW5hIGJsb2NrICgweGEwLTB4ZGYsIG5vIGhvbGVzKSAqLworCisgICAgZWxzZSBpZiAoc2ogPj0gMHhhMSAmJiBzaiA8PSAweGRmKSB7CisgICAgICAgIGthbmErKzsKKyAgICAgICAgcmV0dXJuKHNqICsgMHhmZWMwKTsKKyAgICB9CisKKy8qIENhdGNoLWFsbCBtdXN0IGJlIGZpbmFsICovCisKKyAgICBiYWQrKzsKKyAgICByZXR1cm4oMHhmZmZkKTsKK30KKworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKK3VuX3RvX3NqKFVTSE9SVCB1bikgICAgICAgICAgICAgICAgICAgICAvKiBVbmljb2RlIHRvIFNoaWZ0LUpJUyAqLworI2Vsc2UKK3VuX3RvX3NqKHVuKSBVU0hPUlQgdW47CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKworICAgIGlmICh1biA8IDB4MDBhMCkgeworICAgICAgICBzd2l0Y2ggKHVuKSB7CisgICAgICAgICAgY2FzZSAweDAwNWM6IHJvbWFuKys7IHJldHVybigweDgxNWYpOyAvKiBCYWNrc2xhc2ggKi8KKyAgICAgICAgICBjYXNlIDB4MDA3ZTogYmFkKys7ICAgcmV0dXJuKDB4ZmZmZCk7IC8qIE5vIHRpbGRlIGluIFNoaWZ0LUpJUyAqLworICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQVNDSUkgb3IgQzAvQzEgY29udHJvbCAqLworICAgICAgICAgICAgcm9tYW4rKzsKKyAgICAgICAgICAgIHJldHVybih1bik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHVuID49IDB4MDBhMCAmJiB1biA8IDB4MDM5MSkgeyAvKiBMYXRpbi0xIHN5bWJvbHMgKi8KKyAgICAgICAgcm9tYW4rKzsKKyAgICAgICAgc3dpdGNoKHVuKSB7CisgICAgICAgICAgY2FzZSAweDAwQTI6IHJldHVybigweDgxOTEpOworICAgICAgICAgIGNhc2UgMHgwMEEzOiByZXR1cm4oMHg4MTkyKTsKKyAgICAgICAgICBjYXNlIDB4MDBBNTogcmV0dXJuKDB4MDA1Qyk7ICAvKiBZZW4gKi8KKyAgICAgICAgICBjYXNlIDB4MDBBNzogcmV0dXJuKDB4ODE5OCk7CisgICAgICAgICAgY2FzZSAweDAwQTg6IHJldHVybigweDgxNEUpOworICAgICAgICAgIGNhc2UgMHgwMEFDOiByZXR1cm4oMHg4MUNBKTsKKyAgICAgICAgICBjYXNlIDB4MDBCMDogcmV0dXJuKDB4ODE4Qik7CisgICAgICAgICAgY2FzZSAweDAwQjE6IHJldHVybigweDgxN0QpOworICAgICAgICAgIGNhc2UgMHgwMEI0OiByZXR1cm4oMHg4MTRDKTsKKyAgICAgICAgICBjYXNlIDB4MDBCNjogcmV0dXJuKDB4ODFGNyk7CisgICAgICAgICAgY2FzZSAweDAwRDc6IHJldHVybigweDgxN0UpOworICAgICAgICAgIGNhc2UgMHgwMEY3OiByZXR1cm4oMHg4MTgwKTsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcm9tYW4tLTsKKyAgICAgICAgICAgIGJhZCsrOworICAgICAgICAgICAgcmV0dXJuKDB4ZmZmZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHVuID49IDB4MDM5MSAmJiB1biA8IDB4MDQwMSkgeyAgLyogR3JlZWsgKi8KKyAgICAgICAgZ3JlZWsrKzsKKyAgICAgICAgaWYgKHVuIDw9IDB4MDM5YykKKyAgICAgICAgICByZXR1cm4odXNqXzAzOTFbdW4tMHgwMzkxXSk7CisgICAgICAgIGdyZWVrLS07CisgICAgICAgIGJhZCsrOworICAgICAgICByZXR1cm4oMHhmZmZkKTsKKyAgICB9CisgICAgaWYgKHVuID49IDB4MDQwMSAmJiB1biA8IDB4MjAxMCkgeyAgLyogQ3lyaWxsaWMgKi8KKyAgICAgICAgY3lyaWxsaWMrKzsKKyAgICAgICAgaWYgKHVuIDw9IDB4MDQ1MSkKKyAgICAgICAgICByZXR1cm4odXNqXzA0MDFbdW4tMHgwNDAxXSk7CisgICAgICAgIGN5cmlsbGljLS07CisgICAgICAgIGJhZCsrOworICAgICAgICByZXR1cm4oMHhmZmZkKTsKKyAgICB9CisgICAgaWYgKHVuID49IDB4MjAxMCAmJiB1biA8IDB4MjUwMCkgeyAgLyogR2VuZXJhbCBwdW5jdHVhdGlvbiAqLworICAgICAgICBzcGVjaWFsKys7CisgICAgICAgIHN3aXRjaCh1bikgeworICAgICAgICAgIGNhc2UgMHgyMDEwOiByZXR1cm4oMHg4MTVEKTsKKyAgICAgICAgICBjYXNlIDB4MjAxNTogcmV0dXJuKDB4ODE1Qyk7CisgICAgICAgICAgY2FzZSAweDIwMTY6IHJldHVybigweDgxNjEpOworICAgICAgICAgIGNhc2UgMHgyMDE4OiByZXR1cm4oMHg4MTY1KTsKKyAgICAgICAgICBjYXNlIDB4MjAxOTogcmV0dXJuKDB4ODE2Nik7CisgICAgICAgICAgY2FzZSAweDIwMUM6IHJldHVybigweDgxNjcpOworICAgICAgICAgIGNhc2UgMHgyMDFEOiByZXR1cm4oMHg4MTY4KTsKKyAgICAgICAgICBjYXNlIDB4MjAyMDogcmV0dXJuKDB4ODFGNSk7CisgICAgICAgICAgY2FzZSAweDIwMjE6IHJldHVybigweDgxRjYpOworICAgICAgICAgIGNhc2UgMHgyMDI1OiByZXR1cm4oMHg4MTY0KTsKKyAgICAgICAgICBjYXNlIDB4MjAyNjogcmV0dXJuKDB4ODE2Myk7CisgICAgICAgICAgY2FzZSAweDIwMzA6IHJldHVybigweDgxRjEpOworICAgICAgICAgIGNhc2UgMHgyMDMyOiByZXR1cm4oMHg4MThDKTsKKyAgICAgICAgICBjYXNlIDB4MjAzMzogcmV0dXJuKDB4ODE4RCk7CisgICAgICAgICAgY2FzZSAweDIwM0I6IHJldHVybigweDgxQTYpOworICAgICAgICAgIGNhc2UgMHgyMDNFOiByZXR1cm4oMHgwMDdFKTsKKyAgICAgICAgICBjYXNlIDB4MjEwMzogcmV0dXJuKDB4ODE4RSk7ICAvKiBMZXR0ZXJsaWtlIHN5bWJvbHMgKi8KKyAgICAgICAgICBjYXNlIDB4MjEyQjogcmV0dXJuKDB4ODFGMCk7CisgICAgICAgICAgY2FzZSAweDIxOTA6IHJldHVybigweDgxQTkpOyAgLyogQXJyb3dzICovCisgICAgICAgICAgY2FzZSAweDIxOTE6IHJldHVybigweDgxQUEpOworICAgICAgICAgIGNhc2UgMHgyMTkyOiByZXR1cm4oMHg4MUE4KTsKKyAgICAgICAgICBjYXNlIDB4MjE5MzogcmV0dXJuKDB4ODFBQik7CisgICAgICAgICAgY2FzZSAweDIxRDI6IHJldHVybigweDgxQ0IpOworICAgICAgICAgIGNhc2UgMHgyMUQ0OiByZXR1cm4oMHg4MUNDKTsKKyAgICAgICAgICBjYXNlIDB4MjIwMDogcmV0dXJuKDB4ODFDRCk7ICAvKiBNYXRoICovCisgICAgICAgICAgY2FzZSAweDIyMDI6IHJldHVybigweDgxREQpOworICAgICAgICAgIGNhc2UgMHgyMjAzOiByZXR1cm4oMHg4MUNFKTsKKyAgICAgICAgICBjYXNlIDB4MjIwNzogcmV0dXJuKDB4ODFERSk7CisgICAgICAgICAgY2FzZSAweDIyMDg6IHJldHVybigweDgxQjgpOworICAgICAgICAgIGNhc2UgMHgyMjBCOiByZXR1cm4oMHg4MUI5KTsKKyAgICAgICAgICBjYXNlIDB4MjIxMjogcmV0dXJuKDB4ODE3Qyk7CisgICAgICAgICAgY2FzZSAweDIyMUE6IHJldHVybigweDgxRTMpOworICAgICAgICAgIGNhc2UgMHgyMjFEOiByZXR1cm4oMHg4MUU1KTsKKyAgICAgICAgICBjYXNlIDB4MjIxRTogcmV0dXJuKDB4ODE4Nyk7CisgICAgICAgICAgY2FzZSAweDIyMjA6IHJldHVybigweDgxREEpOworICAgICAgICAgIGNhc2UgMHgyMjI3OiByZXR1cm4oMHg4MUM4KTsKKyAgICAgICAgICBjYXNlIDB4MjIyODogcmV0dXJuKDB4ODFDOSk7CisgICAgICAgICAgY2FzZSAweDIyMjk6IHJldHVybigweDgxQkYpOworICAgICAgICAgIGNhc2UgMHgyMjJBOiByZXR1cm4oMHg4MUJFKTsKKyAgICAgICAgICBjYXNlIDB4MjIyQjogcmV0dXJuKDB4ODFFNyk7CisgICAgICAgICAgY2FzZSAweDIyMkM6IHJldHVybigweDgxRTgpOworICAgICAgICAgIGNhc2UgMHgyMjM0OiByZXR1cm4oMHg4MTg4KTsKKyAgICAgICAgICBjYXNlIDB4MjIzNTogcmV0dXJuKDB4ODFFNik7CisgICAgICAgICAgY2FzZSAweDIyM0Q6IHJldHVybigweDgxRTQpOworICAgICAgICAgIGNhc2UgMHgyMjUyOiByZXR1cm4oMHg4MUUwKTsKKyAgICAgICAgICBjYXNlIDB4MjI2MDogcmV0dXJuKDB4ODE4Mik7CisgICAgICAgICAgY2FzZSAweDIyNjE6IHJldHVybigweDgxREYpOworICAgICAgICAgIGNhc2UgMHgyMjY2OiByZXR1cm4oMHg4MTg1KTsKKyAgICAgICAgICBjYXNlIDB4MjI2NzogcmV0dXJuKDB4ODE4Nik7CisgICAgICAgICAgY2FzZSAweDIyNkE6IHJldHVybigweDgxRTEpOworICAgICAgICAgIGNhc2UgMHgyMjZCOiByZXR1cm4oMHg4MUUyKTsKKyAgICAgICAgICBjYXNlIDB4MjI4MjogcmV0dXJuKDB4ODFCQyk7CisgICAgICAgICAgY2FzZSAweDIyODM6IHJldHVybigweDgxQkQpOworICAgICAgICAgIGNhc2UgMHgyMjg2OiByZXR1cm4oMHg4MUJBKTsKKyAgICAgICAgICBjYXNlIDB4MjI4NzogcmV0dXJuKDB4ODFCQik7CisgICAgICAgICAgY2FzZSAweDIyQTU6IHJldHVybigweDgxREIpOworICAgICAgICAgIGNhc2UgMHgyMzEyOiByZXR1cm4oMHg4MURDKTsgIC8qIEFyYyAqLworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzcGVjaWFsLS07CisgICAgICAgICAgICBiYWQrKzsKKyAgICAgICAgICAgIHJldHVybigweGZmZmQpOworICAgICAgICB9CisgICAgfQorICAgIGlmICh1biA+PSAweDI1MDAgJiYgdW4gPCAweDMwMDApIHsgIC8qIEJveCBkcmF3aW5nICovCisgICAgICAgIHNwZWNpYWwrKzsKKyAgICAgICAgc3dpdGNoKHVuKSB7CisgICAgICAgICAgY2FzZSAweDI1MDA6IHJldHVybigweDg0OUYpOworICAgICAgICAgIGNhc2UgMHgyNTAxOiByZXR1cm4oMHg4NEFBKTsKKyAgICAgICAgICBjYXNlIDB4MjUwMjogcmV0dXJuKDB4ODRBMCk7CisgICAgICAgICAgY2FzZSAweDI1MDM6IHJldHVybigweDg0QUIpOworICAgICAgICAgIGNhc2UgMHgyNTBDOiByZXR1cm4oMHg4NEExKTsKKyAgICAgICAgICBjYXNlIDB4MjUwRjogcmV0dXJuKDB4ODRBQyk7CisgICAgICAgICAgY2FzZSAweDI1MTA6IHJldHVybigweDg0QTIpOworICAgICAgICAgIGNhc2UgMHgyNTEzOiByZXR1cm4oMHg4NEFEKTsKKyAgICAgICAgICBjYXNlIDB4MjUxNDogcmV0dXJuKDB4ODRBNCk7CisgICAgICAgICAgY2FzZSAweDI1MTc6IHJldHVybigweDg0QUYpOworICAgICAgICAgIGNhc2UgMHgyNTE4OiByZXR1cm4oMHg4NEEzKTsKKyAgICAgICAgICBjYXNlIDB4MjUxQjogcmV0dXJuKDB4ODRBRSk7CisgICAgICAgICAgY2FzZSAweDI1MUM6IHJldHVybigweDg0QTUpOworICAgICAgICAgIGNhc2UgMHgyNTFEOiByZXR1cm4oMHg4NEJBKTsKKyAgICAgICAgICBjYXNlIDB4MjUyMDogcmV0dXJuKDB4ODRCNSk7CisgICAgICAgICAgY2FzZSAweDI1MjM6IHJldHVybigweDg0QjApOworICAgICAgICAgIGNhc2UgMHgyNTI0OiByZXR1cm4oMHg4NEE3KTsKKyAgICAgICAgICBjYXNlIDB4MjUyNTogcmV0dXJuKDB4ODRCQyk7CisgICAgICAgICAgY2FzZSAweDI1Mjg6IHJldHVybigweDg0QjcpOworICAgICAgICAgIGNhc2UgMHgyNTJCOiByZXR1cm4oMHg4NEIyKTsKKyAgICAgICAgICBjYXNlIDB4MjUyQzogcmV0dXJuKDB4ODRBNik7CisgICAgICAgICAgY2FzZSAweDI1MkY6IHJldHVybigweDg0QjYpOworICAgICAgICAgIGNhc2UgMHgyNTMwOiByZXR1cm4oMHg4NEJCKTsKKyAgICAgICAgICBjYXNlIDB4MjUzMzogcmV0dXJuKDB4ODRCMSk7CisgICAgICAgICAgY2FzZSAweDI1MzQ6IHJldHVybigweDg0QTgpOworICAgICAgICAgIGNhc2UgMHgyNTM3OiByZXR1cm4oMHg4NEI4KTsKKyAgICAgICAgICBjYXNlIDB4MjUzODogcmV0dXJuKDB4ODRCRCk7CisgICAgICAgICAgY2FzZSAweDI1M0I6IHJldHVybigweDg0QjMpOworICAgICAgICAgIGNhc2UgMHgyNTNDOiByZXR1cm4oMHg4NEE5KTsKKyAgICAgICAgICBjYXNlIDB4MjUzRjogcmV0dXJuKDB4ODRCOSk7CisgICAgICAgICAgY2FzZSAweDI1NDI6IHJldHVybigweDg0QkUpOworICAgICAgICAgIGNhc2UgMHgyNTRCOiByZXR1cm4oMHg4NEI0KTsKKyAgICAgICAgICBjYXNlIDB4MjVBMDogcmV0dXJuKDB4ODFBMSk7ICAvKiBHZW9tZXRyaWMgc2hhcGVzICovCisgICAgICAgICAgY2FzZSAweDI1QTE6IHJldHVybigweDgxQTApOworICAgICAgICAgIGNhc2UgMHgyNUIyOiByZXR1cm4oMHg4MUEzKTsKKyAgICAgICAgICBjYXNlIDB4MjVCMzogcmV0dXJuKDB4ODFBMik7CisgICAgICAgICAgY2FzZSAweDI1QkM6IHJldHVybigweDgxQTUpOworICAgICAgICAgIGNhc2UgMHgyNUJEOiByZXR1cm4oMHg4MUE0KTsKKyAgICAgICAgICBjYXNlIDB4MjVDNjogcmV0dXJuKDB4ODE5Rik7CisgICAgICAgICAgY2FzZSAweDI1Qzc6IHJldHVybigweDgxOUUpOworICAgICAgICAgIGNhc2UgMHgyNUNCOiByZXR1cm4oMHg4MTlCKTsKKyAgICAgICAgICBjYXNlIDB4MjVDRTogcmV0dXJuKDB4ODE5RCk7CisgICAgICAgICAgY2FzZSAweDI1Q0Y6IHJldHVybigweDgxOUMpOworICAgICAgICAgIGNhc2UgMHgyNUVGOiByZXR1cm4oMHg4MUZDKTsKKyAgICAgICAgICBjYXNlIDB4MjYwNTogcmV0dXJuKDB4ODE5QSk7ICAvKiBNaXNjIHN5bWJvbHMgKi8KKyAgICAgICAgICBjYXNlIDB4MjYwNjogcmV0dXJuKDB4ODE5OSk7CisgICAgICAgICAgY2FzZSAweDI2NDA6IHJldHVybigweDgxOEEpOworICAgICAgICAgIGNhc2UgMHgyNjQyOiByZXR1cm4oMHg4MTg5KTsKKyAgICAgICAgICBjYXNlIDB4MjY2QTogcmV0dXJuKDB4ODFGNCk7CisgICAgICAgICAgY2FzZSAweDI2NkQ6IHJldHVybigweDgxRjMpOworICAgICAgICAgIGNhc2UgMHgyNjZGOiByZXR1cm4oMHg4MUYyKTsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3BlY2lhbC0tOworICAgICAgICAgICAgYmFkKys7CisgICAgICAgICAgICByZXR1cm4oMHhmZmZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodW4gPj0gMHgzMDAwICYmIHVuIDwgMHg0ZTAwKSB7ICAvKiBDSksgc3ltYm9scyAmIHB1bmMgKi8KKyAgICAgICAga2FuamkrKzsKKyAgICAgICAgaWYgKHVuIDw9IDB4MzBmZikKKyAgICAgICAgICByZXR1cm4odXNqXzMwMDBbdW4tMHgzMDAwXSk7CisgICAgICAgIGthbmppLS07CisgICAgICAgIGJhZCsrOworICAgICAgICByZXR1cm4oMHhmZmZkKTsKKyAgICB9CisgICAgaWYgKHVuID49IDB4ZmYwMCAmJiB1biA8IDB4ZmZmZikgeyAgLyogSGFsZi9mdWxsLXdpZHRoIFJvbWFuICYgS2F0YWthbmEgKi8KKyAgICAgICAgaWYgKHVuIDw9IDB4ZmY5ZikgeworICAgICAgICAgICAgaWYgKHVuID4gMHhmZjYwKQorICAgICAgICAgICAgICBrYW5hKys7CisgICAgICAgICAgICByZXR1cm4odXNqX2ZmMDBbdW4tMHhmZjAwXSk7CisgICAgICAgIH0KKyAgICAgICAgYmFkKys7CisgICAgICAgIHJldHVybigweGZmZmQpOworICAgIH0KKyAgICBpZiAodW4gPj0gMHg0ZTAwICYmIHVuIDwgMHhlMDAwKSB7ICAvKiBLYW5qaSAqLworICAgICAgICBrYW5qaSsrOworICAgICAgICBpZiAodW4gPD0gMHg5ZmEwKQorICAgICAgICAgIHJldHVybih1c2pfNGUwMFt1bi0weDRlMDBdKTsKKyAgICAgICAga2FuamktLTsKKyAgICAgICAgYmFkKys7CisgICAgICAgIHJldHVybigweGZmZmQpOworICAgIH0KKyAgICBpZiAodW4gPj0gMHhlMDAwICYmIHVuIDwgMHhmZjAwKSB7ICAvKiBVc2VyLWRlZmluZWQgKEdhaWppKSAqLworICAgICAgICBrYW5qaSsrOworICAgICAgICBpZiAodW4gPD0gMHhlMGJiKSB7ICAgICAgICAgICAgIC8qIHRlbiAxODktY2hhciBjaHVua3MgKi8KKyAgICAgICAgICAgIHJldHVybigweGYwNDAgKyAodW4gLSAweGUwMDApKTsKKyAgICAgICAgfSBlbHNlIGlmICh1biA+PSAweGUwYmMgJiYgdW4gPD0gMHhlMTc3KSB7CisgICAgICAgICAgICByZXR1cm4oMHhmMTQwICsgKHVuIC0gMHhlMGJjKSk7CisgICAgICAgIH0gZWxzZSBpZiAodW4gPj0gMHhlMTc4ICYmIHVuIDw9IDB4ZTIzMykgeworICAgICAgICAgICAgcmV0dXJuKDB4ZjI0MCArICh1biAtIDB4ZTE3OCkpOworICAgICAgICB9IGVsc2UgaWYgKHVuID49IDB4ZTIzNCAmJiB1biA8PSAweGUyZWYpIHsKKyAgICAgICAgICAgIHJldHVybigweGYzNDAgKyAodW4gLSAweGUyMzQpKTsKKyAgICAgICAgfSBlbHNlIGlmICh1biA+PSAweGUyZjAgJiYgdW4gPD0gMHhlM2FiKSB7CisgICAgICAgICAgICByZXR1cm4oMHhmNDQwICsgKHVuIC0gMHhlMmYwKSk7CisgICAgICAgIH0gZWxzZSBpZiAodW4gPj0gMHhlM2FjICYmIHVuIDw9IDB4ZTQ2NykgeworICAgICAgICAgICAgcmV0dXJuKDB4ZjU0MCArICh1biAtIDB4ZTNhYykpOworICAgICAgICB9IGVsc2UgaWYgKHVuID49IDB4ZTQ2OCAmJiB1biA8PSAweGU1MjMpIHsKKyAgICAgICAgICAgIHJldHVybigweGY2NDAgKyAodW4gLSAweGU0NjgpKTsKKyAgICAgICAgfSBlbHNlIGlmICh1biA+PSAweGU1MjQgJiYgdW4gPD0gMHhlNWRmKSB7CisgICAgICAgICAgICByZXR1cm4oMHhmNzQwICsgKHVuIC0gMHhlNTI0KSk7CisgICAgICAgIH0gZWxzZSBpZiAodW4gPj0gMHhlNWUwICYmIHVuIDw9IDB4ZTY5YikgeworICAgICAgICAgICAgcmV0dXJuKDB4Zjg0MCArICh1biAtIDB4ZTVlMCkpOworICAgICAgICB9IGVsc2UgaWYgKHVuID49IDB4ZTY5YyAmJiB1biA8PSAweGU3NTcpIHsKKyAgICAgICAgICAgIHJldHVybigweGY5NDAgKyAodW4gLSAweGU2OWMpKTsKKyAgICAgICAgfQorICAgICAgICBiYWQrKzsKKyAgICAgICAgcmV0dXJuKDB4ZmZmZCk7CisgICAgfQorICAgIC8qIE5PVFJFQUNIRUQgKi8KKyAgICAvKiBTb21lIGNvbXBpbGVycyAoY29ycmVjdGx5KSB3YXJuIG9mICJzdGF0ZW1lbnQgbm90IHJlYWNoZWQiIGhlcmUuICovCisgICAgLyogQnV0IG90aGVycyBnaXZlIHVwIHRoZSBnaG9zdCB3aXRoICJubyByZXR1cm4gdmFsdWUiLiAgVGhlIGZvcm1lciAqLworICAgIC8qIGlzIHRoZSBsZXNzZXIgb2YgdHdvIGV2aWxzLiAqLworICAgIGJhZCsrOworICAgIHJldHVybigweGZmZmQpOworfQorI2VuZGlmIC8qIEtBTkpJICovCisKKy8qIFVuaWNvZGUtdG8tYmxhaCBmdW5jdGlvbnMsIHR4X2JsYWgoKS4gKi8KKworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCit0eF9wdW5jKFVTSE9SVCBjKQorI2Vsc2UKK3R4X3B1bmMoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA+PSAweDIwMDAgJiYgYyA8PSAweDIwMGEpICAgICAvKiBWYXJpb3VzLXdpZHRoIHNwYWNlcyAqLworICAgICAgcmV0dXJuKChDSEFSKSgweDIwKSk7CisgICAgZWxzZSBpZiAoYyA+PSAweDIwMTAgJiYgYyA8PSAweDIwMTUpIC8qIFZhcmlvdXMtd2lkdGggZGFzaGVzICovCisgICAgICByZXR1cm4oKENIQVIpJy0nKTsKKyAgICBlbHNlIGlmIChjID49IDB4MjAxOCAmJiBjIDw9IDB4MjAxYikgLyogQXNzb3J0ZWQgc2luZ2xlIHF1b3RlcyAqLworICAgICAgcmV0dXJuKChDSEFSKTB4MjcpOworICAgIGVsc2UgaWYgKGMgPj0gMHgyMDFjICYmIGMgPD0gMHgyMDFmKSAvKiBBc3NvcnRlZCBkb3VibGUgcXVvdGVzICovCisgICAgICByZXR1cm4oKENIQVIpMHgyMik7CisgICAgZWxzZSBpZiAoKGMgPj0gMHgyMDIyICYmIGMgPD0gMHgyMDI0KSB8fCBjID09IDB4MjA0MykgLyogQnVsbGV0cyAqLworICAgICAgcmV0dXJuKChDSEFSKTB4YjcpOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDIwMzk6ICAgICAgICAgICAgICAgICAgICAgIC8qIExlc3MtdGhhbiBzaWduICovCisgICAgICAgIHJldHVybigoQ0hBUikweDNjKTsKKyAgICAgIGNhc2UgMHgyMDNhOiAgICAgICAgICAgICAgICAgICAgICAvKiBHcmVhdGVyLXRoYW4gc2lnbiAqLworICAgICAgICByZXR1cm4oKENIQVIpMHgzZSk7CisgICAgICBjYXNlIDB4MjA0NDogICAgICAgICAgICAgICAgICAgICAgLyogU29saWR1cyAtPiBTbGFzaCAqLworICAgICAgICByZXR1cm4oKENIQVIpMHgyZik7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4oLTEpOworICAgIH0KK30KKworCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIExhdGluLTEgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfaWRlbnQoVVNIT1JUIGMpCisjZWxzZQordHhfaWRlbnQoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA9PSAweDIwM2UpICAgICAgICAgICAgICAgICAgICAvKiBPdmVybGluZSAtPiBNYWNyb24gKi8KKyAgICAgIHJldHVybigoQ0hBUikweGFmKTsKKyAgICBlbHNlIGlmIChjIDwgMHgxMDApICAgICAgICAgICAgICAgICAvKiBMYXRpbi0xIHJhbmdlICovCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3IgbWF5YmUgZnJvbSBwdW5jdHVhdGlvbiBibG9jayAqLworICAgICAgcmV0dXJuKHR4X3B1bmMoYykpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordHhfdXNhc2NpaShVU0hPUlQgYykKKyNlbHNlCit0eF91c2FzY2lpKGMpIFVTSE9SVCBjOyAgICAgICAgICAgICAgICAgLyogVVMgQVNDSUkgKi8KKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHg4MCkKKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBlbHNlIGlmIChjID49IDB4MjAwMCAmJiBjIDw9IDB4MjAwYSkgLyogVmFyaW91cy13aWR0aCBzcGFjZXMgKi8KKyAgICAgIHJldHVybigoQ0hBUikoMHgyMCkpOworICAgIGVsc2UgaWYgKGMgPj0gMHgyMDEwICYmIGMgPD0gMHgyMDE1KSAvKiBWYXJpb3VzLXdpZHRoIGRhc2hlcyAqLworICAgICAgcmV0dXJuKChDSEFSKSctJyk7CisgICAgZWxzZSBpZiAoYyA+PSAweDIwMTggJiYgYyA8PSAweDIwMWIpIC8qIEFzc29ydGVkIHNpbmdsZSBxdW90ZXMgKi8KKyAgICAgIHJldHVybigoQ0hBUikweDI3KTsKKyAgICBlbHNlIGlmIChjID49IDB4MjAxYyAmJiBjIDw9IDB4MjAxZikgLyogQXNzb3J0ZWQgZG91YmxlIHF1b3RlcyAqLworICAgICAgcmV0dXJuKChDSEFSKTB4MjIpOworICAgIGVsc2UgaWYgKChjID49IDB4MjAyMiAmJiBjIDw9IDB4MjAyNCkgfHwgYyA9PSAweDIwNDMpIC8qIEJ1bGxldHMgKi8KKyAgICAgIHJldHVybigoQ0hBUikweGI3KTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgyMDM5OiAgICAgICAgICAgICAgICAgICAgICAvKiBMZXNzLXRoYW4gc2lnbiAqLworICAgICAgICByZXR1cm4oKENIQVIpMHgzYyk7CisgICAgICBjYXNlIDB4MjAzYTogICAgICAgICAgICAgICAgICAgICAgLyogR3JlYXRlci10aGFuIHNpZ24gKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKTB4M2UpOworICAgICAgY2FzZSAweDIwNDQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNvbGlkdXMgLT4gU2xhc2ggKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKTB4MmYpOworICAgIH0KKyAgICAvKgorICAgICAgSGVyZSB3ZSBtaWdodCBhbHNvIChhKSBtYXAgYWNjZW50ZWQgUm9tYW4gbGV0dGVycyB0byB1bmFjY2VudGVkIG9uZXM7CisgICAgICAoYikgbWFwIEdyZWVrL0N5cmlsbGljIEEgKGV0YykgdG8gUm9tYW4sIGFuZCBzbyBvbi4KKyAgICAqLworICAgIHJldHVybigoYyAmIDB4ZmY4MCkgPyAtMSA6IChDSEFSKShjICYgMHg3ZikpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordHhfYnJpdGlzaChVU0hPUlQgYykKKyNlbHNlCit0eF9icml0aXNoKGMpIFVTSE9SVCBjOyAgICAgICAgICAgICAgICAgLyogQnJpdGlzaCAqLworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgJiAweGZmMDApCisgICAgICByZXR1cm4oLTEpOworICAgIGVsc2UgaWYgKGMgPT0gKFVTSE9SVCkgMHgwMGEzKSAgICAgIC8qIFBvdW5kIHNpZ24gKi8KKyAgICAgIHJldHVybigweDJiKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odHhfdXNhc2NpaShjKSk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit0eF9hcGwxKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2FwbDEoYykgVVNIT1JUIGM7ICAgICAgICAgICAgICAgICAgICAvKiBBcGwxICovCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA+PSAweDAwNDEgJiYgYyA8PSAweDAwNWEpICAgICAvKiBMZXR0ZXJzICovCisgICAgICByZXR1cm4oYyArIDB4MjApOworICAgIHN3aXRjaCAoYykgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVycyAqLworICAgICAgY2FzZSAweDAwMjQ6IHJldHVybigoQ0hBUikweDdlKTsKKyAgICAgIGNhc2UgMHgwMDI3OiByZXR1cm4oKENIQVIpMHg0Yik7CisgICAgICBjYXNlIDB4MDAyODogcmV0dXJuKChDSEFSKTB4M2EpOworICAgICAgY2FzZSAweDAwMjk6IHJldHVybigoQ0hBUikweDIyKTsKKyAgICAgIGNhc2UgMHgwMDJiOiByZXR1cm4oKENIQVIpMHgyZCk7CisgICAgICBjYXNlIDB4MDAyYzogcmV0dXJuKChDSEFSKTB4MmMpOworICAgICAgY2FzZSAweDAwMmQ6IHJldHVybigoQ0hBUikweDVmKTsKKyAgICAgIGNhc2UgMHgwMDJlOiByZXR1cm4oKENIQVIpMHgyZSk7CisgICAgICBjYXNlIDB4MDAyZjogcmV0dXJuKChDSEFSKTB4MmYpOworICAgICAgY2FzZSAweDAwMzA6IHJldHVybigoQ0hBUikweDMwKTsKKyAgICAgIGNhc2UgMHgwMDMxOiByZXR1cm4oKENIQVIpMHgzMSk7CisgICAgICBjYXNlIDB4MDAzMjogcmV0dXJuKChDSEFSKTB4MzIpOworICAgICAgY2FzZSAweDAwMzM6IHJldHVybigoQ0hBUikweDMzKTsKKyAgICAgIGNhc2UgMHgwMDM0OiByZXR1cm4oKENIQVIpMHgzNCk7CisgICAgICBjYXNlIDB4MDAzNTogcmV0dXJuKChDSEFSKTB4MzUpOworICAgICAgY2FzZSAweDAwMzY6IHJldHVybigoQ0hBUikweDM2KTsKKyAgICAgIGNhc2UgMHgwMDM3OiByZXR1cm4oKENIQVIpMHgzNyk7CisgICAgICBjYXNlIDB4MDAzODogcmV0dXJuKChDSEFSKTB4MzgpOworICAgICAgY2FzZSAweDAwMzk6IHJldHVybigoQ0hBUikweDM5KTsKKyAgICAgIGNhc2UgMHgwMDNhOiByZXR1cm4oKENIQVIpMHgzZSk7CisgICAgICBjYXNlIDB4MDAzYjogcmV0dXJuKChDSEFSKTB4M2MpOworICAgICAgY2FzZSAweDAwM2M6IHJldHVybigoQ0hBUikweDIzKTsKKyAgICAgIGNhc2UgMHgwMDNkOiByZXR1cm4oKENIQVIpMHgyNSk7CisgICAgICBjYXNlIDB4MDAzZTogcmV0dXJuKChDSEFSKTB4MjYpOworICAgICAgY2FzZSAweDAwM2Y6IHJldHVybigoQ0hBUikweDUxKTsKKyAgICAgIGNhc2UgMHgwMDViOiByZXR1cm4oKENIQVIpMHgzYik7CisgICAgICBjYXNlIDB4MDA1YzogcmV0dXJuKChDSEFSKTB4M2YpOworICAgICAgY2FzZSAweDAwNWQ6IHJldHVybigoQ0hBUikweDI3KTsKKyAgICAgIGNhc2UgMHgwMDVmOiByZXR1cm4oKENIQVIpMHg0Nik7CisgICAgICBjYXNlIDB4MDA3YjogcmV0dXJuKChDSEFSKTB4N2IpOworICAgICAgY2FzZSAweDAwN2M6IHJldHVybigoQ0hBUikweDRkKTsKKyAgICAgIGNhc2UgMHgwMDdkOiByZXR1cm4oKENIQVIpMHg3ZCk7CisgICAgICBjYXNlIDB4MDBhODogcmV0dXJuKChDSEFSKTB4MjEpOworICAgICAgY2FzZSAweDAwYWY6IHJldHVybigoQ0hBUikweDQwKTsKKyAgICAgIGNhc2UgMHgwMGQ3OiByZXR1cm4oKENIQVIpMHgzZCk7CisgICAgICBjYXNlIDB4MDBmNzogcmV0dXJuKChDSEFSKTB4MmIpOworICAgICAgY2FzZSAweDIxOTA6IHJldHVybigoQ0hBUikweDViKTsKKyAgICAgIGNhc2UgMHgyMTkxOiByZXR1cm4oKENIQVIpMHg1OSk7CisgICAgICBjYXNlIDB4MjE5MjogcmV0dXJuKChDSEFSKTB4NWQpOworICAgICAgY2FzZSAweDIxOTM6IHJldHVybigoQ0hBUikweDU1KTsKKyAgICAgIGNhc2UgMHgyMjA2OiByZXR1cm4oKENIQVIpMHg0OCk7CisgICAgICBjYXNlIDB4MjIwNzogcmV0dXJuKChDSEFSKTB4NDcpOworICAgICAgY2FzZSAweDIyMGE6IHJldHVybigoQ0hBUikweDQ1KTsKKyAgICAgIGNhc2UgMHgyMjE4OiByZXR1cm4oKENIQVIpMHg0YSk7CisgICAgICBjYXNlIDB4MjIyNzogcmV0dXJuKChDSEFSKTB4MjkpOworICAgICAgY2FzZSAweDIyMjg6IHJldHVybigoQ0hBUikweDI4KTsKKyAgICAgIGNhc2UgMHgyMjJhOiByZXR1cm4oKENIQVIpMHg1Nik7CisgICAgICBjYXNlIDB4MjIzYzogcmV0dXJuKChDSEFSKTB4NTQpOworICAgICAgY2FzZSAweDIyNjA6IHJldHVybigoQ0hBUikweDJhKTsKKyAgICAgIGNhc2UgMHgyMjY0OiByZXR1cm4oKENIQVIpMHgyNCk7CisgICAgICBjYXNlIDB4MjI2NTogcmV0dXJuKChDSEFSKTB4NWUpOworICAgICAgY2FzZSAweDIyODI6IHJldHVybigoQ0hBUikweDVhKTsKKyAgICAgIGNhc2UgMHgyMjgzOiByZXR1cm4oKENIQVIpMHg1OCk7CisgICAgICBjYXNlIDB4MjJhMjogcmV0dXJuKChDSEFSKTB4NWMpOworICAgICAgY2FzZSAweDIyYTM6IHJldHVybigoQ0hBUikweDdjKTsKKyAgICAgIGNhc2UgMHgyMmE0OiByZXR1cm4oKENIQVIpMHg0ZSk7CisgICAgICBjYXNlIDB4MjJhNTogcmV0dXJuKChDSEFSKTB4NDIpOworICAgICAgY2FzZSAweDIyYzI6IHJldHVybigoQ0hBUikweDQzKTsKKyAgICAgIGNhc2UgMHgyMmM0OiByZXR1cm4oKENIQVIpMHg2MCk7CisgICAgICBjYXNlIDB4MjJjNjogcmV0dXJuKChDSEFSKTB4NTApOworICAgICAgY2FzZSAweDIzMDg6IHJldHVybigoQ0hBUikweDUzKTsKKyAgICAgIGNhc2UgMHgyMzBhOiByZXR1cm4oKENIQVIpMHg0NCk7CisgICAgICBjYXNlIDB4MjM3MzogcmV0dXJuKChDSEFSKTB4NDkpOworICAgICAgY2FzZSAweDIzNzQ6IHJldHVybigoQ0hBUikweDUyKTsKKyAgICAgIGNhc2UgMHgyMzc1OiByZXR1cm4oKENIQVIpMHg1Nyk7CisgICAgICBjYXNlIDB4MjM3YTogcmV0dXJuKChDSEFSKTB4NDEpOworICAgICAgY2FzZSAweDI1YWY6IHJldHVybigoQ0hBUikweDRjKTsKKyAgICAgIGNhc2UgMHgyNWNiOiByZXR1cm4oKENIQVIpMHg0Zik7CisgICAgICBkZWZhdWx0OiAgIHJldHVybih0eF91c2FzY2lpKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYW5hZGlhbiBGcmVuY2ggKi8KKyNpZmRlZiBDS19BTlNJQwordHhfZnJfY2FuYWRpYW4oVVNIT1JUIGMpCisjZWxzZQordHhfZnJfY2FuYWRpYW4oYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmIDB4ZmYwMCkgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgKi8KKyAgICAgIHJldHVybigtMSk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHhlMDogcmV0dXJuKDB4NDApOyAgICAgICAgICAvKiBhIGdyYXZlICovCisgICAgICBjYXNlIDB4ZTI6IHJldHVybigweDViKTsgICAgICAgICAgLyogYSBjaXJjdW1mbGV4ICovCisgICAgICBjYXNlIDB4ZTc6IHJldHVybigweDVjKTsgICAgICAgICAgLyogYyBjZWRpbGxhICovCisgICAgICBjYXNlIDB4ZTg6IHJldHVybigweDdkKTsgICAgICAgICAgLyogZSBncmF2ZSAqLworICAgICAgY2FzZSAweGU5OiByZXR1cm4oMHg3Yik7ICAgICAgICAgIC8qIGUgYWN1dGUgKi8KKyAgICAgIGNhc2UgMHhlYTogcmV0dXJuKDB4NWQpOyAgICAgICAgICAvKiBlIGNpcmN1bWZsZXggKi8KKyAgICAgIGNhc2UgMHhlZTogcmV0dXJuKDB4NWUpOyAgICAgICAgICAvKiBpIGNpcmN1bWZsZXggKi8KKyAgICAgIGNhc2UgMHhmNDogcmV0dXJuKDB4NjApOyAgICAgICAgICAvKiBvIGNpcmN1bWZsZXggKi8KKyAgICAgIGNhc2UgMHhmOTogcmV0dXJuKDB4N2MpOyAgICAgICAgICAvKiB1IGdyYXZlICovCisgICAgICBjYXNlIDB4ZmI6IHJldHVybigweDZlKTsgICAgICAgICAgLyogdSBjaXJjdW1mbGV4ICovCisgICAgICBkZWZhdWx0OiAgIHJldHVybih0eF91c2FzY2lpKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEYW5pc2gvTm9yd2VnaWFuICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X2RhbmlzaChVU0hPUlQgYykKKyNlbHNlCit0eF9kYW5pc2goYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmIDB4ZmYwMCkgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgKi8KKyAgICAgIHJldHVybigtMSk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHhjNjogcmV0dXJuKDB4NWIpOyAgICAgICAgICAvKiBBRSAqLworICAgICAgY2FzZSAweGQ4OiByZXR1cm4oMHg1Yyk7ICAgICAgICAgIC8qIE8gc3Ryb2tlICovCisgICAgICBjYXNlIDB4ZTY6IHJldHVybigweDdiKTsgICAgICAgICAgLyogYWUgKi8KKyAgICAgIGNhc2UgMHhmODogcmV0dXJuKDB4N2MpOyAgICAgICAgICAvKiBvIHN0cm9rZSAqLworICAgICAgY2FzZSAweGU1OiByZXR1cm4oMHg3ZCk7ICAgICAgICAgIC8qIGEgcmluZyAqLworICAgICAgY2FzZSAweGFmOiByZXR1cm4oMHg3ZSk7ICAgICAgICAgIC8qIG1hY3JvbiAqLworICAgICAgZGVmYXVsdDogICByZXR1cm4odHhfdXNhc2NpaShjKSk7CisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRHV0Y2ggKi8KKyNpZmRlZiBDS19BTlNJQwordHhfZHV0Y2goVVNIT1JUIGMpCisjZWxzZQordHhfZHV0Y2goYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmIDB4ZmUwMCkgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgKi8KKyAgICAgIHJldHVybigtMSk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHgwMDdjOiByZXR1cm4oMHg1ZCk7ICAgICAgICAvKiB2ZXJ0aWNhbCBiYXIgKi8KKyAgICAgIGNhc2UgMHgwMGEzOiByZXR1cm4oMHgyMyk7ICAgICAgICAvKiBwb3VuZCBzaWduICovCisgICAgICBjYXNlIDB4MDBhYjogcmV0dXJuKDB4N2IpOyAgICAgICAgLyogZGlhZXJlc2lzICovCisgICAgICBjYXNlIDB4MDBiNDogcmV0dXJuKDB4N2UpOyAgICAgICAgLyogYWN1dGUgYWNjZW50ICovCisgICAgICBjYXNlIDB4MDBiYzogcmV0dXJuKDB4N2QpOyAgICAgICAgLyogMS80ICovCisgICAgICBjYXNlIDB4MDBiZTogcmV0dXJuKDB4NDApOyAgICAgICAgLyogMy80ICovCisgICAgICBjYXNlIDB4MDBiZDogcmV0dXJuKDB4NWMpOyAgICAgICAgLyogMS8yICovCisgICAgICBjYXNlIDB4MDBmZjogcmV0dXJuKDB4NWIpOyAgICAgICAgLyogeSBkaWFlcmVzaXMgKGlqKSAqLworICAgICAgY2FzZSAweDAxOTI6IHJldHVybigweDdjKTsgICAgICAgIC8qIEZsb3JpbiAqLworICAgICAgZGVmYXVsdDogICByZXR1cm4oKGMgJiAweDgwKSA/IC0xIDogKENIQVIpKGMgJiAweDdmKSk7CisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlubmlzaCAqLworI2lmZGVmIENLX0FOU0lDCit0eF9maW5uaXNoKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2Zpbm5pc2goYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmIDB4ZmYwMCkgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgKi8KKyAgICAgIHJldHVybigtMSk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHhjNDogcmV0dXJuKDB4NWIpOyAgICAgICAgICAvKiBBIGRpYWVyZXNpcyAqLworICAgICAgY2FzZSAweGQ2OiByZXR1cm4oMHg1Yyk7ICAgICAgICAgIC8qIE8gZGlhZXJlc2lzICovCisgICAgICBjYXNlIDB4YzU6IHJldHVybigweDVkKTsgICAgICAgICAgLyogQSByaW5nICovCisgICAgICBjYXNlIDB4ZGM6IHJldHVybigweDVlKTsgICAgICAgICAgLyogVSBkaWFlcmVzaXMgKi8KKyAgICAgIGNhc2UgMHhlOTogcmV0dXJuKDB4NjApOyAgICAgICAgICAvKiBlIGFjdXRlICovCisgICAgICBjYXNlIDB4ZTQ6IHJldHVybigweDdiKTsgICAgICAgICAgLyogYSBkaWFlcmVzaXMgKi8KKyAgICAgIGNhc2UgMHhmNjogcmV0dXJuKDB4N2MpOyAgICAgICAgICAvKiBvIGRpYWVyZXNpcyAqLworICAgICAgY2FzZSAweGU1OiByZXR1cm4oMHg3ZCk7ICAgICAgICAgIC8qIGEgcmluZyAqLworICAgICAgY2FzZSAweGZjOiByZXR1cm4oMHg3ZSk7ICAgICAgICAgIC8qIHUgZGlhZXJlc2lzICovCisgICAgICBkZWZhdWx0OiAgIHJldHVybih0eF91c2FzY2lpKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVuY2ggKi8KKyNpZmRlZiBDS19BTlNJQwordHhfZnJlbmNoKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2ZyZW5jaChjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjICYgMHhmZjAwKSAgICAgICAgICAgICAgICAgICAgIC8qIE91dCBvZiByYW5nZSAqLworICAgICAgcmV0dXJuKC0xKTsKKyAgICBzd2l0Y2goYykgeworICAgICAgY2FzZSAweGEzOiByZXR1cm4oMHgyMyk7ICAgICAgICAgIC8qIHBvdW5kIHNpZ24gKi8KKyAgICAgIGNhc2UgMHhhNzogcmV0dXJuKDB4NWQpOyAgICAgICAgICAvKiBzZWN0aW9uIHNpZ24gKi8KKyAgICAgIGNhc2UgMHhhODogcmV0dXJuKDB4N2UpOyAgICAgICAgICAvKiBkaWFlcmVzaXMgKi8KKyAgICAgIGNhc2UgMHhiMDogcmV0dXJuKDB4NWIpOyAgICAgICAgICAvKiByaW5nICovCisgICAgICBjYXNlIDB4YjU6IHJldHVybigweDYwKTsgICAgICAgICAgLyogbWljcm9uIHNpZ24gKG11KSAqLworICAgICAgY2FzZSAweGUwOiByZXR1cm4oMHg0MCk7ICAgICAgICAgIC8qIGEgZ3JhdmUgKi8KKyAgICAgIGNhc2UgMHhlNzogcmV0dXJuKDB4NWMpOyAgICAgICAgICAvKiBjIGNlZGlsbGEgKi8KKyAgICAgIGNhc2UgMHhlODogcmV0dXJuKDB4N2QpOyAgICAgICAgICAvKiBlIGdyYXZlICovCisgICAgICBjYXNlIDB4ZTk6IHJldHVybigweDdiKTsgICAgICAgICAgLyogZSBhY3V0ZSAqLworICAgICAgY2FzZSAweGY5OiByZXR1cm4oMHg3Yyk7ICAgICAgICAgIC8qIHUgZ3JhdmUgKi8KKyAgICAgIGRlZmF1bHQ6ICAgcmV0dXJuKHR4X3VzYXNjaWkoYykpOworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdlcm1hbiAqLworI2lmZGVmIENLX0FOU0lDCit0eF9nZXJtYW4oVVNIT1JUIGMpCisjZWxzZQordHhfZ2VybWFuKGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgJiAweGZmMDApICAgICAgICAgICAgICAgICAgICAgLyogT3V0IG9mIHJhbmdlICovCisgICAgICByZXR1cm4oLTEpOworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDB4YTc6IHJldHVybigweDQwKTsgICAgICAgICAgLyogc2VjdGlvbiBzaWduICovCisgICAgICBjYXNlIDB4YzQ6IHJldHVybigweDViKTsgICAgICAgICAgLyogQSB1bWxhdXQgKi8KKyAgICAgIGNhc2UgMHhkNjogcmV0dXJuKDB4NWMpOyAgICAgICAgICAvKiBPIHVtbGF1dCAqLworICAgICAgY2FzZSAweGRjOiByZXR1cm4oMHg1ZCk7ICAgICAgICAgIC8qIFUgdW1sYXV0ICovCisgICAgICBjYXNlIDB4ZGY6IHJldHVybigweDdlKTsgICAgICAgICAgLyogZXNzLXpldCAqLworICAgICAgY2FzZSAweGU0OiByZXR1cm4oMHg3Yik7ICAgICAgICAgIC8qIGEgdW1sYXV0ICovCisgICAgICBjYXNlIDB4ZjY6IHJldHVybigweDdjKTsgICAgICAgICAgLyogbyB1bWxhdXQgKi8KKyAgICAgIGNhc2UgMHhmYzogcmV0dXJuKDB4N2QpOyAgICAgICAgICAvKiB1IHVtbGF1dCovCisgICAgICBkZWZhdWx0OiAgIHJldHVybih0eF91c2FzY2lpKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIZWJyZXctNyAqLworI2lmZGVmIENLX0FOU0lDCit0eF9oZWJyZXc3KFVTSE9SVCBjKQorI2Vsc2UKK3R4X2hlYnJldzcoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4NjApICAgICAgICAgICAgICAgICAgICAgICAvKiBBU0NJSSAqLworICAgICAgcmV0dXJuKChDSEFSKShjICYgMHg3ZikpOworICAgIGVsc2UgaWYgKGMgPj0gMTIzICYmIGMgPCAxMjgpICAgICAgIC8qIEFTQ0lJICovCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweDdmKSk7CisgICAgZWxzZSBpZiAoYyA+PSAweDA1ZDAgJiYgYyA8PSAweDA1ZWEpIC8qIEhlYnJldyAyNyBjb250aWd1b3VzIGNoYXJhY3RlcnMgKi8KKyAgICAgIHJldHVybigoQ0hBUikoKGludCljIC0gMHg1ZDAgKyA5NikpOworICAgIGVsc2UgcmV0dXJuKC0xKTsKK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdyZWVrIEVMT1QgOTI3ICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X2Vsb3Q5MjcoVVNIT1JUIGMpCisjZWxzZQordHhfZWxvdDkyNyhjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDw9IDB4ODApIHsgICAgICAgICAgICAgICAgICAgIC8qIEFTQ0lJICovCisgICAgICAgIGlmIChpc2xvd2VyKGMpKSBjID0gdG91cHBlcihjKTsgLyogU2VuZCBhbGwgbGV0dGVycyBpbiB1cHBlcmNhc2UgKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKShjICYgMHg3ZikpOworICAgIH0KKworLyogR3JlZWsgLS0gbWFwIGFsbCBHcmVlayBjaGFyYWN0ZXJzIHRvIHVuYWNjZW50ZWQgdXBwZXJjYXNlICovCisKKyAgICBpZiAoYyA+PSAweDAzOTEgJiYgYyA8PSAweDAzYTEpIC8qIEFscGhhIHRocnUgUmhvIC0gdXBwZXJjYXNlICovCisgICAgICByZXR1cm4oKENIQVIpKChpbnQpYyAtIDB4MDM5MSArIDk3KSk7CisgICAgZWxzZSBpZiAoYyA+PSAweDAzYTMgJiYgYyA8PSAweDAzYTkpIC8qIFNpZ21hIHRocnUgT21lZ2EgLSB1cHBlcmNhc2UgKi8KKyAgICAgIHJldHVybigoQ0hBUikoKGludCljIC0gMHgwMzkxICsgOTYpKTsKKyAgICBlbHNlIGlmIChjID49IDB4MDNiMSAmJiBjIDw9IDB4MDNjMSkgLyogQWxwaGEgdGhydSBSaG8gLSBsb3dlcmNhc2UgKi8KKyAgICAgIHJldHVybigoQ0hBUikoKGludCljIC0gMHgwMzkxICsgOTcpKTsKKyAgICBlbHNlIGlmIChjID49IDB4MDNjMyAmJiBjIDw9IDB4MDNjOSkgLyogU2lnbWEgdGhydSBPbWVnYSAtIHVwcGVyY2FzZSAqLworICAgICAgcmV0dXJuKChDSEFSKSgoaW50KWMgLSAweDAzOTEgKyA5NikpOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDAzYzI6IHJldHVybigoQ0hBUikxMTQpOyAgIC8qIFRlcm1pbmFsIHNpZ21hICovCisgICAgICBjYXNlIDB4MDM4NjogcmV0dXJuKChDSEFSKTk3KTsgICAgLyogQWxwaGEgVG9ub3MgKi8KKyAgICAgIGNhc2UgMHgwM2FjOiByZXR1cm4oKENIQVIpOTcpOyAgICAvKiBhbHBoYSBUb25vcyAqLworICAgICAgY2FzZSAweDAzODg6IHJldHVybigoQ0hBUikxMDEpOyAgIC8qIEVwc2lsb24gVG9ub3MgKi8KKyAgICAgIGNhc2UgMHgwM2FkOiByZXR1cm4oKENIQVIpMTAxKTsgICAvKiBlcHNpbG9uIFRvbm9zICovCisgICAgICBjYXNlIDB4MDM4OTogcmV0dXJuKChDSEFSKTEwMyk7ICAgLyogRXRhIFRvbm9zICovCisgICAgICBjYXNlIDB4MDNhZTogcmV0dXJuKChDSEFSKTEwMyk7ICAgLyogZXRhIFRvbm9zICovCisgICAgICBjYXNlIDB4MDM4YTogcmV0dXJuKChDSEFSKTEwNSk7ICAgLyogSW90YSBUb25vcyAqLworICAgICAgY2FzZSAweDAzYWY6IHJldHVybigoQ0hBUikxMDUpOyAgIC8qIGlvdGEgVG9ub3MgKi8KKyAgICAgIGNhc2UgMHgwM2NhOiByZXR1cm4oKENIQVIpMTA1KTsgICAvKiBpb3RhIERpYWx5dGlrYSAqLworICAgICAgY2FzZSAweDAzOGM6IHJldHVybigoQ0hBUikxMTEpOyAgIC8qIE9taWNyb24gVG9ub3MgKi8KKyAgICAgIGNhc2UgMHgwM2NjOiByZXR1cm4oKENIQVIpMTExKTsgICAvKiBvbWljcm9uIFRvbm9zICovCisgICAgICBjYXNlIDB4MDM4ZTogcmV0dXJuKChDSEFSKTExNik7ICAgLyogVXBzaWxvbiBUb25vcyAqLworICAgICAgY2FzZSAweDAzZDM6IHJldHVybigoQ0hBUikxMTYpOyAgIC8qIFVwc2lsb24gVG9ub3MgKi8KKyAgICAgIGNhc2UgMHgwM2NkOiByZXR1cm4oKENIQVIpMTE2KTsgICAvKiB1cHNpbG9uIFRvbm9zICovCisgICAgICBjYXNlIDB4MDNjYjogcmV0dXJuKChDSEFSKTExNik7ICAgLyogdXBzaWxvbiBEaWFseXRpa2EgKi8KKyAgICAgIGNhc2UgMHgwM2IwOiByZXR1cm4oKENIQVIpMTE2KTsgICAvKiB1cHNpbG9uIERpYWx5dGlrYStUb25vcyAqLworICAgICAgY2FzZSAweDAzOGY6IHJldHVybigoQ0hBUikxMjApOyAgIC8qIE9tZWdhIFRvbm9zICovCisgICAgICBjYXNlIDB4MDNjZTogcmV0dXJuKChDSEFSKTEyMCk7ICAgLyogb21lZ2EgVG9ub3MgKi8KKyAgICAgIGNhc2UgMHgwMzkwOiByZXR1cm4oKENIQVIpMTA1KTsgICAvKiBpb3RhIERpYWx5dGlrYStUb25vcyAqLworICAgICAgY2FzZSAweDAzYWE6IHJldHVybigoQ0hBUikxMDUpOyAgIC8qIElvdGEgRGlhbHl0aWthICovCisgICAgICBjYXNlIDB4MDNhYjogcmV0dXJuKChDSEFSKTExNik7ICAgLyogVXBzaWxvbiBEaWFseXRpa2EgKi8KKyAgICAgIGNhc2UgMHgwM2Q0OiByZXR1cm4oKENIQVIpMTE2KTsgICAvKiBVcHNpbG9uIERpYWx5dGlrYSAqLworICAgICAgY2FzZSAweDAzZDA6IHJldHVybigoQ0hBUik5OCk7ICAgIC8qIEFsdGVybmF0aXZlIGJldGEgKi8KKyAgICAgIGNhc2UgMHgwM2QxOiByZXR1cm4oKENIQVIpMTA0KTsgICAvKiBPcGVuIHRoZXRhICovCisgICAgICBjYXNlIDB4MDNkNTogcmV0dXJuKChDSEFSKTExNyk7ICAgLyogT3BlbiBwaGkgKi8KKyAgICAgIGNhc2UgMHgwM2Q2OiByZXR1cm4oKENIQVIpMTEyKTsgICAvKiBBbHRlcm5hdGl2ZSBQaSAqLworICAgICAgZGVmYXVsdDogcmV0dXJuKC0xKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIdW5nYXJpYW4gKi8KKyNpZmRlZiBDS19BTlNJQwordHhfaHVuZ2FyaWFuKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2h1bmdhcmlhbihjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjID09IDB4MDJkZCB8fCBjID09IDB4MjAzMykKKyAgICAgIHJldHVybigweDdlKTsgICAgICAgICAgICAgICAgICAgICAvKiBkb3VibGUgYWN1dGUgYWNjZW50ICovCisgICAgZWxzZSBpZiAoYyAmIDB4ZmYwMCkgICAgICAgICAgICAgICAgLyogT3V0IG9mIHJhbmdlICovCisgICAgICByZXR1cm4oLTEpOworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDB4YzE6IHJldHVybigweDQwKTsgICAgICAgICAgLyogQSBhY3V0ZSAqLworICAgICAgY2FzZSAweGM5OiByZXR1cm4oMHg1Yik7ICAgICAgICAgIC8qIEUgYWN1dGUgKi8KKyAgICAgIGNhc2UgMHhkNjogcmV0dXJuKDB4NWMpOyAgICAgICAgICAvKiBPIHVtbGF1dCAqLworICAgICAgY2FzZSAweGRjOiByZXR1cm4oMHg1ZCk7ICAgICAgICAgIC8qIFUgdW1sYXV0ICovCisgICAgICBjYXNlIDB4ZTk6IHJldHVybigweDdiKTsgICAgICAgICAgLyogZSBhY3V0ZSAqLworICAgICAgY2FzZSAweGY2OiByZXR1cm4oMHg3Yyk7ICAgICAgICAgIC8qIG8gdW1sYXV0ICovCisgICAgICBjYXNlIDB4ZmE6IHJldHVybigweDYwKTsgICAgICAgICAgLyogdSBhY3V0ZSAqLworICAgICAgY2FzZSAweGZjOiByZXR1cm4oMHg3ZCk7ICAgICAgICAgIC8qIHUgdW1sYXV0ICovCisgICAgICBkZWZhdWx0OiAgIHJldHVybih0eF91c2FzY2lpKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJY2VsYW5kaWMgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfaWNlbGFuZGljKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2ljZWxhbmRpYyhjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjICYgMHhmZjAwKSAgICAgICAgICAgICAgICAgICAgIC8qIE91dCBvZiByYW5nZSAqLworICAgICAgcmV0dXJuKC0xKTsKKyAgICBzd2l0Y2goYykgeworICAgICAgY2FzZSAweGRlOiByZXR1cm4oMHg0MCk7ICAgICAgICAgIC8qIFRob3JuICovCisgICAgICBjYXNlIDB4ZDA6IHJldHVybigweDViKTsgICAgICAgICAgLyogRXRoICovCisgICAgICBjYXNlIDB4YzY6IHJldHVybigweDVkKTsgICAgICAgICAgLyogQUUgKi8KKyAgICAgIGNhc2UgMHhkNjogcmV0dXJuKDB4NWUpOyAgICAgICAgICAvKiBPIHVtbGF1dCAqLworICAgICAgY2FzZSAweGZlOiByZXR1cm4oMHg2MCk7ICAgICAgICAgIC8qIHRob3JuICovCisgICAgICBjYXNlIDB4ZjA6IHJldHVybigweDdiKTsgICAgICAgICAgLyogZXRoICovCisgICAgICBjYXNlIDB4ZTY6IHJldHVybigweDdkKTsgICAgICAgICAgLyogYWUgKi8KKyAgICAgIGNhc2UgMHhmNjogcmV0dXJuKDB4N2UpOyAgICAgICAgICAvKiBvIHVtbGF1dCAqLworICAgICAgZGVmYXVsdDogICByZXR1cm4odHhfdXNhc2NpaShjKSk7CisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXRhbGlhbiAqLworI2lmZGVmIENLX0FOU0lDCit0eF9pdGFsaWFuKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2l0YWxpYW4oYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmIDB4ZmYwMCkgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgKi8KKyAgICAgIHJldHVybigtMSk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHhhMzogcmV0dXJuKDB4MjMpOyAgICAgICAgICAvKiBwb3VuZCBzaWduICovCisgICAgICBjYXNlIDB4YTc6IHJldHVybigweDQwKTsgICAgICAgICAgLyogc2VjdGlvbiBzaWduICovCisgICAgICBjYXNlIDB4YjA6IHJldHVybigweDViKTsgICAgICAgICAgLyogcmluZyAqLworICAgICAgY2FzZSAweGU3OiByZXR1cm4oMHg1Yyk7ICAgICAgICAgIC8qIGMgY2VkaWxsYSAqLworICAgICAgY2FzZSAweGU5OiByZXR1cm4oMHg1ZCk7ICAgICAgICAgIC8qIGUgYWN1dGUgKi8KKyAgICAgIGNhc2UgMHhmOTogcmV0dXJuKDB4NjApOyAgICAgICAgICAvKiB1IGdyYXZlICovCisgICAgICBjYXNlIDB4ZTA6IHJldHVybigweDdiKTsgICAgICAgICAgLyogYSBncmF2ZSAqLworICAgICAgY2FzZSAweGYyOiByZXR1cm4oMHg3Yyk7ICAgICAgICAgIC8qIG8gZ3JhdmUgKi8KKyAgICAgIGNhc2UgMHhlODogcmV0dXJuKDB4N2QpOyAgICAgICAgICAvKiBlIGdyYXZlICovCisgICAgICBjYXNlIDB4ZWM6IHJldHVybigweDdlKTsgICAgICAgICAgLyogaSBncmF2ZSAqLworICAgICAgZGVmYXVsdDogICByZXR1cm4odHhfdXNhc2NpaShjKSk7CisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSklTIDAyMDEgUm9tYW4gKi8KKyNpZmRlZiBDS19BTlNJQwordHhfamlzMDIwMXIoVVNIT1JUIGMpCisjZWxzZQordHhfamlzMDIwMXIoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyAmJiAweGZmODApICAgICAgICAgICAgICAgICAgICAvKiA3IGJpdHMgKi8KKyAgICAgIHJldHVybigtMSk7CisgICAgc3dpdGNoIChjKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTGlrZSBBU0NJSSB3aXRoICovCisgICAgICBjYXNlIDB4MDBhNTogcmV0dXJuKDkyKTsgICAgICAgICAgLyogdHdvIGV4Y2VwdGlvbnMgKi8KKyAgICAgIGNhc2UgMHgwMGFmOiByZXR1cm4oMTI2KTsKKyAgICAgIGNhc2UgMHgyMDNlOiByZXR1cm4oMTI2KTsKKyAgICAgIGRlZmF1bHQ6ICAgcmV0dXJuKHR4X3VzYXNjaWkoYykpOworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEpJUyAwMjAxIEthdGFrYW5hICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X2ppczAyMDFrKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2ppczAyMDFrKGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPCAweGZmNjEgfHwgYyA+IDB4ZmY5ZikKKyAgICAgIHJldHVybigtMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgKi8KKyAgICBlbHNlCisgICAgICByZXR1cm4oKGludCljIC0gMHhmZWMwKTsgICAgICAgICAgLyogMHhmZjYxIC0gYTAgPSAweGZlYzAgKi8KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEtPSSAqLworI2lmZGVmIENLX0FOU0lDCit0eF9rb2k3KFVTSE9SVCBjKQorI2Vsc2UKK3R4X2tvaTcoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4NTApCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweDdmKSk7CisgICAgZWxzZSBpZiAoYyA+IDB4N2YpCisgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0IG9mIHJhbmdlICovCisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHgwNDEwOiByZXR1cm4oKENIQVIpOTcpOworICAgICAgY2FzZSAweDA0MTE6IHJldHVybigoQ0hBUik5OCk7CisgICAgICBjYXNlIDB4MDQxMjogcmV0dXJuKChDSEFSKTExOSk7CisgICAgICBjYXNlIDB4MDQxMzogcmV0dXJuKChDSEFSKTEwMyk7CisgICAgICBjYXNlIDB4MDQxNDogcmV0dXJuKChDSEFSKTEwMCk7CisgICAgICBjYXNlIDB4MDQxNTogcmV0dXJuKChDSEFSKTEwMSk7CisgICAgICBjYXNlIDB4MDQxNjogcmV0dXJuKChDSEFSKTExOCk7CisgICAgICBjYXNlIDB4MDQxNzogcmV0dXJuKChDSEFSKTEyMik7CisgICAgICBjYXNlIDB4MDQxODogcmV0dXJuKChDSEFSKTEwNSk7CisgICAgICBjYXNlIDB4MDQxOTogcmV0dXJuKChDSEFSKTEwNik7CisgICAgICBjYXNlIDB4MDQxYTogcmV0dXJuKChDSEFSKTEwNyk7CisgICAgICBjYXNlIDB4MDQxYjogcmV0dXJuKChDSEFSKTEwOCk7CisgICAgICBjYXNlIDB4MDQxYzogcmV0dXJuKChDSEFSKTEwOSk7CisgICAgICBjYXNlIDB4MDQxZDogcmV0dXJuKChDSEFSKTExMCk7CisgICAgICBjYXNlIDB4MDQxZTogcmV0dXJuKChDSEFSKTExMSk7CisgICAgICBjYXNlIDB4MDQxZjogcmV0dXJuKChDSEFSKTExMik7CisgICAgICBjYXNlIDB4MDQyMDogcmV0dXJuKChDSEFSKTExNCk7CisgICAgICBjYXNlIDB4MDQyMTogcmV0dXJuKChDSEFSKTExNSk7CisgICAgICBjYXNlIDB4MDQyMjogcmV0dXJuKChDSEFSKTExNik7CisgICAgICBjYXNlIDB4MDQyMzogcmV0dXJuKChDSEFSKTExNyk7CisgICAgICBjYXNlIDB4MDQyNDogcmV0dXJuKChDSEFSKTEwMik7CisgICAgICBjYXNlIDB4MDQyNTogcmV0dXJuKChDSEFSKTEwNCk7CisgICAgICBjYXNlIDB4MDQyNjogcmV0dXJuKChDSEFSKTk5KTsKKyAgICAgIGNhc2UgMHgwNDI3OiByZXR1cm4oKENIQVIpMTI2KTsKKyAgICAgIGNhc2UgMHgwNDI4OiByZXR1cm4oKENIQVIpMTIzKTsKKyAgICAgIGNhc2UgMHgwNDI5OiByZXR1cm4oKENIQVIpMTI1KTsKKyAgICAgIGNhc2UgMHgwNDJiOiByZXR1cm4oKENIQVIpMTIxKTsKKyAgICAgIGNhc2UgMHgwNDJjOiByZXR1cm4oKENIQVIpMTIwKTsKKyAgICAgIGNhc2UgMHgwNDJkOiByZXR1cm4oKENIQVIpMTI0KTsKKyAgICAgIGNhc2UgMHgwNDJlOiByZXR1cm4oKENIQVIpOTYpOworICAgICAgY2FzZSAweDA0MmY6IHJldHVybigoQ0hBUikxMTMpOworICAgICAgZGVmYXVsdDogcmV0dXJuKC0xKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3J0dWd1ZXNlICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X3BvcnR1Z3Vlc2UoVVNIT1JUIGMpCisjZWxzZQordHhfcG9ydHVndWVzZShjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjICYgMHhmZjAwKSAgICAgICAgICAgICAgICAgICAgIC8qIE91dCBvZiByYW5nZSAqLworICAgICAgcmV0dXJuKC0xKTsKKyAgICBzd2l0Y2goYykgeworICAgICAgY2FzZSAweGUwOiByZXR1cm4oMHhhNyk7ICAgICAgICAgIC8qIHNlY3Rpb24gc2lnbiAqLworICAgICAgY2FzZSAweGIwOiByZXR1cm4oMHhjMyk7ICAgICAgICAgIC8qIEEgdGlsZGUgKi8KKyAgICAgIGNhc2UgMHhlNzogcmV0dXJuKDB4YzcpOyAgICAgICAgICAvKiBDIGNlZGlsbGEgKi8KKyAgICAgIGNhc2UgMHhhNzogcmV0dXJuKDB4ZDUpOyAgICAgICAgICAvKiBPIHRpbGRlICovCisgICAgICBjYXNlIDB4ZTk6IHJldHVybigweGUzKTsgICAgICAgICAgLyogYSB0aWxkZSAqLworICAgICAgY2FzZSAweGY5OiByZXR1cm4oMHhlNyk7ICAgICAgICAgIC8qIGMgY2VkaWxsYSAqLworICAgICAgY2FzZSAweGU4OiByZXR1cm4oMHhmNSk7ICAgICAgICAgIC8qIG8gdGlsZGUgKi8KKyAgICAgIGNhc2UgMHhhODogcmV0dXJuKDB4YjApOyAgICAgICAgICAvKiByaW5nICovCisgICAgICBkZWZhdWx0OiAgIHJldHVybih0eF91c2FzY2lpKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTcGFuaXNoICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X3NwYW5pc2goVVNIT1JUIGMpCisjZWxzZQordHhfc3BhbmlzaChjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjICYgMHhmZjAwKSAgICAgICAgICAgICAgICAgICAgIC8qIE91dCBvZiByYW5nZSAqLworICAgICAgcmV0dXJuKC0xKTsKKyAgICBzd2l0Y2goYykgeworICAgICAgY2FzZSAweGEzOiByZXR1cm4oMHgyMyk7ICAgICAgICAgIC8qIHBvdW5kIHNpZ24gKi8KKyAgICAgIGNhc2UgMHhhNzogcmV0dXJuKDB4NDApOyAgICAgICAgICAvKiBzZWN0aW9uICovCisgICAgICBjYXNlIDB4YTE6IHJldHVybigweDViKTsgICAgICAgICAgLyogaW52ZXJ0ZWQgZXhjbGFtYXRpb24gKi8KKyAgICAgIGNhc2UgMHhkMTogcmV0dXJuKDB4NWMpOyAgICAgICAgICAvKiBOIHRpbGRlICovCisgICAgICBjYXNlIDB4YmY6IHJldHVybigweDVkKTsgICAgICAgICAgLyogaW52ZXJ0ZWQgcXVlc3Rpb24gbWFyayAqLworICAgICAgY2FzZSAweGIwOiByZXR1cm4oMHg3Yik7ICAgICAgICAgIC8qIHJpbmcgKi8KKyAgICAgIGNhc2UgMHhmMTogcmV0dXJuKDB4N2MpOyAgICAgICAgICAvKiBuIHRpbGRlICovCisgICAgICBjYXNlIDB4ZTc6IHJldHVybigweDdkKTsgICAgICAgICAgLyogYyBjZWRpbGxhICovCisgICAgICBkZWZhdWx0OiAgIHJldHVybih0eF91c2FzY2lpKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTd2VkaXNoICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X3N3ZWRpc2goVVNIT1JUIGMpCisjZWxzZQordHhfc3dlZGlzaChjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjICYgMHhmZjAwKSAgICAgICAgICAgICAgICAgICAgIC8qIE91dCBvZiByYW5nZSAqLworICAgICAgcmV0dXJuKC0xKTsKKyAgICBzd2l0Y2goYykgeworICAgICAgY2FzZSAweGM5OiByZXR1cm4oMHg0MCk7ICAgICAgICAgIC8qIEUgYWN1dGUgKi8KKyAgICAgIGNhc2UgMHhjNDogcmV0dXJuKDB4NWIpOyAgICAgICAgICAvKiBBIHVtbGF1dCovCisgICAgICBjYXNlIDB4ZDY6IHJldHVybigweDVjKTsgICAgICAgICAgLyogTyB1bWxhdXQgKi8KKyAgICAgIGNhc2UgMHhjNTogcmV0dXJuKDB4NWQpOyAgICAgICAgICAvKiBBIHJpbmcgKi8KKyAgICAgIGNhc2UgMHhkYzogcmV0dXJuKDB4NWUpOyAgICAgICAgICAvKiBVIHVtbGF1dCAqLworICAgICAgY2FzZSAweGU5OiByZXR1cm4oMHg2MCk7ICAgICAgICAgIC8qIGUgYWN1dGUgKi8KKyAgICAgIGNhc2UgMHhlNDogcmV0dXJuKDB4N2IpOyAgICAgICAgICAvKiBhIHVtbGF1dCAqLworICAgICAgY2FzZSAweGY2OiByZXR1cm4oMHg3Yyk7ICAgICAgICAgIC8qIG8gdW1sYXV0ICovCisgICAgICBjYXNlIDB4ZTU6IHJldHVybigweDdkKTsgICAgICAgICAgLyogYSByaW5nICovCisgICAgICBjYXNlIDB4ZmM6IHJldHVybigweDdlKTsgICAgICAgICAgLyogdSB1bWxhdXQgKi8KKyAgICAgIGRlZmF1bHQ6ICAgcmV0dXJuKHR4X3VzYXNjaWkoYykpOworICAgIH0KK30KKworCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3dpc3MgTlJDICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X3N3aXNzKFVTSE9SVCBjKQorI2Vsc2UKK3R4X3N3aXNzKGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgJiAweGZmMDApICAgICAgICAgICAgICAgICAgICAgLyogT3V0IG9mIHJhbmdlICovCisgICAgICByZXR1cm4oLTEpOworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDB4Zjk6IHJldHVybigweDIzKTsgICAgICAgICAgLyogdSBncmF2ZSAqLworICAgICAgY2FzZSAweGUwOiByZXR1cm4oMHg0MCk7ICAgICAgICAgIC8qIGEgZ3JhdmUgKi8KKyAgICAgIGNhc2UgMHhlOTogcmV0dXJuKDB4NWIpOyAgICAgICAgICAvKiBlIGFjdXRlICovCisgICAgICBjYXNlIDB4ZTc6IHJldHVybigweDVjKTsgICAgICAgICAgLyogYyBjZWRpbGxhICovCisgICAgICBjYXNlIDB4ZWE6IHJldHVybigweDVkKTsgICAgICAgICAgLyogZSBjaXJjdW1mbGV4ICovCisgICAgICBjYXNlIDB4ZWU6IHJldHVybigweDVlKTsgICAgICAgICAgLyogaSBjaXJjdW1mbGV4ICovCisgICAgICBjYXNlIDB4ZTg6IHJldHVybigweDVmKTsgICAgICAgICAgLyogZSBncmF2ZSAqLworICAgICAgY2FzZSAweGY0OiByZXR1cm4oMHg2MCk7ICAgICAgICAgIC8qIG8gY2lyY3VtZmxleCAqLworICAgICAgY2FzZSAweGU0OiByZXR1cm4oMHg3Yik7ICAgICAgICAgIC8qIGEgdW1sYXV0ICovCisgICAgICBjYXNlIDB4ZjY6IHJldHVybigweDdjKTsgICAgICAgICAgLyogbyB1bWxhdXQgKi8KKyAgICAgIGNhc2UgMHhmYzogcmV0dXJuKDB4N2QpOyAgICAgICAgICAvKiB1IHVtbGF1dCAqLworICAgICAgY2FzZSAweGZiOiByZXR1cm4oMHg3ZSk7ICAgICAgICAgIC8qIHUgY2lyY3VtZmxleCAqLworICAgICAgZGVmYXVsdDogICByZXR1cm4odHhfdXNhc2NpaShjKSk7CisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRHlhZGljIEFQTCAqLworI2lmZGVmIENLX0FOU0lDCit0eF9hcGwyKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2FwbDIoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA+PSAweDAwNDEgJiYgYyA8PSAweDAwNWEpICAgICAvKiBMZXR0ZXJzICovCisgICAgICByZXR1cm4oYyAtIDB4YTIpOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDAwYTA6IHJldHVybigoQ0hBUikweGEwKTsKKyAgICAgIGNhc2UgMHgwMGEyOiByZXR1cm4oKENIQVIpMHhhNCk7CisgICAgICBjYXNlIDB4MDBhMzogcmV0dXJuKChDSEFSKTB4ZDQpOworICAgICAgY2FzZSAweDAwYTg6IHJldHVybigoQ0hBUikweGRjKTsKKyAgICAgIGNhc2UgMHgwMGFmOiByZXR1cm4oKENIQVIpMHhkYSk7CisgICAgICBjYXNlIDB4MDBkNzogcmV0dXJuKChDSEFSKTB4YTEpOworICAgICAgY2FzZSAweDAwZjc6IHJldHVybigoQ0hBUikweGFmKTsKKyAgICAgIGNhc2UgMHgyMTkwOiByZXR1cm4oKENIQVIpMHhiYik7CisgICAgICBjYXNlIDB4MjE5MTogcmV0dXJuKChDSEFSKTB4ZmUpOworICAgICAgY2FzZSAweDIxOTI6IHJldHVybigoQ0hBUikweGRlKTsKKyAgICAgIGNhc2UgMHgyMTkzOiByZXR1cm4oKENIQVIpMHhmZik7CisgICAgICBjYXNlIDB4MjIwNjogcmV0dXJuKChDSEFSKTB4YWUpOworICAgICAgY2FzZSAweDIyMDc6IHJldHVybigoQ0hBUikweGZkKTsKKyAgICAgIGNhc2UgMHgyMjBhOiByZXR1cm4oKENIQVIpMHhiNSk7CisgICAgICBjYXNlIDB4MjIxODogcmV0dXJuKChDSEFSKTB4YmMpOworICAgICAgY2FzZSAweDIyMjg6IHJldHVybigoQ0hBUikweGRmKTsKKyAgICAgIGNhc2UgMHgyMjI5OiByZXR1cm4oKENIQVIpMHhkMSk7CisgICAgICBjYXNlIDB4MjIyYTogcmV0dXJuKChDSEFSKTB4ZDIpOworICAgICAgY2FzZSAweDIyNjA6IHJldHVybigoQ0hBUikweGIwKTsKKyAgICAgIGNhc2UgMHgyMjYxOiByZXR1cm4oKENIQVIpMHhiNik7CisgICAgICBjYXNlIDB4MjI2MjogcmV0dXJuKChDSEFSKTB4Y2QpOworICAgICAgY2FzZSAweDIyNjQ6IHJldHVybigoQ0hBUikweGI4KTsKKyAgICAgIGNhc2UgMHgyMjY1OiByZXR1cm4oKENIQVIpMHhiNyk7CisgICAgICBjYXNlIDB4MjI4MjogcmV0dXJuKChDSEFSKTB4ZTApOworICAgICAgY2FzZSAweDIyODM6IHJldHVybigoQ0hBUikweGUxKTsKKyAgICAgIGNhc2UgMHgyMjk2OiByZXR1cm4oKENIQVIpMHhkNik7CisgICAgICBjYXNlIDB4MjJhMjogcmV0dXJuKChDSEFSKTB4ZDcpOworICAgICAgY2FzZSAweDIyYTM6IHJldHVybigoQ0hBUikweGQ4KTsKKyAgICAgIGNhc2UgMHgyMmE0OiByZXR1cm4oKENIQVIpMHhiYSk7CisgICAgICBjYXNlIDB4MjJhNTogcmV0dXJuKChDSEFSKTB4YjkpOworICAgICAgY2FzZSAweDIyYzQ6IHJldHVybigoQ0hBUikweGIxKTsKKyAgICAgIGNhc2UgMHgyMzA4OiByZXR1cm4oKENIQVIpMHhjZik7CisgICAgICBjYXNlIDB4MjMwYTogcmV0dXJuKChDSEFSKTB4Y2UpOworICAgICAgY2FzZSAweDIzMzc6IHJldHVybigoQ0hBUikweGQ5KTsKKyAgICAgIGNhc2UgMHgyMzM5OiByZXR1cm4oKENIQVIpMHhjYSk7CisgICAgICBjYXNlIDB4MjMzZDogcmV0dXJuKChDSEFSKTB4ZDUpOworICAgICAgY2FzZSAweDIzM2Y6IHJldHVybigoQ0hBUikweGJlKTsKKyAgICAgIGNhc2UgMHgyMzQwOiByZXR1cm4oKENIQVIpMHhiZik7CisgICAgICBjYXNlIDB4MjM0OTogcmV0dXJuKChDSEFSKTB4ZDApOworICAgICAgY2FzZSAweDIzNGI6IHJldHVybigoQ0hBUikweGMyKTsKKyAgICAgIGNhc2UgMHgyMzRlOiByZXR1cm4oKENIQVIpMHhjMCk7CisgICAgICBjYXNlIDB4MjM1MjogcmV0dXJuKChDSEFSKTB4YzMpOworICAgICAgY2FzZSAweDIzNTU6IHJldHVybigoQ0hBUikweGMxKTsKKyAgICAgIGNhc2UgMHgyMzU5OiByZXR1cm4oKENIQVIpMHhlMik7CisgICAgICBjYXNlIDB4MjM1ZDogcmV0dXJuKChDSEFSKTB4YmQpOworICAgICAgY2FzZSAweDIzNWU6IHJldHVybigoQ0hBUikweGM5KTsKKyAgICAgIGNhc2UgMHgyMzVmOiByZXR1cm4oKENIQVIpMHhjNyk7CisgICAgICBjYXNlIDB4MjM2ODogcmV0dXJuKChDSEFSKTB4YzYpOworICAgICAgY2FzZSAweDIzNmE6IHJldHVybigoQ0hBUikweGNjKTsKKyAgICAgIGNhc2UgMHgyMzZiOiByZXR1cm4oKENIQVIpMHhjYik7CisgICAgICBjYXNlIDB4MjM2YzogcmV0dXJuKChDSEFSKTB4ZDMpOworICAgICAgY2FzZSAweDIzNzE6IHJldHVybigoQ0hBUikweGM1KTsKKyAgICAgIGNhc2UgMHgyMzcyOiByZXR1cm4oKENIQVIpMHhjNCk7CisgICAgICBjYXNlIDB4MjM3MzogcmV0dXJuKChDSEFSKTB4ZGIpOworICAgICAgY2FzZSAweDIzNzQ6IHJldHVybigoQ0hBUikweGIzKTsKKyAgICAgIGNhc2UgMHgyMzc1OiByZXR1cm4oKENIQVIpMHhiMik7CisgICAgICBjYXNlIDB4MjM3YTogcmV0dXJuKChDSEFSKTB4YjQpOworICAgICAgY2FzZSAweDI1MDA6IHJldHVybigoQ0hBUikweGFhKTsKKyAgICAgIGNhc2UgMHgyNTAyOiByZXR1cm4oKENIQVIpMHhhMik7CisgICAgICBjYXNlIDB4MjUwYzogcmV0dXJuKChDSEFSKTB4YWQpOworICAgICAgY2FzZSAweDI1MTA6IHJldHVybigoQ0hBUikweGE1KTsKKyAgICAgIGNhc2UgMHgyNTE0OiByZXR1cm4oKENIQVIpMHhhNik7CisgICAgICBjYXNlIDB4MjUxODogcmV0dXJuKChDSEFSKTB4YWMpOworICAgICAgY2FzZSAweDI1MWM6IHJldHVybigoQ0hBUikweGE5KTsKKyAgICAgIGNhc2UgMHgyNTI0OiByZXR1cm4oKENIQVIpMHhhMyk7CisgICAgICBjYXNlIDB4MjUyYzogcmV0dXJuKChDSEFSKTB4YTgpOworICAgICAgY2FzZSAweDI1MzQ6IHJldHVybigoQ0hBUikweGE3KTsKKyAgICAgIGNhc2UgMHgyNTNjOiByZXR1cm4oKENIQVIpMHhhYik7CisgICAgICBjYXNlIDB4MjVhZjogcmV0dXJuKChDSEFSKTB4YzgpOworICAgICAgY2FzZSAweDI1Y2I6IHJldHVybigoQ0hBUikweGRkKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChjIDwgMHhhMCkKKyAgICAgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgICAgIHJldHVybih0eF9wdW5jKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBUEwtUGx1cyAqLworI2lmZGVmIENLX0FOU0lDCit0eF9hcGwzKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2FwbDMoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgwMGEwOiByZXR1cm4oKENIQVIpMHhhMCk7CisgICAgICBjYXNlIDB4MDBhMTogcmV0dXJuKChDSEFSKTB4YTEpOworICAgICAgY2FzZSAweDAwYTI6IHJldHVybigoQ0hBUikweGEyKTsKKyAgICAgIGNhc2UgMHgwMGEzOiByZXR1cm4oKENIQVIpMHhhMyk7CisgICAgICBjYXNlIDB4MDBhNTogcmV0dXJuKChDSEFSKTB4YTUpOworICAgICAgY2FzZSAweDAwYTY6IHJldHVybigoQ0hBUikweGE2KTsKKyAgICAgIGNhc2UgMHgwMGE3OiByZXR1cm4oKENIQVIpMHhhNyk7CisgICAgICBjYXNlIDB4MDBhODogcmV0dXJuKChDSEFSKTB4YTgpOworICAgICAgY2FzZSAweDAwYWI6IHJldHVybigoQ0hBUikweGFiKTsKKyAgICAgIGNhc2UgMHgwMGFmOiByZXR1cm4oKENIQVIpMHhhZik7CisgICAgICBjYXNlIDB4MDBiNjogcmV0dXJuKChDSEFSKTB4YjYpOworICAgICAgY2FzZSAweDAwYjc6IHJldHVybigoQ0hBUikweGI3KTsKKyAgICAgIGNhc2UgMHgwMGJiOiByZXR1cm4oKENIQVIpMHhiYik7CisgICAgICBjYXNlIDB4MDBiZjogcmV0dXJuKChDSEFSKTB4YmYpOworICAgICAgY2FzZSAweDAwYzA6IHJldHVybigoQ0hBUikweGMwKTsKKyAgICAgIGNhc2UgMHgwMGMxOiByZXR1cm4oKENIQVIpMHhjMSk7CisgICAgICBjYXNlIDB4MDBjMjogcmV0dXJuKChDSEFSKTB4YzIpOworICAgICAgY2FzZSAweDAwYzM6IHJldHVybigoQ0hBUikweGMzKTsKKyAgICAgIGNhc2UgMHgwMGM0OiByZXR1cm4oKENIQVIpMHhjNCk7CisgICAgICBjYXNlIDB4MDBjNTogcmV0dXJuKChDSEFSKTB4YzUpOworICAgICAgY2FzZSAweDAwYzY6IHJldHVybigoQ0hBUikweGM2KTsKKyAgICAgIGNhc2UgMHgwMGM3OiByZXR1cm4oKENIQVIpMHhjNyk7CisgICAgICBjYXNlIDB4MDBjODogcmV0dXJuKChDSEFSKTB4YzgpOworICAgICAgY2FzZSAweDAwYzk6IHJldHVybigoQ0hBUikweGM5KTsKKyAgICAgIGNhc2UgMHgwMGNhOiByZXR1cm4oKENIQVIpMHhjYSk7CisgICAgICBjYXNlIDB4MDBjYjogcmV0dXJuKChDSEFSKTB4Y2IpOworICAgICAgY2FzZSAweDAwY2M6IHJldHVybigoQ0hBUikweGNjKTsKKyAgICAgIGNhc2UgMHgwMGNkOiByZXR1cm4oKENIQVIpMHhjZCk7CisgICAgICBjYXNlIDB4MDBjZTogcmV0dXJuKChDSEFSKTB4Y2UpOworICAgICAgY2FzZSAweDAwY2Y6IHJldHVybigoQ0hBUikweGNmKTsKKyAgICAgIGNhc2UgMHgwMGQxOiByZXR1cm4oKENIQVIpMHhkMSk7CisgICAgICBjYXNlIDB4MDBkMjogcmV0dXJuKChDSEFSKTB4ZDIpOworICAgICAgY2FzZSAweDAwZDM6IHJldHVybigoQ0hBUikweGQzKTsKKyAgICAgIGNhc2UgMHgwMGQ0OiByZXR1cm4oKENIQVIpMHhkNCk7CisgICAgICBjYXNlIDB4MDBkNTogcmV0dXJuKChDSEFSKTB4ZDUpOworICAgICAgY2FzZSAweDAwZDY6IHJldHVybigoQ0hBUikweGQ2KTsKKyAgICAgIGNhc2UgMHgwMGQ3OiByZXR1cm4oKENIQVIpMHhkNyk7CisgICAgICBjYXNlIDB4MDBkODogcmV0dXJuKChDSEFSKTB4ZDgpOworICAgICAgY2FzZSAweDAwZDk6IHJldHVybigoQ0hBUikweGQ5KTsKKyAgICAgIGNhc2UgMHgwMGRhOiByZXR1cm4oKENIQVIpMHhkYSk7CisgICAgICBjYXNlIDB4MDBkYjogcmV0dXJuKChDSEFSKTB4ZGIpOworICAgICAgY2FzZSAweDAwZGM6IHJldHVybigoQ0hBUikweGRjKTsKKyAgICAgIGNhc2UgMHgwMGRkOiByZXR1cm4oKENIQVIpMHhkZCk7CisgICAgICBjYXNlIDB4MDBkZjogcmV0dXJuKChDSEFSKTB4ZGYpOworICAgICAgY2FzZSAweDAwZTA6IHJldHVybigoQ0hBUikweGUwKTsKKyAgICAgIGNhc2UgMHgwMGUxOiByZXR1cm4oKENIQVIpMHhlMSk7CisgICAgICBjYXNlIDB4MDBlMjogcmV0dXJuKChDSEFSKTB4ZTIpOworICAgICAgY2FzZSAweDAwZTM6IHJldHVybigoQ0hBUikweGUzKTsKKyAgICAgIGNhc2UgMHgwMGU0OiByZXR1cm4oKENIQVIpMHhlNCk7CisgICAgICBjYXNlIDB4MDBlNTogcmV0dXJuKChDSEFSKTB4ZTUpOworICAgICAgY2FzZSAweDAwZTY6IHJldHVybigoQ0hBUikweGU2KTsKKyAgICAgIGNhc2UgMHgwMGU3OiByZXR1cm4oKENIQVIpMHhlNyk7CisgICAgICBjYXNlIDB4MDBlODogcmV0dXJuKChDSEFSKTB4ZTgpOworICAgICAgY2FzZSAweDAwZTk6IHJldHVybigoQ0hBUikweGU5KTsKKyAgICAgIGNhc2UgMHgwMGVhOiByZXR1cm4oKENIQVIpMHhlYSk7CisgICAgICBjYXNlIDB4MDBlYjogcmV0dXJuKChDSEFSKTB4ZWIpOworICAgICAgY2FzZSAweDAwZWM6IHJldHVybigoQ0hBUikweGVjKTsKKyAgICAgIGNhc2UgMHgwMGVkOiByZXR1cm4oKENIQVIpMHhlZCk7CisgICAgICBjYXNlIDB4MDBlZTogcmV0dXJuKChDSEFSKTB4ZWUpOworICAgICAgY2FzZSAweDAwZWY6IHJldHVybigoQ0hBUikweGVmKTsKKyAgICAgIGNhc2UgMHgwMGYxOiByZXR1cm4oKENIQVIpMHhmMSk7CisgICAgICBjYXNlIDB4MDBmMjogcmV0dXJuKChDSEFSKTB4ZjIpOworICAgICAgY2FzZSAweDAwZjM6IHJldHVybigoQ0hBUikweGYzKTsKKyAgICAgIGNhc2UgMHgwMGY0OiByZXR1cm4oKENIQVIpMHhmNCk7CisgICAgICBjYXNlIDB4MDBmNTogcmV0dXJuKChDSEFSKTB4ZjUpOworICAgICAgY2FzZSAweDAwZjY6IHJldHVybigoQ0hBUikweGY2KTsKKyAgICAgIGNhc2UgMHgwMGY3OiByZXR1cm4oKENIQVIpMHhmNyk7CisgICAgICBjYXNlIDB4MDBmOTogcmV0dXJuKChDSEFSKTB4ZjkpOworICAgICAgY2FzZSAweDAwZmE6IHJldHVybigoQ0hBUikweGZhKTsKKyAgICAgIGNhc2UgMHgwMGZiOiByZXR1cm4oKENIQVIpMHhmYik7CisgICAgICBjYXNlIDB4MDBmYzogcmV0dXJuKChDSEFSKTB4ZmMpOworICAgICAgY2FzZSAweDAwZmQ6IHJldHVybigoQ0hBUikweGZkKTsKKyAgICAgIGNhc2UgMHgwMGZmOiByZXR1cm4oKENIQVIpMHhmZik7CisgICAgICBjYXNlIDB4MjBhYzogcmV0dXJuKChDSEFSKTB4ODApOworICAgICAgY2FzZSAweDIxOTA6IHJldHVybigoQ0hBUikweDg0KTsKKyAgICAgIGNhc2UgMHgyMTkxOiByZXR1cm4oKENIQVIpMHg4Nik7CisgICAgICBjYXNlIDB4MjE5MjogcmV0dXJuKChDSEFSKTB4ODUpOworICAgICAgY2FzZSAweDIxOTM6IHJldHVybigoQ0hBUikweDg3KTsKKyAgICAgIGNhc2UgMHgyMjA1OiByZXR1cm4oKENIQVIpMHhmOCk7CisgICAgICBjYXNlIDB4MjIwNjogcmV0dXJuKChDSEFSKTB4OTEpOworICAgICAgY2FzZSAweDIyMDc6IHJldHVybigoQ0hBUikweDkyKTsKKyAgICAgIGNhc2UgMHgyMjBhOiByZXR1cm4oKENIQVIpMHhiOSk7CisgICAgICBjYXNlIDB4MjIxODogcmV0dXJuKChDSEFSKTB4YjApOworICAgICAgY2FzZSAweDIyMjg6IHJldHVybigoQ0hBUikweDlmKTsKKyAgICAgIGNhc2UgMHgyMjI5OiByZXR1cm4oKENIQVIpMHg5ZCk7CisgICAgICBjYXNlIDB4MjIyYTogcmV0dXJuKChDSEFSKTB4OWUpOworICAgICAgY2FzZSAweDIyNjA6IHJldHVybigoQ0hBUikweGFjKTsKKyAgICAgIGNhc2UgMHgyMjYxOiByZXR1cm4oKENIQVIpMHhhZCk7CisgICAgICBjYXNlIDB4MjI2NDogcmV0dXJuKChDSEFSKTB4ODgpOworICAgICAgY2FzZSAweDIyNjU6IHJldHVybigoQ0hBUikweDg5KTsKKyAgICAgIGNhc2UgMHgyMjgyOiByZXR1cm4oKENIQVIpMHg5Yik7CisgICAgICBjYXNlIDB4MjI4MzogcmV0dXJuKChDSEFSKTB4OWMpOworICAgICAgY2FzZSAweDIyOTY6IHJldHVybigoQ0hBUikweGI0KTsKKyAgICAgIGNhc2UgMHgyMmEyOiByZXR1cm4oKENIQVIpMHhhNCk7CisgICAgICBjYXNlIDB4MjJhMzogcmV0dXJuKChDSEFSKTB4ODEpOworICAgICAgY2FzZSAweDIyYTQ6IHJldHVybigoQ0hBUikweDgyKTsKKyAgICAgIGNhc2UgMHgyMmE1OiByZXR1cm4oKENIQVIpMHg4Myk7CisgICAgICBjYXNlIDB4MjJjNDogcmV0dXJuKChDSEFSKTB4YWEpOworICAgICAgY2FzZSAweDIzMDg6IHJldHVybigoQ0hBUikweDk3KTsKKyAgICAgIGNhc2UgMHgyMzBhOiByZXR1cm4oKENIQVIpMHg5OCk7CisgICAgICBjYXNlIDB4MjMzNzogcmV0dXJuKChDSEFSKTB4ZGUpOworICAgICAgY2FzZSAweDIzMzk6IHJldHVybigoQ0hBUikweDhlKTsKKyAgICAgIGNhc2UgMHgyMzNkOiByZXR1cm4oKENIQVIpMHhiMik7CisgICAgICBjYXNlIDB4MjMzZjogcmV0dXJuKChDSEFSKTB4OWEpOworICAgICAgY2FzZSAweDIzNDA6IHJldHVybigoQ0hBUikweDk5KTsKKyAgICAgIGNhc2UgMHgyMzQ5OiByZXR1cm4oKENIQVIpMHhiMyk7CisgICAgICBjYXNlIDB4MjM0YjogcmV0dXJuKChDSEFSKTB4OTMpOworICAgICAgY2FzZSAweDIzNGU6IHJldHVybigoQ0hBUikweDk2KTsKKyAgICAgIGNhc2UgMHgyMzUyOiByZXR1cm4oKENIQVIpMHg5NCk7CisgICAgICBjYXNlIDB4MjM1NTogcmV0dXJuKChDSEFSKTB4OTUpOworICAgICAgY2FzZSAweDIzNTk6IHJldHVybigoQ0hBUikweDhmKTsKKyAgICAgIGNhc2UgMHgyMzVkOiByZXR1cm4oKENIQVIpMHhhOSk7CisgICAgICBjYXNlIDB4MjM1ZTogcmV0dXJuKChDSEFSKTB4OGQpOworICAgICAgY2FzZSAweDIzNWY6IHJldHVybigoQ0hBUikweGI1KTsKKyAgICAgIGNhc2UgMHgyMzY0OiByZXR1cm4oKENIQVIpMHhmMCk7CisgICAgICBjYXNlIDB4MjM2ODogcmV0dXJuKChDSEFSKTB4ZmUpOworICAgICAgY2FzZSAweDIzNmE6IHJldHVybigoQ0hBUikweGFlKTsKKyAgICAgIGNhc2UgMHgyMzZiOiByZXR1cm4oKENIQVIpMHg5MCk7CisgICAgICBjYXNlIDB4MjM2YzogcmV0dXJuKChDSEFSKTB4ZDApOworICAgICAgY2FzZSAweDIzNzE6IHJldHVybigoQ0hBUikweDhiKTsKKyAgICAgIGNhc2UgMHgyMzcyOiByZXR1cm4oKENIQVIpMHg4YSk7CisgICAgICBjYXNlIDB4MjM3MzogcmV0dXJuKChDSEFSKTB4YmMpOworICAgICAgY2FzZSAweDIzNzQ6IHJldHVybigoQ0hBUikweGJkKTsKKyAgICAgIGNhc2UgMHgyMzc1OiByZXR1cm4oKENIQVIpMHhiZSk7CisgICAgICBjYXNlIDB4MjM3NzogcmV0dXJuKChDSEFSKTB4YmEpOworICAgICAgY2FzZSAweDIzN2E6IHJldHVybigoQ0hBUikweGI4KTsKKyAgICAgIGNhc2UgMHgyNWFmOiByZXR1cm4oKENIQVIpMHg4Yyk7CisgICAgICBjYXNlIDB4MjVjYjogcmV0dXJuKChDSEFSKTB4YjEpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKHR4X3B1bmMoYykpOworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElCTSBBUEwyICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X2FwbDQoVVNIT1JUIGMpCisjZWxzZQordHhfYXBsNChjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDAwYTA6IHJldHVybigoQ0hBUikweGZmKTsKKyAgICAgIGNhc2UgMHgwMGExOiByZXR1cm4oKENIQVIpMHhhZCk7CisgICAgICBjYXNlIDB4MDBhMzogcmV0dXJuKChDSEFSKTB4OWMpOworICAgICAgY2FzZSAweDAwYTY6IHJldHVybigoQ0hBUikweGRkKTsKKyAgICAgIGNhc2UgMHgwMGE4OiByZXR1cm4oKENIQVIpMHhmZSk7CisgICAgICBjYXNlIDB4MDBhYTogcmV0dXJuKChDSEFSKTB4YTYpOworICAgICAgY2FzZSAweDAwYWM6IHJldHVybigoQ0hBUikweGFhKTsKKyAgICAgIGNhc2UgMHgwMGFmOiByZXR1cm4oKENIQVIpMHhmZCk7CisgICAgICBjYXNlIDB4MDBiYTogcmV0dXJuKChDSEFSKTB4YTcpOworICAgICAgY2FzZSAweDAwYmY6IHJldHVybigoQ0hBUikweGE4KTsKKyAgICAgIGNhc2UgMHgwMGM0OiByZXR1cm4oKENIQVIpMHg4ZSk7CisgICAgICBjYXNlIDB4MDBjNTogcmV0dXJuKChDSEFSKTB4ZWUpOyAgLyogYW5kIDB4OGYgKi8KKyAgICAgIGNhc2UgMHgwMGM3OiByZXR1cm4oKENIQVIpMHg4MCk7CisgICAgICBjYXNlIDB4MDBjYzogcmV0dXJuKChDSEFSKTB4ZGUpOworICAgICAgY2FzZSAweDAwZDE6IHJldHVybigoQ0hBUikweGE1KTsKKyAgICAgIGNhc2UgMHgwMGQ2OiByZXR1cm4oKENIQVIpMHg5OSk7CisgICAgICBjYXNlIDB4MDBkNzogcmV0dXJuKChDSEFSKTB4ZjUpOworICAgICAgY2FzZSAweDAwZGM6IHJldHVybigoQ0hBUikweDlhKTsKKyAgICAgIGNhc2UgMHgwMGRmOiByZXR1cm4oKENIQVIpMHhlMSk7CisgICAgICBjYXNlIDB4MDBlMDogcmV0dXJuKChDSEFSKTB4ODUpOworICAgICAgY2FzZSAweDAwZTE6IHJldHVybigoQ0hBUikweGEwKTsKKyAgICAgIGNhc2UgMHgwMGUyOiByZXR1cm4oKENIQVIpMHg4Myk7CisgICAgICBjYXNlIDB4MDBlNDogcmV0dXJuKChDSEFSKTB4ODQpOworICAgICAgY2FzZSAweDAwZTU6IHJldHVybigoQ0hBUikweDg2KTsKKyAgICAgIGNhc2UgMHgwMGU3OiByZXR1cm4oKENIQVIpMHg4Nyk7CisgICAgICBjYXNlIDB4MDBlODogcmV0dXJuKChDSEFSKTB4OGEpOworICAgICAgY2FzZSAweDAwZTk6IHJldHVybigoQ0hBUikweDgyKTsKKyAgICAgIGNhc2UgMHgwMGVhOiByZXR1cm4oKENIQVIpMHg4OCk7CisgICAgICBjYXNlIDB4MDBlYjogcmV0dXJuKChDSEFSKTB4ODkpOworICAgICAgY2FzZSAweDAwZWM6IHJldHVybigoQ0hBUikweDhkKTsKKyAgICAgIGNhc2UgMHgwMGVkOiByZXR1cm4oKENIQVIpMHhhMSk7CisgICAgICBjYXNlIDB4MDBlZTogcmV0dXJuKChDSEFSKTB4OGMpOworICAgICAgY2FzZSAweDAwZWY6IHJldHVybigoQ0hBUikweDhiKTsKKyAgICAgIGNhc2UgMHgwMGYxOiByZXR1cm4oKENIQVIpMHhhNCk7CisgICAgICBjYXNlIDB4MDBmMjogcmV0dXJuKChDSEFSKTB4OTUpOworICAgICAgY2FzZSAweDAwZjM6IHJldHVybigoQ0hBUikweGEyKTsKKyAgICAgIGNhc2UgMHgwMGY0OiByZXR1cm4oKENIQVIpMHg5Myk7CisgICAgICBjYXNlIDB4MDBmNjogcmV0dXJuKChDSEFSKTB4OTQpOworICAgICAgY2FzZSAweDAwZjc6IHJldHVybigoQ0hBUikweGY2KTsKKyAgICAgIGNhc2UgMHgwMGY4OiByZXR1cm4oKENIQVIpMHg5Yik7CisgICAgICBjYXNlIDB4MDBmOTogcmV0dXJuKChDSEFSKTB4OTcpOworICAgICAgY2FzZSAweDAwZmE6IHJldHVybigoQ0hBUikweGEzKTsKKyAgICAgIGNhc2UgMHgwMGZiOiByZXR1cm4oKENIQVIpMHg5Nik7CisgICAgICBjYXNlIDB4MDBmYzogcmV0dXJuKChDSEFSKTB4ODEpOworICAgICAgY2FzZSAweDIxOTA6IHJldHVybigoQ0hBUikweDllKTsKKyAgICAgIGNhc2UgMHgyMTkxOiByZXR1cm4oKENIQVIpMHhjNik7CisgICAgICBjYXNlIDB4MjE5MjogcmV0dXJuKChDSEFSKTB4YWIpOworICAgICAgY2FzZSAweDIxOTM6IHJldHVybigoQ0hBUikweGM3KTsKKyAgICAgIGNhc2UgMHgyMjA2OiByZXR1cm4oKENIQVIpMHhiNik7CisgICAgICBjYXNlIDB4MjIwNzogcmV0dXJuKChDSEFSKTB4YjcpOworICAgICAgY2FzZSAweDIyMTg6IHJldHVybigoQ0hBUikweGY4KTsKKyAgICAgIGNhc2UgMHgyMjI4OiByZXR1cm4oKENIQVIpMHhlYik7CisgICAgICBjYXNlIDB4MjIyOTogcmV0dXJuKChDSEFSKTB4ZWYpOworICAgICAgY2FzZSAweDIyMmE6IHJldHVybigoQ0hBUikweGFjKTsKKyAgICAgIGNhc2UgMHgyMjM1OiByZXR1cm4oKENIQVIpMHhkMik7CisgICAgICBjYXNlIDB4MjI2MDogcmV0dXJuKChDSEFSKTB4ZjQpOworICAgICAgY2FzZSAweDIyNjE6IHJldHVybigoQ0hBUikweGNmKTsKKyAgICAgIGNhc2UgMHgyMjY0OiByZXR1cm4oKENIQVIpMHhmMyk7CisgICAgICBjYXNlIDB4MjI2NTogcmV0dXJuKChDSEFSKTB4ZjIpOworICAgICAgY2FzZSAweDIyODI6IHJldHVybigoQ0hBUikweGUyKTsKKyAgICAgIGNhc2UgMHgyMjgzOiByZXR1cm4oKENIQVIpMHhlMyk7CisgICAgICBjYXNlIDB4MjI5NjogcmV0dXJuKChDSEFSKTB4ZTkpOworICAgICAgY2FzZSAweDIyYTI6IHJldHVybigoQ0hBUikweGQ2KTsKKyAgICAgIGNhc2UgMHgyMmEzOiByZXR1cm4oKENIQVIpMHhkNyk7CisgICAgICBjYXNlIDB4MjJhNDogcmV0dXJuKChDSEFSKTB4OTgpOworICAgICAgY2FzZSAweDIyYTU6IHJldHVybigoQ0hBUikweDlkKTsKKyAgICAgIGNhc2UgMHgyMmM0OiByZXR1cm4oKENIQVIpMHhkOCk7CisgICAgICBjYXNlIDB4MjMwODogcmV0dXJuKChDSEFSKTB4YTkpOworICAgICAgY2FzZSAweDIzMGE6IHJldHVybigoQ0hBUikweGJlKTsKKyAgICAgIGNhc2UgMHgyMzM2OiByZXR1cm4oKENIQVIpMHg5Zik7CisgICAgICBjYXNlIDB4MjMzNzogcmV0dXJuKChDSEFSKTB4ZDMpOworICAgICAgY2FzZSAweDIzMzk6IHJldHVybigoQ0hBUikweDkyKTsKKyAgICAgIGNhc2UgMHgyMzNiOiByZXR1cm4oKENIQVIpMHhkNSk7CisgICAgICBjYXNlIDB4MjMzZDogcmV0dXJuKChDSEFSKTB4ZTgpOworICAgICAgY2FzZSAweDIzM2Y6IHJldHVybigoQ0hBUikweGYwKTsKKyAgICAgIGNhc2UgMHgyMzQwOiByZXR1cm4oKENIQVIpMHhmMSk7CisgICAgICBjYXNlIDB4MjM0MjogcmV0dXJuKChDSEFSKTB4ZDQpOworICAgICAgY2FzZSAweDIzNDk6IHJldHVybigoQ0hBUikweGVkKTsKKyAgICAgIGNhc2UgMHgyMzRiOiByZXR1cm4oKENIQVIpMHhmYik7CisgICAgICBjYXNlIDB4MjM0ZTogcmV0dXJuKChDSEFSKTB4YWYpOworICAgICAgY2FzZSAweDIzNTI6IHJldHVybigoQ0hBUikweGZjKTsKKyAgICAgIGNhc2UgMHgyMzU1OiByZXR1cm4oKENIQVIpMHhhZSk7CisgICAgICBjYXNlIDB4MjM1OTogcmV0dXJuKChDSEFSKTB4ZjcpOworICAgICAgY2FzZSAweDIzNWQ6IHJldHVybigoQ0hBUikweGU0KTsKKyAgICAgIGNhc2UgMHgyMzVlOiByZXR1cm4oKENIQVIpMHg5MSk7CisgICAgICBjYXNlIDB4MjM1ZjogcmV0dXJuKChDSEFSKTB4YjUpOworICAgICAgY2FzZSAweDIzNmI6IHJldHVybigoQ0hBUikweGZhKTsKKyAgICAgIGNhc2UgMHgyMzcxOiByZXR1cm4oKENIQVIpMHhlNyk7CisgICAgICBjYXNlIDB4MjM3MjogcmV0dXJuKChDSEFSKTB4ZTUpOworICAgICAgY2FzZSAweDIzNzM6IHJldHVybigoQ0hBUikweGVjKTsKKyAgICAgIGNhc2UgMHgyMzc0OiByZXR1cm4oKENIQVIpMHhlNik7CisgICAgICBjYXNlIDB4MjM3NTogcmV0dXJuKChDSEFSKTB4ZjkpOworICAgICAgY2FzZSAweDIzNzc6IHJldHVybigoQ0hBUikweGQxKTsKKyAgICAgIGNhc2UgMHgyMzc4OiByZXR1cm4oKENIQVIpMHhkMCk7CisgICAgICBjYXNlIDB4MjM3YTogcmV0dXJuKChDSEFSKTB4ZTApOworICAgICAgY2FzZSAweDI1MDA6IHJldHVybigoQ0hBUikweGM0KTsKKyAgICAgIGNhc2UgMHgyNTAyOiByZXR1cm4oKENIQVIpMHhiMyk7CisgICAgICBjYXNlIDB4MjUwYzogcmV0dXJuKChDSEFSKTB4ZGEpOworICAgICAgY2FzZSAweDI1MTA6IHJldHVybigoQ0hBUikweGJmKTsKKyAgICAgIGNhc2UgMHgyNTE0OiByZXR1cm4oKENIQVIpMHhjMCk7CisgICAgICBjYXNlIDB4MjUxODogcmV0dXJuKChDSEFSKTB4ZDkpOworICAgICAgY2FzZSAweDI1MWM6IHJldHVybigoQ0hBUikweGMzKTsKKyAgICAgIGNhc2UgMHgyNTI0OiByZXR1cm4oKENIQVIpMHhiNCk7CisgICAgICBjYXNlIDB4MjUyYzogcmV0dXJuKChDSEFSKTB4YzIpOworICAgICAgY2FzZSAweDI1MzQ6IHJldHVybigoQ0hBUikweGMxKTsKKyAgICAgIGNhc2UgMHgyNTNjOiByZXR1cm4oKENIQVIpMHhjNSk7CisgICAgICBjYXNlIDB4MjU1MDogcmV0dXJuKChDSEFSKTB4Y2QpOworICAgICAgY2FzZSAweDI1NTE6IHJldHVybigoQ0hBUikweGJhKTsKKyAgICAgIGNhc2UgMHgyNTU0OiByZXR1cm4oKENIQVIpMHhjOSk7CisgICAgICBjYXNlIDB4MjU1NzogcmV0dXJuKChDSEFSKTB4YmIpOworICAgICAgY2FzZSAweDI1NWE6IHJldHVybigoQ0hBUikweGM4KTsKKyAgICAgIGNhc2UgMHgyNTVkOiByZXR1cm4oKENIQVIpMHhiYyk7CisgICAgICBjYXNlIDB4MjU2MDogcmV0dXJuKChDSEFSKTB4Y2MpOworICAgICAgY2FzZSAweDI1NjM6IHJldHVybigoQ0hBUikweGI5KTsKKyAgICAgIGNhc2UgMHgyNTY2OiByZXR1cm4oKENIQVIpMHhjYik7CisgICAgICBjYXNlIDB4MjU2OTogcmV0dXJuKChDSEFSKTB4Y2EpOworICAgICAgY2FzZSAweDI1NmM6IHJldHVybigoQ0hBUikweGNlKTsKKyAgICAgIGNhc2UgMHgyNTgwOiByZXR1cm4oKENIQVIpMHhkZik7CisgICAgICBjYXNlIDB4MjU4NDogcmV0dXJuKChDSEFSKTB4ZGMpOworICAgICAgY2FzZSAweDI1ODg6IHJldHVybigoQ0hBUikweGRiKTsKKyAgICAgIGNhc2UgMHgyNTkxOiByZXR1cm4oKENIQVIpMHhiMCk7CisgICAgICBjYXNlIDB4MjU5MjogcmV0dXJuKChDSEFSKTB4YjEpOworICAgICAgY2FzZSAweDI1OTM6IHJldHVybigoQ0hBUikweGIyKTsKKyAgICAgIGNhc2UgMHgyNWFmOiByZXR1cm4oKENIQVIpMHg5MCk7CisgICAgICBjYXNlIDB4MjVjYjogcmV0dXJuKChDSEFSKTB4ZWEpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKHR4X3B1bmMoYykpOworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFQTC0yNzQxICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X2FwbDUoVVNIT1JUIGMpCisjZWxzZQordHhfYXBsNShjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDAwYTA6IHJldHVybigoQ0hBUikweGEwKTsKKyAgICAgIGNhc2UgMHgwMGExOiByZXR1cm4oKENIQVIpMHhhMSk7CisgICAgICBjYXNlIDB4MDBhMjogcmV0dXJuKChDSEFSKTB4YTIpOworICAgICAgY2FzZSAweDAwYTM6IHJldHVybigoQ0hBUikweGEzKTsKKyAgICAgIGNhc2UgMHgwMGE4OiByZXR1cm4oKENIQVIpMHhhOCk7CisgICAgICBjYXNlIDB4MDBhZjogcmV0dXJuKChDSEFSKTB4YWYpOworICAgICAgY2FzZSAweDAwYjY6IHJldHVybigoQ0hBUikweGI2KTsKKyAgICAgIGNhc2UgMHgwMGI3OiByZXR1cm4oKENIQVIpMHhiNyk7CisgICAgICBjYXNlIDB4MDBiZjogcmV0dXJuKChDSEFSKTB4YmYpOworICAgICAgY2FzZSAweDAwYzQ6IHJldHVybigoQ0hBUikweGM0KTsKKyAgICAgIGNhc2UgMHgwMGM1OiByZXR1cm4oKENIQVIpMHhjNSk7CisgICAgICBjYXNlIDB4MDBjNjogcmV0dXJuKChDSEFSKTB4YzYpOworICAgICAgY2FzZSAweDAwYzc6IHJldHVybigoQ0hBUikweGM3KTsKKyAgICAgIGNhc2UgMHgwMGM4OiByZXR1cm4oKENIQVIpMHhjOCk7CisgICAgICBjYXNlIDB4MDBjOTogcmV0dXJuKChDSEFSKTB4YzkpOworICAgICAgY2FzZSAweDAwY2Q6IHJldHVybigoQ0hBUikweGNkKTsKKyAgICAgIGNhc2UgMHgwMGQxOiByZXR1cm4oKENIQVIpMHhkMSk7CisgICAgICBjYXNlIDB4MDBkNjogcmV0dXJuKChDSEFSKTB4ZDYpOworICAgICAgY2FzZSAweDAwZDc6IHJldHVybigoQ0hBUikweGQ3KTsKKyAgICAgIGNhc2UgMHgwMGQ4OiByZXR1cm4oKENIQVIpMHhkOCk7CisgICAgICBjYXNlIDB4MDBkYzogcmV0dXJuKChDSEFSKTB4ZGMpOworICAgICAgY2FzZSAweDAwZGY6IHJldHVybigoQ0hBUikweGRmKTsKKyAgICAgIGNhc2UgMHgwMGUwOiByZXR1cm4oKENIQVIpMHhlMCk7CisgICAgICBjYXNlIDB4MDBlMTogcmV0dXJuKChDSEFSKTB4ZTEpOworICAgICAgY2FzZSAweDAwZTI6IHJldHVybigoQ0hBUikweGUyKTsKKyAgICAgIGNhc2UgMHgwMGUzOiByZXR1cm4oKENIQVIpMHhlMyk7CisgICAgICBjYXNlIDB4MDBlNDogcmV0dXJuKChDSEFSKTB4ZTQpOworICAgICAgY2FzZSAweDAwZTU6IHJldHVybigoQ0hBUikweGU1KTsKKyAgICAgIGNhc2UgMHgwMGU2OiByZXR1cm4oKENIQVIpMHhlNik7CisgICAgICBjYXNlIDB4MDBlNzogcmV0dXJuKChDSEFSKTB4ZTcpOworICAgICAgY2FzZSAweDAwZTg6IHJldHVybigoQ0hBUikweGU4KTsKKyAgICAgIGNhc2UgMHgwMGU5OiByZXR1cm4oKENIQVIpMHhlOSk7CisgICAgICBjYXNlIDB4MDBlYTogcmV0dXJuKChDSEFSKTB4ZWEpOworICAgICAgY2FzZSAweDAwZWI6IHJldHVybigoQ0hBUikweGViKTsKKyAgICAgIGNhc2UgMHgwMGVjOiByZXR1cm4oKENIQVIpMHhlYyk7CisgICAgICBjYXNlIDB4MDBlZDogcmV0dXJuKChDSEFSKTB4ZWQpOworICAgICAgY2FzZSAweDAwZWU6IHJldHVybigoQ0hBUikweGVlKTsKKyAgICAgIGNhc2UgMHgwMGVmOiByZXR1cm4oKENIQVIpMHhlZik7CisgICAgICBjYXNlIDB4MDBmMTogcmV0dXJuKChDSEFSKTB4ZjEpOworICAgICAgY2FzZSAweDAwZjI6IHJldHVybigoQ0hBUikweGYyKTsKKyAgICAgIGNhc2UgMHgwMGYzOiByZXR1cm4oKENIQVIpMHhmMyk7CisgICAgICBjYXNlIDB4MDBmNDogcmV0dXJuKChDSEFSKTB4ZjQpOworICAgICAgY2FzZSAweDAwZjU6IHJldHVybigoQ0hBUikweGY1KTsKKyAgICAgIGNhc2UgMHgwMGY2OiByZXR1cm4oKENIQVIpMHhmNik7CisgICAgICBjYXNlIDB4MDBmNzogcmV0dXJuKChDSEFSKTB4ZjcpOworICAgICAgY2FzZSAweDAwZjk6IHJldHVybigoQ0hBUikweGY5KTsKKyAgICAgIGNhc2UgMHgwMGZhOiByZXR1cm4oKENIQVIpMHhmYSk7CisgICAgICBjYXNlIDB4MDBmYjogcmV0dXJuKChDSEFSKTB4ZmIpOworICAgICAgY2FzZSAweDAwZmM6IHJldHVybigoQ0hBUikweGZjKTsKKyAgICAgIGNhc2UgMHgyMGFjOiByZXR1cm4oKENIQVIpMHg4MCk7CisgICAgICBjYXNlIDB4MjE5MDogcmV0dXJuKChDSEFSKTB4ODQpOworICAgICAgY2FzZSAweDIxOTE6IHJldHVybigoQ0hBUikweDg2KTsKKyAgICAgIGNhc2UgMHgyMTkyOiByZXR1cm4oKENIQVIpMHg4NSk7CisgICAgICBjYXNlIDB4MjE5MzogcmV0dXJuKChDSEFSKTB4ODcpOworICAgICAgY2FzZSAweDIyMDU6IHJldHVybigoQ0hBUikweGY4KTsKKyAgICAgIGNhc2UgMHgyMjA2OiByZXR1cm4oKENIQVIpMHg5MSk7CisgICAgICBjYXNlIDB4MjIwNzogcmV0dXJuKChDSEFSKTB4OTIpOworICAgICAgY2FzZSAweDIyMGE6IHJldHVybigoQ0hBUikweGI5KTsKKyAgICAgIGNhc2UgMHgyMjE4OiByZXR1cm4oKENIQVIpMHhiMCk7CisgICAgICBjYXNlIDB4MjIyODogcmV0dXJuKChDSEFSKTB4OWYpOworICAgICAgY2FzZSAweDIyMjk6IHJldHVybigoQ0hBUikweDlkKTsKKyAgICAgIGNhc2UgMHgyMjJhOiByZXR1cm4oKENIQVIpMHg5ZSk7CisgICAgICBjYXNlIDB4MjIzNTogcmV0dXJuKChDSEFSKTB4ZmQpOworICAgICAgY2FzZSAweDIyNjA6IHJldHVybigoQ0hBUikweGFjKTsKKyAgICAgIGNhc2UgMHgyMjYxOiByZXR1cm4oKENIQVIpMHhhNik7CisgICAgICBjYXNlIDB4MjI2MjogcmV0dXJuKChDSEFSKTB4YmIpOworICAgICAgY2FzZSAweDIyNjQ6IHJldHVybigoQ0hBUikweDg4KTsKKyAgICAgIGNhc2UgMHgyMjY1OiByZXR1cm4oKENIQVIpMHg4OSk7CisgICAgICBjYXNlIDB4MjI4MjogcmV0dXJuKChDSEFSKTB4OWIpOworICAgICAgY2FzZSAweDIyODM6IHJldHVybigoQ0hBUikweDljKTsKKyAgICAgIGNhc2UgMHgyMjk2OiByZXR1cm4oKENIQVIpMHhiNCk7CisgICAgICBjYXNlIDB4MjJhMjogcmV0dXJuKChDSEFSKTB4YTQpOworICAgICAgY2FzZSAweDIyYTM6IHJldHVybigoQ0hBUikweDgxKTsKKyAgICAgIGNhc2UgMHgyMmE0OiByZXR1cm4oKENIQVIpMHg4Mik7CisgICAgICBjYXNlIDB4MjJhNTogcmV0dXJuKChDSEFSKTB4ODMpOworICAgICAgY2FzZSAweDIyYzQ6IHJldHVybigoQ0hBUikweGFhKTsKKyAgICAgIGNhc2UgMHgyMzA4OiByZXR1cm4oKENIQVIpMHg5Nyk7CisgICAgICBjYXNlIDB4MjMwYTogcmV0dXJuKChDSEFSKTB4OTgpOworICAgICAgY2FzZSAweDIzMzY6IHJldHVybigoQ0hBUikweGE3KTsKKyAgICAgIGNhc2UgMHgyMzM3OiByZXR1cm4oKENIQVIpMHhkZSk7CisgICAgICBjYXNlIDB4MjMzOTogcmV0dXJuKChDSEFSKTB4OGUpOworICAgICAgY2FzZSAweDIzM2I6IHJldHVybigoQ0hBUikweGNiKTsKKyAgICAgIGNhc2UgMHgyMzNkOiByZXR1cm4oKENIQVIpMHhiMik7CisgICAgICBjYXNlIDB4MjMzZjogcmV0dXJuKChDSEFSKTB4OWEpOworICAgICAgY2FzZSAweDIzNDA6IHJldHVybigoQ0hBUikweDk5KTsKKyAgICAgIGNhc2UgMHgyMzQyOiByZXR1cm4oKENIQVIpMHhjYSk7CisgICAgICBjYXNlIDB4MjM0NzogcmV0dXJuKChDSEFSKTB4ZDQpOworICAgICAgY2FzZSAweDIzNDg6IHJldHVybigoQ0hBUikweGQ1KTsKKyAgICAgIGNhc2UgMHgyMzQ5OiByZXR1cm4oKENIQVIpMHhiMyk7CisgICAgICBjYXNlIDB4MjM0YjogcmV0dXJuKChDSEFSKTB4OTMpOworICAgICAgY2FzZSAweDIzNGU6IHJldHVybigoQ0hBUikweDk2KTsKKyAgICAgIGNhc2UgMHgyMzUwOiByZXR1cm4oKENIQVIpMHhkMik7CisgICAgICBjYXNlIDB4MjM1MjogcmV0dXJuKChDSEFSKTB4OTQpOworICAgICAgY2FzZSAweDIzNTU6IHJldHVybigoQ0hBUikweDk1KTsKKyAgICAgIGNhc2UgMHgyMzU3OiByZXR1cm4oKENIQVIpMHhkMyk7CisgICAgICBjYXNlIDB4MjM1OTogcmV0dXJuKChDSEFSKTB4OGYpOworICAgICAgY2FzZSAweDIzNWQ6IHJldHVybigoQ0hBUikweGE5KTsKKyAgICAgIGNhc2UgMHgyMzVlOiByZXR1cm4oKENIQVIpMHg4ZCk7CisgICAgICBjYXNlIDB4MjM1ZjogcmV0dXJuKChDSEFSKTB4YjUpOworICAgICAgY2FzZSAweDIzNjQ6IHJldHVybigoQ0hBUikweGYwKTsKKyAgICAgIGNhc2UgMHgyMzY1OiByZXR1cm4oKENIQVIpMHhmZik7CisgICAgICBjYXNlIDB4MjM2ODogcmV0dXJuKChDSEFSKTB4ZmUpOworICAgICAgY2FzZSAweDIzNmE6IHJldHVybigoQ0hBUikweGFlKTsKKyAgICAgIGNhc2UgMHgyMzZiOiByZXR1cm4oKENIQVIpMHg5MCk7CisgICAgICBjYXNlIDB4MjM2YzogcmV0dXJuKChDSEFSKTB4YWIpOworICAgICAgY2FzZSAweDIzNzE6IHJldHVybigoQ0hBUikweDhiKTsKKyAgICAgIGNhc2UgMHgyMzcyOiByZXR1cm4oKENIQVIpMHg4YSk7CisgICAgICBjYXNlIDB4MjM3MzogcmV0dXJuKChDSEFSKTB4YmMpOworICAgICAgY2FzZSAweDIzNzQ6IHJldHVybigoQ0hBUikweGJkKTsKKyAgICAgIGNhc2UgMHgyMzc1OiByZXR1cm4oKENIQVIpMHhiZSk7CisgICAgICBjYXNlIDB4MjM3NzogcmV0dXJuKChDSEFSKTB4YmEpOworICAgICAgY2FzZSAweDIzNzg6IHJldHVybigoQ0hBUikweGE1KTsKKyAgICAgIGNhc2UgMHgyMzdhOiByZXR1cm4oKENIQVIpMHhiOCk7CisgICAgICBjYXNlIDB4MjUwMDogcmV0dXJuKChDSEFSKTB4Y2UpOworICAgICAgY2FzZSAweDI1MDI6IHJldHVybigoQ0hBUikweGRiKTsKKyAgICAgIGNhc2UgMHgyNTBjOiByZXR1cm4oKENIQVIpMHhkYSk7CisgICAgICBjYXNlIDB4MjUxMDogcmV0dXJuKChDSEFSKTB4Y2MpOworICAgICAgY2FzZSAweDI1MTQ6IHJldHVybigoQ0hBUikweGMwKTsKKyAgICAgIGNhc2UgMHgyNTE4OiByZXR1cm4oKENIQVIpMHhkOSk7CisgICAgICBjYXNlIDB4MjUxYzogcmV0dXJuKChDSEFSKTB4YzMpOworICAgICAgY2FzZSAweDI1MjQ6IHJldHVybigoQ0hBUikweGRkKTsKKyAgICAgIGNhc2UgMHgyNTJjOiByZXR1cm4oKENIQVIpMHhjMik7CisgICAgICBjYXNlIDB4MjUzNDogcmV0dXJuKChDSEFSKTB4YzEpOworICAgICAgY2FzZSAweDI1M2M6IHJldHVybigoQ0hBUikweGNmKTsKKyAgICAgIGNhc2UgMHgyNWFmOiByZXR1cm4oKENIQVIpMHg4Yyk7CisgICAgICBjYXNlIDB4MjVjYjogcmV0dXJuKChDSEFSKTB4YjEpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKHR4X3B1bmMoYykpOworICAgIH0KK30KKworLyogRm9yIExhdGluLTEsIHVzZSB0eF9pZGVudCgpICovCisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMYXRpbi0yICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4Xzg4NTlfMihVU0hPUlQgYykKKyNlbHNlCit0eF84ODU5XzIoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4YTApCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHgwMEEwOiByZXR1cm4oKENIQVIpMTYwKTsKKyAgICAgIGNhc2UgMHgwMEE0OiByZXR1cm4oKENIQVIpMTY0KTsKKyAgICAgIGNhc2UgMHgwMEE3OiByZXR1cm4oKENIQVIpMTY3KTsKKyAgICAgIGNhc2UgMHgwMEE4OiByZXR1cm4oKENIQVIpMTY4KTsKKyAgICAgIGNhc2UgMHgwMEFEOiByZXR1cm4oKENIQVIpMTczKTsKKyAgICAgIGNhc2UgMHgwMEIwOiByZXR1cm4oKENIQVIpMTc2KTsKKyAgICAgIGNhc2UgMHgwMEI0OiByZXR1cm4oKENIQVIpMTgwKTsKKyAgICAgIGNhc2UgMHgwMEI4OiByZXR1cm4oKENIQVIpMTg0KTsKKyAgICAgIGNhc2UgMHgwMEMxOiByZXR1cm4oKENIQVIpMTkzKTsKKyAgICAgIGNhc2UgMHgwMEMyOiByZXR1cm4oKENIQVIpMTk0KTsKKyAgICAgIGNhc2UgMHgwMEM0OiByZXR1cm4oKENIQVIpMTk2KTsKKyAgICAgIGNhc2UgMHgwMEM3OiByZXR1cm4oKENIQVIpMTk5KTsKKyAgICAgIGNhc2UgMHgwMEM5OiByZXR1cm4oKENIQVIpMjAxKTsKKyAgICAgIGNhc2UgMHgwMENCOiByZXR1cm4oKENIQVIpMjAzKTsKKyAgICAgIGNhc2UgMHgwMENEOiByZXR1cm4oKENIQVIpMjA1KTsKKyAgICAgIGNhc2UgMHgwMENFOiByZXR1cm4oKENIQVIpMjA2KTsKKyAgICAgIGNhc2UgMHgwMEQzOiByZXR1cm4oKENIQVIpMjExKTsKKyAgICAgIGNhc2UgMHgwMEQ0OiByZXR1cm4oKENIQVIpMjEyKTsKKyAgICAgIGNhc2UgMHgwMEQ2OiByZXR1cm4oKENIQVIpMjE0KTsKKyAgICAgIGNhc2UgMHgwMEQ3OiByZXR1cm4oKENIQVIpMjE1KTsKKyAgICAgIGNhc2UgMHgwMERBOiByZXR1cm4oKENIQVIpMjE4KTsKKyAgICAgIGNhc2UgMHgwMERDOiByZXR1cm4oKENIQVIpMjIwKTsKKyAgICAgIGNhc2UgMHgwMEREOiByZXR1cm4oKENIQVIpMjIxKTsKKyAgICAgIGNhc2UgMHgwMERGOiByZXR1cm4oKENIQVIpMjIzKTsKKyAgICAgIGNhc2UgMHgwMEUxOiByZXR1cm4oKENIQVIpMjI1KTsKKyAgICAgIGNhc2UgMHgwMEUyOiByZXR1cm4oKENIQVIpMjI2KTsKKyAgICAgIGNhc2UgMHgwMEU0OiByZXR1cm4oKENIQVIpMjI4KTsKKyAgICAgIGNhc2UgMHgwMEU3OiByZXR1cm4oKENIQVIpMjMxKTsKKyAgICAgIGNhc2UgMHgwMEU5OiByZXR1cm4oKENIQVIpMjMzKTsKKyAgICAgIGNhc2UgMHgwMEVCOiByZXR1cm4oKENIQVIpMjM1KTsKKyAgICAgIGNhc2UgMHgwMEVEOiByZXR1cm4oKENIQVIpMjM3KTsKKyAgICAgIGNhc2UgMHgwMEVFOiByZXR1cm4oKENIQVIpMjM4KTsKKyAgICAgIGNhc2UgMHgwMEYzOiByZXR1cm4oKENIQVIpMjQzKTsKKyAgICAgIGNhc2UgMHgwMEY0OiByZXR1cm4oKENIQVIpMjQ0KTsKKyAgICAgIGNhc2UgMHgwMEY2OiByZXR1cm4oKENIQVIpMjQ2KTsKKyAgICAgIGNhc2UgMHgwMEY3OiByZXR1cm4oKENIQVIpMjQ3KTsKKyAgICAgIGNhc2UgMHgwMEZBOiByZXR1cm4oKENIQVIpMjUwKTsKKyAgICAgIGNhc2UgMHgwMEZDOiByZXR1cm4oKENIQVIpMjUyKTsKKyAgICAgIGNhc2UgMHgwMEZEOiByZXR1cm4oKENIQVIpMjUzKTsKKyAgICAgIGNhc2UgMHgwMTAyOiByZXR1cm4oKENIQVIpMTk1KTsKKyAgICAgIGNhc2UgMHgwMTAzOiByZXR1cm4oKENIQVIpMjI3KTsKKyAgICAgIGNhc2UgMHgwMTA0OiByZXR1cm4oKENIQVIpMTYxKTsKKyAgICAgIGNhc2UgMHgwMTA1OiByZXR1cm4oKENIQVIpMTc3KTsKKyAgICAgIGNhc2UgMHgwMTA2OiByZXR1cm4oKENIQVIpMTk4KTsKKyAgICAgIGNhc2UgMHgwMTA3OiByZXR1cm4oKENIQVIpMjMwKTsKKyAgICAgIGNhc2UgMHgwMTBDOiByZXR1cm4oKENIQVIpMjAwKTsKKyAgICAgIGNhc2UgMHgwMTBEOiByZXR1cm4oKENIQVIpMjMyKTsKKyAgICAgIGNhc2UgMHgwMTBFOiByZXR1cm4oKENIQVIpMjA3KTsKKyAgICAgIGNhc2UgMHgwMTBGOiByZXR1cm4oKENIQVIpMjM5KTsKKyAgICAgIGNhc2UgMHgwMTEwOiByZXR1cm4oKENIQVIpMjA4KTsKKyAgICAgIGNhc2UgMHgwMTExOiByZXR1cm4oKENIQVIpMjQwKTsKKyAgICAgIGNhc2UgMHgwMTE4OiByZXR1cm4oKENIQVIpMjAyKTsKKyAgICAgIGNhc2UgMHgwMTE5OiByZXR1cm4oKENIQVIpMjM0KTsKKyAgICAgIGNhc2UgMHgwMTFBOiByZXR1cm4oKENIQVIpMjA0KTsKKyAgICAgIGNhc2UgMHgwMTFCOiByZXR1cm4oKENIQVIpMjM2KTsKKyAgICAgIGNhc2UgMHgwMTM5OiByZXR1cm4oKENIQVIpMTk3KTsKKyAgICAgIGNhc2UgMHgwMTNBOiByZXR1cm4oKENIQVIpMjI5KTsKKyAgICAgIGNhc2UgMHgwMTNEOiByZXR1cm4oKENIQVIpMTY1KTsKKyAgICAgIGNhc2UgMHgwMTNFOiByZXR1cm4oKENIQVIpMTgxKTsKKyAgICAgIGNhc2UgMHgwMTQxOiByZXR1cm4oKENIQVIpMTYzKTsKKyAgICAgIGNhc2UgMHgwMTQyOiByZXR1cm4oKENIQVIpMTc5KTsKKyAgICAgIGNhc2UgMHgwMTQzOiByZXR1cm4oKENIQVIpMjA5KTsKKyAgICAgIGNhc2UgMHgwMTQ0OiByZXR1cm4oKENIQVIpMjQxKTsKKyAgICAgIGNhc2UgMHgwMTQ3OiByZXR1cm4oKENIQVIpMjEwKTsKKyAgICAgIGNhc2UgMHgwMTQ4OiByZXR1cm4oKENIQVIpMjQyKTsKKyAgICAgIGNhc2UgMHgwMTUwOiByZXR1cm4oKENIQVIpMjEzKTsKKyAgICAgIGNhc2UgMHgwMTUxOiByZXR1cm4oKENIQVIpMjQ1KTsKKyAgICAgIGNhc2UgMHgwMTU0OiByZXR1cm4oKENIQVIpMTkyKTsKKyAgICAgIGNhc2UgMHgwMTU1OiByZXR1cm4oKENIQVIpMjI0KTsKKyAgICAgIGNhc2UgMHgwMTU4OiByZXR1cm4oKENIQVIpMjE2KTsKKyAgICAgIGNhc2UgMHgwMTU5OiByZXR1cm4oKENIQVIpMjQ4KTsKKyAgICAgIGNhc2UgMHgwMTVBOiByZXR1cm4oKENIQVIpMTY2KTsKKyAgICAgIGNhc2UgMHgwMTVCOiByZXR1cm4oKENIQVIpMTgyKTsKKyAgICAgIGNhc2UgMHgwMTVFOiByZXR1cm4oKENIQVIpMTcwKTsKKyAgICAgIGNhc2UgMHgwMTVGOiByZXR1cm4oKENIQVIpMTg2KTsKKyAgICAgIGNhc2UgMHgwMTYwOiByZXR1cm4oKENIQVIpMTY5KTsKKyAgICAgIGNhc2UgMHgwMTYxOiByZXR1cm4oKENIQVIpMTg1KTsKKyAgICAgIGNhc2UgMHgwMTYyOiByZXR1cm4oKENIQVIpMjIyKTsKKyAgICAgIGNhc2UgMHgwMTYzOiByZXR1cm4oKENIQVIpMjU0KTsKKyAgICAgIGNhc2UgMHgwMTY0OiByZXR1cm4oKENIQVIpMTcxKTsKKyAgICAgIGNhc2UgMHgwMTY1OiByZXR1cm4oKENIQVIpMTg3KTsKKyAgICAgIGNhc2UgMHgwMTZFOiByZXR1cm4oKENIQVIpMjE3KTsKKyAgICAgIGNhc2UgMHgwMTZGOiByZXR1cm4oKENIQVIpMjQ5KTsKKyAgICAgIGNhc2UgMHgwMTcwOiByZXR1cm4oKENIQVIpMjE5KTsKKyAgICAgIGNhc2UgMHgwMTcxOiByZXR1cm4oKENIQVIpMjUxKTsKKyAgICAgIGNhc2UgMHgwMTc5OiByZXR1cm4oKENIQVIpMTcyKTsKKyAgICAgIGNhc2UgMHgwMTdBOiByZXR1cm4oKENIQVIpMTg4KTsKKyAgICAgIGNhc2UgMHgwMTdCOiByZXR1cm4oKENIQVIpMTc1KTsKKyAgICAgIGNhc2UgMHgwMTdDOiByZXR1cm4oKENIQVIpMTkxKTsKKyAgICAgIGNhc2UgMHgwMTdEOiByZXR1cm4oKENIQVIpMTc0KTsKKyAgICAgIGNhc2UgMHgwMTdFOiByZXR1cm4oKENIQVIpMTkwKTsKKyAgICAgIGNhc2UgMHgwMkM3OiByZXR1cm4oKENIQVIpMTgzKTsKKyAgICAgIGNhc2UgMHgwMkQ4OiByZXR1cm4oKENIQVIpMTYyKTsKKyAgICAgIGNhc2UgMHgwMkQ5OiByZXR1cm4oKENIQVIpMjU1KTsKKyAgICAgIGNhc2UgMHgwMkRCOiByZXR1cm4oKENIQVIpMTc4KTsKKyAgICAgIGNhc2UgMHgwMkREOiByZXR1cm4oKENIQVIpMTg5KTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9wdW5jKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMYXRpbi0zICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4Xzg4NTlfMyhVU0hPUlQgYykKKyNlbHNlCit0eF84ODU5XzMoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4YTApCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHgwMEEwOiByZXR1cm4oKENIQVIpMTYwKTsKKyAgICAgIGNhc2UgMHgwMEEzOiByZXR1cm4oKENIQVIpMTYzKTsKKyAgICAgIGNhc2UgMHgwMEE0OiByZXR1cm4oKENIQVIpMTY0KTsKKyAgICAgIGNhc2UgMHgwMEE3OiByZXR1cm4oKENIQVIpMTY3KTsKKyAgICAgIGNhc2UgMHgwMEE4OiByZXR1cm4oKENIQVIpMTY4KTsKKyAgICAgIGNhc2UgMHgwMEFEOiByZXR1cm4oKENIQVIpMTczKTsKKyAgICAgIGNhc2UgMHgwMEIwOiByZXR1cm4oKENIQVIpMTc2KTsKKyAgICAgIGNhc2UgMHgwMEIyOiByZXR1cm4oKENIQVIpMTc4KTsKKyAgICAgIGNhc2UgMHgwMEIzOiByZXR1cm4oKENIQVIpMTc5KTsKKyAgICAgIGNhc2UgMHgwMEI0OiByZXR1cm4oKENIQVIpMTgwKTsKKyAgICAgIGNhc2UgMHgwMEI1OiByZXR1cm4oKENIQVIpMTgxKTsKKyAgICAgIGNhc2UgMHgwMEI3OiByZXR1cm4oKENIQVIpMTgzKTsKKyAgICAgIGNhc2UgMHgwMEI4OiByZXR1cm4oKENIQVIpMTg0KTsKKyAgICAgIGNhc2UgMHgwMEJEOiByZXR1cm4oKENIQVIpMTg5KTsKKyAgICAgIGNhc2UgMHgwMEMwOiByZXR1cm4oKENIQVIpMTkyKTsKKyAgICAgIGNhc2UgMHgwMEMxOiByZXR1cm4oKENIQVIpMTkzKTsKKyAgICAgIGNhc2UgMHgwMEMyOiByZXR1cm4oKENIQVIpMTk0KTsKKyAgICAgIGNhc2UgMHgwMEM0OiByZXR1cm4oKENIQVIpMTk2KTsKKyAgICAgIGNhc2UgMHgwMEM3OiByZXR1cm4oKENIQVIpMTk5KTsKKyAgICAgIGNhc2UgMHgwMEM4OiByZXR1cm4oKENIQVIpMjAwKTsKKyAgICAgIGNhc2UgMHgwMEM5OiByZXR1cm4oKENIQVIpMjAxKTsKKyAgICAgIGNhc2UgMHgwMENBOiByZXR1cm4oKENIQVIpMjAyKTsKKyAgICAgIGNhc2UgMHgwMENCOiByZXR1cm4oKENIQVIpMjAzKTsKKyAgICAgIGNhc2UgMHgwMENDOiByZXR1cm4oKENIQVIpMjA0KTsKKyAgICAgIGNhc2UgMHgwMENEOiByZXR1cm4oKENIQVIpMjA1KTsKKyAgICAgIGNhc2UgMHgwMENFOiByZXR1cm4oKENIQVIpMjA2KTsKKyAgICAgIGNhc2UgMHgwMENGOiByZXR1cm4oKENIQVIpMjA3KTsKKyAgICAgIGNhc2UgMHgwMEQxOiByZXR1cm4oKENIQVIpMjA5KTsKKyAgICAgIGNhc2UgMHgwMEQyOiByZXR1cm4oKENIQVIpMjEwKTsKKyAgICAgIGNhc2UgMHgwMEQzOiByZXR1cm4oKENIQVIpMjExKTsKKyAgICAgIGNhc2UgMHgwMEQ0OiByZXR1cm4oKENIQVIpMjEyKTsKKyAgICAgIGNhc2UgMHgwMEQ2OiByZXR1cm4oKENIQVIpMjE0KTsKKyAgICAgIGNhc2UgMHgwMEQ3OiByZXR1cm4oKENIQVIpMjE1KTsKKyAgICAgIGNhc2UgMHgwMEQ5OiByZXR1cm4oKENIQVIpMjE3KTsKKyAgICAgIGNhc2UgMHgwMERBOiByZXR1cm4oKENIQVIpMjE4KTsKKyAgICAgIGNhc2UgMHgwMERCOiByZXR1cm4oKENIQVIpMjE5KTsKKyAgICAgIGNhc2UgMHgwMERDOiByZXR1cm4oKENIQVIpMjIwKTsKKyAgICAgIGNhc2UgMHgwMERGOiByZXR1cm4oKENIQVIpMjIzKTsKKyAgICAgIGNhc2UgMHgwMEUwOiByZXR1cm4oKENIQVIpMjI0KTsKKyAgICAgIGNhc2UgMHgwMEUxOiByZXR1cm4oKENIQVIpMjI1KTsKKyAgICAgIGNhc2UgMHgwMEUyOiByZXR1cm4oKENIQVIpMjI2KTsKKyAgICAgIGNhc2UgMHgwMEU0OiByZXR1cm4oKENIQVIpMjI4KTsKKyAgICAgIGNhc2UgMHgwMEU3OiByZXR1cm4oKENIQVIpMjMxKTsKKyAgICAgIGNhc2UgMHgwMEU4OiByZXR1cm4oKENIQVIpMjMyKTsKKyAgICAgIGNhc2UgMHgwMEU5OiByZXR1cm4oKENIQVIpMjMzKTsKKyAgICAgIGNhc2UgMHgwMEVBOiByZXR1cm4oKENIQVIpMjM0KTsKKyAgICAgIGNhc2UgMHgwMEVCOiByZXR1cm4oKENIQVIpMjM1KTsKKyAgICAgIGNhc2UgMHgwMEVDOiByZXR1cm4oKENIQVIpMjM2KTsKKyAgICAgIGNhc2UgMHgwMEVEOiByZXR1cm4oKENIQVIpMjM3KTsKKyAgICAgIGNhc2UgMHgwMEVFOiByZXR1cm4oKENIQVIpMjM4KTsKKyAgICAgIGNhc2UgMHgwMEVGOiByZXR1cm4oKENIQVIpMjM5KTsKKyAgICAgIGNhc2UgMHgwMEYxOiByZXR1cm4oKENIQVIpMjQxKTsKKyAgICAgIGNhc2UgMHgwMEYyOiByZXR1cm4oKENIQVIpMjQyKTsKKyAgICAgIGNhc2UgMHgwMEYzOiByZXR1cm4oKENIQVIpMjQzKTsKKyAgICAgIGNhc2UgMHgwMEY0OiByZXR1cm4oKENIQVIpMjQ0KTsKKyAgICAgIGNhc2UgMHgwMEY2OiByZXR1cm4oKENIQVIpMjQ2KTsKKyAgICAgIGNhc2UgMHgwMEY3OiByZXR1cm4oKENIQVIpMjQ3KTsKKyAgICAgIGNhc2UgMHgwMEY5OiByZXR1cm4oKENIQVIpMjQ5KTsKKyAgICAgIGNhc2UgMHgwMEZBOiByZXR1cm4oKENIQVIpMjUwKTsKKyAgICAgIGNhc2UgMHgwMEZCOiByZXR1cm4oKENIQVIpMjUxKTsKKyAgICAgIGNhc2UgMHgwMEZDOiByZXR1cm4oKENIQVIpMjUyKTsKKyAgICAgIGNhc2UgMHgwMTA4OiByZXR1cm4oKENIQVIpMTk4KTsKKyAgICAgIGNhc2UgMHgwMTA5OiByZXR1cm4oKENIQVIpMjMwKTsKKyAgICAgIGNhc2UgMHgwMTBBOiByZXR1cm4oKENIQVIpMTk3KTsKKyAgICAgIGNhc2UgMHgwMTBCOiByZXR1cm4oKENIQVIpMjI5KTsKKyAgICAgIGNhc2UgMHgwMTFDOiByZXR1cm4oKENIQVIpMjE2KTsKKyAgICAgIGNhc2UgMHgwMTFEOiByZXR1cm4oKENIQVIpMjQ4KTsKKyAgICAgIGNhc2UgMHgwMTFFOiByZXR1cm4oKENIQVIpMTcxKTsKKyAgICAgIGNhc2UgMHgwMTFGOiByZXR1cm4oKENIQVIpMTg3KTsKKyAgICAgIGNhc2UgMHgwMTIwOiByZXR1cm4oKENIQVIpMjEzKTsKKyAgICAgIGNhc2UgMHgwMTIxOiByZXR1cm4oKENIQVIpMjQ1KTsKKyAgICAgIGNhc2UgMHgwMTI0OiByZXR1cm4oKENIQVIpMTY2KTsKKyAgICAgIGNhc2UgMHgwMTI1OiByZXR1cm4oKENIQVIpMTgyKTsKKyAgICAgIGNhc2UgMHgwMTI2OiByZXR1cm4oKENIQVIpMTYxKTsKKyAgICAgIGNhc2UgMHgwMTI3OiByZXR1cm4oKENIQVIpMTc3KTsKKyAgICAgIGNhc2UgMHgwMTMwOiByZXR1cm4oKENIQVIpMTY5KTsKKyAgICAgIGNhc2UgMHgwMTMxOiByZXR1cm4oKENIQVIpMTg1KTsKKyAgICAgIGNhc2UgMHgwMTM0OiByZXR1cm4oKENIQVIpMTcyKTsKKyAgICAgIGNhc2UgMHgwMTM1OiByZXR1cm4oKENIQVIpMTg4KTsKKyAgICAgIGNhc2UgMHgwMTVDOiByZXR1cm4oKENIQVIpMjIyKTsKKyAgICAgIGNhc2UgMHgwMTVEOiByZXR1cm4oKENIQVIpMjU0KTsKKyAgICAgIGNhc2UgMHgwMTVFOiByZXR1cm4oKENIQVIpMTcwKTsKKyAgICAgIGNhc2UgMHgwMTVGOiByZXR1cm4oKENIQVIpMTg2KTsKKyAgICAgIGNhc2UgMHgwMTZDOiByZXR1cm4oKENIQVIpMjIxKTsKKyAgICAgIGNhc2UgMHgwMTZEOiByZXR1cm4oKENIQVIpMjUzKTsKKyAgICAgIGNhc2UgMHgwMTdCOiByZXR1cm4oKENIQVIpMTc1KTsKKyAgICAgIGNhc2UgMHgwMTdDOiByZXR1cm4oKENIQVIpMTkxKTsKKyAgICAgIGNhc2UgMHgwMkQ4OiByZXR1cm4oKENIQVIpMTYyKTsKKyAgICAgIGNhc2UgMHgwMkQ5OiByZXR1cm4oKENIQVIpMjU1KTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9wdW5jKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMYXRpbi00ICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4Xzg4NTlfNChVU0hPUlQgYykKKyNlbHNlCit0eF84ODU5XzQoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4YTApCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHgwMEEwOiByZXR1cm4oKENIQVIpMTYwKTsKKyAgICAgIGNhc2UgMHgwMEE0OiByZXR1cm4oKENIQVIpMTY0KTsKKyAgICAgIGNhc2UgMHgwMEE3OiByZXR1cm4oKENIQVIpMTY3KTsKKyAgICAgIGNhc2UgMHgwMEE4OiByZXR1cm4oKENIQVIpMTY4KTsKKyAgICAgIGNhc2UgMHgwMEFEOiByZXR1cm4oKENIQVIpMTczKTsKKyAgICAgIGNhc2UgMHgwMEFGOiByZXR1cm4oKENIQVIpMTc1KTsKKyAgICAgIGNhc2UgMHgwMEIwOiByZXR1cm4oKENIQVIpMTc2KTsKKyAgICAgIGNhc2UgMHgwMEI0OiByZXR1cm4oKENIQVIpMTgwKTsKKyAgICAgIGNhc2UgMHgwMEI4OiByZXR1cm4oKENIQVIpMTg0KTsKKyAgICAgIGNhc2UgMHgwMEMxOiByZXR1cm4oKENIQVIpMTkzKTsKKyAgICAgIGNhc2UgMHgwMEMyOiByZXR1cm4oKENIQVIpMTk0KTsKKyAgICAgIGNhc2UgMHgwMEMzOiByZXR1cm4oKENIQVIpMTk1KTsKKyAgICAgIGNhc2UgMHgwMEM0OiByZXR1cm4oKENIQVIpMTk2KTsKKyAgICAgIGNhc2UgMHgwMEM1OiByZXR1cm4oKENIQVIpMTk3KTsKKyAgICAgIGNhc2UgMHgwMEM2OiByZXR1cm4oKENIQVIpMTk4KTsKKyAgICAgIGNhc2UgMHgwMEM5OiByZXR1cm4oKENIQVIpMjAxKTsKKyAgICAgIGNhc2UgMHgwMENCOiByZXR1cm4oKENIQVIpMjAzKTsKKyAgICAgIGNhc2UgMHgwMENEOiByZXR1cm4oKENIQVIpMjA1KTsKKyAgICAgIGNhc2UgMHgwMENFOiByZXR1cm4oKENIQVIpMjA2KTsKKyAgICAgIGNhc2UgMHgwMEQ0OiByZXR1cm4oKENIQVIpMjEyKTsKKyAgICAgIGNhc2UgMHgwMEQ1OiByZXR1cm4oKENIQVIpMjEzKTsKKyAgICAgIGNhc2UgMHgwMEQ2OiByZXR1cm4oKENIQVIpMjE0KTsKKyAgICAgIGNhc2UgMHgwMEQ3OiByZXR1cm4oKENIQVIpMjE1KTsKKyAgICAgIGNhc2UgMHgwMEQ4OiByZXR1cm4oKENIQVIpMjE2KTsKKyAgICAgIGNhc2UgMHgwMERBOiByZXR1cm4oKENIQVIpMjE4KTsKKyAgICAgIGNhc2UgMHgwMERCOiByZXR1cm4oKENIQVIpMjE5KTsKKyAgICAgIGNhc2UgMHgwMERDOiByZXR1cm4oKENIQVIpMjIwKTsKKyAgICAgIGNhc2UgMHgwMERGOiByZXR1cm4oKENIQVIpMjIzKTsKKyAgICAgIGNhc2UgMHgwMEUxOiByZXR1cm4oKENIQVIpMjI1KTsKKyAgICAgIGNhc2UgMHgwMEUyOiByZXR1cm4oKENIQVIpMjI2KTsKKyAgICAgIGNhc2UgMHgwMEUzOiByZXR1cm4oKENIQVIpMjI3KTsKKyAgICAgIGNhc2UgMHgwMEU0OiByZXR1cm4oKENIQVIpMjI4KTsKKyAgICAgIGNhc2UgMHgwMEU1OiByZXR1cm4oKENIQVIpMjI5KTsKKyAgICAgIGNhc2UgMHgwMEU2OiByZXR1cm4oKENIQVIpMjMwKTsKKyAgICAgIGNhc2UgMHgwMEU5OiByZXR1cm4oKENIQVIpMjMzKTsKKyAgICAgIGNhc2UgMHgwMEVCOiByZXR1cm4oKENIQVIpMjM1KTsKKyAgICAgIGNhc2UgMHgwMEVEOiByZXR1cm4oKENIQVIpMjM3KTsKKyAgICAgIGNhc2UgMHgwMEVFOiByZXR1cm4oKENIQVIpMjM4KTsKKyAgICAgIGNhc2UgMHgwMEY0OiByZXR1cm4oKENIQVIpMjQ0KTsKKyAgICAgIGNhc2UgMHgwMEY1OiByZXR1cm4oKENIQVIpMjQ1KTsKKyAgICAgIGNhc2UgMHgwMEY2OiByZXR1cm4oKENIQVIpMjQ2KTsKKyAgICAgIGNhc2UgMHgwMEY3OiByZXR1cm4oKENIQVIpMjQ3KTsKKyAgICAgIGNhc2UgMHgwMEY4OiByZXR1cm4oKENIQVIpMjQ4KTsKKyAgICAgIGNhc2UgMHgwMEZBOiByZXR1cm4oKENIQVIpMjUwKTsKKyAgICAgIGNhc2UgMHgwMEZCOiByZXR1cm4oKENIQVIpMjUxKTsKKyAgICAgIGNhc2UgMHgwMEZDOiByZXR1cm4oKENIQVIpMjUyKTsKKyAgICAgIGNhc2UgMHgwMTAwOiByZXR1cm4oKENIQVIpMTkyKTsKKyAgICAgIGNhc2UgMHgwMTAxOiByZXR1cm4oKENIQVIpMjI0KTsKKyAgICAgIGNhc2UgMHgwMTA0OiByZXR1cm4oKENIQVIpMTYxKTsKKyAgICAgIGNhc2UgMHgwMTA1OiByZXR1cm4oKENIQVIpMTc3KTsKKyAgICAgIGNhc2UgMHgwMTBDOiByZXR1cm4oKENIQVIpMjAwKTsKKyAgICAgIGNhc2UgMHgwMTBEOiByZXR1cm4oKENIQVIpMjMyKTsKKyAgICAgIGNhc2UgMHgwMTEwOiByZXR1cm4oKENIQVIpMjA4KTsKKyAgICAgIGNhc2UgMHgwMTExOiByZXR1cm4oKENIQVIpMjQwKTsKKyAgICAgIGNhc2UgMHgwMTEyOiByZXR1cm4oKENIQVIpMTcwKTsKKyAgICAgIGNhc2UgMHgwMTEzOiByZXR1cm4oKENIQVIpMTg2KTsKKyAgICAgIGNhc2UgMHgwMTE2OiByZXR1cm4oKENIQVIpMjA0KTsKKyAgICAgIGNhc2UgMHgwMTE3OiByZXR1cm4oKENIQVIpMjM2KTsKKyAgICAgIGNhc2UgMHgwMTE4OiByZXR1cm4oKENIQVIpMjAyKTsKKyAgICAgIGNhc2UgMHgwMTE5OiByZXR1cm4oKENIQVIpMjM0KTsKKyAgICAgIGNhc2UgMHgwMTIyOiByZXR1cm4oKENIQVIpMTcxKTsKKyAgICAgIGNhc2UgMHgwMTIzOiByZXR1cm4oKENIQVIpMTg3KTsKKyAgICAgIGNhc2UgMHgwMTI4OiByZXR1cm4oKENIQVIpMTY1KTsKKyAgICAgIGNhc2UgMHgwMTI5OiByZXR1cm4oKENIQVIpMTgxKTsKKyAgICAgIGNhc2UgMHgwMTJBOiByZXR1cm4oKENIQVIpMjA3KTsKKyAgICAgIGNhc2UgMHgwMTJCOiByZXR1cm4oKENIQVIpMjM5KTsKKyAgICAgIGNhc2UgMHgwMTJFOiByZXR1cm4oKENIQVIpMTk5KTsKKyAgICAgIGNhc2UgMHgwMTJGOiByZXR1cm4oKENIQVIpMjMxKTsKKyAgICAgIGNhc2UgMHgwMTM2OiByZXR1cm4oKENIQVIpMjExKTsKKyAgICAgIGNhc2UgMHgwMTM3OiByZXR1cm4oKENIQVIpMjQzKTsKKyAgICAgIGNhc2UgMHgwMTM4OiByZXR1cm4oKENIQVIpMTYyKTsKKyAgICAgIGNhc2UgMHgwMTNCOiByZXR1cm4oKENIQVIpMTY2KTsKKyAgICAgIGNhc2UgMHgwMTNDOiByZXR1cm4oKENIQVIpMTgyKTsKKyAgICAgIGNhc2UgMHgwMTQ1OiByZXR1cm4oKENIQVIpMjA5KTsKKyAgICAgIGNhc2UgMHgwMTQ2OiByZXR1cm4oKENIQVIpMjQxKTsKKyAgICAgIGNhc2UgMHgwMTRBOiByZXR1cm4oKENIQVIpMTg5KTsKKyAgICAgIGNhc2UgMHgwMTRCOiByZXR1cm4oKENIQVIpMTkxKTsKKyAgICAgIGNhc2UgMHgwMTRDOiByZXR1cm4oKENIQVIpMjEwKTsKKyAgICAgIGNhc2UgMHgwMTREOiByZXR1cm4oKENIQVIpMjQyKTsKKyAgICAgIGNhc2UgMHgwMTU2OiByZXR1cm4oKENIQVIpMTYzKTsKKyAgICAgIGNhc2UgMHgwMTU3OiByZXR1cm4oKENIQVIpMTc5KTsKKyAgICAgIGNhc2UgMHgwMTYwOiByZXR1cm4oKENIQVIpMTY5KTsKKyAgICAgIGNhc2UgMHgwMTYxOiByZXR1cm4oKENIQVIpMTg1KTsKKyAgICAgIGNhc2UgMHgwMTY2OiByZXR1cm4oKENIQVIpMTcyKTsKKyAgICAgIGNhc2UgMHgwMTY3OiByZXR1cm4oKENIQVIpMTg4KTsKKyAgICAgIGNhc2UgMHgwMTY4OiByZXR1cm4oKENIQVIpMjIxKTsKKyAgICAgIGNhc2UgMHgwMTY5OiByZXR1cm4oKENIQVIpMjUzKTsKKyAgICAgIGNhc2UgMHgwMTZBOiByZXR1cm4oKENIQVIpMjIyKTsKKyAgICAgIGNhc2UgMHgwMTZCOiByZXR1cm4oKENIQVIpMjU0KTsKKyAgICAgIGNhc2UgMHgwMTcyOiByZXR1cm4oKENIQVIpMjE3KTsKKyAgICAgIGNhc2UgMHgwMTczOiByZXR1cm4oKENIQVIpMjQ5KTsKKyAgICAgIGNhc2UgMHgwMTdEOiByZXR1cm4oKENIQVIpMTc0KTsKKyAgICAgIGNhc2UgMHgwMTdFOiByZXR1cm4oKENIQVIpMTkwKTsKKyAgICAgIGNhc2UgMHgwMkM3OiByZXR1cm4oKENIQVIpMTgzKTsKKyAgICAgIGNhc2UgMHgwMkQ5OiByZXR1cm4oKENIQVIpMjU1KTsKKyAgICAgIGNhc2UgMHgwMkRCOiByZXR1cm4oKENIQVIpMTc4KTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9wdW5jKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJU08gODg1OS01IChMYXRpbi9DeXJpbGxpYykgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfODg1OV81KFVTSE9SVCBjKQorI2Vsc2UKK3R4Xzg4NTlfNShjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHhhMCkgICAgICAgICAgICAgICAgICAgICAgIC8qICg4ODU5LTUgaXMgbm90IExhdGluLTUhKSAqLworICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDB4MDBBMDogcmV0dXJuKChDSEFSKTE2MCk7CisgICAgICBjYXNlIDB4MDBBNzogcmV0dXJuKChDSEFSKTI1Myk7CisgICAgICBjYXNlIDB4MDBBRDogcmV0dXJuKChDSEFSKTE3Myk7CisgICAgICBjYXNlIDB4MDQwMTogcmV0dXJuKChDSEFSKTE2MSk7CisgICAgICBjYXNlIDB4MDQwMjogcmV0dXJuKChDSEFSKTE2Mik7CisgICAgICBjYXNlIDB4MDQwMzogcmV0dXJuKChDSEFSKTE2Myk7CisgICAgICBjYXNlIDB4MDQwNDogcmV0dXJuKChDSEFSKTE2NCk7CisgICAgICBjYXNlIDB4MDQwNTogcmV0dXJuKChDSEFSKTE2NSk7CisgICAgICBjYXNlIDB4MDQwNjogcmV0dXJuKChDSEFSKTE2Nik7CisgICAgICBjYXNlIDB4MDQwNzogcmV0dXJuKChDSEFSKTE2Nyk7CisgICAgICBjYXNlIDB4MDQwODogcmV0dXJuKChDSEFSKTE2OCk7CisgICAgICBjYXNlIDB4MDQwOTogcmV0dXJuKChDSEFSKTE2OSk7CisgICAgICBjYXNlIDB4MDQwQTogcmV0dXJuKChDSEFSKTE3MCk7CisgICAgICBjYXNlIDB4MDQwQjogcmV0dXJuKChDSEFSKTE3MSk7CisgICAgICBjYXNlIDB4MDQwQzogcmV0dXJuKChDSEFSKTE3Mik7CisgICAgICBjYXNlIDB4MDQwRTogcmV0dXJuKChDSEFSKTE3NCk7CisgICAgICBjYXNlIDB4MDQwRjogcmV0dXJuKChDSEFSKTE3NSk7CisgICAgICBjYXNlIDB4MDQxMDogcmV0dXJuKChDSEFSKTE3Nik7CisgICAgICBjYXNlIDB4MDQxMTogcmV0dXJuKChDSEFSKTE3Nyk7CisgICAgICBjYXNlIDB4MDQxMjogcmV0dXJuKChDSEFSKTE3OCk7CisgICAgICBjYXNlIDB4MDQxMzogcmV0dXJuKChDSEFSKTE3OSk7CisgICAgICBjYXNlIDB4MDQxNDogcmV0dXJuKChDSEFSKTE4MCk7CisgICAgICBjYXNlIDB4MDQxNTogcmV0dXJuKChDSEFSKTE4MSk7CisgICAgICBjYXNlIDB4MDQxNjogcmV0dXJuKChDSEFSKTE4Mik7CisgICAgICBjYXNlIDB4MDQxNzogcmV0dXJuKChDSEFSKTE4Myk7CisgICAgICBjYXNlIDB4MDQxODogcmV0dXJuKChDSEFSKTE4NCk7CisgICAgICBjYXNlIDB4MDQxOTogcmV0dXJuKChDSEFSKTE4NSk7CisgICAgICBjYXNlIDB4MDQxQTogcmV0dXJuKChDSEFSKTE4Nik7CisgICAgICBjYXNlIDB4MDQxQjogcmV0dXJuKChDSEFSKTE4Nyk7CisgICAgICBjYXNlIDB4MDQxQzogcmV0dXJuKChDSEFSKTE4OCk7CisgICAgICBjYXNlIDB4MDQxRDogcmV0dXJuKChDSEFSKTE4OSk7CisgICAgICBjYXNlIDB4MDQxRTogcmV0dXJuKChDSEFSKTE5MCk7CisgICAgICBjYXNlIDB4MDQxRjogcmV0dXJuKChDSEFSKTE5MSk7CisgICAgICBjYXNlIDB4MDQyMDogcmV0dXJuKChDSEFSKTE5Mik7CisgICAgICBjYXNlIDB4MDQyMTogcmV0dXJuKChDSEFSKTE5Myk7CisgICAgICBjYXNlIDB4MDQyMjogcmV0dXJuKChDSEFSKTE5NCk7CisgICAgICBjYXNlIDB4MDQyMzogcmV0dXJuKChDSEFSKTE5NSk7CisgICAgICBjYXNlIDB4MDQyNDogcmV0dXJuKChDSEFSKTE5Nik7CisgICAgICBjYXNlIDB4MDQyNTogcmV0dXJuKChDSEFSKTE5Nyk7CisgICAgICBjYXNlIDB4MDQyNjogcmV0dXJuKChDSEFSKTE5OCk7CisgICAgICBjYXNlIDB4MDQyNzogcmV0dXJuKChDSEFSKTE5OSk7CisgICAgICBjYXNlIDB4MDQyODogcmV0dXJuKChDSEFSKTIwMCk7CisgICAgICBjYXNlIDB4MDQyOTogcmV0dXJuKChDSEFSKTIwMSk7CisgICAgICBjYXNlIDB4MDQyQTogcmV0dXJuKChDSEFSKTIwMik7CisgICAgICBjYXNlIDB4MDQyQjogcmV0dXJuKChDSEFSKTIwMyk7CisgICAgICBjYXNlIDB4MDQyQzogcmV0dXJuKChDSEFSKTIwNCk7CisgICAgICBjYXNlIDB4MDQyRDogcmV0dXJuKChDSEFSKTIwNSk7CisgICAgICBjYXNlIDB4MDQyRTogcmV0dXJuKChDSEFSKTIwNik7CisgICAgICBjYXNlIDB4MDQyRjogcmV0dXJuKChDSEFSKTIwNyk7CisgICAgICBjYXNlIDB4MDQzMDogcmV0dXJuKChDSEFSKTIwOCk7CisgICAgICBjYXNlIDB4MDQzMTogcmV0dXJuKChDSEFSKTIwOSk7CisgICAgICBjYXNlIDB4MDQzMjogcmV0dXJuKChDSEFSKTIxMCk7CisgICAgICBjYXNlIDB4MDQzMzogcmV0dXJuKChDSEFSKTIxMSk7CisgICAgICBjYXNlIDB4MDQzNDogcmV0dXJuKChDSEFSKTIxMik7CisgICAgICBjYXNlIDB4MDQzNTogcmV0dXJuKChDSEFSKTIxMyk7CisgICAgICBjYXNlIDB4MDQzNjogcmV0dXJuKChDSEFSKTIxNCk7CisgICAgICBjYXNlIDB4MDQzNzogcmV0dXJuKChDSEFSKTIxNSk7CisgICAgICBjYXNlIDB4MDQzODogcmV0dXJuKChDSEFSKTIxNik7CisgICAgICBjYXNlIDB4MDQzOTogcmV0dXJuKChDSEFSKTIxNyk7CisgICAgICBjYXNlIDB4MDQzQTogcmV0dXJuKChDSEFSKTIxOCk7CisgICAgICBjYXNlIDB4MDQzQjogcmV0dXJuKChDSEFSKTIxOSk7CisgICAgICBjYXNlIDB4MDQzQzogcmV0dXJuKChDSEFSKTIyMCk7CisgICAgICBjYXNlIDB4MDQzRDogcmV0dXJuKChDSEFSKTIyMSk7CisgICAgICBjYXNlIDB4MDQzRTogcmV0dXJuKChDSEFSKTIyMik7CisgICAgICBjYXNlIDB4MDQzRjogcmV0dXJuKChDSEFSKTIyMyk7CisgICAgICBjYXNlIDB4MDQ0MDogcmV0dXJuKChDSEFSKTIyNCk7CisgICAgICBjYXNlIDB4MDQ0MTogcmV0dXJuKChDSEFSKTIyNSk7CisgICAgICBjYXNlIDB4MDQ0MjogcmV0dXJuKChDSEFSKTIyNik7CisgICAgICBjYXNlIDB4MDQ0MzogcmV0dXJuKChDSEFSKTIyNyk7CisgICAgICBjYXNlIDB4MDQ0NDogcmV0dXJuKChDSEFSKTIyOCk7CisgICAgICBjYXNlIDB4MDQ0NTogcmV0dXJuKChDSEFSKTIyOSk7CisgICAgICBjYXNlIDB4MDQ0NjogcmV0dXJuKChDSEFSKTIzMCk7CisgICAgICBjYXNlIDB4MDQ0NzogcmV0dXJuKChDSEFSKTIzMSk7CisgICAgICBjYXNlIDB4MDQ0ODogcmV0dXJuKChDSEFSKTIzMik7CisgICAgICBjYXNlIDB4MDQ0OTogcmV0dXJuKChDSEFSKTIzMyk7CisgICAgICBjYXNlIDB4MDQ0QTogcmV0dXJuKChDSEFSKTIzNCk7CisgICAgICBjYXNlIDB4MDQ0QjogcmV0dXJuKChDSEFSKTIzNSk7CisgICAgICBjYXNlIDB4MDQ0QzogcmV0dXJuKChDSEFSKTIzNik7CisgICAgICBjYXNlIDB4MDQ0RDogcmV0dXJuKChDSEFSKTIzNyk7CisgICAgICBjYXNlIDB4MDQ0RTogcmV0dXJuKChDSEFSKTIzOCk7CisgICAgICBjYXNlIDB4MDQ0RjogcmV0dXJuKChDSEFSKTIzOSk7CisgICAgICBjYXNlIDB4MDQ1MTogcmV0dXJuKChDSEFSKTI0MSk7CisgICAgICBjYXNlIDB4MDQ1MjogcmV0dXJuKChDSEFSKTI0Mik7CisgICAgICBjYXNlIDB4MDQ1MzogcmV0dXJuKChDSEFSKTI0Myk7CisgICAgICBjYXNlIDB4MDQ1NDogcmV0dXJuKChDSEFSKTI0NCk7CisgICAgICBjYXNlIDB4MDQ1NTogcmV0dXJuKChDSEFSKTI0NSk7CisgICAgICBjYXNlIDB4MDQ1NjogcmV0dXJuKChDSEFSKTI0Nik7CisgICAgICBjYXNlIDB4MDQ1NzogcmV0dXJuKChDSEFSKTI0Nyk7CisgICAgICBjYXNlIDB4MDQ1ODogcmV0dXJuKChDSEFSKTI0OCk7CisgICAgICBjYXNlIDB4MDQ1OTogcmV0dXJuKChDSEFSKTI0OSk7CisgICAgICBjYXNlIDB4MDQ1QTogcmV0dXJuKChDSEFSKTI1MCk7CisgICAgICBjYXNlIDB4MDQ1QjogcmV0dXJuKChDSEFSKTI1MSk7CisgICAgICBjYXNlIDB4MDQ1QzogcmV0dXJuKChDSEFSKTI1Mik7CisgICAgICBjYXNlIDB4MDQ1RTogcmV0dXJuKChDSEFSKTI1NCk7CisgICAgICBjYXNlIDB4MDQ1RjogcmV0dXJuKChDSEFSKTI1NSk7CisgICAgICBjYXNlIDB4MjExNjogcmV0dXJuKChDSEFSKTI0MCk7CisgICAgICBkZWZhdWx0OiByZXR1cm4odHhfcHVuYyhjKSk7CisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVNPIDg4NTktNiAoTGF0aW4vQXJhYmljKSAqLworI2lmZGVmIENLX0FOU0lDCit0eF84ODU5XzYoVVNIT1JUIGMpCisjZWxzZQordHhfODg1OV82KGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPCAweGEwKSAgICAgICAgICAgICAgICAgICAgICAgLyogKDg4NTktNiAhPSBMYXRpbi02KSAqLworICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDB4MDBBMDogcmV0dXJuKChDSEFSKTE2MCk7CisgICAgICBjYXNlIDB4MDBBNDogcmV0dXJuKChDSEFSKTE2NCk7CisgICAgICBjYXNlIDB4MDBBRDogcmV0dXJuKChDSEFSKTE3Myk7CisgICAgICBjYXNlIDB4MDYwQzogcmV0dXJuKChDSEFSKTE3Mik7CisgICAgICBjYXNlIDB4MDYxQjogcmV0dXJuKChDSEFSKTE4Nyk7CisgICAgICBjYXNlIDB4MDYxRjogcmV0dXJuKChDSEFSKTE5MSk7CisgICAgICBjYXNlIDB4MDYyMTogcmV0dXJuKChDSEFSKTE5Myk7CisgICAgICBjYXNlIDB4MDYyMjogcmV0dXJuKChDSEFSKTE5NCk7CisgICAgICBjYXNlIDB4MDYyMzogcmV0dXJuKChDSEFSKTE5NSk7CisgICAgICBjYXNlIDB4MDYyNDogcmV0dXJuKChDSEFSKTE5Nik7CisgICAgICBjYXNlIDB4MDYyNTogcmV0dXJuKChDSEFSKTE5Nyk7CisgICAgICBjYXNlIDB4MDYyNjogcmV0dXJuKChDSEFSKTE5OCk7CisgICAgICBjYXNlIDB4MDYyNzogcmV0dXJuKChDSEFSKTE5OSk7CisgICAgICBjYXNlIDB4MDYyODogcmV0dXJuKChDSEFSKTIwMCk7CisgICAgICBjYXNlIDB4MDYyOTogcmV0dXJuKChDSEFSKTIwMSk7CisgICAgICBjYXNlIDB4MDYyQTogcmV0dXJuKChDSEFSKTIwMik7CisgICAgICBjYXNlIDB4MDYyQjogcmV0dXJuKChDSEFSKTIwMyk7CisgICAgICBjYXNlIDB4MDYyQzogcmV0dXJuKChDSEFSKTIwNCk7CisgICAgICBjYXNlIDB4MDYyRDogcmV0dXJuKChDSEFSKTIwNSk7CisgICAgICBjYXNlIDB4MDYyRTogcmV0dXJuKChDSEFSKTIwNik7CisgICAgICBjYXNlIDB4MDYyRjogcmV0dXJuKChDSEFSKTIwNyk7CisgICAgICBjYXNlIDB4MDYzMDogcmV0dXJuKChDSEFSKTIwOCk7CisgICAgICBjYXNlIDB4MDYzMTogcmV0dXJuKChDSEFSKTIwOSk7CisgICAgICBjYXNlIDB4MDYzMjogcmV0dXJuKChDSEFSKTIxMCk7CisgICAgICBjYXNlIDB4MDYzMzogcmV0dXJuKChDSEFSKTIxMSk7CisgICAgICBjYXNlIDB4MDYzNDogcmV0dXJuKChDSEFSKTIxMik7CisgICAgICBjYXNlIDB4MDYzNTogcmV0dXJuKChDSEFSKTIxMyk7CisgICAgICBjYXNlIDB4MDYzNjogcmV0dXJuKChDSEFSKTIxNCk7CisgICAgICBjYXNlIDB4MDYzNzogcmV0dXJuKChDSEFSKTIxNSk7CisgICAgICBjYXNlIDB4MDYzODogcmV0dXJuKChDSEFSKTIxNik7CisgICAgICBjYXNlIDB4MDYzOTogcmV0dXJuKChDSEFSKTIxNyk7CisgICAgICBjYXNlIDB4MDYzQTogcmV0dXJuKChDSEFSKTIxOCk7CisgICAgICBjYXNlIDB4MDY0MDogcmV0dXJuKChDSEFSKTIyNCk7CisgICAgICBjYXNlIDB4MDY0MTogcmV0dXJuKChDSEFSKTIyNSk7CisgICAgICBjYXNlIDB4MDY0MjogcmV0dXJuKChDSEFSKTIyNik7CisgICAgICBjYXNlIDB4MDY0MzogcmV0dXJuKChDSEFSKTIyNyk7CisgICAgICBjYXNlIDB4MDY0NDogcmV0dXJuKChDSEFSKTIyOCk7CisgICAgICBjYXNlIDB4MDY0NTogcmV0dXJuKChDSEFSKTIyOSk7CisgICAgICBjYXNlIDB4MDY0NjogcmV0dXJuKChDSEFSKTIzMCk7CisgICAgICBjYXNlIDB4MDY0NzogcmV0dXJuKChDSEFSKTIzMSk7CisgICAgICBjYXNlIDB4MDY0ODogcmV0dXJuKChDSEFSKTIzMik7CisgICAgICBjYXNlIDB4MDY0OTogcmV0dXJuKChDSEFSKTIzMyk7CisgICAgICBjYXNlIDB4MDY0QTogcmV0dXJuKChDSEFSKTIzNCk7CisgICAgICBjYXNlIDB4MDY0QjogcmV0dXJuKChDSEFSKTIzNSk7CisgICAgICBjYXNlIDB4MDY0QzogcmV0dXJuKChDSEFSKTIzNik7CisgICAgICBjYXNlIDB4MDY0RDogcmV0dXJuKChDSEFSKTIzNyk7CisgICAgICBjYXNlIDB4MDY0RTogcmV0dXJuKChDSEFSKTIzOCk7CisgICAgICBjYXNlIDB4MDY0RjogcmV0dXJuKChDSEFSKTIzOSk7CisgICAgICBjYXNlIDB4MDY1MDogcmV0dXJuKChDSEFSKTI0MCk7CisgICAgICBjYXNlIDB4MDY1MTogcmV0dXJuKChDSEFSKTI0MSk7CisgICAgICBjYXNlIDB4MDY1MjogcmV0dXJuKChDSEFSKTI0Mik7CisgICAgICBkZWZhdWx0OiByZXR1cm4odHhfcHVuYyhjKSk7CisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVNPIDg4NTktNyAoTGF0aW4vR3JlZWspICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4Xzg4NTlfNyhVU0hPUlQgYykKKyNlbHNlCit0eF84ODU5XzcoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4YTApCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgICAgY2FzZSAweDAwYTA6IHJldHVybigoQ0hBUikxNjApOworICAgICAgICBjYXNlIDB4MDBhMzogcmV0dXJuKChDSEFSKTE2Myk7CisgICAgICAgIGNhc2UgMHgwMGE2OiByZXR1cm4oKENIQVIpMTY2KTsKKyAgICAgICAgY2FzZSAweDAwYTc6IHJldHVybigoQ0hBUikxNjcpOworICAgICAgICBjYXNlIDB4MDBhODogcmV0dXJuKChDSEFSKTE2OCk7CisgICAgICAgIGNhc2UgMHgwMGE5OiByZXR1cm4oKENIQVIpMTY5KTsKKyAgICAgICAgY2FzZSAweDAwYWI6IHJldHVybigoQ0hBUikxNzEpOworICAgICAgICBjYXNlIDB4MDBhYzogcmV0dXJuKChDSEFSKTE3Mik7CisgICAgICAgIGNhc2UgMHgwMGFkOiByZXR1cm4oKENIQVIpMTczKTsKKyAgICAgICAgY2FzZSAweDAwYjA6IHJldHVybigoQ0hBUikxNzYpOworICAgICAgICBjYXNlIDB4MDBiMTogcmV0dXJuKChDSEFSKTE3Nyk7CisgICAgICAgIGNhc2UgMHgwMGIyOiByZXR1cm4oKENIQVIpMTc4KTsKKyAgICAgICAgY2FzZSAweDAwYjM6IHJldHVybigoQ0hBUikxNzkpOworICAgICAgICBjYXNlIDB4MDBiNzogcmV0dXJuKChDSEFSKTE4Myk7CisgICAgICAgIGNhc2UgMHgwMGJiOiByZXR1cm4oKENIQVIpMTg3KTsKKyAgICAgICAgY2FzZSAweDAwYmQ6IHJldHVybigoQ0hBUikxODkpOworICAgICAgICBjYXNlIDB4MDJiYzogcmV0dXJuKChDSEFSKTE2Mik7CisgICAgICAgIGNhc2UgMHgwMmJkOiByZXR1cm4oKENIQVIpMTYxKTsKKyAgICAgICAgY2FzZSAweDAzODQ6IHJldHVybigoQ0hBUikxODApOworICAgICAgICBjYXNlIDB4MDM4NTogcmV0dXJuKChDSEFSKTE4MSk7CisgICAgICAgIGNhc2UgMHgwMzg2OiByZXR1cm4oKENIQVIpMTgyKTsKKyAgICAgICAgY2FzZSAweDAzODg6IHJldHVybigoQ0hBUikxODQpOworICAgICAgICBjYXNlIDB4MDM4OTogcmV0dXJuKChDSEFSKTE4NSk7CisgICAgICAgIGNhc2UgMHgwMzhhOiByZXR1cm4oKENIQVIpMTg2KTsKKyAgICAgICAgY2FzZSAweDAzOGM6IHJldHVybigoQ0hBUikxODgpOworICAgICAgICBjYXNlIDB4MDM4ZTogcmV0dXJuKChDSEFSKTE5MCk7CisgICAgICAgIGNhc2UgMHgwMzhmOiByZXR1cm4oKENIQVIpMTkxKTsKKyAgICAgICAgY2FzZSAweDAzOTA6IHJldHVybigoQ0hBUikxOTIpOworICAgICAgICBjYXNlIDB4MDM5MTogcmV0dXJuKChDSEFSKTE5Myk7CisgICAgICAgIGNhc2UgMHgwMzkyOiByZXR1cm4oKENIQVIpMTk0KTsKKyAgICAgICAgY2FzZSAweDAzOTM6IHJldHVybigoQ0hBUikxOTUpOworICAgICAgICBjYXNlIDB4MDM5NDogcmV0dXJuKChDSEFSKTE5Nik7CisgICAgICAgIGNhc2UgMHgwMzk1OiByZXR1cm4oKENIQVIpMTk3KTsKKyAgICAgICAgY2FzZSAweDAzOTY6IHJldHVybigoQ0hBUikxOTgpOworICAgICAgICBjYXNlIDB4MDM5NzogcmV0dXJuKChDSEFSKTE5OSk7CisgICAgICAgIGNhc2UgMHgwMzk4OiByZXR1cm4oKENIQVIpMjAwKTsKKyAgICAgICAgY2FzZSAweDAzOTk6IHJldHVybigoQ0hBUikyMDEpOworICAgICAgICBjYXNlIDB4MDM5YTogcmV0dXJuKChDSEFSKTIwMik7CisgICAgICAgIGNhc2UgMHgwMzliOiByZXR1cm4oKENIQVIpMjAzKTsKKyAgICAgICAgY2FzZSAweDAzOWM6IHJldHVybigoQ0hBUikyMDQpOworICAgICAgICBjYXNlIDB4MDM5ZDogcmV0dXJuKChDSEFSKTIwNSk7CisgICAgICAgIGNhc2UgMHgwMzllOiByZXR1cm4oKENIQVIpMjA2KTsKKyAgICAgICAgY2FzZSAweDAzOWY6IHJldHVybigoQ0hBUikyMDcpOworICAgICAgICBjYXNlIDB4MDNhMDogcmV0dXJuKChDSEFSKTIwOCk7CisgICAgICAgIGNhc2UgMHgwM2ExOiByZXR1cm4oKENIQVIpMjA5KTsKKyAgICAgICAgY2FzZSAweDAzYTM6IHJldHVybigoQ0hBUikyMTEpOworICAgICAgICBjYXNlIDB4MDNhNDogcmV0dXJuKChDSEFSKTIxMik7CisgICAgICAgIGNhc2UgMHgwM2E1OiByZXR1cm4oKENIQVIpMjEzKTsKKyAgICAgICAgY2FzZSAweDAzYTY6IHJldHVybigoQ0hBUikyMTQpOworICAgICAgICBjYXNlIDB4MDNhNzogcmV0dXJuKChDSEFSKTIxNSk7CisgICAgICAgIGNhc2UgMHgwM2E4OiByZXR1cm4oKENIQVIpMjE2KTsKKyAgICAgICAgY2FzZSAweDAzYTk6IHJldHVybigoQ0hBUikyMTcpOworICAgICAgICBjYXNlIDB4MDNhYTogcmV0dXJuKChDSEFSKTIxOCk7CisgICAgICAgIGNhc2UgMHgwM2FiOiByZXR1cm4oKENIQVIpMjE5KTsKKyAgICAgICAgY2FzZSAweDAzYWM6IHJldHVybigoQ0hBUikyMjApOworICAgICAgICBjYXNlIDB4MDNhZDogcmV0dXJuKChDSEFSKTIyMSk7CisgICAgICAgIGNhc2UgMHgwM2FlOiByZXR1cm4oKENIQVIpMjIyKTsKKyAgICAgICAgY2FzZSAweDAzYWY6IHJldHVybigoQ0hBUikyMjMpOworICAgICAgICBjYXNlIDB4MDNiMDogcmV0dXJuKChDSEFSKTIyNCk7CisgICAgICAgIGNhc2UgMHgwM2IxOiByZXR1cm4oKENIQVIpMjI1KTsKKyAgICAgICAgY2FzZSAweDAzYjI6IHJldHVybigoQ0hBUikyMjYpOworICAgICAgICBjYXNlIDB4MDNiMzogcmV0dXJuKChDSEFSKTIyNyk7CisgICAgICAgIGNhc2UgMHgwM2I0OiByZXR1cm4oKENIQVIpMjI4KTsKKyAgICAgICAgY2FzZSAweDAzYjU6IHJldHVybigoQ0hBUikyMjkpOworICAgICAgICBjYXNlIDB4MDNiNjogcmV0dXJuKChDSEFSKTIzMCk7CisgICAgICAgIGNhc2UgMHgwM2I3OiByZXR1cm4oKENIQVIpMjMxKTsKKyAgICAgICAgY2FzZSAweDAzYjg6IHJldHVybigoQ0hBUikyMzIpOworICAgICAgICBjYXNlIDB4MDNiOTogcmV0dXJuKChDSEFSKTIzMyk7CisgICAgICAgIGNhc2UgMHgwM2JhOiByZXR1cm4oKENIQVIpMjM0KTsKKyAgICAgICAgY2FzZSAweDAzYmI6IHJldHVybigoQ0hBUikyMzUpOworICAgICAgICBjYXNlIDB4MDNiYzogcmV0dXJuKChDSEFSKTIzNik7CisgICAgICAgIGNhc2UgMHgwM2JkOiByZXR1cm4oKENIQVIpMjM3KTsKKyAgICAgICAgY2FzZSAweDAzYmU6IHJldHVybigoQ0hBUikyMzgpOworICAgICAgICBjYXNlIDB4MDNiZjogcmV0dXJuKChDSEFSKTIzOSk7CisgICAgICAgIGNhc2UgMHgwM2MwOiByZXR1cm4oKENIQVIpMjQwKTsKKyAgICAgICAgY2FzZSAweDAzYzE6IHJldHVybigoQ0hBUikyNDEpOworICAgICAgICBjYXNlIDB4MDNjMjogcmV0dXJuKChDSEFSKTI0Mik7CisgICAgICAgIGNhc2UgMHgwM2MzOiByZXR1cm4oKENIQVIpMjQzKTsKKyAgICAgICAgY2FzZSAweDAzYzQ6IHJldHVybigoQ0hBUikyNDQpOworICAgICAgICBjYXNlIDB4MDNjNTogcmV0dXJuKChDSEFSKTI0NSk7CisgICAgICAgIGNhc2UgMHgwM2M2OiByZXR1cm4oKENIQVIpMjQ2KTsKKyAgICAgICAgY2FzZSAweDAzYzc6IHJldHVybigoQ0hBUikyNDcpOworICAgICAgICBjYXNlIDB4MDNjODogcmV0dXJuKChDSEFSKTI0OCk7CisgICAgICAgIGNhc2UgMHgwM2M5OiByZXR1cm4oKENIQVIpMjQ5KTsKKyAgICAgICAgY2FzZSAweDAzY2E6IHJldHVybigoQ0hBUikyNTApOworICAgICAgICBjYXNlIDB4MDNjYjogcmV0dXJuKChDSEFSKTI1MSk7CisgICAgICAgIGNhc2UgMHgwM2NjOiByZXR1cm4oKENIQVIpMjUyKTsKKyAgICAgICAgY2FzZSAweDAzY2Q6IHJldHVybigoQ0hBUikyNTMpOworICAgICAgICBjYXNlIDB4MDNjZTogcmV0dXJuKChDSEFSKTI1NCk7CisgICAgICAgIGNhc2UgMHgyMDE1OiByZXR1cm4oKENIQVIpMTc1KTsKKyAgICAgICAgY2FzZSAweDIwMTg6IHJldHVybigoQ0hBUikxNjEpOworICAgICAgICBjYXNlIDB4MjAxOTogcmV0dXJuKChDSEFSKTE2Mik7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9wdW5jKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJU08gODg1OS04IChMYXRpbi9IZWJyZXcpICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4Xzg4NTlfOChVU0hPUlQgYykKKyNlbHNlCit0eF84ODU5XzgoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4YTApCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHgwMGEwOiByZXR1cm4oKENIQVIpMTYwKTsKKyAgICAgIGNhc2UgMHgwMGEyOiByZXR1cm4oKENIQVIpMTYyKTsKKyAgICAgIGNhc2UgMHgwMGEzOiByZXR1cm4oKENIQVIpMTYzKTsKKyAgICAgIGNhc2UgMHgwMGE0OiByZXR1cm4oKENIQVIpMTY0KTsKKyAgICAgIGNhc2UgMHgwMGE1OiByZXR1cm4oKENIQVIpMTY1KTsKKyAgICAgIGNhc2UgMHgwMGE2OiByZXR1cm4oKENIQVIpMTY2KTsKKyAgICAgIGNhc2UgMHgwMGE3OiByZXR1cm4oKENIQVIpMTY3KTsKKyAgICAgIGNhc2UgMHgwMGE4OiByZXR1cm4oKENIQVIpMTY4KTsKKyAgICAgIGNhc2UgMHgwMGE5OiByZXR1cm4oKENIQVIpMTY5KTsKKyAgICAgIGNhc2UgMHgwMGQ3OiByZXR1cm4oKENIQVIpMTcwKTsKKyAgICAgIGNhc2UgMHgwMGFiOiByZXR1cm4oKENIQVIpMTcxKTsKKyAgICAgIGNhc2UgMHgwMGFjOiByZXR1cm4oKENIQVIpMTcyKTsKKyAgICAgIGNhc2UgMHgwMGFkOiByZXR1cm4oKENIQVIpMTczKTsKKyAgICAgIGNhc2UgMHgwMGFlOiByZXR1cm4oKENIQVIpMTc0KTsKKyAgICAgIGNhc2UgMHgyMDNlOiByZXR1cm4oKENIQVIpMTc1KTsKKyAgICAgIGNhc2UgMHgwMGIwOiByZXR1cm4oKENIQVIpMTc2KTsKKyAgICAgIGNhc2UgMHgwMGIxOiByZXR1cm4oKENIQVIpMTc3KTsKKyAgICAgIGNhc2UgMHgwMGIyOiByZXR1cm4oKENIQVIpMTc4KTsKKyAgICAgIGNhc2UgMHgwMGIzOiByZXR1cm4oKENIQVIpMTc5KTsKKyAgICAgIGNhc2UgMHgwMGI0OiByZXR1cm4oKENIQVIpMTgwKTsKKyAgICAgIGNhc2UgMHgwMGI1OiByZXR1cm4oKENIQVIpMTgxKTsKKyAgICAgIGNhc2UgMHgwMGI2OiByZXR1cm4oKENIQVIpMTgyKTsKKyAgICAgIGNhc2UgMHgwMGI3OiByZXR1cm4oKENIQVIpMTgzKTsKKyAgICAgIGNhc2UgMHgwMGI4OiByZXR1cm4oKENIQVIpMTg0KTsKKyAgICAgIGNhc2UgMHgwMGI5OiByZXR1cm4oKENIQVIpMTg1KTsKKyAgICAgIGNhc2UgMHgwMGY3OiByZXR1cm4oKENIQVIpMTg2KTsKKyAgICAgIGNhc2UgMHgwMGJiOiByZXR1cm4oKENIQVIpMTg3KTsKKyAgICAgIGNhc2UgMHgwMGJjOiByZXR1cm4oKENIQVIpMTg4KTsKKyAgICAgIGNhc2UgMHgwMGJkOiByZXR1cm4oKENIQVIpMTg5KTsKKyAgICAgIGNhc2UgMHgwMGJlOiByZXR1cm4oKENIQVIpMTkwKTsKKyAgICAgIGNhc2UgMHgyMDE3OiByZXR1cm4oKENIQVIpMjIzKTsKKyAgICAgIGNhc2UgMHgwNWQwOiByZXR1cm4oKENIQVIpMjI0KTsKKyAgICAgIGNhc2UgMHgwNWQxOiByZXR1cm4oKENIQVIpMjI1KTsKKyAgICAgIGNhc2UgMHgwNWQyOiByZXR1cm4oKENIQVIpMjI2KTsKKyAgICAgIGNhc2UgMHgwNWQzOiByZXR1cm4oKENIQVIpMjI3KTsKKyAgICAgIGNhc2UgMHgwNWQ0OiByZXR1cm4oKENIQVIpMjI4KTsKKyAgICAgIGNhc2UgMHgwNWQ1OiByZXR1cm4oKENIQVIpMjI5KTsKKyAgICAgIGNhc2UgMHgwNWQ2OiByZXR1cm4oKENIQVIpMjMwKTsKKyAgICAgIGNhc2UgMHgwNWQ3OiByZXR1cm4oKENIQVIpMjMxKTsKKyAgICAgIGNhc2UgMHgwNWQ4OiByZXR1cm4oKENIQVIpMjMyKTsKKyAgICAgIGNhc2UgMHgwNWQ5OiByZXR1cm4oKENIQVIpMjMzKTsKKyAgICAgIGNhc2UgMHgwNWRhOiByZXR1cm4oKENIQVIpMjM0KTsKKyAgICAgIGNhc2UgMHgwNWRiOiByZXR1cm4oKENIQVIpMjM1KTsKKyAgICAgIGNhc2UgMHgwNWRjOiByZXR1cm4oKENIQVIpMjM2KTsKKyAgICAgIGNhc2UgMHgwNWRkOiByZXR1cm4oKENIQVIpMjM3KTsKKyAgICAgIGNhc2UgMHgwNWRlOiByZXR1cm4oKENIQVIpMjM4KTsKKyAgICAgIGNhc2UgMHgwNWRmOiByZXR1cm4oKENIQVIpMjM5KTsKKyAgICAgIGNhc2UgMHgwNWUwOiByZXR1cm4oKENIQVIpMjQwKTsKKyAgICAgIGNhc2UgMHgwNWUxOiByZXR1cm4oKENIQVIpMjQxKTsKKyAgICAgIGNhc2UgMHgwNWUyOiByZXR1cm4oKENIQVIpMjQyKTsKKyAgICAgIGNhc2UgMHgwNWUzOiByZXR1cm4oKENIQVIpMjQzKTsKKyAgICAgIGNhc2UgMHgwNWU0OiByZXR1cm4oKENIQVIpMjQ0KTsKKyAgICAgIGNhc2UgMHgwNWU1OiByZXR1cm4oKENIQVIpMjQ1KTsKKyAgICAgIGNhc2UgMHgwNWU2OiByZXR1cm4oKENIQVIpMjQ2KTsKKyAgICAgIGNhc2UgMHgwNWU3OiByZXR1cm4oKENIQVIpMjQ3KTsKKyAgICAgIGNhc2UgMHgwNWU4OiByZXR1cm4oKENIQVIpMjQ4KTsKKyAgICAgIGNhc2UgMHgwNWU5OiByZXR1cm4oKENIQVIpMjQ5KTsKKyAgICAgIGNhc2UgMHgwNWVhOiByZXR1cm4oKENIQVIpMjUwKTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9wdW5jKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJU08gODg1OS05IChMYXRpbi00KSAqLworI2lmZGVmIENLX0FOU0lDCit0eF84ODU5XzkoVVNIT1JUIGMpCisjZWxzZQordHhfODg1OV85KGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPCAweGEwKQorICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDB4MDExRTogcmV0dXJuKChDSEFSKTIwOCk7ICAgLyogRGlmZmVycyBmcm9tIExhdGluLTEgaW4gKi8KKyAgICAgIGNhc2UgMHgwMTFGOiByZXR1cm4oKENIQVIpMjQwKTsgICAvKiBvbmx5IHNpeCBwbGFjZXMgKi8KKyAgICAgIGNhc2UgMHgwMTMwOiByZXR1cm4oKENIQVIpMjIxKTsKKyAgICAgIGNhc2UgMHgwMTMxOiByZXR1cm4oKENIQVIpMjUzKTsKKyAgICAgIGNhc2UgMHgwMTVFOiByZXR1cm4oKENIQVIpMjIyKTsKKyAgICAgIGNhc2UgMHgwMTVGOiByZXR1cm4oKENIQVIpMjU0KTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9pZGVudChjKSk7CisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGF0aW4tNiAqLworI2lmZGVmIENLX0FOU0lDCit0eF84ODU5XzEwKFVTSE9SVCBjKQorI2Vsc2UKK3R4Xzg4NTlfMTAoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4YTApCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHgwMGEwOiByZXR1cm4oKENIQVIpMTYwKTsKKyAgICAgIGNhc2UgMHgwMGFkOiByZXR1cm4oKENIQVIpMTczKTsKKyAgICAgIGNhc2UgMHgwMGJkOiByZXR1cm4oKENIQVIpMTg5KTsKKyAgICAgIGNhc2UgMHgwMGJlOiByZXR1cm4oKENIQVIpMTkwKTsKKyAgICAgIGNhc2UgMHgwMGMxOiByZXR1cm4oKENIQVIpMTkzKTsKKyAgICAgIGNhc2UgMHgwMGMyOiByZXR1cm4oKENIQVIpMTk0KTsKKyAgICAgIGNhc2UgMHgwMGMzOiByZXR1cm4oKENIQVIpMTk1KTsKKyAgICAgIGNhc2UgMHgwMGM0OiByZXR1cm4oKENIQVIpMTk2KTsKKyAgICAgIGNhc2UgMHgwMGM1OiByZXR1cm4oKENIQVIpMTk3KTsKKyAgICAgIGNhc2UgMHgwMGM2OiByZXR1cm4oKENIQVIpMTk4KTsKKyAgICAgIGNhc2UgMHgwMGM5OiByZXR1cm4oKENIQVIpMjAxKTsKKyAgICAgIGNhc2UgMHgwMGNiOiByZXR1cm4oKENIQVIpMjAzKTsKKyAgICAgIGNhc2UgMHgwMGNkOiByZXR1cm4oKENIQVIpMjA1KTsKKyAgICAgIGNhc2UgMHgwMGNlOiByZXR1cm4oKENIQVIpMjA2KTsKKyAgICAgIGNhc2UgMHgwMGNmOiByZXR1cm4oKENIQVIpMjA3KTsKKyAgICAgIGNhc2UgMHgwMGQzOiByZXR1cm4oKENIQVIpMjExKTsKKyAgICAgIGNhc2UgMHgwMGQ0OiByZXR1cm4oKENIQVIpMjEyKTsKKyAgICAgIGNhc2UgMHgwMGQ1OiByZXR1cm4oKENIQVIpMjEzKTsKKyAgICAgIGNhc2UgMHgwMGQ2OiByZXR1cm4oKENIQVIpMjE0KTsKKyAgICAgIGNhc2UgMHgwMGQ4OiByZXR1cm4oKENIQVIpMjE2KTsKKyAgICAgIGNhc2UgMHgwMGRhOiByZXR1cm4oKENIQVIpMjE4KTsKKyAgICAgIGNhc2UgMHgwMGRiOiByZXR1cm4oKENIQVIpMjE5KTsKKyAgICAgIGNhc2UgMHgwMGRjOiByZXR1cm4oKENIQVIpMjIwKTsKKyAgICAgIGNhc2UgMHgwMGRkOiByZXR1cm4oKENIQVIpMjIxKTsKKyAgICAgIGNhc2UgMHgwMGRlOiByZXR1cm4oKENIQVIpMjIyKTsKKyAgICAgIGNhc2UgMHgwMGUxOiByZXR1cm4oKENIQVIpMjI1KTsKKyAgICAgIGNhc2UgMHgwMGUyOiByZXR1cm4oKENIQVIpMjI2KTsKKyAgICAgIGNhc2UgMHgwMGUzOiByZXR1cm4oKENIQVIpMjI3KTsKKyAgICAgIGNhc2UgMHgwMGU0OiByZXR1cm4oKENIQVIpMjI4KTsKKyAgICAgIGNhc2UgMHgwMGU1OiByZXR1cm4oKENIQVIpMjI5KTsKKyAgICAgIGNhc2UgMHgwMGU2OiByZXR1cm4oKENIQVIpMjMwKTsKKyAgICAgIGNhc2UgMHgwMGU5OiByZXR1cm4oKENIQVIpMjMzKTsKKyAgICAgIGNhc2UgMHgwMGViOiByZXR1cm4oKENIQVIpMjM1KTsKKyAgICAgIGNhc2UgMHgwMGVkOiByZXR1cm4oKENIQVIpMjM3KTsKKyAgICAgIGNhc2UgMHgwMGVlOiByZXR1cm4oKENIQVIpMjM4KTsKKyAgICAgIGNhc2UgMHgwMGVmOiByZXR1cm4oKENIQVIpMjM5KTsKKyAgICAgIGNhc2UgMHgwMGYwOiByZXR1cm4oKENIQVIpMjQwKTsKKyAgICAgIGNhc2UgMHgwMGYxOiByZXR1cm4oKENIQVIpMjQxKTsKKyAgICAgIGNhc2UgMHgwMGYzOiByZXR1cm4oKENIQVIpMjQzKTsKKyAgICAgIGNhc2UgMHgwMGY0OiByZXR1cm4oKENIQVIpMjQ0KTsKKyAgICAgIGNhc2UgMHgwMGY1OiByZXR1cm4oKENIQVIpMjQ1KTsKKyAgICAgIGNhc2UgMHgwMGY2OiByZXR1cm4oKENIQVIpMjQ2KTsKKyAgICAgIGNhc2UgMHgwMGY4OiByZXR1cm4oKENIQVIpMjQ4KTsKKyAgICAgIGNhc2UgMHgwMGZhOiByZXR1cm4oKENIQVIpMjUwKTsKKyAgICAgIGNhc2UgMHgwMGZiOiByZXR1cm4oKENIQVIpMjUxKTsKKyAgICAgIGNhc2UgMHgwMGZjOiByZXR1cm4oKENIQVIpMjUyKTsKKyAgICAgIGNhc2UgMHgwMGZkOiByZXR1cm4oKENIQVIpMjUzKTsKKyAgICAgIGNhc2UgMHgwMGZlOiByZXR1cm4oKENIQVIpMjU0KTsKKyAgICAgIGNhc2UgMHgwMTAwOiByZXR1cm4oKENIQVIpMTkyKTsKKyAgICAgIGNhc2UgMHgwMTAxOiByZXR1cm4oKENIQVIpMjI0KTsKKyAgICAgIGNhc2UgMHgwMTA0OiByZXR1cm4oKENIQVIpMTYxKTsKKyAgICAgIGNhc2UgMHgwMTA1OiByZXR1cm4oKENIQVIpMTc3KTsKKyAgICAgIGNhc2UgMHgwMTBjOiByZXR1cm4oKENIQVIpMjAwKTsKKyAgICAgIGNhc2UgMHgwMTBkOiByZXR1cm4oKENIQVIpMjMyKTsKKyAgICAgIGNhc2UgMHgwMTEwOiByZXR1cm4oKENIQVIpMjA4KTsKKyAgICAgIGNhc2UgMHgwMTExOiByZXR1cm4oKENIQVIpMTc2KTsKKyAgICAgIGNhc2UgMHgwMTEyOiByZXR1cm4oKENIQVIpMTYyKTsKKyAgICAgIGNhc2UgMHgwMTEzOiByZXR1cm4oKENIQVIpMTc4KTsKKyAgICAgIGNhc2UgMHgwMTE2OiByZXR1cm4oKENIQVIpMjA0KTsKKyAgICAgIGNhc2UgMHgwMTE3OiByZXR1cm4oKENIQVIpMjM2KTsKKyAgICAgIGNhc2UgMHgwMTE4OiByZXR1cm4oKENIQVIpMjAyKTsKKyAgICAgIGNhc2UgMHgwMTE5OiByZXR1cm4oKENIQVIpMjM0KTsKKyAgICAgIGNhc2UgMHgwMTIyOiByZXR1cm4oKENIQVIpMTYzKTsKKyAgICAgIGNhc2UgMHgwMTIzOiByZXR1cm4oKENIQVIpMTc5KTsKKyAgICAgIGNhc2UgMHgwMTI4OiByZXR1cm4oKENIQVIpMTY1KTsKKyAgICAgIGNhc2UgMHgwMTI5OiByZXR1cm4oKENIQVIpMTgxKTsKKyAgICAgIGNhc2UgMHgwMTJhOiByZXR1cm4oKENIQVIpMTY0KTsKKyAgICAgIGNhc2UgMHgwMTJiOiByZXR1cm4oKENIQVIpMTgwKTsKKyAgICAgIGNhc2UgMHgwMTJlOiByZXR1cm4oKENIQVIpMTk5KTsKKyAgICAgIGNhc2UgMHgwMTJmOiByZXR1cm4oKENIQVIpMjMxKTsKKyAgICAgIGNhc2UgMHgwMTM2OiByZXR1cm4oKENIQVIpMTY2KTsKKyAgICAgIGNhc2UgMHgwMTM3OiByZXR1cm4oKENIQVIpMTgyKTsKKyAgICAgIGNhc2UgMHgwMTM4OiByZXR1cm4oKENIQVIpMTc0KTsKKyAgICAgIGNhc2UgMHgwMTNiOiByZXR1cm4oKENIQVIpMTY3KTsKKyAgICAgIGNhc2UgMHgwMTNjOiByZXR1cm4oKENIQVIpMTgzKTsKKyAgICAgIGNhc2UgMHgwMTQzOiByZXR1cm4oKENIQVIpMTY4KTsKKyAgICAgIGNhc2UgMHgwMTQ0OiByZXR1cm4oKENIQVIpMTg0KTsKKyAgICAgIGNhc2UgMHgwMTQ1OiByZXR1cm4oKENIQVIpMjA5KTsKKyAgICAgIGNhc2UgMHgwMTRhOiByZXR1cm4oKENIQVIpMTc1KTsKKyAgICAgIGNhc2UgMHgwMTRiOiByZXR1cm4oKENIQVIpMTkxKTsKKyAgICAgIGNhc2UgMHgwMTRjOiByZXR1cm4oKENIQVIpMjEwKTsKKyAgICAgIGNhc2UgMHgwMTRkOiByZXR1cm4oKENIQVIpMjQyKTsKKyAgICAgIGNhc2UgMHgwMTU2OiByZXR1cm4oKENIQVIpMTY5KTsKKyAgICAgIGNhc2UgMHgwMTU3OiByZXR1cm4oKENIQVIpMTg1KTsKKyAgICAgIGNhc2UgMHgwMTYwOiByZXR1cm4oKENIQVIpMTcwKTsKKyAgICAgIGNhc2UgMHgwMTYxOiByZXR1cm4oKENIQVIpMTg2KTsKKyAgICAgIGNhc2UgMHgwMTY2OiByZXR1cm4oKENIQVIpMTcxKTsKKyAgICAgIGNhc2UgMHgwMTY3OiByZXR1cm4oKENIQVIpMTg3KTsKKyAgICAgIGNhc2UgMHgwMTY4OiByZXR1cm4oKENIQVIpMjE1KTsKKyAgICAgIGNhc2UgMHgwMTY5OiByZXR1cm4oKENIQVIpMjQ3KTsKKyAgICAgIGNhc2UgMHgwMTZhOiByZXR1cm4oKENIQVIpMjIzKTsKKyAgICAgIGNhc2UgMHgwMTZiOiByZXR1cm4oKENIQVIpMjU1KTsKKyAgICAgIGNhc2UgMHgwMTcyOiByZXR1cm4oKENIQVIpMjE3KTsKKyAgICAgIGNhc2UgMHgwMTczOiByZXR1cm4oKENIQVIpMjQ5KTsKKyAgICAgIGNhc2UgMHgwMTdkOiByZXR1cm4oKENIQVIpMTcyKTsKKyAgICAgIGNhc2UgMHgwMTdlOiByZXR1cm4oKENIQVIpMTg4KTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9pZGVudChjKSk7CisgICAgfQorfQorCisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJU08gODg1OS0xNSBMYXRpbi05ICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4Xzg4NTlfMTUoVVNIT1JUIGMpCisjZWxzZQordHhfODg1OV8xNShjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHhhMCkKKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2goYykgeworICAgICAgY2FzZSAweDIwQUM6IHJldHVybigoQ0hBUikweEE0KTsgIC8qIERpZmZlcnMgZnJvbSBMYXRpbi0xIGluICovCisgICAgICBjYXNlIDB4MDE2MDogcmV0dXJuKChDSEFSKTB4QUMpOyAgLyogb25seSBlaWdodCBwbGFjZXMgKi8KKyAgICAgIGNhc2UgMHgwMTYxOiByZXR1cm4oKENIQVIpMHhBOCk7CisgICAgICBjYXNlIDB4MDE3RDogcmV0dXJuKChDSEFSKTB4QjQpOworICAgICAgY2FzZSAweDAxN0U6IHJldHVybigoQ0hBUikweEI4KTsKKyAgICAgIGNhc2UgMHgwMTUyOiByZXR1cm4oKENIQVIpMHhCQyk7CisgICAgICBjYXNlIDB4MDE1MzogcmV0dXJuKChDSEFSKTB4QkQpOworICAgICAgY2FzZSAweDAxNzg6IHJldHVybigoQ0hBUikweEJFKTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9pZGVudChjKSk7CisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT2xkIEtPSS04IChFQ01BIDExMyBGaXJzdCBFZC4pICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X2tvaTgoVVNIT1JUIGMpCisjZWxzZQordHhfa29pOChjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHhhMCkKKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2goYykgeworICAgICAgY2FzZSAweDA0MTA6IHJldHVybigoQ0hBUikoMjI1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTE6IHJldHVybigoQ0hBUikoMjI2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTI6IHJldHVybigoQ0hBUikoMjQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTM6IHJldHVybigoQ0hBUikoMjMxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTQ6IHJldHVybigoQ0hBUikoMjI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTU6IHJldHVybigoQ0hBUikoMjI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTY6IHJldHVybigoQ0hBUikoMjQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTc6IHJldHVybigoQ0hBUikoMjUwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTg6IHJldHVybigoQ0hBUikoMjMzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTk6IHJldHVybigoQ0hBUikoMjM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MWE6IHJldHVybigoQ0hBUikoMjM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MWI6IHJldHVybigoQ0hBUikoMjM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MWM6IHJldHVybigoQ0hBUikoMjM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MWQ6IHJldHVybigoQ0hBUikoMjM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MWU6IHJldHVybigoQ0hBUikoMjM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MWY6IHJldHVybigoQ0hBUikoMjQwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjA6IHJldHVybigoQ0hBUikoMjQyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjE6IHJldHVybigoQ0hBUikoMjQzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjI6IHJldHVybigoQ0hBUikoMjQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjM6IHJldHVybigoQ0hBUikoMjQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjQ6IHJldHVybigoQ0hBUikoMjMwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjU6IHJldHVybigoQ0hBUikoMjMyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjY6IHJldHVybigoQ0hBUikoMjI3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mjc6IHJldHVybigoQ0hBUikoMjU0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mjg6IHJldHVybigoQ0hBUikoMjUxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mjk6IHJldHVybigoQ0hBUikoMjUzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MmI6IHJldHVybigoQ0hBUikoMjQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MmM6IHJldHVybigoQ0hBUikoMjQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MmQ6IHJldHVybigoQ0hBUikoMjUyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MmU6IHJldHVybigoQ0hBUikoMjI0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MmY6IHJldHVybigoQ0hBUikoMjQxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzA6IHJldHVybigoQ0hBUikoMTkzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzE6IHJldHVybigoQ0hBUikoMTk0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzI6IHJldHVybigoQ0hBUikoMjE1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzM6IHJldHVybigoQ0hBUikoMTk5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzQ6IHJldHVybigoQ0hBUikoMTk2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzU6IHJldHVybigoQ0hBUikoMTk3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzY6IHJldHVybigoQ0hBUikoMjE0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mzc6IHJldHVybigoQ0hBUikoMjE4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mzg6IHJldHVybigoQ0hBUikoMjAxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mzk6IHJldHVybigoQ0hBUikoMjAyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M2E6IHJldHVybigoQ0hBUikoMjAzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M2I6IHJldHVybigoQ0hBUikoMjA0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M2M6IHJldHVybigoQ0hBUikoMjA1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M2Q6IHJldHVybigoQ0hBUikoMjA2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M2U6IHJldHVybigoQ0hBUikoMjA3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M2Y6IHJldHVybigoQ0hBUikoMjA4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDA6IHJldHVybigoQ0hBUikoMjEwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDE6IHJldHVybigoQ0hBUikoMjExICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDI6IHJldHVybigoQ0hBUikoMjEyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDM6IHJldHVybigoQ0hBUikoMjEzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDQ6IHJldHVybigoQ0hBUikoMTk4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDU6IHJldHVybigoQ0hBUikoMjAwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDY6IHJldHVybigoQ0hBUikoMTk1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDc6IHJldHVybigoQ0hBUikoMjIyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDg6IHJldHVybigoQ0hBUikoMjE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDk6IHJldHVybigoQ0hBUikoMjIxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NGE6IHJldHVybigoQ0hBUikoMjIzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NGI6IHJldHVybigoQ0hBUikoMjE3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NGM6IHJldHVybigoQ0hBUikoMjE2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NGQ6IHJldHVybigoQ0hBUikoMjIwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NGU6IHJldHVybigoQ0hBUikoMTkyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NGY6IHJldHVybigoQ0hBUikoMjA5ICYgMHhmZikpOworICAgICAgZGVmYXVsdDogcmV0dXJuKHR4X2lkZW50KGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVQ1MtMiB0byBLT0k4LVIgKFJ1c3NpYSkgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfa29pOHIoVVNIT1JUIGMpCisjZWxzZQordHhfa29pOHIoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4MDBBMCkKKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2goYykgeworICAgICAgY2FzZSAweDAwQTA6IHJldHVybigoQ0hBUikoMTU0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQTk6IHJldHVybigoQ0hBUikoMTkxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQjA6IHJldHVybigoQ0hBUikoMTU2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQjI6IHJldHVybigoQ0hBUikoMTU3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQjc6IHJldHVybigoQ0hBUikoMTU4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwRjc6IHJldHVybigoQ0hBUikoMTU5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MDE6IHJldHVybigoQ0hBUikoMTc5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTA6IHJldHVybigoQ0hBUikoMjI1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTE6IHJldHVybigoQ0hBUikoMjI2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTI6IHJldHVybigoQ0hBUikoMjQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTM6IHJldHVybigoQ0hBUikoMjMxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTQ6IHJldHVybigoQ0hBUikoMjI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTU6IHJldHVybigoQ0hBUikoMjI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTY6IHJldHVybigoQ0hBUikoMjQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTc6IHJldHVybigoQ0hBUikoMjUwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTg6IHJldHVybigoQ0hBUikoMjMzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTk6IHJldHVybigoQ0hBUikoMjM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MUE6IHJldHVybigoQ0hBUikoMjM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MUI6IHJldHVybigoQ0hBUikoMjM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MUM6IHJldHVybigoQ0hBUikoMjM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MUQ6IHJldHVybigoQ0hBUikoMjM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MUU6IHJldHVybigoQ0hBUikoMjM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MUY6IHJldHVybigoQ0hBUikoMjQwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjA6IHJldHVybigoQ0hBUikoMjQyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjE6IHJldHVybigoQ0hBUikoMjQzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjI6IHJldHVybigoQ0hBUikoMjQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjM6IHJldHVybigoQ0hBUikoMjQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjQ6IHJldHVybigoQ0hBUikoMjMwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjU6IHJldHVybigoQ0hBUikoMjMyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjY6IHJldHVybigoQ0hBUikoMjI3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mjc6IHJldHVybigoQ0hBUikoMjU0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mjg6IHJldHVybigoQ0hBUikoMjUxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mjk6IHJldHVybigoQ0hBUikoMjUzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MkE6IHJldHVybigoQ0hBUikoMjU1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MkI6IHJldHVybigoQ0hBUikoMjQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MkM6IHJldHVybigoQ0hBUikoMjQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MkQ6IHJldHVybigoQ0hBUikoMjUyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MkU6IHJldHVybigoQ0hBUikoMjI0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MkY6IHJldHVybigoQ0hBUikoMjQxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzA6IHJldHVybigoQ0hBUikoMTkzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzE6IHJldHVybigoQ0hBUikoMTk0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzI6IHJldHVybigoQ0hBUikoMjE1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzM6IHJldHVybigoQ0hBUikoMTk5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzQ6IHJldHVybigoQ0hBUikoMTk2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzU6IHJldHVybigoQ0hBUikoMTk3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzY6IHJldHVybigoQ0hBUikoMjE0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mzc6IHJldHVybigoQ0hBUikoMjE4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mzg6IHJldHVybigoQ0hBUikoMjAxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mzk6IHJldHVybigoQ0hBUikoMjAyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M0E6IHJldHVybigoQ0hBUikoMjAzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M0I6IHJldHVybigoQ0hBUikoMjA0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M0M6IHJldHVybigoQ0hBUikoMjA1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M0Q6IHJldHVybigoQ0hBUikoMjA2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M0U6IHJldHVybigoQ0hBUikoMjA3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M0Y6IHJldHVybigoQ0hBUikoMjA4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDA6IHJldHVybigoQ0hBUikoMjEwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDE6IHJldHVybigoQ0hBUikoMjExICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDI6IHJldHVybigoQ0hBUikoMjEyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDM6IHJldHVybigoQ0hBUikoMjEzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDQ6IHJldHVybigoQ0hBUikoMTk4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDU6IHJldHVybigoQ0hBUikoMjAwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDY6IHJldHVybigoQ0hBUikoMTk1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDc6IHJldHVybigoQ0hBUikoMjIyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDg6IHJldHVybigoQ0hBUikoMjE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDk6IHJldHVybigoQ0hBUikoMjIxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NEE6IHJldHVybigoQ0hBUikoMjIzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NEI6IHJldHVybigoQ0hBUikoMjE3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NEM6IHJldHVybigoQ0hBUikoMjE2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NEQ6IHJldHVybigoQ0hBUikoMjIwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NEU6IHJldHVybigoQ0hBUikoMTkyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NEY6IHJldHVybigoQ0hBUikoMjA5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NTE6IHJldHVybigoQ0hBUikoMTYzICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMTk6IHJldHVybigoQ0hBUikoMTQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMUE6IHJldHVybigoQ0hBUikoMTUwICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNDg6IHJldHVybigoQ0hBUikoMTUxICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjQ6IHJldHVybigoQ0hBUikoMTUyICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjU6IHJldHVybigoQ0hBUikoMTUzICYgMHhmZikpOworICAgICAgY2FzZSAweDIzMjA6IHJldHVybigoQ0hBUikoMTQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDIzMjE6IHJldHVybigoQ0hBUikoMTU1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MDA6IHJldHVybigoQ0hBUikoMTI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MDI6IHJldHVybigoQ0hBUikoMTI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MEM6IHJldHVybigoQ0hBUikoMTMwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTA6IHJldHVybigoQ0hBUikoMTMxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTQ6IHJldHVybigoQ0hBUikoMTMyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTg6IHJldHVybigoQ0hBUikoMTMzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MUM6IHJldHVybigoQ0hBUikoMTM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MjQ6IHJldHVybigoQ0hBUikoMTM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MkM6IHJldHVybigoQ0hBUikoMTM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MzQ6IHJldHVybigoQ0hBUikoMTM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1M0M6IHJldHVybigoQ0hBUikoMTM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTA6IHJldHVybigoQ0hBUikoMTYwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTE6IHJldHVybigoQ0hBUikoMTYxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTI6IHJldHVybigoQ0hBUikoMTYyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTM6IHJldHVybigoQ0hBUikoMTY0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTQ6IHJldHVybigoQ0hBUikoMTY1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTU6IHJldHVybigoQ0hBUikoMTY2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTY6IHJldHVybigoQ0hBUikoMTY3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTc6IHJldHVybigoQ0hBUikoMTY4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTg6IHJldHVybigoQ0hBUikoMTY5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTk6IHJldHVybigoQ0hBUikoMTcwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NUE6IHJldHVybigoQ0hBUikoMTcxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NUI6IHJldHVybigoQ0hBUikoMTcyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NUM6IHJldHVybigoQ0hBUikoMTczICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NUQ6IHJldHVybigoQ0hBUikoMTc0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NUU6IHJldHVybigoQ0hBUikoMTc1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NUY6IHJldHVybigoQ0hBUikoMTc2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjA6IHJldHVybigoQ0hBUikoMTc3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjE6IHJldHVybigoQ0hBUikoMTc4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjI6IHJldHVybigoQ0hBUikoMTgwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjM6IHJldHVybigoQ0hBUikoMTgxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjQ6IHJldHVybigoQ0hBUikoMTgyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjU6IHJldHVybigoQ0hBUikoMTgzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjY6IHJldHVybigoQ0hBUikoMTg0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1Njc6IHJldHVybigoQ0hBUikoMTg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1Njg6IHJldHVybigoQ0hBUikoMTg2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1Njk6IHJldHVybigoQ0hBUikoMTg3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NkE6IHJldHVybigoQ0hBUikoMTg4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NkI6IHJldHVybigoQ0hBUikoMTg5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NkM6IHJldHVybigoQ0hBUikoMTkwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODA6IHJldHVybigoQ0hBUikoMTM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODQ6IHJldHVybigoQ0hBUikoMTQwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODg6IHJldHVybigoQ0hBUikoMTQxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OEM6IHJldHVybigoQ0hBUikoMTQyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTA6IHJldHVybigoQ0hBUikoMTQzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTE6IHJldHVybigoQ0hBUikoMTQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTI6IHJldHVybigoQ0hBUikoMTQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTM6IHJldHVybigoQ0hBUikoMTQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1QTA6IHJldHVybigoQ0hBUikoMTQ4ICYgMHhmZikpOworICAgICAgZGVmYXVsdDogcmV0dXJuKHR4X2lkZW50KGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBLT0k4LVUgKFVrcmFpbmUpICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X2tvaTh1KFVTSE9SVCBjKQorI2Vsc2UKK3R4X2tvaTh1KGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPCAweGEwKQorICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDB4MDBBMDogcmV0dXJuKChDSEFSKSgxNTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBOTogcmV0dXJuKChDSEFSKSgxOTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCMDogcmV0dXJuKChDSEFSKSgxNTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCMjogcmV0dXJuKChDSEFSKSgxNTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCNzogcmV0dXJuKChDSEFSKSgxNTggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBGNzogcmV0dXJuKChDSEFSKSgxNTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQwMTogcmV0dXJuKChDSEFSKSgxNzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQwNDogcmV0dXJuKChDSEFSKSgxODAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQwNjogcmV0dXJuKChDSEFSKSgxODIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQwNzogcmV0dXJuKChDSEFSKSgxODMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxMDogcmV0dXJuKChDSEFSKSgyMjUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxMTogcmV0dXJuKChDSEFSKSgyMjYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxMjogcmV0dXJuKChDSEFSKSgyNDcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxMzogcmV0dXJuKChDSEFSKSgyMzEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxNDogcmV0dXJuKChDSEFSKSgyMjggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxNTogcmV0dXJuKChDSEFSKSgyMjkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxNjogcmV0dXJuKChDSEFSKSgyNDYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxNzogcmV0dXJuKChDSEFSKSgyNTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxODogcmV0dXJuKChDSEFSKSgyMzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxOTogcmV0dXJuKChDSEFSKSgyMzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxQTogcmV0dXJuKChDSEFSKSgyMzUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxQjogcmV0dXJuKChDSEFSKSgyMzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxQzogcmV0dXJuKChDSEFSKSgyMzcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxRDogcmV0dXJuKChDSEFSKSgyMzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxRTogcmV0dXJuKChDSEFSKSgyMzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxRjogcmV0dXJuKChDSEFSKSgyNDAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyMDogcmV0dXJuKChDSEFSKSgyNDIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyMTogcmV0dXJuKChDSEFSKSgyNDMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyMjogcmV0dXJuKChDSEFSKSgyNDQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyMzogcmV0dXJuKChDSEFSKSgyNDUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyNDogcmV0dXJuKChDSEFSKSgyMzAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyNTogcmV0dXJuKChDSEFSKSgyMzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyNjogcmV0dXJuKChDSEFSKSgyMjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyNzogcmV0dXJuKChDSEFSKSgyNTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyODogcmV0dXJuKChDSEFSKSgyNTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyOTogcmV0dXJuKChDSEFSKSgyNTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyQTogcmV0dXJuKChDSEFSKSgyNTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyQjogcmV0dXJuKChDSEFSKSgyNDkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyQzogcmV0dXJuKChDSEFSKSgyNDggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyRDogcmV0dXJuKChDSEFSKSgyNTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyRTogcmV0dXJuKChDSEFSKSgyMjQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyRjogcmV0dXJuKChDSEFSKSgyNDEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzMDogcmV0dXJuKChDSEFSKSgxOTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzMTogcmV0dXJuKChDSEFSKSgxOTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzMjogcmV0dXJuKChDSEFSKSgyMTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzMzogcmV0dXJuKChDSEFSKSgxOTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzNDogcmV0dXJuKChDSEFSKSgxOTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzNTogcmV0dXJuKChDSEFSKSgxOTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzNjogcmV0dXJuKChDSEFSKSgyMTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzNzogcmV0dXJuKChDSEFSKSgyMTggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzODogcmV0dXJuKChDSEFSKSgyMDEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzOTogcmV0dXJuKChDSEFSKSgyMDIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzQTogcmV0dXJuKChDSEFSKSgyMDMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzQjogcmV0dXJuKChDSEFSKSgyMDQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzQzogcmV0dXJuKChDSEFSKSgyMDUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzRDogcmV0dXJuKChDSEFSKSgyMDYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzRTogcmV0dXJuKChDSEFSKSgyMDcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzRjogcmV0dXJuKChDSEFSKSgyMDggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0MDogcmV0dXJuKChDSEFSKSgyMTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0MTogcmV0dXJuKChDSEFSKSgyMTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0MjogcmV0dXJuKChDSEFSKSgyMTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0MzogcmV0dXJuKChDSEFSKSgyMTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0NDogcmV0dXJuKChDSEFSKSgxOTggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0NTogcmV0dXJuKChDSEFSKSgyMDAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0NjogcmV0dXJuKChDSEFSKSgxOTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0NzogcmV0dXJuKChDSEFSKSgyMjIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0ODogcmV0dXJuKChDSEFSKSgyMTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0OTogcmV0dXJuKChDSEFSKSgyMjEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0QTogcmV0dXJuKChDSEFSKSgyMjMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0QjogcmV0dXJuKChDSEFSKSgyMTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0QzogcmV0dXJuKChDSEFSKSgyMTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0RDogcmV0dXJuKChDSEFSKSgyMjAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0RTogcmV0dXJuKChDSEFSKSgxOTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0RjogcmV0dXJuKChDSEFSKSgyMDkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ1MTogcmV0dXJuKChDSEFSKSgxNjMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ1NDogcmV0dXJuKChDSEFSKSgxNjQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ1NjogcmV0dXJuKChDSEFSKSgxNjYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ1NzogcmV0dXJuKChDSEFSKSgxNjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ5MDogcmV0dXJuKChDSEFSKSgxODkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ5MTogcmV0dXJuKChDSEFSKSgxNzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjIxOTogcmV0dXJuKChDSEFSKSgxNDkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjIxQTogcmV0dXJuKChDSEFSKSgxNTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjI0ODogcmV0dXJuKChDSEFSKSgxNTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjI2NDogcmV0dXJuKChDSEFSKSgxNTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjI2NTogcmV0dXJuKChDSEFSKSgxNTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjMyMDogcmV0dXJuKChDSEFSKSgxNDcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjMyMTogcmV0dXJuKChDSEFSKSgxNTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUwMDogcmV0dXJuKChDSEFSKSgxMjggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUwMjogcmV0dXJuKChDSEFSKSgxMjkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUwQzogcmV0dXJuKChDSEFSKSgxMzAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxMDogcmV0dXJuKChDSEFSKSgxMzEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxNDogcmV0dXJuKChDSEFSKSgxMzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxODogcmV0dXJuKChDSEFSKSgxMzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxQzogcmV0dXJuKChDSEFSKSgxMzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUyNDogcmV0dXJuKChDSEFSKSgxMzUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUyQzogcmV0dXJuKChDSEFSKSgxMzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUzNDogcmV0dXJuKChDSEFSKSgxMzcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUzQzogcmV0dXJuKChDSEFSKSgxMzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1MDogcmV0dXJuKChDSEFSKSgxNjAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1MTogcmV0dXJuKChDSEFSKSgxNjEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1MjogcmV0dXJuKChDSEFSKSgxNjIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1NDogcmV0dXJuKChDSEFSKSgxNjUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1NzogcmV0dXJuKChDSEFSKSgxNjggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1ODogcmV0dXJuKChDSEFSKSgxNjkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1OTogcmV0dXJuKChDSEFSKSgxNzAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1QTogcmV0dXJuKChDSEFSKSgxNzEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1QjogcmV0dXJuKChDSEFSKSgxNzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1RDogcmV0dXJuKChDSEFSKSgxNzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1RTogcmV0dXJuKChDSEFSKSgxNzUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1RjogcmV0dXJuKChDSEFSKSgxNzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2MDogcmV0dXJuKChDSEFSKSgxNzcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2MTogcmV0dXJuKChDSEFSKSgxNzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2MzogcmV0dXJuKChDSEFSKSgxODEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2NjogcmV0dXJuKChDSEFSKSgxODQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2NzogcmV0dXJuKChDSEFSKSgxODUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2ODogcmV0dXJuKChDSEFSKSgxODYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2OTogcmV0dXJuKChDSEFSKSgxODcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2QTogcmV0dXJuKChDSEFSKSgxODggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2QzogcmV0dXJuKChDSEFSKSgxOTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4MDogcmV0dXJuKChDSEFSKSgxMzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4NDogcmV0dXJuKChDSEFSKSgxNDAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4ODogcmV0dXJuKChDSEFSKSgxNDEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4QzogcmV0dXJuKChDSEFSKSgxNDIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU5MDogcmV0dXJuKChDSEFSKSgxNDMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU5MTogcmV0dXJuKChDSEFSKSgxNDQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU5MjogcmV0dXJuKChDSEFSKSgxNDUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU5MzogcmV0dXJuKChDSEFSKSgxNDYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjVBMDogcmV0dXJuKChDSEFSKSgxNDggJiAweGZmKSk7CisgICAgICBkZWZhdWx0OiByZXR1cm4odHhfaWRlbnQoYykpOworICAgIH0KK30KKworCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogREVDIE1DUyAqLworI2lmZGVmIENLX0FOU0lDCit0eF9kZWNtY3MoVVNIT1JUIGMpCisjZWxzZQordHhfZGVjbWNzKGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPCAweGEwKQorICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDB4MDBhNjoKKyAgICAgIGNhc2UgMHgwMGE4OgorICAgICAgY2FzZSAweDAwYWM6CisgICAgICBjYXNlIDB4MDBhZToKKyAgICAgIGNhc2UgMHgwMGFmOgorICAgICAgY2FzZSAweDAwYjQ6CisgICAgICBjYXNlIDB4MDBiODoKKyAgICAgIGNhc2UgMHgwMGJlOgorICAgICAgY2FzZSAweDAwZDA6CisgICAgICBjYXNlIDB4MDBkZToKKyAgICAgIGNhc2UgMHgwMGYwOgorICAgICAgY2FzZSAweDAwZmU6CisgICAgICBjYXNlIDB4MDBmZjoKKyAgICAgICAgcmV0dXJuKC0xKTsgICAgICAgICAgICAgICAgICAgICAvKiBUaGVzZSBhcmUgYWxsIHVuZGVmaW5lZCBpbiBERUNNQ1MgKi8KKyAgICAgIGNhc2UgMHgwMGE0OiAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW5jeSBzaWduICovCisgICAgICAgIHJldHVybigoQ0hBUikweGE4KTsKKyAgICAgIGNhc2UgMHgwMTUyOiAgICAgICAgICAgICAgICAgICAgICAvKiBPRSAqLworICAgICAgICByZXR1cm4oKENIQVIpMHhkNyk7CisgICAgICBjYXNlIDB4MDE1MzogICAgICAgICAgICAgICAgICAgICAgLyogb2UgKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKTB4ZjcpOworICAgICAgZGVmYXVsdDogcmV0dXJuKHR4X2lkZW50KGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZVhUU1RFUCAqLworI2lmZGVmIENLX0FOU0lDCit0eF9uZXh0c3RlcChVU0hPUlQgYykKKyNlbHNlCit0eF9uZXh0c3RlcChjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHg4MCkgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhcyBDMSBncmFwaGljcyAqLworICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDAwYTA6IHJldHVybigoQ0hBUikoMTI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTE6IHJldHVybigoQ0hBUikoMTYxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTI6IHJldHVybigoQ0hBUikoMTYyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTM6IHJldHVybigoQ0hBUikoMTYzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTQ6IHJldHVybigoQ0hBUikoMTY4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTU6IHJldHVybigoQ0hBUikoMTY1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTY6IHJldHVybigoQ0hBUikoMTgxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTc6IHJldHVybigoQ0hBUikoMTY3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTg6IHJldHVybigoQ0hBUikoMjAwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTk6IHJldHVybigoQ0hBUikoMTYwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWE6IHJldHVybigoQ0hBUikoMjI3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWI6IHJldHVybigoQ0hBUikoMTcxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWM6IHJldHVybigoQ0hBUikoMTkwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWU6IHJldHVybigoQ0hBUikoMTc2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWY6IHJldHVybigoQ0hBUikoMTk3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjE6IHJldHVybigoQ0hBUikoMjA5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjI6IHJldHVybigoQ0hBUikoMjAxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjM6IHJldHVybigoQ0hBUikoMjA0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjQ6IHJldHVybigoQ0hBUikoMTk0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjU6IHJldHVybigoQ0hBUikoMTU3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjY6IHJldHVybigoQ0hBUikoMTgyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjc6IHJldHVybigoQ0hBUikoMTgwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjg6IHJldHVybigoQ0hBUikoMjAzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjk6IHJldHVybigoQ0hBUikoMTkyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmE6IHJldHVybigoQ0hBUikoMjM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmI6IHJldHVybigoQ0hBUikoMTg3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmM6IHJldHVybigoQ0hBUikoMjEwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmQ6IHJldHVybigoQ0hBUikoMjExICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmU6IHJldHVybigoQ0hBUikoMjEyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmY6IHJldHVybigoQ0hBUikoMTkxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzA6IHJldHVybigoQ0hBUikoMTI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzE6IHJldHVybigoQ0hBUikoMTMwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzI6IHJldHVybigoQ0hBUikoMTMxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzM6IHJldHVybigoQ0hBUikoMTMyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzQ6IHJldHVybigoQ0hBUikoMTMzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzU6IHJldHVybigoQ0hBUikoMTM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzY6IHJldHVybigoQ0hBUikoMjI1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzc6IHJldHVybigoQ0hBUikoMTM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzg6IHJldHVybigoQ0hBUikoMTM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzk6IHJldHVybigoQ0hBUikoMTM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2E6IHJldHVybigoQ0hBUikoMTM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2I6IHJldHVybigoQ0hBUikoMTM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2M6IHJldHVybigoQ0hBUikoMTQwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2Q6IHJldHVybigoQ0hBUikoMTQxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2U6IHJldHVybigoQ0hBUikoMTQyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2Y6IHJldHVybigoQ0hBUikoMTQzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDA6IHJldHVybigoQ0hBUikoMTQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDE6IHJldHVybigoQ0hBUikoMTQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDI6IHJldHVybigoQ0hBUikoMTQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDM6IHJldHVybigoQ0hBUikoMTQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDQ6IHJldHVybigoQ0hBUikoMTQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDU6IHJldHVybigoQ0hBUikoMTQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDY6IHJldHVybigoQ0hBUikoMTUwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDc6IHJldHVybigoQ0hBUikoMTU4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDg6IHJldHVybigoQ0hBUikoMjMzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDk6IHJldHVybigoQ0hBUikoMTUxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGE6IHJldHVybigoQ0hBUikoMTUyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGI6IHJldHVybigoQ0hBUikoMTUzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGM6IHJldHVybigoQ0hBUikoMTU0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGQ6IHJldHVybigoQ0hBUikoMTU1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGU6IHJldHVybigoQ0hBUikoMTU2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGY6IHJldHVybigoQ0hBUikoMjUxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTA6IHJldHVybigoQ0hBUikoMjEzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTE6IHJldHVybigoQ0hBUikoMjE0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTI6IHJldHVybigoQ0hBUikoMjE1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTM6IHJldHVybigoQ0hBUikoMjE2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTQ6IHJldHVybigoQ0hBUikoMjE3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTU6IHJldHVybigoQ0hBUikoMjE4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTY6IHJldHVybigoQ0hBUikoMjQxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTc6IHJldHVybigoQ0hBUikoMjE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTg6IHJldHVybigoQ0hBUikoMjIwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTk6IHJldHVybigoQ0hBUikoMjIxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWE6IHJldHVybigoQ0hBUikoMjIyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWI6IHJldHVybigoQ0hBUikoMjIzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWM6IHJldHVybigoQ0hBUikoMjI0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWQ6IHJldHVybigoQ0hBUikoMjI2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWU6IHJldHVybigoQ0hBUikoMjI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWY6IHJldHVybigoQ0hBUikoMjI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjA6IHJldHVybigoQ0hBUikoMjMwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjE6IHJldHVybigoQ0hBUikoMjMxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjI6IHJldHVybigoQ0hBUikoMjM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjM6IHJldHVybigoQ0hBUikoMjM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjQ6IHJldHVybigoQ0hBUikoMjM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjU6IHJldHVybigoQ0hBUikoMjM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjY6IHJldHVybigoQ0hBUikoMjQwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjc6IHJldHVybigoQ0hBUikoMTU5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjg6IHJldHVybigoQ0hBUikoMjQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjk6IHJldHVybigoQ0hBUikoMjQyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmE6IHJldHVybigoQ0hBUikoMjQzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmI6IHJldHVybigoQ0hBUikoMjQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmM6IHJldHVybigoQ0hBUikoMjQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmQ6IHJldHVybigoQ0hBUikoMjQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmU6IHJldHVybigoQ0hBUikoMjUyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmY6IHJldHVybigoQ0hBUikoMjUzICYgMHhmZikpOworICAgICAgY2FzZSAweDAxMzE6IHJldHVybigoQ0hBUikoMjQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNDE6IHJldHVybigoQ0hBUikoMjMyICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNDI6IHJldHVybigoQ0hBUikoMjQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNTI6IHJldHVybigoQ0hBUikoMjM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNTM6IHJldHVybigoQ0hBUikoMjUwICYgMHhmZikpOworICAgICAgY2FzZSAweDAxOTI6IHJldHVybigoQ0hBUikoMTY2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyYzY6IHJldHVybigoQ0hBUikoMTk1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyYzc6IHJldHVybigoQ0hBUikoMjA3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyY2I6IHJldHVybigoQ0hBUikoMTkzICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZDg6IHJldHVybigoQ0hBUikoMTk4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZDk6IHJldHVybigoQ0hBUikoMTk5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZGE6IHJldHVybigoQ0hBUikoMjAyICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZGI6IHJldHVybigoQ0hBUikoMjA2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZGM6IHJldHVybigoQ0hBUikoMTk2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZGQ6IHJldHVybigoQ0hBUikoMjA1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTM6IHJldHVybigoQ0hBUikoMTc3ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTQ6IHJldHVybigoQ0hBUikoMjA4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTk6IHJldHVybigoQ0hBUikoMTY5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWE6IHJldHVybigoQ0hBUikoMTg0ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWM6IHJldHVybigoQ0hBUikoMTcwICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWQ6IHJldHVybigoQ0hBUikoMTg2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWU6IHJldHVybigoQ0hBUikoMTg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjA6IHJldHVybigoQ0hBUikoMTc4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjE6IHJldHVybigoQ0hBUikoMTc5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjI6IHJldHVybigoQ0hBUikoMTgzICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjY6IHJldHVybigoQ0hBUikoMTg4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMzA6IHJldHVybigoQ0hBUikoMTg5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMzk6IHJldHVybigoQ0hBUikoMTcyICYgMHhmZikpOworICAgICAgY2FzZSAweDIwM2E6IHJldHVybigoQ0hBUikoMTczICYgMHhmZikpOworICAgICAgY2FzZSAweDIwNDQ6IHJldHVybigoQ0hBUikoMTY0ICYgMHhmZikpOworICAgICAgY2FzZSAweGZiMDE6IHJldHVybigoQ0hBUikoMTc0ICYgMHhmZikpOworICAgICAgY2FzZSAweGZiMDI6IHJldHVybigoQ0hBUikoMTc1ICYgMHhmZikpOworICAgICAgZGVmYXVsdDogcmV0dXJuKHR4X3B1bmMoYykpOworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERHIEludGVybmF0aW9uYWwgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfZGdpKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2RnaShjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHhhMCkKKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2goYykgeworICAgICAgY2FzZSAweDAwYTA6IHJldHVybigoQ0hBUikoMTYwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTE6IHJldHVybigoQ0hBUikoMTcxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTI6IHJldHVybigoQ0hBUikoMTY3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTM6IHJldHVybigoQ0hBUikoMTY4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTQ6IHJldHVybigoQ0hBUikoMTY2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTU6IHJldHVybigoQ0hBUikoMTgxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTc6IHJldHVybigoQ0hBUikoMTg3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTg6IHJldHVybigoQ0hBUikoMTg5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTk6IHJldHVybigoQ0hBUikoMTczICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWE6IHJldHVybigoQ0hBUikoMTY5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWI6IHJldHVybigoQ0hBUikoMTc3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWM6IHJldHVybigoQ0hBUikoMTYxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWU6IHJldHVybigoQ0hBUikoMTc0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjA6IHJldHVybigoQ0hBUikoMTg4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjE6IHJldHVybigoQ0hBUikoMTgyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjI6IHJldHVybigoQ0hBUikoMTY0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjM6IHJldHVybigoQ0hBUikoMTY1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjQ6IHJldHVybigoQ0hBUikoMTkwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjU6IHJldHVybigoQ0hBUikoMTYzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjY6IHJldHVybigoQ0hBUikoMTc4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjc6IHJldHVybigoQ0hBUikoMTg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjg6IHJldHVybigoQ0hBUikoMTg2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmE6IHJldHVybigoQ0hBUikoMTcwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmI6IHJldHVybigoQ0hBUikoMTc2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmQ6IHJldHVybigoQ0hBUikoMTYyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmY6IHJldHVybigoQ0hBUikoMTcyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzA6IHJldHVybigoQ0hBUikoMTkzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzE6IHJldHVybigoQ0hBUikoMTkyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzI6IHJldHVybigoQ0hBUikoMTk0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzM6IHJldHVybigoQ0hBUikoMTk2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzQ6IHJldHVybigoQ0hBUikoMTk1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzU6IHJldHVybigoQ0hBUikoMTk3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzY6IHJldHVybigoQ0hBUikoMTk4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzc6IHJldHVybigoQ0hBUikoMTk5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzg6IHJldHVybigoQ0hBUikoMjAxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzk6IHJldHVybigoQ0hBUikoMjAwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2E6IHJldHVybigoQ0hBUikoMjAyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2I6IHJldHVybigoQ0hBUikoMjAzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2M6IHJldHVybigoQ0hBUikoMjA1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2Q6IHJldHVybigoQ0hBUikoMjA0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2U6IHJldHVybigoQ0hBUikoMjA2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2Y6IHJldHVybigoQ0hBUikoMjA3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDE6IHJldHVybigoQ0hBUikoMjA4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDI6IHJldHVybigoQ0hBUikoMjEwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDM6IHJldHVybigoQ0hBUikoMjA5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDQ6IHJldHVybigoQ0hBUikoMjExICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDU6IHJldHVybigoQ0hBUikoMjEzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDY6IHJldHVybigoQ0hBUikoMjEyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDg6IHJldHVybigoQ0hBUikoMjE0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDk6IHJldHVybigoQ0hBUikoMjE3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGE6IHJldHVybigoQ0hBUikoMjE2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGI6IHJldHVybigoQ0hBUikoMjE4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGM6IHJldHVybigoQ0hBUikoMjE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGY6IHJldHVybigoQ0hBUikoMjUyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTA6IHJldHVybigoQ0hBUikoMjI1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTE6IHJldHVybigoQ0hBUikoMjI0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTI6IHJldHVybigoQ0hBUikoMjI2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTM6IHJldHVybigoQ0hBUikoMjI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTQ6IHJldHVybigoQ0hBUikoMjI3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTU6IHJldHVybigoQ0hBUikoMjI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTY6IHJldHVybigoQ0hBUikoMjMwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTc6IHJldHVybigoQ0hBUikoMjMxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTg6IHJldHVybigoQ0hBUikoMjMzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTk6IHJldHVybigoQ0hBUikoMjMyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWE6IHJldHVybigoQ0hBUikoMjM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWI6IHJldHVybigoQ0hBUikoMjM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWM6IHJldHVybigoQ0hBUikoMjM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWQ6IHJldHVybigoQ0hBUikoMjM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWU6IHJldHVybigoQ0hBUikoMjM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWY6IHJldHVybigoQ0hBUikoMjM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjE6IHJldHVybigoQ0hBUikoMjQwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjI6IHJldHVybigoQ0hBUikoMjQyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjM6IHJldHVybigoQ0hBUikoMjQxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjQ6IHJldHVybigoQ0hBUikoMjQzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjU6IHJldHVybigoQ0hBUikoMjQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjY6IHJldHVybigoQ0hBUikoMjQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjg6IHJldHVybigoQ0hBUikoMjQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjk6IHJldHVybigoQ0hBUikoMjQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmE6IHJldHVybigoQ0hBUikoMjQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmI6IHJldHVybigoQ0hBUikoMjUwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmM6IHJldHVybigoQ0hBUikoMjUxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmY6IHJldHVybigoQ0hBUikoMjUzICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNTM6IHJldHVybigoQ0hBUikoMjQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNzg6IHJldHVybigoQ0hBUikoMjIxICYgMHhmZikpOworICAgICAgY2FzZSAweDAxOTI6IHJldHVybigoQ0hBUikoMTgwICYgMHhmZikpOworICAgICAgY2FzZSAweDAyNzY6IHJldHVybigoQ0hBUikoMjE1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjE6IHJldHVybigoQ0hBUikoMTc1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIxMjI6IHJldHVybigoQ0hBUikoMTc5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIxOTE6IHJldHVybigoQ0hBUikoMTkxICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjQ6IHJldHVybigoQ0hBUikoMTgzICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjU6IHJldHVybigoQ0hBUikoMTg0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODg6IHJldHVybigoQ0hBUikoMjU1ICYgMHhmZikpOworICAgICAgZGVmYXVsdDogcmV0dXJuKHR4X3B1bmMoYykpOworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY2ludG9zaCBMYXRpbiAqLworI2lmZGVmIENLX0FOU0lDCit0eF9tYWNsYXRpbihVU0hPUlQgYykKKyNlbHNlCit0eF9tYWNsYXRpbihjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHg4MCkgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhcyBDMSBncmFwaGljcyAqLworICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDAwYTA6IHJldHVybigoQ0hBUikoMjAyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTE6IHJldHVybigoQ0hBUikoMTkzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTI6IHJldHVybigoQ0hBUikoMTYyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTM6IHJldHVybigoQ0hBUikoMTYzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTQ6IHJldHVybigoQ0hBUikoMjE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTU6IHJldHVybigoQ0hBUikoMTgwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTc6IHJldHVybigoQ0hBUikoMTY0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTg6IHJldHVybigoQ0hBUikoMTcyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTk6IHJldHVybigoQ0hBUikoMTY5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWE6IHJldHVybigoQ0hBUikoMTg3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWI6IHJldHVybigoQ0hBUikoMTk5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWM6IHJldHVybigoQ0hBUikoMTk0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWU6IHJldHVybigoQ0hBUikoMTY4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWY6IHJldHVybigoQ0hBUikoMjQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjA6IHJldHVybigoQ0hBUikoMTYxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjE6IHJldHVybigoQ0hBUikoMTc3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjQ6IHJldHVybigoQ0hBUikoMTcxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjU6IHJldHVybigoQ0hBUikoMTgxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjY6IHJldHVybigoQ0hBUikoMTY2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjc6IHJldHVybigoQ0hBUikoMjI1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjg6IHJldHVybigoQ0hBUikoMjUyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmE6IHJldHVybigoQ0hBUikoMTg4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmI6IHJldHVybigoQ0hBUikoMjAwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmY6IHJldHVybigoQ0hBUikoMTkyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzA6IHJldHVybigoQ0hBUikoMjAzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzE6IHJldHVybigoQ0hBUikoMjMxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzI6IHJldHVybigoQ0hBUikoMjI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzM6IHJldHVybigoQ0hBUikoMjA0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzQ6IHJldHVybigoQ0hBUikoMTI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzU6IHJldHVybigoQ0hBUikoMTI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzY6IHJldHVybigoQ0hBUikoMTc0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzc6IHJldHVybigoQ0hBUikoMTMwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzg6IHJldHVybigoQ0hBUikoMjMzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzk6IHJldHVybigoQ0hBUikoMTMxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2E6IHJldHVybigoQ0hBUikoMjMwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2I6IHJldHVybigoQ0hBUikoMjMyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2M6IHJldHVybigoQ0hBUikoMjM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2Q6IHJldHVybigoQ0hBUikoMjM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2U6IHJldHVybigoQ0hBUikoMjM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2Y6IHJldHVybigoQ0hBUikoMjM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDA6IHJldHVybigoQ0hBUikoMjIwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDE6IHJldHVybigoQ0hBUikoMTMyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDI6IHJldHVybigoQ0hBUikoMjQxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDM6IHJldHVybigoQ0hBUikoMjM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDQ6IHJldHVybigoQ0hBUikoMjM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDU6IHJldHVybigoQ0hBUikoMjA1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDY6IHJldHVybigoQ0hBUikoMTMzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDg6IHJldHVybigoQ0hBUikoMTc1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDk6IHJldHVybigoQ0hBUikoMjQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGE6IHJldHVybigoQ0hBUikoMjQyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGI6IHJldHVybigoQ0hBUikoMjQzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGM6IHJldHVybigoQ0hBUikoMTM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGQ6IHJldHVybigoQ0hBUikoMTYwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGU6IHJldHVybigoQ0hBUikoMjIyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGY6IHJldHVybigoQ0hBUikoMTY3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTA6IHJldHVybigoQ0hBUikoMTM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTE6IHJldHVybigoQ0hBUikoMTM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTI6IHJldHVybigoQ0hBUikoMTM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTM6IHJldHVybigoQ0hBUikoMTM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTQ6IHJldHVybigoQ0hBUikoMTM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTU6IHJldHVybigoQ0hBUikoMTQwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTY6IHJldHVybigoQ0hBUikoMTkwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTc6IHJldHVybigoQ0hBUikoMTQxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTg6IHJldHVybigoQ0hBUikoMTQzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTk6IHJldHVybigoQ0hBUikoMTQyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWE6IHJldHVybigoQ0hBUikoMTQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWI6IHJldHVybigoQ0hBUikoMTQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWM6IHJldHVybigoQ0hBUikoMTQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWQ6IHJldHVybigoQ0hBUikoMTQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWU6IHJldHVybigoQ0hBUikoMTQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWY6IHJldHVybigoQ0hBUikoMTQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjA6IHJldHVybigoQ0hBUikoMjIxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjE6IHJldHVybigoQ0hBUikoMTUwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjI6IHJldHVybigoQ0hBUikoMTUyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjM6IHJldHVybigoQ0hBUikoMTUxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjQ6IHJldHVybigoQ0hBUikoMTUzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjU6IHJldHVybigoQ0hBUikoMTU1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjY6IHJldHVybigoQ0hBUikoMTU0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjc6IHJldHVybigoQ0hBUikoMjE0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjg6IHJldHVybigoQ0hBUikoMTkxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjk6IHJldHVybigoQ0hBUikoMTU3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmE6IHJldHVybigoQ0hBUikoMTU2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmI6IHJldHVybigoQ0hBUikoMTU4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmM6IHJldHVybigoQ0hBUikoMTU5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmQ6IHJldHVybigoQ0hBUikoMjI0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmU6IHJldHVybigoQ0hBUikoMjIzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmY6IHJldHVybigoQ0hBUikoMjE2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxMzE6IHJldHVybigoQ0hBUikoMjQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNTI6IHJldHVybigoQ0hBUikoMjA2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNTM6IHJldHVybigoQ0hBUikoMjA3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNzg6IHJldHVybigoQ0hBUikoMjE3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxOTI6IHJldHVybigoQ0hBUikoMTk2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyYzY6IHJldHVybigoQ0hBUikoMjQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyYzc6IHJldHVybigoQ0hBUikoMjU1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZDg6IHJldHVybigoQ0hBUikoMjQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZDk6IHJldHVybigoQ0hBUikoMjUwICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZGE6IHJldHVybigoQ0hBUikoMjUxICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZGI6IHJldHVybigoQ0hBUikoMjU0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZGM6IHJldHVybigoQ0hBUikoMjQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZGQ6IHJldHVybigoQ0hBUikoMjUzICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzA6IHJldHVybigoQ0hBUikoMTg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTM6IHJldHVybigoQ0hBUikoMjA4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTQ6IHJldHVybigoQ0hBUikoMjA5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTg6IHJldHVybigoQ0hBUikoMjEyICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTk6IHJldHVybigoQ0hBUikoMjEzICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWE6IHJldHVybigoQ0hBUikoMjI2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWM6IHJldHVybigoQ0hBUikoMjEwICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWQ6IHJldHVybigoQ0hBUikoMjExICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWU6IHJldHVybigoQ0hBUikoMjI3ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjI6IHJldHVybigoQ0hBUikoMTY1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjY6IHJldHVybigoQ0hBUikoMjAxICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMzA6IHJldHVybigoQ0hBUikoMjI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwNDQ6IHJldHVybigoQ0hBUikoMjE4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIxMjI6IHJldHVybigoQ0hBUikoMTcwICYgMHhmZikpOworICAgICAgY2FzZSAweDIxMjY6IHJldHVybigoQ0hBUikoMTg5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMDI6IHJldHVybigoQ0hBUikoMTgyICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMDY6IHJldHVybigoQ0hBUikoMTk4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMGY6IHJldHVybigoQ0hBUikoMTg0ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMTE6IHJldHVybigoQ0hBUikoMTgzICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMWE6IHJldHVybigoQ0hBUikoMTk1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMWU6IHJldHVybigoQ0hBUikoMTc2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMmI6IHJldHVybigoQ0hBUikoMTg2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNDg6IHJldHVybigoQ0hBUikoMTk3ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjA6IHJldHVybigoQ0hBUikoMTczICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjQ6IHJldHVybigoQ0hBUikoMTc4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjU6IHJldHVybigoQ0hBUikoMTc5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1Y2E6IHJldHVybigoQ0hBUikoMjE1ICYgMHhmZikpOworICAgICAgY2FzZSAweGY4ZmY6IHJldHVybigoQ0hBUikoMjQwICYgMHhmZikpOworICAgICAgZGVmYXVsdDogcmV0dXJuKHR4X3B1bmMoYykpOworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFwcGxlIFF1aWNrRHJhdyAvIENQMTAwMDAgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfcXVpY2tkcmF3KFVTSE9SVCBjKQorI2Vsc2UKK3R4X3F1aWNrZHJhdyhjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHg4MCkgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhcyBDMSBncmFwaGljcyAqLworICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDAwYTA6IHJldHVybigoQ0hBUikoMjAyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTE6IHJldHVybigoQ0hBUikoMTkzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTI6IHJldHVybigoQ0hBUikoMTYyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTM6IHJldHVybigoQ0hBUikoMTYzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTQ6IHJldHVybigoQ0hBUikoMjE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTU6IHJldHVybigoQ0hBUikoMTgwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTc6IHJldHVybigoQ0hBUikoMTY0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTg6IHJldHVybigoQ0hBUikoMTcyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTk6IHJldHVybigoQ0hBUikoMTY5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWE6IHJldHVybigoQ0hBUikoMTg3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWI6IHJldHVybigoQ0hBUikoMTk5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWM6IHJldHVybigoQ0hBUikoMTk0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWU6IHJldHVybigoQ0hBUikoMTY4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWY6IHJldHVybigoQ0hBUikoMjQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjA6IHJldHVybigoQ0hBUikoMTYxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjE6IHJldHVybigoQ0hBUikoMTc3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjQ6IHJldHVybigoQ0hBUikoMTcxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjU6IHJldHVybigoQ0hBUikoMTgxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjY6IHJldHVybigoQ0hBUikoMTY2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjc6IHJldHVybigoQ0hBUikoMjI1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjg6IHJldHVybigoQ0hBUikoMjUyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmE6IHJldHVybigoQ0hBUikoMTg4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmI6IHJldHVybigoQ0hBUikoMjAwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmY6IHJldHVybigoQ0hBUikoMTkyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzA6IHJldHVybigoQ0hBUikoMjAzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzE6IHJldHVybigoQ0hBUikoMjMxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzI6IHJldHVybigoQ0hBUikoMjI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzM6IHJldHVybigoQ0hBUikoMjA0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzQ6IHJldHVybigoQ0hBUikoMTI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzU6IHJldHVybigoQ0hBUikoMTI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzY6IHJldHVybigoQ0hBUikoMTc0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzc6IHJldHVybigoQ0hBUikoMTMwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzg6IHJldHVybigoQ0hBUikoMjMzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzk6IHJldHVybigoQ0hBUikoMTMxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2E6IHJldHVybigoQ0hBUikoMjMwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2I6IHJldHVybigoQ0hBUikoMjMyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2M6IHJldHVybigoQ0hBUikoMjM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2Q6IHJldHVybigoQ0hBUikoMjM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2U6IHJldHVybigoQ0hBUikoMjM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2Y6IHJldHVybigoQ0hBUikoMjM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMzk6IHJldHVybigoQ0hBUikoMjIwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDE6IHJldHVybigoQ0hBUikoMTMyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDI6IHJldHVybigoQ0hBUikoMjQxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDM6IHJldHVybigoQ0hBUikoMjM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDQ6IHJldHVybigoQ0hBUikoMjM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDU6IHJldHVybigoQ0hBUikoMjA1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDY6IHJldHVybigoQ0hBUikoMTMzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDg6IHJldHVybigoQ0hBUikoMTc1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDk6IHJldHVybigoQ0hBUikoMjQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGE6IHJldHVybigoQ0hBUikoMjQyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGI6IHJldHVybigoQ0hBUikoMjQzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGM6IHJldHVybigoQ0hBUikoMTM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjA6IHJldHVybigoQ0hBUikoMTYwICYgMHhmZikpOworICAgICAgY2FzZSAweGZiMDE6IHJldHVybigoQ0hBUikoMjIyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGY6IHJldHVybigoQ0hBUikoMTY3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTA6IHJldHVybigoQ0hBUikoMTM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTE6IHJldHVybigoQ0hBUikoMTM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTI6IHJldHVybigoQ0hBUikoMTM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTM6IHJldHVybigoQ0hBUikoMTM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTQ6IHJldHVybigoQ0hBUikoMTM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTU6IHJldHVybigoQ0hBUikoMTQwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTY6IHJldHVybigoQ0hBUikoMTkwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTc6IHJldHVybigoQ0hBUikoMTQxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTg6IHJldHVybigoQ0hBUikoMTQzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTk6IHJldHVybigoQ0hBUikoMTQyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWE6IHJldHVybigoQ0hBUikoMTQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWI6IHJldHVybigoQ0hBUikoMTQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWM6IHJldHVybigoQ0hBUikoMTQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWQ6IHJldHVybigoQ0hBUikoMTQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWU6IHJldHVybigoQ0hBUikoMTQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWY6IHJldHVybigoQ0hBUikoMTQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwM2E6IHJldHVybigoQ0hBUikoMjIxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjE6IHJldHVybigoQ0hBUikoMTUwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjI6IHJldHVybigoQ0hBUikoMTUyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjM6IHJldHVybigoQ0hBUikoMTUxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjQ6IHJldHVybigoQ0hBUikoMTUzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjU6IHJldHVybigoQ0hBUikoMTU1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjY6IHJldHVybigoQ0hBUikoMTU0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjc6IHJldHVybigoQ0hBUikoMjE0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjg6IHJldHVybigoQ0hBUikoMTkxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjk6IHJldHVybigoQ0hBUikoMTU3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmE6IHJldHVybigoQ0hBUikoMTU2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmI6IHJldHVybigoQ0hBUikoMTU4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmM6IHJldHVybigoQ0hBUikoMTU5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjE6IHJldHVybigoQ0hBUikoMjI0ICYgMHhmZikpOworICAgICAgY2FzZSAweGZiMDI6IHJldHVybigoQ0hBUikoMjIzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmY6IHJldHVybigoQ0hBUikoMjE2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxMzE6IHJldHVybigoQ0hBUikoMjQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNTI6IHJldHVybigoQ0hBUikoMjA2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNTM6IHJldHVybigoQ0hBUikoMjA3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNzg6IHJldHVybigoQ0hBUikoMjE3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxOTI6IHJldHVybigoQ0hBUikoMTk2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyYzY6IHJldHVybigoQ0hBUikoMjQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyYzc6IHJldHVybigoQ0hBUikoMjU1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZDg6IHJldHVybigoQ0hBUikoMjQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZDk6IHJldHVybigoQ0hBUikoMjUwICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZGE6IHJldHVybigoQ0hBUikoMjUxICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZGI6IHJldHVybigoQ0hBUikoMjU0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZGM6IHJldHVybigoQ0hBUikoMjQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAyZGQ6IHJldHVybigoQ0hBUikoMjUzICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzA6IHJldHVybigoQ0hBUikoMTg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTM6IHJldHVybigoQ0hBUikoMjA4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTQ6IHJldHVybigoQ0hBUikoMjA5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTg6IHJldHVybigoQ0hBUikoMjEyICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTk6IHJldHVybigoQ0hBUikoMjEzICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWE6IHJldHVybigoQ0hBUikoMjI2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWM6IHJldHVybigoQ0hBUikoMjEwICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWQ6IHJldHVybigoQ0hBUikoMjExICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWU6IHJldHVybigoQ0hBUikoMjI3ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjI6IHJldHVybigoQ0hBUikoMTY1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjY6IHJldHVybigoQ0hBUikoMjAxICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMzA6IHJldHVybigoQ0hBUikoMjI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwNDQ6IHJldHVybigoQ0hBUikoMjE4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIxMjI6IHJldHVybigoQ0hBUikoMTcwICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTk6IHJldHVybigoQ0hBUikoMTg5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMDI6IHJldHVybigoQ0hBUikoMTgyICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMDY6IHJldHVybigoQ0hBUikoMTk4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMGY6IHJldHVybigoQ0hBUikoMTg0ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMTE6IHJldHVybigoQ0hBUikoMTgzICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMWE6IHJldHVybigoQ0hBUikoMTk1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMWU6IHJldHVybigoQ0hBUikoMTc2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMmI6IHJldHVybigoQ0hBUikoMTg2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNDg6IHJldHVybigoQ0hBUikoMTk3ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjA6IHJldHVybigoQ0hBUikoMTczICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjQ6IHJldHVybigoQ0hBUikoMTc4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjU6IHJldHVybigoQ0hBUikoMTc5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1Y2E6IHJldHVybigoQ0hBUikoMjE1ICYgMHhmZikpOworICAgICAgY2FzZSAweGY4ZmY6IHJldHVybigoQ0hBUikoMjQwICYgMHhmZikpOworICAgICAgZGVmYXVsdDogcmV0dXJuKHR4X3B1bmMoYykpOworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhQIFJvbWFuLTggKi8KKyNpZmRlZiBDS19BTlNJQwordHhfaHByb21hbjgoVVNIT1JUIGMpCisjZWxzZQordHhfaHByb21hbjgoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4YTApCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHgwMGEwOiByZXR1cm4oKENIQVIpKDE2MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGExOiByZXR1cm4oKENIQVIpKDE3MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGEyOiByZXR1cm4oKENIQVIpKDE2NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGEzOiByZXR1cm4oKENIQVIpKDE2OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE0OiByZXR1cm4oKENIQVIpKDE2NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE1OiByZXR1cm4oKENIQVIpKDE4MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE3OiByZXR1cm4oKENIQVIpKDE4NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE4OiByZXR1cm4oKENIQVIpKDE4OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE5OiByZXR1cm4oKENIQVIpKDE3MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFhOiByZXR1cm4oKENIQVIpKDE2OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFiOiByZXR1cm4oKENIQVIpKDE3NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFjOiByZXR1cm4oKENIQVIpKDE2MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFlOiByZXR1cm4oKENIQVIpKDE3NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIwOiByZXR1cm4oKENIQVIpKDE4OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIxOiByZXR1cm4oKENIQVIpKDE4MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIyOiByZXR1cm4oKENIQVIpKDE2NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIzOiByZXR1cm4oKENIQVIpKDE2NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI0OiByZXR1cm4oKENIQVIpKDE5MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI1OiByZXR1cm4oKENIQVIpKDE2MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI2OiByZXR1cm4oKENIQVIpKDE3OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI3OiByZXR1cm4oKENIQVIpKDE4NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI4OiByZXR1cm4oKENIQVIpKDE4NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJhOiByZXR1cm4oKENIQVIpKDE3MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJiOiByZXR1cm4oKENIQVIpKDE3NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJkOiByZXR1cm4oKENIQVIpKDE2MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJmOiByZXR1cm4oKENIQVIpKDE3MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGMwOiByZXR1cm4oKENIQVIpKDE5MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGMxOiByZXR1cm4oKENIQVIpKDE5MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGMyOiByZXR1cm4oKENIQVIpKDE5NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGMzOiByZXR1cm4oKENIQVIpKDE5NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM0OiByZXR1cm4oKENIQVIpKDE5NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM1OiByZXR1cm4oKENIQVIpKDE5NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM2OiByZXR1cm4oKENIQVIpKDE5OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM3OiByZXR1cm4oKENIQVIpKDE5OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM4OiByZXR1cm4oKENIQVIpKDIwMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM5OiByZXR1cm4oKENIQVIpKDIwMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNhOiByZXR1cm4oKENIQVIpKDIwMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNiOiByZXR1cm4oKENIQVIpKDIwMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNjOiByZXR1cm4oKENIQVIpKDIwNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNkOiByZXR1cm4oKENIQVIpKDIwNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNlOiByZXR1cm4oKENIQVIpKDIwNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNmOiByZXR1cm4oKENIQVIpKDIwNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQxOiByZXR1cm4oKENIQVIpKDIwOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQyOiByZXR1cm4oKENIQVIpKDIxMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQzOiByZXR1cm4oKENIQVIpKDIwOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ0OiByZXR1cm4oKENIQVIpKDIxMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ1OiByZXR1cm4oKENIQVIpKDIxMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ2OiByZXR1cm4oKENIQVIpKDIxMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ4OiByZXR1cm4oKENIQVIpKDIxNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ5OiByZXR1cm4oKENIQVIpKDIxNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRhOiByZXR1cm4oKENIQVIpKDIxNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRiOiByZXR1cm4oKENIQVIpKDIxOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRjOiByZXR1cm4oKENIQVIpKDIxOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRmOiByZXR1cm4oKENIQVIpKDI1MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUwOiByZXR1cm4oKENIQVIpKDIyNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUxOiByZXR1cm4oKENIQVIpKDIyNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUyOiByZXR1cm4oKENIQVIpKDIyNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUzOiByZXR1cm4oKENIQVIpKDIyOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU0OiByZXR1cm4oKENIQVIpKDIyNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU1OiByZXR1cm4oKENIQVIpKDIyOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU2OiByZXR1cm4oKENIQVIpKDIzMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU3OiByZXR1cm4oKENIQVIpKDIzMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU4OiByZXR1cm4oKENIQVIpKDIzMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU5OiByZXR1cm4oKENIQVIpKDIzMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVhOiByZXR1cm4oKENIQVIpKDIzNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGViOiByZXR1cm4oKENIQVIpKDIzNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVjOiByZXR1cm4oKENIQVIpKDIzNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVkOiByZXR1cm4oKENIQVIpKDIzNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVlOiByZXR1cm4oKENIQVIpKDIzOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVmOiByZXR1cm4oKENIQVIpKDIzOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYxOiByZXR1cm4oKENIQVIpKDI0MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYyOiByZXR1cm4oKENIQVIpKDI0MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYzOiByZXR1cm4oKENIQVIpKDI0MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY0OiByZXR1cm4oKENIQVIpKDI0MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY1OiByZXR1cm4oKENIQVIpKDI0NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY2OiByZXR1cm4oKENIQVIpKDI0NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY4OiByZXR1cm4oKENIQVIpKDI0NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY5OiByZXR1cm4oKENIQVIpKDI0OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZhOiByZXR1cm4oKENIQVIpKDI0OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZiOiByZXR1cm4oKENIQVIpKDI1MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZjOiByZXR1cm4oKENIQVIpKDI1MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZmOiByZXR1cm4oKENIQVIpKDI1MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTUzOiByZXR1cm4oKENIQVIpKDI0NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTc4OiByZXR1cm4oKENIQVIpKDIyMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTkyOiByZXR1cm4oKENIQVIpKDE4MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMjc2OiByZXR1cm4oKENIQVIpKDIxNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDIxOiByZXR1cm4oKENIQVIpKDE3NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMTIyOiByZXR1cm4oKENIQVIpKDE3OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMTkxOiByZXR1cm4oKENIQVIpKDE5MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMjY0OiByZXR1cm4oKENIQVIpKDE4MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMjY1OiByZXR1cm4oKENIQVIpKDE4NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTg4OiByZXR1cm4oKENIQVIpKDI1NSAmIDB4ZmYpKTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9wdW5jKGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQQyBDb2RlIFBhZ2UgNDM3ICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X2NwNDM3KFVTSE9SVCBjKQorI2Vsc2UKK3R4X2NwNDM3KGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPCAweDgwKSAgICAgICAgICAgICAgICAgICAgICAgLyogSGFzIEMxIGdyYXBoaWNzICovCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDB4MDBhMDogcmV0dXJuKChDSEFSKSgyNTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhMTogcmV0dXJuKChDSEFSKSgxNzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhMjogcmV0dXJuKChDSEFSKSgxNTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhMzogcmV0dXJuKChDSEFSKSgxNTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhNDogcmV0dXJuKChDSEFSKSgxNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE1OiByZXR1cm4oKENIQVIpKDE1NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE2OiByZXR1cm4oKENIQVIpKDEyNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE3OiByZXR1cm4oKENIQVIpKDIxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTg6IHJldHVybigoQ0hBUikoMzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhOTogcmV0dXJuKChDSEFSKSg2NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFhOiByZXR1cm4oKENIQVIpKDE2NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFiOiByZXR1cm4oKENIQVIpKDE3NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFjOiByZXR1cm4oKENIQVIpKDE3MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFkOiByZXR1cm4oKENIQVIpKDQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWU6IHJldHVybigoQ0hBUikoODQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhZjogcmV0dXJuKChDSEFSKSgyMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIwOiByZXR1cm4oKENIQVIpKDI0OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIxOiByZXR1cm4oKENIQVIpKDI0MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIyOiByZXR1cm4oKENIQVIpKDI1MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIzOiByZXR1cm4oKENIQVIpKDUxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjQ6IHJldHVybigoQ0hBUikoMzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiNTogcmV0dXJuKChDSEFSKSgyMzAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiNjogcmV0dXJuKChDSEFSKSgyMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI3OiByZXR1cm4oKENIQVIpKDI1MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI4OiByZXR1cm4oKENIQVIpKDQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjk6IHJldHVybigoQ0hBUikoNDkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiYTogcmV0dXJuKChDSEFSKSgxNjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiYjogcmV0dXJuKChDSEFSKSgxNzUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiYzogcmV0dXJuKChDSEFSKSgxNzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiZDogcmV0dXJuKChDSEFSKSgxNzEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiZTogcmV0dXJuKChDSEFSKSgxOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJmOiByZXR1cm4oKENIQVIpKDE2OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGMwOiByZXR1cm4oKENIQVIpKDY1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzE6IHJldHVybigoQ0hBUikoNjUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjMjogcmV0dXJuKChDSEFSKSg2NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGMzOiByZXR1cm4oKENIQVIpKDY1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzQ6IHJldHVybigoQ0hBUikoMTQyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzU6IHJldHVybigoQ0hBUikoMTQzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzY6IHJldHVybigoQ0hBUikoMTQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzc6IHJldHVybigoQ0hBUikoMTI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzg6IHJldHVybigoQ0hBUikoNjkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjOTogcmV0dXJuKChDSEFSKSgxNDQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjYTogcmV0dXJuKChDSEFSKSg2OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNiOiByZXR1cm4oKENIQVIpKDY5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2M6IHJldHVybigoQ0hBUikoNzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjZDogcmV0dXJuKChDSEFSKSg3MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNlOiByZXR1cm4oKENIQVIpKDczICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2Y6IHJldHVybigoQ0hBUikoNzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkMDogcmV0dXJuKChDSEFSKSgxOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQxOiByZXR1cm4oKENIQVIpKDE2NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQyOiByZXR1cm4oKENIQVIpKDc5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDM6IHJldHVybigoQ0hBUikoNzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkNDogcmV0dXJuKChDSEFSKSg3OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ1OiByZXR1cm4oKENIQVIpKDc5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDY6IHJldHVybigoQ0hBUikoMTUzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDc6IHJldHVybigoQ0hBUikoMTIwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDg6IHJldHVybigoQ0hBUikoNzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkOTogcmV0dXJuKChDSEFSKSg4NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRhOiByZXR1cm4oKENIQVIpKDg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGI6IHJldHVybigoQ0hBUikoODUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkYzogcmV0dXJuKChDSEFSKSgxNTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkZDogcmV0dXJuKChDSEFSKSg4OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRlOiByZXR1cm4oKENIQVIpKDE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGY6IHJldHVybigoQ0hBUikoMjI1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTA6IHJldHVybigoQ0hBUikoMTMzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTE6IHJldHVybigoQ0hBUikoMTYwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTI6IHJldHVybigoQ0hBUikoMTMxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTM6IHJldHVybigoQ0hBUikoOTcgJiAweGZmKSk7IC8qIGEtdGlsZGUgLT4gYSAobm90IDEwMSA9IGUpICovCisgICAgICBjYXNlIDB4MDBlNDogcmV0dXJuKChDSEFSKSgxMzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlNTogcmV0dXJuKChDSEFSKSgxMzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlNjogcmV0dXJuKChDSEFSKSgxNDUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlNzogcmV0dXJuKChDSEFSKSgxMzUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlODogcmV0dXJuKChDSEFSKSgxMzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlOTogcmV0dXJuKChDSEFSKSgxMzAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlYTogcmV0dXJuKChDSEFSKSgxMzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlYjogcmV0dXJuKChDSEFSKSgxMzcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlYzogcmV0dXJuKChDSEFSKSgxNDEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlZDogcmV0dXJuKChDSEFSKSgxNjEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlZTogcmV0dXJuKChDSEFSKSgxNDAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlZjogcmV0dXJuKChDSEFSKSgxMzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmMDogcmV0dXJuKChDSEFSKSgxOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYxOiByZXR1cm4oKENIQVIpKDE2NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYyOiByZXR1cm4oKENIQVIpKDE0OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYzOiByZXR1cm4oKENIQVIpKDE2MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY0OiByZXR1cm4oKENIQVIpKDE0NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY1OiByZXR1cm4oKENIQVIpKDExMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY2OiByZXR1cm4oKENIQVIpKDE0OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY3OiByZXR1cm4oKENIQVIpKDI0NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY4OiByZXR1cm4oKENIQVIpKDExMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY5OiByZXR1cm4oKENIQVIpKDE1MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZhOiByZXR1cm4oKENIQVIpKDE2MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZiOiByZXR1cm4oKENIQVIpKDE1MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZjOiByZXR1cm4oKENIQVIpKDEyOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZkOiByZXR1cm4oKENIQVIpKDEyMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZlOiByZXR1cm4oKENIQVIpKDE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmY6IHJldHVybigoQ0hBUikoMTUyICYgMHhmZikpOworICAgICAgY2FzZSAweDAxOTI6IHJldHVybigoQ0hBUikoMTU5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTM6IHJldHVybigoQ0hBUikoMjI2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTg6IHJldHVybigoQ0hBUikoMjMzICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTM6IHJldHVybigoQ0hBUikoMjI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTY6IHJldHVybigoQ0hBUikoMjMyICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTk6IHJldHVybigoQ0hBUikoMjM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjE6IHJldHVybigoQ0hBUikoMjI0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjQ6IHJldHVybigoQ0hBUikoMjM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjU6IHJldHVybigoQ0hBUikoMjM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzA6IHJldHVybigoQ0hBUikoMjI3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzM6IHJldHVybigoQ0hBUikoMjI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzQ6IHJldHVybigoQ0hBUikoMjMxICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzY6IHJldHVybigoQ0hBUikoMjM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwN2Y6IHJldHVybigoQ0hBUikoMjUyICYgMHhmZikpOworICAgICAgY2FzZSAweDIwYTc6IHJldHVybigoQ0hBUikoMTU4ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMTk6IHJldHVybigoQ0hBUikoMjQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMWE6IHJldHVybigoQ0hBUikoMjUxICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMWU6IHJldHVybigoQ0hBUikoMjM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMjk6IHJldHVybigoQ0hBUikoMjM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNDg6IHJldHVybigoQ0hBUikoMjQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjE6IHJldHVybigoQ0hBUikoMjQwICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjQ6IHJldHVybigoQ0hBUikoMjQzICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjU6IHJldHVybigoQ0hBUikoMjQyICYgMHhmZikpOworICAgICAgY2FzZSAweDIzMTA6IHJldHVybigoQ0hBUikoMTY5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIzMjA6IHJldHVybigoQ0hBUikoMjQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDIzMjE6IHJldHVybigoQ0hBUikoMjQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MDA6IHJldHVybigoQ0hBUikoMTk2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MDI6IHJldHVybigoQ0hBUikoMTc5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MGM6IHJldHVybigoQ0hBUikoMjE4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTA6IHJldHVybigoQ0hBUikoMTkxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTQ6IHJldHVybigoQ0hBUikoMTkyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTg6IHJldHVybigoQ0hBUikoMjE3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MWM6IHJldHVybigoQ0hBUikoMTk1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MjQ6IHJldHVybigoQ0hBUikoMTgwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MmM6IHJldHVybigoQ0hBUikoMTk0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MzQ6IHJldHVybigoQ0hBUikoMTkzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1M2M6IHJldHVybigoQ0hBUikoMTk3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTA6IHJldHVybigoQ0hBUikoMjA1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTE6IHJldHVybigoQ0hBUikoMTg2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTI6IHJldHVybigoQ0hBUikoMjEzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTM6IHJldHVybigoQ0hBUikoMjE0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTQ6IHJldHVybigoQ0hBUikoMjAxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTU6IHJldHVybigoQ0hBUikoMTg0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTY6IHJldHVybigoQ0hBUikoMTgzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTc6IHJldHVybigoQ0hBUikoMTg3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTg6IHJldHVybigoQ0hBUikoMjEyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTk6IHJldHVybigoQ0hBUikoMjExICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NWE6IHJldHVybigoQ0hBUikoMjAwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NWI6IHJldHVybigoQ0hBUikoMTkwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NWM6IHJldHVybigoQ0hBUikoMTg5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NWQ6IHJldHVybigoQ0hBUikoMTg4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NWU6IHJldHVybigoQ0hBUikoMTk4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NWY6IHJldHVybigoQ0hBUikoMTk5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjA6IHJldHVybigoQ0hBUikoMjA0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjE6IHJldHVybigoQ0hBUikoMTgxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjI6IHJldHVybigoQ0hBUikoMTgyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjM6IHJldHVybigoQ0hBUikoMTg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjQ6IHJldHVybigoQ0hBUikoMjA5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjU6IHJldHVybigoQ0hBUikoMjEwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjY6IHJldHVybigoQ0hBUikoMjAzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1Njc6IHJldHVybigoQ0hBUikoMjA3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1Njg6IHJldHVybigoQ0hBUikoMjA4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1Njk6IHJldHVybigoQ0hBUikoMjAyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NmE6IHJldHVybigoQ0hBUikoMjE2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NmI6IHJldHVybigoQ0hBUikoMjE1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NmM6IHJldHVybigoQ0hBUikoMjA2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODA6IHJldHVybigoQ0hBUikoMjIzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODQ6IHJldHVybigoQ0hBUikoMjIwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODg6IHJldHVybigoQ0hBUikoMjE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OGM6IHJldHVybigoQ0hBUikoMjIxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTA6IHJldHVybigoQ0hBUikoMjIyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTE6IHJldHVybigoQ0hBUikoMTc2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTI6IHJldHVybigoQ0hBUikoMTc3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTM6IHJldHVybigoQ0hBUikoMTc4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1YTA6IHJldHVybigoQ0hBUikoMjU0ICYgMHhmZikpOyAvKiBCbGFjayBzcXVhcmUgKi8KKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9jcHN1YihjKSk7ICAgICAvKiBGb3IgYm94IGNoYXJhY3RlcnMgZXRjICovCisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF6b3ZpYSAqLworI2lmZGVmIENLX0FOU0lDCit0eF9tYXpvdmlhKFVTSE9SVCBjKQorI2Vsc2UKK3R4X21hem92aWEoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4ODApICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXMgQzEgZ3JhcGhpY3MgKi8KKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgwMGQzOiByZXR1cm4oKENIQVIpMHhhMyAmIDB4ZmYpOyAgIC8qIE8gYWN1dGUgKi8KKyAgICAgIGNhc2UgMHgwMGYzOiByZXR1cm4oKENIQVIpMHhhMiAmIDB4ZmYpOyAgIC8qIE8gYWN1dGUgKi8KKyAgICAgIGNhc2UgMHgwMTA0OiByZXR1cm4oKENIQVIpMHg4ZiAmIDB4ZmYpOyAgIC8qIEEgT2dvbmVrICovCisgICAgICBjYXNlIDB4MDEwNTogcmV0dXJuKChDSEFSKTB4ODYgJiAweGZmKTsgICAvKiBhIE9nb25layAqLworICAgICAgY2FzZSAweDAxMDY6IHJldHVybigoQ0hBUikweDk1ICYgMHhmZik7ICAgLyogQyBhY3V0ZSAqLworICAgICAgY2FzZSAweDAxMDc6IHJldHVybigoQ0hBUikweDhkICYgMHhmZik7ICAgLyogYyBhY3V0ZSAqLworICAgICAgY2FzZSAweDAxMTg6IHJldHVybigoQ0hBUikweDkwICYgMHhmZik7ICAgLyogRSBPZ29uZWsgKi8KKyAgICAgIGNhc2UgMHgwMTE5OiByZXR1cm4oKENIQVIpMHg5MSAmIDB4ZmYpOyAgIC8qIEUgT2dvbmVrICovCisgICAgICBjYXNlIDB4MDE0MTogcmV0dXJuKChDSEFSKTB4OWMgJiAweGZmKTsgICAvKiBMIHN0cm9rZSAqLworICAgICAgY2FzZSAweDAxNDI6IHJldHVybigoQ0hBUikweDkyICYgMHhmZik7ICAgLyogTCBzdHJva2UgKi8KKyAgICAgIGNhc2UgMHgwMTQzOiByZXR1cm4oKENIQVIpMHhhNSAmIDB4ZmYpOyAgIC8qIE4gYWN1dGUgKi8KKyAgICAgIGNhc2UgMHgwMTQ0OiByZXR1cm4oKENIQVIpMHhhNCAmIDB4ZmYpOyAgIC8qIE4gYWN1dGUgKi8KKyAgICAgIGNhc2UgMHgwMTVhOiByZXR1cm4oKENIQVIpMHg5OCAmIDB4ZmYpOyAgIC8qIFMgYWN1dGUgKi8KKyAgICAgIGNhc2UgMHgwMTViOiByZXR1cm4oKENIQVIpMHg5ZSAmIDB4ZmYpOyAgIC8qIFMgYWN1dGUgKi8KKyAgICAgIGNhc2UgMHgwMTc5OiByZXR1cm4oKENIQVIpMHhhMCAmIDB4ZmYpOyAgIC8qIFogYWN1dGUgKi8KKyAgICAgIGNhc2UgMHgwMTdhOiByZXR1cm4oKENIQVIpMHhhNiAmIDB4ZmYpOyAgIC8qIFogYWN1dGUgKi8KKyAgICAgIGNhc2UgMHgwMTdiOiByZXR1cm4oKENIQVIpMHhhMSAmIDB4ZmYpOyAgIC8qIFogZG90IGFib3ZlICovCisgICAgICBjYXNlIDB4MDE3YzogcmV0dXJuKChDSEFSKTB4YTcgJiAweGZmKTsgICAvKiBaIGRvdCBhYm92ZSAqLworICAgICAgZGVmYXVsdDogcmV0dXJuKHR4X2NwNDM3KGMpKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQQyBDb2RlIFBhZ2UgODUwICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X2NwODUwKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2NwODUwKGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPCAweDgwKSAgICAgICAgICAgICAgICAgICAgICAgLyogSGFzIEMxIGdyYXBoaWNzICovCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDB4MDBhMDogcmV0dXJuKChDSEFSKSgyNTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhMTogcmV0dXJuKChDSEFSKSgxNzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhMjogcmV0dXJuKChDSEFSKSgxODkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhMzogcmV0dXJuKChDSEFSKSgxNTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhNDogcmV0dXJuKChDSEFSKSgyMDcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhNTogcmV0dXJuKChDSEFSKSgxOTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhNjogcmV0dXJuKChDSEFSKSgyMjEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhNzogcmV0dXJuKChDSEFSKSgyNDUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhODogcmV0dXJuKChDSEFSKSgyNDkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhOTogcmV0dXJuKChDSEFSKSgxODQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhYTogcmV0dXJuKChDSEFSKSgxNjYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhYjogcmV0dXJuKChDSEFSKSgxNzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhYzogcmV0dXJuKChDSEFSKSgxNzAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhZDogcmV0dXJuKChDSEFSKSgyNDAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhZTogcmV0dXJuKChDSEFSKSgxNjkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhZjogcmV0dXJuKChDSEFSKSgyMzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiMDogcmV0dXJuKChDSEFSKSgyNDggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiMTogcmV0dXJuKChDSEFSKSgyNDEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiMjogcmV0dXJuKChDSEFSKSgyNTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiMzogcmV0dXJuKChDSEFSKSgyNTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiNDogcmV0dXJuKChDSEFSKSgyMzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiNTogcmV0dXJuKChDSEFSKSgyMzAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiNjogcmV0dXJuKChDSEFSKSgyNDQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiNzogcmV0dXJuKChDSEFSKSgyNTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiODogcmV0dXJuKChDSEFSKSgyNDcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiOTogcmV0dXJuKChDSEFSKSgyNTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiYTogcmV0dXJuKChDSEFSKSgxNjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiYjogcmV0dXJuKChDSEFSKSgxNzUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiYzogcmV0dXJuKChDSEFSKSgxNzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiZDogcmV0dXJuKChDSEFSKSgxNzEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiZTogcmV0dXJuKChDSEFSKSgyNDMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiZjogcmV0dXJuKChDSEFSKSgxNjggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjMDogcmV0dXJuKChDSEFSKSgxODMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjMTogcmV0dXJuKChDSEFSKSgxODEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjMjogcmV0dXJuKChDSEFSKSgxODIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjMzogcmV0dXJuKChDSEFSKSgxOTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjNDogcmV0dXJuKChDSEFSKSgxNDIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjNTogcmV0dXJuKChDSEFSKSgxNDMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjNjogcmV0dXJuKChDSEFSKSgxNDYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjNzogcmV0dXJuKChDSEFSKSgxMjggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjODogcmV0dXJuKChDSEFSKSgyMTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjOTogcmV0dXJuKChDSEFSKSgxNDQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjYTogcmV0dXJuKChDSEFSKSgyMTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjYjogcmV0dXJuKChDSEFSKSgyMTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjYzogcmV0dXJuKChDSEFSKSgyMjIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjZDogcmV0dXJuKChDSEFSKSgyMTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjZTogcmV0dXJuKChDSEFSKSgyMTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBjZjogcmV0dXJuKChDSEFSKSgyMTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkMDogcmV0dXJuKChDSEFSKSgyMDkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkMTogcmV0dXJuKChDSEFSKSgxNjUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkMjogcmV0dXJuKChDSEFSKSgyMjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkMzogcmV0dXJuKChDSEFSKSgyMjQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkNDogcmV0dXJuKChDSEFSKSgyMjYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkNTogcmV0dXJuKChDSEFSKSgyMjkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkNjogcmV0dXJuKChDSEFSKSgxNTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkNzogcmV0dXJuKChDSEFSKSgxNTggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkODogcmV0dXJuKChDSEFSKSgxNTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkOTogcmV0dXJuKChDSEFSKSgyMzUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkYTogcmV0dXJuKChDSEFSKSgyMzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkYjogcmV0dXJuKChDSEFSKSgyMzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkYzogcmV0dXJuKChDSEFSKSgxNTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkZDogcmV0dXJuKChDSEFSKSgyMzcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkZTogcmV0dXJuKChDSEFSKSgyMzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkZjogcmV0dXJuKChDSEFSKSgyMjUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlMDogcmV0dXJuKChDSEFSKSgxMzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlMTogcmV0dXJuKChDSEFSKSgxNjAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlMjogcmV0dXJuKChDSEFSKSgxMzEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlMzogcmV0dXJuKChDSEFSKSgxOTggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlNDogcmV0dXJuKChDSEFSKSgxMzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlNTogcmV0dXJuKChDSEFSKSgxMzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlNjogcmV0dXJuKChDSEFSKSgxNDUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlNzogcmV0dXJuKChDSEFSKSgxMzUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlODogcmV0dXJuKChDSEFSKSgxMzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlOTogcmV0dXJuKChDSEFSKSgxMzAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlYTogcmV0dXJuKChDSEFSKSgxMzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlYjogcmV0dXJuKChDSEFSKSgxMzcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlYzogcmV0dXJuKChDSEFSKSgxNDEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlZDogcmV0dXJuKChDSEFSKSgxNjEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlZTogcmV0dXJuKChDSEFSKSgxNDAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlZjogcmV0dXJuKChDSEFSKSgxMzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmMDogcmV0dXJuKChDSEFSKSgyMDggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmMTogcmV0dXJuKChDSEFSKSgxNjQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmMjogcmV0dXJuKChDSEFSKSgxNDkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmMzogcmV0dXJuKChDSEFSKSgxNjIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmNDogcmV0dXJuKChDSEFSKSgxNDcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmNTogcmV0dXJuKChDSEFSKSgyMjggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmNjogcmV0dXJuKChDSEFSKSgxNDggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmNzogcmV0dXJuKChDSEFSKSgyNDYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmODogcmV0dXJuKChDSEFSKSgxNTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmOTogcmV0dXJuKChDSEFSKSgxNTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmYTogcmV0dXJuKChDSEFSKSgxNjMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmYjogcmV0dXJuKChDSEFSKSgxNTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmYzogcmV0dXJuKChDSEFSKSgxMjkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmZDogcmV0dXJuKChDSEFSKSgyMzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmZTogcmV0dXJuKChDSEFSKSgyMzEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmZjogcmV0dXJuKChDSEFSKSgxNTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDEzMTogcmV0dXJuKChDSEFSKSgyMTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE5MjogcmV0dXJuKChDSEFSKSgxNTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxNzogcmV0dXJuKChDSEFSKSgyNDIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUwMDogcmV0dXJuKChDSEFSKSgxOTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUwMjogcmV0dXJuKChDSEFSKSgxNzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUwYzogcmV0dXJuKChDSEFSKSgyMTggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxMDogcmV0dXJuKChDSEFSKSgxOTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxNDogcmV0dXJuKChDSEFSKSgxOTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxODogcmV0dXJuKChDSEFSKSgyMTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxYzogcmV0dXJuKChDSEFSKSgxOTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUyNDogcmV0dXJuKChDSEFSKSgxODAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUyYzogcmV0dXJuKChDSEFSKSgxOTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUzNDogcmV0dXJuKChDSEFSKSgxOTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUzYzogcmV0dXJuKChDSEFSKSgxOTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1MDogcmV0dXJuKChDSEFSKSgyMDUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1MTogcmV0dXJuKChDSEFSKSgxODYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1NDogcmV0dXJuKChDSEFSKSgyMDEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1NzogcmV0dXJuKChDSEFSKSgxODcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1YTogcmV0dXJuKChDSEFSKSgyMDAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1ZDogcmV0dXJuKChDSEFSKSgxODggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2MDogcmV0dXJuKChDSEFSKSgyMDQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2MzogcmV0dXJuKChDSEFSKSgxODUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2NjogcmV0dXJuKChDSEFSKSgyMDMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2OTogcmV0dXJuKChDSEFSKSgyMDIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2YzogcmV0dXJuKChDSEFSKSgyMDYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4MDogcmV0dXJuKChDSEFSKSgyMjMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4NDogcmV0dXJuKChDSEFSKSgyMjAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4ODogcmV0dXJuKChDSEFSKSgyMTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU5MTogcmV0dXJuKChDSEFSKSgxNzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU5MjogcmV0dXJuKChDSEFSKSgxNzcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU5MzogcmV0dXJuKChDSEFSKSgxNzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjVhMDogcmV0dXJuKChDSEFSKSgyNTQgJiAweGZmKSk7CisgICAgICBkZWZhdWx0OiByZXR1cm4odHhfY3BzdWIoYykpOyAgICAgLyogRm9yIGJveCBjaGFyYWN0ZXJzIGV0YyAqLworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDIENvZGUgUGFnZSA4NTggKi8KKyNpZmRlZiBDS19BTlNJQwordHhfY3A4NTgoVVNIT1JUIGMpCisjZWxzZQordHhfY3A4NTgoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4ODApICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXMgQzEgZ3JhcGhpY3MgKi8KKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgwMGEwOiByZXR1cm4oKENIQVIpKDI1NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGExOiByZXR1cm4oKENIQVIpKDE3MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGEyOiByZXR1cm4oKENIQVIpKDE4OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGEzOiByZXR1cm4oKENIQVIpKDE1NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE0OiByZXR1cm4oKENIQVIpKDIwNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE1OiByZXR1cm4oKENIQVIpKDE5MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE2OiByZXR1cm4oKENIQVIpKDIyMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE3OiByZXR1cm4oKENIQVIpKDI0NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE4OiByZXR1cm4oKENIQVIpKDI0OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE5OiByZXR1cm4oKENIQVIpKDE4NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFhOiByZXR1cm4oKENIQVIpKDE2NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFiOiByZXR1cm4oKENIQVIpKDE3NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFjOiByZXR1cm4oKENIQVIpKDE3MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFkOiByZXR1cm4oKENIQVIpKDI0MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFlOiByZXR1cm4oKENIQVIpKDE2OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFmOiByZXR1cm4oKENIQVIpKDIzOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIwOiByZXR1cm4oKENIQVIpKDI0OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIxOiByZXR1cm4oKENIQVIpKDI0MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIyOiByZXR1cm4oKENIQVIpKDI1MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIzOiByZXR1cm4oKENIQVIpKDI1MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI0OiByZXR1cm4oKENIQVIpKDIzOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI1OiByZXR1cm4oKENIQVIpKDIzMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI2OiByZXR1cm4oKENIQVIpKDI0NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI3OiByZXR1cm4oKENIQVIpKDI1MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI4OiByZXR1cm4oKENIQVIpKDI0NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI5OiByZXR1cm4oKENIQVIpKDI1MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJhOiByZXR1cm4oKENIQVIpKDE2NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJiOiByZXR1cm4oKENIQVIpKDE3NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJjOiByZXR1cm4oKENIQVIpKDE3MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJkOiByZXR1cm4oKENIQVIpKDE3MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJlOiByZXR1cm4oKENIQVIpKDI0MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJmOiByZXR1cm4oKENIQVIpKDE2OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGMwOiByZXR1cm4oKENIQVIpKDE4MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGMxOiByZXR1cm4oKENIQVIpKDE4MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGMyOiByZXR1cm4oKENIQVIpKDE4MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGMzOiByZXR1cm4oKENIQVIpKDE5OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM0OiByZXR1cm4oKENIQVIpKDE0MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM1OiByZXR1cm4oKENIQVIpKDE0MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM2OiByZXR1cm4oKENIQVIpKDE0NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM3OiByZXR1cm4oKENIQVIpKDEyOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM4OiByZXR1cm4oKENIQVIpKDIxMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM5OiByZXR1cm4oKENIQVIpKDE0NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNhOiByZXR1cm4oKENIQVIpKDIxMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNiOiByZXR1cm4oKENIQVIpKDIxMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNjOiByZXR1cm4oKENIQVIpKDIyMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNkOiByZXR1cm4oKENIQVIpKDIxNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNlOiByZXR1cm4oKENIQVIpKDIxNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNmOiByZXR1cm4oKENIQVIpKDIxNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQwOiByZXR1cm4oKENIQVIpKDIwOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQxOiByZXR1cm4oKENIQVIpKDE2NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQyOiByZXR1cm4oKENIQVIpKDIyNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQzOiByZXR1cm4oKENIQVIpKDIyNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ0OiByZXR1cm4oKENIQVIpKDIyNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ1OiByZXR1cm4oKENIQVIpKDIyOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ2OiByZXR1cm4oKENIQVIpKDE1MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ3OiByZXR1cm4oKENIQVIpKDE1OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ4OiByZXR1cm4oKENIQVIpKDE1NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ5OiByZXR1cm4oKENIQVIpKDIzNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRhOiByZXR1cm4oKENIQVIpKDIzMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRiOiByZXR1cm4oKENIQVIpKDIzNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRjOiByZXR1cm4oKENIQVIpKDE1NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRkOiByZXR1cm4oKENIQVIpKDIzNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRlOiByZXR1cm4oKENIQVIpKDIzMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRmOiByZXR1cm4oKENIQVIpKDIyNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUwOiByZXR1cm4oKENIQVIpKDEzMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUxOiByZXR1cm4oKENIQVIpKDE2MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUyOiByZXR1cm4oKENIQVIpKDEzMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUzOiByZXR1cm4oKENIQVIpKDE5OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU0OiByZXR1cm4oKENIQVIpKDEzMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU1OiByZXR1cm4oKENIQVIpKDEzNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU2OiByZXR1cm4oKENIQVIpKDE0NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU3OiByZXR1cm4oKENIQVIpKDEzNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU4OiByZXR1cm4oKENIQVIpKDEzOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU5OiByZXR1cm4oKENIQVIpKDEzMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVhOiByZXR1cm4oKENIQVIpKDEzNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGViOiByZXR1cm4oKENIQVIpKDEzNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVjOiByZXR1cm4oKENIQVIpKDE0MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVkOiByZXR1cm4oKENIQVIpKDE2MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVlOiByZXR1cm4oKENIQVIpKDE0MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVmOiByZXR1cm4oKENIQVIpKDEzOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYwOiByZXR1cm4oKENIQVIpKDIwOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYxOiByZXR1cm4oKENIQVIpKDE2NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYyOiByZXR1cm4oKENIQVIpKDE0OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYzOiByZXR1cm4oKENIQVIpKDE2MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY0OiByZXR1cm4oKENIQVIpKDE0NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY1OiByZXR1cm4oKENIQVIpKDIyOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY2OiByZXR1cm4oKENIQVIpKDE0OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY3OiByZXR1cm4oKENIQVIpKDI0NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY4OiByZXR1cm4oKENIQVIpKDE1NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY5OiByZXR1cm4oKENIQVIpKDE1MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZhOiByZXR1cm4oKENIQVIpKDE2MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZiOiByZXR1cm4oKENIQVIpKDE1MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZjOiByZXR1cm4oKENIQVIpKDEyOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZkOiByZXR1cm4oKENIQVIpKDIzNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZlOiByZXR1cm4oKENIQVIpKDIzMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZmOiByZXR1cm4oKENIQVIpKDE1MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMGFjOiByZXR1cm4oKENIQVIpKDIxMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTkyOiByZXR1cm4oKENIQVIpKDE1OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDE3OiByZXR1cm4oKENIQVIpKDI0MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTAwOiByZXR1cm4oKENIQVIpKDE5NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTAyOiByZXR1cm4oKENIQVIpKDE3OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTBjOiByZXR1cm4oKENIQVIpKDIxOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTEwOiByZXR1cm4oKENIQVIpKDE5MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTE0OiByZXR1cm4oKENIQVIpKDE5MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTE4OiByZXR1cm4oKENIQVIpKDIxNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTFjOiByZXR1cm4oKENIQVIpKDE5NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTI0OiByZXR1cm4oKENIQVIpKDE4MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTJjOiByZXR1cm4oKENIQVIpKDE5NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTM0OiByZXR1cm4oKENIQVIpKDE5MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTNjOiByZXR1cm4oKENIQVIpKDE5NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTUwOiByZXR1cm4oKENIQVIpKDIwNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTUxOiByZXR1cm4oKENIQVIpKDE4NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTU0OiByZXR1cm4oKENIQVIpKDIwMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTU3OiByZXR1cm4oKENIQVIpKDE4NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTVhOiByZXR1cm4oKENIQVIpKDIwMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTVkOiByZXR1cm4oKENIQVIpKDE4OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTYwOiByZXR1cm4oKENIQVIpKDIwNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTYzOiByZXR1cm4oKENIQVIpKDE4NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTY2OiByZXR1cm4oKENIQVIpKDIwMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTY5OiByZXR1cm4oKENIQVIpKDIwMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTZjOiByZXR1cm4oKENIQVIpKDIwNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTgwOiByZXR1cm4oKENIQVIpKDIyMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTg0OiByZXR1cm4oKENIQVIpKDIyMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTg4OiByZXR1cm4oKENIQVIpKDIxOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkxOiByZXR1cm4oKENIQVIpKDE3NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkyOiByZXR1cm4oKENIQVIpKDE3NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkzOiByZXR1cm4oKENIQVIpKDE3OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNWEwOiByZXR1cm4oKENIQVIpKDI1NCAmIDB4ZmYpKTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9jcHN1YihjKSk7ICAgICAvKiBGb3IgYm94IGNoYXJhY3RlcnMgZXRjICovCisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2luZG93cyBDb2RlIFBhZ2UgMTI1MCAoTGF0aW4tMikgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfY3AxMjUwKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2NwMTI1MChjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHg4MCB8fCAoYyA+IDB4YmYgJiYgYyA8PSAweGZmKSkgLyogSGFzIEMxIGdyYXBoaWNzICovCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDB4MDAyRDogcmV0dXJuKChDSEFSKSgweGFkICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQTA6IHJldHVybigoQ0hBUikoMHhhMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEE0OiByZXR1cm4oKENIQVIpKDB4YTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBNjogcmV0dXJuKChDSEFSKSgweGE2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQTc6IHJldHVybigoQ0hBUikoMHhhNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEE4OiByZXR1cm4oKENIQVIpKDB4YTggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBOTogcmV0dXJuKChDSEFSKSgweGE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQUI6IHJldHVybigoQ0hBUikoMHhhYiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEFDOiByZXR1cm4oKENIQVIpKDB4YWMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBRTogcmV0dXJuKChDSEFSKSgweGFlICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQjA6IHJldHVybigoQ0hBUikoMHhiMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEIxOiByZXR1cm4oKENIQVIpKDB4YjEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCNDogcmV0dXJuKChDSEFSKSgweGI0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQjU6IHJldHVybigoQ0hBUikoMHhiNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEI2OiByZXR1cm4oKENIQVIpKDB4YjYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCNzogcmV0dXJuKChDSEFSKSgweGI3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQjg6IHJldHVybigoQ0hBUikoMHhiOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEJCOiByZXR1cm4oKENIQVIpKDB4YmIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDEwNDogcmV0dXJuKChDSEFSKSgweGE1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxMDU6IHJldHVybigoQ0hBUikoMHhiOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTNEOiByZXR1cm4oKENIQVIpKDB4YmMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDEzRTogcmV0dXJuKChDSEFSKSgweGJlICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNDE6IHJldHVybigoQ0hBUikoMHhhMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTQyOiByZXR1cm4oKENIQVIpKDB4YjMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE1QTogcmV0dXJuKChDSEFSKSgweDhjICYgMHhmZikpOyAvKiBTIGFjdXRlICovCisgICAgICBjYXNlIDB4MDE1RTogcmV0dXJuKChDSEFSKSgweGFhICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNUY6IHJldHVybigoQ0hBUikoMHhiYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTViOiByZXR1cm4oKENIQVIpKDB4OWMgJiAweGZmKSk7IC8qIHMgYWN1dGUgKi8KKyAgICAgIGNhc2UgMHgwMTY0OiByZXR1cm4oKENIQVIpKDB4OGQgJiAweGZmKSk7IC8qIFQgY2Fyb24gKi8KKyAgICAgIGNhc2UgMHgwMTY1OiByZXR1cm4oKENIQVIpKDB4OWQgJiAweGZmKSk7IC8qIHQgY2Fyb24gKi8KKyAgICAgIGNhc2UgMHgwMTczOiByZXR1cm4oKENIQVIpKDB4OWUgJiAweGZmKSk7IC8qIHogY2Fyb24gKi8KKyAgICAgIGNhc2UgMHgwMTc5OiByZXR1cm4oKENIQVIpKDB4OGYgJiAweGZmKSk7IC8qIFogYWN1dGUgKi8KKyAgICAgIGNhc2UgMHgwMTdBOiByZXR1cm4oKENIQVIpKDB4OWYgJiAweGZmKSk7IC8qIHogYWN1dGUgKi8KKyAgICAgIGNhc2UgMHgwMTdCOiByZXR1cm4oKENIQVIpKDB4YWYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE3QzogcmV0dXJuKChDSEFSKSgweGJmICYgMHhmZikpOworICAgICAgY2FzZSAweDAxN0Q6IHJldHVybigoQ0hBUikoMHg4ZSAmIDB4ZmYpKTsgLyogWiBjYXJvbiAqLworICAgICAgY2FzZSAweDAyQzc6IHJldHVybigoQ0hBUikoMHhhMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMkQ4OiByZXR1cm4oKENIQVIpKDB4YTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDJEQjogcmV0dXJuKChDSEFSKSgweGIyICYgMHhmZikpOworICAgICAgY2FzZSAweDAyREQ6IHJldHVybigoQ0hBUikoMHhiZCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDEwOiBjYXNlIDB4MjAxMTogICAgICAgICAvKiBIeXBoZW5zICovCisgICAgICAgIHJldHVybigoQ0hBUikoMHgyZCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDEyOiBjYXNlIDB4MjAxMzogICAgICAgICAvKiBlbi1kYXNoZXMgKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDk2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTQ6IGNhc2UgMHgyMDE1OiAgICAgICAgIC8qIGVtLWRhc2hlcyAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4OTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxODogICAgICAgICAgICAgICAgICAgICAgLyogVmFyaW91cyBxdW90YXRpb24gbWFya3MuLi4gKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDkxICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTk6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDFjOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxZDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDk0ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDIwOiAgICAgICAgICAgICAgICAgICAgICAvKiBEYWdnZXIgKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDg2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjE6ICAgICAgICAgICAgICAgICAgICAgIC8qIERvdWJsZSBEYWdnZXIgKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDg3ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjI6ICAgICAgICAgICAgICAgICAgICAgIC8qIEJ1bGxldCAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4OTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAyNjogICAgICAgICAgICAgICAgICAgICAgLyogRWxsaXBzaXMgKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMzA6ICAgICAgICAgICAgICAgICAgICAgIC8qIFBlciBtaWwgKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDg5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwQUM6ICAgICAgICAgICAgICAgICAgICAgIC8qIEV1cm8gKi8KKyAgICAgICAgICByZXR1cm4oKENIQVIpKDB4ODAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjEyMjogICAgICAgICAgICAgICAgICAgICAgLyogVHJhZGUgTWFyayAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4OTkgJiAweGZmKSk7CisgICAgICBkZWZhdWx0OiByZXR1cm4oMHgwMDNmKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaW5kb3dzIENvZGUgUGFnZSAxMjUxIChDeXJpbGxpYykgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfY3AxMjUxKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2NwMTI1MShjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHg4MCkgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhcyBDMSBncmFwaGljcyAqLworICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIC8qIFRoaXMgaXMgc2ltcGx5IHRoZSBpbnZlcnNlIG9mIHVfY3AxMjUxLm1hcCAqLworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDAwM2M6IHJldHVybigoQ0hBUikoMHg4YiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMDNlOiByZXR1cm4oKENIQVIpKDB4OWIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDA3ZTogcmV0dXJuKChDSEFSKSgweDk4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQTA6IHJldHVybigoQ0hBUikoMHhhMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEE0OiByZXR1cm4oKENIQVIpKDB4YTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBNjogcmV0dXJuKChDSEFSKSgweGE2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQTc6IHJldHVybigoQ0hBUikoMHhhNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEE5OiByZXR1cm4oKENIQVIpKDB4YTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBQjogcmV0dXJuKChDSEFSKSgweGFiICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQUM6IHJldHVybigoQ0hBUikoMHhhYyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEFEOiByZXR1cm4oKENIQVIpKDB4YWQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBRTogcmV0dXJuKChDSEFSKSgweGFlICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjA6IHJldHVybigoQ0hBUikoMHhiMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIxOiByZXR1cm4oKENIQVIpKDB4YjEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCNTogcmV0dXJuKChDSEFSKSgweGI1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQjY6IHJldHVybigoQ0hBUikoMHhiNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEI3OiByZXR1cm4oKENIQVIpKDB4YjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCQjogcmV0dXJuKChDSEFSKSgweGJiICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MDE6IHJldHVybigoQ0hBUikoMHhhOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDAyOiByZXR1cm4oKENIQVIpKDB4ODAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQwMzogcmV0dXJuKChDSEFSKSgweDgxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MDQ6IHJldHVybigoQ0hBUikoMHhhYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDA1OiByZXR1cm4oKENIQVIpKDB4YmQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQwNjogcmV0dXJuKChDSEFSKSgweGIyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MDc6IHJldHVybigoQ0hBUikoMHhhZiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDA4OiByZXR1cm4oKENIQVIpKDB4YTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQwOTogcmV0dXJuKChDSEFSKSgweDhhICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MGE6IHJldHVybigoQ0hBUikoMHg4YyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDBiOiByZXR1cm4oKENIQVIpKDB4OGUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQwYzogcmV0dXJuKChDSEFSKSgweDhkICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MGU6IHJldHVybigoQ0hBUikoMHhhMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDBmOiByZXR1cm4oKENIQVIpKDB4OGYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxMDogcmV0dXJuKChDSEFSKSgweGMwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTE6IHJldHVybigoQ0hBUikoMHhjMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDEyOiByZXR1cm4oKENIQVIpKDB4YzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxMzogcmV0dXJuKChDSEFSKSgweGMzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTQ6IHJldHVybigoQ0hBUikoMHhjNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE1OiByZXR1cm4oKENIQVIpKDB4YzUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxNjogcmV0dXJuKChDSEFSKSgweGM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTc6IHJldHVybigoQ0hBUikoMHhjNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE4OiByZXR1cm4oKENIQVIpKDB4YzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxOTogcmV0dXJuKChDSEFSKSgweGM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MWE6IHJldHVybigoQ0hBUikoMHhjYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFiOiByZXR1cm4oKENIQVIpKDB4Y2IgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxYzogcmV0dXJuKChDSEFSKSgweGNjICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MWQ6IHJldHVybigoQ0hBUikoMHhjZCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFlOiByZXR1cm4oKENIQVIpKDB4Y2UgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxZjogcmV0dXJuKChDSEFSKSgweGNmICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjA6IHJldHVybigoQ0hBUikoMHhkMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDIxOiByZXR1cm4oKENIQVIpKDB4ZDEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyMjogcmV0dXJuKChDSEFSKSgweGQyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjM6IHJldHVybigoQ0hBUikoMHhkMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI0OiByZXR1cm4oKENIQVIpKDB4ZDQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyNTogcmV0dXJuKChDSEFSKSgweGQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjY6IHJldHVybigoQ0hBUikoMHhkNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI3OiByZXR1cm4oKENIQVIpKDB4ZDcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyODogcmV0dXJuKChDSEFSKSgweGQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mjk6IHJldHVybigoQ0hBUikoMHhkOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJhOiByZXR1cm4oKENIQVIpKDB4ZGEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyYjogcmV0dXJuKChDSEFSKSgweGRiICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MmM6IHJldHVybigoQ0hBUikoMHhkYyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJkOiByZXR1cm4oKENIQVIpKDB4ZGQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyZTogcmV0dXJuKChDSEFSKSgweGRlICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MmY6IHJldHVybigoQ0hBUikoMHhkZiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDMwOiByZXR1cm4oKENIQVIpKDB4ZTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzMTogcmV0dXJuKChDSEFSKSgweGUxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzI6IHJldHVybigoQ0hBUikoMHhlMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDMzOiByZXR1cm4oKENIQVIpKDB4ZTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzNDogcmV0dXJuKChDSEFSKSgweGU0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzU6IHJldHVybigoQ0hBUikoMHhlNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM2OiByZXR1cm4oKENIQVIpKDB4ZTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzNzogcmV0dXJuKChDSEFSKSgweGU3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mzg6IHJldHVybigoQ0hBUikoMHhlOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM5OiByZXR1cm4oKENIQVIpKDB4ZTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzYTogcmV0dXJuKChDSEFSKSgweGVhICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M2I6IHJldHVybigoQ0hBUikoMHhlYiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNjOiByZXR1cm4oKENIQVIpKDB4ZWMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzZDogcmV0dXJuKChDSEFSKSgweGVkICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M2U6IHJldHVybigoQ0hBUikoMHhlZSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNmOiByZXR1cm4oKENIQVIpKDB4ZWYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0MDogcmV0dXJuKChDSEFSKSgweGYwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDE6IHJldHVybigoQ0hBUikoMHhmMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQyOiByZXR1cm4oKENIQVIpKDB4ZjIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0MzogcmV0dXJuKChDSEFSKSgweGYzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDQ6IHJldHVybigoQ0hBUikoMHhmNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ1OiByZXR1cm4oKENIQVIpKDB4ZjUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0NjogcmV0dXJuKChDSEFSKSgweGY2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDc6IHJldHVybigoQ0hBUikoMHhmNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ4OiByZXR1cm4oKENIQVIpKDB4ZjggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0OTogcmV0dXJuKChDSEFSKSgweGY5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NGE6IHJldHVybigoQ0hBUikoMHhmYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRiOiByZXR1cm4oKENIQVIpKDB4ZmIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0YzogcmV0dXJuKChDSEFSKSgweGZjICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NGQ6IHJldHVybigoQ0hBUikoMHhmZCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRlOiByZXR1cm4oKENIQVIpKDB4ZmUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0ZjogcmV0dXJuKChDSEFSKSgweGZmICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NTE6IHJldHVybigoQ0hBUikoMHhiOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDUyOiByZXR1cm4oKENIQVIpKDB4OTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ1MzogcmV0dXJuKChDSEFSKSgweDgzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NTQ6IHJldHVybigoQ0hBUikoMHhiYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDU1OiByZXR1cm4oKENIQVIpKDB4YmUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ1NjogcmV0dXJuKChDSEFSKSgweGIzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NTc6IHJldHVybigoQ0hBUikoMHhiZiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDU4OiByZXR1cm4oKENIQVIpKDB4YmMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ1OTogcmV0dXJuKChDSEFSKSgweDlhICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NWE6IHJldHVybigoQ0hBUikoMHg5YyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDViOiByZXR1cm4oKENIQVIpKDB4OWUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ1YzogcmV0dXJuKChDSEFSKSgweDlkICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NWU6IHJldHVybigoQ0hBUikoMHhhMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDVmOiByZXR1cm4oKENIQVIpKDB4OWYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ5MDogcmV0dXJuKChDSEFSKSgweGE1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0OTE6IHJldHVybigoQ0hBUikoMHhiNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDEyOiByZXR1cm4oKENIQVIpKDB4OTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxNDogcmV0dXJuKChDSEFSKSgweDk3ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTg6IHJldHVybigoQ0hBUikoMHg5MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDE5OiByZXR1cm4oKENIQVIpKDB4OTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxYTogcmV0dXJuKChDSEFSKSgweDgyICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWM6IHJldHVybigoQ0hBUikoMHg5MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDFkOiByZXR1cm4oKENIQVIpKDB4OTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxZTogcmV0dXJuKChDSEFSKSgweDg0ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjA6IHJldHVybigoQ0hBUikoMHg4NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDIxOiByZXR1cm4oKENIQVIpKDB4ODcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAyMjogcmV0dXJuKChDSEFSKSgweDk1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjY6IHJldHVybigoQ0hBUikoMHg4NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDMxOiByZXR1cm4oKENIQVIpKDB4ODkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjBBQzogICAgICAgICAgICAgICAgICAgICAgLyogRXVybyAqLworICAgICAgICAgIHJldHVybigoQ0hBUikoMHg4OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMTE2OiByZXR1cm4oKENIQVIpKDB4YjkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjEyMjogcmV0dXJuKChDSEFSKSgweDk5ICYgMHhmZikpOworICAgICAgZGVmYXVsdDogcmV0dXJuKDB4MDAzZik7CisgICAgfQorfQorCitpbnQgLyogVW5pY29kZSB0byBXaW5kb3dzIENvZGUgUGFnZSAxMjUyIChMYXRpbi0xKSAqLworI2lmZGVmIENLX0FOU0lDCit0eF9jcDEyNTIoVVNIT1JUIGMpCisjZWxzZQordHhfY3AxMjUyKGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPCAweDgwIHx8IChjID4gMHg5ZiAmJiBjIDw9IDB4ZmYpKSAvKiBIYXMgQzEgZ3JhcGhpY3MgKi8KKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgwMTUyOiAgICAgICAgICAgICAgICAgICAgICAvKiBPRSAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4OGMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE1MzogICAgICAgICAgICAgICAgICAgICAgLyogb2UgKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDljICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNjA6ICAgICAgICAgICAgICAgICAgICAgIC8qIFMgY2Fyb24gKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDhhICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNjE6ICAgICAgICAgICAgICAgICAgICAgIC8qIHMgY2Fyb24gKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDlhICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNzg6ICAgICAgICAgICAgICAgICAgICAgIC8qIFkgZGlhZXJlc2lzICovCisgICAgICAgIHJldHVybigoQ0hBUikoMHg5ZiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTdEOiAgICAgICAgICAgICAgICAgICAgICAvKiBaIGNhcm9uICovCisgICAgICAgIHJldHVybigoQ0hBUikoMHg4ZSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTdFOiAgICAgICAgICAgICAgICAgICAgICAvKiB6IGNhcm9uICovCisgICAgICAgIHJldHVybigoQ0hBUikoMHg5ZSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTkyOiAgICAgICAgICAgICAgICAgICAgICAvKiBGbG9yaW4gKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDgzICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTA6IGNhc2UgMHgyMDExOiAgICAgICAgIC8qIEh5cGhlbnMgKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDJkICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTI6IGNhc2UgMHgyMDEzOiAgICAgICAgIC8qIGVuLWRhc2hlcyAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4OTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxNDogY2FzZSAweDIwMTU6ICAgICAgICAgLyogZW0tZGFzaGVzICovCisgICAgICAgIHJldHVybigoQ0hBUikoMHg5NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDE4OiAgICAgICAgICAgICAgICAgICAgICAvKiBWYXJpb3VzIHF1b3RhdGlvbiBtYXJrcy4uLiAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4OTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDkyICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDFkOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxZToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDg0ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjA6ICAgICAgICAgICAgICAgICAgICAgIC8qIERhZ2dlciAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4ODYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAyMTogICAgICAgICAgICAgICAgICAgICAgLyogRG91YmxlIERhZ2dlciAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4ODcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAyMjogICAgICAgICAgICAgICAgICAgICAgLyogQnVsbGV0ICovCisgICAgICAgIHJldHVybigoQ0hBUikoMHg5NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDI2OiAgICAgICAgICAgICAgICAgICAgICAvKiBFbGxpcHNpcyAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4ODUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAzMDogICAgICAgICAgICAgICAgICAgICAgLyogUGVyIG1pbCAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4ODkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjBBQzogICAgICAgICAgICAgICAgICAgICAgLyogRXVybyAqLworICAgICAgICAgIHJldHVybigoQ0hBUikoMHg4MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMTIyOiAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFkZSBNYXJrICovCisgICAgICAgIHJldHVybigoQ0hBUikoMHg5OSAmIDB4ZmYpKTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybigweDAwM2YpOworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDIENvZGUgUGFnZSA4NTIgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfY3A4NTIoVVNIT1JUIGMpCisjZWxzZQordHhfY3A4NTIoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4ODApICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXMgQzEgZ3JhcGhpY3MgKi8KKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgwMGEwOiByZXR1cm4oKENIQVIpKDI1NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE0OiByZXR1cm4oKENIQVIpKDIwNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE3OiByZXR1cm4oKENIQVIpKDI0NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE4OiByZXR1cm4oKENIQVIpKDI0OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFiOiByZXR1cm4oKENIQVIpKDE3NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFjOiByZXR1cm4oKENIQVIpKDE3MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFkOiByZXR1cm4oKENIQVIpKDI0MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIwOiByZXR1cm4oKENIQVIpKDI0OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI0OiByZXR1cm4oKENIQVIpKDIzOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI4OiByZXR1cm4oKENIQVIpKDI0NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJiOiByZXR1cm4oKENIQVIpKDE3NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGMxOiByZXR1cm4oKENIQVIpKDE4MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGMyOiByZXR1cm4oKENIQVIpKDE4MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM0OiByZXR1cm4oKENIQVIpKDE0MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM3OiByZXR1cm4oKENIQVIpKDEyOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM5OiByZXR1cm4oKENIQVIpKDE0NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNiOiByZXR1cm4oKENIQVIpKDIxMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNkOiByZXR1cm4oKENIQVIpKDIxNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGNlOiByZXR1cm4oKENIQVIpKDIxNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQzOiByZXR1cm4oKENIQVIpKDIyNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ0OiByZXR1cm4oKENIQVIpKDIyNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ2OiByZXR1cm4oKENIQVIpKDE1MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ3OiByZXR1cm4oKENIQVIpKDE1OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRhOiByZXR1cm4oKENIQVIpKDIzMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRjOiByZXR1cm4oKENIQVIpKDE1NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRkOiByZXR1cm4oKENIQVIpKDIzNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRmOiByZXR1cm4oKENIQVIpKDIyNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUxOiByZXR1cm4oKENIQVIpKDE2MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUyOiByZXR1cm4oKENIQVIpKDEzMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU0OiByZXR1cm4oKENIQVIpKDEzMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU3OiByZXR1cm4oKENIQVIpKDEzNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU5OiByZXR1cm4oKENIQVIpKDEzMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGViOiByZXR1cm4oKENIQVIpKDEzNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVkOiByZXR1cm4oKENIQVIpKDE2MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVlOiByZXR1cm4oKENIQVIpKDE0MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYzOiByZXR1cm4oKENIQVIpKDE2MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY0OiByZXR1cm4oKENIQVIpKDE0NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY2OiByZXR1cm4oKENIQVIpKDE0OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY3OiByZXR1cm4oKENIQVIpKDI0NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZhOiByZXR1cm4oKENIQVIpKDE2MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZjOiByZXR1cm4oKENIQVIpKDEyOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZkOiByZXR1cm4oKENIQVIpKDIzNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTAyOiByZXR1cm4oKENIQVIpKDE5OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTAzOiByZXR1cm4oKENIQVIpKDE5OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTA0OiByZXR1cm4oKENIQVIpKDE2NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTA1OiByZXR1cm4oKENIQVIpKDE2NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTA2OiByZXR1cm4oKENIQVIpKDE0MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTA3OiByZXR1cm4oKENIQVIpKDEzNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTBjOiByZXR1cm4oKENIQVIpKDE3MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTBkOiByZXR1cm4oKENIQVIpKDE1OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTBlOiByZXR1cm4oKENIQVIpKDIxMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTBmOiByZXR1cm4oKENIQVIpKDIxMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTEwOiByZXR1cm4oKENIQVIpKDIwOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTExOiByZXR1cm4oKENIQVIpKDIwOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTE4OiByZXR1cm4oKENIQVIpKDE2OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTE5OiByZXR1cm4oKENIQVIpKDE2OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTFhOiByZXR1cm4oKENIQVIpKDE4MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTFiOiByZXR1cm4oKENIQVIpKDIxNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTM5OiByZXR1cm4oKENIQVIpKDE0NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTNhOiByZXR1cm4oKENIQVIpKDE0NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTNkOiByZXR1cm4oKENIQVIpKDE0OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTNlOiByZXR1cm4oKENIQVIpKDE1MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTQxOiByZXR1cm4oKENIQVIpKDE1NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTQyOiByZXR1cm4oKENIQVIpKDEzNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTQzOiByZXR1cm4oKENIQVIpKDIyNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTQ0OiByZXR1cm4oKENIQVIpKDIyOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTQ3OiByZXR1cm4oKENIQVIpKDIxMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTQ4OiByZXR1cm4oKENIQVIpKDIyOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTUwOiByZXR1cm4oKENIQVIpKDEzOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTUxOiByZXR1cm4oKENIQVIpKDEzOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTU0OiByZXR1cm4oKENIQVIpKDIzMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTU1OiByZXR1cm4oKENIQVIpKDIzNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTU4OiByZXR1cm4oKENIQVIpKDI1MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTU5OiByZXR1cm4oKENIQVIpKDI1MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTVhOiByZXR1cm4oKENIQVIpKDE1MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTViOiByZXR1cm4oKENIQVIpKDE1MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTVlOiByZXR1cm4oKENIQVIpKDE4NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTVmOiByZXR1cm4oKENIQVIpKDE3MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTYwOiByZXR1cm4oKENIQVIpKDIzMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTYxOiByZXR1cm4oKENIQVIpKDIzMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTYyOiByZXR1cm4oKENIQVIpKDIyMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTYzOiByZXR1cm4oKENIQVIpKDIzOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTY0OiByZXR1cm4oKENIQVIpKDE1NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTY1OiByZXR1cm4oKENIQVIpKDE1NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTZlOiByZXR1cm4oKENIQVIpKDIyMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTZmOiByZXR1cm4oKENIQVIpKDEzMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTcwOiByZXR1cm4oKENIQVIpKDIzNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTcxOiByZXR1cm4oKENIQVIpKDI1MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTc5OiByZXR1cm4oKENIQVIpKDE0MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTdhOiByZXR1cm4oKENIQVIpKDE3MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTdiOiByZXR1cm4oKENIQVIpKDE4OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTdjOiByZXR1cm4oKENIQVIpKDE5MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTdkOiByZXR1cm4oKENIQVIpKDE2NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTdlOiByZXR1cm4oKENIQVIpKDE2NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMmM3OiByZXR1cm4oKENIQVIpKDI0MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMmQ4OiByZXR1cm4oKENIQVIpKDI0NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMmQ5OiByZXR1cm4oKENIQVIpKDI1MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMmRiOiByZXR1cm4oKENIQVIpKDI0MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMmRkOiByZXR1cm4oKENIQVIpKDI0MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTAwOiByZXR1cm4oKENIQVIpKDE5NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTAyOiByZXR1cm4oKENIQVIpKDE3OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTBjOiByZXR1cm4oKENIQVIpKDIxOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTEwOiByZXR1cm4oKENIQVIpKDE5MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTE0OiByZXR1cm4oKENIQVIpKDE5MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTE4OiByZXR1cm4oKENIQVIpKDIxNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTFjOiByZXR1cm4oKENIQVIpKDE5NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTI0OiByZXR1cm4oKENIQVIpKDE4MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTJjOiByZXR1cm4oKENIQVIpKDE5NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTM0OiByZXR1cm4oKENIQVIpKDE5MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTNjOiByZXR1cm4oKENIQVIpKDE5NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTUwOiByZXR1cm4oKENIQVIpKDIwNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTUxOiByZXR1cm4oKENIQVIpKDE4NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTU0OiByZXR1cm4oKENIQVIpKDIwMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTU3OiByZXR1cm4oKENIQVIpKDE4NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTVhOiByZXR1cm4oKENIQVIpKDIwMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTVkOiByZXR1cm4oKENIQVIpKDE4OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTYwOiByZXR1cm4oKENIQVIpKDIwNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTYzOiByZXR1cm4oKENIQVIpKDE4NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTY2OiByZXR1cm4oKENIQVIpKDIwMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTY5OiByZXR1cm4oKENIQVIpKDIwMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTZjOiByZXR1cm4oKENIQVIpKDIwNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTgwOiByZXR1cm4oKENIQVIpKDIyMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTg0OiByZXR1cm4oKENIQVIpKDIyMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTg4OiByZXR1cm4oKENIQVIpKDIxOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkxOiByZXR1cm4oKENIQVIpKDE3NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkyOiByZXR1cm4oKENIQVIpKDE3NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkzOiByZXR1cm4oKENIQVIpKDE3OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNWEwOiByZXR1cm4oKENIQVIpKDI1NCAmIDB4ZmYpKTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9jcHN1YihjKSk7ICAgICAvKiBGb3IgYm94IGNoYXJhY3RlcnMgZXRjICovCisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2luZG93cyBDb2RlIFBhZ2UgMTI1MyAoR3JlZWspICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X2NwMTI1MyhVU0hPUlQgYykKKyNlbHNlCit0eF9jcDEyNTMoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4ODApICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXMgQzEgZ3JhcGhpY3MgKi8KKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgwMDNjOiByZXR1cm4oKENIQVIpKDB4OGIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDAzZTogcmV0dXJuKChDSEFSKSgweDliICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQTA6IHJldHVybigoQ0hBUikoMHhhMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEEzOiByZXR1cm4oKENIQVIpKDB4YTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBNDogcmV0dXJuKChDSEFSKSgweGE0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQTU6IHJldHVybigoQ0hBUikoMHhhNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEE2OiByZXR1cm4oKENIQVIpKDB4YTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBNzogcmV0dXJuKChDSEFSKSgweGE3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQTg6IHJldHVybigoQ0hBUikoMHhhOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEE5OiByZXR1cm4oKENIQVIpKDB4YTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBQTogcmV0dXJuKChDSEFSKSgweGFhICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQUI6IHJldHVybigoQ0hBUikoMHhhYiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEFDOiByZXR1cm4oKENIQVIpKDB4YWMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBRDogcmV0dXJuKChDSEFSKSgweGFkICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQUU6IHJldHVybigoQ0hBUikoMHhhZSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEFGOiByZXR1cm4oKENIQVIpKDB4YWYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCMDogcmV0dXJuKChDSEFSKSgweGIwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQjE6IHJldHVybigoQ0hBUikoMHhiMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEIyOiByZXR1cm4oKENIQVIpKDB4YjIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCMzogcmV0dXJuKChDSEFSKSgweGIzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQjU6IHJldHVybigoQ0hBUikoMHhiNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEI2OiByZXR1cm4oKENIQVIpKDB4YjYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiNzogcmV0dXJuKChDSEFSKSgweGExICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQkI6IHJldHVybigoQ0hBUikoMHhiYiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEJEOiByZXR1cm4oKENIQVIpKDB4YmQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE5MjogcmV0dXJuKChDSEFSKSgweDgzICYgMHhmZikpOworICAgICAgY2FzZSAweDAzODY6IHJldHVybigoQ0hBUikoMHhhMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMzg4OiByZXR1cm4oKENIQVIpKDB4YjggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDM4OTogcmV0dXJuKChDSEFSKSgweGI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOEE6IHJldHVybigoQ0hBUikoMHhiYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMzhDOiByZXR1cm4oKENIQVIpKDB4YmMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDM4RTogcmV0dXJuKChDSEFSKSgweGJlICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOEY6IHJldHVybigoQ0hBUikoMHhiZiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMzkwOiByZXR1cm4oKENIQVIpKDB4YzAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDM5MTogcmV0dXJuKChDSEFSKSgweGMxICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTI6IHJldHVybigoQ0hBUikoMHhjMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMzkzOiByZXR1cm4oKENIQVIpKDB4YzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDM5NDogcmV0dXJuKChDSEFSKSgweGM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTU6IHJldHVybigoQ0hBUikoMHhjNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMzk2OiByZXR1cm4oKENIQVIpKDB4YzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDM5NzogcmV0dXJuKChDSEFSKSgweGM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTg6IHJldHVybigoQ0hBUikoMHhjOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMzk5OiByZXR1cm4oKENIQVIpKDB4YzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDM5QTogcmV0dXJuKChDSEFSKSgweGNhICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOUI6IHJldHVybigoQ0hBUikoMHhjYiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMzlDOiByZXR1cm4oKENIQVIpKDB4Y2MgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDM5RDogcmV0dXJuKChDSEFSKSgweGNkICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOUU6IHJldHVybigoQ0hBUikoMHhjZSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMzlGOiByZXR1cm4oKENIQVIpKDB4Y2YgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNhMDogcmV0dXJuKChDSEFSKSgweGQwICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTE6IHJldHVybigoQ0hBUikoMHhkMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2EzOiByZXR1cm4oKENIQVIpKDB4ZDMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNhNDogcmV0dXJuKChDSEFSKSgweGQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTU6IHJldHVybigoQ0hBUikoMHhkNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2E2OiByZXR1cm4oKENIQVIpKDB4ZDYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNhNzogcmV0dXJuKChDSEFSKSgweGQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTg6IHJldHVybigoQ0hBUikoMHhkOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2E5OiByZXR1cm4oKENIQVIpKDB4ZDkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNhQTogcmV0dXJuKChDSEFSKSgweGRhICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYUI6IHJldHVybigoQ0hBUikoMHhkYiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2FDOiByZXR1cm4oKENIQVIpKDB4ZGMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNhRDogcmV0dXJuKChDSEFSKSgweGRkICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYUU6IHJldHVybigoQ0hBUikoMHhkZSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2FGOiByZXR1cm4oKENIQVIpKDB4ZGYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNiMDogcmV0dXJuKChDSEFSKSgweGUwICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjE6IHJldHVybigoQ0hBUikoMHhlMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2IyOiByZXR1cm4oKENIQVIpKDB4ZTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNiMzogcmV0dXJuKChDSEFSKSgweGUzICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjQ6IHJldHVybigoQ0hBUikoMHhlNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2I1OiByZXR1cm4oKENIQVIpKDB4ZTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNiNjogcmV0dXJuKChDSEFSKSgweGU2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjc6IHJldHVybigoQ0hBUikoMHhlNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2I4OiByZXR1cm4oKENIQVIpKDB4ZTggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNiOTogcmV0dXJuKChDSEFSKSgweGU5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYkE6IHJldHVybigoQ0hBUikoMHhlYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2JCOiByZXR1cm4oKENIQVIpKDB4ZWIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNiQzogcmV0dXJuKChDSEFSKSgweGVjICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYkQ6IHJldHVybigoQ0hBUikoMHhlZCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2JFOiByZXR1cm4oKENIQVIpKDB4ZWUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNiRjogcmV0dXJuKChDSEFSKSgweGVmICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzA6IHJldHVybigoQ0hBUikoMHhmMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2MxOiByZXR1cm4oKENIQVIpKDB4ZjEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNjMjogcmV0dXJuKChDSEFSKSgweGYyICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzM6IHJldHVybigoQ0hBUikoMHhmMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2M0OiByZXR1cm4oKENIQVIpKDB4ZjQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNjNTogcmV0dXJuKChDSEFSKSgweGY1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzY6IHJldHVybigoQ0hBUikoMHhmNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2M3OiByZXR1cm4oKENIQVIpKDB4ZjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNjODogcmV0dXJuKChDSEFSKSgweGY4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzk6IHJldHVybigoQ0hBUikoMHhmOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2NBOiByZXR1cm4oKENIQVIpKDB4ZmEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNjQjogcmV0dXJuKChDSEFSKSgweGZiICYgMHhmZikpOworICAgICAgY2FzZSAweDAzY0M6IHJldHVybigoQ0hBUikoMHhmYyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2NEOiByZXR1cm4oKENIQVIpKDB4ZmQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNjRTogcmV0dXJuKChDSEFSKSgweGZlICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTI6IHJldHVybigoQ0hBUikoMHg5NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDE0OiByZXR1cm4oKENIQVIpKDB4OTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxODogcmV0dXJuKChDSEFSKSgweDkxICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTk6IHJldHVybigoQ0hBUikoMHg5MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDFhOiByZXR1cm4oKENIQVIpKDB4ODIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxYzogcmV0dXJuKChDSEFSKSgweDkzICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWQ6IHJldHVybigoQ0hBUikoMHg5NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDFlOiByZXR1cm4oKENIQVIpKDB4ODQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAyMDogcmV0dXJuKChDSEFSKSgweDg2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjE6IHJldHVybigoQ0hBUikoMHg4NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDIyOiByZXR1cm4oKENIQVIpKDB4OTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAyNjogcmV0dXJuKChDSEFSKSgweDg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMzE6IHJldHVybigoQ0hBUikoMHg4OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMEFDOiAgICAgICAgICAgICAgICAgICAgICAvKiBFdXJvICovCisgICAgICAgICAgcmV0dXJuKChDSEFSKSgweDgwICYgMHhmZikpOworICAgICAgY2FzZSAweDIxMjI6IHJldHVybigoQ0hBUikoMHg5OSAmIDB4ZmYpKTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybigweDAwM2YpOworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdpbmRvd3MgQ29kZSBQYWdlIDEyNTQgKFR1cmtpc2gpICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X2NwMTI1NChVU0hPUlQgYykKKyNlbHNlCit0eF9jcDEyNTQoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4ODApCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDB4MDExZTogcmV0dXJuKChDSEFSKSgweGQwICYgMHhmZikpOyAvKiBHIGJyZXZlICAgICovCisgICAgICBjYXNlIDB4MDEzMDogcmV0dXJuKChDSEFSKSgweGRkICYgMHhmZikpOyAvKiBJIHdpdGggZG90ICovCisgICAgICBjYXNlIDB4MDE1ZTogcmV0dXJuKChDSEFSKSgweGRlICYgMHhmZikpOyAvKiBTIGNlZGlsbGEgICovCisgICAgICBjYXNlIDB4MDExZjogcmV0dXJuKChDSEFSKSgweGYwICYgMHhmZikpOyAvKiBnIGJyZXZlICAgICovCisgICAgICBjYXNlIDB4MDEzMTogcmV0dXJuKChDSEFSKSgweGZkICYgMHhmZikpOyAvKiBpIGRvdGxlc3MgKi8KKyAgICAgIGNhc2UgMHgwMTVmOiByZXR1cm4oKENIQVIpKDB4ZmUgJiAweGZmKSk7IC8qIHMgY2VkaWxsYSAqLworICAgICAgZGVmYXVsdDogcmV0dXJuKHR4X2NwMTI1MihjKSk7ICAgIC8qIFRoZSByZXN0IGlzIGxpa2UgV2luZG93cyBMYXRpbi0xICovCisgICAgfQorfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQwordHhfY3AxMjU1KFVTSE9SVCBjKQorI2Vsc2UKK3R4X2NwMTI1NShjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHgwODApCisgICAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgyMEFDOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4ODAgJiAweGZmKSk7ICAgIC8qIEVVUk8gU0lHTiAqLworICAgICAgY2FzZSAweDIwMUE6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4MiAmIDB4ZmYpKTsgICAgLyogU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLICovCisgICAgICBjYXNlIDB4MDE5MjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDgzICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sgKi8KKyAgICAgIGNhc2UgMHgyMDFFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4ODQgJiAweGZmKSk7ICAgIC8qIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAqLworICAgICAgY2FzZSAweDIwMjY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4NSAmIDB4ZmYpKTsgICAgLyogSE9SSVpPTlRBTCBFTExJUFNJUyAqLworICAgICAgY2FzZSAweDIwMjA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4NiAmIDB4ZmYpKTsgICAgLyogREFHR0VSICovCisgICAgICBjYXNlIDB4MjAyMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDg3ICYgMHhmZikpOyAgICAvKiBET1VCTEUgREFHR0VSICovCisgICAgICBjYXNlIDB4MDJDNjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDg4ICYgMHhmZikpOyAgICAvKiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQgKi8KKyAgICAgIGNhc2UgMHgyMDMwOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4ODkgJiAweGZmKSk7ICAgIC8qIFBFUiBNSUxMRSBTSUdOICovCisgICAgICBjYXNlIDB4MjAzOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDhCICYgMHhmZikpOyAgICAvKiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9URSAqLworICAgICAgY2FzZSAweDIwMTg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5MSAmIDB4ZmYpKTsgICAgLyogTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KKyAgICAgIGNhc2UgMHgyMDE5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTIgJiAweGZmKSk7ICAgIC8qIFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAqLworICAgICAgY2FzZSAweDIwMUM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5MyAmIDB4ZmYpKTsgICAgLyogTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKi8KKyAgICAgIGNhc2UgMHgyMDFEOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTQgJiAweGZmKSk7ICAgIC8qIFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAqLworICAgICAgY2FzZSAweDIwMjI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5NSAmIDB4ZmYpKTsgICAgLyogQlVMTEVUICovCisgICAgICBjYXNlIDB4MjAxMzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDk2ICYgMHhmZikpOyAgICAvKiBFTiBEQVNIICovCisgICAgICBjYXNlIDB4MjAxNDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDk3ICYgMHhmZikpOyAgICAvKiBFTSBEQVNIICovCisgICAgICBjYXNlIDB4MDJEQzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDk4ICYgMHhmZikpOyAgICAvKiBTTUFMTCBUSUxERSAqLworICAgICAgY2FzZSAweDIxMjI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5OSAmIDB4ZmYpKTsgICAgLyogVFJBREUgTUFSSyBTSUdOICovCisgICAgICBjYXNlIDB4MjAzQToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDlCICYgMHhmZikpOyAgICAvKiBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEUgKi8KKyAgICAgIGNhc2UgMHgwMEEwOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTAgJiAweGZmKSk7ICAgIC8qIE5PLUJSRUFLIFNQQUNFICovCisgICAgICBjYXNlIDB4MDBBMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEExICYgMHhmZikpOyAgICAvKiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLICovCisgICAgICBjYXNlIDB4MDBBMjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEEyICYgMHhmZikpOyAgICAvKiBDRU5UIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMEEzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTMgJiAweGZmKSk7ICAgIC8qIFBPVU5EIFNJR04gKi8KKyAgICAgIGNhc2UgMHgyMEFBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTQgJiAweGZmKSk7ICAgIC8qIE5FVyBTSEVRRUwgU0lHTiAqLworICAgICAgY2FzZSAweDAwQTU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBNSAmIDB4ZmYpKTsgICAgLyogWUVOIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMEE2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTYgJiAweGZmKSk7ICAgIC8qIEJST0tFTiBCQVIgKi8KKyAgICAgIGNhc2UgMHgwMEE3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTcgJiAweGZmKSk7ICAgIC8qIFNFQ1RJT04gU0lHTiAqLworICAgICAgY2FzZSAweDAwQTg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBOCAmIDB4ZmYpKTsgICAgLyogRElBRVJFU0lTICovCisgICAgICBjYXNlIDB4MDBBOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEE5ICYgMHhmZikpOyAgICAvKiBDT1BZUklHSFQgU0lHTiAqLworICAgICAgY2FzZSAweDAwRDc6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBQSAmIDB4ZmYpKTsgICAgLyogTVVMVElQTElDQVRJT04gU0lHTiAqLworICAgICAgY2FzZSAweDAwQUI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBQiAmIDB4ZmYpKTsgICAgLyogTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEUgKi8KKyAgICAgIGNhc2UgMHgwMEFDOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QUMgJiAweGZmKSk7ICAgIC8qIE5PVCBTSUdOICovCisgICAgICBjYXNlIDB4MDBBRDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEFEICYgMHhmZikpOyAgICAvKiBTT0ZUIEhZUEhFTiAqLworICAgICAgY2FzZSAweDAwQUU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBRSAmIDB4ZmYpKTsgICAgLyogUkVHSVNURVJFRCBTSUdOICovCisgICAgICBjYXNlIDB4MDBBRjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEFGICYgMHhmZikpOyAgICAvKiBNQUNST04gKi8KKyAgICAgIGNhc2UgMHgwMEIwOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjAgJiAweGZmKSk7ICAgIC8qIERFR1JFRSBTSUdOICovCisgICAgICBjYXNlIDB4MDBCMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEIxICYgMHhmZikpOyAgICAvKiBQTFVTLU1JTlVTIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMEIyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjIgJiAweGZmKSk7ICAgIC8qIFNVUEVSU0NSSVBUIFRXTyAqLworICAgICAgY2FzZSAweDAwQjM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCMyAmIDB4ZmYpKTsgICAgLyogU1VQRVJTQ1JJUFQgVEhSRUUgKi8KKyAgICAgIGNhc2UgMHgwMEI0OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjQgJiAweGZmKSk7ICAgIC8qIEFDVVRFIEFDQ0VOVCAqLworICAgICAgY2FzZSAweDAwQjU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCNSAmIDB4ZmYpKTsgICAgLyogTUlDUk8gU0lHTiAqLworICAgICAgY2FzZSAweDAwQjY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCNiAmIDB4ZmYpKTsgICAgLyogUElMQ1JPVyBTSUdOICovCisgICAgICBjYXNlIDB4MDBCNzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEI3ICYgMHhmZikpOyAgICAvKiBNSURETEUgRE9UICovCisgICAgICBjYXNlIDB4MDBCODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEI4ICYgMHhmZikpOyAgICAvKiBDRURJTExBICovCisgICAgICBjYXNlIDB4MDBCOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEI5ICYgMHhmZikpOyAgICAvKiBTVVBFUlNDUklQVCBPTkUgKi8KKyAgICAgIGNhc2UgMHgwMEY3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QkEgJiAweGZmKSk7ICAgIC8qIERJVklTSU9OIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMEJCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QkIgJiAweGZmKSk7ICAgIC8qIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9URSAqLworICAgICAgY2FzZSAweDAwQkM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCQyAmIDB4ZmYpKTsgICAgLyogVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSICovCisgICAgICBjYXNlIDB4MDBCRDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEJEICYgMHhmZikpOyAgICAvKiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYgKi8KKyAgICAgIGNhc2UgMHgwMEJFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QkUgJiAweGZmKSk7ICAgIC8qIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUyAqLworICAgICAgY2FzZSAweDAwQkY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCRiAmIDB4ZmYpKTsgICAgLyogSU5WRVJURUQgUVVFU1RJT04gTUFSSyAqLworICAgICAgY2FzZSAweDA1QjA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDMCAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIFBPSU5UIFNIRVZBICovCisgICAgICBjYXNlIDB4MDVCMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEMxICYgMHhmZikpOyAgICAvKiBIRUJSRVcgUE9JTlQgSEFUQUYgU0VHT0wgKi8KKyAgICAgIGNhc2UgMHgwNUIyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzIgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBQT0lOVCBIQVRBRiBQQVRBSCAqLworICAgICAgY2FzZSAweDA1QjM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDMyAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIFBPSU5UIEhBVEFGIFFBTUFUUyAqLworICAgICAgY2FzZSAweDA1QjQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDNCAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIFBPSU5UIEhJUklRICovCisgICAgICBjYXNlIDB4MDVCNToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEM1ICYgMHhmZikpOyAgICAvKiBIRUJSRVcgUE9JTlQgVFNFUkUgKi8KKyAgICAgIGNhc2UgMHgwNUI2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzYgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBQT0lOVCBTRUdPTCAqLworICAgICAgY2FzZSAweDA1Qjc6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDNyAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIFBPSU5UIFBBVEFIICovCisgICAgICBjYXNlIDB4MDVCODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEM4ICYgMHhmZikpOyAgICAvKiBIRUJSRVcgUE9JTlQgUUFNQVRTICovCisgICAgICBjYXNlIDB4MDVCOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEM5ICYgMHhmZikpOyAgICAvKiBIRUJSRVcgUE9JTlQgSE9MQU0gKi8KKyAgICAgIGNhc2UgMHgwNUJCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4Q0IgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBQT0lOVCBRVUJVVFMgKi8KKyAgICAgIGNhc2UgMHgwNUJDOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4Q0MgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBQT0lOVCBEQUdFU0ggT1IgTUFQSVEgKi8KKyAgICAgIGNhc2UgMHgwNUJEOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4Q0QgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBQT0lOVCBNRVRFRyAqLworICAgICAgY2FzZSAweDA1QkU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDRSAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIFBVTkNUVUFUSU9OIE1BUUFGICovCisgICAgICBjYXNlIDB4MDVCRjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweENGICYgMHhmZikpOyAgICAvKiBIRUJSRVcgUE9JTlQgUkFGRSAqLworICAgICAgY2FzZSAweDA1QzA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhEMCAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIFBVTkNUVUFUSU9OIFBBU0VRICovCisgICAgICBjYXNlIDB4MDVDMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQxICYgMHhmZikpOyAgICAvKiBIRUJSRVcgUE9JTlQgU0hJTiBET1QgKi8KKyAgICAgIGNhc2UgMHgwNUMyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RDIgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBQT0lOVCBTSU4gRE9UICovCisgICAgICBjYXNlIDB4MDVDMzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQzICYgMHhmZikpOyAgICAvKiBIRUJSRVcgUFVOQ1RVQVRJT04gU09GIFBBU1VRICovCisgICAgICBjYXNlIDB4MDVGMDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQ0ICYgMHhmZikpOyAgICAvKiBIRUJSRVcgTElHLiBZSURESVNIIERPVUJMRSBWQVYgKi8KKyAgICAgIGNhc2UgMHgwNUYxOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RDUgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMSUdBVFVSRSBZSURESVNIIFZBViBZT0QgKi8KKyAgICAgIGNhc2UgMHgwNUYyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RDYgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMSUcuIFlJRERJU0ggRE9VQkxFIFlPRCAqLworICAgICAgY2FzZSAweDA1RjM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhENyAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIFBVTkNUVUFUSU9OIEdFUkVTSCAqLworICAgICAgY2FzZSAweDA1RjQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhEOCAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIFBVTkNUVUFUSU9OIEdFUlNIQVlJTSAqLworICAgICAgY2FzZSAweDA1RDA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFMCAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIExFVFRFUiBBTEVGICovCisgICAgICBjYXNlIDB4MDVEMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEUxICYgMHhmZikpOyAgICAvKiBIRUJSRVcgTEVUVEVSIEJFVCAqLworICAgICAgY2FzZSAweDA1RDI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFMiAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIExFVFRFUiBHSU1FTCAqLworICAgICAgY2FzZSAweDA1RDM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFMyAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIExFVFRFUiBEQUxFVCAqLworICAgICAgY2FzZSAweDA1RDQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFNCAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIExFVFRFUiBIRSAqLworICAgICAgY2FzZSAweDA1RDU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFNSAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIExFVFRFUiBWQVYgKi8KKyAgICAgIGNhc2UgMHgwNUQ2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTYgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMRVRURVIgWkFZSU4gKi8KKyAgICAgIGNhc2UgMHgwNUQ3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTcgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMRVRURVIgSEVUICovCisgICAgICBjYXNlIDB4MDVEODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEU4ICYgMHhmZikpOyAgICAvKiBIRUJSRVcgTEVUVEVSIFRFVCAqLworICAgICAgY2FzZSAweDA1RDk6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFOSAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIExFVFRFUiBZT0QgKi8KKyAgICAgIGNhc2UgMHgwNURBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RUEgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMRVRURVIgRklOQUwgS0FGICovCisgICAgICBjYXNlIDB4MDVEQjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEVCICYgMHhmZikpOyAgICAvKiBIRUJSRVcgTEVUVEVSIEtBRiAqLworICAgICAgY2FzZSAweDA1REM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFQyAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIExFVFRFUiBMQU1FRCAqLworICAgICAgY2FzZSAweDA1REQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFRCAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIExFVFRFUiBGSU5BTCBNRU0gKi8KKyAgICAgIGNhc2UgMHgwNURFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RUUgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMRVRURVIgTUVNICovCisgICAgICBjYXNlIDB4MDVERjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEVGICYgMHhmZikpOyAgICAvKiBIRUJSRVcgTEVUVEVSIEZJTkFMIE5VTiAqLworICAgICAgY2FzZSAweDA1RTA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGMCAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIExFVFRFUiBOVU4gKi8KKyAgICAgIGNhc2UgMHgwNUUxOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjEgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMRVRURVIgU0FNRUtIICovCisgICAgICBjYXNlIDB4MDVFMjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEYyICYgMHhmZikpOyAgICAvKiBIRUJSRVcgTEVUVEVSIEFZSU4gKi8KKyAgICAgIGNhc2UgMHgwNUUzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjMgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMRVRURVIgRklOQUwgUEUgKi8KKyAgICAgIGNhc2UgMHgwNUU0OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjQgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMRVRURVIgUEUgKi8KKyAgICAgIGNhc2UgMHgwNUU1OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjUgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMRVRURVIgRklOQUwgVFNBREkgKi8KKyAgICAgIGNhc2UgMHgwNUU2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjYgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMRVRURVIgVFNBREkgKi8KKyAgICAgIGNhc2UgMHgwNUU3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjcgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMRVRURVIgUU9GICovCisgICAgICBjYXNlIDB4MDVFODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEY4ICYgMHhmZikpOyAgICAvKiBIRUJSRVcgTEVUVEVSIFJFU0ggKi8KKyAgICAgIGNhc2UgMHgwNUU5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjkgJiAweGZmKSk7ICAgIC8qIEhFQlJFVyBMRVRURVIgU0hJTiAqLworICAgICAgY2FzZSAweDA1RUE6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGQSAmIDB4ZmYpKTsgICAgLyogSEVCUkVXIExFVFRFUiBUQVYgKi8KKyAgICAgIGNhc2UgMHgyMDBFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RkQgJiAweGZmKSk7ICAgIC8qIExFRlQtVE8tUklHSFQgTUFSSyAqLworICAgICAgY2FzZSAweDIwMEY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGRSAmIDB4ZmYpKTsgICAgLyogUklHSFQtVE8tTEVGVCBNQVJLICovCisgICAgICBkZWZhdWx0OiByZXR1cm4oMHgwMDNmKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaW5kb3dzIEFyYWJpYyAqLworI2lmZGVmIENLX0FOU0lDCit0eF9jcDEyNTYoVVNIT1JUIGMpCisjZWxzZQordHhfY3AxMjU2KGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPCAweDgwKQorICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDIwQUM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4MCAmIDB4ZmYpKTsgICAgLyogRVVSTyBTSUdOICovCisgICAgICBjYXNlIDB4MDY3RToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDgxICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTEVUVEVSIFBFSCAqLworICAgICAgY2FzZSAweDIwMUE6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4MiAmIDB4ZmYpKTsgICAgLyogU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLICovCisgICAgICBjYXNlIDB4MDE5MjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDgzICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sgKi8KKyAgICAgIGNhc2UgMHgyMDFFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4ODQgJiAweGZmKSk7ICAgIC8qIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAqLworICAgICAgY2FzZSAweDIwMjY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4NSAmIDB4ZmYpKTsgICAgLyogSE9SSVpPTlRBTCBFTExJUFNJUyAqLworICAgICAgY2FzZSAweDIwMjA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4NiAmIDB4ZmYpKTsgICAgLyogREFHR0VSICovCisgICAgICBjYXNlIDB4MjAyMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDg3ICYgMHhmZikpOyAgICAvKiBET1VCTEUgREFHR0VSICovCisgICAgICBjYXNlIDB4MDJDNjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDg4ICYgMHhmZikpOyAgICAvKiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQgKi8KKyAgICAgIGNhc2UgMHgyMDMwOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4ODkgJiAweGZmKSk7ICAgIC8qIFBFUiBNSUxMRSBTSUdOICovCisgICAgICBjYXNlIDB4MjAzOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDhCICYgMHhmZikpOyAgICAvKiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9URSAqLworICAgICAgY2FzZSAweDAxNTI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4QyAmIDB4ZmYpKTsgICAgLyogTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRSAqLworICAgICAgY2FzZSAweDA2ODY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4RCAmIDB4ZmYpKTsgICAgLyogQVJBQklDIExFVFRFUiBUQ0hFSCAqLworICAgICAgY2FzZSAweDA2OTg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4RSAmIDB4ZmYpKTsgICAgLyogQVJBQklDIExFVFRFUiBKRUggKi8KKyAgICAgIGNhc2UgMHgwNkFGOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTAgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgR0FGICovCisgICAgICBjYXNlIDB4MjAxODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDkxICYgMHhmZikpOyAgICAvKiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAqLworICAgICAgY2FzZSAweDIwMTk6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5MiAmIDB4ZmYpKTsgICAgLyogUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLICovCisgICAgICBjYXNlIDB4MjAxQzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDkzICYgMHhmZikpOyAgICAvKiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAqLworICAgICAgY2FzZSAweDIwMUQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5NCAmIDB4ZmYpKTsgICAgLyogUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLICovCisgICAgICBjYXNlIDB4MjAyMjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDk1ICYgMHhmZikpOyAgICAvKiBCVUxMRVQgKi8KKyAgICAgIGNhc2UgMHgyMDEzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTYgJiAweGZmKSk7ICAgIC8qIEVOIERBU0ggKi8KKyAgICAgIGNhc2UgMHgyMDE0OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTcgJiAweGZmKSk7ICAgIC8qIEVNIERBU0ggKi8KKyAgICAgIGNhc2UgMHgyMTIyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTkgJiAweGZmKSk7ICAgIC8qIFRSQURFIE1BUksgU0lHTiAqLworICAgICAgY2FzZSAweDIwM0E6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5QiAmIDB4ZmYpKTsgICAgLyogU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RFICovCisgICAgICBjYXNlIDB4MDE1MzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDlDICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRSAqLworICAgICAgY2FzZSAweDIwMEM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5RCAmIDB4ZmYpKTsgICAgLyogWkVSTyBXSURUSCBOT04tSk9JTkVSICovCisgICAgICBjYXNlIDB4MjAwRDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDlFICYgMHhmZikpOyAgICAvKiBaRVJPIFdJRFRIIEpPSU5FUiAqLworICAgICAgY2FzZSAweDAwQTA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBMCAmIDB4ZmYpKTsgICAgLyogTk8tQlJFQUsgU1BBQ0UgKi8KKyAgICAgIGNhc2UgMHgwNjBDOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTEgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBDT01NQSAqLworICAgICAgY2FzZSAweDAwQTI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBMiAmIDB4ZmYpKTsgICAgLyogQ0VOVCBTSUdOICovCisgICAgICBjYXNlIDB4MDBBMzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEEzICYgMHhmZikpOyAgICAvKiBQT1VORCBTSUdOICovCisgICAgICBjYXNlIDB4MDBBNDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEE0ICYgMHhmZikpOyAgICAvKiBDVVJSRU5DWSBTSUdOICovCisgICAgICBjYXNlIDB4MDBBNToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEE1ICYgMHhmZikpOyAgICAvKiBZRU4gU0lHTiAqLworICAgICAgY2FzZSAweDAwQTY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBNiAmIDB4ZmYpKTsgICAgLyogQlJPS0VOIEJBUiAqLworICAgICAgY2FzZSAweDAwQTc6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBNyAmIDB4ZmYpKTsgICAgLyogU0VDVElPTiBTSUdOICovCisgICAgICBjYXNlIDB4MDBBODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEE4ICYgMHhmZikpOyAgICAvKiBESUFFUkVTSVMgKi8KKyAgICAgIGNhc2UgMHgwMEE5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTkgJiAweGZmKSk7ICAgIC8qIENPUFlSSUdIVCBTSUdOICovCisgICAgICBjYXNlIDB4MDBBQjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEFCICYgMHhmZikpOyAgICAvKiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9URSAqLworICAgICAgY2FzZSAweDAwQUM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBQyAmIDB4ZmYpKTsgICAgLyogTk9UIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMEFEOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QUQgJiAweGZmKSk7ICAgIC8qIFNPRlQgSFlQSEVOICovCisgICAgICBjYXNlIDB4MDBBRToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEFFICYgMHhmZikpOyAgICAvKiBSRUdJU1RFUkVEIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMEFGOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QUYgJiAweGZmKSk7ICAgIC8qIE1BQ1JPTiAqLworICAgICAgY2FzZSAweDAwQjA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCMCAmIDB4ZmYpKTsgICAgLyogREVHUkVFIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMEIxOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjEgJiAweGZmKSk7ICAgIC8qIFBMVVMtTUlOVVMgU0lHTiAqLworICAgICAgY2FzZSAweDAwQjI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCMiAmIDB4ZmYpKTsgICAgLyogU1VQRVJTQ1JJUFQgVFdPICovCisgICAgICBjYXNlIDB4MDBCMzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEIzICYgMHhmZikpOyAgICAvKiBTVVBFUlNDUklQVCBUSFJFRSAqLworICAgICAgY2FzZSAweDAwQjQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCNCAmIDB4ZmYpKTsgICAgLyogQUNVVEUgQUNDRU5UICovCisgICAgICBjYXNlIDB4MDBCNToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEI1ICYgMHhmZikpOyAgICAvKiBNSUNSTyBTSUdOICovCisgICAgICBjYXNlIDB4MDBCNjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEI2ICYgMHhmZikpOyAgICAvKiBQSUxDUk9XIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMEI3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjcgJiAweGZmKSk7ICAgIC8qIE1JRERMRSBET1QgKi8KKyAgICAgIGNhc2UgMHgwMEI4OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjggJiAweGZmKSk7ICAgIC8qIENFRElMTEEgKi8KKyAgICAgIGNhc2UgMHgwMEI5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjkgJiAweGZmKSk7ICAgIC8qIFNVUEVSU0NSSVBUIE9ORSAqLworICAgICAgY2FzZSAweDA2MUI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCQSAmIDB4ZmYpKTsgICAgLyogQVJBQklDIFNFTUlDT0xPTiAqLworICAgICAgY2FzZSAweDAwQkI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCQiAmIDB4ZmYpKTsgICAgLyogUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RFICovCisgICAgICBjYXNlIDB4MDBCQzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEJDICYgMHhmZikpOyAgICAvKiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIgKi8KKyAgICAgIGNhc2UgMHgwMEJEOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QkQgJiAweGZmKSk7ICAgIC8qIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRiAqLworICAgICAgY2FzZSAweDAwQkU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCRSAmIDB4ZmYpKTsgICAgLyogVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTICovCisgICAgICBjYXNlIDB4MDYxRjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEJGICYgMHhmZikpOyAgICAvKiBBUkFCSUMgUVVFU1RJT04gTUFSSyAqLworICAgICAgY2FzZSAweDA2MjE6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDMSAmIDB4ZmYpKTsgICAgLyogQVJBQklDIExFVFRFUiBIQU1aQSAqLworICAgICAgY2FzZSAweDA2MjI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDMiAmIDB4ZmYpKTsgICAgLyogQVJBQklDIExUUi4gQUxFRiBXSVRIIE1BRERBIEFCT1ZFICovCisgICAgICBjYXNlIDB4MDYyMzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEMzICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTFRSLiBBTEVGIFdJVEggSEFNWkEgQUJPVkUgKi8KKyAgICAgIGNhc2UgMHgwNjI0OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzQgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMVFIuIFdBVyBXSVRIIEhBTVpBIEFCT1ZFICovCisgICAgICBjYXNlIDB4MDYyNToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEM1ICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTFRSLiBBTEVGIFdJVEggSEFNWkEgQkVMT1cgKi8KKyAgICAgIGNhc2UgMHgwNjI2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzYgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMVFIuIFlFSCBXSVRIIEhBTVpBIEFCT1ZFICovCisgICAgICBjYXNlIDB4MDYyNzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEM3ICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTFRSLiBBTEVGICovCisgICAgICBjYXNlIDB4MDYyODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEM4ICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTFRSLiBCRUggKi8KKyAgICAgIGNhc2UgMHgwNjI5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzkgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgVEVIIE1BUkJVVEEgKi8KKyAgICAgIGNhc2UgMHgwNjJBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4Q0EgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgVEVIICovCisgICAgICBjYXNlIDB4MDYyQjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweENCICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTEVUVEVSIFRIRUggKi8KKyAgICAgIGNhc2UgMHgwNjJDOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4Q0MgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgSkVFTSAqLworICAgICAgY2FzZSAweDA2MkQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDRCAmIDB4ZmYpKTsgICAgLyogQVJBQklDIExFVFRFUiBIQUggKi8KKyAgICAgIGNhc2UgMHgwNjJFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4Q0UgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgS0hBSCAqLworICAgICAgY2FzZSAweDA2MkY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDRiAmIDB4ZmYpKTsgICAgLyogQVJBQklDIExFVFRFUiBEQUwgKi8KKyAgICAgIGNhc2UgMHgwNjMwOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RDAgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgVEhBTCAqLworICAgICAgY2FzZSAweDA2MzE6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhEMSAmIDB4ZmYpKTsgICAgLyogQVJBQklDIExFVFRFUiBSRUggKi8KKyAgICAgIGNhc2UgMHgwNjMyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RDIgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgWkFJTiAqLworICAgICAgY2FzZSAweDA2MzM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhEMyAmIDB4ZmYpKTsgICAgLyogQVJBQklDIExFVFRFUiBTRUVOICovCisgICAgICBjYXNlIDB4MDYzNDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQ0ICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTEVUVEVSIFNIRUVOICovCisgICAgICBjYXNlIDB4MDYzNToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQ1ICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTEVUVEVSIFNBRCAqLworICAgICAgY2FzZSAweDA2MzY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhENiAmIDB4ZmYpKTsgICAgLyogQVJBQklDIExFVFRFUiBEQUQgKi8KKyAgICAgIGNhc2UgMHgwMEQ3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RDcgJiAweGZmKSk7ICAgIC8qIE1VTFRJUExJQ0FUSU9OIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwNjM3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RDggJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgVEFIICovCisgICAgICBjYXNlIDB4MDYzODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQ5ICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTEVUVEVSIFpBSCAqLworICAgICAgY2FzZSAweDA2Mzk6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhEQSAmIDB4ZmYpKTsgICAgLyogQVJBQklDIExFVFRFUiBBSU4gKi8KKyAgICAgIGNhc2UgMHgwNjNBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4REIgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgR0hBSU4gKi8KKyAgICAgIGNhc2UgMHgwNjQwOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4REMgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBUQVRXRUVMICovCisgICAgICBjYXNlIDB4MDY0MToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEREICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTEVUVEVSIEZFSCAqLworICAgICAgY2FzZSAweDA2NDI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhERSAmIDB4ZmYpKTsgICAgLyogQVJBQklDIExFVFRFUiBRQUYgKi8KKyAgICAgIGNhc2UgMHgwNjQzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4REYgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgS0FGICovCisgICAgICBjYXNlIDB4MDBFMDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEUwICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFICovCisgICAgICBjYXNlIDB4MDY0NDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEUxICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTEVUVEVSIExBTSAqLworICAgICAgY2FzZSAweDAwRTI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFMiAmIDB4ZmYpKTsgICAgLyogU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYICovCisgICAgICBjYXNlIDB4MDY0NToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEUzICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTEVUVEVSIE1FRU0gKi8KKyAgICAgIGNhc2UgMHgwNjQ2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTQgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgTk9PTiAqLworICAgICAgY2FzZSAweDA2NDc6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFNSAmIDB4ZmYpKTsgICAgLyogQVJBQklDIExFVFRFUiBIRUggKi8KKyAgICAgIGNhc2UgMHgwNjQ4OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTYgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgV0FXICovCisgICAgICBjYXNlIDB4MDBFNzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEU3ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEgKi8KKyAgICAgIGNhc2UgMHgwMEU4OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTggJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUgKi8KKyAgICAgIGNhc2UgMHgwMEU5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTkgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUgKi8KKyAgICAgIGNhc2UgMHgwMEVBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RUEgJiAweGZmKSk7ICAgIC8qIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCAqLworICAgICAgY2FzZSAweDAwRUI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFQiAmIDB4ZmYpKTsgICAgLyogU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMgKi8KKyAgICAgIGNhc2UgMHgwNjQ5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RUMgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBICovCisgICAgICBjYXNlIDB4MDY0QToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEVEICYgMHhmZikpOyAgICAvKiBBUkFCSUMgTEVUVEVSIFlFSCAqLworICAgICAgY2FzZSAweDAwRUU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFRSAmIDB4ZmYpKTsgICAgLyogU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYICovCisgICAgICBjYXNlIDB4MDBFRjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEVGICYgMHhmZikpOyAgICAvKiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUyAqLworICAgICAgY2FzZSAweDA2NEI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGMCAmIDB4ZmYpKTsgICAgLyogQVJBQklDIEZBVEhBVEFOICovCisgICAgICBjYXNlIDB4MDY0QzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEYxICYgMHhmZikpOyAgICAvKiBBUkFCSUMgREFNTUFUQU4gKi8KKyAgICAgIGNhc2UgMHgwNjREOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjIgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBLQVNSQVRBTiAqLworICAgICAgY2FzZSAweDA2NEU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGMyAmIDB4ZmYpKTsgICAgLyogQVJBQklDIEZBVEhBICovCisgICAgICBjYXNlIDB4MDBGNDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEY0ICYgMHhmZikpOyAgICAvKiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KKyAgICAgIGNhc2UgMHgwNjRGOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjUgJiAweGZmKSk7ICAgIC8qIEFSQUJJQyBEQU1NQSAqLworICAgICAgY2FzZSAweDA2NTA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGNiAmIDB4ZmYpKTsgICAgLyogQVJBQklDIEtBU1JBICovCisgICAgICBjYXNlIDB4MDBGNzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEY3ICYgMHhmZikpOyAgICAvKiBESVZJU0lPTiBTSUdOICovCisgICAgICBjYXNlIDB4MDY1MToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEY4ICYgMHhmZikpOyAgICAvKiBBUkFCSUMgU0hBRERBICovCisgICAgICBjYXNlIDB4MDBGOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEY5ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFICovCisgICAgICBjYXNlIDB4MDY1MjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEZBICYgMHhmZikpOyAgICAvKiBBUkFCSUMgU1VLVU4gKi8KKyAgICAgIGNhc2UgMHgwMEZCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RkIgJiAweGZmKSk7ICAgIC8qIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLworICAgICAgY2FzZSAweDAwRkM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGQyAmIDB4ZmYpKTsgICAgLyogU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgKi8KKyAgICAgIGNhc2UgMHgyMDBFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RkQgJiAweGZmKSk7ICAgIC8qIExFRlQtVE8tUklHSFQgTUFSSyAqLworICAgICAgY2FzZSAweDIwMEY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGRSAmIDB4ZmYpKTsgICAgLyogUklHSFQtVE8tTEVGVCBNQVJLICovCisgICAgICBkZWZhdWx0OiByZXR1cm4oMHgwMDNmKTsKKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaW5kb3dzIENvZGUgUGFnZSAxMjU3IChMYXRpbi00KSAqLworI2lmZGVmIENLX0FOU0lDCit0eF9jcDEyNTcoVVNIT1JUIGMpCisjZWxzZQordHhfY3AxMjU3KGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPCAweDgwKQorICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDAwM2M6IHJldHVybigoQ0hBUikoMHg4YiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMDNlOiByZXR1cm4oKENIQVIpKDB4OWIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBMDogcmV0dXJuKChDSEFSKSgweGEwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQTI6IHJldHVybigoQ0hBUikoMHhhMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEEzOiByZXR1cm4oKENIQVIpKDB4YTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBNDogcmV0dXJuKChDSEFSKSgweGE0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQTY6IHJldHVybigoQ0hBUikoMHhhNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEE3OiByZXR1cm4oKENIQVIpKDB4YTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBOTogcmV0dXJuKChDSEFSKSgweGE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQUI6IHJldHVybigoQ0hBUikoMHhhYiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEFDOiByZXR1cm4oKENIQVIpKDB4YWMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBRDogcmV0dXJuKChDSEFSKSgweGFkICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQUU6IHJldHVybigoQ0hBUikoMHhhZSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEIwOiByZXR1cm4oKENIQVIpKDB4YjAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCMTogcmV0dXJuKChDSEFSKSgweGIxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQjI6IHJldHVybigoQ0hBUikoMHhiMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEIzOiByZXR1cm4oKENIQVIpKDB4YjMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCNTogcmV0dXJuKChDSEFSKSgweGI1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQjY6IHJldHVybigoQ0hBUikoMHhiNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEI3OiByZXR1cm4oKENIQVIpKDB4YjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCOTogcmV0dXJuKChDSEFSKSgweGI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQkI6IHJldHVybigoQ0hBUikoMHhiYiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEJDOiByZXR1cm4oKENIQVIpKDB4YmMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBCRDogcmV0dXJuKChDSEFSKSgweGJkICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQkU6IHJldHVybigoQ0hBUikoMHhiZSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEM0OiByZXR1cm4oKENIQVIpKDB4YzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBDNTogcmV0dXJuKChDSEFSKSgweGM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzY6IHJldHVybigoQ0hBUikoMHhhZiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEM5OiByZXR1cm4oKENIQVIpKDB4YzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkMzogcmV0dXJuKChDSEFSKSgweGQzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwRDU6IHJldHVybigoQ0hBUikoMHhkNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEQ2OiByZXR1cm4oKENIQVIpKDB4ZDYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBENzogcmV0dXJuKChDSEFSKSgweGQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDg6IHJldHVybigoQ0hBUikoMHhhOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMERDOiByZXR1cm4oKENIQVIpKDB4ZGMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBERjogcmV0dXJuKChDSEFSKSgweGRmICYgMHhmZikpOworICAgICAgY2FzZSAweDAwRTQ6IHJldHVybigoQ0hBUikoMHhlNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEU1OiByZXR1cm4oKENIQVIpKDB4ZTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlNjogcmV0dXJuKChDSEFSKSgweGJmICYgMHhmZikpOworICAgICAgY2FzZSAweDAwRTk6IHJldHVybigoQ0hBUikoMHhlOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYzOiByZXR1cm4oKENIQVIpKDB4ZjMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBGNTogcmV0dXJuKChDSEFSKSgweGY1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwRjY6IHJldHVybigoQ0hBUikoMHhmNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEY3OiByZXR1cm4oKENIQVIpKDB4ZjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmODogcmV0dXJuKChDSEFSKSgweGI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmM6IHJldHVybigoQ0hBUikoMHhmYyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTAwOiByZXR1cm4oKENIQVIpKDB4YzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDEwMTogcmV0dXJuKChDSEFSKSgweGUyICYgMHhmZikpOworICAgICAgY2FzZSAweDAxMDQ6IHJldHVybigoQ0hBUikoMHhjMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTA1OiByZXR1cm4oKENIQVIpKDB4ZTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDEwNjogcmV0dXJuKChDSEFSKSgweGMzICYgMHhmZikpOworICAgICAgY2FzZSAweDAxMDc6IHJldHVybigoQ0hBUikoMHhlMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTBDOiByZXR1cm4oKENIQVIpKDB4YzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDEwRDogcmV0dXJuKChDSEFSKSgweGU4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxMTI6IHJldHVybigoQ0hBUikoMHhjNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTEzOiByZXR1cm4oKENIQVIpKDB4ZTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDExNjogcmV0dXJuKChDSEFSKSgweGNiICYgMHhmZikpOworICAgICAgY2FzZSAweDAxMTc6IHJldHVybigoQ0hBUikoMHhlYiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTE4OiByZXR1cm4oKENIQVIpKDB4YzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDExOTogcmV0dXJuKChDSEFSKSgweGU2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxMjI6IHJldHVybigoQ0hBUikoMHhjYyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTIzOiByZXR1cm4oKENIQVIpKDB4ZWMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDEyYTogcmV0dXJuKChDSEFSKSgweGNlICYgMHhmZikpOworICAgICAgY2FzZSAweDAxMmI6IHJldHVybigoQ0hBUikoMHhlZSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTJlOiByZXR1cm4oKENIQVIpKDB4YzEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDEyZjogcmV0dXJuKChDSEFSKSgweGUxICYgMHhmZikpOworICAgICAgY2FzZSAweDAxMzY6IHJldHVybigoQ0hBUikoMHhjZCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTM3OiByZXR1cm4oKENIQVIpKDB4ZWQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDEzYzogcmV0dXJuKChDSEFSKSgweGVmICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNDE6IHJldHVybigoQ0hBUikoMHhkOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTQyOiByZXR1cm4oKENIQVIpKDB4ZjkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE0MzogcmV0dXJuKChDSEFSKSgweGQxICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNDQ6IHJldHVybigoQ0hBUikoMHhmMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTQ1OiByZXR1cm4oKENIQVIpKDB4ZDIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE0NjogcmV0dXJuKChDSEFSKSgweGYyICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNGM6IHJldHVybigoQ0hBUikoMHhkNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTRkOiByZXR1cm4oKENIQVIpKDB4ZjQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE1NjogcmV0dXJuKChDSEFSKSgweGFhICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNTc6IHJldHVybigoQ0hBUikoMHhiYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTVBOiByZXR1cm4oKENIQVIpKDB4ZGEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE1YjogcmV0dXJuKChDSEFSKSgweGZhICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNjA6IHJldHVybigoQ0hBUikoMHhkMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTYxOiByZXR1cm4oKENIQVIpKDB4ZjAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE2YTogcmV0dXJuKChDSEFSKSgweGRiICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNmI6IHJldHVybigoQ0hBUikoMHhmYiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTcyOiByZXR1cm4oKENIQVIpKDB4ZDggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE3MzogcmV0dXJuKChDSEFSKSgweGY4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAxNzk6IHJldHVybigoQ0hBUikoMHhjYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTdhOiByZXR1cm4oKENIQVIpKDB4ZWEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE3YjogcmV0dXJuKChDSEFSKSgweGRkICYgMHhmZikpOworICAgICAgY2FzZSAweDAxN2M6IHJldHVybigoQ0hBUikoMHhmZCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTdkOiByZXR1cm4oKENIQVIpKDB4ZGUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE3ZTogcmV0dXJuKChDSEFSKSgweGZlICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTI6IHJldHVybigoQ0hBUikoMHg5NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDE0OiByZXR1cm4oKENIQVIpKDB4OTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxODogcmV0dXJuKChDSEFSKSgweDkxICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTk6IHJldHVybigoQ0hBUikoMHg5MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDFhOiByZXR1cm4oKENIQVIpKDB4ODIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAxYzogcmV0dXJuKChDSEFSKSgweDkzICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMWQ6IHJldHVybigoQ0hBUikoMHg5NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDFlOiByZXR1cm4oKENIQVIpKDB4ODQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAyMDogcmV0dXJuKChDSEFSKSgweDg2ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMjE6IHJldHVybigoQ0hBUikoMHg4NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDIyOiByZXR1cm4oKENIQVIpKDB4OTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjAyNjogcmV0dXJuKChDSEFSKSgweDg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMzE6IHJldHVybigoQ0hBUikoMHg4OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMEFDOiAgICAgICAgICAgICAgICAgICAgICAvKiBFdXJvICovCisgICAgICAgICAgcmV0dXJuKChDSEFSKSgweDgwICYgMHhmZikpOworICAgICAgY2FzZSAweDIxMjI6IHJldHVybigoQ0hBUikoMHg5OSAmIDB4ZmYpKTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybigweDAwM2YpOworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdpbmRvd3MgQ29kZSBQYWdlIDEyNTggKFZpZXQgTmFtKSAqLworI2lmZGVmIENLX0FOU0lDCit0eF9jcDEyNTgoVVNIT1JUIGMpCisjZWxzZQordHhfY3AxMjU4KGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPCAweDgwKSAgICAgICAgICAgICAgICAgICAgICAgLyogSGFzIEMxIGdyYXBoaWNzICovCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDB4MjBBQzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDgwICYgMHhmZikpOyAgICAvKiBFVVJPIFNJR04gKi8KKyAgICAgIGNhc2UgMHgyMDFBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4ODIgJiAweGZmKSk7ICAgIC8qIFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAqLworICAgICAgY2FzZSAweDAxOTI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4MyAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LICovCisgICAgICBjYXNlIDB4MjAxRToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDg0ICYgMHhmZikpOyAgICAvKiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKi8KKyAgICAgIGNhc2UgMHgyMDI2OiByZXR1cm4oKENIQVIpKDB4ODUgJiAweGZmKSk7IC8qIEhPUklaT05UQUwgRUxMSVBTSVMgKi8KKyAgICAgIGNhc2UgMHgyMDIwOiByZXR1cm4oKENIQVIpKDB4ODYgJiAweGZmKSk7IC8qIERBR0dFUiAqLworICAgICAgY2FzZSAweDIwMjE6IHJldHVybigoQ0hBUikoMHg4NyAmIDB4ZmYpKTsgLyogRE9VQkxFIERBR0dFUiAqLworICAgICAgY2FzZSAweDAyQzY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4OCAmIDB4ZmYpKTsgICAgLyogTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UICovCisgICAgICBjYXNlIDB4MjAzMDogcmV0dXJuKChDSEFSKSgweDg5ICYgMHhmZikpOyAvKiBQRVIgTUlMTEUgU0lHTiAqLworICAgICAgY2FzZSAweDIwMzk6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4QiAmIDB4ZmYpKTsgICAgLyogU0lOR0xFIExFRlQgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KKyAgICAgIGNhc2UgMHgwMTUyOiByZXR1cm4oKENIQVIpKDB4OEMgJiAweGZmKSk7IC8qIExBVElOIENBUElUQUwgTElHQVRVUkUgT0UgKi8KKyAgICAgIGNhc2UgMHgyMDE4OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTEgJiAweGZmKSk7ICAgIC8qIExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLICovCisgICAgICBjYXNlIDB4MjAxOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDkyICYgMHhmZikpOyAgICAvKiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KKyAgICAgIGNhc2UgMHgyMDFDOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTMgJiAweGZmKSk7ICAgIC8qIExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLICovCisgICAgICBjYXNlIDB4MjAxRDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDk0ICYgMHhmZikpOyAgICAvKiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKi8KKyAgICAgIGNhc2UgMHgyMDIyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTUgJiAweGZmKSk7ICAgIC8qIEJVTExFVCAqLworICAgICAgY2FzZSAweDIwMTM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5NiAmIDB4ZmYpKTsgICAgLyogRU4gREFTSCAqLworICAgICAgY2FzZSAweDIwMTQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5NyAmIDB4ZmYpKTsgICAgLyogRU0gREFTSCAqLworICAgICAgY2FzZSAweDAyREM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5OCAmIDB4ZmYpKTsgICAgLyogU01BTEwgVElMREUgKi8KKyAgICAgIGNhc2UgMHgyMTIyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTkgJiAweGZmKSk7ICAgIC8qIFRSQURFIE1BUksgU0lHTiAqLworICAgICAgY2FzZSAweDIwM0E6CisgICAgICAgIC8qIFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSIEsqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4OUIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE1MzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDlDICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRSAqLworICAgICAgY2FzZSAweDAxNzg6CisgICAgICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMgKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDlGICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQTA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBMCAmIDB4ZmYpKTsgICAgLyogTk8tQlJFQUsgU1BBQ0UgKi8KKyAgICAgIGNhc2UgMHgwMEExOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTEgJiAweGZmKSk7ICAgIC8qIElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksgKi8KKyAgICAgIGNhc2UgMHgwMEEyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTIgJiAweGZmKSk7ICAgIC8qIENFTlQgU0lHTiAqLworICAgICAgY2FzZSAweDAwQTM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBMyAmIDB4ZmYpKTsgICAgLyogUE9VTkQgU0lHTiAqLworICAgICAgY2FzZSAweDAwQTQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBNCAmIDB4ZmYpKTsgICAgLyogQ1VSUkVOQ1kgU0lHTiAqLworICAgICAgY2FzZSAweDAwQTU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBNSAmIDB4ZmYpKTsgICAgLyogWUVOIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMEE2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTYgJiAweGZmKSk7ICAgIC8qIEJST0tFTiBCQVIgKi8KKyAgICAgIGNhc2UgMHgwMEE3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTcgJiAweGZmKSk7ICAgIC8qIFNFQ1RJT04gU0lHTiAqLworICAgICAgY2FzZSAweDAwQTg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBOCAmIDB4ZmYpKTsgICAgLyogRElBRVJFU0lTICovCisgICAgICBjYXNlIDB4MDBBOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEE5ICYgMHhmZikpOyAgICAvKiBDT1BZUklHSFQgU0lHTiAqLworICAgICAgY2FzZSAweDAwQUE6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBQSAmIDB4ZmYpKTsgICAgLyogRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KKyAgICAgIGNhc2UgMHgwMEFCOgorICAgICAgICAvKiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4QUIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBBQzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEFDICYgMHhmZikpOyAgICAvKiBOT1QgU0lHTiAqLworICAgICAgY2FzZSAweDAwQUQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBRCAmIDB4ZmYpKTsgICAgLyogU09GVCBIWVBIRU4gKi8KKyAgICAgIGNhc2UgMHgwMEFFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QUUgJiAweGZmKSk7ICAgIC8qIFJFR0lTVEVSRUQgU0lHTiAqLworICAgICAgY2FzZSAweDAwQUY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBRiAmIDB4ZmYpKTsgICAgLyogTUFDUk9OICovCisgICAgICBjYXNlIDB4MDBCMDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEIwICYgMHhmZikpOyAgICAvKiBERUdSRUUgU0lHTiAqLworICAgICAgY2FzZSAweDAwQjE6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCMSAmIDB4ZmYpKTsgICAgLyogUExVUy1NSU5VUyBTSUdOICovCisgICAgICBjYXNlIDB4MDBCMjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEIyICYgMHhmZikpOyAgICAvKiBTVVBFUlNDUklQVCBUV08gKi8KKyAgICAgIGNhc2UgMHgwMEIzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjMgJiAweGZmKSk7ICAgIC8qIFNVUEVSU0NSSVBUIFRIUkVFICovCisgICAgICBjYXNlIDB4MDBCNDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEI0ICYgMHhmZikpOyAgICAvKiBBQ1VURSBBQ0NFTlQgKi8KKyAgICAgIGNhc2UgMHgwMEI1OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjUgJiAweGZmKSk7ICAgIC8qIE1JQ1JPIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMEI2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjYgJiAweGZmKSk7ICAgIC8qIFBJTENST1cgU0lHTiAqLworICAgICAgY2FzZSAweDAwQjc6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCNyAmIDB4ZmYpKTsgICAgLyogTUlERExFIERPVCAqLworICAgICAgY2FzZSAweDAwQjg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCOCAmIDB4ZmYpKTsgICAgLyogQ0VESUxMQSAqLworICAgICAgY2FzZSAweDAwQjk6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCOSAmIDB4ZmYpKTsgICAgLyogU1VQRVJTQ1JJUFQgT05FICovCisgICAgICBjYXNlIDB4MDBCQToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEJBICYgMHhmZikpOyAgICAvKiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KKyAgICAgIGNhc2UgMHgwMEJCOgorICAgICAgICAvKiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUiBLKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEJCICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQkM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCQyAmIDB4ZmYpKTsgICAgLyogVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSICovCisgICAgICBjYXNlIDB4MDBCRDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEJEICYgMHhmZikpOyAgICAvKiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYgKi8KKyAgICAgIGNhc2UgMHgwMEJFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QkUgJiAweGZmKSk7ICAgIC8qIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUyAqLworICAgICAgY2FzZSAweDAwQkY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCRiAmIDB4ZmYpKTsgICAgLyogSU5WRVJURUQgUVVFU1RJT04gTUFSSyAqLworICAgICAgY2FzZSAweDAwQzA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDMCAmIDB4ZmYpKTsgICAgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFICovCisgICAgICBjYXNlIDB4MDBDMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEMxICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUgKi8KKyAgICAgIGNhc2UgMHgwMEMyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzIgJiAweGZmKSk7ICAgIC8qIEEgQ0lSQ1VNRkxFWCAqLworICAgICAgY2FzZSAweDAxMDI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDMyAmIDB4ZmYpKTsgICAgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFICovCisgICAgICBjYXNlIDB4MDBDNDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEM0ICYgMHhmZikpOyAgICAvKiBBIERJQUVSRVNJUyAqLworICAgICAgY2FzZSAweDAwQzU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDNSAmIDB4ZmYpKTsgICAgLyogQSBSSU5HICovCisgICAgICBjYXNlIDB4MDBDNjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEM2ICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRSAqLworICAgICAgY2FzZSAweDAwQzc6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhDNyAmIDB4ZmYpKTsgICAgLyogQyBDRURJTExBICovCisgICAgICBjYXNlIDB4MDBDODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEM4ICYgMHhmZikpOyAgICAvKiBFIEdSQVZFICovCisgICAgICBjYXNlIDB4MDBDOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEM5ICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUgKi8KKyAgICAgIGNhc2UgMHgwMENBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4Q0EgJiAweGZmKSk7ICAgIC8qIEUgV0lUSCBDSVJDVU1GTEVYICovCisgICAgICBjYXNlIDB4MDBDQjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweENCICYgMHhmZikpOyAgICAvKiBFIFdJVEggRElBRVJFU0lTICovCisgICAgICBjYXNlIDB4MDMwMDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweENDICYgMHhmZikpOyAgICAvKiBDT01CSU5JTkcgR1JBVkUgQUNDRU5UICovCisgICAgICBjYXNlIDB4MDBDRDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweENEICYgMHhmZikpOyAgICAvKiBJIFdJVEggQUNVVEUgKi8KKyAgICAgIGNhc2UgMHgwMENFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4Q0UgJiAweGZmKSk7ICAgIC8qIEkgV0lUSCBDSVJDVU1GTEVYICovCisgICAgICBjYXNlIDB4MDBDRjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweENGICYgMHhmZikpOyAgICAvKiBJIFdJVEggRElBRVJFU0lTICovCisgICAgICBjYXNlIDB4MDExMDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQwICYgMHhmZikpOyAgICAvKiBEIFdJVEggU1RST0tFICovCisgICAgICBjYXNlIDB4MDBEMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQxICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUgKi8KKyAgICAgIGNhc2UgMHgwMzA5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RDIgJiAweGZmKSk7ICAgIC8qIENPTUJJTklORyBIT09LIEFCT1ZFICovCisgICAgICBjYXNlIDB4MDBEMzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQzICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUgKi8KKyAgICAgIGNhc2UgMHgwMEQ0OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RDQgJiAweGZmKSk7ICAgIC8qIE8gV0lUSCBDSVJDVU1GTEVYICovCisgICAgICBjYXNlIDB4MDFBMDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQ1ICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STiAqLworICAgICAgY2FzZSAweDAwRDY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhENiAmIDB4ZmYpKTsgICAgLyogTyBXSVRIIERJQUVSRVNJUyAqLworICAgICAgY2FzZSAweDAwRDc6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhENyAmIDB4ZmYpKTsgICAgLyogTVVMVElQTElDQVRJT04gU0lHTiAqLworICAgICAgY2FzZSAweDAwRDg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhEOCAmIDB4ZmYpKTsgICAgLyogTyBXSVRIIFNUUk9LRSAqLworICAgICAgY2FzZSAweDAwRDk6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhEOSAmIDB4ZmYpKTsgICAgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFICovCisgICAgICBjYXNlIDB4MDBEQToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweERBICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KKyAgICAgIGNhc2UgMHgwMERCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4REIgJiAweGZmKSk7ICAgIC8qIFUgV0lUSCBDSVJDVU1GTEVYICovCisgICAgICBjYXNlIDB4MDBEQzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweERDICYgMHhmZikpOyAgICAvKiBVIFdJVEggRElBRVJFU0lTICovCisgICAgICBjYXNlIDB4MDFBRjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEREICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiAqLworICAgICAgY2FzZSAweDAzMDM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhERSAmIDB4ZmYpKTsgICAgLyogQ09NQklOSU5HIFRJTERFICovCisgICAgICBjYXNlIDB4MDBERjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweERGICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAqLworICAgICAgY2FzZSAweDAwRTA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFMCAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRSAqLworICAgICAgY2FzZSAweDAwRTE6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFMSAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURSAqLworICAgICAgY2FzZSAweDAwRTI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFMiAmIDB4ZmYpKTsgICAgLyogU01BTEwgQSBXSVRIIENJUkNVTUZMRVggKi8KKyAgICAgIGNhc2UgMHgwMTAzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTMgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUgKi8KKyAgICAgIGNhc2UgMHgwMEU0OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTQgJiAweGZmKSk7ICAgIC8qIFNNQUxMIEEgV0lUSCBESUFFUkVTSVMgKi8KKyAgICAgIGNhc2UgMHgwMEU1OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTUgJiAweGZmKSk7ICAgIC8qIFNNQUxMIEEgV0lUSCBSSU5HIEFCT1ZFICovCisgICAgICBjYXNlIDB4MDBFNjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEU2ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQUUgKi8KKyAgICAgIGNhc2UgMHgwMEU3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTcgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQSAqLworICAgICAgY2FzZSAweDAwRTg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFOCAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRSAqLworICAgICAgY2FzZSAweDAwRTk6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFOSAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqLworICAgICAgY2FzZSAweDAwRUE6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFQSAmIDB4ZmYpKTsgICAgLyogU01BTEwgRSBXSVRIIENJUkNVTUZMRVggKi8KKyAgICAgIGNhc2UgMHgwMEVCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RUIgJiAweGZmKSk7ICAgIC8qIFNNQUxMIEUgV0lUSCBESUFFUkVTSVMgKi8KKyAgICAgIGNhc2UgMHgwMzAxOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RUMgJiAweGZmKSk7ICAgIC8qIENPTUJJTklORyBBQ1VURSBBQ0NFTlQgKi8KKyAgICAgIGNhc2UgMHgwMEVEOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RUQgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUgKi8KKyAgICAgIGNhc2UgMHgwMEVFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RUUgJiAweGZmKSk7ICAgIC8qIFNNQUxMIEkgV0lUSCBDSVJDVU1GTEVYICovCisgICAgICBjYXNlIDB4MDBFRjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEVGICYgMHhmZikpOyAgICAvKiBTTUFMTCBJIFdJVEggRElBRVJFU0lTICovCisgICAgICBjYXNlIDB4MDExMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEYwICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIFNUUk9LRSAqLworICAgICAgY2FzZSAweDAwRjE6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGMSAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERSAqLworICAgICAgY2FzZSAweDAzMjM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGMiAmIDB4ZmYpKTsgICAgLyogQ09NQklOSU5HIERPVCBCRUxPVyAqLworICAgICAgY2FzZSAweDAwRjM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGMyAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURSAqLworICAgICAgY2FzZSAweDAwRjQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGNCAmIDB4ZmYpKTsgICAgLyogU01BTEwgTyBXSVRIIENJUkNVTUZMRVggKi8KKyAgICAgIGNhc2UgMHgwMUExOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjUgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9STiAqLworICAgICAgY2FzZSAweDAwRjY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGNiAmIDB4ZmYpKTsgICAgLyogU01BTEwgTyBXSVRIIERJQUVSRVNJUyAqLworICAgICAgY2FzZSAweDAwRjc6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGNyAmIDB4ZmYpKTsgICAgLyogRElWSVNJT04gU0lHTiAqLworICAgICAgY2FzZSAweDAwRjg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGOCAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KKyAgICAgIGNhc2UgMHgwMEY5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjkgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUgKi8KKyAgICAgIGNhc2UgMHgwMEZBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RkEgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KKyAgICAgIGNhc2UgMHgwMEZCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RkIgJiAweGZmKSk7ICAgIC8qIFNNQUxMIFUgV0lUSCBDSVJDVU1GTEVYICovCisgICAgICBjYXNlIDB4MDBGQzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEZDICYgMHhmZikpOyAgICAvKiBTTUFMTCBVIFdJVEggRElBRVJFU0lTICovCisgICAgICBjYXNlIDB4MDFCMDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEZEICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4gKi8KKyAgICAgIGNhc2UgMHgyMEFCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RkUgJiAweGZmKSk7ICAgIC8qIERPTkcgU0lHTiAqLworICAgICAgY2FzZSAweDAwRkY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGRiAmIDB4ZmYpKTsgICAgLyogU01BTEwgWSBXSVRIIERJQUVSRVNJUyAqLworICAgIGRlZmF1bHQ6IHJldHVybigweDAwM2YpOworICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlIFBhZ2UgMDM3IC0gRUJDRElDIChVLlMuKSAqLworI2lmZGVmIENLX0FOU0lDCit0eF9jcDM3KFVTSE9SVCBjKQorI2Vsc2UKK3R4X2NwMzcoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgwMDAwOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MDAgJiAweGZmKSk7ICAgIC8qIE5VTEwgKi8KKyAgICAgIGNhc2UgMHgwMDAxOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MDEgJiAweGZmKSk7ICAgIC8qIFNUQVJUIE9GIEhFQURJTkcgKi8KKyAgICAgIGNhc2UgMHgwMDAyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MDIgJiAweGZmKSk7ICAgIC8qIFNUQVJUIE9GIFRFWFQgKi8KKyAgICAgIGNhc2UgMHgwMDAzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MDMgJiAweGZmKSk7ICAgIC8qIEVORCBPRiBURVhUICovCisgICAgICBjYXNlIDB4MDA5QzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDA0ICYgMHhmZikpOyAgICAvKiBDT05UUk9MICovCisgICAgICBjYXNlIDB4MDAwOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDA1ICYgMHhmZikpOyAgICAvKiBIT1JJWk9OVEFMIFRBQlVMQVRJT04gKi8KKyAgICAgIGNhc2UgMHgwMDg2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MDYgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDdGOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MDcgJiAweGZmKSk7ICAgIC8qIERFTEVURSAqLworICAgICAgY2FzZSAweDAwOTc6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgwOCAmIDB4ZmYpKTsgICAgLyogQ09OVFJPTCAqLworICAgICAgY2FzZSAweDAwOEQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgwOSAmIDB4ZmYpKTsgICAgLyogQ09OVFJPTCAqLworICAgICAgY2FzZSAweDAwOEU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgwQSAmIDB4ZmYpKTsgICAgLyogQ09OVFJPTCAqLworICAgICAgY2FzZSAweDAwMEI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgwQiAmIDB4ZmYpKTsgICAgLyogVkVSVElDQUwgVEFCVUxBVElPTiAqLworICAgICAgY2FzZSAweDAwMEM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgwQyAmIDB4ZmYpKTsgICAgLyogRk9STSBGRUVEICovCisgICAgICBjYXNlIDB4MDAwRDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDBEICYgMHhmZikpOyAgICAvKiBDQVJSSUFHRSBSRVRVUk4gKi8KKyAgICAgIGNhc2UgMHgwMDBFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MEUgJiAweGZmKSk7ICAgIC8qIFNISUZUIE9VVCAqLworICAgICAgY2FzZSAweDAwMEY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgwRiAmIDB4ZmYpKTsgICAgLyogU0hJRlQgSU4gKi8KKyAgICAgIGNhc2UgMHgwMDEwOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MTAgJiAweGZmKSk7ICAgIC8qIERBVEEgTElOSyBFU0NBUEUgKi8KKyAgICAgIGNhc2UgMHgwMDExOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MTEgJiAweGZmKSk7ICAgIC8qIERFVklDRSBDT05UUk9MIE9ORSAqLworICAgICAgY2FzZSAweDAwMTI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgxMiAmIDB4ZmYpKTsgICAgLyogREVWSUNFIENPTlRST0wgVFdPICovCisgICAgICBjYXNlIDB4MDAxMzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDEzICYgMHhmZikpOyAgICAvKiBERVZJQ0UgQ09OVFJPTCBUSFJFRSAqLworICAgICAgY2FzZSAweDAwOUQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgxNCAmIDB4ZmYpKTsgICAgLyogQ09OVFJPTCAqLworICAgICAgY2FzZSAweDAwODU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgxNSAmIDB4ZmYpKTsgICAgLyogQ09OVFJPTCAqLworICAgICAgY2FzZSAweDAwMDg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgxNiAmIDB4ZmYpKTsgICAgLyogQkFDS1NQQUNFICovCisgICAgICBjYXNlIDB4MDA4NzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDE3ICYgMHhmZikpOyAgICAvKiBDT05UUk9MICovCisgICAgICBjYXNlIDB4MDAxODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDE4ICYgMHhmZikpOyAgICAvKiBDQU5DRUwgKi8KKyAgICAgIGNhc2UgMHgwMDE5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MTkgJiAweGZmKSk7ICAgIC8qIEVORCBPRiBNRURJVU0gKi8KKyAgICAgIGNhc2UgMHgwMDkyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MUEgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDhGOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MUIgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDFDOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MUMgJiAweGZmKSk7ICAgIC8qIEZJTEUgU0VQQVJBVE9SICovCisgICAgICBjYXNlIDB4MDAxRDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDFEICYgMHhmZikpOyAgICAvKiBHUk9VUCBTRVBBUkFUT1IgKi8KKyAgICAgIGNhc2UgMHgwMDFFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MUUgJiAweGZmKSk7ICAgIC8qIFJFQ09SRCBTRVBBUkFUT1IgKi8KKyAgICAgIGNhc2UgMHgwMDFGOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MUYgJiAweGZmKSk7ICAgIC8qIFVOSVQgU0VQQVJBVE9SICovCisgICAgICBjYXNlIDB4MDA4MDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDIwICYgMHhmZikpOyAgICAvKiBDT05UUk9MICovCisgICAgICBjYXNlIDB4MDA4MToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDIxICYgMHhmZikpOyAgICAvKiBDT05UUk9MICovCisgICAgICBjYXNlIDB4MDA4MjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDIyICYgMHhmZikpOyAgICAvKiBDT05UUk9MICovCisgICAgICBjYXNlIDB4MDA4MzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDIzICYgMHhmZikpOyAgICAvKiBDT05UUk9MICovCisgICAgICBjYXNlIDB4MDA4NDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDI0ICYgMHhmZikpOyAgICAvKiBDT05UUk9MICovCisgICAgICBjYXNlIDB4MDAwQToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDI1ICYgMHhmZikpOyAgICAvKiBMSU5FIEZFRUQgKi8KKyAgICAgIGNhc2UgMHgwMDE3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MjYgJiAweGZmKSk7ICAgIC8qIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sgKi8KKyAgICAgIGNhc2UgMHgwMDFCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MjcgJiAweGZmKSk7ICAgIC8qIEVTQ0FQRSAqLworICAgICAgY2FzZSAweDAwODg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgyOCAmIDB4ZmYpKTsgICAgLyogQ09OVFJPTCAqLworICAgICAgY2FzZSAweDAwODk6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgyOSAmIDB4ZmYpKTsgICAgLyogQ09OVFJPTCAqLworICAgICAgY2FzZSAweDAwOEE6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgyQSAmIDB4ZmYpKTsgICAgLyogQ09OVFJPTCAqLworICAgICAgY2FzZSAweDAwOEI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgyQiAmIDB4ZmYpKTsgICAgLyogQ09OVFJPTCAqLworICAgICAgY2FzZSAweDAwOEM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgyQyAmIDB4ZmYpKTsgICAgLyogQ09OVFJPTCAqLworICAgICAgY2FzZSAweDAwMDU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgyRCAmIDB4ZmYpKTsgICAgLyogRU5RVUlSWSAqLworICAgICAgY2FzZSAweDAwMDY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHgyRSAmIDB4ZmYpKTsgICAgLyogQUNLTk9XTEVER0UgKi8KKyAgICAgIGNhc2UgMHgwMDA3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MkYgJiAweGZmKSk7ICAgIC8qIEJFTEwgKi8KKyAgICAgIGNhc2UgMHgwMDkwOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MzAgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDkxOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MzEgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDE2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MzIgJiAweGZmKSk7ICAgIC8qIFNZTkNIUk9OT1VTIElETEUgKi8KKyAgICAgIGNhc2UgMHgwMDkzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MzMgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDk0OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MzQgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDk1OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MzUgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDk2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MzYgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDA0OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MzcgJiAweGZmKSk7ICAgIC8qIEVORCBPRiBUUkFOU01JU1NJT04gKi8KKyAgICAgIGNhc2UgMHgwMDk4OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MzggJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDk5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4MzkgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDlBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4M0EgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDlCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4M0IgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICAgIGNhc2UgMHgwMDE0OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4M0MgJiAweGZmKSk7ICAgIC8qIERFVklDRSBDT05UUk9MIEZPVVIgKi8KKyAgICAgIGNhc2UgMHgwMDE1OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4M0QgJiAweGZmKSk7ICAgIC8qIE5FR0FUSVZFIEFDS05PV0xFREdFICovCisgICAgICBjYXNlIDB4MDA5RToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDNFICYgMHhmZikpOyAgICAvKiBDT05UUk9MICovCisgICAgICBjYXNlIDB4MDAxQToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDNGICYgMHhmZikpOyAgICAvKiBTVUJTVElUVVRFICovCisgICAgICBjYXNlIDB4MDAyMDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDQwICYgMHhmZikpOyAgICAvKiBTUEFDRSAqLworICAgICAgY2FzZSAweDAwQTA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg0MSAmIDB4ZmYpKTsgICAgLyogTk8tQlJFQUsgU1BBQ0UgKi8KKyAgICAgIGNhc2UgMHgwMEUyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NDIgJiAweGZmKSk7ICAgIC8qIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCAqLworICAgICAgY2FzZSAweDAwRTQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg0MyAmIDB4ZmYpKTsgICAgLyogU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMgKi8KKyAgICAgIGNhc2UgMHgwMEUwOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NDQgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUgKi8KKyAgICAgIGNhc2UgMHgwMEUxOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NDUgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUgKi8KKyAgICAgIGNhc2UgMHgwMEUzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NDYgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUgKi8KKyAgICAgIGNhc2UgMHgwMEU1OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NDcgJiAweGZmKSk7ICAgIC8qIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRSAqLworICAgICAgY2FzZSAweDAwRTc6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg0OCAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBICovCisgICAgICBjYXNlIDB4MDBGMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDQ5ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFICovCisgICAgICBjYXNlIDB4MDBBMjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDRBICYgMHhmZikpOyAgICAvKiBDRU5UIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMDJFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NEIgJiAweGZmKSk7ICAgIC8qIEZVTEwgU1RPUCAqLworICAgICAgY2FzZSAweDAwM0M6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg0QyAmIDB4ZmYpKTsgICAgLyogTEVTUy1USEFOIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMDI4OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NEQgJiAweGZmKSk7ICAgIC8qIExFRlQgUEFSRU5USEVTSVMgKi8KKyAgICAgIGNhc2UgMHgwMDJCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NEUgJiAweGZmKSk7ICAgIC8qIFBMVVMgU0lHTiAqLworICAgICAgY2FzZSAweDAwN0M6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg0RiAmIDB4ZmYpKTsgICAgLyogVkVSVElDQUwgTElORSAqLworICAgICAgY2FzZSAweDAwMjY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg1MCAmIDB4ZmYpKTsgICAgLyogQU1QRVJTQU5EICovCisgICAgICBjYXNlIDB4MDBFOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDUxICYgMHhmZikpOyAgICAvKiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFICovCisgICAgICBjYXNlIDB4MDBFQToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDUyICYgMHhmZikpOyAgICAvKiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggKi8KKyAgICAgIGNhc2UgMHgwMEVCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NTMgJiAweGZmKSk7ICAgIC8qIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTICovCisgICAgICBjYXNlIDB4MDBFODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDU0ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFICovCisgICAgICBjYXNlIDB4MDBFRDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDU1ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFICovCisgICAgICBjYXNlIDB4MDBFRToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDU2ICYgMHhmZikpOyAgICAvKiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi8KKyAgICAgIGNhc2UgMHgwMEVGOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NTcgJiAweGZmKSk7ICAgIC8qIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTICovCisgICAgICBjYXNlIDB4MDBFQzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDU4ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFICovCisgICAgICBjYXNlIDB4MDBERjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDU5ICYgMHhmZikpOyAgICAvKiBTTUFMTCBMRVRURVIgU0hBUlAgUyAoR0VSTUFOKSAqLworICAgICAgY2FzZSAweDAwMjE6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg1QSAmIDB4ZmYpKTsgICAgLyogRVhDTEFNQVRJT04gTUFSSyAqLworICAgICAgY2FzZSAweDAwMjQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg1QiAmIDB4ZmYpKTsgICAgLyogRE9MTEFSIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMDJBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NUMgJiAweGZmKSk7ICAgIC8qIEFTVEVSSVNLICovCisgICAgICBjYXNlIDB4MDAyOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDVEICYgMHhmZikpOyAgICAvKiBSSUdIVCBQQVJFTlRIRVNJUyAqLworICAgICAgY2FzZSAweDAwM0I6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg1RSAmIDB4ZmYpKTsgICAgLyogU0VNSUNPTE9OICovCisgICAgICBjYXNlIDB4MDBBQzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDVGICYgMHhmZikpOyAgICAvKiBOT1QgU0lHTiAqLworICAgICAgY2FzZSAweDAwMkQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg2MCAmIDB4ZmYpKTsgICAgLyogSFlQSEVOLU1JTlVTICovCisgICAgICBjYXNlIDB4MDAyRjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDYxICYgMHhmZikpOyAgICAvKiBTT0xJRFVTICovCisgICAgICBjYXNlIDB4MDBDMjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDYyICYgMHhmZikpOyAgICAvKiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCAqLworICAgICAgY2FzZSAweDAwQzQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg2MyAmIDB4ZmYpKTsgICAgLyogQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUyAqLworICAgICAgY2FzZSAweDAwQzA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg2NCAmIDB4ZmYpKTsgICAgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFICovCisgICAgICBjYXNlIDB4MDBDMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDY1ICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUgKi8KKyAgICAgIGNhc2UgMHgwMEMzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NjYgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERSAqLworICAgICAgY2FzZSAweDAwQzU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg2NyAmIDB4ZmYpKTsgICAgLyogQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi8KKyAgICAgIGNhc2UgMHgwMEM3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NjggJiAweGZmKSk7ICAgIC8qIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBICovCisgICAgICBjYXNlIDB4MDBEMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDY5ICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUgKi8KKyAgICAgIGNhc2UgMHgwMEE2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NkEgJiAweGZmKSk7ICAgIC8qIEJST0tFTiBCQVIgKi8KKyAgICAgIGNhc2UgMHgwMDJDOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NkIgJiAweGZmKSk7ICAgIC8qIENPTU1BICovCisgICAgICBjYXNlIDB4MDAyNToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDZDICYgMHhmZikpOyAgICAvKiBQRVJDRU5UIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMDVGOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NkQgJiAweGZmKSk7ICAgIC8qIExPVyBMSU5FICovCisgICAgICBjYXNlIDB4MDAzRToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDZFICYgMHhmZikpOyAgICAvKiBHUkVBVEVSLVRIQU4gU0lHTiAqLworICAgICAgY2FzZSAweDAwM0Y6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg2RiAmIDB4ZmYpKTsgICAgLyogUVVFU1RJT04gTUFSSyAqLworICAgICAgY2FzZSAweDAwRjg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg3MCAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KKyAgICAgIGNhc2UgMHgwMEM5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NzEgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqLworICAgICAgY2FzZSAweDAwQ0E6CisgICAgICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYICovCisgICAgICAgIHJldHVybigoQ0hBUikoMHg3MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMENCOgorICAgICAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTICovCisgICAgICAgIHJldHVybigoQ0hBUikoMHg3MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEM4OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4NzQgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRSAqLworICAgICAgY2FzZSAweDAwQ0Q6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg3NSAmIDB4ZmYpKTsgICAgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFICovCisgICAgICBjYXNlIDB4MDBDRToKKyAgICAgICAgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDc2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQ0Y6CisgICAgICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMgKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDc3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQ0M6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg3OCAmIDB4ZmYpKTsgICAgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFICovCisgICAgICBjYXNlIDB4MDA2MDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDc5ICYgMHhmZikpOyAgICAvKiBHUkFWRSBBQ0NFTlQgKi8KKyAgICAgIGNhc2UgMHgwMDNBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4N0EgJiAweGZmKSk7ICAgIC8qIENPTE9OICovCisgICAgICBjYXNlIDB4MDAyMzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDdCICYgMHhmZikpOyAgICAvKiBOVU1CRVIgU0lHTiAqLworICAgICAgY2FzZSAweDAwNDA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg3QyAmIDB4ZmYpKTsgICAgLyogQ09NTUVSQ0lBTCBBVCAqLworICAgICAgY2FzZSAweDAwMjc6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg3RCAmIDB4ZmYpKTsgICAgLyogQVBPU1RST1BIRSAqLworICAgICAgY2FzZSAweDAwM0Q6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg3RSAmIDB4ZmYpKTsgICAgLyogRVFVQUxTIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMDIyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4N0YgJiAweGZmKSk7ICAgIC8qIFFVT1RBVElPTiBNQVJLICovCisgICAgICBjYXNlIDB4MDBEODoKKyAgICAgICAgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4ODAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDA2MToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDgxICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSAqLworICAgICAgY2FzZSAweDAwNjI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4MiAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIEIgKi8KKyAgICAgIGNhc2UgMHgwMDYzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4ODMgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBDICovCisgICAgICBjYXNlIDB4MDA2NDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDg0ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRCAqLworICAgICAgY2FzZSAweDAwNjU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4NSAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgKi8KKyAgICAgIGNhc2UgMHgwMDY2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4ODYgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBGICovCisgICAgICBjYXNlIDB4MDA2NzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDg3ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRyAqLworICAgICAgY2FzZSAweDAwNjg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg4OCAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIEggKi8KKyAgICAgIGNhc2UgMHgwMDY5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4ODkgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBJICovCisgICAgICBjYXNlIDB4MDBBQjoKKyAgICAgICAgLyogTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDhBICYgMHhmZikpOworICAgICAgY2FzZSAweDAwQkI6CisgICAgICAgIC8qIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSIEsqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4OEIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBGMDoKKyAgICAgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIEVUSCAoSUNFTEFORElDKSAqLworICAgICAgICByZXR1cm4oKENIQVIpKDB4OEMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBGRDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDhEICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFICovCisgICAgICBjYXNlIDB4MDBGRToKKyAgICAgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOIChJQ0VMQU5ESUMpICovCisgICAgICAgIHJldHVybigoQ0hBUikoMHg4RSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEIxOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OEYgJiAweGZmKSk7ICAgIC8qIFBMVVMtTUlOVVMgU0lHTiAqLworICAgICAgY2FzZSAweDAwQjA6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5MCAmIDB4ZmYpKTsgICAgLyogREVHUkVFIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMDZBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTEgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBKICovCisgICAgICBjYXNlIDB4MDA2QjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDkyICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSyAqLworICAgICAgY2FzZSAweDAwNkM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5MyAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIEwgKi8KKyAgICAgIGNhc2UgMHgwMDZEOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTQgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBNICovCisgICAgICBjYXNlIDB4MDA2RToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDk1ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTiAqLworICAgICAgY2FzZSAweDAwNkY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5NiAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gKi8KKyAgICAgIGNhc2UgMHgwMDcwOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OTcgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBQICovCisgICAgICBjYXNlIDB4MDA3MToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDk4ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUSAqLworICAgICAgY2FzZSAweDAwNzI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHg5OSAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIFIgKi8KKyAgICAgIGNhc2UgMHgwMEFBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OUEgJiAweGZmKSk7ICAgIC8qIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SICovCisgICAgICBjYXNlIDB4MDBCQToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDlCICYgMHhmZikpOyAgICAvKiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KKyAgICAgIGNhc2UgMHgwMEU2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4OUMgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExJR0FUVVJFIEFFICovCisgICAgICBjYXNlIDB4MDBCODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDlEICYgMHhmZikpOyAgICAvKiBDRURJTExBICovCisgICAgICBjYXNlIDB4MDBDNjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDlFICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFICovCisgICAgICBjYXNlIDB4MDBBNDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweDlGICYgMHhmZikpOyAgICAvKiBDVVJSRU5DWSBTSUdOICovCisgICAgICBjYXNlIDB4MDBCNToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEEwICYgMHhmZikpOyAgICAvKiBNSUNSTyBTSUdOICovCisgICAgICBjYXNlIDB4MDA3RToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEExICYgMHhmZikpOyAgICAvKiBUSUxERSAqLworICAgICAgY2FzZSAweDAwNzM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBMiAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIFMgKi8KKyAgICAgIGNhc2UgMHgwMDc0OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTMgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBUICovCisgICAgICBjYXNlIDB4MDA3NToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEE0ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSAqLworICAgICAgY2FzZSAweDAwNzY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBNSAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIFYgKi8KKyAgICAgIGNhc2UgMHgwMDc3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTYgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBXICovCisgICAgICBjYXNlIDB4MDA3ODoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEE3ICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWCAqLworICAgICAgY2FzZSAweDAwNzk6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhBOCAmIDB4ZmYpKTsgICAgLyogTEFUSU4gU01BTEwgTEVUVEVSIFkgKi8KKyAgICAgIGNhc2UgMHgwMDdBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QTkgJiAweGZmKSk7ICAgIC8qIExBVElOIFNNQUxMIExFVFRFUiBaICovCisgICAgICBjYXNlIDB4MDBBMToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEFBICYgMHhmZikpOyAgICAvKiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLICovCisgICAgICBjYXNlIDB4MDBCRjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEFCICYgMHhmZikpOyAgICAvKiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLICovCisgICAgICBjYXNlIDB4MDBEMDoKKyAgICAgICAgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRIIChJQ0VMQU5ESUMpICovCisgICAgICAgIHJldHVybigoQ0hBUikoMHhBQyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEREOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QUQgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURSAqLworICAgICAgY2FzZSAweDAwREU6CisgICAgICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOIChJQ0VMQU5ESUMpICovCisgICAgICAgIHJldHVybigoQ0hBUikoMHhBRSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMEFFOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QUYgJiAweGZmKSk7ICAgIC8qIFJFR0lTVEVSRUQgU0lHTiAqLworICAgICAgY2FzZSAweDAwNUU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCMCAmIDB4ZmYpKTsgICAgLyogQ0lSQ1VNRkxFWCBBQ0NFTlQgKi8KKyAgICAgIGNhc2UgMHgwMEEzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjEgJiAweGZmKSk7ICAgIC8qIFBPVU5EIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMEE1OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjIgJiAweGZmKSk7ICAgIC8qIFlFTiBTSUdOICovCisgICAgICBjYXNlIDB4MDBCNzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEIzICYgMHhmZikpOyAgICAvKiBNSURETEUgRE9UICovCisgICAgICBjYXNlIDB4MDBBOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEI0ICYgMHhmZikpOyAgICAvKiBDT1BZUklHSFQgU0lHTiAqLworICAgICAgY2FzZSAweDAwQTc6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCNSAmIDB4ZmYpKTsgICAgLyogU0VDVElPTiBTSUdOICovCisgICAgICBjYXNlIDB4MDBCNjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEI2ICYgMHhmZikpOyAgICAvKiBQSUxDUk9XIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMEJDOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QjcgJiAweGZmKSk7ICAgIC8qIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUiAqLworICAgICAgY2FzZSAweDAwQkQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCOCAmIDB4ZmYpKTsgICAgLyogVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGICovCisgICAgICBjYXNlIDB4MDBCRToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEI5ICYgMHhmZikpOyAgICAvKiBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMgKi8KKyAgICAgIGNhc2UgMHgwMDVCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QkEgJiAweGZmKSk7ICAgIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQgKi8KKyAgICAgIGNhc2UgMHgwMDVEOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QkIgJiAweGZmKSk7ICAgIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUICovCisgICAgICBjYXNlIDB4MDBBRjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEJDICYgMHhmZikpOyAgICAvKiBNQUNST04gKi8KKyAgICAgIGNhc2UgMHgwMEE4OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QkQgJiAweGZmKSk7ICAgIC8qIERJQUVSRVNJUyAqLworICAgICAgY2FzZSAweDAwQjQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhCRSAmIDB4ZmYpKTsgICAgLyogQUNVVEUgQUNDRU5UICovCisgICAgICBjYXNlIDB4MDBENzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEJGICYgMHhmZikpOyAgICAvKiBNVUxUSVBMSUNBVElPTiBTSUdOICovCisgICAgICBjYXNlIDB4MDA3QjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEMwICYgMHhmZikpOyAgICAvKiBMRUZUIENVUkxZIEJSQUNLRVQgKi8KKyAgICAgIGNhc2UgMHgwMDQxOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzEgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgKi8KKyAgICAgIGNhc2UgMHgwMDQyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzIgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEIgKi8KKyAgICAgIGNhc2UgMHgwMDQzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzMgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEMgKi8KKyAgICAgIGNhc2UgMHgwMDQ0OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzQgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEQgKi8KKyAgICAgIGNhc2UgMHgwMDQ1OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzUgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgKi8KKyAgICAgIGNhc2UgMHgwMDQ2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzYgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEYgKi8KKyAgICAgIGNhc2UgMHgwMDQ3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzcgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEcgKi8KKyAgICAgIGNhc2UgMHgwMDQ4OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzggJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEggKi8KKyAgICAgIGNhc2UgMHgwMDQ5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4QzkgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgKi8KKyAgICAgIGNhc2UgMHgwMEFEOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4Q0EgJiAweGZmKSk7ICAgIC8qIFNPRlQgSFlQSEVOICovCisgICAgICBjYXNlIDB4MDBGNDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweENCICYgMHhmZikpOyAgICAvKiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KKyAgICAgIGNhc2UgMHgwMEY2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4Q0MgJiAweGZmKSk7ICAgIC8qIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTICovCisgICAgICBjYXNlIDB4MDBGMjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweENEICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFICovCisgICAgICBjYXNlIDB4MDBGMzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweENFICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFICovCisgICAgICBjYXNlIDB4MDBGNToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweENGICYgMHhmZikpOyAgICAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFICovCisgICAgICBjYXNlIDB4MDA3RDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQwICYgMHhmZikpOyAgICAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUICovCisgICAgICBjYXNlIDB4MDA0QToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQxICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKICovCisgICAgICBjYXNlIDB4MDA0QjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQyICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLICovCisgICAgICBjYXNlIDB4MDA0QzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQzICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMICovCisgICAgICBjYXNlIDB4MDA0RDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQ0ICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNICovCisgICAgICBjYXNlIDB4MDA0RToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQ1ICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOICovCisgICAgICBjYXNlIDB4MDA0RjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQ2ICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPICovCisgICAgICBjYXNlIDB4MDA1MDoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQ3ICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQICovCisgICAgICBjYXNlIDB4MDA1MToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQ4ICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRICovCisgICAgICBjYXNlIDB4MDA1MjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEQ5ICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSICovCisgICAgICBjYXNlIDB4MDBCOToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweERBICYgMHhmZikpOyAgICAvKiBTVVBFUlNDUklQVCBPTkUgKi8KKyAgICAgIGNhc2UgMHgwMEZCOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4REIgJiAweGZmKSk7ICAgIC8qIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLworICAgICAgY2FzZSAweDAwRkM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhEQyAmIDB4ZmYpKTsgICAgLyogU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgKi8KKyAgICAgIGNhc2UgMHgwMEY5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4REQgJiAweGZmKSk7ICAgIC8qIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUgKi8KKyAgICAgIGNhc2UgMHgwMEZBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4REUgJiAweGZmKSk7ICAgIC8qIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KKyAgICAgIGNhc2UgMHgwMEZGOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4REYgJiAweGZmKSk7ICAgIC8qIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTICovCisgICAgICBjYXNlIDB4MDA1QzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEUwICYgMHhmZikpOyAgICAvKiBSRVZFUlNFIFNPTElEVVMgKi8KKyAgICAgIGNhc2UgMHgwMEY3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTEgJiAweGZmKSk7ICAgIC8qIERJVklTSU9OIFNJR04gKi8KKyAgICAgIGNhc2UgMHgwMDUzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTIgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFMgKi8KKyAgICAgIGNhc2UgMHgwMDU0OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTMgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFQgKi8KKyAgICAgIGNhc2UgMHgwMDU1OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTQgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgKi8KKyAgICAgIGNhc2UgMHgwMDU2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTUgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFYgKi8KKyAgICAgIGNhc2UgMHgwMDU3OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTYgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFcgKi8KKyAgICAgIGNhc2UgMHgwMDU4OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTcgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFggKi8KKyAgICAgIGNhc2UgMHgwMDU5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTggJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFkgKi8KKyAgICAgIGNhc2UgMHgwMDVBOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RTkgJiAweGZmKSk7ICAgIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFogKi8KKyAgICAgIGNhc2UgMHgwMEIyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RUEgJiAweGZmKSk7ICAgIC8qIFNVUEVSU0NSSVBUIFRXTyAqLworICAgICAgY2FzZSAweDAwRDQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFQiAmIDB4ZmYpKTsgICAgLyogQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KKyAgICAgIGNhc2UgMHgwMEQ2OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RUMgJiAweGZmKSk7ICAgIC8qIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMgKi8KKyAgICAgIGNhc2UgMHgwMEQyOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RUQgJiAweGZmKSk7ICAgIC8qIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRSAqLworICAgICAgY2FzZSAweDAwRDM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhFRSAmIDB4ZmYpKTsgICAgLyogQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFICovCisgICAgICBjYXNlIDB4MDBENToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEVGICYgMHhmZikpOyAgICAvKiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUgKi8KKyAgICAgIGNhc2UgMHgwMDMwOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjAgJiAweGZmKSk7ICAgIC8qIERJR0lUIFpFUk8gKi8KKyAgICAgIGNhc2UgMHgwMDMxOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjEgJiAweGZmKSk7ICAgIC8qIERJR0lUIE9ORSAqLworICAgICAgY2FzZSAweDAwMzI6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGMiAmIDB4ZmYpKTsgICAgLyogRElHSVQgVFdPICovCisgICAgICBjYXNlIDB4MDAzMzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEYzICYgMHhmZikpOyAgICAvKiBESUdJVCBUSFJFRSAqLworICAgICAgY2FzZSAweDAwMzQ6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGNCAmIDB4ZmYpKTsgICAgLyogRElHSVQgRk9VUiAqLworICAgICAgY2FzZSAweDAwMzU6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGNSAmIDB4ZmYpKTsgICAgLyogRElHSVQgRklWRSAqLworICAgICAgY2FzZSAweDAwMzY6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGNiAmIDB4ZmYpKTsgICAgLyogRElHSVQgU0lYICovCisgICAgICBjYXNlIDB4MDAzNzoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEY3ICYgMHhmZikpOyAgICAvKiBESUdJVCBTRVZFTiAqLworICAgICAgY2FzZSAweDAwMzg6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGOCAmIDB4ZmYpKTsgICAgLyogRElHSVQgRUlHSFQgKi8KKyAgICAgIGNhc2UgMHgwMDM5OgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RjkgJiAweGZmKSk7ICAgIC8qIERJR0lUIE5JTkUgKi8KKyAgICAgIGNhc2UgMHgwMEIzOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RkEgJiAweGZmKSk7ICAgIC8qIFNVUEVSU0NSSVBUIFRIUkVFICovCisgICAgICBjYXNlIDB4MDBEQjoKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEZCICYgMHhmZikpOyAgICAvKiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLworICAgICAgY2FzZSAweDAwREM6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGQyAmIDB4ZmYpKTsgICAgLyogQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyAqLworICAgICAgY2FzZSAweDAwRDk6CisgICAgICAgIHJldHVybigoQ0hBUikoMHhGRCAmIDB4ZmYpKTsgICAgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFICovCisgICAgICBjYXNlIDB4MDBEQToKKyAgICAgICAgcmV0dXJuKChDSEFSKSgweEZFICYgMHhmZikpOyAgICAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KKyAgICAgIGNhc2UgMHgwMDlGOgorICAgICAgICByZXR1cm4oKENIQVIpKDB4RkYgJiAweGZmKSk7ICAgIC8qIENPTlRST0wgKi8KKyAgICBkZWZhdWx0OiByZXR1cm4oMHgwMDNmKTsKKyAgICB9Cit9CisKKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDIENvZGUgUGFnZSA4NTUgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfY3A4NTUoVVNIT1JUIGMpCisjZWxzZQordHhfY3A4NTUoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4ODApICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXMgQzEgZ3JhcGhpY3MgKi8KKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgwMGE0OiByZXR1cm4oKENIQVIpKDIwNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE3OiByZXR1cm4oKENIQVIpKDI1MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFiOiByZXR1cm4oKENIQVIpKDE3NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJiOiByZXR1cm4oKENIQVIpKDE3NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDAxOiByZXR1cm4oKENIQVIpKDEzMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDAyOiByZXR1cm4oKENIQVIpKDEyOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDAzOiByZXR1cm4oKENIQVIpKDEzMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDA0OiByZXR1cm4oKENIQVIpKDEzNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDA1OiByZXR1cm4oKENIQVIpKDEzNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDA2OiByZXR1cm4oKENIQVIpKDEzOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDA3OiByZXR1cm4oKENIQVIpKDE0MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDA4OiByZXR1cm4oKENIQVIpKDE0MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDA5OiByZXR1cm4oKENIQVIpKDE0NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDBhOiByZXR1cm4oKENIQVIpKDE0NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDBiOiByZXR1cm4oKENIQVIpKDE0OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDBjOiByZXR1cm4oKENIQVIpKDE1MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDBlOiByZXR1cm4oKENIQVIpKDE1MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDBmOiByZXR1cm4oKENIQVIpKDE1NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDEwOiByZXR1cm4oKENIQVIpKDE2MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDExOiByZXR1cm4oKENIQVIpKDE2MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDEyOiByZXR1cm4oKENIQVIpKDIzNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDEzOiByZXR1cm4oKENIQVIpKDE3MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE0OiByZXR1cm4oKENIQVIpKDE2NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE1OiByZXR1cm4oKENIQVIpKDE2OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE2OiByZXR1cm4oKENIQVIpKDIzNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE3OiByZXR1cm4oKENIQVIpKDI0NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE4OiByZXR1cm4oKENIQVIpKDE4NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE5OiByZXR1cm4oKENIQVIpKDE5MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFhOiByZXR1cm4oKENIQVIpKDE5OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFiOiByZXR1cm4oKENIQVIpKDIwOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFjOiByZXR1cm4oKENIQVIpKDIxMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFkOiByZXR1cm4oKENIQVIpKDIxMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFlOiByZXR1cm4oKENIQVIpKDIxNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFmOiByZXR1cm4oKENIQVIpKDIyMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDIwOiByZXR1cm4oKENIQVIpKDIyNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDIxOiByZXR1cm4oKENIQVIpKDIyOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDIyOiByZXR1cm4oKENIQVIpKDIzMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDIzOiByZXR1cm4oKENIQVIpKDIzMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI0OiByZXR1cm4oKENIQVIpKDE3MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI1OiByZXR1cm4oKENIQVIpKDE4MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI2OiByZXR1cm4oKENIQVIpKDE2NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI3OiByZXR1cm4oKENIQVIpKDI1MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI4OiByZXR1cm4oKENIQVIpKDI0NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI5OiByZXR1cm4oKENIQVIpKDI1MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJhOiByZXR1cm4oKENIQVIpKDE1OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJiOiByZXR1cm4oKENIQVIpKDI0MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJjOiByZXR1cm4oKENIQVIpKDIzOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJkOiByZXR1cm4oKENIQVIpKDI0OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJlOiByZXR1cm4oKENIQVIpKDE1NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJmOiByZXR1cm4oKENIQVIpKDIyNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDMwOiByZXR1cm4oKENIQVIpKDE2MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDMxOiByZXR1cm4oKENIQVIpKDE2MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDMyOiByZXR1cm4oKENIQVIpKDIzNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDMzOiByZXR1cm4oKENIQVIpKDE3MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM0OiByZXR1cm4oKENIQVIpKDE2NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM1OiByZXR1cm4oKENIQVIpKDE2OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM2OiByZXR1cm4oKENIQVIpKDIzMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM3OiByZXR1cm4oKENIQVIpKDI0MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM4OiByZXR1cm4oKENIQVIpKDE4MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM5OiByZXR1cm4oKENIQVIpKDE4OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNhOiByZXR1cm4oKENIQVIpKDE5OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNiOiByZXR1cm4oKENIQVIpKDIwOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNjOiByZXR1cm4oKENIQVIpKDIxMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNkOiByZXR1cm4oKENIQVIpKDIxMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNlOiByZXR1cm4oKENIQVIpKDIxNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNmOiByZXR1cm4oKENIQVIpKDIxNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQwOiByZXR1cm4oKENIQVIpKDIyNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQxOiByZXR1cm4oKENIQVIpKDIyNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQyOiByZXR1cm4oKENIQVIpKDIyOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQzOiByZXR1cm4oKENIQVIpKDIzMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ0OiByZXR1cm4oKENIQVIpKDE3MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ1OiByZXR1cm4oKENIQVIpKDE4MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ2OiByZXR1cm4oKENIQVIpKDE2NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ3OiByZXR1cm4oKENIQVIpKDI1MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ4OiByZXR1cm4oKENIQVIpKDI0NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ5OiByZXR1cm4oKENIQVIpKDI0OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRhOiByZXR1cm4oKENIQVIpKDE1OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRiOiByZXR1cm4oKENIQVIpKDI0MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRjOiByZXR1cm4oKENIQVIpKDIzNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRkOiByZXR1cm4oKENIQVIpKDI0NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRlOiByZXR1cm4oKENIQVIpKDE1NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRmOiByZXR1cm4oKENIQVIpKDIyMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDUxOiByZXR1cm4oKENIQVIpKDEzMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDUyOiByZXR1cm4oKENIQVIpKDEyOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDUzOiByZXR1cm4oKENIQVIpKDEzMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDU0OiByZXR1cm4oKENIQVIpKDEzNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDU1OiByZXR1cm4oKENIQVIpKDEzNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDU2OiByZXR1cm4oKENIQVIpKDEzOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDU3OiByZXR1cm4oKENIQVIpKDE0MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDU4OiByZXR1cm4oKENIQVIpKDE0MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDU5OiByZXR1cm4oKENIQVIpKDE0NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDVhOiByZXR1cm4oKENIQVIpKDE0NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDViOiByZXR1cm4oKENIQVIpKDE0OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDVjOiByZXR1cm4oKENIQVIpKDE1MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDVlOiByZXR1cm4oKENIQVIpKDE1MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDVmOiByZXR1cm4oKENIQVIpKDE1NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMTE2OiByZXR1cm4oKENIQVIpKDIzOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTAwOiByZXR1cm4oKENIQVIpKDE5NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTAyOiByZXR1cm4oKENIQVIpKDE3OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTBjOiByZXR1cm4oKENIQVIpKDIxOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTEwOiByZXR1cm4oKENIQVIpKDE5MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTE0OiByZXR1cm4oKENIQVIpKDE5MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTE4OiByZXR1cm4oKENIQVIpKDIxNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTFjOiByZXR1cm4oKENIQVIpKDE5NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTI0OiByZXR1cm4oKENIQVIpKDE4MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTJjOiByZXR1cm4oKENIQVIpKDE5NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTM0OiByZXR1cm4oKENIQVIpKDE5MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTNjOiByZXR1cm4oKENIQVIpKDE5NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTUwOiByZXR1cm4oKENIQVIpKDIwNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTUxOiByZXR1cm4oKENIQVIpKDE4NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTU0OiByZXR1cm4oKENIQVIpKDIwMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTU3OiByZXR1cm4oKENIQVIpKDE4NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTVhOiByZXR1cm4oKENIQVIpKDIwMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTVkOiByZXR1cm4oKENIQVIpKDE4OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTYwOiByZXR1cm4oKENIQVIpKDIwNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTYzOiByZXR1cm4oKENIQVIpKDE4NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTY2OiByZXR1cm4oKENIQVIpKDIwMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTY5OiByZXR1cm4oKENIQVIpKDIwMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTZjOiByZXR1cm4oKENIQVIpKDIwNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTgwOiByZXR1cm4oKENIQVIpKDIyMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTg0OiByZXR1cm4oKENIQVIpKDIyMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTg4OiByZXR1cm4oKENIQVIpKDIxOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkxOiByZXR1cm4oKENIQVIpKDE3NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkyOiByZXR1cm4oKENIQVIpKDE3NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkzOiByZXR1cm4oKENIQVIpKDE3OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNWEwOiByZXR1cm4oKENIQVIpKDI1NCAmIDB4ZmYpKTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9jcHN1YihjKSk7ICAgICAvKiBGb3IgYm94IGNoYXJhY3RlcnMgZXRjICovCisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUEMgQ29kZSBQYWdlIDg1NiAqLworI2lmZGVmIENLX0FOU0lDCit0eF9jcDg1NihVU0hPUlQgYykKKyNlbHNlCit0eF9jcDg1NihjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHg4MCkgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhcyBDMSBncmFwaGljcyAqLworICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDAwYTA6IHJldHVybigoQ0hBUikoMHhmZiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE3OiByZXR1cm4oKENIQVIpKDB4ZDYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiMDogcmV0dXJuKChDSEFSKSgweGY4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjE6IHJldHVybigoQ0hBUikoMHhmMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIyOiByZXR1cm4oKENIQVIpKDB4ZmQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiNTogcmV0dXJuKChDSEFSKSgweGU2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjc6IHJldHVybigoQ0hBUikoMHhmYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRmOiByZXR1cm4oKENIQVIpKDB4ZTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmNzogcmV0dXJuKChDSEFSKSgweGY2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTM6IHJldHVybigoQ0hBUikoMHhlMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMzk4OiByZXR1cm4oKENIQVIpKDB4ZTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNhMzogcmV0dXJuKChDSEFSKSgweGU0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTY6IHJldHVybigoQ0hBUikoMHhlOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2E5OiByZXR1cm4oKENIQVIpKDB4ZWEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNiMTogcmV0dXJuKChDSEFSKSgweGUwICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjQ6IHJldHVybigoQ0hBUikoMHhlYiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2I1OiByZXR1cm4oKENIQVIpKDB4ZWUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNjMDogcmV0dXJuKChDSEFSKSgweGUzICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzM6IHJldHVybigoQ0hBUikoMHhlNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwM2M0OiByZXR1cm4oKENIQVIpKDB4ZTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNjNjogcmV0dXJuKChDSEFSKSgweGVkICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTA6IHJldHVybigoQ0hBUikoMHg4MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDExOiByZXR1cm4oKENIQVIpKDB4ODEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxMjogcmV0dXJuKChDSEFSKSgweDgyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTM6IHJldHVybigoQ0hBUikoMHg4MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE0OiByZXR1cm4oKENIQVIpKDB4ODQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxNTogcmV0dXJuKChDSEFSKSgweDg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTY6IHJldHVybigoQ0hBUikoMHg4NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE3OiByZXR1cm4oKENIQVIpKDB4ODcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxODogcmV0dXJuKChDSEFSKSgweDg4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MTk6IHJldHVybigoQ0hBUikoMHg4OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFhOiByZXR1cm4oKENIQVIpKDB4OGEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxYjogcmV0dXJuKChDSEFSKSgweDhiICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MWM6IHJldHVybigoQ0hBUikoMHg4YyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFkOiByZXR1cm4oKENIQVIpKDB4OGQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQxZTogcmV0dXJuKChDSEFSKSgweDhlICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MWY6IHJldHVybigoQ0hBUikoMHg4ZiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDIwOiByZXR1cm4oKENIQVIpKDB4OTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyMTogcmV0dXJuKChDSEFSKSgweDkxICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjI6IHJldHVybigoQ0hBUikoMHg5MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDIzOiByZXR1cm4oKENIQVIpKDB4OTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyNDogcmV0dXJuKChDSEFSKSgweDk0ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MjU6IHJldHVybigoQ0hBUikoMHg5NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI2OiByZXR1cm4oKENIQVIpKDB4OTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyNzogcmV0dXJuKChDSEFSKSgweDk3ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mjg6IHJldHVybigoQ0hBUikoMHg5OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI5OiByZXR1cm4oKENIQVIpKDB4OTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyYTogcmV0dXJuKChDSEFSKSgweDlhICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MmI6IHJldHVybigoQ0hBUikoMHg5YiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJjOiByZXR1cm4oKENIQVIpKDB4OWMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQyZDogcmV0dXJuKChDSEFSKSgweDlkICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MmU6IHJldHVybigoQ0hBUikoMHg5ZSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJmOiByZXR1cm4oKENIQVIpKDB4OWYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzMDogcmV0dXJuKChDSEFSKSgweGEwICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzE6IHJldHVybigoQ0hBUikoMHhhMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDMyOiByZXR1cm4oKENIQVIpKDB4YTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzMzogcmV0dXJuKChDSEFSKSgweGEzICYgMHhmZikpOworICAgICAgY2FzZSAweDA0MzQ6IHJldHVybigoQ0hBUikoMHhhNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM1OiByZXR1cm4oKENIQVIpKDB4YTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzNjogcmV0dXJuKChDSEFSKSgweGE2ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0Mzc6IHJldHVybigoQ0hBUikoMHhhNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM4OiByZXR1cm4oKENIQVIpKDB4YTggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzOTogcmV0dXJuKChDSEFSKSgweGE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M2E6IHJldHVybigoQ0hBUikoMHhhYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNiOiByZXR1cm4oKENIQVIpKDB4YWIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzYzogcmV0dXJuKChDSEFSKSgweGFjICYgMHhmZikpOworICAgICAgY2FzZSAweDA0M2Q6IHJldHVybigoQ0hBUikoMHhhZCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNlOiByZXR1cm4oKENIQVIpKDB4YWUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQzZjogcmV0dXJuKChDSEFSKSgweGFmICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDA6IHJldHVybigoQ0hBUikoMHhiMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQxOiByZXR1cm4oKENIQVIpKDB4YjEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0MjogcmV0dXJuKChDSEFSKSgweGIyICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDM6IHJldHVybigoQ0hBUikoMHhiMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ0OiByZXR1cm4oKENIQVIpKDB4YjQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0NTogcmV0dXJuKChDSEFSKSgweGI1ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDY6IHJldHVybigoQ0hBUikoMHhiNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ3OiByZXR1cm4oKENIQVIpKDB4YjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0ODogcmV0dXJuKChDSEFSKSgweGI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NDk6IHJldHVybigoQ0hBUikoMHhiOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRhOiByZXR1cm4oKENIQVIpKDB4YmEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0YjogcmV0dXJuKChDSEFSKSgweGJiICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NGM6IHJldHVybigoQ0hBUikoMHhiYyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRkOiByZXR1cm4oKENIQVIpKDB4YmQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDQ0ZTogcmV0dXJuKChDSEFSKSgweGJlICYgMHhmZikpOworICAgICAgY2FzZSAweDA0NGY6IHJldHVybigoQ0hBUikoMHhiZiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMDdmOiByZXR1cm4oKENIQVIpKDB4ZmMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjExNjogcmV0dXJuKChDSEFSKSgweGQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMTk6IHJldHVybigoQ0hBUikoMHhmOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMjFhOiByZXR1cm4oKENIQVIpKDB4ZmIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjIxZTogcmV0dXJuKChDSEFSKSgweGVjICYgMHhmZikpOworICAgICAgY2FzZSAweDIyMjk6IHJldHVybigoQ0hBUikoMHhlZiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMjQ4OiByZXR1cm4oKENIQVIpKDB4ZjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjI2MTogcmV0dXJuKChDSEFSKSgweGYwICYgMHhmZikpOworICAgICAgY2FzZSAweDIyNjQ6IHJldHVybigoQ0hBUikoMHhmMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMjY1OiByZXR1cm4oKENIQVIpKDB4ZjIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjMyMDogcmV0dXJuKChDSEFSKSgweGY0ICYgMHhmZikpOworICAgICAgY2FzZSAweDIzMjE6IHJldHVybigoQ0hBUikoMHhmNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTAwOiByZXR1cm4oKENIQVIpKDB4YzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUwMjogcmV0dXJuKChDSEFSKSgweGQzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MGM6IHJldHVybigoQ0hBUikoMHhkYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTEwOiByZXR1cm4oKENIQVIpKDB4Y2YgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxNDogcmV0dXJuKChDSEFSKSgweGMwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTg6IHJldHVybigoQ0hBUikoMHhkOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTFjOiByZXR1cm4oKENIQVIpKDB4YzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUyNDogcmV0dXJuKChDSEFSKSgweGQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MmM6IHJldHVybigoQ0hBUikoMHhjMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTM0OiByZXR1cm4oKENIQVIpKDB4YzEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUzYzogcmV0dXJuKChDSEFSKSgweGM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTA6IHJldHVybigoQ0hBUikoMHhjZCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTUxOiByZXR1cm4oKENIQVIpKDB4YzcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1NDogcmV0dXJuKChDSEFSKSgweGM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTc6IHJldHVybigoQ0hBUikoMHhkNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTVhOiByZXR1cm4oKENIQVIpKDB4YzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1ZDogcmV0dXJuKChDSEFSKSgweGQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjA6IHJldHVybigoQ0hBUikoMHhjYyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTYzOiByZXR1cm4oKENIQVIpKDB4YzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2NjogcmV0dXJuKChDSEFSKSgweGNiICYgMHhmZikpOworICAgICAgY2FzZSAweDI1Njk6IHJldHVybigoQ0hBUikoMHhjYSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTZjOiByZXR1cm4oKENIQVIpKDB4Y2UgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4MDogcmV0dXJuKChDSEFSKSgweGRmICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODQ6IHJldHVybigoQ0hBUikoMHhkYyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTg4OiByZXR1cm4oKENIQVIpKDB4ZGIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4YzogcmV0dXJuKChDSEFSKSgweGRkICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTA6IHJldHVybigoQ0hBUikoMHhkZSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkxOiByZXR1cm4oKENIQVIpKDB4ZDAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU5MjogcmV0dXJuKChDSEFSKSgweGQxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTM6IHJldHVybigoQ0hBUikoMHhkMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNWEwOiByZXR1cm4oKENIQVIpKDB4ZmUgJiAweGZmKSk7CisgICAgICBkZWZhdWx0OiByZXR1cm4odHhfY3BzdWIoYykpOyAgICAgLyogRm9yIGJveCBjaGFyYWN0ZXJzIGV0YyAqLworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDIENvZGUgUGFnZSA4NTcgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfY3A4NTcoVVNIT1JUIGMpCisjZWxzZQordHhfY3A4NTcoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4ODApICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXMgQzEgZ3JhcGhpY3MgKi8KKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgwMGM3OiByZXR1cm4oKENIQVIpKDEyOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZjOiByZXR1cm4oKENIQVIpKDEyOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU5OiByZXR1cm4oKENIQVIpKDEzMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUyOiByZXR1cm4oKENIQVIpKDEzMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU0OiByZXR1cm4oKENIQVIpKDEzMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUwOiByZXR1cm4oKENIQVIpKDEzMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU1OiByZXR1cm4oKENIQVIpKDEzNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU3OiByZXR1cm4oKENIQVIpKDEzNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVhOiByZXR1cm4oKENIQVIpKDEzNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGViOiByZXR1cm4oKENIQVIpKDEzNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU4OiByZXR1cm4oKENIQVIpKDEzOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVmOiByZXR1cm4oKENIQVIpKDEzOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVlOiByZXR1cm4oKENIQVIpKDE0MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTMxOiByZXR1cm4oKENIQVIpKDE0MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM0OiByZXR1cm4oKENIQVIpKDE0MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM1OiByZXR1cm4oKENIQVIpKDE0MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM5OiByZXR1cm4oKENIQVIpKDE0NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGU2OiByZXR1cm4oKENIQVIpKDE0NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGM2OiByZXR1cm4oKENIQVIpKDE0NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY0OiByZXR1cm4oKENIQVIpKDE0NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY2OiByZXR1cm4oKENIQVIpKDE0OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYyOiByZXR1cm4oKENIQVIpKDE0OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZiOiByZXR1cm4oKENIQVIpKDE1MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY5OiByZXR1cm4oKENIQVIpKDE1MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTMwOiByZXR1cm4oKENIQVIpKDE1MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ2OiByZXR1cm4oKENIQVIpKDE1MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGRjOiByZXR1cm4oKENIQVIpKDE1NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGY4OiByZXR1cm4oKENIQVIpKDE1NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGEzOiByZXR1cm4oKENIQVIpKDE1NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQ4OiByZXR1cm4oKENIQVIpKDE1NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTVlOiByZXR1cm4oKENIQVIpKDE1OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTVmOiByZXR1cm4oKENIQVIpKDE1OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGUxOiByZXR1cm4oKENIQVIpKDE2MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGVkOiByZXR1cm4oKENIQVIpKDE2MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYzOiByZXR1cm4oKENIQVIpKDE2MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGZhOiByZXR1cm4oKENIQVIpKDE2MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGYxOiByZXR1cm4oKENIQVIpKDE2NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGQxOiByZXR1cm4oKENIQVIpKDE2NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTFlOiByZXR1cm4oKENIQVIpKDE2NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMTFmOiByZXR1cm4oKENIQVIpKDE2NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJmOiByZXR1cm4oKENIQVIpKDE2OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFlOiByZXR1cm4oKENIQVIpKDE2OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFjOiByZXR1cm4oKENIQVIpKDE3MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJkOiByZXR1cm4oKENIQVIpKDE3MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJjOiByZXR1cm4oKENIQVIpKDE3MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGExOiByZXR1cm4oKENIQVIpKDE3MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGFiOiByZXR1cm4oKENIQVIpKDE3NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGJiOiByZXR1cm4oKENIQVIpKDE3NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMGFjOiByZXR1cm4oKENIQVIpKDIxMyAmIDB4ZmYpKTsgLyogRXVybyAqLworICAgICAgY2FzZSAweDI1OTE6IHJldHVybigoQ0hBUikoMTc2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTI6IHJldHVybigoQ0hBUikoMTc3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTM6IHJldHVybigoQ0hBUikoMTc4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MDI6IHJldHVybigoQ0hBUikoMTc5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MjQ6IHJldHVybigoQ0hBUikoMTgwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzE6IHJldHVybigoQ0hBUikoMTgxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzI6IHJldHVybigoQ0hBUikoMTgyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzA6IHJldHVybigoQ0hBUikoMTgzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTk6IHJldHVybigoQ0hBUikoMTg0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjM6IHJldHVybigoQ0hBUikoMTg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTE6IHJldHVybigoQ0hBUikoMTg2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTc6IHJldHVybigoQ0hBUikoMTg3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NWQ6IHJldHVybigoQ0hBUikoMTg4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTI6IHJldHVybigoQ0hBUikoMTg5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTU6IHJldHVybigoQ0hBUikoMTkwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTA6IHJldHVybigoQ0hBUikoMTkxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTQ6IHJldHVybigoQ0hBUikoMTkyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MzQ6IHJldHVybigoQ0hBUikoMTkzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MmM6IHJldHVybigoQ0hBUikoMTk0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MWM6IHJldHVybigoQ0hBUikoMTk1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MDA6IHJldHVybigoQ0hBUikoMTk2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1M2M6IHJldHVybigoQ0hBUikoMTk3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZTM6IHJldHVybigoQ0hBUikoMTk4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzM6IHJldHVybigoQ0hBUikoMTk5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NWE6IHJldHVybigoQ0hBUikoMjAwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTQ6IHJldHVybigoQ0hBUikoMjAxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1Njk6IHJldHVybigoQ0hBUikoMjAyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjY6IHJldHVybigoQ0hBUikoMjAzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjA6IHJldHVybigoQ0hBUikoMjA0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTA6IHJldHVybigoQ0hBUikoMjA1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NmM6IHJldHVybigoQ0hBUikoMjA2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTQ6IHJldHVybigoQ0hBUikoMjA3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmE6IHJldHVybigoQ0hBUikoMjA4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWE6IHJldHVybigoQ0hBUikoMjA5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2E6IHJldHVybigoQ0hBUikoMjEwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2I6IHJldHVybigoQ0hBUikoMjExICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYzg6IHJldHVybigoQ0hBUikoMjEyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2Q6IHJldHVybigoQ0hBUikoMjE0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2U6IHJldHVybigoQ0hBUikoMjE1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2Y6IHJldHVybigoQ0hBUikoMjE2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTg6IHJldHVybigoQ0hBUikoMjE3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MGM6IHJldHVybigoQ0hBUikoMjE4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODg6IHJldHVybigoQ0hBUikoMjE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODQ6IHJldHVybigoQ0hBUikoMjIwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTY6IHJldHVybigoQ0hBUikoMjIxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwY2M6IHJldHVybigoQ0hBUikoMjIyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODA6IHJldHVybigoQ0hBUikoMjIzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDM6IHJldHVybigoQ0hBUikoMjI0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGY6IHJldHVybigoQ0hBUikoMjI1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDQ6IHJldHVybigoQ0hBUikoMjI2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDI6IHJldHVybigoQ0hBUikoMjI3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjU6IHJldHVybigoQ0hBUikoMjI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDU6IHJldHVybigoQ0hBUikoMjI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjU6IHJldHVybigoQ0hBUikoMjMwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDc6IHJldHVybigoQ0hBUikoMjMyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGE6IHJldHVybigoQ0hBUikoMjMzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZGI6IHJldHVybigoQ0hBUikoMjM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZDk6IHJldHVybigoQ0hBUikoMjM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZWM6IHJldHVybigoQ0hBUikoMjM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZmY6IHJldHVybigoQ0hBUikoMjM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWY6IHJldHVybigoQ0hBUikoMjM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjQ6IHJldHVybigoQ0hBUikoMjM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWQ6IHJldHVybigoQ0hBUikoMjQwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjE6IHJldHVybigoQ0hBUikoMjQxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmU6IHJldHVybigoQ0hBUikoMjQzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjY6IHJldHVybigoQ0hBUikoMjQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTc6IHJldHVybigoQ0hBUikoMjQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwZjc6IHJldHVybigoQ0hBUikoMjQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjg6IHJldHVybigoQ0hBUikoMjQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjA6IHJldHVybigoQ0hBUikoMjQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTg6IHJldHVybigoQ0hBUikoMjQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjc6IHJldHVybigoQ0hBUikoMjUwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjk6IHJldHVybigoQ0hBUikoMjUxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjM6IHJldHVybigoQ0hBUikoMjUyICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjI6IHJldHVybigoQ0hBUikoMjUzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1YTA6IHJldHVybigoQ0hBUikoMjU0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTA6IHJldHVybigoQ0hBUikoMjU1ICYgMHhmZikpOworICAgICAgZGVmYXVsdDogcmV0dXJuKHR4X2Nwc3ViKGMpKTsgICAgIC8qIEZvciBib3ggY2hhcmFjdGVycyBldGMgKi8KKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQQyBDb2RlIFBhZ2UgODYyICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X2NwODYyKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2NwODYyKGMpIFVTSE9SVCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgaWYgKGMgPCAweDgwKSAgICAgICAgICAgICAgICAgICAgICAgLyogSGFzIEMxIGdyYXBoaWNzICovCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDB4MDVkMDogcmV0dXJuKChDSEFSKSgxMjggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkMTogcmV0dXJuKChDSEFSKSgxMjkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkMjogcmV0dXJuKChDSEFSKSgxMzAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkMzogcmV0dXJuKChDSEFSKSgxMzEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkNDogcmV0dXJuKChDSEFSKSgxMzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkNTogcmV0dXJuKChDSEFSKSgxMzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkNjogcmV0dXJuKChDSEFSKSgxMzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkNzogcmV0dXJuKChDSEFSKSgxMzUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkODogcmV0dXJuKChDSEFSKSgxMzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkOTogcmV0dXJuKChDSEFSKSgxMzcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkYTogcmV0dXJuKChDSEFSKSgxMzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkYjogcmV0dXJuKChDSEFSKSgxMzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkYzogcmV0dXJuKChDSEFSKSgxNDAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkZDogcmV0dXJuKChDSEFSKSgxNDEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkZTogcmV0dXJuKChDSEFSKSgxNDIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVkZjogcmV0dXJuKChDSEFSKSgxNDMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVlMDogcmV0dXJuKChDSEFSKSgxNDQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVlMTogcmV0dXJuKChDSEFSKSgxNDUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVlMjogcmV0dXJuKChDSEFSKSgxNDYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVlMzogcmV0dXJuKChDSEFSKSgxNDcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVlNDogcmV0dXJuKChDSEFSKSgxNDggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVlNTogcmV0dXJuKChDSEFSKSgxNDkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVlNjogcmV0dXJuKChDSEFSKSgxNTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVlNzogcmV0dXJuKChDSEFSKSgxNTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVlODogcmV0dXJuKChDSEFSKSgxNTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVlOTogcmV0dXJuKChDSEFSKSgxNTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDVlYTogcmV0dXJuKChDSEFSKSgxNTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhMjogcmV0dXJuKChDSEFSKSgxNTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhMzogcmV0dXJuKChDSEFSKSgxNTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhNTogcmV0dXJuKChDSEFSKSgxNTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjBhNzogcmV0dXJuKChDSEFSKSgxNTggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDE5MjogcmV0dXJuKChDSEFSKSgxNTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlMTogcmV0dXJuKChDSEFSKSgxNjAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBlZDogcmV0dXJuKChDSEFSKSgxNjEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmMzogcmV0dXJuKChDSEFSKSgxNjIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmYTogcmV0dXJuKChDSEFSKSgxNjMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmMTogcmV0dXJuKChDSEFSKSgxNjQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkMTogcmV0dXJuKChDSEFSKSgxNjUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhYTogcmV0dXJuKChDSEFSKSgxNjYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiYTogcmV0dXJuKChDSEFSKSgxNjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiZjogcmV0dXJuKChDSEFSKSgxNjggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjMxMDogcmV0dXJuKChDSEFSKSgxNjkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhYzogcmV0dXJuKChDSEFSKSgxNzAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiZDogcmV0dXJuKChDSEFSKSgxNzEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiYzogcmV0dXJuKChDSEFSKSgxNzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhMTogcmV0dXJuKChDSEFSKSgxNzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhYjogcmV0dXJuKChDSEFSKSgxNzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiYjogcmV0dXJuKChDSEFSKSgxNzUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU5MTogcmV0dXJuKChDSEFSKSgxNzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU5MjogcmV0dXJuKChDSEFSKSgxNzcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU5MzogcmV0dXJuKChDSEFSKSgxNzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUwMjogcmV0dXJuKChDSEFSKSgxNzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUyNDogcmV0dXJuKChDSEFSKSgxODAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2MTogcmV0dXJuKChDSEFSKSgxODEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2MjogcmV0dXJuKChDSEFSKSgxODIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1NjogcmV0dXJuKChDSEFSKSgxODMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1NTogcmV0dXJuKChDSEFSKSgxODQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2MzogcmV0dXJuKChDSEFSKSgxODUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1MTogcmV0dXJuKChDSEFSKSgxODYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1NzogcmV0dXJuKChDSEFSKSgxODcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1ZDogcmV0dXJuKChDSEFSKSgxODggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1YzogcmV0dXJuKChDSEFSKSgxODkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1YjogcmV0dXJuKChDSEFSKSgxOTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxMDogcmV0dXJuKChDSEFSKSgxOTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxNDogcmV0dXJuKChDSEFSKSgxOTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUzNDogcmV0dXJuKChDSEFSKSgxOTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUyYzogcmV0dXJuKChDSEFSKSgxOTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxYzogcmV0dXJuKChDSEFSKSgxOTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUwMDogcmV0dXJuKChDSEFSKSgxOTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUzYzogcmV0dXJuKChDSEFSKSgxOTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1ZTogcmV0dXJuKChDSEFSKSgxOTggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1ZjogcmV0dXJuKChDSEFSKSgxOTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1YTogcmV0dXJuKChDSEFSKSgyMDAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1NDogcmV0dXJuKChDSEFSKSgyMDEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2OTogcmV0dXJuKChDSEFSKSgyMDIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2NjogcmV0dXJuKChDSEFSKSgyMDMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2MDogcmV0dXJuKChDSEFSKSgyMDQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1MDogcmV0dXJuKChDSEFSKSgyMDUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2YzogcmV0dXJuKChDSEFSKSgyMDYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2NzogcmV0dXJuKChDSEFSKSgyMDcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2ODogcmV0dXJuKChDSEFSKSgyMDggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2NDogcmV0dXJuKChDSEFSKSgyMDkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2NTogcmV0dXJuKChDSEFSKSgyMTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1OTogcmV0dXJuKChDSEFSKSgyMTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1ODogcmV0dXJuKChDSEFSKSgyMTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1MjogcmV0dXJuKChDSEFSKSgyMTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU1MzogcmV0dXJuKChDSEFSKSgyMTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2YjogcmV0dXJuKChDSEFSKSgyMTUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU2YTogcmV0dXJuKChDSEFSKSgyMTYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUxODogcmV0dXJuKChDSEFSKSgyMTcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjUwYzogcmV0dXJuKChDSEFSKSgyMTggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4ODogcmV0dXJuKChDSEFSKSgyMTkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4NDogcmV0dXJuKChDSEFSKSgyMjAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4YzogcmV0dXJuKChDSEFSKSgyMjEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU5MDogcmV0dXJuKChDSEFSKSgyMjIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjU4MDogcmV0dXJuKChDSEFSKSgyMjMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNiMTogcmV0dXJuKChDSEFSKSgyMjQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBkZjogcmV0dXJuKChDSEFSKSgyMjUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDM5MzogcmV0dXJuKChDSEFSKSgyMjYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNjMDogcmV0dXJuKChDSEFSKSgyMjcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNhMzogcmV0dXJuKChDSEFSKSgyMjggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNjMzogcmV0dXJuKChDSEFSKSgyMjkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiNTogcmV0dXJuKChDSEFSKSgyMzAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNjNDogcmV0dXJuKChDSEFSKSgyMzEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNhNjogcmV0dXJuKChDSEFSKSgyMzIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDM5ODogcmV0dXJuKChDSEFSKSgyMzMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNhOTogcmV0dXJuKChDSEFSKSgyMzQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNiNDogcmV0dXJuKChDSEFSKSgyMzUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjIxZTogcmV0dXJuKChDSEFSKSgyMzYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNjNjogcmV0dXJuKChDSEFSKSgyMzcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDNiNTogcmV0dXJuKChDSEFSKSgyMzggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjIyOTogcmV0dXJuKChDSEFSKSgyMzkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjI2MTogcmV0dXJuKChDSEFSKSgyNDAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiMTogcmV0dXJuKChDSEFSKSgyNDEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjI2NTogcmV0dXJuKChDSEFSKSgyNDIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjI2NDogcmV0dXJuKChDSEFSKSgyNDMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjMyMDogcmV0dXJuKChDSEFSKSgyNDQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjMyMTogcmV0dXJuKChDSEFSKSgyNDUgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBmNzogcmV0dXJuKChDSEFSKSgyNDYgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjI0ODogcmV0dXJuKChDSEFSKSgyNDcgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiMDogcmV0dXJuKChDSEFSKSgyNDggJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjIxOTogcmV0dXJuKChDSEFSKSgyNDkgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiNzogcmV0dXJuKChDSEFSKSgyNTAgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjIxYTogcmV0dXJuKChDSEFSKSgyNTEgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjA3ZjogcmV0dXJuKChDSEFSKSgyNTIgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBiMjogcmV0dXJuKChDSEFSKSgyNTMgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MjVhMDogcmV0dXJuKChDSEFSKSgyNTQgJiAweGZmKSk7CisgICAgICBjYXNlIDB4MDBhMDogcmV0dXJuKChDSEFSKSgyNTUgJiAweGZmKSk7CisgICAgICBkZWZhdWx0OiByZXR1cm4odHhfY3BzdWIoYykpOyAgICAgLyogRm9yIGJveCBjaGFyYWN0ZXJzIGV0YyAqLworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDIENvZGUgUGFnZSA4NjQgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfY3A4NjQoVVNIT1JUIGMpCisjZWxzZQordHhfY3A4NjQoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4ODApICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXMgQzEgZ3JhcGhpY3MgKi8KKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgwMGIwOiByZXR1cm4oKENIQVIpMHg4MCAmIDB4ZmYpOworICAgICAgY2FzZSAweDAwYjc6IHJldHVybigoQ0hBUikweDgxICYgMHhmZik7CisgICAgICBjYXNlIDB4MjIxOTogcmV0dXJuKChDSEFSKTB4ODIgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgyMjFhOiByZXR1cm4oKENIQVIpMHg4MyAmIDB4ZmYpOworICAgICAgY2FzZSAweDI1OTI6IHJldHVybigoQ0hBUikweDg0ICYgMHhmZik7CisgICAgICBjYXNlIDB4MjUwMDogcmV0dXJuKChDSEFSKTB4ODUgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgyNTAyOiByZXR1cm4oKENIQVIpMHg4NiAmIDB4ZmYpOworICAgICAgY2FzZSAweDI1M2M6IHJldHVybigoQ0hBUikweDg3ICYgMHhmZik7CisgICAgICBjYXNlIDB4MjUyNDogcmV0dXJuKChDSEFSKTB4ODggJiAweGZmKTsKKyAgICAgIGNhc2UgMHgyNTJjOiByZXR1cm4oKENIQVIpMHg4OSAmIDB4ZmYpOworICAgICAgY2FzZSAweDI1MWM6IHJldHVybigoQ0hBUikweDhhICYgMHhmZik7CisgICAgICBjYXNlIDB4MjUzNDogcmV0dXJuKChDSEFSKTB4OGIgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgyNTEwOiByZXR1cm4oKENIQVIpMHg4YyAmIDB4ZmYpOworICAgICAgY2FzZSAweDI1MGM6IHJldHVybigoQ0hBUikweDhkICYgMHhmZik7CisgICAgICBjYXNlIDB4MjUxNDogcmV0dXJuKChDSEFSKTB4OGUgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgyNTE4OiByZXR1cm4oKENIQVIpMHg4ZiAmIDB4ZmYpOworICAgICAgY2FzZSAweDAzYjI6IHJldHVybigoQ0hBUikweDkwICYgMHhmZik7CisgICAgICBjYXNlIDB4MjIxZTogcmV0dXJuKChDSEFSKTB4OTEgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgwM2M2OiByZXR1cm4oKENIQVIpMHg5MiAmIDB4ZmYpOworICAgICAgY2FzZSAweDAwYjE6IHJldHVybigoQ0hBUikweDkzICYgMHhmZik7CisgICAgICBjYXNlIDB4MDBiZDogcmV0dXJuKChDSEFSKTB4OTQgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgwMGJjOiByZXR1cm4oKENIQVIpMHg5NSAmIDB4ZmYpOworICAgICAgY2FzZSAweDIyNDg6IHJldHVybigoQ0hBUikweDk2ICYgMHhmZik7CisgICAgICBjYXNlIDB4MDBhYjogcmV0dXJuKChDSEFSKTB4OTcgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgwMGJiOiByZXR1cm4oKENIQVIpMHg5OCAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlZjc6IHJldHVybigoQ0hBUikweDk5ICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVmODogcmV0dXJuKChDSEFSKTB4OWEgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWZiOiByZXR1cm4oKENIQVIpMHg5ZCAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlZmM6IHJldHVybigoQ0hBUikweDllICYgMHhmZik7CisgICAgICBjYXNlIDB4MDBhMDogcmV0dXJuKChDSEFSKTB4YTAgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgwMGFkOiByZXR1cm4oKENIQVIpMHhhMSAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlODI6IHJldHVybigoQ0hBUikweGEyICYgMHhmZik7CisgICAgICBjYXNlIDB4MDBhMzogcmV0dXJuKChDSEFSKTB4YTMgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgwMGE0OiByZXR1cm4oKENIQVIpMHhhNCAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlODQ6IHJldHVybigoQ0hBUikweGE1ICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmU4ZTogcmV0dXJuKChDSEFSKTB4YTggJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZThmOiByZXR1cm4oKENIQVIpMHhhOSAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlOTU6IHJldHVybigoQ0hBUikweGFhICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmU5OTogcmV0dXJuKChDSEFSKTB4YWIgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgwNjBjOiByZXR1cm4oKENIQVIpMHhhYyAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlOWQ6IHJldHVybigoQ0hBUikweGFkICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVhMTogcmV0dXJuKChDSEFSKTB4YWUgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWE1OiByZXR1cm4oKENIQVIpMHhhZiAmIDB4ZmYpOworICAgICAgY2FzZSAweDA2NjA6IHJldHVybigoQ0hBUikweGIwICYgMHhmZik7CisgICAgICBjYXNlIDB4MDY2MTogcmV0dXJuKChDSEFSKTB4YjEgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgwNjYyOiByZXR1cm4oKENIQVIpMHhiMiAmIDB4ZmYpOworICAgICAgY2FzZSAweDA2NjM6IHJldHVybigoQ0hBUikweGIzICYgMHhmZik7CisgICAgICBjYXNlIDB4MDY2NDogcmV0dXJuKChDSEFSKTB4YjQgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgwNjY1OiByZXR1cm4oKENIQVIpMHhiNSAmIDB4ZmYpOworICAgICAgY2FzZSAweDA2NjY6IHJldHVybigoQ0hBUikweGI2ICYgMHhmZik7CisgICAgICBjYXNlIDB4MDY2NzogcmV0dXJuKChDSEFSKTB4YjcgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgwNjY4OiByZXR1cm4oKENIQVIpMHhiOCAmIDB4ZmYpOworICAgICAgY2FzZSAweDA2Njk6IHJldHVybigoQ0hBUikweGI5ICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVkMTogcmV0dXJuKChDSEFSKTB4YmEgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgwNjFiOiByZXR1cm4oKENIQVIpMHhiYiAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlYjE6IHJldHVybigoQ0hBUikweGJjICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmViNTogcmV0dXJuKChDSEFSKTB4YmQgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWI5OiByZXR1cm4oKENIQVIpMHhiZSAmIDB4ZmYpOworICAgICAgY2FzZSAweDA2MWY6IHJldHVybigoQ0hBUikweGJmICYgMHhmZik7CisgICAgICBjYXNlIDB4MDBhMjogcmV0dXJuKChDSEFSKTB4YzAgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZTgwOiByZXR1cm4oKENIQVIpMHhjMSAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlODE6IHJldHVybigoQ0hBUikweGMyICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmU4MzogcmV0dXJuKChDSEFSKTB4YzMgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZTg1OiByZXR1cm4oKENIQVIpMHhjNCAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlY2E6IHJldHVybigoQ0hBUikweGM1ICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmU4YjogcmV0dXJuKChDSEFSKTB4YzYgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZThkOiByZXR1cm4oKENIQVIpMHhjNyAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlOTE6IHJldHVybigoQ0hBUikweGM4ICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmU5MzogcmV0dXJuKChDSEFSKTB4YzkgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZTk3OiByZXR1cm4oKENIQVIpMHhjYSAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlOWI6IHJldHVybigoQ0hBUikweGNiICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmU5ZjogcmV0dXJuKChDSEFSKTB4Y2MgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWEzOiByZXR1cm4oKENIQVIpMHhjZCAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlYTc6IHJldHVybigoQ0hBUikweGNlICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVhOTogcmV0dXJuKChDSEFSKTB4Y2YgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWFiOiByZXR1cm4oKENIQVIpMHhkMCAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlYWQ6IHJldHVybigoQ0hBUikweGQxICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVhZjogcmV0dXJuKChDSEFSKTB4ZDIgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWIzOiByZXR1cm4oKENIQVIpMHhkMyAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlYjc6IHJldHVybigoQ0hBUikweGQ0ICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmViYjogcmV0dXJuKChDSEFSKTB4ZDUgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWJmOiByZXR1cm4oKENIQVIpMHhkNiAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlYzE6IHJldHVybigoQ0hBUikweGQ3ICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVjNTogcmV0dXJuKChDSEFSKTB4ZDggJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWNiOiByZXR1cm4oKENIQVIpMHhkOSAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlY2Y6IHJldHVybigoQ0hBUikweGRhICYgMHhmZik7CisgICAgICBjYXNlIDB4MDBhNjogcmV0dXJuKChDSEFSKTB4ZGIgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgwMGFjOiByZXR1cm4oKENIQVIpMHhkYyAmIDB4ZmYpOworICAgICAgY2FzZSAweDAwZjc6IHJldHVybigoQ0hBUikweGRkICYgMHhmZik7CisgICAgICBjYXNlIDB4MDBkNzogcmV0dXJuKChDSEFSKTB4ZGUgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWM5OiByZXR1cm4oKENIQVIpMHhkZiAmIDB4ZmYpOworICAgICAgY2FzZSAweDA2NDA6IHJldHVybigoQ0hBUikweGUwICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVkMzogcmV0dXJuKChDSEFSKTB4ZTEgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWQ3OiByZXR1cm4oKENIQVIpMHhlMiAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlZGI6IHJldHVybigoQ0hBUikweGUzICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVkZjogcmV0dXJuKChDSEFSKTB4ZTQgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWUzOiByZXR1cm4oKENIQVIpMHhlNSAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlZTc6IHJldHVybigoQ0hBUikweGU2ICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVlYjogcmV0dXJuKChDSEFSKTB4ZTcgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWVkOiByZXR1cm4oKENIQVIpMHhlOCAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlZWY6IHJldHVybigoQ0hBUikweGU5ICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVmMzogcmV0dXJuKChDSEFSKTB4ZWEgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWJkOiByZXR1cm4oKENIQVIpMHhlYiAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlY2M6IHJldHVybigoQ0hBUikweGVjICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVjZTogcmV0dXJuKChDSEFSKTB4ZWQgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWNkOiByZXR1cm4oKENIQVIpMHhlZSAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlZTE6IHJldHVybigoQ0hBUikweGVmICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmU3ZDogcmV0dXJuKChDSEFSKTB4ZjAgJiAweGZmKTsKKyAgICAgIGNhc2UgMHgwNjUxOiByZXR1cm4oKENIQVIpMHhmMSAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlZTU6IHJldHVybigoQ0hBUikweGYyICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVlOTogcmV0dXJuKChDSEFSKTB4ZjMgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWVjOiByZXR1cm4oKENIQVIpMHhmNCAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlZjA6IHJldHVybigoQ0hBUikweGY1ICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVmMjogcmV0dXJuKChDSEFSKTB4ZjYgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWQwOiByZXR1cm4oKENIQVIpMHhmNyAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlZDU6IHJldHVybigoQ0hBUikweGY4ICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVmNTogcmV0dXJuKChDSEFSKTB4ZjkgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWY2OiByZXR1cm4oKENIQVIpMHhmYSAmIDB4ZmYpOworICAgICAgY2FzZSAweGZlZGQ6IHJldHVybigoQ0hBUikweGZiICYgMHhmZik7CisgICAgICBjYXNlIDB4ZmVkOTogcmV0dXJuKChDSEFSKTB4ZmMgJiAweGZmKTsKKyAgICAgIGNhc2UgMHhmZWYxOiByZXR1cm4oKENIQVIpMHhmZCAmIDB4ZmYpOworICAgICAgY2FzZSAweDI1YTA6IHJldHVybigoQ0hBUikweGZlICYgMHhmZik7CisgICAgICBkZWZhdWx0OiByZXR1cm4odHhfY3BzdWIoYykpOyAgICAgLyogRm9yIGJveCBjaGFyYWN0ZXJzIGV0YyAqLworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDIENvZGUgUGFnZSA4NjYgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfY3A4NjYoVVNIT1JUIGMpCisjZWxzZQordHhfY3A4NjYoYykgVVNIT1JUIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoYyA8IDB4ODApICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXMgQzEgZ3JhcGhpY3MgKi8KKyAgICAgIHJldHVybigoQ0hBUikoYyAmIDB4ZmYpKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHgwMGEwOiByZXR1cm4oKENIQVIpKDI1NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGE0OiByZXR1cm4oKENIQVIpKDI1MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGIwOiByZXR1cm4oKENIQVIpKDI0OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwMGI3OiByZXR1cm4oKENIQVIpKDI1MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDAxOiByZXR1cm4oKENIQVIpKDI0MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDA0OiByZXR1cm4oKENIQVIpKDI0MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDA3OiByZXR1cm4oKENIQVIpKDI0NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDBlOiByZXR1cm4oKENIQVIpKDI0NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDEwOiByZXR1cm4oKENIQVIpKDEyOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDExOiByZXR1cm4oKENIQVIpKDEyOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDEyOiByZXR1cm4oKENIQVIpKDEzMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDEzOiByZXR1cm4oKENIQVIpKDEzMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE0OiByZXR1cm4oKENIQVIpKDEzMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE1OiByZXR1cm4oKENIQVIpKDEzMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE2OiByZXR1cm4oKENIQVIpKDEzNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE3OiByZXR1cm4oKENIQVIpKDEzNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE4OiByZXR1cm4oKENIQVIpKDEzNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDE5OiByZXR1cm4oKENIQVIpKDEzNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFhOiByZXR1cm4oKENIQVIpKDEzOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFiOiByZXR1cm4oKENIQVIpKDEzOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFjOiByZXR1cm4oKENIQVIpKDE0MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFkOiByZXR1cm4oKENIQVIpKDE0MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFlOiByZXR1cm4oKENIQVIpKDE0MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDFmOiByZXR1cm4oKENIQVIpKDE0MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDIwOiByZXR1cm4oKENIQVIpKDE0NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDIxOiByZXR1cm4oKENIQVIpKDE0NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDIyOiByZXR1cm4oKENIQVIpKDE0NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDIzOiByZXR1cm4oKENIQVIpKDE0NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI0OiByZXR1cm4oKENIQVIpKDE0OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI1OiByZXR1cm4oKENIQVIpKDE0OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI2OiByZXR1cm4oKENIQVIpKDE1MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI3OiByZXR1cm4oKENIQVIpKDE1MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI4OiByZXR1cm4oKENIQVIpKDE1MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDI5OiByZXR1cm4oKENIQVIpKDE1MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJhOiByZXR1cm4oKENIQVIpKDE1NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJiOiByZXR1cm4oKENIQVIpKDE1NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJjOiByZXR1cm4oKENIQVIpKDE1NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJkOiByZXR1cm4oKENIQVIpKDE1NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJlOiByZXR1cm4oKENIQVIpKDE1OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDJmOiByZXR1cm4oKENIQVIpKDE1OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDMwOiByZXR1cm4oKENIQVIpKDE2MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDMxOiByZXR1cm4oKENIQVIpKDE2MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDMyOiByZXR1cm4oKENIQVIpKDE2MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDMzOiByZXR1cm4oKENIQVIpKDE2MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM0OiByZXR1cm4oKENIQVIpKDE2NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM1OiByZXR1cm4oKENIQVIpKDE2NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM2OiByZXR1cm4oKENIQVIpKDE2NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM3OiByZXR1cm4oKENIQVIpKDE2NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM4OiByZXR1cm4oKENIQVIpKDE2OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDM5OiByZXR1cm4oKENIQVIpKDE2OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNhOiByZXR1cm4oKENIQVIpKDE3MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNiOiByZXR1cm4oKENIQVIpKDE3MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNjOiByZXR1cm4oKENIQVIpKDE3MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNkOiByZXR1cm4oKENIQVIpKDE3MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNlOiByZXR1cm4oKENIQVIpKDE3NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDNmOiByZXR1cm4oKENIQVIpKDE3NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQwOiByZXR1cm4oKENIQVIpKDIyNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQxOiByZXR1cm4oKENIQVIpKDIyNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQyOiByZXR1cm4oKENIQVIpKDIyNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQzOiByZXR1cm4oKENIQVIpKDIyNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ0OiByZXR1cm4oKENIQVIpKDIyOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ1OiByZXR1cm4oKENIQVIpKDIyOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ2OiByZXR1cm4oKENIQVIpKDIzMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ3OiByZXR1cm4oKENIQVIpKDIzMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ4OiByZXR1cm4oKENIQVIpKDIzMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDQ5OiByZXR1cm4oKENIQVIpKDIzMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRhOiByZXR1cm4oKENIQVIpKDIzNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRiOiByZXR1cm4oKENIQVIpKDIzNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRjOiByZXR1cm4oKENIQVIpKDIzNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRkOiByZXR1cm4oKENIQVIpKDIzNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRlOiByZXR1cm4oKENIQVIpKDIzOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDRmOiByZXR1cm4oKENIQVIpKDIzOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDUxOiByZXR1cm4oKENIQVIpKDI0MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDU0OiByZXR1cm4oKENIQVIpKDI0MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDU3OiByZXR1cm4oKENIQVIpKDI0NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgwNDVlOiByZXR1cm4oKENIQVIpKDI0NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMTE2OiByZXR1cm4oKENIQVIpKDI1MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMjE5OiByZXR1cm4oKENIQVIpKDI0OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyMjFhOiByZXR1cm4oKENIQVIpKDI1MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTAwOiByZXR1cm4oKENIQVIpKDE5NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTAyOiByZXR1cm4oKENIQVIpKDE3OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTBjOiByZXR1cm4oKENIQVIpKDIxOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTEwOiByZXR1cm4oKENIQVIpKDE5MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTE0OiByZXR1cm4oKENIQVIpKDE5MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTE4OiByZXR1cm4oKENIQVIpKDIxNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTFjOiByZXR1cm4oKENIQVIpKDE5NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTI0OiByZXR1cm4oKENIQVIpKDE4MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTJjOiByZXR1cm4oKENIQVIpKDE5NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTM0OiByZXR1cm4oKENIQVIpKDE5MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTNjOiByZXR1cm4oKENIQVIpKDE5NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTUwOiByZXR1cm4oKENIQVIpKDIwNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTUxOiByZXR1cm4oKENIQVIpKDE4NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTUyOiByZXR1cm4oKENIQVIpKDIxMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTUzOiByZXR1cm4oKENIQVIpKDIxNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTU0OiByZXR1cm4oKENIQVIpKDIwMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTU1OiByZXR1cm4oKENIQVIpKDE4NCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTU2OiByZXR1cm4oKENIQVIpKDE4MyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTU3OiByZXR1cm4oKENIQVIpKDE4NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTU4OiByZXR1cm4oKENIQVIpKDIxMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTU5OiByZXR1cm4oKENIQVIpKDIxMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTVhOiByZXR1cm4oKENIQVIpKDIwMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTViOiByZXR1cm4oKENIQVIpKDE5MCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTVjOiByZXR1cm4oKENIQVIpKDE4OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTVkOiByZXR1cm4oKENIQVIpKDE4OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTVlOiByZXR1cm4oKENIQVIpKDE5OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTVmOiByZXR1cm4oKENIQVIpKDE5OSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTYwOiByZXR1cm4oKENIQVIpKDIwNCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTYxOiByZXR1cm4oKENIQVIpKDE4MSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTYyOiByZXR1cm4oKENIQVIpKDE4MiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTYzOiByZXR1cm4oKENIQVIpKDE4NSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTY0OiByZXR1cm4oKENIQVIpKDIwOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTY1OiByZXR1cm4oKENIQVIpKDIxMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTY2OiByZXR1cm4oKENIQVIpKDIwMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTY3OiByZXR1cm4oKENIQVIpKDIwNyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTY4OiByZXR1cm4oKENIQVIpKDIwOCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTY5OiByZXR1cm4oKENIQVIpKDIwMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTZhOiByZXR1cm4oKENIQVIpKDIxNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTZiOiByZXR1cm4oKENIQVIpKDIxNSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTZjOiByZXR1cm4oKENIQVIpKDIwNiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTgwOiByZXR1cm4oKENIQVIpKDIyMyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTg0OiByZXR1cm4oKENIQVIpKDIyMCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTg4OiByZXR1cm4oKENIQVIpKDIxOSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNThjOiByZXR1cm4oKENIQVIpKDIyMSAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkwOiByZXR1cm4oKENIQVIpKDIyMiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkxOiByZXR1cm4oKENIQVIpKDE3NiAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkyOiByZXR1cm4oKENIQVIpKDE3NyAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNTkzOiByZXR1cm4oKENIQVIpKDE3OCAmIDB4ZmYpKTsKKyAgICAgIGNhc2UgMHgyNWEwOiByZXR1cm4oKENIQVIpKDI1NCAmIDB4ZmYpKTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybih0eF9jcHN1YihjKSk7ICAgICAvKiBGb3IgYm94IGNoYXJhY3RlcnMgZXRjICovCisgICAgfQorfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUEMgQ29kZSBQYWdlIDg2OSAqLworI2lmZGVmIENLX0FOU0lDCit0eF9jcDg2OShVU0hPUlQgYykKKyNlbHNlCit0eF9jcDg2OShjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHg4MCkgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhcyBDMSBncmFwaGljcyAqLworICAgICAgcmV0dXJuKChDSEFSKShjICYgMHhmZikpOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDAwYTA6IHJldHVybigoQ0hBUikoMjU1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTM6IHJldHVybigoQ0hBUikoMTU2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTY6IHJldHVybigoQ0hBUikoMTM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTc6IHJldHVybigoQ0hBUikoMjQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTg6IHJldHVybigoQ0hBUikoMjQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYTk6IHJldHVybigoQ0hBUikoMTUxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWI6IHJldHVybigoQ0hBUikoMTc0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWM6IHJldHVybigoQ0hBUikoMTM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYWQ6IHJldHVybigoQ0hBUikoMjQwICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjA6IHJldHVybigoQ0hBUikoMjQ4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjE6IHJldHVybigoQ0hBUikoMjQxICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjI6IHJldHVybigoQ0hBUikoMTUzICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjM6IHJldHVybigoQ0hBUikoMTU0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYjc6IHJldHVybigoQ0hBUikoMTM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmI6IHJldHVybigoQ0hBUikoMTc1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAwYmQ6IHJldHVybigoQ0hBUikoMTcxICYgMHhmZikpOworICAgICAgY2FzZSAweDAzODQ6IHJldHVybigoQ0hBUikoMjM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzODU6IHJldHVybigoQ0hBUikoMjQ3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzODY6IHJldHVybigoQ0hBUikoMTM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzODg6IHJldHVybigoQ0hBUikoMTQxICYgMHhmZikpOworICAgICAgY2FzZSAweDAzODk6IHJldHVybigoQ0hBUikoMTQzICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOGE6IHJldHVybigoQ0hBUikoMTQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOGM6IHJldHVybigoQ0hBUikoMTQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOGU6IHJldHVybigoQ0hBUikoMTQ5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOGY6IHJldHVybigoQ0hBUikoMTUyICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTA6IHJldHVybigoQ0hBUikoMTYxICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTE6IHJldHVybigoQ0hBUikoMTY0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTI6IHJldHVybigoQ0hBUikoMTY1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTM6IHJldHVybigoQ0hBUikoMTY2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTQ6IHJldHVybigoQ0hBUikoMTY3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTU6IHJldHVybigoQ0hBUikoMTY4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTY6IHJldHVybigoQ0hBUikoMTY5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTc6IHJldHVybigoQ0hBUikoMTcwICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTg6IHJldHVybigoQ0hBUikoMTcyICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOTk6IHJldHVybigoQ0hBUikoMTczICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOWE6IHJldHVybigoQ0hBUikoMTgxICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOWI6IHJldHVybigoQ0hBUikoMTgyICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOWM6IHJldHVybigoQ0hBUikoMTgzICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOWQ6IHJldHVybigoQ0hBUikoMTg0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOWU6IHJldHVybigoQ0hBUikoMTg5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzOWY6IHJldHVybigoQ0hBUikoMTkwICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTA6IHJldHVybigoQ0hBUikoMTk4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTE6IHJldHVybigoQ0hBUikoMTk5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTM6IHJldHVybigoQ0hBUikoMjA3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTQ6IHJldHVybigoQ0hBUikoMjA4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTU6IHJldHVybigoQ0hBUikoMjA5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTY6IHJldHVybigoQ0hBUikoMjEwICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTc6IHJldHVybigoQ0hBUikoMjExICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTg6IHJldHVybigoQ0hBUikoMjEyICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYTk6IHJldHVybigoQ0hBUikoMjEzICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYWE6IHJldHVybigoQ0hBUikoMTQ1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYWI6IHJldHVybigoQ0hBUikoMTUwICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYWM6IHJldHVybigoQ0hBUikoMTU1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYWQ6IHJldHVybigoQ0hBUikoMTU3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYWU6IHJldHVybigoQ0hBUikoMTU4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYWY6IHJldHVybigoQ0hBUikoMTU5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjA6IHJldHVybigoQ0hBUikoMjUyICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjE6IHJldHVybigoQ0hBUikoMjE0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjI6IHJldHVybigoQ0hBUikoMjE1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjM6IHJldHVybigoQ0hBUikoMjE2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjQ6IHJldHVybigoQ0hBUikoMjIxICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjU6IHJldHVybigoQ0hBUikoMjIyICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjY6IHJldHVybigoQ0hBUikoMjI0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjc6IHJldHVybigoQ0hBUikoMjI1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjg6IHJldHVybigoQ0hBUikoMjI2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYjk6IHJldHVybigoQ0hBUikoMjI3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYmE6IHJldHVybigoQ0hBUikoMjI4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYmI6IHJldHVybigoQ0hBUikoMjI5ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYmM6IHJldHVybigoQ0hBUikoMjMwICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYmQ6IHJldHVybigoQ0hBUikoMjMxICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYmU6IHJldHVybigoQ0hBUikoMjMyICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYmY6IHJldHVybigoQ0hBUikoMjMzICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzA6IHJldHVybigoQ0hBUikoMjM0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzE6IHJldHVybigoQ0hBUikoMjM1ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzI6IHJldHVybigoQ0hBUikoMjM3ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzM6IHJldHVybigoQ0hBUikoMjM2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzQ6IHJldHVybigoQ0hBUikoMjM4ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzU6IHJldHVybigoQ0hBUikoMjQyICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzY6IHJldHVybigoQ0hBUikoMjQzICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzc6IHJldHVybigoQ0hBUikoMjQ0ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzg6IHJldHVybigoQ0hBUikoMjQ2ICYgMHhmZikpOworICAgICAgY2FzZSAweDAzYzk6IHJldHVybigoQ0hBUikoMjUwICYgMHhmZikpOworICAgICAgY2FzZSAweDAzY2E6IHJldHVybigoQ0hBUikoMTYwICYgMHhmZikpOworICAgICAgY2FzZSAweDAzY2I6IHJldHVybigoQ0hBUikoMjUxICYgMHhmZikpOworICAgICAgY2FzZSAweDAzY2M6IHJldHVybigoQ0hBUikoMTYyICYgMHhmZikpOworICAgICAgY2FzZSAweDAzY2Q6IHJldHVybigoQ0hBUikoMTYzICYgMHhmZikpOworICAgICAgY2FzZSAweDAzY2U6IHJldHVybigoQ0hBUikoMjUzICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTU6IHJldHVybigoQ0hBUikoMTQyICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTg6IHJldHVybigoQ0hBUikoMTM5ICYgMHhmZikpOworICAgICAgY2FzZSAweDIwMTk6IHJldHVybigoQ0hBUikoMTQwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MDA6IHJldHVybigoQ0hBUikoMTk2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MDI6IHJldHVybigoQ0hBUikoMTc5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MGM6IHJldHVybigoQ0hBUikoMjE4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTA6IHJldHVybigoQ0hBUikoMTkxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTQ6IHJldHVybigoQ0hBUikoMTkyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MTg6IHJldHVybigoQ0hBUikoMjE3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MWM6IHJldHVybigoQ0hBUikoMTk1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MjQ6IHJldHVybigoQ0hBUikoMTgwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MmM6IHJldHVybigoQ0hBUikoMTk0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1MzQ6IHJldHVybigoQ0hBUikoMTkzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1M2M6IHJldHVybigoQ0hBUikoMTk3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTA6IHJldHVybigoQ0hBUikoMjA1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTE6IHJldHVybigoQ0hBUikoMTg2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTQ6IHJldHVybigoQ0hBUikoMjAxICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NTc6IHJldHVybigoQ0hBUikoMTg3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NWE6IHJldHVybigoQ0hBUikoMjAwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NWQ6IHJldHVybigoQ0hBUikoMTg4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjA6IHJldHVybigoQ0hBUikoMjA0ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjM6IHJldHVybigoQ0hBUikoMTg1ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NjY6IHJldHVybigoQ0hBUikoMjAzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1Njk6IHJldHVybigoQ0hBUikoMjAyICYgMHhmZikpOworICAgICAgY2FzZSAweDI1NmM6IHJldHVybigoQ0hBUikoMjA2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODA6IHJldHVybigoQ0hBUikoMjIzICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODQ6IHJldHVybigoQ0hBUikoMjIwICYgMHhmZikpOworICAgICAgY2FzZSAweDI1ODg6IHJldHVybigoQ0hBUikoMjE5ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTE6IHJldHVybigoQ0hBUikoMTc2ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTI6IHJldHVybigoQ0hBUikoMTc3ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1OTM6IHJldHVybigoQ0hBUikoMTc4ICYgMHhmZikpOworICAgICAgY2FzZSAweDI1YTA6IHJldHVybigoQ0hBUikoMjU0ICYgMHhmZikpOworICAgICAgZGVmYXVsdDogcmV0dXJuKHR4X2Nwc3ViKGMpKTsgICAgIC8qIEZvciBib3ggY2hhcmFjdGVycyBldGMgKi8KKyAgICB9Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQQyBDb2RlIFBhZ2UgQzAgZ3JhcGhpY3MgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfc21pbGV5KFVTSE9SVCBjKQorI2Vsc2UKK3R4X3NtaWxleShjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjID4gMHgxZikKKyAgICAgIHJldHVybigtMSk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDB4MDBhMDogcmV0dXJuKChDSEFSKTAgJiAweDdmKTsKKyAgICAgIGNhc2UgMHgwMGE3OiByZXR1cm4oKENIQVIpMjEgJiAweDdmKTsKKyAgICAgIGNhc2UgMHgwMGI2OiByZXR1cm4oKENIQVIpMjAgJiAweDdmKTsKKyAgICAgIGNhc2UgMHgyMDIyOiByZXR1cm4oKENIQVIpNyAmIDB4N2YpOworICAgICAgY2FzZSAweDIwM2M6IHJldHVybigoQ0hBUikxOSAmIDB4N2YpOworICAgICAgY2FzZSAweDIxOTA6IHJldHVybigoQ0hBUikyNyAmIDB4N2YpOworICAgICAgY2FzZSAweDIxOTE6IHJldHVybigoQ0hBUikyNCAmIDB4N2YpOworICAgICAgY2FzZSAweDIxOTI6IHJldHVybigoQ0hBUikyNiAmIDB4N2YpOworICAgICAgY2FzZSAweDIxOTM6IHJldHVybigoQ0hBUikyNSAmIDB4N2YpOworICAgICAgY2FzZSAweDIxOTQ6IHJldHVybigoQ0hBUikyOSAmIDB4N2YpOworICAgICAgY2FzZSAweDIxOTU6IHJldHVybigoQ0hBUikxOCAmIDB4N2YpOworICAgICAgY2FzZSAweDIxYTg6IHJldHVybigoQ0hBUikyMyAmIDB4N2YpOworICAgICAgY2FzZSAweDIzMTk6IHJldHVybigoQ0hBUikyOCAmIDB4N2YpOworICAgICAgY2FzZSAweDI1YWM6IHJldHVybigoQ0hBUikyMiAmIDB4N2YpOworICAgICAgY2FzZSAweDI1YjI6IHJldHVybigoQ0hBUikzMCAmIDB4N2YpOworICAgICAgY2FzZSAweDI1YmE6IHJldHVybigoQ0hBUikxNiAmIDB4N2YpOworICAgICAgY2FzZSAweDI1YmM6IHJldHVybigoQ0hBUikzMSAmIDB4N2YpOworICAgICAgY2FzZSAweDI1YzQ6IHJldHVybigoQ0hBUikxNyAmIDB4N2YpOworICAgICAgY2FzZSAweDI1ZDg6IHJldHVybigoQ0hBUik4ICYgMHg3Zik7CisgICAgICBjYXNlIDB4MjVkOTogcmV0dXJuKChDSEFSKTEwICYgMHg3Zik7CisgICAgICBjYXNlIDB4MjVlZjogcmV0dXJuKChDSEFSKTkgJiAweDdmKTsKKyAgICAgIGNhc2UgMHgyNjNhOiByZXR1cm4oKENIQVIpMSAmIDB4N2YpOworICAgICAgY2FzZSAweDI2M2I6IHJldHVybigoQ0hBUikyICYgMHg3Zik7CisgICAgICBjYXNlIDB4MjYzYzogcmV0dXJuKChDSEFSKTE1ICYgMHg3Zik7CisgICAgICBjYXNlIDB4MjY0MDogcmV0dXJuKChDSEFSKTEyICYgMHg3Zik7CisgICAgICBjYXNlIDB4MjY0MjogcmV0dXJuKChDSEFSKTExICYgMHg3Zik7CisgICAgICBjYXNlIDB4MjY2MDogcmV0dXJuKChDSEFSKTYgJiAweDdmKTsKKyAgICAgIGNhc2UgMHgyNjYzOiByZXR1cm4oKENIQVIpNSAmIDB4N2YpOworICAgICAgY2FzZSAweDI2NjU6IHJldHVybigoQ0hBUikzICYgMHg3Zik7CisgICAgICBjYXNlIDB4MjY2NjogcmV0dXJuKChDSEFSKTQgJiAweDdmKTsKKyAgICAgIGNhc2UgMHgyNjZhOiByZXR1cm4oKENIQVIpMTMgJiAweDdmKTsKKyAgICAgIGNhc2UgMHgyNjZjOiByZXR1cm4oKENIQVIpMTQgJiAweDdmKTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybigtMSk7CisgICAgfQorfQorCitVU0hPUlQgIC8qIEhvcml6b250YWwgU2NhbiBMaW5lcyBVbmljb2RlIHN1YnN0aXR1dGlvbnMgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfaHNsc3ViKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2hzbHN1YihjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjID49IDB4MjNCQSAmJiBjIDw9IDB4MjNCRCApCisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDB4MjNCQTogcmV0dXJuKDB4MjUwMCk7ICAgICAgLyogSCBsaW5lIC0gU2NhbiAxICovCisgICAgICBjYXNlIDB4MjNCQjogcmV0dXJuKDB4MjUwMCk7ICAgICAgLyogSCBsaW5lIC0gU2NhbiAzICovCisgICAgICBjYXNlIDB4MjNCQzogcmV0dXJuKDB4MjUwMCk7ICAgICAgLyogSCBsaW5lIC0gU2NhbiA3ICovCisgICAgICBjYXNlIDB4MjNCRDogcmV0dXJuKDB4MjUwMCk7ICAgICAgLyogSCBsaW5lIC0gU2NhbiA5ICovCisgICAgfQorICAgIHJldHVybihjKTsKK30KKworVVNIT1JUICAvKiBLZXJtaXQgZm9udCAweEU/Pz8gVW5pY29kZSBzdWJzdGl0dXRpb25zICovCisjaWZkZWYgQ0tfQU5TSUMKK3R4X3VzdWIoVVNIT1JUIGMpCisjZWxzZQordHhfdXN1YihjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHhFMDAwIHx8IGMgPiAweEVGRkYpCisgICAgICByZXR1cm4oYyk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDB4RTIwMDogcmV0dXJuKDB4MjUyNCk7ICAgICAgLyogRXh0ZW5zaWJsZSBMZWZ0IEJyYWNlIE1pZGRsZSAqLworICAgICAgY2FzZSAweEUyMDE6IHJldHVybigweDI1NzApOyAgICAgIC8qIEV4dGVuc2libGUgTGVmdCBQYXJlbnRoZXNpcyBib3QgKi8KKyAgICAgIGNhc2UgMHhFMjAyOiByZXR1cm4oMHgyNTZkKTsgICAgICAvKiBFeHRlbnNpYmxlIGxlZnQgcGFyZW50aGVzaXMgdG9wICovCisgICAgICBjYXNlIDB4RTIwMzogcmV0dXJuKDB4MjUxNCk7ICAgICAgLyogRXh0ZW5zaWJsZSBsZWZ0IFNCIGJvdCAqLworICAgICAgY2FzZSAweEUyMDQ6IHJldHVybigweDI1MGMpOyAgICAgIC8qIEV4dGVuc2libGUgbGVmdCBTQiB0b3AgKi8KKyAgICAgIGNhc2UgMHhFMjA1OiByZXR1cm4oMHgyNTFjKTsgICAgICAvKiBFeHRlbnNpYmxlIHJpZ2h0IGJyYWNlIG1pZGRsZSAqLworICAgICAgY2FzZSAweEUyMDY6IHJldHVybigweDI1NmYpOyAgICAgIC8qIEV4dGVuc2libGUgcmlnaHQgcGFyZW50aGVzaXMgYm90ICovCisgICAgICBjYXNlIDB4RTIwNzogcmV0dXJuKDB4MjU2ZSk7ICAgICAgLyogRXh0ZW5zaWJsZSByaWdodCBwYXJlbnRoZXNpcyB0b3AgKi8KKyAgICAgIGNhc2UgMHhFMjA4OiByZXR1cm4oMHgyNTE4KTsgICAgICAvKiBFeHRlbnNpYmxlIHJpZ2h0IFNCIGJvdCAqLworICAgICAgY2FzZSAweEUyMDk6IHJldHVybigweDI1MTApOyAgICAgIC8qIEV4dGVuc2libGUgcmlnaHQgU0IgdG9wICovCisgICAgICBjYXNlIDB4RTIwQzogcmV0dXJuKDB4MDNhMyk7ICAgICAgLyogU3VtbWF0aW9uIHN5bWJvbCBib3QgKi8KKyAgICAgIGNhc2UgMHhFMjBEOiByZXR1cm4oMHgwM2EzKTsgICAgICAvKiBTdW1tYXRpb24gc3ltYm9sIHRvcCAqLworICAgICAgY2FzZSAweEUyMEU6IHJldHVybigweDI1MTApOyAgICAgIC8qIFJpZ2h0IGNlaWxpbmcgY29ybmVyICovCisgICAgICBjYXNlIDB4RTIwRjogcmV0dXJuKDB4MjUxOCk7ICAgICAgLyogUmlnaHQgZmxvb3IgY29ybmVyICovCisgICAgICBjYXNlIDB4RTMwMDogcmV0dXJuKDB4MjUwMik7ICAgICAgLyogViBib3ggbGluZSwgZXh0ZW5zaWJsZSwgbGVmdCAqLworICAgICAgY2FzZSAweEUzMDk6IHJldHVybigweDI1MDIpOyAgICAgIC8qIFYgYm94IGxpbmUsIGV4dGVuc2libGUsIHJpZ2h0ICovCisgICAgICBjYXNlIDB4RTMwQTogcmV0dXJuKDB4MjU4Yyk7ICAgICAgLyogRGlhZ29uYWwgZmlsbCwgZGFyaywgVUwgKi8KKyAgICAgIGNhc2UgMHhFMzBCOiByZXR1cm4oMHgyNTkwKTsgICAgICAvKiBEaWFnb25hbCBmaWxsLCBkYXJrLCBVUiAqLworICAgICAgY2FzZSAweEUzMjA6IHJldHVybigweDI1ODMpOyAgICAgIC8qIFF1YWRyYW50IExMICovCisgICAgICBjYXNlIDB4RTMyMTogcmV0dXJuKDB4MjQ5MCk7ICAgICAgLyogUXVhZHJhbnQgTFIgKi8KKyAgICAgIGNhc2UgMHhFMzIyOiByZXR1cm4oMHgyNThjKTsgICAgICAvKiBRdWFkcmFudCBVTCAqLworICAgICAgY2FzZSAweEUzMjM6IHJldHVybigweDI1ODgpOyAgICAgIC8qIFF1YWRyYW50IFVMIGFuZCBMTCBhbmQgTFIgKi8KKyAgICAgIGNhc2UgMHhFMzI0OiByZXR1cm4oMHgyNTg4KTsgICAgICAvKiBRdWFkcmFudCBVTCBhbmQgTFIgKi8KKyAgICAgIGNhc2UgMHhFMzI1OiByZXR1cm4oMHgyNTg4KTsgICAgICAvKiBRdWFkcmFudCBVTCBhbmQgTFIgKi8KKyAgICAgIGNhc2UgMHhFMzI2OiByZXR1cm4oMHgyNTg4KTsgICAgICAvKiBRdWFkcmFudCBVTCBhbmQgVVIgYW5kIExMICovCisgICAgICBjYXNlIDB4RTMyNzogcmV0dXJuKDB4MjU4OCk7ICAgICAgLyogUXVhZHJhbnQgVUwgYW5kIFVSIGFuZCBMUiAqLworICAgICAgY2FzZSAweEUzMjg6IHJldHVybigweDI1OTApOyAgICAgIC8qIFF1YWRyYW50IFVSICovCisgICAgICBjYXNlIDB4RTMyOTogcmV0dXJuKDB4MjU4OCk7ICAgICAgLyogUXVhZHJhbnQgVVIgYW5kIExMIGFuZCBMUiAqLworICAgICAgY2FzZSAweEU0MDA6IHJldHVybigweDIyMWEpOyAgICAgIC8qIFJhZGljYWwgc3ltYm9sLCBzbWFsbCAqLworICAgICAgY2FzZSAweEU0MDE6IHJldHVybigweDAwYmYpOyAgICAgIC8qIFJldmVyc2UgcXVlc3Rpb24gbWFyayAqLworICAgICAgZGVmYXVsdDogcmV0dXJuKCh1bnNpZ25lZCkweGZmZmQpOworICAgIH0KK30KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuaWNvZGUgdG8gQ1A0Mzcgc3Vic3RpdHV0aW9ucyAqLworI2lmZGVmIENLX0FOU0lDCit0eF9jcHN1YihVU0hPUlQgYykKKyNlbHNlCit0eF9jcHN1YihjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGludCB4OworICAgIGlmIChjIDwgMHgwMDgwKSAgICAgICAgICAgICAgICAgICAgIC8qIEFTQ0lJICovCisgICAgICByZXR1cm4oKENIQVIpKGMgJiAweGZmKSk7CisKKyAgICBpZiAoYyA+PSAweDAwODAgJiYgYyA8PSAweDAxMDApIHsKKyAgICAgICAgc3dpdGNoIChjKSB7ICAgICAgICAgICAgICAgICAgICAvKiBMYXRpbi0xICovCisgICAgICAgICAgY2FzZSAweDAwQTI6IHJldHVybigweDliKTsgICAgLyogQ2VudCBzaWduICovCisgICAgICAgICAgY2FzZSAweDAwQTM6IHJldHVybigxNTYpOyAgICAgLyogUG91bmQgc2lnbiAqLworICAgICAgICAgIGNhc2UgMHgwMEFDOiByZXR1cm4oMTcwKTsgICAgIC8qIE5vdCBzeW1ib2wgKi8KKyAgICAgICAgICBjYXNlIDB4MDBCMDogcmV0dXJuKDI0OCk7ICAgICAvKiBEZWdyZWUgc3ltYm9sICovCisgICAgICAgICAgY2FzZSAweDAwQjE6IHJldHVybigyNDEpOyAgICAgLyogUGx1cyBvciBtaW51cyBzeW1ib2wgKi8KKyAgICAgICAgICBjYXNlIDB4MDBCMjogcmV0dXJuKDI1Myk7ICAgICAvKiBTdXBlcnNjcmlwdCAyICovCisgICAgICAgICAgY2FzZSAweDAwQjM6IHJldHVybig1MSk7ICAgICAgLyogU3VwZXJzY3JpcHQgMyAqLworICAgICAgICAgIGNhc2UgMHgwMEI2OiByZXR1cm4oMTQpOyAgICAgIC8qIFBpbGNyb3cgc3ltYm9sICovCisgICAgICAgICAgY2FzZSAweDAwQjc6IHJldHVybigyNTApOyAgICAgLyogQ2VudGVyIGRvdCwgc21hbGwgKi8KKyAgICAgICAgICBjYXNlIDB4MDBCOTogcmV0dXJuKDQ5KTsgICAgICAvKiBTdXBlcnNjcmlwdCAxICovCisgICAgICAgICAgY2FzZSAweDAwRDA6IHJldHVybig2OCk7ICAgICAgLyogRXRoIC0+IEQgKi8KKyAgICAgICAgICBjYXNlIDB4MDBENzogcmV0dXJuKDEyMCk7ICAgICAvKiBNdWx0aXBsaWNhdGlvbiBzeW1ib2wgKi8KKyAgICAgICAgICBjYXNlIDB4MDBERTogcmV0dXJuKDg0KTsgICAgICAvKiBUaG9ybiAtPiBUICovCisgICAgICAgICAgY2FzZSAweDAwRjA6IHJldHVybigxMDApOyAgICAgLyogZXRoIC0+IGV0aCAqLworICAgICAgICAgIGNhc2UgMHgwMEY3OiByZXR1cm4oMjQ2KTsgICAgIC8qIERpdmlzaW9uIHN5bWJvbCAqLworICAgICAgICAgIGNhc2UgMHgwMEZFOiByZXR1cm4oMTE2KTsgICAgIC8qIHRob3JuIC0+IHQgKi8KKyAgICAgICAgICBkZWZhdWx0OiByZXR1cm4oMHgxMyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMgPj0gMHgwMTAwICYmIGMgPD0gMHgwMmZmKSB7IC8qIExhdGluLTIgZXRjICovCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgIGNhc2UgMHgwMTAzOiByZXR1cm4oOTcpOyAgICAgIC8qIGEgYnJldmUgKi8KKyAgICAgICAgICBjYXNlIDB4MDEwNTogcmV0dXJuKDk3KTsgICAgICAvKiBhIG9nb25layAqLworICAgICAgICAgIGNhc2UgMHgwMTA3OiAgICAgICAgICAgICAgICAgIC8qIGMgYWN1dGUgKi8KKyAgICAgICAgICBjYXNlIDB4MDEwZDogcmV0dXJuKDk5KTsgICAgICAvKiBjIGNhcm9uICovCisgICAgICAgICAgY2FzZSAweDAxMGY6ICAgICAgICAgICAgICAgICAgLyogZCBjYXJvbiAqLworICAgICAgICAgIGNhc2UgMHgwMTExOiByZXR1cm4oMTAwKTsgICAgIC8qIGQgd2l0aCBzdHJva2UgKi8KKyAgICAgICAgICBjYXNlIDB4MDExOTogICAgICAgICAgICAgICAgICAvKiBlIG9nb25layAqLworICAgICAgICAgIGNhc2UgMHgwMTFiOiByZXR1cm4oMTAxKTsgICAgIC8qIGUgY2Fyb24gKi8KKyAgICAgICAgICBjYXNlIDB4MDExZjogcmV0dXJuKDEwMyk7ICAgICAvKiBnIGJyZXZlICovCisgICAgICAgICAgY2FzZSAweDAxMzA6IHJldHVybig3Myk7ICAgICAgLyogQ2FwaXRhbCBJIHdpdGggRG90ICovCisgICAgICAgICAgY2FzZSAweDAxMzE6IHJldHVybigxMDUpOyAgICAgLyogRG90bGVzcyBpICovCisgICAgICAgICAgY2FzZSAweDAxMzI6IHJldHVybig4OSk7ICAgICAgLyogSUogPT4gWSAqLworICAgICAgICAgIGNhc2UgMHgwMTMzOiByZXR1cm4oMTUyKTsgICAgIC8qIGlqIC0+IHkgZGlhZXJlc2lzICovCisgICAgICAgICAgY2FzZSAweDAxM2E6ICAgICAgICAgICAgICAgICAgLyogbCBhY3V0ZSAqLworICAgICAgICAgIGNhc2UgMHgwMTNlOiAgICAgICAgICAgICAgICAgIC8qIGwgY2Fyb24gKi8KKyAgICAgICAgICBjYXNlIDB4MDE0MjogcmV0dXJuKDEwOCk7ICAgICAvKiBsIHdpdGggc3Ryb2tlICovCisgICAgICAgICAgY2FzZSAweDAxNDQ6ICAgICAgICAgICAgICAgICAgLyogbiBhY3V0ZSAqLworICAgICAgICAgIGNhc2UgMHgwMTQ4OiByZXR1cm4oMTEwKTsgICAgIC8qIG4gY2Fyb24gKi8KKyAgICAgICAgICBjYXNlIDB4MDE1MTogcmV0dXJuKDExMSk7ICAgICAvKiBvIGRvdWJsZSBhY3V0ZSAqLworICAgICAgICAgIGNhc2UgMHgwMTUyOiByZXR1cm4oNzkpOyAgICAgIC8qIE9FICovCisgICAgICAgICAgY2FzZSAweDAxNTM6IHJldHVybigxMTEpOyAgICAgLyogb2UgKi8KKyAgICAgICAgICBjYXNlIDB4MDE1NTogICAgICAgICAgICAgICAgICAvKiByIGFjdXRlICovCisgICAgICAgICAgY2FzZSAweDAxNTk6IHJldHVybigxMTQpOyAgICAgLyogciBjYXJvbiAqLworICAgICAgICAgIGNhc2UgMHgwMTViOiAgICAgICAgICAgICAgICAgIC8qIHMgYWN1dGUgKi8KKyAgICAgICAgICBjYXNlIDB4MDE1ZjogICAgICAgICAgICAgICAgICAvKiBzIG9nb25layAqLworICAgICAgICAgIGNhc2UgMHgwMTYxOiByZXR1cm4oMTE1KTsgICAgIC8qIHMgY2Fyb24gKi8KKyAgICAgICAgICBjYXNlIDB4MDE2MzogICAgICAgICAgICAgICAgICAvKiB0IG9nb25layAqLworICAgICAgICAgIGNhc2UgMHgwMTY1OiAgICAgICAgICAgICAgICAgIC8qIHQgY2Fyb24gKi8KKyAgICAgICAgICBjYXNlIDB4MDE2NzogcmV0dXJuKDExNik7ICAgICAvKiB0IHdpdGggc3Ryb2tlICovCisgICAgICAgICAgY2FzZSAweDAxNmY6ICAgICAgICAgICAgICAgICAgLyogdSByaW5nICovCisgICAgICAgICAgY2FzZSAweDAxNzE6IHJldHVybigxMTcpOyAgICAgLyogdSBkb3VibGUgYWN1dGUgKi8KKyAgICAgICAgICBjYXNlIDB4MDE3YTogICAgICAgICAgICAgICAgICAvKiB6IGFjdXRlICovCisgICAgICAgICAgY2FzZSAweDAxN2M6ICAgICAgICAgICAgICAgICAgLyogeiBkb3QgYWJvdmUgKi8KKyAgICAgICAgICBjYXNlIDB4MDE3ZTogcmV0dXJuKDEyMik7ICAgICAvKiB6IGNhcm9uICovCisgICAgICAgICAgY2FzZSAweDAxOTI6IHJldHVybigxNTkpOyAgICAgLyogRnVuY3Rpb24tb2Ygc3ltYm9sLCBTY3JpcHQgZiAqLworICAgICAgICAgIGNhc2UgMHgwMWQwOiByZXR1cm4oMTA1KTsgICAgIC8qIGkgY2Fyb24gKi8KKyAgICAgICAgICBjYXNlIDB4MDJjNzogICAgICAgICAgICAgICAgICAvKiBjYXJvbiAtPiBVTksgKi8KKyAgICAgICAgICBjYXNlIDB4MDJkODogcmV0dXJuKDB4MTMpOyAgICAvKiBicmV2ZSAtPiBVTksgKi8KKyAgICAgICAgICBjYXNlIDB4MDJkZDogcmV0dXJuKDM0KTsgICAgICAvKiBEb3VibGUgYWN1dGUgLT4gRG91YmxlcXVvdGUgKi8KKyAgICAgICAgICBkZWZhdWx0OiByZXR1cm4oMHgxMyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMgPj0gMHgwMzAwICYmIGMgPD0gMHgwM2ZmKSB7IC8qIEdyZWVrICovCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgIGNhc2UgMHgwMzkzOiByZXR1cm4oMjI2KTsgICAgIC8qIFVwcGVyY2FzZSBHcmVlayBHYW1tYSAqLworICAgICAgICAgIGNhc2UgMHgwMzk4OiByZXR1cm4oMjMzKTsgICAgIC8qIFVwcGVyY2FzZSBHcmVlayBUaGV0YSAqLworICAgICAgICAgIGNhc2UgMHgwMzlCOiByZXR1cm4oMjM1KTsgICAgIC8qIFVwcGVyY2FzZSBHcmVlayBMYW1iZGEgKi8KKyAgICAgICAgICBjYXNlIDB4MDNBMDogcmV0dXJuKDIyNyk7ICAgICAvKiBVcHBlcmNhc2UgR3JlZWsgUGkgKi8KKyAgICAgICAgICBjYXNlIDB4MDNBMzogcmV0dXJuKDIyOCk7ICAgICAvKiBVcHBlcmNhc2UgR3JlZWsgU2lnbWEgKi8KKyAgICAgICAgICBjYXNlIDB4MDNBNDogcmV0dXJuKDB4RUEpOyAgICAvKiBPbWVnYSAqLworICAgICAgICAgIGNhc2UgMHgwM0E2OiByZXR1cm4oMjMyKTsgICAgIC8qIFVwcGVyY2FzZSBHcmVlayBQaGkgKi8KKyAgICAgICAgICBjYXNlIDB4MDNBOTogcmV0dXJuKDIzNCk7ICAgICAvKiBVcHBlcmNhc2UgR3JlZWsgT21lZ2EgKi8KKyAgICAgICAgICBjYXNlIDB4MDNCMTogcmV0dXJuKDB4RTApOyAgICAvKiBhbHBoYSAqLworICAgICAgICAgIGNhc2UgMHgwM0IyOiByZXR1cm4oMHhFMSk7ICAgIC8qIGJldGEgKi8KKyAgICAgICAgICBjYXNlIDB4MDNCMzogcmV0dXJuKDIyNik7ICAgICAvKiBMb3dlcmNhc2UgR3JlZWsgZ2FtbWEgKi8KKyAgICAgICAgICBjYXNlIDB4MDNCNDogcmV0dXJuKDB4RUIpOyAgICAvKiBkZWx0YSAqLworICAgICAgICAgIGNhc2UgMHgwM0I1OiByZXR1cm4oMjM4KTsgICAgIC8qIExvd2VyY2FzZSBHcmVlayBlcHNpbG9uICovCisgICAgICAgICAgY2FzZSAweDAzQjc6IHJldHVybigyMzgpOyAgICAgLyogTG93ZXJjYXNlIEdyZWVrIGV0YSAqLworICAgICAgICAgIGNhc2UgMHgwM0I4OiByZXR1cm4oMjMzKTsgICAgIC8qIExvd2VyY2FzZSBHcmVlayB0aGV0YSAqLworICAgICAgICAgIGNhc2UgMHgwM0I5OiByZXR1cm4oMTA1KTsgICAgIC8qIExvd2VyY2FzZSBHcmVlayBpb3RhICovCisgICAgICAgICAgY2FzZSAweDAzQkE6IHJldHVybigxMDcpOyAgICAgLyogTG93ZXJjYXNlIEdyZWVrIGthcHBhICovCisgICAgICAgICAgY2FzZSAweDAzQkI6IHJldHVybigyMzUpOyAgICAgLyogTG93ZXJjYXNlIEdyZWVrIGxhbWJkYSAqLworICAgICAgICAgIGNhc2UgMHgwM0JDOiByZXR1cm4oMjMwKTsgICAgIC8qIExvd2VyY2FzZSBHcmVlayBtdSAqLworICAgICAgICAgIGNhc2UgMHgwM0MwOiByZXR1cm4oMjI3KTsgICAgIC8qIExvd2VyY2FzZSBHcmVlayBwaSAqLworICAgICAgICAgIGNhc2UgMHgwM0MzOiByZXR1cm4oMjI5KTsgICAgIC8qIExvd2VyY2FzZSBHcmVlayBzaWdtYSAqLworICAgICAgICAgIGNhc2UgMHgwM0M0OiByZXR1cm4oMjMxKTsgICAgIC8qIExvd2VyY2FzZSBHcmVlayB0YXUgKi8KKyAgICAgICAgICBjYXNlIDB4MDNDNjogcmV0dXJuKDIzNyk7ICAgICAvKiBMb3dlcmNhc2UgR3JlZWsgcGhpICovCisgICAgICAgICAgY2FzZSAweDAzQzc6IHJldHVybigxMjApOyAgICAgLyogTG93ZXJjYXNlIEdyZWVrIGNoaSAqLworICAgICAgICAgIGNhc2UgMHgwM0M5OiByZXR1cm4oMjM0KTsgICAgIC8qIExvd2VyY2FzZSBHcmVlayBvbWVnYSAqLworICAgICAgICAgIGRlZmF1bHQ6IHJldHVybigweDEzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYyA+PSAweDIwMDAgJiYgYyA8PSAweDIwZmYpIHsgLyogU3ViK1N1cGVyc2NyaXB0cyAmIEN1cnJlbmN5ICovCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgIGNhc2UgMHgyMDNDOiByZXR1cm4oMHgxMyk7ICAgIC8qICEhICovCisgICAgICAgICAgY2FzZSAweDIwNzA6IHJldHVybig0OCk7ICAgICAgLyogU3VwZXJzY3JpcHQgMCAqLworICAgICAgICAgIGNhc2UgMHgyMDc0OiByZXR1cm4oNTIpOyAgICAgIC8qIFN1cGVyc2NyaXB0IDQgKi8KKyAgICAgICAgICBjYXNlIDB4MjA3NTogcmV0dXJuKDUzKTsgICAgICAvKiBTdXBlcnNjcmlwdCA1ICovCisgICAgICAgICAgY2FzZSAweDIwNzY6IHJldHVybig1NCk7ICAgICAgLyogU3VwZXJzY3JpcHQgNiAqLworICAgICAgICAgIGNhc2UgMHgyMDc3OiByZXR1cm4oNTUpOyAgICAgIC8qIFN1cGVyc2NyaXB0IDcgKi8KKyAgICAgICAgICBjYXNlIDB4MjA3ODogcmV0dXJuKDU2KTsgICAgICAvKiBTdXBlcnNjcmlwdCA4ICovCisgICAgICAgICAgY2FzZSAweDIwNzk6IHJldHVybig1Nyk7ICAgICAgLyogU3VwZXJzY3JpcHQgOSAqLworICAgICAgICAgIGNhc2UgMHgyMDdhOiByZXR1cm4oNDMpOyAgICAgIC8qIFN1cGVyc2NyaXB0ICsgKi8KKyAgICAgICAgICBjYXNlIDB4MjA3YjogcmV0dXJuKDQ1KTsgICAgICAvKiBTdXBlcnNjcmlwdCAtICovCisgICAgICAgICAgY2FzZSAweDIwN0Y6IHJldHVybigyNTIpOyAgICAgLyogU3VwZXJzY3JpcHQgbiAqLworICAgICAgICAgIGNhc2UgMHgyMDgwOiByZXR1cm4oNDgpOyAgICAgIC8qIFN1YnNjcmlwdCAwICovCisgICAgICAgICAgY2FzZSAweDIwODE6IHJldHVybig0OSk7ICAgICAgLyogU3Vic2NyaXB0IDEgKi8KKyAgICAgICAgICBjYXNlIDB4MjA4MjogcmV0dXJuKDUwKTsgICAgICAvKiBTdWJzY3JpcHQgMiAqLworICAgICAgICAgIGNhc2UgMHgyMDgzOiByZXR1cm4oNTEpOyAgICAgIC8qIFN1YnNjcmlwdCAzICovCisgICAgICAgICAgY2FzZSAweDIwODQ6IHJldHVybig1Mik7ICAgICAgLyogU3Vic2NyaXB0IDQgKi8KKyAgICAgICAgICBjYXNlIDB4MjA4NTogcmV0dXJuKDUzKTsgICAgICAvKiBTdWJzY3JpcHQgNSAqLworICAgICAgICAgIGNhc2UgMHgyMDg2OiByZXR1cm4oNTQpOyAgICAgIC8qIFN1YnNjcmlwdCA2ICovCisgICAgICAgICAgY2FzZSAweDIwODc6IHJldHVybig1NSk7ICAgICAgLyogU3Vic2NyaXB0IDcgKi8KKyAgICAgICAgICBjYXNlIDB4MjA4ODogcmV0dXJuKDU2KTsgICAgICAvKiBTdWJzY3JpcHQgOCAqLworICAgICAgICAgIGNhc2UgMHgyMDg5OiByZXR1cm4oNTcpOyAgICAgIC8qIFN1YnNjcmlwdCA5ICovCisgICAgICAgICAgY2FzZSAweDIwOGE6IHJldHVybig0Myk7ICAgICAgLyogU3Vic2NyaXB0ICsgKi8KKyAgICAgICAgICBjYXNlIDB4MjA4YjogcmV0dXJuKDQ1KTsgICAgICAvKiBTdWJzY3JpcHQgLSAqLworICAgICAgICAgIGNhc2UgMHgyMGE3OiByZXR1cm4oMHg5Myk7ICAgIC8qIFBlc2V0YSAqLworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB4ID0gdHhfcHVuYyhjKTsgICAgICAgICAgICAgLyogVmFyaW91cyBzcGFjZXMsIGRhc2hlcywgZXRjICovCisgICAgICAgICAgICByZXR1cm4oKHggPCAwKSA/IDB4MTMgOiB4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYyA+PSAweDIxMDAgJiYgYyA8PSAweDIxZmYpIHsgLyogQXJyb3dzICovCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgIGNhc2UgMHgyMTkwOiByZXR1cm4oMjcpOyAgICAgIC8qIEFycm93LCBsZWZ0LXBvaW50aW5nICovCisgICAgICAgICAgY2FzZSAweDIxOTE6IHJldHVybigyNCk7ICAgICAgLyogQXJyb3csIHVwLXBvaW50aW5nICovCisgICAgICAgICAgY2FzZSAweDIxOTI6IHJldHVybigyNik7ICAgICAgLyogQXJyb3csIHJpZ2h0LXBvaW50aW5nICovCisgICAgICAgICAgY2FzZSAweDIxOTM6IHJldHVybigyNSk7ICAgICAgLyogQXJyb3csIGRvd24tcG9pbnRpbmcgKi8KKyAgICAgICAgICBjYXNlIDB4MjE5NDogcmV0dXJuKDB4MWQpOyAgICAvKiBBcnJvdywgbGVmdC1yaWdodCAqLworICAgICAgICAgIGNhc2UgMHgyMTk1OiByZXR1cm4oMHgxMik7ICAgIC8qIEFycm93LCB1cC1kb3duICovCisgICAgICAgICAgY2FzZSAweDIxOUY6IHJldHVybigweDE4KTsgICAgLyogQXJyb3csIHVwLCBkb3VibGVoZWFkICovCisgICAgICAgICAgY2FzZSAweDIxQTE6IHJldHVybigweDE5KTsgICAgLyogQXJyb3csIGRvd24sIGRvdWJsZWhlYWQgKi8KKyAgICAgICAgICBjYXNlIDB4MjFBODogcmV0dXJuKDB4MTcpOyAgICAvKiBBcnJvdywgdXAtZG93biB3aXRoIGJhc2UgKi8KKyAgICAgICAgICBjYXNlIDB4MjFEMjogcmV0dXJuKDI2KTsgICAgICAvKiBJbXBsaWVzIHN5bWJvbCAqLworICAgICAgICAgIGNhc2UgMHgyMUQ0OiByZXR1cm4oMjkpOyAgICAgIC8qIElmIGFuZCBvbmx5IGlmIHN5bWJvbCAqLworICAgICAgICAgIGNhc2UgMHgyMUU0OiByZXR1cm4oMHgxQik7ICAgIC8qIEFycm93LCBsZWZ0LCB0byBiYXIgKi8KKyAgICAgICAgICBjYXNlIDB4MjFFNTogcmV0dXJuKDB4MUEpOyAgICAvKiBBcnJvdywgcmlnaHQsIHRvIGJhciAqLworICAgICAgICAgIGNhc2UgMHgyMUU4OiByZXR1cm4oMHgxMCk7ICAgIC8qIE91dGxpbmUgd2hpdGUgcmlnaHQgYXJyb3cgKi8KKyAgICAgICAgICBjYXNlIDB4MjFFOTogcmV0dXJuKDB4MGYpOyAgICAvKiBPdXRsaW5lIHdoaXRlIGRvd24gYXJyb3cgKi8KKyAgICAgICAgICBkZWZhdWx0OiByZXR1cm4oMHgxMyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMgPj0gMHgyMjAwICYmIGMgPD0gMHgyMmZmKSB7IC8qIE1hdGggKi8KKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgY2FzZSAweDIyMDI6IHJldHVybigyMzUpOyAgICAgLyogUGFydGlhbCBkaWZmZXJlbnRpYWwgc3ltYm9sICovCisgICAgICAgICAgY2FzZSAweDIyMDc6IHJldHVybigzMSk7ICAgICAgLyogTmFibGEsIExhcGxhY2Ugb3BlcmF0b3IgKi8KKyAgICAgICAgICBjYXNlIDB4MjIwODogcmV0dXJuKDB4MzMpOyAgICAvKiAoYmVjYXVzZSBvZiBRTlggbWlzdW5kZXJzdGFuZGluZykgKi8KKyAgICAgICAgICBjYXNlIDB4MjIxQTogcmV0dXJuKDI1MSk7ICAgICAvKiBSYWRpY2FsIHN5bWJvbCAqLworICAgICAgICAgIGNhc2UgMHgyMjFEOiByZXR1cm4oMjM2KTsgICAgIC8qIFByb3BvcnRpb25hbC10byAqLworICAgICAgICAgIGNhc2UgMHgyMjFFOiByZXR1cm4oMjM2KTsgICAgIC8qIEluZmluaXR5IHN5bWJvbCAqLworICAgICAgICAgIGNhc2UgMHgyMjI3OiByZXR1cm4oMzApOyAgICAgIC8qIExvZ2ljYWwgQU5EICovCisgICAgICAgICAgY2FzZSAweDIyMjg6IHJldHVybigzMSk7ICAgICAgLyogTG9naWNhbCBPUiAqLworICAgICAgICAgIGNhc2UgMHgyMjI5OiByZXR1cm4oMjM5KTsgICAgIC8qIEludGVyc2VjdGlvbiBzeW1ib2wgKi8KKyAgICAgICAgICBjYXNlIDB4MjIyQTogcmV0dXJuKDg1KTsgICAgICAvKiBVbmlvbiBzeW1ib2wgKi8KKyAgICAgICAgICBjYXNlIDB4MjIyQjogcmV0dXJuKDI0NCk7ICAgICAvKiBJbnRlZ3JhbCBzeW1ib2wgKi8KKyAgICAgICAgICBjYXNlIDB4MjIzNDogcmV0dXJuKDI1NCk7ICAgICAvKiBUaGVyZWZvcmUgc3ltYm9sICovCisgICAgICAgICAgY2FzZSAweDIyM0M6IHJldHVybigxMjYpOyAgICAgLyogQ2VudGVyZWQgdGlsZGUgb3BlcmF0b3IgKi8KKyAgICAgICAgICBjYXNlIDB4MjI0MzogcmV0dXJuKDI0Nyk7ICAgICAvKiBBc3ltcHRvdGljYWxseSBlcXVhbHMgKi8KKyAgICAgICAgICBjYXNlIDB4MjI0ODogcmV0dXJuKDI0Nyk7ICAgICAvKiBBbG1vc3QgZXF1YWwgdG8gc3ltYm9sICovCisgICAgICAgICAgY2FzZSAweDIyNjA6IHJldHVybig4OCk7ICAgICAgLyogTm90IGVxdWFsIHN5bWJvbCAqLworICAgICAgICAgIGNhc2UgMHgyMjYxOiByZXR1cm4oMjQwKTsgICAgIC8qIElkZW50aXR5IHN5bWJvbCAqLworICAgICAgICAgIGNhc2UgMHgyMjY0OiByZXR1cm4oMjQzKTsgICAgIC8qIExlc3MgdGhhbiBvciBlcXVhbCBzeW1ib2wgKi8KKyAgICAgICAgICBjYXNlIDB4MjI2NTogcmV0dXJuKDI0Mik7ICAgICAvKiBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgc3ltYm9sICovCisgICAgICAgICAgY2FzZSAweDIyODI6IHJldHVybig0MCk7ICAgICAgLyogU3Vic2V0IHN5bWJvbCAqLworICAgICAgICAgIGNhc2UgMHgyMjgzOiByZXR1cm4oNDEpOyAgICAgIC8qIFN1cGVyc2V0IHN5bWJvbCAqLworICAgICAgICAgIGNhc2UgMHgyMkE2OiByZXR1cm4oMHhDMyk7ICAgIC8qIEFzc2VydGlvbiBzeW1ib2wgKi8KKyAgICAgICAgICBkZWZhdWx0OiByZXR1cm4oMHgxMyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMgPj0gMHgyM0JBICYmIGMgPD0gMHgyM0JEICkgeworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAweDIzQkE6IHJldHVybigweDI1MDApOyAgICAgIC8qIEggbGluZSAtIFNjYW4gMSAqLworICAgICAgICBjYXNlIDB4MjNCQjogcmV0dXJuKDB4MjUwMCk7ICAgICAgLyogSCBsaW5lIC0gU2NhbiAzICovCisgICAgICAgIGNhc2UgMHgyM0JDOiByZXR1cm4oMHgyNTAwKTsgICAgICAvKiBIIGxpbmUgLSBTY2FuIDcgKi8KKyAgICAgICAgY2FzZSAweDIzQkQ6IHJldHVybigweDI1MDApOyAgICAgIC8qIEggbGluZSAtIFNjYW4gOSAqLworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjID49IDB4MjMwMCAmJiBjIDw9IDB4MjRmZikgeyAvKiBUZWNoICovCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgIGNhc2UgMHgyMzA4OiByZXR1cm4oMHhEQSk7ICAgIC8qIExlZnQgY2VpbGluZyAqLworICAgICAgICAgIGNhc2UgMHgyMzA5OiByZXR1cm4oMHhCRik7ICAgIC8qIFJpZ2h0IGNlaWxpbmcgKi8KKyAgICAgICAgICBjYXNlIDB4MjMwQTogcmV0dXJuKDB4QzApOyAgICAvKiBMZWZ0IGZsb29yICovCisgICAgICAgICAgY2FzZSAweDIzMEI6IHJldHVybigweEQ5KTsgICAgLyogUmlnaHQgZmxvb3IgKi8KKyAgICAgICAgICBjYXNlIDB4MjMxOTogcmV0dXJuKDB4MUMpOyAgICAvKiBUdXJuZWQgTm90IHNpZ24gKi8KKyAgICAgICAgICBjYXNlIDB4MjMyMDogcmV0dXJuKDI0NCk7ICAgICAvKiBJbnRlZ3JhbCBzeW1ib2wgdG9wICovCisgICAgICAgICAgY2FzZSAweDIzMjE6IHJldHVybigyNDUpOyAgICAgLyogSW50ZWdyYWwgc3ltYm9sIGJvdCAqLworICAgICAgICAgIGNhc2UgMHgyMzI5OiByZXR1cm4oNjApOyAgICAgIC8qIEJSQSwgbGFyZ2UgbGVmdCBhbmdsZSBicmFja2V0ICovCisgICAgICAgICAgY2FzZSAweDIzMkE6IHJldHVybig2Mik7ICAgICAgLyogS0VULCBsYXJnZSByaWdodCBhbmdsZSBicmFja2V0ICovCisgICAgICAgICAgY2FzZSAweDI0MDk6IHJldHVybigyNik7ICAgICAgLyogIkhUIiBiZWNvbWVzIHJpZ2h0IGFycm93ICovCisgICAgICAgICAgY2FzZSAweDI0MEE6IHJldHVybigyNSk7ICAgICAgLyogIkxGIiBiZWNvbWVzIGRvd24gYXJyb3cgKi8KKyAgICAgICAgICBjYXNlIDB4MjQwQjogcmV0dXJuKDIzKTsgICAgICAvKiAiVlQiIGJlY29tZXMgdXAtZG93biBhcnJvdyAqLworICAgICAgICAgIGNhc2UgMHgyNDBDOiByZXR1cm4oMjQpOyAgICAgIC8qICJGRiIgYmVjb21lcyB1cCBhcnJvdyAqLworICAgICAgICAgIGNhc2UgMHgyNDBEOiByZXR1cm4oMjcpOyAgICAgIC8qICJDUiIgYmVjb21lcyBsZWZ0IGFycm93ICovCisgICAgICAgICAgY2FzZSAweDI0MjQ6IHJldHVybigzMSk7ICAgICAgLyogIk5MIiBiZWNvbWVzIGRvd24gdHJpYW5nbGUgKi8KKyAgICAgICAgICBkZWZhdWx0OiByZXR1cm4oMHgxMyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMgPj0gMHgyNTAwICYmIGMgPD0gMHgyNTUyKSB7IC8qIEJveCBkcmF3aW5nICovCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgIGNhc2UgMHgyNTAwOiByZXR1cm4oMTk2KTsgICAgIC8qIENlbnRlciBib3ggYmFyIGhvcml6b250YWwgKi8KKyAgICAgICAgICBjYXNlIDB4MjUwMTogcmV0dXJuKDB4Q0QpOyAgICAvKiBCb2xkIC0+IERvdWJsZSAqLworICAgICAgICAgIGNhc2UgMHgyNTAyOiByZXR1cm4oMTc5KTsgICAgIC8qIENlbnRlciBib3ggYmFyIHZlcnRpY2FsICovCisgICAgICAgICAgY2FzZSAweDI1MDM6IHJldHVybigweEJBKTsgICAgLyogQm9sZCAqLworICAgICAgICAgIGNhc2UgMHgyNTA0OiByZXR1cm4oNDUpOyAgICAgIC8qIERhc2hlZCBsaW5lICovCisgICAgICAgICAgY2FzZSAweDI1MDY6IHJldHVybigxMjQpOyAgICAgLyogQnJva2VuIHZlcnRpY2FsIGJhciAqLworICAgICAgICAgIGNhc2UgMHgyNTBDOiByZXR1cm4oMjE4KTsgICAgIC8qIFVMIGJveCBjb3JuZXIgKi8KKyAgICAgICAgICBjYXNlIDB4MjUwRjogcmV0dXJuKDB4QzkpOyAgICAvKiBCb2xkICovCisgICAgICAgICAgY2FzZSAweDI1MTA6IHJldHVybigxOTEpOyAgICAgLyogVVIgQm94IENvcm5lciAqLworICAgICAgICAgIGNhc2UgMHgyNTEzOiByZXR1cm4oMHhCQik7ICAgIC8qIEJvbGQgKi8KKyAgICAgICAgICBjYXNlIDB4MjUxNDogcmV0dXJuKDE5Mik7ICAgICAvKiBMTCBib3ggY29ybmVyICovCisgICAgICAgICAgY2FzZSAweDI1MTc6IHJldHVybigweEM4KTsgICAgLyogQm9sZCAqLworICAgICAgICAgIGNhc2UgMHgyNTE4OiByZXR1cm4oMjE3KTsgICAgIC8qIExSIGJveCBjb3JuZXIgKi8KKyAgICAgICAgICBjYXNlIDB4MjUxQjogcmV0dXJuKDB4QkMpOyAgICAvKiBCb2xkICovCisgICAgICAgICAgY2FzZSAweDI1MUM6IHJldHVybigxOTUpOyAgICAgLyogTGVmdCBtaWRkbGUgYm94IHNpZGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjUyMDogcmV0dXJuKDB4QzMpOworICAgICAgICAgIGNhc2UgMHgyNTIzOiByZXR1cm4oMHhDQyk7ICAgIC8qIEJvbGQgKi8KKyAgICAgICAgICBjYXNlIDB4MjUyNDogcmV0dXJuKDE4MCk7ICAgICAvKiBSaWdodCBtaWRkbGUgYm94IHNpZGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjUyODogcmV0dXJuKDE4MCk7CisgICAgICAgICAgY2FzZSAweDI1MkI6IHJldHVybigweEI5KTsgICAgLyogQm9sZCAqLworICAgICAgICAgIGNhc2UgMHgyNTJDOiByZXR1cm4oMTk0KTsgICAgIC8qIE1pZGRsZSBib3ggdG9wICovCisgICAgICAgICAgY2FzZSAweDI1MkY6IHJldHVybigxOTQpOworICAgICAgICAgIGNhc2UgMHgyNTMzOiByZXR1cm4oMHhDQik7ICAgIC8qIEJvbGQgKi8KKyAgICAgICAgICBjYXNlIDB4MjUzNDogcmV0dXJuKDE5Myk7ICAgICAvKiBNaWRkbGUgYm94IGJvdCAqLworICAgICAgICAgIGNhc2UgMHgyNTM3OiByZXR1cm4oMTkzKTsKKyAgICAgICAgICBjYXNlIDB4MjUzQjogcmV0dXJuKDB4Q0EpOyAgICAvKiBCb2xkICovCisgICAgICAgICAgY2FzZSAweDI1M0M6IHJldHVybigxOTcpOyAgICAgLyogQm94IGludGVyc2VjdGlvbiAqLworICAgICAgICAgIGNhc2UgMHgyNTNGOiByZXR1cm4oMTk3KTsKKyAgICAgICAgICBjYXNlIDB4MjU0MjogcmV0dXJuKDE5Nyk7CisgICAgICAgICAgY2FzZSAweDI1NDc6IHJldHVybigxOTcpOworICAgICAgICAgIGNhc2UgMHgyNTQ4OiByZXR1cm4oMTk3KTsKKyAgICAgICAgICBjYXNlIDB4MjU0OTogcmV0dXJuKDE5Nyk7CisgICAgICAgICAgY2FzZSAweDI1NEE6IHJldHVybigxOTcpOworICAgICAgICAgIGNhc2UgMHgyNTRCOiByZXR1cm4oMHhDRSk7ICAgIC8qIEJvbGQgKi8KKyAgICAgICAgICBjYXNlIDB4MjU1MDogcmV0dXJuKDIwNSk7ICAgICAvKiBDZW50ZXIgYm94IGJhciBob3Jpem9udGFsIGRvdWJsZSAqLworICAgICAgICAgIGNhc2UgMHgyNTUxOiByZXR1cm4oMTg2KTsgICAgIC8qIENlbnRlciBib3ggYmFyIHZlcnRpY2FsIGRvdWJsZSAqLworICAgICAgICAgIGNhc2UgMHgyNTUyOiByZXR1cm4oMjEzKTsgICAgIC8qIFVMIGJveCBjb3JuZXIgc2luZ2xlIHRvIGRvdWJsZSAqLworICAgICAgICAgIGRlZmF1bHQ6IHJldHVybigweDEzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYyA+PSAweDI1NTMgJiYgYyA8PSAweDI1NzkpIHsgLyogTW9yZSBib3ggZHJhd2luZyAqLworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICBjYXNlIDB4MjU1MzogcmV0dXJuKDIxNCk7ICAgICAvKiBVTCBib3ggY29ybmVyIGRvdWJsZSB0byBzaW5nbGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjU1NDogcmV0dXJuKDIwMSk7ICAgICAvKiBVTCBib3ggY29ybmVyIGRvdWJsZSAqLworICAgICAgICAgIGNhc2UgMHgyNTU1OiByZXR1cm4oMTg0KTsgICAgIC8qIFVSIGJveCBjb3JuZXIgZG91YmxlIHRvIHNpbmdsZSAqLworICAgICAgICAgIGNhc2UgMHgyNTU2OiByZXR1cm4oMTgzKTsgICAgIC8qIFVSIGJveCBjb3JuZXIgc2luZ2xlIHRvIGRvdWJsZSAqLworICAgICAgICAgIGNhc2UgMHgyNTU3OiByZXR1cm4oMTg3KTsgICAgIC8qIFVSIGJveCBjb3JuZXIgZG91YmxlICovCisgICAgICAgICAgY2FzZSAweDI1NTg6IHJldHVybigyMTIpOyAgICAgLyogTEwgYm94IGNvcm5lciBzaW5nbGUgdG8gZG91YmxlICovCisgICAgICAgICAgY2FzZSAweDI1NTk6IHJldHVybigyMTEpOyAgICAgLyogTEwgYm94IGNvcm5lciBkb3VibGUgdG8gc2luZ2xlICovCisgICAgICAgICAgY2FzZSAweDI1NUE6IHJldHVybigyMDApOyAgICAgLyogTEwgYm94IGNvcm5lciBkb3VibGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjU1QjogcmV0dXJuKDE5MCk7ICAgICAvKiBMUiBib3ggY29ybmVyIGRvdWJsZSB0byBzaW5nbGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjU1QzogcmV0dXJuKDE4OSk7ICAgICAvKiBMUiBib3ggY29ybmVyIHNpbmdsZSB0byBkb3VibGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjU1RDogcmV0dXJuKDE4OCk7ICAgICAvKiBMUiBib3ggY29ybmVyIGRvdWJsZSAqLworICAgICAgICAgIGNhc2UgMHgyNTVFOiByZXR1cm4oMTk4KTsgICAgIC8qIExlZnQgbWlkIGJveCBzaWRlIHNpbmdsZSB0byBkb3VibCAqLworICAgICAgICAgIGNhc2UgMHgyNTVGOiByZXR1cm4oMTk5KTsgICAgIC8qIExlZnQgbWlkIGJveCBzaWRlIGRvdWJsZSB0byBzaW5nbCAqLworICAgICAgICAgIGNhc2UgMHgyNTYwOiByZXR1cm4oMjA0KTsgICAgIC8qIExlZnQgbWlkZGxlIGJveCBzaWRlIGRvdWJsZSAqLworICAgICAgICAgIGNhc2UgMHgyNTYxOiByZXR1cm4oMTgxKTsgICAgIC8qIFJpZ2h0IGJveCBzaWRlIGRvdWJsZSB0byBzaW5nbGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjU2MjogcmV0dXJuKDE4Mik7ICAgICAvKiBSaWdodCBib3ggc2lkZSBzaW5nbGUgdG8gZG91YmxlICovCisgICAgICAgICAgY2FzZSAweDI1NjM6IHJldHVybigxODUpOyAgICAgLyogUmlnaHQgbWlkZGxlIGJveCBzaWRlIGRvdWJsZSAqLworICAgICAgICAgIGNhc2UgMHgyNTY0OiByZXR1cm4oMjA5KTsgICAgIC8qIE1pZGRsZSBib3ggdG9wIGRvdWJsZSB0byBzaW5nbGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjU2NTogcmV0dXJuKDIxMCk7ICAgICAvKiBNaWRkbGUgYm94IHRvcCBzaW5nbGUgdG8gZG91YmxlICovCisgICAgICAgICAgY2FzZSAweDI1NjY6IHJldHVybigyMDMpOyAgICAgLyogTWlkZGxlIGJveCB0b3AgZG91YmxlICovCisgICAgICAgICAgY2FzZSAweDI1Njc6IHJldHVybigyMDcpOyAgICAgLyogTWlkZGxlIGJveCBib3Qgc2luZ2xlIHRvIGRvdWJsZSAqLworICAgICAgICAgIGNhc2UgMHgyNTY4OiByZXR1cm4oMjA4KTsgICAgIC8qIE1pZGRsZSBib3ggYm90IGRvdWJsZSB0byBzaW5nbGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjU2OTogcmV0dXJuKDIwMik7ICAgICAvKiBNaWRkbGUgYm94IGJvdCBkb3VibGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjU2QTogcmV0dXJuKDIxNik7ICAgICAvKiBCb3ggaW50ZXJzZWN0aW9uIGRvdWJsZSB0byBzaW5nbGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjU2QjogcmV0dXJuKDIxNSk7ICAgICAvKiBCb3ggaW50ZXJzZWN0aW9uIHNpbmdsZSB0byBkb3VibGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjU2QzogcmV0dXJuKDIwNik7ICAgICAvKiBCb3ggaW50ZXJzZWN0aW9uIGRvdWJsZSAqLworICAgICAgICAgIGNhc2UgMHgyNTZEOiByZXR1cm4oMjE4KTsgICAgIC8qIFVMIGFyYyAqLworICAgICAgICAgIGNhc2UgMHgyNTZFOiByZXR1cm4oMTkxKTsgICAgIC8qIFVSIGFyYyAqLworICAgICAgICAgIGNhc2UgMHgyNTZGOiByZXR1cm4oMjE3KTsgICAgIC8qIExSIGFyYyAqLworICAgICAgICAgIGNhc2UgMHgyNTcwOiByZXR1cm4oMTkyKTsgICAgIC8qIExMIGFyYyAqLworICAgICAgICAgIGNhc2UgMHgyNTcxOiByZXR1cm4oMTc5KTsgICAgIC8qIERpYWdvbmFsIGxpbmUgTEwgdG8gVVIgKi8KKyAgICAgICAgICBjYXNlIDB4MjU3MjogcmV0dXJuKDE5Nik7ICAgICAvKiBEaWFnb25hbCBsaW5lIFVMIHRvIExSICovCisgICAgICAgICAgY2FzZSAweDI1NzM6IHJldHVybig4OCk7ICAgICAgLyogRGlhZ29uYWwgbGluZXMgY3Jvc3NlZCAqLworICAgICAgICAgIGNhc2UgMHgyNTc1OiByZXR1cm4oMHhiMyk7ICAgIC8qIEhpZ2ggdmVydGljYWwgbGluZSAqLworICAgICAgICAgIGNhc2UgMHgyNTc2OiByZXR1cm4oNDUpOyAgICAgIC8qIFNob3J0IGhvcml6b250YWwgbGluZSAqLworICAgICAgICAgIGNhc2UgMHgyNTc3OiByZXR1cm4oMHhiMyk7ICAgIC8qIExvdyB2ZXJ0aWNhbCBsaW5lICovCisgICAgICAgICAgY2FzZSAweDI1Nzk6IHJldHVybigweGIzKTsgICAgLyogSGlnaCB2ZXJ0aWNhbCBsaW5lIGJvbGQgKi8KKyAgICAgICAgICBkZWZhdWx0OiByZXR1cm4oMHgxMyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMgPj0gMHgyNTdhICYmIGMgPD0gMHgyNWZmKSB7IC8qIFN0aWxsIG1vcmUgYm94IGRyYXdpbmcgKi8KKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgY2FzZSAweDI1N2I6IHJldHVybigweGIzKTsgICAgLyogTG93IHZlcnRpY2FsIGxpbmUgYm9sZCAqLworICAgICAgICAgIGNhc2UgMHgyNTgwOiByZXR1cm4oMjIzKTsgICAgIC8qIFF1YWRyYW50IFVMIGFuZCBVUiAodG9wIGhhbGYpICovCisgICAgICAgICAgY2FzZSAweDI1ODE6IHJldHVybigweGM0KTsgICAgLyogU2NhbiBsaW5lIDkgKi8KKyAgICAgICAgICBjYXNlIDB4MjU4MjogcmV0dXJuKDB4REMpOyAgICAvKiBCbGFjayBibG9iIGxvd2VyIGhhbGYgKi8KKyAgICAgICAgICBjYXNlIDB4MjU4NDogcmV0dXJuKDIyMCk7ICAgICAvKiBRdWFkcmFudCBMTCBhbmQgTFIgKGxvd2VyIGhhbGYpICovCisgICAgICAgICAgY2FzZSAweDI1ODg6IHJldHVybigyMTkpOyAgICAgLyogRmlsbCBjaGFyYWN0ZXIgZGFyayAqLworICAgICAgICAgIGNhc2UgMHgyNThDOiByZXR1cm4oMjIxKTsgICAgIC8qIFF1YWRyYW50IFVMIGFuZCBMTCAobGVmdCBoYWxmKSAqLworICAgICAgICAgIGNhc2UgMHgyNThFOiByZXR1cm4oMHhERCk7CisgICAgICAgICAgY2FzZSAweDI1OTA6IHJldHVybigyMjIpOyAgICAgLyogUXVhZHJhbnQgVVIgYW5kIExSIChyaWdodCBoYWxmKSAqLworICAgICAgICAgIGNhc2UgMHgyNTkxOiByZXR1cm4oMTc2KTsgICAgIC8qIEZpbGwgY2hhcmFjdGVyIGxpZ2h0ICovCisgICAgICAgICAgY2FzZSAweDI1OTI6IHJldHVybigxNzcpOyAgICAgLyogRmlsbCBjaGFyYWN0ZXIgbWVkaXVtICovCisgICAgICAgICAgY2FzZSAweDI1OTM6IHJldHVybigxNzgpOyAgICAgLyogRmlsbCBjaGFyYWN0ZXIgaGVhdnkgKi8KKyAgICAgICAgICBjYXNlIDB4MjU5NDogcmV0dXJuKDB4YzQpOyAgICAvKiBTY2FuIGxpbmUgMSAqLworICAgICAgICAgIGNhc2UgMHgyNUEwOiByZXR1cm4oMjU0KTsgICAgIC8qIFNvbGlkIHNxdWFyZSwgY2VudGVyICovCisgICAgICAgICAgY2FzZSAweDI1QTY6IHJldHVybigxNzcpOyAgICAgLyogQmxvdGNoICovCisgICAgICAgICAgY2FzZSAweDI1QUM6ICAgICAgICAgICAgICAgICAgLyogQmxhY2sgcmVjdGFuZ2xlICovCisgICAgICAgICAgY2FzZSAweDI1QUY6IHJldHVybigweDE2KTsgICAgLyogV2hpdGUgcmVjdGFuZ2xlICovCisgICAgICAgICAgY2FzZSAweDI1QjI6ICAgICAgICAgICAgICAgICAgLyogVHJpYW5nbGUsIHVwLXBvaW50aW5nICovCisgICAgICAgICAgY2FzZSAweDI1QjQ6IHJldHVybigweDFlKTsgICAgLyogVHJpYW5nbGUsIHVwLXBvaW50aW5nICovCisgICAgICAgICAgY2FzZSAweDI1QjY6ICAgICAgICAgICAgICAgICAgLyogVHJpYW5nbGUsIHJpZ2h0LXBvaW50aW5nLCBkYXJrICovCisgICAgICAgICAgY2FzZSAweDI1Qjc6ICAgICAgICAgICAgICAgICAgLyogVHJpYW5nbGUsIHJpZ2h0LXBvaW50aW5nLCBsaWdodCAqLworICAgICAgICAgIGNhc2UgMHgyNUI5OiAgICAgICAgICAgICAgICAgIC8qIFRyaWFuZ2xlLCByaWdodC1wb2ludGluZywgbGlnaHQgKi8KKyAgICAgICAgICBjYXNlIDB4MjVCQTogcmV0dXJuKDB4MTApOyAgICAvKiBUcmlhbmdsZSwgcmlnaHQtcG9pbnRpbmcsIG5hcnJvdyAqLworICAgICAgICAgIGNhc2UgMHgyNUJDOiAgICAgICAgICAgICAgICAgIC8qIFRyaWFuZ2xlLCBkb3duLXBvaW50aW5nICovCisgICAgICAgICAgY2FzZSAweDI1QkU6IHJldHVybigweDFmKTsgICAgLyogVHJpYW5nbGUsIGRvd24tcG9pbnRpbmcgKi8KKyAgICAgICAgICBjYXNlIDB4MjVDMDogICAgICAgICAgICAgICAgICAvKiBUcmlhbmdsZSwgbGVmdC1wb2ludGluZywgZGFyayAqLworICAgICAgICAgIGNhc2UgMHgyNUMxOiAgICAgICAgICAgICAgICAgIC8qIFRyaWFuZ2xlLCBsZWZ0LXBvaW50aW5nLCBkYXJrICovCisgICAgICAgICAgY2FzZSAweDI1QzQ6IHJldHVybigweDExKTsgICAgLyogVHJpYW5nbGUsIGxlZnQtcG9pbnRpbmcsIG5hcnJvdyAqLworICAgICAgICAgIGNhc2UgMHgyNUM2OiByZXR1cm4oNCk7ICAgICAgIC8qIERpYW1vbmQsIGNlbnRlciwgc29saWQgKi8KKyAgICAgICAgICBjYXNlIDB4MjVDQjogcmV0dXJuKDB4MDkpOyAgICAvKiBDaXJjbGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjVDRjogcmV0dXJuKDI0OSk7ICAgICAvKiBDZW50ZXIgZG90LCBsYXJnZSAqLworICAgICAgICAgIGNhc2UgMHgyNWQ4OiByZXR1cm4oMHgwOCk7ICAgIC8qIEludmVyc2UgYnVsbGV0ICovCisgICAgICAgICAgY2FzZSAweDI1ZDk6IHJldHVybigweDBhKTsgICAgLyogSW52ZXJzZSB3aGl0ZSBjaXJjbGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjVFMjogcmV0dXJuKDB4RDkpOyAgICAvKiBMb3dlciByaWdodCB0cmlhbmdsZSAqLworICAgICAgICAgIGNhc2UgMHgyNUUzOiByZXR1cm4oMHhDMCk7ICAgIC8qIExvd2VyIGxlZnQgdHJpYW5nbGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjVFNDogcmV0dXJuKDB4REEpOyAgICAvKiBVcHBlciBsZWZ0IHRyaWFuZ2xlICovCisgICAgICAgICAgY2FzZSAweDI1RTU6IHJldHVybigweEJmKTsgICAgLyogVXBwZXIgcmlnaHQgdHJpYW5nbGUgKi8KKyAgICAgICAgICBkZWZhdWx0OiByZXR1cm4oMHgxMyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMgPj0gMHgyNjAwKSB7ICAgICAgICAgICAvKiBBbGwgdGhlIHJlc3QgKi8KKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgY2FzZSAweDI2M2E6IHJldHVybigweDAxKTsgICAgLyogU21pbGV5ICovCisgICAgICAgICAgY2FzZSAweDI2M2I6IHJldHVybigweDAyKTsgICAgLyogSW52ZXJzZSBTbWlsZXkgKi8KKyAgICAgICAgICBjYXNlIDB4MjYzYzogcmV0dXJuKDB4MGYpOyAgICAvKiBXaGl0ZSBTdW4gd2l0aCBSYXlzICovCisgICAgICAgICAgY2FzZSAweDI2NDA6IHJldHVybigweDBjKTsgICAgLyogTWFsZSBzaWduICovCisgICAgICAgICAgY2FzZSAweDI2NDI6IHJldHVybigweDBiKTsgICAgLyogRmVtYWxlIHNpZ24gKi8KKyAgICAgICAgICBjYXNlIDB4MjY2MDogcmV0dXJuKDB4MDYpOyAgICAvKiBTcGFkZSAqLworICAgICAgICAgIGNhc2UgMHgyNjYzOiByZXR1cm4oMHgwNSk7ICAgIC8qIENsdWIgKi8KKyAgICAgICAgICBjYXNlIDB4MjY2NTogcmV0dXJuKDB4MDMpOyAgICAvKiBIZWFydCAqLworICAgICAgICAgIGNhc2UgMHgyNjY2OiByZXR1cm4oMHgwNCk7ICAgIC8qIERpYW1vbmQsIGNlbnRlciwgc29saWQgKi8KKyAgICAgICAgICBjYXNlIDB4MjY2YTogcmV0dXJuKDB4MGQpOyAgICAvKiBRdWFydGVyIG5vdGUgKi8KKyAgICAgICAgICBjYXNlIDB4MjY2YjogICAgICAgICAgICAgICAgICAvKiBCZWFtZWQgcXVhcnRlciBub3RlcyAqLworICAgICAgICAgIGNhc2UgMHgyNjZjOiByZXR1cm4oMHgwZSk7ICAgIC8qIEJlYW1lZCA4dGggbm90ZXMgKi8KKyAgICAgICAgICBjYXNlIDB4Mjc5ZTogcmV0dXJuKDB4MWEpOyAgICAvKiBCb2xkIHJpZ2h0IGFycm93ICovCisgICAgICAgICAgY2FzZSAweDI3YTE6IHJldHVybigweDFhKTsgICAgLyogSGVhdnkgYmxhY2sgcmlnaHQgYXJyb3cuICovCisgICAgICAgICAgY2FzZSAweEUyMDA6IHJldHVybigxODApOyAgICAgLyogRXh0ZW5zaWJsZSBsZWZ0IGJyYWNlIG1pZGRsZSAqLworICAgICAgICAgIGNhc2UgMHhFMjAxOiByZXR1cm4oMTkyKTsgICAgIC8qIEV4dGVuc2libGUgTGVmdCBwYXJlbnRoZXNpcyBib3QgKi8KKyAgICAgICAgICBjYXNlIDB4RTIwMjogcmV0dXJuKDIxOCk7ICAgICAvKiBFeHRlbnNpYmxlIGxlZnQgcGFyZW50aGVzaXMgdG9wICovCisgICAgICAgICAgY2FzZSAweEUyMDM6IHJldHVybigxOTIpOyAgICAgLyogRXh0ZW5zaWJsZSBsZWZ0IFNCIGJvdCAqLworICAgICAgICAgIGNhc2UgMHhFMjA0OiByZXR1cm4oMjE4KTsgICAgIC8qIEV4dGVuc2libGUgbGVmdCBTQiB0b3AgKi8KKyAgICAgICAgICBjYXNlIDB4RTIwNTogcmV0dXJuKDE5NSk7ICAgICAvKiBFeHRlbnNpYmxlIHJpZ2h0IGJyYWNlIG1pZGRsZSAqLworICAgICAgICAgIGNhc2UgMHhFMjA2OiByZXR1cm4oMjE3KTsgICAgIC8qIEV4dGVuc2libGUgcmlnaHQgcGFyZW50aGVzaXMgYm90ICovCisgICAgICAgICAgY2FzZSAweEUyMDc6IHJldHVybigxOTEpOyAgICAgLyogRXh0ZW5zaWJsZSByaWdodCBwYXJlbnRoZXNpcyB0b3AgKi8KKyAgICAgICAgICBjYXNlIDB4RTIwODogcmV0dXJuKDIxNyk7ICAgICAvKiBFeHRlbnNpYmxlIHJpZ2h0IFNCIGJvdCAqLworICAgICAgICAgIGNhc2UgMHhFMjA5OiByZXR1cm4oMTkxKTsgICAgIC8qIEV4dGVuc2libGUgcmlnaHQgU0IgdG9wICovCisgICAgICAgICAgY2FzZSAweEUyMEM6IHJldHVybigyMjgpOyAgICAgLyogU3VtbWF0aW9uIHN5bWJvbCBib3QgKi8KKyAgICAgICAgICBjYXNlIDB4RTIwRDogcmV0dXJuKDIyOCk7ICAgICAvKiBTdW1tYXRpb24gc3ltYm9sIHRvcCAqLworICAgICAgICAgIGNhc2UgMHhFMjBFOiByZXR1cm4oMTkxKTsgICAgIC8qIFJpZ2h0IGNlaWxpbmcgY29ybmVyICovCisgICAgICAgICAgY2FzZSAweEUyMEY6IHJldHVybigyMTcpOyAgICAgLyogUmlnaHQgZmxvb3IgY29ybmVyICovCisgICAgICAgICAgY2FzZSAweEUzMDA6IHJldHVybigxNzkpOyAgICAgLyogViBib3ggbGluZSwgZXh0ZW5zaWJsZSwgbGVmdCAqLworICAgICAgICAgIGNhc2UgMHhFMzA5OiByZXR1cm4oMTc5KTsgICAgIC8qIFYgYm94IGxpbmUsIGV4dGVuc2libGUsIHJpZ2h0ICovCisgICAgICAgICAgY2FzZSAweEUzMEE6IHJldHVybigyMjEpOyAgICAgLyogRGlhZ29uYWwgZmlsbCwgZGFyaywgVUwgKi8KKyAgICAgICAgICBjYXNlIDB4RTMwQjogcmV0dXJuKDIyMik7ICAgICAvKiBEaWFnb25hbCBmaWxsLCBkYXJrLCBVUiAqLworICAgICAgICAgIGNhc2UgMHhFMzIwOiByZXR1cm4oMjIxKTsgICAgIC8qIFF1YWRyYW50IExMICovCisgICAgICAgICAgY2FzZSAweEUzMjE6IHJldHVybigyMjIpOyAgICAgLyogUXVhZHJhbnQgTFIgKi8KKyAgICAgICAgICBjYXNlIDB4RTMyMjogcmV0dXJuKDIyMSk7ICAgICAvKiBRdWFkcmFudCBVTCAqLworICAgICAgICAgIGNhc2UgMHhFMzIzOiByZXR1cm4oMjE5KTsgICAgIC8qIFF1YWRyYW50IFVMIGFuZCBMTCBhbmQgTFIgKi8KKyAgICAgICAgICBjYXNlIDB4RTMyNDogcmV0dXJuKDIxOSk7ICAgICAvKiBRdWFkcmFudCBVTCBhbmQgTFIgKi8KKyAgICAgICAgICBjYXNlIDB4RTMyNTogcmV0dXJuKDIxOSk7ICAgICAvKiBRdWFkcmFudCBVTCBhbmQgTFIgKi8KKyAgICAgICAgICBjYXNlIDB4RTMyNjogcmV0dXJuKDIxOSk7ICAgICAvKiBRdWFkcmFudCBVTCBhbmQgVVIgYW5kIExMICovCisgICAgICAgICAgY2FzZSAweEUzMjc6IHJldHVybigyMTkpOyAgICAgLyogUXVhZHJhbnQgVUwgYW5kIFVSIGFuZCBMUiAqLworICAgICAgICAgIGNhc2UgMHhFMzI4OiByZXR1cm4oMjIyKTsgICAgIC8qIFF1YWRyYW50IFVSICovCisgICAgICAgICAgY2FzZSAweEUzMjk6IHJldHVybigyMTkpOyAgICAgLyogUXVhZHJhbnQgVVIgYW5kIExMIGFuZCBMUiAqLworICAgICAgICAgIGNhc2UgMHhFNDAwOiByZXR1cm4oMjUxKTsgICAgIC8qIFJhZGljYWwgc3ltYm9sLCBzbWFsbCAqLworICAgICAgICAgIGNhc2UgMHhFNDAxOiByZXR1cm4oMTY4KTsgICAgIC8qIFJldmVyc2UgcXVlc3Rpb24gbWFyayAqLworICAgICAgICAgIGNhc2UgMHhGRkZEOiByZXR1cm4oMHgxMyk7ICAgIC8qICEhIGZvciB1bmtub3duICovCisgICAgICAgICAgZGVmYXVsdDogcmV0dXJuKDB4MTMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybigweDEzKTsKK30KKworI2lmZGVmIE9TMgorLyoKKyAgTHVjaWRhIENvbnNvbGUgaXMgYSBVbmljb2RlIGZvbnQsIGJ1dCBpdCBpcyB2ZXJ5IHNwYXJzZWx5IHBvcHVsYXRlZC4KKyAgU2luY2UgaXQgaXMgdGhlIG9ubHkgbW9ub3NwYWNlIFVuaWNvZGUgZm9udCBtb3N0IHBlb3BsZSBoYXZlLCB3ZSBoYXZlCisgIHRvIG1ha2UgcmVhc29uYWJsZSBzdWJzdGl0dXRpb25zIG9yIGVsc2UgMy80IG9mIHRoZSBnbHlwaHMgd2lsbCBzaG93CisgIHVwIGFzIGJsb2JzIG9uIHRoZSBzY3JlZW4uCisqLworVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuaWNvZGUgdG8gTHVjaWRhIENvbnNvbGUgKi8KKyNpZmRlZiBDS19BTlNJQwordHhfbHVjaWRhc3ViKFVTSE9SVCBjKQorI2Vsc2UKK3R4X2x1Y2lkYXN1YihjKSBVU0hPUlQgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGlmIChjIDwgMHgwMTgwKSAgICAgICAgICAgICAgICAgICAgIC8qIExhdGluLTEgYW5kIEV4dGVuZGVkIEEgKi8KKyAgICAgIHJldHVybihjKTsKKworLyogRm9yIGVmZmljaWVuY3kgd2UgdHJ5IHRvIGFycmFuZ2UgdGhlIHNlY3Rpb25zIGJ5IGZyZXF1ZW5jeSBvZiB1c2UuICovCisgICAgaWYgKGMgPj0gMHgyM0JBICYmIGMgPD0gMHgyM0JEKSB7CisgICAgICAgIHN3aXRjaChjKSB7CisgICAgICAgICAgY2FzZSAweDIzQkE6ICAgICAgICAgICAgICAgICAgICAvKiBIIGxpbmUgLSBTY2FuIDEgKi8KKyAgICAgICAgICBjYXNlIDB4MjNCQjogICAgICAgICAgICAgICAgICAgIC8qIEggbGluZSAtIFNjYW4gMyAqLworICAgICAgICAgIGNhc2UgMHgyM0JDOiAgICAgICAgICAgICAgICAgICAgLyogSCBsaW5lIC0gU2NhbiA3ICovCisgICAgICAgICAgY2FzZSAweDIzQkQ6ICAgICAgICAgICAgICAgICAgICAvKiBIIGxpbmUgLSBTY2FuIDkgKi8KKyAgICAgICAgICAgIHJldHVybigweDI1MDApOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjID49IDB4MjUwMCAmJiBjIDw9IDB4MjU3ZikgeyAgIC8qIEJveCBkcmF3aW5nICovCisgICAgICAgIGlmIChjID49IDB4MjU1MCAmJiBjIDw9IDB4MjU2YykKKyAgICAgICAgICByZXR1cm4oYyk7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgIC8qIFRoZW1zZWx2ZXMgKi8KKyAgICAgICAgY2FzZSAweDI1MDA6CisgICAgICAgIGNhc2UgMHgyNTAyOgorICAgICAgICBjYXNlIDB4MjUwYzoKKyAgICAgICAgY2FzZSAweDI1MTA6CisgICAgICAgIGNhc2UgMHgyNTE0OgorICAgICAgICBjYXNlIDB4MjUxODoKKyAgICAgICAgY2FzZSAweDI1MWM6CisgICAgICAgIGNhc2UgMHgyNTI0OgorICAgICAgICBjYXNlIDB4MjUyYzoKKyAgICAgICAgY2FzZSAweDI1MzQ6CisgICAgICAgIGNhc2UgMHgyNTNjOgorICAgICAgICAgICAgcmV0dXJuKGMpOworICAgICAgICAgIC8qIEhvcml6b250YWwgbGluZXMgKi8KKyAgICAgICAgY2FzZSAweDI1MDE6ICAgICAgICAgICAgICAgICAgICAvKiBCb2xkICovCisgICAgICAgICAgICByZXR1cm4oMHgyNTUwKTsgICAgICAgICAgICAgLyogVXNlIGRvdWJsZSAqLworICAgICAgICBjYXNlIDB4MjUwNDoKKyAgICAgICAgY2FzZSAweDI1MDU6CisgICAgICAgIGNhc2UgMHgyNTA4OgorICAgICAgICBjYXNlIDB4MjUwOToKKyAgICAgICAgY2FzZSAweDI1NGM6CisgICAgICAgIGNhc2UgMHgyNTRkOgorICAgICAgICBjYXNlIDB4MjU3YzoKKyAgICAgICAgY2FzZSAweDI1N2U6CisgICAgICAgICAgICByZXR1cm4oMHgyNTAwKTsKKyAgICAgICAgICAvKiBWZXJ0aWNhbCBsaW5lcyAqLworICAgICAgICBjYXNlIDB4MjUwMzogICAgICAgICAgICAgICAgICAgIC8qIEJvbGQgKi8KKyAgICAgICAgICAgIHJldHVybigweDI1NTEpOyAgICAgICAgICAgICAvKiBVc2UgZG91YmxlICovCisgICAgICAgIGNhc2UgMHgyNTA2OgorICAgICAgICBjYXNlIDB4MjUwNzoKKyAgICAgICAgY2FzZSAweDI1MGE6CisgICAgICAgIGNhc2UgMHgyNTBiOiAvKiBPdGhlciAqLworICAgICAgICBjYXNlIDB4MjU0ZToKKyAgICAgICAgY2FzZSAweDI1NGY6CisgICAgICAgIGNhc2UgMHgyNTdkOgorICAgICAgICBjYXNlIDB4MjU3ZjoKKyAgICAgICAgY2FzZSAweDI1NzU6CisgICAgICAgIGNhc2UgMHgyNTc3OgorICAgICAgICBjYXNlIDB4MjU3OToKKyAgICAgICAgY2FzZSAweDI1N2I6CisgICAgICAgICAgICByZXR1cm4oMHgyNTAyKTsKKyAgICAgICAgICAgIC8qIFVwcGVyIGxlZnQgYm94IGNvcm5lciAqLworICAgICAgICBjYXNlIDB4MjUwZjogICAgICAgICAgICAgICAgICAgIC8qIEJvbGQgKi8KKyAgICAgICAgICAgIHJldHVybigweDI1NTQpOyAgICAgICAgICAgICAvKiBVc2UgZG91YmxlICovCisgICAgICAgIGNhc2UgMHgyNTBkOiBjYXNlIDB4MjUwZTogICAgICAgLyogT3RoZXIgKi8KKyAgICAgICAgICAgIHJldHVybigweDI1MGMpOworICAgICAgICAgIC8qIFVwcGVyIHJpZ2h0IGJveCBjb3JuZXIgKi8KKyAgICAgICAgY2FzZSAweDI1MTM6ICAgICAgICAgICAgICAgICAgICAvKiBCb2xkICovCisgICAgICAgICAgICByZXR1cm4oMHgyNTU3KTsKKyAgICAgICAgY2FzZSAweDI1MTE6CisgICAgICAgIGNhc2UgMHgyNTEyOiAgICAvKiBPdGhlciAqLworICAgICAgICAgICAgcmV0dXJuKDB4MjUxMCk7CisgICAgICAgICAgLyogTG93ZXIgbGVmdCBib3ggY29ybmVyICovCisgICAgICAgIGNhc2UgMHgyNTE3OiAgICAgICAgICAgICAgICAgICAgLyogQm9sZCAqLworICAgICAgICAgICAgcmV0dXJuKDB4MjU1YSk7CisgICAgICAgIGNhc2UgMHgyNTE1OgorICAgICAgICBjYXNlIDB4MjUxNjogICAgLyogT3RoZXIgKi8KKyAgICAgICAgICAgIHJldHVybigweDI1MTQpOworICAgICAgICAgIC8qIExvd2VyIHJpZ2h0IGJveCBjb3JuZXIgKi8KKyAgICAgICAgY2FzZSAweDI1MWI6ICAgICAgICAgICAgICAgICAgICAvKiBCb2xkICovCisgICAgICAgICAgICByZXR1cm4oMHgyNTVkKTsKKyAgICAgICAgY2FzZSAweDI1MTk6CisgICAgICAgIGNhc2UgMHgyNTFhOiAgICAvKiBPdGhlciAqLworICAgICAgICAgICAgcmV0dXJuKDB4MjUxOCk7CisgICAgICAgICAgLyogVmVydGljYWwgYW5kIHJpZ2h0ICovCisgICAgICAgIGNhc2UgMHgyNTIzOiAgICAgICAgICAgICAgICAgICAgLyogQm9sZCAqLworICAgICAgICAgICAgcmV0dXJuKDB4MjU2MCk7CisgICAgICAgIGNhc2UgMHgyNTFkOgorICAgICAgICBjYXNlIDB4MjUxZToKKyAgICAgICAgY2FzZSAweDI1MWY6CisgICAgICAgIGNhc2UgMHgyNTIwOgorICAgICAgICBjYXNlIDB4MjUyMToKKyAgICAgICAgY2FzZSAweDI1MjI6CisgICAgICAgICAgICByZXR1cm4oMHgyNTFjKTsKKyAgICAgICAgICAvKiBWZXJ0aWNhbCBhbmQgbGVmdCAqLworICAgICAgICBjYXNlIDB4MjUyYjogICAgICAgICAgICAgICAgICAgIC8qIEJvbGQgKi8KKyAgICAgICAgICAgIHJldHVybigweDI1NjMpOworICAgICAgICBjYXNlIDB4MjUyNToKKyAgICAgICAgY2FzZSAweDI1MjY6CisgICAgICAgIGNhc2UgMHgyNTI3OgorICAgICAgICBjYXNlIDB4MjUyODoKKyAgICAgICAgY2FzZSAweDI1Mjk6CisgICAgICAgIGNhc2UgMHgyNTJhOgorICAgICAgICAgICAgcmV0dXJuKDB4MjUyNCk7CisgICAgICAgICAgLyogSG9yaXpvbnRhbCBhbmQgZG93biAqLworICAgICAgICAgIGNhc2UgMHgyNTMzOiAgICAgICAgICAgICAgICAgIC8qIEJvbGQgKi8KKyAgICAgICAgICAgIHJldHVybigweDI1NjYpOworICAgICAgICBjYXNlIDB4MjUyZDoKKyAgICAgICAgY2FzZSAweDI1MmU6CisgICAgICAgIGNhc2UgMHgyNTJmOgorICAgICAgICBjYXNlIDB4MjUzMDoKKyAgICAgICAgY2FzZSAweDI1MzE6CisgICAgICAgIGNhc2UgMHgyNTMyOgorICAgICAgICAgICAgcmV0dXJuKDB4MjUyYyk7CisgICAgICAgICAgICAvKiBIb3Jpem9udGFsIGFuZCB1cCAqLworICAgICAgICBjYXNlIDB4MjUzYjogICAgICAgICAgICAgICAgICAgIC8qIEJvbGQgKi8KKyAgICAgICAgICAgIHJldHVybigweDI1NjkpOworICAgICAgICBjYXNlIDB4MjUzNTogY2FzZSAweDI1MzY6IGNhc2UgMHgyNTM3OgorICAgICAgICBjYXNlIDB4MjUzODogY2FzZSAweDI1Mzk6IGNhc2UgMHgyNTNhOgorICAgICAgICAgICAgcmV0dXJuKDB4MjUzNCk7CisgICAgICAgICAgLyogSG9yaXpvbnRhbCBhbmQgVmVydGljYWwgKi8KKyAgICAgICAgICBjYXNlIDB4MjU0YjogICAgICAgICAgICAgICAgICAvKiBCb2xkICovCisgICAgICAgICAgICByZXR1cm4oMHgyNTZjKTsKKyAgICAgICAgICBjYXNlIDB4MjUzZDogY2FzZSAweDI1M2U6IGNhc2UgMHgyNTNmOgorICAgICAgICBjYXNlIDB4MjU0MDogY2FzZSAweDI1NDE6IGNhc2UgMHgyNTQyOiBjYXNlIDB4MjU0MzoKKyAgICAgICAgY2FzZSAweDI1NDQ6IGNhc2UgMHgyNTQ1OiBjYXNlIDB4MjU0NjogY2FzZSAweDI1NDc6CisgICAgICAgIGNhc2UgMHgyNTQ4OiBjYXNlIDB4MjU0OTogY2FzZSAweDI1NGE6CisgICAgICAgICAgICByZXR1cm4oMHgyNTNjKTsKKyAgICAgICAgICAvKiBDdXJ2ZWQgY29ybmVycyAqLworICAgICAgICAgIGNhc2UgMHgyNTZkOiAgICAgICAgICAgICAgICAgIC8qIFVMICovCisgICAgICAgICAgICByZXR1cm4oMHgyNTBjKTsKKyAgICAgICAgICBjYXNlIDB4MjU2ZTogICAgICAgICAgICAgICAgICAvKiBVUiAqLworICAgICAgICAgICAgcmV0dXJuKDB4MjUxMCk7CisgICAgICAgICAgY2FzZSAweDI1NmY6ICAgICAgICAgICAgICAgICAgLyogTEwgKi8KKyAgICAgICAgICAgIHJldHVybigweDI1MTgpOworICAgICAgICAgIGNhc2UgMHgyNTcwOiAgICAgICAgICAgICAgICAgIC8qIExSICovCisgICAgICAgICAgICByZXR1cm4oMHgyNTE0KTsKKyAgICAgICAgICBjYXNlIDB4MjU3MTogICAgICAgICAgICAgICAgICAvKiBEaWFnb25hbCAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDAyZik7CisgICAgICAgICAgY2FzZSAweDI1NzI6ICAgICAgICAgICAgICAgICAgLyogT3RoZXIgZGlhZ29uYWwgKi8KKyAgICAgICAgICAgIHJldHVybigweDAwNWMpOworICAgICAgICAgIGNhc2UgMHgyNTczOiAgICAgICAgICAgICAgICAgIC8qIERpYWdvbmFsIGNyb3NzICovCisgICAgICAgICAgICByZXR1cm4oMHgwMGQ3KTsKKyAgICAgICAgICAvKiBQYXJ0aWFsIGhvcml6b250YWwgbGluZXMgKi8KKyAgICAgICAgY2FzZSAweDI1NzQ6IGNhc2UgMHgyNTc2OiBjYXNlIDB4MjU3ODogY2FzZSAweDI1N2E6CisgICAgICAgICAgICByZXR1cm4oMHgwMDJkKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybigweGZmZmQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjID49IDB4MjE5MCAmJiBjIDw9IDB4MjFmZikgeyAgIC8qIEFycm93cyAqLworICAgICAgICBpZiAoYyA+PSAweDIxOTAgJiYgYyA8PSAweDIxOTUgfHwgYyA9PSAweDIxYTgpCisgICAgICAgICAgcmV0dXJuKGMpOworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAvKiBMZWZ0LWFycm93IGZvcm1zICovCisgICAgICAgIGNhc2UgMHgyMTllOiBjYXNlIDB4MjFhMjogY2FzZSAweDIxYTQ6IGNhc2UgMHgyMWE5OgorICAgICAgICBjYXNlIDB4MjFiYzogY2FzZSAweDIxZDA6IGNhc2UgMHgyMWRhOiBjYXNlIDB4MjFkYzoKKyAgICAgICAgY2FzZSAweDIxZTA6IGNhc2UgMHgyMWU0OiBjYXNlIDB4MjFlNjogY2FzZSAweDIxYzc6CisgICAgICAgICAgICByZXR1cm4oMHgyMTkwKTsKKyAgICAgICAgICAvKiBSaWdodC1hcnJvdyBmb3JtcyAqLworICAgICAgICBjYXNlIDB4MjFhMDogY2FzZSAweDIxYTM6IGNhc2UgMHgyMWE2OiBjYXNlIDB4MjFhYToKKyAgICAgICAgY2FzZSAweDIxYzA6IGNhc2UgMHgyMWMxOiBjYXNlIDB4MjFjOTogY2FzZSAweDIxZDI6CisgICAgICAgIGNhc2UgMHgyMWRiOiBjYXNlIDB4MjFkZDogY2FzZSAweDIxZTI6IGNhc2UgMHgyMWU1OgorICAgICAgICBjYXNlIDB4MjFlODoKKyAgICAgICAgICAgIHJldHVybigweDIxOTIpOworICAgICAgICAgIC8qIFVwLWFycm93IGZvcm1zICovCisgICAgICAgIGNhc2UgMHgyMTlmOiBjYXNlIDB4MjFhNTogY2FzZSAweDIxYmU6IGNhc2UgMHgyMWJmOgorICAgICAgICBjYXNlIDB4MjFjODogY2FzZSAweDIxZDE6IGNhc2UgMHgyMWRlOiBjYXNlIDB4MjFlMToKKyAgICAgICAgY2FzZSAweDIxZTc6IGNhc2UgMHgyMWVhOgorICAgICAgICAgICAgcmV0dXJuKDB4MjE5MSk7CisgICAgICAgICAgLyogRG93bi1hcnJvdyBmb3JtcyAqLworICAgICAgICBjYXNlIDB4MjFhMTogY2FzZSAweDIxYTc6IGNhc2UgMHgyMWFmOiBjYXNlIDB4MjFjMjoKKyAgICAgICAgY2FzZSAweDIxY2U6IGNhc2UgMHgyMWNhOiBjYXNlIDB4MjFkMzogY2FzZSAweDIxZGY6CisgICAgICAgIGNhc2UgMHgyMWUzOiBjYXNlIDB4MjFlOToKKyAgICAgICAgICAgIHJldHVybigweDIxOTMpOworICAgICAgICAgIC8qIFVwLWRvd24tYXJyb3cgZm9ybXMgKi8KKyAgICAgICAgY2FzZSAweDIxYzU6IGNhc2UgMHgyMWQ1OgorICAgICAgICAgICAgcmV0dXJuKDB4MjE5NSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oMHhmZmZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYyA+PSAweDI1ODAgJiYgYyA8PSAweDI1OWYpIHsgICAvKiBCbG9jayBlbGVtZW50cyAqLworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAweDI1ODA6IGNhc2UgMHgyNTg0OiBjYXNlIDB4MjU4ODogY2FzZSAweDI1OGM6CisgICAgICAgIGNhc2UgMHgyNTkwOiBjYXNlIDB4MjU5MTogY2FzZSAweDI1OTI6IGNhc2UgMHgyNTkzOgorICAgICAgICAgICAgcmV0dXJuKGMpOworICAgICAgICBjYXNlIDB4MjU4MTogY2FzZSAweDI1ODI6IGNhc2UgMHgyNTgzOgorICAgICAgICBjYXNlIDB4MjU4NTogY2FzZSAweDI1ODY6IGNhc2UgMHgyNTg3OgorICAgICAgICAgICAgcmV0dXJuKDB4MjU4NCk7CisgICAgICAgIGNhc2UgMHgyNTg5OiBjYXNlIDB4MjU4YTogY2FzZSAweDI1OGI6CisgICAgICAgIGNhc2UgMHgyNThkOiBjYXNlIDB4MjU4ZTogY2FzZSAweDI1OGY6CisgICAgICAgICAgICByZXR1cm4oMHgyNThjKTsKKyAgICAgICAgY2FzZSAweDI1OTU6CisgICAgICAgICAgICByZXR1cm4oMHgyNTAyKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybigweGZmZmQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjID49IDB4MjIwMCAmJiBjIDw9IDB4MjJmZikgeyAgIC8qIE1hdGhlbWF0aWNhbCBvcGVyYXRvcnMgKi8KKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgMHgyMjAyOiBjYXNlIDB4MjIwNjogY2FzZSAweDIyMGY6IGNhc2UgMHgyMjExOiBjYXNlIDB4MjIxMjoKKyAgICAgICAgY2FzZSAweDIyMTk6IGNhc2UgMHgyMjIwOiBjYXNlIDB4MjIxZTogY2FzZSAweDIyMWY6IGNhc2UgMHgyMjI5OgorICAgICAgICBjYXNlIDB4MjIyYjogY2FzZSAweDIyNDg6IGNhc2UgMHgyMjYwOiBjYXNlIDB4MjI2MTogY2FzZSAweDIyNjQ6CisgICAgICAgIGNhc2UgMHgyMjY1OgorICAgICAgICAgICAgcmV0dXJuKGMpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKDB4ZmZmZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGMgPj0gMHgyMzAwICYmIGMgPD0gMHgyMzdmKSB7ICAgLyogTWlzY2VsbGFuZW91cyBUZWNobmljYWwgKi8KKyAgICAgICAgaWYgKGMgPT0gMHgyMzAyIHx8IGMgPT0gMHgyMzEwIHx8IGMgPT0gMHgyMzIwIHx8IGMgPT0gMHgyMzIxKQorICAgICAgICAgIHJldHVybihjKTsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgY2FzZSAweDIzMjk6ICAgICAgICAgICAgICAgICAgLyogQlJBICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDNjKTsKKyAgICAgICAgICBjYXNlIDB4MjMyYTogICAgICAgICAgICAgICAgICAvKiBLRVQgKi8KKyAgICAgICAgICAgIHJldHVybigweDAwM2UpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICByZXR1cm4oMHhmZmZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYyA+PSAweDI1YTAgJiYgYyA8PSAweDI1ZmYpIHsgICAvKiBHZW9tZXRyaWMgc2hhcGVzICovCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgIC8qIFRoZW1zZWx2ZXMgKi8KKyAgICAgICAgY2FzZSAweDI1YTA6IGNhc2UgMHgyNWFjOiBjYXNlIDB4MjViMjogY2FzZSAweDI1YmE6CisgICAgICAgIGNhc2UgMHgyNWJjOiBjYXNlIDB4MjVjNDogY2FzZSAweDI1Y2E6IGNhc2UgMHgyNWNiOgorICAgICAgICBjYXNlIDB4MjVkODogY2FzZSAweDI1ZDk6CisgICAgICAgICAgICByZXR1cm4oYyk7CisgICAgICAgICAgLyogU3F1YXJlcyAqLworICAgICAgICAgIGNhc2UgMHgyNWExOiBjYXNlIDB4MjVhMjogY2FzZSAweDI1YTM6IGNhc2UgMHgyNWE0OgorICAgICAgICAgIGNhc2UgMHgyNWE1OiBjYXNlIDB4MjVhNjogY2FzZSAweDI1YTc6IGNhc2UgMHgyNWE4OgorICAgICAgICBjYXNlIDB4MjVhOTogY2FzZSAweDI1YWE6IGNhc2UgMHgyNWFiOgorICAgICAgICBjYXNlIDB4MjVlNzogY2FzZSAweDI1ZTg6IGNhc2UgMHgyNWU5OiBjYXNlIDB4MjVlYTogY2FzZSAweDI1ZWI6CisgICAgICAgICAgICByZXR1cm4oMHgyNWEwKTsKKyAgICAgICAgICBjYXNlIDB4MjVhZDogY2FzZSAweDI1YWU6IGNhc2UgMHgyNWFmOiAvKiBSZWN0YW5nbGVzICovCisgICAgICAgIGNhc2UgMHgyNWIwOiBjYXNlIDB4MjViMToKKyAgICAgICAgICAgIHJldHVybigweDI1YWMpOworICAgICAgICAgIGNhc2UgMHgyNWIzOiBjYXNlIDB4MjViNDogY2FzZSAweDI1YjU6IC8qIFVwcmlnaHQgdHJpYW5nbGVzICovCisgICAgICAgIGNhc2UgMHgyNWVjOiBjYXNlIDB4MjVlZDogY2FzZSAweDI1ZWU6CisgICAgICAgICAgICByZXR1cm4oMHgyNWIyKTsKKyAgICAgICAgY2FzZSAweDI1YjY6IGNhc2UgMHgyNWI3OiBjYXNlIDB4MjViODogY2FzZSAweDI1Yjk6IGNhc2UgMHgyNWJiOgorICAgICAgICAgICAgcmV0dXJuKDB4MjViYSk7ICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0LXBvaW50aW5nIHRyaWFuZ2xlcyAqLworICAgICAgICAgIGNhc2UgMHgyNWJkOiBjYXNlIDB4MjViZTogY2FzZSAweDI1YmY6IC8qIERvd24tcG9pbnRpbmcgdHJpYW5nbGVzICovCisgICAgICAgICAgICByZXR1cm4oMHgyNWJjKTsKKyAgICAgICAgY2FzZSAweDI1YzA6IGNhc2UgMHgyNWMxOiBjYXNlIDB4MjVjMjogY2FzZSAweDI1YzM6IGNhc2UgMHgyNWM1OgorICAgICAgICAgICAgcmV0dXJuKDB4MjVjNCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQtcG9pbnRpbmcgdHJpYW5nbGVzICovCisgICAgICAgICAgY2FzZSAweDI1YzY6IGNhc2UgMHgyNWM3OiBjYXNlIDB4MjVjODogLyogRGlhbW9uZHMgKi8KKyAgICAgICAgICAgIHJldHVybigweDI2NjYpOworICAgICAgICAgIC8qIENpcmNsZXMgKi8KKyAgICAgICAgY2FzZSAweDI1Yzk6IGNhc2UgMHgyNWNjOiBjYXNlIDB4MjVjZDogY2FzZSAweDI1Y2U6IGNhc2UgMHgyNWNmOgorICAgICAgICBjYXNlIDB4MjVkMDogY2FzZSAweDI1ZDE6IGNhc2UgMHgyNWQyOiBjYXNlIDB4MjVkMzogY2FzZSAweDI1ZDQ6CisgICAgICAgIGNhc2UgMHgyNWQ1OiBjYXNlIDB4MjVlNjogY2FzZSAweDI1ZWY6CisgICAgICAgICAgICByZXR1cm4oMHgyNWNiKTsKKyAgICAgICAgICAvKiBDdXJ2ZXMgYW5kIGNvcm5lciB0cmlhbmdsZXMgKi8KKyAgICAgICAgICBjYXNlIDB4MjVkYzogY2FzZSAweDI1ZTQ6ICAgICAvKiBVTCAqLworICAgICAgICAgICAgcmV0dXJuKDB4MjUwYyk7CisgICAgICAgICAgY2FzZSAweDI1ZGQ6IGNhc2UgMHgyNWU1OiAgICAgLyogVVIgKi8KKyAgICAgICAgICAgIHJldHVybigweDI1MTApOworICAgICAgICAgIGNhc2UgMHgyNWRmOiBjYXNlIDB4MjVlMzogICAgIC8qIExMICovCisgICAgICAgICAgICByZXR1cm4oMHgyNTE0KTsKKyAgICAgICAgICBjYXNlIDB4MjVkZTogY2FzZSAweDI1ZTI6ICAgICAvKiBMUiAqLworICAgICAgICAgICAgcmV0dXJuKDB4MjUxOCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oMHhmZmZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYyA+PSAweDI2MDAgJiYgYyA8PSAweDI2ZmYpIHsgICAvKiBNaXNjIHN5bWJvbHMgKi8KKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgLyogVGhlbXNlbHZlcyAqLworICAgICAgICBjYXNlIDB4MjYzYTogY2FzZSAweDI2M2I6IGNhc2UgMHgyNjNjOiBjYXNlIDB4MjY0MDoKKyAgICAgICAgY2FzZSAweDI2NDI6IGNhc2UgMHgyNjYwOiBjYXNlIDB4MjY2MzogY2FzZSAweDI2NjU6CisgICAgICAgIGNhc2UgMHgyNjY2OiBjYXNlIDB4MjY2YTogY2FzZSAweDI2NmI6CisgICAgICAgICAgICByZXR1cm4oYyk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oMHhmZmZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYyA+PSAweDI3OTQgJiYgYyA8PSAweDI3YmUpICAgICAvKiBSaWdodC1hcnJvdyBEaW5nYmF0cyAqLworICAgICAgcmV0dXJuKDB4MjE5Mik7CisgICAgaWYgKGMgPj0gMHgyMDcwICYmIGMgPD0gMHgyMDlmKSB7ICAgLyogU3VwZXIgJiBzdWJzY3JpcHRzICovCisgICAgICAgIGlmIChjID09IDB4MjA3ZikgICAgICAgICAgICAgICAgLyogbiAqLworICAgICAgICAgIHJldHVybihjKTsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAweDIwNzApICAgICAgICAgICAvKiAwICovCisgICAgICAgICAgcmV0dXJuKDB4MDAzMCk7CisgICAgICAgIGVsc2UgaWYgKGMgPj0gMHgyMDc0ICYmIGMgPD0gMHgyMDc5KQorICAgICAgICAgIHJldHVybihjIC0gMHgyMDQwKTsKKyAgICAgICAgZWxzZSBpZiAoYyA+PSAweDIwODAgJiYgYyA8PSAweDIwODkpCisgICAgICAgICAgcmV0dXJuKGMgLSAweDIwNTApOworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAweDIwN2E6IGNhc2UgMHgyMDhhOgorICAgICAgICAgICAgcmV0dXJuKDB4MDAyYik7CisgICAgICAgIGNhc2UgMHgyMDdiOiBjYXNlIDB4MjA4YjoKKyAgICAgICAgICAgIHJldHVybigweDAwMmQpOworICAgICAgICBjYXNlIDB4MjA3YzogY2FzZSAweDIwOGM6CisgICAgICAgICAgICByZXR1cm4oMHgwMDNkKTsKKyAgICAgICAgY2FzZSAweDIwN2Q6IGNhc2UgMHgyMDhkOgorICAgICAgICAgICAgcmV0dXJuKDB4MDAyOCk7CisgICAgICAgIGNhc2UgMHgyMDdlOiBjYXNlIDB4MjA4ZToKKyAgICAgICAgICAgIHJldHVybigweDAwMjkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKDB4ZmZmZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGMgPj0gMHgwMTgwICYmIGMgPD0gMHgwMjRmKSB7ICAgLyogTGF0aW4gRXh0ZW5kZWQgQiwgUGFydCBJICovCisgICAgICAgIGlmIChjID09IDB4MDE5MiB8fCBjID49IDB4MDFmYSAmJiBjIDw9IDB4MDFmZikKKyAgICAgICAgICByZXR1cm4oYyk7ICAgICAgICAgICAgICAgICAgICAvKiBMYXRpbiBFeHRlbmRlZCBCICovCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlIDB4MDE4MDogY2FzZSAweDAxODM6IGNhc2UgMHgwMTg0OiBjYXNlIDB4MDE4NToKKyAgICAgICAgICAgIHJldHVybigweDAwNjIpOyAgICAgICAgICAgICAvKiBMb3dlcmNhc2UgYiB2YXJpYW50cyAqLworICAgICAgICBjYXNlIDB4MDE4MTogY2FzZSAweDAxODI6CisgICAgICAgICAgICByZXR1cm4oMHgwMDQyKTsgICAgICAgICAgICAgLyogVXBwZXJjYXNlIEIgdmFyaWFudHMgKi8KKyAgICAgICAgY2FzZSAweDAxODY6IGNhc2UgMHgwMTg3OgorICAgICAgICAgICAgcmV0dXJuKDB4MDA0Myk7ICAgICAgICAgICAgIC8qIFVwcGVyY2FzZSBDIHZhcmlhbnRzICovCisgICAgICAgICAgY2FzZSAweDAxODk6ICAgICAgICAgICAgICAgICAgLyogRCB3aXRoIHN0cm9rZSAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDBEMCk7ICAgICAgICAgICAgIC8qIExvb2tzIGp1c3QgbGlrZSBFdGggKi8KKyAgICAgICAgICBjYXNlIDB4MDE4YTogICAgICAgICAgICAgICAgICAvKiBEIHdpdGggaG9vayAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDA0NCk7CisgICAgICAgICAgY2FzZSAweDAxOGU6IGNhc2UgMHgwMTkwOiAgICAgLyogRS1saWtlIGxldHRlcnMgKi8KKyAgICAgICAgICAgIHJldHVybigweDAwNDUpOworICAgICAgICAgIGNhc2UgMHgwMThmOiAgICAgICAgICAgICAgICAgIC8qIGUtbGlrZSBsZXR0ZXJzICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDY1KTsKKyAgICAgICAgICBjYXNlIDB4MDE5MTogICAgICAgICAgICAgICAgICAvKiBGLWxpa2UgKi8KKyAgICAgICAgICAgIHJldHVybigweDAwNDYpOworICAgICAgICAgIGNhc2UgMHgwMTkzOiAgICAgICAgICAgICAgICAgIC8qIEctbGlrZSAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDA0Nyk7CisgICAgICAgICAgY2FzZSAweDAxOTQ6ICAgICAgICAgICAgICAgICAgLyogTGF0aW4gQ2FwaXRhbCBHYW1tYSAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDM5Myk7ICAgICAgICAgICAgIC8qIFVzZSBHcmVlayAqLworICAgICAgICAgIGNhc2UgMHgwMTk1OiAgICAgICAgICAgICAgICAgIC8qIEdvdGhpYyBodiAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDA2OCk7ICAgICAgICAgICAgIC8qIFVzZSBoICovCisgICAgICAgICAgY2FzZSAweDAxOTY6ICAgICAgICAgICAgICAgICAgLyogTGF0aW4gQ2FwaXRhbCBJb3RhICovCisgICAgICAgICAgICByZXR1cm4oMHgwMzk5KTsgICAgICAgICAgICAgLyogVXNlIEdyZWVrICovCisgICAgICAgICAgY2FzZSAweDAxOTc6ICAgICAgICAgICAgICAgICAgLyogSSB3aXRoIGJhciAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDA2OSk7CisgICAgICAgICAgY2FzZSAweDAxOTg6ICAgICAgICAgICAgICAgICAgLyogSyB3aXRoIGhvb2sgKi8KKyAgICAgICAgICAgIHJldHVybigweDAwNEIpOworICAgICAgICAgIGNhc2UgMHgwMTk5OiAgICAgICAgICAgICAgICAgIC8qIGsgd2l0aCBob29rICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDZCKTsKKyAgICAgICAgICBjYXNlIDB4MDE5QTogICAgICAgICAgICAgICAgICAvKiBsIHdpdGggYmFyICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDZDKTsKKyAgICAgICAgICBjYXNlIDB4MDE5QjogICAgICAgICAgICAgICAgICAvKiBsYW1iZGEgd2l0aCBiYXIgKi8KKyAgICAgICAgICAgIHJldHVybigweDAzYmIpOyAgICAgICAgICAgICAvKiBVc2UgR3JlZWsgKi8KKyAgICAgICAgICBjYXNlIDB4MDE5QzogICAgICAgICAgICAgICAgICAvKiBVcHNpZGUgZG93biBtICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDZkKTsKKyAgICAgICAgICBjYXNlIDB4MDE5RDogICAgICAgICAgICAgICAgICAvKiBOIHdpdGggbGVmdCBob29rICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDRlKTsKKyAgICAgICAgICBjYXNlIDB4MDE5RTogICAgICAgICAgICAgICAgICAvKiBuIHdpdGggbG9uZyByaWdodCBsZWcgKi8KKyAgICAgICAgICAgIHJldHVybigweDAwNmUpOworICAgICAgICAgIGNhc2UgMHgwMTlGOiBjYXNlIDB4MDFhMDogY2FzZSAweDAxYTI6IC8qIE8tbGlrZSBsZXR0ZXJzICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDRmKTsKKyAgICAgICAgICBjYXNlIDB4MDFhMTogY2FzZSAweDAxYTM6ICAgICAvKiBvLWxpa2UgKi8KKyAgICAgICAgICAgIHJldHVybigweDAwNmYpOworICAgICAgICAgIGNhc2UgMHgwMUE0OiAgICAgICAgICAgICAgICAgIC8qIFAgd2l0aCBob29rICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDUwKTsKKyAgICAgICAgICBjYXNlIDB4MDFBNTogICAgICAgICAgICAgICAgICAvKiBwIHdpdGggaG9vayAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDA3MCk7CisgICAgICAgICAgY2FzZSAweDAxQTY6ICAgICAgICAgICAgICAgICAgLyogT2xkIE5vcnNlIFlSICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDUyKTsKKyAgICAgICAgICBjYXNlIDB4MDFBNzogICAgICAgICAgICAgICAgICAvKiBCYWNrd2FyZHMgUyAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDA1Myk7CisgICAgICAgICAgY2FzZSAweDAxQTg6IGNhc2UgMHgwMUFBOiAgICAgLyogcy1saWtlIGxldHRlcnMgKi8KKyAgICAgICAgICAgIHJldHVybigweDAwNzMpOworICAgICAgICAgIGNhc2UgMHgwMUE5OiAgICAgICAgICAgICAgICAgIC8qIEVzaCAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDNhMyk7ICAgICAgICAgICAgIC8qIExvb2tzIGp1c3QgbGlrZSBTaWdtYSAqLworICAgICAgICAgIGNhc2UgMHgwMUFCOiBjYXNlIDB4MDFBRDogICAgIC8qIHQtbGlrZSAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDA3NCk7CisgICAgICAgICAgY2FzZSAweDAxQUM6IGNhc2UgMHgwMUFFOiAgICAgLyogVC1saWtlICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDU0KTsKKyAgICAgICAgICBjYXNlIDB4MDFBRjogY2FzZSAweDAxQjE6ICAgICAvKiBVLWxpa2UgKi8KKyAgICAgICAgICAgIHJldHVybigweDAwNTUpOworICAgICAgICAgIGNhc2UgMHgwMUIwOiAgICAgICAgICAgICAgICAgIC8qIHUtbGlrZSAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDA3NSk7CisgICAgICAgICAgY2FzZSAweDAxQjI6ICAgICAgICAgICAgICAgICAgLyogVi1saWtlICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDU2KTsKKyAgICAgICAgICBjYXNlIDB4MDFCMzogICAgICAgICAgICAgICAgICAvKiBZLWxpa2UgKi8KKyAgICAgICAgICAgIHJldHVybigweDAwNTkpOworICAgICAgICAgIGNhc2UgMHgwMUI0OiAgICAgICAgICAgICAgICAgIC8qIHktbGlrZSAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDA3OSk7CisgICAgICAgICAgY2FzZSAweDAxQjU6ICAgICAgICAgICAgICAgICAgLyogWi1saWtlICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDVhKTsKKyAgICAgICAgICBjYXNlIDB4MDFCNjogICAgICAgICAgICAgICAgICAvKiB6LWxpa2UgKi8KKyAgICAgICAgICAgIHJldHVybigweDAwN2EpOworICAgICAgICAgIGNhc2UgMHgwMUI3OiAgICAgICAgICAgICAgICAgIC8qIFlvZ2ggKi8KKyAgICAgICAgICAgIHJldHVybigweDAwMzMpOyAgICAgICAgICAgICAvKiBVc2UgIjMiICovCisgICAgICAgICAgY2FzZSAweDAxQkY6ICAgICAgICAgICAgICAgICAgLyogV3lubiAqLworICAgICAgICAgICAgcmV0dXJuKDB4MDA3Nyk7ICAgICAgICAgICAgIC8qIFVzZSAidyIgKi8KKyAgICAgICAgICBjYXNlIDB4MDFDRDogICAgICAgICAgICAgICAgICAvKiBBIGNhcm9uICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDQxKTsKKyAgICAgICAgICBjYXNlIDB4MDFDRTogICAgICAgICAgICAgICAgICAvKiBhIGNhcm9uICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDYxKTsKKyAgICAgICAgICBjYXNlIDB4MDFDRjogICAgICAgICAgICAgICAgICAvKiBJIGNhcm9uICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDQ5KTsKKyAgICAgICAgICBjYXNlIDB4MDFEMDogICAgICAgICAgICAgICAgICAvKiBpIGNhcm9uICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDY5KTsKKyAgICAgICAgICBjYXNlIDB4MDFEMTogICAgICAgICAgICAgICAgICAvKiBPIGNhcm9uICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDRmKTsKKyAgICAgICAgICBjYXNlIDB4MDFEMjogICAgICAgICAgICAgICAgICAvKiBvIGNhcm9uICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDZmKTsKKyAgICAgICAgICBjYXNlIDB4MDFEMzogICAgICAgICAgICAgICAgICAvKiBVIGNhcm9uICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDU1KTsKKyAgICAgICAgICBjYXNlIDB4MDFENDogICAgICAgICAgICAgICAgICAvKiB1IGNhcm9uICovCisgICAgICAgICAgICByZXR1cm4oMHgwMDc1KTsKKyAgICAgICAgICAvKiBVIGRpYWVyZXNpcyArIG90aGVyIHRoaW5ncyAqLworICAgICAgICBjYXNlIDB4MDFENTogY2FzZSAweDAxRDc6IGNhc2UgMHgwMUQ5OiBjYXNlIDB4MDFEQjoKKyAgICAgICAgICAgIHJldHVybigweDAwZGMpOworICAgICAgICAgIC8qIHUgZGlhZXJlc2lzICsgb3RoZXIgdGhpbmdzICovCisgICAgICAgIGNhc2UgMHgwMUQ2OiBjYXNlIDB4MDFEYTogY2FzZSAweDAxRGM6CisgICAgICAgICAgICByZXR1cm4oMHgwMGZjKTsKKworICAgICAgICAgIC8qIEZpbGwgaW4gbW9yZSBoZXJlIGlmIGFueWJvZHkgYXNrcyAqLworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oMHhmZmZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYyA+PSAweDFlMDAgJiYgYyA8PSAweDFlZmYpIHsgICAvKiBMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsICovCisgICAgICAgIGlmIChjID49IDB4MWU4MCAmJiBjIDw9IDB4MWU4NSkKKyAgICAgICAgICByZXR1cm4oYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4oMHhmZmZkKTsKKyAgICB9CisgICAgaWYgKGMgPj0gMHgwNDAwICYmIGMgPD0gMHgwNGZmKSB7ICAgLyogQ3lyaWxsaWMgKi8KKyAgICAgICAgaWYgKGMgPj0gMHgwNDAwICYmIGMgPD0gMHgwNDVmIHx8IGMgPT0gMHgwNDkwICB8fCBjID09IDB4MDQ5MSkKKyAgICAgICAgICByZXR1cm4oYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4oMHhmZmZkKTsKKyAgICB9CisgICAgaWYgKGMgPj0gMHgwMzcwICYmIGMgPD0gMHgwM2ZmKSB7ICAgLyogR3JlZWsgKi8KKyAgICAgICAgaWYgKGMgPT0gMHgwMzdlIHx8IGMgPj0gMHgwMzg0ICYmIGMgPD0gMHgwM2NlKQorICAgICAgICAgIHJldHVybihjKTsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgMHgwMzc0OiBjYXNlIDB4MDM3NToKKyAgICAgICAgICAgIHJldHVybigweDAwMjcpOworICAgICAgICBjYXNlIDB4MDM3YToKKyAgICAgICAgICAgIHJldHVybigweDAwMmMpOworICAgICAgICAgIC8qIEZpbGwgaW4gbW9yZSBoZXJlIGlmIG5lZWRlZCAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKDB4ZmZmZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGMgPj0gMHgxZjAwICYmIGMgPD0gMHgxZmZmKSB7ICAgLyogR3JlZWsgRXh0ZW5kZWQgKi8KKyAgICAgICAgLyogRmlsbCBpbiBpZiBhc2tlZCAqLworICAgICAgICByZXR1cm4oMHhmZmZkKTsKKyAgICB9CisgICAgaWYgKGMgPj0gMHgyMGEwICYmIGMgPD0gMHgyMGNmKSB7ICAgLyogQ3VycmVuY3kgc3ltYm9scyAqLworICAgICAgICBpZiAoYyA9PSAweDIwYTMgfHwgYyA9PSAweDIwYTQgfHwgYyA9PSAweDIwYTcgfHwgYyA9PSAweDIwYWMpCisgICAgICAgICAgcmV0dXJuKGMpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuKDB4ZmZmZCk7CisgICAgfQorICAgIGlmIChjID49IDB4MjEwMCAmJiBjIDw9IDB4MjE0ZikgeyAgIC8qIExldHRlcmxpa2Ugc3ltYm9scyAqLworICAgICAgICBpZiAoYyA9PSAweDIxMTYgfHwgYyA9PSAweDIxMjIgfHwgYyA9PSAweDIxMjYpCisgICAgICAgICAgcmV0dXJuKGMpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuKDB4ZmZmZCk7CisgICAgfQorICAgIGlmIChjID49IDB4MjE1MCAmJiBjIDw9IDB4MjE4ZikgeyAgIC8qIE51bWJlciBmb3JtcyAqLworICAgICAgICBpZiAoYyA+PSAweDIxNWIgJiYgYyA8PSAweDIxNWUpIC8qIFJvbWFuIG51bWVyYWxzIGV0YyAqLworICAgICAgICAgIHJldHVybihjKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybigweGZmZmQpOworICAgIH0KKyAgICBpZiAoYyA+PSAweDAyYjAgJiYgYyA8PSAweDAyZmYpIHsgICAvKiBTcGFjaW5nIG1vZGlmaWVyIGxldHRlcnMgKi8KKyAgICAgICAgaWYgKGMgPT0gMHgwMmM2IHx8IGMgPT0gMHgwMmM3IHx8IGMgPT0gMHgwMmM5IHx8CisgICAgICAgICAgICBjID49IDB4MDJkOCAmJiBjIDw9IDB4MDJkZCkKKyAgICAgICAgICByZXR1cm4oYyk7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlIDB4MDJiMDogY2FzZSAweDAyYjE6CisgICAgICAgICAgICByZXR1cm4oMHgwMDY4KTsKKyAgICAgICAgY2FzZSAweDAyYjI6CisgICAgICAgICAgICAgIHJldHVybigweDAwNmEpOworICAgICAgICBjYXNlIDB4MDJiMzogY2FzZSAweDAyYjQ6IGNhc2UgMHgwMmI1OgorICAgICAgICAgICAgcmV0dXJuKDB4MDA3Mik7CisgICAgICAgIGNhc2UgMHgwMmI3OgorICAgICAgICAgICAgcmV0dXJuKDB4MDA3Nyk7CisgICAgICAgIGNhc2UgMHgwMmI4OgorICAgICAgICAgICAgcmV0dXJuKDB4MDA3OSk7CisgICAgICAgIGNhc2UgMHgwMmI5OgorICAgICAgICAgICAgcmV0dXJuKDB4MDBiNCk7CisgICAgICAgIGNhc2UgMHgwMmJhOgorICAgICAgICAgICAgcmV0dXJuKDB4MDAyMik7CisgICAgICAgIGNhc2UgMHgwMmJiOiBjYXNlIDB4MDJiYzogY2FzZSAweDAyYmQ6IGNhc2UgMHgwMmJlOiBjYXNlIDB4MDJiZjoKKyAgICAgICAgICAgIHJldHVybigweDAwMjcpOworICAgICAgICAgIGNhc2UgMHgwMmMyOiAgICAgIHJldHVybigweDAwM2MpOworICAgICAgICAgIGNhc2UgMHgwMmMzOiAgICAgIHJldHVybigweDAwM2UpOworICAgICAgICAgIGNhc2UgMHgwMmRhOiAgICAgIHJldHVybigweDAwYjApOworICAgICAgICAgIGNhc2UgMHgwMmRjOiAgICAgIHJldHVybigweDAwN2UpOworICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgIHJldHVybigweGZmZmQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjID49IDB4MjAwMCAmJiBjIDw9IDB4MjA2ZikgeyAgIC8qIEdlbmVyYWwgUHVuY3R1YXRpb24gKi8KKyAgICAgICAgaWYgKGMgPj0gMHgyMDEzICYmIGMgPD0gMHgyMDE1IHx8CisgICAgICAgICAgICBjID49IDB4MjAxNyAmJiBjIDw9IDB4MjAxYSB8fAorICAgICAgICAgICAgYyA+PSAweDIwMWMgJiYgYyA8PSAweDIwMWUgfHwKKyAgICAgICAgICAgIGMgPj0gMHgyMDIwICYmIGMgPD0gMHgyMDIyIHx8IGMgPT0gMHgyMDI2IHx8IGMgPT0gMHgyMDMwIHx8CisgICAgICAgICAgICBjID49IDB4MjAzOSAmJiBjIDw9IDB4MjAzYSB8fCBjID09IDB4MjAzYyB8fCBjID09IDB4MjAzZSB8fAorICAgICAgICAgICAgYyA9PSAweDIwNDQpCisgICAgICAgICAgcmV0dXJuKGMpOworICAgICAgICBlbHNlIGlmIChjID09IDB4MjAxNikKKyAgICAgICAgICByZXR1cm4oMHgyNTUxKTsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAweDIwMTcpCisgICAgICAgICAgcmV0dXJuKDB4MjU1MCk7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gMHgyMDQ0KQorICAgICAgICAgIHJldHVybigweDAwMmYpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuKDB4ZmZmZCk7CisgICAgfQorICAgIGlmIChjID09IDB4ZmIwMSB8fCBjID09IDB4ZmIwMikgICAgIC8qIEFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zICovCisgICAgICByZXR1cm4oYyk7CisgICAgcmV0dXJuKDB4ZmZmZCk7ICAgICAgICAgICAgICAgICAgICAgLyogQ2F0Y2gtYWxsICovCit9CisjZW5kaWYgLyogT1MyICovCisKKworLyoKKyAgVGFibGUgb2YgQmxhaC10by1Vbmljb2RlIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMuCisgIEtFRVAgVEhJUyBJTiBTWU5DIFdJVEggVEhFIFRYX2JsYWggREVGSU5JVElPTlMgaW4gY2tjdW5pLmguCisqLworc3RydWN0IHhfdG9fdW5pY29kZSAqCit0eHJpbmZvW01BWFRYU0VUUysxXSA9IHsKKyAgICAmdV9hc2NpaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMCBVUyBJU08gNjQ2IChBU0NJSSkgKi8KKyAgICAmdV9icml0aXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMSBVSyBJU08gNjQ2ICovCisgICAgJnVfZnJfY2FuYWRpYW4sICAgICAgICAgICAgICAgICAgICAgLyogIDIgQ2FuYWRpYW4gRnJlbmNoIE5SQyAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAzIEN1YmEgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNCBDemVjaG8gKi8KKyAgICAmdV9kYW5pc2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNSBEYW5pc2gvTm9yd2VnaWFuIElTTyA2NDYgKi8KKyAgICAmdV9kdXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNiBEdXRjaCBOUkMgKi8KKyAgICAmdV9maW5uaXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNyBGaW5uaXNoIE5SQyAgKi8KKyAgICAmdV9mcmVuY2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgOCBGcmVuY2ggSVNPIDY0NiAqLworICAgICZ1X2dlcm1hbiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA5IEdlcm1hbiBJU08gNjQ2ICovCisgICAgJnVfaGVicmV3NywgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgSGVicmV3LTcgKERFQykgKi8KKyAgICAmdV9odW5nYXJpYW4sICAgICAgICAgICAgICAgICAgICAgICAvKiAxMSBIdW5nYXJpYW4gSVNPIDY0NiAqLworICAgICZ1X2ljZWxhbmRpYywgICAgICAgICAgICAgICAgICAgICAgIC8qIDEyIEljZWxhbmRpYyBOUkMgKi8KKyAgICAmdV9pdGFsaWFuLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMyBJdGFsaWFuIElTTyA2NDYgKi8KKyAgICAmdV9qaXMwMjAxciwgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNCBKYXBhbmVzZSBSb21hbiBJU08gNjQ2ICovCisgICAgJnVfamlzMDIwMWssICAgICAgICAgICAgICAgICAgICAgICAgLyogMTUgSmFwYW5lc2UgS2F0YWthbmEgKi8KKyAgICAmdV9rb2k3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiBTaG9ydCBLT0kgKi8KKyAgICAmdV9kYW5pc2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNyBOb3J3ZWdpYW4vRGFuaXNoIElTTyA2NDYgKi8KKyAgICAmdV9wb3J0dWd1ZXNlLCAgICAgICAgICAgICAgICAgICAgICAvKiAxOCBQb3J0dWd1ZXNlIElTTyA2NDYgKi8KKyAgICAmdV9zcGFuaXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxOSBzcGFuaXNoIElTTyA2NDYgKi8KKyAgICAmdV9zd2VkaXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMCBTd2VkaXNoIElTTyA2NDYgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMSBTd2VkaXNoIElTTyA2NDYgZm9yIG5hbWVzICovCisgICAgJnVfc3dpc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjIgU3dpc3MgTlJDICAgKi8KKyAgICAmdV84ODU5XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMyBJU08gODg1OS0xICAqLworICAgICZ1Xzg4NTlfMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI0IElTTyA4ODU5LTIgICovCisgICAgJnVfODg1OV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjUgSVNPIDg4NTktMyAgKi8KKyAgICAmdV84ODU5XzQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNiBJU08gODg1OS00ICAqLworICAgICZ1Xzg4NTlfNSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI3IElTTyA4ODU5LTUgICovIC8qIEN5cmlsbGljICovCisgICAgJnVfODg1OV82LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjggSVNPIDg4NTktNiAgKi8gLyogQXJhYmljICovCisgICAgJnVfODg1OV83LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjkgSVNPIDg4NTktNyAgKi8gLyogR3JlZWsgKi8KKyAgICAmdV84ODU5XzgsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMCBJU08gODg1OS04ICAqLyAvKiBIZWJyZXcgKi8KKyAgICAmdV84ODU5XzksICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMSBJU08gODg1OS05ICAqLworICAgICZ1Xzg4NTlfMTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMyIElTTyA4ODU5LTEwICovCisgICAgJnVfa29pOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzMgS09JLTggICAgICAgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNCBKSVMtNyAgICAgICAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM1IFNoaWZ0IEpJUyAgICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzYgSmFwYW5lc2UgRVVDIChKQUUpICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzcgSmFwYW5lc2UgREVDIEthbmppICovCisgICAgJnVfZGVjbWNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzggREVDIE1DUyAqLworICAgICZ1X25leHRzdGVwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM5IE5lWFQgICAgKi8KKyAgICAmdV9kZ2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0MCBER0kgICAgICovCisgICAgJnVfbWFjbGF0aW4sICAgICAgICAgICAgICAgICAgICAgICAgLyogNDEgTWFjaW50b3NoIExhdGluICAqLworICAgICZ1X2hwcm9tYW44LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQyIEhQIFJvbWFuIDggICAgICAgKi8KKyAgICAmdV9jcDQzNywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0MyBDUDQzNyAtIE9yaWdpbmFsICovCisgICAgJnVfY3A4NTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDQgQ1A4NTAgLSBXIEV1cm9wZSAqLworICAgICZ1X2NwODUyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ1IENQODUyIC0gRSBFdXJvcGUgKi8KKyAgICAmdV9jcDg1NywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0NiBDUDg1NyAtIFR1cmtpc2ggICovCisgICAgJnVfY3A4NjIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDcgQ1A4NjIgLSBIZWJyZXcgICAqLworICAgICZ1X2NwODY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4IENQODY0IC0gQXJhYmljICAgKi8KKyAgICAmdV9jcDg2NiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OSBDUDg2NiAtIEN5cmlsbGljICovCisgICAgJnVfY3A4NjksICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTAgQ1A4NjkgLSBHcmVlayAgICAqLworICAgICZ1X2RlY3NwZWMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUxIERFQyBTcGVjaWFsIEdyYXBoaWNzICovCisgICAgJnVfZGVjdGVjaCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTIgREVDIFRlY2huaWNhbCAqLworICAgICZ1X2MwcGljcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUzIEMwIFBpY3R1cmVzICovCisgICAgJnVfYzFwaWNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTQgQzEgUGljdHVyZXMgKi8KKyAgICAmdV9zbWlsZXksICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NSBJQk0gQzAgR3JhcGhpY3MgKi8KKyAgICAmdV9oZWF0aDE5ZywgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NiBIZWF0aCAxOSBHcmFwaGljcyAqLworICAgICZ1X3R2aWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU3IFRWSSBHcmFwaGljcyAqLworICAgICZ1X3d5c2VfZ24sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU4IFd5c2UgNjAgR3JhcGhpY3MgTm9ybWFsICovCisgICAgJnVfd3lzZV9nMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTkgV3lzZSA2MCBHcmFwaGljcyAxICovCisgICAgJnVfd3lzZV9nMiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjAgV3lzZSA2MCBHcmFwaGljcyAyICovCisgICAgJnVfd3lzZV9nMywgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjEgV3lzZSA2MCBHcmFwaGljcyAzICovCisgICAgJnVfZWxvdDkyNywgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjIgR3JlZWsgRUxPVCA5MjcgKi8KKyAgICAmdV9kZ3NwZWMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MyBERyBTcGVjaWFsIGdyYXBoaWNzICovCisgICAgJnVfZGdsaW5lLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjQgREcgTGluZSBkcmF3aW5nICovCisgICAgJnVfZGd3b3JkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjUgREcgV29yZCBwcm9jZXNzaW5nICovCisgICAgJnVfaHBsaW5lLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjYgSFAgTGluZSBkcmF3aW5nICovCisgICAgJnVfaHBtYXRoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjcgSFAgTWF0aC9UZWNobmljYWwgKi8KKyAgICAmdV9xbnhncnBoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2OCBRTlggR3JhcGhpY3MgKi8KKyAgICAmdV9zbmlicmFjaywgICAgICAgICAgICAgICAgICAgICAgICAvKiA2OSBTTkkgQnJhY2tldHMgKi8KKyAgICAmdV9zbmlldXJvLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3MCBTTkkgRXVybyAqLworICAgICZ1X3NuaWZhY2V0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcxIFNOSSBGYWNldCAqLworICAgICZ1X3NuaWlibSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcyIFNOSSBJQk0gKi8KKyAgICAmdV9zbmlibGFua3MsICAgICAgICAgICAgICAgICAgICAgICAvKiA3MyBTTkkgQmxhbmtzICovCisgICAgJnVfY3AxMjUyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNzQgV2luZG93cyBMYXRpbi0xICovCisgICAgJnVfY3AxMjUwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNzUgV2luZG93cyBMYXRpbi0yICovCisgICAgJnVfY3AxMjUxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNzYgV2luZG93cyBDeXJpbGxpYyAqLworICAgICZ1X2NwMTI1MywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDc3IFdpbmRvd3MgR3JlZWsgKi8KKyAgICAmdV9jcDEyNTQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3OCBXaW5kb3dzIFR1cmtpc2ggKi8KKyAgICAmdV9jcDEyNTcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3OSBXaW5kb3dzIExhdGluLTQgKi8KKyAgICAmdV9jcDg1NiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4MCBDeXJpbGxpYyBQQyBDb2RlIFBhZ2UgODU2ICovCisgICAgJnVfY3A4NTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogODEgQ3lyaWxsaWMgUEMgQ29kZSBQYWdlIDg1NSAqLworICAgICZ1Xzg4NTlfMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDgyIENQODE5IC0gU2FtZSBhcyA4ODU5LTEgKi8KKyAgICAmdV84ODU5XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4MyBDUDkxMiAtIFNhbWUgYXMgODg1OS0yICovCisgICAgJnVfODg1OV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogODQgQ1A5MTMgLSBTYW1lIGFzIDg4NTktMyAqLworICAgICZ1Xzg4NTlfNCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDg1IENQOTE0IC0gU2FtZSBhcyA4ODU5LTQgKi8KKyAgICAmdV84ODU5XzUsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4NiBDUDkxNSAtIFNhbWUgYXMgODg1OS01ICovCisgICAgJnVfODg1OV82LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogODcgQ1AxMDg5IC0gU2FtZSBhcyA4ODU5LTYgKi8KKyAgICAmdV84ODU5XzcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4OCBDUDgxMyAtIFNhbWUgYXMgODg1OS03ICovCisgICAgJnVfODg1OV84LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogODkgQ1A5MTYgLSBTYW1lIGFzIDg4NTktOCAqLworICAgICZ1Xzg4NTlfOSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDkwIENQOTIwIC0gU2FtZSBhcyA4ODU5LTkgKi8KKyAgICAmdV9ocHJvbWFuOCwgICAgICAgICAgICAgICAgICAgICAgICAvKiA5MSBDUDEwNTEgLSBTYW1lIGFzIEhQIFJvbWFuIDggKi8KKyAgICAmdV9jcDg1OCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA5MiBDUDg1OCAtIFcgRXVyb3BlIHcvRXVybyAqLworICAgICZ1Xzg4NTlfMTUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDkzIElTTyA4ODU5LTE1IExhdGluLTE1ICovCisgICAgJnVfODg1OV8xNSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogOTQgQ1A5MjMgLSBTYW1lIGFzIDg4NTktMTUgICovCisgICAgJnVfODg1OV83LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOTUgRUxPVDkyOCAtIFNhbWUgYXMgODg1OS03ICovCisgICAgJnVfcXVpY2tkcmF3LCAgICAgICAgICAgICAgICAgICAgICAgLyogOTYgQ1AxMDAwMCAtIEFwcGxlIFF1aWNrZHJhdyAqLworICAgICZ1X2NwMzcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDk3IENQMzcgLSBVLlMuIEVCQ0RJQyAqLworICAgICZ1X2NwMTI1NSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDk4IENQMTI1NSAtIFdpbmRvd3MgSGVicmV3ICovCisgICAgJnVfY3AxMjU2LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOTkgQ1AxMjU2IC0gV2luZG93cyBBcmFiaWMgKi8KKyAgICAmdV9jcDEyNTgsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDAgQ1AxMjU4IC0gV2luZG93cyBWaWV0IE5hbSAqLworICAgICZ1X21hem92aWEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMSBNYXpvdmlhIFBvbGlzaCBjb2RlIHBhZ2UgKi8KKyAgICAmdV90cmFuc3BhcmVudCwgICAgICAgICAgICAgICAgICAgICAvKiAxMDIgVHJhbnNwYXJlbnQgKi8KKyAgICAmdV9oejE1MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDMgSGF6ZWx0aW5lIDE1MDAvMTUyMCBncmFwaGljcyAqLworICAgICZ1X2tvaThyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwNCBLT0k4LVIgKi8KKyAgICAmdV9rb2k4dSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDUgS09JOC1VICovCisgICAgJnVfYXBsMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTA2IEFQTCAxIChJU08pICovCisgICAgJnVfYXBsMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTA3IEFQTCAyIChEeWFkaWMpICovCisgICAgJnVfYXBsMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTA4IEFQTCAzIChQbHVzKSAqLworICAgICZ1X2FwbDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwOCBBUEwgNCAoSUJNKSAqLworICAgICZ1X2FwbDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDExMCBBUEwgNSAoMjc0MSkgKi8KK307CisKKy8qCisgIFRhYmxlIG9mIEJsYWgtdG8tVW5pY29kZSB0cmFuc2xhdGlvbiBmdW5jdGlvbnMuCisgIEtFRVAgVEhJUyBJTiBTWU5DIFdJVEggVEhFIFRYX2JsYWggREVGSU5JVElUSU9OUyBpbiBja2N1bmkuaC4KKyovCitVU0hPUlQKKyNpZmRlZiBDS19BTlNJQworKCp4bF91W01BWFRYU0VUUysxXSkoQ0hBUikKKyNlbHNlCisoKnhsX3VbTUFYVFhTRVRTKzFdKSgpCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKz0geworICAgIGFzY2lpX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAwIFVTIElTTyA2NDYgKEFTQ0lJKSAqLworICAgIGJyaXRpc2hfdSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxIFVLIElTTyA2NDYgKi8KKyAgICBmcl9jYW5hZGlhbl91LCAgICAgICAgICAgICAgICAgICAgICAvKiAgMiBDYW5hZGlhbiBGcmVuY2ggTlJDICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDMgQ3ViYSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA0IEN6ZWNobyAqLworICAgIGRhbmlzaF91LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA1IERhbmlzaC9Ob3J3ZWdpYW4gSVNPIDY0NiAqLworICAgIGR1dGNoX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA2IER1dGNoIE5SQyAqLworICAgIGZpbm5pc2hfdSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA3IEZpbm5pc2ggTlJDICAqLworICAgIGZyZW5jaF91LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA4IEZyZW5jaCBJU08gNjQ2ICovCisgICAgZ2VybWFuX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDkgR2VybWFuIElTTyA2NDYgKi8KKyAgICBoZWJyZXc3X3UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMCBIZWJyZXctNyAoREVDKSAqLworICAgIGh1bmdhcmlhbl91LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDExIEh1bmdhcmlhbiBJU08gNjQ2ICovCisgICAgaWNlbGFuZGljX3UsICAgICAgICAgICAgICAgICAgICAgICAgLyogMTIgSWNlbGFuZGljICovCisgICAgaXRhbGlhbl91LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTMgSXRhbGlhbiBJU08gNjQ2ICovCisgICAgamlzMDIwMXJfdSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTQgSmFwYW5lc2UgUm9tYW4gSVNPIDY0NiAqLworICAgIGppczAyMDFrX3UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE1IEphcGFuZXNlIEthdGFrYW5hICovCisgICAga29pN191LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTYgU2hvcnQgS09JICovCisgICAgZGFuaXNoX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTcgTm9yd2VnaWFuL0RhbmlzaCBJU08gNjQ2ICovCisgICAgcG9ydHVndWVzZV91LCAgICAgICAgICAgICAgICAgICAgICAgLyogMTggUG9ydHVndWVzZSBJU08gNjQ2ICovCisgICAgc3BhbmlzaF91LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTkgc3BhbmlzaCBJU08gNjQ2ICovCisgICAgc3dlZGlzaF91LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjAgU3dlZGlzaCBJU08gNjQ2ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjEgU3dlZGlzaCBJU08gNjQ2IGZvciBuYW1lcyAqLworICAgIHN3aXNzX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIyIFN3aXNzIE5SQyAgICovCisgICAgaXNvXzg4NTlfMV91LCAgICAgICAgICAgICAgICAgICAgICAgLyogMjMgSVNPIDg4NTktMSAgKi8KKyAgICBpc29fODg1OV8yX3UsICAgICAgICAgICAgICAgICAgICAgICAvKiAyNCBJU08gODg1OS0yICAqLworICAgIGlzb184ODU5XzNfdSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDI1IElTTyA4ODU5LTMgICovCisgICAgaXNvXzg4NTlfNF91LCAgICAgICAgICAgICAgICAgICAgICAgLyogMjYgSVNPIDg4NTktNCAgKi8KKyAgICBpc29fODg1OV81X3UsICAgICAgICAgICAgICAgICAgICAgICAvKiAyNyBJU08gODg1OS01ICAqLyAvKiBDeXJpbGxpYyAqLworICAgIGlzb184ODU5XzZfdSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDI4IElTTyA4ODU5LTYgICovIC8qIEFyYWJpYyAqLworICAgIGlzb184ODU5XzdfdSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDI5IElTTyA4ODU5LTcgICovIC8qIEdyZWVrICovCisgICAgaXNvXzg4NTlfOF91LCAgICAgICAgICAgICAgICAgICAgICAgLyogMzAgSVNPIDg4NTktOCAgKi8gLyogSGVicmV3ICovCisgICAgaXNvXzg4NTlfOV91LCAgICAgICAgICAgICAgICAgICAgICAgLyogMzEgSVNPIDg4NTktOSAgKi8gLyogTGF0aW4tNSAqLworICAgIGlzb184ODU5XzEwX3UsICAgICAgICAgICAgICAgICAgICAgIC8qIDMyIElTTyA4ODU5LTEwICovCisgICAga29pOF91LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzMgS09JLTggICAgICAgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNCBKSVMtNyAgICAgICAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM1IFNoaWZ0IEpJUyAgICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzYgSmFwYW5lc2UgRVVDIChKQUUpICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzcgSmFwYW5lc2UgREVDIEthbmppICovCisgICAgZGVjbWNzX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzggREVDIE1DUyAqLworICAgIG5leHRzdGVwX3UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM5IE5lWFQgICAgKi8KKyAgICBkZ2lfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0MCBER0kgICAgICovCisgICAgbWFjbGF0aW5fdSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDEgTWFjaW50b3NoIExhdGluICAqLworICAgIGhwcm9tYW44X3UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQyIEhQIFJvbWFuIDggICAgICAgKi8KKyAgICBjcDQzN191LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0MyBDUDQzNyAtIE9yaWdpbmFsICovCisgICAgY3A4NTBfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDQgQ1A4NTAgLSBXIEV1cm9wZSAqLworICAgIGNwODUyX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ1IENQODUyIC0gRSBFdXJvcGUgKi8KKyAgICBjcDg1N191LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0NiBDUDg1NyAtIFR1cmtpc2ggICovCisgICAgY3A4NjJfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDcgQ1A4NjIgLSBIZWJyZXcgICAqLworICAgIGNwODY0X3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4IENQODY0IC0gQXJhYmljICAgKi8KKyAgICBjcDg2Nl91LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OSBDUDg2NiAtIEN5cmlsbGljICovCisgICAgY3A4NjlfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTAgQ1A4NjkgLSBHcmVlayAgICAqLworICAgIGRlY3NwZWNfdSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUxIERFQyBTcGVjaWFsIEdyYXBoaWNzICovCisgICAgZGVjdGVjaF91LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTIgREVDIFRlY2huaWNhbCAqLworICAgIGMwcGljc191LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUzIEMwIFBpY3R1cmVzICovCisgICAgYzFwaWNzX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTQgQzEgUGljdHVyZXMgKi8KKyAgICBzbWlsZXlfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NSBJQk0gQzAgR3JhcGhpY3MgKi8KKyAgICBoZWF0aDE5Z191LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NiBIZWF0aCAxOSBncmFwaGljcyAqLworICAgIHR2aWdfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU3IFRWSSBncmFwaGljcyAqLworICAgIHd5c2VfZ25fdSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU4IFd5c2UgNjAgbm9ybWFsLW1vZGUgZ3JhcGhpY3MgKi8KKyAgICB3eXNlX2cxX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1OSBXeXNlIDYwIGdyYXBoaWNzIDEgKi8KKyAgICB3eXNlX2cyX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MCBXeXNlIDYwIGdyYXBoaWNzIDIgKi8KKyAgICB3eXNlX2czX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MSBXeXNlIDYwIGdyYXBoaWNzIDMgKi8KKyAgICBlbG90OTI3X3UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MiBHcmVlayBFTE9UIDkyNyAqLworICAgIGRnc3BlY191LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDYzIERHIFNwZWNpYWwgZ3JhcGhpY3MgKi8KKyAgICBkZ2xpbmVfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2NCBERyBMaW5lIGRyYXdpbmcgKi8KKyAgICBkZ3dvcmRfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2NSBERyBXb3JkIHByb2Nlc3NpbmcgKi8KKyAgICBocGxpbmVfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2NiBIUCBMaW5lIGRyYXdpbmcgKi8KKyAgICBocG1hdGhfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2NyBIUCBNYXRoL1RlY2huaWNhbCAqLworICAgIHFueGdycGhfdSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDY4IFFOWCBHcmFwaGljcyAqLworICAgIHNuaWJyYWNrX3UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDY5IFNOSSBCcmFja2V0cyAqLworICAgIHNuaWV1cm9fdSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcwIFNOSSBFdXJvICovCisgICAgc25pZmFjZXRfdSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogNzEgU05JIEZhY2V0ICovCisgICAgc25paWJtX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNzIgU05JIElCTSAqLworICAgIHNuaWJsYW5rc191LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDczIFNOSSBCbGFua3MgKi8KKyAgICBjcDEyNTJfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3NCBXaW5kb3dzIExhdGluLTEgKi8KKyAgICBjcDEyNTBfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3NSBXaW5kb3dzIExhdGluLTIgKi8KKyAgICBjcDEyNTFfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3NiBXaW5kb3dzIEN5cmlsbGljICovCisgICAgY3AxMjUzX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNzcgV2luZG93cyBHcmVlayAqLworICAgIGNwMTI1NF91LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDc4IFdpbmRvd3MgVHVya2lzaCAqLworICAgIGNwMTI1N191LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDc5IFdpbmRvd3MgTGF0aW4tNCAqLworICAgIGNwODU2X3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDgwIEN5cmlsbGljIFBDIENvZGUgUGFnZSA4NTYgKi8KKyAgICBjcDg1NV91LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4MSBDeXJpbGxpYyBQQyBDb2RlIFBhZ2UgODU2ICovCisgICAgaXNvXzg4NTlfMV91LCAgICAgICAgICAgICAgICAgICAgICAgLyogODIgQ1A4MTkgLSBTYW1lIGFzIDg4NTktMSAqLworICAgIGlzb184ODU5XzJfdSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDgzIENQOTEyIC0gU2FtZSBhcyA4ODU5LTIgKi8KKyAgICBpc29fODg1OV8zX3UsICAgICAgICAgICAgICAgICAgICAgICAvKiA4NCBDUDkxMyAtIFNhbWUgYXMgODg1OS0zICovCisgICAgaXNvXzg4NTlfNF91LCAgICAgICAgICAgICAgICAgICAgICAgLyogODUgQ1A5MTQgLSBTYW1lIGFzIDg4NTktNCAqLworICAgIGlzb184ODU5XzVfdSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDg2IENQOTE1IC0gU2FtZSBhcyA4ODU5LTUgKi8KKyAgICBpc29fODg1OV82X3UsICAgICAgICAgICAgICAgICAgICAgICAvKiA4NyBDUDEwODkgLSBTYW1lIGFzIDg4NTktNiAqLworICAgIGlzb184ODU5XzdfdSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDg4IENQODEzIC0gU2FtZSBhcyA4ODU5LTcgKi8KKyAgICBpc29fODg1OV84X3UsICAgICAgICAgICAgICAgICAgICAgICAvKiA4OSBDUDkxNiAtIFNhbWUgYXMgODg1OS04ICovCisgICAgaXNvXzg4NTlfOV91LCAgICAgICAgICAgICAgICAgICAgICAgLyogOTAgQ1A5MjAgLSBTYW1lIGFzIDg4NTktOSAqLworICAgIGhwcm9tYW44X3UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDkxIENQMTA1MSAtU2FtZSBhcyBIUCBSb21hbiA4ICovCisgICAgY3A4NThfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOTIgQ1A4NTggLSBXIEV1cm9wZSB3L0V1cm8gKi8KKyAgICBpc29fODg1OV8xNV91LCAgICAgICAgICAgICAgICAgICAgICAvKiA5MyBJU08gODg1OS0xNSBMYXRpbiAxNSAqLworICAgIGlzb184ODU5XzE1X3UsICAgICAgICAgICAgICAgICAgICAgIC8qIDk0IENQOTIzIC0gU2FtZSBhcyA4ODU5LTE1ICovCisgICAgaXNvXzg4NTlfN191LCAgICAgICAgICAgICAgICAgICAgICAgLyogOTUgRUxPVDkyOCAtIFNhbWUgYXMgODg1OS03ICovCisgICAgcXVpY2tkcmF3X3UsICAgICAgICAgICAgICAgICAgICAgICAgLyogOTYgQ1AxMDAwMCAtIEFwcGxlIFF1aWNrZHJhdyAqLworICAgIGNwMzdfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDk3IENQMzcgLSBVLlMuIEVCQ0RJQyAqLworICAgIGNwMTI1NV91LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDk4IENQMTI1NSAtIFdpbmRvd3MgSGVicmV3ICovCisgICAgY3AxMjU2X3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOTkgQ1AxMjU2IC0gV2luZG93cyBBcmFiaWMgKi8KKyAgICBjcDEyNThfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDAgQ1AxMjU4IC0gV2luZG93cyBWaWV0IE5hbSAqLworICAgIG1hem92aWFfdSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMSBNYXpvdmlhIFBDIGNvZGUgcGFnZSAqLworICAgIGlkZW50X3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMiBUcmFuc3BhcmVudCAtIG5vIHRyYW5zbGF0aW9uICAqLworICAgIGh6MTUwMF91LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMyBIYXplbHRpbmUgMTUwMC8xNTIwIGdyYXBoaWNzICovCisgICAga29pOHJfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTA0IEtPSTgtUiAqLworICAgIGtvaTh1X3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwNSBLT0k4LVUgKi8KKyAgICBhcGwxX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDYgQVBMIDEgKElTTykgKi8KKyAgICBhcGwyX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDcgQVBMIDIgKEFJWCkgKi8KKyAgICBhcGwzX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDggQVBMIDMgKFBsdXMpICovCisgICAgYXBsNF91LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTA5IEFQTCA0IChJQk0pICovCisgICAgYXBsNV91ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTEwIEFQTCA1ICgyNzQxKSAqLworfTsKKy8qCisgIFRhYmxlIG9mIFVuaWNvZGUtdG8tQmxhaCB0cmFuc2xhdGlvbiBmdW5jdGlvbnMuCisgIEtFRVAgVEhJUyBJTiBTWU5DIFdJVEggVEhFIFRYX2JsYWggREVGSU5JVElUSU9OUyBpbiBja2N1bmkuaCwgYW5kIGFsc28KKyAgd2l0aCB0aGUgdGFibGVzIGFib3ZlLgorKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCisoKnhsX3R4W01BWFRYU0VUUysxXSkoVVNIT1JUKQorI2Vsc2UKKygqeGxfdHhbTUFYVFhTRVRTKzFdKSgpCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyA9IHsKKyAgICB0eF91c2FzY2lpLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMCBVUyBJU08gNjQ2IChBU0NJSSkgKi8KKyAgICB0eF9icml0aXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMSBVSyBJU08gNjQ2ICovCisgICAgdHhfZnJfY2FuYWRpYW4sICAgICAgICAgICAgICAgICAgICAgLyogIDIgQ2FuYWRpYW4gRnJlbmNoIE5SQyAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAzIEN1YmEgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNCBDemVjaG8gKi8KKyAgICB0eF9kYW5pc2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNSBEYW5pc2gvTm9yd2VnaWFuIElTTyA2NDYgKi8KKyAgICB0eF9kdXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNiBEdXRjaCBOUkMgKi8KKyAgICB0eF9maW5uaXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNyBGaW5uaXNoIE5SQyAgKi8KKyAgICB0eF9mcmVuY2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgOCBGcmVuY2ggSVNPIDY0NiAqLworICAgIHR4X2dlcm1hbiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA5IEdlcm1hbiBJU08gNjQ2ICovCisgICAgdHhfaGVicmV3NywgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgSGVicmV3LTcgKERFQykgKi8KKyAgICB0eF9odW5nYXJpYW4sICAgICAgICAgICAgICAgICAgICAgICAvKiAxMSBIdW5nYXJpYW4gSVNPIDY0NiAqLworICAgIHR4X2ljZWxhbmRpYywgICAgICAgICAgICAgICAgICAgICAgIC8qIDEyIEljZWxhbmRpYyAqLworICAgIHR4X2l0YWxpYW4sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEzIEl0YWxpYW4gSVNPIDY0NiAqLworICAgIHR4X2ppczAyMDFyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0IEphcGFuZXNlIFJvbWFuIElTTyA2NDYgKi8KKyAgICB0eF9qaXMwMjAxaywgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNSBKYXBhbmVzZSBLYXRha2FuYSAqLworICAgIHR4X2tvaTcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IFNob3J0IEtPSSAqLworICAgIHR4X2RhbmlzaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE3IE5vcndlZ2lhbi9EYW5pc2ggSVNPIDY0NiAqLworICAgIHR4X3BvcnR1Z3Vlc2UsICAgICAgICAgICAgICAgICAgICAgIC8qIDE4IFBvcnR1Z3Vlc2UgSVNPIDY0NiAqLworICAgIHR4X3NwYW5pc2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE5IHNwYW5pc2ggSVNPIDY0NiAqLworICAgIHR4X3N3ZWRpc2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIwIFN3ZWRpc2ggSVNPIDY0NiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxIFN3ZWRpc2ggSVNPIDY0NiBmb3IgbmFtZXMgKi8KKyAgICB0eF9zd2lzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMiBTd2lzcyBOUkMgICAqLworICAgIHR4X2lkZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIzIElTTyA4ODU5LTEgICovCisgICAgdHhfODg1OV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjQgSVNPIDg4NTktMiAgKi8KKyAgICB0eF84ODU5XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNSBJU08gODg1OS0zICAqLworICAgIHR4Xzg4NTlfNCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2IElTTyA4ODU5LTQgICovCisgICAgdHhfODg1OV81LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjcgSVNPIDg4NTktNSAgKi8gLyogQ3lyaWxsaWMgKi8KKyAgICB0eF84ODU5XzYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyOCBJU08gODg1OS02ICAqLyAvKiBBcmFiaWMgKi8KKyAgICB0eF84ODU5XzcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyOSBJU08gODg1OS03ICAqLyAvKiBHcmVlayAqLworICAgIHR4Xzg4NTlfOCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMwIElTTyA4ODU5LTggICovIC8qIEhlYnJldyAqLworICAgIHR4Xzg4NTlfOSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMxIElTTyA4ODU5LTkgICovIC8qIExhdGluLTUgKi8KKyAgICB0eF84ODU5XzEwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMiBJU08gODg1OS0xMCAqLyAvKiBMYXRpbi02ICovCisgICAgdHhfa29pOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzMgS09JLTggICAgICAgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNCBKSVMtNyAgICAgICAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM1IFNoaWZ0IEpJUyAgICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzYgSmFwYW5lc2UgRVVDIChKQUUpICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzcgSmFwYW5lc2UgREVDIEthbmppICovCisgICAgdHhfZGVjbWNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzggREVDIE1DUyAqLworICAgIHR4X25leHRzdGVwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM5IE5lWFQgICAgKi8KKyAgICB0eF9kZ2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0MCBER0kgICAgICovCisgICAgdHhfbWFjbGF0aW4sICAgICAgICAgICAgICAgICAgICAgICAgLyogNDEgTWFjaW50b3NoIExhdGluICAqLworICAgIHR4X2hwcm9tYW44LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQyIEhQIFJvbWFuIDggICAgICAgKi8KKyAgICB0eF9jcDQzNywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0MyBDUDQzNyAtIE9yaWdpbmFsICovCisgICAgdHhfY3A4NTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDQgQ1A4NTAgLSBXIEV1cm9wZSAqLworICAgIHR4X2NwODUyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ1IENQODUyIC0gRSBFdXJvcGUgKi8KKyAgICB0eF9jcDg1NywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0NiBDUDg1NyAtIFR1cmtpc2ggICovCisgICAgdHhfY3A4NjIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDcgQ1A4NjIgLSBIZWJyZXcgICAqLworICAgIHR4X2NwODY2LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4IENQODY0IC0gQXJhYmljICAgKi8KKyAgICB0eF9jcDg2NiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OSBDUDg2NiAtIEN5cmlsbGljICovCisgICAgdHhfY3A4NjksICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTAgQ1A4NjkgLSBHcmVlayAgICAqLworICAgIE5VTEwsICAgICAgIC8qIERpc3BsYXkgb25seSAqLyAgICAgIC8qIDUxIERFQyBTcGVjaWFsIEdyYXBoaWNzICovCisgICAgTlVMTCwgICAgICAgLyogRGlzcGxheSBvbmx5ICovICAgICAgLyogNTIgREVDIFRlY2huaWNhbCAqLworICAgIE5VTEwsICAgICAgIC8qIERpc3BsYXkgb25seSAqLyAgICAgIC8qIDUzIEMwIFBpY3R1cmVzICovCisgICAgTlVMTCwgICAgICAgLyogRGlzcGxheSBvbmx5ICovICAgICAgLyogNTQgQzEgUGljdHVyZXMgKi8KKyAgICBOVUxMLCAgICAgICAvKiBEaXNwbGF5IG9ubHkgKi8gICAgICAvKiA1NSBJQk0gQzAgR3JhcGhpY3MgKi8KKyAgICBOVUxMLCAgICAgICAvKiBEaXNwbGF5IG9ubHkgKi8gICAgICAvKiA1NiBIZWF0aCAxOSBncmFwaGljcyAqLworICAgIE5VTEwsICAgICAgIC8qIERpc3BsYXkgb25seSAqLyAgICAgIC8qIDU3IFRWSSBncmFwaGljcyAqLworICAgIE5VTEwsICAgICAgIC8qIERpc3BsYXkgb25seSAqLyAgICAgIC8qIDU4IFd5c2UgNjAgbm9ybWFsLW1vZGUgZ3JhcGhpY3MgKi8KKyAgICBOVUxMLCAgICAgICAvKiBEaXNwbGF5IG9ubHkgKi8gICAgICAvKiA1OSBXeXNlIDYwIGdyYXBoaWNzIDEgKi8KKyAgICBOVUxMLCAgICAgICAvKiBEaXNwbGF5IG9ubHkgKi8gICAgICAvKiA2MCBXeXNlIDYwIGdyYXBoaWNzIDIgKi8KKyAgICBOVUxMLCAgICAgICAvKiBEaXNwbGF5IG9ubHkgKi8gICAgICAvKiA2MSBXeXNlIDYwIGdyYXBoaWNzIDMgKi8KKyAgICB0eF9lbG90OTI3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MiBHcmVlayBFTE9UIDkyNyAqLworICAgIE5VTEwsICAgICAgIC8qIERpc3BsYXkgb25seSAqLyAgICAgIC8qIDYzIERHIHNwZWNpYWwgZ3JhcGhpY3MgKi8KKyAgICBOVUxMLCAgICAgICAvKiBEaXNwbGF5IG9ubHkgKi8gICAgICAvKiA2NCBERyBsaW5lLWRyYXdpbmcgKi8KKyAgICBOVUxMLCAgICAgICAvKiBEaXNwbGF5IG9ubHkgKi8gICAgICAvKiA2NSBERyB3b3JkLXByb2Nlc3NpbmcgKi8KKyAgICBOVUxMLCAgICAgICAvKiBEaXNwbGF5IG9ubHkgKi8gICAgICAvKiA2NiBIUCBsaW5lLWRyYXdpbmcgKi8KKyAgICBOVUxMLCAgICAgICAvKiBEaXNwbGF5IG9ubHkgKi8gICAgICAvKiA2NyBIUCBtYXRoL3RlY2hpY2FsICovCisgICAgTlVMTCwgICAgICAgLyogRGlzcGxheSBvbmx5ICovICAgICAgLyogNjggUU5YIEdyYXBoaWNzICovCisgICAgTlVMTCwgICAgICAgLyogRGlzcGxheSBvbmx5ICovICAgICAgLyogNjkgU05JIEJyYWNrZXRzICovCisgICAgTlVMTCwgICAgICAgLyogRGlzcGxheSBvbmx5ICovICAgICAgLyogNzAgU05JIEV1cm8gKi8KKyAgICBOVUxMLCAgICAgICAvKiBEaXNwbGF5IG9ubHkgKi8gICAgICAvKiA3MSBTTkkgRmFjZXQgKi8KKyAgICBOVUxMLCAgICAgICAvKiBEaXNwbGF5IG9ubHkgKi8gICAgICAvKiA3MiBTTkkgSUJNICovCisgICAgTlVMTCwgICAgICAgLyogRGlzcGxheSBvbmx5ICovICAgICAgLyogNzMgU05JIEJsYW5rcyAqLworICAgIHR4X2NwMTI1MiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDc0IFdpbmRvd3MgTGF0aW4tMSAqLworICAgIHR4X2NwMTI1MCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDc1IFdpbmRvd3MgTGF0aW4tMiAqLworICAgIHR4X2NwMTI1MSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDc2IFdpbmRvd3MgQ3lyaWxsaWMgKi8KKyAgICB0eF9jcDEyNTMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3NyBXaW5kb3dzIEdyZWVrICovCisgICAgdHhfY3AxMjU0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNzggV2luZG93cyBUdXJraXNoICovCisgICAgdHhfY3AxMjU3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNzkgV2luZG93cyBMYXRpbi00ICovCisgICAgdHhfY3A4NTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogODAgQ3lyaWxsaWMgUEMgQ29kZSBQYWdlIDg1NiAqLworICAgIHR4X2NwODU1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDgxIEN5cmlsbGljIFBDIENvZGUgUGFnZSA4NTUgKi8KKyAgICB0eF9pZGVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4MiBDUDgxOSAtIFNhbWUgYXMgODg1OS0xICovCisgICAgdHhfODg1OV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogODMgQ1A5MTIgLSBTYW1lIGFzIDg4NTktMiAqLworICAgIHR4Xzg4NTlfMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDg0IENQOTEzIC0gU2FtZSBhcyA4ODU5LTMgKi8KKyAgICB0eF84ODU5XzQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4NSBDUDkxNCAtIFNhbWUgYXMgODg1OS00ICovCisgICAgdHhfODg1OV81LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogODYgQ1A5MTUgLSBTYW1lIGFzIDg4NTktNSAqLworICAgIHR4Xzg4NTlfNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDg3IENQMTA4OSAtIFNhbWUgYXMgODg1OS02ICovCisgICAgdHhfODg1OV83LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogODggQ1A4MTMgLSBTYW1lIGFzIDg4NTktNyAqLworICAgIHR4Xzg4NTlfOCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDg5IENQOTE2IC0gU2FtZSBhcyA4ODU5LTggKi8KKyAgICB0eF84ODU5XzksICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA5MCBDUDkyMCAtIFNhbWUgYXMgODg1OS05ICovCisgICAgdHhfaHByb21hbjgsICAgICAgICAgICAgICAgICAgICAgICAgLyogOTEgQ1AxMDUxIC1TYW1lIGFzIEhQIFJvbWFuIDggKi8KKyAgICB0eF9jcDg1OCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA5MiBDUDg1OCAtIFcgRXVyb3BlIHcvRXVybyAqLworICAgIHR4Xzg4NTlfMTUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDkzIElTTyA4ODU5LTE1IExhdGluIDE1ICovCisgICAgdHhfODg1OV8xNSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogOTQgQ1A5MjMgLSBTYW1lIGFzIExhdGluIDE1ICovCisgICAgdHhfODg1OV83LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOTUgRUxPVDkyOCAtIFNhbWUgYXMgODg1OS03ICovCisgICAgdHhfcXVpY2tkcmF3LCAgICAgICAgICAgICAgICAgICAgICAgLyogOTYgQ1AxMDAwMCAtIEFwcGxlIFF1aWNrZHJhdyAqLworICAgIHR4X2NwMzcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDk3IENQMzcgLSBVLlMuIEVCQ0RJQyAqLworICAgIHR4X2NwMTI1NSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDk4IENQMTI1NSAtIFdpbmRvd3MgSGVicmV3ICovCisgICAgdHhfY3AxMjU2LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOTkgQ1AxMjU2IC0gV2luZG93cyBBcmFiaWMgKi8KKyAgICB0eF9jcDEyNTgsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDAgQ1AxMjU4IC0gV2luZG93cyBWaWV0IE5hbSAqLworICAgIHR4X21hem92aWEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMSBNYXpvdmlhICBQQyBjb2RlIHBhZ2UgKi8KKyAgICB0eF9pZGVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDIgVHJhbnNwYXJlbnQgLSBubyB0cmFuc2xhdGlvbiAqLworICAgIE5VTEwsICAgICAgIC8qIERpc3BsYXkgb25seSAqLyAgICAgIC8qIDEwMyBIYXplbHRpbmUgMTUwMC8xNTIwIGdyYXBoaWNzICovCisgICAgdHhfa29pOHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTA0IEtPSTgtUiAqLworICAgIHR4X2tvaTh1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwNSBLT0k4LVUgKi8KKyAgICB0eF9hcGwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDYgQVBMIDEgKElTTykgKi8KKyAgICB0eF9hcGwyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDcgQVBMIDIgKEFJWCkgKi8KKyAgICB0eF9hcGwzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDggQVBMIDMgKFBsdXMpICovCisgICAgdHhfYXBsNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTA4IEFQTCA0IChJQk0pICovCisgICAgdHhfYXBsNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTEwIEFQTCA1ICgyNzQxKSAqLworfTsKKworLyoKKyAgVGFibGUgb2YgRkNTLXRvLVVuaWNvZGUgdHJhbnNsYXRpb24gZnVuY3Rpb25zLgorICBLRUVQIFRISVMgSU4gU1lOQyBXSVRIIFRIRSBGQ19ibGFoIERFRklOSVRJVElPTlMgaW4gY2t1eGxhLmguCisqLworVVNIT1JUCisjaWZkZWYgQ0tfQU5TSUMKKygqeGxfZmN1W01BWEZDU0VUUysxXSkoQ0hBUikKKyNlbHNlCisoKnhsX2ZjdVtNQVhGQ1NFVFMrMV0pKCkKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworPSB7CisgICAgYXNjaWlfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDAgVVMgSVNPIDY0NiAoQVNDSUkpICovCisgICAgYnJpdGlzaF91LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDEgVUsgSVNPIDY0NiAqLworICAgIGR1dGNoX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAyIER1dGNoIE5SQyAqLworICAgIGZpbm5pc2hfdSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAzIEZpbm5pc2ggTlJDICAqLworICAgIGZyZW5jaF91LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA0IEZyZW5jaCBJU08gNjQ2ICovCisgICAgZnJfY2FuYWRpYW5fdSwgICAgICAgICAgICAgICAgICAgICAgLyogIDUgQ2FuYWRpYW4gRnJlbmNoIE5SQyAqLworICAgIGdlcm1hbl91LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA2IEdlcm1hbiBJU08gNjQ2ICovCisgICAgaHVuZ2FyaWFuX3UsICAgICAgICAgICAgICAgICAgICAgICAgLyogIDcgSHVuZ2FyaWFuIElTTyA2NDYgKi8KKyAgICBpdGFsaWFuX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgOCBJdGFsaWFuIElTTyA2NDYgKi8KKyAgICBkYW5pc2hfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgOSBEYW5pc2gvTm9yd2VnaWFuIElTTyA2NDYgKi8KKyAgICBwb3J0dWd1ZXNlX3UsICAgICAgICAgICAgICAgICAgICAgICAvKiAxMCBQb3J0dWd1ZXNlIElTTyA2NDYgKi8KKyAgICBzcGFuaXNoX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMSBzcGFuaXNoIElTTyA2NDYgKi8KKyAgICBzd2VkaXNoX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMiBTd2VkaXNoIElTTyA2NDYgKi8KKyAgICBzd2lzc191LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMyBTd2lzcyBOUkMgICAqLworICAgIGlzb184ODU5XzFfdSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0IElTTyA4ODU5LTEgTGF0aW4tMSAqLworICAgIGlzb184ODU5XzJfdSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDE1IElTTyA4ODU5LTIgTGF0aW4tMiAqLworICAgIGRlY21jc191LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IERFQyBNQ1MgKi8KKyAgICBuZXh0c3RlcF91LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNyBOZVhUICovCisgICAgY3A0MzdfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTggQ1A0MzcgLSBPcmlnaW5hbCAqLworICAgIGNwODUwX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE5IENQODUwIC0gVyBFdXJvcGUgKi8KKyAgICBjcDg1Ml91LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMCBDUDg1MiAtIEUgRXVyb3BlICovCisgICAgcXVpY2tkcmF3X3UsICAgICAgICAgICAgICAgICAgICAgICAgLyogMjEgQ1AxMDAwMCAtIEFwcGxlIFF1aWNrZHJhdyAqLworICAgIGRnaV91LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIyIERHSSAqLworICAgIGhwcm9tYW44X3UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIzIEhQIFJvbWFuIDggKi8KKyAgICBpc29fODg1OV81X3UsICAgICAgICAgICAgICAgICAgICAgICAvKiAyNCBJU08gODg1OS01IEN5cmlsbGljICovCisgICAgY3A4NjZfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjUgQ1A4NjYgLSBDeXJpbGxpYyAqLworICAgIGtvaTdfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2IFNob3J0IEtPSSAqLworICAgIGtvaThfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI3IEtPSS04ICAgICAgICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjggSklTLTcgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyOSBTaGlmdC1KSVMgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMCBKYXBhbmVzZSBFVUMgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMSBERUMgS2FuamkgKi8KKyAgICBoZWJyZXc3X3UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMiBIZWJyZXctNyAoREVDKSAqLworICAgIGlzb184ODU5XzhfdSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDMzIElTTyA4ODU5LTggSGVicmV3ICovCisgICAgY3A4NjJfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzQgQ1A4NjIgSGVicmV3ICovCisgICAgZWxvdDkyN191LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzUgR3JlZWsgRUxPVCA5MjcgKi8KKyAgICBpc29fODg1OV83X3UsICAgICAgICAgICAgICAgICAgICAgICAvKiAzNiBJU08gODg1OS03IEdyZWVrICovCisgICAgY3A4NjlfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzcgQ1A4NjkgR3JlZWsgKi8KKyAgICBpc29fODg1OV8xNV91LCAgICAgICAgICAgICAgICAgICAgICAvKiAzOCBJU08gODg1OS0xNSBMYXRpbi05ICovCisgICAgY3A4NThfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzkgQ1A4NTggLSBXIEV1cm9wZSB3L0V1cm8gKi8KKyAgICBjcDg1NV91LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0MCBDeXJpbGxpYyBQQyBDb2RlIFBhZ2UgODU2ICovCisgICAgY3AxMjUxX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDEgV2luZG93cyBDeXJpbGxpYyAqLworICAgIGNwODU2X3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQyIEJ1bGdhcmlhbiBQQyBDb2RlIFBhZ2UgODU2ICovCisgICAgY3AxMjUwX3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDMgV2luZG93cyBMYXRpbi0yICovCisgICAgbWF6b3ZpYV91LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDQgTWF6b3ZpYSBQQyBjb2RlIHBhZ2UgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0NSBVQ1MtMiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ2IFVURi04ICovCisgICAga29pOHJfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDcgS09JOC1SICovCisgICAga29pOHVfdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDggS09JOC1VICovCisgICAgY3AxMjUyX3UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDkgQ1AxMjUyICovCit9OworCisvKgorICBUYWJsZSBvZiBVbmljb2RlLXRvLUZDUyB0cmFuc2xhdGlvbiBmdW5jdGlvbnMuCisgIEtFRVAgVEhJUyBJTiBTWU5DIFdJVEggVEhFIEZDX2JsYWggREVGSU5JVElUSU9OUyBpbiBja3V4bGEuaC4KKyovCitpbnQKKyNpZmRlZiBDS19BTlNJQworKCp4bF91ZmNbTUFYRkNTRVRTKzFdKShVU0hPUlQpCisjZWxzZQorKCp4bF91ZmNbTUFYRkNTRVRTKzFdKSgpCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKz0geworICAgIHR4X3VzYXNjaWksICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAwIFVTIElTTyA2NDYgKEFTQ0lJKSAqLworICAgIHR4X2JyaXRpc2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxIFVLIElTTyA2NDYgKi8KKyAgICB0eF9kdXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMiBEdXRjaCBOUkMgKi8KKyAgICB0eF9maW5uaXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMyBGaW5uaXNoIE5SQyAgKi8KKyAgICB0eF9mcmVuY2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNCBGcmVuY2ggSVNPIDY0NiAqLworICAgIHR4X2ZyX2NhbmFkaWFuLCAgICAgICAgICAgICAgICAgICAgIC8qICA1IENhbmFkaWFuIEZyZW5jaCBOUkMgKi8KKyAgICB0eF9nZXJtYW4sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNiBHZXJtYW4gSVNPIDY0NiAqLworICAgIHR4X2h1bmdhcmlhbiwgICAgICAgICAgICAgICAgICAgICAgIC8qICA3IEh1bmdhcmlhbiBJU08gNjQ2ICovCisgICAgdHhfaXRhbGlhbiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDggSXRhbGlhbiBJU08gNjQ2ICovCisgICAgdHhfZGFuaXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDkgRGFuaXNoL05vcndlZ2lhbiBJU08gNjQ2ICovCisgICAgdHhfcG9ydHVndWVzZSwgICAgICAgICAgICAgICAgICAgICAgLyogMTAgUG9ydHVndWVzZSBJU08gNjQ2ICovCisgICAgdHhfc3BhbmlzaCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTEgc3BhbmlzaCBJU08gNjQ2ICovCisgICAgdHhfc3dlZGlzaCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTIgU3dlZGlzaCBJU08gNjQ2ICovCisgICAgdHhfc3dpc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTMgU3dpc3MgTlJDICAgKi8KKyAgICB0eF9pZGVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNCBJU08gODg1OS0xIExhdGluLTEgKi8KKyAgICB0eF84ODU5XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNSBJU08gODg1OS0yIExhdGluLTIgKi8KKyAgICB0eF9kZWNtY3MsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiBERUMgTUNTICovCisgICAgdHhfbmV4dHN0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgLyogMTcgTmVYVCAqLworICAgIHR4X2NwNDM3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE4IENQNDM3IC0gT3JpZ2luYWwgKi8KKyAgICB0eF9jcDg1MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxOSBDUDg1MCAtIFcgRXVyb3BlICovCisgICAgdHhfY3A4NTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjAgQ1A4NTIgLSBFIEV1cm9wZSAqLworICAgIHR4X3F1aWNrZHJhdywgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxIENQMTAwMDAgLSBBcHBsZSBRdWlja2RyYXcgKi8KKyAgICB0eF9kZ2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMiBER0kgKi8KKyAgICB0eF9ocHJvbWFuOCwgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMyBIUCBSb21hbiA4ICovCisgICAgdHhfODg1OV81LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjQgSVNPIDg4NTktNSBDeXJpbGxpYyAqLworICAgIHR4X2NwODY2LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI1IENQODY2IC0gQ3lyaWxsaWMgKi8KKyAgICB0eF9rb2k3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNiBTaG9ydCBLT0kgKi8KKyAgICB0eF9rb2k4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNyBLT0ktOCAgICAgICAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI4IEpJUy03ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjkgU2hpZnQtSklTICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzAgSmFwYW5lc2UgRVVDICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzEgREVDIEthbmppICovCisgICAgdHhfaGVicmV3NywgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzIgSGVicmV3LTcgKERFQykgKi8KKyAgICB0eF84ODU5XzgsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMyBJU08gODg1OS04IEhlYnJldyAqLworICAgIHR4X2NwODYyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM0IENQODYyIEhlYnJldyAqLworICAgIHR4X2Vsb3Q5MjcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM1IEdyZWVrIEVMT1QgOTI3ICovCisgICAgdHhfODg1OV83LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzYgSVNPIDg4NTktNyBHcmVlayAqLworICAgIHR4X2NwODY5LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM3IENQODY5IEdyZWVrICovCisgICAgdHhfODg1OV8xNSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzggSVNPIDg4NTktMTUgTGF0aW4tOSAqLworICAgIHR4X2NwODU4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM5IENQODU4IC0gVyBFdXJvcGUgdy9FdXJvICovCisgICAgdHhfY3A4NTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDAgQ3lyaWxsaWMgUEMgQ29kZSBQYWdlIDg1NiAqLworICAgIHR4X2NwMTI1MSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQxIFdpbmRvd3MgQ3lyaWxsaWMgKi8KKyAgICB0eF9jcDg1NiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0MiBCdWxnYXJpYW4gUEMgQ29kZSBQYWdlIDg1NiAqLworICAgIHR4X2NwMTI1MCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQzIFdpbmRvd3MgTGF0aW4tMiAqLworICAgIHR4X21hem92aWEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ0IE1hem92aWEgUEMgY29kZSBwYWdlICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDUgVUNTLTIgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0NiBVVEYtOCAqLworICAgIHR4X2tvaThyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ3IEtPSTgtUiAqLworICAgIHR4X2tvaTh1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4IEtPSTgtVSAqLworICAgIHR4X2NwMTI1MiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ5IENQMTI1MiAqLworfTsKKworLyoKKyAgVGFibGUgb2YgVENTLXRvLVVuaWNvZGUgdHJhbnNsYXRpb24gZnVuY3Rpb25zLgorICBLRUVQIFRISVMgSU4gU1lOQyBXSVRIIFRIRSBUQ19ibGFoIERFRklOSVRJT05TIGluIGNrdXhsYS5oLgorKi8KK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCisoKnhsX3RjdVtNQVhUQ1NFVFMrMV0pKENIQVIpCisjZWxzZQorKCp4bF90Y3VbTUFYVENTRVRTKzFdKSgpCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKz0geworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAwID0gVHJhbnNwYXJlbnQgKi8KKyAgICBhc2NpaV91LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMSA9IEFTQ0lJICovCisgICAgaXNvXzg4NTlfMV91LCAgICAgICAgICAgICAgICAgICAgICAgLyogIDIgSVNPIDg4NTktMSBMYXRpbi0xICovCisgICAgaXNvXzg4NTlfMl91LCAgICAgICAgICAgICAgICAgICAgICAgLyogIDMgSVNPIDg4NTktMiBMYXRpbi0yICovCisgICAgaXNvXzg4NTlfNV91LCAgICAgICAgICAgICAgICAgICAgICAgLyogIDQgSVNPIDg4NTktNSBDeXJpbGxpYyAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA1IEphcGFuZXNlIEVVQyAqLworICAgIGlzb184ODU5XzhfdSwgICAgICAgICAgICAgICAgICAgICAgIC8qICA2IElTTyA4ODU5LTggSGVicmV3ICovCisgICAgaXNvXzg4NTlfN191LCAgICAgICAgICAgICAgICAgICAgICAgLyogIDcgSVNPIDg4NTktNyBHcmVlayAqLworICAgIGlzb184ODU5XzE1X3UsICAgICAgICAgICAgICAgICAgICAgIC8qICA4IElTTyA4ODU5LTE1IExhdGluLTkgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgOSBVQ1MtMiAqLworICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwIFVURi04ICovCit9OworCisKKy8qCisgIFRhYmxlIG9mIFVuaWNvZGUtdG8tVENTIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucy4KKyAgS0VFUCBUSElTIElOIFNZTkMgV0lUSCBUSEUgVENfYmxhaCBERUZJTklUSU9OUyBpbiBja3V4bGEuaC4KKyovCitpbnQKKyNpZmRlZiBDS19BTlNJQworKCp4bF91dGNbTUFYVENTRVRTKzFdKShVU0hPUlQpCisjZWxzZQorKCp4bF91dGNbTUFYVENTRVRTKzFdKSgpCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKz0geworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAwID0gVHJhbnNwYXJlbnQgKi8KKyAgICB0eF91c2FzY2lpLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMSA9IEFTQ0lJICovCisgICAgdHhfaWRlbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDIgSVNPIDg4NTktMSBMYXRpbi0xICovCisgICAgdHhfODg1OV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDMgSVNPIDg4NTktMiBMYXRpbi0yICovCisgICAgdHhfODg1OV81LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDQgSVNPIDg4NTktNSBDeXJpbGxpYyAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA1IEphcGFuZXNlIEVVQyAqLworICAgIHR4Xzg4NTlfOCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA2IElTTyA4ODU5LTggSGVicmV3ICovCisgICAgdHhfODg1OV83LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDcgSVNPIDg4NTktNyBHcmVlayAqLworICAgIHR4Xzg4NTlfMTUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA4IElTTyA4ODU5LTE1IExhdGluLTkgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgOSBVQ1MtMiAqLworICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwIFVURi04ICovCit9OworCisjaWZkZWYgQ09NTUVOVAorLyoKKyAgVGhlIFVURjggY29udmVyc2lvbnMgYXJlIGJhc2VkIG9uIHRoZSBDb252ZXJ0VVRGIGZ1bmN0aW9ucyB3cml0dGVuCisgIGJ5IE1hcmsgRS4gRGF2aXMsIGNvcHlyaWdodCAxOTk0IFRhbGlnZW50LCBJbmMuCisKKyAgVGFibGVzIGZvciB1c2UgaW4gY2FsY3VsYXRpbmcgVVRGOCBjb252ZXJzaW9ucy4gIFRoZXNlIGNvbnRhaW4KKyAgc3VwcG9ydCBmb3IgSVNPLTEwNjQ2IHdoaWNoIHN1cHBvcnRzIGEgMzEtYml0IGNoYXIgc2l6ZS4KKworICBOT1RFOiAweG5ublVMIGlzIE5PVCBwb3J0YWJsZSEKKyovCitVTE9ORworb2Zmc2V0c0Zyb21VVEY4WzddID0geworI2lmZGVmIENLX0FOU0lDCisgICAgMHgwMDAwMDAwMFVMLCAvKiBJZ25vcmVkICovCisgICAgMHgwMDAwMDAwMFVMLCAweDAwMDAzMDgwVUwsIDB4MDAwRTIwODBVTCwKKyAgICAweDAzQzgyMDgwVUwsIDB4RkEwODIwODBVTCwgMHg4MjA4MjA4MFVMCisjZWxzZQorICAgIDB4MDAwMDAwMDBMLCAvKiBJZ25vcmVkICovCisgICAgMHgwMDAwMDAwMEwsIDB4MDAwMDMwODBMLCAweDAwMEUyMDgwTCwKKyAgICAweDAzQzgyMDgwTCwgKHVuc2lnbmVkKSAweEZBMDgyMDgwTCwgKHVuc2lnbmVkKSAweDgyMDgyMDgwTAorI2VuZGlmIC8qIENLX0FOU0lDICovCit9OworCitDSEFSIGJ5dGVzSW5VVEY4WzI1Nl0gPSB7CisgICAgMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKyAgICAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorICAgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisgICAgMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKyAgICAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorICAgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisgICAgMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwgMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKKyAgICAzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLCA0LDQsNCw0LDQsNCw0LDQsNSw1LDUsNSw2LDYsNiw2Cit9OworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworQ0hBUiBmaXJzdEJ5dGVNYXJrWzddID0gezB4MDAsIDB4MDAsIDB4QzAsIDB4RTAsIDB4RjAsIDB4RjgsIDB4RkN9OworCisvKgorICB1dGY4X3RvX3VjczIoKSB0YWtlcyBvbmUgVVRGLTggYnl0ZSBhdCBhIHRpbWUuICBJdCByZXR1cm5zIGEgcG9pbnRlciB0aGUKKyAgVUNTLTIgY2hhcmFjdGVyIGlmIGFuZCBvbmx5IGlmIHRoZSBlbnRpcmUgVVRGLTggc3RyaW5nIGhhcyBiZWVuIHJlY2VpdmVkLgorICBSZXR1cm4gdmFsdWVzOgorICAgMDogQ29tcGxldGUgVVRGLTggc2VxdWVuY2UgcmVjZWl2ZWQ7IHVjczIgcG9pbnRzIHRvIHZhbGlkIHVjczIgY2hhcmFjdGVyLgorICA+MDogVVRGLTggc2VxdWVuY2UgaW5jb21wbGV0ZSwgaWdub3JlIHVjczIgdmFsdWUuCisgIDwwOiBVVEYtOCBlcnJvciwgMHhmZmZkIHNob3VsZCBiZSBpbnNlcnRlZCBCRUZPUkUgdGhlIHVjczIgdmFsdWUuCisKKyAgTk9URTogQSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXR1cm5lZCBvbmx5IHdoZW4gdHdvIHJldHVybiB2YWx1ZXMgYXJlIGluZGljYXRlZCwKKyAgZS5nLiB3aGVuIGEgVVRGLTggc2VxdWVuY2UgaXMgaW50ZXJydXB0ZWQgYnkgYW4gQVNDSUkgY2hhci4gIEluIHRoaXMgY2FzZQorICB0aGUgaW5jb21wbGV0ZSBVVEYtOCBzZXF1ZW5jZSBtdXN0IGJlIHJlcGxhY2VkIGJ5IDB4ZmZmZCwgYW5kIHRoZW4gdGhlIEFTQ0lJCisgIGNoYXJhY3RlciBpcyBrZXB0IGFzLWlzLiAgSW4gb3RoZXIgZXJyb3IgY2FzZXMsIHVjczIgaXMgc2V0IHRvIDB4ZmZmZCBhbmQKKyAgdGhlIHJldHVybiB2YWx1ZSBpcyAwLgorKi8KKyNkZWZpbmUgVVRGQlVGU0laIDE2CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit1dGY4X3RvX3VjczIoQ0hBUiBjaCwgVVNIT1JUICoqIHVjczIpCisjZWxzZQordXRmOF90b191Y3MyKGNoLCB1Y3MyKSBDSEFSIGNoOyBVU0hPUlQgKiogdWNzMjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHN0YXRpYyBVU0hPUlQgdWNzMnJldHVybiA9IDA7CisKKyNpZmRlZiBDT01NRU5UCisgICAgLyogVW5pY29kZSBDb25zb3J0aXVtIHNhbXBsZSBjb2RlIHdvcmtzIG9ubHkgd2l0aCB3ZWxsLWZvcm1lZCBVVEY4ICovCisKKyAgICBpbnQgaSA9IDA7CisgICAgc3RhdGljIGludCBsZW4gPSAwOworICAgIHN0YXRpYyBDSEFSIHV0ZjhbVVRGQlVGU0laXSA9IHsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9OworICAgIFVMT05HIHVjczQgPSAwOworCisgICAgdXRmOFtsZW4rK10gPSBjaDsgICAgICAgICAgICAgICAgICAgLyogQWRkIGNoYXIgdG8gc3RyaW5nIHRvIHByb2Nlc3MgKi8KKworICAgIGlmIChsZW4gPCBieXRlc0luVVRGOFt1dGY4WzBdXSkgICAgIC8qIE5lZWQgbW9yZSBieXRlcyAqLworICAgICAgcmV0dXJuKGJ5dGVzSW5VVEY4W3V0ZjhbMF1dIC0gbGVuKTsKKworICAgIHN3aXRjaCAobGVuKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIEhhdmUgY29tcGxldGUgc2VxdWVuY2UuLi4gKi8KKyAgICAgIGNhc2UgNjogdWNzNCArPSB1dGY4W2krK107IHVjczQgPDw9IDY7IC8qIChmYWxsLXRocnUgaXMgaW50ZW50aW9uYWwpICovCisgICAgICBjYXNlIDU6IHVjczQgKz0gdXRmOFtpKytdOyB1Y3M0IDw8PSA2OworICAgICAgY2FzZSA0OiB1Y3M0ICs9IHV0ZjhbaSsrXTsgdWNzNCA8PD0gNjsKKyAgICAgIGNhc2UgMzogdWNzNCArPSB1dGY4W2krK107IHVjczQgPDw9IDY7CisgICAgICBjYXNlIDI6IHVjczQgKz0gdXRmOFtpKytdOyB1Y3M0IDw8PSA2OworICAgICAgY2FzZSAxOiB1Y3M0ICs9IHV0ZjhbaSsrXTsKKyAgICB9CisgICAgdWNzNCAtPSBvZmZzZXRzRnJvbVVURjhbbGVuXTsKKyAgICB1Y3MycmV0dXJuID0gKFVTSE9SVCkodWNzNCAmIDB4RkZGRik7CisjaWZkZWYgREVCVUcKKyAgICAvKiBUaGlzIHNob3dzIHRoYXQgb3VyIHJldHVybiB2YWx1ZSBpcyBpbiB0aGUgcHJldmFpbGluZyBieXRlIG9yZGVyOiAqLworICAgIC8qIGUuZy4gTEUgb24gUEMsIEJFIG9uIFNwYXJjLiAqLworICAgIGlmIChkZWJsb2cpIHsKKyAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICB1bmlvbiBja19zaG9ydCB4eDsKKyAgICAgICAgeHgueF9zaG9ydCA9IHVjczJyZXR1cm47CisgICAgICAgIHNwcmludGYoYnVmLCIlMDRYIix1Y3MycmV0dXJuKTsKKyAgICAgICAgZGVidWcoRjExMSwidXRmOF90b191Y3MyIHNob3J0IixidWYsdWNzMnJldHVybik7CisgICAgICAgIGRlYnVnKEYxMDEsInV0ZjhfdG9fdWNzMiBjaGFyWzBdIiwiIix4eC54X2NoYXJbMF0pOworICAgICAgICBkZWJ1ZyhGMTAxLCJ1dGY4X3RvX3VjczIgY2hhclsxXSIsIiIseHgueF9jaGFyWzFdKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAqdWNzMiA9ICZ1Y3MycmV0dXJuOworICAgIGxlbiA9IDA7CisgICAgcmV0dXJuKDApOworI2Vsc2UKKyAgICAvKgorICAgICAgIFJvYnVzdGVyIGNvZGUgYWRhcHRlZCBmcm9tIFRob21hcyBEaWNrZXksIFhmcmVlODYsCisgICAgICAgcmVjb21tZW5kZWQgYnkgTWFya3VzIEt1aG4uCisgICAgKi8KKyAgICBzdGF0aWMgaW50IHV0ZmNvdW50ID0gMDsgICAgICAgICAgICAvKiBQb3NpdGlvbiBpbiBVVEYgc2VxdWVuY2UgKi8KKyAgICBpbnQgdXRmZXJyb3IgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBtYWxmb3JtZWQgVVRGICovCisgICAgdW5zaWduZWQgYyA9IGNoOyAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnl0ZSAqLworICAgIGludCBoYXZldWNzMiA9IDA7CisKKyAgICBpZiAoY2ggPCAweDgwKSB7ICAgICAgICAgICAgICAgICAgICAvKiBBU0NJSSBjaGFyLi4uICovCisgICAgICAgIGlmICh1dGZjb3VudCA+IDApICAgICAgICAgICAgICAgLyogTm90IGxlZ2FsIGluIFVURi04IHNlcXVlbmNlICovCisgICAgICAgICAgdXRmZXJyb3IgPSAxOyAgICAgICAgICAgICAgICAgLyogc28gZmxhZyAqLworICAgICAgICBoYXZldWNzMiA9IDE7CisgICAgICAgIHVjczJyZXR1cm4gPSBjaDsgICAgICAgICAgICAgICAgLyogYnV0IGFsc28gcmV0dXJuIGl0ICovCisgICAgICAgIHV0ZmNvdW50ID0gMDsgICAgICAgICAgICAgICAgICAgLyogcmVzZXQgVVRGLTggY291bnQgKi8KKyAgICB9IGVsc2UgaWYgKGNoIDwgMHhjMCkgeyAgICAgICAgICAgICAvKiAweDgwIDw9IGMgPCAweGMwLi4uICovCisgICAgICAgIGlmICh1dGZjb3VudCA8IDEpIHsgICAgICAgICAgICAgLyogTm90IHZhbGlkIGluIGZpcnN0IHBvc2l0aW9uLi4uICovCisgICAgICAgICAgICB1dGZlcnJvciA9IDE7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF5YmUgdmFsaWQgKi8KKyAgICAgICAgICAgIGlmICh1Y3MycmV0dXJuID4gMHgwM2ZmKSB7ICAvKiBWYWx1ZSB3b3VsZCBiZSA+IDB4ZmZmZiAqLworICAgICAgICAgICAgICAgIHV0ZmVycm9yID0gMTsgICAgICAgICAgIC8qIHNvIG5vdCB2YWxpZCAqLworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIE9LLi4uICovCisgICAgICAgICAgICAgICAgdWNzMnJldHVybiA8PD0gNjsgICAgICAgLyogU2hpZnQgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgdWNzMnJldHVybiB8PSAoY2ggJiAweDNmKTsgLyogYW5kIE9SIGluIHRoaXMgYnl0ZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKC0tdXRmY291bnQgPT0gMCkKKyAgICAgICAgICAgICAgaGF2ZXVjczIgPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYyA+PSAweGMwLi4uICovCisgICAgICAgIGlmICh1dGZjb3VudCA+IDApCisgICAgICAgICAgdXRmZXJyb3IgPSAxOworICAgICAgICBpZiAoYyA8IDB4ZTApIHsKKyAgICAgICAgICAgIHV0ZmNvdW50ID0gMTsKKyAgICAgICAgICAgIHVjczJyZXR1cm4gPSAoYyAmIDB4MWYpOworICAgICAgICAgICAgaGF2ZXVjczIgPSAxOworICAgICAgICB9IGVsc2UgaWYgKGMgPCAweGYwKSB7CisgICAgICAgICAgICB1dGZjb3VudCA9IDI7CisgICAgICAgICAgICB1Y3MycmV0dXJuID0gKGMgJiAweDBmKTsKKyAgICAgICAgICAgIGhhdmV1Y3MyID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChjIDwgMHhmOCkgeworICAgICAgICAgICAgdXRmY291bnQgPSAzOworICAgICAgICAgICAgdWNzMnJldHVybiA9IChjICYgMHgwNyk7CisgICAgICAgICAgICBoYXZldWNzMiA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4ZmMpIHsKKyAgICAgICAgICAgIHV0ZmNvdW50ID0gNDsKKyAgICAgICAgICAgIHVjczJyZXR1cm4gPSAoYyAmIDB4MDMpOworICAgICAgICAgICAgaGF2ZXVjczIgPSAxOworICAgICAgICB9IGVsc2UgaWYgKGMgPCAweGZlKSB7CisgICAgICAgICAgICB1dGZjb3VudCA9IDU7CisgICAgICAgICAgICB1Y3MycmV0dXJuID0gKGMgJiAweDAxKTsKKyAgICAgICAgICAgIGhhdmV1Y3MyID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHV0ZmVycm9yID0gMTsKKyAgICAgICAgICAgIHV0ZmNvdW50ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaGF2ZXVjczIgPT0gMCAmJiB1dGZlcnJvciAhPSAwKSB7CisgICAgICAgIGhhdmV1Y3MyID0gMTsKKyAgICAgICAgdWNzMnJldHVybiA9IDB4ZmZmZDsKKyAgICAgICAgdXRmZXJyb3IgPSAwOworICAgIH0KKyAgICBpZiAoaGF2ZXVjczIpIHsKKyAgICAgICAgKnVjczIgPSAmdWNzMnJldHVybjsKKyAgICAgICAgaWYgKHV0ZmVycm9yKQorICAgICAgICAgIHV0ZmNvdW50ID0gMCAtIHV0ZmNvdW50OworICAgICAgICByZXR1cm4odXRmY291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh1dGZjb3VudCA9PSAwKQorICAgICAgICAgIHV0ZmNvdW50Kys7CisgICAgICAgIHJldHVybih1dGZjb3VudCk7CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KK30KKworLyoKKyAgdWNzMl90b191dGY4KCkgdGFrZXMgb25lIHVjczIgY2hhcmFjdGVyIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggYW5kCisgIGFuZCBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXF1aXZhbGVudCB1dGY4IHN0cmluZy4KKyAgVGhpcyBjb2RlIGNhbiBlYXNpbHkgYmUgYWx0ZXJlZCB0byBzdXBwb3J0IFVDUzQgc2ltcGx5IGJ5IGNoYW5naW5nCisgIHRoZSBpbnB1dCBmcm9tIFVTSE9SVCB0byBVTE9ORy4gIFJldHVybnM6CisgICA+MDogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB1dGY4IHN0cmluZy4KKyAgICAwOiAob3IgbGVzcykgRXJyb3IuCisqLworCitpbnQKKyNpZmRlZiBDS19BTlNJQwordWNzMl90b191dGY4KFVTSE9SVCB1Y3MyLCBDSEFSICoqIHV0ZjgpCisjZWxzZQordWNzMl90b191dGY4KHVjczIsIHV0ZjgpIFVTSE9SVCB1Y3MyOyBDSEFSICoqIHV0Zjg7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBzdGF0aWMgQ0hBUiB1dGY4cmV0dXJuWzhdPXswLDAsMCwwLDAsMCwwLDB9OworICAgIHJlZ2lzdGVyIENPTlNUIFVMT05HIGJ5dGVNYXNrID0gMHhCRjsKKyAgICByZWdpc3RlciBDT05TVCBVTE9ORyBieXRlTWFyayA9IDB4ODA7CisgICAgaW50IHV0ZjhsZW4gPSAwOworICAgIGludCBpID0gMDsKKworICAgIGlmICh1Y3MyIDwgMHg4MCkgeworICAgICAgICB1dGY4bGVuID0gMTsKKyAgICAgICAgZGVidWcoRjEwMSwidWNzMl90b191dGY4IFgxIiwiIix1dGY4bGVuKTsKKyAgICB9IGVsc2UgaWYgKHVjczIgPCAweDgwMCkgeworICAgICAgICB1dGY4bGVuID0gMjsKKyAgICAgICAgZGVidWcoRjEwMSwidWNzMl90b191dGY4IFgyIiwiIix1dGY4bGVuKTsKKyAgICB9IGVsc2UKKyNpZmRlZiBET19VQ1M0CisgICAgICAvKiBUaGlzIGlzIGFsd2F5cyB0cnVlIGZvciBVQ1MtMiBidXQgd291bGQgYmUgbmVlZGVkIGZvciBVQ1MtNCovCisgICAgICAvKiBXaGVuIHVjczIgaXMgVVNIT1JUIHRoaXMgZ2l2ZXMgY29tcGlsZXIgd2FybmluZ3MuICovCisgICAgICBpZiAodWNzMiA8PSAweGZmZmYpCisjZW5kaWYgLyogRE9fVUNTNCAqLworICAgIHsKKyAgICAgICAgdXRmOGxlbiA9IDM7CisgICAgICAgIGRlYnVnKEYxMDEsInVjczJfdG9fdXRmOCBYMyIsIiIsdXRmOGxlbik7CisgICAgfQorI2lmZGVmIERPX1VDUzQKKy8qIFRoZSBmb2xsb3dpbmcgd291bGQgYmUgZm9yIFVDUy00ICovCisgICAgZWxzZSBpZiAodWNzMiA8IDB4MjAwMDAwKSB7CisgICAgICAgIHV0ZjhsZW4gPSA0OworICAgIH0gZWxzZSBpZiAodWNzMiA8IDB4NDAwMDAwMCkgeworICAgICAgICB1dGY4bGVuID0gNTsKKyAgICB9IGVsc2UgaWYgKHVjczIgPD0KKyNpZmRlZiBDS19BTlNJQworICAgICAgICAgICAgICAgMHg3RkZGRkZGRlVMICAgICAgICAgICAgIC8qIChkb2Vzbid0IHJlYWxseSBuZWVkIHRoZSAiVSIpICovCisjZWxzZQorICAgICAgICAgICAgICAgMHg3RkZGRkZGRkwKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworICAgICAgICAgICAgICAgKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIDMxIGJpdHMgPSBtYXggZm9yIFVDUzQgKi8KKyAgICAgICAgdXRmOGxlbiA9IDY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdXRmOGxlbiA9IDI7CisgICAgICAgIHVjczIgPSAweEZGRkQ7ICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZW1lbnQgZm9yIGludmFsaWQgY2hhciAqLworICAgIH0KKyNlbmRpZiAvKiBET19VQ1M0ICovCisgICAgaSA9IHV0ZjhsZW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW50byB1dGY4cmV0dXJuICovCisgICAgdXRmOHJldHVybltpLS1dID0gMDsgICAgICAgICAgICAgICAgLyogTnVsbCB0ZXJtaW5hdGUgdGhlIHN0cmluZyAqLworCisgICAgc3dpdGNoICh1dGY4bGVuKSB7ICAgICAgICAgICAgICAgICAgLyogY29kZSBmYWxscyB0aHJvdWdoIGNhc2VzISAqLworICAgICAgY2FzZSA2OiB1dGY4cmV0dXJuW2ktLV0gPSAodWNzMiB8IGJ5dGVNYXJrKSAmIGJ5dGVNYXNrOyB1Y3MyID4+PSA2OworICAgICAgY2FzZSA1OiB1dGY4cmV0dXJuW2ktLV0gPSAodWNzMiB8IGJ5dGVNYXJrKSAmIGJ5dGVNYXNrOyB1Y3MyID4+PSA2OworICAgICAgY2FzZSA0OiB1dGY4cmV0dXJuW2ktLV0gPSAodWNzMiB8IGJ5dGVNYXJrKSAmIGJ5dGVNYXNrOyB1Y3MyID4+PSA2OworICAgICAgY2FzZSAzOiB1dGY4cmV0dXJuW2ktLV0gPSAodWNzMiB8IGJ5dGVNYXJrKSAmIGJ5dGVNYXNrOyB1Y3MyID4+PSA2OworICAgICAgY2FzZSAyOiB1dGY4cmV0dXJuW2ktLV0gPSAodWNzMiB8IGJ5dGVNYXJrKSAmIGJ5dGVNYXNrOyB1Y3MyID4+PSA2OworICAgICAgY2FzZSAxOiB1dGY4cmV0dXJuW2ktLV0gPSAgdWNzMiB8IGZpcnN0Qnl0ZU1hcmtbdXRmOGxlbl07CisgICAgfQorICAgIGRlYnVnKEYxMTEsInVjczJfdG9fdXRmOCIsdXRmOHJldHVybix1dGY4bGVuKTsKKyAgICAqdXRmOCA9IHV0ZjhyZXR1cm47CisgICAgcmV0dXJuKHV0ZjhsZW4pOworfQorCisvKiAgVVRGLTggZnVuY3Rpb25zLi4uICAqLworCisjaWZkZWYgQ0tfQU5TSUMKK2V4dGVybiBpbnQgKCp4dWYpKFVTSE9SVCk7ICAgICAgICAgICAgICAvKiBUcmFuc2xhdGlvbiBmdW5jdGlvbiBVQ1MgdG8gRkNTICovCitleHRlcm4gVVNIT1JUICgqeGZ1KShDSEFSKTsgICAgICAgICAgICAgLyogVHJhbnNsYXRpb24gZnVuY3Rpb24gRkNTIHRvIFVDUyAqLworI2Vsc2UKK2V4dGVybiBpbnQgKCp4dWYpKCk7CitleHRlcm4gVVNIT1JUICgqeGZ1KSgpOworI2VuZGlmIC8qIENLX0FOU0lDICovCisKKy8qICB1IF8gdCBvIF8gYiAgLS0gIFVURi04IHRvIEJ5dGUgICovCisvKgorICAgIENvbnZlcnRzIGZyb20gVVRGLTggdG8gdGhlIGN1cnJlbnQgdGVybWluYWwgb3IgZmlsZSBjaGFyYWN0ZXIgc2V0LgorICAgIENhbGwgd2l0aDoKKyAgICAgIGM6IGEgc2luZ2xlIGJ5dGUsIHdoaWNoIGlzIHBhcnQgb2YgYSBVVEYtOCBzdHJlYW0uCisgICAgUmV0dXJuczoKKyAgICAgLTk6IEVycm9yLCB3aXRoIHNlY29uZCBjaGFyIHRvIGZvbGxvdyAoY2FsbCB1X3RvX2IyKCkgdG8gZ2V0IGl0KS4KKyAgICAgLTI6IFVDUyBsaW5lL3BhcmFncmFwaCBlbmQgKExTIG9yIFBTKS4KKyAgICAgLTE6IFVURi04IHN0cmVhbSBpcyBpbmNvbXBsZXRlIGFuZCBtb3JlIGlucHV0IGlzIHJlcXVpcmVkLgorICAgICA+PTA6IEJ5dGUgdmFsdWUgb2YgcmVzdWx0LCBwb3NzaWJseSB0aGUgImVycm9yIiBieXRlIChlLmcuICc/JykuCisgICAgUmVxdWlyZXM6CisgICAgICBHbG9iYWwgKCp4dWYpKCkgdG8gcG9pbnQgdG8gYSBmdW5jdGlvbiB0aGF0IHRyYW5zbGF0ZXMgZnJvbSBVQ1MtMiB0bworICAgICAgdGhlIGFwcHJvcHJpYXRlIHRlcm0vZmlsZSBjaGFyYWN0ZXIgc2V0LgorKi8KK3N0YXRpYyBpbnQgc2F2ZWRieXRlID0gMDsKKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGwgaWYgdV90b19iKCkgcmV0dXJucyAtOSAqLwordV90b19iMigpIHsKKyAgICByZXR1cm4oKHVuc2lnbmVkKShzYXZlZGJ5dGUgJiAweGZmKSk7Cit9CisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVVEYtOCB0byBieXRlICovCisjaWZkZWYgQ0tfQU5TSUMKK3VfdG9fYihDSEFSIGMpCisjZWxzZQordV90b19iKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGludCB4OworICAgIFVTSE9SVCAqIHVjczIsIHVjOworICAgIGlmICgheHVmKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIG5vIGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KKyAgICAgIHJldHVybihjKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBjb252ZXJ0IChzaG91bGRuJ3QgaGFwcGVuKS4gKi8KKyAgICB4ID0gdXRmOF90b191Y3MyKGMsJnVjczIpOyAgICAgICAgICAvKiBTZW5kIGZvciBjb252ZXJzaW9uIHRvIFVDUy0yICovCisgICAgaWYgKHggPiAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGRvbmUgeWV0Li4uICovCisgICAgICByZXR1cm4oLTEpOworICAgIHVjID0gKHggPCAwKSA/IDB4ZmZmZCA6ICp1Y3MyOyAgICAgIC8qIERvbmUsIGNoZWNrIHJlc3VsdCAqLworICAgIGlmICh1YyA9PSAweDIwMjggfHwgdWMgPT0gMHgyMDI5KSAgIC8qIExTIG9yIFBTICovCisgICAgICByZXR1cm4oLTIpOworICAgIHJldHVybigodW5zaWduZWQpKCgoKnh1ZikodWMpKSAmIDB4ZmYpKTsgLyogQ29udmVydCBVQ1MtMiB0byBieXRlICovCit9CisKKy8qICBiIF8gdCBvIF8gdSAgLS0gIEJ5dGUgdG8gVVRGLTggICovCisvKgorICBDb252ZXJ0cyBhIGJ5dGUgZnJvbSB0aGUgY3VycmVudCB0ZXJtaW5hbCBvciBmaWxlIGNoYXJhY3RlciBzZXQgdG8gVVRGLTguCisgIENhbGwgd2l0aDoKKyAgICBjLi4uLi4uLi4gVGhlIGJ5dGUgdG8gYmUgY29udmVydGVkLgorICAgIGJ1Zi4uLi4uLiBQb2ludGVyIHRvIGJ1ZmZlciBpbiB3aGljaCB0byBwbGFjZSB0aGUgcmVzdWx0LgorICAgIGJ1Zmxlbi4uLiBMZW5ndGggb2YgdGhlIHJlc3VsdCBidWZmZXIuCisgICAgc2V0c2l6ZS4uIFRoZSBzaXplIG9mIHRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldCAoMTI4IG9yIDI1NikuCisgIFJlcXVpcmVzOgorICAgIEdsb2JhbCAoKnhmdSkoKSB0byBwb2ludCB0byB0aGUgZnVuY3Rpb24gdG8gY29udmVydCB0aGUgYnl0ZSB0byBVQ1MtMi4KKyAgUmV0dXJuczoKKyAgICAtMSBpZiB0aGUgeGZ1IGlzIE5VTEw7IG90aGVyd2lzZToKKyAgICA+MCBpbmRpY2F0aW5nIHRoZSBsZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgVVRGLTggc3RyaW5nLgorICBJZiB0aGUgdHJhbnNsYXRpb24gZmFpbHMsIHRoZSBVbmljb2RlICJSZXBsYWNlbWVudCBDaGFyYWN0ZXIiIGlzIHJldHVybmVkCisgICgweEZGRkQgdHJhbnNsYXRlZCB0byBVVEYtOCA9PSAweEZGQkQpLgorKi8KK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCeXRlIHRvIFVURi04ICovCisjaWZkZWYgQ0tfQU5TSUMKK2JfdG9fdShDSEFSIGMsIENIQVIgKiBidWYsIGludCBidWZsZW4sIGludCBzZXRzaXplKQorI2Vsc2UKK2JfdG9fdShjLCBidWYsIGJ1Zmxlbiwgc2V0c2l6ZSkgQ0hBUiBjLCAqIGJ1ZjsgaW50IGJ1Zmxlbiwgc2V0c2l6ZTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIENIQVIgKiB0bXAgPSBOVUxMOworICAgIGludCBpLCBjb3VudCA9IDA7CisgICAgVVNIT1JUIHVjOworICAgIGlmICgheGZ1KSB7CisgICAgICAgIGRlYnVnKEYxMDAsImJfdG9fdSBubyB4ZnUiLCIiLDApOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICB1YyA9IGM7CisgICAgaWYgKCgoc2V0c2l6ZSA+IDEyOCkgJiYgKGMgJiAweDgwKSkgfHwgc2V0c2l6ZSA8PSAxMjgpIHsKKyAgICAgICAgaWYgKHhmdSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBGQ1MtdG8tVUNTIGZ1bmN0aW9uICovCisgICAgICAgICAgdWMgPSAoKnhmdSkoYyk7CisgICAgfQorICAgIGNvdW50ID0gdWNzMl90b191dGY4KHVjLCZ0bXApOworICAgIGlmIChjb3VudCA8IDApIHsKKyAgICAgICAgYnVmWzBdID0gMHhlZjsgICAgICAgICAgICAgICAgICAvKiA9PSAweEZGRkQgaW4gVVRGLTggKi8KKyAgICAgICAgYnVmWzFdID0gMHhiZjsKKyAgICAgICAgYnVmWzJdID0gMHhiZDsKKyAgICAgICAgYnVmWzNdID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuKDIpOworICAgIH0KKyAgICBpZiAoY291bnQgPj0gYnVmbGVuKSB7CisgICAgICAgIGRlYnVnKEYxMDEsIldBUk5JTkc6IFVURjggYnVmZmVyIG92ZXJmbG93IiwiIixjb3VudCk7CisgICAgICAgIGNvdW50ID0gYnVmbGVuIC0gMTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspICAgICAgICAgLyogQ29weSB0byByZXN1bHQgYnVmZmVyICovCisgICAgICBidWZbaV0gPSB0bXBbaV07CisgICAgYnVmW2ldID0gJ1wwJzsKKyAgICByZXR1cm4oY291bnQpOworfQorCisjaWZuZGVmIE9TMgoraW50Citpc3VuaWNvZGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVsbHMgd2hldGhlciB0aGUgaG9zdCB3ZSBhcmUgKi8KKyNpZmRlZiBDS19BTlNJQyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBydW5uaW5nIG9uIHN1cHBvcnRzIFVuaWNvZGUgKi8KKyAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNwbGF5ICovCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyAgICAgICAgICApIHsKKyNpZmRlZiBOVAorICAgIGV4dGVybiBpbnQgdHRfdW5pY29kZTsKKyNpZmRlZiBLVUkKKyAgICByZXR1cm4odHRfdW5pY29kZSk7CisjZWxzZSAvKiBLVUkgKi8KKyAgICBpZiAodHRfdW5pY29kZSAmJiAhaXNXaW45NSgpKQorICAgICAgcmV0dXJuKDEpOworICAgIGVsc2UKKyAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBLVUkgKi8KKyNlbHNlIC8qIE5UICovCisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIE5UICovCit9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVU5JQ09ERSAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrY3VuaS5oIGIvY2tlcm1pdC04LjAuMjExL2NrY3VuaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTc4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2tjdW5pLmgKQEAgLTAsMCArMSwyNjggQEAKKy8qICBDIEsgQyBVIE4gSSAuIEggIC0tICBVbmljb2RlL1Rlcm1pbmFsIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb25zICAqLworCisvKgorICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorCisgIEF1dGhvcnM6CisgICAgRnJhbmsgZGEgQ3J1eiA8ZmRjQGNvbHVtYmlhLmVkdT4KKyAgICAgIFRoZSBLZXJtaXQgUHJvamVjdCwgQ29sdW1iaWEgVW5pdmVyc2l0eSwgTmV3IFlvcmsgQ2l0eS4KKyAgICBKZWZmcmV5IEUgQWx0bWFuIDxqYWx0bWFuQHNlY3VyZS1lbmRwb2ludHMuY29tPgorICAgICAgU2VjdXJlIEVuZHBvaW50cyBJbmMuLCBOZXcgWW9yayBDaXR5CisKKyovCisKKy8qIFRlcm1pbmFsIGNoYXJhY3RlciBzZXRzICovCisKKyNpZm5kZWYgQ0tPVU5JX0gKKyNkZWZpbmUgQ0tPVU5JX0gKKyNpZmRlZiBPUzIKKyNpZm5kZWYgQ0tPVU5JCisjZGVmaW5lIENLT1VOSSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlIFVOSUNPREUgZm9yIE9TLzIgZnVuY3Rpb25zICovCisjZW5kaWYgLyogQ0tPVU5JICovCisjaWZkZWYgS1VJCisjZGVmaW5lIFhfQ0tPVU5JX0lOICAgICAgICAgICAgICAgICAgICAgLyogVXNlIFVuaWNvZGUgSW5wdXQgKi8KKyNkZWZpbmUgQ0tPVU5JX09VVAorI2VuZGlmIC8qIEtVSSAqLworI2VuZGlmIC8qIE9TMiAqLworCisvKiBUZXJtaW5hbCBDaGFyYWN0ZXIgU2V0cyAqLworCisjZGVmaW5lIFRYX0FTQ0lJICAgICAgICAwICAgICAgICAgICAgICAgLyogVVMgQVNDSUkgKi8KKyNkZWZpbmUgVFhfQlJJVElTSCAgICAgIDEgICAgICAgICAgICAgICAvKiBCcml0aXNoIElTTyA2NDYgKi8KKyNkZWZpbmUgVFhfQ05fRlJFTkNIICAgIDIgICAgICAgICAgICAgICAvKiBDYW5hZGlhbiBGcmVuY2ggTlJDICovCisjZGVmaW5lIFRYX0NVQkFOICAgICAgICAzICAgICAgICAgICAgICAgLyogQ3ViYSAqLworI2RlZmluZSBUWF9DWkVDSCAgICAgICAgNCAgICAgICAgICAgICAgIC8qIEN6ZWNoIFJlcHVibGljICovCisjZGVmaW5lIFRYX0RBTklTSCAgICAgICA1ICAgICAgICAgICAgICAgLyogRGVubWFyayAvIE5vcndheSBJU08gNjQ2ICovCisjZGVmaW5lIFRYX0RVVENIICAgICAgICA2ICAgICAgICAgICAgICAgLyogRHV0Y2ggTlJDICovCisjZGVmaW5lIFRYX0ZJTk5JU0ggICAgICA3ICAgICAgICAgICAgICAgLyogRmlubmlzaCBOUkMgKi8KKyNkZWZpbmUgVFhfRlJFTkNIICAgICAgIDggICAgICAgICAgICAgICAvKiBGcmVuY2ggSVNPIDY0NiAqLworI2RlZmluZSBUWF9HRVJNQU4gICAgICAgOSAgICAgICAgICAgICAgIC8qIEdlcm1hbiBJU08gNjQ2ICovCisjZGVmaW5lIFRYX0hFNyAgICAgICAgIDEwICAgICAgICAgICAgICAgLyogSGVicmV3IDcgKERFQykgKi8KKyNkZWZpbmUgVFhfSFVOR0FSSUFOICAgMTEgICAgICAgICAgICAgICAvKiBIdW5nYXJpYW4gSVNPIDY0NiAqLworI2RlZmluZSBUWF9JQ0VMQU5ESUMgICAxMiAgICAgICAgICAgICAgIC8qIEljZWxhbmRpYyBOUkMgKi8KKyNkZWZpbmUgVFhfSVRBTElBTiAgICAgMTMgICAgICAgICAgICAgICAvKiBJdGFsaWFuIElTTyA2NDYgKi8KKyNkZWZpbmUgVFhfSjIwMVIgICAgICAgMTQgICAgICAgICAgICAgICAvKiBKSVMgMDIwMSBKYXBhbmVzZSBSb21hbiAqLworI2RlZmluZSBUWF9KMjAxSyAgICAgICAxNSAgICAgICAgICAgICAgIC8qIEpJUyAwMjAxIEthdGFrYW5hICovCisjZGVmaW5lIFRYX0tPSTcgICAgICAgIDE2ICAgICAgICAgICAgICAgLyogU2hvcnQgS09JICovCisjZGVmaW5lIFRYX05PUldFR0lBTiAgIDE3ICAgICAgICAgICAgICAgLyogRGVubWFyayAvIE5vcndheSBJU08gNjQ2ICovCisjZGVmaW5lIFRYX1BPUlRVR1VFU0UgIDE4ICAgICAgICAgICAgICAgLyogUG9ydHVndWVzZSBJU08gNjQ2ICovCisjZGVmaW5lIFRYX1NQQU5JU0ggICAgIDE5ICAgICAgICAgICAgICAgLyogU3BhbmlzaCBJU08gNjQ2ICovCisjZGVmaW5lIFRYX1NXRURJU0ggICAgIDIwICAgICAgICAgICAgICAgLyogU3dlZGlzaCBJU08gNjQ2ICovCisjZGVmaW5lIFRYX1NXRV8yICAgICAgIDIxICAgICAgICAgICAgICAgLyogU3dlZGlzaCBmb3IgbmFtZXMgSVNPIDY0NiAqLworI2RlZmluZSBUWF9TV0lTUyAgICAgICAyMiAgICAgICAgICAgICAgIC8qIFN3aXNzIE5SQyAqLworI2RlZmluZSBUWF84ODU5XzEgICAgICAyMyAgICAgICAgICAgICAgIC8qIExhdGluLTEgKi8KKyNkZWZpbmUgVFhfODg1OV8yICAgICAgMjQgICAgICAgICAgICAgICAvKiBMYXRpbi0yICovCisjZGVmaW5lIFRYXzg4NTlfMyAgICAgIDI1ICAgICAgICAgICAgICAgLyogTGF0aW4tMyAqLworI2RlZmluZSBUWF84ODU5XzQgICAgICAyNiAgICAgICAgICAgICAgIC8qIExhdGluLTQgKi8KKyNkZWZpbmUgVFhfODg1OV81ICAgICAgMjcgICAgICAgICAgICAgICAvKiBMYXRpbi9DeXJpbGxpYyAqLworI2RlZmluZSBUWF84ODU5XzYgICAgICAyOCAgICAgICAgICAgICAgIC8qIExhdGluL0FyYWJpYyAqLworI2RlZmluZSBUWF84ODU5XzcgICAgICAyOSAgICAgICAgICAgICAgIC8qIExhdGluL0dyZWVrICovCisjZGVmaW5lIFRYXzg4NTlfOCAgICAgIDMwICAgICAgICAgICAgICAgLyogTGF0aW4vSGVicmV3ICovCisjZGVmaW5lIFRYXzg4NTlfOSAgICAgIDMxICAgICAgICAgICAgICAgLyogTGF0aW4tNSAqLworI2RlZmluZSBUWF84ODU5XzEwICAgICAzMiAgICAgICAgICAgICAgIC8qIExhdGluLTYgKi8KKworI2RlZmluZSBUWF9LT0k4ICAgICAgICAzMyAgICAgICAgICAgICAgIC8qIEdPU1QgMTk3NjgtNzQgS09JLTggKi8KKworI2RlZmluZSBUWF9KSVM3ICAgICAgICAzNCAgICAgICAgICAgICAgIC8qIEpJUy03ICovCisjZGVmaW5lIFRYX1NISklTICAgICAgIDM1ICAgICAgICAgICAgICAgLyogU2hpZnQgSklTICovCisjZGVmaW5lIFRYX0pFVUMgICAgICAgIDM2ICAgICAgICAgICAgICAgLyogSmFwYW5lc2UgRVVDICovCisjZGVmaW5lIFRYX0pERUMgICAgICAgIDM3ICAgICAgICAgICAgICAgLyogSmFwYW5lc2UgREVDIEthbmppICovCisKKyNkZWZpbmUgVFhfREVDTUNTICAgICAgMzggICAgICAgICAgICAgICAvKiBERUMgTUNTICovCisjZGVmaW5lIFRYX05FWFQgICAgICAgIDM5ICAgICAgICAgICAgICAgLyogTmVYVCAqLworI2RlZmluZSBUWF9ER0kgICAgICAgICA0MCAgICAgICAgICAgICAgIC8qIERhdGEgR2VuZXJhbCBJbnRlcm5hdGlvbmFsICovCisjZGVmaW5lIFRYX01BQ0wxICAgICAgIDQxICAgICAgICAgICAgICAgLyogTWFjaW50b3NoIExhdGluLTEgKi8KKyNkZWZpbmUgVFhfSFBSOCAgICAgICAgNDIgICAgICAgICAgICAgICAvKiBIUCBSb21hbiA4ICovCisKKy8qIENvZGUgcGFnZXMgKi8KKworI2RlZmluZSBUWF9DUDQzNyAgICAgICA0MyAgICAgICAgICAgICAgIC8qIE9yaWdpbmFsICovCisjZGVmaW5lIFRYX0NQODUwICAgICAgIDQ0ICAgICAgICAgICAgICAgLyogTXVsdGluYXRpb25hbCAoV2VzdGVybiBFdXJvcGUpICovCisjZGVmaW5lIFRYX0NQODUyICAgICAgIDQ1ICAgICAgICAgICAgICAgLyogRWFzdGVybiBFdXJvcGUgKi8KKyNkZWZpbmUgVFhfQ1A4NTcgICAgICAgNDYgICAgICAgICAgICAgICAvKiBUdXJrZXkgKi8KKyNkZWZpbmUgVFhfQ1A4NjIgICAgICAgNDcgICAgICAgICAgICAgICAvKiBIZWJyZXcgKi8KKyNkZWZpbmUgVFhfQ1A4NjQgICAgICAgNDggICAgICAgICAgICAgICAvKiBBcmFiaWMgKi8KKyNkZWZpbmUgVFhfQ1A4NjYgICAgICAgNDkgICAgICAgICAgICAgICAvKiBDeXJpbGxpYyAqLworI2RlZmluZSBUWF9DUDg2OSAgICAgICA1MCAgICAgICAgICAgICAgIC8qIEdyZWVrICovCisKKyNkZWZpbmUgVFhfREVDU1BFQyAgICAgNTEgICAgICAgICAgICAgICAvKiBERUMgU3BlY2lhbCBHcmFwaGljcyAqLworI2RlZmluZSBUWF9ERUNURUNIICAgICA1MiAgICAgICAgICAgICAgIC8qIERFQyBUZWNobmljYWwgKi8KKyNkZWZpbmUgVFhfQzBQSUNUICAgICAgNTMgICAgICAgICAgICAgICAvKiBDMCBEaXNwbGF5IENvbnRyb2xzICovCisjZGVmaW5lIFRYX0MxUElDVCAgICAgIDU0ICAgICAgICAgICAgICAgLyogQzEgRGlzcGxheSBDb250cm9scyAqLworI2RlZmluZSBUWF9JQk1DMEdSUEggICA1NSAgICAgICAgICAgICAgIC8qIElCTSBDMCBHcmFwaGljcyAoc21pbGV5cykgKi8KKyNkZWZpbmUgVFhfSDE5R1JBUEggICAgNTYgICAgICAgICAgICAgICAvKiBIZWF0aC9aZW5pdGggMTkgR3JhcGhpY3MgKi8KKyNkZWZpbmUgVFhfVFZJR1JBUEggICAgNTcgICAgICAgICAgICAgICAvKiBUZWxldmlkZW8gR3JhcGhpY3MgKi8KKyNkZWZpbmUgVFhfV1lTRTYwR19OICAgNTggICAgICAgICAgICAgICAvKiBXeXNlIDYwIE5hdGl2ZSBNb2RlIEdyYXBoaWNzICovCisjZGVmaW5lIFRYX1dZU0U2MEdfMSAgIDU5ICAgICAgICAgICAgICAgLyogV3lzZSA2MCBHcmFwaGljcyAxICovCisjZGVmaW5lIFRYX1dZU0U2MEdfMiAgIDYwICAgICAgICAgICAgICAgLyogV3lzZSA2MCBHcmFwaGljcyAyICovCisjZGVmaW5lIFRYX1dZU0U2MEdfMyAgIDYxICAgICAgICAgICAgICAgLyogV3lzZSA2MCBHcmFwaGljcyAzICovCisKKy8qIE5ldyBvbmVzIHRoYXQgY2FtZSB0b28gbGF0ZSBmb3IgdGhlIG5pY2UgZ3JvdXBpbmcuLi4gKi8KKworI2RlZmluZSBUWF9FTE9UOTI3ICAgICA2MiAgICAgICAgICAgICAgIC8qIEdyZWVrIEVMT1QgOTI3ICovCisjZGVmaW5lIFRYX0RHUENHUlBIICAgIDYzICAgICAgICAgICAgICAgLyogREcgUEMgR3JhcGhpY3MgKi8KKyNkZWZpbmUgVFhfREdMREdSUEggICAgNjQgICAgICAgICAgICAgICAvKiBERyBMaW5lIERyYXdpbmcgR3JhcGhpY3MgKi8KKyNkZWZpbmUgVFhfREdXUEdSUEggICAgNjUgICAgICAgICAgICAgICAvKiBERyBXb3JkIFByb2Nlc3NpbmcgKGV0YykgR3JhcGhpY3MgKi8KKyNkZWZpbmUgVFhfSFBMSU5FICAgICAgNjYgICAgICAgICAgICAgICAvKiBIUCBMaW5lIERyYXdpbmcgKi8KKyNkZWZpbmUgVFhfSFBNQVRIICAgICAgNjcgICAgICAgICAgICAgICAvKiBIUCBNYXRoL1RlY2huaWNhbCAqLworI2RlZmluZSBUWF9RTlhHUlBIICAgICA2OCAgICAgICAgICAgICAgIC8qIFFOWCBHcmFwaGljcyAqLworCisvKiBTaWVtZW5zIE5peGRvcmYgY2hhcmFjdGVyIHNldHMgKi8KKworI2RlZmluZSBUWF9TTklCUkFDSyAgICA2OSAgICAgICAgICAgICAgIC8qIFNOSSA5NzgwMSBCcmFja2V0cyAqLworI2RlZmluZSBUWF9TTklFVVJPICAgICA3MCAgICAgICAgICAgICAgIC8qIFNOSSA5NzgwMSBFdXJvICAqLworI2RlZmluZSBUWF9TTklGQUNFVCAgICA3MSAgICAgICAgICAgICAgIC8qIFNOSSA5NzgwMSBGYWNldCAqLworI2RlZmluZSBUWF9TTklJQk0gICAgICA3MiAgICAgICAgICAgICAgIC8qIFNOSSA5NzgwMSAiSUJNIiAqLworI2RlZmluZSBUWF9TTklCTEFOSyAgICA3MyAgICAgICAgICAgICAgIC8qIFNOSSA5NzgwMSBCbGFua3MgKi8KKworLyogV2luZG93cyBDb2RlIHBhZ2VzICovCisKKyNkZWZpbmUgVFhfQ1AxMjUyICAgICAgNzQgICAgICAgICAgICAgICAvKiBMYXRpbi0xIFdpbmRvd3MgKi8KKyNkZWZpbmUgVFhfQ1AxMjUwICAgICAgNzUgICAgICAgICAgICAgICAvKiBMYXRpbi0yIFdpbmRvd3MgKi8KKyNkZWZpbmUgVFhfQ1AxMjUxICAgICAgNzYgICAgICAgICAgICAgICAvKiBDeXJpbGxpYyBXaW5kb3dzICovCisjZGVmaW5lIFRYX0NQMTI1MyAgICAgIDc3ICAgICAgICAgICAgICAgLyogR3JlZWNlIFdpbmRvd3MgKi8KKyNkZWZpbmUgVFhfQ1AxMjU0ICAgICAgNzggICAgICAgICAgICAgICAvKiBUdXJrZXkgV2luZG93cyAqLworI2RlZmluZSBUWF9DUDEyNTcgICAgICA3OSAgICAgICAgICAgICAgIC8qIExhdGluLTQgV2luZG93cyAqLworCisjZGVmaW5lIFRYX0NQODU2ICAgICAgIDgwICAgICAgICAgICAgICAgLyogQnVsZ2FyaWEgQ1A4NTYgKERBVEVDUyBMdGQpICovCisjZGVmaW5lIFRYX0NQODU1ICAgICAgIDgxCisjZGVmaW5lIFRYX0NQODE5ICAgICAgIDgyICAgICAgICAgICAgICAgLyogU2FtZSBhcyBJU08gODg1OS0xICovCisjZGVmaW5lIFRYX0NQOTEyICAgICAgIDgzICAgICAgICAgICAgICAgLyogU2FtZSBhcyBJU08gODg1OS0yICovCisjZGVmaW5lIFRYX0NQOTEzICAgICAgIDg0ICAgICAgICAgICAgICAgLyogU2FtZSBhcyBJU08gODg1OS0zICovCisjZGVmaW5lIFRYX0NQOTE0ICAgICAgIDg1ICAgICAgICAgICAgICAgLyogU2FtZSBhcyBJU08gODg1OS00ICovCisjZGVmaW5lIFRYX0NQOTE1ICAgICAgIDg2ICAgICAgICAgICAgICAgLyogU2FtZSBhcyBJU08gODg1OS01ICovCisjZGVmaW5lIFRYX0NQMTA4OSAgICAgIDg3ICAgICAgICAgICAgICAgLyogU2FtZSBhcyBJU08gODg1OS02ICovCisjZGVmaW5lIFRYX0NQODEzICAgICAgIDg4ICAgICAgICAgICAgICAgLyogU2FtZSBhcyBJU08gODg1OS03ICovCisjZGVmaW5lIFRYX0NQOTE2ICAgICAgIDg5ICAgICAgICAgICAgICAgLyogU2FtZSBhcyBJU08gODg1OS04ICovCisjZGVmaW5lIFRYX0NQOTIwICAgICAgIDkwICAgICAgICAgICAgICAgLyogU2FtZSBhcyBJU08gODg1OS05ICovCisjZGVmaW5lIFRYX0NQMTA1MSAgICAgIDkxICAgICAgICAgICAgICAgLyogU2FtZSBhcyBIUCBSb21hbiA4ICovCisjZGVmaW5lIFRYX0NQODU4ICAgICAgIDkyICAgICAgICAgICAgICAgLyogTXVsdGluYXRpb25hbCAoVy4gRXVyb3BlKSB3L0V1cm8gKi8KKyNkZWZpbmUgVFhfODg1OV8xNSAgICAgOTMgICAgICAgICAgICAgICAvKiBMYXRpbi05ICovCisjZGVmaW5lIFRYX0NQOTIzICAgICAgIDk0ICAgICAgICAgICAgICAgLyogU2FtZSBhcyBJU08gODg1OS0xNSAqLworCisjZGVmaW5lIFRYX0VMT1Q5MjggICAgIDk1ICAgICAgICAgICAgICAgLyogU2FtZSBhcyBJU08gODg1OS03ICovCisjZGVmaW5lIFRYX0NQMTAwMDAgICAgIDk2ICAgICAgICAgICAgICAgLyogU2FtZSBhcyBvcmlnaW5hbCBBcHBsZSBRdWlja2RyYXcgKi8KKyNkZWZpbmUgVFhfQ1AzNyAgICAgICAgOTcgICAgICAgICAgICAgICAvKiBFQkNESUMgKi8KKyNkZWZpbmUgVFhfQ1AxMjU1ICAgICAgOTggICAgICAgICAgICAgICAvKiBJc3JhZWwgV2luZG93cyAqLworI2RlZmluZSBUWF9DUDEyNTYgICAgICA5OSAgICAgICAgICAgICAgIC8qIEFyYWJpYyBXaW5kb3dzICovCisjZGVmaW5lIFRYX0NQMTI1OCAgICAgMTAwICAgICAgICAgICAgICAgLyogVmlldCBOYW0gV2luZG93cyAqLworI2RlZmluZSBUWF9NQVpPVklBICAgIDEwMQorI2RlZmluZSBUWF9UUkFOU1AgICAgIDEwMiAgICAgICAgICAgICAgIC8qIFRyYW5zcGFyZW50IC0gbm8gdHJhbnNsYXRpb24gKi8KKyNkZWZpbmUgVFhfSFoxNTAwICAgICAxMDMgICAgICAgICAgICAgICAvKiBIYXplbHRpbmUgMTUwMCBncmFwaGljcyBzZXQgKi8KKyNkZWZpbmUgVFhfS09JOFIgICAgICAxMDQgICAgICAgICAgICAgICAvKiBLT0k4UiAtIFJ1c3NpYW4gKi8KKyNkZWZpbmUgVFhfS09JOFUgICAgICAxMDUgICAgICAgICAgICAgICAvKiBLT0k4VSAtIFVrcmFpbmlhbiAqLworI2RlZmluZSBUWF9BUEwxICAgICAgIDEwNiAgICAgICAgICAgICAgIC8qIEFQTCBJU08gSVIgNjggKi8KKyNkZWZpbmUgVFhfQVBMMiAgICAgICAxMDcgICAgICAgICAgICAgICAvKiBEeWFkaWMgU3lzdGVtcyBJbmMgQVBMICovCisjZGVmaW5lIFRYX0FQTDMgICAgICAgMTA4ICAgICAgICAgICAgICAgLyogQVBMLVBsdXMgKEFQTC0yMDAwKSAqLworI2RlZmluZSBUWF9BUEw0ICAgICAgIDEwOSAgICAgICAgICAgICAgIC8qIElCTSBBUEwvMiAqLworI2RlZmluZSBUWF9BUEw1ICAgICAgIDExMCAgICAgICAgICAgICAgIC8qIEFQTC0yNzQxICovCisKKyNkZWZpbmUgTUFYVFhTRVRTICAgICAxMTEgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdGVybWluYWwgY2hhcmFjdGVyIHNldHMgKi8KKworLyogVGhlIGZvbGxvd2luZyBhcmUgbm90IGltcGxlbWVudGVkIHlldCAqLworLyogVVRGLTggaXMgc3VwcG9ydGVkIGFzIGEgc3BlY2lhbCBtb2RlIGluIEtlcm1pdCA5NSAoc2VlIHV0ZjggZmxhZykgKi8KKworI2RlZmluZSBUWF9VVEY3ICAgICAgIDEyOAorI2RlZmluZSBUWF9VVEY4ICAgICAgIDEyOQorCisjZGVmaW5lIFRYX0hFWEJZVEVTICAgMjQyICAgICAgICAgICAgICAgLyogSGV4IGJ5dGVzICovCisjZGVmaW5lIFRYX0RFQlVHICAgICAgMjQzICAgICAgICAgICAgICAgLyogRGVidWdnaW5nIGJ1dCBub3QgaGV4IGJ5dGVzICovCisKKy8qIFRoZXNlIGFyZSBhY3R1YWxseSB1c2VkICovCisKKyNkZWZpbmUgVFhfVU5ERUYgICAgICAyNTUgICAgICAgICAgICAgICAvKiBVbmtub3duIGNoYXJhY3Rlci1zZXQgKi8KKworLyogRmxhZyBiaXQgdmFsdWVzICovCisKKyNkZWZpbmUgWDJVX1NURCAgIDEgICAgICAgICAgICAgICAgICAgICAvKiBIYXMgc3RhbmRhcmQgSVNPIDQ4NzMgbGF5b3V0ICovCisjZGVmaW5lIFgyVV9JU08gICAyICAgICAgICAgICAgICAgICAgICAgLyogSVNPIHN0YW5kYXJkIGNoYXJhY3RlciBzZXQgKi8KKyNkZWZpbmUgWDJVX0pJUyAgIDQgICAgICAgICAgICAgICAgICAgICAvKiBKYXBhbiBJbmR1c3RyaWFsIFN0YW5kYXJkICovCisjZGVmaW5lIFgyVV9DUCAgICA4ICAgICAgICAgICAgICAgICAgICAgLyogUEMgQ29kZSBQYWdlICovCisjZGVmaW5lIFgyVV9ERUMgIDE2ICAgICAgICAgICAgICAgICAgICAgLyogREVDIFByaXZhdGUgY2hhcmFjdGVyIHNldCAqLworI2RlZmluZSBYMlVfQ1hHICAzMiAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgY29kZXMgdXNlZCBmb3IgZ3JhcGhpY3MgKi8KKworc3RydWN0IHhfdG9fdW5pY29kZSB7CisgICAgaW50IHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOTQsIDk2LCAxMjgsIG9yIG90aGVyICovCisgICAgaW50IG9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCwgMzIsIDMzLCAxMjgsIDE2MCwgLi4uICovCisgICAgaW50IGZsYWdzOworICAgIGludCBmYW1pbHk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExhbmd1YWdlIGZhbWlseSwgd3JpdGluZyBzeXN0ZW0gKi8KKyAgICBjaGFyICoga2V5d2Q7ICAgICAgICAgICAgICAgICAgICAgICAvKiBLZXl3b3JkIG5hbWUgKi8KKyAgICBjaGFyICogbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXNjcmlwdGl2ZSBuYW1lICovCisgICAgaW50IGNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVNPIHJlZyBudW1iZXIgaWYgU3RhbmRhcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDUCBudW1iZXIgaWYgQ29kZS1wYWdlLCBldGMuICovCisgICAgY2hhciAqIGZpbmFsOyAgICAgICAgICAgICAgICAgICAgICAgLyogRXNjIHNlcSBmaW5hbCBjaGFyKHMpIChJU08sIERFQykgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBtYXBbMjU2XTsgICAgICAgICAgICAvKiBNYXBwaW5nIHRhYmxlICovCit9OworCitleHRlcm4gc3RydWN0IGtleXRhYiB0eHJ0YWJbXTsKK2V4dGVybiBpbnQgbnR4cnRhYjsKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKGNoYXIgKikwCisjZW5kaWYgLyogTlVMTCAqLworCisjaWZuZGVmIFVTSE9SVAorI2RlZmluZSBVU0hPUlQgdW5zaWduZWQgc2hvcnQKKyNlbmRpZiAvKiBVU0hPUlQgKi8KKworI2lmbmRlZiBVTE9ORworI2RlZmluZSBVTE9ORyB1bnNpZ25lZCBsb25nCisjZW5kaWYgLyogVUxPTkcgKi8KKworI2lmbmRlZiBDSEFSCisjZGVmaW5lIENIQVIgdW5zaWduZWQgY2hhcgorI2VuZGlmIC8qIENIQVIgKi8KKworI2lmZGVmIENLX0FOU0lDCitleHRlcm4gVVNIT1JUICgqeGxfdVtNQVhUWFNFVFMrMV0pKENIQVIpOyAvKiBCbGFoLXRvLVVuaWNvZGUgZnVuY3Rpb25zICovCitleHRlcm4gaW50ICgqeGxfdHhbTUFYVFhTRVRTKzFdKShVU0hPUlQpOyAvKiBVbmljb2RlLXRvLUJsYWggZnVuY3Rpb25zICovCisjZWxzZQorZXh0ZXJuIFVTSE9SVCAoKnhsX3VbTUFYVFhTRVRTKzFdKSgpOworZXh0ZXJuIGludCAoKnhsX3R4W01BWFRYU0VUUysxXSkoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworZXh0ZXJuIHN0cnVjdCB4X3RvX3VuaWNvZGUgKiB0eHJpbmZvW01BWFRYU0VUUysxXTsKKworX1BST1RPVFlQKGludCBpc3VuaWNvZGUsICh2b2lkKSk7CitfUFJPVE9UWVAoaW50IHV0ZjhfdG9fdWNzMiwgKENIQVIsIFVTSE9SVCAqKikpOworX1BST1RPVFlQKGludCB1Y3MyX3RvX3V0ZjgsIChVU0hPUlQsIENIQVIgKiopKTsKK19QUk9UT1RZUChpbnQgdHhfY3BzdWIsIChVU0hPUlQpKTsKK19QUk9UT1RZUChpbnQgdV90b19iLCAoQ0hBUikgKTsKK19QUk9UT1RZUChpbnQgdV90b19iMiwgKHZvaWQpICk7CitfUFJPVE9UWVAoaW50IGJfdG9fdSwgKENIQVIsIENIQVIgKiwgaW50LCBpbnQpICk7CisKKyNpZmRlZiBLQU5KSQorX1BST1RPVFlQKFVTSE9SVCBzal90b191biwgKFVTSE9SVCkgKTsgIC8qIFNoaWZ0LUpJUyB0byBVbmljb2RlICovCitfUFJPVE9UWVAoVVNIT1JUIHVuX3RvX3NqLCAoVVNIT1JUKSApOyAgLyogVW5pY29kZSB0byBTaGlmdC1KSVMgKi8KKyNlbmRpZiAvKiBLQU5KSSAqLworCisjaWZkZWYgT1MyCisjaWZkZWYgTlQKK19pbmxpbmUKKyNlbHNlCitfSW5saW5lCisjZW5kaWYgLyogTlQgKi8KK2ludAoraXN1bmljb2RlKAorI2lmZGVmIENLX0FOU0lDCisgICAgICAgICAgdm9pZAorI2VuZGlmIC8qIENLX0FOU0lDICovCisgICAgICAgICAgKSB7CisgICAgZXh0ZXJuIGludCB0dF91bmljb2RlOworI2lmZGVmIE5UCisjaWZkZWYgS1VJCisgICAgcmV0dXJuKHR0X3VuaWNvZGUpOworI2Vsc2UgLyogS1VJICovCisgICAgaWYgKHR0X3VuaWNvZGUgJiYgIWlzV2luOTUoKSkKKyAgICAgIHJldHVybigxKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogS1VJICovCisjZWxzZSAvKiBOVCAqLworICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBOVCAqLworfQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIENLT1VOSV9IICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2tjeGxhLmggYi9ja2VybWl0LTguMC4yMTEvY2tjeGxhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkYzg4NwotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja2N4bGEuaApAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAgRmlsZSBDS0NYTEEuSAorCisgIFN5c3RlbS1pbmRlcGVuZGVudCBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGhlYWRlciBmaWxlIGZvciBDLUtlcm1pdC4KKyovCisKKy8qCisgIEF1dGhvcjogRnJhbmsgZGEgQ3J1eiA8ZmRjQGNvbHVtYmlhLmVkdT4sCisgIFRoZSBLZXJtaXQgUHJvamVjdCAtIENvbHVtYmlhIFVuaXZlcnNpdHksIE5ldyBZb3JrIENpdHkuCisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisvKgorICBOT1RFOgorICBJU08gMjA0IGlzIExhdGluLTEgKyBFdXJvLgorICBJU08gMjA1IGlzIExhdGluLTQgKyBFdXJvLgorICBJU08gMjA2IGlzIExhdGluLTcgKyBFdXJvLgorKi8KKyNpZm5kZWYgQ0tDWExBX0ggICAgICAgICAgICAgICAgICAgICAgICAvKiBHdWFyZCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiAqLworI2RlZmluZSBDS0NYTEFfSAorCisjaWZuZGVmIEtBTkpJICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3lzdGVtcyBzdXBwb3J0aW5nIEthbmppICovCisjaWZkZWYgT1MyCisjZGVmaW5lIEtBTkpJCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogS0FOSkkgKi8KKworI2lmZGVmIE5PS0FOSkkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4Y2VwdCBpZiBOT0tBTkpJIGlzIGRlZmluZWQuICovCisjaWZkZWYgS0FOSkkKKyN1bmRlZiBLQU5KSQorI2VuZGlmIC8qIEtBTkpJICovCisjZW5kaWYgLyogTk9LQU5KSSAqLworCisjaWZuZGVmIE5PVU5JQ09ERQorI2lmbmRlZiBVTklDT0RFICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuaWNvZGUgc3VwcG9ydCAqLworI2lmZGVmIE9TMk9SVU5JWCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgZm9yIEs5NSwgVU5JWCwgVk1TLC4uLiAqLworI2RlZmluZSBVTklDT0RFCisjZWxzZQorI2lmZGVmIFZNUworI2RlZmluZSBVTklDT0RFCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyT1JVTklYICovCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2VuZGlmIC8qIE5PVU5JQ09ERSAqLworCisjZGVmaW5lIFhMQV9OT05FICAgIDAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNsYXRpb24gdHlwZXMgLSBub25lICovCisjZGVmaW5lIFhMQV9CWVRFICAgIDEgICAgICAgICAgICAgICAgICAgLyogQnl0ZS1mb3ItYnl0ZSAqLworI2RlZmluZSBYTEFfSkFQQU4gICAyICAgICAgICAgICAgICAgICAgIC8qIEphcGFuZXNlICovCisjZGVmaW5lIFhMQV9VTklDT0RFIDMgICAgICAgICAgICAgICAgICAgLyogVW5pY29kZSAqLworCisjaWZuZGVmIFVOSU9SS0FOSkkgICAgICAgICAgICAgICAgICAgICAgLyogVW5pY29kZSBPUiBLYW5qaSAqLworI2lmZGVmIFVOSUNPREUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkuZS4gc29tZSBzdXBwb3J0IGZvciAqLworI2RlZmluZSBVTklPUktBTkpJICAgICAgICAgICAgICAgICAgICAgIC8qIG11bHRpYnl0ZSBjaGFyYWN0ZXIgc2V0cyAqLworI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNpZmRlZiBLQU5KSQorI2RlZmluZSBVTklPUktBTkpJCisjZW5kaWYgLyogS0FOSkkgKi8KKyNlbmRpZiAvKiBVTklPUktBTkpJICovCisvKgorICAgRGlzYWJsZSBhbGwgc3VwcG9ydCBmb3IgYWxsIGNsYXNzZXMgb2YgY2hhcmFjdGVyIHNldHMKKyAgIGlmIE5PQ1NFVFMgaXMgZGVmaW5lZC4KKyovCisjaWZkZWYgTk9DU0VUUworCisjaWZkZWYgQ0tPVU5JCisjdW5kZWYgQ0tPVU5JCisjZW5kaWYgLyogQ0tPVU5JICovCisjaWZkZWYgS0FOSkkKKyN1bmRlZiBLQU5KSQorI2VuZGlmIC8qIEtBTkpJICovCisjaWZkZWYgQ1lSSUxMSUMKKyN1bmRlZiBDWVJJTExJQworI2VuZGlmIC8qIENZUklMTElDICovCisjaWZkZWYgTEFUSU4yCisjdW5kZWYgTEFUSU4yCisjZW5kaWYgLyogTEFUSU4yICovCisjaWZkZWYgSEVCUkVXCisjdW5kZWYgSEVCUkVXCisjZW5kaWYgLyogSEVCUkVXICovCisjaWZkZWYgVU5JQ09ERQorI3VuZGVmIFVOSUNPREUKKyNlbmRpZiAvKiBVTklDT0RFICovCisKKyNlbHNlIC8qIE5vdCBOT0NTRVRTIC0gUmVzdCBvZiB0aGlzIGZpbGUuLi4gKi8KKworI2lmZGVmIE5PVU5JQ09ERSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuaWNvZGUgKi8KKyNpZmRlZiBVTklDT0RFCisjdW5kZWYgVU5JQ09ERQorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbmRpZiAvKiBOT1VOSUNPREUgKi8KKworI2lmZGVmIFVOSUNPREUKKyNpZmRlZiBPUzIKKyNpZm5kZWYgQ0tPVU5JCisjZGVmaW5lIENLT1VOSSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3BlY2lhbCBVbmljb2RlIGZlYXR1cmVzIGZvciBLOTUgKi8KKyNlbmRpZiAvKiBDS09VTkkgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBVTklDT0RFICovCisKKyNpZm5kZWYgT1MyCisjaWZkZWYgQ0tPVU5JCisjdW5kZWYgQ0tPVU5JCisjZW5kaWYgLyogQ0tPVU5JICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgTk9MQVRJTjIgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGV5IGRpZG4ndCBzYXkgIm5vIExhdGluLTIiICovCisjaWZuZGVmIExBVElOMiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlbiBpZiBMQVRJTjIgaXNuJ3QgYWxyZWFkeSAqLworI2RlZmluZSBMQVRJTjIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmluZWQsIGRlZmluZSBpdC4gKi8KKyNlbmRpZiAvKiBMQVRJTjIgKi8KKyNlbmRpZiAvKiBOT0xBVElOMiAqLworCisjaWZkZWYgTk9DWVJJTExJQyAgICAgICAgICAgICAgICAgICAgICAgLyogKHNwZWxsaW5nIHZhcmlhbnQuLi4pICovCisjaWZuZGVmIE5PQ1lSSUwKKyNkZWZpbmUgTk9DWVJJTAorI2VuZGlmIC8qIE5PQ1lSSUwgKi8KKyNlbmRpZiAvKiBOT0NZUklMTElDICovCisKKyNpZm5kZWYgTk9DWVJJTCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGV5IGRpZG4ndCBzYXkgIm5vIEN5cmlsbGljIiAqLworI2lmbmRlZiBDWVJJTExJQyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZW4gaWYgQ1lSSUxMSUMgaXNuJ3QgYWxyZWFkeSAqLworI2RlZmluZSBDWVJJTExJQyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmluZWQsIGRlZmluZSBpdC4gKi8KKyNlbmRpZiAvKiBDWVJJTExJQyAqLworI2VuZGlmIC8qIE5PQ1lSSUwgKi8KKworI2lmbmRlZiBOT0hFQlJFVyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZXkgZGlkbid0IHNheSAibm8gSGVicmV3IiAqLworI2lmbmRlZiBIRUJSRVcgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZW4gaWYgSEVCUkVXIGlzbid0IGFscmVhZHkgKi8KKyNkZWZpbmUgSEVCUkVXICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZpbmVkLCBkZWZpbmUgaXQuICovCisjZW5kaWYgLyogSEVCUkVXICovCisjZW5kaWYgLyogTk9IRUJSRVcgKi8KKworI2lmbmRlZiBOT0dSRUVLICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCBubyBHcmVlayAqLworI2lmbmRlZiBHUkVFSyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gaWYgR1JFRUsgaXNuJ3QgYWxyZWFkeSAqLworI2RlZmluZSBHUkVFSyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmluZWQsIGRlZmluZSBpdC4gKi8KKyNlbmRpZiAvKiBHUkVFSyAqLworI2VuZGlmIC8qIE5PR1JFRUsgKi8KKworI2lmbmRlZiBOT0tBTkpJICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCBubyBLYW5qaSAqLworI2lmbmRlZiBLQU5KSSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gaWYgS0FOSkkgaXNuJ3QgYWxyZWFkeSAqLworI2RlZmluZSBLQU5KSSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmluZWQsIGRlZmluZSBpdC4gKi8KKyNlbmRpZiAvKiBLQU5KSSAqLworI2VuZGlmIC8qIE5PS0FOSkkgKi8KKworLyogRmlsZSBja2N4bGEuaCAtLSBDaGFyYWN0ZXItc2V0LXJlbGF0ZWQgZGVmaW5pdGlvbnMsIHN5c3RlbSBpbmRlcGVuZGVudCAqLworCisvKiBDb2RlcyBmb3IgS2VybWl0IFRyYW5zZmVyIFN5bnRheCBMZXZlbCAob2Jzb2xldGUpICovCisKKyNkZWZpbmUgVFNfTDAgMCAgICAgICAgICAvKiBMZXZlbCAwIChUcmFuc3BhcmVudCkgKi8KKyNkZWZpbmUgVFNfTDEgMSAgICAgICAgICAvKiBMZXZlbCAxIChvbmUgc3RhbmRhcmQgY2hhcmFjdGVyIHNldCkgKi8KKyNkZWZpbmUgVFNfTDIgMiAgICAgICAgICAvKiBMZXZlbCAyIChtdWx0aXBsZSBjaGFyYWN0ZXIgc2V0cyBpbiBzYW1lIGZpbGUpICovCisKKyNkZWZpbmUgVU5LIDYzICAgICAgICAgICAvKiBTeW1ib2wgdG8gdXNlIGZvciB1bmtub3duIGNoYXJhY3RlciAoNjMgPSA/KSAqLworCisvKgorICBDb2RlcyBmb3IgdGhlIGJhc2UgYWxwaGFiZXQgb2YgYSBnaXZlbiBjaGFyYWN0ZXIgc2V0LgorICBUaGVzZSBhcmUgYXNzaWduZWQgaW4gcm91Z2hseSBJU08gODg1OSBvcmRlci4KKyAgKEVhY2ggaXMgYXNzdW1lZCB0byBpbmNsdWRlIEFTQ0lJL1JvbWFuLikKKyovCisjZGVmaW5lIEFMX1VOSVYgICAgMCAgICAgICAgICAgICAgICAgICAgLyogVW5pdmVyc2FsIChsaWtlIElTTyAxMDY0NikgKi8KKyNkZWZpbmUgQUxfUk9NQU4gICAxICAgICAgICAgICAgICAgICAgICAvKiBSb21hbiAoTGF0aW4pIGFscGhhYmV0ICovCisjZGVmaW5lIEFMX0NZUklMICAgMiAgICAgICAgICAgICAgICAgICAgLyogQ3lyaWxsaWMgYWxwaGFiZXQgKi8KKyNkZWZpbmUgQUxfQVJBQklDICAzICAgICAgICAgICAgICAgICAgICAvKiBBcmFiaWMgKi8KKyNkZWZpbmUgQUxfR1JFRUsgICA0ICAgICAgICAgICAgICAgICAgICAvKiBHcmVlayAqLworI2RlZmluZSBBTF9IRUJSRVcgIDUgICAgICAgICAgICAgICAgICAgIC8qIEhlYnJldyAqLworI2RlZmluZSBBTF9LQU5BICAgIDYgICAgICAgICAgICAgICAgICAgIC8qIEphcGFuZXNlIEthdGFrYW5hICovCisjZGVmaW5lIEFMX0pBUEFOICAgNyAgICAgICAgICAgICAgICAgICAgLyogSmFwYW5lc2UgS2F0YWthbmErS2FuamkgaWRlb2dyYW1zICovCisjZGVmaW5lIEFMX0hBTiAgICAgOCAgICAgICAgICAgICAgICAgICAgLyogQ2hpbmVzZS9KYXBhbmVzZS9Lb3JlYW4gaWRlb2dyYW1zICovCisjZGVmaW5lIEFMX0lORElBICAgOSAgICAgICAgICAgICAgICAgICAgLyogSW5kaWFuIHNjcmlwdHMgKElTQ0lJKSAqLworI2RlZmluZSBBTF9WSUVUICAgMTAgICAgICAgICAgICAgICAgICAgIC8qIFZpZXRuYW1lc2UgKFZJU0NJSSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgbW9yZSBoZXJlLi4uICovCisjZGVmaW5lIEFMX1VOSyAgIDk5OSAgICAgICAgICAgICAgICAgICAgLyogVW5rbm93biAodHJhbnNwYXJlbnQpICovCisKKy8qIENvZGVzIGZvciBsYW5ndWFnZXMgKi8KKy8qCisgIE5PVEU6IEl0IHdvdWxkIHBlcmhhcHMgYmUgYmV0dGVyIHRvIHVzZSBJU08gNjM5LTE5ODggMi1sZXR0ZXIgIkNvZGVzIGZvcgorICBSZXByZXNlbnRhdGlvbiBvZiBOYW1lcyBvZiBMYW5ndWFnZXMiIGhlcmUsIHNob3duIGluIHRoZSBjb21tZW50cyBiZWxvdy4KKyovCisjZGVmaW5lIExfQVNDSUkgICAgICAgMCAgLyogRU4gQVNDSUksIEVuZ2xpc2ggKi8KKyNkZWZpbmUgTF9VU0FTQ0lJICAgICAwICAvKiBFTiBBU0NJSSwgRW5nbGlzaCAqLworI2RlZmluZSBMX0RVVENIICAgICAgIDEgIC8qIE5MIER1dGNoICovCisjZGVmaW5lIExfRklOTklTSCAgICAgMiAgLyogRkkgRmlubmlzaCAqLworI2RlZmluZSBMX0ZSRU5DSCAgICAgIDMgIC8qIEZSIEZyZW5jaCAqLworI2RlZmluZSBMX0dFUk1BTiAgICAgIDQgIC8qIERFIEdlcm1hbiAqLworI2RlZmluZSBMX0hVTkdBUklBTiAgIDUgIC8qIEhVIEh1bmdhcmlhbiAqLworI2RlZmluZSBMX0lUQUxJQU4gICAgIDYgIC8qIElUIEl0YWxpYW4gKi8KKyNkZWZpbmUgTF9OT1JXRUdJQU4gICA3ICAvKiBOTyBOb3J3ZWdpYW4gKi8KKyNkZWZpbmUgTF9QT1JUVUdVRVNFICA4ICAvKiBQVCBQb3J0dWd1ZXNlICovCisjZGVmaW5lIExfU1BBTklTSCAgICAgOSAgLyogRVMgU3BhbmlzaCAqLworI2RlZmluZSBMX1NXRURJU0ggICAgMTAgIC8qIFNWIFN3ZWRpc2ggKi8KKyNkZWZpbmUgTF9TV0lTUyAgICAgIDExICAvKiBSTSBTd2lzcyAoUmhhZXRvLVJvbWFuY2UpICovCisjZGVmaW5lIExfREFOSVNIICAgICAxMiAgLyogREEgRGFuaXNoICovCisjZGVmaW5lIExfSUNFTEFORElDICAxMyAgLyogSVMgSWNlbGFuZGljICovCisjZGVmaW5lIExfUlVTU0lBTiAgICAxNCAgLyogUlUgUnVzc2lhbiAqLworI2RlZmluZSBMX0pBUEFORVNFICAgMTUgIC8qIEpBIEphcGFuZXNlICovCisjZGVmaW5lIExfSEVCUkVXICAgICAxNiAgLyogSVcgSGVicmV3ICovCisjZGVmaW5lIExfR1JFRUsgICAgICAxNyAgLyogICAgR3JlZWsgKi8KKworI2RlZmluZSBNQVhMQU5HICAgICAgMTcgIC8qIE51bWJlciBvZiBsYW5ndWFnZXMgKi8KKworLyoKKyAgRmlsZSBjaGFyYWN0ZXItc2V0cyBhcmUgZGVmaW5lZCBpbiB0aGUgc3lzdGVtLXNwZWNpZmljIGNrP3hsYS5oIGZpbGUsCisgIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZyBvbmVzLCB3aGljaCBtdXN0IGJlIGF2YWlsYWJsZSB0byBhbGwgdmVyc2lvbnM6CisqLworI2RlZmluZSBGQ19UUkFOU1AgIDI1NCAgICAgICAgICAgICAgICAgIC8qIFRyYW5zcGFyZW50ICovCisjZGVmaW5lIEZDX1VOREVGICAgMjU1ICAgICAgICAgICAgICAgICAgLyogVW5kZWZpbmVkICAgKi8KKy8qCisgIERlc2lnbmF0b3JzIGZvciBLZXJtaXQncyB0cmFuc2ZlciBjaGFyYWN0ZXIgc2V0cy4gIFRoZXNlIGFyZSBhbGwgc3RhbmRhcmQKKyAgc2V0cywgb3IgYmFzZWQgb24gdGhlbS4gIFN5bWJvbHMgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGZpcnN0IDggY2hhcmFjdGVycywKKyAgYmVjYXVzZSBzb21lIEMgcHJlcHJvY2Vzc29ycyBoYXZlIHRoaXMgbGltaXQuCisqLworLyogTElTVDEgKi8KKyNkZWZpbmUgVENfVFJBTlNQICAwICAgLyogVHJhbnNwYXJlbnQsIG5vIGNoYXJhY3RlciB0cmFuc2xhdGlvbiAqLworI2RlZmluZSBUQ19VU0FTQ0lJIDEgICAvKiBJU08gNjQ2IElSViAvIFVTIDctYml0IEFTQ0lJICovCisjZGVmaW5lIFRDXzFMQVRJTiAgMiAgIC8qIElTTyA4ODU5LTEsIExhdGluIEFscGhhYmV0IDEgKi8KKyNkZWZpbmUgVENfMkxBVElOICAzICAgLyogSVNPIDg4NTktMiwgTGF0aW4gQWxwaGFiZXQgMiAqLworI2RlZmluZSBUQ19DWVJJTEwgIDQgICAvKiBJU08gODg1OS01LCBMYXRpbi9DeXJpbGxpYyAqLworI2RlZmluZSBUQ19KRVVDICAgIDUgICAvKiBKYXBhbmVzZSBFVUMgPSBKSVMgMDIwMSswMjAyKzAyMDggKi8KKyNkZWZpbmUgVENfSEVCUkVXICA2ICAgLyogSVNPIDg4NTktOCwgTGF0aW4vSGVicmV3ICovCisjZGVmaW5lIFRDX0dSRUVLICAgNyAgIC8qIElTTyA4ODU5LTcsIExhdGluL0dyZWVrICovCisjZGVmaW5lIFRDXzlMQVRJTiAgOCAgIC8qIElTTyA4ODU5LTE1IExhdGluIEFscGhhYmV0IDkgKHdpdGggRXVybykgKi8KKyNkZWZpbmUgVENfVUNTMiAgICA5ICAgLyogSVNPIDEwNjQ2IC8gVW5pY29kZSBVQ1MtMiAqLworI2RlZmluZSBUQ19VVEY4ICAgMTAgICAvKiBJU08gMTA2NDYgLyBVbmljb2RlIFVURi04ICovCisKKyNkZWZpbmUgTUFYVENTRVRTIDEwICAgLyogSGlnaGVzdCBUcmFuc2ZlciBDaGFyYWN0ZXIgU2V0IE51bWJlciAqLworCisjaWZkZWYgQ09NTUVOVAorLyoKKyAgTm90IHVzZWQgYW5kIHByb2JhYmx5IHdvbid0IGJlIGR1ZSB0byBJU08tMTA2NDYgLyBVbmljb2RlLgorKi8KKyNkZWZpbmUgVENfM0xBVElOIDExICAvKiBJU08gODg1OS0zLCBMYXRpbi0zICovCisjZGVmaW5lIFRDXzRMQVRJTiAxMiAgIC8qIElTTyA4ODU5LTQsIExhdGluLTQgKi8KKyNkZWZpbmUgVENfNUxBVElOIDEzICAvKiBJU08gODg1OS05LCBMYXRpbi01ICovCisjZGVmaW5lIFRDX0FSQUJJQyAxNCAgLyogSVNPLTg4NTktNiwgTGF0aW4vQXJhYmljICovCisjZGVmaW5lIFRDX0pJUzIwOCAxNSAgLyogSmFwYW5lc2UgSklTIFggMDIwOCBtdWx0aWJ5dGUgc2V0ICovCisjZGVmaW5lIFRDX0NISU5FUyAxNiAgLyogQ2hpbmVzZSBTdGFuZGFyZCBHQiAyMzEyLTgwICovCisjZGVmaW5lIFRDX0tPUkVBTiAxNyAgLyogS29yZWFuIEtTIEMgNTYwMS0xOTg3ICovCisjZGVmaW5lIFRDX0lTQ0lJICAxOCAgLyogSW5kaWFuIHN0YW5kYXJkIGNvZGUgZm9yIGlpLi4uICovCisjZGVmaW5lIFRDX1ZTQ0lJICAxOSAgLyogVmlldG5hbSBzdGFuZGFyZCBjb2RlIGZvciBpaS4uLiAqLworLyogZXRjLi4uICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisvKiBTdHJ1Y3R1cmUgZm9yIGNoYXJhY3Rlci1zZXQgaW5mb3JtYXRpb24gKi8KKworc3RydWN0IGNzaW5mbyB7CisgICAgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzY3JpcHRpdmUgbmFtZSBvZiBjaGFyYWN0ZXIgc2V0ICovCisgICAgaW50IHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2l6ZSAoZS5nLiAxMjgsIDI1NiwgMTYzODQpICovCisgICAgaW50IGNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGlrZSBUQ18xTEFUSU4sIGV0Yy4gICovCisgICAgY2hhciAqZGVzaWduYXRvcjsgICAgICAgICAgICAgICAgICAgLyogRGVzaWduYXRvciwgbGlrZSBJMi8xMDAgPSBMYXRpbi0xICovCisgICAgaW50IGFscGhhYmV0OyAgICAgICAgICAgICAgICAgICAgICAgLyogQmFzZSBhbHBoYWJldCAqLworICAgIGNoYXIgKmtleXdvcmQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIEtleXdvcmQgZm9yIHRoaXMgY2hhcmFjdGVyLXNldCAqLworfTsKKworLyogU3RydWN0dXJlIGZvciBsYW5ndWFnZSBpbmZvcm1hdGlvbiAqLworCitzdHJ1Y3QgbGFuZ2luZm8geworICAgIGludCBpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExhbmd1YWdlIElEIGNvZGUgKExfd2hhdGV2ZXIpICovCisgICAgaW50IGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSBjaGFyYWN0ZXIgc2V0IHRvIHVzZSAqLworICAgIGludCB0YzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zZmVyIGNoYXJhY3RlciBzZXQgdG8gdXNlICovCisgICAgY2hhciAqZGVzY3JpcHRpb247ICAgICAgICAgICAgICAgICAgLyogRGVzY3JpcHRpb24gb2YgbGFuZ3VhZ2UgKi8KK307CisKKy8qIE5vdyB0YWtlIGluIHRoZSBzeXN0ZW0tc3BlY2lmaWMgZGVmaW5pdGlvbnMgKi8KKworI2lmZGVmIFVOSVgKKyNpbmNsdWRlICJja3V4bGEuaCIKKyNlbmRpZiAvKiBVTklYICovCisKKyNpZmRlZiBPU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPUy05ICovCisjaW5jbHVkZSAiY2t1eGxhLmgiCisjZW5kaWYgLyogT1MtOSAqLworCisjaWZkZWYgVk1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVkFYL1ZNUyAqLworI2luY2x1ZGUgImNrdXhsYS5oIgorI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgR0VNRE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXRhcmkgU1QgKi8KKyNpbmNsdWRlICJja3V4bGEuaCIKKyNlbmRpZiAvKiBHRU1ET1MgKi8KKworI2lmZGVmIE1BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY2ludG9zaCAqLworI2luY2x1ZGUgImNrbXhsYS5oIgorI2VuZGlmIC8qIE1BQyAqLworCisjaWZkZWYgT1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT1MvMiAqLworI2luY2x1ZGUgImNrdXhsYS5oIiAgICAgICAgICAgICAgICAgICAgIC8qIFVzZXMgYmlnIFVOSVggdmVyc2lvbiAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgQU1JR0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbW9kb3JlIEFtaWdhICovCisjaW5jbHVkZSAiY2t1eGxhLmgiCisjZW5kaWYgLyogQU1JR0EgKi8KKworI2lmZGVmIGRhdGFnZW5lcmFsICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgR2VuZXJhbCBNViBBT1MvVlMgKi8KKyNpbmNsdWRlICJja3V4bGEuaCIKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworCisjaWZkZWYgU1RSQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RyYXR1cyBDb21wdXRlciwgSW5jLiBWT1MgKi8KKyNpbmNsdWRlICJja3V4bGEuaCIKKyNlbmRpZiAvKiBTVFJBVFVTICovCisKKyNpZmRlZiBVTklDT0RFCisjaW5jbHVkZSAiY2tjdW5pLmgiICAgICAgICAgICAgICAgICAgICAgLyogVW5pY29kZSAqLworI2VuZGlmIC8qIFVOSUNPREUgKi8KKworI2lmZGVmIEtBTkpJCisjZGVmaW5lIFVOS1NKSVMgMHg4MTdmCitfUFJPVE9UWVAoVVNIT1JUIGV1X3RvX3NqLCAoVVNIT1JUKSApOyAgLyogRVVDLUpQIHRvIFNoaWZ0LUpJUyAgKi8KK19QUk9UT1RZUChVU0hPUlQgc2pfdG9fZXUsIChVU0hPUlQpICk7ICAvKiBTaGlmdC1KSVMgdG8gRVVDLUpQICAqLworX1BST1RPVFlQKCBpbnQgeGthbmpmLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHhrYW5qaSwgKGludCwgaW50ICgqKShjaGFyKSkgKTsKK19QUk9UT1RZUCggaW50IHhrYW5qeiwgKGludCAoKikoY2hhcikgKSApOworX1BST1RPVFlQKCBpbnQgemthbmpmLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHprYW5qaSwgKGludCAoKikodm9pZCkpICk7IC8qIEthbmppIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK19QUk9UT1RZUCggaW50IHprYW5qeiwgKHZvaWQpICk7CitfUFJPVE9UWVAoVk9JRCBqN2luaXQsICggdm9pZCApICk7ICAgICAgLyogSW5pdGlhbGl6ZSBKSVMtNyBwYXJzZXIgKi8KK19QUk9UT1RZUChpbnQgZ2V0ajcsICggdm9pZCApICk7ICAgICAgICAvKiBHZXQgbmV4dCBKSVMtNyBjaGFyYWN0ZXIgKi8KKyNlbmRpZiAvKiBLQU5KSSAqLworCisjaWZuZGVmIE1BQworI2lmbmRlZiBOT0xPQ0FMCitfUFJPVE9UWVAoIGludCBjc19zaXplLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgY3NfaXNfc3RkLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgY3NfaXNfbnJjLCAoaW50KSApOworX1BST1RPVFlQKCBWT0lEIHNldHJlbWNoYXJzZXQsIChpbnQsIGludCkgKTsKK19QUk9UT1RZUCggVk9JRCBzZXRsY2xjaGFyc2V0LCAoaW50KSApOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKworX1BST1RPVFlQKFZPSUQgc2V0eGxhdHlwZSwgKGludCwgaW50KSk7CisKKyNlbmRpZiAvKiBOT0NTRVRTICovCisjZW5kaWYgLyogQ0tDWExBX0ggKi8KKworLyogRW5kIG9mIGNrY3hsYS5oICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2tlcm1pdC5pbmkgYi9ja2VybWl0LTguMC4yMTEvY2tlcm1pdC5pbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwNzU2MQotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja2VybWl0LmluaQpAQCAtMCwwICsxLDYxOCBAQAorQ09NTUVOVCAtIFN0YW5kYXJkIEMtS2VybWl0IGluaXRpYWxpemF0aW9uIGZpbGUKKzsKKzsgRm9yIEMtS2VybWl0IFZlcnNpb246IDguMAorOworOyBGaWxlbmFtZToKKzsgICAua2VybXJjICAgICAoVU5JWCwgT1MtOSwgQWVnaXMpCis7ICAgQ0tFUk1JVC5JTkkgKE9TLzIsIFZNUywgT3BlblZNUywgQU9TL1ZTLCBBdGFyaSBTVCwgQ29tbW9kb3JlIEFtaWdhKQorOyAgIGNrZXJtaXQuaW5pIChTdHJhdHVzIFZPUykKKzsgICBLOTUuSU5JICAgICAoS2VybWl0IDk1IC0tIGJ1dCB0aGlzIGJpZyB2ZXJzaW9uIGlzIG5vdCB1c2VkIHRoZXJlKQorOyAgIEsyLklOSSAgICAgIChLZXJtaXQvMiAgLS0gYnV0IGRpdHRvKQorOworOyBBdXRob3JzOgorOyAgIEZyYW5rIGRhIENydXosIENocmlzdGluZSBNLiBHaWFub25lLCBKZWZmcmV5IEFsdG1hbgorOyAgIENvbHVtYmlhIFVuaXZlcnNpdHksIE5ldyBZb3JrLCBOWSAxMDAyNS03Nzk5LCBVU0EKKzsKKzsgVGhpcyBpcyB0aGUgc3RhbmRhcmQgYW5kIHJlY29tbWVuZGVkIEMtS2VybWl0IDguMCBpbml0aWFsaXphdGlvbiBmaWxlLiAgVG8KKzsgb3ZlcnJpZGUgc2V0dGluZ3Mgb3IgZGVmaW5pdGlvbnMgbWFkZSBpbiB0aGlzIGZpbGUsIHRvIGFkZCBuZXcgc2V0dGluZ3Mgb3IKKzsgZGVmaW5pdGlvbnMsIG9yIHRvIG1ha2UgYW55IG90aGVyIGRlc2lyZWQgY3VzdG9taXphdGlvbnMsIGNyZWF0ZSBhIHNlcGFyYXRlLAorOyBwZXJzb25hbCBjdXN0b21pemF0aW9uIGZpbGUgY2FsbGVkOgorOworOyAgIC5teWtlcm1yYyAgICAgKFVOSVgsIE9TLTksIEFlZ2lzLCBCZUJveCwgUGxhbiA5KQorOyAgIENLRVJNT0QuSU5JICAgKE9TLzIsIFZNUywgT3BlblZNUywgQU9TL1ZTLCBBdGFyaSBTVCwgQ29tbW9kb3JlIEFtaWdhKQorOyAgIGNrZXJtb2QuaW5pICAgKFZPUykKKzsKKzsgWW91IGNhbiBhbHNvIGRlZmluZSB0aGUgY3VzdG9taXphdGlvbiBmaWxlbmFtZSBpbiBhbiBlbnZpcm9ubWVudAorOyB2YXJpYWJsZSAobG9naWNhbCBuYW1lIGluIFZNUyksIENLRVJNT0QsIHdoaWNoIHRha2VzIHByZWNlZGVuY2Ugb3ZlcgorOyB0aGUgbmFtZXMgc2hvd24gYWJvdmUuCis7Cis7IFdIQVQgVEhJUyBGSUxFIERPRVM6Cis7Cis7IC4gRGVmaW5lcyB5b3VyIGRlZmF1bHQgZGlhbGluZyBkaXJlY3RvcnkgbmFtZToKKzsgICAgIC5rZGQgZm9yIFVOSVgsIE9TLTkgYW5kIEFlZ2lzOyBDS0VSTUlULktERCBmb3Igb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuCis7ICAgICAgICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgd2l0aCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgS19ESUFMX0RJUkVDVE9SWQorOyAuIERlZmluZXMgeW91ciBkZWZhdWx0IG5ldHdvcmsgZGlyZWN0b3J5IG5hbWU6Cis7ICAgICAua25kIGZvciBVTklYLCBPUy05IGFuZCBBZWdpczsgQ0tFUk1JVC5LTkQgZm9yIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLgorOyAgICAgICAgWW91IGNhbiBvdmVycmlkZSB0aGlzIHdpdGggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEtfTkVUX0RJUkVDVE9SWQorOyAuIERlZmluZXMgeW91ciBkZWZhdWx0IHNlcnZpY2VzIGRpcmVjdG9yeSBuYW1lOgorOyAgICAgLmtzZCBmb3IgVU5JWCwgT1MtOSBhbmQgQWVnaXM7IENLRVJNSVQuS1NEIGZvciBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcy4KKzsgICAgICAgIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlIEtfU0VSVklDRV9ESVJFQ1RPUlkuCis7IC4gRGVmaW5lcyB5b3VyIGN1c3RvbWl6YXRpb24gZmlsZSBuYW1lIChuYW1lIGdpdmVuIGFib3ZlKQorOyAuIFBlcmZvcm1zIHN5c3RlbS1kZXBlbmRlbnQgc2V0dXBzIGZvciBVTklYLCBWTVMsIE9TLzIsIGV0Yy4KKzsgLiBEZWZpbmVzIFZUUFJJTlQgbWFjcm9zIGZvciB1c2Ugd2l0aCBLOTUsIE1TLURPUyBLZXJtaXQsIGV0Yy4KKzsgLiBJZiB5b3UgaGF2ZSBhIHNlcnZpY2VzIGRpcmVjdG9yeSwgYWxsIHRoZSBtYWNyb3MgbmVlZGVkIHRvIHVzZSBpdCBhcmUKKzsgICAgIGRlZmluZWQuICBJZiB5b3UgZG9uJ3QgaGF2ZSBhIHNlcnZpY2VzIGRpcmVjdG9yeSwgdGhlIG1hY3JvcyBhcmUgbm90Cis7ICAgICBkZWZpbmVkIGFuZCBLZXJtaXQgc3RhcnRzIGZhc3Rlci4KKzsgLiBFeGVjdXRlcyB5b3VyIHBlcnNvbmFsIGN1c3RvbWl6YXRpb24gZmlsZSwgaWYgeW91IGhhdmUgb25lLgorOyAgIE5PVEU6IFlvdXIgY3VzdG9taXphdGlvbiBmaWxlIGlzIE5PVCBleGVjdXRlZCBieSBLZXJtaXQgaXRzZWxmOyBpdCBpcworOyAgIGV4ZWN1dGVkIGJ5IHRoaXMgZmlsZS4KKzsKKzsgSW4gVU5JWCwgd2l0aCBDLUtlcm1pdCA3LjAgYW5kIGxhdGVyLCB5b3UgY2FuIHN0b3JlIHRoaXMgZmlsZSB3aXRoIGEgbmFtZQorOyBvdGhlciB0aGFuIC5rZXJtcmMsIGFuZCBpdCB3aWxsIG5vdCBiZSBleGVjdXRlZCBhdXRvbWF0aWNhbGx5LCBidXQsIGlmIHlvdQorOyBnaXZlIHRoaXMgZmlsZSBleGVjdXRlIHBlcm1pc3Npb24sIHlvdSBjYW4gZXhlY3V0ZSBkaXJlY3RseSBiZWNhdXNlIG9mIHRoZQorOyAia2VyYmFuZyBsaW5lIiBhdCB0aGUgdG9wLCB3aGVuZXZlciB5b3Ugd2FudCBhbGwgb2YgdGhlIGFib3ZlIGFjdGlvbnMgdG8KKzsgb2NjdXIuICBUaGUga2VyYmFuZyBsaW5lIG11c3QgcmVmbGVjdCB0aGUgYWN0dWFsIGZ1bGwgcGF0aCBvZiB0aGUgS2VybWl0Cis7IDcuMC1vci1sYXRlciBleGVjdXRhYmxlLgorOworOyBDLUtlcm1pdCA2LjAgaXMgZG9jdW1lbnRlZCBpbiB0aGUgYm9vayAiVXNpbmcgQy1LZXJtaXQiLCAybmQgRWRpdGlvbiwKKzsgYnkgRnJhbmsgZGEgQ3J1eiBhbmQgQ2hyaXN0aW5lIE0uIEdpYW5vbmUsIDE5OTcsIERpZ2l0YWwgUHJlc3MgLworOyBCdXR0ZXJ3b3J0aC1IZWluZW1hbm4sIElTQk4gMS01NTU1OC0xNjQtMS4gIE5ldyBmZWF0dXJlcyBvZiBzdWJzZXF1ZW50Cis7IHZlcnNpb25zIGFyZSBkb2N1bWVudGVkIGF0IHRoZSBLZXJtaXQgd2Vic2l0ZToKKzsgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworOworOyBFdmVyeXRoaW5nIGFmdGVyIHRoaXMgcG9pbnQgZGVwZW5kcyBvbiB0aGUgc2NyaXB0IHByb2dyYW1taW5nIGxhbmd1YWdlLgorOyBUaGUgQ0hFQ0sgY29tbWFuZCB0ZXJtaW5hdGVzIHRoaXMgY29tbWFuZCBmaWxlIGltbWVkaWF0ZWx5IGlmIHRoZSBzY3JpcHQKKzsgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgKElGIGNvbW1hbmQpIGlzIG5vdCBjb25maWd1cmVkLgorOworc2V0IHRha2UgZXJyb3Igb24JCTsgVGhpcyBtYWtlcyBDSEVDSyBxdWl0IGlmIG5vIHNjcmlwdCBsYW5ndWFnZS4KK2NoZWNrIGlmCQkJOyBEbyB3ZSBoYXZlIGFuIElGIGNvbW1hbmQ/ICBJZiBub3QsIHF1aXQgbm93Lgorc2V0IHRha2UgZXJyb3Igb2ZmCQk7IEJhY2sgdG8gbm9ybWFsLgorCitsb2NhbCBfc2QgX3NlcnZpY2VkaXIgX3hwICAgICAgIDsgRGVjbGFyZSBsb2NhbCB2YXJpYWJsZXMuCisKK0NPTU1FTlQgLSBDLUtlcm1pdCB2ZXJzaW9uIDYuMCBvciBsYXRlciByZXF1aXJlZC4KKzsKKworYXNnIF94cCBcdih4cHJvZ3JhbSkKK2lmIG5vdCBkZWYgX3hwIGFzZyBfeHAgXHYocHJvZ3JhbSkKK2lmIG5vdCBlcXVhbCAiXG0oX3hwKSIgIkMtS2VybWl0IiAtCisgIHN0b3AgMSBcdihjbWRmaWxlKTogVGhpcyBpbml0aWFsaXphdGlvbiBmaWxlIGlzIG9ubHkgZm9yIEMtS2VybWl0LgorZWNobyBFeGVjdXRpbmcgXHYoY21kZmlsZSkgZm9yIFx2KHN5c3RlbSkuLi4KK2lmIDwgXHYodmVyc2lvbikgNjAwMDAgLQorICBzdG9wIDEgXHYoY21kZmlsZSk6IEMtS2VybWl0IDYuMCBvciBsYXRlciByZXF1aXJlZC4KKworZm9yd2FyZCBcdihzeXN0ZW0pCQk7IEZpcnN0IGRvIHN5c3RlbS1kZXBlbmRlbnQgaXRlbXMuLi4KKworOnVua25vd24JCQk7IFNob3VsZCBub3QgaGFwcGVuCitTdG9wIDEgRXJyb3I6IFN5c3RlbSB0eXBlIHVua25vd24hCisKKzpBZWdpcwkJCQk7IEFwb2xsbyBBZWdpcyBhbmQKKzpVTklYCQkJCTsgVU5JWCwgYWxsIHZlcnNpb25zCithc2cgX215aW5pdCAtCisgIFx2KGhvbWUpLm15a2VybXJjCQk7IEN1c3RvbWl6YXRpb24gZmlsZW5hbWUKK2lmIHJlbW90ZSBmb3J3YXJkIENPTU1PTiAgICAgICAgOyBTa2lwIGxvY2FsLW1vZGUgaXRlbXMgaWYgIi1SIgorYXNnIF9kaWFsZGlyIC0KKyAgXHYoaG9tZSkua2RkCQkJOyBDLUtlcm1pdCBkaWFsaW5nIGRpcmVjdG9yeQorYXNnIF9uZXRkaXIgLQorICBcdihob21lKS5rbmQJCQk7IEMtS2VybWl0IG5ldHdvcmsgZGlyZWN0b3J5Cithc2cgX3NlcnZpY2VkaXIgLQorICBcdihob21lKS5rc2QJCQk7IEMtS2VybWl0IHNlcnZpY2VzIGRpcmVjdG9yeQorZm9yd2FyZCBDT01NT04gICAgICAgICAgICAgICAgICA7IEVuZCBvZiBVTklYIHNlY3Rpb24KKworOk9TOS82OEsJCQk7IE9TLTkKK2FzZyBfbXlpbml0IC0KKyAgXHYoaG9tZSkubXlrZXJtcmMJCTsgQ3VzdG9taXphdGlvbiBmaWxlbmFtZQoraWYgcmVtb3RlIGZvcndhcmQgQ09NTU9OCithc2cgX2RpYWxkaXIgLQorICBcdihob21lKS5rZGQJCQk7IEMtS2VybWl0IGRpYWxpbmcgZGlyZWN0b3J5Cithc2cgX25ldGRpciAtCisgIFx2KGhvbWUpLmtuZAkJCTsgQy1LZXJtaXQgbmV0d29yayBkaXJlY3RvcnkKK2FzZyBfc2VydmljZWRpciAtCisgIFx2KGhvbWUpLmtzZAkJCTsgQy1LZXJtaXQgc2VydmljZXMgZGlyZWN0b3J5CitlbHNlIHNldCBmaWxlIGRpc3BsYXkgY3J0Citmb3J3YXJkIENPTU1PTgkJCTsgRW5kIG9mIE9TLTkgc2VjdGlvbgorCis6Vk1TCQkJCTsgVk1TIGFuZCBPcGVuVk1TCitmb3J3YXJkIENPTU1PTgorCis6T1MvMgkJCQk7IEtlcm1pdCA5NQorOldJTjMyCitlY2hvIFRoaXMgaW5pdGlhbGl6YXRpb24gZmlsZSBpcyBub3QgZm9yIHVzZSB3aXRoIEs5NS4KK2ZvcndhcmQgQ09NTU9OICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgT1MvMiBzZWN0aW9uCisKKzpBT1MvVlMJCQkJOyBEYXRhIEdlbmVyYWwgQU9TL1ZTCitzZXQgd2luZG93IDEJCQk7IFNsaWRpbmcgd2luZG93cyBkb24ndCB3b3JrCitzZXQgZmlsZSBjaGFyIGRnLWludGVybmF0aW9uYWwJOyBGaWxlIGNoYXJhY3Rlci1zZXQKK3NldCB4ZmVyIGNoYXIgbGF0aW4xCQk7IFRyYW5zZmVyIGNoYXJhY3Rlci1zZXQKK3NldCBmaWxlIGRpc3BsYXkgY3J0ICAgICAgICAgICAgOyBGaWxlIHRyYW5zZmVyIGZpc3BsYXkKK2RlZiBjbGkgcHVzaAkJCTsgRXNjYXBlIHRvIENMSQorZGVmIHJlc2V0IC0JCQk7IE1hY3JvIHRvIHJlc2V0IERHIERBU0hFUiB0ZXJtaW5hbAorIHJ1biB3cml0ZSBbIWFzY2lpIDIzNiAzMDYgMzAxXQorZm9yd2FyZCBDT01NT04gICAgICAgICAgICAgICAgICA7IEVuZCBvZiBBT1MvVlMgc2VjdGlvbgorCis6QW1pZ2EJCQkJOyBDb21tb2RvcmUgQW1pZ2EKK2RlZiBjbHMgZWNobyBcMjdbSFwyN1sySgk7IENMUyBjb21tYW5kIHRvIGNsZWFyIHRoZSBzY3JlZW4KK3NldCBmaWxlIGNoYXIgbGF0aW4xCQk7IFVzZSBMYXRpbiBBbHBoYWJldCAxIGZvciBmaWxlIHRyYW5zZmVyCitzZXQgeGZlciBjaGFyIGxhdGluMQkJOyAuLi4KK2ZvcndhcmQgQ09NTU9OICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgQW1pZ2Egc2VjdGlvbgorCis6QXRhcmlfU1QJCQk7IEF0YXJpIFNUCitkZWYgY2xzIGVjaG8gXDI3SFwyN0oJCTsgQ2xlYXIgc2NyZWVuIGFgbGEgVlQ1Mgorc2V0IHNlcnZlciBkaXNwbGF5IG9uCQk7IFNob3cgZmlsZSB4ZmVyIGRpc3BsYXkgaW4gc2VydmVyIG1vZGUgdG9vCitzZXQgc2VydmVyIHRpbWVvdXQgMTUJCTsgTm9uemVybyByZXF1aXJlZCBmb3IgXkMgaW50ZXJydXB0aW9uIQorZm9yd2FyZCBDT01NT04gICAgICAgICAgICAgICAgICA7IEVuZCBvZiBBdGFyaSBTVCBzZWN0aW9uCisKKzpNYWNpbnRvc2gJCQk7IEFwcGxlIE1hY2ludG9zaAorc2V0IHNlcnZlciBkaXNwbGF5IG9uCQk7IFNob3cgZmlsZSB4ZmVyIGRpc3BsYXkgaW4gc2VydmVyIG1vZGUgdG9vLgorZm9yd2FyZCBDT01NT04KKworOlN0cmF0dXNfVk9TICAgICAgICAgICAgICAgICAgICA7IFN0cmF0dXMgVk9TCithc2cgX215aW5pdCBcdihob21lKWNrZXJtb2QuaW5pCitpZiByZW1vdGUgZm9yd2FyZCBDT01NT04KK2FzZyBfZGlhbGRpciBcdihob21lKWNrZXJtaXQua2RkCithc2cgX25ldGRpciBcdihob21lKWNrZXJtaXQua25kCithc2cgX3NlcnZpY2VkaXIgXHYoaG9tZSlja2VybWl0LmtzZAorZm9yd2FyZCBDT01NT04gICAgICAgICAgICAgICAgICA7IEVuZCBvZiBTdHJhdHVzIFZPUyBzZWN0aW9uCisKKzpDT01NT04JCQkJOyBGb3IgYWxsIHN5c3RlbXMKKworOyBEZWZpbmUgbWFjcm9zIHRoYXQgYXJlIHVzZWZ1bCB3aGVuIHJ1bm5pbmcgQy1LZXJtaXQgaW4gcmVtb3RlIG1vZGUuCis7IFRoZXNlIG1hY3JvcyBzZXJ2ZSBubyBwdXJwb3NlIG9uIGxvY2FsLW1vZGUtb25seSB2ZXJzaW9ucyBzdWNoIGFzCis7IE9TLzIsIE1hY2ludG9zaCwgQW1pZ2EsIGFuZCBBdGFyaSBTVCBLZXJtaXQsIHNvIHdlIHNraXAgZGVmaW5pbmcgdGhlbQorOyBmb3IgdGhvc2Ugc3lzdGVtcy4KKzsKK2lmIG5vdCA9IDAgXGZpbmRleChcdihzeXN0ZW0pLFdJTjMyOk9TLzI6TWFjaW50b3NoOkFtaWdhOkF0YXJpX1NUKSAtCisgIGZvcndhcmQgZmlsZXMKKworOyBWVFBSSU5UIG1hY3JvLiAgUHJpbnQgYSBmaWxlIG9uIHlvdXIgUEMncyBsb2NhbCBwcmludGVyLgorCitkZWYgVlRQUklOVCBlY2hvIFwyN1s1aSwgdHlwZSBcJTEsIGVjaG8gXDI3WzRpCis7IG9yIGlmIHlvdXIgcHJpbnRlciBuZWVkcyBhIGZvcm1mZWVkIHRvIGZvcmNlIHRoZSBwYWdlIG91dDoKKzsgZGVmIFZUUFJJTlQgIGRlZiBlY2hvIFwyN1s1aSwgdHlwZSBcJTEsIGVjaG8gXDEyXDI3WzRpCisKKzsgTWFjcm9zIGZvciBob3N0LWluaXRpYXRlZCBmaWxlIHRyYW5zZmVyIHVzaW5nIEFQQzoKKzsgICBOT1QgTkVFREVEIEFOWSBNT1JFIGJlY2F1c2Ugb2YgYXV0b2Rvd25sb2FkL2F1dG91cGxvYWQuCis7ICAgUmVtb3ZlIHRoZSBmb2xsb3dpbmcgRk9SV0FSRCBjb21tYW5kIHRvIHJlaW5zdGF0ZSB0aGVzZSBkZWZpbml0aW9uczoKKworOkZJTEVTCisKKzsgR2V0IGN1c3RvbWl6YXRpb24gYW5kIGRpcmVjdG9yeSBmaWxlIG5hbWVzLiAgRW52aXJvbm1lbnQgdmFyaWFibGVzIHRha2UKKzsgcHJlY2VkZW5jZSwgc28geW91IGRvIG5vdCBoYXZlIHRvIGVkaXQgdGhpcyBmaWxlIHRvIGNoYW5nZSB0aGVzZSBmaWxlbmFtZXMuCis7CitpZiBkZWYgXCQoQ0tFUk1PRCkgYXNzaWduIF9teWluaXQgXCQoQ0tFUk1PRCkKK2lmIG5vdCBkZWYgX215aW5pdCBhc3NpZ24gX215aW5pdCBcdihob21lKUNLRVJNT0QuSU5JCisKK2lmIHJlbW90ZSBmb3J3YXJkIENVU1RPTSA7IFNraXAgYWxsIHRoaXMgaWYgLVIgZ2l2ZW4gb24gY29tbWFuZCBsaW5lCisKK2lmIGRlZiBcJChLX05FVF9ESVJFQ1RPUlkpIGFzc2lnbiBfbmV0ZGlyIFwkKEtfTkVUX0RJUkVDVE9SWSkKK2lmIG5vdCBkZWYgX25ldGRpciBhc3NpZ24gX25ldGRpciBcdihob21lKUNLRVJNSVQuS05ECisKK2lmIGRlZiBcJChLX0RJQUxfRElSRUNUT1JZKSBhc3NpZ24gX2RpYWxkaXIgXCQoS19ESUFMX0RJUkVDVE9SWSkKK2lmIG5vdCBkZWYgX2RpYWxkaXIgYXNzaWduIF9kaWFsZGlyIFx2KGhvbWUpQ0tFUk1JVC5LREQKKworQ0hFQ0sgRElBTAkJCTsgSXMgdGhlcmUgYSBESUFMIGNvbW1hbmQ/Cit4aWYgZmFpbCB7IAkJCTsgTm8uCisgICAgZWNobyBESUFMIGRpc2FibGVkCisgICAgZm9yd2FyZCBDVVNUT00KK30KKworQ0hFQ0sgTkVUV09SSworeGlmIHN1Y2Nlc3MgeworICAgIHhpZiBleGlzdCBcbShfbmV0ZGlyKSB7CisJc2V0IG5ldCBkaXJlY3RvcnkgXG0oX25ldGRpcikKKwllY2hvIHsgTmV0d29yayBkaXJlY3RvcnkgaXMgXG0oX25ldGRpcikgfQorICAgIH0KK30KKworaWYgZXEgIlx2KG5hbWUpIiAidGVsbmV0IiBmb3J3YXJkIENVU1RPTQorCit4aWYgZXhpc3QgXG0oX2RpYWxkaXIpIHsKKyAgICBzZXQgZGlhbCBkaXJlY3RvcnkgXG0oX2RpYWxkaXIpCisgICAgZWNobyB7IERpYWwgZGlyZWN0b3J5IGlzIFxtKF9kaWFsZGlyKSB9Cit9CisKK0NPTU1FTlQgLSBTZXJ2aWNlcyBkaXJlY3RvcnkKKworaWYgZGVmIFwkKEtfU0VSVklDRV9ESVJFQ1RPUlkpIGFzc2lnbiBfc2VydmljZWRpciBcJChLX1NFUlZJQ0VfRElSRUNUT1JZKQoraWYgbm90IGRlZiBfc2VydmljZWRpciBhc3NpZ24gX3NlcnZpY2VkaXIgXHYoaG9tZSlDS0VSTUlULktTRAorCis7IElmIG5vIHNlcnZpY2VzIGRpcmVjdG9yeSBpcyBmb3VuZCBza2lwIGFsbCB0aGUgYmlnIG1hY3JvIGRlZmluaXRpb25zIGFuZAorOyBnbyBzdHJhaWdodCB0byB0aGUgYm90dG9tLCB3aGVyZSB3ZSBleGVjdXRlIHRoZSBjdXN0b21pemF0aW9uIGZpbGUuCisKK2lmIG5vdCBleGlzdCBcbShfc2VydmljZWRpcikgZm9yd2FyZCBjdXN0b20KKworZWNobyB7IFNlcnZpY2VzIGRpcmVjdG9yeSBpcyBcbShfc2VydmljZWRpcil9CisKK2RlZiBNQVhfU1ZDUyAyMDAgICAgICAgICAgICAgICA7IEFkanVzdCB0aGlzIGlmIHlvdSBoYXZlIG1vcmUgZW50cmllcworZGVmaW5lIF9zZCAwICAgICAgICAgICAgICAgICAgIDsgQXNzdW1lIG5vIHNlcnZpY2VzIGRpcmVjdG9yeQorb3BlbiByZWFkIFxtKF9zZXJ2aWNlZGlyKSAgICAgIDsgVHJ5IHRvIG9wZW4gc2VydmljZXMgZGlyZWN0b3J5IGZpbGUKK3hpZiBzdWNjZXNzIHsKKyAgICBkZWNsYXJlIFwmZFtcbShNQVhfU1ZDUyldICA7IEl0J3Mgb3BlbiwgZGVjbGFyZSBkaXJlY3RvcnkgYXJyYXkKKyAgICBmb3IgXCVpIDEgXG0oTUFYX1NWQ1MpIDEgeyA7IFJlYWQgdGhlIGxpbmVzIGludG8gdGhlIGFycmF5CisJcmVhZCBcJmRbXCVpXQorCWlmIGZhaWwgYnJlYWsKKyAgICB9CisgICAgY2xvc2UgcmVhZAorICAgIHhpZiA+IFwlaSAgXG0oTUFYX1NWQ1MpIHsKKwllY2hvIFRvbyBtYW55IGVudHJpZXMgaW4gc2VydmljZXMgZGlyZWN0b3J5CisJZWNobyB7IE1heGltdW0gaXMgXG0oTUFYX1NWQ1MpLn0KKwllY2hvIHsgQ2hhbmdlIGRlZmluaXRpb24gb2YgTUFYX1NWQ1MgaW4gXHYoY21kZmlsZSkgdG8gYWxsb3cgbW9yZS4gfQorCWVjaG8geyBTZXJ2aWNlcyBkaXJlY3RvcnkgZGlzYWJsZWQufQorICAgIH0gZWxzZSB7CisgICAgICAgIGFzZyBcJmRbMF0gXGZldmFsKFwlaSAtIDEpCisgICAgICAgIGRlZmluZSBfc2QgMQorICAgIH0KK30KKworeGlmIG5vdCBcbShfc2QpIHsKKyAgICBkZWYgYWNjZXNzIGVjaG8geyBTZXJ2aWNlcyBkaXJlY3Rvcnkgbm90IGF2YWlsYWJsZS59CisgICAgYXNnIGxpc3QgXG0oYWNjZXNzKQorfSBlbHNlIHsKKyAgICBkZWYgRklORCB7CisJc2V0IGNhc2Ugb2ZmCisJZm9yIFwlaSAxIFwmZFswXSAxIHsKKwkgICAgaWYgZXEge1wlMX0ge1xmc3Vic3RyKFwmZFtcJWldLDEsXGZsZW4oXCUxKSl9IGJyZWFrCisJfQorCWlmIG5vdCA+IFwlaSBcJmRbMF0gcmV0dXJuIFwmZFtcJWldCisgICAgfQorICAgIGRlZiBMSVNUIHsKKwl4aWYgPiBcdihhcmdjKSAxIHsKKwkgICAgZG8gZmluZCBcJTEKKwkgICAgaWYgZGVmIFx2KHJldHVybikgZWNobyBcdihyZXR1cm4pCisJICAgIGVsc2UgZWNobyBcJTE6IE5vdCBmb3VuZAorCX0gZWxzZSB7CisJICAgIGVjaG8gXCZkWzBdIGl0ZW1zIGluIHNlcnZpY2VzIGRpcmVjdG9yeToKKwkgICAgZm9yIFwlaSAxIFwmZFswXSAxIHsgZWNobyBcZmNvbnQoXCZkW1wlaV0pIH0KKwl9CisgICAgfQorICAgIGRlZiBTUExJVCB7IGFzZyBfd29yZDEgXCUxLCBhc2cgX3dvcmQyIFwlMiB9CisgICAgZGVmIERPQUNDRVNTIHsgICAgICAgICAgICAgICA7IChVc2VkIGludGVybmFsbHkgYnkgQUNDRVNTIG1hY3JvKQorCWRvIFwlNSBcJTYgXCU3IFwlOCBcJTkgICA7IERvIHRoZSBjb25uZWN0aW9uIG1hY3JvCisJaWYgZmFpbCBlbmQgMQorICAgICAgICBzcGxpdCBcJTMgICAgICAgICAgICAgICAgOyBHZXQgd29yZHMgZnJvbSBcJTMKKwlhc2cgXCUzIFxtKF93b3JkMSkKKwlhc2cgXCUyIFxtKF93b3JkMikKKwlkbyBcJTMgXCU0IHtcJTF9IFwlMiAgICAgOyBMb2dpbiBtYWNybywgdXNlcmlkLCBwYXNzd29yZCwgcHJvbXB0CisgICAgfQorICAgIGRlZiBBQ0NFU1MgeworCWlmIG5vdCBkZWZpbmVkIFwlMSBlbmQgMSBhY2Nlc3Mgd2hhdD8gICAgICAgIDsgQ2hlY2sgc2VydmljZQorCWRvIGZpbmQgXCUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTG9vayBpdCB1cAorCWlmIHN1Y2Nlc3MgZG9hY2Nlc3Mge1wlMn0gXHYocmV0dXJuKSAgICAgICAgIDsgT0ssIHRyeSBpdAorCWVsc2UgZW5kIDEgIlwlMSIgbm90IGluIHNlcnZpY2VzIGRpcmVjdG9yeSAgIDsgTm90IGZvdW5kCisJaWYgZmFpbCBlbmQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBET0FDQ0VTUyBmYWlsZWQ/CisJeGlmIGVxIFx2KGNtZGxldmVsKSAxIHsKKwkgICAgZWNobworCSAgICBlY2hvIEFDQ0VTUzogTG9naW4gc3VjY2VlZGVkIC0gQ09OTkVDVGluZy4uLgorICAgICAgICAgICAgc2hvdyBlc2NhcGUKKyAgICAgICAgICAgIG91dHB1dCBcMTMKKwkgICAgY29ubmVjdCAvcXVpZXRseQorICAgICAgICB9CisgICAgfQorfQorCis6Q09OTkVDVElPTiA7IE1hY3JvcyBmb3IgbWFraW5nIGNvbm5lY3Rpb25zCisKK0NPTU1FTlQgLSBTRVJJQUwgbWFjcm8uICBBcmd1bWVudHM6Cis7IFwlMSA9IGRldmljZSBuYW1lCis7IFwlMiA9IHNwZWVkCis7CitkZWYgU0VSSUFMIHsKKyAgICBpZiA8IFx2KGFyZ2MpIDMgICAgICAgICAgICAgICAgICAgICAgICAgOyBBbGwgYXJndW1lbnRzIGdpdmVuPworICAgICAgZW5kIDEgVXNhZ2U6IFNFUklBTCBkZXZpY2Ugc3BlZWQgICAgICA7IE5vLgorICAgIHNldCBsaW5lIFwlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IE9LLCB0cnkgdG8gU0VUIExJTkUuCisgICAgaWYgZmFpbHVyZSAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgSWYgdGhpcyBmYWlsZWQsCisgICAgICBlbmQgMSBDYW4ndCBvcGVuIGRldmljZTogXCUxICAgICAgICAgIDsgcHJpbnQgbWVzc2FnZSBhbmQgcXVpdC4KKyAgICBzZXQgc3BlZWQgXCUyICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBUcnkgdG8gc2V0IHRoZSBzcGVlZC4KKyAgICBpZiBmYWlsIGVuZCAxIFVuc3VwcG9ydGVkIHNwZWVkOiBcJTIgICAgOyBGYWlsZWQuCisgICAgZWNobyBDb25uZWN0aW9uIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgIDsgU3VjY2VlZGVkLgorfQorCitDT01NRU5UIC0gTkVUIG1hY3JvLiAgQXJndW1lbnRzOgorOyBcJTEgPSBuZXR3b3JrIHR5cGUKKzsgXCUyID0gaG9zdCBuYW1lIG9yIGFkZHJlc3MKKzsKK2RlZiBORVQgeworICAgIGlmIDwgXHYoYXJnYykgMyBlbmQgMSBVc2FnZTogTkVUIG5ldHdvcmsgaG9zdAorICAgIHNldCBuZXR3b3JrIHR5cGUgXCUxCisgICAgaWYgZmFpbCBlbmQgMSB1bnN1cHBvcnRlZCBuZXR3b3JrOiBcJTEKKyAgICBzZXQgbG9naW4gdXNlciAgICAgICAgICAgICAgICA7IERvbid0IHNlbmQgdXNlciBJRC4KKyAgICBzZXQgaG9zdCBcJTIKKyAgICBpZiBmYWlsIGVuZCAxIENhbid0IHJlYWNoIGhvc3Q6IFwlMgorICAgIGVjaG8gQ29ubmVjdGlvbiBzdWNjZXNzZnVsLgorfQorCitDT01NRU5UIC0gQ0FMTCBtYWNyby4gIEFyZ3VtZW50czoKKzsKKzsgXCUxID0gbW9kZW0gdHlwZQorOyBcJTIgPSBkZXZpY2UgbmFtZQorOyBcJTMgPSBzcGVlZAorOyBcJTQgPSBwaG9uZSBudW1iZXIKKzsKK2RlZiBDQUxMIHsKKyAgICBpZiA8IFx2KGFyZ2MpIDUgLSAgICAgICAgIDsgQWxsIGFyZ3VtZW50cyBwcmVzZW50PworICAgICAgZW5kIDEgVXNhZ2U6IENBTEwgbW9kZW0gZGV2aWNlIHNwZWVkIG51bWJlcgorICAgIHhpZiBub3QgZXF1YWwge1x2KG1vZGVtKX0ge1wlMX0geyA7IFNldCBtb2RlbSB0eXBlCisgICAgICAgIHNldCBtb2RlbSBcJTEKKyAgICAgICAgaWYgZmFpbCBlbmQgMSB1bmtub3duIG1vZGVtIHR5cGU6IFwlMQorICAgIH0KKyAgICB4aWYgbm90IGVxdWFsIHtcdihsaW5lKX0ge1wlMn0geyA7IENvbW11bmljYXRpb24gZGV2aWNlCisgICAgICAgIHNldCBsaW5lIFwlMgorICAgICAgICBpZiBmYWlsIGVuZCAxIGNhbid0IG9wZW4gZGV2aWNlOiBcJTIKKyAgICB9CisgICAgeGlmIG5vdCBlcXVhbCB7XHYoc3BlZWQpfSB7XCUzfSB7IDsgQ29tbXVuaWNhdGlvbiBzcGVlZAorICAgICAgICBzZXQgc3BlZWQgXCUzCisgICAgICAgIGlmIGZhaWwgZW5kIDEgdW5zdXBwb3J0ZWQgc3BlZWQ6IFwlMworICAgIH0KKyAgICBkaWFsIFwlNCAgICAgICAgICAgICAgICAgIDsgRGlhbCB0aGUgbnVtYmVyCisgICAgaWYgZmFpbCBlbmQgMSBDYW4ndCBwbGFjZSBjYWxsOiBcJTQKKyAgICBlbmQgMCBDb25uZWN0aW9uIHN1Y2Nlc3NmdWwuCit9CisKK0NPTU1FTlQgLSBUQ1BDQUxMIG1hY3JvLiAgQXJndW1lbnRzOgorOworOyBcJTEgPSBzZXJ2ZXIgbmFtZTpwb3J0Cis7IFwlMiA9IG1vZGVtIHR5cGUKKzsgXCUzID0gcGhvbmUgbnVtYmVyCis7CitkZWYgVENQQ0FMTCB7CisgICAgaWYgPCBcdihhcmdjKSA0IC0gICAgICAgICA7IEFsbCBhcmd1bWVudHMgcHJlc2VudD8KKyAgICAgIGVuZCAxIFVzYWdlOiBUQ1BDQUxMIHNlcnZlcls6cG9ydF0gbW9kZW0gbnVtYmVyCisgICAgc2V0IG5ldCB0eXBlIHRjcC9pcCAgICAgICA7IFdoaWNoIG5ldHdvcmsgdG8gdXNlCisgICAgaWYgZmFpbCBlbmQgMSB1bnN1cHBvcnRlZCBuZXR3b3JrOiB0Y3AvaXAKKyAgICBzZXQgaG9zdCBcJTEgICAgICAgICAgICAgIDsgQWNjZXNzIHNlcnZlciBhbmQgcG9ydAorICAgIGlmIGZhaWwgZW5kIDEgY2FuJ3QgYWNjZXNzIHNlcnZlciBcJTEKKyAgICBzZXQgbW9kZW0gXCUyICAgICAgICAgICAgIDsgU2V0IG1vZGVtIHR5cGUKKyAgICBpZiBmYWlsIGVuZCAxIHVua25vd24gbW9kZW0gdHlwZTogXCUyCisgICAgZGlhbCBcJTMgICAgICAgICAgICAgICAgICA7IERpYWwgdGhlIG51bWJlcgorICAgIGlmIGZhaWwgZW5kIDEgQ2FuJ3QgcGxhY2UgY2FsbDogXCUzCisgICAgZW5kIDAgQ29ubmVjdGlvbiBzdWNjZXNzZnVsLgorfQorCitDT01NRU5UIC0gU1BSSU5UIG1hY3JvLiAgQXJndW1lbnRzOgorOyBcJTEgPSBTZXJ2aWNlIG5hbWUgb3IgYWRkcmVzcworOworZGVmIFNQUklOVCB7CisgICAgaWYgPCBcdihhcmdjKSAyIGVuZCAxIFVzYWdlOiBcJTAgc2VydmljZQorICAgIHNldCBpbnB1dCB0aW1lb3V0IHByb2NlZWQKKyAgICBvdXRwdXQgQERcMTMKKyAgICBpbnB1dCAxMCBURVJNSU5BTD0KKyAgICBpZiBmYWlsIGVuZCAxIE5vIHRlcm1pbmFsIHByb21wdAorICAgIG91dCBEMVwxMworICAgIGlucCAxMCBACisgICAgaWYgZmFpbCBlbmQgMSBObyBhdHNpZ24gcHJvbXB0CisgICAgb3V0cHV0IGMgXCUxXDEzCisgICAgaW5wdXQgMTAgQ09OTkVDVEVECisgICAgaWYgZmFpbCBlbmQgMSBDYW4ndCBhY2Nlc3MgXCUxIGZyb20gU3ByaW50TmV0Cit9CisKK0NPTU1FTlQgLSBVTE9HSU4gbWFjcm8uICBGb3IgbG9nZ2luZyBpbnRvIHN5c3RlbXMgd2hlcmUgdXNlciBJRCBpcyByZXF1aXJlZAorOyBidXQgdGhlcmUgaXMgbm8gcGFzc3dvcmQuICBBcmd1bWVudHM6Cis7IFwlMSA9IFVOSVggdXNlciBJRAorOworZGVmaW5lIFVMT0dJTiB7CisgICAgaWYgPCBcdihhcmdjKSAyIGVuZCAxIFVzYWdlOiBcJTAgdXNlcmlkCisgICAgc2V0IGlucHV0IHRpbWVvdXQgcHJvY2VlZCAgICAgOyBIYW5kbGUgdGltZW91dHMgb3Vyc2VsdmVzCisgICAgc2V0IGNhc2Ugb24gICAgICAgICAgICAgICAgICAgOyBDYXNlIGlzIGltcG9ydGFudCBpbiBVTklYCisgICAgbWlucHV0IDUgbG9naW46IFVzZXJuYW1lOiB7VXNlciBJRDp9IHtVc2VyIE5hbWU6fQorICAgIG91dCBcJTFcMTMgICAgICAgICAgICAgICAgICAgIDsgU2VuZCB1c2VybmFtZSwgY2FycmlhZ2UgcmV0dXJuCisgICAgZW5kIDAKK30KKworQ09NTUVOVCAtIFZNU0xPR0lOIG1hY3JvLiAgQXJndW1lbnRzOgorOyBcJTEgPSBWTVMgdXNlciBJRAorOyBcJTIgPSBQYXNzd29yZC4gIElmIHBhc3N3b3JkIG5vdCBzdXBwbGllZCwgaXQgaXMgcHJvbXB0ZWQgZm9yLgorOyBcJTMgPSBTeXN0ZW0gcHJvbXB0LiAgSWYgb21pdHRlZCBhIGRlZmF1bHQgaXMgc3VwcGxpZWQuCis7CitkZWZpbmUgVk1TTE9HSU4geworICAgIGlmIDwgXHYoYXJnYykgMiBlbmQgMSBVc2FnZTogXCUwIHVzZXJpZCBbIHBhc3N3b3JkIFsgcHJvbXB0IF0gXQorICAgIHdoaWxlIG5vdCBkZWZpbmVkIFwlMiB7CisgICAgICAgIGFza3EgXCUyIHsgXCUxJ3MgcGFzc3dvcmQ6IH0KKyAgICB9CisgICAgc2V0IHBhcml0eSBub25lICAgICAgICAgICAgICAgOyBTZXQgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzCisgICAgc2V0IGR1cGxleCBmdWxsCisgICAgc2V0IGhhbmRzaGFrZSBub25lCisgICAgc2V0IGlucHV0IHRpbWVvdXQgcHJvY2VlZCAgICAgOyBIYW5kbGUgdGltZW91dHMgb3Vyc2VsdmVzCisgICAgaW4gNSBVc2VybmFtZTogICAgICAgICAgICAgICAgOyBJcyBwcm9tcHQgYWxyZWFkeSB0aGVyZT8KKyAgICB4aWYgZmFpbCB7ICAgICAgICAgICAgICAgICAgICA7IE5vLgorICAgICAgICBmb3IgXCVpIDEgMyAxIHsgICAgICAgICAgIDsgVHJ5IDMgdGltZXMgdG8gZ2V0IGl0LgorICAgICAgICAgICAgb3V0IFwxMyAgICAgICAgICAgICAgIDsgU2VuZCBjYXJyaWFnZSByZXR1cm4KKyAgICAgICAgICAgIGluIDUgVXNlcm5hbWU6ICAgICAgICA7IExvb2sgZm9yIHByb21wdAorICAgICAgICAgICAgaWYgc3VjY2VzcyBicmVhayAgICAgIDsgU3VjY2VzcywgZ28gbG9nIGluCisgICAgICAgIH0KKyAgICAgICAgaWYgPiBcJWkgMyBlbmQgMSBObyBVc2VybmFtZSBwcm9tcHQKKyAgICB9CisgICAgb3V0IFwlMVwxMyAgICAgICAgICAgICAgICAgICAgOyBTZW5kIHVzZXJuYW1lLCBjYXJyaWFnZSByZXR1cm4KKyAgICBpbnAgNSBQYXNzd29yZDogICAgICAgICAgICAgICA7IFdhaXQgNSBzZWMgZm9yIHRoaXMgcHJvbXB0CisgICAgaWYgZmFpbCBlbmQgMSBObyBwYXNzd29yZCBwcm9tcHQKKyAgICBwYXVzZSAgICAgICAgICAgICAgICAgICAgICAgICA7IFdhaXQgYSBzZWMKKyAgICBvdXQgXCUyXDEzICAgICAgICAgICAgICAgICAgICA7IFNlbmQgcGFzc3dvcmQKKyAgICB4aWYgbm90IGVtdWxhdGlvbiB7ICAgICAgICAgICA7IE5vIGVtdWxhdG9yIGJ1aWx0IGluPworICAgICAgICBzZXQgaW5wdXQgZWNobyBvZmYgICAgICAgIDsgUHJvdGVjdCB0ZXJtaW5hbCBmcm9tIHRoaXMKKyAgICAgICAgbWlucHV0IDEwIHtcMjdafSB7XDI3W2N9IHtcMjdbMGN9IDsgR2V0IHRlcm1pbmFsIElEIHF1ZXJ5CisgICAgICAgIHhpZiBzdWNjZXNzIHsgICAgICAgICAgICAgICAgICAgICA7IEdvdCBvbmUKKyAgICAgICAgICAgIG91dHB1dCBcMjdbXD8xYyAgICAgICAgICAgICAgIDsgU2VuZCBWVDEwMCB0ZXJtaW5hbCBJRAorICAgICAgICAgICAgaW4gMiBcMjdbNm4gICAgICAgICAgICAgICAgICAgOyBTY3JlZW4gZGltZW5zaW9uIHF1ZXJ5PworICAgICAgICAgICAgaWYgc3VjYyBvdXQgXDI3W1x2KHJvd3MpO1x2KGNvbHMpUiA7IFNlbmQgZGltZW5zaW9ucworICAgICAgICB9CisgICAgICAgIHNldCBpbnB1dCBlY2hvIG9uICAgICAgICAgOyBFY2hvIGlucHV0IGFnYWluCisgICAgfQorICAgIGlmIG5vdCBkZWYgXCUzIC0gICAgICAgICAgICAgIDsgSWYgd2Ugd2VyZSBub3QgZ2l2ZW4gYSBwcm9tcHQKKyAgICAgIGFzZyBcJTMge1x2KHByb21wdCl9ICAgICAgICA7IHVzZSB0aGUgU0VUIExPR0lOIFBST01QVCB2YWx1ZQorICAgIGlmIG5vdCBkZWYgXCUzIC0gICAgICAgICAgICAgIDsgSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHByb21wdAorICAgICAgYXNnIFwlMyB7XDEzJFwzMn0gICAgICAgICAgIDsgdXNlIHRoaXMgb25lIGFzIHRoZSBkZWZhdWx0CisgICAgcmVpbnAgMCBcJTMgICAgICAgICAgICAgICAgICAgOyBEaWQgd2UgSU5QVVQgdGhlIHByb21wdCBhbHJlYWR5PworICAgIGlmIGZhaWwgaW5wIDYwIFwlMyAgICAgICAgICAgIDsgTm8sIGxvb2sgbm93LgorICAgIGlmIGZhaWwgZW5kIDEKK30KKworQ09NTUVOVCAtIFVOSVhMT0dJTiBtYWNyby4gIEFyZ3VtZW50czoKKzsgXCUxID0gVU5JWCB1c2VyIElECis7IFwlMiA9IFBhc3N3b3JkLiAgSWYgcGFzc3dvcmQgbm90IHN1cHBsaWVkLCBpdCBpcyBwcm9tcHRlZCBmb3IuCis7IFwlMyA9IFN5c3RlbSBwcm9tcHQuICBJZiBvbWl0dGVkIGEgZGVmYXVsdCBpcyBzdXBwbGllZC4KKzsKK2RlZmluZSBVTklYTE9HSU4geworICAgIGxvY2FsIFwlbSBcJWkKKyAgICBpZiA8IFx2KGFyZ2MpIDIgLQorICAgICAgZW5kIDEgVXNhZ2U6IFwlMCB1c2VyaWQgWyBwYXNzd29yZCBbIHByb21wdCBdIF0KKyAgICB3aGlsZSBub3QgZGVmaW5lZCBcJTIgeworICAgICAgICBhc2txIFwlMiB7IFwlMSdzIHBhc3N3b3JkOiB9CisgICAgfQorICAgIHNldCBpbnB1dCBlY2hvIG9uCisgICAgc2V0IHBhcml0eSBub25lICAgICAgICAgICAgICAgOyBTZXQgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzLgorICAgIHNldCBkdXBsZXggZnVsbAorICAgIHNldCBoYW5kc2hha2Ugbm9uZQorICAgIHNldCBpbnB1dCB0aW1lb3V0IHByb2NlZWQgICAgIDsgSGFuZGxlIHRpbWVvdXRzIG91cnNlbHZlcworICAgIHNldCBjYXNlIG9uICAgICAgICAgICAgICAgICAgIDsgQ2FzZSBpcyBpbXBvcnRhbnQgaW4gVU5JWAorICAgIGRlZiBcJW0gMTAgICAgICAgICAgICAgICAgICAgIDsgV2FpdGluZyB0aW1lIGZvciBJTlBVVAorICAgIGZvciBcJWkgMSA1IDEgeworICAgICAgICBtaW5wdXQgXCVtIGxvZ2luOiB7c3N3b3JkOn0ge1Bhc3N3b3JkIGZvciBcJTE6fQorCWlmIHN1Y2Nlc3MgYnJlYWsKKwlvdXRwdXQgXEJcMTMKKyAgICAgICAgXCVtIDo6PSA2LVwlMQorICAgIH0KKyAgICBpZiA+IFwlaSA1IGVuZCAxIHtObyByZXNwb25zZSBmcm9tIGhvc3R9CisgICAgeGlmID0gXHYobWlucHV0KSAxIHsJICA7IEhhdmUgdXNlcm5hbWUgcHJvbXB0CisJb3V0cHV0IFwlMVwxMwkJICA7IFNlbmQgdXNlcm5hbWUKKyAgICAgICAgbWlucHV0IDUge3Nzd29yZDp9IHtzc3dvcmQgZm9yIFwlMTp9IDsgV2FpdCBmb3IgcGFzc3dvcmQgcHJvbXB0CisJaWYgZmFpbCBlbmQgMSB7Tm8gcGFzc3dvcmQgcHJvbXB0fQorICAgIH0KKyAgICBwYXVzZSAgICAgICAgICAgICAgICAgICAgICAgICA7IFdhaXQgYSBzZWMKKyAgICBvdXQgXCUyXDEzICAgICAgICAgICAgICAgICAgICA7IFNlbmQgcGFzc3dvcmQKKyAgICBpZiBub3QgZGVmIFwlMyAtICAgICAgICAgICAgICA7IElmIHdlIHdlcmUgbm90IGdpdmVuIGEgcHJvbXB0CisgICAgICBhc2cgXCUzIHtcdihwcm9tcHQpfSAgICAgICAgOyB1c2UgdGhlIFNFVCBMT0dJTiBQUk9NUFQgdmFsdWUKKyAgICBpZiBub3QgZGVmIFwlMyAtICAgICAgICAgICAgICA7IElmIHdlIHN0aWxsIGRvbid0IGhhdmUgYSBwcm9tcHQKKyAgICAgIGFzZyBcJTMge1wxMCQgfSAgICAgICAgICAgICA7IHVzZSB0aGlzIG9uZSBhcyB0aGUgZGVmYXVsdAorICAgIHJlaW5wIDAgXCUzICAgICAgICAgICAgICAgICAgIDsgRGlkIHdlIElOUFVUIHRoZSBwcm9tcHQgYWxyZWFkeT8KKyAgICBpZiBmYWlsIGlucCA2MCBcJTMgICAgICAgICAgICA7IE5vLCBsb29rIG5vdy4KKyAgICBpZiBmYWlsIGVuZCAxCit9CisKK0NPTU1FTlQgLSBWTUxJTkVMT0dJTiBtYWNyby4gIEFyZ3VtZW50czoKKzsgXCUxID0gVXNlciBJRAorOyBcJTIgPSBQYXNzd29yZAorOworZGVmaW5lIFZNTElORUxPR0lOIHsKKyAgICBpZiA8IFx2KGFyZ2MpIDIgLQorICAgICAgZW5kIDEgVXNhZ2U6IFwlMCB1c2VyaWQgWyBwYXNzd29yZCBdCisgICAgd2hpbGUgbm90IGRlZmluZWQgXCUyIHsKKyAgICAgICAgYXNrcSBcJTIgeyBcJTEncyBwYXNzd29yZDogfQorICAgIH0KKyAgICBzZXQgcGFyaXR5IG1hcmsgICAgICAgICAgICAgICA7IFNldCBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMKKyAgICBzZXQgZmxvdyBub25lCisgICAgc2V0IGhhbmRzaGFrZSB4b24KKyAgICBzZXQgZHVwbGV4IGhhbGYKKyAgICBzZXQgaW5wdXQgdGltZW91dCBxdWl0ICAgICAgICA7IERvbid0IGJvdGhlciB3aXRoIElGIEZBSUxVUkUKKyAgICBpbnB1dCAxMCBCUkVBSyBLRVkgICAgICAgICAgICA7IExvb2sgZm9yIEJSRUFLIEtFWSBwcm9tcHQKKyAgICBwYXVzZSAxICAgICAgICAgICAgICAgICAgICAgICA7IFdhaXQgYSBzZWNvbmQKKyAgICBvdXRwdXQgXEIgICAgICAgICAgICAgICAgICAgICA7IFNlbmQgQlJFQUsKKyAgICBpbnB1dCAxMCAuXDE3LCBvdXRwdXQgbG9nb24gXCUxXDEzICAgIDsgTm93IGxvZyBpbgorICAgIGlucHV0IDEwIC5cMTcsIG91dHB1dCBcJTJcMTMgICAgICAgICAgOyBTZW5kIHBhc3N3b3JkCisgICAgaW5wdXQgMTAgLlwxNywgb3V0cHV0IFwxMyAgICAgICAgICAgICA7IFNlbmQgY2FycmlhZ2UgcmV0dXJuCisgICAgaW5wdXQgMTAgLlwxNywgb3V0cHV0IFwxMyAgICAgICAgICAgICA7IFNlbmQgYW5vdGhlciBvbmUKKyAgICBlbmQgMAorfQorCitDT01NRU5UIC0gVk1GVUxMT0dJTiBtYWNyby4gIEFyZ3VtZW50czoKKzsgXCUxID0gVXNlciBJRAorOyBcJTIgPSBQYXNzd29yZAorOworZGVmaW5lIFZNRlVMTE9HSU4geworICAgIGlmIDwgXHYoYXJnYykgMiAtCisgICAgICBlbmQgMSBVc2FnZTogXCUwIHVzZXJpZCBbIHBhc3N3b3JkIF0KKyAgICB3aGlsZSBub3QgZGVmaW5lZCBcJTIgeworICAgICAgICBhc2txIFwlMiB7IFwlMSdzIHBhc3N3b3JkOiB9CisgICAgfQorICAgIHNldCBpbnB1dCB0aW1lb3V0IHF1aXQgICAgICA7IFF1aXQgaWYgSU5QVVQgZmFpbHMKKyAgICBzZXQgcGFyaXR5IGV2ZW4gICAgICAgICAgICAgOyBTZXQgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzCisgICAgc2V0IGR1cGxleCBmdWxsCisgICAgc2V0IGhhbmRzaGFrZSBub25lCisgICAgc2V0IGZsb3cgeG9uL3hvZmYKKyAgICBvdXQgXDEzICAgICAgICAgICAgICAgICAgICAgOyBTZW5kIGNhcnJpYWdlIHJldHVybgorICAgIGlucCA1IFRFUk1JTkFMIFRZUEU6ICAgICAgICA7IEdldCB0ZXJtaW5hbC10eXBlIHByb21wdAorICAgIG91dCB2dC0xMDBcMTMgICAgICAgICAgICAgICA7IEp1c3Qgc2VuZCAidnQtMTAwIgorICAgIGlucCAyMCBSVU5OSU5HICAgICAgICAgICAgICA7IEdldCBSVU5OSU5HIG1lc3NhZ2UKKyAgICBwYXUgMSAgICAgICAgICAgICAgICAgICAgICAgOyBXYWl0IG9uZSBzZWNvbmQKKyAgICBvdXQgXCUxXDlcJTJcMTMgICAgICAgICAgICAgOyBTZW5kIHVzZXIgSUQsIHRhYiwgcGFzc3dvcmQKKyAgICBvdXQgXDEzXDEzICAgICAgICAgICAgICAgICAgOyBUd28gbW9yZSBjYXJyaWFnZSByZXR1cm5zCisgICAgZW5kIDAKK30KKworQ09NTUVOVCAtIENJU0xPR0lOIG1hY3JvLiAgQXJndW1lbnRzOgorOyBcJTEgPSBDb21wdVNlcnZlIFVzZXIgSUQKKzsgXCUyID0gUGFzc3dvcmQKKzsgXCUzID0gUHJvbXB0Cis7CitkZWZpbmUgQ0lTTE9HSU4geworICAgIGlmIDwgXHYoYXJnYykgMiAtCisgICAgICBlbmQgMSBVc2FnZTogXCUwIHVzZXJpZCBbIHBhc3N3b3JkIFsgcHJvbXB0IF0gXQorICAgIHdoaWxlIG5vdCBkZWZpbmVkIFwlMiB7CisgICAgICAgIGFza3EgXCUyIHsgXCUxJ3MgcGFzc3dvcmQ6IH0KKyAgICB9CisgICAgc2V0IHRlcm1pbmFsIGJ5dGVzaXplIDcgICAgIDsgTm8gOC1iaXQgY2hhcmFjdGVycworICAgIHNldCBpbnB1dCB0aW1lb3V0IHF1aXQgICAgICA7IFNraXAgdGhlIElGIEZBSUxVUkUncworICAgIG91dHB1dCBcMTMgICAgICAgICAgICAgICAgICA7IFNlbmQgaW5pdGlhbCBjYXJyaWFnZSByZXR1cm4KKyAgICBpbnB1dCA1IEhvc3QgTmFtZTogICAgICAgICAgOyBMb29rIGZvciBIb3N0IE5hbWUgcHJvbXB0CisgICAgb3V0cHV0IGNpc1wxMyAgICAgICAgICAgICAgIDsgU2VuZCAiY2lzIiBhbmQgY2FycmlhZ2UgcmV0dXJuCisgICAgaW5wdXQgNSBVc2VyIElEOiAgICAgICAgICAgIDsgTG9vayBmb3IgVXNlciBJRCBwcm9tcHQKKyAgICBvdXRwdXQgXCUxXDEzICAgICAgICAgICAgICAgOyBTZW5kIElEIGFuZCBjYXJyaWFnZSByZXR1cm4KKyAgICBpbnB1dCBQYXNzd29yZDogICAgICAgICAgICAgOyBMb29rIGZvciBQYXNzd29yZCBwcm9tcHQKKyAgICBvdXRwdXQgXCUyXDEzICAgICAgICAgICAgICAgOyBTZW5kIHBhc3N3b3JkIGFuZCBDUgorICAgIGlmIG5vdCBkZWYgXCUzIGFzZyBcJTMgXHYocHJvbXB0KQorICAgIGlmIG5vdCBkZWYgXCUzIGFzZyBcJTMge0NvbXB1U2VydmUgSW5mb3JtYXRpb24gU2VydmljZX0KKyAgICBpbnB1dCAzMCBcJTMKKyAgICBlbmQgMAorfQorCitDT01NRU5UIC0gRE9XTE9HSU4gbWFjcm8uICBBcmd1bWVudHM6Cis7IFwlMSA9IERvdyBKb25lcyBQYXNzd29yZAorOworZGVmaW5lIERPV0xPR0lOIHsKKyAgICB3aGlsZSBub3QgZGVmaW5lZCBcJTEgeyAgICAgICAgICAgICAgOyBHZXQgcGFzc3dvcmQKKyAgICAgICAgYXNrcSBcJTEgeyBEb3cgSm9uZXMgcGFzc3dvcmQ6IH0KKyAgICB9CisgICAgc2V0IGlucHV0IHRpbWVvdXQgcHJvY2VlZAorICAgIGlucHV0IDIwIFNFUlZJQ0UgUExFQVNFXD9cP1w/XD8gICAgICA7IExvb2sgZm9yIERvdyBwcm9tcHQKKyAgICBpZiBmYWlsIGVuZCAxIE5vIHNlcnZpY2UgcHJvbXB0CisgICAgb3V0IGRqbnJcMTMgICAgICAgICAgICAgICAgICAgICAgICAgIDsgU2VsZWN0IERKTlIKKyAgICBpbnB1dCAxMCBAQEBAQEBAQCAgICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IHBhc3N3b3JkIHByb21wdAorICAgIGlmIGZhaWwgZW5kIDEgTm8gcGFzc3dvcmQgcHJvbXB0CisgICAgcGF1c2UgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgV2FpdCBhIHNlY29uZCwgdGhlbi4uLgorICAgIG91dHB1dCBcJTFcMTMgICAgICAgICAgICAgICAgICAgICAgICA7IHNlbmQgcGFzc3dvcmQgYW5kIENSCisgICAgaW5wdXQgMzAgRU5URVIgUVVFUlkgICAgICAgICAgICAgICAgIDsgR2V0IERKTlIgcXVlcnkgcHJvbXB0CisgICAgaWYgZmFpbCBlbmQgMSBObyBtYWluIHF1ZXJ5IHByb21wdAorICAgIHBhdXNlIDEKK30KKworQ09NTUVOVCAtIERKTlJTUFJJTlQgbWFjcm86IExvZyBpbiB0byBEb3cgSm9uZXMgdmlhIFNwcmludE5ldC4KKzsKK2RlZiBkam5yc3ByaW50IHNwcmludCBkb3csIGlmIHN1Y2Nlc3MgZG93bG9naW4KKworQ09NTUVOVCAtIE5PTE9HSU4gbWFjcm8uICBEb2VzIG5vdGhpbmcuICBVc2Ugd2hlbiBsb2dpbiBub3QgcmVxdWlyZWQuCis7CitkZWYgbm9sb2dpbiBjb21tZW50CisKKzpDVVNUT00gOyBDdXN0b21pemF0aW9uIGZpbGUKKworOyBJbiBWTVMgYW5kIE9wZW5WTVMsIGFsbG93IGZvciBzeXN0ZW0td2lkZSBzaXRlIGN1c3RvbWl6YXRpb25zCisKK3hpZiBlcXVhbCAiXHYoc3lzdGVtKSIgIlZNUyIgeworICAgIHhpZiBleGlzdCBDS0VSTUlUX0lOSTpDS0VSTUlULlNZUyB7CisJZWNobyBFeGVjdXRpbmcgQ0tFUk1JVF9JTkk6Q0tFUk1JVC5TWVMKKwl0YWtlIENLRVJNSVRfSU5JOkNLRVJNSVQuU1lTCisgICAgfQorfQorCis7IEV4ZWN1dGUgdXNlcidzIHBlcnNvbmFsIGN1c3RvbWl6YXRpb24gZmlsZQorCit4aWYgZXhpc3QgXG0oX215aW5pdCkgIHsJCTsgSWYgaXQgZXhpc3RzLAorICAgIGVjaG8gRXhlY3V0aW5nIFxtKF9teWluaXQpLi4uCTsgcHJpbnQgbWVzc2FnZSwKKyAgICB0YWtlIFxtKF9teWluaXQpCQkJOyBhbmQgVEFLRSB0aGUgZmlsZS4KK30KKworOyBGaW5pc2ggdXAgd2l0aCB0cmFkaXRpb25hbCBncmVldGluZy4KKworaWYgPCBcdihudGltZSkgNDMyMDAgZWNobyBHb29kIE1vcm5pbmchCisgIGVsc2UgaWYgPCBcdihudGltZSkgNjEyMDAgZWNobyBHb29kIEFmdGVybm9vbiEKKyAgZWxzZSBlY2hvIEdvb2QgRXZlbmluZy4KKworRW5kIDsgb2YgQy1LZXJtaXQgOC4wIGluaXRpYWxpemF0aW9uIGZpbGUuCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2tlcm1pdDcwLnR4dCBiL2NrZXJtaXQtOC4wLjIxMS9ja2VybWl0NzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2EzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2tlcm1pdDcwLnR4dApAQCAtMCwwICsxLDE3OTU2IEBACisKKyAgIFsgWzFdQ29udGVudHMgXSBbIFsyXUMtS2VybWl0IF0gWyBbM11LZXJtaXQgSG9tZSBdCisKKyAgICAgICAgICAgICAgICAgU3VwcGxlbWVudCB0byBVc2luZyBDLUtlcm1pdCwgU2Vjb25kIEVkaXRpb24KKworRm9yIEMtS2VybWl0IDcuMAorCitBcyBvZiBDLUtlcm1pdCB2ZXJzaW9uOiAgNy4wLjE5NgorVGhpcyBmaWxlIGxhc3QgdXBkYXRlZDogIDggRmVicnVhcnkgMjAwMAorCitBdXRob3JzOiBGcmFuayBkYSBDcnV6IGFuZCBDaHJpc3RpbmUgTS4gR2lhbm9uZQorQWRkcmVzczogVGhlIEtlcm1pdCBQcm9qZWN0CisgICAgICAgICBDb2x1bWJpYSBVbml2ZXJzaXR5CisgICAgICAgICA2MTIgV2VzdCAxMTV0aCBTdHJlZXQKKyAgICAgICAgIE5ldyBZb3JrIE5ZIDEwMDI1LTc3OTkKKyAgICAgICAgIFVTQQorRmF4OiAgICAgKzEgKDIxMikgNjYyLTY0NDIKK0UtTWFpbDogIFs0XWtlcm1pdC1zdXBwb3J0QGNvbHVtYmlhLmVkdQorV2ViOiAgICAgWzVdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworT3I6ICAgICAgWzZdaHR0cDovL3d3dy5rZXJtaXQtcHJvamVjdC5vcmcvCitPcjogICAgICBbN11odHRwOi8vd3d3LmNvbHVtYmlhLm55Yy5ueS51cy9rZXJtaXQvCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgTk9USUNFUworCisgICBUaGlzIGRvY3VtZW50OgorICAgICAgICAgIENvcHlyaWdodCCpIDE5OTcsIDIwMDAsIEZyYW5rIGRhIENydXogYW5kIENocmlzdGluZSBNLiBHaWFub25lLgorICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgIEtlcm1pdCA5NToKKyAgICAgICAgICBDb3B5cmlnaHQgqSAxOTk1LCAyMDAwLCBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZQorICAgICAgICAgIENpdHkgb2YgTmV3IFlvcmsuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgIEMtS2VybWl0OgorICAgICAgICAgIENvcHlyaWdodCCpIDE5ODUsIDIwMDAsCisgICAgICAgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4gQWxsCisgICAgICAgICAgcmlnaHRzIHJlc2VydmVkLiBTZWUgdGhlIEMtS2VybWl0IFs4XUNPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgICAgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIFs5XWNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQKKyAgICAgICAgICBwZXJtaXNzaW9ucy4KKworICAgV2hlbiBLZXJiZXJvcyhUTSkgYW5kL29yIFNSUChUTSkgKFNlY3VyZSBSZW1vdGUgUGFzc3dvcmQpIGFuZC9vciBTU0wKKyAgICAgICAgICBwcm90b2NvbCBhcmUgaW5jbHVkZWQ6CisgICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMTk5MCwgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YKKyAgICAgICAgICBUZWNobm9sb2d5LgorICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCCpIDE5OTEsIDE5OTMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZgorICAgICAgICAgIENhbGlmb3JuaWEuCisgICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBieSBBVCZULgorICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCCpIDE5OTcsIFN0YW5mb3JkIFVuaXZlcnNpdHkuCisgICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMTk5NS0xOTk3LCBFcmljIFlvdW5nCisgICAgICAgICAgPGVheUBjcnlwdG9zb2Z0LmNvbT4uCisKKyAgIEZvciB0aGUgZnVsbCB0ZXh0IG9mIHRoZSB0aGlyZC1wYXJ0eSBjb3B5cmlnaHQgbm90aWNlcywgc2VlCisgICBbMTBdQXBwZW5kaXggVi4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICBXSEFUIElTIElOIFRISVMgRklMRQorCisgICBUaGlzIGZpbGUgbGlzdHMgY2hhbmdlcyBtYWRlIHRvIEMtS2VybWl0IHNpbmNlIHRoZSBzZWNvbmQgZWRpdGlvbiBvZgorICAgdGhlIGJvb2sgWzExXVVzaW5nIEMtS2VybWl0IHdhcyBwdWJsaXNoZWQgYW5kIEMtS2VybWl0IDYuMCB3YXMKKyAgIHJlbGVhc2VkIGluIE5vdmVtYmVyIDE5OTYuIFVzZSB0aGlzIGZpbGUgYXMgYSBzdXBwbGVtZW50IHRvIHRoZSBzZWNvbmQKKyAgIGVkaXRpb24gb2YgVXNpbmcgQy1LZXJtaXQgdW50aWwgdGhlIHRoaXJkIGVkaXRpb24gaXMgcHVibGlzaGVkIHNvbWUKKyAgIHRpbWUgaW4gMjAwMC4gSWYgdGhlICJtb3N0IHJlY2VudCB1cGRhdGUiIHNob3duIGFib3ZlIGlzIGxvbmcgYWdvLAorICAgY29udGFjdCBDb2x1bWJpYSBVbml2ZXJzaXR5IHRvIHNlZSBpZiB0aGVyZSBpcyBhIG5ld2VyIHJlbGVhc2UuCisKKyAgIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBhbHNvIHNlZSB0aGUgWzEyXUNLQ0JXUi5UWFQgKCJDLUtlcm1pdAorICAgYmV3YXJlIikgZmlsZSBmb3IgaGludHMsIHRpcHMsIHRyaWNrcywgcmVzdHJpY3Rpb25zLCBmcmVxdWVudGx5IGFza2VkCisgICBxdWVzdGlvbnMsIGV0YywgcGx1cyB0aGUgc3lzdGVtLXNwZWNpZmljICJiZXdhcmUgZmlsZSIsIGUuZy4KKyAgIFsxM11DS1VCV1IuVFhUIGZvciBVTklYLCBbMTRdQ0tWQldSLlRYVCBmb3IgVk1TLCBldGMsIGFuZCBhbHNvIGFueQorICAgc3lzdGVtLXNwZWNpZmljIHVwZGF0ZSBmaWxlcyBzdWNoIGFzIEtFUk1JVDk1LkhUTSBmb3IgS2VybWl0IDk1IChpbgorICAgdGhlIERPQ1NcTUFOVUFMXCBzdWJkaXJlY3Rvcnkgb2YgeW91ciBLOTUgZGlyZWN0b3J5KS4KKworICAgICBUaGlzIFdlYi1iYXNlZCBjb3B5IG9mIHRoZSBDLUtlcm1pdCA3LjAgdXBkYXRlIG5vdGVzIHN1cGVyc2VkZXMgdGhlCisgICAgIHBsYWluLXRleHQgQ0tFUk1JVDIuVFhUIGZpbGUuIEFsbCBjaGFuZ2VzIGFmdGVyIDE5IEphbnVhcnkgMjAwMAorICAgICBhcHBlYXIgb25seSBoZXJlIGluIHRoZSBXZWIgdmVyc2lvbi4gSWYgeW91IG5lZWQgYW4gdXAtdG8tZGF0ZQorICAgICBwbGFpbi10ZXh0IGNvcHksIHVzZSB5b3VyIFdlYiBicm93c2VyIHRvIHNhdmUgdGhpcyBwYWdlIGFzIHBsYWluCisgICAgIHRleHQuIAorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIEFCT1VUIEZJTEVOQU1FUworCisgICBJbiB0aGlzIGRvY3VtZW50LCBmaWxlbmFtZXMgYXJlIGdlbmVyYWxseSBzaG93biBpbiB1cHBlcmNhc2UsIGJ1dCBvbgorICAgZmlsZSBzeXN0ZW1zIHdpdGggY2FzZS1zZW5zaXRpdmUgbmFtZXMgc3VjaCBhcyBVTklYLCBPUy05LCBhbmQgQU9TL1ZTLAorICAgbG93ZXJjYXNlIG5hbWVzIGFyZSB1c2VkOiBbMTVdY2t1YndyLnR4dCwgWzE2XWNrZXJtaXQ3MC50eHQsIGV0Yy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICBBRERJVElPTkFMIEZJTEVTCisKKyAgIFNldmVyYWwgb3RoZXIgZmlsZXMgYWNjb21wYW55IHRoaXMgbmV3IEtlcm1pdCByZWxlYXNlOgorCisgICBTRUNVUklUWS5UWFQKKyAgICAgICAgICBEaXNjdXNzaW9uIG9mIEtlcm1pdCdzIG5ldyBhdXRoZW50aWNhdGlvbiBhbmQgZW5jcnlwdGlvbgorICAgICAgICAgIGZlYXR1cmVzOgorCisgICAgICAgICAgKyBbMTddUGxhaW4tdGV4dCB2ZXJzaW9uCisgICAgICAgICAgKyBbMThdSFRNTCAoaHlwZXJ0ZXh0KSB2ZXJzaW9uCisKKyAgIElLU0QuVFhUCisgICAgICAgICAgSG93IHRvIGluc3RhbGwgYW5kIG1hbmFnZSBhbiBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSBEYWVtb24uCisKKyAgICAgICAgICArIFsxOV1QbGFpbi10ZXh0IHZlcnNpb24KKyAgICAgICAgICArIFsyMF1IVE1MIChoeXBlcnRleHQpIHZlcnNpb24KKworICAgICAgICAgIEFsc28gc2VlIFsyMV1jdWlrc2QuaHRtIGZvciBpbnN0cnVjdGlvbnMgZm9yIHVzZS4KKworICAgVEVMTkVULlRYVAorICAgICAgICAgIEEgdGhvcm91Z2ggcHJlc2VudGF0aW9uIG9mIEtlcm1pdCdzIG5ldyBhZHZhbmNlZCBUZWxuZXQKKyAgICAgICAgICBmZWF0dXJlcyBhbmQgY29udHJvbHMuCisKKyAgICAgICAgICArIFsyMl1QbGFpbi10ZXh0IHZlcnNpb24KKyAgICAgICAgICArIFsyM11IVE1MIChoeXBlcnRleHQpIHZlcnNpb24KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICBUSEUgTkVXIEMtS0VSTUlUIExJQ0VOU0UKKworICAgVGhlIEMtS2VybWl0IGxpY2Vuc2Ugd2FzIHJld3JpdHRlbiBmb3IgdmVyc2lvbiA3LjAgdG8gZ3JhbnQgYXV0b21hdGljCisgICBwZXJtaXNzaW9uIHRvIHBhY2thZ2VycyBvZiBmcmVlIG9wZXJhdGluZy1zeXN0ZW0gZGlzdHJpYnV0aW9ucyB0bworICAgaW5jbHVkZSBDLUtlcm1pdCA3LjAuIEV4YW1wbGVzIGluY2x1ZGUgTGludXggKEdOVS9MaW51eCksIEZyZWVCU0QsCisgICBOZXRCU0QsIGV0Yy4gVGhlIG5ldyBsaWNlbnNlIGlzIGluIHRoZSBbMjRdQ09QWUlORy5UWFQgZmlsZSwgYW5kIGlzCisgICBhbHNvIGRpc3BsYXllZCBieSBDLUtlcm1pdCBpdHNlbGYgd2hlbiB5b3UgZ2l2ZSB0aGUgVkVSU0lPTiBvcgorICAgQ09QWVJJR0hUIGNvbW1hbmQuIFRoZSBuZXcgQy1LZXJtaXQgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0bworICAgWzI1XUtlcm1pdCA5NS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICBBQ0tOT1dMRURHTUVOVFMKKworICAgVGhhbmtzIHRvIEplZmYgQWx0bWFuLCB3aG8gam9pbmVkIHRoZSBLZXJtaXQgUHJvamVjdCBpbiAxOTk1LCBmb3IgbXVjaAorICAgb2Ygd2hhdCB5b3Ugc2VlIGluIEMtS2VybWl0IDcuMCwgZXNwZWNpYWxseSBpbiB0aGUgbmV0d29ya2luZyBhbmQKKyAgIHNlY3VyaXR5IGFyZWFzLCBhbmQgaGlzIGtleSByb2xlIGluIGRlc2lnbmluZyBhbmQgaW1wbGVtZW50aW5nIHRoZQorICAgSW50ZXJuZXQgS2VybWl0IFNlcnZpY2UgRGFlbW9uLiBBbmQgc3BlY2lhbCB0aGFua3MgdG8gTHVjYXMgSGFydCBmb3IKKyAgIGxvdHMgb2YgaGVscCB3aXRoIHRoZSBWTVMgdmVyc2lvbjsgdG8gUGV0ZXIgRWljaGhvcm4gZm9yIGNvbnRpbnVvdXMKKyAgIHRlc3Rpbmcgb24gdGhlIGZ1bGwgcmFuZ2Ugb2YgSFAtVVggdmVyc2lvbnMgYW5kIGZvciBhIGNvbnNvbGlkYXRlZCBzZXQKKyAgIG9mIEhQLVVYIG1ha2VmaWxlIHRhcmdldHM7IGFuZCB0byBDb2xpbiBBbGxlbiwgTWFyayBBbGxlbiwgUm9nZXIKKyAgIEFsbGVuLCBSaWMgQW5kZXJzb24sIFdpbGxpYW0gQmFkZXIsIE1pdGNoIEJha2VyLCBNaXRjaGVsbCBCYXNzLCBOZWxzb24KKyAgIEJlZWJlLCBHZXJyeSBCZWxhbmdlciwgSmVmZiBCZXJuc3RlbiwgTWFyayBCZXJyeW1hbiwgSm9obiBCaWdnLCBWb2xrZXIKKyAgIEJvcmNoZXJ0LCBKb25hdGhhbiBCb3N3ZWxsLCBUaW0gQm95ZXIsIEZyZWRlcmljayBCcnVja21hbiwgS2VubmV0aAorICAgQ29jaHJhbiwgSmFyZWQgQ3JhcG8sIEJpbGwgRGVsYW5leSwgSWdvciBTb2JyYWRvIERlbGdhZG8sIENsYXJlbmNlCisgICBEb2xkLCBKb2UgRG91cG5paywgSm9obiBEdW5sYXAsIE1heCBFdmFydHMsIFBhdHJpY2sgRnJlbmNoLCBDYXJsCisgICBGcmllZGJlcmcsIENhcmwgRnJpZW5kLCBIaXJvZnVtaSBGdWppaSwgQW5kcmV3IEdhYnJpZWwsIEdhYmUgR2FyemEsCisgICBCb3lkIEdlcmJlciwgRGF2aWQgR2VyYmVyLCBHZW9yZ2UgR2lsbWVyLCBIdW50ZXIgR29hdGxleSwgREogSGFnYmVyZywKKyAgIEtldmluIEhhbmR5LCBBbmR5IEhhcnBlciwgUmFuZG9scGggSGVyYmVyLCBTdmVuIEhvbHN0cvZtLCBNaWNoYWwKKyAgIEphZWdlcm1hbm4sIEdyYWhhbSBKZW5raW5zLCBEaWNrIEpvbmVzLCBUZXJyeSBLZW5uZWR5LCBSb2JlcnQgRCBLZXlzLAorICAgTmljayBLaXNzZWJlcnRoLCBJZ29yIEtvdmFsZW5rbywgRGF2aWQgTGFuZSwgQWRhbSBMYXVyaWUsIEplZmYKKyAgIExpZWJlcm1hbm4sIEVyaWMgTG9udmljaywgSG9pIFdhbiBMb3VpcywgQXJ0aHVyIE1hcnNoLCBHcmVnb3JpZQorICAgTWFydGluLCBQZXRlciBNYXV6ZXksIERyYWdhbiBNaWxpY2ljLCBUb2RkIE1pbGxlciwgQ2hyaXN0aWFuIE1vbmRydXAsCisgICBEYW5pZWwgTW9yYXRvLCBEYXQgTmd1eWVuLCBIZXJiIFBleWVybCwgSmVhbi1QaWVycmUgUmFkbGV5LCBTdGV2ZQorICAgUmFuY2UsIFN0ZXBoZW4gUmllaG0sIE5pZ2VsIFJvbGVzLCBMYXJyeSBSb3Nlbm1hbiwgSmF5IFMgUm91bWFuLCBEYXZpZAorICAgU2FuZGVyc29uLCBKb2huIFNhbnRvcywgTWljaGFlbCBTY2htaXR6LCBTdGV2ZW4gU2NodWx0eiwgQm9iIFNoYWlyLAorICAgUmljaGFyZCBTaHVmb3JkLCBGcmVkIFNtaXRoLCBNaWNoYWVsIFNva29sb3YsIEppbSBTcGF0aCwgUGV0ZXIgU3plbGwsCisgICBUZWQgVCdzbywgQnJpYW4gVGlsbG1hbiwgTGludXMgVG9ydmFsZHMsIFBhdHJpY2sgVm9sa2VyZGluZywgTWFydGluCisgICBWb3Js5G5kZXIsIFN0ZXZlIFdhbHRvbiwgS2VuIFdlYXZlcmxpbmcsIEpvaG4gV2Vla2xleSwgTWFydGluCisgICBXaGl0YWtlciwgSmltIFdoaXRieSwgTWF0dCBXaWxsbWFuLCBKb2VsbGVuIFdpbmRzb3IsIEZhcnJlbGwgV29vZHMsCisgICBhbmQgbWFueSBvdGhlcnMgZm9yIGJpbmFyaWVzLCBob3N0aW5nLCByZXZpZXdzLCBzdWdnZXN0aW9ucywgYWR2aWNlLAorICAgYnVnIHJlcG9ydHMsIGFuZCBhbGwgdGhlIHJlc3Qgb3ZlciB0aGUgMysgeWVhciBDLUtlcm1pdCA3LjAKKyAgIGRldmVsb3BtZW50IGN5Y2xlLiBUaGFua3MgdG8gUnVzcyBOZWxzb24gYW5kIHRoZSBib2FyZCBvZiB0aGUgT3BlbgorICAgU29mdHdhcmUgSW5pdGlhdGl2ZSAoWzI2XWh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcpIGZvciB0aGVpcgorICAgY29vcGVyYXRpb24gaW4gZGV2ZWxvcGluZyB0aGUgbmV3IEMtS2VybWl0IGxpY2Vuc2UgYW5kIHRvIHRoZQorICAgcHJvcHJpZXRvcnMgb2YgdGhvc2UgZnJlZSBVTklYIGRpc3RyaWJ1dGlvbnMgdGhhdCBoYXZlIGluY29ycG9yYXRlZAorICAgQy1LZXJtaXQgNy4wIGZvciB0aGVpciBjb29wZXJhdGlvbiBhbmQgc3VwcG9ydCwgZXNwZWNpYWxseSBGcmVlQlNEJ3MKKyAgIEr2cmcgV3Vuc2NoLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIE5PVEUgVE8gS0VSTUlUIDk1IFVTRVJTCisKKyAgIEtlcm1pdCA5NSBhbmQgQy1LZXJtaXQgc2hhcmUgdGhlIHNhbWUgY29tbWFuZCBhbmQgc2NyaXB0aW5nIGxhbmd1YWdlLAorICAgdGhlIHNhbWUgS2VybWl0IGZpbGUtdHJhbnNmZXIgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24sIGFuZCBtdWNoIGVsc2UKKyAgIGJlc2lkZXMuCisKKyAgIExpa2UgdGhlIGJvb2sgWzI3XVVzaW5nIEMtS2VybWl0LCB0aGlzIGZpbGUgY29uY2VudHJhdGVzIG9uIHRoZQorICAgYXNwZWN0cyBvZiBDLUtlcm1pdCB0aGF0IGFyZSBjb21tb24gdG8gYWxsIHZlcnNpb25zOiBVTklYLCBWTVMsCisgICBXaW5kb3dzLCBPUy8yLCBWT1MsIEFPUy9WUywgZXRjLiBQbGVhc2UgcmVmZXIgdG8geW91ciBLZXJtaXQgOTUKKyAgIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gS2VybWl0IDk1LgorCisgICBDLUtlcm1pdCA3LjAgY29ycmVzcG9uZHMgdG8gS2VybWl0IDk1IDEuMS4xOS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICBDLUtFUk1JVCBWRVJTSU9OUyBBTkQgVkVSU0lPTiBOVU1CRVJTCisKKyAgICJDLUtlcm1pdCIgcmVmZXJzIHRvIGFsbCB0aGUgbWFueSBwcm9ncmFtcyB0aGF0IGFyZSBjb21waWxlZCBpbiB3aG9sZQorICAgb3IgaW4gcGFydCBmcm9tIGNvbW1vbiBDLWxhbmd1YWdlIHNvdXJjZSBjb2RlLCBjb21wcmlzaW5nOgorCisgICAgICogQSBLZXJtaXQgZmlsZSB0cmFuc2ZlciBwcm90b2NvbCBtb2R1bGUKKyAgICAgKiBBIGNvbW1hbmQgcGFyc2VyIGFuZCBzY3JpcHQgZXhlY3V0aW9uIG1vZHVsZQorICAgICAqIEEgbW9kZW0tZGlhbGluZyBtb2R1bGUKKyAgICAgKiBBIG5ldHdvcmsgc3VwcG9ydCBtb2R1bGUKKyAgICAgKiBBIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gbW9kdWxlLgorCisgICBhbmQgc2V2ZXJhbCBvdGhlcnMuIFRoZXNlICJzeXN0ZW0taW5kZXBlbmRlbnQiIG1vZHVsZXMgYXJlIGNvbWJpbmVkCisgICB3aXRoIHN5c3RlbS1kZXBlbmRlbnQgbW9kdWxlcyBmb3IgZWFjaCBwbGF0Zm9ybSB0byBwcm92aWRlIHRoZQorICAgcmVxdWlyZWQgaW5wdXQvb3V0cHV0IGZ1bmN0aW9ucywgYW5kIGFsc28gaW4gc29tZSBjYXNlcyBvdmVybGFpZCB3aXRoCisgICBhbiBhbHRlcm5hdGl2ZSB1c2VyIGludGVyZmFjZSwgc3VjaCBhcyBNYWNpbnRvc2ggS2VybWl0J3MKKyAgIHBvaW50LWFuZC1jbGljayBpbnRlcmZhY2UsIGFuZCBpbiBzb21lIGNhc2VzIGFsc28gYSB0ZXJtaW5hbCBlbXVsYXRvciwKKyAgIGFzIEtlcm1pdCA5NS4KKworICAgVGhlIEMtS2VybWl0IHZlcnNpb24gbnVtYmVyIHN0YXJ0ZWQgYXMgMS4wLCAuLi4gMy4wLCA0LjAsIDQuMSBhbmQgdGhlbgorICAgKGJlY2F1c2Ugb2YgY29uZnVzaW9uIGF0IHRoZSB0aW1lIHdpdGggQmVya2VsZXkgVU5JWCA0LjIpLCA0QiwgNEMsIGFuZAorICAgc28gb24sIHdpdGggdGhlIHNwZWNpZmljIGVkaXQgbnVtYmVyIGluIHBhcmVudGhlc2VzLCBmb3IgZXhhbXBsZQorICAgNEUoMDcyKSBvciA1QSgxODgpLiBUaGlzIHNjaGVtZSB3YXMgdXNlZCB0aHJvdWdoIDVBKDE5MSksIGJ1dCBub3cgd2UKKyAgIGhhdmUgZ29uZSBiYWNrIHRvIHRoZSB0cmFkaXRpb25hbCBudW1iZXJpbmcgc2NoZW1lIHdpdGggZGVjaW1hbAorICAgcG9pbnRzOiBtYWpvci5taW5vci5lZGl0OyBmb3IgZXhhbXBsZSA3LjAuMTk2LiBJbnRlcm5hbCB2ZXJzaW9uCisgICBudW1iZXJzICh0aGUgXHYodmVyc2lvbikgdmFyaWFibGUpLCBob3dldmVyLCBhcmUgY29tcGF0aWJsZSBpbgorICAgQy1LZXJtaXQgNUEgdXB3YXJkcy4KKworICAgTWVhbndoaWxlLCBDLUtlcm1pdCBkZXJpdmF0aXZlcyBmb3Igc29tZSBwbGF0Zm9ybXMgKFdpbmRvd3MsCisgICBNYWNpbnRvc2gpIG1pZ2h0IGdvIHRocm91Z2ggc2V2ZXJhbCByZWxlYXNlcyB3aGlsZSBDLUtlcm1pdCBpdHNlbGYKKyAgIHJlbWFpbnMgdGhlIHNhbWUuIFRoZXNlIHZlcnNpb25zIGhhdmUgdGhlaXIgb3duIHBsYXRmb3JtLXNwZWNpZmljCisgICB2ZXJzaW9uIG51bWJlcnMsIHN1Y2ggYXMgS2VybWl0IDk1IDEuMS4xLCAxLjEuMiwgYW5kIHNvIG9uLgorCisgICBDLUtlcm1pdCBWZXJzaW9uIEhpc3Rvcnk6CisKKyAgMS4wICAgICAgIDE5ODEtMTk4MiAgICAgICAgIENvbW1hbmQtbGluZSBvbmx5LCA0LjIgQlNEIFVOSVggb25seQorICAyLjAgICAgICAgKCopICAgICAgICAgICAgICAgKHdobyByZW1lbWJlcnMuLi4pCisgIDMuMCAgICAgICBNYXkgMTk4NCAgICAgICAgICBDb21tYW5kLWxpbmUgb25seSwgc3VwcG9ydHMgc2V2ZXJhbCBwbGF0Zm9ybXMKKyAgNC4wLTQuMSAgIEZlYi1BcHIgMTk4NSAoKikgIEZpcnN0IGludGVyYWN0aXZlIGFuZCBtb2R1bGFyIHZlcnNpb24KKyAgNEMoMDUwKSAgIE1heSAxOTg1CisgIDREKDA2MCkgICBBcHJpbCAxOTg2CisgIDRFKDA2NikgICBBdWd1c3QgMTk4NyAgICAgICBMb25nIHBhY2tldHMKKyAgNEUoMDY4KSAgIEphbnVhcnkgMTk4OAorICA0RSgwNzIpICAgSmFudWFyeSAxOTg5CisgIDRGKDA5NSkgICBBdWd1c3QgMTk4OSAoKikgICBBdHRyaWJ1dGUgcGFja2V0cworICA1QSgxODgpICAgTm92ZW1iZXIgMTk5MiAgICAgU2NyaXB0aW5nLCBUQ1AvSVAsIHNsaWRpbmcgd2luZG93cyAoMSkKKyAgNUEoMTg5KSAgIFNlcHRlbWJlciAxOTkzICAgIENvbnRyb2wtY2hhciB1bnByZWZpeGluZworICA1QSgxOTApICAgT2N0b2JlciAxOTk0ICAgICAgUmVjb3ZlcnkKKyAgNUEoMTkxKSAgIEFwcmlsIDE5OTUgICAgICAgIE9TLzIgb25seQorICA2LjAuMTkyICAgU2VwdGVtYmVyIDE5OTYgICAgSW50ZWxsaWdlbnQgZGlhbGluZywgYXV0b2Rvd25sb2FkLCBsb3RzIG1vcmUgKDIpCisgIDYuMS4xOTMgICAxOTk3LTk4ICgqKSAgICAgICBEZXZlbG9wbWVudCBvbmx5CisgIDYuMS4xOTQgICBKdW5lIDE5OTggICAgICAgICBLOTUgb25seSAtIHN3aXRjaGVzLCBkaXJlY3RvcnkgcmVjdXJzaW9uLCBtb3JlCisgIDcuMC4xOTUgICBBdWd1c3QgMTk5OSAgICAgICBJS1NEICsgbW9yZSAoQ1Ugb25seSBhcyBLOTUgMS4xLjE4LUNVKQorICA3LjAuMTk2ICAgMSBKYW51YXJ5IDIwMDAgICAgVW5pY29kZSwgbG90cyBtb3JlCisKKyAgICgqKSBOZXZlciBmb3JtYWxseSByZWxlYXNlZCAoNC4wIHdhcyBhIHRvdGFsIHJld3JpdGUpCisgICAoMSkgVXNpbmcgQy1LZXJtaXQsIDFzdCBFZGl0aW9uCisgICAoMikgVXNpbmcgQy1LZXJtaXQsIDJuZCBFZGl0aW9uCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKK0NPTlRFTlRTCisKKyBJLiAgWzI4XUMtS0VSTUlUIERPQ1VNRU5UQVRJT04KKworIElJLiBbMjldTkVXIEZFQVRVUkVTCisKKyAgICAgKDApIFszMF1JTkNPTVBBVElCSUxJVElFUyBXSVRIIFBSRVZJT1VTIFJFTEVBU0VTCisgICAgICgxKSBbMzFdUFJPR1JBTSBBTkQgRklMRSBNQU5BR0VNRU5UIEFORCBDT01NQU5EUworICAgICAgICAgMS4wLiAgWzMyXUJ1ZyBmaXhlcworICAgICAgICAgMS4xLiAgWzMzXUNvbW1hbmQgQ29udGludWF0aW9uCisgICAgICAgICAxLjIuICBbMzRdRWRpdG9yIEludGVyZmFjZQorICAgICAgICAgMS4zLiAgWzM1XVdlYiBCcm93c2VyIGFuZCBGVFAgSW50ZXJmYWNlCisgICAgICAgICAxLjQuICBbMzZdQ29tbWFuZCBFZGl0aW5nCisgICAgICAgICAxLjUuICBbMzddQ29tbWFuZCBTd2l0Y2hlcworICAgICAgICAgICAgICAgMS41LjEuIFszOF1HZW5lcmFsIFN3aXRjaCBTeW50YXgKKyAgICAgICAgICAgICAgIDEuNS4yLiBbMzldT3JkZXIgYW5kIEVmZmVjdCBvZiBTd2l0Y2hlcworICAgICAgICAgICAgICAgMS41LjMuIFs0MF1EaXN0aW5ndWlzaGluZyBTd2l0Y2hlcyBmcm9tIE90aGVyIEZpZWxkcworICAgICAgICAgICAgICAgMS41LjQuIFs0MV1TdGFuZGFyZCBGaWxlIFNlbGVjdGlvbiBTd2l0Y2hlcworICAgICAgICAgICAgICAgMS41LjUuIFs0Ml1TZXR0aW5nIFByZWZlcmVuY2VzIGZvciBEaWZmZXJlbnQgQ29tbWFuZHMKKyAgICAgICAgIDEuNi4gIFs0M11EYXRlcyBhbmQgVGltZXMKKyAgICAgICAgIDEuNy4gIFs0NF1QYXJ0aWFsIENvbXBsZXRpb24gb2YgS2V5d29yZHMKKyAgICAgICAgIDEuOC4gIFs0NV1Db21tYW5kIFJlY2FsbAorICAgICAgICAgMS45LiAgWzQ2XUVYSVQgTWVzc2FnZXMKKyAgICAgICAgIDEuMTAuIFs0N11NYW5hZ2luZyBLZXlib2FyZCBJbnRlcnJ1cHRpb25zCisgICAgICAgICAxLjExLiBbNDhdVGFtaW5nIHRoZSBXaWxkIEJhY2tzbGFzaCAtLSBQYXJ0IERldXgKKyAgICAgICAgICAgICAgIDEuMTEuMS4gWzQ5XUJhY2tncm91bmQKKyAgICAgICAgICAgICAgIDEuMTEuMi4gWzUwXUtlcm1pdCdzIFF1b3RpbmcgUnVsZXMKKyAgICAgICAgICAgICAgIDEuMTEuMy4gWzUxXVBhc3NpbmcgRE9TIEZpbGVuYW1lcyBmcm9tIEtlcm1pdCB0byBTaGVsbCBDb21tYW5kcworICAgICAgICAgICAgICAgMS4xMS40LiBbNTJdVXNpbmcgVmFyaWFibGVzIHRvIEhvbGQgRE9TIEZpbGVuYW1lcworICAgICAgICAgICAgICAgMS4xMS41LiBbNTNdUGFzc2luZyBET1MgRmlsZW5hbWVzIGFzIFBhcmFtZXRlcnMgdG8gTWFjcm9zCisgICAgICAgICAgICAgICAxLjExLjYuIFs1NF1QYXNzaW5nIERPUyBGaWxlIE5hbWVzIGZyb20gTWFjcm8gUGFyYW1ldGVycyB0byB0aGUKK0RPUyBTaGVsbAorICAgICAgICAgICAgICAgMS4xMS43LiBbNTVdUGFzc2luZyBET1MgRmlsZW5hbWVzIHRvIEtlcm1pdCBmcm9tIHRoZSBTaGVsbAorICAgICAgICAgMS4xMi4gWzU2XURlYnVnZ2luZworICAgICAgICAgMS4xMy4gWzU3XUxvZ3MKKyAgICAgICAgIDEuMTQuIFs1OF1BdXRvbWF0aWMgRmlsZS1UcmFuc2ZlciBQYWNrZXQgUmVjb2duaXRpb24gYXQgdGhlIENvbW1hbmQgUHIKK29tcHQKKyAgICAgICAgIDEuMTUuIFs1OV1UaGUgVFlQRSBDb21tYW5kCisgICAgICAgICAxLjE2LiBbNjBdVGhlIFJFU0VUIENvbW1hbmQKKyAgICAgICAgIDEuMTcuIFs2MV1UaGUgQ09QWSBhbmQgUkVOQU1FIENvbW1hbmRzCisgICAgICAgICAxLjE4LiBbNjJdVGhlIE1BTlVBTCBDb21tYW5kCisgICAgICAgICAxLjE5LiBbNjNdU3RyaW5nIGFuZCBGaWxlbmFtZSBNYXRjaGluZyBQYXR0ZXJucworICAgICAgICAgMS4yMC4gWzY0XU11bHRpcGxlIENvbW1hbmRzIG9uIE9uZSBMaW5lCisgICAgICAgICAxLjIxLiBbNjVdV2hhdCBEbyBJIEhhdmU/CisgICAgICAgICAxLjIyLiBbNjZdR2VuZXJhbGl6ZWQgRmlsZSBJbnB1dCBhbmQgT3V0cHV0CisgICAgICAgICAgICAgICAxLjIyLjEuIFs2N11XaHkgQW5vdGhlciBJL08gU3lzdGVtPworICAgICAgICAgICAgICAgMS4yMi4yLiBbNjhdVGhlIEZJTEUgQ29tbWFuZAorICAgICAgICAgICAgICAgMS4yMi4zLiBbNjldRklMRSBDb21tYW5kIEV4YW1wbGVzCisgICAgICAgICAgICAgICAxLjIyLjQuIFs3MF1DaGFubmVsIE51bWJlcnMKKyAgICAgICAgICAgICAgIDEuMjIuNS4gWzcxXUZJTEUgQ29tbWFuZCBFcnJvciBDb2RlcworICAgICAgICAgICAgICAgMS4yMi42LiBbNzJdRmlsZSBJL08gVmFyaWFibGVzCisgICAgICAgICAgICAgICAxLjIyLjcuIFs3M11GaWxlIEkvTyBGdW5jdGlvbnMKKyAgICAgICAgICAgICAgIDEuMjIuOC4gWzc0XUZpbGUgSS9PIEZ1bmN0aW9uIEV4YW1wbGVzCisgICAgICAgICAxLjIzLiBbNzVdVGhlIEVYRUMgQ29tbWFuZAorICAgICAgICAgMS4yNC4gWzc2XUdldHRpbmcgS2V5d29yZCBMaXN0cyB3aXRoICc/JworICAgICAoMikgWzc3XU1BS0lORyBBTkQgVVNJTkcgQ09OTkVDVElPTlMKKyAgICAgICAgIDIuMC4gWzc4XVNFVCBMSU5FIGFuZCBTRVQgSE9TVCBDb21tYW5kIFN3aXRjaGVzCisgICAgICAgICAyLjEuIFs3OV1EaWFsaW5nCisgICAgICAgICAgICAgIDIuMS4xLiBbODBdVGhlIERpYWwgUmVzdWx0IE1lc3NhZ2UKKyAgICAgICAgICAgICAgMi4xLjIuIFs4MV1Mb25nLURpc3RhbmNlIERpYWxpbmcgQ2hhbmdlcworICAgICAgICAgICAgICAyLjEuMy4gWzgyXUZvcmNpbmcgTG9uZy1EaXN0YW5jZSBEaWFsaW5nCisgICAgICAgICAgICAgIDIuMS40LiBbODNdRXhjaGFuZ2UtU3BlY2lmaWMgRGlhbGluZyBEZWNpc2lvbnMKKyAgICAgICAgICAgICAgMi4xLjUuIFs4NF1DYXV0aW9ucyBhYm91dCBDaGVhcGVzdC1GaXJzdCBEaWFsaW5nCisgICAgICAgICAgICAgIDIuMS42LiBbODVdQmxpbmQgRGlhbGluZyAoRGlhbGluZyB3aXRoIE5vIERpYWx0b25lKQorICAgICAgICAgICAgICAyLjEuNy4gWzg2XVRyaW1taW5nIHRoZSBEaWFsaW5nIERpYWxvZworICAgICAgICAgICAgICAyLjEuOC4gWzg3XUNvbnRyb2xsaW5nIHRoZSBEaWFsaW5nIFNwZWVkCisgICAgICAgICAgICAgIDIuMS45LiBbODhdUHJldGVzdGluZyBQaG9uZSBOdW1iZXIgQ29udmVyc2lvbnMKKyAgICAgICAgICAgICAgMi4xLjEwLiBbODldR3JlYXRlciBDb250cm9sIG92ZXIgUGFydGlhbCBEaWFsaW5nCisgICAgICAgICAgICAgIDIuMS4xMS4gWzkwXU5ldyBESUFMLXJlbGF0ZWQgVmFyaWFibGVzIGFuZCBGdW5jdGlvbnMKKyAgICAgICAgICAgICAgMi4xLjEyLiBbOTFdSW5jcmVhc2VkIEZsZXhpYmlsaXR5IG9mIFBCWCBEaWFsaW5nCisgICAgICAgICAgICAgIDIuMS4xMy4gWzkyXVRoZSBESUFMIG1hY3JvIC0gTGFzdC1NaW51dGUgUGhvbmUgTnVtYmVyIENvbnZlcnNpb25zCisgICAgICAgICAgICAgIDIuMS4xNC4gWzkzXUF1dG9tYXRpYyBUb25lL1B1bHNlIERpYWxpbmcgU2VsZWN0aW9uCisgICAgICAgICAgICAgIDIuMS4xNS4gWzk0XURpYWwtTW9kaWZpZXIgVmFyaWFibGVzCisgICAgICAgICAgICAgIDIuMS4xNi4gWzk1XUdpdmluZyBNdWx0aXBsZSBOdW1iZXJzIHRvIHRoZSBESUFMIENvbW1hbmQKKyAgICAgICAgIDIuMi4gWzk2XU1vZGVtcworICAgICAgICAgICAgICAyLjIuMS4gWzk3XU5ldyBNb2RlbSBUeXBlcworICAgICAgICAgICAgICAyLjIuMi4gWzk4XU5ldyBNb2RlbSBDb250cm9scworICAgICAgICAgMi4zLiBbOTldVEVMTkVUIGFuZCBSTE9HSU4KKyAgICAgICAgICAgICAgMi4zLjAuIFsxMDBdQnVnIEZpeGVzCisgICAgICAgICAgICAgIDIuMy4xLiBbMTAxXVRlbG5ldCBCaW5hcnkgTW9kZSBCdWcgQWRqdXN0bWVudHMKKyAgICAgICAgICAgICAgMi4zLjIuIFsxMDJdVk1TIFVDWCBUZWxuZXQgUG9ydCBCdWcgQWRqdXN0bWVudAorICAgICAgICAgICAgICAyLjMuMy4gWzEwM11UZWxuZXQgTmV3IEVudmlyb25tZW50IE9wdGlvbgorICAgICAgICAgICAgICAyLjMuNC4gWzEwNF1UZWxuZXQgTG9jYXRpb24gT3B0aW9uCisgICAgICAgICAgICAgIDIuMy41LiBbMTA1XUNvbm5lY3RpbmcgdG8gUmF3IFRDUCBTb2NrZXRzCisgICAgICAgICAgICAgIDIuMy42LiBbMTA2XUluY29taW5nIFRDUCBDb25uZWN0aW9ucworICAgICAgICAgMi40LiBbMTA3XVRoZSBFSUdIVEJJVCBDb21tYW5kCisgICAgICAgICAyLjUuIFsxMDhdVGhlIFNlcnZpY2VzIERpcmVjdG9yeQorICAgICAgICAgMi42LiBbMTA5XUNsb3NpbmcgQ29ubmVjdGlvbnMKKyAgICAgICAgIDIuNy4gWzExMF1Vc2luZyBDLUtlcm1pdCB3aXRoIEV4dGVybmFsIENvbW11bmljYXRpb24gUHJvZ3JhbXMKKyAgICAgICAgICAgICAgMi43LjAuIFsxMTFdQy1LZXJtaXQgb3ZlciB0bjMyNzAgYW5kIHRuNTI1MAorICAgICAgICAgICAgICAyLjcuMS4gWzExMl1DLUtlcm1pdCBvdmVyIFRlbG5ldAorICAgICAgICAgICAgICAyLjcuMi4gWzExM11DLUtlcm1pdCBvdmVyIFJsb2dpbgorICAgICAgICAgICAgICAyLjcuMy4gWzExNF1DLUtlcm1pdCBvdmVyIFNlcmlhbCBDb21tdW5pY2F0aW9uIFByb2dyYW1zCisgICAgICAgICAgICAgIDIuNy40LiBbMTE1XUMtS2VybWl0IG92ZXIgU2VjdXJlIE5ldHdvcmsgQ2xpZW50cworICAgICAgICAgICAgICAyLjcuNC4xLiBbMTE2XVNTSAorICAgICAgICAgICAgICAyLjcuNC4yLiBbMTE3XVNTTAorICAgICAgICAgICAgICAyLjcuNC4zLiBbMTE4XVNSUAorICAgICAgICAgICAgICAyLjcuNC40LiBbMTE5XVNPQ0tTCisgICAgICAgICAgICAgIDIuNy40LjUuIFsxMjBdS2VyYmVyb3MgYW5kIFNSUAorICAgICAgICAgMi44LiBbMTIxXVNjcmlwdGluZyBMb2NhbCBQcm9ncmFtcworICAgICAgICAgMi45LiBbMTIyXVguMjUgTmV0d29ya2luZworICAgICAgICAgICAgICAyLjkuMS4gWzEyM11JQk0gQUlYTGluay9YLjI1IE5ldHdvcmsgUHJvdmlkZXIgSW50ZXJmYWNlIGZvciBBSVgKKyAgICAgICAgICAgICAgMi45LjIuIFsxMjRdSFAtVVggWC4yNQorICAgICAgICAgMi4xMC4gWzEyNV1BZGRpdGlvbmFsIFNlcmlhbCBQb3J0IENvbnRyb2xzCisgICAgICAgICAyLjExLiBbMTI2XUdldHRpbmcgQWNjZXNzIHRvIHRoZSBEaWFsb3V0IERldmljZQorICAgICAgICAgMi4xMi4gWzEyN11UaGUgQ29ubmVjdGlvbiBMb2cKKyAgICAgICAgIDIuMTMuIFsxMjhdQXV0b21hdGljIENvbm5lY3Rpb24tU3BlY2lmaWMgRmxvdyBDb250cm9sIFNlbGVjdGlvbgorICAgICAgICAgMi4xNC4gWzEyOV1UcmFwcGluZyBDb25uZWN0aW9uIEVzdGFibGlzaG1lbnQgYW5kIExvc3MKKyAgICAgICAgIDIuMTUuIFsxMzBdQ29udGFjdGluZyBXZWIgU2VydmVycyB3aXRoIHRoZSBIVFRQIENvbW1hbmQKKyAgICAgKDMpIFsxMzFdVEVSTUlOQUwgQ09OTkVDVElPTgorICAgICAgICAgMy4xLiBbMTMyXUNPTk5FQ1QgQ29tbWFuZCBTd2l0Y2hlcworICAgICAgICAgMy4yLiBbMTMzXVRyaWdnZXJzCisgICAgICAgICAzLjMuIFsxMzRdVHJhbnNwYXJlbnQgUHJpbnRpbmcKKyAgICAgICAgIDMuNC4gWzEzNV1CaW5hcnkgYW5kIFRleHQgU2Vzc2lvbiBMb2dzCisgICAgICg0KSBbMTM2XUZJTEUgVFJBTlNGRVIgQU5EIE1BTkFHRU1FTlQKKyAgICAgICAgIDQuMC4gWzEzN11CdWcgRml4ZXMsIE1pbm9yIENoYW5nZXMsIGFuZCBDbGFyaWZpY2F0aW9ucworICAgICAgICAgNC4xLiBbMTM4XUZpbGUtVHJhbnNmZXIgRmlsZW5hbWUgVGVtcGxhdGVzCisgICAgICAgICA0LjEuMS4gWzEzOV1UZW1wbGF0ZXMgaW4gdGhlIEFzLU5hbWUKKyAgICAgICAgIDQuMS4yLiBbMTQwXVRlbXBsYXRlcyBvbiB0aGUgQ29tbWFuZCBMaW5lCisgICAgICAgICA0LjEuMy4gWzE0MV1Qb3N0LVRyYW5zZmVyIFJlbmFtaW5nCisgICAgICAgICA0LjIuIFsxNDJdRmlsZS1UcmFuc2ZlciBQaXBlcyBhbmQgRmlsdGVycworICAgICAgICAgNC4yLjEuIFsxNDNdSW50cm9kdWN0aW9uCisgICAgICAgICA0LjIuMS4xLiBbMTQ0XVRlcm1pbm9sb2d5CisgICAgICAgICA0LjIuMS4yLiBbMTQ1XU5vdGF0aW9uCisgICAgICAgICA0LjIuMS4zLiBbMTQ2XVNlY3VyaXR5CisgICAgICAgICA0LjIuMi4gWzE0N11Db21tYW5kcyBmb3IgVHJhbnNmZXJyaW5nIGZyb20gYW5kIHRvIFBpcGVzCisgICAgICAgICA0LjIuMi4xLiBbMTQ4XVNlbmRpbmcgZnJvbSBhIENvbW1hbmQKKyAgICAgICAgIDQuMi4yLjIuIFsxNDldUmVjZWl2aW5nIHRvIGEgQ29tbWFuZAorICAgICAgICAgNC4yLjMuIFsxNTBdVXNpbmcgRmlsZS1UcmFuc2ZlciBGaWx0ZXJzCisgICAgICAgICA0LjIuMy4xLiBbMTUxXVRoZSBTRU5EIEZpbHRlcgorICAgICAgICAgNC4yLjMuMi4gWzE1Ml1UaGUgUkVDRUlWRSBGaWx0ZXIKKyAgICAgICAgIDQuMi40LiBbMTUzXUltcGxpY2l0IFVzZSBvZiBQaXBlcworICAgICAgICAgNC4yLjUuIFsxNTRdU3VjY2VzcyBhbmQgRmFpbHVyZSBvZiBQaXBlZCBDb21tYW5kcworICAgICAgICAgNC4yLjYuIFsxNTVdQ2F1dGlvbnMgYWJvdXQgVXNpbmcgUGlwZXMgdG8gVHJhbnNmZXIgRGlyZWN0b3J5IFRyZWVzCisgICAgICAgICA0LjIuNy4gWzE1Nl1QaXBlcyBhbmQgRW5jcnlwdGlvbgorICAgICAgICAgNC4yLjguIFsxNTddQ29tbWFuZHMgYW5kIEZ1bmN0aW9ucyBSZWxhdGVkIHRvIFBpcGVzCisgICAgICAgICA0LjIuOC4xLiBbMTU4XVRoZSBPUEVOICFSRUFEIGFuZCBPUEVOICFXUklURSBDb21tYW5kcworICAgICAgICAgNC4yLjguMi4gWzE1OV1UaGUgUkVESVJFQ1QgQ29tbWFuZAorICAgICAgICAgNC4yLjguMy4gWzE2MF1SZWNlaXZpbmcgTWFpbCBhbmQgUHJpbnQgSm9icworICAgICAgICAgNC4yLjguNC4gWzE2MV1QaXBlLVJlbGF0ZWQgRnVuY3Rpb25zCisgICAgICAgICA0LjMuIFsxNjJdQXV0b21hdGljIFBlci1GaWxlIFRleHQvQmluYXJ5IE1vZGUgU3dpdGNoaW5nCisgICAgICAgICA0LjMuMS4gWzE2M11FeGNlcHRpb25zCisgICAgICAgICA0LjMuMi4gWzE2NF1PdmVydmlldworICAgICAgICAgNC4zLjMuIFsxNjVdQ29tbWFuZHMKKyAgICAgICAgIDQuMy40LiBbMTY2XUV4YW1wbGVzCisgICAgICAgICA0LjQuIFsxNjddRmlsZSBQZXJtaXNzaW9ucworICAgICAgICAgNC40LjEuIFsxNjhdV2hlbiBBVFRSSUJVVEVTIFBST1RFQ1RJT04gaXMgT0ZGCisgICAgICAgICA0LjQuMS4xLiBbMTY5XVVuaXgKKyAgICAgICAgIDQuNC4xLjIuIFsxNzBdVk1TCisgICAgICAgICA0LjQuMi4gWzE3MV1XaGVuIEFUVFJJQlVURVMgUFJPVEVDVElPTiBpcyBPTgorICAgICAgICAgNC40LjIuMS4gWzE3Ml1TeXN0ZW0tU3BlY2lmaWMgUGVybWlzc2lvbnMKKyAgICAgICAgIDQuNC4yLjEuMS4gWzE3M11VTklYCisgICAgICAgICA0LjQuMi4xLjIuIFsxNzRdVk1TCisgICAgICAgICA0LjQuMi4yLiBbMTc1XVN5c3RlbS1JbmRlcGVuZGVudCBQZXJtaXNzaW9ucworICAgICAgICAgNC41LiBbMTc2XUZpbGUgTWFuYWdlbWVudCBDb21tYW5kcworICAgICAgICAgNC41LjEuIFsxNzddVGhlIERJUkVDVE9SWSBDb21tYW5kCisgICAgICAgICA0LjUuMi4gWzE3OF1UaGUgQ0QgYW5kIEJBQ0sgQ29tbWFuZHMKKyAgICAgICAgIDQuNS4yLjEuIFsxNzldUGFyc2luZyBJbXByb3ZlbWVudHMKKyAgICAgICAgIDQuNS4yLjIuIFsxODBdVGhlIENEUEFUSAorICAgICAgICAgNC41LjMuIFsxODFdQ3JlYXRpbmcgYW5kIFJlbW92aW5nIERpcmVjdG9yaWVzCisgICAgICAgICA0LjUuNC4gWzE4Ml1UaGUgREVMRVRFIGFuZCBQVVJHRSBDb21tYW5kcworICAgICAgICAgNC42LiBbMTgzXVN0YXJ0aW5nIHRoZSBSZW1vdGUgS2VybWl0IFNlcnZlciBBdXRvbWF0aWNhbGx5CisgICAgICAgICA0LjcuIFsxODRdRmlsZS1UcmFuc2ZlciBDb21tYW5kIFN3aXRjaGVzCisgICAgICAgICA0LjcuMS4gWzE4NV1TRU5EIENvbW1hbmQgU3dpdGNoZXMKKyAgICAgICAgIDQuNy4yLiBbMTg2XUdFVCBDb21tYW5kIFN3aXRjaGVzCisgICAgICAgICA0LjcuMy4gWzE4N11SRUNFSVZFIENvbW1hbmQgU3dpdGNoZXMKKyAgICAgICAgIDQuOC4gWzE4OF1NaW5vciBLZXJtaXQgUHJvdG9jb2wgSW1wcm92ZW1lbnRzCisgICAgICAgICA0LjguMS4gWzE4OV1NdWx0aXBsZSBBdHRyaWJ1dGUgUGFja2V0cworICAgICAgICAgNC44LjIuIFsxOTBdVmVyeSBTaG9ydCBQYWNrZXRzCisgICAgICAgICA0LjkuIFsxOTFdV2lsZGNhcmQgLyBGaWxlIEdyb3VwIEV4cGFuc2lvbgorICAgICAgICAgNC45LjEuIFsxOTJdSW4gVU5JWCBDLUtlcm1pdAorICAgICAgICAgNC45LjIuIFsxOTNdSW4gS2VybWl0IDk1CisgICAgICAgICA0LjkuMy4gWzE5NF1JbiBWTVMsIEFPUy9WUywgT1MtOSwgVk9TLCBldGMuCisgICAgICAgICA0LjEwLiBbMTk1XUFkZGl0aW9uYWwgUGF0aG5hbWUgQ29udHJvbHMKKyAgICAgICAgIDQuMTEuIFsxOTZdUmVjdXJzaXZlIFNFTkQgYW5kIEdFVDogVHJhbnNmZXJyaW5nIERpcmVjdG9yeSBUcmVlcworICAgICAgICAgNC4xMS4xLiBbMTk3XUNvbW1hbmQtTGluZSBPcHRpb25zCisgICAgICAgICA0LjExLjIuIFsxOThdVGhlIFNFTkQgL1JFQ1VSU0lWRSBDb21tYW5kCisgICAgICAgICA0LjExLjMuIFsxOTldVGhlIEdFVCAvUkVDVVJTSVZFIENvbW1hbmQKKyAgICAgICAgIDQuMTEuNC4gWzIwMF1OZXcgYW5kIENoYW5nZWQgRmlsZSBGdW5jdGlvbnMKKyAgICAgICAgIDQuMTEuNS4gWzIwMV1Nb3ZpbmcgRGlyZWN0b3J5IFRyZWVzIEJldHdlZW4gTGlrZSBTeXN0ZW1zCisgICAgICAgICA0LjExLjYuIFsyMDJdTW92aW5nIERpcmVjdG9yeSBUcmVlcyBCZXR3ZWVuIFVubGlrZSBTeXN0ZW1zCisgICAgICAgICA0LjEyLiBbMjAzXVdoZXJlIERpZCBNeSBGaWxlIEdvPworICAgICAgICAgNC4xMy4gWzIwNF1GaWxlIE91dHB1dCBCdWZmZXIgQ29udHJvbAorICAgICAgICAgNC4xNC4gWzIwNV1JbXByb3ZlZCBSZXNwb25zaXZlbmVzcworICAgICAgICAgNC4xNS4gWzIwNl1Eb3VibGluZyBhbmQgSWdub3JpbmcgQ2hhcmFjdGVycyBmb3IgVHJhbnNwYXJlbmN5CisgICAgICAgICA0LjE2LiBbMjA3XU5ldyBGaWxlLVRyYW5zZmVyIERpc3BsYXkgRm9ybWF0cworICAgICAgICAgNC4xNy4gWzIwOF1OZXcgVHJhbnNhY3Rpb24gTG9nIEZvcm1hdHMKKyAgICAgICAgIDQuMTcuMS4gWzIwOV1UaGUgQlJJRUYgRm9ybWF0CisgICAgICAgICA0LjE3LjIuIFsyMTBdVGhlIEZUUCBGb3JtYXQKKyAgICAgICAgIDQuMTguIFsyMTFdVW5wcmVmaXhpbmcgTlVMCisgICAgICAgICA0LjE5LiBbMjEyXUNsZWFyLUNoYW5uZWwgUHJvdG9jb2wKKyAgICAgICAgIDQuMjAuIFsyMTNdU3RyZWFtaW5nIFByb3RvY29sCisgICAgICAgICA0LjIwLjEuIFsyMTRdQ29tbWFuZHMgZm9yIFN0cmVhbWluZworICAgICAgICAgNC4yMC4yLiBbMjE1XUV4YW1wbGVzIG9mIFN0cmVhbWluZworICAgICAgICAgNC4yMC4yLjEuIFsyMTZdU3RyZWFtaW5nIG9uIFNvY2tldC10by1Tb2NrZXQgQ29ubmVjdGlvbnMKKyAgICAgICAgIDQuMjAuMi4yLiBbMjE3XVN0cmVhbWluZyBvbiBUZWxuZXQgQ29ubmVjdGlvbnMKKyAgICAgICAgIDQuMjAuMi4zLiBbMjE4XVN0cmVhbWluZyB3aXRoIExpbWl0ZWQgUGFja2V0IExlbmd0aAorICAgICAgICAgNC4yMC4yLjQuIFsyMTldU3RyZWFtaW5nIG9uIERpYWx1cCBDb25uZWN0aW9ucworICAgICAgICAgNC4yMC4yLjUuIFsyMjBdU3RyZWFtaW5nIG9uIFguMjUgQ29ubmVjdGlvbnMKKyAgICAgICAgIDQuMjAuMy4gWzIyMV1TdHJlYW1pbmcgLSBQcmVsaW1pbmFyeSBDb25jbHVzaW9ucworICAgICAgICAgNC4yMS4gWzIyMl1UaGUgVFJBTlNNSVQgQ29tbWFuZAorICAgICAgICAgNC4yMi4gWzIyM11Db3Bpbmcgd2l0aCBGYXVsdHkgS2VybWl0IEltcGxlbWVudGF0aW9ucworICAgICAgICAgNC4yMi4xLiBbMjI0XUZhaWx1cmUgdG8gQWNjZXB0IE1vZGVybiBOZWdvdGlhdGlvbiBTdHJpbmdzCisgICAgICAgICA0LjIyLjIuIFsyMjVdRmFpbHVyZSB0byBOZWdvdGlhdGUgOHRoLWJpdCBQcmVmaXhpbmcKKyAgICAgICAgIDQuMjIuMy4gWzIyNl1Db3JydXB0IEZpbGVzCisgICAgICAgICA0LjIyLjQuIFsyMjddU3B1cmlvdXMgQ2FuY2VsbGF0aW9ucworICAgICAgICAgNC4yMi41LiBbMjI4XVNwdXJpb3VzIFJlZnVzYWxzCisgICAgICAgICA0LjIyLjYuIFsyMjldRmFpbHVyZXMgZHVyaW5nIHRoZSBEYXRhIFRyYW5zZmVyIFBoYXNlCisgICAgICAgICA0LjIyLjcuIFsyMzBdRnJhY3R1cmVkIEZpbGVuYW1lcworICAgICAgICAgNC4yMi44LiBbMjMxXUJhZCBGaWxlIERhdGVzCisgICAgICAgICA0LjIzLiBbMjMyXUZpbGUgVHJhbnNmZXIgUmVjb3ZlcnkKKyAgICAgICAgIDQuMjQuIFsyMzNdRklMRSBDT0xMSVNJT04gVVBEQVRFIENsYXJpZmljYXRpb24KKyAgICAgICAgIDQuMjUuIFsyMzRdQXV0b2Rvd25sb2FkIEltcHJvdmVtZW50cworICAgICAoNSkgWzIzNV1DTElFTlQvU0VSVkVSCisgICAgICAgICA1LjAuIFsyMzZdSGludHMKKyAgICAgICAgIDUuMS4gWzIzN11OZXcgQ29tbWFuZC1MaW5lIE9wdGlvbnMKKyAgICAgICAgIDUuMi4gWzIzOF1OZXcgQ2xpZW50IENvbW1hbmRzCisgICAgICAgICA1LjMuIFsyMzldTmV3IFNlcnZlciBDYXBhYmlsaXRpZXMKKyAgICAgICAgIDUuMy4xLiBbMjQwXUNyZWF0aW5nIGFuZCBSZW1vdmluZyBEaXJlY3RvcmllcworICAgICAgICAgNS4zLjIuIFsyNDFdRGlyZWN0b3J5IExpc3RpbmdzCisgICAgICAgICA1LjQuIFsyNDJdU3ludGF4IGZvciBSZW1vdGUgRmlsZW5hbWVzIHdpdGggRW1iZWRkZWQgU3BhY2VzCisgICAgICAgICA1LjUuIFsyNDNdQXV0b21hdGljIE9yaWVudGF0aW9uIE1lc3NhZ2VzIHVwb24gRGlyZWN0b3J5IENoYW5nZQorICAgICAgICAgNS42LiBbMjQ0XU5ldyBTZXJ2ZXIgQ29udHJvbHMKKyAgICAgICAgIDUuNy4gWzI0NV1UaW1lb3V0cyBkdXJpbmcgUkVNT1RFIEhPU1QgQ29tbWFuZCBFeGVjdXRpb24KKyAgICAgKDYpIFsyNDZdSU5URVJOQVRJT05BTCBDSEFSQUNURVIgU0VUUworICAgICAgICAgNi4wLiBbMjQ3XUlTTyA4ODU5LTE1IExhdGluIEFscGhhYmV0IDkKKyAgICAgICAgIDYuMS4gWzI0OF1UaGUgSFAtUm9tYW44IENoYXJhY3RlciBTZXQKKyAgICAgICAgIDYuMi4gWzI0OV1HcmVlayBDaGFyYWN0ZXIgU2V0cworICAgICAgICAgNi4zLiBbMjUwXUFkZGl0aW9uYWwgTGF0aW4tMiBDaGFyYWN0ZXIgU2V0cworICAgICAgICAgNi40LiBbMjUxXUFkZGl0aW9uYWwgQ3lyaWxsaWMgQ2hhcmFjdGVyIFNldHMKKyAgICAgICAgIDYuNS4gWzI1Ml1BdXRvbWF0aWMgQ2hhcmFjdGVyLVNldCBTd2l0Y2hpbmcKKyAgICAgICAgIDYuNi4gWzI1M11Vbmljb2RlCisgICAgICAgICA2LjYuMS4gWzI1NF1PdmVydmlldyBvZiBVbmljb2RlCisgICAgICAgICA2LjYuMi4gWzI1NV1VQ1MgQnl0ZSBPcmRlcgorICAgICAgICAgNi42LjIuIFsyNTZdVUNTIFRyYW5zZm9ybWF0aW9uIEZvcm1hdHMKKyAgICAgICAgIDYuNi4zLiBbMjU3XUNvbmZvcm1hbmNlIExldmVscworICAgICAgICAgNi42LjQuIFsyNThdUmVsYXRpb25zaGlwIG9mIFVuaWNvZGUgd2l0aCBLZXJtaXQncyBPdGhlciBDaGFyYWN0ZXIgU2V0cworICAgICAgICAgNi42LjUuIFsyNTldS2VybWl0J3MgVW5pY29kZSBGZWF0dXJlcworICAgICAgICAgNi42LjUuMS4gWzI2MF1GaWxlIFRyYW5zZmVyCisgICAgICAgICA2LjYuNS4yLiBbMjYxXVRoZSBUUkFOU0xBVEUgQ29tbWFuZAorICAgICAgICAgNi42LjUuMy4gWzI2Ml1UZXJtaW5hbCBDb25uZWN0aW9uCisgICAgICAgICA2LjYuNS40LiBbMjYzXVRoZSBUUkFOU01JVCBDb21tYW5kCisgICAgICAgICA2LjYuNS41LiBbMjY0XVN1bW1hcnkgb2YgS2VybWl0IFVuaWNvZGUgQ29tbWFuZHMKKyAgICAgICAgIDYuNy4gWzI2NV1DbGllbnQvU2VydmVyIENoYXJhY3Rlci1TZXQgU3dpdGNoaW5nCisgICAgICg3KSBbMjY2XVNDUklQVCBQUk9HUkFNTUlORworICAgICAgICAgNy4wLiBbMjY3XUJ1ZyBGaXhlcworICAgICAgICAgNy4xLiBbMjY4XVRoZSBJTlBVVCBDb21tYW5kCisgICAgICAgICA3LjEuMS4gWzI2OV1JTlBVVCBUaW1lb3V0cworICAgICAgICAgNy4xLjIuIFsyNzBdTmV3IElOUFVUIENvbnRyb2xzCisgICAgICAgICA3LjEuMy4gWzI3MV1JTlBVVCB3aXRoIFBhdHRlcm4gTWF0Y2hpbmcKKyAgICAgICAgIDcuMS40LiBbMjcyXVRoZSBJTlBVVCBNYXRjaCBSZXN1bHQKKyAgICAgICAgIDcuMi4gWzI3M11OZXcgb3IgSW1wcm92ZWQgQnVpbHQtSW4gVmFyaWFibGVzCisgICAgICAgICA3LjMuIFsyNzRdTmV3IG9yIEltcHJvdmVkIEJ1aWx0LUluIEZ1bmN0aW9ucworICAgICAgICAgNy40LiBbMjc1XU5ldyBJRiBDb25kaXRpb25zCisgICAgICAgICA3LjUuIFsyNzZdVXNpbmcgTW9yZSB0aGFuIFRlbiBNYWNybyBBcmd1bWVudHMKKyAgICAgICAgIDcuNi4gWzI3N11DbGFyaWZpY2F0aW9uIG9mIEZ1bmN0aW9uIENhbGwgU3ludGF4CisgICAgICAgICA3LjcuIFsyNzhdQXV0b2Rvd25sb2FkIGR1cmluZyBJTlBVVCBDb21tYW5kIEV4ZWN1dGlvbgorICAgICAgICAgNy44LiBbMjc5XUJ1aWx0LWluIEhlbHAgZm9yIEZ1bmN0aW9ucy4KKyAgICAgICAgIDcuOS4gWzI4MF1WYXJpYWJsZSBBc3NpZ25tZW50cworICAgICAgICAgNy45LjEuIFsyODFdQXNzaWdubWVudCBPcGVyYXRvcnMKKyAgICAgICAgIDcuOS4yLiBbMjgyXU5ldyBBc3NpZ25tZW50IENvbW1hbmRzCisgICAgICAgICA3LjEwLiBbMjgzXUFycmF5cworICAgICAgICAgNy4xMC4xLiBbMjg0XUFycmF5IEluaXRpYWxpemVycworICAgICAgICAgNy4xMC4yLiBbMjg1XVR1cm5pbmcgYSBTdHJpbmcgaW50byBhbiBBcnJheSBvZiBXb3JkcworICAgICAgICAgNy4xMC4zLiBbMjg2XUFycmF5cyBvZiBGaWxlbmFtZXMKKyAgICAgICAgIDcuMTAuNC4gWzI4N11BdXRvbWF0aWMgQXJyYXlzCisgICAgICAgICA3LjEwLjUuIFsyODhdU29ydGluZyBBcnJheXMKKyAgICAgICAgIDcuMTAuNi4gWzI4OV1EaXNwbGF5aW5nIEFycmF5cworICAgICAgICAgNy4xMC43LiBbMjkwXU90aGVyIEFycmF5IE9wZXJhdGlvbnMKKyAgICAgICAgIDcuMTAuOC4gWzI5MV1IaW50cyBmb3IgVXNpbmcgQXJyYXlzCisgICAgICAgICA3LjEwLjkuIFsyOTJdRG8tSXQtWW91cnNlbGYgQXJyYXlzCisgICAgICAgICA3LjEwLjEwLiBbMjkzXUFzc29jaWF0aXZlIEFycmF5cworICAgICAgICAgNy4xMS4gWzI5NF1PVVRQVVQgQ29tbWFuZCBJbXByb3ZlbWVudHMKKyAgICAgICAgIDcuMTIuIFsyOTVdRnVuY3Rpb24gYW5kIFZhcmlhYmxlIERpYWdub3N0aWNzCisgICAgICAgICA3LjEzLiBbMjk2XVJldHVybiBWYWx1ZSBvZiBNYWNyb3MKKyAgICAgICAgIDcuMTQuIFsyOTddVGhlIEFTU0VSVCwgRkFJTCwgYW5kIFNVQ0NFRUQgQ29tbWFuZHMuCisgICAgICAgICA3LjE1LiBbMjk4XVVzaW5nIEFsYXJtcworICAgICAgICAgNy4xNi4gWzI5OV1QYXNzaW5nIEFyZ3VtZW50cyB0byBDb21tYW5kIEZpbGVzCisgICAgICAgICA3LjE3LiBbMzAwXURpYWxvZ3Mgd2l0aCBUaW1lZCBSZXNwb25zZXMKKyAgICAgICAgIDcuMTguIFszMDFdSW5jcmVhc2VkIEZsZXhpYmlsaXR5IG9mIFNXSVRDSCBDYXNlIExhYmVscworICAgICAgICAgNy4xOS4gIlszMDJdS2VyYmFuZyIgU2NyaXB0cworICAgICAgICAgNy4yMC4gWzMwM11JRiBhbmQgWElGIFN0YXRlbWVudCBTeW50YXgKKyAgICAgICAgIDcuMjAuMS4gWzMwNF1UaGUgSUYvWElGIERpc3RpbmN0aW9uCisgICAgICAgICA3LjIwLjIuIFszMDVdQm9vbGVhbiBFeHByZXNzaW9ucyAoVGhlIElGL1dISUxFIENvbmRpdGlvbikKKyAgICAgICAgIDcuMjEuIFszMDZdU2NyZWVuIEZvcm1hdHRpbmcgYW5kIEN1cnNvciBDb250cm9sCisgICAgICAgICA3LjIyLiBbMzA3XUV2YWx1YXRpbmcgQXJpdGhtZXRpYyBFeHByZXNzaW9ucworICAgICAgICAgNy4yMy4gWzMwOF1GbG9hdGluZy1Qb2ludCBBcml0aG1ldGljCisgICAgICAgICA3LjI0LiBbMzA5XVRyYWNpbmcgU2NyaXB0IEV4ZWN1dGlvbgorICAgICAgICAgNy4yNS4gWzMxMF1Db21wYWN0IFN1YnN0cmluZyBOb3RhdGlvbgorICAgICAgICAgNy4yNi4gWzMxMV1OZXcgV0FJVCBDb21tYW5kIE9wdGlvbnMKKyAgICAgICAgIDcuMjYuMS4gWzMxMl1XYWl0aW5nIGZvciBNb2RlbSBTaWduYWxzCisgICAgICAgICA3LjI2LjIuIFszMTNdV2FpdGluZyBmb3IgRmlsZSBFdmVudHMKKyAgICAgICAgIDcuMjcuIFszMTRdUmVsYXhlZCBGT1IgYW5kIFNXSVRDSCBTeW50YXgKKyAgICAgKDgpIFszMTVdVVNJTkcgT1RIRVIgRklMRSBUUkFOU0ZFUiBQUk9UT0NPTFMKKyAgICAgKDkpIFszMTZdQ09NTUFORC1MSU5FIE9QVElPTlMKKyAgICAgICAgIDkuMC4gWzMxN11FeHRlbmRlZC1Gb3JtYXQgQ29tbWFuZC1MaW5lIE9wdGlvbnMKKyAgICAgICAgIDkuMS4gWzMxOF1Db21tYW5kIExpbmUgUGVyc29uYWxpdGllcworICAgICAgICAgOS4yLiBbMzE5XUJ1aWx0LWluIEhlbHAgZm9yIENvbW1hbmQgTGluZSBPcHRpb25zCisgICAgICAgICA5LjMuIFszMjBdTmV3IENvbW1hbmQtTGluZSBPcHRpb25zCisgICAgKDEwKSBbMzIxXUMtS0VSTUlUIEFORCBHLUtFUk1JVAorCitJSUkuIFszMjJdQVBQRU5ESUNFUworCitJSUkuMS4gWzMyM11DaGFyYWN0ZXIgU2V0IFRhYmxlcworSUlJLjEuMS4gWzMyNF1UaGUgSGV3bGV0dCBQYWNrYXJkIFJvbWFuOCBDaGFyYWN0ZXIgU2V0CitJSUkuMS4yLiBbMzI1XUdyZWVrIENoYXJhY3RlciBTZXRzCitJSUkuMS4yLjEuIFszMjZdVGhlIElTTyA4ODU5LTcgTGF0aW4gLyBHcmVlayBBbHBoYWJldAorSUlJLjEuMi4yLiBbMzI3XVRoZSBFTE9UIDkyNyBDaGFyYWN0ZXIgU2V0CitJSUkuMS4yLjMuIFszMjhdUEMgQ29kZSBQYWdlIDg2OQorSUlJLjIuIFszMjldVXBkYXRlZCBDb3VudHJ5IENvZGVzCisKK0lWLiBbMzMwXUVSUkFUQSAmIENPUlJJR0VOREE6IENvcnJlY3Rpb25zIHRvICJVc2luZyBDLUtlcm1pdCIgMm5kIEVkaXRpb24uCitWLiBbMzMxXUFERElUSU9OQUwgQ09QWVJJR0hUIE5PVElDRVMKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworSS4gQy1LRVJNSVQgRE9DVU1FTlRBVElPTgorCisgICBUaGUgdXNlciBtYW51YWwgZm9yIEMtS2VybWl0IGlzOgorCisgICAgIEZyYW5rIGRhIENydXogYW5kIENocmlzdGluZSBNLiBHaWFub25lLCBbMzMyXVVzaW5nIEMtS2VybWl0LCBTZWNvbmQKKyAgICAgRWRpdGlvbiwgRGlnaXRhbCBQcmVzcyAvIEJ1dHRlcndvcnRoLUhlaW5lbWFubiwgV29idXJuLCBNQSwgMTk5NywKKyAgICAgNjIyIHBhZ2VzLCBJU0JOIDEtNTU1NTgtMTY0LTEuCisKKyAgIFszMzNdQ0xJQ0sgSEVSRSBmb3IgcmV2aWV3cy4KKworICAgVGhlIHByZXNlbnQgZG9jdW1lbnQgaXMgYSBzdXBwbGVtZW50IHRvIFVzaW5nIEMtS2VybWl0IDJuZCBFZCwgbm90IGEKKyAgIHJlcGxhY2VtZW50IGZvciBpdC4KKworICAgVVMgc2luZ2xlLWNvcHkgcHJpY2U6ICQ1Mi45NTsgcXVhbnRpdHkgZGlzY291bnRzIGF2YWlsYWJsZS4gQXZhaWxhYmxlCisgICBpbiBib29rc3RvcmVzIG9yIGRpcmVjdGx5IGZyb20gQ29sdW1iaWEgVW5pdmVyc2l0eToKKworICBUaGUgS2VybWl0IFByb2plY3QKKyAgQ29sdW1iaWEgVW5pdmVyc2l0eQorICA2MTIgV2VzdCAxMTV0aCBTdHJlZXQKKyAgTmV3IFlvcmsgTlkgIDEwMDI1LTc3OTkKKyAgVVNBCisgIFRlbGVwaG9uZTogKzEgKDIxMikgODU0LTM3MDMKKyAgRmF4OiAgICAgICArMSAoMjEyKSA2NjItNjQ0MgorCisgICBEb21lc3RpYyBhbmQgb3ZlcnNlYXMgb3JkZXJzIGFjY2VwdGVkLiBQcmljZTogVVMgJDQ0Ljk1IChVUywgQ2FuYWRhLAorICAgYW5kIE1leGljbykuIFNoaXBwaW5nOiAkNC4wMCB3aXRoaW4gdGhlIFVTQTsgJDE1LjAwIHRvIGFsbCBvdGhlcgorICAgY291bnRyaWVzLiBPcmRlcnMgbWF5IGJlIHBhaWQgYnkgTWFzdGVyQ2FyZCBvciBWaXNhLCBvciBwcmVwYWlkIGJ5CisgICBjaGVjayBpbiBVUyBkb2xsYXJzLiBBZGQgJDY1IGJhbmsgZmVlIGZvciBjaGVja3Mgbm90IGRyYXduIG9uIGEgVVMKKyAgIGJhbmsuIERvIG5vdCBpbmNsdWRlIHNhbGVzIHRheC4gSW5xdWlyZSBhYm91dCBxdWFudGl0eSBkaXNjb3VudHMuCisKKyAgIFlvdSBjYW4gYWxzbyBvcmRlciBieSBwaG9uZSBmcm9tIHRoZSBwdWJsaXNoZXIsIERpZ2l0YWwgUHJlc3MgLworICAgWzMzNF1CdXR0ZXJ3b3J0aC1IZWluZW1hbm4sIHdpdGggTWFzdGVyQ2FyZCwgVmlzYSwgb3IgQW1lcmljYW4KKyAgIEV4cHJlc3M6CisKKyAgKzEgODAwIDM2Ni0yNjY1ICAgKFdvYnVybiwgTWFzc2FjaHVzZXR0cyBvZmZpY2UgZm9yIFVTQSAmIENhbmFkYSkKKyAgKzQ0IDE4NjUgMzE0NjI3ICAgKE94Zm9yZCwgRW5nbGFuZCBkaXN0cmlidXRpb24gY2VudHJlIGZvciBVSyAmIEV1cm9wZSkKKyAgKzYxIDAzIDkyNDUgNzExMSAgKE1lbGJvdXJuZSwgVmljLCBvZmZpY2UgZm9yIEF1c3RyYWxpYSAmIE5aKQorICArNjUgMzU2LTE5NjggICAgICAoU2luZ2Fwb3JlIG9mZmljZSBmb3IgQXNpYSkKKyAgKzI3ICgzMSkgMjY4MzExMSAgKER1cmJhbiBvZmZpY2UgZm9yIFNvdXRoIEFmcmljYSkKKworICAgQSBbMzM1XUdlcm1hbi1sYW5ndWFnZSBlZGl0aW9uIG9mIHRoZSBGaXJzdCBFZGl0aW9uIGlzIGFsc28gYXZhaWxhYmxlOgorCisgICAgIEZyYW5rIGRhIENydXogYW5kIENocmlzdGluZSBNLiBHaWFub25lLCBDLUtlcm1pdCAtIEVpbmb8aHJ1bmcgdW5kCisgICAgIFJlZmVyZW56LCBWZXJsYWcgSGVpbnogSGVpc2UsIEhhbm5vdmVyLCBHZXJtYW55ICgxOTk0KS4gSVNCTgorICAgICAzLTg4MjI5LTAyMy00LiBEZXV0c2NoIHZvbiBHaXNiZXJ0IFcuIFNlbGtlLiBQcmljZTogRE0gODgsMDAuCisgICAgIFZlcmxhZyBIZWlueiBIZWlzZSBHbWJIICYgQ28uIEtHLCBIZWxzdG9yZmVyIFN0cmFzc2UgNywgRC0zMDYyNQorICAgICBIYW5ub3Zlci4gVGVsLiArNDkgKDA1IDExKSA1MyA1Mi0wLCBGYXguICs0OSAoMDUgMTEpIDUzIDUyLTEgMjkuCisKKyAgIFRoZSBbMzM2XUtlcm1pdCBmaWxlIHRyYW5zZmVyIHByb3RvY29sIGlzIHNwZWNpZmllZCBpbjoKKworICAgICBGcmFuayBkYSBDcnV6LCBLZXJtaXQsIEEgRmlsZSBUcmFuc2ZlciBQcm90b2NvbCwgRGlnaXRhbCBQcmVzcywKKyAgICAgQmVkZm9yZCwgTUEsIDE5ODcsIDM3OSBwYWdlcywgSVNCTiAwLTkzMjM3Ni04OC02LiBVUyBzaW5nbGUtY29weQorICAgICBwcmljZTogJDM5Ljk1LiBBdmFpbGFiaWxpdHkgYXMgYWJvdmUuCisKKyAgIE5ld3MgYW5kIGFydGljbGVzIGFib3V0IEtlcm1pdCBzb2Z0d2FyZSBhbmQgcHJvdG9jb2wgYXJlIHB1Ymxpc2hlZAorICAgcGVyaW9kaWNhbGx5IGluIHRoZSBqb3VybmFsLCBbMzM3XUtlcm1pdCBOZXdzLiBTdWJzY3JpcHRpb25zIGFyZSBmcmVlOworICAgY29udGFjdCBDb2x1bWJpYSBVbml2ZXJzaXR5IGF0IHRoZSBhZGRyZXNzIGFib3ZlLgorCisgICBPbmxpbmUgbmV3cyBhYm91dCBLZXJtaXQgaXMgcHVibGlzaGVkIGluIHRoZQorICAgWzMzOF1jb21wLnByb3RvY29scy5rZXJtaXQuYW5ub3VuY2UgYW5kCisgICBbMzM5XWNvbXAucHJvdG9jb2xzLmtlcm1pdC5taXNjIG5ld3Nncm91cHMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKK0lJLiBORVcgRkVBVFVSRVMKKworICAgU3VwcG9ydCBmb3IgdGhlIEJlbGwgTGFicyBQbGFuIDkgb3BlcmF0aW5nIHN5c3RlbSB3YXMgYWRkZWQgdG8gdmVyc2lvbgorICAgNi4wIHRvbyBsYXRlIHRvIGJlIG1lbnRpb25lZCBpbiB0aGUgYm9vayAoYWx0aG91Z2ggaXQgZG9lcyBhcHBlYXIgb24KKyAgIHRoZSBjb3ZlcikuCisKKyAgIFNwZWNpZmljIGNoYW5nZXMgYW5kIGFkZGl0aW9ucyBhcmUgZ3JvdXBlZCB0b2dldGhlciBieSBtYWpvciB0b3BpYywKKyAgIHJvdWdobHkgY29ycmVzcG9uZGluZyB0byB0aGUgY2hhcHRlcnMgb2YgWzM0MF1Vc2luZyBDLUtlcm1pdC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAwLiBJTkNPTVBBVElCSUxJVElFUyBXSVRIIFBSRVZJT1VTIFJFTEVBU0VTCisKKyAgICAxLiBDLUtlcm1pdCA3LjAgdXNlcyBGQVNUIEtlcm1pdCBwcm90b2NvbCBzZXR0aW5ncyBieSBkZWZhdWx0LiBUaGlzCisgICAgICAgaW5jbHVkZXMgInVucHJlZml4aW5nIiBvZiBjZXJ0YWluIGNvbnRyb2wgY2hhcmFjdGVycy4gQmVjYXVzZSBvZgorICAgICAgIHRoaXMsIGZpbGUgdHJhbnNmZXJzIHRoYXQgd29ya2VkIHdpdGggcHJldmlvdXMgcmVsZWFzZXMgbWlnaHQgbm90CisgICAgICAgd29yayBpbiB0aGUgbmV3IHJlbGVhc2UgKGJ1dCBpdCBpcyBtb3JlIGxpa2VseSB0aGF0IHRoZXkgd2lsbAorICAgICAgIHdvcmssIGFuZCBtdWNoIGZhc3RlcikuIElmIGEgdHJhbnNmZXIgZmFpbHMsIHlvdSdsbCBnZXQgYQorICAgICAgIGNvbnRleHQtc2Vuc2l0aXZlIGhpbnQgc3VnZ2VzdGluZyBwb3NzaWJsZSBjYXVzZXMgYW5kIGN1cmVzLgorICAgICAgIFVzdWFsbHkgU0VUIFBSRUZJWElORyBBTEwgZG9lcyB0aGUgdHJpY2suCisgICAgMi4gQy1LZXJtaXQgNy4wIHRyYW5zZmVycyBmaWxlcyBpbiBCSU5BUlkgbW9kZSBieSBkZWZhdWx0LiBUbyByZXN0b3JlCisgICAgICAgdGhlIHByZXZpb3VzIGJlaGF2aW9yLCBwdXQgU0VUIEZJTEUgVFlQRSBURVhUIGluIHlvdXIgQy1LZXJtaXQKKyAgICAgICBpbml0aWFsaXphdGlvbiBmaWxlLgorICAgIDMuIE5vIG1hdHRlciB3aGV0aGVyIEZJTEUgVFlQRSBpcyBCSU5BUlkgb3IgVEVYVCBieSBkZWZhdWx0LCBDLUtlcm1pdAorICAgICAgIDcuMCBub3cgc3dpdGNoZXMgYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkgbW9kZSBhdXRvbWF0aWNhbGx5IG9uIGEKKyAgICAgICBwZXItZmlsZSBiYXNpcyBhY2NvcmRpbmcgdG8gdmFyaW91cyBjcml0ZXJpYSwgaW5jbHVkaW5nIChhKSB3aGljaAorICAgICAgIGtpbmQgb2YgcGxhdGZvcm0gaXMgb24gdGhlIG90aGVyIGVuZCBvZiB0aGUgY29ubmVjdGlvbiAoaWYga25vd24pLAorICAgICAgIChiKSB0aGUgdmVyc2lvbiBvZiBLZXJtaXQgb24gdGhlIG90aGVyIGVuZCwgYW5kIChjKSB0aGUgZmlsZSdzCisgICAgICAgbmFtZSAoc2VlIFszNDFdU2VjdGlvbiA0LCBlc3BlY2lhbGx5IFszNDJdNC4zKS4gVG8gZGlzYWJsZSB0aGlzCisgICAgICAgYXV0b21hdGljIHN3aXRjaGluZyBhbmQgcmVzdG9yZSB0aGUgZWFybGllciBiZWhhdmlvciwgcHV0IFNFVAorICAgICAgIFRSQU5TRkVSIE1PREUgTUFOVUFMIGluIHlvdXIgQy1LZXJtaXQgaW5pdGlhbGl6YXRpb24gZmlsZS4gVG8KKyAgICAgICBkaXNhYmxlIGF1dG9tYXRpYyBzd2l0Y2hpbmcgZm9yIGEgcGFydGljdWxhciB0cmFuc2ZlciwgaW5jbHVkZSBhCisgICAgICAgL1RFWFQgb3IgL0JJTkFSWSBzd2l0Y2ggd2l0aCB5b3VyIFNFTkQgb3IgR0VUIGNvbW1hbmQuCisgICAgNC4gVGhlIFJFU0VORCBhbmQgUkVHRVQgY29tbWFuZHMgYXV0b21hdGljYWxseSBzd2l0Y2ggdG8gYmluYXJ5IG1vZGU7CisgICAgICAgcHJldmlvdXNseSBpZiBSRVNFTkQgb3IgUkVHRVQgd2VyZSBhdHRlbXB0ZWQgd2hlbiBGSUxFIFRZUEUgd2FzCisgICAgICAgVEVYVCwgdGhlc2UgY29tbWFuZHMgd291bGQgZmFpbCBpbW1lZGlhdGVseSwgd2l0aCBhIG1lc3NhZ2UKKyAgICAgICB0ZWxsaW5nIHlvdSB0aGV5IHdvcmsgb25seSB3aGVuIHRoZSBGSUxFIFRZUEUgaXMgQklOQVJZLiBOb3cgdGhleQorICAgICAgIHNpbXBseSBkbyB0aGlzIGZvciB5b3UuIFNlZSBbMzQzXVNlY3Rpb24gNC4yMyBmb3IgYWRkaXRpb25hbAorICAgICAgIChpbXBvcnRhbnQpIGluZm9ybWF0aW9uLgorICAgIDUuIFNFVCBQUkVGSVhJTkcgQ0FVVElPVVMgYW5kIE1JTklNQUwgbm93IGJvdGggcHJlZml4IGxpbmVmZWVkICgxMAorICAgICAgIGFuZCAxMzgpIGluIGNhc2UgcmxvZ2luLCBzc2gsIG9yIGN1IGFyZSAiaW4gdGhlIG1pZGRsZSIsIHNpbmNlCisgICAgICAgb3RoZXJ3aXNlIDxMRj5+IG1pZ2h0IGFwcGVhciBpbiBLZXJtaXQgcGFja2V0cywgYW5kIHRoaXMgd291bGQKKyAgICAgICBjYXVzZSBybG9naW4sIHNzaCwgb3IgY3UgdG8gZGlzY29ubmVjdCwgc3VzcGVuZCxlc2NhcGUgYmFjaywgb3IKKyAgICAgICBvdGhlcndpc2Ugd3JlY2sgdGhlIGZpbGUgdHJhbnNmZXIuIFhvbiBhbmQgWG9mZiBhcmUgbm93IGFsd2F5cworICAgICAgIHByZWZpeGVkIHRvbywgZXZlbiB3aGVuIFhvbi9Yb2ZmIGZsb3cgY29udHJvbCBpcyBub3QgaW4gZWZmZWN0LAorICAgICAgIHNpbmNlIHVucHJlZml4aW5nIHRoZW0gaGFzIHByb3ZlbiBkYW5nZXJvdXMgb24gVENQL0lQIGNvbm5lY3Rpb25zLgorICAgIDYuIEluIFVOSVgsIFZNUywgV2luZG93cywgYW5kIE9TLzIsIHRoZSBESVJFQ1RPUlkgY29tbWFuZCBpcyBidWlsdAorICAgICAgIGludG8gQy1LZXJtaXQgaXRzZWxmIHJhdGhlciB0aGFuIGltcGxlbWVudGVkIGJ5IHJ1bm5pbmcgYW4KKyAgICAgICBleHRlcm5hbCBjb21tYW5kIG9yIHByb2dyYW0uIFRoZSBidWlsdC1pbiBjb21tYW5kIG1pZ2h0IG5vdCBiZWhhdmUKKyAgICAgICB0aGUgd2F5IHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBleHRlcm5hbCBvbmUgZGlkLCBidXQgbWFueSBvcHRpb25zCisgICAgICAgYXJlIGF2YWlsYWJsZSBmb3IgY3VzdG9taXphdGlvbi4gT2YgY291cnNlIHRoZSB1bmRlcmx5aW5nCisgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCBjYW4gc3RpbGwgYmUgYWNjZXNzZWQgd2l0aCAiISIsICJAIiwgb3IKKyAgICAgICAiUlVOIiB3aGVyZXZlciB0aGUgaW5zdGFsbGF0aW9uIGRvZXMgbm90IGZvcmJpZC4gSW4gVU5JWCwgdGhlICJscyIKKyAgICAgICBjb21tYW5kIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBhcyAibHMiIGluIEMtS2VybWl0LiBTZWUKKyAgICAgICBbMzQ0XVNlY3Rpb24gNC41LjEgZm9yIGRldGFpbHMuCisgICAgNy4gU0VORCA/IHByaW50cyBhIGxpc3Qgb2Ygc3dpdGNoZXMgcmF0aGVyIHRoYW4gYSBsaXN0IG9mIGZpbGVuYW1lcy4KKyAgICAgICBJZiB5b3Ugd2FudCB0byBzZWUgYSBsaXN0IG9mIGZpbGVuYW1lcywgdXNlIGEgKHN5c3RlbS1kZXBlbmRlbnQpCisgICAgICAgY29uc3RydWN0aW9uIHN1Y2ggYXMgU0VORCAuLz8gKGZvciBVTklYLCBXaW5kb3dzLCBvciBPUy8yKSwgU0VORAorICAgICAgIFtdPyAoVk1TKSwgZXRjLiBTZWUgWzM0NV1TZWN0aW9ucyAxLjUgYW5kIFszNDZdNC43LjEuCisgICAgOC4gSW4gVU5JWCwgT1MtOSwgYW5kIEtlcm1pdCA5NSwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMgaW4gcHJldmlvdXMKKyAgICAgICB2ZXJzaW9ucyB3ZXJlICogYW5kID8uIEluIEMtS2VybWl0IDcuMCB0aGV5IGFyZSAqLCA/LCBbLCBdLCB7LCBhbmQKKyAgICAgICB9LCB3aXRoIGRhc2ggdXNlZCBpbnNpZGUgW10ncyB0byBkZW5vdGUgcmFuZ2VzIGFuZCBjb21tYSB1c2VkCisgICAgICAgaW5zaWRlIHt9IHRvIHNlcGFyYXRlIGxpc3QgZWxlbWVudHMuIElmIHlvdSBuZWVkIHRvIGluY2x1ZGUgYW55IG9mCisgICAgICAgdGhlc2UgY2hhcmFjdGVycyBsaXRlcmFsbHkgaW4gYSBmaWxlbmFtZSwgcHJlY2VkZSBlYWNoIG9uZSB3aXRoCisgICAgICAgYmFja3NsYXNoIChcKS4gU2VlIFszNDddU2VjdGlvbiA0LjkuCisgICAgOS4gU0VUIFFVSUVUIHsgT04sIE9GRiB9IGlzIG5vdyBvbiB0aGUgY29tbWFuZCBzdGFjaywganVzdCBsaWtlIFNFVAorICAgICAgIElOUFVUIENBU0UsIFNFVCBDT1VOVCwgU0VUIE1BQ1JPIEVSUk9SLCBldGMsIGFzIGRlc2NyaWJlZCBvbiBwLjQ1OAorICAgICAgIG9mIFszNDhdVXNpbmcgQy1LZXJtaXQsIDJuZCBFZGl0aW9uLiBUaGlzIGFsbG93cyBhbnkgbWFjcm8gb3IKKyAgICAgICBjb21tYW5kIGZpbGUgdG8gU0VUIFFVSUVUIE9OIG9yIE9GRiB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHNhdmluZworICAgICAgIGFuZCByZXN0b3JpbmcgdGhlIGdsb2JhbCBRVUlFVCB2YWx1ZS4gRm9yIGV4YW1wbGUsIHRoaXMgbGV0cyB5b3UKKyAgICAgICB3cml0ZSBhIHNjcmlwdCB0aGF0IHRyaWVzIFNFVCBMSU5FIG9uIGxvdHMgb2YgZGV2aWNlcyB1bnRpbCBpdAorICAgICAgIGZpbmRzIG9uZSBmcmVlIHdpdGhvdXQgc3Bld2luZyBvdXQgbG9hZHMgb2YgZXJyb3IgbWVzc2FnZXMsIGFuZAorICAgICAgIGFsc28gd2l0aG91dCBkaXN0dXJiaW5nIHRoZSBnbG9iYWwgUVVJRVQgc2V0dGluZywgd2hhdGV2ZXIgaXQgd2FzLgorICAgMTAuIEJlY2F1c2Ugb2YgdGhlIG5ldyAiLiIgb3BlcmF0b3IgKHdoaWNoIGludHJvZHVjZXMgYXNzaWdubWVudHMpLAorICAgICAgIG1hY3JvcyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoICIuIiBjYW4gbm90IGJlIGludm9rZWQgImJ5IG5hbWUiLgorICAgICAgIEhvd2V2ZXIsIHRoZXkgc3RpbGwgY2FuIGJlIGludm9rZWQgd2l0aCBETy4KKyAgIDExLiBUaGUgc3ludGF4IG9mIHRoZSBFVkFMVUFURSBjb21tYW5kIGhhcyBjaGFuZ2VkLiBTZWUgWzM0OV1TZWN0aW9uCisgICAgICAgNy45LjIuIFRvIHJlc3RvcmUgdGhlIHByZXZpb3VzIHN5bnRheCwgdXNlIFNFVCBFVkFMVUFURSBPTEQuCisgICAxMi4gVGhlIFx2KGRpcmVjdG9yeSkgdmFyaWFibGUgbm93IGluY2x1ZGVzIHRoZSB0cmFpbGluZyBkaXJlY3RvcnkKKyAgICAgICBzZXBhcmF0b3I7IGluIHByZXZpb3VzIHJlbGVhc2VzIGl0IGRpZCBub3QuIFRoaXMgaXMgdG8gYWxsb3cKKyAgICAgICBjb25zdHJ1Y3Rpb25zIHN1Y2ggYXM6CisgIGNkIFx2KGRpcilkYXRhLnRtcAorICAgICAgIHRvIHdvcmsgYWNyb3NzIHBsYXRmb3JtcyB0aGF0IG1pZ2h0IGhhdmUgZGlmZmVyZW50IGRpcmVjdG9yeQorICAgICAgIG5vdGF0aW9uLCBzdWNoIGFzIFVOSVgsIFdpbmRvd3MsIGFuZCBWTVMuCisgICAxMy4gUHJpb3IgdG8gQy1LZXJtaXQgNy4wLCB0aGUgRkxPVy1DT05UUk9MIHNldHRpbmcgd2FzIGdsb2JhbCBhbmQKKyAgICAgICBzdGlja3kuIEluIEMtS2VybWl0IDcuMCwgdGhlcmUgaXMgYW4gYXJyYXkgb2YgZGVmYXVsdCBmbG93LWNvbnRyb2wKKyAgICAgICB2YWx1ZXMgZm9yIGVhY2gga2luZCBvZiBjb25uZWN0aW9uLCB0aGF0IGFyZSBhcHBsaWVkIGF1dG9tYXRpY2FsbHkKKyAgICAgICBhdCBTRVQgTElORS9QT1JUL0hPU1QgdGltZS4gVGh1cyBhIFNFVCBGTE9XIGNvbW1hbmQgZ2l2ZW4gYmVmb3JlCisgICAgICAgU0VUIExJTkUvUE9SVC9IT1NUIGlzIGxpa2VseSB0byBiZSB1bmRvbmUuIFRoZXJlZm9yZSBTRVQgRkxPVyBjYW4KKyAgICAgICBiZSBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0IG9ubHkgaWYgZ2l2ZW4gYWZ0ZXIgdGhlCisgICAgICAgU0VUIExJTkUvUE9SVC9IT1NUIGNvbW1hbmQuCisgICAxNC4gQ2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiB3b3JrcyBkaWZmZXJlbnRseSBpbiB0aGUgVFJBTlNNSVQKKyAgICAgICBjb21tYW5kIHdoZW4gKGEpIHRoZSBmaWxlIGNoYXJhY3Rlci1zZXQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZQorICAgICAgIGxvY2FsIGVuZCBvZiB0aGUgdGVybWluYWwgY2hhcmFjdGVyLXNldCwgb3IgKGIpIHdoZW4gdGhlIHRlcm1pbmFsCisgICAgICAgY2hhcmFjdGVyLXNldCBpcyBUUkFOU1BBUkVOVC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxLiBQUk9HUkFNIEFORCBGSUxFIE1BTkFHRU1FTlQgQU5EIENPTU1BTkRTCisKKyAgMS4wLiBCdWcgRml4ZXMKKworICAgVGhlIGZvbGxvd2luZyBwYXRjaGVzIHdlcmUgaXNzdWVkIHRvIGNvcnJlY3QgYnVncyBpbiBDLUtlcm1pdCA2LjAuCisgICBUaGVzZSBhcmUgZGVzY3JpYmVkIGluIGRldGFpbCBpbiB0aGUgNi4wIFBBVENIRVMgZmlsZS4gQWxsIG9mIHRoZXNlCisgICBmaXhlcyBoYXZlIGJlZW4gaW5jb3Jwb3JhdGVkIGluIEMtS2VybWl0IDYuMSAobmV2ZXIgcmVsZWFzZWQgZXhjZXB0IGFzCisgICBLOTUgMS4xLjE2LTE3KSBhbmQgNy4wLgorCisgMDAwMSAgIEFsbCBVTklYICAgICAgICAgQy1LZXJtaXQgbWlzaGFuZGxlcyB0aW1lc3RhbXBzIG9uIGZpbGVzIGJlZm9yZSAxOTcwCisgMDAwMiAgIFNvbGFyaXMgMi41KysgICAgQ29tcGlsYXRpb24gZXJyb3Igb24gU29sYXJpcyAyLjUgd2l0aCBQcm8gQworIDAwMDMgICBBbGwgVk1TICAgICAgICAgIENLRVJNSVQuSU5JIEZpeCBmb3IgVk1TCisgMDAwNCAgIFZNUy9WQVgvVUNYIDIuMCAgQy1LZXJtaXQgNi4wIGNhbid0IFRFTE5FVCBvbiBWQVgvVk1TIHdpdGggVUNYIDIuMAorIDAwMDUgICBBbGwgICAgICAgICAgICAgIEMtS2VybWl0IE1pZ2h0IFNlbmQgUGFja2V0cyBPdXRzaWRlIFdpbmRvdworIDAwMDYgICBBbGwgICAgICAgICAgICAgIE1PVkUgZnJvbSBTRU5ELUxJU1QgZG9lcyBub3QgZGVsZXRlIG9yaWdpbmFsIGZpbGVzCisgMDAwNyAgIFNvbGFyaXMgMi41KysgICAgSGlnaGVyIHNlcmlhbCBzcGVlZHMgb24gU29sYXJpcyAyLjUKKyAwMDA4ICAgQWxsICAgICAgICAgICAgICBDLUtlcm1pdCBhcHBsaWNhdGlvbiBmaWxlIG5hbWUgY2FuJ3QgY29udGFpbiBzcGFjZXMKKyAwMDA5ICAgQVQmVCA3MzAwIFVOSVhQQyBzZXR1aWQgYW5kIGhhcmR3YXJlIGZsb3ctY29udHJvbCBwcm9ibGVtcworIDAwMTAgICBMaW51eCBvbiBBbHBoYSAgIFBhdGNoIHRvIG1ha2UgY2t1dGlvLmMgY29tcGlsZSBvbiBMaW51eC9BbHBoYQorIDAwMTEgICBPUy05LzY4MDAwIDIuNCAgIFBhdGNoIHRvIG1ha2UgY2s5Y29uLmMgY29tcGlsZSBvbiBPUy05LzY4MDAwIDIuNAorIDAwMTIgICBNVyBDb2hlcmVudCA0LjIgIFBhdGNoZXMgZm9yIHN1Y2Nlc3NmdWwgYnVpbGQgb24gQ29oZXJlbnQgNC4yCisgMDAxMyAgIFNJTklYLVkgNS40MyAgICAgImRlbGF5IiB2YXJpYWJsZSBjb25mbGljdHMgd2l0aCA8c3lzL2Nsb2NrLmg+CisgMDAxNCAgIFZNUy9WQVgvQ01VLUlQICAgU3ViamVjdDogUGF0Y2hlcyBmb3IgVkFYL1ZNUyA1LnggKyBDTVUtSVAKKyAwMDE1ICAgQWxsICAgICAgICAgICAgICBYRUNITyBkb2Vzbid0IGZsdXNoIGl0cyBvdXRwdXQKKyAwMDE2ICAgVk1TICAgICAgICAgICAgICBDRCBhbmQgb3RoZXIgZGlyZWN0b3J5IG9wZXJhdGlvbnMgbWlnaHQgbm90IHdvcmsKKyAwMDE3ICAgTGludXggMS4yLngrKyAgICBVc2Ugc3RhbmRhcmQgUE9TSVggaW50ZXJmYWNlIGZvciBoaWdoIHNlcmlhbCBzcGVlZHMKKyAwMDE4ICAgVU5JWCAgICAgICAgICAgICBTRVQgV0lMRENBUkQtRVhQQU5TSU9OIFNIRUxMIGR1bXBzIGNvcmUKKyAwMDE5ICAgQWxsICAgICAgICAgICAgICBIYXllcyBWLjM0IG1vZGVtIGluaXQgc3RyaW5nIHByb2JsZW0KKyAwMDIwICAgQWxsICAgICAgICAgICAgICBSRUFEIGNvbW1hbmQgZG9lcyBub3QgZmFpbCBpZiBmaWxlIG5vdCBvcGVuCisgMDAyMSAgIEFsbCAgICAgICAgICAgICAgUHJvYmxlbXMgd2l0aCBsb25nIGZ1bmN0aW9uIGFyZ3VtZW50cworIDAwMjIgICBBbGwgICAgICAgICAgICAgIENlcnRhaW4gXGZ1bmN0aW9uKClzIGNhbiBtaXNiZWhhdmUKKyAwMDIzICAgQWxsICAgICAgICAgICAgICBYIE1PRCAwIGNyYXNoZXMgcHJvZ3JhbQorIDAwMjQgICBBbGwgICAgICAgICAgICAgIEludGVybmFsIGJ1bGxldHByb29maW5nIGZvciBsb3dlcigpIGZ1bmN0aW9uCisgMDAyNSAgIE9wZW5CU0QgICAgICAgICAgUmVhbCBPcGVuQlNEIHN1cHBvcnQgZm9yIEMtS2VybWl0IDYuMAorIDAwMjYgICBBbGwgICAgICAgICAgICAgIEluY29ycmVjdCBjaGVja3MgZm9yIG1hY3JvL2NvbW1hbmQtZmlsZSBuZXN0aW5nIGRlcHRoCisgMDAyNyAgIEFsbCAgICAgICAgICAgICAgQU5TV0VSIGRvZXNuJ3QgYXV0b21hdGljYWxseSBDT05ORUNUCisgMDAyOCAgIEFsbCAgICAgICAgICAgICAgT3ZlcnplYWxvdXMgRVhJVCB3YXJuaW5nCisgMDAyOSAgIEFsbCAgICAgICAgICAgICAgT1VUUFVUIGRvZXNuJ3QgZWNobyB3aGVuIERVUExFWCBpcyBIQUxGCisgMDAzMCAgIEFsbCAgICAgICAgICAgICAgTWlub3IgcHJvYmxlbXMgd2l0aCBSRU1PVEUgRElSRUNUT1JZL0RFTEVURS9ldGMKKyAwMDMxICAgQWxsICAgICAgICAgICAgICBDSEVDSyBjb21tYW5kIGJyb2tlbgorIDAwMzIgICBBbGwgICAgICAgICAgICAgIFByb2JsZW0gd2l0aCBTRVQgVFJBTlNNSVQgRUNITworIDAwMzMgICBVTklYLCBWTVMsIGV0YyAgIEhFTFAgU0VUIFNFUlZFUiBzYXlzIHRvbyBtdWNoCisgMDAzNCAgIEFsbCAgICAgICAgICAgICAgUkVBRCBhbmQgIVJFQUQgdG9vIHBpY2t5IGFib3V0IGxpbmUgdGVybWluYXRvcnMKKyAwMDM1ICAgQWxsICAgICAgICAgICAgICBFTkQgZnJvbSBpbnNpZGUgU1dJVENIIGRvZXNuJ3Qgd29yaworIDAwMzYgICBBbGwgICAgICAgICAgICAgIFByb2JsZW0gdGVsbmV0dGluZyB0byBtdWx0aWhvbWVkIGhvc3RzCisgMDAzNyAgIEFsbCAgICAgICAgICAgICAgUmVkaXJlY3Rpb24gZmFpbHVyZXMgaW4gUkVNT1RFIHh4eCA+IGZpbGUKKworICAgUkVESVJFQ1Qgd2FzIG1pc3NpbmcgaW4gbWFueSBVTklYIEMtS2VybWl0IGltcGxlbWVudGF0aW9uczsgaW4gdmVyc2lvbgorICAgNy4wLCBpdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIGFsbCBvZiB0aGVtLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEuMS4gQ29tbWFuZCBDb250aW51YXRpb24KKworICAgQ29tbWVudHMgdGhhdCBzdGFydCB3aXRoICI7IiBvciAiIyIgY2FuIG5vIGxvbmdlciBiZSBjb250aW51ZWQuIEluOgorCisgIDsgdGhpcyBpcyBhIGNvbW1lbnQgLQorICBlY2hvIGJsYWgKKworICAgdGhlIEVDSE8gY29tbWFuZCB3aWxsIGV4ZWN1dGUsIHJhdGhlciB0aGFuIGJlaW5nIHRha2VuIGFzIGEKKyAgIGNvbnRpbnVhdGlvbiBvZiB0aGUgcHJlY2VkaW5nIGNvbW1lbnQgbGluZS4gVGhpcyBhbGxvd3MgZWFzeQorICAgImNvbW1lbnRpbmcgb3V0IiBvZiBjb21tYW5kcyBmcm9tIG1hY3JvIGRlZmluaXRpb25zLgorCisgICBIb3dldmVyLCB0aGUgdGV4dCBvZiB0aGUgQ09NTUVOVCBjb21tYW5kIGNhbiBzdGlsbCBiZSBjb250aW51ZWQgb250bworICAgc3Vic2VxdWVudCBsaW5lczoKKworICBjb21tZW50IHRoaXMgaXMgYSBjb21tZW50IC0KKyAgZWNobyBibGFoCisKKyAgIEFzIG9mIHZlcnNpb24gNi4wLCBiYWNrc2xhc2ggaXMgbm8gbG9uZ2VyIGEgdmFsaWQgY29udGludWF0aW9uCisgICBjaGFyYWN0ZXIuIE9ubHkgaHlwaGVuIHNob3VsZCBiZSB1c2VkIGZvciBjb21tYW5kIGNvbnRpbnVhdGlvbi4gVGhpcworICAgaXMgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBpc3N1ZSBjb21tYW5kcyBsaWtlICJjZCBhOlwiIG9uIERPUy1saWtlCisgICBzeXN0ZW1zLgorCisgICBBcyBvZiB2ZXJzaW9uIDcuMDoKKworICAgICAqIFlvdSBjYW4gcXVvdGUgYSBmaW5hbCBkYXNoIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBhIGNvbnRpbnVhdGlvbgorICAgICAgIGNoYXJhY3RlcjoKKyAgZWNobyBmb29cLQorICAgICAgIFRoaXMgcHJpbnRzICJmb28tIi4gVGhlIGNvbW1hbmQgaXMgbm90IGNvbnRpbnVlZC4KKyAgICAgKiBZb3UgY2FuIGVudGVyIGNvbW1hbmRzIHN1Y2ggYXM6CisgIGVjaG8gZm9vIC0gOyB0aGlzIGlzIGEgY29tbWVudAorICAgICAgIGludGVyYWN0aXZlbHkgYW5kIHRoZXkgYXJlIHByb3Blcmx5IHRyZWF0ZWQgYXMgY29udGludWVkIGNvbW1hbmRzLgorICAgICAgIFByZXZpb3VzbHkgdGhpcyB3b3JrZWQgb25seSBpbiBjb21tYW5kIGZpbGVzLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEuMi4gRWRpdG9yIEludGVyZmFjZQorCisgICBTRVQgRURJVE9SIG5hbWUgWyBvcHRpb25zIF0KKyAgICAgICAgICBMZXRzIHlvdSBzcGVjaWZ5IGEgdGV4dC1lZGl0aW5nIHByb2dyYW0uIFRoZSBuYW1lIGNhbiBiZSBhCisgICAgICAgICAgZnVsbHkgc3BlY2lmaWVkIHBhdGhuYW1lIGxpa2UgL3Vzci9sb2NhbC9iaW4vZW1hY3MxOS9lbWFjcywgb3IKKyAgICAgICAgICBpdCBjYW4gYmUgdGhlIG5hbWUgb2YgYW55IHByb2dyYW0gaW4geW91ciBQQVRILCBlLmcuICJzZXQKKyAgICAgICAgICBlZGl0b3IgZW1hY3MiLiBJbiBWTVMsIGl0IG11c3QgYmUgYSBEQ0wgY29tbWFuZCBsaWtlICJlZGl0IiwKKyAgICAgICAgICAiZWRpdC90cHUiLCAiZW1hY3MiLCBldGMuIElmIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIEVESVRPUiBpcworICAgICAgICAgIGRlZmluZWQgd2hlbiBLZXJtaXQgc3RhcnRzLCBpdHMgdmFsdWUgaXMgdGhlIGRlZmF1bHQgZWRpdG9yLgorICAgICAgICAgIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IG9wdGlvbnMgdG8gYmUgaW5jbHVkZWQgb24gdGhlIGVkaXRvcgorICAgICAgICAgIGNvbW1hbmQgbGluZS4gUmV0dXJucyB0byBLZXJtaXQgd2hlbiB0aGUgZWRpdG9yIGV4aXRzLgorCisgICBFRElUIFsgZmlsZW5hbWUgXQorICAgICAgICAgIElmIHRoZSBFRElUIGNvbW1hbmQgaXMgZ2l2ZW4gd2l0aG91dCBhIGZpbGVuYW1lLCB0aGVuIGlmIGEKKyAgICAgICAgICBwcmV2aW91cyBmaWxlbmFtZSBoYWQgYmVlbiBnaXZlbiB0byBhbiBFRElUIGNvbW1hbmQsIGl0IGlzCisgICAgICAgICAgdXNlZDsgaWYgbm90LCB0aGUgZWRpdG9yIGlzIHN0YXJ0ZWQgd2l0aG91dCBhIGZpbGUuIElmIGEKKyAgICAgICAgICBmaWxlbmFtZSBpcyBnaXZlbiwgdGhlIGVkaXRvciBpcyBzdGFydGVkIG9uIHRoYXQgZmlsZSwgYW5kIHRoZQorICAgICAgICAgIGZpbGVuYW1lIGlzIHJlbWVtYmVyZWQgZm9yIHN1YnNlcXVlbnQgRURJVCBjb21tYW5kcy4KKworICAgU0hPVyBFRElUT1IKKyAgICAgICAgICBEaXNwbGF5cyB0aGUgZnVsbCBwYXRobmFtZSBvZiB5b3VyIHRleHQgZWRpdG9yLCBpZiBhbnksIGFsb25nCisgICAgICAgICAgd2l0aCBhbnkgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGFuZCB0aGUgZmlsZSBtb3N0IHJlY2VudGx5CisgICAgICAgICAgZWRpdGVkIChhbmQgdGhlcmVmb3JlIHRoZSBkZWZhdWx0IGZpbGVuYW1lIGZvciB5b3VyIG5leHQgRURJVAorICAgICAgICAgIGNvbW1hbmQpLgorCisgICBSZWxhdGVkIHZhcmlhYmxlczogXHYoZWRpdG9yKSwgXHYoZWRpdG9wdHMpLCBcdihlZGl0ZmlsZSkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMS4zLiBXZWIgQnJvd3NlciBhbmQgRlRQIEludGVyZmFjZQorCisgICBDLUtlcm1pdCBpbmNsdWRlcyBhbiBGVFAgY29tbWFuZCwgd2hpY2ggc2ltcGx5IHJ1bnMgdGhlIEZUUCBwcm9ncmFtOworICAgQy1LZXJtaXQgZG9lcyBub3QgaW5jbHVkZSBhbnkgYnVpbHQtaW4gc3VwcG9ydCBmb3IgSW50ZXJuZXQgRmlsZQorICAgVHJhbnNmZXIgUHJvdG9jb2wsIG5vciBhbnkgbWV0aG9kIGZvciBpbnRlcmFjdGluZyBkaXJlY3RseSB3aXRoIGFuIEZUUAorICAgc2VydmVyLiBJbiB2ZXJzaW9uIDcuMCwgaG93ZXZlciwgQy1LZXJtaXQgbGV0cyB5b3Ugc3BlY2lmeSB5b3VyIEZUUAorICAgY2xpZW50OgorCisgICBTRVQgRlRQLUNMSUVOVCBbIG5hbWUgWyBvcHRpb25zIF0gXQorICAgICAgICAgIFRoZSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBGVFAgZXhlY3V0YWJsZS4gSW4gVU5JWCwgV2luZG93cywKKyAgICAgICAgICBvciBPUy8yLCBpdCBjYW4gYmUgdGhlIGZpbGVuYW1lIG9mIGFueSBleGVjdXRhYmxlIHByb2dyYW0gaW4KKyAgICAgICAgICB5b3VyIFBBVEggKGUuZy4gImZ0cC5leGUiIGluIFdpbmRvd3MsICJmdHAiIGluIFVOSVgpOyBlbHNld2hlcmUKKyAgICAgICAgICAob3IgaWYgeW91IGRvIG5vdCBoYXZlIGEgUEFUSCBkZWZpbml0aW9uKSwgaXQgbXVzdCBiZSB0aGUgZnVsbHkKKyAgICAgICAgICBzcGVjaWZpZWQgcGF0aG5hbWUgb2YgdGhlIEZUUCBwcm9ncmFtLiBJZiB0aGUgbmFtZSBjb250YWlucyBhbnkKKyAgICAgICAgICBzcGFjZXMsIGVuY2xvc2UgaXQgYnJhY2VzLiBJbmNsdWRlIGFueSBvcHRpb25zIGFmdGVyIHRoZQorICAgICAgICAgIGZpbGVuYW1lOyB0aGVzZSBkZXBlbmQgdGhlIHBhcnRpY3VsYXIgZnRwIGNsaWVudC4KKworICAgVGhlIFdlYiBicm93c2VyIGludGVyZmFjZSBpcyBjb3ZlcmVkIGluIHRoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbnMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAxLjMuMS4gSW52b2tpbmcgeW91ciBCcm93c2VyIGZyb20gQy1LZXJtaXQKKworICAgQlJPV1NFIFsgdXJsIF0KKyAgICAgICAgICBTdGFydHMgeW91ciBwcmVmZXJyZWQgV2ViIGJyb3dzZXIgb24gdGhlIFVSTCwgaWYgb25lIGlzIGdpdmVuLAorICAgICAgICAgIG90aGVyd2lzZSBvbiB0aGUgbW9zdCByZWNlbnRseSBnaXZlbiBVUkwsIGlmIGFueS4gUmV0dXJucyB0bworICAgICAgICAgIEtlcm1pdCB3aGVuIHRoZSBicm93c2VyIGV4aXRzLgorCisgICBTRVQgQlJPV1NFUiBbIG5hbWUgWyBvcHRpb25zIF0gXQorICAgICAgICAgIFVzZSB0aGlzIGNvbW1hbmQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIFdlYiBicm93c2VyCisgICAgICAgICAgcHJvZ3JhbSwgZm9yIGV4YW1wbGU6ICJzZXQgYnJvd3NlciBseW54Ii4gVGhlIG5hbWUgbXVzdCBiZSBpbgorICAgICAgICAgIHlvdXIgUEFUSCwgb3IgZWxzZSBpdCBtdXN0IGJlIGEgZnVsbHkgc3BlY2lmaWVkIGZpbGVuYW1lOyBpbgorICAgICAgICAgIFZNUyBpdCBtdXN0IGJlIGEgRENMIGNvbW1hbmQuCisKKyAgIFNIT1cgQlJPV1NFUgorICAgICAgICAgIERpc3BsYXlzIHRoZSBjdXJyZW50IGJyb3dzZXIsIG9wdGlvbnMsIGFuZCBtb3N0IHJlY2VudCBVUkwuCisKKyAgIFJlbGF0ZWQgdmFyaWFibGVzOiBcdihicm93c2VyKSwgXHYoYnJvd3NvcHRzKSwgXHYoYnJvd3N1cmwpLgorCisgICBBbHNvIHNlZSBbMzUwXVNlY3Rpb24gMi4xNTogQ29udGFjdGluZyBXZWIgU2VydmVycyB3aXRoIHRoZSBIVFRQCisgICBDb21tYW5kLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMS4zLjIuIEludm9raW5nIEMtS2VybWl0IGZyb20geW91ciBCcm93c2VyCisKKyAgIFRoZSBtZXRob2QgZm9yIGRvaW5nIHRoaXMgZGVwZW5kcywgb2YgY291cnNlLCBvbiB5b3VyIGJyb3dzZXIuIEhlcmUKKyAgIGFyZSBzb21lIGV4YW1wbGVzOgorCisgICBOZXRzY2FwZSBvbiBVTklYIChYLWJhc2VkKQorICAgICAgICAgIEluIHRoZSBPcHRpb25zLT5BcHBsaWNhdGlvbnMgc2VjdGlvbiwgc2V0IHlvdXIgVGVsbmV0CisgICAgICAgICAgYXBwbGljYXRpb24gdG86CisKKyAgeHRlcm0gLWUgL3Vzci9sb2NhbC9iaW4va2VybWl0L2tlcm1pdCAtSiAlaCAlcAorCisgICAgICAgICAgKHJlcGxhY2UgIi91c3IvbG9jYWwvYmluL2tlcm1pdC9rZXJtaXQiIGJ5IEMtS2VybWl0J3MgYWN0dWFsCisgICAgICAgICAgcGF0aG5hbWUpLiAtSiBpcyBDLUtlcm1pdCdzIGNvbW1hbmQtbGluZSBvcHRpb24gdG8gImJlIGxpa2UKKyAgICAgICAgICBUZWxuZXQiOyAlaCBhbmQgJXAgYXJlIE5ldHNjYXBlIHBsYWNlaG9sZGVycyBmb3IgaG9zdG5hbWUgYW5kCisgICAgICAgICAgcG9ydC4KKworICAgTHlueCBvbiBVTklYCisgICAgICAgICAgQXMgZmFyIGFzIHdlIGtub3csIHRoaXMgY2FuIGJlIGRvbmUgb25seSBhdCBjb21waWxlIHRpbWUuIEFkZAorICAgICAgICAgIHRoZSBmb2xsb3dpbmcgbGluZSB0byB0aGUgTHlueCB1c2VyZGVmcy5oIGZpbGUgYmVmb3JlIGJ1aWxkaW5nCisgICAgICAgICAgdGhlIEx5bnggYmluYXJ5OgorCisgICNkZWZpbmUgVEVMTkVUX0NPTU1BTkQgIi9vcHQvYmluL2tlcm1pdCAtSiIKKworICAgICAgICAgIEFuZCB0aGVuIGFkZCBsaW5lcyBsaWtlIHRoZSBmb2xsb3dpbmcgdG8gdGhlIEx5bnguY2ZnIGZpbGU6CisKKyAgRE9XTkxPQURFUjpLZXJtaXQgYmluYXJ5IGRvd25sb2FkOi9vcHQvYmluL2tlcm1pdCAtaSAtViAtcyAlcyAtYSAlczpUUlVFCisgIERPV05MT0FERVI6S2VybWl0IHRleHQgZG93bmxvYWQ6L29wdC9iaW4va2VybWl0IC1zICVzIC1hICVzOlRSVUUKKworICBVUExPQURFUjpLZXJtaXQgYmluYXJ5IHVwbG9hZDovb3B0L2Jpbi9rZXJtaXQgLWkgLXIgLWEgJXM6VFJVRQorICBVUExPQURFUjpLZXJtaXQgdGV4dCB1cGxvYWQ6L29wdC9iaW4va2VybWl0IC1yIC1hICVzOlRSVUUKKyAgVVBMT0FERVI6S2VybWl0IHRleHQgZ2V0Oi9vcHQvYmluL2tlcm1pdCAtZyAlczpUUlVFCisgIFVQTE9BREVSOktlcm1pdCBiaW5hcnkgZ2V0Oi9vcHQvYmluL2tlcm1pdCAtaWcgJXM6VFJVRQorCisgICBCdXQgbm9uZSBvZiB0aGUgYWJvdmUgaXMgbmVjZXNzYXJ5IGlmIHlvdSBtYWtlIEMtS2VybWl0IHlvdXIgZGVmYXVsdAorICAgVGVsbmV0IGNsaWVudCwgd2hpY2ggeW91IGNhbiBkbyBieSBtYWtpbmcgYSBzeW1saW5rIGNhbGxlZCAndGVsbmV0JyB0bworICAgdGhlIEMtS2VybWl0IDcuMCBiaW5hcnkuIFNlZSBbMzUxXVNlY3Rpb24gOS4xIGZvciBkZXRhaWxzLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEuNC4gQ29tbWFuZCBFZGl0aW5nCisKKyAgIEN0cmwtVyAoIldvcmQgZGVsZXRlIikgd2FzIGNoYW5nZWQgaW4gNy4wIHRvIGRlbGV0ZSBiYWNrIHRvIHRoZQorICAgcHJldmlvdXMgbm9uLWFscGhhbnVtZXJpYywgcmF0aGVyIHRoYW4gYWxsIHRoZSB3YXkgYmFjayB0byB0aGUKKyAgIHByZXZpb3VzIHNwYWNlLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEuNS4gQ29tbWFuZCBTd2l0Y2hlcworCisgICBBcyBvZiB2ZXJzaW9uIDcuMCwgQy1LZXJtaXQncyBjb21tYW5kIHBhcnNlciBzdXBwb3J0cyBhIG5ldyB0eXBlIG9mCisgICBmaWVsZCwgY2FsbGVkIGEgInN3aXRjaCIuIFRoaXMgaXMgYW4gb3B0aW9uYWwgY29tbWFuZCBtb2RpZmllci4KKworICAgIDEuNS4xLiBHZW5lcmFsIFN3aXRjaCBTeW50YXgKKworICAgQSBzd2l0Y2ggaXMgYSBrZXl3b3JkIGJlZ2lubmluZyB3aXRoIGEgc2xhc2ggKC8pLiBJZiBpdCB0YWtlcyBhIHZhbHVlLAorICAgdGhlbiB0aGUgdmFsdWUgaXMgYXBwZW5kZWQgdG8gaXQgKHdpdGggbm8gaW50ZXJ2ZW5pbmcgc3BhY2VzKSwKKyAgIHNlcGFyYXRlZCBieSBhIGNvbG9uICg6KSBvciBlcXVhbCBzaWduICg9KS4gRGVwZW5kaW5nIG9uIHRoZSBzd2l0Y2gsCisgICB0aGUgdmFsdWUgbWF5IGJlIGEgbnVtYmVyLCBhIGtleXdvcmQsIGEgZmlsZW5hbWUsIGEgZGF0ZS90aW1lLCBldGMuCisgICBFeGFtcGxlczoKKworICBzZW5kIG9vZmEudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBObyBzd2l0Y2hlcworICBzZW5kIC9iaW5hcnkgb29mYS56aXAgICAgICAgICAgICAgICAgICAgICAgOyBBIHN3aXRjaCB3aXRob3V0IGEgdmFsdWUKKyAgc2VuZCAvcHJvdG9jb2w6em1vZGVtIG9vZmEuemlwICAgICAgICAgICAgIDsgQSBzd2l0Y2ggd2l0aCBhIHZhbHVlICg6KQorICBzZW5kIC9wcm90b2NvbD16bW9kZW0gb29mYS56aXAgICAgICAgICAgICAgOyBBIHN3aXRjaCB3aXRoIGEgdmFsdWUgKD0pCisgIHNlbmQgL3RleHQgL2RlbGV0ZSAvYXMtbmFtZTp4Lnggb29mYS50eHQgICA7IFNldmVyYWwgc3dpdGNoZXMKKworICAgTGlrZSBvdGhlciBjb21tYW5kIGZpZWxkcywgc3dpdGNoZXMgYXJlIHNlcGFyYXRlZCBmcm9tIG90aGVyIGZpZWxkcywKKyAgIGFuZCBmcm9tIGVhY2ggb3RoZXIsIGJ5IHdoaXRlc3BhY2UsIGFzIHNob3duIGluIHRoZSBleGFtcGxlcyBqdXN0CisgICBhYm92ZS4gWW91IGNhbiBub3QgcHV0IHRoZW0gdG9nZXRoZXIgbGlrZSBzbzoKKworICBzZW5kL3RleHQvZGVsZXRlL2FzLW5hbWU6eC54IG9vZmEudHh0CisKKyAgIChhcyB5b3UgbWlnaHQgZG8gaW4gVk1TIG9yIERPUywgb3IgYXMgd2UgbWlnaHQgb25jZSBoYXZlIGRvbmUgaW4KKyAgIFRPUFMtMTAgb3IgVE9QUzAtMjAsIG9yIFBJUCkuIFRoaXMgaXMgcHJpbWFyaWx5IGR1ZSB0byBhbWJpZ3VpdHkKKyAgIGJldHdlZW4gIi8iIGFzIHN3aXRjaCBpbnRyb2R1Y2VyIHZlcnN1cyAiLyIgYXMgVU5JWCBkaXJlY3RvcnkKKyAgIHNlcGFyYXRvcjsgZS5nLiBpbjoKKworICBzZW5kIC9kZWxldGUvYXMtbmFtZTpmb28vdGV4dCBvb2ZhLnR4dAorCisgICBEb2VzICJmb28vdGV4dCIgbWVhbiB0aGUgZmlsZW5hbWUgaXMgImZvbyIgYW5kIHRoZSB0cmFuc2ZlciBpcyB0byBiZQorICAgaW4gdGV4dCBtb2RlLCBvciBkb2VzIGl0IG1lYW4gdGhlIGZpbGVuYW1lIGlzICJmb28vdGV4dCI/IFRoZXJlZm9yZSB3ZQorICAgcmVxdWlyZSB3aGl0ZXNwYWNlIGJldHdlZW4gc3dpdGNoZXMgdG8gcmVzb2x2ZSB0aGUgYW1iaWd1aXR5LiAoVGhhdCdzCisgICBvbmx5IG9uZSBvZiBzZXZlcmFsIHBvc3NpYmxlIGFtYmlndWl0aWVzIC0tIGl0IGlzIGFsc28gY29uY2VpdmFibGUKKyAgIHRoYXQgYSBmaWxlIGNhbGxlZCAidGV4dCIgZXhpc3RzIGluIHRoZSBwYXRoICIvZGVsZXRlL2FzLW5hbWU6Zm9vLyIpLgorCisgICBJbiBnZW5lcmFsLCBpZiBhIHN3aXRjaCBjYW4gdGFrZSBhIHZhbHVlLCBidXQgeW91IG9taXQgaXQsIHRoZW4gZWl0aGVyCisgICBhIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZSBpcyBzdXBwbGllZCwgb3IgYW4gZXJyb3IgbWVzc2FnZSBpcworICAgcHJpbnRlZDoKKworICBzZW5kIC9wcmludDotUGxhc2Vyd3JpdGVyIG9vZmEudHh0ICAgICAgICAgOyBWYWx1ZSBpbmNsdWRlZCA9IHByaW50IG9wdGlvbnMKKyAgc2VuZCAvcHJpbnQgb29mYS50eHQgICAgICAgICAgICAgICAgICAgICAgIDsgVmFsdWUgb21pdHRlZCwgT0sKKyAgc2VuZCAvbWFpbDprZXJtaXRAY29sdW1iaWEuZWR1IG9vZmEudHh0ICAgIDsgVmFsdWUgaW5jbHVkZWQgPSBhZGRyZXNzCisgIHNlbmQgL21haWwgb29mYS50eHQgICAgICAgICAgICAgICAgICAgICAgICA7IE5vdCBPSyAtIGFkZHJlc3MgcmVxdWlyZWQKKyAgP0FkZHJlc3MgcmVxdWlyZWQKKworICAgQ29udGV4dC1zZW5zaXRpdmUgaGVscCAoPykgYW5kIGNvbXBsZXRpb24gKEVzYyBvciBUYWIpIGFyZSBhdmFpbGFibGUKKyAgIGluIHRoZSBub3JtYWwgbWFubmVyOgorCisgIEMtS2VybWl0PiBzZW5kIC9wcj8gU3dpdGNoLCBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAvcHJpbnQgL3Byb3RvY29sCisgIEMtS2VybWl0PiBzZW5kIC9wcm88RVNDPnRvY29sOj8gIEZpbGUtdHJhbnNmZXIgcHJvdG9jb2wsCisgICBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICBrZXJtaXQgICB4bW9kZW0gICB5bW9kZW0gICB5bW9kZW0tZyAgIHptb2RlbQorICBDLUtlcm1pdD4gc2VuZCAvcHJvdG9jb2w6azxUQUI+ZXJtaXQKKworICAgSWYgYSBzd2l0Y2ggdGFrZXMgYSB2YWx1ZSBhbmQgeW91IHVzZSBjb21wbGV0aW9uIG9uIGl0LCBhIGNvbG9uICg6KSBpcworICAgcHJpbnRlZCBhdCB0aGUgZW5kIG9mIGl0cyBuYW1lIHRvIGluZGljYXRlIHRoaXMuIElmIGl0IGRvZXMgbm90IHRha2UgYQorICAgdmFsdWUsIGEgc3BhY2UgaXMgcHJpbnRlZC4KKworICAgQWxzbywgaWYgeW91IHR5cGUgPyBpbiBhIHN3aXRjaCBmaWVsZCwgc3dpdGNoZXMgdGhhdCB0YWtlIHZhbHVlcyBhcmUKKyAgIHNob3duIHdpdGggYSB0cmFpbGluZyBjb2xvbjsgdGhvc2UgdGhhdCBkb24ndCB0YWtlIHZhbHVlcyBhcmUgc2hvd24KKyAgIHdpdGhvdXQgb25lLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMS41LjIuIE9yZGVyIGFuZCBFZmZlY3Qgb2YgU3dpdGNoZXMKKworICAgVGhlIG9yZGVyIG9mIHN3aXRjaGVzIHNob3VsZCBub3QgbWF0dGVyLCBleGNlcHQgdGhhdCB0aGV5IGFyZQorICAgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCwgc28gaWYgeW91IGdpdmUgdHdvIHN3aXRjaGVzIHdpdGgKKyAgIG9wcG9zaXRlIGVmZmVjdHMsIHRoZSByaWdodG1vc3Qgb25lIGlzIHVzZWQ6CisKKyAgc2VuZCAvdGV4dCAvYmluYXJ5IG9vZmEuemlwICAgICAgICAgICAgICAgIDsgU2VuZHMgb29mYS56aXAgaW4gYmluYXJ5IG1vZGUuCisKKyAgIExpa2Ugb3RoZXIgY29tbWFuZCBmaWVsZHMsIHN3aXRjaGVzIGhhdmUgbm8gZWZmZWN0IHdoYXRzb2V2ZXIgdW50aWwKKyAgIHRoZSBjb21tYW5kIGlzIGVudGVyZWQgKGJ5IHByZXNzaW5nIHRoZSBSZXR1cm4gb3IgRW50ZXIga2V5KS4gRXZlbgorICAgdGhlbiwgc3dpdGNoZXMgYWZmZWN0IG9ubHkgdGhlIGNvbW1hbmQgd2l0aCB3aGljaCB0aGV5IGFyZSBpbmNsdWRlZDsKKyAgIHRoZXkgZG8gbm90IGhhdmUgZ2xvYmFsIGVmZmVjdCBvciBzaWRlIGVmZmVjdHMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAxLjUuMy4gRGlzdGluZ3Vpc2hpbmcgU3dpdGNoZXMgZnJvbSBPdGhlciBGaWVsZHMKKworICAgQWxsIHN3aXRjaGVzIGFyZSBvcHRpb25hbC4gQSBjb21tYW5kIHRoYXQgdXNlcyBzd2l0Y2hlcyBsZXRzIHlvdSBnaXZlCisgICBhbnkgbnVtYmVyIG9mIHRoZW0sIGluY2x1ZGluZyBub25lIGF0IGFsbC4gRXhhbXBsZToKKworICBzZW5kIC9iaW5hcnkgb29mYS56aXAKKyAgc2VuZCAvYmluIC9kZWxldGUgb29mYS56aXAKKyAgc2VuZCAvYmluIC9hcy1uYW1lOm11cGVlbi56aXAgb29mYS56aXAKKyAgc2VuZCBvb2ZhLnppcAorCisgICBCdXQgaG93IGRvZXMgS2VybWl0IGtub3cgd2hlbiB0aGUgZmlyc3QgIm5vbi1zd2l0Y2giIGlzIGdpdmVuPyBJdCBoYXMKKyAgIGJlZW4gdG9sZCB0byBsb29rIGZvciBib3RoIGEgc3dpdGNoIGFuZCBmb3Igc29tZXRoaW5nIGVsc2UsIHRoZSBkYXRhCisgICB0eXBlIG9mIHRoZSBuZXh0IGZpZWxkIChmaWxlbmFtZSwgbnVtYmVyLCBldGMpLiBJbiBtb3N0IGNhc2VzLCB0aGlzCisgICB3b3JrcyB3ZWxsLiBCdXQgY29uZmxpY3RzIGFyZSBub3QgaW1wb3NzaWJsZS4gU3VwcG9zZSwgZm9yIGV4YW1wbGUsIGluCisgICBVTklYIHRoZXJlIHdhcyBhIGZpbGUgbmFtZWQgInRleHQiIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LiBUaGUKKyAgIGNvbW1hbmQgdG8gc2VuZCBpdCB3b3VsZCBiZToKKworICBzZW5kIC90ZXh0CisKKyAgIEJ1dCBDLUtlcm1pdCB3b3VsZCB0aGluayB0aGlzIHdhcyB0aGUgIi90ZXh0IiBzd2l0Y2guIFRvIHJlc29sdmUgdGhlCisgICBjb25mbGljdCwgdXNlIGJyYWNlczoKKworICBzZW5kIHsvdGV4dH0KKworICAgb3Igb3RoZXIgY2lyY3VtbG9jdXRpb25zIHN1Y2ggYXMgInNlbmQgLy90ZXh0IiwgInNlbmQgLy4vdGV4dCIsIGV0Yy4KKworICAgVGhlIG9wcG9zaXRlIHByb2JsZW0gY2FuIG9jY3VyIGlmIHlvdSBnaXZlIGFuIGlsbGVnYWwgc3dpdGNoIHRoYXQKKyAgIGhhcHBlbnMgdG8gbWF0Y2ggYSBkaXJlY3RvcnkgbmFtZS4gRm9yIGV4YW1wbGU6CisKKyAgc2VuZCAvZiBvb2ZhLnR4dAorCisgICBUaGVyZSBpcyBubyAiL2YiIHN3aXRjaCAodGhlcmUgYXJlIHNldmVyYWwgc3dpdGNoZXMgdGhhdCBiZWdpbiB3aXRoCisgICAiL2YiLCBzbyAiL2YiIGlzIGFtYmlndW91cykuIE5vdyBzdXBwb3NlIHRoZXJlIGlzIGFuICJmIiBkaXJlY3RvcnkgaW4KKyAgIHRoZSByb290IGRpcmVjdG9yeTsgdGhlbiB0aGlzIGNvbW1hbmQgd291bGQgYmUgaW50ZXJwcmV0ZWQgYXM6CisKKyAgICAgU2VuZCBhbGwgdGhlIGZpbGVzIGluIHRoZSAiL2YiIGRpcmVjdG9yeSwgZ2l2aW5nIGVhY2ggb25lIGFuCisgICAgIGFzLW5hbWUgb2YgIm9vZmEudHh0Ii4KKworICAgVGhpcyBjb3VsZCBiZSBhIG1pc3Rha2UsIG9yIGl0IGNvdWxkIGJlIGV4YWN0bHkgd2hhdCB5b3UgaW50ZW5kZWQ7CisgICBDLUtlcm1pdCBoYXMgbm8gd2F5IG9mIHRlbGxpbmcgdGhlIGRpZmZlcmVuY2UuIFRvIGF2b2lkIHNpdHVhdGlvbnMKKyAgIGxpa2UgdGhpcywgc3BlbGwgc3dpdGNoZXMgb3V0IGluIGZ1bGwgdW50aWwgeW91IGFyZSBjb21mb3J0YWJsZSBlbm91Z2gKKyAgIHdpdGggdGhlbSB0byBrbm93IHRoZSBtaW5pbXVtIGFiYnJldmlhdGlvbiBmb3IgZWFjaCBvbmUuIEhpbnQ6IHVzZSA/CisgICBhbmQgY29tcGxldGlvbiB3aGlsZSB0eXBpbmcgc3dpdGNoZXMgdG8gb2J0YWluIHRoZSBuZWNlc3NhcnkgZmVlZGJhY2suCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAxLjUuNC4gU3RhbmRhcmQgRmlsZSBTZWxlY3Rpb24gU3dpdGNoZXMKKworICAgVGhlIGZvbGxvd2luZyBzd2l0Y2hlcyBhcmUgdXNlZCBvbiBkaWZmZXJlbnQgZmlsZS1vcmllbnRlZCBjb21tYW5kcworICAgKHN1Y2ggYXMgU0VORCwgRElSRUNUT1JZLCBERUxFVEUsIFBVUkdFKSB0byByZWZpbmUgdGhlIHNlbGVjdGlvbiBvZgorICAgZmlsZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gc3BlY2lmaWNhdGlvbi4KKworICAgL0FGVEVSOmRhdGUtdGltZQorICAgICAgICAgIFNlbGVjdCBvbmx5IHRob3NlIGZpbGVzIGhhdmluZyBhIGRhdGUtdGltZSBsYXRlciB0aGFuIHRoZSBvbmUKKyAgICAgICAgICBnaXZlbi4gU2VlIFszNTJdU2VjdGlvbiAxLjYgZm9yIGRhdGUtdGltZSBmb3JtYXRzLiBTeW5vbnltOgorICAgICAgICAgIC9TSU5DRS4KKworICAgL05PVC1BRlRFUjpkYXRlLXRpbWUKKyAgICAgICAgICBTZWxlY3Qgb25seSB0aG9zZSBmaWxlcyBoYXZpbmcgYSBkYXRlLXRpbWUgbm90IGxhdGVyIHRoYW4gKGkuZS4KKyAgICAgICAgICBlYXJsaWVyIG9yIGVxdWFsIHRvKSB0aGUgb25lIGdpdmVuLiBTeW5vbnltOiAvTk9ULVNJTkNFLgorCisgICAvQkVGT1JFOmRhdGUtdGltZQorICAgICAgICAgIFNlbGVjdCBvbmx5IHRob3NlIGZpbGVzIGhhdmluZyBhIGRhdGUtdGltZSBlYXJsaWVyIHRoYW4gdGhlIG9uZQorICAgICAgICAgIGdpdmVuLgorCisgICAvTk9ULUJFRk9SRTpkYXRlLXRpbWUKKyAgICAgICAgICBTZWxlY3Qgb25seSB0aG9zZSBmaWxlcyBoYXZpbmcgYSBkYXRlLXRpbWUgbm90IGVhcmxpZXIgdGhhbgorICAgICAgICAgIChpLmUuIGxhdGVyIG9yIGVxdWFsIHRvKSB0aGUgb25lIGdpdmVuLgorCisgICAvRE9URklMRVMKKyAgICAgICAgICBVTklYIGFuZCBPUy05IG9ubHk6IFRoZSBmaWxlc3BlYyBpcyBhbGxvd2VkIHRvIG1hdGNoIGZpbGVzCisgICAgICAgICAgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCAoZG90KSBwZXJpb2QuIE5vcm1hbGx5IHRoZXNlIGZpbGVzIGFyZQorICAgICAgICAgIG5vdCBzaG93bi4KKworICAgL05PRE9URklMRVMKKyAgICAgICAgICAoVU5JWCBhbmQgT1MtOSBvbmx5KSBEb24ndCBzaG93IGZpbGVzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGgKKyAgICAgICAgICBkb3QgKHBlcmlvZCkuIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIC9ET1RGSUxFUywgYW5kIGlzIHRoZQorICAgICAgICAgIGRlZmF1bHQuIE5vdGUgdGhhdCB3aGVuIGEgZGlyZWN0b3J5IG5hbWUgc3RhcnRzIHdpdGggYSBwZXJpb2QsCisgICAgICAgICAgdGhlIGRpcmVjdG9yeSBhbmQgKGluIHJlY3Vyc2l2ZSBvcGVyYXRpb25zKSBhbGwgaXRzCisgICAgICAgICAgc3ViZGlyZWN0b3JpZXMgYXJlIHNraXBwZWQuCisKKyAgIC9MQVJHRVItVEhBTjpudW1iZXIKKyAgICAgICAgICBPbmx5IHNlbGVjdCBmaWxlcyBsYXJnZXIgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorCisgICAvU01BTExFUi1USEFOOm51bWJlcgorICAgICAgICAgIE9ubHkgc2VsZWN0IGZpbGVzIHNtYWxsZXIgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorCisgICAvRVhDRVBUOnBhdHRlcm4KKyAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBhbnkgZmlsZXMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlIHBhdHRlcm4sIHdoaWNoCisgICAgICAgICAgY2FuIGJlIGEgcmVndWxhciBmaWxlbmFtZSwgb3IgbWF5IGNvbnRhaW4gIioiIGFuZC9vciAiPyIKKyAgICAgICAgICBtZXRhY2hhcmFjdGVycyAod2lsZGNhcmRzKSwgYXJlIG5vdCB0byBiZSBzZWxlY3RlZC4gRXhhbXBsZToKKworICBzZW5kIC9leGNlcHQ6Ki5sb2cgKi4qCisKKyAgICAgICAgICBzZW5kcyBhbGwgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGV4Y2VwdCB0aG9zZSB3aXRoIGEKKyAgICAgICAgICBmaWxldHlwZSBvZiAiLmxvZyIuIEFub3RoZXI6CisKKyAgc2VuZCAvZXhjZXB0Oioufip+ICouKgorCisgICAgICAgICAgc2VuZHMgYWxsIGZpbGVzIGV4Y2VwdCB0aGUgb25lcyB0aGF0IGxvb2sgbGlrZSBLZXJtaXQgb3IgRU1BQ1MKKyAgICAgICAgICBiYWNrdXAgZmlsZXMgKHN1Y2ggYXMgIm9vZmEudHh0Ln4xN34iKSAob2YgY291cnNlIHlvdSBjYW4gYWxzbworICAgICAgICAgIHVzZSB0aGUgL05PQkFDS1VQIHN3aXRjaCBmb3IgdGhpcykuCisKKyAgICAgICAgICBUaGUgcGF0dGVybiBtYXRjaGVyIGlzIHRoZSBzYW1lIG9uZSB1c2VkIGJ5IElGIE1BVENIIHN0cmluZworICAgICAgICAgIHBhdHRlcm4gKFszNTNdU2VjdGlvbiA3LjQpLCBzbyB5b3UgY2FuIHRlc3QgeW91ciBwYXR0ZXJucyB1c2luZworICAgICAgICAgIElGIE1BVENILiBJZiB5b3UgbmVlZCB0byBtYXRjaCBhIGxpdGVyYWwgKiBvciA/IChldGMpLCBwcmVjZWRlCisgICAgICAgICAgaXQgYnkgYSBiYWNrc2xhc2ggKFwpLiBJZiB0aGUgcGF0dGVybiBjb250YWlucyBhbnkgc3BhY2VzLCBpdAorICAgICAgICAgIG11c3QgYmUgZW5jbG9zZWQgaW4gYnJhY2VzOgorCisgIHNlbmQgL2V4Y2VwdDp7Rm9vIGJhcn0gKi4qCisKKyAgICAgICAgICBUaGUgcGF0dGVybiBjYW4gYWxzbyBiZSBhIGxpc3Qgb2YgdXAgdG8gOCBwYXR0ZXJucy4gSW4gdGhpcworICAgICAgICAgIGNhc2UsIHRoZSBlbnRpcmUgcGF0dGVybiBtdXN0IGJlIGVuY2xvc2VkIGluIGJyYWNlcywgYW5kIGVhY2gKKyAgICAgICAgICBzdWItcGF0dGVybiBtdXN0IGFsc28gYmUgZW5jbG9zZWQgaW4gYnJhY2VzOyB0aGlzIGVsaW1pbmF0ZXMKKyAgICAgICAgICB0aGUgbmVlZCBmb3IgZGVzaWduYXRpbmcgYSBzZXBhcmF0b3IgY2hhcmFjdGVyLCB3aGljaCBpcyBsaWtlbHkKKyAgICAgICAgICB0byBhbHNvIGJlIGEgbGVnYWwgZmlsZW5hbWUgY2hhcmFjdGVyIG9uIHNvbWUgcGxhdGZvcm0gb3IKKyAgICAgICAgICBvdGhlciwgYW5kIHRoZXJlZm9yZSBhIHNvdXJjZSBvZiBjb25mdXNpb24uIFlvdSBtYXkgaW5jbHVkZQorICAgICAgICAgIHNwYWNlcyBiZXR3ZWVuIHRoZSBzdWJwYXR0ZXJucyBidXQgdGhleSBhcmUgbm90IG5lY2Vzc2FyeS4gVGhlCisgICAgICAgICAgZm9sbG93aW5nIHR3byBjb21tYW5kcyBhcmUgZXF1aXZhbGVudDoKKworICBzZW5kIC9leGNlcHQ6e3tjayoub30ge2NrKi5jfX0gY2sqLj8KKyAgc2VuZCAvZXhjZXB0Ont7Y2sqLm99e2NrKi5jfX0gY2sqLj8KKworICAgICAgICAgIElmIGEgcGF0dGVybiBpcyB0byBpbmNsdWRlIGEgbGl0ZXJhbCBicmFjZSBjaGFyYWN0ZXIsIHByZWNlZGUKKyAgICAgICAgICBpdCB3aXRoICJcIi4gQWxzbyBub3RlIHRoZSBhcHBhcmVudCBjb25mbGljdCBvZiB0aGlzIGxpc3QKKyAgICAgICAgICBmb3JtYXQgYW5kIHRoZSBzdHJpbmctbGlzdCBmb3JtYXQgZGVzY3JpYmVkIGluIFszNTRdU2VjdGlvbgorICAgICAgICAgIDQuOS4xLiBJbiBjYXNlIHlvdSB3YW50IHRvIGluY2x1ZGUgYSB3aWxkY2FyZCBzdHJpbmctbGlzdCB3aXRoCisgICAgICAgICAgYnJhY2VzIG9uIGl0cyBvdXRlciBlbmRzIGFzIGFuIC9FWENFUFQ6IGFyZ3VtZW50LCBkbyBpdCBsaWtlCisgICAgICAgICAgdGhpczoKKworICBzZW5kIC9leGNlcHQ6e3t7Y2t1dXNyLmMsY2t1dXMyLmMsY2t1dXM2LmN9fX0gY2t1dXMqLmMKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDEuNS41LiBTZXR0aW5nIFByZWZlcmVuY2VzIGZvciBEaWZmZXJlbnQgQ29tbWFuZHMKKworICAgQ2VydGFpbiBvZnQtdXNlZCBjb21tYW5kcyBvZmZlciBsb3RzIG9mIHN3aXRjaGVzIGJlY2F1c2UgZGlmZmVyZW50CisgICBwZW9wbGUgaGF2ZSBkaWZmZXJlbnQgcmVxdWlyZW1lbnRzIG9yIHByZWZlcmVuY2VzLiBGb3IgZXhhbXBsZSwgc29tZQorICAgcGVvcGxlIHdhbnQgdG8gYmUgYWJsZSB0byBkZWxldGUgZmlsZXMgd2l0aG91dCBoYXZpbmcgdG8gd2F0Y2ggYSBsaXN0CisgICBvZiB0aGUgZGVsZXRlZCBmaWxlcyBzY3JvbGwgcGFzdCwgd2hpbGUgb3RoZXJzIHdhbnQgdG8gYmUgcHJvbXB0ZWQgZm9yCisgICBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBlYWNoIGZpbGUuIERpZmZlcmVudCBwZW9wbGUgcHJlZmVyIGRpZmZlcmVudAorICAgZGlyZWN0b3J5LWxpc3Rpbmcgc3R5bGVzLiBBbmQgc28gb24uIFN1Y2ggY29tbWFuZHMgY2FuIGJlIHRhaWxvcmVkCisgICB3aXRoIHRoZSBTRVQgT1BUSU9OUyBjb21tYW5kOgorCisgICBTRVQgT1BUSU9OUyBjb21tYW5kIFsgc3dpdGNoIFsgc3dpdGNoIFsgLi4uIF0gXSBdCisgICAgICAgICAgU2V0cyBlYWNoIHN3aXRjaCBhcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGdpdmVuIGNvbW1hbmQsCisgICAgICAgICAgcmVwbGFjaW5nIHRoZSAiZmFjdG9yeSBkZWZhdWx0Ii4gT2YgY291cnNlIHlvdSBjYW4gYWxzbworICAgICAgICAgIG92ZXJyaWRlIGFueSBkZWZhdWx0cyBlc3RhYmxpc2hlZCBieSB0aGUgU0VUIE9QVElPTlMgY29tbWFuZCBieQorICAgICAgICAgIGluY2x1ZGluZyB0aGUgcmVsZXZhbnQgc3dpdGNoZXMgaW4gdGhlIGFmZmVjdGVkIGNvbW1hbmQgYW55CisgICAgICAgICAgdGltZSB5b3UgaXNzdWUgaXQuCisKKyAgIFNIT1cgT1BUSU9OUworICAgICAgICAgIExpc3RzIHRoZSBjb21tYW5kcyB0aGF0IGFsbG93cyBvcHRpb24tc2V0dGluZywgYW5kIHRoZSBvcHRpb25zCisgICAgICAgICAgY3VycmVudGx5IGluIGVmZmVjdCwgaWYgYW55LCBmb3IgZWFjaC4gU3dpdGNoZXMgdGhhdCBoYXZlCisgICAgICAgICAgc3lub255bXMgYXJlIHNob3duIHVuZGVyIHRoZWlyIHByaW1hcnkgbmFtZTsgZm9yIGV4YW1wbGUuIC9MT0cKKyAgICAgICAgICBhbmQgL1ZFUkJPU0UgYXJlIHNob3duIGFzIC9MSVNULgorCisgICBDb21tYW5kcyBmb3Igd2hpY2ggb3B0aW9ucyBtYXkgYmUgc2V0IGluY2x1ZGUgRElSRUNUT1JZLCBERUxFVEUsCisgICBQVVJHRSwgYW5kIFRZUEUuIEV4YW1wbGVzOgorCisgIFNFVCBPUFRJT05TIERJUkVDVE9SWSAvUEFHRSAvTk9CQUNLVVAgL0hFQURJTkcgL1NPUlQ6REFURSAvUkVWRVJTRQorICBTRVQgT1BUSU9OUyBERUxFVEUgL0xJU1QgL05PSEVBRElORyAvTk9QQUdFIC9OT0FTSyAvTk9ET1RGSUxFUworICBTRVQgT1BUSU9OUyBUWVBFIC9QQUdFCisKKyAgIE5vdCBuZWNlc3NhcmlseSBhbGwgb2YgYSBjb21tYW5kJ3Mgc3dpdGNoZXMgY2FuIGJlIHNldCBhcyBvcHRpb25zLiBGb3IKKyAgIGV4YW1wbGUsIGZpbGUgc2VsZWN0aW9uIHN3aXRjaGVzLCBzaW5jZSB0aGVzZSB3b3VsZCBub3JtYWxseSBiZQorICAgZGlmZmVyZW50IGZvciBlYWNoIGNvbW1hbmQuCisKKyAgIFB1dCB0aGUgZGVzaXJlZCBTRVQgT1BUSU9OUyBjb21tYW5kcyBpbiB5b3VyIEMtS2VybWl0IGN1c3RvbWl6YXRpb24KKyAgIGZpbGUgZm9yIGVhY2ggY29tbWFuZCB3aG9zZSBkZWZhdWx0IHN3aXRjaGVzIHlvdSB3YW50IHRvIGNoYW5nZSBldmVyeQorICAgdGltZSB5b3UgcnVuIEMtS2VybWl0LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEuNi4gRGF0ZXMgYW5kIFRpbWVzCisKKyAgIFNvbWUgY29tbWFuZHMgYW5kIHN3aXRjaGVzIHRha2UgZGF0ZS10aW1lIHZhbHVlcywgc3VjaCBhczoKKworICBzZW5kIC9hZnRlcjp7OC1GZWItMjAwMCAxMDoyODowMX0KKworICAgVmFyaW91cyBkYXRlLXRpbWUgZm9ybWF0cyBhcmUgYWNjZXB0YWJsZS4gVGhlIHJ1bGVzIGZvciB0aGUgZGF0ZSBhcmU6CisKKyAgICAgKiBUaGUgeWVhciBtdXN0IGhhdmUgNCBkaWdpdHMuCisgICAgICogSWYgdGhlIHllYXIgY29tZXMgZmlyc3QsIHRoZSBzZWNvbmQgZmllbGQgaXMgdGhlIG1vbnRoLgorICAgICAqIFRoZSBkYXksIG1vbnRoLCBhbmQgeWVhciBtYXkgYmUgc2VwYXJhdGVkIGJ5IHNwYWNlcywgLywgLSwgb3IKKyAgICAgICB1bmRlcnNjb3JlLgorICAgICAqIFRoZSBtb250aCBtYXkgYmUgbnVtZXJpYyAoMSA9IEphbnVhcnkpIG9yIHNwZWxsZWQgb3V0IG9yCisgICAgICAgYWJicmV2aWF0ZWQgaW4gRW5nbGlzaC4KKworICAgSWYgdGhlIGRhdGUtdGltZSBzdHJpbmcgY29udGFpbnMgYW55IHNwYWNlcywgaXQgbXVzdCBiZSBlbmNsb3NlZCBpbgorICAgYnJhY2VzLiBFeGFtcGxlcyBvZiBsZWdhbCBkYXRlczoKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwcmV0YXRpb246CisgIDIwMDAtRmViLTggICAgICAgICAgICAgICAgOCBGZWJydWFyeSAyMDAwCisgIHsyMDAwIEZlYiA4fSAgICAgICAgICAgICAgOCBGZWJydWFyeSAyMDAwCisgIDIwMDAvRmViLzggICAgICAgICAgICAgICAgOCBGZWJydWFyeSAyMDAwCisgIDIwMDBfRmViXzggICAgICAgICAgICAgICAgOCBGZWJydWFyeSAyMDAwCisgIDIwMDAtMi04ICAgICAgICAgICAgICAgICAgOCBGZWJydWFyeSAyMDAwCisgIDIwMDAtMDItMDggICAgICAgICAgICAgICAgOCBGZWJydWFyeSAyMDAwCisgIDgtRmViLTIwMDAgICAgICAgICAgICAgICAgOCBGZWJydWFyeSAyMDAwCisgIDA4LUZlYi0yMDAwICAgICAgICAgICAgICAgOCBGZWJydWFyeSAyMDAwCisgIDEyLzI1LzIwMDAgICAgICAgICAgICAgICAgMjUgRGVjZW1iZXIgMjAwMAorICAyNS8xMi8yMDAwICAgICAgICAgICAgICAgIDI1IERlY2VtYmVyIDIwMDAKKworICAgVGhlIGxhc3QgdHdvIGV4YW1wbGVzIHNob3cgdGhhdCB3aGVuIHRoZSB5ZWFyIGNvbWVzIGxhc3QsIGFuZCB0aGUKKyAgIG1vbnRoIGlzIGdpdmVuIG51bWVyaWNhbGx5LCB0aGUgb3JkZXIgb2YgdGhlIGRheSBhbmQgbW9udGggZG9lc24ndAorICAgbWF0dGVyIGFzIGxvbmcgYXMgdGhlIGRheSBpcyAxMyBvciBncmVhdGVyIChtbS9kZC95eXl5IGlzIGNvbW1vbmx5CisgICB1c2VkIGluIHRoZSBVU0EsIHdoZXJlYXMgZGQvbW0veXl5eSBpcyB0aGUgbm9ybSBpbiBFdXJvcGUpLiBIb3dldmVyOgorCisgIDA4LzAyLzIwMDAgICAgICAgICAgICAgICAgSXMgYW1iaWd1b3VzIGFuZCB0aGVyZWZvcmUgbm90IGFjY2VwdGVkLgorCisgICBJZiBhIGRhdGUgaXMgZ2l2ZW4sIHRoZSB0aW1lIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAwMDowMDowMC4gSWYKKyAgIHRoZSB0aW1lIGlzIGdpdmVuIHdpdGggYSBkYXRlLCBpdCBtdXN0IGZvbGxvdyB0aGUgZGF0ZSwgc2VwYXJhdGVkIGJ5CisgICBzcGFjZSwgLywgLSwgb3IgdW5kZXJzY29yZSwgYW5kIHdpdGggaG91cnMsIG1pbnV0ZXMsIGFuZCBzZWNvbmRzCisgICBzZXBhcmF0ZWQgYnkgY29sb24gKDopLiBFeGFtcGxlOgorCisgIDIwMDAtRmViLTggMTA6Mjg6MDEgICAgICAgUmVwcmVzZW50cyA4IEZlYnJ1YXJ5IDIwMDAsIDEwOjI4OjAxYW0KKworICAgSWYgYSBkYXRlIGlzIG5vdCBnaXZlbiwgdGhlIGN1cnJlbnQgZGF0ZSBpcyB1c2VkIGFuZCBhIHRpbWUgaXMKKyAgIHJlcXVpcmVkLgorCisgICBUaW1lIGZvcm1hdCBpcyBoaDptbTpzcyBvciBoaDptbSBvciBoaCBpbiAyNC1ob3VyIGZvcm1hdCwgb3IgZm9sbG93ZWQKKyAgIGJ5ICJhbSIgb3IgInBtIiAob3IgIkFNIiBvciAiUE0iKSB0byBpbmRpY2F0ZSBtb3JuaW5nIG9yIGFmdGVybm9vbi4KKyAgIEV4YW1wbGVzIG9mIHRpbWVzIHRoYXQgYXJlIGFjY2VwdGFibGU6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVycHJldGF0aW9uOgorICAzOjIzOjU2ICAgICAgICAgICAgICAgICAgICAzOjIzOjU2YW0KKyAgMzoyMzo1NmFtICAgICAgICAgICAgICAgICAgMzoyMzo1NmFtCisgIDM6MjM6NTZwbSAgICAgICAgICAgICAgICAgIDM6MjM6NTZwbSA9IDE1OjIzOjU2CisgMTU6MjM6NTYgICAgICAgICAgICAgICAgICAgIDM6MjM6NTZwbSA9IDE1OjIzOjU2CisgIDM6MjNwbSAgICAgICAgICAgICAgICAgICAgIDM6MjM6MDBwbSA9IDE1OjIzOjAwCisgIDM6MjNQTSAgICAgICAgICAgICAgICAgICAgIDM6MjM6MDBwbSA9IDE1OjIzOjAwCisgIDNwbSAgICAgICAgICAgICAgICAgICAgICAgIDM6MDA6MDBwbSA9IDE1OjAwOjAwCisKKyAgIEV4YW1wbGVzIG9mIGxlZ2FsIGRhdGUtdGltZXM6CisKKyAgc2VuZCAvYWZ0ZXI6ezggRmViIDIwMDAgMTA6Mjg6MDF9CisgIHNlbmQgL2FmdGVyOjhfRmViXzIwMDBfMTA6Mjg6MDEKKyAgc2VuZCAvYWZ0ZXI6OC1GZWItMjAwMC8xMDoyODowMQorICBzZW5kIC9hZnRlcjoyMDAwLzAyLzA4LzEwOjI4OjAxCisgIHNlbmQgL2FmdGVyOjIwMDAvMDIvMDhfMTA6Mjg6MDEKKyAgc2VuZCAvYWZ0ZXI6MjAwMC8wMi8wOF8xMDoyODowMWFtCisgIHNlbmQgL2FmdGVyOjIwMDAvMDIvMDhfMTA6Mjg6MDFwbQorICBzZW5kIC9hZnRlcjoyMDAwLzAyLzA4XzEwOjI4cG0KKyAgc2VuZCAvYWZ0ZXI6MjAwMC8wMi8wOF8xMHBtCisgIHNlbmQgL2FmdGVyOjEwOjAwOjAwcG0KKyAgc2VuZCAvYWZ0ZXI6MTA6MDBwbQorICBzZW5kIC9hZnRlcjoxMHBtCisgIHNlbmQgL2FmdGVyOjIyCisKKyAgIEZpbmFsbHksIHRoZXJlIGlzIGEgc3BlY2lhbCBhbGwtbnVtZXJpYyBmb3JtYXQgeW91IGNhbiB1c2U6CisKKyAgeXl5eW1tZGQgaGg6bW06c3MKKworICAgRm9yIGV4YW1wbGU6CisKKyAgMjAwMDAyMDggMTA6Mjg6MDEKKworICAgVGhpcyBpcyBLZXJtaXQncyBzdGFuZGFyZCBkYXRlLXRpbWUgZm9ybWF0IChiYXNlZCBvbiBJU08gODYwMSksIGFuZCBpcworICAgYWNjZXB0ZWQgKGFtb25nIG90aGVyIGZvcm1hdHMpIGJ5IGFueSBjb21tYW5kIG9yIHN3aXRjaCB0aGF0IHJlcXVpcmVzCisgICBhIGRhdGUtdGltZSwgYW5kIGlzIG91dHB1dCBieSBhbnkgZnVuY3Rpb24gd2hvc2UgcmVzdWx0IGlzIGEgY2FsZW5kYXIKKyAgIGRhdGUtdGltZS4KKworICAgVGhlcmUgYXJlIG5vIG9wdGlvbmFsIHBhcnRzIHRvIHRoaXMgZm9ybWF0IGFuZCBpdCBtdXN0IGJlIGV4YWN0bHkgMTcKKyAgIGNoYXJhY3RlcnMgbG9uZywgcHVuY3R1YXRlZCBhcyBzaG93biAoZXhjZXB0IHlvdSBjYW4gc3Vic3RpdHV0ZQorICAgdW5kZXJzY29yZSBmb3Igc3BhY2UgaW4gY29udGV4dHMgd2hlcmUgYSBzaW5nbGUgIndvcmQiIGlzIHJlcXVpcmVkKS4KKyAgIFRoZSB0aW1lIGlzIGluIDI0LWhvdXIgZm9ybWF0ICgyMzowMDowMCBpcyAxMTowMHBtKS4gVGhpcyBpcyB0aGUKKyAgIGZvcm1hdCByZXR1cm5lZCBieSBcZmRhdGUoZmlsZW5hbWUpLCBzbyB5b3UgY2FuIGFsc28gdXNlIGNvbnN0cnVjdGlvbnMKKyAgIGxpa2UgdGhpczoKKworICBzZW5kIC9hZnRlcjpcZmRhdGUob29mYS50eHQpCisKKyAgIHdoaWNoIG1lYW5zICJhbGwgZmlsZXMgbmV3ZXIgdGhhbiBvb2ZhLnR4dCIuCisKKyAgIEJlc2lkZXMgZXhwbGljaXQgZGF0ZXMsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGFueSBvZiB0aGUgZm9sbG93aW5nCisgICBzaG9ydGN1dHM6CisKKyAgIFRPREFZCisgICAgICAgICAgU3RhbmRzIGZvciB0aGUgY3VycmVudCBkYXRlIGF0IDAwOjAwOjAwLgorCisgICBUT0RBWSAxMjozNDo1NgorICAgICAgICAgIFN0YW5kcyBmb3IgdGhlIGN1cnJlbnQgZGF0ZSBhdCB0aGUgZ2l2ZW4gdGltZS4KKworICAgWUVTVEVSREFZCisgICAgICAgICAgU3RhbmRzIGZvciB5ZXN0ZXJkYXkncyBkYXRlIGF0IDAwOjAwOjAwLiBBIHRpbWUgbWF5IGFsc28gYmUKKyAgICAgICAgICBnaXZlbi4KKworICAgVE9NT1JST1cKKyAgICAgICAgICBTdGFuZHMgZm9yIHRvbW9ycm93J3MgZGF0ZSBhdCAwMDowMDowMC4gQSB0aW1lIG1heSBhbHNvIGJlCisgICAgICAgICAgZ2l2ZW4uCisKKyAgICsgbnVtYmVyIHsgREFZUywgV0VFS1MsIE1PTlRIUywgWUVBUlMgfSBbIHRpbWUgXQorICAgICAgICAgIElzIHJlcGxhY2VkIGJ5IHRoZSBmdXR1cmUgZGF0ZSBpbmRpY2F0ZWQsIHJlbGF0aXZlIHRvIHRoZQorICAgICAgICAgIGN1cnJlbnQgZGF0ZS4gSWYgdGhlIHRpbWUgaXMgb21pdHRlZCwgMDA6MDA6MDAgaXMgdXNlZC4KKyAgICAgICAgICBFeGFtcGxlczogKzNkYXlzLCArMndlZWtzLCArMXllYXIsICszN21vbnRocy4KKworICAgLSBudW1iZXIgeyBEQVlTLCBXRUVLUywgTU9OVEhTLCBZRUFSUyB9IFsgdGltZSBdCisKKyAgICAgICAgICBJcyByZXBsYWNlZCBieSB0aGUgcGFzdCBkYXRlIGluZGljYXRlZCwgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQKKyAgICAgICAgICBkYXRlLiBJZiB0aGUgdGltZSBpcyBvbWl0dGVkLCAwMDowMDowMCBpcyB1c2VkLgorCisgICBUaGUgdGltZSBjYW4gYmUgc2VwYXJhdGVkIGZyb20gdGhlIGRhdGUgc2hvcnRjdXQgYnkgYW55IG9mIHRoZSBzYW1lCisgICBzZXBhcmF0b3JzIHRoYXQgYXJlIGFsbG93ZWQgZm9yIGV4cGxpY2l0IGRhdGUtdGltZXM6IHNwYWNlLCBoeXBoZW4sCisgICBzbGFzaCwgcGVyaW9kLCBvciB1bmRlcnNjb3JlLiBJbiBzd2l0Y2hlcyBhbmQgb3RoZXIgc3BhY2UtZGVsaW1pdGVkCisgICBmaWVsZHMsIHVzZSBub24tc3BhY2VzIHRvIHNlcGFyYXRlIGRhdGUvdGltZSBmaWVsZHMsIG9yIGVuY2xvc2UgdGhlCisgICBkYXRlLXRpbWUgaW4gYnJhY2VzLCBlLmcuOgorCisgIHB1cmdlIC9iZWZvcmU6LTRkYXlzXzEyOjAwOjAwCisgIHB1cmdlIC9iZWZvcmU6ey0gNCBkYXlzIDEyOjAwOjAwfQorCisgICBPZiBjb3Vyc2UgeW91IGNhbiBhbHNvIHVzZSB2YXJpYWJsZXM6CisKKyAgZGVmaW5lIFwlbiA0MworICBwdXJnZSAvYmVmb3JlOi1cJW5kYXlzXzEyOjAwOjAwCisKKyAgIFNob3J0Y3V0IG5hbWVzIGNhbiBiZSBhYmJyZXZpYXRlZCB0byBhbnkgbGVuZ3RoIHRoYXQgc3RpbGwKKyAgIGRpc3Rpbmd1aXNoZXMgdGhlbSBmcm9tIGFueSBvdGhlciBuYW1lIHRoYXQgY2FuIGFwcGVhciBpbiB0aGUgc2FtZQorICAgY29udGV4dCwgZS5nLiAiVE9EIiBmb3IgdG9kYXksICJZIiBmb3IgeWVzdGVyZGF5LiBBbHNvLCB0aGUgc3BlY2lhbAorICAgYWJicmV2aWF0aW9uICJ3a3MiIGlzIGFjY2VwdGVkIGZvciBXRUVLUywgYW5kICJ5cnMiIGZvciAiWUVBUlMiLgorCisgICAoVG8gc2VlIGhvdyB0byBzcGVjaWZ5IGRhdGVzIHJlbGF0aXZlIHRvIGEgc3BlY2lmaWMgZGF0ZSwgcmF0aGVyIHRoYW4KKyAgIHRoZSBjdXJyZW50IG9uZSwgc2VlIHRoZSBbMzU1XVxmbWpkKCkgZnVuY3Rpb24gZGVzY3JpcHRpb24gYmVsb3cuKQorCisgICBZb3UgY2FuIGNoZWNrIGRhdGUgZm9ybWF0cyB3aXRoIHRoZSBEQVRFIGNvbW1hbmQuIERBVEUgYnkgaXRzZWxmCisgICBwcmludHMgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBpbiBzdGFuZGFyZCBmb3JtYXQ6IHl5eXltbWRkCisgICBoaDptbTpzcy4gREFURSBmb2xsb3dlZCBieSBhIGRhdGUgYW5kL29yIHRpbWUgKGluY2x1ZGluZyBzaG9ydGN1dHMpCisgICBjb252ZXJ0cyBpdCB0byBzdGFuZGFyZCBmb3JtYXQgaWYgaXQgY2FuIHVuZGVyc3RhbmQgaXQsIG90aGVyd2lzZSBpdAorICAgcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UuCisKKyAgIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZGVhbCB3aXRoIGRhdGVzIGFuZCB0aW1lczsgYW55CisgICBmdW5jdGlvbiBhcmd1bWVudCBkZXNpZ25hdGVkIGFzICJkYXRlLXRpbWUiIGNhbiBiZSBpbiBhbnkgb2YgdGhlCisgICBmb3JtYXRzIGRlc2NyaWJlZCBhYm92ZS4KKworICAgXHYoZGF5KQorICAgICAgICAgIFRoZSBmaXJzdCB0aHJlZSBsZXR0ZXJzIG9mIHRoZSBFbmdsaXNoIHdvcmQgZm9yIHRoZSBjdXJyZW50IGRheQorICAgICAgICAgIG9mIHRoZSB3ZWVrLCBlLmcuICJXZWQiLgorCisgICBcZmRheShkYXRlLXRpbWUpCisgICAgICAgICAgVGhlIGZpcnN0IHRocmVlIGxldHRlcnMgb2YgdGhlIEVuZ2xpc2ggd29yZCBmb3IgZGF5IG9mIHRoZSB3ZWVrCisgICAgICAgICAgb2YgdGhlIGdpdmVuIGRhdGUuIElmIGEgdGltZSBpcyBpbmNsdWRlZCwgaXQgaXMgaWdub3JlZC4KKyAgICAgICAgICBFeGFtcGxlOiBcZmRheSg4IEZlYiAxOTg4KSA9ICJNb24iLgorCisgICBcdihuZGF5KQorICAgICAgICAgIFRoZSBudW1lcmljIGRheSBvZiB0aGUgd2VlazogMCA9IFN1bmRheSwgMSA9IE1vbmRheSwgLi4uLCA2ID0KKyAgICAgICAgICBTYXR1cmRheS4KKworICAgXGZuZGF5KGRhdGUtdGltZSkKKyAgICAgICAgICBUaGUgbnVtZXJpYyBkYXkgb2YgdGhlIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLiBJZiBhIHRpbWUgaXMKKyAgICAgICAgICBpbmNsdWRlZCwgaXQgaXMgaWdub3JlZC4gRXhhbXBsZTogXGZuZGF5KDggRmViIDE5ODgpID0gIjEiLgorCisgICBcdihkYXRlKQorICAgICAgICAgIFRoZSBjdXJyZW50IGRhdGUgYXMgZGQgbW1tIHl5eXksIGUuZy4gIjA4IEZlYiAyMDAwIiAoYXMgaW4gdGhpcworICAgICAgICAgIGV4YW1wbGUsIGEgbGVhZGluZyB6ZXJvIGlzIHN1cHBsaWVkIGZvciBkYXktb2YtbW9udGggbGVzcyB0aGFuCisgICAgICAgICAgMTApLgorCisgICBcdihuZGF0ZSkKKyAgICAgICAgICBUaGUgY3VycmVudCBkYXRlIGluIG51bWVyaWMgZm9ybWF0OiB5eXl5bW1kZCwgZS5nLiAiMjAwMDAyMDgiLgorCisgICBcdih0aW1lKQorICAgICAgICAgIFRoZSBjdXJyZW50IHRpbWUgYXMgaGg6bW06c3MsIGUuZy4gIjE1OjI3OjE0Ii4KKworICAgXGZ0aW1lKHRpbWUpCisgICAgICAgICAgVGhlIGdpdmVuIGZyZWUtZm9ybWF0IGRhdGUgYW5kL29yIHRpbWUgKGUuZy4gIjNwbSIpIHJldHVybnMgdGhlCisgICAgICAgICAgdGltZSAod2l0aG91dCB0aGUgZGF0ZSkgY29udmVydGVkIHRvIGhoOm1tOnNzIDI0LWhvdXIgZm9ybWF0LAorICAgICAgICAgIGUuZy4gIjE1OjAwOjAwIiAodGhlIGRhdGUsIGlmIGdpdmVuLCBpcyBpZ25vcmVkKS4KKworICAgXHYobnRpbWUpCisgICAgICAgICAgVGhlIGN1cnJlbnQgdGltZSBhcyBzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LCBlLmcuICI1NTYzNCIuCisKKyAgIFx2KHRmdGltZSkKKyAgICAgICAgICBUaGUgZWxhcHNlZCB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCBmaWxlLXRyYW5zZmVyIG9wZXJhdGlvbiBpbgorICAgICAgICAgIHNlY29uZHMuCisKKyAgIFx2KGludGltZSkKKyAgICAgICAgICBUaGUgZWxhcHNlZCB0aW1lIGZvciB0aGUgbW9zdCByZWNlbnQgSU5QVVQgY29tbWFuZCB0byBjb21wbGV0ZSwKKyAgICAgICAgICBpbiBtaWxsaXNlY29uZHMuCisKKyAgIFxmbnRpbWUodGltZSkKKyAgICAgICAgICBUaGUgZ2l2ZW4gZnJlZS1mb3JtYXQgZGF0ZSBhbmQvb3IgdGltZSBpcyBjb252ZXJ0ZWQgdG8gc2Vjb25kcworICAgICAgICAgIHNpbmNlIG1pZG5pZ2h0ICh0aGUgZGF0ZSwgaWYgZ2l2ZW4sIGlzIGlnbm9yZWQpLiBUaGlzIGZ1bmN0aW9uCisgICAgICAgICAgcmVwbGFjZXMgXGZ0b2Qyc2VjcygpLCB3aGljaCBpcyBub3cgYSBzeW5vbnltIGZvciBcZm50aW1lKCkuCisgICAgICAgICAgVW5saWtlIFxmdG9kMnNlY3MoKSwgXGZudGltZSgpIGFsbG93cyBhIGRhdGUgdG8gYmUgaW5jbHVkZWQsCisgICAgICAgICAgYW5kIGl0IGFsbG93cyB0aGUgdGltZSB0byBiZSBpbiBmcmVlIGZvcm1hdCAobGlrZSAzcG0pLCBhbmQgaXQKKyAgICAgICAgICBhbGxvd3MgdGhlIGFtb3VudCBvZiB0aW1lIHRvIGJlIG1vcmUgdGhhbiAyNCBob3Vycy4gRS5nLgorICAgICAgICAgIFxmbnRpbWUoNDg6MDA6MDApID0gMTcyODAwLiBFeGFtcGxlIG9mIHVzZToKKworICBzZXQgYWxhcm0gXGZudGltZSg0ODowMDowMCkgOyBzZXQgYWxhcm0gNDggaG91cnMgZnJvbSBub3cuCisKKyAgIFxmbjJ0aW1lKHNlY29uZHMpCisgICAgICAgICAgVGhlIGdpdmVuIG51bWJlciBvZiBzZWNvbmRzIGlzIGNvbnZlcnRlZCB0byBoaDptbTpzcyBmb3JtYXQuCisKKyAgIFxmZGF0ZShmaWxlbmFtZSkKKyAgICAgICAgICBSZXR1cm5zIHRoZSBtb2RpZmljYXRpb24gZGF0ZS10aW1lIG9mIHRoZSBnaXZlbiBmaWxlIGluCisgICAgICAgICAgc3RhbmRhcmQgZm9ybWF0OiB5eXl5bW1kZCBoaDptbTpzcy4KKworICAgXGZjdnRkYXRlKGRhdGUtdGltZSkKKyAgICAgICAgICBDb252ZXJ0cyBhIGZyZWUtZm9ybWF0IGRhdGUgYW5kL29yIHRpbWUgdG8gS2VybWl0IHN0YW5kYXJkCisgICAgICAgICAgZm9ybWF0OiB5eXl5bW1kZCBoaDptbTpzcy4gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybnMgdGhlCisgICAgICAgICAgY3VycmVudCBkYXRlLXRpbWUgaW4gc3RhbmRhcmQgZm9ybWF0LiBJZiBhIGRhdGUgaXMgZ2l2ZW4gYnV0IG5vCisgICAgICAgICAgdGltZSwgdGhlIGNvbnZlcnRlZCBkYXRlIGlzIHJldHVybmVkIHdpdGhvdXQgYSB0aW1lLiBJZiBhIHRpbWUKKyAgICAgICAgICBpcyBnaXZlbiB3aXRoIG5vIGRhdGUsIHRoZSBjdXJyZW50IGRhdGUgaXMgc3VwcGxpZWQuIEV4YW1wbGVzOgorCisgIFxmY3Z0ZGF0ZSg0IEp1bCAyMDAwIDI6MjE6MTdwbSkgPSAyMDAwMDcwNCAxNDoyMToxNworICBcZmN2dGRhdGUoKSA9IDIwMDAwNzA0IDE0OjIxOjE3IChvbiA0IEp1bCAyMDAwIGF0IDI6MjE6MTdwbSkuCisgIFxmY3Z0ZCg0IEp1bCAyMDAwKSA9IDIwMDAwNzA0CisgIFxmY3Z0ZCg2cG0pID0gMjAwMDA3MDQgMTg6MDA6MDAgKG9uIDQgSnVsIDIwMDAgYXQgNjowMHBtKS4KKworICAgXGZkYXlvZnllYXIoZGF0ZS10aW1lKQorICAgXGZkb3koZGF0ZS10aW1lKQorICAgICAgICAgIENvbnZlcnRzIGEgZnJlZS1mb3JtYXQgZGF0ZSBhbmQvb3IgdGltZSB0byB5eXl5ZGRkLCB3aGVyZSBkZGQKKyAgICAgICAgICBpcyB0aGUgMy1kaWdpdCBkYXkgb2YgdGhlIHllYXIsIGFuZCAxIEphbnVhcnkgaXMgRGF5IDEuIElmIGEKKyAgICAgICAgICB0aW1lIGlzIGluY2x1ZGVkIHdpdGggdGhlIGRhdGUsIGl0IGlzIHJldHVybmVkIGluIHN0YW5kYXJkCisgICAgICAgICAgZm9ybWF0LiBJZiBhIGRhdGUgaXMgaW5jbHVkZWQgYnV0IG5vIHRpbWUsIHRoZSBkYXRlIGlzIHJldHVybmVkCisgICAgICAgICAgd2l0aG91dCBhIHRpbWUuIElmIGEgdGltZSBpcyBnaXZlbiB3aXRoIG5vIGRhdGUsIHRoZSB0aW1lIGlzCisgICAgICAgICAgY29udmVydGVkIGFuZCB0aGUgY3VycmVudCBkYXRlIGlzIHN1cHBsaWVkLiBJZiBubyBhcmd1bWVudCBpcworICAgICAgICAgIGdpdmVuLCB0aGUgY3VycmVudCBkYXRlLXRpbWUgaXMgcmV0dXJuZWQuIFN5bm9ueW06IFxmZG95KCkuCisgICAgICAgICAgRXhhbXBsZXM6CisKKyAgXGZkZGF5b2Z5ZWFyKDQgSnVsIDIwMDAgMjoyMToxN3BtKSA9IDIwMDAxODUgMTQ6MjE6MTcKKyAgXGZkb3koKSA9IDIwMDAxODUgMTQ6MjE6MTcgKG9uIDQgSnVsIDIwMDAgYXQgMjoyMToxN3BtKS4KKyAgXGZkb3koNCBKdWwgMjAwMCkgPSAyMDAwMTg1CisgIFxmZG95KDZwbSkgPSAyMDAwMTg1IDE4OjAwOjAwIChvbiA0IEp1bCAyMDAwIGF0IDY6MDBwbSkuCisKKyAgIE5vdGU6IFRoZSB5eXl5ZGRkIGRheS1vZi15ZWFyIGZvcm1hdCBpcyBvZnRlbiBlcnJvbmVvdXNseSByZWZlcnJlZCB0bworICAgYXMgYSBKdWxpYW4gZGF0ZS4gSG93ZXZlciwgYSB0cnVlIEp1bGlhbiBkYXRlIGlzIGEgc2ltcGxlIGNvdW50aW5nCisgICBudW1iZXIsIHRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSBhIGNlcnRhaW4gZml4ZWQgZGF5IGluIHRoZSBwYXN0LgorICAgWzM1Nl1TZWUgXGZtamQoKSBiZWxvdy4KKworICAgXGZkb3kyZGF0ZShkYXRlLXRpbWUpCisgICAgICAgICAgQ29udmVydHMgYSBkYXRlIG9yIGRhdGUtdGltZSBpbiBkYXktb2YteWVhciBmb3JtYXQgdG8gYQorICAgICAgICAgIHN0YW5kYXJkIGZvcm1hdCBkYXRlLiBBIHl5eXlkZGQtZm9ybWF0IGRhdGUgbXVzdCBiZSBzdXBwbGllZDsKKyAgICAgICAgICB0aW1lIGlzIG9wdGlvbmFsLiBUaGUgZ2l2ZW4gZGF0ZSBpcyBjb252ZXJ0ZWQgdG8geXl5eW1tZGQKKyAgICAgICAgICBmb3JtYXQuIElmIGEgdGltZSBpcyBnaXZlbiwgaXQgaXMgY29udmVydGVkIHRvIDI0LWhvdXIgZm9ybWF0LgorICAgICAgICAgIEV4YW1wbGVzOgorCisgIFxmZG95MmRhdGUoMjAwMDE4NSkgPSAyMDAwMDcwNAorICBcZmRveTIoMjAwMDE4NSAzcG0pID0gMjAwMDA3MDQgMTU6MDA6MDAKKworICAgXGZtamQoZGF0ZS10aW1lKQorICAgICAgICAgIENvbnZlcnRzIGZyZWUtZm9ybWF0IGRhdGUgYW5kL29yIHRpbWUgdG8gYSBNb2RpZmllZCBKdWxpYW4gRGF0ZQorICAgICAgICAgIChNSkQpLCB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgMTcgTm92IDE4NTggMDA6MDA6MDAuIElmIGEgdGltZQorICAgICAgICAgIGlzIGdpdmVuLCBpdCBpcyBpZ25vcmVkLiBFeGFtcGxlczoKKworICBcZm1qZCg0IEp1bCAyMDAwKSA9IDUwOTk4CisgIFxmbWpkKDE3IE5vdiAxODU4KSA9IDAKKyAgXGZtamQoMTYgTm92IDE4NTgpID0gLTEKKworICAgXGZtamQyZGF0ZShtamQpCisgICAgICAgICAgQ29udmVydHMgYW4gTUpEIChpbnRlZ2VyKSB0byBzdGFuZGFyZCBkYXRlIGZvcm1hdCwgeXl5eW1tZGQ6CisKKyAgXGZtamQyKDUwOTk4KSA9IDQgSnVsIDE5OTgKKyAgXGZtamQyKDApID0gMTcgTm92IDE4NTgKKyAgXGZtamQyKC0xKSA9IDE2IE5vdiAxODU4CisgIFxmbWpkMigtMzY1KSA9IDE3IE5vdiAxODU3CisKKyAgIE1KRHMgYXJlIG5vcm1hbCBpbnRlZ2VycyBhbmQsIHVubGlrZSBET1lzLCBtYXkgYmUgYWRkZWQsIHN1YnRyYWN0ZWQsCisgICBldGMsIHdpdGggZWFjaCBvdGhlciBvciB3aXRoIG90aGVyIGludGVnZXJzLCB0byBvYnRhaW4gbWVhbmluZ2Z1bAorICAgcmVzdWx0cy4gRm9yIGV4YW1wbGUsIHRvIGZpbmQgb3V0IHRoZSBkYXRlIDIxMiBkYXlzIGFnbzoKKworICBlY2hvIFxmbWpkMmRhdGUoXGZtamQoKS0yMTIpCisKKyAgIENvbnN0cnVjdGlvbnMgc3VjaCBhcyB0aGlzIGNhbiBiZSB1c2VkIGluIGFueSBjb21tYW5kIHdoZXJlIGEKKyAgIGRhdGUtdGltZSBpcyByZXF1aXJlZCwgZS5nLjoKKworICBzZW5kIC9hZnRlcjpcZm1qZDJkYXRlKFxmbWpkKCktMjEyKQorCisgICB0byBzZW5kIGFsbCBmaWxlcyB0aGF0IGFyZSBub3Qgb2xkZXIgdGhhbiAyMTIgZGF5cyAodGhpcyBpcyBlcXVpdmFsZW50CisgICB0byAic2VuZCAvYWZ0ZXI6LTIxMmRheXMiKS4KKworICAgTUpEcyBhbHNvIGhhdmUgb3RoZXIgcmVndWxhcml0aWVzIG5vdCBleGhpYml0ZWQgYnkgb3RoZXIgZGF0ZSBmb3JtYXRzLgorICAgRm9yIGV4YW1wbGUsIFxmbW9kdWx1cyhcZm1qZChhbnktZGF0ZSksNykgZ2l2ZXMgdGhlIGRheSBvZiB0aGUgd2VlaworICAgZm9yIGFueSBkYXRlICh3aGVyZSA0PVN1biwgNT1Nb24sIC4uLiwgMz1TYXQpLiAoSG93ZXZlciwgaXQgaXMgZWFzaWVyCisgICB0byB1c2UgXGZuZGF5KCkgZm9yIHRoaXMgcHVycG9zZSwgYW5kIGl0IGdpdmVzIHRoZSBtb3JlIGNvbnZlbnRpb25hbAorICAgcmVzdWx0IG9mIDA9U3VuLCAxPU1vbiwgLi4uLCA2PVNhdCkuCisKKyAgIE5vdGUgdGhhdCBpZiBNSkRzIGFyZSB0byBiZSBjb21wYXJlZCwgdGhleSBtdXN0IGJlIGNvbXBhcmVkCisgICBudW1lcmljYWxseSAoSUYgPCwgPSwgPikgYW5kIG5vdCBsZXhpY2FsbHkgKElGIExMVCwgRVFVQUwsIExHVCksCisgICB3aGVyZWFzIERPWXMgbXVzdCBiZSBjb21wYXJlZCBsZXhpY2FsbHkgaWYgdGhleSBpbmNsdWRlIGEgdGltZSAod2hpY2gKKyAgIGNvbnRhaW5zICI6IiBjaGFyYWN0ZXJzKTsgaG93ZXZlciwgaWYgRE9ZcyBkbyBub3QgaW5jbHVkZSBhIHRpbWUsIHRoZXkKKyAgIG1heSBhbHNvIGJlIGNvbXBhcmVkIG51bWVyaWNhbGx5LgorCisgICBJbiBhbnkgY2FzZSwgbGV4aWNhbCBjb21wYXJpc29uIG9mIERPWXMgYWx3YXlzIHByb2R1Y2VzIHRoZQorICAgYXBwcm9wcmlhdGUgcmVzdWx0LCBhcyBkb2VzIG51bWVyaWMgY29tcGFyaXNvbiBvZiBNSkRzLgorCisgICBUaGUgc2FtZSBjb21tZW50cyBhcHBseSB0byBzb3J0aW5nLiBBbHNvIG5vdGUgdGhhdCBET1lzIGFyZSBmaXhlZAorICAgbGVuZ3RoLCBidXQgTUpEcyBjYW4gdmFyeSBpbiBsZW5ndGguIEhvd2V2ZXIsIGFsbCBNSkRzIGJldHdlZW4gMyBBcHJpbAorICAgMTg4NiBhbmQgMzAgQXVnIDIxMzIgYXJlIDUgZGVjaW1hbCBkaWdpdHMgbG9uZy4gKE1KRHMgYmVjb21lIDYgZGlnaXRzCisgICBsb25nIG9uIDMxIEF1ZyAyMTMyLCBhbmQgNyBkaWdpdHMgbG9uZyBvbiAxMyBPY3QgNDU5NikuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMS43LiBQYXJ0aWFsIENvbXBsZXRpb24gb2YgS2V5d29yZHMKKworICAgUGFydGlhbCBjb21wbGV0aW9uIG9mIGtleXdvcmRzIHdhcyBhZGRlZCBpbiBDLUtlcm1pdCA3LjAuIEluIHByaW9yCisgICB2ZXJzaW9ucywgaWYgY29tcGxldGlvbiB3YXMgYXR0ZW1wdGVkIChieSBwcmVzc2luZyB0aGUgRXNjIG9yIFRhYiBrZXkpCisgICBvbiBhIHN0cmluZyB0aGF0IG1hdGNoZWQgZGlmZmVyZW50IGtleXdvcmRzLCB5b3UnZCBqdXN0IGdldCBhIGJlZXAuCisgICBOb3cgS2VybWl0IGNvbXBsZXRlcyB1cCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIHdoZXJlIHRoZSBwb3NzaWJseQorICAgbWF0Y2hpbmcga2V5d29yZHMgZGlmZmVyIGFuZCB0aGVuIGJlZXBzLiBGb3IgZXhhbXBsZToKKworICBDLUtlcm1pdD4gc2VuZCAvbjxUYWI+CisKKyAgIHdoaWNoIG1hdGNoZXMgL05PVC1CRUZPUkUgYW5kIC9OT1QtQUZURVIsIG5vdyBjb21wbGV0ZXMgdXAgdG8gdGhlCisgICBkYXNoOgorCisgIEMtS2VybWl0PiBzZW5kIC9uPFRhYj5vdC08QmVlcD4KKworICAgUGFydGlhbCBjb21wbGV0aW9uIHdvcmtzIGZvciBmaWxlbmFtZXMgdG9vIChhcyBpdCBoYXMgZm9yIHNvbWUgeWVhcnMpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEuOC4gQ29tbWFuZCBSZWNhbGwKKworICAgQy1LZXJtaXQgaGFzIGhhZCBhIGNvbW1hbmQgaGlzdG9yeSBidWZmZXIgZm9yIHNvbWUgdGltZSwgd2hpY2ggY291bGQKKyAgIGJlIHNjcm9sbGVkIGludGVyYWN0aXZlbHkgdXNpbmcgY29udHJvbCBjaGFyYWN0ZXJzIG9yIChpbiBLZXJtaXQgOTUKKyAgIG9ubHkpIGFycm93IGtleXMuIFZlcnNpb24gNy4wIGFkZHMgYSBSRURPIGNvbW1hbmQgdGhhdCBhbGxvd3MgdGhlIG1vc3QKKyAgIHJlY2VudCBjb21tYW5kIG1hdGNoaW5nIGEgZ2l2ZW4gcGF0dGVybiB0byBiZSByZS1leGVjdXRlZDoKKworICAgeyBSRURPLCBSUiwgXiB9IFsgcGF0dGVybiBdCisgICAgICAgICAgU2VhcmNoIHRoZSBjb21tYW5kIGhpc3RvcnkgbGlzdCBmb3IgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQKKyAgICAgICAgICB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHBhdHRlcm4sIGFuZCBpZiBvbmUgaXMgZm91bmQsIGV4ZWN1dGUgaXQKKyAgICAgICAgICBhZ2Fpbi4KKworICAgVGhlIHBhdHRlcm4gY2FuIGJlIGEgc2ltcGxlIHN0cmluZyAobGlrZSAic2VuZCIpLCBpbiB3aGljaCBjYXNlIHRoZQorICAgbGFzdCBTRU5EIGNvbW1hbmQgaXMgcmUtZXhlY3V0ZWQuIE9yIGl0IGNhbiBjb250YWluIHdpbGRjYXJkCisgICBjaGFyYWN0ZXJzICIqIiBhbmQvb3IgIj8iLCB3aGljaCBtYXRjaCBhbnkgc3RyaW5nIGFuZCBhbnkgc2luZ2xlCisgICBjaGFyYWN0ZXIsIHJlc3BlY3RpdmVseSAobm90ZSB0aGF0ICI/IiBtdXN0IGJlIHByZWNlZGVkIGJ5IGJhY2tzbGFzaAorICAgdG8gb3ZlcnJpZGUgaXRzIG5vcm1hbCBmdW5jdGlvbiBvZiBnaXZpbmcgaGVscCksIGFuZCBpbiBtb3N0IEMtS2VybWl0CisgICB2ZXJzaW9ucyBtYXkgYWxzbyBpbmNsdWRlIFtdIGNoYXJhY3RlciBsaXN0cyBhbmQge30gc3RyaW5nIGxpc3RzIChzZWUKKyAgIFszNTddU2VjdGlvbiA0LjkpLgorCisgICBUaGUgbWF0Y2ggd29ya3MgYnkgYXBwZW5kaW5nICIqIiB0byB0aGUgZW5kIG9mIHRoZSBnaXZlbiBwYXR0ZXJuIChpZgorICAgeW91IGRpZG4ndCBwdXQgb25lIHRoZXJlIHlvdXJzZWxmKS4gVGh1cyAicmVkbyAqb29mYSIgYmVjb21lcyAicmVkbworICAgKm9vZmEqIiBhbmQgdGhlcmVmb3JlIG1hdGNoZXMgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQgdGhhdCBjb250YWlucworICAgIm9vZmEiIGFueXdoZXJlIHdpdGhpbiB0aGUgY29tbWFuZC4gSWYgeW91IHdhbnQgdG8gaW5oaWJpdCB0aGUKKyAgIGFwcGxpY2F0aW9uIG9mIHRoZSB0cmFpbGluZyAiKiIsIGUuZy4gdG8gZm9yY2UgbWF0Y2hpbmcgYSBzdHJpbmcgYXQKKyAgIHRoZSBlbmQgb2YgYSBjb21tYW5kLCBlbmNsb3NlIHRoZSBwYXR0ZXJuIGluIGJyYWNlczoKKworICByZWRvIHsqb29mYX0KKworICAgbWF0Y2hlcyB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCB0aGF0IGVuZHMgd2l0aCAib29mYSIuCisKKyAgIFJFRE8gY29tbWFuZHMgdGhlbXNlbHZlcyBhcmUgbm90IGVudGVyZWQgaW50byB0aGUgY29tbWFuZCBoaXN0b3J5CisgICBsaXN0LiBJZiBubyBwYXR0ZXJuIGlzIGdpdmVuLCB0aGUgcHJldmlvdXMgKG5vbi1SRURPKSBjb21tYW5kIGlzCisgICByZS1leGVjdXRlZC4gVGhlIFJFRE9uZSBjb21tYW5kIGlzIHJlaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiB0aGUKKyAgIGNvbW1hbmQgaGlzdG9yeSBidWZmZXIsIHNvIHRoZSBjb21tYW5kIHNjcm9sbGJhY2sgY2hhcmFjdGVyIChDdHJsLVAsCisgICBDdHJsLUIsIG9yIFVwYXJyb3cpIGNhbiByZXRyaWV2ZSBpdC4KKworICAgRXhhbXBsZXM6CisKKyAgQy1LZXJtaXQ+IGVjaG8gZm9vCisgIGZvbworICBDLUtlcm1pdD4gc2hvdyBhbGFybQorICAobm8gYWxhcm0gc2V0KQorICBDLUtlcm1pdD4gZWNobyBibGFoCisgIGJsYWgKKyAgQy1LZXJtaXQ+IHJlZG8gICAgICAgICAgOyBNb3N0IHJlY2VudCBjb21tYW5kCisgIGJsYWgKKyAgQy1LZXJtaXQ+IHJlZG8gcyAgICAgICAgOyBNb3N0IHJlY2VudCBjb21tYW5kIHN0YXJ0aW5nIHdpdGggInMiCisgIChubyBhbGFybSBzZXQpCisgIEMtS2VybWl0PiByZWRvIGVjaG8gZiAgIDsgTW9zdCByZWNlbnQgY29tbWFuZCBzdGFydGluZyB3aXRoICJlY2hvIGYiCisgIGZvbworICBDLUtlcm1pdD4gcmVkbyAqZm9vICAgICA7IE1vc3QgcmVjZW50IGNvbW1hbmQgdGhhdCBoYXMgImZvbyIgaW4gaXQKKyAgZm9vCisgIEMtS2VybWl0PiA8Q3RybC1QPiAgICAgIDsgU2Nyb2xsIGJhY2sKKyAgQy1LZXJtaXQ+IGVjaG8gZm9vICAgICAgOyBUaGUgUkVET25lIGNvbW1hbmQgaXMgdGhlcmUKKyAgQy1LZXJtaXQ+IHJlZG8geypmb299ICAgOyBNb3N0IHJlY2VudCBjb21tYW5kIHRoYXQgZW5kcyB3aXRoICJmb28iCisgIGZvbworICBDLUtlcm1pdD4KKworICAgU2luY2UgUkVETywgUkVESUFMLCBhbmQgUkVESVJFQ1QgYWxsIHN0YXJ0IHRoZSBzYW1lIHdheSwgYW5kIFJFRCBpcworICAgdGhlIGRlc2lnbmF0ZWQgbm9uLXVuaXF1ZSBhYmJyZXZpYXRpb24gZm9yIFJFRElBTCwgUkVETyBtdXN0IGJlCisgICBzcGVsbGVkIG91dCBpbiBmdWxsLiBGb3IgY29udmVuaWVuY2UsIFJSIGlzIGluY2x1ZGVkIGFzIGFuIGludmlzaWJsZQorICAgZWFzeS10by10eXBlIHN5bm9ueW0gZm9yIFJFRE8uIFlvdSBjYW4gYWxzbyB1c2UgdGhlICJeIiBjaGFyYWN0ZXIgZm9yCisgICB0aGlzOgorCisgIEMtS2VybWl0PiBeICAgICAgICAgICAgIDsgTW9zdCByZWNlbnQgY29tbWFuZAorICBDLUtlcm1pdD4gXiBzICAgICAgICAgICA7IE1vc3QgcmVjZW50IGNvbW1hbmQgc3RhcnRpbmcgd2l0aCAicyIKKyAgQy1LZXJtaXQ+IF5zICAgICAgICAgICAgOyBEaXR0byAoc3BhY2Ugbm90IHJlcXVpcmVkIGFmdGVyICJeIikuCisgIEMtS2VybWl0PiBeKmZvbyAgICAgICAgIDsgTW9zdCByZWNlbnQgY29tbWFuZCB0aGF0IGhhcyAiZm9vIiBpbiBpdC4KKyAgQy1LZXJtaXQ+IF57KmZvb30gICAgICAgOyBNb3N0IHJlY2VudCBjb21tYW5kIGVuZHMgd2l0aCAiZm9vIi4KKworICAgVW5saWtlIHRoZSBtYW51YWwgY29tbWFuZC1oaXN0b3J5LXNjcm9sbGluZyBrZXlzLCB0aGUgUkVETyBjb21tYW5kIGNhbgorICAgYmUgdXNlZCBpbiBhIHNjcmlwdCwgYnV0IGl0J3Mgbm90IHJlY29tbWVuZGVkIChzaW5jZSB0aGUgY29tbWFuZCB0byBiZQorICAgUkVET25lIG1pZ2h0IG5vdCBiZSBmb3VuZCwgc28gaWYgdGhlIFJFRE8gY29tbWFuZCBmYWlscywgeW91IGNhbid0CisgICB0ZWxsIHdoZXRoZXIgaXQgd2FzIGJlY2F1c2UgUkVETyBmYWlsZWQgdG8gZmluZCB0aGUgcmVxdWVzdGVkIGNvbW1hbmQsCisgICBvciBiZWNhdXNlIHRoZSBjb21tYW5kIHdhcyBmb3VuZCBidXQgaXQgZmFpbGVkKS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxLjkuIEVYSVQgTWVzc2FnZXMKKworICAgVGhlIEVYSVQgYW5kIFFVSVQgY29tbWFuZHMgbm93IGFjY2VwdCBhbiBvcHRpb25hbCBtZXNzYWdlIHRvIGJlCisgICBwcmludGVkLiBUaGlzIG1ha2VzIHRoZSBzeW50YXggb2YgRVhJVCBhbmQgUVVJVCBqdXN0IGxpa2UgRU5EIGFuZAorICAgU1RPUDoKKworICAgeyBFWElULCBRVUlULCBFTkQsIFNUT1AgfSBbIHN0YXR1cy1jb2RlIFsgbWVzc2FnZSBdIF0KKworICAgd2hlcmUgc3RhdHVzLWNvZGUgaXMgYSBudW1iZXIgKDAgaW5kaWNhdGluZyBzdWNjZXNzLCBub256ZXJvCisgICBpbmRpY2F0aW5nIGZhaWx1cmUpLiBUaGlzIGlzIGhhbmR5IGluIHNjcmlwdHMgdGhhdCBhcmUgbmV2ZXIgc3VwcG9zZWQKKyAgIHRvIGVudGVyIGludGVyYWN0aXZlIG1vZGU6CisKKyAgZGlhbCA3NjU0MzIxCisgIGlmIGZhaWwgZXhpdCAxIENhbid0IG1ha2UgY29ubmVjdGlvbiAtIHRyeSBhZ2FpbiBsYXRlci4KKworICAgUHJldmlvdXNseSB0aGlzIGNvdWxkIG9ubHkgYmUgZG9uZSBpbiB0d28gc3RlcHM6CisKKyAgZGlhbCA3NjU0MzIxCisgIHhpZiBmYWlsIHsgZWNobyBDYW4ndCBtYWtlIGNvbm5lY3Rpb24gLSB0cnkgYWdhaW4gbGF0ZXIsIGV4aXQgMSB9CisKKyAgIEEgc3RhdHVzIGNvZGUgbXVzdCBiZSBpbmNsdWRlZCBpbiBvcmRlciB0byBzcGVjaWZ5IGEgbWVzc2FnZS4gSW4gdGhlCisgICBjYXNlIG9mIEVYSVQgYW5kIFFVSVQsIHRoZSBkZWZhdWx0IHN0YXR1cyBjb2RlIGlzIGNvbnRhaW5lZCBpbiB0aGUKKyAgIHZhcmlhYmxlIFx2KGV4aXRzdGF0dXMpLCBhbmQgaXMgc2V0IGF1dG9tYXRpY2FsbHkgYnkgdmFyaW91cyBldmVudHMKKyAgIChmaWxlIHRyYW5zZmVyIGZhaWx1cmVzLCBldGM7IGl0IGNhbiBhbHNvIGJlIHNldCBleHBsaWNpdGx5IHdpdGggdGhlCisgICBTRVQgRVhJVCBTVEFUVVMgY29tbWFuZCkuIElmIHlvdSB3YW50IHRvIGdpdmUgYW4gRVhJVCBvciBRVUlUIGNvbW1hbmQKKyAgIHdpdGggYSBtZXNzYWdlLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgZXhpdCBzdGF0dXMgZnJvbSB3aGF0IGl0CisgICBub3JtYWxseSB3b3VsZCBoYXZlIGJlZW4sIHVzZSB0aGUgXHYoZXhpdHN0YXR1cykgdmFyaWFibGUsIGUuZy46CisKKyAgIGV4aXQgXHYoZXhpc3RhdHVzKSBHb29kYnllIGZyb20gXHYoY21kZmlsZSkuCisKKyAgIFRoZSBFWElUIHN0YXR1cyBpcyByZXR1cm5lZCB0byB0aGUgc3lzdGVtIHNoZWxsIG9yIHdoYXRldmVyIG90aGVyCisgICBwcm9jZXNzIGludm9rZWQgQy1LZXJtaXQsIGUuZy4gaW4gVU5JWDoKKworICBDLUtlcm1pdD4gZXhpdCA5NyBieWUgYnllCisgIGJ5ZSBieWUKKyAgJCBlY2hvICQ/CisgIDk3CisgICQKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxLjEwLiBNYW5hZ2luZyBLZXlib2FyZCBJbnRlcnJ1cHRpb25zCisKKyAgIFdoZW4gQy1LZXJtaXQgaXMgaW4gY29tbWFuZCBvciBmaWxlLXRyYW5zZmVyIG1vZGUgKGFzIG9wcG9zZWQgdG8KKyAgIENPTk5FQ1QgbW9kZSksIGl0IGNhbiBiZSBpbnRlcnJ1cHRlZCB3aXRoIEN0cmwtQy4gVmVyc2lvbiA3LjAgYWRkcyB0aGUKKyAgIGFiaWxpdHkgdG8gZGlzYXJtIHRoZSBDdHJsLUMgaW50ZXJydXB0OgorCisgICBTRVQgQ09NTUFORCBJTlRFUlJVUFQgeyBPTiwgT0ZGIH0KKyAgICAgICAgICBDT01NQU5EIElOVEVSUlVQVCBpcyBPTiBieSBkZWZhdWx0LCBtZWFuaW5nIHRoZSBDdHJsLUMgY2FuIGJlCisgICAgICAgICAgdXNlZCB0byBpbnRlcnJ1cHQgYSBjb21tYW5kIG9yIGEgZmlsZSB0cmFuc2ZlciBpbiBwcm9ncmVzcy4gVXNlCisgICAgICAgICAgT0ZGIHRvIGRpc2FibGUgdGhlc2UgaW50ZXJydXB0aW9ucywgYW5kIHVzZSBpdCB3aXRoIGdyZWF0CisgICAgICAgICAgY2F1dGlvbiBmb3Igb2J2aW91cyByZWFzb25zLgorCisgICBTRVQgVFJBTlNGRVIgSU5URVJSVVBUIHsgT04sIE9GRiB9CisgICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIGtleWJvYXJkIGludGVycnVwdGlvbiBvZiBmaWxlCisgICAgICAgICAgdHJhbnNmZXIgd2hlbiBDLUtlcm1pdCBpcyBpbiBsb2NhbCBtb2RlLCBvciB0byByZS1lbmFibGUgaXQKKyAgICAgICAgICBhZnRlciBpdCBoYXMgYmVlbiBkaXNhYmxlZC4gVGhpcyBhcHBsaWVzIHRvIHRoZSBYLCBaLCBFLCBhbmQKKyAgICAgICAgICBzaW1pbGFyIGtleXMgYXMgd2VsbCBhcyB0byB0aGUgc3lzdGVtIGludGVycnVwdCBjaGFyYWN0ZXIsCisgICAgICAgICAgdXN1YWxseSBDdHJsLUMuIFRoaXMgaXMgZGlzdGluY3QgZnJvbSBTRVQgVFJBTlNGRVIKKyAgICAgICAgICBDQU5DRUxMQVRJT04sIHdoaWNoIHRlbGxzIHdoZXRoZXIgcGFja2V0IG1vZGUgY2FuIGJlIGV4aXRlZCBieQorICAgICAgICAgIHNlbmRpbmcgYSBzcGVjaWFsIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuCisKKyAgIFNldmVyYWwgb3RoZXIgY29tbWFuZHMgY2FuIGJlIGludGVycnVwdGVkIGJ5IHByZXNzaW5nIGFueSBrZXkgd2hpbGUKKyAgIHRoZXkgYXJlIGFjdGl2ZS4gVmVyc2lvbiA3LjAgYWRkcyB0aGUgYWJpbGl0eSB0byBkaXNhYmxlIHRoaXMgZm9ybSBvZgorICAgaW50ZXJydXB0aW9uIGFsc286CisKKyAgIFNFVCBJTlBVVCBDQU5DRUxMQVRJT04geyBPTiwgT0ZGIH0KKyAgICAgICAgICBXaGV0aGVyIGFuIElOUFVUIGNvbW1hbmQgaW4gcHJvZ3Jlc3MgY2FuIGJlIGludGVycnVwdGVkIGJ5CisgICAgICAgICAgcHJlc3NpbmcgYSBrZXkuIE5vcm1hbGx5IE9OLiBTZXR0aW5nIElOUFVUIENBTkNFTExBVElPTiBPRkYKKyAgICAgICAgICBtYWtlcyBJTlBVVCBjb21tYW5kcyB1bmludGVycnVwdGlibGUgZXhjZXB0IGJ5IEN0cmwtQyAodW5sZXNzCisgICAgICAgICAgQ09NTUFORCBJTlRFUlJVUFRJT04gaXMgYWxzbyBPRkYpLgorCisgICBTRVQgU0xFRVAgQ0FOQ0VMTEFUSU9OIHsgT04sIE9GRiB9CisgICAgICAgICAgV2hldGhlciBhIFNMRUVQLCBQQVVTRSwgb3IgV0FJVCBjb21tYW5kIGluIHByb2dyZXNzIGNhbiBiZQorICAgICAgICAgIGludGVycnVwdGVkIGJ5IHByZXNzaW5nIGEga2V5LiBOb3JtYWxseSBPTi4gU2V0dGluZyBTTEVFUAorICAgICAgICAgIENBTkNFTExBVElPTiBPRkYgbWFrZXMgdGhlc2UgY29tbWFuZHMgdW5pbnRlcnJ1cHRpYmxlIGV4Y2VwdCBieQorICAgICAgICAgIEN0cmwtQyAodW5sZXNzIENPTU1BTkQgSU5URVJSVVBUSU9OIGlzIGFsc28gT0ZGKS4gU3lub255bXM6IFNFVAorICAgICAgICAgIFBBVVNFIENBTkNFTExBVElPTiwgU0VUIFdBSVQgQ0FOQ0VMTEFUSU9OLgorCisgICBTbyB0byBtYWtlIGNlcnRhaW4gYSBzY3JpcHQgaXMgbm90IGludGVycnVwdGlibGUgYnkgdGhlIHVzZXIsIGluY2x1ZGUKKyAgIHRoZXNlIGNvbW1hbmRzOgorCisgIFNFVCBUUkFOU0ZFUiBJTlRFUlJVUFQgT0ZGCisgIFNFVCBTTEVFUCBDQU5DRUxMQVRJT04gT0ZGCisgIFNFVCBJTlBVVCBDQU5DRUxMQVRJT04gT0ZGCisgIFNFVCBDT01NQU5EIElOVEVSUlVQVElPTiBPRkYKKworICAgTWFrZSBzdXJlIHRvIHR1cm4gdGhlbSBiYWNrIG9uIGFmdGVyd2FyZHMgaWYgaW50ZXJydXB0aW9uIGlzIHRvIGJlCisgICByZS1lbmFibGVkLgorCisgICBXaGVuIGEgUEFVU0UsIFNMRUVQLCBXQUlULCBvciBJTlBVVCBjb21tYW5kIGlzIGludGVycnVwdGVkIGZyb20gdGhlCisgICBrZXlib2FyZCwgdGhlIG5ldyB2YXJpYWJsZSBcdihrYmNoYXIpIGNvbnRhaW5zIGEgY29weSBvZiB0aGUgKGZpcnN0KQorICAgY2hhcmFjdGVyIHRoYXQgd2FzIHR5cGVkIGFuZCBjYXVzZWQgdGhlIGludGVycnVwdGlvbiwgcHJvdmlkZWQgaXQgd2FzCisgICBub3QgdGhlIGNvbW1hbmQgaW50ZXJydXB0IGNoYXJhY3RlciAodXN1YWxseSBDdHJsLUMpLiBJZiB0aGVzZQorICAgY29tbWFuZHMgY29tcGxldGUgc3VjY2Vzc2Z1bGx5IG9yIHRpbWUgb3V0IHdpdGhvdXQgYSBrZXlib2FyZAorICAgaW50ZXJydXB0aW9uLCB0aGUgXHYoa2JjaGFyKSB2YXJpYWJsZSBpcyBlbXB0eS4KKworICAgVGhlIFx2KGtiY2hhcikgdmFyaWFibGUgKGxpa2UgYW55IG90aGVyIHZhcmlhYmxlKSBjYW4gYmUgdGVzdGVkIHdpdGg6CisKKyAgaWYgZGVmaW5lZCBcdihrYmNoYXIpIGNvbW1hbmQKKworICAgVGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQgaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBlbXB0eS4KKworICAgVGhlIFx2KGtiY2hhcikgdmFyaWFibGUgY2FuIGJlIHJlc2V0IHdpdGggV0FJVCAwIChQQVVTRSAwLCBTTEVFUCAwLAorICAgZXRjKS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxLjExLiBUYW1pbmcgVGhlIFdpbGQgQmFja3NsYXNoIC0tIFBhcnQgRGV1eAorCisgICBbMzU4XVVzaW5nIEMtS2VybWl0LCAybmQgRWRpdGlvbiwgY29udGFpbnMgYSBicmllZiBzZWN0aW9uLCAiVGFtaW5nCisgICB0aGUgV2lsZCBCYWNrc2xhc2giLCBvbiBwYWdlIDQ4LCB3aGljaCBzdWJzZXF1ZW50IGV4cGVyaWVuY2UgaGFzIHNob3duCisgICB0byBiZSBpbmFkZXF1YXRlIGZvciBLZXJtaXQgdXNlcnMgaW50ZW50IG9uIHdyaXRpbmcgc2NyaXB0cyB0aGF0IGRlYWwKKyAgIHdpdGggV2luZG93cywgRE9TLCBhbmQgT1MvMiBmaWxlbmFtZXMsIGluIHdoaWNoIGJhY2tzbGFzaCAoXCkgaXMgdXNlZAorICAgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IuIFRoaXMgc2VjdGlvbiBmaWxscyBpbiB0aGUgYmxhbmtzLgorCisgICAgMS4xMS4xLiBCYWNrZ3JvdW5kCisKKyAgIFRoZSBLZXJtaXQgY29tbWFuZCBsYW5ndWFnZSBzaGFyZXMgYSBjZXJ0YWluIHVuYXZvaWRhYmxlIGJ1dCBhbm5veWluZworICAgY2hhcmFjdGVyaXN0aWMgd2l0aCBtb3N0IG90aGVyIGNvbW1hbmQgbGFuZ3VhZ2VzIHRoYXQgYXJlIGNhcGFibGUgb2YKKyAgIHN0cmluZyByZXBsYWNlbWVudCwgbmFtZWx5IHRoZSBuZWNlc3NpdHkgdG8gInF1b3RlIiBjZXJ0YWluIGNoYXJhY3RlcnMKKyAgIHdoZW4geW91IHdhbnQgdGhlbSB0byBiZSB0YWtlbiBsaXRlcmFsbHkuIFRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUKKyAgIGZhY3RzIHRoYXQ6CisKKyAgICAxLiBPbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIG11c3QgYmUgc2V0IGFzaWRlIHRvIGRlbm90ZSByZXBsYWNlbWVudCwKKyAgICAgICByYXRoZXIgdGhhbiBhY3RpbmcgYXMgbGl0ZXJhbCB0ZXh0LgorICAgIDIuIFdlIGhhdmUgb25seSA5NiBwcmludGFibGUgY2hhcmFjdGVycyB0byB3b3JrIHdpdGggaW4gQVNDSUksIHdoaWNoCisgICAgICAgaXMgc3RpbGwgdGhlIG9ubHkgdW5pdmVyc2FsbHkgcG9ydGFibGUgY2hhcmFjdGVyIHNldC4KKyAgICAzLiBUaGVyZSBpcyBubyBzaW5nbGUgcHJpbnRhYmxlIGNoYXJhY3RlciB0aGF0IGlzIHVudXNlZCBldmVyeXdoZXJlLgorICAgIDQuIFZhcmlhYmxlcyBhcmUgbm90IHJlc3RyaWN0ZWQgdG8gY2VydGFpbiBjb250ZXh0cywgYXMgdGhleSBhcmUgaW4KKyAgICAgICBmb3JtYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGxpa2UgQyBhbmQgRm9ydHJhbiwgYnV0IGNhbiBhcHBlYXIKKyAgICAgICBhbnl3aGVyZSBhdCBhbGwgd2l0aGluIGEgY29tbWFuZCwgYW5kIHRoZXJlZm9yZSByZXF1aXJlIHNwZWNpYWwKKyAgICAgICBzeW50YXguCisKKyAgIFRodXMgdGhlcmUgY2FuIGJlIGNvbmZsaWN0cy4gVG8gaWxsdXN0cmF0ZSwgdGhlIHN0YW5kYXJkIFVOSVggc2hlbGwKKyAgIHVzZXMgZG9sbGFyIHNpZ24gKCQpIHRvIGludHJvZHVjZSB2YXJpYWJsZXMuIFNvIHRoZSBzaGVsbCBjb21tYW5kOgorCisgIGVjaG8gJFRFUk0KKworICAgZGlzcGxheXMgdGhlIHZhbHVlIG9mIHRoZSBURVJNIHZhcmlhYmxlLCBlLmcuIHZ0MzIwLiBCdXQgc3VwcG9zZSB5b3UKKyAgIHdhbnQgdG8gZGlzcGxheSBhIHJlYWwgZG9sbGFyIHNpZ246CisKKyAgZWNobyBUaGUgcHJpY2UgaXMgJDEwLjIwCisKKyAgIFRoaXMgY2F1c2VzIHRoZSBzaGVsbCB0byBldmFsdWF0ZSB0aGUgdmFyaWFibGUgIiQxIiwgd2hpY2ggbWlnaHQgb3IKKyAgIG1pZ2h0IG5vdCBleGlzdCwgYW5kIHN1YnN0aXR1dGUgaXRzIHZhbHVlLCBlLmcuOgorCisgIFRoZSBwcmljZSBpcyAwLjIwCisKKyAgIChpbiB0aGlzIGNhc2UgdGhlICQxIHZhcmlhYmxlIGhhZCBubyB2YWx1ZS4pIFRoaXMgaXMgcHJvYmFibHkgbm90IHdoYXQKKyAgIHlvdSB3YW50ZWQuIFRvIGZvcmNlIHRoZSBkb2xsYXIgc2lnbiB0byBiZSB0YWtlbiBsaXRlcmFsbHksIHlvdSBtdXN0CisgICBhcHBseSBhICJxdW90aW5nIHJ1bGUiLCBzdWNoIGFzICJwcmVjZWRlIGEgY2hhcmFjdGVyIGJ5IGJhY2tzbGFzaCAoXCkKKyAgIHRvIGZvcmNlIHRoZSBzaGVsbCB0byB0YWtlIHRoZSBjaGFyYWN0ZXIgbGl0ZXJhbGx5IjoKKworICBlY2hvIFRoZSBwcmljZSBpcyBcJDEwLjIwCisgIFRoZSBwcmljZSBpcyAkMTAuMjAKKworICAgQnV0IG5vdyBzdXBwb3NlIHlvdSB3YW50IHRoZSBiYWNrc2xhc2ggQU5EIHRoZSBkb2xsYXIgc2lnbiB0byBiZSB0YWtlbgorICAgbGl0ZXJhbGx5OgorCisgIGVjaG8gVGhlIHByaWNlIGlzIFxcJDEwLjIwCisKKyAgIFRoaXMgZG9lc24ndCB3b3JrLCBzaW5jZSB0aGUgZmlyc3QgYmFja3NsYXNoIHF1b3RlcyB0aGUgc2Vjb25kIG9uZSwKKyAgIHRoZXJlYnkgbGVhdmluZyB0aGUgZG9sbGFyIHNpZ24gdW5xdW90ZWQgYWdhaW46CisKKyAgVGhlIHByaWNlIGlzIFwwLjIwCisKKyAgIFF1b3RpbmcgdGhlIGRvbGxhciBzaWduIHJlcXVpcmVzIGFkZGl0aW9uIG9mIGEgdGhpcmQgYmFja3NsYXNoOgorCisgIGVjaG8gVGhlIHByaWNlIGlzIFxcXCQxMC4yMAorICBUaGUgcHJpY2UgaXMgXCQxMC4yMAorCisgICBUaGUgZmlyc3QgYmFja3NsYXNoIHF1b3RlcyB0aGUgc2Vjb25kIG9uZSwgYW5kIHRoZSB0aGlyZCBiYWNrc2xhc2gKKyAgIHF1b3RlcyB0aGUgZG9sbGFyIHNpZ24uCisKKyAgIEV2ZXJ5IGNvbW1hbmQgbGFuZ3VhZ2UgLS0gYWxsIFVOSVggc2hlbGxzLCBWTVMgRENMLCBET1MgQmF0Y2gsIEFPUy9WUworICAgQ0xJLCBldGMgZXRjIC0tIGhhcyBzaW1pbGFyIHJ1bGVzLiBVTklYIHNoZWxsIHJ1bGVzIGFyZSBwcm9iYWJseSB0aGUKKyAgIG1vc3QgY29tcGxpY2F0ZWQsIHNpbmNlIG1hbnkgcHJpbnRhYmxlIGNoYXJhY3RlcnMgLS0gbm90IGp1c3Qgb25lIC0tCisgICBhcmUgc3BlY2lhbCB0aGVyZTogZG9sbGFyIHNpZ24sIHNpbmdsZSBxdW90ZSwgZG91YmxlIHF1b3RlLCBiYWNrc2xhc2gsCisgICBhc3RlcmlzaywgYWNjZW50IGdyYXZlLCBudW1iZXIgc2lnbiwgYW1wZXJzYW5kLCBxdWVzdGlvbiBtYXJrLAorICAgcGFyZW50aGVzZXMsIGJyYWNrZXRzLCBicmFjZXMsIGV0YyAtLSBwcmFjdGljYWxseSBldmVyeQorICAgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXIgbmVlZHMgc29tZSBmb3JtIG9mIHF1b3RpbmcgaWYgaXQgaXMgdG8gYmUKKyAgIHRha2VuIGxpdGVyYWxseS4gQW5kIHRvIGFkZCB0byB0aGUgY29uZnVzaW9uLCB0aGUgVU5JWCBzaGVsbCBvZmZlcnMKKyAgIG1hbnkgZm9ybXMgb2YgcXVvdGluZywgYW5kIG1hbnkgYWx0ZXJuYXRpdmUgVU5JWCBzaGVsbHMgYXJlIGF2YWlsYWJsZSwKKyAgIGVhY2ggdXNpbmcgc2xpZ2h0bHkgZGlmZmVyZW50IHN5bnRheC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDEuMTEuMi4gS2VybWl0J3MgUXVvdGluZyBSdWxlcworCisgICBLZXJtaXQncyBiYXNpYyBxdW90aW5nIHJ1bGVzIGFyZSBzaW1wbGUgYnkgY29tcGFyaXNvbiAodGhlcmUgYXJlLCBvZgorICAgY291cnNlLCBhZGRpdGlvbmFsIHN5bnRheCByZXF1aXJlbWVudHMgZm9yIG1hY3JvIGRlZmluaXRpb25zLCBjb21tYW5kCisgICBibG9ja3MsIGZ1bmN0aW9uIGNhbGxzLCBldGMsIGJ1dCB0aGV5IGFyZSBub3QgcmVsZXZhbnQgaGVyZSkuCisKKyAgIFRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgc3BlY2lhbCBpbiBLZXJtaXQgY29tbWFuZHM6CisKKyAgIEJhY2tzbGFzaCAoXCkKKyAgICAgICAgICBJbnRyb2R1Y2VzIGEgdmFyaWFibGUsIG9yIHRoZSBudW1lcmljIHJlcHJlc2VudGF0aW9uIG9mIGEKKyAgICAgICAgICBzcGVjaWFsIGNoYXJhY3Rlciwgb3IgYSBmdW5jdGlvbiwgb3Igb3RoZXIgaXRlbSBmb3IKKyAgICAgICAgICBzdWJzdGl0dXRpb24uIElmIHRoZSBiYWNrc2xhc2ggaXMgZm9sbG93ZWQgYnkgYSBkaWdpdCBvciBieSBhbnkKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6CisKKyAgeCwgbywgZCwgbSwgcywgZiwgdiwgJCwgJSwgJiwgOiwgeworCisgICAgICAgICAgdGhpcyBpbmRpY2F0ZXMgYSBzcGVjaWFsIHN1YnN0aXR1dGlvbiBpdGVtOyBvdGhlcndpc2UgdGhlCisgICAgICAgICAgZm9sbG93aW5nIGNoYXJhY3RlciBpcyB0byBiZSB0YWtlbiBsaXRlcmFsbHkgKGV4Y2VwdGlvbnM6IFwgYXQKKyAgICAgICAgICBlbmQgb2YgbGluZSBpcyB0YWtlbiBsaXRlcmFsbHk7IFxuLCBcYiwgYW5kIFxuIGFyZSBzcGVjaWFsCisgICAgICAgICAgaXRlbXMgaW4gdGhlIE9VVFBVVCBjb21tYW5kIG9ubHkpLgorCisgICBTZW1pY29sb24gKDspCisgICAgICAgICAgKE9ubHkgd2hlbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBvciBwcmVjZWRlZCBieSBhdCBsZWFzdAorICAgICAgICAgIG9uZSBzcGFjZSBvciB0YWIpIEludHJvZHVjZXMgYSBjb21tZW50LgorCisgICBOdW1iZXIgc2lnbiAoIykKKyAgICAgICAgICAoT25seSB3aGVuIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIG9yIHByZWNlZGVkIGJ5IGF0IGxlYXN0CisgICAgICAgICAgb25lIHNwYWNlIG9yIHRhYikgSnVzdCBsaWtlIHNlbWljb2xvbjsgaW50cm9kdWNlcyBhIGNvbW1lbnQuCisKKyAgIFF1ZXN0aW9uIG1hcmsgKD8pCisgICAgICAgICAgKE9ubHkgYXQgdGhlIGNvbW1hbmQgcHJvbXB0IC0gbm90IGluIGNvbW1hbmQgZmlsZXMgb3IgbWFjcm9zKQorICAgICAgICAgIFJlcXVlc3RzIGNvbnRleHQtc2Vuc2l0aXZlIGhlbHAuCisKKyAgIFRvIGZvcmNlIEtlcm1pdCB0byB0YWtlIGFueSBvZiB0aGVzZSBjaGFyYWN0ZXJzIGxpdGVyYWxseSwgc2ltcGx5CisgICBwcmVjZWRlIGl0IGJ5IGEgYmFja3NsYXNoIChcKS4KKworICAgU291bmRzIGVhc3khIEFuZCBpdCBpcywgZXhjZXB0IHdoZW4gYmFja3NsYXNoIGFsc28gaGFzIGEgc3BlY2lhbAorICAgbWVhbmluZyB0byB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtLCBhcyBpdCBkb2VzIGluIERPUywKKyAgIFdpbmRvd3MsIGFuZCBPUy8yLCB3aGVyZSBpdCBzZXJ2ZXMgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IgaW4KKyAgIGZpbGVuYW1lcyBzdWNoIGFzOgorCisgIEQ6XEs5NVxLRVlNQVBTXFJFQUQuTUUKKworICAgVXNpbmcgb3VyIHJ1bGUsIHdlIHdvdWxkIG5lZWQgdG8gcmVmZXIgdG8gdGhpcyBmaWxlIGluIEtlcm1pdCBjb21tYW5kcworICAgYXMgZm9sbG93czoKKworICBEOlxcSzk1XFxLRVlNQVBTXFxSRUFELk1FCisKKyAgIEJ1dCB0aGlzIHdvdWxkIG5vdCBiZSBvYnZpb3VzIHRvIG5ldyB1c2VycyBvZiBLZXJtaXQgc29mdHdhcmUgb24gRE9TLAorICAgV2luZG93cywgb3IgT1MvMiwgYW5kIGl0IHdvdWxkIGJlIGFubm95aW5nIHRvIHNlYXNvbmVkIG9uZXMuIFRodXMKKyAgIE1TLURPUyBLZXJtaXQgYW5kIEtlcm1pdCA5NSBnbyB0byByYXRoZXIgZXh0cmVtZSBsZW5ndGhzIHRvIGFsbG93IHRoZQorICAgbW9yZSBuYXR1cmFsIG5vdGF0aW9uLCBhcyBpbjoKKworICBzZW5kIGQ6XGs5NVxrZXltYXBzXHJlYWQubWUKKworICAgVGhlIHJlYXNvbiB0aGlzIGlzIHRyaWNreSBpcyB0aGF0IHdlIGFsc28gbmVlZCB0byBhbGxvdyBmb3IgdmFyaWFibGVzCisgICBhbmQgb3RoZXIgZXhwcmVzc2lvbnMgaW50cm9kdWNlZCBieSBiYWNrc2xhc2ggaW4gdGhlIHNhbWUgY29tbWFuZC4gRm9yCisgICBleGFtcGxlLCBzdXBwb3NlIFwlYSBpcyBhIHZhcmlhYmxlIHdob3NlIHZhbHVlIGlzICJvb2ZhIiAod2l0aG91dCB0aGUKKyAgIHF1b3RlcykuIFdoYXQgZG9lcyB0aGUgZm9sbG93aW5nIGNvbW1hbmQgZG8/CisKKyAgc2VuZCBkOlwlYQorCisgICBEb2VzIGl0IHNlbmQgdGhlIGZpbGUgbmFtZWQgIm9vZmEiIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvZiB0aGUgRDoKKyAgIGRpc2ssIG9yIGRvZXMgaXQgc2VuZCBhIGZpbGUgbmFtZWQgIiVhIiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlCisgICBEOiBkaXNrPyBUaGlzIGlzIHRoZSBraW5kIG9mIHRyb3VibGUgd2UgZ2V0IGludG8gd2hlbiB3ZSBhdHRlbXB0IHRvCisgICBiZW5kIHRoZSBydWxlcyBpbiB0aGUgaW50ZXJlc3Qgb2YgdXNlciBmcmllbmRsaW5lc3MuIChUaGUgYW5zd2VyIGlzOgorICAgaWYgdGhlIHZhcmlhYmxlIFwlYSBoYXMgZGVmaW5pdGlvbiB0aGF0IGlzIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nCisgICBmaWxlLCB0aGF0IGZpbGUgaXMgc2VudDsgaWYgYSBmaWxlIGQ6XCVhIGV4aXN0cywgaXQgaXMgc2VudDsgb3RoZXJ3aXNlCisgICBpZiBib3RoIGNvbmRpdGlvbnMgYXJlIHRydWUsIHRoZSB2YXJpYWJsZSB0YWtlcyBwcmVjZWRlbmNlLCBhbmQgdGhlCisgICBsaXRlcmFsIGZpbGVuYW1lIGNhbiBiZSBmb3JjZWQgYnkgcXVvdGluZzogXFwlYS4pCisKKyAgIEluIEtlcm1pdCA5NSAoYnV0IG5vdCBNUy1ET1MgS2VybWl0KSwgd2UgYWxzbyBiZW5kIHRoZSBydWxlcyBhbm90aGVyCisgICB3YXkgYnkgYWxsb3dpbmcgeW91IHRvIHVzZSBmb3J3YXJkIHNsYXNoICgvKSByYXRoZXIgdGhhbiBiYWNrc2xhc2ggKFwpCisgICBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvcjoKKworICBzZW5kIGQ6L2s5NS9rZXltYXBzL3JlYWQubWUKKworICAgVGhpcyBsb29rcyBtb3JlIG5hdHVyYWwgdG8gVU5JWCB1c2VycywgYW5kIGluIGZhY3QgaXMgcGVyZmVjdGx5CisgICBhY2NlcHRhYmxlIHRvIHRoZSBXaW5kb3dzIDk1Lzk4L05UIGFuZCBPUy8yIG9wZXJhdGluZyBzeXN0ZW1zIG9uIHRoZQorICAgQVBJIGxldmVsLiBCVVQgKHRoZXJlIGlzIGFsd2F5cyBhICJidXQiKSB0aGUgTWljcm9zb2Z0IHNoZWxsLAorICAgQ09NTUFORC5DT00sIGZvciBXaW5kb3dzIDk1Lzk4IGFuZCBOVCBkb2VzIG5vdCBhbGxvdyB0aGlzIG5vdGF0aW9uLAorICAgYW5kIHRoZXJlZm9yZSBpdCBjYW4gbm90IGJlIHVzZWQgaW4gYW55IEtlcm1pdCBjb21tYW5kIC0tIHN1Y2ggYXMgUlVOCisgICAtLSB0aGF0IGludm9rZXMgdGhlIFdpbmRvd3MgY29tbWFuZCBzaGVsbCBBTkQgeW91ciBjb21tYW5kIHNoZWxsIGlzCisgICBDT01NQU5ELkNPTSBvciBhbnkgb3RoZXIgc2hlbGwgdGhhdCBkb2VzIG5vdCBhbGxvdyBmb3J3YXJkIHNsYXNoIGFzCisgICBkaXJlY3Rvcnkgc2VwYXJhdG9yIChzb21lIGFsdGVybmF0aXZlIHNoZWxscyBkbyBhbGxvdyB0aGlzKS4KKworICAgICBOT1RFOiBUaGVyZSBleGlzdHMgYSB3aWRlIHZhcmlldHkgb2YgYWx0ZXJuYXRpdmUgc2hlbGxzIGZyb20gdGhpcmQKKyAgICAgcGFydGllcyB0aGF0IGRvIG5vdCBoYXZlIHRoaXMgcmVzdHJpY3Rpb24uIElmIHlvdSBhcmUgdXNpbmcgYSBzaGVsbAorICAgICB0aGF0IGFjY2VwdHMgZm9yd2FyZCBzbGFzaCBhcyBhIGRpcmVjdG9yeSBzZXBhcmF0b3IsIHlvdSBjYW4gc3RvcAorICAgICByZWFkaW5nIHJpZ2h0IG5vdyAtLSBVTkxFU1MgKHRoZXJlIGlzIGFsd2F5cyBhbiAidW5sZXNzIikgeW91IHdhbnQKKyAgICAgeW91ciBzY3JpcHRzIHRvIGJlIHBvcnRhYmxlIHRvIHN5c3RlbXMgdGhhdCBoYXZlIG90aGVyIHNoZWxscy4gQWxzbworICAgICBub3RlIHRoYXQgc29tZSBXaW5kb3dzIHNoZWxscyBtaWdodCBhY3R1YWxseSBSRVFVSVJFIGZvcndhcmQKKyAgICAgc2xhc2hlcyAoaW5zdGVhZCBvZiBiYWNrc2xhc2hlcykgYXMgZGlyZWN0b3J5IHNlcGFyYXRvcnM7IHdlIGRvIG5vdAorICAgICB0cmVhdCB0aGlzIHNpdHVhdGlvbiBiZWxvdywgYnV0IHRoZSB0cmVhdG1lbnQgaXMgb2J2aW91cyAtLSB1c2UKKyAgICAgc2xhc2ggcmF0aGVyIGJhY2tzbGFzaCBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvci4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDEuMTEuMy4gUGFzc2luZyBET1MgRmlsZW5hbWVzIGZyb20gS2VybWl0IHRvIFNoZWxsIENvbW1hbmRzCisKKyAgIFRoZSBmb2xsb3dpbmcgS2VybWl0IGNvbW1hbmRzIGludm9rZSB0aGUgc3lzdGVtIGNvbW1hbmQgc2hlbGw6CisKKyAgUlVOIChhbmQgaXRzIHN5bm9ueW1zICEgYW5kIEApCisgIFJFRElSRUNUCisgIFBJUEUKKworICAgRWFjaCBvZiB0aGVzZSBjb21tYW5kcyB0YWtlcyBhIHNoZWxsIGNvbW1hbmQgYXMgYW4gb3BlcmFuZC4gVGhlc2UKKyAgIHNoZWxsIGNvbW1hbmRzIGFyZSBub3QsIGFuZCBjYW4gbm90IGJlLCBwYXJzZWQgYnkgS2VybWl0IHNpbmNlIEtlcm1pdAorICAgZG9lcyBub3Qga25vdyB0aGUgc3ludGF4IG9mIHNoZWxsIGNvbW1hbmRzLCBhbmQgc28gY2FuJ3QgdGVsbCB0aGUKKyAgIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGtleXdvcmQsIGEgZmlsZW5hbWUsIGEgdmFyaWFibGUsIGEgc3dpdGNoLCBvcgorICAgb3RoZXIgaXRlbS4gVGhlcmVmb3JlIHRoZSBydWxlcyBjYW4gbm90IGJlIGJlbnQgc2luY2UgS2VybWl0IGRvZXNuJ3QKKyAgIGtub3cgd2hlcmUgb3IgaG93IHRvIGJlbmQgdGhlbS4gVG8gaWxsdXN0cmF0ZSAodXNpbmcgdGhlIHJlZ3VsYXIKKyAgIFdpbmRvd3Mgc2hlbGwpOgorCisgIHJ1biBjOlxcd2luZG93c1xcY29tbWFuZFxcY2hrZHNrLmV4ZQorCisgICB3b3JrcyBPSywgYnV0OgorCisgIHJ1biBjOi93aW5kb3dzL2NvbW1hbmQvY2hrZHNrLmV4ZQorCisgICBpcyBub3QgYWNjZXB0ZWQgYnkgQ09NTUFORC5DT00uIEJ1dDoKKworICBydW4gYzpcd2luZG93c1xjb21tYW5kXGNoa2Rzay5leGUKKworICAgcmVzdWx0cyBpbiBLZXJtaXQgYXBwbHlpbmcgaXRzIHF1b3RpbmcgcnVsZXMgYmVmb3JlIHNlbmRpbmcgdGhlIHRleHQKKyAgIHRvIHRoZSBzaGVsbC4gU2luY2UgInciIGFuZCAiYyIgYXJlIG5vdCBpbiB0aGUgbGlzdCBvZiBiYWNrc2xhc2gtaXRlbQorICAgY29kZXMsIHRoZSBiYWNrc2xhc2ggbWVhbnMgInRha2UgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIgbGl0ZXJhbGx5Ii4KKyAgIFRodXMsIGJ5IHRoZSB0aW1lIHRoaXMgZmlsZW5hbWUgZ2V0cyB0byB0aGUgV2luZG93cyBzaGVsbCwgaXQgaGFzCisgICBiZWNvbWU6CisKKyAgYzp3aW5kb3dzY29tbWFuZGNoa2Rzay5leGUKKworICAgd2hpY2ggaXMgcHJvYmFibHkgbm90IHdoYXQgeW91IHdhbnRlZC4gKElmICJ3IiBhbmQgImMiIHdlcmUgaW4gdGhlCisgICBsaXN0LCB0aGUgcmVzdWx0cyBjb3VsZCBiZSBldmVuIHN0cmFuZ2VyLikgRXZlbiBtb3JlIGNvbmZ1c2luZyBpcyB0aGUKKyAgIGNhc2Ugd2hlcmUgYSBkaXJlY3Rvcnkgb3IgZmlsZW5hbWUgc3RhcnRzIHdpdGggb25lIG9yIG1vcmUgZGlnaXRzOgorCisgIHJ1biBjOlwxMjNcbG90dXMuZXhlCisKKyAgIGluIHdoaWNoICJcMTIzIiBpcyB0aGUgS2VybWl0IG5vdGF0aW9uIGZvciBBU0NJSSBjaGFyYWN0ZXIgMTIzLCB3aGljaAorICAgaGFwcGVucyB0byBiZSBsZWZ0IGJyYWNlICh7KSwgcmVzdWx0aW5nIGluICJjOntsb3R1cy5leGUiLgorCisgICBTbyB3aGVuIHBhc3NpbmcgZmlsZW5hbWVzIHRvIGEgV2luZG93cyBzaGVsbCwgYWx3YXlzIHVzZSBkb3VibGUKKyAgIGJhY2tzbGFzaGVzIGFzIGRpcmVjdG9yeSBzZXBhcmF0b3JzLCB0byBlbnN1cmUgdGhhdCB0aGUgc2hlbGwgZ2V0cworICAgc2luZ2xlIGJhY2tzbGFzaGVzOgorCisgIHJ1biBjOlxcd2luZG93c1xcY29tbWFuZFxcY2hrZHNrLmV4ZQorICBydW4gYzpcXDEyM1xcbG90dXMuZXhlCisKKyAgIFNpbWlsYXIgcHJvYmxlbXMgbWlnaHQgb2NjdXIgd2l0aCB0aGUgYnVpbHQtaW4gRURJVCwgQlJPV1NFLCBhbmQgRlRQCisgICBjb21tYW5kcy4gVGhlc2UgY29tbWFuZHMgcmVzdWx0IGluIEtlcm1pdCBidWlsZGluZyBhIHNoZWxsIGNvbW1hbmQKKyAgIGludGVybmFsbHkgdG8gaW52b2tlIHRoZSBhc3NvY2lhdGVkIGhlbHBlciBwcm9ncmFtOyB0aGUgZm9ybSBvZiB0aGlzCisgICBjb21tYW5kIG1pZ2h0IGNvbmZsaWN0IHdpdGggdGhlIGZvcm0gZGVtYW5kZWQgYnkgY2VydGFpbiBhbHRlcm5hdGl2ZQorICAgc2hlbGxzLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMS4xMS40LiBVc2luZyBWYXJpYWJsZXMgdG8gSG9sZCBET1MgRmlsZW5hbWVzCisKKyAgIE5vdyB0byB0aGUgbmV4dCBsZXZlbC4gU3VwcG9zZSB5b3Ugd2FudCB0byB3cml0ZSBhIHNjcmlwdCBpbiB3aGljaAorICAgZmlsZW5hbWVzIGFyZSBwYXJhbWV0ZXJzLCBhbmQgdGhlcmVmb3JlIGFyZSBzdG9yZWQgaW4gdmFyaWFibGVzLgorICAgRXhhbXBsZToKKworICBkZWZpbmUgXCVmIGM6XHdpbmRvd3NcY29tbWFuZFxjaGtkc2suZXhlCisgIC4uLgorICBydW4gXCVmCisKKyAgIE9idmlvdXNseSB0aGlzIHdvbid0IHdvcmsgZm9yIHRoZSByZWFzb25zIGp1c3Qgbm90ZWQ7IHRoZSBSVU4gY29tbWFuZAorICAgcmVxdWlyZXMgZGlyZWN0b3J5IHNlcGFyYXRvcnMgYmUgY29kZWQgYXMgZG91YmxlIGJhY2tzbGFzaGVzOgorCisgIGRlZmluZSBcJWYgYzpcXHdpbmRvd3NcXGNvbW1hbmRcXGNoa2Rzay5leGUKKyAgLi4uCisgIHJ1biBcJWYKKworICAgVGhpcyB3aWxsIHdvcms7IG5vIHN1cnByaXNlcyBoZXJlLiBIb3dldmVyLCBpZiB5b3UgaGFkIHVzZWQgQVNTSUdOCisgICByYXRoZXIgdGhhbiBERUZJTkUsIHlvdSBtaWdodCBoYXZlIGJlZW4gc3VycHJpc2VkIGFmdGVyIGFsbDsgcmV2aWV3CisgICBwYWdlcyAzNDgtMzQ5IG9mIFszNTldVXNpbmcgQy1LZXJtaXQgKDJuZCBFZCkgZm9yIHRoZSBkaWZmZXJlbmNlCisgICBiZXR3ZWVuIERFRklORSBhbmQgQVNTSUdOLgorCisgICBXZSBoYXZlIHNhaWQgdGhhdCBhbnkgS2VybWl0IDk1IG9yIE1TLURPUyBLZXJtaXQgY29tbWFuZCB0aGF0IHBhcnNlcworICAgZmlsZW5hbWVzIGl0c2VsZiAtLSBTRU5ELCBmb3IgZXhhbXBsZSAtLSBkb2VzIG5vdCByZXF1aXJlIGRvdWJsZQorICAgYmFja3NsYXNoZXMgc2luY2UgaXQga25vd3MgaXQgaXMgcGFyc2luZyBhIGZpbGVuYW1lLiBTbyBzaW5jZSB0aGUKKyAgIGZvbGxvd2luZyB3b3JrczoKKworICBzZW5kIGM6XHdpbmRvd3NcY29tbWFuZFxjaGtkc2suZXhlCisKKyAgIFNob3VsZCB0aGUgZm9sbG93aW5nIGFsc28gd29yaz8KKworICBkZWZpbmUgXCVmIGM6XHdpbmRvd3NcY29tbWFuZFxjaGtkc2suZXhlCisgIC4uLgorICBzZW5kIFwlZgorCisgICBBbnN3ZXI6IE5vLiBXaHk/IEJlY2F1c2UgXCVmIGlzIGV2YWx1YXRlZCAicmVjdXJzaXZlbHkiLCB0byBhbGxvdyBmb3IKKyAgIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGl0cyBkZWZpbml0aW9uIGNvbnRhaW5zIGZ1cnRoZXIgdmFyaWFibGUKKyAgIHJlZmVyZW5jZXMuIFRoaXMgaXMgdHJ1ZSBvZiBhbGwgImJhY2tzbGFzaC1wZXJjZW50LWxldHRlciIgKG9yIC1kaWdpdCkKKyAgIHZhcmlhYmxlcywgYW5kIGFsc28gZm9yIGFycmF5IHJlZmVyZW5jZXMuIFNvIFwlZiBiZWNvbWVzCisgICBjOlx3aW5kb3dzXGNvbW1hbmRcY2hrZHNrLmV4ZSwgd2hpY2ggYmVjb21lcworICAgYzp3aW5kb3dzY29tbWFuZGNoa2Rzay5leGUuCisKKyAgIFRoZSB0cmljayBoZXJlIGlzIHRvIHVzZSB0aGUgIm90aGVyIiBraW5kIG9mIHZhcmlhYmxlLCB0aGF0IGlzCisgICBldmFsdWF0ZWQgb25seSAib25lIGxldmVsIGRlZXAiIHJhdGhlciB0aGFuIHJlY3Vyc2l2ZWx5OgorCisgIGRlZmluZSBmaWxlbmFtZSBjOlx3aW5kb3dzXGNvbW1hbmRcY2hrZHNrLmV4ZQorICAuLi4KKyAgc2VuZCBcbShmaWxlbmFtZSkKKworICAgU2ltaWxhcmx5IGlmIHlvdSB3YW50IHRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBmaWxlbmFtZToKKworICBhc2sgZmlsZW5hbWUgeyBQbGVhc2UgdHlwZSBhIGZpbGVuYW1lOiB9CisgICBQbGVhc2UgdHlwZSBhIGZpbGVuYW1lOiBjOlx3aW5kb3dzXGNvbW1hbmRcY2hrZHNrLmV4ZQorICBzZW5kIFxtKGZpbGVuYW1lKQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMS4xMS41LiBQYXNzaW5nIERPUyBGaWxlbmFtZXMgYXMgUGFyYW1ldGVycyB0byBNYWNyb3MKKworICAgU3VwcG9zZSB5b3Ugd2FudCB0byBwYXNzIGEgRE9TIGZpbGVuYW1lIGNvbnRhaW5pbmcgYmFja3NsYXNoZXMgYXMgYQorICAgcGFyYW1ldGVyIHRvIGEgS2VybWl0IG1hY3JvLiBUaGlzIHJhaXNlcyB0d28gaXNzdWVzOgorCisgICAgMS4gUGFyYW1ldGVycyB0byBtYWNyb3MgYXJlICJqdXN0IHRleHQiIGFuZCBzbyBhcmUgZnVsbHkgZXZhbHVhdGVkCisgICAgICAgYmVmb3JlIHRoZXkgYXJlIHBhc3NlZCB0byB0aGUgbWFjcm8uCisgICAgMi4gT25jZSBpbnNpZGUgdGhlIG1hY3JvLCB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgXCUxLCBcJTIsIC4uLiBcJTkgYXJlCisgICAgICAgdGhlIHR5cGUgb2YgdmFyaWFibGUgdGhhdCBpcyBldmFsdWF0ZWQgcmVjdXJzaXZlbHkuCisKKyAgIFRodXMgYSBET1MgZmlsZW5hbWUgaXMgcnVpbmVkIG9uY2UgaW4gdGhlIGFjdCBvZiBwYXJzaW5nIHRoZSBtYWNybworICAgaW52b2NhdGlvbiwgYW5kIGFnYWluIHdoZW4gcmVmZXJyaW5nIHRvIGl0IGZyb20gd2l0aGluIHRoZSBtYWNyby4gVG8KKyAgIGlsbHVzdHJhdGUsIHN1cHBvc2UgInRlc3QiIGlzIGEgbWFjcm8uIFRoZW4gaW4gdGhlIGludm9jYXRpb246CisKKyAgdGVzdCBjOlxteWRpclxibGFoLnR4dAorCisgICAiYzpteWRpcmJsYWgudHh0IiBpcyBhc3NpZ25lZCB0byBcJTEuIEhvd2V2ZXIsIGlmIHdlIGRvdWJsZSB0aGUKKyAgIGJhY2tzbGFzaGVzOgorCisgIHRlc3QgYzpcXG15ZGlyXFxibGFoLnR4dAorCisgICAiYzpcbXlkaXJcYmxhaC50eHQiIGlzIGFzc2lnbmVkIHRvIFwlMS4gQnV0IHRoZW4gd2hlbiB5b3UgcmVmZXIgdG8gXCUxCisgICBpbiB0aGUgbWFjcm8sIGl0IGlzIGV2YWx1YXRlZCByZWN1cnNpdmVseSwgcmVzdWx0aW5nIGluCisgICAiYzpteWRpcmJsYWgudHh0Ii4gVG8gaWxsdXN0cmF0ZToKKworICBkZWZpbmUgdGVzdCBlY2hvIFwlMQorICB0ZXN0IGM6XG15ZGlyXGJsYWgudHh0CisgIGM6bXlkaXJibGFoLnR4dAorICB0ZXN0IGM6XFxteWRpclxcYmxhaC50eHQKKyAgYzpteWRpcmJsYWgudHh0CisgIHRlc3QgYzpcXFxcbXlkaXJcXFxcYmxhaC50eHQKKyAgYzpcbXlkaXJcYmxhaC50eHQKKworICAgTGV0J3MgYWRkcmVzcyBlYWNoIHBhcnQgb2YgdGhlIHByb2JsZW0gc2VwYXJhdGVseS4gRmlyc3QsIGluc2lkZSB0aGUKKyAgIG1hY3JvLiBZb3UgY2FuIHVzZSB0aGUgXGZjb250ZW50cygpIGZ1bmN0aW9uIHRvIGZvcmNlIGEKKyAgIGJhY2tzbGFzaC1wZXJjZW50IHZhcmlhYmxlIChzdWNoIGFzIGEgbWFjcm8gYXJndW1lbnQpIHRvIGJlIGV2YWx1YXRlZAorICAgb25lIGxldmVsIGRlZXAgaW5zdGVhZCBvZiByZWN1cnNpdmVseSwgZm9yIGV4YW1wbGU6CisKKyAgZGVmaW5lIHRlc3QgZWNobyB7IFRoZSBmaWxlbmFtZSBpcyAiXGZjb250ZW50cyhcJTEpIn0KKworICB0ZXN0IGM6XG15ZGlyXGJsYWgudHh0ICAgICAgICAgICAgICAgOyBXZSBkb24ndCBleHBlY3QgdGhpcyB0byB3b3JrCisgICBUaGUgZmlsZW5hbWUgaXMgImM6bXlkaXJibGFoLnR4dCIgICA7IGFuZCBpdCBkb2Vzbid0LgorICB0ZXN0IGM6XFxteWRpclxcYmxhaC50eHQgICAgICAgICAgICAgOyBCdXQgdGhpcyBkb2VzLi4uCisgICBUaGUgZmlsZW5hbWUgaXMgImM6XG15ZGlyXGJsYWgudHh0IgorCisgICBUaHVzIGlmIHRoZSBmaWxlbmFtZSBhcnJpdmVzIGluc2lkZSB0aGUgbWFjcm8gd2l0aCBzaW5nbGUgYmFja3NsYXNoZXMsCisgICB0aGUgYmFja3NsYXNoZXMgYXJlIHByZXNlcnZlZCBpZiB5b3UgYWx3YXlzIHJlZmVyIHRvIHRoZSBwYXJhbWV0ZXIKKyAgIHRocm91Z2ggdGhlIFxmY29udGVudHMoKSBmdW5jdGlvbi4KKworICAgTm93IGhvdyB0byBlbnN1cmUgdGhhdCBiYWNrc2xhc2hlcyBhcmUgbm90IHN0cmlwcGVkIG9yIG1pc2ludGVycHJldGVkCisgICB3aGVuIHBhc3NpbmcgYSBmaWxlbmFtZSB0byBhIG1hY3JvPyBUaGlzIGJyaW5ncyB1cyBiYWNrIHRvIHdoYXQgd2UKKyAgIGxlYXJuZWQgaW4gZWFybGllciBzZWN0aW9uczoKKworICAgIDEuIElmIGl0IGlzIGEgbGl0ZXJhbCBmaWxlbmFtZSwgZWl0aGVyIGRvdWJsZSB0aGUgYmFja3NsYXNoZXMsIG9yIChpZgorICAgICAgIHRoZSBmaWxlbmFtZSBpcyB0byBiZSB1c2VkIG9ubHkgd2l0aGluIEtlcm1pdCBpdHNlbGYgYW5kIG5vdAorICAgICAgIHBhc3NlZCB0byBhIERPUyBzaGVsbCwgb3IgaXQgaXMgdG8gYmUgcGFzc2VkIHRvIGFuIGFsdGVybmF0aXZlCisgICAgICAgc2hlbGwgdGhhdCBhY2NlcHRzIGZvcndhcmQgc2xhc2ggYXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yKSwgdXNlCisgICAgICAgZm9yd2FyZCBzbGFzaCBpbnN0ZWFkIG9mIGJhY2tzbGFzaCBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvci4KKyAgICAyLiBJZiBpdCBpcyBhIHZhcmlhYmxlIHRoYXQgY29udGFpbnMgYSBmaWxlbmFtZSwgbWFrZSBzdXJlIHlvdSB1c2UgYQorICAgICAgIG1hY3JvLXN0eWxlIHZhcmlhYmxlIG5hbWUsIHJhdGhlciB0aGFuIGEKKyAgICAgICBiYWNrc2xhc2gtcGVyY2VudC1jaGFyYWN0ZXIgbmFtZS4KKworICAgRXhhbXBsZXM6CisKKyAgZGVmaW5lIHRlc3QgZWNobyBcZmNvbnRlbnRzKFwlMSkKKyAgZGVmaW5lIGZpbGVuYW1lIGM6XG15ZGlyXGJsYWgudHh0CisKKyAgdGVzdCBjOlxcbXlkaXJcXGJsYWgudHh0ICA7IExpdGVyYWwgZmlsZW5hbWUgd2l0aCBkb3VibGUgYmFja3NsYXNoZXMKKyAgYzpcbXlkaXJcYmxhaC50eHQKKworICB0ZXN0IGM6L215ZGlyL2JsYWgudHh0ICAgIDsgTGl0ZXJhbCBmaWxlbmFtZSB3aXRoIGZvcndhcmQgc2xhc2hlcworICBjOi9teWRpci9ibGFoLnR4dAorCisgIHRlc3QgXG0oZmlsZW5hbWUpICAgICAgICAgOyBWYXJpYWJsZQorICBjOlxteWRpclxibGFoLnR4dAorCisgICBCdXQgd2hhdCBpZiB5b3UgZG9uJ3QgbGlrZSB0aGVzZSBydWxlcyBhbmQgeW91IHN0aWxsIHdhbnQgdG8gcGFzcyBhCisgICBsaXRlcmFsIGZpbGVuYW1lIGNvbnRhaW5pbmcgc2luZ2xlIGJhY2tzbGFzaGVzIHRvIGEgbWFjcm8/IFRoaXMgaXMKKyAgIHBvc3NpYmxlIHRvbywgYnV0IGEgYml0IHRyaWNreTogdHVybiBjb21tYW5kIHF1b3Rpbmcgb2ZmIGJlZm9yZQorICAgaW52b2tpbmcgdGhlIG1hY3JvLCBhbmQgdGhlbiB0dXJuIGl0IGJhY2sgb24gaW5zaWRlIHRoZSBtYWNyby4KKyAgIEV4YW1wbGU6CisKKyAgZGVmaW5lIHRlc3Qgc2V0IGNvbW1hbmQgcXVvdGluZyBvbiwgZWNobyBcZmNvbnRlbnRzKFwlMSkKKworICBzZXQgY29tbWFuZCBxdW90aW5nIG9mZgorICB0ZXN0IGM6XG15ZGlyXGJsYWgudHh0CisgIGM6XG15ZGlyXGJsYWgudHh0CisKKyAgIFVwb24gcmV0dXJuIGZyb20gdGhlIG1hY3JvLCBjb21tYW5kIHF1b3RpbmcgaXMgYmFjayBvbiAoc2luY2UgdGhlCisgICBtYWNybyB0dXJuZWQgaXQgb24pLgorCisgICBPYnZpb3VzbHkgdGhpcyB0cmljayBjYW4gbm90IGJlIHVzZWQgaWYgdGhlIGZpbGVuYW1lIGlzIHN0b3JlZCBpbiBhCisgICB2YXJpYWJsZSwgc2luY2UgaXQgcHJldmVudHMgdGhlIHZhcmlhYmxlIGZyb20gYmVpbmcgZXZhbHVhdGVkLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMS4xMS42LiBQYXNzaW5nIERPUyBGaWxlIE5hbWVzIGZyb20gTWFjcm8gUGFyYW1ldGVycyB0byB0aGUgRE9TIFNoZWxsCisKKyAgIE5vdyBzdXBwb3NlIHlvdSBuZWVkIHRvIHBhc3MgYSBET1MgZmlsZW5hbWUgdG8gYSBtYWNybywgYW5kIHRoZSBtYWNybworICAgbmVlZHMgdG8gcGFzcyBpdCwgaW4gdHVybiwgdG8gdGhlIFdpbmRvd3Mgc2hlbGwgdmlhIChzYXkpIEtlcm1pdCdzIFJVTgorICAgY29tbWFuZC4gVGhpcyB3b3JrcyB0b286CisKKyAgZGVmaW5lIHhydW4gcnVuIFxmY29udGVudHMoXCUxKQorICB4cnVuIGM6XFx3aW5kb3dzXFxjb21tYW5kXFxjaGtkc2suZXhlCisKKyAgIChvciB5b3UgY2FuIHVzZSB0aGUgU0VUIENPTU1BTkQgUVVPVElORyBPRkYgLyBPTiB0ZWNobmlxdWUgZGVzY3JpYmVkCisgICBhYm92ZSB0byBhdm9pZCB0aGUgZG91YmxlIGJhY2tzbGFzaGVzLikgQnV0Li4KKworICB4cnVuIGM6L3dpbmRvd3MvY29tbWFuZC9jaGtkc2suZXhlCisKKyAgIGRvZXMgbm90IHdvcmsgaWYgdGhlIFdpbmRvd3Mgc2hlbGwgZG9lcyBub3QgcmVjb2duaXplICIvIiBhcyBhCisgICBkaXJlY3Rvcnkgc2VwYXJhdG9yLiBJZiB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGEgZmlsZW5hbWUgbWlnaHQgYmUKKyAgIHBhc3NlZCB0byB0aGUgbWFjcm8gaW4gdGhpcyBmb3JtLCB0aGUgbWFjcm8gd2lsbCBuZWVkIHRvIGNvbnZlcnQgaXQgdG8KKyAgIGEgZm9ybSBhY2NlcHRhYmxlIHRvIHRoZSBzaGVsbDoKKworICBkZWZpbmUgeHJ1biBydW4gXGZyZXBsYWNlKFxmY29udGVudHMoXCUxKSwvLFxcKQorCisgICBIZXJlIHdlIHJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIChpZiBhbnkpIG9mICIvIiBpbiB0aGUgYXJndW1lbnQgd2l0aAorICAgIlwiIHByaW9yIHRvIGlzc3VpbmcgdGhlIFJVTiBjb21tYW5kLiBPZiBjb3Vyc2UsIGluIG9yZGVyIHRvIHNwZWNpZnkKKyAgICJcIiBhcyBhIGxpdGVyYWwgY2hhcmFjdGVyIGluIHRoZSBcZnJlcGxhY2UoKSBhcmd1bWVudCBsaXN0LCB3ZSBoYXZlCisgICB0byBkb3VibGUgaXQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAxLjExLjcuIFBhc3NpbmcgRE9TIEZpbGVuYW1lcyB0byBLZXJtaXQgZnJvbSB0aGUgU2hlbGwKKworICAgQXMgbm90ZWQgaW4gdGhlIG1hbnVhbCwgdGhlIFwmQFtdIGFycmF5IGNvbnRhaW5zIEtlcm1pdCdzIGNvbW1hbmQtbGluZQorICAgYXJndW1lbnRzLiBTdXBwb3NlIG9uZSBvZiB0aGVzZSBhcmd1bWVudHMsIHNheSBcJkBbM10sIGlzIGEgRE9TCisgICBmaWxlbmFtZSBzdWNoIGFzIEM6XEZPT1xCQVJcQkFaXE9PRkEuVFhULiAoTm90ZTogSW4gQy1LZXJtaXQgNy4wIGFuZAorICAgSzk1IDEuMS4xOCBhbmQgbGF0ZXIsIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYWZ0ZXIgIj0iIG9yICItLSIgYXJlCisgICBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgdG9wLWxldmVsIFwlMS4uOSB2YXJpYWJsZXM7IHNlZSBbMzYwXVNlY3Rpb24KKyAgIDcuNS4pCisKKyAgIE9mIGNvdXJzZSB5b3UgY2FuIGVsaW1pbmF0ZSBhbnkgcHJvYmxlbXMgYnkgdXNpbmcgZm9yd2FyZCBzbGFzaGVzCisgICByYXRoZXIgdGhhbiBiYWNrc2xhc2hlcyBpbiB0aGUgZmlsZW5hbWUsIGJ1dCBzb21ldGltZXMgdGhpcyBpcyBub3QKKyAgIHBvc3NpYmxlLCBhcyB3aGVuIHRoZSBLZXJtaXQgY29tbWFuZCBsaW5lIGlzIGJlaW5nIGdlbmVyYXRlZCBieQorICAgYW5vdGhlciBwcm9ncmFtIHRoYW4gY2FuIG9ubHkgZ2VuZXJhdGUgIm5hdGl2ZSIgZm9ybWF0IERPUyBmaWxlbmFtZXMuCisKKyAgIEFzIG5vdGVkIGluIHRoZSBtYW51YWwsICJcJXgiIHZhcmlhYmxlcyBhbmQgXCZ4W10gYXJyYXlzIGFyZSBhbHdheXMKKyAgIGV2YWx1YXRlZCAiYWxsIHRoZSB3YXkiIChyZWN1cnNpdmVseSkuIElmIHRoZSBjb250ZW50cyBvZiBvbmUgb2YgdGhlc2UKKyAgIHZhcmlhYmxlcyBjb250YWlucyBiYWNrc2xhc2hlcywgdGhpcyBjYXVzZXMgYW5vdGhlciBsZXZlbCBvZgorICAgZXZhbHVhdGlvbi4KKworICAgVGhlcmUgaXMgYW5vdGhlciBraW5kIG9mIHZhcmlhYmxlLCB3aGljaCBpcyBldmFsdWF0ZWQgb25seSAib25lIGxldmVsCisgICBkZWVwIi4gWW91IGNhbiB1c2UgdGhpcyB0byBwcmV2ZW50IGludGVycHJldGF0aW9uIG9mIHRoZSBiYWNrc2xhc2hlcworICAgaW4gdGhlIGZpbGVuYW1lcy4gRXhhbXBsZToKKworICBhc3NpZ24gZmlsZW5hbWUgXGZjb250ZW50cyhcJkBbM10pICA7IFRyYW5zZmVyIGNvbnRlbnRzCisgIC4uLgorICBzZW5kIFxtKGZpbGVuYW1lKQorCisgICBPciwgbW9yZSBzaW1wbHk6CisKKyAgc2VuZCBcZmNvbnRlbnRzKFwmQFszXSkKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxLjEyLiBEZWJ1Z2dpbmcKKworICAgVGhlIGRlYnVnIGxvZyBpcyBwcm9kdWNlZCB3aGVuIHlvdSBnaXZlIGEgImxvZyBkZWJ1ZyIgY29tbWFuZC4gVGhpcyBpcworICAgbm9ybWFsbHkgZG9uZSBhdCB0aGUgcmVxdWVzdCBvZiB0aGUgS2VybWl0IGhlbHAgZGVzaywgZm9yIGZvcndhcmRpbmcKKyAgIHRvIHRoZSBLZXJtaXQgZGV2ZWxvcGVycyBmb3IgYW5hbHlzaXMgYXMgYSBsYXN0IHJlc29ydCBpbgorICAgdHJvdWJsZXNob290aW5nIHByb2JsZW1zLiAoTGFzdCByZXNvcnQgYmVjYXVzZSBpdCBjYW4gZ3JvdyBxdWl0ZSBodWdlCisgICBpbiBhIHZlcnkgc2hvcnQgdGltZS4pIEluIGNhc2VzIHdoZXJlIHRpbWluZyBpbmZvcm1hdGlvbiBpcyBjcml0aWNhbAorICAgdG8gdW5kZXJzdGFuZGluZyBhIHByb2JsZW0sIHlvdSBjYW4gdGVsbCBDLUtlcm1pdCB0byBwdXQgYSB0aW1lc3RhbXAKKyAgIG9uIGVhY2ggZGVidWcgbG9nIGxpbmUgYnkgZ2l2aW5nIHRoZSBjb21tYW5kOgorCisgIFNFVCBERUJVRyBUSU1FU1RBTVAgT04KKworICAgQXQgYW55IHRpbWUgYmVmb3JlIG9yIGFmdGVyIGFjdGl2YXRpbmcgdGhlIGRlYnVnIGxvZyAoU0VUIERFQlVHCisgICBUSU1FU1RBTVAgT0ZGIHR1cm5zIG9mZiB0aW1lc3RhbXBpbmcpLiBUaW1lc3RhbXBzIGNhbiBiZSB0dXJuZWQgb2ZmCisgICBhbmQgb24gYXMgZGVzaXJlZCB3aGlsZSBsb2dnaW5nLiBPYnZpb3VzbHksIHRoZXkgaW5jcmVhc2UgdGhlIHNpemUgYW5kCisgICBncm93dGggcmF0ZSBvZiB0aGUgbG9nIHNpZ25pZmljYW50bHksIGFuZCBzbyBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkuCisgICBUaW1lc3RhbXBzIGFyZSBvZiB0aGUgZm9ybSBoaDptbTpzcy54eHgsIHdoZXJlIC54eHggaXMgdGhvdXNhbmRzIG9mIGEKKyAgIHNlY29uZCAoYnV0IGlzIGluY2x1ZGVkIG9ubHkgb24gcGxhdGZvcm1zIHRoYXQgaW5jbHVkZSB0aGlzIGZlYXR1cmUpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEuMTMuIExvZ3MKKworICAgSW4gVU5JWCBDLUtlcm1pdCBhbmQgaW4gSy05NSwgeW91IGNhbiBub3cgZGlyZWN0IGFueSBsb2cgdG8gYSBwaXBlLgorICAgVGhpcyBub3Qgb25seSBsZXRzIHlvdSBzZW5kIHlvdXIgbG9ncyB0byBwbGFjZXMgb3RoZXIgdGhhbiBkaXNrIGZpbGVzLAorICAgYnV0IGFsc28gbGV0cyB5b3UgY3VzdG9taXplIHRoZW0gdG8gYW55IGRlc2lyZWQgZGVncmVlLgorCisgICBMT0cgeyBERUJVRywgUEFDS0VUUywgU0VTU0lPTiwgVFJBTlNBQ1RJT04sIENPTk5FQ1RJT04gfSB7IGZpbGUsIHBpcGUKKyAgICAgICAgICB9IC4uLgorICAgICAgICAgIEEgInBpcGUiIGlzIHRoZSBuYW1lIG9mIGEgY29tbWFuZCwgcHJlY2VkZWQgYnkgYSB2ZXJ0aWNhbCBiYXIuCisgICAgICAgICAgSWYgdGhlIHBpcGUgY29udGFpbnMgYW55IHNwYWNlcywgaXQgbXVzdCBiZSBlbmNsb3NlZCBpbiBicmFjZXMuCisKKyAgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgZm9yIFVOSVggKGFsd2F5cyByZW1lbWJlciB0aGUgaW1wb3J0YW5jZSBvZgorICAgZ2V0dGluZyB0aGUgVU5JWCBzaGVsbCBxdW90aW5nIHJ1bGVzIHJpZ2h0KToKKworICAgTE9HIFRSQU5TQUNUSU9OUyB8bHByCisgICAgICAgICAgVGhpcyBzZW5kcyB0aGUgdHJhbnNhY3Rpb24gbG9nIHRvIHRoZSBkZWZhdWx0IFVOSVggcHJpbnRlciwKKyAgICAgICAgICByYXRoZXIgdGhhbiB0byBhIGZpbGUgKHVzZSAibHAiIHJhdGhlciB0aGFuICJscHIiIGlmCisgICAgICAgICAgbmVjZXNzYXJ5KS4KKworICAgTE9HIFRSQU5TQUNUSU9OUyB7fCBteWZpbHRlciA+IHQubG9nfQorICAgICAgICAgIEZvciB0aG9zZSB3aG8gZG9uJ3QgbGlrZSB0aGUgZm9ybWF0IG9mIHRoZSB0cmFuc2FjdGlvbiBsb2csIG9yCisgICAgICAgICAgd2FudCB0byBleHRyYWN0IGNlcnRhaW4gaW5mb3JtYXRpb24gZnJvbSBpdDsgd3JpdGUgeW91ciBvd24KKyAgICAgICAgICBvdXRwdXQgZmlsdGVyLgorCisgICBMT0cgU0VTU0lPTiB7fCBscHIgLVBsYXNlcndyaXRlcn0KKyAgICAgICAgICBUaGlzIHNlbmRzIHRoZSBzZXNzaW9uIGxvZyB0byBhIHNwZWNpZmljIFVOSVggcHJpbnRlciwgcmF0aGVyCisgICAgICAgICAgdGhhbiB0byBhIGZpbGUuIE5vdGUgdGhlIGJyYWNlcyBhcm91bmQgdGhlIHBpcGVsaW5lLiBUaGVzZSBhcmUKKyAgICAgICAgICByZXF1aXJlZCBiZWNhdXNlIGl0IGNvbnRhaW5zIHNwYWNlcy4KKworICAgTE9HIERFQlVHIHt8IHRhaWwgLTEwMCA+IGRlYnVnLmxvZ30KKyAgICAgICAgICBUaGlzIGNhdXNlcyB0aGUgZGVidWcgbG9nIGZpbGUgdG8gY29udGFpbiBvbmx5IHRoZSBmaW5hbCAxMDAKKyAgICAgICAgICBsaW5lcy4gU3VwcG9zZSBDLUtlcm1pdCBjcmFzaGVzIHVuZGVyIHNvbWUgdW5wcmVkaWN0YWJsZQorICAgICAgICAgIGNpcmN1bXN0YW5jZXMsIGFuZCB5b3UgbmVlZCBhIGRlYnVnIGxvZyB0byBjYXRjaCBpdCBpbiB0aGUgYWN0LgorICAgICAgICAgIEJ1dCB0aGUgZGVidWcgbG9nIGNhbiBncm93IHRvIGh1Z2UgcHJvcG9ydGlvbnMgdmVyeSBxdWlja2x5LAorICAgICAgICAgIHBvc3NpYmx5IGZpbGxpbmcgdXAgdGhlIGRpc2suIFBpcGluZyB0aGUgZGVidWcgbG9nIHRocm91Z2gKKyAgICAgICAgICAidGFpbCIgcmVzdWx0cyBpbiBrZWVwaW5nIG9ubHkgdGhlIGxhc3QgMTAwIGxpbmVzIChvciBvdGhlcgorICAgICAgICAgIG51bWJlciBvZiB5b3VyIGNob2ljZSkuCisKKyAgIExPRyBERUJVRyB7fCBncmVwICJeVEVMTkVUIiA+IGRlYnVnLmxvZ30KKyAgICAgICAgICBUaGlzIG9uZSBzaG93cyBob3cgdG8gbG9nIG9ubHkgVGVsbmV0IG5lZ290aWF0aW9ucy4gUGlwaW5nIHRoZQorICAgICAgICAgIGRlYnVnIGxvZyB0aHJvdWdoIGdyZXAgb3IgZWdyZXAgbGV0cyB5b3UgbG9nIG9ubHkgc3BlY2lmaWMKKyAgICAgICAgICBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXZlcnl0aGluZy4gIm1hbiBncmVwIiBmb3IgZnVydGhlcgorICAgICAgICAgIGluZm8uCisKKyAgIExPRyBERUJVRyB7fCBnemlwIC1jID4gZGVidWcubG9nLmd6fQorICAgICAgICAgIENyZWF0ZXMgYSBmdWxsIGRlYnVnIGxvZywgYnV0IGNvbXByZXNzZWQgYnkgZ3ppcCB0byBzYXZlIHNwYWNlLgorCisgICBMT0cgUEFDS0VUUyB7fCB0ciAiXFwwMSIgIlgiIHwgY3V0IC1jOS0gPiBwYWNrZXQubG9nfQorICAgICAgICAgIFRoaXMgb25lIHdyaXRlcyB0aGUgcmVndWxhciBwYWNrZXQgbG9nLCBidXQgdHJhbnNsYXRlcyB0aGUKKyAgICAgICAgICBDdHJsLUEgdGhhdCBzdGFydHMgZWFjaCBwYWNrZXQgdG8gdGhlIGxldHRlciAiWCIgYW5kIHJlbW92ZXMKKyAgICAgICAgICB0aGUgcy1ubi1ubi0gbm90YXRpb24gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZS4gTm90ZSB0aGUKKyAgICAgICAgICBkb3VibGUgYmFja3NsYXNoIChub3JtYWwgS2VybWl0IHF1b3RpbmcgcnVsZXMpLiAibWFuIHRyIiBhbmQKKyAgICAgICAgICAibWFuIGN1dCIgZm9yIGZ1cnRoZXIgaW5mby4KKworICAgU2VlIFszNjFdU2VjdGlvbiAyLjEyIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV3IGNvbm5lY3Rpb24gbG9nLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEuMTQuIEF1dG9tYXRpYyBGaWxlLVRyYW5zZmVyIFBhY2tldCBSZWNvZ25pdGlvbiBhdCB0aGUgQ29tbWFuZCBQcm9tcHQKKworICAgQmVnaW5uaW5nIGluIHZlcnNpb24gNy4wLCBDLUtlcm1pdCBjYW4gcmVjb2duaXplIEtlcm1pdCAoYW5kIGluIHNvbWUKKyAgIGNhc2VzIGFsc28gWm1vZGVtKSBmaWxlLXRyYW5zZmVyIHBhY2tldHMgd2hpbGUgYXQgaXRzIGNvbW1hbmQgcHJvbXB0LgorICAgVGhpcyBpcyBjb252ZW5pZW50IChmb3IgZXhhbXBsZSksIGlmIHlvdSBlc2NhcGVkIGJhY2sgZnJvbSBhIHJlbW90ZQorICAgS2VybWl0IHByb2dyYW0gYW5kIHRvbGQgdGhlIGxvY2FsIEtlcm1pdCBwcm9ncmFtIHRvIHNlbmQgYSBmaWxlLCBidXQKKyAgIGZvcmdvdCB0byB0ZWxsIHRoZSByZW1vdGUgS2VybWl0IHByb2dyYW0gdG8gcmVjZWl2ZSBpdCAoYW5kIHRoZSBsb2NhbAorICAgS2VybWl0IGRpZCBub3QgaGF2ZSB0aGUgInNlbmQgYSBLZXJtaXQgcmVjZWl2ZSBjb21tYW5kIiBmZWF0dXJlCisgICBhdmFpbGFibGUpLiBUaGlzIGZlYXR1cmUgaXMgY29udHJvbGxlZCBieSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgIFNFVCBDT01NQU5EIEFVVE9ET1dOTE9BRCB7IE9OLCBPRkYgfQorICAgICAgICAgIFdoZW4gT04sIHdoaWNoIGlzIHRoZSBkZWZhdWx0LCB0aGUgY29tbWFuZCBwYXJzZXIgcmVjb2duaXplcworICAgICAgICAgIEtlcm1pdCBwYWNrZXRzIHdoZW4gS2VybWl0IGlzIGluIHJlbW90ZSBtb2RlLiBBbiBTIHBhY2tldCBtYWtlcworICAgICAgICAgIGl0IGdvIGludG8gcmVjZWl2ZSBtb2RlLCBhbiBJIHBhY2tldCBtYWtlcyBpdCBnbyBpbnRvIHNlcnZlcgorICAgICAgICAgIG1vZGUuIFdoZW4gT0ZGLCBwYWNrZXQgcmVjb2duaXRpb24gaXMgZGlzYWJsZWQgYW5kIHRoZSBiZWhhdmlvcgorICAgICAgICAgIHdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQgYXQgdGhlIGNvbW1hbmQgcHJvbXB0IGlzIGFzIGl0IHdhcyBpbgorICAgICAgICAgIEMtS2VybWl0IDYuMSBhbmQgZWFybGllciAobmFtZWx5IHRvIHByaW50IGFuIGVycm9yIG1lc3NhZ2UpLgorCisgICBDT01NQU5EIEFVVE9ET1dOTE9BRCBpcyB0aGUgY29tbWFuZC1tb2RlIGVxdWl2YWxlbnQgb2YgVEVSTUlOQUwKKyAgIEFVVE9ET1dOTE9BRCwgd2hpY2ggaXMgZWZmZWN0aXZlIGR1cmluZyBDT05ORUNUIG1vZGUuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMS4xNS4gVGhlIFRZUEUgQ29tbWFuZAorCisgICBUaGUgVFlQRSBjb21tYW5kIG5vdyBhY2NlcHRzIGEgc2VsZWN0aW9uIG9mIG9wdGlvbmFsIHN3aXRjaGVzCisgICAoWzM2Ml1TZWN0aW9uIDEuNSksIGFuZCBhbHNvIHNldHMgc2V2ZXJhbCB2YXJpYWJsZXMuCisKKyAgIFN5bnRheDogVFlQRSBbIHN3aXRjaGVzLi4uIF0gZmlsZW5hbWUKKworICAgVmFyaWFibGVzOgorCisgICBcdih0eV9sbikKKyAgICAgICAgICBMaW5lIG51bWJlciBvZiBjdXJyZW50IGxpbmUgKGR1cmluZyBUWVBFIGNvbW1hbmQ7IHNlZSAvUFJFRklYKQorCisgICBcdih0eV9sYykKKyAgICAgICAgICBMaW5lIGNvdW50IG9mIGZpbGUgbW9zdCByZWNlbnRseSBUWVBFZC4KKworICAgXHYodHlfbWMpCisgICAgICAgICAgTWF0Y2ggY291bnQgb2YgZmlsZSBtb3N0IHJlY2VudGx5IFRZUEVkIChzZWUgL01BVENIKS4KKworICAgU3dpdGNoZXM6CisKKyAgIC9QQUdFCisgICAgICAgICAgSWYgL1BBR0UgaXMgaW5jbHVkZWQsIEtlcm1pdCBwYXVzZXMgYXQgdGhlIGVuZCBvZiBlYWNoCisgICAgICAgICAgc2NyZWVuZnVsIGFuZCBpc3N1ZXMgYSAibW9yZT8iIHByb21wdC4gWW91IG1heSBwcmVzcyB0aGUgc3BhY2UKKyAgICAgICAgICBiYXIgdG8gdmlldyB0aGUgbmV4dCBwYWdlIChzY3JlZW5mdWwpLCBvciBwcmVzcyAicSIgb3IgIm4iIHRvCisgICAgICAgICAgcmV0dXJuIHRvIHRoZSBDLUtlcm1pdCBwcm9tcHQuIElmIHRoaXMgc3dpdGNoIGlzIGdpdmVuLCBpdAorICAgICAgICAgIG92ZXJyaWRlcyB0aGUgQ09NTUFORCBNT1JFLVBST01QVElORyBzZXR0aW5nIGZvciB0aGlzIGNvbW1hbmQKKyAgICAgICAgICBvbmx5LiBJZiBpdCBpcyBub3QgZ2l2ZW4sIHBhZ2luZyBpcyBhY2NvcmRpbmcgdG8gQ09NTUFORAorICAgICAgICAgIE1PUkUtUFJPTVBUSU5HLgorCisgICAvTk9QQUdFCisgICAgICAgICAgRG8gbm90IHBhdXNlIGF0IHRoZSBlbmQgb2YgZWFjaCBzY3JlZW5mdWw7IHNob3cgdGhlIHdob2xlIGZpbGUKKyAgICAgICAgICAob3IgYWxsIHNlbGVjdGVkIGxpbmVzKSBhdCBvbmNlLiBJZiB0aGlzIHN3aXRjaCBpcyBnaXZlbiwgaXQKKyAgICAgICAgICBvdmVycmlkZXMgdGhlIENPTU1BTkQgTU9SRS1QUk9NUFRJTkcgc2V0dGluZyBmb3IgdGhpcyBjb21tYW5kCisgICAgICAgICAgb25seS4gSWYgaXQgaXMgbm90IGdpdmVuLCBwYWdpbmcgaXMgYWNjb3JkaW5nIHRvIENPTU1BTkQKKyAgICAgICAgICBNT1JFLVBST01QVElORy4KKworICAgL0hFQURbOm5dCisgICAgICAgICAgT25seSBzaG93IHRoZSBmaXJzdCBuIGxpbmVzIG9mIHRoZSBmaWxlICh3aGVyZSBuIGlzIGEgbnVtYmVyKS4KKyAgICAgICAgICBJZiBuIGlzIG9taXR0ZWQsIDEwIGlzIHVzZWQuCisKKyAgIC9UQUlMWzpuXQorICAgICAgICAgIE9ubHkgc2hvdyB0aGUgbGFzdCBuIGxpbmVzIG9mIHRoZSBmaWxlICh3aGVyZSBuIGlzIGEgbnVtYmVyKS4KKyAgICAgICAgICBJZiBuaXMgb21pdHRlZCwgMTAgaXMgdXNlZC4gTm90ZTogL0hFQUQgYW5kIC9UQUlMIGNhbid0IGJlCisgICAgICAgICAgY29tYmluZWQ7IGlmIHlvdSBnaXZlIGJvdGggc3dpdGNoZXMsIG9ubHkgdGhlIG1vc3QgcmVjZW50IG9uZQorICAgICAgICAgIGlzIHVzZWQuCisKKyAgIC9NQVRDSDpwYXR0ZXJuCisgICAgICAgICAgT25seSB0eXBlIGxpbmVzIGZyb20gdGhlIGZpbGUgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcGF0dGVybiAoc2VlCisgICAgICAgICAgWzM2M11TZWN0aW9uIDQuOS4xIGZvciBwYXR0ZXJuIG5vdGF0aW9uKS4gVU5JWCB1c2VycyBmYW1pbGlhcgorICAgICAgICAgIHdpdGggZ3JlcCBzaG91bGQgbm90ZSBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2U6IHRoZXJlIGlzIG5vCisgICAgICAgICAgaW1wbGllZCAiKiIgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBwYXR0ZXJuLiBUaHVzOgorCisgIFRZUEUgL01BVENIOmZvbyAgICBMaXN0cyBsaW5lcyB3aG9zZSBlbnRpcmUgY29udGVudHMgYXJlICJmb28iLgorICBUWVBFIC9NQVRDSDpmb28qICAgTGlzdHMgbGluZXMgdGhhdCBzdGFydCB3aXRoICJmb28iLgorICBUWVBFIC9NQVRDSDoqZm9vICAgTGlzdHMgbGluZXMgdGhhdCBlbmQgd2l0aCAiZm9vIi4KKyAgVFlQRSAvTUFUQ0g6KmZvbyogIExpc3RzIGxpbmVzIHRoYXQgaGF2ZSAiZm9vIiBhbnl3aGVyZSBpbiB0aGVtLgorCisgICAgICAgICAgL0hFQUQgYW5kIC9UQUlMIGFwcGx5IGFmdGVyIC9NQVRDSCwgc28gInR5cGUgL3RhaWw6MjAKKyAgICAgICAgICAvbWF0Y2g6eCoiIHNob3dzIHRoZSBsYXN0IDIwIGxpbmVzIGluIHRoZSBmaWxlIHRoYXQgc3RhcnQgd2l0aAorICAgICAgICAgICJ4Ii4KKworICAgL1BSRUZJWDpzdHJpbmcKKyAgICAgICAgICBQcmludCB0aGUgZ2l2ZW4gc3RyaW5nIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lLiBUaGUKKyAgICAgICAgICBzdHJpbmcgbWF5IGJlIGEgY29uc3RhbnQsIGEgdmFyaWFibGUsIG9yIGEgcXVvdGVkIHZhcmlhYmxlLiBJZgorICAgICAgICAgIGl0J3MgYW4gdW5xdW90ZWQgdmFyaWFibGUsIGl0cyB2YWx1ZSBhdCB0aGUgdGltZSB0aGUgVFlQRQorICAgICAgICAgIGNvbW1hbmQgd2FzIGdpdmVuIGlzIHVzZWQgYXMgYSBjb25zdGFudC4gSWYgaXQgaXMgYSBxdW90ZWQKKyAgICAgICAgICB2YXJpYWJsZSwgaXQgaXMgcmUtZXZhbHVhdGVkIGZvciBlYWNoIGxpbmU7IGEgdXNlZnVsIHZhcmlhYmxlCisgICAgICAgICAgZm9yIHRoaXMgY29udGV4dCBpcyBcdih0eV9sbikgKHRoZSBsaW5lIG51bWJlciBvZiB0aGUgY3VycmVudAorICAgICAgICAgIGxpbmUgYmVpbmcgdHlwZWQpLiBJZiB0aGUgcHJlZml4IGlzIHRvIGluY2x1ZGUgc3BhY2VzLCBpdCBtdXN0CisgICAgICAgICAgYmUgZW5jbG9zZWQgaW4gYnJhY2VzLiBFeGFtcGxlczoKKworICAgICAgICB0eXBlIC9wcmVmaXg6e29vZmEudHh0OiB9IC9tYXRjaDoqdGhpbmcqIG9vZmEudHh0CisgICAgICAgICAgICAgICAgUHJpbnRzIGFsbCBsaW5lcyBpbiBvb2ZhLnR4dCB0aGF0IGNvbnRhaW4gInRoaW5nIiB3aXRoCisgICAgICAgICAgICAgICAgdGhlIGZpbGVuYW1lIGl0c2VsZiBhcyB0aGUgcHJlZml4IChzaW1pbGFyIHRvIFVOSVggZ3JlcCkuCisKKyAgICAgICAgdHlwZSAvcHJlZml4Ontcdih0aW1lKS4gfSBvb2ZhLnR4dAorICAgICAgICAgICAgICAgIFByZWZpeGVzIGVhY2ggbGluZSBvZiBvb2ZhLnR4dCB3aXRoIHRoZSB0aW1lIGF0IHdoaWNoIHRoZQorICAgICAgICAgICAgICAgIFRZUEUgY29tbWFuZCB3YXMgZ2l2ZW4gKG9uZSBiYWNrc2xhc2gpCisKKyAgICAgICAgdHlwZSAvcHJlZml4OntcXHYodGltZSkuIH0gb29mYS50eHQKKyAgICAgICAgICAgICAgICBQcmVmaXhlcyBlYWNoIGxpbmUgb2Ygb29mYS50eHQgd2l0aCB0aGUgdGltZSBhdCB3aGljaAorICAgICAgICAgICAgICAgIHRoYXQgbGluZSBpcyBiZWluZyB0eXBlZCAodHdvIGJhY2tzbGFzaGVzKS4KKworICAgICAgICB0eXBlIC9wcmVmaXg6e1xcdih0eV9sbikuIH0gb29mYS50eHQKKyAgICAgICAgICAgICAgICBQcmVmaXhlcyBlYWNoIGxpbmUgb2Ygb29mYS50eHQgd2l0aCBpdHMgbGluZSBudW1iZXIuCisKKyAgICAgICAgdHlwZSAvcHJlZml4OntcXGZscGFkKFxcdih0eV9sbiksNCkuIH0gb29mYS50eHQKKyAgICAgICAgICAgICAgICBTYW1lIGFzIHRoZSBwcmV2aW91cyBleGFtcGxlLCBleGNlcHQgdGhlIGxpbmUgbnVtYmVyIGlzCisgICAgICAgICAgICAgICAgcmlnaHQtYWRqdXN0ZWQgaW4gYSA0LWNvbHVtbiBmaWVsZC4KKworICAgL1dJRFRIWzpuXQorICAgICAgICAgIFRydW5jYXRlcyBlYWNoIGxpbmUgYXQgY29sdW1uIG4gKHdoaWNoIG11c3QgYmUgYSBudW1iZXIpIHByaW9yCisgICAgICAgICAgdG8gcHJpbnRpbmcgaXQuIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIGZvciBsb25nIGxpbmVzIHdoZW4geW91CisgICAgICAgICAgZG9uJ3Qgd2FudCB0aGVtIHRvIHdyYXAuIElmIG5pcyBvbWl0dGVkLCB5b3VyIGN1cnJlbnQgc2NyZWVuCisgICAgICAgICAgd2lkdGggaXMgdXNlZC4KKworICAgL0NPVU5UCisgICAgICAgICAgQ291bnRzIGxpbmVzIGFuZCAtLSBpZiAvTUFUQ0ggd2FzIGluY2x1ZGVkLCBtYXRjaGVzIC0tIGJ1dCBkb2VzCisgICAgICAgICAgbm90IHByaW50IGFueSBsaW5lcyBmcm9tIHRoZSBmaWxlLiBUaGUgbGluZSBhbmQgbWF0Y2ggY291bnQgaXMKKyAgICAgICAgICBzaG93biBhdCB0aGUgZW5kLCBhbmQgdGhlIHZhcmlhYmxlcyBcdih0eV9sYykgYW5kIFx2KHR5X2xtKSBhcmUKKyAgICAgICAgICBzZXQgYWNjb3JkaW5nbHkuCisKKyAgIFNFVCBPUFRJT05TIFRZUEUgeyAvUEFHRSwgL05PUEFHRSwgL1dJRFRIOm4gfQorICAgICAgICAgIFNldHMgdGhlIHBhZ2luZyBkZWZhdWx0IGZvciBUWVBFIGNvbW1hbmRzLCB3aGljaCBjYW4gYmUKKyAgICAgICAgICBvdmVycmlkZGVuIGluIGFueSBwYXJ0aWN1bGFyIFRZUEUgY29tbWFuZCBieSBpbmNsdWRpbmcgdGhlCisgICAgICAgICAgZGVzaXJlZCBzd2l0Y2guCisKKyAgIElmIGEgVFlQRSBjb21tYW5kIGlzIGdpdmVuIHdpdGggbm8gc3dpdGNoLCBhbmQgbm8gU0VUIE9QVElPTlMgVFlQRQorICAgc2VsZWN0aW9uIGlzIGluIGVmZmVjdCwgcGFnaW5nIGlzIGFjY29yZGluZyB0byB5b3VyIENPTU1BTkQKKyAgIE1PUkUtUFJPTVBUSU5HIHNldHRpbmcgKFNIT1cgQ09NTUFORCkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMS4xNi4gVGhlIFJFU0VUIENvbW1hbmQKKworICAgVGhlIFJFU0VUIGNvbW1hbmQsIGFkZGVkIGluIDcuMCwgY2xvc2VzIGFsbCBvcGVuIGZpbGVzIGFuZCBsb2dzLCBidXQKKyAgIGRvZXMgbm90IGFmZmVjdCB0aGUgb3BlbiBjb25uZWN0aW9uIChpZiBhbnkpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEuMTcuIFRoZSBDT1BZIGFuZCBSRU5BTUUgQ29tbWFuZHMKKworICAgQXMgb2YgQy1LZXJtaXQgNy4wLCBpbiB0aGUgVU5JWCB2ZXJzaW9uIG9ubHksIHRoZSBDT1BZIGFuZCBSRU5BTUUKKyAgIGNvbW1hbmRzIGFyZSBidWlsdCBpbiBhbmQgZG8gbm90IGNhbGwgdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0ncyBDT1BZCisgICBvciBSRU5BTUUgY29tbWFuZC4gVGhpcyBhbGxvd3MgdGhlbSB0byB3b3JrIGluICJOT1BVU0giIHZlcnNpb25zIGFuZAorICAgb3RoZXIgY2lyY3Vtc3RhbmNlcyB3aGVyZSBpdCBjYW4ndCBhY2Nlc3Mgc3lzdGVtIGNvbW1hbmRzLCBhbmQgaXQKKyAgIGFsbG93cyBmaWxlIGNvcHlpbmcgYW5kIHJlbmFtaW5nIHRvIGJlIGRvbmUgcG9ydGFibHkgaW4gc2NyaXB0cy4gVGhlCisgICBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGJ1aWx0LWluIENPUFkgb3IgUkVOQU1FIGluY2x1ZGU6CisgICAgICogSXQgZmFpbHMgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIGEgZGlyZWN0b3J5IG9yIGlzIHdpbGQgb3IgbGFja3MKKyAgICAgICByZWFkIGFjY2Vzcy4KKyAgICAgKiBJdCBmYWlscyBpZiB0aGUgc291cmNlIGZpbGUgaXMgdGhlIGRlc3RpbmF0aW9uIGZpbGUuCisgICAgICogSXQgYWxsb3dzIHRoZSBkZXN0aW5hdGlvbiBmaWxlIHRvIGJlIGEgZGlyZWN0b3J5LCBpbiB3aGljaCBjYXNlCisgICAgICAgdGhlIHNvdXJjZSBmaWxlIGlzIGNvcGllZCAob3IgcmVuYW1lZCkgaW50byBpdCB3aXRoIHRoZSBzYW1lIG5hbWUuCisgICAgICogSXQgb3ZlcndyaXRlcyBhbiBleGlzdGluZyBkZXN0aW5hdGlvbiBmaWxlIGlmIGl0cyBwZXJtaXNzaW9uCisgICAgICAgYWxsb3dzLgorICAgICAqIEl0IHNldHMgdGhlIG5ldyBmaWxlJ3MgcGVybWlzc2lvbiBhY2NvcmRpbmcgdG8gdW1hc2sgYnV0IGFsc28KKyAgICAgICBjYXJyaWVzIGZvcndhcmQgdGhlIHNvdXJjZSBmaWxlJ3MgZXhlY3V0ZSBwZXJtaXNzaW9uIGJpdHMgaWYgdGhlCisgICAgICAgZGVzdGluYXRpb24gZmlsZSBkaWQgbm90IGFscmVhZHkgZXhpc3QuCisgICAgICogSXQgZmFpbHMgaWYgaW50ZXJydXB0ZWQgYnkgQ3RybC1DLgorICAgICAqIFVwb24gZXJyb3IsIGl0IHByaW50cyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlLgorICAgICAqIEl0IHJldHVybnMgc3RhbmRhcmRpemVkIGVycm9yIGNvZGVzIHRoYXQgY2FuIGJlIHRlc3RlZCBieSBJRgorICAgICAgIFNVQ0NFU1MgLyBGQUlMLgorCisgICBUaGVzZSBjb21tYW5kcyBub3cgYWxzbyBhY2NlcHQgdGhlIGZvbGxvd2luZyBzd2l0Y2hlczoKKworICAvTElTVCAoL0xPRywgL1ZFUkJPU0UpICAgID0gUHJpbnQgImZpbGUxID0+IGZpbGUyIChPSykiIChvciBlcnJvciBtZXNzYWdlKS4KKyAgL05PTElTVCAoL05PTE9HLCAvUVVJRVQpICA9IERvbid0IHByaW50IGFueXRoaW5nIChleGNlcHQgZXJyb3IgbWVzc2FnZXMpLgorCisgICAvTk9MSVNUIGlzIHRoZSBkZWZhdWx0LgorCisgICBUaGUgc2FtZSBidWlsdC1pbiBjb2RlIGlzIHVzZWQgYnkgdGhlIFVOSVggQy1LZXJtaXQgc2VydmVyIHRvIGV4ZWN1dGUKKyAgIFJFTU9URSBDT1BZIGNvbW1hbmRzIChleGNlcHQgaW4gdGhpcyBjYXNlIG5vIHN3aXRjaGVzIGFyZSBhdmFpbGFibGUpLgorCisgICBUaGUgQ09QWSBjb21tYW5kIGFsc28gYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgc3dpdGNoZXMuIFdoZW4KKyAgIGFueSBvZiB0aGVzZSBhcmUgZ2l2ZW4gKGFuZCB0aGV5IGNhbiBiZSB1c2VkIGluIGFueSBjb21iaW5hdGlvbiBleGNlcHQKKyAgIC9TV0FQIGFuZCAvQVBQRU5EKSwgc29tZSBvZiB0aGUgY2hlY2tzIGxpc3RlZCBhYm92ZSBhcmUgcmVsYXhlZCwgYW5kCisgICB0aHVzIGl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIGdldCBpbnRvIHRyb3VibGUgaW4gY2VydGFpbiBjYXNlcywgZS5nLgorICAgd2hlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgZmlsZXMgYXJlIHRoZSBzYW1lIGZpbGU6CisKKyAgL0FQUEVORCAgICAgICAgICAgICAgICAgICA9IEFwcGVuZCBzb3VyY2UgZmlsZSB0byBkZXN0aW5hdGlvbiBmaWxlLgorICAvU1dBUC1CWVRFUyAgICAgICAgICAgICAgID0gU3dhcCBieXRlcyAoc2VlIFszNjRdU2VjdGlvbiA2LjYuNSkuCisgIC9GUk9NQjY0ICAgICAgICAgICAgICAgICAgPSBEZWNvZGUgdGhlIHNvdXJjZSBmaWxlIGZyb20gQmFzZTY0IGVuY29kaW5nLgorICAvVE9CNjQgICAgICAgICAgICAgICAgICAgID0gRW5jb2RlIHRoZSB0YXJnZXQgZmlsZSBpbiBCYXNlNjQuCisKKyAgIEJhc2U2NCBpcyB0aGUgZW5jb2RpbmcgY29tbW9ubHkgdXNlZCBmb3IgZW5jbG9zdXJlcyBpbiBJbnRlcm5ldCBlbWFpbC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxLjE4LiBUaGUgTUFOVUFMIENvbW1hbmQKKworICAgVGhlIE1BTlVBTCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgYXBwcm9wcmlhdGUgS2VybWl0IG1hbnVhbAorICAgb3Igb3RoZXIgbWFudWFsLiBUaGUgZ2VuZXJhbCBzeW50YXggaXM6CisKKyAgIE1BTlVBTCBbIHN0cmluZyBdCisgICAgICAgICAgSWYgdGhlIHN0cmluZyBpcyBvbWl0dGVkLCBDLUtlcm1pdCBhc2tzIHRoZSB1bmRlcmx5aW5nIHN5c3RlbQorICAgICAgICAgIHRvIGFjY2VzcyB0aGUgQy1LZXJtaXQgbWFudWFsIHVzaW5nIHdoYXRldmVyIG1ldGhvZCBpcworICAgICAgICAgIGFwcHJvcHJpYXRlIGZvciB0aGUgc3lzdGVtLgorCisgICBUaGUgc3BlY2lmaWMgYWN0aW9uIGRlcGVuZHMgb24gdGhlIHN5c3RlbS4gSW4gVU5JWCwgYSAibWFuIiBjb21tYW5kIGlzCisgICBpc3N1ZWQ7ICJrZXJtaXQiIGlzIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGJ1dCBvdGhlciBtYW51YWwgdG9waWNzIG1heQorICAgYmUgc3BlY2lmaWVkLiBJZiB0aGUgIm1hbiIgY29tbWFuZCBhbGxvd3MgaW5kZXggb3Igc3RyaW5nIHNlYXJjaGluZywKKyAgIHRoZSBhcHByb3ByaWF0ZSBzeW50YXggbWF5IGJlIGluY2x1ZGVkLgorCisgICBJbiBLZXJtaXQgOTUsIHRoZSBNQU5VQUwgY29tbWFuZCBicmluZ3MgdXAgdGhlIEhUTUwgb25saW5lIEs5NSBtYW51YWwuCisKKyAgIEluIFZNUyBhbmQgZWxzZXdoZXJlLCAibWFuIiBpcyBzaW1wbHkgdHJhbnNsYXRlZCB0byAiaGVscCIsIHdpdGggYQorICAgZGVmYXVsdCBhcmd1bWVudCBvZiAia2VybWl0Ijsgb3RoZXIgYW5kL29yIGFkZGl0aW9uYWwgYXJndW1lbnRzIG1heSBiZQorICAgaW5jbHVkZWQgYWNjb3JkaW5nIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzeXN0ZW0ncyAiaGVscCIgY29tbWFuZC4KKworICAgQ29ycmVjdCBvcGVyYXRpb24gb2YgdGhlICJtYW4iIGNvbW1hbmQgaW4gQy1LZXJtaXQgZGVwZW5kcyBvbiB0aGUKKyAgIGFwcHJvcHJpYXRlIG1hbiBwYWdlIG9yIGhlbHAgdG9waWMgaGF2aW5nIGJlZW4gaW5zdGFsbGVkIGluIHRoZSByaWdodAorICAgcGxhY2Ugd2l0aCB0aGUgcmlnaHQgcGVybWlzc2lvbnMgYW5kIGZvcm1hdC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxLjE5LiBTdHJpbmcgYW5kIEZpbGVuYW1lIE1hdGNoaW5nIFBhdHRlcm5zCisKKyAgIEEgcGF0dGVybiBpcyBhIHN0cmluZyB0aGF0IGluY2x1ZGVzIHNwZWNpYWwgbm90YXRpb24gZm9yIG1hdGNoaW5nCisgICBjbGFzc2VzIG9yIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzLiBDLUtlcm1pdCA3LjAgLyBLOTUgMS4xLjE5IHN1cHBvcnRzCisgICBwYXR0ZXJucyBpbiBzZXZlcmFsIHBsYWNlczoKKworICAgICAqIEZpbGVuYW1lcyAoWzM2NV1TZWN0aW9uIDQuOSkKKyAgICAgKiBTV0lUQ0ggY2FzZSBsYWJlbHMgKFszNjZdU2VjdGlvbiA3LjE4KQorICAgICAqIFRoZSBuZXcgSUYgTUFUQ0ggc3RhdGVtZW50IChbMzY3XVNlY3Rpb24gNy40KQorICAgICAqIFRZUEUgL01BVENIIChbMzY4XVNlY3Rpb24gMS4xNSkKKyAgICAgKiBTRVQgRklMRSBURVhULVBBVFRFUk5TIGFuZCBCSU5BUlktUEFUVEVSTlMgKFszNjldU2VjdGlvbiA0LjMpCisgICAgICogVGhlIFxmc2VhcmNoKCkgYW5kIFxmYXJyYXlsb29rKCkgZnVuY3Rpb25zIChbMzcwXVNlY3Rpb25zIDcuMyBhbmQKKyAgICAgICBbMzcxXTcuMTAuNykKKyAgICAgKiBUaGUgXGZwYXR0ZXJuKCkgZnVuY3Rpb24gdXNlZCB3aXRoIFtNLFJFXUlOUFVUIChbMzcyXVNlY3Rpb24gNy4xKQorCisgICBQYXR0ZXJucyBhcmUgYWxzbyBjYWxsZWQgd2lsZGNhcmRzLCBlc3BlY2lhbGx5IHdoZW4gdXNlZCBmb3IgZmlsZW5hbWUKKyAgIG1hdGNoaW5nLiBDLUtlcm1pdCdzIHBhdHRlcm4gc3ludGF4IGlzIGV4cGxhaW5lZCBpbiBbMzczXVNlY3Rpb24KKyAgIDQuOS4xLCBhbmQgYWxzbyBieSB0aGUgSEVMUCBXSUxEQ0FSRFMgY29tbWFuZC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxLjIwLiBNdWx0aXBsZSBDb21tYW5kcyBvbiBPbmUgTGluZQorCisgICBBcyBvZiBDLUtlcm1pdCA3LjAsIGNvbW1hbmRzIGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyIG9uIG9uZSBsaW5lIGJ5CisgICBzZXBhcmF0aW5nIHRoZSBjb21tYW5kcyB3aXRoIGNvbW1hcyBhbmQgZW5jbG9zaW5nIHRoZSBsaXN0IGluIGJyYWNlcy4KKyAgIEZvciBleGFtcGxlOgorCisgIEMtS2VybWl0PiB7IGVjaG8gT25lLCBlY2hvIFR3bywgZWNobyBUaHJlZSB9CisgIEMtS2VybWl0PiBkbyB7IGVjaG8gT25lLCBlY2hvIFR3bywgZWNobyBUaHJlZSB9CisKKyAgIENvbW1hbmQgbGlzdHMgY2FuIGJlIG5lc3RlZDoKKworICBbIGRvIF0geyBlY2hvIE9uZSwgZWNobyBUd28sIGlmIHRydWUgeyBlY2hvIEEsIGVjaG8gQn0sIGVjaG8gVGhyZWUgfQorCisgICBhbmQgdGhlIEVORCBjb21tYW5kIHdvcmtzIGFzIGl0IGRvZXMgaW4gbWFjcm9zOgorCisgIFsgZG8gXSB7IGVjaG8gT25lLCBlY2hvIFR3bywgaWYgdHJ1ZSBlbmQsIGVjaG8gVGhyZWUgfQorCisgICBUaGUgIm9uZSBsaW5lIiBzdHJpY3R1cmUgaXMsIG9mIGNvdXJzZSwgcGxpYW50IHRvIGxpbmUtY29udGludWF0aW9uCisgICBjb252ZW50aW9ucywgbmFtZWx5IHRoYXQgbGluZXMgZW5kaW5nIGluIGh5cGhlbiAoLSkgb3IgbGVmdCBicmFjZSAoeykKKyAgIGFyZSB0byBiZSBjb250aW51ZWQuIFRodXMgdGhlIGZpcnN0IGV4YW1wbGUgY2FuIGFsc28gYmUgcmVuZGVyZWQ6CisKKyAgWyBkbyBdIHsKKyAgICAgIGVjaG8gT25lCisgICAgICBlY2hvIFR3bworICAgICAgZWNobyBUaHJlZQorICB9CisKKyAgICh0aGUgImRvIiBpcyBvcHRpb25hbCkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMS4yMS4gV2hhdCBEbyBJIEhhdmU/CisKKyAgIEMtS2VybWl0IGNhbiBiZSBidWlsdCBmb3IgaHVuZHJlZHMgb2YgZGlmZmVyZW50IHBsYXRmb3JtcyB3aXRoCisgICBwcmFjdGljYWxseSBjb3VudGxlc3MgY29uZmlndXJhdGlvbiBvcHRpb25zLiBDZXJ0YWluIGNvbW1hbmRzIG1pZ2h0CisgICBub3QgYmUgYXZhaWxhYmxlIGluIGNlcnRhaW4gY29uZmlndXJhdGlvbnMsIGV0Yy4gRXZlbiBvbiB0aGUgc2FtZQorICAgcGxhdGZvcm0sIGRpZmZlcmVudCBidWlsZHMgYXJlIHBvc3NpYmxlOiAibWF4aW11bSBmdW5jdGlvbmFsaXR5IiwKKyAgICJtaW5pbXVtIHNpemUiLCAibWF4aW11bSBwZXJmb3JtYW5jZSIsIGFuZCBzbyBvbi4gWW91IGNhbiBmaW5kIG91dCBhCisgICBsb3QgYWJvdXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgeW91ciBDLUtlcm1pdCBwcm9ncmFtIHdpdGggdGhlIFNIT1cKKyAgIEZFQVRVUkVTIGNvbW1hbmQuIE9mIGNvdXJzZSwgYSBsb3Qgb2Ygd2hhdCBpdCBzYXlzLCBlc3BlY2lhbGx5IGluIHRoZQorICAgYm90dG9tIHBhcnQsIG1pZ2h0IHNlZW0gbGlrZSBnaWJiZXJpc2gsIGJ1dCBjYW4gYmUgZGVjaXBoZXJlZCB3aXRoIGEKKyAgIFJvc2V0dGEgU3RvbmUgKHN1Y2ggYXMgdGhlIEMtS2VybWl0IHNvdXJjZSBvciB0aGUgWzM3NF1ja2NjZmcudHh0CisgICBmaWxlKS4gSW4gYW55IGNhc2UsIHRoZSBvdXRwdXQgZnJvbSBTSE9XIEZFQVRVUkVTIG1pZ2h0IGVhc2lseSBleHBsYWluCisgICB3aHkgc29tZSBleHBlY3RlZCBmZWF0dXJlIGlzIG1pc3NpbmcsIG9yIHNvbWUgYnVmZmVyIGlzIHNtYWxsZXIgdGhhbgorICAgZXhwZWN0ZWQuIEhlcmUncyBhIHNhbXBsZSBvZiB0aGUgYm90dG9tIHNlY3Rpb24gZm9yIHRoZSBTdW5PUyB2ZXJzaW9uOgorCitDLUtlcm1pdCA3LjAuMTk2LCAxIEphbiAyMDAwCisKK01ham9yIG9wdGlvbmFsIGZlYXR1cmVzIGluY2x1ZGVkOgorIE5ldHdvcmsgc3VwcG9ydCAodHlwZSBTSE9XIE5FVCBmb3IgZnVydGhlciBpbmZvKQorIFRlbG5ldCBLZXJtaXQgT3B0aW9uCisgSGFyZHdhcmUgZmxvdyBjb250cm9sCisgRXh0ZXJuYWwgWFlaTU9ERU0gcHJvdG9jb2wgc3VwcG9ydAorIExhdGluLTEgKFdlc3QgRXVyb3BlYW4pIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24KKyBMYXRpbi0yIChFYXN0IEV1cm9wZWFuKSBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uCisgQ3lyaWxsaWMgKFJ1c3NpYW4sIFVrcmFpbmlhbiwgZXRjKSBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uCisgR3JlZWsgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbgorIEhlYnJldyBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uCisgSmFwYW5lc2UgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbgorIFVuaWNvZGUgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbgorIFBzZXVkb3Rlcm1pbmFsIGNvbnRyb2wKKyBSRURJUkVDVCBjb21tYW5kCisgUkVTRU5EIGNvbW1hbmQKKyBGdWxsc2NyZWVuIGZpbGUgdHJhbnNmZXIgZGlzcGxheQorIENvbnRyb2wtY2hhcmFjdGVyIHVucHJlZml4aW5nCisgU3RyZWFtaW5nCisgQXV0b2Rvd25sb2FkCisKK01ham9yIG9wdGlvbmFsIGZlYXR1cmVzIG5vdCBpbmNsdWRlZDoKKyBObyBLZXJiZXJvcyhUTSkgYXV0aGVudGljYXRpb24KKyBObyBTUlAoVE0pIChTZWN1cmUgUmVtb3RlIFBhc3N3b3JkKSBwcm90b2NvbAorIE5vIFNlY3VyZSBTb2NrZXRzIExheWVyIChTU0wpIHByb3RvY29sCisgTm8gVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIHByb3RvY29sCisgTm8gZW5jcnlwdGlvbgorIE5vIFggV2luZG93cyBmb3J3YXJkaW5nCisKK0hvc3QgaW5mbzoKKyBNYWNoaW5lOiAgICBzdW40bQorIE1vZGVsOiAgICAgICh1bmtub3duKQorIE9TOiAgICAgICAgIFN1bk9TCisgT1MgUmVsZWFzZTogNC4xLjNfVTEKKyBPUyBWZXJzaW9uOiA0CisKK1RhcmdldDogc3Vub3M0MWdzYworR0NDIHZlcnNpb246IDIuNy4yCitDb21waWxlZCBEZWMgMzEgMTk5OSAxMDozODo1NCwgb3B0aW9uczoKKyBfX0dOVUNfXyBfX1NURENfXyBfUE9TSVhfSk9CX0NPTlRST0wgX1NDX0pPQl9DT05UUk9MIEFSUkFZUkVGTEVOPTEwMjQgQklHQlVGT0sKKyBCUk9XU0VSIEJTRDQgQ0tfQU5TSUMgQ0tfQVBDIENLX0FVVE9ETCBDS19DVVJTRVMgQ0tfRE5TX1NSViBDS19FTlZJUk9OTUVOVAorIENLX0ZBU1QgQ0tfTE9HSU4gQ0tfTUtESVIgQ0tfTkFXUyBDS19QQ1RfQkFSIENLX1BFUk1TIENLX1JFQ0FMTCBDS19SVFNDVFMKKyBDS19TUEVFRCBDS19USU1FUlMgQ0tfVE1QRElSIENLX1RUR1dTSVogQ0tfVFRZRkQgQ0tfV1JFRlJFU0ggQ0tFWEVDCisgQ0tGTE9BVD1kb3VibGUgQ0tHSE5MSE9TVCBja21heGZpbGVzPTY0IENLTUFYT1BFTj02NCBDS01BWFBBVEg9MTAyMyBDS1JFQUxQQVRICisgQ0tSRUdFWCBDS1NZU0xPRyBDS1RVTklORyBDTURCTD0zMjc2MyBDTURERVA9NjQgQ09OR1NQRCBEQ01EQlVGIERJUkVOVCBEWU5BTUlDCisgRk5GTE9BVCBGT1JERVBUSD0zMiBHRlRJTUVSIEhBRERSTElTVCBIREJVVUNQIElGREVCVUcgSUtTX09QVElPTiBJS1NEQgorIElLU0RDT05GIElOQlVGU0laRT0zMjc2OCBJTlBCVUZTSVo9NDA5NiBNQUNfTUFYPTE2Mzg0IE1BQ0xFVkVMPTEyOCBNQVhERElSPTMyCisgTUFYRE5VTVM9NDA5NSBNQVhHRVRQQVRIPTEyOCBNQVhUQUtFPTU0IE1BWFdMRD0xMDI0MDAgTVNFTkRNQVg9MTAyNCBORVRDTUQKKyBORVRDT05OIE5FVFBUWSBOT0tWRVJCUyBOT1NFVEJVRiBPQlVGU0laRT0zMjc2OCBQQVJTRU5TRSBQQVRURVJOUyBQSVBFU0VORAorIFJFTkFNRSBSTE9HQ09ERSBTQVZFRFVJRCBTRUxFQ1QgU0lHX1YgU09MX1NPQ0tFVCBzcGFyYyBTVFJFQU1JTkcgc3VuIFNVTk9TNAorIFNZU1RJTUVIIFRDUFNPQ0tFVCBUSU1FSCBUTE9HIFROQ09ERSBUVExFQlVGIFRUU1BETElTVCBVSURCVUZMRU49MjU2IFVOSVgKKyBVTlBSRUZJWFpFUk8gVVNFX0xTVEFUIFVTRV9NRU1DUFkgVk5BTUw9NDA5NiBXSEFUQU1JIFhGUkNBTiBaX01BWENIQU49NDYKKyB6X21heGNoYW49NDYgWlhSRVdJTkQKKworIGJ5dGUgb3JkZXI6IGJpZyBlbmRpYW4KKworIHNpemVvZnM6IGludD00IGxvbmc9NCBzaG9ydD0yIGNoYXI9MSBjaGFyKj00IGZsb2F0PTQgZG91YmxlPTgKKworIGZsb2F0aW5nLXBvaW50OiBwcmVjaXNpb249MTYgcm91bmRpbmc9MQorCisgICBXaXRob3V0IGdvaW5nIGludG8gZGV0YWlsIGFib3V0IHdoYXQgYWxsIHRoZSBub3RhdGlvbiBtZWFucywgbm90aWNlIGEKKyAgIGNvdXBsZSB0aGluZ3M6CisKKyAgICAgKiBUaGUgT3B0aW9ucyBzZWN0aW9uIHNob3dzIHN5bWJvbHMgKCJtYWNyb3MiKSBpbiBlZmZlY3QgZHVyaW5nCisgICAgICAgY29tcGlsYXRpb24sIHRvZ2V0aGVyIHdpdGggdGhlaXIgdmFsdWVzIChmb3IgdGhvc2UgdGhhdCBoYXZlCisgICAgICAgdmFsdWVzKS4gVGhlIG9wdGlvbnMgYXJlIGxpc3RlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIgdG8gbWFrZSBhbnkKKyAgICAgICBwYXJ0aWN1bGFyIG9wdGlvbiBlYXNpZXIgdG8gZmluZC4KKyAgICAgKiBNQVhXTEQgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRoYXQgYSB3aWxkY2FyZCBjYW4gZXhwYW5kCisgICAgICAgdG8uCisgICAgICogQW55dGhpbmcgc3RhcnRpbmcgd2l0aCAiTk8iIGlzIGEgZmVhdHVyZSAob3Igc29tZXRoaW5nIG90aGVyIHRoYW4KKyAgICAgICBhIGZlYXR1cmUpIHRoYXQgaGFzIGJlZW4gZGVsaWJlcmF0ZWx5ICJjb21waWxlZCBvdXQiLCBvciBvbWl0dGVkLgorICAgICAqIEltcG9ydGFudCBpdGVtcyBmb3Igc2NyaXB0IHdyaXRlcnMgaW5jbHVkZTogQ01EQkw9MzI3NjMgKHRoZSBzaXplCisgICAgICAgb2YgdGhlIGNvbW1hbmQgYnVmZmVyIGFuZCB0aGVyZWZvcmUgdGhlIG1heGltdW0gbGVuZ3RoIGZvciBhIG1hY3JvCisgICAgICAgb3IgdmFyaWFibGUgZGVmaW5pdGlvbjsgQ01EREVQPTY0ICh0aGUgbGltaXQgb24gcmVjdXJzaW9uIGRlcHRoKTsKKyAgICAgICBGT1JERVBUSD0zMiAodGhlIG5lc3RpbmcgbGltaXQgb24gRk9SIGxvb3BzKTsgSU5CVUZTSVpFPTMyNzY4ICh0aGUKKyAgICAgICBzaXplIG9mIHRoZSBJTlBVVCBjb21tYW5kIGNpcmN1bGFyIGJ1ZmZlcik7IE1BQ19NQVg9MTYzODQgKHRoZQorICAgICAgIG1heGltdW0gbnVtYmVyIG9mIG1hY3JvcyksIGV0Yy4KKworICAgU2VlIHRoZSBbMzc1XWNrY2NmZy50eHQgZmlsZSBmb3IgZGV0YWlscy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxLjIyLiBHZW5lcmFsaXplZCBGaWxlIElucHV0IGFuZCBPdXRwdXQKKworICAgQy1LZXJtaXQgNy4wIGFkZHMgYSBuZXcgZ2VuZXJhbGl6ZWQgSS9PIHN5c3RlbSBmb3Igc3RyZWFtIGZpbGVzLAorICAgYXVnbWVudGluZyAoYW5kIHRvIHNvbWUgZXh0ZW50LCBvdmVybGFwcGluZyB3aXRoKSB0aGUgb2xkZXIgT1BFTiwKKyAgIFJFQUQsIFdSSVRFLCBhbmQgQ0xPU0UgY29tbWFuZHMuIEluIHRoZSBuZXcgZmlsZSBpL28gc3lzdGVtLCB3aGljaCBjYW4KKyAgIGJlIHVzZWQgc2ltdWx0YW5lb3VzbHkgd2l0aCB0aGUgb2xkIG9uZSwgYWxsIGNvbW1hbmRzIGFyZSBncm91cGVkCisgICB0b2dldGhlciB1bmRlciB0aGUgbmV3IEZJTEUga2V5d29yZCwgYW5kIHNvbWUgcmVsYXRlZCBmdW5jdGlvbnMgYW5kCisgICB2YXJpYWJsZXMgYXJlIGFkZGVkLgorCisgICAgMS4yMi4xLiBXaHkgQW5vdGhlciBJL08gU3lzdGVtPworCisgICBUaGUgd2VsbC1rbm93biBMT0csIE9QRU4sIFJFQUQsIFdSSVRFLCBhbmQgQ0xPU0UgY29tbWFuZHMgaGF2ZSB0aGUKKyAgIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgICAxLiBPbmx5IG9uZSBSRUFEIGZpbGUgYW5kIG9uZSBXUklURSBmaWxlIGNhbiBiZSBvcGVuIGF0IGEgdGltZS4KKyAgICAyLiBUaGUgUkVBRCBhbmQgV1JJVEUgY29tbWFuZHMgYXJlIHN0cmljdGx5IGxpbmUgb3JpZW50ZWQuCisgICAgMy4gVGhlc2UgY29tbWFuZHMgY2FuIG5vdCBiZSB1c2VkIHdpdGggYmluYXJ5IGZpbGVzLgorICAgIDQuIFRoZXkgZG8gbm90IHN1cHBvcnQgcmVhZC93cml0ZSBhY2Nlc3Mgb3IgcmFuZG9tIGFjY2Vzcy4KKyAgICA1LiBUaGUgc3ludGF4IGlzIGEgYml0IGNvdW50ZXJpbnR1aXRpdmUgZm9yIHByb2dyYW1tZXJzLgorCisgICBUaGUgbmV3IGZpbGUgaS9vIHN5c3RlbSBhbGxvd3MgbXVsdGlwbGUgZmlsZXMgdG8gYmUgb3BlbiBhdCBvbmNlLCBpbgorICAgYW55IGRlc2lyZWQgY29tYmluYXRpb24gb2YgbW9kZXMgKHJlYWQvd3JpdGUvYXBwZW5kKSBzdXBwb3J0ZWQgYnkgdGhlCisgICBvcGVyYXRpbmcgc3lzdGVtLCBmb3IgbGluZSwgYmxvY2sgKHJlY29yZCksIG9yIGNoYXJhY3RlciBpL28sIGZvcgorICAgc2VxdWVudGlhbCBvciByYW5kb20gYWNjZXNzLCB1c2luZyBjb25zaXN0ZW50IHN5bnRheCBhbmQgY29udmVudGlvbnMuCisKKyAgIFRoZSBuZXcgc3lzdGVtLCBob3dldmVyLCBkb2VzIG5vdCByZXBsYWNlIHRoZSBvbGQgb25lLCBzaW5jZSB0aGUgb2xkCisgICBzeXN0ZW0gc3RpbGwgbXVzdCBiZSB1c2VkIGZvcjoKKworICAgIDEuIFRoZSBzZXNzaW9uLCBwYWNrZXQsIGRlYnVnLCB0cmFuc2FjdGlvbiwgYW5kIGNvbm5lY3Rpb24gbG9ncy4KKyAgICAyLiBSZWFkaW5nIGFuZCB3cml0aW5nIGNvbW1hbmRzIHJhdGhlciB0aGFuIGZpbGVzLgorICAgIDMuIEV4aXN0aW5nIHNjcmlwdHMuCisKKyAgIFRoZSBuZXcgc3lzdGVtIHdvcmtzIG9ubHkgd2l0aCByZWd1bGFyIGZpbGVzLCBub3Qgd2l0aCBjb21tYW5kcyBvcgorICAgcGlwZXMgb3IgbWFpbGJveGVzIG9yIHBzZXVkb3Rlcm1pbmFscy4gTm8gc3BlY2lhbCBwcm92aXNpb25zIGFyZSBtYWRlCisgICBpbiB0aGUgRklMRSBjb21tYW5kcyBmb3IgaGFuZGxpbmcgZGV2aWNlcyBvciBuZXR3b3JrIGNvbm5lY3Rpb25zLCBub3IKKyAgIGZvciBwcmV2ZW50aW5nIHlvdSBmcm9tIHRyeWluZyB0byBvcGVuIHRoZW07IGlmIHRoZSB1bmRlcmx5aW5nCisgICBvcGVyYXRpbmcgc3lzdGVtIHRyZWF0cyB0aGVtIGxpa2UgcmVndWxhciBzdHJlYW0gZGlzayBmaWxlcywgdGhlIEZJTEUKKyAgIGNvbW1hbmRzIChleGNlcHQsIG9mIGNvdXJzZSBTRUVLLCBSRVdJTkQsIGFuZCBDT1VOVCkgbWlnaHQgd29yayB3aXRoCisgICB0aGVtLiAoSW4gQyBwcm9ncmFtbWluZyB0ZXJtcywgdGhlIEZJTEUgY29tbWFuZHMgYXJlLCBhdCBwcmVzZW50LAorICAgbm90aGluZyBtb3JlIHRoYW4gYSBmcm9udCBlbmQgdG8gZm9wZW4oKSAvIGZyZWFkKCkgLyBmd3JpdGUoKSAvCisgICBmY2xvc2UoKSBhbmQgZnJpZW5kcywgd2hpY2ggYXJlIGEgcG9ydGFibGUgQVBJIHRvIHNlcXVlbnRpYWwgZmlsZXMsCisgICBidXQgdGhpcyBtaWdodCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSBmb3IgcGxhdGZvcm1zIGxpa2UgVk1TIGFuZCBWT1MKKyAgIHRoYXQgaGF2ZSBtb3JlIGNvbXBsaWNhdGVkIGZpbGUgc3lzdGVtcy4pCisKKyAgIERlZmluaXRpb25zOgorCisgICBDaGFubmVsCisgICAgICAgICAgQSBudW1iZXIgYXNzaWduZWQgdG8gYSBmaWxlIHdoZW4gaXQgaXMgb3BlbmVkLCBieSB3aGljaCBpdCBtdXN0CisgICAgICAgICAgYmUgcmVmZXJyZWQgdG8gaW4gYWxsIGlucHV0L291dHB1dCBvcGVyYXRpb25zLgorCisgICBSZWFkL1dyaXRlIFBvaW50ZXIKKyAgICAgICAgICBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiBhbiBvcGVuIGZpbGUsIGV4cHJlc3NlZCBhcyB0aGUgMC1iYXNlZAorICAgICAgICAgIGJ5dGUgY291bnQgZnJvbSB0aGUgYmVnaW5uaW5nLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMS4yMi4yLiBUaGUgRklMRSBDb21tYW5kCisKKyAgIEZJTEUga2V5d29yZCBbIHN3aXRjaGVzIF0gY2hhbm5lbCBbIGRhdGEgXQorICAgICAgICAgIFRoZSBrZXl3b3JkIHNwZWNpZmllcyB0aGUgZnVuY3Rpb246IEZJTEUgT1BFTiwgRklMRSBSRUFELCBGSUxFCisgICAgICAgICAgV1JJVEUsIEZJTEUgQ0xPU0UsIGV0Yy4gRm9yIGNvbnZlbmllbmNlIChhbmQgZm9yIGZhbWlsaWFyaXR5IHRvCisgICAgICAgICAgQyBwcm9ncmFtbWVycyksIHRoZSB0d28td29yZCBGSUxFIGNvbW1hbmRzIGNhbiBiZSBzaG9ydGVuZWQgdG8KKyAgICAgICAgICB0aGUgc2luZ2xlIHdvcmRzIEZPUEVOLCBGUkVBRCwgRldSSVRFLCBGQ0xPU0UsIGFuZCBzbyBvbi4KKyAgICAgICAgICBTd2l0Y2hlcyBhcmUgb3B0aW9uYWwsIGFuZCBtb2RpZnkgb3IgYW1wbGlmeSB0aGUgcmVxdWVzdGVkIGZpbGUKKyAgICAgICAgICBmdW5jdGlvbi4KKworICAgQXMgaW4gQywgRm9ydHJhbiwgYW5kIG90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlcywgb3BlbiBmaWxlcyBhcmUKKyAgIHJlZmVycmVkIHRvIGJ5ICJjaGFubmVscyIsIGludGVnZXJzIHN1Y2ggYXMgMCwgMSwgMiwgMywgYW5kIHNvIG9uLiBBCisgICBjaGFubmVsIG51bWJlciBpcyBhc3NpZ25lZCB3aGVuIHlvdSBvcGVuIGEgZmlsZS4gVGhlIG51bWJlciBvZgorICAgYXZhaWxhYmxlIGNoYW5uZWxzIGRlcGVuZHMgb24gdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGNhbgorICAgYmUgc2VlbiBpbiB0aGUgdmFyaWFibGU6CisKKyAgXHYoZl9tYXgpCisKKyAgIG9yIGJ5IGdpdmluZyB0aGUgRklMRSBMSVNUIChGTElTVCkgY29tbWFuZC4gQ2hhbm5lbHMgYXJlIGRpc2N1c3NlZCBpbgorICAgZ3JlYXRlciBkZXRhaWwgaW4gWzM3Nl1TZWN0aW9uIDEuMjIuNC4KKworICAgRklMRSBjb21tYW5kIGVycm9ycyBjYW4gYmUgY2F1Z2h0IHdpdGggSUYgRkFJTCBhZnRlciB0aGUgRklMRSBjb21tYW5kLgorICAgSW4gYWRkaXRpb24sIHRoZSBcdihmX2Vycm9yKSB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlIGNvbXBsZXRpb24gY29kZSBvZgorICAgdGhlIGNvbW1hbmQ6IDAgaWYgbm8gZXJyb3IsIG9yIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZXJlIHdhcyBhbgorICAgZXJyb3IuIFRoZSBlcnJvciBjb2RlcyBhcmUgbGlzdGVkIGluIFszNzddU2VjdGlvbiAxLjIyLjUuCisKKyAgIFRoZSBjb21tYW5kIHRvIG9wZW4gYSBmaWxlIGlzOgorCisgICBGSUxFIE9QRU4gWyBzd2l0Y2hlcyBdIHZhcmlhYmxlIGZpbGVuYW1lCisgICAgICAgICAgT3BlbnMgYSBmaWxlIGZvciB0aGUgdHlwZSBvZiBhY2Nlc3Mgc3BlY2lmaWVkIGJ5IHRoZSBzd2l0Y2hlcywKKyAgICAgICAgICBvciBmb3IgcmVhZC1vbmx5IGFjY2VzcyBpZiBubyBzd2l0Y2hlcyBhcmUgZ2l2ZW4uIFVwb24gc3VjY2VzcywKKyAgICAgICAgICBhIGNoYW5uZWwgbnVtYmVyIGlzIGFzc2lnbmVkIHRvIHRoaXMgZmlsZSBhbmQgc3RvcmVkIGluIHRoZQorICAgICAgICAgIGdpdmVuIHZhcmlhYmxlIHNvIHlvdSBjYW4gcmVmZXIgdG8gdGhlIG9wZW4gZmlsZSBpbiBzdWJzZXF1ZW50CisgICAgICAgICAgaS9vIGNvbW1hbmRzLiBJZiB0aGUgZmlsZSBjYW4gbm90IGJlIG9wZW5lZCwgdGhlIEZJTEUgT1BFTgorICAgICAgICAgIGNvbW1hbmQgZmFpbHMuIFN5bm9ueW06IEZPUEVOLgorCisgICBUaGUgRklMRSBPUEVOIHN3aXRjaGVzIGFyZToKKworICAgL1JFQUQKKyAgICAgICAgICBPcGVuIHRoZSBmaWxlIGZvciByZWFkIGFjY2Vzcy4gSWYgbm8gc3dpdGNoZXMgYXJlIGdpdmVuLCAvUkVBRAorICAgICAgICAgIGlzIGFzc3VtZWQuIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGNhbid0IGJlIG9wZW5lZCBmb3IKKyAgICAgICAgICByZWFkIGFjY2VzcywgdGhlIEZJTEUgT1BFTiBjb21tYW5kIGZhaWxzLgorCisgICAvV1JJVEUKKyAgICAgICAgICBBbGxvdyB3cml0aW5nLiBJZiBhIGZpbGUgb2YgdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgaXQgaXMKKyAgICAgICAgICBvdmVyd3JpdHRlbiB1bmxlc3MgL1JFQUQgb3IgL0FQUEVORCBpcyBhbHNvIGluY2x1ZGVkLiBJZiBhIGZpbGUKKyAgICAgICAgICBvZiB0aGUgZ2l2ZW4gbmFtZSBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZC4KKworICAgL0FQUEVORAorICAgICAgICAgIEVxdWl2YWxlbnQgdG8gL1dSSVRFLCBleGNlcHQgdGhhdCBpZiB0aGUgZmlsZSBleGlzdHMsIGl0IGlzIG5vdAorICAgICAgICAgIGRlc3Ryb3llZC4gVGhlIHJlYWQvd3JpdGUgcG9pbnRlciBpcyBzZXQgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgICBmaWxlLCBzbyB1bmxlc3MgeW91IGNoYW5nZSBpdCB3aXRoIEZJTEUgU0VFSyBvciBSRVdJTkQgKHNlZQorICAgICAgICAgIGJlbG93KSwgdGhlIGZpcnN0IEZJTEUgV1JJVEUgY29tbWFuZCBhZGRzIHRvIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAgZmlsZSwgcHJlc2VydmluZyB3aGF0IHdhcyB0aGVyZSBhbHJlYWR5LiBJZiAvV1JJVEUgaXMgYWxzbworICAgICAgICAgIGdpdmVuLCBpdCBpcyBpZ25vcmVkLgorCisgICAvQklOQVJZCisgICAgICAgICAgT3BlbiB0aGUgZmlsZSBpbiAiYmluYXJ5IiBtb2RlLCByYXRoZXIgdGhhbiB0ZXh0IG1vZGUuIFRoaXMKKyAgICAgICAgICBzd2l0Y2ggaXMgbWVhbmluZ2xlc3MgKGJ1dCBzdGlsbCBjYW4gYmUgdXNlZCkgaW4gVU5JWC4gSW4gVk1TLAorICAgICAgICAgIFdpbmRvd3MsIGFuZCBPUy8yLCBpdCBpbmhpYml0cyBlbmQtb2YtbGluZSBwcm9jZXNzaW5nIGFuZAorICAgICAgICAgIGNvbnZlcnNpb24sIGFuZCBzbyBzaG91bGQgYmUgdXNlZCBmb3IgYmluYXJ5IGZpbGVzIGFuZC9vciBmaWxlcworICAgICAgICAgIHRoYXQgYXJlIHRvIGJlIGFjY2Vzc2VkIGluIHJlY29yZCBvciBjaGFyYWN0ZXIgbW9kZSByYXRoZXIgdGhhbgorICAgICAgICAgIGxpbmUgYnkgbGluZS4KKworICAgVGhlIHZhcmlhYmxlIGZvciB0aGUgY2hhbm5lbCBudW1iZXIgY2FuIGJlIGFueSBraW5kIG9mIHZhcmlhYmxlOiB0aGUKKyAgIFwleCBraW5kLCBhIG1hY3JvIG5hbWUsIG9yIGFuIGFycmF5IGVsZW1lbnQuIEJ1dCBpdCBtdXN0IGJlIGEKKyAgIHZhcmlhYmxlLCBub3QgYSBudW1iZXIgLS0gQy1LZXJtaXQgYXNzaWducyB0aGUgY2hhbm5lbCBudW1iZXI7IHlvdQorICAgY2FuJ3QgdGVsbCBpdCB3aGF0IG51bWJlciB0byB1c2UuCisKKyAgIEV4YW1wbGU6CisKKyAgRklMRSBPUEVOIFwlYyBvb2ZhLnR4dCAgICAgICAgICAgICAgICAgIDsgT3BlbiBvb2ZhLnR4dCBmb3IgcmVhZGluZy4KKyAgSUYgRkFJTCBleGl0IDEgQ2FuJ3Qgb3BlbiBvb2ZhLnR4dCAgICAgIDsgQWx3YXlzIGNoZWNrIHRvIHNlZSBpZiBpdCB3b3JrZWQuCisgIEVDSE8gb29mYS50eHQ6IGNoYW5uZWwgPSBcJWMKKworICAgSWYgdGhlIGZpbGUgb29mYS50eHQgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseSwgYSBjaGFubmVsIG51bWJlciBpcworICAgYXNzaWduZWQgdG8gdGhlIHZhcmlhYmxlIFwlYy4gSGVyZSdzIGFub3RoZXIgZXhhbXBsZSB1c2luZyBhIG1hY3JvCisgICBuYW1lIGZvciB0aGUgY2hhbm5lbCBudW1iZXI6CisKKyAgRklMRSBPUEVOIGNoYW5uZWwgb29mYS50eHQgICAgICAgICAgICAgIDsgT3BlbiBvb2ZhLnR4dCBmb3IgcmVhZGluZy4KKyAgSUYgU1VDQ0VTUyBFQ0hPIG9vZmEudHh0OiBjaGFubmVsID0gXG0oY2hhbm5lbCkKKworICAgU3dpdGNoZXMgY2FuIGJlIGNvbWJpbmVkIHdoZW4gaXQgbWFrZXMgc2Vuc2UgYW5kIHRoZSB1bmRlcmx5aW5nCisgICBvcGVyYXRpbmcgc3lzdGVtIGFsbG93cyBpdC4gRm9yIGV4YW1wbGUsIHRvIG9wZW4gYSBmaWxlIGluIGJpbmFyeSBtb2RlCisgICBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAoc29tZXRpbWVzIGNhbGxlZCAidXBkYXRlIik6CisKKyAgRklMRSBPUEVOIC9SRUFEIC9XUklURSAvQklOQVJZIFwlYyBidWRnZXQuZGIKKworICAgU29tZSBjb21iaW5hdGlvbnMgbWlnaHQgYmUgYWxsb3dlZCwgb3RoZXJzIG5vdC4gRm9yIGV4YW1wbGUgL1JFQUQKKyAgIC9BUFBFTkQgd2lsbCB1c3VhbGx5IG5vdCBiZSBhbGxvd2VkLiAvV1JJVEUgL0FQUEVORCBpcyB0cmVhdGVkIGFzCisgICAvQVBQRU5ELgorCisgICBBIG1ham9yIGFkdmFudGFnZSBvZiB0aGUgbmV3IHN5c3RlbSBvdmVyIHRoZSBvbGRlciBvbmUgaXMgdGhhdCB5b3UgY2FuCisgICBoYXZlIG11bHRpcGxlIGZpbGVzIG9wZW4gYXQgb25jZS4gU3VwcG9zZSwgZm9yIGV4YW1wbGUsIHRoYXQgeW91IHdhbnQKKyAgIHRvIG9wZW4gYWxsIHRoZSBmaWxlcyBpbiBhIGNlcnRhaW4gZGlyZWN0b3J5IGF0IG9uY2U6CisKKyAgLlwlbiA6PSBcZmZpbGVzKC91c3Ivb2xnYSosJmYpICAgICAgICAgIDsgR2V0IGZpbGUgbGlzdCBpbnRvIGFycmF5LgorICBpZiAoID4gXCVuIFx2KGZfbWF4KSApIHsgICAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgdGhlcmUgYXJlbid0IHRvbyBtYW55LgorICAgICAgZXhpdCAxIHtcdihkaXIpOiBcJW4gPSBUb28gbWFueSBmaWxlc30KKyAgfQorICBkZWNsYXJlIFwmY1tcJW5dICAgICAgICAgICAgICAgICAgICAgICAgOyBNYWtlIGFycmF5IGZvciBjaGFubmVsIG51bWJlcnMuCisgIGZvciBcJWkgMSBcJW4gMSB7ICAgICAgICAgICAgICAgICAgICAgICA7IExvb3AgdG8gb3BlbiBldmVyeSBmaWxlLi4uCisgICAgICBmaWxlIG9wZW4gXCZjW1wlaV0gXCZmW1wlaV0gICAgICAgICA7IFRyeSB0byBvcGVuIHRoaXMgb25lCisgICAgICBpZiBmYWlsIGV4aXQgMSBPcGVuIGVycm9yOiBcJmZbXCVpXSA7IENoZWNrIGZvciBmYWlsdXJlCisgIH0KKworICAgSWYgdGhpcyBsb29wIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIHRoZSBcJmNbXSBhcnJheSB3aWxsIGNvbnRhaW4gXCVuCisgICBjaGFubmVsIG51bWJlcnMgb2Ygb3BlbiBmaWxlcyBpbiBlbGVtZW50cyAxIHRocm91Z2ggXCVuLgorCisgICBBbnkgZmlsZSB0aGF0IHlvdSBvcGVuIHdpdGggRklMRSBPUEVOIHN0YXlzIG9wZW4gdW50aWwgS2VybWl0IGV4aXRzLAorICAgb3IgeW91IGNsb3NlIGl0IGV4cGxpY2l0bHkuIFRoZSBjb21tYW5kIHRvIGNsb3NlIGEgZmlsZSBpczoKKworICAgRklMRSBDTE9TRSB7IEFMTCwgY2hhbm5lbCB9CisgICAgICAgICAgSWYgYSBjaGFubmVsIG51bWJlciBpcyBnaXZlbiBhbmQgdGhlIGNoYW5uZWwgcmVmZXJzIHRvIGFuIG9wZW4KKyAgICAgICAgICBmaWxlLCB0aGUgZmlsZSBpcyBjbG9zZWQgYW5kIHRoZSBjaGFubmVsIGlzIGZyZWVkIGZvciByZXVzZTsgaWYKKyAgICAgICAgICB0aGUgY2hhbm5lbCBkb2VzIG5vdCByZWZlciB0byBhbiBvcGVuIGZpbGUsIGFuIGVycm9yIG1lc3NhZ2UgaXMKKyAgICAgICAgICBwcmludGVkIGFuZCB0aGUgY29tbWFuZCBmYWlscy4gSWYgQUxMIGlzIHNwZWNpZmllZCBpbnN0ZWFkIG9mIGEKKyAgICAgICAgICBzcGVjaWZpYyBjaGFubmVsLCBhbGwgZmlsZXMgb3BlbmVkIHdpdGggRklMRSBPUEVOIGFyZSBjbG9zZWQKKyAgICAgICAgICBhbmQgaWYgYWxsIG9wZW4gZmlsZXMgd2VyZSBjbG9zZWQgc3VjY2Vzc2Z1bGx5IChldmVuIGlmIG5vCisgICAgICAgICAgZmlsZXMgd2VyZSBvcGVuKSwgdGhlIGNvbW1hbmQgc3VjY2VlZHM7IGlmIGFueSBvcGVuIGZpbGUgY291bGQKKyAgICAgICAgICBub3QgYmUgY2xvc2VkLCB0aGUgY29tbWFuZCBmYWlsczsgaG93ZXZlciwgYWxsIG9wZW4gZmlsZXMgdGhhdAorICAgICAgICAgIGNvdWxkIGJlIGNsb3NlZCBhcmUgc3RpbGwgY2xvc2VkLiBTeW5vbnltOiBGQ0xPU0UuCisKKyAgIEZJTEUgQ0xPU0UgbWlnaHQgZmFpbCBiZWNhdXNlLCBmb3IgZXhhbXBsZSwgdGhlIGRpc2sgZmlsbGVkIHVwIG9yIGEKKyAgIHF1b3RhIHdhcyBleGNlZWRlZC4gRXhhbXBsZToKKworICBmb3BlbiAvd3JpdGUgXCVjIG5ldy50eHQgICAgICAgICAgICAgICAgOyBPcGVuIG5ldy50eHQgZm9yIHdyaXRpbmcuCisgIGlmIGZhaWwgZXhpdCAxICAgICAgICAgICAgICAgICAgICAgICAgICA7IENoZWNrIGZvciBlcnJvci4KKyAgZmNsb3NlIFwlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ2xvc2UgdGhlIGZpbGUgd2UganVzdCBvcGVuZWQuCisKKyAgIFRoaXMgY3JlYXRlcyBhIDAtbGVuZ3RoIGZpbGUgY2FsbGVkIG5ldy50eHQuCisKKyAgIE5vdGUgdGhhdCBGSUxFIE9QRU4gL1dSSVRFICh3aXRob3V0IC9SRUFEIG9yIC9BUFBFTkQpIGFsd2F5cyBjcmVhdGVzIGEKKyAgIG5ldyBmaWxlLCBhbmQgdGhlcmVmb3JlIGRlc3Ryb3lzIGFueSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSB0aGF0CisgICBtaWdodCBhbHJlYWR5IGV4aXN0IChhc3N1bWluZyB5b3UgaGF2ZSBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBpdCkuIFRvCisgICBhdm9pZCBvdmVyd3JpdGluZyBleGlzdGluZyBmaWxlcywgc2ltcGx5IGNoZWNrIGZpcnN0OgorCisgIGlmIGV4aXN0IG5ldy50eHQgZXhpdCAxIHtGYXRhbCAtIG5ldy50eHQgYWxyZWFkeSBleGlzdHN9CisgIGZvcGVuIC93cml0ZSBcJWMgbmV3LnR4dAorICBpZiBmYWlsIC4uLgorCisgICBUaGUgbmV4dCB0d28gY29tbWFuZHMgZ2l2ZSBpbmZvcm1hdGlvbiBhYm91dCBvcGVuIGZpbGVzOgorCisgICBGSUxFIFNUQVRVUyBjaGFubmVsCisgICAgICAgICAgVGVsbHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIGlmIGFueSwgb3BlbiBvbiB0aGUgZ2l2ZW4gY2hhbm5lbAorICAgICAgICAgIGFuZCB0aGUgc3dpdGNoZXMgaXQgd2FzIG9wZW5lZCB3aXRoLiBUaGUgcmVhZC93cml0ZSBwb2ludGVyIGlzCisgICAgICAgICAgYWxzbyBzaG93bjsgdGhpcyBpcyB3aGVyZSB0aGUgbmV4dCByZWFkIG9yIHdyaXRlIHdpbGwgb2NjdXI7CisgICAgICAgICAgIltFT0ZdIiBpcyBzaG93biBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgb3BlbiBmaWxlIGlzCisgICAgICAgICAgdGhlIGVuZCAtLSBpLmUuIHRoZSBuZXh0IHJlYWQgd2lsbCBmYWlsIGlmIHRoZSBmaWxlIHdhcyBvcGVuZWQKKyAgICAgICAgICBpbiAvUkVBRCBtb2RlOyB0aGUgbmV4dCB3cml0ZSB3aWxsIGFkZCBtYXRlcmlhbCB0byB0aGUgZW5kLiBUaGUKKyAgICAgICAgICBjdXJyZW50IGxpbmUgbnVtYmVyICgwLWJhc2VkKSBpcyBhbHNvIHNob3duIGlmIGtub3duLiBUaGUgRklMRQorICAgICAgICAgIFNUQVRVUyBjb21tYW5kIHN1Y2NlZWRzIGlmIHRoZSBjaGFubmVsIGlzIG9wZW4sIGFuZCBmYWlscyBpZgorICAgICAgICAgIHRoZXJlIGlzIG5vIG9wZW4gZmlsZSBvbiB0aGUgZ2l2ZW4gY2hhbm5lbCwgb3IgaWYgdGhlIGNoYW5uZWwKKyAgICAgICAgICBudW1iZXIgaXMgaW52YWxpZCBvciBvdXQgb2YgcmFuZ2UuIFN5bm9ueW06IEZTVEFUVVMuCisKKyAgIEZJTEUgTElTVAorICAgICAgICAgIExpc3RzIHRoZSBjaGFubmVsIG51bWJlciBhbmQgbmFtZSBvZiBlYWNoIG9wZW4gZmlsZSwgYWxvbmcgd2l0aAorICAgICAgICAgIGl0cyBPUEVOIG1vZGVzIChSLCBXLCBBLCBCLCBSVywgZXRjKSBhbmQgaXRzIGN1cnJlbnQgcmVhZC93cml0ZQorICAgICAgICAgIHBvaW50ZXIgb3IgIltFT0ZdIiBpZiBpdCBpcyBhdCB0aGUgZW5kLiBBbHNvIHRlbGxzIHRoZSBudW1iZXIKKyAgICAgICAgICBvZiBmaWxlcyBjdXJyZW50bHkgb3BlbmVkIHdpdGggRklMRSBPUEVOLCBwbHVzIHRoZSBtYXhpbXVtCisgICAgICAgICAgbnVtYmVyIG9mIG9wZW4gZmlsZXMgYWxsb3dlZCBieSB0aGUgc3lzdGVtIGFuZCB0aGUgbWF4aW11bQorICAgICAgICAgIG51bWJlciBhbGxvd2VkIGZvciBGSUxFIE9QRU4uIFN5bm9ueW06IEZMSVNULgorCisgICBOZXh0IGNvbWUgdGhlIGNvbW1hbmRzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIGZpbGVzOgorCisgICBGSUxFIFJFQUQgWyBzd2l0Y2hlcyBdIGNoYW5uZWwgWyB2YXJpYWJsZSBdCisgICAgICAgICAgUmVhZHMgZGF0YSBmcm9tIHRoZSBmaWxlIG9uIHRoZSBnaXZlbiBjaGFubmVsIG51bWJlciBpbnRvIHRoZQorICAgICAgICAgIHZhcmlhYmxlLCBpZiBvbmUgd2FzIGdpdmVuOyBpZiBubyB2YXJpYWJsZSB3YXMgZ2l2ZW4sIHRoZQorICAgICAgICAgIHJlc3VsdCBpcyBwcmludGVkIG9uIHRoZSBzY3JlZW4uIElNUE9SVEFOVDogVGhlIHZhcmlhYmxlIHNob3VsZAorICAgICAgICAgIG5vcm1hbGx5IGJlIGEgbWFjcm8gbmFtZSByYXRoZXIgdGhhbiBhIFwleCBvciBcJnhbXSB2YXJpYWJsZSBpZgorICAgICAgICAgIHlvdSB3YW50IGJhY2tzbGFzaCBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlIHRvIGJlIHRha2VuIGxpdGVyYWxseQorICAgICAgICAgIChzZWUgcHAuNDA4LTQxMiBvZiBbMzc4XVVzaW5nIEMtS2VybWl0IGZvciBhbiBleHBsYW5hdGlvbjsgeW91CisgICAgICAgICAgY2FuIGFsc28gcmVhZCBpbnRvIGEgXCV4IG9yIFwmeFtdIHZhcmlhYmxlLCBidXQgdGhlbiB5b3UgbXVzdAorICAgICAgICAgIHJlbWVtYmVyIHRvIHByb3RlY3QgZnV0dXJlIHJlZmVyZW5jZXMgdG8gYnkgXGZjb250ZW50cygpIGlmIHlvdQorICAgICAgICAgIGRvbid0IHdhbnQgQy1LZXJtaXQgdG8gcHJvY2VzcyBhbnkgYmFja3NsYXNoZXMgaXQgbWlnaHQKKyAgICAgICAgICBjb250YWluKS4gVGhlIGRlc2lyZWQgYW1vdW50IG9mIGRhdGEgKGFjY29yZGluZyB0byB0aGUKKyAgICAgICAgICBzd2l0Y2hlcykgaXMgcmVhZCBmcm9tIHRoZSBmaWxlIGF0IHRoZSBjdXJyZW50IHJlYWQvd3JpdGUKKyAgICAgICAgICBwb2ludGVyLCBhbmQgdXBvbiBjb21wbGV0aW9uIHRoZSByZWFkL3dyaXRlIHBvc2l0aW9uIGlzIHVwZGF0ZWQKKyAgICAgICAgICB0byBmaXJzdCBieXRlIGFmdGVyIHRoZSBkYXRhIHRoYXQgd2FzIHJlYWQsIG5vIG1hdHRlciB3aGF0CisgICAgICAgICAgc3dpdGNoZXMgd2VyZSBnaXZlbi4gU3lub255bTogRlJFQUQuCisKKyAgIEZJTEUgV1JJVEUgWyBzd2l0Y2hlcyBdIGNoYW5uZWwgdGV4dAorICAgICAgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gdGV4dCB0byB0aGUgZmlsZSBvbiB0aGUgZ2l2ZW4gY2hhbm5lbCBudW1iZXIuCisgICAgICAgICAgVGhlIHRleHQsIG9mIGNvdXJzZSwgY2FuIGJlIGxpdGVyYWwgdGV4dCBvciBhIHZhcmlhYmxlLCBvciBhbnkKKyAgICAgICAgICBjb21iaW5hdGlvbi4gSWYgdGhlIHRleHQgbWlnaHQgY29udGFpbiBsZWFkaW5nIG9yIHRyYWlsaW5nCisgICAgICAgICAgc3BhY2VzLCBpdCBtdXN0IGJlIGVuY2xvc2VkIGluIGJyYWNlcyBpZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZQorICAgICAgICAgIHRoZW0uIFN5bm9ueW06IEZXUklURS4KKworICAgQmVmb3JlIHByb2NlZWRpbmcsIGEgY2F1dGlvbiBhYm91dCB0aGUgTlVMIGNoYXJhY3Rlci4gQy1LZXJtaXQgaXMgc28KKyAgIG5hbWVkIGJlY2F1c2UgaXQgaXMgYSBLZXJtaXQgcHJvZ3JhbSB3cml0dGVuIGluIHRoZSBDIGxhbmd1YWdlLiBJbiBDLAorICAgY2hhcmFjdGVyIHN0cmluZ3MgYXJlIHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2Ugb2Ygbm9uLU5VTCBieXRlcworICAgdGVybWluYXRlZCBieSBhIE5VTCBieXRlIChhIGJ5dGUgaW4gd2hpY2ggYWxsIGJpdHMgYXJlIDApLiBUaHVzIGEgQworICAgc3RyaW5nIGNhbiBub3QgY29udGFpbiBOVUwgYnl0ZXM7IGl0IGFsd2F5cyBlbmRzIHdpdGggdGhlIGZpcnN0IE5VTAorICAgYnl0ZS4gQy1LZXJtaXQgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBhcyBDIHN0cmluZ3MgYW5kIHRoZXJlZm9yZQorICAgY2FuJ3QgY29udGFpbiBOVUwgYnl0ZXMgZWl0aGVyLCBzbyB0aGUgRklMRSBSRUFEIGFuZCBGSUxFIFdSSVRFCisgICBjb21tYW5kcyBkbyBub3QgaGFuZGxlIGZpbGVzIG9yIHN0cmluZ3MgdGhhdCBjb250YWluIE5VTCBieXRlcywgZXhjZXB0CisgICB3aGVuIHRoZSAvQ0hBUkFDVEVSIHN3aXRjaCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBGSUxFIFJFQUQgb3IgV1JJVEUKKyAgIGNvbW1hbmQsIG9yIHdoZW4gL0xQQUQ6MCBvciAvUlBBRDowIGlzIGdpdmVuIHdpdGggdGhlIEZJTEUgV1JJVEUKKyAgIGNvbW1hbmQ7IHRoZXNlIHN3aXRjaGVzIGFyZSBleHBsYWluZWQgYmVsb3cuCisKKyAgIEFsc28gbm90ZSB0aGF0IEtlcm1pdCBjYW4gbm90IGJlIHVzZWQgcmVhZCBvciB3cml0ZSBiaW5hcnkgbnVtYmVycyBpbgorICAgdGhlIG1hY2hpbmUncyBpbnRlcm5hbCBmb3JtYXQgKGludGVnZXIgb3IgZmxvYXRpbmctcG9pbnQpOyBpbiBnZW5lcmFsLAorICAgbnVtYmVycyBjYW4gYmUgcHJvY2Vzc2VkIG9ubHkgd2hlbiByZXByZXNlbnRlZCBhcyBudW1lcmljIG9yCisgICBmbG9hdGluZy1wb2ludCBzdHJpbmdzLgorCisgICBGSUxFIFJFQUQgc3dpdGNoZXMgYXJlOgorCisgICAvTElORQorICAgICAgICAgIFNwZWNpZmllcyB0aGF0IGEgbGluZSBvZiB0ZXh0IGlzIHRvIGJlIHJlYWQuIEEgbGluZSBpcyBkZWZpbmVkCisgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0ncyB0ZXh0LWZpbGUKKyAgICAgICAgICBmb3JtYXQuIEZvciBleGFtcGxlLCBpbiBVTklYIGEgbGluZSBpcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMKKyAgICAgICAgICB1cCB0byBhbmQgaW5jbHVkaW5nIGEgbGluZWZlZWQsIG9yIHRoZSBlbmQgb2YgdGhlIGZpbGUsIHdoaWNoCisgICAgICAgICAgZXZlciBjb21lcyBmaXJzdC4gVGhlIGxpbmUgdGVybWluYXRvciAoaWYgYW55KSBpcyByZW1vdmVkCisgICAgICAgICAgYmVmb3JlIGFzc2lnbmluZyB0aGUgdGV4dCB0byB0aGUgdmFyaWFibGUuIElmIG5vIHN3aXRjaGVzIGFyZQorICAgICAgICAgIGluY2x1ZGVkIHdpdGggdGhlIEZJTEUgUkVBRCBjb21tYW5kLCAvTElORSBpcyBhc3N1bWVkLiBOb3JtYWxseQorICAgICAgICAgIHRoaXMgc3dpdGNoIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGZpbGVzIG9wZW5lZCBpbiAvQklOQVJZCisgICAgICAgICAgbW9kZSAoYnV0IG5vdGhpbmcgcHJldmVudHMgaXQgZWl0aGVyKS4KKworICAgL1NJWkU6bnVtYmVyCisgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyAoY2hhcmFjdGVycykgaXMgdG8gYmUKKyAgICAgICAgICByZWFkLiBUaGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyByZXR1cm5lZCB3aWxsIGJlIGxlc3MgaWYgdGhlCisgICAgICAgICAgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZCAob3IgYSBOVUwgYnl0ZSBpcyBlbmNvdW50ZXJlZCkuIEZvcgorICAgICAgICAgIGV4YW1wbGUsIGlmIGEgZmlsZSBpcyA1MTQgYnl0ZXMgbG9uZywgRklMRSBSRUFEIC9TSVpFOjUxMgorICAgICAgICAgIHJldHVybnMgNTEyIGJ5dGVzIHRoZSBmaXJzdCB0aW1lIGFuZCAyIGJ5dGVzIHRoZSBzZWNvbmQgdGltZS4KKyAgICAgICAgICBGSUxFIFJFQUQgL1NJWkUgcHJvdmlkZXMgYSBraW5kIG9mICJyZWNvcmQgaS9vIiBmb3IgZmlsZXMgdGhhdAorICAgICAgICAgIGRvIG5vdCBuZWNlc3NhcmlseSBjb250YWluIGxpbmVzLiBUaGUgcmVzdWx0aW5nIGJsb2NrIG9mCisgICAgICAgICAgY2hhcmFjdGVycyBpcyBhc3NpZ25lZCB0byB0aGUgdmFyaWFibGUgd2l0aG91dCBhbnkgZWRpdGluZy4KKyAgICAgICAgICBTeW5vbnltOiAvQkxPQ0suCisKKyAgIC9DSEFSQUNURVIKKyAgICAgICAgICBFcXVpdmFsZW50IHRvIC9TSVpFOjEuIElmIEZJTEUgUkVBRCAvQ0hBUiBzdWNjZWVkcyBidXQgdGhlCisgICAgICAgICAgdmFyaWFibGUgaXMgZW1wdHksIHRoaXMgaW5kaWNhdGVzIGEgTlVMIGJ5dGUgd2FzIHJlYWQuIFN5bm9ueW06CisgICAgICAgICAgQllURS4KKworICAgRklMRSBXUklURSBzd2l0Y2hlcyBhcmU6CisKKyAgIC9MSU5FCisgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgYW4gYXBwcm9wcmlhdGUgbGluZSB0ZXJtaW5hdG9yIGlzIHRvIGJlIGFkZGVkIHRvCisgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgdGV4dC4gSWYgbm8gc3dpdGNoZXMgYXJlIGluY2x1ZGVkLCAvTElORSBpcworICAgICAgICAgIGFzc3VtZWQuCisKKyAgIC9TSVpFOm51bWJlcgorICAgICAgICAgIFNwZWNpZmllcyB0aGF0IHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgKGNoYXJhY3RlcnMpIGlzIHRvIGJlCisgICAgICAgICAgd3JpdHRlbi4gSWYgdGhlIGdpdmVuIHRleHQgaXMgbG9uZ2VyIHRoYW4gdGhlIHJlcXVlc3RlZCBzaXplLAorICAgICAgICAgIGl0IGlzIHRydW5jYXRlZDsgaWYgaXMgc2hvcnRlciwgaXQgaXMgcGFkZGVkIGFjY29yZGluZyAvTFBBRAorICAgICAgICAgIGFuZCAvUlBBRCBzd2l0Y2hlcy4gU3lub255bTogL0JMT0NLLgorCisgICAvTFBBRFs6dmFsdWVdCisgICAgICAgICAgSWYgL1NJWkUgd2FzIGdpdmVuLCBidXQgdGhlIHRleHQgaXMgc2hvcnRlciB0aGFuIHRoZSByZXF1ZXN0ZWQKKyAgICAgICAgICBzaXplLCB0aGUgdGV4dCBpcyBwYWRkZWQgb24gdGhlIGxlZnQgd2l0aCBzdWZmaWNpZW50IGNvcGllcyBvZgorICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgd2hvc2UgQVNDSUkgdmFsdWUgaXMgZ2l2ZW4gdG8gd3JpdGUgdGhlIGdpdmVuCisgICAgICAgICAgbGVuZ3RoLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIDMyICh0aGUgY29kZSBmb3IgU3BhY2UpIGlzCisgICAgICAgICAgdXNlZC4gVGhlIHZhbHVlIGNhbiBhbHNvIGJlIDAgdG8gd3JpdGUgdGhlIGluZGljYXRlZCBudW1iZXIgb2YKKyAgICAgICAgICBOVUwgYnl0ZXMuIElmIC9TSVpFIHdhcyBub3QgZ2l2ZW4sIHRoaXMgc3dpdGNoIGlzIGlnbm9yZWQuCisKKyAgIC9SUEFEWzp2YWx1ZV0KKyAgICAgICAgICBMaWtlIExQQUQsIGJ1dCBwYWRzIG9uIHRoZSByaWdodC4KKworICAgL0NIQVJBQ1RFUgorICAgICAgICAgIFNwZWNpZmllcyB0aGF0IG9uZSBjaGFyYWN0ZXIgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIHRoZSB0ZXh0IGlzCisgICAgICAgICAgZW1wdHkgb3Igbm90IGdpdmVuLCBhIE5VTCBjaGFyYWN0ZXIgaXMgd3JpdHRlbjsgb3RoZXJ3aXNlIHRoZQorICAgICAgICAgIGZpcnN0IGNoYXJhY3RlciBvZiB0ZXh0IGlzIGdpdmVuLiBTeW5vbnltOiAvQllURS4KKworICAgL1NUUklORworICAgICAgICAgIFNwZWNpZmllcyB0aGF0IHRoZSB0ZXh0IGlzIHRvIGJlIHdyaXR0ZW4gYXMtaXMsIHdpdGggbm8KKyAgICAgICAgICB0ZXJtaW5hdG9yIGFkZGVkLgorCisgICBIZXJlJ3MgYW4gZXhhbXBsZSBpbiB3aGljaCB3ZSBjb3B5IGEgdGV4dCBmaWxlIGxpbmUgYnkgbGluZToKKworICBmaWxlIG9wZW4gL3JlYWQgXCVjIG9vZmEudHh0ICAgICAgICAgICAgOyBPcGVuIGlucHV0IGZpbGUKKyAgaWYgZmFpbCBleGl0IDEgQ2FuJ3Qgb3BlbiBpbnB1dCBmaWxlICAgIDsgQ2hlY2sgdGhhdCBpdCdzIG9wZW4KKyAgZmlsZSBvcGVuIC93cml0ZSBcJWQgbmV3LnR4dCAgICAgICAgICAgIDsgT3BlbiBvdXRwdXQgZmlsZQorICBpZiBmYWlsIGV4aXQgMSBDYW4ndCBvcGVuIG91dHB1dCBmaWxlICAgOyBDaGVjaworICB3aGlsZSB0cnVlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBMb29wIHRvIGNvcHkgbGluZXMKKyAgICAgIGZpbGUgcmVhZCAvbGluZSBcJWMgbGluZSAgICAgICAgICAgIDsgUmVhZCBhIGxpbmUKKyAgICAgIGlmIGZhaWwgYnJlYWsgICAgICAgICAgICAgICAgICAgICAgIDsgQXNzdW1lIGZhaWx1cmUgPSBlbmQgb2YgZmlsZQorICAgICAgZmlsZSB3cml0ZSAvbGluZSBcJWQge1xtKGxpbmUpfSAgICAgOyBXcml0ZSB0aGUgbGluZSB0byBvdXRwdXQgZmlsZQorICAgICAgaWYgZmFpbCBleGl0IDEgV3JpdGUgZmFpbHVyZSAgICAgICAgOyBGYWlsdXJlIGhlcmUgaXMgZmF0YWwKKyAgfQorICBmaWxlIGNsb3NlIFwlYyAgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbG9zZSB0aGUgdHdvIGZpbGVzCisgIGZpbGUgY2xvc2UgXCVkCisKKyAgIE5vdGUgdGhhdCBzaW5jZSAvTElORSBpcyB0aGUgZGVmYXVsdCBmb3IgYm90aCBGSUxFIFJFQUQgYW5kIEZJTEUKKyAgIFdSSVRFLCBpdCBjYW4gYmUgb21pdHRlZCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHdoZXJlIHdlIGFsc28KKyAgIHVzZSB0aGUgc2hvcnQgbmFtZXMgZm9yIHRoZSBGSUxFIGNvbW1hbmRzLgorCisgIGZvcGVuIC9yZWFkIFwlYyBvb2ZhLnR4dCAgICAgICAgICAgICAgICA7IE9wZW4gaW5wdXQgZmlsZQorICBpZiBmYWlsIGV4aXQgMSBDYW4ndCBvcGVuIGlucHV0IGZpbGUgICAgOyBDaGVjayB0aGF0IGl0J3Mgb3BlbgorICBmb3BlbiAvd3JpdGUgXCVkIG5ldy50eHQgICAgICAgICAgICAgICAgOyBPcGVuIG91dHB1dCBmaWxlCisgIGlmIGZhaWwgZXhpdCAxIENhbid0IG9wZW4gb3V0cHV0IGZpbGUgICA7IENoZWNrCisgIHdoaWxlIHRydWUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IExvb3AgdG8gY29weSBsaW5lcworICAgICAgZnJlYWQgXCVjIGxpbmUgICAgICAgICAgICAgICAgICAgICAgOyBSZWFkIGEgbGluZQorICAgICAgaWYgZmFpbCBicmVhayAgICAgICAgICAgICAgICAgICAgICAgOyBBc3N1bWUgZmFpbHVyZSA9IGVuZCBvZiBmaWxlCisgICAgICBmd3JpdGUgXCVkIHtcbShsaW5lKX0gICAgICAgICAgICAgICA7IFdyaXRlIHRoZSBsaW5lIHRvIG91dHB1dCBmaWxlCisgICAgICBpZiBmYWlsIGV4aXQgMSBXcml0ZSBmYWlsdXJlICAgICAgICA7IEZhaWx1cmUgaGVyZSBpcyBmYXRhbAorICB9CisgIGZjbG9zZSBcJWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IENsb3NlIHRoZSB0d28gZmlsZXMKKyAgZmNsb3NlIFwlZAorCisgICBIZXJlJ3MgdGhlIHNhbWUgZXhhbXBsZSB1c2luZyAicmVjb3JkIGkvbyIgKHRoZSBvcGVuIGFuZCBjbG9zZQorICAgc2VxdWVuY2VzIGFyZSBhcmUgb21pdHRlZCBzaW5jZSB0aGV5IGFyZSB0aGUgc2FtZSBhcyBhYm92ZSkuIFRoZQorICAgcmVzdWx0IGlzIHRoZSBzYW1lLCBidXQgZXhlY3V0aW9uIGlzIG11Y2ggZmFzdGVyOgorCisgIHdoaWxlIHRydWUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IExvb3AgdG8gY29weSBibG9ja3MKKyAgICAgIGZyZWFkIC9zaXplOjUxMiBcJWMgYmxvY2sgICAgICAgICAgIDsgUmVhZCBhIGJsb2NrIGludG8gXCVhCisgICAgICBpZiBmYWlsIGJyZWFrICAgICAgICAgICAgICAgICAgICAgICA7IEFzc3VtZSBmYWlsdXJlID0gZW5kIG9mIGZpbGUKKyAgICAgIGZ3cml0ZSAvc3RyaW5nIFwlZCB7XG0oYmxvY2spfSAgICAgIDsgV3JpdGUgdGhlIGJsb2NrIHRvIG91dHB1dCBmaWxlCisgICAgICBpZiBmYWlsIGV4aXQgMSBXcml0ZSBmYWlsdXJlICAgICAgICA7IEZhaWx1cmUgaGVyZSBpcyBmYXRhbAorICB9CisKKyAgIEFsdGhvdWdoIHJlY29yZCBpL28gaXMgZmFzdGVyLCBpdCBzaG91bGQgbm90IGJlIHVzZWQgaW4gbGluZS1vcmllbnRlZAorICAgYXBwbGljYXRpb25zLCBzaW5jZSBpdCByZXR1cm5zIGFyYml0cmFyeSBjaHVua3Mgb2YgdGhlIGZpbGUgdG8geW91cgorICAgc2NyaXB0LCByYXRoZXIgdGhhbiBsaW5lcy4gSW4gdGhpcyBleGFtcGxlLCBGV1JJVEUgL1NUUklORyBpcyB1c2VkCisgICByYXRoZXIgdGhhbiBGV1JJVEUgL1NJWkU6NTEyIHRvIGF2b2lkIHRoZSBsYXN0IG91dHB1dCBibG9jayBiZWluZworICAgcGFkZGVkIGJleW9uZCB0aGUgb3JpZ2luYWwgZmlsZSdzIGxlbmd0aC4KKworICAgQSBmaWxlIGNhbiBhbHNvIGJlIGNvcGllZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLCBidXQgdGhpcyBpcyBtdWNoCisgICBzbG93ZXIgdGhhbiBsaW5lIGkvbyBhbmQgVkVSWSBtdWNoIHNsb3dlciB0aGFuIGJsb2NrIGkvbzoKKworICB3aGlsZSB0cnVlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBMb29wIHRvIGNvcHkgYmxvY2tzCisgICAgICBmcmVhZCAvY2hhciBcJWMgYyAgICAgICAgICAgICAgICAgICA7IFJlYWQgYSBjaGFyYWN0ZXIgaW50byBjCisgICAgICBpZiBmYWlsIGJyZWFrICAgICAgICAgICAgICAgICAgICAgICA7IEFzc3VtZSBmYWlsdXJlID0gZW5kIG9mIGZpbGUKKyAgICAgIGZ3cml0ZSAvY2hhciBcJWQge1xtKGMpfSAgICAgICAgICAgIDsgV3JpdGUgY2hhcmFjdGVyIHRvIG91dHB1dCBmaWxlCisgICAgICBpZiBmYWlsIGV4aXQgMSBXcml0ZSBmYWlsdXJlICAgICAgICA7IEZhaWx1cmUgaXMgZmF0YWwKKyAgfQorCisgICBBbHRob3VnaCBjaGFyYWN0ZXIgaS9vIGlzIHNsb3csIGl0IGlzIHRoZSBvbmx5IHdheSB0byBwcm9jZXNzIGZpbGVzCisgICB0aGF0IGNvbnRhaW4gTlVMIGNoYXJhY3RlcnMgKGkuZS4gYnl0ZXMgY29tcG9zZWQgb2Ygb25seSB6ZXJvIGJpdHMpLgorICAgSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHdoZW4gImZyZWFkIC9jaGFyIFwlYyBjIiByZXR1cm5zIGEgTlVMLCB0aGUgYworICAgdmFyaWFibGUgaXMgZW1wdHkuIEJ1dCBzaW5jZSB0aGUgRlJFQUQgL0NIQVIgY29tbWFuZCBkaWQgbm90IGZhaWwsIHdlCisgICBrbm93IHRoZSByZXN1bHQgd2FzIHJlYWxseSBhIE5VTC4gRldSSVRFIC9DSEFSLCB3aGVuIGdpdmVuIGFuIGVtcHR5CisgICB2YXJpYWJsZSAob3Igbm8gdmFyaWFibGUgYXQgYWxsKSB3cml0ZXMgYSBOVUwuIFRodXMgdGhlIGxvb3AgYWJvdmUKKyAgIHdpbGwgY29weSBhbnkgZmlsZSBhdCBhbGwgKHZlcnkgc2xvd2x5KS4gSW4gbm9uLWNvcHlpbmcgYXBwbGljYXRpb25zLAorICAgTlVMcyBhcmUgZGV0ZWN0ZWQgbGlrZSB0aGlzOgorCisgIGZyZWFkIC9jaGFyIFwlYyBjCisgIGlmIGZhaWwgKGRvIHNvbWV0aGluZykKKyAgaWYgbm90IGRlZiBjIChhIE5VTCBieXRlIHdhcyByZWFkKQorCisgICBGaW5hbGx5IHNvbWUgYWR2YW5jZWQgZmlsZSBvcGVyYXRpb25zOgorCisgICBGSUxFIEZMVVNIIGNoYW5uZWwKKyAgICAgICAgICBGb3Igb3V0cHV0IGZpbGVzIG9ubHk6IGNvbW1pdHMgYWxsIHByZXZpb3VzIHdyaXRlcyB0byBkaXNrLCBpbgorICAgICAgICAgIGNhc2UgdGhlIGNvbXB1dGVyIHdhcyBidWZmZXJpbmcgdGhlbS4gU3lub255bTogRkZMVVNILgorCisgICBGSUxFIENPVU5UIFsgeyAvQllURVMsIC9MSU5FUywgL0xJU1QsIC9OT0xJU1QgfSBdIGNoYW5uZWwKKyAgICAgICAgICBCeSBkZWZhdWx0LCBvciBpZiB0aGUgL0JZVEVTIHN3aXRjaCBpcyBnaXZlbiwgY291bnRzIHRoZSBieXRlcworICAgICAgICAgIGluIHRoZSBmaWxlLCBpZiBhbnksIG9wZW4gb24gdGhlIGdpdmVuIGNoYW5uZWwuIElmIHRoZSAvTElORVMKKyAgICAgICAgICBzd2l0Y2ggaXMgZ2l2ZW4sIGNvdW50cyBsaW5lcyBpbiB0aGUgZmlsZS4gSWYgdGhlIC9MSVNUIHN3aXRjaAorICAgICAgICAgIGlzIGdpdmVuLCB0aGUgcmVzdWx0IGlzIHByaW50ZWQuIElmIHRoZSAvTk9MSVNUIHN3aXRjaCBpcworICAgICAgICAgIGdpdmVuLCB0aGUgcmVzdWx0IGlzIG5vdCBwcmludGVkLiAvUVVJRVQgaXMgYSBzeW5vbnltIGZvcgorICAgICAgICAgIC9OT0xJU1QuIElmIG5laXRoZXIgL0xJU1Qgbm9yIC9OT0xJU1QgaXMgZ2l2ZW4sIHRoZSByZXN1bHQgaXMKKyAgICAgICAgICBwcmludGVkIGlmIHRoZSBjb21tYW5kIGlzIGdpdmVuIGF0IHRvcCBsZXZlbCwgaS5lLiBub3QgZnJvbSBhCisgICAgICAgICAgY29tbWFuZCBmaWxlIG9yIG1hY3JvLiBJbiBhbGwgY2FzZXMsIHRoZSByZXN1bHQgb2YgdGhlIG1vc3QKKyAgICAgICAgICByZWNlbnQgRklMRSBDT1VOVCBjb21tYW5kIGlzIHN0b3JlZCBpbiB0aGUgdmFyaWFibGUKKyAgICAgICAgICBcdihmX2NvdW50KS4gTm90ZSB0aGF0IEZJTEUgQ09VTlQgL0xJTkUgd29ya3MgKGFuZCBjYW4gb25seQorICAgICAgICAgIHdvcmspIGJ5IHJlYWRpbmcgdGhlIGVudGlyZSBmaWxlOyBleHBlY3QgaXQgdG8gdGFrZSBzb21lIHRpbWUKKyAgICAgICAgICBpZiB0aGUgZmlsZSBpcyBsYXJnZS4gU3lub255bTogRkNPVU5ULgorCisgICBGSUxFIFJFV0lORCBjaGFubmVsCisgICAgICAgICAgTW92ZXMgdGhlIHJlYWQvd3JpdGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICAgICAgICAgIEVxdWl2YWxlbnQgdG8gRklMRSBTRUVLIGNoYW5uZWwgMC4gU3lub255bTogRlJFV0lORC4KKworICAgRklMRSBTRUVLIFsgc3dpdGNoZXMgXSBjaGFubmVsIHsgW3srLC19XW51bWJlciwgTEFTVCwgRU9GIH0KKyAgICAgICAgICBNb3ZlcyB0aGUgcmVhZC93cml0ZSBwb2ludGVyIGZvciB0aGUgZmlsZSBvbiB0aGlzIGNoYW5uZWwgdG8KKyAgICAgICAgICB0aGUgZ2l2ZW4gcG9zaXRpb24sIHdoaWNoIG1heSBiZSBhIGJ5dGUgKGNoYXJhY3RlcikgbnVtYmVyIG9yIGEKKyAgICAgICAgICBsaW5lIG51bWJlciwgZXhwcmVzc2VkIGluIGVpdGhlciBhYnNvbHV0ZSBvciByZWxhdGl2ZSB0ZXJtcy4KKyAgICAgICAgICBTd2l0Y2hlczoKKworICAgICAgICAvQllURQorICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgZ2l2ZW4gaXMgYSBieXRlIG51bWJlci4gU3lub255bTogL0NIQVJBQ1RFUi4KKworICAgICAgICAvTElORQorICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgZ2l2ZW4gaXMgYSBsaW5lIG51bWJlci4KKworICAgICAgICAvQUJTT0xVVEUKKyAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIGdpdmVuIGlzIGFic29sdXRlLgorCisgICAgICAgIC9SRUxBVElWRQorICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgZ2l2ZW4gaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uCisKKyAgICAgICAgICBCeSBkZWZhdWx0LCBvciBpZiB0aGUgL0JZVEUgc3dpdGNoIGlzIGdpdmVuLCB0aGUgbnVtYmVyIGlzIGEKKyAgICAgICAgICBieXRlIG51bWJlciAoMCA9IGZpcnN0IGJ5dGUpLiBJZiAvTElORSBpcyBnaXZlbiwgdGhlIG51bWJlciBpcworICAgICAgICAgIGEgbGluZSBudW1iZXIgKDAgPSBmaXJzdCBsaW5lKS4gRU9GIG1lYW5zIHRvIG1vdmUgdG8gdGhlIGVuZCBvZgorICAgICAgICAgIHRoZSBmaWxlLiBMQVNUIG1lYW5zIHRvIG1vdmUgdG8gdGhlIGxhc3QgbGluZSBvciBjaGFyYWN0ZXIgb2YKKyAgICAgICAgICB0aGUgZmlsZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQncyBhIGxpbmUgb3IgY2hhcmFjdGVyIHNlZWsuCisKKyAgICAgICAgICBJZiBuZWl0aGVyIHRoZSAvUkVMQVRJVkUgbm9yIHRoZSAvQUJTT0xVVEUgc3dpdGNoIGlzIGdpdmVuLAorICAgICAgICAgIHRoZW4gaWYgYSBzaWduZWQgbnVtYmVyIGlzIGdpdmVuLCB0aGUgbW90aW9uIGlzIHJlbGF0aXZlIHRvIHRoZQorICAgICAgICAgIGN1cnJlbnQgcG9zaXRpb24uIEFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gYSBuZWdhdGl2ZQorICAgICAgICAgIG51bWJlciBpcyBub3QgY29uc2lkZXJlZCBzaWduZWQgZm9yIHRoaXMgcHVycG9zZTsgdGhhdCBpcywgYQorICAgICAgICAgIHNpZ24gKCsgb3IgLSkgbXVzdCBiZSBpbmNsdWRlZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZQorICAgICAgICAgIG51bWJlciBpbiB0aGUgY29tbWFuZCBpdHNlbGYgdG8gZm9yY2UgYSByZWxhdGl2ZSBzZWVrIChpbiB0aGUKKyAgICAgICAgICBhYnNlbmNlIG9mIC9SRUxBVElWRSBvciAvQUJTT0xVVEUpLgorCisgICAgICAgICAgSWYgdGhlIG51bWJlciBoYXMgbm8gc2lnbiwgb3IgaWYgdGhlIC9BQlNPTFVURSBzd2l0Y2ggaXMgZ2l2ZW4sCisgICAgICAgICAgdGhlIG51bWJlciByZXByZXNlbnRzIGFuIGFic29sdXRlIHBvc2l0aW9uIChyZWxhdGl2ZSB0byB0aGUKKyAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIGZpbGUpLiBTdWJzZXF1ZW50IEZJTEUgUkVBRHMgb3IgV1JJVEVzIHdpbGwKKyAgICAgICAgICB0YWtlIHBsYWNlIGF0IHRoZSBuZXcgcG9zaXRpb24uCisKKyAgICAgICAgICBJZiB0aGUgcmVhZC93cml0ZSBwb2ludGVyIGlzIHBsYWNlZCBhZnRlciB0aGUgZW5kIG9mIHRoZSBmaWxlLAorICAgICAgICAgIGEgc3Vic2VxdWVudCBGSUxFIFJFQUQgd2lsbCBmYWlsLCBidXQgYSBGSUxFIFdSSVRFIHdpbGwgc3VjY2VlZAorICAgICAgICAgIChwb3NzaWJseSBjcmVhdGluZyBhIGZpbGUgd2l0aCAiaG9sZXMiKS4gSWYgYSBGSUxFIFNFRUsgL0JZVEUKKyAgICAgICAgICBjb21tYW5kIGlzIGdpdmVuLCB0aGUgY3VycmVudCBsaW5lIGJlY29tZXMgdW5rbm93biAodW5sZXNzIHRoZQorICAgICAgICAgIHBvc2l0aW9uIGlzIDApIGFuZCBzdWJzZXF1ZW50IEZJTEUgU0VFSyAvUkVMQVRJVkUgL0xJTkUKKyAgICAgICAgICBjb21tYW5kcyB3aWxsIGZhaWwgdW50aWwgdGhlIG5leHQgbm9uLXJlbGF0aXZlIEZJTEUgU0VFSyAvTElORQorICAgICAgICAgIGNvbW1hbmQgaXMgZ2l2ZW4uIFN5bm9ueW06IEZTRUVLLgorCisgICBBbiBhYnNvbHV0ZSBGSUxFIFNFRUsgdG8gYSBuZWdhdGl2ZSBwb3NpdGlvbiBmYWlscyBzaWxlbnRseSwgYXMgZG9lcyBhCisgICByZWxhdGl2ZSBzZWVrIHRvIGEgcG9zaXRpb24gYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisKKyAgIEEgY2F1dGlvbiBhYm91dCByZWxhdGl2ZSBTRUVLczogcmVtZW1iZXIgdGhhdCB0aGUgbnVtYmVyIGlzIHJlbGF0aXZlCisgICB0byB0aGUgY3VycmVudCBwb3NpdGlvbi4gV2hlbmV2ZXIgeW91IHJlYWQgb3Igd3JpdGUsIHRoaXMgY2hhbmdlcyB0aGUKKyAgIHBvc2l0aW9uLiBJbiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMsIGFzc3VtZSB0aGUgZmlsZSBvcGVuIG9uCisgICBjaGFubmVsIFwlYyBpcyBwb3NpdGlvbmVkIGF0IGxpbmUgbiAodGhlIEZSRUFEIHRhcmdldCB2YXJpYWJsZSBpcworICAgb21pdHRlZCBmb3IgbGFjayBvZiBzcGFjZSk6CisKKyAgeyBGUkVBRCBcJWMsIEZTRUVLIC9MSU5FIFwlYyAtMSwgRlJFQUQgXCVjIH0gIDwtLSBSZWFkcyBsaW5lIG4gdHdpY2UKKyAgeyBGUkVBRCBcJWMsIEZTRUVLIC9MSU5FIFwlYyArMCwgRlJFQUQgXCVjIH0gIDwtLSBSZWFkcyBsaW5lcyBuIGFuZCBuKzEKKyAgeyBGUkVBRCBcJWMsIEZTRUVLIC9MSU5FIFwlYyArMSwgRlJFQUQgXCVjIH0gIDwtLSBSZWFkcyBsaW5lcyBuIGFuZCBuKzIKKyAgeyBGUkVBRCBcJWMsIEZTRUVLIC9MSU5FIFwlYyAtMiwgRlJFQUQgXCVjIH0gIDwtLSBSZWFkcyBsaW5lcyBuIGFuZCBuLTEKKyAgeyBGUkVBRCBcJWMsIEZTRUVLIC9MSU5FIFwlYyAtMywgRlJFQUQgXCVjIH0gIDwtLSBSZWFkcyBsaW5lcyBuIGFuZCBuLTIKKworICAgQW5vdGhlciBjYXV0aW9uOiBVc2luZyBGU0VFSyBhbmQgRlJFQUQgL1NJWkUgdG8gcmVwZWF0ZWRseSByZWFkIHRoZQorICAgc2FtZSBkaXNrIGJsb2NrIChlLmcuIHdoZW4gc2FtcGxpbmcgYSBkYXRhYmFzZSByZWNvcmQgdGhhdCBpcworICAgZnJlcXVlbnRseSB1cGRhdGVkKSBtaWdodCBub3QgZ2l2ZSB5b3UgdXBkYXRlZCBkaXNrIGJsb2NrcyBkdWUgdG8gdGhlCisgICBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGNhY2hpbmcgb2YgdGhlIEMgbGlicmFyeSAodGhpcyBwcm9iYWJseSB2YXJpZXMKKyAgIGZyb20gb25lIHBsYXRmb3JtL2NvbXBpbGVyIGNvbWJpbmF0aW9uIHRvIGFub3RoZXIpLiBJZiBuZWNlc3NhcnkgeW91CisgICBjYW4gZm9yY2UgYSBmcmVzaCBkaXNrIHJlYWQgd2l0aCBhIGNsb3NlL29wZW4gc2VxdWVuY2U6CisKKyAgRkNMT1MgXCVjCisgIEZPUEVOIFwlYyBzYW1lZmlsZW5hbWUKKyAgRlNFRUsgXCVjIHNhbWVzcG90CisgIEZSRUFEIC9TSVpFOmhvd21hbnlieXRlcyBcJWMgdmFyaWFibGUKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDEuMjIuMy4gRklMRSBDb21tYW5kIEV4YW1wbGVzCisKKyAgIFRvIHJlYWQgdGhlIGxhc3QgMTAgbGluZXMgb2YgYSB0ZXh0IGZpbGUgaW50byBhbiBhcnJheToKKworICBmb3BlbiAvcmVhZCBcJWMgb29mYS50eHQgICAgICAgICAgICAgICAgOyBPcGVuIHRoZSBmaWxlCisgIGlmIGZhaWwgZXhpdCAxIENhbid0IG9wZW4gb29mYS50eHQgICAgICA7IEFsd2F5cyBjaGVjayBmb3IgZmFpbHVyZQorICBkY2wgXCZhWzEwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBEZWNsYXJlIGEgMTAtZWxlbWVudCBhcnJheQorICBmY291bnQgL2xpbmUgXCVjICAgICAgICAgICAgICAgICAgICAgICAgOyBDb3VudCBsaW5lcyBpbiB0aGUgZmlsZQorICBmc2VlayAvbGluZSBcJWMgXHYoZl9jb3VudCktMTAgICAgICAgICAgOyBTZWVrIHRvIDEwIGxpbmVzIGZyb20gdGhlIGVuZAorICBpZiBmYWlsIGV4aXQgMSBDYW4ndCBzZWVrICAgICAgICAgICAgICAgOyBDaGVjayBmb3IgZmFpbHVyZQorICBmb3IgXCVpIDEgMTAgMSB7IGZyZWFkIFwlYyBcJmFbXCVpXSB9ICAgOyBSZWFkIHRoZSBsYXN0IDEwIGxpbmVzCisgIGZjbG9zZSBcJWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IENsb3NlIHRoZSBmaWxlCisKKyAgIE5vdGUgdGhhdCBibGFuayBsaW5lcyBzaG93IHVwIGFzIGVtcHR5ICh1bmRlZmluZWQpIGFycmF5IGVsZW1lbnRzLCBmb3IKKyAgIGV4YW1wbGUgaWYgeW91IGdpdmUgYSAic2hvdyBhcnJheSBhIiBjb21tYW5kIGF0IHRoaXMgcG9pbnQuIFRoaXMgaXMKKyAgIG5vcm1hbC4gWW91IGNhbiBzdGlsbCB1c2UgdGhlc2UgZWxlbWVudHM7IGUuZy46CisKKyAgZm9yIFwlaSAxIDEwIDEgeyBlY2hvIFwlaS4gXCZhW1wlaV0gfSAgIDsgRGlzcGxheSB0aGUgMTAgbGluZXMKKworICAgSGVyZSBpcyBob3cgdG8gcmVhZCB0aGUgbGFzdCBsaW5lIG9mIGEgZmlsZSAoYWxyZWFkeSBvcGVuIG9uIGNoYW5uZWwKKyAgIFwlYyk6CisKKyAgZnNlZWsgL2xpbmUgXCVjIGxhc3QgICAgICAgICAgICAgICAgICAgIDsgU2VlayBkaXJlY3RseSB0byBsYXN0IGxpbmUKKworICAgQWx0ZXJuYXRpdmVseToKKworICBmc2VlayAvbGluZSBcJWMgZW9mICAgICAgICAgICAgICAgICAgICAgOyBTZWVrIHRvIGVuZCBvZiBmaWxlCisgIGZzZWVrIC9saW5lIFwlYyAtMSAgICAgICAgICAgICAgICAgICAgICA7IFNlZWsgdG8gYmVnaW5uaW5nIG9mIGxhc3QgbGluZQorCisgICBBbHRlcm5hdGl2ZWx5OgorCisgIGZjb3VudCAvbGluZSBcJWMgICAgICAgICAgICAgICAgICAgICAgICA7IENvdW50IHRoZSBmaWxlJ3MgbGluZXMKKyAgZnNlZWsgL2xpbmUgXCVjIFx2KGZfY291bnQpLTEgICAgICAgICAgIDsgU2VlayB0byBsYXN0IGxpbmUKKyAgZnJlYWQgXCVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgUmVhZCBpdAorCisgICBUbyByZWFkIGV2ZXJ5IG90aGVyIGxpbmUgZnJvbSB0aGUgZmlsZSAodXNpbmcgcmVsYXRpdmUgU0VFSyksIHNraXBwaW5nCisgICB0aGUgZmlyc3QgbGluZToKKworICBmb3BlbiAvcmVhZCBcJWMgb29mYS50eHQgICAgICAgICAgICAgICAgOyBPcGVuIHRoZSBmaWxlCisgIHdoaWxlICggc3VjY2VzcyApIHsgICAgICAgICAgICAgICAgICAgICA7IExvb3AgdGhyb3VnaCBsaW5lcworICAgICAgZnNlZWsgL2xpbmUgXCVjICsxICAgICAgICAgICAgICAgICAgOyBTa2lwIGEgbGluZQorICAgICAgaWYgc3VjY2VzcyBmcmVhZCBcJWMgICAgICAgICAgICAgICAgOyBSZWFkICYgZGlzcGxheSBhIGxpbmUKKyAgfQorICBmY2xvc2UgXCVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbG9zZSB0aGUgZmlsZQorCisgICBIZXJlIGlzIGhvdyB0byByZWFkIHRoZSBsaW5lcyBvZiBhIGZpbGUgaW4gcmV2ZXJzZSBvcmRlcjoKKworICBmb3BlbiAvcmVhZCBcJWMgb29mYS50eHQgICAgICAgICAgICAgICAgOyBPcGVuCisgIGlmIGZhaWwgZXhpdCAxICAgICAgICAgICAgICAgICAgICAgICAgICA7IENoZWNrCisgIGZzZWVrIC9saW5lIFwlYyBsYXN0ICAgICAgICAgICAgICAgICAgICA7IFNlZWsgdG8gbGFzdCBsaW5lCisgIHdoaWxlIHN1Y2Nlc3MgeyAgICAgICAgICAgICAgICAgICAgICAgICA7IExvb3AKKyAgICAgIGZyZWFkIFwlYyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgUmVhZCBsaW5lCisgICAgICBmc2VlayAvbGluZSBcJWMgLTIgICAgICAgICAgICAgICAgICA7IFNlZWsgYmFja3dhcmRzIHR3byBsaW5lcworICB9CisgIGZjbG9zZSBcJWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IENsb3NlIHRoZSBmaWxlCisKKyAgIFRoZSBsb29wIHdvcmtzIGJlY2F1c2UgYSByZWxhdGl2ZSBTRUVLIG91dHNpZGUgdGhlIGZpbGUgZmFpbHMuCisKKyAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIGJsb2NrIGkvbyB0byBtYW5hZ2UgcmFuZG9tLWFjY2VzcyBmaWxlcworICAgd2l0aCBmaXhlZC1sZW5ndGggcmVjb3JkcyAoYXMgbG9uZyBhcyB0aGV5IGRvbid0IGNvbnRhaW4gTlVMCisgICBjaGFyYWN0ZXJzKS4gU3VwcG9zZSwgZm9yIGV4YW1wbGUsIHlvdSBoYXZlIGEgZmlsZSBvZiAiY2FyZCBpbWFnZSIKKyAgIHJlY29yZHMgd2l0aCBmaXhlZC1maWVsZCBpbmZvcm1hdGlvbiBhYm91dCBjdXN0b21lcnMsIHN1Y2ggYXM6CisKKyAgTmFtZTogICAgIENvbHVtbnMgIDEtMzIgIChjb2x1bW4gbnVtYmVycyBhcmUgMS1iYXNlZCkKKyAgQWRkcmVzczogIENvbHVtbnMgMzMtNzIKKyAgQmFsYW5jZTogIENvbHVtbnMgNzMtODAKKworICAgVGhlIHJlY29yZHMgYXJlIGluZGV4ZWQgYnkgY3VzdG9tZXIgbnVtYmVyLCBzdGFydGluZyB3aXRoIDAuIFRoZXJlIGFyZQorICAgbm8gbGluZSB0ZXJtaW5hdG9ycyBzZXBhcmF0aW5nIHRoZW0uIFRoZXJlZm9yZSB0aGUgcmVjb3JkIGZvciBjdXN0b21lcgorICAgbnVtYmVyIG4gc3RhcnRzIGF0IHBvc2l0aW9uIG54IDgwIChcJW4qODApLgorCisgICBOb3cgc3VwcG9zZSB3ZSByZWNlaXZlZCBhIHBheW1lbnQgZnJvbSBjdXN0b21lciBudW1iZXIgMTczIGFuZCB3YW50IHRvCisgICB1cGRhdGUgdGhlIGJhbGFuY2U6CisKKyAgLlwlbiA9IDE3MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IEN1c3RvbWVyIChyZWNvcmQpIG51bWJlcgorICAuXCVhID0gMTIuNzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQW1vdW50CisgIGZvcGVuIC9yZWFkIC93cml0ZSBcJWMgY3VzdG9tZXIuZGIgICAgICAgOyBPcGVuIHRoZSBmaWxlCisgIGlmIGZhaWwgc3RvcCAxIE9QRU4gRkFJTEVEOiBcZl9lcnJtc2coKSAgOyBDaGVjaworICBmc2VlayAvYnl0ZSBcJWMgODAqXCVuICAgICAgICAgICAgICAgICAgIDsgU2VlayB0byByZWNvcmQKKyAgZnJlYWQgL3NpemU6ODAgXCVjIHIgICAgICAgICAgICAgICAgICAgICA7IFJlYWQgdGhlIHJlY29yZAorICBpZiBmYWlsIHN0b3AgMSBSRUFEIEZBSUxFRDogXGZfZXJybXNnKCkgIDsgQ2hlY2sgKElNUE9SVEFOVCkKKyAgLlwlYiA6PSBcZnJpZ2h0KFxtKHIpLDgpICAgICAgICAgICAgICAgICA7IEV4dHJhY3QgdGhlIGJhbGFuY2UKKyAgLlwlYiA6PSBcZmZwYWRkKFwlYixcJWEsMikgICAgICAgICAgICAgICA7IEFkZCB0aGUgbmV3IHBheW1lbnQKKyAgaWYgZmFpbCBzdG9wIDEgQVJJVEhNRVRJQyBFUlJPUjogXCViL1wlYSA7IENhdGNoIGJhZCByZWNvcmRzCisgIC5yIDo9IHtcZmxlZnQoXG0ociksNzIpXGZscGFkKFwlYiw4KX0gICAgOyBVcGRhdGUgdGhlIHJlY29yZAorICBmc2VlayAvYnl0ZSBcJWMgODAqXCVuICAgICAgICAgICAgICAgICAgIDsgUmVwb3NpdGlvbiB0byBzYW1lIHNwb3QKKyAgZndyaXRlIC9zaXplOjgwIFwlYyB7XG0ocil9ICAgICAgICAgICAgICA7IFJlcGxhY2UgdGhlIHJlY29yZAorICBpZiBmYWlsIHN0b3AgMSBXUklURSBGQUlMRUQ6IFxmX2Vycm1zZygpIDsgQ2hlY2sKKyAgZmNsb3NlIFwlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IENsb3NlIHRoZSBmaWxlCisKKyAgIFJFTUVNQkVSOiBVc2luZyBGSUxFIFNFRUsgdG8gbW92ZSBiZXlvbmQgdGhlIGVuZCBvZiBmaWxlIGNhbiByZXN1bHQgaW4KKyAgIGEgZmlsZSB3aXRoIGhvbGVzIHdoZW4gd3JpdGluZzsgd2hlbiByZWFkaW5nLCBhbiBlbmQtb2YtZmlsZSBlcnJvcgorICAgd2lsbCBvY2N1ciAtLSBiZSBzdXJlIHRvIGNoZWNrIGZvciBpdC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDEuMjIuNC4gQ2hhbm5lbCBOdW1iZXJzCisKKyAgIEMtS2VybWl0J3MgY2hhbm5lbCBudW1iZXJzIGFyZSBpbnRlZ2VycyBmcm9tIDAgdG8gc29tZQorICAgcGxhdGZvcm0tZGVwZW5kZW50IGxpbWl0LCBzdWNoIGFzIDQ2IG9yIDE5ODUgKHRoZSB2YWx1ZSBvZiBcdihmX21heCkpLgorICAgVGhpcyBpcyB0aGUgbGltaXQgcGxhY2VkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHRoZSBudW1iZXIgb2YKKyAgIGZpbGVzIHRoYXQgbWF5IGJlIG9wZW5lZCBieSBvbmUgcHJvY2VzcyBvciB1c2VyIG9yIGpvYiwgbWludXMgdGhlCisgICBzdGFuZGFyZCBpbnB1dCwgb3V0cHV0LCBhbmQgZXJyb3IgZmlsZXMsIGFuZCBtaW51cyB0aGUgbnVtYmVyIG9mIGZpbGVzCisgICByZXNlcnZlZCBieSBDLUtlcm1pdCBmb3IgbG9ncywgT1BFTiBSRUFEIGFuZCBXUklURSwgYW5kIGZpbGUgdHJhbnNmZXIKKyAgIChhbmQgbWF5YmUgc29tZSBjb21tYW5kIGZpbGVzIC0tIHRoZSBcdihmX21heCkgbnVtYmVyIGNhbid0IGJlIGV4YWN0KS4KKworICAgQWx0aG91Z2ggeW91IG11c3QgaW5jbHVkZSBhIHZhcmlhYmxlIGluIHRoZSBGSUxFIE9QRU4gY29tbWFuZCwgdG8KKyAgIHdoaWNoIHRoZSBjaGFubmVsIG51bWJlciBpcyBhc3NpZ25lZCwgeW91IGRvbid0IGhhdmUgdG8gdXNlIGEgdmFyaWFibGUKKyAgIGluIHRoZSBvdGhlciBGSUxFIGNvbW1hbmRzIGlmIHlvdSBrbm93IHdoYXQgdGhlIG51bWJlciBpcyAtLSB5b3UgY2FuCisgICBqdXN0IHB1dCB0aGUgbnVtYmVyLiBUaGlzIHNhdmVzIHlvdSBhIGZldyBrZXlzdHJva2VzIHdoZW4gdHlwaW5nCisgICBjb21tYW5kcyBhdCB0aGUgcHJvbXB0OgorCisgIGZvcGVuIFwlYyBvb2ZhLnR4dAorICBmbGlzdAorICAwLiAvdXNyL29sZ2Eub29mYS50eHQgKFIpIDAKKworICAgVGhpcyB0ZWxscyB0aGUgY2hhbm5lbCBudW1iZXIgaXMgMCAodGhlIG51bWJlciBvbiB0aGUgbGVmdCBpcyB0aGUKKyAgIGNoYW5uZWwgZmlsZSdzIGNoYW5uZWwgbnVtYmVyKS4gT2YgY291cnNlIHlvdSBjYW4gYWxzbyBmaW5kIGl0IGJ5CisgICBlY2hvaW5nIHRoZSB2YXJpYWJsZToKKworICBlY2hvIFwlYworICAwCisKKyAgIE9yIHdpdGggImZzdGF0dXMgXCVjIi4gTm93IHlvdSBjYW4gdHlwZSBjb21tYW5kcyBsaWtlOgorCisgIGZyZWFkIDAKKworICAgdG8gcmVhZCBhIGxpbmUgZnJvbSB0aGUgZmlsZS4gT2J2aW91c2x5LCBob3dldmVyLCB1c2luZyBkaWdpdHMgcmF0aGVyCisgICB0aGFuIGEgdmFyaWFibGUgZm9yIHRoZSBjaGFubmVsIG51bWJlciB3b3VsZCBiZSBwb29yIHByYWN0aWNlIGluIGEKKyAgIHNjcmlwdC4KKworICAgSWYgaW4gY29tbWFuZHMgbGlrZToKKworICBmcmVhZCBcJWMgXCVhCisKKyAgIHlvdSBoYXZlIHRyb3VibGUgcmVtZW1iZXJpbmcgd2hpY2ggdmFyaWFibGUgaXMgd2hpY2gsIG5vdGUgdGhhdCB0aGUKKyAgIGNoYW5uZWwgbnVtYmVyIGlzLCBpbmRlZWQsIGEgbnVtYmVyLiBBbnl3aGVyZSBDLUtlcm1pdCBhY2NlcHRzIGEKKyAgIG51bWJlciBpdCBjYW4gYWxzbyBhY2NlcHQgYW4gZXhwcmVzc2lvbiwgc28geW91IGNhbiBwdXQgcGFyZW50aGVzZXMKKyAgIGFyb3VuZCB0aGUgY2hhbm5lbCBudW1iZXIgdG8gcmVtaW5kIHlvdSBpdCdzIHRoZSBjaGFubmVsIG51bWJlciBhbmQKKyAgIG5vdCB0aGUgdmFyaWFibGUgaW50byB3aGljaCBkYXRhIGlzIHRvIGJlIHJlYWQ6CisKKyAgZnJlYWQgKFwlYykgXCVhCisKKyAgIE5vcm1hbGx5IGNoYW5uZWwgbnVtYmVycyBhcmUgYXNzaWduZWQgc2VxdWVudGlhbGx5IGFzIDAsIDEsIDIsIC4uLiB1cAorICAgdG8gdGhlIGxpbWl0LiBIb3dldmVyLCBvbmNlIHlvdSBzdGFydCBjbG9zaW5nIGZpbGVzLCB0aGVyZSBjYW4gYmUKKyAgIGhvbGVzIGluIHRoZSBzZXF1ZW5jZS4gTmV3IGNoYW5uZWxzIGFyZSBhc3NpZ25lZCB0byBmaWxsIGluIHRoZSBob2xlcy4KKyAgIFRodXMgeW91IGNhbid0IGRlcGVuZCBvbiBjaGFubmVsIG51bWJlcnMgYmVpbmcgaW4gYW55IHBhcnRpY3VsYXIKKyAgIHNlcXVlbmNlLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMS4yMi41LiBGSUxFIENvbW1hbmQgRXJyb3JzCisKKyAgIEVhY2ggRklMRSBjb21tYW5kIHNldHMgdGhlIHZhcmlhYmxlIFx2KGZfZXJyb3IpIHRvIG9uZSBvZiB0aGUKKyAgIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgICAwID0gTm8gZXJyb3IKKyAgIC0xID0gU3lzdGVtIGVycm9yCisgICAtMiA9IEF0dGVtcHQgdG8gcmVhZCBhZnRlciBlbmQgb2YgZmlsZQorICAgLTMgPSBDaGFubmVsIG5vdCBvcGVuCisgICAtNCA9IENoYW5uZWwgbnVtYmVyIG91dCBvZiByYW5nZSAobmVnYXRpdmUgb3IgdG9vIGxhcmdlKQorICAgLTUgPSBOdW1lcmljIGFyZ3VtZW50IChzaXplLCAuLi4pIG91dCBvZiByYW5nZQorICAgLTYgPSBGaWxlIG5vdCBmb3VuZAorICAgLTcgPSBCYWQgb3IgbWlzc2luZyBmaWxlbmFtZQorICAgLTggPSBUb28gbWFueSBmaWxlcyBhcmUgYWxyZWFkeSBvcGVuIChGSUxFIE9QRU4gb25seSkKKyAgIC05ID0gRm9yYmlkZGVuIG9wZXJhdGlvbiAoZS5nLiB3cml0ZSB0byBhIHJlYWQtb25seSBmaWxlKQorICAtMTAgPSBBY2Nlc3MgZGVuaWVkCisgIC0xMSA9IElsbGVnYWwgY29tYmluYXRpb24gb2YgT1BFTiBtb2RlcyAoRklMRSBPUEVOIG9ubHkpCisgIC0xMiA9IEJ1ZmZlciBvdmVyZmxvdworICAtMTMgPSBDdXJyZW50IGxpbmUgbnVtYmVyIHVua25vd24gKGZvciByZWxhdGl2ZSBsaW5lIHNlZWtzKQorICAtMTQgdGhyb3VnaCAtOTg6IFJlc2VydmVkLgorICAtOTkgPSBSZXF1ZXN0ZWQgb3BlcmF0aW9uIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24gb2YgQy1LZXJtaXQKKyAtOTk5ID0gVW5rbm93biBlcnJvcgorCisgICBXaGVuIFx2KGZfZXJyb3IpIGlzIC0xLCB0aGlzIG1lYW5zIHRoZSBGSUxFIGNvbW1hbmQgZmFpbGVkIGJlY2F1c2UKKyAgIGJlY2F1c2Ugb2YgYSBzeXN0ZW0gZXJyb3IsIGluIHdoaWNoIGNhc2UgeW91IGNhbiBleGFtaW5lIHRoZSBmb2xsb3dpbmcKKyAgIHZhcmlhYmxlczoKKworICBcdihlcnJubykgICAgID0gU3lzdGVtIGVycm9yIG51bWJlci4KKyAgXHYoZXJyc3RyaW5nKSA9IEVycm9yIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byBcdihlcnJubykuCisKKyAgIEEgc3BlY2lhbCBmdW5jdGlvbiBpcyBhdmFpbGFibGUgZm9yIHRyYW5zbGF0aW5nIHRoZSBcdihmX2Vycm9yKSBjb2RlCisgICB0byBhbiBlcnJvciBtZXNzYWdlIHN0cmluZzoKKworXGZfZXJybXNnKFtjb2RlXSkKKyAgSWYgdGhlIGNvZGUgaXMgLTEsIHJldHVybnMgZXJyb3IgbWVzc2FnZSBvZiB0aGUgbW9zdCByZWNlbnQgc3lzdGVtCisgIGVycm9yOyBvdGhlcndpc2UgaWYgdGhlIGNvZGUgaXMgYSB2YWxpZCBcdihmX2Vycm9yKSB2YWx1ZSwgdGhlIGFzc29jaWF0ZWQKKyAgbWVzc2FnZSBpcyByZXR1cm5lZC4gIElmIHRoZSBjb2RlIGlzIG9taXR0ZWQsIHRoZSBzdGF0dXMgbWVzc2FnZQorICBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IFx2KGZfZXJyb3IpIHZhbHVlIGlzIHJldHVybmVkLgorCisgICBBIEZJTEUgY29tbWFuZCB0aGF0IGZhaWxzIHByaW50cyB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZQorICAgYXV0b21hdGljYWxseSwgZXhjZXB0IHdoZW4gdGhlIGNvbW1hbmQgaXMgUkVBRCBvciBTRUVLIGFuZCB0aGUgZXJyb3IKKyAgIGlzIC0yIChlbmQgb2YgZmlsZSk7IGluIHRoYXQgY2FzZSwgdGhlIGNvbW1hbmQgc3RpbGwgZmFpbHMsIGJ1dCBkb2VzCisgICBub3QgcHJpbnQgYSBtZXNzYWdlLiBUaGlzIGFsbG93cyBjb25zdHJ1Y3Rpb25zIHN1Y2ggYXM6CisKKyAgZm9wZW4gXCVjIG9vZmEudHh0CisgIHdoaWxlIHN1Y2Nlc3MgeyBmcmVhZCBcJWMgfQorICBmY2xvc2UgXCVjCisKKyAgIHRvIHdvcmsgYXMgZXhwZWN0ZWQsIGkuZS4gd2l0aG91dCBhbiBhbm5veWluZyBtZXNzYWdlIHdoZW4gdGhlIGVuZCBvZgorICAgZmlsZSBpcyByZWFjaGVkLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMS4yMi42LiBGaWxlIEkvTyBWYXJpYWJsZXMKKworICAgVGhlIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgaS9vIHBhY2thZ2UgYXJlOgorCisgICBcdihmX2NvdW50KQorICAgICAgICAgIFJlc3VsdCBvZiB0aGUgbW9zdCByZWNlbnQgRklMRSBDT1VOVCAoRkNPVU5UKSBjb21tYW5kLgorCisgICBcdihmX2Vycm9yKQorICAgICAgICAgIE51bWVyaWMgZXJyb3IgY29kZSBvZiBtb3N0IHJlY2VudCBGSUxFIGNvbW1hbmQgKDAgPSBubyBlcnJvcikuCisKKyAgIFx2KGZfbWF4KQorICAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIGZpbGVzIG9wZW4gc2ltdWx0YW5lb3VzbHkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAxLjIyLjcuIEZpbGUgSS9PIEZ1bmN0aW9ucworCisgICBTb21lIG9mIHRoZSBGSUxFIGNvbW1hbmRzIGNhbiBhbHNvIGJlIGlzc3VlZCBhcyBmdW5jdGlvbiBjYWxscywgd2hpY2gKKyAgIG1ha2VzIHNjcmlwdCB3cml0aW5nIGEgYml0IG1vcmUgY29udmVuaWVudCwgZXNwZWNpYWxseSBmb3IgQworICAgcHJvZ3JhbW1lcnMuIEFsc28sIHNldmVyYWwgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0aGF0IGRvIG5vdCBoYXZlCisgICBjb21tYW5kIGVxdWl2YWxlbnRzLiBFYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyB0YWtlcyBhIGNoYW5uZWwgbnVtYmVyIGFzCisgICB0aGUgZmlyc3QgYXJndW1lbnQuIFRoZXNlIGZ1bmN0aW9ucyBkbyBub3Qgd29yayBmb3IgT1BFTiB7IFJFQUQsCisgICAhUkVBRCwgV1JJVEUsICFXUklURSwgYW5kIEFQUEVORCB9IGZpbGVzLgorCisgICBcZl9zdGF0dXMoY2hhbm5lbCkKKyAgICAgICAgICBSZXR1cm5zIDAgaWYgdGhlIGNoYW5uZWwgaXMgbm90IG9wZW4sIG90aGVyd2lzZSBhIG51bWJlcgorICAgICAgICAgIGJldHdlZW4gMSBhbmQgMTUgd2hpY2ggaXMgdGhlIHN1bSBvZiB0aGUgT1BFTiBtb2RlczoKKworICAxID0gL1JFQUQKKyAgMiA9IC9XUklURQorICA0ID0gL0FQUEVORAorICA4ID0gL0JJTkFSWQorCisgICBUaGUgcmVtYWluaW5nIGZ1bmN0aW9ucyB3b3JrIG9ubHkgZm9yIG9wZW4gY2hhbm5lbHMuIEVhY2ggb2YgdGhlc2UKKyAgIGZ1bmN0aW9ucyBjYW4gZmFpbCBmb3IgdGhlIGFwcGxpY2FibGUgcmVhc29ucyBsaXN0ZWQgaW4gWzM3OV1TZWN0aW9uCisgICAxLjIyLjUuIEZvciBpbnN0cnVjdGlvbnMgb24gaGFuZGxpbmcgZnVuY3Rpb24gZXJyb3JzLCBzZWUgWzM4MF1TZWN0aW9uCisgICA3LjEyLgorCisgICBcZl9wb3MoY2hhbm5lbCkKKyAgICAgICAgICBSZXR1cm5zIHRoZSBmaWxlJ3MgY3VycmVudCByZWFkL3dyaXRlIHBvaW50ZXIgKDAtYmFzZWQpLiBUaGVyZQorICAgICAgICAgIGlzIG5vIEZJTEUgY29tbWFuZCBlcXVpdmFsZW50LgorCisgICBcZl9saW5lKGNoYW5uZWwpCisgICAgICAgICAgUmV0dXJucyB0aGUgZmlsZSdzIGN1cnJlbnQgbGluZSBudW1iZXIgKDAtYmFzZWQpLCBpZiBrbm93biwKKyAgICAgICAgICBvdGhlcndpc2UgLTEuIFRoZXJlIGlzIG5vIEZJTEUgY29tbWFuZCBlcXVpdmFsZW50LiBUaGUgbGluZQorICAgICAgICAgIG51bWJlciBpcyBrbm93biBhcyBsb25nIGFzIG5vIGNoYXJhY3RlciBvciBibG9jayBpL28gaGFzIGJlZW4KKyAgICAgICAgICBkb25lIG9uIHRoZSBjaGFubmVsLgorCisgICBcZl9oYW5kbGUoY2hhbm5lbCkKKyAgICAgICAgICBSZXR1cm5zIHRoZSAiZmlsZSBoYW5kbGUiIG9mIHRoZSBmaWxlLiBUaGF0IGlzLCBpdCB0cmFuc2xhdGVzCisgICAgICAgICAgdGhlIHBvcnRhYmxlIEMtS2VybWl0IGNoYW5uZWwgbnVtYmVyIGludG8gYSBzeXN0ZW0tc3BlY2lmaWMKKyAgICAgICAgICBmaWxlIGhhbmRsZSBvciBudW1iZXIgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIG90aGVyIHByb2dyYW1zIG9uCisgICAgICAgICAgdGhlIHNhbWUgcGxhdGZvcm0uIEluIFVOSVggdGhpcyBpcyBhIGZpbGUgZGVzY3JpcHRvci4gVGhlcmUgaXMKKyAgICAgICAgICBubyBGSUxFIGNvbW1hbmQgZXF1aXZhbGVudC4KKworICAgXGZfZW9mKGNoYW5uZWwpCisgICAgICAgICAgUmV0dXJucyAxIGlmIHRoZSByZWFkL3dyaXRlIHBvaW50ZXIgb2YgdGhlIGZpbGUgb24gdGhlIGdpdmVuCisgICAgICAgICAgY2hhbm5lbCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCAwIG90aGVyd2lzZS4gQ29udmVuaWVudCBpbgorICAgICAgICAgIFdISUxFIHN0YXRlbWVudHMsIGUuZy46CisKKyAgICB3aGlsZSBub3QgXGZfZW9mKFwlYykgeyBmcmVhZCBcJWMgfQorCisgICBcZl9nZXRjaGFyKGNoYW5uZWwpCisgICAgICAgICAgRXF1aXZhbGVudCB0byBGUkVBRCAvQ0hBUi4gUmV0dXJucyB0aGUgY2hhcmFjdGVyIGFjdHVhbGx5IHJlYWQuCisgICAgICAgICAgSWYgXGZfZ2V0Y2hhcigpIGRvZXMgbm90IGZhaWwgYnV0IHRoZSByZXR1cm4gdmFsdWUgaXMgZW1wdHksCisgICAgICAgICAgdGhpcyBtZWFucyBhIE5VTEwgY2hhcmFjdGVyIHdhcyByZWFkLgorCisgICBcZl9nZXRsaW5lKGNoYW5uZWwpCisgICAgICAgICAgRXF1aXZhbGVudCB0byBGUkVBRCAvTElORS4gUmV0dXJucyB0aGUgbGluZSBhY3R1YWxseSByZWFkLCBidXQKKyAgICAgICAgICB3aXRoIHRoZSBsaW5lIHRlcm1pbmF0b3Igc3RyaXBwZWQuIElmIFxmX2dldGxpbmUoKSBkb2VzIG5vdAorICAgICAgICAgIGZhaWwgYnV0IHRoZSByZXR1cm4gdmFsdWUgaXMgZW1wdHksIHRoaXMgbm9ybWFsbHkgbWVhbnMgYW4KKyAgICAgICAgICBlbXB0eSBsaW5lIHdhcyByZWFkLgorCisgICBcZl9nZXRibG9jayhjaGFubmVsLG4pCisgICAgICAgICAgRXF1aXZhbGVudCB0byBGUkVBRCAvU0laRTpuLiBSZXR1cm5zIHRoZSBibG9jayBvZiBjaGFyYWN0ZXJzCisgICAgICAgICAgYWN0dWFsbHkgcmVhZC4gSWYgdGhlIHJldHVybmVkIGJsb2NrIGlzIHNtYWxsZXIgdGhhbiBuLCBpdAorICAgICAgICAgIGluZGljYXRlcyBlaXRoZXIgdGhhdCB0aGUgZW5kIG9mIGZpbGUgd2FzIHJlYWNoZWQgb3IgYSBOVUwKKyAgICAgICAgICBjaGFyYWN0ZXIgaXMgaW4gdGhlIGJsb2NrLgorCisgICBcZl9wdXRjaGFyKGNoYW5uZWwsYykKKyAgICAgICAgICBFcXVpdmFsZW50IHRvIEZXUklURSAvQ0hBUkFDVEVSLiBXcml0ZXMgdGhlIGNoYXJhY3RlciBjLiBJZiBjCisgICAgICAgICAgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIsIG9ubHkgdGhlIGZpcnN0IGlzIHdyaXR0ZW4uIElmCisgICAgICAgICAgYyBpcyBlbXB0eSBhIE5VTCBpcyB3cml0dGVuLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycworICAgICAgICAgIHdyaXR0ZW4gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIHVwb24gZmFpbHVyZS4KKworICAgXGZfcHV0bGluZShjaGFubmVsLHN0cmluZykKKyAgICAgICAgICBFcXVpdmFsZW50IHRvIEZXUklURSAvTElORS4gV3JpdGVzIHRoZSBzdHJpbmcgYW5kIGFkZHMgdGhlCisgICAgICAgICAgYXBwcm9wcmlhdGUgbGluZSB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIgb3Igc2VxdWVuY2UuIElmIHRoZQorICAgICAgICAgIHN0cmluZyBpcyBlbXB0eSBvciBvbWl0dGVkLCBhbiBlbXB0eSBsaW5lIGlzIHdyaXR0ZW4uIFJldHVybnMKKyAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlCisgICAgICAgICAgZXJyb3IgY29kZSB1cG9uIGZhaWx1cmUuCisKKyAgIFxmX3B1dGJsb2NrKGNoYW5uZWwsc3RyaW5nKQorICAgICAgICAgIEVxdWl2YWxlbnQgdG8gRldSSVRFIC9TVFJJTkcuIFdyaXRlcyB0aGUgc3RyaW5nIGFzIGdpdmVuLiBJZgorICAgICAgICAgIHRoZSBzdHJpbmcgaXMgZW1wdHkgb3Igb21pdHRlZCwgbm90aGluZyBpcyB3cml0dGVuLiBSZXR1cm5zIHRoZQorICAgICAgICAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvcgorICAgICAgICAgIGNvZGUgdXBvbiBmYWlsdXJlLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMS4yMi44LiBGaWxlIEkvTyBGdW5jdGlvbiBFeGFtcGxlcworCisgIGZvcGVuIC9yZWFkIFwlYyBvb2ZhLnR4dCAgICAgICAgICAgIDsgT3BlbiBvdXIgZmF2b3JpdGUgZmlsZSBmb3IgcmVhZGluZworICBpZiBmYWlsdXJlIGV4aXQgMSAgICAgICAgICAgICAgICAgICA7IENoZWNrIHRoYXQgaXQncyBvcGVuCisgIHdoaWxlIG5vdCBcZl9lb2YoXCVjKSB7ICAgICAgICAgICAgIDsgTG9vcCB1bnRpbCBFT0YKKyAgICAgIC5saW5lIDo9IFxmX2dldGxpbmUoXCVjKSAgICAgICAgOyBHZXQgYSBsaW5lCisgICAgICBpZiBzdWNjZXNzIGVjaG8ge1xtKGxpbmUpfSAgICAgIDsgRWNobyBpdAorICB9CisgIGlmIG5vdCBcZl9lb2YoXCVjKSB7ICAgICAgICAgICAgICAgIDsgQ2hlY2sgcmVhc29uIGZvciBsb29wIGV4aXQKKyAgICAgIGV4aXQgMSBGaWxlIEVycm9yOiBcZl9lcnJtc2coKSAgOyBJZiBub3QgRU9GIHNheSBzby4KKyAgfQorCisgIGZyZXdpbmQgXCVjICAgICAgICAgICAgICAgICAgICAgICAgIDsgUmV3aW5kIHRoZSBmaWxlCisgIHdoaWxlIG5vdCBcZl9lb2YoXCVjKSB7ICAgICAgICAgICAgIDsgU2FtZSB0aGluZyBidXQgd2l0aCBibG9jayBpL28KKyAgICAgIC5ibG9jayA6PSBcZl9nZXRibG9jayhcJWMsMjU2KSAgOyAobXVjaCBmYXN0ZXIgdGhhbiBsaW5lIGkvbykKKyAgICAgIGlmIHN1Y2Nlc3MgeGVjaG8ge1xtKGJsb2NrKX0KKyAgfQorCisgIGZyZXdpbmQgXCVjICAgICAgICAgICAgICAgICAgICAgICAgIDsgUmV3aW5kIGFnYWluCisgIHdoaWxlIG5vdCBcZl9lb2YoXCVjKSB7ICAgICAgICAgICAgIDsgU2FtZSBkZWFsIGJ1dCB3aXRoIGNoYXJhY3RlciBpL28KKyAgICAgIC5jIDo9IFxmX2dldGNoYXIoXCVjKSAgICAgICAgICAgOyAobXVjaCBzbG93ZXIgdGhhbiBsaW5lIGkvbykKKyAgICAgIGlmIHN1Y2Nlc3MgeGVjaG8ge1xtKGMpfQorICB9CisgIGNsb3NlIFwlYworCisgICBUbyBjbG9zZSBhbGwgb3BlbiBmaWxlcyAoZXF1aXZhbGVudCB0byBGQ0xPU0UgQUxMKToKKworICBmb3IgXCVpIDAgXHYoZl9tYXgpLTEgMSB7CisgICAgICBpZiBcZl9zdGF0dXMoXCVpKSBmY2xvc2UgXCVpCisgIH0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxLjIzLiBUaGUgRVhFQyBDb21tYW5kCisKKyAgIFRoZSBFWEVDIGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9ubHkgaW4gVU5JWC4KKworICAgRVhFQyBbIC9SRURJUkVDVCBdIGNvbW1hbmQgWyBhcmcxIFsgYXJnMiBbIC4uLiBdIF0KKyAgICAgICAgICBSdW5zIHRoZSBnaXZlbiBjb21tYW5kIHdpdGggdGhlIGFyZ3VtZW50cyBpbiBzdWNoIGEgd2F5IHRoYXQKKyAgICAgICAgICB0aGUgY29tbWFuZCByZXBsYWNlcyBDLUtlcm1pdCBpbiBtZW1vcnksIGFuZCBDLUtlcm1pdCBjZWFzZXMgdG8KKyAgICAgICAgICBleGVjdXRlLiBFWEVDIGlzIGxpa2UgUlVOLCBleGNlcHQgaW5zdGVhZCBvZiByZXR1cm5pbmcgdG8KKyAgICAgICAgICBDLUtlcm1pdCB3aGVuIGZpbmlzaGVkLCB0aGUgY29tbWFuZCByZXR1cm5zIHRvIHdoYXRldmVyIHByb2Nlc3MKKyAgICAgICAgICBpbnZva2VkIEtlcm1pdC4KKworICAgSW4gdGhlIG5vcm1hbCBjYXNlLCBubyBmaWxlcyBhcmUgY2xvc2VkLCBzbyB0aGUgRVhFQydkIGNvbW1hbmQKKyAgIGluaGVyaXRzIHRoZSBvcGVuIGZpbGVzLCByZWFkL3dyaXRlIHBvaW50ZXJzLCB3b3JraW5nIGRpcmVjdG9yeSwKKyAgIHByb2Nlc3MgSUQsIHVzZXIgSUQgKHVubGVzcyBjb21tYW5kIGlzIFNVSUQpLCBncm91cCBJRCAodW5sZXNzIGNvbW1hbmQKKyAgIGlzIFNHSUQpLCBncm91cHMsIGV0Yy4gKEluIFVOSVgsIHRoZSBFWEVDIGNvbW1hbmQgaXMgc2ltcGx5IGEgZnJvbnQKKyAgIGVuZCBmb3IgZXhlY3ZwKCkuKQorCisgICBJZiB0aGUgL1JFRElSRUNUIHN3aXRjaCBpcyBpbmNsdWRlZCwgdGhlbiBpZiBhIGNvbm5lY3Rpb24gaXMgb3BlbiAoU0VUCisgICBMSU5FIG9yIFNFVCBIT1NUKSwgaXQgYmVjb21lcyB0aGUgc3RhbmRhcmQgaW5wdXQgYW5kIG91dHB1dCBvZiB0aGUKKyAgIEVYRUMnZCBwcm9ncmFtLiBJZiBubyBjb25uZWN0aW9uIGlzIG9wZW4sIHRoZSAvUkVESVJFQ1Qgc3dpdGNoIGhhcyBubworICAgZWZmZWN0LiBGb3IgZXhhbXBsZSB0byB1c2UgQy1LZXJtaXQgZm9yIFBQUCBkaWFsaW5nIGluIExpbnV4OgorCisgIHNldCBtb2RlbSB0eXBlIHVzciAgICAgICAgICA7IFNwZWNpZnkgdGhlIGtpbmQgb2YgbW9kZW0geW91IGhhdmUKKyAgc2V0IGxpbmUgL2Rldi90dHlTMSAgICAgICAgIDsgU3BlY2lmeSB0aGUgZGV2aWNlIGl0J3MgY29ubmVjdGVkIHRvCisgIHNldCBzcGVlZCA1NzYwMCAgICAgICAgICAgICA7IGFuZCB0aGUgc3BlZWQKKyAgc2V0IGZsb3cgcnRzL2N0cyAgICAgICAgICAgIDsgYW5kIGZsb3cgY29udHJvbC4KKyAgc2V0IGRpYWwgcmV0cmllcyAxMDAgICAgICAgIDsgVHJ5IHRoZSBkaWFsIHNlcXVlbmNlIHVwIHRvIDEwMCB0aW1lcy4KKyAgZGlhbCB7ezktMjEyLTU1NS0xMjEyfXs5LTIxMi01NTUtMTIxM317OS0yMTItNTU1LTEyMTR9ezktMjEyLTU1NS0xMjE1fX0KKyAgaWYgZmFpbCBleGl0IDEKKyAgZm9yIFwlaSAxIDE2IDEgeyAgICAgICAgICAgIDsgVHJ5IHVwIHRvIDE2IHRpbWVzIHRvIGdldCBsb2dpbiBwcm9tcHQKKyAgICAgIGlucHV0IDEwIExvZ2luOiAgICAgICAgIDsgV2FpdCAxMCBzZWMgZm9yIGl0IHRvIGFwcGVhcgorICAgICAgaWYgc3VjY2VzcyBicmVhayAgICAgICAgOyBHb3QgaXQgLSBwcm9jZWVkLi4uCisgICAgICBvdXRwdXQgXDEzICAgICAgICAgICAgICA7IFNlbmQgYSBjYXJyaWFnZSByZXR1cm4gYW5kIHRyeSBhZ2FpbgorICB9CisgIGlmICggPiBcJWkgMTYgKSBzdG9wIDEgTk8gTE9HSU4gUFJPTVBUCisgIGxpbmVvdXQgXChteXVzZXJpZCkgICAgICAgICA7IFNlbmQgdXNlciBJRAorICBpbnB1dCAzMCBhc3N3b3JkOiAgICAgICAgICAgOyBXYWl0IGZvciBQYXNzd29yZCBwcm9tcHQKKyAgaWYgZmFpbCBzdG9wIDEgTk8gUEFTU1dPUkQgUFJPTVBUCisgIGxpbmVvdXQgXG0obXlwYXNzd29yZCkgICAgICA7IFNlbmQgdGhlIHBhc3N3b3JkLgorICBleGVjIC9yZWRpcmVjdCBwcHBkICAgICAgICAgOyBSZXBsYWNlIG91cnNlbHZlcyB3aXRoIHBwcGQuCisKKyAgIEluIHRoaXMgZXhhbXBsZSB3ZSBhc3N1bWUgdGhhdCB0aGUgc2NyaXB0IGhhcyBhbHJlYWR5IHNldCB1cCB0aGUKKyAgIG15dXNlcmlkIGFuZCBteXBhc3N3b3JkIHZhcmlhYmxlcyAtLSBub3JtYWxseSB0aGUgcGFzc3dvcmQgc2hvdWxkIGJlCisgICBwcm9tcHRlZCBmb3IsIHJhdGhlciB0aGFuIHN0b3JlZCBvbiBkaXNrLiBOb3RpY2UgdGhlIGFkdmFudGFnZXMgb3ZlcgorICAgdGhlIHdlbGwta25vd24gImNoYXQgc2NyaXB0IjoKKyAgICAgKiBZb3UgZG9uJ3QgaGF2ZSB0byBjb250cm9sIHRoZSBtb2RlbSBpdHNlbGYgd2l0aCBBVCBjb21tYW5kczsKKyAgICAgICBLZXJtaXQncyBESUFMIGNvbW1hbmQgZG9lcyB0aGlzIGZvciB5b3UuCisgICAgICogWW91IGNhbiBoYXZlIEtlcm1pdCBhdXRvbWF0aWNhbGx5IHJlZGlhbCBhcyBtYW55IHRpbWVzIGFzIHlvdSB3YW50CisgICAgICAgdW50aWwgaXQgZ2V0cyBhIGNvbm5lY3Rpb24gKGlmIHRoaXMgaXMgbGVnYWwgaW4geW91ciBjb3VudHJ5KS4KKyAgICAgKiBZb3UgY2FuIGhhdmUgS2VybWl0IGZldGNoIHRoZSBudW1iZXIgb3IgbnVtYmVycyBmcm9tIGEgZGlhbGluZworICAgICAgIGRpcmVjdG9yeS4KKyAgICAgKiBZb3UgY2FuIGhhdmUgS2VybWl0IGN5Y2xlIHRocm91Z2ggYSBsaXN0IG9mIHBob25lIG51bWJlcnMgKHRoaXMgaXMKKyAgICAgICBuZXcgaW4gQy1LZXJtaXQgNy4wOyBzZWUgWzM4MV1TZWN0aW9uIDIuMS4xNikgd2l0aG91dCBoYXZpbmcgdG8KKyAgICAgICBlbnRlciB0aGUgbnVtYmVycyBpbiBhIGRpYWxpbmcgZGlyZWN0b3J5LgorICAgICAqIERpYWxpbmcgaXMgbG9jYXRpb24taW5kZXBlbmRlbnQ7IHlvdSBjYW4gdXNlIHRoZSBzYW1lIHNjcmlwdCB0bworICAgICAgIGRpYWwgZnJvbSBkaWZmZXJlbnQgYXJlYXMgb3IgY291bnRyaWVzLgorICAgICAqIE9uY2UgdGhlIGNvbm5lY3Rpb24gaXMgbWFkZSwgdGhlIGZ1bGwgcG93ZXIgb2YgS2VybWl0J3Mgc2NyaXB0CisgICAgICAgbGFuZ3VhZ2UgaXMgYXZhaWxhYmxlIHRvIG1hbmFnZSB0aGUgZGlhbG9nIHdpdGggdGhlIHRlcm1pbmFsCisgICAgICAgc2VydmVyIG9yIG90aGVyIGRldmljZSB0aGF0IGFuc3dlcnMgdGhlIHBob25lIGNhbGwuCisKKyAgIE5PVEU6IFBQUCBhbmQgU0xJUCBkaWFsaW5nIGFyZSBub3QgYXZhaWxhYmxlIGluIFdpbmRvd3MgOTUvOTgvTlQvMjAwMCwKKyAgIHdob3NlIEFQSXMgZG8gbm90IHByb3ZpZGUgYSBtZXRob2QgZm9yIGFuIGFwcGxpY2F0aW9uIHRvIGhhbmQgb3ZlciBhCisgICBjb25uZWN0aW9uIHRvIHRoZSBQUFAgb3IgU0xJUCBkcml2ZXIuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMS4yNC4gR2V0dGluZyBLZXl3b3JkIExpc3RzIHdpdGggJz8nCisKKyAgIFN1cHBvc2UgeW91IHR5cGUgInRlIiBhdCB0aGUgQy1LZXJtaXQ+IDYuMCBwcm9tcHQgYW5kIHRoZW4gRXNjIG9yIFRhYgorICAgdG8gcmVxdWVzdCBrZXl3b3JkIGNvbXBsZXRpb24uIEtlcm1pdCBiZWVwcywgaW5kaWNhdGluZyB0aGF0IG1vcmUgdGhhbgorICAgb25lIGNvbW1hbmQgc3RhcnRzIHdpdGggInRlIi4gQnV0IGlmIHlvdSB0eXBlICc/JyB0byBzZWUgd2hhdCB0aGV5CisgICBhcmUsIEtlcm1pdCBzaG93cyBvbmx5ICJ0ZWxuZXQiLiBTbyB3aHkgdGhlIGJlZXA/IEJlY2F1c2Ugb2YgaW52aXNpYmxlCisgICBrZXl3b3JkcyBsaWtlICJ0ZWxvcHQiLCAidGVybWluYWwiLCBhbmQgInRleHQiLiBMb3RzIG9mIGtleXdvcmRzIGFyZQorICAgaW52aXNpYmxlIGJlY2F1c2UgdGhleSBhcmUgZWl0aGVyIHN5bm9ueW1zIGZvciBvdGhlciBrZXl3b3JkcyBvciBlbHNlCisgICBlc290ZXJpYyBvcHRpb25zIHRvIGJlIHVzZWQgb25seSBpbiBzcGVjaWFsIGNpcmN1bXN0YW5jZXMsIHNvIHdlIGRvbid0CisgICB3YW50IHRoZW0gY2x1dHRlcmluZyB1cCB0aGUgbWVudXMuCisKKyAgIEJ1dCB0aGVuIHRoZXJlIGlzIG5vIHdheSBmb3IgeW91IHRvIGRpc2NvdmVyIHRoZW0uIFNvIGluIEMtS2VybWl0IDcuMCwKKyAgIGlmIHlvdSB0eXBlICc/JyBBRlRFUiB0aGUgYmVnaW5uaW5nIG9mIGEga2V5d29yZCBmaWVsZCwgdGhlbiBpbnZpc2libGUKKyAgIGtleXdvcmRzIGFyZSBzaG93biB0b286CisKKyAgQy1LZXJtaXQ+IHRlPEVzYz48QkVFUD4KKyAgQy1LZXJtaXQ+IHRlPyBDb21tYW5kLCBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgIHRlbG5ldCAgICB0ZWxvcHQgICAgdGVybWluYWwgIHRleHQKKyAgQy1LZXJtaXQ+dGUKKworICAgQnV0IGlmICc/JyBpcyB0eXBlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgZmllbGQsIG9ubHkgdmlzaWJsZSBrZXl3b3JkcworICAgYXJlIHNob3duLCBhcyBiZWZvcmUgKHNvLCBpbiB0aGlzIGV4YW1wbGUsIGlmICc/JyBpcyB0eXBlZCBhdCB0aGUKKyAgIEMtS2VybWl0PiBwcm9tcHQsICJ0ZWxuZXQiIGlzIHRoZSBvbmx5IGNvbW1hbmQgc2hvd24gdGhhdCBzdGFydHMgd2l0aAorICAgInRlIikuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMi4gTUFLSU5HIEFORCBVU0lORyBDT05ORUNUSU9OUyBUaGUgU0VUIExJTkUsIFNFVCBIT1NULCBhbmQgU0VUIFBPUlQgKGEKKyAgc3lub255bSBmb3IgU0VUIExJTkUpIGNvbW1hbmRzIGhhdmUgbmV3IHN5bm9ueW1zLCBpbiB3aGljaCB0aGUgd29yZCBTRVQgaXMKKyAgcmVwbGFjZWQgYnkgdGhlIHdvcmQgT1BFTjogT1BFTiBMSU5FLCBldGMuIFRoZXJlIGlzIG5vIG5ldyBmdW5jdGlvbmFsaXR5CisgIGhlcmUsIGJ1dCBPUEVOIGlzIGEgYmV0dGVyIHZlcmIsIHNpbmNlIFNFVCBnZW5lcmFsbHkgdGFrZXMgbm8gYWN0aW9uLCB3aGVyZWFzCisgIHRoZXNlIGNvbW1hbmRzIGFjdHVhbGx5IHRyeSB0byBvcGVuIGEgY29ubmVjdGlvbi4gRnVydGhlcm1vcmUsIHRoZXJlIGlzIHRoZQorICBzeW1tZXRyeSB3aXRoIENMT1NFLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDIuMC4gU0VUIExJTkUgYW5kIFNFVCBIT1NUIENvbW1hbmQgU3dpdGNoZXNUaGUgU0VUIExJTkUgKFNFVCBQT1JUKSBhbmQgU0VUCisgIEhPU1QgY29tbWFuZHMgbm93IGFsbG93IHN3aXRjaGVzIGJlZm9yZSB0aGUgZGV2aWNlIG9yIGhvc3QgbmFtZSwgaW4gbW9zdAorICBjYXNlcywgYW5kIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgYWxzbyBhdCB0aGUgZW5kLiBUaGUgbmV3IHN5bnRheCBpcworICBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcmV2aW91cyBzeW50YXg7IHRodXMgU0VUIExJTkUsIFNFVCBQT1JULCBhbmQKKyAgU0VUIEhPU1QgY29tbWFuZHMgaW4gY29tbWFuZCBmaWxlcyB3cml0dGVuIGZvciBDLUtlcm1pdCA2LjAgb3IgZWFybGllciBzdGlsbAorICB3b3JrLiBUaGUgZXhwYW5kZWQgc3ludGF4IGlzOgorCisgIHsgT1BFTiwgU0VUIH0geyBMSU5FLCBQT1JULCBIT1NUIH0gWyBzd2l0Y2hlcyBdIGRldmljZS1vci1hZGRyZXNzIFsgc3dpdGNoZXMKKyAgXQorCisgIFRoZSBmaXJzdCBncm91cCBvZiBzd2l0Y2hlcyBpczoKKworICAgL05FVFdPUkstVFlQRTp7VENQL0lQLFguMjUsUElQRSxQVFkuLi59CisgICAgICAgICAgV2hlbiBtb3JlIHRoYW4gb25lIG5ldHdvcmsgdHlwZSBpcyBhdmFpbGFibGUsIHRoaXMgbGV0cyB5b3UKKyAgICAgICAgICBzcGVjaWZ5IHRoZSB0eXBlIG9mIG5ldHdvcmsgdG8gdXNlIGZvciB0aGlzIGNvbm5lY3Rpb24gd2l0aG91dAorICAgICAgICAgIGFmZmVjdGluZyB5b3VyIGdsb2JhbCBTRVQgTkVUV09SSyBUWVBFLiBTZWUgWzM4Ml1TZWN0aW9uIDIuNworICAgICAgICAgIGFib3V0IHBpcGVzIGFuZCBwdHlzLgorCisgICAvVVNFUklEOltzdHJpbmddCisgICAgICAgICAgVGhpcyBzd2l0Y2ggaXMgZXF1aXZhbGVudCB0byBTRVQgTE9HSU4gVVNFUklELiBJZiBhIHN0cmluZyBpcworICAgICAgICAgIGdpdmVuLCBpdCBzZW50IHRvIGhvc3QgZHVyaW5nIFRlbG5ldCBuZWdvdGlhdGlvbnM7IGlmIHRoaXMKKyAgICAgICAgICBzd2l0Y2ggaXMgZ2l2ZW4gYnV0IHRoZSBzdHJpbmcgaXMgb21pdHRlZCwgbm8gdXNlciBJRCBpcyBzZW50CisgICAgICAgICAgdG8gdGhlIGhvc3QuIElmIHRoaXMgc3dpdGNoIGlzIG5vdCBnaXZlbiwgeW91ciBjdXJyZW50IExPR0lOCisgICAgICAgICAgVVNFUklEIChcdih1c2VyaWQpIHZhbHVlKSwgaWYgYW55LCBpcyBzZW50LiBVbmxpa2UgbW9zdCBvdGhlcgorICAgICAgICAgIHN3aXRjaGVzLCB0aGlzIG9uZSBpcyAic3RpY2t5Iiwgc2luY2UgdGhlIHZhbHVlIG11c3QgcGVyc2lzdAorICAgICAgICAgIHRocm91Z2hvdXQgdGhlIHNlc3Npb24gaW4gY2FzZSB0aGUgc2VydmVyIHJlcXVlc3RzIHRoZSBJRAorICAgICAgICAgIHN0cmluZyBhdCBhIGxhdGVyIHRpbWUuCisKKyAgIC9DT05ORUNUCisgICAgICAgICAgRW50ZXIgQ09OTkVDVCBtb2RlIGltbWVkaWF0ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZQorICAgICAgICAgIGRldmljZSBvciBjb25uZWN0aW9uIGlzIG9wZW4uIE9uIHNlcmlhbCBkZXZpY2VzLCBob3dldmVyLCB3aGVuCisgICAgICAgICAgQ0FSUklFUi1XQVRDSCBpcyBub3QgT0ZGLCB3YWl0IHVwIHRvIDEgc2Vjb25kIGZvciB0aGUgQ2FycmllcgorICAgICAgICAgIERldGVjdCBzaWduYWwgdG8gYXBwZWFyIGJlZm9yZSB0cnlpbmcgdG8gY29ubmVjdCwgdG8gZ2l2ZSB0aGUKKyAgICAgICAgICBkZXZpY2UgdGltZSB0byByZWFjdCBEVFIsIHdoaWNoIG1pZ2h0IGhhdmUgYmVlbiBvZmYgcHJpb3IgdG8KKyAgICAgICAgICBvcGVuaW5nIHRoZSBkZXZpY2UuCisKKyAgIC9TRVJWRVIKKyAgICAgICAgICBFbnRlciBzZXJ2ZXIgbW9kZSBpbW1lZGlhdGVseSBhbmQgYXV0b21hdGljYWxseSBhZnRlciB0aGUKKyAgICAgICAgICBkZXZpY2Ugb3IgY29ubmVjdGlvbiBpcyBvcGVuLiBUcmVhdG1lbnQgb2YgY2FycmllciBpcyB0aGUgc2FtZQorICAgICAgICAgIGFzIGZvciAvQ09OTkVDVC4KKworICAgL1dBSVQKKyAgIC9OT1dBSVQKKyAgICAgICAgICBGb3IgVGVsbmV0IGNvbm5lY3Rpb25zIG9ubHk6IExpa2UgU0VUIFRFTE5FVCBXQUlUIHsgT04sIE9GRiB9LAorICAgICAgICAgIGJ1dCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBjb25uZWN0aW9uLCBhbmQgaW4gZmFjdCBhcHBsaWVzIG9ubHkKKyAgICAgICAgICB3aGVuIE9QRU5pbmcgdGhpcyBjb25uZWN0aW9uICh3aGljaCBpcyB1c3VhbGx5IHRoZSBvbmx5IHBsYWNlCisgICAgICAgICAgaXQgbWF0dGVycykuIFR5cGljYWxseSB5b3Ugd291bGQgdXNlIFRFTE5FVCAvTk9XQUlUIHRvIG1ha2UgYQorICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBtaXNiZWhhdmluZyBUZWxuZXQgc2VydmVyIHRoYXQgZG9lcyBub3QgcmVwbHkKKyAgICAgICAgICB0byBuZWdvdGlhdGlvbnMgYXMgcmVxdWlyZWQgYnkgdGhlIFRlbG5ldCBwcm90b2NvbCBkZWZpbml0aW9uLgorCisgICBOb3RlOiAvQ09OTkVDVCBhbmQgL1NFUlZFUiBzd2l0Y2hlcyBhcmUgbm90IGF2YWlsYWJsZSBpbiB0aGUgUkxPR0lOCisgICBhbmQgVEVMTkVUIGNvbW1hbmRzLCBzaW5jZSB0aGVzZSBjb21tYW5kcyBhbHJlYWR5IGluY2x1ZGUgYW4gaW1wbGljaXQKKyAgIC9DT05ORUNUIGFuZCBwcmVjbHVkZSBhdXRvbWF0aWMgZW50cnkgaW50byBzZXJ2ZXIgbW9kZS4KKworICAgVGhlIC9DT05ORUNUIGFuZCAvU0VSVkVSIHN3aXRjaGVzIGFyZSBlc3BlY2lhbGx5IHVzZWZ1bCB3aXRoICJzZXQgaG9zdAorICAgKiIgY29ubmVjdGlvbnMuIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSB3YW50IHRvIHN0YXJ0IGEgS2VybWl0IHNlcnZlcgorICAgb24gc29ja2V0IDMwMDAgb2YgeW91ciBUQ1AgaG9zdC4gTm9ybWFsbHkgeW91IHdvdWxkIGhhdmUgdG8gZ2l2ZSB0aGUKKyAgIGNvbW1hbmQ6CisKKyAgc2V0IGhvc3QgKiAzMDAwCisKKyAgIGFuZCB0aGVuIHdhaXQgZm9yIGEgY29ubmVjdGlvbiB0byBjb21lIGluLCBhbmQgb25seSB0aGVuIGNvdWxkIHlvdQorICAgZ2l2ZSB0aGUgU0VSVkVSIGNvbW1hbmQgKG9yIGVsc2UgZGVmaW5lIGEgbWFjcm8gdG8gZG8gdGhpcywgYW5kIHRoZW4KKyAgIGV4ZWN1dGUgdGhlIG1hY3JvKS4gTm93IHlvdSBjYW4gZG8gaXQgaW4gb25lIHN0ZXA6CisKKyAgc2V0IGhvc3QgL3NlcnZlciAqIDMwMDAKKworICAgVGhpcyB0ZWxscyBDLUtlcm1pdCB0byB3YWl0IGZvciB0aGUgY29ubmVjdGlvbiBhbmQgdGhlbiBlbnRlciBzZXJ2ZXIKKyAgIG1vZGUgb25jZSBpdCBjb21lcyBpbiwgbm8gbWF0dGVyIGhvdyBsb25nIGl0IHRha2VzLiBTaW1pbGFybHksICJzZXQKKyAgIGhvc3QgL2Nvbm4gKiIgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgYSAiY2hhdCIgY29ubmVjdGlvbiB0byBjb21lIGluLgorCisgICBBbm90aGVyIHNldCBvZiBzd2l0Y2hlcyBpcyBhdmFpbGFibGUgaW4gVk1TIG9ubHksIGZvciB1c2Ugb25seSB3aXRoCisgICBTRVQgTElORToKKworICAgL1NIQVJFCisgICAgICAgICAgQWxsb3dzIHRoZSBTRVQgTElORSBkZXZpY2UgdG8gYmUgb3BlbmVkIGluIHNoYXJlZCBtb2RlLgorICAgICAgICAgIE5vcm1hbGx5IGl0IG1ha2VzIG5vIHNlbnNlIHRvIG9wZW4gYSBzZXJpYWwgZGV2aWNlIGluIHNoYXJlZAorICAgICAgICAgIG1vZGUsIGJ1dCBpdCdzIG5lY2Vzc2FyeSB3aGVuIEMtS2VybWl0IGlzIHJ1bm5pbmcgaW4gYW4KKyAgICAgICAgICBlbnZpcm9ubWVudCBzdWNoIGFzIERFQ0ludGFjdCwgdGhhdCBvcGVucyB5b3VyIGpvYidzCisgICAgICAgICAgY29udHJvbGxpbmcgdGVybWluYWwgaW4gc3VjaCBhIHdheSB0aGF0IEMtS2VybWl0IGNhbid0IG9wZW4gaXQKKyAgICAgICAgICB0b28sIHVubGVzcyBpdCBlbmFibGVzIFNIQVJFIHByaXZpbGVnZS4gTm90ZTogU0hBUkUgcHJpdmlsZWdlCisgICAgICAgICAgaXMgcmVxdWlyZWQuCisKKyAgIC9OT1NIQVJFCisgICAgICAgICAgUmVxdWlyZXMgdGhhdCB0aGUgU0VUIExJTkUgZGV2aWNlIG5vdCBiZSBpbiB1c2UgYnkgYW55IG90aGVyCisgICAgICAgICAgcHJvY2VzcyBpbiBvcmRlciBmb3IgaXQgdG8gYmUgc3VjY2Vzc2Z1bGx5IG9wZW5lZCBieSBDLUtlcm1pdC4KKyAgICAgICAgICBJZiBuZWl0aGVyIC9TSEFSRSBub3IgL05PU0hBUkUgaXMgc3BlY2lmaWVkLCAvTk9TSEFSRSBpcyB1c2VkLgorCisgICBUaGUgc2Vjb25kIGdyb3VwIG9mIHN3aXRjaGVzIGlzOgorCisgICAvTk8tVEVMTkVULUlOSVQKKyAgICAgICAgICBEbyBub3Qgc2VuZCBpbml0aWFsIFRlbG5ldCBuZWdvdGlhdGlvbnMgZXZlbiBpZiB0aGlzIGlzIGEKKyAgICAgICAgICBUZWxuZXQgcG9ydC4KKworICAgL1JBVy1TT0NLRVQKKyAgICAgICAgICBUaGlzIGlzIGEgY29ubmVjdGlvbiB0byBhIHJhdyBUQ1Agc29ja2V0IChbMzgzXVNlY3Rpb24gMi4zLjUpLgorCisgICAvUkxPR0lOCisgICAgICAgICAgVXNlIFJsb2dpbiBwcm90b2NvbCBldmVuIGlmIHRoaXMgaXMgbm90IGFuIFJsb2dpbiBwb3J0LgorCisgICAvVEVMTkVUCisgICAgICAgICAgU2VuZCBpbml0aWFsIFRlbG5ldCBuZWdvdGlhdGlvbnMgZXZlbiBpZiB0aGlzIGlzIG5vdCBhIFRlbG5ldAorICAgICAgICAgIHBvcnQuCisKKyAgIEFzIG9mIEMtS2VybWl0IDcuMCBhbmQgSzk1IDEuMS4xOSwgdGhlIFRFTE5FVCBjb21tYW5kIGluY2x1ZGVzIGFuCisgICBpbXBsaWNpdCAvVEVMTkVUIHN3aXRjaC4gU28gaWYgeW91IFRFTE5FVCB0byBhIG5vbi1URUxORVQgcG9ydCwgS2VybWl0CisgICBzZW5kcyBpbml0aWFsIFRlbG5ldCBuZWdvdGlhdGlvbnMuIFRoaXMgbWFrZXMgc2Vuc2UsIHNpbmNlIHRoYXQncyB3aGF0CisgICAidGVsbmV0IiBtZWFucy4KKworICAgSWYgeW91IHdhbnQgdG8gbWFrZSBhIGNvbm5lY3Rpb24gdG8gYSBub24tVGVsbmV0IHBvcnQgd2l0aG91dCBzZW5kaW5nCisgICBpbml0aWFsIFRlbG5ldCBuZWdvdGlhdGlvbnMsIHVzZToKKworICBzZXQgaG9zdCBbIC9jb25uZWN0IF0gbmFtZS1vci1hZGRyZXNzIHBvcnQKKworICAgb3I6CisKKyAgdGVsbmV0IG5hbWUtb3ItYWRkcmVzcyBwb3J0IC9uby10ZWxuZXQtaW5pdAorCisgICBBZGRpdGlvbmFsIHN3aXRjaGVzIG1pZ2h0IGJlIGFkZGVkIGluIHRoZSBmdXR1cmU7IHR5cGUgInNldCBob3N0ID8iIG9yCisgICAic2V0IGxpbmUgPyIgdG8gc2VlIGEgY3VycmVudCBsaXN0LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDIuMS4gRGlhbGluZworCisgICBBdXRvbWF0aWMgcmVkaWFsaW5nIGlzIGlsbGVnYWwgb3IgcmVzdHJpY3RlZCBpbiBtYW55IGNvdW50cmllcywgc28KKyAgIHVudGlsIEMtS2VybWl0IDcuMCwgaXQgd2FzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGkuZS4gdW50aWwgYSBTRVQgRElBTAorICAgUkVUUklFUyBjb21tYW5kIHdhcyBnaXZlbi4gSW4gQy1LZXJtaXQgNy4wLCBpZiBubyBTRVQgRElBTCBSRVRSSUVTCisgICBjb21tYW5kIGhhcyBiZWVuIGdpdmVuLCBhIGRlZmF1bHQgaXMgcGlja2VkIGR5bmFtaWNhbGx5IGF0IERJQUwgdGltZQorICAgYmFzZWQgb24gdGhlIGNhbGxpbmcgY291bnRyeSBjb2RlLCBpZiBrbm93bi4gQXQgdGhpcyB3cml0aW5nLCB0aGUgb25seQorICAgY291bnRyeSBjb2RlIGtub3duIHRvIGhhdmUgbm8gcmVzdHJpY3Rpb25zIG9uIGF1dG9tYXRpYyByZWRpYWxpbmcgaXMKKyAgIDEuIFNvIGluIHRoaXMgY2FzZSBhIGxpbWl0IG9mIDEwIGlzIGNob3Nlbjsgb3RoZXJ3aXNlIDEuIElmIHlvdSBoYXZlCisgICBub3QgZ2l2ZW4gYW4gZXhwbGljaXQgU0VUIERJQUwgUkVUUklFUyBjb21tYW5kLCBTSE9XIERJQUwgc2hvd3MgdGhlCisgICB2YWx1ZSBhcyAiKGF1dG8pIiwgYW5kIHRoZW4gdGhlIHZhbHVlIGFjdHVhbGx5IHVzZWQgaXMgc2hvd24gd2hlbiB5b3UKKyAgIGdpdmUgdGhlIERJQUwgY29tbWFuZC4KKworICAgQXMgb2YgQy1LZXJtaXQgNy4wLCBhdXRvbWF0aWMgcmVkaWFsaW5nIGlzIGF1dG9tYXRpY2FsbHkgY2FuY2VsZWQgaWYKKyAgIHRoZSBjYWxsIGNvdWxkIG5vdCBiZSBwbGFjZWQgYmVjYXVzZSBubyBkaWFsdG9uZSB3YXMgZGV0ZWN0ZWQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAyLjEuMS4gVGhlIERpYWwgUmVzdWx0IE1lc3NhZ2UKKworICAgSWYgRElBTCBESVNQTEFZIGlzIG5vdCBPTiwgdGhlICJDYWxsIGNvbXBsZXRlIiBtZXNzYWdlIG5vdyBzaG93cyB0aGUKKyAgIG1vZGVtJ3MgY2FsbCByZXN1bHQgbWVzc2FnZSwgZm9yIGV4YW1wbGU6CisKKyAgRGlhbGluZzogLi4uCisgIENhbGwgY29tcGxldGU6ICJDT05ORUNUIDMxMjAwL0FSUS9WMzIvTEFQTS9WNDJCSVMiCisKKyAgIFRoZSBleGFjdCBmb3JtYXQgYW5kIGNvbnRlbnRzIG9mIHRoaXMgbWVzc2FnZSwgb2YgY291cnNlLCBkZXBlbmRzIG9uCisgICB0aGUgbWFrZSwgbW9kZWwsIGFuZCBjb25maWd1cmF0aW9uIG9mIHlvdXIgbW9kZW0sIHNvIHVzZSB5b3VyIG1vZGVtCisgICBtYW51YWwgdG8gaW50ZXJwcmV0IGl0LiBUaGUgY2FsbCByZXN1bHQgbWVzc2FnZSBpcyBhbHNvIGF2YWlsYWJsZSBpbgorICAgQy1LZXJtaXQncyBcdihkaWFscmVzdWx0KSB2YXJpYWJsZS4KKworICBDLUtlcm1pdD4gZWNobyBcdihkaWFscmVzdWx0KQorICBDT05ORUNUIDMxMjAwL0FSUS9WMzIvTEFQTS9WNDJCSVMKKyAgQy1LZXJtaXQ+IGVjaG8gU3BlZWQgPSBcZndvcmQoXHYoZGlhbHJlc3VsdCksMikKKyAgU3BlZWQgPSAzMTIwMAorICBDLUtlcm1pdD4KKworICAgU3VwcG9zZSB5b3VyIG1vZGVtIHJlcG9ydHMgdGhlIG1vZHVsYXRpb24gc3BlZWQgYXMgc2hvd24gYWJvdmUgYW5kIHlvdQorICAgd2FudCB0byBlbnN1cmUgeW91ciBjYWxsIGlzIGNvbXBsZXRlZCBhdCAoc2F5KSAyNDAwMCBicHMgb3IgbW9yZS4gWW91CisgICBjYW4gdXNlIGEgbGl0dGxlIG1hY3JvIHRvIGRvIHRoZSBqb2I6CisKK2RlZmluZSBIU0RJQUwgeyAgICAgICAgICAgICAgICA7IEhpZ2ggU3BlZWQgRElBTAorICAgIGxvY2FsIFwlcworICAgIGlmIDwgXHYoYXJnYykgMSBpZiBub3QgZGVmIFx2KGRpYWxudW1iZXIpIGVuZCAxIFVzYWdlOiBcJTAgbnVtYmVyCisgICAgc2V0IGRpYWwgcmV0cmllcyAxMDAKKyAgICBzZXQgZGlhbCBpbnRlcnZhbCAxCisgICAgd2hpbGUgdHJ1ZSB7CisgICAgICAgIGRpYWwgXCUqCisgICAgICAgIGlmIGZhaWwgZW5kIDEgRElBTCBmYWlsZWQuCisgICAgICAgIGFzZyBcJXMgXGZ3b3JkKFx2KGRpYWxyZXN1bHQpLDIpCisgICAgICAgIGlmIGRlZiBcJXMgaWYgbnVtZXJpYyBcJXMgaWYgbm90IDwgXCVzIDI0MDAwIGJyZWFrCisgICAgfQorfQorCisgICAoU2VlIFszODRdU2VjdGlvbiA3LjUgYWJvdXQgdGhlIFwlKiB2YXJpYWJsZS4pCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAyLjEuMi4gTG9uZy1EaXN0YW5jZSBEaWFsaW5nIENoYW5nZXMKKworICAgRHVlIHRvIHRoZSBnbHV0IG9mIGNlbGwgcGhvbmVzLCBwYWdlcnMsIGZheCBtYWNoaW5lcywgSVNQcywgZXRjLCBhcmVhCisgICBjb2RlcyBhbmQgZGlhbGluZyBydWxlcyBhcmUgY2hhbmdpbmcgYWxsIHRoZSB0aW1lLiBJbiB0aGUgTm9ydGgKKyAgIEFtZXJpY2FuIE51bWJlcmluZyBQbGFuIChOQU5QKSBjb3VudHJpZXMgKFVTQSwgQ2FuYWRhLCBldGMpLCBhcmVhCisgICBjb2RlcyBhcmUgc3BsaXQgb3Igb3ZlcmxheWVkIHdpdGggaW5jcmVhc2luZyBmcmVxdWVuY3ksIGFuZCAxMC0gYW5kCisgICAxMS1kaWdpdCBkaWFsaW5nIGlzIGdyYWR1YWxseSBiZWNvbWluZyB0aGUgbm9ybSBmb3IgbG9jYWwgY2FsbHMuCisgICBDaGFuZ2VzIGFyZSBvY2N1cnJpbmcgSW4gRXVyb3BlLCB0b28sIHBhcnRseSBmb3IgdGhlc2UgcmVhc29ucyBhbmQKKyAgIHBhcnRseSBiZWNhdXNlIG9mIHNvbWUgbmV3IEVDIHJ1bGVzLgorCisgICBJbiBGcmFuY2UsIGVmZmVjdGl2ZSAxOCBPY3RvYmVyIDE5OTYsIGFsbCBjYWxscywgZXZlbiBsb2NhbCBvbmVzLCBtdXN0CisgICBiZSBkaWFsZWQgd2l0aCBhbiBhcmVhIGNvZGUuIEZyZW5jaCBhcmVhIGNvZGVzIGFyZSBwcmVzZW50bHkgMS1kaWdpdAorICAgbnVtYmVycywgMS02LCBhbmQgdGhlIGxvbmctZGlzdGFuY2UgZGlhbGluZyBwcmVmaXggaXMgMC4gQWxsIGNhbGxzCisgICB3aXRoaW4gRnJhbmNlIGFyZSBjb25zaWRlcmVkIGxvbmcgZGlzdGFuY2UgYW5kIGJlZ2luIHdpdGggMDEsIDAyLCAuLi4sCisgICAwNi4KKworICAgRWZmZWN0aXZlIDEgTWF5IDE5OTcsIGFsbCBjYWxscyB3aXRoaW4gdGhlIFVTIHN0YXRlIG9mIE1hcnlsYW5kLCBldmVuCisgICBsb2NhbCBvbmVzLCBtdXN0IGJlIGRpYWxlZCB3aXRoIGFuIGFyZWEgY29kZSBidXQgd2l0aG91dCB0aGUKKyAgIGxvbmctZGlzdGFuY2UgcHJlZml4IC0tIHRoaXMgaXMgdGhlIG5vdyB3aWRlbHkta25vd24gTm9ydGggQW1lcmljYW4KKyAgIHBoZW5vbWVub24gb2YgInRlbiBkaWdpdCBkaWFsaW5nIi4gVGhlIHNhbWUgaXMgaGFwcGVuaW5nIGVsc2V3aGVyZSAtLQorICAgbWFueSBjaXRpZXMgaW4gRmxvcmlkYSBhZG9wdGVkIDEwLWRpZ2l0IGRpYWxpbmcgaW4gMTk5OC4KKworICAgSW4gSXRhbHkgYmVnaW5uaW5nIDE5IEp1bmUgMTk5OCwgYWxsIGNhbGxzIHRvIGZpeGVkIChhcyBvcHBvc2VkIHRvCisgICBtb2JpbGUpIG51bWJlcnMgbXVzdCBiZSBwcmVmaXhlZCBieSAwLiBXaGVuIGNhbGxpbmcgaW50byBJdGFseSBmcm9tCisgICBvdXRzaWRlLCB0aGUgMCBtdXN0IGZvbGxvdyB0aGUgY291bnRyeSBjb2RlICgzOSkuIENhbGxzIHRvIGNlbGwKKyAgIHBob25lcywgaG93ZXZlciwgbXVzdCBiZSBwbGFjZWQgd2l0aG91dCB0aGUgMC4gVGhlbiBvbiAyOSBEZWNlbWJlcgorICAgMjAwMCwgdGhlIDAgd2lsbCBiZWNvbWUgYSA0IChmb3IgY2FsbGluZyBmaXhlZCBudW1iZXJzKSBhbmQgYSBwcmVmaXgKKyAgIG9mIDMgbXVzdCB1c2VkIGZvciBjYWxsaW5nIG1vYmlsZSBwaG9uZXMuIE1vcmUgaW5mbyBhdDoKKyAgIGh0dHA6Ly93d3cudGVsZWNvbWl0YWxpYS5pdC9ucG5uLy4KKworICAgSW4gU3BhaW4sIGVmZmVjdGl2ZSA0IEFwcmlsIDE5OTgsIHdpdGggaGFyZCBjdXRvdmVyIG9uIDE4IEp1bHkgMTk5OCwKKyAgIGFsbCBjYWxscyB3aXRoaW4gdGhlIGNvdW50cnkgbXVzdCBiZSBkaWFsZWQgd2l0aCA5IGRpZ2l0cywgYW5kIGFsbAorICAgY2FsbHMgZnJvbSBvdXRzaWRlIFNwYWluIG11c3QgYWxzbyBiZSBkaWFsZWQgd2l0aCA5IGRpZ2l0cyAoYWZ0ZXIgdGhlCisgICBjb3VudHJ5IGNvZGUsIDM0KS4gVGhlIG5ldyA5LWRpZ2l0IG51bWJlcnMgYWxsIGJlZ2luIHdpdGggIjkiLiBNb3JlCisgICBpbmZvIGF0OiBbMzg1XWh0dHA6Ly93d3cudGVsZWZvbmljYS5lcy9jYW1iaW9kZW51bWVyYWNpb24vCisKKyAgIFNldmVyYWwgbmV3IGRpYWxpbmcgZmVhdHVyZXMgYW5kIGNvbW1hbmRzIGhhdmUgYmVlbiBhZGRlZCBpbiB2ZXJzaW9uCisgICA2LjEgYW5kIDcuMCB0byBhZGRyZXNzIHRoZXNlIGNoYW5nZXMuCisKKyAgIEMtS2VybWl0IDYuMCBhbmQgS2VybWl0IDk1IDEuMS4xMSBhbmQgZWFybGllciBoYW5kbGUgdGhlIEZyZW5jaAorICAgc2l0dWF0aW9uIHZpYSBhIHJlYXNvbmFibGUgc3VidGVyZnVnZSAoc2V0dGluZyB0aGUgbG9jYWwgYXJlYSBjb2RlIHRvCisgICBhIG5vbmV4aXN0ZW50IG9uZSksIGJ1dCBkaWQgbm90IGhhbmRsZSAidGVuLWRpZ2l0IGRpYWxpbmciIHdlbGwgYXQKKyAgIGFsbDsgdGhlIHJlY29tbWVuZGVkIHRlY2huaXF1ZSB3YXMgdG8gY2hhbmdlIHRoZSBsb25nLWRpc3RhbmNlIGRpYWxpbmcKKyAgIHByZWZpeCB0byBub3RoaW5nLCBidXQgdGhpcyBkZWZlYXRlZCBLZXJtaXQncyAibGlzdCBudW1iZXJzIGZvciBvbmUKKyAgIG5hbWUiIGZlYXR1cmUgd2hlbiB0aGUgbnVtYmVycyB3ZXJlIGluIGRpZmZlcmVudCBsb2NhdGlvbnMuIEZvcgorICAgZXhhbXBsZToKKworICBzZXQgZGlhbCBsZC1wcmVmaXgKKyAgZGlhbCBvbmxpbmVzZXJ2aWNlCisKKyAgIHdoZXJlICJvbmxpbmVzZXJ2aWNlIiBpcyBhIGRpYWxpbmcgZGlyZWN0b3J5IGVudHJ5IG5hbWUgY29ycmVzcG9uZGluZworICAgdG8gZW50cmllcyB0aGF0IGFyZSBpbiAoc2F5KSBNYXJ5bGFuZCBhcyB3ZWxsIGFzIG90aGVyIHN0YXRlcywgd291bGQKKyAgIG5vdCBjb3JyZWN0bHkgZGlhbCB0aGUgbnVtYmVycyBub3QgaW4gTWFyeWxhbmQuCisKKyAgIEEgbmV3IGNvbW1hbmQgbGV0cyB5b3Ugc3BlY2lmeSBhIGxpc3Qgb2YgYXJlYSBjb2RlcyB0byBiZSBjb25zaWRlcmVkCisgICBsb2NhbCwgZXhjZXB0IHRoYXQgdGhlIGFyZWEgY29kZSBtdXN0IGJlIGRpYWxlZDoKKworICAgU0VUIERJQUwgTEMtQVJFQS1DT0RFUyBbIGFyZWFjb2RlIFsgYXJlYWNvZGUgWyBhcmVhY29kZSBbIC4uLiBdIF0gXSBdCisgICAgICAgICAgVGhlIGxpc3QgbWF5IGluY2x1ZGUgdXAgdG8gMzIgYXJlYSBjb2Rlcy4gSWYgYSBudW1iZXIgaXMgY2FsbGVkCisgICAgICAgICAgd2hvc2UgYXJlYSBjb2RlIGlzIGluIHRoaXMgbGlzdCwgaXQgaXMgZGlhbGVkIFdJVEhPVVQgdGhlCisgICAgICAgICAgbG9uZy1kaXN0YW5jZSBwcmVmaXgsIGJ1dCBXSVRIIHRoZSBhcmVhIGNvZGUuCisKKyAgIFNvIGluIE1hcnlsYW5kLCB3aGljaCAobGFzdCB0aW1lIHdlIGxvb2tlZCkgaGFzIHR3byBhcmVhIGNvZGVzLCA0MTAKKyAgIGFuZCAzMDEsIHRoZSBzZXR1cCB3b3VsZCBiZToKKworICBTRVQgRElBTCBMQy1BUkVBLUNPREVTIDQxMCAzMDEKKworICAgRXhhbXBsZToKKworICBTRVQgRElBTCBMRC1QUkVGSVggMQorICBTRVQgRElBTCBBUkVBLUNPREUgMzAxCisgIFNFVCBESUFMIExDLUFSRUEtQ09ERVMgNDEwIDMwMSA8LS0gQXJlYSBjb2RlcyBpbiAxMC1kaWdpdCBkaWFsaW5nIHJlZ2lvbgorICBESUFMICsxICgzMDEpIDc2NS00MzIxICAgICAgICAgPC0tIERpYWxzIDMwMTc2NTQzMjEgIChsb2NhbCB3aXRoIGFyZWEgY29kZSkKKyAgRElBTCArMSAoNDEwKSA3NjUtNDMyMSAgICAgICAgIDwtLSBEaWFscyA0MTA3NjU0MzIxICAobG9jYWwgd2l0aCBhcmVhIGNvZGUpCisgIERJQUwgKzEgKDIxMikgNzY1LTQzMjEgICAgICAgICA8LS0gRGlhbHMgMTIxMjc2NTQzMjEgKGxvbmcgZGlzdGFuY2UpCisKKyAgIFRoZSBTRVQgRElBTCBMQy1BUkVBLUNPREVTIGNvbW1hbmQgZG9lcyBub3QgcmVwbGFjZSB0aGUgU0VUIERJQUwKKyAgIEFSRUEtQ09ERSBjb21tYW5kLiBUaGUgbGF0dGVyIHNwZWNpZmllcyB0aGUgYXJlYSBjb2RlIHlvdSBhcmUgZGlhbGluZworICAgZnJvbS4gSWYgdGhlIGNhbGxlZCBudW1iZXIgaXMgaW4gdGhlIHNhbWUgYXJlYSBjb2RlLCB0aGVuIHRoZSBhcmVhCisgICBjb2RlIGlzIGRpYWxlZCBpZiBpdCBpcyBhbHNvIGluIHRoZSBMQy1BUkVBLUNPREVTIGxpc3QsIGFuZCBpdCBpcyBub3QKKyAgIGRpYWxlZCBvdGhlcndpc2UuIFNvIGlmICIzMDEiIGhhZCBub3QgYXBwZWFyZWQgaW4gdGhlIExDLUFSRUEtQ09ERVMKKyAgIGxpc3QgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGU6CisKKyAgU0VUIERJQUwgTEQtUFJFRklYIDEKKyAgU0VUIERJQUwgQVJFQS1DT0RFIDMwMQorICBTRVQgRElBTCBMQy1BUkVBLUNPREVTIDQxMCAgICAgPC0tIEFyZWEgY29kZXMgaW4gMTAtZGlnaXQgZGlhbGluZyByZWdpb24KKyAgRElBTCArMSAoMzAxKSA3NjUtNDMyMSAgICAgICAgIDwtLSBEaWFscyA3NjU0MzIxICAgICAobG9jYWwpCisgIERJQUwgKzEgKDQxMCkgNzY1LTQzMjEgICAgICAgICA8LS0gRGlhbHMgNDEwNzY1NDMyMSAgKGxvY2FsIHdpdGggYXJlYSBjb2RlKQorICBESUFMICsxICgyMTIpIDc2NS00MzIxICAgICAgICAgPC0tIERpYWxzIDEyMTI3NjU0MzIxIChsb25nIGRpc3RhbmNlKQorCisgICBUaGUgbmV3IEtlcm1pdCB2ZXJzaW9ucyBhbHNvIGFkZCBhIExvY2FsIENhbGwgUHJlZml4IGFuZCBMb2NhbCBDYWxsCisgICBTdWZmaXgsIGluIGNhc2UgeW91IGhhdmUgYW55IG5lZWQgZm9yIGl0LiBUaGVzZSBhcmUgYWRkZWQgdG8gdGhlCisgICBiZWdpbm5pbmcgYW5kIG9mIGxvY2FsIHBob25lIG51bWJlcnMgKGkuZS4gbnVtYmVycyB0aGF0IGFyZSBub3QKKyAgIGxvbmctZGlzdGFuY2Ugb3IgaW50ZXJuYXRpb25hbCkuIEV4YW1wbGVzOgorCisgIFNFVCBESUFMIExELVBSRUZJWCAxCisgIFNFVCBESUFMIExDLVBSRUZJWCA5CisgIFNFVCBESUFMIExDLVNVRkZJWCAqCisgIFNFVCBESUFMIExDLUFSRUEtQ09ERVMgNDEwICAgICA8LS0gQXJlYSBjb2RlcyBpbiAxMC1kaWdpdCBkaWFsaW5nIHJlZ2lvbgorICBTRVQgRElBTCBBUkVBLUNPREUgMzAxCisgIERJQUwgKzEgKDMwMSkgNzY1LTQzMjEgICAgICAgICA8LS0gRGlhbHMgOTc2NTQzMjEqICAgICAobG9jYWwpCisgIERJQUwgKzEgKDQxMCkgNzY1LTQzMjEgICAgICAgICA8LS0gRGlhbHMgOTQxMDc2NTQzMjEqICAobG9jYWwgd2l0aCBhcmVhIGNvZGUpCisgIERJQUwgKzEgKDIxMikgNzY1LTQzMjEgICAgICAgICA8LS0gRGlhbHMgMTIxMjc2NTQzMjEgICAobG9uZyBkaXN0YW5jZSkKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDIuMS4zLiBGb3JjaW5nIExvbmctRGlzdGFuY2UgRGlhbGluZworCisgICBTdXBwb3NlIGEgbnVtYmVyIGlzIGluIHlvdXIgY291bnRyeSBhbmQgYXJlYSwgYnV0IGZvciBzb21lIHJlYXNvbiB5b3UKKyAgIG5lZWQgdG8gZGlhbCBpdCBsb25nLWRpc3RhbmNlIGFueXdheSAoYXMgaXMgYWx3YXlzIHRoZSBjYXNlIGluCisgICBGcmFuY2UpLiBUaGVyZSBoYXZlIGFsd2F5cyBiZWVuIHZhcmlvdXMgd2F5cyB0byBoYW5kbGUgdGhpczoKKworICAgIDEuIFRlbXBvcmFyaWx5IHNldCB5b3VyIGFyZWEgY29kZSB0byBhIGRpZmZlcmVudCAob3Igbm9uZXhpc3RlbnQgb3IKKyAgICAgICBpbXBvc3NpYmxlKSBvbmUgKGJ1dCB0aGlzIHJlcXVpcmVkIGtub3dsZWRnZSBvZiB3aGljaCBhcmVhIGNvZGVzCisgICAgICAgd2VyZSBub25leGlzdGVudCBvciBpbXBvc3NpYmxlIGluIGVhY2ggY291bnRyeSkuCisgICAgMi4gRGlhbCB0aGUgbnVtYmVyIGxpdGVyYWxseSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBwb3J0YWJsZSBmb3JtYXQsCisgICAgICAgYnV0IHRoaXMgZGVmZWF0cyB0aGUgcHVycG9zZSBvZiB0aGUgcG9ydGFibGUgZGlhbGluZyBkaXJlY3RvcnkuCisKKyAgIE5vdyB0aGVyZSBpcyBhbHNvIGEgbmV3IGNvbW1hbmQgdGhhdCwgdmVyeSBzaW1wbHksIGNhbiBmb3JjZQorICAgbG9uZy1kaXN0YW5jZSBkaWFsaW5nOgorCisgICBTRVQgRElBTCBGT1JDRS1MT05HLURJU1RBTkNFIHsgT04sIE9GRiB9CisgICAgICAgICAgSWYgYSBjYWxsIGlzIHBsYWNlZCB0byBhIHBvcnRhYmxlIHBob25lIG51bWJlciB3aXRoaW4gdGhlIHNhbWUKKyAgICAgICAgICBjb3VudHJ5IGNvZGUgYXMgdGhlIGNhbGxpbmcgbnVtYmVyLCBpdCBpcyBkaWFsZWQgd2l0aCB0aGUKKyAgICAgICAgICBsb25nLWRpc3RhbmNlIHByZWZpeCBhbmQgdGhlIGFyZWEgY29kZSBpZiBGT1JDRS1MT05HLURJU1RBTkNFCisgICAgICAgICAgaXMgT04uIElmIE9GRiwgdGhlIHJlZ3VsYXIgcnVsZXMgYW5kIHByb2NlZHVyZXMgYXBwbHkuCisKKyAgIEV4YW1wbGUgKEZyYW5jZSk6CisKKyAgU0VUIERJQUwgQ09VTlRSWS1DT0RFIDMzCisgIFNFVCBESUFMIEFSRUEtQ09ERSA2CisgIFNFVCBESUFMIEZPUkNFLUxPTkctRElTVEFOQ0UgT04KKworICAgKEluIGZhY3QsIFNFVCBESUFMIENPVU5UUlktQ09ERSAzMyBhdXRvbWF0aWNhbGx5IHNldHMgRElBTAorICAgRk9SQ0UtTE9ORy1ESVNUQU5DRSBPTi4uLikKKworICAgRXhhbXBsZSAoVVNBLCBmb3IgYSBjZXJ0YWluIHR5cGUgb2YgcmV2ZXJzZS1jaGFyZ2UgY2FsbGluZyBpbiB3aGljaAorICAgdGhlIGNhbGxlZCBudW1iZXIgbXVzdCBhbHdheXMgYmUgZnVsbHkgc3BlY2lmaWVkKToKKworICBTRVQgRElBTCBQUkVGSVggMTgwMDI2NjYzMjgkICAgICA7IDEtODAwLUNPTExFQ1QKKyAgU0VUIERJQUwgQ09VTlRSWS1DT0RFIDEKKyAgU0VUIERJQUwgQVJFQS1DT0RFIDIxMgorICBTRVQgRElBTCBGT1JDRS1MT05HLURJU1RBTkNFIE9OCisKKyAgIEV4YW1wbGUgKFRvcm9udG8sIHdoZXJlIGNhbGxzIHRvIGV4Y2hhbmdlIDk3NiB3aXRoaW4gYXJlYSBjb2RlIDQxNgorICAgbXVzdCBiZSBkaWFsZWQgYXMgbG9uZyBkaXN0YW5jZSwgZXZlbiB3aGVuIHlvdSBhcmUgZGlhbGluZyBmcm9tIGFyZWEKKyAgIGNvZGUgNDE2KToKKworICBTRVQgRElBTCBDT1VOVFJZLUNPREUgMQorICBTRVQgRElBTCBBUkVBLUNPREUgNDE2CisgIFNFVCBESUFMIEZPUkNFLUxPTkctRElTVEFOQ0UgT04KKyAgRElBTCArMSAoNDE2KSA5NzYteHh4eAorCisgICBJZiBkaWFsaW5nIG1ldGhvZHMgd2VyZSBjb25zaXN0ZW50IGFuZCBzZW5zaWJsZSwgb2YgY291cnNlIGl0IHdvdWxkIGJlCisgICBwb3NzaWJsZSB0byBhbHdheXMgZGlhbCBldmVyeSBkb21lc3RpYyBjYWxsIGFzIGlmIGl0IHdlcmUgbG9uZworICAgZGlzdGFuY2UuIEJ1dCBpbiBtYW55IGxvY2F0aW9ucyB0aGlzIGRvZXNuJ3Qgd29yayBvciBpZiBpdCBkb2VzLCBpdAorICAgY29zdHMgZXh0cmEuIFRoZSBmb2xsb3dpbmcgbWFjcm8gY2FuIGJlIHVzZWQgZm9yIGRpYWxpbmcgYW55IGdpdmVuCisgICBudW1iZXIgd2l0aCBmb3JjZWQgbG9uZy1kaXN0YW5jZSBmb3JtYXQ6CisKKyAgZGVmaW5lIExESUFMIHsKKyAgICAgIGxvY2FsIFwleAorICAgICAgc2V0IGRpYWwgZm9yY2UtbG9uZy1kaXN0YW5jZSBvbgorICAgICAgZGlhbCBcJSoKKyAgICAgIGFzZyBcJXggXHYoc3VjY2VzcykKKyAgICAgIHNldCBkaWFsIGZvcmNlLWxvbmctZGlzdGFuY2Ugb2ZmCisgICAgICBlbmQgXCV4CisgIH0KKworICAgKFNlZSBbMzg2XVNlY3Rpb24gNy41IGFib3V0IHRoZSBcJSogdmFyaWFibGUuKQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMi4xLjQuIEV4Y2hhbmdlLVNwZWNpZmljIERpYWxpbmcgRGVjaXNpb25zCisKKyAgIFRoaXMgYXBwbGllcyBtYWlubHkgdG8gdGhlIE5vcnRoIEFtZXJpY2FuIE51bWJlcmluZyBQbGFuIChOQU5QKS4gUmVmZXIKKyAgIHRvIHRoZSBzZWN0aW9uICJBbHRlcm5hdGl2ZSBub3RhdGlvbnMiIGluIFszODddVXNpbmcgQy1LZXJtaXQgMm5kCisgICBFZGl0aW9uLCBwYWdlcyAxMDYtMTA3LCBhbmQgdGhlIHN0b3J5IGFib3V0IFRvcm9udG8gb24gcGFnZSAxMTAuIFVzaW5nCisgICB0aGUgbmV3IExDLUFSRUEtQ09ERVMgbGlzdCwgd2UgY2FuIGFkZHJlc3MgdGhlIHByb2JsZW0gYnkgdHJlYXRpbmcgdGhlCisgICBleGNoYW5nZSBhcyBwYXJ0IG9mIHRoZSBhcmVhIGNvZGU6CisKKyAgU0VUIERJQUwgTEQtUFJFRklYIDEKKyAgU0VUIERJQUwgQVJFQS1DT0RFIDQxNgorICBTRVQgRElBTCBMQy1BUkVBLUNPREVTIDkwNTI3NgorICBESUFMICsxIDQxNiA3NjUgNDMyMSAgICAgICAgICAgICAgIDwtLSA3NjU0MzIxICAgICAgKGxvY2FsKQorICBESUFMICsxIDkwNSAyNzYgNDMyMSAgICAgICAgICAgICAgIDwtLSA5MDUyNzY0MzIxICAgKGxvY2FsIHdpdGggYXJlYSBjb2RlKQorICBESUFMICsxIDkwNSA1MjggNDMyMSAgICAgICAgICAgICAgIDwtLSAxOTA1NTI4NDMyMSAgKGxvbmcgZGlzdGFuY2UpCisKKyAgIFRoZSBzYW1lIHRlY2huaXF1ZSBjYW4gYmUgdXNlZCBpbiBNYXNzYWNodXNldHRzIChzdG9yeSBhdCB0b3Agb2YgcGFnZQorICAgMTExKSBhbmQgaW4gYW55IG90aGVyIHBsYWNlIHdoZXJlIGRpYWxpbmcgdG8gc29tZSBleGNoYW5nZXMgd2l0aGluIGEKKyAgIHBhcnRpY3VsYXIgYXJlYSBjb2RlIGlzIGxvY2FsLCBidXQgdG8gb3RoZXJzIGluIHRoZSBzYW1lIGFyZWEgY29kZSBpcworICAgbG9uZyBkaXN0YW5jZS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDIuMS41LiBDYXV0aW9ucyBhYm91dCBDaGVhcGVzdC1GaXJzdCBEaWFsaW5nCisKKyAgIEtlcm1pdCBkb2VzIG5vdCBtYWludGFpbiBhIGtub3dsZWRnZSBiYXNlIG9mIHRlbGVwaG9ueSBpbmZvcm1hdGlvbjsgaXQKKyAgIG9ubHkgcHJvdmlkZXMgdGhlIHRvb2xzIHRvIGxldCB5b3UgZW50ZXIgYSBwaG9uZSBudW1iZXIgaW4gYSBzdGFuZGFyZAorICAgZm9ybWF0IGFuZCBkaWFsIGl0IGNvcnJlY3RseSBmcm9tIGFueSBsb2NhdGlvbiBpbiBtb3N0IGNhc2VzLgorCisgICBJbiBwYXJ0aWN1bGFyLCBLZXJtaXQgZG9lcyBub3QgZGlmZmVyZW50aWF0ZSB0aGUgY2hhcmdpbmcgbWV0aG9kIGZyb20KKyAgIHRoZSBkaWFsaW5nIG1ldGhvZC4gSWYgYSBjYWxsIHRoYXQgaXMgRElBTEVEIGFzIGxvbmctZGlzdGFuY2UgKGUuZy4KKyAgIGZyb20gMjEyIHRvIDcxOCBpbiBjb3VudHJ5IGNvZGUgMSkgaXMgbm90IENIQVJHRUQgYXMgbG9uZyBkaXN0YW5jZSwgd2UKKyAgIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgdGhhdCB3aXRob3V0IGtlZXBpbmcgYSBtYXRyaXggb2YgY2hhcmdpbmcKKyAgIGluZm9ybWF0aW9uIGZvciBldmVyeSBhcmVhLWNvZGUgY29tYmluYXRpb24gd2l0aGluIGV2ZXJ5IGNvdW50cnksIGFuZAorICAgYW55IHN1Y2ggbWF0cml4IHdvdWxkIGJlIG9ic29sZXRlIGZpdmUgbWludXRlcyBhZnRlciBpdCB3YXMKKyAgIGNvbnN0cnVjdGVkLiBUaHVzLCAiY2hlYXBlc3QtZmlyc3QiIHNvcnRpbmcgaXMgb25seSBhcyByZWxpYWJsZSBhcyBvdXIKKyAgIGFzc3VtcHRpb24gdGhhdCB0aGUgY2hhcmdpbmcgbWV0aG9kIGZvbGxvd3MgdGhlIGRpYWxpbmcgbWV0aG9kLiBBIGdvb2QKKyAgIGlsbHVzdHJhdGlvbiB3b3VsZCBiZSBjZXJ0YWluIG9ubGluZSBzZXJ2aWNlcyB0aGF0IGhhdmUgdG9sbC1mcmVlCisgICBkaWFsdXAgbnVtYmVycyB3aGljaCB0aGV5IGNoYXJnZSB5b3UgYSBwcmVtaXVtIChpbiB5b3VyIG9ubGluZSBzZXJ2aWNlCisgICBiaWxsKSBmb3IgdXNpbmcuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAyLjEuNi4gQmxpbmQgRGlhbGluZyAoRGlhbGluZyB3aXRoIE5vIERpYWx0b25lKQorCisgICBDLUtlcm1pdCdzIGluaXQgc3RyaW5nIGZvciBIYXllcy1saWtlIG1vZGVtcyBnZW5lcmFsbHkgaW5jbHVkZXMgYW4gWDQKKyAgIGNvbW1hbmQgdG8gZW5hYmxlIGFzIG1hbnkgcmVzdWx0IGNvZGVzIGFzIHBvc3NpYmxlLCBzbyB0aGF0IEtlcm1pdCBjYW4KKyAgIHJlYWN0IGFwcHJvcHJpYXRlbHkgdG8gZGlmZmVyZW50IGZhaWx1cmUgcmVhc29ucy4gT25lIG9mIHRoZSByZXN1bHQKKyAgIGNvZGVzIHRoYXQgWDQgZW5hYmxlcyBpcyAiTk8gRElBTFRPTkUiLiBBIHBlcmhhcHMgbm90IG9idmlvdXMgc2lkZQorICAgZWZmZWN0IG9mIGVuYWJsaW5nIHRoaXMgcmVzdWx0IGNvZGUgdGhhdCB0aGUgbW9kZW0gbXVzdCBoZWFyIGRpYWx0b25lCisgICBiZWZvcmUgaXQgd2lsbCBkaWFsLgorCisgICBJdCBpcyBiZWNvbWluZyBpbmNyZWFzaW5nbHkgbmVjZXNzYXJ5IHRvIGZvcmNlIGEgbW9kZW0gdG8gZGlhbCBldmVuCisgICB0aG91Z2ggaXQgZG9lcyBub3QgaGVhciBhIGRpYWx0b25lIG9uIHRoZSBwaG9uZSBsaW5lOyBmb3IgZXhhbXBsZSwKKyAgIHdpdGggUEJYcyB0aGF0IGhhdmUgc3RyYW5nZSBkaWFsdG9uZXMsIG9yIHdpdGggcGhvbmUgc3lzdGVtcyBpbgorICAgZGlmZmVyZW50IGNvdW50cmllcywgb3Igd2l0aCBJU0ROIHBob25lcywgZXRjLiBUaGlzIGlzIGNhbGxlZCAiYmxpbmQKKyAgIGRpYWxpbmciLgorCisgICBDLUtlcm1pdCA3LjAgaGFzIHR3byBuZXcgY29tbWFuZHMgdG8gY29wZSB3aXRoIHRoaXMgc2l0dWF0aW9uOgorCisgICBTRVQgRElBTCBJR05PUkUtRElBTFRPTkUgeyBPTiwgT0ZGIH0KKyAgICAgICAgICBPRkYgKHRoZSBkZWZhdWx0KSBtZWFucyB0byB0ZWxsIHRoZSBtb2RlbSB0byB3YWl0IGZvciBkaWFsdG9uZQorICAgICAgICAgIGJlZm9yZSBkaWFsaW5nLiBPTiBtZWFucyB0byBlbmFibGUgImJsaW5kIGRpYWxpbmciLCBpLmUuIHRlbGwKKyAgICAgICAgICB0aGUgbW9kZW0gTk9UIHRvIHdhaXQgZm9yIGRpYWx0b25lIGJlZm9yZSBkaWFsaW5nLiBHZW5lcmFsbHkKKyAgICAgICAgICB0aGlzIGlzIGFjY29tcGxpc2hlZCBieSBzZW5kaW5nIEFUWDMgdG8gdGhlIG1vZGVtIGp1c3QgcHJpb3IgdG8KKyAgICAgICAgICBkaWFsaW5nLiBTRVQgTU9ERU0gVFlQRSB4eHggYW5kIHRoZW4gU0hPVyBNT0RFTSBkaXNwbGF5cworICAgICAgICAgIEtlcm1pdCdzIGJ1aWx0LWluICJpZ25vcmUgZGlhbHRvbmUiIGNvbW1hbmQuCisKKyAgIFNFVCBESUFMIENPTU1BTkQgSUdOT1JFLURJQUxUT05FIHRleHQKKyAgICAgICAgICBUaGlzIGxldHMgeW91IGNoYW5nZSB0aGUgYnVpbHQtaW4gaWdub3JlLWRpYWx0b25lIGNvbW1hbmQgKHN1Y2gKKyAgICAgICAgICBhcyBBVFgzKSB0byB3aGF0ZXZlciB5b3UgY2hvb3NlLCBpbiBjYXNlIHRoZSBidWlsdC1pbiBvbmUgZG9lcworICAgICAgICAgIG5vdCB3b3JrLCBvciBhbm90aGVyIGNvbW1hbmQgd29ya3MgYmV0dGVyLgorCisgICBOb3RlczoKKyAgICAxLiBUaGUgaWdub3JlLWRpYWx0b25lIGNvbW1hbmQgaXMgbm90IHNlbnQgdW5sZXNzIFNFVCBESUFMCisgICAgICAgSUdOT1JFLURJQUxUT05FIGlzIE9OLgorICAgIDIuIFRoZSBBVFgzIGNvbW1hbmQgZ2VuZXJhbGx5IGRpc2FibGVzIG5vdCBvbmx5IE5PIERJQUxUT05FLCBidXQgYWxzbworICAgICAgIEJVU1kuIFNvIHRoaXMgd2lsbCBwcmV2ZW50IEtlcm1pdCBmcm9tIGRldGVjdGluZyB3aGVuIHRoZSBsaW5lIGlzCisgICAgICAgYnVzeS4gVGhpcyBpcyBhIHByb3BlcnR5IG9mIHRoZSBtb2RlbSwgbm90IG9mIEtlcm1pdC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDIuMS43LiBUcmltbWluZyB0aGUgRGlhbGluZyBEaWFsb2cKKworICAgVGhlIGNvbW1hbmQ6CisKKyAgU0VUIE1PREVNIENPTU1BTkQgYWN0aW9uIFsgY29tbWFuZCBdCisKKyAgIGlzIHVzZWQgdG8gb3ZlcnJpZGUgS2VybWl0J3MgYnVpbHQtaW4gbW9kZW0gY29tbWFuZHMgZm9yIGVhY2ggYWN0aW9uLAorICAgZm9yIGVhY2gga2luZCBvZiBtb2RlbSBpbiBpdHMgaW50ZXJuYWwgZGF0YWJhc2UuIElmIHlvdSBpbmNsdWRlIGEKKyAgIGNvbW1hbmQsIHRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbiBvbmUuIElmIHlvdSBvbWl0IHRoZQorICAgY29tbWFuZCwgdGhpcyByZXN0b3JlcyB0aGUgb3JpZ2luYWwgYnVpbHQtaW4gY29tbWFuZC4KKworICAgSWYgeW91IHdhbnQgdG8gb21pdCB0aGUgY29tbWFuZCBhbHRvZ2V0aGVyLCBzbyBLZXJtaXQgZG9lc24ndCBzZW5kIHRoZQorICAgY29tbWFuZCBhdCBhbGwsIG9yIHdhaXQgZm9yIGEgcmVzcG9uc2UsIHVzZToKKworICBTRVQgTU9ERU0gQ09NTUFORCBhY3Rpb24ge30KKworICAgVGhhdCBpcywgc3BlY2lmeSBhIHBhaXIgb2YgZW1wdHkgYnJhY2VzIGFzIHRoZSBjb21tYW5kLCBmb3IgZXhhbXBsZToKKworICBTRVQgTU9ERU0gQ09NTUFORCBFUlJPUi1DT1JSRUNUSU9OIE9OIHt9CisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAyLjEuOC4gQ29udHJvbGxpbmcgdGhlIERpYWxpbmcgU3BlZWQKKworICAgVGhlIHJhdGUgYXQgd2hpY2ggY2hhcmFjdGVycyBhcmUgc2VudCB0byB0aGUgbW9kZW0gZHVyaW5nIGRpYWxpbmcgaXMKKyAgIG5vcm1hbGx5IGNvbnRyb2xsZWQgYnkgdGhlIGJ1aWx0LWluIG1vZGVtIGRhdGFiYXNlLiBZb3UgbWlnaHQgd2FudCB0bworICAgb3ZlcnJpZGUgdGhpcyBpZiBLZXJtaXQgc2VlbXMgdG8gYmUgZGlhbGluZyB0b28gc2xvd2x5LCBvciBpdCBpcworICAgc2VuZGluZyBjaGFyYWN0ZXJzIHRvIHRoZSBtb2RlbSBmYXN0ZXIgdGhhbiB0aGUgbW9kZW0gaGFuZGxlIHRoZW0uIEEKKyAgIG5ldyBjb21tYW5kIHdhcyBhZGRlZCBmb3IgdGhpcyBpbiBDLUtlcm1pdCA3LjA6CisKKyAgIFNFVCBESUFMIFBBQ0lORyBudW1iZXIKKyAgICAgICAgICBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzIG9mIHNlY29uZHMpCisgICAgICAgICAgdG8gcGF1c2UgYmV0d2VlbiBlYWNoIGNoYXJhY3RlciB3aGVuIHNlbmRpbmcgY29tbWFuZHMgdG8gdGhlCisgICAgICAgICAgbW9kZW0gZHVyaW5nIERJQUwgb3IgQU5TV0VSIGNvbW1hbmQgZXhlY3V0aW9uLiAwIG1lYW5zIG5vIHBhdXNlCisgICAgICAgICAgYXQgYWxsLCAtMSAodGhlIGRlZmF1bHQpIG9yIGFueSBvdGhlciBuZWdhdGl2ZSBudW1iZXIgbWVhbnMgdG8KKyAgICAgICAgICB1c2UgdGhlIHZhbHVlIGZyb20gdGhlIGRhdGFiYXNlLiBBbnkgbnVtYmVyIGdyZWF0ZXIgdGhhbiAwIGlzCisgICAgICAgICAgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gcGF1c2UuCisKKyAgIEhJTlQ6IFlvdSBtaWdodCBhbHNvIG5lZWQgdG8gY29udHJvbCB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgbW9kZW0KKyAgIGdlbmVyYXRlcyBUb3VjaCBUb25lcyBkdXJpbmcgZGlhbGluZywgZm9yIGV4YW1wbGUgd2hlbiBzZW5kaW5nIGEKKyAgIG51bWVyaWMgcGFnZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIGRvIHRoaXMuIE9uZSB3YXkgaXMgdG8gaW5zZXJ0CisgICBwYXVzZSBjaGFyYWN0ZXJzIGludG8gdGhlIGRpYWxpbmcgc3RyaW5nLiBGb3IgbW9kZW1zIHRoYXQgdXNlIHRoZSBBVAorICAgY29tbWFuZCBzZXQsIHRoZSBwYXVzZSBjaGFyYWN0ZXIgaXMgY29tbWEgKCwpIGFuZCBjYXVzZXMgYSAyLXNlY29uZAorICAgcGF1c2UuIE9uIG1vc3QgbW9kZW1zLCB5b3UgY2FuIHVzZSB0aGUgUzggcmVnaXN0ZXIgdG8gY2hhbmdlIHRoZSBwYXVzZQorICAgaW50ZXJ2YWwgY2F1c2VkIGJ5IGNvbW1hIGluIHRoZSBkaWFsaW5nIHN0cmluZy4gVGhlIG90aGVyIHdheSBpcyB0bworICAgc2V0IHlvdXIgbW9kZW0ncyB0b25lIGdlbmVyYXRpb24gaW50ZXJ2YWwsIGlmIGl0IGhhcyBhIGNvbW1hbmQgZm9yCisgICB0aGF0LiBNb3N0IEFULWNvbW1hbmQtc2V0IG1vZGVtcyB1c2UgUzExIGZvciB0aGlzOyB0aGUgdmFsdWUgaXMgaW4KKyAgIG1pbGxpc2Vjb25kcy4gRm9yIGV4YW1wbGUgb24gVVNSIG1vZGVtczoKKworICBBVFMxMT0yMDAKKworICAgc2VsZWN0cyBhbiBpbnRlcnZhbCBvZiAyMDAgbWlsbGlzZWNvbmRzIHRvIHNlcGFyYXRlIGVhY2ggZGlhbGluZyB0b25lLgorCisgICBIaW50OiBUbyBhZGQgUy1SZWdpc3RlciBzZXR0aW5ncyBvciBvdGhlciBjb21tYW5kcyB0byB5b3VyIGRpYWxpbmcKKyAgIHByb2NlZHVyZSwgdXNlIHRoZSBuZXcgU0VUIE1PREVNIENPTU1BTkQgUFJFRElBTC1JTklUIGNvbW1hbmQKKyAgIChbMzg4XVNlY3Rpb24gMi4yLjIpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMi4xLjkuIFByZXRlc3RpbmcgUGhvbmUgTnVtYmVyIENvbnZlcnNpb25zCisKKyAgIFRoZSBMT09LVVAgY29tbWFuZCBub3cgYWNjZXB0cyB0ZWxlcGhvbmUgbnVtYmVycyBhcyB3ZWxsIGFzCisgICBkaXJlY3RvcnktZW50cnkgbmFtZXMsIGZvciBleGFtcGxlOgorCisgIExPT0tVUCArMSAoMjEyKSA3NjU0MzIxCisKKyAgIFdoZW4gZ2l2ZW4gYSBwaG9uZSBudW1iZXIsIExPT0tVUCBwcmludHMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZQorICAgcGhvbmUgbnVtYmVyIGZvciBkaWFsaW5nIHVuZGVyIHRoZSBjdXJyZW50IGRpYWxpbmcgcnVsZXMuIEZvciBleGFtcGxlLAorICAgaWYgbXkgY291bnRyeSBjb2RlIGlzIDEgYW5kIG15IGFyZWEgY29kZSBpcyAyMTIsIGFuZCBJIGFtIGRpYWxpbmcgb3V0CisgICBmcm9tIGEgUEJYIHdob3NlIG91dHNpZGUtbGluZSBwcmVmaXggaXMgIjkzLCI6CisKKyAgQy1LZXJtaXQ+IGxvb2t1cCArMSAoMjEyKSA3NjU0MzIxCisgICsxICgyMTIpIDc2NTQzMjEgPT4gOTMsNzY1NDMyMQorICBDLUtlcm1pdD4KKworICAgWW91IGNhbiBhbHNvIHVzZSB0aGUgXGZkaWFsY29udmVydChwaG9uZS1udW1iZXIpIGZ1bmN0aW9uCisgICAoWzM4OV1TZWN0aW9uIDIuMS4xMSkgdG8gZG8gdGhpcyBwcm9ncmFtbWF0aWNhbGx5OgorCisgIEMtS2VybWl0PiBlY2hvICJcZmRpYWxjb252ZXJ0KCsxICgyMTIpIDc2NTQzMjEpIgorICAiOTMsNzY1NDMyMSIKKyAgQy1LZXJtaXQ+CisKKyAgIFNvIHRoZSBuZXcgTE9PS1VQIGJlaGF2ZXMgYXMgZm9sbG93czoKKworICAgTE9PS1VQIHBvcnRhYmxlLWZvcm1hdC1waG9uZS1udW1iZXIKKyAgICAgICAgICBEaXNwbGF5cyBob3cgdGhlIG51bWJlciB3b3VsZCBhY3R1YWxseSBiZSBkaWFsZWQgU2V0cyBGQUlMVVJFCisgICAgICAgICAgaWYgdGhlcmUgd2FzIGEgY29udmVyc2lvbiBlcnJvciwgb3RoZXJ3aXNlIFNVQ0NFU1MuCisKKyAgIExPT0tVUCBsaXRlcmFsLWZvcm1hdC1waG9uZS1udW1iZXIKKyAgICAgICAgICBEaXNwbGF5cyB0aGUgc2FtZSBsaXRlcmFsLWZvcm1hdC1waG9uZS1udW1iZXIgQWx3YXlzIHNldHMKKyAgICAgICAgICBTVUNDRVNTLgorCisgICBMT09LVVAgZGlhbGluZy1kaXJlY3RvcnktbmFtZQorICAgICAgICAgIERpc3BsYXlzIGFsbCBtYXRjaGluZyBlbnRyaWVzIGFuZCBjb252ZXJ0cyBwb3J0YWJsZSBwaG9uZQorICAgICAgICAgIG51bWJlcnMuIFNldHMgU1VDQ0VTUyBpZiBhdCBsZWFzdCBvbmUgZW50cnkgd2FzIGZvdW5kLAorICAgICAgICAgIG90aGVyd2lzZSBGQUlMVVJFLgorCisgICBMT09LVVAgPWFueXRoaW5nCisgICAgICAgICAgRGlzcGxheXMgIj1hbnl0aGluZyIgYW5kIHNldHMgU1VDQ0VTUy4KKworICAgVGhlcmUgaXMsIGF0IHByZXNlbnQsIG5vIHByb2dyYW1tYXRpYyB3YXkgdG8gZmV0Y2ggbnVtYmVycyBmcm9tIHRoZQorICAgZGlhbGluZyBkaXJlY3RvcnkuIFRoaXMgd2lsbCBiZSBjb25zaWRlcmVkIGZvciBhIGZ1dHVyZSByZWxlYXNlLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMi4xLjEwLiBHcmVhdGVyIENvbnRyb2wgb3ZlciBQYXJ0aWFsIERpYWxpbmcKKworICAgVGhlIGZvbGxvd2luZyBydWxlcyBub3cgYXBwbHkgdG8gcGFydGlhbCBkaWFsaW5nOgorCisgICAgICogUGhvbmUgbnVtYmVyIHRyYW5zZm9ybWF0aW9ucyBiYXNlZCBvbiBjb3VudHJ5IGFuZCBhcmVhIGNvZGUsCisgICAgICAgYXBwbGljYXRpb24gb2YgcHJlZml4ZXMsIGV0YywgYXJlIHBlcmZvcm1lZCBvbmx5IG9uIHRoZSBmaXJzdAorICAgICAgIFBESUFMLgorICAgICAqIEVhY2ggUERJQUwgYXJndW1lbnQgaXMgbG9va2VkIHVwIGluIHRoZSBkaWFsaW5nIGRpcmVjdG9yeSwgc28gaXQKKyAgICAgICBpcyBwb3NzaWJsZSBoYXZlIGRpcmVjdG9yeSBlbnRyaWVzIGZvciBwaWVjZXMgb2YgcGhvbmUgbnVtYmVycyBvcgorICAgICAgIG90aGVyIGluZm9ybWF0aW9uLgorICAgICAqIFN1ZmZpeGVzIGFyZSBub3QgYXBwbGllZCBhdXRvbWF0aWNhbGx5LCBzaW5jZSB0aGVyZSBpcyBubyB3YXkgZm9yCisgICAgICAgQy1LZXJtaXQgdG8ga25vdyBpbiB3aGljaCBQRElBTCBzZWdtZW50IHlvdSB3YW50IHRoZW0gdG8gYmUKKyAgICAgICBhcHBsaWVkLgorCisgICBIb3dldmVyLCB0aGUgc3VmZml4IHRoYXQgKndvdWxkKiBoYXZlIGJlZW4gYXBwbGllZCwgYmFzZWQgb24gdGhlCisgICBkaWFsaW5nIHJ1bGVzIHRoYXQgd2VyZSBpbnZva2VkIHdoZW4gcHJvY2Vzc2luZyB0aGUgZmlyc3QgUERJQUwKKyAgIGNvbW1hbmQsIGlzIHN0b3JlZCBpbiB0aGUgdmFyaWFibGU6CisKKyAgXHYoZGlhbHN1ZmZpeCkKKworICAgd2hpY2ggeW91IGNhbiBpbmNsdWRlIGluIGFueSBzdWJzZXF1ZW50IFBESUFMIG9yIERJQUwgY29tbWFuZHMuCisKKyAgIEV4YW1wbGU6CisKKyAgcGRpYWwge1xtKG15X2xvbmdfZGlzdGFuY2VfcGFnZXJfbnVtYmVyX3BhcnRfMSl9CisgIHBkaWFsIHtcbShteV9sb25nX2Rpc3RhbmNlX3BhZ2VyX251bWJlcl9wYXJ0XzIpfQorICBwZGlhbCB7XHYoZGlhbHN1ZmZpeCl9CisgIHBkaWFsIHtcbShteV9sb25nX2Rpc3RhbmNlX3BhZ2VyX251bWJlcl9wYXJ0XzMpfQorICBwZGlhbCB7QFxtKG51bWVyaWNfcGFnZXJfY29kZSkjfQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMi4xLjExLiBOZXcgRElBTC1yZWxhdGVkIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zCisKKyAgIFxmZGlhbGNvbnZlcnQocykKKyAgICAgICAgICBzIGlzIGEgcGhvbmUgbnVtYmVyIGluIGVpdGhlciBsaXRlcmFsIG9yIHBvcnRhYmxlIGZvcm1hdCAobm90IGEKKyAgICAgICAgICBkaWFsaW5nIGRpcmVjdG9yeSBlbnRyeSBuYW1lKS4gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRpYWwKKyAgICAgICAgICBzdHJpbmcgdGhhdCB3b3VsZCBhY3R1YWxseSBiZSB1c2VkIGJ5IHRoZSBESUFMIGNvbW1hbmQgd2hlbgorICAgICAgICAgIGRpYWxpbmcgZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbiwgYWZ0ZXIgcHJvY2Vzc2luZyBjb3VudHJ5CisgICAgICAgICAgY29kZSwgYXJlYSBjb2RlLCBhbmQgb3RoZXIgU0VUIERJQUwgdmFsdWVzLCBhbmQgc2hvdWxkIGJlIHRoZQorICAgICAgICAgIHNhbWUgYXMgdGhlIHJlc3VsdCBvZiBMT09LVVAgd2hlbiBnaXZlbiBhIHRlbGVwaG9uZSBudW1iZXIuCisKKyAgIFx2KGRpYWxzdWZmaXgpCisgICAgICAgICAgQ29udGFpbnMgdGhlIHN1ZmZpeCwgaWYgYW55LCB0aGF0IHdhcyBhcHBsaWVkIGluIHRoZSBtb3N0CisgICAgICAgICAgcmVjZW50IERJQUwgY29tbWFuZCwgb3IgdGhlIHN1ZmZpeCB0aGF0IHdvdWxkIGhhdmUgYmVlbiBhcHBsaWVkCisgICAgICAgICAgaW4gdGhlIG1vc3QgcmVjZW50IFBESUFMIGNvbW1hbmQuIFVzZSB0aGlzIHZhcmlhYmxlIHRvIHNlbmQgdGhlCisgICAgICAgICAgZGlhbCBzdWZmaXggYXQgYW55IGRlc2lyZWQgcG9pbnQgaW4gYSBQRElBTCBzZXF1ZW5jZS4KKworICAgXHYoZGlhbHR5cGUpCisgICAgICAgICAgQSBudW1iZXIgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBjYWxsIHRoYXQgd2FzIG1vc3QgcmVjZW50bHkKKyAgICAgICAgICBwbGFjZWQuIENhbiBiZSB1c2VkIGFmdGVyIGEgbm9ybWFsIERJQUwgY29tbWFuZCwgb3IgYWZ0ZXIgdGhlCisgICAgICAgICAgZmlyc3QgUERJQUwgY29tbWFuZCBpbiBhIFBESUFMIHNlcXVlbmNlLiBWYWx1ZXMgYXJlOgorCisgIC0yOiBVbmtub3duIGJlY2F1c2UgVEFQSSBoYW5kbGVkIHRoZSBwaG9uZSBudW1iZXIgdHJhbnNsYXRpb24uCisgIC0xOiBVbmtub3duIGJlY2F1c2Ugc29tZSBraW5kIG9mIGVycm9yIG9jY3VyZWQuCisgICAwOiBJbnRlcm5hbCB3aXRoaW4gUEJYLgorICAgMTogVG9sbC1mcmVlLgorICAgMjogTG9jYWwgd2l0aGluIGNhbGxpbmcgYXJlYS4KKyAgIDM6IFVua25vd24gKGUuZy4gYmVjYXVzZSBhIGxpdGVyYWwtZm9ybWF0IHBob25lIG51bWJlciB3YXMgZ2l2ZW4pLgorICAgNDogTG9uZyBkaXN0YW5jZSB3aXRoaW4gY291bnRyeS4KKyAgIDU6IEludGVybmF0aW9uYWwKKworICAgXHYoZGlhbGNvdW50KQorICAgICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBESUFMIHJldHJ5IGNvdW50ZXIsIGZvciB1c2UgaW4gYSBESUFMCisgICAgICAgICAgbWFjcm8gKFszOTBdU2VjdGlvbiAyLjEuMTMpLgorCisgICBcdihkJHB4KQorICAgICAgICAgIFBCWCBFeGNoYW5nZSAoc2VlIFszOTFdU2VjdGlvbiAyLjEuMTIpLgorCisgICBPdGhlciBkaWFsLXJlbGF0ZWQgdmFyaWFibGVzLCBhbHJlYWR5IGRvY3VtZW50ZWQgaW4gWzM5Ml1Vc2luZworICAgQy1LZXJtaXQgKG9yIG90aGVyIHNlY3Rpb25zIG9mIHRoaXMgZG9jdW1lbnQsIGUuZy4gWzM5M11TZWN0aW9uCisgICAyLjEuMSksIGluY2x1ZGUgXHYoZGlhbG51bWJlciksIFx2KGRpYWxzdGF0dXMpLCBldGMuIEEgY29udmVuaWVudCB3YXkKKyAgIHRvIGRpc3BsYXkgYWxsIG9mIHRoZW0gaXM6CisKKyAgc2hvdyB2YXJpYWJsZSBkaWFsICA7IGhpbnQ6IGFiYnJldmlhdGUgInNobyB2YXIgZGlhbCIKKworICAgVGhpcyBzaG93cyB0aGUgdmFsdWVzIG9mIGFsbCB0aGUgdmFyaWFibGVzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGgKKyAgICJkaWFsIi4gQWxzbyAic2hvdyB2YXJpYWJsZSBkJCIgKHRvIHNob3cgdGhlIFx2KGQkLi4uKSB2YXJpYWJsZXMpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMi4xLjEyLiBJbmNyZWFzZWQgRmxleGliaWxpdHkgb2YgUEJYIERpYWxpbmcKKworICAgUmVmZXIgdG8gWzM5NF1Vc2luZyBDLUtlcm1pdCwgMm5kIEVkaXRpb24sIHBhZ2VzIDEwNy0xMDguIFJlY2FsbCB0aGF0CisgICB0aHJlZSBjb21tYW5kcyBhcmUgbmVlZGVkIHRvIGNvbmZpZ3VyZSBDLUtlcm1pdCBmb3IgZGlhbGluZyBmcm9tIGEKKyAgIFBCWDoKKworICBTRVQgRElBTCBQQlgtRVhDSEFOR0UgbnVtYmVyCisgIFNFVCBESUFMIFBCWC1JTlNJREUtUFJFRklYIG51bWJlcgorICBTRVQgRElBTCBQQlgtT1VUU0lERS1QUkVGSVggbnVtYmVyCisKKyAgIFVuZm9ydHVuYXRlbHksIHRoaXMgbW9kZWwgZG9lcyBub3QgYWNjb21tb2RhdGUgUEJYcyB0aGF0IGhhdmUgbW9yZQorICAgdGhhbiBvbmUgZXhjaGFuZ2UuIEZvciBleGFtcGxlIG91ciBQQlggYXQgQ29sdW1iaWEgVW5pdmVyc2l0eSAod2hpY2gKKyAgIG11c3QgaGFuZGxlIG1vcmUgdGhhbiAxMCwwMDAgcGhvbmVzKSBoYXMgODUzLXh4eHggYW5kIDg1NC14eHh4CisgICBleGNoYW5nZXMuCisKKyAgIEJlZ2lubmluZyBpbiBDLUtlcm1pdCA3LjAsIHRoZSBTRVQgRElBTCBQQlgtRVhDSEFOR0UgY29tbWFuZCBhY2NlcHRzIGEKKyAgIGxpc3Qgb2YgZXhjaGFuZ2VzLCBlLmcuOgorCisgIFNFVCBESUFMIFBCWC1FWENIQU5HRSA4NTMgODU0CisKKyAgIChtdWx0aXBsZSBleGNoYW5nZXMgYXJlIHNlcGFyYXRlZCBieSBzcGFjZXMsIG5vdCBjb21tYXMpLgorCisgICBTbyBub3cgd2hlbiBkaWFsaW5nIGEgcG9ydGFibGUtZm9ybWF0IG51bWJlciB0aGF0IGhhcyB0aGUgc2FtZSBjb3VudHJ5CisgICBhbmQgYXJlYSBjb2RlcyBhcyB0aG9zZSBvZiB5b3VyIGRpYWxpbmcgbG9jYXRpb24sIEMtS2VybWl0IGNvbXBhcmVzCisgICB0aGUgZXhjaGFuZ2Ugb2YgdGhlIGRpYWxlZCBudW1iZXIgd2l0aCBlYWNoIG51bWJlciBpbiB0aGUgUEJYIEV4Y2hhbmdlCisgICBsaXN0IChyYXRoZXIgdGhhbiB3aXRoIGEgc2luZ2xlIFBCWCBFeGNoYW5nZSBudW1iZXIsIGFzIGl0IGRpZAorICAgZm9ybWVybHkpIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYW4gaW50ZXJuYWwgUEJYIG51bWJlciBvciBhbgorICAgZXh0ZXJuYWwgY2FsbC4gSWYgaXQgaXMgYW4gZXh0ZXJuYWwgY2FsbCwgdGhlbiB0aGUgUEJYIE91dHNpZGUgUHJlZml4CisgICBpcyBhcHBsaWVkLCBhbmQgdGhlbiB0aGUgbm9ybWFsIGRpYWxpbmcgcnVsZXMgZm9yIGxvY2FsIG9yCisgICBsb25nLWRpc3RhbmNlIGNhbGxzLgorCisgICBJZiBpdCBpcyBhbiBpbnNpZGUgY2FsbCwgdGhlIGV4Y2hhbmdlIGlzIHJlcGxhY2VkIGJ5IHRoZSBQQlggSW5zaWRlCisgICBQcmVmaXguIEJ1dCBpZiB0aGUgUEJYIGhhcyBtb3JlIHRoYW4gb25lIGV4Y2hhbmdlLCBhIHNpbmdsZSBmaXhlZCBQQlgKKyAgIEluc2lkZSBQcmVmaXggaXMgcHJvYmFibHkgbm90IHN1ZmZpY2llbnQuIEZvciBleGFtcGxlLCBhdCBDb2x1bWJpYQorICAgVW5pdmVyc2l0eSwgd2UgbXVzdCBkaWFsIDMteHh4eCBmb3IgYW4gaW50ZXJuYWwgY2FsbCB0byA4NTMteHh4eCwgYnV0CisgICA0LXh4eHggZm9yIGEgY2FsbCB0byA4NTQteHh4eC4gVGhhdCBpcywgdGhlIGluc2lkZSBwcmVmaXggaXMgdGhlIGZpbmFsCisgICBkaWdpdCBvZiB0aGUgZXhjaGFuZ2Ugd2UgYXJlIGRpYWxpbmcuIEZvciB0aGlzIHJlYXNvbiwgQy1LZXJtaXQgNy4wCisgICBwcm92aWRlcyBhIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIGluc2lkZSBwcmVmaXggZHluYW1pY2FsbHkgYXQKKyAgIGRpYWxpbmcgdGltZSwgY29uc2lzdGluZyBvZiBhIG5ldyB2YXJpYWJsZSBhbmQgbmV3IHN5bnRheCBmb3IgdGhlIFNFVAorICAgRElBTCBQQlgtSU5TSURFLVBSRUZJWCBjb21tYW5kOgorCisgICBcdihkJHB4KQorICAgICAgICAgIFRoaXMgdmFyaWFibGUgY29udGFpbnMgdGhlIGV4Y2hhbmdlIHRoYXQgd2FzIG1hdGNoZWQgd2hlbiBhIFBCWAorICAgICAgICAgIGludGVybmFsIGNhbGwgd2FzIGRldGVjdGVkLiBGb3IgZXhhbXBsZSwgaWYgdGhlIFBCWCBleGNoYW5nZQorICAgICAgICAgIGxpc3QgaXMgIjg1MyA4NTQiIGFuZCBhIGNhbGwgaXMgcGxhY2VkIHRvICsxICgyMTIpIDg1NC05OTk5LAorICAgICAgICAgIFx2KGQkcHgpIGlzIHNldCB0byA4NTQuCisKKyAgIFNFVCBESUFMIFBCWC1JTlNJREUtUFJFRklYIFxmeHh4KC4uLikKKyAgICAgICAgICBJZiB0aGUgUEJYIEluc2lkZSBQcmVmaXggaXMgZGVmaW5lZCB0byBiZSBhIGZ1bmN0aW9uLCBpdHMKKyAgICAgICAgICBldmFsdWF0aW9uIGlzIGRlZmVycmVkIHVudGlsIGRpYWxpbmcgdGltZS4gTm9ybWFsbHksIHRoaXMgd291bGQKKyAgICAgICAgICBiZSBhIHN0cmluZyBmdW5jdGlvbiBoYXZpbmcgXHYoZCRweCkgYXMgYW4gb3BlcmFuZC4gT2YgY291cnNlLAorICAgICAgICAgIHlvdSBjYW4gc3RpbGwgc3BlY2lmeSBhIGNvbnN0YW50IHN0cmluZywgYXMgYmVmb3JlLgorCisgICBTbyBnaXZlbiB0aGUgZm9sbG93aW5nIHNldHVwOgorCisgIFNFVCBESUFMIENPVU5UUlktQ09ERSAxCisgIFNFVCBESUFMIEFSRUEtQ09ERSAyMTIKKyAgU0VUIERJQUwgUEJYLU9VVFNJREUtUFJFRklYIDkzLAorICBTRVQgRElBTCBQQlgtRVhDSEFOR0UgODUzIDg1NAorICBTRVQgRElBTCBQQlgtSU5TSURFLVBSRUZJWCBcZnJpZ2h0KFx2KGQkcHgpLDEpCisKKyAgIFRoZSBmb2xsb3dpbmcgbnVtYmVycyBnaXZlIHRoZSByZXN1bHRzIGluZGljYXRlZDoKKworIE51bWJlciAgICAgICAgICAgICAgICAgICBSZXN1bHQKKyAgKzEgKDIxMikgODU0LTk4NzYgICAgICAgIDQtOTg3NgorICArMSAoMjEyKSA4NTMtMTIzNCAgICAgICAgMy0xMjM0CisgICsxICgyMTIpIDc2NS00MzIxICAgICAgICA5Myw3NjUtNDMyMQorICArMSAoMzMzKSA3NjUtNDMyMSAgICAgICAgOTMsMTMzMzc2NS00MzIxCisKKyAgIEZ1cnRoZXJtb3JlLCB0aGUgS19QQlhfWENIIGVudmlyb25tZW50IHZhcmlhYmxlIG1heSBub3cgYmUgc2V0IHRvIGEKKyAgIGxpc3Qgb2YgZXhjaGFuZ2VzIHRvIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZSBDLUtlcm1pdCdzIFBCWCBleGNoYW5nZQorICAgbGlzdCwgZm9yIGV4YW1wbGUgKGluIFVOSVgga3NoIG9yIGJhc2gpOgorCisgIGV4cG9ydCBLX1BCWF9YQ0g9Ijg1MyA4NTQiCisKKyAgIChRdW90ZXMgcmVxdWlyZWQgYmVjYXVzZSBvZiB0aGUgc3BhY2UuKSBPZiBjb3Vyc2UsIHRoaXMgdmFyaWFibGUgY2FuCisgICBhbHNvIGJlIHNldCB0byBhIHNpbmdsZSBleGNoYW5nZSwgYXMgYmVmb3JlOgorCisgIGV4cG9ydCBLX1BCWF9YQ0g9ODUzCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAyLjEuMTMuIFRoZSBESUFMIG1hY3JvIC0gTGFzdC1NaW51dGUgUGhvbmUgTnVtYmVyIENvbnZlcnNpb25zCisKKyAgIEFmdGVyIGEgRElBTCBvciBMT09LVVAgY29tbWFuZCBpcyBnaXZlbiwgYSBsaXN0IG9mIHBob25lIG51bWJlcnMgaXMKKyAgIGFzc2VtYmxlZCBmcm9tIHRoZSBkaWFsaW5nIGRpcmVjdG9yeSAoaWYgYW55KSwgd2l0aCBhbGwKKyAgIGxvY2F0aW9uLWRlcGVuZGVudCBjb252ZXJzaW9uIHJ1bGVzIGFwcGxpZWQgYXMgZGVzY3JpYmVkIGluIENoYXB0ZXIgNQorICAgb2YgWzM5NV1Vc2luZyBDLUtlcm1pdC4KKworICAgSG93ZXZlciwgYWRkaXRpb25hbCBjb252ZXJzaW9ucyBtaWdodCBzdGlsbCBiZSByZXF1aXJlZCBhdCB0aGUgbGFzdAorICAgbWludXRlIGJhc2VkIG9uIGxvY2FsIG9yIGVwaGVtZXJhbCBjb25kaXRpb25zLiBTbyB0aGF0IHlvdSBjYW4gaGF2ZQorICAgdGhlIGZpbmFsIHdvcmQgb24gdGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUgZGlhbCBzdHJpbmcsIEMtS2VybWl0IDcuMAorICAgbGV0cyB5b3UgcGFzcyB0aGUgY29udmVydGVkIHN0cmluZyB0aHJvdWdoIGEgbWFjcm8gb2YgeW91ciBvd24gZGVzaWduCisgICBmb3IgZmluYWwgcHJvY2Vzc2luZyBiZWZvcmUgZGlhbGluZy4gVGhlIHJlbGV2YW50IGNvbW1hbmQgaXM6CisKKyAgIFNFVCBESUFMIE1BQ1JPIFsgbmFtZSBdCisgICAgICAgICAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgbWFjcm8gdG8gYmUgcnVuIG9uIGVhY2ggcGhvbmUgbnVtYmVyCisgICAgICAgICAgYWZ0ZXIgYWxsIGJ1aWx0LWluIGNvbnZlcnNpb25zIGhhdmUgYmVlbiBhcHBsaWVkLCBqdXN0IGJlZm9yZQorICAgICAgICAgIHRoZSBudW1iZXIgaXMgZGlhbGVkLiBJZiBubyBuYW1lIGlzIGdpdmVuLCBubyBtYWNybyBpcyBydW4uIFRoZQorICAgICAgICAgIHBob25lIG51bWJlciwgYXMgaXQgd291bGQgaGF2ZSBiZWVuIGRpYWxlZCBpZiB0aGVyZSB3ZXJlIG5vCisgICAgICAgICAgZGlhbCBtYWNybywgaXMgcGFzc2VkIHRvIHRoZSBtYWNyby4KKworICAgVGhlIGRpYWwgbWFjcm8gY2FuIGRvIGFueXRoaW5nIGF0IGFsbCAoZXhjZXB0IHN0YXJ0IGEgZmlsZSB0cmFuc2ZlcikuCisgICBIb3dldmVyLCB0aGUgbm9ybWFsIHVzZSBmb3IgdGhlIG1hY3JvIHdvdWxkIGJlIHRvIG1vZGlmeSB0aGUgcGhvbmUKKyAgIG51bWJlci4gRm9yIHRoaXMgcmVhc29uIHRoZSBwaG9uZSBudW1iZXIgaXMgcGFzc2VkIHRvIHRoZSBtYWNybyBhcworICAgYXJndW1lbnQgbnVtYmVyIDEgKFwlMSkuIFRvIGNhdXNlIGEgbW9kaWZpZWQgbnVtYmVyIHRvIGJlIGRpYWxlZCwgdGhlCisgICBtYWNybyBzaG91bGQgdGVybWluYXRlIHdpdGggYSBSRVRVUk4gc3RhdGVtZW50IHNwZWNpZnlpbmcgYSByZXR1cm4KKyAgIHZhbHVlLiBUbyBsZWF2ZSB0aGUgbnVtYmVyIGFsb25lLCB0aGUgbWFjcm8gc2hvdWxkIHNpbXBseSBlbmQuCisgICBFeGFtcGxlOgorCisgIGRlZmluZSB4eHggcmV0dXJuIDEwMTA4ODg5OTk5JFwlMQorICBzZXQgZGlhbCBtYWNybyB4eHgKKyAgZGlhbCB4eXpjb3JwCisKKyAgIFRoaXMgZGVmaW5lcyBhIERJQUwgTUFDUk8gY2FsbGVkIHh4eCwgd2hpY2ggcHV0cyBhbiBhY2Nlc3MgY29kZSBvbiB0aGUKKyAgIGZyb250IG9mIHRoZSBudW1iZXIuIEFub3RoZXIgZXhhbXBsZSBtaWdodCBiZToKKworICBkZWYgeHh4IGlmIGVxdWFsICJcdihtb2RlbSkiICJoYXllcy0xMjAwIiByZXR1cm4gXGZyZXBsYWNlKFwlMSwkLHssLCwsLH0pCisgIHNldCBkaWFsIG1hY3JvIHh4eAorICBkaWFsIHh5emNvcnAKKworICAgd2hpY2ggcmVwbGFjZXMgYW55IGRvbGxhci1zaWduIGluIHRoZSBkaWFsIHN0cmluZyBieSBhIHNlcmllcyBvZiBmaXZlCisgICBjb21tYXMsIGUuZy4gYmVjYXVzZSB0aGlzIHBhcnRpY3VsYXIgbW9kZW0gZG9lcyBub3Qgc3VwcG9ydCB0aGUgIndhaXQKKyAgIGZvciBib25nIiBmZWF0dXJlIChyZW1lbWJlciB0aGF0IGNvbW1hcyB0aGF0IGFyZSB0byBiZSBpbmNsdWRlZAorICAgbGl0ZXJhbGx5IGluIGZ1bmN0aW9uIGFyZ3VtZW50cyBtdXN0IGJlIGVuY2xvc2VkIGluIGJyYWNlcyB0bworICAgZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIHRoZSBjb21tYXMgdGhhdCBzZXBhcmF0ZSB0aGUgYXJndW1lbnRzKSBhbmQgd2hlbgorICAgdGhlIElGIGNvbmRpdGlvbiBpcyBub3Qgc2F0aXNmaWVkLCB0aGUgbWFjcm8gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUsCisgICBhbmQgc28gdGhlIG51bWJlciBpcyBub3QgbW9kaWZpZWQuIFRoZW4gd2hlbiBhIERJQUwgY29tbWFuZCBpcyBnaXZlbgorICAgcmVmZXJlbmNpbmcgYSBkaWFsaW5nIGRpcmVjdG9yeSBlbnRyeSwgInh5emNvcnAiLiBUaGUgbWFjcm8gaXMKKyAgIGF1dG9tYXRpY2FsbHkgYXBwbGllZCB0byBlYWNoIG1hdGNoaW5nIG51bWJlci4KKworICAgTnVtZXJvdXMgZGlhbC0sIG1vZGVtLSwgY29tbXVuaWNhdGlvbnMtLCBhbmQgdGltZS1yZWxhdGVkIHZhcmlhYmxlcworICAgYXJlIGF2YWlsYWJsZSBmb3IgZGVjaXNpb24gbWFraW5nIHlvdXIgZGlhbCBtYWNyby4gVHlwZSBTSE9XIFZBUklBQkxFUworICAgZm9yIGEgbGlzdC4gT2YgcGFydGljdWxhciBpbnRlcmVzdCBpcyB0aGUgXHYoZGlhbGNvdW50KSB2YXJpYWJsZSwKKyAgIHdoaWNoIHRlbGxzIGhvdyBtYW55IHRpbWVzIHRoZSBESUFMIGNvbW1hbmQgZ29uZSB0aHJvdWdoIGl0cyByZXRyeQorICAgbG9vcDogMSBvbiB0aGUgZmlyc3QgdHJ5LCAyIG9uIHRoZSBzZWNvbmQsIDMgb24gdGhlIHRoaXJkLCBhbmQgc28gb24sCisgICBhbmQgdGhlIFx2KGRpYWxyZXN1bHQpIGFuZCBcdihkaWFsc3RhdHVzKSB2YXJpYWJsZXMuCisKKyAgIEhlcmUgYXJlIHNvbWUgb3RoZXIgYXBwbGljYXRpb25zIGZvciB0aGUgRElBTCBNQUNSTyAoZnJvbSB1c2Vycyk6CisKKyAgICAgKiBQaG9uZSBudW1iZXJzIGluIHRoZSBkaWFsaW5nIGRpcmVjdG9yeSBhcmUgZm9ybWF0dGVkIHdpdGggJy0nIGZvcgorICAgICAgIHJlYWRhYmlsaXR5LCBidXQgc29tZSBtb2RlbXMgZG9uJ3QgbGlrZSB0aGUgaHlwaGVucywgc28gdGhlIERJQUwKKyAgICAgICBtYWNybyBpcyB1c2VkIHRvIHJlbW92ZSB0aGVtIGJlZm9yZSBkaWFsaW5nOyBlLmcKKyAgICAgICAwMDkwLTEyMy00NTYtNzgtOTkgYmVjb21lcyAwMDkwMTIzNDU2Nzg5OTogImRlZiB4eHggcmV0dXJuCisgICAgICAgXGZyZXBsYWNlKFwlMSwtKSIuCisgICAgICogVG8gc2V0IHNvbWUgc3BlY2lmaWMgbW9kZW0gKG9yIG90aGVyKSBvcHRpb25zIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgICBjYWxsZWQgY3VzdG9tZXIgb3IgdGVsZXBob25lIG51bWJlci4KKyAgICAgKiBDaG9vc2luZyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBwcm92aWRlciBiYXNlZCBvbiAoZS5nLikgdGltZSBvZgorICAgICAgIGRheSwgb3IgY3ljbGluZyB0aHJvdWdoIGEgbGlzdCBvZiBwcm92aWRlcnMgaW4gY2FzZSBzb21lIHByb3ZpZGVycworICAgICAgIG1pZ2h0IGJlIGJ1c3kuCisKKyAgIFRvIGlsbHVzdHJhdGUgdGhlIGZpbmFsIGl0ZW0sIHN1cHBvc2UgeW91IGhhdmUgYSBjaG9pY2UgYW1vbmcgbWFueQorICAgcGhvbmUgc2VydmljZSBwcm92aWRlcnM7IHRoZSBwcm92aWRlciBpcyBjaG9zZW4gYnkgZGlhbGluZyBhbiBhY2Nlc3MKKyAgIGNvZGUgYmVmb3JlIHRoZSBudW1iZXIuIERpZmZlcmVudCBwcm92aWRlcnMgbWlnaHQgYmUgYmV0dGVyIChlLmcuCisgICBjaGVhcGVyKSBmb3IgY2VydGFpbiB0aW1lcyBvZiBkYXkgb3IgZGF5cyBvZiB0aGUgd2Vlaywgb3IgZm9yIGRpYWxpbmcKKyAgIGNlcnRhaW4gbG9jYXRpb25zOyB5b3UgY2FuIHVzZSB0aGUgRElBTCBtYWNybyB0byBhZGQgdGhlIGFjY2VzcyBmb3IKKyAgIHRoZSBtb3N0IGRlc2lyYWJsZSBwcm92aWRlci4KKworICAgU2ltaWxhcmx5LCB3aGVuIHRoZSBzYW1lIG51bWJlciBtaWdodCBiZSByZWFjaGVkIHRocm91Z2ggbXVsdGlwbGUKKyAgIHByb3ZpZGVycywgaXQncyBwb3NzaWJsZSB0aGF0IG9uZSBwcm92aWRlciBtaWdodCBub3QgYmUgYWJsZSB0bworICAgY29tcGxldGUgdGhlIGNhbGwsIGJ1dCBhbm90aGVyIG9uZSBjYW4uIEluIHRoYXQgY2FzZSwgeW91IGNhbiB1c2UgdGhlCisgICBESUFMIG1hY3JvIHRvIHN3aXRjaCBwcm92aWRlcnMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIERJQUwgbG9vcCAtLQorICAgdGhhdCdzIHdoZXJlIHRoZSBcdihkaWFsY291bnQpIHZhcmlhYmxlIGNvbWVzIGluIGhhbmR5LgorCisgICBUaGUgZm9sbG93aW5nIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gZGVidWcgdGhlIERJQUwgbWFjcm86CisKKyAgIFNFVCBESUFMIFRFU1QgeyBPTiwgT0ZGIH0KKyAgICAgICAgICBOb3JtYWxseSBPRkYsIHNvIHRoZSBESUFMIGNvbW1hbmQgYWN0dWFsbHkgZGlhbHMuIFdoZW4gT04sIHRoZQorICAgICAgICAgIERJQUwgY29tbWFuZCBwZXJmb3JtcyBhbGwgbG9va3VwcyBhbmQgbnVtYmVyIGNvbnZlcnNpb25zLCBhbmQKKyAgICAgICAgICB0aGVuIGdvZXMgdGhyb3VnaCB0aGUgbnVtYmVyIGxpc3QgYW5kIHJldHJ5IGxvb3AsIGJ1dCBpbnN0ZWFkCisgICAgICAgICAgb2YgYWN0dWFsbHkgZGlhbGluZywgbGlzdHMgdGhlIG51bWJlcnMgaXQgd291bGQgaGF2ZSBjYWxsZWQgaWYKKyAgICAgICAgICBub25lIG9mIHRoZSBESUFMIGF0dGVtcHRzIHN1Y2NlZWRlZCAob3IgbW9yZSBwcmVjaXNlbHksIGV2ZXJ5CisgICAgICAgICAgbnVtYmVyIHdhcyBhbHdheXMgYnVzeSkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAyLjEuMTQuIEF1dG9tYXRpYyBUb25lL1B1bHNlIERpYWxpbmcgU2VsZWN0aW9uCisKKyAgIFNFVCBESUFMIE1FVEhPRCB7IEFVVE8sIERFRkFVTFQsIFBVTFNFLCBUT05FIH0KKyAgICAgICAgICBDaG9vc2VzIHRoZSBkaWFsaW5nIG1ldGhvZCBmb3Igc3Vic2VxdWVudCBjYWxscy4KKworICAgUHJpb3IgdG8gdmVyc2lvbiA3LjAsIEMtS2VybWl0J3MgRElBTCBNRVRIT0Qgd2FzIERFRkFVTFQgYnkgZGVmYXVsdCwKKyAgIG1lYW5pbmcgaXQgZG9lcyBub3Qgc3BlY2lmeSBhIGRpYWxpbmcgbWV0aG9kIHRvIHRoZSBtb2RlbSwgYnV0IHJlbGllcworICAgb24gdGhlIG1vZGVtIHRvIGhhdmUgYW4gYXBwcm9wcmlhdGUgZGVmYXVsdCBkaWFsaW5nIG1ldGhvZCBzZXQuIFNvLAorICAgZm9yIGV4YW1wbGUsIHdoZW4gdXNpbmcgSGF5ZXMgY29tcGF0aWJsZSBtb2RlbXMsIHRoZSBkaWFsIHN0cmluZyB3b3VsZAorICAgYmUgc29tZXRoaW5nIGxpa2UgQVRENzY1NDMyMSwgcmF0aGVyIHRoYW4gQVREVDc2NTQzMjEgb3IgQVREUDc2NTQzMjEuCisKKyAgIEluIEMtS2VybWl0IDcuMCBhbmQgSzk1IDEuMS4xOSwgdGhlIGRpYWwgbWV0aG9kIGNhbiBiZSBzZXQgZnJvbSB0aGUKKyAgIGVudmlyb25tZW50IHZhcmlhYmxlOgorCisgIEtfRElBTF9NRVRIT0QKKworICAgd2hlbiBLZXJtaXQgc3RhcnRzLiBUaGUgdmFsdWVzIGNhbiBiZSBUT05FLCBQVUxTRSwgb3IgREVGQVVMVCwgZS5nLgorICAgKFVOSVgpOgorCisgIHNldCBLX0RJQUxfTUVUSE9EPVRPTkU7IGV4cG9ydCBLX0RJQUxfTUVUSE9ECisKKyAgIEluIHRoZSBhYnNlbmNlIG9mIGEgS19ESUFMX01FVEhPRCBkZWZpbml0aW9uLCB0aGUgbmV3IGRlZmF1bHQgU0VUIERJQUwKKyAgIE1FVEhPRCBpcyBBVVRPIHJhdGhlciB0aGFuIERFRkFVTFQuIFdoZW4gRElBTCBNRVRIT0QgaXMgQVVUTyBhbmQgdGhlCisgICBsb2NhbCBjb3VudHJ5IGNvZGUgaXMga25vd24sIHRoZW4gaWYgdG9uZSBkaWFsaW5nIGlzIHVuaXZlcnNhbGx5CisgICBhdmFpbGFibGUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgYXJlYSwgdG9uZSBkaWFsaW5nIGlzIHVzZWQ7IGlmIGRpYWxpbmcKKyAgIGZyb20gYSBsb2NhdGlvbiB3aGVyZSBwdWxzZSBkaWFsaW5nIGlzIG1hbmRhdG9yeSwgcHVsc2UgZGlhbGluZyBpcworICAgdXNlZC4KKworICAgVGhlICJ0b25lIGNvdW50cnkiIGFuZCAicHVsc2UgY291bnRyeSIgbGlzdHMgYXJlIHByZWxvYWRlZCBhY2NvcmRpbmcKKyAgIHRvIG91ciBrbm93bGVkZ2UgYXQgdGhlIHRpbWUgb2YgcmVsZWFzZS4gWW91IGNhbiBzZWUgdGhlaXIgY29udGVudHMgaW4KKyAgIHRoZSBTSE9XIERJQUwgbGlzdGluZy4gWW91IGNhbiBjaGFuZ2UgdGhlIGxpc3RzIHdpdGg6CisKKyAgIFNFVCBESUFMIFRPTkUtQ09VTlRSSUVTIFsgY2MgWyBjYyBbIC4uLiBdIF0gXQorICAgICAgICAgIFJlcGxhY2VzIHRoZSBjdXJyZW50IFRPTkUtQ09VTlRSSUVTIGxpc3Qgd2l0aCB0aGUgb25lIGdpdmVuLgorICAgICAgICAgIEVhY2ggY2MgaXMgYSBjb3VudHJ5IGNvZGU7IHNlcGFyYXRlIHRoZW0gd2l0aCBzcGFjZXMgKG5vdAorICAgICAgICAgIGNvbW1hcykuIEV4YW1wbGU6CisKKyAgc2V0IGRpYWwgdG9uZS1jb3VudHJpZXMgMSAzNTggNDQgNDYgNDkKKworICAgICAgICAgIElmIG5vIGNvdW50cnkgY29kZXMgYXJlIGdpdmVuLCB0aGUgY3VycmVudCBsaXN0LCBpZiBhbnksIGlzCisgICAgICAgICAgcmVtb3ZlZCwgaW4gd2hpY2ggY2FzZSBTRVQgRElBTCBNRVRIT0QgQVVUTyBpcyBlcXVpdmFsZW50IHRvCisgICAgICAgICAgU0VUIERJQUwgTUVUSE9EIERFRkFVTFQuCisKKyAgIFNFVCBESUFMIFBVTFNFLUNPVU5UUklFUyBbIGNjIFsgY2MgWyAuLi4gXSBdIF0KKyAgICAgICAgICBSZXBsYWNlcyB0aGUgY3VycmVudCBQVUxTRS1DT1VOVFJJRVMgbGlzdCB3aXRoIHRoZSBvbmUgZ2l2ZS4KKyAgICAgICAgICBTeW50YXggYW5kIG9wZXJhdGlvbiBpcyBsaWtlIFNFVCBESUFMIFRPTkUtQ09VTlRSSUVTLgorCisgICBJZiB0aGUgc2FtZSBjb3VudHJ5IGNvZGUgYXBwZWFycyBpbiBib3RoIGxpc3RzLCBQdWxzZSB0YWtlcworICAgcHJlY2VkZW5jZS4KKworICAgVGhlIFNFVCBESUFMIFRPTkUtIGFuZCBQVUxTRS1DT1VOVFJJRVMgY29tbWFuZHMgcGVyZm9ybSBubworICAgdmVyaWZpY2F0aW9uIHdoYXRzb2V2ZXIgb24gdGhlIGNjJ3MsIHNpbmNlIGFsbW9zdCBhbnkgc3ludGF4IG1pZ2h0IGJlCisgICBsZWdhbCBpbiBzb21lIHNldHRpbmdzLiBGdXJ0aGVybW9yZSwgdGhlcmUgaXMgbm8gZmFjaWxpdHkgdG8gZWRpdCB0aGUKKyAgIGxpc3RzOyB5b3UgY2FuIG9ubHkgcmVwbGFjZSB0aGUgd2hvbGUgbGlzdC4gSG93ZXZlciwgc2luY2UgdGhlIG9ubHkKKyAgIHB1cnBvc2Ugb2YgdGhlc2UgbGlzdHMgaXMgdG8gZXN0YWJsaXNoIGEgYmFzaXMgZm9yIHBpY2tpbmcgdG9uZSBvcgorICAgcHVsc2UgZGlhbGluZyBhdXRvbWF0aWNhbGx5LCBhbGwgeW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGVmZmVjdCBvZgorICAgdGhlIGxpc3QgaXMgdG8gc2V0IGEgc3BlY2lmaWMgZGlhbGluZyBtZXRob2Qgd2l0aCBTRVQgRElBTCBNRVRIT0QgVE9ORQorICAgb3IgU0VUIERJQUwgTUVUSE9EIFBVTFNFLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMi4xLjE1LiBEaWFsLU1vZGlmaWVyIFZhcmlhYmxlcworCisgICBBcyBvZiBDLUtlcm1pdCA3LjAsIGRpYWwgbW9kaWZpZXJzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGZvbGxvd2luZworICAgdmFyaWFibGVzOgorCisgXHYoZG1fbHApIExvbmcgcGF1c2UKKyBcdihkbV9zcCkgU2hvcnQgcGF1c2UKKyBcdihkbV9wZCkgUHVsc2UgZGlhbAorIFx2KGRtX3RkKSBUb25lIGRpYWwKKyBcdihkbV93YSkgV2FpdCBmb3IgYW5zd2VyCisgXHYoZG1fd2QpIFdhaXQgZm9yIGRpYWx0b25lCisgXHYoZG1fcmMpIFJldHVybiB0byBjb21tYW5kIG1vZGUKKworICAgWW91IGNhbiB1c2UgdGhlc2UgaW4geW91ciBkaWFsIHN0cmluZ3MgaW4gcGxhY2Ugb2YgaGFyZHdpcmVkIG1vZGlmaWVycworICAgbGlrZSAiQCIsICIsIiwgZXRjLCBmb3IgaW5jcmVhc2VkIHBvcnRhYmlsaXR5IG9mIHNjcmlwdHMuIEV4YW1wbGU6CisKKyAgQy1LZXJtaXQ+c2V0IG1vZGVtIHR5cGUgdXNyb2JvdGljcworICBDLUtlcm1pdD5zaG8gdmFyaWFibGVzIGRtCisgICBcdihkbV9scCkgPSAsCisgICBcdihkbV9zcCkgPSAvCisgICBcdihkbV9wZCkgPSBQCisgICBcdihkbV90ZCkgPSBUCisgICBcdihkbV93YSkgPSBACisgICBcdihkbV93ZCkgPSBXCisgICBcdihkbV9yYykgPSA7CisgIEMtS2VybWl0PmV4aXQKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDIuMS4xNi4gR2l2aW5nIE11bHRpcGxlIE51bWJlcnMgdG8gdGhlIERJQUwgQ29tbWFuZAorCisgICBQcmlvciB0byBDLUtlcm1pdCA3LjAsIHRoZSBvbmx5IHdheSB0byBnaXZlIGEgRElBTCBjb21tYW5kIGEgbGlzdCBvZgorICAgcGhvbmUgbnVtYmVycyB0byB0cnkgdW50aWwgb25lIGFuc3dlcnMgd2FzIHRvIGNyZWF0ZSBhIGRpYWxpbmcKKyAgIGRpcmVjdG9yeSB0aGF0IGhhZCBtdWx0aXBsZSBlbnRyaWVzIHVuZGVyIHRoZSBzYW1lIG5hbWUsIGFuZCB0aGVuIHVzZQorICAgdGhhdCBlbnRyeSBuYW1lIGluIHRoZSBESUFMIGNvbW1hbmQuIE5vdyBhIGxpc3Qgb2YgbnVtYmVycyBjYW4gYmUKKyAgIGdpdmVuIHRvIHRoZSBESUFMIGNvbW1hbmQgZGlyZWN0bHkgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAgZGlhbCB7e251bWJlcjF9e251bWJlcjJ9e251bWJlcjN9Li4ufQorCisgICBUaGlzIGlzIHRoZSBzYW1lIGxpc3QgZm9ybWF0IHVzZWQgYnkgU0VORCAvRVhDRVBUOiBhbmQgb3RoZXIgY29tbWFuZHMKKyAgIHRoYXQgYWxsb3cgYSBsaXN0IHdoZXJlIG5vcm1hbGx5IGEgc2luZ2xlIGl0ZW0gaXMgZ2l2ZW4uIFJlc3RyaWN0aW9ucworICAgb24gdGhpcyBmb3JtIG9mIHRoZSBESUFMIGNvbW1hbmQgYXJlOgorCisgICAgICogVGhlIGZpcnN0IHR3byBicmFjZXMgbXVzdCBiZSBhZGphY2VudDsgc3BhY2luZyBpcyBvcHRpb25hbAorICAgICAgIHRoZXJlYWZ0ZXIuCisgICAgICogRWFjaCBudW1iZXIgbXVzdCBiZSBhbiBhY3R1YWwgbnVtYmVyIHRvIGRpYWwsIG5vdCBhIGRpYWxpbmcKKyAgICAgICBkaXJlY3RvcnkgZW50cnkuCisgICAgICogRGlhbGluZyBkaXJlY3RvcnkgZW50cmllcyBtYXkgbm90IGNvbnRhaW4gbnVtYmVyIGxpc3RzIGluIHRoaXMKKyAgICAgICBmb3JtYXQuCisKKyAgIEluIGFsbCBvdGhlciByZXNwZWN0cywgdGhlIG51bWJlcnMgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSBoYWQgYmVlbgorICAgZmV0Y2hlZCBmcm9tIHRoZSBkaWFsaW5nIGRpcmVjdG9yeTsgdGhleSBjYW4gYmUgaW4gbGl0ZXJhbCBvciBwb3J0YWJsZQorICAgZm9ybWF0LCBldGMuIEV4YW1wbGU6CisKKyAgZGlhbCB7ezc2NTQzMjF9IHsrMSAoMjEyKSA1NTUxMjEyfSB7IDEtMjEyLTU1NTY3ODkgfX0KKworICAgVGhlIGxpc3QgY2FuIGJlIGFueSBsZW5ndGggYXQgYWxsLCB3aXRoaW4gcmVhc29uLgorCisgICBUaGlzIGZlYXR1cmUgaXMgZXNwZWNpYWxseSBoYW5keSBmb3IgdXNlIHdpdGggdGhlIEs5NSBEaWFsZXIsIGFsbG93aW5nCisgICBhIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyB0byBiZSBzcGVjaWZpZWQgaW4gdGhlIFRlbGVwaG9uZSBOdW1iZXIgYm94CisgICB3aXRob3V0IGhhdmluZyB0byBzZXQgdXAgb3IgcmVmZXJlbmNlIGEgc2VwYXJhdGUgZGlhbGluZyBkaXJlY3RvcnkuCisKKyAgIFlvdSBjYW4gYWxzbyB1c2UgaXQgdG8gYWRkIGNvbW1vbmx5LWRpYWxlZCBzZXF1ZW5jZXMgYXMgdmFyaWFibGVzIGluCisgICB5b3VyIEMtS2VybWl0IGN1c3RvbWl6YXRpb24gZmlsZSwgZS5nLjoKKworICBkZWZpbmUgd29yayB7ezc2NTQzMjF9ezc2NTQzMjJ9ezc2NTQzMjN9fQorCisgICBhbmQgdGhlbjoKKworICBkaWFsIHtcbSh3b3JrKX0KKworICAgKHRoZSB2YXJpYWJsZSBuYW1lIG11c3QgYmUgZW5jbG9zZWQgaW4gYnJhY2VzKS4KKworICAgT3IgbW9yZSBzaW1wbHk6CisKKyAgZGVmaW5lIHdvcmsgZGlhbCB7ezc2NTQzMjF9ezc2NTQzMjJ9ezc2NTQzMjN9fQorCisgICBhbmQgdGhlbjoKKworICB3b3JrCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMi4yLiBNb2RlbXMKKworICAgIDIuMi4xLiBOZXcgTW9kZW0gVHlwZXMKKworICAgU2luY2UgQy1LZXJtaXQgNi4wOgorCisgIGF0bGFzLW5ld2NvbS0zMzYwMGlmeEMgQXRsYXMvTmV3Y29tIDMzNjAwCisgIGF0dC1rZWVwaW50b3VjaCAgICAgICAgQVQmVCBLZWVwaW5Ub3VjaCBQQ01DSUEgVi4zMmJpcyBDYXJkIE1vZGVtCisgIGF0dC0xOTAwLXN0dS1paWkgICAgICAgQVQmVCBTZWN1cmUgRGF0YSBTVFUtSUlJIE1vZGVsIDE5MDAKKyAgYXR0LTE5MTAtc3R1LWlpaSAgICAgICBBVCZUIFNlY3VyZSBEYXRhIFNUVS1JSUkgTW9kZWwgMTkxMAorICBiZXN0ZGF0YSAgICAgICAgICAgICAgIEJlc3QgRGF0YQorICBjYXJkaW5hbCAgICAgICAgICAgICAgIENhcmRpbmFsIFYuMzQgTVZQMjg4WCBzZXJpZXMuCisgIGNvbXBhcSAgICAgICAgICAgICAgICAgQ29tcGFxIERhdGErRmF4IChlLmcuIGluIFByZXNhcmlvKQorICBmdWppdHN1ICAgICAgICAgICAgICAgIEZ1aml0c3UgRmF4L01vZGVtIEFkYXB0ZXIKKyAgZ2VuZXJpYy1oaWdoLXNwZWVkICAgICBBbnkgbW9kZXJuIGVycm9yLWNvcnJlY3RpbmcgZGF0YS1jb21wcmVzc2luZyBtb2RlbQorICBpdHUtdC12MjV0ZXIvdjI1MCAgICAgIElUVS1UIChDQ0lUVCkgVi4yNXRlciAoVi4yNTApIHN0YW5kYXJkIGNvbW1hbmQgc2V0CisgIG1lZ2FoZXJ0ei1hdHQtdjM0ICAgICAgTWVnYWhlcnR6IEFUJlQgVi4zNAorICBtZWdhaGVydHoteGphY2sgICAgICAgIE1lZ2FoZXJ0eiBYLUphY2sKKyAgbW90b3JvbGEtY29kZXggICAgICAgICBNb3Rvcm9sYSBDb2RleCAzMjZYIFNlcmllcworICBtb3Rvcm9sYS1tb250YW5hICAgICAgIE1vdG9yb2xhIE1vbnRhbmEKKyAgbXQ1NjM0enB4ICAgICAgICAgICAgICBNdWx0aXRlY2ggTVQ1NjM0WlBYCisgIHJvY2t3ZWxsLXY5MCAgICAgICAgICAgUm9ja3dlbGwgVi45MCA1NksKKyAgcm9sbS0yNDRwYyAgICAgICAgICAgICBTaWVtZW5zL1JvbG0gMjQ0UEMgKEFUIGNvbW1hbmQgc2V0KQorICByb2xtLTYwMC1zZXJpZXMgICAgICAgIFNpZW1lbnMvUm9sbSA2MDAgU2VyaWVzIChBVCBjb21tYW5kIHNldCkKKyAgc3Bpcml0LWlpICAgICAgICAgICAgICBRdWlja0NvbW0gU3Bpcml0IElJCisgIHN1cHJhc29uaWMgICAgICAgICAgICAgU3VwcmFTb25pYyBWMjg4KworICBzdXByYS1leHByZXNzLXY5MCAgICAgIFN1cHJhIEV4cHJlc3MgVi45MAorCisgICBPbmUgb2YgdGhlIG5ldyB0eXBlcywgImdlbmVyaWMtaGlnaC1zcGVlZCIgbmVlZHMgYSBiaXQgb2YgZXhwbGFuYXRpb24uCisgICBUaGlzIHR5cGUgd2FzIGFkZGVkIHRvIGVhc2lseSBoYW5kbGUgb3RoZXIgdHlwZXMgdGhhdCBhcmUgbm90CisgICBleHBsaWNpdGx5IGNvdmVyZWQsIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgYm90aGVyIG9mIGFkZGluZyBhCisgICBjb21wbGV0ZSB1c2VyLWRlZmluZWQgbW9kZW0gdHlwZS4gVGhpcyBvbmUgd29ya3MgZm9yIG1vZGVybiBtb2RlbXMKKyAgIHRoYXQgdXNlIHRoZSBBVCBjb21tYW5kIHNldCwgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgdGhlIGRlZmF1bHQKKyAgICgiZmFjdG9yeSIpIHNldHRpbmdzIG9mIHRoZSBtb2RlbSAoYSkgYXJlIGFwcHJvcHJpYXRlIGZvciBLZXJtaXQsIChiKQorICAgaW5jbHVkZSBlcnJvciBjb3JyZWN0aW9uLCBkYXRhIGNvbXByZXNzaW9uLCBhbmQgc3BlZWQgYnVmZmVyaW5nOyBhbmQKKyAgIChjKSBhcmUgcmVjYWxsYWJsZSB3aXRoIHRoZSBjb21tYW5kIEFUJkYuCisKKyAgIElmIHRoZSBjb21tYW5kIHRvIHJlY2FsbCB5b3VyIG1vZGVtJ3MgcHJvZmlsZSBpcyBub3QgQVQmRiwgdXNlIHRoZSBTRVQKKyAgIE1PREVNIENPTU1BTkQgSU5JVC1TVFJJTkcgY29tbWFuZCB0byBzcGVjaWZ5IHRoZSBhcHByb3ByaWF0ZSBtb2RlbQorICAgY29tbWFuZC4gVGhlIGRlZmF1bHQgaW5pdC1zdHJpbmcgaXMgQVQmRlwxMyAodGhhdCBpcywgQVQsIGFtcGVyc2FuZCwKKyAgIEYsIGFuZCB0aGVuIGNhcnJpYWdlIHJldHVybik7IGEgc3VydmV5IG9mIGFib3V0IDIwIG1vZGVybiBtb2RlbSB0eXBlcworICAgc2hvd3MgdGhleSBhbGwgc3VwcG9ydCB0aGlzLCBidXQgdGhleSBtaWdodCBtZWFuIGRpZmZlcmVudCB0aGluZ3MgYnkKKyAgIGl0LiBGb3IgZXhhbXBsZSwgdGhlIFVTUiBTcG9ydHN0ZXIgb3IgQ291cmllciBuZWVkcyBBVCZGMSAobm90IEFUJkYsCisgICB3aGljaCBpcyBlcXVpdmFsZW50IHRvIEFUJkYwLCB3aGljaCByZWNhbGxzIGFuIGluYXBwcm9wcmlhdGUgcHJvZmlsZSksCisgICBzbyBmb3IgVVNSIG1vZGVtczoKKworICBzZXQgbW9kZW0gdHlwZSBnZW5lcmljLWhpZ2gtc3BlZWQKKyAgc2V0IG1vZGVtIGNvbW1hbmQgaW5pdCBBVCZGMVwxMworCisgICBPZiBjb3Vyc2UsIFVTUiBtb2RlbXMgYWxyZWFkeSBoYXZlIHRoZWlyIG93biBidWlsdC1pbiBtb2RlbSB0eXBlLiBCdXQKKyAgIGlmIHlvdSB1c2UgdGhpcyBvbmUgaW5zdGVhZCwgaXQgd2lsbCBkaWFsIGZhc3RlciBiZWNhdXNlIGl0IGhhcyBmZXdlcgorICAgY29tbWFuZHMgdG8gZ2l2ZSB0byB0aGUgbW9kZW07IGluIHRoYXQgc2Vuc2UgIiZGMSIgaXMgbGlrZSBhIG1hY3JvCisgICB0aGF0IGJ1bmRsZXMgbnVtZXJvdXMgY29tbWFuZHMgaW50byBhIHNpbmdsZSBvbmUuIFNlZSB5b3VyIG1vZGVtCisgICBtYW51YWwgZm9yIGRldGFpbHMgYWJvdXQgZmFjdG9yeSBwcm9maWxlcyBhbmQgY29tbWFuZHMgdG8gcmVjYWxsIHRoZW0uCisKKyAgIFdBUk5JTkc6IERvIG5vdCB1c2UgdGhlIGdlbmVyaWMtaGlnaC1zcGVlZCBtb2RlbSB0eXBlIGluIG9wZXJhdGluZworICAgc3lzdGVtcyBsaWtlIFZNUyB3aGVyZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaXMgbm90IGF2YWlsYWJsZSwgYXQKKyAgIGxlYXN0IG5vdCB1bmxlc3MgeW91IGNoYW5nZSB0aGUgaW5pdCBzdHJpbmcgZnJvbSBBVCZGXDEzIHRvIHNvbWV0aGluZworICAgZWxzZSB0aGF0IGVuYWJsZXMgbG9jYWwgWG9uL1hvZmYgb3Igb3RoZXIgYXBwcm9wcmlhdGUgdHlwZSBvZiBmbG93CisgICBjb250cm9sLgorCisgICBBbHNvIHNlZSBbMzk2XVNlY3Rpb24gMi4xLjcgZm9yIGFkZGl0aW9uYWwgaGludHMgYWJvdXQgbWFraW5nIGRpYWxpbmcKKyAgIGdvIGZhc3Rlci4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDIuMi4yLiBOZXcgTW9kZW0gQ29udHJvbHMKKworICAgU0VUIE1PREVNIENBUEFCSUxJVElFUyBsaXN0CisgICAgICAgICAgSW4gQy1LZXJtaXQgNy4wLCB0aGlzIGNvbW1hbmQgYXV0b21hdGljYWxseSB0dXJucyBNT0RFTQorICAgICAgICAgIFNQRUVELU1BVENISU5HIE9GRiBpZiBTQiAoU3BlZWQgQnVmZmVyaW5nKSBpcyBpbiB0aGUgbGlzdCwgYW5kCisgICAgICAgICAgdHVybnMgaXQgT04gaWYgU0IgaXMgYWJzZW50LgorCisgICBTRVQgTU9ERU0gQ09NTUFORCBQUkVESUFMLUlOSVQgWyB0ZXh0IF0KKyAgICAgICAgICBDb21tYW5kcyB0byBiZSBzZW50IHRvIHRoZSBtb2RlbSBqdXN0IHByaW9yIHRvIGRpYWxpbmcuCisgICAgICAgICAgTm9ybWFsbHkgbm9uZS4KKworICAgU0VUIE1PREVNIFNQRUFLRVIgeyBPTiwgT0ZGIH0KKyAgICAgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgbW9kZW0gc3BlYWtlciBpcyBvbiBvciBvZmYgd2hpbGUgY2FsbCBpcworICAgICAgICAgIGJlaW5nIHBsYWNlZC4gT04gYnkgZGVmYXVsdC4gTm90ZTogVGhpcyBjb21tYW5kIGRvZXMgbm90CisgICAgICAgICAgcHJvdmlkZSBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHdoZW4gdGhlIHNwZWFrZXIgaXMgb24gb3IKKyAgICAgICAgICBvZmYuIE5vcm1hbGx5LCBPTiBtZWFucyB3aGlsZSB0aGUgY2FsbCBpcyBiZWluZyBwbGFjZWQsIHVudGlsCisgICAgICAgICAgdGhlIHBvaW50IGF0IHdoaWNoIGNhcnJpZXIgaXMgc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLiBJZiB5b3VyCisgICAgICAgICAgbW9kZW0gaGFzIGEgZGlmZmVyZW50IHNwZWFrZXIgb3B0aW9uIHRoYXQgeW91IHdhbnQgdG8gY2hvb3NlLAorICAgICAgICAgIHRoZW4gdXNlIHRoZSBTRVQgTU9ERU0gQ09NTUFORCBTUEVBS0VSIE9OIHRleHQgY29tbWFuZCB0bworICAgICAgICAgIHNwZWNpZnkgdGhpcyBvcHRpb24uCisKKyAgIFNFVCBNT0RFTSBDT01NQU5EIFNQRUFLRVIgeyBPTiwgT0ZGIH0gWyB0ZXh0IF0KKyAgICAgICAgICBTcGVjaWZ5IG9yIG92ZXJyaWRlIHRoZSBjb21tYW5kcyB0byB0dXJuIHlvdXIgbW9kZW0ncyBzcGVha2VyCisgICAgICAgICAgb24gYW5kIG9mZi4KKworICAgU0VUIE1PREVNIFZPTFVNRSB7IExPVywgTUVESVVNLCBISUdIIH0KKyAgICAgICAgICBXaGVuIE1PREVNIFNQRUFLRVIgaXMgb24sIHNlbGVjdCB2b2x1bWUuIE5vdGU6IEluIHNvbWUgbW9kZW1zLAorICAgICAgICAgIGVzcGVjaWFsbHkgaW50ZXJuYWwgb25lcywgdGhlc2UgY29tbWFuZHMgaGF2ZSBubyBlZmZlY3Q7IHRoaXMKKyAgICAgICAgICBpcyBhIGxpbWl0YXRpb24gb2YgdGhlIHBhcnRpY3VsYXIgbW9kZW0sIG5vdCBvZiBLZXJtaXQuCisKKyAgIFNFVCBNT0RFTSBDT01NQU5EIFZPTFVNRSB7IExPVywgTUVESVVNLCBISUdIIH0gWyB0ZXh0IF0KKyAgICAgICAgICBTcGVjaWZ5IG9yIG92ZXJyaWRlIHRoZSBjb21tYW5kcyB0byBzZXQgeW91ciBtb2RlbSdzIHNwZWFrZXIKKyAgICAgICAgICB2b2x1bWUuCisKKyAgIFNFVCBNT0RFTSBDT01NQU5EIElHTk9SRS1ESUFMVE9ORSBbIHRleHQgXQorICAgICAgICAgIFRoZSBjb21tYW5kIHRvIGVuYWJsZSBibGluZCBkaWFsaW5nIChbMzk3XVNlY3Rpb24gMi4xLjYpLgorCisgICBTRVQgTU9ERU0gRVNDQVBFLUNIQVJBQ1RFUiBjb2RlCisgICAgICAgICAgSGFzIGJlZW4gYXVnbWVudGVkIHRvIGFsbG93IGNvZGVzIG9mIDAgb3IgbGVzczogPCAwIG1lYW5zIHRoZQorICAgICAgICAgIGVzY2FwZSBtZWNoYW5pc20gaXMgZGlzYWJsZWQuID0gMCBtZWFucyB0byB1c2UgKHJlc3RvcmUpIHRoZQorICAgICAgICAgIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgbW9kZW0gZGF0YWJhc2UuID4gMCBhbmQgPCAxMjggaXMgYQorICAgICAgICAgIGxpdGVyYWwgdmFsdWUgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZS4gPiAxMjcKKyAgICAgICAgICBtZWFucyB0aGUgZXNjYXBlIG1lY2hhbmlzbSBpcyBkaXNhYmxlZC4gVGhpcyBhZmZlY3RzICJtb2RlbQorICAgICAgICAgIGhhbmd1cCIuIFdoZW4gdGhlIGVzY2FwZSBtZWNoYW5pc20gaXMgZGlzYWJsZWQsIGJ1dCBTRVQgTU9ERU0KKyAgICAgICAgICBIQU5HVVAtTUVUSE9EIGlzIE1PREVNLUNPTU1BTkQsIGl0IHNlbmRzIHRoZSBoYW5ndXAgY29tbWFuZAorICAgICAgICAgIGltbWVkaWF0ZWx5LCB3aXRob3V0IHRoZSA8cGF1c2U+KysrPHBhdXNlPiBidXNpbmVzcyBmaXJzdC4gVGhpcworICAgICAgICAgIGlzIHVzZWZ1bCAoZm9yIGV4YW1wbGUpIHdoZW4gc2VuZGluZyBsb3RzIG9mIG51bWVyaWMgcGFnZXMsIGEKKyAgICAgICAgICBwcm9jZXNzIGluIHdoaWNoIG5ldmVyIHdlIGdvIG9ubGluZSwgYW5kIHNvIG5ldmVyIG5lZWQgdG8KKyAgICAgICAgICBlc2NhcGUgYmFjay4gRWxpbWluYXRpbmcgdGhlIHVubmVjZXNzYXJ5IHBhdXNlcyBhbmQgZXNjYXBlCisgICAgICAgICAgc2VxdWVuY2UgYWxsb3dzIGEgbG90IG1vcmUgcGFnZXMgdG8gYmUgc2VudCBwZXIgdW5pdCB0aW1lLgorCisgICBSZWNhbGwgdGhhdCBDLUtlcm1pdCBjYW4gZGlhbCBtb2RlbXMgdG8gd2hpY2ggaXQgaXMgY29ubmVjdGVkIHZpYQorICAgVENQL0lQIChUZWxuZXQgb3IgUmxvZ2luKSBhcyBkZXNjcmliZWQgb24gcGFnZSAxMjYgb2YgWzM5OF1Vc2luZworICAgQy1LZXJtaXQsIDJuZCBFZC4gSW4gdGhpcyBjYXNlIHRoZSBNT0RFTSBIQU5HVVAtTUVUSE9EIHNob3VsZCBiZQorICAgTU9ERU0tQ09NTUFORCwgc2luY2UgUlMtMjMyIHNpZ25hbHMgZG9uJ3Qgd29yayBvdmVyIFRDUC9JUAorICAgY29ubmVjdGlvbnMuIEFzIG5vdGVkIGluIHRoZSBtYW51YWwsIHN1Y2ggY29ubmVjdGlvbnMgYXJlIHNldCB1cCBieQorICAgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToKKworICBzZXQgaG9zdCBob3N0IFsgcG9ydCBdCisgIHNldCBtb2RlbSB0eXBlIG5hbWUKKyAgZGlhbCBudW1iZXIKKworICAgQnV0IHRoaXMgY2FuIGNhdXNlIGNvbXBsaWNhdGlvbnMgd2hlbiB5b3UgdXNlIEtlcm1pdCB0byBzd2l0Y2ggYmV0d2VlbgorICAgc2VyaWFsIGFuZCBUQ1AvSVAgY29ubmVjdGlvbnMuIEluIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6CisKKyAgc2V0IGhvc3QgbmFtZQorICBzZXQgbW9kZW0gdHlwZSBuYW1lCisgIHNldCBwb3J0IG5hbWUKKworICAgdGhlIGZpcnN0IHR3byBjb21tYW5kcyBvYmV5IHRoZSBydWxlcyBmb3IgZGlhbGluZyBvdXQgb3ZlciBUZWxuZXQuCisgICBIb3dldmVyLCB0aGUgU0VUIFBPUlQgY29tbWFuZCByZXF1aXJlcyB0aGF0IEtlcm1pdCBjbG9zZSBpdHMgY3VycmVudAorICAgKFRlbG5ldCkgY29ubmVjdGlvbiBiZWZvcmUgaXQgY2FuIG9wZW4gdGhlIHNlcmlhbCBwb3J0IChzaW5jZSBLZXJtaXQKKyAgIGNhbiBvbmx5IGhhdmUgb25lIGNvbm5lY3Rpb24gb3BlbiBhdCBhIHRpbWUpLiBCdXQgc2luY2UgYSBtb2RlbSB0eXBlCisgICB3YXMgc2V0IGFmdGVyIHRoZSAic2V0IGhvc3QiIGNvbW1hbmQgd2FzIGdpdmVuLCBLZXJtaXQgYXNzdW1lcyBpdCBpcyBhCisgICBUZWxuZXQgZGlhbG91dCBjb25uZWN0aW9uIGFuZCBzbyBzZW5kcyB0aGUgbW9kZW0ncyBoYW5ndXAgc2VxdWVuY2UgaXMKKyAgIHNlbnQgdG8gdGhlIFRlbG5ldCBob3N0LiBUbyBhdm9pZCB0aGlzLCBjbG9zZSB0aGUgbmV0d29yayBjb25uZWN0aW9uCisgICBleHBsaWNpdGx5IGJlZm9yZSBvcGVuaW5nIHRoZSBzZXJpYWwgb25lOgorCisgIHNldCBob3N0IG5hbWUKKyAgY2xvc2UKKyAgc2V0IG1vZGVtIHR5cGUgbmFtZQorICBzZXQgcG9ydCBuYW1lCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMi4zLiBURUxORVQgYW5kIFJMT0dJTgorCisgICBGb3IgYWRkaXRpb25hbCBiYWNrZ3JvdW5kLCBwbGVhc2UgYWxzbyByZWFkIHRoZSBbMzk5XVRFTE5FVC5UWFQgZmlsZSwKKyAgIGFsc28gYXZhaWxhYmxlIG9uIHRoZSBXZWIgaW4gWzQwMF1IVE1MIGZvcm1hdC4KKworICAgQ2F1dGlvbnM6CisKKyAgICAgKiBJZiBtYWtpbmcgYSBUZWxuZXQgY29ubmVjdGlvbiB3aXRoIEMtS2VybWl0IHRha2VzIGEgdmVyeSBsb25nCisgICAgICAgdGltZSwgbGlrZSBvdmVyIGEgbWludXRlLCB3aGVyZWFzIHRoZSBzeXN0ZW0gVGVsbmV0IHByb2dyYW0gbWFrZXMKKyAgICAgICB0aGUgc2FtZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5LCB0cnkgaW5jbHVkaW5nIHRoZSAvTk9XQUlUIHN3aXRjaDoKKyAgQy1LZXJtaXQ+IHRlbG5ldCAvbm93YWl0IGhvc3RuYW1lCisgICAgICAgU2VlIFs0MDFdVEVMTkVULlRYVCBvciBbNDAyXVRFTE5FVC5IVE0gZm9yIGRldGFpbHMuIElmIGl0IGFsc28KKyAgICAgICB0YWtlcyBhIHZlcnkgbG9uZyB0aW1lIHRvIG1ha2UgYSBUZWxuZXQgY29ubmVjdGlvbiB3aXRoIHN5c3RlbQorICAgICAgIFRlbG5ldCwgdGhlbiB0aGUgZGVsYXkgaXMgbW9zdCBsaWtlbHkgY2F1c2VkIGJ5IHJldmVyc2UgRE5TCisgICAgICAgbG9va3VwcyB3aGVuIHlvdXIgaG9zdCBpcyBub3QgcHJvcGVybHkgcmVnaXN0ZXJlZCBpbiBETlMuCisgICAgICogV2hlbiBzdXBwbHlpbmcgbnVtZXJpYyBJUCBhZGRyZXNzZXMgdG8gQy1LZXJtaXQgb3IgdG8gYW55IG90aGVyCisgICAgICAgYXBwbGljYXRpb24gKHJlZ3VsYXIgVGVsbmV0LCBSbG9naW4sIGV0YyksIGRvIG5vdCBpbmNsdWRlIGxlYWRpbmcKKyAgICAgICAwJ3MgaW4gYW55IGZpZWxkcyB1bmxlc3MgeW91IGludGVuZCBmb3IgdGhvc2UgZmllbGRzIHRvIGJlCisgICAgICAgaW50ZXJwcmV0ZWQgYXMgb2N0YWwgKG9yIGhleCkgbnVtYmVycy4gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZQorICAgICAgIEludGVybmV0IGFkZHJlc3MgaW50ZXJwcmV0ZXIgKHRoZSBzb2NrZXRzIGxpYnJhcnkgaW5ldF9hZGRyKCkKKyAgICAgICByb3V0aW5lKSBpbmNsdWRlcyB0aGVzZSB3b3JkczoKKworICAgICBBbGwgbnVtYmVycyBzdXBwbGllZCBhcyAicGFydHMiIGluIGEgIi4iIG5vdGF0aW9uIG1heSBiZSBkZWNpbWFsLAorICAgICBvY3RhbCwgb3IgaGV4YWRlY2ltYWwsIGFzIHNwZWNpZmllZCBpbiB0aGUgQyBsYW5ndWFnZSAodGhhdCBpcywgYQorICAgICBsZWFkaW5nIDB4IG9yIDBYIGltcGxpZXMgaGV4YWRlY2ltYWw7IG90aGVyd2lzZSwgYSBsZWFkaW5nIDAKKyAgICAgaW1wbGllcyBvY3RhbDsgb3RoZXJ3aXNlLCB0aGUgbnVtYmVyIGlzIGludGVycHJldGVkIGFzIGRlY2ltYWwpLgorICAgICAgIFRvIGlsbHVzdHJhdGUsIDEyOC41OS4zOS4yIGFuZCAxMjguMDU5LjAzOS4wMDIgYXJlIG5vdCB0aGUgc2FtZQorICAgICAgIGhvc3QhIEV2ZW4gdGhvdWdoIG1vc3Qgb2YgdGhlIGZpZWxkcyBjb250YWluIG5vbi1vY3RhbCBkaWdpdHMuCisgICAgICAgVXNpbmcgc3lzdGVtIFRlbG5ldCAobm90IEtlcm1pdCk6CisgICQgdGVsbmV0IDEyOC4wNTkuMDM5LjAwMgorICBUcnlpbmcgMTI4LjQ5LjMzLjIgLi4uCisgICAgICAgT2YgY291cnNlIHRoZSBzYW1lIHRoaW5nIGhhcHBlbnMgd2l0aCBLZXJtaXQgYmVjYXVzZSBpdCB1c2VzIChhcworICAgICAgIGl0IG11c3QpIHRoZSBzYW1lIHN5c3RlbSBzZXJ2aWNlIGZvciByZXNvbHZpbmcgbmV0d29yayBhZGRyZXNzZXMKKyAgICAgICB0aGF0IFRlbG5ldCwgRlRQLCBhbmQgYWxsIG90aGVyIFRDUC9JUCBhcHBsaWNhdGlvbnMgdXNlLgorICAgICAqIFRoZSBSTE9HSU4gc2VjdGlvbiBvbiBwYWdlIDEyMyBkb2VzIG5vdCBtYWtlIGl0IGNsZWFyIHRoYXQgeW91IGNhbgorICAgICAgIHVzZSB0aGUgU0VUIFRFTE5FVCBURVJNSU5BTC1UWVBFIGNvbW1hbmQgdG8gZ292ZXJuIHRoZSB0ZXJtaW5hbAorICAgICAgIHR5cGUgdGhhdCBpcyByZXBvcnRlZCBieSBDLUtlcm1pdCB0byB0aGUgUkxPR0lOIHNlcnZlci4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIFNFVCBUQ1AgY29tbWFuZHMgZGVzY3JpYmVkIG9uIHBhZ2VzIDEyMi0xMjMgbWlnaHQgYmUKKyAgICAgICBhYnNlbnQ7IHNvbWUgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBUQ1AvSVAgZG8gbm90IHN1cHBvcnQgdGhlc2UKKyAgICAgICBwYXJ0aWN1bGFyIGNvbnRyb2xzLgorCisgICBOZXcgY29tbWFuZHM6CisKKyAgIFRFTE9QVCB7IEFPLCBBWVQsIEJSRUFLLCBDQU5DRUwsIEVDLCBFTCwgRU9GLCBFT1IsIEdBLCBJUCwgRE1BUkssCisgICAgICAgICAgRE8sIERPTlQsIE5PUCwgU0IsIFNFLCBTVVNQLCBXSUxMLCBXT05UIH0KKyAgICAgICAgICBUaGlzIGNvbW1hbmQgd2FzIGF2YWlsYWJsZSBwcmV2aW91c2x5LCBidXQgc3VwcG9ydGVkIG9ubHkgRE8sCisgICAgICAgICAgRE9OVCwgV0lMTCwgYW5kIFdPTlQuIE5vdyBpdCBsZXRzIHlvdSBzZW5kIGFsbCB0aGUgVGVsbmV0CisgICAgICAgICAgcHJvdG9jb2wgY29tbWFuZHMuIE5vdGUgdGhhdCBjZXJ0YWluIGNvbW1hbmRzIGRvIG5vdCByZXF1aXJlIGEKKyAgICAgICAgICByZXNwb25zZSwgYW5kIHRoZXJlZm9yZSBjYW4gYmUgdXNlZCBhcyBub25kZXN0cnVjdGl2ZSAicHJvYmVzIgorICAgICAgICAgIHRvIHNlZSBpZiB0aGUgVGVsbmV0IHNlc3Npb24gaXMgc3RpbGwgb3BlbjsgZS5nLjoKKworICBzZXQgaG9zdCB4eXpjb3JwLmNvbQorICAuLi4KKyAgdGVsb3B0IG5vcAorICBpZiBmYWlsIHN0b3AgMSBDb25uZWN0aW9uIGxvc3QKKworICAgU0VUIFRDUCBBRERSRVNTIFsgaXAtYWRkcmVzcyBdCisgICAgICAgICAgU3BlY2lmaWVzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBjb21wdXRlciB0aGF0IEMtS2VybWl0IGlzCisgICAgICAgICAgcnVubmluZyBvbi4gTm9ybWFsbHkgdGhpcyBpcyBub3QgbmVjZXNzYXJ5LiBUaGUgZXhjZXB0aW9uIHdvdWxkCisgICAgICAgICAgYmUgaWYgeW91ciBtYWNoaW5lIGhhcyBtdWx0aXBsZSBuZXR3b3JrIGFkYXB0ZXJzIChwaHlzaWNhbCBvcgorICAgICAgICAgIHZpcnR1YWwpIHdpdGggYSBkaWZmZXJlbnQgYWRkcmVzcyBmb3IgZWFjaCBhZGFwdGVyIEFORCB5b3Ugd2FudAorICAgICAgICAgIEMtS2VybWl0IHRvIHVzZSBhIHNwZWNpZmljIGFkZHJlc3Mgd2hlbiBtYWtpbmcgb3V0Z29pbmcKKyAgICAgICAgICBjb25uZWN0aW9ucyBvciBhY2NlcHRpbmcgaW5jb21pbmcgY29ubmVjdGlvbnMuCisKKyAgIFNFVCBUQ1AgRE5TLVNFUlZJQ0UtUkVDT1JEUyB7IE9OLCBPRkYgfQorICAgICAgICAgIFRlbGxzIEMtS2VybWl0IHdoZXRoZXIgdG8gdHJ5IHRvIHVzZSBETlMgU1JWIHJlY29yZHMgdG8KKyAgICAgICAgICBkZXRlcm1pbmUgdGhlIGhvc3QgYW5kIHBvcnQgbnVtYmVyIHVwb24gd2hpY2ggdG8gZmluZCBhbgorICAgICAgICAgIGFkdmVydGlzZWQgc2VydmljZS4gRm9yIGV4YW1wbGUsIGlmIGEgaG9zdCB3YW50cyByZWd1bGFyIFRlbG5ldAorICAgICAgICAgIGNvbm5lY3Rpb25zIHJlZGlyZWN0ZWQgdG8gc29tZSBwb3J0IG90aGVyIHRoYW4gMjMsIHRoaXMgZmVhdHVyZQorICAgICAgICAgIGFsbG93cyBDLUtlcm1pdCB0byBhc2sgdGhlIGhvc3Qgd2hpY2ggcG9ydCBpdCBzaG91bGQgdXNlLiBTaW5jZQorICAgICAgICAgIG5vdCBhbGwgZG9tYWluIHNlcnZlcnMgYXJlIHNldCB1cCB0byBhbnN3ZXIgc3VjaCByZXF1ZXN0cywgdGhpcworICAgICAgICAgIGZlYXR1cmUgaXMgT0ZGIGJ5IGRlZmF1bHQuCisKKyAgIFNFVCBUQ1AgUkVWRVJTRS1ETlMtTE9PS1VQIHsgT04sIE9GRiwgQVVUTyB9CisgICAgICAgICAgVGVsbHMgS2VybWl0IHdoZXRoZXIgdG8gcGVyZm9ybSBhIHJldmVyc2UgRE5TIGxvb2t1cCBvbiBUQ1AvSVAKKyAgICAgICAgICBjb25uZWN0aW9ucy4gVGhpcyBhbGxvd3MgS2VybWl0IHRvIGRldGVybWluZSB0aGUgYWN0dWFsCisgICAgICAgICAgaG9zdG5hbWUgb2YgdGhlIGhvc3QgaXQgaXMgY29ubmVjdGVkIHRvLCB3aGljaCBpcyB1c2VmdWwgZm9yCisgICAgICAgICAgY29ubmVjdGlvbnMgdG8gaG9zdCBwb29scywgYW5kIGlzIHJlcXVpcmVkIGZvciBLZXJiZXJvcworICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGhvc3QgcG9vbHMgYW5kIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4gSWYgdGhlCisgICAgICAgICAgb3RoZXIgaG9zdCBkb2VzIG5vdCBoYXZlIGEgRE5TIGVudHJ5LCB0aGUgcmV2ZXJzZSBsb29rdXAgY291bGQKKyAgICAgICAgICB0YWtlIGEgbG9uZyB0aW1lIChtaW51dGVzKSB0byBmYWlsLCBidXQgdGhlIGNvbm5lY3Rpb24gd2lsbAorICAgICAgICAgIHN0aWxsIGJlIG1hZGUuIFR1cm4gdGhpcyBvcHRpb24gT0ZGIGZvciBzcGVlZGllciBjb25uZWN0aW9ucyBpZgorICAgICAgICAgIHlvdSBkbyBub3QgbmVlZCB0byBrbm93IGV4YWN0bHkgd2hpY2ggaG9zdCB5b3UgYXJlIGNvbm5lY3RlZCB0bworICAgICAgICAgIGFuZCB5b3UgYXJlIG5vdCB1c2luZyBLZXJiZXJvcy4gQVVUTywgdGhlIGRlZmF1bHQsIG1lYW5zIHRoZQorICAgICAgICAgIGxvb2t1cCBpcyBkb25lIG9uIGhvc3RuYW1lcywgYnV0IG5vdCBvbiBudW1lcmljIElQIGFkZHJlc3Nlcy4KKworICAgU0VUIFRFTE5FVCBXQUlULUZPUi1ORUdPVElBVElPTlMgeyBPTiwgT0ZGIH0KKyAgICAgICAgICBFYWNoIFRlbG5ldCBvcHRpb24gbXVzdCBiZSBmdWxseSBuZWdvdGlhdGVkIGVpdGhlciBPbiBvciBPZmYKKyAgICAgICAgICBiZWZvcmUgdGhlIHNlc3Npb24gY2FuIGNvbnRpbnVlLiBUaGlzIGlzIGVzcGVjaWFsbHkgdHJ1ZSB3aXRoCisgICAgICAgICAgb3B0aW9ucyB0aGF0IHJlcXVpcmUgc3ViLW5lZ290aWF0aW9ucyBzdWNoIGFzIEF1dGhlbnRpY2F0aW9uLAorICAgICAgICAgIEVuY3J5cHRpb24sIGFuZCBLZXJtaXQ7IGZvciBwcm9wZXIgc3VwcG9ydCBvZiB0aGVzZSBvcHRpb25zCisgICAgICAgICAgS2VybWl0IG11c3Qgd2FpdCBmb3IgdGhlIG5lZ290aWF0aW9ucyB0byBjb21wbGV0ZS4gT2YgY291cnNlLAorICAgICAgICAgIEtlcm1pdCBoYXMgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciBhIHJlcGx5IGlzIGRlbGF5ZWQgb3Igbm90CisgICAgICAgICAgY29taW5nIGF0IGFsbCwgYW5kIHNvIHdpbGwgd2FpdCBhIG1pbnV0ZSBvciBtb3JlIGZvciByZXF1aXJlZAorICAgICAgICAgIHJlcGxpZXMgYmVmb3JlIGNvbnRpbnVpbmcgdGhlIHNlc3Npb24uIElmIHlvdSBrbm93IHRoYXQKKyAgICAgICAgICBLZXJtaXQncyBUZWxuZXQgcGFydG5lciB3aWxsIG5vdCBiZSBzZW5kaW5nIHRoZSByZXF1aXJlZAorICAgICAgICAgIHJlcGxpZXMsIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIG9mIE9GRiB0byBhdm9pZCB0aGUgbG9uZworICAgICAgICAgIHRpbWVvdXRzLiBPciB5b3UgY2FuIGluc3RydWN0IEtlcm1pdCB0byBSRUZVU0Ugc3BlY2lmaWMgb3B0aW9ucworICAgICAgICAgIHdpdGggdGhlIFNFVCBURUxPUFQgY29tbWFuZC4KKworICAgU0VUIFRFTE9QVCBbIHsgL0NMSUVOVCwgL1NFUlZFUiB9IF0gb3B0aW9uCisgICAgICAgICAgeyBBQ0NFUFRFRCwgUkVGVVNFRCwgUkVRVUVTVEVELCBSRVFVSVJFRCB9CisgICAgICAgICAgWyB7IEFDQ0VQVEVELCBSRUZVU0VELCBSRVFVRVNURUQsIFJFUVVJUkVEIH0gXQorICAgICAgICAgIFNFVCBURUxPUFQgbGV0cyB5b3Ugc3BlY2lmeSBwb2xpY3kgcmVxdWlyZW1lbnRzIGZvciBLZXJtaXQncworICAgICAgICAgIGhhbmRsaW5nIG9mIFRlbG5ldCBvcHRpb24gbmVnb3RpYXRpb25zLiBTZXR0aW5nIGFuIG9wdGlvbiBpcworICAgICAgICAgIFJFUVVJUkVEIGNhdXNlcyBLZXJtaXQgdG8gb2ZmZXIgdGhlIG9wdGlvbiB0byB0aGUgcGVlciBhbmQKKyAgICAgICAgICBkaXNjb25uZWN0IGlmIHRoZSBvcHRpb24gaXMgcmVmdXNlZC4gUkVRVUVTVEVEIGNhdXNlcyBLZXJtaXQgdG8KKyAgICAgICAgICBvZmZlciBhbiBvcHRpb24gdG8gdGhlIHBlZXIuIEFDQ0VQVEVEIHJlc3VsdHMgaW4gbm8gb2ZmZXIgYnV0CisgICAgICAgICAgS2VybWl0IHdpbGwgYXR0ZW1wdCB0byBuZWdvdGlhdGUgdGhlIG9wdGlvbiBpZiBpdCBpcyByZXF1ZXN0ZWQuCisgICAgICAgICAgUkVGVVNFRCBpbnN0cnVjdHMgS2VybWl0IHRvIHJlZnVzZSB0aGUgb3B0aW9uIGlmIGl0IGlzCisgICAgICAgICAgcmVxdWVzdGVkIGJ5IHRoZSBwZWVyLgorCisgICAgICAgICAgU29tZSBvcHRpb25zIGFyZSBuZWdvdGlhdGVkIGluIHR3byBkaXJlY3Rpb25zIGFuZCBhY2NlcHQKKyAgICAgICAgICBzZXBhcmF0ZSBwb2xpY2llcyBmb3IgZWFjaCBkaXJlY3Rpb247IHRoZSBmaXJzdCBrZXl3b3JkIGFwcGxpZXMKKyAgICAgICAgICB0byBLZXJtaXQgaXRzZWxmLCB0aGUgc2Vjb25kIGFwcGxpZXMgdG8gS2VybWl0J3MgVGVsbmV0CisgICAgICAgICAgcGFydG5lcjsgaWYgdGhlIHNlY29uZCBrZXl3b3JkIGlzIG9taXR0ZWQsIGFuIGFwcHJvcHJpYXRlCisgICAgICAgICAgKG9wdGlvbi1zcGVjaWZpYykgZGVmYXVsdCBpcyBhcHBsaWVkLiBZb3UgY2FuIGFsc28gaW5jbHVkZSBhCisgICAgICAgICAgL0NMSUVOVCBvciAvU0VSVkVSIHN3aXRjaCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBnaXZlbgorICAgICAgICAgIHBvbGljaWVzIGFwcGx5IHdoZW4gS2VybWl0IGlzIHRoZSBUZWxuZXQgY2xpZW50IG9yIHRoZSBUZWxuZXQKKyAgICAgICAgICBzZXJ2ZXI7IGlmIG5vIHN3aXRjaCBpcyBnaXZlbiwgdGhlIGNvbW1hbmQgYXBwbGllcyB0byB0aGUKKyAgICAgICAgICBjbGllbnQuCisKKyAgICAgICAgICBOb3RlIHRoYXQgc29tZSBvZiBLZXJtaXQncyBUZWxuZXQgcGFydG5lcnMgZmFpbCB0byByZWZ1c2UKKyAgICAgICAgICBvcHRpb25zIHRoYXQgdGhleSBkbyBub3QgcmVjb2duaXplIGFuZCBpbnN0ZWFkIGRvIG5vdCByZXNwb25kCisgICAgICAgICAgYXQgYWxsLiBJbiB0aGlzIGNhc2UgaXQgaXMgcG9zc2libGUgdG8gdXNlIFNFVCBURUxPUFQgdG8KKyAgICAgICAgICBpbnN0cnVjdCBLZXJtaXQgdG8gUkVGVVNFIHRoZSBvcHRpb24gYmVmb3JlIGNvbm5lY3RpbmcgdG8gdGhlCisgICAgICAgICAgcHJvYmxlbSBob3N0LCB0aHVzIHNraXBwaW5nIHRoZSBwcm9ibGVtYXRpYyBuZWdvdGlhdGlvbi4KKworICAgICAgICAgIFVzZSBTSE9XIFRFTE9QVCB0byB2aWV3IGN1cnJlbnQgVGVsbmV0IE9wdGlvbiBuZWdvdGlhdGlvbgorICAgICAgICAgIHNldHRpbmdzLiBTSE9XIFRFTE5FVCBkaXNwbGF5cyBjdXJyZW50IFRlbG5ldCBzZXR0aW5ncy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDIuMy4wLiBCdWcgRml4ZXMKKworICAgSWYgInNldCBob3N0IG5vbmV4aXN0ZW50LWhvc3QiIHdhcyBnaXZlbiAoYW5kIGl0IHByb3Blcmx5IGZhaWxlZCksCisgICBmb2xsb3dlZCBieSBjZXJ0YWluIGNvbW1hbmRzIGxpa2UgU0VORCwgdGhlIG9yaWdpbmFsIGxpbmUgYW5kIG1vZGVtCisgICB0eXBlIHdlcmUgbm90IHJlc3RvcmVkIGFuZCBDLUtlcm1pdCB0aG91Z2h0IHRoYXQgaXQgc3RpbGwgaGFkIGEKKyAgIG5ldHdvcmsgaG9zdG5hbWU7IGZpeGVkIGluIDcuMC4KKworICAgIDIuMy4xLiBUZWxuZXQgQmluYXJ5IE1vZGUgQnVnIEFkanVzdG1lbnRzCisKKyAgIFNFVCBURUxORVQgQlVHIEJJTkFSWS1NRS1NRUFOUy1VLVRPTyB7IE9OLCBPRkYgfSB3YXMgYWRkZWQgdG8gZWRpdCAxOTIKKyAgIGFmdGVyIHRoZSBib29rIHdhcyBwcmludGVkLiBBbHNvIFNFVCBURUxORVQgQlVHIEJJTkFSWS1VLU1FQU5TLU1FLVRPTy4KKyAgIFRoZSBkZWZhdWx0IGZvciBib3RoIGlzIE9GRi4gT04gc2hvdWxkIGJlIHVzZWQgd2hlbiBjb21tdW5pY2F0aW5nIHdpdGgKKyAgIGEgVGVsbmV0IHBhcnRuZXIgKGNsaWVudCBvciBzZXJ2ZXIpIHRoYXQgbWlzdGFrZW5seSBiZWxpZXZlcyB0aGF0CisgICB0ZWxsaW5nIEMtS2VybWl0IHRvIGVudGVyIFRlbG5ldCBiaW5hcnkgbW9kZSBhbHNvIG1lYW5zIHRoYXQgaXQsIHRvbywKKyAgIGlzIGluIGJpbmFyeSBtb2RlLCBjb250cmFyeSB0byB0aGUgVGVsbmV0IHNwZWNpZmljYXRpb24sIHdoaWNoIHNheXMKKyAgIHRoYXQgYmluYXJ5IG1vZGUgbXVzdCBiZSBuZWdvdGlhdGVkIGluIGVhY2ggZGlyZWN0aW9uIHNlcGFyYXRlbHkuCisKKyAgICAyLjMuMi4gVk1TIFVDWCBUZWxuZXQgUG9ydCBCdWcgQWRqdXN0bWVudAorCisgICBBIG5ldyBjb21tYW5kLCBTRVQgVENQIFVDWC1QT1JULUJVRywgd2FzIGFkZGVkIGZvciBWTVMgdmVyc2lvbnMgd2l0aAorICAgVUNYIChERUMgVENQL0lQKSwgYXBwbHlpbmcgb25seSB0byBlYXJseSB2ZXJzaW9ucyBvZiBVQ1gsIGxpa2UgMi4yIG9yCisgICBlYXJsaWVyLiBJZiB5b3UgdHJ5IHRvIHVzZSBWTVMgQy1LZXJtaXQgdG8gbWFrZSBhIFRlbG5ldCBjb25uZWN0aW9uCisgICB1c2luZyBhIHBvcnQgbmFtZSAobGlrZSAidGVsbmV0Iiwgd2hpY2ggaXMgdXNlZCBieSBkZWZhdWx0KSwgdGhlCisgICB1bmRlcmx5aW5nIFVDWCBnZXRzZXJ2YnluYW1lKCkgZnVuY3Rpb24gbWlnaHQgcmV0dXJuIHRoZSBzZXJ2aWNlCisgICBudW1iZXIgd2l0aCBpdHMgYnl0ZXMgc3dhcHBlZCBhbmQgdGhlIGNvbm5lY3Rpb24gd2lsbCBmYWlsLiBJZiAidGVsbmV0CisgICBob3N0bmFtZSAyMyIgd29ya3MsIHRoZW4geW91ciB2ZXJzaW9uIG9mIFVDWCBoYXMgdGhpcyBidWcgYW5kIHlvdSBjYW4KKyAgIHB1dCAic2V0IHRjcCB1Y3gtcG9ydC1idWcgb24iIGluIHlvdXIgQ0tFUk1JVC5JTkkgZmlsZSB0byBnZXQgYXJvdW5kCisgICBpdC4KKworICAgIDIuMy4zLiBUZWxuZXQgTmV3IEVudmlyb25tZW50IE9wdGlvbgorCisgICBUaGUgVEVMTkVUIE5FVy1FTlZJUk9OTUVOVCBvcHRpb24gKFs0MDNdUkZDIDE1NzIpIGlzIHN1cHBvcnRlZCBhcyA3LjAuCisgICBUaGlzIG9wdGlvbiBhbGxvd3MgdGhlIEMtS2VybWl0IFRlbG5ldCBjbGllbnQgdG8gc2VuZCBjZXJ0YWluCisgICB3ZWxsLWtub3duIHZhcmlhYmxlcyB0byB0aGUgVGVsbmV0IHNlcnZlciwgaW5jbHVkaW5nIFVTRVIsIFBSSU5URVIsCisgICBESVNQTEFZLCBhbmQgc2V2ZXJhbCBvdGhlcnMuIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgaW4KKyAgIFdpbmRvd3MgYW5kIE9TLzIsIGRpc2FibGVkIGJ5IGRlZmF1bHQgZWxzZXdoZXJlLiBUaGUgY29tbWFuZCB0byBlbmFibGUKKyAgIGFuZCBkaXNhYmxlIGl0IGlzOgorCisgIFNFVCBURUxORVQgRU5WSVJPTk1FTlQgeyBPTiwgT0ZGIH0KKworICAgV2hlbiBPTiwgYW5kIHlvdSBUZWxuZXQgdG8gYW5vdGhlciBjb21wdXRlciwgeW91IG1pZ2h0IChvciBtaWdodCBub3QpCisgICBub3RpY2UgdGhhdCB0aGUgImxvZ2luOiIgb3IgIlVzZXJuYW1lOiIgcHJvbXB0IGRvZXMgbm90IGFwcGVhciAtLQorICAgdGhhdCdzIGJlY2F1c2UgeW91ciB1c2VybmFtZSB3YXMgc2VudCBhaGVhZCwgaW4gd2hpY2ggY2FzZSB0aGUgcmVtb3RlCisgICBzeXN0ZW0gbWlnaHQgcHJvbXB0IHlvdSBvbmx5IGZvciB5b3VyIHBhc3N3b3JkIChzaW1pbGFyIHRvIFJsb2dpbikuCisgICBVc2UgInNldCB0ZWxuZXQgZW52aXJvbm1lbnQgb2ZmIiB0byBkZWZlYXQgdGhpcyBmZWF0dXJlLCBwYXJ0aWN1bGFybHkKKyAgIGluIHNjcmlwdHMgd2hlcmUgdGhlIGRpYWxvZyBtdXN0IGJlIHByZWRpY3RhYmxlLiBZb3UgY2FuIGFsc28gdXNlIHRoaXMKKyAgIGNvbW1hbmQgdG8gc3BlY2lmeSBvciBvdmVycmlkZSBzcGVjaWZpYyB3ZWxsLWtub3duIGVudmlyb25tZW50CisgICB2YXJpYWJsZSB2YWx1ZXM6CisKKyBTRVQgVEVMTkVUIEVOVklST05NRU5UIHsgQUNDVCxESVNQTEFZLEpPQixQUklOVEVSLFNZU1RFTVRZUEUsVVNFUiB9IFsgdGV4dCBdCisKKyAgICAyLjMuNC4gVGVsbmV0IExvY2F0aW9uIE9wdGlvbgorCisgICBUaGUgVEVMTkVUIExPQ0FUSU9OIG9wdGlvbiAoWzQwNF1SRkMgNzc5KSBpcyBzdXBwb3J0ZWQgaW4gNy4wLiBUaGlzCisgICBvcHRpb24gYWxsb3dzIHRoZSBDLUtlcm1pdCBUZWxuZXQgY2xpZW50IHRvIHNlbmQgYSBsb2NhdGlvbiBzdHJpbmcgdG8KKyAgIHRoZSBzZXJ2ZXIgaWYgdGhlIHNlcnZlciBpbmRpY2F0ZXMgaXRzIHdpbGxpbmduZXNzIHRvIGFjY2VwdCBvbmUuIElmCisgICBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lZCBMT0NBVElPTiBleGlzdHMgYXQgdGhlIHRpbWUgQy1LZXJtaXQKKyAgIHN0YXJ0cywgaXRzIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGxvY2F0aW9uIHN0cmluZy4gSWYgeW91IHdhbnQgdG8KKyAgIGNoYW5nZSBpdCwgdXNlOgorCisgIFNFVCBURUxORVQgTE9DQVRJT04gdGV4dAorCisgICBJZiB5b3Ugb21pdCB0aGUgdGV4dCBmcm9tIHRoaXMgY29tbWFuZCwgdGhlIFRlbG5ldCBsb2NhdGlvbiBmZWF0dXJlIGlzCisgICBkaXNhYmxlZC4KKworICAgU0VUIFRFTE5FVCBFTlZJUk9OTUVOVCBESVNQTEFZIGlzIHVzZWQgdG8gc2V0IHRoZSBESVNQTEFZIHZhcmlhYmxlCisgICB0aGF0IGlzIHNlbnQgdG8gdGhlIGhvc3QsIGFzIHdlbGwgYXMgdGhlIHRoZSBYRElTUExBWSBsb2NhdGlvbi4KKworICAgIDIuMy41LiBDb25uZWN0aW5nIHRvIFJhdyBUQ1AgU29ja2V0cworCisgICBUaGUgU0VUIEhPU1QgYW5kIFRFTE5FVCBjb21tYW5kcyBub3cgYWNjZXB0IGFuIG9wdGlvbmFsIHN3aXRjaCwKKyAgIC9SQVctU09DS0VULCBhdCB0aGUgZW5kLCBvbmx5IGlmIHlvdSBmaXJzdCBnaXZlIGEgaG9zdCBhbmQgYSBwb3J0LgorICAgRXhhbXBsZToKKworICBzZXQgaG9zdCB4eXpjb3JwLmNvbSAyMyAvcmF3LXNvY2tldAorICBzZXQgaG9zdCAxMjguNDkuMzkuMjoyMDAwIC9yYXctc29ja2V0CisgIHRlbG5ldCB4eXpjb3JwLmNvbSAzMDAwIC9yYXcKKworICAgV2l0aG91dCB0aGlzIHN3aXRjaCwgQy1LZXJtaXQgYmVoYXZlcyBhcyBhIFRlbG5ldCBjbGllbnQgd2hlbiAoYSkgdGhlCisgICBwb3J0IGlzIDIzIG9yIDE2NDksIG9yIChiKSB0aGUgcG9ydCBpcyBub3QgNTEzIGFuZCB0aGUgc2VydmVyIHNlbnQKKyAgIHdoYXQgYXBwZWFyZWQgdG8gYmUgVGVsbmV0IG5lZ290aWF0aW9ucyAtLSB0aGF0IGlzLCBtZXNzYWdlcyBzdGFydGluZworICAgd2l0aCAweEZGIChJQUMpLiBXaXRoIHRoaXMgc3dpdGNoLCBLZXJtaXQgc2hvdWxkIHRyZWF0IGFsbCBpbmNvbWluZworICAgYnl0ZXMgYXMgcmF3IGRhdGEsIGFuZCB3aWxsIG5vdCBlbmdhZ2UgaW4gYW55IFRlbG5ldCBuZWdvdGlhdGlvbnMgb3IKKyAgIE5WVCBDUkxGIG1hbmlwdWxhdGlvbnMuIFRoaXMgYWxsb3dzIHRyYW5zcGFyZW50IG9wZXJhdGlvbiB0aHJvdWdoCisgICAoZS5nLikgcmF3IFRDUCBwb3J0cyBvbiBDaXNjbyB0ZXJtaW5hbCBzZXJ2ZXJzLCB0aHJvdWdoIHRoZSAnbW9kZW1kJworICAgbW9kZW0gc2VydmVyLCBldGMuCisKKyAgICAyLjMuNi4gSW5jb21pbmcgVENQIENvbm5lY3Rpb25zCisKKyAgIEFjY29tcGxpc2hlZCB2aWEgU0VUIEhPU1QgKiBwb3J0LCB3ZXJlIGludHJvZHVjZWQgaW4gQy1LZXJtaXQgNi4wLCBidXQKKyAgIGZvciBVTklYIG9ubHkuIEluIFZlcnNpb24gNy4wLCB0aGV5IGFyZSBhbHNvIGF2YWlsYWJsZSBmb3IgVk1TLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDIuNC4gVGhlIEVJR0hUQklUIENvbW1hbmQKKworICAgRUlHSFRCSVQgaXMgc2ltcGx5IGEgc2hvcnRoYW5kIGZvcjogU0VUIFBBUklUWSBOT05FLCBTRVQgVEVSTUlOQUwKKyAgIEJZVEVTSVpFIDgsIFNFVCBDT01NQU5EIEJZVEVTSVpFIDg7IHRoYXQgaXMsIGEgd2F5IHRvIHNldCB1cCBhbiA4LWJpdAorICAgY2xlYW4gY29ubmVjdGlvbiBpbiBhIHNpbmdsZSBjb21tYW5kLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDIuNS4gVGhlIFNlcnZpY2VzIERpcmVjdG9yeQorCisgICBDaGFwdGVyIDcgb2YgWzQwNV1Vc2luZyBDLUtlcm1pdCBkb2VzIG5vdCBtZW50aW9uIHRoZSBVTE9HSU4gbWFjcm8sCisgICB3aGljaCBpcyB1c2VkIGJ5IG91ciBzYW1wbGUgc2VydmljZXMgZGlyZWN0b3J5LCBDS0VSTUlULktORC4gVW5saWtlCisgICBVTklYTE9HSU4sIFZNU0xPR0lOLCBldGMsIHRoaXMgb25lIGlzIGZvciB1c2Ugd2l0aCBzeXN0ZW1zIHRoYXQKKyAgIHJlcXVpcmUgYSB1c2VyIElEIGJ1dCBubyBwYXNzd29yZC4gVGhlcmVmb3JlIGl0IGRvZXNuJ3QgcHJvbXB0IGZvciBhCisgICBwYXNzd29yZCBvciB3YWl0IGZvciBhIHBhc3N3b3JkIHByb21wdCBmcm9tIHRoZSByZW1vdGUgc2VydmljZS4KKworICAgSW4gdmVyc2lvbiA3LjAsIHRoZSBDQUxMIG1hY3JvIHdhcyBjaGFuZ2VkIHRvIG5vdCBleGVjdXRlIGEgU0VUIE1PREVNCisgICBUWVBFIGNvbW1hbmQgaWYgdGhlIGdpdmVuIG1vZGVtIHR5cGUgd2FzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IG9uZTsKKyAgIG90aGVyd2lzZSB0aGUgbmV3IFNFVCBNT0RFTSBUWVBFIGNvbW1hbmQgd291bGQgb3ZlcndyaXRlIGFueQorICAgY3VzdG9taXphdGlvbnMgdGhhdCB0aGUgdXNlciBoYWQgbWFkZSB0byB0aGUgbW9kZW0gc2V0dGluZ3MuIERpdHRvIGZvcgorICAgU0VUIExJTkUgLyBTRVQgUE9SVCBhbmQgU0VUIFNQRUVELgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDIuNi4gQ2xvc2luZyBDb25uZWN0aW9ucworCisgICBVbnRpbCB2ZXJzaW9uIDcuMCwgdGhlcmUgd2FzIG5ldmVyIGFuIG9idmlvdXMgYW5kIGdlbmVyYWwgd2F5IHRvIGNsb3NlCisgICBhIGNvbm5lY3Rpb24uIElmIGEgc2VyaWFsIGNvbm5lY3Rpb24gd2FzIG9wZW4sIGl0IGNvdWxkIGJlIGNsb3NlZCBieQorICAgInNldCBsaW5lIiBvciAic2V0IHBvcnQiIChnaXZpbmcgbm8gZGV2aWNlIG5hbWUpOyBpZiBhIG5ldHdvcmsKKyAgIGNvbm5lY3Rpb24gd2FzIG9wZW4sIGl0IGNvdWxkIGJlIGNsb3NlZCBieSAic2V0IGhvc3QiIChubyBob3N0IG5hbWUpLgorCisgICBJbiB2ZXJzaW9uIDcuMCwgYSBuZXcgY29tbWFuZCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gaW4gYW4gb2J2aW91cyBhbmQKKyAgIHN0cmFpZ2h0Zm9yd2FyZCB3YXksIG5vIG1hdHRlciB3aGF0IHRoZSBjb25uZWN0aW9uIHR5cGU6CisKKyAgQ0xPU0UgWyBDT05ORUNUSU9OIF0KKworICAgVGhlIENMT1NFIGNvbW1hbmQgd2FzIGFscmVhZHkgcHJlc2VudCwgYW5kIHJlcXVpcmVkIGFuIG9wZXJhbmQgc3VjaCBhcworICAgREVCVUctTE9HLCBXUklURS1GSUxFLCBldGMsIGFuZCBzbyBjb3VsZCBuZXZlciBiZSBnaXZlbiBieSBpdHNlbGYuIFRoZQorICAgbmV3IENPTk5FQ1RJT04gb3BlcmFuZCBpcyBub3cgdGhlIGRlZmF1bHQgb3BlcmFuZCBmb3IgQ0xPU0UsIHNvIENMT1NFCisgICBieSBpdHNlbGYgY2xvc2VzIHRoZSBjb25uZWN0aW9uLCBpZiBvbmUgaXMgb3BlbiwganVzdCBhcyB5b3Ugd291bGQKKyAgIGV4cGVjdCwgZXNwZWNpYWxseSBpZiB5b3UgYXJlIGEgVGVsbmV0IG9yIEZ0cCB1c2VyLgorCisgICBBbHNvIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG5ldyBTRVQgQ0xPU0UtT04tRElTQ09OTkVDVCBjb21tYW5kIGluCisgICBbNDA2XVNlY3Rpb24gMi4xMC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAyLjcuIFVzaW5nIEMtS2VybWl0IHdpdGggRXh0ZXJuYWwgQ29tbXVuaWNhdGlvbiBQcm9ncmFtcworCisgICBDLUtlcm1pdCA3LjAgaW5jbHVkZXMgYSBuZXcgYWJpbGl0eSB0byBjcmVhdGUgYW5kIGNvbmR1Y3Qgc2Vzc2lvbnMKKyAgIHRocm91Z2ggb3RoZXIgY29tbXVuaWNhdGlvbnMgcHJvZ3JhbXMuIFR3byBtZXRob2RzIGFyZSBhdmFpbGFibGU6CisKKyAgICAxLiBQdHkgKHBzZXVkb3Rlcm1pbmFsKTogVGhlIGV4dGVybmFsIHByb2dyYW0gaXMgcnVuIG9uIGEKKyAgICAgICAicHNldWRvdGVybWluYWwiLCB3aGljaCBpcyBjb250cm9sbGVkIGJ5IEtlcm1pdC4gVGhpcyBtZXRob2Qgd29ya3MKKyAgICAgICB3aXRoIHByYWN0aWNhbGx5IGFueSBleHRlcm5hbCBwcm9ncmFtLCBidXQgaXQgaXMgbm90IHBvcnRhYmxlLiBBdAorICAgICAgIHRoaXMgd3JpdGluZywgaXQgd29ya3Mgb25seSBvbiBzb21lIChub3QgYWxsKSBVTklYIHZlcnNpb25zLCBhbmQKKyAgICAgICBub3Qgb24gYW55IG5vbi1VTklYIHBsYXRmb3Jtcy4KKyAgICAyLiBQaXBlOiBUaGUgZXh0ZXJuYWwgcHJvZ3JhbSdzIHN0YW5kYXJkIGlucHV0IGFuZCBvdXRwdXQgYXJlCisgICAgICAgcmVkaXJlY3RlZCB0aHJvdWdoIGEgInBpcGUiIGNvbnRyb2xsZWQgYnkgS2VybWl0LiBUaGlzIG1ldGhvZCBpcworICAgICAgIHJlbGF0aXZlbHkgcG9ydGFibGUgLS0gaXQgc2hvdWxkIHdvcmsgYWNyb3NzIGFsbCBVTklYIHZlcnNpb25zLAorICAgICAgIGFuZCBpdCBhbHNvIHdvcmtzIGluIFdpbmRvd3MgYW5kIE9TLzIgLS0gYnV0IGl0IGlzIGVmZmVjdGl2ZSBvbmx5CisgICAgICAgd2hlbiB0aGUgZXh0ZXJuYWwgcHJvZ3JhbSBhY3R1YWxseSB1c2VzIHN0YW5kYXJkIGkvbyAoYW5kIG1hbnkKKyAgICAgICBkb24ndCkuCisKKyAgIFRoZSB0d28gbWV0aG9kcyBhcmUgc3RhcnRlZCBkaWZmZXJlbnRseSBidXQgYXJlIHVzZWQgdGhlIHNhbWUgd2F5CisgICB0aGVyZWFmdGVyLgorCisgICBUaGUgcHVycG9zZSBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gbGV0IHlvdSB1c2UgQy1LZXJtaXQgc2VydmljZXMgbGlrZQorICAgZmlsZSB0cmFuc2ZlciwgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiwgc2NyaXB0aW5nLCBhdXRvbWF0aWMKKyAgIGRpYWxpbmcsIGV0Yywgb24gY29ubmVjdGlvbnMgdGhhdCBLZXJtaXQgY2FuJ3Qgb3RoZXJ3aXNlIG1ha2UgaXRzZWxmLgorCisgICBUaGlzIGZlYXR1cmUgaXMgdGhlIG9wcG9zaXRlIG9mIHRoZSBSRURJUkVDVCBmZWF0dXJlLCBpbiB3aGljaAorICAgQy1LZXJtaXQgbWFrZXMgdGhlIGNvbm5lY3Rpb24sIGFuZCByZWRpcmVjdHMgYW4gZXh0ZXJuYWwgKGxvY2FsKQorICAgY29tbWFuZCBvciBwcm9ncmFtIG92ZXIgdGhpcyBjb25uZWN0aW9uLiBJbiBhIHB0eSBvciBwaXBlIGNvbm5lY3Rpb24sCisgICBDLUtlcm1pdCBydW5zIGFuZCBjb250cm9scyBhIGxvY2FsIGNvbW1hbmQgb3IgcHJvZ3JhbSwgd2hpY2ggbWFrZXMgdGhlCisgICBjb25uZWN0aW9uLiAoVGhlIHNhbWUgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNpbXBseSB0byBjb250cm9sIGEgbG9jYWwKKyAgIHByb2dyYW0gd2l0aG91dCBtYWtpbmcgYSBjb25uZWN0aW9uOyBzZWUgWzQwN11TZWN0aW9uIDIuOC4pCisKKyAgIFRvIGZpbmQgb3V0IGlmIHlvdXIgdmVyc2lvbiBvZiBLZXJtaXQgaW5jbHVkZXMgUFRZIHN1cHBvcnQsIHR5cGUgInNob3cKKyAgIGZlYXR1cmVzIiBhbmQgbG9vayBmb3IgTkVUUFRZIGluIHRoZSBhbHBoYWJldGljYWwgbGlzdCBvZiBvcHRpb25zLiBGb3IKKyAgIHBpcGVzLCBsb29rIGZvciBORVRDTUQuCisKKyAgIFRoZSBjb21tYW5kcyBhcmU6CisKKyAgIFNFVCBORVRXT1JLIFRZUEUgUFRZIG9yIFNFVCBORVRXT1JLIFRZUEUgUElQRQorICAgU0VUIEhPU1QgY29tbWFuZAorICAgICAgICAgIHdoZXJlIGNvbW1hbmQgaXMgYW55IGludGVyYWN0aXZlIGNvbW1hbmQuIElmIHRoZSBjb21tYW5kIGRvZXMKKyAgICAgICAgICBub3QgdXNlIHN0YW5kYXJkIGkvbywgeW91IG11c3QgdXNlIFNFVCBORVRXT1JLIFRZUEUgUFRZLgorCisgICBOb3RlczoKKworICAgICAqIENPTU1BTkQgaXMgYW4gaW52aXNpYmxlIHN5bm9ueW0gZm9yIFBJUEUuCisgICAgICogVGhlIGNvbW1hbmQgYW5kIGl0cyBhcmd1bWVudHMgYXJlIGNhc2Utc2Vuc2l0aXZlIGluIFVOSVguCisKKyAgIFRoZSBTRVQgTkVUV09SSyBUWVBFLCBTRVQgSE9TVCBzZXF1ZW5jZSBzZXRzIHRoZSBnaXZlbiBuZXR3b3JrIHR5cGUKKyAgIGZvciBhbGwgc3Vic2VxdWVudCBTRVQgSE9TVCBjb21tYW5kcyB1bnRpbCBhbm90aGVyIFNFVCBORVRXT1JLIFRZUEUKKyAgIGNvbW1hbmQgaXMgZ2l2ZW4gdG8gY2hhbmdlIGl0LgorCisgICBZb3UgY2FuIGFsc28gdXNlIHRoZSBuZXcgL05FVFdPUkstVFlQRTpQVFkgb3IgL05FVFdPUkstVFlQRTpQSVBFIChvcgorICAgc2ltcGx5IC9QSVBFIG9yIC9QVFkpIHN3aXRjaGVzIG9uIHRoZSBTRVQgSE9TVCBjb21tYW5kIGl0c2VsZjoKKworICBTRVQgSE9TVCAvTkVUV09SSy1UWVBFOlBJUEUgY29tbWFuZCAgOyBUaGVzZSB0d28gYXJlIHRoZSBzYW1lCisgIFNFVCBIT1NUIC9QSVBFIGNvbW1hbmQKKworICBTRVQgSE9TVCAvTkVUV09SSy1UWVBFOlBUWSBjb21tYW5kICAgOyBEaXR0bworICBTRVQgSE9TVCAvUFRZIGNvbW1hbmQKKworICAgVGhlc2UgYXJlIGxpa2UgU0VUIE5FVFdPUksgVFlQRSBmb2xsb3dlZCBieSBTRVQgSE9TVCwgZXhjZXB0IHRoZXkKKyAgIGFwcGx5IG9ubHkgdG8gdGhlIGNvbm5lY3Rpb24gYmVpbmcgbWFkZSBhbmQgZG8gbm90IGNoYW5nZSB0aGUgZ2xvYmFsCisgICBuZXR3b3JrIHR5cGUgc2V0dGluZyAoc2VlIFs0MDhdU2VjdGlvbiAxLjUgYWJvdXQgdGhlIGRpZmZlcmVuY2UKKyAgIGJldHdlZW4gc3dpdGNoZXMgYW5kIFNFVCBjb21tYW5kcykuCisKKyAgIEluY2x1ZGUgYW55IGNvbW1hbmQtbGluZSBvcHRpb25zIHdpdGggdGhlIGNvbW1hbmQgdGhhdCBtaWdodCBiZQorICAgbmVlZGVkLCBhcyBpbiB0aGlzIGV4YW1wbGUgd2hlcmUgQy1LZXJtaXQgdXNlcyBhbm90aGVyIGNvcHkgb2YgaXRzZWxmCisgICBhcyB0aGUgY29tbXVuaWNhdGlvbnMgcHJvZ3JhbToKKworICBTRVQgSE9TVCAvUElQRSAvQ09OTkVDVCBrZXJtaXQgLVlRSiB4eXpjb3JwLmNvbQorCisgICBBcyB1c3VhbCwgaWYgeW91IGluY2x1ZGUgdGhlIC9DT05ORUNUIHN3aXRjaCwgU0VUIEhPU1QgZW50ZXJzIENPTk5FQ1QKKyAgIG1vZGUgaW1tZWRpYXRlbHkgdXBvbiBzdWNjZXNzZnVsIGV4ZWN1dGlvbiBvZiB0aGUgZ2l2ZW4gY29tbWFuZC4KKyAgIFRoZXJlZm9yZSBuZXcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBhcyBhIHNob3J0aGFuZCBmb3IgU0VUIEhPU1QKKyAgIC9DT05ORUNUIC9QVFkgYW5kIC9QSVBFOgorCisgICBQVFkgWyBjb21tYW5kIF0KKyAgIFBJUEUgWyBjb21tYW5kIF0KKyAgICAgICAgICBUaGUgUFRZIGFuZCBQSVBFIGNvbW1hbmRzIHdvcmsgbGlrZSB0aGUgVEVMTkVUIGFuZCBSTE9HSU4KKyAgICAgICAgICBjb21tYW5kczogdGhleSBzZXQgdXAgdGhlIGNvbm5lY3Rpb24gKGluIHRoaXMgY2FzZSwgdXNpbmcgdGhlCisgICAgICAgICAgZ2l2ZW4gY29tbWFuZCkgYW5kIHRoZW4gZW50ZXIgQ09OTkVDVCBtb2RlIGF1dG9tYXRpY2FsbHkgKGlmCisgICAgICAgICAgdGhlIFBJUEUgb3IgUFRZIGNvbW1hbmQgaXMgZ2l2ZW4gd2l0aG91dCBhIGNvbW1hbmQsIGl0CisgICAgICAgICAgY29udGludWVzIHRoZSBjdXJyZW50IHNlc3Npb24gaWYgb25lIGlzIGFjdGl2ZTsgb3RoZXJ3aXNlIGl0CisgICAgICAgICAgZ2l2ZXMgYW4gZXJyb3IgbWVzc2FnZSkuCisKKyAgIFRoZSBQSVBFIGNvbW1hbmQgaXMgbmFtZWQgYWZ0ZXIgdGhlIG1lY2hhbmlzbSBieSB3aGljaCBDLUtlcm1pdAorICAgY29tbXVuaWNhdGVzIHdpdGggdGhlIGNvbW1hbmQ6IFVOSVggcGlwZXMuIEMtS2VybWl0J3MgaS9vIGlzICJwaXBlZCIKKyAgIHRocm91Z2ggdGhlIGdpdmVuIGNvbW1hbmQuIEhlcmUgaXMgYSB0eXBpY2FsIGV4YW1wbGU6CisKKyAgUElQRSBybG9naW4gLTggeHl6Y29ycC5jb20KKworICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvOgorCisgIFNFVCBIT1NUIC9QSVBFIHJsb2dpbiAtOCB4eXpjb3JwLmNvbQorICBDT05ORUNUCisKKyAgIGFuZCB0bzoKKworICBTRVQgSE9TVCAvUElQRSAvQ09OTkVDVCBybG9naW4gLTggeHl6Y29ycC5jb20KKworICAgSU1QT1JUQU5UOgorICAgICAgICAgIElmIHlvdSBhcmUgd3JpdGluZyBhIHNjcmlwdCwgZG8gbm90IHVzZSB0aGUgUElQRSwgUFRZLCBURUxORVQsCisgICAgICAgICAgb3IgUkxPR0lOIGNvbW1hbmQgdW5sZXNzIHlvdSByZWFsbHkgd2FudCBDLUtlcm1pdCB0byBlbnRlcgorICAgICAgICAgIENPTk5FQ1QgbW9kZSBhdCB0aGF0IHBvaW50LiBOb3JtYWxseSBTRVQgSE9TVCBpcyB1c2VkIGluCisgICAgICAgICAgc2NyaXB0cyB0byBhbGxvdyB0aGUgbG9naW4gYW5kIG90aGVyIGRpYWxvZ3MgdG8gYmUgY29udHJvbGxlZAorICAgICAgICAgIGJ5IHRoZSBzY3JpcHQgaXRzZWxmLCByYXRoZXIgdGhhbiBieSBhbiBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nCisgICAgICAgICAgaHVtYW4gYXQgdGhlIGtleWJvYXJkLgorCisgICBUaHJvdWdocHV0IG9mIHB0eSBhbmQgcGlwZSBjb25uZWN0aW9ucyBpcyBsaW1pdGVkIGJ5IHRoZSBwZXJmb3JtYW5jZQorICAgb2YgdGhlIGNob3NlbiBjb21tYW5kIG9yIHByb2dyYW0gYW5kIGJ5IHRoZSBpbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbgorICAgKElQQykgbWV0aG9kIHVzZWQgYW5kL29yIGJ1ZmZlcmluZyBjYXBhY2l0eSBvZiB0aGUgcGlwZSBvciBwdHksIHdoaWNoCisgICBpbiB0dXJuIGRlcGVuZHMgb24gdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbS4KKworICAgSW4gb25lIHRyaWFsIChvbiBTdW5PUyA0LjEuMyksIHdlIG9ic2VydmVkIGZpbGUgdHJhbnNmZXIgcmF0ZXMgb3ZlciBhbgorICAgcmxvZ2luIGNvbm5lY3Rpb24gcHJvY2VlZGluZyBhdCAyMDBLY3BzIGZvciBkb3dubG9hZHMsIGJ1dCBvbmx5IDEwS2NwcworICAgZm9yIHVwbG9hZHMgb24gdGhlIHNhbWUgY29ubmVjdGlvbiB3aXRoIHRoZSBzYW1lIHNldHRpbmdzIChzaW1pbGFyCisgICBkaXNwYXJpdGllcyB3ZXJlIG5vdGVkIGluIEhQLVVYKS4gRXhhbWluYXRpb24gb2YgdGhlIGxvZ3MgcmV2ZWFsZWQKKyAgIHRoYXQgYSB3cml0ZSB0byB0aGUgcGlwZSBjb3VsZCB0YWtlIGFzIGxvbmcgYXMgNSBzZWNvbmRzLCB3aGVyZWFzCisgICByZWFkcyB3ZXJlIHByYWN0aWNhbGx5IGluc3RhbnRhbmVvdXMuIE9uIHRoZSBvdGhlciBoYW5kLCB1c2luZyBUZWxuZXQKKyAgIGFzIHRoZSBleHRlcm5hbCBwcm9ncmFtIHJhdGhlciB0aGFuIHJsb2dpbiwgZG93bmxvYWRzIGFuZCB1cGxvYWRzIHdlcmUKKyAgIGJldHRlciBtYXRjaGVkIGF0IGFib3V0IDE3N0sgZWFjaC4KKworICAgTW9zdCBleHRlcm5hbCBjb21tdW5pY2F0aW9uIHByb2dyYW1zLCBsaWtlIEMtS2VybWl0IGl0c2VsZiwgaGF2ZQorICAgZXNjYXBlIGNoYXJhY3RlcnMgb3Igc2VxdWVuY2VzLiBOb3JtYWxseSB0aGVzZSBiZWdpbiB3aXRoIChvciBjb25zaXN0CisgICBlbnRpcmVseSBvZikgYSBjb250cm9sIGNoYXJhY3Rlci4gWW91IG11c3QgYmUgc3VyZSB0aGF0IHRoaXMgY29udHJvbAorICAgY2hhcmFjdGVyIGlzIG5vdCAidW5wcmVmaXhlZCIgd2hlbiB1cGxvYWRpbmcgZmlsZXMsIG90aGVyd2lzZSB0aGUKKyAgIGV4dGVybmFsIHByb2dyYW0gd2lsbCAiZXNjYXBlIGJhY2siIHRvIGl0cyBwcm9tcHQsIG9yIGNsb3NlIHRoZQorICAgY29ubmVjdGlvbiwgb3IgdGFrZSBzb21lIG90aGVyIHVud2FudGVkIGFjdGlvbi4gV2hlbiBpbiBDT05ORUNUIG1vZGUsCisgICBvYnNlcnZlIHRoZSBwcm9ncmFtJ3Mgbm9ybWFsIGludGVyYWN0aW9uIHJ1bGVzLiBPZiBjb3Vyc2UgQy1LZXJtaXQncworICAgb3duIGVzY2FwZSBjaGFyYWN0ZXIgKG5vcm1hbGx5IEN0cmwtXCkgaXMgYWN0aXZlIHRvbywgdW5sZXNzIHlvdSBoYXZlCisgICB0YWtlbiBzb21lIGFjdGlvbiB0byBkaXNhYmxlIGl0LgorCisgICBPbiBQVFkgY29ubmVjdGlvbnMsIHRoZSB1bmRlcmx5aW5nIFBUWSBkcml2ZXIgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUKKyAgIHRyYW5zcGFyZW50IHRvIGNvbnRyb2wgY2hhcmFjdGVycyAtLSBmb3IgZXhhbXBsZSwgaXQgbWlnaHQgZXhwYW5kCisgICB0YWJzLCB0cmFuc2xhdGUgY2FycmlhZ2UgcmV0dXJucywgZ2VuZXJhdGUgc2lnbmFscyBpZiBpdCBzZWVzIGFuCisgICBpbnRlcnJ1cHQgY2hhcmFjdGVyLCBhbmQgc28gb24uIFNpbWlsYXIgdGhpbmdzIG1pZ2h0IGhhcHBlbiBvbiBhIFBJUEUKKyAgIGNvbm5lY3Rpb24uIEZvciB0aGlzIHJlYXNvbiwgaWYgeW91IHBsYW4gdG8gdHJhbnNmZXIgZmlsZXMgb3ZlciBhIFBUWQorICAgb3IgUElQRSBjb25uZWN0aW9uLCB0ZWxsIHRoZSBmaWxlIHNlbmRlciB0bzoKKworICAgU0VUIFBSRUZJWElORyBBTEwKKyAgICAgICAgICBUaGlzIGNhdXNlcyBhbGwgY29udHJvbCBjaGFyYWN0ZXJzIHRvIGJlIHByZWZpeGVkIGFuZAorICAgICAgICAgIHRyYW5zbWl0dGVkIGFzIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzLgorCisgICBJZiB0aGUgZXh0ZXJuYWwgY29ubmVjdGlvbiBwcm9ncmFtIGlzIG5vdCA4LWJpdCBjbGVhbiwgeW91IHNob3VsZAorICAgYWxzbzoKKworICAgU0VUIFBBUklUWSBTUEFDRQorICAgICAgICAgIFRoaXMgY2F1c2VzIDgtYml0IGRhdGEgdG8gYmUgZW5jb2RlZCBpbiA3IGJpdHMgdXNpbmcgc2luZ2xlCisgICAgICAgICAgYW5kL29yIGxvY2tpbmcgc2hpZnRzLgorCisgICBBbmQgaWYgaXQgZG9lcyBub3QgbWFrZSBhIHJlbGlhYmxlIGNvbm5lY3Rpb24gKHN1Y2ggYXMgdGhvc2UgbWFkZSBieQorICAgVGVsbmV0LCBSbG9naW4sIFNzaCwgZXRjKSwgeW91IHNob3VsZDoKKworICAgU0VUIFNUUkVBTUlORyBPRkYKKyAgICAgICAgICBUaGlzIGZvcmNlcyBDLUtlcm1pdCB0byB0cmVhdCB0aGUgY29ubmVjdGlvbiBhcyB1bnJlbGlhYmxlIGFuZAorICAgICAgICAgIHRvIGVuZ2FnZSBpbiBpdHMgbm9ybWFsIEFDSy9OQUsgcHJvdG9jb2wgZm9yIGVycm9yIGRldGVjdGlvbgorICAgICAgICAgIGFuZCBjb3JyZWN0aW9uLCByYXRoZXIgdGhhbiAic3RyZWFtaW5nIiBpdHMgcGFja2V0cywgYXMgaXQKKyAgICAgICAgICBub3JtYWxseSBkb2VzIG9uIGEgbmV0d29yayBjb25uZWN0aW9uIChbNDA5XVNlY3Rpb24gNC4yMCkuCisKKyAgIEluIHNvbWUgY2FzZXMsIGJ1ZmZlciBzaXplcyBtaWdodCBiZSByZXN0cmljdGVkLCBzbyB5b3UgbWlnaHQgYWxzbworICAgbmVlZCB0byByZWR1Y2UgdGhlIEtlcm1pdCBwYWNrZXQgbGVuZ3RoIHRvIGZpdDsgdGhpcyBpcyBhCisgICB0cmlhbC1hbmQtZXJyb3IgYWZmYWlyLiBGb3IgZXhhbXBsZSwgaWYgdHJhbnNmZXJzIGFsd2F5cyBmYWlsIHdpdGgKKyAgIDQwMDAtYnl0ZSBwYWNrZXRzLCB0cnkgMjAwMC4gSWYgdGhhdCBmYWlscyB0b28sIHRyeSAxMDAwLCBhbmQgc28gb24uCisgICBUaGUgY29tbWFuZHMgYXJlOgorCisgICBTRVQgUkVDRUlWRSBQQUNLRVQtTEVOR1RIIG51bWJlcgorICAgICAgICAgIFRoaXMgdGVsbHMgdGhlIGZpbGUgcmVjZWl2ZXIgdG8gdGVsbCB0aGUgZmlsZSBzZW5kZXIgdGhlCisgICAgICAgICAgbG9uZ2VzdCBwYWNrZXQgbGVuZ3RoIGl0IGNhbiBhY2NlcHQuCisKKyAgIFNFVCBTRU5EIFBBQ0tFVC1MRU5HVEggbnVtYmVyCisgICAgICAgICAgVGhpcyB0ZWxscyB0aGUgZmlsZSBzZW5kZXIgbm90IHRvIHNlbmQgcGFja2V0cyBsb25nZXIgdGhhbiB0aGUKKyAgICAgICAgICBnaXZlbiBsZW5ndGgsIGV2ZW4gaWYgdGhlIHJlY2VpdmVyIHNheXMgbG9uZ2VyIG9uZXMgYXJlIE9LLiBPZgorICAgICAgICAgIGNvdXJzZSwgaWYgdGhlIHJlY2VpdmVyJ3MgbGVuZ3RoIGlzIHNob3J0ZXIsIHRoZSBzaG9ydGVyIGxlbmd0aAorICAgICAgICAgIGlzIHVzZWQuCisKKyAgIElmIG5vbmUgb2YgdGhpcyBzZWVtcyB0byBoZWxwLCB0cnkgZmFsbGluZyBiYWNrIHRvIHRoZSBiYXJlIG1pbmltdW0sCisgICBsb3dlc3QtY29tbW9uLWRlbm9taW5hdG9yIHByb3RvY29sIHNldHRpbmdzOgorCisgICBST0JVU1QKKyAgICAgICAgICBObyBzbGlkaW5nIHdpbmRvd3MsIG5vIHN0cmVhbWluZywgbm8gY29udHJvbC1jaGFyYWN0ZXIKKyAgICAgICAgICB1bnByZWZpeGluZywgcGFja2V0IGxlbmd0aCA5MC4KKworICAgQW5kIHRoZW4gd29yayB5b3VyIHdheSBiYWNrIHVwIGJ5IHRyaWFsIGFuZCBlcnJvciB0byBnZXQgZ3JlYXRlcgorICAgdGhyb3VnaHB1dC4KKworICAgTm90ZSB0aGF0IHdoZW4gc3RhcnRpbmcgYSBQSVBFIGNvbm5lY3Rpb24sIGFuZCB0aGUgY29ubmVjdGlvbiBwcm9ncmFtCisgICAoc3VjaCBhcyB0ZWxuZXQgb3IgcmxvZ2luKSBwcmludHMgc29tZSBncmVldGluZyBvciBpbmZvcm1hdGlvbgorICAgbWVzc2FnZXMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBjb25uZWN0aW9uLCB0aGVzZSBhcmUgcXVpdGUgbGlrZWx5IHRvIGJlCisgICBwcmludGVkIHdpdGggYSBzdGFpcnN0ZXAgZWZmZWN0IChsaW5lZmVlZCB3aXRob3V0IGNhcnJpYWdlIHJldHVybikuCisgICBUaGlzIGlzIGJlY2F1c2UgdGhlIHByb2dyYW0gaXMgbm90IGNvbm5lY3RlZCB3aXRoIHRoZSBVTklYIHRlcm1pbmFsCisgICBkcml2ZXI7IHRoZXJlJ3Mgbm90IG11Y2ggS2VybWl0IGNhbiBkbyBhYm91dCBpdC4gT25jZSB0aGUgY29ubmVjdGlvbgorICAgaXMgbWFkZSwgZXZlcnl0aGluZyBzaG91bGQgZ28gYmFjayB0byBub3JtYWwuIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBvbgorICAgYSBQVFkgY29ubmVjdGlvbiBiZWNhdXNlIGEgUFRZIGlzLCBpbmRlZWQsIGEgdGVybWluYWwuCisKKyAgIE9uIGEgc2ltaWxhciBub3RlLCBzb21lIGNvbm5lY3Rpb24gcHJvZ3JhbXMgKGxpa2UgU29sYXJpcyAyLjUgcmxvZ2luKQorICAgbWlnaHQgcHJpbnQgbG90cyBvZiBlcnJvciBtZXNzYWdlcyBsaWtlICJpb2N0bCBUSU9DR0VUUDogaW52YWxpZAorICAgYXJndW1lbnQiIHdoZW4gdXNlZCB0aHJvdWdoIGEgcGlwZS4gVGhleSBhcmUgYW5ub3lpbmcgYnV0IHVzdWFsbHkKKyAgIGhhcm1sZXNzLiBJZiB5b3Ugd2FudCB0byBhdm9pZCB0aGVzZSBtZXNzYWdlcywgYW5kIHlvdXIgc2hlbGwgYWxsb3dzCisgICByZWRpcmVjdGlvbiBvZiBzdGRlcnIsIHlvdSBjYW4gcmVkaXJlY3Qgc3RkZXJyIGluIHlvdXIgcGlwZSBjb21tYW5kLAorICAgYXMgaW4gdGhpcyBleGFtcGxlIHdoZXJlIHRoZSB1c2VyJ3Mgc2hlbGwgaXMgYmFzaDoKKworICBQSVBFIHJsb2dpbiB4eXpjb3JwLmNvbSAyPiAvZGV2L251bGwKKworICAgT3IgdXNlIFBUWSByYXRoZXIgdGhhbiBQSVBFLCBzaW5jZSBQVFkgaXMgYXZhaWxhYmxlIG9uIFNvbGFyaXMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAyLjcuMC4gQy1LZXJtaXQgb3ZlciB0bjMyNzAgYW5kIHRuNTI1MAorCisgICBOb3cgeW91IGNhbiBtYWtlIGEgY29ubmVjdGlvbiBmcm9tIEMtS2VybWl0ICJkaXJlY3RseSIgdG8gYW4gSUJNCisgICBtYWluZnJhbWUgYW5kIHRyYW5zZmVyIGZpbGVzIHdpdGggaXQsIGFzc3VtaW5nIGl0IGhhcyBLZXJtaXQtMzcwCisgICBpbnN0YWxsZWQuIEJlY2F1c2UgdG4zMjcwIGlzIG5laXRoZXIgOC1iaXQgY2xlYW4gbm9yIHRyYW5zcGFyZW50IHRvCisgICBjb250cm9sIGNoYXJhY3RlcnMsIHlvdSBtdXN0IGdpdmUgdGhlc2UgY29tbWFuZHM6CisKKyAgU0VUIFBSRUZJWElORyBBTEwgICA7IFByZWZpeCBhbGwgY29udHJvbCBjaGFyYWN0ZXJzCisgIFNFVCBQQVJJVFkgU1BBQ0UgICAgOyBUZWxuZXQgY29ubmVjdGlvbnMgYXJlIHVzdWFsbHkgbm90IDgtYml0IGNsZWFuCisKKyAgIGFuZCB0aGVuOgorCisgIFNFVCBIT1NUIC9QVFkgL0NPTk5FQ1QgdG4zMjcwIGFiY2NvcnAuY29tCisKKyAgIG9yIHNpbXBseToKKworICBwdHkgdG4zMjcwIGFiY2NvcnAuY29tCisKKyAgIFNFVCBIT1NUIC9QSVBFIGRvZXMgbm90IHdvcmsgaW4gdGhpcyBjYXNlLCBhdCBsZWFzdCBub3QgZm9yIGZpbGUKKyAgIHRyYW5zZmVyLiBGaWxlIHRyYW5zZmVyIGRvZXMgd29yaywgaG93ZXZlciwgd2l0aCBTRVQgSE9TVCAvUFRZLAorICAgcHJvdmlkZWQgeW91IHVzZSB0aGUgZGVmYXVsdCBwYWNrZXQgbGVuZ3RoIG9mIDkwIGJ5dGVzOyBhbnl0aGluZworICAgbG9uZ2VyIHNlZW1zIHRvIGtpbGwgdGhlIHNlc3Npb24uCisKKyAgIFlvdSBjYW4gYWxzbyBtYWtlIGNvbm5lY3Rpb25zIHRvIElCTSBBUy80MDAgY29tcHV0ZXJzIGlmIHlvdSBoYXZlIGEKKyAgIHRuNTI1MCBwcm9ncmFtIGluc3RhbGxlZDoKKworICBwdHkgdG41MjUwIGhvc3RuYW1lCisKKyAgIEluIHRoaXMgY2FzZSwgaG93ZXZlciwgZmlsZSB0cmFuc2ZlciBpcyBwcm9iYWJseSBub3QgaW4gdGhlIGNhcmRzCisgICBzaW5jZSBub2JvZHkgaGFzIGV2ZXIgc3VjY2VlZGVkIGluIHdyaXRpbmcgYSBLZXJtaXQgcHJvZ3JhbSBmb3IgdGhlCisgICBBUy80MDAuIEhpbnQ6CisKKyAgZGVmaW5lIHRuMzI3MCB7CisgICAgICBjaGVjayBwdHkKKyAgICAgIGlmIGZhaWwgZW5kIDEgU29ycnkgLSBubyBQVFkgc3VwcG9ydC4uLgorICAgICAgcHR5IHRuMzI3MCBcJSoKKyAgfQorCisgICBTaW1pbGFybHkgZm9yIHRuNTI1MC4gTm90ZSB0aGF0IENIRUNLIFBUWSBhbmQgQ0hFQ0sgUElQRSBjYW4gYmUgdXNlZAorICAgaW4gbWFjcm9zIGFuZCBzY3JpcHRzIHRvIHRlc3Qgd2hldGhlciBQVFkgb3IgUElQRSBzdXBwb3J0IGlzCisgICBhdmFpbGFibGUuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAyLjcuMS4gQy1LZXJtaXQgb3ZlciBUZWxuZXQKKworICAgQWx0aG91Z2ggQy1LZXJtaXQgaW5jbHVkZXMgaXRzIG93biBUZWxuZXQgaW1wbGVtZW50YXRpb24sIHlvdSBtaWdodAorICAgbmVlZCB0byB1c2UgYW4gZXh0ZXJuYWwgVGVsbmV0IHByb2dyYW0gdG8gbWFrZSBjZXJ0YWluIGNvbm5lY3Rpb25zOworICAgcGVyaGFwcyBiZWNhdXNlIGl0IGhhcyBhY2Nlc3Mgb3Igc2VjdXJpdHkgZmVhdHVyZXMgbm90IGF2YWlsYWJsZSBpbgorICAgQy1LZXJtaXQgaXRzZWxmLiBBcyBub3RlZCBhYm92ZSwgdGhlIG9ubHkgcHJlY2F1dGlvbnMgbmVjZXNzYXJ5IGFyZQorICAgdXN1YWxseToKKworICBTRVQgUFJFRklYSU5HIEFMTCAgIDsgUHJlZml4IGFsbCBjb250cm9sIGNoYXJhY3RlcnMKKyAgU0VUIFBBUklUWSBTUEFDRSAgICA7IFRlbG5ldCBjb25uZWN0aW9ucyBtaWdodCBub3QgYmUgOC1iaXQgY2xlYW4KKworICAgYW5kIHRoZW46CisKKyAgU0VUIEhPU1QgL1BUWSAob3IgL1BJUEUpIC9DT05ORUNUIHRlbG5ldCBhYmNjb3JwLmNvbQorCisgICBvciwgZXF1aXZhbGVudGx5OgorCisgIFBUWSAob3IgUElQRSkgdGVsbmV0IGFiY2NvcnAuY29tCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAyLjcuMi4gQy1LZXJtaXQgb3ZlciBSbG9naW4KKworICAgQy1LZXJtaXQgaW5jbHVkZXMgaXRzIG93biBSbG9naW4gY2xpZW50LCBidXQgdGhpcyBjYW4gbm9ybWFsbHkgYmUgdXNlZAorICAgb25seSBpZiB5b3UgYXJlIHJvb3QsIHNpbmNlIHRoZSBybG9naW4gVENQIHBvcnQgaXMgcHJpdmlsZWdlZC4gQnV0CisgICBwdHlzIGFuZCBwaXBlcyBsZXQgeW91IG1ha2UgcmxvZ2luIGNvbm5lY3Rpb25zIHdpdGggQy1LZXJtaXQgdGhyb3VnaAorICAgeW91ciBjb21wdXRlcidzIGV4dGVybmFsIHJsb2dpbiBwcm9ncmFtLCB3aGljaCBpcyBub3JtYWxseSBpbnN0YWxsZWQKKyAgIGFzIGEgcHJpdmlsZWdlZCBwcm9ncmFtOgorCisgIFNFVCBQUkVGSVhJTkcgQUxMCisKKyAgIGFuZCB0aGVuOgorCisgIFNFVCBIT1NUIC9QVFkgKG9yIC9QSVBFKSAvQ09OTkVDVCBybG9naW4gLTggYWJjY29ycC5jb20KKworICAgb3IsIGVxdWl2YWxlbnRseToKKworICBQVFkgKG9yIFBJUEUpIHJsb2dpbiAtOCBhYmNjb3JwLmNvbQorCisgICBUaGUgIi04IiBvcHRpb24gdG8gcmxvZ2luIGVuYWJsZXMgdHJhbnNtaXNzaW9uIG9mIDgtYml0IGRhdGEuIElmIHRoaXMKKyAgIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gaW5jbHVkZSBTRVQgUEFSSVRZIFNQQUNFIGlmIHlvdSBpbnRlbmQgdG8KKyAgIHRyYW5zZmVyIGZpbGVzLgorCisgICBOb3RlIHRoYXQgdGhlIG5vcm1hbCBlc2NhcGUgc2VxdWVuY2UgZm9yIHJsb2dpbiBpcyBDYXJyaWFnZSBSZXR1cm4KKyAgIGZvbGxvd2VkIGJ5IFRpbGRlICh+KSwgYnV0IG9ubHkgd2hlbiB0aGUgdGlsZGUgaXMgZm9sbG93ZWQgYnkgY2VydGFpbgorICAgb3RoZXIgY2hhcmFjdGVyczsgdGhlIGV4YWN0IGJlaGF2aW9yIGRlcGVuZHMgb24geW91ciBybG9naW4gY2xpZW50LCBzbworICAgcmVhZCBpdHMgZG9jdW1lbnRhdGlvbi4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDIuNy4zLiBDLUtlcm1pdCBvdmVyIFNlcmlhbCBDb21tdW5pY2F0aW9uIFByb2dyYW1zCisKKyAgIFB0eXMgYW5kIHBpcGVzIGFsc28gbGV0IHlvdSB1c2UgcHJvZ3JhbXMgdGhhdCBtYWtlIHNlcmlhbCBjb25uZWN0aW9ucywKKyAgIHN1Y2ggYXMgY3Ugb3IgdGlwLiBGb3IgZXhhbXBsZSwgQy1LZXJtaXQgY2FuIGJlIHVzZWQgdGhyb3VnaCBjdSB0bworICAgbWFrZSBjb25uZWN0aW9ucyB0aGF0IG90aGVyd2lzZSBtaWdodCBub3QgYmUgYWxsb3dlZCwgZS5nLiBiZWNhdXNlCisgICBDLUtlcm1pdCBpcyBub3QgaW5zdGFsbGVkIHdpdGggdGhlIHJlcXVpcmVkIHdyaXRlIHBlcm1pc3Npb25zIHRvIHRoZQorICAgZGlhbG91dCBkZXZpY2UgYW5kIHRoZSBVVUNQIGxvY2tmaWxlIGRpcmVjdG9yeS4KKworICAgU3VwcG9zZSB5b3VyIFVVQ1AgRGV2aWNlcyBmaWxlIGNvbnRhaW5zIGFuIGVudHJ5IGZvciBhIHNlcmlhbCBkZXZpY2UKKyAgIHR0eTA0IHRvIGJlIHVzZWQgZm9yIGRpcmVjdCBjb25uZWN0aW9ucywgYnV0IHRoaXMgZGV2aWNlIGlzIHByb3RlY3RlZAorICAgYWdhaW5zdCB5b3UgKGFuZCBLZXJtaXQgd2hlbiB5b3UgcnVuIGl0KS4gSW4gdGhpcyBjYXNlIHlvdSBjYW46CisKKyAgU0VUIENPTlRST0wgUFJFRklYIEFMTAorICBQVFkgKG9yIFBJUEUpIGN1IC1sIHR0eTA0CisKKyAgIChTaW1pbGFybHkgZm9yIGRpYWxvdXQgZGV2aWNlcywgZXhjZXB0IHRoZW4geW91IGFsc28gbmVlZCB0byBpbmNsdWRlCisgICB0aGUgcGhvbmUgbnVtYmVyIGluIHRoZSAiY3UiIGNvbW1hbmQuKQorCisgICBBcyB3aXRoIG90aGVyIGNvbW11bmljYXRpb24gcHJvZ3JhbXMsIHdhdGNoIG91dCBmb3IgY3UncyBlc2NhcGUKKyAgIHNlcXVlbmNlLCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgcmxvZ2luIHByb2dyYW0nczogQ2FycmlhZ2UgUmV0dXJuCisgICBmb2xsb3dlZCBieSBUaWxkZSAoZm9sbG93ZWQgYnkgYW5vdGhlciBjaGFyYWN0ZXIgdG8gc3BlY2lmeSBhbiBhY3Rpb24sCisgICBsaWtlICIuIiBmb3IgY2xvc2luZyB0aGUgY29ubmVjdGlvbiBhbmQgZXhpdGluZyBmcm9tIGN1KS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDIuNy40LiBDLUtlcm1pdCBvdmVyIFNlY3VyZSBOZXR3b3JrIENsaWVudHMKKworICAgICBESVNDTEFJTUVSOiBUaGVyZSBhcmUgbGF3cyBpbiB0aGUgVVNBIGFuZCBvdGhlciBjb3VudHJpZXMgcmVnYXJkaW5nCisgICAgIHVzZSwgaW1wb3J0LCBhbmQvb3IgZXhwb3J0IG9mIGVuY3J5cHRpb24gYW5kL29yIGRlY3J5cHRpb24gb3Igb3RoZXIKKyAgICAgZm9ybXMgb2Ygc2VjdXJpdHkgc29mdHdhcmUsIGFsZ29yaXRobXMsIHRlY2hub2xvZ3ksIGFuZAorICAgICBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIFRoZSBLZXJtaXQgUHJvamVjdCBhdHRlbXB0cyB0byBmb2xsb3cgYWxsCisgICAgIGtub3duIHN0YXR1dGVzLCBhbmQgbmVpdGhlciBpbnRlbmRzIG5vciBzdWdnZXN0cyB0aGF0IEtlcm1pdAorICAgICBzb2Z0d2FyZSBjYW4gb3Igc2hvdWxkIGJlIHVzZWQgaW4gYW55IHdheSwgaW4gYW55IGxvY2F0aW9uLCB0aGF0CisgICAgIGNpcmN1bXZlbnRzIGFueSByZWd1bGF0aW9ucywgbGF3cywgdHJlYXRpZXMsIGNvdmVuYW50cywgb3Igb3RoZXIKKyAgICAgbGVnaXRpbWF0ZSBjYW5vbnMgb3IgaW5zdHJ1bWVudHMgb2YgbGF3LCBpbnRlcm5hdGlvbmFsIHJlbGF0aW9ucywKKyAgICAgdHJhZGUsIGV0aGljcywgb3IgcHJvcHJpZXR5LgorCisgICBGb3Igc2VjdXJlIGNvbm5lY3Rpb25zIG9yIGNvbm5lY3Rpb25zIHRocm91Z2ggZmlyZXdhbGxzLCBDLUtlcm1pdCA3LjAKKyAgIGNhbiBiZSBhIEtlcmJlcm9zLCBTUlAsIGFuZC9vciBTT0NLUyBjbGllbnQgd2hlbiBidWlsdCB3aXRoIHRoZQorICAgYXBwcm9wcmlhdGUgb3B0aW9ucyBhbmQgbGlicmFyaWVzLiBCdXQgb3RoZXIgYXBwbGljYXRpb24tbGV2ZWwKKyAgIHNlY3VyaXR5IGFjcm9ueW1zIGFuZCBtZXRob2RzIC0tIFNTSCwgU1NMLCBTUlAsIFRMUyAtLSBwb3AgdXAgYXQgYW4KKyAgIGFsYXJtaW5nIHJhdGUgYW5kIGFyZSAoYSkgaW1wb3NzaWJsZSB0byBrZWVwIHVwIHdpdGgsIChiKSB1c3VhbGx5CisgICBtdXR1YWxseSBpbmNvbXBhdGlibGUsIGFuZCAoYykgaGF2ZSByZXN0cmljdGlvbnMgb24gZXhwb3J0IG9yCisgICByZWRpc3RyaWJ1dGlvbiBhbmQgc28gY2Fubm90IGJlIGluY2x1ZGVkIGluIEMtS2VybWl0IGl0c2VsZi4KKworICAgSG93ZXZlciwgaWYgeW91IGhhdmUgYSBzZWN1cmUgdGV4dC1iYXNlZCBUZWxuZXQgKG9yIG90aGVyKSBjbGllbnQgdGhhdAorICAgZW1wbG95cyBvbmUgb2YgdGhlc2Ugc2VjdXJpdHkgbWV0aG9kcywgeW91IGNhbiB1c2UgQy1LZXJtaXQgInRocm91Z2giCisgICBpdCB2aWEgYSBwdHkgb3IgcGlwZS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDIuNy40LjEuIFNTSAorCisgICBDLUtlcm1pdCBkb2VzIG5vdCBhbmQgY2FuIG5vdCBpbmNvcnBvcmF0ZSBTU0ggZHVlIHRvIGxpY2Vuc2luZywKKyAgIHBhdGVudCwgYW5kIFVTQSBleHBvcnQgbGF3IHJlc3RyaWN0aW9ucy4KKworICAgVGhlIFVOSVggU1NIIGNsaWVudCBkb2VzIG5vdCB1c2Ugc3RhbmRhcmQgaW5wdXQvb3V0cHV0LCBhbmQgdGhlcmVmb3JlCisgICBjYW4gYmUgdXNlZCBvbmx5IGJ5IEtlcm1pdCdzIFBUWSBpbnRlcmZhY2UsIGlmIG9uZSBpcyBwcmVzZW50LiBUaGUKKyAgIGNhdXRpb25zIGFib3V0IGZpbGUgdHJhbnNmZXIsIGV0YywgYXJlIHRoZSBzYW1lIGFzIGZvciBSbG9naW4uCisgICBFeGFtcGxlOgorCisgIFNFVCBQUkVGSVhJTkcgQUxMCisgIFBUWSBzc2ggWFlaQ09SUC5DT00KKworICAgT3IsIGZvciBhIHNjcmlwdGVkIHNlc3Npb246CisKKyAgU0VUIFBSRUZJWElORyBBTEwKKyAgU0VUIEhPU1QgL1BUWSBzc2ggWFlaQ09SUC5DT00KKworICAgSGludDoKKworICBkZWZpbmUgc3NoIHsKKyAgICAgIGNoZWNrIHB0eQorICAgICAgaWYgZmFpbCBlbmQgMSBTb3JyeSAtIG5vIFBUWSBzdXBwb3J0Li4uCisgICAgICBwdHkgc3NoIFwlKgorICB9CisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAyLjcuNC4yLiBTU0wKKworICAgU2VjdXJlIFNvY2tldHMgTGF5ZXIgKFNTTCkgaXMgYW5vdGhlciBUQ1AvSVAgc2VjdXJpdHkgb3ZlcmxheSwgdGhpcworICAgb25lIGRlc2lnbmVkIGJ5IGFuZCBmb3IgTmV0c2NhcGUuIEFuIFNTTCBUZWxuZXQgY2xpZW50IGlzIGF2YWlsYWJsZQorICAgZm9yIFVOSVggZnJvbSB0aGUgVW5pdmVyc2l0eSBvZiBRdWVlbnNsYW5kLiBNb3JlIGluZm8gYXQ6CisKKyAgWzQxMF1odHRwOi8vd3d3LnBzeS51cS5vei5hdS9+ZnRwL0NyeXB0by8KKworICAgSW50ZXJvcGVyYWJpbGl0eSB3aXRoIEMtS2VybWl0IGlzIHVua25vd24uIEMtS2VybWl0IGFsc28gaW5jbHVkZXMgaXRzCisgICBvd24gYnVpbHQtaW4gU1NML1RMUyBzdXBwb3J0LCBidXQgaXQgaXMgbm90IGV4cG9ydGFibGU7IFs0MTFdQ0xJQ0sKKyAgIEhFUkUgZmlsZSBmb3IgZGV0YWlscy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDIuNy40LjMuIFNSUAorCisgICBTUlAoVE0pIGlzIFN0YW5mb3JkIFVuaXZlcnNpdHkncyBTZWN1cmUgUmVtb3RlIFBhc3N3b3JkIHByb3RvY29sLiBBbgorICAgU1JQIFRlbG5ldCBjbGllbnQgaXMgYXZhaWxhYmxlIGZyb20gU3RhbmZvcmQ6CisKKyAgWzQxMl1odHRwOi8vc3JwLnN0YW5mb3JkLmVkdS9zcnAvCisKKyAgIFN0YW5mb3JkJ3MgU1JQIFRlbG5ldCBjbGllbnQgZm9yIFVOSVggaGFzIGJlZW4gdGVzdGVkIG9uIFN1bk9TIGFuZAorICAgd29ya3MgZmluZSB3aXRoIEMtS2VybWl0LCBhcyBkZXNjcmliZWQgaW4gWzQxM11TZWN0aW9uIDIuNy4xLCBlLmcuCisKKyAgU0VUIFBSRUZJWCBBTEwKKyAgUFRZIChvciBQSVBFKSBzcnAtdGVsbmV0IHhlbm9uLnN0YW5mb3JkLmVkdQorCisgICBDLUtlcm1pdCBpdHNlbGYgY2FuIGJlIGJ1aWx0IGFzIGFuIFNSUCBUZWxuZXQgY2xpZW50IG9uIHN5c3RlbXMgdGhhdAorICAgaGF2ZSBsaWJzcnAuYSBpbnN0YWxsZWQ7IHRoZSBDLUtlcm1pdCBzdXBwb3J0IGNvZGUsIGhvd2V2ZXIsIG1heSBub3QKKyAgIGJlIGV4cG9ydGVkIG91dHNpZGUgdGhlIFVTQSBvciBDYW5hZGEuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAyLjcuNC40LiBTT0NLUworCisgICBDLUtlcm1pdCBjYW4gYmUgYnVpbHQgYXMgYSBTT0NLUy1hd2FyZSBjbGllbnQgb24gc3lzdGVtcyB0aGF0IGhhdmUgYQorICAgU09DS1MgbGlicmFyeS4gU2VlIHNlY3Rpb24gOC4xLjEgb2YgdGhlIFs0MTRdY2tjY2ZnLnR4dCBmaWxlLgorCisgICBDLUtlcm1pdCA3LjAgY2FuIGFsc28gYmUgcnVuIG92ZXIgU09DS1NpZmllZCBUZWxuZXQgb3IgcmxvZ2luIGNsaWVudHMKKyAgIHdpdGggU0VUIE5FVFdPUksgVFlQRSBDT01NQU5ELiBTdXBwb3NlIHRoZSBUZWxuZXQgcHJvZ3JhbSBvbiB5b3VyCisgICBzeXN0ZW0gaXMgU09DS1MgZW5hYmxlZCBidXQgQy1LZXJtaXQgaXMgbm90LiBNYWtlIEtlcm1pdCBjb25uZWN0aW9ucworICAgbGlrZSB0aGlzOgorCisgIFNFVCBQUkVGSVggQUxMCisgIFBUWSAob3IgUElQRSkgdGVsbmV0IHp6ei5jb20KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDIuNy40LjUuIEtlcmJlcm9zCisKKyAgIFVOSVggQy1LZXJtaXQgY2FuIGJlIGJ1aWx0IHdpdGggTUlUIEtlcmJlcm9zIElWIG9yIFYgYXV0aGVudGljYXRpb24KKyAgIGFuZCBlbmNyeXB0aW9uLiBJbnN0cnVjdGlvbnMgYXJlIGF2YWlsYWJsZSBpbiBhIFs0MTVdc2VwYXJhdGUKKyAgIGRvY3VtZW50LiBBZGRpdGlvbmFsIG1vZHVsZXMgYXJlIHJlcXVpcmVkIHRoYXQgY2FuIG5vdCBiZSBleHBvcnRlZAorICAgZnJvbSB0aGUgVVNBIHRvIGFueSBjb3VudHJ5IGV4Y2VwdCBDYW5hZGEsIGJ5IFVTIGxhdy4KKworICAgSWYgeW91IGhhdmUgS2VyYmVyb3MgaW5zdGFsbGVkIGJ1dCB5b3UgZG9uJ3QgaGF2ZSBhIEtlcmJlcml6ZWQgdmVyc2lvbgorICAgb2YgQy1LZXJtaXQsIHlvdSBjYW4gdXNlIGt0ZWxuZXQgYXMgQy1LZXJtaXQncyBleHRlcm5hbCBjb21tdW5pY2F0aW9ucworICAgcHJvZ3JhbSB0byBtYWtlIHNlY3VyZSBjb25uZWN0aW9ucyB3aXRob3V0IGdpdmluZyB1cCBDLUtlcm1pdCdzCisgICBzZXJ2aWNlczoKKworICBTRVQgUFJFRklYIEFMTAorICBQVFkgKG9yIFBJUEUpIGt0ZWxuZXQgY2lhLmdvdgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDIuOC4gU2NyaXB0aW5nIExvY2FsIFByb2dyYW1zCisKKyAgIElmIHlvdXIgdmVyc2lvbiBvZiBLZXJtaXQgaGFzIFBUWSBzdXBwb3J0IGJ1aWx0IGluLCB0aGVuIGFueQorICAgdGV4dC1iYXNlZCBwcm9ncmFtIGNhbiBiZSBpbnZva2VkIHdpdGggU0VUIEhPU1QgL1BUWSBvciBlcXVpdmFsZW50CisgICBjb21tYW5kIGFuZCBjb250cm9sbGVkIHVzaW5nIHRoZSBub3JtYWwgc2VxdWVuY2Ugb2YgT1VUUFVULCBJTlBVVCwgSUYKKyAgIFNVQ0NFU1MgY29tbWFuZHMgKHRoaXMgaXMgdGhlIHNhbWUgc2VydmljZSB0aGF0IGlzIHByb3ZpZGVkIGJ5IHRoZQorICAgJ2V4cGVjdCcgcHJvZ3JhbSwgYnV0IGNvbnRyb2xsZWQgYnkgdGhlIEtlcm1pdCBzY3JpcHQgbGFuZ3VhZ2UgcmF0aGVyCisgICB0aGFuIFRjbCkuCisKKyAgIFdoZW4gUFRZIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBhbnkgcHJvZ3JhbSB0aGF0IHVzZXMgc3RhbmRhcmQKKyAgIGlucHV0IGFuZCBvdXRwdXQgY2FuIGJlIGludm9rZWQgd2l0aCBTRVQgSE9TVCAvUElQRS4KKworICAgSGVyZSdzIGFuIGV4YW1wbGUgaW4gd2hpY2ggd2Ugc3RhcnQgYW4gZXh0ZXJuYWwgS2VybWl0IHByb2dyYW0sIHdhaXQKKyAgIGZvciBpdHMgcHJvbXB0LCBnaXZlIGl0IGEgVkVSU0lPTiBjb21tYW5kLCBhbmQgdGhlbiBleHRyYWN0IHRoZQorICAgbnVtZXJpYyB2ZXJzaW9uIG51bWJlciBmcm9tIGl0cyByZXNwb25zZToKKworICBzZXQgaG9zdCAvcHR5IGtlcm1pdCAtWQorICBpZiBmYWlsIHN0b3AgMSB7Q2FuJ3Qgc3RhcnQgZXh0ZXJuYWwgY29tbWFuZH0KKyAgaW5wdXQgMTAgQy1LZXJtaXQ+CisgIGlmIGZhaWwgc3RvcCAxIHtObyBDLUtlcm1pdD4gcHJvbXB0fQorICBvdXRwdXQgdmVyc2lvblwxMworICBpbnB1dCAxMCB7TnVtZXJpYzogfQorICBpZiBmYWlsIHN0b3AgMSB7Tm8gbWF0Y2ggZm9yICJOdW1lcmljOiJ9CisgIGNsZWFyIGlucHV0CisgIGlucHV0IDEwIFwxMAorICBlY2hvIFZFUlNJT04gPSAiXGZzdWJzdHIoXHYoaW5wdXQpLDEsNikiCisgIG91dHB1dCBleGl0XDEzCisKKyAgIFRoaXMgdGVjaG5pcXVlIGNvdWxkIGJlIHVzZWQgdG8gY29udHJvbCBhbnkgb3RoZXIgaW50ZXJhY3RpdmUgcHJvZ3JhbSwKKyAgIGV2ZW4gdGhvc2UgdGhhdCBkbyBzY3JlZW4gZm9ybWF0dGluZyAobGlrZSBFbWFjcyBvciBWaSksIGlmIHlvdSBjYW4KKyAgIGZpZ3VyZSBvdXQgdGhlIHNlcXVlbmNlIG9mIGV2ZW50cy4gSWYgeW91ciBLZXJtaXQgcHJvZ3JhbSBkb2Vzbid0IGhhdmUKKyAgIFBUWSBzdXBwb3J0LCB0aGVuIHRoZSBjb21tYW5kcyBhcmUgcmVzdHJpY3RlZCB0byB0aG9zZSB1c2luZyBzdGFuZGFyZAorICAgaS9vLCBpbmNsdWRpbmcgY2VydGFpbiBzaGVsbHMsIGludGVyYWN0aXZlIHRleHQtbW9kZSAiaGFyZGNvcHkiCisgICBlZGl0b3JzIGxpa2UgZXgsIGFuZCBzbyBvbi4KKworICAgSWYgeW91IGFyZSB1c2luZyB0aGUgUFRZIGludGVyZmFjZSwgeW91IHNob3VsZCBiZSBhd2FyZSB0aGF0IGl0IHJ1bnMKKyAgIHRoZSBnaXZlbiBwcm9ncmFtIG9yIGNvbW1hbmQgZGlyZWN0bHkgb24gdGhlIHB0eSwgd2l0aG91dCBhbnkKKyAgIGludGVydmVuaW5nIHNoZWxsIHRvIGludGVycHJldCBtZXRhY2hhcmFjdGVycywgcmVkaXJlY3RvcnMsIGV0Yy4gSWYKKyAgIHlvdSBuZWVkIHRoaXMgc29ydCBvZiB0aGluZywgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgc2hlbGwgaW52b2NhdGlvbgorICAgYXMgcGFydCBvZiB5b3VyIGNvbW1hbmQ7IGZvciBleGFtcGxlOgorCisgIHB0eSBlY2hvICoKKworICAganVzdCBlY2hvZXMgIioiOyB3aGVyZWFzOgorCisgIHB0eSBrc2ggLWMgImVjaG8gKiIKKworICAgZWNob2VzIGFsbCB0aGUgZmlsZW5hbWVzIHRoYXQga3NoIGZpbmRzIG1hdGNoaW5nICIqIi4KKworICAgU2ltaWxhcmx5IGZvciByZWRpcmVjdGlvbjoKKworICBzZXQgaG9zdCAvcHR5IGtzaCAtYyAiY2F0ID4gZm9vIiAgOyBOb3RlOiB1c2Ugc2hlbGwgcXVvdGluZyBydWxlcyBoZXJlCisgIHNldCB0cmFuc21pdCBlb2YgXDQKKyAgdHJhbnNtaXQgYmFyCisKKyAgIEFuZCBmb3IgdGhhdCBtYXR0ZXIsIGZvciBidWlsdC1pbiBzaGVsbCBjb21tYW5kczoKKworICBzZXQgaG9zdCAvcHR5IGtzaCAtYyAiZm9yIGkgaW4gKjsgZG8gZWNobyAkaTsgZG9uZSIKKworICAgVGhlIFBJUEUgaW50ZXJmYWNlLCBvbiB0aGUgb3RoZXIgaGFuZCwgaW52b2tlcyB0aGUgc2hlbGwKKyAgIGF1dG9tYXRpY2FsbHksIHNvOgorCisgIHBpcGUgZWNobyAqCisKKyAgIHByaW50cyBmaWxlbmFtZXMsIG5vdCAiKiIuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMi45LiBYLjI1IE5ldHdvcmtpbmcKKworICAgWC4yNSBuZXR3b3JraW5nIGlzIGRvY3VtZW50ZWQgaW4gWzQxNl1Vc2luZyBDLUtlcm1pdCwgMm5kIEVkaXRpb24uCisgICBXaGVuIHRoZSBib29rIHdhcyBwdWJsaXNoZWQsIFguMjUgd2FzIGF2YWlsYWJsZSBvbmx5IGluIFN1bk9TLAorICAgU29sYXJpcywgYW5kIFN0cmF0dXMgVk9TLiBVbmxpa2UgVENQL0lQLCBYLjI1IEFQSXMgYXJlIG5vdAorICAgc3RhbmRhcmRpemVkOyBlYWNoIHZlbmRvcidzIFguMjUgbGlicmFyaWVzIGFuZCBzZXJ2aWNlcyAoaWYgdGhleSBoYXZlCisgICB0aGVtIGF0IGFsbCkgYXJlIHVuaXF1ZS4KKworICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBuZXcgYWRkaXRpb25zLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMi45LjEuIElCTSBBSVhMaW5rL1guMjUgTmV0d29yayBQcm92aWRlciBJbnRlcmZhY2UgZm9yIEFJWAorCisgICBTdXBwb3J0IGZvciBYLjI1IHdhcyBhZGRlZCB2aWEgSUJNJ3MgTmV0d29yayBQcm92aWRlciBJbnRlcmZhY2UgKE5QSSksCisgICBBSVhMaW5rL1guMjUgMS4xLCB0byB0aGUgQUlYIDQueCB2ZXJzaW9uIG9mIEMtS2VybWl0IDcuMC4KKyAgIFVuZm9ydHVuYXRlbHksIEFJWExpbmsvWC4yNSBpcyBhIHJhdGhlciBiYXJlLWJvbmVzIGZhY2lsaXR5LCBsYWNraW5nCisgICBpbiBwYXJ0aWN1bGFyIGFueSBmb3JtIG9mIFBBRCBzdXBwb3J0IChYLjMsIFguMjgsIFguMjkpLiBUaHVzLCB0aGUgQUlYCisgICB2ZXJzaW9uIG9mIEMtS2VybWl0LCB3aGVuIGJ1aWx0IHRvIGluY2x1ZGUgWC4yNSBuZXR3b3JraW5nLCBoYXMKKyAgIG5laXRoZXIgYSBQQUQgY29tbWFuZCwgbm9yIGEgU0VUIFBBRCBjb21tYW5kLiBUaGUgc2FtZSBpcyB0cnVlIGZvciB0aGUKKyAgIHVuZGVybHlpbmcgQUlYIHN5c3RlbTogbm8gUEFEIHN1cHBvcnQuIFRodXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUKKyAgIGFuIGludGVyYWN0aXZlIHNoZWxsIHNlc3Npb24gb3ZlciBhbiBYLjI1IGNvbm5lY3Rpb24gaW50byBhbiBBSVgKKyAgIHN5c3RlbSAoYXMgZmFyIGFzIHdlIGtub3cpLCBldmVuIGZyb20gWC4yNS1jYXBhYmxlIEtlcm1pdCB2ZXJzaW9ucworICAgKHN1Y2ggYXMgU29sYXJpcyBvciBWT1MpIHRoYXQgZG8gaW5jbHVkZSBQQUQgc3VwcG9ydC4KKworICAgVGh1cyB0aGUgWC4yNSBjYXBhYmlsaXRpZXMgaW4gQUlYIEMtS2VybWl0IGFyZSBsaW1pdGVkIHRvIHBlZXItdG8tcGVlcgorICAgY29ubmVjdGlvbnMsIGUuZy4gZnJvbSBhIEMtS2VybWl0IGNsaWVudCB0byBhIEMtS2VybWl0IHNlcnZlci4gVW5saWtlCisgICB0aGUgU29sYXJpcywgU3VuT1MsIGFuZCBWT1MgdmVyc2lvbnMsIHRoZSBBSVggdmVyc2lvbiBjYW4gYWNjZXB0CisgICBpbmNvbWluZyBYLjI1IGNvbm5lY3Rpb25zOgorCisgIHNldCBuZXR3b3JrIHR5cGUgeC4yNQorICBpZiBmYWlsIHN0b3AgMSBTb3JyeSAtIG5vIFguMjUgc3VwcG9ydAorICA7IFB1dCBhbnkgZGVzaXJlZCBESVNBQkxFIG9yIEVOQUJMRSBvciBTRVQgY29tbWFuZHMgaGVyZS4KKyAgc2V0IGhvc3QgL3NlcnZlciAqCisgIGlmIGZhaWwgc3RvcCAxIFguMjUgInNldCBob3N0ICoiIGZhaWxlZAorCisgICBBbmQgdGhlbiBhY2Nlc3MgaXQgZnJvbSB0aGUgY2xpZW50IGFzIGZvbGxvd3M6CisKKyAgc2V0IG5ldHdvcmsgdHlwZSB4LjI1CisgIGlmIGZhaWwgc3RvcCAxIFNvcnJ5IC0gbm8gWC4yNSBzdXBwb3J0CisgIHNldCBob3N0IHh4eHh4eHggOyBTcGVjaWZ5IHRoZSBYLjI1L1guMTIxIGFkZHJlc3MKKyAgaWYgZmFpbCBzdG9wIDEgQ2FuJ3Qgb3BlbiBjb25uZWN0aW9uCisKKyAgIEFuZCBhdCB0aGlzIHBvaW50IHRoZSBjbGllbnQgY2FuIHVzZSB0aGUgZnVsbCByYW5nZSBvZiBjbGllbnQKKyAgIGNvbW1hbmRzOiBTRU5ELCBHRVQsIFJFTU9URSB4eHgsIEZJTklTSCwgQllFLgorCisgICBUaGUgQUlYIHZlcnNpb24gYWxzbyBhZGRzIHR3byBuZXcgdmFyaWFibGVzOgorCisgICBcdih4MjVsb2NhbF9udWEpCisgICAgICAgICAgVGhlIGxvY2FsIFguMjUgYWRkcmVzcy4KKworICAgXHYoeDI1cmVtb3RlX251YSkKKyAgICAgICAgICBUaGUgWC4yNSBhZGRyZXNzIG9mIHRoZSBob3N0IG9uIHRoZSBvdGhlciBlbmQgb2YgdGhlCisgICAgICAgICAgY29ubmVjdGlvbi4KKworICAgQy1LZXJtaXQncyBBSVggWC4yNSBjbGllbnQgaGFzIG5vdCBiZWVuIHRlc3RlZCBhZ2FpbnN0IGFueXRoaW5nIG90aGVyCisgICB0aGFuIGEgQy1LZXJtaXQgWC4yNSBzZXJ2ZXIgb24gQUlYLiBJdCBpcyBub3Qga25vd24gaWYgaXQgd2lsbAorICAgaW50ZXJvcGVyYXRlIHdpdGggQy1LZXJtaXQgc2VydmVycyBvbiBTb2xhcmlzLCBTdW5PUywgb3IgVk9TLgorCisgICBUbyBtYWtlIGFuIFguMjUgY29ubmVjdGlvbiBmcm9tIEFJWCBDLUtlcm1pdCwgeW91IG11c3Q6CisKKyAgc2V0IHgyNSBjYWxsLXVzZXItZGF0YSB4eHh4CisKKyAgIHdoZXJlIHh4eHggY2FuIGJlIGFueSBldmVuLWxlbmd0aCBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzLCBlLmcuCisgICAxMjNBQkMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAyLjkuMi4gSFAtVVggWC4yNQorCisgICBBbHRob3VnaCBDLUtlcm1pdCBwcmVzZW50bHkgZG9lcyBub3QgaW5jbHVkZSBidWlsdC1pbiBzdXBwb3J0IGZvcgorICAgSFAtVVggWC4yNSwgaXQgY2FuIHN0aWxsIGJlIHVzZWQgdG8gbWFrZSBYLjI1IGNvbm5lY3Rpb25zIGFzIGZvbGxvd3M6CisgICBzdGFydCBLZXJtaXQgYW5kIHRlbGwgaXQgdG86CisKKyAgc2V0IHByZWZpeGluZyBhbGwKKyAgc2V0IHBhcml0eSBzcGFjZQorICBwdHkgcGFkZW0gYWRkcmVzcworCisgICBUaGlzIHNob3VsZCB3b3JrIGluIEhQLVVYIDkuMDAgYW5kIGxhdGVyIChzZWUgWzQxN11TZWN0aW9uIDIuNykuIElmCisgICB5b3UgaGF2ZSBhbiBlYXJsaWVyIEhQLVVYIHZlcnNpb24sIG9yIHRoZSBQVFkgaW50ZXJmYWNlIGRvZXNuJ3Qgd29yaworICAgb3IgaXNuJ3QgYXZhaWxhYmxlLCB0cnk6CisKKyAgc2V0IHByZWZpeGluZyBhbGwKKyAgc2V0IHBhcml0eSBzcGFjZQorICBwaXBlIHBhZGVtIGFkZHJlc3MKKworICAgRmFpbGluZyB0aGF0LCB1c2UgS2VybWl0IHRvIHRlbG5ldCB0byBsb2NhbGhvc3QgYW5kIHRoZW4gYWZ0ZXIgbG9nZ2luZworICAgYmFjayBpbiwgc3RhcnQgcGFkZW0gYXMgeW91IHdvdWxkIG5vcm1hbGx5IGRvIHRvIGNvbm5lY3Qgb3ZlciBYLjI1LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDIuMTAuIEFkZGl0aW9uYWwgU2VyaWFsIFBvcnQgQ29udHJvbHMKKworICAgQy1LZXJtaXQgNy4wIGFkZHMgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBmb3IgZ3JlYXRlciBjb250cm9sIG92ZXIKKyAgIHNlcmlhbCBwb3J0cy4gVGhlc2UgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBvbmx5IGluIEMtS2VybWl0IHZlcnNpb25zCisgICB3aG9zZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW1zIHByb3ZpZGUgdGhlIGNvcnJlc3BvbmRpbmcgc2VydmljZXMKKyAgIChzdWNoIGFzIFBPU0lYIGFuZCBVTklYIFN5c3RlbSBWKSwgYW5kIGV2ZW4gdGhlbiB0aGVpciBzdWNjZXNzZnVsCisgICBvcGVyYXRpb24gZGVwZW5kcyBvbiB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBzcGVjaWZpYyBkZXZpY2UgYW5kCisgICBkcml2ZXIuCisKKyAgIFNFVCBESVNDT05ORUNUIHsgT04sIE9GRiB9CisgICAgICAgICAgT24gYSBTRVQgTElORSBvciBTRVQgUE9SVCBjb25uZWN0aW9uIHdpdGggU0VUIENBUlJJRVIgT04gb3IKKyAgICAgICAgICBBVVRPLCBpZiB0aGUgY2FycmllciBzaWduYWwgZHJvcHMgZHVyaW5nIHRoZSBjb25uZWN0aW9uLAorICAgICAgICAgIGluZGljYXRpbmcgdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBsb3N0LCBhbmQgQy1LZXJtaXQKKyAgICAgICAgICBub3RpY2VzIGl0LCB0aGlzIHNldHRpbmcgZ292ZXJucyB3aGF0IGhhcHBlbnMgbmV4dC4gV2l0aCBTRVQKKyAgICAgICAgICBESVNDT05ORUNUIE9GRiwgd2hpY2ggaXMgY29uc2lzdGVudCB3aXRoIHByZXZpb3VzIGJlaGF2aW9yLCBhbmQKKyAgICAgICAgICB0aGVyZWZvcmUgdGhlIGRlZmF1bHQsIEMtS2VybWl0IGNvbnRpbnVlcyB0byBrZWVwIHRoZSBkZXZpY2UKKyAgICAgICAgICBvcGVuIGFuZCBhbGxvY2F0ZWQuIFdpdGggU0VUIERJU0NPTk5FQ1QgT04sIEMtS2VybWl0CisgICAgICAgICAgYXV0b21hdGljYWxseSBjbG9zZXMgYW5kIHJlbGVhc2VzIHRoZSBkZXZpY2Ugd2hlbiBpdCBzZW5zZXMgYQorICAgICAgICAgIGNhcnJpZXIgb24tdG8tb2ZmIHRyYW5zaXRpb24sIHRodXMgYWxsb3dpbmcgb3RoZXJzIHRvIHVzZSBpdC4KKyAgICAgICAgICBIb3dldmVyLCBpdCByZW1haW5zIHRoZSBkZWZhdWx0IGRldmljZSBmb3IgaS9vIChESUFMLCBSRURJQUwsCisgICAgICAgICAgSU5QVVQsIFNFTkQsIENPTk5FQ1QsIGV0YyksIHNvIGlmIGEgc3Vic2VxdWVudCBpL28gY29tbWFuZCBpcworICAgICAgICAgIGdpdmVuLCB0aGUgZGV2aWNlIGlzIHJlb3BlbmVkIGlmIGl0IGlzIHN0aWxsIGF2YWlsYWJsZS4gV2hlbiBpdAorICAgICAgICAgIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgY2xvc2VkIGluIHRoaXMgbWFubmVyLCBTSE9XCisgICAgICAgICAgQ09NTVVOSUNBVElPTlMgcHV0cyAiKGNsb3NlZCkiIGFmdGVyIGl0cyBuYW1lLCBhbmQgaW4gVU5JWCwgdGhlCisgICAgICAgICAgbG9ja2ZpbGUgZGlzYXBwZWFycyAtLSBib3RoIGZyb20gU0hPVyBDT01NIGFuZCBmcm9tIHRoZQorICAgICAgICAgIGxvY2tmaWxlIGRpcmVjdG9yeSBpdHNlbGYuIFN5bm9ueW06IFNFVCBDTE9TRS1PTi1ESVNDT05ORUNULgorCisgICBTRVQgRVhJVCBPTi1ESVNDT05ORUNUIHsgT04sIE9GRiB9CisgICAgICAgICAgTGlrZSBESVNDT05ORUNULCBidXQgbWFrZXMgdGhlIHByb2dyYW0gZXhpdCBpZiBhIGNvbm5lY3Rpb24KKyAgICAgICAgICBkcm9wcy4KKworICAgTm90ZSB0aGF0IFNFVCBDTE9TRS1PTi1ESVNDT05ORUNUIGFuZCBTRVQgRVhJVCBPTi1ESVNDT05ORUNUIGFwcGx5CisgICBvbmx5IHRvIGNvbm5lY3Rpb25zIHRoYXQgZHJvcDsgdGhleSBkbyBub3QgYXBwbHkgdG8gY29ubmVjdGlvbnMgdGhhdAorICAgY2FuJ3QgYmUgbWFkZSBpbiB0aGUgZmlyc3QgcGxhY2UuIEZvciBleGFtcGxlLCB0aGV5IGhhdmUgbm8gZWZmZWN0CisgICB3aGVuIGEgU0VUIExJTkUsIFNFVCBIT1NULCBURUxORVQsIG9yIERJQUwgY29tbWFuZCBmYWlscy4KKworICAgSEFOR1VQCisgICAgICAgICAgSWYgW0NMT1NFLU9OLV1ESVNDT05ORUNUIGlzIE9OLCBhbmQgdGhlIEhBTkdVUCBjb21tYW5kIGlzIGdpdmVuCisgICAgICAgICAgb24gYSBzZXJpYWwgZGV2aWNlLCBhbmQgdGhlIGNhcnJpZXIgc2lnbmFsIGlzIG5vIGxvbmdlciBwcmVzZW50CisgICAgICAgICAgYWZ0ZXIgdGhlIEhBTkdVUCBjb21tYW5kLCB0aGUgZGV2aWNlIGlzIGNsb3NlZCBhbmQgcmVsZWFzZWQuCisKKyAgIFNFVCBQQVJJVFkgSEFSRFdBUkUgeyBFVkVOLCBPREQgfQorICAgICAgICAgIFVubGlrZSBTRVQgUEFSSVRZIHsgRVZFTiwgT0RELCBNQVJLLCBTUEFDRSB9LCB3aGljaCBzZWxlY3RzIDcKKyAgICAgICAgICBkYXRhIGJpdHMgcGx1cyB0aGUgaW5kaWNhdGVkIGtpbmQgb2YgcGFyaXR5ICh0byBiZSBkb25lIGluCisgICAgICAgICAgc29mdHdhcmUgYnkgS2VybWl0IGl0c2VsZiksIFNFVCBQQVJJVFkgSEFSRFdBUkUgc2VsZWN0cyA4IGRhdGEKKyAgICAgICAgICBiaXRzIHBsdXMgZXZlbiBvciBvZGQgcGFyaXR5LCB0byBiZSBkb25lIGJ5IHRoZSB1bmRlcmx5aW5nCisgICAgICAgICAgaGFyZHdhcmUsIG9wZXJhdGluZyBzeXN0ZW0sIG9yIGRldmljZSBkcml2ZXIuIFRoaXMgY29tbWFuZCBpcworICAgICAgICAgIGVmZmVjdGl2ZSBvbmx5IHdpdGggYSBTRVQgTElORSBvciBTRVQgUE9SVCBkZXZpY2UuIFRoYXQgaXMsIGl0CisgICAgICAgICAgaGFzIG5vIGVmZmVjdCBpbiByZW1vdGUgbW9kZSwgbm9yIG9uIG5ldHdvcmsgY29ubmVjdGlvbnMuIFRoZXJlCisgICAgICAgICAgaXMgcHJlc2VudGx5IG5vIG1ldGhvZCBmb3Igc2VsZWN0aW5nIDggZGF0YSBiaXRzIHBsdXMgbWFyayBvcgorICAgICAgICAgIHNwYWNlIHBhcml0eS4gSWYgaGFyZHdhcmUgcGFyaXR5IGlzIGluIGVmZmVjdCwgdGhlIHZhcmlhYmxlCisgICAgICAgICAgXHYoaHdwYXJpdHkpIGlzIHNldCB0byAiZXZlbiIgb3IgIm9kZCIuIE5vdGU6IHNvbWUgcGxhdGZvcm1zCisgICAgICAgICAgbWlnaHQgYWxzbyBzdXBwb3J0IHNldHRpbmdzIG9mIFNQQUNFLCBNQVJLLCBvciBOT05FLgorCisgICBTRVQgU1RPUC1CSVRTIHsgMSwgMiB9CisgICAgICAgICAgVGhpcyB0ZWxscyB0aGUgbnVtYmVyIG9mIDEtYml0cyB0byBpbnNlcnQgYWZ0ZXIgYW4gb3V0Ym91bmQKKyAgICAgICAgICBjaGFyYWN0ZXIncyBkYXRhIGFuZCBwYXJpdHkgYml0cywgdG8gc2VwYXJhdGUgaXQgZnJvbSB0aGUgbmV4dAorICAgICAgICAgIGNoYXJhY3Rlci4gTm9ybWFsbHkgMS4gQ2hvb3NpbmcgMiBzdG9wIGJpdHMgc2hvdWxkIGRvIG5vIGhhcm0sCisgICAgICAgICAgYnV0IHdpbGwgc2xvdyBkb3duIHNlcmlhbCB0cmFuc21pc3Npb24gYnkgYXBwcm94aW1hdGVseSAxMAorICAgICAgICAgIHBlcmNlbnQuIEhpc3RvcmljYWxseSwgMiBzdG9wIGJpdHMgd2VyZSB1c2VkIHdpdGggVGVsZXR5cGVzIChhdAorICAgICAgICAgIDExMCBicHMgb3IgYmVsb3cpIGZvciBwcmludC1oZWFkIHJlY292ZXJ5IHRpbWUuIFRoZXJlIGlzCisgICAgICAgICAgcHJlc2VudGx5IG5vIG1ldGhvZCBmb3IgY2hvb3NpbmcgYW55IG51bWJlciBvZiBzdG9wIGJpdHMKKyAgICAgICAgICBiZXNpZGVzIDEgYW5kIDIuCisKKyAgIFNFVCBTRVJJQUwgWyBkcHMgXQorICAgICAgICAgIGRwcyBzdGFuZHMgZm9yIERhdGEtYml0cywgUGFyaXR5LCBTdG9wLWJpdHMuIFRoaXMgaXMgdGhlCisgICAgICAgICAgbm90YXRpb24gZmFtaWxpYXIgdG8gbWFueSBwZW9wbGUgZm9yIHNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgN0UxLCA4TjEsIDdPMiwgZXRjLiBUaGUgZGF0YSBiaXRzIG51bWJlciBhbHNvIGJlY29tZXMgdGhlCisgICAgICAgICAgVEVSTUlOQUwgQllURVNJWkUgc2V0dGluZy4gVGhlIHNlY29uZCBjaGFyYWN0ZXIgaXMgRSBmb3IgRXZlbiwKKyAgICAgICAgICBPIGZvciBPZGQsIE0gZm9yIE1hcmssIFMgZm9yIFNwYWNlLCBvciBOIGZvciBOb25lLiBUaGUgbGlzdCBvZgorICAgICAgICAgIGF2YWlsYWJsZSBvcHRpb25zIGRlcGVuZHMgb24gdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgc3BlY2lmaWMKKyAgICAgICAgICBwbGF0Zm9ybS4gSWYgZHBzIGlzIG9taXR0ZWQsIDhOMSBpcyB1c2VkLiBUeXBlICJzZXQgc2VyaWFsID8iCisgICAgICAgICAgZm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgY2hvaWNlcy4gRXhhbXBsZXM6CisKKyAgICAgICAgU0VUIFNFUklBTCA3RTEKKyAgICAgICAgICAgICAgICBFcXVpdmFsZW50IHRvIFNFVCBQQVJJVFkgRVZFTiwgU0VUIFNUT1AtQklUUyAxLCBTRVQgVEVSTQorICAgICAgICAgICAgICAgIEJZVEUgNy4KKworICAgICAgICBTRVQgU0VSSUFMIDhOMQorICAgICAgICAgICAgICAgIEVxdWl2YWxlbnQgdG8gU0VUIFBBUklUWSBOT05FLCBTRVQgU1RPUC1CSVRTIDEsIFNFVCBURVJNCisgICAgICAgICAgICAgICAgQllURSA4LgorCisgICAgICAgIFNFVCBTRVJJQUwgN0UyCisgICAgICAgICAgICAgICAgRXF1aXZhbGVudCB0byBTRVQgUEFSSVRZIEVWRU4gYW5kIFNFVCBTVE9QLUJJVFMgMiwgU0VUCisgICAgICAgICAgICAgICAgVEVSTSBCWVRFIDcuCisKKyAgICAgICAgU0VUIFNFUklBTCA4RTIKKyAgICAgICAgICAgICAgICBTYW1lIGFzIFNFVCBQQVJJVFkgSEFSRFdBUkUgRVZFTiwgU0VUIFNUT1AtQklUUyAyLCBTRVQKKyAgICAgICAgICAgICAgICBURVJNIEJZVEUgOC4KKworICAgICAgICBTRVQgU0VSSUFMCisgICAgICAgICAgICAgICAgU2FtZSBhcyBTRVQgUEFSSVRZIE5PTkUgYW5kIFNFVCBTVE9QLUJJVFMgMSwgU0VUIFRFUk0KKyAgICAgICAgICAgICAgICBCWVRFIDguCisKKyAgIE5vdGVzOgorCisgICAgICogVGhlIFNFVCBTRVJJQUwgeHgyIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBvbmx5IGluIEtlcm1pdCB2ZXJzaW9ucworICAgICAgIHdoZXJlIHRoZSBTRVQgUEFSSVRZIEhBUkRXQVJFIGNvbW1hbmQgaXMgYWxzbyBhdmFpbGFibGUuIChTSE9XCisgICAgICAgRkVBVFVSRVMgaW5jbHVkZXMgIkhXUEFSSVRZIiBpbiBpdHMgb3B0aW9ucyBsaXN0LikKKyAgICAgKiBUaGUgU0VUIFNFUklBTCA3eHggYW5kIDhOMSBvcHRpb25zIGFmZmVjdCB0aGUgc29mdHdhcmUgcGFyaXR5CisgICAgICAgc2V0dGluZywgZXZlbiBmb3IgbmV0d29yayBjb25uZWN0aW9ucy4KKyAgICAgKiBBcyBub3RlZCBpbiB0aGUgbWFudWFsLCBzZWxlY3RpbmcgOCBkYXRhIGJpdHMgZG9lcyBub3QgZ2l2ZSB5b3UKKyAgICAgICA4LWJpdCB0ZXJtaW5hbCBzZXNzaW9ucyBpbiBDT05ORUNUIG1vZGUgdW5sZXNzIHlvdSBhbHNvIFNFVAorICAgICAgIFRFUk1JTkFMIEJZVEVTSVpFIDguIFRoZSBkZWZhdWx0IHRlcm1pbmFsIGJ5dGVzaXplIHJlbWFpbnMgNywgdG8KKyAgICAgICBwcm90ZWN0IGFnYWluc3QgdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGUgcmVtb3RlIGhvc3QgaXMgZ2VuZXJhdGluZworICAgICAgIHBhcml0eSBidXQgeW91IGRvbid0IGtub3cgYWJvdXQgaXQuIElmIHRoZSB0ZXJtaW5hbCBieXRlc2l6ZSB3YXMgOAorICAgICAgIGJ5IGRlZmF1bHQgYW5kIHlvdSBDT05ORUNUZWQgdG8gc3VjaCBhIGhvc3QsIHlvdSB3b3VsZCBzZWUgb25seQorICAgICAgIGdhcmJhZ2Ugb24geW91ciBzY3JlZW4uCisgICAgICogSWYgeW91IGRvIG5vdCBnaXZlIGEgU0VUIFNUT1AtQklUUyBvciBTRVQgU0VUIFNFUklBTCBjb21tYW5kLAorICAgICAgIEMtS2VybWl0IGRvZXMgbm90IGF0dGVtcHQgdG8gc2V0IHRoZSBkZXZpY2UncyBzdG9wIGJpdHM7IGluc3RlYWQsCisgICAgICAgaXQgdXNlcyB3aGF0ZXZlciBzZXR0aW5nIHRoZSBkZXZpY2UgdXNlcyB3aGVuIG5vdCBnaXZlbiBleHBsaWNpdAorICAgICAgIGluc3RydWN0aW9ucyBhYm91dCBzdG9wIGJpdHMuCisKKyAgIFNIT1cgQ09NTVVOSUNBVElPTlMgZGlzcGxheXMgdGhlIGN1cnJlbnQgc2V0dGluZ3MuIFN0b3AgYml0cyBhbmQKKyAgIGhhcmR3YXJlIHBhcml0eSBhcmUgc2hvd24gb25seSBmb3IgU0VUIFBPUlQgLyBTRVQgTElORSAoc2VyaWFsKQorICAgZGV2aWNlcywgc2luY2UgdGhleSBkbyBub3QgYXBwbHkgdG8gbmV0d29yayBjb25uZWN0aW9ucyBvciB0byByZW1vdGUKKyAgIG1vZGUuIFNUT1AtQklUUyBpcyBzaG93biBhcyAiKGRlZmF1bHQpIiBpZiB5b3UgaGF2ZSBub3QgZ2l2ZW4gYW4KKyAgIGV4cGxpY2l0IFNFVCBTVE9QLUJJVFMgb3IgU0VUIFNFUklBTCBjb21tYW5kLgorCisgICBUaGUgXHYoc2VyaWFsKSB2YXJpYWJsZSBzaG93cyB0aGUgU0VUIFNFUklBTCBzZXR0aW5nICg4TjEsIDdFMSwgZXRjKS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAyLjExLiBHZXR0aW5nIEFjY2VzcyB0byB0aGUgRGlhbG91dCBEZXZpY2UKKworICAgICBUaGlzIHNlY3Rpb24gaXMgZm9yIFVOSVggb25seTsgbm90ZSB0aGUgc3BlY2lhbCB3b3JkcyBhYm91dCBRTlggYXQKKyAgICAgdGhlIGVuZC4gQWxzbyBzZWUgWzQxOF1TZWN0aW9uIDIuMCBmb3IgU0VUIExJTkUgc3dpdGNoZXMsCisgICAgIHBhcnRpY3VsYXJseSB0aGUgL1NIQVJFIHN3aXRjaCBmb3IgVk1TIG9ubHkuCisKKyAgIEMtS2VybWl0IGRvZXMgaXRzIGJlc3QgdG8gb2JleSB0aGUgVVVDUCBsb2NrZmlsZSBjb252ZW50aW9ucyBvZiBlYWNoCisgICBwbGF0Zm9ybSAobWFjaGluZSwgb3BlcmF0aW5nIHN5c3RlbSwgT1MgdmVyc2lvbikgd2hlcmUgaXQgcnVucywgaWYKKyAgIHRoYXQgcGxhdGZvcm0gdXNlcyBVVUNQLgorCisgICBCdXQgc2ltcGx5IG9iZXlpbmcgdGhlIGNvbnZlbnRpb25zIGlzIG9mdGVuIG5vdCBnb29kIGVub3VnaCwgZHVlIHRvCisgICB0aGUgaW5jcmVhc2luZyBsaWtlbGlob29kIHRoYXQgYSBwYXJ0aWN1bGFyIHNlcmlhbCBkZXZpY2UgbWlnaHQgaGF2ZQorICAgbW9yZSB0aGFuIG9uZSBuYW1lIChlLmcuIC9kZXYvdHR5MDAgYW5kIC9kZXYvdGVybS8wMCBhcmUgdGhlIHNhbWUKKyAgIGRldmljZSBpbiBVbml4d2FyZSA3OyAvZGV2L2N1YSBhbmQgL2Rldi9jdWZhIGFyZSB0aGUgc2FtZSBkZXZpY2UgaW4KKyAgIE5lWFRTVEVQKSwgcGx1cyB0aGUgaW5jcmVhc2luZ2x5IHdpZGVzcHJlYWQgdXNlIG9mIHN5bWxpbmtzIGZvciBkZXZpY2UKKyAgIG5hbWVzLCBzdWNoIGFzIC9kZXYvbW9kZW0uCisKKyAgIEMtS2VybWl0IDcuMCBnb2VzIHRvIGdyZWF0ZXIgbGVuZ3RocyB0aGFuIHByZXZpb3VzIHZlcnNpb25zIHRvCisgICBzdWNjZXNzZnVsbHkgaW50ZXJsb2NrIHdpdGggb3RoZXIgY29tbXVuaWNhdGlvbnMgcHJvZ3JhbSAoYW5kIG90aGVyCisgICBpbnN0YW5jZXMgb2YgS2VybWl0IGl0c2VsZik7IGZvciBleGFtcGxlLCBieToKKworICAgICAqIENyZWF0aW9uIG9mIGR1YWwgbG9ja2ZpbGVzIHdoZW5ldmVyIGEgc3ltbGluayBpcyB1c2VkOyBvbmUgZm9yIHRoZQorICAgICAgIGxpbmsgbmFtZSBhbmQgb25lIGZvciB0aGUgcmVhbCBuYW1lLgorICAgICAqIENyZWF0aW9uIG9mIGR1YWwgbG9ja2ZpbGVzIGluIEhQLVVYIGFjY29yZGluZyB0byBIUCBydWxlcy4KKyAgICAgKiBDcmVhdGlvbiBvZiBkdWFsIHVwcGVyY2FzZS9sb3dlcmNhc2UgbG9ja2ZpbGUgbmFtZXMgaW4gU0NPCisgICAgICAgVU5JWC9PRFQvT1NSNS4KKyAgICAgKiBUaGUgdXNlIG9mIHR0eWxvY2soKSBpbiB2ZXJzaW9ucyBvZiBBSVggd2hlcmUgaXQgd29ya3MuCisgICAgICogVGhlIHVzZSwgd2hlcmV2ZXIgcG9zc2libGUsIG9mIGxvY2tmaWxlIG5hbWVzIGJhc2VkIG9uCisgICAgICAgaW5vZGUvbWFqb3IvbWlub3IgZGV2aWNlIG51bWJlciByYXRoZXIgdGhhbiBkZXZpY2UgbmFtZS4KKworICAgU2VlIHRoZSBbNDE5XWNrdWlucy50eHQgYW5kIFs0MjBdY2t1YndyLnR4dCBmaWxlcyBmb3IgZGV0YWlscy4KKworICAgUU5YIGlzIGFsbW9zdCB1bmlxdWUgYW1vbmcgVU5JWCB2YXJpZXRpZXMgaW4gaGF2aW5nIG5vIFVVQ1AgcHJvZ3JhbXMKKyAgIG5vciBVVUNQLW9yaWVudGVkIGRpYWxvdXQtZGV2aWNlIGxvY2tpbmcgY29udmVudGlvbnMuIFFOWCBkb2VzLAorICAgaG93ZXZlciwgYWxsb3cgYSBwcm9ncmFtIHRvIGdldCB0aGUgZGV2aWNlIG9wZW4gY291bnQuIFRoaXMgY2FuIG5vdCBiZQorICAgYSByZWxpYWJsZSBmb3JtIG9mIGxvY2tpbmcgdW5sZXNzIGFsbCBhcHBsaWNhdGlvbnMgZG8gaXQgKGFuZCB0aGV5CisgICBkb24ndCksIHNvIGJ5IGRlZmF1bHQsIEtlcm1pdCB1c2VzIHRoaXMgaW5mb3JtYXRpb24gb25seSBmb3IgcHJpbnRpbmcKKyAgIGEgd2FybmluZyBtZXNzYWdlIHN1Y2ggYXM6CisKKyAgQy1LZXJtaXQ+c2V0IGxpbmUgL2Rldi9zZXIxCisgIFdBUk5JTkcgLSAiL2Rldi9zZXIxIiBsb29rcyBidXN5Li4uCisKKyAgIEhvd2V2ZXIsIGlmIHlvdSB3YW50IHRvIHVzZSBpdCBhcyBhIGxvY2ssIHlvdSBjYW4gZG8gc28gd2l0aDoKKworICBTRVQgUU5YLVBPUlQtTE9DSyB7IE9OLCBPRkYgfQorCisgICBRTlgtUE9SVC1MT0NLIGlzIE9GRiBieSBkZWZhdWx0OyBpZiB5b3Ugc2V0IGluIE9OLCBDLUtlcm1pdCBmYWlscyB0bworICAgb3BlbiBhbnkgZGlhbG91dCBkZXZpY2Ugd2hlbiBpdHMgb3BlbiBjb3VudCBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyCisgICBwcm9jZXNzIGhhcyBpdCBvcGVuLiBTSE9XIENPTU0gKGluIFFOWCBvbmx5KSBkaXNwbGF5cyB0aGUgc2V0dGluZywgYW5kCisgICBpZiB5b3UgaGF2ZSBhIHBvcnQgb3BlbiwgaXQgYWxzbyBzaG93cyB0aGUgY3VycmVudCBvcGVuIGNvdW50ICh3aXRoCisgICBDLUtlcm1pdCdzIG93biBhY2Nlc3MgYWx3YXlzIGNvdW50aW5nIGFzIDEpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDIuMTIuIFRoZSBDb25uZWN0aW9uIExvZworCisgICBDLUtlcm1pdCA3LjAgYWRkcyB0aGUgYWJpbGl0eSB0byBsb2cgY29ubmVjdGlvbnMsIHNvIHlvdSBjYW4gc2VlIHdoZXJlCisgICB5b3UndmUgYmVlbiBhbmQgaGF2ZSBhIHJlY29yZCBvZiBjYWxscyB5b3UndmUgbWFkZS4gQSBjb25uZWN0aW9uIGlzCisgICBkZWZpbmVkIGFzIGFueSBjb21tdW5pY2F0aW9ucyBzZXNzaW9uIHRoYXQgaXMgYmVndW4gYnkgU0VUIExJTkUsIFNFVAorICAgUE9SVCwgRElBTCwgU0VUIEhPU1QsIFRFTE5FVCwgb3IgUkxPR0lOLiBDb25uZWN0aW9ucyBhcmUgbm90IGxvZ2dlZAorICAgdW5sZXNzIHlvdSByZXF1ZXN0IGl0OyB0aGUgY29tbWFuZCBpczoKKworICAgTE9HIENYIFsgZmlsZW5hbWUgWyB7IE5FVywgQVBQRU5EIH0gXSBdCisgICAgICAgICAgRW5hYmxlcyBsb2dnaW5nIG9mIGNvbm5lY3Rpb25zIGluIHRoZSBnaXZlbiBmaWxlLiBJZiB0aGUKKyAgICAgICAgICB0cmFpbGluZyB7IE5FVywgQVBQRU5EIH0ga2V5d29yZCBpcyBvbWl0dGVkLCB0aGUgZmlsZSBpcyBvcGVuZWQKKyAgICAgICAgICBmb3IgYXBwZW5kaW5nOyBpLmUuIG5ldyByZWNvcmRzIGFyZSB3cml0dGVuIHRvIHRoZSBlbmQuIElmIE5FVworICAgICAgICAgIGlzIHNwZWNpZmllZCwgYSBuZXcgZmlsZSBpcyBjcmVhdGVkOyBpZiBhIGZpbGUgb2YgdGhlIHNhbWUgbmFtZQorICAgICAgICAgIGFscmVhZHkgZXhpc3RlZCwgaXQgaXMgb3ZlcndyaXR0ZW4uIElmIHRoZSBmaWxlbmFtZSBpcyBvbWl0dGVkLAorICAgICAgICAgIENYLkxPRyBpbiB5b3VyIGhvbWUgKGxvZ2luKSBkaXJlY3RvcnkgaXMgdXNlZCAobm90ZToKKyAgICAgICAgICB1cHBlcmNhc2UpLiBUbyBhY2NlcHQgYWxsIGRlZmF1bHRzLCBqdXN0IHVzZSAibG9nIGNvbm5lY3Rpb25zIgorICAgICAgICAgIChvciAibCBjIiBmb3Igc2hvcnQpLiBTeW5vbnltOiBMT0cgQ09OTkVDVElPTlMuCisKKyAgIENMT1NFIENYLUxPRworICAgICAgICAgIFRoaXMgY2xvc2VzIHRoZSBjb25uZWN0aW9uIGxvZyBpZiBpdCB3YXMgb3Blbi4gKE5vdGUsIHRoZSBDTE9TRQorICAgICAgICAgIENPTk5FQ1RJT04gY29tbWFuZCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gaXRzZWxmKS4KKworICAgU0hPVyBDWAorICAgICAgICAgIFRoaXMgc2hvd3MgeW91ciBjdXJyZW50IGNvbm5lY3Rpb24sIGlmIGFueSwgaW5jbHVkaW5nIHRoZQorICAgICAgICAgIGVsYXBzZWQgdGltZSAoc2luY2UgeW91IG9wZW5lZCBpdCkuIFN5bm9ueW06IFNIT1cgQ09OTkVDVElPTi4KKworICAgXHYoY3hfdGltZSkKKyAgICAgICAgICBUaGlzIHZhcmlhYmxlIHNob3dzIHRoZSBlbGFwc2VkIHRpbWUgb2YgeW91ciBjdXJyZW50CisgICAgICAgICAgY29ubmVjdGlvbiwgb3IgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBjb25uZWN0aW9uLCBvZiB5b3VyIG1vc3QKKyAgICAgICAgICByZWNlbnQgY29ubmVjdGlvbiwgb2YgaWYgdGhlcmUgaGF2ZSBiZWVuIG5vIGNvbm5lY3Rpb25zLCAwLgorCisgICBUaGUgY29ubmVjdGlvbiBjb250YWlucyBvbmUgbGluZSBwZXIgY29ubmVjdGlvbiwgb2YgdGhlIGZvcm06CisKKyAgeXl5eW1tZGQgaGg6bW06c3MgdXNlcm5hbWUgcGlkIHA9diBbIHA9diBbIC4uLiBdIF0KKworICAgd2hlcmUgdGhlIHRpbWVzdGFtcCAoaW4gY29sdW1ucyAxLTE4KSBzaG93cyB3aGVuIHRoZSBjb25uZWN0aW9uIHdhcworICAgbWFkZTsgdXNlcm5hbWUgaXMgdGhlIGxvZ2luIGlkZW50aXR5IG9mIHRoZSBwZXJzb24gd2hvIG1hZGUgdGhlCisgICBjb25uZWN0aW9uOyBwaWQgaXMgS2VybWl0J3MgcHJvY2VzcyBJRCB3aGVuIGl0IG1hZGUgdGhlIGNvbm5lY3Rpb24uCisgICBUaGUgcCdzIGFyZSBwYXJhbWV0ZXJzIHRoYXQgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIGNvbm5lY3Rpb24sIGFuZCB0aGUKKyAgIHYncyBhcmUgdGhlaXIgdmFsdWVzOgorCisgIFQgPSBDb25uZWN0aW9uIFR5cGUgKFRDUCwgU0VSSUFMLCBESUFMLCBERUNORVQsIGV0YykuCisgIEggPSBUaGUgbmFtZSBvZiB0aGUgSG9zdCBmcm9tIHdoaWNoIHRoZSBjb25uZWN0aW9uIHdhcyBtYWRlLgorICBOID0gRGVzdGluYXRpb24gcGhvbmUgTnVtYmVyIG9yIE5ldHdvcmsgaG9zdCBuYW1lIG9yIGFkZHJlc3MuCisgIEQgPSBTZXJpYWwgY29ubmVjdGlvbnMgb25seTogRGV2aWNlIG5hbWUuCisgIE8gPSBEaWFsZWQgY2FsbHMgb25seTogT3JpZ2luYXRpbmcgY291bnRyeSBjb2RlICYgYXJlYSBjb2RlIGlmIGtub3duLgorICBFID0gRWxhcHNlZCB0aW1lIGluIGhoOm1tOnNzIGZvcm1hdCAob3IgaGhoOm1tOnNzLCBldGMpLgorCisgICBJZiB5b3UgYWx3YXlzIHdhbnQgdG8ga2VlcCBhIGNvbm5lY3Rpb24gbG9nLCBzaW1wbHkgYWRkOgorCisgIGxvZyBjb25uZWN0aW9ucworCisgICB0byB5b3VyIEMtS2VybWl0IGN1c3RvbWl6YXRpb24gZmlsZS4gTm90ZSwgaG93ZXZlciwgdGhhdCBpZiB5b3UgbWFrZSBhCisgICBsb3Qgb2YgY29ubmVjdGlvbnMsIHlvdXIgQ1guTE9HIHdpbGwgZ3JvdyBhbmQgZ3Jvdy4gWW91IGNhbiBoYW5kbGUKKyAgIHRoaXMgYnkgYWRkaW5nIGEgImxvZ3JvdGF0ZSIgcHJvY2VkdXJlIGxpa2UgdGhlIGZvbGxvd2luZyB0byB5b3VyCisgICBjdXN0b21pemF0aW9uIGZpbGUsIGJlZm9yZSB0aGUgImxvZyBjb25uZWN0aW9ucyIgY29tbWFuZDoKKworICBkZWZpbmUgTE9HUk9UQVRFIHsgICAgICAgICAgICAgICAgICAgIDsgRGVmaW5lIExPR1JPVEFURSBtYWNybworICAgICAgbG9jYWwgXCVpIFwlbSBcJWQgXCVuIFwlZiBNQVgKKyAgICAgIGRlZiBNQVggNCAgICAgICAgICAgICAgICAgICAgICAgICA7IEhvdyBtYW55IG1vbnRocyB0byBrZWVwCisgICAgICBpZiBub3QgZGVmIFwlMSAtICAgICAgICAgICAgICAgICAgOyBObyBhcmd1bWVudCBnaXZlbgorICAgICAgICBlbmQgMSBcJTA6IE5vIGZpbGVuYW1lIGdpdmVuCisgICAgICBpZiBub3QgPSAxIFxmZmlsZXMoXCUxKSAtICAgICAgICAgOyBFeGFjdGx5IDEgZmlsZSBtdXN0IG1hdGNoCisgICAgICAgIGVuZCAxIFwlMDogXCUxIC0gRmlsZSBub3QgZm91bmQKKyAgICAgIC5cJWQgOj0gXGZzdWJzdHIoXGZkYXRlKFwlMSksMSw2KSA7IEFyZyBPSyAtIGdldCBmaWxlIHllYXIgJiBtb250aAorICAgICAgaWYgPSBcJWQgLSAgICAgICAgICAgICAgICAgICAgICAgIDsgQ29tcGFyZSBmaWxlIHllYXIgJiBtb250aAorICAgICAgICBcZnN1YnN0cihcdihuZGF0ZSksMSw2KSAtICAgICAgIDsgd2l0aCBjdXJyZW50IHllYXIgJiBtb250aAorICAgICAgICAgIGVuZCAwICAgICAgICAgICAgICAgICAgICAgICAgIDsgU2FtZSB5ZWFyICYgbW9udGggLSBkb25lCisgICAgICByZW5hbWUgXCUxIFwlMS5cJWQgICAgICAgICAgICAgICAgOyBEaWZmZXJlbnQgLSByZW5hbWUgZmlsZQorICAgICAgLlwlbiA6PSBcZmZpbGVzKFwlMS4qKSAgICAgICAgICAgIDsgSG93IG1hbnkgb2xkIGZpbGVzCisgICAgICBpZiA8IFwlbiBcbShNQVgpIGVuZCAwICAgICAgICAgICAgOyBOb3QgZW5vdWdoIHRvIHJvdGF0ZQorICAgICAgLlwlbSA6PSBcJTEuOTk5OTk5ICAgICAgICAgICAgICAgIDsgSW5pdGlhbCBjb21wYXJlIHN0cmluZworICAgICAgZm9yIFwlaSAxIFwlbiAxIHsgICAgICAgICAgICAgICAgIDsgTG9vcCB0aHJ1IG9sZCBsb2dzCisgICAgICAgICAuXCVmIDo9IFxmbmV4dGZpbGUoKSAgICAgICAgICAgOyBHZXQgbmV4dCBmaWxlIG5hbWUKKyAgICAgICAgIGlmIGxsdCBcJWYgXCVtIC5cJW0gOj0gXCVmICAgICA7IElmIHRoaXMgb25lIG9sZGVyIHJlbWVtYmVyIGl0CisgICAgICB9CisgICAgICBkZWxldGUgXCVtICAgICAgICAgICAgICAgICAgICAgICAgOyBEZWxldGUgdGhlIG9sZGVzdCBvbmUKKyAgfQorICBsb2cgY29ubmVjdGlvbnMgICAgICAgICAgICAgICAgICAgICAgIDsgTm93IG9wZW4gdGhlIChwb3NzaWJseSBuZXcpIGxvZworICBsb2dyb3RhdGUgXHYoaG9tZSlDWC5MT0cgICAgICAgICAgICAgIDsgUnVuIHRoZSBMT0dST1RBVEUgbWFjcm8KKworICAgQXMgeW91IGNhbiBzZWUsIHRoaXMgY29tcGFyZXMgdGhlIHl5eXltbSBwb3J0aW9uIG9mIHRoZSBtb2RpZmljYXRpb24KKyAgIGRhdGUgKFxmZGF0ZSgpKSBvZiB0aGUgZ2l2ZW4gZmlsZSAoXCUxKSB3aXRoIHRoZSBjdXJyZW50IHl5eXltbS4gSWYKKyAgIHRoZXkgZGlmZmVyLCB0aGUgY3VycmVudCBmaWxlIGhhcyB0aGUgeXl5eW1tIHN1ZmZpeCAoZnJvbSBpdHMgbW9zdAorICAgcmVjZW50IG1vZGlmaWNhdGlvbiBkYXRlKSBhcHBlbmRlZCB0byBpdHMgbmFtZS4gVGhlbiB3ZSBzZWFyY2ggdGhyb3VnaAorICAgYWxsIG90aGVyIHN1Y2ggZmlsZXMsIGZpbmQgdGhlIG9sZGVzdCBvbmUsIGFuZCBkZWxldGUgaXQuIFRodXMgdGhlCisgICBjdXJyZW50IGxvZywgcGx1cyB0aGUgbG9ncyBmcm9tIHRoZSBtb3N0IHJlY2VudCBmb3VyIG1vbnRocywgYXJlIGtlcHQuCisgICBUaGlzIGlzIGFsbCBkb25lIGF1dG9tYXRpY2FsbHkgZXZlcnkgdGltZSB5b3Ugc3RhcnQgQy1LZXJtaXQuCisKKyAgIE9uIG11bHRpdXNlciBzeXN0ZW1zLCBpdCBpcyBwb3NzaWJsZSB0byBrZWVwIGEgc2luZ2xlLCBzaGFyZWQsCisgICBzeXN0ZW0td2lkZSBjb25uZWN0aW9uIGxvZywgYnV0IHRoaXMgaXMgbm90IHJlY29tbWVuZGVkIHNpbmNlIChhKSBpdAorICAgcmVxdWlyZXMgeW91IGtlZXAgYSBwdWJsaWNseSB3cml0ZS1hY2Nlc3NpYmxlIGxvZ2ZpbGUgKGEgZ2xhcmluZworICAgdGFyZ2V0IGZvciBtaXNjaGllZiksIGFuZCAoYikgaXQgd291bGQgcmVxdWlyZSBlYWNoIHVzZXIgdG8gbG9nIHRvCisgICB0aGF0IGZpbGUgYW5kIG5vdCBkaXNhYmxlIGxvZ2dpbmcuIEEgYmV0dGVyIG1ldGhvZCBmb3IgbG9nZ2luZworICAgY29ubmVjdGlvbnMsIGluIFVOSVggYXQgbGVhc3QsIGlzIHN5c2xvZ2dpbmcgKHNlZSBbNDIxXWNrdWlucy50eHQKKyAgIFNlY3Rpb24gMTUgYW5kIFs0MjJdU2VjdGlvbiA0LjIgb2YgdGhlIFs0MjNdSUtTRCBBZG1pbmlzdHJhdGlvbiBHdWlkZQorICAgZm9yIGRldGFpbHMpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDIuMTMuIEF1dG9tYXRpYyBDb25uZWN0aW9uLVNwZWNpZmljIEZsb3cgQ29udHJvbCBTZWxlY3Rpb24KKworICAgQmVnaW5uaW5nIGluIEMtS2VybWl0IDcuMCwgdGhlIGFwcHJvcHJpYXRlIGZsb3ctY29udHJvbCBtZXRob2QgZm9yCisgICBlYWNoIGNvbm5lY3Rpb24gdHlwZSBpcyBrZXB0IGluIGEgdGFibGUsIGZvciBleGFtcGxlOgorCisgIFJlbW90ZTogICAgICAgICAgIE5PTkUKKyAgTW9kZW06ICAgICAgICAgICAgUlRTL0NUUworICBEaXJlY3QtU2VyaWFsOiAgICBOT05FCisgIFRDUElQOiAgICAgICAgICAgIE5PTkUKKworICAgVGhlIHNpemUgb2YgdGhlIHRhYmxlIGFuZCB2YWx1ZXMgZm9yIGVhY2ggY29ubmVjdGlvbiB0eXBlIGNhbiB2YXJ5CisgICBmcm9tIHBsYXRmb3JtIHRvIHBsYXRmb3JtLiBUeXBlICJzZXQgZmxvdyA/IiBmb3IgYSBsaXN0IG9mIGF2YWlsYWJsZQorICAgZmxvdy1jb250cm9sIHR5cGVzLgorCisgICBUaGUgdGFibGUgaXMgdXNlZCB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUga2luZCBvZiBmbG93CisgICBjb250cm9sIHdoZW5ldmVyIHlvdSBtYWtlIGEgY29ubmVjdGlvbi4gWW91IGNhbiBkaXNwbGF5IHRoZSB0YWJsZQorICAgd2l0aDoKKworICBTSE9XIEZMT1ctQ09OVFJPTAorCisgICBUaGUgZGVmYXVsdHMgYXJlIGFzIGZvbGxvd3M6CisKKyAgIFJlbW90ZToKKyAgICAgICAgICBOT05FIG9yIFhPTi9YT0ZGLiBUaGlzIGlzIGJlY2F1c2UgQy1LZXJtaXQgaXMgbm90IGFsbG93ZWQgdG8KKyAgICAgICAgICBmaW5kIG91dCB3aGF0IHR5cGUgb2YgY29ubmVjdGlvbiB0aGUgaW5jb21pbmcgdXNlciBoYXMgKCopLiBObworICAgICAgICAgIGtpbmQgb2YgZmxvdyBjb250cm9sIHdpbGwgd29yayBvbiBldmVyeSBraW5kIG9mIGNvbm5lY3Rpb24sCisgICAgICAgICAgaW5jbHVkaW5nICh1bmV4cGVjdGVkbHkpIEtFRVAsIHdoaWNoIHdlIHdvdWxkIGhhdmUgbGlrZWQgdG8KKyAgICAgICAgICB1c2UsIGJ1dCBub3QgdHVybmluZyBvZmYgZmxvdyBjb250cm9sIGF0IHRoZSByZW1vdGUgZW5kIGR1cmluZworICAgICAgICAgIGZpbGUgdHJhbnNmZXIgb24gVENQL0lQIGNvbm5lY3Rpb25zIGlzIGZhdGFsIHRvIHRoZSB0cmFuc2ZlcgorICAgICAgICAgIChleGNlcHQgaW4gVk1TIGFuZCBIUC1VWCwgd2hlcmUgaXQgbXVzdCBiZSBzZXQgdG8gWG9uL1hvZmYhKQorICAgICAgICAgIFRoZXJlZm9yZSBpZiB5b3UgYXJlIGRpYWxpbmcgaW4gdG8gYSBzZXJpYWwgcG9ydCBvbiBhIHNlcnZlcgorICAgICAgICAgIChVTklYIG9yIFZNUykgd2hlcmUgQy1LZXJtaXQgaXMgcnVubmluZywgeW91IHdpbGwgbmVlZCB0byB0ZWxsCisgICAgICAgICAgQy1LZXJtaXQgdG8gInNldCBmbG93IGtlZXAiIGJlZm9yZSB0cmFuc2ZlcnJpbmcgZmlsZXMgKGFzc3VtaW5nCisgICAgICAgICAgdGhlIG1vZGVtIGFuZCBwb3J0IGFyZSBjb25maWd1cmVkIGNvcnJlY3RseSBieSB0aGUgc3lzdGVtCisgICAgICAgICAgYWRtaW5pc3RyYXRvcjsgb3RoZXJ3aXNlIHlvdSdsbCBuZWVkIHRvIGdpdmUgYSBzcGVjaWZpYyBraW5kIG9mCisgICAgICAgICAgZmxvdyBjb250cm9sLCBlLmcuICJzZXQgZmxvdyB4b24veG9mZiIpLCBzbyBpbiB0aGlzIGNhc2UKKyAgICAgICAgICBDLUtlcm1pdCB3aWxsIG5vdCBkaXNhYmxlIGZsb3cgY29udHJvbCwgYXMgaXQgbXVzdCBkbyB3aGVuIHlvdQorICAgICAgICAgIGFyZSBjb21pbmcgdmlhIFRlbG5ldCAoZGlyZWN0bHkgb3IgdGhyb3VnaCBhIHRlcm1pbmFsIHNlcnZlciwKKyAgICAgICAgICBleGNlcHQgb24gVk1TIGFuZCBIUC1VWCkuCisKKyAgIE1vZGVtOgorICAgICAgICAgIFRoaXMgYXBwbGllcyB3aGVuIHlvdSBkaWFsIG91dCB3aXRoIGEgbW9kZW0uIEluIHRoaXMgY2FzZSwgdGhlCisgICAgICAgICAgTU9ERU0gRkxPVy1DT05UUk9MIHNldHRpbmcgdGFrZXMgYWZmZWN0IGFmdGVyIHRoZSBTRVQgRkxPVworICAgICAgICAgIHNldHRpbmcsIHNvIGl0IGNhbiBwaWNrIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGZsb3cgY29udHJvbCBmb3IKKyAgICAgICAgICB0aGUgY29tYmluYXRpb24gb2YgdGhlIHBhcnRpY3VsYXIgbW9kZW0gYW5kIHRoZQorICAgICAgICAgIGNvbXB1dGVyL3BvcnQvZHJpdmVyIHRoYXQgaXMgZGlhbGluZy4KKworICAgRGlyZWN0LVNlcmlhbDoKKyAgICAgICAgICBUaGUgZGVmYXVsdCBoZXJlIGlzIE5PTkUgYmVjYXVzZSBDLUtlcm1pdCBoYXMgbm8gd2F5IG9mIGtub3dpbmcKKyAgICAgICAgICB3aGF0IGtpbmQgb2YgZmxvdyBjb250cm9sLCBpZiBhbnksIGlzIG9yIGNhbiBiZSBkb25lIGJ5IHRoZQorICAgICAgICAgIGRldmljZSBhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uLiBSVFMvQ1RTIHdvdWxkIGJlIGEKKyAgICAgICAgICBiYWQgY2hvaWNlIGhlcmUsIGJlY2F1c2UgaWYgdGhlIENUUyBzaWduYWwgaXMgbm90IGFzc2VydGVkLCB0aGUKKyAgICAgICAgICBjb25uZWN0aW9uIHdpbGwgaGFuZy4gQW5kIHNpbmNlIGRpcmVjdCBjb25uZWN0aW9ucyBhcmUgb2Z0ZW4KKyAgICAgICAgICBtYWRlIHdpdGggMy13aXJlIGNhYmxlcywgdGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGUgQ1RTIHNpZ25hbAorICAgICAgICAgIHdpbGwgbm90IGJlIHJlY2VpdmVkLgorCisgICBUQ1BJUDoKKyAgICAgICAgICBOT05FLCBzaW5jZSBUQ1AgYW5kIElQIHByb3ZpZGUgdGhlaXIgb3duIGZsb3cgY29udHJvbAorICAgICAgICAgIHRyYW5zcGFyZW50bHkgdG8gdGhlIGFwcGxpY2F0aW9uLCBleGNlcHQgaW4gVk1TLCB3aGVyZSBYb24vWG9mZgorICAgICAgICAgIGlzIHRoZSBkZWZhdWx0IGR1ZSB0byB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBWTVMgVENQL0lQCisgICAgICAgICAgcHJvZHVjdHMuCisKKyAgIE90aGVyIG5ldHdvcmtzOgorICAgICAgICAgIE5PTkUsIHNpbmNlIG5ldHdvcmtzIHNob3VsZCBwcm92aWRlIHRoZWlyIGZsb3cgY29udHJvbAorICAgICAgICAgIHRyYW5zcGFyZW50bHkgdG8gdGhlIGFwcGxpY2F0aW9uLgorCisgICAoKikgVGhpcyBpcyBwb3NzaWJseSB0aGUgd29yc3QgZmVhdHVyZSBvZiBVTklYLCBWTVMsIGFuZCBvdGhlcgorICAgcGxhdGZvcm1zIHdoZXJlIEMtS2VybWl0IHJ1bnMuIElmIEMtS2VybWl0IHdhcyBhYmxlIHRvIGFzayB0aGUKKyAgIG9wZXJhdGluZyBzeXN0ZW0gd2hhdCBraW5kIG9mIGNvbm5lY3Rpb24gaXQgaGFkIHRvIHRoZSB1c2VyLCBpdCBjb3VsZAorICAgc2V0IHVwIG1hbnkgdGhpbmdzIGZvciB5b3UgYXV0b21hdGljYWxseS4KKworICAgWW91IGNhbiBtb2RpZnkgdGhlIGRlZmF1bHQtZmxvdy1jb250cm9sIHRhYmxlIHdpdGg6CisKKyAgU0VUIEZMT1ctQ09OVFJPTCAveHh4IHsgTk9ORSwgS0VFUCwgUlRTL0NUUywgWE9OL1hPRkYsIC4uLiB9CisKKyAgIHdoZXJlICJ4eHgiIGlzIHRoZSBjb25uZWN0aW9uIHR5cGUsIGUuZy4KKworICBTRVQgRkxPVyAvUkVNT1RFIE5PTkUKKyAgU0VUIEZMT1cgL0RJUkVDVCBSVFMvQ1RTCisKKyAgIElmIHlvdSBsZWF2ZSBvdXQgdGhlIHN3aXRjaCwgU0VUIEZMT1cgd29ya3MgYXMgYmVmb3JlLCBjaG9vc2luZyB0aGUKKyAgIGZsb3cgY29udHJvbCBtZXRob2QgdG8gYmUgdXNlZCBvbiB0aGUgY3VycmVudCBjb25uZWN0aW9uOgorCisgIFNFVCBGTE9XIFhPTi9YT0ZGCisKKyAgIFRodXMsIHdoZW5ldmVyIHlvdSBtYWtlIGEgY29ubmVjdGlvbiB3aXRoIFNFVCBQT1JULCBTRVQgTElORSwgRElBTCwKKyAgIFNFVCBIT1NULCBURUxORVQsIFJMT0dJTiwgZXRjLCBhbiBhcHByb3ByaWF0ZSBmb3JtIG9mIGZsb3cgY29udHJvbCBpcworICAgc2VsZWN0ZWQgYXV0b21hdGljYWxseS4gWW91IGNhbiBvdmVycmlkZSB0aGUgYXV0b21hdGljIHNlbGVjdGlvbiB3aXRoCisgICBhIHN1YnNlcXVlbnQgU0VUIEZMT1cgY29tbWFuZCwgc3VjaCBhcyBTRVQgRkxPVyBOT05FIChubyBzd2l0Y2gKKyAgIGluY2x1ZGVkKS4KKworICAgVGhlIGZsb3cgY29udHJvbCBpcyBjaGFuZ2VkIGF1dG9tYXRpY2FsbHkgdG9vIHdoZW4geW91IGdpdmUgYSBTRVQKKyAgIE1PREVNIFRZUEUgY29tbWFuZC4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91ciBvcGVyYXRpbmcgc3lzdGVtIChzYXkKKyAgIExpbnV4KSBzdXBwb3J0cyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgKFJUUy9DVFMpLiBOb3cgc3VwcG9zZSB5b3UgZ2l2ZQorICAgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICBzZXQgbGluZSAvZGV2L3R0eVMyICAgIDsgQXV0b21hdGljYWxseSBzZXRzIGZsb3cgdG8gTk9ORQorICBzZXQgbW9kZW0gdHlwZSB1c3IgICAgIDsgQXV0b21hdGljYWxseSBzZXRzIGZsb3cgdG8gUlRTL0NUUworICBzZXQgbW9kZW0gdHlwZSByb2xtICAgIDsgRG9lc24ndCBzdXBwb3J0IFJUUy9DVFMgc28gbm93IGZsb3cgaXMgWE9OL1hPRkYKKworICAgSU1QT1JUQU5UOiBUaGlzIG5ldyBmZWF0dXJlIHRlbmRzIHRvIG1ha2UgdGhlIG9yZGVyIG9mIFNFVCBMSU5FL0hPU1QKKyAgIGFuZCBTRVQgRkxPVyBjb21tYW5kcyBtYXR0ZXIsIHdoZXJlIGl0IGRpZG4ndCBiZWZvcmUuIEZvciBleGFtcGxlLCBpbgorICAgVk1TOgorCisgIFNFVCBGTE9XIEtFRVAKKyAgU0VUIExJTkUgVFRBMDoKKworICAgdGhlIFNFVCBMSU5FIHVuZG9lcyB0aGUgU0VUIEZMT1cgS0VFUCBjb21tYW5kOyB0aGUgc2VxdWVuY2Ugbm93IG11c3QKKyAgIGJlOgorCisgIFNFVCBGTE9XIC9ESVJFQ1QgS0VFUAorICBTRVQgTElORSBUVEEwOgorCisgICBvcjoKKworICBTRVQgTElORSBUVEEwOgorICBTRVQgRkxPVyBLRUVQCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMi4xNC4gVHJhcHBpbmcgQ29ubmVjdGlvbiBFc3RhYmxpc2htZW50IGFuZCBMb3NzCisKKyAgIElmIHlvdSBkZWZpbmUgYSBtYWNybyBjYWxsZWQgT05fT1BFTiwgaXQgaXMgZXhlY3V0ZWQgYW55IHRpbWUgdGhhdCBhCisgICBTRVQgTElORSwgU0VUIFBPUlQsIFNFVCBIT1NULCBURUxORVQsIFJMT0dJTiBvciBzaW1pbGFyIGNvbW1hbmQKKyAgIHN1Y2NlZWRzIGluIG9wZW5pbmcgYSBjb25uZWN0aW9uLiBUaGUgYXJndW1lbnQgaXMgdGhlIGhvc3Qgb3IgZGV2aWNlCisgICBuYW1lIChhcyBzaG93biBieSBTSE9XIENPTU1VTklDQVRJT05TLCBhbmQgdGhlIHNhbWUgYXMgXHYobGluZSkpLiBUaGlzCisgICBtYWNybyBjYW4gYmUgdXNlZCBmb3IgYWxsIHNvcnRzIG9mIHRoaW5ncywgbGlrZSBhdXRvbWF0aWNhbGx5IHNldHRpbmcKKyAgIGNvbm5lY3Rpb24tIG9yIGhvc3Qtc3BlY2lmaWMgcGFyYW1ldGVycyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIG9wZW5lZC4KKyAgIEV4YW1wbGU6CisKKyAgZGVmIE9OX09QRU4geworICAgICAgc3dpdGNoIFwlMSB7CisgICAgICAgIDphYmNjb3JwLmNvbSwgc2V0IHJlbGlhYmxlIG9mZiwgYnJlYWsKKyAgICAgICAgOnh5emNvcnAuY29tLCBzZXQgcmVjZWl2ZSBwYWNrZXQtbGVuZ3RoIDEwMDAsIGJyZWFrCisgICAgICAgIGV0YyBldGMuLi4KKyAgICAgIH0KKyAgfQorCisgICBJZiB5b3UgZGVmaW5lIGEgbWFjcm8gY2FsbGVkIE9OX0NMT1NFLCBpdCB3aWxsIGJlIGV4ZWN1dGVkIGFueSB0aW1lCisgICB0aGF0IGEgU0VUIExJTkUsIFNFVCBQT1JULCBTRVQgSE9TVCwgVEVMTkVULCBSTE9HSU4gb3IgYW55IG90aGVyIGtpbmQKKyAgIG9mIGNvbm5lY3Rpb24gdGhhdCBDLUtlcm1pdCBoYXMgbWFkZSBpcyBjbG9zZWQsIGVpdGhlciBieSB0aGUgcmVtb3RlCisgICBvciBieSBhIGxvY2FsIENMT1NFLCBIQU5HVVAsIG9yIEVYSVQgY29tbWFuZCBvciBvdGhlciBsb2NhbCBhY3Rpb24sCisgICBzdWNoIGFzIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBpcyBvcGVuZWQgYmVmb3JlIGFuIG9sZCBvbmUgd2FzCisgICBleHBsaWNpdGx5IGNsb3NlZC4KKworICAgQXMgc29vbiBhcyBDLUtlcm1pdCBub3RpY2VzIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCwgdGhlCisgICBPTl9DTE9TRSBtYWNybyBpcyBpbnZva2VkIGF0IChhKSB0aGUgdG9wIG9mIHRoZSBjb21tYW5kIHBhcnNpbmcgbG9vcCwKKyAgIG9yIChiKSB3aGVuIGEgY29ubmVjdGlvbiBpcyBjbG9zZWQgaW1wbGljaXRseSBieSBhIGNvbW1hbmQgc3VjaCBhcyBTRVQKKyAgIExJTkUgdGhhdCBjbG9zZXMgYW55IG9wZW4gY29ubmVjdGlvbiBwcmlvciB0byBtYWtpbmcgYSBuZXcgY29ubmVjdGlvbiwKKyAgIG9yIChjKSB3aGVuIEMtS2VybWl0IGNsb3NlcyBhbiBvcGVuIGNvbm5lY3Rpb24gaW4gdGhlIGFjdCBvZiBleGl0aW5nLgorCisgICBUaGUgT05fQ0xPU0UgbWFjcm8gd2FzIGluc3BpcmVkIGJ5IHRoZSBuZXZlcmVuZGluZyBxdWVzdCB0byB1bml0ZQorICAgS2VybWl0IGFuZCBTU0guIEluIHRoaXMgY2FzZSB1c2luZyB0aGUgInR1bm5lbCIgbWVjaGFuaXNtOgorCisgIGRlZiBUVU5ORUwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBcJTEgPSBob3N0IHRvIHR1bm5lbCB0bworICAgICAgbG9jYWwgXCVwCisgICAgICBpZiBub3QgZGVmIFwlMSBzdG9wIDEKKyAgICAgIGFzc2lnbiB0dW5uZWxob3N0IFwlMSAgICAgICAgICAgICAgICAgICA7IE1ha2UgZ2xvYmFsIGNvcHkKKyAgICAgIHVuZGVmIG9uX2Nsb3NlCisgICAgICBzZXQgbWFjcm8gZXJyb3Igb2ZmCisgICAgICBjbG9zZSBjb25uZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgOyBJZ25vcmUgYW55IGVycm9yCisgICAgICBvcGVuICFyZWFkIHR1bm5lbCBzdGFydCBcJTEKKyAgICAgIHJlYWQgXCVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IEdldCBwb3J0IG51bWJlcgorICAgICAgaWYgZmFpbCBzdG9wIDEgVHVubmVsIGZhaWx1cmU6IFwlMQorICAgICAgY2xvc2UgcmVhZAorICAgICAgaWYgZmFpbCBzdG9wIDEgVHVubmVsIGZhaWx1cmU6IFwlMSAgICAgIDsgU2VlIFs0MjRdU2VjdGlvbiA0LjIuOC4xCisgICAgICBhc3NpZ24gb25fY2xvc2UgeyAgICAgICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgY2xvc2UgaGFuZGxlcgorICAgICAgICAgIGVjaG8gQ2xvc2luZyB0dW5uZWw6IFxtKHR1bm5lbGhvc3QpCisgICAgICAgICAgIXR1bm5lbCBzdG9wIFxtKHR1bm5lbGhvc3QpCisgICAgICAgICAgdW5kZWYgb25fY2xvc2UKKyAgICAgIH0KKyAgICAgIHNldCBob3N0IGxvY2FsaG9zdDpcJXAgL3RlbG5ldAorICAgICAgaWYgc3VjY2VzcyBlbmQgMAorICAgICAgdW5kZWYgb25fY2xvc2UKKyAgICAgIHN0b3AgMSBDb25uZWN0aW9uIGZhaWx1cmU6IFwlMQorICB9CisKKyAgIEluIHRoaXMgY2FzZSwgd2hlbiB0aGUgY29ubmVjdGlvbiBzdG9wcywgd2UgYWxzbyBuZWVkIHRvIHNodXQgZG93biB0aGUKKyAgIHR1bm5lbCwgZXZlbiBpZiBpdCBpcyBhdCBhIGxhdGVyIHRpbWUgYWZ0ZXIgVFVOTkVMIGhhcyBmaW5pc2hlZAorICAgZXhlY3V0aW5nLiBUaGlzIHdheSB3ZSBjYW4gZXNjYXBlIGJhY2ssIHJlY29ubmVjdCwgdHJhbnNmZXIgZmlsZXMsIGFuZAorICAgc28gb24gdW50aWwgdGhlIGNvbm5lY3Rpb24gaXMgYnJva2VuIGJ5IGxvZ2dpbmcgb3V0IGZyb20gdGhlIHJlbW90ZSwKKyAgIG9yIGJ5IGV4cGxpY2l0bHkgY2xvc2luZyBpdCwgb3IgYnkgRVhJVGluZyBmcm9tIEMtS2VybWl0LCBhdCB3aGljaAorICAgdGltZSB0aGUgdHVubmVsIGlzIHNodXQgZG93bi4KKworICAgV2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQsIG5vIG1hdHRlciBob3csIHRoZSBPTl9DTE9TRSBtYWNybworICAgZXhlY3V0ZXMgYW5kIHRoZW4gdW5kZWZpbmVzIChkZXN0cm95cykgaXRzZWxmLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvCisgICBiZSBjbG9zaW5nIHR1bm5lbHMgaW4gdGhlIGZ1dHVyZSB3aGVuIHdlIGNsb3NlIHN1YnNlcXVlbnQgY29ubmVjdGlvbnMuCisKKyAgIE90aGVyIHN1Y2ggdHJpY2tzIGNhbiBiZSBpbWFnaW5lZCwgaW5jbHVkaW5nIGVuZGluZyBPTl9DTE9TRSB3aXRoIGEKKyAgIFNUT1AgY29tbWFuZCB0byBmb3JjZSB0aGUgY29tbWFuZCBzdGFjayB0byBiZSBwZWVsZWQgYWxsIHRoZSB3YXkgYmFjaworICAgdG8gdGhlIHRvcCwgZm9yIGV4YW1wbGUgaW4gYSBkZWVwbHkgbmVzdGVkIHNjcmlwdCB0aGF0IGRlcGVuZHMgb24gdGhlCisgICBjb25uZWN0aW9uIGJlaW5nIG9wZW46CisKKyAgZGVmIG9uX2Nsb3NlIHsgc3RvcCAxIENPTk5FQ1RJT04gTE9TVCB9CisKKyAgIFdoZW4gQy1LZXJtaXQgaW52b2tlcyB0aGUgT05fQ0xPU0UgbWFjcm8sIGl0IHN1cHBsaWVzIG9uZSBhcmd1bWVudAorICAgKFwlMSk6IHRoZSByZWFzb24gdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBhcyBhIG51bWJlciwgb25lIG9mIHRoZQorICAgZm9sbG93aW5nOgorCisgIDIgLSBGYXRhbCBmYWlsdXJlIHRvIG5lZ290aWF0ZSBhIHJlcXVpcmVkIGl0ZW0gb24gYSBuZXR3b3JrIGNvbm5lY3Rpb24uCisgIDEgLSBDbG9zZWQgYnkgQy1LZXJtaXQgY29tbWFuZC4KKyAgMCAtIEFsbCBvdGhlcnMgKG5vcm1hbGx5IGNsb3NlZCBieSByZW1vdGUpLgorCisgICB3aGljaCBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2U7IGZvciBleGFtcGxlLCB0byBhZGQgYSBjb21tZW50IHRvCisgICB0aGUgY29ubmVjdGlvbiBsb2c6CisKKyAgZGVmIG9uX2Nsb3NlIHsKKyAgICAgIGxvY2FsIFwlbQorICAgICAgaWYgbm90IG9wZW4gY3ggZW5kIDAKKyAgICAgIHN3aXRjaCBcJTEgeworICAgICAgICA6MCwgLlwlbSA9IENsb3NlZCBieSByZW1vdGUsIGJyZWFrCisgICAgICAgIDoxLCAuXCVtID0gQ2xvc2VkIGJ5IG1lLCBicmVhaworICAgICAgICA6MiwgLlwlbSA9IE5ldHdvcmsgcHJvdG9jb2wgbmVnb3RpYXRpb24gZmFpbHVyZSwgYnJlYWsKKyAgICAgIH0KKyAgICAgIGlmIGRlZiBcJW0gd3JpdGVsbiBjeCB7IyBcJW19CisgIH0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAyLjE1LiBDb250YWN0aW5nIFdlYiBTZXJ2ZXJzIHdpdGggdGhlIEhUVFAgQ29tbWFuZAorCisgICBDLUtlcm1pdCA3LjAgKGF0IHRoaXMgd3JpdGluZywgdGhlIFVOSVggdmVyc2lvbiBvbmx5KSBzdXBwb3J0cyBkaXJlY3QKKyAgIGNvbnRhY3QgYW5kIGludGVyYWN0aW9uIHdpdGggV2ViIHNlcnZlcnMgdmlhIEhUVFAgMS4wIHByb3RvY29sLiBUbworICAgbWFrZSBhIGNvbm5lY3Rpb24sIHVzZSBLZXJtaXQncyBub3JtYWwgbWV0aG9kIGZvciBtYWtpbmcgYSBUQ1AvSVAKKyAgIGNvbm5lY3Rpb24sIGJ1dCBzcGVjaWZ5IHRoZSBIVFRQIHBvcnQ6CisKKyAgU0VUIEhPU1QgaG9zdCBodHRwIFsgc3dpdGNoZXMgXQorCisgICB3aGVyZSBob3N0IGlzIHRoZSBJUCBob3N0bmFtZSBvciBhZGRyZXNzLCBhbmQgaHR0cCBpcyB0aGUgbmFtZSBvZiB0aGUKKyAgIFRDUCBwb3J0IGZvciB0aGUgV2ViIHNlcnZlci4gUmVsZXZhbnQgc3dpdGNoZXMgaW5jbHVkZToKKworICAgL1JBVworICAgICAgICAgIFRyZWF0IHRoZSBjb25uZWN0aW9uIGFzIGEgdHJhbnNwYXJlbnQgYmluYXJ5IHBpcGUuIFRoaXMgc3dpdGNoCisgICAgICAgICAgbWF5IGJlIHJlcXVpcmVkIGlmIGEgcG9ydCBvdGhlciB0aGFuICdodHRwJyBpcyB1c2VkLgorCisgICAvU1NMCisgICAgICAgICAgTWFrZSBhbiBzZWN1cmUgcHJpdmF0ZSBjb25uZWN0aW9uIHdpdGggU1NMIChvbmx5IGlmIFNTTCBzdXBwb3J0CisgICAgICAgICAgaXMgaW5jbHVkZWQgaW4geW91ciB2ZXJzaW9uIG9mIEtlcm1pdCkuIEluIHRoaXMgY2FzZSB0aGUgcG9ydAorICAgICAgICAgIG5hbWUgbWlnaHQgbmVlZCB0byBiZSBodHRwcyByYXRoZXIgdGhhbiBodHRwLCBlLmcuICJzZXQgaG9zdAorICAgICAgICAgIHNlY3VyZXNlcnZlci54eXhjb3JwLmNvbSBodHRwcyAvc3NsIi4KKworICAgL1RMUworICAgICAgICAgIE1ha2UgYW4gc2VjdXJlIHByaXZhdGUgY29ubmVjdGlvbiB3aXRoIFRMUyAob25seSBpZiBUTFMgc3VwcG9ydAorICAgICAgICAgIGlzIGluY2x1ZGVkIGluIHlvdXIgdmVyc2lvbiBvZiBLZXJtaXQpLiBJbiB0aGlzIGNhc2UgdGhlIHBvcnQKKyAgICAgICAgICBuYW1lIHdvdWxkIGJlIGh0dHBzIHJhdGhlciB0aGFuIGh0dHAuCisKKyAgIFRoZW4geW91IGNhbiBpc3N1ZSBhbiBIVFRQIGNvbW1hbmQuIEluIG1vc3QgY2FzZXMsIHRoZSBzZXJ2ZXIgY2xvc2VzCisgICB0aGUgY29ubmVjdGlvbiB3aGVuIHRoZSBjb21tYW5kIGlzIGNvbXBsZXRlLiBFeGFtcGxlOgorCisgIFNFVCBIT1NUIHd3dy5jb2x1bWJpYS5lZHUgaHR0cAorICBJRiBGQUlMIEVYSVQgMSBDYW4ndCBjb250YWN0IHNlcnZlcgorICBIVFRQIEdFVCBrZXJtaXQvaW5kZXguaHRtbAorCisgICBBdCB0aGlzIHBvaW50IHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCwgc2luY2UgdGhhdCdzIGhvdyBIVFRQIDEuMAorICAgd29ya3MuIElmIHlvdSB3YW50IHRvIHBlcmZvcm0gYWRkaXRpb25hbCBvcGVyYXRpb25zLCB5b3UgbXVzdAorICAgZXN0YWJsaXNoIGEgbmV3IGNvbm5lY3Rpb24gd2l0aCBhbm90aGVyIFNFVCBIT1NUIGNvbW1hbmQuCisKKyAgIFRoZSBIVFRQIGNvbW1hbmQgYWN0cyBhcyBhIGNsaWVudCB0byB0aGUgV2ViIHNlcnZlciwgZXhjZXB0IGluc3RlYWQgb2YKKyAgIGRpc3BsYXlpbmcgdGhlIHJlc3VsdHMgbGlrZSBhIFdlYiBicm93c2VyIHdvdWxkLCBpdCBzdG9yZXMgdGhlbS4gQW55CisgICBIVFRQIGNvbW1hbmQgY2FuIChidXQgbmVlZCBub3QpIGluY2x1ZGUgYW55IG9yIGFsbCBvZiB0aGUgZm9sbG93aW5nCisgICBzd2l0Y2hlczoKKworICAgL0FHRU5UOnVzZXItYWdlbnQKKyAgICAgICAgICBJZGVudGlmaWVzIHRoZSBjbGllbnQgdG8gdGhlIHNlcnZlcjsgIkMtS2VybWl0IiBvciAiS2VybWl0LTk1IgorICAgICAgICAgIGJ5IGRlZmF1bHQuCisKKyAgIC9IRUFERVI6aGVhZGVyLWxpbmUKKyAgICAgICAgICBVc2VkIGZvciBzcGVjaWZ5aW5nIGFueSBvcHRpb25hbCBoZWFkZXJzLiBBIGxpc3Qgb2YgaGVhZGVycyBpcworICAgICAgICAgIHByb3ZpZGVkIHVzaW5nIGJyYWNlcyBmb3IgZ3JvdXBpbmc6CisKKyAgL0hFQURFUjp7e3RhZzp2YWx1ZX17dGFnOnZhbHVlfS4uLn0KKworICAgICAgICAgIEZvciBhIGxpc3Rpbmcgb2YgdmFsaWQgdGFnIHZhbHVlIGFuZCB2YWx1ZSBmb3JtYXRzIHNlZSBbNDI1XVJGQworICAgICAgICAgIDE5NDU6IEh5cGVydGV4dCBUcmFuc2ZlciBQcm90b2NvbCAtLSBIVFRQLzEuMC4gQSBtYXhpbXVtIG9mCisgICAgICAgICAgZWlnaHQgaGVhZGVycyBtYXkgYmUgc3BlY2lmaWVkLgorCisgICAvVVNFUjpuYW1lCisgICAgICAgICAgSW4gY2FzZSBhIHBhZ2UgcmVxdWlyZXMgYSB1c2VybmFtZSBmb3IgYWNjZXNzLgorCisgICAvUEFTU1dPUkQ6cGFzc3dvcmQKKyAgICAgICAgICBJbiBjYXNlIGEgcGFnZSByZXF1aXJlcyBhIHBhc3N3b3JkIGZvciBhY2Nlc3MuCisKKyAgIC9BUlJBWTphcnJheW5hbWUKKyAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gc3RvcmUgdGhlIHJlc3BvbnNlIGhlYWRlcnMgaW4gdGhlIGdpdmVuIGFycmF5LAorICAgICAgICAgIG9uZSBsaW5lIHBlciBlbGVtZW50LiBUaGUgYXJyYXkgbmVlZCBub3QgYmUgZGVjbGFyZWQgaW4KKyAgICAgICAgICBhZHZhbmNlLiBFeGFtcGxlOgorCisgIEMtS2VybWl0PyBodHRwIC9hcnJheTpjIGdldCBrZXJtaXQvaW5kZXguaHRtbAorICBDLUtlcm1pdD8gc2hvdyBhcnJheSBjCisgIERpbWVuc2lvbiA9IDkKKyAgMS4gRGF0ZTogRnJpLCAyNiBOb3YgMTk5OSAyMzoxMjoyMiBHTVQKKyAgMi4gU2VydmVyOiBBcGFjaGUvMS4zLjQgKFVuaXgpCisgIDMuIExhc3QtTW9kaWZpZWQ6IE1vbiwgMDYgU2VwIDE5OTkgMjI6MzU6NTggR01UCisgIDQuIEVUYWc6ICJiYzA0OS1mNzItMzdkNDQxY2UiCisgIDUuIEFjY2VwdC1SYW5nZXM6IGJ5dGVzCisgIDYuIENvbnRlbnQtTGVuZ3RoOiAzOTU0CisgIDcuIENvbm5lY3Rpb246IGNsb3NlCisgIDguIENvbnRlbnQtVHlwZTogdGV4dC9odG1sCisKKyAgIEFzIHlvdSBjYW4gc2VlLCB0aGUgaGVhZGVyIGxpbmVzIGFyZSBsaWtlIE1JTUUgZS1tYWlsIGhlYWRlciBsaW5lczoKKyAgIGlkZW50aWZpZXIsIGNvbG9uLCB2YWx1ZS4gVGhlIC9BUlJBWSBzd2l0Y2ggaXMgdGhlIG9ubHkgbWV0aG9kCisgICBhdmFpbGFibGUgdG8gYSBzY3JpcHQgdG8gcHJvY2VzcyB0aGUgc2VydmVyIHJlc3BvbnNlcyBmb3IgYSBQT1NUIG9yCisgICBQVVQgY29tbWFuZC4KKworICAgVGhlIEhUVFAgY29tbWFuZHMgYXJlOgorCisgICBIVFRQIFsgc3dpdGNoZXMgXSBHRVQgcmVtb3RlLWZpbGVuYW1lIFsgbG9jYWwtZmlsZW5hbWUgXQorICAgICAgICAgIFJldHJpZXZlcyB0aGUgbmFtZWQgZmlsZS4gSWYgYSBsb2NhbC1maWxlbmFtZSBpcyBnaXZlbiwgdGhlCisgICAgICAgICAgZmlsZSBpcyBzdG9yZWQgbG9jYWxseSB1bmRlciB0aGF0IG5hbWU7IG90aGVyd2lzZSBpdCBpcyBzdG9yZWQKKyAgICAgICAgICB3aXRoIGl0cyBvd24gbmFtZS4KKworICAgSFRUUCBbIHN3aXRjaGVzIF0gSEVBRCByZW1vdGUtZmlsZW5hbWUgbG9jYWwtZmlsZW5hbWUKKyAgICAgICAgICBMaWtlIEdFVCBleGNlcHQgd2l0aG91dCBhY3R1YWxseSBnZXR0aW5nIHRoZSBmaWxlOyBpbnN0ZWFkIGl0CisgICAgICAgICAgZ2V0cyBvbmx5IHRoZSBoZWFkZXJzLCBzdG9yaW5nIHRoZW0gaW50byB0aGUgZ2l2ZW4gZmlsZSwgd2hvc2UKKyAgICAgICAgICBuYW1lIG11c3QgYmUgZ2l2ZW4sIG9uZSBsaW5lIHBlciBoZWFkZXIgaXRlbSwgYXMgc2hvd24gYWJvdmUgaW4KKyAgICAgICAgICB0aGUgL0FSUkFZOiBzd2l0Y2ggZGVzY3JpcHRpb24uCisKKyAgIEhUVFAgWyBzd2l0Y2hlcyBdIElOREVYIHJlbW90ZS1kaXJlY3RvcnkgWyBsb2NhbC1maWxlbmFtZSBdCisgICAgICAgICAgUmV0cmlldmVzIHRoZSBmaWxlIGxpc3RpbmcgZm9yIHRoZSBnaXZlbiBzZXJ2ZXIgZGlyZWN0b3J5LgorICAgICAgICAgIE5PVEU6IFRoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IG1vc3QgV2ViIHNlcnZlcnMuCisKKyAgIEhUVFAgWyBzd2l0Y2hlcyBdIFBPU1QgWyAvTUlNRS1UWVBFOnR5cGUgXSBsb2NhbC1maWxlIHJlbW90ZS1maWxlCisgICAgICAgICAgVXNlZCB0byBzZW5kIGEgcmVzcG9uc2UgYXMgaWYgaXQgd2VyZSBzZW50IGZyb20gYSBmb3JtLiBUaGUKKyAgICAgICAgICBkYXRhIHRvIGJlIHBvc3RlZCBtdXN0IGJlIHJlYWQgZnJvbSBhIGZpbGUuCisKKyAgIEhUVFAgWyBzd2l0Y2hlcyBdIFBVVCBbIC9NSU1FLVRZUEU6dHlwZSBdIGxvY2FsLWZpbGUgcmVtb3RlLWZpbGUKKyAgICAgICAgICBVcGxvYWRzIGEgbG9jYWwgZmlsZSB0byBhIHNlcnZlciBmaWxlLgorCisgICBIVFRQIFsgc3dpdGNoZXMgXSBERUxFVEUgcmVtb3RlLWZpbGVuYW1lCisgICAgICAgICAgSW5zdHJ1Y3RzIHRoZSBzZXJ2ZXIgdG8gZGVsZXRlIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4gVEVSTUlOQUwgQ09OTkVDVElPTgorCisgIDMuMS4gQ09OTkVDVCBDb21tYW5kIFN3aXRjaGVzCisKKyAgIFRoZSBmb2xsb3dpbmcgc3dpdGNoZXMgKHNlZSBbNDI2XVNlY3Rpb24gMS41KSB3ZXJlIGFkZGVkIHRvIHRoZQorICAgQ09OTkVDVCBjb21tYW5kIGluIDcuMDoKKworICAgL1FVSUVUTFkKKyAgICAgICAgICBEb24ndCBwcmludCB0aGUgIkNvbm5lY3RpbmcgdG8uLi4iIG9yICJCYWNrIGF0Li4uIiBtZXNzYWdlcy4gQ1EKKyAgICAgICAgICBpcyBhbiBpbnZpc2libGUgY29tbWFuZCBzeW5vbnltIGZvciBDT05ORUNUIC9RVUlFVExZLgorCisgICAvVFJJR0dFUjpzdHJpbmcKKyAgICAgICAgICBTcGVjaWZ5IGEgdHJpZ2dlciBvciB0cmlnZ2VycyAoWzQyN11TZWN0aW9uIDMuMikgZWZmZWN0aXZlIGZvcgorICAgICAgICAgIHRoaXMgQ09OTkVDVCBjb21tYW5kIG9ubHksIHRlbXBvcmFyaWx5IG92ZXJyaWRpbmcgYW55IGN1cnJlbnQKKyAgICAgICAgICBTRVQgVEVSTUlOQUwgVFJJR0dFUiB2YWx1ZXMgKFs0MjhdU2VjdGlvbiAzLjIpLgorCisgICBOb3RlOiBPdGhlciBzd2l0Y2hlcyBtaWdodCBhbHNvIGJlIGF2YWlsYWJsZTsgdHlwZSAiY29ubmVjdCA/IiBmb3IgYQorICAgbGlzdCwgImhlbHAgY29ubmVjdCIgZm9yIGEgZGVzY3JpcHRpb24gb2YgZWFjaC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjIuIFRyaWdnZXJzCisKKyAgIFRyaWdnZXJzIHdlcmUgYWRkZWQgZm9yIFVOSVgsIFZNUywgQU9TL1ZTLCBhbmQgSzk1IGluIEMtS2VybWl0IDcuMC4KKworICAgU0VUIFRFUk1JTkFMIFRSSUdHRVIgc3RyaW5nCisgICAgICAgICAgVGVsbHMgQy1LZXJtaXQgdG8gbG9vayBmb3IgdGhlIGdpdmVuIHN0cmluZyBkdXJpbmcgYWxsCisgICAgICAgICAgc3Vic2VxdWVudCBDT05ORUNUIHNlc3Npb25zLCBhbmQgaWYgc2VlbiwgdG8gcmV0dXJuIHRvIGNvbW1hbmQKKyAgICAgICAgICBtb2RlIGF1dG9tYXRpY2FsbHksIGFzIGlmIHlvdSBoYWQgZXNjYXBlZCBiYWNrIG1hbnVhbGx5LiBJZiB0aGUKKyAgICAgICAgICBzdHJpbmcgaW5jbHVkZXMgYW55IHNwYWNlcywgeW91IG11c3QgZW5jbG9zZSBpdCBpbiBicmFjZXMuCisgICAgICAgICAgRXhhbXBsZToKKworICBzZXQgdGVybWluYWwgdHJpZ2dlciB7Tk8gQ0FSUklFUn0KKworICAgQ29tcGFyaXNvbnMgYXJlIG1hZGUgYWZ0ZXIgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbi4KKworICAgSWYgYSBzdHJpbmcgaXMgdG8gaW5jbHVkZSBhIGxpdGVyYWwgYnJhY2UgY2hhcmFjdGVyLCBwcmVjZWRlIGl0IHdpdGggYQorICAgYmFja3NsYXNoOgorCisgIDsgTXkgbW9kZW0gYWx3YXlzIG1ha2VzIHRoaXMgbm9pc2Ugd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBsb3N0OgorICBzZXQgdGVybWluYWwgdHJpZ2dlciB8fHxwcHBce1x7XHtce1VVVVVVVVUKKworICAgSWYgeW91IHdhbnQgS2VybWl0IHRvIGxvb2sgZm9yIG1vcmUgdGhhbiBvbmUgc3RyaW5nIHNpbXVsdGFuZW91c2x5LAorICAgdXNlIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorCisgIHNldCB0ZXJtaW5hbCB0cmlnZ2VyIHt7c3RyaW5nMX17c3RyaW5nMn0uLi57c3RyaW5nbn19CisKKyAgIEluIHRoaXMgY2FzZSwgQy1LZXJtaXQgd2lsbCByZXR1cm4gdG8gY29tbWFuZCBtb2RlIGF1dG9tYXRpY2FsbHkgaWYKKyAgIGFueSBvZiB0aGUgZ2l2ZW4gc3RyaW5ncyBpcyBlbmNvdW50ZXJlZC4gVXAgdG8gOCBzdHJpbmdzIG1heSBiZQorICAgc3BlY2lmaWVkLgorCisgICBJZiB0aGUgbW9zdCByZWNlbnQgcmV0dXJuIHRvIGNvbW1hbmQgbW9kZSB3YXMgY2F1c2VkIGJ5IGEgdHJpZ2dlciwgdGhlCisgICBuZXcgdmFyaWFibGUsIFx2KHRyaWdnZXIpLCBzaG93cyB0aGUgdHJpZ2dlciB2YWx1ZTsgb3RoZXJ3aXNlCisgICBcdih0cmlnZ2VyKSBpcyBlbXB0eS4KKworICAgVGhlIFNIT1cgVFJJR0dFUiBjb21tYW5kIGRpc3BsYXlzIHRoZSBTRVQgVEVSTUlOQUwgVFJJR0dFUiB2YWx1ZXMgYXMKKyAgIHdlbGwgYXMgdGhlIFx2KHRyaWdnZXIpIHZhbHVlLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMy4gVHJhbnNwYXJlbnQgUHJpbnRpbmcKKworICAgQXMgbm90ZWQgaW4gdGhlIG1hbnVhbCwgQy1LZXJtaXQncyBDT05ORUNUIGNvbW1hbmQgb24gVU5JWCBpcyBub3QgYQorICAgdGVybWluYWwgZW11bGF0b3IsIGJ1dCByYXRoZXIgYSAic2VtaXRyYW5zcGFyZW50IHBpcGUiIGJldHdlZW4gdGhlCisgICB0ZXJtaW5hbCBvciBlbXVsYXRvciB5b3UgYXJlIHVzaW5nIHRvIGFjY2VzcyBDLUtlcm1pdCwgYW5kIHRoZSByZW1vdGUKKyAgIGhvc3QgdG8gd2hpY2ggQy1LZXJtaXQgaXMgY29ubmVjdGVkLiBUaGUgInNlbWl0cmFuc3BhcmVudCIgcXVhbGlmaWVyCisgICBpcyBiZWNhdXNlIG9mIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gYXMgd2VsbCBhcyBzZXZlcmFsIGFjdGlvbnMKKyAgIHRha2VuIGJ5IHRoZSBlbXVsYXRvciBpbiByZXNwb25zZSB0byB0aGUgY2hhcmFjdGVycyBvciBzdHJpbmdzIHRoYXQKKyAgIHBhc3MgdGhyb3VnaCBpdCwgc3VjaCBhcyBBUENzLCBLZXJtaXQgcGFja2V0cyAoYXV0b2Rvd25sb2FkKSwKKyAgIHRyaWdnZXJzLCBldGMuCisKKyAgIFRoZSBVTklYIHZlcnNpb24gb2YgQy1LZXJtaXQgNy4wIGFkZHMgYW5vdGhlciBzdWNoIGFjdGlvbjogVHJhbnNwYXJlbnQKKyAgIHByaW50aW5nLCBhbHNvIGNhbGxlZCBDb250cm9sbGVyIHByaW50aW5nIChhcyBkaXN0aW5jdCBmcm9tIEF1dG9wcmludAorICAgb3IgbGluZSBvciBzY3JlZW4gcHJpbnQpLiBJdCBpcyBpbnRlbmRlZCBtYWlubHkgZm9yIHVzZSBvbiBVTklYCisgICB3b3Jrc3RhdGlvbiBjb25zb2xlcyAoYXMgb3Bwb3NlZCB0byByZW1vdGUgbG9naW5zKSwgYnV0IHdpdGggc29tZSBjYXJlCisgICBjYW4gYWxzbyBiZSB1c2VkIHdoZW4gYWNjZXNzaW5nIEMtS2VybWl0IHJlbW90ZWx5LgorCisgICBUcmFuc3BhcmVudCBwcmludGluZyBpcyByZWxhdGVkIHRvIEFQQyBieSBzaGFyaW5nIEMtS2VybWl0J3MgYnVpbHQtaW4KKyAgIEFOU0kgZXNjYXBlLXNlcXVlbmNlIHBhcnNlciB0byBkZXRlY3QgInByaW50ZXIgb24iIGFuZCAicHJpbnRlciBvZmYiCisgICBzZXF1ZW5jZXMgZnJvbSB0aGUgaG9zdC4gV2hlbiB0aGUgcHJpbnRlci1vbiBzZXF1ZW5jZSBpcyByZWNlaXZlZCwgYWxsCisgICBzdWJzZXF1ZW50IGFycml2aW5nIGNoYXJhY3RlcnMgLS0gaW5jbHVkaW5nIE5VTCwgY29udHJvbCBjaGFyYWN0ZXJzLAorICAgYW5kIGVzY2FwZSBzZXF1ZW5jZXMgLS0gYXJlIHNlbnQgdG8gdGhlIFNFVCBQUklOVEVSIGRldmljZSBpbnN0ZWFkIG9mCisgICB0byB5b3VyIHNjcmVlbiB1bnRpbCB0aGUgcHJpbnRlci1vZmYgc2VxdWVuY2UgaXMgcmVjZWl2ZWQsIG9yIHlvdQorICAgZXNjYXBlIGJhY2ssIHdoaWNoZXZlciBoYXBwZW5zIGZpcnN0LiBUaGVzZSBieXRlcyBhcmUgbm90IHRyYW5zbGF0ZWQKKyAgIG9yIG1vZGlmaWVkIG9yIGZpbHRlcmVkIGluIGFueSB3YXkgYnkgS2VybWl0IChleGNlcHQgZm9yIHBvc3NpYmx5CisgICBzdHJpcHBpbmcgb2YgdGhlIDh0aCBiaXQsIGFzIG5vdGVkIGJlbG93KSwgYnV0IGlmIGZpbHRlcmluZyBvcgorICAgdHJhbnNsYXRpb24gaXMgZGVzaXJlZCwgdGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHlvdXIgU0VUIFBSSU5URVIKKyAgIHNlbGVjdGlvbiAoZS5nLiBieSBjaG9vc2luZyBhIHBpcGVsaW5lIG9mIGZpbHRlcnMpLgorCisgICBCeSBkZWZhdWx0LCB5b3VyIFNFVCBQUklOVEVSIGRldmljZSBpcyB5b3VyIGRlZmF1bHQgVU5JWCBwcmludGVyLCBidXQKKyAgIGl0IGNhbiBhbHNvIGJlIGEgZmlsZSwgYSBjb21tYW5kLCBvciB0aGUgbnVsbCBkZXZpY2UgKHdoaWNoIGNhdXNlcyBhbGwKKyAgIHByaW50ZXIgbWF0ZXJpYWwgdG8gYmUgZGlzY2FyZGVkKS4gU2VlIFs0MjldVXNpbmcgQy1LZXJtaXQsIDJuZCBFZC4sCisgICBwLjQxIGZvciBkZXRhaWxzLgorCisgICBUcmFuc3BhcmVudCBwcmludGluZyBpcyBjb250cm9sbGVkIGJ5IHRoZSBjb21tYW5kOgorCisgICBTRVQgVEVSTUlOQUwgUFJJTlQgeyBPTiwgT0ZGIH0KKyAgICAgICAgICBXaGVuIE9OLCB0cmFuc3BhcmVudC1wcmludCBzZXF1ZW5jZXMgYXJlIG9iZXllZCwgYW5kIHByaW50aW5nCisgICAgICAgICAgb2NjdXJzIG9uIHRoZSBzeXN0ZW0gd2hlcmUgQy1LZXJtaXQgaXMgcnVubmluZy4gV2hlbiBPRkYsCisgICAgICAgICAgdHJhbnNwYXJlbnQgcHJpbnQgc2VxdWVuY2VzIGFyZSBpZ25vcmVkIGFuZCBwYXNzZWQgdGhyb3VnaCB0bworICAgICAgICAgIHlvdXIgYWN0dWFsIHRlcm1pbmFsIG9yIGVtdWxhdG9yLCBhbG9uZyB3aXRoIHRoZSBkYXRhIHRoZXkKKyAgICAgICAgICBlbmNsb3NlLiBPRkYgaXMgdGhlIGRlZmF1bHQsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllcgorICAgICAgICAgIEMtS2VybWl0IHJlbGVhc2VzLiBBcyBub3RlZCBpbiB0aGUgbWFudWFsLCB3aGVuIHRoZSBjdXJyZW50IFNFVAorICAgICAgICAgIFBSSU5URVIgZGV2aWNlIGlzIGEgZmlsZSwgdHJhbnNwYXJlbnQtcHJpbnQgbWF0ZXJpYWwgaXMKKyAgICAgICAgICBhcHBlbmRlZCB0byBpdDsgdGhlIGZpbGUgaXMgbm90IG92ZXJ3cml0dGVuLgorCisgICBTRVQgVEVSTUlOQUwgQllURVNJWkUgeyA3LCA4IH0KKyAgIFNFVCBQQVJJVFkgeyBFVkVOLCBPREQsIE1BUkssIFNQQUNFLCBOT05FIH0KKyAgICAgICAgICBJZiB0aGUgdGVybWluYWwgYnl0ZXNpemUgaXMgNywgb3IgUEFSSVRZIGlzIG5vdCBOT05FLCB0aGUgOHRoCisgICAgICAgICAgYml0IG9mIGVhY2ggYnl0ZSBpcyBzdHJpcHBlZCBwcmlvciB0byBwcmludGluZy4KKworICAgVGhlIHRyYW5zcGFyZW50LXByaW50IGVzY2FwZSBzZXF1ZW5jZXMgYXJlOgorCisgICA8RVNDPls1aQorICAgICAgICAgIFByaW50ZXIgT24uIFNlbmQgYWxsIHN1YnNlcXVlbnQgaW5jb21pbmcgYnl0ZXMgdG8gdGhlIHByaW50ZXIKKyAgICAgICAgICB3aXRob3V0IGFueSBraW5kIG9mIGZpbHRlcmluZywgdHJhbnNsYXRpb24sIG9yIGFsdGVyYXRpb24uCisgICAgICAgICAgTm90ZTogPEVTQz4gc3RhbmRzIGZvciBBU0NJSSBjaGFyYWN0ZXIgbnVtYmVyIDI3IChkZWNpbWFsKSwKKyAgICAgICAgICBFc2NhcGUuCisKKyAgIDxFU0M+WzRpCisgICAgICAgICAgUHJpbnRlciBPZmYuIFJlc3VtZSBkaXNwbGF5aW5nIGluY29taW5nIGJ5dGVzIG9uIHRoZSBzY3JlZW4uCisKKyAgIFRoZXNlIGFyZSB0aGUgc2FtZSBzZXF1ZW5jZXMgdXNlZCBieSBERUMgVlQxMDAgYW5kIGhpZ2hlciB0ZXJtaW5hbHMKKyAgIGFuZCBvdGhlciBBTlNJIFgzLjY0IGFuZCBJU08gNjQyOSBjb21wYXRpYmxlIHRlcm1pbmFscy4gVGhlcmUgaXMgbm8KKyAgIHByb3Zpc2lvbiBmb3Igc2VsZWN0aW5nIG90aGVyIHByaW50ZXItY29udHJvbCBzZXF1ZW5jZXMuCisKKyAgIFJlc3RyaWN0aW9uczoKKworICAgIDEuIFlvdSBtdXN0IFNFVCBURVJNIFRSQU5TUEFSRU5ULVBSSU5UIE9OIGJlZm9yZSB5b3UgY2FuIHVzZSB0aGlzCisgICAgICAgZmVhdHVyZS4KKyAgICAyLiBPbmx5IHRoZSA3LWJpdCBmb3JtcyBvZiB0aGUgZXNjYXBlIHNlcXVlbmNlcyBhcmUgc3VwcG9ydGVkLiBUaGUKKyAgICAgICA4LWJpdCBDU0kgQzEgY29udHJvbCBpcyBub3QgcmVjb2duaXplZC4KKyAgICAzLiBBdXRvcHJpbnQgaXMgbm90IHN1cHBvcnRlZCwgc2luY2UgdGhpcyByZXF1aXJlcyBhIGZ1bGwtZmxlZGdlZAorICAgICAgIHRlcm1pbmFsIGVtdWxhdG9yIHdpdGggZGlyZWN0IGFjY2VzcyB0byB0aGUgc2NyZWVuLgorICAgIDQuIFRoZSBzdGFydC1wcmludCBhbmQgc3RvcC1wcmludCBzZXF1ZW5jZXMgcGFzcyB0aHJvdWdoIHRvIHRoZQorICAgICAgIHNjcmVlbiAodGhlcmUgaXMgbm8gd2F5IHRvIGF2b2lkIHRoaXMgd2l0aG91dCBjYXVzaW5nIHVuYWNjZXB0YWJsZQorICAgICAgIGRlbGF5cyBvciBkZWFkbG9ja3MgaW4gQ09OTkVDVCBtb2RlKS4gVGh1cyBpZiB5b3VyIHRlcm1pbmFsIG9yCisgICAgICAgZW11bGF0b3IgYWxzbyBzdXBwb3J0cyB0cmFuc3BhcmVudCBwcmludGluZyB2aWEgdGhlc2Ugc2FtZQorICAgICAgIHNlcXVlbmNlcywgYW4gZW1wdHkgZmlsZSB3aWxsIGJlIHNlbnQgdG8gaXRzIHByaW50ZXIuIE5vcm1hbGx5CisgICAgICAgdGhpcyBoYXMgbm8gZWZmZWN0LgorCisgICBQb2ludCAoNCkgaXMgc2ltaWxhciB0byB0aGUgc2l0dWF0aW9uIHdpdGggYXV0b2Rvd25sb2FkIGFuZCBBUEMgLS0KKyAgIHdoZW4geW91IGhhdmUgc2V2ZXJhbCBLZXJtaXQgY2xpZW50cyBpbiBhIGNoYWluLCB5b3Ugc2hvdWxkIHRha2UgY2FyZQorICAgdGhhdCB0aGVzZSBmZWF0dXJlcyBhcmUgZW5hYmxlZCBpbiBvbmx5IG9uZSBvZiB0aGVtLgorCisgICBFeGFtcGxlIDE6CisKKyAgc2V0IHByaW50ZXIge3xscHIgLVBsYXNlcn0gIDsgU3BlY2lmeSB0aGUgcHJpbnRlciAoaWYgbm90IGRlZmF1bHQpLgorICBzZXQgdGVybSBwcmludCBvbiAgICAgICAgICAgOyBFbmFibGUgdHJhbnNwYXJlbnQgcHJpbnRpbmcuCisgIHNldCB0ZXJtIGJ5dGUgOCAgICAgICAgICAgICA7IEVuYWJsZSA4LWJpdCBjaGFyYWN0ZXJzLgorICBjb25uZWN0ICAgICAgICAgICAgICAgICAgICAgOyBFbnRlciBDT05ORUNUIG1vZGUuCisKKyAgIEV4YW1wbGUgMjoKKworICBzZXQgcHJpbnRlciAvaG9tZS91c2Vycy9vbGdhL3ByaW50ZXIubG9nICA7IFNlbmQgcHJpbnRlciBtYXRlcmlhbCB0byBhIGZpbGUuCisKKyAgIEV4YW1wbGUgMzoKKworICBzZXQgcHJpbnRlciB7fCBncmVwIC12IF5SZWNlaXZlZCB8IGxwcn0gICA7IEZpbHRlciBvdXQgc29tZSBsaW5lcworCisgICBUaGVuIHVzZSAicGNwcmludCIgb3IgInZ0cHJpbnQiIGNvbW1hbmRzIG9uIHRoZSBob3N0IHRvIGluaXRpYXRlCisgICB0cmFuc3BhcmVudCBwcmludCBvcGVyYXRpb25zLiBTZWUgWzQzMF1Vc2luZyBDLUtlcm1pdCwgMm5kIEVkLiwgcC40MDYKKyAgIGZvciBkZXRhaWxzLgorCisgICBIZXJlIGlzIGEgc2FtcGxlICJwY3ByaW50IiBzaGVsbCBzY3JpcHQgZm9yIFVOSVg6CisKKyAgIyEvYmluL3NoCisgIGVjaG8gLW4gJzxFU0M+WzVpJworICBpZiBbICQjIC1lcSAwIF07IHRoZW4KKyAgICBjYXQKKyAgZWxzZQorICAgIGNhdCAkKgorICBmaQorICBlY2hvIC1uICc8RkY+PEVTQz5bNGknCisgICMgKGVuZCkKKworICAgKFJlcGxhY2UgIjxFU0M+IiBieSB0aGUgYWN0dWFsIEFTQ0lJIEVzY2FwZSBjaGFyYWN0ZXIgYW5kICI8RkY+IiBieQorICAgdGhlIEFTQ0lJIEZvcm1mZWVkIGNoYXJhY3RlcikuCisKKyAgIElmIHlvdSBhbHdheXMgd2FudCB0cmFuc3BhcmVudCBwcmludGluZyBlbmFibGVkLCBwdXQgInNldCB0ZXJtIHByaW50CisgICBvbiIgaW4geW91ciBDLUtlcm1pdCBjdXN0b21pemF0aW9uIGZpbGUgKH4vLm15a2VybXJjIGluIFVOSVgpLiBUaGUKKyAgICJzZXQgdGVybSBieXRlc2l6ZSIgc2VsZWN0aW9uLCBob3dldmVyLCBpcyBhIHByb3BlcnR5IG9mIGVhY2ggc2VwYXJhdGUKKyAgIGNvbm5lY3Rpb24uCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy40LiBCaW5hcnkgYW5kIFRleHQgU2Vzc2lvbiBMb2dzCisKKyAgIEMtS2VybWl0IDcuMCBjb3JyZWN0cyBhbiBvdmVyc2lnaHQgaW4gZWFybGllciByZWxlYXNlcywgaW4gd2hpY2gKKyAgIGJpbmFyeSBzZXNzaW9uIGxvZ3MgKFNFVCBTRVNTSU9OLUxPRyBCSU5BUlkpIHRyYW5zbGF0ZWQgY2hhcmFjdGVyIHNldHMKKyAgIGFuZCBwZXJmb3JtZWQgdmFyaW91cyBmb3JtYXR0aW5nIHRyYW5zZm9ybWF0aW9ucyAoZS5nLiAibmV3bGluZSBtb2RlIikKKyAgIGJlZm9yZSB3cml0aW5nIGNoYXJhY3RlcnMgdG8gdGhlIHNlc3Npb24gbG9nLiBJbiBDLUtlcm1pdCA3LjAsCisgICBiaW5hcnktbW9kZSBzZXNzaW9uIGxvZ2dpbmcgd3JpdGVzIGNoYXJhY3RlcnMgYXMgdGhleSBjb21lIGluLCBiZWZvcmUKKyAgIGFueXRoaW5nIChvdGhlciB0aGF0IHBhcml0eS1iaXQgc3RyaXBwaW5nKSBpcyBkb25lIHRvIHRoZW0uIFRleHQtbW9kZQorICAgc2Vzc2lvbiBsb2dnaW5nIHJlY29yZHMgdGhlIGNoYXJhY3RlcnMgYWZ0ZXIgcHJvY2Vzc2luZy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LiBGSUxFIFRSQU5TRkVSCisKKyAgIEV2ZXJ5IGZpbGUgaXMgdHJhbnNmZXJyZWQgZWl0aGVyIGluIHRleHQgbW9kZSAod2hpY2ggaW1wbGllcworICAgcmVjb3JkLWZvcm1hdCBhbmQgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbikgb3IgYmluYXJ5IG1vZGUgKGluIHdoaWNoCisgICBlYWNoIGJ5dGUgaXMgc2VudCBsaXRlcmFsbHkgd2l0aG91dCBhbnkga2luZCBvZiBjb252ZXJzaW9uKS4gVGhlIG1vZGUKKyAgIGluIHdoaWNoIGEgZmlsZSBpcyB0cmFuc2ZlcnJlZCBpcyBjb250cm9sbGVkIGJ5IChhKSB0aGUgZGVmYXVsdCBtb2RlLAorICAgaW4gdGhlIGFic2VuY2Ugb2YgYW55IG90aGVyIGluZGljYXRpb25zOyAoYikgdGhlIFNFVCBGSUxFIFRZUEUKKyAgIGNvbW1hbmQ7IChjKSB2YXJpb3VzIGF1dG9tYXRpYyBtZWNoYW5pc21zIGJhc2VkIG9uIGNsaWVudC9zZXJ2ZXIKKyAgIG5lZ290aWF0aW9ucywgZGlyZWN0b3J5IGluZm9ybWF0aW9uIG9yIGZpbGVuYW1lIHBhdHRlcm5zLCBldGMuCisKKyAgIFRoZSBkZWZhdWx0IEZJTEUgVFlQRSB3YXMgY2hhbmdlZCBmcm9tIFRFWFQgdG8gQklOQVJZIGluIEMtS2VybWl0IDcuMAorICAgYmVjYXVzZToKKworICAgICAqIFRyYW5zZmVycmluZyBhIHRleHQgZmlsZSBpbiBiaW5hcnkgbW9kZSBkb2VzIGxlc3MgZGFtYWdlIHRoYW4KKyAgICAgICB0cmFuc2ZlcnJpbmcgYSBiaW5hcnkgZmlsZSBpbiB0ZXh0IG1vZGUuCisgICAgICogT25seSBiaW5hcnktbW9kZSB0cmFuc2ZlcnMgY2FuIGJlIHJlY292ZXJlZCBmcm9tIHRoZSBwb2ludCBvZgorICAgICAgIGZhaWx1cmUuCisgICAgICogVGhlIGF1dG9tYXRpYyB0cmFuc2Zlci1tb2RlIG1lY2hhbmlzbXMgc3dpdGNoIHRvIHRleHQgbW9kZSBvbiBhCisgICAgICAgcGVyLWZpbGUgYmFzaXMgYW55d2F5LCBzbyBvbmx5IHRob3NlIGZpbGVzIHRoYXQgYXJlIG5vdCBjb3ZlcmVkIGJ5CisgICAgICAgdGhlIGF1dG9tYXRpYyBtZWNoYW5pc21zIGFyZSBhZmZlY3RlZC4KKyAgICAgKiBBbGwgZmlsZSB0cmFuc2ZlcnMgb24gdGhlIFdlYiBhcmUgZG9uZSBpbiBiaW5hcnkgbW9kZSwgc28gcGVvcGxlCisgICAgICAgYXJlIGFjY3VzdG9tZWQgdG8gaXQgYW5kIGV4cGVjdCBpdC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LjAuIEJVRyBGSVhFUywgTUlOT1IgQ0hBTkdFUywgQU5EIENMQVJJRklDQVRJT05TCisKKyAgICA0LjAuMC4gRmlsZW5hbWVzIHdpdGggU3BhY2VzCisKKyAgIEZpbGVuYW1lcyB0aGF0IGNvbnRhaW4gc3BhY2VzIGFyZSBhIG1ham9yIG51aXNhbmNlIHRvIGEgcHJvZ3JhbSBsaWtlCisgICBLZXJtaXQsIHdob3NlIGNvbW1hbmQgbGFuZ3VhZ2UgaXMgbGluZS0gYW5kIHdvcmQtb3JpZW50ZWQsIGluIHdoaWNoCisgICB3b3JkcyBhcmUgc2VwYXJhdGVkIGJ5IHNwYWNlcyBhbmQgYSBmaWxlbmFtZSBpcyBhc3N1bWVkIHRvIGJlIGEKKyAgICJ3b3JkIi4gSW4gZ2VuZXJhbCAodW5sZXNzIG5vdGVkIG90aGVyd2lzZSBpbiB0aGUgZGVzY3JpcHRpb24gb2YgYQorICAgcGFydGljdWxhciBjb21tYW5kKSwgdGhlcmUgaXMgb25seSBvbmUgd2F5IHRvIHJlZmVyIHRvIHN1Y2ggZmlsZXMgaW4KKyAgIEtlcm1pdCBjb21tYW5kcywgYW5kIHRoYXQgaXMgdG8gZW5jbG9zZSB0aGUgbmFtZSBpbiBicmFjZXM6CisKKyAgc2VuZCB7dGhpcyBmaWxlfQorCisgICBUZWxscyBLZXJtaXQgdG8gc2VuZCB0aGUgZmlsZSB3aG9zZSBuYW1lIGlzICJ0aGlzIGZpbGUiICh0d28gd29yZHMsIG5vCisgICBxdW90ZXMpLiBPZiBjb3Vyc2UsIHZhcmlvdXMgY2lyY3VtbG9jdXRpb25zIGFyZSBhbHNvIHBvc3NpYmxlLCBzdWNoCisgICBhczoKKworICBkZWZpbmUgXCVhIHRoaXMgZmlsZQorICBzZW5kIFwlYQorCisgICBCVVQsIHBlcmhhcHMgY29udHJhcnkgdG8gZXhwZWN0YXRpb24sIHlvdSBjYW4ndCB1c2UgIlwzMiIgdG8gcmVwcmVzZW50CisgICB0aGUgc3BhY2U6CisKKyAgc2VuZCB0aGlzXDMyZmlsZQorCisgICBkb2VzIG5vdCB3b3JrLiBXaHk/IEJlY2F1c2UgdGhlIEtlcm1pdCBwYXJzZXIsIHdoaWNoIG11c3Qgd29yayBvbiBtYW55CisgICBvcGVyYXRpbmcgc3lzdGVtcyBpbmNsdWRpbmcgV2luZG93cywgaGFzIG5vIHdheSBvZiBrbm93aW5nIHdoYXQgeW91CisgICBtZWFuIGJ5ICJ0aGlzXDMyZmlsZSIuIERvIHlvdSBtZWFuIGEgZmlsZSB3aG9zZSBuYW1lIGlzICJ0aGlzIGZpbGUiIGluCisgICB0aGUgY3VycmVudCBkaXJlY3Rvcnk/IE9yIGRvIHlvdSBtZWFuIGEgZmlsZSB3aG9zZSBuYW1lIGlzICIzMmZpbGUiIGluCisgICB0aGUgInRoaXMiIHN1YmRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCBkaXJlY3Rvcnk/IEd1ZXNzaW5nIHdvbid0IGRvCisgICBoZXJlOyBLZXJtaXQgbXVzdCBiZWhhdmUgY29uc2lzdGVudGx5IGFuZCBkZXRlcm1pbmlzdGljYWxseSBpbiBhbGwKKyAgIGNhc2VzIG9uIGFsbCBwbGF0Zm9ybXMuCisKKyAgIE5vdGUgdGhhdCB5b3UgY2FuJ3QgdXNlIEVzYyBvciBUYWIgd2l0aGluIHsuLi59IGZvciBmaWxlbmFtZQorICAgY29tcGxldGlvbiwgb3IgcXVlc3Rpb24gbWFyayB0byBnZXQgYSBmaWxlbmFtZSBsaXN0LiBIb3dldmVyLCB5b3UgY2FuCisgICBpbmNsdWRlIHdpbGRjYXJkczsgZm9yIGV4YW1wbGU6CisKKyAgc2VuZCB7KiAqfQorCisgICBzZW5kcyBhbGwgZmlsZXMgd2hvc2UgbmFtZSBjb250YWlucyBhIHNwYWNlLgorCisgICBBbGwgdGhpbmdzIGNvbnNpZGVyZWQsIGl0IGlzIGJlc3QgdG8gYXZvaWQgc3BhY2VzIGluIGZpbGUgYW5kCisgICBkaXJlY3RvcnkgbmFtZXMgaWYgeW91IGNhbi4gQWxzbyBzZWUgWzQzMV1TZWN0aW9uIDUuNCBvbiB0aGlzIHRvcGljLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4wLjEuIFBhY2tldCBvdXQgb2YgV2luZG93CisKKyAgIEMtS2VybWl0IDYuMCBjb3VsZCBzZW5kIHBhY2tldHMgIm91dCBvZiB3aW5kb3ciIGlmIHRoZSB3aW5kb3cgc2l6ZSB3YXMKKyAgIGdyZWF0ZXIgdGhhbiAxIGFuZCBBQ0tzIGhhZCBhcnJpdmVkIG91dCBvZiBvcmRlci4gRml4ZWQgaW4gNi4xLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4wLjIuIE1PVkUgYWZ0ZXIgQUREIFNFTkQtTElTVAorCisgICBBREQgU0VORC1MSVNUIGZvbGxvd2VkIGJ5IE1PVkUgZGlkIG5vdCBkZWxldGUgb3JpZ2luYWwgZmlsZXM7IGZpeGVkIGluCisgICA2LjEuIENhcnJpZXIgbG9zcyB3YXMgbm90IGRldGVjdGVkIGR1cmluZyB0cmFuc2ZlcjsgaW4gNy4wIEMtS2VybWl0CisgICBjaGVja3MgZm9yIHRoaXMgKGJ1dCByZXN1bHRzIGNhbiBub3QgYmUgZ3VhcmFudGVlZCkuIEluIGFueSBjYXNlLCB0aGUKKyAgIHByb3RvY29sIHdpbGwgZXZlbnR1YWxseSB0aW1lIG91dCBpZiB0aGUgY29ubmVjdGlvbiBpcyBsb3N0LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4wLjMuIEdFVCBhbmQgUkVDRUlWRSBBcy1OYW1lcworCisgICBJbiA1QSgxOTApIHRocm91Z2ggNi4wLjE5MiwgdGhlIEdFVCBhbmQgUkVDRUlWRSBhcy1uYW1lIGRpZCBub3QKKyAgIHByb3Blcmx5IG92ZXJyaWRlIHRoZSBSRUNFSVZFIFBBVEhOQU1FUyBzZXR0aW5nLiBJbiA3LjAgaXQgZG9lcy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMC40LiBOZXcgQnJpZWYgU3RhdGlzdGljcyBMaXN0aW5nCisKKyAgIFZlcnNpb24gNy4wIGFkZHMgYSAvQlJJRUYgc3dpdGNoIHRvIHRoZSBTVEFUSVNUSUNTIGNvbW1hbmQsIHRvIGRpc3BsYXkKKyAgIGEgc2hvcnQgZmlsZS10cmFuc2ZlciBzdGF0aXN0aWNzIHJlcG9ydC4gL0JSSUVGIGlzIG5vdyB0aGUgZGVmYXVsdC4KKyAgIFVzZSAvVkVSQk9TRSB0byBzZWUgdGhlIGZ1bGwgZGlzcGxheSwgd2hpY2ggaXMgYWJvdXQgMjUgbGluZXMgbG9uZy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMC41LiBJbXByb3ZlZCBGQVNUIENvbW1hbmQKKworICAgVGhlIHByZWluc3RhbGxlZCBkZWZpbml0aW9uIG9mIHRoZSBGQVNUIG1hY3JvIGRpZCBub3QgdGFrZSBlbm91Z2gKKyAgIGZhY3RvcnMgaW50byBhY2NvdW50LiBOb3cgaXQgc2V0cyBwYWNrZXQgbGVuZ3RocyBhbmQgd2luZG93IHNpemVzCisgICBhcHByb3ByaWF0ZSB0byB0aGUgY29uZmlndXJhdGlvbi4gRnVydGhlcm1vcmUsIGluIElSSVggb25seSwgaXQgbWlnaHQKKyAgIHJlc3RyaWN0IHRoZSBTRU5EIHBhY2tldCBsZW5ndGggdG8gNDAwMCwgdG8gd29yayBhcm91bmQgYSBidWcgaW4gdGhlCisgICBJUklYIFRlbG5ldCBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgSVJJWCB2ZXJzaW9uIChzZWUKKyAgIFs0MzJdY2t1YndyLnR4dCwgSVJJWCBzZWN0aW9uKS4gVG8gc2VlIHRoZSBidWlsdC1pbiBkZWZpbml0aW9uIG9mIHRoZQorICAgRkFTVCBtYWNybywgdHlwZSAic2hvdyBtYWNybyBmYXN0Ii4gVG8gY2hhbmdlIGl0LCBzaW1wbHkgZGVmaW5lIGl0IHRvCisgICBiZSB3aGF0ZXZlciB5b3Ugd2FudCAtLSBpdCdzIGp1c3QgYSBtYWNybywgbGlrZSBhbnkgb3RoZXIuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjAuNi4gVGhlIFNFVCBTRU5EIEJBQ0tVUCBDb21tYW5kCisKKyAgIFZlcnNpb24gNy4wIGFkZHMgU0VUIFNFTkQgQkFDS1VQIHsgT04sIE9GRiB9LiBUaGlzIHRlbGxzIHdoZXRoZXIKKyAgIGJhY2t1cCBmaWxlcyBzaG91bGQgYmUgc2VudC4gQmFja3VwIGZpbGVzIGFyZSB0aGUgb25lcyBjcmVhdGVkIGJ5CisgICBLZXJtaXQgKGFuZCBFTUFDUywgYW5kIHBvc3NpYmx5IG90aGVyIGFwcGxpY2F0aW9ucykgdG8gcHJlc2VydmUgb2xkCisgICBjb3BpZXMgb2YgZmlsZXMgd2hlbiBjcmVhdGluZyBuZXcgb25lcyB3aXRoIHRoZSBzYW1lIG5hbWUuIEtlcm1pdCBkb2VzCisgICB0aGlzIHdoZW4gcmVjZWl2aW5nIGEgZmlsZSBhbmQgaXRzIEZJTEUgQ09MTElTSU9OIHNldHRpbmcgaXMgQkFDS1VQCisgICAob3IgUkVOQU1FLCBpbiB3aGljaCBjYXNlIGl0IHRoZSBuZXcgZmlsZSBnZXRzIHRoZSBiYWNrdXAgbmFtZSkuIE9uCisgICBtb3N0IHBsYXRmb3JtcywgdGhlIGJhY2t1cCBuYW1lIGlzIGZvcm1lZCBieSBhZGRpbmc6CisKKyAgLn5ufgorCisgICB0byB0aGUgZW5kIG9mIHRoZSBmaWxlbmFtZSwgd2hlcmUgIm4iIGlzIGEgbnVtYmVyLiBGb3IgZXhhbXBsZSwgaWYgdGhlCisgICBvcmlnaW5hbCBmaWxlIGlzIG9vZmEudHh0LCBhIGJhY2t1cCBmaWxlIG1pZ2h0IGJlIGNhbGxlZDoKKworICBvb2ZhLnR4dC5+MX4KKworICAgKG9yIG9vZmEudHh0Ln4yfiwgZXRjKS4gSWYgeW91IFNFVCBTRU5EIEJBQ0tVUCBPRkYsIHRoaXMgdGVsbHMgS2VybWl0CisgICBub3QgdG8gc2VuZCBmaWxlcyB0aGF0IGhhdmUgYmFja3VwIG5hbWVzLiBOb3JtYWxseSwgU0VUIFNFTkQgQkFDS1VQIGlzCisgICBPTiAoYXMgc2hvd24gYnkgU0hPVyBQUk9UT0NPTCksIGFuZCBiYWNrdXAgZmlsZXMgYXJlIHNlbnQgaWYgdGhlaXIKKyAgIG5hbWVzIG1hdGNoIHRoZSBTRU5EIGZpbGUgc3BlY2lmaWNhdGlvbi4KKworICAgQWxzbyBzZWUgUFVSR0UsIFNFVCBGSUxFIENPTExJU0lPTiwgU0VORCAvTk9CQUNLVVAsIERJUkVDVE9SWQorICAgL1tOT11CQUNLVVAuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjAuNy4gVGhlIFNFVCB7IFNFTkQsIFJFQ0VJVkUgfSBWRVJTSU9OLU5VTUJFUlMgQ29tbWFuZAorCisgICBWTVMgT25seS4gTm9ybWFsbHkgd2hlbiBzZW5kaW5nIGZpbGVzLCBWTVMgQy1LZXJtaXQgc3RyaXBzIHRoZSB2ZXJzaW9uCisgICBudW1iZXIuIEZvciBleGFtcGxlLCBpZiB0aGUgZmlsZSBpcyBGT08uQkFSOzM0LCB0aGUgbmFtZSBpcyBzZW50IGFzCisgICBGT08uQkFSICh3aXRob3V0IHRoZSAiOzM0IikuIElmIHlvdSB3YW50IHRvIGtlZXAgdmVyc2lvbiBudW1iZXJzIG9uCisgICB3aGVuIHNlbmRpbmcgZmlsZXMsIHVzZSBTRVQgU0VORCBWRVJTSU9OLU5VTUJFUlMgT04uIFRoZSBlZmZlY3QKKyAgIGRlcGVuZHMgb24gdGhlIHJlY2VpdmVyLgorCisgICBOb3JtYWxseSB3aGVuIHJlY2VpdmluZyBmaWxlcywgYW5kIGFuIGluY29taW5nIGZpbGVuYW1lIGluY2x1ZGVzIGEKKyAgIFZNUy1zdHlsZSB2ZXJzaW9uIG51bWJlciAoc3VjaCBhcyBGT08uQkFSOzM0KSBWTVMgQy1LZXJtaXQgc3RyaXBzIGl0CisgICBiZWZvcmUgdHJ5aW5nIHRvIGNyZWF0ZSB0aGUgbmV3IGZpbGU7IHRoaXMgd2F5IHRoZSBuZXcgZmlsZSByZWNlaXZlcworICAgdGhlIG5leHQgaGlnaGVzdCB2ZXJzaW9uIG51bWJlciBpbiB0aGUgY3VzdG9tYXJ5IG1hbm5lciBmb3IgVk1TLiBJZgorICAgeW91IHdhbnQgdmVyc2lvbiBudW1iZXJzIG9uIGluY29taW5nIGZpbGVuYW1lcyB0byBiZSB1c2VkIGluIGNyZWF0aW5nCisgICB0aGUgbmV3IGZpbGVzLCB1c2UgU0VUIFJFQ0VJVkUgVkVSU0lPTi1OVU1CRVJTIE9OLgorCisgICBOb3JtYWxseSB0aGVzZSBjb21tYW5kcyB3b3VsZCBiZSBlZmZlY3RpdmUgb25seSB3aGVuIFZNUyBDLUtlcm1pdCBpcworICAgZXhjaGFuZ2luZyBmaWxlcyB3aXRoIGEgbm9uLVZNUyBLZXJtaXQgcHJvZ3JhbSwgc2luY2UgVk1TLXRvLVZNUworICAgdHJhbnNmZXJzIHVzZSBsYWJlbGVkIG1vZGUgdW5sZXNzIHlvdSBoYXZlIGdvbmUgb3V0IG9mIHlvdXIgd2F5IHRvCisgICBkZWZlYXQgaXQuCisKKyAgIEV4YW1wbGU6IFlvdSB3YW50IHRvIHNlbmQgYWxsIHZlcnNpb25zIG9mIGFsbCBmaWxlcyBpbiB0aGUgY3VycmVudAorICAgZGlyZWN0b3J5IGZyb20gYSBWTVMgQy1LZXJtaXQgY2xpZW50IHRvIGEgVU5JWCBDLUtlcm1pdCBzZXJ2ZXIuIFVzZToKKworICBzZXQgc2VuZCB2ZXJzaW9uLW51bWJlcnMgb24KKyAgc2VuZCAqLio7KgorCisgICBUaGUgcmVzdWx0aW5nIFVuaXggZmlsZXMgd2lsbCBoYXZlIFZNUy1zdHlsZSB2ZXJzaW9uIG51bWJlcnMgYXMgcGFydAorICAgb2YgdGhlaXIgbmFtZSwgZm9yIGV4YW1wbGUgImZvby5iYXI7MSIsICJmb28uYmFyOzIiLCBldGMuCisKKyAgIE5vdyBzdXBwb3NlIHlvdSB3YW50IHRvIHNlbmQgdGhlc2UgZmlsZXMgZnJvbSBVbml4IHRvIGFub3RoZXIgVk1TCisgICBzeXN0ZW0gYW5kIHByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlcnMuIEFnYWluIHdlIGhhdmUgYSBVbml4IEMtS2VybWl0CisgICBzZXJ2ZXIgYW5kIFZNUyBDLUtlcm1pdCBjbGllbnQuIEdpdmUgdGhlc2UgY29tbWFuZHMgdG8gdGhlIGNsaWVudDoKKworICBzZXQgcmVjZWl2ZSB2ZXJzaW9uLW51bWJlcnMgb24KKyAgZ2V0ICoKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMC44LiBUaGUgU0VUIHsgU0VORCwgUkVDRUlWRSB9IHsgTU9WRS1UTywgUkVOQU1FLVRPIH0gQ29tbWFuZHMKKworICAgVGhlc2UgY29tbWFuZHMgYXJlIHBlcnNpc3RlbnQgZ2xvYmFsIHZlcnNpb25zIG9mIHRoZSAvTU9WRS1UTzogYW5kCisgICAvUkVOQU1FLVRPOiBzd2l0Y2hlcyBvZiB0aGUgU0VORCwgR0VULCBhbmQgUkVDRUlWRSBjb21tYW5kcy4gVGhleQorICAgc2hvdWxkIG5vcm1hbGx5IGJlIHVzZWQgb25seSB3aGVuIHNldHRpbmcgdXAgYSBkZWRpY2F0ZWQKKyAgIHRyYW5zYWN0aW9uLXByb2Nlc3NpbmcgYXBwbGljYXRpb24sIGluIHdoaWNoIGVhY2ggZmlsZSBpcyB0byBiZSBtb3ZlZAorICAgb3IgcmVuYW1lZCBpbW1lZGlhdGVseSBhZnRlciwgYW5kIG9ubHkgaWYsIGl0IGlzIHRyYW5zZmVycmVkCisgICBzdWNjZXNzZnVsbHksIHNvIHRoYXQgKGZvciBleGFtcGxlKSBhbiBpbmRlcGVuZGVudCwgY29uY3VycmVudCBwcm9jZXNzCisgICBjYW4gbm90aWNlIHdoZW4gbmV3IGZpbGVzIGFwcGVhciBhbmQgcHJvY2VzcyB0aGVtIGltbWVkaWF0ZWx5IHdpdGhvdXQKKyAgIGhhdmluZyB0byBndWVzcyB3aGV0aGVyIHRoZXkgYXJlIGNvbXBsZXRlLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4wLjkuIFNFVCBGSUxFIElOQ09NUExFVEUgQVVUTworCisgICBTRVQgRklMRSBJTkNPTVBMRVRFIHsgS0VFUCwgRElTQ0FSRCB9LCB3aGljaCB0ZWxscyB3aGV0aGVyIHRvIGtlZXAgb3IKKyAgIGRpc2NhcmQgaW5jb21wbGV0ZWx5IHJlY2VpdmVkIGZpbGVzLCBoYXMgYSBuZXcgb3B0aW9uLCBBVVRPLCB3aGljaCBpcworICAgYWxzbyB0aGUgZGVmYXVsdC4gSXQgbWVhbnMgS0VFUCB0aGUgaW5jb21wbGV0ZSBmaWxlIGlmIHRoZSB0cmFuc2ZlciBpcworICAgaW4gYmluYXJ5IG1vZGUsIG90aGVyd2lzZSBESVNDQVJEIGl0LiBUaGlzIHJlZHVjZXMgdGhlIGNoYW5jZXMgdGhhdCBhCisgICBzdWJzZXF1ZW50IHJlY292ZXJ5IG9wZXJhdGlvbiAoUkVTRU5ELCBSRUdFVCwgZXRjKSBjb3VsZCBwcm9kdWNlIGEKKyAgIGNvcnJ1cHQgZmlsZSwgc2luY2UgcmVjb3Zlcnkgd29ya3Mgb25seSBmb3IgYmluYXJ5LW1vZGUgdHJhbnNmZXJzLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDQuMS4gRklMRS1UUkFOU0ZFUiBGSUxFTkFNRSBURU1QTEFURVMKKworICAgRmlsZS10cmFuc2ZlciBmaWxlbmFtZSB0ZW1wbGF0ZXMgYWxsb3cgZmlsZXMgdG8gYmUgcmVuYW1lZAorICAgYXV0b21hdGljYWxseSBieSB0aGUgZmlsZSBzZW5kZXIsIHRoZSByZWNlaXZlciwgb3IgYm90aCwgZHVyaW5nCisgICB0cmFuc2ZlciBvZiBncm91cHMgb2YgZmlsZXMuCisKKyAgICA0LjEuMS4gVGVtcGxhdGVzIGluIHRoZSBBcy1OYW1lCisKKyAgIFByaW9yIHRvIEMtS2VybWl0IDYuMSBhbmQgS2VybWl0IDk1IDEuMS4xMiB0aGUgb25seSBvcHRpb25zIHRoYXQgY291bGQKKyAgIGJlIHVzZWQgdG8gYWZmZWN0IHRoZSBuYW1lcyBvZiBmaWxlcyBiZWluZyB0cmFuc2ZlcnJlZCB3ZXJlIFNFVAorICAgRklMRU5BTUVTIHsgTElURVJBTCwgQ09OVkVSVEVEIH0gYW5kIFNFVCB7IFNFTkQsIFJFQ0VJVkUgfSBQQVRITkFNRVMgeworICAgT04sIE9GRiB9LCBwbHVzIHRoZSAiYXMtbmFtZSIgZmVhdHVyZSBvZiB0aGUgU0VORCAoTU9WRSwgZXRjKSBhbmQKKyAgIFJFQ0VJVkUgY29tbWFuZHMuCisKKyAgIFByZXZpb3VzbHksIHRoZSBhcy1uYW1lIGNvdWxkIGJlIHVzZWQgb25seSBmb3IgYSBzaW5nbGUgZmlsZS4gRm9yCisgICBleGFtcGxlOgorCisgIFNFTkQgRk9PIEJBUgorCisgICB3b3VsZCBzZW5kIHRoZSBmaWxlIEZPTyB1bmRlciB0aGUgbmFtZSBCQVIsIGJ1dDoKKworICBTRU5EICouVFhUIGFueXRoaW5nCisKKyAgIHdhcyBub3QgYWxsb3dlZCwgc2luY2UgaXQgd291bGQgZ2l2ZSB0aGUgc2FtZSBuYW1lIHRvIGVhY2ggZmlsZSB0aGF0CisgICB3YXMgc2VudC4gV2hlbiByZWNlaXZpbmc6CisKKyAgUkVDRUlWRSBGT08KKworICAgd291bGQgcmVuYW1lIHRoZSBmaXJzdCBpbmNvbWluZyBmaWxlIHRvIEZPTyBiZWZvcmUgc3RvcmluZyBpdCBvbiB0aGUKKyAgIGRpc2ssIGJ1dCBzdWJzZXF1ZW50IGZpbGVzIHdvdWxkIG5vdCBiZSByZW5hbWVkIHRvIEZPTywgc2luY2UgdGhpcworICAgd291bGQgcmVzdWx0IGluIG92ZXJ3cml0aW5nIHRoZSBzYW1lIGZpbGUgcmVwZWF0ZWRseS4gSW5zdGVhZCwgdGhleQorICAgd2VyZSBzdG9yZWQgdW5kZXIgdGhlIG5hbWVzIHRoZXkgYXJyaXZlZCB3aXRoLgorCisgICBCZWdpbm5pbmcgaW4gQy1LZXJtaXQgNi4xIGFuZCBLZXJtaXQgOTUgMS4xLjEyLCBpdCBpcyBwb3NzaWJsZSB0bworICAgc3BlY2lmeSBhcy1uYW1lcyBpbiBTRU5ELCBSRUNFSVZFLCBhbmQgcmVsYXRlZCBjb21tYW5kcyBldmVuIGZvciBmaWxlCisgICBncm91cHMuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHJlcGxhY2VtZW50IHZhcmlhYmxlcyBpbiB0aGUKKyAgIGFzLW5hbWUsIGFsb25nIHdpdGggb3B0aW9uYWwgbWF0ZXJpYWwgc3VjaCBjaGFyYWN0ZXItc3RyaW5nIGZ1bmN0aW9ucworICAgYW5kL29yIGNvbnN0YW50IHN0cmluZ3MuIEFuIGFzLW5hbWUgY29udGFpbmluZyByZXBsYWNlbWVudCB2YXJpYWJsZXMKKyAgIGlzIGNhbGxlZCBhIGZpbGVuYW1lIHRlbXBsYXRlLgorCisgICBUaGUga2V5IHRvIGZpbGVuYW1lIHRlbXBsYXRlcyBpcyB0aGUgbmV3IHZhcmlhYmxlOgorCisgIFx2KGZpbGVuYW1lKQorCisgICBEdXJpbmcgZmlsZSB0cmFuc2ZlciBpdCBpcyByZXBsYWNlZCBieSB0aGUgbmFtZSBvZiBlYWNoIGZpbGUgY3VycmVudGx5CisgICBiZWluZyB0cmFuc2ZlcnJlZCAoYWZ0ZXIgdHJhbnNmZXIsIGl0IGlzIHRoZSBuYW1lIG9mIHRoZSBsYXN0IGZpbGUKKyAgIHRyYW5zZmVycmVkKS4KKworICAgU28sIGZvciBleGFtcGxlOgorCisgIHNlbmQgKi50eHQgXHYoZmlsZW5hbWUpLm5ldworCisgICBzZW5kcyBlYWNoIGZpbGUgd2l0aCBpdHMgb3duIG5hbWUsIGJ1dCB3aXRoICIubmV3IiBhcHBlbmRlZCB0byBpdC4gT2YKKyAgIGNvdXJzZSBpZiB0aGUgbmFtZSBhbHJlYWR5IGNvbnRhaW5zIHBlcmlvZHMsIHRoaXMgY291bGQgY29uZnVzZSB0aGUKKyAgIGZpbGUgcmVjZWl2ZXIsIHNvIHlvdSBjYW4gYWxzbyBhY2hpZXZlIGZhbmNpZXIgZWZmZWN0cyB3aXRoCisgICBjb25zdHJ1Y3Rpb25zIGxpa2U6CisKKyAgc2VuZCAqLnR4dCBcZnJlcGxhY2UoXHYoZmlsZW5hbWUpLC4sXykubmV3CisKKyAgIHdoaWNoIHJlcGxhY2VzIGFsbCBwZXJpb2RzIGluIHRoZSBvcmlnaW5hbCBmaWxlbmFtZSBieSB1bmRlcnNjb3JlcywKKyAgIGFuZCB0aGVuIGFwcGVuZHMgIi5uZXciIHRvIHRoZSByZXN1bHQuIFNvLCBmb3IgZXhhbXBsZSwgb29mYS50eHQgd291bGQKKyAgIGJlIHNlbnQgYXMgb29mYV90eHQubmV3LgorCisgICBBbm90aGVyIG5ldyB2YXJpYWJsZSB0aGF0IGlzIHVzZWZ1bCBpbiB0aGlzIHJlZ2FyZCBpcyBcdihmaWxlbnVtYmVyKSwKKyAgIHdoaWNoIGlzIHRoZSBvcmRpbmFsIG51bWJlciBvZiB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBmaWxlIGdyb3VwLCBzbworICAgeW91IGNhbiBhbHNvOgorCisgIHNlbmQgKi50eHQgRklMRVxmbHBhZChcdihmaWxlbnVtKSwyLDApCisKKyAgIHJlc3VsdGluZyBpbiBhIHNlcmllcyBvZiBmaWxlcyBjYWxsZWQgRklMRTAwLCBGSUxFMDEsIEZJTEUwMiwgZXRjLiAoQXQKKyAgIHRoZSBlbmQgb2YgdGhlIHRyYW5zZmVyLCBcdihmaWxlbnVtKSB0ZWxscyB0aGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQKKyAgIHdlcmUgdHJhbnNmZXJyZWQpLgorCisgICBJZiB5b3Ugc3BlY2lmeSBhIGNvbnN0YW50IGFzLW5hbWUgd2hlbiBzZW5kaW5nIGEgZmlsZSBncm91cDoKKworICBzZW5kICoudHh0IHRoaXNuYW1lb25seQorCisgICBLZXJtaXQgY29tcGxhaW5zIGFuZCBhc2tzIHlvdSB0byBpbmNsdWRlIHJlcGxhY2VtZW50IHZhcmlhYmxlcyBpbiB0aGUKKyAgIGFzLW5hbWUuIFlvdSBzaG91bGQgZ2VuZXJhbGx5IHVzZSBcdihmaWxlbmFtZSkgb3IgXHYoZmlsZW51bWJlcikgZm9yCisgICB0aGlzIHB1cnBvc2UsIHNpbmNlIG90aGVyIHZhcmlhYmxlcyAod2l0aCB0aGUgcG9zc2libGUgZXhjZXB0aW9uIG9mCisgICBkYXRlL3RpbWUgcmVsYXRlZCB2YXJpYWJsZXMpIGRvIG5vdCBjaGFuZ2UgZnJvbSBvbmUgZmlsZSB0byB0aGUgbmV4dC4KKyAgIEJ1dCBLZXJtaXQgYWNjZXB0cyBhbnkgYXMtbmFtZSBhdCBhbGwgdGhhdCBjb250YWlucyBhbnkga2luZCBvZgorICAgdmFyaWFibGVzIGZvciBmaWxlIGdyb3VwLCBldmVuIGlmIHRoZSB2YXJpYWJsZSB3aWxsIG5vdCBjaGFuZ2UuIFNvOgorCisgIHNlbmQgKi50eHQgXCVhCisKKyAgIGlzIGFjY2VwdGVkLCBidXQgYWxsIGZpbGVzIGFyZSBzZW50IHdpdGggdGhlIHNhbWUgbmFtZSAodGhlIHZhbHVlIG9mCisgICBcJWEsIGlmIGl0IGhhcyBvbmUgYW5kIGl0IGlzIGNvbnN0YW50KS4gSWYgdGhlIHZhcmlhYmxlIGhhcyBubyB2YWx1ZQorICAgYXQgYWxsLCB0aGUgZmlsZXMgYXJlIHNlbnQgdW5kZXIgdGhlaXIgb3duIG5hbWVzLgorCisgICBPZiBjb3Vyc2UsIHRoZSB2YWx1ZSBvZiBcJWEgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUgbmVlZCBub3QgYmUKKyAgIGNvbnN0YW50OgorCisgIGRlZmluZSBcJWEgRklMRVxmbHBhZChcdihmaWxlbnVtKSwyLDApX2F0X1x2KHRpbWUpCisgIHNlbmQgKi50eHQgXCVhCisKKyAgIFRoZSBSRUNFSVZFIGNvbW1hbmQsIHdoZW4gZ2l2ZW4gd2l0aG91dCBhbiBhcy1uYW1lLCBiZWhhdmVzIGFzIGFsd2F5cywKKyAgIHN0b3JpbmcgYWxsIGluY29taW5nIGZpbGVzIHVuZGVyIHRoZSBuYW1lcyB0aGV5IGFycml2ZSB3aXRoLCBzdWJqZWN0CisgICB0byBTRVQgRklMRSBOQU1FIGFuZCBTRVQgUkVDRUlWRSBQQVRITkFNRVMgbW9kaWZpY2F0aW9ucyAoWzQzM11TZWN0aW9uCisgICA0LjEwKS4KKworICAgSG93ZXZlciwgd2hlbiBhbiBhcy1uYW1lIGlzIGdpdmVuIGluIHRoZSBSRUNFSVZFIGNvbW1hbmQsIGl0IGlzCisgICBhcHBsaWVkIHRvIGFsbCBpbmNvbWluZyBmaWxlcyByYXRoZXIgdGhhbiB0byBqdXN0IHRoZSBmaXJzdC4gSWYgaXQKKyAgIGRvZXMgbm90IGNvbnRhaW4gcmVwbGFjZW1lbnQgdmFyaWFibGVzLCB0aGVuIHRoZSBjdXJyZW50IEZJTEUKKyAgIENPTExJU0lPTiBzZXR0aW5nIGdvdmVybnMgdGhlIHJlc3VsdC4gRm9yIGV4YW1wbGU6CisKKyAgcmVjZWl2ZSBmb28KKworICAgd2lsbCByZXN1bHQgaW4gaW5jb21pbmcgZmlsZXMgbmFtZWQgZm9vLCBmb28ufjF+LCBmb28ufjJ+LCBhbmQgc28gb24sCisgICB3aXRoIHRoZSBkZWZhdWx0IEZJTEUgQ09MTElTSU9OIHNldHRpbmcgb2YgQkFDS1VQLiBJZiBpdCBkb2VzIGNvbnRhaW4KKyAgIHJlcGxhY2VtZW50IHZhcmlhYmxlcywgb2YgY291cnNlIHRoZXkgYXJlIHVzZWQuCisKKyAgIFdoZW4gcmVjZWl2aW5nIGZpbGVzLCB0aGUgXHYoZmlsZW5hbWUpIHZhcmlhYmxlIHJlZmVycyB0byB0aGUgbmFtZQorICAgdGhhdCB3YXMgcmVjZWl2ZWQgaW4gdGhlIGluY29taW5nIGZpbGUtaGVhZGVyIHBhY2tldCwgQkVGT1JFIGFueQorICAgcHJvY2Vzc2luZyBieSBTRVQgRklMRSBOQU1FUyBvciBTRVQgUkVDRUlWRSBQQVRITkFNRVMuIFNpbmNlIHRoZQorICAgZmlsZW5hbWVzIGluIGZpbGUtaGVhZGVyIHBhY2tldHMgYXJlIHVzdWFsbHkgaW4gdXBwZXJjYXNlLCB5b3Ugd291bGQKKyAgIG5lZWQgdG8gY29udmVydCB0aGVtIGV4cGxpY2l0bHkgaWYgeW91IHdhbnQgdGhlbSBpbiBsb3dlcmNhc2UsIGUuZy46CisKKyAgcmVjZWl2ZSBcZmxvd2VyKFx2KGZpbGVuYW1lKSkubmV3CisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjEuMi4gVGVtcGxhdGVzIG9uIHRoZSBDb21tYW5kIExpbmUKKworICAgT24gdGhlIGNvbW1hbmQtbGluZSwgdXNlIHRlbXBsYXRlcyBhcyBzaG93biBhYm92ZSBhcyB0aGUgLWEgb3B0aW9uCisgICBhcmd1bWVudCwgYmVhcmluZyBpbiBtaW5kIHRoZSBwcm9wZW5zaXR5IG9mIFVOSVggYW5kIHBlcmhhcHMgb3RoZXIKKyAgIHNoZWxscyB0byB0cmVhdCBiYWNrc2xhc2ggYXMgYSBzaGVsbCBlc2NhcGUgY2hhcmFjdGVyLiBTbyBpbiBVTklYIChmb3IKKyAgIGV4YW1wbGUpOgorCisgIGtlcm1pdCAtcyBvb2ZhLiogLWEgeC5cXHYoZmlsZW51bSkKKworICAgQnkgdGhlIHdheSwgdGhpcyByZXByZXNlbnRzIGEgY2hhbmdlIGZyb20gNi4wIGFuZCBlYXJsaWVyIHJlbGVhc2VzIGluCisgICB3aGljaCB0aGUgYXMtbmFtZSAoLWEgYXJndW1lbnQgb3Igb3RoZXJ3aXNlKSB3YXMgbm90IGV2YWx1YXRlZCBieSB0aGUKKyAgIGNvbW1hbmQgcGFyc2VyLiBUaHVzLCBmb3IgZXhhbXBsZSwgaW4gVk1TICh3aGVyZSB0aGUgc2hlbGwgZG9lcyBub3QKKyAgIGNhcmUgYWJvdXQgYmFja3NsYXNoZXMpLCBpdCB3YXMgcG9zc2libGUgdG86CisKKyAga2VybWl0IC1zIG9vZmEudHh0IC1hIGM6XHRtcFxvb2ZhLnR4dAorCisgICBOb3cgYmFja3NsYXNoZXMgaW4gdGhlIGFzLW5hbWUgbXVzdCBiZSBxdW90ZWQgbm90IG9ubHkgZm9yIHRoZSBzaGVsbAorICAgKGlmIG5lY2Vzc2FyeSkgYnV0IGFsc28gZm9yIEtlcm1pdCBpdHNlbGY6CisKKyAga2VybWl0IC1zIG9vZmEudHh0IC1hIGM6XFx0bXBcXG9vZmEudHh0ICAgICAgOyBLZXJtaXQgb25seQorICBrZXJtaXQgLXMgb29mYS50eHQgLWEgYzpcXFxcdG1wXFxcXG9vZmEudHh0ICA7IFNoZWxsIGFuZCBLZXJtaXQKKworICAgWW91IGNhbiBhbHNvIHVzZSB0aGUgXGZsaXRlcmFsKCkgZnVuY3Rpb24gZm9yIHRoaXM6CisKKyAga2VybWl0IC1zIG9vZmEudHh0IC1hIFxmbGl0ZXJhbChjOlx0bXBcb29mYS50eHQpICAgICAgOyBLZXJtaXQgb25seQorICBrZXJtaXQgLXMgb29mYS50eHQgLWEgXFxmbGl0ZXJhbChjOlxcdG1wXFxvb2ZhLnR4dCkgICA7IFNoZWxsIGFuZCBLZXJtaXQKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMS4zLiBQb3N0LVRyYW5zZmVyIFJlbmFtaW5nCisKKyAgIEZpbGVuYW1lIHRlbXBsYXRlcyBhcmUgbm93IGFsc28gdXNlZnVsIGluIFNFVCB7IFNFTkQsIFJFQ0VJVkUgfQorICAgUkVOQU1FLVRPIGFuZCBpbiB0aGUgL1JFTkFNRS1UTzogc3dpdGNoLCB0aGF0IGNhbiBiZSBnaXZlbiB0byB0aGUKKyAgIFNFTkQsIEdFVCwgb3IgUkVDRUlWRSBjb21tYW5kczsgdGhpcyBpcyBzaW1pbGFyIHRvIGFuIGFzLW5hbWUsIGJ1dCBpcworICAgZWZmZWN0aXZlIG9uIGEgcGVyLWZpbGUgYmFzaXMgaWYgYW5kIG9ubHkgaWYgdGhlIGZpbGUgd2FzIHRyYW5zZmVycmVkCisgICBzdWNjZXNzZnVsbHkuCisKKyAgIE1PVkUtVE8gYW5kIFJFTkFNRS1UTyBhZGRyZXNzIGEgcmVxdWlyZW1lbnQgY29tbW9ubHkgc3RhdGVkIGZvcgorICAgdHJhbnNhY3Rpb24gcHJvY2Vzc2luZyBhbmQgc2ltaWxhciBzeXN0ZW1zLiBTdXBwb3NlLCBmb3IgZXhhbXBsZSwgYQorICAgY2VudHJhbCBzeXN0ZW0gIlgiIGFjY2VwdHMgY29ubmVjdGlvbnMgZnJvbSBtdWx0aXBsZSBjbGllbnRzCisgICBzaW11bHRhbmVvdXNseTsgYSBwcm9jZXNzIG9uIFggd2FpdHMgZm9yIGEgZmlsZSB0byBhcHBlYXIgYW5kIHRoZW4KKyAgIHByb2Nlc3NlcyB0aGUgZmlsZS4gVGhpcyBwcm9jZXNzIG11c3QgaGF2ZSBhIHdheSBvZiBrbm93aW5nIHdoZW4gdGhlCisgICBmaWxlIGhhcyBiZWVuIGNvbXBsZXRlbHkgYW5kIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZCBiZWZvcmUgaXQgc3RhcnRzCisgICB0byBwcm9jZXNzIGl0LiBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgZWFzaWx5IHVzaW5nIEMtS2VybWl0J3MgU0VUIHsKKyAgIFNFTkQsIFJFQ0VJVkUgfSB7IE1PVkUtVE8sIFJFTkFNRS1UTyB9IGNvbW1hbmQgb3IgL01PVkUtVE86IG9yCisgICAvUkVOQU1FLVRPOiBzd2l0Y2hlcywgZGVzY3JpYmVkIGluIFs0MzRdU2VjdGlvbnMgNC43LjEgdGhyb3VnaAorICAgWzQzNV00LjcuMy4KKworICAgSGVyZSdzIGFuIGV4YW1wbGUgZm9yIHRoZSBjbGllbnQgc2lkZSwgaW4gd2hpY2ggZmlsZXMgdG8gYmUgc2VudCBhcmUKKyAgIHBsYWNlZCBpbiBhIGNlcnRhaW4gZGlyZWN0b3J5ICgvdXNyL29sZ2EvdG9zZW5kIGluIHRoaXMgZXhhbXBsZSkgYnkKKyAgIGFub3RoZXIgcHJvY2VzcyB3aGVuIHRoZXkgYXJlIHJlYWR5IHRvIGdvLiBUaGlzIG1pZ2h0IGJlIGluIGEgaG9zcGl0YWwKKyAgIG9yIGJpZyBkb2N0b3IncyBvZmZpY2UsIHdoZXJlIG1lZGljYWwgaW5zdXJhbmNlIGNsYWltcyBhcmUgZW50ZXJlZCBhdAorICAgYSBudW1iZXIgb2Ygd29ya3N0YXRpb25zLCBhbmQgdGhlbiBkZXBvc2l0ZWQgaW4gdGhlICJ0b3NlbmQiCisgICBkaXJlY3RvcnksIGZyb20gd2hpY2ggdGhleSBhcmUgc2VudCB0byBhIGNsYWltcyBjbGVhcmluZ2hvdXNlLiBXZQorICAgYXNzdW1lIHRoZSBjb25uZWN0aW9uIGlzIGFscmVhZHkgbWFkZSBhbmQgYSBLZXJtaXQgc2VydmVyIGlzIG9uIHRoZQorICAgb3RoZXIgZW5kLgorCisgIGxvY2FsIHNyY2RpciBmaW5kaXIgICAgICAgICAgICAgIDsgRGVjbGFyZSBsb2NhbCAoYXV0b21hdGljKSB2YXJpYWJsZXMKKyAgYXNzaWduIHNyY2RpciAvdXNyL29sZ2EvdG9zZW5kICAgOyBMb2NhbCBzb3VyY2UgZGlyZWN0b3J5IChmaWxlcyB0byBzZW5kKQorICBhc3NpZ24gZmluZGlyIC91c3Ivb2xnYS9zZW50ICAgICA7IFdoZXJlIHRvIG1vdmUgZmlsZXMgYWZ0ZXIgdGhleSBhcmUgc2VudAorICBsb2cgdHJhbnNhY3Rpb25zICAgICAgICAgICAgICAgICA7IEtlZXAgYSBsb2cgb2YgdHJhbnNmZXJzCisgIGNkIFxtKHNyY2RpcikgICAgICAgICAgICAgICAgICAgIDsgQ2hhbmdlIHRvIHRoZSBzb3VyY2UgZGlyZWN0b3J5CisgIHdoaWxlIHRydWUgeyAgICAgICAgICAgICAgICAgICAgIDsgTG9vcCBmb3JldmVyLi4uCisgICAgICBzZW5kIC9tb3ZlLXRvOlxtKGZpbmRpcikgKiAgIDsgU2VuZCBhbGwgZmlsZXMKKyAgICAgIHNsZWVwIDYwICAgICAgICAgICAgICAgICAgICAgOyBTbGVlcCBhIG1pbnV0ZQorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IEdvIGJhY2sgYW5kIGRvIGl0IGFnYWluCisKKyAgIE5vdGUgaG93IHNpbXBsZSB0aGlzIGlzLiBPbmNlIGVhY2ggZmlsZSBpcyBzZW50LCBpdCBpcyBtb3ZlZCBzbyBpdAorICAgd29uJ3QgYmUgc2VudCBhZ2FpbiAoeW91IGNvdWxkIGFsc28gdXNlIFNFTkQgL1JFTkFNRS1UTzogb3IgZXZlbiBTRU5ECisgICAvREVMRVRFKS4gSWYgYSB0cmFuc2ZlciBmYWlscywgdGhlIGZpbGUgaXMgbm90IG1vdmVkIGFuZCBzbyB3ZSB0cnkKKyAgIGFnYWluIHRvIHNlbmQgaXQgbmV4dCB0aW1lIGFyb3VuZC4gSWYgdGhlcmUgYXJlIG5vIGZpbGVzIHRvIHNlbmQsIHRoZQorICAgU0VORCBjb21tYW5kIGRvZXMgbm90aGluZyBidXQgYSBtZXNzYWdlIGlzIHByaW50ZWQ7IHlvdSBjYW4gYXZvaWQgdGhlCisgICBtZXNzYWdlIGJ5IGNoZWNraW5nIGZpcnN0IHRvIHNlZSBpZiBhbnkgZmlsZXMgYXJlIGluIHRoZSBkaXJlY3Rvcnk6CisKKyAgd2hpbGUgdHJ1ZSB7ICAgICAgICAgICAgICAgICAgICAgOyBMb29wIGZvcmV2ZXIuLi4KKyAgICAgIGlmID4gXGZmaWxlcygqKSAwIC0gICAgICAgICAgOyBJZiB0aGVyZSBhcmUgYW55IGZpbGVzCisgICAgICAgIHNlbmQgL21vdmUtdG86XG0oZmluZGlyKSAqIDsgc2VuZCB0aGVtLgorICAgICAgc2xlZXAgNjAgICAgICAgICAgICAgICAgICAgICA7IFNsZWVwIGEgbWludXRlLgorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IEdvIGJhY2sgYW5kIGRvIGl0IGFnYWluLgorCisgICBJdCdzIGV2ZW4gc2ltcGxlciBvbiB0aGUgc2VydmVyIHNpZGUgKGhlcmUgYWdhaW4gd2UgYXNzdW1lIHRoZQorICAgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGluIHBsYWNlKToKKworICBsb2NhbCByY3ZkaXIgZmluZGlyICAgICAgICAgICAgICA7IERlY2xhcmUgbG9jYWwgKGF1dG9tYXRpYykgdmFyaWFibGVzCisgIGFzc2lnbiByY3ZkaXIgL3Vzci9pdmFuL3RtcCAgICAgIDsgVGVtcG9yYXJ5IHJlY2VpdmluZyBkaXJlY3RvcnkKKyAgYXNzaWduIGZpbmRpciAvdXNyL2l2YW4vbmV3ICAgICAgOyBXaGVyZSB0byBtb3ZlIGZpbGVzIGFmdGVyIHJlY2VwdGlvbgorICBsb2cgdHJhbnNhY3Rpb25zICAgICAgICAgICAgICAgICA7IEtlZXAgYSBsb2cgb2YgdHJhbnNmZXJzCisgIGNkIFxtKHJjdmRpcikgICAgICAgICAgICAgICAgICAgIDsgQ2hhbmdlIHRvIHRoZSBzb3VyY2UgZGlyZWN0b3J5CisgIHNldCByZWNlaXZlIG1vdmUtdG8gXG0oZmluZGlyKSAgIDsgRGVjbGFyZSBtb3ZlLXRvIGRpcmVjdG9yeS4KKyAgc2VydmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbnRlciBzZXJ2ZXIgbW9kZS4KKworICAgQSBzZXBhcmF0ZSBwcm9jZXNzIChlLmcuIHRoZSBtZWRpY2FsIGNsYWltLWZvcm0gZGVjb2RlcikgY2FuIGxvb2sgZm9yCisgICBmaWxlcyBhcHBlYXJpbmcgaW4gdGhlIC91c3IvaXZhbi9uZXcgZGlyZWN0b3J5IGFuZCBwcm9jZXNzIHRoZW0gd2l0aAorICAgZXZlcnkgY29uZmlkZW5jZSB0aGF0IHRoZXkgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcmVjZWl2ZWQuCisKKyAgIE5vdGUgdGhhdCB0aGUgdXNlIG9mIE1PVkUtVE8gY2FuIHJlc3VsdCBpbiBtb3ZlZCBmaWxlcyBvdmVyd3JpdGluZyBvbmUKKyAgIGFub3RoZXIgKHRoZSBhcHBsaWNhdGlvbiB3b3VsZCBub3JtYWxseSBhdm9pZCB0aGlzIGJ5IGFzc2lnbmluZyBlYWNoCisgICB0cmFuc2FjdGlvbiBhIHVuaXF1ZSwgZS5nLiBiYXNlZCBvbiBjdXN0b21lciBudW1iZXIgYW5kIGNsYWltIG51bWJlcikuCisgICBCdXQgaWYgZmlsZW5hbWUgY29sbGlzaW9ucyBhcmUgYSBwb3NzaWJpbGl0eSBpbiB5b3VyIGFwcGxpY2F0aW9uLAorICAgUkVOQU1FLVRPIG1pZ2h0IGJlIGEgYmV0dGVyIGNob2ljZTsgeW91IGNhbiB1c2UgYW55IHZhcmlhYmxlcyB5b3UgbGlrZQorICAgaW4gdGhlIHRlbXBsYXRlIHRvIGVuc3VyZSB1bmlxdWVuZXNzIG9mIHRoZSBSRU5BTUUtVE8gZmlsZW5hbWU7IGZvcgorICAgZXhhbXBsZToKKworICBTRVQgUkVDRUlWRSBSRU5BTUUtVE8gXHYoZmlsZW5hbWUpX1x2KG5kYXRlKV9cdihudGltZSlfXHYodXNlcmlkKV9cdihwaWQpCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC4yLiBGSUxFLVRSQU5TRkVSIFBJUEVTIEFORCBGSUxURVJTCisKKyAgICA0LjIuMS4gSU5UUk9EVUNUSU9OCisKKyAgIEJlZ2lubmluZyBpbiBDLUtlcm1pdCA2LjEgYW5kIEtlcm1pdCA5NSAxLjEuMTIsIGl0IGlzIHBvc3NpYmxlIHRvIHNlbmQKKyAgIGZyb20gYSBjb21tYW5kLCBvciAicGlwZSIsIGFzIHdlbGwgYXMgZnJvbSBhIGZpbGUsIGFuZCB0byByZWNlaXZlIHRvIGEKKyAgIHBpcGUgb3IgY29tbWFuZC4gSW4gYSB0eXBpY2FsIGV4YW1wbGUsIHdlIG1pZ2h0IHdhbnQgdG8gdHJhbnNmZXIgYW4KKyAgIGVudGlyZSBkaXJlY3RvcnkgdHJlZSBmcm9tIG9uZSBVTklYIHN5c3RlbSB0byBhbm90aGVyIChidXQgd2l0aG91dAorICAgdXNpbmcgdGhlIG1ldGhvZHMgZGVzY3JpYmVkIGluIFs0MzZdU2VjdGlvbnMgNC4zICwgWzQzN100LjEwLAorICAgWzQzOF00LjExLCBhbmQgWzQzOV00LjE1KS4gV2UgY291bGQgZG8gdGhpcyBpbiBtdWx0aXBsZSBzdGVwcyBhcworICAgZm9sbG93czoKKworICAxLiBDcmVhdGUgYSB0YXIgYXJjaGl2ZSBvZiB0aGUgZGVzaXJlZCBkaXJlY3RvcnkgdHJlZQorICAyLiBDb21wcmVzcyB0aGUgdGFyIGFyY2hpdmUKKyAgMy4gVHJhbnNmZXIgaXQgaW4gYmluYXJ5IG1vZGUgdG8gdGhlIG90aGVyIGNvbXB1dGVyCisgIDQuIERlY29tcHJlc3MgaXQKKyAgNS4gRXh0cmFjdCB0aGUgZGlyZWN0b3J5IHRyZWUgZnJvbSB0aGUgdGFyIGFyY2hpdmUKKworICAgQnV0IHRoaXMgaXMgaW5jb252ZW5pZW50IGFuZCBpdCByZXF1aXJlcyBhIHRlbXBvcmFyeSBmaWxlLCB3aGljaCBtaWdodAorICAgYmUgbGFyZ2VyIHRoYW4gd2UgaGF2ZSByb29tIGZvci4KKworICAgVGhlIG5ldyBwaXBlLXRyYW5zZmVyIGZlYXR1cmUgbGV0cyB5b3UgZG8gc3VjaCB0aGluZ3MgaW4gYSBzaW5nbGUKKyAgIHN0ZXAsIGFuZCB3aXRob3V0IGludGVybWVkaWF0ZSBmaWxlcy4KKworICAgQWRkaXRpb25hbCBuZXcgZmVhdHVyZXMsIGFsc28gZGlzY3Vzc2VkIGhlcmUsIGxldCB5b3Ugc3BlY2lmeSBwcmUtIGFuZAorICAgcG9zdC0gcHJvY2Vzc2luZyBmaWx0ZXJzIGZvciBvdXRib3VuZCBhbmQgaW5jb21pbmcgZmlsZXMsIGFuZCBnaXZlIHlvdQorICAgYSB3YXkgdG8gaW5zZXJ0IHRoZSBvdXRwdXQgZnJvbSBzaGVsbCBvciBzeXN0ZW0gY29tbWFuZHMgaW50byBDLUtlcm1pdAorICAgY29tbWFuZHMuCisKKyAgIFRoZSBmaWxlLXRyYW5zZmVyIHJlbGF0ZWQgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZSBvbmx5IHdpdGggS2VybWl0CisgICBwcm90b2NvbCwgbm90IHdpdGggYW55IGV4dGVybmFsIHByb3RvY29scywgbm9yIHdpdGggSzk1J3MgYnVpbHQtaW4KKyAgIFhZWk1PREVNIHByb3RvY29scyAoYmVjYXVzZSBYWVpNT0RFTSByZWNvdmVycyBmcm9tIHRyYW5zbWlzc2lvbiBlcnJvcnMKKyAgIGJ5IHJld2luZGluZyB0aGUgc291cmNlIGZpbGUsIGFuZCB5b3UgY2FuJ3QgcmV3aW5kIGEgcGlwZSkuCisKKyAgIFRoaXMgc2VjdGlvbiBiZWdpbnMgYnkgZGlzY3Vzc2luZyB0aGUgc2ltcGxlIGFuZCBzdHJhaWdodGZvcndhcmQgdXNlCisgICBvZiB0aGVzZSBmZWF0dXJlcyBpbiBVTklYLCBpbiB3aGljaCBwaXBlcyBhbmQgaW5wdXQvb3V0cHV0IHJlZGlyZWN0aW9uCisgICBhcmUgYSBmdW5kYW1lbnRhbCBjb21wb25lbnQgYW5kIHRoZXJlZm9yZSAianVzdCB3b3JrIiwgYW5kIHRoZW4gZ29lcworICAgb24gdG8gZGlzY3VzcyB0aGVpciBvcGVyYXRpb24gaW4gV2luZG93cyBhbmQgT1MvMiwgd2hlcmUgbWF0dGVycyBhcmUKKyAgIG11Y2ggbW9yZSBjb21wbGljYXRlZC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMi4xLjEuIFRFUk1JTk9MT0dZCisKKyAgIFN0YW5kYXJkIElucHV0CisgICAgICAgICAgVGhpcyBpcyBhIHByZWNpc2UgdGVjaG5pY2FsIHRlcm0gZGVub3RpbmcgdGhlIG5vcm1hbCBzb3VyY2Ugb2YKKyAgICAgICAgICBpbnB1dCBmb3IgYSBjb21tYW5kIG9yIHByb2dyYW0sIHdoaWNoIGlzIHRoZSBrZXlib2FyZCBvZiB5b3VyCisgICAgICAgICAgdGVybWluYWwgYnkgZGVmYXVsdCwgYnV0IHdoaWNoIGNhbiBiZSByZWRpcmVjdGVkIHRvIGEgZmlsZSBvcgorICAgICAgICAgIHBpcGUuCisKKyAgIFN0ZGluCisgICAgICAgICAgQWJicmV2aWF0aW9uIGZvciBTdGFuZGFyZCBJbnB1dC4KKworICAgU3RhbmRhcmQgT3V0cHV0CisgICAgICAgICAgQSBwcmVjaXNlIHRlY2huaWNhbCB0ZXJtIGRlbm90aW5nIHRoZSBub3JtYWwgZGVzdGluYXRpb24gZm9yCisgICAgICAgICAgb3V0cHV0IGZyb20gYSBjb21tYW5kIG9yIHByb2dyYW0sIHdoaWNoIGlzIHlvdXIgdGVybWluYWwgc2NyZWVuCisgICAgICAgICAgYnkgZGVmYXVsdCwgYnV0IHdoaWNoIGNhbiBiZSByZWRpcmVjdGVkIHRvIGEgZmlsZS4KKworICAgU3Rkb3V0CisgICAgICAgICAgQWJicmV2aWF0aW9uIGZvciBTdGFuZGFyZCBPdXRwdXQuCisKKyAgIFN0ZGlvCisgICAgICAgICAgQWJicmV2aWF0aW9uIGZvciBTdGFuZGFyZCBJbnB1dCAvIFN0YW5kYXJkIE91dHB1dC4KKworICAgSS9PCisgICAgICAgICAgQWJicmV2aWF0aW9uIGZvciBJbnB1dCAvIE91dHB1dC4KKworICAgU2hlbGwKKyAgICAgICAgICBUZXh0LWJhc2VkIHN5c3RlbSBjb21tYW5kIHByb2Nlc3Nvciwgc3VjaCBhcyB0aGUgVU5JWCBzaGVsbCwKKyAgICAgICAgICBET1MgQ09NTUFORC5DT00sIGV0Yy4KKworICAgUGlwZQorICAgICAgICAgIEEgbWVjaGFuaXNtIGJ5IHdoaWNoIHRoZSBzdGFuZGFyZCBvdXRwdXQgb2Ygb25lIHByb2dyYW0gaXMgc2VudAorICAgICAgICAgIHRvIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiBhbm90aGVyLgorCisgICBQaXBlbGluZQorICAgICAgICAgIEEgc2VyaWVzIG9mIHByb2dyYW1zIGNvbm5lY3RlZCBieSBwaXBlcy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMi4xLjIuIE5PVEFUSU9OCisKKyAgIEluIGNvbW1hbmQgZGVzY3JpcHRpb25zLCAiY29tbWFuZCIgaXMgcmVwbGFjZWQgYnkgYSBzaGVsbCBvciBzeXN0ZW0KKyAgIGNvbW1hbmQgb3IgcGlwZWxpbmUuIFRoZSBjb21tYW5kIG5hbWVzIHNwZWNpZmllZCBpbiB0aGVzZSBjb21tYW5kcyBhcmUKKyAgIGludGVycHJldGVkIGJ5IHlvdXIgc2hlbGwsIGp1c3QgYXMgaWYgeW91IHdlcmUgdHlwaW5nIHRoZW0gYXQgdGhlCisgICBzaGVsbCBwcm9tcHQsIGFuZCBzbyBpZiB0aGV5IGFyZSBpbiB5b3VyIFBBVEgsIHRoZXkgd2lsbCBiZSBmb3VuZCBpbgorICAgdGhlIGV4cGVjdGVkIG1hbm5lci4gVGhlcmVmb3JlIHlvdSBkb24ndCBoYXZlIHRvIHNwZWNpZnkgY29tcGxldGUKKyAgIHBhdGhuYW1lcyBmb3IgY29tbWFuZHMgdGhhdCBhcmUgcHJvZ3JhbXMgKGJ1dCBpdCBzaG91bGRuJ3QgaHVydCBpZiB5b3UKKyAgIGRvKS4KKworICAgVGhlIG5vcm1hbCBub3RhdGlvbiBmb3IgSS9PIHJlZGlyZWN0aW9uIGlzIGFzIGZvbGxvd3M6CisKKyAgPCAgUmVhZCBTdGRpbiBmcm9tIHRoZSBnaXZlbiBmaWxlLgorICA+ICBTZW5kIFN0ZG91dCB0byB0aGUgZ2l2ZW4gZmlsZS4KKyAgfCAgU2VuZCBTdGRvdXQgZnJvbSB0aGUgY29tbWFuZCBvbiB0aGUgbGVmdCB0byB0aGUgY29tbWFuZCBvbiB0aGUgcmlnaHQuCisKKyAgIEV4YW1wbGVzOgorCisgICBzb3J0IDwgZm9vID4gYmFyCisgICAgICAgICAgU29ydHMgdGhlIGxpbmVzIGluIGZpbGUgImZvbyIgYW5kIHdyaXRlcyB0aGUgcmVzdWx0cyB0byBmaWxlCisgICAgICAgICAgImJhciIKKworICAgZ3JlcCAtYyAic29tZSB0ZXh0IiAqLnR4dCB8IGdyZXAgLXYgIjowIiB8IHNvcnQgfCBwciAtMyB8IGxwcgorICAgICAgICAgIFRoaXMgaXMgYSBjb21tYW5kIHBpcGVsaW5lIGNvbXBvc2VkIG9mIDUgY29tbWFuZHM6CisKKyAgIGdyZXAgLWMgInNvbWUgdGV4dCIgKi50eHQKKyAgICAgICAgICBMb29rcyBpbiBhbGwgZmlsZXMgd2hvc2UgbmFtZXMgZW5kIHdpdGggIi50eHQiIGZvciB0aGUgc3RyaW5nCisgICAgICAgICAgInNvbWUgdGV4dCIgYW5kIHdyaXRlcyB0byBTdGRvdXQgdGhlIG5hbWVzIG9mIGVhY2ggZmlsZQorICAgICAgICAgIGZvbGxvd2VkIGJ5IGEgY29sb24gYW5kIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgaW4gZWFjaC4KKworICAgZ3JlcCAtdiAiOjAiCisgICAgICAgICAgUHJpbnRzIHRvIFN0ZG91dCB0aGUgbGluZXMgZnJvbSBTdGRpbiB0aGF0IGRvIE5PVCBjb250YWluIHRoZQorICAgICAgICAgIHN0cmluZyAiOjAiLCBpbiB0aGlzIGNhc2UsIGl0IHJlbW92ZXMgdGhlIG5hbWVzIG9mIGZpbGVzIHRoYXQKKyAgICAgICAgICBkbyBub3QgY29udGFpbiAic29tZSB0ZXh0Ii4KKworICAgc29ydAorICAgICAgICAgIFNvcnRzIHRoZSBsaW5lcyBmcm9tIFN0ZGluIGFscGhhYmV0aWNhbGx5IHRvIFN0ZG91dC4KKworICAgcHIgLTMKKyAgICAgICAgICBBcnJhbmdlcyB0aGUgbGluZXMgZnJvbSBTdGRpbiBpbiB0aHJlZSBjb2x1bW5zLgorCisgICBscHIKKyAgICAgICAgICBQcmludHMgaXRzIFN0ZGluIG9uIHRoZSBkZWZhdWx0IHByaW50ZXIuCisKKyAgIE5vdGUgdGhhdCB0aGUgS2VybWl0IGZlYXR1cmVzIGRlc2NyaWJlZCBoZXJlIHdvcmsgb25seSB3aXRoIGNvbW1hbmRzCisgICB0aGF0IHVzZSBTdGRpby4gSWYgeW91IGF0dGVtcHQgdG8gdXNlIHRoZW0gd2l0aCBjb21tYW5kcyB3aG9zZSBpbnB1dAorICAgYW5kIG91dHB1dCBjYW4gbm90IGJlIHJlZGlyZWN0ZWQsIEtlcm1pdCB3aWxsIG1vc3QgbGlrZWx5IGdldCBzdHVjay4KKyAgIEtlcm1pdCBoYXMgbm8gd2F5IG9mIHRlbGxpbmcgaG93IGFuIGV4dGVybmFsIGNvbW1hbmQgd29ya3MsIG5vciB3aGF0CisgICB0aGUgc3ludGF4IG9mIHRoZSBzaGVsbCBpcywgc28gaXQncyB1cCB0byB5b3UgdG8gbWFrZSBzdXJlIHlvdSB1c2UKKyAgIHRoZXNlIGZlYXR1cmVzIG9ubHkgd2l0aCByZWRpcmVjdGFibGUgY29tbWFuZHMuCisKKyAgIFRoZSBxdW90aW5nIHJ1bGVzIG9mIHlvdXIgc2hlbGwgYXBwbHkgdG8gdGhlIGNvbW1hbmQuIFRodXMgaW4gVU5JWCwKKyAgIHdoZXJlIEMtS2VybWl0IHRyaWVzIHRvIHVzZSB5b3VyIHByZWZlcnJlZCBzaGVsbCBmb3IgcnVubmluZyBjb21tYW5kcywKKyAgIHNoZWxsICJtZXRhY2hhcmFjdGVycyIgd2l0aGluIGNvbW1hbmRzIG11c3QgYmUgZXNjYXBlZCBpZiB0aGV5IGFyZSB0bworICAgYmUgdGFrZW4gbGl0ZXJhbGx5LCB1c2luZyB0aGUgbWV0aG9kcyBub3JtYWwgZm9yIHlvdXIgc2hlbGwuIEZvcgorICAgZXhhbXBsZSwgdGhlIFVOSVggdHIgKHRyYW5zbGF0ZSkgY29tbWFuZCBtdXN0IGhhdmUgaXRzIGFyZ3VtZW50cyBpbgorICAgcXVvdGVzOgorCisgIHRyICJbYS16XSIgIltBLVpdIgorCisgICBvdGhlcndpc2UgdGhlIHNoZWxsIGlzIGxpa2VseSB0byByZXBsYWNlIHRoZW0gYnkgYWxsIGZpbGVuYW1lcyB0aGF0CisgICBtYXRjaCwgd2hpY2ggaXMgcHJvYmFibHkgbm90IHdoYXQgeW91IHdhbnQuIFRoaXMgaXMgYWxzbyB0cnVlIHdoZW4KKyAgIHVzaW5nIHlvdXIgc2hlbGwgZGlyZWN0bHksIGFuZCBoYXMgbm90aGluZyB0byBkbyB3aXRoIEtlcm1pdC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMi4xLjMuIFNFQ1VSSVRZCisKKyAgIFNvbWUgc2l0ZXMgbWlnaHQgbm90IHdpc2ggdG8gYWxsb3cgYWNjZXNzIHRvIHN5c3RlbSBjb21tYW5kcyBvcgorICAgZXh0ZXJuYWwgcHJvZ3JhbXMgZnJvbSB3aXRoaW4gS2VybWl0LiBTdWNoIGFjY2VzcywgaW5jbHVkaW5nIGFsbCB0aGUKKyAgIGZlYXR1cmVzIGRlc2NyaWJlZCBoZXJlLCBjYW4gYmUgZGlzYWJsZWQgaW4gdmFyaW91cyB3YXlzOgorCisgICAgMS4gV2hlbiBidWlsZGluZyBmcm9tIHNvdXJjZSBjb2RlLCBpbmNsdWRlIC1ETk9QVVNIIGFtb25nIHRoZSBDRkxBR1MuCisgICAgMi4gQXQgcnVudGltZSwgZ2l2ZSB0aGUgTk9QVVNIIGNvbW1hbmQuCisgICAgMy4gRm9yIHNlcnZlciBtb2RlLCBnaXZlIHRoZSBESVNBQkxFIEhPU1QgY29tbWFuZC4KKyAgICA0LiBJbXBsaWNpdCB1c2Ugb2YgcGlwZXMgY2FuIGJlIGRpc2FibGVkIGFzIGRlc2NyaWJlZCBpbiBbNDQwXVNlY3Rpb24KKyAgICAgICA0LjIuNC4KKworICAgTm90ZTogMyBhbmQgNCBhcmUgbm90IG5lY2Vzc2FyeSBpZiB5b3UgaGF2ZSBkb25lIDEgb3IgMi4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMi4yLiBDb21tYW5kcyBmb3IgVHJhbnNmZXJyaW5nIGZyb20gYW5kIHRvIFBpcGVzCisKKyAgIFNFTkQgL0NPTU1BTkQgc2VuZHMgZGF0YSBmcm9tIGEgY29tbWFuZCBvciBjb21tYW5kIHBpcGVsaW5lLCBhbmQKKyAgIFJFQ0VJVkUgL0NPTU1FTlQgd3JpdGVzIGRhdGEgdG8gYSBjb21tYW5kIG9yIHBpcGVsaW5lLiBUaGUgR0VUCisgICAvQ09NTUFORCBjb21tYW5kIGFza3MgYSBzZXJ2ZXIgdG8gc2VuZCBtYXRlcmlhbCwgYW5kIHRoZW4gd3JpdGVzIHRoZQorICAgaW5jb21pbmcgbWF0ZXJpYWwgdG8gYSBjb21tYW5kIG9yIHBpcGVsaW5lLiBUaGVzZSBmZWF0dXJlcywgYWxvbmcgd2l0aAorICAgc3dpdGNoZXMgKGxpa2UgIi9DT01NQU5EIiwgZGVzY3JpYmVkIGluIFs0NDFdU2VjdGlvbiA0LjcpIGFyZSBuZXcgdG8KKyAgIEMtS2VybWl0IDYuMS4gVGhlIGZvbGxvd2luZyBzeW5vbnltcyBhcmUgYWxzbyBwcm92aWRlZDoKKworICBDU0VORCAgICA9IFNFTkQgL0NPTU1BTkQKKyAgQ1JFQ0VJVkUgPSBSRUNFSVZFIC9DT01NQU5ECisgIENHRVQgICAgID0gR0VUIC9DT01NQU5ECisKKyAgIE5vbmUgb2YgdGhlc2UgY29tbWFuZHMgY2FuIGJlIHVzZWQgaWYgYSBTRU5EIG9yIFJFQ0VJVkUgRklMVEVSCisgICAocmVzcGVjdGl2ZWx5LCBbNDQyXVNlY3Rpb24gNC4yLjMpIGlzIGluIGVmZmVjdCwgb3IgaWYgYSBOT1BVU0gKKyAgIGNvbW1hbmQgKFs0NDNdU2VjdGlvbiA0LjIuMS4zKSBoYXMgYmVlbiBnaXZlbiwgb3IgaWYgdGhlIGN1cnJlbnQKKyAgIHByb3RvY29sIGlzIG5vdCBLZXJtaXQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjIuMi4xLiBTZW5kaW5nIGZyb20gYSBDb21tYW5kCisKKyAgIFNFTkQgL0NPTU1BTkQgY29tbWFuZCBbIGFzLW5hbWUgXQorICAgU0VORCAvQVMtTkFNRTphcy1uYW1lIC9DT01NQU5EIGNvbW1hbmQKKyAgIENTRU5EIGNvbW1hbmQgWyBhcy1uYW1lIF0KKyAgICAgICAgICBUaGVzZSB0aHJlZSBmb3JtcyBhcmUgdGhlIHNhbWUuIFRoZXkgd29yayBsaWtlIHRoZSBTRU5ECisgICAgICAgICAgY29tbWFuZCwgYnV0IGluc3RlYWQgb2Ygc2VuZGluZyBhIGZpbGUsIGl0IHNlbmRzIHRoZSBzdGFuZGFyZAorICAgICAgICAgIG91dHB1dCBvZiB0aGUgZ2l2ZW4gY29tbWFuZCwgZWl0aGVyIHVuZGVyIHRoZSBjb21tYW5kJ3Mgb3duCisgICAgICAgICAgbmFtZSwgb3IgZWxzZSB3aXRoIHRoZSBnaXZlbiBhcy1uYW1lLiBJZiB0aGUgY29tbWFuZCBjb250YWlucworICAgICAgICAgIHNwYWNlcywgaXQgbXVzdCBiZSBlbmNsb3NlZCBpbiBicmFjZXMuIEJyYWNlcyBzaG91bGQgYWxzbyBiZQorICAgICAgICAgIHVzZWQgZm9yIHRoZSBhcy1uYW1lIGlmIGl0IGNvbnRhaW5zIHNwYWNlcy4gSWYgYnJhY2VzIGFyZQorICAgICAgICAgIGluY2x1ZGVkIGFyb3VuZCBlaXRoZXIgdGhlIGNvbW1hbmQgb3IgdGhlIGFzLW5hbWUsIHRoZXkgYXJlCisgICAgICAgICAgcmVtb3ZlZCBhZnRlciBwYXJzaW5nIGJ1dCBiZWZvcmUgdXNlLiBBcyB3aXRoIFNFTkQsIHRoZQorICAgICAgICAgIHRyYW5zZmVyIGlzIGluIHRleHQgb3IgYmluYXJ5IG1vZGUgYWNjb3JkaW5nIHRoZSBjdXJyZW50IEZJTEUKKyAgICAgICAgICBUWVBFIHNldHRpbmcsIHVubGVzcyB5b3Ugb3ZlcnJpZGUgdGhlIGdsb2JhbCB0cmFuc2ZlciBtb2RlIGJ5CisgICAgICAgICAgaW5jbHVkaW5nIGEgL1RFWFQgb3IgL0JJTkFSWSBzd2l0Y2guIFRoZSBjb21tYW5kIG11c3QgcmVxdWlyZQorICAgICAgICAgIG5vIGlucHV0LgorCisgICBXaGVuIHNlbmRpbmcgZnJvbSBhIGNvbW1hbmQgb3IgcGlwZWxpbmUsIEMtS2VybWl0IGhhcyBubyB3YXkgb2YKKyAgIGtub3dpbmcgaW4gYWR2YW5jZSBob3cgbXVjaCBkYXRhIHdpbGwgYmUgc2VudCwgYW5kIHNvIGl0IGNhbiBub3Qgc2VuZAorICAgdGhlIHNpemUgdG8gdGhlIG90aGVyIEtlcm1pdCBpbiB0aGUgQXR0cmlidXRlIHBhY2tldCwgYW5kIHNvIHRoZQorICAgcmVjZWl2aW5nIEtlcm1pdCBoYXMgbm8gd2F5IG9mIGRpc3BsYXlpbmcgInBlcmNlbnQgZG9uZSIgb3IgYSBwcm9ncmVzcworICAgYmFyICh0aGVybW9tZXRlcikuCisKKyAgIEV4YW1wbGVzIHRoYXQgbWFrZSBzZW5zZSBpbiB0ZXh0IG1vZGUgKGlsbHVzdHJhdGVkIGJ5IGNvbW1vbiBVTklYCisgICBjb21tYW5kcyk6CisKKyAgIFNFTkQgL0NPTU1BTkQgZmluZ2VyCisgICBDU0VORCBmaW5nZXIKKyAgICAgICAgICBzZW5kcyB0aGUgY3VycmVudCAiZmluZ2VyIiBsaXN0aW5nICh3aG8ncyBsb2dnZWQgaW4pIHVuZGVyIHRoZQorICAgICAgICAgIG5hbWUgImZpbmdlciIuIFRoZSB0d28gZm9ybXMgInNlbmQgL2NvbW1hbmQiIGFuZCAiY3NlbmQiIGFyZQorICAgICAgICAgIGVxdWl2YWxlbnQ7IHdlIHdvbid0IGJvdGhlciBzaG93aW5nIHRoZW0gYm90aCBpbiB0aGUgcmVzdCBvZgorICAgICAgICAgIHRoZSBleGFtcGxlcy4KKworICAgU0VORCAvQ09NTUFORDp7ZmluZ2VyfQorICAgQ1NFTkQge2Zpbmdlcn0KKyAgICAgICAgICBTYW1lIGFzIHByZXZpb3VzIGV4YW1wbGUgKGJyYWNlcyBhcmUgcmVtb3ZlZCBmcm9tICJ7ZmluZ2VyfSIpLgorCisgICBTRU5EIC9DT01NQU5EOnsgZmluZ2VyIH0KKyAgIENTRU5EIHsgZmluZ2VyIH0KKyAgICAgICAgICBTYW1lIGFzIHByZXZpb3VzIGV4YW1wbGUsIGJ1dCBub3RlIHRoYXQgdGhlIHNwYWNlcyBhcmUga2VwdC4KKyAgICAgICAgICBUaGlzIGRvZXMgbm90IHByZXZlbnQgdGhlIHNoZWxsIGZyb20gcnVubmluZyB0aGUgImZpbmdlciIKKyAgICAgICAgICBwcm9ncmFtLCBidXQgaXRzIG91dHB1dCBpcyBzZW50IHVuZGVyIHRoZSBuYW1lICIgZmluZ2VyICIgKHdpdGgKKyAgICAgICAgICBhIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlKS4KKworICAgU0VORCAvQ09NTUFORDpmaW5nZXIgL0FTLU5BTUU6dXNlcmxpc3QKKyAgIENTRU5EIGZpbmdlciB1c2VybGlzdAorICAgICAgICAgIHNlbmRzIHRoZSBjdXJyZW50IGZpbmdlciBsaXN0aW5nIHVuZGVyIHRoZSBuYW1lICJ1c2VybGlzdCIuCisKKyAgIFNFTkQgL0NPTU1BTkQ6e2ZpbmdlciB8IHNvcnQgLXJ9IC9BUy1OQU1FOnVzZXJsaXN0CisgICBDU0VORCB7ZmluZ2VyIHwgc29ydCAtcn0gdXNlcmxpc3QKKyAgICAgICAgICBzZW5kcyB0aGUgY3VycmVudCBmaW5nZXIgbGlzdGluZywgc29ydGVkIGluIHJldmVyc2Ugb3JkZXIsCisgICAgICAgICAgdW5kZXIgdGhlIG5hbWUgInVzZXJsaXN0Ii4gVGhlIGJyYWNlcyBhcmUgbmVlZGVkIHRvIGRpc3Rpbmd1aXNoCisgICAgICAgICAgdGhlIGNvbW1hbmQgZnJvbSB0aGUgYXMtbmFtZS4KKworICAgU0VORCAvQ09NTUFORDp7ZmluZ2VyIHwgc29ydCAtcn0gL0FTLU5BTUU6e3VzZXJsaXN0fQorICAgQ1NFTkQge2ZpbmdlciB8IHNvcnQgLXJ9IHt1c2VybGlzdH0KKyAgICAgICAgICBTYW1lIGFzIHByZXZpb3VzIGV4YW1wbGUgKGJyYWNlcyBhcmUgcmVtb3ZlZCBmcm9tCisgICAgICAgICAgInt1c2VybGlzdH0iKS4KKworICAgU0VORCAvQ09NTUFORDp7ZmluZ2VyIHwgc29ydCAtcn0KKyAgICAgICAgICAvQVMtTkFNRTp7XGZyZXBsYWNlKFx2KGZpbGVuYW1lKSxcMzIsXyl9CisKKyAgIENTRU5EIHtmaW5nZXIgfCBzb3J0IC1yfSB7XGZyZXBsYWNlKFx2KGZpbGVuYW1lKSxcMzIsXyl9CisgICAgICAgICAgTGlrZSB0aGUgcHJldmlvdXMgZXhhbXBsZSwgYnV0IHNlbmRzIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQKKyAgICAgICAgICB1bmRlciB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCwgYnV0IHdpdGggYWxsIHNwYWNlcyAoXDMyKQorICAgICAgICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmVzLCBzbyB0aGUgYXMtbmFtZSBpcyAiZmluZ2VyX3xfc29ydF8tciIuCisKKyAgIEV4YW1wbGVzIHRoYXQgbWFrZSBzZW5zZSBpbiBiaW5hcnkgbW9kZSAodGhyZWUgZXF1aXZhbGVudCBmb3JtcyBhcmUKKyAgIHNob3duKToKKworICAgU0VORCAvQ09NTUFORCAvQklOQVJZIHt0YXIgY2YgLSAuIHwgZ3ppcCAtY30gbXlkaXIudGFyLmd6CisgICBTRU5EIC9DT01NQU5EIC9CSU5BUlkgL0FTLU5BTUU6bXlkaXIudGFyLmd6IHt0YXIgY2YgLSAuIHwgZ3ppcCAtY30KKyAgIENTRU5EIC9CSU5BUlkge3RhciBjZiAtIC4gfCBnemlwIC1jfSBteWRpci50YXIuZ3oKKyAgICAgICAgICBNYWtlcyBhIHRhciBhcmNoaXZlIG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgY29tcHJlc3NlcyBpdAorICAgICAgICAgIHdpdGggdGhlIEdOVSBnemlwIHByb2dyYW0sIGFuZCBzZW5kcyBpdCBhcyAibXlkaXIudGFyLmd6Ii4gVGhlCisgICAgICAgICAgb3RoZXIgS2VybWl0IGNhbiwgb2YgY291cnNlLCBqdXN0IHN0b3JlIGl0IGFzIGEgZmlsZSwgb3IgaXQgY2FuCisgICAgICAgICAgdXNlIENSRUNFSVZFIHRvIHVuY29tcHJlc3MgYW5kIGRlYXJjaGl2ZSBpdCBhcyBwYXJ0IG9mIHRoZQorICAgICAgICAgIHRyYW5zZmVyIHByb2Nlc3MuCisKKyAgIFdoZW4gdXNpbmcgYSAicGlwZWxpbmUiIG9mIGNvbW1hbmRzIGluIHRoZSBjb21tYW5kIGZpZWxkLCBvYnZpb3VzbHksCisgICB0aGUgZmlyc3QgY29tbWFuZCBtdXN0IG5vdCByZXF1aXJlIGFueSBpbnB1dCwgYW5kIHRoZSBsYXN0IGNvbW1hbmQKKyAgIHNob3VsZCBwcm9kdWNlIHNvbWUgb3V0cHV0LCBhbmQgYWxsIGludGVybWVkaWF0ZSBjb21tYW5kcyBzaG91bGQgZ2V0CisgICBzb21lIGlucHV0IGFuZCBwcm9kdWNlIHNvbWUgb3V0cHV0LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4yLjIuMi4gUmVjZWl2aW5nIHRvIGEgQ29tbWFuZAorCisgICBSRUNFSVZFIC9DT01NQU5EIGNvbW1hbmQKKyAgIENSRUNFSVZFIGNvbW1hbmQKKyAgICAgICAgICBUaGlzIGlzIGxpa2UgUkVDRUlWRSwgZXhjZXB0IGluY29taW5nIG1hdGVyaWFsIGlzIHdyaXR0ZW4gdG8KKyAgICAgICAgICB0aGUgc3RhbmRhcmQgaW5wdXQgb2YgdGhlIGdpdmVuIGNvbW1hbmQsIGluIHRleHQgb3IgYmluYXJ5IG1vZGUKKyAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIG5vcm1hbCBydWxlcyBmb3IgZmlsZSByZWNlcHRpb24uIEJlIHN1cmUgdG8KKyAgICAgICAgICBpbmNsdWRlIGEgcmVkaXJlY3RvciB0byBhIGZpbGUgKGlmIHRoZSBjb21tYW5kIG5vcm1hbGx5IHdyaXRlcworICAgICAgICAgIHRvIHN0YW5kYXJkIG91dHB1dCksIG9yIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgd29uJ3QgZ28KKyAgICAgICAgICBhbnl3aGVyZS4gVGhlIGNvbW1hbmQgbWF5IGNvbnRhaW4gc3BhY2VzOyBicmFjZXMgYXJlIG5vdAorICAgICAgICAgIG5lZWRlZCwgYnV0IHRoZXkgYXJlIHJlbW92ZWQgaWYgdXNlZC4KKworICAgV0FSTklORzogQy1LZXJtaXQgaGFzIG5vIHdheSBvZiBrbm93aW5nIGFueXRoaW5nIGFib3V0IHRoZSBjb21tYW5kLCBvcgorICAgZXZlbiB3aGV0aGVyIGl0IGlzIGEgY29tbWFuZC4gVGh1cyB0aGlzIGNvbW1hbmQgd2lsbCBhbHdheXMgY2F1c2UKKyAgIEMtS2VybWl0IHRvIGVudGVyIHByb3RvY29sIG1vZGUsIGFzIGxvbmcgYXMgc29tZSB0ZXh0IGlzIHNwZWNpZmllZCBpbgorICAgdGhlIGNvbW1hbmQgZmllbGQuIEhvd2V2ZXIsIGlmIHRoZSB0ZXh0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYQorICAgY29tbWFuZCwgdGhlIHRyYW5zZmVyIHdpbGwgZXZlbnR1YWxseSBmYWlsIHdpdGggYSBtZXNzYWdlIHN1Y2ggYXMKKyAgICJFcnJvciB3cml0aW5nIGRhdGEiIG9yICJGYWlsdXJlIHRvIGNsb3NlIGZpbGUiLgorCisgICBFeGFtcGxlcyBmb3IgdGV4dCBtb2RlIChpbiBVTklYKToKKworICAgUkVDRUlWRSAvQ09NTUFORCBzb3J0IC1yID4gcmV2ZXJzZS50eHQKKyAgIENSRUNFSVZFIHNvcnQgLXIgPiByZXZlcnNlLnR4dAorICAgICAgICAgIFRoZSB0ZXh0IHRoYXQgaXMgcmVjZWl2ZWQgaXMgc29ydGVkIGluIHJldmVyc2Ugb3JkZXIgYW5kIHN0b3JlZAorICAgICAgICAgIGluIHRoZSBmaWxlICJyZXZlcnNlLnR4dCIuIFRoZSB0d28gZm9ybXMgc2hvd24gYXJlIGVxdWl2YWxlbnQuCisKKyAgIFJFQ0VJVkUgL0NPTU1BTkQge3NvcnQgLXIgPiByZXZlcnNlLnR4dH0KKyAgIENSRUNFSVZFIHtzb3J0IC1yID4gcmV2ZXJzZS50eHR9CisgICAgICAgICAgVGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGU7IGlmIGJyYWNlcyBhcmUgaW5jbHVkZWQsIHRoZXkKKyAgICAgICAgICBhcmUgc2ltcGx5IHJlbW92ZWQuCisKKyAgIFJFQ0VJVkUgL0NPTU1BTkQge3NvcnQgLXIgPiBcZmxvd2VyKFx2KGZpbGVuYW1lKSkucmV2ZXJzZX0KKyAgIENSRUNFSVZFIHtzb3J0IC1yID4gXGZsb3dlcihcdihmaWxlbmFtZSkpLnJldmVyc2V9CisgICAgICAgICAgU2FtZSBidXQgc3RvcmVzIHJlc3VsdCB1bmRlciB0aGUgaW5jb21pbmcgZmlsZW5hbWUsIGxvd2VyY2FzZWQsCisgICAgICAgICAgYW5kIHdpdGggIi5yZXZlcnNlIiBhcHBlbmRlZCB0byBpdC4KKworICAgUkVDRUlWRSAvQ09NTUFORCBzb3J0CisgICBDUkVDRUlWRSBzb3J0CisgICAgICAgICAgRG9lcyBub3RoaW5nIHVzZWZ1bCwgc2luY2UgdGhlIG91dHB1dCBvZiBzb3J0IGhhcyBub3doZXJlIHRvCisgICAgICAgICAgZ28uCisKKyAgIFJFQ0VJVkUgL0NPTU1BTkQgc29ydCAtciB8IHByIC0zIHwgbHByIC1QbGFzZXJqZXQKKyAgIENSRUNFSVZFIHNvcnQgLXIgfCBwciAtMyB8IGxwciAtUGxhc2VyamV0CisgICAgICAgICAgVGhlIHRleHQgdGhhdCBpcyByZWNlaXZlZCBpcyBzb3J0ZWQgaW4gcmV2ZXJzZSBvcmRlciwgYXJyYW5nZWQKKyAgICAgICAgICBpbnRvIHRocmVlIGNvbHVtbnMsIGFuZCBzZW50IHRvIHRoZSAibGFzZXJqZXQiIHByaW50ZXIuCisKKyAgIEV4YW1wbGVzIGZvciBiaW5hcnkgbW9kZToKKworICAgUkVDRUlWRSAvQ09NTUFORDp7Z3VuemlwIC1jIHwgdGFyIHhmIC19CisgICBDUkVDRUlWRSB7Z3VuemlwIC1jIHwgdGFyIHhmIC19CisgICAgICAgICAgQXNzdW1pbmcgdGhlIGRhdGEgdGhhdCBpcyByZWNlaXZlZCBpcyBhIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUsCisgICAgICAgICAgdW5jb21wcmVzc2VzIHRoZSBhcmNoaXZlIGFuZCBwYXNzZXMgaXQgdG8gdGFyIGZvciBleHRyYWN0aW9uLgorICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgYnJhY2VzIGFyZSBuZWVkZWQgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGZpbmFsCisgICAgICAgICAgIi0iIHdvdWxkIGJlIHRha2VuIGFzIGEgY29tbWFuZCBjb250aW51YXRpb24gY2hhcmFjdGVyIChzZWUKKyAgICAgICAgICBbNDQ0XVVzaW5nIEMtS2VybWl0LCAybmQgRWRpdGlvbiwgcC4zMykuCisKKyAgIEdFVCAvQ09NTUFORCByZW1vdGUtZmlsZSBjb21tYW5kCisgICBHRVQgL0NPTU1BTkQgL0FTLU5BTUU6Y29tbWFuZCByZW1vdGUtZmlsZQorICAgQ0dFVCByZW1vdGUtZmlsZSBjb21tYW5kCisgICAgICAgICAgVGhpcyBjb21tYW5kIHRlbGxzIHRoZSBLZXJtaXQgY2xpZW50IHRvIHNlbmQgYSBHRVQgcmVxdWVzdCBmb3IKKyAgICAgICAgICB0aGUgZ2l2ZW4gcmVtb3RlIGZpbGUgdG8gYSBLZXJtaXQgc2VydmVyLiBVbmxpa2UgR0VULCBob3dldmVyLAorICAgICAgICAgIHRoZSBpbmNvbWluZyBtYXRlcmlhbCBpcyB3cml0dGVuIHRvIGEgY29tbWFuZCwgcmF0aGVyIHRoYW4gdG8gYQorICAgICAgICAgIGZpbGUuIElmIHRoZSByZW1vdGUtZmlsZSBvciB0aGUgY29tbWFuZCBjb250YWluIHNwYWNlcywgdGhleQorICAgICAgICAgIG11c3QgYmUgZW5jbG9zZWQgaW4gYnJhY2VzLiBUaGUgc2FtZSBjYXV0aW9ucyBhYm91dCB0aGUgY29tbWFuZAorICAgICAgICAgIGFwcGx5IGFzIGZvciBDUkVDRUlWRS4KKworICAgRXhhbXBsZXMgKGZvciBVTklYKToKKworICAgR0VUIC9DT01NQU5EIG9vZmEudHh0IHNvcnQgLXIgPiBvb2ZhLm5ldworICAgR0VUIC9DT01NQU5EIHtvb2ZhLnR4dH0ge3NvcnQgLXIgPiBvb2ZhLm5ld30KKyAgIENHRVQgb29mYS50eHQgc29ydCAtciA+IG9vZmEubmV3CisgICBDR0VUIHtvb2ZhLnR4dH0ge3NvcnQgLXIgPiBvb2ZhLm5ld30KKyAgICAgICAgICBUaGVzZSBmb3VyIGFyZSBlcXVpdmFsZW50LiBFYWNoIG9mIHRoZW0gcmVxdWVzdHMgdGhlIHNlcnZlciB0bworICAgICAgICAgIHNlbmQgaXRzICJvb2ZhLnR4dCIgZmlsZSwgYW5kIGFzIGl0IGFycml2ZXMsIGl0IGlzIHNvcnRlZCBpbgorICAgICAgICAgIHJldmVyc2Ugb3JkZXIgYW5kIHdyaXR0ZW4gdG8gIm9vZmEubmV3Ii4KKworICAgR0VUIC9DT01NQU5EIHtwcm9maWxlIGV4ZWMgYX0gbHByCisgICBHRVQgL0NPTU1BTkQge3Byb2ZpbGUgZXhlYyBhfSB7bHByfQorICAgR0VUIC9DT01NQU5EIC9BUy1OQU1FOmxwciB7cHJvZmlsZSBleGVjIGF9CisgICBHRVQgL0NPTU1BTkQgL0FTLU5BTUU6e2xwcn0ge3Byb2ZpbGUgZXhlYyBhfQorICAgR0VUIC9DT01NQU5EIC9BUzpscHIge3Byb2ZpbGUgZXhlYyBhfQorICAgQ0dFVCB7cHJvZmlsZSBleGVjIGF9IGxwcgorICAgQ0dFVCB7cHJvZmlsZSBleGVjIGF9IHtscHJ9CisgICAgICAgICAgSGVyZSB0aGUgcmVtb3RlIGZpbGVuYW1lIGNvbnRhaW5zIHNwYWNlcyBzbyBpdCBNVVNUIGJlIGVuY2xvc2VkCisgICAgICAgICAgaW4gYnJhY2VzLiBBcyBpdCBhcnJpdmVzIGl0IGlzIHNlbnQgdG8gdGhlIGxwciBwcm9ncmFtIGZvcgorICAgICAgICAgIHByaW50aW5nLiBCcmFjZXMgYXJlIG9wdGlvbmFsIGFyb3VuZCAibHByIiBzaW5jZSBpdCBjb250YWlucyBubworICAgICAgICAgIHNwYWNlcy4KKworICAgR0VUIC9DT01NQU5EICoudHh0IHtjYXQgPj4gbmV3LnR4dH0KKyAgIEdFVCAvQVMtTkFNRTp7Y2F0ID4+IG5ldy50eHR9IC9DT01NQU5EICoudHh0CisgICBDR0VUICoudHh0IHtjYXQgPj4gbmV3LnR4dH0KKyAgICAgICAgICBUaGlzIGdldHMgYWxsIHRoZSAiLnR4dCIgZmlsZXMgZnJvbSB0aGUgc2VydmVyIGFuZCBjb25jYXRlbmF0ZXMKKyAgICAgICAgICB0aGVtIGFsbCBpbnRvIGEgc2luZ2xlICJuZXcudHh0IiBmaWxlIG9uIHRoZSBjbGllbnQuCisKKyAgIEdFVCAvQ09NTUFORCAqLnR4dCB7ZWNobyBcdihmaWxlbmFtZSk+Pm5ldy50eHQ7Y2F0Pj5uZXcudHh0fQorICAgQ0dFVCAqLnR4dCB7ZWNobyBcdihmaWxlbmFtZSk+Pm5ldy50eHQ7Y2F0Pj5uZXcudHh0fQorICAgICAgICAgIEFzIGFib3ZlLCBidXQgaW5zZXJ0cyBlYWNoIGZpbGUncyBuYW1lIGJlZm9yZSBpdHMgY29udGVudHMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjIuMy4gVXNpbmcgRmlsZS1UcmFuc2ZlciBGaWx0ZXJzCisKKyAgIFRoZSBjb21tYW5kcyBkZXNjcmliZWQgaW4gWzQ0NV1TZWN0aW9uIDQuMi4yIGxldCB5b3Ugc2VuZCB0aGUgb3V0cHV0CisgICBvZiBhIGNvbW1hbmQsIG9yIHJlY2VpdmUgZGF0YSBpbnRvIGEgY29tbWFuZC4gQnV0IHdoYXQgaWYgeW91IHdhbnQgdG8KKyAgIHNwZWNpZnkgcHJlcHJvY2Vzc2luZyBmb3IgZmlsZXMgdGhhdCB5b3Ugc2VuZCwgb3IgcG9zdHByb2Nlc3Npbmcgb2YKKyAgIGZpbGVzIHRoYXQgeW91IHJlY2VpdmUsIGV2ZW4gd2hlbiBtdWx0aXBsZSBmaWxlcyBhcmUgaW52b2x2ZWQ/IEZvcgorICAgdGhpcyB5b3UgbmVlZCBhIHdheSB0byBzcGVjaWZ5IHNlbmQgYW5kIHJlY2VpdmUgZmlsdGVycy4gVGhlIGNvbW1hbmRzCisgICBhcmUgU0VUIFNFTkQgRklMVEVSIGFuZCBTRVQgUkVDRUlWRSBGSUxURVI7IFNIT1cgUFJPVE9DT0wgZGlzcGxheXMgdGhlCisgICBjdXJyZW50IHNldHRpbmdzLgorCisgICAgNC4yLjMuMS4gVGhlIFNFTkQgRmlsdGVyCisKKyAgIFNFVCBTRU5EIEZJTFRFUiBbIGNvbW1hbmQgXQorICAgICAgICAgIFRoaXMgY29tbWFuZCBzcGVjaWZpZXMgYSBjb21tYW5kIHRvIGJlIHJ1biBvbiBhbnkgZmlsZSB0aGF0IHlvdQorICAgICAgICAgIFNFTkQgKG9yIE1PVkUsIE1TRU5ELCBldGMpLiBJdCBhbHNvIGFwcGxpZXMgdG8gZmlsZXMgc2VudCB3aGVuCisgICAgICAgICAgaW4gc2VydmVyIG1vZGUsIGluIHJlc3BvbnNlIHRvIEdFVCBjb21tYW5kcywgYnV0IG5vdCB0byB0aGUKKyAgICAgICAgICByZXN1bHRzIG9mIFJFTU9URSBjb21tYW5kcyBsaWtlIFJFTU9URSBESVJFQ1RPUlksIFJFTU9URSBUWVBFLAorICAgICAgICAgIFJFTU9URSBIT1NULCBldGMuIFRoZSBjb21tYW5kIG1heSBiZSwgYnV0IG5lZWQgbm90IGJlLCBlbmNsb3NlZAorICAgICAgICAgIGluIGJyYWNlczsgaWYgaXQgaXMsIHRoZSBicmFjZXMgYXJlIHN0cmlwcGVkIGJlZm9yZSB1c2UuIFRoZQorICAgICAgICAgIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgaXMgc2VudCwgcmF0aGVyIHRoYW4gdGhlIGZpbGUgaXRzZWxmLgorICAgICAgICAgIFRoZSBjdXJyZW50IEZJTEUgVFlQRSBzZXR0aW5nIChURVhUIG9yIEJJTkFSWSkgYXBwbGllcyB0byB0aGUKKyAgICAgICAgICBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuIFRoZSBjb21tYW5kIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBpbnN0YW5jZSBvZiBcdihmaWxlbmFtZSksIGZvciB3aGljaCB0aGUgbmFtZSBvZiB0aGUgYWN0dWFsIGZpbGUKKyAgICAgICAgICBpcyBzdWJzdGl0dXRlZC4gSWYgdGhlIGNvbW1hbmQgaXMgb21pdHRlZCwgdGhlIHNlbmQgZmlsdGVyIGlzCisgICAgICAgICAgcmVtb3ZlZCBhbmQgZmlsZXMgYXJlIHNlbnQgaW4gdGhlIG5vcm1hbCBtYW5uZXIuCisKKyAgIFRoZSBTRVQgU0VORCBGSUxURVIgc2V0cyB1cCBhICJnbG9iYWwiIGZpbHRlciAtLSB0aGF0IGlzLCBvbmUgdGhhdAorICAgYXBwbGllcyB0byBhbGwgc3Vic2VxdWVudCBmaWxlLXNlbmRpbmcgY29tbWFuZHMgdW50aWwgeW91IGNoYW5nZSBvcgorICAgcmVtb3ZlIGl0LiBZb3UgY2FuIGFsc28gc3BlY2lmeSBhICJsb2NhbCIgZmlsdGVyIHRvIGJlIHVzZWQgaW4gYQorICAgc3BlY2lmaWMgZmlsZS1zZW5kaW5nIGNvbW1hbmQgYnkgdXNpbmcgdGhlIC9GSUxURVIgc3dpdGNoIChzZWUKKyAgIFs0NDZdU2VjdGlvbiAxLjUpOyBmb3IgZXhhbXBsZToKKworICBTRU5EIC9GSUxURVI6Y29tbWFuZCBbIG90aGVyLXN3aXRjaGVzIF0gZmlsZW5hbWUKKworICAgQmVzaWRlcyBcdihmaWxlbmFtZSksIHlvdSBjYW4gaW5jbHVkZSBhbnkgb3RoZXIgc2NyaXB0IHByb2dyYW1taW5nCisgICBub3RhdGlvbiBpbiB0aGUgc2VuZCBmaWx0ZXI6IHZhcmlhYmxlIG5hbWVzLCBhcnJheSByZWZlcmVuY2VzLCBjYWxscworICAgdG8gYnVpbHQtaW4gc3RyaW5nIG9yIG90aGVyIGZ1bmN0aW9ucywgYW5kIHNvIG9uLiBUaGVzZSBhcmUgZXZhbHVhdGVkCisgICBkdXJpbmcgZmlsZSB0cmFuc2ZlciwgTk9UIGR1cmluZyBwYXJzaW5nLCBhbmQgdGhleSBhcmUgZXZhbHVhdGVkCisgICBzZXBhcmF0ZWx5IGZvciBlYWNoIGZpbGUuCisKKyAgIFdoZW4gdGhlIFNFTkQgb3IgTU9WRSAoU0VORCAvREVMRVRFKSBjb21tYW5kIGlzIHVzZWQgd2l0aCBhIHNlbmQKKyAgIGZpbHRlciwgdGhlIG91dHB1dCBmcm9tIHRoZSBmaWx0ZXIgaXMgc2VudCB1bmRlciB0aGUgZmlsZSdzIG9yaWdpbmFsCisgICBuYW1lIHVubGVzcyB5b3Ugc3BlY2lmeSBhbiAiYXMtbmFtZSIgb3IgdGVtcGxhdGUuIFRoZSBBdHRyaWJ1dGUgcGFja2V0CisgICAoaWYgYW55KSBjb250YWlucyB0aGUgb3JpZ2luYWwgZmlsZSdzIGF0dHJpYnV0ZXMgKHNpemUsIGNyZWF0aW9uIGRhdGUsCisgICBldGMpLiBTbyAoZm9yIGV4YW1wbGUpIGlmIHRoZSBmaWx0ZXIgY2hhbmdlcyB0aGUgZmlsZSdzIHNpemUsIHRoZQorICAgcHJvZ3Jlc3MgdGhlcm1vbWV0ZXIgbWlnaHQgYmUgd3JvbmcuIChXZSBjYW4ndCBzZW5kIHRoZSBzaXplIG9mIHRoZQorICAgb3V0cHV0IGZyb20gdGhlIGZpbHRlciwgYmVjYXVzZSBpdCBpcyBub3Qga25vd24gdW50aWwgdGhlIHRyYW5zZmVyIGlzCisgICBmaW5pc2hlZC4pIElmIHlvdSBwcmVmZXIgdGhhdCB0aGUgc2l6ZSBub3QgYmUgc2VudCwgdXNlICJzZXQKKyAgIGF0dHJpYnV0ZXMgc2l6ZSBvZmYiLgorCisgICBZb3UgY2FuIG5vdCB1c2Ugc2VuZCBmaWx0ZXJzIHdpdGggUkVTRU5EIChTRU5EIC9SRUNPVkVSKSBvciBQU0VORAorICAgKFNFTkQgL1NUQVJUKS4KKworICAgRXhhbXBsZXMgZm9yIHRleHQgbW9kZToKKworICAgU0VUIFNFTkQgRklMVEVSIHNvcnQgLXIgXHYoZmlsZW5hbWUpIDsgQnJhY2VzIG1heSBiZSBvbWl0dGVkCisgICBTRVQgU0VORCBGSUxURVIge3NvcnQgLXIgXHYoZmlsZW5hbWUpfSA7IEJyYWNlcyBtYXkgYmUgaW5jbHVkZWQKKyAgIFNFTkQgKi50eHQKKyAgICAgICAgICBUaGlzIHNlbmRzIGV2ZXJ5IGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdob3NlIG5hbWUgZW5kcworICAgICAgICAgIHdpdGggIi50eHQiIHVuZGVyIGl0cyBvd24gbmFtZSwgYnV0IHdpdGggaXRzIGxpbmVzIHNvcnRlZCBpbgorICAgICAgICAgIHJldmVyc2Ugb3JkZXIuCisKKyAgIFNFTkQgL0ZJTFRFUjp7c29ydCAtciBcdihmaWxlbmFtZSl9ICoudHh0CisgICAgICAgICAgU2FtZSBhcyBhYm92ZSwgYnV0IHRoZSBmaWx0ZXIgYXBwbGllcyBvbmx5IHRvIHRoaXMgU0VORAorICAgICAgICAgIGNvbW1hbmQuIEJyYWNlcyBhcmUgcmVxdWlyZWQgaW4gdGhpcyBjYXNlLgorCisgICBTRVQgU0VORCBGSUxURVIge3NvcnQgLXIgXHYoZmlsZW5hbWUpfQorICAgU0VORCBvb2ZhLnR4dCByZXZlcnNlLnR4dAorICAgICAgICAgIFNlbmRzIHRoZSBvb2ZhLnR4dCBmaWxlIHdpdGggaXRzIGxpbmVzIHNvcnRlZCBpbiByZXZlcnNlIG9yZGVyCisgICAgICAgICAgdW5kZXIgdGhlIG5hbWUgInJldmVyc2UudHh0Ii4KKworICAgU0VUIFNFTkQgRklMVEVSIHtzb3J0IC1yIFx2KGZpbGVuYW1lKX0KKyAgIFNFTkQgb29mYS4qIFx2KGZpbGVuYW1lKS5yZXZlcnNlCisgICAgICAgICAgU2VuZHMgYWxsIHRoZSBvb2ZhLiogZmlsZXMgd2l0aCB0aGVpciBsaW5lcyBzb3J0ZWQgaW4gcmV2ZXJzZQorICAgICAgICAgIG9yZGVyOyBlYWNoIGZpbGUgaXMgc2VudCB1bmRlciBpdHMgb3duIG5hbWUgYnV0IHdpdGggIi5yZXZlcnNlIgorICAgICAgICAgIGFwcGVuZGVkIHRvIGl0LgorCisgICBTRVQgU0VORCBGSUxURVIge3RyICJbYS16XSIgIltBLVpdIiA8IFx2KGZpbGVuYW1lKX0KKyAgIFNFTkQgKi50eHQKKyAgICAgICAgICBTZW5kcyBhbGwgIi50eHQiIGZpbGVzIHVuZGVyIHRoZWlyIG93biBuYW1lcywgYnV0IHVwcGVyY2FzaW5nCisgICAgICAgICAgdGhlaXIgY29udGVudHMuCisKKyAgIE5vdGUgdGhhdCB0aGUgU0VORCBGSUxURVIgYXBwbGllcyBub3Qgb25seSB0byBmaWxlcyB0aGF0IGFyZSBzZW50IHdpdGgKKyAgIFNFTkQsIE1PVkUsIE1TRU5ELCBldGMsIGJ1dCBhbHNvIHRvIGZpbGVzIHNlbnQgYnkgdGhlIEMtS2VybWl0IHNlcnZlcgorICAgaW4gcmVzcG9uc2UgdG8gR0VUIHJlcXVlc3RzLgorCisgICBFeGFtcGxlcyBmb3IgYmluYXJ5IG1vZGU6CisKKyAgIFNFVCBTRU5EIEZJTFRFUiB7Z3ppcCAtYyBcdihmaWxlbmFtZSl9CisgICBTRU5EIC9CSU5BUlkgb29mYS50eHQgb29mYS50eHQuZ3oKKyAgICAgICAgICBTZW5kcyB0aGUgb29mYS50eHQgZmlsZSwgY29tcHJlc3NlZCBieSBnemlwLCBhcyBvb2ZhLnR4dC5nei4KKworICAgU0VORCAvQklOQVJZIC9GSUxURVI6e2d6aXAgLWMgXHYoZmlsZW5hbWUpfSBvb2ZhLnR4dCBvb2ZhLnR4dC5negorICAgICAgICAgIEFzIGFib3ZlLCBidXQgdGhlIGZpbHRlciBhcHBsaWVzIG9ubHkgdG8gdGhpcyBTRU5EIGNvbW1hbmQuCisKKyAgIFNFVCBTRU5EIEZJTFRFUiB7Z3ppcCAtYyBcdihmaWxlbmFtZSl9CisgICBTRU5EIC9CSU5BUlkgb29mYS4qIFxmdXBwZXIoXHJlcGxhY2UoXHYoZmlsZW5hbWUpLC4sXykpLkdaCisgICAgICAgICAgU2VuZHMgYWxsIHRoZSBvb2ZhLiogZmlsZXMsIGNvbXByZXNzZWQgYnkgZ3ppcCwgZWFjaCB1bmRlciBpdHMKKyAgICAgICAgICBvd24gbmFtZSwgYnV0IHdpdGggdGhlIG5hbWUgdXBwZXJjYXNlZCwgYWxsIHBlcmlvZHMgd2l0aGluIHRoZQorICAgICAgICAgIG5hbWUgY29udmVydGVkIHRvIHVuZGVyc2NvcmVzLCBhbmQgIi5HWiIgYXBwZW5kZWQgdG8gaXQuIFNvLAorICAgICAgICAgIGZvciBleGFtcGxlLCAib29mYS50eHQiIGlzIHNlbnQgYXMgIk9PRkFfVFhULkdaIi4KKworICAgSW4gdGhlIGd6aXAgZXhhbXBsZXMsIG5vdGUgdGhhdCB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyBzZW50IGlzCisgICBub3JtYWxseSBsZXNzIHRoYW4gdGhlIG9yaWdpbmFsIGZpbGUgc2l6ZSBiZWNhdXNlIGd6aXAgY29tcHJlc3NlcyB0aGUKKyAgIGZpbGUuIEJ1dCBLZXJtaXQgc2VuZHMgdGhlIG9yaWdpbmFsIGZpbGUgc2l6ZSBhaGVhZCBpbiB0aGUgYXR0cmlidXRlCisgICBwYWNrZXQgYW55d2F5ICh1bmxlc3MgeW91IHRlbGwgaXQgbm90IHRvbykuIFRodXMgdGhlIHRyYW5zZmVyIHdpbGwKKyAgIHByb2JhYmx5IGFwcGVhciB0byB0ZXJtaW5hdGUgZWFybHksIGUuZy4gd2hlbiB0aGUgcmVjZWl2ZXIncworICAgZmlsZS10cmFuc2ZlciBkaXNwbGF5IHRoZXJtb21ldGVyIGlzIG9ubHkgYXQgNDAlLiBJZiB0aGlzIGFubm95cyB5b3UsCisgICB0ZWxsIEtlcm1pdCB0byAic2V0IGF0dHJpYnV0ZSBsZW5ndGggb2ZmIi4gT24gdGhlIG90aGVyIGhhbmQsIHlvdSBjYW4KKyAgIHVzZSB0aGUgZmluYWwgcG9zaXRpb24gb2YgdGhlIHRoZXJtb21ldGVyIGFzIGEgbWVhc3VyZSBvZiB0aGUKKyAgIGVmZmVjdGl2ZW5lc3Mgb2YgY29tcHJlc3Npb24uCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjIuMy4yLiBUaGUgUkVDRUlWRSBGaWx0ZXIKKworICAgU0VUIFJFQ0VJVkUgRklMVEVSIFsgY29tbWFuZCBdCisgICAgICAgICAgVGhpcyBjb21tYW5kIHNwZWNpZmllcyB0aGF0IHRoZSBnaXZlbiBjb21tYW5kIHdpbGwgYmUgcnVuIG9uCisgICAgICAgICAgYW55IGZpbGUgdGhhdCBpcyByZWNlaXZlZCBiZWZvcmUgaXQgaXMgd3JpdHRlbiB0byBkaXNrLiBUaGUKKyAgICAgICAgICBjb21tYW5kIG1heSBiZSwgYnV0IG5lZWQgbm90IGJlLCBlbmNsb3NlZCBpbiBicmFjZXM7IGlmIGl0IGlzCisgICAgICAgICAgdGhlIGJyYWNlcyBhcmUgc3RyaXBwZWQgYmVmb3JlIHVzZS4gVGhlIGZvbGxvd2luZyB0d28gY29tbWFuZHMKKyAgICAgICAgICBhcmUgZXF1aXZhbGVudDoKKworICBTRVQgUkVDRUlWRSBGSUxURVIgc29ydCAtciA+IFx2KGZpbGVuYW1lKQorICBTRVQgUkVDRUlWRSBGSUxURVIge3NvcnQgLXIgPiBcdihmaWxlbmFtZSl9CisKKyAgIFRoZSBSRUNFSVZFIGZpbHRlciBjb21tYW5kIG1heSBjb250YWluIGEgIlx2KGZpbGVuYW1lKSIgc2VxdWVuY2UgdG8gYmUKKyAgIHJlcGxhY2VkIGJ5IHRoZSBpbmNvbWluZyBmaWxlbmFtZSBmcm9tIHRoZSBmaWxlIGhlYWRlciBwYWNrZXQsIGJ1dCBpdAorICAgaXMgbm90IHJlcXVpcmVkLiBIb3dldmVyIHlvdSBtdXN0IHVzZSBpdCB3aGVuZXZlciB5b3VyIGZpbHRlciB3b3VsZAorICAgbm9ybWFsbHkgd3JpdGUgdG8gU3Rkb3V0LCBvdGhlcndpc2UgaXRzIG91dHB1dCB3aWxsIGJlIGxvc3QuCisKKyAgIFRoZSBSRUNFSVZFIGZpbHRlciBjb21tYW5kIG1heSBjb250YWluIG9uZSBvciBtb3JlICJcdihmaWxlbmFtZSkiCisgICBzZXF1ZW5jZSB0byBiZSByZXBsYWNlZCBieSB0aGUgaW5jb21pbmcgZmlsZW5hbWUgZnJvbSB0aGUgZmlsZSBoZWFkZXIKKyAgIHBhY2tldCwgYnV0IGl0IGlzIG5vdCByZXF1aXJlZC4gSG93ZXZlciB5b3UgbXVzdCB1c2UgaXQgd2hlbmV2ZXIgeW91cgorICAgZmlsdGVyIHdvdWxkIG5vcm1hbGx5IHdyaXRlIHRvIFN0ZG91dCwgb3RoZXJ3aXNlIGl0cyBvdXRwdXQgd2lsbCBiZQorICAgbG9zdC4KKworICAgUkVDRUlWRSAvRklMVEVSOmNvbW1hbmQgYW5kIEdFVCAvRklMVEVSOmNvbW1hbmQgY2FuIGFsc28gYmUgdXNlZCB0bworICAgc3BlY2lmeSBhIGZpbHRlciB0byBiZSB1c2VkIGZvciBvbmx5IG9uZSBmaWxlLXRyYW5zZmVyIG9wZXJhdGlvbi4KKworICAgVU5JWCBleGFtcGxlcyBmb3IgdGV4dCBtb2RlOgorCisgICBTRVQgUkVDRUlWRSBGSUxURVIgbHByCisgICBSRUNFSVZFCisgICAgICAgICAgQWxsIHRoZSBmaWxlcyB0aGF0IGFyZSByZWNlaXZlZCBhcmUgc2VudCB0byB0aGUgZGVmYXVsdCBVTklYCisgICAgICAgICAgcHJpbnQgc3Bvb2xlci4KKworICAgUkVDRUlWRSAvRklMVEVSOmxwcgorICAgICAgICAgIFNhbWUgYXMgYWJvdmUsIGV4Y2VwdCB0aGUgbHByIGZpbHRlciBpcyB1c2VkIG9ubHkgd2l0aCB0aGlzCisgICAgICAgICAgUkVDRUlWRSBjb21tYW5kLgorCisgICBSRUNFSVZFIGxwcgorICAgICAgICAgIFRoaXMgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91IHdhbnQ7IGl0IGNyZWF0ZXMgYSBmaWxlIGNhbGxlZAorICAgICAgICAgIGxwci4KKworICAgU0VUIFJFQ0VJVkUgRklMVEVSIHtzb3J0IC1yID4gXHYoZmlsZW5hbWUpfQorICAgUkVDRUlWRQorICAgICAgICAgIFN0b3JlcyBlYWNoIGluY29taW5nIGZpbGUgd2l0aCBpdHMgbGluZXMgc29ydGVkIGluIHJldmVyc2UKKyAgICAgICAgICBvcmRlciwgdW5kZXIgaXRzIG93biBuYW1lLgorCisgICBSRUNFSVZFIC9GSUxURVI6e3NvcnQgLXIgPiBcdihmaWxlbmFtZSl9CisgICAgICAgICAgQXMgYWJvdmUsIGJ1dCB0aGUgZmlsdGVyIGlzIHVzZWQgb25seSBmb3IgdGhpcyBSRUNFSVZFIGNvbW1hbmQuCisKKyAgIFNFVCBSRUNFSVZFIEZJTFRFUiBzb3J0IC1yID4gXHYoZmlsZW5hbWUpCisgICBSRUNFSVZFIHJldmVyc2UudHh0CisgICAgICAgICAgU3RvcmVzIGVhY2ggaW5jb21pbmcgZmlsZSB3aXRoIGl0cyBsaW5lcyBzb3J0ZWQgaW4gcmV2ZXJzZQorICAgICAgICAgIG9yZGVyLCB1bmRlciB0aGUgbmFtZSAicmV2ZXJzZS50eHQiLiBUaGUgYWN0dWFsIHJlc3VsdCBkZXBlbmRzCisgICAgICAgICAgb24gdGhlIEZJTEUgQ09MTElTSU9OIHNldHRpbmcuIElmIGl0IGlzIE9WRVJXUklURSBhbmQgbXVsdGlwbGUKKyAgICAgICAgICBmaWxlcyBhcnJpdmUsIHRoZW4gZWFjaCBpbmNvbWluZyBmaWxlIGRlc3Ryb3lzIHRoZSBwcmV2aW91cworICAgICAgICAgIG9uZS4gSWYgaXQgaXMgQkFDS1VQICh0aGUgZGVmYXVsdCksIGZpbGVuYW1lIGNvbmZsaWN0cyBhcmUKKyAgICAgICAgICByZXNvbHZlIGJ5IGFkZGluZyAidmVyc2lvbiBudW1iZXJzIiB0byB0aGUgZmlsZW5hbWVzOgorICAgICAgICAgIHJldmVyc2UudHh0LCByZXZlcnNlLnR4dC5+MX4sIHJldmVyc2UudHh0Ln4yfiwgZXRjLgorCisgICBTRVQgUkVDRUlWRSBGSUxURVIgc29ydCAtciA+IFx2KGZpbGVuYW1lKQorICAgUkVDRUlWRSBcdihmaWxlbmFtZSkucmV2ZXJzZQorICAgICAgICAgIFN0b3JlcyBlYWNoIGluY29taW5nIGZpbGUgd2l0aCBpdHMgbGluZXMgc29ydGVkIGluIHJldmVyc2UKKyAgICAgICAgICBvcmRlciwgdW5kZXIgdGhlIG5hbWUgaXQgYXJyaXZlZCB3aXRoLCBidXQgd2l0aCAiLnJldmVyc2UiCisgICAgICAgICAgYXBwZW5kZWQgdG8gaXQuCisKKyAgIFNFVCBSRUNFSVZFIEZJTFRFUiBzb3J0IC1yID4gXHYoZmlsZW5hbWUpCisgICBSRUNFSVZFIFxmbG93ZXIoXHYoZmlsZW5hbWUpKS5yZXZlcnNlCisgICAgICAgICAgTGlrZSB0aGUgcHJldmlvdXMgZXhhbXBsZSwgYnV0IGVuc3VyZXMgdGhhdCB0aGUgZmlsZW5hbWUgaXMKKyAgICAgICAgICBsb3dlcmNhc2UuCisKKyAgICAgICAgICBFeGFtcGxlcyBmb3IgYmluYXJ5IG1vZGU6CisKKyAgIFNFVCBSRUNFSVZFIEZJTFRFUiBndW56aXAgLWMgPiBcdihmaWxlbmFtZSkKKyAgIFJFQ0VJVkUKKyAgICAgICAgICBUaGlzIHJlY2VpdmVzIG9uZSBvciBtb3JlIHByZXN1bWFibHkgY29tcHJlc3NlZCBmaWxlIGFuZAorICAgICAgICAgIHVuY29tcHJlc3NlcyBlYWNoIG9uZSBpbnRvIGEgZmlsZSBoYXZpbmcgdGhlIHNhbWUgbmFtZSBpdCB3YXMKKyAgICAgICAgICBzZW50IHdpdGguIEZvciBleGFtcGxlLCBpZiB0aGUgZmlsZSBpcyBzZW50IHdpdGggdGhlIG5hbWUKKyAgICAgICAgICBPT0ZBLlRYVC5HWiwgaXQgaXMgc3RvcmVkIHdpdGggdGhhdCBuYW1lLCBldmVuIGFmdGVyCisgICAgICAgICAgZGVjb21wcmVzc2lvbi4KKworICAgU0VUIFJFQ0VJVkUgRklMVEVSIGd1bnppcCAtYyA+IFx2KGZpbGVuYW1lKQorICAgUkVDRUlWRSBcZmxvd2VyKFxmc3Vic3RyaW5nKFx2KGZpbGVuYW1lKSwxLFxmbGVuZ3RoKFx2KGZpbGVuYW1lKSktMykpCisgICAgICAgICAgTGlrZSB0aGUgcHJldmlvdXMgZXhhbXBsZSwgYnV0IHRoZSByZXN1bHRpbmcgZmlsZW5hbWUgaGFzIGl0cworICAgICAgICAgIHJpZ2h0bW9zdCB0aHJlZSBjaGFyYWN0ZXJzIHJlbW92ZWQgZnJvbSBpdCBhbmQgdGhlIHJlbWFpbmRlciBpcworICAgICAgICAgIGxvd2VyY2FzZWQuIFNvIGlmIHRoZSBpbmNvbWluZyBmaWxlbmFtZSBpcyBPT0ZBLlRYVC5HWiwgaXQgaXMKKyAgICAgICAgICBzdG9yZWQgYXMgb29mYS50eHQgYWZ0ZXIgZGVjb21wcmVzc2lvbi4KKworICAgT2YgY291cnNlIHlvdSBkb24ndCB3YW50IHRvIHR5cGUgc3VjaCBsb25nIGhpZGVvdXMgY29tbWFuZHMsIHNvIHdlCisgICBoYXZlIGFsc28gaW50cm9kdWNlZCBzZXZlcmFsIG5ldyBmdW5jdGlvbnM6CisKKyAgIFxmc3RyaXB4KHN0cmluZ1ssY2hhcmFjdGVyXSkKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIHJpZ2h0bW9zdCBzZWdtZW50IG9mIHRoZSBzdHJpbmcgdGhhdAorICAgICAgICAgIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBjaGFyYWN0ZXIuIElmIG5vIGNoYXJhY3RlciBpcyBnaXZlbiwKKyAgICAgICAgICBwZXJpb2QgKC4pIGlzIHVzZWQuIFRodXMgaXQgaXMgbW9zdCBjb252ZW5pZW50bHkgdXNlZCBmb3IKKyAgICAgICAgICBzdHJpcHBpbmcgdGhlIGV4dGVuc2lvbiBmcm9tIGEgZmlsZW5hbWUgKG9yIHRoZSBkZWNpbWFsIHBvcnRpb24KKyAgICAgICAgICBmcm9tIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdyaXR0ZW4gaW4gVVMvVUsgc3R5bGUpLiBFeGFtcGxlczoKKworICAgXGZzdHJpcHgoT09GQS5UWFQuR1opICAgICAgICAgICAgID0+IE9PRkEuVFhUCisgICBcZnN0cmlweChPT0ZBLlRYVC5HWiwuKSAgICAgICAgICAgPT4gT09GQS5UWFQKKyAgIFxmc3RyaXB4KE9PRkEuVFhULkdaLFgpICAgICAgICAgICA9PiBPT0ZBLlQKKyAgIFxmc3RyaXB4KFxmc3RyaXB4KE9PRkEuVFhULkdaKSkgICA9PiBPT0ZBCisgICBcZnN0cmlweCgkMTAwLjAwKSAgICAgICAgICAgICAgICAgPT4gJDEwMAorCisgICBcZnN0cmlwbihzdHJpbmcsbnVtYmVyKQorICAgICAgICAgIFJlbW92ZXMgdGhlIHJpZ2h0bW9zdCBudW1iZXIgY2hhcmFjdGVycyBmcm9tIHRoZSBzdHJpbmcuCisgICAgICAgICAgRXhhbXBsZXM6CisKKyAgIFxmc3RyaXBuKE9PRkEuVFhULkdaKSAgICAgICAgICAgICA9PiBPT0ZBLlRYVC5HWgorICAgXGZzdHJpcG4oT09GQS5UWFQuR1osMykgICAgICAgICAgID0+IE9PRkEuVFhUCisgICBcZnN0cmlwbihPT0ZBLlRYVC5HWiw3KSAgICAgICAgICAgPT4gT09GQQorCisgICBcZnN0cmlwYihzdHJpbmdbLGMxWyxjMl1dKQorICAgICAgICAgIFN0cmlwcyBlbmNsb3NpbmcgbWF0Y2hpbmcgYnJhY2VzLCBicmFja2V0cywgcGFyZW50aGVzZXMsIG9yCisgICAgICAgICAgcXVvdGVzIGZyb20gdGhlIHN0cmluZy4gVGhlIHNlY29uZCBhcmd1bWVudCwgYzEsIHNwZWNpZmllcworICAgICAgICAgIHdoaWNoIGtpbmQgb2YgZW5jbG9zdXJlIHRvIGxvb2sgZm9yOyBpZiBub3Qgc3BlY2lmaWVkLCBhbnkKKyAgICAgICAgICBlbmNsb3NpbmcgKCksIFtdLCA8Piwge30sICIiLCAnJywgb3IgYCcgYXJlIHJlbW92ZWQuIElmIGMxIGlzCisgICAgICAgICAgc3BlY2lmaWVkIGFuZCBjMiBpcyBub3QsIHRoZW4gaWYgYzEgaXMgYW4gb3BlbmluZyBicmFjZSwKKyAgICAgICAgICBicmFja2V0LCBvciBwYXJlbnRoZXNpcywgdGhlIG1hdGNoaW5nIGNsb3Npbmcgb25lIGlzIHN1cHBsaWVkCisgICAgICAgICAgYXV0b21hdGljYWxseSBhcyBjMi4gSWYgYm90aCBjMSBhbmQgYzIgYXJlIHNwZWNpZmllZCwgdGhlbiB0bworICAgICAgICAgIGJlIHN0cmlwcGVkIHRoZSBzdHJpbmcgbXVzdCBiZWdpbiB3aXRoIGMxIGFuZCBlbmQgd2l0aCBjMi4gSWYKKyAgICAgICAgICB0aGUgc3RyaW5nIGlzIG5vdCBlbmNsb3NlZCBpbiB0aGUgaW5kaWNhdGVkIG1hbm5lciwgdGhlIHJlc3VsdAorICAgICAgICAgIGlzIHRoZSBvcmlnaW5hbCBzdHJpbmcuIEV4YW1wbGVzOgorCisgICBcZnN0cmlwYigiYWJjIikgICAgICAgICAgICAgICAgICAgPT4gYWJjCisgICBcZnN0cmlwYihbYWJjXSkgICAgICAgICAgICAgICAgICAgPT4gYWJjCisgICBcZnN0cmlwYihbYWJjKSAgICAgICAgICAgICAgICAgICAgPT4gW2FiYworICAgXGZzdHJpcGIoPGFiYz4pICAgICAgICAgICAgICAgICAgID0+IGFiYworICAgXGZzdHJpcGIoPGFiYz4sWykgICAgICAgICAgICAgICAgID0+IDxhYmM+CisgICBcZnN0cmlwYigoYWJjKSkgICAgICAgICAgICAgICAgICAgPT4gYWJjCisgICBcZnN0cmlwYigoYWJjKSxbKSAgICAgICAgICAgICAgICAgPT4gKGFiYykKKyAgIFxmc3RyaXBiKChhYmMpLHsofSkgICAgICAgICAgICAgICA9PiBhYmMKKyAgIFxmc3RyaXBiKCthYmMrKSAgICAgICAgICAgICAgICAgICA9PiArYWJjKworICAgXGZzdHJpcGIoK2FiYyssKykgICAgICAgICAgICAgICAgID0+IGFiYworICAgXGZzdHJpcGIoK2FiYyssKyxeKSAgICAgICAgICAgICAgID0+ICthYmMrCisgICBcZnN0cmlwYigrYWJjXiwrLF4pICAgICAgICAgICAgICAgPT4gYWJjCisgICBcZnN0cmlwYignYWJjJykgICAgICAgICAgICAgICAgICAgPT4gYWJjCisgICBcZnN0cmlwYihgYWJjJykgICAgICAgICAgICAgICAgICAgPT4gYWJjCisgICBcZnN0cmlwYihgYGFiYycnKSAgICAgICAgICAgICAgICAgPT4gYGFiYycKKyAgIFxmc3RyaXBiKFxmc3RyaXBiKGBgYWJjJycpKSAgICAgICA9PiBhYmMKKworICAgICAgICAgIE5vdGljZSB0aGUgc3BlY2lhbCBzeW50YXggcmVxdWlyZWQgZm9yIGluY2x1ZGluZyBhIGxpdGVyYWwKKyAgICAgICAgICBwYXJlbnRoZXNpcyBpbiB0aGUgYXJndW1lbnQgbGlzdC4gQXMgdGhlIGxhc3QgdHdvIGV4YW1wbGVzCisgICAgICAgICAgaWxsdXN0cmF0ZSwgXGZzdHJpcGIoKSBzdHJpcHMgb25seSBvbmUgbGV2ZWwgYXQgYXQgYSB0aW1lOworICAgICAgICAgIG5lc3RpbmcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSBzbWFsbCBmaXhlZCBudW1iZXIgb2YgbGV2ZWxzOworICAgICAgICAgIGxvb3BzIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGxhcmdlciBvciBpbmRldGVybWluYXRlIG51bWJlcnMgb2YKKyAgICAgICAgICBsZXZlbHMuCisKKyAgIFxmbG9wKHN0cmluZ1ssY2hhcl0pCisgICAgICAgICAgUmVtb3ZlcyB0aGUgbGVmdG1vc3Qgc2VnbWVudCBvZiB0aGUgc3RyaW5nIHRoYXQgZW5kcyB3aXRoIHRoZQorICAgICAgICAgIGdpdmVuIGNoYXJhY3Rlci4gSWYgbm8gY2hhcmFjdGVyIGlzIGdpdmVuLCBwZXJpb2QgKC4pIGlzIHVzZWQuCisgICAgICAgICAgRXhhbXBsZXM6CisKKyAgXGZsb3AoT09GQS5UWFQuR1opICAgICAgICAgICAgICAgPT4gVFhULkdaCisgIFxmbG9wKE9PRkEuVFhULkdaLC4pICAgICAgICAgICAgID0+IFRYVC5HWgorICBcZmxvcChPT0ZBLlRYVC5HWixYKSAgICAgICAgICAgICA9PiBULkdaCisKKyAgICAgICAgICBUbyByZW1vdmUgdGhlIGxlZnRtb3N0IG51bWJlciBjaGFyYWN0ZXJzLCBqdXN0IHVzZQorICAgICAgICAgIFxmc3Vic3RyaW5nKHMsbnVtYmVyKzEpLiBUbyByZXR1cm4gdGhlIHJpZ2h0bW9zdCBudW1iZXIKKyAgICAgICAgICBjaGFyYWN0ZXJzLCB1c2UgXGZyaWdodChzLG51bWJlcikuCisKKyAgIFNvIHRoZSBoaWRlb3VzIGV4YW1wbGU6CisKKyAgcmVjZWl2ZSBcZmxvd2VyKFxmc3Vic3RyaW5nKFx2KGZpbGVuYW1lKSwxLFxmbGVuZ3RoKFx2KGZpbGVuYW1lKSktMykpCisKKyAgIGNhbiBub3cgYmUgd3JpdHRlbiBhczoKKworICByZWNlaXZlIFxmbG93ZXIoXGZzdHJpcHgoXHYoZmlsZW5hbWUpKSkKKworICAgVGhhdCBpcywgdGhlIGZpbGVuYW1lIHN0cmlwcGVkIG9mIGl0cyBleHRlbnNpb24gYW5kIHRoZW4gbG93ZXJjYXNlZC4KKyAgIFRoaXMgaXMgbm90IG9ubHkgc2hvcnRlciBhbmQgbGVzcyBoaWRlb3VzLCBidXQgYWxzbyBkb2VzIG5vdCBkZXBlbmQgb24KKyAgIHRoZSBsZW5ndGggb2YgdGhlIGV4dGVuc2lvbiBiZWluZyAzLgorCisgICBOb3RlIHRoYXQgd2hlbiBhIHJlY2VpdmUgZmlsdGVyIGlzIGluIGVmZmVjdCwgdGhpcyBvdmVycmlkZXMgeW91ciBGSUxFCisgICBDT0xMSVNJT04gc2V0dGluZywgc2luY2UgS2VybWl0IGhhcyBubyB3YXkgb2Yga25vd2luZyB3aGF0IHRoZSBmaW5hbAorICAgZGVzdGluYXRpb24gZmlsZW5hbWUgd2lsbCBiZSAoYmVjYXVzZSBpdCBkb2VzIG5vdCBrbm93LCBhbmQgY2FuIG5vdCBiZQorICAgZXhwZWN0ZWQgdG8ga25vdywgdGhlIHN5bnRheCBvZiBldmVyeSB2ZXJzaW9uIG9mIGV2ZXJ5IGNvbW1hbmQgc2hlbGwKKyAgIG9uIGV2ZXJ5IHBsYXRmb3JtIG9uIHRoZSBwbGFuZXQpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4yLjQuIEltcGxpY2l0IFVzZSBvZiBQaXBlcworCisgICBJZiB5b3Ugd2lzaCwgQy1LZXJtaXQgY2FuIGFsc28gZXhhbWluZSBpbmNvbWluZyBmaWxlbmFtZXMgdG8gc2VlIGlmCisgICB0aGV5IHN0YXJ0IHdpdGggIiEiLCBhbmQgaWYgc28sIHRoZSBzdWJzZXF1ZW50IHRleHQgaXMgdHJlYXRlZCBhcyBhCisgICBjb21tYW5kIHRvIHJlYWQgZnJvbSBvciB3cml0ZSB0by4gRm9yIGV4YW1wbGUsIGlmIGEgS2VybWl0IGNsaWVudCBpcworICAgZ2l2ZW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisgIGdldCB7IWZpbmdlciB8IHNvcnR9CisKKyAgIHRoZSBzZXJ2ZXIgb24gdGhlIG90aGVyIGVuZCwgaWYgaXQgc3VwcG9ydHMgdGhpcyBmZWF0dXJlLCB3aWxsIHJ1biB0aGUKKyAgICJmaW5nZXIiIHByb2dyYW0sIHBpcGUgaXRzIHN0YW5kYXJkIG91dHB1dCB0byB0aGUgInNvcnQiIHByb2dyYW0sIGFuZAorICAgc2VuZCBzb3J0J3Mgc3RhbmRhcmQgb3V0cHV0IGJhY2sgdG8geW91LiBTaW1pbGFybHksIGlmIHlvdToKKworICBzZW5kIG9vZmEudHh0ICFzb3J0IC1yID4gb29mYS5uZXcKKworICAgb3IsIGVxdWl2YWxlbnRseToKKworICBzZW5kIG9vZmEudHh0IHshc29ydCAtciA+IG9vZmEubmV3fQorCisgICBvcjoKKworICBzZW5kIC9hcy1uYW1lOnshc29ydCAtciA+IG9vZmEubmV3fSBvb2ZhLnR4dAorCisgICB0aGlzIGhhcyB0aGUgcmVjZWl2ZXIgc2VuZCB0aGUgY29udGVudHMgb2YgdGhlIGluY29taW5nIG9vZmEudHh0IGZpbGUKKyAgIHRvIHRoZSBzb3J0IHByb2dyYW0sIHdoaWNoIHNvcnRzIHRoZSB0ZXh0IGluIHJldmVyc2Ugb3JkZXIgYW5kIHN0b3JlcworICAgdGhlIHJlc3VsdCBpbiBvb2ZhLm5ldy4KKworICAgVGhpcyB1c2Ugb2YgdGhlIGV4Y2xhbWF0aW9uIG1hcmsgc2hvdWxkIGJlIGZhbWlsaWFyIHRvIFVOSVggdXNlcnMgYXMKKyAgIHRoZSAiYmFuZyIgZmVhdHVyZSB0aGF0IGxldHMgeW91IHJ1biBhbiBleHRlcm5hbCBhcHBsaWNhdGlvbiBvcgorICAgY29tbWFuZCBmcm9tIHdpdGhpbiBhbm90aGVyIGFwcGxpY2F0aW9uLgorCisgICBLZXJtaXQncyAiYmFuZyIgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBzaW5jZSBpdCBpcyBub3QKKyAgIHVuaGVhcmQgZm9yIGZpbGVuYW1lcyB0byBhY3R1YWxseSBiZWdpbiB3aXRoICIhIi4gU28gaWYgeW91IHdhbnQgdG8KKyAgIHVzZSB0aGlzIGZlYXR1cmUsIHlvdSBtdXN0IGVuYWJsZSBpdCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworICAgU0VUIFRSQU5TRkVSIFBJUEVTIHsgT04sIE9GRiB9CisgICAgICAgICAgT04gZW5hYmxlcyB0aGUgcmVjb2duaXRpb24gb2YgIiEiIG5vdGF0aW9uIGluIGluY29taW5nCisgICAgICAgICAgZmlsZW5hbWVzIGR1cmluZyBmaWxlIHRyYW5zZmVyIGFzIGFuIGluZGljYXRvciB0aGF0IHRoZQorICAgICAgICAgIHJlbWFpbmluZyB0ZXh0IGlzIHRoZSBuYW1lIG9mIGEgY29tbWFuZC4gT0ZGLCB0aGUgZGVmYXVsdCwKKyAgICAgICAgICBkaXNhYmxlcyB0aGlzIGZlYXR1cmUgYW5kIHVzZXMgdGhlIHRleHQgYXMgYSBmaWxlbmFtZSBpbiB0aGUKKyAgICAgICAgICBub3JtYWwgZmFzaGlvbi4gVGhpcyBjb21tYW5kIGRvZXMgTk9UIGFmZmVjdCBTRU5EIC9DT01NQU5ELCBHRVQKKyAgICAgICAgICAvQ09NTUFORCwgQ1NFTkQsIGV0Yy4KKworICAgU28gdXNpbmcgYSBjb21iaW5hdGlvbiBvZiBDU0VORCAoU0VORCAvQ09NTUFORCkgYW5kIHRoZSAiYmFuZyIKKyAgIGZlYXR1cmUsIHlvdSBjYW4gdHJhbnNmZXIgYSBkaXJlY3RvcnkgdHJlZSBhbGwgaW4gb25lIGNvbW1hbmQKKyAgIChhc3N1bWluZyB0aGUgcmVtb3RlIEtlcm1pdCBzdXBwb3J0cyBwaXBlIHRyYW5zZmVycyBhbmQgaGFzIHRoZW0KKyAgIGVuYWJsZWQpOgorCisgIENTRU5EIHt0YXIgY2YgLSAuIHwgZ3ppcCAtY30geyFndW56aXAgLWMgfCB0YXIgeGYgLX0KKworICAgb3I6CisKKyAgU0VORCAvQ09NTUFORDp7dGFyIGNmIC0gLiB8IGd6aXAgLWN9IC9hczp7IWd1bnppcCAtYyB8IHRhciB4ZiAtfQorCisgICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBzeW50YXguIEJyYWNlcyBhcmUgbmVlZGVkIGFyb3VuZCB0aGUKKyAgIGNvbW1hbmQgYmVjYXVzZSBpdCBjb250YWlucyBzcGFjZXM7IGJyYWNlcyBhcmUgbmVlZGVkIGFyb3VuZCB0aGUKKyAgIGFzLW5hbWUgYmVjYXVzZSBpdCBlbmRzIHdpdGggIi0iLiBUaGUgYXMtbmFtZSBtdXN0IGJlZ2luIHdpdGggIiEiIG9yCisgICByZWNlaXZpbmcgS2VybWl0IHdpbGwgbm90IHJlY29nbml6ZSBpdCBhcyBhIGNvbW1hbmQuIFRoZSBDU0VORCBjb21tYW5kCisgICBtdXN0IE5PVCBiZWdpbiB3aXRoICIhIiB1bmxlc3MgeW91IGFyZSBydW5uaW5nIGEgY29tbWFuZCB3aG9zZSBuYW1lCisgICByZWFsbHkgZG9lcyBzdGFydCB0aGF0IGNoYXJhY3Rlci4KKworICAgU2ltaWxhcmx5LCB5b3UgaGF2ZSBhIEtlcm1pdCBzZXJ2ZXIgc2VuZCBhIGRpcmVjdG9yeSB0cmVlIHRvIGJlCisgICB1bnBhY2tlZCBvbiB0aGUgY2xpZW50IGVuZDoKKworICBDR0VUIHshdGFyIGNmIC0gLiB8IGd6aXAgLWN9IHtndW56aXAgLWMgfCB0YXIgeGYgLX0KKworICAgb3I6CisKKyAgR0VUIC9DT01NQU5EIHshdGFyIGNmIC0gLiB8IGd6aXAgLWN9IC9hczp7Z3VuemlwIC1jIHwgdGFyIHhmIC19CisKKyAgIE5vdGljZSBob3csIGluIHRoaXMgY2FzZSwgdGhlIGJhbmcgaXMgcmVxdWlyZWQgaW4gdGhlIHJlbW90ZSBjb21tYW5kLAorICAgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBhIGZpbGVuYW1lLCBidXQgbm90IGluIHRoZSBsb2NhbCBjb21tYW5kLCBzaW5jZQorICAgYnkgZGVmaW5pdGlvbiBvZiBDR0VUIChvciBHRVQgL0NPTU1BTkQpLCBpdCBpcyBrbm93biB0byBiZSBhIGNvbW1hbmQuCisKKyAgIFNFTkQgYW5kIFJFQ0VJVkUgRklMVEVScyBzdXBlcnNlZGUgdGhlIGJhbmcgZmVhdHVyZS4gRm9yIGV4YW1wbGUsIGlmIGEKKyAgIGZpbGUgYXJyaXZlcyB1bmRlciB0aGUgbmFtZSAiIWd1bnppcCAtYyB8IHRhciB4ZiAtIiwgYnV0IHRoZSByZWNlaXZpbmcKKyAgIEtlcm1pdCBhbHNvIGhhcyBiZWVuIGdpdmVuIGEgY29tbWFuZCBsaWtlOgorCisgIHNldCByZWNlaXZlIGZpbHRlciBzb3J0IC1yID4gXHYoZmlsZW5hbWUpCisKKyAgIHRoZW4gdGhlIGluY29taW5nIGRhdGEgd2lsbCBiZSBzb3J0ZWQgcmF0aGVyIHRoYW4gZ3VuemlwcGVkLgorCisgICBGaW5hbGx5LCBpZiBTRVQgVFJBTlNGRVIgUElQRVMgaXMgT04gKGFuZCBpbiB0aGlzIGNhc2UsIHRoaXMgbXVzdCBiZQorICAgZG9uZSBpbiB5b3VyIEMtS2VybWl0IGluaXRpYWxpemF0aW9uIGZpbGUpLCB5b3UgY2FuIHNlbmQgZnJvbSBhIHBpcGUKKyAgIG9uIHRoZSBDLUtlcm1pdCBjb21tYW5kIGxpbmU6CisKKyAga2VybWl0IC1zICIhZmluZ2VyIHwgc29ydCAtciIgLWEgdXNlcmxpc3QKKworICAgSW4gdGhpcyBjYXNlIHRoZSAiZmlsZW5hbWUiIGNvbnRhaW5zIHNwYWNlcyBhbmQgc28gbXVzdCBiZSBxdW90aW5nCisgICB1c2luZyB5b3VyIHNoZWxsJ3MgcXVvdGluZyBydWxlcy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMi41LiBTdWNjZXNzIGFuZCBGYWlsdXJlIG9mIFBpcGVkIENvbW1hbmRzCisKKyAgIENvbW1hbmRzIG9yIHByb2dyYW1zIHN0YXJ0ZWQgYnkgS2VybWl0IGFzIGEgcmVzdWx0IG9mIENTRU5EIG9yCisgICBDUkVDRUlWRSBjb21tYW5kcywgQ0dFVCwgU0VORCAvQ09NTUFORCwgUkVESVJFQ1QgY29tbWFuZHMgKHNlZQorICAgWzQ0N11TZWN0aW9uIDQuMi44LjIpLCBpbXBsaWNpdCB1c2Ugb2YgcGlwZXMsIFJVTiBjb21tYW5kcywgYW5kIHNvCisgICBmb3J0aCwgc2hvdWxkIHJldHVybiB0aGVpciBleGl0IHN0YXR1cyBjb2RlcyB0byB0aGUgS2VybWl0IGNvbW1hbmQKKyAgIHRoYXQgY2F1c2VkIHRoZW0gdG8gYmUgcnVuLCBhbmQgdGhlcmVmb3JlIElGIFNVQ0NFU1MgYW5kIElGIEZBSUxVUkUKKyAgIHRlc3RzIGFmdGVyIHRoZXNlIGNvbW1hbmRzIHNob3VsZCB3b3JrIGFzIGV4cGVjdGVkLiBGb3IgZXhhbXBsZToKKworICBDU0VORCBibGFoIDwgZmlsZW5hbWUKKworICAgc2hvdWxkIGZhaWwgaWYgdGhlcmUgaXMgbm8gY29tbWFuZCBjYWxsZWQgImJsYWgiIG9yIGlmIHRoZXJlIGlzIG5vCisgICBmaWxlIGNhbGxlZCAiZmlsZW5hbWUiLiBIb3dldmVyLCB0aGlzIGlzIG5vdCBmb29scHJvb2YgYW5kIHNvbWV0aW1lcworICAgQy1LZXJtaXQgbWlnaHQgdGhpbmsgYSBjb21tYW5kIHN1Y2NlZWRlZCB3aGVuIGl0IGZhaWxlZCwgb3IgdmljZQorICAgdmVyc2EuIFRoaXMgaXMgbW9zdCBsaWtlbHkgdG8gaGFwcGVuIHdoZW4gdGhlIGhpZ2hseSBzeXN0ZW0tZGVwZW5kZW50CisgICBtZXRob2RzIHRoYXQgS2VybWl0IG11c3QgdXNlIHRvIGRldGVybWluZSBhIGNvbW1hbmQncyBleGl0IHN0YXR1cyBjb2RlCisgICBkbyBub3Qgc3VwcGx5IHRoZSByaWdodCBpbmZvcm1hdGlvbi4KKworICAgSXQgY2FuIGFsc28gaGFwcGVuIGJlY2F1c2Ugc29tZSBjb21tYW5kcyBtaWdodCBkZWZpbmUgc3VjY2VzcyBhbmQKKyAgIGZhaWx1cmUgZGlmZmVyZW50bHkgZnJvbSB3aGF0IHlvdSBleHBlY3QsIG9yIGJlY2F1c2UgeW91IGFyZSB1c2luZyBhCisgICBwaXBlbGluZSBjb21wb3NlZCBvZiBtYW55IGNvbW1hbmRzLCBhbmQgb25lIG9mIHRoZW0gZmFpbHMgdG8gcGFzcworICAgZmFpbGluZyBleGl0IHN0YXR1cyBjb2RlcyB1cCB0aGUgY2hhaW4uIFRoZSBtb3N0IGxpa2VseSBjdWxwcml0IGlzIHRoZQorICAgc2hlbGwgaXRzZWxmLCB3aGljaCBpbiBtb3N0IGNhc2VzIG11c3QgYmUgaW50ZXJwb3NlZCBiZXR3ZWVuIEtlcm1pdAorICAgYW5kIGFueSBleHRlcm5hbCBwcm9ncmFtIHRvIGJlIHJ1bi4KKworICAgSW4gYW55IGNhc2UsIHlvdSBjYW4gZXhhbWluZSB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIHRvIGZpbmQgb3V0IHRoZQorICAgZXhpdCBzdGF0dXMgY29kZSByZXR1cm5lZCB0byBLZXJtaXQgYnkgdGhlIHByb2Nlc3MgbW9zdCByZWNlbnRseSBydW4KKyAgIGJ5IGFueSBjb21tYW5kIHRoYXQgcnVucyBleHRlcm5hbCBjb21tYW5kcyBvciBwcm9ncmFtcywgaW5jbHVkaW5nCisgICBDU0VORCwgQ1JFQ0VJVkUsIFJFRElSRUNULCBSVU4sIGV0YzoKKworICBcdihwZXhpdHN0YXQpCisKKyAgIEluIFVOSVgsIFdpbmRvd3MgYW5kIE9TLzIsIHRoZSB2YWx1ZSBzaG91bGQgYmUgLTIgaWYgbm8gY29tbWFuZCBoYXMKKyAgIGJlZW4gcnVuIHlldCwgMCBpZiB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCBzdWNjZWVkZWQsIC0xLCAtMywgb3IgLTQgaWYKKyAgIHRoZXJlIHdhcyBhbiBpbnRlcm5hbCBlcnJvciwgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIHJldHVybmVkIGJ5IHRoZQorICAgY29tbWFuZCBpdHNlbGYgaWYgdGhlIGNvbW1hbmQgZmFpbGVkLiBJZiB0aGUgbnVtYmVyIGlzIGluIHRoZSByYW5nZQorICAgMS0xMjcsIHRoaXMgaXMgdGhlIHByb2dyYW0ncyBleGl0IHN0YXR1cyBjb2RlLiBJZiBpdCBpcyAxMjggb3IKKyAgIGdyZWF0ZXIsIHRoaXMgaXMgc3VwcG9zZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCBvciBwcm9ncmFtIHdhcworICAgaW50ZXJydXB0ZWQgb3IgdGVybWluYXRlZCBmcm9tIG91dHNpZGUgaXRzZWxmLgorCisgICBJbiBXaW5kb3dzIDk1IGFuZCA5OCwgdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlIGRlZmF1bHQgc2hlbGwgYXJlCisgICB1bnJlbGlhYmxlOyB2YXJpb3VzIHRoaXJkLXBhcnR5IHNoZWxscyBjYW4gYmUgdXNlZCB0byB3b3JrIGFyb3VuZCB0aGlzCisgICBkZWZpY2llbmN5LgorCisgICBJbiBWTVMsIGl0IGlzIHRoZSBhY3R1YWwgZXhpdCBzdGF0dXMgY29kZSBvZiB0aGUgY29tbWFuZCB0aGF0IHdhcyBydW4uCisgICBUaGlzIGlzIGFuIG9kZCBudW1iZXIgaWYgdGhlIGNvbW1hbmQgc3VjY2VlZGVkLCBhbmQgYW4gZXZlbiBudW1iZXIgaWYKKyAgIGl0IGZhaWxlZC4gWW91IGNhbiBzZWUgdGhlIGFzc29jaWF0ZWQgbWVzc2FnZSBhcyBmb2xsb3dzOgorCisgIHJ1biB3cml0ZSBzeXMkb3V0cHV0IGYkbWVzc2FnZShcdihwZXhpdHN0YXQpKQorCisgICBPciwgbW9yZSBjb252ZW5pZW50bHksIHVzZSB0aGUgbmV3IEtlcm1pdCBmdW5jdGlvbjoKKworICBlY2hvIFxmZXJyc3RyaW5nKFx2KHBleGl0c3RhdCkpCisKKyAgIHdoaWNoIGNvbnZlcnRzIGEgc3lzdGVtIGVycm9yIGNvZGUgKG51bWJlcikgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgIG1lc3NhZ2UuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjIuNi4gQ2F1dGlvbnMgYWJvdXQgVXNpbmcgUGlwZXMgdG8gVHJhbnNmZXIgRGlyZWN0b3J5IFRyZWVzCisKKyAgIEFsdGhvdWdoIHV0aWxpdGllcyBzdWNoIGFzIHRhciBhbmQgemlwL3VuemlwIG1pZ2h0IGJlIGF2YWlsYWJsZSBvbgorICAgZGlmZmVyZW50IHBsYXRmb3JtcyAoc3VjaCBhcyBVTklYIGFuZCBXaW5kb3dzKSwgdGhpcyBkb2VzIG5vdAorICAgbmVjZXNzYXJpbHkgbWVhbiB5b3UgY2FuIHVzZSB0aGVtIHN1Y2Nlc3NmdWxseSB0byB0cmFuc2ZlciBkaXJlY3RvcnkKKyAgIHRyZWVzIGJldHdlZW4gdW5saWtlIHBsYXRmb3Jtcy4gRm9yIGV4YW1wbGU6CisKKyAgQ1NFTkQge3RhciBjZiAtIC4gfCBnemlwIC1jfSB7IWd1bnppcCAtYyB8IHRhciB4ZiAtfQorCisgICB3aGVuIHVzZWQgZnJvbSBVTklYIHRvIFdpbmRvd3Mgd2lsbCBoYXZlIHNhdGlzZmFjdG9yeSByZXN1bHRzIGZvcgorICAgYmluYXJ5IGZpbGVzLCBidXQgbm90IGZvciB0ZXh0IGZpbGVzLiBVTklYIHRleHQgZmlsZXMgaGF2ZSBsaW5lcworICAgZW5kaW5nIHdpdGggTGluZWZlZWQgKExGKSBvbmx5LCB3aGVyZWFzIFdpbmRvd3MgdGV4dCBmaWxlcyBoYXZlIGxpbmVzCisgICBlbmRpbmcgaW4gQ2FycmlhZ2UgUmV0dXJuIGFuZCBMaW5lZmVlZCAoQ1JMRikuIFRodXMgYW55IHRleHQgZmlsZXMKKyAgIHRoYXQgd2VyZSBpbiB0aGUgYXJjaGl2ZSBmb3JtZWQgYnkgdGhlIGZpcnN0IHRhciBjb21tYW5kIHdpbGwgYmUKKyAgIHVucGFja2VkIGJ5IHRoZSBzZWNvbmQgdGFyIGNvbW1hbmQgaW4gdGhlaXIgb3JpZ2luYWwgZm9ybSwgYW5kIHdpbGwKKyAgIGRpc3BsYXkgYW5kIHByaW50IGluY29ycmVjdGx5IGluIFdpbmRvd3MgKGV4Y2VwdCBpbiBhcHBsaWNhdGlvbnMgdGhhdAorICAgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgY29kZWQgdG8gaGFuZGxlIFVOSVgtZm9ybWF0IHRleHQgZmlsZXMpLiBPbiB0aGUKKyAgIG90aGVyIGhhbmQgaWYgeW91IHRvbGQgZ3ppcCB0byB1c2UgInRleHQgbW9kZSIgdG8gZG8gcmVjb3JkIGZvcm1hdAorICAgY29udmVyc2lvbiAoYXNzdW1pbmcgdGhlcmUgd2FzIGEgd2F5IHRvIHRlbGwgaXQsIGFzIHRoZXJlIGlzIHdpdGggbW9zdAorICAgInppcCIgcHJvZ3JhbXMpLCB0aGlzIHdvdWxkIGRlc3Ryb3kgYW55IGJpbmFyeSBmaWxlcyBpbiB0aGUgYXJjaGl2ZS4KKworICAgRnVydGhlcm1vcmUsIGlmIHRoZSBhcmNoaXZlIGNvbnRhaW5zIHRleHQgZmlsZXMgdGhhdCBhcmUgd3JpdHRlbiBpbgorICAgbGFuZ3VhZ2VzIG90aGVyIHRoYW4gRW5nbGlzaCwgdGhlICJzcGVjaWFsIiAoYWNjZW50ZWQgYW5kL29yCisgICBub24tUm9tYW4pIGNoYXJhY3RlcnMgYXJlIE5PVCB0cmFuc2xhdGVkLCBhbmQgYXJlIHRoZXJlZm9yZSBsaWtlbHkKKyAgIHNob3cgdXAgYXMgZ2liYmVyaXNoIG9uIHRoZSB0YXJnZXQgc3lzdGVtLiBGb3IgZXhhbXBsZSwgV2VzdCBFdXJvcGVhbgorICAgbGFuZ3VhZ2VzIGFyZSB1c3VhbGx5IGVuY29kZWQgaW4gSVNPIExhdGluIEFscGhhYmV0IDEgaW4gVU5JWCwgYnV0IGluCisgICBQQyBjb2RlIHBhZ2UgODUwIG9uIHRoZSBQQy4gQ2FwaXRhbCBBIHdpdGggYWN1dGUgYWNjZW50IGlzIGNvZGUgcG9pbnQKKyAgIDE5MyAoZGVjaW1hbCkgTGF0aW4tMSwgYnV0IDE4MSBpbiBDUDg1MC4gU28gQS1hY3V0ZSBpbiB0aGUgVU5JWCBmaWxlCisgICBiZWNvbWVzIE1pZGRsZSBCb3ggQm90dG9tIG9uIHRoZSBQQywgYW5kIHNpbWlsYXJseSBmb3IgYWxsIHRoZSBvdGhlcgorICAgc3BlY2lhbCBjaGFyYWN0ZXJzLCBhbmQgZm9yIGFsbCBvdGhlciBsYW5ndWFnZXMgLS0gR3JlZWssIFJ1c3NpYW4sCisgICBIZWJyZXcsIEphcGFuZXNlLCBldGMuCisKKyAgIFNvIHdoZW4gdHJhbnNmZXJyaW5nIHRleHQgZmlsZXMgYmV0d2VlbiB1bmxpa2UgcGxhdGZvcm1zLCB5b3Ugc2hvdWxkCisgICB1c2UgZGlyZWN0IEtlcm1pdCBmaWxlIHRyYW5zZmVycyBzbyBLZXJtaXQgY2FuIGFwcGx5IHRoZSBuZWVkZWQKKyAgIHJlY29yZC1mb3JtYXQgYW5kIGNoYXJhY3Rlci1zZXQgdHJhbnNmb3JtYXRpb25zLiBVc2UgcGlwZWxpbmVzCisgICBjb250YWluaW5nIGFyY2hpdmVycyBsaWtlIHRhciBvciB6aXAgb25seSBpZiBhbGwgdGhlIGZpbGVzIGFyZSBiaW5hcnkKKyAgIG9yIHRoZSB0d28gc3lzdGVtcyB1c2UgdGhlIHNhbWUgcmVjb3JkIGZvcm1hdCBhbmQgY2hhcmFjdGVyIHNldCBmb3IKKyAgIHRleHQgZmlsZXMuCisKKyAgIEFsc28gc2VlIFs0NDhdU2VjdGlvbnMgNC4zLCBbNDQ5XTQuMTAsIFs0NTBdNC4xMSwgYW5kIFs0NTFdNC4xNSBmb3IKKyAgIGhvdyB0byB0cmFuc2ZlciBkaXJlY3RvcnkgdHJlZXMgYmV0d2VlbiBib3RoIGxpa2UgYW5kIHVubGlrZSBzeXN0ZW1zCisgICBkaXJlY3RseSB3aXRoIEtlcm1pdC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMi43LiBQaXBlcyBhbmQgRW5jcnlwdGlvbgorCisgICBPZiBjb3Vyc2UgcGlwZWxpbmVzIGNvdWxkIGJlIHVzZWQgZm9yIGVuY3J5cHRlZCBmaWxlIHRyYW5zZmVycywKKyAgIGFzc3VtaW5nIHByb3BlciBwcmVjYXV0aW9ucyBjb3VsZCBiZSB0YWtlbiBjb25jZXJuaW5nIHRoZSB0cmFuc21pc3Npb24KKyAgIG9mIHRoZSBrZXkuIEJ1dCB0aGVyZSBpcyByYXJlbHkgYSBnb29kIHdheSB0byBkbyB0aGlzLiBUbyBpbGx1c3RyYXRlCisgICB1c2luZyBVTklYIGNyeXB0OgorCisgIGNzZW5kIHtjcnlwdCBrZXkgPCBmaWxlbmFtZX0geyFjcnlwdCBrZXkgPiBmaWxlbmFtZX0KKworICAgT3IsIG1vcmUgYW1iaXRpb3VzbHk6CisKKyAgY3NlbmQge3RhciBjZiAtIC4gfCBnemlwIC1jIHwgY3J5cHQga2V5fSB7IWNyeXB0IGtleSB8IGd1bnppcCAtYyB8IHRhciB4ZiAtfQorCisgICB0cmFuc21pdHMgdGhlIGtleSBpbiB0aGUgZmlsZSBoZWFkZXIgcGFja2V0IGFzIHBhcnQgb2YgdGhlCisgICAoY2xlYXItdGV4dCkgcmVtb3RlIGNvbW1hbmQsIGRlZmVhdGluZyB0aGUgZW50aXJlIHB1cnBvc2Ugb2YKKyAgIGVuY3J5cHRpbmcgdGhlIGZpbGUgZGF0YS4KKworICAgQnV0IGlmIHlvdSBhcmUgY29ubmVjdGVkIGluIHRlcm1pbmFsIG1vZGUgdG8gdGhlIHJlbW90ZSBjb21wdXRlciBhbmQKKyAgIHR5cGU6CisKKyAgY3JlY2VpdmUge2NyeXB0IGtleSA+IGZpbGVuYW1lfQorCisgICBhdCB0aGUgcmVtb3RlIEtlcm1pdCBwcm9tcHQsIHlvdSBoYXZlIGFsc28gdHJhbnNtaXR0ZWQgdGhlIGtleSBpbgorICAgY2xlYXIgdGV4dCBvdmVyIHRoZSBjb21tdW5pY2F0aW9ucyBsaW5rLgorCisgICBBdCBwcmVzZW50LCB0aGUgb25seSBzZWN1cmUgd2F5IHRvIHVzZSBDU0VORCBhbmQgQ1JFQ0VJVkUgd2l0aCBhbgorICAgZW5jcnlwdGlvbiBmaWx0ZXIgaXMgdG8gaGF2ZSBhIGh1bWFuIG9wZXJhdG9yIGF0IGJvdGggZW5kcywgc28gdGhlIGtleQorICAgZG9lcyBub3QgaGF2ZSB0byBiZSB0cmFuc21pdHRlZC4KKworICAgVGhlb3JldGljYWxseSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgUEdQIHNvZnR3YXJlIChQcmV0dHkgR29vZAorICAgUHJpdmFjeSwgYnkgUGhpbCBaaW1tZXJtYW4sIFBoaWwncyBQcmV0dHkgR29vZCBTb2Z0d2FyZSkgdG8gYXZvaWQga2V5CisgICB0cmFuc21pc3Npb24gKHNpbmNlIFBHUCB1c2VzIHNlcGFyYXRlIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXkgYW5kICJsZXRzCisgICB5b3UgY29tbXVuaWNhdGUgc2VjdXJlbHkgd2l0aCBwZW9wbGUgeW91J3ZlIG5ldmVyIG1ldCwgd2l0aCBubyBzZWN1cmUKKyAgIGNoYW5uZWxzIG5lZWRlZCBmb3IgcHJpb3IgZXhjaGFuZ2Ugb2Yga2V5cyIpLCBidXQgdGhlIHNwZWNpZmljIG1ldGhvZAorICAgaGFzIHlldCB0byBiZSB3b3JrZWQgb3V0LgorCisgICAgIEhJTlQ6IFNlZSB0aGUgUEdQIFVzZXIncyBHdWlkZSwgZS5nLiBhdDoKKyAgICAgWzQ1Ml1odHRwOi8vd3d3LnRlbHN0cmEuY29tLmF1L2RvY3MvUEdQLworICAgICBFc3BlY2lhbGx5IHRoZSB0b3BpYyAiVXNpbmcgUEdQIGFzIGEgVU5JWC1TdHlsZSBGaWx0ZXIiOgorICAgICBbNDUzXWh0dHA6Ly93d3cudGVsc3RyYS5jb20uYXUvZG9jcy9QR1AvcGdwZG9jMi9wZ3Bkb2MyXzE3Lmh0bWwKKworICAgSW4gYW55IGNhc2UsIGJldHRlciBhbmQgbW9yZSBjb252ZW5pZW50IHNlY3VyaXR5IG9wdGlvbnMgYXJlIG5vdworICAgYXZhaWxhYmxlOiBLZXJiZXJvcyBhdXRoZW50aWNhdGlvbiBhbmQgZW5jcnlwdGlvbiAoWzQ1NF1DTElDSyBIRVJFIGZvcgorICAgZGV0YWlscykgYW5kIHRoZSBuZXcgYWJpbGl0eSB0byBydW4gQy1LZXJtaXQgInRob3VnaCIgb3RoZXIKKyAgIGNvbW11bmljYXRpb24gcHJvZ3JhbXMsIGRlc2NyaWJlZCBpbiBbNDU1XVNlY3Rpb24gMi43LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4yLjguIENvbW1hbmRzIGFuZCBGdW5jdGlvbnMgUmVsYXRlZCB0byBQaXBlcworCisgICAgNC4yLjguMS4gVGhlIE9QRU4gIVJFQUQgYW5kIE9QRU4gIVdSSVRFIENvbW1hbmRzCisKKyAgIFRoZXNlIGFyZSBkZXNjcmliZWQgaW4gWzQ1Nl1Vc2luZyBDLUtlcm1pdCwgYW5kIGFyZSBnZW5lcmFsbHkgdXNlZnVsCisgICB3aXRoIHJlYWRpbmcgb3V0cHV0IGZyb20gY29tbWFuZHMgdGhhdCBwcm9kdWNlIG1vcmUgdGhhbiBvbmUgbGluZSBvbgorICAgdGhlaXIgc3RhbmRhcmQgb3V0cHV0LCBvciB3cml0aW5nIG11bHRpcGxlIGxpbmVzIGludG8gY29tbWFuZHMgdGhhdAorICAgYWNjZXB0IHRoZW0gb24gdGhlaXIgc3RhbmRhcmQgaW5wdXQuCisKKyAgIEluIEMtS2VybWl0IDcuMCBDTE9TRSAhUkVBRCBpcyBhY2NlcHRlZCBhcyBhIHN5bm9ueW0gZm9yIENMT1NFIFJFQUQsCisgICBhbmQgQ0xPU0UgIVdSSVRFIGZvciBDTE9TRSBXUklURS4KKworICAgVGVzdGluZyB0aGUgc3VjY2VzcyBhbmQgZmFpbHVyZSBvZiB0aGVzZSBjb21tYW5kcywgaG93ZXZlciwgY2FuIGJlIGEKKyAgIGJpdCB0cmlja3kuIENvbnNpZGVyOgorCisgIG9wZW4gIXJlYWQgbGFsYXNramZzbGRrZmpzbGRrZmoKKworICAgKHdoZXJlICJsYWxhc2tqZnNsZGtmanNsZGtmaiIgaXMgbmVpdGhlciBhIHZhbGlkIGNvbW1hbmQgbm9yIHRoZSBuYW1lCisgICBvZiBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQgY2FuIGJlIHJ1bikuIE9QRU4gIVJFQUQsIGluIFVOSVggYXQgbGVhc3QsCisgICB0cmFuc2xhdGVzIHRoaXMgaW50byBleGVjbChzaGVsbHBhdGgsc2hlbGxuYW1lLCItYyIsY29tbWFuZCkuIFRoaXMKKyAgIG1lYW5zIGl0IHN0YXJ0cyB5b3VyIHByZWZlcnJlZCBzaGVsbCAoZS5nLiBmcm9tIHRoZSBTSEVMTCBlbnZpcm9ubWVudAorICAgdmFyaWFibGUpIGFuZCBhc2tzIGl0IHRvIGV4ZWN1dGUgdGhlIGdpdmVuIGNvbW1hbmQuIEl0IG11c3QgYmUgdGhpcworICAgd2F5LCBiZWNhdXNlIHlvdXIgY29tbWFuZCBjYW4gYmUgYSBlaXRoZXIgYW4gaW50ZXJuYWwgc2hlbGwgY29tbWFuZAorICAgKHdoaWNoIG9ubHkgeW91ciBzaGVsbCBjYW4gZXhlY3V0ZSkgb3IgYW4gZXh0ZXJuYWwgY29tbWFuZCwgd2hpY2ggb25seQorICAgeW91ciBzaGVsbCBrbm93cyBob3cgdG8gZmluZCAoaXQga25vd3MgeW91ciBQQVRIIGFuZCBpbnRlcnByZXRzLCBldGMpLgorICAgVGhlcmVmb3JlIHVubGVzcyBPUEVOICFSRUFEIGNhbid0IHN0YXJ0IHlvdXIgc2hlbGwsIGl0IGFsd2F5cworICAgc3VjY2VlZHMuCisKKyAgIENvbnRpbnVpbmcgd2l0aCB0aGUgbm9uZXhpc3RlbnQtY29tbWFuZCBleGFtcGxlOgorCisgIEMtS2VybWl0PiBvcGVuICFyZWFkIGxhbGFza2pmc2xka2Zqc2xka2ZqCisgIEMtS2VybWl0PiBzdGF0dXMKKyAgIFNVQ0NFU1MKKyAgQy1LZXJtaXQ+IHJlYWQgbGluZQorICBDLUtlcm1pdD4gc3RhdHVzCisgICBTVUNDRVNTCisgIEMtS2VybWl0PiBlY2hvICJcbShsaW5lKSIKKyAgImJhc2g6IGxhbGFza2pmc2xka2Zqc2xka2ZqOiBjb21tYW5kIG5vdCBmb3VuZCIKKyAgQy1LZXJtaXQ+IGNsb3NlIHJlYWQKKyAgQy1LZXJtaXQ+IHN0YXR1cworICAgRkFJTFVSRQorICBDLUtlcm1pdD4KKworICAgSW4gb3RoZXIgd29yZHMsIHRoZSBmYWlsdXJlIGNhbiBub3QgYmUgZGV0ZWN0ZWQgb24gT1BFTiwgc2luY2UgdGhlCisgICBPUEVOIGNvbW1hbmQgc3VjY2VlZHMgaWYgaXQgY2FuIHN0YXJ0IHlvdXIgc2hlbGwuIEl0IGNhbid0IGJlIGRldGVjdGVkCisgICBvbiBSRUFELCBzaW5jZSBhbGwgdGhpcyBkb2VzIGlzIHJlYWQgb3V0cHV0IGZyb20gdGhlIHNoZWxsLCB3aGljaCBpbgorICAgdGhpcyBjYXNlIGhhcHBlbnMgdG8gYmUgYW4gZXJyb3IgbWVzc2FnZS4gSG93ZXZlciwgZmFpbHVyZSBJUyBkZXRlY3RlZAorICAgdXBvbiBjbG9zZSwgc2luY2UgdGhpcyBpcyB0aGUgb2NjYXNpb24gdXBvbiB3aGljaCB0aGUgc2hlbGwgZ2l2ZXMKKyAgIEtlcm1pdCBpdHMgZXhpdCBzdGF0dXMgY29kZS4KKworICAgRm9yIGFuIGlsbHVzdHJhdGlvbiBvZiB0aGlzIHNpdHVhdGlvbiwgc2VlIFs0NTddU2VjdGlvbiAyLjE0LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4yLjguMi4gVGhlIFJFRElSRUNUIENvbW1hbmQKKworICAgQSBzZWNvbmQgbWV0aG9kIG9mIEkvTyByZWRpcmVjdGlvbiBpcyBvZmZlcmVkIGJ5IHRoZSBSRURJUkVDVCBjb21tYW5kLgorICAgVGhpcyBpcyBhIHJhdGhlciBhZHZhbmNlZCBhbmQgdHJpY2t5IGZlYXR1cmUgdGhhdCBpcyBwcmVzZW50bHkKKyAgIHN1cHBvcnRlZCBvbmx5IGluIFVOSVggQy1LZXJtaXQsIGluIE9TLTkgQy1LZXJtaXQsIGFuZCBpbiBLZXJtaXQgOTUuCisgICBTeW50YXg6CisKKyAgIFJFRElSRUNUIGNvbW1hbmQKKyAgICAgICAgICBSdW5zIHRoZSBnaXZlbiBjb21tYW5kLCBzZW5kaW5nIGl0cyBzdGFuZGFyZCBvdXRwdXQgdG8gdGhlCisgICAgICAgICAgY3VycmVudCBjb21tdW5pY2F0aW9ucyBjaGFubmVsIChTRVQgTElORSwgU0VUIFBPUlQsIG9yIFNFVCBIT1NUCisgICAgICAgICAgY29ubmVjdGlvbiksIGFuZCByZWFkaW5nIGl0cyBzdGFuZGFyZCBpbnB1dCBmcm9tIHRoZSBzYW1lCisgICAgICAgICAgY29ubmVjdGlvbi4gV29ya3Mgb25seSBpbiBsb2NhbCBtb2RlIC0tIGkuZS4gYSBjb25uZWN0aW9uIGlzCisgICAgICAgICAgcmVxdWlyZWQgLS0gYW5kIHRoZW4gb25seSBpZiB0aGUgZ2l2ZW4gY29tbWFuZCB1c2VzIFN0YW5kYXJkCisgICAgICAgICAgSS9PLgorCisgICBFeGFtcGxlOgorCisgIHJlZGlyZWN0IGZpbmdlcgorCisgICBydW5zIHRoZSBsb2NhbCAiZmluZ2VyIiBjb21tYW5kIGFuZCBzZW5kcyBpdHMgb3V0cHV0IG92ZXIgdGhlCisgICBjb25uZWN0aW9uIGFzIHBsYWluIHRleHQsIHdoZXJlIHByZXN1bWFibHkgdGhlcmUgaXMgYSBwcm9jZXNzIHNldCB1cAorICAgdG8gcmVhZCBpdC4gQW5vdGhlciBleGFtcGxlOgorCisgIHJlZGlyZWN0IGZpbmdlciB8IHNvcnQgLXIKKworICAgc2hvd3MgdGhlIHVzZSBvZiBhIHBpcGVsaW5lLgorCisgICBOb3RlOiBSRURJUkVDVCBkaWZmZXJzIGZyb20gQ1NFTkQvQ1JFQ0VJVkUgaW4gdHdvIGltcG9ydGFudCB3YXlzOiAoMSkKKyAgIGl0IGRvZXMgbm90IHVzZSB0aGUgS2VybWl0IHByb3RvY29sLCBhbmQgKDIpIGl0IHVzZXMgYSBiaWRpcmVjdGlvbmFsCisgICBwaXBlIHJhdGhlciB0aGFuIGEgb25lLXdheSBwaXBlLgorCisgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhlIFJFRElSRUNUIGNvbW1hbmQgaXMgdG8gcnVuIGV4dGVybmFsIHByb3RvY29scywKKyAgIHN1Y2ggYXMgc3ovcnogaW4gVU5JWCBmb3IgWk1PREVNLCB3aGVuIHRoZXkgd29yayBvdmVyIFN0YW5kYXJkIEkvTygqKS4KKyAgIEV4YW1wbGU6CisKKyAgc2V0IGhvc3QgeHl6Y29ycC5jb20KKyAgKGxvZ2luLCBldGMpCisgIHJlZGlyZWN0IHN6IG9vZmEuemlwCisKKyAgIGxldHMgeW91IG1ha2UgYSBUZWxuZXQgY29ubmVjdGlvbiB3aXRoIEMtS2VybWl0IGFuZCB0aGVuIGRvIGEgWk1PREVNCisgICB0cmFuc2ZlciBvdmVyIGl0LiBaTU9ERU0gcHJvdG9jb2wgbWVzc2FnZXMgZ28gYm90aCB3YXlzIG92ZXIgdGhlIHNhbWUKKyAgIGNvbm5lY3Rpb24gc2ltdWx0YW5lb3VzbHkuCisKKyAgIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBDLUtlcm1pdCBvbiBVTklYIGFzIHlvdXIgUFBQIGRpYWxlciBhbmQgdGhlbiB0bworICAgUkVESVJFQ1QgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIFBQUCBzb2Z0d2FyZSwgYnV0IEMtS2VybWl0IDcuMCBvZmZlcnMgYQorICAgYmV0dGVyIGFwcHJvYWNoIHRvIFBQUCBkaWFsaW5nIGluIGl0cyBuZXcgRVhFQyBjb21tYW5kIChbNDU4XVNlY3Rpb24KKyAgIDEuMjMpLgorCisgICBJbiB0aGVvcnksIHlvdSBjYW4gYWxzbyByZWRpcmVjdCBhbiBpbnRlcmFjdGl2ZSBwcm9jZXNzLiBGb3IgZXhhbXBsZSwKKyAgIHN1cHBvc2UgeW91IHRlbGwgS2VybWl0IDk1IHRvIHdhaXQgZm9yIGFuIGluY29taW5nIFRDUC9JUCBjb25uZWN0aW9uOgorCisgIHNldCBob3N0ICogMzAwMAorCisgICBhbmQgdGhlbiB0ZWxsIEMtS2VybWl0IG9uIFVOSVggdG86CisKKyAgc2V0IGhvc3Qga2VybWl0OTVob3N0bmFtZSAzMDAwCisgIHJlZGlyZWN0IGtzaAorCisgICBhbmQgdGhlbiB0ZWxsIEtlcm1pdCA5NSB0byBDT05ORUNUOiBub3cgeW91IGFyZSB0YWxraW5nIHRvIHRoZSBVTklYCisgICBLLXNoZWxsOyB5b3UgY2FuIGdpdmUgY29tbWFuZHMgKHB3ZCwgbHMsIGV0YykgYW5kIHNlZSB0aGUgcmVzdWx0cy4gSW4KKyAgIHByYWN0aWNlLCB0aGUgSy1zaGVsbCdzIHRlcm1pbmFsIG1vZGVzIGFyZSBtZXNzZWQgdXAgYmVjYXVzZSAoYSkgaXQgaXMKKyAgIG5vdCBnb2luZyB0aHJvdWdoIHRoZSBVbml4IHRlcm1pbmFsIGRyaXZlciwgYW5kIChiKSBpdCBpcyAic21hcnQiIGFuZAorICAga25vd3MgaXQgaXMgYmVpbmcgcmVkaXJlY3RlZCwgYW5kIHNvIGFjdHMgaW4gYSBkZWNpZGVkbHkgaW5ob3NwaXRhYmxlCisgICBtYW5uZXIgKG90aGVyIGFwcGxpY2F0aW9ucyBsaWtlIEVNQUNTLCB2aSwgZXRjLCBzaW1wbHkgcmVmdXNlIHRvIHJ1bgorICAgaWYgdGhlaXIgc3RhbmRhcmQgaS9vIGhhcyBiZWVuIHJlZGlyZWN0ZWQpLgorCisgICAgICgqKSBUaGUgcHVibGljbHktZGlzdHJpYnV0ZWQgc3ovcnogcHJvZ3JhbXMgZG8gbm90IHdvcmsgYXMgY2xpZW50cy4KKyAgICAgSG93ZXZlciwgT21lbiBUZWNobm9sb2d5IGRvZXMgb2ZmZXIgYW4gdXAtdG8tZGF0ZSByZWRpcmVjdGFibGUKKyAgICAgY2xpZW50IFhZWk1PREVNIHByb2dyYW0gY2FsbGVkIGNyenN6LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4yLjguMy4gUmVjZWl2aW5nIE1haWwgYW5kIFByaW50IEpvYnMKKworICAgQXMgb2YgNy4wLCBhbmQgaW4gVU5JWCBvbmx5LCBmaWxlcyB0aGF0IGFyZSBzZW50IHRvIEMtS2VybWl0IGFzIG1haWwKKyAgICh3aGVuIHRoZSBvdGhlciBLZXJtaXQgdXNlcyBhIE1BSUwgb3IgU0VORCAvTUFJTCBjb21tYW5kKSBvciB0byBiZQorICAgcHJpbnRlZCAodmlhIFJFTU9URSBQUklOVCBvciBTRU5EIC9QUklOVCkgYXJlIG5vdyBwaXBlZCBkaXJlY3RseSB0bworICAgdGhlIG1haWwgb3IgcHJpbnQgcHJvZ3JhbSwgcmF0aGVyIHRoYW4gd3JpdHRlbiB0byB0ZW1wb3JhcnkgZmlsZXMgYW5kCisgICB0aGVuIG1haWxlZCBvciBwcmludGVkIGFuZCB0aGVuIGRlbGV0ZWQuIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2VzIG9mCisgICAoYSkgbm90IHJlcXVpcmluZyBhIHRlbXBvcmFyeSBmaWxlLCBhbmQgKGIpIGFsbG93aW5nIG1haWwgdG8gaGF2ZSBhCisgICBwcm9wZXIgc3ViamVjdCBpbiBwbGFjZSBvZiB0aGUgZmlsZW5hbWUuIFRlbXBvcmFyeSBmaWxlcyB3ZXJlIGJhZCBub3QKKyAgIG9ubHkgYmVjYXVzZSB0aGV5IHJlcXVpcmVkIChhKSBzcGFjZSwgYW5kIChiKSB3cml0ZWFiaWxpdHkgb2YgdGhlCisgICBjdXJyZW50IGRpcmVjdG9yeSwgYnV0IGFsc28gYmVjYXVzZSB1c2luZyB0aGVtIGNvdWxkIHJlc3VsdCBpbiB3aXBpbmcKKyAgIG91dCBhbiBleGlzdGluZyBmaWxlLiBTZWUgWzQ1OV1TZWN0aW9uIDQuNyBmb3IgbW9yZSBhYm91dCBTRU5EIC9NQUlMCisgICBhbmQgU0VORCAvUFJJTlQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjIuOC40LiBQaXBlLVJlbGF0ZWQgRnVuY3Rpb25zCisKKyAgIFRoZSBcZmNvbW1hbmQoY29tbWFuZCkgZnVuY3Rpb24gcnVucyB0aGUgZ2l2ZW4gc2hlbGwgb3Igc3lzdGVtIGNvbW1hbmQKKyAgIGFuZCByZXR1cm5zIHRoZSBjb21tYW5kJ3Mgc3RhbmRhcmQgb3V0cHV0IGFzIGl0cyB2YWx1ZSAod2l0aCBhbnkKKyAgIG5ld2xpbmUgY2hhcmFjdGVycyBzdHJpcHBlZCBmcm9tIHRoZSBlbmQpLCB1bmxlc3MgdGhlIHJlc3VsdCBpcyB0b28KKyAgIGxvbmcsIGluIHdoaWNoIGNhc2UgaXQgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLiBUaGUgbWF4aW11bSBsZW5ndGgKKyAgIGZvciB0aGUgcmVzdWx0IGlzIGF0IGxlYXN0IDEwMjIgYnl0ZXMsIGFuZCBpdCBtaWdodCBiZSBsb25nZXIgb24gc29tZQorICAgcGxhdGZvcm1zLiBFeGFtcGxlcyAoVU5JWCk6CisKKyAgQy1LZXJtaXQ+IGVjaG8gIlxmY29tbWFuZChkYXRlKSIKKyAgIkZyaSBBcHIgMTggMTM6MzE6NDIgMTk5NyIKKyAgQy1LZXJtaXQ+IGVjaG8gIlxmY29tbWFuZChmaW5nZXIgfCB3YyAtbCkiIDsgaG93IG1hbnkgdXNlcnMgbG9nZ2VkIGluPworICAiICAgICAgODMiCisgIEMtS2VybWl0PiBldmFsdWF0ZSBcZmNvbW1hbmQoZmluZ2VyIHwgd2MgLWwpICogMgorICAxNjYKKyAgQy1LZXJtaXQ+IGVjaG8gV2VsY29tZSB0byBcZmNvbW1hbmQodHR5KSBvbiBcZmNvbW1hbmQoZGF0ZSkKKyAgV2VsY29tZSB0byAvZGV2L3R0eXJlIG9uIEZyaSBBcHIgMTggMTM6MzE6NDIgMTk5NworICBDLUtlcm1pdD4gZWNobyAiXGZjb21tYW5kKGxzIG9vZmEuKikiCisgICJvb2ZhLmMKKyAgb29mYS5oCisgIG9vZmEubyIKKyAgQy1LZXJtaXQ+IGNkIC9kaXJlY3Rvcnktd2l0aC10aG91c2FuZHMtb2YtZmlsZXMKKyAgQy1LZXJtaXQ+IGVjaG8gIlxmY29tbWFuZChscyAtbCkiIDsgVGhpcyB3b3VsZCBiZSB0b28gbG9uZworICAiIgorICBDLUtlcm1pdD4KKworICAgSWYgYSBjb21tYW5kJ3Mgb3V0cHV0IHdvdWxkIGJlIHRvbyBsb25nLCB5b3UgY2FuIHVzZSB0aGUgb3RoZXIsIG1vcmUKKyAgIGxhYm9yaW91cyBtZXRob2Qgb2YgcmVhZGluZyBmcm9tIGEgY29tbWFuZDogT1BFTiAhUkVBRCBjb21tYW5kLCBSRUFECisgICBlYWNoIGxpbmUsIENMT1NFICFSRUFELgorCisgICBUaGUgXGZyYXdjb21tYW5kKGNvbW1hbmQpIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBcZmNvbW1hbmQoY29tbWFuZCksCisgICBleGNlcHQgaXQgZG9lcyBub3QgcmVtb3ZlIHRyYWlsaW5nIG5ld2xpbmUgY2hhcmFjdGVyczoKKworICBDLUtlcm1pdD4gZWNobyAiXGZyYXdjb21tYW5kKGRhdGUpIgorICAiRnJpIEFwciAxOCAxMzozMTo0MiAxOTk3CisgICIKKyAgQy1LZXJtaXQ+IGVjaG8gIlxmcmF3Y29tbWFuZChscyBvb2ZhLiopIgorICAib29mYS5jCisgIG9vZmEuaAorICBvb2ZhLm8KKyAgIgorICBDLUtlcm1pdD4KKworICAgVXNlIFxmcmF3Y29tbWFuZCgpIGlmIHlvdSB3YW50IHRvIHJldGFpbiB0aGUgZmluYWwgbGluZSB0ZXJtaW5hdG9ycywKKyAgIG9yIGlmIHRoZSBjb21tYW5kJ3Mgb3V0cHV0IGlzICJiaW5hcnkiLiBCdXQgcmVtZW1iZXIgdGhhdCBpZiB0aGUKKyAgIHJlc3VsdCBvZiB0aGlzIChvciBhbnkgb3RoZXIpIGZ1bmN0aW9uIGNvbnRhaW5zIGFueSBOVUwgKEFTQ0lJIGNvZGUgMCkKKyAgIGNoYXJhY3RlcnMsIHRoZSBmaXJzdCBOVUwgd2lsbCB0ZXJtaW5hdGUgdGhlIHJlc3VsdCBzdHJpbmcgYmVjYXVzZQorICAgdGhpcyBpcyBob3cgQyBzdHJpbmdzIHdvcmsgKGl0J3MgIkMtS2VybWl0IiwgcmVtZW1iZXI/KS4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VmdWwgbm90IG9ubHkgbG9jYWxseSwgYnV0IGFsc28gaW4gdGhlCisgICBjbGllbnQvc2VydmVyIGFyZW5hLiBJZiB5b3UgbmVlZCB0byBnZXQgdGhlIHJlc3VsdHMgZnJvbSBhIHN5c3RlbQorICAgY29tbWFuZCBvbiB0aGUgc2VydmVyIGVuZCBpbnRvIGEgdmFyaWFibGUgb24gdGhlIGNsaWVudCBlbmQsIGp1c3QgZG86CisKKyAgWyByZW1vdGUgXSBxdWVyeSBrZXJtaXQgY29tbWFuZChkYXRlKQorCisgICBUaGUgcmVzdWx0IGlzIGluIHRoZSBsb2NhbCBcdihxdWVyeSkgdmFyaWFibGU7IHNlZSBbNDYwXVVzaW5nCisgICBDLUtlcm1pdCwgMm5kIEVkLiwgcHAuMzU5LTM2MCBmb3IgZGV0YWlscy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LjMuIEF1dG9tYXRpYyBQZXItRmlsZSBUZXh0L0JpbmFyeSBNb2RlIFN3aXRjaGluZworCisgICBXaGVuIHRyYW5zZmVycmluZyBmaWxlcyBiZXR3ZWVuIGxpa2Ugc3lzdGVtcyAoZS5nLiBVTklYLXRvLVVOSVgpLAorICAgYmluYXJ5IG1vZGUgY2FuIGJlIHVzZWQgZm9yIGFsbCBmaWxlcyB1bmxlc3MgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbgorICAgaXMgbmVlZGVkLCBhbmQgaW4gZmFjdCBLZXJtaXQgcHJvZ3JhbXMgb2YgcmVjZW50IHZpbnRhZ2UgcmVjb2duaXplCisgICBlYWNoIG90aGVycycgcGxhdGZvcm1zIGFuZCBzd2l0Y2ggdG8gYmluYXJ5IG1vZGUgYXV0b21hdGljYWxseSB3aGVuIGl0CisgICBpcyBhcHByb3ByaWF0ZSAoZS5nLiBET1MgdG8gT1MvMiwgb3IgVU5JWCB0byBVTklYKS4gKEV4Y2VwdGlvbjoKKyAgIExBQkVMRUQgbW9kZSBpcyBjaG9zZW4gZm9yIFZNUy10by1WTVMgYW5kIE9TLzItdG8tT1MvMiB0cmFuc2ZlcnMgc28KKyAgIGNvbXBsZXggZmlsZSBmb3JtYXRzIGNhbiBiZSBwcmVzZXJ2ZWQuKQorCisgICBPbiBhIGNsaWVudC9zZXJ2ZXIgY29ubmVjdGlvbiBiZXR3ZWVuIGxpa2Ugc3lzdGVtcywgdGhlIHRyYW5zZmVyIG1vZGUKKyAgIGlzIGN1cnJlbnRseSBkZXRlcm1pbmVkIGJ5IHRoZSBmaWxlIHNlbmRlciwgcmF0aGVyIHRoYW4gYWx3YXlzIGJ5IHRoZQorICAgY2xpZW50LiBJZiB0aGUgY2xpZW50IGlzIHNlbmRpbmcsIGl0IGNvbnRyb2xzIHRoZSB0cmFuc2ZlciBtb2RlLiBJZiBhCisgICBHRVQgY29tbWFuZCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIsIHRoZSBzZXJ2ZXIgc2VuZHMgYWxsIGZpbGVzIGluCisgICBiaW5hcnkgbW9kZSBpZiBpdHMgVFJBTlNGRVIgQ0hBUkFDVEVSLVNFVCBpcyBUUkFOU1BBUkVOVDsgb3RoZXJ3aXNlIGl0CisgICB1c2VzIHRleHQgbW9kZSBmb3IgdGV4dCBmaWxlcyAoYWNjb3JkaW5nIHRvIGl0cyB0ZXh0LXBhdHRlcm4gbGlzdCkgYW5kCisgICBiaW5hcnkgbW9kZSBmb3IgYmluYXJ5IGZpbGVzLiBPZiBjb3Vyc2UsIHRoZSBjbGllbnQgY2FuIGNvbnRyb2wgdGhlCisgICBzZXJ2ZXIncyB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IHdpdGggdGhlIFJFTU9URSBTRVQgVFJBTlNGRVIKKyAgIENIQVJBQ1RFUi1TRVQgY29tbWFuZC4KKworICAgV2hlbiB0cmFuc2ZlcnJpbmcgZmlsZXMgYmV0d2VlbiB1bmxpa2Ugc3lzdGVtcywgaG93ZXZlciwgKGUuZy4KKyAgIFVOSVgtdG8tRE9TKSwgc29tZSBmaWxlcyAoc3VjaCBhcyBleGVjdXRhYmxlIHByb2dyYW0gaW1hZ2VzKSBtdXN0IGJlCisgICB0cmFuc2ZlcnJlZCBpbiBiaW5hcnkgbW9kZSBidXQgb3RoZXJzIChzdWNoIGFzIHBsYWluLXRleHQgZmlsZXMpIG11c3QKKyAgIGJlIHRyYW5zZmVycmVkIGluIHRleHQgbW9kZSBzbyB0aGVpciByZWNvcmQgZm9ybWF0IGFuZCBjaGFyYWN0ZXIgc2V0cworICAgY2FuIGJlIGFwcHJvcHJpYXRlbHkgY29udmVydGVkLiBJZiBhIGJpbmFyeSBmaWxlIGlzIHRyYW5zZmVycmVkIGluCisgICB0ZXh0IG1vZGUsIGl0IGlzIHJ1aW5lZC4gSWYgYSB0ZXh0IGZpbGUgaXMgdHJhbnNmZXJyZWQgaW4gYmluYXJ5IG1vZGUsCisgICB0aGVuIGF0IHRoZSB2ZXJ5IGxlYXN0LCBpdHMgZm9ybWF0IGNhbiBiZSBpbmNvcnJlY3Q7IGF0IHdvcnN0IGl0IGlzCisgICBhbHNvIGNvcnJ1cHRlZCBiZWNhdXNlIGl0cyBjaGFyYWN0ZXIgc2V0IHdhcyBub3QgY29udmVydGVkIChpbiBleHRyZW1lCisgICBjYXNlcyB0aGUgY29ycnVwdGlvbiBpcyB0b3RhbCwgZS5nLiBiZWNhdXNlIG9uZSBzeXN0ZW0gaXMgQVNDSUktYmFzZWQKKyAgIGFuZCB0aGUgb3RoZXIgRUJDRElDKS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMy4xLiBFeGNlcHRpb25zCisKKyAgIFZNUyBDLUtlcm1pdCwgd2hlbiBzZW5kaW5nIGZpbGVzIHRvIGEgbm9uLVZNUyBzeXN0ZW0sIHN3aXRjaGVzIHRvIHRleHQKKyAgIG9yIGJpbmFyeSBtb2RlIGF1dG9tYXRpY2FsbHkgZm9yIGVhY2ggZmlsZSwgYmFzZWQgb24gdGhlIHJlY29yZCBmb3JtYXQKKyAgIGluIHRoZSBmaWxlJ3MgZGlyZWN0b3J5IGVudHJ5OyB0aHVzIHRoZSBtZWNoYW5pc21zIGRlc2NyaWJlZCBpbiB0aGlzCisgICBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBWTVMgQy1LZXJtaXQsIHlldCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lOgorICAgYXV0b21hdGljIHRleHQvYmluYXJ5IG1vZGUgc3dpdGNoaW5nIHdoZW4gVk1TIEMtS2VybWl0IGlzIHNlbmRpbmcKKyAgIGZpbGVzLiBTZWUgdGhlIFZNUyBBcHBlbmRpeCBvZiBbNDYxXVVzaW5nIEMtS2VybWl0IGZvciBkZXRhaWxzLgorCisgICBLZXJtaXQgdmVyc2lvbnMgdGhhdCBzdXBwb3J0IExBQkVMRUQgb3IgSU1BR0UgdHJhbnNmZXIgbW9kZSBhcmUKKyAgIGxpa2V3aXNlIG5vdCBhZmZlY3RlZCBieSB0aGlzIGZlYXR1cmUgd2hlbiBvbmUgb2YgdGhvc2UgbW9kZXMgaXMKKyAgIHNlbGVjdGVkIChub3JtYWxseSB1c2VkIG9ubHkgd2hlbiB0cmFuc2ZlcnJpbmcgYmV0d2VlbiBsaWtlIHN5c3RlbXMpLgorCisgICBLZXJtaXQgdmVyc2lvbnMgdGhhdCBzdXBwb3J0IGZpbGUtdHJhbnNmZXIgcGlwZXMgYW5kIGZpbHRlcnMgYXJlIG5vdAorICAgYWZmZWN0ZWQgYnkgdGhpcyBmZWF0dXJlIHdoZW4gcGlwZXMgb3IgZmlsdGVycyBhcmUgdXNlZCwgc2luY2UgdGhlCisgICBvdXRwdXQgb2YgYSBwaXBlIG9yIGZpbHRlciAoc3VjaCBhcyBnemlwKSBpcyBsaWtlbHkgdG8gcmVxdWlyZQorICAgdHJhbnNmZXIgaW4gYSBkaWZmZXJlbnQgbW9kZSB0aGFuIHRoZSBvcmlnaW5hbCBmaWxlLgorCisgICBGaW5hbGx5LCBTRU5EIC9URVhUIG9yIFNFTkQgL0JJTkFSWSB3aWxsIGZvcmNlIGZpbGVzIHRvIGJlIHNlbnQgaW4gdGhlCisgICBpbmRpY2F0ZWQgbW9kZSwgb3ZlcnJpZGluZyBhbGwgYXV0b21hdGljIHRyYW5zZmVyLW1vZGUtY2hvb3NpbmcKKyAgIG1lY2hhbmlzbXMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjMuMi4gT3ZlcnZpZXcKKworICAgU3VwcG9zZSB5b3UgZ2l2ZSBDLUtlcm1pdCBhIGNvbW1hbmQgbGlrZToKKworICBTRU5EICouKgorCisgICBBbmQgc3VwcG9zZSB0aGUgcGF0dGVybiAqLiogbWF0Y2hlcyBhIG1peHR1cmUgb2YgdGV4dCBmaWxlcyAoc3VjaCBhcworICAgcHJvZ3JhbSBzb3VyY2UgY29kZSkgYW5kIGJpbmFyeSBmaWxlcyAoc3VjaCBvcyBvYmplY3QgbW9kdWxlcyBvcgorICAgZXhlY3V0YWJsZSBwcm9ncmFtcykuCisKKyAgIEMtS2VybWl0IDYuMCBhbmQgZWFybGllciAoZXhjZXB0IG9uIFZNUykgc2VuZCBhbGwgZmlsZXMgaW4gdGhlIHNhbWUKKyAgIG1vZGU6IHdoYXRldmVyIHlvdSBzYWlkIGluIHlvdXIgbW9zdCByZWNlbnQgU0VUIEZJTEUgVFlQRSBjb21tYW5kLCBvcgorICAgZWxzZSB3aGF0ZXZlciBtb2RlIHdhcyBjaG9zZW4gYXV0b21hdGljYWxseSBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9uCisgICBwYWdlIDIzNiBvZiBVc2luZyBDLUtlcm1pdCwgMm5kIEVkLgorCisgICBCdXQgd2hlbiB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMgYXJlIG1peGVkIGluIHRoZSBzYW1lIGdyb3VwLCBhbmQgdGhlCisgICBmaWxlcyBhcmUgYmVpbmcgdHJhbnNmZXJyZWQgdG8gYW4gdW5saWtlIHN5c3RlbSAoZS5nLiBVTklYIHRvIElCTQorICAgTWFpbmZyYW1lKSwgdGhpcyByZXN1bHRzIGluIGNvcnJ1cHRpb24gb2YgZWl0aGVyIGFsbCB0aGUgdGV4dCBmaWxlcyBvcgorICAgYWxsIHRoZSBiaW5hcnkgZmlsZXMuCisKKyAgIFN0cmVhbS1vcmllbnRlZCBmaWxlIHN5c3RlbXMgc3VjaCBhcyBpbiBVTklYIGFuZCBET1MgZG8gbm90IHJlY29yZCBhbnkKKyAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlIHRvIHRlbGwgdXMgd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUKKyAgIHRyYW5zZmVycmVkIGluIGJpbmFyeSBvciB0ZXh0IG1vZGUsIG1ha2luZyBpdCBpbXBvc3NpYmxlIHRvIHNlbGVjdCB0aGUKKyAgIHRyYW5zZmVyIG1vZGUgZm9yIGVhY2ggZmlsZSBpbiBhIGdyb3VwIGF1dG9tYXRpY2FsbHkgd2l0aCBhbnkKKyAgIGNlcnRhaW50eS4KKworICAgSG93ZXZlciwgd2UgY2FuIHVzZSBzb21lIGZhaXJseS13ZWxsIGVzdGFibGlzaGVkIGZpbGUgbmFtaW5nCisgICBjb252ZW50aW9ucyBmb3IgdGhpcyBwdXJwb3NlLiBDLUtlcm1pdCA3LjAgbGV0cyB5b3UgcHJvdmlkZSBsaXN0cyBvZgorICAgZmlsZW5hbWUgcGF0dGVybnMgdGhhdCBhcmUgdXNlZCB0byBzZXBhcmF0ZWx5IGRldGVybWluZSB0aGUgZmlsZSB0eXBlCisgICBmb3IgZWFjaCBpbmRpdmlkdWFsIGZpbGUgYmVpbmcgdHJhbnNmZXJlZC4gQSBwYXR0ZXJuIGlzIGEgc3RyaW5nLAorICAgcG9zc2libHkgY29udGFpbmluZyB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzICIqIiAoYXN0ZXJpc2ssIHdoaWNoCisgICBtYXRjaGVzIGFueSBzdHJpbmcgb2YgemVybyBvZiBtb3JlIGNoYXJhY3RlcnMpIGFuZC9vciAiPyIgKHF1ZXN0aW9uCisgICBtYXJrLCB3aGljaCBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyKS4gRm9yIGV4YW1wbGUgImEqYiIgbWF0Y2hlcworICAgYWxsIGZpbGVzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggImEiIGFuZCBlbmQgd2l0aCAiYiIsIHN1Y2ggYXMgImFiIiwKKyAgICJhcmIiLCAiYWJhYmFiYWJhYiIsIGV0YywgYnV0IG5vdCAiYWJiYSIuIEFuZCAiYT9iIiBtYXRjaGVzIGFueSBmaWxlCisgICB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoICJhIiwgZW5kcyB3aXRoICJiIiwgYW5kIGlzIGV4YWN0bHkgMyBjaGFyYWN0ZXJzCisgICBsb25nLgorCisgICAgIE5PVEU6IFdoZW4gdHlwaW5nIGNvbW1hbmRzIGF0IHRoZSBDLUtlcm1pdCBwcm9tcHQsIHlvdSBtdXN0IHByZWZpeAorICAgICAiPyIgd2l0aCBcIHRvIG92ZXJyaWRlIGl0cyBub3JtYWwgZnVuY3Rpb24gb2YgZ2l2aW5nIGhlbHAuCisKKyAgIChBbHNvIHNlZSBbNDYyXVNlY3Rpb24gNC45IGZvciBhZGRpdGlvbmFsIHBhdHRlcm4tbWF0Y2hpbmcgbm90YXRpb25zCisgICB0aGF0IG1pZ2h0IGJlIGF2YWlsYWJsZSBpbiB5b3VyIHZlcnNpb24gb2YgQy1LZXJtaXQuKQorCisgICBXaGVuIHlvdSBoYXZlIHNwZWNpZmllZCBmaWxlbmFtZSByZWNvZ25pdGlvbiBwYXR0ZXJucywgQy1LZXJtaXQgY2FuCisgICB0cmFuc2ZlciB0aGUgb25lcyB3aG9zZSBuYW1lcyBtYXRjaCBhbnkgb2YgdGhlIGJpbmFyeS1tb2RlIHBhdHRlcm5zIGluCisgICBiaW5hcnkgbW9kZSwgYW5kIHRob3NlIHdpdGggbmFtZXMgdGhhdCBtYXRjaCBhbnkgb2YgdGhlIHRleHQtbW9kZQorICAgcGF0dGVybnMgaW4gdGV4dCBtb2RlLCBhbmQgdGhvc2Ugd2hvc2UgbmFtZXMgbWF0Y2ggbmVpdGhlciBpbiB0aGUKKyAgIHByZXZhaWxpbmcgbW9kZSB5b3UgaGF2ZSBjaG9zZW4sIG9yIHRoYXQgd2FzIGNob3NlbiBhdXRvbWF0aWNhbGx5IHZpYQorICAgcGVlciByZWNvZ25pdGlvbi4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMy4zLiBDb21tYW5kcworCisgICBTRVQgRklMRSBQQVRURVJOUyB7IE9OLCBPRkYsIEFVVE8gfQorICAgICAgICAgIFRoaXMgdGVsbHMgS2VybWl0IHdoZXRoZXIgdG8gZG8gcGVyLWZpbGUgZmlsZW5hbWUKKyAgICAgICAgICBwYXR0ZXJuLW1hdGNoaW5nIHRvIGRldGVybWluZSB0ZXh0IG9yIGJpbmFyeSBtb2RlLiBUaGUgbm9ybWFsCisgICAgICAgICAgYW5kIGRlZmF1bHQgc2V0dGluZyBpcyBBVVRPLCB3aGljaCBtZWFucyB0byB1c2UgcGF0dGVybiBsaXN0cworICAgICAgICAgIHRvIHN3aXRjaCB0cmFuc2ZlciBtb2RlIG9ubHkgd2hlbiBpdCBpcyBjZXJ0YWluIHRoYXQgdGhlIG90aGVyCisgICAgICAgICAgS2VybWl0IHByb2dyYW0gc3VwcG9ydHMgYXV0b21hdGljIG5vdGlmaWNhdGlvbiBvZiB0cmFuc2ZlciBtb2RlCisgICAgICAgICAgKHZpYSBBdHRyaWJ1dGUgcGFja2V0cykgb24gYSBwZXItZmlsZSBiYXNpcyAodGhpcyBpbmZvcm1hdGlvbgorICAgICAgICAgIGlzIG9idGFpbmVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHByb3RvY29sIHN0YXJ0dXAgbmVnb3RpYXRpb24pLgorICAgICAgICAgIE9OIG1lYW5zIHRvIGFsd2F5cyBkZXRlcm1pbmUgdGhlIHRyYW5zZmVyIG1vZGUgZnJvbSB0aGUKKyAgICAgICAgICBmaWxlbmFtZSBhbmQgcGF0dGVybiBsaXN0IHdoZW4gc2VuZGluZyBmaWxlcy4gVXNlIE9GRiB0bworICAgICAgICAgIGRpc2FibGUgdGhpcyBmZWF0dXJlICh3aXRob3V0IHJlc2V0dGluZyB5b3VyIHBhdHRlcm4gbGlzdHMpLgorICAgICAgICAgIEFsc28gbm90ZSB0aGF0IGlmIHlvdSBoYXZlIHNlbGVjdGVkIExBQkVMRUQgZmlsZSB0cmFuc2ZlciAoU0VUCisgICAgICAgICAgRklMRSBUWVBFIExBQkVMRUQpLCB0aGlzIHRha2VzIHByZWNlZGVuY2Ugb3ZlcgorICAgICAgICAgIGZpbGVuYW1lLW1hdGNoaW5nIHBhdHRlcm5zIGFuZCBhbGwgZmlsZXMgYXJlIHNlbnQgaW4gbGFiZWxlZAorICAgICAgICAgIG1vZGUuCisKKyAgIFNFVCBUUkFOU0ZFUiBNT0RFIE1BTlVBTAorICAgICAgICAgIERpc2FibGVzIHRoZSB1c2Ugb2YgZmlsZW5hbWUgcGF0dGVybnMsIG5vIG1hdHRlciB3aGF0IHRoZSBGSUxFCisgICAgICAgICAgUEFUVEVSTlMgc2V0dGluZy4KKworICAgUkVNT1RFIFNFVCBUUkFOU0ZFUiBNT0RFIE1BTlVBTAorICAgICAgICAgIENsaWVudCBjb21tYW5kIHRvIGRpc2FibGUgYXV0b21hdGljIHRyYW5zZmVyIG1vZGUsIGFuZAorICAgICAgICAgIHRoZXJlZm9yZSBhbHNvIGZpbGVuYW1lIHBhdHRlcm5zLCBpbiB0aGUgc2VydmVyLiBTeW5vbnltOgorICAgICAgICAgIFJFTU9URSBTRVQgWEZFUiBNT0RFIE1BTlVBTC4KKworICAgeyBHRVQsIFNFTkQsIGV0YyB9IHsgL0JJTkFSWSwgL1RFWFQgfQorICAgICAgICAgIEluY2x1ZGluZyBhIC9CSU5BUlkgb3IgL1RFWFQgKG9yLCB3aGVyZSBzdXBwb3J0ZWQsIC9JTUFHRSBvcgorICAgICAgICAgIC9MQUJFTEVEKSBzd2l0Y2ggd2l0aCBhIGZpbGUtdHJhbnNmZXIgY29tbWFuZCBjaGFuZ2VzIHRoZQorICAgICAgICAgIHRyYW5zZmVyIG1vZGUgdG8gbWFudWFsIGZvciB0aGF0IGNvbW1hbmQgb25seSwgYW5kIHRoZXJlZm9yZQorICAgICAgICAgIGRpc2FibGVzIHBhdHRlcm5zIHRoYXQgdGhhdCBjb21tYW5kLgorCisgICBTRVQgRklMRSBCSU5BUlktUEFUVEVSTlMgWyBwYXR0ZXJuIFsgcGF0dGVybiBbIHBhdHRlcm4gLi4uIF0gXSBdCisgICAgICAgICAgQSBsaXN0IG9mIHplcm8gb3IgbW9yZSBwYXR0ZXJucywgc2VwYXJhdGVkIGJ5IHNwYWNlcyAobm90CisgICAgICAgICAgY29tbWFzKS4gTGV0dGVycyBpbiBhIHBhdHRlcm4gYXJlIGNhc2Utc2Vuc2l0aXZlIGlmIHRoZQorICAgICAgICAgIHVuZGVybHlpbmcgZmlsZW5hbWVzIGFyZSBjYXNlIHNlbnNpdGl2ZSAoYXMgaW4gVU5JWCksIGFuZAorICAgICAgICAgIGNhc2UtaW5zZW5zaXRpdmUgb3RoZXJ3aXNlIChhcyBpbiBXaW5kb3dzKS4gSWYgYSBmaWxlJ3MgbmFtZSBpcworICAgICAgICAgIG1hdGNoZWQgYnkgYW55IHBhdHRlcm4gaW4gdGhlIGxpc3QgYW5kIFNFVCBGSUxFIFBBVFRFUk5TIGlzIE9OLAorICAgICAgICAgIHRoZSBmaWxlIGlzIHNlbnQgaW4gYmluYXJ5IG1vZGUuIEV4YW1wbGVzOgorCisgIFNFVCBGSUxFIEJJTkFSWS1QQVRURVJOUyAqLmd6ICouWiAqLnRhciAqLnppcCAqLm8gKi5zbyAqLmEgKi5vdXQgOyBVTklYCisgIFNFVCBGSUxFIEJJTkFSWS1QQVRURVJOUyAqLkVYRSAqLlpJUCAqLk9CSiAqLkNPTSA7IERPUyBvciBPUy8yIG9yIFdpbmRvd3MKKworICAgICAgICAgIElmIGEgcGF0dGVybiBjb250YWlucyBzcGFjZXMsIGVuY2xvc2UgaXQgaW4gYnJhY2VzLgorCisgICBTRVQgRklMRSBURVhULVBBVFRFUk5TIFsgcGF0dGVybiBbIHBhdHRlcm4gWyBwYXR0ZXJuIC4uLiBdIF0gXQorICAgICAgICAgIExpa2UgU0VUIEZJTEUgQklOQVJZLVBBVFRFUk5TLCBidXQgdGhlIHBhdHRlcm5zIGNob29zZSB0ZXh0CisgICAgICAgICAgZmlsZXMgcmF0aGVyIHRoYW4gYmluYXJ5IG9uZXMuIEV4YW1wbGVzOgorCisgIFNFVCBGSUxFIFRFWFQtUEFUVEVSTlMgKi5UWFQgKi5LU0MgKi5IVE0qICouQkFUIDsgRE9TLCBXaW5kb3dzLCBPUy8yCisKKyAgIEFERCBCSU5BUlktUEFUVEVSTlMgWyBwYXR0ZXJuIFsgcGF0dGVybiBbIHBhdHRlcm4gLi4uIF0gXSBdCisgICAgICAgICAgQWRkcyBvbmUgb3IgbW9yZSBwYXR0ZXJucyB0byB0aGUgQklOQVJZLVBBVFRFUk4gbGlzdC4KKworICAgQUREIFRFWFQtUEFUVEVSTlMgWyBwYXR0ZXJuIFsgcGF0dGVybiBbIHBhdHRlcm4gLi4uIF0gXSBdCisgICAgICAgICAgQWRkcyBvbmUgb3IgbW9yZSBwYXR0ZXJucyB0byB0aGUgVEVYVC1QQVRURVJOIGxpc3QuCisKKyAgIFJFTU9WRSBCSU5BUlktUEFUVEVSTlMgWyBwYXR0ZXJuIFsgcGF0dGVybiBbIHBhdHRlcm4gLi4uIF0gXSBdCisgICAgICAgICAgUmVtb3ZlcyBvbmUgb3IgbW9yZSBwYXR0ZXJucyBmcm9tIHRoZSBCSU5BUlktUEFUVEVSTiBsaXN0LiBUaGUKKyAgICAgICAgICBnaXZlbiBwYXR0ZXJucyBhcmUgbWF0Y2hlZCB3aXRoIHRoZSBvbmVzIGluIHRoZSBCSU5BUlktUEFUVEVSTlMKKyAgICAgICAgICBsaXN0IHdpdGggY2FzZSBzZW5zaXRpdml0eSBpZiB0aGUgdW5kZXJseWluZyBmaWxlIHN5c3RlbSBoYXMKKyAgICAgICAgICBjYXNlLXNlbnNpdGl2ZSBuYW1lcyAoYXMgZG8gVU5JWCBhbmQgT1MtOSksIG90aGVyd2lzZSB3aXRoIGNhc2UKKyAgICAgICAgICBpbmRlcGVuZGVuY2UuCisKKyAgIFJFTU9WRSBURVhULVBBVFRFUk5TIFsgcGF0dGVybiBbIHBhdHRlcm4gWyBwYXR0ZXJuIC4uLiBdIF0gXQorICAgICAgICAgIFJlbW92ZXMgb25lIG9yIG1vcmUgcGF0dGVybnMgZnJvbSB0aGUgVEVYVC1QQVRURVJOIGxpc3QuCisKKyAgIFNIT1cgUEFUVEVSTlMKKyAgICAgICAgICBEaXNwbGF5cyB0aGUgY3VycmVudCBwYXR0ZXJuIHNlbGVjdGlvbnMuCisKKyAgIFdoZW5ldmVyIHlvdSBnaXZlIGEgU0VUIEZJTEUgQklOQVJZLVBBVFRFUk5TIG9yIFNFVCBGSUxFIFRFWFQtUEFUVEVSTlMKKyAgIGNvbW1hbmQsIHRoZSBwcmV2aW91cyBsaXN0IGlzIHJlcGxhY2VkLiBJZiB5b3UgZ2l2ZSBvbmUgb2YgdGhlc2UKKyAgIGNvbW1hbmRzIHdpdGhvdXQgYSBwYXR0ZXJuIGxpc3QsIHRoZSBwcmV2aW91cyBsaXN0IGlzIHJlbW92ZWQuCisKKyAgIFdoZW4gcGF0dGVybnMgYXJlIGFjdGl2ZSBhbmQgZmlsZXMgYXJlIGJlaW5nIHNlbnQsIHRleHQgcGF0dGVybnMgKGlmCisgICBhbnkpIGFyZSBhcHBsaWVkIGZpcnN0IChidXQgb25seSBpZiBub3QgUkVTRU5EaW5nIGFuZCBub3Qgc2VuZGluZyBpbgorICAgTEFCRUxFRCBtb2RlKSwgdGhlbiBiaW5hcnkgcGF0dGVybnMsIHNvIGlmIHRoZSBzYW1lIHBhdHRlcm4gYXBwZWFycyBpbgorICAgYm90aCBsaXN0cywgYmluYXJ5IG1vZGUgaXMgY2hvc2VuLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4zLjQuIEV4YW1wbGVzCisKKyAgIEhlcmUncyBhbiBleGFtcGxlIHRoYXQgbWlnaHQgYmUgdXNlZCB3aGVuIHNlbmRpbmcgZmlsZXMgZnJvbSBVTklYOgorCisgIHNldCBmaWxlIHR5cGUgYmluYXJ5CisgIHNldCBmaWxlIHRleHQtcGF0dGVybnMgKi5jICouaCAqLncgKi50eHQgbWFrZWZpbGUKKyAgc2V0IGZpbGUgYmluYXJ5LXBhdHRlcm5zICoubworICBtc2VuZCBtYWtlZmlsZSB3ZXJtaXQgd2FydCBjayouW2N3aG9dIGNrKi50eHQKKworICAgTm90ZSB0aGF0ICJ3ZXJtaXQiIGFuZCAid2FydCIgZG8gbm90IG1hdGNoIGFueSBwYXR0ZXJucyBzbyB0aGV5IGFyZQorICAgc2VudCBpbiB0aGUgcHJldmFpbGluZyBtb2RlLCB3aGljaCBpcyBiaW5hcnkuIEFsc28gbm90ZSB0aGUgdXNlIG9mCisgICAibWFrZWZpbGUiIGFzIGEgcGF0dGVybiB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW55IHdpbGRjYXJkIGNoYXJhY3RlcnMKKyAgICh0aGVyZSBpcyBubyBvdGhlciBjb252ZW50aW9uIHRvIGRpc3Rpbmd1aXNoIGFtb25nICJ3ZXJtaXQiIGFuZAorICAgIndhcnQiLCB3aGljaCBhcmUgYmluYXJ5IGV4ZWN1dGFibGVzLCBhbmQgIm1ha2VmaWxlIiwgd2hpY2ggaXMgYSB0ZXh0CisgICBmaWxlLCBwdXJlbHkgYnkgdGhlaXIgbmFtZXMpLgorCisgICBNb3N0IEMtS2VybWl0IGltcGxlbWVudGF0aW9ucyBoYXZlIGEgZGVmYXVsdCBwYXR0ZXJuIGxpc3QgYnVpbHQgaW4sCisgICB3aGljaCBpbmNsdWRlcyBwYXR0ZXJucyB0aGF0IGFyZSBhbG1vc3QgY2VydGFpbiB0byBzdWNjZWVkIGluIHBpY2tpbmcKKyAgIHRoZSByaWdodCB0cmFuc2ZlciBtb2RlLiBPdGhlcnMgYXJlIG9taXR0ZWQgZHVlIHRvIGFtYmlndWl0eS4gRm9yCisgICBleGFtcGxlICIuaGxwIiwgYW5kICIuaW5pIiBhcmUgZ2VuZXJhbGx5IGJpbmFyeSB0eXBlcyBpbiBXaW5kb3dzIGJ1dAorICAgdGV4dCB0eXBlcyBldmVyeXdoZXJlIGVsc2UuCisKKyAgICAgTk9URTogIi5kb2MiLCB1c2VkIGZvciBkZWNhZGVzIHRvIGRlbm90ZSBwbGFpbi10ZXh0IGRvY3VtZW50YXRpb24KKyAgICAgZmlsZXMsIG5vdyBtb3JlIG9mdGVuIHRoYW4gbm90IGRlbm90ZXMgYSBNaWNyb3NvZnQgV29yZCBEb2N1bWVudCwKKyAgICAgc28gIi5kb2MiIGlzIG5vdyBjb25zaWRlcmVkIGEgYmluYXJ5IHR5cGUgc2luY2UgaXQgZG9lcyBsZXNzIGhhcm0KKyAgICAgdG8gdHJhbnNmZXIgYSBwbGFpbi10ZXh0IGRvY3VtZW50IGluIGJpbmFyeSBtb2RlIHRoYW4gaXQgZG9lcyB0bworICAgICB0cmFuc2ZlciBhbiBNUyBXb3JkIGZpbGUgaW4gdGV4dCBtb2RlIChleGNlcHQgd2hlbiBJQk0gbWFpbmZyYW1lcworICAgICBhcmUgaW52b2x2ZWQhKQorCisgICAgIEFOT1RIRVIgTk9URTogIi5jb20iIGZpbGVzIGFyZSBiaW5hcnkgaW4gRE9TLWxpa2Ugb3BlcmF0aW5nCisgICAgIHN5c3RlbXMsIGJ1dCB0aGV5IGFyZSB0ZXh0IChEQ0wgY29tbWFuZCBwcm9jZWR1cmVzKSBpbiBWTVMuIFZNUworICAgICBDLUtlcm1pdCBzZW5kcyAuQ09NIGZpbGVzIGluIHRleHQgbW9kZTsgSzk1IHNlbmRzIHRoZW0gaW4gYmluYXJ5CisgICAgIG1vZGUuIElmIHlvdSBkb3dubG9hZCBhIC5DT00gZmlsZSBmcm9tIFZNUyB0byBET1Mgb3IgV2luZG93cywgYW5kCisgICAgIHRoZW4gdXBsb2FkIGl0IHRvIGFub3RoZXIgVk1TIHN5c3RlbSwgYmUgc3VyZSB0byB1c2UgU0VORCAvVEVYVCB0bworICAgICBwcmVzZXJ2ZSBpdHMgdGV4dG5lc3MuCisKKyAgIFlvdSBjYW4gc2VlIHRoZSBkZWZhdWx0IHBhdHRlcm4gbGlzdCBieSBzdGFydGluZyBDLUtlcm1pdCB3aXRob3V0IGl0cworICAgaW5pdGlhbGl6YXRpb24gZmlsZSAoZS5nLiAia2VybWl0IC1ZIikgYW5kIHVzaW5nIHRoZSBTSE9XIFBBVFRFUk5TCisgICBjb21tYW5kLiBJZiB5b3Ugd2lsbCBiZSBkZXBlbmRpbmcgb24gdGhpcyBmZWF0dXJlLCBiZSBzdXJlIHRvIGV4YW1pbmUKKyAgIHRoZSBsaXN0IGNhcmVmdWxseSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhcHBsaWNhdGlvbnMgdGhhdCB5b3UgdXNlLgorCisgICBUaGUgZGVmYXVsdCBwYXR0ZXJuIGxpc3QgZG9lcyBub3QgdGFrZSAiYmFja3VwIGZpbGVzIiBpbnRvIGFjY291bnQKKyAgIGJlY2F1c2UgKGEpIHBlb3BsZSB1c3VhbGx5IGRvbid0IHdhbnQgdG8gdHJhbnNmZXIgdGhlbTsgYW5kIChiKSBpdAorICAgd291bGQgbWFrZSB0aGUgcGF0dGVybiBsaXN0cyBtb3JlIHRoYW4gdHdpY2UgYXMgbG9uZy4gRm9yIGV4YW1wbGUsIHdlCisgICB3b3VsZCBuZWVkIHRvIGluY2x1ZGUgYm90aCAqLnR4dCBhbmQgKi50eHQuflswLTldKn4gZm9yICIudHh0IiBmaWxlcywKKyAgIGFuZCBzaW1pbGFybHkgZm9yIGFsbCB0aGUgb3RoZXJzLiBJbnN0ZWFkLCB5b3UgY2FuIHVzZSBTRU5EIC9OT0JBQ0tVUAorICAgKG9yIFNFVCBTRU5EIEJBQ0tVUCBPRkYpIHRvIHNraXAgb3ZlciBhbGwgYmFja3VwIGZpbGVzLgorCisgICBQdXQgeW91ciBtb3N0IGNvbW1vbmx5LXVzZWQgc2FmZSBwYXR0ZXJuIGRlY2xhcmF0aW9ucyBpbiB5b3VyIEMtS2VybWl0CisgICBjdXN0b21pemF0aW9uIGZpbGUgKGNrZXJtb2QuaW5pLCAubXlrZXJtcmMsIGs5NWN1c3RvbS5pbmksIGV0YykuCisKKyAgIEFzIG5vdGVkLCBTRVQgRklMRSBQQVRURVJOUyBpcyBPTiBieSBkZWZhdWx0LiBTb21ldGltZXMsIGhvd2V2ZXIsIGl0CisgICBpcyBkZXNpcmFibGUsIG9yIG5lY2Vzc2FyeSwgdG8gZm9yY2UgZmlsZXMgdG8gYmUgc2VudCBpbiBhIHBhcnRpY3VsYXIKKyAgIG1vZGUsIGFuZCBvZnRlbiB0aGlzIG11c3QgYmUgZG9uZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGUuZy4gd2hlbgorICAgdXNpbmcgS2VybWl0IGFzIGEgZG93bmxvYWQgaGVscGVyIGluIGEgV2ViIGJyb3dzZXIgbGlrZSBMeW54KS4gVGhlIC1WCisgICBjb21tYW5kLWxpbmUgb3B0aW9ucyBpcyBlcXVpdmFsZW50IHRvIFNFVCBGSUxFIFBBVFRFUk5TIE9GRiBhbmQgU0VUCisgICBUUkFOU0ZFUiBNT0RFIE1BTlVBTC4gRXhhbXBsZToKKworICBrZXJtaXQgLVZpcyBvb2ZhLnR4dAorCisgICBmb3JjZXMgb29mYS50eHQgdG8gYmUgc2VudCBpbiBiaW5hcnkgbW9kZSwgZXZlbiB0aG91Z2ggIi50eHQiIG1pZ2h0CisgICBtYXRjaCBhIHRleHQgcGF0dGVybi4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LjQuIEZpbGUgUGVybWlzc2lvbnMKKworICAgIlBlcm1pc3Npb25zIiByZWZlcnMgdG8gYSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUgdGhhdCBzcGVjaWZpZXMKKyAgIHdobyBpcyBhbGxvd2VkIHRvIGFjY2VzcyBpdCwgYW5kIGluIHdoYXQgbWFubmVyLiBGb3IgZXhhbXBsZSwgdGhlCisgICBvd25lciwgdGhlIG1lbWJlcnMgb2Ygb25lIG9yIG1vcmUgZ3JvdXBzLCB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3IsCisgICBhbmQgZXZlcnlib2R5IGVsc2UsIG1pZ2h0IGJlIGFsbG93ZWQgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgUmVhZCwKKyAgIFdyaXRlLCBBcHBlbmQsIEV4ZWN1dGUsIG9yIExpc3RpbmcgYWNjZXNzLgorCisgICBUaGUgcGVybWlzc2lvbiBjb2RlIGdvZXMgYnkgZGlmZmVyZW50IG5hbWVzIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMuIEluCisgICBVTklYLCBpdCBtaWdodCBiZSBjYWxsZWQgdGhlIGZpbGVtb2RlLiBJbiBWTVMsIGl0IGlzIGNhbGxlZCB0aGUgZmlsZQorICAgcHJvdGVjdGlvbiAob3IgcHJvdGVjdGlvbiBtYXNrKS4KKworICAgVGhlIGNvbW1lbnRzIGluIHRoaXMgc2VjdGlvbiBwcmVzZW50bHkgYXBwbHkgb25seSB0byB0aGUgVU5JWCBhbmQgVk1TCisgICB2ZXJzaW9ucyBvZiBDLUtlcm1pdCwgdG8gd2hpY2ggdGhlc2UgZmVhdHVyZXMgd2VyZSBhZGRlZCBpbiB2ZXJzaW9uCisgICA3LjA7IHRoZSBET1MsIFdpbmRvd3MsIGFuZCBPUy8yIGZpbGUgc3lzdGVtcyBlbWJvZHkgbm8gbm90aW9ucyBvZgorICAgcHJvdGVjdGlvbiwgYW5kIHNvIE1TLURPUyBLZXJtaXQgYW5kIEtlcm1pdCA5NSBkbyBub3Qgc2VuZCBmaWxlCisgICBwZXJtaXNzaW9ucywgYW5kIGlnbm9yZSB0aGVtIHdoZW4gcmVjZWl2ZWQuCisKKyAgIFRoZSBwZXJtaXNzaW9ucyBmb3IgYSByZWNlaXZlZCBmaWxlIGFyZSBkZXRlcm1pbmVkIGJ5IGEgY29tYmluYXRpb24gb2YKKyAgIHRoZSBmaWxlIHRyYW5zZmVyIG1vZGUgKFZNUy10by1WTVMgdHJhbnNmZXJzIG9ubHkpLCB3aGV0aGVyIGEgZmlsZSBvZgorICAgdGhlIHNhbWUgbmFtZSBleGlzdHMgYWxyZWFkeSwgd2hldGhlciBwZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSBhcmUKKyAgIHJlY2VpdmVkIGluIHRoZSBmaWxlIGF0dHJpYnV0ZSBwYWNrZXQsIGFuZCB0aGUgc2V0dGluZyBvZiBBVFRSSUJVVEVTCisgICBQUk9URUNUSU9OLgorCisgICBUaGUgZGVmYXVsdCBmb3IgQVRUUklCVVRFUyBQUk9URUNUSU9OIGlzIE9OLiBJZiBubyBhdHRyaWJ1dGVzIGFyZQorICAgcmVjZWl2ZWQsIHRoZSBlZmZlY3QgaXMgdGhlIHNhbWUgYXMgaWYgYXR0cmlidXRlcyBQUk9URUNUSU9OIHdlcmUgT0ZGLgorCisgICBGb3IgVk1TLXRvLVZNUyB0cmFuc2ZlcnMsIHRoZSBkZWZhdWx0IExBQkVMRUQgbW9kZSBzaW1wbHkgY29waWVzIHRoZQorICAgcHJvdGVjdGlvbiBjb2RlIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC40LjEuIFdoZW4gQVRUUklCVVRFUyBQUk9URUNUSU9OIGlzIE9GRgorCisgICBJZiBubyBmaWxlIG9mIHRoZSBzYW1lIG5hbWUgZXhpc3RzLCBzeXN0ZW0gZGVmYXVsdHMgZGV0ZXJtaW5lIHRoZQorICAgcGVybWlzc2lvbnMgb2YgdGhlIG5ldyBmaWxlLiBPdGhlcndpc2UsIHRoZSBhY3Rpb25zIHRha2VuIGRlcGVuZCBvbgorICAgdGhlIGN1cnJlbnQgRklMRSBDT0xMSVNJT04gc2V0dGluZzogQkFDS1VQLCBPVkVSV1JJVEUsIFJFTkFNRSwgZXRjLCBhcworICAgZG9jdW1lbnRlZCBpbiBbNDYzXVVzaW5nIEMtS2VybWl0LiBCdXQgbm93IHRoZSBuZXcgZmlsZSAoaWYgaXQgaXMKKyAgIGNyZWF0ZWQgYXQgYWxsKSBhdXRvbWF0aWNhbGx5IGluaGVyaXRzIHRoZSBwZXJtaXNzaW9ucyAobW9kZSBiaXRzKSBvZgorICAgdGhlIGV4aXN0aW5nIGZpbGUgaW4gYSB3YXkgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHBsYXRmb3JtLgorCisgICAgNC40LjEuMS4gVW5peAorCisgICBBbGwgbW9kZSBiaXRzIGFyZSBpbmhlcml0ZWQgZXhjZXB0IHRoZSBkaXJlY3RvcnkgYml0LCBzaW5jZSB0aGUKKyAgIGluY29taW5nIGZpbGUgY2FuIG5vdCBwb3NzaWJseSBiZSBhIGRpcmVjdG9yeS4gKEluIGFueSBjYXNlLCBpdCBpcyBub3QKKyAgIHBvc3NpYmxlIHRvIHJlY2VpdmUgYSBmaWxlIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYW4gZXhpc3RpbmcKKyAgIGRpcmVjdG9yeSB1bmxlc3MgRklMRSBDT0xMSVNJT04gaXMgc2V0IHRvIFJFTkFNRSkuCisKKyAgICA0LjQuMS4yLiBWTVMKKworICAgRmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGFuIGV4aXN0aW5nIGZpbGUsIHRyYW5zZmVycmVkIGluIG1vZGVzCisgICBvdGhlciB0aGFuIExBQkVMRUQgYmV0d2VlbiBWTVMgc3lzdGVtcywgaW5oZXJpdCB0aGUgcHJvdGVjdGlvbiBvZiB0aGUKKyAgIHByaW9yIHZlcnNpb24uCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjQuMiBXaGVuIEFUVFJJQlVURVMgUFJPVEVDVElPTiBpcyBPTgorCisgICBGaWxlIHBlcm1pc3Npb25zIGNhbiBiZSBjb252ZXllZCBhcyBwYXJ0IG9mIHRoZSBmaWxlIHRyYW5zZmVyIHByb2Nlc3MsCisgICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIEtlcm1pdCBwcm90b2NvbCBkZWZpbml0aW9uLiBJZiB0aGUgZmlsZSBzZW5kZXIKKyAgIHB1dHMgc3lzdGVtLWRlcGVuZGVudCBhbmQvb3Igc3lzdGVtLWluZGVwZW5kZW50IHZlcnNpb25zIG9mIHRoZSBmaWxlCisgICBwcm90ZWN0aW9uIChwZXJtaXNzaW9ucykgaW50byB0aGUgQXR0cmlidXRlIChBKSBwYWNrZXQsIHRoZSBmaWxlCisgICByZWNlaXZlciBjYW4gc2V0IHRoZSBuZXcgZmlsZSdzIHBlcm1pc3Npb25zIGZyb20gdGhlbS4gT3RoZXJ3aXNlLCB0aGUKKyAgIHBlcm1pc3Npb25zIGFyZSBzZXQgdGhlIHNhbWUgYXMgZm9yIEFUVFJJQlVURVMgUFJPVEVDVElPTiBPRkYuCisKKyAgIFdoZW4gdGhlIGluY29taW5nIEEgcGFja2V0IGNvbnRhaW5zIHN5c3RlbS1kZXBlbmRlbnQgcGVybWlzc2lvbnMsIHRoZQorICAgZmlsZSByZWNlaXZlciBjaGVja3MgdG8gc2VlIGlmIHRoZSBzZW5kZXIgaGFzIHRoZSBzYW1lIHN5c3RlbSBJRCAoZS5nLgorICAgYm90aCB0aGUgc2VuZGluZyBhbmQgcmVjZWl2aW5nIHN5c3RlbXMgYXJlIFVOSVgsIG9yIGJvdGggYXJlIFZNUyk7IGlmCisgICBzbywgaXQgZGVjb2RlcyBhbmQgdXNlcyB0aGUgc3lzdGVtLWRlcGVuZGVudCBwZXJtaXNzaW9uczsgb3RoZXJ3aXNlIGl0CisgICB1c2VzIHRoZSBnZW5lcmljIG9uZXMgKGlmIGFueSkgYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgb3duZXIgZmllbGQsCisgICBzZXR0aW5nIHRoZSBvdGhlciBmaWVsZHMgYXBwcm9wcmlhdGVseSBhcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZworICAgc2VjdGlvbnMuCisKKyAgIFNldHRpbmcgdGhlIGluY29taW5nIGZpbGUncyBwcm90ZWN0aW9uIGZyb20gdGhlIEEgcGFja2V0IGlzIGNvbnRyb2xsZWQKKyAgIGJ5IFNFVCBBVFRSSUJVVEVTIFBST1RFQ1RJT04gKG9yIFBFUk1JU1NJT04pLCB3aGljaCBpcyBPTiBieSBkZWZhdWx0LAorICAgYW5kIGl0cyBzdGF0dXMgaXMgZGlzcGxheWVkIGJ5IFNIT1cgQVRUUklCVVRFUy4KKworICAgVGhlIG1haW4gYmVuZWZpdCBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gbm90IGhhdmUgdG8gImNobW9kICt4IiBhbgorICAgZXhlY3V0YWJsZSBmaWxlIGFmdGVyIHRyYW5zZmVyIGZyb20gVU5JWCB0byBVTklYLiBJdHMgY3Jvc3MtcGxhdGZvcm0KKyAgIGJlbmVmaXRzIGFyZSBsZXNzIGV2aWRlbnQsIHBlcmhhcHMgdG8gcmV0YWluIHRoZSBzdGF0dXMgb2YgdGhlIFVuaXgKKyAgICd4JyBiaXQgb24gYSBWTVMgc3lzdGVtLCBmb3Igc3Vic2VxdWVudCB0cmFuc2ZlciBiYWNrIHRvIGEgVW5peAorICAgc3lzdGVtLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC40LjIuMS4gU3lzdGVtLVNwZWNpZmljIFBlcm1pc3Npb25zCisKKyAgIFN5c3RlbS1zcGVjaWZpYyBmaWxlIHBlcm1pc3Npb25zIGFyZSB1c2VkIHdoZW4gdGhlIHR3byBLZXJtaXQgcHJvZ3JhbXMKKyAgIHJlY29nbml6ZSBlYWNoIG90aGVyIGFzIHJ1bm5pbmcgb24gdGhlIHNhbWUgdHlwZSBvZiBzeXN0ZW0uIEZvcgorICAgZXhhbXBsZSwgYm90aCBhcmUgcnVubmluZyB1bmRlciBzb21lIGZvcm0gb2YgVU5JWCAoaXQgZG9lc24ndCBtYXR0ZXIKKyAgIHdoaWNoIFVOSVggdmFyaWF0aW9uIC0tIEhQLVVYLCBTb2xhcmlzLCBBSVgsIGV0YyAtLSBhbGwgdXNlIHRoZSBzYW1lCisgICBzY2hlbWUgZm9yIGZpbGUgcGVybWlzc2lvbnMpOyBvciBib3RoIGFyZSBydW5uaW5nIHVuZGVyIFZNUyAoZXZlbiBpZgorICAgb25lIGlzIG9uIGFuIEFscGhhIGFuZCB0aGUgb3RoZXIgb24gYSBWQVgsIGFuZC9vciBvbmUgaXMgb2xkIGFuZCB0aGUKKyAgIG90aGVyIGlzIG5ldykuCisKKyAgICA0LjQuMi4xLjEuIFVOSVgKKworICAgVU5JWCBzdXBwb3J0cyB0aHJlZSBjYXRlZ29yaWVzIG9mIHVzZXJzLCBGaWxlIE93bmVyLCBHcm91cCwgYW5kIFdvcmxkLAorICAgYW5kIHRocmVlIHR5cGVzIG9mIGZpbGUgYWNjZXNzIHBlcm1pc3Npb246IFJlYWQsIFdyaXRlLCBhbmQgRXhlY3V0ZS4KKyAgIFRodXMsIGEgVU5JWCBmaWxlJ3MgcGVybWlzc2lvbnMgYXJlIGV4cHJlc3NlZCBpbiA5IGJpdHMuCisKKyAgIFRoZSBzeXN0ZW0tZGVwZW5kZW50IHBlcm1pc3Npb24gc3RyaW5nIGZvciBVTklYIGlzIGEgMy1kaWdpdCBvY3RhbAorICAgc3RyaW5nLCB0aGUgbG93LW9yZGVyIDkgYml0cyBvZiB0aGUgc3RfbW9kZSBtZW1iZXIgb2YgdGhlIHN0YXQgc3RydWN0OworICAgd2UgZGVsaWJlcmF0ZWx5IGNob3Agb2ZmIHRoZSAiZmlsZSBmb3JtYXQiIGJpdHMgYmVjYXVzZSB0aGV5IGFyZSBub3QKKyAgIHBlcm1pc3Npb25zLCBub3IgZG8gd2UgY29udmV5IHRoZSBzZXR1aWQvc2V0Z2lkIGJpdHMsIGxvY2sgYml0LCBzdGlja3kKKyAgIGJpdCwgZXRjLgorCisgICAgNC40LjIuMS4yLiBWTVMKKworICAgVk1TIHN1cHBvcnRzIGZvdXIgY2F0ZWdvcmllcyBvZiB1c2VycywgU3lzdGVtLCBGaWxlIE93bmVyLCBHcm91cCwgYW5kCisgICBXb3JsZCwgYW5kIGZvdXIgdHlwZXMgb2YgZmlsZSBhY2Nlc3MgcGVybWlzc2lvbjogUmVhZCwgV3JpdGUsIEV4ZWN1dGUsCisgICBhbmQgRGVsZXRlLiBUaHVzLCBhIFZNUyBmaWxlJ3MgcGVybWlzc2lvbnMgYXJlIGV4cHJlc3NlZCBpbiAxNiBiaXRzLgorCisgICBUaGUgc3lzdGVtLWRlcGVuZGVudCBwcm90ZWN0aW9uIHN0cmluZyBmb3IgVk1TIGlzIGEgNC1kaWdpdAorICAgaGV4YWRlY2ltYWwgc3RyaW5nLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnRlcm5hbC1mb3JtYXQgcHJvdGVjdGlvbgorICAgd29yZCBvZiB0aGUgZmlsZSAoUldFRCBmb3IgZWFjaCBvZiBXb3JsZCxHcm91cCxPd25lcixTeXN0ZW0pLiBBIG5ldworICAgZmlsZSBub3JtYWxseSBnZXRzIGFsbCAxNiBwcm90ZWN0aW9uIGJpdHMgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSBvZgorICAgdGhlIHNhbWUgbmFtZS4KKworICAgTm90ZTogVk1TLXRvLVZNUyB0cmFuc2ZlcnMgdGFrZSBwbGFjZSBpbiBMQUJFTEVEIG1vZGUgd2hlbiB0aGUgdHdvCisgICBDLUtlcm1pdHMgcmVjb2duaXplIGVhY2ggb3RoZXIncyBwbGF0Zm9ybSBhcyBWTVMgKHVubGVzcyB5b3UgaGF2ZQorICAgZGlzYWJsZWQgTEFCRUxFRC1tb2RlIHRyYW5zZmVycykuIEluIHRoaXMgY2FzZSwgYWxsIG9mIGEgZmlsZSdzCisgICBhdHRyaWJ1dGVzIGFyZSBwcmVzZXJ2ZWQgaW4gdGhlIHRyYW5zZmVyIGFuZCB0aGUgcHJvdGVjdGlvbiBtYXNrIChhbmQKKyAgIG90aGVyIGluZm9ybWF0aW9uKSBpcyB0YWtlbiBmcm9tIHRoZSBmaWxlJ3MgaW50ZXJuYWwgaW5mb3JtYXRpb24sIGFuZAorICAgdGhpcyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYW55IGluZm9ybWF0aW9uIGluIHRoZSBBdHRyaWJ1dGUgcGFja2V0cy4KKyAgIFlvdSBjYW4gZGVmZWF0IHRoZSBhdXRvbWF0aWMgc3dpdGNoaW5nIGludG8gTEFCRUxFRCBtb2RlIChpZiB5b3Ugd2FudAorICAgdG8pIHdpdGggU0VUIFRSQU5TRkVSIE1PREUgTUFOVUFMLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC40LjIuMi4gU3lzdGVtLUluZGVwZW5kZW50IFBlcm1pc3Npb25zCisKKyAgIFRoZSBzeXN0ZW0taW5kZXBlbmRlbnQgKCJnZW5lcmljIikgcHJvdGVjdGlvbiBpcyB1c2VkIHdoZW4gdGhlIHN5c3RlbQorICAgSURzIG9mIHRoZSB0d28gS2VybWl0IHByb2dyYW1zIGRvIG5vdCBhZ3JlZSAoZS5nLiBvbmUgaXMgVU5JWCwgdGhlCisgICBvdGhlciBpcyBWTVMpLiBUaGUgZ2VuZXJpYyBwcm90ZWN0aW9uIGF0dHJpYnV0ZSBpbmNsdWRlcyB0aGUgZm9sbG93aW5nCisgICBwZXJtaXNzaW9ucyAobm90IGFsbCBhcmUgYXBwbGljYWJsZSB0byBldmVyeSBmaWxlIHN5c3RlbSk6IFJlYWQsCisgICBXcml0ZSwgQXBwZW5kLCBFeGVjdXRlLCBEZWxldGUsIFNlYXJjaC4gVGhlIGdlbmVyaWMgcGVybWlzc2lvbnMgYXJlCisgICBkZXJpdmVkIGZyb20gdGhlIG93bmVyIHBlcm1pc3Npb25zIG9mIHRoZSBzb3VyY2UgZmlsZSwgdGh1cywgYSBVbml4CisgICAndycgcGVybWlzc2lvbiBiZWNvbWVzIFZNUyBXcml0ZSxEZWxldGUuCisKKyAgIFRoZSBPd25lciBmaWVsZCBvZiB0aGUgbmV3IGZpbGUncyBwZXJtaXNzaW9ucyBpcyBzZXQgZnJvbSB0aGUgaW5jb21pbmcKKyAgIGdlbmVyaWMgcHJvdGVjdGlvbiBhdHRyaWJ1dGUuCisKKyAgIEluIFVOSVgsIHRoZSBHcm91cCBhbmQgV29ybGQgcGVybWlzc2lvbnMgYXJlIHNldCBhY2NvcmRpbmcgdG8geW91cgorICAgdW1hc2ssIGV4Y2VwdCB0aGF0IGV4ZWN1dGUgcGVybWlzc2lvbiBpcyBOT1Qgc2V0IGluIHRoZXNlIGZpZWxkcyBpZiBpdAorICAgd2FzIG5vdCBhbHNvIHNldCBpbiB0aGUgZ2VuZXJpYyBwcm90ZWN0aW9uIChhbmQgY29uc2VxdWVudGx5LCBpcyBzZXQKKyAgIGluIHRoZSBPd25lciBmaWVsZCkuCisKKyAgIEluIFZNUywgdGhlIFN5c3RlbSwgR3JvdXAsIGFuZCBXb3JsZCBwZXJtaXNzaW9ucyBhcmUgc2V0IGFjY29yZGluZyB0bworICAgdGhlIHByb2Nlc3MgZGVmYXVsdCBmaWxlIHBlcm1pc3Npb24gKGFzIHNob3duIGluIFZNUyBieSBTSE9XCisgICBQUk9URUNUSU9OKSwgZXhjZXB0IHRoYXQgbm8gcGVybWlzc2lvbnMgYXJlIGFsbG93ZWQgaW4gdGhlc2UgZmllbGRzCisgICB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGdlbmVyaWMgcGVybWlzc2lvbnMuCisKKyAgIE5vdGUgdGhhdCB0aGUgVk1TIGFuZCBVTklYIGludGVycHJldGF0aW9ucyBvZiBFeGVjdXRlIHBlcm1pc3Npb24gYXJlCisgICBub3QgaWRlbnRpY2FsLiBJbiBVTklYLCBhIGZpbGUgKGJpbmFyeSBleGVjdXRhYmxlLCBzaGVsbCBzY3JpcHQsIGV0YykKKyAgIG1heSBub3QgYmUgZXhlY3V0ZWQgdW5sZXNzIGl0IGhhcyBFeGVjdXRlIHBlcm1pc3Npb24sIGFuZCBub3JtYWxseQorICAgZmlsZXMgdGhhdCBhcmUgbm90IGludGVuZGVkIGZvciBleGVjdXRpb24gZG8gbm90IGhhdmUgRXhlY3V0ZQorICAgcGVybWlzc2lvbi4gSW4gVk1TLCBSZWFkIHBlcm1pc3Npb24gaW1wbGljaXRseSBzdXBwbGllcyBFeGVjdXRlCisgICBjYXBhYmlsaXR5LiBHZW5lcmFsbHkgZmlsZXMgdGhhdCBoYXZlIFJlYWQgcGVybWlzc2lvbiBhbHNvIGhhdmUKKyAgIGV4cGxpY2l0IEV4ZWN1dGUgcGVybWlzc2lvbiwgYnV0IGZpbGVzIChiaW5hcnkgZXhlY3V0YWJsZXMsIERDTAorICAgY29tbWFuZCBwcm9jZWR1cmVzKSB0aGF0IGhhdmUgUmVhZCBwZXJtaXNzaW9uIGFuZCBub3QgRXhlY3V0ZQorICAgcGVybWlzc2lvbiBjYW4gc3RpbGwgYmUgZXhlY3V0ZWQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC41LiBGaWxlIE1hbmFnZW1lbnQgQ29tbWFuZHMKKworICAgIDQuNS4xLiBUaGUgRElSRUNUT1JZIENvbW1hbmQKKworICAgUHJpb3IgdG8gQy1LZXJtaXQgNy4wLCB0aGUgRElSRUNUT1JZIGNvbW1hbmQgYWx3YXlzIHJhbiBhbiBleHRlcm5hbAorICAgc3lzdGVtIGNvbW1hbmQgKHN1Y2ggYXMgImxzIiBvbiBVTklYKSBvciBwcm9ncmFtIHRvIHByb2R1Y3QgdGhlCisgICBkaXJlY3RvcnkgbGlzdGluZy4gVGhpcyBoYWQgY2VydGFpbiBhZHZhbnRhZ2VzLCBtb3N0bHkgdGhhdCB5b3UgY291bGQKKyAgIGluY2x1ZGUgc3lzdGVtLWRlcGVuZGVudCBvcHRpb25zIGZvciBjdXN0b21pemVkIGxpc3RpbmdzLCBlLmcuIG9uCisgICBVTklYOgorCisgIGRpciAtbHQgYyogfCBtb3JlCisKKyAgIG9yIGluIFZNUzoKKworICBkaXJlY3RvcnkgL3NpemUvZGF0ZS9wcm90ZWN0aW9uL2V4Y2VwdD0qLm9iaiBvb2ZhLio7MAorCisgICBUaGlzIGFwcHJvYWNoLCBob3dldmVyLCBjYXJyaWVzIHNvbWUgZGlzYWR2YW50YWdlczogQy1LZXJtaXQgY2FuJ3QKKyAgIHJldHVybiBTVUNDRVNTIG9yIEZBSUxVUkUgc3RhdHVzIGZvciAoZS5nLikgImRpciBmb28iIGFjY29yZGluZyB0bworICAgd2hldGhlciB0aGUgZmlsZSAiZm9vIiBleGlzdHM7IGFuZCBpdCBydW5zIGFuIGluZmVyaW9yIHByb2Nlc3MsIHdoaWNoCisgICBtaWdodCBiZSBhIHByb2JsZW0gaW4gc29tZSBlbnZpcm9ubWVudHMgZm9yIHJlc291cmNlIGFuZC9vciBzZWN1cml0eQorICAgcmVhc29ucywgYW5kIHdvbid0IHdvcmsgYXQgYWxsIGluIGEgIm5vcHVzaCIgZW52aXJvbm1lbnQgKGUuZy4gb25lIGluCisgICB3aGljaCBDLUtlcm1pdCBpcyBjb25maWd1cmVkIHRvIGZvcmJpZCBhY2Nlc3MgdG8gZXh0ZXJpb3IgY29tbWFuZHMgYW5kCisgICBwcm9ncmFtcywgZS5nLiBpbiBhIFZNUyAiY2FwdGl2ZSBhY2NvdW50IikuCisKKyAgIEluIEMtS2VybWl0IDcuMCBvbiBWTVMgYW5kIFVOSVgsIGFuZCBpbiBLOTUgMS4xLjE5IGFuZCBsYXRlciwgdGhlCisgICBESVJFQ1RPUlkgY29tbWFuZCBpcyBpbnRlcm5hbCB0byBLZXJtaXQuIEl0IGNhbiBiZSBydW4gaW4gYSAibm9wdXNoIgorICAgZW52aXJvbm1lbnQgYW5kIHJldHVybnMgU1VDQ0VTUyBvciBGQUlMVVJFIHN0YXR1cyBhcHByb3ByaWF0ZWx5LiBJbgorICAgVU5JWCBpdCBwcmludHMgYWxsIGRhdGVzIGFuZCB0aW1lcyBpbiBhIGNvbnNpc3RlbnQgd2F5ICh1bmxpa2UgbHMpLiBJbgorICAgVk1TIGl0IHByaW50cyBwcmVjaXNlIGZpbGUgc2l6ZXMsIHJhdGhlciB0aGFuICJibG9ja3MiLiBJdCBvZmZlcnMKKyAgIHNldmVyYWwgZm9ybWF0dGluZyBhbmQgb3RoZXIgb3B0aW9ucywgYnV0IGl0IGlzIG5vdCBuZWNlc3NhcmlseSBtb3JlCisgICBmbGV4aWJsZSB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGV4dGVybmFsIGNvbW1hbmRzIG9yIHByb2dyYW1zICh0aGUKKyAgIFVOSVggImxzIiBwcm9ncmFtLCB0aGUgVk1TICJkaXJlY3RvcnkiIGNvbW1hbmQpLiBUaGUgc3ludGF4IGlzOgorCisgICBESVJFQ1RPUlkgWyBzd2l0Y2ggWyBzd2l0Y2ggWyAuLi4gXSBdIF0gWyBmaWxlc3BlYyBdCisKKyAgIElmIG5vIGZpbGVzcGVjIGlzIGdpdmVuLCBhbGwgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFyZQorICAgbGlzdGVkLgorCisgICBPcHRpb25hbCBzd2l0Y2hlcyBpbmNsdWRlIGFsbCB0aGUgc3RhbmRhcmQgZmlsZS1zZWxlY3Rpb24gc3dpdGNoZXMKKyAgIHByZXNlbnRlZCBpbiBbNDY0XVNlY3Rpb24gMS41LjQsIHBsdXM6CisKKyAgIC9BTEwKKyAgICAgICAgICBTaG93IGJvdGggcmVndWxhciBmaWxlcyBhbmQgZGlyZWN0b3JpZXM7IHRoaXMgaXMgdGhlIGRlZmF1bHQuCisKKyAgIC9BUlJBWTp4CisgICAgICAgICAgSW5zdGVhZCBvZiBkaXNwbGF5aW5nIGEgZGlyZWN0b3J5IGxpc3RpbmcsIHB1dCB0aGUgZmlsZXMgdGhhdAorICAgICAgICAgIHdvdWxkIGhhdmUgYmVlbiBzaG93biAoYmFzZWQgb24gdGhlIGZpbGVzcGVjIGFuZCBvdGhlcgorICAgICAgICAgIHNlbGVjdGlvbiBzd2l0Y2hlcykgaW4gdGhlIGdpdmVuIGFycmF5LiBUaGUgYXJyYXkgbmVlZCBub3QgKGFuZAorICAgICAgICAgIHNob3VsZCBub3QpIGJlIHByZWRlY2xhcmVkOyBpZiB0aGUgYXJyYXkgYWxyZWFkeSBleGlzdHMsIGl0IGlzCisgICAgICAgICAgZGVzdHJveWVkIGFuZCByZXVzZWQuIFRoZSBhcnJheSBuYW1lIGNhbiBiZSBhIHNpbmdsZSBsZXR0ZXIsCisgICAgICAgICAgbGlrZSAiYSIsIG9yIGFueSBmdWxsZXIgZm9ybSwgc3VjaCBhcyAiJmEiLCAiXCZhIiwgIlwmYVtdIiwKKyAgICAgICAgICBldGMuIElmIHRoZSAvQVJSQVkgc3dpdGNoIGlzIGluY2x1ZGVkLCB0aGUgZm9sbG93aW5nIG90aGVyCisgICAgICAgICAgc3dpdGNoZXMgYXJlIGlnbm9yZWQ6IC9CUklFRiwgL1ZFUkJPU0UsIC9IRUFESU5HLCAvUEFHRSwKKyAgICAgICAgICAvRU5HTElTSERBVEUsIC9JU09EQVRFLCAvWEZFUk1PREUsIC9NRVNTQUdFLCAvU09SVCwgL1JFVkVSU0UsCisgICAgICAgICAgL0FTQ0VORElORy4gSW4gb3RoZXIgd29yZHMsIG9ubHkgZmlsZSBzZWxlY3Rpb24gc3dpdGNoZXMgYXJlCisgICAgICAgICAgbWVhbmluZ2Z1bCB3aXRoIC9BUlJBWTogL0ZJTEVTLCAvRElSRUNUT1JJRVMsIC9BTEwsIC9ET1RGSUxFUywKKyAgICAgICAgICAvTk9CQUNLVVAsIC9SRUNVUlNJVkUsIC9TTUFMTEVSLCAvTEFSR0VSLCAvQUZURVIsIC9CRUZPUkUsCisgICAgICAgICAgL0VYQ0VQVCwgZXRjLiBUaGUgcmVzdWx0aW5nIGFycmF5IGhhcyB0aGUgbnVtYmVyIG9mIGZpbGVzIChuKQorICAgICAgICAgIGFzIGl0cyAwdGggZWxlbWVudCwgYW5kIHRoZSBmaWxlbmFtZXMgaW4gZWxlbWVudHMgMSB0aHJvdWdoIG4KKyAgICAgICAgICBFeGFtcGxlOgorCisgIGRpciAvYXJyYXk6JmEgL2ZpbGVzIC9ub2JhY2t1cCAvYWZ0ZXI6MTk5OTAxMDEgL2xhcmdlcjoxMDAwMCBbYWJdKgorICBzaG93IGFycmF5ICZhCisKKyAgIC9GSUxFUworICAgICAgICAgIE9ubHkgc2hvdyByZWd1bGFyIGZpbGVzLgorCisgICAvRElSRUNUT1JJRVMKKyAgICAgICAgICBPbmx5IHNob3cgZGlyZWN0b3JpZXMuCisKKyAgIC9CQUNLVVAKKyAgICAgICAgICBJbiBVTklYLCBPUy05LCBLLTk1LCBhbmQgb3RoZXIgdmVyc2lvbnMgdGhhdCBzdXBwb3J0IFNFVCBGSUxFCisgICAgICAgICAgQ09MTElTSU9OIEJBQ0tVUCBhbmQgY3JlYXRlIGJhY2t1cCBmaWxlcyBieSBhcHBlbmRpbmcgLn5ufiB0bworICAgICAgICAgIHRoZSBmaWxlbmFtZSAod2hlcmUgIm4iIGlzIGEgbnVtYmVyKSwgL0JBQ0tVUCBtZWFucyB0byBpbmNsdWRlCisgICAgICAgICAgdGhlc2UgZmlsZXMgaW4gZGlyZWN0b3J5IGxpc3RpbmdzLiBUaGlzIGlzIHRoZSBkZWZhdWx0LgorCisgICAvTk9CQUNLVVAKKyAgICAgICAgICBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiAvQkFDS1VQOiB0aGF0IGlzLCBkbyBub3QgaW5jbHVkZSBiYWNrdXAKKyAgICAgICAgICBmaWxlcyBpbiB0aGUgbGlzdGluZy4KKworICAgL0JSSUVGCisgICAgICAgICAgTGlzdCBmaWxlbmFtZXMgb25seTsgdXNlIGEgY29tcGFjdCBmb3JtYXQsIGFzIG1hbnkgZmlsZW5hbWVzIGFzCisgICAgICAgICAgd2lsbCBmaXQgYWNyb3NzIHRoZSBzY3JlZW4gKGJhc2VkIG9uIHRoZSBsb25nZXN0IG5hbWUpLiBBIGJyaWVmCisgICAgICAgICAgbGlzdGluZyBpcyBhbHdheXMgc29ydGVkIGFscGhhYmV0aWNhbGx5LgorCisgICAvVkVSQk9TRQorICAgICAgICAgIExpc3Qgb25lIGZpbGUgcGVyIGxpbmUsIGFuZCBpbmNsdWRlIGRhdGUsIHNpemUsIGFuZCAoaW4gVU5JWAorICAgICAgICAgIG9ubHkpIHBlcm1pc3Npb25zIG9mIGVhY2ggZmlsZS4gVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgL0JSSUVGLAorICAgICAgICAgIGFuZCBpcyB0aGUgZGVmYXVsdC4KKworICAgL1BBR0UKKyAgICAgICAgICBQYXVzZSBhdCB0aGUgZW5kIG9mIGVhY2ggc2NyZWVuZnVsIGFuZCBnaXZlIGEgIm1vcmU/IiBwcm9tcHQsCisgICAgICAgICAgZXZlbiBpZiBTRVQgQ09NTUFORCBNT1JFLVBST01QVElORyBpcyBPRkYuCisKKyAgIC9OT1BBR0UKKyAgICAgICAgICBEb24ndCBwYXVzZSBhdCB0aGUgZW5kIG9mIGVhY2ggc2NyZWVuZnVsIGFuZCBnaXZlIGEgIm1vcmU/IgorICAgICAgICAgIHByb21wdCwgZXZlbiBpZiBTRVQgQ09NTUFORCBNT1JFLVBST01QVElORyBpcyBPTi4gSWYgbmVpdGhlcgorICAgICAgICAgIC9QQUdFIG9yIC9OT1BBR0UgaXMgZ2l2ZW4sIHBhZ2luZyBpcyBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgICAgcHJldmFpbGluZyBDT01NQU5EIE1PUkUtUFJPTVBUSU5HIHNldHRpbmcgKHdoaWNoIGNhbiBiZQorICAgICAgICAgIGRpc3BsYXllZCB3aXRoIFNIT1cgQ09NTUFORCkuCisKKyAgIC9FTkdMSVNIREFURQorICAgICAgICAgIFNob3cgZGF0ZXMgaW4gZGQtbW1tLXl5eXkgZm9ybWF0OyBtbW0gaXMgdGhlIGZpcnN0IHRocmVlCisgICAgICAgICAgbGV0dGVycyBvZiB0aGUgRW5nbGlzaCBtb250aCBuYW1lLgorCisgICAvSVNPREFURQorICAgICAgICAgIFNob3cgZGF0ZXMgaW4geXl5eS1tbS1kZCBmb3JtYXQ7IG1tIGlzIHRoZSBtb250aCBudW1iZXIsIDEtMTIuCisgICAgICAgICAgVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgL0VOR0xJU0hEQVRFLCBhbmQgaXMgdGhlIGRlZmF1bHQuCisKKyAgIC9IRUFESU5HUworICAgICAgICAgIFByaW50IGEgaGVhZGluZyBiZWZvcmUgdGhlIGxpc3RpbmcgYW5kIGEgc3VtbWFyeSBhdCB0aGUgZW5kLgorCisgICAvTk9IRUFESU5HUworICAgICAgICAgIERvbid0IHByaW50IGEgaGVhZGluZyBiZWZvcmUgdGhlIGxpc3Rpbmcgb3IgYSBzdW1tYXJ5IGF0IHRoZQorICAgICAgICAgIGVuZC4gVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgL0hFQURJTkdTLCBhbmQgaXMgdGhlIGRlZmF1bHQuCisKKyAgIC9YRkVSTU9ERQorICAgICAgICAgIE9ubHkgaW4gS2VybWl0IHByb2dyYW1zIHRoYXQgc3VwcG9ydCBTRVQgRklMRSBQQVRURVJOUy4gSWYgdGhpcworICAgICAgICAgIHN3aXRjaCBpcyBpbmNsdWRlZCwgYW5kIHRoZSBmaWxlbmFtZSBtYXRjaGVzIGFueSBGSUxFCisgICAgICAgICAgQklOQVJZLVBBVFRFUk4gKFs0NjVdU2VjdGlvbiA0LjMpLCAiKEIpIiBpcyBwcmludGVkIGFmdGVyIHRoZQorICAgICAgICAgIGZpbGVuYW1lOyBvdGhlcndpc2UsIGlmIGl0IG1hdGNoZXMgYSBGSUxFIFRFWFQtUEFUVEVSTiwgIihUKSIKKyAgICAgICAgICBpcyBwcmludGVkLgorCisgICAvTk9YRkVSTU9ERQorICAgICAgICAgIERvbid0IGRpc3BsYXkgdHJhbnNmZXItbW9kZSBpbmRpY2F0b3JzLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZgorICAgICAgICAgIC9YRkVSTU9ERSBhbmQgaXMgdGhlIGRlZmF1bHQuCisKKyAgIC9SRUNVUlNJVkUKKyAgICAgICAgICBTaG93IGZpbGVzIG5vdCBvbmx5IGluIHRoZSBnaXZlbiBkaXJlY3RvcnksIGJ1dCBhbHNvIGluIGl0cworICAgICAgICAgIHN1YmRpcmVjdG9yaWVzIChpZiBhbnkpLCB0aGVpciBzdWJkaXJlY3RvcmllcywgZXRjLgorCisgICAvTk9SRUNVUlNJVkUKKyAgICAgICAgICBEb24ndCBzaG93IGZpbGVzIGluIHN1YmRpcmVjdG9yaWVzLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZgorICAgICAgICAgIC9SRUNVUlNJVkUsIGFuZCBpcyB0aGUgZGVmYXVsdC4KKworICAgL01FU1NBR0U6dGV4dAorICAgICAgICAgIFRoaXMgbGV0cyB5b3Ugc3BlY2lmeSBhIHNob3J0IHRleHQgc3RyaW5nIHRvIGJlIGFwcGVuZGVkIHRvIHRoZQorICAgICAgICAgIGVuZCBvZiBlYWNoIGRpcmVjdG9yeSBsaXN0aW5nIGxpbmUgKGEgc3BhY2UgaXMgc3VwcGxpZWQKKyAgICAgICAgICBhdXRvbWF0aWNhbGx5KS4gSWYgdGhlIHRleHQgY29udGFpbnMgYW55IHNwYWNlcywgZW5jbG9zZSBpdCBpbgorICAgICAgICAgIGJyYWNlcywgZS5nLiAvTUVTU0FHRTp7dHdvIHdvcmRzfS4KKworICAgL05PTUVTU0FHRQorICAgICAgICAgIERvbid0IGFwcGVuZCBhbnkgbWVzc2FnZSB0byB0aGUgZW5kIG9mIGVhY2ggZGlyZWN0b3J5IGxpc3RpbmcKKyAgICAgICAgICBsaW5lIChkZWZhdWx0KS4KKworICAgL1NPUlQ6W3tOQU1FLFNJWkUsREFURX1dCisgICAgICAgICAgU29ydCB0aGUgbGlzdGluZyBieSBuYW1lLCBzaXplLCBvciBkYXRlLiBJZiB0aGUgL1NPUlQgc3dpdGNoIGlzCisgICAgICAgICAgZ2l2ZW4gYnV0IHRoZSAic29ydC1ieSIga2V5d29yZCBpcyBvbWl0dGVkLCB0aGUgbGlzdGluZyBpcworICAgICAgICAgIHNvcnRlZCBieSBuYW1lLiAvU09SVDpOQU1FIC9BU0NFTkRJTkcgKGFscGhhYmV0aWMgc29ydCBieSBuYW1lKQorICAgICAgICAgIGlzIHRoZSBkZWZhdWx0LgorCisgICAvTk9TT1JUCisgICAgICAgICAgRG9uJ3Qgc29ydCB0aGUgbGlzdGluZy4gRmlsZXMgYXJlIGxpc3RlZCBpbiB3aGF0ZXZlciBvcmRlciB0aGV5CisgICAgICAgICAgYXJlIHN1cHBsaWVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLCBlLmcuIGlub2RlIG9yZGVyIGluIFVOSVguCisKKyAgIC9SRVZFUlNFCisgICAgICAgICAgSWYgdGhlIC9TT1JUIHN3aXRjaCBpcyBnaXZlbiwgcmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIHNvcnQuCisgICAgICAgICAgU3lub255bTogL0RFU0NFTkRJTkcuCisKKyAgIC9BU0NFTkRJTkcKKyAgICAgICAgICBJZiB0aGUgL1NPUlQgc3dpdGNoIGlzIGdpdmVuLCBzb3J0IHRoZSBsaXN0aW5nIGluIG5vcm1hbCBvcmRlci4KKyAgICAgICAgICBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiAvUkVWRVJTRSBhbmQgaXMgdGhlIGRlZmF1bHQuCisKKyAgIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBESVJFQ1RPUlktc3BlY2lmaWMgc3dpdGNoZXMgY29tZSBpbiBwYWlycywgaW4KKyAgIHdoaWNoIG9uZSBtZW1iZXIgb2YgYSBwYWlyIChlLmcuIC9OT0hFQURJTkdTKSBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlCisgICBvdGhlciAoZS5nLiAvSEVBRElOR1MpLgorCisgICBJZiB5b3UgYWx3YXlzIHdhbnQgdG8gdXNlIGNlcnRhaW4gb3B0aW9ucywgeW91IGNhbiBzZXQgdGhlbSB3aXRoIHRoZQorICAgU0VUIE9QVElPTlMgRElSRUNUT1JZIGNvbW1hbmQgKFs0NjZdU2VjdGlvbiAxLjUuNSkuIFVzZSBTSE9XIE9QVElPTlMKKyAgIHRvIGxpc3QgdGhlIG9wdGlvbnMgY3VycmVudGx5IGluIGVmZmVjdC4gVG8gbWFrZSB0aGUgZGVzaXJlZCBvcHRpb25zCisgICBhcHBseSBldmVyeSB0aW1lIHlvdSBydW4gQy1LZXJtaXQsIHB1dCBhIFNFVCBPUFRJT05TIERJUkVDVE9SWSBjb21tYW5kCisgICBpbiB5b3VyIEMtS2VybWl0IGN1c3RvbWl6YXRpb24gZmlsZSwgc3BlY2lmeWluZyB0aGUgZGVzaXJlZCBvcHRpb25zLgorICAgT3B0aW9ucyBzZXQgaW4gdGhpcyBtYW5uZXIgYXBwbHkgdG8gZXZlcnkgc3Vic2VxdWVudCBESVJFQ1RPUlkKKyAgIGNvbW1hbmQuIE9mIGNvdXJzZSwgaWYgeW91IGluY2x1ZGUgc3dpdGNoZXMgaW4gYSBESVJFQ1RPUlkgY29tbWFuZCwKKyAgIHRoZXNlIG92ZXJyaWRlIGFueSBkZWZhdWx0cywgYnVpbHQtaW4gb3IgY3VzdG9tLiBFeGFtcGxlOgorCisgIERJUkVDVE9SWSAgICAgICAgICAgIDsgVXNlICJmYWN0b3J5IGRlZmF1bHRzIgorICBTRVQgT1BUSU9OUyBESVJFQ1RPUlkgL1NPUlQ6U0laRSAvUkVWRVJTRSAvSEVBRElOR1MgIDsgQ3VzdG9taXplIGRlZmF1bHRzCisgIERJUkVDVE9SWSAgICAgICAgICAgIDsgVXNlIGN1c3RvbWl6ZWQgZGVmYXVsdHMKKyAgRElSIC9TT1JUOk5BTUUgICAgICAgOyBPdmVycmlkZSBjdXN0b21pemVkIGRlZmF1bHQgU09SVCBrZXkKKyAgU0VUIE9QVCBESVIgL1JFQ1VSUyAgOyBBZGQgL1JFQ1VSU0lWRSB0byBjdXN0b21pemVkIGRlZmF1bHRzCisgIERJUiAvQVNDRU5EICAgICAgICAgIDsgT3ZlcnJpZGUgY3VzdG9taXplZCBkZWZhdWx0IFNPUlQgb3JkZXIKKworICAgTm90ZXM6CisKKyAgICAgKiBPbmx5IGEgc2luZ2xlIHNvcnQga2V5IGlzIHN1cHBvcnRlZDsgdGhlcmUgaXMgcHJlc2VudGx5IG5vIHdheSB0bworICAgICAgIGhhdmUgbXVsdGlwbGUgc29ydCBrZXlzLgorICAgICAqIElmIHRoZSAvQlJJRUYgc3dpdGNoIGlzIGdpdmVuLCBhbGwgb3RoZXIgc3dpdGNoZXMgKGV4Y2VwdAorICAgICAgIC9bTk9dUkVDVVJTSVZFLCAvW05PXURPVEZJTEVTLCAvRElSRUNUT1JJRVMsIC9GSUxFUywgYW5kIC9BTEwpIGFyZQorICAgICAgIGlnbm9yZWQuCisgICAgICogL1NPUlQ6YW55dGhpbmcgZ2l2ZXMgaW5jb3JyZWN0IHJlc3VsdHMgaWYgYW55IGZpbGVzIGhhdmUgbGVuZ3RocworICAgICAgIGdyZWF0ZXIgdGhhbiAxMCBkaWdpdHMgKGkuZS4gdGhhdCBhcmUgbW9yZSB0aGFuIDk5OTk5OTk5OTkgYnl0ZXMKKyAgICAgICBsb25nLCBpLmUuIGlmIHRoZXkgYXJlIDEwR0Igb3IgbW9yZSBpbiBzaXplKSBiZWNhdXNlIHRoZSBvdmVybG9uZworICAgICAgIGxlbmd0aCBmaWVsZCBjYXVzZXMgdGhlIGRhdGUgYW5kIG5hbWUgZmllbGRzIHRvIGJlIG1pc2FsaWduZWQuCisgICAgICogL1NPUlQ6TkFNRSBpcyByZWR1bmRhbnQgaW4gVk1TIHNpbmNlIFZNUyByZXR1cm5zIGZpbGVuYW1lcyBpbgorICAgICAgIGFscGhhYmV0aWMgb3JkZXIgYW55d2F5LgorICAgICAqIC9TT1JUOk5BTUUgaWdub3JlcyBhbHBoYWJldGljIGNhc2Ugb24gcGxhdGZvcm1zIHdoZXJlIGNhc2UgZG9lcworICAgICAgIG5vdCBtYXR0ZXIgaW4gZmlsZW5hbWVzLCBidXQgdGhpcyB3b3JrcyBvbmx5IGZvciB1bmFjY2VudGVkIFJvbWFuCisgICAgICAgbGV0dGVycyBBLVouCisgICAgICogL1NPUlQ6TkFNRSBpcyBjdXJyZW50bHkgYmFzZWQgb24gY29kZSB2YWx1ZXMsIGFuZCBzbyB3b3JrcyBmaW5lCisgICAgICAgZm9yIEFTQ0lJLCBidXQgd2lsbCBwcm9iYWJseSBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cyBmb3IgZmlsZXMKKyAgICAgICB3aXRoIG5vbi1BU0NJSSBvciA4LWJpdCBjaGFyYWN0ZXJzIGluIHRoZWlyIG5hbWVzLiAoTG9jYWxlLWJhc2VkCisgICAgICAgc29ydGluZyByYWlzZXMgcmF0aGVyIHNpZ25pZmljYW50IGlzc3VlcyBvZiBwb3J0YWJpbGl0eSwgc2l6ZSwKKyAgICAgICBwZXJmb3JtYW5jZSwgZXRjLikKKyAgICAgKiAvU09SVDpEQVRFIHdvcmtzIHJpZ2h0IG9ubHkgZm9yIElTTy1mb3JtYXQgZGF0ZXMsIG5vdCBFbmdsaXNoCisgICAgICAgb25lcy4KKyAgICAgKiAvU09SVDpTSVpFIHNvcnRzIHRoZSBzaXplIGZpZWxkIGxleGljYWxseS4gT24gc29tZSBwbGF0Zm9ybXMgKGUuZy4KKyAgICAgICBXaW5kb3dzKSwgdGhlIHNpemUgb2YgYSBkaXJlY3RvcnkgZmlsZSBpcyBsaXN0ZWQgYXMgIjxESVI+IiByYXRoZXIKKyAgICAgICB0aGFuIGFzIGEgbnVtYmVyOyBpbiB0aGlzIGNhc2UsIHRoZSAiPERJUj4iIGZpbGVzIGFyZSBnYXRoZXJlZCBhdAorICAgICAgIHRoZSBlbmQgKG9yIGJlZ2lubmluZywgZGVwZW5kaW5nIG9uIHRoZSBzb3J0IG9yZGVyKSBvZiB0aGUKKyAgICAgICBsaXN0aW5nLgorICAgICAqIC9SRUNVUlNJVkUgaXMgYWNjZXB0ZWQgYnV0IGlnbm9yZWQgaW4gQU9TL1ZTLiBVc2UgdGhlIG5vcm1hbAorICAgICAgIHN5c3RlbS1zcGVjaWZpYyBmaWxlc3BlYyBub3RhdGlvbiwgZS5nLiAiZGlyICMudHh0Ii4KKyAgICAgKiAvUkVDVVJTSVZFIGhhcyBubyBhZmZlY3Qgd2hlbiBhIGZ1bGwsIGFic29sdXRlIHBhdGhuYW1lIGlzIGdpdmVuOworICAgICAgIGUuZy4gImRpciAvcmVjdXJzaXZlIC90bXAvZm9vIiAod2hlcmUgImZvbyIgaXMgYSByZWd1bGFyIGZpbGUpCisgICAgICAgb25seSBzaG93cyB0aGUgIi90bXAvZm9vIiBmaWxlLiBJZiB5b3Ugd2FudCB0byBzZWUgYWxsICJmb28iIGZpbGVzCisgICAgICAgaW4gdGhlIC90bXAgdHJlZSwgZG8gImNkIC90bXAiIGFuZCB0aGVuICJkaXIgL3JlY3Vyc2l2ZSBmb28iLgorICAgICAqIElmIGEgZmlsZSBzaXplIG9mIC0xIGlzIHNob3duLCBvciBkYXRlLXRpbWUgb2YgMDAwMC0wMC0wMAorICAgICAgIDAwOjAwOjAwLCB0aGlzIG1lYW5zIHRoZSBmaWxlIHdhcyBsb2NhdGVkLCBidXQgYWNjZXNzIHRvCisgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGUgd2FzIGRlbmllZCB0byBDLUtlcm1pdC4KKyAgICAgKiBJbiBWTVMsIGlmIEZPTy5ESVI7MSBpcyBhIGRpcmVjdG9yeSB3aXRoaW4geW91ciBjdXJyZW50IGRpcmVjdG9yeSwKKyAgICAgICAiZGlyZWN0b3J5IGZvbyIgYW5kICJkaXJlY3RvcnkgWy5mb29dIiBsaXN0IHRoZSBmaWxlcyBpbiB0aGUKKyAgICAgICBbLkZPT10gc3ViZGlyZWN0b3J5LCBidXQgImRpcmVjdG9yeSBmb28uZGlyIiBsaXN0cyB0aGUgZGlyZWN0b3J5CisgICAgICAgZmlsZSBpdHNlbGY7IHNpbWlsYXJseSBmb3IgIiouZGlyIiB2ZXJzdXMgIlsuKl0iLCBldGMuCisgICAgICogSW4gVU5JWCwgaWYgImZvbyIgaXMgYSBkaXJlY3Rvcnkgd2l0aGluIHlvdXIgY3VycmVudCBkaXJlY3RvcnksCisgICAgICAgImRpcmVjdG9yeSBmb28iIGxpc3RzIHRoZSBmaWxlcyBpbiB0aGUgZm9vIGRpcmVjdG9yeS4gSWYgeW91IHdhbnQKKyAgICAgICB0byBsaXN0IHRoZSBmb28gZGlyZWN0b3J5IGZpbGUgaXRzZWxmLCBwdXQgYW4gYXN0ZXJpc2sgYXQgdGhlIGVuZDoKKyAgICAgICAiZGlyIGZvbyoiLgorCisgICBIaW50OiBIb3cgdG8gZmluZCB0aGUgYmlnZ2VzdCBmaWxlcyBpbiBhIGRpcmVjdG9yeSB0cmVlOgorCisgIGNkIHh4eCA7IChyb290IG9mIHRyZWUpCisgIGRpcmVjdG9yeSAvc29ydDpzaXplIC9yZWN1cnNpdmUgL3JldmVyc2UgL2RvdGZpbGVzIC9wYWdlCisKKyAgIEFub3RoZXIgaGludDogSWYgeW91IG9mdGVuIHVzZSBzZXZlcmFsIGRpZmZlcmVudCBkaXJlY3RvcnktbGlzdGluZworICAgZm9ybWF0cywgZGVmaW5lIG1hY3JvIHNob3J0Y3V0cyBmb3IgdGhlbToKKworICBERUZJTkUgV0QgRElSRUNUT1JZIC9TT1JUOkRBVEUgL1JFVkVSU0UgXCUqICA7IFJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcgorICBERUZJTkUgU0QgRElSRUNUT1JZIC9TT1JUOlNJWkUgL1JFVkVSU0UgXCUqICA7IFJldmVyc2Ugb3JkZXIgb2Ygc2l6ZQorICBERUZJTkUgTkQgRElSRUNUT1JZIC9TT1JUOk5BTUUgL0FTQ0VORCBcJSogICA7IEFscGhhYmV0aWNhbCBieSBuYW1lCisgIERFRklORSBETCBESVIgL0RJUiAvU09SVDpOQU1FIC9BU0NFTkQgXCUqICAgIDsgQWxwaGFiZXRpY2FsIGRpcmVjdG9yeSBsaXN0CisKKyAgIFB1dCB0aGVzZSBkZWZpbml0aW9ucyBpbiB5b3VyIEMtS2VybWl0IGN1c3RvbWl6YXRpb24gZmlsZS4gTm90ZSB0aGF0CisgICAiXCUqIiAoWzQ2N11TZWN0aW9uIDcuNSkgaW4gdGhlc2UgZGVmaW5pdGlvbnMgbGV0cyB5b3UgaW5jbHVkZSBvdGhlcgorICAgc3dpdGNoZXMgaW4geW91ciBtYWNybyBpbnZvY2F0aW9ucywgZS5nLjoKKworICB3ZCAvaGVhZGluZ3MgKi50eHQKKworICAgT2YgY291cnNlIHlvdSBjYW4gc3RpbGwgYWNjZXNzIHlvdXIgZXh0ZXJuYWwgZGlyZWN0b3J5IGxpc3RpbmcgcHJvZ3JhbQorICAgYnkgdXNpbmcgUlVOIG9yICIhIiwgZS5nLiBpbiBWTVM6CisKKyAgcnVuIGRpcmVjdG9yeSAvc2l6ZS9kYXRlL3Byb3RlY3Rpb24vZXhjZXB0PSoub2JqIG9vZmEuKjswCisKKyAgIG9yOgorCisgICFkaXIgL3NpemUvZGF0ZS9wcm90L2V4Yz0qLm9iaiBvb2ZhLio7MAorCisgICBJbiBVTklYLCB1c2UgIiFscyIgb3IganVzdCAibHMiICh3aGljaCBpcyBhIHNwZWNpYWwgc3lub255bSBmb3IKKyAgICIhbHMiKS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuNS4yLiBUaGUgQ0QgYW5kIEJBQ0sgQ29tbWFuZHMKKworICAgSW4gQy1LZXJtaXQgNy4wLCB0aGUgQ0QgY29tbWFuZCBoYXMgYSBuZXcgZnJpZW5kLCB0aGUgQkFDSyBjb21tYW5kLgorICAgQkFDSyBtZWFucyAiQ0QgdG8gbXkgcHJldmlvdXMgY3VycmVudCBkaXJlY3RvcnkiLiBBIHNlY29uZCBCQUNLIGJyaW5ncworICAgeW91IGJhY2sgdG8gd2hlcmUgeW91IHdlcmUgYmVmb3JlIHRoZSBmaXJzdCBvbmU7IHRodXMgc3VjY2Vzc2l2ZSBCQUNLCisgICBjb21tYW5kcyBzd2l0Y2ggYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0d28gZGlyZWN0b3JpZXMuCisKKyAgICA0LjUuMi4xLiBQYXJzaW5nIEltcHJvdmVtZW50cworCisgICBUaGUgQ0QgY29tbWFuZCwgYXMgd2VsbCBhcyBvdGhlciBjb21tYW5kcyB0aGF0IHBhcnNlIGEgZGlyZWN0b3J5IG5hbWUsCisgICB3ZXJlIGNoYW5nZWQgaW4gNy4wIHRvIHByb3ZpZGUgYWxsIHRoZSBleHBlY3RlZCBmdW5jdGlvbnM6IGNvbXBsZXRpb24KKyAgIG9uIFRhYiBvciBFc2MsIGRpcmVjdG9yeS1uYW1lIGxpc3RzIG9uID8sIGV0Yy4gT3RoZXIgYWZmZWN0ZWQgY29tbWFuZHMKKyAgIGluY2x1ZGUgU0VUIFNFUlZFUiBHRVQtUEFUSCwgU0VUIFRFTVAtRElSRUNUT1JZLCBTRVQgRklMRQorICAgRE9XTkxPQUQtRElSRUNUT1JZLCBhbmQgU1BBQ0UuIENEIGFuZCBSRU1PVEUgQ0QgYWxzbyBub3cgd29yayB3aXRoCisgICBsb2dpY2FsIG5hbWVzLgorCisgICBJbiBWTVMsIHRoZSBzaXR1YXRpb24gaXMgYSBiaXQgY29tcGxpY2F0ZWQgc2luY2UgYSBkaXJlY3RvcnkgbmFtZSBjYW4KKyAgIGxvb2sgbGlrZSAiREVWOiIsICJbRk9PLkJBUl0iLCAiREVWOltGT08uQkFSXSIsICJbRk9PXUJBUi5ESVI7MSIsIGV0Yy4KKyAgIENvbXBsZXRpb24gYW5kID8taGVscCBtaWdodCBub3QgYWx3YXlzIHdvcmssIGJ1dCB0aGV5IGRvIGluIG1hbnkKKyAgIGNhc2VzLiBFeGFtcGxlczoKKworICBjZCA/ICAgICAgICAgICBMaXN0cyBhbGwgc3ViZGlyZWN0b3JpZXMgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisgIGNkIFtdPyAgICAgICAgIERpdHRvCisgIGNkIGs/ICAgICAgICAgIERpdHRvLCBidXQgb25seSB0aG9zZSBzdGFydGluZyB3aXRoIEsKKyAgY2QgW2Zvb10/ICAgICAgTGlzdHMgYWxsIHN1YmRpcmVjdG9yaWVzIG9mIHRoZSBbRk9PXSBkaXJlY3RvcnkKKyAgY2QgWy1dPyAgICAgICAgTGlzdHMgYWxsIHN1YmRpcmVjdG9yaWVzIG9mIHRoZSBzdXBlcmlvciBkaXJlY3RvcnkKKyAgY2QgWy0tXT8gICAgICAgTGlzdHMgYWxsIHN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgMiBsZXZlbHMgdXAKKyAgY2QgWy4uLl0/ICAgICAgTGlzdHMgYWxsIGRpcmVjdG9yaWVzIGJlbG93IHRoZSBjdXJyZW50IG9uZQorICBjZCBbZm9vLj8gICAgICBEb2VzIG5vdCB3b3JrLgorCisgICBDLUtlcm1pdCBhbGxvd3MgYWxsIG9mIHRoZSBmb2xsb3dpbmcgaW4gVk1TOgorCisgIGNkIGJhciAgICAgICAgIENEIHRvIHN1YmRpcmVjdG9yeSBCQVIgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisgIGNkIC5iYXIgICAgICAgIERpdHRvCisgIGNkIFsuYmFyXSAgICAgIERpdHRvCisgIGNkIGJhci5kaXIgICAgIGV0Yy4uLgorICBjZCBiYXIuZGlyOworICBjZCBiYXIuZGlyOzEKKyAgY2QgW2Zvby5iYXJdCisgIGNkIGJhci5iYXogICAgIFRoaXMgY2FuIGdvIG1vcmUgdGhhbiAxIGxldmVsIGRlZXAuLi4KKyAgY2QgZGlyOiAgICAgICAgKHdoZXJlIGxvZ2ljYWwgbmFtZSBESVIgaXMgZGVmaW5lZCBhcyBbRk9PLkJBUl0pCisKKyAgIEFzIHdlbGwgYXMgdGhlIGZvbGxvd2luZzoKKworICBjZCAuLiAgICAgICAgICBHbyB1cCBvbmUgbGV2ZWwgYXMgaW4gVU5JWAorICBjZCAuICAgICAgICAgICBUaGUgY3VycmVudCBkaXJlY3RvcnkKKyAgY2QgICAgICAgICAgICAgTXkgbG9naW4gZGlyZWN0b3J5CisKKyAgIE5vdGUgdGhhdCAiY2QgLSIgKGdvIHVwIG9uZSBsZXZlbCkgZG9lcyBub3Qgd29yayBhcyBleHBlY3RlZCwgYmVjYXVzZQorICAgIi0iIGlzIEtlcm1pdCdzIGNvbW1hbmQgY29udGludWF0aW9uIGNoYXJhY3Rlci4gSG93ZXZlciwgImNkIFstXSIsIGFuZAorICAgIgorICAgY2Qgey19IiBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCAoYW5kIHNvIGRvZXMgImNkIC4uIiwgd2hpY2ggaXMgZWFzaWVyCisgICB0byB0eXBlKS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuNS4yLjIuIFRoZSBDRFBBVEgKKworICAgVGhlIENEIGNvbW1hbmQgaW4gdGhlIFVOSVgsIFdpbmRvd3MsIE9TLzIsIGFuZCBWTVMgdmVyc2lvbnMgb2YKKyAgIEMtS2VybWl0LCBhcyBvZiB2ZXJzaW9uIDYuMSAvIDEuMS4xMiwgc2VhcmNoZXMgdGhlIENEUEFUSCBmb3IgdGhlCisgICBnaXZlbiBkaXJlY3RvcnksIGlmIGl0IGlzIG5vdCBhYnNvbHV0ZSBhbmQgaWYgYSBDRFBBVEggZW52aXJvbm1lbnQKKyAgIHZhcmlhYmxlIGlzIGRlZmluZWQuIEV4YW1wbGUgKGluIFVOSVgga3NoIG9yIGJhc2gpOgorCisgICQgZXhwb3J0IENEUEFUSD0kSE9NRTokSE9NRS9rZXJtaXQ6L3RtcAorCisgICBOb3cgaWYgeW91IGdpdmUgYSAiY2QgeHh4IiBjb21tYW5kLCBubyBtYXR0ZXIgd2hhdCB5b3VyIGN1cnJlbnQKKyAgIGRpcmVjdG9yeSBpcywgaWYgdGhlICJ4eHgiIGRpcmVjdG9yeSBpcyBub3QgYSBzdWJkaXJlY3Rvcnkgb2YgeW91cgorICAgY3VycmVudCBkaXJlY3RvcnksIHRoZW4gdGhlIHh4eCBzdWJkaXJlY3Rvcnkgb2YgeW91ciBob21lIGRpcmVjdG9yeSBpcworICAgdXNlZCBvciBpZiB0aGF0IGRvZXMgbm90IGV4aXN0LCB0aGVuIHRoZSB4eHggc3ViZGlyZWN0b3J5IG9mIHRoZQorICAga2VybWl0IHN1YmRpcmVjdG9yeSBvZiB5b3VyIGhvbWUgZGlyZWN0b3J5IGlzIHVzZWQgb3IgaWYgdGhhdCBkb2VzIG5vdAorICAgZXhpc3QsIHRoZW4gL3RtcC94eHggaXMgdXNlZC4gVGhpcyBpcyBob3cgdGhlIGtzaCAiY2QiIGNvbW1hbmQgd29ya3MsCisgICBhbmQgbm93IHRoZSBDLUtlcm1pdCBDRCBjb21tYW5kIHdvcmtzIHRoZSBzYW1lIHdheS4KKworICAgSW4gVk1TLCB5b3UgY2FuIGRlZmluZSBDRFBBVEggdG8gYmUgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbgorICAgYWN0dWFsIGRpcmVjdG9yeSBkZWxpbWl0ZXJzLCBhbmQvb3IgbG9naWNhbCBuYW1lcyByZXByZXNlbnRpbmcKKyAgIGRpcmVjdG9yaWVzLCB1c2luZyBjb21tYXMgdG8gc2VwYXJhdGUgdGhlbSwgZS5nLjoKKworICAkIGRlZmluZSBjZHBhdGggW0hPTUVdLFtTT01FT1RIRVJESVJdLFtIT01FLk1JU0NdCisgICQgZGVmaW5lIGNkcGF0aCBTWVMkTE9HSU46LERJU0sxOltIT01FXSxESVNLMjpbU0NSQVRDSC5JVkFOXQorCisgICBFeGFtcGxlOgorCisgICQgZGVmaW5lIGNkcGF0aCBTWVMkTE9HSU46LFtJVkFOXSxbT0xBRl0sW09MR0EuTUlTQ10KKyAgJCBrZXJtaXQKKyAgRElTSzE6W09MR0FdIEMtS2VybWl0PiBjZCBibGFoCisKKyAgIHRyaWVzIHRoZSBCTEFIIHN1YmRpcmVjdG9yeSBvZiB0aGUgdXNlcidzIGxvZ2luIGRpcmVjdG9yeSwgdGhlbgorICAgW09MR0EuQkxBSF0sIFtJVkFOLkJMQUhdLCBbT0xBRi5CTEFIXSwgYW5kIFtPTEdBLk1JU0MuQkxBSF0sIGluIHRoYXQKKyAgIG9yZGVyLCB1c2luZyB0aGUgZmlyc3Qgb25lIGl0IGZpbmRzLCBmYWlsaW5nIGlmIGl0IGZpbmRzIG5vbmUuCisKKyAgIEluIEMtS2VybWl0IDcuMCwgeW91IG1heSBhbHNvIHNldCB0aGUgQ0RQQVRIIGZyb20gdGhlIEtlcm1pdCBwcm9tcHQ6CisKKyAgIFNFVCBDRCBQQVRIIHBhdGgKKyAgICAgICAgICBBbGxvd3MgdGhlIENEIFBBVEggdG8gYmUgc2V0IGZyb20gd2l0aGluIEMtS2VybWl0LgorCisgICBTSE9XIENEIHNob3dzIHRoZSBDRCBwYXRoIGFuZCBhbGwgb3RoZXIgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIENECisgICBjb21tYW5kLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC41LjIuMy4gQ0QgTWVzc2FnZXMKKworICAgV2hlbmV2ZXIgeW91IGNoYW5nZSBkaXJlY3RvcnksIHlvdSBjYW4gaGF2ZSBDLUtlcm1pdCBkaXNwbGF5IGEgIlJlYWQKKyAgIE1lIiBmaWxlIGZyb20gdGhlIG5ldyBkaXJlY3RvcnkgYXV0b21hdGljYWxseS4gVGhlIGNvbW1hbmRzIGFyZToKKworICAgU0VUIENEIE1FU1NBR0UgeyBPTiwgT0ZGLCBGSUxFIGxpc3QgfQorICAgICAgICAgIE9OIGVuYWJsZXMgdGhpcyBmZWF0dXJlOyBPRkYgKHRoZSBkZWZhdWx0KSBkaXNhYmxlcyBpdC4gRmlsZQorICAgICAgICAgIGxldHMgeW91IHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlICJSZWFkIE1lIiBmaWxlLiBBIGxpc3Qgb2YKKyAgICAgICAgICBuYW1lcyB0byBsb29rIGZvciBjYW4gYmUgZ2l2ZW4gaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAge3tuYW1lMX17bmFtZTJ9e25hbWUzfXsuLi59fQorCisgICAgICAgICAgZS5nLjoKKworICBTRVQgU0VSVkVSIENELU1FU1NBR0UgRklMRSB7ey4vLnJlYWRtZX17UkVBRE1FLlRYVH17UkVBRC5NRX19CisKKyAgICAgICAgICBUaGUgZGVmYXVsdCBsaXN0IG9mIENELW1lc3NhZ2UgZmlsZXMgaXMgc3lzdGVtIGRlcGVuZGVudC4KKworICAgU0hPVyBDRCBzaG93cyB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5LCBwcmV2aW91cyBkaXJlY3RvcnksIENEIHBhdGgsIGFuZAorICAgQ0QgbWVzc2FnZSBpbmZvLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC41LjMuIENyZWF0aW5nIGFuZCBSZW1vdmluZyBEaXJlY3RvcmllcworCisgICBUaGUgTUtESVIgY29tbWFuZCBub3cgYWxsb3dzIHlvdSB0byBjcmVhdGUgbXVsdGlwbGUgZGlyZWN0b3JpZXMgYXQKKyAgIG9uY2U6CisKKyAgQy1LZXJtaXQ+IG1rZGlyIGEvYi9jL2QKKworICAgY3JlYXRlcyB0aGUgZGlyZWN0b3J5IGEgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IChpZiBpdCBkb2Vzbid0IGV4aXN0CisgICBhbHJlYWR5KSwgYW5kIHRoZW4gY3JlYXRlcyBzdWJkaXJlY3RvcnkgYiBpbiB0aGUgYSBkaXJlY3RvcnkgKGlmIGl0CisgICBkaWRuJ3QgZXhpc3QgYWxyZWFkeSksIGFuZCBzbyBvbi4KKworICAgSWYgeW91IHVzZSBNS0RJUiB0byB0cnkgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IHRoYXQgYWxyZWFkeSBleGlzdHMsCisgICBDLUtlcm1pdCB3aWxsIHByaW50IGEgd2FybmluZyAoIj9EaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMiKSwgYnV0IHRoZQorICAgTUtESVIgY29tbWFuZCB3aWxsIHN0aWxsIHN1Y2NlZWQuIElmIHlvdSB3YW50IHRvIGF2b2lkIHRoZSB3YXJuaW5nCisgICBtZXNzYWdlLCB1c2UgSUYgRElSRUNUT1JZIGZpcnN0IHRvIGNoZWNrIGlmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeQorICAgZXhpc3RzLgorCisgICBUaGUgUk1ESVIgY29tbWFuZCwgaG93ZXZlciwgd2lsbCBub3QgcmVtb3ZlIG1vcmUgdGhhbiBvbmUgZGlyZWN0b3J5LAorICAgbm9yIHdpbGwgaXQgcmVtb3ZlIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgYW55IGZpbGVzLiAoVGhlcmUgaXMsIGFzCisgICB5ZXQsIG5vIFJNRElSIC9SRUNVUlNJVkUgY29tbWFuZCwgYWx0aG91Z2ggb25lIG1pZ2h0IGJlIGFkZGVkIGxhdGVyLikKKworICAgSW4gVk1TLCB0aGVzZSBjb21tYW5kcyAobGlrZSBDRCkgYXJlIG1vcmUgZm9yZ2l2aW5nIG9mIHlvdXIgc3ludGF4CisgICB0aGFuIGlzIHRoZSBEQ0wgY29tbWFuZCBzaGVsbDsgIm1rZGlyIG9vZmEiIGlzIGVxdWl2YWxlbnQgdG8gIm1rZGlyCisgICBbLm9vZmFdIiBhbmQgc28gb24uIEFsc28gaW4gVk1TLCB5b3UnbGwgZmluZCB0aGF0IEMtS2VybWl0J3MgUk1ESVIKKyAgIGNvbW1hbmQgaXMgZWFzaWVyIHRoYW4gZGVsZXRpbmcgYSBkaXJlY3RvcnkgaW4gRENMLCBzaW5jZSBpdAorICAgYXV0b21hdGljYWxseSBmaXJzdCBnaXZlcyBpdCBvd25lciBkZWxldGUgcGVybWlzc2lvbiBpZiB5b3UgYXJlIHRoZQorICAgb3duZXIuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjUuNC4gVGhlIERFTEVURSBhbmQgUFVSR0UgQ29tbWFuZHMKKworICAgVGhlIERFTEVURSBjb21tYW5kIG5vdyBvZmZlcnMgYSBzZWxlY3Rpb24gb2Ygc3dpdGNoZXMsIGFuZCBoYXMgYSBuZXcKKyAgIGNvbXBhbmlvbiwgdGhlIFBVUkdFIGNvbW1hbmQuIEZpcnN0LCBERUxFVEU6CisKKyAgIERFTEVURSBbIHN3aXRjaGVzLi4uIF0gZmlsZXNwZWMKKyAgICAgICAgICBEZWxldGVzIHRoZSBmaWxlIG9yIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIGZpbGVzcGVjLCB3aGljaCBtYXkKKyAgICAgICAgICBjb250YWluIHdpbGRjYXJkcyAoWzQ2OF1TZWN0aW9uIDQuOSkuCisKKyAgIE9wdGlvbmFsIHN3aXRjaGVzIGluY2x1ZGUgdGhlIHN0YW5kYXJkIGZpbGUtc2VsZWN0aW9uIHN3aXRjaGVzCisgICBwcmVzZW50ZWQgaW4gWzQ2OV1TZWN0aW9uIDEuNS40LCBwbHVzOgorCisgICAvQVNLCisgICAgICAgICAgQmVmb3JlIGRlbGV0aW5nIGVhY2ggZmlsZSwgYXNrIHBlcm1pc3Npb24gaW50ZXJhY3RpdmVseS4KKyAgICAgICAgICBBbnN3ZXJzIGFyZSBZZXMgb3IgT0sgKGRlbGV0ZSB0aGUgZmlsZSksIE5vIChkb24ndCBkZWxldGUgaXQpLAorICAgICAgICAgIG9yIFF1aXQgKHN0b3AgZXhlY3V0aW5nIHRoZSBERUxFVEUgY29tbWFuZCkuCisKKyAgIC9OT0FTSworICAgICAgICAgIERvbid0IGFzayBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBlYWNoIGZpbGUuCisKKyAgIC9MSVNUCisgICAgICAgICAgTGlzdCBlYWNoIGZpbGUgYW5kIHNob3cgd2hldGhlciBpdCB3YXMgZGVsZXRlZC4gU3lub255bXM6IC9MT0csCisgICAgICAgICAgL1ZFUkJPU0UuCisKKyAgIC9OT0xJU1QKKyAgICAgICAgICBEb24ndCBsaXN0IGZpbGVzIHdoaWxlIGRlbGV0aW5nIHRoZW0uIFN5bm9ueW1zOiAvTk9MT0csIC9RVUlFVC4KKworICAgL0hFQURJTkcKKyAgICAgICAgICBQcmludCBhIGhlYWRpbmcgYW5kIHN1bW1hcnkgbGluZS4KKworICAgL05PSEVBRElORworICAgICAgICAgIERvbid0IHByaW50IGEgaGVhZGluZyBhbmQgc3VtbWFyeSBsaW5lLgorCisgICAvUEFHRQorICAgICAgICAgIFdoZW4gbGlzdGluZywgcGF1c2UgYXQgdGhlIGVuZCBvZiBlYWNoIHNjcmVlbmZ1bCBhbmQgZ2l2ZSB0aGUKKyAgICAgICAgICAiTW9yZT8iIHByb21wdC4gSWYgeW91IHJlcGx5ICJuIiAobm8pLCB0aGUgREVMRVRFIGNvbW1hbmQKKyAgICAgICAgICB0ZXJtaW5hdGVzLgorCisgICAvU0lNVUxBVEUKKyAgICAgICAgICBEbyBldmVyeXRoaW5nIGltcGxpZWQgYnkgdGhlIGdpdmVuIHN3aXRjaGVzIGFuZCBmaWxlc3BlYywKKyAgICAgICAgICBleGNlcHQgZG8gbm90IGFjdHVhbGx5IGRlbGV0ZSBhbnkgZmlsZXMuIFRoaXMgbGV0cyB5b3UgcHJldmlldworICAgICAgICAgIHdoaWNoIGZpbGVzIHdvdWxkIGJlIGRlbGV0ZWQ7IGltcGxpZXMgL0xJU1QuCisKKyAgIE5vdyB0aGUgUFVSR0UgY29tbWFuZDoKKworICAgUFVSR0UgWyBzd2l0Y2hlcy4uLiBdIFsgZmlsZXNwZWMgXQorICAgICAgICAgIChWTVMgb25seSkgUnVucyB0aGUgRENMIFBVUkdFIGNvbW1hbmQuIFN3aXRjaGVzIGFuZCBmaWxlc3BlYywKKyAgICAgICAgICBpZiBhbnksIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gRENMIHdpdGhvdXQgcGFyc2luZyBvcgorICAgICAgICAgIHZlcmlmaWNhdGlvbi4gRGVsZXRlcyBleGNlc3MgdmVyc2lvbnMgb2YgdGhlIGdpdmVuIChvciBhbGwpCisgICAgICAgICAgZmlsZXMuIFRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCBhcHBseSB0byBWTVMuCisKKyAgIFBVUkdFIFsgc3dpdGNoZXMuLi4gXSBbIGZpbGVzcGVjIF0KKyAgICAgICAgICAoVU5JWCBvbmx5KSBEZWxldGVzICJiYWNrdXAgZmlsZXMiIHRoYXQgbWF0Y2ggdGhlIGZpbGVzcGVjLAorICAgICAgICAgIHdoaWNoIG1heSBjb250YWluIHdpbGRjYXJkcyAoWzQ3MF1TZWN0aW9uIDQuOSkuIElmIG5vIGZpbGVzcGVjCisgICAgICAgICAgaXMgZ2l2ZW4sIGFsbCBiYWNrdXAgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFyZQorICAgICAgICAgIHNlbGVjdGVkIChzdWJqZWN0IHRvIG1vZGlmaWNhdGlvbiBieSBhbnkgc3dpdGNoZXMpLiBEbyBub3QKKyAgICAgICAgICBpbmNsdWRlIGJhY2t1cCBub3RhdGlvbiBpbiB0aGUgZmlsZXNwZWMuCisKKyAgIEV4cGxhbmF0aW9uOgorCisgICBUbyBhdm9pZCBkZXN0cm95aW5nIHByZWV4aXN0aW5nIGZpbGVzIHdoZW4gYSBuZXcgZmlsZSBhcnJpdmVzIHRoYXQgaGFzCisgICB0aGUgc2FtZSBuYW1lLCBDLUtlcm1pdCBiYWNrcyB1cCB0aGUgb2xkIGZpbGUgYnkgYXBwZW5kaW5nIGEgImJhY2t1cAorICAgbnVtYmVyIiB0byBpdHMgbmFtZS4gSW4gVU5JWCwgdGhlIGJhY2t1cCBzdWZmaXggY29uc2lzdHMgb2YgYSBwZXJpb2QsCisgICBhIHRpbGRlLCBhIG51bWJlciwgYW5kIGFub3RoZXIgdGlsZGUuIEZvciBleGFtcGxlLCBpZiBhIGZpbGUgY2FsbGVkCisgICBvb2ZhLnR4dCBleGlzdHMgYW5kIGEgbmV3IG9vZmEudHh0IGZpbGUgYXJyaXZlcywgdGhlIG9yaWdpbmFsIGlzCisgICByZW5hbWVkIHRvIG9vZmEudHh0Ln4xfi4gSWYgYW5vdGhlciBvb2ZhLnR4dCBmaWxlIGFycml2ZXMsIHRoZQorICAgZXhpc3Rpbmcgb25lIGlzIHJlbmFtZWQgdG8gb29mYS50eHQufjJ+LiBBbmQgc28gb24uIFRoaXMgc3lzdGVtIGlzCisgICBjb21wYXRpYmxlIHdpdGggdGhlIG9uZSB1c2VkIGJ5IEVNQUNTLiBUaHVzIG92ZXIgdGltZSwgaWYgeW91IHJlY2VpdmUKKyAgIGEgbG90IG9mIGZpbGVzIHdpdGggQy1LZXJtaXQgb3IgZWRpdCB0aGVtIHdpdGggRU1BQ1MsIGJhY2t1cCBmaWxlcyBjYW4KKyAgIGJ1aWxkIHVwLiBUaGUgbmV3IFBVUkdFIGNvbW1hbmQgbGV0cyB5b3UgY2xlYW4gb3V0IGFjY3VtdWxhdGVkIGJhY2t1cAorICAgZmlsZXM6CisKKyAgIE9wdGlvbmFsIHN3aXRjaGVzIGluY2x1ZGUgdGhlIHN0YW5kYXJkIGZpbGUtc2VsZWN0aW9uIHN3aXRjaGVzCisgICBwcmVzZW50ZWQgaW4gWzQ3MV1TZWN0aW9uIDEuNS40LCBwbHVzIGFsbCB0aGUgc3dpdGNoZXMgbGlzdGVkIGFib3ZlCisgICBmb3IgdGhlIERFTEVURSBjb21tYW5kLCBwbHVzOgorCisgICAvS0VFUDpuCisgICAgICAgICAgUmV0YWlucyB0aGUgbiBtb3N0IHJlY2VudCAoaGlnaGVzdC1udW1iZXJlZCkgYmFja3VwIGZpbGVzIGZvcgorICAgICAgICAgIGVhY2ggZmlsZS4gRm9yIGV4YW1wbGUsIGlmIG9vZmEudHh0LCBvb2ZhLnR4dC5+MX4sCisgICAgICAgICAgb29mYS50eHQufjJ+LCBvb2ZhLnR4dC5+MTB+LCBvb2ZhLnR4dC5+MTJ+LCBhbmQgb29mYS50eHQufjEwMH4KKyAgICAgICAgICBleGlzdCwgInB1cmdlIC9rZWVwOjIgb29mYS50eHQiIGRlbGV0ZXMgb29mYS50eHQufjF+LAorICAgICAgICAgIG9vZmEudHh0Ln4yfiwgYW5kIG9vZmEudHh0Ln4xMH4sIGFuZCBrZWVwcyBvb2ZhLnR4dCwKKyAgICAgICAgICBvb2ZhLnR4dC5+MTJ+LCBhbmQgb29mYS50eHQufjEwMH4uIElmIC9LRUVQIGlzIGdpdmVuIHdpdGhvdXQgYQorICAgICAgICAgIG51bWJlciwgb25lICh0aGUgaGlnaGVzdCBudW1iZXJlZCkgYmFja3VwIGZpbGUgaXMga2VwdC4KKworICAgQ0FVVElPTjogVGhlIFBVUkdFIGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuICoufip+IGZpbGVzIHRydWx5CisgICBhcmUgYmFja3VwIGZpbGVzLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBFTUFDUywgYW5kIGl0IGlzIHRoZSBERUZBVUxUCisgICBmb3IgQy1LZXJtaXQuIEhvd2V2ZXIsIGlmIEMtS2VybWl0J3MgRklMRSBDT0xMSVNJT04gaGFzIGJlZW4gc2V0IHRvCisgICBSRU5BTUUsIG5ld2x5IHJlY2VpdmVkIGZpbGVzIHdpbGwgbG9vayBsaWtlIGJhY2t1cCBmaWxlcy4gSW4gdGhhdAorICAgY2FzZSwgZG9uJ3QgdXNlIHRoZSBQVVJHRSBjb21tYW5kIG9yIHlvdSdsbCBiZSByZW1vdmluZyBuZXcgZmlsZXMKKyAgIHJhdGhlciB0aGFuIG9sZCBvbmVzLiAoVXNlIFNIT1cgRklMRSB0byBmaW5kIHRoZSBGSUxFIENPTExJU0lPTgorICAgc2V0dGluZy4pCisKKyAgIFRoZSBQVVJHRSBjb21tYW5kIGlzIHByZXNlbnRseSBhdmFpbGFibGUgb25seSBpbiBVTklYLiBUaGUgY29tbWFuZAorICAgc3VjY2VlZHMgaWYgaXQgZGVsZXRlZCBhbnkgZmlsZXMsIG9yIGlmIGl0IGRlbGV0ZWQgbm8gZmlsZXMgYnV0IHRoZXJlCisgICB3ZXJlIG5vIGVycm9ycy4gSXQgZmFpbHMgaWYgaXQgZGVsZXRlZCBubyBmaWxlcyBhbmQgdGhlcmUgd2VyZSBlcnJvcnMKKyAgIChpLmUuIGRlbGV0aW9uIHdhcyBhdHRlbXB0ZWQgYnV0IGZhaWxlZCkuIEluIFZNUywgYmFja3VwIGZpbGUgdmVyc2lvbnMKKyAgIGFyZSBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIE9TLCBhbmQgYSBQVVJHRSBjb21tYW5kIGNhbiBiZSB1c2VkCisgICBhdCB0aGUgVk1TIHByb21wdCB0byBjbGVhbiB0aGVtIHVwLgorCisgICBJZiB5b3Ugd2FudCBjZXJ0YWluIHN3aXRjaGVzIHRvIGJlIHN1cHBsaWVkIGF1dG9tYXRpY2FsbHkgd2l0aCBlYWNoCisgICBERUxFVEUgb3IgUFVSR0UgY29tbWFuZCwgeW91IGNhbiBzZXQgdGhlbSB3aXRoIFNFVCBPUFRJT05TCisgICAoWzQ3Ml1TZWN0aW9uIDEuNS41KSBhbmQgeW91IGNhbiBkaXNwbGF5IGFueSBzdWNoIHNldHRpbmdzIHdpdGggU0hPVworICAgT1BUSU9OUy4gT2YgY291cnNlIHlvdSBjYW4gb3ZlcnJpZGUgdGhlbSBvbiBhIHBlci1jb21tYW5kIGJhc2lzIGJ5CisgICBpbmNsdWRpbmcgc3dpdGNoZXMgaW4geW91ciBQVVJHRSBvciBERUxFVEUgY29tbWFuZC4KKworICAgQWxzbyBzZWUgU0VUIEZJTEUgQ09MTElTSU9OLCBTSE9XIEZJTEUsIFNFTkQgL05PQkFDS1VQLCBTRVQgU0VORAorICAgQkFDS1VQLCBhbmQgRElSRUNUT1JZIC9bTk9dQkFDS1VQLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDQuNi4gU3RhcnRpbmcgdGhlIFJlbW90ZSBLZXJtaXQgU2VydmVyIEF1dG9tYXRpY2FsbHkKKworICAgQXMgbm90ZWQgb24gcGFnZXMgMjc1LTI3NiBvZiBbNDczXVVzaW5nIEMtS2VybWl0IDJuZCBlZGl0aW9uLCB5b3UgY2FuCisgICBoYXZlIEtlcm1pdCBzZW5kICJrZXJtaXQgcmVjZWl2ZSIgY29tbWFuZHMgYXV0b21hdGljYWxseSB3aGVuIGl0IGlzIGluCisgICBsb2NhbCBtb2RlIGFuZCB5b3UgZ2l2ZSBhIFNFTkQgb3Igc2ltaWxhciBjb21tYW5kLCB0byBzdGFydCB0aGUgcmVtb3RlCisgICBLZXJtaXQgcmVjZWl2ZXIgaW4gY2FzZSBpdCBpcyBub3QgYWxyZWFkeSBzdGFydGVkLiBUaGUgImtlcm1pdAorICAgcmVjZWl2ZSIgY29tbWFuZHMgYXJlIHNwZWNpZmllZCBieToKKworICBTRVQgUFJPVE9DT0wgS0VSTUlUIGJpbmFyeS1yZWNlaXZlLWNvbW1hbmQgdGV4dC1yZWNlaXZlLWNvbW1hbmQKKworICAgQXMgb2YgdmVyc2lvbiA3LjAsIGEgS2VybWl0IHByb3RvY29sIG9wdGlvbiBoYXMgYmVlbiBhZGRlZCB0byBzZW5kIGEKKyAgIHN0cmluZyB0byB0aGUgaG9zdCBpbiBhZHZhbmNlIG9mIGFueSBLZXJtaXQgcGFja2V0cyB3aGVuIHlvdSBnaXZlIGEKKyAgIEdFVC1jbGFzcyBvciBSRU1PVEUgY29tbWFuZC4gVGhpcyB3aWxsIHN3aXRjaCB0aGUgcmVtb3RlIEMtS2VybWl0IGludG8KKyAgIHRoZSBhcHByb3ByaWF0ZSBtb2RlIG9yLCBpZiB0aGUgcmVtb3RlIHN5c3RlbSBpcyBhdCBhIHN5c3RlbSBjb21tYW5kCisgICAoc2hlbGwpIHByb21wdCwgZXhlY3V0ZSB0aGUgc3RyaW5nIG9uIHRoZSByZW1vdGUgc3lzdGVtLiBUaGUgbmV3CisgICBzeW50YXggb2YgdGhlIFNFVCBQUk9UT0NPTCBLRVJNSVQgY29tbWFuZCBpczoKKworICBTRVQgUFJPVE9DT0wgS0VSTUlUIFsgczEgWyBzMiBbIHMzIF0gXSBdCisKKyAgIHdoZXJlOgorCisgICAgICAgRGVmYXVsdCAgICAgICAgIE1lYW5pbmcKKyAgczEgIHtrZXJtaXQgLWlyfSAgICAgUmVtb3RlICJrZXJtaXQgcmVjZWl2ZSBpbiBiaW5hcnkgbW9kZSIgY29tbWFuZC4KKyAgczIgIHtrZXJtaXQgLXJ9ICAgICAgUmVtb3RlICJrZXJtaXQgcmVjZWl2ZSBpbiB0ZXh0IG1vZGUiIGNvbW1hbmQuCisgIHMzICB7a2VybWl0IC14fSAgICAgIFJlbW90ZSAic3RhcnQga2VybWl0IHNlcnZlciIgY29tbWFuZC4KKworICAgTk9URTogSWYgdGhlIHJlbW90ZSBLZXJtaXQgaXMgNi4wLCB0aGUgZm9sbG93aW5nIGFyZSByZWNvbW1lbmRlZCBmb3IKKyAgIGZhc3Qgc3RhcnR1cCBhbmQgaGlnaC1wZXJmb3JtYW5jZSBmaWxlIHRyYW5zZmVyIChzZWUgQXBwZW5kaXggSSBpbgorICAgWzQ3NF1Vc2luZyBDLUtlcm1pdCwgc2Vjb25kIEVkaXRpb24sIGZvciBjb21tYW5kLWxpbmUgb3B0aW9ucyk6CisKKyAgczEgICBrZXJtaXQgLVlRaXIgICAoS2VybWl0IHJlY2VpdmUgYmluYXJ5LCBza2lwIGluaXQgZmlsZSwgZmFzdC4pCisgIHMyICAga2VybWl0IC1ZUVRyICAgKEtlcm1pdCByZWNlaXZlIHRleHQsIHNraXAgaW5pdCBmaWxlLCBmYXN0LikKKyAgczMgICBrZXJtaXQgLVlReCAgICAoS2VybWl0IHNlcnZlciwgc2tpcCBpbml0IGZpbGUsIGZhc3QuKQorCisgICBJZiB0aGUgcmVtb3RlIGlzIEMtS2VybWl0IDcuMCBvciBsYXRlciwgY2hhbmdlIHRoZSAteCBvcHRpb24gKGVudGVyCisgICBzZXJ2ZXIgbW9kZSkgdG8gLU8gKHVwcGVyY2FzZSBsZXR0ZXIgTyksIHdoaWNoIG1lYW5zICJlbnRlciBzZXJ2ZXIKKyAgIG1vZGUgZm9yIE9uZSB0cmFuc2FjdGlvbiBvbmx5KTsgdGhpcyB3YXksIGl0IGlzIG5vdCBzdHVjayBpbiBzZXJ2ZXIKKyAgIGFmdGVyIHRoZSB0cmFuc2Zlci4gQWxzbyBub3RlIHRoYXQgdGhlIFEgaXMgcmVkdW5kYW50IGluIHZlcnNpb24gNy4wLAorICAgc2luY2UgZmFzdCBLZXJtaXQgcHJvdG9jb2wgc2V0dGluZ3MgYXJlIG5vdyB0aGUgZGVmYXVsdC4KKworICAgTm90ZSB0aGF0IGluIGNhc2UgdGhlIEMtS2VybWl0IGV4ZWN1dGFibGUgaXMgY2FsbGVkICJ3ZXJtaXQiIG9yCisgICAiY2tlcm1pdCIgeW91IGNhbiBjaGFuZ2UgImtlcm1pdCIgaW4gdGhlIHN0cmluZ3MgYWJvdmUgdG8gIndlcm1pdCIgb3IKKyAgICJja2VybWl0IiBhbmQgQy1LZXJtaXQgNy4wIG9yIGxhdGVyIHdpbGwgcmVjb2duaXplIHRoZXNlIGFzIHN5bm9ueW1zCisgICBmb3IgImtlcm1pdCIsIGluIGNhc2UgaXQgaXMgYXQgaXRzIGNvbW1hbmQgcHJvbXB0IHdoZW4gb25lIG9mIHRoZXNlCisgICBzdHJpbmdzIGlzIHNlbnQgdG8gaXQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC43LiBGaWxlLVRyYW5zZmVyIENvbW1hbmQgU3dpdGNoZXMKKworICAgT3ZlciB0aGUgeWVhcnMsIHZhcmlvdXMgbmV3IG1ldGhvZHMgb2YgdHJhbnNmZXJyaW5nIGEgZmlsZSBoYXZlCisgICBhY2N1bXVsYXRlZCwgdW50aWwgd2UgaGFkLCBpbiBhZGRpdGlvbiB0byB0aGUgU0VORCBjb21tYW5kLCBhbHNvIE1PVkUKKyAgIChzZW5kIGFuZCB0aGVuIGRlbGV0ZSksIE1BSUwgKHNlbmQgYXMgZW1haWwpLCBSRU1PVEUgUFJJTlQgKHNlbmQgdG8gYmUKKyAgIHByaW50ZWQpLCBDU0VORCAoc2VuZCB0aGUgb3V0cHV0IG9mIGEgY29tbWFuZCksIFBTRU5EIChzZW5kIGEgcGFydCBvZgorICAgYSBmaWxlKSwgQlNFTkQgKHNlbmQgaW4gYmluYXJ5IG1vZGUpLCBSRVNFTkQgKHJlc3VtZSBhbiBpbnRlcnJ1cHRlZAorICAgU0VORCksIGV0YyBldGMuIFNpbWlsYXJseTogR0VULCBSRUdFVCwgQ0dFVCwgUkVUUklFVkUsIGFuZCBzbyBvbi4KKworICAgTm90IG9ubHkgaXMgaXQgY29uZnVzaW5nIHRvIGhhdmUgZGlmZmVyZW50IG5hbWVzIGZvciB0aGVzZSBjb21tYW5kcywKKyAgIG1hbnkgb2Ygd2hpY2ggYXJlIG5vdCByZWFsIHdvcmRzLCBidXQgdGhpcyBhbHNvIGRvZXMgbm90IGFsbG93IGFsbAorICAgY29tYmluYXRpb25zLCBsaWtlICJzZW5kIGEgZmlsZSBhcyBtYWlsLCB0aGVuIGRlbGV0ZSBpdCIuCisKKyAgIEluIEMtS2VybWl0IDcuMCwgdGhlIFNFTkQsIEdFVCwgYW5kIFJFQ0VJVkUgY29tbWFuZHMgd2VyZSByZXN0cnVjdHVyZWQKKyAgIHRvIGFjY2VwdCBtb2RpZmllciBzd2l0Y2hlcyAoc3dpdGNoZXMgYXJlIGV4cGxhaW5lZCBpbiBbNDc1XVNlY3Rpb24KKyAgIDEuNSkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjcuMS4gU0VORCBDb21tYW5kIFN3aXRjaGVzCisKKyAgIFdpdGhvdXQgc3dpdGNoZXMsIHRoZSBTRU5EIGNvbW1hbmQgc3RpbGwgd29ya3MgZXhhY3RseSBhcyBiZWZvcmU6CisKKyAgc2VuZCBvb2ZhLnR4dCAgICAgIDsgc2VuZCBhIHNpbmdsZSBmaWxlCisgIHNlbmQgb29mYS4qICAgICAgICA7IHNlbmQgbXVsdGlwbGUgZmlsZXMKKyAgc2VuZCBvb2ZhLnR4dCB4LnggIDsgc2VuZCBvb2ZhLnR4dCBhcyB4LnggKHRlbGwgcmVjZWl2ZXIgaXRzIG5hbWUgaXMgeC54KQorICBzZW5kICAgICAgICAgICAgICAgOyBzZW5kIGZyb20gU0VORC1MSVNUCisKKyAgIEJ1dCBub3cgdGhlIGZvbGxvd2luZyBtb2RpZmllciBzd2l0Y2hlcyBtYXkgYmUgaW5jbHVkZWQgYmV0d2VlbiAic2VuZCIKKyAgIGFuZCB0aGUgZmlsZW5hbWUuIFplcm8sIG9uZSwgdHdvLCBvciBtb3JlIHN3aXRjaGVzIG1heSBiZSBpbmNsdWRlZCBpbgorICAgYW55IGNvbWJpbmF0aW9uIHRoYXQgbWFrZXMgc2Vuc2UuIFN3aXRjaCBuYW1lcyAoc3VjaCBhcyAvQklOQVJZKSBjYW4KKyAgIGJlIGFiYnJldmlhdGVkLCBqdXN0IGxpa2UgYW55IG90aGVyIGtleXdvcmRzLiBNb3N0IG9mIHRoZXNlIHN3aXRjaGVzCisgICB3b3JrIG9ubHkgd2hlbiB1c2luZyBLZXJtaXQgcHJvdG9jb2wgKC9URVhUIGFuZCAvQklOQVJZIGFyZSB0aGUKKyAgIGV4Y2VwdGlvbnMpLgorCisgICAvQUZURVI6ZGF0ZS10aW1lCisgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgb25seSB0aG9zZSBmaWxlcyBtb2RpZmllZCAob3IsIGluIFZNUywgY3JlYXRlZCkKKyAgICAgICAgICBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS10aW1lIChzZWUgWzQ3Nl1TZWN0aW9uIDEuNikgYXJlIHRvIGJlCisgICAgICAgICAgc2VudC4gRXhhbXBsZXM6CisKKyAgc2VuZCAvdGV4dCAvYWZ0ZXI6ezItRmViLTE5OTcgMTA6Mjg6MzB9ICoudHh0CisgIHNlbmQgL3RleHQgL2FmdGVyOlxmZGF0ZShvb2ZhLnR4dCkgKi50eHQKKworICAgICAgICAgIFN5bm9ueW06IC9TSU5DRS4KKworICAgL0FSUkFZOmFycmF5bmFtZQorICAgICAgICAgIFNwZWNpZmllcyB0aGF0IGluc3RlYWQgb2Ygc2VuZGluZyBhIGZpbGUsIEMtS2VybWl0IGlzIHRvIHNlbmQKKyAgICAgICAgICB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGFycmF5LiBTaW5jZSBhbiBhcnJheSBkb2VzIG5vdCBoYXZlIGEKKyAgICAgICAgICBmaWxlbmFtZSwgeW91IHNob3VsZCBpbmNsdWRlIGFuIC9BUy1OQU1FIHN3aXRjaCB0byBzcGVjaWZ5IHRoZQorICAgICAgICAgIG5hbWUgdW5kZXIgd2hpY2ggdGhlIGFycmF5IGlzIHRvIGJlIHNlbnQgKGlmIHlvdSBkbyBub3QsIHRoZQorICAgICAgICAgIG5hbWUgIl9hcnJheV94XyIgaXMgdXNlZCwgd2hlcmUgJ3gnIGlzIHJlcGxhY2VkIGJ5IHRoZSBhcnJheQorICAgICAgICAgIGRlc2lnbmF0b3IpLiBTZWUgWzQ3N11zZWN0aW9uIDcuMTAgZm9yIGFycmF5LW5hbWUgc3ludGF4LiBBcworICAgICAgICAgIG5vdGVkIGluIHRoYXQgc2VjdGlvbiwgeW91IGNhbiBhbHNvIGluY2x1ZGUgYSByYW5nZSB0byBoYXZlIGEKKyAgICAgICAgICBzZWdtZW50IG9mIHRoZSBhcnJheSBzZW50LCByYXRoZXIgdGhhbiB0aGUgd2hvbGUgdGhpbmc7IGZvcgorICAgICAgICAgIGV4YW1wbGU6ICJzZW5kIC9hcnJheTomYVsxMDA6MTk5XSIuIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkCisgICAgICAgICAgdGhhdCB5b3UgYWNjb21wYW55IHRoZSAvQVJSQVkgc3dpdGNoIHdpdGggYSAvVEVYVCBvciAvQklOQVJZCisgICAgICAgICAgc3dpdGNoIHRvIGZvcmNlIHRoZSBkZXNpcmVkIHRyYW5zZmVyIG1vZGUsIHNpbmNlIG90aGVyd2lzZSB0aGUKKyAgICAgICAgICB2YXJpb3VzIGF1dG9tYXRpYyBtZWNoYW5pc21zIG1pZ2h0IHN3aXRjaCB0byBiaW5hcnkgbW9kZSB3aGVuCisgICAgICAgICAgeW91IHJlYWxseSB3YW50ZWQgdGV4dCwgb3IgdmljZSB2ZXJzYS4gSW4gdGV4dCBtb2RlIGEgbGluZQorICAgICAgICAgIHRlcm1pbmF0b3IgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiBlYWNoIGFycmF5IGVsZW1lbnQsIGJ1dCBub3QKKyAgICAgICAgICBpbiBiaW5hcnkgbW9kZS4gRm9yIGRldGFpbHMgYW5kIGV4YW1wbGVzIHNlZSBbNDc4XVNlY3Rpb24KKyAgICAgICAgICA3LjEwLjExLgorCisgICAvQVMtTkFNRTp0ZXh0CisgICAgICAgICAgU3BlY2lmaWVzICJ0ZXh0IiBhcyB0aGUgbmFtZSB0byBzZW5kIHRoZSBmaWxlIHVuZGVyLiBZb3UgY2FuCisgICAgICAgICAgYWxzbyBzdGlsbCBzcGVjaWZ5IHRoZSBhcy1uYW1lIGFzIHRoZSBzZWNvbmQgZmlsZW5hbWUgb24gdGhlCisgICAgICAgICAgU0VORCBjb21tYW5kIGxpbmUuIFRoZSBmb2xsb3dpbmcgdHdvIGNvbW1hbmRzIGFyZSBlcXVpdmFsZW50OgorCisgIHNlbmQgb29mYS50eHQgb29mYS5uZXcKKyAgc2VuZCAvYXM6b29mYS5uZXcgb29mYS50eHQKKworICAgL0JFRk9SRTpkYXRlLXRpbWUKKyAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIG1vZGlmaWVkIChvciwgaW4gVk1TLCBjcmVhdGVkKQorICAgICAgICAgIGJlZm9yZSB0aGUgZ2l2ZW4gZGF0ZS10aW1lIChbNDc5XVNlY3Rpb24gMS42KSBhcmUgdG8gYmUgc2VudC4KKworICAgL0JJTkFSWQorICAgICAgICAgIFBlcmZvcm1zIHRoaXMgdHJhbnNmZXIgaW4gYmluYXJ5IG1vZGUgd2l0aG91dCBhZmZlY3RpbmcgdGhlCisgICAgICAgICAgZ2xvYmFsIHRyYW5zZmVyIG1vZGUsIG92ZXJyaWRpbmcgbm90IG9ubHkgdGhlIEZJTEUgVFlQRSBhbmQKKyAgICAgICAgICBUUkFOU0ZFUiBNT0RFIHNldHRpbmdzLCBidXQgYWxzbyB0aGUgRklMRSBQQVRURVJOIHNldHRpbmcsIGJ1dAorICAgICAgICAgIGZvciB0aGlzIFNFTkQgY29tbWFuZCBvbmx5LiBJbiBvdGhlciB3b3JkcywgU0VORCAvQklOQVJZIG1lYW5zCisgICAgICAgICAgd2hhdCBpdCBzYXlzOiBzZW5kIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlLCByZWdhcmRsZXNzIG9mIGFueQorICAgICAgICAgIG90aGVyIHNldHRpbmdzLiBFeGFtcGxlOgorCisgIHNldCBmaWxlIHR5cGUgdGV4dCAgICAgIDsgU2V0IGdsb2JhbCB0cmFuc2ZlciBtb2RlIHRvIHRleHQKKyAgc2VuZCAvYmluYXJ5IG9vZmEuemlwICAgOyBTZW5kIGEgZmlsZSBpbiBiaW5hcnkKKyAgc2VuZCBvb2ZhLnR4dCAgICAgICAgICAgOyBUaGlzIG9uZSBpcyBzZW50IGluIHRleHQgbW9kZQorCisgICAvQ09NTUFORAorICAgICAgICAgIFNFTkQgL0NPTU1BTkQgaXMgZXF1aXZhbGVudCB0byBDU0VORCAoWzQ4MF1TZWN0aW9uIDQuMi4yKSAtLSBpdAorICAgICAgICAgIHNheXMgdG8gc2VuZCB0aGUgb3V0cHV0IGZyb20gYSBjb21tYW5kLCByYXRoZXIgdGhhbiB0aGUKKyAgICAgICAgICBjb250ZW50cyBvZiBhIGZpbGUuIFRoZSBmaXJzdCAiZmlsZW5hbWUiIG9uIHRoZSBTRU5EIGNvbW1hbmQKKyAgICAgICAgICBsaW5lIGlzIGludGVycHJldGVkIGFzIHRoZSBuYW1lIG9mIGEgY29tbWFuZDsgdGhlIHNlY29uZCAoaWYKKyAgICAgICAgICBhbnkpIGlzIHRoZSBhcy1uYW1lLiBFeGFtcGxlczoKKworICBzZW5kIC9jb21tYW5kIHtncmVwIFN1bmRheSBvb2ZhLnR4dH0gc3VuZGF5LnR4dAorICBzZW5kIC9hcy1uYW1lOnN1bmRheS50eHQgL2NvbW1hbmQge2dyZXAgU3VuZGF5IG9vZmEudHh0fQorICBzZW5kIC9iaW4gL2NvbW1hbmQge3RhciBjZiAtIC4gfCBnemlwIC1jfSB7IWd1bnppcCAtYyB8IHRhciB4ZiAtfQorCisgICAvREVMRVRFCisgICAgICAgICAgRGVsZXRlcyB0aGUgZmlsZSAob3IgZWFjaCBmaWxlIGluIHRoZSBncm91cCkgYWZ0ZXIgaXQgaGFzIGJlZW4KKyAgICAgICAgICBzZW50IHN1Y2Nlc3NmdWxseSAoYnV0IGRvZXMgbm90IGRlbGV0ZSBpdCBpZiBpdCB3YXMgbm90IHNlbnQKKyAgICAgICAgICBzdWNjZXNzZnVsbHkpLiBTRU5EIC9ERUxFVEUgaXMgZXF1aXZhbGVudCB0byBNT1ZFLiBIYXMgbm8KKyAgICAgICAgICBlZmZlY3Qgd2hlbiB1c2VkIHdpdGggL0NPTU1BTkQuIEV4YW1wbGU6CisKKyAgc2VuZCAvZGVsZXRlICoubG9nCisKKyAgIC9ET1RGSUxFUworICAgICAgICAgIChVTklYIGFuZCBPUy05IG9ubHkpIE5vcm1hbGx5IGZpbGVzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggIi4iCisgICAgICAgICAgYXJlIHNraXBwZWQgd2hlbiBtYXRjaGluZyB3aWxkY2FyZHMgdGhhdCBkbyBub3QgYWxzbyBiZWdpbmcKKyAgICAgICAgICB3aXRoICIuIi4gSW5jbHVkZSAvRE9URklMRVMgdG8gZm9yY2UgdGhlc2UgZmlsZXMgdG8gYmUgaW5jbHVkZWQKKyAgICAgICAgICB0b28uCisKKyAgIC9SRUNVUlNJVkUKKyAgICAgICAgICBEZXNjZW5kIHRoZSB0aHJvdWdoIHRoZSBkaXJlY3RvcnkgdHJlZSB3aGVuIGxvY2F0aW5nIGZpbGVzIHRvCisgICAgICAgICAgc2VuZC4gQXV0b21hdGljYWxseSBzZXRzIC9QQVRITkFNRVM6UkVMQVRJVkUuIEV4cGxhaW5lZCBpbgorICAgICAgICAgIFs0ODFdU2VjdGlvbiA0LjExIC4KKworICAgL0VYQ0VQVDpwYXR0ZXJuCisgICAgICAgICAgU2VlIFs0ODJdU2VjdGlvbiAxLjUuNC4KKworICAgL05PQkFDS1VQCisgICAgICAgICAgVGhpcyBtZWFucyB0byBza2lwIGJhY2t1cCBmaWxlcyB3aGVuIHNlbmRpbmcsIGV2ZW4gaWYgdGhleQorICAgICAgICAgIG1hdGNoIHRoZSBTRU5EIGZpbGUgc3BlY2lmaWNhdGlvbi4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHVzaW5nCisgICAgICAgICAgU0VORCAvRVhDRVBUIGFuZCBpbmNsdWRpbmcgKi5+WzAtOV0qfiBpbiB0aGUgZXhjZXB0aW9uIGxpc3QgKG9yCisgICAgICAgICAgKi5+Kn4gaWYgS2VybWl0IHdhcyBidWlsdCB3aXRob3V0IHBhdHRlcm4tbWF0Y2hpbmcgc3VwcG9ydDsgc2VlCisgICAgICAgICAgWzQ4M11TZWN0aW9uIDQuOS4xKS4gSW5jbHVkaW5nIHRoaXMgc3dpdGNoIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgICAgICBnaXZpbmcgU0VUIFNFTkQgQkFDS1VQIE9GRiAoWzQ4NF1TZWN0aW9uIDQuMC42KSBwcmlvciB0byBTRU5ELAorICAgICAgICAgIGV4Y2VwdCBpdHMgZWZmZWN0IGlzIGxvY2FsIHRvIHRoZSBTRU5EIGNvbW1hbmQgd2l0aCB3aGljaCBpdAorICAgICAgICAgIHdhcyBnaXZlbi4KKworICAgL05PRE9URklMRVMKKyAgICAgICAgICBUaGUgb3Bwb3NpdGUgb2YgL0RPVEZJTEVTIChxLnYuKQorCisgICAvRklMRU5BTUVTOntDT05WRVJURUQsTElURVJBTH0KKyAgICAgICAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gb3ZlcnJpZGUgdGhlIGN1cnJlbnQgZ2xvYmFsIFNFVCBGSUxFIE5BTUVTCisgICAgICAgICAgc2V0dGluZyBmb3IgdGhpcyB0cmFuc2ZlciBvbmx5LgorCisgICAvRklMVEVSOmNvbW1hbmQKKyAgICAgICAgICBUaGlzIHNwZWNpZmllcyBhIGZpbHRlciB0byBwYXNzIHRoZSBmaWxlIHRocm91Z2ggYmVmb3JlIHNlbmRpbmcKKyAgICAgICAgICBpdC4gU2VlIHRoZSBbNDg1XXNlY3Rpb24gb24gZmlsZS10cmFuc2ZlciBwaXBlcyBhbmQgZmlsdGVycy4KKyAgICAgICAgICBUaGUgL0ZJTFRFUiBzd2l0Y2ggYXBwbGllcyBvbmx5IHRvIHRoZSBmaWxlLXRyYW5zZmVyIGNvbW1hbmQgaXQKKyAgICAgICAgICBpcyBnaXZlbiB3aXRoOyBpdCBkb2VzIG5vdCBhZmZlY3QgdGhlIGdsb2JhbCBTRU5EIEZJTFRFUgorICAgICAgICAgIHNldHRpbmcsIGlmIGFueS4KKworICAgL0lNQUdFCisgICAgICAgICAgVk1TOiBTZW5kcyBpbiBpbWFnZSBtb2RlLiBOb24tVk1TOiBzYW1lIGFzIC9CSU5BUlkuCisKKyAgIC9MQUJFTEVECisgICAgICAgICAgVk1TIGFuZCBPUy8yIG9ubHk6IFNlbmRzIGluIGxhYmVsZWQgbW9kZS4KKworICAgL0xBUkdFUi1USEFOOm51bWJlcgorICAgICAgICAgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgdGhhdCBhcmUgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuCisgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGFyZSB0byBiZSBzZW50LgorCisgICAvTElTVEZJTEU6ZmlsZW5hbWUKKyAgICAgICAgICBTcGVjaWZpZXMgdGhhdCB0aGUgZmlsZXMgdG8gYmUgc2VudCBhcmUgbGlzdGVkIGluIGEgZmlsZSB3aXRoCisgICAgICAgICAgdGhlIGdpdmVuIGZpbGVuYW1lLiBUaGUgZmlsZSBjb250YWlucyBvbmUgZmlsZW5hbWUgcGVyIGxpbmUuCisgICAgICAgICAgVGhlc2UgZmlsZW5hbWVzIGFyZSBub3QgY2hlY2tlZCBpbiBhbnkgd2F5OyBlYWNoIGZpbGVuYW1lIGlzCisgICAgICAgICAgdGFrZW4gYW5kIGRvZXMgbm90IHVzZSBvciBkZXBlbmQgb24gYW55IEtlcm1pdC1zcGVjaWZpYyBzeW50YXguCisgICAgICAgICAgSW4gcGFydGljdWxhciwgYmFja3NsYXNoZXMgYXJlIG5vdCB0cmVhdGVkIHNwZWNpYWxseSwgbGVhZGluZworICAgICAgICAgIGFuZCB0cmFpbGluZyBzcGFjZXMgYXJlIG5vdCBzdHJpcHBlZCwgZXRjLiBIb3dldmVyLCBpZiBhCisgICAgICAgICAgZmlsZW5hbWUgY29udGFpbnMgd2lsZGNhcmRzLCB0aGV5IGFyZSBleHBhbmRlZC4gRXhhbXBsZTogSWYgYQorICAgICAgICAgIGZpbGUgbmFtZWQgZmlsZXMudHh0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGluZXM6CisKKyAgYmxhaC50eHQKKyAgb29mYSoKKyAgeC54CisKKyAgICAgICAgICAoYnV0IHdpdGhvdXQgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMpLCB0aGVuIHRoZSBDLUtlcm1pdAorICAgICAgICAgIGNvbW1hbmQgInNlbmQgL2xpc3RmaWxlOmZpbGVzLnR4dCIgd2lsbCBzZW5kIHRoZSBmaWxlcworICAgICAgICAgIGJsYWgudHh0LCB4LngsIGFuZCBhbGwgZmlsZXMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCAib29mYSIsCisgICAgICAgICAgYXNzdW1pbmcgdGhlIGZpbGVzIGV4aXN0IGFuZCBhcmUgcmVhZGFibGUuIFRoZSAvTElTVEZJTEUKKyAgICAgICAgICBzd2l0Y2gsIGNhbiwgb2YgY291cnNlLCBiZSB1c2VkIHdpdGggb3RoZXIgc3dpdGNoZXMgd2hlbiBpdAorICAgICAgICAgIG1ha2VzIHNlbnNlLCBmb3IgZXhhbXBsZSwgL0VYQ0VQVCwgL0JJTkFSWSwgL0FGVEVSLCAvU01BTExFUiwKKyAgICAgICAgICAvTU9WRS1UTywgL0RFTEVURSwgL0FTLU5BTUUgd2l0aCBhIHRlbXBsYXRlLCBldGMuCisKKyAgIC9NQUlMOmFkZHJlc3MKKyAgICAgICAgICBTZW5kcyB0aGUgZmlsZSBhcyBlLW1haWwgdG8gdGhlIGdpdmVuIGFkZHJlc3Mgb3IgYWRkcmVzc2VzLgorICAgICAgICAgICJzZW5kIC9tYWlsOmFkZHJlc3MgZmlsZW5hbWUiIGlzIGVxdWl2YWxlbnQgdG8gIm1haWwgZmlsZW5hbWUKKyAgICAgICAgICBhZGRyZXNzIi4gWW91IGNhbiBpbmNsdWRlIG11bHRpcGxlIGFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkKKyAgICAgICAgICBjb21tYXMuIEV4YW1wbGVzOgorCisgIHNlbmQgL21haWw6a2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1IHBhY2tldC5sb2cKKyAgc2VuZCAvbWFpbDpjbWcsZmRjLGpyZCBvb2ZhLnR4dAorCisgICAgICAgICAgQXMgd2l0aCBhbnkgc3dpdGNoIGFyZ3VtZW50LCBpZiB0aGUgYWRkcmVzcyBvciBhZGRyZXNzIGxpc3QKKyAgICAgICAgICBjb250YWlucyBhbnkgc3BhY2VzLCB5b3UgbXVzdCBlbmNsb3NlIGl0IGluIGJyYWNlcy4gVGhlIGZvcm1hdAorICAgICAgICAgIG9mIHRoZSBhZGRyZXNzZXMgbXVzdCBhZ3JlZSB3aXRoIHRoYXQgdW5kZXJzdG9vZCBieSB0aGUKKyAgICAgICAgICBtYWlsLXNlbmRpbmcgcHJvZ3JhbSBvbiB0aGUgcmVjZWl2ZXIncyBjb21wdXRlci4KKworICAgL01PVkUtVE86ZGlyZWN0b3J5LW5hbWUKKyAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBhZnRlciBlYWNoIChvciB0aGUgb25seSkgc291cmNlIGZpbGUgaXMgc2VudAorICAgICAgICAgIHN1Y2Nlc3NmdWxseSwgYW5kIE9OTFkgaWYgaXQgaXMgc2VudCBzdWNjZXNzZnVsbHksIGl0IHNob3VsZCBiZQorICAgICAgICAgIG1vdmVkIHRvIHRoZSBuYW1lZCBkaXJlY3RvcnkuIElmIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWlucworICAgICAgICAgIHNwYWNlcywgZW5jbG9zZSBpdCBpbiBicmFjZXMuIElmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsCisgICAgICAgICAgaXQgaXMgY3JlYXRlZCBpZiBwb3NzaWJsZTsgaWYgaXQgY2FuJ3QgYmUgY3JlYXRlZCwgdGhlIGNvbW1hbmQKKyAgICAgICAgICBmYWlscyBhbmQgYW4gZXJyb3IgbWVzc2FnZSBpcyBwcmludGVkLiBFeGFtcGxlOgorCisgIHNlbmQgL3RleHQgL21vdmUtdG86L3VzZXJzL29sZ2EvYmFja3VwLyAqLnR4dAorCisgICAvTk9ULUFGVEVSOmRhdGUtdGltZQorICAgICAgICAgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgbW9kaWZpZWQgYXQgb3IgYmVmb3JlIHRoZSBnaXZlbgorICAgICAgICAgIGRhdGUgYW5kIHRpbWUgYXJlIHRvIGJlIHNlbnQuCisKKyAgIC9OT1QtQkVGT1JFOmRhdGUtdGltZQorICAgICAgICAgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgbW9kaWZpZWQgYXQgb3IgYWZ0ZXIgdGhlIGdpdmVuCisgICAgICAgICAgZGF0ZSBhbmQgdGltZSBhcmUgdG8gYmUgc2VudC4KKworICAgL1BBVEhOQU1FUzp7T0ZGLEFCU09MVVRFLFJFTEFUSVZFfQorICAgICAgICAgIFVzZSB0aGlzIHN3aXRjaCB0byBvdmVycmlkZSB0aGUgY3VycmVudCBnbG9iYWwgU0VUIFNFTkQKKyAgICAgICAgICBQQVRITkFNRVMgc2V0dGluZyBmb3IgdGhpcyB0cmFuc2ZlciBvbmx5LiAvUEFUSE5BTUVTOkFCU09MVVRFCisgICAgICAgICAgb3IgUkVMQVRJVkUgYWxzbyBzZXRzIC9GSUxFTkFNRVM6TElURVJBTCAoYWxzbyBmb3IgdGhpcworICAgICAgICAgIHRyYW5zZmVyIG9ubHkpIHNpbmNlIHBhdGhuYW1lcyBhcmUgbm90IHNlbnQgb3RoZXJ3aXNlLgorCisgICAvUkVOQU1FLVRPOnRleHQKKyAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBhZnRlciB0aGUgKG9yIGVhY2gpIHNvdXJjZSBmaWxlIGlzIHNlbnQKKyAgICAgICAgICBzdWNjZXNzZnVsbHksIGFuZCBPTkxZIGlmIGl0IGlzIHNlbnQgc3VjY2Vzc2Z1bGx5LCBpdCBzaG91bGQgYmUKKyAgICAgICAgICByZW5hbWVkIHRvIHRoZSBuYW1lIGdpdmVuLiBJZiB0aGUgbmFtZSBjb250YWlucyBzcGFjZXMsIGVuY2xvc2UKKyAgICAgICAgICBpdCBpbiBicmFjZXMuIElmIGEgZmlsZSBncm91cCBpcyBiZWluZyBzZW50LCB0aGVuIHRoZSAidGV4dCIKKyAgICAgICAgICBtdXN0IGNvbnRhaW4gYSB2YXJpYWJsZSByZWZlcmVuY2Ugc3VjaCBhcyBcdihmaWxlbmFtZSkgKHNlZQorICAgICAgICAgIFs0ODZdU2VjdGlvbiA0LjEpLiBFeGFtcGxlOgorCisgIHNlbmQgL3JlbmFtZS10bzpva19cdihmaWxlbmFtZSkgKi4qCisKKyAgICAgICAgICBUaGlzIHNlbmRzIGVhY2ggZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGlmIGl0IHdhcworICAgICAgICAgIHNlbnQgc3VjY2Vzc2Z1bGx5LCBjaGFuZ2VzIGl0cyBuYW1lIHRvIGJlZ2luIHdpdGggIm9rXyIuCisKKyAgIC9TTUFMTEVSLVRIQU46bnVtYmVyCisgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgb25seSB0aG9zZSBmaWxlcyB0aGF0IGFyZSBzbWFsbGVyIHRoYW4gdGhlIGdpdmVuCisgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGFyZSB0byBiZSBzZW50LgorCisgICAvU1VCSkVDVDp0ZXh0CisgICAgICAgICAgU3ViamVjdCBmb3IgZW1haWwuIEFjdHVhbGx5LCB0aGlzIGlzIGp1c3QgYSBzeW5vbnltIGZvcgorICAgICAgICAgIC9BUy1OQU1FLiBJZiB0aGUgdGV4dCBpbmNsdWRlcyBzcGFjZXMsIHlvdSBtdXN0IGVuY2xvc2UgaXQgaW4KKyAgICAgICAgICBicmFjZXMuIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgc3ViamVjdCAob3IgYXMtbmFtZSksIHRoZSBuYW1lCisgICAgICAgICAgb2YgdGhlIGZpbGUgaXMgdXNlZCBhcyB0aGUgc3ViamVjdC4gRXhhbXBsZToKKworICBzZW5kIC9tYWlsOmtlcm1pdC1zdXBwb3J0QGNvbHVtYmlhLmVkdSAvc3Viajp7QXMgcmVxdWVzdGVkfSBwYWNrZXQubG9nCisKKyAgIC9QUklOVDpvcHRpb25zCisgICAgICAgICAgU2VuZHMgdGhlIGZpbGUgdG8gYmUgcHJpbnRlZCwgb3B0aW9uYWxseSBzcGVjaWZ5aW5nIG9wdGlvbnMgZm9yCisgICAgICAgICAgdGhlIHByaW50ZXIuIEVxdWl2YWxlbnQgdG8gUkVNT1RFIFBSSU5UIGZpbGVuYW1lIG9wdGlvbnMuCisgICAgICAgICAgRXhhbXBsZXM6CisKKyAgc2VuZCAvcHJpbnQgb29mYS50eHQgICAgICAgICAgICAgIDsgTm8gb3B0aW9ucy4KKyAgc2VuZCAvcHJpbnQ6L2NvcGllcz0zIG9vZmEudHh0ICAgIDsgIi9jb3BpZXM9MyIgaXMgYSBWTVMgUFJJTlQgc3dpdGNoLgorICBzZW5kIC9wcmludDotIzMgb29mYS50eHQgICAgICAgICAgOyAiLSMzIiBpcyBhIFVOSVggbHByIHN3aXRjaC4KKworICAgL1BST1RPQ09MOm5hbWUKKyAgICAgICAgICBVc2VzIHRoZSBnaXZlbiBwcm90b2NvbCB0byBzZW5kIHRoZSBmaWxlIChLZXJtaXQsIFptb2RlbSwgZXRjKQorICAgICAgICAgIGZvciB0aGlzIHRyYW5zZmVyIHdpdGhvdXQgY2hhbmdpbmcgZ2xvYmFsIHByb3RvY29sLiBPbmx5CisgICAgICAgICAgYXZhaWxhYmxlIGluIEtlcm1pdCA5NSwgVU5JWCwgYW5kIE9TLTkuIEV4YW1wbGU6CisKKyAgc2V0IHByb3RvY29sIGtlcm1pdCAgICAgICAgICAgICAgIDsgU2V0IGdsb2JhbCBwcm90b2NvbAorICBzZW5kIC9wcm90bzp6bW9kZW0gL2JpbiBvb2ZhLnppcCAgOyBTZW5kIGp1c3QgdGhpcyBmaWxlIHdpdGggWm1vZGVtCisgIHNlbmQgb29mYS50eHQgICAgICAgICAgICAgICAgICAgICA7IFRoaXMgZmlsZSBpcyBzZW50IHdpdGggS2VybWl0CisKKyAgIC9RVUlFVAorICAgICAgICAgIFdoZW4gc2VuZGluZyBpbiBsb2NhbCBtb2RlLCB0aGlzIHN1cHByZXNzZXMgdGhlIGZpbGUtdHJhbnNmZXIKKyAgICAgICAgICBkaXNwbGF5LgorCisgICAvUkVDT1ZFUgorICAgICAgICAgIFVzZWQgdG8gcmVjb3ZlciBmcm9tIGEgcHJldmlvdXNseSBpbnRlcnJ1cHRlZCB0cmFuc2ZlcjsgU0VORAorICAgICAgICAgIC9SRUNPVkVSIGlzIGVxdWl2YWxlbnQgdG8gUkVTRU5ELiBSZWNvdmVyeSBvbmx5IHdvcmtzIGluIGJpbmFyeQorICAgICAgICAgIG1vZGU7IFNFTkQgL1JFQ09WRVIgYW5kIFJFU0VORCBpbmNsdWRlIGFuIGltcGxpZWQgL0JJTkFSWQorICAgICAgICAgIHN3aXRjaC4gRXZlbiB0aGVuLCByZWNvdmVyeSB3aWxsIHN1Y2Nlc3NmdWwgb25seSBpZiAoYSkgdGhlCisgICAgICAgICAgb3JpZ2luYWwgKGludGVycnVwdGVkKSB0cmFuc2ZlciB3YXMgYWxzbyBpbiBiaW5hcnkgbW9kZSwgb3IgKGIpCisgICAgICAgICAgaWYgaXQgd2FzIGluIHRleHQgbW9kZSwgdGhlIHR3byBLZXJtaXQgcHJvZ3JhbXMgcnVuIG9uCisgICAgICAgICAgcGxhdGZvcm1zIHdoZXJlIHRleHQtbW9kZSB0cmFuc2ZlcnMgYXJlIG5vdCBsZW5ndGgtY2hhbmdpbmcuCisKKyAgIC9TVEFSVElORzpudW1iZXIKKyAgICAgICAgICBTdGFydHMgc2VuZGluZyB0aGUgZmlsZSBmcm9tIHRoZSBnaXZlbiBieXRlIHBvc2l0aW9uLiBTRU5ECisgICAgICAgICAgL1NUQVJUSU5HOm4gZmlsZW5hbWUgaXMgZXF1aXZhbGVudCB0byBQU0VORCBmaWxlbmFtZSBuLgorCisgICAvVEVYVAorICAgICAgICAgIFBlcmZvcm1zIHRoaXMgdHJhbnNmZXIgaW4gdGV4dCBtb2RlIHdpdGhvdXQgYWZmZWN0aW5nIHRoZQorICAgICAgICAgIGdsb2JhbCB0cmFuc2ZlciBtb2RlLCBvdmVycmlkaW5nIG5vdCBvbmx5IHRoZSBGSUxFIFRZUEUgYW5kCisgICAgICAgICAgVFJBTlNGRVIgTU9ERSBzZXR0aW5ncywgYnV0IGFsc28gdGhlIEZJTEUgUEFUVEVSTiBzZXR0aW5nLCBmb3IKKyAgICAgICAgICB0aGlzIFNFTkQgY29tbWFuZCBvbmx5LiBJbiBvdGhlciB3b3JkcywgU0VORCAvVEVYVCByZWFsbHkgc2VuZAorICAgICAgICAgIHRoZSBmaWxlIGluIHRleHQgbW9kZSwgcmVnYXJkbGVzcyBvZiBhbnkgb3RoZXIgc2V0dGluZ3Mgb3IKKyAgICAgICAgICBuZWdvdGlhdGlvbnMuCisKKyAgIEFib3V0IG1haWwuLi4gUmVmZXIgdG8gWzQ4N11TZWN0aW9uIDQuNy4xLiBUaGUgc2FtZSBydWxlcyBhcHBseSBhcyBmb3IKKyAgIGZpbGUgdHJhbnNmZXIuIElmIHlvdSBhcmUgbWFpbGluZyBtdWx0aXBsZSBmaWxlcywgeW91IGNhbid0IHVzZSBhbgorICAgYXMtbmFtZSAoaW4gdGhpcyBjYXNlLCBhIHN1YmplY3QpIHVubGVzcyBpdCBjb250YWlucyByZXBsYWNlbWVudAorICAgdmFyaWFibGVzIGxpa2UgXHYoZmlsZW51bSkuIEZvciBleGFtcGxlLCBpZiB5b3U6CisKKyAgc2VuZCAvbWFpbDpzb21lYm9keUB4eXouY29tICoudHh0CisKKyAgIFRoZW4gZWFjaCBmaWxlIHdpbGwgYXJyaXZlIGFzIGEgc2VwYXJhdGUgZW1haWwgbWVzc2FnZSB3aXRoIGl0cyBuYW1lCisgICBhcyB0aGUgc3ViamVjdC4gQnV0IGlmIHlvdToKKworICBzZW5kIC9tYWlsOnNvbWVib2R5QHh5ei5jb20gL3N1YmplY3Q6e0hlcmUgaXMgYSBmaWxlfSAqLnR4dAorCisgICBUaGVuIGVhY2ggZmlsZSBtZXNzYWdlIHdpbGwgaGF2ZSB0aGUgc2FtZSBzdWJqZWN0LCB3aGljaCBpcyBwcm9iYWJseQorICAgbm90IHdoYXQgeW91IHdhbnQuIFlvdSBjYW4gZ2V0IGFyb3VuZCB0aGlzIHdpdGggY29uc3RydWN0aW9ucyBsaWtlOgorCisgIHNlbmQgL21haWw6c29tZWJvZHlAeHl6LmNvbSAvc3ViamVjdDp7SGVyZSBpcyBcdihmaWxlbmFtZSl9ICoudHh0CisKKyAgIHdoaWNoIGVtYmVkIHRoZSBmaWxlbmFtZSBpbiB0aGUgc3ViamVjdC4KKworICAgVGhlIE1PVkUsIENTRU5ELCBNQUlMLCBhbmQgUkVTRU5EIGNvbW1hbmRzIG5vdyBhbHNvIGFjY2VwdCB0aGUgc2FtZQorICAgc3dpdGNoZXMuIEFuZCB0aGUgc3dpdGNoZXMgYXJlIGFsc28gb3BlcmF0aXZlIHdoZW4gc2VuZGluZyBmcm9tIGEKKyAgIFNFTkQtTElTVCAoc2VlIFs0ODhdVXNpbmcgQy1LZXJtaXQsIDJuZCBFZCwgcHAuMTkxLTE5MiksIHNvLCBmb3IKKyAgIGV4YW1wbGUsIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBTRU5EIC9QUklOVCBvciBTRU5EIC9NQUlMIGZyb20gYQorICAgU0VORC1MSVNULgorCisgICBUaGUgTVNFTkQgYW5kIE1NT1ZFIGNvbW1hbmRzIGFsc28gdGFrZSBzd2l0Y2hlcywgYnV0IG5vdCBhbGwgb2YgdGhlbS4KKyAgIFdpdGggdGhlc2UgY29tbWFuZHMsIHdoaWNoIHRha2UgYW4gYXJiaXRyYXJ5IGxpc3Qgb2YgZmlsZXNwZWNzLCB5b3UKKyAgIGNhbiB1c2UgL0JJTkFSWSwgL0RFTEVURSwgL01BSUwsIC9QUklOVCwgL1BST1RPQ09MLCAvUVVJRVQsIC9SRUNPVkVSLAorICAgYW5kIC9URVhUIChhbmQgL0lNQUdFIG9yIC9MQUJFTEVELCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtKS4gTU1PVkUKKyAgIGlzIGVxdWl2YWxlbnQgdG8gTVNFTkQgL0RFTEVURS4gKElmIHlvdSB3YW50IHRvIHNlbmQgYSBncm91cCBvZiBmaWxlcywKKyAgIGJ1dCBpbiBtaXhlZCB0cmFuc2ZlciBtb2RlcyB3aXRoIHBlci1maWxlIGFzLW5hbWVzLCB1c2UgQUREIFNFTkQtTElTVAorICAgYW5kIHRoZW4gU0VORC4pCisKKyAgIFRoZSBNU0VORC9NTU9WRSBzd2l0Y2hlcyBjb21lIGJlZm9yZSB0aGUgZmlsZW5hbWVzLCBhbmQgYXBwbHkgdG8gYWxsCisgICBvZiB0aGVtOgorCisgIG1zZW5kIC9wcmludCAvdGV4dCAqLmxvZyBvb2ZhLnR4dCAvZXRjL21vdGQKKworICAgSWYgeW91IHR5cGUgYW55IG9mIHRoZXNlIGNvbW1hbmRzIChTRU5ELCBDU0VORCwgTVNFTkQsIGV0YykgZm9sbG93ZWQKKyAgIGJ5IGEgcXVlc3Rpb24gbWFyayAoPyksIHlvdSB3aWxsIHNlZSBhIGxpc3Qgb2YgdGhlIHN3aXRjaGVzIHlvdSBjYW4KKyAgIHVzZS4gSWYgeW91IHdhbnQgdG8gc2VlIGEgbGlzdCBvZiBmaWxlbmFtZXMsIHlvdSdsbCBuZWVkIHRvIHR5cGUKKyAgIHNvbWV0aGluZyBsaWtlICJzZW5kIC4vPyIgKFVOSVgsIE9TLzIsIFdpbmRvd3MsIGV0YyksIG9yICJzZW5kIFtdPyIKKyAgIChWTVMpLCBldGMuIE9mIGNvdXJzZSwgeW91IGNhbiBhbHNvIHR5cGUgcGllY2VzIG9mIGEgZmlsZW5hbWUKKyAgIChhbnl0aGluZyB0aGF0IGRvZXMgbm90IHN0YXJ0IHdpdGggIi8iKSBhbmQgdGhlbiAiPyIgdG8gZ2V0IGEgbGlzdCBvZgorICAgZmlsZW5hbWVzIHRoYXQgc3RhcnQgdGhhdCB3YXk7IGUuZy4gInNlbmQgeC4/IiBzdGlsbCB3b3JrcyBhcyBiZWZvcmUuCisKKyAgIEluIFVOSVgsIHdoZXJlICIvIiBpcyBhbHNvIHRoZSBkaXJlY3Rvcnkgc2VwYXJhdG9yLCB0aGVyZSBpcyB1c3VhbGx5CisgICBubyBhbWJpZ3VpdHkgYmV0d2VlbiBhIGZ1bGx5LXNwZWNpZmllZCBwYXRobmFtZSBhbmQgYSBzd2l0Y2gsIGV4Y2VwdAorICAgd2hlbiBhIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgc3dpdGNoIChhcworICAgbm90ZWQgaW4gWzQ4OV1TZWN0aW9uIDEuNSk6CisKKyAgc2VuZCAvZXRjL21vdGQgICAgICAgICAgICAgICAgICAgICAgICA7IFdvcmtzIGFzIGV4cGVjdGVkCisgIHNlbmQgL2NvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICAgOyA/Pz8KKworICAgVGhlIHNlY29uZCBleGFtcGxlIGludGVycHJldHMgIi9jb21tYW5kIiBhcyBhIHN3aXRjaCwgbm90IGEgZmlsZW5hbWUuCisgICBUbyBzZW5kIGEgZmlsZSBhY3R1YWxseSBjYWxsZWQgImNvbW1hbmQiIGluIHRoZSByb290IGRpcmVjdG9yeSwgdXNlOgorCisgIHNlbmQgey9jb21tYW5kfQorCisgICBvciBvdGhlciBzeXN0ZW0tZGVwZW5kZW50IGZvcm1zIHN1Y2ggYXMgLy9jb21tYW5kLCAvLi9jb21tYW5kLAorICAgYzovY29tbWFuZCwgZXRjLCBvciBjZCB0byAvIGFuZCB0aGVuICJzZW5kIGNvbW1hbmQiLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC43LjIuIEdFVCBDb21tYW5kIFN3aXRjaGVzCisKKyAgIFdpdGhvdXQgc3dpdGNoZXMsIHRoZSBHRVQgY29tbWFuZCBzdGlsbCB3b3JrcyBhYm91dCB0aGUgc2FtZSBhcworICAgYmVmb3JlOgorCisgIGdldCBvb2ZhLnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgOyBHRVQgYSBzaW5nbGUgZmlsZQorICBnZXQgb29mYS4qICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgR0VUIG11bHRpcGxlIGZpbGVzCisKKyAgIEhvd2V2ZXIsIHRoZSBtZWNoYW5pc20gZm9yIGluY2x1ZGluZyBhbiAiYXMtbmFtZSIgaGFzIGNoYW5nZWQuCisgICBQcmV2aW91c2x5LCBpbiBvcmRlciB0byBpbmNsdWRlIGFuIGFzLW5hbWUsIHlvdSB3ZXJlIHJlcXVpcmVkIHRvIHVzZQorICAgdGhlICJtdWx0aWxpbmUiIGZvcm0gb2YgR0VUOgorCisgIGdldAorICByZW1vdGUtZmlsZXNwZWMKKyAgbG9jYWwtbmFtZQorCisgICBUaGlzIHdhcyBiZWNhdXNlIHRoZSByZW1vdGUgZmlsZXNwZWMgbWlnaHQgY29udGFpbiBzcGFjZXMsIGFuZCBzbworICAgdGhlcmUgd291bGQgYmUgbm8gZ29vZCB3YXkgb2YgdGVsbGluZyB3aGVyZSBpdCBlbmRlZCBhbmQgd2hlcmUgdGhlCisgICBsb2NhbCBuYW1lIGJlZ2FuLCBlLmc6CisKKyAgZ2V0IHByb2ZpbGUgZXhlYyBhIGZvbworCisgICBCdXQgbm93IHNpbmNlIHdlIGNhbiB1c2Uge2JyYWNlc30gZm9yIGdyb3VwaW5nLCB3ZSBkb24ndCBuZWVkIHRoZQorICAgbXVsdGlsaW5lIEdFVCBmb3JtIGFueSBtb3JlLCBhbmQgaW4gZmFjdCwgc3VwcG9ydCBmb3IgaXQgaGFzIGJlZW4KKyAgIHJlbW92ZWQuIElmIHlvdSBnaXZlIGEgR0VUIGNvbW1hbmQgYnkgaXRzZWxmIG9uIGEgbGluZSwgaXQgZmFpbHMgYW5kCisgICBhbiBlcnJvciBtZXNzYWdlIGlzIHByaW50ZWQuIFRoZSBuZXcgZm9ybSBpczoKKworICAgR0VUIFsgc3dpdGNoZXMuLi4gXSByZW1vdGUtbmFtZSBbIGxvY2FsLW5hbWUgXQorICAgICAgICAgIEFzayB0aGUgc2VydmVyIHRvIHNlbmQgdGhlIGZpbGUgd2hvc2UgbmFtZSBpcyByZW1vdGUtbmFtZS4gSWYKKyAgICAgICAgICB0aGUgb3B0aW9uYWwgbG9jYWwtbmFtZSBpcyBnaXZlbiwgc3RvcmUgaXQgbG9jYWxseSB1bmRlciB0aGlzCisgICAgICAgICAgbmFtZS4gSWYgdGhlIHJlbW90ZS1uYW1lIG9yIGxvY2FsLW5hbWUgY29udGFpbnMgc3BhY2VzLCB0aGV5CisgICAgICAgICAgbXVzdCBiZSBlbmNsb3NlZCBpbiBicmFjZXM6CisKKyAgZ2V0IHtwcm9maWxlIGV4ZWMgYX0gZm9vCisgIGdldCBvb2ZhLnR4dCB7fi9NeSBGaWxlcy9Pb2ZhIHRleHR9CisKKyAgIElmIHlvdSB3YW50IHRvIGdpdmUgYSBsaXN0IG9mIHJlbW90ZSBmaWxlIHNwZWNpZmljYXRpb25zLCB1c2UgdGhlIE1HRVQKKyAgIGNvbW1hbmQ6CisKKyAgIE1HRVQgWyBzd2l0Y2hlcy4uLiBdIHJlbW90ZS1uYW1lIFsgcmVtb3RlLW5hbWUgWyByZW1vdGUtbmFtZSAuLi4gXSBdCisgICAgICAgICAgQXNrIHRoZSBzZXJ2ZXIgdG8gc2VuZCB0aGUgZmlsZXMgd2hvc2UgbmFtZXMgYXJlIGdpdmVuLgorCisgICBOb3cgeW91IGNhbiBhbHNvIGluY2x1ZGUgbW9kaWZpZXIgc3dpdGNoZXMgYmV0d2VlbiBHRVQgb3IgTUdFVCBhbmQgdGhlCisgICByZW1vdGUtbmFtZTsgbW9zdCBvZiB0aGUgc2FtZSBzd2l0Y2hlcyBhcyBTRU5EOgorCisgICAvQVMtTkFNRTp0ZXh0CisgICAgICAgICAgU3BlY2lmaWVzICJ0ZXh0IiBhcyB0aGUgbmFtZSB0byBzdG9yZSB0aGUgaW5jb21pbmcgZmlsZSB1bmRlci4KKyAgICAgICAgICAoVGhpcyBzd2l0Y2ggaXMgbm90IGF2YWlsYWJsZSBmb3IgTUdFVC4pIFlvdSBjYW4gYWxzbyBzdGlsbAorICAgICAgICAgIHNwZWNpZnkgdGhlIGFzLW5hbWUgYXMgdGhlIHNlY29uZCBmaWxlbmFtZSBvbiB0aGUgR0VUIGNvbW1hbmQKKyAgICAgICAgICBsaW5lLiBUaGUgZm9sbG93aW5nIHR3byBjb21tYW5kcyBhcmUgZXF1aXZhbGVudDoKKworICBnZXQgb29mYS50eHQgb29mYS5uZXcKKyAgZ2V0IC9hczpvb2ZhLm5ldyBvb2ZhLnR4dAorCisgICAvQklOQVJZCisgICAgICAgICAgVGVsbHMgdGhlIHNlcnZlciB0byBzZW5kIHRoZSBnaXZlbiBmaWxlKHMpIGluIGJpbmFyeSBtb2RlCisgICAgICAgICAgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGdsb2JhbCB0cmFuc2ZlciBtb2RlLiBFeGFtcGxlOgorCisgIHNldCBmaWxlIHR5cGUgdGV4dCAgICAgIDsgU2V0IGdsb2JhbCB0cmFuc2ZlciBtb2RlIHRvIHRleHQKKyAgZ2V0IC9iaW5hcnkgb29mYS56aXAgICAgOyBnZXQgYSBmaWxlIGluIGJpbmFyeSBtb2RlCisgIGdldCBvb2ZhLnR4dCAgICAgICAgICAgIDsgVGhpcyBvbmUgaXMgdHJhbnNmZXJyZWQgaW4gdGV4dCBtb2RlCisKKyAgICAgICAgICBPciwgcGVyaGFwcyBtb3JlIHRvIHRoZSBwb2ludDoKKworICBnZXQgL2JpbmFyeSBmb28udHh0ICAgICA7IHdoZXJlICIqLnR4dCIgaXMgYSB0ZXh0LXBhdHRlcm4KKworICAgICAgICAgIFRoaXMgaGFzIHRoZSBleHBlY3RlZCBlZmZlY3Qgb25seSBpZiB0aGUgc2VydmVyIGlzIEMtS2VybWl0IDcuMAorICAgICAgICAgIG9yIGxhdGVyIG9yIEs5NSAxLjEuMTkgb3IgbGF0ZXIuCisKKyAgIC9DT01NQU5ECisgICAgICAgICAgR0VUIC9DT01NQU5EIGlzIGVxdWl2YWxlbnQgdG8gQ0dFVCAoWzQ5MF1TZWN0aW9uIDQuMi4yKSAtLSBpdAorICAgICAgICAgIHNheXMgdG8gcmVjZWl2ZSB0aGUgZmlsZSBpbnRvIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiBhIGNvbW1hbmQsCisgICAgICAgICAgcmF0aGVyIHRoYW4gc2F2aW5nIGl0IG9uIGRpc2suIFRoZSAvQVMtTkFNRSBvciB0aGUgc2Vjb25kCisgICAgICAgICAgImZpbGVuYW1lIiBvbiB0aGUgR0VUIGNvbW1hbmQgbGluZSBpcyBpbnRlcnByZXRlZCBhcyB0aGUgbmFtZQorICAgICAgICAgIG9mIGEgY29tbWFuZC4gRXhhbXBsZXM6CisKKyAgZ2V0IC9jb21tYW5kIHN1bmRheS50eHQge2dyZXAgU3VuZGF5IG9vZmEudHh0fQorICBnZXQgL2NvbW1hbmQgL2FzLW5hbWU6e2dyZXAgU3VuZGF5IG9vZmEudHh0fSBzdW5kYXkudHh0CisgIGdldCAvYmluIC9jb21tYW5kIHshZ3VuemlwIC1jIHwgdGFyIHhmIC19IHt0YXIgY2YgLSAuIHwgZ3ppcCAtY30KKworICAgL0RFTEVURQorICAgICAgICAgIEFza3MgdGhlIEtlcm1pdCBzZXJ2ZXIgdG8gZGVsZXRlIHRoZSBmaWxlIChvciBlYWNoIGZpbGUgaW4gdGhlCisgICAgICAgICAgZ3JvdXApIGFmdGVyIGl0IGhhcyBiZWVuIHRyYW5zZmVycmVkIHN1Y2Nlc3NmdWxseSAoYnV0IG5vdCB0bworICAgICAgICAgIGRlbGV0ZSBpdCBpZiBpdCB3YXMgbm90IHNlbnQgc3VjY2Vzc2Z1bGx5KS4gR0VUIC9ERUxFVEUgaXMKKyAgICAgICAgICBlcXVpdmFsZW50IHRvIFJFVFJJRVZFLiBFeGFtcGxlOgorCisgIGdldCAvZGVsZXRlICoubG9nCisKKyAgIC9FWENFUFQ6cGF0dGVybgorICAgICAgICAgIFNwZWNpZmllcyB0aGF0IGFueSBmaWxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcGF0dGVybiwgd2hpY2gKKyAgICAgICAgICBjYW4gYmUgYSByZWd1bGFyIGZpbGVuYW1lLCBvciBtYXkgY29udGFpbiAiKiIgYW5kL29yICI/IgorICAgICAgICAgIG1ldGFjaGFyYWN0ZXJzLCBhcmUgdG8gYmUgcmVmdXNlZCB1cG9uIGFycml2YWwuIFRvIHNwZWNpZnkKKyAgICAgICAgICBtdWx0aXBsZSBwYXR0ZXJucyAodXAgdG8gOCksIHVzZSBvdXRlciBicmFjZXMgYXJvdW5kIHRoZSBncm91cCwKKyAgICAgICAgICBhbmQgaW5uZXIgYnJhY2VzIGFyb3VuZCBlYWNoIHBhdHRlcm46CisKKyAgL0VYQ0VQVDp7e3BhdHRlcm4xfXtwYXR0ZXJuMn0uLi59CisKKyAgICAgICAgICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIFNFTkQgL0VYQ0VQVCBpbiBbNDkxXVNlY3Rpb24gNC43LjEgZm9yCisgICAgICAgICAgZXhhbXBsZXMsIGV0Yy4gUmVmdXNhbCBpcyBhY2NvbXBsaXNoZWQgdXNpbmcgdGhlIEF0dHJpYnV0ZQorICAgICAgICAgIFJlamVjdGlvbiBtZWNoYW5pc20gKHJlYXNvbiAibmFtZSIpLCB3aGljaCB3b3JrcyBvbmx5IHdoZW4KKyAgICAgICAgICBBdHRyaWJ1dGUgcGFja2V0cyBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZWQuCisKKyAgIC9GSUxFTkFNRVM6e0NPTlZFUlRFRCxMSVRFUkFMfQorICAgICAgICAgIFVzZSB0aGlzIHN3aXRjaCB0byBvdmVycmlkZSB0aGUgY3VycmVudCBnbG9iYWwgU0VUIEZJTEUgTkFNRVMKKyAgICAgICAgICBzZXR0aW5nIGZvciB0aGlzIHRyYW5zZmVyIG9ubHkuCisKKyAgIC9GSUxURVI6Y29tbWFuZAorICAgICAgICAgIFRoaXMgc3BlY2lmaWVzIGEgZmlsdGVyIHRvIHBhc3MgdGhlIGluY29taW5nIGZpbGUgdGhyb3VnaAorICAgICAgICAgIGJlZm9yZSB3cml0aW5nIHRvIGRpc2suIFNlZSB0aGUgWzQ5Ml1zZWN0aW9uIG9uIGZpbGUtdHJhbnNmZXIKKyAgICAgICAgICBwaXBlcyBhbmQgZmlsdGVycy4gVGhlIC9GSUxURVIgc3dpdGNoIGFwcGxpZXMgb25seSB0byB0aGUKKyAgICAgICAgICBmaWxlLXRyYW5zZmVyIGNvbW1hbmQgaXQgaXMgZ2l2ZW4gd2l0aDsgaXQgZG9lcyBub3QgYWZmZWN0IHRoZQorICAgICAgICAgIGdsb2JhbCBSRUNFSVZFIEZJTFRFUiBzZXR0aW5nLCBpZiBhbnkuCisKKyAgIC9JTUFHRQorICAgICAgICAgIFZNUzogVHJhbnNmZXIgaW4gaW1hZ2UgbW9kZS4gTm9uLVZNUzogc2FtZSBhcyAvQklOQVJZLgorCisgICAvTEFCRUxFRAorICAgICAgICAgIFZNUyBhbmQgT1MvMiBvbmx5OiBTcGVjaWZpZXMgbGFiZWxlZCB0cmFuc2ZlciBtb2RlLgorCisgICAvTU9WRS1UTzpkaXJlY3RvcnkKKyAgICAgICAgICBUaGlzIHRlbGxzIEMtS2VybWl0IHRvIG1vdmUgZWFjaCBmaWxlIHRoYXQgaXMgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgcmVjZWl2ZWQgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4gRmlsZXMgdGhhdCBhcmUgbm90CisgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGFyZSBub3QgbW92ZWQuIEJ5IGRlZmF1bHQsIGZpbGVzIGFyZSBub3QKKyAgICAgICAgICBtb3ZlZC4KKworICAgL1BBVEhOQU1FUzp7T0ZGLEFCU09MVVRFLFJFTEFUSVZFLEFVVE99CisgICAgICAgICAgVXNlIHRoaXMgc3dpdGNoIHRvIG92ZXJyaWRlIHRoZSBjdXJyZW50IGdsb2JhbCBTRVQgUkVDRUlWRQorICAgICAgICAgIFBBVEhOQU1FUyBzZXR0aW5nIGZvciB0aGlzIHRyYW5zZmVyIG9ubHkuIC9QQVRITkFNRVM6QUJTT0xVVEUKKyAgICAgICAgICBvciBSRUxBVElWRSBhbHNvIHNldHMgL0ZJTEVOQU1FUzpMSVRFUkFMIChhbHNvIGZvciB0aGlzCisgICAgICAgICAgdHJhbnNmZXIgb25seSkgc2luY2UgaW5jb21pbmcgcGF0aG5hbWVzIHdvdWxkIG5vdCBiZSB0cmVhdGVkIGFzCisgICAgICAgICAgcGF0aG5hbWVzIG90aGVyd2lzZS4gU2VlIFs0OTNdU2VjdGlvbiA0LjEwLgorCisgICAvUVVJRVQKKyAgICAgICAgICBXaGVuIHNlbmRpbmcgaW4gbG9jYWwgbW9kZSwgdGhpcyBzdXBwcmVzc2VzIHRoZSBmaWxlLXRyYW5zZmVyCisgICAgICAgICAgZGlzcGxheS4KKworICAgL1JFQ09WRVIKKyAgICAgICAgICBVc2VkIHRvIHJlY292ZXIgZnJvbSBhIHByZXZpb3VzbHkgaW50ZXJydXB0ZWQgdHJhbnNmZXI7IEdFVAorICAgICAgICAgIC9SRUNPVkVSIGlzIGVxdWl2YWxlbnQgdG8gUkVHRVQuIFJlY292ZXJ5IG9ubHkgd29ya3MgaW4gYmluYXJ5CisgICAgICAgICAgbW9kZTsgU0VORCAvUkVDT1ZFUiBhbmQgUkVTRU5EIGluY2x1ZGUgYW4gaW1wbGllZCAvQklOQVJZCisgICAgICAgICAgc3dpdGNoLiBFdmVuIHRoZW4sIHJlY292ZXJ5IHdpbGwgc3VjY2Vzc2Z1bCBvbmx5IGlmIChhKSB0aGUKKyAgICAgICAgICBvcmlnaW5hbCAoaW50ZXJydXB0ZWQpIHRyYW5zZmVyIHdhcyBhbHNvIGluIGJpbmFyeSBtb2RlLCBvciAoYikKKyAgICAgICAgICBpZiBpdCB3YXMgaW4gdGV4dCBtb2RlLCB0aGUgdHdvIEtlcm1pdCBwcm9ncmFtcyBydW4gb24KKyAgICAgICAgICBwbGF0Zm9ybXMgd2hlcmUgdGV4dC1tb2RlIHRyYW5zZmVycyBhcmUgbm90IGxlbmd0aC1jaGFuZ2luZy4KKworICAgL1JFQ1VSU0lWRQorICAgICAgICAgIFRlbGxzIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgR0VUIGZpbGUgc3BlY2lmaWNhdGlvbiBhcHBsaWVzCisgICAgICAgICAgcmVjdXJzaXZlbHkuIFRoaXMgc3dpdGNoIGFsc28gYXV0b21hdGljYWxseSBzZXRzCisgICAgICAgICAgL1BBVEhOQU1FUzpSRUxBVElWRSBpbiBib3RoIHRoZSBzZXJ2ZXIgQU5EIHRoZSBjbGllbnQuIFdoZW4KKyAgICAgICAgICB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggL0RFTEVURSwgdGhpcyAibW92ZXMiIGEgZGlyZWN0b3J5IHRyZWUKKyAgICAgICAgICBmcm9tIHRoZSBzZXJ2ZXIncyBjb21wdXRlciB0byB0aGUgY2xpZW50J3MgY29tcHV0ZXIgKGV4Y2VwdAorICAgICAgICAgIHRoYXQgb25seSByZWd1bGFyIGZpbGVzIGFyZSBkZWxldGVkIGZyb20gdGhlIHNlcnZlcidzIGNvbXB1dGVyLAorICAgICAgICAgIG5vdCBkaXJlY3RvcmllczsgdGh1cyB0aGUgb3JpZ2luYWwgZGlyZWN0b3JpZXMgd2lsbCBiZSBsZWZ0LAorICAgICAgICAgIGJ1dCB3aWxsIGNvbnRhaW4gbm8gZmlsZXMpLiBOb3RlIHRoYXQgYWxsIHNlcnZlcnMgdGhhdCBzdXBwb3J0CisgICAgICAgICAgL1JFQ1VSU0lWRSBkbyBub3QgbmVjZXNzYXJpbHkgZG8gc28gaW4gY29tYmluYXRpb24gd2l0aCBvdGhlcgorICAgICAgICAgIHN3aXRjaGVzLCBzdWNoIGFzIC9SRUNPVkVSLiAoU2VydmVycyB0aGF0IGRvIGluY2x1ZGUgQy1LZXJtaXQKKyAgICAgICAgICA3LjAgYW5kIGxhdGVyLCBLOTUgMS4xLjE5IGFuZCBsYXRlci4pCisKKyAgIC9SRU5BTUUtVE86c3RyaW5nCisgICAgICAgICAgVGhpcyB0ZWxscyBDLUtlcm1pdCB0byByZW5hbWUgZWFjaCBmaWxlIHRoYXQgaXMgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgcmVjZWl2ZWQgdG8gdGhlIGdpdmVuIHN0cmluZy4gRmlsZXMgdGhhdCBhcmUgbm90IHN1Y2Nlc3NmdWxseQorICAgICAgICAgIHJlY2VpdmVkIGFyZSBub3QgcmVuYW1lZC4gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIG5vdCByZW5hbWVkLgorICAgICAgICAgIFRoZSBzdHJpbmcgY2FuIGJlIGEgbGl0ZXJhbCBzdHJpbmcsIHdoaWNoIGlzIGFwcHJvcHJpYXRlIHdoZW4KKyAgICAgICAgICBvbmx5IG9uZSBmaWxlIGlzIGJlaW5nIHJlY2VpdmVkLCBvciBpdCBjYW4gY29udGFpbiBvbmUgb3IgbW9yZQorICAgICAgICAgIHZhcmlhYmxlcyB0aGF0IGFyZSB0byBiZSBldmFsdWF0ZWQgYXQgdGhlIHRpbWUgZWFjaCBmaWxlIGlzCisgICAgICAgICAgcmVjZWl2ZWQsIHN1Y2ggYXMgXHYoZmlsZW5hbWUpLCBcdihmaWxlbnVtYmVyKSwgXHYobnRpbWUpLAorICAgICAgICAgIFx2KHBpZCksIFx2KHVzZXIpLCBldGMuIFdBUk5JTkc6IGlmIHlvdSBnaXZlIGEgbGl0ZXJhbCBzdHJpbmcKKyAgICAgICAgICBhbmQgbW9yZSB0aGFuIG9uZSBmaWxlIGFycml2ZXMsIGVhY2ggaW5jb21pbmcgZmlsZSB3aWxsIGJlCisgICAgICAgICAgZ2l2ZW4gdGhlIHNhbWUgbmFtZSAoYnV0IFNFVCBGSUxFIENPTExJU0lPTiBCQUNLVVAgb3IgUkVOQU1FCisgICAgICAgICAgY2FuIGJlIHVzZWQgdG8ga2VlcCB0aGUgaW5jb21pbmcgZmlsZXMgZnJvbSBvdmVyd3JpdGluZyBlYWNoCisgICAgICAgICAgb3RoZXIpLgorCisgICAvVEVYVAorICAgICAgICAgIFRlbGxzIHRoZSBzZXJ2ZXIgdG8gcGVyZm9ybSB0aGlzIHRyYW5zZmVyIGluIHRleHQgbW9kZSB3aXRob3V0CisgICAgICAgICAgYWZmZWN0aW5nIGl0cyBnbG9iYWwgdHJhbnNmZXIgbW9kZS4gU2VlIC9CSU5BUlkgZm9yIGFkZGl0aW9uYWwKKyAgICAgICAgICBpbmZvLgorCisgICBUaGUgL01BSUwgYW5kIC9QUklOVCBvcHRpb25zIGFyZSBub3QgYXZhaWxhYmxlIChhcyB0aGV5IGFyZSBmb3IgU0VORCksCisgICBidXQgeW91IGNhbiB1c2UgL0NPTU1BTkQgdG8gYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3QsIGFzIGluIHRoZXNlIFVOSVgKKyAgIGV4YW1wbGVzOgorCisgIGdldCAvY29tbWFuZCBvb2ZhLnR4dCB7bWFpbCBrZXJtaXRAY29sdW1iaWEuZWR1fQorICBnZXQgL2NvbW1hbmQgb29mYS50eHQgbHByCisKKyAgIEluIE9TLzIgb3IgV2luZG93cywgeW91IGNhbiBHRVQgYW5kIHByaW50IGxpa2UgdGhpczoKKworICBnZXQgb29mYS50eHQgcHJuCisKKyAgIFRoZSBDR0VULCBSRUdFVCwgUkVUUklFVkUgY29tbWFuZHMgYWxzbyBhY2NlcHQgdGhlIHNhbWUgc3dpdGNoZXMgYXMKKyAgIEdFVC4gQ0dFVCBhdXRvbWF0aWNhbGx5IHNldHMgL0NPTU1BTkQ7IFJFR0VUIGF1dG9tYXRpY2FsbHkgc2V0cworICAgL1JFQ09WRVIgYW5kIC9CSU5BUlksIGFuZCBSRVRSSUVWRSBhdXRvbWF0aWNhbGx5IHNldHMgL0RFTEVURS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuNy4zLiBSRUNFSVZFIENvbW1hbmQgU3dpdGNoZXMKKworICAgV2l0aG91dCBzd2l0Y2hlcywgdGhlIFJFQ0VJVkUgY29tbWFuZCBzdGlsbCB3b3JrcyBhcyBiZWZvcmU6CisKKyAgcmVjZWl2ZSAgICAgICAgICAgIDsgUmVjZWl2ZXMgZmlsZXMgdW5kZXIgdGhlaXIgb3duIG5hbWVzCisgIHJlY2VpdmUgL3RtcCAgICAgICA7IERpdHRvLCBidXQgaW50byB0aGUgL3RtcCBkaXJlY3RvcnkKKyAgciAgICAgICAgICAgICAgICAgIDsgU2FtZSBhcyAicmVjZWl2ZSIKKyAgcmVjZWl2ZSBmb28udHh0ICAgIDsgUmVjZWl2ZXMgYSBmaWxlIGFuZCByZW5hbWVzIHRvIGZvby50eHQKKworICAgTm93IHlvdSBjYW4gYWxzbyBpbmNsdWRlIG1vZGlmaWVyIHN3aXRjaGVzIG1heSBiZSBpbmNsdWRlZCBiZXR3ZWVuCisgICAicmVjZWl2ZSIgYW5kIHRoZSBhcy1uYW1lOyBtb3N0IG9mIHRoZSBzYW1lIHN3aXRjaGVzIGFzIEdFVDoKKworICAgL0FTLU5BTUU6dGV4dAorICAgICAgICAgIFNwZWNpZmllcyAidGV4dCIgYXMgdGhlIG5hbWUgdG8gc3RvcmUgdGhlIGluY29taW5nIGZpbGUgdW5kZXIuCisgICAgICAgICAgWW91IGNhbiBhbHNvIHN0aWxsIHNwZWNpZnkgdGhlIGFzLW5hbWUgYXMgYSBmaWxlbmFtZSBvbiB0aGUKKyAgICAgICAgICBjb21tYW5kIGxpbmUuIFRoZSBmb2xsb3dpbmcgdHdvIGNvbW1hbmRzIGFyZSBlcXVpdmFsZW50OgorCisgIHIgb29mYS5uZXcKKyAgciAvYXM6b29mYS5uZXcKKworICAgL0JJTkFSWQorICAgICAgICAgIFBlcmZvcm1zIHRoaXMgdHJhbnNmZXIgaW4gYmluYXJ5IG1vZGUgd2l0aG91dCBhZmZlY3RpbmcgdGhlCisgICAgICAgICAgZ2xvYmFsIHRyYW5zZmVyIG1vZGUuIE5PVEU6IFRoaXMgZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGluY29taW5nCisgICAgICAgICAgZmlsZXR5cGUgKGFzIGl0IGRvZXMgd2l0aCBHRVQpLCBzbyB0aGlzIHN3aXRjaCBpcyB1c2VmdWwgb25seQorICAgICAgICAgIGlmIEFUVFJJQlVURSBUWVBFIGlzIE9GRiwgb3IgaWYgdGhlIG90aGVyIEtlcm1pdCBkb2VzIG5vdCBzZW5kCisgICAgICAgICAgYSBUWVBFICh0ZXh0IG9yIGJpbmFyeSkgYXR0cmlidXRlLiBJbiBhbnkgY2FzZSwgaXQgaGFzIG5vCisgICAgICAgICAgYWZmZWN0IHdoYXRzb2V2ZXIgb24gdGhlIGZpbGUgc2VuZGVyLgorCisgICAvQ09NTUFORAorICAgICAgICAgIFJFQ0VJVkUgL0NPTU1BTkQgaXMgZXF1aXZhbGVudCB0byBDUkVDRUlWRSAoWzQ5NF1TZWN0aW9uIDQuMi4yKQorICAgICAgICAgIC0tIGl0IHNheXMgdG8gcmVjZWl2ZSB0aGUgZmlsZSBpbnRvIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiBhCisgICAgICAgICAgY29tbWFuZCwgcmF0aGVyIHRoYW4gc2F2aW5nIGl0IG9uIGRpc2suIFRoZSAvQVMtTkFNRSBvciB0aGUKKyAgICAgICAgICAiZmlsZW5hbWUiIG9uIHRoZSBSRUNFSVZFIGNvbW1hbmQgbGluZSBpcyBpbnRlcnByZXRlZCBhcyB0aGUKKyAgICAgICAgICBuYW1lIG9mIGEgY29tbWFuZC4KKworICByIC9jb21tYW5kIHtncmVwIFN1bmRheSBvb2ZhLnR4dH0KKyAgciAvY29tbWFuZCAvYXMtbmFtZTp7Z3JlcCBTdW5kYXkgb29mYS50eHR9CisgIHIgL2JpbiAvY29tbWFuZCB7dGFyIGNmIC0gLiB8IGd6aXAgLWN9CisKKyAgIC9FWENFUFQ6cGF0dGVybgorICAgICAgICAgIFNwZWNpZmllcyB0aGF0IGFueSBmaWxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcGF0dGVybiwgd2hpY2gKKyAgICAgICAgICBjYW4gYmUgYSByZWd1bGFyIGZpbGVuYW1lLCBvciBtYXkgY29udGFpbiAiKiIgYW5kL29yICI/IgorICAgICAgICAgIG1ldGFjaGFyYWN0ZXJzLCBhcmUgdG8gYmUgcmVmdXNlZCB1cG9uIGFycml2YWwuIFRvIHNwZWNpZnkKKyAgICAgICAgICBtdWx0aXBsZSBwYXR0ZXJucyAodXAgdG8gOCksIHVzZSBvdXRlciBicmFjZXMgYXJvdW5kIHRoZSBncm91cCwKKyAgICAgICAgICBhbmQgaW5uZXIgYnJhY2VzIGFyb3VuZCBlYWNoIHBhdHRlcm46CisKKyAgL0VYQ0VQVDp7e3BhdHRlcm4xfXtwYXR0ZXJuMn0uLi59CisKKyAgICAgICAgICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIFNFTkQgL0VYQ0VQVCBpbiBbNDk1XVNlY3Rpb24gNC43LjEgZm9yCisgICAgICAgICAgZXhhbXBsZXMsIGV0Yy4gUmVmdXNhbCBpcyBhY2NvbXBsaXNoZWQgdXNpbmcgdGhlIEF0dHJpYnV0ZQorICAgICAgICAgIFJlamVjdGlvbiBtZWNoYW5pc20gKHJlYXNvbiAibmFtZSIpLCB3aGljaCB3b3JrcyBvbmx5IHdoZW4KKyAgICAgICAgICBBdHRyaWJ1dGUgcGFja2V0cyBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZWQuCisKKyAgIC9GSUxFTkFNRVM6e0NPTlZFUlRFRCxMSVRFUkFMfQorICAgICAgICAgIFVzZSB0aGlzIHN3aXRjaCB0byBvdmVycmlkZSB0aGUgY3VycmVudCBnbG9iYWwgU0VUIEZJTEUgTkFNRVMKKyAgICAgICAgICBzZXR0aW5nIGZvciB0aGlzIHRyYW5zZmVyIG9ubHkuCisKKyAgIC9GSUxURVI6Y29tbWFuZAorICAgICAgICAgIFRoaXMgc3BlY2lmaWVzIGEgZmlsdGVyIHRvIHBhc3MgdGhlIGluY29taW5nIGZpbGUgdGhyb3VnaAorICAgICAgICAgIGJlZm9yZSB3cml0aW5nIHRvIGRpc2suIFNlZSB0aGUgWzQ5Nl1zZWN0aW9uIG9uIGZpbGUtdHJhbnNmZXIKKyAgICAgICAgICBwaXBlcyBhbmQgZmlsdGVycy4gVGhlIC9GSUxURVIgc3dpdGNoIGFwcGxpZXMgb25seSB0byB0aGUKKyAgICAgICAgICBmaWxlLXRyYW5zZmVyIGNvbW1hbmQgaXQgaXMgZ2l2ZW4gd2l0aDsgaXQgZG9lcyBub3QgYWZmZWN0IHRoZQorICAgICAgICAgIGdsb2JhbCBSRUNFSVZFIEZJTFRFUiBzZXR0aW5nLCBpZiBhbnkuCisKKyAgIC9JTUFHRQorICAgICAgICAgIFZNUzogVHJhbnNmZXIgaW4gaW1hZ2UgbW9kZS4gTm9uLVZNUzogc2FtZSBhcyAvQklOQVJZLiBTZWUKKyAgICAgICAgICBjb21tZW50cyB1bmRlciBSRUNFSVZFIC9CSU5BUlkuCisKKyAgIC9MQUJFTEVECisgICAgICAgICAgVk1TIGFuZCBPUy8yIG9ubHk6IFNwZWNpZmllcyBsYWJlbGVkIHRyYW5zZmVyIG1vZGUuIFNlZQorICAgICAgICAgIGNvbW1lbnRzIHVuZGVyIFJFQ0VJVkUgL0JJTkFSWS4KKworICAgL01PVkUtVE86ZGlyZWN0b3J5CisgICAgICAgICAgVGhpcyB0ZWxscyBDLUtlcm1pdCB0byBtb3ZlIGVhY2ggZmlsZSB0aGF0IGlzIHN1Y2Nlc3NmdWxseQorICAgICAgICAgIHJlY2VpdmVkIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuIEZpbGVzIHRoYXQgYXJlIG5vdAorICAgICAgICAgIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBhcmUgbm90IG1vdmVkLiBCeSBkZWZhdWx0LCBmaWxlcyBhcmUgbm90CisgICAgICAgICAgbW92ZWQuCisKKyAgIC9QQVRITkFNRVM6e0FCU09MVVRFLFJFTEFUSVZFLE9GRixBVVRPfQorICAgICAgICAgIFVzZSB0aGlzIHN3aXRjaCB0byBvdmVycmlkZSB0aGUgY3VycmVudCBnbG9iYWwgU0VUIFJFQ0VJVkUKKyAgICAgICAgICBQQVRITkFNRVMgc2V0dGluZyBmb3IgdGhpcyB0cmFuc2ZlciBvbmx5LiBTZWUgWzQ5N11TZWN0aW9uCisgICAgICAgICAgNC4xMC4KKworICAgL1JFQ1VSU0lWRQorICAgICAgICAgIFdoZW4gdXNlZCB3aXRoIHRoZSBSRUNFSVZFIGNvbW1hbmQsIC9SRUNVUlNJVkUgaXMgc2ltcGx5IGEKKyAgICAgICAgICBzeW5vbnltIGZvciAvUEFUSE5BTUVTOlJFTEFUSVZFLgorCisgICAvUkVOQU1FLVRPOnN0cmluZworICAgICAgICAgIFRoaXMgdGVsbHMgQy1LZXJtaXQgdG8gcmVuYW1lIGVhY2ggZmlsZSB0aGF0IGlzIHN1Y2Nlc3NmdWxseQorICAgICAgICAgIHJlY2VpdmVkIHRvIHRoZSBnaXZlbiBzdHJpbmcuIEZpbGVzIHRoYXQgYXJlIG5vdCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICByZWNlaXZlZCBhcmUgbm90IHJlbmFtZWQuIEJ5IGRlZmF1bHQsIGZpbGVzIGFyZSBub3QgcmVuYW1lZC4KKyAgICAgICAgICBUaGUgc3RyaW5nIGNhbiBiZSBhIGxpdGVyYWwgc3RyaW5nLCB3aGljaCBpcyBhcHByb3ByaWF0ZSB3aGVuCisgICAgICAgICAgb25seSBvbmUgZmlsZSBpcyBiZWluZyByZWNlaXZlZCwgb3IgaXQgY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUKKyAgICAgICAgICB2YXJpYWJsZXMgdGhhdCBhcmUgdG8gYmUgZXZhbHVhdGVkIGF0IHRoZSB0aW1lIGVhY2ggZmlsZSBpcworICAgICAgICAgIHJlY2VpdmVkLCBzdWNoIGFzIFx2KGZpbGVuYW1lKSwgXHYoZmlsZW51bWJlciksIFx2KG50aW1lKSwKKyAgICAgICAgICBcdihwaWQpLCBcdih1c2VyKSwgZXRjLiBXQVJOSU5HOiBpZiB5b3UgZ2l2ZSBhIGxpdGVyYWwgc3RyaW5nCisgICAgICAgICAgYW5kIG1vcmUgdGhhbiBvbmUgZmlsZSBhcnJpdmVzLCBlYWNoIGluY29taW5nIGZpbGUgd2lsbCBiZQorICAgICAgICAgIGdpdmVuIHRoZSBzYW1lIG5hbWUgKGJ1dCBTRVQgRklMRSBDT0xMSVNJT04gQkFDS1VQIG9yIFJFTkFNRQorICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGtlZXAgdGhlIGluY29taW5nIGZpbGVzIGZyb20gb3ZlcndyaXRpbmcgZWFjaAorICAgICAgICAgIG90aGVyKS4KKworICAgL1FVSUVUCisgICAgICAgICAgV2hlbiByZWNlaXZpbmcgaW4gbG9jYWwgbW9kZSwgdGhpcyBzdXBwcmVzc2VzIHRoZSBmaWxlLXRyYW5zZmVyCisgICAgICAgICAgZGlzcGxheS4KKworICAgL1RFWFQKKyAgICAgICAgICBSZWNlaXZlcyBpbiB0ZXh0IG1vZGUgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGdsb2JhbCB0cmFuc2ZlcgorICAgICAgICAgIG1vZGUuIFNlZSBjb21tZW50cyB1bmRlciBSRUNFSVZFIC9CSU5BUlkuCisKKyAgIFRoZSAvTUFJTCBhbmQgL1BSSU5UIG9wdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUsIGJ1dCB5b3UgY2FuIHVzZQorICAgL0NPTU1BTkQgdG8gYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3QsIGFzIGluIHRoZXNlIFVOSVggZXhhbXBsZXM6CisKKyAgciAvY29tbWFuZCB7bWFpbCBrZXJtaXRAY29sdW1iaWEuZWR1fQorICByIC9jb21tYW5kIGxwcgorCisgICBJbiBPUy8yIG9yIFdpbmRvd3MsIHlvdSBjYW4gUkVDRUlWRSBhbmQgcHJpbnQgbGlrZSB0aGlzOgorCisgIHJlY2VpdmUgcHJuCisKKyAgIFRoZSBDUkVDRUlWRSBjb21tYW5kIG5vdyBhbHNvIGFjY2VwdHMgdGhlIHNhbWUgc3dpdGNoZXMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC44LiBNaW5vciBLZXJtaXQgUHJvdG9jb2wgSW1wcm92ZW1lbnRzCisKKyAgICA0LjguMS4gTXVsdGlwbGUgQXR0cmlidXRlIFBhY2tldHMKKworICAgQy1LZXJtaXQgNy4wIG5vdyBzZW5kcyBtb3JlIHRoYW4gb25lIEF0dHJpYnV0ZSBwYWNrZXQgaWYgYSBmaWxlJ3MKKyAgIGF0dHJpYnV0ZXMgZG8gbm90IGZpdCBpbnRvIGEgc2luZ2xlIHBhY2tldCBvZiB0aGUgbmVnb3RpYXRlZCBsZW5ndGguCisgICBJZiBhIHBhcnRpY3VsYXIgYXR0cmlidXRlIChzdWNoIGFzIGZpbGUgY3JlYXRpb24gZGF0ZS10aW1lKSBkb2VzIG5vdAorICAgZml0IHdpdGhpbiB0aGUgbmVnb3RpYXRlZCBsZW5ndGggKHdoaWNoIHdpbGwgb25seSBoYXBwZW4gd2hlbiB0aGUKKyAgIG5lZ290aWF0ZWQgbGVuZ3RoIGlzIGFyb3VuZCAyMCBvciBsZXNzKSwgdGhhdCBhdHRyaWJ1dGUgaXMgbm90IHNlbnQgYXQKKyAgIGFsbC4KKworICAgIDQuOC4yLiBWZXJ5IFNob3J0IFBhY2tldHMKKworICAgVGhlcmUgYXJlIGNlcnRhaW4gc2l0dWF0aW9ucyB3aGVyZSBleHRyZW1lbHkgc2hvcnQgcGFja2V0cyBtdXN0IGJlCisgICB1c2VkOyAyMCBvciAzMCBieXRlcyBhdCBtb3N0LiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBvbmUgb3IgbW9yZSBkZXZpY2VzCisgICBhbG9uZyB0aGUgY29tbXVuaWNhdGlvbiBwYXRoIGhhdmUgdmVyeSBzbWFsbCBidWZmZXJzIGFuZCBsYWNrIGFuCisgICBlZmZlY3RpdmUgbWVhbnMgb2YgZmxvdyBjb250cm9sLiBFeGFtcGxlcyBhcmUgc29tZXRpbWVzIGNpdGVkCisgICBpbnZvbHZpbmcgcmFkaW8gbW9kZW1zLgorCisgICBXaGVuIHRoZSBtYXhpbXVtIHBhY2tldCBsZW5ndGggaXMgc2hvcnRlciB0aGFuIGNlcnRhaW4gcGFja2V0cyB0aGF0CisgICB3b3VsZCBiZSBzZW50LCB0aG9zZSBwYWNrZXRzIGFyZSBlaXRoZXIgdHJ1bmNhdGVkIG9yIGVsc2UgYnJva2VuIHVwCisgICBpbnRvIG11bHRpcGxlIHBhY2tldHMuIFNwZWNpZmljYWxseToKKworICAgIDEuIFBhcmFtZXRlciBuZWdvdGlhdGlvbiBwYWNrZXRzIChJLCBTLCBhbmQgdGhlaXIgQUNLcykgYXJlIHRydW5jYXRlZAorICAgICAgIHRvIHRoZSBuZWdvdGlhdGVkIGxlbmd0aC4gQW55IHBhcmFtZXRlcnMgdGhhdCBkbyBub3QgZml0IGFyZSByZXNldAorICAgICAgIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiBUaGVyZSBpcyBubyBwcm92aXNpb24gaW4gdGhlIEtlcm1pdAorICAgICAgIHByb3RvY29sIGZvciBmcmFnbWVudGF0aW9uIGFuZCByZWFzc2VtYmx5IG9mIHBhcmFtZXRlciBzdHJpbmdzLgorICAgIDIuIEZpbGUgaGVhZGVyIHBhY2tldHMgKGNvbnRhaW5pbmcgdGhlIGZpbGVuYW1lKSBhcmUgc2ltcGx5CisgICAgICAgdHJ1bmNhdGVkLiBUaGVyZSBpcyBubyBwcm92aXNpb24gaW4gdGhlIEtlcm1pdCBwcm90b2NvbCBmb3IKKyAgICAgICBmcmFnbWVudGF0aW9uIGFuZCByZWFzc2VtYmx5IG9mIGZpbGVuYW1lcy4KKyAgICAzLiBBdHRyaWJ1dGUgcGFja2V0cyBhcmUgZnJhZ21lbnRlZCBhbmQgcmVhc3NlbWJsZWQgYXMgZGVzY3JpYmVkIGluCisgICAgICAgNC44LjEgd2l0aG91dCBsb3NzIG9mIGRhdGEsIGV4Y2VwdCBpbiBjYXNlIGEgZmllbGQgd2lsbCBub3QgZml0IGF0CisgICAgICAgYWxsIGluIHRoZSBuZWdvdGlhdGVkIGxlbmd0aCAodGhlIGxvbmdlc3QgYXR0cmlidXRlIGlzIHVzdWFsbHkgdGhlCisgICAgICAgZGF0ZSBhbmQgdGltZSBvZiBmaWxlIGNyZWF0aW9uL21vZGlmaWNhdGlvbikgYmVjYXVzZSBvZiB0aGUgcnVsZQorICAgICAgIHRoYXQgYXR0cmlidXRlcyBtYXkgbm90IGJlIGJyb2tlbiBhY3Jvc3MgcGFja2V0cy4KKyAgICA0LiBEYXRhIHBhY2tldHMgYW5kIG90aGVyIHBhY2tldHMgYXJlIHVuYWZmZWN0ZWQgLS0gdGhleSBjYW4gYmUgYXMKKyAgICAgICBzaG9ydCBhcyB0aGV5IG5lZWQgdG8gYmUsIHdpdGhpbiByZWFzb24uCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC45LiBXaWxkY2FyZCAvIEZpbGUgR3JvdXAgRXhwYW5zaW9uCisKKyAgICJXaWxkY2FyZCIgcmVmZXJzIHRvIHRoZSBub3RhdGlvbiB1c2VkIGluIGZpbGVuYW1lcyB0byBzcGVjaWZ5IGEgZ3JvdXAKKyAgIG9mIGZpbGVzIGJ5IHBhdHRlcm4gbWF0Y2hpbmcuCisKKyAgICA0LjkuMS4gSW4gVU5JWCBDLUtlcm1pdAorCisgICBQcmlvciB0byBDLUtlcm1pdCA3LjAsIEMtS2VybWl0IHdhcyBjYXBhYmxlIG9mIGV4cGFuZGluZyB3aWxkY2FyZAorICAgc3RyaW5ncyBjb250YWluaW5nIG9ubHkgdGhlICJtZXRhY2hhcmFjdGVycyIgJyonIGFuZCAnPyc6CisKKyAgICoKKyAgICAgICAgICBNYXRjaGVzIGFueSBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycy4gRm9yIGV4YW1wbGU6CisgICAgICAgICAgImNrKi5jIiBtYXRjaGVzIGFsbCBmaWxlcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoICJjayIgYW5kIGVuZAorICAgICAgICAgIHdpdGggIi5jIiwgaW5jbHVkaW5nICJjay5jIi4KKworICAgPworICAgICAgICAgIE1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIuIEZvciBleGFtcGxlLCAiY2s/LmMiIG1hdGNoZXMgYWxsCisgICAgICAgICAgZmlsZXMgd2hvc2UgbmFtZXMgYXJlIGV4YWN0bHkgNSBjaGFyYWN0ZXJzIGxvbmcgYW5kIHN0YXJ0IHdpdGgKKyAgICAgICAgICAiY2siIGFuZCBlbmQgd2l0aCAiLmMiLiBXaGVuIHR5cGluZyBjb21tYW5kcyBhdCB0aGUgcHJvbXB0LCB5b3UKKyAgICAgICAgICBtdXN0IHByZWNlZGUgYW55IHF1ZXN0aW9uIG1hcmsgdG8gYmUgdXNlZCBmb3IgbWF0Y2hpbmcgYnkgYQorICAgICAgICAgIGJhY2tzbGFzaCAoXCkgdG8gb3ZlcnJpZGUgdGhlIG5vcm1hbCBmdW5jdGlvbiBvZiBxdWVzdGlvbiBtYXJrLAorICAgICAgICAgIHdoaWNoIGlzIHByb3ZpZGluZyBtZW51cyBhbmQgZmlsZSBsaXN0cy4KKworICAgQy1LZXJtaXQgNy4wIGFkZHMgdGhlIGFkZGl0aW9uYWwgZmVhdHVyZXMgdGhhdCB1c2VycyBvZiBrc2gsIGNzaCwgYW5kCisgICBiYXNoIGFyZSBhY2N1c3RvbWVkIHRvOgorCisgICBbYWJjXQorICAgICAgICAgIFNxdWFyZSBicmFja2V0cyBlbmNsb3NpbmcgYSBsaXN0IG9mIGNoYXJhY3RlcnMgbWF0Y2hlcyBhbnkKKyAgICAgICAgICBzaW5nbGUgY2hhcmFjdGVyIGluIHRoZSBsaXN0LiBFeGFtcGxlOiBja3V1c3IuW2NoXSBtYXRjaGVzCisgICAgICAgICAgY2t1dXNyLmMgYW5kIGNrdXVzci5oLgorCisgICBbYS16XQorICAgICAgICAgIFNxdWFyZSBicmFja2V0cyBlbmNsb3NpbmcgYSByYW5nZSBvZiBjaGFyYWN0ZXJzOyB0aGUgaHlwaGVuCisgICAgICAgICAgc2VwYXJhdGVzIHRoZSBsb3cgYW5kIGhpZ2ggZWxlbWVudHMgb2YgdGhlIHJhbmdlLiBGb3IgZXhhbXBsZSwKKyAgICAgICAgICBbYS16XSBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgZnJvbSBhIHRvIHouCisKKyAgIFthY2RtLXpdCisgICAgICAgICAgTGlzdHMgYW5kIHJhbmdlcyBtYXkgYmUgY29tYmluZWQuIFRoaXMgZXhhbXBsZSBtYXRjaGVzIGEsIGMsIGQsCisgICAgICAgICAgb3IgbSB0aHJvdWdoIHouCisKKyAgIHtzdHJpbmcxLHN0cmluZzIsLi4ufQorICAgICAgICAgIEJyYWNlcyBlbmNsb3NlIGEgbGlzdCBvZiBzdHJpbmdzIHRvIGJlIG1hdGNoZWQuIEZvciBleGFtcGxlOgorICAgICAgICAgIGNre3VmaW8sdmNvbixjbWFpfS5jIG1hdGNoZXMgY2t1ZmlvLmMsIGNrdmNvbi5jLCBvciBja2NtYWkuYy4KKyAgICAgICAgICBUaGUgc3RyaW5ncyBtYXkgdGhlbXNlbHZlcyBjb250YWluIG1ldGFjaGFyYWN0ZXJzLCBicmFja2V0CisgICAgICAgICAgbGlzdHMsIG9yIGluZGVlZCwgb3RoZXIgbGlzdHMgb2Ygc3RyaW5ncywgYnV0ICh3aGVuIG1hdGNoaW5nCisgICAgICAgICAgZmlsZW5hbWVzKSB0aGV5IG1heSBub3QgY29udGFpbiBkaXJlY3Rvcnkgc2VwYXJhdG9ycy4KKworICAgICAgICAgIFRodXMsIHRoZSBtZXRhY2hhcmFjdGVycyBpbiBmaWxlbmFtZXMgKGFuZCBpbiBhbnkgb3RoZXIgZmllbGQKKyAgICAgICAgICB0aGF0IGNhbiBiZSBhIHBhdHRlcm4sIHN1Y2ggYXMgdGhlIElGIE1BVENIIHBhdHRlcm4sIFNFTkQgb3IKKyAgICAgICAgICBHRVQgZXhjZXB0aW9uIGxpc3RzLCBldGMpIGFyZToKKworICogPyBbIHsKKworICAgICAgICAgIEFuZCB3aXRoaW4gYnJhY2VzIG9ubHksIGNvbW1hICgsKSBpcyBhIG1ldGFjaGFyYWN0ZXIuCisKKyAgIFRvIGluY2x1ZGUgYSBtZXRhY2hhcmFjdGVyIGluIGEgcGF0dGVybiBsaXRlcmFsbHksIHByZWNlZGUgaXQgd2l0aCBhCisgICBiYWNrc2xhc2ggJ1wnIChvciB0d28gaWYgeW91IGFyZSBwYXNzaW5nIHRoZSBwYXR0ZXJuIHRvIGEgbWFjcm8pLgorICAgRXhhbXBsZXM6CisKKyAgc2VuZCBhKmIgICAgICA7IFNlbmQgYWxsIGZpbGVzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggJ2EnIGFuZCBlbmQgd2l0aCAnYicuCisgIHNlbmQgYT9iICAgICAgOyBEaXR0bywgYnV0IHRoZSBuYW1lIG11c3QgYmUgZXhhY3RseSB0aHJlZSBjaGFyYWN0ZXJzIGxvbmcuCisgIHNlbmQgYVthLXpdYiAgOyBEaXR0bywgYnV0IHRoZSBzZWNvbmQgY2hhcmFjdGVyIG11c3QgYmUgYSBsb3dlcmNhc2UgbGV0dGVyLgorICBzZW5kIGFbeFwtel1iIDsgRGl0dG8sIGV4Y2VwdCB0aGUgc2Vjb25kIGNoYXJhY3RlciBtdXN0IGJlICd4JywgJy0nLCBvciAneScuCisgIHNlbmQgYVtnaGldYiAgOyBEaXR0bywgZXhjZXB0IHRoZSBzZWNvbmQgY2hhcmFjdGVyIG11c3QgYmUgJ2cnLCAnaCcsIG9yICdpJy4KKyAgc2VuZCBhWz8qXWIgICA7IERpdHRvLCBleGNlcHQgdGhlIHNlY29uZCBjaGFyYWN0ZXIgbXVzdCBiZSAnPycgb3IgJyonLgorICBzZW5kIGFbXD9cKl1iIDsgU2FtZSBhcyBwcmV2aW91cy4KKyAgc2VuZCAqP1thLXpdKiA7IEFsbCBmaWxlcyB3aXRoIG5hbWVzIGNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgIDsgdGhhdCBpcyBmb2xsb3dlZCBieSBhIGxvd2VyY2FzZSBsZXR0ZXIuCisKKyAgIE9yLCBtb3JlIHByYWN0aWNhbGx5OgorCisgIHNlbmQgY2tbY3V3XSouW2N3aF0gIDsgU2VuZCB0aGUgVU5JWCBDLUtlcm1pdCBzb3VyY2UgZmlsZXMuCisKKyAgIFRvIHJlZmVyIHRvIHRoZSBDLUtlcm1pdCBzb3VyY2VzIGZpbGVzIGFuZCBtYWtlZmlsZSBhbGwgaW4gb25lCisgICBmaWxlc3BlYzoKKworICB7e21ha2VmaWxlLGNrW2N1d10qLltjd2hdfX0KKworICAgKE5PVEU6IGlmIHRoZSBlbnRpcmUgcGF0dGVybiBpcyBhIHtzdHJpbmdsaXN0fSwgeW91IG11c3QgZW5jbG9zZSBpdCBpdAorICAgVFdPIHBhaXJzIG9mIGJyYWNlcywgc2luY2UgdGhlIFNFTkQgY29tbWFuZCBzdHJpcHMgdGhlIG91dGVyIGJyYWNlCisgICBwYWlyLCBiZWNhdXNlIG9mIHRoZSAiZW5jbG9zZSBpbiBicmFjZXMgaWYgdGhlIGZpbGVuYW1lIGNvbnRhaW5zCisgICBzcGFjZXMiIHJ1bGUpLgorCisgICBJZiB0aGUgbWFrZWZpbGUgaXMgY2FsbGVkIGNrdWtlci5tYWs6CisKKyAgY2tbY3V3XSoue1tjd2hdLG1ha30KKworICAgKE5PVEU6IGRvdWJsZSBicmFjZXMgYXJlIG5vdCBuZWVkZWQgaGVyZSBzaW5jZSB0aGUgcGF0dGVybiBkb2VzIG5vdAorICAgYm90aCBiZWdpbiBhbmQgZW5kIHdpdGggYSBicmFjZS4pCisKKyAgIFRvIGFkZCBpbiBhbGwgdGhlIEMtS2VybWl0IHRleHQgZmlsZXM6CisKKyAgY2tbY3V3XSoue1tjd2hdLG1hayx0eHR9CisKKyAgIEFsbCBvZiB0aGVzZSBmZWF0dXJlcyBjYW4gYmUgdXNlZCBhbnl3aGVyZSB5b3Ugd291bGQgdHlwZSBhIGZpbGVuYW1lCisgICB0aGF0IGlzIGFsbG93ZWQgdG8gY29udGFpbiB3aWxkY2FyZHMuCisKKyAgIFdoZW4geW91IGFyZSB0eXBpbmcgYXQgdGhlIGNvbW1hbmQgcHJvbXB0LCBhbiBleHRyYSBsZXZlbCBvZiBxdW90aW5nCisgICBpcyByZXF1aXJlZCBmb3IgdGhlICc/JyBjaGFyYWN0ZXIgdG8gZGVmZWF0IGl0cyByZWd1bGFyIGZ1bmN0aW9uIG9mCisgICBwcm9kdWNpbmcgYSBsaXN0IG9mIGZpbGVzIHRoYXQgbWF0Y2ggd2hhdCB5b3UgaGF2ZSB0eXBlZCBzbyBmYXIsIGZvcgorICAgZXhhbXBsZToKKworICBzZW5kIGNrW2N1XT8KKworICAgbGlzdHMgYWxsIHRoZSBmaWxlcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIGNrYyBhbmQgY2t1LiBJZiB5b3UgcXVvdGUKKyAgIHRoZSBxdWVzdGlvbiBtYXJrLCBpdCBpcyB1c2VkIGFzIGEgcGF0dGVybi1tYXRjaGluZyBjaGFyYWN0ZXIsIGZvcgorICAgZXhhbXBsZToKKworICBzZW5kIGNrXD9bZnRdaW8uYworCisgICBzZW5kcyBhbGwgdGhlIGZpbGUgYW5kIGNvbW11bmljYXRpb25zIGkvbyBtb2R1bGVzIGZvciBhbGwgdGhlCisgICBwbGF0Zm9ybXM6IGNrdWZpby5jLCBja3V0aW8uYywgY2t2ZmlvLmMsIGNrdnRpby5jLCBldGMuCisKKyAgIElmLCBob3dldmVyLCBhIGZpbGVuYW1lIGFjdHVhbGx5IGNvbnRhaW5zIGEgcXVlc3Rpb24gbWFyayBhbmQgeW91IG5lZWQKKyAgIHRvIHJlZmVyIHRvIGl0IG9uIHRoZSBjb21tYW5kIGxpbmUsIHlvdSBtdXN0IHVzZSB0aHJlZSAoMykKKyAgIGJhY2tzbGFzaGVzLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpbGUgaXMgYWN0dWFsbHkgY2FsbGVkIGNrP2Zpby5jLCB5b3UKKyAgIHdvdWxkIHVzZToKKworICBzZW5kIGNrXFxcP2Zpby5jCisKKyAgIEZ1cnRoZXIgbm90ZXMgb24gcXVvdGluZzoKKworICAgICAqIEEgc2luZ2xlIGJhY2tzbGFzaCBpcyBzdWZmaWNpZW50IGZvciBxdW90aW5nIGEgc3BlY2lhbCBjaGFyYWN0ZXIKKyAgICAgICBhdCB0aGUgY29tbWFuZCBwcm9tcHQgb3IgaW4gYSBjb21tYW5kIGZpbGUuIEhvd2V2ZXIsIHdoZW4gcGFzc2luZworICAgICAgIHBhdHRlcm5zIHRvIG1hY3JvcyB5b3UnbGwgbmVlZCBkb3VibGUgYmFja3NsYXNoZXMsIGFuZCB3aGVuCisgICAgICAgcmVmZXJyaW5nIHRvIHRoZXNlIHBhdHRlcm5zIHdpdGhpbiB0aGUgbWFjcm8sIHlvdSdsbCBuZWVkIHRvIHVzZQorICAgICAgIFxmY29udGVudHMoXCUxKSAoc2VlIFs0OThdU2VjdGlvbiAxLjExLjUpLiBZb3Ugc2hvdWxkIGVuY2xvc2UKKyAgICAgICBtYWNybyBhcmd1bWVudCByZWZlcmVuY2VzIGluIGJyYWNlcyBpbiBjYXNlIGdyb3VwZWQgYXJndW1lbnRzIHdlcmUKKyAgICAgICBwYXNzZWQuIEV4YW1wbGU6CisgZGVmaW5lIGlzbWF0Y2ggeworICAgICBpZiBtYXRjaCB7XGZjb250KFwlMSl9IHtcZmNvbnQoXCUyKX0geworICAgICAgICAgZW5kIDAgTUFUQ0gKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgIGVuZCAxIE5PIE1BVENICisgICAgIH0KKyB9CisgaXNtYXRjaCBhYip5eiBhKlxcKip6ICAgICAgICAgICA7IEJhY2tzbGFzaCBtdXN0IGJlIGRvdWJsZWQKKyBpc21hdGNoIHthYmMgZGVmIHh5en0gKmIqZSp5KiAgIDsgQnJhY2VzIG11c3QgYmUgdXNlZCBmb3IgZ3JvdXBpbmcKKyAgICAgKiBXYXRjaCBvdXQgZm9yIHBvc3NpYmxlIGNvbmZsaWN0cyBiZXR3ZWVuIHt9IGluIGZpbGVuYW1lIHBhdHRlcm5zCisgICAgICAgYW5kIHt9IHVzZWQgZm9yIGdyb3VwaW5nIG11bHRpcGxlIHdvcmRzIGludG8gYSBzaW5nbGUgZmllbGQsIHdoZW4KKyAgICAgICB0aGUgcGF0dGVybiBoYXMgb3V0ZXIgYnJhY2VzLiBGb3IgZXhhbXBsZSwgaW46CisgICAgIGlmIG1hdGNoIHthYmMgeHl6fSB7YSogKnp9IGVjaG8gVEhFWSBNQVRDSAorICAgICAgIGJyYWNlcyBtdXN0IGJlIHVzZWQgdG8gZ3JvdXAgImFiYyB4eXoiIGludG8gYSBzaW5nbGUgc3RyaW5nLgorICAgICAgIEtlcm1pdCBzdHJpcHMgb2ZmIHRoZSBicmFjZXMgYmVmb3JlIGNvbXBhcmluZyB0aGUgc3RyaW5nIHdpdGggdGhlCisgICAgICAgcGF0dGVybi4gVGhlcmVmb3JlOgorIGlmIG1hdGNoIG1ha2VmaWxlIHttYWtlZmlsZSxNYWtlZmlsZX0gZWNobyBUSEVZIE1BVENICisgICAgICAgZG9lcyBub3Qgd29yaywgYnV0OgorIGlmIG1hdGNoIG1ha2VmaWxlIHt7bWFrZWZpbGUsTWFrZWZpbGV9fSBlY2hvIFRIRVkgTUFUQ0gKKyAgICAgICBkb2VzLgorICAgICAqIElmIHlvdSB1c2UgYSBwYXR0ZXJuIHRoYXQgaGFzIG91dGVyIGJyYWNlcywgbGlrZSB7Ki50eHQsKi5kb2N9LCBpbgorICAgICAgIGEgZmllbGQgdGhhdCBhY2NlcHRzIGEgcGF0dGVybiBsaXN0IChsaWtlIFNFTkQgL0VYQ0VQVDp4eHgpLAorICAgICAgIHlvdSdsbCBuZWVkIHRvIGFkZCB0d28gZXh0cmEgc2V0cyBvZiBvdXRlciBicmFjZXM6Cisgc2VuZCAvZXhjZXB0Ont7eyoudHh0LCouZG9jfX19ICouKgorCisgICBDLUtlcm1pdCdzIG5ldyBwYXR0ZXJuIG1hdGNoaW5nIGNhcGFiaWxpdGllcyBhcmUgYWxzbyB1c2VkIHdoZW4KKyAgIEMtS2VybWl0IGlzIGluIHNlcnZlciBtb2RlLCBzbyBub3cgeW91IGNhbiBzZW5kIHJlcXVlc3RzIHN1Y2ggYXM6CisKKyAgZ2V0IGNrW2N1d10qLltjd2hdCisKKyAgIHRvIGEgQy1LZXJtaXQgc2VydmVyIHdpdGhvdXQgaGF2aW5nIHRvIHRlbGwgaXQgdG8gU0VUIFdJTEQgU0hFTEwKKyAgIGZpcnN0LiBQcmV2aW91c2x5IHRoaXMgd291bGQgaGF2ZSByZXF1aXJlZDoKKworICBtZ2V0IGNrYyouYyBja2MqLncgY2tjKi5oIGNrdSouYyBja3UqLncgY2t1Ki5oIGNrdyouYyBja3cqLncgY2t3Ki5oCisKKyAgIFRoZSBuZXcgcGF0dGVybiBtYXRjaGluZyBmZWF0dXJlcyBtYWtlIFNFVCBXSUxEIFNIRUxMIHJlZHVuZGFudCwgYW5kCisgICBiYXJyaW5nIGFueSBvYmplY3Rpb25zLCBpdCB3aWxsIGV2ZW50dWFsbHkgYmUgcGhhc2VkIG91dC4gKE9uZQorICAgcG9zc2libGUgcmVhc29uIGZvciByZXRhaW5pbmcgaXQgd291bGQgYmUgYXMgYW4gZXNjYXBlIG1lY2hhbmlzbSB3aGVuCisgICBLZXJtaXQgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgdW5kZXJseWluZyBmaWxlIHN5c3RlbS4pCisKKyAgIEJ5IHRoZSB3YXksIHBhdHRlcm5zIHN1Y2ggYXMgdGhlc2UgYXJlIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcworICAgInJlZ3VsYXIgZXhwcmVzc2lvbnMiLCBidXQgdGhleSBhcmUgbm90IHF1aXRlIHRoZSBzYW1lLiBJbiBhIHRydWUKKyAgIHJlZ3VsYXIgZXhwcmVzc2lvbiAoZm9yIGV4YW1wbGUpLCAiKiIgbWVhbnMgInplcm8gb3IgbW9yZSByZXBldGl0aW9ucworICAgb2YgdGhlIHByZXZpb3VzIGl0ZW0iLCBzbyAoZm9yIGV4YW1wbGUpLCAiKFswLTldKikiIHdvdWxkIG1hdGNoIHplcm8KKyAgIG9yIG1vcmUgZGlnaXRzIGluIHBhcmVudGhlc2VzLiBJbiBLZXJtaXQgKGFuZCBpbiBtb3N0IHNoZWxscyksIHRoaXMKKyAgIG1hdGNoZXMgb25lIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzLCB3aXRoaW4KKyAgIHBhcmVudGhlc2VzLiBIZXJlIGFyZSBzb21lIGhpbnRzOgorCisgICAgICogQWx0aG91Z2ggeW91IGNhbid0IG1hdGNoIGFueSBzZXF1ZW5jZSBvZiBkaWdpdHMgKG9yIGxldHRlcnMsIGV0YyksCisgICAgICAgeW91IGNhbiBtYXRjaCAoc2F5KSAxLCAyLCBvciAzIG9mIHRoZW0gaW4gcm93LiBGb3IgZXhhbXBsZSwgdGhlCisgICAgICAgZm9sbG93aW5nIHBhdHRlcm4gbWF0Y2hlcyBLZXJtaXQgYmFja3VwIGZpbGVzICh3aXRoIGJhY2t1cCBudW1iZXJzCisgICAgICAgZnJvbSAxIHRvIDk5OSk6CisgKi5+e1sxLTldLFsxLTldWzAtOV0sWzEtOV1bMC05XVswLTldfX4KKyAgICAgKiBUaGVyZSBpcyBwcmVzZW50bHkgbm8gTk9UIG9wZXJhdG9yLCBzbyBubyB3YXkgdG8gbWF0Y2ggYW55CisgICAgICAgY2hhcmFjdGVyIG9yIHN0cmluZyBFWENFUFQgdGhlIG9uZShzKSBzaG93bi4KKworICAgSW4gb3RoZXIgd2lsZGNhcmRpbmcgbmV3cy4uLgorCisgICAgICogWW91IG1heSBub3cgInNlbmQgeHh4IiB3aGVyZSAieHh4IiBpcyBhIGRpcmVjdG9yeSBuYW1lLCBhbmQgdGhpcworICAgICAgIHdpbGwgc2VuZCBhbGwgdGhlIGZpbGVzIGZyb20gdGhlIGRpcmVjdG9yeSB4eHgsIGFzIGlmIHlvdSBoYWQKKyAgICAgICB0eXBlZCAic2VuZCB4eHgvKiIuIFlvdSBjYW4gYWxzbyB1c2UgdGhlIHNwZWNpYWwgc2hvcnRoYW5kICJzZW5kCisgICAgICAgLiIgdG8gc2VuZCBhbGwgdGhlIGZpbGVzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICAgICAqIFRvIGVhc2lseSBza2lwIG92ZXIgYmFja3VwIGZpbGVzICh0aGUgb25lcyB3aG9zZSBuYW1lcyBlbmQgbGlrZQorICAgICAgIC5+MjJ+KSB3aGVuIHNlbmRpbmcsIHlvdSBjYW4gdXNlIFNFTkQgL05PQkFDS1VQIChzZWUgWzQ5OV1TZWN0aW9uCisgICAgICAgNC4wLjYgZm9yIGRldGFpbHMpLgorICAgICAqIFdoZW4gY2hvb3NpbmcgS2VybWl0IHRvIGV4cGFuZCB3aWxkY2FyZHMsIHJhdGhlciB0aGFuIHRoZSBzaGVsbCwKKyAgICAgICB5b3UgY2FuIGNob29zZSB3aGV0aGVyICJkb3QgZmlsZXMiIC0tIGZpbGVzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGgKKyAgICAgICAiLiIsIHdoaWNoIGFyZSBub3JtYWxseSAiaW52aXNpYmxlIiAtLSBzaG91bGQgYmUgbWF0Y2hlZDoKKyBTRVQgV0lMRCBLRVJNSVQgL05PLU1BVENILURPVC1GSUxFUyAodGhpcyBpcyB0aGUgZGVmYXVsdCkKKyBTRVQgV0lMRCBLRVJNSVQgL01BVENILURPVC1GSUxFUyAgICAodGhpcyBhbGxvd3MgbWF0Y2hpbmcgb2YgIi4iIGZpbGVzKQorICAgICAgIG9yIGluY2x1ZGUgdGhlIC9ET1RGSUxFUyBvciAvTk9ET1RGSUxFUyBzd2l0Y2ggb24gdGhlIGNvbW1hbmQgeW91CisgICAgICAgYXJlIHVzaW5nLCBzdWNoIGFzIFNFTkQgb3IgRElSRUNUT1JZLgorICAgICAqIENvbW1hbmRzIHN1Y2ggYXMgRElSRUNUT1JZIGFuZCBTRU5EIGFsbG93IHJlY3Vyc2l2ZSBkaXJlY3RvcnkKKyAgICAgICB0cmF2ZXJzYWwuIFRoZXJlIGFyZSBhbHNvIG5ldyBmdW5jdGlvbnMgZm9yIHRoaXMgdG8gdXNlIGluCisgICAgICAgc2NyaXB0cy4gU2VlIFs1MDBdU2VjdGlvbiA0LjExIGZvciBkZXRhaWxzLgorCisgICBXaGVuIGJ1aWxkaW5nIGZpbGUgbGlzdHMgaW4gVU5JWCwgQy1LZXJtaXQgZm9sbG93cyBzeW1ib2xpYyBsaW5rcy4KKyAgIEJlY2F1c2Ugb2YgdGhpcywgeW91IG1pZ2h0IGVuY291bnRlciBhbnkgb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmcKKyAgIHBoZW5vbWVuYToKKworICAgICAqIE11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSBmaWxlOyBlLmcuIG9uZSBmcm9tIGl0cyByZWFsIGRpcmVjdG9yeQorICAgICAgIGFuZCBvdGhlcnMgZnJvbSBsaW5rcyB0byBpdHMgcmVhbCBkaXJlY3RvcnksIGlmIGJvdGggdGhlIHJlYWwKKyAgICAgICBkaXJlY3RvcnkgYW5kIHRoZSBsaW5rcyB0byBpdCBhcmUgaW4gdGhlIHdpbGRjYXJkIGV4cGFuc2lvbiBsaXN0LgorICAgICAqIEEgY29tbWFuZCBtaWdodCB1bmV4cGVjdGVkbHkgImhhbmciIGZvciBhIGxvbmcgdGltZSBiZWNhdXNlIGFuIE5GUworICAgICAgIGxpbmsgbWlnaHQgbm90IGJlIHJlc3BvbmRpbmcsIG9yIHRoZSBkaXJlY3RvcnkgeW91IGFyZSBsb29raW5nIGF0CisgICAgICAgY29udGFpbnMgYSBsaW5rIHRvIGEgaHVnZSBkaXJlY3RvcnkgdHJlZSAoZXhhbXBsZTogImRpcmVjdG9yeQorICAgICAgIC9yZWN1cnNpdmUgL2V0YyIgd2hlbiAvZXRjL3Nwb29sIGlzIGEgc3ltbGluayB0byAvdmFyL3Nwb29sLCB3aGljaAorICAgICAgIGlzIGEgbGFyZ2Ugb3JnYW5pemF0aW9uJ3MgaW5jb21pbmcgZW1haWwgZGlyZWN0b3J5LCBjb250YWluaW5nCisgICAgICAgdGVucyBvZiB0aG91c2FuZHMgb2Ygc3ViZGlyZWN0b3JpZXMpLgorCisgICBUaGUgc2l6ZSBvZiB0aGUgZmlsZSBsaXN0IHRoYXQgS2VybWl0IGNhbiBidWlsZCBpcyBsaW1pdGVkIGluIG1vc3QKKyAgIEMtS2VybWl0IGltcGxlbWVudGF0aW9ucy4gVGhlIGxpbWl0LCBpZiBhbnksIGRlcGVuZHMgb24gdGhlCisgICBpbXBsZW1lbnRhdGlvbi4gVXNlIHRoZSBTSE9XIEZFQVRVUkVTIGNvbW1hbmQgYW5kIGxvb2sgaW4gdGhlCisgICBhbHBoYWJldGl6ZWQgb3B0aW9ucyBsaXN0IGZvciBNQVhXTEQgdG8gc2VlIHRoZSB2YWx1ZS4KKworICAgIDQuOS4yLiBJbiBLZXJtaXQgOTUKKworICAgS2VybWl0IDk1IDEuMS4xOSBhbmQgbGF0ZXIgdXNlcyB0aGUgc2FtZSBwYXR0ZXJuIG1hdGNoaW5nIHN5bnRheCBhcyBpbgorICAgVU5JWCwgYnV0IChhcyBhbHdheXMpIHlvdSB3aWxsIGVuY291bnRlciBudW1lcm91cyBkaWZmaWN1bHRpZXMgaWYgeW91CisgICB1c2UgYmFja3NsYXNoIChcKSBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvci4gSW4gYW55IGNvbW1hbmQgd2hlcmUgSzk1CisgICBwYXJzZXMgZmlsZW5hbWVzIGl0c2VsZiAodGhhdCBpcywgcHJhY3RpY2FsbHkgYW55IGZpbGUtb3JpZW50ZWQKKyAgIGNvbW1hbmQgZXhjZXB0IFJVTiksIHlvdSBjYW4gdXNlIGZvcndhcmQgc2xhc2ggKC8pIGFzIHRoZSBkaXJlY3RvcnkKKyAgIHNlcGFyYXRvciB0byBhdm9pZCBhbGwgdGhlIG5hc3R5IGNvbmZsaWN0cy4KKworICAgIDQuOS4zLiBJbiBWTVMsIEFPUy9WUywgT1MtOSwgVk9TLCBldGMuCisKKyAgIFBsYXRmb3JtcyBvdGhlciB0aGFuIFVOSVgsIFdpbmRvd3MgOTUvOTgvTlQsIGFuZCBPUy8yIGhhdmUgdGhlaXIgb3duCisgICBmaWxlbmFtZSBtYXRjaGluZyBjYXBhYmlsaXRpZXMgdGhhdCBhcmUsIGluIGdlbmVyYWwsIGRpZmZlcmVudCBmcm9tCisgICBLZXJtaXQncyBidWlsdC1pbiBvbmVzIGFuZCBpbiBhbnkgY2FzZSBtaWdodCBjb25mbGljdCB3aXRoIHRoZW0uIEZvcgorICAgZXhhbXBsZSwgW10gZW5jbG9zZXMgZGlyZWN0b3J5IG5hbWVzIGluIFZNUy4KKworICAgTmV2ZXJ0aGVsZXNzIHlvdSBjYW4gc3RpbGwgdXNlIGFsbCB0aGUgcGF0dGVybi1tYXRjaGluZyBjYXBhYmlsaXRpZXMKKyAgIGRlc2NyaWJlZCBpbiBbNTAxXVNlY3Rpb24gNC45LjEgYnkgbG9hZGluZyBhIGZpbGUgbGlzdCBpbnRvIGFuIGFycmF5CisgICAoZS5nLiB3aXRoIFxmZmlsZXMoKiwmYSksIHNlZSBbNTAyXVNlY3Rpb24gNC4xMS4zKSBhbmQgdGhlbiB1c2luZyBJRgorICAgTUFUQ0ggb24gdGhlIG1lbWJlcnMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC4xMC4gQWRkaXRpb25hbCBQYXRobmFtZSBDb250cm9scworCisgICBJbiB2ZXJzaW9uIDYuMCBhbmQgZWFybGllciwgQy1LZXJtaXQncyBTRVQgeyBTRU5ELCBSRUNFSVZFIH0gUEFUSE5BTUVTCisgICBjb21tYW5kIGhhZCBvbmx5IE9OIGFuZCBPRkYgYXMgb3B0aW9ucy4gSW4gdmVyc2lvbiA3LjAsIHRoZXJlIGFyZSBtb3JlCisgICBjaG9pY2VzOgorCisgICBTRVQgU0VORCBQQVRITkFNRVMgT0ZGCisgICAgICAgICAgV2hlbiBzZW5kaW5nIGEgZmlsZSwgc3RyaXAgYWxsIGRpc2svZGlyZWN0b3J5IGluZm9ybWF0aW9uIGZyb20KKyAgICAgICAgICB0aGUgbmFtZS4gRXhhbXBsZTogInNlbmQgL3Vzci9vbGdhL2xldHRlcnMvb29mYS50eHQiIHNlbmRzIHRoZQorICAgICAgICAgIGZpbGUgYXMgIm9vZmEudHh0Ii4gVGhpcyBhcHBsaWVzIHRvIGFjdHVhbCBmaWxlbmFtZXMsIG5vdCB0bworICAgICAgICAgIGFueSBhcy1uYW1lIHlvdSBtaWdodCBzcGVjaWZ5LgorCisgICBTRVQgU0VORCBQQVRITkFNRVMgUkVMQVRJVkUKKyAgICAgICAgICBXaGVuIHNlbmRpbmcgYSBmaWxlLCBsZWF2ZSB0aGUgcGF0aG5hbWUgb24gYXMgZ2l2ZW4uIEZvcgorICAgICAgICAgIGV4YW1wbGUsIGlmIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgaXMgL3Vzci9vbGdhLCAic2VuZAorICAgICAgICAgIGxldHRlcnMvb29mYS50eHQiIHNlbmRzIHRoZSBmaWxlIGFzICJsZXR0ZXJzL29vZmEudHh0Iiwgbm90CisgICAgICAgICAgIi91c3Ivb2xnYS9sZXR0ZXJzL29vZmEudHh0IiBvciAibGV0dGVycy50eHQiLgorCisgICBTRVQgU0VORCBQQVRITkFNRVMgQUJTT0xVVEUKKyAgICAgICAgICBXaGVuIHNlbmRpbmcgYSBmaWxlLCBjb252ZXJ0IGl0cyBuYW1lIHRvIHRoZSBmdWxsLCBhYnNvbHV0ZQorICAgICAgICAgIGxvY2FsIHBhdGhuYW1lLiBGb3IgZXhhbXBsZSwgaWYgeW91ciBjdXJyZW50IGRpcmVjdG9yeSBpcworICAgICAgICAgIC91c3Ivb2xnYSwgInNlbmQgbGV0dGVycy9vb2ZhLnR4dCIgc2VuZHMgdGhlIGZpbGUgYXMKKyAgICAgICAgICAiL3Vzci9vbGdhL2xldHRlcnMvb29mYS50eHQiLiBOT1RFOiBFdmVuIHdpdGggdGhpcyBzZXR0aW5nLAorICAgICAgICAgIGRldmljZSBhbmQvb3Igbm9kZSBuYW1lcyBhcmUgbm90IGluY2x1ZGVkLiBGb3IgZXhhbXBsZSwgaW4gVk1TLAorICAgICAgICAgIGFueSBub2RlIG9yIGRldmljZSBuYW1lIGlzIHN0cmlwcGVkOyBpbiBXaW5kb3dzIG9yIE9TLzIsIGFueQorICAgICAgICAgIGRpc2sgbGV0dGVyIGlzIHN0cmlwcGVkLgorCisgICBTRVQgUkVDRUlWRSBQQVRITkFNRVMgT0ZGCisgICAgICAgICAgV2hlbiByZWNlaXZpbmcgYSBmaWxlLCBzdHJpcCBhbGwgZGlzay9kaXJlY3RvcnkgaW5mb3JtYXRpb24KKyAgICAgICAgICBmcm9tIHRoZSBuYW1lIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHN0b3JlIGl0LiBUaGlzIGFwcGxpZXMgdG8KKyAgICAgICAgICBpbmNvbWluZyBmaWxlbmFtZSwgbm90IHRvIGFueSBhcy1uYW1lIHlvdSBtaWdodCBzcGVjaWZ5LgorICAgICAgICAgIEV4YW1wbGU6IElmIGEgZmlsZSBhcnJpdmVzIHVuZGVyIHRoZSBuYW1lCisgICAgICAgICAgIi91c3Ivb2xnYS9sZXR0ZXJzL29vZmEudHh0IiBpdCBpcyBzdG9yZWQgc2ltcGx5IGFzICJvb2ZhLnR4dCIKKyAgICAgICAgICBpbiB5b3VyIGRvd25sb2FkIGRpcmVjdG9yeSBvciwgaWYgbm8gZG93bmxvYWQgZGlyZWN0b3J5IGhhcworICAgICAgICAgIGJlZW4gc3BlY2lmaWVkLCBpbiB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5LgorCisgICBTRVQgUkVDRUlWRSBQQVRITkFNRVMgUkVMQVRJVkUKKyAgICAgICAgICBXaGVuIHJlY2VpdmluZyBhIGZpbGUsIGxlYXZlIHRoZSBwYXRobmFtZSBvbiBhcyBpdCBhcHBlYXJzIGluCisgICAgICAgICAgdGhlIGluY29taW5nIG5hbWUsIGJ1dCBpZiB0aGUgaW5jb21pbmcgbmFtZSBhcHBlYXJzIHRvIGJlCisgICAgICAgICAgYWJzb2x1dGUsIG1ha2UgaXQgcmVsYXRpdmUgdG8geW91ciBjdXJyZW50IG9yIGRvd25sb2FkCisgICAgICAgICAgZGlyZWN0b3J5LiBFeGFtcGxlczoKKworICAgICAgICAgICsgIm9vZmEudHh0IiBpcyBzdG9yZWQgYXMgIm9vZmEudHh0Ii4KKyAgICAgICAgICArICJsZXR0ZXJzL29vZmEudHh0IiBpcyBzdG9yZWQgYXMgImxldHRlcnMvb29mYS50eHQiOyB0aGUKKyAgICAgICAgICAgICJsZXR0ZXJzIiBzdWJkaXJlY3RvcnkgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5CisgICAgICAgICAgICBleGlzdC4KKyAgICAgICAgICArICIvdXNyL29sZ2EvbGV0dGVycy9vb2ZhLnR4dCIgaXMgc3RvcmVkIGFzCisgICAgICAgICAgICAidXNyL29sZ2EvbGV0dGVycy9vb2ZhLnR4dCIgaW4geW91ciBjdXJyZW50IG9yIGRvd25sb2FkCisgICAgICAgICAgICBkaXJlY3RvcnksIGFuZCB0aGUgInVzciIsICJ1c3Ivb2xnYSIsIGV0YywgZGlyZWN0b3JpZXMgYXJlCisgICAgICAgICAgICBjcmVhdGVkIGlmIHRoZXkgZG8gbm90IGV4aXN0LgorCisgICBTRVQgUkVDRUlWRSBQQVRITkFNRVMgQUJTT0xVVEUKKyAgICAgICAgICBUaGUgaW5jb21pbmcgZmlsZW5hbWUgaXMgdXNlZCBhcyBnaXZlbi4gVGh1cyBpdCBjYW5ub3QgYmUKKyAgICAgICAgICBzdG9yZWQgdW5sZXNzIHRoZSBnaXZlbiBwYXRoIChpZiBhbnkpIGFscmVhZHkgZXhpc3RzIG9yIGNhbiBiZQorICAgICAgICAgIGNyZWF0ZWQuIEluIHRoaXMgY2FzZSwgbm9kZSwgZGV2aWNlLCBvciBkaXNrIGRlc2lnbmF0aW9ucyBhcmUKKyAgICAgICAgICBOT1Qgc3RyaXBwZWQsIHNpbmNlIHRoZXkgbW9zdCBsaWtlbHkgd2VyZSBnaXZlbiBleHBsaWNpdGx5IGJ5CisgICAgICAgICAgdGhlIHVzZXIgYXMgYW4gYXMtbmFtZSwgbWVhbnQgdG8gYmUgdXNlZCBhcyBnaXZlbi4KKworICAgU0VUIFJFQ0VJVkUgUEFUSE5BTUVTIEFVVE8KKyAgICAgICAgICBUaGlzIGlzIHRoZSBkZWZhdWx0LCBhbmQgbWVhbnMgUkVMQVRJVkUgaWYgdGhlIHNlbmRlciB0ZWxscyBtZQorICAgICAgICAgIGl0IGlzIGEgcmVjdXJzaXZlIHRyYW5zZmVyLCBPRkYgb3RoZXJ3aXNlLgorCisgICBTZXQgRklMRSBOQU1FUyBDT05WRVJURUQgbm93IGFsc28gYWZmZWN0cyBwYXRobmFtZXMgdG9vLiBXaGVuCisgICBQQVRITkFNRVMgYXJlIFJFTEFUSVZFIG9yIEFCU09MVVRFIGFuZCBGSUxFIE5BTUVTIGFyZSBDT05WRVJURUQsIHRoZQorICAgZmlsZSBzZW5kZXIgY29udmVydHMgaXRzIG5hdGl2ZSBkaXJlY3RvcnktbmFtZSBmb3JtYXQgdG8gVU5JWCBmb3JtYXQsCisgICBhbmQgdGhlIGZpbGUgcmVjZWl2ZXIgY29udmVydHMgZnJvbSBVTklYIGZvcm1hdCB0byBpdHMgbmF0aXZlIG9uZTsKKyAgIHRodXMgVU5JWCBmb3JtYXQgaXMgdGhlIGNvbW1vbiBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24gZm9yCisgICBkaXJlY3RvcnkgaGllcmFyY2hpZXMsIGFzIGl0IGlzIGluIHRoZSBaSVAvVU5aSVAgcHJvZ3JhbXMgKHdoaWNoIGlzCisgICB3aHkgWklQIGFyY2hpdmVzIGFyZSB0cmFuc3BvcnRhYmxlIGFtb25nLCBVTklYLCBET1MsIGFuZCBWTVMpLgorCisgICBIZXJlJ3MgYW4gZXhhbXBsZSBpbiB3aGljaCBhIGZpbGUgaXMgc2VudCBmcm9tIFdpbmRvd3MgdG8gVU5JWCB3aXRoCisgICByZWxhdGl2ZSBwYXRobmFtZXMgYW5kIEZJTEUgTkFNRVMgQ09OVkVSVEVEOgorCisgIFNvdXJjZSBuYW1lICAgICAgICAgICAgICAgIEludGVybWVkaWF0ZSBuYW1lICAgICAgRGVzdGluYXRpb24gTmFtZQorICBDOlxLOTVcVE1QXE9PRkEuVFhUICAgICAgICBLOTUvVE1QL09PRkEuVFhUICAgICAgIGs5NS90bXAvb29mYS50eHQKKworICAgSW4gYSBtb3JlIGNvbXBsaWNhdGVkIGV4YW1wbGUsIHdlIHNlbmQgdGhlIHNhbWUgZmlsZSBmcm9tIFdpbmRvd3MgdG8KKyAgIFZNUzoKKworICBTb3VyY2UgbmFtZSAgICAgICAgICAgICAgICBJbnRlcm1lZGlhdGUgbmFtZSAgICAgIERlc3RpbmF0aW9uIE5hbWUKKyAgQzpcSzk1XFRNUFxPT0ZBLlRYVCAgICAgICAgSzk1L1RNUC9PT0ZBLlRYVCAgICAgICBbLks5NS5UTVBdT09GQS5UWFQKKworICAgKE5vdGUgdGhhdCBkaXNrIGxldHRlcnMgYW5kIGRldmljZSBkZXNpZ25hdGlvbnMgYXJlIGFsd2F5cyBzdHJpcHBlZAorICAgd2hlbiBwYXRobmFtZXMgYXJlIHJlbGF0aXZlKS4KKworICAgQXMgeW91IGNhbiBpbWFnaW5lLCBhcyBtb3JlIGFuZCBtb3JlIGRpcmVjdG9yeSBmb3JtYXRzIGFyZSBjb25zaWRlcmVkLAorICAgdGhpcyBhcHByb2FjaCBrZWVwcyBtYXR0ZXJzIHNpbXBsZTogb24gZWFjaCBwbGF0Zm9ybSwgS2VybWl0IG11c3Qga25vdworICAgb25seSBpdHMgb3duIGxvY2FsIGZvcm1hdCBhbmQgdGhlIGNvbW1vbiBpbnRlcm1lZGlhdGUgb25lLiBJbiBtb3N0CisgICBjYXNlcywgdGhlIHJlY2VpdmVyIGNhbiBkZXRlY3Qgd2hpY2ggZm9ybWF0IGlzIHVzZWQgYXV0b21hdGljYWxseS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LjExLiBSZWN1cnNpdmUgU0VORCBhbmQgR0VUOiBUcmFuc2ZlcnJpbmcgRGlyZWN0b3J5IFRyZWVzCisKKyAgIEMtS2VybWl0IDcuMCBpbiBzZWxlY3RlZCB2ZXJzaW9ucyAoVU5JWCwgVk1TLCBWT1MsIEFPUy9WUywgV2luZG93cywKKyAgIGFuZCBPUy8yIGF0IHRoaXMgd3JpdGluZykgbm93IHBlcm1pdHMgdGhlIFNFTkQgY29tbWFuZCB0byB0cmF2ZXJzZQorICAgZGlyZWN0b3JpZXMgInJlY3Vyc2l2ZWx5IiBpZiB5b3UgYXNrIGl0IHRvOyB0aGF0IGlzLCB0byBzZW5kIGZpbGVzCisgICBmcm9tIHRoZSBjdXJyZW50IG9yIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBvZiBpdHMgc3ViZGlyZWN0b3JpZXMKKyAgIHRvbywgYW5kIHRoZWlyIHN1YmRpcmVjdG9yaWVzLCBldGMuIChTb21lIG90aGVyIGNvbW1hbmRzIGNhbiBkbyB0aGlzCisgICB0b28sIGluY2x1ZGluZyBESVJFQ1RPUlkuKQorCisgICBUaGlzIGZlYXR1cmUgaXMgbmV3IHRvIFVOSVgsIFdpbmRvd3MsIFZPUywgYW5kIE9TLzIuIFZNUyBhbmQgQU9TL1ZTCisgICBoYXZlIGFsd2F5cyBpbmNsdWRlZCAid2lsZGNhcmQiIG9yICJ0ZW1wbGF0ZSIgY2hhcmFjdGVycyB0aGF0IGFsbG93CisgICB0aGlzLCBhbmQgaW4gdGhpcyBjYXNlLCByZWN1cnNpdmUgZGlyZWN0b3J5IHRyYXZlcnNhbCBjb3VsZCBoYXBwZW4KKyAgIGJlaGluZCBLZXJtaXQncyBiYWNrLCBpLmUuIEtlcm1pdCBkb2VzIG5vdCBoYXZlIHRvIGRvIGl0IGl0c2VsZiAoaW4KKyAgIFZNUywgdGhlIG5vdGF0aW9uIGlzICJbLi4uXSIgb3IgIltkaXJlY3RvcnkuLi5dIjsgaW4gQU9TL1ZTIGlzICIjIikuCisgICBJbiBDLUtlcm1pdCA3LjAsIGhvd2V2ZXIsIFNFTkQgL1JFQ1VSU0lWRSBpcyBzdXBwb3J0ZWQgYnkgQy1LZXJtaXQKKyAgIGl0c2VsZiBmb3IgVk1TLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4xMS4xLiBDb21tYW5kLUxpbmUgT3B0aW9ucworCisgICBUbyBkZXNjZW5kIGEgZGlyZWN0b3J5IHRyZWUgd2hlbiBzZW5kaW5nIGZpbGVzLCB1c2UgdGhlIC1MCisgICBjb21tYW5kLWxpbmUgb3B0aW9uIHRvIGluZGljYXRlIHRoYXQgdGhlIHNlbmQgb3BlcmF0aW9uIGlzIHRvIGJlCisgICByZWN1cnNpdmUsIGFuZCBpbmNsdWRlIGEgbmFtZSBvciBwYXR0ZXJuIHRvIGJlIHNlbnQuIFdoZW4gZ2l2aW5nIGEKKyAgIHBhdHRlcm4sIHlvdSBzaG91bGQgZW5jbG9zZSBpdCBpbiBxdW90ZXMgdG8gcHJldmVudCB0aGUgc2hlbGwgZnJvbQorICAgZXhwYW5kaW5nIGl0LiBFeGFtcGxlczoKKworICAkIGtlcm1pdCAtTHMgIi91c3Ivb2xnYS8qIiAjIHNlbmQgYWxsIG9mIE9sZ2EncyBmaWxlcyBpbiBhbGwgaGVyIGRpcmVjdG9yaWVzCisgICQga2VybWl0IC1McyBmb28udHh0ICAgICAgICMgc2VuZCBhbGwgZm9vLnR4dCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB0cmVlCisgICQga2VybWl0IC1McyAiKi50eHQiICAgICAgICMgc2VuZCBhbGwgLnR4dCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB0cmVlCisgICQga2VybWl0IC1McyAibGV0dGVycy8qIiAgICMgc2VuZCBhbGwgZmlsZXMgaW4gdGhlIGxldHRlcnMgZGlyZWN0b3J5IHRyZWUKKyAgJCBrZXJtaXQgLUxzIGxldHRlcnMgICAgICAgIyBzZW5kIGFsbCBmaWxlcyBpbiB0aGUgbGV0dGVycyBkaXJlY3RvcnkgdHJlZQorICAkIGtlcm1pdCAtTHMgIioiICAgICAgICAgICAjIHNlbmQgYWxsIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHRyZWUKKyAgJCBrZXJtaXQgLUxzIC4gICAgICAgICAgICAgIyBVTklYIG9ubHk6IHNlbmQgYWxsIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHRyZWUKKyAgJCBrZXJtaXQgLXMgLiAgICAgICAgICAgICAgIyBVTklYIG9ubHk6IGEgZmlsZW5hbWUgb2YgLiBpbXBsaWVzIC1MCisKKyAgIElmIHlvdSBsZXQgdGhlIHNoZWxsIGV4cGFuZCB3aWxkY2FyZHMsIEtlcm1pdCBvbmx5IHNlbmRzIGZpbGVzIHdob3NlCisgICBuYW1lcyBtYXRjaCBmaWxlcyBpbiB0aGUgY3VycmVudCBvciBnaXZlbiBkaXJlY3RvcnksIGJlY2F1c2UgdGhlIHNoZWxsCisgICByZXBsYWNlcyBhbiB1bnF1b3RlZCB3aWxkY2FyZCBleHByZXNzaW9uIHdpdGggdGhlIGxpc3Qgb2YgbWF0Y2hpbmcKKyAgIGZpbGVzIC0tIGFuZCB0aGUgc2hlbGwgZG9lcyBub3QgYnVpbGQgcmVjdXJzaXZlIGxpc3RzLiBOb3RlIHRoYXQgdGhlCisgICAiLiIgbm90YXRpb24gZm9yIHRoZSB0cmVlIHJvb3RlZCBhdCB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgYWxsb3dlZAorICAgb25seSBpbiBVTklYLCBzaW5jZSBpbiBXaW5kb3dzIGFuZCBPUy8yLCBpdCBtZWFucyAiKi4qIgorICAgKG5vbnJlY3Vyc2l2ZSkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjExLjIuIFRoZSBTRU5EIC9SRUNVUlNJVkUgQ29tbWFuZAorCisgICBJZiB5b3UgaW5jbHVkZSB0aGUgL1JFQ1VSU0lWRSBzd2l0Y2ggaW4gYSBTRU5EIChvciBNT1ZFLCBvciBzaW1pbGFyKQorICAgY29tbWFuZCwgaXQgbWVhbnMgdG8gZGVzY2VuZCB0aGUgY3VycmVudCBvciBzcGVjaWZpZWQgZGlyZWN0b3J5IHRyZWUKKyAgIHNlYXJjaGluZyBmb3IgZmlsZXMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlIGdpdmVuIG5hbWUgb3IgcGF0dGVybi4gU2luY2UKKyAgIHRoaXMgaXMgbm90IHRlcnJpYmx5IHVzZWZ1bCB1bmxlc3MgeW91IGFsc28gaW5jbHVkZSBwYXRobmFtZXMgd2l0aCB0aGUKKyAgIG91dGJvdW5kIGZpbGVzLCB0aGUgL1JFQ1VSU0lWRSBzd2l0Y2ggYWxzbyBpbmNsdWRlcyBhbiBpbXBsaWNpdAorICAgL1BBVEhOQU1FUzpSRUxBVElWRSBzd2l0Y2ggKHdoaWNoIHlvdSBjYW4gdW5kbyBieSBpbmNsdWRpbmcgYW4KKyAgIGV4cGxpY2l0IC9QQVRITkFNRVMgc3dpdGNoIGFmdGVyIHRoZSAvUkVDVVJTSVZFIHN3aXRjaCkuCisKKyAgIEV4YW1wbGVzOgorCisgICBTRU5EIC9SRUNVUlNJVkUgKgorICAgICAgICAgIFNlbmRzIGFsbCBvZiB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBhbGwgdGhlCisgICAgICAgICAgZmlsZXMgaW4gYWxsIG9mIGl0cyBzdWJkaXJlY3RvcmllcywgYW5kIGFsbCBvZiB0aGVpcgorICAgICAgICAgIHN1YmRpcmVjdG9yaWVzLCBldGMsIGluY2x1ZGluZyB0aGVpciByZWxhdGl2ZSBwYXRobmFtZXMuIEVtcHR5CisgICAgICAgICAgZGlyZWN0b3JpZXMgYXJlIG5vdCBzZW50LgorCisgICBTRU5EIC9SRUNVUlNJVkUgL1BBVEhOQU1FUzpBQlNPTFVURSAqCisgICAgICAgICAgU2VuZHMgYWxsIG9mIHRoZSBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGFsbCB0aGUKKyAgICAgICAgICBmaWxlcyBpbiBhbGwgb2YgaXRzIHN1YmRpcmVjdG9yaWVzLCBhbmQgYWxsIG9mIHRoZWlyCisgICAgICAgICAgc3ViZGlyZWN0b3JpZXMsIGV0YywgaW5jbHVkaW5nIHRoZWlyIGFic29sdXRlIHBhdGhuYW1lcy4KKworICAgU0VORCAvUkVDVVJTSVZFIC9QQVRITkFNRVM6T0ZGICoKKyAgICAgICAgICBTZW5kcyBhbGwgb2YgdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgYWxsIHRoZQorICAgICAgICAgIGZpbGVzIGluIGFsbCBvZiBpdHMgc3ViZGlyZWN0b3JpZXMsIGFuZCBhbGwgb2YgdGhlaXIKKyAgICAgICAgICBzdWJkaXJlY3RvcmllcywgZXRjLCB3aXRob3V0IHBhdGhuYW1lcy4KKworICAgU0VORCAvUkVDVVJTSVZFIC91c3Ivb2xnYS8qCisgICAgICAgICAgU2VuZHMgYWxsIG9mIHRoZSBmaWxlcyBpbiB0aGUgL3Vzci9vbGdhIGRpcmVjdG9yeSBhbmQgYWxsIHRoZQorICAgICAgICAgIGZpbGVzIGluIGFsbCBvZiBpdHMgc3ViZGlyZWN0b3JpZXMsIGFuZCBhbGwgb2YgdGhlaXIKKyAgICAgICAgICBzdWJkaXJlY3RvcmllcywgZXRjLgorCisgICBTRU5EIC9SRUNVUlNJVkUgL3Vzci9vbGdhIChvciAvdXNyL29sZ2EvKQorICAgICAgICAgIFNhbWUgYXMgYWJvdmUuIElmIHRoZSBuYW1lIGlzIGEgZGlyZWN0b3J5IG5hbWUgKHdpdGggb3Igd2l0aG91dAorICAgICAgICAgIGEgdHJhaWxpbmcgc2xhc2gpLCBpdHMgZmlsZXMgYXJlIHNlbnQsIGFuZCB0aG9zZSBvZiBpdHMKKyAgICAgICAgICBzdWJkaXJlY3RvcmllcywgYW5kIHRoZWlyIHN1YmRpcmVjdG9yaWVzLCBldGMgKHNlZSBbNTAzXVNlY3Rpb24KKyAgICAgICAgICA0LjkpLgorCisgICBTRU5EIC9SRUNVUlNJVkUgL1RFWFQgL3Vzci9vbGdhLyoudHh0CisgICAgICAgICAgQXMgYWJvdmUsIGJ1dCBvbmx5IGZpbGVzIHdob3NlIG5hbWVzIGVuZCB3aXRoICIudHh0IiBhcmUgc2VudCwKKyAgICAgICAgICBhbmQgdGhleSBhcmUgc2VudCBpbiB0ZXh0IG1vZGUgKGFzIHRoZXkgd291bGQgYmUgYnkgZGVmYXVsdAorICAgICAgICAgIGFueXdheSBpZiBTRVQgRklMRSBQQVRURVJOUyBpcyBPTiBvciBBVVRPKS4KKworICAgU0VORCAuCisgICAgICAgICAgVU5JWCBvbmx5OiBTZW5kIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorCisgICBTRU5EIC9SRUNVUlNJVkUgLgorICAgICAgICAgIFVOSVggb25seTogU2VuZHMgYWxsIG9mIHRoZSBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kCisgICAgICAgICAgYWxsIG9mIGl0cyBzdWJkaXJlY3RvcmllcywgZXRjIChbNTA0XVNlY3Rpb24gNC45KS4KKworICAgVGhlIC9SRUNVUlNJVkUgc3dpdGNoIGlzIGRpZmZlcmVudCBmcm9tIG1vc3Qgb3RoZXIgc3dpdGNoZXMgaW4gdGhhdAorICAgaXRzIGVmZmVjdCBpcyBpbW1lZGlhdGUgKGJ1dCBzdGlsbCBsb2NhbCB0byB0aGUgY29tbWFuZCBpbiB3aGljaCBpdCBpcworICAgZ2l2ZW4pLCBiZWNhdXNlIGl0IGRldGVybWluZXMgaG93IGZpbGVuYW1lcyBhcmUgdG8gYmUgcGFyc2VkLiBGb3IKKyAgIGV4YW1wbGUsICJzZW5kICoudHh0IiBmYWlscyB3aXRoIGEgcGFyc2UgZXJyb3IgKCJObyBmaWxlcyBtYXRjaCIpIGlmCisgICB0aGVyZSBhcmUgbm8gKi50eHQgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBidXQgInNlbmQKKyAgIC9yZWN1cnNpdmUgKi50eHQiIHN1Y2NlZWRzIGlmIHRoZXJlIGFyZSAiLnR4dCIgZmlsZXMgYW55d2hlcmUgaW4gdGhlCisgICB0cmVlIHJvb3RlZCBhdCB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKKyAgIFRoZSAvUkVDVVJTSVZFIHN3aXRjaCBhbHNvIGFmZmVjdHMgdGhlIGZpbGUgbGlzdHMgZGlzcGxheWVkIGlmIHlvdQorICAgdHlwZSAiPyIgaW4gYSBmaWxlbmFtZSBmaWVsZC4gInNlbmQgLi8/IiBsaXN0cyB0aGUgcmVndWxhciBmaWxlcyBpbgorICAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBidXQgInNlbmQgL3JlY3Vyc2l2ZSAuLz8iIGxpc3RzIHRoZSBlbnRpcmUKKyAgIGRpcmVjdG9yeSB0cmVlIHJvb3RlZCBhdCB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjExLjMuIFRoZSBHRVQgL1JFQ1VSU0lWRSBDb21tYW5kCisKKyAgIEluIGEgY2xpZW50L3NlcnZlciBzZXR0aW5nLCB0aGUgY2xpZW50IGNhbiBhbHNvIHJlcXVlc3QgYSByZWN1cnNpdmUKKyAgIHRyYW5zZmVyIHdpdGg6CisKKyAgIEdFVCAvUkVDVVJTSVZFIFsgb3RoZXIgc3dpdGNoZXMgXSByZW1vdGUtZmlsZXNwZWMgWyBsb2NhbC1zcGVjIF0KKworICAgSW4gd2hpY2ggcmVtb3RlIGZpbGUgc3BlY2lmaWNhdGlvbiBjYW4gYmUgYSBkaXJlY3RvcnkgbmFtZSwgYQorICAgZmlsZW5hbWUsIGEgd2lsZGNhcmQsIG9yIGFueSBjb21iaW5hdGlvbi4gSWYgdGhlIGxvY2FsLXNwZWMgaXMgbm90CisgICBnaXZlbiAoYW5kIFBBVEhOQU1FUyBhcmUgUkVMQVRJVkUpLCBpbmNvbWluZyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgZ28KKyAgIGludG8gdGhlIGN1cnJlbnQgbG9jYWwgZGlyZWN0b3J5LiBJZiBsb2NhbC1zcGVjIGlzIGdpdmVuIGFuZCBpcyBhCisgICBkaXJlY3RvcnksIGl0IGJlY29tZXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaW50byB3aGljaCB0aGUgaW5jb21pbmcKKyAgIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhcmUgcGxhY2VkLiBJZiBsb2NhbC1zcGVjIGhhcyB0aGUgc3ludGF4IG9mIGEKKyAgIGRpcmVjdG9yeSBuYW1lIChlLmcuIGluIFVOSVggaXQgZW5kcyB3aXRoIC8pLCBDLUtlcm1pdCBjcmVhdGVzIHRoZQorICAgZGlyZWN0b3J5IGFuZCB0aGVuIHBsYWNlcyB0aGUgaW5jb21pbmcgZmlsZXMgaW50byBpdC4gSWYgbG9jYWwtc3BlYyBpcworICAgYSBmaWxlbmFtZSAobm90IHJlY29tbWVuZGVkKSwgdGhlbiBhbGwgaW5jb21pbmcgZmlsZXMgYXJlIHN0b3JlZCB3aXRoCisgICB0aGF0IG5hbWUgd2l0aCBjb2xsaXNpb25zIGhhbmRsZWQgYWNjb3JkaW5nIHRvIHRoZSBGSUxFIENPTExJU0lPTgorICAgc2V0dGluZy4KKworICAgQWdhaW4sIHRoZSBub3JtYWwgbWV0aG9kIGZvciB0cmFuc2ZlcnJpbmcgZGlyZWN0b3J5IHRyZWVzIHVzZXMKKyAgIHJlbGF0aXZlIHBhdGhuYW1lcywgYW5kIHRoaXMgaXMgdGhlIGRlZmF1bHQgd2hlbiB0aGUgc2VuZGVyIGhhcyBiZWVuCisgICBnaXZlbiB0aGUgL1JFQ1VSU0lWRSBzd2l0Y2guIFRoZSBhY3Rpb24gYXQgdGhlIHJlY2VpdmVyIGRlcGVuZHMgb24gaXRzCisgICBSRUNFSVZFIFBBVEhOQU1FUyBzZXR0aW5nLiBUaGUgZGVmYXVsdCBpcyBBVVRPLCBtZWFuaW5nIHRoYXQgaWYgdGhlCisgICBzZW5kZXIgdGVsbHMgaXQgdG8gZXhwZWN0IGEgcmVjdXJzaXZlIHRyYW5zZmVyLCB0aGVuIGl0IHNob3VsZAorICAgYXV0b21hdGljYWxseSBzd2l0Y2ggdG8gcmVsYXRpdmUgcGF0aG5hbWVzIGZvciB0aGlzIHRyYW5zZmVyIG9ubHk7CisgICBvdGhlcndpc2UgaXQgb2JleXMgdGhlIFJFQ0VJVkUgUEFUSE5BTUVTIHNldHRpbmcgb2YgT0ZGLCBBQlNPTFVURSwgb3IKKyAgIFJFTEFUSVZFLgorCisgICBXaGF0IGhhcHBlbnMgaWYgYSBmaWxlIGFycml2ZXMgdGhhdCBoYXMgYW4gYWJzb2x1dGUgcGF0aG5hbWUsIHdoZW4gdGhlCisgICByZWNlaXZlciBoYXMgYmVlbiB0b2xkIHRvIHVzZSBvbmx5IHJlbGF0aXZlIHBhdGhuYW1lcz8gQXMgYSBzZWN1cml0eQorICAgcHJlY2F1dGlvbiwgaW4gdGhpcyBjYXNlIHRoZSByZWNlaXZlciB0cmVhdHMgdGhlIG5hbWUgYXMgaWYgaXQgd2FzCisgICByZWxhdGl2ZS4gRm9yIGV4YW1wbGUsIGlmIGEgZmlsZSBhcnJpdmVzIGFzOgorCisgIC91c3Ivb2xnYS9vb2ZhLnR4dAorCisgICBUaGUgcmVjZWl2ZXIgY3JlYXRlcyBhICJ1c3IiIHN1YmRpcmVjdG9yeSBpbiBpdHMgY3VycmVudCBkaXJlY3RvcnksCisgICBhbmQgdGhlbiBhbiAib2xnYSIgc3ViZGlyZWN0b3J5IHVuZGVyIHRoZSAidXNyIiBzdWJkaXJlY3RvcnkgaW4gd2hpY2gKKyAgIHRvIHN0b3JlIHRoZSBpbmNvbWluZyBmaWxlLgorCisgICBTdXBwb3NlLCBob3dldmVyIHRoZXJlIGlzIGEgc2VxdWVuY2Ugb2YgZGlyZWN0b3JpZXM6CisKKyAgL3Vzci9vbGdhL2EvYi9jL2QvCisKKyAgIGluIHdoaWNoICJhIiBjb250YWlucyBub3RoaW5nIGJ1dCBhIHN1YmRpcmVjdG9yeSAiYiIsIHdoaWNoIGluIHR1cm4KKyAgIGNvbnRhaW5zIG5vdGhpbmcgYnV0IGEgc3ViZGlyZWN0b3J5ICJjIiwgd2hpY2ggaW4gdHVybiBjb250YWlucworICAgbm90aGluZyBidXQgYSBzdWJkaXJlY3RvcnkgImQiLCB3aGljaCBjb250YWlucyBub3RoaW5nIGF0IGFsbC4gVGh1cworICAgdGhlcmUgYXJlIG5vIGZpbGVzIGluIHRoZSAiL3Vzci9vbGdhL2EvIiB0cmVlLCBhbmQgc28gaXQgaXMgbm90IHNlbnQsCisgICBhbmQgdGhlcmVmb3JlIGl0IGlzIG5vdCByZXByb2R1Y2VkIG9uIHRoZSB0YXJnZXQgY29tcHV0ZXIuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjExLjQuIE5ldyBhbmQgQ2hhbmdlZCBGaWxlIEZ1bmN0aW9ucworCisgICBDLUtlcm1pdCA3LjAgYWRkcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKworICAgXGZmaWxlcyhwYXR0ZXJuWywmYV0pCisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHRvIG1hdGNoIG9ubHkgcmVndWxhciBmaWxlcyBpbgorICAgICAgICAgIHRoZSBjdXJyZW50IG9yIGdpdmVuIGRpcmVjdG9yeSwgYW5kIHRvIHRha2UgYW4gb3B0aW9uYWwgYXJyYXkKKyAgICAgICAgICBuYW1lIGFzIGEgc2Vjb25kIGFyZ3VtZW50IChleHBsYWluZWQgYmVsb3cpLgorCisgICBcZmRpcmVjdG9yaWVzKHBhdHRlcm5bLCZhXSkKKyAgICAgICAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlyZWN0b3JpZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcGF0dGVybi4KKyAgICAgICAgICBJZiB0aGUgcGF0dGVybiBkb2VzIG5vdCBpbmNsdWRlIGEgZGlyZWN0b3J5LCB0aGVuIHRoZSBzZWFyY2ggaXMKKyAgICAgICAgICBwZXJmb3JtZWQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorCisgICBcZnJmaWxlcyhwYXR0ZXJuWywmYV0pCisgICAgICAgICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGVzIGluIHRoZSBjdXJyZW50IG9yIGdpdmVuIGRpcmVjdG9yeQorICAgICAgICAgIGFuZCBhbGwgb2YgaXRzIHN1YmRpcmVjdG9yaWVzLCBhbmQgdGhlaXIgc3ViZGlyZWN0b3JpZXMsIGV0YywKKyAgICAgICAgICB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJuLiBXYXJuaW5nIC0tIHRoaXMgb25lIGNhbiB0YWtlCisgICAgICAgICAgcXVpdGUgc29tZSB0aW1lIGlmIHBlcmZvcm1lZCBhdCB0aGUgcm9vdCBvZiBhIGxhcmdlIGRpcmVjdG9yeQorICAgICAgICAgIHRyZWUuCisKKyAgIFxmcmRpcmVjdG9yaWVzKHBhdHRlcm5bLCZhXSkKKyAgICAgICAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlyZWN0b3JpZXMgaW4gdGhlIGN1cnJlbnQgb3IgZ2l2ZW4KKyAgICAgICAgICBkaXJlY3RvcnkgYW5kIGFsbCBvZiBpdHMgc3ViZGlyZWN0b3JpZXMsIGFuZCB0aGVpcgorICAgICAgICAgIHN1YmRpcmVjdG9yaWVzLCBldGMsIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm4uCisKKyAgIEVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zIGJ1aWxkcyB1cCBhIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcmV0dXJuZWQgYnkKKyAgIHRoZSBcZm5leHRmaWxlKCkgZnVuY3Rpb24sIGp1c3QgYXMgXGZmaWxlcygpIGFsd2F5cyBoYXMgZG9uZS4gKFRoaXMKKyAgIGNhbiBhbHNvIGJlIGRvbmUgd2l0aCB0aGUgL0FSUkFZIHN3aXRjaCBvZiB0aGUgRElSRUNUT1JZIGNvbW1hbmQ7IHNlZQorICAgWzUwNV1TZWN0aW9ucyA0LjUuMSBhbmQgWzUwNl03LjEwKS4KKworICAgRWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMgY2FuIGJlIGdpdmVuIGFuIGFycmF5IG5hbWUgYXMgYW4gb3B0aW9uYWwKKyAgIHNlY29uZCBhcmd1bWVudC4gSWYgYW4gYXJyYXkgbmFtZSBpcyBzdXBwbGllZCwgdGhlIGFycmF5IHdpbGwgY29udGFpbgorICAgdGhlIG51bWJlciBvZiBmaWxlcyBhcyBpdHMgMHRoIGVsZW1lbnQsIGFuZCB0aGUgZmlsZW5hbWVzIGluIGVsZW1lbnRzCisgICAxIHRocm91Z2ggbGFzdC4gSWYgdGhlIGFycmF5IGFscmVhZHkgZXhpc3RlZCwgaXRzIHByZXZpb3VzIGNvbnRlbnRzCisgICBhcmUgbG9zdC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBjb250YWlucyB0d28gZmlsZXMsCisgICBvb2ZhLnR4dCBhbmQgZm9vLmJhciwgdGhlbiAiXGZmaWxlcygqLCZhKSIgY3JlYXRlcyBhbiBhcnJheSBcJmFbXSB3aXRoCisgICBhIGRpbWVuc2lvbiBvZiAyLCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6CisKKyBcJmFbMF0gPSAyCisgXCZhWzFdID0gb29mYS50eHQKKyBcJmFbMl0gPSBmb28uYmFyCisKKyAgIElmIG5vIGZpbGVzIG1hdGNoIHRoZSBzcGVjaWZpY2F0aW9uIGdpdmVuIGluIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlCisgICBhcnJheSBnZXRzIGEgZGltZW5zaW9uIG9mIDAsIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHVuZGVjbGFyaW5nIHRoZQorICAgYXJyYXkuCisKKyAgIE5vdGUgdGhhdCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGFycmF5IGlzIGZpbGxlZCAoYW5kIGluIHdoaWNoCisgICBcZm5leHRmaWxlKCkgcmV0dXJucyBmaWxlbmFtZXMpIGlzIGluZGV0ZXJtaW5hdGUgKGJ1dCBzZWUgWzUwN11TZWN0aW9uCisgICA3LjEwLjUpLgorCisgICBIZXJlJ3MgYW4gZXhhbXBsZSB0aGF0IGJ1aWxkcyBhbmQgcHJpbnRzIGEgbGlzdCBvZiBhbGwgdGhlIGZpbGUgd2hvc2UKKyAgIG5hbWVzIGVuZCBpbiAudHh0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBkZXNjZW5kZW50czoKKworICBhc2cgXCVuIFxmcmZpbGVzKCoudHh0KQorICBkZWNsYXJlIFwmYVtcJW5dCisgIGZvciBcJWkgMSBcJW4gMSB7CisgICAgICBhc2cgXCZhW1wlaV0gXGZuZXh0ZmlsZSgpCisgICAgICBlY2hvIFxmbHBhZChcJWksNCkuICJcJmFbXCVpXSIKKyAgfQorCisgICBBbHRlcm5hdGl2ZWx5LCB1c2luZyB0aGUgYXJyYXkgbWV0aG9kLCBhbmQgdGhlbiBwcmludGluZyB0aGUgZmlsZW5hbWVzCisgICBpbiBhbHBoYWJldGljIG9yZGVyIChzZWUgWzUwOF1TZWN0aW9uIDcuMTAuMyBhbmQgWzUwOV03LjEwLjUpOgorCisgIGFzZyBcJW4gXGZyZmlsZXMoKi50eHQsJmEpCisgIHNvcnQgJmEKKyAgZm9yIFwlaSAxIFwlbiAxIHsKKyAgICAgIGVjaG8gXGZscGFkKFwlaSw0KS4gIlwmYVtcJWldIgorICB9CisKKyAgIE9yIGV2ZW4gbW9yZSBzaW1wbHk6CisKKyAgYXNnIFwlbiBcZnJmaWxlcygqLnR4dCwmYSkKKyAgc29ydCAmYQorICBzaG93IGFycmF5ICZhCisKKyAgIEFzIG5vdGVkIGVsc2V3aGVyZSwgdGhlIGZpbGUgbGlzdHMgYnVpbHQgYnkgXGZmaWxlcygpLCBcZnJmaWxlcygpLAorICAgZXRjLCBhcmUgbm93ICJzYWZlIiBpbiB0aGUgc2Vuc2UgdGhhdCBTRU5EIGFuZCBvdGhlciBmaWxlLXJlbGF0ZWQKKyAgIGNvbW1hbmRzIGNhbiByZWZlcmVuY2UgXGZuZXh0ZmlsZSgpIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBsaXN0OgorCisgIHNldCBzZW5kIHBhdGhuYW1lcyByZWxhdGl2ZQorICBmb3IgXCVpIDEgXGZyZmlsZXMoKi50eHQpIDEgeworICAgICAgYXNnIFwlYSBcZm5leHRmaWxlKCkKKyAgICAgIGVjaG8gU2VuZGluZyBcJWEuLi4KKyAgICAgIHNlbmQgXCVhCisgICAgICBpZiBmYWlsIGJyZWFrCisgIH0KKworICAgQ29weWluZyB0byBhbiBhcnJheSAoYXMgc2hvd24gb24gcC4zOTggb2YgWzUxMF1Vc2luZyBDLUtlcm1pdCAybmQgRWQpCisgICBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4xMS41LiBNb3ZpbmcgRGlyZWN0b3J5IFRyZWVzIEJldHdlZW4gTGlrZSBTeXN0ZW1zCisKKyAgICA0LjExLjUuMS4gVU5JWCB0byBVTklYCisKKyAgIFRyYW5zZmVycmluZyBhIGRpcmVjdG9yeSB0cmVlIGZyb20gb25lIGNvbXB1dGVyIHRvIGFub3RoZXIgcmVwbGljYXRlcworICAgdGhlIGZpbGUgc2VuZGVyJ3MgYXJyYW5nZW1lbnQgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIG9uIHRoZSBmaWxlCisgICByZWNlaXZlcidzIGNvbXB1dGVyLiBOb3JtYWxseSB0aGlzIGlzIGRvbmUgdXNpbmcgcmVsYXRpdmUgcGF0aG5hbWVzLAorICAgc2luY2UgdGhlIHVzZXIgSURzIG1pZ2h0IG5vdCBiZSBpZGVudGljYWwgb24gdGhlIHR3byBjb21wdXRlcnMuIExldCdzCisgICBzYXkgYm90aCBjb21wdXRlcnMgYXJlIFVOSVggYmFzZWQsIHJ1bm5pbmcgQy1LZXJtaXQgNy4wIG9yIGxhdGVyLiBPbgorICAgdGhlIHNlbmRpbmcgY29tcHV0ZXIgKGxlYXZpbmcgb3V0IHRoZSBjb25uZWN0aW9uIGRldGFpbHMsIGV0Yyk6CisKKyAgQy1LZXJtaXQ+IGNkIC91c3Ivb2xnYQorICBDLUtlcm1pdD4gc2VuZCAvcmVjdXJzaXZlIC4KKworICAgVGhlIC9SRUNVUlNJVkUgc3dpdGNoIHRlbGxzIEMtS2VybWl0IHRvIGRlc2NlbmQgdGhyb3VnaCB0aGUgZGlyZWN0b3J5CisgICB0cmVlIGFuZCB0byBpbmNsdWRlIHJlbGF0aXZlIHBhdGhuYW1lcyBvbiBvdXRib3VuZCBmaWxlbmFtZXMuCisKKyAgIE9uIHRoZSByZWNlaXZpbmcgY29tcHV0ZXI6CisKKyAgQy1LZXJtaXQ+IG1rZGlyIG9sZ2FzLWZpbGVzICAgICAgICAgICA7IE1ha2UgYSBuZXcgZGlyZWN0b3J5LgorICBDLUtlcm1pdD4gY2Qgb2xnYXMtZmlsZXMgICAgICAgICAgICAgIDsgQ0QgdG8gaXQuCisgIEMtS2VybWl0PiByZWNlaXZlIC9yZWN1cnNpdmUgICAgICAgICAgOyA9IC9QQVRITkFNRVM6UkVMQVRJVkUKKworICAgRWFjaCBLZXJtaXQgcHJvZ3JhbSByZWNvZ25pemVzIHRoYXQgdGhlIG90aGVyIGlzIHJ1bm5pbmcgdW5kZXIgVU5JWAorICAgYW5kIHN3aXRjaGVzIHRvIGJpbmFyeSBtb2RlIGFuZCBsaXRlcmFsIGZpbGVuYW1lcyBhdXRvbWF0aWNhbGx5LgorICAgRGlyZWN0b3JpZXMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBvbiB0aGUgcmVjZWl2aW5nIHN5c3RlbSBhcworICAgbmVlZGVkLiBGaWxlIGRhdGVzIGFuZCBwZXJtaXNzaW9ucyBhcmUgYXV0b21hdGljYWxseSByZXByb2R1Y2VkIGZyb20KKyAgIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4KKworICAgIDQuMTEuNS4yLiBWTVMgdG8gVk1TCisKKyAgIFRvIHNlbmQgcmVjdXJzaXZlbHkgZnJvbSBWTVMsIHNpbXBseSBpbmNsdWRlIHRoZSAvUkVDVVJTSVZFIHN3aXRjaCwKKyAgIGZvciBleGFtcGxlIGF0IHRoZSBzZW5kZXI6CisKKyAgJCBrZXJtaXQKKyAgQy1LZXJtaXQ+IGNkIFtvbGdhXQorICBDLUtlcm1pdD4gc2VuZCAvcmVjdXJzaXZlICouKjswCisKKyAgIEFuZCBhdCB0aGUgcmVjZWl2ZXI6CisKKyAgQy1LZXJtaXQ+IGNkIFsub2xnYV0KKyAgQy1LZXJtaXQ+IHJlY2VpdmUgL3JlY3Vyc2l2ZQorCisgICBUaGUgbm90YXRpb24gIi4uLiIgd2l0aGluIGRpcmVjdG9yeSBicmFja2V0cyBpbiBWTVMgbWVhbnMgInRoaXMKKyAgIGRpcmVjdG9yeSBhbmQgYWxsIGRpcmVjdG9yaWVzIGJlbG93IGl0IjsgdGhlIC9SRUNVUlNJVkUgc3dpdGNoLCB3aGVuCisgICBnaXZlbiB0byB0aGUgc2VuZGVyLCBpbXBsaWVzIHRoZSB1c2Ugb2YgIi4uLiIgaW4gdGhlIGZpbGUKKyAgIHNwZWNpZmljYXRpb24gc28geW91IGRvbid0IGhhdmUgdG8gaW5jbHVkZSAiLi4uIjsgYnV0IGl0IG1ha2VzIG5vCisgICBkaWZmZXJlbmNlIGlmIHlvdSBkbzoKKworICAkIGtlcm1pdAorICBDLUtlcm1pdD4gc2VuZCAvcmVjdXJzaXZlIFtvbGdhLi4uXSouKjswCisKKyAgIEFuZCBhdCB0aGUgcmVjZWl2ZXI6CisKKyAgQy1LZXJtaXQ+IGNkIFsub2xnYV0KKyAgQy1LZXJtaXQ+IHJlY2VpdmUgL3JlY3Vyc2l2ZQorCisgICBJbiBlaXRoZXIgY2FzZSwgc2luY2UgYm90aCBzeXN0ZW1zIHJlY29nbml6ZSBlYWNoIG90aGVyIGFzIFZNUywgdGhleQorICAgc3dpdGNoIGludG8gTEFCRUxFRCB0cmFuc2ZlciBtb2RlIGF1dG9tYXRpY2FsbHkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjExLjYuIE1vdmluZyBEaXJlY3RvcnkgVHJlZXMgQmV0d2VlbiBVbmxpa2UgU3lzdGVtcworCisgICBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmaWN1bHRpZXMgd2l0aCByZWN1cnNpdmUgdHJhbnNmZXJzIGJldHdlZW4gdW5saWtlCisgICBzeXN0ZW1zOgorCisgICAgICogRmlsZSBmb3JtYXRzIGNhbiBiZSBkaWZmZXJlbnQsIGVzcGVjaWFsbHkgdGV4dCBmaWxlcyBjaGFyYWN0ZXIKKyAgICAgICBzZXRzIGFuZCByZWNvcmQgZm9ybWF0cy4gVGhpcyBjYW4gbm93IGJlIGhhbmRsZWQgYnkgdXNpbmcgU0VUIEZJTEUKKyAgICAgICBQQVRURVJOLCBTRVQgRklMRSBURVhULVBBVFRFUk5TLCBhbmQgU0VUIEZJTEUgQklOQVJZLVBBVFRFUk5TCisgICAgICAgKFs1MTFdU2VjdGlvbiA0LjMpLgorICAgICAqIEZpbGUgbmFtaW5nIGNvbnZlbnRpb25zIGFyZSBkaWZmZXJlbnQuIEZvciBleGFtcGxlLCBvbmUgc3lzdGVtCisgICAgICAgbWlnaHQgYWxsb3cgKGFuZCB1c2UpIGxvbmdlciBmaWxlbmFtZXMgdGhhbiB0aGUgb3RoZXIuIFlvdSBjYW4KKyAgICAgICB0ZWxsIEtlcm1pdCBob3cgdG8gaGFuZGxlIGZpbGUgbmFtZXMgd2l0aCB0aGUgbm9ybWFsICJzZXQgZmlsZQorICAgICAgIG5hbWVzIiBhbmQgInNldCBmaWxlIGNvbGxpc2lvbiIgbWVjaGFuaXNtcy4gTW9zdCBtb2Rlcm4gS2VybWl0cworICAgICAgIGFyZSBmYWlybHkgdG9sZXJhbnQgb2YgaWxsZWdhbCBmaWxlbmFtZXMgYW5kIHNob3VsZCBub3QgZmFpbAorICAgICAgIHNpbXBseSBiZWNhdXNlIG9mIGFuIGluY29taW5nIGZpbGVuYW1lOyByYXRoZXIsIGl0IHdpbGwgZG8gaXRzCisgICAgICAgYmVzdCB0byBjb252ZXJ0IGl0IHRvIGEgcmVjb2duaXphYmxlIGFuZCB1bmlxdWUgbGVnYWwgZmlsZW5hbWUuCisgICAgICogRGlyZWN0b3J5IG5vdGF0aW9ucyBjYW4gYmUgZGlmZmVyZW50LCBlLmcuIGJhY2tzbGFzaGVzIGluc3RlYWQgb2YKKyAgICAgICBzbGFzaGVzLCBicmFja2V0cywgcGFyZW50aGVzZXMsIHNwYWNlcywgZXRjLiBCdXQgdGhpcyBpcyBub3cKKyAgICAgICBoYW5kbGVkIGJ5IGNvbnZlcnRpbmcgcGF0aG5hbWVzIHRvIGEgc3RhbmRhcmQgZm9ybWF0IGR1cmluZworICAgICAgIHRyYW5zZmVyIChbNTEyXVNlY3Rpb24gNC4xMCkuCisKKyAgIFNvIG5vdywgZm9yIHRoZSBmaXJzdCB0aW1lLCBpdCBpcyBwb3NzaWJsZSB0byBzZW5kIGRpcmVjdG9yeSB0cmVlcworICAgYW1vbmcgYW55IGNvbWJpbmF0aW9uIG9mIFVOSVgsIERPUywgV2luZG93cywgT1MvMiwgVk1TLCBBT1MvVlMsIGV0Yy4KKyAgIEhlcmUncyBhbiBleGFtcGxlIHNlbmRpbmcgZmlsZXMgZnJvbSBhbiBIUC1VWCBzeXN0ZW0gKHdoZXJlIHRleHQgZmlsZXMKKyAgIGFyZSBlbmNvZGVkIGluIHRoZSBIUCBSb21hbjggY2hhcmFjdGVyIHNldCkgdG8gYSBQQyB3aXRoIEs5NSAod2hlcmUKKyAgIHRleHQgZmlsZXMgYXJlIGVuY29kZWQgaW4gQ1A4NTApOgorCisgU2VuZGVyOgorICBjZCB4eHggICAgICAgICAgICAgICAgICAgICAgICAgICA7IENEIHRvIHJvb3Qgb2Ygc291cmNlIHRyZWUKKyAgc2V0IGZpbGUgdHlwZSBiaW5hcnkgICAgICAgICAgICAgOyBEZWZhdWx0IHRyYW5zZmVyIG1vZGUKKyAgc2V0IGZpbGUgY2hhcmFjdGVyLXNldCBocC1yb21hbjggOyBMb2NhbCBjaGFyYWN0ZXIgc2V0IGZvciB0ZXh0IGZpbGVzCisgIHNldCB4ZmVyIGNoYXJhY3Rlci1zZXQgbGF0aW4xICAgIDsgVHJhbnNmZXIgY2hhcmFjdGVyIHNldAorICBzZXQgZmlsZSBwYXR0ZXJucyBvbiAgICAgICAgICAgICA7IEVuYWJsZSBhdXRvbWF0aWMgZmlsZS10eXBlIHN3aXRjaGluZy4uLgorICBzZXQgZmlsZSBiaW5hcnktcGF0dGVybnMgKi5aICouZ3ogKi5vICA7IGJhc2VkIG9uIHRoZXNlIHBhdHRlcm5zLi4uCisgIHNldCBmaWxlIHRleHQtcGF0dGVybnMgKi50eHQgKi5jICouaCAgIDsgZm9yIGJpbmFyeSBhbmQgdGV4dCBmaWxlcy4KKyAgc2VuZCAvcmVjdXJzaXZlICogICAgICAgICAgICAgICAgOyBTZW5kIGFsbCB0aGUgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSB0cmVlCisKKyBSZWNlaXZlcjoKKyAgY2QgeXl5ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBDRCB0byByb290IG9mIGRlc3RpbmF0aW9uIHRyZWUKKyAgc2V0IGZpbGUgY2hhcmFjdGVyLXNldCBjcDg1MCAgICAgOyBMb2NhbCBjaGFyYWN0ZXIgc2V0IGZvciB0ZXh0IGZpbGVzCisgIHJlY2VpdmUgL3BhdGhuYW1lczpyZWxhdGl2ZSAgICAgIDsgUmVjZWl2ZSB3aXRoIHBhdGhuYW1lcworCisgICBOb3RlczoKKyAgICAgKiBSZXBsYWNlICJ4eHgiIGFuZCAieXl5IiB3aXRoIHRoZSBkZXNpcmVkIGRpcmVjdG9yaWVzLgorICAgICAqIFJlcGxhY2UgdGhlIGZpbGUgY2hhcmFjdGVyIHNldHMgYXBwcm9wcmlhdGVseS4KKyAgICAgKiBDaGFuZ2UgdGhlIHBhdHRlcm5zIGFzIG5lZWRlZCAob3IganVzdCB1c2UgdGhlIGJ1aWx0LWluIGRlZmF1bHQKKyAgICAgICBsaXN0cykuCisgICAgICogU0VORCAvUkVDVVJTSVZFIGFsc28gaW1wbGllcyAvUEFUSE5BTUVTOlJFTEFUSVZFLgorICAgICAqIFRoZSBmaWxlIHNlbmRlciB0ZWxscyB0aGUgZmlsZSByZWNlaXZlciB0aGUgdHJhbnNmZXIgbW9kZSBvZiBlYWNoCisgICAgICAgZmlsZS4KKyAgICAgKiBUaGUgZmlsZSBzZW5kZXIgdGVsbHMgdGhlIGZpbGUgcmVjZWl2ZXIgdGhlIHRyYW5zZmVyIGNoYXJhY3RlcgorICAgICAgIHNldC4KKyAgICAgKiBCeSBkZWZhdWx0LCBkZXN0aW5hdGlvbiBmaWxlIGRhdGVzIHdpbGwgYmUgdGhlIHNhbWUgYXMgb24gdGhlCisgICAgICAgc291cmNlLgorICAgICAqIE1hbnkgb2YgdGhlIHNldHRpbmdzIHNob3duIG1pZ2h0IGFscmVhZHkgYmUgc2V0IGJ5IGRlZmF1bHQuCisgICAgICogU2VlIFs1MTNdU2VjdGlvbnMgNC4zLCBbNTE0XTQuMTAsIGFuZCBbNTE1XTQuMTUgZm9yIGFkZGl0aW9uYWwKKyAgICAgICBleHBsYW5hdGlvbi4KKworICAgSWYgeW91IGFyZSByZWZyZXNoaW5nIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSBvbiB0aGUgZGVzdGluYXRpb24KKyAgIGNvbXB1dGVyLCB1c2UgInNldCBmaWxlIGNvbGxpc2lvbiB1cGRhdGUiIG9yIG90aGVyIGFwcHJvcHJpYXRlIGZpbGUKKyAgIGNvbGxpc2lvbiBvcHRpb24gdG8gaGFuZGxlIGZpbGVuYW1lIGNvbGxpc2lvbnMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC4xMi4gV2hlcmUgRGlkIE15IEZpbGUgR28/CisKKyAgIE5vdyB0aGF0IEtlcm1pdCBjYW4gYmUgc3RhcnRlZCBieSBjbGlja2luZyBvbiBkZXNrdG9wIGljb25zICh0aHVzCisgICBvYnNjdXJpbmcgdGhlIGNvbmNlcHQgb2YgImN1cnJlbnQgZGlyZWN0b3J5IiksIGFuZCBjYW4gaGF2ZSBhIGRvd25sb2FkCisgICBkaXJlY3RvcnksIGFuZCBjYW4gY3JlYXRlIGRpcmVjdG9yaWVzIGZvciBpbmNvbWluZyBmaWxlcyBvbiB0aGUgZmx5LAorICAgZXRjLCBzb21ldGltZXMgaXQgaXMgZWFzeSB0byBsb3NlIGEgZmlsZSBhZnRlciB0cmFuc2Zlci4gT2YgY291cnNlLCBpZgorICAgeW91IGtlZXAgYSB0cmFuc2FjdGlvbiBsb2c6CisKKyAgTE9HIFRSQU5TQUNUSU9OUworCisgICBpdCB3aWxsIHJlY29yZCB0aGUgZmF0ZSBhbmQgZmluYWwgcmVzdGluZyBwbGFjZSBvZiBlYWNoIGZpbGUuIEJ1dCBpbgorICAgY2FzZSB5b3UgZGlkIG5vdCBrZWVwIGEgbG9nLCB0aGUgbmV3IGNvbW1hbmQ6CisKKyAgV0hFUkUKKworICAgYWRkZWQgaW4gQy1LZXJtaXQgNy4wLCBnaXZlcyB5b3UgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyBpdCBoYXMgYWJvdXQKKyAgIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBmaWxlcyB0cmFuc2ZlcnJlZCwgaW5jbHVkaW5nIHRoZSBwYXRobmFtZQorICAgcmVwb3J0ZWQgYnkgdGhlIHJlY2VpdmluZyBLZXJtaXQsIGlmIGFueSwgd2hlbiBDLUtlcm1pdCBpcyB0aGUgc2VuZGVyLgorICAgVGhpcyBpbmZvcm1hdGlvbiB3YXMgYWxzbyBhZGRlZCB0byBTSE9XIEZJTEUgaW4gc29tZXdoYXQgbGVzcyBkZXRhaWwuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC4xMy4gRmlsZSBPdXRwdXQgQnVmZmVyIENvbnRyb2wKKworICAgKFVOSVggb25seSkuIFRoZSBuZXcgY29tbWFuZCBTRVQgRklMRSBPVVRQVVQgbGV0cyB5b3UgY29udHJvbCBob3cKKyAgIGluY29taW5nIGZpbGVzIGFyZSB3cml0dGVuIHRvIGRpc2s6CisKKyAgIFNFVCBGSUxFIE9VVFBVVCBCVUZGRVJFRCBbIHNpemUgXQorICAgICAgICAgIENob29zZXMgYnVmZmVyZWQgZmlsZSBvdXRwdXQ7IHRoaXMgaXMgdGhlIGRlZmF1bHQuIFVOSVggZG9lcworICAgICAgICAgIGl0cyBub3JtYWwgc29ydCBvZiBkaXNrIGJ1ZmZlcmluZy4gVGhlIG9wdGlvbmFsIHNpemUgc3BlY2lmaWVzCisgICAgICAgICAgS2VybWl0J3Mgb3duIGZpbGUgb3V0cHV0IGJ1ZmZlciBzaXplLCBhbmQgdGhlcmVmb3JlIHRoZQorICAgICAgICAgIGZyZXF1ZW5jeSBvZiBkaXNrIGFjY2Vzc2VzICh3cml0ZSgpIHN5c3RlbSBjYWxscykgLS0gdGhlIGJpZ2dlcgorICAgICAgICAgIHRoZSBzaXplLCB0aGUgZmV3ZXIgdGhlIGRpc2sgYWNjZXNzZXMuCisKKyAgIFNFVCBGSUxFIE9VVFBVVCBVTkJVRkZFUkVEIFsgc2l6ZSBdCisgICAgICAgICAgVGhpcyBmb3JjZXMgZWFjaCBmaWxlIG91dHB1dCB3cml0ZSgpIGNhbGwgdG8gYWN0dWFsbHkgY29tbWl0CisgICAgICAgICAgdGhlIGRhdGEgdG8gZGlzayBpbW1lZGlhdGVseS4gQ2hvb3NpbmcgdGhpcyBvcHRpb24gd2lsbCB1c3VhbGx5CisgICAgICAgICAgc2xvdyBmaWxlIHJlY2VwdGlvbiBkb3duLgorCisgICBTRVQgRklMRSBPVVRQVVQgQkxPQ0tJTkcKKyAgICAgICAgICBXcml0ZSgpIGNhbGxzIHNob3VsZCBub3QgcmV0dXJuIHVudGlsIHRoZXkgYXJlIGNvbXBsZXRlLiBUaGlzCisgICAgICAgICAgaXMgdGhlIG5vcm1hbCBzZXR0aW5nLCBhbmQgaXQgbGV0cyBLZXJtaXQgZGV0ZWN0IGRpc2std3JpdGUKKyAgICAgICAgICBlcnJvcnMgaW1tZWRpYXRlbHkuCisKKyAgIFNFVCBGSUxFIE9VVFBVVCBOT05CTE9DS0lORworICAgICAgICAgIFdyaXRlKCkgY2FsbHMgc2hvdWxkIHJldHVybiBpbW1lZGlhdGVseS4gVGhpcyBjYW4gc3BlZWQgdXAgZmlsZQorICAgICAgICAgIHJlY2VwdGlvbiwgYnV0IGFsc28gZGVsYXkgdGhlIGRldGVjdGlvbiBvZiBkaXNrLXdyaXRlIGVycm9ycy4KKworICAgRXhwZXJpbWVudGF0aW9uIHdpdGggdGhlc2UgcGFyYW1ldGVycyBzaG91bGQgYmUgaGFybWxlc3MsIGFuZCBtaWdodAorICAgKG9yIG1pZ2h0IG5vdCkgaGF2ZSBhIHBlcmNlcHRpYmxlLCBldmVuIGRyYW1hdGljLCBlZmZlY3Qgb24KKyAgIHBlcmZvcm1hbmNlLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDQuMTQuIEltcHJvdmVkIFJlc3BvbnNpdmVuZXNzCisKKyAgIEluIHZlcnNpb24gNy4wLCBDLUtlcm1pdCdzIGZpbGUtdHJhbnNmZXIgcHJvdG9jb2wgZW5naW5lIGhhcyBiZWVuCisgICB0dW5lZCBmb3IgYWRkaXRpb25hbCBzcGVlZCBhbmQgcmVzcG9uc2l2ZW5lc3MuCisKKyAgICAgKiBCaW5hcnktbW9kZSB0cmFuc2ZlcnMgb3ZlciA4LWJpdCBjb25uZWN0aW9ucywgYSB2ZXJ5IGNvbW1vbiBjYXNlLAorICAgICAgIGFyZSBub3cgaGFuZGxlZCBpbiBhIHNwZWNpYWwgd2F5IHRoYXQgbWluaW1pemVzIG92ZXJoZWFkLgorICAgICAqIFNFVCBUUkFOU0ZFUiBDUkMtQ0FMQ1VMQVRJT04gaXMgbm93IE9GRiBieSBkZWZhdWx0LCByYXRoZXIgdGhhbgorICAgICAgIE9OLiAoVGhpcyBhZmZlY3RzIG9ubHkgdGhlIG92ZXJhbGwgcGVyLXRyYW5zZmVyIENSQywgXHYoY3JjMTYpLAorICAgICAgIG5vdCB0aGUgcGVyLXBhY2tldCBDUkNzKQorICAgICAqIENvbm5lY3Rpb24gbG9zcyBkdXJpbmcgZmlsZSB0cmFuc2ZlciBpcyBub3cgZGV0ZWN0ZWQgaW1tZWRpYXRlbHkKKyAgICAgICBpbiBtb3N0IGNhc2VzIG9uIEludGVybmV0IGNvbm5lY3Rpb25zIGFuZCBvbiBzZXJpYWwgY29ubmVjdGlvbnMKKyAgICAgICB3aGVuIENBUlJJRVItV0FUQ0ggaXMgbm90IHNldCB0byBPRkYuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC4xNS4gRG91YmxpbmcgYW5kIElnbm9yaW5nIENoYXJhY3RlcnMgZm9yIFRyYW5zcGFyZW5jeQorCisgICBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIHdlcmUgYWRkZWQgaW4gNy4wLCBwcmltYXJpbHkgdG8gYWxsb3cKKyAgIHN1Y2Nlc3NmdWwgZmlsZSB0cmFuc2ZlciB0aHJvdWdoIEFSUEFuZXQgVEFDcyBhbmQgd2l0aCBIb25leXdlbGwgRFBTNgorICAgc3lzdGVtcywgYnV0IGNhbiBiZSB1c2VkIGluIGFueSBzZXR0aW5nIHdoZXJlIHRoZXkgbWlnaHQgYmUgbmVlZGVkOgorCisgICBTRVQgU0VORCBET1VCTEUtQ0hBUiB7IFsgY2hhciBbIGNoYXIgWyAuLi4gXSBdIF0sIE5PTkUgfQorICAgICAgICAgIFRlbGxzIEMtS2VybWl0IHRvIGRvdWJsZSB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcnMgKHVzZSBkZWNpbWFsCisgICAgICAgICAgbm90YXRpb24pIGluIHBhY2tldHMgdGhhdCBpdCBzZW5kcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUKKyAgICAgICAgICBzZW5kaW5nIGZpbGVzIHRocm91Z2ggYSBkZXZpY2UgdGhhdCB1c2VzIEAgYXMgYW4gZXNjYXBlCisgICAgICAgICAgY2hhcmFjdGVyLCBidXQgYWxsb3dzIHlvdSB0byBzZW5kIGEgc2luZ2xlIGNvcHkgb2YgQCB0aHJvdWdoIGJ5CisgICAgICAgICAgZG91YmxpbmcgaXQsIHVzZSAic2V0IHNlbmQgZG91YmxlIDY0Ii4KKworICAgU0VUIFJFQ0VJVkUgSUdOT1JFLUNIQVIgWyBjaGFyIFsgY2hhciBbIC4uLiBdIF0gXQorICAgICAgICAgIFRlbGxzIEMtS2VybWl0IHRvIGlnbm9yZSB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcihzKSBpbiBpbmNvbWluZworICAgICAgICAgIHBhY2tldHMuIFVzZSB0aGlzLCBmb3IgZXhhbXBsZSwgd2hlbiBzb21ldGhpbmcgYmV0d2VlbiB0aGUKKyAgICAgICAgICBzZW5kZXIgYW5kIHJlY2VpdmVyIGlzIGluc2VydGluZyBsaW5lZmVlZHMgZm9yIHdyYXBwaW5nLCBOVUxzCisgICAgICAgICAgZm9yIHBhZGRpbmcsIGV0Yy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LjE2LiBOZXcgRmlsZS1UcmFuc2ZlciBEaXNwbGF5IEZvcm1hdHMKKworICAgU0VUIFRSQU5TRkVSIERJU1BMQVkgeyBCUklFRiwgQ1JULCBGVUxMU0NSRUVOLCBOT05FLCBTRVJJQUwgfQorICAgICAgICAgIFNlbGVjdHMgdGhlIGZpbGUtdHJhbnNmZXIgZGlzcGxheSBmb3JtYXQuCisKKyAgIEJSSUVGIGlzIHRoZSBuZXcgb25lLiBUaGlzIHdyaXRlcyBvbmUgbGluZSB0byB0aGUgc2NyZWVuIHBlciBmaWxlLAorICAgc2hvd2luZyB0aGUgZmlsZSdzIG5hbWUsIHRyYW5zZmVyIG1vZGUsIHNpemUsIHRoZSBzdGF0dXMgb2YgdGhlCisgICB0cmFuc2ZlciwgYW5kIHdoZW4gdGhlIHRyYW5zZmVyIGlzIHN1Y2Nlc3NmdWwsIHRoZSBlZmZlY3RpdmUgZGF0YSByYXRlCisgICBpbiBjaGFyYWN0ZXJzIHBlciBzZWNvbmQgKENQUykuIEV4YW1wbGU6CisKKyAgU0VORCBja2NmbjMubyAoYmluYXJ5KSAoNTkyMTYgYnl0ZXMpOiBPSyAoMC4xMDQgc2VjLCA1NzAyMDYgY3BzKQorICBTRU5EIGNrY2Zucy5vIChiaW5hcnkpICgxMTQ0MzYgYnl0ZXMpOiBPSyAoMC4xNDggc2VjLCA3NzIwMDYgY3BzKQorICBTRU5EIGNrY21haS5jICh0ZXh0KSAoNzkxNDcgYnl0ZXMpOiBPSyAoMC4xODAgc2VjLCA0Mzg1NDMgY3BzKQorICBTRU5EIGNrY21haS5vIChiaW5hcnkpICgzNTM5NiBieXRlcyk6IE9LICgwLjA2MCBzZWMsIDU4NzQ5NCBjcHMpCisgIFNFTkQgY2tjbmV0Lm8gKGJpbmFyeSkgKDYyNzcyIGJ5dGVzKTogUkVGVVNFRAorICBTRU5EIGNrY3Byby5vIChiaW5hcnkpICgxMjE0NDggYnl0ZXMpOiBPSyAoMC4xNzMgc2VjLCA3MDM5MjggY3BzKQorICBTRU5EIGNrY3Byby53ICh0ZXh0KSAoNjM2ODcgYnl0ZXMpOiBPSyAoMC4xNDEgc2VjLCA0NTMwNTkgY3BzKQorICBTRU5EIG1ha2VmaWxlICh0ZXh0KSAoMTg2NjM2IGJ5dGVzKTogT0sgKDAuNDQ0IHNlYywgNDIwNDcxIGNwcykKKyAgU0VORCB3ZXJtaXQgKGJpbmFyeSkgKDEwNjQ5NjAgYnl0ZXMpOiBPSyAoMi4yMDcgc2VjLCA0ODI0NzcgY3BzKQorCisgICBOb3RlIHRoYXQgdHJhbnNmZXIgdGltZXMgYXJlIG5vdyBvYnRhaW5lZCBpbiBmcmFjdGlvbmFsIHNlY29uZHMsCisgICByYXRoZXIgdGhhbiB3aG9sZSBzZWNvbmRzLCBzbyB0aGUgQ1BTIGZpZ3VyZXMgYXJlIG1vcmUgYWNjdXJhdGUgKHRoZQorICAgZGlzcGxheSBzaG93cyAzIGRlY2ltYWwgcGxhY2VzLCBidXQgaW50ZXJuYWxseSB0aGUgZmlndXJlIGlzIGdlbmVyYWxseQorICAgcHJlY2lzZSB0byB0aGUgbWljcm9zZWNvbmQpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDQuMTcuIE5ldyBUcmFuc2FjdGlvbiBMb2cgRm9ybWF0cworCisgICBUaGUgbmV3IGNvbW1hbmQ6CisKKyAgU0VUIFRSQU5TQUNUSU9OLUxPRyB7IFZFUkJPU0UsIEZUUCwgQlJJRUYgWyBzZXBhcmF0b3IgXSB9CisKKyAgIGxldHMgeW91IGNob29zZSB0aGUgZm9ybWF0IG9mIHRoZSB0cmFuc2FjdGlvbiBsb2cuIFZFUkJPU0UgKHRoZQorICAgZGVmYXVsdCkgaW5kaWNhdGVzIHRoZSB0cmFkaXRpb25hbCBmb3JtYXQgZGVzY3JpYmVkIGluIHRoZSBib29rLiBCUklFRgorICAgYW5kIEZUUCBhcmUgbmV3LiBUaGlzIGNvbW1hbmQgbXVzdCBiZSBnaXZlbiBwcmlvciB0byB0aGUgTE9HCisgICBUUkFOU0FDVElPTiBjb21tYW5kIGlmIGEgbm9uLVZFUkJPU0UgdHlwZSBpcyBkZXNpcmVkLgorCisgICAgNC4xNy4xLiBUaGUgQlJJRUYgRm9ybWF0CisKKyAgIEJSSUVGIGNob29zZXMgYSBvbmUtbGluZSBwZXIgZmlsZSBmb3JtYXQgc3VpdGFibGUgZm9yIGRpcmVjdAorICAgaW1wb3J0YXRpb24gaW50byBkYXRhYmFzZXMgbGlrZSBJbmZvcm1peCwgT3JhY2xlLCBvciBTeWJhc2UsIGluIHdoaWNoOgorCisgICAgICogRWFjaCByZWNvcmQgaGFzIDggZmllbGRzLgorICAgICAqIEZpZWxkcyBhcmUgc2VwYXJhdGVkIGJ5IGEgbm9uLWFscGhhbnVtZXJpYyBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgICAqIFRoZSBkZWZhdWx0IHNlcGFyYXRvciBjaGFyYWN0ZXIgaXMgY29tbWEgKCwpLgorICAgICAqIEFueSBmaWVsZCBjb250YWluaW5nIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIGlzIGVuY2xvc2VkIGluCisgICAgICAgZG91YmxlcXVvdGVzLgorICAgICAqIFRoZSBmaW5hbCBmaWVsZCBpcyBlbmNsb3NlZCBpbiBkb3VibGVxdW90ZXMuCisKKyAgIFRoZSBmaWVsZHMgYXJlOgorCisgICAgMS4gRGF0ZSBpbiB5eXl5bW1kZCBmb3JtYXQKKyAgICAyLiBUaW1lIGluIGhoOm1tOnNzIGZvcm1hdAorICAgIDMuIEFjdGlvbjogU0VORCBvciBSRUNWCisgICAgNC4gVGhlIGxvY2FsIGZpbGVuYW1lCisgICAgNS4gVGhlIHNpemUgb2YgdGhlIGZpbGUKKyAgICA2LiBUaGUgdHJhbnNmZXIgbW9kZSAodGV4dCwgYmluYXJ5LCBpbWFnZSwgbGFiZWxlZCkKKyAgICA3LiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2ZlcjogT0sgb3IgRkFJTEVECisgICAgOC4gQWRkaXRpb25hbCBzdGF0dXMtZGVwZW5kZW50IGluZm8sIGluIGRvdWJsZXF1b3Rlcy4KKworICAgRXhhbXBsZXM6CisKKyAgMjAwMDAyMDgsMTI6MDg6NTIsUkVDViwvdS9vbGdhL29vZmEudHh0LDUyNDYsdGV4dCxPSywiMC4yODRzZWMgMTg0NDNjcHMiCisgIDIwMDAwMjA4LDEyOjA5OjMxLFNFTkQsL3Uvb2xnYS9vb2ZhLmV4ZSwzMjc2OCxiaW5hcnksT0ssIjEuMjQzc2VjIDI2MzYyY3BzIgorICAyMDAwMDIwOCwxMjoxMDowMixTRU5ELCIvdS9vbGdhL2EsYiIsMTAxMzAsdGV4dCxGQUlMRUQsIlJlZnVzZWQ6IGRhdGUiCisKKyAgIE5vdGUgaG93IHRoZSBmaWxlbmFtZSBpcyBlbmNsb3NlZCBpbiBkb3VibGVxdW90ZXMgaW4gdGhlIGZpbmFsCisgICBleGFtcGxlLCBiZWNhdXNlIGl0IGNvbnRhaW5zIGEgY29tbWEuCisKKyAgIFRvIG9idGFpbiBCUklFRiBmb3JtYXQsIHlvdSBtdXN0IGdpdmUgdGhlIFNFVCBUUkFOU0FDVElPTi1MT0cgQlJJRUYKKyAgIGNvbW1hbmQgYmVmb3JlIHRoZSBMT0cgVFJBTlNBQ1RJT05TIGNvbW1hbmQuIChJZiB5b3UgZ2l2ZSB0aGVtIGluIHRoZQorICAgb3Bwb3NpdGUgb3JkZXIsIGEgaGVhZGluZyBpcyB3cml0dGVuIHRvIHRoZSBsb2cgYnkgdGhlIExPRyBjb21tYW5kLikKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMTcuMi4gVGhlIEZUUCBGb3JtYXQKKworICAgU0VUIFRSQU5TQUNUSU9OLUxPRyBGVFAgKGF2YWlsYWJsZSBvbmx5IGluIFVOSVgpIGNob29zZXMgYSBmb3JtYXQgdGhhdAorICAgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBXVS1GVFBEIChXYXNoaW5ndG9uIFVuaXZlcnNpdHkgRlRQIGRhZW1vbikgbG9nLAorICAgYW5kIHNvIGNhbiBiZSBwcm9jZXNzZWQgYnkgYW55IHNvZnR3YXJlIHRoYXQgcHJvY2Vzc2VzIHRoZSBXVS1GVFBECisgICBsb2cuIEl0IGxvZ3Mgb25seSB0cmFuc2ZlcnMgaW4gYW5kIG91dCwgYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQKKyAgIChidXQgc3VjY2VzcyBvciBmYWlsdXJlIGlzIG5vdCBpbmRpY2F0ZWQsIGR1ZSB0byBsYWNrIG9mIGEgZmllbGQgaW4KKyAgIHRoZSBXVS1GVFBEIGxvZyBmb3JtYXQgZm9yIHRoaXMgcHVycG9zZSkuIE5vbi10cmFuc2ZlciBldmVudHMgYXJlIG5vdAorICAgcmVjb3JkZWQuCisKKyAgIFVubGlrZSBvdGhlciBsb2dzLCB0aGUgRlRQLWZvcm1hdCB0cmFuc2FjdGlvbiBsb2cgaXMgb3BlbmVkIGluIGFwcGVuZAorICAgbW9kZSBieSBkZWZhdWx0LiBUaGlzIGFsbG93cyB5b3UgdG8gZWFzaWx5IGtlZXAgYSByZWNvcmQgb2YgYWxsIHlvdXIKKyAgIGtlcm1pdCB0cmFuc2ZlcnMsIGFuZCBpdCBhbHNvIGFsbG93cyB0aGUgc2FtZSBsb2cgdG8gYmUgc2hhcmVkIGJ5CisgICBtdWx0aXBsZSBzaW11bHRhbmVvdXMgS2VybWl0IHByb2Nlc3NlcyBvciAocGVybWlzc2lvbnMgcGVybWl0dGluZykKKyAgIHVzZXJzLiBZb3UgY2FuLCBvZiBjb3Vyc2UsIGZvcmNlIGNyZWF0aW9uIG9mIGEgbmV3IGxvZ2ZpbGUgYnkKKyAgIHNwZWNpZnlpbmcgdGhlIE5FVyBrZXl3b3JkIGFmdGVyIHRoZSBmaWxlbmFtZSwgZS5nLgorCisgIGxvZyB0cmFuc2FjdGlvbnMgb29mYS5sb2cgbmV3CisKKyAgIEFsbCByZWNvcmRzIGluIHRoZSBGVFAtc3R5bGUgbG9nIGFyZSBpbiBhIGNvbnNpc3RlbnQgZm9ybWF0LiBUaGUgZmlyc3QKKyAgIGZpZWxkIGlzIGZpeGVkLWxlbmd0aCBhbmQgY29udGFpbnMgc3BhY2VzOyBzdWJzZXF1ZW50IGZpZWxkcyBhcmUKKyAgIHZhcmlhYmxlIGxlbmd0aCwgY29udGFpbiBubyBzcGFjZXMsIGFuZCBhcmUgc2VwYXJhdGVkIGJ5IG9uZSBvciBtb3JlCisgICBzcGFjZXMuIFRoZSBmaWVsZHMgYXJlOgorCisgICBUaW1lc3RhbXAKKyAgICAgICAgICBUaGlzIGlzIGFuIGFzY3RpbWUtc3R5bGUgdGltZXN0YW1wLCBleGFtcGxlOiAiV2VkIFNlcCAxNgorICAgICAgICAgIDIwOjE5OjA1IDE5OTkiIEl0IGlzIGFsd2F5cyBleGFjdGx5IDI0IGNoYXJhY3RlcnMgbG9uZywgYW5kIHRoZQorICAgICAgICAgIHN1YmZpZWxkcyBhcmUgYWx3YXlzIGluIGZpeGVkIHBvc2l0aW9ucy4KKworICAgRWxhcHNlZCB0aW1lCisgICAgICAgICAgVGhlIHdob2xlIG51bWJlciBvZiBzZWNvbmRzIHJlcXVpcmVkIHRvIHRyYW5zZmVyIHRoZSBmaWxlLCBhcyBhCisgICAgICAgICAgc3RyaW5nIG9mIGRlY2ltYWwgZGlnaXRzLCBlLmcuICIyNCIuCisKKyAgIENvbm5lY3Rpb24KKyAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbmV0d29yayBob3N0IHRvIHdoaWNoIEMtS2VybWl0IGlzIGNvbm5lY3RlZCwgb3IKKyAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgc2VyaWFsIGRldmljZSB0aHJvdWdoIHdoaWNoIGl0IGhhcyBkaWFsZWQgKG9yCisgICAgICAgICAgaGFzIGEgZGlyZWN0IGNvbm5lY3Rpb24pLCBvciAiL2Rldi90dHkiIGZvciB0cmFuc2ZlcnMgaW4gcmVtb3RlCisgICAgICAgICAgbW9kZS4KKworICAgQnl0ZXMgdHJhbnNmZXJyZWQKKyAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLCBkZWNpbWFsIGRpZ2l0cywgZS5nLgorICAgICAgICAgICIxNTM3OTA0Ii4KKworICAgRmlsZW5hbWUKKyAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IHdhcyB0cmFuc2ZlcnJlZCwgZS5nLgorICAgICAgICAgICIvcHViL2Z0cC9rZXJtaXQvYS9SRUFETUUuVFhUIi4gSWYgdGhlIGZpbGVuYW1lIGNvbnRhaW5zIGFueQorICAgICAgICAgIHNwYWNlcyBvciBjb250cm9sIGNoYXJhY3RlcnMsIGVhY2ggc3VjaCBjaGFyYWN0ZXIgaXMgcmVwbGFjZWQKKyAgICAgICAgICBieSBhbiB1bmRlcnNjb3JlICgnXycpIGNoYXJhY3Rlci4KKworICAgTW9kZQorICAgICAgICAgIFRoZSBsZXR0ZXIgJ2InIGlmIHRoZSBmaWxlIHdhcyB0cmFuc2ZlcnJlZCBpbiBiaW5hcnkgbW9kZSwgb3IKKyAgICAgICAgICAnYScgaWYgaXQgd2FzIHRyYW5zZmVycmVkIGluIHRleHQgKEFTQ0lJKSBtb2RlLgorCisgICBPcHRpb25zCisgICAgICAgICAgVGhpcyBmaWVsZCBhbHdheXMgY29udGFpbnMgYW4gdW5kZXJzY29yZSAoJ18nKSBjaGFyYWN0ZXIuCisKKyAgIERpcmVjdGlvbgorICAgICAgICAgIFRoZSBsZXR0ZXIgJ28nIGlmIHRoZSBmaWxlIHdhcyB0cmFuc2ZlcnJlZCBPdXQsIGFuZCAnaScgaWYgdGhlCisgICAgICAgICAgZmlsZSB3YXMgdHJhbnNmZXJyZWQgSW4uCisKKyAgIFVzZXIgY2xhc3MKKyAgICAgICAgICBUaGUgbGV0dGVyICdyJyBpbmRpY2F0ZXMgdGhlIGZpbGUgd2FzIHRyYW5zZmVycmVkIGJ5IGEgUmVhbAorICAgICAgICAgIHVzZXIuCisKKyAgIFVzZXIgaWRlbnRpZmljYXRpb24KKyAgICAgICAgICBUaGUgSUQgb2YgdGhlIHVzZXIgd2hvIHRyYW5zZmVycmVkIHRoZSBmaWxlLgorCisgICBTZXJ2ZXIgaWRlbnRpZmljYXRpb24KKyAgICAgICAgICBUaGUgc3RyaW5nICJrZXJtaXQiLiBUaGlzIGRpc3Rpbmd1aXNoZXMgYSBLZXJtaXQgdHJhbnNmZXIgbG9nCisgICAgICAgICAgcmVjb3JkIGZyb20gYSBXVS1GVFBEIHJlY29yZCwgd2hpY2ggY29udGFpbnMgImZ0cCIgaW4gdGhpcworICAgICAgICAgIGZpZWxkLgorCisgICBBdXRoZW50aWNhdGlvbiBjbGFzcworICAgICAgICAgIFRoZSBkaWdpdCAnMScgaWYgd2Uga25vdyB0aGUgdXNlcidzIElEIG9uIHRoZSBjbGllbnQgc3lzdGVtLAorICAgICAgICAgIG90aGVyd2lzZSAnMCcuIEN1cnJlbnRseSwgYWx3YXlzICcwJy4KKworICAgQXV0aGVudGljYXRlZCB1c2VyCisgICAgICAgICAgSWYgdGhlIGF1dGhlbnRpY2F0aW9uIGNsYXNzIGlzICcxJywgdGhpcyBpcyB0aGUgdXNlcidzIElEIG9uCisgICAgICAgICAgdGhlIGNsaWVudCBzeXN0ZW0uIE90aGVyd2lzZSBpdCBpcyBhbiBhc3RlcmlzayAoJyonKS4gQ3VycmVudGx5CisgICAgICAgICAgaXQgaXMgYWx3YXlzIGFuIGFzdGVyaXNrLgorCisgICBFeGFtcGxlczoKKworICBUaHUgT2N0IDIyIDE3OjQyOjQ4IDE5OTggMCAqIDk0IC91c3Ivb2xnYS9uZXcueCBhIF8gaSByIG9sZ2Ega2VybWl0IDAgKgorICBUaHUgT2N0IDIyIDE3OjUxOjI5IDE5OTggMSAqIDE0Nzg5OSAvdXNyL29sZ2EvdGVzdC5jIGEgXyBvIHIgb2xnYSBrZXJtaXQgMCAqCisgIFRodSBPY3QgMjIgMTc6NTE6NDQgMTk5OCAxICogMjM1IC91c3Ivb2xnYS90ZXN0Lm8gYiBfIGkgciBvbGdhIGtlcm1pdCAwICoKKyAgRnJpIE9jdCAyMyAxMjoxMDoyNSAxOTk4IDAgKiAyMzUgL3Vzci9vbGdhL3gua3NjIGEgXyBvIHIgb2xnYSBrZXJtaXQgMCAqCisKKyAgIE5vdGUgdGhhdCBhbiBmdHAtZm9ybWF0IHRyYW5zYWN0aW9uIGxvZyBjYW4gYWxzbyBiZSBzZWxlY3RlZCBvbiB0aGUKKyAgIEtlcm1pdCBjb21tYW5kIGxpbmUgYXMgZm9sbG93czoKKworICBrZXJtaXQgLS14ZmVyZmlsZTpmaWxlc3BlYworCisgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG86CisKKyAgU0VUIFRSQU5TQUNUSU9OLUxPRyBGVFAKKyAgTE9HIFRSQU5TQUNUSU9OUyBmaWxlc3BlYyBBUFBFTkQKKworICAgQ29uY2VpdmFibHkgaXQgY291bGQgYmUgcG9zc2libGUgdG8gaGF2ZSBhIHN5c3RlbS13aWRlIHNoYXJlZCBLZXJtaXQKKyAgIGxvZywgZXhjZXB0IHRoYXQgVU5JWCBsYWNrcyBhbnkgbm90aW9uIG9mIGFuIGFwcGVuZC1vbmx5IGZpbGU7IHRodXMKKyAgIGFueSB1c2VyIHdobyBjb3VsZCBhcHBlbmQgdG8gdGhlIGxvZyBjb3VsZCBhbHNvIGRlbGV0ZSBpdCAob3IgYWx0ZXIKKyAgIGl0KS4gVGhpcyBwcm9ibGVtIGNvdWxkIGJlIHdvcmtlZCBhcm91bmQgdXNpbmcgc2V0dWlkL3NldGdpZCB0cmlja3MsCisgICBidXQgdGhlc2Ugd291bGQgbW9zdCBsaWtlbHkgaW50ZXJmZXJlIHdpdGggdGhlIG90aGVyIHNldHVpZC9zZXRnaWQKKyAgIHRyaWNrcyBDLUtlcm1pdCBtdXN0IHVzZSBmb3IgZ2V0dGluZyBhdCBkaWFsb3V0IGRldmljZXMgYW5kIFVVQ1AKKyAgIGxvZ2ZpbGVzLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDQuMTguIFVucHJlZml4aW5nIE5VTAorCisgICBBcyBvZiA2LjEuMTkzIEFscGhhLjEwLCBDLUtlcm1pdCBjYW4gZmluYWxseSBzZW5kIGFuZCByZWNlaXZlCisgICBmaWxlLXRyYW5zZmVyIHBhY2tldHMgaW4gd2hpY2ggTlVMIChBU0NJSSAwKSBpcyB1bnByZWZpeGVkIChubyBtb3JlCisgICBOVUwtdGVybWluYXRlZCBwYWNrZXRzISkuIE5VTCBpcywgb2YgY291cnNlLCBleHRyZW1lbHkgcHJldmFsZW50IGluCisgICBiaW5hcnkgZmlsZXMgc3VjaCBhcyBleGVjdXRhYmxlcywgYW5kIHRoaXMgaGFzIGJlZW4gYSBzaWduaWZpY2FudAorICAgc291cmNlIG9mIHBhY2tldCBvdmVyaGVhZC4gRm9yIGV4YW1wbGUsIHdoZW4gdHJhbnNmZXJyaW5nIGl0c2VsZiAodGhlCisgICBTdW5PUyBDLUtlcm1pdCBleGVjdXRhYmxlKSB3aXRoIG1pbmltYWwgcHJlZml4aW5nIGFuZCA5MDAwLWJ5dGUKKyAgIHBhY2tldHMsIHdlIHNlZToKKworICBGaWxlIHNpemU6ICAgICAgICAgICAgICAgICAgICAgICAxMDY0OTYwCisgIFBhY2tldCBjaGFycyB3aXRoIDAgcHJlZml4ZWQ6ICAgIDExOTk2MjkgIG92ZXJoZWFkID0gMTIuNjUlCisgIFBhY2tldCBjaGFycyB3aXRoIDAgdW5wcmVmaXhlZDogIDEwNjIzOTMgIG92ZXJoZWFkID0gLTAuMDMlCisKKyAgIFRyYW5zZmVyIHJhdGVzIGdvIHVwIGFjY29yZGluZ2x5LCBub3Qgb25seSBiZWNhdXNlIG9mIHRoZSByZWR1Y2VkCisgICBhbW91bnQgb2YgaS9vLCBidXQgYWxzbyBiZWNhdXNlIGxlc3MgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgb24gZWFjaAorICAgZW5kLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDQuMTkuIENsZWFyLUNoYW5uZWwgUHJvdG9jb2wKKworICAgTm93IHRoYXQgQy1LZXJtaXQgaXRzZWxmIGlzIGNhcGFibGUgb2Ygc2VuZGluZyBhbmQgcmVjZWl2aW5nIGFueSBieXRlCisgICBhdCBhbGwgb24gYSBjbGVhciBjaGFubmVsIChbNTE2XVNlY3Rpb24gNC4xOCksIGl0IGlzLCBmb3IgdGhlIGZpcnN0CisgICB0aW1lLCBpbiBhIHBvc2l0aW9uIHRvIG5lZ290aWF0ZSBhIGNsZWFyIGNoYW5uZWwgd2l0aCB0aGUgb3RoZXIKKyAgIEtlcm1pdCwgZ2l2aW5nIGl0IHBlcm1pc3Npb24gKGJ1dCBub3QgcmVxdWlyaW5nIGl0KSB0byB1bnByZWZpeCBhbnkKKyAgIGFuZCBhbGwgY2hhcmFjdGVycyB0aGF0IGl0IGtub3dzIGFyZSBzYWZlLiBJbiBnZW5lcmFsIHRoaXMgbWVhbnMgYWxsCisgICBidXQgdGhlIEtlcm1pdCBzdGFydC1vZi1wYWNrZXQgY2hhcmFjdGVyIChub3JtYWxseSBDdHJsLUEpLCBDYXJyaWFnZQorICAgUmV0dXJuIChub3Qgb25seSBLZXJtaXQncyBlbmQtb2YtcGFja2V0IGNoYXJhY3RlciwgYnV0IGFsc28gdHJlYXRlZAorICAgc3BlY2lhbGx5IG9uIFRlbG5ldCBOVlQgbGlua3MpLCBhbmQgSUFDICgyNTUsIGFsc28gc3BlY2lhbCB0byBUZWxuZXQpLgorCisgICBCeSBkZWZhdWx0LCBDLUtlcm1pdCB3aWxsIHNheSBpdCBoYXMgYSBjbGVhciBjaGFubmVsIG9ubHkgaWYgaXQgaGFzCisgICBvcGVuZWQgYSBUQ1Agc29ja2V0LiBTaW5jZSB0aGUgS2VybWl0IHByb2dyYW0gb24gdGhlIGZhciBlbmQgb2YgYQorICAgVENQL0lQIGNvbm5lY3Rpb24gZ2VuZXJhbGx5IGRvZXMgbm90IGtub3cgaXQgaGFzIGEgVENQL0lQIGNvbm5lY3Rpb24sCisgICBpdCB3aWxsIG5vdCBhbm5vdW5jZSBhIGNsZWFyIGNoYW5uZWwgdW5sZXNzIGl0IGhhcyBiZWVuIHRvbGQgdG8gZG8gc28uCisgICBUaGUgY29tbWFuZCBpczoKKworICAgU0VUIENMRUFSLUNIQU5ORUwgeyBPTiwgT0ZGLCBBVVRPIH0KKworICAgQVVUTyBpcyB0aGUgZGVmYXVsdCwgbWVhbmluZyB0aGF0IHRoZSBjbGVhci1jaGFubmVsIHN0YXR1cyBpcworICAgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIHR5cGUgb2YgY29ubmVjdGlvbi4gT04gbWVhbnMgdG8KKyAgIGFubm91bmNlIGEgY2xlYXIgY2hhbm5lbCwgT0ZGIG1lYW5zIG5vdCB0byBhbm5vdW5jZSBpdC4gVXNlIFNIT1cKKyAgIFNUUkVBTUlORyAoWzUxN11TZWN0aW9uIDQuMjApIHRvIHNlZSB0aGUgY3VycmVudCBDTEVBUi1DSEFOTkVMIHN0YXR1cy4KKyAgIFN5bm9ueW06IFNFVCBDTEVBUkNIQU5ORUwuCisKKyAgIENMRUFSLUNIQU5ORUwgaXMgYWxzbyBzZXQgaWYgeW91IHN0YXJ0IEMtS2VybWl0IHdpdGggdGhlIC1JIHN3aXRjaAorICAgKHNlZSBbNTE4XVNlY3Rpb24gNC4yMCkuCisKKyAgIFdoZW5ldmVyIGEgY2xlYXIgY2hhbm5lbCBpcyBuZWdvdGlhdGVkLCB0aGUgcmVzdWx0aW5nCisgICBjb250cm9sLWNoYXJhY3RlciB1bnByZWZpeGluZyBpcyAic3RpY2t5IjsgdGhhdCBpcywgaXQgcmVtYWlucyBpbgorICAgZWZmZWN0IGFmdGVyIHRoZSB0cmFuc2ZlciBzbyB5b3UgY2FuIHVzZSBTSE9XIENPTlRST0wgdG8gc2VlIHdoYXQgd2FzCisgICBuZWdvdGlhdGVkLgorCisgICBZb3UgY2FuIGFsc28gc2VlIHdoZXRoZXIgYSBjbGVhciBjaGFubmVsIHdhcyBuZWdvdGlhdGVkIGluIHRoZQorICAgU1RBVElTVElDUyAvVkVSQk9TRSBEaXNwbGF5LgorCisgICBUaGUgYWR2YW50YWdlIG9mIHRoZSBjbGVhciBjaGFubmVsIGZlYXR1cmUgaXMgdGhhdCBpdCBjYW4gbWFrZSBmaWxlCisgICB0cmFuc2ZlcnMgZ28gZmFzdGVyIGF1dG9tYXRpY2FsbHkuIFRoZSBkaXNhZHZhbnRhZ2Ugd291bGQgYmUKKyAgIGZpbGUtdHJhbnNmZXIgZmFpbHVyZXMgaWYgdGhlIGNoYW5uZWwgaXMgbm90IHRydWx5IGNsZWFyLCBmb3IgZXhhbXBsZQorICAgaWYgQy1LZXJtaXQgbWFkZSBhIFRlbG5ldCBjb25uZWN0aW9uIHRvIGEgdGVybWluYWwgc2VydmVyLCBhbmQgdGhlbgorICAgZGlhbGVkIG91dCBmcm9tIHRoZXJlOyBvciBpZiBDLUtlcm1pdCBtYWRlIGFuIFJsb2dpbiBjb25uZWN0aW9uIHRvCisgICBob3N0IGFuZCB0aGVuIG1hZGUgYSBUZWxuZXQgY29ubmVjdGlvbiBmcm9tIHRoZXJlIHRvIGFub3RoZXIgaG9zdC4gSWYKKyAgIGEgZmlsZSB0cmFuc2ZlciBmYWlscyBvbiBhIFRDUC9JUCBjb25uZWN0aW9uLCB1c2UgU0hPVyBDT05UUk9MIHRvCisgICBjaGVjayB3aGV0aGVyIGNvbnRyb2wgY2hhcmFjdGVycyBiZWNhbWUgdW5wcmVmaXhlZCBhcyBhIHJlc3VsdCBvZgorICAgcHJvdG9jb2wgbmVnb3RpYXRpb25zLCBhbmQvb3IgU0hPVyBTVFJFQU1JTkcgKFs1MTldU2VjdGlvbiA0LjIwKSB0bworICAgc2VlIGlmICJjbGVhci1jaGFubmVsIiB3YXMgbmVnb3RpYXRlZC4gSWYgdGhpcyBoYXBwZW5lZCwgdXNlIFNFVAorICAgQ0xFQVItQ0hBTk5FTCBPRkYgYW5kIFNFVCBQUkVGSVhJTkcgQ0FVVElPVVMgKG9yIHdoYXRldmVyKSB0byBwcmV2ZW50CisgICBpdCBmcm9tIGhhcHBlbmluZyBhZ2Fpbi4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LjIwLiBTdHJlYW1pbmcgUHJvdG9jb2wKKworICAgQSBuZXcgS2VybWl0IHByb3RvY29sIG9wdGlvbiBjYWxsZWQgInN0cmVhbWluZyIgd2FzIGFkZGVkIGluIEMtS2VybWl0CisgICA3LjAuIFRoZSBpZGVhIGlzIHRoYXQgaWYgdGhlIHR3byBLZXJtaXQgcGFydG5lcnMgaGF2ZSBhIHJlbGlhYmxlCisgICB0cmFuc3BvcnQgKHN1Y2ggYXMgVENQL0lQIG9yIFguMjUpIGJldHdlZW4gdGhlbSwgdGhlbiB0aGVyZSBpcyBubyBuZWVkCisgICB0byBzZW5kIEFDS3MgZm9yIERhdGEgcGFja2V0cywgb3IgTkFLcywgc2luY2UgYSByZWxpYWJsZSB0cmFuc3BvcnQKKyAgIHdpbGwsIGJ5IGRlZmluaXRpb24sIGRlbGl2ZXIgYWxsIHBhY2tldHMgaW4gb3JkZXIgYW5kIHVuZGFtYWdlZC4gT24KKyAgIHN1Y2ggYSBjb25uZWN0aW9uLCBzdHJlYW1pbmcgY3V0cyBkb3duIG5vdCBvbmx5IG9uIEtlcm1pdCBwcm9ncmFtCisgICBvdmVyaGVhZCAoc3dpdGNoaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gcmVhZGluZyBhbmQgc2VuZGluZworICAgcGFja2V0cyksIGJ1dCBhbHNvIHRlbmRzIHRvIG1ha2UgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZSBpdHNlbGYKKyAgIG1vcmUgZWZmaWNpZW50bHkgKGUuZy4gYnkgZGVmZWF0aW5nIHRoZSBOYWdsZSBhbGdvcml0aG0gYW5kL29yIERlbGF5ZWQKKyAgIEFDSyBzdHJhdGFnZW0gb2YgdGhlIFRDUCBsYXllcikuIEZ1cnRoZXJtb3JlLCBpdCBhbGxvd3MgdHJhbnNmZXJzIHRvCisgICB3b3JrIHNtb290aGx5IG9uIGV4dHJlbWVseSBzbG93IG5ldHdvcmsgY29uZ2VzdGlvbnMgdGhhdCB3b3VsZAorICAgb3RoZXJ3aXNlIGNhdXNlIHRpbWVvdXRzIGFuZCByZXRyYW5zbWlzc2lvbnMsIGFuZCBldmVuIGZhaWx1cmUgd2hlbgorICAgdGhlIHJldHJ5IGxpbWl0IHdhcyBleGNlZWRlZC4KKworICAgVGhlIHRyaWNrIGlzIGtub3dpbmcgd2hlbiB3ZSBjYW4gc3RyZWFtOgorCisgICAgMS4gSWYgQy1LZXJtaXQgaGFzIG9wZW5lZCBhIFRDUCBzb2NrZXQgb3IgWC4yNSBjb25uZWN0aW9uLCBpdCBvZmZlcnMKKyAgICAgICBzdHJlYW0uCisgICAgMi4gSWYgQy1LZXJtaXQgaGFzIGJlZW4gc3RhcnRlZCB3aXRoIHRoZSAtSSAodXBwZXJjYXNlKSBvcHRpb24sIG9yIGlmCisgICAgICAgaXQgaGFzIGJlZW4gdG9sZCB0byBTRVQgUkVMSUFCTEUgT04sIGl0IG9mZmVycyB0byBzdHJlYW0uCisgICAgMy4gSWYgQy1LZXJtaXQgaXMgaW4gcmVtb3RlIG1vZGUsIGFuZCBoYXMgYmVlbiB0b2xkIHRvIFNFVCBSRUxJQUJMRQorICAgICAgIEFVVE8gKG9yIE9OKSwgaXQgYWx3YXlzIG9mZmVycyB0byBzdHJlYW0sIGFuZCBhbHNvIGFsd2F5cyBhZ3JlZXMKKyAgICAgICB0byBzdHJlYW0sIGlmIHRoZSBvdGhlciBLZXJtaXQgb2ZmZXJzLiBVbmxlc3MgeW91IHRha2UgZXhwbGljaXQKKyAgICAgICBhY3Rpb25zIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cywgdGhpcyBhbGxvd3MgdGhlIGxvY2FsIEtlcm1pdAorICAgICAgICh0aGUgb25lIHRoYXQgbWFkZSB0aGUgY29ubmVjdGlvbiwgYW5kIHNvIGtub3dzIHdoZXRoZXIgaXQncworICAgICAgIHJlbGlhYmxlKSB0byBjb250cm9sIHN0cmVhbWluZy4KKworICAgKE5vdGUgdGhhdCBhbiBvZmZlciB0byBzdHJlYW0gYWxzbyByZXN1bHRzIGluIGEgQ2xlYXItQ2hhbm5lbAorICAgYW5ub3VuY2VtZW50IGlmIENMRUFSLUNIQU5ORUwgaXMgc2V0IHRvIEFVVE87IHNlZSBbNTIwXVNlY3Rpb24gNC4xOS4pCisKKyAgIFdoZW4gQk9USCBLZXJtaXRzIG9mZmVyIHRvIHN0cmVhbSwgdGhlbiB0aGV5IHN0cmVhbTsgb3RoZXJ3aXNlIHRoZXkKKyAgIGRvbid0LiBUaHVzIHN0cmVhbWluZy1jYXBhYmxlIEtlcm1pdCBwcm9ncmFtcyBpbnRlcm9wZXJhdGUKKyAgIGF1dG9tYXRpY2FsbHkgYW5kIHRyYW5zcGFyZW50bHkgd2l0aCBub25zdHJlYW1pbmcgb25lcy4gSWYgdGhlIHR3bworICAgS2VybWl0cyBkbyBhZ3JlZSB0byBzdHJlYW0sIHlvdSdsbCBzZWUgdGhlIHdvcmQgIlNUUkVBTUlORyIgb24gdGhlCisgICBmdWxsc2NyZWVuIGZpbGUtdHJhbnNmZXIgZGlzcGxheSBpbiB0aGUgV2luZG93IFNsb3RzIGZpZWxkLiBZb3UgY2FuCisgICBhbHNvIGZpbmQgb3V0IGFmdGVyd2FyZHMgd2l0aCB0aGUgU1RBVElTVElDUyBvciBTSE9XIFNUUkVBTUlORworICAgY29tbWFuZHMuCisKKyAgICAgV0FSTklORzogQXV0b21hdGljIGNob2ljZSBvZiBzdHJlYW1pbmcgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24KKyAgICAgb2YgYSAiZGlyZWN0IiBlbmQtdG8tZW5kIG5ldHdvcmsgY29ubmVjdGlvbjsgZm9yIGV4YW1wbGUsIGEgVGVsbmV0CisgICAgIG9yIFJsb2dpbiBjb25uZWN0aW9uIGZyb20gaG9zdCBBIHRvIGhvc3QgQiwgYW5kIHRyYW5zZmVycmluZyBmaWxlcworICAgICBiZXR3ZWVuIEEgYW5kIEIuIEhvd2V2ZXIsIGlmIHlvdXIgY29ubmVjdGlvbiBoYXMgYWRkaXRpb25hbAorICAgICBjb21wb25lbnRzIC0tIHNvbWV0aGluZyAiaW4gdGhlIG1pZGRsZSIgKEIpIHRoYXQgeW91IGhhdmUgbWFkZSBhCisgICAgIG5ldHdvcmsgY29ubmVjdGlvbiB0bywgd2hpY2ggbWFrZXMgYSBzZXBhcmF0ZSBjb25uZWN0aW9uIHRvIHRoZQorICAgICBkZXN0aW5hdGlvbiBob3N0IChDKSwgdGhlbiB5b3UgZG9uJ3QgcmVhbGx5IGhhdmUgYSByZWxpYWJsZQorICAgICBjb25uZWN0aW9uLCBidXQgQy1LZXJtaXQgaGFzIG5vIHdheSBvZiBrbm93aW5nIHRoaXM7IHRyYW5zZmVycmluZworICAgICBmaWxlcyBiZXR3ZWVuIEEgYW5kIEMgd2lsbCBwcm9iYWJseSBmYWlsLiBJbiBzdWNoIGNhc2VzLCB5b3UnbGwKKyAgICAgbmVlZCB0byB0ZWxsIHRoZSAqbG9jYWwqIEMtS2VybWl0IHRvICJzZXQgcmVsaWFibGUgb2ZmIiBiZWZvcmUKKyAgICAgdHJhbnNmZXJyaW5nIGZpbGVzIChpdCBkb2VzIG5vIGdvb2QgdG8gZ2l2ZSB0aGlzIGNvbW1hbmQgdG8gdGhlCisgICAgIHJlbW90ZSBLZXJtaXQgc2luY2UgdGhlIGxvY2FsIG9uZSBjb250cm9scyB0aGUgUkVMSUFCTEUgc2V0dGluZykuCisKKyAgIFN0cmVhbWluZyBpcyBsaWtlIHVzaW5nIGFuIGluZmluaXRlIHdpbmRvdyBzaXplLCB3aXRoIG5vIHRpbWVvdXRzIGFuZAorICAgbm8gdG9sZXJhbmNlIGZvciB0cmFuc21pc3Npb24gZXJyb3JzIChzaW5jZSB0aGVyZSBzaG91bGRuJ3QgYmUgYW55KS4KKyAgIEl0IHJlbGllcyBvbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgZm9yIGZsb3cgY29udHJvbCwgZXJyb3IKKyAgIGNvcnJlY3Rpb24sIHRpbWVvdXRzLCBhbmQgcmV0cmFuc21pc3Npb24uIFRodXMgaXQgaXMgdmVyeSBzdWl0YWJsZSBmb3IKKyAgIHVzZSBvbiBUQ1AvSVAgY29ubmVjdGlvbnMsIGVzcGVjaWFsbHkgc2xvdyBvciBidXJzdHkgb25lcywgc2luY2UKKyAgIEtlcm1pdCdzIHBhY2tldCB0aW1lb3V0cyB3b24ndCBpbnRlcmZlcmUgd2l0aCB0aGUgdHJhbnNmZXIgLS0gZWFjaAorICAgcGFja2V0IHRha2VzIGFzIGxvbmcgdG8gcmVhY2ggaXRzIGRlc3RpbmF0aW9uIGFzIGl0IHRha2VzIFRDUCB0bworICAgZGVsaXZlciBpdC4gSWYgVENQIGNhbid0IGRlbGl2ZXIgdGhlIHBhY2tldCB3aXRoaW4gaXRzIG93biB0aW1lb3V0CisgICBwZXJpb2QgKG92ZXIgd2hpY2ggS2VybWl0IGhhcyBubyBjb250cm9sKSwgaXQgc2lnbmFscyBhIGZhdGFsIGVycm9yLgorICAgSnVzdCBsaWtlIEZUUC4KKworICAgU3RyZWFtaW5nIGdvZXMgbXVjaCBmYXN0ZXIgdGhhbiBub24tc3RyZWFtaW5nIHdoZW4gYSByZWxhdGl2ZWx5IHNtYWxsCisgICBwYWNrZXQgbGVuZ3RoIGlzIHVzZWQsIGFuZCBpdCB0ZW5kcyB0byBnbyBmYXN0ZXIgdGhhbiBub24tc3RyZWFtaW5nCisgICB3aXRoIGV2ZW4gdGhlIGxvbmdlc3QgcGFja2V0IGxlbmd0aHMuIFRoZSBLZXJtaXQgd2luZG93IHNpemUgaXMKKyAgIGlycmVsZXZhbnQgdG8gc3RyZWFtaW5nIHByb3RvY29sLCBidXQgc3RpbGwgbWlnaHQgYWZmZWN0IHBlcmZvcm1hbmNlCisgICBpbiBzbWFsbCB3YXlzIHNpbmNlIGl0IGNhbiByZXN1bHQgaW4gZGlmZmVyZW50IHBhdGhzIHRocm91Z2ggdGhlIGNvZGUuCisKKyAgIFRoZSBkZWZpbml0aW9uIG9mICJyZWxpYWJsZSB0cmFuc3BvcnQiIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGRlbWFuZAorICAgOC1iaXQgYW5kIGNvbnRyb2wtY2hhcmFjdGVyIHRyYW5zcGFyZW5jeS4gU3RyZWFtaW5nIGNhbiB3b3JrIHdpdGgKKyAgIHBhcml0eSBhbmQvb3IgY29udHJvbC1jaGFyYWN0ZXIgcHJlZml4aW5nIGp1c3QgYXMgd2VsbCAoYnV0IG5vdCBhcworICAgZmFzdCkgYXMgd2l0aG91dCB0aGVtOyBpbiBzdWNoIGNhc2VzIHlvdSBjYW4gbGVhdmUgUkVMSUFCTEUgc2V0IHRvIE9OLAorICAgYnV0IHNldCBDTEVBUkNIQU5ORUwgYW5kL29yIFBBUklUWSBhcHByb3ByaWF0ZWx5LgorCisgICBNYXhpbXVtIHBlcmZvcm1hbmNlIC0tIGNvbXBhcmFibGUgdG8gYW5kIG9mdGVuIGV4Y2VlZGluZyBGVFAgLS0gaXMKKyAgIGFjaGlldmVkIG9uIHNvY2tldC10by1zb2NrZXQgY29ubmVjdGlvbnMgKGluIHdoaWNoIHRoZSBjb25zaWRlcmFibGUKKyAgIG92ZXJoZWFkIG9mIHRoZSB0ZXJtaW5hbCBkcml2ZXIgYW5kIFRlbG5ldCBvciBSbG9naW4gc2VydmVyIGlzCisgICBlbGltaW5hdGVkKSB3aXRoIGxvbmcgcGFja2V0cyBhbmQgdGhlIG5ldyAiYnJpZWYiIGZpbGUtdHJhbnNmZXIKKyAgIGRpc3BsYXkgKFs1MjFdU2VjdGlvbiA0LjE2KS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMjAuMS4gQ29tbWFuZHMgZm9yIFN0cmVhbWluZworCisgICBTRVQgUkVMSUFCTEUgeyBPTiwgT0ZGLCBBVVRPIH0KKyAgICAgICAgICBTRVQgUkVMSUFCTEUgT04gdGVsbHMgS2VybWl0IHRoYXQgaXQgaGFzIGEgcmVsaWFibGUgdHJhbnNwb3J0LgorICAgICAgICAgIFNFVCBSRUxJQUJMRSBPRkYgdGVsbHMgS2VybWl0IHRoZSB0cmFuc3BvcnQgaXMgbm90IHJlbGlhYmxlLgorICAgICAgICAgIFNFVCBSRUxJQUJMRSBBVVRPIHRlbGxzIEtlcm1pdCB0aGF0IGl0IHNob3VsZCBTRVQgUkVMSUFCTEUgT04KKyAgICAgICAgICB3aGVuZXZlciBpdCBtYWtlcyBhIHJlbGlhYmxlIGNvbm5lY3Rpb24gKGUuZy4gVEVMTkVUIG9yIFNFVAorICAgICAgICAgIEhPU1Qgb24gYSBUQ1AvSVAgb3IgWC4yNSBuZXR3b3JrKSwgYW5kIHdoZW4gaW4gcmVtb3RlIG1vZGUgaXQKKyAgICAgICAgICBzaG91bGQgYmVsaWV2ZSB0aGUgdHJhbnNwb3J0IGlzIHJlbGlhYmxlIGlmIHRoZSBvdGhlciBLZXJtaXQKKyAgICAgICAgICBzYXlzIGl0IGlzIGR1cmluZyBLZXJtaXQgcHJvdG9jb2wgbmVnb3RpYXRpb24uCisKKyAgIEFVVE8gaXMgdGhlIGRlZmF1bHQ7IHRoZSBLZXJtaXQgcHJvZ3JhbSB0aGF0IG1ha2VzIHRoZSBjb25uZWN0aW9uCisgICBrbm93cyB3aGV0aGVyIGl0IGlzIHJlbGlhYmxlLCBhbmQgdGVsbHMgdGhlIHJlbW90ZSBLZXJtaXQuCisKKyAgIFRoZSBSRUxJQUJMRSBzZXR0aW5nIGhhcyBzZXZlcmFsIGVmZmVjdHMsIGluY2x1ZGluZzoKKworICAgICAqIEl0IGNhbiBhZmZlY3QgdGhlIHRpbWVvdXRzIHVzZWQgZHVyaW5nIG5vcm1hbCBBQ0svTkFLIHByb3RvY29sLgorICAgICAqIEl0IGNhbiBhZmZlY3QgdGhlIGNsZWFyLWNoYW5uZWwgYW5ub3VuY2VtZW50LgorICAgICAqIEl0IGNhbiBhZmZlY3Qgc3RyZWFtaW5nLgorCisgICBJZiB5b3UgVEVMTkVUIG9yIFNFVCBIT1NUIHNvbWV3aGVyZSwgdGhpcyBpbmNsdWRlcyBhbiBpbXBsaWNpdCBTRVQKKyAgIFJFTElBQkxFIE9OIGNvbW1hbmQuIFRoZSAtSSBjb21tYW5kLWxpbmUgb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8gU0VUCisgICBSRUxJQUJMRSBPTi4KKworICAgU2luY2UgU0VUIFJFTElBQkxFIE9OIChhbmQgLUkpIGFsc28gaW1wbGllcyBTRVQgQ0xFQVIgQ0hBTk5FTCBPTiwgeW91CisgICBtaWdodCBmaW5kIHRoYXQgaW4gY2VydGFpbiBjYXNlcyB5b3UgbmVlZCB0byB0ZWxsIEtlcm1pdCB0aGF0IGV2ZW4KKyAgIHRob3VnaCB0aGUgY29ubmVjdGlvbiBpcyByZWxpYWJsZSwgaXQgZG9lc24ndCBoYXZlIGEgY2xlYXIgY2hhbm5lbAorICAgYWZ0ZXIgYWxsOgorCisgIFNFVCBDTEVBUi1DSEFOTkVMIE9GRgorICBTRVQgUFJFRklYSU5HIENBVVRJT1VTIDsgb3Igd2hhdGV2ZXIuLi4KKworICAgWW91IGNhbiBjb250cm9sIHN0cmVhbWluZyB3aXRob3V0IGFmZmVjdGluZyB0aGUgb3RoZXIgaXRlbXMgd2l0aDoKKworICBTRVQgU1RSRUFNSU5HIHsgT04sIE9GRiwgQVVUTyB9CisKKyAgIEFVVE8gaXMgdGhlIGRlZmF1bHQsIG1lYW5pbmcgc3RyZWFtaW5nIHdpbGwgb2NjdXIgaWYgS2VybWl0IGhhcyBtYWRlIGEKKyAgIFRDUC9JUCBjb25uZWN0aW9uIG9yIGlmIFJFTElBQkxFIGlzIE9OIChvciBpdCB3YXMgc3RhcnRlZCB3aXRoIHRoZSAtSQorICAgY29tbWFuZCBsaW5lIG9wdGlvbikuIE9GRiBtZWFucyBkb24ndCBzdHJlYW07IE9OIG1lYW5zIG9mZmVyIHRvIHN0cmVhbQorICAgbm8gbWF0dGVyIHdoYXQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjIwLjIuIEV4YW1wbGVzIG9mIFN0cmVhbWluZworCisgICBIZXJlIHdlIGxvb2sgYXQgdGhlIHVzZSBhbmQgYmVoYXZpb3Igb2Ygc3RyZWFtaW5nIG9uIHNldmVyYWwgZGlmZmVyZW50CisgICBraW5kcyBvZiBjb25uZWN0aW9ucywgYW5kIGNvbXBhcmUgaXRzIHBlcmZvcm1hbmNlIHdpdGggbm9uLXN0cmVhbWluZworICAgdHJhbnNmZXJzLgorCisgICAgNC4yMC4yLjEuIFN0cmVhbWluZyBvbiBTb2NrZXQtdG8tU29ja2V0IENvbm5lY3Rpb25zCisKKyAgIEhlcmUgd2UgZ2V0IHN0cmVhbWluZyBhdXRvbWF0aWNhbGx5IHdoZW4gYm90aCBLZXJtaXQgcHJvZ3JhbXMgYXJlCisgICBjYXBhYmxlIG9mIGl0LCBzaW5jZSB0aGV5IGJvdGggbWFrZSBzb2NrZXQgY29ubmVjdGlvbnMuIEZvciBleGFtcGxlLAorICAgb24gdGhlIGZhciBlbmQ6CisKKyAgQy1LZXJtaXQ+IHNldCBob3N0ICogMzAwMAorICBDLUtlcm1pdD4gc2VydmVyCisKKyAgIGFuZCBvbiB0aGUgbmVhciBlbmQ6CisKKyAgQy1LZXJtaXQ+IHNldCBob3N0IGZvby5iYXIueHl6LmNvbSAzMDAwCisgIChub3cgZ2l2ZSBTRU5EIGFuZCBHRVQgY29tbWFuZCkKKworICAgQWxsIHN1YnNlcXVlbnQgZmlsZSB0cmFuc2ZlcnMgdXNlIHN0cmVhbWluZyBhdXRvbWF0aWNhbGx5LgorCisgICBIZXJlIGFyZSB0aGUgcmVzdWx0cyBmcm9tIDg0IHRyaWFscywgcnVuIG9uIGEgcHJvZHVjdGlvbiBuZXR3b3JrLAorICAgZGlzay10by1kaXNrLCBpbiB3aGljaCBhIDEtTUIgYmluYXJ5IGZpbGUgKHRoZSBTdW5PUyBDLUtlcm1pdCBTcGFyYworICAgZXhlY3V0YWJsZSkgd2FzIHNlbnQgZnJvbSBhIFN1biBTcGFyYy0xMCB3aXRoIFN1bk9TIDQuMS4zIHRvIGFuIElCTQorICAgUG93ZXIgU2VydmVyIDg1MCB3aXRoIEFJWCA0LjEsIHNvY2tldC10by1zb2NrZXQsIG92ZXIgYSAxME1icHMgMTBCYXNlVAorICAgRXRoZXJuZXQsIHVzaW5nIG1pbmltYWwgY29udHJvbC1jaGFyYWN0ZXIgdW5wcmVmaXhpbmcsIHdpbmRvdyBzaXplcworICAgZnJvbSAxMCB0byAzMiwgYW5kIHBhY2tldCBzaXplcyBmcm9tIDE0NTAgdG8gOTAxMDoKKworICAgICAgICAgICAgICAgIFN0cmVhbWluZyAgICBOb25zdHJlYW1pbmcKKyAgTWF4IENQUyAgICAgICAgIDc0ODk1NSAgICAgICAgNjgzMzU0CisgIE1pbiBDUFMgICAgICAgICAyMjE1MjIgICAgICAgIDE3MjQ5MQorICBNZWFuIENQUyAgICAgICAgNjQ2MTM0ICAgICAgICA1NTg2ODAKKyAgTWVkaWFuIENQUyAgICAgIDY3ODA0MyAgICAgICAgNTk1ODc0CisgIFN0ZCBEZXYgICAgICAgICAxMDE0MjQgICAgICAgIDExMTQ5MworCisgICBDb3JyZWxhdGlvbnM6CisKKyAgQ1BTIGFuZCB3aW5kb3cgc2l6ZTogICAtMC4wMzYKKyAgQ1BTIGFuZCBwYWNrZXQgbGVuZ3RoOiAgMC4yNTQKKyAgQ1BTIGFuZCBzdHJlYW1pbmc6ICAgICAgMC4zODIKKworICAgTm90ZSB0aGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzdHJlYW1pbmcgYW5kIHRocm91Z2hwdXQgaXMKKyAgIHNpZ25pZmljYW50bHkgc3Ryb25nZXIgdGhhbiB0aGF0IGJldHdlZW4gQ1BTIGFuZCB3aW5kb3cgc2l6ZSBvciBwYWNrZXQKKyAgIGxlbmd0aC4KKworICAgQWxzbyBub3RlIHRoYXQgdGhpcyBhbmQgYWxsIG90aGVyIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cyBpbiB0aGlzCisgICBzZWN0aW9uIGFyZSBzbmFwc2hvdHMgaW4gdGltZTsgdGhlIHJlc3VsdHMgY291bGQgYmUgbXVjaCBkaWZmZXJlbnQgYXQKKyAgIG90aGVyIHRpbWVzIHdoZW4gdGhlIGxvYWQgb24gdGhlIHN5c3RlbXMgYW5kL29yIHRoZSBuZXR3b3JrIGlzIGhpZ2hlcgorICAgb3IgbG93ZXIuCisKKyAgIEluIGEgc2ltaWxhciBzb2NrZXQtdG8tc29ja2V0IHRyaWFsLCBidXQgdGhpcyB0aW1lIG92ZXIgYSB3aWRlLWFyZWEKKyAgIFRDUC9JUCBjb25uZWN0aW9uIChmcm9tIE5ldyBZb3JrIENpdHkgdG8gTG9nYW4sIFV0YWgsIGFib3V0IDIwMDAKKyAgIG1pbGVzKSwgdGhlIGZvbGxvd2luZyByZXN1bHRzIHdlcmUgb2J0YWluZWQ6CisKKyAgICAgICAgICAgICAgICBTdHJlYW1pbmcgICAgTm9uc3RyZWFtaW5nCisgIE1heCBDUFMgICAgICAgICAzMzgyMjYgICAgICAgIDMxODIwMworICBNaW4gQ1BTICAgICAgICAgMTkxNjU5ICAgICAgICAxMzIzMTQKKyAgTWVhbiBDUFMgICAgICAgIDI5Mzc0NCAgICAgICAgMjU5MjQwCisgIE1lZGlhbiBDUFMgICAgICAzMDA4NDUgICAgICAgIDI3MzI3MQorICBTdGQgRGV2ICAgICAgICAgIDQxOTE0ICAgICAgICAgNTIzNTEKKworICAgQ29ycmVsYXRpb25zOgorCisgIENQUyBhbmQgd2luZG93IHNpemU6ICAgIDAuMTY0CisgIENQUyBhbmQgcGFja2V0IGxlbmd0aDogIDAuMTIzCisgIENQUyBhbmQgc3RyZWFtaW5nOiAgICAgIDAuMzQ2CisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjIwLjIuMi4gU3RyZWFtaW5nIG9uIFRlbG5ldCBDb25uZWN0aW9ucworCisgICBJbiB0aGlzIGNhc2UgdGhlIGxvY2FsIGNvcHkgb2YgS2VybWl0IGlzIHRvbGQgdG8gVEVMTkVUIG9yIFNFVCBIT1NULAorICAgYW5kIHNvIGl0IGtub3dzIGl0IGhhcyBhIHJlbGlhYmxlIGNvbm5lY3Rpb24gYW5kIC0tIHVubGVzcyBpdCBoYXMgYmVlbgorICAgdG9sZCBub3QgdG8gLS0gd2lsbCBvZmZlciB0byBzdHJlYW0sIGFuZCB0aGUgb3RoZXIgS2VybWl0IHByb2dyYW0sCisgICBzaW5jZSBpdCBoYXMgU1RSRUFNSU5HIHNldCB0byBBVVRPLCBhZ3JlZXMuCisKKyAgIFNpbmNlIHdlIGhhdmUgYSByZWxpYWJsZSBjb25uZWN0aW9uLCB3ZSdsbCBhbHNvIGdldCBjb250cm9sLWNoYXJhY3RlcgorICAgdW5wcmVmaXhpbmcgYXV0b21hdGljYWxseSBiZWNhdXNlIG9mIHRoZSBuZXcgY2xlYXItY2hhbm5lbCBwcm90b2NvbAorICAgKFs1MjJdU2VjdGlvbiA0LjE5KS4KKworICAgQW55IGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBzdHJlYW1pbmcgYXJlIGZhdGFsIHRvIHRoZSB0cmFuc2Zlci4gVGhlCisgICBtZXNzYWdlIGlzICJUcmFuc21pc3Npb24gZXJyb3Igb24gcmVsaWFibGUgbGluayIuIFNob3VsZCB0aGlzIGhhcHBlbjoKKworICAgIDEuIENoZWNrIHRoZSByZW1vdGUgS2VybWl0J3MgZmxvdyBjb250cm9sIHNldHRpbmcgKFNIT1cKKyAgICAgICBDT01NVU5JQ0FUSU9OUykuIElmIGl0IGlzIE5PTkUsIGNoYW5nZSBpdCB0byBYT04vWE9GRiwgb3IgdmljZQorICAgICAgIHZlcnNhLiBJZiBpdCBpcyBYT04vWE9GRiAob3IgeW91IGp1c3QgY2hhbmdlZCBpdCB0byBYT0ZGL1hPRkYpLAorICAgICAgIG1ha2Ugc3VyZSB0aGUgZmlsZSBzZW5kZXIgaXMgcHJlZml4aW5nIHRoZSBYT04gYW5kIFhPRkYKKyAgICAgICBjaGFyYWN0ZXJzLiBJbiB0aGUgbW9zdCBkcmFzdGljIGNhc2UsIHVzZSAic2V0IHByZWZpeCBhbGwiIHRvCisgICAgICAgZm9yY2UgcHJlZml4aW5nIG9mIGFsbCBjb250cm9sIGNoYXJhY3RlcnMuCisgICAgMi4gVGhlIHJlbW90ZSBUZWxuZXQgc2VydmVyIG1pZ2h0IGNob3Agb2ZmIHRoZSA4dGggYml0LiBJbiB0aGF0IGNhc2UsCisgICAgICAgdGVsbCBDLUtlcm1pdCB0byAic2V0IHBhcml0eSBzcGFjZSIuIE9yLCB5b3UgbWlnaHQgYmUgYWJsZSB0bworICAgICAgIGZvcmNlIHRoZSBUZWxuZXQgdG8gYWxsb3cgZWlnaHQtYml0IGRhdGEgYnkgdGVsbGluZyBDLUtlcm1pdCB0bworICAgICAgICJzZXQgdGVsb3B0IGJpbmFyeSByZXF1ZXN0IGFjY2VwdCIgLS0gdGhhdCBpcywgcmVxdWVzdCB0aGUgVGVsbmV0CisgICAgICAgc2VydmVyIHRvIGVudGVyIGJpbmFyeSBtb2RlLCBhbmQgYWNjZXB0IGJpbmFyeS1tb2RlIGJpZHMgZnJvbSB0aGUKKyAgICAgICBzZXJ2ZXIuCisgICAgMy4gVGhlIHJlbW90ZSBUZWxuZXQgc2VydmVyIG1pZ2h0IGhhdmUgYSBidWZmZXJpbmcgbGltaXRhdGlvbi4gSWYgYQorICAgICAgIGFuZCBiIGRvbid0IGN1cmUgdGhlIHByb2JsZW0sIHRlbGwgdGhlIGZpbGUgcmVjZWl2ZXIgdG8gInNldAorICAgICAgIHJlY2VpdmUgcGFja2V0LWxlbmd0aCAxMDAwIiAob3Igb3RoZXIgbnVtYmVyIC0tIHVzZSB0aGUgbGFyZ2VzdAorICAgICAgIG9uZSB0aGF0IHdvcmtzKS4gVGhpcyB0b28sIGlzIG5vIGRpZmZlcmVudCBmcm9tIHRoZSBub24tc3RyZWFtaW5nCisgICAgICAgY2FzZSAobW9yZSBhYm91dCB0aGlzIGluIFs1MjNdU2VjdGlvbiA0LjIwLjIuMykuCisKKyAgIEFuZCByZW1lbWJlciB5b3UgY2FuIGNvbnRpbnVlIGludGVycnVwdGVkIGJpbmFyeS1tb2RlIHRyYW5zZmVycyB3aGVyZQorICAgdGhleSBsZWZ0IG9mZiB3aXRoIHRoZSBSRVNFTkQgKD0gU0VORCAvUkVDT1ZFUikgY29tbWFuZC4KKworICAgSGVyZSBhcmUgdGhlIGZpZ3VyZXMgZm9yIHRoZSBzYW1lIDg0IHRyaWFscyBiZXR3ZWVuIHRoZSBzYW1lIFN1biBhbmQKKyAgIElCTSBob3N0cyBhcyBpbiA0LjIwLjIuMSwgb24gdGhlIHNhbWUgbmV0d29yaywgYnV0IG92ZXIgYSBUZWxuZXQKKyAgIGNvbm5lY3Rpb24gcmF0aGVyIHRoYW4gc29ja2V0LXRvLXNvY2tldDoKKworICAgICAgICAgICAgICAgICAgU3RyZWFtaW5nICAgIE5vbnN0cmVhbWluZworICBNYXggQ1BTICAgICAgICAgMzUwMDg4ICAgICAgICAzMjI1MjMKKyAgTWluIENQUyAgICAgICAgICA5NTU0NyAgICAgICAgMTczMTUyCisgIE1lYW4gQ1BTICAgICAgICAzMjEzNzIgICAgICAgIDI4MTgzMAorICBNZWRpYW4gQ1BTICAgICAgMzQyNjA0ICAgICAgICAyOTE0NjkKKyAgU3RkIERldiAgICAgICAgICA0MDUwMyAgICAgICAgIDI5OTQ4CisKKyAgIENvcnJlbGF0aW9uczoKKworICBDUFMgYW5kIHdpbmRvdyBzaXplOiAgICAwLjAwMQorICBDUFMgYW5kIHBhY2tldCBsZW5ndGg6ICAwLjE1MgorICBDUFMgYW5kIHN0cmVhbWluZzogICAgICAwLjEyOAorCisgICBIZXJlIHRoZSBlZmZlY3QgaXMgbm90IGFzIGVtcGhhdGljIGFzIGluIHRoZSBzb2NrZXQtdG8tc29ja2V0IGNhc2UsCisgICB5ZXQgb24gdGhlIHdob2xlIHN0cmVhbWluZyB0ZW5kcyB0byBiZSBiZW5lZmljaWFsLgorCisgICBBZGRpdGlvbmFsIG1lYXN1cmVtZW50cyBvbiBIUC1VWCB1c2luZyBDLUtlcm1pdCA3LjAgQmV0YS4wNjoKKworICAgICAgICAgICAgICAgICAgV2luZG93aW5nICAgICBTdHJlYW1pbmcKKyAgSFAtVVggOC0+OCAgICAgIG5vdCB0ZXN0ZWQgICAgICAgMTRLY3BzCisgIEhQLVVYIDgtPjkgICAgICBub3QgdGVzdGVkICAgICAgIDc2S2NwcworICBIUC1VWCA4LT4xMCAgICAgIDM2S2NwcyAgICAgICAgICA2NktjcHMKKyAgSFAtVVggOS0+OSAgICAgIG5vdCB0ZXN0ZWQgICAgICAxOTBLY3BzCisgIEhQLVVYIDktPjEwICAgICAxNjBLY3BzICAgICAgICAgMzc4S2NwcworICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4yMC4yLjMuIFN0cmVhbWluZyB3aXRoIExpbWl0ZWQgUGFja2V0IExlbmd0aAorCisgICBUaGUgSVJJWCB0ZWxuZXQgc2VydmVyIChhdCBsZWFzdCB0aGUgb25lcyBvYnNlcnZlZCBpbiBJUklYIDUuMyBhbmQKKyAgIDYuMikgZG9lcyBub3QgYWxsb3cgS2VybWl0IHRvIHNlbmQgcGFja2V0cyBsb25nZXIgdGhhbiA0MDk2IGJ5dGVzLgorICAgVGh1cyB3aGVuIHNlbmRpbmcgZnJvbSBJUklYIEMtS2VybWl0IHdoZW4gaXQgaXMgb24gdGhlIHJlbW90ZSBlbmQgb2YgYQorICAgVGVsbmV0IGNvbm5lY3Rpb24sIHRoZSBwYWNrZXQgbGVuZ3RoIG11c3QgYmUgNEsgb3IgbGVzcy4gVHJpYWxzIGluCisgICB0aGlzIGNhc2UgKGluIHdoaWNoIHBhY2tldCBsZW5ndGhzIHJhbmdlIGZyb20gMTQ1MCB0byA0MDAwKSBzaG93IGEKKyAgIHN0cm9uZyBhZHZhbnRhZ2UgZm9yIHN0cmVhbWluZywgd2hpY2ggd291bGQgYmUgZXZpZGVudCBpbiBhbnkgb3RoZXIKKyAgIGNhc2Ugd2hlcmUgdGhlIHBhY2tldCBsZW5ndGggaXMgcmVzdHJpY3RlZCwgYW5kIHN0cm9uZ2VyIHRoZSBzaG9ydGVyCisgICB0aGUgbWF4aW11bSBwYWNrZXQgbGVuZ3RoLgorCisgICAgICAgICAgICAgICAgICBTdHJlYW1pbmcgICAgTm9uc3RyZWFtaW5nCisgIE1heCBDUFMgICAgICAgICA0MjYxODcgICAgICAgIDM2Njg3MAorICBNaW4gQ1BTICAgICAgICAgNDA3NTAwICAgICAgICAyNzY1MTcKKyAgTWVhbiBDUFMgICAgICAgIDQxNTIyNiAgICAgICAgMzM5MTY4CisgIE1lZGlhbiBDUFMgICAgICA0MTQxMzkgICAgICAgIDM0MzgwMworICBTdGQgRGV2ICAgICAgICAgICA2MDk0ICAgICAgICAgMjU4NTEKKworICAgQ29ycmVsYXRpb25zOgorCisgIENQUyBhbmQgd2luZG93IHNpemU6ICAgIDAuMTE2CisgIENQUyBhbmQgcGFja2V0IGxlbmd0aDogIDAuMjQxCisgIENQUyBhbmQgc3RyZWFtaW5nOiAgICAgIDAuOTAxCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjIwLjIuNC4gU3RyZWFtaW5nIG9uIERpYWx1cCBDb25uZWN0aW9ucworCisgICBIZXJlICJkaWFsdXAiIHJlZmVycyB0byBhICJkaXJlY3QiIGRpYWx1cCBjb25uZWN0aW9uLCBub3QgYSBTTElQIG9yCisgICBQUFAgY29ubmVjdGlvbiwgd2hpY2ggaXMgb25seSBhIHBhcnRpY3VsYXIga2luZCBvZiBUQ1AvSVAgY29ubmVjdGlvbi4KKworICAgQXR0ZW1wdCB0aGlzIGF0IHlvdXIgb3duIHJpc2ssIGFuZCB0aGVuIG9ubHkgaWYgKGEpIHlvdSBoYXZlCisgICBlcnJvci1jb3JyZWN0aW5nIG1vZGVtcywgYW5kIChiKSB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiB0aGUgbW9kZW1zCisgICBhbmQgY29tcHV0ZXJzIGFyZSBhbHNvIGVycm9yLWZyZWUsIHBlcmZlY3RseSBmbG93LWNvbnRyb2xsZWQsIGFuZCBmcmVlCisgICBvZiBpbnRlcnJ1cHQgY29uZmxpY3RzLiBTdHJlYW1pbmcgY2FuIGJlIHVzZWQgZWZmZWN0aXZlbHkgYW5kIHRvCisgICBmYWlybHkgZ29vZCBhZHZhbnRhZ2Ugb24gc3VjaCBjb25uZWN0aW9ucywgYnV0IHJlbWVtYmVyIHRoYXQgdGhlCisgICB0cmFuc2ZlciBpcyBmYXRhbCBpZiBldmVuIG9uZSBlcnJvciBpcyBkZXRlY3RlZCAoYWxzbyByZW1lbWJlciB0aGF0CisgICBzaG91bGQgYSBiaW5hcnktbW9kZSB0cmFuc2ZlciBmYWlsLCBpdCBjYW4gYmUgcmVjb3ZlcmVkIGZyb20gdGhlIHBvaW50CisgICBvZiBmYWlsdXJlIHdpdGggUkVTRU5EKS4KKworICAgVG8gdXNlIHN0cmVhbWluZyBvbiBhbiB1bnJlbGlhYmxlIGNvbm5lY3Rpb24sIHlvdSBtdXN0IHRlbGwgYm90aAorICAgS2VybWl0cyB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIHJlbGlhYmxlOgorCisgIGtlcm1pdCAtSQorCisgICBvcjoKKworICBDLUtlcm1pdD4gc2V0IHJlbGlhYmxlIG9uCisKKyAgIEluIHRoaXMgY2FzZSwgaXQgd2lsbCBwcm9iYWJseSBiZSBuZWNlc3NhcnkgdG8gcHJlZml4IHNvbWUgY29udHJvbAorICAgY2hhcmFjdGVycywgZm9yIGV4YW1wbGUgaWYgeW91ciBjb25uZWN0aW9uIGlzIHRocm91Z2ggYSB0ZXJtaW5hbAorICAgc2VydmVyIHRoYXQgaGFzIGFuIGVzY2FwZSBjaGFyYWN0ZXIuIE1vc3QgQ2lzY28gdGVybWluYWwgc2VydmVycywgZm9yCisgICBleGFtcGxlLCByZXF1aXJlIEN0cmwtXiAoMzAsIGFzIHdlbGwgYXMgaXRzIGhpZ2gtYml0IGVxdWl2YWxlbnQsIDE1OCkKKyAgIHRvIGJlIHByZWZpeGVkLiBUbyB1bnByZWZpeCB0aGVzZSwgeW91J2xsIG5lZWQgdG8gZGVmZWF0IHRoZSAiY2xlYXIKKyAgIGNoYW5uZWwiIGZlYXR1cmU6CisKKyAgQy1LZXJtaXQ+IHNldCByZWxpYWJsZSBvbgorICBDLUtlcm1pdD4gc2V0IGNsZWFyLWNoYW5uZWwgb2ZmCisgIEMtS2VybWl0PiBzZXQgcHJlZml4aW5nIG5vbmUKKyAgQy1LZXJtaXQ+IHNldCBjb250cm9sIHByZWZpeCAxIDEzIDMwIDE1OCA7IGFuZCB3aGF0ZXZlciBlbHNlIGlzIG5lY2Vzc2FyeQorCisgICBEaWFsdXAgdHJpYWxzIHdlcmUgZG9uZSB1c2luZyBmaXhlZCBsYXJnZSB3aW5kb3cgYW5kIHBhY2tldCBzaXplcy4KKyAgIFRoZXkgY29tcGFyZSB1cGxvYWRpbmcgYW5kIGRvd25sb2FkaW5nIG9mIHR3byBjb21tb24gdHlwZXMgb2YgZmlsZXMsCisgICB3aXRoIGFuZCB3aXRob3V0IHN0cmVhbWluZy4gQ29uZmlndXJhdGlvbjoKKworICAgICBIUC05MDAwLzcxNS8zMyAtLSA1NzYwMGJwcywgUlRTL0NUUyAtLSBVU1IgQ291cmllciBWLjM0IC0tCisgICAgIFYuMzQrVi40MiwgMzEyMDBicHMgLS0gVVNSIFYuMzQrIFJhY2ttb3VudCAtLSA1NzYwMGJwcywgUlRTL0NUUyAtLQorICAgICBDaXNjbyB0ZXJtaW5hbCBzZXJ2ZXIgLS0gU29sYXJpcyAyLjUuMS4gUGFja2V0IHNpemUgPSA4MDAwLCBXaW5kb3cKKyAgICAgU2l6ZSA9IDMwLCBDb250cm9sIENoYXJhY3RlciBVbnByZWZpeGluZyBNaW5pbWFsIChidXQgaW5jbHVkaW5nIHRoZQorICAgICBDaXNjbyBlc2NhcGUgY2hhcmFjdGVyKS4KKworICAgU2luY2UgdGhpcyBpcyBub3QgYSB0cnVseSByZWxpYWJsZSBjb25uZWN0aW9uLCBhIGZldyB0cmlhbHMgZmFpbGVkCisgICB3aGVuIGEgYmFkIHBhY2tldCB3YXMgcmVjZWl2ZWQgKG1vc3QgbGlrZWx5IGR1ZSB0byBVQVJUIG92ZXJydW5zKTsgdGhlCisgICBmYWlsdXJlIHdhcyBncmFjZWZ1bCBhbmQgaW1tZWRpYXRlLCBhbmQgdGhlIG1lc3NhZ2Ugd2FzIGluZm9ybWF0aXZlLgorICAgVGhlIHJlc3VsdHMgb2YgdGVuIHN1Y2Nlc3NmdWwgdHJpYWxzIHVwbG9hZGluZyBhbmQgZG93bmxvYWRpbmcgdGhlIHR3bworICAgZmlsZXMgd2l0aCBhbmQgd2l0aG91dCBzdHJlYW1pbmcgYXJlOgorCisgICAgICAgICAgICBTdHJlYW1pbmcuLgorICAgICAgICAgICAgT2ZmICAgIE9uCisgICBVcGxvYWQgICA1MTk0ICAgNTU2NSAgIHR4dCAoPSBDIHNvdXJjZSBjb2RlLCA3OEspCisgICAgICAgICAgICAzMTM1ICAgMzQwNiAgIGd6ICAoPSBnemlwIGZpbGUsIGNvbXByZXNzZWQsIDg1SykKKyBEb3dubG9hZCAgIDUxOTQgICA1NTY1ICAgdHh0CisgICAgICAgICAgICAzMDQxICAgMzQwNiAgIGd6CisKKyAgIEVhY2ggQ1BTIGZpZ3VyZSBpcyB0aGUgbWVhbiBvZiAxMCByZXN1bHRzLgorCisgICBBIGJyaWVmIHRlc3Qgd2FzIGFsc28gcGVyZm9ybWVkIG9uIGEgTEFULWJhc2VkIGRpYWxvdXQgY29ubmVjdGlvbiBmcm9tCisgICBhIFZBWCAzMTAwIHdpdGggVk1TIDUuNSB0byBhIFVTUiBDb3VyaWVyIFYuMzQgY29ubmVjdGVkIHRvIGEgREVDc2VydmVyCisgICA3MDAgYXQgMTkyMDAgYnBzLiBUaGUgMS1NQiBTcGFyYyBleGVjdXRhYmxlIGRvd25sb2FkZWQgZnJvbSBhIFN1biB0bworICAgdGhlIFZBWCBhdCAxMTAwY3BzIHdpdGhvdXQgc3RyZWFtaW5nIGFuZCAxOTAwY3BzIHdpdGggc3RyZWFtaW5nLCB1c2luZworICAgODAwMC1ieXRlIHBhY2tldHMsIDMwIHdpbmRvdyBzbG90cywgYW5kIG1pbmltYWwgcHJlZml4aW5nIGluIGJvdGgKKyAgIGNhc2VzLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4yMC4yLjUuIFN0cmVhbWluZyBvbiBYLjI1IENvbm5lY3Rpb25zCisKKyAgIFdlIGhhdmUgb25seSBsaW1pdGVkIGFjY2VzcyB0byBYLjI1IG5ldHdvcmtzLiBPbmUgdHJpYWwgd2FzIHBlcmZvcm1lZAorICAgaW4gd2hpY2ggdGhlIDFNQiBTb2xhcmlzIDIuNCBTcGFyYyBleGVjdXRhYmxlIHdhcyB0cmFuc2ZlcnJlZCBvdmVyIGEKKyAgIFN1bkxpbmsgWC4yNSBjb25uZWN0aW9uOyBub3RoaW5nIGlzIGtub3duIGFib3V0IHRoZSBhY3R1YWwgcGh5c2ljYWwKKyAgIGNvbm5lY3Rpb24uIFdpdGggYSBwYWNrZXQgbGVuZ3RoIG9mIDgwMDAgYW5kIGEgd2luZG93IHNpemUgb2YgMzAsIHRoZQorICAgZmlsZSB0cmFuc2ZlcnJlZCBhdCA2NDAwIGNwcyAodXNpbmcgYSBtYXhpbXVtIG9mIDYgd2luZG93IHNsb3RzKS4gV2l0aAorICAgdGhlIHNhbWUgcGFja2V0IGxlbmd0aCwgYnV0IHdpdGggc3RyZWFtaW5nLCBpdCB0cmFuc2ZlcnJlZCB3aXRob3V0CisgICBtaXNoYXAgYXQgNjcxMCBjcHMsIGFib3V0IDUlIGZhc3Rlci4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMjAuMy4gU3RyZWFtaW5nIC0gUHJlbGltaW5hcnkgQ29uY2x1c2lvbnMKKworICAgVGhlIHJlc3VsdHMgdmFyeSB3aXRoIHRoZSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24sIGJ1dCBhcmUgZ29vZCBvdmVyYWxsLgorICAgQWx0aG91Z2ggbnVtZXJvdXMgbG93ZXItbGV2ZWwgdHJpY2tzIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUKKyAgIHBlcmZvcm1hbmNlIG9uIHNwZWNpZmljIHBsYXRmb3JtcyBvciBjb25uZWN0aW9uIG1ldGhvZHMsIHN0cmVhbWluZworICAgb2NjdXJzIGF0IGEgaGlnaCwgc3lzdGVtLWluZGVwZW5kZW50IGxldmVsIG9mIHRoZSBLZXJtaXQgcHJvdG9jb2wgYW5kCisgICB0aGVyZWZvcmUgY2FuIGFwcGx5IHRvIGFsbCB0eXBlcyBvZiBwbGF0Zm9ybXMgYW5kIChyZWxpYWJsZSkKKyAgIGNvbm5lY3Rpb25zIHRyYW5zcGFyZW50bHkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC4yMS4gVGhlIFRSQU5TTUlUIENvbW1hbmQKKworICAgUHJpb3IgdG8gQy1LZXJtaXQgNy4wLCB0aGUgVFJBTlNNSVQgY29tbWFuZCB0cmFuc21pdHRlZCBpbiB0ZXh0IG9yCisgICBiaW5hcnkgbW9kZSBhY2NvcmRpbmcgdG8gU0VUIEZJTEUgVFlQRSB7IFRFWFQsIEJJTkFSWSB9LiBCdXQgbm93IHRoYXQKKyAgIGJpbmFyeSBtb2RlIGlzIGxpa2VseSB0byBiZSB0aGUgZGVmYXVsdCBmb3IgcHJvdG9jb2wgdHJhbnNmZXJzLCBpdCBpcworICAgZXZpZGVudCB0aGF0IHRoaXMgbm90IGFsc28gYW4gYXBwcm9wcmlhdGUgZGVmYXVsdCBmb3IgVFJBTlNNSVQsIHNpbmNlCisgICBiaW5hcnktbW9kZSBUUkFOU01JVCBpcyBhIHJhdGhlciBzcGVjaWFsaXplZCBhbmQgdHJpY2t5IG9wZXJhdGlvbi4KKyAgIFRoZXJlZm9yZSwgVFJBTlNNSVQgZGVmYXVsdHMgdG8gdGV4dCBtb2RlIGFsd2F5cywgcmVnYXJkbGVzcyBvZiB0aGUKKyAgIEZJTEUgVFlQRSBzZXR0aW5nLgorCisgICBDLUtlcm1pdCA3LjAgZXhwYW5kcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBUUkFOU01JVCBjb21tYW5kIGJ5CisgICBhZGRpbmcgdGhlIGZvbGxvd2luZyBzd2l0Y2hlcyAoc2VlIFs1MjRdU2VjdGlvbiAxLjUpLiBUaGUgbmV3IHN5bnRheAorICAgaXM6CisKKyAgVFJBTlNNSVQgWyBzd2l0Y2hlcy4uLiBdIGZpbGVuYW1lCisKKyAgIFplcm8gb3IgbW9yZSBzd2l0Y2hlcyBtYXkgYmUgaW5jbHVkZWQ6CisKKyAgIC9QSVBFCisgICAgICAgICAgV2hlbiAvUElQRSBpcyBpbmNsdWRlZCwgImZpbGVuYW1lIiBpcyBpbnRlcnByZXRlZCBhcyBhIHN5c3RlbQorICAgICAgICAgIGNvbW1hbmQgb3IgcHJvZ3JhbSB3aG9zZSBvdXRwdXQgaXMgdG8gYmUgc2VudC4gU3lub255bToKKyAgICAgICAgICAvQ09NTUFORC4gRXhhbXBsZToKKworICB0cmFuc21pdCAvcGlwZSBmaW5nZXIKKworICAgICAgICAgIFlvdSBtYXkgZW5jbG9zZSB0aGUgY29tbWFuZCBpbiBicmFjZXMsIGJ1dCB5b3UgZG9uJ3QgaGF2ZSB0bzoKKworICB4bWl0IC9waXBlIHtscyAtbCB8IHNvcnQgLXIgKzAuMjIgLTAuMzIgfCBoZWFkfQorCisgICAvQklOQVJZCisgICAgICAgICAgVHJhbnNtaXRzIHRoZSBmaWxlIChvciBwaXBlIG91dHB1dCkgaW4gYmluYXJ5IG1vZGUuCisKKyAgIC9URVhUCisgICAgICAgICAgVHJhbnNtaXRzIHRoZSBmaWxlIChvciBwaXBlIG91dHB1dCkgaW4gbGluZS1vcmllbnRlZCB0ZXh0IG1vZGUuCisgICAgICAgICAgQ3VycmVudCBGSUxFIENIQVJBQ1RFUi1TRVQgYW5kIFRFUk1JTkFMIENIQVJBQ1RFUi1TRVQKKyAgICAgICAgICBzZWxlY3Rpb25zIGdvdmVybiB0cmFuc2xhdGlvbi4gRGVmYXVsdC4KKworICAgL1RSQU5TUEFSRU5UCisgICAgICAgICAgU3BlY2lmaWVzIHRleHQgbW9kZSB3aXRob3V0IGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24sIG5vCisgICAgICAgICAgbWF0dGVyIHdoYXQgdGhlIEZJTEUgYW5kIFRFUk1JTkFMIENIQVJBQ1RFUi1TRVQgc2VsZWN0aW9ucyBhcmUuCisKKyAgIC9OT1dBSVQKKyAgICAgICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gU0VUIFRSQU5TTUlUIFBST01QVCAwLCBidXQgZm9yIHRoaXMKKyAgICAgICAgICBUUkFOU01JVCBjb21tYW5kIG9ubHkuIEFwcGxpZXMgb25seSB0byB0ZXh0IG1vZGU7IGl0IG1lYW5zIHRvCisgICAgICAgICAgbm90IHdhaXQgZm9yIGFueSBraW5kIG9mIGVjaG8gb3IgdHVybmFyb3VuZCBjaGFyYWN0ZXIgYWZ0ZXIKKyAgICAgICAgICBzZW5kaW5nIGEgbGluZSBiZWZvcmUgc2VuZGluZyB0aGUgbmV4dCBsaW5lLiAoTm9ybWFsbHkgS2VybWl0CisgICAgICAgICAgd2FpdHMgZm9yIGEgbGluZWZlZWQuKQorCisgICBXaGVuIFRSQU5TTUlUIEVDSE8gaXMgT04sIEMtS2VybWl0IHRyaWVzIHRvIHJlYWQgYmFjayB0aGUgZWNobyBvZiBlYWNoCisgICBjaGFyYWN0ZXIgdGhhdCBpcyBzZW50LiBQcmlvciB0byBDLUtlcm1pdCA3LjAsIDEgc2Vjb25kIHdhcyBhbGxvd2VkCisgICBmb3IgZWFjaCBlY2hvIHRvIGFwcGVhcjsgaWYgaXQgZGlkbid0IHNob3cgdXAgaW4gYSBzZWNvbmQsIHRoZQorICAgVFJBTlNNSVQgY29tbWFuZCB3b3VsZCBmYWlsLiBTaW1pbGFybHkgZm9yIHRoZSBUUkFOU01JVCBQUk9NUFQKKyAgIGNoYXJhY3Rlci4gSG93ZXZlciwgd2l0aCB0b2RheSdzIGNvbmdlc3RlZCBJbnRlcm5ldCBjb25uZWN0aW9ucywgZXRjLAorICAgbW9yZSB0aW1lIGlzIG9mdGVuIG5lZWRlZDoKKworICAgU0VUIFRSQU5TTUlUIFRJTUVPVVQgbnVtYmVyCisgICBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIGFuIGVjaG8gb3IgdGhlIHByb21wdAorICAgY2hhcmFjdGVyIHdoZW4gVFJBTlNNSVQgUFJPTVBUIGlzIG5vbnplcm87IHRoZSBkZWZhdWx0IHdhaXQgaXMgMQorICAgc2Vjb25kLiBJZiB5b3Ugc3BlY2lmeSAwLCB0aGUgd2FpdCBpcyBpbmRlZmluaXRlLiBXaGVuIGEgdGltZW91dAorICAgaW50ZXJ2YWwgb2YgMCBpcyBzcGVjaWZpZWQsIGFuZCBhIGRlc2lyZWQgZWNobyBvciBwcm9tcHQgZG9lcyBub3Qgc2hvdworICAgdXAsIHRoZSBUUkFOU01JVCBjb21tYW5kIHdpbGwgbm90IHRlcm1pbmF0ZSB1bnRpbCBvciB1bmxlc3MgeW91CisgICBpbnRlcnJ1cHQgaXQgd2l0aCBDdHJsLUM7IHVzZSBTRVQgVFJBTlNNSVQgVElNRU9VVCAwIHdpdGggY2F1dGlvbi4KKworICAgTm90ZTogdG8gYmxhc3QgYSBmaWxlIG91dCB0aGUgY29tbXVuaWNhdGlvbnMgY29ubmVjdGlvbiB3aXRob3V0IGFueQorICAga2luZCBvZiBzeW5jaHJvbml6YXRpb24gb3IgdGltZW91dHMgb3Igb3RoZXIgbWFubmVyIG9mIGNoZWNraW5nLCB1c2U6CisKKyAgU0VUIFRSQU5TTUlUIEVDSE8gT0ZGCisgIFNFVCBUUkFOU01JVCBQUk9NUFQgMCAob3IgaW5jbHVkZSB0aGUgL05PV0FJVCBzd2l0Y2gpCisgIFNFVCBUUkFOU01JVCBQQVVTRSAwCisgIFRSQU5TTUlUIFsgc3dpdGNoZXMgXSBmaWxlbmFtZQorCisgICBJbiB0aGlzIGNhc2UsIHRleHQtZmlsZSB0cmFuc21pc3Npb24gaXMgbm90LWxpbmUgb3JpZW50ZWQgYW5kIGxhcmdlCisgICBibG9ja3MgY2FuIGJlIHNlbnQsIHJlc3VsdGluZyBpbiBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50CisgICBvdmVyIGxpbmUtYXQtYXQtdGltZSB0cmFuc21pc3Npb24uIFN1Y2Nlc3NmdWwgb3BlcmF0aW9uIGRlcGVuZHMgKGV2ZW4KKyAgIG1vcmUgdGhhbiB1c3VhbCBmb3IgdGhlIFRSQU5TTUlUIGNvbW1hbmQhKSBvbiBhIGNsZWFuIGNvbm5lY3Rpb24gd2l0aAorICAgZWZmZWN0aXZlIGZsb3cgY29udHJvbC4KKworICAgRm9yIGRldGFpbHMgb24gVFJBTlNNSVQgYW5kIGNoYXJhY3RlciBzZXRzLCBzZWUgWzUyNV1TZWN0aW9uIDYuNi41LjQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC4yMi4gQ29waW5nIHdpdGggRmF1bHR5IEtlcm1pdCBJbXBsZW1lbnRhdGlvbnMKKworICAgS2VybWl0IHByb3RvY29sIGhhcyBiZWVuIGltcGxlbWVudGVkIGluIHF1aXRlIGEgZmV3IHRoaXJkLXBhcnR5CisgICBjb21tZXJjaWFsLCBzaGFyZXdhcmUsIGFuZCBmcmVld2FyZSBzb2Z0d2FyZSBwYWNrYWdlcywgd2l0aCB2YXJ5aW5nCisgICBkZWdyZWVzIG9mIHN1Y2Nlc3MuIEluIG1vc3QgY2FzZXMgb3BlcmF0aW9uIGlzIHNhdGlzZmFjdG9yeSBidXQgc2xvdworICAgLS0gb25seSB0aGUgYmFyZSBtaW5pbXVtIHN1YnNldCBvZiB0aGUgcHJvdG9jb2wgaXMgYXZhaWxhYmxlIC0tIHNob3J0CisgICBwYWNrZXRzLCBubyBzbGlkaW5nIHdpbmRvd3MsIG5vIGF0dHJpYnV0ZXMsIGV0Yy4gSW4gb3RoZXIgY2FzZXMsIHRoZQorICAgaW1wbGVtZW50YXRpb24gaXMgaW5jb3JyZWN0LCByZXN1bHRpbmcgaW4gZmFpbHVyZXMgYXQgdGhlIGluaXRpYWwKKyAgIG5lZ290aWF0aW9uIHN0YWdlIG9yIGNvcnJ1cHRlZCBmaWxlcy4KKworICAgQy1LZXJtaXQgNy4wIGFuZCBLZXJtaXQgOTUgMS4xLjE5IGluY2x1ZGUgc29tZSBuZXcgZGVmZW5zZSBtZWNoYW5pc21zCisgICB0byBoZWxwIGNvcGUgd2l0aCB0aGUgbW9zdCBjb21tb24gc2l0dWF0aW9ucy4gSG93ZXZlciwgYmVhciBpbiBtaW5kCisgICB0aGVyZSBpcyBvbmx5IHNvIG11Y2ggd2UgY2FuIGRvIGluIHN1Y2ggY2FzZXMgLS0gdGhlIHJlc3BvbnNpYmlsaXR5CisgICBmb3IgZml4aW5nIHRoZSBwcm9ibGVtIGxpZXMgd2l0aCB0aGUgbWFrZXIgb2YgdGhlIGZhdWx0eSBzb2Z0d2FyZS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMjIuMS4gRmFpbHVyZSB0byBBY2NlcHQgTW9kZXJuIE5lZ290aWF0aW9uIFN0cmluZ3MKKworICAgVGhlIHB1Ymxpc2hlZCBLZXJtaXQgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBuZXcgZmllbGRzIGNhbgorICAgYmUgYWRkZWQgdG8gdGhlIHBhcmFtZXRlciBuZWdvdGlhdGlvbiBzdHJpbmcuIFRoZXNlIGFyZSB0byBiZSBpZ25vcmVkCisgICBieSBhbnkgS2VybWl0IGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGVtOyB0aGlzIGlzCisgICB3aGF0IG1ha2VzIHRoZSBLZXJtaXQgcHJvdG9jb2wgZXh0ZW5zaWJsZS4gVW5mb3J0dW5hdGVseSwgc29tZSBLZXJtaXQKKyAgIGltcGxlbWVudGF0aW9ucyBiZWNvbWUgY29uZnVzZWQgKG9yIHdvcnNlKSB3aGVuIHJlY2VpdmluZyBhCisgICBuZWdvdGlhdGlvbiBzdHJpbmcgbG9uZ2VyIHRoYW4gdGhlIG9uZSB0aGV5IGV4cGVjdC4gWW91IGNhbiB0cnkKKyAgIHdvcmtpbmcgYXJvdW5kIHN1Y2ggcHJvYmxlbXMgYnkgdGVsbGluZyBLZXJtaXQgdG8gc2hvcnRlbiBpdHMKKyAgIG5lZ290aWF0aW9uIHN0cmluZyAoYW5kIHRodXMgZGlzYWJsZSB0aGUgY29ycmVzcG9uZGluZyBuZXcgZmVhdHVyZXMpOgorCisgIFNFVCBTRU5EIE5FR09USUFUSU9OLVNUUklORy1NQVgtTEVOR1RIIG51bWJlcgorCisgICBUcnkgYSBudW1iZXIgbGlrZSAxMC4gSWYgdGhhdCBkb2Vzbid0IHdvcmssIHRyeSA5LCA4LCA3LCA2LCBhbmQgc28gb24uCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjIyLjIuIEZhaWx1cmUgdG8gTmVnb3RpYXRlIDh0aC1iaXQgUHJlZml4aW5nCisKKyAgIFRoZSBwdWJsaXNoZWQgS2VybWl0IHByb3RvY29sIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgOHRoLWJpdAorICAgcHJlZml4aW5nICh3aGljaCBhbGxvd3MgdHJhbnNmZXIgb2YgOC1iaXQgZGF0YSBvdmVyIGEgNy1iaXQKKyAgIGNvbm5lY3Rpb24pIG9jY3VycyBpZiB0aGUgZmlsZSBzZW5kZXIgcHV0cyBhIHZhbGlkIHByZWZpeCBjaGFyYWN0ZXIKKyAgIChub3JtYWxseSAiJiIpIGluIHRoZSA4dGgtYml0LXByZWZpeCBmaWVsZCBvZiB0aGUgbmVnb3RpYXRpb24gc3RyaW5nLAorICAgYW5kIHRoZSByZWNlaXZlciBwdXRzIGVpdGhlciBhIGxldHRlciAiWSIgb3IgdGhlIHNhbWUgcHJlZml4CisgICBjaGFyYWN0ZXIuIEF0IGxlYXN0IG9uZSBmYXVsdHkgS2VybWl0IGltcGxlbWVudGF0aW9uIGV4aXN0cyB0aGF0IGRvZXMKKyAgIG5vdCBhY2NlcHQgdGhlIGxldHRlciAiWSIuIFRvIGZvcmNlIEMtS2VybWl0IC8gSy05NSB0byByZXBseSB3aXRoIHRoZQorICAgb3RoZXIgS2VybWl0J3MgcHJlZml4IGNoYXJhY3RlciByYXRoZXIgdGhhbiBhICJZIiwgZ2l2ZSB0aGUgZm9sbG93aW5nCisgICAoaW52aXNpYmxlKSBjb21tYW5kOgorCisgIFNFVCBROEZMQUcgT04KKworICAgVXNlIFNFVCBROEZMQUcgT0ZGIHRvIHJlc3RvcmUgdGhlIG5vcm1hbCBiZWhhdmlvci4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMjIuMy4gQ29ycnVwdCBGaWxlcworCisgICBSZWZlciB0byBbNTI2XVNlY3Rpb24gNC4yMi4yLiBTb21lIEtlcm1pdCBpbXBsZW1lbnRhdGlvbnMgbWlzdGFrZW5seQorICAgaW50ZXJwcmV0IHRoZSAiWSIgYXMgYSBwcmVmaXggY2hhcmFjdGVyLiBUaGVuLCB3aGVuZXZlciBhIGxldHRlciBZCisgICBhcHBlYXJzIGluIHRoZSBkYXRhLCB0aGUgWSBhbmQgdGhlIGNoYXJhY3RlciB0aGF0IGZvbGxvd3MgaXQgYXJlCisgICByZXBsYWNlZCBieSBhIGdhcmJhZ2UgY2hhcmFjdGVyLiBBdCB0aGlzIHdyaXRpbmcsIHdlIGFyZSBub3Qgc3VyZSBpZgorICAgdGhlcmUgaXMgYW55IHNvbHV0aW9uLCBidXQgdHJ5ICJzZXQgc2VuZCBuZWdvdGlhdGlvbi1zdHJpbmctbWF4LWxlbmd0aAorICAgNiIgYW5kL29yICJzZXQgcThmbGFnIG9uIi4KKworICAgRmlsZSBjb3JydXB0aW9uIGNhbiBhbHNvIG9jY3VyIHdoZW4gY29udHJvbCBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgZmlsZQorICAgZGF0YSBhcmUgc2VudCB3aXRob3V0IHByZWZpeGluZywgYXMgYXQgbGVhc3Qgc29tZSBhcmUgYnkgZGVmYXVsdCBpbgorICAgQy1LZXJtaXQgNy4wIGFuZCBLLTk1LiBTb21lIEtlcm1pdCBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IGhhbmRsZQorICAgaW5jb21pbmcgImJhcmUiIGNvbnRyb2wgY2hhcmFjdGVycy4gVG8gd29yayBhcm91bmQsICJzZXQgcHJlZml4aW5nCisgICBhbGwiLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4yMi40LiBTcHVyaW91cyBDYW5jZWxsYXRpb25zCisKKyAgIFRoZSBLZXJtaXQgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBpZiBhbiBBQ0sgdG8gYSBEYXRhCisgICBwYWNrZXQgY29udGFpbnMgWCBpbiBpdHMgZGF0YSBmaWVsZCwgdGhlIHRyYW5zZmVyIG9mIHRoZSBjdXJyZW50IGZpbGUKKyAgIGlzIGNhbmNlbGVkLCBhbmQgaWYgaXQgY29udGFpbnMgYSBaLCB0aGUgZW50aXJlIHRyYW5zZmVyIGlzIGNhbmNlbGVkLgorICAgQXQgbGVhc3Qgb25lIG92ZXJ6ZWFsb3VzIEtlcm1pdCBpbXBsZW1lbnRhdGlvbiBhcHBsaWVzIHRoaXMgcnVsZSB0bworICAgbm9uLURhdGEgcGFja2V0cyBhcyB3ZWxsLCB0aGUgdHlwaWNhbCBzeW1wdG9tIGJlaW5nIHRoYXQgYW55IGF0dGVtcHQKKyAgIHRvIHRyYW5zZmVyIGEgZmlsZSB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoIFggb3IgWiByZXN1bHRzIGluCisgICBjYW5jZWxsYXRpb24uIFRoaXMgaXMgYmVjYXVzZSB0aGUgZmlsZSByZWNlaXZlciB0eXBpY2FsbHkgc2VuZHMgYmFjaworICAgdGhlIG5hbWUgdW5kZXIgd2hpY2ggaXQgc3RvcmVkIHRoZSBmaWxlICh3aGljaCBtaWdodCBub3QgYmUgdGhlIHNhbWUKKyAgIGFzIHRoZSBuYW1lIGl0IHdhcyBzZW50IHdpdGgpIGluIHRoZSBBQ0sgdG8gdGhlIEZpbGUgSGVhZGVyIHBhY2tldC4KKyAgIFRoaXMgaXMgaW5mb3JtYXRpb24gb25seSBhbmQgc2hvdWxkIG5vdCBjYXVzZSBjYW5jZWxsYXRpb24uIFRvIHdvcmsKKyAgIGFyb3VuZCB0aGUgcHJvYmxlbSwgdXNlOgorCisgIFNFVCBGLUFDSy1CVUcgeyBPTiwgT0ZGIH0KKworICAgT04gdGVsbHMgS2VybWl0IG5vdCB0byBzZW5kIGJhY2sgdGhlIGZpbGVuYW1lIGluIHRoZSBBQ0sgdG8gdGhlIGZpbGUKKyAgIGhlYWRlciBwYWNrZXQgYXMgaXQgbm9ybWFsbHkgd291bGQgZG8gKE9GRiBwdXRzIEtlcm1pdCBiYWNrIHRvIG5vcm1hbAorICAgYWZ0ZXIgdXNpbmcgT04pLgorCisgICBBIHZhcmlhdGlvbiBvbiB0aGUgdGhpcyBidWcgb2NjdXJzIGluIGFuIG9ic2N1cmUgS2VybWl0IHByb2dyYW0gZm9yCisgICBNVU1QUzogV2hlbiB0aGlzIEtlcm1pdCBwcm9ncmFtIHNlbmRzIGEgZmlsZSBjYWxsZWQgKHNheSkgRk9PLkJBUiwgaXQKKyAgIHJlcXVpcmVzIHRoYXQgdGhlIEFDSyB0byBpdHMgRiBwYWNrZXQgY29udGFpbiBleGFjdGx5IHRoZSBzYW1lIG5hbWUsCisgICBGT08uQkFSLiBIb3dldmVyLCBDLUtlcm1pdCBsaWtlcyB0byBzZW5kIGJhY2sgdGhlIGZ1bGwgcGF0aG5hbWUsCisgICBjYXVzaW5nIHRoZSBNVU1QUyBLZXJtaXQgdG8gZmFpbC4gU0VUIEYtQUNLLUJVRyBPTiBkb2Vzbid0IGhlbHAgaGVyZS4KKyAgIFNvIGEgc2VwYXJhdGUgY29tbWFuZCBoYXMgYmVlbiBhZGRlZCB0byBoYW5kbGUgdGhpcyBzaXR1YXRpb246CisKKyAgU0VUIEYtQUNLLVBBVEggeyBPTiwgT0ZGIH0KKworICAgTm9ybWFsbHkgaXQgaXMgT04gKHJlZ2FyZGxlc3Mgb2YgdGhlIFNFVCBTRU5EIFBBVEhOQU1FUyBzZXR0aW5nKS4gVXNlCisgICBTRVQgRi1BQ0stUEFUSCBPRkYgdG8gaW5zdHJ1Y3QgS2VybWl0IHRvIHNlbmQgYmFjayBvbmx5IHRoZSBmaWxlbmFtZQorICAgd2l0aG91dCB0aGUgcGF0aCBpbiB0aGUgQUNLIHRvIHRoZSBGIHBhY2tldC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDQuMjIuNS4gU3B1cmlvdXMgUmVmdXNhbHMKKworICAgU29tZSBLZXJtaXQgaW1wbGVtZW50YXRpb25zLCBub3RhYmx5IFBEUC0xMSBLZXJtaXQgMy42MCBhbmQgZWFybGllciwKKyAgIGhhdmUgYnVncyBpbiB0aGVpciBoYW5kbGluZyBvZiBBdHRyaWJ1dGUgcGFja2V0cyB0aGF0IGNhbiBjYXVzZQorICAgdW53YXJyYW50ZWQgcmVmdXNhbCBvZiBpbmNvbWluZyBmaWxlcywgZS5nLiBiYXNlZCBvbiBkYXRlIG9yIHNpemUuCisgICBUaGlzIGNhbiBiZSB3b3JrZWQgYXJvdW5kIGJ5IHRlbGxpbmcgb25lIG9yIGJvdGggb2YgdGhlIEtlcm1pdAorICAgcGFydG5lcnMgdG86CisKKyAgU0VUIEFUVFJJQlVURVMgT0ZGCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjIyLjYuIEZhaWx1cmVzIGR1cmluZyB0aGUgRGF0YSBUcmFuc2ZlciBQaGFzZQorCisgICBUaGlzIGNhbiBiZSBjYXVzZWQgYnkgY29udHJvbC1jaGFyYWN0ZXIgdW5wcmVmaXhpbmcgKFs1MjddU2VjdGlvbgorICAgNC4yMi4zICksIGFuZCBmaXhlZCBieToKKworICBTRVQgUFJFRklYSU5HIEFMTAorCisgICBJdCBjYW4gYWxzbyBoYXZlIG51bWVyb3VzIG90aGVyIGNhdXNlcywgZXhwbGFpbmVkIGluIENoYXB0ZXIgMTAgb2YKKyAgIFs1MjhdVXNpbmcgQy1LZXJtaXQ6IHRoZSBjb25uZWN0aW9uIGlzIG5vdCA4LWJpdCB0cmFuc3BhcmVudCAoc28gdXNlCisgICAic2V0IHBhcml0eSBzcGFjZSIgb3Igc29tZXN1Y2gpLCBpbmFkZXF1YXRlIGZsb3cgY29udHJvbCwgZXRjLiBDb25zdWx0CisgICB0aGUgbWFudWFsLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNC4yMi43LiBGcmFjdHVyZWQgRmlsZW5hbWVzCisKKyAgIEF0IGxlYXN0IG9uZSB3ZWxsLWtub3duIFBDLWJhc2VkIGNvbW11bmljYXRpb25zIHBhY2thZ2UgbmVnb3RpYXRlcworICAgZGF0YSBjb21wcmVzc2lvbiwgd2hpY2ggKGFjY29yZGluZyB0byB0aGUgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbikKKyAgIGFwcGxpZXMgdG8gYm90aCB0aGUgZmlsZW5hbWUgYW5kIHRoZSBmaWxlIGRhdGEsIGJ1dCB0aGVuIGZhaWxzIHRvCisgICBkZWNvbXByZXNzIHRoZSBmaWxlbmFtZS4gRXhhbXBsZTogQy1LZXJtaXQgc2VuZHMgYSBmaWxlIGNhbGxlZAorICAgUjAwMDEwMS5EQVQgKHdoZXJlIDAwMDEwMSBtaWdodCBiZSBub24tWTJLLXdpc2UgWVlNTUREIG5vdGF0aW9uKSwgYW5kCisgICB0aGUgcGFja2FnZSBpbiBxdWVzdGlvbiBzdG9yZXMgdGhlIGZpbGVzIGFzIFJ+IzAxMDEuREFULiBXb3JrYXJvdW5kOgorICAgVGVsbCBDLUtlcm1pdCB0byBTRVQgUkVQRUFUIENPVU5UUyBPRkYuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA0LjIyLjguIEJhZCBGaWxlIERhdGVzCisKKyAgIEF0IGxlYXN0IG9uZSB3ZWxsLWtub3duIFBDLWJhc2VkIGNvbW11bmljYXRpb25zIHBhY2thZ2UgbmVnb3RpYXRlcyB0aGUKKyAgIHBhc3Npbmcgb2YgZmlsZSB0aW1lc3RhbXBzIGZyb20gc2VuZGVyIHRvIHJlY2VpdmVyLCBidXQgd2hlbiBpdCBpcworICAgc2VuZGluZyBmaWxlcywgaXQgYWx3YXlzIGdpdmVzIHRoZW0gYSB0aW1lc3RhbXAgb2YgMSBGZWJydWFyeSAxOTcwLgorICAgV29ya2Fyb3VuZDogdGVsbCBDLUtlcm1pdCB0byBTRVQgQVRUUklCVVRFIERBVEUgT0ZGLiBZb3UgZG9uJ3QgZ2V0IHRoZQorICAgZmlsZSdzIHJlYWwgZGF0ZSwgYnV0IHlvdSBhbHNvIGRvbid0IGdldCAxIEZlYiAxOTcwOyBpbnN0ZWFkIHRoZSBmaWxlCisgICBnZXRzIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC4yMy4gRmlsZSBUcmFuc2ZlciBSZWNvdmVyeQorCisgICBQcmlvciB0byBDLUtlcm1pdCA3LjAsIFJFU0VORCAoU0VORCAvUkVDT1ZFUikgYW5kIFJFR0VUIChHRVQgL1JFQ09WRVIpCisgICByZWZ1c2VkIHRvIHdvcmsgaWYgRklMRSBUWVBFIHdhcyBub3QgQklOQVJZIG9yIHRoZSAvQklOQVJZIHN3aXRjaCB3YXMKKyAgIG5vdCBpbmNsdWRlZC4gTm93IHRoZXNlIGNvbW1hbmRzIGluY2x1ZGUgYW4gaW1wbGllZCAvQklOQVJZIHN3aXRjaCwKKyAgIG1lYW5pbmcgdGhleSBzZXQgdGhlIGZpbGUgdHlwZSB0byBiaW5hcnkgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUKKyAgIGNvbW1hbmQgYXV0b21hdGljYWxseS4KKworICAgSW4gdGhlIGNsaWVudC9zZXJ2ZXIgYXJyYW5nZW1lbnQsIHRoaXMgYWxzbyBmb3JjZXMgdGhlIHNlcnZlciBpbnRvCisgICBiaW5hcnkgbW9kZSAoaWYgaXQgaXMgQy1LZXJtaXQgNy4wIG9yIGdyZWF0ZXIsIG9yIEs5NSAxLjEuMTkgb3IKKyAgIGdyZWF0ZXIpIHNvIHRoZSByZWNvdmVyeSBvcGVyYXRpb24gcHJvY2VlZHMsIGp1c3QgYXMgeW91IGFza2VkIGFuZAorICAgZXhwZWN0ZWQuCisKKyAgIEJVVC4uLiBKdXN0IGFzIGJlZm9yZSwgdGhlIHJlc3VsdHMgYXJlIGNvcnJlY3Qgb25seSB1bmRlciB0aGUKKyAgIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICogSWYgdGhlIHByaW9yIGludGVycnVwdGVkIHRyYW5zZmVyIHdhcyBhbHNvIGluIGJpbmFyeSBtb2RlOyBvcjoKKyAgICAgKiBJZiB0aGUgcHJpb3IgdHJhbnNmZXIgd2FzIGluIHRleHQgbW9kZSBhbmQgdGhlIG90aGVyIGNvbXB1dGVyIHdhcworICAgICAgIGEgImxpa2UgcGxhdGZvcm0iIChlLmcuIFVOSVgtdG8tVU5JWCwgV2luZG93cy10by1XaW5kb3dzLAorICAgICAgIERPUy10by1XaW5kb3dzKSBBTkQgdGhlcmUgd2FzIG5vIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gKGkuZS4KKyAgICAgICBUUkFOU0ZFUiBDSEFSQUNURVItU0VUIHdhcyBUUkFOU1BBUkVOVCkuCisKKyAgIE5vdGUgdGhhdCB0aGVzZSBjaXJjdW1zdGFuY2VzIGFyZSBtb3JlIGxpa2VseSB0byBvYnRhaW4gaW4gQy1LZXJtaXQKKyAgIDcuMCwgaW4gd2hpY2g6CisKKyAgICAgKiBUaGUgZGVmYXVsdCBGSUxFIFRZUEUgaW4gQy1LZXJtaXQgNy4wIGlzIEJJTkFSWS4KKyAgICAgKiBUaGUgZGVmYXVsdCBGSUxFIElOQ09NUExFVEUgc2V0dGluZyBpcyBBVVRPLCB3aGljaCBtZWFucyBLRUVQIGlmCisgICAgICAgdGhlIHRyYW5zZmVyIGlzIGluIGJpbmFyeSBtb2RlLCBESVNDQVJEIG90aGVyd2lzZS4KKyAgICAgKiBDLUtlcm1pdCA3LjAsIEtlcm1pdCA5NSAxLjEuMTcsIGFuZCBNUy1ET1MgS2VybWl0IDMuMTUgYW5kIGxhdGVyCisgICAgICAgY2FuIHJlY29nbml6ZSAibGlrZSBwbGF0Zm9ybXMiIGFuZCBzd2l0Y2ggaW50byBiaW5hcnkgbW9kZQorICAgICAgIGF1dG9tYXRpY2FsbHkuIFRyYW5zZmVycyBiZXR3ZWVuIGxpa2UgcGxhdGZvcm1zIGFyZSBhbHdheXMgYmluYXJ5CisgICAgICAgdW5sZXNzIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLCBhbmQgdGhlbiBpcworICAgICAgIHN0aWxsIGJpbmFyeSBmb3IgYWxsIGZpbGVzIHdob3NlIG5hbWVzIG1hdGNoIGEgYmluYXJ5IHBhdHRlcm4sCisgICAgICAgdW5sZXNzIHRoZSBhdXRvbWF0aWMgbWVjaGFuaXNtcyBoYXZlIGJlZW4gZGlzYWJsZWQgKHdpdGggYSAvVEVYVAorICAgICAgIHN3aXRjaCwgb3Igd2l0aCBTRVQgVFJBTlNGRVIgTU9ERSBNQU5VQUwpLgorICAgICAqIFNFTkQgL0JJTkFSWSBhbmQgR0VUIC9CSU5BUlkgYWx3YXlzIGZvcmNlIGJpbmFyeS1tb2RlIHRyYW5zZmVycywKKyAgICAgICBldmVuIHdoZW4gRklMRSBUWVBFIGlzIFRFWFQsIGV2ZW4gd2hlbiBUUkFOU0ZFUiBNT0RFIGlzIEFVVE9NQVRJQywKKyAgICAgICBldmVuIHdoZW4gUEFUVEVSTlMgYXJlIE9OIGFuZCB0aGUgZmlsZSdzIG5hbWUgbWF0Y2hlcyBhIHRleHQKKyAgICAgICBwYXR0ZXJuLgorCisgICBCdXQgYWxzbyBub3RlIHRoYXQgdGhlIGF1dG9tYXRpYyBjbGllbnQvc2VydmVyIHRyYW5zZmVyLW1vZGUKKyAgIGFkanVzdG1lbnRzIGRvIG5vdCB3b3JrIHdpdGggdmVyc2lvbnMgb2YgQy1LZXJtaXQgcHJpb3IgdG8gNy4wIG9yIEs5NQorICAgcHJpb3IgdG8gMS4xLjE2LgorCisgICBJZiB0aGUgcHJpb3IgdHJhbnNmZXIgd2FzIGluIHRleHQgbW9kZToKKworICAgICAqIElmIHRleHQtbW9kZSB0cmFuc2ZlcnMgYmV0d2VlbiB0aGUgdHdvIHBsYXRmb3JtcyBhcmUKKyAgICAgICAibGVuZ3RoLWNoYW5naW5nIiAoYXMgdGhleSBhcmUgYmV0d2VlbiBVTklYIC0tIHdoaWNoIHRlcm1pbmF0ZXMKKyAgICAgICB0ZXh0IGxpbmVzIHdpdGggTEYgLS0gYW5kIERPUyBvciBXaW5kb3dzIC0tIHdoaWNoIHRlcm1pbmF0ZXMgdGV4dAorICAgICAgIGxpbmVzIHdpdGggQ1JMRiksIHRoZSByZWNvdmVyZWQgZmlsZSB3aWxsIGJlIGNvcnJ1cHQuCisgICAgICogSWYgdGV4dC1tb2RlIHRyYW5zZmVycyBiZXR3ZWVuIHRoZSB0d28gcGxhdGZvcm1zIGFyZSBub3QKKyAgICAgICBsZW5ndGgtY2hhbmdpbmcsIGJ1dCBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIHdhcyBhY3RpdmUgaW4gdGhlCisgICAgICAgcHJpb3IgdHJhbnNmZXIsIHRoZSByZXN1bHQgd2lsbCBiZSBhIGZpbGUgaW4gd2hpY2ggdGhlIGZpcnN0IHBhcnQKKyAgICAgICBoYXMgdHJhbnNsYXRlZCBjaGFyYWN0ZXJzIGFuZCB0aGUgc2Vjb25kIHBhcnQgZG9lcyBub3QuCisKKyAgIEJ1dCBpbiBDLUtlcm1pdCA3LjAgYW5kIEs5NSAxLjEuMTkgYW5kIGxhdGVyLCBpbmNvbXBsZXRlbHkgdHJhbnNmZXJyZWQKKyAgIHRleHQgZmlsZXMgYXJlIG5vdCBrZXB0IHVubGVzcyB5b3UgY2hhbmdlIHRoZSBkZWZhdWx0LiBCdXQgaWYgeW91IGhhdmUKKyAgIGRvbmUgdGhpcywgYW5kIHlvdSBoYXZlIGFuIGluY29tcGxldGVseSB0cmFuc2ZlcnJlZCB0ZXh0IGZpbGUsIHlvdSdsbAorICAgbmVlZCB0bzoKKworICAgICAqIFRyYW5zZmVyIHRoZSB3aG9sZSBmaWxlIGFnYWluIGluIHRleHQgbW9kZSwgb3I6CisgICAgICogVXNlIFNFTkQgL1NUQVJUSU5HLUFUOiB0byByZWNvdmVyIHRoZSB0cmFuc2ZlciBhdCB0aGUgY29ycmVjdAorICAgICAgIHBvaW50OyBidXQgeW91IGhhdmUgdG8gZmluZCBvdXQgd2hhdCB0aGF0IHBvaW50IGlzLCBhcyBkZXNjcmliZWQKKyAgICAgICBpbiB0aGUgbWFudWFsLgorCisgICBLZXJtaXQgaGFzIG5vIHdheSBvZiBrbm93aW5nIHdoZXRoZXIgdGhlIHByZXZpb3VzIHRyYW5zZmVyIHdhcyBpbiB0ZXh0CisgICBvciBiaW5hcnkgbW9kZSBzbyBpdCBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGNob29zZSB0aGUgYXBwcm9wcmlhdGUKKyAgIHJlY292ZXJ5IG1ldGhvZC4KKworICAgSWYgeW91IHVzZSBDLUtlcm1pdCB0byBtYWludGFpbiBwYXJhbGxlbCBkaXJlY3RvcmllcyBvbiBkaWZmZXJlbnQKKyAgIGNvbXB1dGVycywgdXNpbmcgU0VUIEZJTEUgQ09MTElTSU9OIHRvIHRyYW5zZmVyIG9ubHkgdGhvc2UgZmlsZXMgdGhhdAorICAgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUsIGFuZCB0aGUgZmlsZXMgYXJlIGJpZyBlbm91Z2ggKG9yIHRoZQorICAgY29ubmVjdGlvbiBzbG93IGVub3VnaCkgdG8gcmVxdWlyZSBTRU5EIC9SRUNPVkVSIHRvIHJlc3VtZSBpbnRlcnJ1cHRlZAorICAgdHJhbnNmZXJzLCB5b3Ugc2hvdWxkIHJlbWVtYmVyIHRoYXQgU0VORCAvUkVDT1ZFUiAoUkVTRU5EKSBvdmVycmlkZXMKKyAgIGFsbCBGSUxFIENPTExJU0lPTiBzZXR0aW5ncy4gVGhlcmVmb3JlIHlvdSBzaG91bGQgdXNlIFNFTkQgL1JFQ09WRVIKKyAgIChSRVNFTkQpIG9ubHkgb24gdGhlIGZpbGUgdGhhdCB3YXMgaW50ZXJydXB0ZWQsIG5vdCB0aGUgZmlsZSBncm91cC4KKyAgIEZvciBleGFtcGxlLCBpZiB0aGUgb3JpZ2luYWwgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCB3aXRoOgorCisgIFNFTkQgKgorCisgICBhbmQgd2FzIGludGVycnVwdGVkLCB0aGVuIGFmdGVyIHJlZXN0YWJsaXNoaW5nIHlvdXIgY29ubmVjdGlvbiBhbmQKKyAgIHN0YXJ0aW5nIHRoZSBLZXJtaXQgcmVjZWl2ZXIgd2l0aCBTRVQgRklMRSBDT0xMSVNJT04gVVBEQVRFIG9uIHRoZQorICAgcmVtb3RlIGVuZCwgdXNlIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgYXQgdGhlIHNlbmRlciB0byByZXN1bWUgdGhlCisgICB0cmFuc2ZlcjoKKworICBTRU5EIC9SRUNPVkVSIG5hbWUtb2YtaW50ZXJydXB0ZWQtZmlsZQorCisgICBhbmQgdGhlbjoKKworICBTRU5EICoKKworICAgKEluIEMtS2VybWl0IDcuMCBhbmQgbGF0ZXIsIFx2KGZpbGVuYW1lKSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZmlsZQorICAgbW9zdCByZWNlbnRseSB0cmFuc2ZlcnJlZCwgYXMgbG9uZyB5b3UgaGF2ZSBub3QgRVhJVGVkIGZyb20gS2VybWl0IG9yCisgICBjaGFuZ2VkIGRpcmVjdG9yeSwgZXRjLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDQuMjQuIEZJTEUgQ09MTElTSU9OIFVQREFURSBDbGFyaWZpY2F0aW9uCisKKyAgIEluIFVOSVgsIGZpbGUgbW9kaWZpY2F0aW9uIGRhdGVzIGFyZSB1c2VkIHdoZW4gY29tcGFyaW5nIHRoZSBmaWxlIGRhdGUKKyAgIHdpdGggdGhlIGRhdGUgaW4gdGhlIGF0dHJpYnV0ZSBwYWNrZXQuIEluIFZNUywgaG93ZXZlciwgdGhlIGZpbGUKKyAgIGNyZWF0aW9uIGRhdGUgaXMgdXNlZC4gVGhlc2UgdHdvIHBvbGljaWVzIHJlZmxlY3QgdGhlIHByZWZlcmVuY2VzIG9mCisgICB0aGUgdHdvIHVzZXIgY29tbXVuaXRpZXMuCisKKyAgIEFsc28sIHJlbWVtYmVyIHRoYXQgdGhlIGZpbGUgZGF0ZS90aW1lIGdpdmVuIGluIHRoZSBhdHRyaWJ1dGUgcGFja2V0CisgICBpcyB0aGUgbG9jYWwgdGltZSBhdCB0aGUgZmlsZSBzZW5kZXIuIEF0IHByZXNlbnQsIG5vIHRpbWV6b25lCisgICBjb252ZXJzaW9ucyBhcmUgZGVmaW5lZCBpbiBvciBwZXJmb3JtZWQgYnkgdGhlIEtlcm1pdCBwcm90b2NvbC4gVGhpcworICAgaXMgcHJpbWFyaWx5IGJlY2F1c2UgdGhpcyBmZWF0dXJlIHdhcyBkZXNpZ25lZCBhdCBhIHRpbWUgd2hlbiBtYW55IG9mCisgICB0aGUgc3lzdGVtcyB3aGVyZSBLZXJtaXQgcnVucyBoYWQgbm8gY29uY2VwdCBvZiB0aW1lem9uZSwgYW5kCisgICB0aGVyZWZvcmUgd291bGQgYmUgdW5hYmxlIHRvIGNvbnZlcnQgKHNheSwgdG8vZnJvbSBHTVQgb3IgVVRDIG9yIFp1bHUKKyAgIHRpbWUpLgorCisgICBBcyBhIGNvbnNlcXVlbmNlLCBzb21lIHVuZXhwZWN0ZWQgcmVzdWx0cyBtaWdodCBvY2N1ciB3aGVuCisgICB0cmFuc2ZlcnJpbmcgZmlsZXMgYWNyb3NzIHRpbWV6b25lczsgZS5nLiBjb21tYW5kcyBvbiB0aGUgdGFyZ2V0CisgICBzeXN0ZW0gdGhhdCBhcmUgc2Vuc2l0aXZlIHRvIGZpbGUgZGF0ZXMgbWlnaHQgd29yayAoVU5JWCAibWFrZSIsCisgICBiYWNrdXBzLCBldGMpLgorCisgICBUaW1lem9uZSBoYW5kbGluZyBpcyBkZWZlcnJlZCBmb3IgYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LjI1LiBBdXRvZG93bmxvYWQgSW1wcm92ZW1lbnRzCisKKyAgIFJlZmVyIHRvIHBhZ2VzIDE2NC0xNjUgb2YgWzUyOV1Vc2luZyBDLUtlcm1pdCBhYm91dCB0aGUgaGF6YXJkcyBvZgorICAgYXV0b2Rvd25sb2FkIHdoZW4gQy1LZXJtaXQgaXMgImluIHRoZSBtaWRkbGUiLiBBcyBvZiBDLUtlcm1pdCA3LjAsIG5vCisgICBtb3JlIGhhemFyZHMuIElmIEMtS2VybWl0IGhhcyBURVJNSU5BTCBBVVRPRE9XTkxPQUQgT04gYW5kIGl0IGRldGVjdHMKKyAgIGEgcGFja2V0IG9mIHRoZSBjdXJyZW50IHByb3RvY29sIHR5cGUgKEtlcm1pdCBvciBabW9kZW0pLCBpdCAiZXJhc2VzIgorICAgdGhlIHZpc3VhbCBhc3BlY3Qgb2YgdGhlIHBhY2tldCB0aGF0IHdvdWxkIGJlIHNlZW4gYnkgdGhlIHRlcm1pbmFsCisgICAob3IsIG1vcmUgdG8gdGhlIHBvaW50LCB0aGUgZW11bGF0b3IsIHN1Y2ggYXMgSzk1KS4gVGhpcyB3YXksIG9ubHkKKyAgIEMtS2VybWl0IGdvZXMgaW50byBSRUNFSVZFIG1vZGUsIGFuZCBub3QgYWxzbyB0aGUgdGVybWluYWwgZW11bGF0b3IKKyAgIHRocm91Z2ggd2hpY2ggQy1LZXJtaXQgaXMgYWNjZXNzZWQuIEFuZCB0aGVyZWZvcmUsIGl0IGlzIG5vIGxvbmdlcgorICAgbmVjZXNzYXJ5IHRvIFNFVCBURVJNSU5BTCBBVVRPRE9XTkxPQUQgT0ZGIHRvIHByZXZlbnQgbXVsdGlwbGUgS2VybWl0cworICAgZnJvbSBnb2luZyBpbnRvIHJlY2VpdmUgbW9kZSBhdCBvbmNlLCBidXQgb2YgY291cnNlIGl0IGlzIHN0aWxsCisgICBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQsIHdoZW4geW91IGhhdmUgbXVsdGlwbGUgS2VybWl0cyBpbiBhIGNoYWluLAorICAgdGhhdCB0aGUgZGVzaXJlZCBvbmUgcmVjZWl2ZXMgdGhlIGF1dG9kb3dubG9hZC4KKworICAgVGhlIGRlZmF1bHRzIGhhdmUgbm90IGJlZW4gY2hhbmdlZDsgS2VybWl0IDk1IHN0aWxsIGhhcyBhdXRvZG93bmxvYWQKKyAgIE9OIGJ5IGRlZmF1bHQsIGFuZCBDLUtlcm1pdCBoYXMgaXQgT0ZGIGJ5IGRlZmF1bHQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNS4gQ0xJRU5UL1NFUlZFUgorCisgIDUuMC4gSGludHMKKworICAgSWYgeW91IHVzZSBTRVQgU0VSVkVSIEdFVC1QQVRIIHRvIHNldCB1cCB5b3VyIHNlcnZlciwgYW5kIHRoZSBHRVQtUEFUSAorICAgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2VydmVyJ3MgY3VycmVudCBkaXJlY3RvcnksIGNsaWVudHMgY2FuIGJlY29tZQorICAgcXVpdGUgY29uZnVzZWQuIEZvciBleGFtcGxlLCAicmVtb3RlIGRpciBvb2ZhLnR4dCIgc2hvd3MgYSBmaWxlIG5hbWVkCisgICBvb2ZhLnR4dCwgYnV0ICJnZXQgb29mYS50eHQiIGZhaWxzLiBJbiB0aGlzIHNpdHVhdGlvbiwgeW91IHNob3VsZAorICAgZWl0aGVyIERJU0FCTEUgRElSIG9yIG1ha2UgeW91ciBHRVQtUEFUSCBpbmNsdWRlIHRoZSBjdXJyZW50CisgICBkaXJlY3RvcnkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNS4xLiBOZXcgQ29tbWFuZC1MaW5lIE9wdGlvbnMKKworICAgVGhlIC1HIGNvbW1hbmQtbGluZSBvcHRpb24gaXMgbGlrZSAtZyAoR0VUKSwgZXhjZXB0IHRoZSBpbmNvbWluZyBmaWxlCisgICBpcyBzZW50IHRvIHN0YW5kYXJkIG91dHB1dCByYXRoZXIgdGhhbiB3cml0dGVuIHRvIGRpc2suCisKKyAgIFRoZSAtSSBvcHRpb24gKCJJbnRlcm5ldCIpIGlzIHVzZWQgdG8gdGVsbCBhIHJlbW90ZSBDLUtlcm1pdCBwcm9ncmFtCisgICB0aGF0IHlvdSBhcmUgY29taW5nIGluIHZpYSBJbnRlcm5ldCBUZWxuZXQgb3IgUmxvZ2luIGFuZCB0aGVyZWZvcmUKKyAgIGhhdmUgYSByZWxpYWJsZSBjb25uZWN0aW9uLiBUaGUgLUkgb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8gU0VUCisgICBSRUxJQUJMRSBPTiBhbmQgU0VUIEZMT1cgTk9ORS4KKworICAgVGhlIC1PIG9wdGlvbiAoIk9ubHkgT25lIikgdGVsbHMgQy1LZXJtaXQgdG8gZW50ZXIgc2VydmVyIG1vZGUgYnV0CisgICB0aGVuIGV4aXQgYWZ0ZXIgdGhlIGZpcnN0IGNsaWVudCBvcGVyYXRpb24uCisKKyAgIFNlZSBbNTMwXVNlY3Rpb24gOS4zIGZvciBkZXRhaWxzLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDUuMi4gTmV3IENsaWVudCBDb21tYW5kcworCisgICBCWUUgYW5kIEZJTklTSCBubyBsb25nZXIgdHJ5IHRvIGRvIGFueXRoaW5nIGlmIGEgY29ubmVjdGlvbiBpcyBub3QKKyAgIGFjdGl2ZS4gVGh1cyBhIHNlcXVlbmNlIGxpa2UgImhhbmd1cCIgZm9sbG93ZWQgYnkgImJ5ZSIgb3IgImZpbmlzaCIKKyAgIHdpbGwgbm8gbG9uZ2VyIGdldCBzdHVjayBpbiBhIGxvbmcgdGltZW91dC1hbmQtcmV0cmFuc21pc3Npb24gY3ljbGUsCisgICBub3Igd2lsbCBpdCB0cnkgdG8gb3BlbiBhIG5ldyBjb25uZWN0aW9uLgorCisgICBSRU1PVEUgRVhJVAorICAgICAgICAgIFNpbWlsYXIgdG8gRklOSVNILCBleGNlcHQgaXQgZW5zdXJlcyB0aGF0IHRoZSBLZXJtaXQgc2VydmVyCisgICAgICAgICAgcHJvZ3JhbSBleGl0cyBiYWNrIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9yIHNoZWxsIHByb21wdC4KKyAgICAgICAgICAoRklOSVNIIHdvdWxkIHJldHVybiBpdCB0byBpdHMgaW50ZXJhY3RpdmUgcHJvbXB0IGlmIGl0IHdhcworICAgICAgICAgIHN0YXJ0ZWQgaW4gaW50ZXJhY3RpdmUgbW9kZSwgYW5kIHdvdWxkIGNhdXNlIGl0IHRvIGV4aXQgaWYgaXQKKyAgICAgICAgICBlbnRlcmVkIHNlcnZlciBtb2RlIHZpYSBjb21tYW5kLWxpbmUgb3B0aW9uLikgV2hlbiBDLUtlcm1pdCBpcworICAgICAgICAgIHRvIGJlIHRoZSBzZXJ2ZXIsIHlvdSBjYW4gdXNlIHsgRU5BQkxFLCBESVNBQkxFIH0gRVhJVCB0bworICAgICAgICAgIGNvbnRyb2wgdGhlIGNsaWVudCdzIGFjY2VzcyB0byB0aGlzIGZlYXR1cmUuCisKKyAgIFJFTU9URSBNS0RJUiBkaXJlY3RvcnktbmFtZQorICAgICAgICAgIFRlbGxzIHRoZSBjbGllbnQgdG8gYXNrIHRoZSBzZXJ2ZXIgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IHdpdGgKKyAgICAgICAgICB0aGUgZ2l2ZW4gbmFtZSwgd2hpY2ggY2FuIGJlIGFic29sdXRlIG9yIHJlbGF0aXZlLiBUaGUgc3ludGF4CisgICAgICAgICAgb2YgdGhlIGRpcmVjdG9yeSBuYW1lIGRlcGVuZHMgb24gdGhlIEtlcm1pdCBzZXJ2ZXIgKHNlZQorICAgICAgICAgIFs1MzFdbmV4dCBzZWN0aW9uKTsgaW4gYWxsIGNhc2VzLCBpdCBjYW4gYmUgaW4gdGhlIHN5bnRheCBvZgorICAgICAgICAgIHRoZSBzeXN0ZW0gd2hlcmUgdGhlIHNlcnZlciBpcyBydW5uaW5nIChVTklYLCBWTVMsIERPUywgZXRjKQorICAgICAgICAgIGJ1dCBuZXdlciBzZXJ2ZXJzIGFsc28gYWNjZXB0IFVOSVggc3ludGF4LCBubyBtYXR0ZXIgd2hhdCB0aGUKKyAgICAgICAgICB1bmRlcmx5aW5nIHBsYXRmb3JtLiBUaGUgc2VydmVyIHdpbGwgbm90IGV4ZWN1dGUgdGhpcyBjb21tYW5kCisgICAgICAgICAgaWYgKGEpIGl0IGRvZXMgbm90IHVuZGVyc3RhbmQgaXQsIChiKSBhIERJU0FCTEUgTUtESVIgY29tbWFuZAorICAgICAgICAgIGhhcyBiZWVuIGdpdmVuLCBvciAoYykgYSBESVNBQkxFIENXRCBjb21tYW5kIGhhcyBiZWVuIGdpdmVuOworICAgICAgICAgIG90aGVyd2lzZSwgdGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQsIGJ1dCB3aWxsIGZhaWwgaWYgdGhlCisgICAgICAgICAgZGlyZWN0b3J5IGNhbiBub3QgYmUgY3JlYXRlZCwgaW4gd2hpY2ggY2FzZXMgbW9zdCBzZXJ2ZXJzIHdpbGwKKyAgICAgICAgICBhdHRlbXB0IHRvIHJldHVybiBhIG1lc3NhZ2UgZ2l2aW5nIHRoZSByZWFzb24gZm9yIGZhaWx1cmUuIFRoZQorICAgICAgICAgIFJFTU9URSBNS0RJUiBjb21tYW5kIHN1Y2NlZWRzIGlmIHRoZSByZW1vdGUgZGlyZWN0b3J5IGlzCisgICAgICAgICAgY3JlYXRlZCwgb3IgaWYgaXQgYWxyZWFkeSBleGlzdHMgYW5kIHRoZXJlZm9yZSBkb2VzIG5vdCBuZWVkIHRvCisgICAgICAgICAgYmUgY3JlYXRlZCwgYW5kIGZhaWxzIG90aGVyd2lzZS4KKworICAgUkVNT1RFIFJNRElSIGRpcmVjdG9yeS1uYW1lCisgICAgICAgICAgVGVsbHMgdGhlIGNsaWVudCB0byBhc2sgdGhlIHNlcnZlciB0byByZW1vdmUgKGRlbGV0ZSkgYQorICAgICAgICAgIGRpcmVjdG9yeSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBUaGUgc2FtZSBjb25zaWRlcmF0aW9ucyBhcHBseSBhcworICAgICAgICAgIGZvciBSRU1PVEUgTUtESVIuCisKKyAgIFJFTU9URSBTRVQgRklMRSBJTkNPTVBMRVRFIHsgRElTQ0FSRCwgS0VFUCwgQVVUTyB9CisgICAgICAgICAgUHJldmlvdXNseSB0aGlzIHdhcyBvbmx5IGF2YWlsYWJsZSBpbiBpdHMgZWFybGllciBmb3JtLCBSRU1PVEUKKyAgICAgICAgICBTRVQgSU5DT01QTEVURSAobm8gRklMRSkuIFRoZSBlYXJsaWVyIGZvcm0gaXMgc3RpbGwgYXZhaWxhYmxlLAorICAgICAgICAgIGJ1dCBpbnZpc2libGUuIEFsc28sIEFVVE8gd2FzIGFkZGVkLCBtZWFuaW5nIEtFRVAgaWYgaW4gYmluYXJ5CisgICAgICAgICAgbW9kZSwgRElTQ0FSRCBvdGhlcndpc2UuCisKKyAgIFJFTU9URSBTRVQgVFJBTlNGRVIgTU9ERSB7IEFVVE9NQVRJQywgTUFOVUFMIH0KKyAgICAgICAgICBUZWxscyB0aGUgY2xpZW50IHRvIGFzayB0aGUgc2VydmVyIHRvIHNldCB0aGUgZ2l2ZW4KKyAgICAgICAgICBmaWxlLXRyYW5zZmVyIG1vZGUuIEF1dG9tYXRpYyBtZWFucyAocm91Z2hseSk6IGlmIHRoZSBjbGllbnQKKyAgICAgICAgICBhbmQgdGhlIHNlcnZlciBhcmUgcnVubmluZyBvbiB0aGUgc2FtZSBraW5kIG9mIGNvbXB1dGVyIChlLmcuCisgICAgICAgICAgYm90aCBhcmUgb24gVU5JWCksIHRoZW4gdXNlIGJpbmFyeSBtb2RlIGF1dG9tYXRpY2FsbHk7IGlmIHRoZQorICAgICAgICAgIHN5c3RlbSB0eXBlcyBhcmUgZGlmZmVyZW50LCB1c2Ugc29tZSBvdGhlciBtZXRob2QgdG8KKyAgICAgICAgICBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0ZXh0IG9yIGJpbmFyeSBtb2RlLCBzdWNoIGFzIGZpbGVuYW1lCisgICAgICAgICAgcGF0dGVybiBtYXRjaGluZy4gTUFOVUFMIG1lYW5zLCBpbiB0aGlzIGNvbnRleHQsIG9iZXkgdGhlCisgICAgICAgICAgY2xpZW50J3MgRklMRSBUWVBFIHNldHRpbmcgKFRFWFQgb3IgQklOQVJZKS4gU3lub255bTogUkVNT1RFCisgICAgICAgICAgU0VUIFhGRVIgTU9ERS4KKworICAgWyBSRU1PVEUgXSBRVUVSWSBLRVJNSVQgZnVuY3Rpb24oYXJncy4uLikKKyAgICAgICAgICBQcmlvciB0byBDLUtlcm1pdCA3LjAsIHRoZSBhcmd1bWVudHMgd2VyZSBub3QgZXZhbHVhdGVkCisgICAgICAgICAgbG9jYWxseS4gVGh1cyBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgdGhlIHNlcnZlciBydW4gdGhlCisgICAgICAgICAgZnVuY3Rpb24gd2l0aCBjbGllbnQtc2lkZSB2YXJpYWJsZXMgYXMgYXJndW1lbnRzLiBOb3c6CisKKyAgZGVmaW5lIFwlYSBvb2ZhLioKKyAgcmVtb3RlIHF1ZXJ5IGtlcm1pdCBmaWxlcyhcJWEpICAgIDsgQ2xpZW50J3MgXCVhCisgIHJlbW90ZSBxdWVyeSBrZXJtaXQgZmlsZXMoXFwlYSkgICA7IFNlcnZlcidzIFwlYQorCisgICBbIFJFTU9URSBdIExPR0lOIFsgdXNlciBbIHBhc3N3b3JkIF0gXQorICAgICAgICAgIExPR0lOIGlzIG5vdyBhIHN5bm9ueW0gZm9yIFJFTU9URSBMT0dJTi4KKworICAgTE9HT1VUCisgICAgICAgICAgVGhpcyBjb21tYW5kLCB3aGVuIGdpdmVuIGluIGxvY2FsIG1vZGUsIGlzIGVxdWl2YWxlbnQgdG8gUkVNT1RFCisgICAgICAgICAgTE9HT1VULiBXaGVuIGdpdmVuIGF0IHRoZSBJS1NEIHByb21wdCwgaXQgbG9ncyBvdXQgdGhlIElLU0QuCisgICAgICAgICAgV2hlbiBnaXZlbiBhdCB0aGUgQy1LZXJtaXQgcHJvbXB0IHdoZW4gaXQgaGFzIG5vIGNvbm5lY3Rpb24sIGl0CisgICAgICAgICAgZG9lcyBub3RoaW5nLgorCisgICBOb3RlIHRoYXQgaW4gQy1LZXJtaXQgNy4wLCB0aGUgUkVNT1RFIChvciBSKSBwcmVmaXggaXMgbm90IHJlcXVpcmVkCisgICBmb3IgUVVFUlksIHNpbmNlIHRoZXJlIGlzIG5vIGxvY2FsIFFVRVJZIGNvbW1hbmQuIFRoZSBuZXcgdG9wLWxldmVsCisgICBRVUVSWSBjb21tYW5kIGRvZXMgZXhhY3RseSB3aGF0IFJFTU9URSBRVUVSWSAoUlFVRVJZKSBkb2VzLgorCisgICBBbGwgUkVNT1RFIGNvbW1hbmRzIG5vdyBoYXZlIHNpbmdsZS13b3JkIHNob3J0Y3V0czoKKworIFNob3J0Y3V0ICAgRnVsbCBGb3JtCisgIFJBU0cgICAgICAgUkVNT1RFIEFTU0lHTgorICBSQ0QgICAgICAgIFJFTU9URSBDRAorICBSQ09QWSAgICAgIFJFTU9URSBDT1BZCisgIFJERUwgICAgICAgUkVNT1RFIERFTEVURQorICBSRElSICAgICAgIFJFTU9URSBESVJFQ1RPUlkKKyAgUkVYSVQgICAgICBSRU1PVEUgRVhJVAorICBSSEVMUCAgICAgIFJFTU9URSBIRUxQCisgIFJIT1NUICAgICAgUkVNT1RFIEhPU1QKKyAgUlBXRCAgICAgICBSRU1PVEUgUFdECisgIFJTRVQgICAgICAgUkVNT1RFIFNFVAorICBldGMuCisKKyAgIFRoZSBSIHByZWZpeCBpcyBub3QgYXBwbGllZCB0byBMT0dJTiBiZWNhdXNlIHRoZXJlIGlzIGFscmVhZHkgYW4KKyAgIFJMT0dJTiBjb21tYW5kIHdpdGggYSBkaWZmZXJlbnQgbWVhbmluZy4gSXQgaXMgbm90IGFwcGxpZWQgdG8gTE9HT1VUCisgICBlaXRoZXIsIHNpbmNlIExPR09VVCBrbm93cyB3aGF0IHRvIGRvIGluIGVhY2ggY2FzZSwgYW5kIGZvciBzeW1tZXRyeQorICAgd2l0aCBMT0dJTi4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDUuMi4xLiBSZW1vdGUgUHJvY2VkdXJlIERlZmluaXRpb25zIGFuZCBDYWxscworCisgICBUaGlzIGlzIG5vdGhpbmcgbmV3LCBidXQgaXQgbWlnaHQgbm90IGJlIG9idmlvdXMuLi4gUkVNT1RFIEFTU0lHTiBhbmQKKyAgIFJFTU9URSBRVUVSWSBtYXkgYmUgdXNlZCB0byBhY2hpZXZlIHJlbW90ZSBwcm9jZWR1cmUgZXhlY3V0aW9uLiBUaGUKKyAgIHJlbW90ZSBwcm9jZWR1cmUgY2FuIGJlIGRlZmluZWQgbG9jYWxseSBvciByZW1vdGVseS4KKworICAgQSByZW1vdGUgcHJvY2VkdXJlIGNhbGwgaXMgYWNjb21wbGlzaGVkIGFzIG5vdGVkIGluIHRoZSBwcmV2aW91cworICAgc2VjdGlvbjoKKworICBbIHJlbW90ZSBdIHF1ZXJ5IGtlcm1pdCBmdW5jdGlvbi1uYW1lKGFyZ3MuLi4pCisKKyAgIFRoaXMgaW52b2tlcyBhbnkgZnVuY3Rpb24gdGhhdCBpcyBidWlsdCBpbiB0byB0aGUgS2VybWl0IHNlcnZlciwgZS5nLjoKKworICBbIHJlbW90ZSBdIHF1ZXJ5IGtlcm1pdCBzaXplKGZvby5iYXIpCisKKyAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHJlbW90ZSBmaWxlLCBmb28uYmFyLgorCisgICBOb3cgbm90ZSB0aGF0IEMtS2VybWl0IGluY2x1ZGVzIGFuIFxmZXhlY3V0ZSgpIGZ1bmN0aW9uLCBhbGxvd2luZyBpdAorICAgdG8gZXhlY3V0ZSBhbnkgbWFjcm8gYXMgaWYgaXQgd2VyZSBhIGJ1aWx0LWluIGZ1bmN0aW9uLiBTbyBzdXBwb3NlCisgICBNWU1BQ1JPIGlzIHRoZSBuYW1lIG9mIGEgbWFjcm8gZGVmaW5lZCBpbiB0aGUgc2VydmVyLiBZb3UgY2FuIGV4ZWN1dGUKKyAgIGl0IGZyb20gdGhlIGNsaWVudCBhcyBmb2xsb3dzICh0aGUgcmVkdW5kYW50ICJyZW1vdGUiIHByZWZpeCBpcworICAgb21pdHRlZCBpbiB0aGUgcmVtYWluaW5nIGV4YW1wbGVzKToKKworICBxdWVyeSBrZXJtaXQgZXhlY3V0ZShteW1hY3JvIGFyZzEgYXJnMi4uLikKKworICAgVGhlIHJldHVybiB2YWx1ZSwgaWYgYW55LCBpcyB0aGUgdmFsdWUgb2YgdGhlIFJFVFVSTiBjb21tYW5kIHRoYXQKKyAgIHRlcm1pbmF0ZWQgZXhlY3V0aW9uIG9mIHRoZSBtYWNybywgZm9yIGV4YW1wbGU6CisKKyAgZGVmaW5lIGFkZHR3b251bWJlcnMgcmV0dXJuIFxmZXZhbChcJTErXCUyKQorCisgICBUaGUgY2xpZW50IGludm9jYXRpb24gd291bGQgYmU6CisKKyAgcXVlcnkga2VybWl0IGV4ZWN1dGUoYWRkdHdvbnVtYmVycyAzIDQpCisgIDcKKworICAgVGhlIHJlc3VsdCAoIjciIGluIHRoaXMgY2FzZSkgaXMgYWxzbyBhc3NpZ25lZCB0byB0aGUgY2xpZW50J3MKKyAgIFx2KHF1ZXJ5KSB2YXJpYWJsZS4KKworICAgVG8gZXhlY3V0ZSBhIHJlbW90ZSBzeXN0ZW0gY29tbWFuZCBvciBjb21tYW5kIHByb2NlZHVyZSAoc2hlbGwgc2NyaXB0LAorICAgZXRjKSB1c2U6CisKKyAgcXVlcnkga2VybWl0IGNvbW1hbmQobmFtZSBhcmdzLi4uKQorCisgICBGaW5hbGx5LCBzdXBwb3NlIHlvdSB3YW50IHRoZSBjbGllbnQgdG8gc2VuZCBhIG1hY3JvIHRvIHRoZSBzZXJ2ZXIgdG8KKyAgIGJlIGV4ZWN1dGVkIG9uIHRoZSBzZXJ2ZXIgZW5kLiBUaGlzIGlzIGRvbmUgYXMgZm9sbG93czoKKworICByZW1vdGUgYXNzaWduIG1hY3JvbmFtZSBkZWZpbml0aW9uCisgIHF1ZXJ5IGtlcm1pdCBleGVjdXRlKG1hY3JvbmFtZSBhcmcxIGFyZzIuLi4pCisKKyAgIFF1b3RpbmcgaXMgcmVxdWlyZWQgaWYgdGhlIGRlZmluaXRpb24gY29udGFpbnMgZm9ybWFsIHBhcmFtZXRlcnMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNS4zLiBOZXcgU2VydmVyIENhcGFiaWxpdGllcworCisgICAgNS4zLjEuIENyZWF0aW5nIGFuZCBSZW1vdmluZyBEaXJlY3RvcmllcworCisgICBUaGUgQy1LZXJtaXQgNy4wIHNlcnZlciByZXNwb25kcyB0byBSRU1PVEUgTUtESVIgYW5kIFJFTU9URSBSTURJUgorICAgY29tbWFuZHMuIFRoZSBkaXJlY3RvcnkgbmFtZSBtYXkgYmUgaW4gZWl0aGVyIHRoZSBuYXRpdmUgZm9ybWF0IG9mIHRoZQorICAgc2VydmVyJ3MgY29tcHV0ZXIsIG9yIGluIFVOSVggZm9ybWF0LiBGb3IgZXhhbXBsZSwgYSBzZXJ2ZXIgcnVubmluZyBvbgorICAgVk1TIHdpdGggYSBjdXJyZW50IGRpcmVjdG9yeSBvZiBbSVZBTl0gY2FuIGFjY2VwdCBjb21tYW5kcyBmcm9tIHRoZQorICAgY2xpZW50IGxpa2U6CisKKyAgcmVtb3RlIG1rZGlyIG9sZ2EgICAgICAgICA7IE1ha2VzIFtJVkFOLk9MR0FdIChub25zcGVjaWZpYyBmb3JtYXQpCisgIHJlbW90ZSBta2RpciAub2xnYSAgICAgICAgOyBNYWtlcyBbSVZBTi5PTEdBXSAoVk1TIGZvcm1hdCB3aXRob3V0IGJyYWNrZXRzKQorICByZW1vdGUgbWtkaXIgb2xnYS8gICAgICAgIDsgTWFrZXMgW0lWQU4uT0xHQV0gKFVOSVggcmVsYXRpdmUgZm9ybWF0KQorICByZW1vdGUgbWtkaXIgL2l2YW4vb2xnYSAgIDsgTWFrZXMgW0lWQU4uT0xHQV0gKFVOSVggYWJzb2x1dGUgZm9ybWF0KQorICByZW1vdGUgbWtkaXIgW2l2YW4ub2xnYV0gIDsgTWFrZXMgW0lWQU4uT0xHQV0gKFZNUyBhYnNvbHV0ZSBmb3JtYXQpCisgIHJlbW90ZSBta2RpciBbLm9sZ2FdICAgICAgOyBNYWtlcyBbSVZBTi5PTEdBXSAoVk1TIHJlbGF0aXZlIGZvcm1hdCkKKworICAgIDUuMy4xLjEuIENyZWF0aW5nIERpcmVjdG9yaWVzCisKKyAgIElmIGEgZGlyZWN0b3J5IG5hbWUgaXMgZ2l2ZW4gdGhhdCBjb250YWlucyBtb3JlIHRoYW4gb25lIHNlZ21lbnQgdGhhdAorICAgZG9lcyBub3QgZXhpc3QsIHRoZSBzZXJ2ZXIgYXR0ZW1wdHMgdG8gY3JlYXRlIGFsbCB0aGUgc2VnbWVudHMuIEZvcgorICAgZXhhbXBsZSwgaWYgdGhlIGNsaWVudCBzYXlzOgorCisgIFJFTU9URSBNS0RJUiBsZXR0ZXJzL2FuZ3J5CisKKyAgIGEgImxldHRlcnMiIHN1YmRpcmVjdG9yeSBpcyBjcmVhdGVkIGluIHRoZSBzZXJ2ZXIncyBjdXJyZW50IGRpcmVjdG9yeQorICAgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgYW5kIHRoZW4gYW4gImFuZ3J5IiBzdWJkaXJlY3RvcnkgaXMKKyAgIGNyZWF0ZWQgYmVuZWF0aCBpdCwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBoYXZlIG9uZS4gVGhpcyBjYW4gcmVwZWF0ZWQKKyAgIHRvIGFueSByZWFzb25hYmxlIGRlcHRoOgorCisgIFJFTU9URSBNS0RJUiBhL2IvYy9kL2UvZi9nL2gvaS9qL2svbC9tL24vby9wL3Evci9zL3QvdS92L3cvei95L3oKKworICAgIDUuMy4xLjIuIFJlbW92aW5nIERpcmVjdG9yaWVzCisKKyAgIFdoZW4gYXR0ZW1wdGluZyB0byBleGVjdXRlIGEgUkVNT1RFIFJNRElSLCB0aGUgc2VydmVyIGNhbiByZW1vdmUgb25seQorICAgYSBzaW5nbGUgZGlyZWN0b3J5LCBub3QgYW4gZW50aXJlIHNlcXVlbmNlIG9yIHRyZWUuIFRoZSBzeXN0ZW0gc2VydmljZQorICAgdGhhdCBpcyBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBkaXJlY3RvcnkgZ2VuZXJhbGx5IHJlcXVpcmVzIG5vdCBvbmx5CisgICB0aGF0IHRoZSBzZXJ2ZXIgcHJvY2VzcyBoYXMgd3JpdGUgZGVsZXRlIGFjY2VzcywgYnV0IGFsc28gdGhhdCB0aGUKKyAgIGRpcmVjdG9yeSBjb250YWluIG5vIGZpbGVzLgorCisgICBJbiB0aGUgZnV0dXJlLCBhIFJFTU9URSBSTURJUiAvUkVDVVJTSVZFIGNvbW1hbmQgKGFuZCB0aGUgYWNjb21wYW55aW5nCisgICBwcm90b2NvbCkgbWlnaHQgYmUgYWRkZWQuIEZvciBub3csIHVzZSB0aGUgZXF1aXZhbGVudCBSRU1PVEUgSE9TVAorICAgY29tbWFuZChzKSwgaWYgYW55LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNS4zLjIuIERpcmVjdG9yeSBMaXN0aW5ncworCisgICBEaXJlY3RvcnkgbGlzdGluZ3MgYXJlIGdlbmVyYXRlZCBieSBDLUtlcm1pdCBpdHNlbGYsIHJhdGhlciB0aGFuIGJ5CisgICBydW5uaW5nIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSdzIGRpcmVjdG9yeSBjb21tYW5kLiBTb21lIGNvbnRyb2wgb3ZlcgorICAgdGhlIGxpc3RpbmcgZm9ybWF0IGNhbiBiZSBvYnRhaW5lZCB3aXRoIHRoZSBTRVQgT1BUSU9OUyBESVJFQ1RPUlkKKyAgIGNvbW1hbmQgKFs1MzJdU2VjdGlvbiA0LjUuMSkuIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhZmZlY3QgbGlzdGluZ3MKKyAgIHNlbnQgYnkgdGhlIHNlcnZlcjogL1tOT11IRUFESU5HLCAvW05PXURPVEZJTEVTLCBhbmQgL1tOT11CQUNLVVAuIEluCisgICBVTklYIGFuZCBWTVMsIHRoZSBsaXN0aW5nIGlzIGFsd2F5cyBzb3J0ZWQgYnkgZmlsZW5hbWUuIFRoZXJlIGlzLCBhdAorICAgcHJlc2VudCwgbm8gcHJvdG9jb2wgZGVmaW5lZCBmb3IgdGhlIGNsaWVudCB0byByZXF1ZXN0IGxpc3Rpbmcgb3B0aW9ucworICAgb2YgdGhlIHNlcnZlcjsgdGhpcyBtaWdodCBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLgorCisgICBUaGUgc2VydmVyJ3MgZGlyZWN0b3J5IGxpc3RpbmdzIGFyZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworICAgUHJvdGVjdGlvbiBvciBwZXJtaXNzaW9uczoKKyAgICAgICAgICBJbiBVTklYIGFuZCBPUy05LCB0aGlzIGlzIGEgMTAtY2hhcmFjdGVyIGZpZWxkLCBsZWZ0IGFkanVzdGVkLgorICAgICAgICAgIEluIFZNUyBpdCBpcyBhIDIyLWNoYXJhY3RlciBmaWVsZCwgbGVmdC1hZGp1c3RlZC4gSW4gZWFjaCBjYXNlLAorICAgICAgICAgIHRoZSBwcm90ZWN0aW9uIC8gcGVybWlzc2lvbiBjb2RlcyBhcmUgc2hvd24gaW4gdGhlIHNlcnZlcgorICAgICAgICAgIHBsYXRmb3JtJ3MgbmF0aXZlIGZvcm1hdC4gSW4gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMsIHRoaXMKKyAgICAgICAgICBmaWVsZCBpcyBub3Qgc2hvd24uCisKKyAgIFNpemUgaW4gYnl0ZXM6CisgICAgICAgICAgVGhpcyBpcyBhbHdheXMgYSAxMC1jaGFyYWN0ZXIgZmllbGQuIFRoZSBmaWxlJ3Mgc2l6ZSBpcyBzaG93bgorICAgICAgICAgIGFzIGEgZGVjaW1hbCBudW1iZXIsIHJpZ2h0IGFkanVzdGVkIGluIHRoZSBmaWVsZC4gSWYgdGhlIGZpbGUKKyAgICAgICAgICBpcyBhIGRpcmVjdG9yeSBhbmQgaXRzIHNpemUgY2FuIG5vdCBiZSBvYnRhaW5lZCwgdGhlIHNpemUgaXMKKyAgICAgICAgICBzaG93biBhcyAiPERJUj4iLiBUd28gYmxhbmtzIGZvbGxvdyB0aGlzIGZpZWxkLgorCisgICBEYXRlOgorICAgICAgICAgIEFsd2F5cyBpbiB5eXl5LW1tLWRkIGhoOm1tOnNzIG51bWVyaWMgZm9ybWF0LCBhbmQgdGhlcmVmb3JlIDE5CisgICAgICAgICAgY2hhcmFjdGVycyBsb25nLiBJZiB0aGUgZmlsZSdzIGRhdGUvdGltZSBjYW4ndCBiZSBvYnRhaW5lZCwKKyAgICAgICAgICB6ZXJvcyAoMCkgYXJlIHNob3duIGZvciBhbGwgdGhlIGRpZ2l0cy4gVGhpcyBmaWVsZCBpcyBmb2xsb3dlZAorICAgICAgICAgIGJ5IHR3byBibGFua3MuCisKKyAgIEZpbGVuYW1lOgorICAgICAgICAgIFRoaXMgZmllbGQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLiBGaWxlbmFtZXMgYXJlIHNob3duCisgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHNlcnZlcidzIGN1cnJlbnQgZGlyZWN0b3J5LiBJbiBVTklYLCBzeW1ib2xpYworICAgICAgICAgIGxpbmtzIGFyZSBzaG93biBhcyB0aGV5IGFyZSBpbiBhbiAibHMgLWwiIGxpc3RpbmcgYXMgImxpbmtuYW1lCisgICAgICAgICAgLT4gZmlsZW5hbWUiLgorCisgICBJbiBVTklYIGFuZCBWTVMsIGxpc3RpbmdzIGFyZSByZXR1cm5lZCBieSB0aGUgc2VydmVyIGluIGFscGhhYmV0aWNhbAorICAgb3JkZXIgb2YgZmlsZW5hbWUuIFRoZXJlIGFyZSBwcmVzZW50bHkgbm8gb3RoZXIgc29ydCBvciBzZWxlY3Rpb24KKyAgIG9wdGlvbnMuCisKKyAgIEhvd2V2ZXIsIHNpbmNlIHRoZXNlIGFyZSBmaXhlZC1maWVsZCBsaXN0aW5ncywgYWxsIGZpZWxkcyBjYW4gYmUgdXNlZAorICAgYXMgc29ydCBrZXlzIGJ5IGV4dGVybmFsIHNvcnQgcHJvZ3JhbXMuIE5vdGUsIGluIHBhcnRpY3VsYXIsIHRoYXQgdGhlCisgICBmb3JtYXQgdXNlZCBmb3IgdGhlIGRhdGUgYWxsb3dzIGEgbm9ybWFsIGxleGljYWwgb24gdGhhdCBmaWVsZCB0bworICAgYWNoaWV2ZSB0aGUgZGF0ZSBvcmRlcmluZy4gRm9yIGV4YW1wbGUsIGxldCdzIGFzc3VtZSB3ZSBoYXZlIGEgVU5JWAorICAgY2xpZW50IGFuZCBhIFVOSVggc2VydmVyLiBJbiB0aGlzIGNhc2UsIHRoZSBzZXJ2ZXIncyBsaXN0aW5nIGhhcyB0aGUKKyAgIGRhdGUgaW4gY29sdW1ucyAyMi00MCwgYW5kIHRodXMgY291bGQgYmUgc29ydGVkIGJ5IHRoZSBVTklYIHNvcnQKKyAgIHByb2dyYW0gdXNpbmcgInNvcnQgKzAuMjIgLTAuNDAiIG9yIGluIHJldmVyc2Ugb3JkZXIgYnkgInNvcnQgKzAuMjIKKyAgIC0wLjQwciIuCisKKyAgIFNpbmNlIHRoZSBVTklYIGNsaWVudCBjYW4gcGlwZSByZXNwb25zZXMgdG8gUkVNT1RFIGNvbW1hbmRzIHRocm91Z2gKKyAgIGZpbHRlcnMsIGFueSBkZXNpcmVkIHNvcnRpbmcgY2FuIGJlIGFjY29tcGxpc2hlZCB0aGlzIHdheSwgZm9yCisgICBleGFtcGxlOgorCitDLUtlcm1pdD4gcmVtb3RlIGRpcmVjdG9yeSB8IHNvcnQgKzAuMjIgLTAuNDAKKworICAgWW91IGNhbiBhbHNvIHNvcnQgYnkgc2l6ZToKKworICBDLUtlcm1pdD4gcmVtb3RlIGRpcmVjdG9yeSB8IHNvcnQgKzAuMTEgLTAuMTkKKworICAgWW91IGNhbiB1c2Ugc29ydCBvcHRpb25zIHRvIHNlbGVjdCByZXZlcnNlIG9yIGFzY2VuZGluZyBvcmRlci4gIm1hbgorICAgc29ydCIgKGluIFVOSVgpIGZvciBtb3JlIGluZm9ybWF0aW9uLiBBbmQgb2YgY291cnNlLCB5b3UgY2FuIHBpcGUKKyAgIHRoZXNlIGxpc3RpbmdzIHRocm91Z2ggYW55IG90aGVyIGZpbHRlciBvZiB5b3VyIGNob2ljZSwgc3VjaCBhcyBncmVwCisgICB0byBza2lwIHVud2FudGVkIGxpbmVzLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDUuNC4gU3ludGF4IGZvciBSZW1vdGUgRmlsZW5hbWVzIHdpdGggRW1iZWRkZWQgU3BhY2VzCisKKyAgIEMtS2VybWl0IGFuZCBLOTUsIHdoZW4gaW4gc2VydmVyIG1vZGUsIGFzc3VtZSB0aGF0IGFueSBzcGFjZXMgaW4gdGhlCisgICBmaWxlIHNwZWNpZmljYXRpb24gaW4gYW4gaW5jb21pbmcgR0VUIGNvbW1hbmQgYXJlIGZpbGVuYW1lIHNlcGFyYXRvcnMuCisgICBUaHVzIGlmIHRoZSBjbGllbnQgZ2l2ZXMgYSBjb21tYW5kIGxpa2U6CisKKyAgZ2V0IHtvb2ZhLnR4dCBvb2ZhLmJpbn0KKworICAgb3IsIGVxdWl2YWxlbnRseToKKworICBtZ2V0IG9vZmEudHh0IG9vZmEuYmluCisKKyAgIHRoZSBzZXJ2ZXIgdHJpZXMgdG8gc2VuZCB0aGUgdHdvIGZpbGVzLCBvb2ZhLnR4dCBhbmQgb29mYS5iaW4uIEJ1dAorICAgd2hhdCBpZiB5b3Ugd2FudCB0aGUgc2VydmVyIHRvIHNlbmQgeW91IGEgZmlsZSBuYW1lZCwgc2F5OgorCisgIEQ6XEhQIE9mZmljZUpldCA1MDBcSW1hZ2VzXE15IFByZXR0eSBQaWN0dXJlIERvdCBQQ0wKKworICAgSG93IGRvZXMgdGhlIHNlcnZlciBrbm93IHRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgb25lIGZpbGUgYW5kIG5vdAorICAgc2V2ZW4/IEluIHRoaXMgY2FzZSwgeW91IG5lZWQgdG8gdGhlIHNlbmQgZmlsZSBuYW1lIHRvIHRoZSBzZXJ2ZXIKKyAgIGVuY2xvc2VkIGluIGVpdGhlciBjdXJseSBicmFjZXM6CisKKyAge0Q6XEhQIE9mZmljZUpldCA1MDBcSW1hZ2VzXE15IFByZXR0eSBQaWN0dXJlIERvdCBQQ0x9CisKKyAgIG9yIEFTQ0lJIGRvdWJsZXF1b3RlczoKKworICAiRDpcSFAgT2ZmaWNlSmV0IDUwMFxJbWFnZXNcTXkgUHJldHR5IFBpY3R1cmUgRG90IFBDTCIKKworICAgVGhlIG1ldGhvZCBmb3IgZG9pbmcgdGhpcyBkZXBlbmRzIG9uIHlvdXIgY2xpZW50LiBJZiB5b3VyIGNsaWVudCBpcworICAgQy1LZXJtaXQgNy4wLCBhbnkgcmVjZW50IHZlcnNpb24gb2YgS2VybWl0IDk1LCBvciBNUy1ET1MgS2VybWl0IDMuMTYsCisgICB0aGVuIHlvdSBoYXZlIHRvIGVuY2xvc2UgdGhlIG5hbWUgaW4gYnJhY2VzIGp1c3Qgc28gdGhlIGNsaWVudCBjYW4KKyAgIHBhcnNlIGl0LCBzbyB0byBzZW5kIGJyYWNlcyBvciBkb3VibGVxdW90ZXMgdG8gdGhlIHNlcnZlciwgeW91IG11c3QKKyAgIHB1dCB0aGVtIGluc2lkZSB0aGUgZmlyc3QsIG91dHNpZGUgcGFpciBvZiBicmFjZXMuIEFuZCB5b3UgYWxzbyBuZWVkCisgICB0byBkb3VibGUgdGhlIGJhY2tzbGFzaGVzIHRvIHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nIGludGVycHJldGVkOgorCisgIGdldCB7e0Q6XFxIUCBPZmZpY2VKZXQgNTAwXFxJbWFnZXNcXE15IFByZXR0eSBQaWN0dXJlIERvdCBQQ0x9fQorICBnZXQgeyJEOlxcSFAgT2ZmaWNlSmV0IDUwMFxcSW1hZ2VzXFxNeSBQcmV0dHkgUGljdHVyZSBEb3QgUENMIn0KKworICAgVG8gZ2V0IGFyb3VuZCB0aGUgcmVxdWlyZW1lbnQgdG8gZG91YmxlIGJhY2tzbGFzaGVzIGluIGxpdGVyYWwKKyAgIGZpbGVuYW1lcywgb2YgY291cnNlIHlvdSBjYW4gYWxzbyB1c2U6CisKKyAgc2V0IGNvbW1hbmQgcXVvdGluZyBvZmYKKyAgZ2V0IHt7RDpcSFAgT2ZmaWNlSmV0IDUwMFxJbWFnZXNcTXkgUHJldHR5IFBpY3R1cmUgRG90IFBDTH19CisgIGdldCB7IkQ6XEhQIE9mZmljZUpldCA1MDBcSW1hZ2VzXE15IFByZXR0eSBQaWN0dXJlIERvdCBQQ0wifQorICBzZXQgY29tbWFuZCBxdW90aW5nIG9uCisKKyAgIElmIHlvdSBhcmUgZ2l2aW5nIGEgImtlcm1pdCIgY29tbWFuZCB0byB0aGUgVU5JWCBzaGVsbCwgeW91IGhhdmUgdG8KKyAgIG9ic2VydmUgdGhlIHNoZWxsJ3MgcXVvdGluZyBydWxlcywgc29tZXRoaW5nIGxpa2UgdGhpczoKKworICBrZXJtaXQgLWlnICJ7RDpcSFAgT2ZmaWNlSmV0IDUwMFxJbWFnZXNcTXkgUHJldHR5IFBpY3R1cmUgRG90IFBDTH0iCisKKyAgIEhlcmUsIHRoZSBxdW90ZXMgZ28gb24gdGhlIG91dHNpZGUgc28gVU5JWCB3aWxsIHBhc3MgdGhlIGVudGlyZQorICAgZmlsZW5hbWUsIHNwYWNlcywgYnJhY2VzLCBhbmQgYWxsLCBhcyBhIHNpbmdsZSBhcmd1bWVudCB0byBLZXJtaXQsIGFuZAorICAgdGhlIGJhY2tzbGFzaGVzIGFyZSBub3QgZG91YmxlZCBiZWNhdXNlIChhKSB0aGUgVU5JWCBzaGVsbCBpZ25vcmVzCisgICB0aGVtIHNpbmNlIHRoZXkgYXJlIGluIGEgcXVvdGVkIHN0cmluZywgYW5kIChiKSBLZXJtaXQgaWdub3JlcyB0aGVtCisgICBzaW5jZSB0aGUgaW50ZXJhY3RpdmUgY29tbWFuZCBwYXJzZXIgaXMgbm90IGFjdGl2YXRlZCBpbiB0aGlzIGNhc2UuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNS41LiBBdXRvbWF0aWMgT3JpZW50YXRpb24gTWVzc2FnZXMgdXBvbiBEaXJlY3RvcnkgQ2hhbmdlCisKKyAgIEMtS2VybWl0IDcuMCwgd2hlbiBhY3RpbmcgYXMgYSBzZXJ2ZXIsIGNhbiBzZW5kIGFuIG9yaWVudGF0aW9uIG1lc3NhZ2UKKyAgIHRvIHRoZSBjbGllbnQgd2hlbmV2ZXIgdGhlIHNlcnZlciBkaXJlY3RvcnkgY2hhbmdlcy4gRm9yIGV4YW1wbGUsIHdoZW4KKyAgIHRoZSBjbGllbnQgZ2l2ZXMgYSBSRU1PVEUgQ0QgY29tbWFuZCwgdGhlIHNlcnZlciBzZW5kcyB0aGUgY29udGVudHMgb2YKKyAgIHRoZSBuZXcgZGlyZWN0b3J5J3MgIlJlYWQgTWUiIGZpbGUgdG8gdGhlIGNsaWVudCdzIHNjcmVlbi4gVGhlCisgICBmb2xsb3dpbmcgY29tbWFuZHMgZ292ZXJuIHRoaXMgZmVhdHVyZToKKworICAgU0VUIFNFUlZFUiBDRC1NRVNTQUdFIEZJTEUgbmFtZQorICAgICAgICAgIEdpdmVuIHRvIHRoZSBzZXJ2ciwgYWxsb3dzIHRoZSBtZXNzYWdlLWZpbGUgbmFtZSB0byBiZQorICAgICAgICAgIHNwZWNpZmllZCBhdCBydW50aW1lLiBBIGxpc3Qgb2YgbmFtZXMgdG8gbG9vayBmb3IgY2FuIGJlIGdpdmVuCisgICAgICAgICAgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAge3tuYW1lMX17bmFtZTJ9e25hbWUzfXsuLi59fQorCisgICAgICAgICAgZS5nLiBTRVQgU0VSVkVSIENELU1FU1NBR0UgRklMRQorICAgICAgICAgIHt7Li8ucmVhZG1lfXtSRUFETUUuVFhUfXtSRUFELk1FfX0KKworICAgUkVNT1RFIFNFVCBTRVJWRVIgQ0QtTUVTU0FHRSB7IE9OLCBPRkYgfQorICAgICAgICAgIEdpdmVuIHRvIHRoZSBjbGllbnQsIGxldHMgdGhlIGNsaWVudCBjb250cm9sIHdoZXRoZXIgdGhlIHNlcnZlcgorICAgICAgICAgIHNlbmRzIGF1dG9tYXRpYyBDRCBtZXNzYWdlcy4KKworICAgU0hPVyBTRVJWRVIKKyAgICAgICAgICBHaXZlbiB0byBzZXJ2ZXIsIGluY2x1ZGVzIENELU1lc3NhZ2Ugc3RhdHVzLgorCisgICBUaGUgZGVmYXVsdCBDRCBtZXNzYWdlIGZpbGUgbmFtZSBpcyBzeXN0ZW0gZGVwZW5kZW50LiBTSE9XIENEIG9yIFNIT1cKKyAgIFNFUlZFUiBkaXNwbGF5cyB0aGUgbGlzdC4gQWxzbyBzZWUgWzUzM11TZWN0aW9uIDQuNS4yLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDUuNi4gTmV3IFNlcnZlciBDb250cm9scworCisgICBESVNBQkxFIEVOQUJMRQorICAgICAgICAgIEFsbG93cyB0aGUgc2VydmVyIHRvIGNvbmZpZ3VyZWQgc3VjaCB0aGF0IERJU0FCTEVkIGZlYXR1cmVzIGNhbgorICAgICAgICAgIG5vdCBiZSByZS1lbmFibGVkIGJ5IGFueSBtZWFucyAtLSBlLmcuIGlmIHRoZSBjbGllbnQgaXMgc29tZWhvdworICAgICAgICAgIGFibGUgdG8gZ2V0IHRoZSBzZXJ2ZXIgaW50byBjb21tYW5kIG1vZGUuIE9uY2UgRElTQUJMRWQsIEVOQUJMRQorICAgICAgICAgIGNhbiBub3QgYmUgcmUtRU5BQkxFZC4KKworICAgU0VUIFNFUlZFUiBJRExFLVRJTUVPVVQgc2Vjb25kcworICAgICAgICAgIFRoaXMgd2FzIGF2YWlsYWJsZSBwcmV2aW91c2x5IGluIEtlcm1pdCA5NSBvbmx5LiBOb3cgaXQgY2FuIGJlCisgICAgICAgICAgdXNlZCBpbiBDLUtlcm1pdCBhbHNvIHRvIHNwZWNpZnkgYSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzCisgICAgICAgICAgdGhlIHNlcnZlciBpcyBhbGxvd2VkIHRvIGJlIGlkbGUgYmVmb3JlIGV4aXRpbmcgc2VydmVyIG1vZGUuIDAKKyAgICAgICAgICBzZWNvbmRzIG1lYW5zIG5vIGlkbGUgdGltZW91dC4gSW4gQy1LZXJtaXQgKGJ1dCBub3QgSy05NSksIFNFVAorICAgICAgICAgIFNFUlZFUiBUSU1FT1VUIGFuZCBTRVQgU0VSVkVSIElETEUtVElNRU9VVCBhcmUgbXV0dWFsbHkKKyAgICAgICAgICBleGNsdXNpdmUgLS0geW91IGNhbiBoYXZlIG9uZSBvciB0aGUgb3RoZXIgKG9yIG5laXRoZXIpLCBidXQKKyAgICAgICAgICBub3QgYm90aC4gKFNlcnZlciB0aW1lb3V0cyBhcmUgZm9yIHRoZSBiZW5lZml0IG9mIHByaW1pdGl2ZQorICAgICAgICAgIEtlcm1pdCBjbGllbnRzIHRoYXQgYXJlIG5vdCBjYXBhYmxlIG9mIHRpbWluZyBvdXQgb24gdGhlaXIgb3duOworICAgICAgICAgIHRvIG91ciBrbm93bGVkZ2UsIG5vIHN1Y2ggY2xpZW50cyBhcmUgc3RpbGwgaW4gY2lyY3VsYXRpb24uKQorCisgICBTRVQgU0VSVkVSIEtFRVBBTElWRSB7IE9OLCBPRkYgfQorICAgICAgICAgIChTZWUgbmV4dCBzZWN0aW9uKS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA1LjcuIFRpbWVvdXRzIGR1cmluZyBSRU1PVEUgSE9TVCBDb21tYW5kIEV4ZWN1dGlvbgorCisgICBQcmlvciB0byBDLUtlcm1pdCA3LjAsIHRoZSBDLUtlcm1pdCBzZXJ2ZXIgd291bGQgYmxvY2sgd2FpdGluZyBmb3IKKyAgIG91dHB1dCBmcm9tIGEgc3lzdGVtIGNvbW1hbmQgaW52b2tlZCB2aWEgUkVNT1RFIEhPU1QgZnJvbSB0aGUgY2xpZW50LgorICAgSWYgdGhlIHN5c3RlbSBjb21tYW5kIHRvb2sgYSBsb25nIHRpbWUgdG8gZXhlY3V0ZSwgdGhlIGNsaWVudCB3b3VsZAorICAgdGltZSBvdXQgYW5kIHNlbmQgTkFLIHBhY2tldHMuIElmIHRoZSBjb21tYW5kIHRvb2sgdG9vIGxvbmcsIHRoZQorICAgY2xpZW50IHdvdWxkIHJlYWNoIGl0cyByZXRyeSBsaW1pdCBhbmQgZ2l2ZSB1cC4gRXZlbiBpZiBpdCBkaWRuJ3QsIHRoZQorICAgTkFLcyB3b3VsZCBjYXVzZSB1bm5lY2Vzc2FyeSByZXRyYW5zbWlzc2lvbnMuCisKKyAgIEluIHZlcnNpb24gNy4wLCB0aGUgQy1LZXJtaXQgc2VydmVyIChWTVMgYW5kIHNlbGVjdCgpLWNhcGFibGUgVU5JWAorICAgdmVyc2lvbnMgb25seSksIHNlbmRzICJrZWVwYWxpdmUgcGFja2V0cyIgKGVtcHR5IGRhdGEgcGFja2V0cykgb25jZQorICAgcGVyIHNlY29uZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgc3lzdGVtIGNvbW1hbmQgdG8gY29tcGxldGUuIFRoaXMKKyAgIHByb2NlZHVyZSBzaG91bGQgYmUgZW50aXJlbHkgdHJhbnNwYXJlbnQgdG8gdGhlIEtlcm1pdCBjbGllbnQsIGFuZAorICAgc2hvdWxkIHByZXZlbnQgdGhlIHVud2FudGVkIHRpbWVvdXRzIGFuZCBOQUtzLiBXaGVuIEMtS2VybWl0IDcuMAorICAgaXRzZWxmIChvciBLOTUgMS4xLjE5KSBpcyB0aGUgY2xpZW50LCBpdCBwcmludHMgZG90cyB0byBzaG93IHRoZQorICAga2VlcGFsaXZlIHBhY2tldHMuCisKKyAgIFRoZSBrZWVwYWxpdmUgZmVhdHVyZSBjYW4gYmUgdHVybmVkIG9mZiBhbmQgb24gd2l0aDoKKworICBTRVQgU0VSVkVSIEtFRVBBTElWRSB7IE9OLCBPRkYgfQorCisgICBOb3JtYWxseSBpdCBzaG91bGQgYmUgb24uIFR1cm4gaXQgb2ZmIGl0IGlmIGNhdXNlcyB0cm91YmxlIHdpdGggdGhlCisgICBjbGllbnQsIG9yIGlmIGl0IHNlZW1zIHRvIHNsb3cgZG93biB0aGUgc2VydmVyIChhcyBpdCBtaWdodCBvbiBzb21lCisgICBwbGF0Zm9ybXMgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzKS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA2LiBJTlRFUk5BVElPTkFMIENIQVJBQ1RFUiBTRVRTCisKKyAgIFN1cHBvcnQgZm9yIHNldmVyYWwgbmV3IHNpbmdsZS1ieXRlIGNoYXJhY3RlciBzZXRzIHdhcyBhZGRlZCBpbgorICAgQy1LZXJtaXQgNy4wLiBVbmljb2RlIC8gSVNPIDEwNjQ2IGlzIG5vdCB5ZXQgc3VwcG9ydGVkLCBidXQgaXMgYSBoaWdoCisgICBwcmlvcml0eSBmb3IgZm9ydGhjb21pbmcgcmVsZWFzZXMuCisKKyAgNi4wLiBJU08gODg1OS0xNSBMYXRpbiBBbHBoYWJldCA5CisKKyAgIFRvIGFjY29tbW9kYXRlIHRoZSBFdXJvIGN1cnJlbmN5IHN5bWJvbCwgYW5kIHRvIGNvcnJlY3Qgc2V2ZXJhbCBvdGhlcgorICAgbG9uZ3N0YW5kaW5nIHByb2JsZW1zIHdpdGggSVNPIExhdGluIEFscGhhYmV0IDEsIElTTyA4ODU5LTE1IExhdGluCisgICBBbHBoYWJldCA5IHdhcyBpc3N1ZWQgaW4gTWF5IDE5OTguIEl0IGlzIHN1cHBvcnRlZCBieSBDLUtlcm1pdCA3LjAgYXMKKyAgIGEgdHJhbnNmZXIgY2hhcmFjdGVyIHNldCwgYSBmaWxlIGNoYXJhY3RlciBzZXQsIGFuZCBhIHRlcm1pbmFsCisgICBjaGFyYWN0ZXIgc2V0LiBUcmFuc2xhdGlvbnMgdGhhdCBwcmVzZXJ2ZSB0aGUgbmV3IGNoYXJhY3RlcnMgYXJlCisgICBhdmFpbGFibGUgYmV0d2VlbiBMYXRpbi05IGFuZCBzZXZlcmFsIG90aGVyIHNldHMgaW5jbHVkaW5nOgorCisgIFBDIENvZGUgUGFnZSA4NTggICAgICAgICAoV2VzdGVybiBFdXJvcGVhbiBsYW5ndWFnZXMsIHNpbWlsYXIgdG8gQ1A4NTApCisgIFdpbmRvd3MgQ29kZSBQYWdlIDEyNTIgICAoV2VzdGVybiBFdXJvcGVhbiBsYW5ndWFnZXMsIHNpbWlsYXIgdG8gTGF0aW4tMSkKKyAgV2luZG93cyBDb2RlIFBhZ2UgMTI1MCAgIChFYXN0ZXJuIEV1cm9wZWFuIGxhbmd1YWdlcywgc2ltaWxhciB0byBMYXRpbi0yKQorCisgICBUaGUgTGF0aW4tOSB0cmFuc2ZlciBjaGFyYWN0ZXIgc2V0IGFsc28gYWxsb3dzIGZvciB0aGUgT0UgZGlncmFwaAorICAgY2hhcmFjdGVyLCB1c2VkIHByaW1hcmlseSBpbiBGcmVuY2gsIHRvIGJlIHByZXNlcnZlZCBpbiB0cmFuc2ZlcnMKKyAgIGludm9sdmluZyB0aGUgREVDIE1DUyBvciBOZVhUIGNoYXJhY3RlciBzZXRzLgorCisgICBUaGUgRXVybyBjaGFyYWN0ZXIgaXMgYWxzbyBwcmVzZW50IGluIHRoZSBVbml2ZXJzYWwgQ2hhcmFjdGVyIFNldCwKKyAgIGRlc2NyaWJlZCBpbiBbNTM0XVNlY3Rpb24gNi42LgorCisgIDYuMS4gVGhlIEhQLVJvbWFuOCBDaGFyYWN0ZXIgU2V0CisKKyAgIFRoZSBIUC1Sb21hbjggY2hhcmFjdGVyIHNldCBpcyBzdXBwb3J0ZWQgaW4gQy1LZXJtaXQgNi4wIGFuZCBsYXRlciBidXQKKyAgIHdhcyBvbWl0dGVkIGZyb20gVGFibGUgVklJLTQgaW4gdGhlIDJuZCBFZGl0aW9uIG9mIFVzaW5nIEMtS2VybWl0IGR1ZQorICAgdG8gbGFjayBvZiBzcGFjZS4gSXQgaXMgbGlzdGVkIGluIFs1MzVdQXBwZW5kaXggSUlJLgorCisgIDYuMi4gR3JlZWsgQ2hhcmFjdGVyIFNldHMKKworICAgR3JlZWsgY2hhcmFjdGVyIHNldHMgd2VyZSBhZGRlZCBpbiA2LjE6CisKKyAgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCB7IENQODY5LCBFTE9UOTI3LCBHUkVFSy1JU08gfQorICBTRVQgVFJBTlNGRVIgQ0hBUkFDVEVSLVNFVCB7IEdSRUVLLUlTTyB9CisKKyAgIEdSRUVLLUlTTyBpcyBJU08gODg1OS03LCB3aGljaCB0aGUgc2FtZSBhcyBFTE9UIDkyOC4KKworICAgVGhlIG5ldyBHcmVlayBjaGFyYWN0ZXIgc2V0cyBhcmUgbGlzdGVkIGluIFs1MzZdQXBwZW5kaXggSUlJLgorCisgIDYuMy4gQWRkaXRpb25hbCBMYXRpbi0yIENoYXJhY3RlciBTZXRzCisKKyAgIFRoZSBmb2xsb3dpbmcgaGF2ZSBiZWVuIGFkZGVkIGFzIEZJTEUgYW5kIFRFUk1JTkFMIENIQVJBQ1RFUi1TRVRzOgorCisgICBNQVpPVklBLVBDCisgICAgICAgICAgQSBQQyBjb2RlIHBhZ2UgdXNlZCBpbiBQb2xhbmQsIGVxdWl2YWxlbnQgdG8gQ1A0MzcsIGJ1dCB3aXRoIDE4CisgICAgICAgICAgc3Vic3RpdHV0aW9ucyBuZWVkZWQgZm9yIFBvbGlzaC4KKworICAgQ1AxMjUwCisgICAgICAgICAgVGhlIFdpbmRvd3MgTGF0aW4gMiBDb2RlIFBhZ2UuIEVxdWl2YWxlbnQgdG8gSVNPIDg4NTktMiwgYnV0CisgICAgICAgICAgd2l0aCBkaWZmZXJlbnQgZW5jb2RpbmcuCisKKyAgNi40LiBBZGRpdGlvbmFsIEN5cmlsbGljIENoYXJhY3RlciBTZXRzCisKKyAgIFRoZSBmb2xsb3dpbmcgaGF2ZSBiZWVuIGFkZGVkIGFzIEZJTEUgYW5kIFRFUk1JTkFMIENIQVJBQ1RFUi1TRVRzOgorCisgICBCVUxHQVJJQS1QQworICAgICAgICAgIFRoaXMgaXMgdGhlIEN5cmlsbGljIFBDIGNvZGUgcGFnZSB1c2VkIGluIEJ1bGdhcmlhLCB3aGVyZSBpdCBpcworICAgICAgICAgIGNhbGxlZCBDb2RlIFBhZ2UgODU2LiBJdCBpcyBhdHRyaWJ1dGVkIHRvIGEgY29tcGFueSBjYWxsZWQKKyAgICAgICAgICBEQVRFQywgSW5jLCBidXQgQ1A4NTYgaXMgbm90IGEgcHJvcGVyIGRlc2lnbmF0aW9uLCBzaW5jZSBpdAorICAgICAgICAgIHJlZmVycyB0byBhIEhlYnJldyBDb2RlIFBhZ2UgKHNlZSB0aGUgSUJNIFJlZ2lzdHJ5KS4KKworICAgQ1A4NTUKKyAgICAgICAgICBUaGlzIFBDIENvZGUgUGFnZSBjb250YWlucyBhbGwgdGhlIEN5cmlsbGljIGxldHRlcnMgdGhhdCBhcmUKKyAgICAgICAgICBhbHNvIGluIElTTyA4ODU5LTUsIGFuZCBpcyB0aGVyZWZvcmUgdXNlZnVsIGZvciBub24tUnVzc2lhbgorICAgICAgICAgIEN5cmlsbGljIHRleHQgKFVrcmFpbmlhbiwgQmVsb3J1c3NpYW4sIGV0YyksIHVubGlrZSBDUDg2NiwKKyAgICAgICAgICB3aGljaCBoYXMgYSBzbWFsbGVyIHJlcGVydG9pcmUgb2YgQ3lyaWxsaWMgbGV0dGVycy4KKworICAgQ1AxMjUxCisgICAgICAgICAgVGhlIFdpbmRvd3MgQ3lyaWxsaWMgQ29kZSBQYWdlLiBFcXVpdmFsZW50IHRvIENQODU1LCBidXQgd2l0aAorICAgICAgICAgIGRpZmZlcmVudCBlbmNvZGluZy4KKworICAgS09JOFIKKyAgICAgICAgICBBbiBleHRlbnNpb24gdG8gIk9sZCBLT0ktOCIgdGhhdCBhZGRzIHVwcGVyIGFuZCBsb3dlciBjYXNlCisgICAgICAgICAgQ3lyaWxsaWMgbGV0dGVyIElvIChsb29rcyBsaWtlIFJvbWFuIEUgd2l0aCBkaWFlcmVzaXMpIHBsdXMgYQorICAgICAgICAgIHNlbGVjdGlvbiBvZiBib3gtZHJhd2luZyBjaGFyYWN0ZXJzIHRvIGNvbHVtbnMgOCB0aHJvdWdoIDExLAorICAgICAgICAgIHdoaWNoIGFyZSB2YWNhbnQgaW4gb3JpZ2luYWwgT2xkIEtPSS04LiBLT0k4LVIgaXMgdXNlZCBmb3IgdGhlCisgICAgICAgICAgUnVzc2lhbiBsYW5ndWFnZS4gSXQgaXMgc3BlY2lmaWVkIGluIFs1MzddUkZDIDE0ODkuCisKKyAgIEtPSThVCisgICAgICAgICAgQSBzaW1pbGFyIGV4dGVuc2lvbiBvZiBPbGQgS09JLTgsIGJ1dCBmb3IgVWtyYWluaWFuLiBJdCBpcworICAgICAgICAgIHNwZWNpZmllZCBpbiBbNTM4XVJGQyAyMzE5LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDYuNS4gQXV0b21hdGljIENoYXJhY3Rlci1TZXQgU3dpdGNoaW5nCisKKyAgIFByaW9yIHRvIHZlcnNpb24gNy4wLCBDLUtlcm1pdCdzIGZpbGUgY2hhcmFjdGVyLXNldCBhbHdheXMgaGFkIHRvIGJlCisgICBzZXQgZXhwbGljaXRseS4gSW4gNy4wIGFuZCBsYXRlciwgaXQgaXMgc2V0IGF1dG9tYXRpY2FsbHkgd2hlbjoKKworICAgIDEuIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIChhcyBpdCBpcyB1bmxlc3MgeW91IGRpc2FibGUgaXQpLgorICAgIDIuIEFuIGluY29taW5nIHRleHQtbW9kZSB0cmFuc2ZlciBpbmNsdWRlcyBhIHRyYW5zZmVyLWNoYXJhY3Rlci1zZXQKKyAgICAgICBhbm5vdW5jZXIgYW5kIHlvdSBoYXZlIG5vdCBwcmV2aW91c2x5IGdpdmVuIGEgU0VUIEZJTEUKKyAgICAgICBDSEFSQUNURVItU0VUIGNvbW1hbmQuIEluIHRoaXMgY2FzZSwgQy1LZXJtaXQgc3dpdGNoZXMgdG8gYW4KKyAgICAgICBhcHByb3ByaWF0ZSBmaWxlIGNoYXJhY3RlciBzZXQuIEZvciBleGFtcGxlLCBvbiBhbiBIUC1VWAorICAgICAgIHdvcmtzdGF0aW9uLCBhbiBpbmNvbWluZyBMYXRpbi0xIGZpbGUgYXV0b21hdGljYWxseSBzZWxlY3RzCisgICAgICAgSFAtUm9tYW44IGZvciB0aGUgbG9jYWwgY29weSBvZiB0aGUgZmlsZTsgaW4gRGF0YSBHZW5lcmFsIEFPUy9WUywKKyAgICAgICBpdCB3b3VsZCBzZWxlY3QgREcgSW50ZXJuYXRpb25hbC4KKyAgICAzLiBZb3UgZ2l2ZSBhIFNFVCBUUkFOU0ZFUiBDSEFSQUNURVItU0VUIGNvbW1hbmQgd2l0aG91dCBoYXZpbmcKKyAgICAgICBwcmV2aW91c2x5IHNwZWNpZmllZCBhIEZJTEUgQ0hBUkFDVEVSLVNFVC4gQW4gYXBwcm9wcmlhdGUgZmlsZQorICAgICAgIGNoYXJhY3Rlci1zZXQgaXMgY2hvc2VuIGF1dG9tYXRpY2FsbHkuCisKKyAgIEluIGFkZGl0aW9uLCB3aGVuIHlvdSBnaXZlIGEgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCBjb21tYW5kLCB0aGUKKyAgIGFwcHJvcHJpYXRlIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQgaXMgYXV0b21hdGljYWxseSBjaG9zZW4sIHRvIGJlIHVzZWQKKyAgIHdoZW4geW91IGFyZSBzZW5kaW5nIGZpbGVzIChidXQgdGhpcyBkb2VzIG5vdCBvdmVycmlkZSB0aGUgb25lCisgICBhbm5vdW5jZWQgYnkgdGhlIHNlbmRlciB3aGVuIHlvdSBhcmUgcmVjZWl2aW5nIGZpbGVzKS4KKworICAgWW91IG1pZ2h0IG5vdCBhZ3JlZSBhYm91dCB3aGF0IGlzICJhcHByb3ByaWF0ZSIsIHNvIG9mIGNvdXJzZSB5b3UgY2FuCisgICBkaXNhYmxlIG9yIGNoYW5nZSBhbGwgb2YgdGhlIGFib3ZlIGFjdGlvbnMuCisKKyAgIFlvdSBjYW4gZGlzYWJsZSAob3IgcmUtZW5hYmxlKSB0aGUgbmV3IGF1dG9tYXRpYyBjaGFyYWN0ZXItc2V0CisgICBzd2l0Y2hpbmcgZmVhdHVyZSBpbiBlYWNoIGRpcmVjdGlvbiBzZXBhcmF0ZWx5OgorCisgICBTRVQgUkVDRUlWRSBDSEFSQUNURVItU0VULVNFTEVDVElPTiB7IEFVVE9NQVRJQywgTUFOVUFMIH0KKyAgICAgICAgICBBVVRPTUFUSUMgaXMgdGhlIGRlZmF1bHQsIGNhdXNpbmcgdGhlIGJlaGF2aW9yIGRlc2NyaWJlZCBhYm92ZQorICAgICAgICAgIHdoZW4gYW4gaW5jb21pbmcgZmlsZSBhcnJpdmVzLiBDaG9vc2UgTUFOVUFMIHRvIGRlZmVhdCB0aGlzCisgICAgICAgICAgYmVoYXZpb3IgYW5kIGZvcmNlIHlvdXIgY3VycmVudCBGSUxFIENIQVJBQ1RFUi1TRVQgc2V0dGluZyB0bworICAgICAgICAgIGJlIHVzZWQsIG5vIG1hdHRlciB3aGF0IGl0IGlzLiBOb3RlIHRoYXQgU0VUIFJFQ0VJVkUKKyAgICAgICAgICBDSEFSQUNURVItU0VUIE1BTlVBTCBkb2VzIG5vdCBkaXNhYmxlIHJlY29nbml0aW9uIG9mIHRoZQorICAgICAgICAgIGluY29taW5nIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQgYW5ub3VuY2VyLCBhbmQgdHJhbnNsYXRpb24gZnJvbQorICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJhY3Rlci1zZXQgdG8geW91ciBjdXJyZW50IGZpbGUKKyAgICAgICAgICBjaGFyYWN0ZXItc2V0LiBUbyBkaXNhYmxlIHRoYXQsIHVzZSBTRVQgQVRUUklCVVRFIENIQVJBQ1RFUi1TRVQKKyAgICAgICAgICBPRkYuCisKKyAgIFNFVCBTRU5EIENIQVJBQ1RFUi1TRVQtU0VMRUNUSU9OIHsgQVVUT01BVElDLCBNQU5VQUwgfQorICAgICAgICAgIEFnYWluIEFVVE9NQVRJQyBpcyB0aGUgZGVmYXVsdCwgY2F1c2luZyB0aGUgYmVoYXZpb3IgZGVzY3JpYmVkCisgICAgICAgICAgYWJvdmUgd2hlbiB5b3UgZ2l2ZSBhIFNFVCB7IEZJTEUsIFRSQU5TRkVSIH0gQ0hBUkFDVEVSLVNFVAorICAgICAgICAgIGNvbW1hbmQuIFVzZSBNQU5VQUwgdG8gYWxsb3cgeW91IHRvIHNwZWNpZnkgdGhlIHRyYW5zZmVyIGFuZAorICAgICAgICAgIGZpbGUgY2hhcmFjdGVyLXNldHMgaW5kZXBlbmRlbnRseS4KKworICAgU0hPVyBDSEFSQUNURVItU0VUUworICAgICAgICAgIFRlbGxzIHNldHRpbmdzIG9mIHsgU0VORCwgUkVDRUlWRSB9IENIQVJBQ1RFUi1TRVQtU0VMRUNUSU9OLgorCisgICBOb3JtYWxseSwgaG93ZXZlciwgaXQgaXMgbW9yZSBjb252ZW5pZW50IHRvIGxlYXZlIGF1dG9tYXRpYyBzd2l0Y2hpbmcKKyAgIGFjdGl2ZSwgYW5kIGNoYW5nZSBhbnkgYXNzb2NpYXRpb25zIHRoYXQgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgeW91cgorICAgYXBwbGljYXRpb24sIGFyZWEsIG9yIGNvdW50cnkuIFRoZSBjb21tYW5kcyBhcmU6CisKKyAgIFNIT1cgQVNTT0NJQVRJT05TCisgICAgICAgICAgVGhpcyBjb21tYW5kIGxpc3RzIGFsbCB0aGUgYXNzb2NpYXRpb25zIGluIGVhY2ggZGlyZWN0aW9uOiBmb3IKKyAgICAgICAgICBlYWNoIHBvc3NpYmxlIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQsIGl0IGxpc3RzIHRoZSBhc3NvY2lhdGVkCisgICAgICAgICAgZmlsZSBjaGFyYWN0ZXItc2V0LCBhbmQgdmljZSB2ZXJzYS4gVGhlc2UgYXJlIHR3byBzZXBhcmF0ZSBhbmQKKyAgICAgICAgICBpbmRlcGVuZGVudCBsaXN0cy4KKworICAgQVNTT0NJQVRFIFRSQU5TRkVSLUNIQVJBQ1RFUi1TRVQgbmFtZTEgWyBuYW1lMiBdCisgICAgICAgICAgQ2hhbmdlcyB0aGUgYXNzb2NpYXRpb24gZm9yIHRoZSB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IG5hbWUxIHRvCisgICAgICAgICAgYmUgdGhlIGZpbGUgY2hhcmFjdGVyLXNldCBuYW1lMi4gSWYgbmFtZTIgaXMgb21pdHRlZCwgYXV0b21hdGljCisgICAgICAgICAgc3dpdGNoaW5nIGlzIGRpc2FibGVkIGZvciB0aGlzIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQgb25seS4KKworICAgQVNTT0NJQVRFIEZJTEUtQ0hBUkFDVEVSLVNFVCBuYW1lMSBbIG5hbWUyIF0KKyAgICAgICAgICBDaGFuZ2VzIHRoZSBhc3NvY2lhdGlvbiBmb3IgdGhlIGZpbGUgY2hhcmFjdGVyLXNldCBuYW1lMSB0byBiZQorICAgICAgICAgIHRoZSB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IG5hbWUyLiBJZiBuYW1lMiBpcyBvbWl0dGVkLAorICAgICAgICAgIGF1dG9tYXRpYyBzd2l0Y2hpbmcgaXMgZGlzYWJsZWQgZm9yIHRoaXMgZmlsZSBjaGFyYWN0ZXItc2V0CisgICAgICAgICAgb25seS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA2LjYuIFVOSUNPREUKKworICAgQy1LZXJtaXQgNy4wIGFkZHMgc3VwcG9ydCBmb3IgVW5pY29kZSwgdGhlIFVuaXZlcnNhbCBDaGFyYWN0ZXIgU2V0LAorICAgZm9yOgorCisgICAgICogRmlsZSBUcmFuc2ZlciAoU0VORCwgUkVDRUlWRSwgR0VULCBldGMpCisgICAgICogVGVybWluYWwgY29ubmVjdGlvbiAoQ09OTkVDVCkKKyAgICAgKiBVbmd1YXJkZWQgZmlsZSBjYXB0dXJlIChMT0cgU0VTU0lPTikKKyAgICAgKiBVbmd1YXJkZWQgZmlsZSB0cmFuc21pc3Npb24gKFRSQU5TTUlUKQorICAgICAqIExvY2FsIGZpbGUgY2hhcmFjdGVyLXNldCBjb252ZXJzaW9uIChUUkFOU0xBVEUpCisKKyAgIEMtS2VybWl0IGlzIG5vdCwgaG93ZXZlciwgYSAiVW5pY29kZSBhcHBsaWNhdGlvbiIgaW4gdGhlIHNlbnNlIHRoYXQKKyAgIGl0cyBjb21tYW5kcywgbWVzc2FnZXMsIG9yIHVzZXIgaW50ZXJmYWNlIGFyZSBVbmljb2RlLiBSYXRoZXIsIGl0IGlzCisgICAiVW5pY29kZSBhd2FyZSIgaW4gaXRzIGFiaWxpdHkgdG8gaGFuZGxlIGFuZCBjb252ZXJ0IFVuaWNvZGUgdGV4dCBpbgorICAgdGhlIGNvdXJzZSBvZiBmaWxlIHRyYW5zZmVyIGFuZCB0ZXJtaW5hbCBjb25uZWN0aW9uLCBhbmQgeW91IGNhbiBhbHNvCisgICB1c2UgS2VybWl0IHRvIGNvbnZlcnQgbG9jYWwgZmlsZXMgYmV0d2VlbiBVbmljb2RlIGFuZCBvdGhlciBjaGFyYWN0ZXIKKyAgIHNldHMuIFRMQSdzOgorCisgIEJNUCAtIEJhc2UgTXVsdGlsaW5ndWFsIFBsYW5lCisgIEJPTSAtIEJ5dGUgT3JkZXIgTWFyaworICBDSksgLSBDaGluZXNlLCBKYXBhbmVzZSwgYW5kIEtvcmVhbgorICBJU08gLSBJbnRlcm5hdGlvbmFsIFN0YW5kYXJkcyBPcmdhbml6YXRpb24KKyAgVExBIC0gVGhyZWUtTGV0dGVyIEFjcm9ueW0KKyAgVUNTIC0gVW5pdmVyc2FsIENoYXJhY3RlciBTZXQKKyAgVVRGIC0gVUNTIFRyYW5zZm9ybWF0aW9uIEZvcm1hdAorCisgICBVbmljb2RlIGFuZCBJU08gMTA2NDYgYXJlIHRoZSBjb29yZGluYXRlZCBhbmQgY29tcGF0aWJsZSBjb3Jwb3JhdGUgYW5kCisgICBpbnRlcm5hdGlvbmFsIHN0YW5kYXJkcyBmb3IgdGhlIFVuaXZlcnNhbCBDaGFyYWN0ZXIgU2V0IChVQ1MpLiBVbmxpa2UKKyAgIHNpbmdsZS1ieXRlIGFuZCBldmVuIG1vc3QgbXVsdGlieXRlIGNoYXJhY3RlciBzZXRzLCB0aGUgVUNTIGNhbgorICAgcmVwcmVzZW50IGFsbCBjaGFyYWN0ZXJzIGluIGV2ZXJ5IGV4aXN0aW5nIHdyaXRpbmcgc3lzdGVtLiBBIGZsYXQKKyAgIHBsYWluLXRleHQgZmlsZSBlbmNvZGVkIGluIHNvbWUgZm9ybSBvZiBVQ1MgY2FuIGNvbnRhaW4gYW55IG1peHR1cmUgb2YKKyAgIEVuZ2xpc2gsIFNwYW5pc2gsIEl0YWxpYW4sIEdlcm1hbiwgSGVicmV3LCBBcmFiaWMsIEdyZWVrLCBSdXNzaWFuLAorICAgQXJtZW5pYW4sIEdlb3JnaWFuLCBKYXBhbmVzZSwgQ2hpbmVzZSwgS29yZWFuLCBWaWV0bmFtZXNlLCBUaWJldGFuLAorICAgSGluZGksIEJlbmdhbGksIFRhbWlsLCBUaGFpLCBFdGhpb3BpYywgYW5kIHNvIG9uLCBwbHVzIHNjaWVudGlmaWMgYW5kCisgICBtYXRoZW1hdGljYWwgbm90YXRpb24sIGFzIHdlbGwgYXMgdGV4dHMgaW4gUnVuZXMsIE9naGFtLCBHbGFnb2xpdGljLAorICAgYW5kIG90aGVyIGhpc3RvcmljIHNjcmlwdHMuCisKKyAgIFRoZSBVQ1MgYWxyZWFkeSBjb3ZlcnMgdGhlc2Ugc2NyaXB0cyBhbmQgbWFueSBtb3JlLCBidXQgaXQncyBhbgorICAgZXZvbHZpbmcgc3RhbmRhcmQgd2l0aCBlZmZvcnRzIHVuZGVyd2F5IHRvIGFjY29tbW9kYXRlIGV2ZW4gbW9yZQorICAgbGFuZ3VhZ2VzIGFuZCB3cml0aW5nIHN5c3RlbXMuIFN1cHBvcnQgaXMgZ3Jvd2luZyBmb3IgbmF0aXZlIFVDUyB1c2UKKyAgIG9uIG1hbnkgcGxhdGZvcm1zIGFuZCBpbiBtYW55IGFwcGxpY2F0aW9ucy4gVGhlIGdvYWwgb2YgdGhlIGZyYW1lcnMgb2YKKyAgIHRoZSBVQ1MgaXMgZm9yIGl0IHRvIHJlcGxhY2UgQVNDSUksIHRoZSBJU08gTGF0aW4gQWxwaGFiZXRzLCBJU0NJSSwKKyAgIFZJU0NJSSwgdGhlIENoaW5lc2UsIEphcGFuZXNlLCBhbmQgS29yZWFuIChDSkspIG11bHRpYnl0ZSBzZXRzLCBldGMsCisgICBhcyB3ZWxsIGFzIHRoZSBtYW55IHByaXZhdGUgY2hhcmFjdGVyIHNldHMgaW4gdXNlIHRvZGF5LCBpbiBvdGhlcgorICAgd29yZHMgdG8gYmVjb21lICp0aGUqIFVuaXZlcnNhbCBDaGFyYWN0ZXIgU2V0LgorCisgICBVbnRpbCB0aGF0IHRpbWUsIGhvd2V2ZXIsIGNvbnZlcnNpb25zIGJldHdlZW4gZXhpc3Rpbmcgc2V0cyBhbmQgdGhlCisgICBVQ1Mgd2lsbCBiZSBuZWNlc3Nhcnkgd2hlbiBtb3ZpbmcgdGV4dCBiZXR3ZWVuIHBsYXRmb3JtcyBhbmQKKyAgIGFwcGxpY2F0aW9ucy4gTm93IEtlcm1pdCBjYW4gaGVscC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDYuNi4xLiBPdmVydmlldyBvZiBVbmljb2RlCisKKyAgIEZvciBhIG1vcmUgY29tcGxldGUgcGljdHVyZSwgcGxlYXNlIHZpc2l0OgorCisgIFs1MzldaHR0cDovL3d3dy51bmljb2RlLm9yZy8KKworICAgYW5kIGFjY2VzcyB0aGUgdmFyaW91cyBvbmxpbmUgaW50cm9kdWN0aW9ucywgRkFRcywgdGVjaG5pY2FsIHJlcG9ydHMsCisgICBhbmQgb3RoZXIgaW5mb3JtYXRpb24uIEZvciBncmVhdGVyIGRlcHRoLCBvcmRlciB0aGUgbGF0ZXN0IHZlcnNpb24gb2YKKyAgIHRoZSBwdWJsaXNoZWQgVW5pY29kZSBTdGFuZGFyZC4gVGhlIGZvbGxvd2luZyBvdmVydmlldyBjb250YWlucyBhCisgICBncmVhdCBtYW55IG92ZXJzaW1wbGlmaWNhdGlvbnMgYW5kIHBlcmhhcHMgYW4gb3BpbmlvbiBvciB0d28uCisKKyAgIEF0IHByZXNlbnQsIHRoZSBVQ1MgaXMgYSAxNi1iaXQgKDItYnl0ZSkgY2hhcmFjdGVyIHNldCwgYnV0IHdpdGgKKyAgIHByb3Zpc2lvbnMgdG8gZ3JvdyB0byBhIDQtYnl0ZSBzZXQuIFVDUy0yIHJlZmVycyB0byB0aGUgdHdvLWJ5dGUgc2V0LAorICAgYWxzbyBjYWxsZWQgdGhlIEJhc2UgTXVsdGlsaW5ndWFsIFBsYW5lIChCTVApLCBpbiB3aGljaCBlYWNoIGNoYXJhY3RlcgorICAgaGFzIDE2IGJpdHMsIGFuZCB0aGVyZWZvcmUgdGhlcmUgYXJlIDJeMTYgPSA2NTUzNiBwb3NzaWJsZSBjaGFyYWN0ZXJzLgorICAgVGhlIGZpcnN0IDEyOCBjaGFyYWN0ZXJzIGFyZSB0aGUgc2FtZSBhcyBVUyBBU0NJSSAoQzAgY29udHJvbAorICAgY2hhcmFjdGVycyBhbmQgREVMIGluY2x1ZGVkKSwgdGhlIG5leHQgMzIgYXJlIHRoZSBDMSBjb250cm9sCisgICBjaGFyYWN0ZXJzIG9mIElTTyA2NDI5LCBhbmQgdGhlIG5leHQgOTYgYXJlIHRoZSBSaWdodCBIYWxmIG9mIElTTworICAgODg1OS0xIExhdGluIEFscGhhYmV0IDEuIFRoZSByZW1haW5pbmcgdGVucyBvZiB0aG91c2FuZHMgb2YgY2hhcmFjdGVycworICAgYXJlIGFycmFuZ2VkIG5ld2x5IGZvciB0aGUgVUNTLCB1c3VhbGx5IChidXQgbm90IGFsd2F5cykgaW4gc2VjdGlvbnMKKyAgIGNvcnJlc3BvbmRpbmcgdG8gZXhpc3Rpbmcgc3RhbmRhcmRzLCBzdWNoIGFzIElTTyBMYXRpbi9DeXJpbGxpYywgb2Z0ZW4KKyAgIHBsdXMgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIG5vdCBhcHBlYXJpbmcgaW4gdGhlIGV4aXN0aW5nIHN0YW5kYXJkcyBkdWUKKyAgIHRvIGxhY2sgb2Ygc3BhY2UgKG9yIG90aGVyIHJlYXNvbnMpLgorCisgICBJU08gMTA2NDYgYWxsb3dzIGZvciBhZGRpdGlvbmFsIHBsYW5lcywgZS5nLiBmb3IgRWd5cHRpYW4KKyAgIGhpZXJvZ2x5cGhpY3Mgb3IgYW5jaWVudCAob3Igb3RoZXIgZXNvdGVyaWMpIENKSyBjaGFyYWN0ZXJzLCBidXQgdGhlc2UKKyAgIHBsYW5lcyBhcmUgbm90IHlldCBkZWZpbmVkIGFuZCBzbyB3ZSB3aWxsIHNheSBub3RoaW5nIG1vcmUgYWJvdXQgdGhlbQorICAgaGVyZSwgZXhjZXB0IHRoYXQgdGhlaXIgdXNlIHdpbGwgcmVxdWlyZSB0aGUgNC1ieXRlIGZvcm0gb2YgVUNTLAorICAgY2FsbGVkIFVDUy00LCBpbiBzb21lIGZvcm0gKG1vcmUgYWJvdXQgImZvcm1zIiBpbiBbNTQwXVNlY3Rpb24gNi42LjIpLgorCisgICBVbmljb2RlIGFuZCBJU08gMTA2NDYgYXJlIGNvbnN0YW50bHkgdW5kZXIgcmV2aXNpb24sIG1haW5seSB0byBhZGQgbmV3CisgICBjaGFyYWN0ZXJzLiBUaGUgVW5pY29kZSByZXZpc2lvbiBpcyBkZW5vdGVkIGJ5IGEgdmVyc2lvbiBudW1iZXIsIHN1Y2gKKyAgIGFzIDEuMCwgMS4xLCAyLjAsIDMuMC4gVGhlIElTTyAxMDY0NiBzdGFuZGFyZCByZXZpc2lvbiBpcyBpZGVudGlmaWVkCisgICBieSBFZGl0aW9uIChzdWNoIGFzIElTTyAxMDY0Ni0xIDE5OTMpLCBwbHVzIHJlZmVyZW5jZSB0byBhbnkKKyAgIGFtZW5kbWVudHMuIFRoZSBmaXJzdCB2ZXJzaW9ucyBvZiB0aGVzZSBzdGFuZGFyZHMgaW5jbHVkZWQgZW5jb2RpbmdzCisgICBmb3IgS29yZWFuIEhhbmd1bCBzeWxsYWJsZXMgKEphbW9zKTsgdGhlc2UgZW5jb2RpbmdzIHdlcmUgY2hhbmdlZCBpbgorICAgdmVyc2lvbiAxLjEgb2YgVW5pY29kZSBhbmQgYnkgQW1lbmRtZW50IDUgdG8gSVNPIDEwNjQ2LTEuIFRoZSBVbmljb2RlCisgICBUZWNobmljYWwgQ29tbWl0dGVlIGFuZCB0aGUgSVNPIGFja25vd2xlZGdlIHRoYXQgdGhpcyB3YXMgYSBiYWQgdGhpbmcKKyAgIHRvIGRvLCBhbmQgcHJvbWlzZSBuZXZlciBjaGFuZ2UgZW5jb2RpbmdzIG9yIGNoYXJhY3RlciBuYW1lcyBhZ2FpbiwKKyAgIHNpbmNlIHRoaXMgcG9zZXMgc2VyaW91cyBwcm9ibGVtcyBmb3IgY29uZm9ybWFuY2UgYW5kIGRhdGEKKyAgIGludGVyY2hhbmdlLgorCisgICBBIFVDUy0yIHZhbHVlIGlzIGN1c3RvbWFyaWx5IHdyaXR0ZW4gbGlrZSB0aGlzOgorCisgIFUreHh4eAorCisgICB3aGVyZSAieHh4eCIgcmVwcmVzZW50cyBmb3VyIGhleGFkZWNpbWFsIGRpZ2l0cywgMC05IGFuZCBBLUYuIEZvcgorICAgZXhhbXBsZSwgVSswMDQxIGlzICJBIiwgVSswMEMxIGlzIEEtYWN1dGUsIFUrMDQyRiBpcyB1cHBlcmNhc2UKKyAgIEN5cmlsbGljICJZYSIsIFUrRkI0RiBpcyBIZWJyZXcgTGlnYXR1cmUgQWxlZiBMYW1lZCwgYW5kIFUrRkZGRCBpcyB0aGUKKyAgIHNwZWNpYWwgY2hhcmFjdGVyIHRoYXQgbWVhbnMgIm5vdCBhIGNoYXJhY3RlciIuCisKKyAgIE1vc3QgY2hhcmFjdGVycyBmcm9tIHdpZGVseS11c2VkIGFscGhhYmV0aWMgd3JpdGluZyBzeXN0ZW1zIHN1Y2ggYXMKKyAgIHRoZSBXZXN0IEV1cm9wZWFuIG9uZXMsIEN5cmlsbGljLCBHcmVlaywgSGVicmV3LCBWaWV0bmFtZXNlLCBldGMsIGFyZQorICAgYXZhaWxhYmxlIGluICJwcmVjb21wb3NlZCIgZm9ybTsgZm9yIGV4YW1wbGUgVXBwZXJjYXNlIExhdGluIExldHRlciBBCisgICB3aXRoIEFjdXRlIEFjY2VudCBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgKGFzIGl0IGlzIGluIExhdGluLTEpLgorICAgSG93ZXZlciwgdGhlIFVDUyBhbHNvIHBlcm1pdHMgY29tcG9zaXRpb24gb2YgYSBiYXNlIGNoYXJhY3RlciB3aXRoIG9uZQorICAgb3IgbW9yZSBub25zcGFjaW5nIGRpYWNyaXRpY3MuIFRoaXMgbWVhbnMgdGhlIHNhbWUgY2hhcmFjdGVyIGNhbiBiZQorICAgcmVwcmVzZW50ZWQgaW4gbW9yZSB0aGFuIG9uZSB3YXksIHdoaWNoIGNhbiBwcmVzZW50IHByb2JsZW1zIGluIG1hbnkKKyAgIGFwcGxpY2F0aW9uIGFyZWFzLCBpbmNsdWRpbmcgdHJhbnNmZXIgYW5kIGNoYXJhY3Rlci1zZXQgY29udmVyc2lvbiBvZgorICAgdGV4dC4KKworICAgQ29udmVyc2lvbiBmcm9tIEFTQ0lJIG9yIExhdGluLTEgdG8gVUNTLTIgdGV4dCBpcyAidHJpdmlhbCI6IHNpbXBseQorICAgaW5zZXJ0IGEgTlVMICgwKSBieXRlIGJlZm9yZSBlYWNoIEFTQ0lJIG9yIExhdGluLTEgYnl0ZS4gQ29udmVydGluZyBpbgorICAgdGhlIHJldmVyc2UgZGlyZWN0aW9uIChwcm92aWRlZCB0aGUgVUNTLTIgZmlsZSBjb250YWlucyBvbmx5IFUrMDAwMCB0bworICAgVSswMEZGKSBpcyBlcXVhbGx5IHNpbXBsZSAoaWYgd2UgaWdub3JlIHRoZSBpc3N1ZSBvZiBjb21wb3NpdGlvbik6CisgICByZW1vdmUgZXZlcnkgc2Vjb25kIChOVUwpIGJ5dGUuIENvbnZlcnNpb24gb2Ygb3RoZXIgY2hhcmFjdGVyIHNldHMgdG8KKyAgIGFuZCBmcm9tIFVDUywgaG93ZXZlciwgcmVxdWlyZXMgdGFibGVzIG9yIGFsZ29yaXRobXMgc3BlY2lmaWMgdG8gZWFjaAorICAgc2V0LiBOZXZlcnRoZWxlc3MsIHRoZSByZWxhdGl2ZWx5IHRyYW5zcGFyZW50IHVwd2FyZHMgY29tcGF0aWJpbGl0eQorICAgZnJvbSBBU0NJSSBhbmQgTGF0aW4tMSwgaW4gd2hpY2ggYSB2ZXJ5IGxhcmdlIHNoYXJlIG9mIHRoZSB3b3JsZCdzCisgICB0ZXh0dWFsIGRhdGEgaXMgZW5jb2RlZCwgZ2l2ZXMgdGhlIFVDUyBhbiBlbnRyZWUgb250byBleGlzdGluZworICAgcGxhdGZvcm1zLgorCisgICBCdXQgdGhlIDItYnl0ZSBmb3JtYXQgYW5kIHRoZSBwcmVwb25kZXJhbmNlIG9mIE5VTCBhbmQgb3RoZXIgY29udHJvbAorICAgYnl0ZXMgaW4gVUNTLTIgdGV4dCBwb3NlIHByb2JsZW1zIGZvciBjdXJyZW50IGFwcGxpY2F0aW9ucyBhbmQKKyAgIHRyYW5zbWlzc2lvbiBtZXRob2RzLiBBbmQgdG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCBkaWZmZXJlbnQgaGFyZHdhcmUKKyAgIHBsYXRmb3JtcyBzdG9yZSBVQ1MtMiBjaGFyYWN0ZXJzIGluIGRpZmZlcmVudCBieXRlIG9yZGVyLiBUaHVzIGEgVUNTLTIKKyAgIGZpbGUgdHJhbnNmZXJyZWQgYnkgRlRQIChvciBhY2Nlc3NlZCB2aWEgTkZTLCBldGMpIGJldHdlZW4gdHdvCisgICBjb21wdXRlcnMgd2l0aCBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlIG1pZ2h0IGhhdmUgaXRzIGJ5dGVzIGluIHRoZQorICAgd3Jvbmcgb3JkZXIgKG9yIHdvcnNlOyBzZWUgWzU0MV1TZWN0aW9uIDYuNi41LjEgKS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDYuNi4yLiBVQ1MgQnl0ZSBPcmRlcgorCisgICBDb25zaWRlciB0aGUgbnVtYmVyIDEuIEluIGFuIDgtYml0IGJ5dGUsIHRoaXMgd291bGQgYmUgcmVwcmVzZW50ZWQgYnkKKyAgIHRoZSBmb2xsb3dpbmcgc2VyaWVzIG9mIDAtIGFuZCAxLWJpdHM6CisKKyAgKy0tLS0tLS0tLS0tLS0tLS0tKworICB8IDAgMCAwIDAgMCAwIDAgMSB8CisgICstLS0tLS0tLS0tLS0tLS0tLSsKKworICAgVGhlcmVmb3JlIGluIGEgMTYtYml0ICJ3b3JkIiB0aGUgcmVwcmVzZW50YXRpb24gbWlnaHQgYmU6CisKKyAgKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKworICB8IDAgMCAwIDAgMCAwIDAgMCB8IDAgMCAwIDAgMCAwIDAgMSB8CisgICstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKKworICAgTm93IGNvbnNpZGVyIHRoZSBudW1iZXIgMjU2LCB3aGljaCBpcyAyIHRvIHRoZSA4dGggcG93ZXIuIFRoZSBiaW5hcnkKKyAgIHJlcHJlc2VudGF0aW9uIGlzIDEwMDAwMDAwMCAoMSBmb2xsb3dlZCBieSA4IHplcm9zKS4gMjU2IHdvdWxkIGdvIGludG8KKyAgIGEgMTYtYml0IHdvcmQgbGlrZSB0aGlzOgorCisgICstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCAwIDAgMCAwIDAgMCAwIDEgfCAwIDAgMCAwIDAgMCAwIDAgfAorICArLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCisKKyAgIFdoZW4gYSBjb21wdXRlciB3b3JrcyB0aGlzIHdheSwgaXQgaXMgc2FpZCB0byBiZSBCaWcgRW5kaWFuLCBtZWFuaW5nCisgICBpdCBwdXRzIHRoZSBtb3N0IHNpZ25pZmljYW50IChiaWdnZXN0KSBieXRlIGZpcnN0IChvbiB0aGUgImxlZnQiKSBpbiBhCisgICAxNi1iaXQgd29yZCwgYW5kIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIHNlY29uZCAob24gdGhlIHJpZ2h0KS4KKworICAgSG93ZXZlciwgc29tZSBvdGhlciBjb21wdXRlcnMgaGF2ZSB0aGUgb3Bwb3NpdGUgYXJyYW5nZW1lbnQsIGNhbGxlZAorICAgTGl0dGxlIEVuZGlhbiwgaW4gd2hpY2ggMSBpczoKKworICArLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwgMCAwIDAgMCAwIDAgMCAxIHwgMCAwIDAgMCAwIDAgMCAwIHwKKyAgKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKworCisgICBhbmQgMjU2IGlzOgorCisgICstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCAwIDAgMCAwIDAgMCAwIDAgfCAwIDAgMCAwIDAgMCAwIDEgfAorICArLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCisKKyAgIENvbXB1dGVycyBzdWNoIGFzIFNwYXJjLCBNSVBTLCBQQS1SSVNDLCBhbmQgUG93ZXJQQyBhcmUgQmlnIEVuZGlhbiwKKyAgIHdoZXJlYXMgdGhlIFBDIGFuZCB0aGUgQWxwaGEgYXJlIExpdHRsZSBFbmRpYW4uIEVuZGlhbm5lc3MgaGFzIG5ldmVyCisgICBiZWVuIGFuIGlzc3VlIHdpdGggNy0gb3IgOC1iaXQgY2hhcmFjdGVycywgYnV0IGl0IGlzIHdpdGggVUNTCisgICBjaGFyYWN0ZXJzLiBJdCBjYW4gYmUgYSB0cmlja3kgYnVzaW5lc3MgdG8gc2hhcmUgb3IgdHJhbnNmZXIgYSBVQ1MtMgorICAgZmlsZSBiZXR3ZWVuIHR3byBkaWZmZXJlbnQga2luZHMgb2YgY29tcHV0ZXJzLgorCisgICBUbyBhbGxldmlhdGUgKGJ1dCBub3QgZW50aXJlbHkgc29sdmUpIHRoZSBwcm9ibGVtLCBVQ1MtMiBmaWxlcyBhcmUKKyAgIHN1cHBvc2VkIHRvIGJlZ2luIHdpdGggdGhlIFVuaWNvZGUgY2hhcmFjdGVyIFUrRkVGRiwgWmVyby1XaWR0aAorICAgTm8tQnJlYWsgU3BhY2UgKFpXTkJTKS4gVGhpcyBpcyBhIGtpbmQgb2YgIm5vLW9wIiAobm90ZTogYW55IHN1Y2gKKyAgIGFzc2VydGlvbiBtdXN0IG5vcm1hbGx5IGJlIHF1YWxpZmllZCB3aXRoIG1hbnkgImJ1dCBpZnMiIGFuZCAiZXhjZXB0cyIKKyAgIHdoaWNoIGFyZSBvbWl0dGVkIGhlcmUgaW4gdGhlIGludGVyZXN0IG9mIGJyZXZpdHkpLiBJZiB0aGUgYnl0ZXMgYXJlCisgICByZXZlcnNlZCB0aGUgWldOQlMgYmVjb21lcyBVK0ZGRkUsIHdoaWNoIGlzIG5vdCAoYW5kIG5ldmVyIHdpbGwgYmUpIGEKKyAgIGRlZmluZWQgVUNTIGNoYXJhY3Rlci4gVStGRUZGIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBVQ1MgZmlsZSBpcworICAgdGhlcmVmb3JlIGNhbGxlZCBhIEJ5dGUgT3JkZXIgTWFyaywgb3IgQk9NLgorCisgICBBbnkgYXBwbGljYXRpb24gdGhhdCBjcmVhdGVzIGEgVUNTLTIgKG9yIFVURi0xNiwgb3IgVUNTLTQpIGZpbGUgc2hvdWxkCisgICBpbmNsdWRlIGEgQk9NLCBhbmQgYW55IGFwcGxpY2F0aW9uIHRoYXQgcmVhZHMgb25lIHNob3VsZCB0ZXN0IGZvciBhCisgICBCT00sIGFuZCBpZiBvbmUgaXMgZm91bmQsIGluZmVyIHRoZSBieXRlIG9yZGVyIGZyb20gaXQuIFRoaXMgaXMgYQorICAgY29udmVudGlvbiwgaG93ZXZlciAtLSBub3QgYSBzdGFuZGFyZCBvciBhIHJlcXVpcmVtZW50IC0tIGFuZAorICAgYXBwbGljYXRpb25zIHZhcnkgaW4gdGhlaXIgYWJpbGl0eSB0byBoYW5kbGUgQk9NcyBhbmQgImJhY2t3YXJkcyIKKyAgIFVDUy0yIGZpbGVzLgorCisgICBOb3RlIHRoYXQgYSBCT00gaXMgdXNlZnVsIG9ubHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUuIElmIHlvdQorICAgYXBwZW5kIG9uZSBVQ1MtMiBmaWxlIHRvIGFub3RoZXIsIGFuZCBib3RoIGhhdmUgQk9NcywgdGhlIGludGVybmFsIEJPTQorICAgaXMgbm8gbG9uZ2VyIGEgQk9NLiBBbmQgaWYgdGhlIGJ5dGUgb3JkZXJzIG9mIHRoZSB0d28gZmlsZXMgZGlmZmVyLAorICAgdGhlbiBlaXRoZXIgdGhlIGZpcnN0IHBhcnQgb3IgdGhlIHNlY29uZCB3aWxsIGJlIGJhY2t3YXJkcy4gKFZhcmlvdXMKKyAgIG90aGVyIHVuZGVzaXJhYmxlIGVmZmVjdHMgbWlnaHQgYWxzbyBvY2N1ciwgbm90IGRpc2N1c3NlZCBoZXJlLikKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDYuNi4yLiBVQ1MgVHJhbnNmb3JtYXRpb24gRm9ybWF0cworCisgICBVQ1MgdGV4dHVhbCBkYXRhIGNhbiBiZSBtb2RpZmllZCBpbiB2YXJpb3VzIHdheXMgZm9yIHRyYW5zbWlzc2lvbiBvcgorICAgc3RvcmFnZS4gQW55IG9mZmljaWFsbHkgc2FuY3Rpb25lZCBtZXRob2Qgb2YgZG9pbmcgdGhpcyBpcyBjYWxsZWQgYQorICAgVUNTIFRyYW5zZm9ybWF0aW9uIEZvcm1hdCwgb3IgVVRGLiBPbmUgc3VjaCBtZXRob2QsIGNhbGxlZCBVVEYtMTYsIGlzCisgICBlc3NlbnRpYWxseSBpZGVudGljYWwgd2l0aCBVQ1MtMiBleGNlcHQgdGhhdCBpdCBkZXNpZ25hdGVzIGNlcnRhaW4KKyAgIGNvZGUgdmFsdWVzIGFzICJlc2NhcGUgc2VxdWVuY2VzIiAoY2FsbGVkIHN1cnJvZ2F0ZSBwYWlycykgdG8gYWNjZXNzCisgICBjaGFyYWN0ZXJzIGluIG90aGVyIHBsYW5lcyB3aXRob3V0IGhhdmluZyB0byB1c2UgZnVsbCBVQ1MtNC4gV2Ugd29uJ3QKKyAgIGRpc2N1c3MgVVRGLTE2IGZ1cnRoZXIgaGVyZSwgc2luY2UgYXQgdGhlIG1vbWVudCB0aGVyZSBhcmUgbm8gb3RoZXIKKyAgIHBsYW5lcy4gU2V2ZXJhbCBvdGhlciBVVEYncyAoc3VjaCBhcyBVVEYtMSwgVVRGLTIsIGFuZCBVVEYtNykgaGF2ZQorICAgZmFsbGVuIGludG8gZGlzdXNlIGFuZCBhcmUgbm90IGRpc2N1c3NlZCBoZXJlLiBUaGUgbW9zdCBpbXBvcnRhbnQKKyAgIHRyYW5zZm9ybWF0aW9uIGZvcm1hdCB0b2RheSBpcyBVVEYtOC4KKworICAgVVRGLTgsIHNvIGNhbGxlZCBiZWNhdXNlIGl0ICJzZXJpYWxpemVzIiBVQ1MtMiBkYXRhIGludG8gYSBzdHJlYW0gb2YKKyAgIDgtYml0IGJ5dGVzLCBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgVUNTIHRvIHdvcmsgd2l0aCBwcmVzZW50LWRheQorICAgY29tbXVuaWNhdGlvbnMgZ2VhciwgY29tcHV0ZXJzLCBhbmQgc29mdHdhcmUuIFRoZSBtb3N0IGltcG9ydGFudAorICAgcHJvcGVydGllcyBvZiBVVEYtOCBhcmUgdGhhdCBieXRlIG9yZGVyIGlzIGNvbnN0YW50IChubyBieXRlIHN3YXBwaW5nKQorICAgYW5kIGFsbCAoNy1iaXQpIEFTQ0lJIGNoYXJhY3RlcnMgcmVwcmVzZW50IHRoZW1zZWx2ZXMuIFRoZXJlZm9yZQorICAgY29udmVyc2lvbiBiZXR3ZWVuIEFTQ0lJIGFuZCBVVEYtOCBpcyBubyBjb252ZXJzaW9uIGF0IGFsbCwgYW5kCisgICBhcHBsaWNhdGlvbnMgb3IgcGxhdGZvcm1zIChzdWNoIGFzIFBsYW4gOSBmcm9tIEJlbGwgTGFicykgdGhhdCB1c2UKKyAgIFVURi04ICJmb3IgZXZlcnl0aGluZyIgY2FuIHN0aWxsIHJ1biB0cmFkaXRpb25hbCBBU0NJSS1vbmx5CisgICBhcHBsaWNhdGlvbnMgYW5kIGJlIGFjY2Vzc2VkIGZyb20gdGhlbS4gSW4gcGFydGljdWxhciwgdW5saWtlIFVDUy0yLAorICAgQVNDSUkgY2hhcmFjdGVycyBhcmUgbm90IHBhZGRlZCB3aXRoIE5VTCBieXRlcy4gQnV0IGFsc28gdW5saWtlIFVDUy0yLAorICAgdGhlcmUgaXMgbm8gdHJhbnNwYXJlbmN5IGZvciBMYXRpbi0xIG9yIGFueSBvdGhlciBub24tQVNDSUkgY2hhcmFjdGVyCisgICBzZXQuIEV2ZXJ5IG5vbi1BU0NJSSBVQ1MtMiBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgYSBzZXF1ZW5jZSBvZiAyCisgICBvciAzIFVURi04IGJ5dGVzLiBUaHVzIFVURi04IGlzIG1vcmUgY29tcGFjdCB0aGFuIFVDUy0yIGZvciB0ZXh0CisgICBjb250YWluaW5nIGEgcHJlcG9uZGVyYW5jZSBvZiBBQkMncyAob3Igb3RoZXIgQVNDSUkgY2hhcmFjdGVycyksIGFib3V0CisgICB0aGUgc2FtZSBhcyBVQ1MtMiBmb3Igb3RoZXIgYWxwaGFiZXRpYyBzY3JpcHRzIChDeXJpbGxpYywgUm9tYW4sCisgICBHcmVlaywgZXRjKSwgYW5kIGxhcmdlciB0aGFuIFVDUy0yIGZvciBDaGluZXNlLCBKYXBhbmVzZSwgYW5kIEtvcmVhbi4KKworICAgVGhlIFVURi04IHVuY29kaW5nIG9mIHRoZSBVQ1MgaGFzIGJlZW4gYWRvcHRlZCBieSB0aGUgSW50ZXJuZXQgYXMgdGhlCisgICBwcmVmZXJyZWQgY2hhcmFjdGVyIHNldCBmb3IgbmV3IGFwcGxpY2F0aW9ucywgYW5kIGlzIGdyYWR1YWxseSBiZWluZworICAgcmV0cm9maXR0ZWQgaW50byB0cmFkaXRpb25hbCBhcHBsaWNhdGlvbnMgbGlrZSBGVFAgKFs1NDJdUkZDIDI2NDApLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNi42LjMuIENvbmZvcm1hbmNlIExldmVscworCisgICBBbHRob3VnaCB0aGUgVW5pY29kZSBhbmQgSVNPIDEwNjQ2IHN0YW5kYXJkcyBib3RoIGRlc2NyaWJlIHRoZSBzYW1lCisgICBjaGFyYWN0ZXIgc2V0LCB0aGVzZSBzdGFuZGFyZHMgZGlmZmVyIGluIG1hbnkgd2F5cywgaW5jbHVkaW5nIHRoZWlyCisgICBzdGF0ZWQgcmVxdWlyZW1lbnRzIGZvciBjb25mb3JtYW5jZSBhbmQgdGhlaXIgY2xhc3NpZmljYXRpb24gb2YKKyAgIGNvbmZvcm1hbmNlIGxldmVscy4KKworICAgS2VybWl0IGhhcyBhbHdheXMgYWJpZGVkIGJ5IElTTyBjaGFyYWN0ZXItc2V0IHN0YW5kYXJkcywgaW5jbHVkaW5nIElTTworICAgY2hhcmFjdGVyLXNldCBkZXNpZ25hdGlvbiBhbmQgaW52b2NhdGlvbiBtZXRob2RzLiBJbiBhZGFwdGluZyBVbmljb2RlLAorICAgdGhlcmVmb3JlLCB3ZSBoYWQgdG8gY2hvb3NlIGZyb20gYW1vbmcgdGhlIGF2YWlsYWJsZSBJU08gZGVzaWduYXRpb25zCisgICB3aGljaCwgaW4gdHVybiwgY29ycmVzcG9uZCB3aXRoIElTTyAxMDY0NiBjb25mb3JtYW5jZSBsZXZlbHMuIEF0CisgICBwcmVzZW50LCBLZXJtaXQgY2xhaW1zIHRoZSBsb3dlc3QgY29uZm9ybWFuY2UgbGV2ZWwsIDEsIG1lYW5pbmcKKyAgIChyb3VnaGx5KSB0aGF0IGl0IGRvZXMgbm90IGhhbmRsZSBjb21iaW5pbmcgZm9ybXMgYW5kIGl0IGRvZXMgbm90CisgICBoYW5kbGUgS29yZWFuIEhhbmd1bCBKYW1vcyAoanVzdCBhcywgYXQgcHJlc2VudCwgaXQgZG9lcyBub3QgaGFuZGxlCisgICBLb3JlYW4gaW4gZ2VuZXJhbCkuIE5vdGUgdGhhdCBJU08gMTA2NDYgQ29uZm9ybWFuY2UgTGV2ZWxzIDEgYW5kIDIKKyAgIHNpZGVzdGVwIHRoZSBpc3N1ZSBvZiB0aGUgY29kZSBjaGFuZ2VzIGZvciBLb3JlYW4gSGFuZ3VsIGJ5IGFubm91bmNpbmcKKyAgIG5vbi1zdXBwb3J0IGZvciBIYW5ndWwgcmVnYXJkbGVzcyBvZiBlbmNvZGluZy4KKworICAgSVNPIDEwNjQ2IENvbmZvcm1hbmNlIExldmVsIDEgaXMgYXBwcm94aW1hdGVseSBlcXVpdmFsZW50IHRvIFVuaWNvZGUKKyAgIE5vcm1hbGl6YXRpb24gRm9ybSBDIChkZXNjcmliZWQgaW4gVW5pY29kZSBUZWNobmljYWwgUmVwb3J0IDE1LAorICAgaW5jb3Jwb3JhdGVkIGludG8gVW5pY29kZSAzLjApLgorCisgICBBcyBub3RlZCBpbiBbNTQzXVNlY3Rpb24gNi42LjIsIEtlcm1pdCBkb2VzIG5vdCBjbGFpbSB0byBzdXBwb3J0CisgICBVVEYtMTYgYXQgdGhlIHByZXNlbnQgdGltZSwgaGVuY2UgdGhlIFVDUy0yIG5vbWVuY2xhdHVyZS4gS2VybWl0CisgICB0cmVhdHMgc3Vycm9nYXRlcyBqdXN0IGFzIGlmIHRoZXkgd2VyZSBhbnkgb3RoZXIgVUNTLTIgY2hhcmFjdGVycywKKyAgIHJhdGhlciB0aGFuIGFzIGVzY2FwZXMgdG8gb3RoZXIgcGxhbmVzLCB3aGljaCBtZWFucyB0aGF0IChleGNlcHQgd2hlbgorICAgY29udmVydGluZyBiZXR3ZWVuIFVDUy0yIGFuZCBVVEYtOCkgdGhleSBhcmUgdHJhbnNsYXRlZCB0byAiZXJyb3IiCisgICBjaGFyYWN0ZXJzLCBzaW5jZSAoYSkgbm8gb3RoZXIgcGxhbmVzIGFyZSBkZWZpbmVkIHlldCAoYW5kIGlmIHRoZXkKKyAgIHdlcmUsIG5vIG90aGVyIGNoYXJhY3RlciBzZXRzIHN1cHBvcnRlZCBieSBLZXJtaXQgd291bGQgZW5jb2RlIHRoZWlyCisgICBjaGFyYWN0ZXJzKSwgYW5kIChiKSBubyB2YWxpZCBzdXJyb2dhdGUgY2hhcmFjdGVyIGNvcnJlc3BvbmRzIHRvIGFueQorICAgb3RoZXIgVUNTLTIgY2hhcmFjdGVyLgorCisgICBBIG1pbm9yIHlldCBzaWduaWZpY2FudCBhc3BlY3Qgb2YgVW5pY29kZSAzLjAgYW5kIHNvbWUgcmVjZW50CisgICBwZXJ0dXJiYXRpb24gb2YgSVNPIDEwNjQ2LTEgKHByb2JhYmx5IEFtZW5kbWVudCAxOCwgIlN5bWJvbHMgYW5kIE90aGVyCisgICBDaGFyYWN0ZXJzIikgaXMgdGhlIGFkZGl0aW9uIG9mIHRoZSBFdXJvIFNpZ24gYXQgVSsyMEFDLiBBcyBub3RlZCBpbgorICAgWzU0NF1TZWN0aW9uIDYuMCwgS2VybWl0J3MgIkV1cm8gY29tcGxpYW5jZSIgaW5jbHVkZXMgY29udmVyc2lvbgorICAgYmV0d2VlbiBMYXRpbiBBbHBoYWJldCA5IGFuZCB2YXJpb3VzIFBDIGNvZGUgcGFnZXMuIFRleHQgY2FuIGFsc28gYmUKKyAgIGNvbnZlcnRlZCBiZXR3ZWVuIFVDUy0yIG9yIFVURi04IGFuZCBhbnkgb3RoZXIgRXVyby1jb21wbGlhbnQKKyAgIGNoYXJhY3RlciBzZXQgKExhdGluLTksIENQODU4LCBDUDEyNTAsIENQMTI1Mikgd2l0aG91dCBsb3NzIG9mIHRoZQorICAgRXVybyBTaWduLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNi42LjQuIFJlbGF0aW9uc2hpcCBvZiBVbmljb2RlIHdpdGggS2VybWl0J3MgT3RoZXIgQ2hhcmFjdGVyIFNldHMKKworICAgS2VybWl0J3MgY2hhcmFjdGVyIHNldHMgYXJlIGRpdmlkZWQgaW50byB0d28gZ3JvdXBzOiBzaW5nbGUtYnl0ZSBzZXRzCisgICAoc3VjaCBhcyBSb21hbiwgSGVicmV3LCBDeXJpbGxpYywgR3JlZWspIGFuZCBtdWx0aWJ5dGUgKHZhcmlvdXMKKyAgIEphcGFuZXNlIHNldHMpLiBUaGUgdHdvIGdyb3VwcyBhcmUgZGlzdGluY3Qgc2luY2Ugb25lIG5vcm1hbGx5IHdvdWxkCisgICBub3QgZXhwZWN0IHRvIGNvbnZlcnQgS2FuamkgaWRlb2dyYW1zIHRvIFJvbWFuIChvciBvdGhlcikgbGV0dGVycywgb3IKKyAgIHZpY2UgdmVyc2EuCisKKyAgIFVuaWNvZGUgY2hhcmFjdGVyLXNldCBjb252ZXJzaW9uIHdvcmtzIHdpdGggYm90aCBncm91cHMsIGJ1dCBvYnZpb3VzbHkKKyAgIHRoZSByZXN1bHQgZGVwZW5kcyBvbiB0aGUgcmVwZXJ0b2lyZXMgb2YgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KKyAgIGNoYXJhY3Rlci1zZXRzIGJvdGggaW5jbHVkaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlLiBGb3IgZXhhbXBsZSwKKyAgIHlvdSBjYW4gdHJhbnNsYXRlIGEgSHVuZ2FyaWFuIHRleHQgZmlsZSBiZXR3ZWVuIExhdGluLTIgYW5kIFVuaWNvZGUsCisgICBidXQgbm90IGJldHdlZW4gKHNheSkgVW5pY29kZSBhbmQgTGF0aW4vR3JlZWsuIEJ5IHRoZSBzYW1lIHRva2VuIHlvdQorICAgY2FuIGNvbnZlcnQgSmFwYW5lc2UgdGV4dCBmcm9tIFNoaWZ0LUpJUyBvciBFVUMgb3IgSklTLTcgdG8gVW5pY29kZQorICAgYW5kIGJhY2ssIGJ1dCB5b3UgY2FuJ3QgY29udmVydCB0aGUgc2FtZSBmaWxlIHRvIChzYXkpIExhdGluLTEgaWYgaXQKKyAgIGNvbnRhaW5zIEphcGFuZXNlIGNoYXJhY3RlcnMuCisKKyAgICAgSklTLTcgaXMgZXF1aXZhbGVudCB0byBERUMgS2FuamkgYW5kIElTTy0yMDIyLUpQIGV4Y2VwdCB0aGF0IHRoZQorICAgICBsYXR0ZXIgdHdvIGRvIG5vdCBzdXBwb3J0IGhhbGZ3aWR0aCBLYXRha2FuYS4gS2VybWl0IHRyZWF0cyBhbGwKKyAgICAgdGhyZWUgb2YgdGhlc2Ugc2V0cyB0aGUgc2FtZSB3YXksIGkuZS4gYXMgSklTLTcuCisKKyAgIEFzIG5vdGVkLCBLZXJtaXQgcHJlc2VudGx5IGRvZXMgbm90IGhhbmRsZSBjb21iaW5pbmcgZGlhY3JpdGljcywgYW5kCisgICBzbyB3aWxsIG5vdCBjb3JyZWN0bHkgY29udmVydCBVQ1MgZmlsZXMgdGhhdCB1c2UgdGhlbSBpbnRvIGEKKyAgIHNpbmdsZS1ieXRlIGNoYXJhY3RlciBzZXQuIEZvciBleGFtcGxlLCBpZiBhIFVDUyBmaWxlIGNvbnRhaW5zIExhdGluCisgICBDYXBpdGFsIExldHRlciBBIChVKzAwNDEpIGZvbGxvd2VkIGJ5IENvbWJpbmluZyBBY3V0ZSBBY2NlbnQgKFUrMDMwMSksCisgICB0aGUgcmVzdWx0IHdpbGwgYmUgYSB0d28tY2hhcmFjdGVyIHNlcXVlbmNlLCBBIGZvbGxvd2VkIGJ5IGFub3RoZXIKKyAgIGNoYXJhY3Rlci4gVGhpcyBpcyB3aGF0IGlzIG1lYW50IGJ5IENvbmZvcm1hbmNlIExldmVsIDEuIChUaGUKKyAgIHNpdHVhdGlvbiBncm93cyB3b3JzZSB3aXRoIG11bHRpcGxlIGRpYWNyaXRpY3MsIHNpbmNlIHRoZXkgY2FuIG9jY3VyCisgICBpbiBhbnkgb3JkZXIuKQorCisgICBBIGhpZ2hlciBsZXZlbCBvZiBjb25mb3JtYW5jZSBpcyBwb3NzaWJsZSwgaW4gd2hpY2ggImNhbm9uaWNhbAorICAgZXF1aXZhbGVuY2VzIiBhcmUgaGFuZGxlZCB2aWEgYWxnb3JpdGhtcyBhbmQgZGF0YWJhc2VzLCBhdCBzb21lCisgICAocGVyaGFwcyBjb25zaWRlcmFibGUpIGNvc3QgaW4gcGVyZm9ybWFuY2UsIHNpbmNlIGEgZmFpciBhbW91bnQgb2YKKyAgIGFkZGl0aW9uYWwgY29kZSBtdXN0IGJlIGV4ZWN1dGVkIGZvciBldmVyeSBjaGFyYWN0ZXIgZHVyaW5nIGRhdGEKKyAgIHRyYW5zZmVyIChkYXRhYmFzZSBsb29rdXAsIHNvcnRpbmcgb2YgY29tYmluaW5nIHNlcXVlbmNlcyBpbnRvCisgICBjYW5vbmljYWwgb3JkZXIsIGV0YykuIFRoaXMgY2FuIGJlIGFkZGVkIGluIGZ1dHVyZSByZWxlYXNlcyBpZiB0aGVyZQorICAgaXMgYSBuZWVkIChidXQgaW4gbWFueSBjYXNlcywgcHJlLSBhbmQgcG9zdHBvc3Rwcm9jZXNzaW5nIG1pZ2h0IGJlIGEKKyAgIGJldHRlciBvcHRpb24pLgorCisgICBXaXRoaW4gdGhlc2UgY29uc3RyYWludHMsIEtlcm1pdCBjb252ZXJ0cyBiZXR3ZWVuIHRoZSBVQ1MgYW5kIGl0cworICAgb3RoZXIgY2hhcmFjdGVyIHNldHMuIEZvciBleGFtcGxlLCBhIG1peHR1cmUgb2YgUnVzc2lhbiBhbmQgRW5nbGlzaAorICAgKGFuZC9vciBEdXRjaCwgb3IgTGF0aW4pIHRleHQgY2FuIGJldCBjb252ZXJ0ZWQgYmV0d2VlbiB0aGUgVUNTIGFuZAorICAgSVNPIExhdGluL0N5cmlsbGljIG9yIEtPSS04LiBCdXQgc2luY2UgS2VybWl0IGRvZXMgbm90IHByZXNlbnRseQorICAgc3VwcG9ydCBBcmFiaWMgY2hhcmFjdGVyLXNldCBjb252ZXJzaW9uLCB0aGUgbmV3IGF2YWlsYWJpbGl0eSBvZiBVQ1MKKyAgIGNvbnZlcnNpb24gZG9lcyBub3QgbWVhbiB0aGF0IEtlcm1pdCBjYW4gY29udmVydCBmcm9tIEFyYWJpYyBVQ1MgdGV4dAorICAgdG8gc29tZSBvdGhlciBjaGFyYWN0ZXIgc2V0LCBiZWNhdXNlIEtlcm1pdCBkb2VzIG5vdCBzdXBwb3J0IGFueSBvdGhlcgorICAgY2hhcmFjdGVyIHNldCB0aGF0IGluY2x1ZGVzIEFyYWJpYy4gRGl0dG8gZm9yIFRoYWksIEFybWVuaWFuLAorICAgR2VvcmdpYW4sIFRpYmV0YW4sIENoaW5lc2UsIEtvcmVhbiwgZXRjLiBIb3dldmVyLCBLZXJtaXQgQ0FOIGNvbnZlcnQKKyAgIEFyYWJpYyAob3IgYW55IG90aGVyIHNjcmlwdCkgYmV0d2VlbiBVQ1MtMiBhbmQgVVRGLTguCisKKyAgIENvbnNpZGVyaW5nIEN5cmlsbGljIG1vcmUgY2FyZWZ1bGx5LCBub3RlIHRoYXQgdGhlIFVDUyBhbHNvIGNvbnRhaW5zCisgICBudW1lcm91cyBDeXJpbGxpYyBjaGFyYWN0ZXJzIG5vdCBmb3VuZCBpbiBhbnkgb2YgdGhlIEN5cmlsbGljIHNldHMKKyAgIChJU08gTGF0aW4vQ3lyaWxsaWMsIEtPSTgsIENQODY2LCBldGMpIHRoYXQgS2VybWl0IHN1cHBvcnRzOworICAgY2hhcmFjdGVycyBuZWVkZWQgZm9yIEFia2hhc2lhbiwgWWFrdXQsIFRhdGFyLCBCYXNoa2lyLCBBbHRhaWMsIE9sZAorICAgQ2h1cmNoIFNsYXZvbmljLCBldGM7IFVDUyB0ZXh0IGNvbnRhaW5pbmcgYW55IG9mIHRoZXNlIGhpc3RvcmljIG9yCisgICAiZXh0ZW5kZWQiIEN5cmlsbGljIGNoYXJhY3RlcnMgY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gYW55IG9mIEtlcm1pdCdzCisgICBjdXJyZW50IHNpbmdsZS1ieXRlIEN5cmlsbGljIHNldHMgd2l0aG91dCBsb3NzLiBUaGUgc2l0dWF0aW9uIGlzCisgICBzaW1pbGFyIGZvciBHcmVlaywgSGVicmV3LCBldGMsIGFuZCBldmVuIHdvcnNlIGZvciBKYXBhbmVzZSBzaW5jZQorICAgVW5pY29kZSBjb250YWlucyB0aG91c2FuZHMgb2YgS2FuamlzIHRoYXQgYXJlIGxhY2tpbmcgZnJvbSB0aGUKKyAgIEphcGFuZXNlIGNoYXJhY3RlciBzZXRzIGJhc2VkIG9uIEpJUyBYIDAyMDgsIHN1Y2ggYXMgRVVDLUpQLCBKSVMtNywKKyAgIGFuZCBTaGlmdC1KSVMuCisKKyAgIEluIGdlbmVyYWwsIHdoZW4gY29udmVydGluZyBmcm9tIFVDUyB0byBhIHNpbmdsZS1ieXRlIHNldCwgdGhlcmUgaXMKKyAgIGFsd2F5cyB0aGUgcG9zc2liaWxpdHkgb2YgZGF0YSBsb3NzLCBqdXN0IGFzIHRoZXJlIGlzIHdoZW4gY29udmVydGluZworICAgZnJvbSBhbnkgbGFyZ2VyIHNldCB0byBhIHNtYWxsZXIgb25lLiBGb3IgZXhhbXBsZSwgaWYgYSBVQ1MgZmlsZQorICAgY29udGFpbnMgRGV2YW5hZ2FyaSBjaGFyYWN0ZXJzLCB0aGVzZSBjaGFyYWN0ZXJzIHdpbGwgYmUgbG9zdCB3aGVuCisgICBjb252ZXJ0aW5nIHRvIChzYXkpIExhdGluLTEsIGp1c3QgYXMgUm9tYW4gdm93ZWxzIHdpdGggYWN1dGUgYWNjZW50cworICAgYXJlIGxvc3Qgd2hlbiBjb252ZXJ0aW5nIGZyb20gTGF0aW4tMSAoYW4gOC1iaXQgc2V0KSB0byBHZXJtYW4gSVNPIDY0NgorICAgKGEgNy1iaXQgc2V0KS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDYuNi41LiBLZXJtaXQncyBVbmljb2RlIEZlYXR1cmVzCisKKyAgIEMtS2VybWl0IGNhbiBjb252ZXJ0IGJldHdlZW4gVUNTLTIgb3IgVVRGLTggYW5kIGFueSBvZiBpdHMgb3RoZXIKKyAgIGNoYXJhY3RlciBzZXRzLCBhbmQgYWxzbyBiZXR3ZWVuIFVDUy0yIGFuZCBVVEYtOC4gV2hlbiBjb252ZXJ0aW5nCisgICBiZXR3ZWVuIFVDUy0yIG9yIFVURi04IGFuZCBhIG5vbi1Vbmljb2RlIGNoYXJhY3RlciBzZXQgKHN1Y2ggYXMKKyAgIExhdGluLTEpLCB0aGUgVUNTIExpbmUgU2VwYXJhdG9yIChMUywgVSsyMDI4KSBhbmQgUGFyYWdyYXBoIFNlcGFyYXRvcgorICAgKFBTLCBVKzIwMjkpIGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCB0byB0aGUgYXBwcm9wcmlhdGUgbGluZQorICAgdGVybWluYXRvciAoQ1IsIExGLCBvciBDUkxGKS4gV2hlbiBjb252ZXJ0aW5nIGZyb20gYSBub24tVW5pY29kZSBzZXQKKyAgIHRvIFVDUy0yIG9yIFVURi04LCBob3dldmVyLCBsaW5lIHRlcm1pbmF0b3JzIGFyZSBub3QgY29udmVydGVkIHRvIExTCisgICBvciBQUy4gVGhpcyBpcyBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHJlY29tbWVuZGF0aW9ucyBvZiBVbmljb2RlCisgICBUZWNobmljYWwgUmVwb3J0ICMxMy4KKworICAgV2hlbiBDLUtlcm1pdCBzdGFydHMsIGl0IHRlc3RzIHRoZSBuYXRpdmUgYnl0ZSBvcmRlciBvZiB0aGUgY29tcHV0ZXIuCisgICBZb3UgY2FuIHNlZSB0aGUgcmVzdWx0IGluIHRoZSBTSE9XIEZFQVRVUkVTIG9yIFNIT1cgRklMRSBkaXNwbGF5LiBJdCdzCisgICBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgdmFyaWFibGUgXHYoYnl0ZW9yZGVyKTogMCBtZWFucyBCaWcgRW5kaWFuLCAxCisgICBtZWFucyBMaXR0bGUgRW5kaWFuLgorCisgICBXaGVuIFVDUy0yIGlzIGludm9sdmVkIGluIGZpbGUgdHJhbnNmZXIgb3IgdHJhbnNsYXRpb24sIHRoZSBmb2xsb3dpbmcKKyAgIGNvbW1hbmRzIHRlbGwgQy1LZXJtaXQgd2hhdCB0byBkbyBhYm91dCBieXRlIG9yZGVyOgorCisgICBTRVQgRklMRSBVQ1MgQllURS1PUkRFUiB7IEJJRy1FTkRJQU4sIExJVFRMRS1FTkRJQU4gfQorICAgICAgICAgIFRoaXMgaXMgZm9yIHJlYWRpbmcgVUNTLTIgZmlsZXMgdGhhdCBkb24ndCBoYXZlIGEgQk9NLCBhbmQgYWxzbworICAgICAgICAgIGZvciB3cml0aW5nIFVDUy0yIGZpbGVzLiBJZiB0aGlzIGNvbW1hbmQgaXMgbm90IGdpdmVuLCB0aGUKKyAgICAgICAgICBtYWNoaW5lJ3MgbmF0aXZlIGJ5dGUgb3JkZXIgaXMgdXNlZCB3aGVuIHdyaXRpbmcgVUNTLTIgZmlsZXMsCisgICAgICAgICAgYW5kIGFsc28gd2hlbiByZWFkaW5nIFVDUy0yIGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZSBhIEJPTS4KKworICAgU0VUIEZJTEUgVUNTIEJPTSB7IE9OLCBPRkYgfQorICAgICAgICAgIFRoaXMgc2V0dGluZyBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgVUNTLTIgZmlsZXMuIEEgQk9NIGlzIGFkZGVkCisgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBieSBkZWZhdWx0LiBVc2UgT0ZGIHRvIG5vdCBhZGQgdGhlIEJPTS4gVGhpcworICAgICAgICAgIGNvbW1hbmQgaGFzIG5vIGFmZmVjdCB3aGVuIHdyaXRpbmcgZmlsZXMuCisKKyAgIENPUFkgL1NXQVAtQllURVMgc291cmNlZmlsZSBkZXN0aW5hdGlvbmZpbGUKKyAgICAgICAgICBVc2UgdGhpcyBmb3IgZml4aW5nIGEgVUNTLTIgZmlsZSB3aG9zZSBieXRlcyBhcmUgaW4gdGhlIHdyb25nCisgICAgICAgICAgb3JkZXIuCisKKyAgIFVzZSBTSE9XIEZJTEUgdG8gZGlzcGxheSB0aGUgRklMRSBVQ1Mgc2V0dGluZ3MuCisKKyAgIFBsZWFzZSBub3RlLCBhZ2FpbiwgdGhhdCBDLUtlcm1pdCdzIHVzZXIgaW50ZXJmYWNlLCBpbmNsdWRpbmcgaXRzCisgICBzY3JpcHQgbGFuZ3VhZ2UsIGlzIG5vdCBpbnRlcm5hdGlvbmFsaXplZCBpbiBhbnkgd2F5LiBTdHJpbmcKKyAgIGNvbXBhcmlzb25zLCBjYXNlIGNvbnZlcnNpb24sIGFuZCBzbyBvbiwgd29yayBvbmx5IGZvciBVUyBBU0NJSQorICAgKGNvbXBhcmlzb25zIGZvciBlcXVhbGl0eSB3b3JrIHdpdGggb3RoZXIgc2V0cywgYnV0IG5vdAorICAgbGV4aWNhbGx5LWdyZWF0ZXItb3ItbGVzcy10aGFuIG9yIGNhc2VsZXNzIGNvbXBhcmlzb25zOyBldmVuCisgICBjb21wYXJpc29ucyBmb3IgZXF1YWxpdHkgY2FuIGZhaWwgd2hlbiBjb21wb3NlZCBjaGFyYWN0ZXJzIG9yIGJ5dGUKKyAgIG9yZGVyIGFyZSBpbnZvbHZlZCkuIFN0cmluZyBmdW5jdGlvbnMgc3VjaCBhcyBcZmluZGV4KCkgYW5kCisgICBcZnN1YnN0cmluZygpIHRoYXQgcmVmZXJlbmNlIGJ5dGUgcG9zaXRpb25zIGRvIGp1c3QgdGhhdDsgdGhleSB3b24ndAorICAgd29yayB3aXRoIFVURi04IHRleHQgdGhhdCBjb250YWlucyBhbnkgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIGFuZCB0aGV5CisgICB3aWxsIG5vdCB3b3JrIHdpdGggVUNTLTIgdGV4dCBhdCBhbGwgc2luY2UgdGhleSB1c2UgQyBzdHJpbmdzCisgICBpbnRlcm5hbGx5LCB3aGljaCBhcmUgTlVMLXRlcm1pbmF0ZWQuIFRoZXNlIGFyZSBqdXN0IGEgZmV3IGV4YW1wbGVzIHRvCisgICBpbGx1c3RyYXRlIHRoYXQgbmVpdGhlciBVbmljb2RlIG5vciBhbnkgb3RoZXIgY2hhcmFjdGVyLXNldCBiZXlvbmQKKyAgIEFTQ0lJIGlzIHN1cHBvcnRlZCBhdCB0aGUgdXNlci1pbnRlcmZhY2UsIGNvbW1hbmQsIG9yIHNjcmlwdGluZyBsZXZlbAorICAgaW4gdGhpcyB2ZXJzaW9uIG9mIEMtS2VybWl0LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNi42LjUuMS4gRmlsZSBUcmFuc2ZlcgorCisgICBLZXJtaXQgc3VwcG9ydHMgYm90aCBVQ1MtMiBhbmQgVVRGLTggYXMgZmlsZSBhbmQgdHJhbnNmZXIgY2hhcmFjdGVyCisgICBzZXRzIGluIHRleHQtbW9kZSBmaWxlIHRyYW5zZmVyLgorCisgICBUbyBzZWxlY3QgVUNTLTIgb3IgVVRGLTggYXMgYSBmaWxlIGNoYXJhY3Rlci1zZXQsIHVzZToKKworICBTRVQgRklMRSBDSEFSQUNURVItU0VUIHsgVUNTMiwgVVRGOCB9CisKKyAgIElmIHlvdSB3YW50IHRvIHNlbmQgYSBVQ1MtMiB0ZXh0IGZpbGUgKG9yIHNhdmUgYW4gaW5jb21pbmcgZmlsZSBpbgorICAgVUNTLTIgZm9ybWF0KSwgdGVsbCBLZXJtaXQgdG86CisKKyAgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCBVQ1MyCisKKyAgIGFuZCBpZiB5b3Ugd2FudCB0byBzZW5kIGEgVVRGLTggdGV4dCBmaWxlIChvciBzdG9yZSBhbiBpbmNvbWluZyBmaWxlCisgICBpbiBVVEYtOCBmb3JtYXQpLCB0ZWxsIEtlcm1pdCB0bzoKKworICBTRVQgRklMRSBDSEFSQUNURVItU0VUIFVURjgKKworICAgV2hlbiBzZW5kaW5nIFVDUy0yIGZpbGVzLCBLZXJtaXQgZGV0ZXJtaW5lcyB0aGUgYnl0ZSBvcmRlciBmcm9tIHRoZQorICAgQk9NLCBpZiB0aGVyZSBpcyBvbmUgKGFuZCBpZiB0aGVyZSBpcyBhIEJPTSwgaXQgaXMgc3RyaXBwZWQsIGkuZS4gbm90CisgICBzZW50KS4gSWYgdGhlcmUgaXMgbm8gQk9NLCB0aGUgYnl0ZSBvcmRlciBpcyB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGUKKyAgIG1vc3QgcmVjZW50IFNFVCBGSUxFIFVDUyBCWVRFLU9SREVSIGNvbW1hbmQsIGlmIGFueSwgb3RoZXJ3aXNlIHRoZQorICAgY29tcHV0ZXIncyBuYXRpdmUgYnl0ZSBvcmRlciBpcyBhc3N1bWVkLiBXaGVuIHN0b3JpbmcgaW5jb21pbmcgZmlsZXMKKyAgIGFzIFVDUy0yLCB0aGUgYnl0ZSBvcmRlciBpcyBhY2NvcmRpbmcgU0VUIEZJTEUgVUNTIEJZVEUtT1JERVIsIGlmCisgICBnaXZlbiwgb3RoZXJ3aXNlIHRoZSBuYXRpdmUgb25lOyBhIEJPTSBpcyB3cml0dGVuIGFjY29yZGluZyB0byBTRVQKKyAgIEZJTEUgVUNTIEJPTS4KKworICAgQSB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IHNob3VsZCBiZSBjaG9zZW4gdGhhdCBpbmNsdWRlcyBhbGwgb2YgdGhlCisgICBjaGFyYWN0ZXJzIGluIHRoZSBzb3VyY2UgZmlsZS4gU28sIGZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHNlbmRpbmcgYQorICAgVUNTLTIgZmlsZSBjb250YWluaW5nIG9ubHkgR2VybWFuLWxhbmd1YWdlIHRleHQsIHlvdXIgdHJhbnNmZXIKKyAgIGNoYXJhY3Rlci1zZXQgY2FuIGJlIExhdGluLTEsIExhdGluLTIsIExhdGluLTksIFVDUy0yLCBvciBVVEYtOC4gQnV0CisgICBpZiB5b3UgYXJlIHNlbmRpbmcgYSBmaWxlIHRoYXQgY29udGFpbnMgYSBjb21iaW5hdGlvbiBvZiBIZWJyZXcgYW5kCisgICBHcmVlaywgeW91ciB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IG11c3QgYmUgVUNTLTIgb3IgVVRGLTggaWYgeW91IGRvbid0CisgICB3YW50IHRvIGxvc2Ugb25lIHNjcmlwdCBvciB0aGUgb3RoZXIuIEZ1cnRoZXJtb3JlLCB0aGUgdHJhbnNmZXIKKyAgIGNoYXJhY3Rlci1zZXQgbXVzdCBiZSBvbmUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHJlY2VpdmluZyBLZXJtaXQKKyAgIHByb2dyYW0uIFNpbmNlIFVDUyBzdXBwb3J0IGlzIG5ldywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgb3RoZXIKKyAgIEtlcm1pdCBwcm9ncmFtIChpZiBpdCBzdXBwb3J0cyBjaGFyYWN0ZXIgc2V0cyBhdCBhbGwpIGRvZXMgbm90IHN1cHBvcnQKKyAgIGl0LCBidXQgZG9lcyBzdXBwb3J0IHNpbmdsZS1ieXRlIHNldHMgc3VjaCBhcyBMYXRpbi0xLCBMYXRpbi9DeXJpbGxpYywKKyAgIGV0Yy4KKworICAgVG8gc2VsZWN0IFVDUy0yIG9yIFVURi04IGFzIGEgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCwgdXNlOgorCisgIFNFVCBUUkFOU0ZFUiBDSEFSQUNURVItU0VUIHsgVUNTMiwgVVRGOCB9CisKKyAgIEl0IGlzIHVwIHRvIHRoZSByZWNlaXZpbmcgS2VybWl0IHByb2dyYW0gdG8gY29udmVydCB0aGUgdHJhbnNmZXIKKyAgIGZvcm1hdCB0byBpdHMgb3duIGxvY2FsIGZvcm1hdCwgaWYgbmVjZXNzYXJ5LiBJZiBpdCBkb2VzIG5vdAorICAgdW5kZXJzdGFuZCB0aGUgVVRGLTggb3IgVUNTLTIgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCwgYW5kIHlvdXIgZmlsZQorICAgY2FuIG5vdCBiZSBhZGVxdWF0ZWx5IHJlcHJlc2VudGVkIGJ5IGFueSBzaW5nbGUtYnl0ZSB0cmFuc2ZlcgorICAgY2hhcmFjdGVyLXNldCAoc3VjaCBhcyBMYXRpbi0xIG9yIExhdGluL0N5cmlsbGljKSB0aGVuLCBpZiBVVEYtOAorICAgZm9ybWF0IGlzIGFjY2VwdGFibGUgb24gdGhlIHJlY2VpdmluZyBjb21wdXRlciwgdXNlIFVURi04IGFzIHRoZQorICAgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCwgd2l0aCB0aGUgcmVjZWl2ZXIgdG9sZCB0byAic2V0IHVua25vd24tY2hhcgorICAga2VlcCIsIG9yIHdpdGggdGhlIHNlbmRlciB0b2xkIHRvICJzZXQgYXR0cmlidXRlIGNoYXIgb2ZmIi4gSWYgeW91CisgICB3YW50IHRoZSBmaWxlIHRvIGJlIHN0b3JlZCBpbiBVQ1MtMiBmb3JtYXQgYXQgdGhlIHJlY2VpdmVyLCBzZW5kIGl0IGl0CisgICBiaW5hcnkgbW9kZSBpZiB0aGUgc291cmNlIGZpbGUgaXMgYWxzbyBVQ1MtMiwgb3IgZWxzZSB1c2UgdGhlCisgICBUUkFOU0xBVEUgY29tbWFuZCAobmV4dCBzZWN0aW9uKSB0byBjb252ZXJ0IGl0IHRvIFVDUy0yIGZpcnN0LCB0aGVuCisgICBzZW5kIGl0IGluIGJpbmFyeSBtb2RlLiBZb3Ugc2hvdWxkIG5vdCB1c2UgVUNTLTIgYXMgYSB0cmFuc2ZlcgorICAgY2hhcmFjdGVyLXNldCBpbiB0ZXh0LW1vZGUgdHJhbnNmZXJzIHRvIEtlcm1pdCBwcm9ncmFtcyB0aGF0IGRvbid0CisgICBzdXBwb3J0IGl0LCBiZWNhdXNlIHRoZXkgYXJlIGxpa2VseSB0byBjb3JydXB0IHRoZSByZXN1bHQgdGhlIHNhbWUgd2F5CisgICBGVFAgd291bGQgKHNlZSB0aGUgZmluYWwgcGFyYWdyYXBoIG9mIHRoaXMgc2VjdGlvbikuCisKKyAgIFdoZW4gVUNTLTIgaXMgdGhlIHRyYW5zZmVyIGNoYXJhY3RlciBzZXQsIGl0IGFsd2F5cyBnb2VzIGludG8gS2VybWl0CisgICBwYWNrZXRzIGluIEJpZyBFbmRpYW4gZm9ybWF0LCB3aXRoIG5vIEJPTS4gQXMgYWx3YXlzLCB0aGUgdHJhbnNmZXIKKyAgIGNoYXJhY3Rlci1zZXQgaXMgYW5ub3VuY2VkIGJ5IHRoZSBzZW5kZXIgdG8gdGhlIHJlY2VpdmVyLiBUaGUKKyAgIGFubm91bmNlbWVudCBmb3IgVUNTLTIgaXMgIkkxNjIiIChJU08gUmVnaXN0cmF0aW9uIDE2MiA9IFVDUy0yIExldmVsCisgICAxKSBhbmQgYnkgZGVmaW5pdGlvbiBpdCBpcyBCaWcgRW5kaWFuICh0aGUgc3RhbmRhcmRzIHNheSB0aGF0IHdoZW4KKyAgIFVDUy0yIGlzIHNlcmlhbGl6ZWQgaW50byBieXRlcywgdGhlIG9yZGVyIG11c3QgYmUgQmlnIEVuZGlhbikuIFRoZQorICAgYW5ub3VuY2VtZW50IGZvciBVVEYtOCBpcyAiSTE5MCIgKFVURi04IExldmVsIDEpLgorCisgICBXaGVuIHJlY2VpdmluZyBhIGZpbGUgd2hvc2UgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCBpcyBVQ1MtMiBvciBVVEYtOCwKKyAgIHlvdSBtdXN0IGNob29zZSB0aGUgYXBwcm9wcmlhdGUgZmlsZSBjaGFyYWN0ZXIgc2V0IGZvciB0aGUgcmVzdWx0LgorICAgVGhlcmUgaXMgbm8gd2F5IEtlcm1pdCBjYW4gZG8gdGhpcyBmb3IgeW91IGF1dG9tYXRpY2FsbHksIHNpbmNlIFVDUworICAgZGF0YSBjYW4gYmUgaW4gYW55IHNjcmlwdCBhdCBhbGwsIG9yIGFueSBjb21iaW5hdGlvbi4KKworICAgSW4gZ2VuZXJhbCwgVVRGLTggb3IgVUNTLTIgc2hvdWxkIGJlIGNob3NlbiBhcyBhIHRyYW5zZmVyCisgICBjaGFyYWN0ZXItc2V0IGlmIHRoZSBzb3VyY2UgZmlsZSBpcyBhbHNvIGVuY29kZWQgaW4gc29tZSBmb3JtIG9mIFVDUworICAgYW5kIGl0IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgc2NyaXB0LiBCdXQgdGhlcmUgYXJlIG90aGVyIHNpdHVhdGlvbnMKKyAgIHdoZXJlIHdoZXJlIFVURi04IG9yIFVDUy0yIG9mZmVyIGFkdmFudGFnZXMuIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoZQorICAgc291cmNlIGZpbGUgaXMgb24gYSBOZVhUc3RhdGlvbiBhbmQgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaXMgb24gVk1TLgorICAgQm90aCB0aGUgTmVYVCBhbmQgdGhlIERFQyBNdWx0aW5hdGlvbmFsIGNoYXJhY3RlciBzZXRzIGluY2x1ZGUgdGhlCisgICBGcmVuY2ggT0UgZGlncmFwaCwgYnV0IExhdGluLTEgZG9lcyBub3QuIFRoZXJlZm9yZSBGcmVuY2ggd29yZHMKKyAgIGNvbnRhaW5pbmcgdGhpcyBjaGFyYWN0ZXIgbWlnaHQgbm90IGFycml2ZSBpbnRhY3Qgd2hlbiBMYXRpbi0xIGlzIHRoZQorICAgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCwgYnV0IHdpbGwgd2l0aCBVVEYtOCBvciBVQ1MtMiwgc2luY2UgdGhlIFVDUworICAgaW5jbHVkZXMgdGhlIE9FIGRpZ3JhcGggKGJ1dCBzbyBkb2VzIExhdGluLTkpLgorCisgICBVQ1MtMiBzaG91bGQgYmUgY2hvc2VuIGFzIGEgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCBvbmx5IGZvciBKYXBhbmVzZQorICAgdGV4dCBmaWxlcyB0aGF0IGNvbnRhaW4gYSBsYXJnZSBwcmVwb25kZXJhbmNlIG9mIEthbmppLCBzaW5jZSBpbiB0aGlzCisgICBjYXNlIChhbmQgb25seSB0aGlzIGNhc2UpIFVDUy0yICh0d28gYnl0ZXMgcGVyIEthbmppKSBpcyBtb3JlCisgICBlZmZpY2llbnQgdGhhbiBVVEYtOCAodGhyZWUgYnl0ZXMgcGVyIEthbmppKS4gVGhlIHNhbWUgd2lsbCBiZSB0cnVlCisgICBmb3IgQ2hpbmVzZSBhbmQgS29yZWFuIHdoZW4gdGhleSBhcmUgc3VwcG9ydGVkIGJ5IEtlcm1pdC4gVUNTLTIgc2hvdWxkCisgICBuZXZlciBiZSB1c2VkIGFzIGEgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCB3aXRoIGEgdHJhbnNmZXIgcGFydG5lciB0aGF0CisgICBkb2VzIG5vdCBzdXBwb3J0IFVDUy0yIHNpbmNlIHRoaXMgY2FuIGNhdXNlIGZpbGUgY29ycnVwdGlvbiAoc2VlIGxhc3QKKyAgIHBhcmFncmFwaCBpbiB0aGlzIHNlY3Rpb24pLgorCisgICBOb3RlIHRoYXQgS2VybWl0J3MgcmVwZWF0LWNvdW50IGNvbXByZXNzaW9uIGlzIDEwMCUgaW5lZmZlY3RpdmUgZm9yCisgICBVQ1MtMiwgYW5kIGlzIGFsc28gaW5lZmZlY3RpdmUgZm9yIG11bHRpYnl0ZSBjaGFyYWN0ZXJzIGluIFVURi04IGFuZAorICAgRVVDLUpQOyB0aGlzIGlzIGJlY2F1c2UgcmVwZWF0LWNvbXByZXNzaW9uIGlzIGEgdHJhbnNwb3J0LWxldmVsCisgICBtZWNoYW5pc20gdGhhdCBvcGVyYXRlcyBvbiBhIHBlci1ieXRlIGJhc2lzOyBpdCBoYXMgbm8ga25vd2xlZGdlIG9mCisgICB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhIGJ5dGUgYW5kIGEgY2hhcmFjdGVyLgorCisgICBXaGVuIEMtS2VybWl0IHN0YXJ0cywgaXQgc2V0cyB1cCBhc3NvY2lhdGlvbnMgKFs1NDVdU2VjdGlvbiA2LjUpIGZvcgorICAgaW5jb21pbmcgZmlsZXMgd2hvc2UgdHJhbnNmZXIgY2hhcmFjdGVyIHNldHMgYXJlIFVDUy0yIG9yIFVURi04CisgICBhcHByb3ByaWF0ZWx5IGZvciB0aGUgcGxhdGZvcm0gc28gdGhhdCB0aGUgZmlsZSBjaGFyYWN0ZXItc2V0IGZvciB0aGUKKyAgIGluY29taW5nIGZpbGUgaXMgVUNTLTIgaW4gV2luZG93cyBhbmQgVVRGLTggZWxzZXdoZXJlLiBPdGhlcndpc2UsCisgICBDLUtlcm1pdCBkb2VzIG5vdCBtYWtlIGFueSBkZWZhdWx0IGFzc29jaWF0aW9ucyBmb3IgVUNTLTIgb3IgVVRGLTgsCisgICBidXQgb2YgY291cnNlIHlvdSBtYXkgYWRkIG9yIGNoYW5nZSBhc3NvY2lhdGlvbnMgdG8gc3VpdCB5b3VyIG5lZWRzCisgICBhbmQgcHJlZmVyZW5jZXMgYnkgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSBBU1NPQ0lBVEUgY29tbWFuZHMgaW4KKyAgIHlvdXIgS2VybWl0IHN0YXJ0dXAgZmlsZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgYSBQQyB1c2VyIGFuZCBkZWFsCisgICBvbmx5IHdpdGggdGV4dCB3cml0dGVuIGluIEdyZWVrIGFuZCBFbmdsaXNoLCB5b3UgY2FuOgorCisgIEFTU09DSUFURSBUUkFOU0ZFUi1DSEFSQUNURVItU0VUIFVURjggQ1A4NjkKKyAgQVNTT0NJQVRFIFRSQU5TRkVSLUNIQVJBQ1RFUi1TRVQgVUNTMiBDUDg2OQorICBBU1NPQ0lBVEUgRklMRS1DSEFSQUNURVItU0VUIENQODY5IFVURjgKKworICAgTm90ZSB0aGF0IHdoZW4gZmlsZSB0cmFuc2ZlciBpbnZvbHZlcyBjb252ZXJzaW9uIGJldHdlZW4gYSBzaW5nbGUtYnl0ZQorICAgY2hhcmFjdGVyIHNldCBhbmQgVUNTLTIgb3IgVVRGLTgsIHRoZSBmaWxlLXRyYW5zZmVyIHRoZXJtb21ldGVyIGFuZAorICAgZXN0aW1hdGVkIHRpbWUgbGVmdCBtaWdodCBiZSBpbmFjY3VyYXRlLCBzaW5jZSB0aGV5IGFyZSBiYXNlZCBvbiB0aGUKKyAgIHNvdXJjZSBmaWxlIHNpemUsIG5vdCB0aGUgdHJhbnNmZXIgZW5jb2RpbmcuIFRoaXMgaXMgcHVyZWx5IGEgY29zbWV0aWMKKyAgIGlzc3VlIGFuZCBkb2VzIG5vdCBlZmZlY3QgdGhlIGZpbmFsIHJlc3VsdC4gKEFuZCBpcyBub3QsIHN0cmljdGx5CisgICBzcGVha2luZywgYSBidWc7IEtlcm1pdCBwcm90b2NvbCBwcmVzZW50bHkgaW5jbHVkZXMgbm8gbWV0aG9kIGZvciB0aGUKKyAgIHNlbmRlciB0byBmdXJuaXNoIGFuICJlc3RpbWF0ZWQgdHJhbnNmZXIgc2l6ZSIgdG8gdGhlIHJlY2VpdmVyLCBhbmQgaW4KKyAgIGFueSBjYXNlIGFueSBzdWNoIGd1ZXNzIGNvdWxkIGJlIGFzIGZhciBvZmYgYXMgdGhlIGZpbGUgc2l6ZSwgZ2l2ZW4KKyAgIHRoZSBtYW55IG90aGVyIGZhY3RvcnMgdGhhdCBjb21lIGludG8gcGxheSwgc3VjaCBhcyBjb21wcmVzc2lvbiBhbmQKKyAgIHByZWZpeGluZykuCisKKyAgIEEgY2F1dGlvbiBhYm91dCBGVFAgYW5kIFVDUy0yLiBBcyBub3RlZCBwcmV2aW91c2x5LCBpZiB5b3UgdHJhbnNmZXIgYQorICAgVUNTLTIgZmlsZSB3aXRoIEZUUCBpbiBiaW5hcnkgbW9kZSBiZXR3ZWVuIHR3byBjb21wdXRlcnMgd2l0aCBvcHBvc2l0ZQorICAgRW5kaWFubmVzcywgdGhlIHJlc3VsdCB3aWxsIGhhdmUgaXRzIGJ5dGVzIGluIHRoZSB3cm9uZyBvcmRlci4KKyAgIEhvd2V2ZXIsIGlmIHlvdSB1c2UgRlRQIHRvIHRyYW5zZmVyIGEgVUNTLTIgZmlsZSBpbiAiYXNjaWkiICh0ZXh0KQorICAgbW9kZSB0byBBTlkgY29tcHV0ZXIsIGV2ZW4gaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHlvdXJzLCB0aGUgcmVzdWx0CisgICB3aWxsIGJlIGNvcnJ1cHRlZCBiZWNhdXNlIEZUUCdzIGxpbmUtdGVybWluYXRvciBjb252ZXJzaW9ucyBkbyBub3QKKyAgIGFjY291bnQgZm9yIFVDUy0yLiBUaGUgc2FtZSBob2xkcyB3aGVuIHNlbmRpbmcgZnJvbSBhIFVDUy1hd2FyZSBLZXJtaXQKKyAgIHByb2dyYW0gdG8gYW4gb2xkZXIgS2VybWl0IHByb2dyYW0gaW4gdGV4dCBtb2RlIHdpdGggYSB0cmFuc2ZlcgorICAgY2hhcmFjdGVyLXNldCBvZiBVQ1MtMi4gU28gdXNlIFVDUy0yIGFzIGEgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCBPTkxZCisgICB3aXRoIGEgVUNTLTItYXdhcmUgS2VybWl0IHBhcnRuZXIuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA2LjYuNS4yLiBUaGUgVFJBTlNMQVRFIENvbW1hbmQKKworICAgSW4gS2VybWl0IHZlcnNpb25zIHRoYXQgaGF2ZSBVbmljb2RlIHN1cHBvcnQgaW5jbHVkZWQsIFRSQU5TTEFURSBub3cKKyAgIGFsd2F5cyBnb2VzIHRocm91Z2ggVW5pY29kZTsgdGhhdCBpcywgdGhlIHNvdXJjZSBzZXQgaXMgY29udmVydGVkIHRvCisgICBVQ1MtMiBhbmQgdGhlbmNlIHRvIHRoZSB0YXJnZXQgc2V0LiBUaGlzIGlzIGEgbWFqb3IgaW1wcm92ZW1lbnQsIHNpbmNlCisgICBpbiBwcmlvciByZWxlYXNlcywgQy1LZXJtaXQgaGFkIHRvIHBpY2sgdGhlICJtb3N0IGFwcHJvcHJpYXRlIgorICAgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCBhcyB0aGUgaW50ZXJtZWRpYXRlIHNldCwgYW5kIHRoaXMgd291bGQgcmVzdWx0CisgICBpbiB0aGUgbG9zcyBvZiBhbnkgY2hhcmFjdGVycyB0aGF0IHRoZSBzb3VyY2UgYW5kIHRhcmdldCBzZXRzIGhhZCBpbgorICAgY29tbW9uIGJ1dCB3ZXJlIGxhY2tpbmcgZnJvbSB0aGUgaW50ZXJtZWRpYXRlIHNldCAoZm9yIGV4YW1wbGUgdGhlIE9FCisgICBkaWdyYXBoIHdoZW4gdHJhbnNsYXRpbmcgZnJvbSBOZVhUIHRvIERFQyBNQ1MgdGhyb3VnaCBMYXRpbi0xKS4gVGhpcworICAgbmV2ZXIgaGFwcGVucyB3aGVuIFVuaWNvZGUgaXMgdGhlIGludGVybWVkaWF0ZSBzZXQgYmVjYXVzZSBVbmljb2RlIGlzCisgICBhIHN1cGVyc2V0IG9mIGFsbCBvdGhlciBjaGFyYWN0ZXIgc2V0cyBzdXBwb3J0ZWQgYnkgS2VybWl0LiBBIG1vcmUKKyAgIGRyYW1hdGljIGV4YW1wbGUgd291bGQgYmUgdHJhbnNsYXRpb24gYmV0d2VlbiBDeXJpbGxpYyBQQyBjb2RlIHBhZ2UKKyAgIDg2NiBhbmQgS09JOC1SIChbNTQ2XVNlY3Rpb24gNi40KTsgZm9ybWVybHkgYWxsIHRoZSBsaW5lLSBhbmQKKyAgIGJveC1kcmF3aW5nIGNoYXJhY3RlcnMgd291bGQgYmUgbG9zdCAoc2luY2UgSVNPIDg4NTktNSBkb2VzIG5vdCBoYXZlCisgICBhbnkpOyBub3cgdGhlIG9uZXMgdGhhdCB0aGVzZSB0d28gc2V0cyBoYXZlIGluIGNvbW1vbiBhcmUgcHJlc2VydmVkLgorCisgICBVQ1MtMiBhbmQgVVRGLTggYXJlIG5vdyBib3RoIHN1cHBvcnRlZCBhcyBzb3VyY2UtZmlsZSBhbmQKKyAgIGRlc3RpbmF0aW9uLWZpbGUgY2hhcmFjdGVyIHNldHMgYnkgQy1LZXJtaXQncyBUUkFOU0xBVEUgY29tbWFuZCwgZm9yCisgICBleGFtcGxlOgorCisgIHRyYW5zbGF0ZSBvb2ZhLnR4dCB1Y3MyIGxhdGluMSBvb2ZhLWwxLnR4dAorCisgICB0cmFuc2xhdGVzIG9vZmEudHh0IGZyb20gVUNTLTIgdG8gTGF0aW4tMSwgc3RvcmluZyB0aGUgcmVzdWx0IGFzCisgICBvb2ZhLWwxLnR4dC4gU2ltaWxhcmx5OgorCisgIHRyYW5zbGF0ZSBvb2ZhLnR4dCB1dGY4IGxhdGluMSBvb2ZhLWwxLnR4dAorICB0cmFuc2xhdGUgb29mYS50eHQgbGF0aW4xIHVjczIgb29mYS11Y3MyLnR4dAorICB0cmFuc2xhdGUgb29mYS50eHQgbGF0aW4xIHV0Zjggb29mYS11dGY4LnR4dAorICB0cmFuc2xhdGUgb29mYS50eHQgdWNzMiB1dGY4IG9vZmEtdXRmOC50eHQKKyAgdHJhbnNsYXRlIG9vZmEudHh0IHV0ZjggdWNzMiBvb2ZhLXVjczIudHh0CisKKyAgIFRyZWF0bWVudCBvZiB0aGUgVUNTLTIgQk9NIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZm9yIGZpbGUgdHJhbnNmZXIuCisgICBOb3RlIHRoYXQgaWYgYSBVQ1MtMiBzb3VyY2UgZmlsZSBpcyBpbiB0aGUgIndyb25nIiBieXRlIG9yZGVyIGFuZAorICAgbGFja3MgYSBCT00sIGFuZCB5b3UgZG9uJ3QgdGVsbCBLZXJtaXQgYWJvdXQgaXQgd2l0aCBTRVQgRklMRSBVQ1MKKyAgIEJZVEUtT1JERVIsIHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zbGF0aW9uIGlzIHRvdGFsIGdpYmJlcmlzaC4gUmVjYWxsCisgICB0aGF0IHlvdSBjYW4gdXNlIENPUFkgL1NXQVAtQllURVMgdG8gc3dpdGNoIHRoZSBieXRlIG9yZGVyIG9mIGFuCisgICBlcnJhbnQgVUNTLTIgZmlsZSAob3IgYW55IG90aGVyIGZpbGUgZm9yIHRoYXQgbWF0dGVyLCBpZiB5b3UgY2FuIHRoaW5rCisgICBvZiBhIHJlYXNvbiB0bykuIEFsc28gbm90ZSB0aGF0OgorCisgIHRyYW5zbGF0ZSBvb2ZhLnR4dCB1Y3MyIHVjczIgbmV3LnR4dAorCisgICBQcm9kdWNlcyBhIHJlc3VsdCBpbiB0aGUgbmF0aXZlIChvciBTRVQgRklMRSBVQ1MpIGJ5dGUtb3JkZXIgYXMgbG9uZworICAgYXMgb29mYS50eHQgaGFzIGEgQk9NLgorCisgICBBcyBhIHNpZGUgYmVuZWZpdCBvZiB0aGUgVW5pY29kZSB3b3JrLCB0aGUgVFJBTlNMQVRFIGNvbW1hbmQgbm93IHdvcmtzCisgICBmb3IgdGhlIGZpcnN0IHRpbWUgYWxzbyBmb3IgYWxsIEphcGFuZXNlIGNoYXJhY3RlciBzZXRzIHRoYXQgS2VybWl0CisgICBzdXBwb3J0cy4gSW4gb3RoZXIgd29yZHMsIGlmIHlvdSBoYXZlIGEgSmFwYW5lc2UgdGV4dCBmaWxlIGluIGFueSBvZgorICAgdGhlIGZvbGxvd2luZyBlbmNvZGluZ3M6CisKKyAgRVVDLUpQCisgIFNoaWZ0LUpJUworICBKSVMtNworICBVQ1MtMgorICBVVEYtOAorCisgICBZb3UgY2FuIHVzZSB0aGUgVFJBTlNMQVRFIGNvbW1hbmQgdG8gY29udmVydCB0byBhbnkgb3RoZXIgZW5jb2RpbmcKKyAgIGZyb20gdGhlIHNhbWUgbGlzdC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDYuNi41LjMuIFRlcm1pbmFsIENvbm5lY3Rpb24KKworICAgVGhlIENPTk5FQ1QgY29tbWFuZCBub3cgYWxsb3dzIFVURi04IGFzIGEgbG9jYWwgb3IgcmVtb3RlIHRlcm1pbmFsCisgICBjaGFyYWN0ZXItc2V0OgorCisgIFNFVCBURVJNSU5BTCBDSEFSQUNURVItU0VUIHsgLi4uLCBVVEY4IH0geyAuLi4sIFVURjggfQorICBTRVQgVEVSTUlOQUwgUkVNT1RFLUNIQVJBQ1RFUi1TRVQgeyAuLi4sIFVURjggfQorICBTRVQgVEVSTUlOQUwgTE9DQUwtQ0hBUkFDVEVSLVNFVCB7IC4uLiwgVVRGOCB9CisKKyAgIChSZWNhbGwgdGhhdCBLZXJtaXQncyB0ZXJtaW5hbCBjaGFyYWN0ZXItc2V0IGhhcyB0d28gImVuZHMiIC0tIHRoZSBzZXQKKyAgIHVzZWQgb24gdGhlIGhvc3QgdG8gd2hpY2ggS2VybWl0IGlzIGNvbm5lY3RlZCwgYW5kIHRoZSBzZXQgdXNlZCBvbiB0aGUKKyAgIGxvY2FsIGtleWJvYXJkIGFuZCBzY3JlZW4uKQorCisgICBVQ1MtMiBpcyBub3Qgc3VwcG9ydGVkIGFzIGEgdGVybWluYWwgY2hhcmFjdGVyLXNldCAoZWl0aGVyIGVuZCkgc2luY2UKKyAgIChhKSBpdCBpcyBub3QgdXNlZCB0aGF0IHdheSBhbnl3aGVyZSB0byBvdXIga25vd2xlZGdlLCBhbmQgKGIpIHRoZQorICAgcHJvYmxlbXMgb2YgRW5kaWFubmVzcyBhbmQgdGhlIGhpZ2ggbGlrZWxpaG9vZCBvZiBsb3NzIG9mCisgICBzeW5jaHJvbml6YXRpb24gbWFrZSBpdCBpbXByYWN0aWNhbC4gKFRlbGVjb21tdW5pY2F0aW9ucyBpcworICAgYnl0ZS1vcmllbnRlZDsgaWYgb25lIGJ5dGUsIG9yIGFueSBvZGQgbnVtYmVyIG9mIGJ5dGVzLCBpcyBsb3N0CisgICBiZWNhdXNlIG9mIGJ1ZmZlciBvdmVycnVucywgY2lyY3VpdCByZXNldHMsIGV0YyAob3IgbGlrZXdpc2UgaWYgYQorICAgYnVyc3Qgb2Ygbm9pc2UgYXBwZWFycyB0aGF0IHRha2VzIHRoZSBndWlzZSBvZiBhbiBvZGQgbnVtYmVyIG9mCisgICBieXRlcyksIHRoZSBieXRlIG9yZGVyIG9mIHRoZSBzdWJzZXF1ZW50IGRhdGEgc3RyZWFtIHdpbGwgYmUKKyAgIGJhY2t3YXJkczsgdW5saWtlIFVURi04IGFuZCB0cmFkaXRpb25hbCBieXRlLWJhc2VkIGNoYXJhY3RlciBzZXRzLAorICAgVUNTLTIgaXMgbm90ICJzZWxmIHN5bmNocm9uaXppbmciLikKKworICAgVVRGLTggZG9lcyBub3QgaGF2ZSBieXRlLW9yZGVyIG9yIHN5bmNocm9uaXphdGlvbiBwcm9ibGVtcyBhbmQgaXMKKyAgIGdyb3dpbmcgaW4gcG9wdWxhcml0eSBhcyBhIHRlcm1pbmFsIGNoYXJhY3RlciBzZXQgYXMgd2VsbCBhcyBpbiBvdGhlcgorICAgYXBwbGljYXRpb24gYXJlYXMuIEl0IGFsbG93cyBhIHNpbmdsZSB0ZXJtaW5hbCBzZXNzaW9uIHRvIHVzZSBtdWx0aXBsZQorICAgc2NyaXB0cyAoUm9tYW4sIEN5cmlsbGljLCBHcmVlaywgZXRjKSB3aXRob3V0IElTTyAyMDIyIGNoYXJhY3Rlci1zZXQKKyAgIHN3aXRjaGluZyAod2hpY2ggdGVybWluYWwgZW11bGF0b3JzIGxpa2UgS2VybWl0IDk1IGNhbiBoYW5kbGUgYnV0IGZldworICAgaG9zdCBhcHBsaWNhdGlvbnMgdW5kZXJzdGFuZCBvciB1c2UpLCBhbmQgbWVzaGVzIG5pY2VseSB3aXRoIHRoZQorICAgVW5pY29kZSBzY3JlZW4gZm9udHMgdGhhdCBhcmUgYmVnaW5uaW5nIHRvIGFwcGVhci4KKworICAgVVRGLTggd2FzIGZpcnN0IHVzZWQgaW4gUGxhbiA5IGFuZCBzb29uIHdpbGwgYmUgYXZhaWxhYmxlIGluIExpbnV4LiBJdAorICAgd2lsbCBwcm9iYWJseSBzcHJlYWQgZnJvbSB0aGVyZSAoVW5pY29kZSBpbiBzb21lIGZvcm0gaXMsIG9mIGNvdXJzZSwKKyAgIGFsc28gdXNlZCBpbiBXaW5kb3dzIE5ULCBidXQgb25seSBpbnRlcm5hbGx5IC0tIG5vdCBmb3IgYWNjZXNzIGZyb20KKyAgIG91dHNpZGUpLgorCisgICBUbyB1c2UgVVRGLTggb3IgYW55IG90aGVyIGNoYXJhY3RlciBzZXQgdGhhdCB1c2VzIDgtYml0IGJ5dGVzIGluIHlvdXIKKyAgIHRlcm1pbmFsIHNlc3Npb24sIGJlIHN1cmUgdG8gdGVsbCBDLUtlcm1pdCB0bzoKKworICBTRVQgVEVSTUlOQUwgQllURVNJWkUgOAorICBTRVQgQ09NTUFORCBCWVRFU0laRSA4CisgIFNFVCBQQVJJVFkgTk9ORQorCisgICAob3IgdXNlIHRoZSBzaG9ydGN1dCBjb21tYW5kLCBFSUdIVEJJVCwgd2hpY2ggZG9lcyBhbGwgdGhyZWUgYXQgb25jZSkuCisKKyAgIEluIGEgc2V0dXAgd2hlcmUgeW91ciBsb2NhbCBLZXJtaXQgcHJvZ3JhbSB1c2VzIGEgc2luZ2xlLWJ5dGUKKyAgIGNoYXJhY3RlciBzZXQgc3VjaCBhcyBQQyBDb2RlIFBhZ2UgODUwIGFuZCB0aGUgcmVtb3RlIGhvc3QgdXNlcyBVVEYtODoKKworICBTRVQgVEVSTSBDSEFSIFVURjggQ1A4NTAKKworICAgb3I6CisKKyAgU0VUIFRFUk0gUkVNT1RFIENIQVIgVVRGOAorICBTRVQgVEVSTSBMT0NBTCBDSEFSIENQODUwCisKKyAgIGFsbCB3b3JrcyBhcyBleHBlY3RlZC4gVVRGLTggdGV4dCBvbiB0aGUgcmVtb3RlIGRpc3BsYXlzIGNvcnJlY3RseSBvbgorICAgeW91ciBzY3JlZW4sIGFuZCB3aGVuIHlvdSB0eXBlIENQODUwIGNoYXJhY3RlcnMsIHRoZXkgYXJlIHRyYW5zbGF0ZWQKKyAgIHRvIFVURi04IHNlcXVlbmNlcyBmb3IgdHJhbnNtaXNzaW9uLCBhbmQgdGhlIGVjaG8gZnJvbSB0aGUgaG9zdCBpcworICAgdHJhbnNsYXRlZCBmcm9tIFVURi04IGJhY2sgdG8gQ1A4NTAuIFRlbG5ldCBuZWdvdGlhdGlvbnMgYW5kCisgICBhdXRvZG93bmxvYWQgdGFrZSBwbGFjZSBiZWZvcmUgYW55IGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gYW5kIHdvcmsKKyAgIGFzIGJlZm9yZS4gVGhlIHNlc3Npb24gbG9nIChpZiB0ZXh0IG1vZGUgd2FzIHNlbGVjdGVkIGZvciBpdCkgY29udGFpbnMKKyAgIG9ubHkgdGhlIGxvY2FsIHRlcm1pbmFsIGNoYXJhY3Rlci1zZXQuIEFuZCBzbyBvbi4KKworICAgS2VybWl0IG1lcmVseSBzdXBwbGllcyB0cmFuc2xhdGlvbnMgZnJvbSBVVEYtOCB0byB5b3VyIGxvY2FsIHRlcm1pbmFsCisgICBjaGFyYWN0ZXItc2V0ICh0aGlzIGluY2x1ZGVzIHRyZWF0aW5nIFVURi04IExpbmUgU2VwYXJhdG9yIGFuZAorICAgUGFyYWdyYXBoIHNlcGFyYXRvciBhcyBDUkxGKS4gSG93ZXZlciwgS2VybWl0IGRvZXMgZG9lcyBub3QsIGF0CisgICBwcmVzZW50LCBwZXJmb3JtICJjYW5vbmljYWxpemF0aW9uIiBvZiBjb21wb3NlZCBzZXF1ZW5jZXMsIG5vciBkb2VzIGl0CisgICBhdXRvbWF0aWNhbGx5IGV4ZWN1dGUgYmlkaXJlY3Rpb25hbGl0eSBhbGdvcml0aG1zIGZvciBkaXNwbGF5IG9mCisgICBtaXhlZC1kaXJlY3Rpb24gdGV4dCAoZS5nLiBIZWJyZXcgYW5kIEVuZ2xpc2gpLiBTdWNoIHByZXNlbnRhdGlvbgorICAgaXNzdWVzLCBsaWtlIGFsbCBvdGhlcnMgaW4gdGhlIHRlcm1pbmFsLWhvc3QgcmVnaW1lLCBhcmUgbGVmdCB0byB0aGUKKyAgIGhvc3QuCisKKyAgIEJ5IHRoZSB3YXksIEMtS2VybWl0IGFsc28gYWxsb3dzIFVURi04IHRvIGJlIHRoZSBsb2NhbCBlbmQgb2YgdGhlCisgICB0ZXJtaW5hbCBjaGFyYWN0ZXItc2V0LCBidXQgc28gZmFyIHRoaXMgY29kZSBpcyBub3QgdGVzdGVkLCBzaW5jZSB3ZQorICAgZG9uJ3QgaGF2ZSBhIFVURi04IGNvbnNvbGUgb3IgdGVybWluYWwgdG8gd29yayB3aXRoLiBIb3dldmVyLCBpdCBjYW4KKyAgIGJlIHN0YXRlZCB3aXRob3V0IGRvdWJ0IHRoYXQgQy1LZXJtaXQncyBrZXkgbWFwcGluZyB3aWxsIG5vdCB3b3JrIGZvcgorICAgVVRGLTggdmFsdWVzLCBzaW5jZSAoYSkgdGhlIGtleSBtYXAgaXMgaW5kZXhlZCBieSA4LWJpdCBieXRlIHZhbHVlcworICAgYW5kIChiKSBDLUtlcm1pdCByZWFkcyBrZXlzdHJva2VzIGEgYnl0ZSBhdCBhIHRpbWUgKHRoZXNlIGNvbW1lbnRzIGRvCisgICBub3QgYXBwbHkgdG8gSzk1LCB3aGljaCBoYXMgZGlyZWN0IGFjY2VzcyB0byB0aGUga2V5Ym9hcmQgYW5kIGNhbiByZWFkCisgICAid2lkZSIga2V5Y29kZXMgYW5kIHVzZXMgdGhlbSB0byBpbmRleCBhICJ3aWRlIiBrZXltYXApLgorCisgICBSZXN0cmljdGlvbnM6IEFzIG5vdGVkLCB0aGUgQ09OTkVDVCBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgVUNTLTIgYXMKKyAgIGEgUkVNT1RFIFRFUk1JTkFMIGNoYXJhY3Rlci1zZXQuIE5laXRoZXIgZG9lcyBpdCBzdXBwb3J0IHRoZSBKYXBhbmVzZQorICAgc2V0cyBFVUMtSlAsIEpJUy03LCBhbmQgU2hpZnQtSklTLiBTdXBwb3J0IGZvciB0aGUgSmFwYW5lc2Ugc2V0cyAoYW5kCisgICBwb3NzaWJseSBDaGluZXNlIGFuZCBLb3JlYW4gdG9vKSBtaWdodCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorICAgU2luY2UgdGhlIFRSQU5TTUlUIGNvbW1hbmQgKG5leHQgc2VjdGlvbikgdXNlcyB0aGUgc2FtZSBSRU1PVEUKKyAgIFRFUk1JTkFMIGNoYXJhY3Rlci1zZXRzIGFzIHRoZSBDT05ORUNUIGNvbW1hbmQsIGl0IGhhcyB0aGUgc2FtZQorICAgcmVzdHJpY3Rpb25zLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNi42LjUuNC4gVGhlIFRSQU5TTUlUIENvbW1hbmQKKworICAgQXMgZGVzY3JpYmVkIGluIENoYXB0ZXIgMTUgb2YgWzU0N11Vc2luZyBDLUtlcm1pdCBhbmQgWzU0OF1TZWN0aW9uCisgICA0LjIxIG9mIHRoaXMgZG9jdW1lbnQsIHRoZSBUUkFOU01JVCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHVwbG9hZCBhCisgICBmaWxlIHdpdGhvdXQgcHJvdG9jb2wsIG1vcmUgb3IgbGVzcyBhcyBpZiB5b3Ugd2VyZSB0eXBpbmcgaXQgb24geW91cgorICAga2V5Ym9hcmQgd2hpbGUgY29ubmVjdGVkIHRvIHRoZSBob3N0LiBXaGVuIFRSQU5TTUlUdGluZyBpbiB0ZXh0IG1vZGUsCisgICB0aGUgZmlsZSdzIGNoYXJhY3RlciBzZXQgaXMgY29udmVydGVkIHRvIHRoZSBob3N0J3MgdW5sZXNzIHlvdSBoYXZlCisgICBTRVQgVEVSTUlOQUwgQ0hBUkFDVEVSLVNFVCBUUkFOU1BBUkVOVCwgb3IgeW91IGluY2x1ZGUgdGhlIG5ldworICAgVFJBTlNNSVQgc3dpdGNoLCAvVFJBTlNQQVJFTlQuCisKKyAgIEJlZm9yZSBDLUtlcm1pdCA3LjAsIHRoZSBmaWxlIGNoYXJhY3Rlci1zZXQgd2FzIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWUKKyAgIGFzIHRoZSBsb2NhbCBlbmQgb2YgdGhlIHRlcm1pbmFsIGNoYXJhY3Rlci1zZXQsIGFuZCB0aGUgVFJBTlNNSVQKKyAgIGNvbW1hbmQgdXNlZCB0aGUgc2FtZSB0cmFuc2xhdGlvbnMgYXMgdGhlIENPTk5FQ1QgY29tbWFuZCwgaWdub3JpbmcKKyAgIHRoZSBmaWxlIGNoYXJhY3Rlci1zZXQuCisKKyAgIEluIEMtS2VybWl0IDcuMCwgdGhhdCBhc3N1bXB0aW9uIChhIHBvb3Igb25lIHRvIGJlZ2luIHdpdGgpIGNhbiBubworICAgbG9uZ2VyIGJlIG1hZGUsIHNpbmNlIFVDUy0yIGNhbiBiZSBhIGZpbGUgY2hhcmFjdGVyLXNldCBidXQgbm90IGEKKyAgIHRlcm1pbmFsIGNoYXJhY3Rlci1zZXQuIFNvIG5vdyB0aGUgZmlsZSdzIGNoYXJhY3Rlci1zZXQgaXMgZ2l2ZW4gYnkKKyAgIHlvdXIgbW9zdCByZWNlbnQgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCBjb21tYW5kLiBUaGUgaG9zdCdzIGNoYXJhY3RlcgorICAgc2V0IGlzIHRoZSByZW1vdGUgZW5kIG9mIHlvdXIgbW9zdCByZWNlbnQgU0VUIFRFUk1JTkFMIENIQVJBQ1RFUi1TRVQKKyAgIGNvbW1hbmQ6CisKKyAgU0VUIFRFUk1JTkFMIENIQVJBQ1RFUi1TRVQgcmVtb3RlLXNldCBbIGxvY2FsLXNldCBdCisKKyAgIG9yOgorCisgIFNFVCBURVJNSU5BTCBSRU1PVEUtQ0hBUkFDVEVSLVNFVCByZW1vdGUtc2V0CisKKyAgIFRoZSBUUkFOU01JVCBjb21tYW5kIGNvbnZlcnRzIGVhY2ggc291cmNlLWZpbGUgY2hhcmFjdGVyIGZyb20gdGhlIEZJTEUKKyAgIGNoYXJhY3Rlci1zZXQgdG8gdGhlIFJFTU9URSBURVJNSU5BTCBjaGFyYWN0ZXItc2V0LCBhbmQgdGhlbiB0cmFuc21pdHMKKyAgIHRoZSB0cmFuc2xhdGVkIGNoYXJhY3RlcnMgYWNjb3JkaW5nIHRvIHlvdXIgU0VUIFRSQU5TTUlUIHByZWZlcmVuY2VzCisgICAoQ2hhcHRlciAxNSkuCisKKyAgIElmIHlvdSBoYXZlIFNFVCBUUkFOU01JVCBFQ0hPIE9OLCBhbmQgdGhlIGhvc3QgaXMgZWNob2luZyB0aGUKKyAgIHRyYW5zbWl0dGVkIGNoYXJhY3RlcnMsIHRoZSBlY2hvcyBhcmUgY29udmVydGVkIGZyb20gdGhlIHJlbW90ZQorICAgdGVybWluYWwgY2hhcmFjdGVyLXNldCB0byB0aGUgbG9jYWwgdGVybWluYWwgY2hhcmFjdGVyLXNldC4KKworICBbIEEgcGljdHVyZSB3b3VsZCBoZWxwLi4uIF0KKworICAgQ29uZnVzZWQ/IExldCdzIHdvcmsgdGhyb3VnaCBhbiBleGFtcGxlLiBTdXBwb3NlIHlvdXIgbG9jYWwgY29tcHV0ZXIKKyAgIGlzIGEgTmVYVHN0YXRpb24sIG9uIHdoaWNoIHRleHQgZmlsZXMgYXJlIGVuY29kZWQgaW4gdGhlIE5lWFQKKyAgIGNoYXJhY3RlciBzZXQsIGFuZCB0aGF0IHRoZSByZW1vdGUgY29tcHV0ZXIgaXMgYSBEYXRhIEdlbmVyYWwgQVZpaU9OLAorICAgd2hpY2ggdXNlcyB0aGUgRGF0YSBHZW5lcmFsIEludGVybmF0aW9uYWwgY2hhcmFjdGVyIHNldC4gRnVydGhlcgorICAgc3VwcG9zZSB0aGF0IHlvdSBhcmUgbG9nZ2VkIGluIHRvIHRoZSBOZVhUIGZyb20gYSBWVDIyMCB0ZXJtaW5hbCB3aGljaAorICAgdXNlcyB0aGUgREVDIE11bHRpbmF0aW9uYWwgY2hhcmFjdGVyIHNldC4KKworICAgWW91IG5lZWQgdG8gY29udmVydCB0aGUgZmlsZSBmcm9tIE5lWFQgZW5jb2RpbmcgdG8gREcgZW5jb2RpbmcgYW5kCisgICBjb252ZXJ0IHRoZSBlY2hvZXMgZnJvbSBERyBlbmNvZGluZyB0byBERUMgZW5jb2RpbmcuIFNvIG9uIHRoZSBOZVhULAorICAgdGVsbCBDLUtlcm1pdCB0bzoKKworICBlaWdodGJpdAorICBzZXQgZmlsZSBjaGFyYWN0ZXItc2V0IG5leHQKKyAgc2V0IHRlcm0gY2hhcmFjdGVyLXNldCBkZy1pbnRlcm5hdGlvbmFsIGRlYy1tY3MKKyAgdHJhbnNtaXQgL3RleHQgbmV4dGRhdGEudHh0CisKKyAgIChUaGlzIGFzc3VtZXMgeW91IGhhdmUgc29tZSBzb3J0IG9mIGNvbGxlY3Rpb24gcHJvY2VzcyBhbHJlYWR5IHNldCB1cAorICAgb24gdGhlIERhdGEgR2VuZXJhbCwgc3VjaCBhcyBhIHRleHQgZWRpdG9yIG9yIHRoZSB2ZW5lcmFibGUgImNhdCA+CisgICBmb28iLiBUaGUgRUlHSFRCSVQgY29tbWFuZCBpcyBlcXVpdmFsZW50IHRvIFNFVCBURVJNSU5BTCBCWVRFU0laRSA4LAorICAgU0VUIENPTU1BTkQgQllURVNJWkUgOCwgU0VUIFBBUklUWSBOT05FLikKKworICAgVG8gZnVydGhlciBjb21wbGljYXRlIG1hdHRlcnMsIHN1cHBvc2UgeW91ciBsb2NhbCB0ZXJtaW5hbCBjaGFyYWN0ZXIKKyAgIHNldCBpcyB0aGUgc2FtZSBhcyB0aGUgcmVtb3RlIG9uZSwgc28geW91IGRvbid0IG5lZWQgdGVybWluYWwKKyAgIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24sIGJ1dCB5b3UgbmVlZCB0byBUUkFOU01JVCBhIGZpbGUgdGhhdCBpcyBpbgorICAgYSBkaWZmZXJlbnQgY2hhcmFjdGVyIHNldCBhbmQgeW91IHdhbnQgaXQgdHJhbnNsYXRlZCB0byB0aGUgaG9zdCBzZXQuCisgICBJbiB0aGlzIGNhc2UsIHVzZSBTRVQgVEVSTSBDSEFSQUNURVItU0VUIHRvIGFjdHVhbGx5IHNwZWNpZnkgdGhlCisgICBjaGFyYWN0ZXIgc2V0IHVzZWQgb24gZWFjaCBlbmQsIHJhdGhlciB0aGFuIHNwZWNpZnlpbmcgVFJBTlNQQVJFTlQ6CisKKyAgZWlnaHRiaXQKKyAgc2V0IGZpbGUgY2hhcmFjdGVyLXNldCB1Y3MyCisgIHNldCB0ZXJtIGNoYXJhY3Rlci1zZXQgbGF0aW4xIGxhdGluMQorICB0cmFuc21pdCAvdGV4dCB1Y3MyZGF0YS50eHQKKworICAgVGhlIGRpc3RpbmN0aW9uIGJldHdlZW46CisKKyAgU0VUIFRFUk1JTkFMIENIQVJBQ1RFUi1TRVQgeHh4IHl5eQorCisgICAod2hlcmUgeHh4IGFuZCB5eXkgYXJlIHRoZSBzYW1lIHNldCkgYW5kOgorCisgIFNFVCBURVJNSU5BTCBDSEFSQUNURVItU0VUIFRSQU5TUEFSRU5UCisKKyAgIGlzIG5ldyB0byBDLUtlcm1pdCA3LjAsIGJ1dCBhZmZlY3RzIG9ubHkgdGhlIFRSQU5TTUlUIGNvbW1hbmQuCisKKyAgIFRoZSBUUkFOU01JVCBjb21tYW5kIGN1cnJlbnRseSBkb2VzIG5vdGhpbmcgc3BlY2lhbCB3aXRoIFVDUy0yL1VURi04CisgICBMaW5lIGFuZCBQYXJhZ3JhcGggU2VwYXJhdG9yIGNoYXJhY3RlcnM7IG1vcmUgZXhwZXJpZW5jZSBpcyByZXF1aXJlZAorICAgdG8gZmluZCBvdXQgaG93IHRoZXNlIGJlaGF2ZSBpbiBhIGdlbnVpbmUgVW5pY29kZSB0ZXJtaW5hbC1ob3N0CisgICBzZXR0aW5nLgorCisgICBSZXN0cmljdGlvbnM6IEFzIG5vdGVkLCB0aGUgVFJBTlNNSVQgY29tbWFuZCB0cmFuc2xhdGVzIGZyb20gdGhlIEZJTEUKKyAgIGNoYXJhY3Rlci1zZXQgdG8gdGhlIFJFTU9URSBURVJNSU5BTCBjaGFyYWN0ZXItc2V0LiBUaGlzIHJ1bGVzIG91dAorICAgdHJhbnNsYXRpb25zIHRvIGFueSBjaGFyYWN0ZXIgc2V0IHRoYXQgaXMgbm90IHN1cHBvcnRlZCBhcyBhIFJFTU9URQorICAgVEVSTUlOQUwgY2hhcmFjdGVyLXNldCwgc3VjaCBhcyBVQ1MtMiwgRVVDLUpQLCBKSVMtNywgYW5kIFNoaWZ0LUpJUy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDYuNi41LjUuIFN1bW1hcnkgb2YgS2VybWl0IFVuaWNvZGUgQ29tbWFuZHMKKworICAgU3BlY2lmeWluZyBmaWxlIGNoYXJhY3Rlci1zZXQgYW5kIGJ5dGUgb3JkZXI6CisgICAgICAgICAgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCB7IC4uLiwgVUNTMiwgVVRGOCB9CisgICAgICAgICAgUkVNT1RFIFNFVCBGSUxFIENIQVJBQ1RFUi1TRVQgeyAuLi4sIFVDUzIsIFVURjggfSAoU2VlIG5leHQKKyAgICAgICAgICBzZWN0aW9uKQorICAgICAgICAgIFNFVCBGSUxFIFVDUyBCT00geyBPTiwgT0ZGIH0KKyAgICAgICAgICBTRVQgRklMRSBVQ1MgQllURS1PUkRFUiB7IEJJRy1FTkRJQU4sIExJVFRMRS1FTkRJQU4gfQorCisgICBTcGVjaWZ5aW5nIHRoZSB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0OgorICAgICAgICAgIFNFVCBUUkFOU0ZFUiBDSEFSQUNURVItU0VUIHsgLi4uLCBVQ1MtMiwgVVRGLTggfQorICAgICAgICAgIFJFTU9URSBTRVQgVFJBTlNGRVIgQ0hBUkFDVEVSLVNFVCB7IC4uLiwgVUNTLTIsIFVURi04IH0KKworICAgU3BlY2lmeWluZyB0aGUgdGVybWluYWwgY2hhcmFjdGVyLXNldDoKKyAgICAgICAgICBTRVQgVEVSTUlOQUwgQ0hBUkFDVEVSLVNFVCB7IC4uLiwgVVRGOCB9IHsgLi4uLCBVVEY4IH0KKyAgICAgICAgICBTRVQgVEVSTUlOQUwgUkVNT1RFLUNIQVJBQ1RFUi1TRVQgeyAuLi4sIFVURjggfQorICAgICAgICAgIFNFVCBURVJNSU5BTCBMT0NBTC1DSEFSQUNURVItU0VUIHsgLi4uLCBVVEY4IH0KKworICAgRGlzcGxheWluZyBzZXR0aW5nczoKKyAgICAgICAgICBTSE9XIEZJTEUKKyAgICAgICAgICBTSE9XIFRSQU5TRkVSCisgICAgICAgICAgU0hPVyBURVJNSU5BTAorICAgICAgICAgIFNIT1cgQ0hBUkFDVEVSLVNFVFMKKworICAgQ29tbWFuZHMgdGhhdCB1c2UgdGhlc2Ugc2V0dGluZ3MgaW5jbHVkZToKKyAgICAgICAgICBTRU5ELCBSRUNFSVZFLCBHRVQsIGV0Yy4KKyAgICAgICAgICBDT05ORUNUCisgICAgICAgICAgVFJBTlNNSVQKKyAgICAgICAgICBMT0cgU0VTU0lPTgorCisgICBDb252ZXJ0aW5nIGZpbGVzOgorICAgICAgICAgIFRSQU5TTEFURSBpbmZpbGUgeyAuLi4sIFVDUy0yLCBVVEYtOCB9IHsgLi4uLCBVQ1MtMiwgVVRGLTggfQorICAgICAgICAgIG91dGZpbGUKKyAgICAgICAgICBDT1BZIC9TV0FQLUJZVEVTIGluZmlsZSBvdXRmaWxlCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNi43LiBDbGllbnQvU2VydmVyIENoYXJhY3Rlci1TZXQgU3dpdGNoaW5nCisKKyAgIEEgc2ltcGxlIG1lY2hhbmlzbSBoYXMgYmVlbiBhZGRlZCB0byBhbGxvdyB0aGUgY2xpZW50IHRvIGNoYW5nZSB0aGUKKyAgIHNlcnZlcidzIEZJTEUgQ0hBUkFDVEVSLVNFVDoKKworICAgUkVNT1RFIFNFVCBGSUxFIENIQVJBQ1RFUi1TRVQgbmFtZQorICAgICAgICAgIFRoZSBjbGllbnQgYXNrcyB0aGUgc2VydmVyIHRvIGNoYW5nZSBpdHMgZmlsZSBjaGFyYWN0ZXItc2V0IHRvCisgICAgICAgICAgdGhlIG9uZSBnaXZlbi4gVGhlIG5hbWUgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIHNlcnZlcidzIGZpbGUKKyAgICAgICAgICBjaGFyYWN0ZXItc2V0IG5hbWVzLiBGb3IgY29udmVuaWVuY2UsIEMtS2VybWl0IHVzZXMgaXRzIG93bgorICAgICAgICAgIGZpbGUgY2hhcmFjdGVyLXNldCBrZXl3b3JkIGxpc3QgZm9yIHBhcnNpbmcgdGhpcyBjb21tYW5kIHNvIHlvdQorICAgICAgICAgIGNhbiB1c2UgPyBmb3IgaGVscCBhbmQgVGFiIG9yIEVzYyBmb3IgY29tcGxldGlvbi4gSG93ZXZlciwKKyAgICAgICAgICBzaW5jZSB0aGUgc2VydmVyIG1pZ2h0IGhhdmUgYSBkaWZmZXJlbnQgcmVwZXJ0b2lyZSAob3IgZXZlbiB1c2UKKyAgICAgICAgICBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSBzYW1lIHNldHMpLCBDLUtlcm1pdCBhY2NlcHRzIGFueSBzdHJpbmcKKyAgICAgICAgICB5b3Ugc3VwcGx5IGFuZCBzZW5kcyBpdCB0byB0aGUgc2VydmVyLiBUaGUgc2VydmVyLCBpZiBpdAorICAgICAgICAgIHN1cHBvcnRzIHRoaXMgY29tbWFuZCAoQy1LZXJtaXQgNy4wIGFuZCBLOTUgMS4xLjE5IGRvKSwgc2V0cworICAgICAgICAgIGl0cyBmaWxlIGNoYXJhY3Rlci1zZXQgYXMgcmVxdWVzdGVkLCBhbmQgYWxzbyBkaXNhYmxlcworICAgICAgICAgIGF1dG9tYXRpYyBjaGFyYWN0ZXItc2V0IHN3aXRjaGluZyAoWzU0OV1TZWN0aW9uIDYuNSkuIElmIHRoZQorICAgICAgICAgIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgY29tbWFuZCBvciBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0CisgICAgICAgICAgdGhlIGdpdmVuIGNoYXJhY3RlciBzZXQsIHRoZSBSRU1PVEUgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVAorICAgICAgICAgIGNvbW1hbmQgZmFpbHMuCisKKyAgIEhlcmUncyBhbiBleGFtcGxlIHRoYXQgc2VuZHMgYSBKYXBhbmVzZSB0ZXh0IGZpbGUgZW5jb2RlZCBpbiBTaGlmdC1KSVMKKyAgIHRvIGEgc2VydmVyIHVzaW5nIGV2ZXJ5IGNvbWJpbmF0aW9uIG9mIEtlcm1pdCdzIEphcGFuZXNlLWNhcGFibGUgZmlsZQorICAgYW5kIHRyYW5zZmVyIGNoYXJhY3RlciBzZXRzOgorCisgIGRjbCBcJnhbXSA9IGV1YyB1Y3MyIHV0ZjggICAgICAgICAgICAgOyB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0cworICBkY2wgXCZ5W10gPSBldSB1YyB1dCAgICAgICAgICAgICAgICAgIDsgMi1sZXR0ZXIgYWJicmV2aWF0aW9ucyBmb3IgdGhlbQorICBkY2wgXCZmW10gPSBzaGlmdCBldWMgamlzNyB1Y3MyIHV0ZjggIDsgZmlsZSBjaGFyYWN0ZXItc2V0cworICBkY2wgXCZnW10gPSBzaiBldSBqNyB1YyB1dCAgICAgICAgICAgIDsgMi1sZXR0ZXIgYWJicmV2aWF0aW9ucworCisgIHNldCBmaWxlIGNoYXIgc2hpZnQtamlzICAgICAgICAgICAgICAgOyBsb2NhbCBmaWxlIGNoYXJhY3Rlci1zZXQgaXMgU2hpZnQtSklTCisgIGZvciBcJWkgMSBcZmRpbSgmeCkgMSB7ICAgICAgICAgICAgICAgOyBmb3IgZWFjaCB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0Li4uCisgICAgICBzZXQgeGZlciBjaGFyIFwmeFtcJWldICAgICAgICAgICAgOyBzZXQgaXQKKyAgICAgIGZvciBcJWogMSBcZmRpbSgmZikgMSB7ICAgICAgICAgICA7IGZvciBlYWNoIHJlbW90ZSBmaWxlIGNoYXJhY3Rlci1zZXQuLi4KKyAgICAgICAgICByZW1vdGUgc2V0IGZpbGUgY2hhciBcJmZbXCVqXSA7IHNldCBpdAorICAgICAgICAgIGlmIGZhaWwgZXhpdCAxIFNFUlZFUiBSRUpFQ1RFRCBDSEFSU0VUCisgICAgICAgICAgc2VuZCAvdGV4dCBtZWliby1zai5odG1sIG1laWJvLXNqLVwmeVtcJWldLVwmZ1tcJWpdLnR4dCA7IHNlbmQgdGhlIGZpCitsZQorICAgICAgICAgIGlmIGZhaWwgZXhpdCAxIFRSQU5TRkVSIEZBSUxFRAorICAgICAgfQorICB9CisKKyAgIFRoZSBLZXJtaXQtMzcwIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFJFTU9URSBTRVQgRklMRSBDSEFSQUNURVItU0VULAorICAgYnV0IHNpbmNlIGl0IHN1cHBvcnRzIFJFTU9URSBLRVJNSVQgY29tbWFuZHMsIHlvdSBjYW4gZ2V0IHRoZSBzYW1lCisgICBlZmZlY3Qgd2l0aCBSRU1PVEUgS0VSTUlUIFNFVCBGSUxFIENIQVJBQ1RFUi1TRVQgbmFtZS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LiBTQ1JJUFQgUFJPR1JBTU1JTkcKKworICAgKEFsc28gc2VlIFs1NTBdU2VjdGlvbiAyLjgsIFNjcmlwdGluZyBMb2NhbCBQcm9ncmFtcy4pCisKKyAgNy4wLiBCdWcgRml4ZXMKKworICAgVGhlIGZvbGxvd2luZyBzY3JpcHQgcHJvZ3JhbW1pbmcgYnVncyB3ZXJlIGZpeGVkIGluIEMtS2VybWl0IDcuMDoKKworICAgICAqIElGIEVYSVNUIGFuZCBJRiBESVJFQ1RPUlkgd2VyZSBmaXhlZCB0byBwcm9wZXJseSBzdHJpcCBicmFjZXMgZnJvbQorICAgICAgIGFyb3VuZCB0aGVpciBhcmd1bWVudHMsIHNvICJpZiBkaXJlY3Rvcnkge0M6XFByb2dyYW0gRmlsZXN9IiwgZXRjLAorICAgICAgIHdvdWxkIHdvcmsgYXMgZXhwZWN0ZWQuIEhvd2V2ZXIsIHRoaXMgbWVhbnMgdGhhdCBpZiB0aGUgZmlsZSBvcgorICAgICAgIGRpcmVjdG9yeSBuYW1lIGlzIGFjdHVhbGx5IGVuY2xvc2VkIGluIGJyYWNlcywgdGhlIGJyYWNlcyBtdXN0IGJlCisgICAgICAgZG91YmxlZC4KKyAgICAgKiBUaGUgUkVBRCBjb21tYW5kIGRpZCBub3QgZmFpbCBpZiB0aGUgUkVBRCBmaWxlIHdhc24ndCBvcGVuOyBub3cgaXQKKyAgICAgICBkb2VzLgorICAgICAqIFRoZSBSRUFEIGNvbW1hbmQgcmVmdXNlZCB0byByZWFkIHRoZSBsYXN0IG9yIG9ubHkgbGluZSBvZiBhIGZpbGUKKyAgICAgICBpZiBpdCBkaWQgbm90IGVuZCB3aXRoIGEgcHJvcGVyIGxpbmUgdGVybWluYXRvcjsgbm93IGl0IGRvZXMuCisgICAgICogVGhlIEVORCBjb21tYW5kLCB3aGVuIGdpdmVuIGZyb20gd2l0aGluIGEgU1dJVENIIHN0YXRlbWVudCwgZGlkCisgICAgICAgbm90IGV4aXQgZnJvbSB0aGUgY3VycmVudCBtYWNybyBvciBjb21tYW5kIGZpbGU7IGluc3RlYWQgaXQganVzdAorICAgICAgIHRlcm1pbmF0ZWQgdGhlIFNXSVRDSC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjEuIFRoZSBJTlBVVCBDb21tYW5kCisKKyAgIDcuMS4xLiBJTlBVVCBUaW1lb3V0cworCisgICBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIElOUFVUIGNvbW1hbmQgb24gcGFnZSA0MjIgZmFpbHMgdG8gbWVudGlvbiB0aGUKKyAgIGZvbGxvd2luZyB0d28gcG9pbnRzIGFib3V0IHRoZSB0aW1lb3V0ICh3aGljaCBhcHBseSB0byBDLUtlcm1pdCA2LjAKKyAgIGFuZCBsYXRlcik6CisKKyAgICAxLiAiSU5QVVQgLTEgdGV4dCIgKG9yICJJTlBVVCBcJXggdGV4dCIsIHdoZXJlIFwleCBpcyBhbnkgdmFyaWFibGUKKyAgICAgICB3aG9zZSB2YWx1ZSBpcyAtMSBvciBsZXNzKSBtZWFucyAid2FpdCBmb3JldmVyIi4gVGhpcyBmb3JtIG9mIHRoZQorICAgICAgIElOUFVUIGNvbW1hbmQgZmFpbHMgb25seSBpZiBpdCBpcyBpbnRlcnJ1cHRlZCwgc2luY2UgaXQgd2lsbCBuZXZlcgorICAgICAgIHRpbWUgb3V0LgorICAgIDIuIElOUFVUIDAgcGVyZm9ybXMgYSBub25ibG9ja2luZyByZWFkIG9mIG1hdGVyaWFsIHRoYXQgaGFzIGFscmVhZHkKKyAgICAgICBhcnJpdmVkIGJ1dCBoYXMgbm90IHlldCBiZWVuIHJlYWQsIGFuZCBzdWNjZWVkcyBpbW1lZGlhdGVseSBpZiB0aGUKKyAgICAgICB0YXJnZXQgc3RyaW5nIGlzIGZvdW5kLCBvciBmYWlscyBpbW1lZGlhdGVseSBpZiBpdCBpcyBub3QgZm91bmQuCisKKyAgIFRoZSBzYW1lIHBvaW50cyBhcHBseSB0byBNSU5QVVQuIFJFSU5QVVQgaWdub3JlcyBpdHMgdGltZW91dAorICAgcGFyYW1ldGVyLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNy4xLjIuIE5ldyBJTlBVVCBDb250cm9scworCisgICBUaGUgZm9sbG93aW5nIG5ldyBJTlBVVCBjb250cm9scyB3ZXJlIGFkZGVkIGluIHZlcnNpb24gNy4wOgorCisgICBTRVQgSU5QVVQgQVVUT0RPV05MT0FEIHsgT04sIE9GRiB9CisgICAgICAgICAgRXhwbGFpbmVkIGluIFs1NTFdU2VjdGlvbiA3LjcuCisKKyAgIFNFVCBJTlBVVCBDQU5DRUxMQVRJT04geyBPTiwgT0ZGIH0KKyAgICAgICAgICBUaGlzIGdvdmVybnMgd2hldGhlciBhbiBJTlBVVCBjb21tYW5kIGNhbiBiZSBjYW5jZWxlZCBieQorICAgICAgICAgICJwcmVzc2luZyBhbnkga2V5IiBvbiB0aGUga2V5Ym9hcmQuIE5vcm1hbGx5IGl0IGNhbiBiZSwgaW4KKyAgICAgICAgICB3aGljaCBjYXNlIHRoZSBJTlBVVCBjb21tYW5kIGZhaWxzIGltbWVkaWF0ZWx5IGFuZCBcdihpbnN0YXR1cykKKyAgICAgICAgICBpcyBzZXQgdG8gMiwgaW5kaWNhdGluZyBpbnRlcnJ1cHRpb24uIFNFVCBJTlBVVCBDQU5DRUxMQVRJT04KKyAgICAgICAgICBPRkYgZGlzYWJsZXMga2V5Ym9hcmQgY2FuY2VsbGF0aW9uczsgdGh1cyBpZiB0aGUgc2VhcmNoIHRleHQgaXMKKyAgICAgICAgICBub3QgZW5jb3VudGVyZWQsIHRoZSBJTlBVVCBjb21tYW5kIHdpbGwgcnVuIGZvciBpdHMgZW50aXJlCisgICAgICAgICAgdGltZW91dCBpbnRlcnZhbC4gU0VUIElOUFVUIENBTkNFTExBVElPTiBPRkYgZG9lcyBub3QgZGlzYWJsZQorICAgICAgICAgIGludGVycnVwdGlvbiBieSBDdHJsLUMsIGhvd2V2ZXI7IGV2ZXJ5IGNvbW1hbmQgbmVlZHMgYW4KKyAgICAgICAgICBlbWVyZ2VuY3kgZXhpdC4gKElmIHlvdSByZWFsbHkgd2FudCB0byBkaXNhYmxlIGludGVycnVwdGlvbiBieQorICAgICAgICAgIEN0cmwtQywgdXNlIFNFVCBDT01NQU5EIElOVEVSUlVQVElPTiBPRkYuKQorCisgICBBbHNvIHNlZSBbNTUyXVNlY3Rpb24gNy4yIGZvciBhbnkgbmV3IHZhcmlhYmxlcyByZWxhdGVkIHRvIElOUFVULgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNy4xLjMuIElOUFVUIHdpdGggUGF0dGVybiBNYXRjaGluZworCisgICBDLUtlcm1pdCA3LjAgYWxsb3dzIElOUFVULCBNSU5QVVQsIGFuZCBSRUlOUFVUIHRhcmdldHMgdG8gYmUgYSBwYXR0ZXJuCisgICAoZXhwbGFpbmVkIGluIFs1NTNdU2VjdGlvbnMgMS4xOSBhbmQgWzU1NF00LjkpLiBUaGlzIHNvbHZlcyBhCisgICBsb25nLXN0YW5kaW5nIHByb2JsZW0gaWxsdXN0cmF0ZWQgYnkgdGhlIGZvbGxvd2luZyBzY2VuYXJpbzogYSBjZXJ0YWluCisgICBjb21wYW55IGhhcyBhIGJhbmsgb2YgVENQL0lQIG1vZGVtIHNlcnZlcnMsIHdpdGggaG9zdG5hbWVzIHNlcnZlcjEsCisgICBzZXJ2ZXIyLCBzZXJ2ZXIzLCBhbmQgc28gb24uIEVhY2ggc2VydmVyJ3MgcHJvbXB0IGlzIGl0cyBuYW1lLAorICAgZm9sbG93ZWQgYnkgYSBjb2xvbiAoOiksIGZvciBleGFtcGxlICJTZXJ2ZXI3MjoiLiBXaXRob3V0IElOUFVUCisgICBwYXR0ZXJucywgaXQgd291bGQgYmUgcmF0aGVyIGRpZmZpY3VsdCB0byB3YWl0IGZvciB0aGUgcHJvbXB0LiBUaGUKKyAgIGJydXRlIGZvcmNlIGFwcHJvYWNoOgorCisgIG1pbnB1dCAyMCBTZXJ2ZXIxOiBTZXJ2ZXIyOiBTZXJ2ZXIzOiAuLi4gKGVudW1lcmF0aW5nIGVhY2ggb25lKQorCisgICBpcyBzdWJqZWN0IHRvIGZhaWx1cmUgd2hlbmV2ZXIgYSBuZXcgc2VydmVyIGlzIGFkZGVkLiBBIG1vcmUgc3VidGxlCisgICBhcHByb2FjaDoKKworICBpbnB1dCAyMCBTZXJ2ZXIKKyAgaWYgZmFpbCAuLi4KKyAgaW5wdXQgMiA6CisKKyAgIGlzIGxpYWJsZSB0byBmYWxzZSBwb3NpdGl2ZXMsIGUuZy4gIldlbGNvbWUgdG8gdGhlIFhZWiBDb3JwIE1vZGVtCisgICBTZXJ2ZXIuIFBsZWFzZSByZWFkIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToiLi4uCisKKyAgIFdpdGggcGF0dGVybnMsIHlvdSBjYW4gbWF0Y2ggdGhlIHByb21wdCB3aXRoICJTZXJ2ZXIqOiIgKHdoaWNoIGRvZXNuJ3QKKyAgIHNvbHZlIHRoZSAiZmFsc2UgcG9zaXRpdmVzIiBwcm9ibGVtLCBidXQgY2VydGFpbmx5IGlzIG1vcmUgY29tcGFjdAorICAgdGhhbiB0aGUgYnJ1dGUgZm9yY2UgbWV0aG9kKSwgb3Igd2l0aCBtb3JlIHNwZWNpZmljIHBhdHRlcm5zIHN1Y2ggYXMKKyAgICJTZXJ2ZXJbMS05XToiIGFuZCAiU2VydmVyWzEtOV1bMC05XToiLCBvciBlcXVpdmFsZW50bHk6CisKKyAgU2VydmVye1sxLTldLFsxLTldWzAtOV19OgorCisgICBtZWFuaW5nIHRoZSB3b3JkICJTZXJ2ZXIiIGZvbGxvd2VkIGJ5IGEgc2luZ2xlIGRpZ2l0ICgxLTkpIG9yIGJ5IHR3bworICAgZGlnaXRzIHJlcHJlc2VudGluZyBhIG51bWJlciBmcm9tIDEgdG8gOTksIGZvbGxvd2VkIGJ5IGEgY29sb24uCisKKyAgIElOUFVUIHBhdHRlcm4gbWF0Y2hpbmcgaGFzIGJlZW4gYWRkZWQgaW4gYSB3YXkgdGhhdCBkb2VzIG5vdCBpbnRlcmZlcmUKKyAgIHdpdGggZXhpc3Rpbmcgc2NyaXB0cy4gTm8gbmV3IGNvbW1hbmRzIG9yIHN3aXRjaGVzIGFyZSB1c2VkLiBUaGUKKyAgIHNpbXBsZSBydWxlIGlzOiBpZiBhbiBJTlBVVCBzZWFyY2ggdGFyZ2V0IGlzIHRoZSBhcmd1bWVudCBvZiB0aGUgKG5ldykKKyAgIFxmcGF0dGVybigpIGZ1bmN0aW9uLCBpdCBpcyBhIHBhdHRlcm4uIE90aGVyd2lzZSBpdCBpcyB0YWtlbgorICAgbGl0ZXJhbGx5LCBhcyBiZWZvcmUuIEZvciBleGFtcGxlOgorCisgIGlucHV0IDUgYSpiCisKKyAgIHNlYXJjaGVzIGZvciBhbiAnYScgZm9sbG93ZWQgYnkgYW4gYXN0ZXJpc2sgKCcqJyksIGZvbGxvd2VkIGJ5IGEgJ2InLgorICAgQnV0OgorCisgIGlucHV0IDUgXGZwYXR0ZXJuKGEqYikKKworICAgc2VhcmNoZXMgZm9yIGFuICdhJyBmb2xsb3dlZCBieSBhbnl0aGluZyBhdCBhbGwgdXAgdG8gYW5kIGluY2x1ZGluZworICAgdGhlIGZpcnN0ICdiJy4gVGhpcyBtZWFucyB0aGF0IGFueSBzZWFyY2ggdGFyZ2V0IHRvIElOUFVULCBNSU5QVVQsIG9yCisgICBSRUlOUFVUIGNhbiBiZSBhIHBhdHRlcm4gb3IgYSBsaXRlcmFsIHN0cmluZywgYW5kIGluIHBhcnRpY3VsYXIgdGhhdAorICAgTUlOUFVUIGNhbiBhY2NvbW1vZGF0ZSBhbnkgbWl4dHVyZSBvZiBwYXR0ZXJucyBhbmQgbGl0ZXJhbCBzdHJpbmdzLgorCisgICBJbiBzZWxlY3RpbmcgcGF0dGVybnMsIG5vdGUgdGhhdDoKKworICAgICAqIEEgbGVhZGluZyAnKicgaXMgYWx3YXlzIGltcGxpZWQgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNsdWRlCisgICAgICAgb25lLgorICAgICAqIEEgdHJhaWxpbmcgJyonIGlzIG1lYW5pbmdsZXNzIGFuZCBpZ25vcmVkLgorICAgICAqIEEgJyonIGJ5IGl0c2VsZiBtYXRjaGVzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdGhhdCBhcnJpdmVzLgorCisgICBBIHN5bnRheCBub3RlOiBJZiB5b3VyIHBhdHRlcm4gaXMgYSBzZWxlY3Rpb24gbGlzdCwgbWVhbmluZyBhIGxpc3Qgb2YKKyAgIGFsdGVybmF0aXZlcyBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBlbmNsb3NlZCBpbiBicmFjZXMsIHRoZW4gdGhlCisgICBvdXRlciBicmFjZXMgd2lsbCBiZSBzdHJpcHBlZCBieSB2YXJpb3VzIGxldmVscyBvZiBwYXJzZXJzLCBzbyB5b3UKKyAgIG11c3QgaW5jbHVkZSB0aHJlZSBvZiBlYWNoOgorCisgIGlucHV0IDEwIFxmcGF0dGVybih7e3thYmMsbW5vLHh5en19fSkKKworICAgTm90ZSB0aGF0IHRoaXMgaXMgZXF1aXZhbGVudCB0bzoKKworICBtaW5wdXQgMTAgYWJjIG1ubyB4eXoKKworICAgZXhjZXB0IGZvciB0aGUgc2V0dGluZyBvZiB0aGUgXHYobWlucHV0KSB2YXJpYWJsZS4KKworICAgQW5kIGEgY2F1dGlvbjogSU5QVVQgcGF0dGVybiBtYXRjaGluZyBoYXMgYSBsaW1pdGF0aW9uIHRoYXQgeW91CisgICBwcm9iYWJseSBuZXZlciBub3RpY2VkIHdpdGggbGl0ZXJhbC1zdHJpbmcgbWF0Y2hpbmcsIG5hbWVseSB0aGF0IHRoZXJlCisgICBpcyBhIGxpbWl0IG9uIHRoZSBzaXplIG9mIHRoZSBtYXRjaC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBwYXR0ZXJuIGlzCisgICAiYSpiIiwgdGhlIG1hdGNoIHdpbGwgc3VjY2VlZCBpZiB0aGUgJ2EnIGFuZCAnYicgYXJlIG5vdCBzZXBhcmF0ZWQgYnkKKyAgIG1vcmUgdGhhbiAoc2F5KSA4SyBieXRlcywgYnV0IHdpbGwgZmFpbCBpZiB0aGV5IGFyZSBmYXJ0aGVyIGFwYXJ0IHRoYW4KKyAgIHRoYXQuIEluIHN1Y2ggY2FzZXMsIGl0IGJldHRlciB0byB1c2UgdHdvIElOUFVUcyAoZS5nLiAiaW5wdXQgMTAgYSIKKyAgIGFuZCB0aGVuICJpbnB1dCAxMDAgYiIpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNy4xLjQuIFRoZSBJTlBVVCBNYXRjaCBSZXN1bHQKKworICAgVGhlIHJlc3VsdCBvZiBhbnkgSU5QVVQsIE1JTlBVVCwgb3IgUkVJTlBVVCBjb21tYW5kLCBubyBtYXR0ZXIgd2hldGhlcgorICAgdGhlIHNlYXJjaCB0YXJnZXRzIGFyZSBwYXR0ZXJucyBvciBsaXRlcmFsIHN0cmluZ3MsIGlzIGF2YWlsYWJsZSBpbgorICAgdGhlIG5ldyBcdihpbm1hdGNoKSB2YXJpYWJsZS4gRm9yIGV4YW1wbGU6CisKKyAgbWlucHV0IDEwIGNhdCBcZnBhdHRlcm4oW2RoXW9nKQorICBpZiBzdWNjZXNzIGVjaG8gTUlOUFVUIG1hdGNoZWQgIlx2KGlubWF0Y2gpIgorCisgICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gYSBwYXR0ZXJuIHdhcyBtYXRjaGVkLCBzaW5jZSBpdCBtYWtlcworICAgdGhlIHN0cmluZyB0aGF0IG1hdGNoZWQgdGhlIHBhdHRlcm4gYXZhaWxhYmxlIHRvIEtlcm1pdDsgdGhlcmUgd291bGQKKyAgIGJlIG5vIHdheSB0byBnZXQgaXQgb3RoZXJ3aXNlLgorCisgICBBZnRlciBhbiBJTlBVVCBjb21tYW5kLCB5b3UgY2FuIHZpZXcgYWxsIHRoZSBJTlBVVC1yZWxhdGVkIHZhcmlhYmxlcworICAgYnkgdHlwaW5nICJzaG93IHZhcmlhYmxlcyBpbiIgKGFiYnJldmlhdGUgYXMgInNobyB2YXIgaW4iKSwgd2hpY2gKKyAgIHNob3dzIHRoZSB2YWx1ZXMgb2YgYWxsIGJ1aWx0LWluIHZhcmlhYmxlcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoCisgICAiaW4iLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDcuMi4gTmV3IG9yIEltcHJvdmVkIEJ1aWx0LUluIFZhcmlhYmxlcworCisgICBcdihibG9ja2NoZWNrKQorICAgICAgICAgIEN1cnJlbnQgQkxPQ0stQ0hFQ0sgc2V0dGluZywgMSwgMiwgMywgb3IgNC4gNCBpcyB0aGUgY29kZSBmb3IKKyAgICAgICAgICBCTEFOSy1GUkVFLTIuCisKKyAgIFx2KGJ5dGVvcmRlcikKKyAgICAgICAgICBUaGUgbWFjaGluZSdzIGJ5dGUgb3JkZXI6IDAgPSBCaWcgRW5kaWFuLCAxID0gTGl0dGxlIEVuZGlhbi4KKworICAgXHYoY21kYnVmc2l6ZSkKKyAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGJ1ZmZlciwgd2hpY2ggaXMgdGhlIG1heGltdW0gc2l6ZSBmb3IKKyAgICAgICAgICBhIG1hY3JvLCBhIGNvbW1hbmQsIGEgdmFyaWFibGUsIG9yIGFueXRoaW5nIGVsc2UgaW4gQy1LZXJtaXQncworICAgICAgICAgIHNjcmlwdCBsYW5ndWFnZS4KKworICAgXHYoY3R0eSkKKyAgICAgICAgICBUaGUgZGV2aWNlIG5hbWUgb2YgQy1LZXJtaXQncyBjb250cm9sbGluZyAobG9naW4pIHRlcm1pbmFsLgorCisgICBcdihmaWxlbmFtZSkKKyAgICAgICAgICBEZXNjcmliZWQgaW4gWzU1NV1TZWN0aW9ucyA0LjEgYW5kIFs1NTZdNC4yLgorCisgICBcdihmaWxlbnVtYmVyKQorICAgICAgICAgIERlc2NyaWJlZCBpbiBbNTU3XVNlY3Rpb25zIDQuMSBhbmQgWzU1OF00LjIuCisKKyAgIFx2KGZpbGVzcGVjKQorICAgICAgICAgIEFzIG9mIEMtS2VybWl0IDcuMCwgY29udGFpbnMgZnVsbHkgcXVhbGlmaWVkIGZpbGVuYW1lcyByYXRoZXIKKyAgICAgICAgICB0aGFuICh1c3VhbGx5KSByZWxhdGl2ZSBvbmVzLgorCisgICBcdihyZXR1cm4pCisgICAgICAgICAgTm93IGhvbGRzIHRoZSBFTkQgbiB2YWx1ZSBvZiB0aGUgbWFjcm8gdGhhdCBtb3N0IHJlY2VudGx5CisgICAgICAgICAgcmV0dXJuZWQsIGluIGNhc2UgRU5EIHdhcyB1c2VkIHJhdGhlciB0aGFuIFJFVFVSTi4KKworICAgXHYoZWRpdG9yKQorICAgICAgICAgIFBhdGhuYW1lIG9mIHByZWZlcnJlZCB0ZXh0IGVkaXRvcgorCisgICBcdihlZGl0b3B0cykKKyAgICAgICAgICBDb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgZWRpdG9yCisKKyAgIFx2KGVkaXRmaWxlKQorICAgICAgICAgIEZpbGUgbW9zdCByZWNlbnRseSBlZGl0ZWQKKworICAgXHYoYnJvd3NlcikKKyAgICAgICAgICBQYXRobmFtZSBvZiBwcmVmZXJyZWQgV2ViIGJyb3dzZXIKKworICAgXHYoYnJvd3NvcHRzKQorICAgICAgICAgIENvbW1hbmQtbGluZSBvcHRpb25zIGZvciBXZWIgYnJvd3NlcgorCisgICBcdihicm93c3VybCkKKyAgICAgICAgICBVUkwgbW9zdCByZWNlbnRseSBnaXZlbiB0byBXZWIgYnJvd3NlcgorCisgICBcdihkaWFsdHlwZSkKKyAgICAgICAgICBUeXBlIG9mIGNhbGwgbW9zdCByZWNlbnRseSBwbGFjZWQgKHNlZSBbNTU5XVNlY3Rpb24gMi4xLjExKS4KKworICAgXHYoa2JjaGFyKQorICAgICAgICAgIFRoZSBjaGFyYWN0ZXIsIGlmIGFueSwgdGhhdCB3YXMgdHlwZWQgYXQgdGhlIGtleWJvYXJkIHRvIHRvCisgICAgICAgICAgaW50ZXJydXB0IHRoZSBtb3N0IHJlY2VudCBQQVVTRSwgU0xFRVAsIFdBSVQsIE1TTEVFUCwgb3IgSU5QVVQKKyAgICAgICAgICBjb21tYW5kOyBlbXB0eSBpZiB0aGUgbW9zdCByZWNlbnQgc3VjaCBjb21tYW5kIHdhcyBub3QKKyAgICAgICAgICBpbnRlcnJ1cHRlZCBmcm9tIHRoZSBrZXlib2FyZC4KKworICAgXHYobG9ja2RpcikKKyAgICAgICAgICBVTklYIG9ubHkgLSBUaGUgbmFtZSBvZiB0aGUgVVVDUCBsb2NrZmlsZSBkaXJlY3RvcnksIGlmIGtub3duLAorICAgICAgICAgIG90aGVyd2lzZSAiKHVua25vd24pIi4KKworICAgXHYobG9ja3BpZCkKKyAgICAgICAgICBVTklYIG9ubHkgLSBQSUQgb2YgcHJvY2VzcyB0aGF0IG93bnMgdGhlIGNvbW11bmljYXRpb24gcG9ydAorICAgICAgICAgIHRoYXQgeW91IHRyaWVkIHRvIG9wZW4gd2l0aCBhIFNFVCBMSU5FIGNvbW1hbmQgdGhhdCBmYWlsZWQKKyAgICAgICAgICBiZWNhdXNlIHRoZSBwb3J0IHdhcyBpbiB1c2UsIG90aGVyd2lzZSBlbXB0eS4gVGhpcyB2YXJpYWJsZSBpcworICAgICAgICAgIHNldCB3aXRoIGV2ZXJ5IFNFVCBMSU5FIGNvbW1hbmQuCisKKyAgIFx2KGN4X3RpbWUpCisgICAgICAgICAgSWYgbm8gY29ubmVjdGlvbiAoU0VUIEhPU1QsIFNFVCBMSU5FLCBESUFMLCBURUxORVQsIGV0YykgaXMKKyAgICAgICAgICBhY3RpdmUsIHRoaXMgaXMgMC4gSWYgYSBjb25uZWN0aW9uIGlzIGFjdGl2ZSwgdGhpcyBpcyB0aGUKKyAgICAgICAgICBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgY29ubmVjdGlvbiB3YXMgbWFkZS4KKworICAgXHYoaHdwYXJpdHkpCisgICAgICAgICAgSWYgaGFyZHdhcmUgcGFyaXR5IGlzIGluIGVmZmVjdCwgdGhpcyB2YXJpYWJsZSBnaXZlcyBpdHMgdmFsdWUsCisgICAgICAgICAgc3VjaCBhcyAiZXZlbiIgb3IgIm9kZCIgKGluIHdoaWNoIGNhc2UsIHRoZSBcdihwYXJpdHkpIHZhcmlhYmxlCisgICAgICAgICAgd2lsbCBiZSAibm9uZSIpLiBPdGhlcndpc2UgdGhpcyB2YXJpYWJsZSBpcyBlbXB0eS4KKworICAgXHYoc2VyaWFsKQorICAgICAgICAgIEN1cnJlbnQgc2VyaWFsIHBvcnQgc2V0dGluZ3MgaW4gOE4xIGZvcm1hdCAoWzU2MF1TZWN0aW9uIDIuMTApLgorCisgICBcdihlcnJubykKKyAgICAgICAgICBJbiBVTklYLCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgQyBydW50aW1lIGVycm5vIHZhcmlhYmxlLAorICAgICAgICAgIHdoaWNoIGlzIHF1aXRlIHZvbGF0aWxlIChtZWFuaW5nIHRoYXQgb2Z0ZW4gYW4gImludGVyZXN0aW5nIgorICAgICAgICAgIGVycm9yIGNvZGUgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHNvbWUgb3RoZXIgbGlicmFyeSBjYWxsIG9yCisgICAgICAgICAgc3lzdGVtIHNlcnZpY2UgdGhhdCBzZXRzIGVycm5vIGJlZm9yZSB5b3UgaGF2ZSBhIGNoYW5jZSB0byBsb29rCisgICAgICAgICAgYXQgaXQpLiBJbiBWTVMsIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5IHRoZSBzeXN0ZW0gb3IKKyAgICAgICAgICBsaWJyYXJ5IGNhbGwgdGhhdCBtb3N0IHJlY2VudGx5IGZhaWxlZCAoc3VjY2VzcyBjb2RlcyBhcmUgbm90CisgICAgICAgICAgc2F2ZWQpLiBOb3QgYXZhaWxhYmxlIGluIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLgorCisgICBcdihlcnJzdHJpbmcpCisgICAgICAgICAgVGhlIFVOSVggb3IgVk1TIHN5c3RlbSBlcnJvciBtZXNzYWdlIHRoYXQgY29ycmVzcG9uZHMgdG8KKyAgICAgICAgICBcdihlcnJubykuIE5vdCBhdmFpbGFibGUgaW4gYWxsIE9TJ3MuIEFsc28gc2VlCisgICAgICAgICAgWzU2MV1cZmVycnN0cmluZygpLgorCisgICBcdihzZXRsaW5lbXNnKQorICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLCBpZiBhbnksIGZyb20gdGhlIG1vc3QgcmVjZW50IFNFVCBMSU5FLCBTRVQKKyAgICAgICAgICBQT1JULCBTRVQgSE9TVCwgVEVMTkVULCBvciBvdGhlciBjb25uZWN0aW9uLW1ha2luZyBjb21tYW5kLgorICAgICAgICAgIFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIFx2KGVycnN0cmluZykgc2luY2UgdGhlc2UKKyAgICAgICAgICBjb21tYW5kcyBtaWdodCBmYWlsIHdpdGhvdXQgZ2VuZXJhdGluZyBhIHN5c3RlbSBlcnJvciBjb2RlLCBmb3IKKyAgICAgICAgICBleGFtcGxlIChpbiBVTklYKSBiZWNhdXNlIGEgbG9ja2ZpbGUgZXhpc3RlZCBpbmRpY2F0aW5nIHRoZQorICAgICAgICAgIGRldmljZSB3YXMgYXNzaWduZWQgYnkgYW5vdGhlciB1c2VyLgorCisgICBcdihleGl0c3RhdHVzKQorICAgICAgICAgIFRoZSBleGl0IHN0YXR1cyBDLUtlcm1pdCB3b3VsZCByZXR1cm4gaWYgaXQgZXhpdGVkIG5vdy4KKworICAgXHYocGV4aXRzdGF0KQorICAgICAgICAgIFRoZSBleGl0IHN0YXR1cyBvZiB0aGUgaW5mZXJpb3IgcHJvY2VzcyBtb3N0IHJlY2VudGx5IGludm9rZWQKKyAgICAgICAgICBieSBDLUtlcm1pdCAoYnkgUlVOLCAhLCBSRURJUkVDVCwgU0VORCAvQ09NTUFORCwgZXRjKS4gSW4gVk1TLAorICAgICAgICAgIHRoaXMgY29kZSBjYW4gYmUgZ2l2ZW4gdG8gXGZlcnJzdHJpbmcoKSB0byBnZXQgdGhlCisgICAgICAgICAgY29ycmVzcG9uZGluZyBlcnJvciBtZXNzYWdlIChpbiBVTklYLCBwcm9ncmFtL2NvbW1hbmQgcmV0dXJuCisgICAgICAgICAgY29kZXMgYXJlIG5vdCB0aGUgc2FtZSBhcyBzeXN0ZW0gZXJyb3IgY29kZXMpLiBOb3QgYXZhaWxhYmxlIGluCisgICAgICAgICAgb3BlcmF0aW5nIHN5c3RlbXMgb3RoZXIgdGhhbiBVTklYIGFuZCBWTVMuIFNlZSBbNTYyXVNlY3Rpb24KKyAgICAgICAgICA0LjIuNSBmb3IgZGV0YWlscy4KKworICAgXHYoaW5tYXRjaCkKKyAgICAgICAgICBUaGUgaW5jb21pbmcgc3RyaW5nIG9mIGNoYXJhY3RlcnMsIGlmIGFueSwgdGhhdCBtYXRjaGVkIHRoZQorICAgICAgICAgIG1vc3QgcmVjZW50IElOUFVULCBSRUlOUFVULCBvciBNSU5QVVQgY29tbWFuZC4KKworICAgXHYoaW50aW1lKQorICAgICAgICAgIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzICh0aG91c2FuZHRocyBvZiBzZWNvbmRzKSBpdCB0b29rIGZvcgorICAgICAgICAgIHRoZSBtb3N0IHJlY2VudCBJTlBVVCBjb21tYW5kIHRvIGZpbmQgaXRzIG1hdGNoLCBvciAtMSBpZiBubworICAgICAgICAgIElOUFVUIGNvbW1hbmQgaGFzIGJlZW4gZ2l2ZW4geWV0LiBJZiB0aGUgSU5QVVQgY29tbWFuZCB0aW1lZAorICAgICAgICAgIG91dCwgdGhlIHZhbHVlIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gMTAwMCB0aW1lcyB0aGUgSU5QVVQKKyAgICAgICAgICB0aW1lb3V0LiBJZiBJTlBVVCBmYWlsZWQgZm9yIHNvbWUgb3RoZXIgcmVhc29uLCB0aGUgdmFsdWUgaXMKKyAgICAgICAgICB1bmRlZmluZWQgKFx2KGluc3RhdHVzKSBnaXZlcyBJTlBVVCBjb21wbGV0aW9uIHN0YXR1cykuIElmIHlvdXIKKyAgICAgICAgICB2ZXJzaW9uIG9mIEMtS2VybWl0IGlzIGJ1aWx0IHdpdGhvdXQgaGlnaC1wcmVjaXNpb24KKyAgICAgICAgICBmbG9hdGluZy1wb2ludCB0aW1lcnMsIHRoaXMgbnVtYmVyIHdpbGwgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YKKyAgICAgICAgICAxMDAwLgorCisgICBcdihpbndhaXQpCisgICAgICAgICAgVGhlIG51bWJlciBvZiBzZWNvbmRzIHNwZWNpZmllZCBhcyB0aGUgdGltZW91dCBpbiB0aGUgbW9zdAorICAgICAgICAgIHJlY2VudCBJTlBVVCBjb21tYW5kLgorCisgICBcdihkaWFsc3VmZml4KQorICAgICAgICAgIERpYWxpbmcgc3VmZml4IGZvciB1c2UgZHVyaW5nIFBESUFMIHNlcXVlbmNlOyBzZWUgWzU2M11TZWN0aW9uCisgICAgICAgICAgMi4xLjEwLgorCisgICBcdihwaWQpCisgICAgICAgICAgVU5JWCwgVk1TLCBhbmQgSzk1IG9ubHkuIEMtS2VybWl0J3MgcHJpbWFyeSBwcm9jZXNzIElELAorICAgICAgICAgIG51bWVyaWMsIGRlY2ltYWwuIElmIHlvdSB3YW50IHRvIHNob3cgaXQgaW4gaGV4LCB1c2UKKyAgICAgICAgICBcZm4yaGV4KFx2KHBpZCkpIElmIHlvdSB3YW50IHRvIHNob3cgaXQgaW4gb2N0YWwsIHVzZQorICAgICAgICAgIFxmbjJvY3RhbChcdihwaWQpKS4KKworICAgXHYocHJpbnRlcikKKyAgICAgICAgICBDdXJyZW50IHByaW50ZXIgbmFtZSBvciBTRVQgUFJJTlRFUiB2YWx1ZS4KKworICAgXHYocF9jdGwpCisgICAgICAgICAgQ29udHJvbCBwcmVmaXggY2hhciBcdihwXzhiaXQpIDgtYml0IHByZWZpeCBjaGFyIChpZiBwYXJpdHkgbm90CisgICAgICAgICAgbm9uZSkKKworICAgXHYocF9ycHQpCisgICAgICAgICAgUmVwZWF0IHByZWZpeCBjaGFyIChpZiByZXBlYXQgY29tcHJlc3Npb24gZW5hYmxlZCkKKworICAgXHYoaGVyYWxkKQorICAgICAgICAgIEtlcm1pdCdzIHZlcnNpb24gaGVyYWxkCisKKyAgIFx2KHRlc3QpCisgICAgICAgICAgS2VybWl0J3MgdGVzdCB2ZXJzaW9uLCBpZiBhbnksIG9yIDAgaWYgdGhpcyBpcyBub3QgYSB0ZXN0CisgICAgICAgICAgdmVyc2lvbi4gVHlwaWNhbCB2YWx1ZXMgZm9yIHRlc3QgdmVyc2lvbnMgYXJlICJBbHBoYS4wMyIgb3IKKyAgICAgICAgICAiQmV0YS4xNCIuCisKKyAgIFx2KHNlbmRsaXN0KQorICAgICAgICAgIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgU0VORC1MSVNULCAwIGlmIG5vbmUuIE5vdGU6CisgICAgICAgICAgZW50cmllcyBkbyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBmaWxlcywgc2luY2UgYW4gZW50cnkKKyAgICAgICAgICBtaWdodCBjb250YWluIHdpbGRjYXJkcy4gQWxzbyBub3RlIHRoYXQgdGhlIHZhbHVlIGRvZXMgbm90IGdvCisgICAgICAgICAgYmFjayB0byAwIGFmdGVyIHRoZSBmaWxlcyBpbiB0aGUgbGlzdCBhcmUgc2VudC4gVG8gcmVzZXQgdGhpcworICAgICAgICAgIHZhcmlhYmxlLCB1c2UgQ0xFQVIgU0VORC1MSVNULiBUaGUgcHVycG9zZSBvZiB0aGlzIHZhcmlhYmxlIGlzCisgICAgICAgICAgdG8gZGV0ZXJtaW5lIGlmIGEgU0VORCBjb21tYW5kLCB3aGVuIGdpdmVuIHdpdGhvdXQgYW55CisgICAgICAgICAgZmlsZW5hbWVzLCB3aWxsIGJlIGxlZ2FsLiBFeGFtcGxlOgorCisgIHhpZiBcdihzZW5kbGlzdCkgeyBzZW5kIH0gZWxzZSB7IHNlbmQgb29mYS50eHQgfQorCisgICBcdih0cmlnZ2VyKQorICAgICAgICAgIElmIHRoZSBtb3N0IHJlY2VudCBDT05ORUNUIHNlc3Npb24gd2FzIHRlcm1pbmF0ZWQgYXV0b21hdGljYWxseQorICAgICAgICAgIGJ5IGEgdHJpZ2dlciwgdGhpcyB2YXJpYWJsZSBjb250YWlucyB0aGUgdHJpZ2dlciB2YWx1ZS4KKworICAgXHYodHlfbG4pCisgICAgICAgICAgVFlQRSBsaW5lIG51bWJlciAoZHVyaW5nIFRZUEUpCisKKyAgIFx2KHR5X2xjKQorICAgICAgICAgIFRZUEUgbGluZSBjb3VudCAoYWZ0ZXIgVFlQRSkKKworICAgXHYodHlfbWMpCisgICAgICAgICAgVFlQRSBtYXRjaCBjb3VudCAoYWZ0ZXIgVFlQRSkKKworICAgXHYoeGZlcnN0YXQpCisgICAgICAgICAgU3RhdHVzIG9mIG1vc3QgcmVjZW50IGZpbGUgdHJhbnNmZXI6CisKKy0xOiBObyB0cmFuc2ZlciB5ZXQKKyAwOiBTdWNjZWVkZWQKKyAxOiBGYWlsZWQKKworICAgXHYoeGZlcm1zZykKKyAgICAgICAgICBJZiB0aGUgbW9zdCByZWNlbnQgZmlsZSB0cmFuc2ZlciBmYWlsZWQsIHRoaXMgaXMgdGhlIHJlYXNvbi4gSWYKKyAgICAgICAgICBpdCBzdWNjZWVkZWQsIFx2KHhmZXJtc2cpIGlzIGFuIGVtcHR5IHN0cmluZy4KKworICAgXHYodGZ0aW1lKQorICAgICAgICAgIFRvdGFsIGVsYXBzZWQgdGltZSBvZiBtb3N0IHJlY2VudCBmaWxlIHRyYW5zZmVyIG9wZXJhdGlvbiwgaW4KKyAgICAgICAgICBzZWNvbmRzLgorCisgICBcdih0ZXh0ZGlyKQorICAgICAgICAgIERpcmVjdG9yeSB0aGF0IGhvbGRzIChvciBpcyBzdXBwb3NlZCB0byBob2xkKSBLZXJtaXQgdGV4dCBmaWxlcworICAgICAgICAgIHN1Y2ggYXMgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucywgcmVsZWFzZSBub3RlcywgdXBkYXRlIG5vdGVzLAorICAgICAgICAgIHJlYWQtbWUgZmlsZXMsICJiZXdhcmUiIGZpbGVzLCBldGMuCisKKyAgIFx2KG5hbWUpCisgICAgICAgICAgVGhlIG5hbWUgd2l0aCB3aGljaCB0aGUgS2VybWl0IHByb2dyYW0gd2FzIGludm9rZWQsIGUuZy4KKyAgICAgICAgICAia2VybWl0IiwgIndlcm1pdCIsICJrOTUiLCAiazIiLCBldGMgKHNlZSBbNTY0XVNlY3Rpb24gOS4xKS4KKworICAgXHYob3NuYW1lKQorICAgICAgICAgIE5hbWUgb2Ygb3BlcmF0aW5nIHN5c3RlbSBvbiBjb21wdXRlciB3aGVyZSBDLUtlcm1pdCBpcyBydW5uaW5nLAorICAgICAgICAgIG9idGFpbmVkIGF0IHJ1bnRpbWUgKGZyb20gdW5hbWUgb3IgZXF1aXZhbGVudCkuCisKKyAgIFx2KG9zdmVyc2lvbikKKyAgICAgICAgICBWZXJzaW9uIG9mIG9wZXJhdGluZyBzeXN0ZW0gb24gY29tcHV0ZXIgd2hlcmUgQy1LZXJtaXQgaXMKKyAgICAgICAgICBydW5uaW5nLCBvYnRhaW5lZCBhdCBydW50aW1lIChmcm9tIHVuYW1lIG9yIGVxdWl2YWxlbnQpLgorCisgICBcdihvc3JlbGVhc2UpCisgICAgICAgICAgUmVsZWFzZSBvZiBvcGVyYXRpbmcgc3lzdGVtIG9uIGNvbXB1dGVyIHdoZXJlIEMtS2VybWl0IGlzCisgICAgICAgICAgcnVubmluZywgb2J0YWluZWQgYXQgcnVudGltZSAoZnJvbSB1bmFtZSBvciBlcXVpdmFsZW50KS4KKworICAgXHYobW9kZWwpCisgICAgICAgICAgVGhlIHNwZWNpZmljIGhhcmR3YXJlIG1vZGVsIG9mIHRoZSBjb21wdXRlciB3aGVyZSBDLUtlcm1pdCBpcworICAgICAgICAgIHJ1bm5pbmcsIGlmIGtub3duLgorCisgICBcdihtYXRoX3BpKQorICAgICAgICAgIFRoZSB2YWx1ZSBvZiBQaSAoc2VlIFs1NjVdU2VjdGlvbiA3LjIzKQorCisgICBcdihtYXRoX2UpCisgICAgICAgICAgVGhlIHZhbHVlIG9mIGUgKHNlZSBbNTY2XVNlY3Rpb24gNy4yMykKKworICAgXHYobWF0aF9wcmVjaXNpb24pCisgICAgICAgICAgSG93IG1hbnkgc2lnbmlmaWNhbnQgZGlnaXRzIGluIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorCisgICBcdihmX2NvdW50KQorICAgICAgICAgIFJlc3VsdCBvZiB0aGUgbW9zdCByZWNlbnQgRklMRSBDT1VOVCAoRkNPVU5UKSBjb21tYW5kLgorCisgICBcdihmX2Vycm9yKQorICAgICAgICAgIE51bWVyaWMgZXJyb3IgY29kZSBvZiBtb3N0IHJlY2VudCBGSUxFIGNvbW1hbmQuCisKKyAgIFx2KGZfbWF4KQorICAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIGZpbGVzIG9wZW4gc2ltdWx0YW5lb3VzbHkuCisKKyAgIFRoZSBtYXRoIGNvbnN0YW50cyBhcmUgZ2l2ZW4gaW4gdGhlIHByZWNpc2lvbiBvZiB1bmRlcmx5aW5nIGNvbXB1dGVyJ3MKKyAgIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMuCisKKyAgIE5vdGUgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gXHYob3NuYW1lKSwgXHYob3N2ZXJzaW9uKSwgYW5kCisgICBcdihwbGF0Zm9ybSk7IHRoZSBsYXR0ZXIgcmVmZXJzIHRvIHRoZSBwbGF0Zm9ybSBmb3Igd2hpY2ggYW5kL29yIHVwb24KKyAgIHdoaWNoIEMtS2VybWl0IHdhcyBidWlsdCwgYXMgb3Bwb3NlZCB0byB0aGUgb25lIG9uIHdoaWNoIGl0IGlzCisgICBhY3R1YWxseSBydW5uaW5nLiBBbHNvIG5vdGUgdGhhdCBlYWNoIG9wZXJhdGluZyBzeXN0ZW0gY2FuLCBhbmQKKyAgIHByb2JhYmx5IHdpbGwsIGludGVycHJldCBhbmQgZmlsbCBpbiB0aGUgb3MqIHZhcmlhYmxlcyBkaWZmZXJlbnRseSwgb3IKKyAgIG5vdCBhdCBhbGwuCisKKyAgIFRoZSBTSE9XIFZBUklBQkxFUyBjb21tYW5kIG5vdyBhY2NlcHRzIGEgdmFyaWFibGUgbmFtZSwgcHJlZml4LCBvcgorICAgcGF0dGVybjoKKworICBzaG93IHZhcmlhYmxlcyAgICAgICAgIFNob3dzIGFsbCB2YXJpYWJsZXMuCisgIHNob3cgdmFyaWFibGVzIHQgICAgICAgU2hvd3MgYWxsIHZhcmlhYmxlcyB0aGF0IHN0YXJ0IHdpdGggInQiLgorICBzaG93IHZhcmlhYmxlcyAqdmVyKiAgIFNob3dzIGFsbCB2YXJpYWJsZXMgd2hvc2UgbmFtZXMgY29udGFpbiAidmVyIi4KKyAgc2hvdyB2YXJpYWJsZXMgKnZlciAgICBEaXR0byAoYW4gaW1wbGllZCAiKiIgaXMgYXBwZW5kZWQpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDcuMy4gTmV3IG9yIEltcHJvdmVkIEJ1aWx0LUluIEZ1bmN0aW9ucworCisgICBUaGUgZm9sbG93aW5nIG5ldyBmaWxlLWkvbyBmdW5jdGlvbnMgYXJlIGV4cGxhaW5lZCBpbiBbNTY3XVNlY3Rpb24KKyAgIDEuMjIuCisKKyAgXGZfc3RhdHVzKGNoYW5uZWwpICAgICAgICAgICBTdGF0dXMgb2YgZmlsZSBvcGVuIG9uIGNoYW5uZWwKKyAgXGZfcG9zKGNoYW5uZWwpICAgICAgICAgICAgICBSZWFkL3dyaXRlIChieXRlKSBwb2ludGVyIG9mIGdpdmVuIGZpbGUKKyAgXGZfbGluZShjaGFubmVsKSAgICAgICAgICAgICBDdXJyZW50IGxpbmUgb2YgZmlsZQorICBcZl9oYW5kbGUoY2hhbm5lbCkgICAgICAgICAgIEhhbmRsZSBvZiBmaWxlCisgIFxmX2VvZihjaGFubmVsKSAgICAgICAgICAgICAgV2hldGhlciBnaXZlbiBmaWxlIGlzIGF0IEVPRgorICBcZl9nZXRjaGFyKGNoYW5uZWwpICAgICAgICAgIFJlYWQgYSBjaGFyIGZyb20gZ2l2ZW4gZmlsZQorICBcZl9nZXRsaW5lKGNoYW5uZWwpICAgICAgICAgIFJlYWQgYSBsaW5lIGZyb20gZ2l2ZW4gZmlsZQorICBcZl9nZXRibG9jayhjaGFubmVsLG4pICAgICAgIFJlYWQgYSBibG9jayBmcm9tIGdpdmVuIGZpbGUKKyAgXGZfcHV0Y2hhcihjaGFubmVsLGMpICAgICAgICBXcml0ZSBhIGNoYXIgdG8gZ2l2ZW4gZmlsZQorICBcZl9wdXRsaW5lKGNoYW5uZWwsc3RyaW5nKSAgIFdyaXRlIGEgbGluZSB0byBnaXZlbiBmaWxlCisgIFxmX3B1dGJsb2NrKGNoYW5uZWwsc3RyaW5nKSAgV3JpdGUgYSBibG9jayB0byBnaXZlbiBmaWxlCisKKyAgIFRoZSBmb2xsb3dpbmcgbmV3IGRhdGUtdGltZS1yZWxhdGVkIGZ1bmN0aW9ucyBhcmUgZXhwbGFpbmVkIGluCisgICBbNTY4XVNlY3Rpb24gMS42OgorCisgIFxmZGF5KCkgICAgICAgICAgICAgICAgUmV0dXJucyBkYXkgb2Ygd2VlayBvZiBnaXZlbiBkYXRlCisgIFxmbmRheSgpICAgICAgICAgICAgICAgUmV0dXJucyBudW1lcmljIGRheSBvZiB3ZWVrIG9mIGdpdmVuIGRhdGUKKyAgXGZ0aW1lKCkgICAgICAgICAgICAgICBSZXR1cm5zIHRpbWUgcG9ydGlvbiBvZiBnaXZlbiBkYXRlLXRpbWUKKyAgXGZudGltZSgpICAgICAgICAgICAgICBDb252ZXJ0cyB0aW1lIHRvIHNlY29uZHMgc2luY2UgbWlkbmlnaHQKKyAgXGZuMnRpbWUoKSAgICAgICAgICAgICBDb252ZXJ0cyBzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0IHRvIGhoOm1tOnNzCisgIFxmY3Z0ZGF0ZShkYXRlLXRpbWUpICAgQ29udmVydHMgZnJlZS1mb3JtYXQgZGF0ZSB0byB5eXl5bW1kZCBoaDptbTpzcworICBcZmRheW9meWVhcihkYXRlLXRpbWUpIENvbnZlcnRzIGRhdGUgdG8geXl5eWRkZCAoZGF5LW9mLXllYXIpIGZvcm1hdAorICBcZmRveShkYXRlLXRpbWUpICAgICAgIFN5bm9ueW0gZm9yIFxmZGF5b2Z5ZWFyKCkKKyAgXGZkb3kyZGF0ZShkYXlvZnllYXIpICBDb252ZXJ0cyB5eXl5ZGRkIHRvIHl5eXltbWRkCisgIFxmbWpkKGRhdGUtdGltZSkgICAgICAgQ29udmVydHMgZnJlZS1mb3JtYXQgZGF0ZSB0byBNb2RpZmllZCBKdWxpYW4gRGF0ZQorICBcZm1qZDJkYXRlKG1qZCkgICAgICAgIENvbnZlcnRzIG1vZGlmaWVkIEp1bGlhbiBkYXRlIHRvIHl5eXltbWRkCisKKyAgIFRoZSBuZXcgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYyBmdW5jdGlvbnMgYXJlIGV4cGxhaW5lZCBpbgorICAgWzU2OV1TZWN0aW9uIDcuMjMuIGYxIGFuZCBmMiBhcmUgZmxvYXRpbmctcG9pbnQgKHJlYWwpIG51bWJlcnM7IGQgaXMKKyAgIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gc2hvdzoKKworICBcZmZwYWJzb2x1dGUoZjEsZCkgICAgIEFic29sdXRlIHZhbHVlIG9mIGYxCisgIFxmZnBhZGQoZjEsZjIsZCkgICAgICAgZjEgKyBmMQorICBcZmZwY29zaW5lKGYxLGQpICAgICAgIENvc2luZSBvZiBmMQorICBcZmZwZGl2aWRlKGYxLGYyLGQpICAgIGYxIGRpdmlkZWQgYnkgZjIKKyAgXGZmcGV4cChmMSxkKSAgICAgICAgICBlIHRvIHRoZSBmMSBwb3dlcgorICBcZmZwaW50KGYxKSAgICAgICAgICAgIEludGVnZXIgcGFydCBvZiBmMQorICBcZmZwbG9nMTAoZjEsZCkgICAgICAgIExvZyBiYXNlIDEwIG9mIGYxCisgIFxmZnBsb2duKGYxLGQpICAgICAgICAgTmF0dXJhbCBsb2cgb2YgZjEKKyAgXGZmcG1heGltdW0oZjEsZjIsZCkgICBNYXhpbXVtIG9mIGYxIGFuZCBmMgorICBcZmZwbWluaW11bShmMSxmMixkKSAgIE1pbmltdW0gb2YgZjEgYW5kIGYyCisgIFxmZnBtb2R1bHVzKGYxLGYyLGQpICAgTW9kdWx1cyBvZiBmMSBhbmQgZjIKKyAgXGZmcG11bHRpcGx5KGYxLGYyLGQpICBQcm9kdWN0IG9mIGYxIGFuZCBmMgorICBcZmZwcmFpc2UoZjEsZjIsZCkgICAgIFJhaXNlIGYxIHRvIHBvd2VyIGYyCisgIFxmZnByb3VuZChmMSxkKSAgICAgICAgUm91bmQgZjEgdG8gZCBwbGFjZXMKKyAgXGZmcHNpbmUoZjEsZCkgICAgICAgICBTaW5lIG9mIGYxCisgIFxmZnBzcXJ0KGYxLGQpICAgICAgICAgU3F1YXJlIHJvb3Qgb2YgZjEKKyAgXGZmcHN1YnRyYWN0KGYxLGYyLGQpICBmMiAtIGYxCisgIFxmZnB0YW5nZW50KGYxLGQpICAgICAgVGFuZ2VudCBvZiBmMQorCisgICBJbnRlZ2VyIG51bWJlciBmdW5jdGlvbnM6CisKKyAgIFxmYWJzb2x1dGUobikKKyAgICAgICAgICBBYnNvbHV0ZSB2YWx1ZSBvZiBpbnRlZ2VyIG4uCisKKyAgIFxmcmFuZG9tKG4pCisgICAgICAgICAgUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgbi0xLgorCisgICBcZnJhZGl4KHMsbjEsbjIpCisgICAgICAgICAgSWYgdGhlIHN0cmluZyBzIGlzIGFuIGludGVnZXIgaW4gcmFkaXggbjEsIHRoZSByZXN1bHQgaXMgdGhlCisgICAgICAgICAgc2FtZSBudW1iZXIgZXhwcmVzc2VkIGluIHJhZGl4IG4yLCB3aGVyZSBuMSBhbmQgbjIgbWF5IGJlIGFueQorICAgICAgICAgIG51bWJlciBmcm9tIDIgdGhyb3VnaCAzNiwgZXhwcmVzc2VkIGFzIGRlY2ltYWwgbnVtYmVycywgb3IKKyAgICAgICAgICB2YXJpYWJsZXMgKGV0YykgdGhhdCBldmFsdWF0ZSB0byBkZWNpbWFsIG51bWJlcnMuIEZvciB0aGUKKyAgICAgICAgICBzb3VyY2UgYW5kIHJlc3VsdCwgdGhlIGRpZ2l0cyBvZiBhbnkgcmFkaXgsIHIsIGFyZSB0aGUgZmlyc3QgcgorICAgICAgICAgIGNoYXJhY3RlcnMgaW4gdGhlIHNlcXVlbmNlIDAtOSxhLXogKGNhc2UgZG9lc24ndCBtYXR0ZXIgZm9yIHRoZQorICAgICAgICAgIGxldHRlcnMpLiBUaGUgc3RyaW5nIHMgbWF5IGhhdmUgYSBzaWduLCArIG9yIC07IGlmIGl0IHN0YXJ0cworICAgICAgICAgIHdpdGggYSBtaW51cyAoLSkgc2lnbiwgdGhlIHJlc3VsdCBhbHNvIGhhcyBhIG1pbnVzIHNpZ24uCisKKyAgIFRoZSBcZnJhZGl4KCkgZnVuY3Rpb24gZG9lcyBub3Qgd29yayB3aXRoIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuIEl0CisgICBkb2VzIG5vdCByZXZlYWwgdGhlIGludGVybmFsIHN0b3JhZ2UgZm9ybWF0IG9mIGEgbnVtYmVyOyBmb3IgZXhhbXBsZSwKKyAgIFxmcmFkaXgoLTEsMTAsMTYpIGlzIC0xLCBub3Qgc29tZXRoaW5nIGxpa2UgRkZGRkZGRkZGRi4gSWYgYWxsIHRocmVlCisgICBhcmd1bWVudHMgYXJlIG5vdCBnaXZlbiwgb3IgaWYgbjEgb3IgbjIgYXJlIG5vdCBudW1iZXJzIGJldHdlZW4gMiBhbmQKKyAgIDM2IGluY2x1c2l2ZSwgb3IgcyBpcyBub3QgYSBudW1iZXIgaW4gcmFkaXggbjEsIGFuIGVycm9yIG9jY3VycyBhbmQKKyAgIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuIFxmcmFkaXgoKSBhbHNvIGRvZXMgbm90IG9mZmVyCisgICBleHRlbmRlZC1wcmVjaXNpb24gYXJpdGhtZXRpYzsgbnVtYmVyIHZhbHVlcyBhcmUgbGltaXRlZCB0byB0aG9zZQorICAgZXhwcmVzc2VkIGFzIGEgbG9uZyBpbnRlZ2VyIGluIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHVuZGVybHlpbmcKKyAgIGNvbXB1dGVyLCB1c3VhbGx5IDMyIG9yIDY0IGJpdHMuIElmIHlvdSBnaXZlIGl0IGFuIGFyZ3VtZW50IHdob3NlCisgICBhYnNvbHV0ZSB2YWx1ZSBpcyBsYXJnZXIgdGhhbiBjYW4gYmUgaGVsZCBpbiBhbiB1bnNpZ25lZCBsb25nLCB0aGUKKyAgIHJlc3VsdCBpcyAtMS4KKworICAgVGhlIG5leHQgZm91ciBhcmUgc2hvcnRoYW5kIGZ1bmN0aW9ucyBmb3IgZGVjaW1hbC9oZXhhZGVjaW1hbCBhbmQKKyAgIGRlY2ltYWwvb2N0YWwgbnVtYmVyIGNvbnZlcnNpb246CisKKyAgIFxmbjJoZXgobikKKyAgICAgICAgICBSZXR1cm5zIHRoZSBoZXhhZGVjaW1hbCAoYmFzZSAxNikgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludGVnZXIKKyAgICAgICAgICBuLiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIFxmaGV4aWZ5KHMpLCB3aGljaCB0cmVhdHMgaXRzCisgICAgICAgICAgYXJndW1lbnQgYXMgYSBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIuIFRoZSByZXN1bHQgaXMgYWx3YXlzCisgICAgICAgICAgbGVmdC1wYWRkZWQgd2l0aCAwJ3MgdG8gbWFrZSBpdHMgbGVuZ3RoIGV2ZW4uIEV4YW1wbGVzOgorCisgIFxuMmhleCgwKSAgID0gIjAwIiAgICAgICAgICAgICAgICAgICAgXGZoZXhpZnkoMCkgICA9ICIzMCIKKyAgXG4yaGV4KDI1NSkgPSAiZmYiICAgICAgICAgICAgICAgICAgICBcZmhleGlmeSgyNTUpID0gIjMyMzUzNSIKKyAgXG4yaGV4KDI1NikgPSAiMDEwMCIgICAgICAgICAgICAgICAgICBcZmhleGlmeSgyNTYpID0gIjMyMzUzNiIKKworICAgXGZoZXgybih4KQorICAgICAgICAgIENvbnZlcnRzIGhleGFkZWNpbWFsIG51bWJlciB4IHRvIGRlY2ltYWwgZXF1aXZhbGVudCBkZWNpbWFsCisgICAgICAgICAgbnVtYmVyLiBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIFxmbjJoZXgoKS4gRXF1aXZhbGVudCB0bworICAgICAgICAgIFxmcmFkaXgocywxNiwxMCkuCisKKyAgIFxmbjJvY3RhbChuKQorICAgICAgICAgIFJldHVybnMgdGhlIG9jdGFsIChiYXNlIDgpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIgbi4KKyAgICAgICAgICBFeGFtcGxlczoKKworICBcbjJvY3RhbCgwKSA9ICIwIgorICBcbjJvY3QoMjU1KSA9ICIzNzciCisgIFxuMm9jdCgyNTYpID0gIjQwMCIKKyAgRXF1aXZhbGVudCB0byBcZnJhZGl4KG4sMTAsOCkuCisKKyAgIFxmb2N0Mm4obikKKyAgICAgICAgICBSZXR1cm5zIHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBvY3RhbCBudW1iZXIsCisgICAgICAgICAgbi4gVGhlIGludmVyc2Ugb2YgXGZuMm9jdGFsKCkuIEVxdWl2YWxlbnQgdG8gXGZyYWRpeChuLDgsMTApLgorCisgICBTdHJpbmcgZnVuY3Rpb25zOgorCisgICBccyhuYW1lW246bV0pCisgICAgICAgICAgRXF1aXZhbGVudCB0byBcZnN1YnN0cmluZyhcbShuYW1lKSxuLG0pIChbNTcwXVNlY3Rpb24gNy4yNCkuCisKKyAgIFw6KG5hbWVbbjptXSkKKyAgICAgICAgICBFcXVpdmFsZW50IHRvIFxmc3Vic3RyaW5nKG5hbWUsbixtKSAod2hlcmUgIm5hbWUiIGlzIGFueQorICAgICAgICAgIFwtcXVhbnRpdHkpIChbNTcxXVNlY3Rpb24gNy4yNCkuCisKKyAgIFxmbGVmdChzLG4pCisgICAgICAgICAgVGhlIGxlZnRtb3N0IG5jaGFyYWN0ZXJzIG9mIHN0cmluZyBzOyBlcXVpdmFsZW50IHRvCisgICAgICAgICAgXGZzdWJzdHJpbmcocywxLG4pLgorCisgICBcZnN0cmlweChzdHJpbmcsY2hhcikKKyAgICAgICAgICBSZXR1cm5zIHRoZSBwYXJ0IG9mIHRoZSBzdHJpbmcgdXAgdG8gdGhlIHJpZ2h0bW9zdCBvY2N1cnJlbmNlLAorICAgICAgICAgIGlmIGFueSwgb2YgdGhlIGdpdmVuIGNoYXJhY3Rlci4gVGhlIGRlZmF1bHQgY2hhcmFjdGVyIGlzIHBlcmlvZAorICAgICAgICAgICguKSBFeGFtcGxlczoKKworICBcZnN0cmlweChmb28vYmFyLC8pICAgICAgICAgICAgICAgICA9ICJmb28iCisgIFxmc3RyaXB4KGZvby9iYXIvYmF6LC8pICAgICAgICAgICAgID0gImZvby9iYXIiCisgIFxmc3RyaXB4KGF1dG9leGVjLmJhdCwuKSAgICAgICAgICAgID0gImF1dG9leGVjIgorICBcZnN0cmlweChhdXRvZXhlYy5iYXQpICAgICAgICAgICAgICA9ICJhdXRvZXhlYyIKKyAgXGZzdHJpcHgoZnN0cmlweChmb28vYmFyL2JheiwvKSwvKSAgPSAiZm9vIgorCisgICBcZmxvcChzdHJpbmcsY2hhcmFjdGVyKQorICAgICAgICAgIFJldHVybnMgdGhlIHBvcnRpb24gb2YgdGhlIHN0cmluZyBzdGFydGluZyBhZnRlciB0aGUgZmlyc3QKKyAgICAgICAgICBvY2N1cnJlbmNlIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIuIFRoZSBkZWZhdWx0IGNoYXJhY3RlciBpcworICAgICAgICAgIHBlcmlvZCAoLikgRXhhbXBsZXM6CisKKyAgXGZsb3AoYXV0b2V4ZWMuYmF0KSAgICAgICAgICAgICAgICAgPSAiYmF0IgorICBcZmxvcChiYXouZm9vL2JhcikgICAgICAgICAgICAgICAgICA9ICJmb28vYmFyIgorICBcZmxvcChiYXouZm9vL2JhciwvKSAgICAgICAgICAgICAgICA9ICJiYXIKKworICAgXGZzdHJpcG4oc3RyaW5nLG4pCisgICAgICAgICAgUmV0dXJucyB0aGUgc3RyaW5nIHdpdGggbmNoYXJhY3RlcnMgcmVtb3ZlZCBmcm9tIHRoZSBlbmQuCisgICAgICAgICAgRXhhbXBsZToKKworICBcZnN0cmlwbigxMjM0NTY3OCwzKSAgICAgICAgICAgICAgICA9ICIxMjM0NSIKKworICAgICAgICAgIChGb3IgbW9yZSBkaXNjdXNzaW9uIG9mIFxmc3RyaXB4KCksIFxmc3RyaXBuKCksIGFuZCBcZmxvcCgpIHNlZQorICAgICAgICAgIFs1NzJdU2VjdGlvbiA0LjIuMykuCisKKyAgIFxmYjY0ZW5jb2RlKHMpCisgICAgICAgICAgUmV0dXJucyB0aGUgQmFzZS02NCBlbmNvZGluZyBvZiB0aGUgc3RyaW5nIHMuCisKKyAgIFxmYjY0ZGVjb2RlKHMpCisgICAgICAgICAgUmV0dXJucyB0aGUgZGVjb2Rpbmcgb2YgdGhlIEJhc2UtNjQgc3RyaW5nIHMuIEZhaWxzIGlmIHMgaXMgbm90CisgICAgICAgICAgYSBCYXNlLTY0IHN0cmluZywgb3IgaWYgaXRzIGxlbmd0aCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiBOb3RlCisgICAgICAgICAgdGhhdCBpZiBhbnkgb2YgdGhlIHJlc3VsdCBieXRlcyBhcmUgbnVsbCAoMCksIHRoZSByZXN1bHQgc3RyaW5nCisgICAgICAgICAgc3RvcHMgdGhlcmUuIFRoZXJlIGlzIG5vIHdheSB0byByZXByZXNlbnQgc3RyaW5ncyB0aGF0IGNvbnRhaW4KKyAgICAgICAgICBudWxsIGJ5dGVzIGluIEMtS2VybWl0ICh0aGUgc2FtZSBpcyB0cnVlIGZvciBcZnVuaGV4aWZ5KCkpLgorCisgICBcZndvcmQoczEsbixzMixzMykKKyAgICAgICAgICBFeHRyYWN0cyB3b3JkIG51bWJlciBuZnJvbSBzdHJpbmcgczEuIEJ5IGRlZmF1bHQsIGEgIndvcmQiIGlzCisgICAgICAgICAgYW55IHNlcXVlbmNlIG9mIEFTQ0lJIGxldHRlcnMgb3IgZGlnaXRzOyBuaXMgMS1iYXNlZC4gSWYgbmlzCisgICAgICAgICAgb21pdHRlZCwgIjEiIGlzIHVzZWQuIEV4YW1wbGVzOgorCisgIFxmd29yZChvbmUgdHdvIHRocmVlKSAgICA9ICJvbmUiCisgIFxmd29yZChvbmUgdHdvIHRocmVlLDEpICA9ICJvbmUiCisgIFxmd29yZChvbmUgdHdvIHRocmVlLDIpICA9ICJ0d28iCisgIFxmd29yZChvbmUgdHdvIHRocmVlLDMpICA9ICJ0aHJlZSIKKworICAgICAgICAgIGFuZDoKKworICAgIFxmd29yZChcdihkaWFscmVzdWx0KSwyKSA9ICIzMTIwMCIKKworICAgICAgICAgIGlzICIzMTIwMCIgaWYgXHYoZGlhbHJlc3VsdCkgaXMgKGUuZy4pICJDT05ORUNUCisgICAgICAgICAgMzEyMDAvQVJRL1YzMi9MQVBNL1Y0MkJJUyIuCisKKyAgICAgICAgICBJZiB5b3UgaW5jbHVkZSBzMiwgdGhpcyByZXBsYWNlcyB0aGUgZGVmYXVsdCBicmVhayBzZXQuIEZvcgorICAgICAgICAgIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgYSBzdHJpbmcgXCVhIHdob3NlIHZhbHVlIGlzOgorCisgICQxNTAuMDAgJDMwMC4wMCAkMzkuOTUKKworICAgICAgICAgIGFuZCB5b3Ugd2FudCBlYWNoIGRvbGxhciBhbW91bnQgdG8gYmUgYSB3b3JkOyB1c2U6CisKKyAgXGZ3b3JkKFwlYSxcJW4seyB9KQorCisgICAgICAgICAgVGhpcyByZXR1cm5zIGRvbGxhciBhbW91bnQgbnVtYmVyIFwlbiwgZS5nLiAiJDMwMC4wMCIgZm9yIFwlbiA9CisgICAgICAgICAgMi4gInsgfSIgZGVub3RlcyBhIHNwYWNlICh5b3UgbXVzdCBlbmNsb3NlIGl0IGluIGJyYWNlcywKKyAgICAgICAgICBvdGhlcndpc2UgaXQgaXMgc3F1ZWV6ZWQgb3V0KS4gTm90ZSB0aGF0IEFTQ0lJIGNvbnRyb2wKKyAgICAgICAgICBjaGFyYWN0ZXJzIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIGJyZWFrIHNldDsgeW91IGRvbid0IGhhdmUKKyAgICAgICAgICB0byBzcGVjaWZ5IHRoZW0gKGFuZCB5b3UgY2FuJ3Qgbm90IHNwZWNpZnkgdGhlbSkuCisKKyAgICAgICAgICBUaGUgb3B0aW9uYWwgczMgYXJndW1lbnQgbGlzdHMgY2hhcmFjdGVycyAoZXZlbiBjb250cm9sCisgICAgICAgICAgY2hhcmFjdGVycykgdGhhdCBub3JtYWxseSB3b3VsZCBiZSBjb25zaWRlcmVkIHNlcGFyYXRvcnMgdGhhdAorICAgICAgICAgIHlvdSB3YW50IGluY2x1ZGVkIGluIHdvcmRzLiBTbyB0aGUgZG9sbGFycy1hbmQtY2VudHMgZXhhbXBsZQorICAgICAgICAgIGNvdWxkIGFsc28gYmUgaGFuZGxlZCB0aGlzIHdheToKKworICBcZndvcmQoXCVhLFwlbiwsJC4pCisKKyAgICAgICAgICBpbiBvdGhlciB3b3JkcywgdXNlIHRoZSBkZWZhdWx0IHNlcGFyYXRvciBsaXN0LCBidXQgcmVtb3ZlICIkIgorICAgICAgICAgIGFuZCAiLiIgZnJvbSBpdCBzbyB0aGV5IHdpbGwgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIGEgd29yZC4KKworICAgXGZzcGxpdChzMSwmYSxzMixzMykKKyAgICAgICAgICBUaGlzIGlzIGxpa2UgXGZ3b3JkKCksIGV4Y2VwdCBpbnN0ZWFkIG9mIGV4dHJhY3RpbmcgYW5kCisgICAgICAgICAgcmV0dXJuaW5nIGEgcGFydGljdWxhciB3b3JkIGZyb20gc3RyaW5nIHMxLCBpdCBjb3VudHMgdGhlIHdvcmRzCisgICAgICAgICAgYW5kIG9wdGlvbmFsbHkgYXNzaWducyB0aGVtIHRvIHRoZSBhcnJheSB3aG9zZSBpZGVudGlmeWluZworICAgICAgICAgIGxldHRlciwgYS16LCBpcyBnaXZlbiBhZnRlciB0aGUgIiYiIGluIHRoZSBzZWNvbmQgYXJndW1lbnQsCisgICAgICAgICAgd2l0aCB0aGUgZmlyc3Qgd29yZCBnb2luZyBpbnRvIGVsZW1lbnQgMSwgdGhlIHNlY29uZCBpbnRvCisgICAgICAgICAgZWxlbWVudCAyLCBhbmQgc28gb24uIFRoZSBydWxlcyByZWdhcmRpbmcgYnJlYWsgYW5kIGluY2x1ZGUKKyAgICAgICAgICBsaXN0cyAoczIgYW5kIHMzKSBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3IgXGZ3b3JkKCkuCisgICAgICAgICAgXGZzcGxpdCgpIHJldHVybnMgdGhlIG51bWJlciBvZiB3b3JkcyB0aGF0IHdlcmUgYXNzaWduZWQsIHdoaWNoCisgICAgICAgICAgaXMgZWl0aGVyIHRoZSBudW1iZXIgb2Ygd29yZHMgaW4gdGhlIHN0cmluZywgb3IgdGhlIGRpbWVuc2lvbgorICAgICAgICAgIG9mIHRoZSBhcnJheSwgd2hpY2hldmVyIGlzIGxlc3MuIElmIHRoZSBhcnJheSBpcyBub3QgZGVjbGFyZWQsCisgICAgICAgICAgXGZzcGxpdCgpIGNyZWF0ZXMgaXQgYW5kIHJldHVybnMgYSBudW1iZXIgd2hpY2ggaXMgYm90aCB0aGUKKyAgICAgICAgICBudW1iZXIgb2Ygd29yZHMgaW4gczEgYW5kIHRoZSBkaW1lbnNpb24gb2YgdGhlIG5ldyBhcnJheS4KKyAgICAgICAgICBFeGFtcGxlczoKKworICBkZWNsYXJlIFwmd1syMF0gICAgICAgIDsgKE9wdGlvbmFsLikKKyAgLi4uCisgIHJlYWQgXCVzICAgICAgICAgICAgICAgOyBcJXMgaXMgIlRoaXMgaXMgYSBzZW50ZW5jZSB3aXRoIHNldmVuIHdvcmRzLiIKKyAgLi4uCisgIGVjaG8gIlxmc3BsaXQoXCVzKSIgICAgOyBUaGlzIHdvdWxkIHByaW50ICI3Ii4KKyAgZWNobyAiXGZzcGxpdChcJXMsJncpIiA7IERpdHRvLCBhbmQgYWxzbyBhc3NpZ25zIHRoZW0gdG8gYXJyYXkgXCZ3W10uCisKKyAgZWNobyAiXCZ3WzddIiAgICAgICAgICA7IFRoaXMgd291bGQgcHJpbnQgIndvcmRzIi4KKworICAgICAgICAgIElmIHRoZSBsaW5lIGNvbnRhaW5lZCBmaWVsZHMgdGhhdCB3ZXJlIGRlbGltaXRlZCBieSBjb2xvbiAoOiksCisgICAgICAgICAgeW91IHdvdWxkIHVzZSBcZnNwbGl0KFwlcywmdyw6KS4gSWYgdGhlIGZpZWxkcyB3ZXJlIGRlbGltaXRlZAorICAgICAgICAgIGJ5IGNvbW1hLCB0aGVuIHlvdSB3b3VsZCB1c2UgXGZzcGxpdChcJXMsJncseyx9KTsgaW4gdGhpcyBjYXNlCisgICAgICAgICAgdGhlIGxpdGVyYWwgY29tbWEgbXVzdCBiZSBlbmNsb3NlZCBpbiBicmFjZXMgdG8gZGlzdGluZ3Vpc2ggaXQKKyAgICAgICAgICBmcm9tIHRoZSBjb21tYSB0aGF0IHNlcGFyYXRlcyBmdW5jdGlvbiBhcmd1bWVudHMuIFRvIGdldCBhIHdvcmQKKyAgICAgICAgICBjb3VudCB3aXRob3V0IGxvYWRpbmcgYW4gYXJyYXksIGJ1dCBzdGlsbCBzcGVjaWZ5IGJyZWFrIGFuZC9vcgorICAgICAgICAgIGluY2x1ZGUgbGlzdHMsIGxlYXZlIHRoZSBhcnJheSBhcmd1bWVudCBlbXB0eToKKworICAgZWNobyAiXGZzcGxpdChcJXMsLDopIiA7IFVzZSBjb2xvbiBhcyB0aGUgc2VwYXJhdG9yLgorCisgICAgICAgICAgV0FSTklOR1M6CisKKyAgICAgICAgIDEuIElmIHlvdSB1c2UgdGhlIHNhbWUgYXJyYXkgcmVwZWF0ZWRseSwgXGZzcGxpdCgpIGxlYXZlcyBhbnkKKyAgICAgICAgICAgIHRyYWlsaW5nIG1lbWJlcnMgdW5kaXN0dXJiZWQuIEZvciBleGFtcGxlOgorICBkY2wgXCZ3WzEwXQorICBcZnNwbGl0KDEgMiAzIDQgNSwmdykgOyBTZXRzIFwmd1sxXSB0aHJ1IFwmd1s1XS4KKyAgXGZzcGxpdChhIGIgYywmdykgICAgIDsgU2V0cyBcJndbMV0tWzNdIGxlYXZpbmcgWzRdLVs1XSBhcyB0aGV5IHdlcmUuCisgICAgICAgICAyLiBJZiB5b3UgYWxsb3cgXGZzcGxpdCB0byBjcmVhdGUgdGhlIGFycmF5IChieSBub3QgZGVjbGFyaW5nIGl0CisgICAgICAgICAgICBmaXJzdCksIGl0IGlzIGRpbWVuc2lvbmVkIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaXQgd2FzCisgICAgICAgICAgICBjcmVhdGVkIHdpdGg6CisgIFxmc3BsaXQoMSAyIDMsJngpICAgICA7IENyZWF0ZXMgYW4gYXJyYXkgXCZ4W10gd2l0aCAzIGVsZW1lbnRzLgorICBcZnNwbGl0KGEgYiBjIGQgZSwmeCkgOyBUaGlzIG92ZXJmbG93cyB0aGUgYXJyYXkuCisKKyAgICAgICAgICBUaHVzIGlmIHlvdSB3YW50IHRvIHVzZSBcZnNwbGl0KCkgcmVwZWF0ZWRseSBvbiB0aGUgc2FtZSBhcnJheSwKKyAgICAgICAgICBlaXRoZXIgZGltZW5zaW9uIGl0IGluIGFkdmFuY2UgdG8gdGhlIG1heGltdW0gZXhwZWN0ZWQgc2l6ZQorICAgICAgICAgIChhbmQgdGhlbiBzb21lIC0tIG1vcmUgZWZmaWNpZW50KSwgb3IgZWxzZSBkZXN0cm95IGl0IGFmdGVyCisgICAgICAgICAgZWFjaCB1c2UgKHRvIGFsbG93IGZvciB1bmV4cGVjdGVkbHkgbGFyZ2UgYXJndW1lbnRzKS4gRXhhbXBsZQorICAgICAgICAgIHVzaW5nIGEgZHluYW1pYyBhcnJheToKKworICBmb3BlbiAvcmVhZCBcJWMgc29tZS1maWxlCisgIGlmIGZhaWwgLi4uCisgIHNldCBmdW5jdGlvbiBlcnJvciBvbiAgICA7IFNlZSBbNTczXVNlY3Rpb24gNy4xMgorICB3aGlsZSB0cnVlIHsKKyAgICAgIGRjbCBcJndbXSAgICAgICAgICAgIDsgRGVzdHJveSBcJlt3XSBlYWNoIHRpbWUgdGhydSB0aGUgbG9vcAorICAgICAgZnJlYWQgL2xpbmUgXCVjIFwlYQorICAgICAgaWYgZmFpbCBicmVhaworICAgICAgYXNnIFwleCBcZnNwbGl0KFwlYSwmdykKKyAgICAgIGlmIGZhaWwgLi4uCisgICAgICA7IChkbyB3aGF0IHlvdSB3YW50IHdpdGggXCZ3W10gaGVyZS4uLikKKyAgfQorICBmY2xvc2UgXCVjCisKKyAgIFxmcmluZGV4KHMxLHMyLG4pCisgICAgICAgICAgVGhlICJuIiBhcmd1bWVudCB0byBcZnJpbmRleCgpIG5vdyB3b3JrcyBjb25zaXN0ZW50bHkgKGluCisgICAgICAgICAgbWlycm9yIGltYWdlKSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIFxmaW5kZXgoKSBhcmd1bWVudC4gSW4KKyAgICAgICAgICBlYWNoIGNhc2UsIHRoZSAobi0xKS1tb3N0IGNoYXJhY3RlcnMgb2YgczIgYXJlIGlnbm9yZWQgaW4gdGhlCisgICAgICAgICAgc2VhcmNoOyBmb3IgZmluZGV4LCB0aGlzIG1lYW5zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUKKyAgICAgICAgICBzZWFyY2ggaXMgbiAodGhlIGRlZmF1bHQgbmlzIDEsIGFuZCAwIGlzIHRyZWF0ZWQgbGlrZSAxKS4gRm9yCisgICAgICAgICAgXGZyaW5kZXgoKSBpdCBtZWFucyB0aGUgZGVmYXVsdCBzdGFydGluZyBwb2ludCBpczoKKworICBsZW5ndGgoczIpIC0gbGVuZ3RoKHMxKSAtIG4gKHdpdGggdGhlIHNhbWUgZGVmYXVsdHMgZm9yIG4pLgorCisgICBcZnNlYXJjaChwYXR0ZXJuLHN0cmluZ1sscG9zaXRpb25dKQorICAgICAgICAgIEV4YWN0bHkgbGlrZSBcZmluZGV4KCksIGV4Y2VwdCB3aXRoIGEgcGF0dGVybiAoc2VlIFs1NzRdU2VjdGlvbgorICAgICAgICAgIDcuOSkgcmF0aGVyIHRoYW4gYSBsaXRlcmFsIHN0cmluZy4KKworICAgXGZyc2VhcmNoKHBhdHRlcm4sc3RyaW5nWyxwb3NpdGlvbl0pCisgICAgICAgICAgRXhhY3RseSBsaWtlIFxmcmluZGV4KCksIGV4Y2VwdCB3aXRoIGEgcGF0dGVybiByYXRoZXIgdGhhbiBhCisgICAgICAgICAgbGl0ZXJhbCBzdHJpbmcuCisKKyAgICAgICAgICBGaWxlIEZ1bmN0aW9uczoKKworICAgXGZmaWxlcygpLCBcZm5leHRmaWxlKCkKKyAgICAgICAgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGNvcHkgdGhlIGZpbGUgbGlzdCB0byBhbiBhcnJheQorICAgICAgICAgIGJlZm9yZSB1c2UsIGFzIHNob3duIG9uIHAuMzk4IG9mIFs1NzVdVXNpbmcgQy1LZXJtaXQgMm5kCisgICAgICAgICAgRWRpdGlvbi4gXGZmaWxlcygpIGFuZCBmcmllbmRzIG5vdyBtYWtlIHRoZWlyIG93biBzYWZlIGNvcGllcworICAgICAgICAgIG9mIHRoZSBmaWxlIGxpc3QuIFRodXMgY29uc3RydWN0aW9ucyBsaWtlIHRoZSBmb2xsb3dpbmcgYXJlIG5vdworICAgICAgICAgIHBvc3NpYmxlOgorCisgIGZvciBcJWkgMSBcZmZpbGVzKCoudHh0KSAxIHsgc2VuZCBcZm5leHRmaWxlKCkgfQorCisgICAgICAgICAgVGhlIHNhbWUgaXMgdHJ1ZSBmb3IgdGhlIG5ldyBmdW5jdGlvbiBcZnJmaWxlcygpLAorICAgICAgICAgIFxmZGlyZWN0b3JpZXMoKSwgYW5kIFxmcmRpcmVjdG9yaWVzKCksIGRlc2NyaWJlZCBpbgorICAgICAgICAgIFs1NzZdU2VjdGlvbiA0LjExLjMuCisKKyAgICAgICAgICBCdXQgbm90ZSB0aGF0IGVhY2ggcmVmZXJlbmNlIHRvIFxmbmV4dGZpbGUoKSBzdGlsbCBnZXRzIHlvdSB0aGUKKyAgICAgICAgICBuZXh0IGZpbGUuIFNvICJpZiBuZXdlciBcZm5leHRmaWxlKCkgZm9vLnR4dCBzZW5kIFxmbmV4dGZpbGUoKSIKKyAgICAgICAgICBjb21wYXJlcyBvbmUgZmlsZSdzIGFnZSB3aXRoIHRoYXQgb2YgZm9vLnR4dCwgYW5kIHRoZW4gc2VuZHMgYW4KKyAgICAgICAgICBlbnRpcmVseSBkaWZmZXJlbnQgZmlsZS4gSWYgeW91J3JlIGdvaW5nIHRvIHJlZmVyIHRvIHRoZSBzYW1lCisgICAgICAgICAgZmlsZSBtb3JlIHRoYW4gb25jZSwgYXNzaWduIGl0IHRvIGEgdmFyaWFibGU6CisKKyAgYXNnIFwlZiBcZm5leHRmaWxlKCkKKyAgaWYgbmV3ZXIgXCVmIGZvby50eHQgc2VuZCBcJWYKKworICAgICAgICAgIChub3RlOiBhc3NpZ24sIG5vdCBkZWZpbmUpLgorCisgICAgICAgICAgQWxzbyBub3RlIHRoYXQgXGZmaWxlcygpLCBcZnJmaWxlcygpLCBcZmRpcmVjdG9yaWVzKCksIGFuZAorICAgICAgICAgIFxmcmRpcmVjdG9yaWVzKCkgYWxsIG5vdyBhY2NlcHQgb24gb3B0aW9uYWwgMm5kIGFyZ3VtZW50OiB0aGUKKyAgICAgICAgICBuYW1lIG9mIGFuIGFycmF5IHRvIGxvYWQgd2l0aCB0aGUgcmVzdWx0aW5nIGZpbGUgb3IgZGlyZWN0b3J5CisgICAgICAgICAgbGlzdCwgZXhwbGFpbmVkIGluIFs1NzddU2VjdGlvbiA0LjExLjMuIFNvIHlvdSBjYW4gYWxzbyBsb2FkIGFuCisgICAgICAgICAgYXJyYXkgd2l0aCB0aGUgZmlsZWxpc3Qgd2hlbiB5b3UgbmVlZCB0byByZWZlciB0byB0aGUgc2FtZSBmaWxlCisgICAgICAgICAgbW9yZSB0aGFuIG9uY2U6CisKKyAgZm9yIFwlaSAxIFxmZmlsZXMoKiwmYSkgMSB7IGlmIG5ld2VyIFwmYVtcJWldIGZvby50eHQgc2VuZCBcJmFbXCVpXSB9CisKKyAgIFxmcGVybWlzc2lvbnMoZmlsZSkKKyAgICAgICAgICBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwZXJtaXNzaW9ucyBzdHJpbmcgZm9yIHRoZSBmaWxlLAorICAgICAgICAgIHN1Y2ggYXMgIi1ydy1ydy1yLS0iIGluIFVOSVggb3IgIihSV0UsUldFLFJFLEUpIiBpbiBWTVMuCisKKyAgIFxmZGlybmFtZShmKQorICAgICAgICAgIEdpdmVuIGEgZmlsZSBzcGVjaWZpY2F0aW9uIGYsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUKKyAgICAgICAgICBjb21wbGV0ZSBwYXRobmFtZSBvZiBkaXJlY3RvcnkgdGhlIGZpbGUgaXMgaW4uCisKKyAgIEFycmF5IEZ1bmN0aW9uczoKKworICAgXGZkaW1lbnNpb24oJmEpCisgICAgICAgICAgUmV0dXJucyB0aGUgZGltZW5zaW9uIGRlY2xhcmVkIGZvciB0aGUgYXJyYXkgd2hvc2UgaWRlbnRpZnlpbmcKKyAgICAgICAgICBsZXR0ZXIsIGEteiwgb3Igc3BlY2lhbCBjaGFyYWN0ZXIgIl8iIG9yICJAIiwgaXMgZ2l2ZW4gYWZ0ZXIKKyAgICAgICAgICB0aGUgIiYiIGluIHRoZSBhcmd1bWVudC4gSWYgdGhlIGFycmF5IGlzIG5vdCBkZWNsYXJlZCwgMCBpcworICAgICAgICAgIHJldHVybmVkLiBOb3RlIHRoYXQgd2hlbiB1c2VkIHdpdGggdGhlIG1hY3JvIGFyZ3VtZW50IHZlY3RvcgorICAgICAgICAgIGFycmF5LCBcJl9bXSAoc2VlIFs1NzhdU2VjdGlvbiA3LjUpLCB0aGUgdmFsdWUgb2YgdGhpcyBmdW5jdGlvbgorICAgICAgICAgIGlzIG9uZSBsZXNzIHRoYW4gXHYoYXJnYyksIGFuZCB3aGVuIHVzZWQgd2l0aCB0aGUgQy1LZXJtaXQKKyAgICAgICAgICBjb21tYW5kLWxpbmUgYXJndW1lbnQgdmVjdG9yIGFycmF5LCBcJkBbXSwgaXQgaXMgZXF1YWwgdG8gdGhlCisgICAgICAgICAgXHYoYXJncykgdmFyaWFibGUuIEV4YW1wbGVzOgorCisgIGVjaG8gXGZkaW1lbnNpb24oJmEpICAgICAgIDsgTm90IGRlY2xhcmVkLgorICAwCisgIGRlY2xhcmUgXCZhWzEyXSAgICAgICAgICAgIDsgTm93IGl0J3MgZGVjbGFyZWQuCisgIGVjaG8gXGZkaW0oJmEpCisgIDEyCisKKyAgIFxmYXJyYXlsb29rKHBhdHRlcm4sYXJyYXluYW1lKQorICAgICAgICAgIExvb2tzIGluIHRoZSBnaXZlbiBhcnJheSBmb3IgdGhlIHBhdHRlcm4gYW5kIHJldHVybnMgdGhlIGluZGV4CisgICAgICAgICAgb2YgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzLCBpZiBhbnksIG9yIC0xIGlmIG5vbmUgbWF0Y2guCisgICAgICAgICAgVGhlIGFycmF5bmFtZSBjYW4gaW5jbHVkZSBhIHJhbmdlIHNwZWNpZmllciB0byByZXN0cmljdCB0bworICAgICAgICAgIHNlYXJjaCB0byBhIHNlZ21lbnQgb2YgdGhlIGFycmF5LCBlLmcuCisgICAgICAgICAgXGZhcnJheWxvb2soKnh5eiosJmFbMzI6NjNdKS4gRm9yIGdyZWF0ZXIgZGV0YWlsIHNlZQorICAgICAgICAgIFs1NzldU2VjdGlvbiA3LjEwLjcuCisKKyAgIFxmdGFibGVsb29rKGtleXdvcmQsYXJyYXluYW1lWyxkZWxpbWl0ZXJdKQorICAgICAgICAgIExvb2tzIGluIHRoZSBnaXZlbiAidGFibGUiLCB3aGljaCBtdXN0IGJlIHNvcnRlZCwgZm9yIHRoZSBnaXZlbgorICAgICAgICAgIGtleXdvcmQuIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSB0YWJsZSBlbGVtZW50IHRoYXQgdW5pcXVlbHkKKyAgICAgICAgICBtYXRjaGVzIHRoZSBnaXZlbiBrZXl3b3JkLCBvciAtMSBpZiBub25lIG1hdGNoLCBvciAtMiBpZiBtb3JlCisgICAgICAgICAgdGhhbiAxIG1hdGNoLiBGb3IgZ3JlYXRlciBkZXRhaWwgc2VlIFs1ODBdU2VjdGlvbiA3LjEwLjcuCisKKyAgIE90aGVyIG5ldyBmdW5jdGlvbnM6CisKKyAgIFxmaXAyaGV4KHMpCisgICAgICAgICAgQ29udmVydHMgYSBkb3R0ZWQgZGVjaW1hbCBJUCBhZGRyZXNzIHRvIGFuIDgtZGlnaXQgaGV4YWRlY2ltYWwKKyAgICAgICAgICBudW1iZXIuIFxmaXAyaGV4KDEyOC41OS4zOS4yKSA9IDgwM2IyNzAyLgorCisgICBcZmhleDJpcCh4KQorICAgICAgICAgIENvbnZlcnRzIGFuIDgtZGlnaXQgaGV4YWRlY2ltYWwgSVAgYWRkcmVzcyB0byBkb3R0ZWQgZGVjaW1hbAorICAgICAgICAgIGZvcm0sIGUuZy4gXGZoZXgyaXAoODAzYjI3MDIpID0gMTI4LjU5LjM5LjIuIFRoZSBpbnZlcnNlIG9mCisgICAgICAgICAgXGZpcDJoZXgoKS4KKworICAgXGZjb21tYW5kKCkKKyAgIFxmcmF3Y29tbWFuZCgpCisgICAgICAgICAgVGhlc2UgcnVuIGFuIGV4dGVybmFsIGNvbW1hbmQgYW5kIHJldHVybiBpdHMgb3V0cHV0OyBzZWUKKyAgICAgICAgICBbNTgxXVNlY3Rpb24gNC4yLjguNC4KKworICAgXGZkaWFsY29udmVydChzKQorICAgICAgICAgIHMgaXMgYSBwaG9uZSBudW1iZXIgaW4gZWl0aGVyIGxpdGVyYWwgb3IgcG9ydGFibGUgZm9ybWF0IChub3QgYQorICAgICAgICAgIGRpYWxpbmcgZGlyZWN0b3J5IGVudHJ5IG5hbWUpLiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgZGlhbAorICAgICAgICAgIHN0cmluZyB0aGF0IHdvdWxkIGFjdHVhbGx5IGJlIHVzZWQgd2hlbiBkaWFsaW5nIGZyb20gdGhlCisgICAgICAgICAgY3VycmVudCBsb2NhdGlvbiAoYWZ0ZXIgcHJvY2Vzc2luZyBjb3VudHJ5IGNvZGUsIGFyZWEgY29kZSwgYW5kCisgICAgICAgICAgb3RoZXIgU0VUIERJQUwgdmFsdWVzKS4KKworICAgXGZlcnJzdHJpbmcobikKKyAgICAgICAgICBSZXR1cm5zIHRoZSBzeXN0ZW0gZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIChudW1lcmljKQorICAgICAgICAgIGVycm9yIGNvZGUgbi4gVU5JWCBhbmQgVk1TIG9ubHkuIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoCisgICAgICAgICAgXHYoZXJybm8pIG9yIFx2KHBleGl0c3RhdCkuIFNlZSBbNTgyXVNlY3Rpb24gNC4yLjUgZm9yIGEgdXNhZ2UKKyAgICAgICAgICBleGFtcGxlLiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3Qgd29yayBpbiBXaW5kb3dzIGJlY2F1c2UKKyAgICAgICAgICB0aGVyZSBpcyBub3QgYSBjb25zaXN0ZW50IGVycm9yLWNvZGUtdG8tbWVzc2FnZSBtYXBwaW5nOyBlcnJvcgorICAgICAgICAgIGNvZGUgIngiIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBkZXBlbmRpbmcgb24KKyAgICAgICAgICB3aGV0aGVyIGl0IGNvbWVzIGZyb20gdGhlIEMgcnVudGltZSBsaWJyYXJ5LCBXaW5zb2NrLCBhCisgICAgICAgICAgV2luZG93cy0zMiBBUEksIFRBUEksIGV0YywKKworICAgXGZwYXR0ZXJuKHMpCisgICAgICAgICAgVXNlZCBpbiBJTlBVVCwgUkVJTlBVVCwgYW5kIE1JTlBVVCBjb21tYW5kcyB0byBkZW5vdGUgc2VhcmNoCisgICAgICAgICAgc3RyaW5ncyB0aGF0IGFyZSB0byBiZSB0cmVhdGVkIGFzIHBhdHRlcm5zIHJhdGhlciB0aGFuCisgICAgICAgICAgbGl0ZXJhbGx5LgorCisgICBBbHNvIHNlZSBbNTgzXVNlY3Rpb24gNy44IG9uIGJ1aWx0LWluIGhlbHAgZm9yIGZ1bmN0aW9ucy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjQuIE5ldyBJRiBDb25kaXRpb25zCisKKyAgIElGIEFWQUlMQUJMRSBmZWF0dXJlIGNvbW1hbmQKKyAgICAgICAgICBFeGVjdXRlcyB0aGUgY29tbWFuZCBpZiB0aGUgZ2l2ZW4gZmVhdHVyZSBpcyBhdmFpbGFibGUuCisgICAgICAgICAgUHJlc2VudGx5IHVzZWQgb25seSB0byBkZXRlcm1pbmUgaWYgc3BlY2lmaWMgYXV0aGVudGljYXRpb24gYW5kCisgICAgICAgICAgZW5jcnlwdGlvbiBvcHRpb25zIGFyZSBhdmFpbGFibGUuIFR5cGUgImlmIGF2YWlsYWJsZSA/IiB0byBzZWUKKyAgICAgICAgICB3aGljaCBmZWF0dXJlcyBtYXkgYmUgdGVzdGVkLgorCisgICBJRiBGTE9BVCBmMSBjb21tYW5kCisgICAgICAgICAgRXhlY3V0ZXMgY29tbWFuZCBpZiBmMSBpcyBhIGxlZ2FsIGZsb2F0aW5nIHBvaW50IG51bWJlciAod2hpY2gKKyAgICAgICAgICBpbmNsdWRlcyBpbnRlZ2VycykuIFVzZSB0aGlzIHRvIHByZXZlcmlmeSBhcmd1bWVudHMgZm9yIHRoZQorICAgICAgICAgIFxmZnAuLi4oKSBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljIGZ1bmN0aW9ucywgZS5nLiAiaWYgZmxvYXQKKyAgICAgICAgICBcJTEgZWNobyBcZmZwaW50KFwlMSkiLgorCisgICBJRiA9PSBuMSBuMiBjb21tYW5kCisgICAgICAgICAgU3lub255bSBmb3IgImlmID0iIChudW1lcmljIGVxdWFsaXR5KS4gTm90ZSB0aGF0IGFzIG9mIEMtS2VybWl0CisgICAgICAgICAgNy4wLCB0aGlzIGFuZCBhbGwgb3RoZXIgbnVtZXJpYyBjb21wYXJpc29uIG9wZXJhdG9ycyBhbHNvIHdvcmsKKyAgICAgICAgICBmb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KKworICAgSUYgIT0gbjEgbjIgY29tbWFuZAorICAgICAgICAgIEV4ZWN1dGVzIHRoZSBjb21tYW5kIGlmIG4xIGFuZCBuMiBhcmUgYm90aCBudW1iZXJzIG9yIHZhcmlhYmxlcworICAgICAgICAgIGNvbnRhaW5pbmcgbnVtYmVycyBhbmQgdGhlIHZhbHVlIG9mIG4xIGlzIG5vdCBlcXVhbCB0byB0aGUKKyAgICAgICAgICB2YWx1ZSBvZiBuMi4gVGhpcyBpcyBlcXVpdmFsZW50IHRvICJpZiBub3QgPSBuMSBuMiIuCisKKyAgIElGIDw9IG4xIG4yIGNvbW1hbmQKKyAgICAgICAgICBFeGVjdXRlcyB0aGUgY29tbWFuZCBpZiBuMSBhbmQgbjIgYXJlIGJvdGggbnVtYmVycyBvciB2YXJpYWJsZXMKKyAgICAgICAgICBjb250YWluaW5nIG51bWJlcnMgYW5kIHRoZSB2YWx1ZSBvZiBuMSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgICAgICB0aGUgdmFsdWUgb2YgbjIuIFRoaXMgaXMgZXF1aXZhbGVudCB0byAiaWYgbm90ID4gbjEgbjIiLgorCisgICBJRiA+PSBuMSBuMiBjb21tYW5kCisgICAgICAgICAgRXhlY3V0ZXMgdGhlIGNvbW1hbmQgaWYgbjEgYW5kIG4yIGFyZSBib3RoIG51bWJlcnMgb3IgdmFyaWFibGVzCisgICAgICAgICAgY29udGFpbmluZyBudW1iZXJzIGFuZCB0aGUgdmFsdWUgb2YgbjEgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgICAgICAgICAgdG8gdGhlIHZhbHVlIG9mIG4yLiBFcXVpdmFsZW50IHRvICJpZiBub3QgPCBuMSBuMiIuCisKKyAgIElGIENPTU1BTkQgd29yZCBjb21tYW5kCisgICAgICAgICAgRXhlY3V0ZXMgdGhlIGNvbW1hbmQgaWYgd29yZCBpcyBhIGJ1aWx0LWluIEMtS2VybWl0IGNvbW1hbmQuCisgICAgICAgICAgRXhhbXBsZToKKworICBpZiBub3QgY29tbWFuZCBjb3B5IGRlZmluZSB7IGNvcHkgcnVuIGNvcHkgXCUxIFwlMiB9Ii4KKworICAgICAgICAgIFRoaXMgZGVmaW5lcyBhIENPUFkgbWFjcm8gdGhhdCBydW5zIGFuIGV4dGVybmFsIENPUFkgY29tbWFuZCBpZgorICAgICAgICAgIENPUFkgaXMgbm90IGFscmVhZHkgYSBidWlsdC1pbiBjb21tYW5kLgorCisgICBJRiBMT0NBTCBjb21tYW5kCisgICAgICAgICAgRXhlY3V0ZXMgdGhlIGNvbW1hbmQgaWYgS2VybWl0IGlzIGluIGxvY2FsIG1vZGUsIGkuZS4gaWYgaXQgaGFzCisgICAgICAgICAgYSBTRVQgTElORSwgU0VUIFBPUlQsIG9yIFNFVCBIT1NUIChURUxORVQsIFJMT0dJTiwgZXRjKSBkZXZpY2UKKyAgICAgICAgICBvciBjb25uZWN0aW9uIG9wZW4uIERvZXMgbm90IGV4ZWN1dGUgdGhlIGNvbW1hbmQgaWYgaW4gcmVtb3RlCisgICAgICAgICAgbW9kZS4KKworICAgSUYgTUFUQ0ggc3RyaW5nIHBhdHRlcm4gY29tbWFuZAorICAgICAgICAgIEV4ZWN1dGVzIHRoZSBjb21tYW5kIGlmIHRoZSBzdHJpbmcgbWF0Y2hlcyB0aGUgcGF0dGVybi4gRm9yIGEKKyAgICAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IGZvciB0aGUgcGF0dGVybiwgc2VlIFs1ODRdU2VjdGlvbgorICAgICAgICAgIDQuOS4xLiBJZiB5b3Ugd2FudCB0byB0ZXN0IGlmIHRoZSBzdHJpbmcgY29udGFpbnMgcGF0dGVybiwgdXNlCisgICAgICAgICAgSUYgXGZzZWFyY2gocGF0dGVybixzdHJpbmcpLgorCisgICBJRiBPUEVOIHsgREVCVUctTE9HLCBTRVNTSU9OLUxPRywgVFJBTlNBQ1RJT04tTE9HLCAuLi4gfSBjb21tYW5kCisgICAgICAgICAgRXhlY3V0ZXMgdGhlIGNvbW1hbmQgaWYgdGhlIGdpdmVuIGZpbGUgaXMgb3BlbiwgZmFpbHMgaWYgaXQgaXMKKyAgICAgICAgICBub3Qgb3Blbi4gVHlwZSBJRiBPUEVOID8gZm9yIGEgY29tcGxldGUgbGlzdCBvZiBmaWxlcyB0aGF0IGNhbgorICAgICAgICAgIGJlIGNoZWNrZWQgKGFsbCB0aGUgZmlsZXMgdGhhdCBjYW4gYmUgb3BlbmVkIHdpdGggdGhlIE9QRU4gb3IKKyAgICAgICAgICBMT0cgY29tbWFuZHMpLgorCisgICBJRiBRVUlFVCBjb21tYW5kCisgICAgICAgICAgRXhlY3V0ZXMgdGhlIGNvbW1hbmQgaWYgU0VUIFFVSUVUIGlzIE9OLCBhbmQgZG9lcyBub3QgZXhlY3V0ZQorICAgICAgICAgIGl0IGlmIFNFVCBRVUlFVCBpcyBPRkYuIEV4YW1wbGU6IElGIE5PVCBRVUlFVCBFQ0hPIHsgVGhpcyBpcyBhCisgICAgICAgICAgbWVzc2FnZS59LgorCisgICBJRiBSRUFEQUJMRSBuYW1lCisgICAgICAgICAgU3VjY2VlZHMgaWYgbmFtZSBpcyB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeQorICAgICAgICAgIHRoYXQgaXMgcmVhZGFibGUuCisKKyAgIElGIFdSSVRFQUJMRSBuYW1lCisgICAgICAgICAgU3VjY2VlZHMgaWYgbmFtZSBpcyB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeQorICAgICAgICAgIHRoYXQgaXMgd3JpdGVhYmxlLCBlLmcuOgorCisgIGlmIG5vdCB3cml0ZWFibGUgXHYobG9ja2RpcikgZWNobyBQbGVhc2UgcmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIQorCisgICBJRiBGTEFHIGNvbW1hbmQKKyAgICAgICAgICBUaGlzIHRlc3RzIGEgdXNlci1zZXR0YWJsZSBjb25kaXRpb24sIHdoaWNoIGNhbiBtZWFuIGFueXRoaW5nCisgICAgICAgICAgeW91IGxpa2UuIFNFVCBGTEFHIE9OIGNhdXNlcyBzdWJzZXF1ZW50IElGIEZMQUcgY29tbWFuZHMgdG8KKyAgICAgICAgICBzdWNjZWVkOyBTRVQgRkxBRyBPRkYgY2F1c2VzIHRoZW0gdG8gZmFpbC4gT25lIHdheSB0byB1c2UgaXQKKyAgICAgICAgICB3b3VsZCBiZSBmb3IgZGVidWdnaW5nIHlvdXIgc2NyaXB0czsgcHJlY2VkZSBhbnkgZGVidWdnaW5nCisgICAgICAgICAgc3RhdGVtZW50cyB3aXRoIElGIEZMQUcuIFRoZW4gU0VUIEZMQUcgb24gdG8gZGVidWcgeW91ciBzY3JpcHQsCisgICAgICAgICAgU0VUIEZMQUcgT0ZGIHRvIHJ1biBpdCB3aXRob3V0IGRlYnVnZ2luZy4gQW5vdGhlciBjb21tb24gdXNlIGlzCisgICAgICAgICAgZm9yIGNhdXNpbmcgYW4gaW5uZXIgbG9vcCB0byBjYXVzZSBhbiBvdXRlciBsb29wIHRvIGV4aXQuCisKKyAgIElGIEMtS0VSTUlUIGNvbW1hbmQKKyAgICAgICAgICBDLUtlcm1pdCwgYnV0IG5vdCBLZXJtaXQgOTUgb3IgTVMtRE9TIEtlcm1pdCwgZXhlY3V0ZXMgdGhlCisgICAgICAgICAgY29tbWFuZC4KKworICAgSUYgSy05NSBjb21tYW5kCisgICAgICAgICAgS2VybWl0IDk1LCBidXQgbm90IEMtS2VybWl0IG9yIE1TLURPUyBLZXJtaXQsIGV4ZWN1dGVzIHRoZQorICAgICAgICAgIGNvbW1hbmQuCisKKyAgIElGIE1TLUtFUk1JVCBjb21tYW5kCisgICAgICAgICAgTVMtRE9TIEtlcm1pdCwgYnV0IG5vdCBDLUtlcm1pdCBvciBLZXJtaXQgOTUsIGV4ZWN1dGVzIHRoZQorICAgICAgICAgIGNvbW1hbmQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNy41LiBVc2luZyBNb3JlIHRoYW4gVGVuIE1hY3JvIEFyZ3VtZW50cworCisgICBUaGUgXHYoYXJnYykgdmFyaWFibGUgbm93IGdpdmVzIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGFyZ3VtZW50cywgZXZlbgorICAgaWYgdGhlIG51bWJlciBpcyBncmVhdGVyIHRoYW4gOToKKworICBDLUtlcm1pdD4gZGVmaW5lIHh4IGVjaG8gXHYoYXJnYykKKyAgQy1LZXJtaXQ+IHh4IGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIG0gbiBvIHAgcSByIHMgdCB1IHYgdyB4IHkgegorICAyNworCisgICBSZW1lbWJlciB0aGF0IFx2KGFyZ2MpIGluY2x1ZGVzIHRoZSBuYW1lIG9mIHRoZSBtYWNybyBpdHNlbGYsIHNvIGl0IGlzCisgICBhbHdheXMgYXQgbGVhc3QgMSwgYW5kIGlzIGFsd2F5cyAxIGdyZWF0ZXIgdGhhbiB0aGUgYWN0dWFsIG51bWJlciBvZgorICAgYXJndW1lbnRzLiBBcyBpbiB2ZXJzaW9ucyA2LjAgYW5kIGVhcmxpZXIsIGlmIG1vcmUgdGhhbiA5IGFyZ3VtZW50cworICAgYXJlIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBuaW5lIGFyZSBhc3NpZ25lZCB0byB0aGUgdmFyaWFibGVzIFwlMS4uXCU5LgorCisgICBUaGUgXCZfW10gYXJyYXksIGRpc2N1c3NlZCBvbiBwYWdlIDM1MyBvZiBbNTg1XVVzaW5nIEMtS2VybWl0LCAybmQgZWQsCisgICBub3cgaG9sZHMgYWxsIHRoZSBhcmd1bWVudHMsIHVwIHRvIHNvbWUgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IGxpbWl0CisgICAoNjQgb3IgZ3JlYXRlciksIHJhdGhlciB0aGFuIG9ubHkgdGhlIGZpcnN0IDkuIFRvIGlsbHVzdHJhdGU6IHRoZQorICAgZm9sbG93aW5nIG1hY3JvIHRlbGxzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGl0IHdhcyBjYWxsZWQgd2l0aCBhbmQKKyAgIHRoZW4gcHJpbnRzIHRoZW06CisKKyAgZGVmaW5lIHNob3dfYWxsX2FyZ3MgeworICAgICAgbG9jYWwgXCVpCisgICAgICBlY2hvIFwmX1swXSAtIE51bWJlciBvZiBhcmd1bWVudHM6IFxmZXZhbChcdihhcmdjKS0xKQorICAgICAgZm9yIFwlaSAxIFx2KGFyZ2MpLTEgMSB7IGVjaG8gXGZscGFkKFwlaSwzKS4gIlwmX1tcJWldIiB9CisgIH0KKworICAgV2l0aGluIGEgbWFjcm8gXCZfWzBdLCBsaWtlIFwlMCwgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIG1hY3JvLgorCisgICBBdCB0b3AgbGV2ZWwsIHRoZSBcJl9bXSBhcnJheSBpcyBmaWxsZWQgYXMgZm9sbG93czoKKworICAgICAqIElmIHRoZSBmaXJzdCBhcmd1bWVudCBvbiB0aGUgQy1LZXJtaXQgY29tbWFuZCBsaW5lIHdhcyBhIGZpbGVuYW1lLAorICAgICAgIG9yIEMtS2VybWl0IHdhcyBpbnZva2VkIGZyb20gYSAiS2VyYmFuZyIgc2NyaXB0IChbNTg2XVNlY3Rpb24KKyAgICAgICA3LjE5KSwgZWxlbWVudCAwIGNvbnRhaW5zIHRoZSBmaWxlbmFtZSwgYW5kIGVsZW1lbnRzIDEgdGhyb3VnaAorICAgICAgIFx2KGFyZ2MpLTEgaG9sZCB0aGUgcmVtYWluaW5nIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCisgICAgICogT3RoZXJ3aXNlIHRoZSBwcm9ncmFtIG5hbWUgZ29lcyBpbiBlbGVtZW50IDAsIGFuZCBlbGVtZW50cyAxCisgICAgICAgdGhyb3VnaCBcdihhcmdjKS0xIGhvbGQgYW55IGFyZ3VtZW50cyB0aGF0IHdlcmUgaW5jbHVkZWQgYWZ0ZXIKKyAgICAgICAiLS0iIG9yICI9IgorCisgICBUaGUgbmV3IFwlKiB2YXJpYWJsZSwgd2hlbiB1c2VkIHdpdGhpbiBhIG1hY3JvLCBpcyByZXBsYWNlZCBieSB0aGUKKyAgIHRleHQgdGhhdCBmb2xsb3dlZCB0aGUgbWFjcm8gbmFtZSBpbiB0aGUgbWFjcm8gaW52b2NhdGlvbi4gSWYgbm8KKyAgIGFyZ3VtZW50cyB3ZXJlIGdpdmVuLCBcJSogaXMgcmVwbGFjZWQgYnkgdGhlIGVtcHR5IHN0cmluZy4gRXhhbXBsZXM6CisKKyAgQy1LZXJtaXQ+IGRlZmluZSB4eCBlY2hvIFtcJSpdCisgIEMtS2VybWl0PiBkZWZpbmUgXCVhIG9vZmEKKyAgQy1LZXJtaXQ+IHh4CisgIFtdCisgIEMtS2VybWl0PiB4eCBcJWEKKyAgW29vZmFdCisgIEMtS2VybWl0PiB4eCBhCisgIFthXQorICBDLUtlcm1pdD4geHggYSBiCisgIFthIGJdCisgIEMtS2VybWl0PiB4eCBhIGIgYworICBbYSBiIGNdCisgIEMtS2VybWl0PiB4eCBhIGIgYyBkIGUgZiBnIGggaSBqIGsgbCBtIG4gbyBwIHEgciBzIHQgdSB2IHcgeCB5IHoKKyAgW2EgYiBjIGQgZSBmIGcgaCBpIGogayBsIG0gbiBvIHAgcSByIHMgdCB1IHYgdyB4IHkgel0KKworICAgTm90ZSB0aGF0IFwlKiBjYW4gbm90IGJlIHVzZWQgYXQgdG9wIGxldmVsLCBzaW5jZSBLZXJtaXQgZG9lcyBub3QgaGF2ZQorICAgYWNjZXNzIHRvIHRoZSByYXcgY29tbWFuZCBsaW5lIChvbmx5IHRvIGl0cyBlbGVtZW50cyBzZXBhcmF0ZWx5LCBhZnRlcgorICAgdGhleSBoYXZlIGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBzaGVsbCBhbmQgdGhlIEMgbGlicmFyeSkuCisKKyAgIEMtS2VybWl0IDcuMCBhbHNvIGFkZHMgYSBTSElGVCBjb21tYW5kOgorCisgICBTSElGVCBbIG51bWJlciBdCisgICAgICAgICAgU2hpZnRzIHRoZSBtYWNybyBhcmd1bWVudHMgKGV4Y2VwdCBhcmd1bWVudCAwKSB0aGUgZ2l2ZW4gbnVtYmVyCisgICAgICAgICAgb2YgcGxhY2VzIHRvIHRoZSBsZWZ0IGFuZCBhZGp1c3RzIFx2KGFyZ2MpIGFjY29yZGluZ2x5LiBUaGUKKyAgICAgICAgICBkZWZhdWx0IG51bWJlciBpcyAxLgorCisgICBUbyBpbGx1c3RyYXRlLCBzdXBwb3NlIG1hY3JvIFhYWCBpcyBpbnZva2VkIGFzIGZvbGxvd3M6CisKKyAgeHh4IGFyZzEgYXJnMiBhcmczCisKKyAgIFRoZW4gaW5zaWRlIFhYWCwgXCUxIGlzICJhcmcxIiwgXCUyIGlzICJhcmcyIiwgYW5kIFwlMyBpcyAiYXJnMyIuCisgICBBZnRlciBhIFNISUZUIGNvbW1hbmQgaXMgZ2l2ZW4gaW5zaWRlIFhYWCwgdGhlbiBcJTEgaXMgImFyZzIiLCBcJTIgaXMKKyAgICJhcmczIiwgYW5kIFwlMyBpcyBlbXB0eS4gXCUwICh0aGUgbmFtZSBvZiB0aGUgbWFjcm8pIHJlbWFpbnMKKyAgIHVuY2hhbmdlZC4KKworICAgSWYgbW9yZSB0aGFuIDkgYXJndW1lbnRzIHdlcmUgZ2l2ZW4sIHRoZW4gYXJndW1lbnRzIGFyZSBzaGlmdGVkIGludG8KKyAgIHRoZSBcJTEuLjkgdmFyaWFibGVzIGZyb20gdGhlIGFyZ3VtZW50IHZlY3RvciBhcnJheS4KKworICAgQXQgdG9wIGxldmVsLCB0aGUgU0hJRlQgY29tbWFuZCBvcGVyYXRlcyBvbiB0aGUgXCZfW10gYXJyYXkgYW5kIFwlMS4uOQorICAgdmFyaWFibGVzOyB0aGUgXCZAW10gYXJyYXkgaXMgbm90IGFmZmVjdGVkLiBTZWUgWzU4N11TZWN0aW9uIDcuMTYgZm9yCisgICBkZXRhaWxzLgorCisgICBUaGUgXCUqIHZhcmlhYmxlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgU0hJRlQgY29tbWFuZC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjYuIENsYXJpZmljYXRpb24gb2YgRnVuY3Rpb24gQ2FsbCBTeW50YXgKKworICAgU3BhY2VzIGFyZSBub3JtYWxseSBzdHJpcHBlZCBmcm9tIHRoZSBmcm9udCBhbmQgYmFjayBvZiBlYWNoIGZ1bmN0aW9uCisgICBhcmd1bWVudDsgdG8gcHJldmVudCB0aGlzIGVuY2xvc2UgdGhlIGFyZ3VtZW50IGluIGJyYWNlczoKKworICBcZnNwbGl0KFwlYSwmYSx7IH0pCisKKyAgIEhvd2V2ZXIsIGZ1bmN0aW9uIGNhbGxzIHRoYXQgY29udGFpbiBzcGFjZXMgY2FuIG1ha2UgdHJvdWJsZSB3aGVuIHRoZQorICAgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBpbiBhICJ3b3JkIiBmaWVsZCwgc2luY2Ugc3BhY2Ugc2VwYXJhdGVzIHdvcmRzLgorICAgRm9yIGV4YW1wbGU6CisKKyAgZm9yIFwlaSAxIFxmc3BsaXQoXCVhLCZhLHsgfSkgMSB7CisgICAgZWNobyBcJWkuICJcJmFbXCVpXSIKKyAgfQorCisgICBJbiBtb3N0IGNhc2VzLCB0aGUgdHJvdWJsZSBjYW4gYmUgYXZlcnRlZCBieSBlbmNsb3NpbmcgdGhlIGZ1bmN0aW9uCisgICByZWZlcmVuY2UgaW4gYnJhY2VzOgorCisgIGZvciBcJWkgMSB7XGZzcGxpdChcJWEsJmEseyB9KX0gMSB7CisgICAgZWNobyBcJWkuICJcJmFbXCVpXSIKKyAgfQorCisgICBvciBieSByZXBsYWNpbmcgc3BhY2VzIHdpdGggXDMyICh0aGUgQVNDSUkgY29kZSBmb3Igc3BhY2UpOgorCisgIGZvciBcJWkgMSBcZnNwbGl0KFwlYSwmYSxcMzIpIDEgeworICAgIGVjaG8gXCVpLiAiXCZhW1wlaV0iCisgIH0KKworICAgQnJhY2VzIGFyZSBhbHNvIHVzZWQgaW4gZnVuY3Rpb24gY2FsbHMgdG8gaW5kaWNhdGUgZ3JvdXBpbmcuIEZvcgorICAgZXhhbXBsZToKKworICBcZnN1YnN0cmluZyhhYmNkLDIsMikgPSAiYmMiCisKKyAgIEJ1dCBzdXBwb3NlICJhYmNkIiBuZWVkZWQgdG8gY29udGFpbiBhIGNvbW1hOgorCisgIFxmc3Vic3RyaW5nKGFiLGNkLDIsMikKKworICAgVGhpcyB3b3VsZCBjYXVzZSBhbiBlcnJvciwgc2luY2UgImNkIiBhcHBlYXJzIHRvIGJlIHRoZSBzZWNvbmQKKyAgIGFyZ3VtZW50LCB3aGVuIHJlYWxseSB5b3Ugd2FudCB0aGUgZmlyc3QgIjIiIHRvIGJlIHRoZSBzZWNvbmQKKyAgIGFyZ3VtZW50LiBCcmFjZXMgdG8gdGhlIHJlc2N1ZToKKworICBcZnN1YnN0cmluZyh7YWIsY2R9LDIsMikgPSAiYiwiCisKKyAgIFNpbWlsYXJseSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIGFyZSBzdHJpcHBlZCBmcm9tIGVhY2gKKyAgIGFyZ3VtZW50LCBzbzoKKworICBcZnN1YnN0cmluZyggYWJjZCAsMiwyKSA9ICJiYyIKKworICAgYnV0IGJyYWNlcyBwcmVzZXJ2ZSB0aGVtOgorCisgIFxmc3Vic3RyaW5nKHsgYWJjZCB9LDIsMikgPSAiYWIiCisKKyAgIEdpdmVuIHRoZXNlIHNwZWNpYWwgdXNlcyBmb3IgYnJhY2VzLCB0aGVyZSBpcyBubyB3YXkgdG8gcGFzcyBsaXRlcmFsCisgICBicmFjZXMgdG8gdGhlIGZ1bmN0aW9uIGl0c2VsZi4gRm9yIGV4YW1wbGU6CisKKyAgXGZzdWJzdHJpbmcoYWJ7Y2QsMiwyKQorCisgICBjYXVzZXMgYW4gZXJyb3IuCisKKyAgIFNvIGlmIHlvdSBuZWVkIGEgZnVuY3Rpb24gdG8gaW5jbHVkZSBicmFjZXMsIGRlZmluZSBhIHZhcmlhYmxlCisgICBjb250YWluaW5nIHRoZSBzdHJpbmcgdGhhdCBoYXMgYnJhY2VzLiBFeGFtcGxlOgorCisgIGRlZmluZSBcJWEgYWJ7Y2QKKyAgXGZzdWJzdHJpbmcoXCVhLDIsMikgPSAiYnsiCisKKyAgIElmIHRoZSBzdHJpbmcgaXMgdG8gc3RhcnQgd2l0aCBhIGxlYWRpbmcgYnJhY2UgYW5kIGVuZCB3aXRoIGEgY2xvc2luZworICAgYnJhY2UsIHRoZW4gZG91YmxlIGJyYWNlcyBtdXN0IGFwcGVhciBhcm91bmQgdGhlIHN0cmluZyAod2hpY2ggaXRzZWxmCisgICBpcyBlbmNsb3NlZCBpbiBicmFjZXMpOgorCisgIGRlZmluZSBcJWEge3t7Zm9vfX19CisgIFxmc3Vic3RyaW5nKFwlYSkgPSAie2Zvb30iCisKKyAgIFRoaXMgYWxzbyB3b3JrcyBmb3IgYW55IG90aGVyIGtpbmQgb2Ygc3RyaW5nOgorCisgIGRlZmluZSBcJWEge3thYntjZH19CisgIGVjaG8gXGZzdWJzdHJpbmcoXCVhKSA9ICJhYntjZCIKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjcuIEF1dG9kb3dubG9hZCBkdXJpbmcgSU5QVVQgQ29tbWFuZCBFeGVjdXRpb24KKworICAgQXMgb2YgNi4xIC8gMS4xLjEyLCBDLUtlcm1pdCBjYW4gYmUgdG9sZCB0byBsb29rIGZvciBpbmNvbWluZyBLZXJtaXQKKyAgIChvciBabW9kZW0pIHBhY2tldHMgZHVyaW5nIGV4ZWN1dGlvbiBvZiBhbiBJTlBVVCBjb21tYW5kLiBCeSBkZWZhdWx0CisgICAoZm9yIGNvbnNpc3RlbmN5IHdpdGggZWFybGllciByZWxlYXNlcyksIHRoaXMgaXMgbm90IGRvbmUuIFlvdSBjYW4KKyAgIGVuYWJsZSB0aGlzIGZlYXR1cmUgd2l0aDoKKworICBTRVQgSU5QVVQgQVVUT0RPV05MT0FEIE9OCisKKyAgIChhbmQgZGlzYWJsZSBpdCBhZ2FpbiB3aXRoIE9GRi4pCisKKyAgIE9uZSBwb3NzaWJsZSB1c2UgZm9yIHRoaXMgZmVhdHVyZSBpcyBhcyBhIHNlcnZlciBtb2RlIHdpdGggYSB0aW1lCisgICBsaW1pdDoKKworICBJTlBVVCAzNjAwIHNlY3JldC1zdHJpbmctdG8tZW5kLXRoZS1JTlBVVC1jb21tYW5kCisKKyAgIEluIHRoaXMgZXhhbXBsZSwgYW55IEdFVCwgU0VORCwgb3IgUkVNT1RFIGNvbW1hbmRzIHJlY2VpdmVkIHdpdGhpbiBvbmUKKyAgIGhvdXIgKDM2MDAgc2Vjb25kcykgb2Ygd2hlbiB0aGUgSU5QVVQgY29tbWFuZCB3YXMgaXNzdWVkIHdpbGwgYmUKKyAgIGV4ZWN1dGVkLiBIZXJlJ3MgYW5vdGhlciBleGFtcGxlLCBpbiB3aGljaCB3ZSB3YW50IHRvIHN0YXkgb3BlbiB1bnRpbAorICAgMTE6MzBwbSwgb3IgdW50aWwgaW50ZXJydXB0ZWQgYnkgc2V2ZW4gY29uc2VjdXRpdmUgQ3RybC1DIChcMykKKyAgIGNoYXJhY3RlcnM6CisKKyAgSU5QVVQgMjM6MzA6MDAgXDNcM1wzXDNcM1wzXDMKKworICAgVGhlIElOUFVUIEFVVE9ET1dOTE9BRCBzZXR0aW5nIGlzIGRpc3BsYXllZCBieSBTSE9XIFNDUklQVFMgb3IgU0hPVworICAgSU5QVVQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNy44LiBCdWlsdC1pbiBIZWxwIGZvciBGdW5jdGlvbnMuCisKKyAgIEJlZ2lubmluZyBpbiBDLUtlcm1pdCA3LjAsIHlvdSBtYXkgb2J0YWluIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNhbGxpbmcKKyAgIGNvbnZlbnRpb25zIGFuZCByZXR1cm4gdmFsdWVzIG9mIGFueSBidWlsdC1pbiBmdW5jdGlvbiwgc3VjaCBhcworICAgXGZzdWJzdHJpbmcoKSwgd2l0aCB0aGUgbmV3IEhFTFAgRlVOQ1RJT04gY29tbWFuZDsgZ2l2ZSB0aGUgZnVuY3Rpb24ncworICAgbmFtZSB3aXRob3V0IHRoZSBsZWFkaW5nICJcZiIsIGUuZy4gImhlbHAgZnVuYyBzdWJzdHJpbmciLiBZb3UgY2FuIHVzZQorICAgPywgY29tcGxldGlvbiwgYW5kIGFiYnJldmlhdGlvbiBpbiB0aGUgbm9ybWFsIG1hbm5lci4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjkuIFZhcmlhYmxlIEFzc2lnbm1lbnRzCisKKyAgICA3LjkuMS4gQXNzaWdubWVudCBPcGVyYXRvcnMKKworICAgUHJvZ3JhbW1lcnMgYWNjdXN0b21lZCB0byBsYW5ndWFnZXMgc3VjaCBhcyBDIG9yIEZvcnRyYW4gbWlnaHQgZmluZAorICAgS2VybWl0J3MgbWV0aG9kIG9mIGFzc2lnbmluZyB2YWx1ZXMgdG8gdmFyaWFibGVzIHVubmF0dXJhbCBvciBhd2t3YXJkLgorICAgQmVnaW5uaW5nIGluIEMtS2VybWl0IDcuMCwgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBhbHRlcm5hdGl2ZQorICAgbm90YXRpb246CisKKyAubmFtZSA9IHZhbHVlICAgIGlzIGVxdWl2YWxlbnQgdG8gICBERUZJTkUgbmFtZSB2YWx1ZQorIC5uYW1lIDo9IHZhbHVlICAgaXMgZXF1aXZhbGVudCB0byAgIEFTU0lHTiBuYW1lIHZhbHVlCisgLm5hbWUgOjo9IHZhbHVlICBpcyBlcXVpdmFsZW50IHRvICAgQVNTSUdOIG5hbWUgXGZldmFsKHZhbHVlKQorCisgICBXaGVuIHRoZSBjb21tYW5kIGJlZ2lucyB3aXRoIGEgcGVyaW9kICguKSwgdGhpcyBpbmRpY2F0ZXMgYW4KKyAgIGFzc2lnbm1lbnQuIFRoZSBuYW1lIGNhbiBiZSBhIG1hY3JvIG5hbWUsIGEgXCV7ZGlnaXQsbGV0dGVyfSB2YXJpYWJsZSwKKyAgIG9yIGFuIGFycmF5IGVsZW1lbnQuIFRoZXJlIGNhbiBiZSBzcGFjZShzKSBiZXR3ZWVuICIuIiBhbmQgdGhlIG5hbWUuCisgICBFeGFtcGxlczoKKworICAuXCVhID0gVGhpcyBpcyBhIHN0cmluZyAgOyBTYW1lIGFzICJkZWZpbmUgXCVhIFRoaXMgaXMgYSBzdHJpbmciCisgIGVjaG8gXCVhCisgIFRoaXMgaXMgYSBzdHJpbmcKKworICAueHh4ID0gXCVhICAgICAgICAgICAgICAgOyBTYW1lIGFzICJkZWZpbmUgeHh4IFwlYSIKKyAgZWNobyBcbSh4eHgpCisgIFwlYQorCisgIC54eHggOj0gXCVhICAgICAgICAgICAgICA7IFNhbWUgYXMgImFzc2lnbiB4eHggXCVhIgorICBlY2hvIFxtKHh4eCkKKyAgVGhpcyBpcyBhIHN0cmluZworCisgIGRlY2xhcmUgXCZhWzJdICAgICAgICAgICA7IFVzZSB3aXRoIGFycmF5cy4uLgorICBkZWZpbmUgXCVpIDIKKyAgLlwmYVsxXSA9IGZpcnN0CisgIC5cJmFbXCVpXSA9IHNlY29uZAorCisgICBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIGlsbHVzdHJhdGVzIHRoZSBkaWZmZXJlbmNlcyBhbW9uZyB0aHJlZSBsZXZlbHMKKyAgIG9mIGV2YWx1YXRpb246CisKKyAgLlwleCA9IDIgICAgICAgICAgOyBEZWZpbmUgYSB2YXJpYWJsZSB0byBoYXZlIGEgbnVtZXJpYyB2YWx1ZQorICAuXCV5ID0gKDMgKyBcJXgpICA7IERlZmluZSBhbm90aGVyIHZhcmlhYmxlIGFzIGFuIGFyaXRobWV0aWMgZXhwcmVzc2lvbgorCisgIC54eHggPSA0ICogXCV5ICAgIDsgIj0iIHNpbXBseSBjb3BpZXMgdGhlIHJpZ2h0LWhhbmQgc2lkZS4KKyAgZWNobyBcbSh4eHgpCisgIDQgKiBcJXkKKworICAueHh4IDo9IDQgKiBcJXkgICA7ICI6PSIgZXZhbHVhdGVzIHRoZSB2YXJpYWJsZXMgZmlyc3QsIHRoZW4gY29waWVzLgorICBlY2hvIFxtKHh4eCkKKyAgNCAqICgzICsgMikKKworICAueHh4IDo6PSA0ICogXCV5ICA7ICI6Oj0iIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiwgdGhlbiBjb3BpZXMuCisgIGVjaG8gXG0oeHh4KQorICAyMAorCisgICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgc3ludGF4IHRvIGNsZWFyICh1bmRlZmluZSkgYSB2YXJpYWJsZToKKworICAuXCVhID0gb29mYSAgICAgICA7IERlZmluZSB0aGUgdmFyaWFibGUKKyAgZWNobyAiXCVhIgorICAib29mYSIKKyAgLlwlYSAgICAgICAgICAgICAgOyBDbGVhciB0aGUgdmFyaWFibGUKKyAgZWNobyAiXCVhIgorICAiIgorCisgICBFeHRyYSBjcmVkaXQ6IENhbiB5b3UgZ3Vlc3Mgd2hhdCBoYXBwZW5zIGJlbG93IHdoZW4gdGhlIGZpbGUgImFiYyIKKyAgIGRvZXMgbm90IGV4aXN0PworCisgIGZvcGVuIC9yZWFkIFwlYyBhYmMKKyAgaWYgZmFpbCAuLi4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDcuOS4yLiBOZXcgQXNzaWdubWVudCBDb21tYW5kcworCisgICBSZWNhbGwgdGhlIERFRklORSBhbmQgQVNTSUdOIGNvbW1hbmRzLCBhbmQgdGhlaXIgaGlkZGVuIGNvdW50ZXJwYXJ0cywKKyAgIF9ERUZJTkUgYW5kIF9BU1NJR04uIFRoZSBmb3JtZXIgdGFrZSB0aGUgdmFyaWFibGUgbmFtZSBsaXRlcmFsbHksIHRoZQorICAgbGF0dGVyIGV2YWx1YXRlIHRoZSB2YXJpYWJsZS1uYW1lIGZpZWxkIHRvIGZvcm0gdGhlIHZhcmlhYmxlIG5hbWUKKyAgIGR5bmFtaWNhbGx5LiBFeGFtcGxlczoKKworICBERUZJTkUgXCV4IGZvbyAgICA7IFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBcJXggdG8gImZvbyIuCisgIERFRklORSBcJWEgXCV4ICAgIDsgU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIFwlYSB0byAiXCV4Ii4KKyAgX0RFRklORSB4X1wlYSBcJXggOyBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgeF9mb28gdG8gIlwleCIuCisgIEFTU0lHTiBcJWEgXCV4ICAgIDsgU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIFwlYSB0byB0aGUgImZvbyIuCisgIF9BU1NJR04geF9cJWEgXCV4IDsgU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHhfZm9vIHRvICJmb28iLgorCisgICBUaGlzIGNvbmNlcHQgaGFzIGJlZW4gY2FycmllZCBvdmVyIHRvIHRoZSByZW1haW5pbmcKKyAgIHZhcmlhYmxlLWFzc2lnbm1lbnQgY29tbWFuZHM6IEVWQUxVQVRFLCBJTkNSRU1FTlQsIGFuZCBERUNSRU1FTlQ6CisKKyAgIEVWQUxVQVRFIHZhcmlhYmxlbmFtZSBleHByZXNzaW9uCisgICAgICAgICAgRXZhbHVhdGVzIHRoZSBhcml0aG1ldGljIGV4cHJlc3Npb24gYW5kIGFzc2lnbnMgaXRzIHZhbHVlIHRvCisgICAgICAgICAgdGhlIHZhcmlhYmxlIHdob3NlIG5hbWUgaXMgZ2l2ZW4uIEV4YW1wbGU6ICJldmFsIFwlYSAxKzEiCisgICAgICAgICAgYXNzaWducyAiMiIgdG8gXCVhLgorCisgICBfRVZBTFVBVEUgbWV0YW5hbWUgZXhwcmVzc2lvbgorICAgICAgICAgIEV2YWx1YXRlcyB0aGUgYXJpdGhtZXRpYyBleHByZXNzaW9uIGFuZCBhc3NpZ25zIGl0cyB2YWx1ZSB0bworICAgICAgICAgIHRoZSB2YXJpYWJsZSB3aG9zZSBuYW1lIGlzIGNvbXB1dGVkIGZyb20gdGhlIGdpdmVuIG1ldGFuYW1lLgorICAgICAgICAgIEV4YW1wbGU6ICJldmFsIGZvbzxcJWE+OjpcJTEgXCUyICogKFwlMyArIFwlNCkiIGFzc2lnbnMgdGhlCisgICAgICAgICAgdmFsdWUgb2YgIlwlMiAqIChcJTMgKyBcJTQpIiB0byB0aGUgdmFyaWFibGUgd2hvc2UgbmFtZSBpcworICAgICAgICAgIGNvbXB1dGVkIGZyb20gImZvbzxcJWE+OjpcJTEiLgorCisgICBJTkNSRU1FTlQgdmFyaWFibGVuYW1lIFsgZXhwcmVzc2lvbiBdCisgICAgICAgICAgRXZhbHVhdGVzIHRoZSBhcml0aG1ldGljIGV4cHJlc3Npb24gYW5kIGFkZHMgaXRzIHZhbHVlIHRvIHRoZQorICAgICAgICAgIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB3aG9zZSBuYW1lIGlzIGdpdmVuLiBFeGFtcGxlOiAiaW5jcmVtZW50CisgICAgICAgICAgXCVhIi4KKworICAgX0lOQ1JFTUVOVCBtZXRhbmFtZSBbIGV4cHJlc3Npb24gXQorICAgICAgICAgIEV2YWx1YXRlcyB0aGUgYXJpdGhtZXRpYyBleHByZXNzaW9uIGFuZCBhZGRzIGl0cyB2YWx1ZSB0byB0aGUKKyAgICAgICAgICB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgd2hvc2UgbmFtZSBpcyBjb21wdXRlZCBmcm9tIHRoZSBnaXZlbgorICAgICAgICAgIG1ldGFuYW1lLiBFeGFtcGxlOiAiX2luY3JlbWVudCBXb3Jkczo6XCUxLmNvdW50W1wlMl0iLgorCisgICBERUNSRU1FTlQgdmFyaWFibGVuYW1lIFsgZXhwcmVzc2lvbiBdCisgICAgICAgICAgRXZhbHVhdGVzIHRoZSBhcml0aG1ldGljIGV4cHJlc3Npb24gYW5kIHN1YnRyYWN0cyBpdHMgdmFsdWUKKyAgICAgICAgICBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgd2hvc2UgbmFtZSBpcyBnaXZlbi4KKworICAgX0RFQ1JFTUVOVCBtZXRhbmFtZSBbIGV4cHJlc3Npb24gXQorICAgICAgICAgIEV2YWx1YXRlcyB0aGUgYXJpdGhtZXRpYyBleHByZXNzaW9uIGFuZCBzdWJ0cmFjdHMgaXRzIHZhbHVlCisgICAgICAgICAgZnJvbSB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHdob3NlIG5hbWUgaXMgY29tcHV0ZWQgZnJvbSB0aGUKKyAgICAgICAgICBnaXZlbiBtZXRhbmFtZS4KKworICAgV0FSTklORzogVGhlIHN5bnRheCBvZiB0aGUgRVZBTFVBVEUgY29tbWFuZCBoYXMgY2hhbmdlZCBzaW5jZSBDLUtlcm1pdAorICAgNi4wIGFuZCBLOTUgMS4xLjE3LiBQcmV2aW91c2x5LCBpdCBkaWQgbm90IGluY2x1ZGUgYSB2YXJpYWJsZSBuYW1lLAorICAgb25seSBhbiBleHByZXNzaW9uLiBUbyByZXN0b3JlIHRoZSBvbGQgYmVoYXZpb3IsIHVzZSBTRVQgRVZBTFVBVEUgT0xELgorICAgVG8gcmV0dXJuIHRvIHRoZSBuZXcgYmVoYXZpb3IgYWZ0ZXIgcmVzdG9yaW5nIHRoZSBvbGQgYmVoYXZpb3IsIHVzZQorICAgU0VUIEVWQUxVQVRFIE5FVy4KKworICAgTk9URTogVGhlcmUgYXJlIG5vIGFuYWxvZ3MgdG8gdGhlICJfIiBjb21tYW5kcyBmb3IgdGhlIG9wZXJhdG9ycworICAgZGVzY3JpYmVkIGluIFs1ODhdU2VjdGlvbiA3LjkuMTsgdGhvc2Ugb3BlcmF0b3JzIGNhbiBub3QgYmUgdXNlZCB0bworICAgYXNzaWduIHZhbHVlcyB0byB2YXJpYWJsZXMgd2hvc2UgbmFtZXMgbXVzdCBiZSBjb21wdXRlZC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjEwLiBBcnJheXMKKworICAgQy1LZXJtaXQgNy4wIGFkZHMgbG90cyBvZiBuZXcgYXJyYXktcmVsYXRlZCBmZWF0dXJlcywgYW5kIGdyb3VwcyB0aGVtCisgICB0b2dldGhlciB1bmRlciB0aGUgTkVXIEFSUkFZIGNvbW1hbmQ6CisKKyAgIEFSUkFZIHsgQ0xFQVIsIENPUFksIERFQ0xBUkUsIERFU1RST1ksIFJFU0laRSwgU0hPVywgU09SVCB9CisKKyAgIEluIGVhY2ggb2YgdGhlIEFSUkFZIGNvbW1hbmRzLCB3aGVyZXZlciBhbiBhcnJheSBuYW1lIGlzIGV4cGVjdGVkLAorICAgInNob3J0IGZvcm1zIiBtYXkgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFyZQorICAgYWNjZXB0YWJsZToKKworICBhcnJheSBzaG93IFwmYVtdICAob3IgU0hPVyBBUlJBWS4uLikKKyAgYXJyYXkgc2hvdyAmYVtdCisgIGFycmF5IHNob3cgYVtdCisgIGFycmF5IHNob3cgJmEKKyAgYXJyYXkgc2hvdyBhCisKKyAgIEluIGFkZGl0aW9uLCByYW5nZXMgYXJlIGFjY2VwdGVkIGluIHRoZSBBUlJBWSBDT1BZLCBBUlJBWSBDTEVBUiwgQVJSQVkKKyAgIFNFVCwgQVJSQVkgU0hPVywgYW5kIEFSUkFZIFNPUlQgY29tbWFuZHM6CisKKyAgYXJyYXkgY2xlYXIgXCZhWzE2XSAgICAgOyBDbGVhcnMgMTYgdGhydSBlbmQKKyAgYXJyYXkgY2xlYXIgJmFbMTZdICAgICAgOyBEaXR0bworICBhcnJheSBjbGVhciBhWzE2XSAgICAgICA7IERpdHRvCisKKyAgYXJyYXkgY2xlYXIgXCZhWzE2OjMyXSAgOyBDbGVhcnMgMTYgdGhydSAzMgorICBhcnJheSBjbGVhciAmYVsxNjozMl0gICA7IERpdHRvCisgIGFycmF5IGNsZWFyIGFbMTY6MzJdICAgIDsgRGl0dG8KKworICAgV2hlbiB1c2luZyBhcnJheSBuYW1lcyBhcyBmdW5jdGlvbiBhcmd1bWVudHMsIHlvdSBtdXN0IG9taXQgdGhlICJcIgorICAgYW5kIHlvdSBtdXN0IGluY2x1ZGUgdGhlICImIi4gWW91IG1heSBvcHRpb25hbGx5IGluY2x1ZGUgZW1wdHkKKyAgIGJyYWNrZXRzLiBFeGFtcGxlczoKKworICBcZnNwbGl0KFwlYSxhKSAgICAgICAgICA7IEJhZAorICBcZnNwbGl0KFwlYSxcJmEpICAgICAgICA7IEJhZAorICBcZnNwbGl0KFwlYSwmYVszXSkgICAgICA7IEJhZAorCisgIFxmc3BsaXQoXCVhLCZhKSAgICAgICAgIDsgR29vZAorICBcZnNwbGl0KFwlYSwmYVtdKSAgICAgICA7IEdvb2QKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDcuMTAuMS4gQXJyYXkgSW5pdGlhbGl6ZXJzCisKKyAgIEJlZ2lubmluZyBpbiBDLUtlcm1pdCA3LjAsIHlvdSBtYXkgaW5pdGlhbGl6ZSBhbiBhcnJheSAtLSBpbiB3aG9sZSBvcgorICAgaW4gcGFydCAtLSBpbiBpdHMgZGVjbGFyYXRpb246CisKKyAgIFsgQVJSQVkgXSBERUNMQVJFIGFycmF5LW5hbWVbc2l6ZV0gWyA9IF0gWyB2YWx1ZTEgWyB2YWx1ZTIgWy4uLl0gXSBdCisKKyAgIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgNUEgYW5kIDYuMCwgdGhlIEFSUkFZIGtleXdvcmQgaXMKKyAgIG9wdGlvbmFsLiBERUNMQVJFIGNhbiBhbHNvIGJlIHNwZWxsZWQgRENMLgorCisgICBJbml0aWFsaXplcnMgYXJlIChhKSBvcHRpb25hbCwgKGIpIHN0YXJ0IHdpdGggZWxlbWVudCAxLCAoYykgbXVzdCBiZQorICAgZW5jbG9zZWQgaW4gYnJhY2VzIGlmIHRoZXkgY29udGFpbiBzcGFjZXMsIGFuZCAoZCkgYXJlIGV2YWx1YXRlZAorICAgYWNjb3JkaW5nIHRvIG5vcm1hbCBydWxlcyBieSB0aGUgREVDTEFSRSBjb21tYW5kIHByaW9yIHRvIGFzc2lnbm1lbnQuCisgICBUaHVzIHRoZSBhc3NpZ25tZW50cyBtYWRlIGhlcmUgYXJlIHRoZSBzYW1lIGFzIHRob3NlIG1hZGUgYnkgdGhlCisgICBBU1NJR04gY29tbWFuZC4gVGhpcyBhbGxvd3MgeW91IHRvIGluaXRpYWxpemUgYXJyYXkgZWxlbWVudHMgZnJvbSB0aGUKKyAgIHZhbHVlcyBvZiBvdGhlciB2YXJpYWJsZXMuIElmIHlvdSBhY3R1YWxseSB3YW50IHRvIGluaXRpYWxpemUgYW4gYXJyYXkKKyAgIGVsZW1lbnQgdG8gdmFyaWFibGUncyBuYW1lLCBhcyBvcHBvc2VkIHRvIGl0cyB2YWx1ZSwgdXNlIGRvdWJsZQorICAgYmFja3NsYXNoZXMgKGFzIGluICJcXCZhIiwgIlxcdih0aW1lKSIsIGV0YykuCisKKyAgIFRoZSBzaXplIChkaW1lbnNpb24pIG9mIHRoZSBhcnJheSBpcyBvcHRpb25hbC4gSWYgdGhlIHNpemUgaXMgb21pdHRlZCwKKyAgIGFzIGluICJcJmFbXSIsIHRoZW4gdGhlIGFycmF5IHNpemVzIGl0c2VsZiB0byB0aGUgbnVtYmVyIG9mCisgICBpbml0aWFsaXplcnM7IGlmIHRoZXJlIGFyZSBubyBpbml0aWFsaXplcnMgdGhlIGFycmF5IGlzIG5vdCBkZWNsYXJlZAorICAgb3IsIGlmIGl0IHdhcyBkZWNsYXJlZCBwcmV2aW91c2x5LCBpdCBpcyBkZXN0cm95ZWQuIElmIGEgc2l6ZSBpcworICAgZ2l2ZW4sIGFueSBleHRyYSBlbGVtZW50cyBpbiB0aGUgaW5pdGlhbGl6YXRpb24gbGlzdCBhcmUgZGlzY2FyZGVkIGFuZAorICAgaWdub3JlZC4KKworICAgTk9URTogVW5saWtlIGluIEMsIHRoZSBsaXN0IG9mIGluaXRpYWxpemVycyBpcyBOT1QgZW5jbG9zZWQgaW4gYnJhY2VzLgorICAgSW5zdGVhZCwgYnJhY2VzIGFyZSB1c2VkIHRvIGdyb3VwIG11bHRpcGxlIHdvcmRzIHRvZ2V0aGVyLiBTbzoKKworICBBUlJBWSBERUNMQVJFIFwmYVtdID0geyBvbmUgdHdvIHRocmVlIH0KKworICAgd291bGQgY3JlYXRlIGFuIGFycmF5IHdpdGggdHdvIGVsZW1lbnRzICgwIGFuZCAxKSwgd2l0aCBlbGVtZW50IDEKKyAgIGhhdmluZyB0aGUgdmFsdWUgIiBvbmUgdHdvIHRocmVlICIuCisKKyAgIEV4YW1wbGVzOgorCisgICBBUlJBWSBERUNMQVJFIFwmYVsxNl0KKyAgICAgICAgICBEZWNsYXJlcyB0aGUgYXJyYXkgXCZhIHdpdGggMTcgZWxlbWVudHMgKDAgdGhyb3VnaCAxNiksIGluCisgICAgICAgICAgd2hpY2ggYWxsIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgZW1wdHkuIElmIHRoZSBhcnJheSBcJmFbXQorICAgICAgICAgIGV4aXN0ZWQgYmVmb3JlLCB0aGUgZWFybGllciBjb3B5IGlzIGRlc3Ryb3llZC4KKworICAgQVJSQVkgREVDTEFSRSAmYVsxNl0KKyAgIEFSUkFZIERFQ0xBUkUgYVsxNl0KKyAgIEFSUkFZIERDTCBcJmFbMTZdCisgICBBUlJBWSBEQ0wgJmFbMTZdCisgICBBUlJBWSBEQ0wgYVsxNl0KKyAgIERFQ0xBUkUgXCZhWzE2XQorICAgREVDTEFSRSAmYVsxNl0KKyAgIERFQ0xBUkUgYVsxNl0KKyAgIERDTCBcJmFbMTZdCisgICBEQ0wgJmFbMTZdCisgICBEQ0wgYVsxNl0KKyAgICAgICAgICBBbGwgb2YgdGhlIGFib3ZlIGFyZSB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgZXhhbXBsZS4KKworICAgQVJSQVkgREVDTEFSRSBcJmFbMTZdID0gYWxwaGEgYmV0YSB7Z2FtbWEgZGVsdGF9CisgICAgICAgICAgRGVjbGFyZXMgdGhlIGFycmF5IFwmYSB3aXRoIDE3IGVsZW1lbnRzICgwIHRocm91Z2ggMTYpLAorICAgICAgICAgIGluaXRpYWxpemluZyBcJmFbMV0gdG8gImFscGhhIiwgXCZhWzJdIHRvICJiZXRhIiwgYW5kIFwmYVszXSB0bworICAgICAgICAgICJnYW1tYSBkZWx0YSIuIFRoZSByZW1haW5pbmcgZWxlbWVudHMgYXJlIGVtcHR5LgorCisgICBBUlJBWSBERUNMQVJFIFwmYVtdID0gYWxwaGEgYmV0YSB7Z2FtbWEgZGVsdGF9CisgICAgICAgICAgU2FtZSBhcyB0aGUgcHJldmlvdXMgZXhhbXBsZSwgYnV0IHRoZSBhcnJheSBpcyBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgZGltZW5zaW9uZWQgdG8gMy4KKworICAgQVJSQVkgREVDTEFSRSBcJmFbM10gPSBhbHBoYSBiZXRhIHtnYW1tYSBkZWx0YX0gZXBzaWxvbiB6ZXRhCisgICAgICAgICAgVG9vIG1hbnkgaW5pdGlhbGl6ZXJzOyBvbmx5IHRoZSBmaXJzdCB0aHJlZSBhcmUga2VwdC4KKworICAgQVJSQVkgREVDTEFSRSBcJmFbMF0KKyAgIEFSUkFZIERFQ0xBUkUgXCZhW10KKyAgIEFSUkFZIERFQ0xBUkUgJmFbXQorICAgQVJSQVkgREVDTEFSRSAmYQorICAgQVJSQVkgREVDTEFSRSBhCisgICBERUNMQVJFIFwmWzBdCisgICBERUNMQVJFIGEKKyAgIERDTCBhCisgICAgICAgICAgQWxsIG9mIHRoZXNlIGFyZSBlcXVpdmFsZW50LiBFYWNoIGRlc3Ryb3lzIFwmYVtdIGlmIGl0IGV4aXN0cy4KKyAgICAgICAgICBEZWNsYXJpbmcgYW4gYXJyYXkgd2l0aCBhIGRpbWVuc2lvbiBvZiAwIGlzIHRoZSBzYW1lIGFzIEFSUkFZCisgICAgICAgICAgREVTVFJPWSBhcnJheW5hbWUuCisKKyAgIEFSUkFZIERFQ0xBUkUgXCZhW10gPSBcJTEgXCUyIFwlMworICAgICAgICAgIERlY2xhcmVzIHRoZSBhcnJheSBcJmEgd2l0aCAzIGVsZW1lbnRzICgwIHRocm91Z2ggMyksCisgICAgICAgICAgaW5pdGlhbGl6aW5nIFwmYVsxXSB0byB0aGUgdmFsdWUgb2YgXCUxLCBcJmFbMl0gdG8gdGhlIHZhbHVlIG9mCisgICAgICAgICAgXCUyLCBhbmQgXCZhWzNdIHRvIHRoZSB2YWx1ZSBvZiBcJTMuIEluIHRoaXMgY2FzZSwgYW55CisgICAgICAgICAgcmVmZXJlbmNlIHRvIG9uZSBvZiB0aGVzZSBhcnJheSBlbGVtZW50cyBpcyByZXBsYWNlZCBieSB0aGUKKyAgICAgICAgICB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBcJW4gdmFyaWFibGUgYXQgdGhlIHRpbWUgdGhlCisgICAgICAgICAgZGVjbGFyYXRpb24gd2FzIGV4ZWN1dGVkIChpbW1lZGlhdGUgZXZhbHVhdGlvbjsgdGhlIGFycmF5CisgICAgICAgICAgZWxlbWVudCdzIHZhbHVlIGRvZXMgbm90IGNoYW5nZSBpZiB0aGUgaW5pdGlhbGl6ZXIgdmFyaWFibGUncworICAgICAgICAgIHZhbHVlIGNoYW5nZXMpLgorCisgICBBUlJBWSBERUNMQVJFIFwmYVtdID0gXFwlMSBcXCUyIFxcJTMKKyAgICAgICAgICBEZWNsYXJlcyB0aGUgYXJyYXkgXCZhIHdpdGggMyBlbGVtZW50cyAoMCB0aHJvdWdoIDMpLAorICAgICAgICAgIGluaXRpYWxpemluZyBcJmFbMV0gdG8gdGhlIHN0cmluZyAiXCUxIiwgXCZhWzJdIHRvICJcJTIiLCBhbmQKKyAgICAgICAgICBcJmFbM10gdG8gIlwlMyIuIEluIHRoaXMgY2FzZSBhbnkgcmVmZXJlbmNlIHRvIG9uZSBvZiB0aGVzZQorICAgICAgICAgIGFycmF5IGVsZW1lbnRzIGlzIHJlcGxhY2VkIGJ5IHRoZSBDVVJSRU5UIHZhbHVlIG9mIHRoZQorICAgICAgICAgIGNvcnJlc3BvbmRpbmcgXCVuIHZhcmlhYmxlIChkZWZlcnJlZCBldmFsdWF0aW9uIC0tIHRoZSBhcnJheQorICAgICAgICAgIGVsZW1lbnQncyB2YWx1ZSBmb2xsb3dzIHRoZSB2YWx1ZSBvZiB0aGUgaW5pdGlhbGl6ZXIgdmFyaWFibGUpLgorCisgICBUaGUgZXF1YWwgc2lnbiAoPSkgcHJlY2VkaW5nIHRoZSBpbml0aWFsaXplciBsaXN0IGlzIG9wdGlvbmFsLCBidXQgaXMKKyAgIHJlY29tbWVuZGVkIGZvciBjbGFyaXR5LiBJZiB5b3UgbmVlZCB0byBpbml0aWFsaXplIGVsZW1lbnQgMSB0byBhCisgICBsaXRlcmFsIGVxdWFsIHNpZ24sIHVzZSB0d28gb2YgdGhlbSwgc2VwYXJhdGVkIGJ5IGEgc3BhY2UsIGFzIGluIHRoaXMKKyAgIGV4YW1wbGU6CisKKyAgQVJSQVkgREVDTEFSRSBcJmFbXSA9ID0gKyAtICogLworCisgICBSZW1lbWJlciwgZWxlbWVudCAwIGlzIG5vdCBpbml0aWFsaXplZCBieSB0aGUgREVDTEFSRSBjb21tYW5kLiBUbworICAgaW5pdGlhbGl6ZSBlbGVtZW50IDAsIHVzZSBhIHJlZ3VsYXIgREVGSU5FIG9yIEFTU0lHTiBjb21tYW5kOgorCisgIEFSUkFZIERFQ0xBUkUgXCZhW10gb25lIHR3byB0aHJlZSBmb3VyIGZpdmUgc2l4IHNldmVuIGVpZ2h0IG5pbmUKKyAgREVGSU5FIFwmYVswXSB6ZXJvCisKKyAgIEZpbmFsbHksIHJlbWVtYmVyIHRoYXQgZXZlcnkgY29tbWFuZCBsZXZlbCBoYXMgaXRzIG93biBsb2NhbCBhcnJheSwKKyAgIFwmX1tdLCBjb250YWluaW5nIGFsbCB0aGUgbWFjcm8gYXJndW1lbnRzIChcJTAsIFwlMSwgLi4uKSBmb3IgdGhhdAorICAgbGV2ZWwuIFNlZSBbNTg5XVNlY3Rpb24gNy41IGZvciBkZXRhaWxzLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNy4xMC4yLiBUdXJuaW5nIGEgU3RyaW5nIGludG8gYW4gQXJyYXkgb2YgV29yZHMKKworICAgVGhlIFxmc3BsaXQoczEsJmEsczIsczMpIGZ1bmN0aW9uIGFzc2lnbnMgdGhlIHdvcmRzIG9mIHN0cmluZyBzMSB0bworICAgc3VjY2Vzc2l2ZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgKGJlZ2lubmluZyB3aXRoIGVsZW1lbnQgMSkgd2hvc2UKKyAgIGlkZW50aWZ5aW5nIGxldHRlciwgYS16LCBpcyBnaXZlbiBhZnRlciB0aGUgIiYiIGluIHRoZSBzZWNvbmQKKyAgIGFyZ3VtZW50LCB1c2luZyBicmVhayBhbmQgaW5jbHVkZSBjaGFyYWN0ZXJzIGdpdmVuIGluIHMyIGFuZCBzMy4gU2VlCisgICBbNTkwXVNlY3Rpb24gNy4zIGZvciBkZXRhaWxzLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNy4xMC4zLiBBcnJheXMgb2YgRmlsZW5hbWVzCisKKyAgIFNlZSBbNTkxXVNlY3Rpb24gNC4xMS4zIGZvciBuZXdzIGFib3V0IGhvdyBcZmZpbGVzKCkgYW5kIHJlbGF0ZWQKKyAgIGZ1bmN0aW9ucyBjYW4gYXNzaWduIGEgbGlzdCBvZiBmaWxlbmFtZXMgdG8gYW4gYXJyYXkuIFRvIHJlY2FwaXR1bGF0ZQorICAgYnJpZWZseSBoZXJlOgorCisgIFxmZmlsZXMoKiwmYSkKKworICAgYXNzaWducyBhbGwgZmlsZXMgdGhhdCBtYXRjaCB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGFycmF5IGRlbm90ZWQKKyAgIGJ5IHRoZSBzZWNvbmQgYXJndW1lbnQuIElmIHRoZSBhcnJheSBoYXMgbm90IGJlZW4gZGVjbGFyZWQsIGl0IGlzCisgICBkZWNsYXJlZCBhdXRvbWF0aWNhbGx5LCB3aXRoIGV4YWN0bHkgdGhlIG51bWJlciBvZiBlbGVtZW50cyBuZWVkZWQgdG8KKyAgIGhvbGQgdGhlIGZpbGUgbGlzdDsgaWYgaXQgd2FzIHByZXZpb3VzbHkgZGVjbGFyZWQsIGl0IGlzIGRlc3Ryb3llZCBhbmQKKyAgIHJldXNlZC4gVGhlIGZpbGVuYW1lcyBhcmUgYXNzaWduZWQgc3RhcnRpbmcgYXQgYXJyYXkgZWxlbWVudCAxLgorICAgRWxlbWVudCAwIGhvbGRzIHRoZSBudW1iZXIgb2YgZmlsZXMgaW4gdGhlIGxpc3QuCisKKyAgIFRoZSBESVJFQ1RPUlkgY29tbWFuZCAoWzU5Ml1TZWN0aW9uIDQuNS4xKSBjYW4gYWxzbyBjcmVhdGUgZmlsZW5hbWUKKyAgIGFycmF5cyBpZiB5b3UgZ2l2ZSBpdCB0aGUgL0FSUkFZOiBzd2l0Y2g7IHRoaXMgYWxsb3dzIHNlbGVjdGlvbgorICAgY3JpdGVyaWEgYmV5b25kIHdoZXRoZXIgdGhlIGZpbGVuYW1lIG1hdGNoZXMgdGhlIGdpdmVuIHBhdHRlcm4uCisKKyAgIEFsbCBmdW5jdGlvbnMgYW5kIGNvbW1hbmRzIHRoYXQgY3JlYXRlIGZpbGVuYW1lIGFycmF5cyBzdG9yZSB0aGUKKyAgIG51bWJlciBvZiBmaWxlbmFtZXMsIG4sIGFzIGVsZW1lbnQgMCBvZiB0aGUgYXJyYXksIGFuZCB0aGUgZmlsZW5hbWVzCisgICBhcyBlbGVtZW50cyAxIHRocm91Z2ggbi4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDcuMTAuNC4gQXV0b21hdGljIEFycmF5cworCisgICBJbiBhIGNvbW1hbmQgZmlsZSBvciBtYWNybywgeW91IGNhbiBub3cgaGF2ZSBsb2NhbCAoYXV0b21hdGljKSBhcnJheXMuCisgICBKdXN0IGdpdmUgdGhlIG5hbWUgZm9sbG93ZWQgYnkgZW1wdHkgc3Vic2NyaXB0IGJyYWNrZXRzIChubyBzcGFjZXMKKyAgIGluc2lkZSB0aGUgYnJhY2tldHMgcGxlYXNlKSBpbiBhIExPQ0FMIGNvbW1hbmQsIGFuZCB0aGVuIGRlY2xhcmUgdGhlCisgICBhcnJheToKKworICBMT0NBTCBcJWEgXCZhW10gb29mYQorICBBUlJBWSBERUNMQVJFIFwmYVszMl0gPSB2YWx1ZTEgdmFsdWUyIHZhbHVlMyAuLi4KKworICAgVGhpcyBkZWNsYXJlcyB0aGUgc2NhbGFyIHZhcmlhYmxlIFwlYSwgdGhlIGFycmF5IFwmYVtdLCBhbmQgdGhlIG1hY3JvCisgICBuYW1lICJvb2ZhIiB0byBiZSBsb2NhbCwgYW5kIHRoZW4gZGVjbGFyZXMgdGhlIG5ldyBsb2NhbCBjb3B5IG9mIFwmYVtdCisgICB3aXRoIDMyIGVsZW1lbnRzLCBwZXJoYXBzIGFzc2lnbmluZyBzb21lIGluaXRpYWwgdmFsdWVzLiBXaGVuIEMtS2VybWl0CisgICBleGl0cyBmcm9tIHRoZSBjb21tYW5kIGZpbGUgb3IgbWFjcm8gY29udGFpbmluZyB0aGVzZSBjb21tYW5kLCB0aGUKKyAgIHByZXZpb3VzIFwmYVtdIGFycmF5IGlzIHJlc3RvcmVkIChhbmQgaWYgdGhlcmUgd2FzIG5vIFwmYVtdIGF0IGFueQorICAgaGlnaGVyIGxldmVsLCB0aGlzIHdpbGwgc3RpbGwgYmUgdHJ1ZSkuIFRoZSBwcm9jZXNzIGNhbiBiZSByZXBlYXRlZCB0bworICAgYW55IGxldmVsLiBUaHVzIGl0IGlzIG5vdyBzYWZlIHRvIHdyaXRlIHNjcmlwdHMgb3IgbWFjcm9zIGNvbnRhaW5pbmcKKyAgIGFycmF5cyB3aXRob3V0IGRhbmdlciBvZiBpbnRlcmZlcmluZyB3aXRoIGdsb2JhbCBhcnJheXMgb2YgdGhlIHNhbWUKKyAgIG5hbWUuCisKKyAgIEp1c3QgYXMgc2NhbGFycyBhcmUgaW5oZXJpdGVkIGJ5IGxvd2VyIGNvbW1hbmQgbGV2ZWxzLCBzbyBhcmUgYXJyYXlzLgorICAgU28sIGZvciBleGFtcGxlLCBpZiBcJmFbXSBpcyBkZWNsYXJlZCBhdCB0b3AgbGV2ZWwsIGFsbCBsb3dlciBsZXZlbHMKKyAgIHdpbGwgc2VlIGl0IHVubGVzcyB0aGV5IGluY2x1ZGUgYSAibG9jYWwgXCZhW10iIHN0YXRlbWVudCwgaW4gd2hpY2gKKyAgIGNhc2UgYWxsIGxldmVscyBhdCBhbmQgYmVuZWF0aCB0aGUgbGV2ZWwgd2hlcmUgdGhlIExPQ0FMIHN0YXRlbWVudCB3YXMKKyAgIGV4ZWN1dGVkIHdpbGwgc2VlIHRoZSBsb2NhbCBjb3B5LiBUaGlzIHRvbyBjYW4gYmUgcmVwZWF0ZWQgdG8gYW55CisgICBsZXZlbC4KKworICAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBERUNMQVJFIGFuIGFycmF5IGF0IGEgbG93ZXIgY29tbWFuZCBsZXZlbAorICAgd2l0aG91dCBhbHNvIG1ha2luZyBpdCBMT0NBTCwgdGhpcyByZXBsYWNlcyB0aGUgY29weSB0aGF0IHdhcyBkZWNsYXJlZAorICAgYXQgdGhlIGxvd2VzdCBjb21tYW5kIGxldmVsIGFib3ZlIHRoaXMgb25lLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNy4xMC41LiBTb3J0aW5nIEFycmF5cworCisgICBBbHRob3VnaCBhcnJheXMgY2FuIGJlIHNvcnRlZCB1c2luZyBGT1IgbG9vcHMgYXMgc2hvd24gb24gcGFnZSAzODMgb2YKKyAgIFVzaW5nIEMtS2VybWl0LCAybmQgRWQuLCB0aGlzIGludm9sdmVzIHF1aXRlIGEgYml0IG9mIHJlcGV0aXRpdmUKKyAgIGludGVycHJldGF0aW9uIGJ5IHRoZSBjb21tYW5kIHBhcnNlciwgYW5kIHNvIGNhbiBiZSBzbG93IGZvciBsYXJnZQorICAgYXJyYXlzLiBGb3IgdGhpcyByZWFzb24sIEMtS2VybWl0IDcuMCBhZGRzIGEgYnVpbHQtaW4gU09SVCBjb21tYW5kOgorCisgICBBUlJBWSBTT1JUIFsgc3dpdGNoZXMgXSBhcnJheSBbIGFycmF5MiBdCisgICAgICAgICAgU29ydHMgdGhlIGdpdmVuIGFycmF5IGluIHBsYWNlLiBTb3J0aW5nIGlzIHN0cmljdGx5IGxleGljYWwKKyAgICAgICAgICAoc3RyaW5nIGJhc2VkKS4gVGhlIGFycmF5IG5hbWUgY2FuIGJlIGdpdmVuIGZ1bGx5LCBlLmcuCisgICAgICAgICAgIlwmYVtdIiwgb3IgdGhlICJcIiBhbmQvb3IgIiYiIGFuZC9vciBicmFja2V0cyBjYW4gYmUgb21pdHRlZCwKKyAgICAgICAgICBlLmcuICJhcnJheSBzb3J0IFwmYVtdIiwgInNvcnQgJmEiLCAic29ydCBhIi4gQWxzbywgYSByYW5nZSBjYW4KKyAgICAgICAgICBiZSBpbmRpY2F0ZWQgaW4gdGhlIGJyYWNrZXRzIGFzIG5vdGVkIGluIFs1OTNdU2VjdGlvbiA3LjEwLCB0bworICAgICAgICAgIHJlc3RyaWN0IHRoZSBzb3J0IHRvIGEgcmFuZ2Ugb2YgZWxlbWVudHMgKGVxdWl2YWxlbnQgdG8gdGhlCisgICAgICAgICAgL1JBTkdFIHN3aXRjaCwgZGVzY3JpYmVkIGp1c3QgYmVsb3cpLCBlLmcuICJhcnJheSBzb3J0CisgICAgICAgICAgJmFbMjA6MzBdIi4KKworICAgQSBzZWNvbmQgYXJyYXkgbWF5IGJlIHNwZWNpZmllZC4gSWYgaXQgaXMsIGFuZCBpZiBpdCBpcyBhdCBsZWFzdCBhcworICAgYmlnIGFzIHRoZSBmaXJzdCBhcnJheSwgaXQgaXMgc29ydGVkIGFjY29yZGluZyB0byB0aGUgZmlyc3QgYXJyYXkuIEZvcgorICAgYSBzYW1wbGUgYXBwbGljYXRpb24sIHNlZSBbNTk0XVNlY3Rpb24gNy4xMC4xMC4KKworICAgU2VlIFs1OTVdU2VjdGlvbiAxLjUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHN3aXRjaGVzLiBUaGUgb3B0aW9uYWwKKyAgIHN3aXRjaGVzIGFyZToKKworICAgL0NBU0U6e09OLE9GRn0KKyAgICAgICAgICAvQ0FTRTpPTiBtZWFucyB0aGF0IGFscGhhYmV0aWMgY2FzZSBpcyBzaWduaWZpY2FudCBpbgorICAgICAgICAgIGNvbXBhcmlzb25zOyB1cHBlcmNhc2UgbGV0dGVycyBhcmUgc29ydGVkIGJlZm9yZSBsb3dlcmNhc2UKKyAgICAgICAgICBvbmVzLiAvQ0FTRTpPRkYgbWVhbnMgY2FzZSBpcyBpZ25vcmVkLCBlLmcuICJBIiBpcyB0aGUgc2FtZSBhcworICAgICAgICAgICJhIi4gSWYgdGhpcyBzd2l0Y2ggaXMgbm90IGdpdmVuLCBzb3J0aW5nIGlzIGFjY29yZGluZyB0aGUKKyAgICAgICAgICBjdXJyZW50IFNFVCBDQVNFIHNldHRpbmcuCisKKyAgIC9LRVk6bgorICAgICAgICAgIENvbXBhcmlzb24gYmVnaW5zIGF0IHBvc2l0aW9uIG4oMS1iYXNlZCkgaW4gZWFjaCBzdHJpbmcuIElmIG5vCisgICAgICAgICAga2V5IGlzIGdpdmVuLCB0aGUgZW50aXJlIHN0cmluZ3MgYXJlIGNvbXBhcmVkLiBPbmx5IG9uZSBrZXkgY2FuCisgICAgICAgICAgYmUgZ2l2ZW4uIElmIGFuIGFycmF5IGVsZW1lbnQgaXMgc2hvcnRlciB0aGFuIHRoZSBrZXkgdmFsdWUsIG4sCisgICAgICAgICAgdGhhdCBlbGVtZW50IGlzIGNvbnNpZGVyZWQgZW1wdHkgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMsIGFuZAorICAgICAgICAgIHRoZXJlZm9yZSBsZXhpY2FsbHkgbGVzcyB0aGFuIGFueSBlbGVtZW50IGF0IGxlYXN0IG5jaGFyYWN0ZXJzCisgICAgICAgICAgbG9uZy4KKworICAgL05VTUVSSUMKKyAgICAgICAgICBJZiB0aGlzIHN3aXRjaCBpcyBpbmNsdWRlZCwgaXQgbWVhbnMgc29ydGluZyBzaG91bGQgYmUgbnVtZXJpYywKKyAgICAgICAgICByYXRoZXIgdGhhbiBsZXhpY2FsLiBUaGUgc29ydCBrZXkgaXMgdGhlIHN0cmluZyBzdGFydGluZyBhdCB0aGUKKyAgICAgICAgICBrZXkgcG9zaXRpb24sIHNraXBwaW5nIGFueSBsZWFkaW5nIGJsYW5rcyBvciB0YWJzLCBhbmQgdGhlbiBhcworICAgICAgICAgIG11Y2ggb2YgdGhlIHN0cmluZyBmcm9tIHRoYXQgcG9pbnQgb24gdGhhdCBmaXRzIHRoZSBkZWZpbml0aW9uCisgICAgICAgICAgb2YgIm51bWVyaWMiLCB0ZXJtaW5hdGluZyBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIHRoYXQgZG9lcyBub3QKKyAgICAgICAgICBxdWFsaWZ5LiBBIG51bWVyaWMgc3RyaW5nIGhhcyBhbiBvcHRpb25hbCBzaWduICgrIG9yIC0pCisgICAgICAgICAgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZGlnaXRzLCBhbmQgKGlmIHlvdXIgdmVyc2lvbiBvZiBLZXJtaXQKKyAgICAgICAgICB3YXMgYnVpbHQgd2l0aCBmbG9hdGluZy1wb2ludCBzdXBwb3J0OyBzZWUgWzU5Nl1TZWN0aW9uIDcuMjMgKQorICAgICAgICAgIHplcm8gb3Igb25lIGRlY2ltYWwgcG9pbnQgKHBlcmlvZCkuIElmIGJvdGggL0NBU0UgYW5kIC9OVU1FUklDCisgICAgICAgICAgYXJlIGdpdmVuLCAvTlVNRVJJQyB0YWtlcyBwcmVjZWRlbmNlLgorCisgICAvUkFOR0U6bls6bV0KKyAgICAgICAgICBTb3J0IGVsZW1lbnRzIG50aHJvdWdoIG0gb2YgdGhlIGFycmF5LiBCeSBkZWZhdWx0LCB0aGUgZW50aXJlCisgICAgICAgICAgYXJyYXkgZnJvbSBlbGVtZW50IDEgdG8gaXRzIGRpbWVuc2lvbmVkIHNpemUgaXMgc29ydGVkLCB3aGljaAorICAgICAgICAgIG1pZ2h0IHByb2R1Y2Ugc3VycHJpc2luZyByZXN1bHRzIGlmIHRoZSBhcnJheSBpcyBub3QgZnVsbDsgc2VlCisgICAgICAgICAgZXhhbXBsZSBpbiBbNTk3XVNlY3Rpb24gNy4xMC43LiBJZiAiOm0iIGlzIG9taXR0ZWQgZnJvbSB0aGUKKyAgICAgICAgICByYW5nZSwgdGhlIGRpbWVuc2lvbmVkIHNpemUgaXMgdXNlZC4gVGh1cywgdG8gc29ydCBhbiBlbnRpcmUKKyAgICAgICAgICBhcnJheSwgXCZhW10sIGluY2x1ZGluZyBpdHMgMHRoIGVsZW1lbnQsIHVzZSAic29ydCAvcmFuZ2U6MAorICAgICAgICAgICZhIi4gWW91IGNhbiBhbHNvIHNvcnQgYW55IGRlc2lyZWQgc2VjdGlvbiBvZiBhbiBhcnJheSwgZS5nLgorICAgICAgICAgICJzb3J0IC9yYW5nZToxMDoyMCAmYSIgb3IgInNvcnQgL3JhbmdlOlwlaTpcJWotMSAmYiIuIEFzIG5vdGVkCisgICAgICAgICAgYWJvdmUsIHlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgcmFuZ2UgaW4gdGhlIGFycmF5LW5hbWUgYnJhY2tldHMuCisgICAgICAgICAgSWYgeW91IHNwZWNpZnkgYSByYW5nZSBpbiB0aGUgYXJyYXktbmFtZSBicmFja2V0cyBBTkQgd2l0aCBhCisgICAgICAgICAgL1JBTkdFIHN3aXRjaCwgdGhlIG9uZXMgaW4gdGhlIGJyYWNrZXRzIHRha2UgcHJlY2VkZW5jZS4KKworICAgL1JFVkVSU0UKKyAgICAgICAgICBTb3J0IGluIHJldmVyc2Ugb3JkZXIuIElmIHRoaXMgc3dpdGNoIGlzIG5vdCBnaXZlbiwgdGhlIGFycmF5CisgICAgICAgICAgaXMgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4KKworICAgUmVtZW1iZXIgdGhhdCBudW1lcmljIHN3aXRjaCBhcmd1bWVudHMgY2FuIGJlIG51bWJlcnMsIGFyaXRobWV0aWMKKyAgIGV4cHJlc3Npb25zLCBvciB2YXJpYWJsZXMgd2hvc2UgdmFsdWVzIGFyZSBudW1iZXJzIG9yIGV4cHJlc3Npb25zLCBhcworICAgaWxsdXN0cmF0ZWQgaW4gdGhlIC9SQU5HRSBleGFtcGxlcyBhYm92ZS4KKworICAgQSB0eXBpY2FsIHNvcnRpbmcgYXBwbGljYXRpb24gbWlnaHQgYmUgdG8gbGlzdCBzdHVkZW50cycgdGVzdCBzY29yZXMKKyAgIGluIGRlc2NlbmRpbmcgb3JkZXIuIFN1cHBvc2UgeW91IGhhZCB0aGUgZm9sbG93aW5nIHJlY29yZHM6CisKKyAgb2xhZiAgICAgIDY1CisgIG9sZ2EgICAgICA5OAorICBpdmFuICAgICAgODMKKyAgeGVuYSAgICAgMTAwCisKKyAgIChhbmQgc28gb24pIHN0b3JlZCBpbiBhcnJheSBcJnNbXSAoZS5nLiBieSByZWFkaW5nIHRoZW0gZnJvbSBhIGZpbGUgYXMKKyAgIGlsbHVzdHJhdGVkIGluIFs1OThdc2VjdGlvbiA3LjEwLjcpLiBJbiB0aGVzZSByZWNvcmRzLCB0aGUgc3R1ZGVudCdzCisgICBuYW1lIGlzIGluIGNvbHVtbnMgMS05IGFuZCB0aGUgc2NvcmUgaW4gMTAtMTIuIFNvIHRvIHJlYXJyYW5nZSB0aGUKKyAgIGxpc3QgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBzY29yZToKKworICBzb3J0IC9rZXk6MTAgL3JldmVyc2UgJnMKKworICAgVGhlbiB0byBsaXN0IHlvdXIgdG9wIGZpdmUgc3R1ZGVudHM6CisKKyAgZm9yIFwlaSAxIDUgMSB7IGVjaG8gXCZzW1wlaV0gfQorCisgICBPciBtb3JlIHNpbXBseSAoc2VlIG5leHQgc2VjdGlvbik6CisKKyAgc2hvdyBhcnJheSBhWzE6NV0KKworICAgVG8gaWxsdXN0cmF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgbGV4aWNhbCBhbmQgYSBudW1lcmljIHNvcnQsCisgICBzdXBwb3NlIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgcmVjb3JkcyAodGhlIGxpbmVzIHRoYXQgYXJlIG51bWJlcmVkLAorICAgc3RhcnRpbmcgYXQgY29sdW1uIDEpIGluIGFycmF5IFwmYVtdOgorCisgICAgQ29sdW1uICAgMSAgICAgICAgIDIKKyAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MAorCisgICAxLiBJdmFuIDEwLjAgMi4gT2xhZiA5Ljk1IDMuIE9sZ2EgMTAxLjUKKworICAgQVJSQVkgU09SVCAvS0VZOjEwICZhW10gd291bGQgb3JkZXIgdGhlbSAzLDEsMiwgYnV0IEFSUkFZIFNPUlQgL0tFWToxMAorICAgL05VTUVSSUMgJmFbXSB3b3VsZCBvcmRlciB0aGVtIDIsMSwzLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNy4xMC42LiBEaXNwbGF5aW5nIEFycmF5cworCisgICBUaGUgU0hPVyBBUlJBWSBjb21tYW5kIChvciBBUlJBWSBTSE9XKSBub3cgYWNjZXB0cyBhbiBvcHRpb25hbAorICAgYXJyYXktbmFtZSBhcmd1bWVudDoKKworICBTSE9XIEFSUkFZIFwmYVtdCisKKyAgICh5b3UgY2FuIGxlYXZlIG9mZiB0aGUgXCwgdGhlIFwmLCBhbmQvb3IgdGhlIFtdJ3MgaWYgeW91IGxpa2U7ICJzaG93CisgICBhcnJheSBhIiBpcyBlcXVpdmFsZW50IHRvICJzaG93IGFycmF5IFwmYVtdIikuIFdoZW4gYW4gYXJyYXkgaXMKKyAgIHNwZWNpZmllZCwgaXRzIGRpbWVuc2lvbiBpcyBzaG93biBhbmQgYWxsIGRlZmluZWQgKG5vbi1lbXB0eSkgZWxlbWVudHMKKyAgIGFyZSBsaXN0ZWQuCisKKyAgIEV4YW1wbGU6CisKKyAgYXNzaWduIFwlbiBcZmZpbGVzKCosJmEpICA7IEZpbGwgYW4gYXJyYXkgd2l0aCBmaWxlbmFtZXMgKFs1OTldU2VjdGlvbiA0LjExLjMKKykKKyAgc2hvdyBhcnJheSBcJmFbXSAgICAgICAgICA7IFNob3cgdGhlIGFycmF5IHdlIGp1c3QgcmVhZAorICBhcnJheSBzaG93IFwmYVtdICAgICAgICAgIDsgU2FtZSBhcyBwcmV2aW91cworICBhcnJheSBzb3J0IFwmYVtdICAgICAgICAgIDsgU29ydCB0aGUgYXJyYXkKKyAgYXJyYXkgc2hvdyBcJmFbXSAgICAgICAgICA7IFNob3cgaXQgYWZ0ZXIgc29ydGluZworICBhcnJheSBzaG93IFwmYSAgICAgICAgICAgIDsgU2hvdyBpdCBhZ2FpbgorICBhcnJheSBzaG93ICZhICAgICAgICAgICAgIDsgU2hvdyBpdCBhZ2FpbgorICBhcnJheSBzaG93IGEgICAgICAgICAgICAgIDsgU2hvdyBpdCBhZ2FpbgorCisgICAoVGhlIGZpbmFsIGZvdXIgY29tbWFuZHMgZGVtb25zdHJhdGUgdGhlIGFsdGVybmF0aXZlIGZvcm1zIHRoYXQgYXJlCisgICBhY2NlcHRlZCBmb3IgdGhlIGFycmF5IG5hbWUuKQorCisgICBJZiB5b3UgU0hPVyBBUlJBWSB3aXRob3V0IGdpdmluZyBhbiBhcnJheSBuYW1lLCBhbGwgZGVmaW5lZCBhcnJheXMgYXJlCisgICBsaXN0ZWQgYnkgbmFtZSBhbmQgZGltZW5zaW9uLCBidXQgdGhlaXIgY29udGVudHMgYXJlIG5vdCBzaG93bi4KKworICAgWW91IGNhbiBhbHNvIHNob3cgYSBwaWVjZSBvZiBhbiBhcnJheSBieSBpbmNsdWRpbmcgYSBzdWJzY3JpcHQgb3IKKyAgIHJhbmdlIHdpdGhpbiB0aGUgYXJyYXkgYnJhY2tldHM6CisKKyAgYXJyYXkgc2hvdyBcJmFbNV0gICAgICAgICA7IFNob3dzIFwmYVs1XQorICBhcnJheSBzaG93ICZhWzM6OF0gICAgICAgIDsgU2hvd3MgXCZhWzNdIHRocm91Z2ggXCZhWzhdCisgIGFycmF5IHNob3cgYVs6XCVuLTFdICAgICAgOyBTaG93cyBcJmFbMF0gdGhyb3VnaCBcJmFbXCVuLTFdCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA3LjEwLjcuIE90aGVyIEFycmF5IE9wZXJhdGlvbnMKKworICAgQVJSQVkgREVTVFJPWSBhcnJheW5hbWUKKyAgICAgICAgICBEZXN0cm95cyBhbmQgdW5kZWNsYXJlcyB0aGUgbmFtZWQgYXJyYXkuIFN1YnNjcmlwdHMgb3IgcmFuZ2VzCisgICAgICAgICAgYXJlIG5vdCBhY2NlcHRlZCBpbiB0aGlzIGNvbW1hbmQuCisKKyAgIEFSUkFZIENPUFkgYXJyYXkxIGFycmF5MgorICAgICAgICAgIENvcGllcyB0aGUgZmlyc3QgYXJyYXkgdG8gdGhlIHNlY29uZCBhcnJheS4gSWYgdGhlIHRhcmdldCBhcnJheQorICAgICAgICAgIGhhcyBub3QgYmVlbiBkZWNsYXJlZCwgaXQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdpdGggdGhlCisgICAgICAgICAgc2FtZSBzaXplIGFzIHRoZSBmaXJzdC4gSWYgaXQgaGFzIGJlZW4gZGVjbGFyZWQsIGl0IHdpbGwgYmUKKyAgICAgICAgICB1c2VkIGFzIGRlY2xhcmVkOyBpZiB0aGUgc291cmNlIGFycmF5IGlzIGxhcmdlciwgb25seSBhcyBtdWNoCisgICAgICAgICAgb2YgaXQgYXMgd2lsbCBmaXQgaXMgY29waWVkIHRvIHRoZSB0YXJnZXQgYXJyYXkuIFN5bnRheCBmb3IKKyAgICAgICAgICBhcnJheTEgYW5kIGFycmF5MiBpcyBhcyBpbiBBUlJBWSBTSE9XIChTSE9XIEFSUkFZKS4gRXhhbXBsZToKKworICAuXCVuIDo9IFxmZmlsZXMoKiwmYSkgIDsgQ3JlYXRlIGFuZCBsb2FkIGFycmF5IEEgd2l0aCBhIGZpbGUgbGlzdC4KKyAgYXJyYXkgY29weSAmYSAmYiAgICAgICA7IENvcHkgYXJyYXkgQSB0byBhcnJheSBCLgorCisgICAgICAgICAgVGhlIEFSUkFZIENPUFkgY29tbWFuZCBhbHNvIGxldHMgeW91IGNvcHkgcGllY2VzIG9mIGFycmF5cyBieQorICAgICAgICAgIGluY2x1ZGluZyByYW5nZSBzcGVjaWZpZXJzLCBhcyBpbiB0aGVzZSBleGFtcGxlczoKKworICAgICAgICBBUlJBWSBDT1BZIFwmYVs0OjI3XSBcJmIKKyAgICAgICAgICAgICAgICBUaGlzIGNvcGllcyBcJmFbXSBlbGVtZW50cyA0LTI3IHRvIFwmYltdIGVsZW1lbnRzIDEtMjMsCisgICAgICAgICAgICAgICAgY3JlYXRpbmcgXCZiW10gaWYgbmVjZXNzYXJ5IG9yLCBpZiBcJmJbXSBpcyBhbHJlYWR5CisgICAgICAgICAgICAgICAgZGVjbGFyZWQsIHN0b3BwaW5nIGVhcmx5IGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiAyMy4KKworICAgICAgICBBUlJBWSBDT1BZIFwmYVs0OjI3XSBcJmJbMTJdCisgICAgICAgICAgICAgICAgVGhpcyBjb3BpZXMgXCZhW10gZWxlbWVudHMgNC0yNyB0byBcJmJbXSBlbGVtZW50cyAxMi0zNSwKKyAgICAgICAgICAgICAgICBjcmVhdGluZyBcJmJbXSBpZiBuZWNlc3Nhcnkgb3IsIGlmIFwmYltdIGlzIGFscmVhZHkKKyAgICAgICAgICAgICAgICBkZWNsYXJlZCwgc3RvcHBpbmcgZWFybHkgaWYgaXRzIHNpemUgaXMgbGVzcyB0aGFuIDM1LgorCisgICAgICAgIEFSUkFZIENPUFkgXCZhWzQ6MjddIFwmYlsxMjoxNF0KKyAgICAgICAgICAgICAgICBUaGlzIGNvcGllcyBcJmFbXSBlbGVtZW50cyA0LTYgdG8gXCZiW10gZWxlbWVudHMgMTItMTQsCisgICAgICAgICAgICAgICAgY3JlYXRpbmcgXCZiW10gaWYgbmVjZXNzYXJ5IG9yLCBpZiBcJmJbXSBpcyBhbHJlYWR5CisgICAgICAgICAgICAgICAgZGVjbGFyZWQsIHN0b3BwaW5nIGVhcmx5IGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiAxNC4KKworICAgICAgICBBUlJBWSBDT1BZIFwmYVsxN10gXCZiCisgICAgICAgICAgICAgICAgVGhpcyBjb3BpZXMgYWxsIHRoZSBlbGVtZW50cyBvZiBcJmFbXSBzdGFydGluZyB3aXRoIDE3CisgICAgICAgICAgICAgICAgdW50aWwgdGhlIGxhc3QgdG8gXCZiW10sIGNyZWF0aW5nIFwmYltdIGlmIG5lY2Vzc2FyeSBvciwKKyAgICAgICAgICAgICAgICBpZiBcJmJbXSBpcyBhbHJlYWR5IGRlY2xhcmVkLCBzdG9wcGluZyBlYXJseSBpZiBcJmJbXSBpcworICAgICAgICAgICAgICAgIG5vdCBiaWcgZW5vdWdoLgorCisgICBBUlJBWSBDTEVBUiBhcnJheW5hbWUKKyAgICAgICAgICBTZXRzIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IHRvIHRoZSBlbXB0eSB2YWx1ZS4gWW91IG1heQorICAgICAgICAgIGFsc28gaW5jbHVkZSBhIHJhbmdlIHNwZWNpZmllciB0byBjbGVhciBvbmx5IGEgc2VsZWN0ZWQgcG9ydGlvbgorICAgICAgICAgIG9mIHRoZSBhcnJheTsgZm9yIGV4YW1wbGUgImFycmF5IGNsZWFyIFwmYVszNzoyMTRdIi4gSWYgdGhlCisgICAgICAgICAgcmFuZ2UgaXMgb3V0IG9mIGJvdW5kcywgb25seSB0aGUgcGFydCBvZiB0aGUgYXJyYXkgdGhhdCBpcyBpbgorICAgICAgICAgIGJvdW5kcyBpcyBjbGVhcmVkLgorCisgICBBUlJBWSBTRVQgYXJyYXluYW1lIFsgdmFsdWUgXQorICAgICAgICAgIFNldHMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgdG8gdGhlIGdpdmVuIHZhbHVlLiBJZiBubworICAgICAgICAgIHZhbHVlIGlzIGdpdmVuLCB0aGUgYXJyYXkgaXMgY2xlYXJlZC4gWW91IG1heSBhbHNvIGluY2x1ZGUgYQorICAgICAgICAgIHJhbmdlIHNwZWNpZmllciB0byBzZXQgb25seSBhIHNlbGVjdGVkIHBvcnRpb24gb2YgdGhlIGFycmF5OworICAgICAgICAgIGZvciBleGFtcGxlICJhcnJheSBzZXQgXCZhWzE6OV0gLTEiLiBJZiB0aGUgcmFuZ2UgaXMgb3V0IG9mCisgICAgICAgICAgYm91bmRzLCBvbmx5IHRoZSBwYXJ0IG9mIHRoZSBhcnJheSB0aGF0IGlzIGluIGJvdW5kcyBpcyBzZXQuCisKKyAgIEFSUkFZIFJFU0laRSBhcnJheW5hbWUgc2l6ZQorICAgICAgICAgIFJlc2l6ZXMgdGhlIGdpdmVuIGFycmF5LiBJZiB0aGUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gdGhlCisgICAgICAgICAgYXJyYXkncyBjdXJyZW50IGRpbWVuc2lvbiwgbmV3IGVtcHR5IGVsZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUKKyAgICAgICAgICBlbmQuIElmIHRoZSBzaXplIGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCBkaW1lbnNpb24sIHRoZSBleHRyYQorICAgICAgICAgIGVsZW1lbnRzIGFyZSBkaXNjYXJkZWQuIE5vdGU6IElmIHlvdSBoYXZlIHN0b3JlZCB0aGUgYXJyYXkgc2l6ZQorICAgICAgICAgIGluIGVsZW1lbnQgMCwgQVJSQVkgUkVTSVpFIGRvZXMgbm90IGNoYW5nZSB0aGlzIHZhbHVlLgorICAgICAgICAgIEFsdGVybmF0aXZlIG5vdGF0aW9uOiBBUlJBWSBSRVNJWkUgYXJyYXluYW1lW3NpemVdLiBGb3IgYQorICAgICAgICAgIHByYWN0aWNhbCBleGFtcGxlLCBzZWUgWzYwMF1TZWN0aW9uIDcuMTAuMTEuCisKKyAgIFxmYXJyYXlsb29rKHBhdHRlcm4sYXJyYXluYW1lKQorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlCisgICAgICAgICAgZ2l2ZW4gYXJyYXkgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBwYXR0ZXJuIChmb3IgZGV0YWlscyBhYm91dAorICAgICAgICAgIHBhdHRlcm4gc3ludGF4LCBzZWUgWzYwMV1zZWN0aW9uIDQuOSkuIFRoZSBhcnJheSBuYW1lIGNhbgorICAgICAgICAgIGluY2x1ZGUgYSByYW5nZSBzcGVjaWZpY2F0aW9uIHRvIHJlc3RyaWN0IHRoZSBzZWFyY2ggdG8gYSBnaXZlbgorICAgICAgICAgIHNlZ21lbnQgb2YgdGhlIGFycmF5LiBJZiBubyBlbGVtZW50cyBtYXRjaCB0aGUgcGF0dGVybiwgLTEgaXMKKyAgICAgICAgICByZXR1cm5lZC4KKworICAgXGZ0YWJsZWxvb2soa2V5d29yZCxhcnJheW5hbWVbLGRlbGltaXRlcl0pCisgICAgICAgICAgTG9va3MgaW4gdGhlIGdpdmVuICJ0YWJsZSIsIHdoaWNoIG11c3QgYmUgc29ydGVkLCBmb3IgdGhlIGdpdmVuCisgICAgICAgICAga2V5d29yZC4gVGhlIGtleXdvcmQgbmVlZCBub3QgYmUgc3BlbGxlZCBvdXQgaW4gZnVsbC4KKyAgICAgICAgICBQYXR0ZXJuLW1hdGNoaW5nIGNoYXJhY3RlcnMgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBhcyBwYXJ0IG9mCisgICAgICAgICAgdGhlIGtleXdvcmQuIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgdGFibGUKKyAgICAgICAgICBlbGVtZW50IHRoYXQgdW5pcXVlbHkgbWF0Y2hlcyB0aGUgZ2l2ZW4ga2V5d29yZCwgb3IgLTEgaWYgbm9uZQorICAgICAgICAgIG1hdGNoLCBvciAtMiBpZiBtb3JlIHRoYW4gMSBtYXRjaC4KKworICAgQSAidGFibGUiIGlzIGFuIGFycmF5IHRoYXQgaXMgc29ydGVkIGluIGxleGljYWwgb3JkZXI7IGVhY2ggb2YgaXRzCisgICBlbGVtZW50cyBtYXkgY29udGFpbiBtdWx0aXBsZSBmaWVsZHMsIGRlbGltaXRlZCBieSB0aGUgZ2l2ZW4gZGVsaW1pdGVyCisgICBjaGFyYWN0ZXIgb3IsIGlmIG5vIGRlbGltaXRlciBpcyBzcGVjaWZpZWQsIGEgY29sb24gKDopLgorCisgICBUaGUgXGZhcnJheWxvb2soKSBmdW5jdGlvbiBkb2VzIGV4YWN0bHkgd2hhdCB5b3UgdGVsbCBpdC4gSWYgeW91IGdpdmUKKyAgIGl0IGEgcGF0dGVybiB0aGF0IGRvZXMgbm90IGluY2x1ZGUgd2lsZGNhcmQgY2hhcmFjdGVycyAoc3VjaCBhcyAqLCA/LAorICAgZXRjKSwgaXQgcmVxdWlyZXMgYW4gZXhhY3QgbWF0Y2guIEZvciBleGFtcGxlOgorCisgIFxmYXJyYXlsb29rKG9vZmEsJmEpCisKKyAgIHNlYXJjaGVzIGZvciB0aGUgZmlyc3QgZWxlbWVudCBvZiBcJmFbXSB3aG9zZSB2YWx1ZSBpcyAib29mYSIuIEJ1dDoKKworICBcZmFycmF5bG9vayhvb2ZhKiwmYSkKKworICAgZmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgd2hvc2UgdmFsdWUgc3RhcnRzIHdpdGggIm9vZmEiLCBhbmQ7CisKKyAgXGZhcnJheWxvb2soKm9vZmEsJmEpCisKKyAgIGZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IHdob3NlIHZhbHVlIGVuZHMgd2l0aCAib29mYSIsIGFuZDsKKworICBcZmFycmF5bG9vaygqb29mYSosJmEpCisKKyAgIGZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IHdob3NlIHZhbHVlIGNvbnRhaW5zICJvb2ZhIi4KKworICAgSGVyZSdzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgbG9va2luZyB1cCBwYXR0ZXJucyBpbiBhcnJheXM6CisKKyAgbG9jYWwgXCZhW10gXCV4IFwlbgorICBkZWNsYXJlIFwmYVtdID0gemVybyBvbmUgdHdvIHRocmVlIGZvdXIgZml2ZSBzaXggc2V2ZW4gZWlnaHQgbmluZSB0ZW4KKyAgd2hpbGUgdHJ1ZSB7CisgICAgICAuXCV4ID0gMQorICAgICAgLlwlbiA9IDAKKyAgICAgIGFzayBcJWEgeyBQYXR0ZXJuPyB9CisgICAgICBpZiBub3QgZGVmIFwlYSBleGl0IDAgRG9uZS4KKyAgICAgIHdoaWxlIDw9IFwleCBcZmRpbSgmYSkgeworICAgICAgICAgIC5cJXggOj0gXGZhcnJheWxvb2soXCVhLCZhW1wleF0pCisgICAgICAgICAgaWYgKCA8IFwleCAwICkgYnJlYWsKKyAgICAgICAgICBlY2hvIFxmbHBhZChcJXgsMykuIFwmYVtcJXhdCisgICAgICAgICAgaW5jcmVtZW50IFwleAorICAgICAgICAgIGluY3JlbWVudCBcJW4KKyAgICAgIH0KKyAgICAgIGlmICggPCBcJW4gMSApIGVjaG8gUGF0dGVybiBub3QgZm91bmQgLSAiXCVhIgorICB9CisKKyAgIFRoZSBhcnJheSBuZWVkIG5vdCBiZSBzb3J0ZWQuIFdoZW4gYSBwYXR0ZXJuIGlzIGdpdmVuLCBhIHNlYXJjaCBpcworICAgcGVyZm9ybWVkOyBpZiB0aGVyZSBpcyBhIG1hdGNoLCB0aGUgbWF0Y2hpbmcgZWxlbWVudCdzIGluZGV4IGFuZCB0aGUKKyAgIGVsZW1lbnQgaXRzZWxmIGFyZSBwcmludGVkLCBhbmQgdGhlIHNlYXJjaCBiZWdpbnMgYWdhaW4gYXQgdGhlIG5leHQKKyAgIGVsZW1lbnQuIFRodXMgZWFjaCBtYXRjaGluZyBlbGVtZW50IGlzIHByaW50ZWQuIElmIG5vbmUgbWF0Y2gsIHRoZQorICAgIlBhdHRlcm4gbm90IGZvdW5kIiBtZXNzYWdlIGlzIHByaW50ZWQuIFRoZSBwcm9jZXNzIHJlcGVhdHMgZm9yIGFzCisgICBtYW55IHBhdHRlcm5zIGFzIHRoZSB1c2VyIHdhbnRzIHRvIHR5cGUsIGFuZCB0ZXJtaW5hdGVzIHdoZW4gdGhlIHVzZXIKKyAgIHR5cGVzIGFuIGVtcHR5IHBhdHRlcm4uCisKKyAgIE5vdyBsZXQncyBidWlsZCBhIGxpdHRsZSBjb21tYW5kIHBhcnNlciwgY29uc2lzdGluZyBvZiBhIGtleXdvcmQKKyAgIHRhYmxlLCBhbmQgYSBsb29wIHRvIGxvb2sgdXAgdGhlIHVzZXIncyBjb21tYW5kcyBpbiBpdCB3aXRoCisgICBcZnRhYmxlbG9vaygpLiBJbiB0aGlzIGNhc2UgdGhlIGFycmF5IGVsZW1lbnRzIGhhdmUgImZpZWxkcyIgc2VwYXJhdGVkCisgICBieSBjb2xvbiAoOikgLS0gYSBrZXl3b3JkIGFuZCBhIHZhbHVlLiBLZXl3b3JkIHRhYmxlcyBtdXN0IGJlIHNvcnRlZAorICAgaWYgXHRhYmxlbG9vaygpIGlzIHRvIHdvcmsgcmlnaHQsIHNvIGFmdGVyIGRlY2xhcmluZyBhbmQgaW5pdGlhbGl6aW5nCisgICB0aGUgdGFibGUgYXJyYXksIHdlIHNvcnQgaXQuCisKKyAgbG9jYWwgXCZrW10gXCVhIFwlaSBcJW4KKworICBhcnJheSBkZWNsYXJlIFwma1tdID0gZHJpdmU6OSBkbzo4IGRpc2N1c3M6NyBsaXZlOjYgc3BlbmQ6NSBoZWxwOjQgcXVpdDowCisKKyAgYXJyYXkgc29ydCAmayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgYXJyYXkgaXMgc29ydGVkCisgIGVjaG8gVHlwZSAiaGVscCIgZm9yIGhlbHAuICAgICAgICAgICAgICAgIDsgUHJpbnQgZ3JlZXRpbmcgJiBpbnN0cnVjdGlvbnMKKworICB3aGlsZSB0cnVlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IExvb3AgdG8gZ2V0IGNvbW1hbmRzCisgICAgICB1bmRlZmluZSBcJWEKKyAgICAgIHdoaWxlIG5vdCBkZWZpbmVkIFwlYSB7ICAgICAgICAgICAgICAgOyBHZXQgYSBjb21tYW5kCisgICAgICAgICAgYXNrIFwlYSB7IENvbW1hbmQ/IH0KKyAgICAgIH0KKyAgICAgIC5cJW4gOj0gXGZ0YWJsZWxvb2soXCVhLCZrKSAgICAgICAgICAgOyBMb29rIHVwIHRoZSBjb21tYW5kCisgICAgICBzd2l0Y2ggXCVuIHsgICAgICAgICAgICAgICAgICAgICAgICAgIDsgSGFuZGxlIGVycm9ycworICAgICAgICA6LTEsIGVjaG8gTm90IGZvdW5kIC0gIlwlYSIgICAgICAgICA7IERvZXNuJ3QgbWF0Y2gKKyAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICA6LTIsIGVjaG8gQW1iaWd1b3VzIC0gIlwlYSIgICAgICAgICA7IE1hdGNoZXMgdG9vIG1hbnkKKyAgICAgICAgICAgICBjb250aW51ZQorICAgICAgfQorICAgICAgc3dpdGNoIFxmd29yZChcJmtbXCVuXSwyKSB7ICAgICAgICAgICA7IERpc3BhdGNoIGFjY29yZGluZyB0byB2YWx1ZQorICAgICAgICAgOjksIGVjaG8gRHJpdmluZy4uLiwgYnJlYWsKKyAgICAgICAgIDo4LCBlY2hvIERvaW5nLi4uLCBicmVhaworICAgICAgICAgOjcsIGVjaG8gRGlzY3Vzc2luZy4uLiwgYnJlYWsKKyAgICAgICAgIDo2LCBlY2hvIExpdmluZy4uLiwgYnJlYWsKKyAgICAgICAgIDo1LCBlY2hvIFNwZW5kaW5nLi4uLCBicmVhaworICAgICAgICAgOjQsIGVjaG8geyBDb21tYW5kcyAobWF5IGJlIGFiYnJldmlhdGVkKTp9CisgICAgICAgICAgICAgZm9yIFwlaSAxIFxmZGltKCZrKSAxIHsKKyAgICAgICAgICAgICAgICBlY2hvIHsgIFwlaS4gXGZ3b3JkKFwma1tcJWldLDEpIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgIDowLCBleGl0IDAgQnllIQorICAgICAgICAgOmRlZmF1bHQsIHN0b3AgMSBJbnRlcm5hbCBlcnJvcgorICAgICAgfQorICB9CisKKyAgIEluIHRoaXMgZXhhbXBsZSwga2V5d29yZHMgYXJlICJkcml2ZSIsICJkbyIsICJkaXNjdXNzIiwgZXRjLCBhbmQgdGhlaXIKKyAgIHZhbHVlcyBhcmUgdW5pcXVlIG51bWJlcnMgKHZhbHVlcyBuZWVkIG5vdCBiZSBudW1iZXJzLCBhbmQgdGhlcmUgbmVlZAorICAgbm90IGJlIG9ubHkgb25lIHZhbHVlIC0tIHRoZXJlIGNhbiBiZSAwLCAxLCAyLCBvciBtb3JlIG9mIHRoZW0pLiBUaGUKKyAgIHVzZXIgdHlwZXMgYSBjb21tYW5kLCB3aGljaCBjYW4gYmUgdGhlIHdob2xlIHdvcmQgKGxpa2UgImhlbHAiKSBvciBhbnkKKyAgIGFiYnJldmlhdGlvbiAobGlrZSAiaGVsIiwgImhlIiwgb3IganVzdCAiaCIpLiBJZiB0aGlzIGRvZXMgbm90IG1hdGNoCisgICBhbnkga2V5d29yZHMsIFxmdGFibGVsb29rKCkgcmV0dXJucyAtMTsgaWYgaXQgbWF0Y2hlcyBtb3JlIHRoYW4gb25lCisgICAoYXMgd291bGQgImQiKSwgaXQgcmV0dXJucyAtMi4gT3RoZXJ3aXNlIHRoZSBhcnJheSBpbmRleCBpcyByZXR1cm5lZCwKKyAgIDEgb3IgaGlnaGVyLgorCisgICBHaXZlbiB0aGUgYXJyYXkgaW5kZXggXCVuLCB3ZSBjYW4gZ2V0IHRoZSB0YWJsZSB2YWx1ZXMgYXMgZm9sbG93czoKKworICBcZndvcmQoXCZrW1wlbl0sMSkgaXMgdGhlIGtleXdvcmQgKGZpcnN0IGZpZWxkKQorICBcZndvcmQoXCZrW1wlbl0sMikgaXMgdGhlIHZhbHVlIChzZWNvbmQgZmllbGQsIGluIHRoaXMgY2FzZSBhIG51bWJlcikKKworICAgSW4gb3VyIGV4YW1wbGUsIHdlIHVzZSB0aGUgdmFsdWUgKG51bWJlcikgYXMgdGhlIFNXSVRDSCB2YXJpYWJsZS4gQXMKKyAgIG5vdGVkLCBcZmFibGVsb29rKCkgZXhwZWN0cyB0aGUgYXJyYXkgZWxlbWVudHMgdG8gY29udGFpbiBtdWx0aXBsZQorICAgZmllbGRzIHNlcGFyYXRlZCBieSBjb2xvbiAoOikgKG9yIG90aGVyIGNoYXJhY3RlciB0aGF0IHlvdSBzcGVjaWZ5LAorICAgZS5nLiBcZnRhYmxlbG9vayhcJWEsJmEsXikpIGFuZCB3aGVuIG1hdGNoaW5nIHRoZSBrZXl3b3JkLCBpZ25vcmVzIHRoZQorICAgZmlyc3QgZGVsaW1pdGVyIGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgNy4xMC44LiBIaW50cyBmb3IgVXNpbmcgQXJyYXlzCisKKyAgIEMgcHJvZ3JhbW1lcnMgYXJlIGFjY3VzdG9tZWQgdG8gb3V0LW9mLWJvdW5kcyBhcnJheSByZWZlcmVuY2VzIGNhdXNpbmcKKyAgIGNvcmUgZHVtcHMgb3Igd29yc2UuIEluIEMtS2VybWl0OgorCisgICAgICogQSByZWZlcmVuY2UgdG8gYW4gYW4gb3V0LW9mLWJvdW5kcyBhcnJheSBlbGVtZW50IHJldHVybnMgdGhlIGVtcHR5CisgICAgICAgc3RyaW5nLgorICAgICAqIEFuIGF0dGVtcHQgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhbiBhcnJheSBlbGVtZW50IHRoYXQgaXMgb3V0IG9mCisgICAgICAgYm91bmRzIG9yIHRoYXQgaGFzIG5vdCBiZWVuIGRlY2xhcmVkIHNpbXBseSBmYWlscy4KKworICAgQyBwcm9ncmFtbWVycyBleHBlY3QgYW4gYXJyYXkgb2Ygc2l6ZSBudG8gaGF2ZSBlbGVtZW50cyAwIHRocm91Z2ggbi0xLgorICAgRm9ydHJhbiBwcm9ncmFtbWVycyBleHBlY3QgdGhlIHNhbWUgYXJyYXkgdG8gaGF2ZSBlbGVtZW50cyAxIHRocm91Z2gKKyAgIG4uIEMtS2VybWl0IGFjY29tbW9kYXRlcyBib3RoIHN0eWxlczsgd2hlbiB5b3UgZGVjbGFyZSBhbiBhcnJheSBvZgorICAgc2l6ZSBuLCBpdCBoYXMgbj0xIGVsZW1lbnRzLCAwIHRocm91Z2ggbiwgYW5kIHlvdSBjYW4gdXNlIHRoZSBhcnJheSBpbgorICAgeW91ciBhY2N1c3RvbWVkIG1hbm5lciwgMC1iYXNlZCBvciAxLWJhc2VkLgorCisgICBIb3dldmVyLCBub3RlIHRoYXQgQy1LZXJtaXQgaGFzIGNlcnRhaW4gYmlhc2VzIHRvd2FyZHMgMS1iYXNlZCBhcnJheXM6CisKKyAgICAgKiBBc3NpZ25tZW50IG9mIGZpbGUgbGlzdHMgc3RhcnRzIHdpdGggZWxlbWVudCAxIChbNjAyXVNlY3Rpb24KKyAgICAgICA3LjEwLjMpLgorICAgICAqIEFzc2lnbm1lbnQgYnkgXGZzcGxpdCgpIHN0YXJ0cyB3aXRoIGVsZW1lbnQgMSAoWzYwM11TZWN0aW9uIDcuMykuCisgICAgICogQXJyYXkgaW5pdGlhbGl6YXRpb24gc2tpcHMgdGhlIDB0aCBlbGVtZW50LiBUbyBpbml0aWFsaXplIGEKKyAgICAgICAwLWJhc2VkIGFycmF5LCB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpczoKKyAgZGVjbGFyZSBcJmFbM10gPSBvbmUgdHdvIHRocmVlCisgIC5cJmFbMF0gPSB6ZXJvCisgICAgICogVGhlIEFSUkFZIFNPUlQgY29tbWFuZCBza2lwcyB0aGUgMHRoIGVsZW1lbnQgdW5sZXNzIHlvdSBpbmNsdWRlCisgICAgICAgL1JBTkdFOjAKKyAgICAgKiBUaGUgU0hJRlQgY29tbWFuZCBpZ25vcmVzIGVsZW1lbnQgMCBvZiB0aGUgXCZfW10gYXJyYXkuCisKKyAgIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGFuIGFycmF5J3MgZGltZW5zaW9uZWQgc2l6ZSBhbmQgdGhlIG51bWJlciBvZgorICAgZWxlbWVudHMgaW4gdGhlIGFycmF5IGlzIGltcG9ydGFudCB3aGVuIHNvcnRpbmcuIFRvIGlsbHVzdHJhdGU6CisKKyAgZGVjbGFyZSBcJmFbMTAwXSAgICAgICAgICAgICAgICAgIDsgRGVjbGFyZSBhcnJheSAmYSB3aXRoIDEwMCBlbGVtZW50cworICBmb3BlbiAvcmVhZCBcJWMgb29mYS50eHQgICAgICAgICAgOyBPcGVuIGEgZmlsZQorICBpZiBmYWlsLi4uCisgIGZvciBcJWkgMSBcZmRpbSgmYSkgMSB7ICAgICAgICAgICA7IFJlYWQgdGhlIGZpbGUgaW50byB0aGUgYXJyYXkKKyAgICAgIGZyZWFkIFwlYyBcJmFbXCVpXQorICAgICAgaWYgZmFpbCBicmVhaworICB9CisgIGZjbG9zZSBcJWMKKyAgaWYgPiBcJWkgXGZkaW0oJmEpIGVuZCAxIEZpbGUgaGFzIHRvbyBtYW55IGxpbmVzIGZvciBhcnJheS4KKyAgLlwlbiA6Oj0gXCVpIC0gMQorICBlY2hvIEZpbGUgaGFzIFwlbiBsaW5lKHMpLgorCisgICBMZXQncyBzYXkgdGhlIGZpbGUgaGFkIDk1IGxpbmVzLiBUaGlzIGxlYXZlcyBlbGVtZW50cyA5Ni0xMDAgb2YgdGhlCisgICBhcnJheSBlbXB0eS4gTm93IHN1cHBvc2UgeW91IHNvcnQgdGhlIGFycmF5IGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdDoKKworICBzb3J0ICZhICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBTb3J0IHRoZSB3aG9sZSBhcnJheQorICBmb3BlbiAvd3JpdGUgXCVvIG9vZmEudHh0LnNvcnRlZCAgOyBPcGVuIGFuIG91dHB1dCBmaWxlCisgIGlmIGZhaWwgLi4uCisgIGZvciBcJWkgMSBcJW4gMSB7ICAgICAgICAgICAgICAgICA7IFdyaXRlIG91dCA5NSByZWNvcmRzCisgICAgICBmd3JpdGUgL2xpbmUgXCVvIFwmYVtcJWldCisgICAgICBpZiBmYWlsIGVuZCAxIFdyaXRlIGVycm9yCisgIH0KKyAgY2xvc2Ugd3JpdGUKKworICAgWW91IG1pZ2h0IGJlIHN1cnByaXNlZCBhdCB0aGUgY29udGVudHMgb2YgIm9vZmEudHh0LnNvcnRlZCIgLS0gZml2ZQorICAgZW1wdHkgZWxlbWVudHMsIDk2LTEwMCwgZmxvYXRlZCB0byB0aGUgdG9wIG9mIHRoZSBhcnJheSBpbiB0aGUgc29ydCwKKyAgIGFuZCBzaW5jZSB5b3VyIHdyaXRlIGxvb3Agb25seSBoYWQgOTUgaXRlcmF0aW9ucywgdGhlIGZpbmFsIDUgbGluZXMgb2YKKyAgIHRoZSBzb3J0ZWQgZmlsZSBhcmUgbG9zdC4KKworICAgVGhlcmVmb3JlLCB3aGVuIGRlYWxpbmcgd2l0aCBwYXJ0aWFsbHkgZmlsbGVkIGFycmF5cyAtLSBlc3BlY2lhbGx5CisgICB3aGVuIHNvcnRpbmcgdGhlbSAtLSByZW1lbWJlciB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgZWxlbWVudHMuIEEKKyAgIGhhbmR5IHdheSBvZiByZWNvcmRpbmcgYW4gYXJyYXkncyAidHJ1ZSIgc2l6ZSBpcyB0byBwdXQgaXQgaW4gdGhlIDB0aAorICAgZWxlbWVudC4gVGhhdCB3YXksIGl0ICJ0cmF2ZWxzIHdpdGggdGhlIGFycmF5Ii4gVG8gaWxsdXN0cmF0ZQorICAgKGNvbnRpbnVpbmcgdGhlIHByZXZpb3VzIGV4YW1wbGUgYXQgdGhlICJjbG9zZSByZWFkIiBzdGF0ZW1lbnQpOgorCisgIGNsb3NlIHJlYWQKKyAgaWYgPiBcJWkgXGZkaW0oJmEpIGVuZCAxIEZpbGUgaGFzIHRvbyBtYW55IGxpbmVzIGZvciBhcnJheS4KKyAgLlwmYVswXSA6Oj0gXCVpIC0gMSAgICAgOyBBc3NpZ24gbnVtYmVyIG9mIGxpbmVzIHRvIFwmYVswXS4KKyAgZWNobyBGaWxlIGhhcyBcJmFbMF0gbGluZShzKS4KKyAgc29ydCAvcmFuZ2U6MTpcJmFbMF0gJmEKKyAgb3BlbiB3cml0ZSBvb2ZhLnR4dC5zb3J0ZWQKKyAgaWYgZmFpbCAuLi4KKyAgZm9yIFwlaSAxIFwmYVswXSAxIHsKKyAgICAgIHdyaXRlbG4gZmlsZSBcJmFbXCVqXQorICAgICAgaWYgZmFpbCBlbmQgMSBXcml0ZSBlcnJvcgorICB9CisgIGNsb3NlIHdyaXRlCisKKyAgIE5vdGUgdGhlIFNPUlQgc3dpdGNoLCAvUkFOR0U6MTpcJmFbMF0uIFRoaXMga2VlcHMgdGhlIHNvcnQgMS1iYXNlZCwKKyAgIGFuZCB1c2VzIGVsZW1lbnQgMCBvZiB0aGUgYXJyYXkgYXMgaXRzIHNpemUgaW5kaWNhdG9yLgorCisgICBGaW5hbGx5LCBub3RlIHRoYXQgZXZlbiB0aG91Z2ggc29tZSBjb21tYW5kcyBvciBmdW5jdGlvbnMgbWlnaHQgcHV0IGEKKyAgIHNpemUgaW4gYXJyYXkgZWxlbWVudCAwLCBubyBidWlsdC1pbiBmdW5jdGlvbnMgb3IgY29tbWFuZHMgZGVwZW5kIG9uIGEKKyAgIHNpemUgYWN0dWFsbHkgYmVpbmcgdGhlcmUuIFRodXMgeW91IGFyZSBwZXJmZWN0bHkgZnJlZSB0byByZXBsYWNlIHRoZQorICAgc2l6ZSB3aXRoIHNvbWV0aGluZyBlbHNlIGFuZCB0cmVhdCB0aGUgYXJyYXkgYXMgMC1iYXNlZC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDcuMTAuOS4gRG8tSXQtWW91cnNlbGYgQXJyYXlzCisKKyAgIEtlcm1pdCdzIFwmeFtdIGFycmF5cyBhcmUgbmljZSBiZWNhdXNlIG9mIHRoZSBhY2NvbXBhbnlpbmcgYnVpbHQtaW4KKyAgIGZ1bmN0aW9uYWxpdHkgLS0gQVJSQVkgY29tbWFuZHMsIGJ1aWx0LWluIGZ1bmN0aW9ucyB0aGF0IGxvYWQgYW5kCisgICBzZWFyY2ggYXJyYXlzLCBhdXRvbWF0aWMgZXZhbHVhdGlvbiBvZiBhcml0aG1ldGljIGV4cHJlc3Npb25zIHdpdGhpbgorICAgdGhlIHN1YnNjcmlwdCBicmFja2V0cywgYW5kIHNvIG9uLiBZZXQgdGhleSBhbHNvIGhhdmUgY2VydGFpbgorICAgbGltaXRhdGlvbnM6CisKKyAgICAxLiBFeGNlcHQgd2hlbiBjcmVhdGVkIGJ5IGR5bmFtaWMgbG9hZGluZyAoZS5nLiBieSBcZmZpbGVzKCkpIHRoZXkKKyAgICAgICBtdXN0IGJlIGRlY2xhcmVkIGFuZCBkaW1lbnNpb25lZCBpbiBhZHZhbmNlLgorICAgIDIuIEluZGljZXMgbXVzdCBiZSBudW1lcmljLCBwb3NpdGl2ZSwgYW5kIGluIHJhbmdlLgorICAgIDMuIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSBkaW1lbnNpb24uIE1hdHJpY2VzIG9yIG90aGVyCisgICAgICAgaGlnaGVyLWRpbWVuc2lvbmVkIGFycmF5cyBhcmUgbm90IGF2YWlsYWJsZS4KKworICAgQnV0IG5vbmUgb2YgdGhpcyBpcyB0byBzYXkgeW91IGNhbid0IGludmVudCBhbnkga2luZCBvZiBkYXRhIHN0cnVjdHVyZQorICAgeW91IGxpa2UuIEluIFs2MDRdU2VjdGlvbiA3LjkuMiB5b3UgY2FuIHNlZSBzb21lIGV4YW1wbGVzLiBIZXJlJ3MKKyAgIGFub3RoZXIgKGNvdXJ0ZXN5IG9mIERhdCBUaHVjIE5ndXllbiksIGluIHdoaWNoIGEgcGFpciBvZiBtYXRyaWNlcyBpcworICAgY3JlYXRlZCBhbmQgdGhlbiBhZGRlZDogbm8gZGltZW5zaW9uaW5nIG5lY2Vzc2FyeS4KKworICAucm93ID0gNAorICAuY29sID0gOQorCisgIDsgTUFDUk8gVE8gUFJJTlQgQSBNQVRSSVgKKyAgZGVmaW5lIFBNQVRSSVggeworICAgICAgZWNobyBNYXRyaXggXCUxOgorICAgICAgZm9yIFwlciAxIFxtKHJvdykgMSB7CisgICAgICAgICAgZm9yIFwlYyAxIFxtKGNvbCkgMSB7CisgICAgICAgICAgICAgIHhlY2hvIFxmbHBhZChcbShcJTFbXCVyXVtcJWNdKSw0KQorICAgICAgICAgIH0KKyAgICAgICAgICBlY2hvCisgICAgICB9CisgICAgICBlY2hvCisgIH0KKyAgOyBDUkVBVEUgTUFUUklDRVMgQSBBTkQgQgorICBmb3IgXCVyIDEgXG0ocm93KSAxIHsKKyAgICAgIGZvciBcJWMgMSBcbShjb2wpIDEgeworICAgICAgICAgIF9ldmFsIEFbXCVyXVtcJWNdIFwlciArIFwlYworICAgICAgICAgIF9ldmFsIEJbXCVyXVtcJWNdIFwlciAqIFwlYworICAgICAgfQorICB9CisgIDsgQ1JFQVRFIE1BVFJJWCBDID0gU1VNIE9GIE1BVFJJWCBBIEFORCBNQVRSSVggQgorICBmb3IgXCVyIDEgXG0ocm93KSAxIHsKKyAgICAgIGZvciBcJWMgMSBcbShjb2wpIDEgeworICAgICAgICAgIF9ldmFsIENbXCVyXVtcJWNdIFxtKEFbXCVyXVtcJWNdKSArIFxtKEJbXCVyXVtcJWNdKQorICAgICAgfQorICB9CisgIHBtYXRyaXggQSAgOyBQcmludCBNYXRyaXggQQorICBwbWF0cml4IEIgIDsgUHJpbnQgTWF0cml4IEIKKyAgcG1hdHJpeCBDICA7IFByaW50IE1hdHJpeCBDCisKKyAgIEluIHRoZSBleGFtcGxlLCB3ZSB1c2UgbWF0cml4LWxpa2Ugbm90YXRpb24gdG8gY3JlYXRlIG1hY3JvcyB3aXRoCisgICBuYW1lcyBsaWtlICJBWzFdWzFdIiwgIkJbM11bN10iLCBhbmQgc28gb24uCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA3LjEwLjEwLiBBc3NvY2lhdGl2ZSBBcnJheXMKKworICAgQW4gYXNzb2NpYXRpdmUgYXJyYXkgaXMgYSBzcGVjaWFsIGtpbmQgb2YgRG8tSXQtWW91cnNlbGYgYXJyYXkuIEl0CisgICBkaWZmZXJzIGZyb20gYSByZWd1bGFyIGFycmF5IGluIHRoYXQgaXRzIGluZGljZXMgbmVlZCBub3QgYmUgbnVtYmVycworICAgLS0gdGhleSBjYW4gYmUgYW55dGhpbmcgYXQgYWxsIC0tIHdvcmRzLCBmaWxlbmFtZXMsIG5hbWVzIG9mIG1vbnRocywKKyAgIGFueSBjaGFyYWN0ZXIgc3RyaW5nIGF0IGFsbCwgYW5kIHRoYXQgaXQgZG9lc24ndCBoYXZlIHRvIGJlIChhbmQgaW4KKyAgIGZhY3QgY2FuJ3QgYmUpIGRlY2xhcmVkLiBBbiBhc3NvY2lhdGl2ZSBhcnJheSBlbGVtZW50IGlzIHNpbXBseSBhCisgICBtYWNybyB3aG9zZSBuYW1lIGVuZHMgd2l0aCBhbiBpbmRleCBlbmNsb3NlZCBpbiBhbmdsZSBicmFja2V0cywgZm9yCisgICBleGFtcGxlOgorCisgIGZpbGU8b29mYS50eHQ+CisKKyAgIE1vcmUgZm9ybWFsbHk6CisKKyAgYmFzZW5hbWU8aW5kZXg+CisKKyAgIEFuIGFzc29jaWF0aXZlIGFycmF5IGlzIGEgY29sbGVjdGlvbiBvZiBhbGwgYXNzb2NpYXRpdmUgYXJyYXkgZWxlbWVudHMKKyAgIHRoYXQgaGF2ZSB0aGUgc2FtZSBiYXNlbmFtZS4gQW55IG51bWJlciBvZiBhc3NvY2lhdGl2ZSBhcnJheXMsIGVhY2gKKyAgIHdpdGggYW55IG51bWJlciBvZiBlbGVtZW50cywgY2FuIGV4aXN0IGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgIEFuIGFzc29jaWF0aXZlIGFycmF5IGVsZW1lbnQgY2FuIGJlIGFzc2lnbmVkIGEgdmFsdWUsIHN1Y2ggYXMgIjEiLAorICAganVzdCBsaWtlIGFueSBvdGhlciBtYWNybzoKKworICBkZWZpbmUgZmlsZTxvb2ZhLnR4dD4gMSAgICAgOyBHaXZlICJmaWxlPG9vZmEudHh0PiIgdGhlIHZhbHVlICIxIi4KKworICAgb3I6CisKKyAgYXNzaWduIGZpbGU8b29mYS50eHQ+IFwlYSAgIDsgR2l2ZSBpdCB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIFwlYS4KKworICAgSG93ZXZlciwgc2luY2UgYW4gYXNzb2NpYXRpdmUgYXJyYXkgZWxlbWVudCBpcyBhIG1hY3JvLCBpdCBtYXkgbm90CisgICBoYXZlIGFuIGVtcHR5IChudWxsKSB2YWx1ZSwgc2luY2UgYXNzaWduaW5nIGFuIGVtcHR5IHZhbHVlIHRvIGEgbWFjcm8KKyAgIHVuZGVmaW5lcyB0aGUgbWFjcm8uCisKKyAgIFlvdSBjYW4gcmVmZXIgdG8gdGhlIHZhbHVlIG9mIGFuIGFzc29jaWF0aXZlIGFycmF5IGVsZW1lbnQgdXNpbmcgdGhlCisgICBmYW1pbGlhciBub3RhdGlvbiBmb3IgbWFjcm8gdmFsdWVzOgorCisgIGVjaG8gXG0oZmlsZTxvb2ZhLnR4dD4pICAgICA7IEVjaG8gdGhlIHZhbHVlIG9mICJmaWxlPG9vZmEudHh0PiIuCisKKyAgIEFzc29jaWF0aXZlIGFycmF5cyBhcmUgbW9zdCB1c2VmdWwsIGhvd2V2ZXIsIHdoZW4gdGhlIHZhbHVlIG9mIHRoZQorICAgaW5kZXggaXMgYSB2YXJpYWJsZS4gSW4gdGhhdCBjYXNlLCB5b3UgbXVzdCB1c2UgdGhlICJoaWRkZW4iIGZvcm1zIG9mCisgICB0aGUgREVGSU5FIG9yIEFTU0lHTiBjb21tYW5kcyB0aGF0IGV2YWx1YXRlIHRoZSBtYWNybyBuYW1lIGJlZm9yZQorICAgbWFraW5nIHRoZSBhc3NpZ25tZW50IChzZWUgWzYwNV1Vc2luZyBDLUtlcm1pdCwgcGFnZSA0NTcpLiBFeGFtcGxlOgorCisgIGRlZmluZSBcJWYgb29mYS50eHQKKyAgX2RlZmluZSBmaWxlPFwlZj4gMQorICBlY2hvIGZpbGU8XCVmPiA9IFxtKGZpbGU8XCVmPikKKworICAgcHJpbnRzOgorCisgIGZpbGU8b29mYS50eHQ+ID0gMQorCisgICBhbmQgdGhlbjoKKworICBfaW5jcmVtZW50IGZpbGU8XCVmPgorICBlY2hvIGZpbGU8XCVmPiA9IFxtKGZpbGU8XCVmPikKKworICAgcHJpbnRzOgorCisgIGZpbGU8b29mYS50eHQ+ID0gMgorCisgICBXaGF0IGFyZSBhc3NvY2lhdGl2ZSBhcnJheXMgZ29vZCBmb3I/IFRoZSBjbGFzc2ljIGV4YW1wbGUgaXMgIndvcmQKKyAgIGNvdW50cyI6IGZpbmRpbmcgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHdvcmQgaXMgdXNlZCBpbiBhIHRleHQKKyAgIHdpdGhvdXQga25vd2luZyBpbiBhZHZhbmNlIHdoYXQgdGhlIHdvcmRzIGFyZS4gV2l0aG91dCBhc3NvY2lhdGl2ZQorICAgYXJyYXlzLCB5b3VyIHByb2dyYW0gd291bGQgaGF2ZSB0byBidWlsZCBhIHRhYmxlIG9mIHNvbWUga2luZCwgYW5kCisgICBldmVyeSB0aW1lIGEgd29yZCB3YXMgZW5jb3VudGVyZWQsIGxvb2sgaXQgdXAgaW4gdGhlIHRhYmxlIHRvIGZpbmQgaXRzCisgICBwb3NpdGlvbiBhbmQgY291bnRlciwgb3IgYWRkIGl0IHRvIHRoZSB0YWJsZSBpZiBpdCB3YXNuJ3QgZm91bmQgLS0gYQorICAgdGltZS1jb25zdW1pbmcgYW5kIGxhYm9yaW91cyBwcm9jZXNzLiBBc3NvY2lhdGl2ZSBhcnJheXMsIGhvd2V2ZXIsIGxldAorICAgeW91IHVzZSB0aGUgd29yZCBpdHNlbGYgYXMgdGhlIHRhYmxlIGluZGV4IGFuZCB0aGVyZWZvcmUgc2lkZXN0ZXAgYWxsCisgICB0aGUgdGFibGUgYnVpbGRpbmcgYW5kIGxvb2t1cHMuCisKKyAgIExldCdzIHdvcmsgdGhyb3VnaCBhIHByYWN0aWNhbCBleGFtcGxlLiBTdXBwb3NlIHlvdSBoYXZlIGEKKyAgIGZpbGUtdHJhbnNmZXIgbG9nIGluIHdoaWNoIGVhY2ggbGluZSBpcyBjb21wb3NlZCBvZiBhIG51bWJlciBvZgorICAgYmxhbmstc2VwYXJhdGVkIGZpZWxkcywgYW5kIHRoZSA5dGggZmllbGQgaXMgYSBmaWxlbmFtZSAod2hpY2ggaGFwcGVucworICAgdG8gYmUgdGhlIGZvcm1hdCBvZiBjZXJ0YWluIEZUUCBzZXJ2ZXIgbG9ncywgYXMgd2VsbCBhcyBvZiBDLUtlcm1pdCdzCisgICBuZXcgRlRQLWZvcm1hdCB0cmFuc2FjdGlvbiBsb2csIGRlc2NyaWJlZCBpbiBbNjA2XVNlY3Rpb24gNC4xNy4yKSwgZm9yCisgICBleGFtcGxlOgorCisgIFdlZCBKdWwgMTQgMDk6MzU6MzEgMTk5OSAyMiB4eC5taXQuZWR1IDEzNDEyIC9wdWIvZnRwL21tL2ludHJvLnR4dCAuLi4uCisKKyAgIGFuZCB5b3Ugd2FudCB0byBmaW5kIG91dCBob3cgbWFueSB0aW1lcyBlYWNoIGZpbGUgd2FzIHRyYW5zZmVycmVkLiBUaGUKKyAgIGZvbGxvd2luZyBjb2RlIGJ1aWxkcyBhbiBhc3NvY2lhdGl2ZSBhcnJheSwgZmlsZTw+LCBjb250YWluaW5nIHRoZQorICAgY291bnRzIGZvciBlYWNoIGZpbGU6CisKKyAgbG9jYWwgbmFtZSBsaW5lIG1heCBcJWMgXCVuICAgICAgICAgIDsgRGVjbGFyZSBsb2NhbCB2YXJpYWJsZXMKKyAgZm9wZW4gL3JlYWQgXCVjIC92YXIvbG9nL2Z0cGQubG9nICAgIDsgT3BlbiB0aGUgbG9nIGZpbGUgKFs2MDddU2VjdGlvbiAxLjIyKQorICBpZiBmYWlsIGV4aXQgMSBDYW4ndCBvcGVuIGxvZyAgICAgICAgOyBDaGVjaworICB3aGlsZSB0cnVlIHsgICAgICAgICAgICAgICAgICAgICAgICAgOyBMb29wIGZvciBlYWNoIHJlY29yZAorICAgICAgZnJlYWQgL2xpbmUgXCVjIGxpbmUgICAgICAgICAgICAgOyBSZWFkIGEgbGluZQorICAgICAgaWYgZmFpbCBicmVhayAgICAgICAgICAgICAgICAgICAgOyBDaGVjayBmb3IgZW5kIG9mIGZpbGUKKyAgICAgIC5uYW1lIDo9IFxmd29yZChcbShsaW5lKSw5LHsgfSkgIDsgR2V0IDl0aCBmaWVsZCA9IGZpbGVuYW1lIChTZWMgNy4zKQorICAgICAgX2luY3JlbWVudCBmaWxlPFxtKG5hbWUpPiAgICAgICAgOyBJbmNyZW1lbnQgaXRzIGNvdW50ZXIgKFNlYyA3LjkuMikKKyAgfQorICBmY2xvc2UgXCVjICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbG9zZSBmaWxlIHdoZW4gZG9uZS4KKworICAgTm90ZSB0aGF0IF9JTkNSRU1FTlQgKGFuZCBJTkNSRU1FTlQsIGFuZCBbX11ERUNSRU1FTlQpIHRyZWF0IGFuIGVtcHR5CisgICAoaS5lLiBub25leGlzdGVudCkgdmFyaWFibGUgYXMgaGF2aW5nIGEgdmFsdWUgb2YgMCwgYW5kIHRoZXJlZm9yZQorICAgY3JlYXRlcyB0aGUgdmFyaWFibGUgd2l0aCBhIHZhbHVlIG9mIDEuCisKKyAgIEF0IHRoaXMgcG9pbnQsIGlmIHlvdSB0b2xkIEtlcm1pdCB0byAic2hvdyBtYWNybyBmaWxlPCIsIGl0IHdvdWxkIGxpc3QKKyAgIHRoZSBhc3NvY2lhdGl2ZSBhcnJheS4gQnV0IHNpbmNlIHlvdSBkb24ndCBuZWNlc3NhcmlseSBrbm93IHRoZSBuYW1lcworICAgb2YgdGhlIGZpbGVzIGluIHRoZSBhcnJheSwgb3IgZXZlbiBob3cgbWFueSBlbGVtZW50cyBhcmUgaW4gdGhlIGFycmF5LAorICAgaG93IGNhbiB5b3UgdXNlIGl0IGluIGEgc2NyaXB0IHByb2dyYW0/CisKKyAgIFRoZSBpZGVhIG9mIGNyZWF0aW5nIG1hY3JvIG5hbWVzIHRoYXQgaW5jbHVkZSBjaGFyYWN0ZXItc3RyaW5nIGluZGljZXMKKyAgIGVuY2xvc2VkIGluIGFuZ2xlIGJyYWNrZXRzIGlzIHBlcmZlY3RseSBhcmJpdHJhcnkgYW5kIGRvZXNuJ3QgZGVwZW5kCisgICBvbiBhbnkgS2VybWl0IGZlYXR1cmVzIHRoYXQgd2VyZW4ndCBhbHJlYWR5IHRoZXJlIC0tIHdlIGNvdWxkIGp1c3QgYXMKKyAgIGVhc2lseSBoYXZlIHVzZWQgc29tZSBvdGhlciBub3RhdGlvbiwgc3VjaCBhcyAiZmlsZVtpbmRleF0iLAorICAgImZpbGU6aW5kZXgiLCBvciAiZmlsZS5pbmRleCIsIGFuZCB0aGUgY29kZSBhYm92ZSB3b3VsZCBoYXZlIHdvcmtlZAorICAganVzdCBhcyB3ZWxsICh3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHN5bnRheCBhZGp1c3RtZW50cykuIEJ1dCB0byBiZQorICAgYWJsZSB0byB1c2UgYW4gYXNzb2NpYXRpdmUgYXJyYXkgaW4gYSBwcm9ncmFtIGFmdGVyIHRoZSBhcnJheSBpcworICAgYnVpbHQsIHdlIG5lZWQgYSBtZXRob2Qgb2YgYWNjZXNzaW5nIGFsbCBpdHMgZWxlbWVudHMgd2l0aG91dCBrbm93aW5nCisgICBpbiBhZHZhbmNlIHdoYXQgdGhleSBhcmUuIFRoYXQncyB3aGVyZSB0aGUgY2hvc2VuIG5vdGF0aW9uIGNvbWVzIGluLgorCisgICBGaXJzdCBvZiBhbGwsIGFueSBtYWNybyBuYW1lIHRoYXQgZW5kcyB3aXRoICI8eHh4PiIgKHdoZXJlICJ4eHgiIGlzCisgICBhbnkgc3RyaW5nKSBpcyBjYXNlIHNlbnNpdGl2ZSwgdW5saWtlIGFsbCBvdGhlciBtYWNybyBuYW1lcywgd2hpY2ggYXJlCisgICBjYXNlIGluZGVwZW5kZW50LiBUbyBpbGx1c3RyYXRlLCAiZmlsZTxvb2ZhLnR4dD4iIGFuZCAiZmlsZTxPT0ZBLlRYVD4iCisgICBhcmUgdHdvIGRpc3RpbmN0IG1hY3Jvcywgd2hlcmVhcyAiT09GQSIsICJPb2ZhIiwgYW5kICJvb2ZhIiwgd2hlbiB1c2VkCisgICBhcyBtYWNybyBuYW1lcywgYXJlIGFsbCB0aGUgc2FtZS4KKworICAgU2Vjb25kLCB0aGUgbmV3IFxmYWFjb252ZXJ0KCkgZnVuY3Rpb24gY29udmVydHMgYW4gYXNzb2NpYXRpdmUgYXJyYXkKKyAgICh0aGF0IGlzLCBhbGwgbWFjcm9zIHdpdGggbmFtZXMgb2YgdGhlIGZvcm0gImJhc2U8aW5kZXg+IiB0aGF0IGhhdmUKKyAgIHRoZSBzYW1lICJiYXNlIiBwYXJ0KSBpbnRvIGEgcGFpciBvZiByZWd1bGFyIGFycmF5cyBhbmQgcmV0dXJucyB0aGUKKyAgIG51bWJlciBvZiBlbGVtZW50czoKKworICBcZmFhY29udmVydChuYW1lLCZhWywmYl0pCisKKyAgICJuYW1lIiBpcyB0aGUgbmFtZSBvZiB0aGUgYXNzb2NpYXRpdmUgYXJyYXksIHdpdGhvdXQgdGhlIGFuZ2xlCisgICBicmFja2V0cyBvciBpbmRleCAoImZpbGUiIGluIG91ciBleGFtcGxlKS4KKworICAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiBhIHJlZ3VsYXIgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUKKyAgIHRoZSBpbmRpY2VzIG9mIHRoZSBhc3NvY2lhdGl2ZSBhcnJheSAoZmlsZW5hbWVzIGluIG91ciBleGFtcGxlKTsgaWYgYW4KKyAgIGFycmF5IG9mIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cywgaXQgaXMgZGVzdHJveWVkIHVubGVzcyB0aGUgYXJyYXkgaXMKKyAgIExPQ0FMLiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgYW5vdGhlciByZWd1bGFyIGFycmF5IGluCisgICB3aGljaCB0byBzdG9yZSB0aGUgdmFsdWVzICh0aGUgY291bnRzIGluIG91ciBleGFtcGxlKSwgd2l0aCB0aGUgc2FtZQorICAgcnVsZXMgYWJvdXQgYXJyYXkgbmFtZSBjb2xsaXNpb25zLiBJZiB5b3UgY2FyZSBvbmx5IGFib3V0IHRoZSBpbmRpY2VzCisgICBhbmQgbm90IHRoZSB2YWx1ZXMsIHlvdSBjYW4gb21pdCB0aGUgdGhpcmQgYXJndW1lbnQgdG8gXGZhYWNvbnZlcnQoKS4KKyAgIEluIGFueSBjYXNlLCB0aGUgYXNzb2NpYXRpdmUgYXJyYXkgaXMgY29udmVydGVkLCBub3QgY29waWVkOiBpdHMKKyAgIGVsZW1lbnRzIGFyZSBtb3ZlZCB0byB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgYXJyYXlzLCBzbyBhZnRlcgorICAgY29udmVyc2lvbiB0aGUgb3JpZ2luYWwgYXNzb2NpYXRpdmUgYXJyYXkgaXMgZ29uZS4KKworICAgQXMgd2l0aCBvdGhlciBhcnJheS1sb2FkaW5nIGZ1bmN0aW9ucywgXGZhYWNvbnZlcnQoKSBzZXRzIGVsZW1lbnQgMCBvZgorICAgZWFjaCBhcnJheSB0byB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KKworICAgVG8gY29udGludWUgb3VyIGV4YW1wbGU6CisKKyAgLm1heCA6PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IE1heGltdW0gY291bnQKKyAgLlwlbiA6PSBcZmFhY29udmVydChmaWxlLCZhLCZiKSAgICAgICAgICAgICA7IENvbnZlcnQKKyAgZm9yIFwlaSAxIFwlbiAxIHsgICAgICAgICAgICAgICAgICAgICAgICAgICA7IExvb3AgdGhyb3VnaCB2YWx1ZXMKKyAgICAgIGVjaG8gXGZscGFkKFwlaSwzKS4gXCZhW1wlaV06IFwmYltcJWldICA7IEVjaG8gdGhpcyBwYWlyCisgICAgICBpZiAoID4gXCZiW1wlaV0gXG0obWF4KSApIHsgICAgICAgICAgICAgOyBDaGVjayBmb3IgbmV3IG1heGltdW0KKyAgICAgICAgICAubmFtZSA6PSBcJmFbXCVpXQorICAgICAgICAgIC5tYXggIDo9IFwmYltcJWldCisgICAgICB9CisgIH0KKyAgZWNobyBNb3N0IHBvcHVsYXIgZmlsZTogXG0obmFtZSksIGFjY2Vzc2VzOiBcbShtYXgpCisKKyAgIFRoaXMgbGlzdHMgdGhlIGZpbGVzIGFuZCBjb3VudHMgYW5kIHRoZW4gYW5ub3VuY2VzIHdoaWNoIGZpbGUgaGFzIHRoZQorICAgaGlnaGVzdCBjb3VudC4KKworICAgTm93IHN1cHBvc2UgeW91IHdhbnQgdG8gc29ydCB0aGUgYXJyYXkgcGFpciBjcmVhdGVkIGZyb20gYW4KKyAgIGFzc29jaWF0aXZlIGFycmF5LiBJbiBvdXIgZXhhbXBsZSwgXCZhW10gY29udGFpbnMgZmlsZW5hbWVzLCBhbmQgXCZiW10KKyAgIGNvbnRhaW5zIHRoZSBhc3NvY2lhdGVkIGNvdW50cy4gSGVyZSB3ZSB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQVJSQVkKKyAgIFNPUlQgY29tbWFuZCdzIGFiaWxpdHkgdG8gc29ydCBhIHNlY29uZCBhcnJheSBhY2NvcmRpbmcgdG8gdGhlIGZpcnN0CisgICBvbmU6CisKKyAgYXJyYXkgc29ydCAvcmV2ZXJzZSAvbnVtZXJpYyAmYiAmYSAgICAgICAgICA7IERlc2NlbmRpbmcgc29ydCBieSBjb3VudAorCisgICBOb3cgdG8gc2VlIHRoZSB0b3AgZml2ZSBmaWxlcyBhbmQgdGhlaXIgY291bnRzOgorCisgIGVjaG8gVGhlIHRvcCA1IGZpbGVzIGFyZToKKyAgZm9yIFwlaSAxIDUgMSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IExvb3AgdGhyb3VnaCB0b3AgNSB2YWx1ZXMKKyAgICAgIGVjaG8gXGZscGFkKFwlaSwzKS4gXCZhW1wlaV06IFwmYltcJWldICA7IEVjaG8gdGhpcyBwYWlyCisgIH0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDcuMTAuMTEuIFRyYW5zZmVycmluZyBBcnJheSBDb250ZW50cyB0byBPdGhlciBDb21wdXRlcnMKKworICAgVGhlIFNFTkQgL0FSUkFZOmFycmF5bmFtZSBjb21tYW5kIChbNjA4XVNlY3Rpb24gNC43LjEpIGFsbG93cyB5b3UgdG8KKyAgIHNlbmQgdGhlIGNvbnRlbnRzIG9mIGFueSBhcnJheSwgb3IgYW55IGNvbnRpZ3VvdXMgc2VnbWVudCBvZiBpdCwgaW4KKyAgIGVpdGhlciB0ZXh0IG9yIGJpbmFyeSBtb2RlIHRvIGFub3RoZXIgY29tcHV0ZXIsIHVzaW5nIEtlcm1pdCBwcm90b2NvbC4KKyAgIFdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEMtS2VybWl0J3Mgb3RoZXIgZmVhdHVyZXMgKHRoZSBhcnJheQorICAgZmVhdHVyZXMgZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbjsgdGhlIGZpbGUgaS9vIHBhY2thZ2UgZnJvbQorICAgWzYwOV1TZWN0aW9uIDEuMjI7IGl0cyBkZWNpc2lvbi1tYWtpbmcsIHBhdHRlcm4tbWF0Y2hpbmcsIGFuZCBzdHJpbmcKKyAgIG1hbmlwdWxhdGlvbiBjYXBhYmlsaXRpZXMsIGFuZCBzbyBvbikgdGhlIHBvc3NpYmlsaXRpZXMgYXJlIGVuZGxlc3M6CisgICBleHRyYWN0cyBvZiBsYXJnZSBmaWxlcywgcmVtb3RlIGRhdGFiYXNlIHF1ZXJpZXMsIC4uLiwgYWxsIHdpdGhvdXQKKyAgIHJlY291cnNlIHRvIHN5c3RlbS1kZXBlbmRlbnQgbWVjaGFuaXNtcyBzdWNoIFVOSVggcGlwZXMgYW5kIGZpbHRlcnMsCisgICB0aHVzIGVuc3VyaW5nIGNyb3NzLXBsYXRmb3JtIHBvcnRhYmlsaXR5IG9mIHNjcmlwdHMgdGhhdCB1c2UgdGhlc2UKKyAgIGZlYXR1cmVzLgorCisgICBXaGVuIHNlbmRpbmcgYW4gYXJyYXkgaW4gdGV4dCBtb2RlLCBLZXJtaXQgYXBwZW5kcyBhIGxpbmUgdGVybWluYXRvcgorICAgdG8gZWFjaCBhcnJheSBlbGVtZW50LCBldmVuIGVtcHR5IG9uZXMsIGFuZCBpdCBhbHNvIGNvbnZlcnRzIHRoZQorICAgY2hhcmFjdGVyIHNldCBmcm9tIHlvdXIgY3VycmVudCBGSUxFIGNoYXJhY3Rlci1zZXQgdG8geW91ciBjdXJyZW50CisgICBUUkFOU0ZFUiBjaGFyYWN0ZXItc2V0LCBpZiBhbnkuIE5vIGNvbnZlcnNpb25zIGFyZSBtYWRlIG9yIGxpbmUKKyAgIHRlcm1pbmF0aW9ucyBhZGRlZCBpbiBiaW5hcnkgbW9kZS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgYXJyYXk6CisKKyAgZGNsIFwmYVtdID0gT25lIFR3byBUaHJlZSBGb3VyIEZpdmUgU2l4CisKKyAgIGlzIHNlbnQgYXMgc2l4IGxpbmVzLCBvbmUgd29yZCBwZXIgbGluZSwgaW4gdGV4dCBtb2RlLCBhbmQgYXMgdGhlIGJhcmUKKyAgIHVudGVybWluYXRlZCBzdHJpbmcgIk9uZVR3b1RocmVlRm91ckZpdmVTaXgiIGluIGJpbmFyeSBtb2RlLgorCisgICBZb3Ugc2hvdWxkIGFsd2F5cyBpbmNsdWRlIGEgL1RFWFQgb3IgL0JJTkFSWSBzd2l0Y2ggaW4gYW55IFNFTkQgL0FSUkFZCisgICBjb21tYW5kIHRvIGZvcmNlIHRoZSBkZXNpcmVkIHRyYW5zZmVyIG1vZGUsIG90aGVyd2lzZSB5b3UncmUgbGlrZWx5IHRvCisgICBiZSBzdXJwcmlzZWQgYnkgdGhlIGVmZmVjdHMgZGVzY3JpYmVkIGluIFs2MTBdU2VjdGlvbiA0LjMuCisKKyAgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisKKyAgIHNlbmQgL3RleHQgL2FycmF5OlwmYVtdCisgICAgICAgICAgU2VuZHMgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgYXJyYXkgXCZhW10gaW4gdGV4dCBtb2RlLgorICAgICAgICAgIFNpbmNlIGFuIGFzLW5hbWUgaXMgbm90IGluY2x1ZGVkLCB0aGUgcmVjZWl2ZXIgaXMgdG9sZCB0aGUKKyAgICAgICAgICBmaWxlbmFtZSBpcyBfYXJyYXlfYV8uCisKKyAgIHNlbmQgL3RleHQgL2FycmF5OiZhW10KKyAgIHNlbmQgL3RleHQgL2FycmF5OmFbXQorICAgc2VuZCAvdGV4dCAvYXJyYXk6JmEKKyAgIHNlbmQgL3RleHQgL2FycmF5OmEKKyAgICAgICAgICBUaGVzZSBhcmUgYWxsIGVxdWl2YWxlbnQgdG8gdGhlIHByZXZpb3VzIGV4YW1wbGUuCisKKyAgIHNlbmQgL3RleHQgL2FycmF5OiZhIC9hcy1uYW1lOmZvby5iYXIKKyAgICAgICAgICBBcyBhYm92ZSwgYnV0IHRoZSBhcnJheSBpcyBzZW50IHVuZGVyIHRoZSBuYW1lIGZvby5iYXIuCisKKyAgIHNlbmQgL3RleHQgL2FycmF5OiZhWzEwMDoxOTldIC9hczpmb28uYmFyCisgICAgICAgICAgQXMgYWJvdmUsIGJ1dCBvbmx5IHRoZSBlbGVtZW50cyBmcm9tIDEwMCB0aHJvdWdoIDE5OSBhcmUgc2VudC4KKworICAgSW4gdGV4dC1tb2RlIHRyYW5zZmVycywgY2hhcmFjdGVyIHNldHMgYXJlIHRyYW5zbGF0ZWQgYWNjb3JkaW5nIHRvCisgICB5b3VyIGN1cnJlbnQgc2V0dGluZ3MsIGp1c3QgYXMgZm9yIHRleHQgZmlsZXMuIEluIGJpbmFyeSBtb2RlLCBvZgorICAgY291cnNlLCB0aGVyZSBpcyBubyBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIG9yIG90aGVyIGNvbnZlcnNpb24gb2YKKyAgIGFueSBraW5kLiBCdXQgcmVtZW1iZXIgdGhhdCBhcnJheSBlbGVtZW50cyBjYW4gbm90IGNvbnRhaW4gdGhlIE5VTAorICAgKEFTQ0lJIDApIGNoYXJhY3Rlciwgc2luY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgYXMgTlVMLXRlcm1pbmF0ZWQKKyAgIHN0cmluZ3MuCisKKyAgIEhlcmUncyBhbiBleGFtcGxlIHRoYXQgc2hvd3MgaG93IHRvIHNlbmQgYWxsIHRoZSBsaW5lcyAodXAgdG8gMTAwMCBvZgorICAgdGhlbSkgZnJvbSBhIGZpbGUgYW5pbWFscy50eHQgdGhhdCBjb250YWluIHRoZSB3b3JkcyAiY2F0IiwgImRvZyIsIG9yCisgICAiaG9nIiAoc2VlIFs2MTFdU2VjdGlvbiA0LjkgYWJvdXQgcGF0dGVybiBtYXRjaGluZyk6CisKKyAgZGVjbGFyZSBcJmFbMTAwMF0KKyAgZm9wZW4gL3JlYWQgXCVjIGFuaW1hbHMudHh0CisgIGlmIGZhaWwgZXhpdCAxCisgIC5cJWkgPSAwCisgIHdoaWxlIHRydWUgeworICAgICAgZnJlYWQgXCVjIGxpbmUKKyAgICAgIGlmIGZhaWwgYnJlYWsKKyAgICAgIGlmIG1hdGNoIHtcbShsaW5lKX0geyp7Y2F0LFtkaF1vZ30qfSB7CisgICAgICAgICAgaW5jcmVtZW50IFwlaQorICAgICAgICAgIGlmICggPiBcJWkgXGZkaW0oJmEpICkgYnJlYWsKKyAgICAgICAgICAuXCZhW1wlaV0gOj0gXG0obGluZSkKKyAgICAgIH0KKyAgfQorICBmY2xvc2UgXCVjCisgIHNlbmQgL2FycmF5OmFbMTpcJWldIC90ZXh0CisKKyAgIE5vdGUgdGhhdCB3ZSBhcmUgY2FyZWZ1bCB0byBzZW5kIG9ubHkgdGhlIHBhcnQgb2YgdGhlIGFycmF5IHRoYXQgd2FzCisgICBmaWxsZWQsIG5vdCB0aGUgZW50aXJlIGFycmF5LCBiZWNhdXNlIHRoZXJlIGFyZSBsaWtlbHkgdG8gYmUgbG90cyBvZgorICAgdW51c2VkIGVsZW1lbnRzIGF0IHRoZSBlbmQsIGFuZCB0aGVzZSB3b3VsZCBiZSBzZW50IGFzIGJsYW5rIGxpbmVzCisgICBvdGhlcndpc2UuCisKKyAgIFRoaXMgZXhhbXBsZSByYWlzZXMgYW4gaW50ZXJlc3RpbmcgcXVlc3Rpb246IHdoYXQgaWYgd2Ugd2FudCB0byBzZW5kCisgICBBTEwgdGhlIG1hdGNoaW5nIGxpbmVzLCBldmVuIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMTAwMCBvZiB0aGVtLCBidXQKKyAgIHdlIGRvbid0IGtub3cgdGhlIG51bWJlciBpbiBhZHZhbmNlPyBDbGVhcmx5IHRoZSBwcm9ibGVtIGlzIGxpbWl0ZWQgYnkKKyAgIEtlcm1pdCdzIChhbmQgdGhlIGNvbXB1dGVyJ3MpIG1lbW9yeS4gSWYgdGhlcmUgYXJlIGEgdGhvdXNhbmQgdHJpbGxpb24KKyAgIG1hdGNoaW5nIGxpbmVzLCB0aGV5IG1vc3QgbGlrZWx5IHdpbGwgbm90IGZpdCBpbiBtZW1vcnksIGFuZCBpbiB0aGlzCisgICBjYXNlIHRoZSBvbmx5IHNvbHV0aW9uIGlzIHRvIHdyaXRlIHRoZW0gZmlyc3QgdG8gYSB0ZW1wb3JhcnkgZmlsZSBvbgorICAgbWFzcyBzdG9yYWdlIGFuZCB0aGVuIHNlbmQgdGhlIHRlbXBvcmFyeSBmaWxlIGFuZCBkZWxldGUgaXQKKyAgIGFmdGVyd2FyZHMuCisKKyAgIEhvd2V2ZXIsIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBsaWtlbHkgdG8gZml0IGluIG1lbW9yeSwgdGhlCisgICBvbmNlLWZhbWlsaWFyIHRlY2huaXF1ZSBvZiBpbml0aWFsIGFsbG9jYXRpb24gd2l0aCBleHRlbnRzIGNhbiBiZQorICAgdXNlZDoKKworICBpZiBtYXRjaCB7XG0obGluZSl9IHsqe2NhdCxbZGhdb2d9Kn0geworICAgICAgaW5jcmVtZW50IFwlaQorICAgICAgaWYgKCA+IFwlaSBcZmRpbSgmYSkgKSB7CisgICAgICAgICAgYXJyYXkgcmVzaXplIGEgXGZkaW0oJmEpKzEwMAorICAgICAgICAgIGlmIGZhaWwgc3RvcCAxIE1FTU9SWSBGVUxMCisgICAgICAgICAgZWNobyBORVcgRElNRU5TSU9OOiBcZmRpbSgmYSkKKyAgICAgIH0KKyAgICAgIC5cJmFbXCVpXSA6PSBcbShsaW5lKQorICB9CisKKyAgIFRoaXMgZ3Jvd3MgdGhlIGFycmF5IGluIGNodW5rcyBvZiAxMDAgYXMgbmVlZGVkLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDcuMTEuIE9VVFBVVCBDb21tYW5kIEltcHJvdmVtZW50cworCisgICBMSU5FT1VUIFsgdGV4dCBdCisgICAgICAgICAgVGhpcyBjb21tYW5kIGlzIGV4YWN0bHkgbGlrZSBPVVRQVVQsIGV4Y2VwdCBpdCBzdXBwbGllcyBhCisgICAgICAgICAgY2FycmlhZ2UgcmV0dXJuIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuICJsaW5lb3V0IGV4aXQiIGlzCisgICAgICAgICAgZXhhY3RseSB0aGUgc2FtZSBhcyAib3V0cHV0IGV4aXRcMTMiLgorCisgICBTRVQgT1VUUFVUIFNQRUNJQUwtRVNDQVBFUyB7IE9OLCBPRkYgfQorICAgICAgICAgIFRoaXMgY29tbWFuZCBsZXRzIHlvdSB0ZWxsIEMtS2VybWl0IHdoZXRoZXIgdG8gcHJvY2VzcyBcTiwgXEwsCisgICAgICAgICAgYW5kIFxCIHNwZWNpYWxseSBpbiBhbiBPVVRQVVQgY29tbWFuZCwgYXMgZGlzdGluY3QgZnJvbSBvdGhlciBcCisgICAgICAgICAgc2VxdWVuY2VzIChzdWNoIGFzIFwlYSwgXDEzLCBcdih0aW1lKSwgZXRjKS4gTm9ybWFsbHkgdGhlCisgICAgICAgICAgc3BlY2lhbCBlc2NhcGVzIGFyZSBoYW5kbGVkLiBVc2UgU0VUIE9VVFBVVCBTUEVDSUFMLUVTQ0FQRVMgT0ZGCisgICAgICAgICAgdG8gZGlzYWJsZSB0aGVtLgorCisgICBEaXNhYmxpbmcgc3BlY2lhbCBlc2NhcGVzIGlzIG5lY2Vzc2FyeSBpbiBzaXR1YXRpb25zIHdoZW4geW91IG5lZWQgdG8KKyAgIHRyYW5zbWl0IGxpbmVzIG9mIGRhdGEgYW5kIHlvdSBoYXZlIG5vIGNvbnRyb2wgb3ZlciB3aGF0IGlzIGluIHRoZQorICAgbGluZXMuIEZvciBleGFtcGxlLCBhIGZpbGUgb29mYS50eHQgdGhhdCBjb250YWluczoKKworICBUaGlzIGlzIGEgZmlsZQorICBJdCBoYXMgXCVhIHZhcmlhYmxlcyBpbiBpdAorICBBbmQgaXQgaGFzIFxCIGluIGl0LgorICBBbmQgaXQgaGFzIFxMIGluIGl0LgorICBBbmQgaXQgaGFzIFxOIGluIGl0LgorICBBbmQgdGhpcyBpcyB0aGUgbGFzdCBsaW5lLgorCisgICBjYW4gYmUgc2VudCBsaWtlIHRoaXM6CisKKyAgbG9jYWwgbGluZQorICBzZXQgb3V0cHV0IHNwZWNpYWwtZXNjYXBlcyBvZmYKKyAgZm9wZW4gL3JlYWQgXCVjIG9vZmEudHh0CisgIGlmIGZhaWwgc3RvcCAxIENhbid0IG9wZW4gb29mYS50eHQKKyAgd2hpbGUgc3VjY2VzcyB7CisgICAgICBmcmVhZCBcJWMgbGluZQorICAgICAgaWYgZmFpbCBicmVhaworICAgICAgOyBBZGQgZmlsdGVyaW5nIG9yIHByb2Nlc3NpbmcgY29tbWFuZHMgaGVyZS4uLgorICAgICAgb3V0cHV0IFxtKGxpbmUpXDEzCisgIH0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjEyLiBGdW5jdGlvbiBhbmQgVmFyaWFibGUgRGlhZ25vc3RpY3MKKworICAgSW4gQy1LZXJtaXQgNi4wIGFuZCBlYXJsaWVyLCB0aGUgb25seSBkaWFnbm9zdGljIHJldHVybmVkIGJ5IGEgZmFpbGluZworICAgZnVuY3Rpb24gY2FsbCB3YXMgYW4gZW1wdHkgdmFsdWUsIHdoaWNoIChhKSBjb3VsZCBub3QgYmUgZGlzdGluZ3Vpc2hlZAorICAgZnJvbSBhbiBlbXB0eSB2YWx1ZSByZXR1cm5lZCBieSBhIHN1Y2Nlc3NmdWwgZnVuY3Rpb24gY2FsbDsgKGIpIGRpZAorICAgbm90IGdpdmUgYW55IGluZGljYXRpb24gb2YgdGhlIGNhdXNlIG9mIGZhaWx1cmU7IGFuZCAoYykgZGlkIG5vdCBjYXVzZQorICAgdGhlIGVuY2xvc2luZyBzdGF0ZW1lbnQgdG8gZmFpbC4gQy1LZXJtaXQgNy4wIGNvcnJlY3RzIHRoZXNlCisgICBkZWZpY2llbmNpZXMuCisKKyAgIFNFVCBGVU5DVElPTiBESUFHTk9TVElDUyB7IE9OLCBPRkYgfQorICAgICAgICAgIHdoZW4gT04sIGFsbG93cyBidWlsdC1pbiBmdW5jdGlvbnMgdG8gcmV0dXJuIGRpYWdub3N0aWMKKyAgICAgICAgICBtZXNzYWdlcyB3aGVuIGltcHJvcGVybHkgcmVmZXJlbmNlZCwgaW5zdGVhZCBvZiBhbiBlbXB0eQorICAgICAgICAgIHN0cmluZy4gRlVOQ1RJT04gRElBR05PU1RJQ1MgYXJlIE9OIGJ5IGRlZmF1bHQuIFdoZW4gT0ZGLAorICAgICAgICAgIGltcHJvcGVybHkgcmVmZXJlbmNlZCBmdW5jdGlvbnMgY29udGludWUgdG8gcmV0dXJuIGFuIGVtcHR5CisgICAgICAgICAgc3RyaW5nLiBUaGlzIGNvbW1hbmQgYWxzbyBhZmZlY3RzIGJ1aWx0LWluIHZhcmlhYmxlczsgaW4gdGhpcworICAgICAgICAgIGNhc2UsIGFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQgb25seSBpZiB0aGUgdmFyaWFibGUgZG9lcworICAgICAgICAgIG5vdCBleGlzdC4gV2hlbiBGVU5DVElPTiBESUFHTk9TVElDUyBhcmUgT04sIHRoZSBlcnJvciBtZXNzYWdlCisgICAgICAgICAgaXMgYWxzbyBwcmludGVkLgorCisgICBGb3IgdmFyaWFibGVzLCB0aGUgb25seSBtZXNzYWdlIGlzOgorCisgIDxFUlJPUjpOT19TVUNIX1ZBUklBQkxFOlx2KG5hbWUpPgorCisgICB3aGVyZSAibmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIG5vbmV4aXN0ZW50IHZhcmlhYmxlLgorCisgICBGb3IgZnVuY3Rpb25zLCB0aGUgZGlhZ25vc3RpYyBtZXNzYWdlIGlzOgorCisgIDxFUlJPUjptZXNzYWdlOlxmbmFtZSgpPgorCisgICB3aGVyZSAibWVzc2FnZSIgaXMgcmVwbGFjZWQgYnkgYSBtZXNzYWdlLCBhbmQgIm5hbWUiIGlzIHJlcGxhY2VkIGJ5CisgICB0aGUgZnVuY3Rpb24gbmFtZSwgZS5nLiA8RVJST1I6QVJHX05PVF9OVU1FUklDOlxmbW9kKCk+LiBNZXNzYWdlcworICAgaW5jbHVkZToKKworICBBUkdfQkFEX0FSUkFZICAgICAgIEFuIGFyZ3VtZW50IGNvbnRhaW5zIGEgbWFsZm9ybWVkIGFycmF5IHJlZmVyZW5jZS4KKyAgQVJHX0JBRF9EQVRFICAgICAgICBBbiBhcmd1bWVudCBjb250YWlucyBhIG1hbGZvcm1lZCBkYXRlIGFuZC9vciB0aW1lLgorICBBUkdfQkFEX1BIT05FTlVNICAgIEFuIGFyZ3VtZW50IGNvbnRhaW5zIGEgbWFsZm9ybWVkIHRlbGVwaG9uZSBudW1iZXIuCisgIEFSR19CQURfVkFSSUFCTEUgICAgQW4gYXJndW1lbnQgY29udGFpbnMgYSBtYWxmb3JtZWQgXCV4IHZhcmlhYmxlLgorICBBUkdfSU5DT01QTEVURSAgICAgIEFuIGFyZ3VtZW50IGlzIGluY29tcGxldGUgKGUuZy4gYSBicm9rZW4gQmFzZTY0IHN0cmluZykuCisgIEFSR19FVkFMX0ZBSUxVUkUgICAgQW4gYXJndW1lbnQgY291bGQgbm90IGJlIGV2YWx1YXRlZCAoaW50ZXJuYWwgZXJyb3IpLgorICBBUkdfTk9UX0FSUkFZICAgICAgIEFuIGFyZ3VtZW50IHJlZmVyZW5jZXMgYW4gYXJyYXkgdGhhdCBpcyBub3QgZGVjbGFyZWQuCisgIEFSR19OT1RfTlVNRVJJQyAgICAgQW4gYXJndW1lbnQgdGhhdCBtdXN0IGJlIGludGVnZXIgY29udGFpbnMgbm9uLWRpZ2l0cy4KKyAgQVJHX05PVF9GTE9BVCAgICAgICBBbiBhcmd1bWVudCBoYXMgYmFkIGZsb2F0aW5nLXBvaW50IG51bWJlciBmb3JtYXQuCisgIEFSR19OT1RfVkFSSUFCTEUgICAgQW4gYXJndW1lbnQgdGhhdCBtdXN0IGJlIGEgdmFyaWFibGUgaXMgbm90IGEgdmFyaWFibGUuCisgIEFSR19PVVRfT0ZfUkFOR0UgICAgQW4gYXJndW1lbnQncyBudW1lcmljIHZhbHVlIGlzIHRvbyBiaWcgb3IgdG9vIHNtYWxsLAorICAgICAgICAgICAgICAgICAgICAgIG9yIGFuIGFyZ3VtZW50IGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycyAoZS5nLiBhIGhleAorICAgICAgICAgICAgICAgICAgICAgIG9yIEJhc2UtNjQgc3RyaW5nKS4KKyAgQVJHX1RPT19MT05HICAgICAgICBBbiBhcmd1bWVudCdzIHZhbHVlIGlzIHRvbyBsb25nLgorICBBUlJBWV9GQUlMVVJFICAgICAgIEZhaWx1cmUgdG8gY3JlYXRlIGFuIGFycmF5LgorICBESVZJREVfQllfWkVSTyAgICAgIEV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24gd291bGQgY2F1c2UgZGl2aXNpb24gYnkgemVyby4KKyAgRkxPQVRJTkdfUE9JTlRfT1AgICBFeGVjdXRpb24gZXJyb3IgaW4gYSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24uCisgIEZJTEVfTk9UX0ZPVU5EICAgICAgRmlsZW5hbWUgYXJndW1lbnQgbmFtZXMgYSBmaWxlIHRoYXQgY2FuJ3QgYmUgZm91bmQuCisgIEZJTEVfTk9UX1JFQURBQkxFICAgRmlsZW5hbWUgYXJndW1lbnQgaXMgbm90IGEgcmVndWxhciBmaWxlLgorICBGSUxFX05PVF9BQ0NFU1NJQkxFIEZpbGVuYW1lIGFyZ3VtZW50IG5hbWVzIGEgZmlsZSB0aGF0IGlzIHJlYWQtcHJvdGVjdGVkLgorICBGSUxFX0VSUk9SICAgICAgICAgIE90aGVyIGVycm9yIHdpdGggZmlsZW5hbWUgYXJndW1lbnQuCisgIEZJTEVfTk9UX09QRU4gICAgICAgQSBmaWxlIGZ1bmN0aW9uIHdhcyBnaXZlbiBhIGNoYW5uZWwgdGhhdCBpcyBub3Qgb3Blbi4KKyAgRklMRV9FUlJPUl8tbiAgICAgICBBIGZpbGUgZnVuY3Rpb24gZ290IGVycm9yIC1uIChbNjEyXVNlY3Rpb24gMS4yMikuCisgIExPT0tVUF9GQUlMVVJFICAgICAgRXJyb3IgbG9va2luZyB1cCBmdW5jdGlvbiAoc2hvdWxkbid0IGhhcHBlbikuCisgIE1BTExPQ19GQUlMVVJFICAgICAgRmFpbHVyZSB0byBhbGxvY2F0ZSBuZWVkZWQgbWVtb3J5IChzaG91bGRuJ3QgaGFwcGVuKS4KKyAgTkFNRV9BTUJJR1VPVVMgICAgICBUaGUgZnVuY3Rpb24gaXMgbm90IHVuaXF1ZWx5IGlkZW50aWZpZWQuCisgIE1JU1NJTkdfQVJHICAgICAgICAgQSByZXF1aXJlZCBhcmd1bWVudCBpcyBtaXNzaW5nLgorICBOT19TVUNIX0ZVTkNUSU9OICAgIEFuIGFyZ3VtZW50IHJlZmVyZW5jZXMgYSBmdW5jdGlvbiB0aGF0IGlzIG5vdCBkZWZpbmVkLgorICBOT19TVUNIX01BQ1JPICAgICAgIEFuIGFyZ3VtZW50IHJlZmVyZW5jZXMgYSBtYWNybyB0aGF0IGlzIG5vdCBkZWZpbmVkLgorICBSRVNVTFRfVE9PX0xPTkcgICAgIFRoZSByZXN1bHQgb2YgYSBmdW5jdGlvbiBpcyB0b28gbG9uZy4KKyAgVU5LTk9XTl9GVU5DVElPTiAgICBJbnRlcm5hbCBlcnJvciBsb2NhdGluZyBmdW5jdGlvbiAoc2hvdWxkbid0IGhhcHBlbikuCisKKyAgIEV4YW1wbGVzOgorCisgIGFzc2lnbiBcJW0gXGZtb2QoKQorICA/PEVSUk9SOk1JU1NJTkdfQVJHOlxmbW9kKCk+CisgIGVjaG8gIlxmY29udGVudHMoXCVtKSIKKyAgIjxFUlJPUjpNSVNTSU5HX0FSRzpcZm1vZCgpPiIKKyAgZWNobyBcZm1vZCgzLHgpCisgID88RVJST1I6QVJHX05PVF9OVU1FUklDOlxmbW9kKCk+CisgIGVjaG8gXGZtb2QoMyw0LTIqMikKKyAgPzxFUlJPUjpESVZJREVfQllfWkVSTzpcZm1vZCgpPgorCisgICBOb3RpY2UgdGhlIHVzZSBvZiBcZmNvbnRlbnRzKCkgaW4gZWNob2luZyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZSB0aGF0CisgICBjb250YWlucyBhIHJldHVybmVkIGVycm9yIG1lc3NhZ2UuIFRoYXQncyBiZWNhdXNlIHRoZSBlcnJvciBtZXNzYWdlCisgICBpbmNsdWRlcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgb3IgZnVuY3Rpb24gdGhhdCBmYWlsZWQsIHNvIHlvdSBtdXN0CisgICB1c2UgXGZjb250ZW50cygpIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBldmFsdWF0ZWQgYWdhaW4gLS0gb3RoZXJ3aXNlCisgICB0aGUgc2FtZSBlcnJvciB3aWxsIG9jY3VyLgorCisgICBUaGUgaGFuZGxpbmcgb2YgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGVycm9ycyBpcyBjb250cm9sbGVkIGJ5OgorCisgICBTRVQgRlVOQ1RJT04gRVJST1IgeyBPTiwgT0ZGIH0KKyAgICAgICAgICBUZWxscyB3aGV0aGVyIGludmFsaWQgZnVuY3Rpb24gY2FsbHMgb3IgdmFyaWFibGUgcmVmZXJlbmNlcworICAgICAgICAgIHNob3VsZCBjYXVzZSBjb21tYW5kIGVycm9ycy4gRlVOQ1RJT04gRVJST1IgaXMgT04gYnkgZGVmYXVsdC4KKyAgICAgICAgICBXaGVuIE9OLCBhbmQgYW4gZXJyb3IgaXMgZGlhZ25vc2VkIGluIGEgYnVpbHQtaW4gZnVuY3Rpb24gb3IKKyAgICAgICAgICB2YXJpYWJsZSwgdGhlIGNvbW1hbmQgdGhhdCBpbmNsdWRlcyB0aGUgZnVuY3Rpb24gY2FsbCBvcgorICAgICAgICAgIHZhcmlhYmxlIHJlZmVyZW5jZSBmYWlscy4gVGhlIGZhaWxpbmcgY29tbWFuZCBjYW4gYmUgaGFuZGxlZCBpbgorICAgICAgICAgIHRoZSBub3JtYWwgd2F5IHdpdGggSUYgRkFJTFVSRSAvIElGIFNVQ0NFU1MsIFNFVCBUQUtFIEVSUk9SLCBvcgorICAgICAgICAgIFNFVCBNQUNSTyBFUlJPUi4KKworICAgV2hlbiBGVU5DVElPTiBESUFHTk9TVElDUyBpcyBPRkYsIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuCisKKyAgIFNIT1cgU0NSSVBUUyBkaXNwbGF5cyB0aGUgY3VycmVudCBGVU5DVElPTiBESUFHTk9TVElDUyBhbmQgRVJST1IKKyAgIHNldHRpbmdzLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDcuMTMuIFJldHVybiBWYWx1ZSBvZiBNYWNyb3MKKworICAgSW4gQy1LZXJtaXQgNUEgYW5kIDYuMCwgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHJldHVybiBvbmUgbGV2ZWwgZnJvbSBhCisgICBtYWNybzogUkVUVVJOIHZhbHVlIGFuZCBFTkQgbnVtYmVyIHRleHQuIFdoZW4gUkVUVVJOIGlzIHVzZWQsIHRoZQorICAgdmFsdWUsIHdoaWNoIGNhbiBiZSBhIG51bWJlciBvciBhIHRleHQgc3RyaW5nLCBpcyBhc3NpZ25lZCB0bworICAgXHYocmV0dXJuKS4gV2hlbiBFTkQgd2FzIHVzZWQsIGhvd2V2ZXIsIFx2KHJldHVybikgd2FzIG5vdCBzZXQuCisgICBTVUNDRVNTL0ZBSUxVUkUgd2FzIHNldCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgbnVtYmVyIHdhcyB6ZXJvLCBhbmQKKyAgIHRoZSB0ZXh0IHdhcyBwcmludGVkLCBidXQgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgbnVtYmVyIHdhcyBsb3N0LgorCisgICBJbiBDLUtlcm1pdCA3LjAsIHRoZSBFTkQgbnVtYmVyIGlzIGF2YWlsYWJsZSBpbiB0aGUgXHYocmV0dXJuKQorICAgdmFyaWFibGUuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNy4xNC4gVGhlIEFTU0VSVCwgRkFJTCwgYW5kIFNVQ0NFRUQgQ29tbWFuZHMuCisKKyAgIFRoZSBBU1NFUlQgY29tbWFuZCBpcyBqdXN0IGxpa2UgdGhlIElGIGNvbW1hbmQsIGJ1dCB3aXRob3V0IGEgY29tbWFuZAorICAgdG8gZXhlY3V0ZS4gSXQgc2ltcGx5IHN1Y2NlZWRzIG9yIGZhaWxzLCBhbmQgdGhpcyBjYW4gYmUgdGVzdGVkIGJ5IGEKKyAgIHN1YnNlcXVlbnQgSUYgU1VDQ0VTUyBvciBJRiBGQUlMVVJFIGNvbW1hbmQuIEV4YW1wbGU6CisKKyAgQVNTRVJUID0gMSAxCisgIElGIFNVQ0NFU1MgZWNobyAxID0gMS4KKworICAgVGhlIEZBSUwgY29tbWFuZCBkb2VzIG5vdGhpbmcsIGJ1dCBhbHdheXMgZmFpbHMuIFRoZSBTVUNDRUVEIGNvbW1hbmQKKyAgIGRvZXMgbm90aGluZywgYnV0IGFsd2F5cyBzdWNjZWVkcy4KKworICAgVGhlc2UgY29tbWFuZHMgYXJlIGhhbmR5IGluIGRlYnVnZ2luZyBzY3JpcHRzIHdoZW4geW91IHdhbnQgdG8gaW5kdWNlCisgICBhIGZhaWx1cmUgKG9yIHN1Y2Nlc3MpIHRoYXQgbm9ybWFsbHkgd291bGQgbm90IG9jY3VyLCBlLmcuIGZvciB0ZXN0aW5nCisgICBibG9ja3Mgb2YgY29kZSB0aGF0IG5vcm1hbGx5IGFyZSBub3QgZXhlY3V0ZWQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNy4xNS4gVXNpbmcgQWxhcm1zCisKKyAgIEFsYXJtcyBtYXkgYmUgc2V0IGluIHR3byB3YXlzOgorCisgICBTRVQgQUxBUk0gbnVtYmVyCisgICAgICAgICAgU2V0cyBhbiBhbGFybSBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBzZWNvbmRzICJmcm9tIG5vdyIsIGkuZS4KKyAgICAgICAgICBpbiB0aGUgZnV0dXJlLCByZWxhdGl2ZSB0byB3aGVuIHRoZSBTRVQgQUxBUk0gY29tbWFuZCB3YXMKKyAgICAgICAgICBnaXZlbi4gRXhhbXBsZXM6CisKKyAgc2V0IGFsYXJtIDYwICAgICAgICA7IDYwIHNlY29uZHMgZnJvbSBub3cKKyAgc2V0IGFsYXJtICs2MCAgICAgICA7IFRoZSBzYW1lIGFzICI2MCIKKyAgc2V0IGFsYXJtIC02MCAgICAgICA7IE5vdCBsZWdhbCAtIHlvdSBjYW4ndCBzZXQgYW4gYWxhcm0gaW4gdGhlIHBhc3QuCisgIHNldCBhbGFybSA2MCo2MCAgICAgOyA2MCBtaW51dGVzIGZyb20gbm93LgorICBzZXQgYWxhcm0gXCVhKzEwICAgIDsgWW91IGNhbiB1c2UgdmFyaWFibGVzLCBldGMuCisKKyAgIFNFVCBBTEFSTSBoaDptbTpzcworICAgICAgICAgIFNldHMgYW4gYWxhcm0gZm9yIHRoZSBzcGVjaWZpZWQgdGltZS4gSWYgdGhlIGdpdmVuIHRpbWUgaXMKKyAgICAgICAgICBlYXJsaWVyIHRoYW4gdGhlIGN1cnJlbnQgdGltZSwgdGhlIGFsYXJtIGlzIHNldCBmb3IgdGhlIGdpdmVuCisgICAgICAgICAgdGltZSBpbiB0aGUgbmV4dCBkYXkuIFlvdSBtYXkgZ2l2ZSB0aGUgdGltZSBpbiB2YXJpb3VzIGZvcm1hdHM6CisKKyAgc2V0IGFsYXJtIDE1OjAwOjAwICA7IDM6MDA6MDBwbQorICBzZXQgYWxhcm0gMzowMDowMHBtIDsgMzowMDowMHBtCisgIHNldCBhbGFybSAzOjAwcG0gICAgOyAzOjAwOjAwcG0KKyAgc2V0IGFsYXJtIDNwbSAgICAgICA7IDM6MDA6MDBwbQorCisgICBTSE9XIEFMQVJNCisgICAgICAgICAgRGlzcGxheXMgdGhlIGN1cnJlbnQgYWxhcm0sIGlmIGFueSwgaW4gc3RhbmRhcmQgZGF0ZS10aW1lCisgICAgICAgICAgZm9ybWF0IChzZWUgWzYxM11TZWN0aW9uIDEuNik6IHl5eXltbWRkIGhoOm1tOnNzLgorCisgICBJRiBBTEFSTSBjb21tYW5kCisgICAgICAgICAgRXhlY3V0ZXMgdGhlIGNvbW1hbmQgaWYgYW4gYWxhcm0gaGFzIGJlZW4gc2V0IGFuZCB0aGUgYWxhcm0KKyAgICAgICAgICB0aW1lIGhhcyBwYXNzZWQuCisKKyAgIElGIEFMQVJNIHsgY29tbWFuZC1saXN0IH0gWyBFTFNFIHsgY29tbWFuZC1saXN0IH0gXQorICAgICAgICAgIEV4ZWN1dGVzIHRoZSBjb21tYW5kLWxpc3QgaWYgYW4gYWxhcm0gaGFzIGJlZW4gc2V0IGFuZCB0aGUKKyAgICAgICAgICBhbGFybSB0aW1lIGhhcyBwYXNzZWQuIE90aGVyd2lzZSwgaWYgYW4gRUxTRSBwYXJ0IGlzIGdpdmVuLCBpdHMKKyAgICAgICAgICBjb21tYW5kLWxpc3QgaXMgZXhlY3V0ZWQuCisKKyAgIENMRUFSIEFMQVJNCisgICAgICAgICAgQ2xlYXJzIHRoZSBhbGFybS4KKworICAgT25seSBvbmUgYWxhcm0gbWF5IGJlIHNldCBhdCBhIHRpbWUuCisKKyAgIEV4YW1wbGU6IFN1cHBvc2UgeW91IGhhdmUgYSBzY3JpcHQgdGhhdCBpcyBhbHdheXMgcnVubmluZywgYW5kIHRoYXQKKyAgIHRyYW5zZmVycyBmaWxlcyBwZXJpb2RpY2FsbHksIGFuZCB0aGF0IGtlZXBzIGEgdHJhbnNhY3Rpb24gbG9nLgorICAgU3VwcG9zZSB5b3Ugd2FudCB0byBzdGFydCBhIG5ldyB0cmFuc2FjdGlvbiBsb2cgZWFjaCBkYXk6CisKKyAgbG9nIHRyYW5zYWN0aW9ucyBcdihkYXRlKS5sb2cKKyAgc2V0IGFsYXJtIDAwOjAwOjAwICAgICAgICAgICAgICAgICAgICAgOyBTZXQgYW4gYWxhcm0gZm9yIG1pZG5pZ2h0CisgIHdoaWxlIHRydWUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTWFpbiBzY3JpcHQgbG9vcAorICAgICAgeGlmIGFsYXJtIHsgICAgICAgICAgICAgICAgICAgICAgICA7IElmIHRoZSBhbGFybSB0aW1lIGlzIHBhc3QuLi4KKyAgICAgICAgICBjbG9zZSB0cmFuc2FjdGlvbnMgICAgICAgICAgICAgOyBDbG9zZSBjdXJyZW50IGxvZworICAgICAgICAgIGxvZyB0cmFuc2FjdGlvbnMgXHYoZGF0ZSkubG9nICA7IFN0YXJ0IG5ldyBvbmUKKyAgICAgICAgICBwYXVzZSAxICAgICAgICAgICAgICAgICAgICAgICAgOyBUbyBtYWtlIHN1cmUgMDA6MDA6MDAgaXMgcGFzdAorICAgICAgICAgIHNldCBhbGFybSAwMDowMDowMCAgICAgICAgICAgICA7IFNldCBhIG5ldyBhbGFybQorICAgICAgfQorICAgICAgOyBwdXQgdGhlIHJlc3Qgb2YgdGhlIHNjcmlwdCBoZXJlLi4uCisgIH0KKworICAgTm90ZSB0aGF0IElGIEFMQVJNIC0tIG5vIG1hdHRlciB3aGV0aGVyIGl0IHN1Y2NlZWRzIG9yIGZhaWxzIC0tIGRvZXMKKyAgIE5PVCBjbGVhciBhbiBleHBpcmVkIGFsYXJtLiBUaHVzLCBvbmNlIGFuIGFsYXJtIGhhcyBleHBpcmVkLCBldmVyeSBJRgorICAgQUxBUk0gd2lsbCBzdWNjZWVkIHVudGlsIHRoZSBhbGFybSBpcyBjbGVhcmVkICh3aXRoIHRoZSBDTEVBUiBBTEFSTQorICAgY29tbWFuZCkgb3IgcmVzZXQgd2l0aCBhIG5ldyBTRVQgQUxBUk0gY29tbWFuZC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjE2LiBQYXNzaW5nIEFyZ3VtZW50cyB0byBDb21tYW5kIEZpbGVzCisKKyAgIEJlZ2lubmluZyBpbiB2ZXJzaW9uIDcuMCwgQy1LZXJtaXQgYWNjZXB0cyBhcmd1bWVudHMgb24gdGhlIFRBS0UKKyAgIGNvbW1hbmQgbGluZSwgZm9yIGV4YW1wbGU6CisKKyAgQy1LZXJtaXQ+IHRha2Ugb29mYS5rc2Mgb25lIHR3byB7dGhpcyBpcyB0aHJlZX0gZm91cgorCisgICBUaGlzIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgdmFyaWFibGVzIFwlMSB0aHJvdWdoIFwlOSB0byB0aGUKKyAgIGFyZ3VtZW50cywgYW5kIFwlMCB0byB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgaW4gdGhpcyBjYXNlOgorCisgIFwlMCA9IC91c3Ivb2xnYS9vb2ZhLmtzYworICBcJTEgPSBvbmUKKyAgXCUyID0gdHdvCisgIFwlMyA9IHRoaXMgaXMgdGhyZWUKKyAgXCU0ID0gZm91cgorCisgICBhbmQgXCU1Li5cJTkgYXJlIHVuZGVmaW5lZCAoZW1wdHkpLiBBcmd1bWVudHMgcGFzdCB0aGUgbmludGggYXJlCisgICBhdmFpbGFibGUgaW4gdGhlIFwmX1tdIGFyZ3VtZW50LXZlY3RvciBhcnJheSAoIFs2MTRdU2VjdGlvbiA3LjUpLgorCisgICBUaGUgdmFyaWFibGVzIGFyZSB0aG9zZSBhdCB0aGUgY3VycmVudCBtYWNybyBsZXZlbC4gVGh1cywgaWYgdGhlIFRBS0UKKyAgIGNvbW1hbmQgaXMgZXhlY3V0ZWQgZnJvbSB3aXRoaW4gYSBtYWNybywgdGhlIG1hY3JvJ3MgYXJndW1lbnRzIGFyZQorICAgcmVwbGFjZWQgYnkgdGhvc2UgZ2l2ZW4gb24gdGhlIFRBS0UgY29tbWFuZCBsaW5lIChidXQgb25seSBpZiBhdCBsZWFzdAorICAgb25lIGFyZ3VtZW50IGlzIGdpdmVuKS4gVGhlIGNvbW1hbmQgc2hvd24gYWJvdmUgaXMgZXhhY3RseSBlcXVpdmFsZW50CisgICB0bzoKKworICBhc3NpZ24gXCUwIC91c3Ivb2xnYS9vb2ZhLmtzYworICBhc3NpZ24gXCUxIG9uZQorICBhc3NpZ24gXCUyIHR3bworICBhc3NpZ24gXCUzIHRoaXMgaXMgdGhyZWUKKyAgYXNzaWduIFwlNCBmb3VyCisgIGFzc2lnbiBcJTUKKyAgYXNzaWduIFwlNgorICBhc3NpZ24gXCU3CisgIGFzc2lnbiBcJTgKKyAgYXNzaWduIFwlOQorICB0YWtlIG9vZmEua3NjCisKKyAgIFJlbWVtYmVyLCB0aGUgdmFyaWFibGVzIFwlMC4uXCU5IGFyZSBvbiB0aGUgbWFjcm8gY2FsbCBzdGFjaywgYW5kCisgICBjb21tYW5kIGZpbGVzIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgbWFjcm8gc3RhY2suIFRodXMsIGlmIGEgY29tbWFuZAorICAgZmlsZSBUQUtFcyBhbm90aGVyIGNvbW1hbmQgZmlsZSBhbmQgcGFzc2VzIGFyZ3VtZW50cyB0byBpdCwgdGhlCisgICB2YXJpYWJsZXMgYXJlIGNoYW5nZWQgZnJvbSB0aGF0IHBvaW50IG9uIGZvciBib3RoIGZpbGVzLCBhbmQgc28gZm9ydGgKKyAgIGZvciBhbGwgbGV2ZWxzIG9mIG5lc3RlZCBjb21tYW5kIGZpbGVzIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgbWFjcm8KKyAgIGludm9jYXRpb25zLgorCisgICBJdCB3b3VsZCBoYXZlIGJlZW4gcG9zc2libGUgdG8gY2hhbmdlIEMtS2VybWl0IHRvIHVzZSB0aGUgb3ZlcmFsbAorICAgY29tbWFuZCBzdGFjaywgcmF0aGVyIHRoYW4gdGhlIG1hY3JvIHN0YWNrLCBmb3IgYXJndW1lbnRzIC0tIHRoaXMKKyAgIHdvdWxkIGhhdmUgbWFkZSBUQUtFIHdvcmsgZXhhY3RseSBsaWtlIERPLCB3aGljaCBpcyAibmljZXIiLCBidXQgaXQKKyAgIHdvdWxkIGFsc28gaGF2ZSBicm9rZW4gY291bnRsZXNzIGV4aXN0aW5nIHNjcmlwdHMuIEhvd2V2ZXIsIHRoZSBuZXcKKyAgIFNISUZUIGNvbW1hbmQgKFs2MTVdU2VjdGlvbiA3LjUpIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNyZWF0ZSBhbgorICAgYWx0ZXJuYXRpdmUgVEFLRSBjb21tYW5kIHRoYXQgZG9lcyBpbmRlZWQgc2F2ZSBhbmQgcmVzdG9yZSB0aGUKKyAgIGFyZ3VtZW50IHZhcmlhYmxlcyBhdCBpdHMgb3duIGxldmVsIGFyb3VuZCBleGVjdXRpb24gb2YgYSBjb21tYW5kCisgICBmaWxlOgorCisgIGRlZmluZSBtdGFrZSB7CisgICAgIGxvY2FsIFwlZgorICAgICBhc3NpZ24gXCVmIFxmY29udGVudHMoXCUxKQorICAgICBzaGlmdAorICAgICB0YWtlIFwlZgorICB9CisKKyAgIEMtS2VybWl0IDcuMCBhbHNvIHN1cHBvcnRzIGEgbmV3LCBlYXNpZXIgd2F5IHRvIHBhc3MgYXJndW1lbnRzIHRvCisgICBzY3JpcHRzIGZyb20gdGhlIHN5c3RlbSBjb21tYW5kIGxpbmU6CisKKyAga2VybWl0IGZpbGVuYW1lIGFyZzEgYXJnMiBhcmczIC4uLgorCisgICBpbiB3aGljaCBhcmcxLCBhcmcyLCBhcmczIChldGMpIGFyZSBhcmd1bWVudHMgZm9yIHRoZSBzY3JpcHQgKHdob3NlCisgICBmaWxlbmFtZSBpcyBnaXZlbiksIGFuZCBhcmUgYXNzaWduZWQgdG8gXCUxLCBcJTIsIC4uLiBcJTkuIFRoZQorICAgZmlsZW5hbWUgaXMgYXNzaWduZWQgdG8gXCUwLiBUaGlzIGFwcGxpZXMgZXF1YWxseSB0byAiS2VyYmFuZyIgc2NyaXB0cworICAgaW4gVU5JWCAoWzYxNl1TZWN0aW9uIDcuMTkpLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGF2ZSBhIGZpbGUKKyAgIGNhbGxlZCAic2hvd2FyZ3MiIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBsaW5lczoKKworICAjIS91c3IvbG9jYWwvYmluL2tlcm1pdCArCisgIGVjaG8gSGVsbG8gZnJvbSBcJTAKKyAgc2hvdyBhcmdzCisgIGV4aXQKKworICAgKGV4Y2VwdCBub3QgaW5kZW50ZWQsIHNpbmNlIHRoZSAiIyEiIGxpbmUgbXVzdCBiZSBvbiB0aGUgbGVmdCBtYXJnaW4pLgorICAgSWYgeW91IGdpdmUgdGhpcyBmaWxlIGV4ZWN1dGUgcGVybWlzc2lvbjoKKworICBjaG1vZCAreCBzaG93YXJncworCisgICB0aGVuIHlvdSBjYW4gcnVuIGl0IGV4YWN0bHkgYXMgeW91IHdvdWxkIHJ1biBhIFVOSVggc2hlbGwgc2NyaXB0LAorICAgZS5nLjoKKworICAkIHNob3dhcmdzIG9uZSB0d28gdGhyZWUKKyAgSGVsbG8gZnJvbSAvdXNyL29sZ2Evc2hvd2FyZ3MKKyAgVG9wLWxldmVsIGFyZ3VtZW50cyAoXHYoYXJnYykgPSA0KToKKyAgIFwmX1swXSA9IC91c3Ivb2xnYS9zaG93YXJncworICAgXCZfWzFdID0gb25lCisgICBcJl9bMl0gPSB0d28KKyAgIFwmX1szXSA9IHRocmVlCisKKyAgIEZ1cnRoZXJtb3JlLCB0aGUgXCZfW10gYXJyYXkgbm93IGNvbnRhaW5zIHRoZSBmaWxlbmFtZSwgaWYgb25lIHdhcworICAgZ2l2ZW4gYXMgdGhlIGZpcnN0IGNvbW1hbmQgbGluZSBhcmd1bWVudCwgb3IgaXQgaXMgYSAiS2VyYmFuZyIgc2NyaXB0LAorICAgaW4gZWxlbWVudCAwLgorCisgICBPdGhlcndpc2UgZWxlbWVudCAwIGlzIHByb2dyYW0gbmFtZSwgYW5kIGVsZW1lbnRzIDEgdGhyb3VnaCBcdihhcmdjKS0xCisgICBjb250YWluIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBpZiBhbnksIHRoYXQgYXBwZWFyIGFmdGVyICItLSIgb3IKKyAgICI9IiwgaWYgYW55LiBUaGlzIGFycmF5IGlzIHNhdmVkIGFuZCByZXN0b3JlZCBhcm91bmQgbWFjcm8gY2FsbHM7CisgICByZWNhbGwgdGhhdCBpbnNpZGUgbWFjcm9zIGl0IGNvbnRhaW5zIHRoZSBtYWNybyBhcmd1bWVudCB2ZWN0b3IKKyAgIChhbGxvd2luZyB5b3UgdG8gYWNjZXNzIGFyZ3VtZW50cyBwcm9ncmFtbWF0aWNhbGx5LCBhbmQgdG8gaGF2ZSBtb3JlCisgICB0aGFuIDkgb2YgdGhlbSkuCisKKyAgIEF0IHRvcCBsZXZlbCwgbm90aWNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIFwmQFtdIGFuZCBcJl9bXQorICAgYXJyYXlzLiBUaGUgZm9ybWVyIGluY2x1ZGVzIEMtS2VybWl0IG9wdGlvbnM7IHRoZSBsYXR0ZXIgb21pdHMgdGhlbS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjE3LiBEaWFsb2dzIHdpdGggVGltZWQgUmVzcG9uc2VzCisKKyAgIFRoZSBBU0ssIEFTS1EsIEdFVE9LLCBhbmQgR0VUQyBjb21tYW5kcyAobGV0J3MgY2FsbCB0aGVtIHRoZQorICAgIkFTSy1jbGFzcyBjb21tYW5kcyIpIGxldCB5b3Ugd3JpdGUgc2NyaXB0cyB0aGF0IGNhcnJ5IG9uIGRpYWxvZ3Mgd2l0aAorICAgdGhlIHVzZXIsIGFza2luZyB0aGVtIGZvciB0ZXh0LCBhIFllcy9ObyBhbnN3ZXIsIG9yIGEgY2hhcmFjdGVyLAorICAgcmVzcGVjdGl2ZWx5LiBQcmlvciB0byBDLUtlcm1pdCA3LjAsIHRoZXNlIHF1ZXN0aW9ucyB3b3VsZCBhbHdheXMgd2FpdAorICAgZm9yZXZlciBmb3IgYW4gYW5zd2VyLiBJbiBDLUtlcm1pdCA3LjAsIHlvdSBtYXkgc3BlY2lmeSBhIHRpbWUgbGltaXQKKyAgIGZvciB0aGVtIHdpdGggdGhlIG5ldyBjb21tYW5kOgorCisgICBTRVQgQVNLLVRJTUVSIG51bWJlcgorICAgICAgICAgIFNldHMgYSB0aW1lLWxpbWl0IG9uIEFTSy1DTEFTUyBjb21tYW5kcyB0byB0aGUgZ2l2ZW4gbnVtYmVyIG9mCisgICAgICAgICAgc2Vjb25kcy4gSWYgdGhlIG51bWJlciBpcyAwIG9yIGxlc3MsIHRoZXJlIGlzIG5vIHRpbWUgbGltaXQgYW5kCisgICAgICAgICAgdGhlc2UgY29tbWFuZHMgd2FpdCBmb3JldmVyIGZvciBhIHJlc3BvbnNlLiBBbnkgdGltZXIgdGhhdCBpcworICAgICAgICAgIGVzdGFibGlzaGVkIGJ5IHRoaXMgY29tbWFuZCByZW1haW5zIGluIGVmZmVjdCBmb3IgYWxsIGZ1dHVyZQorICAgICAgICAgIEFTSy1jbGFzcyBjb21tYW5kcyB1bnRpbCBhbm90aGVyIFNFVCBBU0stVElNRVIgY29tbWFuZCBpcyBnaXZlbgorICAgICAgICAgIChlLmcuIHdpdGggYSB2YWx1ZSBvZiAwIHRvIGRpc2FibGUgQVNLIHRpbWVvdXRzKS4KKworICAgSUYgQVNLVElNRU9VVCBjb21tYW5kCisgICAgICAgICAgQW4gQVNLLWNsYXNzIGNvbW1hbmQgdGhhdCB0aW1lcyBvdXQgcmV0dXJucyBhIGZhaWx1cmUgc3RhdHVzLgorICAgICAgICAgIFlvdSBjYW4gdGVzdCBleHBsaWNpdGx5IGZvciBhIHRpbWVvdXQgd2l0aDoKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjE4LiBJbmNyZWFzZWQgRmxleGliaWxpdHkgb2YgU1dJVENIIENhc2UgTGFiZWxzCisKKyAgIFByaW9yIHRvIEMtS2VybWl0IDcuMCAvIEs5NSAxLjEuMTksIHRoZSBjYXNlIGxhYmVscyBpbiBTV0lUQ0gKKyAgIHN0YXRlbWVudHMgd2VyZSBzdHJpbmcgY29uc3RhbnRzLgorCisgICBOb3cgY2FzZSBsYWJlbHMgY2FuIGJlIHZhcmlhYmxlcywgZnVuY3Rpb24gY2FsbHMsIG9yIGFueSBtaXh0dXJlIG9mCisgICB0aGVzZSB3aXRoIGVhY2ggb3RoZXIgYW5kL29yIHdpdGggcmVndWxhciBjaGFyYWN0ZXJzLgorCisgICBGdXJ0aGVybW9yZSwgYWZ0ZXIgdGhlIGNhc2UgbGFiZWwgaXMgZXZhbHVhdGVkLCBpdCBpcyB0cmVhdGVkIG5vdCBhcyBhCisgICBzdHJpbmcgY29uc3RhbnQsIGJ1dCBhcyBhIHBhdHRlcm4gYWdhaW5zdCB3aGljaCB0aGUgU1dJVENIIHZhcmlhYmxlIGlzCisgICBtYXRjaGVkIChbNjE3XVNlY3Rpb24gNC45LjEpLgorCisgICBUaGlzIGludHJvZHVjZXMgYSBwb3NzaWJsZSBpbmNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyByZWxlYXNlcywKKyAgIHNpbmNlIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBpbiBjYXNlIGxhYmVscyBhcmUgbm8gbG9uZ2VyIHRha2VuCisgICBsaXRlcmFsbHk6CisKKyAgXCAqID8gWyB7CisKKyAgIEFueSBzY3JpcHRzIHRoYXQgcHJldmlvdXNseSBpbmNsdWRlZCBhbnkgb2YgdGhlc2UgY2hhcmFjdGVycyBpbiBjYXNlCisgICBsYWJlbHMgbXVzdCBub3cgcXVvdGUgdGhlbSB3aXRoIGJhY2tzbGFzaCAoXCkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNy4xOS4gIktlcmJhbmciIFNjcmlwdHMKKworICAgSW4gVU5JWCBvbmx5LCBLZXJtaXQgc2NyaXB0cyBjYW4gYmUgc3RvcmVkIGluIGZpbGVzIGFuZCBydW4KKyAgICJkaXJlY3RseSIsIHdpdGhvdXQgc3RhcnRpbmcgS2VybWl0IGZpcnN0IChhcyBub3RlZCBvbiBwYWdlIDQ2NyBvZiB0aGUKKyAgIG1hbnVhbCksIGp1c3QgYXMgYSBzaGVsbCBzY3JpcHQgY2FuIGJlICJydW4iIGFzIGlmIGl0IHdlcmUgYSBwcm9ncmFtLgorICAgVGhpcyBzZWN0aW9uIGFtcGxpZmllcyBvbiB0aGF0IGlkZWEgYSBiaXQsIGFuZCBwcmVzZW50cyBzb21lIG5ldworICAgYXNwZWN0cyBvZiB2ZXJzaW9uIDcuMCB0aGF0IG1ha2UgaXQgZWFzaWVyIHRvIHdyaXRlIGFuZCBydW4gS2VybWl0CisgICBzY3JpcHRzIGRpcmVjdGx5LgorCisgICAgIE5PVEU6IE9uIG5vbi1VTklYIHBsYXRmb3Jtcywgc3VjaCBhcyBWTVMgb3IgV2luZG93cywgS2VyYmFuZworICAgICBzY3JpcHRzIGNhbiBiZSBydW4gYXMgImtlcm1pdCArIHNjcmlwdGZpbGVuYW1lIGFyZzEgYXJnMiBhcmczIC4uLiIuCisgICAgIFdpbmRvd3MgOTUvOTgvTlQgZmlsZSBhc3NvY2lhdGlvbnMgZG8gbm90IGFsbG93IGZvciB0aGUgcGFzc2luZyBvZgorICAgICBwYXJhbWV0ZXJzLiBJbiBWTVMsIGhvd2V2ZXIsIHlvdSBjYW4gYWNoaWV2ZSB0aGUgS2VyYmFuZyBlZmZlY3QgYnkKKyAgICAgZGVmaW5pbmcgYSBzeW1ib2wsIGFzIGluIHRoaXMgZXhhbXBsZToKKworICAkIGF1dG90ZWxuZXQgOj09ICIkU1lTJFRPT0xTOktFUk1JVC5FWEUgKyBBVVRPVEVMTkVULktTQyIKKworICAgICBhbmQgdGhlbiBydW5uaW5nIHRoZSBzY3JpcHQgbGlrZSBhbnkgb3RoZXIgY29tbWFuZDoKKworICAkIGF1dG90ZWxuZXQgeHl6Y29ycC5jb20gbXl1c2VyaWQKKworICAgICBTZWUgWzYxOF1TZWN0aW9uIDkuMyBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlICIrIiBzeW1ib2wuCisKKyAgIFVOSVggc2hlbGwgc2NyaXB0cyBjYW4gc3BlY2lmeSB3aGljaCBzaGVsbCBzaG91bGQgcnVuIHRoZW0gYnkKKyAgIGluY2x1ZGluZyBhICJzaGViYW5nIiBsaW5lIGF0IHRoZSB0b3AsIGUuZy46CisKKyAgIyEvYmluL3NoCisKKyAgIChidXQgbm90IGluZGVudGVkOyB0aGUgc2hlYmFuZyBsaW5lIG11c3QgYmUgb24gdGhlIGxlZnQgbWFyZ2luKS4gVGhlCisgICB0ZXJtICJzaGViYW5nIiBpcyBhIGNvbnRyYWN0aW9uIG9mICJzaGVsbCIgYW5kICJiYW5nIi4gIkJhbmciIGlzIGEKKyAgIHNsYW5nIHdvcmQgZm9yIHRoZSBleGNsYW1hdGlvbiBtYXJrICgiISIpOyAic2hlYmFuZyIgaXRzZWxmIGlzIGFuCisgICBBbWVyaWNhbiBzbGFuZyB3b3JkIHVzZWQgaW4gaW4gdGhlIHBocmFzZSAidGhlIHdob2xlIHNoZWJhbmciLgorCisgICBXZSBjYW4gcnVuIEtlcm1pdCBzY3JpcHRzIGRpcmVjdGx5IHRvbywgYnkgaW5jbHVkaW5nIGEgInNoZWJhbmciIGxpbmUKKyAgIHRoYXQgbmFtZXMgS2VybWl0IGFzIHRoZSAic2hlbGwiOyB0aHVzIHdlIGNhbGwgdGhlc2UgIktlcmJhbmciCisgICBzY3JpcHRzLiBUaGlzIG1lY2hhbmlzbSBoYXMgYmVlbiBjb25zaWRlcmFibHkgc2ltcGxpZmllZCBpbiBDLUtlcm1pdAorICAgNy4wIHRvIGZhY2lsaXRhdGUgQy1LZXJtaXQncyB1c2UgYSBzY3JpcHRpbmcgdG9vbCBqdXN0IGxpa2UgYW55IG9mIHRoZQorICAgVU5JWCBzaGVsbHMgb3Igc2NyaXB0aW5nIGxhbmd1YWdlcy4gVGhlIHJ1bGVzIGFyZSB0aGUgc2FtZSBhcyBmb3IKKyAgIHNoZWxsIHNjcmlwdHM6CisKKyAgICAxLiBUaGUgZmlyc3QgbGluZSBvZiB0aGUgS2VybWl0IHNjcmlwdCBtdXN0IGJlZ2luIHdpdGggIiMhIgorICAgICAgIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBwcm9ncmFtIHRoYXQgd2lsbAorICAgICAgIGV4ZWN1dGUgdGhlIHNjcmlwdCAoaW4gdGhpcyBjYXNlLCBDLUtlcm1pdCByYXRoZXIgdGhhbiBhIFVOSVgKKyAgICAgICBzaGVsbCksIGZvbGxvd2VkIGJ5IGFueSBLZXJtaXQgY29tbWFuZC1saW5lIG9wdGlvbnMuIFRvIHN1cHByZXNzCisgICAgICAgZXhlY3V0aW9uIG9mIHRoZSBDLUtlcm1pdCBpbml0aWFsaXphdGlvbiBmaWxlIGFuZCB0byBtYWtlIGNvbW1hbmQKKyAgICAgICBsaW5lIGFyZ3VtZW50cyBhdmFpbGFibGUgdG8gdGhlIHNjcmlwdCwgdGhlIGZpbmFsIG9wdGlvbiBzaG91bGQgYmUKKyAgICAgICAiKyI6CisgICMhL3Vzci9sb2NhbC9iaW4va2VybWl0ICsKKyAgICAgICBTb21lIHVzZXJzIGhhdmUgcmVwb3J0ZWQgdGhhdCBpbiBzb21lIGNpcmN1bXN0YW5jZXMgYSBzcGFjZSBtaWdodAorICAgICAgIGJlIG5lY2Vzc2FyeSBhZnRlciB0aGUgcGx1cyBzaWduOyB0aGlzIGRlcGVuZHMgb24geW91ciBzaGVsbCAtLSBpdAorICAgICAgIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggS2VybWl0LiBJbiBtb3N0IGNhc2VzLCBubyBzcGFjZSBpcyBuZWVkZWQuCisgICAgMi4gVGhlIGZpbGUgbXVzdCBoYXZlIGV4ZWN1dGUgcGVybWlzc2lvbiAoZ3JhbnRlZCB2aWEgImNobW9kICt4CisgICAgICAgZmlsZW5hbWUiKS4KKworICAgV2hlbiBDLUtlcm1pdCBpcyBpbnZva2VkIGZyb20gYSBLZXJiYW5nIHNjcmlwdCAob3IgZnJvbSB0aGUgc3lzdGVtCisgICBwcm9tcHQgd2l0aCBhICIrIiBjb21tYW5kLWxpbmUgYXJndW1lbnQsIHdoaWNoIGFtb3VudHMgdG8gdGhlIHNhbWUKKyAgIHRoaW5nKSwgdGhlIGZvbGxvd2luZyBzcGVjaWFsIHJ1bGVzIGFwcGx5OgorCisgICAgMS4gVGhlIEMtS2VybWl0IGluaXRpYWxpemF0aW9uIGZpbGUgaXMgTk9UIGV4ZWN1dGVkIGF1dG9tYXRpY2FsbHkuIElmCisgICAgICAgeW91IHdhbnQgaXQgdG8gYmUgZXhlY3V0ZWQsIGluY2x1ZGUgYSBUQUtFIGNvbW1hbmQgZm9yIGl0IGluIHRoZQorICAgICAgIHNjcmlwdCwgZS5nLiAidGFrZSBcdihob21lKS5rZXJtcmMiLiAoSW4gcHJldmlvdXMgcmVsZWFzZXMsIHRoZQorICAgICAgIGluaXRpYWxpemF0aW9uIGZpbGUgd2FzIGFsd2F5cyBleGVjdXRlZCwgd2l0aCBubyB3YXkgdG8gcHJldmVudCBpdAorICAgICAgIGV4Y2VwdCBmb3IgdGhlIHVzZXIgdG8gaW5jbHVkZSBLZXJtaXQtc3BlY2lmaWMgY29tbWFuZCBsaW5lCisgICAgICAgb3B0aW9ucyB3aGljaCBoYWQgbm90aGluZyB0byBkbyB3aXRoIHRoZSBzY3JpcHQpLiBNYW55IHNjcmlwdHMKKyAgICAgICBoYXZlIG5vIG5lZWQgZm9yIHRoZSBzdGFuZGFyZCBLZXJtaXQgaW5pdGlhbGl6YXRpb24gZmlsZSwgd2hpY2ggaXMKKyAgICAgICBxdWl0ZSBsZW5ndGh5IGFuZCBub3Qgb25seSBkZWxheXMgc3RhcnR1cCBvZiB0aGUgc2NyaXB0LCBidXQgYWxzbworICAgICAgIHNwZXdzIGZvcnRoIG51bWVyb3VzIG1lc3NhZ2VzIHRoYXQgYXJlIG1vc3QgbGlrZWx5IHVucmVsYXRlZCB0bworICAgICAgIHRoZSBzY3JpcHQuCisgICAgMi4gSWYgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgaXMgbm90IGV4ZWN1dGVkLCBuZWl0aGVyIGlzIHlvdXIKKyAgICAgICBjdXN0b21pemF0aW9uIGZpbGUsIHNpbmNlIHRoZSBpbml0aWFsaXphdGlvbiBmaWxlIGlzIHRoZSBjb21tYW5kCisgICAgICAgZmlsZSBmcm9tIHdoaWNoIHRoZSBjdXN0b21pemF0aW9uIGZpbGUgaXMgVEFLRW4uIEFnYWluLCB5b3UgY2FuCisgICAgICAgaW5jbHVkZSBhIFRBS0UgY29tbWFuZCBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgaWYgZGVzaXJlZCwgb3IKKyAgICAgICBmb3IgdGhlIGN1c3RvbWl6YXRpb24gZmlsZSBieSBpdHNlbGYsIG9yIGZvciBhbnkgb3RoZXIgZmlsZS4KKyAgICAzLiBDLUtlcm1pdCBkb2VzIG5vdCBwcm9jZXNzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYXQgYWxsLiBJbnN0ZWFkLAorICAgICAgIGl0IHBhc3NlcyBhbGwgd29yZHMgb24gdGhlIGNvbW1hbmQgbGluZSBhZnRlciB0aGUgIisiIHRvIHRoZQorICAgICAgIHNjcmlwdCBhcyBcJTAgKHRoZSBzY3JpcHQgbmFtZSksIFwlMS4uXCU5ICh0aGUgZmlyc3QgbmluZQorICAgICAgIGFyZ3VtZW50cyksIGFzIHdlbGwgYXMgaW4gdGhlIGFyZ3VtZW50IHZlY3RvciBhcnJheSBcJl9bXS4gVGhlCisgICAgICAgdmFyaWFibGUgXHYoYXJnYykgaXMgc2V0IHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgIndvcmRzIiAoYXMgcGFzc2VkCisgICAgICAgYnkgdGhlIHNoZWxsIHRvIEtlcm1pdCkgaW5jbHVkaW5nIHRoZSBzY3JpcHQgbmFtZS4gUXVvdGluZyBhbmQKKyAgICAgICBncm91cGluZyBydWxlcyBhcmUgdGhvc2Ugb2YgdGhlIHNoZWxsLgorICAgIDQuIEF0IGFueSBwb2ludCB3aGVyZSB0aGUgc2NyaXB0IHRlcm1pbmF0ZXMsIGl0IG11c3QgaW5jbHVkZSBhbiBFWElUCisgICAgICAgY29tbWFuZCBpZiB5b3Ugd2FudCBpdCB0byBleGl0IGJhY2sgdG8gdGhlIHNoZWxsOyBvdGhlcndpc2UKKyAgICAgICBDLUtlcm1pdCBlbnRlcnMgaW50ZXJhY3RpdmUgcHJvbXB0aW5nIG1vZGUgd2hlbiB0aGUgc2NyaXB0CisgICAgICAgdGVybWluYXRlcy4gVGhlIEVYSVQgY29tbWFuZCBjYW4gaW5jbHVkZSBhIG51bWVyaWMgc3RhdHVzIHRvIGJlCisgICAgICAgcmV0dXJuZWQgdG8gdGhlIHNoZWxsICgwLCAxLCBldGMpLCBwbHVzIGFuIG9wdGlvbmFsIG1lc3NhZ2UuCisKKyAgIEhlcmUgaXMgYSBzaW1wbGUgS2VyYmFuZyBzY3JpcHQgdGhhdCBwcmludHMgaXRzIGFyZ3VtZW50czoKKworICAjL3Vzci9sb2NhbC9iaW4va2VybWl0ICsKKyAgZWNobyBIZWxsbyBmcm9tIFwlMAorICBmb3IgXCVpIDAgXHYoYXJnYyktMSAxIHsKKyAgICAgIGVjaG8gXCVpLiAiXCZfW1wlaV0iCisgIH0KKyAgZXhpdCAwCisKKyAgIFNhdmUgdGhpcyBmaWxlIGFzIChzYXkpICJzaG93YXJncyIsIHRoZW4gZ2l2ZSBpdCBleGVjdXRlIHBlcm1pc3Npb24KKyAgIGFuZCBydW4gaXQgKHRoZSBcJl9bXSBhcnJheSBpcyB0aGUgc2FtZSBhcyBcJTAuLlwlOSwgYnV0IGFsbG93cyB5b3UgdG8KKyAgIHJlZmVyIHRvIGFyZ3VtZW50IHZhcmlhYmxlcyBwcm9ncmFtbWF0aWNhbGx5OyBzZWUgWzYxOV1TZWN0aW9uIDcuNSkuCisgICAoWWVzLCB5b3UgY291bGQgc3Vic3RpdHV0ZSBTSE9XIEFSR1VNRU5UUyBmb3IgdGhlIGxvb3AuKQorCisgICQgY2htb2QgK3ggc2hvd2FyZ3MKKyAgJCAuL3Nob3dhcmdzIG9uZSAidGhpcyBpcyB0d28iIHRocmVlCisKKyAgIFRoZSBzY3JpcHQgZGlzcGxheXMgaXRzIGFyZ3VtZW50czoKKworICBIZWxsbyBmcm9tIC91c3Ivb2xnYS9zaG93YXJncworICAwLiAiL3Vzci9vbGdhL3Nob3dhcmdzIgorICAxLiAib25lIgorICAyLiAidGhpcyBpcyB0d28iCisgIDMuICJ0aHJlZSIKKyAgJAorCisgICBOb3RpY2UgdGhhdCBubyBiYW5uZXJzIG9yIGdyZWV0aW5ncyBhcmUgcHJpbnRlZCBhbmQgdGhhdCBzdGFydHVwIGlzCisgICBpbnN0YW50YW5lb3VzLCBqdXN0IGxpa2UgYSBzaGVsbCBzY3JpcHQuIEFsc28gbm90aWNlIHRoYXQgZ3JvdXBpbmcgb2YKKyAgIGFyZ3VtZW50cyBpcyBkZXRlcm1pbmVkIGJ5ICpzaGVsbCogcXVvdGluZyBydWxlcywgbm90IEtlcm1pdCBvbmVzLAorICAgc2luY2UgdGhlIGNvbW1hbmQgbGluZSBpcyBwYXJzZWQgYnkgdGhlIHNoZWxsIGJlZm9yZSBLZXJtaXQgZXZlciBzZWVzCisgICBpdC4KKworICAgT2YgY291cnNlIHlvdSBjYW4gcHV0IGFueSBjb21tYW5kcyBhdCBhbGwgaW50byBhIEtlcmJhbmcgc2NyaXB0LiBJdAorICAgY2FuIHJlYWQgYW5kIHdyaXRlIGZpbGVzLCBtYWtlIGNvbm5lY3Rpb25zLCB0cmFuc2ZlciBmaWxlcywgYW55dGhpbmcKKyAgIHRoYXQgS2VybWl0IGNhbiBkbyAtLSBiZWNhdXNlIGl0ICppcyogS2VybWl0LiBBbmQgb2YgY291cnNlLCBLZXJiYW5nCisgICBzY3JpcHRzIGNhbiBhbHNvIGJlIGV4ZWN1dGVkIGZyb20gdGhlIEtlcm1pdCBwcm9tcHQgKG9yIGZyb20gYW5vdGhlcgorICAgc2NyaXB0KSB3aXRoIGEgVEFLRSBjb21tYW5kOyB0aGUgS2VyYmFuZyBsaW5lIGlzIGlnbm9yZWQgc2luY2UgaXQKKyAgIHN0YXJ0cyB3aXRoICIjIiwgd2hpY2ggaXMgYSBjb21tZW50IGludHJvZHVjZXIgdG8gS2VybWl0IGp1c3QgYXMgaXQgaXMKKyAgIHRvIHRoZSBVTklYIHNoZWxsLiBJbiBWTVMgYW5kIG90aGVyIG5vbi1VTklYIHBsYXRmb3JtcywgdGhlIEtlcmJhbmcKKyAgIGxpbmUgaGFzIG5vIGVmZmVjdCBhbmQgY2FuIGJlIG9taXR0ZWQuCisKKyAgIEl0IG1pZ2h0IGJlIGRlc2lyZWFibGUgZm9yIGEgc2NyaXB0IHRvIGtub3cgd2hldGhlciBpdCBoYXMgYmVlbgorICAgaW52b2tlZCBkaXJlY3RseSBmcm9tIHRoZSBzaGVsbCAoYXMgYSBLZXJiYW5nIHNjcmlwdCkgb3IgYnkgYSBUQUtFCisgICBjb21tYW5kIGdpdmVuIHRvIHRoZSBLZXJtaXQgcHJvbXB0IG9yIGluIGEgS2VybWl0IGNvbW1hbmQgZmlsZSBvcgorICAgbWFjcm8uIFRoaXMgY2FuIGJlIGRvbmUgYXMgaW4gdGhpcyBleGFtcGxlOgorCisgICMhL3Vzci9sb2NhbC9iaW4va2VybWl0ICsKKyAgYXNzaWduIFwlbSBcZmJhc2VuYW1lKFwlMCkKKyAgZGVmaW5lIHVzYWdlIHsgZXhpdCAxIHt1c2FnZTogXCVtIHBob25lbnVtYmVyIG1lc3NhZ2V9IH0KKyAgZGVmaW5lIGFwYWdlIHsgKGRlZmluaXRpb24gb2YgQVBBR0UuLi4pIH0gOyAoU2VlIFs2MjBdYm9vayBwcC40NTQtNDU2KQorICB4aWYgZXF1YWwgIlwlMCIgIlx2KGNtZGZpbCkiIHsKKyAgICAgIGlmIG5vdCBkZWYgXCUxIHVzYWdlCisgICAgICBpZiBub3QgZGVmIFwlMiB1c2FnZQorICAgICAgYXBhZ2Uge1wlMX0ge1wlMn0KKyAgICAgIGV4aXQgXHYoc3RhdHVzKQorICB9CisKKyAgIEluIGEgS2VyYmFuZyBzY3JpcHQsIFwlMCBhbmQgXHYoY21kZmlsZSkgYXJlIHRoZSBzYW1lOyBib3RoIG9mIHRoZW0KKyAgIGFyZSB0aGUgbmFtZSBvZiB0aGUgc2NyaXB0LiBXaGVuIGEgc2NyaXB0IGlzIGludm9rZWQgYnkgYSBLZXJtaXQgVEFLRQorICAgY29tbWFuZCwgXCUwIGlzIHRoZSBuYW1lIG9mIHRoZSBLZXJtaXQgcHJvZ3JhbSwgYnV0IFx2KGNtZGZpbGUpIGlzIHRoZQorICAgbmFtZSBvZiB0aGUgc2NyaXB0LiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgYSBtYWNybyBjYWxsZWQgQVBBR0UgaXMKKyAgIGRlZmluZWQuIElmIHRoZSBzY3JpcHQgd2FzIGludm9rZWQgZGlyZWN0bHksIHRoZSBBUEFHRSBtYWNybyBpcyBhbHNvCisgICBleGVjdXRlZC4gT3RoZXJ3aXNlLCBpdCBpcyBhdmFpbGFibGUgZm9yIHN1YnNlcXVlbnQgYW5kIHBlcmhhcHMKKyAgIHJlcGVhdGVkIHVzZSBsYXRlciBpbiB0aGUgS2VybWl0IHNlc3Npb24uCisKKyAgIEFuIGVzcGVjaWFsbHkgaGFuZHkgdXNlIGZvciBLZXJiYW5nIHNjcmlwdHMgaXMgdG8gaGF2ZSB0aGUKKyAgIGluaXRpYWxpemF0aW9uIGZpbGUgaXRzZWxmIGJlIG9uZS4gU2luY2UgdGhlIHN0YW5kYXJkIGluaXRpYWxpemF0aW9uCisgICBmaWxlIGlzIHJhdGhlciBsb25nIGFuZCB0aW1lLWNvbnN1bWluZyB0byBleGVjdXRlLCBpdCBpcyBvZnRlbgorICAgb3ZlcmtpbGwgaWYgeW91IHdhbnQgdG8gc3RhcnQgS2VybWl0IGp1c3QgdG8gdHJhbnNmZXIgYSBmaWxlLiBPZgorICAgY291cnNlIHRoZXJlIGFyZSBjb21tYW5kLWxpbmUgc3dpdGNoZXMgdG8gc3VwcHJlc3MgaW5pdGlhbGl6YXRpb24tZmlsZQorICAgZXhlY3V0aW9uLCBldGMsIGJ1dCBhbm90aGVyIGFwcHJvYWNoIGlzIHRvICJydW4iIHRoZSBpbml0aWFsaXphdGlvbgorICAgZmlsZSB3aGVuIHlvdSB3YW50IGl0cyBmZWF0dXJlcyAobm90YWJseSB0aGUgc2VydmljZXMgZGlyZWN0b3J5KSwgYW5kCisgICBydW4gQy1LZXJtaXQgZGlyZWN0bHkgd2hlbiB5b3UgZG9uJ3QuIEEgc2V0dXAgbGlrZSB0aGlzIHJlcXVpcmVzIHRoYXQKKyAgIChhKSB0aGUgQy1LZXJtaXQgaW5pdGlhbGl6YXRpb24gZmlsZSBpcyBjb25maWd1cmVkIGFzIGEgS2VyYmFuZyBzY3JpcHQKKyAgIChoYXMgIyEvcGF0aC4uLi9rZXJtaXQgYXMgZmlyc3QgbGluZSksIGhhcyBleGVjdXRlIHBlcm1pc3Npb24sIGFuZCBpcworICAgaW4geW91ciBQQVRIOyBhbmQgKGIpIHRoYXQgeW91IGRvbid0IGhhdmUgYSAua2VybXJjIGZpbGUgaW4geW91ciBsb2dpbgorICAgZGlyZWN0b3J5LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDcuMjAuIElGIGFuZCBYSUYgU3RhdGVtZW50IFN5bnRheAorCisgICBUaGUgSUYgY29tbWFuZCBoYXMgYmVlbiBpbXByb3ZlZCBpbiB0d28gc2lnbmlmaWNhbnQgd2F5cyBpbiBDLUtlcm1pdAorICAgNy4wLCBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBzdWJzZWN0aW9ucy4gQWxsIGNoYW5nZXMgYXJlIGJhY2t3YXJkcworICAgY29tcGF0aWJsZS4KKworICAgIDcuMjAuMS4gVGhlIElGL1hJRiBEaXN0aW5jdGlvbgorCisgICBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBJRiBhbmQgWElGIGlzIG5vIGxvbmdlciBpbXBvcnRhbnQgYXMgb2YKKyAgIEMtS2VybWl0IDcuMC4gWW91IHNob3VsZCBiZSBhYmxlIHRvIHVzZSBJRiBpbiBhbGwgY2FzZXMgKGFuZCBvZgorICAgY291cnNlLCBhbHNvIFhJRiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLiBJbiB0aGUgcGFzdCwgSUYgd2FzCisgICB1c2VkIGZvciBzaW5nbGUtY29tbWFuZCBUSEVOIHBhcnRzLCBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IGEgc2VwYXJhdGUKKyAgIEVMU0UgY29tbWFuZDoKKworICBJRiBjb25kaXRpb24gY29tbWFuZDEgICAgOyBUSEVOIHBhcnQKKyAgRUxTRSBjb21tYW5kMiAgICAgICAgICAgIDsgRUxTRSBwYXJ0CisKKyAgIHdoZXJlYXMgWElGIHdhcyByZXF1aXJlZCBpZiBlaXRoZXIgcGFydCBoYWQgbXVsdGlwbGUgY29tbWFuZHM6CisKKyAgWElGIGNvbmRpdGlvbiB7IGNvbW1hbmQsIGNvbW1hbmQsIC4uLiB9IEVMU0UgeyBjb21tYW5kLCBjb21tYW5kLCAuLi4gfQorCisgICBUaGUgc3ludGFjdGljIGRpZmZlcmVuY2VzIHdlcmUgcHJpbWFyaWx5IHRoYXQgSUYgLyBFTFNFIHdhcyB0d28KKyAgIGNvbW1hbmRzIG9uIHR3byBzZXBhcmF0ZSBsaW5lcywgd2hlcmVhcyBYSUYgd2FzIG9uZSBjb21tYW5kIG9uIG9uZQorICAgbGluZSwgYW5kIHRoYXQgWElGIGFsbG93ZWQgKGFuZCBpbiBmYWN0IHJlcXVpcmVkKSBicmFjZXMgYXJvdW5kIGl0cworICAgY29tbWFuZCBsaXN0cywgd2hlcmVhcyBJRiBkaWQgbm90IGFsbG93IHRoZW0uCisKKyAgIEZ1cnRoZXJtb3JlLCB0aGUgY2hhaW5pbmcgb3IgbmVzdGluZyBvZiBwYXJ0cyBhbmQgY29uZGl0aW9ucyB3YXMKKyAgIGluY29uc2lzdGVudC4gRm9yIGV4YW1wbGUsIHRoZSBJRiBjb21tYW5kIGNvdWxkIGJlIHVzZWQgbGlrZSB0aGlzOgorCisgIElGIGNvbmRpdGlvbiBjb21tYW5kCisgIEVMU0UgSUYgY29uZGl0aW9uIGNvbW1hbmQKKyAgRUxTRSBJRiBjb25kaXRpb24gY29tbWFuZAorICBFTFNFIElGIGNvbmRpdGlvbiBjb21tYW5kCisgIC4uLgorCisgICBidXQgWElGIGNvdWxkIG5vdC4gQy1LZXJtaXQgNy4wIGFjY2VwdHMgdGhlIG9sZCBzeW50YXggYW5kIGV4ZWN1dGVzIGl0CisgICB0aGUgc2FtZSBhcyBwcmV2aW91cyB2ZXJzaW9ucywgYnV0IGFsc28gYWNjZXB0cyBhIG5ldyB1bmlmaWVkIGFuZCBtb3JlCisgICBjb252ZW5pZW50IHN5bnRheDoKKworICAgSUYgY29uZGl0aW9uIGNvbW1hbmQtbGlzdCBbIEVMU0UgY29tbWFuZC1saXN0IF0KKworICAgb3I6CisKK0lGIGNvbmRpdGlvbiBjb21tYW5kLWxpc3QKK0VMU0UgY29tbWFuZC1saXN0CisKKyAgIGluIHdoaWNoIHRoZSBFTFNFIHBhcnQgaXMgb3B0aW9uYWwsIGFuZCB3aGVyZSBjb21tYW5kLWxpc3QgY2FuIGJlIGEKKyAgIHNpbmdsZSBjb21tYW5kICh3aXRoIG9yIHdpdGhvdXQgYnJhY2VzIGFyb3VuZCBpdCkgb3IgYSBsaXN0IG9mCisgICBjb21tYW5kcyBlbmNsb3NlZCBpbiBicmFjZXMuIEV4YW1wbGVzOgorCisgICBFeGFtcGxlIDE6CisKKyAgSUYgY29uZGl0aW9uIHsgY29tbWFuZDEsIGNvbW1hbmQyIH0gRUxTRSB7IGNvbW1hbmQzLCBjb21tYW5kNCB9CisKKyAgIEV4YW1wbGUgMiAoc2FtZSBhcyBFeGFtcGxlIDEpOgorCisgIElGIGNvbmRpdGlvbiB7CisgICAgIGNvbW1hbmQxCisgICAgIGNvbW1hbmQyCisgIH0gRUxTRSB7CisgICAgIGNvbW1hbmQzCisgICAgIGNvbW1hbmQ0CisgIH0KKworICAgRXhhbXBsZSAzIChzYW1lIGFzIDEgYW5kIDIpOgorCisgIElGIGNvbmRpdGlvbiB7CisgICAgIGNvbW1hbmQxCisgICAgIGNvbW1hbmQyCisgIH0KKyAgRUxTRSB7IGNvbW1hbmQzLCBjb21tYW5kNCB9CisKKyAgIEV4YW1wbGUgNCAoc2FtZSBhcyAxLTMpOgorCisgIElGIGNvbmRpdGlvbiB7CisgICAgIGNvbW1hbmQxCisgICAgIGNvbW1hbmQyCisgIH0KKyAgRUxTRSB7CisgICAgIGNvbW1hbmQzCisgICAgIGNvbW1hbmQ0CisgIH0KKworICAgRXhhbXBsZSA1IChFTFNFIGNhbiBiZSBmb2xsb3dlZCBieSBhbm90aGVyIGNvbW1hbmQpOgorCisgIElGIGNvbmRpdGlvbiB7CisgICAgIGNvbW1hbmQxCisgICAgIGNvbW1hbmQyCisgIH0gRUxTRSBJRiBjb25kaXRpb24geworICAgICBjb21tYW5kMworICAgICBjb21tYW5kNAorICB9IEVMU0UgeworICAgICBjb21tYW5kNQorICAgICBjb21tYW5kNgorICB9CisKKyAgIEV4YW1wbGUgNSBzdWdnZXN0cyBvdGhlciBwb3NzaWJpbGl0aWVzOgorCisgIElGIGNvbmRpdGlvbiB7CisgICAgIGNvbW1hbmQxCisgICAgIGNvbW1hbmQyCisgIH0gRUxTRSBGT1IgdmFyaWFibGUgaW5pdGlhbCBmaW5hbCBpbmNyZW1lbnQgeworICAgICBjb21tYW5kMworICAgICBjb21tYW5kNAorICB9CisKKyAgIEFuZCB0aGlzIHRvbyBpcyBwb3NzaWJsZSwgZXhjZXB0IGZvciBzb21lIG5vbi1vYnZpb3VzIHF1b3RpbmcKKyAgIGNvbnNpZGVyYXRpb25zOgorCisgIGRjbCBcJmFbNl0gPSBvbmUgdHdvIHRocmVlIGZvdXIgZml2ZSBzaXgKKworICBJRiA8IFwlbiAzIHsKKyAgICAgIGVjaG8gXFwlbiBpcyB0b28gc21hbGw6IFwlbgorICB9IEVMU0UgRk9SIFxcJWkgMSBcXCVuIDEgeworICAgICAgZWNobyBcXCVpLiBcXCZhW1xcJWldCisgIH0KKworICAgKFRoZSBsb29wIHZhcmlhYmxlIG11c3QgYmUgcXVvdGVkIGluIHRoaXMgY29udGV4dCB0byBwcmV2ZW50IHByZW1hdHVyZQorICAgZXZhbHVhdGlvbi4pCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA3LjIwLjIuIEJvb2xlYW4gRXhwcmVzc2lvbnMgKFRoZSBJRi9XSElMRSBDb25kaXRpb24pCisKKyAgIFByaW9yIHRvIEMtS2VybWl0IDcuMCwgdGhlIElGIGFuZCBXSElMRSBjb21tYW5kcyBhY2NlcHRlZCBvbmx5IGEKKyAgIHNpbmdsZSBCb29sZWFuICgidHJ1ZSBvciBmYWxzZSIpIGFzc2VydGlvbiwgZS5nLiAiaWYgPiBcJW0gMCBjb21tYW5kIgorICAgb3IgImlmIGV4aXN0IGZpbGVuYW1lIGNvbW1hbmQiLiBUaGVyZSB3YXMgbm8gd2F5IHRvIGZvcm0gQm9vbGVhbgorICAgZXhwcmVzc2lvbnMgYW5kLCBpbiBwYXJ0aWN1bGFyLCBub3RoaW5nIHRoYXQgYXBwcm9hY2hlZCBhIEJvb2xlYW4gT1IKKyAgIGZ1bmN0aW9uIChBTkQgY291bGQgYmUgc2ltdWxhdGVkIGJ5IGNvbmNhdGVuYXRpbmcgSUYgc3RhdGVtZW50czogImlmCisgICBjb25kaXRpb24xIGlmIGNvbmRpdGlvbjIuLiIpLgorCisgICBDLUtlcm1pdCA3LjAgKGFuZCBLOTUgMS4xLjE5KSBhbGxvdyBncm91cGluZyBvZiBCb29sZWFuIGFzc2VydGlvbnMKKyAgIHVzaW5nIHBhcmVudGhlc2VzIGFuZCBjb21iaW5pbmcgdGhlbSB1c2luZyBBTkQgKG9yICYmKSBhbmQgT1IgKG9yIHx8KS4KKyAgIEVhY2ggb2YgdGhlc2Ugb3BlcmF0b3JzIC0tIGluY2x1ZGluZyB0aGUgcGFyZW50aGVzZXMgLS0gaXMgYSBmaWVsZCBhbmQKKyAgIG11c3QgYmUgc2V0IG9mZiBieSBzcGFjZXMuIEFORCBoYXMgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBPUiwgTk9UIGhhcworICAgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBBTkQsIGJ1dCBwYXJlbnRoZXNlcyBjYW4gYmUgdXNlZCB0byBmb3JjZSBhbnkKKyAgIGRlc2lyZWQgb3JkZXIgb2YgZXZhbHVhdGlvbi4gVGhlIG9sZCBzeW50YXggaXMgc3RpbGwgYWNjZXB0ZWQuCisKKyAgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisKKyAgZGVmaW5lIFwleiAwICAgICAgICAgICAgICAgICAgICAgICAgICA7IERlZmluZSBzb21lIHZhcmlhYmxlcworICBkZWZpbmUgXCVuIDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZm9yIHVzZSBpbiB0aGUgZXhhbXBsZXMuCisKKyAgaWYgPiBcJW4gXCV6IGVjaG8gXCVuIGlzIGdyZWF0ZXIuICAgICA7IE9yaWdpbmFsIGZvcm1hdCAtIHN0aWxsIGFjY2VwdGVkLgorICBpZiAoID4gXCVuIFwleiApIGVjaG8gXCVuIGlzIGdyZWF0ZXIuIDsgUGFyZW50aGVzZXMgbWF5IGJlIHVzZWQgaW4gNy4wLgorICBpZiAoID4gXCVuIFwleiAmJiBub3QgPSBcJXogMCApIC4uLiAgIDsgVHdvIGFzc2VydGlvbnMgY29tYmluZWQgd2l0aCBBTkQuCisgIGlmICggPiBcJW4gXCV6IGFuZCBub3QgPSBcJXogMCApIC4uLiAgOyBTYW1lIGFzIHByZXZpb3VzICgiYW5kIiA9ICImJiIpLgorICBpZiAoID4gXCVuIFwleiB8fCBub3QgPSBcJXogMCApIC4uLiAgIDsgVHdvIGFzc2VydGlvbnMgY29tYmluZWQgd2l0aCBPUi4KKyAgaWYgKCA+IFwlbiBcJXogb3Igbm90ID0gXCV6IDAgKSAuLi4gICA7IFNhbWUgYXMgcHJldmlvdXMgKCJvciIgPSAifHwiKS4KKyAgaWYgKCA+IFwlbiBcJXogfHwgIT0gXCV6IDAgKSAuLi4gICAgICA7IERpdHRvICgiIT0iID0gIm5vdCA9IikuCisgIHdoaWxlICggMSApIHsgLi4uIH0gICAgICAgICAgICAgICAgICAgOyBKdXN0IGxpa2UgQy4KKworICAgTm90aWNlIHRoZSBzcGFjZXMgYXJvdW5kIGFsbCBvcGVyYXRvcnMgaW5jbHVkaW5nIHRoZSBwYXJlbnRoZXNlcyAtLQorICAgdGhlc2UgYXJlIHJlcXVpcmVkLiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgaG93IHBhcmVudGhlc2VzIGNhbiBiZQorICAgdXNlZCB0byBhbHRlciB0aGUgcHJlY2VkZW5jZSBvZiB0aGUgQU5EIGFuZCBPUiBvcGVyYXRvcnM6CisKKyAgaWYgKCBmYWxzZSB8fCBmYWxzZSAmJiBmYWxzZSB8fCB0cnVlICkgLC4uICAgICAgICAgOyBUcnVlCisgIGlmICggZmFsc2UgfHwgKCBmYWxzZSAmJiBmYWxzZSApIHx8IHRydWUgKSAuLi4gICAgIDsgU2FtZSBhcyBwcmV2aW91cworICBpZiAoICggZmFsc2UgfHwgZmFsc2UgKSAmJiAoIGZhbHNlIHx8IHRydWUgKSApIC4uLiA7IEZhbHNlCisKKyAgIFNpbWlsYXJseSBmb3IgTk9UOgorCisgIGlmICggbm90IHRydWUgJiYgZmFsc2UgKSAuLi4gICAgICAgICAgOyBGYWxzZSAoTk9UIGJpbmRzIHRvIFRSVUUgb25seSkKKyAgaWYgKCAoIG5vdCB0cnVlICkgJiYgZmFsc2UgKSAuLi4gICAgICA7IFNhbWUgYXMgcHJldmlvdXMKKyAgaWYgKCBub3QgKCB0cnVlICYmIGZhbHNlICkgKSAuLi4gICAgICA7IFRydWUgKE5PVCBiaW5kcyB0byAoVFJVRSAmJiBGQUxTRSkpCisKKyAgIE5vdGVzOgorCisgICAgMS4gVGhlIHN5bnRheCBvZiB0aGUgQm9vbGVhbiBleHByZXNzaW9uIGl0c2VsZiBoYXMgbm90IGNoYW5nZWQ7IGVhY2gKKyAgICAgICBleHByZXNzaW9uIGJlZ2lucyB3aXRoIGEga2V5d29yZCBvciB0b2tlbiBzdWNoIGFzICJFWElTVCIsICI+Iiwgb3IKKyAgICAgICAiPSIsIGV0Yzsgb3BlcmF0b3JzIHN1Y2ggYXMgIjwiLCAiPSIsIGFuZCAiPiIgZG8gbm90IGdvIGJldHdlZW4KKyAgICAgICB0aGVpciBvcGVyYW5kcyBidXQgcHJlY2VkZSB0aGVtIGFzIGJlZm9yZTsgdGhpcyBtaWdodCBiZSBjYWxsZWQKKyAgICAgICAicmV2ZXJzZSByZXZlcnNlIFBvbGlzaCBub3RhdGlvbiI7IGl0IGFsbG93cyBkZXRlcm1pbmlzdGljCisgICAgICAgb24tdGhlLWZseSBwYXJzaW5nIG9mIHRoZXNlIGV4cHJlc3Npb25zIGF0IHRoZSBDLUtlcm1pdD4gcHJvbXB0IGFzCisgICAgICAgd2VsbCBhcyBpbiBzY3JpcHRzLCBhbmQgYWxsb3dzID8taGVscCB0byBiZSBnaXZlbiBmb3IgZWFjaCBpdGVtCisgICAgICAgd2hlbiBJRiBvciBXSElMRSBjb21tYW5kcyBhcmUgdHlwZWQgYXQgdGhlIHByb21wdC4KKyAgICAyLiBQYXJlbnRoZXNlcyBhcmUgcmVxdWlyZWQgd2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIEJvb2xlYW4KKyAgICAgICBhc3NlcnRpb24uCisgICAgMy4gUGFyZW50aGVzZXMgYXJlIG5vdCByZXF1aXJlZCwgYnV0IGFyZSBhbGxvd2VkLCB3aGVuIHRoZXJlIGlzIG9ubHkKKyAgICAgICBvbmUgQm9vbGVhbiBhc3NlcnRpb24uCisgICAgNC4gRXZhbHVhdGlvbiBvZiBCb29sZWFuIGFzc2VydGlvbnMgb2NjdXJzIGxlZnQgdG8gcmlnaHQsIGJ1dCB0aGUKKyAgICAgICByZXN1bHRpbmcgQm9vbGVhbiBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhZnRlcndhcmRzIGFjY29yZGluZyB0bworICAgICAgIHRoZSBydWxlcyBvZiBwcmVjZWRlbmNlLiBBbGwgQm9vbGVhbiBhc3NlcnRpb25zIGFyZSBhbHdheXMKKyAgICAgICBldmFsdWF0ZWQ7IHRoZXJlIGlzIG5vICJlYXJseSBzdG9wcGluZyIgcHJvcGVydHkgYW5kIHRoZXJlZm9yZSBubworICAgICAgIHF1ZXN0aW9uIGFib3V0IHdoZW4gb3IgaWYgc2lkZSBlZmZlY3RzIHdpbGwgb2NjdXIgLS0gaWYgYW55CisgICAgICAgQm9vbGVhbiBhc3NlcnRpb24gaGFzIHNpZGUgZWZmZWN0cywgdGhleSB3aWxsIGFsd2F5cyBvY2N1ci4KKworICAgQ29uc3RydWN0aW9ucyBvZiBhcmJpdHJhcnkgY29tcGxleGl0eSBhcmUgcG9zc2libGUsIHdpdGhpbiByZWFzb24uCisKKyAgIEFsc28gc2VlIFs2MjFdU2VjdGlvbiA3LjQgZm9yIG5ldyBJRiAvIFdISUxFIGNvbmRpdGlvbnMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNy4yMS4gU2NyZWVuIEZvcm1hdHRpbmcgYW5kIEN1cnNvciBDb250cm9sCisKKyAgIEMtS2VybWl0IDcuMCBhZGRzIGEgc2ltcGxlIHdheSB0byBjcmVhdGUgZm9ybWF0dGVkIHNjcmVlbnMsIHRoZSBTQ1JFRU4KKyAgIGNvbW1hbmQ6CisKKyAgIFNDUkVFTiB7IENMRUFSLCBDTEVPTCwgTU9WRS1UTyByb3cgWyBjb2x1bW4gXSB9CisgICAgICAgICAgUGVyZm9ybXMgc2NyZWVuLWZvcm1hdHRpbmcgYWN0aW9ucy4gQ29ycmVjdCBvcGVyYXRpb24gb2YgdGhlc2UKKyAgICAgICAgICBjb21tYW5kcyBkZXBlbmRzIG9uIHByb3BlciB0ZXJtaW5hbCBzZXR1cCBvbiBib3RoIGVuZHMgb2YgdGhlCisgICAgICAgICAgY29ubmVjdGlvbiAtLSBtYWlubHkgdGhhdCB0aGUgaG9zdCB0ZXJtaW5hbCB0eXBlIGlzIHNldCB0bworICAgICAgICAgIGFncmVlIHdpdGggdGhlIGtpbmQgb2YgdGVybWluYWwgb3IgdGhlIGVtdWxhdGlvbiB5b3UgYXJlCisgICAgICAgICAgdmlld2luZyBDLUtlcm1pdCB0aHJvdWdoLiBUaGUgVU5JWCB2ZXJzaW9uIHVzZXMgdGVybWluZm8gb3IKKyAgICAgICAgICB0ZXJtY2FwIChub3QgY3Vyc2VzKTsgdGhlIFZNUyB2ZXJzaW9uIHVzZXMgU01HOyBLLTk1IHVzZXMgaXRzCisgICAgICAgICAgYnVpbHQgaW4gc2NyZWVuIG1hbmFnZXIuCisKKyAgIFNDUkVFTiBDTEVBUgorICAgICAgICAgIE1vdmVzIHRoZSBjdXJzb3IgdG8gaG9tZSBwb3NpdGlvbiBhbmQgY2xlYXJzIHRoZSBlbnRpcmUgc2NyZWVuLgorICAgICAgICAgIFN5bm9ueW1zOiBDTEVBUiBDT01NQU5ELVNDUkVFTiBBTEwgKEstOTUgb25seSksIENMUywgQ0xFQVIKKyAgICAgICAgICBTQ1JFRU4uCisKKyAgIFNDUkVFTiBDTEVPTAorICAgICAgICAgIENsZWFycyBmcm9tIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgorICAgICAgICAgIFN5bm9ueW06IENMRUFSIENPTU1BTkQtU0NSRUVOIEVPTCAoSy05NSBvbmx5KQorCisgICBTQ1JFRU4gTU9WRS1UTyByb3cgY29sdW1uCisgICAgICAgICAgTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgaW5kaWNhdGVkIHJvdyBhbmQgY29sdW1uLiBUaGUgcm93IGFuZAorICAgICAgICAgIGNvbHVtbiBudW1iZXJzIGFyZSAxLWJhc2VkLCBzbyBvbiBhIDI0eDgwIHNjcmVlbiB0aGUgaG9tZQorICAgICAgICAgIHBvc2l0aW9uIGlzIDEgMSBhbmQgdGhlIGxvd2VyIHJpZ2h0IGNvcm5lciBpcyAyNCA4MC4gSWYgYSByb3cKKyAgICAgICAgICBvciBjb2x1bW4gbnVtYmVyIGlzIGdpdmVuIHRoYXQgdG9vIGxhcmdlIGZvciB3aGF0IEtlcm1pdCBvciB0aGUKKyAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtIHRoaW5rcyBpcyB5b3VyIHNjcmVlbiBzaXplLCB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgICBudW1iZXIgaXMgc3Vic3RpdHV0ZWQuCisKKyAgIFRoZXNlIGVzY2FwZSBzZXF1ZW5jZXMgdXNlZCBieSB0aGVzZSBjb21tYW5kcyBkZXBlbmRzIG9uIHRoZSBwbGF0Zm9ybS4KKyAgIEluIFVOSVgsIHlvdXIgVEVSTSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1c2VkIHRvIHF1ZXJ5IHRoZQorICAgdGVybWluZm8vdGVybWNhcCBkYXRhYmFzZTsgaWYgdGhlIHF1ZXJ5IGZhaWxzLCBBTlNJL1ZUMTAwIHNlcXVlbmNlcworICAgYXJlIHVzZWQuIEluIFZNUywgdGhlIFNNRyBsaWJyYXJ5IGlzIHVzZWQsIHdoaWNoIHNlbmRzIHNlcXVlbmNlcyBiYXNlZAorICAgb24geW91ciBWTVMgdGVybWluYWwgdHlwZS4gSzk1IGRvZXMgaXRzIG93biBzY3JlZW4gY29udHJvbC4gT24gb3RoZXIKKyAgIHBsYXRmb3JtcyAoc3VjaCBhcyBBT1MvVlMsIFZPUywgZXRjKSwgc2NyZWVuIGZvcm1hdHRpbmcgaXMgbm90CisgICBzdXBwb3J0ZWQsIGFuZCB0aGUgU0NSRUVOIGNvbW1hbmQgZG9lcyBub3RoaW5nLgorCisgICBUaGUgdGhyZWUgU0NSRUVOIGFjdGlvbnMgY2FuIGJlIHVzZWQgaW4gc2NyaXB0cyB0byBwcm9kdWNlIG1lbnVzLAorICAgZm9ybWF0dGVkIHNjcmVlbnMsIGR5bmFtaWMgZGlzcGxheXMsIGV0Yy4gUmVsYXRlZCB2YXJpYWJsZXMgaW5jbHVkZToKKworICBcdih0ZXJtaW5hbCkgICAgIFRoZSB0eXBlIHRlcm1pbmFsIEMtS2VybWl0IHRoaW5rcyB5b3UgaGF2ZS4KKyAgXHYocm93cykgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvd3MgQy1LZXJtaXQgdGhpbmtzIHlvdXIgdGVybWluYWwgaGFzLgorICBcdihjb2x1bW5zKSAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1ucyBDLUtlcm1pdCB0aGlua3MgeW91ciB0ZXJtaW5hbCBoYXMuCisKKyAgIEFuZCBmdW5jdGlvbnM6CisKKyAgXGZzY3JuY3VyeCgpICAgICBUaGUgY3VycmVudCBYIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciAoSy05NSBvbmx5KS4KKyAgXGZzY3JuY3VyeSgpICAgICBUaGUgY3VycmVudCBZIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciAoSy05NSBvbmx5KS4KKyAgXGZzY3Juc3RyKHgseSxuKSBUaGUgc3RyaW5nIG9mIGxlbmd0aCBuYXQgcG9zaXRpb24gKHgseSkgKEstOTUgb25seSkuCisKKyAgIEFuZCBjb21tYW5kczoKKworICBFQ0hPIHN0cmluZyAgICAgIFdyaXRlcyBzdHJpbmcgKyBDUkxGIGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi4KKyAgWEVDSE8gc3RyaW5nICAgICBXcml0ZXMgc3RyaW5nIGF0IGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uOyBDUkxGIG5vdCBzdXBwbGllZC4KKyAgR0VUQyB2IHByb21wdCAgICBJc3N1ZXMgcHJvbXB0LCByZWFkcyBvbmUgY2hhcmFjdGVyIGludG8gdmFyaWFibGUgdiwgbm8gZWNoby4KKworICAgQW5kIHNwZWNpYWwgY2hhcmFjdGVyczoKKworICBDdHJsLUwgICAgICAgICAgIEF0IHRoZSBDLUtlcm1pdD4gY29tbWFuZCBwcm9tcHQsIG9yIGluIGEgQy1LZXJtaXQgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICB3b3JrcyBsaWtlIFJldHVybiBvciBFbnRlciwgYnV0IGFsc28gY2xlYXJzIHRoZSBzY3JlZW4KKworICAgRXhhbXBsZSAxOiBBIG1hY3JvIHRoYXQgcHJpbnRzIGEgbWVzc2FnZSBcJTEgYXQgY3Vyc29yIHBvc2l0aW9uCisgICAoXCUyLFwlMyk6CisKKyAgZGVmaW5lIE1TRyB7CisgICAgICBpZiBub3QgZGVmIFwlMyBkZWYgXCUzIDAgICAgICAgICAgICAgOyBEZWZhdWx0IGNvbHVtbiB0byAwCisgICAgICBpZiA+IFx2KGFyZ2MpIDIgc2NyZWVuIG1vdmUgXCUyIFwlMyAgOyBNb3ZlIHRvIGdpdmVuIHJvdy9jb2wgKGlmIGFueSkKKyAgICAgIHNjcmVlbiBjbGVvbCAgICAgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIHRvIGVuZCBvZiBsaW5lCisgICAgICBpZiBkZWYgXCUxIHhlY2hvIFxmY29udGVudHMoXCUxKSAgICAgOyBQcmludCBtZXNzYWdlIChpZiBhbnkpCisgIH0KKworICAgRXhhbXBsZSAyOiBBIG1hY3JvIHB1dCB0aGUgY3Vyc29yIG9uIHRoZSBib3R0b20gc2NyZWVuIGxpbmUsIGxlZnQKKyAgIG1hcmdpbjoKKworICBkZWZpbmUgQk9UIHsKKyAgICAgIHNjcmVlbiBtb3ZlIFx2KHJvd3MpIDAKKyAgfQorCisgICBFeGFtcGxlIDM6IEEgbWFjcm8gdG8gY2VudGVyIG1lc3NhZ2UgXCUxIG9uIGxpbmUgXCUyLgorCisgIGRlZmluZSBDRU5URVIgeworICAgICAgaWYgbm90IGRlZiBcJTIgZGVmIFwlMiAxCisgICAgICAuXCV4IDo6PSAoXHYoY29scyktXGZsZW4oXCUxKSkvMgorICAgICAgbXNnIHtcJTF9IHtcJTJ9IHtcJXh9CisgIH0KKworICAgRXhhbXBsZSA0OiBBIHNpbXBsZSBtZW51IChidWlsZGluZyBvbiBFeGFtcGxlcyAxLTMpOgorCisgIGRlZiBcJWMgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBNZW51IGNob2ljZSB2YXJpYWJsZQorICBzY3JlZW4gY2xlYXIgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgdGhlIHNjcmVlbgorICBjZW50ZXIge1dlbGNvbWUgdG8gVGhpcyBNZW51fSAyICAgICAgIDsgRGlzcGxheSB0aGUgbWVudQorICBtc2cge0Nob2ljZXM6fSA0CisgIG1zZyB7IDEuIEZpbGV9IDYKKyAgbXNnIHsgMi4gRWRpdH0gNworICBtc2cgeyAzLiBFeGl0fSA4CisgIHdoaWxlICggIT0gXCVjIDMgKSB7ICAgICAgICAgICAgICAgICAgOyBSZWFkIGFuZCB2ZXJpZnkgY2hvaWNlCisgICAgICB3aGlsZSB0cnVlIHsgICAgICAgICAgICAgICAgICAgICAgOyBLZWVwIHRyeWluZyB0aWxsIHdlIGdldCBhIGdvb2Qgb25lCisgICAgICAgICAgc2NyZWVuIG1vdmUgMTAgICAgICAgICAgICAgICAgOyBNb3ZlIHRvIGxpbmUgMTAKKyAgICAgICAgICBzY3JlZW4gY2xlb2wgICAgICAgICAgICAgICAgICA7IENsZWFyIHRoaXMgbGluZQorICAgICAgICAgIGdldGMgXCVjIHtZb3VyIGNob2ljZTogfSAgICAgIDsgUHJvbXB0IGFuZCBnZXQgYW5kIGVjaG8gMSBjaGFyYWN0ZXIKKyAgICAgICAgICB4ZWNobyBcJWMKKyAgICAgICAgICBpZiAoIG5vdCBudW1lcmljIFwlYyApIHsgbXNnIHtOb3QgbnVtZXJpYyAtICJcJWMifSAxMiwgY29udGludWUgfQorICAgICAgICAgIGlmICggPj0gXCVjIDEgJiYgPD0gXCVjIDMgKSBicmVhaworICAgICAgICAgIG1zZyB7T3V0IG9mIHJhbmdlIC0gIlwlYyJ9IDEyCisgICAgICB9CisgICAgICBzd2l0Y2ggXCVjIHsgICAgICAgICAgICAgICAgICAgICAgOyBWYWxpZCBjaG9pY2UgLSBleGVjdXRlIGl0LgorICAgICAgICA6MSwgbXNnIHtGaWxpbmcuLi4gfSAxMiwgYnJlYWsKKyAgICAgICAgOjIsIG1zZyB7RWRpdGluZy4uLn0gMTIsIGJyZWFrCisgICAgICAgIDozLCBtc2cge0V4aXRpbmcuLi59IDEyLCBicmVhaworICAgICAgfQorICB9CisgIGVjaG8gQnllICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBFeGl0IGNob3NlbiAtIHNheSBnb29kYnllLgorICBib3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTGVhdmUgY3Vyc29yIGF0IHNjcmVlbiBib3R0b20uCisgIGV4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBBbmQgZXhpdC4KKworICAgU2ltaWxhciBzY3JpcHRzIGNhbiB3b3JrIG92ZXIgdGhlIGNvbW11bmljYXRpb24gY29ubmVjdGlvbjsgc3Vic3RpdHV0ZQorICAgSU5QVVQgYW5kIE9VVFBVVCBmb3IgR0VUQyBhbmQgRUNITy9YRUNITy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjIyLiBFdmFsdWF0aW5nIEFyaXRobWV0aWMgRXhwcmVzc2lvbnMKKworICAgQSBuZXcgYXJpdGhtZXRpYyBvcGVyYXRvciB3YXMgYWRkZWQgdG8gdGhlIGxpc3QgcmVjb2duaXplZCBieSB0aGUKKyAgIEVWQUxVQVRFIGNvbW1hbmQsIHRoZSBcZmV2YWwoKSBmdW5jdGlvbiwgYW5kIHdoaWNoIGNhbiBhbHNvIGJlIHVzZWQKKyAgIGFueXdoZXJlIGVsc2UgYXJpdGhtZXRpYyBleHByZXNzaW9ucyBhcmUgYWNjZXB0ZWQgKG51bWVyaWMgY29tbWFuZAorICAgZmllbGRzLCBhcnJheSBzdWJzY3JpcHRzLCBldGMpOgorCisgICBQcmVmaXggIiEiCisgICAgICAgICAgVGhpcyBvcGVyYXRvciBpbnZlcnRzIHRoZSAidHJ1dGggdmFsdWUiIG9mIHRoZSBudW1iZXIgb3IKKyAgICAgICAgICBhcml0aG1ldGljIGV4cHJlc3Npb24gdGhhdCBmb2xsb3dzLiBJZiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQKKyAgICAgICAgICBpcyAwLCB0aGUgcmVzdWx0IGlzIDEuIElmIHRoZSB2YWx1ZSBpcyBub256ZXJvLCB0aGUgcmVzdWx0IGlzCisgICAgICAgICAgMC4KKworICAgRXhhbXBsZXM6CisKKyAgc2V0IGV2YWwgb2xkCisgIGV2YWx1YXRlIDAKKyAgMAorCisgIGV2YWx1YXRlICEwCisgIDEKKworICBldmFsdWF0ZSAhMworICAwCisKKyAgZXZhbHVhdGUgISgtMykKKyAgMAorCisgIC5cJWEgPSAxCisgIC5cJWIgPSAwCisgIGV2YWx1YXRlICEoXCVhfFwlYikKKyAgMAorCisgIGV2YWx1YXRlICEoXCVhJlwlYikKKyAgMQorCisgIGV2YWx1YXRlICEoIShcJWEmXCViKSkKKyAgMAorCisgICBOb3RlIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIFByZWZpeCAhIChpbnZlcnQgdHJ1dGggdmFsdWUpIGFuZCBTdWZmaXgKKyAgICEgKGZhY3RvcmlhbCkuIEFsc28gdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gUHJlZml4ICEgYW5kIFByZWZpeCB+CisgICAod2hpY2ggaW52ZXJ0cyBhbGwgdGhlIGJpdHMgaW4gaXRzIG9wZXJhbmQpLiBBbHNvIG5vdGUgdGhhdCBwcmVmaXgKKyAgIG9wZXJhdG9ycyAoISwgLSwgYW5kIH4pIGNhbiBub3QgYmUgYWRqYWNlbnQgdW5sZXNzIHlvdSB1c2UgcGFyZW50aGVzZXMKKyAgIHRvIHNlcGFyYXRlIHRoZW0sIGFzIHNob3duIGluIHRoZSBmaW5hbCBleGFtcGxlIGFib3ZlLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDcuMjMuIEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMKKworICAgQy1LZXJtaXQgNy4wIGFkZHMgbGltaXRlZCBzdXBwb3J0IGZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzIChudW1iZXJzCisgICB0aGF0IGhhdmUgZnJhY3Rpb25hbCBwYXJ0cywgbGlrZSAzLjE0MTU5MjY1MykuIFRoaXMgc3VwcG9ydCBpcworICAgcHJvdmlkZWQgdGhyb3VnaCBhIHNtYWxsIHJlcGVydG9pcmUgb2YgZnVuY3Rpb25zIGFuZCBpbiBCb29sZWFuCisgICBleHByZXNzaW9ucyB0aGF0IGNvbXBhcmUgbnVtYmVycywgYnV0IGRvZXMgbm90IGFwcGx5IHRvIG51bWJlciBwYXJzaW5nCisgICBpbiBnZW5lcmFsLCBvciB0byBleHByZXNzaW9uIGV2YWx1YXRpb24sIGFycmF5IHN1YnNjcmlwdHMsIHRoZQorICAgSU5DUkVNRU5UIGFuZCBERUNSRU1FTlQgY29tbWFuZHMsIG9yIGluIGFueSBjb250ZXh0IG90aGVyIHRoYW4gdGhvc2UKKyAgIGxpc3RlZCBpbiB0aGlzIHNlY3Rpb24uCisKKyAgIEEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGhhcyBhbiBvcHRpb25hbCBzaWduICgrIG9yIC0pLCBmb2xsb3dlZCBieSBhCisgICBzZXJpZXMgb2YgZGVjaW1hbCBkaWdpdHMgY29udGFpbmluZyBlaXRoZXIgemVybyBvciBvbmUgcGVyaW9kICguKQorICAgY2hhcmFjdGVyLCB3aGljaCBpcyB0aGUgZGVjaW1hbCBwb2ludC4gVGhlIHVzZSBvZiBjb21tYSBvciBhbnkgb3RoZXIKKyAgIGNoYXJhY3RlciBiZXNpZGVzIHBlcmlvZCBhcyBhIGRlY2ltYWwgcG9pbnQgaXMgbm90IHN1cHBvcnRlZC4KKyAgIFNjaWVudGlmaWMgbm90YXRpb24gaXMgbm90IHN1cHBvcnRlZCBlaXRoZXIuIEV4YW1wbGVzIG9mIGxlZ2FsCisgICBmbG9hdGluZy1wb2ludCBudW1iZXJzOgorCisgIDAgICAgICAgICAgICAgICAgSW50ZWdlcnMgY2FuIGJlIHVzZWQKKyAgMSAgICAgICAgICAgICAgICBEaXR0bworICAyLiAgICAgICAgICAgICAgIEEgZGVjaW1hbCBwb2ludCB3aXRob3V0IGRlY2ltYWwgZGlnaXRzCisgIDMuMCAgICAgICAgICAgICAgQSBkZWNpbWFsIHBvaW50IHdpdGggZGVjaW1hbCBkaWdpdHMKKyAgMy4xNDE1OTI2NTMgICAgICBEaXR0bworIC00LjAgICAgICAgICAgICAgIEEgbmVnYXRpdmUgc2lnbiBjYW4gYmUgaW5jbHVkZWQKKyArNS4wICAgICAgICAgICAgICBBIHBvc2l0aXZlIHNpZ24gY2FuIGJlIGluY2x1ZGVkCisKKyAgIEV4YW1wbGVzIG9mIG5vdGF0aW9ucyB0aGF0IGFyZSBub3QgYWNjZXB0ZWQ6CisKKyAgMSwwMDAsMDAwICAgICAgICBTZXBhcmF0b3JzIGNhbiBub3QgYmUgdXNlZAorICAxLjAwMC4wMDAgICAgICAgIERpdHRvIChvciBtdWx0aXBsZSBkZWNpbWFsIHBvaW50cykKKyAgNi4wMjIxMzdFMjMgICAgICBObyBzY2llbnRpZmljIG5vdGF0aW9uCisgIDYuNjI2MDY4NjhlLTM0ICAgRGl0dG8KKyAgMTIuNSs2LjI1ICAgICAgICBObyAiYmFyZSIgZXhwcmVzc2lvbnMKKworICAgWW91IGNhbiB1c2UgSUYgRkxPQVQgdGVzdCBhIHN0cmluZyBvciB2YXJpYWJsZSB0byBzZWUgaWYgaXQncyBpbgorICAgYWNjZXB0YWJsZSBmbG9hdGluZy1wb2ludCBmb3JtYXQuIEV4YW1wbGU6CisKKyAgYXNrIFwlZiB7IFR5cGUgYSBudW1iZXI6IH0KKyAgaWYgbm90IGRlZiBcJWYgLlwlZiA9IDAuMAorICBpZiBub3QgZmxvYXQgXCVmIHN0b3AgMSBJbnZhbGlkIGZsb2F0aW5nLXBvaW50IG51bWJlcjogIlwlZiIKKworICAgQy1LZXJtaXQncyBmbG9hdGluZy1wb2ludCBzdXBwb3J0LCBsaWtlIGl0cyBzdXBwb3J0IGZvciB3aG9sZSBudW1iZXJzCisgICAoaW50ZWdlcnMpLCByZWxpZXMgb24gdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgdW5kZXJseWluZyBjb21wdXRlci4KKyAgIFlvdXIgY29tcHV0ZXIgaGFzIG9ubHkgYSBsaW1pdGVkIGFtb3VudCBvZiBwcmVjaXNpb24gZm9yIG51bWJlcnMsCisgICBkZXBlbmRpbmcgb24gaXRzIGFyY2hpdGVjdHVyZS4gVGh1cyBmbG9hdGluZy1wb2ludCBudW1iZXJzIHRoYXQgaGF2ZQorICAgdG9vIG1hbnkgZGlnaXRzIHdpbGwgbm90IGJlIGFjY3VyYXRlOyBhZGRpbmcgYSB2ZXJ5IHNtYWxsIG51bWJlciB0byBhCisgICB2ZXJ5IGxhcmdlIG9uZSBtaWdodCBoYXZlIG5vIGVmZmVjdCBhdCBhbGw7IGFuZCBzbyBvbi4gRm9yIGRldGFpbHMsCisgICByZWFkIGEgdGV4dCBvbiBudW1lcmljYWwgYW5hbHlzaXMuIEV4YW1wbGU6CisKKyAgLlwlYSA9IDExMTExMTExMTExMTExMTExMTExICA7IEEgbG9uZyBudW1iZXIKKyAgLlwlYiA9IDIyMjIyMjIyMjIyMjIyMjIyMjIyICA7IEFub3RoZXIgb25lCisgIGVjaG8gXGZmcGFkZChcJWEsXCViKSAgICAgICAgOyBBZGQgdGhlbSAtIHRoZSByZXN1bHQgc2hvdWxkIGJlIGFsbCAzJ3MKKyAgMzMzMzMzMzMzMzMzMzMzMzAwMDAuMCAgICAgICA7IFNlZSB0aGUgcmVzdWx0CisKKyAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIGNvbXB1dGVyIGhhcyAxNiBkaWdpdHMgb2YgcHJlY2lzaW9uOyBhZnRlciB0aGF0LAorICAgdGhlIChsb3ctb3JkZXIpIGRpZ2l0cyBhcmUgc2V0IHRvIDAsIHNpbmNlIHRoZSBjb21wdXRlciBkb2Vzbid0IGtub3cKKyAgIHdoYXQgdGhleSByZWFsbHkgYXJlLiBJbiBmYWN0LCB0aGUgY29tcHV0ZXIgcmV0dXJucyByYW5kb20gZGlnaXRzLCBidXQKKyAgIEtlcm1pdCBzZXRzIGFsbCBkaWdpdHMgYmV5b25kIHRoZSBjb21wdXRlcidzIHByZWNpc2lvbiB0byAwLgorCisgICBDLUtlcm1pdCdzIGZsb2F0aW5nLXBvaW50IGZ1bmN0aW9ucyBoYXZlIG5hbWVzIG9mIHRoZSBmb3JtCisgICAiXGZmcHh4eChhcmdzKSIgKCJcZiIgZm9yIGZ1bmN0aW9uLCAiZnAiIGZvciBmbG9hdGluZy1wb2ludCksIHdoZXJlCisgICAieHh4IiBpcyByZXBsYWNlZCBieSB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24sIHN1Y2ggYXMgInNxcnQiLCBhbmQKKyAgICJhcmdzIiBpcyB0aGUgYXJndW1lbnQgbGlzdCwgY29uc2lzdGluZyBvZiBvbmUgb3IgdHdvIGZsb2F0aW5nLXBvaW50CisgICBudW1iZXJzIChkZXBlbmRpbmcgb24gdGhlIGZ1bmN0aW9uKSwgYW5kIGFuIG9wdGlvbmFsICJkIiBhcmd1bWVudCB0aGF0CisgICBzYXlzIG5vdyBtYW55IGRlY2ltYWwgcGxhY2VzIHNob3VsZCBiZSBzaG93biBpbiB0aGUgcmVzdWx0LiBFeGFtcGxlOgorCisgIFxmZnBkaXYoMTAsMywxKSByZXR1cm5zICIzLjMiCisgIFxmZnBkaXYoMTAsMywyKSByZXR1cm5zICIzLjMzIgorICBcZmZwZGl2KDEwLDMsMykgcmV0dXJucyAiMy4zMzMiCisKKyAgIGFuZCBzbyBvbiwgdXAgdG8gdGhlIHByZWNpc2lvbiBvZiB0aGUgY29tcHV0ZXIuIElmIHRoZSBkZWNpbWFsLXBsYWNlcworICAgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHplcm8sIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgdGhlIHJlc3VsdCBpcworICAgdHJ1bmNhdGVkOgorCisgIFxmZnBkaXYoMTAsMywtMSkgcmV0dXJucyAiMyIuCisKKyAgIElmIHRoZSBkZWNpbWFsLXBsYWNlcyBhcmd1bWVudCBpcyAwLCBvciBpcyBvbWl0dGVkLCBDLUtlcm1pdCByZXR1cm5zCisgICBhcyBtYW55IGRlY2ltYWwgcGxhY2VzIGFzIGFyZSBtZWFuaW5nZnVsIGluIHRoZSBjb21wdXRlcidzCisgICBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24sIHRydW5jYXRpbmcgYW55IGV4dHJhbmVvdXMgdHJhaWxpbmcgMCdzOgorCisgIFxmZnBkaXYoMTAsOCkgcmV0dXJucyAiMS4yNSIuCisgIFxmZnBkaXYoMTAsNCkgcmV0dXJucyAiMi41Ii4KKyAgXGZmcGRpdigxMCwyKSByZXR1cm5zICI1LjAiLgorICBcZmZwZGl2KDEwLDMpIHJldHVybnMgIjMuMzMzMzMzMzMzMzMzMzMzIiAoZm9yIDE2LWRpZ2l0IHByZWNpc2lvbikuCisKKyAgIFRoZXJlIGlzIG5vIHdheSB0byByZXF1ZXN0IHRoYXQgYSBmbG9hdGluZy1wb2ludCBmdW5jdGlvbiByZXR1cm4gYQorICAgZGVjaW1hbCBwb2ludCBidXQgbm8gZGVjaW1hbCBwbGFjZXMuIEhvd2V2ZXIsIHRoaXMgaXMgZWFzeSBlbm91Z2ggdG8KKyAgIGFjY29tcGxpc2ggaW4gb3RoZXIgd2F5cywgZm9yIGV4YW1wbGUgYnkgc3VwcGx5aW5nIGl0IG91dHNpZGUgdGhlCisgICBmdW5jdGlvbiBjYWxsOgorCisgIGVjaG8gXGZmcGFkZChcJWEsXCViLC0xKS4KKworICAgS2VybWl0J3MgZmxvYXRpbmctcG9pbnQgZnVuY3Rpb25zIGFsd2F5cyByb3VuZCB0aGUgcmVzdWx0IGZvciB0aGUKKyAgIHJlcXVlc3RlZCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgd2hlbiB0aGUgImQiIGFyZ3VtZW50IGlzIGdpdmVuIGFuZAorICAgaGFzIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDAgKHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgXGZmcHJvdW5kKCkganVzdAorICAgYmVsb3cpLgorCisgICBGbG9hdGluZy1wb2ludCBhcmd1bWVudHMgY2FuIGJlIGNvbnN0YW50cyBpbiBmbG9hdGluZy1wb2ludCBmb3JtYXQgb3IKKyAgIHZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgYXJlIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuIElmIGEgZmxvYXRpbmctcG9pbnQKKyAgIGFyZ3VtZW50IGlzIG9taXR0ZWQsIG9yIGlzIGEgdmFyaWFibGUgd2l0aCBubyB2YWx1ZSwgMC4wIGlzIHN1cHBsaWVkCisgICBhdXRvbWF0aWNhbGx5LiBFeGFtcGxlOgorCisgIGRlZiBcJXggOTk5Ljk5OQorICB1bmRlZiBcJXkKKyAgZWNobyBcZmZwbWluKFwleCxcJXkpCisgIDAuMAorCisgICBPciBlcXVpdmFsZW50bHk6CisKKyAgZWNobyBcZmZwbWluKDk5OS45OTkpCisgIDAuMAorCisgICBUaGUgZmxvYXRpbmctcG9pbnQgZnVuY3Rpb25zIGFyZToKKworICAgXGZmcHJvdW5kKGYxLGQpCisgICAgICAgICAgUmV0dXJucyBmMSByb3VuZGVkIHRvIGQgZGVjaW1hbCBwbGFjZXMuIEZvciB0aGlzIGZ1bmN0aW9uIG9ubHksCisgICAgICAgICAgZCA9IDAgKG9yIGQgb21pdHRlZCkgaGFzIGEgc3BlY2lhbCBtZWFuaW5nOiByZXR1cm4gdGhlIGludGVnZXIKKyAgICAgICAgICBwYXJ0IG9mIGYxIHJvdW5kZWQgYWNjb3JkaW5nIHRvIHRoZSBmcmFjdGlvbmFsIHBhcnQuIEV4YW1wbGVzOgorCisgIFxmZnByb3VuZCgyLjc0NjUzLC0xKSByZXR1cm5zICIyIiAoZnJhY3Rpb24gdHJ1bmNhdGVkLCBubyByb3VuZGluZykuCisgIFxmZnByb3VuZCgyLjc0NjUzLDApICByZXR1cm5zICIzIiAoaW50ZWdlciBwYXJ0IGlzIHJvdW5kZWQpLgorICBcZmZwcm91bmQoMi43NDY1MykgICAgcmV0dXJucyAiMyIgKGQgb21pdHRlZCBzYW1lIGFzIGQgPSAwKS4KKyAgXGZmcHJvdW5kKDIuNzQ2NTMsMSkgIHJldHVybnMgIjIuNyIuCisgIFxmZnByb3VuZCgyLjc0NjUzLDIpICByZXR1cm5zICIyLjc1Ii4KKyAgXGZmcHJvdW5kKDIuNzQ2NTMsMykgIHJldHVybnMgIjIuNzQ3Ii4KKyAgXGZmcHJvdW5kKDIuNzQ2NTMsNCkgIHJldHVybnMgIjIuNzQ2NSIsIGV0Yy4KKworICAgXGZmcGFkZChmMSxmMixkKQorICAgICAgICAgIFJldHVybnMgdGhlIHN1bSBvZiBmMSBhbmQgZjIuCisKKyAgIFxmZnBzdWJ0cmFjdChmMSxmMixkKQorICAgICAgICAgIFN1YnRyYWN0cyBmMiBmcm9tIGYxIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisKKyAgIFxmZnBtdWx0aXBseShmMSxmMixkKQorICAgICAgICAgIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgZjEgYW5kIGYyLgorCisgICBcZmZwZGl2aWRlKGYxLGYyLGQpCisgICAgICAgICAgSWYgZjIgaXMgbm90IDAsIGRpdmlkZXMgZjEgYnkgZjIgYW5kIHJldHVybnMgdGhlIHF1b3RpZW50LgorICAgICAgICAgIElmIGYyIGlzIDAsIGEgRElWSURFX0JZX1pFUk8gZXJyb3Igb2NjdXJzLgorCisgICBcZmZwcmFpc2UoZjEsZjIsZCkKKyAgICAgICAgICBJZiBmMSA9IDAgYW5kIGYyIDw9IDAsIG9yIGlmIGYxIDwgMCBhbmQgZjIgaGFzIGEgZnJhY3Rpb25hbAorICAgICAgICAgIHBhcnQsIGFuIEFSR19PVVRfT0ZfUkFOR0UgZXJyb3Igb2NjdXJzOyBvdGhlcndpc2UgZjEgcmFpc2VkIHRvCisgICAgICAgICAgdGhlIGYyIHBvd2VyIGlzIHJldHVybmVkLgorCisgICBcZmZwc3FydChmMSxkKQorICAgICAgICAgIElmIGYxID49IDAsIHJldHVybnMgdGhlIHNxdWFyZSByb290IG9mIGYxOyBvdGhlcndpc2UKKyAgICAgICAgICBBUkdfT1VUX09GX1JBTkdFLgorCisgICBcZmZwYWJzb2x1dGUoZjEsZCkKKyAgICAgICAgICBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBmMSAoaS5lLiBmMSB3aXRob3V0IGEgc2lnbikuIFRoaXMKKyAgICAgICAgICBpcyB0aGUgZmxvYXRpbmctcG9pbnQgYW5hbG9nIG9mIFxmYWJzb2x1dGUobjEpLgorCisgICBcZmZwaW50KGYxKQorICAgICAgICAgIFJldHVybnMgdGhlIGludGVnZXIgcGFydCBvZiBmMS4gRXF1aXZhbGVudCB0byBcZmZwcm91bmQoZjEsLTEpLgorCisgICBcZmZwZXhwKGYxLGQpCisgICAgICAgICAgVGhlIGJhc2Ugb2YgbmF0dXJhbCBsb2dhcml0aG1zLCBlICgyLjcxODI4Mi4uLiksIHJhaXNlZCB0byB0aGUKKyAgICAgICAgICBmMSBwb3dlci4KKworICAgXGZmcGxvZ24oZjEsZCkKKyAgICAgICAgICBUaGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgZjEgKHRoZSBwb3dlciB0byB3aGljaCBlIG11c3QgYmUKKyAgICAgICAgICByYWlzZWQgdG8gb2J0YWluIGYxKS4KKworICAgXGZmcGxvZzEwKGYxLGQpCisgICAgICAgICAgVGhlIGJhc2UtMTAgbG9nYXJpdGhtIG9mIGYxICh0aGUgcG93ZXIgdG8gd2hpY2ggMTAgbXVzdCBiZQorICAgICAgICAgIHJhaXNlZCB0byBvYnRhaW4gZjEpLgorCisgICBcZmZwbW9kdWx1cyhmMSxmMixkKQorICAgICAgICAgIElmIGYyIGlzIG5vdCAwLCB0aGUgcmVtYWluZGVyIGFmdGVyIGRpdmlkaW5nIGYxIGJ5IGYyLgorICAgICAgICAgIElmIGYyIGlzIDAsIGEgRElWSURFX0JZX1pFUk8gZXJyb3Igb2NjdXJzLgorICAgICAgICAgIFRoaXMgaXMgdGhlIGZsb2F0aW5nLXBvaW50IGFuYWxvZyBvZiBcZm1vZChuMSxuMikuCisKKyAgIFxmZnBtYXhpbXVtKGYxLGYyLGQpCisgICAgICAgICAgUmV0dXJucyB0aGUgbWF4aW11bSBvZiBmMSBhbmQgZjIuIFRoaXMgaXMgdGhlIGZsb2F0aW5nLXBvaW50CisgICAgICAgICAgYW5hbG9nIG9mIFxmbWF4KG4xLG4yKS4KKworICAgXGZmcG1pbmltdW0oZjEsZjIsZCkKKyAgICAgICAgICBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIGYxIGFuZCBmMi4gVGhpcyBpcyB0aGUgZmxvYXRpbmctcG9pbnQKKyAgICAgICAgICBhbmFsb2cgb2YgXGZtaW4objEsbjIpLgorCisgICBcZmZwc2luZShmMSxkKQorICAgICAgICAgIFJldHVybnMgdGhlIHNpbmUgb2YgZjEgcmFkaWFucy4KKworICAgXGZmcGNvc2luZShmMSxkKQorICAgICAgICAgIFJldHVybnMgdGhlIGNvc2luZSBvZiBmMSByYWRpYW5zLgorCisgICBcZmZwdGFuZ2VudChmMSxkKQorICAgICAgICAgIFJldHVybnMgdGhlIHRhbmdlbnQgb2YgZjEgcmFkaWFucy4KKworICAgTm90ZSB0aGF0IGFsbCBvZiB0aGVzZSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgd2l0aCBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAgIElmIHlvdSB3YW50IGFuIGludGVnZXIgcmVzdWx0LCBzcGVjaWZ5IGQgPSAtMSAodG8gdHJ1bmNhdGUpIG9yIGZlZWQKKyAgIHRoZSByZXN1bHQgdG8gXGZmcHJvdW5kKHh4eCwwKSAodG8gcm91bmQpLgorCisgICBGbG9hdGluZy1wb2ludCBudW1iZXJzIChvciB2YXJpYWJsZXMgb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIHRoZW0pCisgICBjYW4gYmUgdXNlZCBpbiBCb29sZWFuIGV4cHJlc3Npb25zIChzZWUgWzYyMl1TZWN0aW9uIDcuMjAuMikgdGhhdAorICAgY29tcGFyZSBudW1iZXJzOgorCisgID0geCB5CisgICE9IHggeQorICA8IHggeQorICA+IHggeQorICA8PSB4IHkKKyAgPj0geCB5CisKKyAgIEluIHRoZXNlIGV4YW1wbGVzLCB4IGFuZCB5IGNhbiBiZSBlaXRoZXIgaW50ZWdlcnMgb3IgZmxvYXRpbmctcG9pbnQKKyAgIG51bWJlcnMgaW4gYW55IGNvbWJpbmF0aW9uLiBJbiBhbiBhcml0aG1ldGljIGNvbXBhcmlzb24gb2YgYW4gaW50ZWdlcgorICAgYW5kIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLCB0aGUgaW50ZWdlciBpcyBjb252ZXJ0ZWQgdG8KKyAgIGZsb2F0aW5nLXBvaW50IGJlZm9yZSB0aGUgY29tcGFyaXNvbiBpcyBtYWRlLiBFeGFtcGxlczoKKworICAuXCV0ID0gMy4wMDAwMDAwMDAKKyAgLlwlZiA9IDMuMTQxNTkyNjUzCisgIC5cJWkgPSAzCisKKyAgaWYgPiBcJWYgXCVpIGVjaG8gUGkgaXMgZ3JlYXRlci4KKyAgaWYgPSBcJXQgXCVpIGVjaG8gIlwlaSIgPSAiXCV0Ii4KKworICAgQSBmbG9hdGluZy1wb2ludCBudW1iZXIgY2FuIGFsc28gYmUgdXNlZCBpbjoKKworICBJRiBudW1iZXIgY29tbWFuZAorCisgICB3aGVyZSB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCBpZiB0aGUgbnVtYmVyIGlzIG5vbnplcm8uIElmIHRoZSBudW1iZXIKKyAgIGlzIGZsb2F0aW5nLXBvaW50LCB0aGUgY29tbWFuZCBpcyBub3QgZXhlY3V0ZWQgaWYgdGhlIG51bWJlciBpcyAwLjAsCisgICBhbmQgaXMgZXhlY3V0ZWQgb3RoZXJ3aXNlLgorCisgICBGbG9hdGluZy1wb2ludCBudW1iZXJzIGNhbiBiZSBzb3J0ZWQgdXNpbmcgQVJSQVkgU09SVCAvTlVNRVJJQyAoc2VlCisgICBbNjIzXVNlY3Rpb24gNy4xMC41ICkuCisKKyAgIFR3byBmbG9hdGluZy1wb2ludCBjb25zdGFudHMgYXJlIHByb3ZpZGVkOgorCisgIFx2KG1hdGhfcGkpID0gUGkgKDMuMTQxNTkyNjUzLi4uKQorICBcdihtYXRoX2UpICA9IGUsIHRoZSBiYXNlIG9mIG5hdHVyYWwgbG9nYXJpdGhtcyAoMi43MTgyOC4uLikKKworICAgVGhlc2UgYXJlIGdpdmVuIHRvIHRoZSBjb21wdXRlcidzIHByZWNpc2lvbiwgZS5nLiAxNiBkaWdpdHMuIFRoaXMKKyAgIG51bWJlciBpdHNlbGYgaXMgYXZhaWxhYmxlIGluIGEgdmFyaWFibGU6CisKKyAgIFx2KG1hdGhfcHJlY2lzaW9uKQorICAgICAgICAgIEhvdyBtYW55IHNpZ25pZmljYW50IGRpZ2l0cyBpbiBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjI0LiBUcmFjaW5nIFNjcmlwdCBFeGVjdXRpb24KKworICAgVGhlIFRSQUNFIGNvbW1hbmQgaXMgaGFuZHkgZm9yIGRlYnVnZ2luZyBzY3JpcHRzLgorCisgICBUUkFDRSBbIHsgL09OLCAvT0ZGIH0gXSBbIHsgQVNTSUdOTUVOVFMsIENPTU1BTkQtTEVWRUwsIEFMTCB9IF0KKyAgICAgICAgICBTZWxlY3RzIHRyYWNpbmcgb2YgdGhlIGdpdmVuIG9iamVjdC4KKworICAgT3B0aW9uYWwgc3dpdGNoZXMgYXJlIC9PTiBhbmQgL09GRi4gSWYgbm8gc3dpdGNoIGlzIGdpdmVuLCAvT04gaXMKKyAgIGltcGxpZWQuIFRoZSB0cmFjZSBvYmplY3RzIGFyZSBBU1NJR05NRU5UUywgQ09NTUFORC1MRVZFTCwgYW5kIEFMTC4KKyAgIFRoZSBkZWZhdWx0IG9iamVjdCBpcyBBTEwsIG1lYW5pbmcgdG8gc2VsZWN0IGFsbCB0cmFjZSBvYmplY3RzCisgICAoYmVzaWRlcyBBTEwpLiBUaHVzIFRSQUNFIGJ5IGl0c2VsZiBzZWxlY3RzIHRyYWNpbmcgb2YgZXZlcnl0aGluZywgYXMKKyAgIGRvZXMgVFJBQ0UgL09OLCBhbmQgVFJBQ0UgL09GRiB0dXJucyBvZmYgYWxsIHRyYWNpbmcuCisKKyAgIFdoZW4gdHJhY2luZyBvZiBBU1NJR05NRU5UUyBpcyBvbiwgZXZlcnkgdGltZSB0aGUgdmFsdWUgb2YgYW55CisgICB1c2VyLWRlZmluZWQgdmFyaWFibGUgb3IgbWFjcm8gY2hhbmdlcywgQy1LZXJtaXQgcHJpbnRzIG9uZSBvZiB0aGUKKyAgIGZvbGxvd2luZzoKKworICAgPj4+IG5hbWU6ICJ2YWx1ZSIKKyAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgb3IgbWFjcm8gZm9sbG93ZWQgYnkgdGhlIG5ldyB2YWx1ZSBpbgorICAgICAgICAgIHF1b3Rlcy4gVGhpcyBpbmNsdWRlcyBpbXBsaWNpdCBtYWNyby1wYXJhbWV0ZXIgYXNzaWdubWVudHMKKyAgICAgICAgICBkdXJpbmcgbWFjcm8gaW52b2NhdGlvbi4KKworICAgPj4+IG5hbWU6ICh1bmRlZikKKyAgICAgICAgICBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSB2YXJpYWJsZSBvciBtYWNybyBoYXMgYmVlbiB1bmRlZmluZWQuCisKKyAgIDw8PCBuYW1lOiAidmFsdWUiCisgICAgICAgICAgRm9yIFJFVFVSTiBzdGF0ZW1lbnRzOiB0aGUgbmFtZSBvZiB0aGUgbWFjcm8gYW5kIHRoZSByZXR1cm4KKyAgICAgICAgICB2YWx1ZS4KKworICAgPDw8IG5hbWU6IChudWxsKQorICAgICAgICAgIEZvciBSRVRVUk4gc3RhdGVtZW50cyB0aGF0IGluY2x1ZGUgbm8gdmFsdWUgb3IgYW4gZW1wdHkgdmFsdWUuCisKKyAgIFdoZW4gdHJhY2luZyBvZiBDT01NQU5ELUxFVkVMIGlzIG9uLCBDLUtlcm1pdCBwcmludHM6CisKKyAgIFtuXSArRjogIm5hbWUiCisgICAgICAgICAgV2hlbmV2ZXIgYSBjb21tYW5kIGZpbGUgaXMgZW50ZXJlZCwgd2hlcmUgIm4iIGlzIHRoZSBjb21tYW5kCisgICAgICAgICAgbGV2ZWwgKDAgPSB0b3ApOyB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCBmaWxlIGlzIHNob3duIGluCisgICAgICAgICAgcXVvdGVzLgorCisgICBbbl0gK006ICJuYW1lIgorICAgICAgICAgIFdoZW5ldmVyIGEgbWFjcm8gaXMgZW50ZXJlZDsgIm4iIGlzIHRoZSBjb21tYW5kIGxldmVsLiBUaGUgbmFtZQorICAgICAgICAgIG9mIHRoZSBtYWNybyBpcyBzaG93biBpbiBxdW90ZXMuCisKKyAgIFtuXSAtRjogIm5hbWUiCisgICAgICAgICAgV2hlbmV2ZXIgYSBjb21tYW5kIGZpbGUgaXMgcmVlbnRlcmVkIGZyb20gYmVsb3csIHdoZW4gYSBtYWNybworICAgICAgICAgIG9yIGNvbW1hbmQgZmlsZSB0aGF0IGl0IGhhcyBpbnZva2VkIGhhcyByZXR1cm5lZC4KKworICAgW25dIC1NOiAibmFtZSIKKyAgICAgICAgICBXaGVuZXZlciBhIG1hY3JvIGlzIHJlZW50ZXJlZCBmcm9tIGJlbG93LgorCisgICBGb3Igb3RoZXIgZGVidWdnaW5nIHRvb2xzLCBzZWUgU0hPVyBBUkdTLCBTSE9XIFNUQUNLLCBTRVQgVEFLRSwgU0VUCisgICBNQUNSTywgYW5kIG9mIGNvdXJzZSwgRUNITy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA3LjI1LiBDb21wYWN0IFN1YnN0cmluZyBOb3RhdGlvbgorCisgICBJdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZXh0cmFjdCBhIHN1YnN0cmluZyBmcm9tIGEgc3RyaW5nIHdoaWNoIGlzCisgICBzdG9yZWQgaW4gYSB2YXJpYWJsZSwgYW5kIGZvciB0aGlzIHdlIGhhdmUgdGhlIFxmc3Vic3RyaW5nKCkgZnVuY3Rpb24sCisgICB3aGljaCBpcyB1c2VkIGxpa2UgdGhpczoKKworICBkZWZpbmUgXCVhIDEyMzQ1Njc4OTAKKyAgZWNobyBcZnN1YnN0cmluZyhcJWEsMyw0KSA7IHN1YnN0cmluZyBmcm9tIDNyZCBjaGFyYWN0ZXIgbGVuZ3RoIDQKKyAgMzQ1NgorCisgICBvciBsaWtlIHRoaXMgd2l0aCBtYWNyby1uYW1lZCB2YXJpYWJsZXM6CisKKyAgZGVmaW5lIHN0cmluZyAxMjM0NTY3ODkwCisgIGVjaG8gXGZzdWJzdHJpbmcoXG0oc3RyaW5nKSwzLDQpCisgIDM0NTYKKworICAgQy1LZXJtaXQgNy4wIGFkZHMgYSBwYWlyIG9mIGFsdGVybmF0aXZlIGNvbXBhY3Qgbm90YXRpb25zOgorCitcOih2YXJpYWJsZW5hbWVbc3RhcnQ6bGVuZ3RoXSkgIDwtLSBTdWJzdHJpbmcgb2YgdmFyaWFibGUncyB2YWx1ZQorXHMobWFjcm9uYW1lW3N0YXJ0Omxlbmd0aF0pICAgICA8LS0gU3Vic3RyaW5nIG9mIG1hY3JvJ3MgZGVmaW5pdGlvbgorCisgICBUaGVzZSBhcmUgZXhhY3RseSBlcXVpdmFsZW50IHRvIHVzaW5nIFxmc3Vic3RyaW5nKCksIGV4Y2VwdCBtb3JlCisgICBjb21wYWN0IHRvIHdyaXRlIGFuZCBhbHNvIGZhc3RlciBzaW5jZSBldmFsdWF0aW9uIGlzIGluIG9uZSBzdGVwCisgICBpbnN0ZWFkIG9mIHR3by4KKworICAgVGhlICJcOigpIiBub3RhdGlvbiBjYW4gYmUgdXNlZCB3aXRoIGFueSBLZXJtaXQgdmFyaWFibGUsIHRoYXQgaXMsCisgICBhbG1vc3QgYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCBhIGJhY2tzbGFzaDoKKworICBcOihcJWFbMjo2XSkgICAgICA8LS0gZXF1aXZhbGVudCB0byBcZnN1YnN0cmluZyhcJWEsMiw2KQorICBcOihcJnhbMV1bMjo2XSkgICA8LS0gZXF1aXZhbGVudCB0byBcZnN1YnN0cmluZyhcJnhbMV0sMiw2KQorICBcOihcbShmb28pWzI6Nl0pICA8LS0gZXF1aXZhbGVudCB0byBcZnN1YnN0cmluZyhcbShmb28pLDIsNikKKyAgXDooXHYodGltZSlbMjo2XSkgPC0tIGVxdWl2YWxlbnQgdG8gXGZzdWJzdHJpbmcoXHYodGltZSksMiw2KQorICBcOihcJChURVJNKVsyOjZdKSA8LS0gZXF1aXZhbGVudCB0byBcZnN1YnN0cmluZyhcJChURVJNKSwyLDYpCisgIFw6KEFCQ0RFRkdIWzI6Nl0pIDwtLSBlcXVpdmFsZW50IHRvIFxmc3Vic3RyaW5nKEFCQ0RFRkdILDIsNikKKworICAgV2hhdGV2ZXIgYXBwZWFycyBiZXR3ZWVuIHRoZSBsZWZ0IHBhcmVudGhlc2lzIGFuZCB0aGUgbGVmdCBicmFja2V0IGlzCisgICBldmFsdWF0ZWQgYW5kIHRoZW4gdGhlIGluZGljYXRlZCBzdWJzdHJpbmcgb2YgdGhlIHJlc3VsdCBpcyByZXR1cm5lZC4KKworICAgVGhlICJccygpIiBub3RhdGlvbiBpcyB0aGUgc2FtZSwgZXhjZXB0IGFmdGVyIGV2YWx1YXRpbmcgdGhlIHZhcmlhYmxlLAorICAgdGhlIHJlc3VsdCBpcyB0cmVhdGVkIGFzIGEgbWFjcm8gbmFtZSBhbmQgaXMgbG9va2VkIHVwIGluIHRoZSBtYWNybworICAgdGFibGUuIFRoZW4gdGhlIGluZGljYXRlZCBzdWJzdHJpbmcgb2YgdGhlIG1hY3JvIGRlZmluaXRpb24gaXMKKyAgIHJldHVybmVkLiBFeGFtcGxlOgorCisgIGRlZmluZSB0ZXN0aW5nIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CisgIGRlZmluZSBcJWEgdGVzdGluZworCisgIFxzKHRlc3RpbmdbMjo2XSkgIC0tPiAgYmNkZWZnCisgIFw6KHRlc3RpbmdbMjo2XSkgIC0tPiAgZXN0aW5nCisgIFw6KFwlYVsyOjZdKSAgICAgIC0tPiAgZXN0aW5nCisgIFxzKFwlYVsyOjZdKSAgICAgIC0tPiAgYmNkZWZnCisKKyAgIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIHR3byBleGFtcGxlcyBhcmUgZXF1aXZhbGVudDoKKworICBcOihcbShmb28pWzI6Nl0pCisgIFxzKGZvb1syOjZdKQorCisgICBUaGUgZmlyc3QgbnVtYmVyIGluIHRoZSBicmFja2V0cyBpcyB0aGUgMS1iYXNlZCBzdGFydGluZyBwb3NpdGlvbi4gSWYKKyAgIGl0IGlzIG9taXR0ZWQsIG9yIGxlc3MgdGhhbiAxLCBpdCBpcyB0cmVhdGVkIGFzIDEuIElmIGl0IGlzIGdyZWF0ZXIKKyAgIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisKKyAgIFRoZSBzZWNvbmQgbnVtYmVyIGlzIHRoZSBsZW5ndGggb2YgdGhlIGRlc2lyZWQgc3Vic3RyaW5nLiBJZiB0aGUKKyAgIHNlY29uZCBudW1iZXIgaXMgb21pdHRlZCwgaXMgbGVzcyB0aGFuIDAsIG9yIHdvdWxkIGJlIHBhc3QgdGhlIGVuZCBvZgorICAgdGhlIHN0cmluZywgdGhlbiAidGhyb3VnaCB0aGUgZW5kIG9mIHRoZSBzdHJpbmciIGlzIGFzc3VtZWQuIElmIGl0IGlzCisgICAwLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorCisgICBJZiB0aGUgYnJhY2tldHMgYXJlIGVtcHR5IG9yIG9taXR0ZWQsIHRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQuCisKKyAgIFRoZSBzdGFydGluZyBwb3NpdGlvbiBhbmQgbGVuZ3RoIG5lZWQgbm90IGJlIGxpdGVyYWwgbnVtYmVyczsgdGhleSBjYW4KKyAgIGFsc28gYmUgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMsIG9yIGV2ZW4gb3RoZXIKKyAgIFxzKCkgb3IgXDooKSBxdWFudGl0aWVzOyBhbnl0aGluZyB0aGF0IGV2YWx1YXRlcyB0byBhIG51bWJlciwgZm9yCisgICBleGFtcGxlOgorCisgIFxzKGJsb2NrWzEwMjU6XGZoZXgybihccyhibG9ja1tcJWI6XCVuKzRdKSkvMl0pCisKKyAgIFN5bnRhY3RpY2FsbHksIFxtKG5hbWUpIGFuZCBccyhuYW1lKSBkaWZmZXIgb25seSBpbiB0aGF0IHRoZSBzZXF1ZW5jZQorICAgWypdIGF0IHRoZSBlbmQgb2YgdGhlIG5hbWUgKHdoZXJlICogaXMgYW55IHNlcXVlbmNlIG9mIDAgb3IgbW9yZQorICAgY2hhcmFjdGVycykgaXMgdHJlYXRlZCBhcyBzdWJzdHJpbmcgbm90YXRpb24gaW4gXHMobmFtZSksIGJ1dCBpcworICAgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBuYW1lIGluIFxtKG5hbWUpICh0byBzZWUgd2h5LCBzZWUgWzYyNF1TZWN0aW9uCisgICA3LjEwLjkpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDcuMjYuIE5ldyBXQUlUIENvbW1hbmQgT3B0aW9ucworCisgICBUaGUgV0FJVCBjb21tYW5kIGhhcyBiZWVuIGV4dGVuZGVkIHRvIGFsbG93IHdhaXRpbmcgZm9yIGRpZmZlcmVudAorICAga2luZHMgb2YgdGhpbmdzIChmb3JtZXJseSBpdCBvbmx5IHdhaXRlZCBmb3IgbW9kZW0gc2lnbmFscykuIE5vdyBpdAorICAgYWxzbyBjYW4gd2FpdCBmb3IgZmlsZSBldmVudHMuCisKKyAgICA3LjI2LjEuIFdhaXRpbmcgZm9yIE1vZGVtIFNpZ25hbHMKKworICAgVGhlIHByZXZpb3VzIHN5bnRheDoKKworICBXQUlUIHRpbWUgeyBDRCwgRFNSLCBSVFMsIFJJLCAuLi4gfQorCisgICBoYXMgY2hhbmdlZCB0bzoKKworICBXQUlUIHRpbWUgTU9ERU0tU0lHTkFMUyB7IENELCBEU1IsIFJUUywgUkksIC4uLiB9CisKKyAgIEhvd2V2ZXIsIHRoZSBwcmV2aW91cyBzeW50YXggaXMgc3RpbGwgYWNjZXB0ZWQuIFRoZSBiZWhhdmlvciBpcyB0aGUKKyAgIHNhbWUgaW4gZWl0aGVyIGNhc2UuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICA3LjI2LjIuIFdhaXRpbmcgZm9yIEZpbGUgRXZlbnRzCisKKyAgIFRoZSBuZXcgV0FJVCBvcHRpb246CisKKyAgV0FJVCB0aW1lIEZJTEUgeyBDUkVBVElPTiwgREVMRVRJT04sIE1PRElGSUNBVElPTiB9IGZpbGVuYW1lCisKKyAgIGxldHMgeW91IHRlbGwgS2VybWl0IHRvIHdhaXQgdGhlIGdpdmVuIGFtb3VudCBvZiB0aW1lIChvciB1bnRpbCB0aGUKKyAgIGdpdmVuIHRpbWUgb2YgZGF5KSBmb3IgYSBmaWxlIHdob3NlIG5hbWUgaXMgZmlsZW5hbWUgdG8gYmUgY3JlYXRlZCwKKyAgIGRlbGV0ZWQsIG9yIG1vZGlmaWVkLCByZXNwZWN0aXZlbHkuIFRoZSBmaWxlbmFtZSBtYXkgbm90IGNvbnRhaW4KKyAgIHdpbGRjYXJkcy4gSWYgdGhlIHNwZWNpZmllZCBldmVudCBkb2VzIG5vdCBvY2N1ciB3aXRoaW4gdGhlIHRpbWUKKyAgIGxpbWl0LCBvciBpZiBXQUlUIENBTkNFTExBVElPTiBpcyBPTiBhbmQgeW91IGludGVycnVwdCBmcm9tIHRoZQorICAga2V5Ym9hcmQgYmVmb3JlIHRoZSB0aW1lIGlzIHVwLCB0aGUgV0FJVCBjb21tYW5kIGZhaWxzLiBJZiB0aGUgZXZlbnQKKyAgIGlzIE1PRElGSUNBVElPTiBhbmQgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZSBjb21tYW5kIGZhaWxzLgorICAgT3RoZXJ3aXNlLCBpZiB0aGUgZ2l2ZW4gZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgdGltZSBsaW1pdCwgdGhlCisgICBjb21tYW5kIHN1Y2NlZWRzLiBFeGFtcGxlczoKKworICAgV0FJVCA2MDAgRklMRSBERUxFVElPTiBvb2ZhLnRtcAorICAgICAgICAgIFdhaXQgdXAgdG8gMTAgbWludXRlcyBmb3IgZmlsZSBvb2ZhLnRtcCB0byBkaXNhcHBlYXIuCisKKyAgIFdBSVQgMjM6NTk6NTkgRklMRSBNT0Qgb3JkZXJzLmRiCisgICAgICAgICAgV2FpdCB1bnRpbCBqdXN0IGJlZm9yZSBtaWRuaWdodCBmb3IgdGhlIG9yZGVycy5kYiBmaWxlIHRvIGJlCisgICAgICAgICAgY2hhbmdlZC4KKworICAgRXhhbXBsZTogU3VwcG9zZSB5b3Ugd2FudCB0byBoYXZlIHRoZSBjdXJyZW50IGNvcHkgb2YgL2V0Yy9tb3RkIG9uCisgICB5b3VyIHNjcmVlbiBhdCBhbGwgdGltZXMsIGFuZCB5b3Ugd2FudCB0byBoZWFyIGEgYmVsbCB3aGVuZXZlciBpdAorICAgY2hhbmdlczoKKworICBkZWYgXCVmIC9ldGMvbW90ZCAgICAgICAgICAgICAgICAgICAgICA7IFRoZSBmaWxlIG9mIGludGVyZXN0LgorICB3aGlsZSAxIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IExvb3AgZm9yZXZlci4uLgorICAgICAgY2xzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIHRoZSBzY3JlZW4uCisgICAgICBlY2hvIFwlZjogXHYoZGF0ZSkgXHYodGltZSkuLi4gICAgIDsgUHJpbnQgMi1saW5lIGhlYWRpbmcuLi4KKyAgICAgIGVjaG8KKyAgICAgIGlmICggbm90IGV4aXN0IFwlZiApIHsgICAgICAgICAgICAgOyBJZiBmaWxlIGRvZXNuJ3QgZXhpc3QsCisgICAgICAgICAgZWNobyBcJWYgZG9lcyBub3QgZXhpc3QuLi4gICAgIDsgcHJpbnQgbWVzc2FnZSwKKyAgICAgICAgICB3YWl0IDYwMCBmaWxlIGNyZWF0IFwlZiAgICAgICAgOyBhbmQgd2FpdCBmb3IgaXQgdG8gYXBwZWFyLgorICAgICAgICAgIGNvbnRpbnVlCisgICAgICB9CisgICAgICBiZWVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgU29tZXRoaW5nIG5ldyAtIGJlZXAuCisgICAgICB0eXBlIC9oZWFkOlx2KHJvd3MtMikgXCVmICAgICAgICAgIDsgRGlzcGxheSB0aGUgZmlsZQorICAgICAgaWYgZmFpbCBleGl0IDEgXCVmOiBcZmVycnN0cmluZygpICA7IChjaGVja2luZyBmb3IgZXJyb3JzKS4KKyAgICAgIHdhaXQgOTk5IGZpbGUgbW9kIFwlZiAgICAgICAgICAgICAgOyBXYWl0IGZvciBpdCB0byBjaGFuZ2UuCisgIH0KKworICAgVGhpcyBub3RpY2VzIHdoZW4gdGhlIGZpbGUgaXMgY3JlYXRlZCwgZGVsZXRlZCwgb3IgbW9kaWZpZWQsIGFuZCBhY3RzCisgICBvbmx5IHRoZW4gKG9yIHdoZW4geW91IGludGVycnVwdCBpdCB3aXRoKTsgdGhlIHRpbWUgc2hvd24gaW4gdGhlCisgICBoZWFkaW5nIGlzIHRoZSB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCBldmVudCAoaW5jbHVkaW5nIHdoZW4gdGhlCisgICBwcm9ncmFtIHN0YXJ0ZWQpLgorCisgICBTZWUgWzYyNV1TZWN0aW9uIDEuMTAsIHdoZXJlIHRoZSBcdihrYmNoYXIpIHZhcmlhYmxlIGlzIGV4cGxhaW5lZC4KKyAgIFRoaXMgbGV0cyB5b3UgbW9kaWZ5IGEgbG9vcCBsaWtlIHRoZSBvbmUgYWJvdmUgdG8gYWxzbyBhY2NlcHQKKyAgIHNpbmdsZS1jaGFyYWN0ZXIgY29tbWFuZHMsIHdoaWNoIGludGVycnVwdCB0aGUgV0FJVCwgYW5kIGRpc3BhdGNoCisgICBhY2NvcmRpbmdseS4gRm9yIGV4YW1wbGU6CisKKyAgd2FpdCA5OTkgZmlsZSBtb2QgXCVmICAgICAgICAgICAgICA7IFdhaXQgZm9yIHRoZSBmaWxlIHRvIGNoYW5nZS4KKyAgaWYgZGVmaW5lZCBcdihrYmNoYXIpIHsgICAgICAgICAgICA7IEludGVycnVwdGVkIGZyb20ga2V5Ym9hcmQ/CisgICAgICBzd2l0Y2ggXHYoa2JjaGFyKSB7ICAgICAgICAgICAgOyBIYW5kbGUgdGhlIGtleXN0cm9rZS4uLgorICAgICAgICA6cSwgZXhpdCAgICAgICAgICAgICAgICAgICAgIDsgUSB0byBRdWl0CisgICAgICAgIDpoLCBlY2hvIGJsYWggYmxhaCwgYnJlYWsgICAgOyBIIGZvciBIZWxwCisgICAgICAgIDpkZWZhdWx0LCBiZWVwLCBjb250aW51ZSAgICAgOyBBbnl0aGluZyBlbHNlIGJlZXAgYW5kIGlnbm9yZQorICAgICAgfQorICB9CisKKyAgIFRoaXMgbGV0cyB5b3Ugd3JpdGUgZXZlbnQtZHJpdmVuIGFwcGxpY2F0aW9ucyB0aGF0IHdhaXQgZm9yIHVwIHRvCisgICB0aHJlZSBldmVudHMgYXQgb25jZTogYSBmaWxlIG9yIG1vZGVtIGV2ZW50LCBhIHRpbWVvdXQsIGFuZCBhCisgICBrZXlzdHJva2UuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNy4yNy4gUmVsYXhlZCBGT1IgYW5kIFNXSVRDSCBTeW50YXgKKworICAgRm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIGV4dGVuZGVkIElGIGFuZCBXSElMRSBzeW50YXgsIHRoZSBGT1IgYW5kCisgICBTV0lUQ0ggY29udHJvbCBsaXN0cyBtYXkgKGJ1dCBuZWVkIG5vdCBiZSkgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXM6CisKKyAgRk9SICggXCVpIDEgXCVuIDEgKSB7IGNvbW1hbmQtbGlzdC4uLiB9CisgIFNXSVRDSCAoIFwlYyApIHsgY29tbWFuZC1saXN0Li4uIH0KKworICAgSW4gdGhlIEZPUiBjb21tYW5kLCB0aGUgaW5jcmVtZW50IGl0ZW0gY2FuIGJlIG9taXR0ZWQgaWYgdGhlIGNvbnRyb2wKKyAgIGxpc3QgaXMgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMsIGluIHdoaWNoIGNhc2UgdGhlIGluY3JlbWVudCBkZWZhdWx0cworICAgYXBwcm9wcmlhdGVseSB0byAxIG9yIC0xLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBvZiB0aGUgZmlyc3QgdHdvCisgICB2YXJpYWJsZXMuCisKKyAgIEFzIHdpdGggSUYsIHRoZSBwYXJlbnRoZXNlcyBhcm91bmQgdGhlIEZPUi1jb21tYW5kIGNvbnRyb2wgbGlzdCBtdXN0CisgICBiZSBzZXQgb2ZmIGJ5IHNwYWNlcyAoaW4gdGhlIFNXSVRDSCBjb21tYW5kLCB0aGUgc3BhY2VzIGFyZSBub3QKKyAgIHJlcXVpcmVkIHNpbmNlIHRoZSBTV0lUQ0ggZXhwcmVzc2lvbiBpcyBhIHNpbmdsZSBhcml0aG1ldGljCisgICBleHByZXNzaW9uKS4KKworICAgQWxzbywgb3V0ZXIgYnJhY2VzIGFyb3VuZCB0aGUgY29tbWFuZCBsaXN0IGFyZSBzdXBwbGllZCBhdXRvbWF0aWNhbGx5CisgICBpZiB5b3Ugb21pdCB0aGVtLCBlLmcuOgorCisgIEZPUiAoIFwlaSAxICVuIDEgKSBlY2hvIFwlaQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDguIFVTSU5HIE9USEVSIEZJTEUgVFJBTlNGRVIgUFJPVE9DT0xTCisKKyAgIEluIEMtS2VybWl0IDcuMCwgYWx0ZXJuYXRpdmUgcHJvdG9jb2xzIGNhbiBiZSBzZWxlY3RlZCB1c2luZyBzd2l0Y2hlcy4KKyAgIFN3aXRjaGVzIGFyZSBkZXNjcmliZWQgaW4gWzYyNl1TZWN0aW9uIDEuNTsgdGhlIHVzZSBvZgorICAgcHJvdG9jb2wtc2VsZWN0aW9uIHN3aXRjaGVzIGlzIGRlc2NyaWJlZCBpbiBbNjI3XVNlY3Rpb24gNC43LjEuCisgICBFeGFtcGxlOgorCisgIHNlbmQgL2JpbmFyeSAvcHJvdG9jb2w6em1vZGVtIHgudGFyLmd6CisKKyAgIE5vdGUgdGhhdCBmaWxlIHRyYW5zZmVyIHJlY292ZXJ5IHdvcmtzIG9ubHkgd2l0aCBLZXJtaXQgYW5kIFptb2RlbQorICAgcHJvdG9jb2xzLiBXaXRoIFptb2RlbSwgcmVjb3ZlcnkgY2FuIGJlIGluaXRpYXRlZCBvbmx5IGJ5IHRoZSBzZW5kZXIuCisKKyAgIE9ubHkgcHJlLTE5ODggdmVyc2lvbnMgb2YgdGhlIHB1YmxpY2x5LWRpc3RyaWJ1dGVkIHN6L3J6IHByb2dyYW1zIHVzZQorICAgU3RhbmRhcmQgSS9POyB0aG9zZSByZWxlYXNlZCBsYXRlciB0aGFuIHRoYXQgZG8gbm90IHVzZSBTdGFuZGFyZCBJL08KKyAgIGFuZCB0aGVyZWZvcmUgZG8gbm90IHdvcmsgd2l0aCBSRURJUkVDVC4gSG93ZXZlciwgT21lbiBUZWNobm9sb2d5IGRvZXMKKyAgIG9mZmVyIGFuIHVwLXRvLWRhdGUgcmVkaXJlY3RhYmxlIHZlcnNpb24gY2FsbGVkIGNyenN6LCB3aGljaCBtdXN0IGJlCisgICBsaWNlbnNlZCBmb3IgdXNlOgorCisgICAgICJVbml4IENyeiBhbmQgQ3N6IHN1cHBvcnQgWE1PREVNLCBZTU9ERU0sIGFuZCBaTU9ERU0gdHJhbnNmZXJzIHdoZW4KKyAgICAgY2FsbGVkIGJ5IGRpYWwtb3V0IHByb2dyYW1zIHN1Y2ggYXMgS2VybWl0IGFuZCBjZXJ0YWluIHZlcnNpb25zIG9mCisgICAgIGN1KDEpLiBUaGV5IGFyZSBjbGllbnRzIGRlc2lnbmVkIGZvciB0aGlzIHVzZS4KKworICAgICAiQ3J6IGFuZCBDc3ogYXJlIENvcHlyaWdodGVkIHNoYXJld2FyZSBwcm9ncmFtcy4gVXNlIG9mIHRoZXNlCisgICAgIHByb2dyYW1zIGJleW9uZCBhIGJyaWVmIGV2YWx1YXRpb24gcGVyaW9kIHJlcXVpcmVzIHJlZ2lzdHJhdGlvbi4KKyAgICAgUGxlYXNlIHByaW50IHRoZSAibWFpbGVyLnJ6IiBmaWxlLCBmaWxsIG91dCB0aGUgZm9ybSBhbmQgcmV0dXJuCisgICAgIHNhbWUgd2l0aCB5b3VyIHJlZ2lzdHJhdGlvbi4iCisKKyAgIFRvIHVzZSB0aGUgY3J6c3ogcHJvZ3JhbXMgYXMgeW91ciBleHRlcm5hbCBYWVpNT0RFTSBwcm9ncmFtcyBpbgorICAgQy1LZXJtaXQsIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBib29rLCBidXQgcHV0IGEgImMiIGJlZm9yZQorICAgZWFjaCBjb21tYW5kLCBlLmcuOgorCisgIHNldCBwcm90b2NvbCB6bW9kZW0ge2NzeiAlc30ge2NzeiAtYSAlc30gY3J6IGNyeiBjcnogY3J6CisKKyAgIFRvIHVzZSBabW9kZW0gcHJvdG9jb2wgb3ZlciBUZWxuZXQgb3Igb3RoZXIgbm9uLXRyYW5zcGFyZW50CisgICBjb25uZWN0aW9ucywgeW91IG1pZ2h0IG5lZWQgdG8gYWRkIHRoZSAtZSAoRXNjYXBlKSBvcHRpb246CisKKyAgc2V0IHByb3RvY29sIHptb2RlbSB7Y3N6IC1lICVzfSB7Y3N6IC1lIC1hICVzfSBjcnogY3J6IGNyeiBjcnoKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA5LiBDT01NQU5ELUxJTkUgT1BUSU9OUworCisgIDkuMC4gRXh0ZW5kZWQtRm9ybWF0IENvbW1hbmQtTGluZSBPcHRpb25zCisKKyAgIFN0YW5kYXJkIFVOSVggY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlIGEgc2luZ2xlIGxldHRlci4gQy1LZXJtaXQgaGFzCisgICBydW4gb3V0IG9mIGxldHRlcnMsIHNvIG5ldyBvcHRpb25zIGFyZSBpbiBhIG5ldyBleHRlbmRlZCBmb3JtYXQ6CisKKyAtLXdvcmRbOmFyZ10KKworICAgd2hlcmUgYSBrZXl3b3JkIChyYXRoZXIgdGhhbiBhIHNpbmdsZSBsZXR0ZXIpIHNwZWNpZmllcyB0aGUgZnVuY3Rpb24sCisgICBhbmQgaWYgYW4gYXJndW1lbnQgaXMgdG8gYmUgaW5jbHVkZWQsIGl0IGlzIHNlcGFyYXRlZCBieSBhIGNvbG9uIChvcgorICAgZXF1YWwgc2lnbikuIE1vc3Qgb2YgdGhlIG5ldyBleHRlbmRlZC1mb3JtYXQgY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlCisgICBvbmx5IGZvciB1c2Ugd2l0aCB0aGUgSW50ZXJuZXQgS2VybWl0IFNlcnZpY2UgRGFlbW9uOyBzZWUgdGhlCisgICBbNjI4XUlLU0QgQWRtaW5pc3RyYXRpb24gR3VpZGUgZm9yIGRldGFpbHMuIEhvd2V2ZXIsIHNldmVyYWwgb2YgdGhlbQorICAgYXJlIGFsc28gZ2VuZXJhbCBpbiBuYXR1cmU6CisKKyAgIC0tbm9pbnRlcnJ1cHRzCisgICAgICAgICAgRGlzYWJsZXMga2V5Ym9hcmQgaW50ZXJydXB0cyB0aGF0IGFyZSBub3JtYWxseSBlbmFibGVkLCB3aGljaAorICAgICAgICAgIGFyZSB1c3VhbGx5IEN0cmwtQyAodG8gaW50ZXJydXB0IGEgY29tbWFuZCkgYW5kIEN0cmwtWiAoVU5JWAorICAgICAgICAgIG9ubHksIHRvIHN1c3BlbmQgQy1LZXJtaXQpLgorCisgICAtLWhlbHAKKyAgICAgICAgICBMaXN0cyB0aGUgZXh0ZW5kZWQgY29tbWFuZC1saW5lIG9wdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIGluCisgICAgICAgICAgeW91ciB2ZXJzaW9uIG9mIEMtS2VybWl0LiBJZiBhbnkgb3B0aW9ucyBzZWVtIHRvIGJlIG1pc3NpbmcsCisgICAgICAgICAgdGhhdCBpcyBiZWNhdXNlIHlvdXIgY29weSBvZiBDLUtlcm1pdCB3YXMgYnVpbHQgd2l0aAorICAgICAgICAgIGNvbXBpbGUtdGltZSBvcHRpb25zIHRvIGRlc2VsZWN0IHRoZW0uCisKKyAgIC0taGVscGZpbGU6ZmlsZW5hbWUKKyAgICAgICAgICBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaWxlIHRvIGJlIGRpc3BsYXllZCBpZiB0aGUgdXNlciB0eXBlcworICAgICAgICAgIEhFTFAgKG5vdCBmb2xsb3dlZCBieSBhIHNwZWNpZmljIGNvbW1hbmQgb3IgdG9waWMpLCBpbiBwbGFjZSBvZgorICAgICAgICAgIHRoZSBidWlsdC1pbiB0b3AtbGV2ZWwgaGVscCB0ZXh0LiBUaGUgZmlsZSBuZWVkIG5vdCBmaXQgb24gb25lCisgICAgICAgICAgc2NyZWVuOyBtb3JlLXByb21wdGluZyBpcyB1c2VkIGlmIHRoZSBmaWxlIGlzIG1vcmUgdGhhbiBvbmUKKyAgICAgICAgICBzY3JlZW4gbG9uZyBpZiBDT01NQU5EIE1PUkUtUFJPTVBUSU5HIGlzIE9OLCBhcyBpdCBpcyBieQorICAgICAgICAgIGRlZmF1bHQuCisKKyAgIC0tYmFubmVyZmlsZTpmaWxlbmFtZQorICAgICAgICAgIFRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbWVzc2FnZSB0byBiZSBwcmludGVkIGFmdGVyIHRoZQorICAgICAgICAgIHVzZXIgbG9ncyBpbiwgaW4gcGxhY2Ugb2YgdGhlIG5vcm1hbCBtZXNzYWdlIChDb3B5cmlnaHQgbm90aWNlLAorICAgICAgICAgICJUeXBlIEhFTFAgb3IgPyBmb3IgaGVscCIsICJEZWZhdWx0IHRyYW5zZmVyIG1vZGUgaXMuLi4iLCBldGMpLgorCisgICAtLWNkbWVzc2FnZTp7b24sb2ZmLDAsMSwyfQorICAgICAgICAgIEZvciB1c2UgaW4gdGhlIFNlcnZlci1TaWRlIFNlcnZlciBjb25maWd1cmF0aW9uOyB3aGVuZXZlciB0aGUKKyAgICAgICAgICBjbGllbnQgdGVsbHMgdGhlIHNlcnZlciB0byBjaGFuZ2UgZGlyZWN0b3J5LCB0aGUgc2VydmVyIHNlbmRzCisgICAgICAgICAgdGhlIGNvbnRlbnRzIG9mIGEgInJlYWQgbWUiIGZpbGUgdG8gdGhlIGNsaWVudCdzIHNjcmVlbi4gVGhpcworICAgICAgICAgIGZlYXR1cmUgaXMgT24gYnkgZGVmYXVsdCwgYW5kIG9wZXJhdGVzIG9ubHkgaW4gY2xpZW50L3NlcnZlcgorICAgICAgICAgIG1vZGUgd2hlbiBPTiBvciAxLiBJZiBzZXQgdG8gMiBvciBoaWdoZXIsIGl0IGFsc28gb3BlcmF0ZXMgd2hlbgorICAgICAgICAgIHRoZSBDRCBjb21tYW5kIGlzIGdpdmVuIGF0IHRoZSBJS1NEPiBwcm9tcHQuIFN5bm9ueW06IC0tY2Rtc2cuCisKKyAgIC0tY2RmaWxlOmZpbGVuYW1lCisgICAgICAgICAgV2hlbiBjZG1lc3NhZ2UgaXMgb24sIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlICJyZWFkIG1lIiBmaWxlIHRvCisgICAgICAgICAgYmUgc2VudC4gTm9ybWFsbHkgeW91IHdvdWxkIHNwZWNpZnkgYSByZWxhdGl2ZSAobm90IGFic29sdXRlKQorICAgICAgICAgIG5hbWUsIHNpbmNlIHRoZSBmaWxlIGlzIG9wZW5lZCB1c2luZyB0aGUgbGl0ZXJhbCBuYW1lIHlvdQorICAgICAgICAgIHNwZWNpZmllZCwgYWZ0ZXIgY2hhbmdpbmcgdG8gdGhlIG5ldyBkaXJlY3RvcnkuIEV4YW1wbGU6CisKKyAgLS1jZGZpbGU6UkVBRC5NRQorCisgICAgICAgICAgWW91IGNhbiBhbHNvIGdpdmUgYSBsaXN0IG9mIHVwIHRvIDggZmlsZW5hbWVzIGJ5IChhKSBlbmNsb3NpbmcKKyAgICAgICAgICBlYWNoIGZpbGVuYW1lIGluIGJyYWNlcywgYW5kIChiKSBlbmNsb3NpbmcgdGhlIGVudGlyZSBsaXN0IGluCisgICAgICAgICAgYnJhY2VzLiBFeGFtcGxlOgorICAgICAgICAgIC0tY2RmaWxlOnt7Li8ucmVhZG1lfXtSRUFELk1FfXthYWFyZWFkbWUudHh0fXtSRUFETUV9e3JlYWQtdGhpcworICAgICAgICAgIC1maXJzdH19IFdoZW4gYSBsaXN0IGlzIGdpdmVuLCBpdCBpcyBzZWFyY2hlZCBmcm9tIGxlZnQgdG8KKyAgICAgICAgICByaWdodCBhbmQgdGhlIGZpcnN0IGZpbGUgZm91bmQgaXMgZGlzcGxheWVkLiBUaGUgZGVmYXVsdCBsaXN0CisgICAgICAgICAgZm9yIFVOSVggaXM6CisKKyAge3suLy5yZWFkbWV9e1JFQURNRS5UWFR9e1JFQUQuTUV9fQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDkuMS4gQ29tbWFuZCBMaW5lIFBlcnNvbmFsaXRpZXMKKworICAgQmVnaW5uaW5nIGluIHZlcnNpb24gNy4wLCBpZiB0aGUgQy1LZXJtaXQgYmluYXJ5IGlzIHJlbmFtZWQgdG8KKyAgICJ0ZWxuZXQiIChvciBURUxORVQuRVhFLCB0ZWxuZXQucHIsIGV0YywgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSksCisgICBpdCBhY2NlcHRzIHRoZSBUZWxuZXQgY29tbWFuZCBsaW5lOgorCisgIHRlbG5ldCBbIGhvc3QgWyBwb3J0IF0gXQorCisgICBJbiBVbml4LCB5b3UgY2FuIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0IHdpdGggYSBzeW1saW5rOgorCisgIGNkIC91c3IvYmluCisgIG12IHRlbG5ldCBvbGR0ZWxuZXQKKyAgbG4gLWxzIC91c3IvbG9jYWwvYmluL2tlcm1pdCB0ZWxuZXQKKworICAgV2hlbiBpbnN0YWxsZWQgaW4gdGhpcyBtYW5uZXIsIEMtS2VybWl0IGFsd2F5cyByZWFkcyBpdHMKKyAgIGluaXRpYWxpemF0aW9uIGZpbGUuIElmIG5vIGhvc3QgKGFuZCB0aGVyZWZvcmUgbm8gcG9ydCkgaXMgZ2l2ZW4sCisgICBDLUtlcm1pdCBzdGFydHMgaW4gaW50ZXJhY3RpdmUgcHJvbXB0aW5nIG1vZGUuIElmIGEgaG9zdCBpcyBnaXZlbiBhcworICAgdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudCwgQy1LZXJtaXQgbWFrZXMgYSBjb25uZWN0aW9uIHRvIGl0LgorICAgVGhlIGhvc3QgYXJndW1lbnQgY2FuIGJlIGFuIElQIGhvc3QgbmFtZSBvciBhZGRyZXNzLCBvciB0aGUgbmFtZSBvZiBhCisgICBUQ1AvSVAgZW50cnkgaW4geW91ciBDLUtlcm1pdCBuZXR3b3JrIGRpcmVjdG9yeS4KKworICAgSWYgYSBwb3J0IGlzIGdpdmVuLCBpdCBpcyB1c2VkLiBJZiBhIHBvcnQgaXMgbm90IGdpdmVuLCB0aGVuIGlmIHRoZQorICAgaG9zdG5hbWUgd2FzIGZvdW5kIGluIHlvdXIgbmV0d29yayBkaXJlY3RvcnkgYW5kIHBvcnQgd2FzIGFsc28gbGlzdGVkCisgICB0aGVyZSwgdGhlbiB0aGF0IHBvcnQgaXMgdXNlZC4gT3RoZXJ3aXNlIHBvcnQgMjMgKHRoZSBUZWxuZXQgcG9ydCkgaXMKKyAgIHVzZWQuCisKKyAgIFdoZW4gQy1LZXJtaXQgaXMgY2FsbGVkICJ0ZWxuZXQiIGFuZCBpdCBpcyBpbnZva2VkIHdpdGggYSBob3N0bmFtZSBvbgorICAgdGhlIGNvbW1hbmQgbGluZSwgaXQgZXhpdHMgYXV0b21hdGljYWxseSB3aGVuIHRoZSBjb25uZWN0aW9uIGlzCisgICBjbG9zZWQuIFdoaWxlIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4sIGhvd2V2ZXIsIHlvdSBtYXkgZXNjYXBlIGJhY2sgYW5kCisgICBmb3J0aCBhcyBtYW55IHRpbWVzIGFzIHlvdSBsaWtlLCB0cmFuc2ZlciBmaWxlcywgZXRjLgorCisgICBBbiBybG9naW4gcGVyc29uYWxpdHkgaXMgYWxzbyBhdmFpbGFibGUsIGJ1dCBpdCBpcyBsZXNzIHVzZWZ1bCwgYXQKKyAgIGxlYXN0IGluIFVOSVggYW5kIFZNUywgd2hlcmUgdGhlIFJsb2dpbiBUQ1AgcG9ydCBpcyBwcml2aWxlZ2VkLgorCisgICBUaGUgbmV3IHZhcmlhYmxlIFx2KG5hbWUpIGluZGljYXRlcyB0aGUgbmFtZSB3aXRoIHdoaWNoIEMtS2VybWl0IHdhcworICAgaW52b2tlZCAoImtlcm1pdCIsICJ3ZXJtaXQiLCAiazk1IiwgInRlbG5ldCIsIGV0YykuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOS4yLiBCdWlsdC1pbiBIZWxwIGZvciBDb21tYW5kIExpbmUgT3B0aW9ucworCisgICAia2VybWl0IC1oIiwgZ2l2ZW4gZnJvbSB0aGUgc3lzdGVtIHByb21wdCwgbGlzdHMgYXMgbWFueSBjb21tYW5kLWxpbmUKKyAgIG9wdGlvbnMgYXMgd2lsbCBmaXQgb24gYSBzdGFuZGFyZCAyNHg4MCBzY3JlZW4uIEZvciBtb3JlIGNvbXByZWhlbnNpdmUKKyAgIGhlbHAsIHVzZSB0aGUgaW50ZXJhY3RpdmUgSEVMUCBPUFRJT05TIGNvbW1hbmQgdGhhdCB3YXMgYWRkZWQgaW4KKyAgIEMtS2VybWl0IDcuMDoKKworICAgSEVMUCBPUFRJT05TCisgICBFeHBsYWlucyBob3cgY29tbWFuZC1saW5lIG9wdGlvbnMgd29yaywgdGhlaXIgc3ludGF4LCBldGMuCisKKyAgIEhFTFAgT1BUSU9OUyBBTEwKKyAgIExpc3RzIGFsbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBhbmQgZ2l2ZXMgYnJpZWYgaGVscCBhYm91dCBlYWNoIG9uZS4KKworICAgSEVMUCBPUFRJT04geAorICAgR2l2ZXMgYnJpZWYgaGVscCBhYm91dCBvcHRpb24gIngiLgorCisgICBIRUxQIEVYVEVOREVELU9QVElPTlMKKyAgIExpc3RzIHRoZSBhdmFpbGFibGUgZXh0ZW5kZWQtZm9ybWF0IGNvbW1hbmQtbGluZSBvcHRpb25zLgorCisgICBIRUxQIEVYVEVOREVELU9QVElPTiB4eHgKKyAgIEdpdmVzIGhlbHAgZm9yIHRoZSBzcGVjaWZpZWQgZXh0ZW5kZWQgb3B0aW9uLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDkuMy4gTmV3IENvbW1hbmQtTGluZSBPcHRpb25zCisKKyAgIENvbW1hbmQtbGluZSBvcHRpb25zIGFkZGVkIHNpbmNlIEMtS2VybWl0IDYuMCBhcmU6CisKKyAgICsKKyAgICAgICAgICAocGx1cyBzaWduIGJ5IGl0c2VsZik6IFRoZSBuZXh0IGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIGEKKyAgICAgICAgICBzY3JpcHQgdG8gZXhlY3V0ZTsgYWxsIHN1YnNlcXVlbnQgYXJndW1lbnRzIGFyZSBpZ25vcmVkIGJ5CisgICAgICAgICAgQy1LZXJtaXQgaXRzZWxmLCBidXQgcGFzc2VkIHRvIHRoZSBzY3JpcHQgYXMgdG9wLWxldmVsIGNvcGllcworICAgICAgICAgIG9mIFwlMSwgXCUyLCBldGM7IHRoZSBcJl9bXSBpcyBhbHNvIHNldCBhY2NvcmRpbmdseS4gXCUwIGFuZAorICAgICAgICAgIFwmX1swXSBiZWNvbWUgdGhlIG5hbWUgb2YgdGhlIHNjcmlwdCBmaWxlLCByYXRoZXIgdGhhbiB0aGUKKyAgICAgICAgICBwYXRobmFtZSBvZiB0aGUgQy1LZXJtaXQgcHJvZ3JhbSwgd2hpY2ggaXMgaXRzIG5vcm1hbCB2YWx1ZS4KKyAgICAgICAgICBQcmltYXJpbHkgZm9yIHVzZSBpbiB0aGUgdG9wIGxpbmUgb2YgIktlcmJhbmciIHNjcmlwdHMgaW4gVU5JWAorICAgICAgICAgIChzZWUgWzYyOV1TZWN0aW9uIDcuMTkpLiBFeGFtcGxlIGZyb20gVU5JWCBjb21tYW5kIGxpbmU6CisKKyAgJCBrZXJtaXQgWyByZWd1bGFyIGtlcm1pdCBhcmdzIF0gKyBmaWxlbmFtZQorCisgICAgICAgICAgU2FtcGxlIGZpcnN0IGxpbmUgb2YgS2VyYmFuZyBzY3JpcHQ6CisKKyAgIyEvdXNyL2xvY2FsL2Jpbi9rZXJtaXQgKworCisgICAtLQorICAgICAgICAgICh0d28gaHlwaGVucyBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UpIEVxdWl2YWxlbnQgdG8gIj0iLCBmb3IKKyAgICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggVU5JWCBnZXRvcHQoMSwzKS4KKworICAgLUcKKyAgICAgICAgICBHRVQgKGxpa2UgLWcpLCBidXQgc2VuZCB0aGUgaW5jb21pbmcgZmlsZSB0byBzdGFuZGFyZCBvdXRwdXQuCisgICAgICAgICAgRXhhbXBsZTogImtlcm1pdCAtRyBvb2ZhLnR4dCB8IGxwciIgcmV0cmlldmVzIGEgZmlsZSBmcm9tIHlvdXIKKyAgICAgICAgICBsb2NhbCBjb21wdXRlciAocHJvdmlkaW5nIGl0IGlzIHJ1bm5pbmcgYSBLZXJtaXQgcHJvZ3JhbSB0aGF0CisgICAgICAgICAgc3VwcG9ydHMgdGhlIGF1dG9kb3dubG9hZCBmZWF0dXJlIGFuZCBoYXMgaXQgZW5hYmxlZCkgYW5kCisgICAgICAgICAgcHJpbnRzIGl0LgorCisgICAtTworICAgICAgICAgIGVxdWl2YWxlbnQgdG8gLXggKHN0YXJ0IHVwIGluIHNlcnZlciBtb2RlKSwgYnV0IGV4aXRzIGFmdGVyIHRoZQorICAgICAgICAgIGZpcnN0IGNsaWVudCBjb21tYW5kIGhhcyBiZWVuIGV4ZWN1dGVkIChtbmVtb25pYzogTyA9IE9ubHkKKyAgICAgICAgICBPbmUpLiBUaGlzIG9uZSBpcyBoYW5keSByZXBsYWNpbmcgImtlcm1pdCAteCIgaW4gdGhlCisgICAgICAgICAgImF1dG9tYXRpY2FsbHkgc3RhcnQgS2VybWl0IG9uIHRoZSBvdGhlciBlbmQiIHN0cmluZzoKKworICBzZXQgcHJvdG9jb2wga2VybWl0IHtrZXJtaXQgLWlyfSB7a2VybWl0IC1yfSB7a2VybWl0IC14fQorCisgICAgICAgICAgc2luY2UgLXggbGVhdmVzIHRoZSByZW1vdGUgS2VybWl0IGluIHNlcnZlciBtb2RlIGFmdGVyIHRoZQorICAgICAgICAgIHRyYW5zZmVyLCB3aGljaCBjYW4gYmUgY29uZnVzaW5nLCB3aGVyZWFzIC1PIG1ha2VzIGl0IGdvIGF3YXkKKyAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSB0cmFuc2Zlci4KKworICAgLUwKKyAgICAgICAgICBSZWN1cnNpdmUsIHdoZW4gdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIC1zIChtbmVtb25pYzogTCA9CisgICAgICAgICAgTGV2ZWxzKS4gSW4gVU5JWCBvciBvdGhlciBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIHNoZWxsIGV4cGFuZHMKKyAgICAgICAgICB3aWxkY2FyZHMgaXRzZWxmLCB0aGUgLXMgYXJndW1lbnQsIGlmIGl0IGNvbnRhaW5zIHdpbGRjYXJkcywKKyAgICAgICAgICBtdXN0IGJlIHF1b3RlZCB0byBwcmV2ZW50IHRoaXMsIGUuZy46CisKKyAga2VybWl0IC1MIC1zICIqLmMiCisKKyAgICAgICAgICBJbiBVTklYIG9ubHksICJrZXJtaXQgLUwgLXMgLiIgbWVhbnMgdG8gc2VuZCB0aGUgY3VycmVudAorICAgICAgICAgIGRpcmVjdG9yeSB0cmVlLiBTZWUgWzYzMF1TZWN0aW9ucyA0LjEwIGFuZCBbNjMxXTQuMTEgYWJvdXQKKyAgICAgICAgICByZWN1cnNpdmUgZmlsZSB0cmFuc2Zlci4KKworICAgLVYKKyAgICAgICAgICBFcXVpdmFsZW50IHRvIFNFVCBGSUxFIFBBVFRFUk5TIE9GRiAoWzYzMl1TZWN0aW9uIDQuMykgYW5kIFNFVAorICAgICAgICAgIFRSQU5TRkVSIE1PREUgTUFOVUFMLiBJbiBvdGhlciB3b3JkcywgdGFrZSB0aGUgRklMRSBUWVBFCisgICAgICAgICAgc2V0dGluZyBsaXRlcmFsbHkuIEZvciBleGFtcGxlLCAia2VybWl0IC1WVCBvb2ZhLmJpbiIgbWVhbnMKKyAgICAgICAgICBzZW5kIHRoZSBmaWxlIGluIFRleHQgbW9kZSwgbm8gbWF0dGVyIHdoYXQgaXRzIG5hbWUgaXMgYW5kIG5vCisgICAgICAgICAgbWF0dGVyIHdoZXRoZXIgYSBraW5kcmVkIHNwaXJpdCBpcyByZWNvZ25pemVkIGF0IHRoZSBvdGhlciBlbmQKKyAgICAgICAgICBvZiB0aGUgY29ubmVjdGlvbi4KKworICAgLTAKKyAgICAgICAgICAoZGlnaXQgemVybykgbWVhbnMgImJlIDEwMCUgdHJhbnNwYXJlbnQgaW4gQ09OTkVDVCBtb2RlIi4gVGhpcworICAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBzZXJpZXMgb2YgY29tbWFuZHM6IFNFVCBQQVJJVFkKKyAgICAgICAgICBOT05FLCBTRVQgQ09NTUFORCBCWVRFU0laRSA4LCBTRVQgVEVSTUlOQUwgQllURVNJWkUgOCwgU0VUIEZMT1cKKyAgICAgICAgICBOT05FLCBTRVQgVEVSTSBFU0NBUEUgRElTQUJMRUQsIFNFVCBURVJNIENIQVIgVFJBTlNQQVJFTlQsIFNFVAorICAgICAgICAgIFRFUk0gQVVUT0RPV05MT0FEIE9GRiwgU0VUIFRFUk0gQVBDIE9GRiwgU0VUIFRFTE9QVCBLRVJNSVQKKyAgICAgICAgICBSRUZVU0UgUkVGVVNFLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEwLiBDLUtFUk1JVCBBTkQgRy1LRVJNSVQKKworICAgRXZlcnkgbXVsdGlmdW5jdGlvbmVkIGFuZCBsb25nLWxpdmVkIHNvZnR3YXJlIHByb2dyYW0gZ3Jvd3MgaW4KKyAgIGNvbXBsZXhpdHkgYW5kIHNpemUgb3ZlciB0aW1lIHRvIG1lZXQgdGhlIG5lZWRzIGFuZCByZXF1ZXN0cyBvZiBpdHMKKyAgIHVzZXJzIGFuZCB0aGUgZGVtYW5kcyBvZiB0aGUgdW5kZXJseWluZyB0ZWNobm9sb2d5IGFzIGl0IGNoYW5nZXMuCisKKyAgIEV2ZW50dWFsbHkgdXNlcnMgYmVnaW4gdG8gbm90aWNlIGhvdyBiaWcgdGhlIGFwcGxpY2F0aW9uIGhhcyBncm93biwKKyAgIGhvdyBtdWNoIGRpc2sgc3BhY2UgaXQgb2NjdXBpZXMsIGhvdyBsb25nIGl0IHRha2VzIHRvIGxvYWQsIGFuZCB0aGV5CisgICBzdGFydCB0byBsb25nIGZvciB0aGUgZ29vZCBvbGQgZGF5cyB3aGVuIGl0IHdhcyBsZWFuIGFuZCBtZWFuLiBOb3QKKyAgIGxvbmcgYWZ0ZXIgdGhhdCB0aGV5IGJlZ2luIGFza2luZyBmb3IgYSAibGlnaHQiIHZlcnNpb24gdGhhdCBvbmx5IGRvZXMKKyAgIHRoZSBiYXNpY3Mgd2l0aCBubyBmcmlsbHMuCisKKyAgIEFuZCBzbyBpdCBpcyB3aXRoIEMtS2VybWl0LiBBICJsaWdodCIgdmVyc2lvbiBvZiBLZXJtaXQgd2FzIHJlbGVhc2VkCisgICAoZm9yIFVOSVggb25seSkgaW4gRGVjZW1iZXIgMTk5OSB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2U7CisgICB0aHVzIGl0IGlzIGNhbGxlZCBHLUtlcm1pdCAoZm9yIEdOVSBLZXJtaXQpLiBBbGwgaXQgZG9lcyBpcyBzZW5kIGFuZAorICAgcmVjZWl2ZSBmaWxlcywgcGVyaW9kLiBZb3UgY2FuIGZpbmQgaXQgYXQ6CisKKyAgWzYzM11odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvZ2tlcm1pdC5odG1sCisKKyAgIFdoZXJlIHRoZSBDLUtlcm1pdCA3LjAgYmluYXJ5IG1pZ2h0IGJlIGFueXdoZXJlIGZyb20gMSB0byAzIG1pbGxpb24KKyAgIGJ5dGVzIGluIHNpemUsIHRoZSBHLUtlcm1pdCBiaW5hcnkgcmFuZ2VzIGZyb20gMzBLIHRvIDEwMEssIGRlcGVuZGluZworICAgb24gdGhlIHVuZGVybHlpbmcgYXJjaGl0ZWN0dXJlIChSSVNDIHZzIENJU0MsIGV0YykuCisKKyAgIEctS2VybWl0IGFuZCBDLUtlcm1pdCBtYXkgcmVzaWRlIHNpZGUtYnktc2lkZSBvbiB0aGUgc2FtZSBjb21wdXRlci4KKyAgIEctS2VybWl0IGRvZXMgbm90IG1ha2UgY29ubmVjdGlvbnM7IGl0IGRvZXMgbm90IGhhdmUgYSBzY3JpcHQKKyAgIGxhbmd1YWdlOyBpdCBkb2VzIG5vdCB0cmFuc2xhdGUgY2hhcmFjdGVyIHNldHMuIEctS2VybWl0IG1heSBiZSB1c2VkCisgICBpbnN0ZWFkIG9mIEMtS2VybWl0IHdoZW46CisKKyAgICAgKiBJdCBpcyBvbiB0aGUgcmVtb3RlIGVuZC4KKyAgICAgKiBGaWxlcyBhcmUgdG8gYmUgdHJhbnNmZXJyZWQgaW4gYmluYXJ5IG1vZGUgb3IgaW4gdGV4dCBtb2RlIHdpdGhvdXQKKyAgICAgICBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uLgorICAgICAqIEZpbGUgdGltZXN0YW1wcyBkb24ndCBuZWVkIHRvIGJlIHByZXNlcnZlZC4KKworICAgSW4gc3VjaCBjYXNlcyBHLUtlcm1pdCBtaWdodCBiZSBwcmVmZXJyZWQgc2luY2UgaXQgZ2VuZXJhbGx5IHN0YXJ0cyB1cAorICAgZmFzdGVyLCBhbmQgeWV0IHRyYW5zZmVycyBmaWxlcyBqdXN0IGFzIGZhc3Qgb24gbW9zdCAoYnV0IG5vdAorICAgbmVjZXNzYXJpbHkgYWxsKSBraW5kcyBvZiBjb25uZWN0aW9uczsgZm9yIGV4YW1wbGUsIGl0IHN1cHBvcnRzCisgICBzdHJlYW1pbmcgKFs2MzRdU2VjdGlvbiA0LjIwKS4KKworICAgRy1LZXJtaXQgaXMgYWxzbyBoYW5keSBmb3IgYm9vdHN0cmFwcGluZy4gSXQgaXMgZWFzaWVyIHRvIGxvYWQgb24gYQorICAgbmV3IGNvbXB1dGVyIHRoYW4gQy1LZXJtaXQgLS0gaXQgZml0cyBvbiBhIGZsb3BweSBkaXNrZXR0ZSB3aXRoIHBsZW50eQorICAgb2Ygcm9vbSB0byBzcGFyZS4gVGh1cyBpZiB5b3UgaGF2ZSAoc2F5KSBhbiBvbGQgUEMgcnVubmluZyAoc2F5KSBTQ08KKyAgIFhlbml4IGFuZCBubyBuZXR3b3JrIGNvbm5lY3Rpb24sIHlvdSBjYW4gZG93bmxvYWQgdGhlIFhlbml4IHZlcnNpb24gb2YKKyAgIEctS2VybWl0IHRvIChzYXkpIGEgRE9TIG9yIFdpbmRvd3MgUEMsIGNvcHkgaXQgdG8gZGlza2V0dGUsIHJlYWQgdGhlCisgICBkaXNrZXR0ZSBvbiBYZW5peCB3aXRoICJkb3NyZWFkIiwgYW5kIHRoZW4gdXNlIEctS2VybWl0IHRvIHJlY2VpdmUKKyAgIEMtS2VybWl0ICh3aGljaCBkb2VzIG5vdCBmaXQgb24gYSBkaXNrZXR0ZSkuIElmIGRpc2tldHRlcyBhcmVuJ3QgYW4KKyAgIG9wdGlvbiwgb3RoZXIgYm9vdHN0cmFwcGluZyBtZXRob2RzIGFyZSBwb3NzaWJsZSB0b28gLS0gc2VlIHRoZQorICAgWzYzNV1HLUtlcm1pdCB3ZWIgcGFnZSBmb3IgZGV0YWlscy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworSUlJLiBBUFBFTkRJQ0VTCisKKyAgSUlJLjEuIENoYXJhY3RlciBTZXQgVGFibGVzCisKKyAgICBJSUkuMS4xLiBUaGUgSGV3bGV0dCBQYWNrYXJkIFJvbWFuOCBDaGFyYWN0ZXIgU2V0CisKK2RlYyBjb2wvcm93IG9jdCBoZXggIGRlc2NyaXB0aW9uCisxNjAgIDEwLzAwICAyNDAgIEEwICAoVW5kZWZpbmVkKQorMTYxICAxMC8wMSAgMjQxICBBMSAgQSBncmF2ZQorMTYyICAxMC8wMiAgMjQyICBBMiAgQSBjaXJjdW1mbGV4CisxNjMgIDEwLzAzICAyNDMgIEEzICBFIGdyYXZlCisxNjQgIDEwLzA0ICAyNDQgIEE0ICBFIGNpcmN1bWZsZXgKKzE2NSAgMTAvMDUgIDI0NSAgQTUgIEUgZGlhZXJlc2lzCisxNjYgIDEwLzA2ICAyNDYgIEE2ICBJIGNpcmN1bWZsZXgKKzE2NyAgMTAvMDcgIDI0NyAgQTcgIEkgZGlhZXJlc2lzCisxNjggIDEwLzA4ICAyNTAgIEE4ICBBY3V0ZSBhY2NlbnQKKzE2OSAgMTAvMDkgIDI1MSAgQTkgIEdyYXZlIGFjY2VudAorMTcwICAxMC8xMCAgMjUyICBBQSAgQ2lyY3VtZmxleCBhY2NlbnQKKzE3MSAgMTAvMTEgIDI1MyAgQUIgIERpYWVyZXNpcworMTcyICAxMC8xMiAgMjU0ICBBQyAgVGlsZGUgYWNjZW50CisxNzMgIDEwLzEzICAyNTUgIEFEICBVIGdyYXZlCisxNzQgIDEwLzE0ICAyNTYgIEFFICBVIGNpcmN1bWZsZXgKKzE3NSAgMTAvMTUgIDI1NyAgQUYgIExpcmEgc3ltYm9sCisxNzYgIDExLzAwICAyNjAgIEIwICBUb3AgYmFyIChtYWNyb24pCisxNzcgIDExLzAxICAyNjEgIEIxICBZIGFjdXRlCisxNzggIDExLzAyICAyNjIgIEIyICB5IGFjdXRlCisxNzkgIDExLzAzICAyNjMgIEIzICBEZWdyZWUgU2lnbgorMTgwICAxMS8wNCAgMjY0ICBCNCAgQyBjZWRpbGxhCisxODEgIDExLzA1ICAyNjUgIEI1ICBjIGNlZGlsbGEKKzE4MiAgMTEvMDYgIDI2NiAgQjYgIE4gdGlsZGUKKzE4MyAgMTEvMDcgIDI2NyAgQjcgIG4gdGlsZGUKKzE4NCAgMTEvMDggIDI3MCAgQjggIEludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmsKKzE4NSAgMTEvMDkgIDI3MSAgQjkgIEludmVydGVkIHF1ZXN0aW9uIG1hcmsKKzE4NiAgMTEvMTAgIDI3MiAgQkEgIEN1cnJlbmN5IHN5bWJvbAorMTg3ICAxMS8xMSAgMjczICBCQiAgUG91bmQgc3Rlcmxpbmcgc3ltYm9sCisxODggIDExLzEyICAyNzQgIEJDICBZZW4gc3ltYm9sCisxODkgIDExLzEzICAyNzUgIEJEICBQYXJhZ3JhcGgKKzE5MCAgMTEvMTQgIDI3NiAgQkUgIEZsb3JpbiAoR3VpbGRlcikgc3ltYm9sCisxOTEgIDExLzE1ICAyNzcgIEJGICBDZW50IHN5bWJvbAorMTkyICAxMi8wMCAgMzAwICBDMCAgYSBjaXJjdW1mbGV4CisxOTMgIDEyLzAxICAzMDEgIEMxICBlIGNpcmN1bWZsZXgKKzE5NCAgMTIvMDIgIDMwMiAgQzIgIG8gY2lyY3VtZmxleAorMTk1ICAxMi8wMyAgMzAzICBDMyAgdSBjaXJjdW1mbGV4CisxOTYgIDEyLzA0ICAzMDQgIEM0ICBhIGFjdXRlCisxOTcgIDEyLzA1ICAzMDUgIEM1ICBlIGFjdXRlCisxOTggIDEyLzA2ICAzMDYgIEM2ICBvIGFjdXRlCisxOTkgIDEyLzA3ICAzMDcgIEM3ICB1IGFjdXRlCisyMDAgIDEyLzA4ICAzMTAgIEM4ICBhIGdyYXZlCisyMDEgIDEyLzA5ICAzMTEgIEM5ICBlIGdyYXZlCisyMDIgIDEyLzEwICAzMTIgIENBICBvIGdyYXZlCisyMDMgIDEyLzExICAzMTMgIENCICB1IGdyYXZlCisyMDQgIDEyLzEyICAzMTQgIENDICBhIGRpYWVyZXNpcworMjA1ICAxMi8xMyAgMzE1ICBDRCAgZSBkaWFlcmVzaXMKKzIwNiAgMTIvMTQgIDMxNiAgQ0UgIG8gZGlhZXJlc2lzCisyMDcgIDEyLzE1ICAzMTcgIENGICB1IGRpYWVyZXNpcworMjA4ICAxMy8wMCAgMzIwICBEMCAgQSByaW5nCisyMDkgIDEzLzAxICAzMjEgIEQxICBpIGNpcmN1bWZsZXgKKzIxMCAgMTMvMDIgIDMyMiAgRDIgIE8gd2l0aCBzdHJva2UKKzIxMSAgMTMvMDMgIDMyMyAgRDMgIEFFIGRpZ3JhcGgKKzIxMiAgMTMvMDQgIDMyNCAgRDQgIGEgcmluZworMjEzICAxMy8wNSAgMzI1ICBENSAgaSBhY3V0ZQorMjE0ICAxMy8wNiAgMzI2ICBENiAgbyB3aXRoIHN0cm9rZQorMjE1ICAxMy8wNyAgMzI3ICBENyAgYWUgZGlncmFwaAorMjE2ICAxMy8wOCAgMzMwICBEOCAgQSBkaWFlcmVzaXMKKzIxNyAgMTMvMDkgIDMzMSAgRDkgIGkgZ3JhdmUKKzIxOCAgMTMvMTAgIDMzMiAgREEgIE8gZGlhZXJlc2lzCisyMTkgIDEzLzExICAzMzMgIERCICBVIGRpYWVyZXNpcworMjIwICAxMy8xMiAgMzM0ICBEQyAgRSBhY3V0ZQorMjIxICAxMy8xMyAgMzM1ICBERCAgaSBkaWFlcmVzaXMKKzIyMiAgMTMvMTQgIDMzNiAgREUgIEdlcm1hbiBzaGFycCBzCisyMjMgIDEzLzE1ICAzMzcgIERGICBPIGNpcmN1bWZsZXgKKzIyNCAgMTQvMDAgIDM0MCAgRTAgIEEgYWN1dGUKKzIyNSAgMTQvMDEgIDM0MSAgRTEgIEEgdGlsZGUKKzIyNiAgMTQvMDIgIDM0MiAgRTIgIGEgdGlsZGUKKzIyNyAgMTQvMDMgIDM0MyAgRTMgIEljZWxhbmRpYyBFdGgKKzIyOCAgMTQvMDQgIDM0NCAgRTQgIEljZWxhbmRpYyBldGgKKzIyOSAgMTQvMDUgIDM0NSAgRTUgIEkgYWN1dGUKKzIzMCAgMTQvMDYgIDM0NiAgRTYgIEkgZ3JhdmUKKzIzMSAgMTQvMDcgIDM0NyAgRTcgIE8gYWN1dGUKKzIzMiAgMTQvMDggIDM1MCAgRTggIE8gZ3JhdmUKKzIzMyAgMTQvMDkgIDM1MSAgRTkgIE8gdGlsZGUKKzIzNCAgMTQvMTAgIDM1MiAgRUEgIG8gdGlsZGUKKzIzNSAgMTQvMTEgIDM1MyAgRUIgIFMgY2Fyb24KKzIzNiAgMTQvMTIgIDM1NCAgRUMgIHMgY2Fyb24KKzIzNyAgMTQvMTMgIDM1NSAgRUQgIFUgYWN1dGUKKzIzOCAgMTQvMTQgIDM1NiAgRUUgIFkgZGlhZXJlc2lzCisyMzkgIDE0LzE1ICAzNTcgIEVGICB5IGRpYWVyZXNpcworMjQwICAxNS8wMCAgMzYwICBGMCAgSWNlbGFuZGljIFRob3JuCisyNDEgIDE1LzAxICAzNjEgIEYxICBJY2VsYW5kaWMgdGhvcm4KKzI0MiAgMTUvMDIgIDM2MiAgRjIgIE1pZGRsZSBkb3QKKzI0MyAgMTUvMDMgIDM2MyAgRjMgIEdyZWVrIG11CisyNDQgIDE1LzA0ICAzNjQgIEY0ICBQaWxjcm93IHNpZ24KKzI0NSAgMTUvMDUgIDM2NSAgRjUgIEZyYWN0aW9uIDMvNAorMjQ2ICAxNS8wNiAgMzY2ICBGNiAgTG9uZyBkYXNoLCBob3Jpem9udGFsIGJhcgorMjQ3ICAxNS8wNyAgMzY3ICBGNyAgRnJhY3Rpb24gMS80CisyNDggIDE1LzA4ICAzNzAgIEY4ICBGcmFjdGlvbiAxLzIKKzI0OSAgMTUvMDkgIDM3MSAgRjkgIEZlbWluaW5lIG9yZGluYWwKKzI1MCAgMTUvMTAgIDM3MiAgRkEgIE1hc2N1bGluZSBvcmRpbmFsCisyNTEgIDE1LzExICAzNzMgIEZCICBMZWZ0IGd1aWxsZW1vdAorMjUyICAxNS8xMiAgMzc0ICBGQyAgU29saWQgYm94CisyNTMgIDE1LzEzICAzNzUgIEZEICBSaWdodCBndWlsbGVtb3QKKzI1NCAgMTUvMTQgIDM3NiAgRkUgIFBsdXMgb3IgbWludXMgc2lnbgorMjU1ICAxNS8xNSAgMzc3ICBGRiAgKFVuZGVmaW5lZCkKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIElJSS4xLjIuIEdyZWVrIENoYXJhY3RlciBTZXRzCisKKyAgICBJSUkuMS4yLjEuIFRoZSBJU08gODg1OS03IExhdGluIC8gR3JlZWsgQWxwaGFiZXQgPSBFTE9UIDkyOAorCitkZWMgY29sL3JvdyBvY3QgaGV4ICBkZXNjcmlwdGlvbgorMTYwICAxMC8wMCAgMjQwICBBMCAgTm8tYnJlYWsgc3BhY2UKKzE2MSAgMTAvMDEgIDI0MSAgQTEgIExlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrCisxNjIgIDEwLzAyICAyNDIgIEEyICByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsKKzE2MyAgMTAvMDMgIDI0MyAgQTMgIFBvdW5kIHNpZ24KKzE2NCAgMTAvMDQgIDI0NCAgQTQgIChVTlVTRUQpCisxNjUgIDEwLzA1ICAyNDUgIEE1ICAoVU5VU0VEKQorMTY2ICAxMC8wNiAgMjQ2ICBBNiAgQnJva2VuIGJhcgorMTY3ICAxMC8wNyAgMjQ3ICBBNyAgUGFyYWdyYXBoIHNpZ24KKzE2OCAgMTAvMDggIDI1MCAgQTggIERpYWVyZXNpcyAoRGlhbHl0aWthKQorMTY5ICAxMC8wOSAgMjUxICBBOSAgQ29weXJpZ2h0IHNpZ24KKzE3MCAgMTAvMTAgIDI1MiAgQUEgIChVTlVTRUQpCisxNzEgIDEwLzExICAyNTMgIEFCICBMZWZ0IGFuZ2xlIHF1b3RhdGlvbgorMTcyICAxMC8xMiAgMjU0ICBBQyAgTm90IHNpZ24KKzE3MyAgMTAvMTMgIDI1NSAgQUQgIFNvZnQgaHlwaGVuCisxNzQgIDEwLzE0ICAyNTYgIEFFICAoVU5VU0VEKQorMTc1ICAxMC8xNSAgMjU3ICBBRiAgSG9yaXpvbnRhbCBiYXIgKFBhcmVudGhldGlraSBwYXZsYSkKKzE3NiAgMTEvMDAgIDI2MCAgQjAgIERlZ3JlZSBzaWduCisxNzcgIDExLzAxICAyNjEgIEIxICBQbHVzLW1pbnVzIHNpZ24KKzE3OCAgMTEvMDIgIDI2MiAgQjIgIFN1cGVyc2NyaXB0IHR3bworMTc5ICAxMS8wMyAgMjYzICBCMyAgU3VwZXJzY3JpcHQgdGhyZWUKKzE4MCAgMTEvMDQgIDI2NCAgQjQgIEFjY2VudCAodG9ub3MpCisxODEgIDExLzA1ICAyNjUgIEI1ICBEaWFlcmVzaXMgYW5kIGFjY2VudCAoRGlhbHl0aWthIGFuZCBUb25vcykKKzE4MiAgMTEvMDYgIDI2NiAgQjYgIEFscGhhIHdpdGggYWNjZW50CisxODMgIDExLzA3ICAyNjcgIEI3ICBNaWRkbGUgZG90IChBbm8gVGVsZWlhKQorMTg0ICAxMS8wOCAgMjcwICBCOCAgRXBzaWxvbiB3aXRoIGFjY2VudAorMTg1ICAxMS8wOSAgMjcxICBCOSAgRXRhIHdpdGggYWNjZW50CisxODYgIDExLzEwICAyNzIgIEJBICBJb3RhIHdpdGggYWNjZW50CisxODcgIDExLzExICAyNzMgIEJCICBSaWdodCBhbmdsZSBxdW90YXRpb24KKzE4OCAgMTEvMTIgIDI3NCAgQkMgIE9taWNyb24gd2l0aCBhY2NlbnQKKzE4OSAgMTEvMTMgIDI3NSAgQkQgIE9uZSBoYWxmCisxOTAgIDExLzE0ICAyNzYgIEJFICBVcHNpbG9uIHdpdGggYWNjZW50CisxOTEgIDExLzE1ICAyNzcgIEJGICBPbWVnYSB3aXRoIGFjY2VudAorMTkyICAxMi8wMCAgMzAwICBDMCAgaW90YSB3aXRoIGRpYWVyZXNpcyBhbmQgYWNjZW50CisxOTMgIDEyLzAxICAzMDEgIEMxICBBbHBoYQorMTk0ICAxMi8wMiAgMzAyICBDMiAgQmV0YQorMTk1ICAxMi8wMyAgMzAzICBDMyAgR2FtbWEKKzE5NiAgMTIvMDQgIDMwNCAgQzQgIERlbHRhCisxOTcgIDEyLzA1ICAzMDUgIEM1ICBFcHNpbG9uCisxOTggIDEyLzA2ICAzMDYgIEM2ICBaZXRhCisxOTkgIDEyLzA3ICAzMDcgIEM3ICBFdGEKKzIwMCAgMTIvMDggIDMxMCAgQzggIFRoZXRhCisyMDEgIDEyLzA5ICAzMTEgIEM5ICBJb3RhCisyMDIgIDEyLzEwICAzMTIgIENBICBLYXBwYQorMjAzICAxMi8xMSAgMzEzICBDQiAgTGFtZGEKKzIwNCAgMTIvMTIgIDMxNCAgQ0MgIE11CisyMDUgIDEyLzEzICAzMTUgIENEICBOdQorMjA2ICAxMi8xNCAgMzE2ICBDRSAgS3NpCisyMDcgIDEyLzE1ICAzMTcgIENGICBPbWljcm9uCisyMDggIDEzLzAwICAzMjAgIEQwICBQaQorMjA5ICAxMy8wMSAgMzIxICBEMSAgUmhvCisyMTAgIDEzLzAyICAzMjIgIEQyICAoVU5VU0VEKQorMjExICAxMy8wMyAgMzIzICBEMyAgU2lnbWEKKzIxMiAgMTMvMDQgIDMyNCAgRDQgIFRhdQorMjEzICAxMy8wNSAgMzI1ICBENSAgVXBzaWxvbgorMjE0ICAxMy8wNiAgMzI2ICBENiAgUGhpCisyMTUgIDEzLzA3ICAzMjcgIEQ3ICBLaGkKKzIxNiAgMTMvMDggIDMzMCAgRDggIFBzaQorMjE3ICAxMy8wOSAgMzMxICBEOSAgT21lZ2EKKzIxOCAgMTMvMTAgIDMzMiAgREEgIElvdGEgd2l0aCBkaWFlcmVzaXMKKzIxOSAgMTMvMTEgIDMzMyAgREIgIFVwc2lsb24gd2l0aCBkaWFlcmVzaXMKKzIyMCAgMTMvMTIgIDMzNCAgREMgIGFscGhhIHdpdGggYWNjZW50CisyMjEgIDEzLzEzICAzMzUgIEREICBlcHNpbG9uIHdpdGggYWNjZW50CisyMjIgIDEzLzE0ICAzMzYgIERFICBldGEgd2l0aCBhY2NlbnQKKzIyMyAgMTMvMTUgIDMzNyAgREYgIGlvdGEgd2l0aCBhY2NlbnQKKzIyNCAgMTQvMDAgIDM0MCAgRTAgIHVwc2lsb24gd2l0aCBkaWFlcmVzaXMgYW5kIGFjY2VudAorMjI1ICAxNC8wMSAgMzQxICBFMSAgYWxwaGEKKzIyNiAgMTQvMDIgIDM0MiAgRTIgIGJldGEKKzIyNyAgMTQvMDMgIDM0MyAgRTMgIGdhbW1hCisyMjggIDE0LzA0ICAzNDQgIEU0ICBkZWx0YQorMjI5ICAxNC8wNSAgMzQ1ICBFNSAgZXBzaWxvbgorMjMwICAxNC8wNiAgMzQ2ICBFNiAgemV0YQorMjMxICAxNC8wNyAgMzQ3ICBFNyAgZXRhCisyMzIgIDE0LzA4ICAzNTAgIEU4ICB0aGV0YQorMjMzICAxNC8wOSAgMzUxICBFOSAgaW90YQorMjM0ICAxNC8xMCAgMzUyICBFQSAga2FwcGEKKzIzNSAgMTQvMTEgIDM1MyAgRUIgIGxhbWRhCisyMzYgIDE0LzEyICAzNTQgIEVDICBtdQorMjM3ICAxNC8xMyAgMzU1ICBFRCAgbnUKKzIzOCAgMTQvMTQgIDM1NiAgRUUgIGtzaQorMjM5ICAxNC8xNSAgMzU3ICBFRiAgb21pY3JvbgorMjQwICAxNS8wMCAgMzYwICBGMCAgcGkKKzI0MSAgMTUvMDEgIDM2MSAgRjEgIHJobworMjQyICAxNS8wMiAgMzYyICBGMiAgdGVybWluYWwgc2lnbWEKKzI0MyAgMTUvMDMgIDM2MyAgRjMgIHNpZ21hCisyNDQgIDE1LzA0ICAzNjQgIEY0ICB0YXUKKzI0NSAgMTUvMDUgIDM2NSAgRjUgIHVwc2lsb24KKzI0NiAgMTUvMDYgIDM2NiAgRjYgIHBoaQorMjQ3ICAxNS8wNyAgMzY3ICBGNyAga2hpCisyNDggIDE1LzA4ICAzNzAgIEY4ICBwc2kKKzI0OSAgMTUvMDkgIDM3MSAgRjkgIG9tZWdhCisyNTAgIDE1LzEwICAzNzIgIEZBICBpb3RhIHdpdGggZGlhZXJlc2lzCisyNTEgIDE1LzExICAzNzMgIEZCICB1cHNpbG9uIHdpdGggZGlhZXJlc2lzCisyNTIgIDE1LzEyICAzNzQgIEZDICBvbWljcm9uIHdpdGggZGlhZXJlc2lzCisyNTMgIDE1LzEzICAzNzUgIEZEICB1cHNpbG9uIHdpdGggYWNjZW50CisyNTQgIDE1LzE0ICAzNzYgIEZFICBvbWVnYSB3aXRoIGFjY2VudAorMjU1ICAxNS8xNSAgMzc3ICBGRiAgKFVOVVNFRCkKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIElJSS4xLjIuMi4gVGhlIEVMT1QgOTI3IENoYXJhY3RlciBTZXQKKworZGVjIGNvbC9yb3cgb2N0IGhleCAgZGVzY3JpcHRpb24KKyAzMiAgMDIvMDAgICA0MCAgMjAgIFNQQUNFCisgMzMgIDAyLzAxICAgNDEgIDIxICBFWENMQU1BVElPTiBNQVJLCisgMzQgIDAyLzAyICAgNDIgIDIyICBRVU9UQVRJT04gTUFSSworIDM1ICAwMi8wMyAgIDQzICAyMyAgTlVNQkVSIFNJR04KKyAzNiAgMDIvMDQgICA0NCAgMjQgIERPTExBUiBTSUdOCisgMzcgIDAyLzA1ICAgNDUgIDI1ICBQRVJDRU5UIFNJR04KKyAzOCAgMDIvMDYgICA0NiAgMjYgIEFNUEVSU0FORAorIDM5ICAwMi8wNyAgIDQ3ICAyNyAgQVBPU1RST1BIRQorIDQwICAwMi8wOCAgIDUwICAyOCAgTEVGVCBQQVJFTlRIRVNJUworIDQxICAwMi8wOSAgIDUxICAyOSAgUklHSFQgUEFSRU5USEVTSVMKKyA0MiAgMDIvMTAgICA1MiAgMkEgIEFTVEVSSVNLCisgNDMgIDAyLzExICAgNTMgIDJCICBQTFVTIFNJR04KKyA0NCAgMDIvMTIgICA1NCAgMkMgIENPTU1BCisgNDUgIDAyLzEzICAgNTUgIDJEICBIWVBIRU4sIE1JTlVTIFNJR04KKyA0NiAgMDIvMTQgICA1NiAgMkUgIFBFUklPRCwgRlVMTCBTVE9QCisgNDcgIDAyLzE1ICAgNTcgIDJGICBTT0xJRFVTLCBTTEFTSAorIDQ4ICAwMy8wMCAgIDYwICAzMCAgRElHSVQgWkVSTworIDQ5ICAwMy8wMSAgIDYxICAzMSAgRElHSVQgT05FCisgNTAgIDAzLzAyICAgNjIgIDMyICBESUdJVCBUV08KKyA1MSAgMDMvMDMgICA2MyAgMzMgIERJR0lUIFRIUkVFCisgNTIgIDAzLzA0ICAgNjQgIDM0ICBESUdJVCBGT1VSCisgNTMgIDAzLzA1ICAgNjUgIDM1ICBESUdJVCBGSVZFCisgNTQgIDAzLzA2ICAgNjYgIDM2ICBESUdJVCBTSVgKKyA1NSAgMDMvMDcgICA2NyAgMzcgIERJR0lUIFNFVkVOCisgNTYgIDAzLzA4ICAgNzAgIDM4ICBESUdJVCBFSUdIVAorIDU3ICAwMy8wOSAgIDcxICAzOSAgRElHSVQgTklORQorIDU4ICAwMy8xMCAgIDcyICAzQSAgQ09MT04KKyA1OSAgMDMvMTEgICA3MyAgM0IgIFNFTUlDT0xPTgorIDYwICAwMy8xMiAgIDc0ICAzQyAgTEVTUy1USEFOIFNJR04sIExFRlQgQU5HTEUgQlJBQ0tFVAorIDYxICAwMy8xMyAgIDc1ICAzRCAgRVFVQUxTIFNJR04KKyA2MiAgMDMvMTQgICA3NiAgM0UgIEdSRUFURVItVEhBTiBTSUdOLCBSSUdIVCBBTkdMRSBCUkFDS0VUCisgNjMgIDAzLzE1ICAgNzcgIDNGICBRVUVTVElPTiBNQVJLCisgNjQgIDA0LzAwICAxMDAgIDQwICBDT01NRVJDSUFMIEFUIFNJR04KKyA2NSAgMDQvMDEgIDEwMSAgNDEgIENBUElUQUwgTEVUVEVSIEEKKyA2NiAgMDQvMDIgIDEwMiAgNDIgIENBUElUQUwgTEVUVEVSIEIKKyA2NyAgMDQvMDMgIDEwMyAgNDMgIENBUElUQUwgTEVUVEVSIEMKKyA2OCAgMDQvMDQgIDEwNCAgNDQgIENBUElUQUwgTEVUVEVSIEQKKyA2OSAgMDQvMDUgIDEwNSAgNDUgIENBUElUQUwgTEVUVEVSIEUKKyA3MCAgMDQvMDYgIDEwNiAgNDYgIENBUElUQUwgTEVUVEVSIEYKKyA3MSAgMDQvMDcgIDEwNyAgNDcgIENBUElUQUwgTEVUVEVSIEcKKyA3MiAgMDQvMDggIDExMCAgNDggIENBUElUQUwgTEVUVEVSIEgKKyA3MyAgMDQvMDkgIDExMSAgNDkgIENBUElUQUwgTEVUVEVSIEkKKyA3NCAgMDQvMTAgIDExMiAgNEEgIENBUElUQUwgTEVUVEVSIEoKKyA3NSAgMDQvMTEgIDExMyAgNEIgIENBUElUQUwgTEVUVEVSIEsKKyA3NiAgMDQvMTIgIDExNCAgNEMgIENBUElUQUwgTEVUVEVSIEwKKyA3NyAgMDQvMTMgIDExNSAgNEQgIENBUElUQUwgTEVUVEVSIE0KKyA3OCAgMDQvMTQgIDExNiAgNEUgIENBUElUQUwgTEVUVEVSIE4KKyA3OSAgMDQvMTUgIDExNyAgNEYgIENBUElUQUwgTEVUVEVSIE8KKyA4MCAgMDUvMDAgIDEyMCAgNTAgIENBUElUQUwgTEVUVEVSIFAKKyA4MSAgMDUvMDEgIDEyMSAgNTEgIENBUElUQUwgTEVUVEVSIFEKKyA4MiAgMDUvMDIgIDEyMiAgNTIgIENBUElUQUwgTEVUVEVSIFIKKyA4MyAgMDUvMDMgIDEyMyAgNTMgIENBUElUQUwgTEVUVEVSIFMKKyA4NCAgMDUvMDQgIDEyNCAgNTQgIENBUElUQUwgTEVUVEVSIFQKKyA4NSAgMDUvMDUgIDEyNSAgNTUgIENBUElUQUwgTEVUVEVSIFUKKyA4NiAgMDUvMDYgIDEyNiAgNTYgIENBUElUQUwgTEVUVEVSIFYKKyA4NyAgMDUvMDcgIDEyNyAgNTcgIENBUElUQUwgTEVUVEVSIFcKKyA4OCAgMDUvMDggIDEzMCAgNTggIENBUElUQUwgTEVUVEVSIFgKKyA4OSAgMDUvMDkgIDEzMSAgNTkgIENBUElUQUwgTEVUVEVSIFkKKyA5MCAgMDUvMTAgIDEzMiAgNUEgIENBUElUQUwgTEVUVEVSIFoKKyA5MSAgMDUvMTEgIDEzMyAgNUIgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyA5MiAgMDUvMTIgIDEzNCAgNUMgIFJFVkVSU0UgU09MSURVUywgQkFDS1NMQVNICisgOTMgIDA1LzEzICAxMzUgIDVEICBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorIDk0ICAwNS8xNCAgMTM2ICA1RSAgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyA5NSAgMDUvMTUgIDEzNyAgNUYgIFVOREVSU0NPUkUKKyA5NiAgMDYvMDAgIDE0MCAgNjAgIEFDQ0VOVCBHUkFWRQorIDk3ICAwNi8wMSAgMTQxICA2MSAgR1JFRUsgTEVUVEVSIEFMUEhBCisgOTggIDA2LzAyICAxNDIgIDYyICBHUkVFSyBMRVRURVIgQkVUQQorIDk5ICAwNi8wMyAgMTQzICA2MyAgR1JFRUsgTEVUVEVSIEdBTU1BCisxMDAgIDA2LzA0ICAxNDQgIDY0ICBHUkVFSyBMRVRURVIgREVMVEEKKzEwMSAgMDYvMDUgIDE0NSAgNjUgIEdSRUVLIExFVFRFUiBFUFNJTE9OCisxMDIgIDA2LzA2ICAxNDYgIDY2ICBHUkVFSyBMRVRURVIgWkVUQQorMTAzICAwNi8wNyAgMTQ3ICA2NyAgR1JFRUsgTEVUVEVSIEVUQQorMTA0ICAwNi8wOCAgMTUwICA2OCAgR1JFRUsgTEVUVEVSIFRIRVRBCisxMDUgIDA2LzA5ICAxNTEgIDY5ICBHUkVFSyBMRVRURVIgSU9UQQorMTA2ICAwNi8xMCAgMTUyICA2QSAgR1JFRUsgTEVUVEVSIEtBUFBBCisxMDcgIDA2LzExICAxNTMgIDZCICBHUkVFSyBMRVRURVIgTEFNREEKKzEwOCAgMDYvMTIgIDE1NCAgNkMgIEdSRUVLIExFVFRFUiBNVQorMTA5ICAwNi8xMyAgMTU1ICA2RCAgR1JFRUsgTEVUVEVSIE5VCisxMTAgIDA2LzE0ICAxNTYgIDZFICBHUkVFSyBMRVRURVIgS1NJCisxMTEgIDA2LzE1ICAxNTcgIDZGICBHUkVFSyBMRVRURVIgT01JQ1JPTgorMTEyICAwNy8wMCAgMTYwICA3MCAgR1JFRUsgTEVUVEVSIFBJCisxMTMgIDA3LzAxICAxNjEgIDcxICBHUkVFSyBMRVRURVIgUkhPCisxMTQgIDA3LzAyICAxNjIgIDcyICBHUkVFSyBMRVRURVIgU0lHTUEKKzExNSAgMDcvMDMgIDE2MyAgNzMgIEdSRUVLIExFVFRFUiBUQVUKKzExNiAgMDcvMDQgIDE2NCAgNzQgIEdSRUVLIExFVFRFUiBVUFNJTE9OCisxMTcgIDA3LzA1ICAxNjUgIDc1ICBHUkVFSyBMRVRURVIgRkkKKzExOCAgMDcvMDYgIDE2NiAgNzYgIEdSRUVLIExFVFRFUiBYSQorMTE5ICAwNy8wNyAgMTY3ICA3NyAgR1JFRUsgTEVUVEVSIFBTSQorMTIwICAwNy8wOCAgMTcwICA3OCAgR1JFRUsgTEVUVEVSIE9NRUdBCisxMjEgIDA3LzA5ICAxNzEgIDc5ICBTUEFDRQorMTIyICAwNy8xMCAgMTcyICA3QSAgU1BBQ0UKKzEyMyAgMDcvMTEgIDE3MyAgN0IgIExFRlQgQ1VSTFkgQlJBQ0tFVCwgTEVGVCBCUkFDRQorMTI0ICAwNy8xMiAgMTc0ICA3QyAgVkVSVElDQUwgTElORSwgVkVSVElDQUwgQkFSCisxMjUgIDA3LzEzICAxNzUgIDdEICBSSUdIVCBDVVJMWSBCUkFDS0VULCBSSUdIVCBCUkFDRQorMTI2ICAwNy8xNCAgMTc2ICA3RSAgVElMREUKKzEyNyAgMDcvMTUgIDE3NyAgN0YgIFJVQk9VVCwgREVMRVRFCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICBJSUkuMS4yLjMuIFBDIENvZGUgUGFnZSA4NjkKKworICAgKHRvIGJlIGZpbGxlZCBpbi4uLikKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIElJSS4yLiBVcGRhdGVkIENvdW50cnkgQ29kZXMKKworICAgRGF0ZTogTW9uLCA3IEFwciAxOTk3IDIzOjIzOjQ5IEVEVAorICAgRnJvbTogRGF2ZSBMZWlib2xkIDxkbGVpYm9sZEBlbHNlLm5ldD4KKyAgIE5ld3Nncm91cHM6IGNvbXAuZGNvbS50ZWxlY29tCisgICBTdWJqZWN0OiBFeC1VU1NSIENvdW50cnkgQ29kZXMgUHJvZmlsZQorICAgT3JnYW5pemF0aW9uOiBURUxFQ09NIERpZ2VzdAorCisgICBFeC1VU1NSIENvdW50cnkgQ29kZXMgUHJvZmlsZQorICAgNCBBcHJpbCAxOTk3CisKKyAgIEJlbG93IGlzIGEgc3VtbWFyeSBvZiB0aGUgY291bnRyeSBjb2RlcyB0aGF0IGhhdmUgZm9ybWVkIGluIHRoZSB3YWtlCisgICBvZiB0aGUgVVNTUiBkaXNzb2x1dGlvbiwgYWxvbmcgd2l0aCBzb21lIHVwZGF0ZWQgZmluZGluZ3MgYW5kIHJlcG9ydHMuCisgICBBZGRpdGlvbmFsIG9yIGNvcnJlY3RlZCBpbmZvcm1hdGlvbiBvbiBhbnkgb2YgdGhlc2UgbmF0aW9ucyB3b3VsZCBiZQorICAgd2VsY29tZSAoYy9vIGRsZWlib2xkQGVsc2UubmV0KS4KKyAgICAgKiBLeXJneXogUmVwdWJsaWMgY291bnRyeSBjb2RlIDk5NiB3aWxsIHRha2UgZWZmZWN0LCBhdCBsZWFzdCBpbgorICAgICAgIENhbmFkYSwgZWZmZWN0aXZlIDEgTWF5IDE5OTcsIGFjY29yZGluZyB0byBDUlRDIFRlbGVjb20gT3JkZXIKKyAgICAgICA5Ny00NjQsIGJhc2VkIG9uIFN0ZW50b3IgVGFyaWZmIE5vdGljZSA0MzMuIFRoZXJlIGlzIG5vIGluZGljYXRpb24KKyAgICAgICB3aGV0aGVyIHRoZXJlIHdpbGwgYmUgYSBwZXJtaXNzaXZlIGRpYWxpbmcgcGVyaW9kIGludm9sdmVkIG9yIGZvcgorICAgICAgIGhvdyBsb25nIHN1Y2ggYSBwZXJtaXNzaXZlIG9wZXJhdGlvbiB3b3VsZCByZW1haW4uCisgICAgICogQ291bnRyeSBjb2RlIDk5MiB3YXMgcmVwb3J0ZWQgYXMgYSByZWNlbnQgYXNzaWdubWVudCBmb3IKKyAgICAgICBUYWppa2lzdGFuLCB3aGljaCB3aWxsIGJlIG1vdmluZyBmcm9tIGNvdW50cnkgY29kZSA3IGF0IHNvbWUKKyAgICAgICB1bmtub3duIHRpbWUuCisgICAgICogVXpiZWtpc3RhbiBoYXMgaXRzIG93biBjb3VudHJ5IGNvZGUgYXNzaWdubWVudCwgYnV0IEkgaGF2ZSBubworICAgICAgIGluZm9ybWF0aW9uIGlmIHRoaXMgaXMgaW4gc2VydmljZSB5ZXQgb3Igd2hhdCBpbXBsZW1lbnRhdGlvbiBkYXRlcworICAgICAgIGhhdmUgYmVlbiBzZXQuCisgICAgICogS2F6YWtzdGFuIGRvZXMgbm90IGhhdmUgYSBrbm93biBzZXBhcmF0ZSBjb3VudHJ5IGNvZGUgYXNzaWdubWVudAorICAgICAgIGF0IHByZXNlbnQuIEl0IHJlbWFpbnMgaW4gY291bnRyeSBjb2RlIDcgZm9yIHRoZSB0aW1lIGJlaW5nLgorICAgICAqIFJ1c3NpYSBzZWVtcyBkZXN0aW5lZCB0byBrZWVwIGNvdW50cnkgY29kZSA3LgorICAgICAqIFJlY2VudCBuZXdzIHJlcG9ydHMgc3BlYWsgb2Ygc29tZSBhZ3JlZW1lbnRzIGZvcm1pbmcgYmV0d2VlbgorICAgICAgIFJ1c3NpYSBhbmQgQmVsYXJ1cy4gV2hpbGUgdGhlcmUgaXMgbm8gb3V0cmlnaHQgcmV1bmlmaWNhdGlvbiB5ZXQsCisgICAgICAgdGhlcmUgaXMgZXhwZWN0ZWQgdG8gYmUgbXVjaCBjbG9zZXIgdGllcyBiZXR3ZWVuIHRoZSB0d28gbmF0aW9ucy4KKyAgICAgICBXaGV0aGVyIHRoaXMgd2lsbCBsZWFkIHRvIGEgcmV1bmlmaWNhdGlvbiBvZiB0ZWxlcGhvbmUgY29kZXMKKyAgICAgICByZW1haW5zIHRvIGJlIHNlZW4uCisKKyAgIEluIHRoZSB0YWJsZSwgIkVmZmVjdGl2ZSIgbWVhbnMgdGhlIGRhdGUgYXQgd2hpY2ggdGhlIGNvdW50cnkgY29kZQorICAgYmVnYW4gc2VydmljZSAod2hpY2ggY291bGQgdmFyeSBhY2NvcmRpbmcgdG8gdGhlIG5hdGlvbikuICJNYW5kYXRvcnkiCisgICBtZWFucyB0aGUgZGF0ZSBhdCB3aGljaCB0aGUgY291bnRyeSBjb2RlIDcgaXMgaW52YWxpZCBmb3IgY2FsbHMgdG8KKyAgIHRoYXQgbmF0aW9uLiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgcXVlc3Rpb24gbWFya3Mgc2luY2UgZXhhY3QgZGF0ZXMKKyAgIGhhdmUgbm90IGJlZW4gY29sbGVjdGVkIGluIGFsbCBjYXNlcy4KKworQ0MgIE5hdGlvbiAgICAgICAgICAgIEVmZmVjdGl2ZSAgICAgTWFuZGF0b3J5ICAgIE5vdGVzCisKKzM3MCBMaXRodWFuaWEgICAgICAgICAxOTkzPyAgICAgICAgID8/PyAgICAgICAgICBBbm5vdW5jZWQgSmFuIDE5OTMKKzM3MSBMYXR2aWEgICAgICAgICAgICAxOTkzPyAgICAgICAgID8/PworMzcyIEVzdG9uaWEgICAgICAgICAgIDEgRmViIDE5OTM/ICAgTWFyY2ggMTk5Mz8KKzM3MyBNb2xkb3ZhICAgICAgICAgICAxOTkzPyAgICAgICAgID8/PyAgICAgICAgICBBbm5vdW5jZWQgSmFuIDE5OTMKKzM3NCBBcm1lbmlhICAgICAgICAgICAxIE1heSAxOTk1ICAgIDEgSnVseSAxOTk1ICBBbm5vdW5jZWQgSmFuIDE5OTUgKElUVSkKKzM3NSBCZWxhcnVzICAgICAgICAgICAxNiBBcHIgMTk5NSAgIDE5OTc/CiszODAgVWtyYWluZSAgICAgICAgICAgMTYgQXByIDE5OTUgICBPY3QgMTk5NT8KKzcgICBLYXpha3N0YW4gICAgICAgICAobm8ga25vd24gY2hhbmdlcykKKzcgICBSdXNzaWEgICAgICAgICAgICAocHJlc3VtYWJseSBub3QgY2hhbmdpbmcpCis5OTIgVGFqaWtpc3RhbiAgICAgICAgPz8/ICAgICAgICAgICA/Pz8gICAgICAgICAgQW5ub3VuY2VkIDE5OTYtNz8KKzk5MyBUdXJrbWVuaXN0YW4gICAgICAzIEphbiAxOTk3ICAgIDMgQXByIDE5OTcgICBDYW5hZGEgYXMgb2YgMjkgTm92IDE5OTYKKzk5NCBBemVyYmFpamFuICAgICAgICBTZXB0IDE5OTQ/ICAgID8/PyAgICAgICAgICBBbm5vdW5jZWQgMTk5MgorOTk1IEdlb3JnaWEgICAgICAgICAgIDE5OTQ/ICAgICAgICAgPz8/ICAgICAgICAgIHJlZjogVGVsZWNvbSBEaWdlc3QgT2N0IDE5OTQKKzk5NiBLeXJneXogUmVwdWJsaWMgICAxIE1heSAxOTk3ICAgID8/PyAgICAgICAgICByZWY6IFN0ZW50b3IgQ2FuYWRhL0NSVEMKKzk5OCBVemJla2lzdGFuICAgICAgICA/Pz8gICAgICAgICAgID8/PyAgICAgICAgICBBbm5vdW5jZWQgMTk5Nj8gKElUVSkKKworICAgRGV0YWlscyBjb3VydGVzeSBUb2J5IE5peG9uLCBJVFUsIFN0ZW50b3IgKENhbmFkYSksIENSVEMgKENhbmFkYSksCisgICBURUxFQ09NIERpZ2VzdCAoaW5jbHVkaW5nIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmb3IgdGhlIGNvdW50cnkgY29kZQorICAgbGlzdGluZ3MpLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCitJVi4gRVJSQVRBICYgQ09SUklHRU5EQQorCisgICBUaGUgZm9sbG93aW5nIGVycm9ycyBpbiBbNjM2XVVzaW5nIEMtS2VybWl0LCBTZWNvbmQgRWRpdGlvbiwgZmlyc3QKKyAgIHByaW50aW5nLCBoYXZlIGJlZW4gbm90ZWQuCisKKyAgIEZpcnN0LCBzb21lIG1pc3NpbmcgYWNrbm93bGVkZ2VtZW50cyBmb3IgQy1LZXJtaXQgNi4wOiBKRSBKb25lcyBvZgorICAgTWljcm93YXJlIGZvciBoZWxwIHdpdGggT1MtOSwgTmlnZWwgUm9sZXMgZm9yIGhpcyBoZWxwIHdpdGggUGxhbiA5LAorICAgTHVjYXMgSGFydCBmb3IgaGVscCB3aXRoIFZNUyBhbmQgRGlnaXRhbCBVTklYLCBJZ29yIEtvdmFsZW5rbyBmb3IgaGlzCisgICBoZWxwIHdpdGggUU5YLiBBbmQgbGF0ZXIsIHRvIFN1c2FuIEtsZWlubWFubiBmb3IgaGVyIGhlbHAgd2l0aCBEZWJpYW4KKyAgIExpbnV4IHBhY2thZ2luZzsgUGF0cmljayBWb2xrZXJkaW5nIGZvciBoaXMgaGVscCB3aXRoIFNsYWNrd2FyZSBMaW51eAorICAgcGFja2FnaW5nOyBKaW0gS25vYmxlIGZvciBoaXMgaGVscCB3aXRoIFJlZCBIYXQgTGludXggcGFja2FnaW5nOyBhbmQKKyAgIHRvIGRvemVucyBvZiBvdGhlcnMgZm9yIHNlbmRpbmcgaW5kaXZpZHVhbCBDLUtlcm1pdCBiaW5hcmllcyBmb3IKKyAgIHZhcmllZCBhbmQgZGl2ZXJzZSBwbGF0Zm9ybXMuCisKKyAgIFRoYW5rcyB0byBKYW1lcyBTcGF0aCBmb3IgYm90aCBiaW5hcmllcyBhbmQgcmVwb3J0aW5nIG1hbnkgb2YgdGhlCisgICB0eXBvcyBub3RlZCBiZWxvdy4gQWxzbyB0byBEYXQgVGh1YyBOZ3V5ZW4gZm9yIHNwb3R0aW5nIHNldmVyYWwgdHlwb3MuCisKK1BBR0UgICAgUkVNQVJLUworQ09WRVIgICAiQ09TIiBpcyBhIG1pc3ByaW50LiAgVGhlcmUgaXMgbm8gQ09TLiAgUHJldGVuZCBpdCBzYXlzICJTQ08iIG9yICJWT1MiLgorICAgICAgICAoVGhpcyBpcyBmaXhlZCBpbiB0aGUgc2Vjb25kIHByaW50aW5nLikKKyB4eGkgICAgU2Vjb25kIGxpbmU6IEZyZWQgU21pdGgncyBhZmZpbGlhdGlvbiBzaG91bGQgYmUgQ29tcHV0cml0aW9uLgorIDgzICAgICBDaGFuZ2UgImNvbW1hbmRzIG90aGVyIiB0byAiY29tbWFuZHMgYXMgb3RoZXIiICgxc3QgcGFyYWdyYXBoKQorIDg3ICAgICBDaGFuZ2UgIlRoZSB0aGUiIHRvICJUaGUiICgybmQgcGFyYWdyYXBoKQorIDkyICAgICAic2V0IG1vZGVtLXR5cGUgdXNlci1kZWZpbmVkIHN1cHJhIiBzaG91bGQgYmUgInNldCBtb2RlbSB0eXBlIC4uLiIKKyA5NSAgICAgQ2hhbmdlICJWSSIgdG8gInZpIiAoMXN0IHBhcmFncmFwaCkKKyA5NiAgICAgQ2hhbmdlICJpdCBpdCIgdG8gIml0IGlzIiAoMXN0IHBhcmFncmFwaCkKKyA5NyAgICAgQ2hhbmdlICJhZHZhbnRhZ2UgYSBsaXRlcmFsIiB0byAiYWR2YW50YWdlIG9mIGEgbGl0ZXJhbCIgKDJuZAorICAgICAgICBwYXJhZ3JhcGgpCisxMDIgICAgIFRoZSBjYWxsLXdhaXRpbmcgZXhhbXBsZSB3b3VsZCBiZSBiZXR0ZXIgYXMgU0VUIERJQUwgUFJFRklYICo3MFcKKyAgICAgICAgKHJhdGhlciB0aGFuICIqNzAsIikgYmVjYXVzZSB0aGUgZm9ybWVyIHdpbGwgbm90IGNhdXNlIGFuIGluY29ycmVjdAorICAgICAgICBjYWxsIHRvIGJlIHBsYWNlZCB3aXRoIHB1bHNlIGRpYWxpbmcuCisxMjMgICAgIFRoaXJkIHBhcmFncmFwaCBmcm9tIGJvdHRvbTogIi4ub3RoZXJ3aXNlIGlmIGEgeW91ciBsb2NhbCB1c2VybmFtZS4uIgorICAgICAgICBzaG91bGQgYmUgIi4ub3RoZXJ3aXNlIHlvdXIgbG9jYWwgdXNlcm5hbWUuLiIuCisxNjAgICAgIERlbGV0ZSB0aGUgIml0IiBiZXR3ZWVuICJhbmQiIGFuZCAidG8iICgybmQgcGFyYWdyYXBoKQorMTg1ICAgICBJbiAiV2hlbiBUUkFOU0ZFUiBESVNQTEFZIGlzIE9GRiwgQy1LZXJtaXQgc2tpcHMgdGhlIGRpc3BsYXkuLi4iLAorICAgICAgICAiT0ZGIiBzaG91bGQgYmUgIk5PTkUiLgorMTg3ICAgICBUaGUgbGFzdCBwYXJhZ3JhcGggc2F5cyB0aGUgIkEgY29tbWFuZCIgaXMgaWdub3JlZCwgc2hvdWxkIGJlICJTIi4KKzE5NCAgICAgQ2hhbmdlICJpdCBrbm93biIgdG8gIml0IGlzIGtub3duIiAoNHRoIHBhcmFncmFwaCkuCisyMzUgICAgIEluIEMtS2VybWl0IDcuMCwgdGhlIHN5bnRheCBvZiB0aGUgR0VUIGNvbW1hbmQgY2hhbmdlZC4gIE1HRVQgbm93CisgICAgICAgIG11c3QgYmUgdXNlZCB0byBnZXQgYSBsaXN0IG9mIGZpbGVzIGFuZCB0aGVyZSBpcyBubyBtb3JlIG11bHRpbGluZQorICAgICAgICBHRVQgY29tbWFuZC4KKzI2OCAgICAgTGFzdCBwYXJhZ3JhcGg6ICJlZmZlY3QiIHNob3VsZCBiZSAiYWZmZWN0Ii4KKzI3NSAgICAgSW4gdGhlIFNFVCBQUk9UT0NPTCBLRVJNSVQgZGVzY3JpcHRpb24sIHRoZSBmb2xsb3dpbmcgc2VudGVuY2UgaXMKKyAgICAgICAgaW5jb3JyZWN0IGFuZCBzaG91bGQgYmUgcmVtb3ZlZDogJ0lmIHlvdSBvbWl0IHRoZSBjb21tYW5kcywgdGhlCisgICAgICAgIGRlZmF1bHQgb25lcyBhcmUgcmVzdG9yZWQ6ICJrZXJtaXQgLWlyIiBhbmQgImtlcm1pdCAtciIgcmVzcGVjdGl2ZWx5Ii4KKyAgICAgICAgVGhlIGNvcnJlY3QgaW5mb3JtYXRpb24gaXMgZ2l2ZW4gYXQgdGhlIGJvdHRvbSBvZiBwYWdlIDI4MS4KKzI3OSAgICAgOXRoIGxpbmUuICBUaGUgZGVjaW1hbCB2YWx1ZSBvZiBTVCBpcyAxNTYsIG5vdCAxNTUuCisyOTUgICAgIEluIHRoZSBzdGVwcGluZyBzdG9uZXMsIHNraXAgYWhlYWQgdG8gQ2hhcHRlciAxNyBvbiBwLiAzMjcuCisyOTggICAgIFRhYmxlIDE2LTIsIFBvcnR1Z3Vlc2UgZW50cnkuICBDb2x1bW4gNC8wMCBzaG91bGQgc2hvdyBzZWN0aW9uIHNpZ24sCisgICAgICAgIG5vdCBhY3V0ZSBhY2NlbnQuCiszMTYgICAgIE90aGVyIGxhbmd1YWdlcyB3cml0dGVuIGluIHRoZSBIZWJyZXcgYWxwaGFiZXQgaW5jbHVkZSBLYXJhaW0gKGEgVHVya2ljCisgICAgICAgIGxhbmd1YWdlIHNwb2tlbiBpbiBMaXRodWFuaWEgYW5kIFBvbGFuZCksIEp1ZGVvLUt1cmRpc2gsIGFuZCBKdWRlby0KKyAgICAgICAgR2VvcmdpYW4uCiszMzIgICAgIFVOREVGSU5FIGRlZmluaXRpb24sIGNoYW5nZSAiVGhpcyBqdXN0IiB0byAiVGhpcyBpcyBqdXN0Ii4KKzM0NCAgICAgSXQgbWlnaHQgYmUgbmVjZXNzYXJ5IHRvIHNldCB0aGUgbW9kZW0ncyBwdWxzZSBnZW5lcmF0aW9uIHJhdGUgd2hlbgorICAgICAgICBzZW5kaW5nIG51bWVyaWMgcGFnZXM7IG1vc3QgSGF5ZXMgY29tcGF0aWJsZSBtb2RlbXMgdXNlIHRoZSBTMTEKKyAgICAgICAgcmVnaXN0ZXIgZm9yIHRoaXMuCiszNTAgICAgIERlbGV0ZSAiaXMiIGZyb20gYmV0d2VlbiAiSXQiIGFuZCAiY2Vhc2VzIiAoNHRoIHBhcmFncmFwaCkKKzM1MSAgICAgVG9wIC0gYm90aCBvY2N1cnJlbmNlcyBvZiAicHJpbnQgXCVhIiBzaG91bGQgYmUgImVjaG8gXCVhIi4KKzM2NCAgICAgXHYoaW5wdXQpIGFuZCBcdihxdWVyeSkgb3V0IG9mIGFscGhhYmV0aWNhbCBvcmRlci4KKzM3OCAgICAgSW4gdGhlIE1ZU0VORCBtYWNybywgImlmIG5vdCBcbShyYykgZ290byBiYWQiIHNob3VsZCBiZToKKyAgICAgICAgImlmIFxtKHJjKSBnb3RvIGJhZCIgKHJlbW92ZSB0aGUgIm5vdCIpLgorMzgyLTM4MyBJdCBzaG91bGQgYmUgc3RhdGVkIHRoYXQgdGhlIGxvb3AgY29udHJvbCB2YXJpYWJsZSBtdXN0IGJlIG9mIHRoZSBcJWEKKyAgICAgICAgdHlwZSwgb3IgZWxzZSBhbiBhcnJheSBlbGVtZW50OyBtYWNybyBuYW1lcyBjYW4gbm90IGJlIHVzZWQgZm9yIHRoaXMuCiszODMgICAgIEluIGxpbmUgMywgIlwlZltcJWldIiBzaG91bGQgYmUgIlwmZltcJWldIi4KKzM4MyAgICAgSW4gdGhlIHNvcnQgZXhhbXBsZSwgaXQgc2hvdWxkIGJlIHN0YXRlZCB0aGF0IHRoZSBhcnJheSBpcyAxLWJhc2VkLgorMzg3ICAgICBDaGFuZ2UgIllvdSBjYW4gbGlzdCIgdG8gIllvdSBjYW4gZ2V0IGEgbGlzdCIgKDV0aCBwYXJhZ3JhcGgpCiszOTMgICAgIFxGdmVyaWZ5KCkgZGVzY3JpcHRpb24uICBUaGUgM3JkIHNlbnRlbmNlIGNvdWxkIGJlIHN0YXRlZCBtb3JlIGNsZWFybHkKKyAgICAgICAgYXMgIklmIGFsbCBjaGFyYWN0ZXJzIGluIHN0cmluZzIgYXJlIGFsc28gaW4gc3RyaW5nMSwgMCBpcyByZXR1cm5lZC4iCiszOTggICAgIENvcHlpbmcgXGZmaWxlcygpIHJlc3VsdHMgdG8gYW4gYXJyYXkgYmVmb3JlIGlzIG5vdCByZXF1aXJlZCBhcyBvZgorICAgICAgICBDLUtlcm1pdCA3LjAgKHNlZSBbNjM3XVNlY3Rpb24gNy4zKS4KKzQwMyAgICAgSW4gIihcJWEgKyAzKSAqIChcJWIgIDUpIiwgYSBtaW51cyBzaWduIGlzIG1pc3NpbmcgYmV0d2VlbiBiIGFuZCA1LgorNDA3ICAgICBDLUtlcm1pdCA3LjAgbm8gbG9uZ2VyIHN1cHBvcnRzIG11bHRpbGluZSBHRVQuICBDaGFuZ2UKKyAgICAgICAgImdldCwgXCUxLCBcJTIiIHRvICJnZXQge1wlMX0ge1wlMn0iIG9yICJnZXQgL2FzOntcJTJ9IHtcJTF9Ii4KKzQwOSAgICAgUkVBRCBleGFtcGxlIHdoaWxlIGxvb3Agc2hvdWxkIGJlOgorICAgICAgICB3aGlsZSBzdWNjZXNzIHsgZWNobyBcbShsaW5lKSwgcmVhZCBsaW5lIH0KKzQwOSAgICAgIldSSVRFIGZpbGUiIHNob3VsZCBiZSAiV1JJVEUga2V5d29yZCIgKHlvdSBjYW4ndCBwdXQgYSBmaWxlbmFtZSB0aGVyZSkKKyAgICAgICAgKFRoZSBzYW1lIGFwcGxpZXMgdG8gV1JJVEUtTElORSAvIFdSSVRFTE4pLgorNDE0ICAgICBcRnVuaGV4aWZ5KCkgbWlzc2luZyBmcm9tIFRhYmxlIDE4LTMuCis0MjUgICAgIE1JTlBVVCBkZWZpbml0aW9uLCBjaGFuZ2UgMm5kICJ0ZXh0MiIgdG8gInRleHQzIi4KKzQzNiAgICAgU2V2ZXJhbCBsaW5lcyBhcmUgbWlzc2luZyBmcm9tIHRoZSBVTklYTE9HSU4gbWFjcm8gbGlzdGluZy4KKyAgICAgICAgQWZ0ZXIgdGhlICJ4aWYgZmFpbCIgYmxvY2ssIGluc2VydDoKKworICAgICAgICAgIG91dCBcJTFcMTMgICAgICAgICAgICAgICAgICAgIDsgU2VuZCB1c2VybmFtZSwgY2FycmlhZ2UgcmV0dXJuCisgICAgICAgICAgaW5wIDUgUGFzc3dvcmQ6ICAgICAgICAgICAgICAgOyBXYWl0IDUgc2VjIGZvciB0aGlzIHByb21wdAorICAgICAgICAgIGlmIGZhaWwgZW5kIDEgTm8gcGFzc3dvcmQgcHJvbXB0CisgICAgICAgICAgcGF1c2UgICAgICAgICAgICAgICAgICAgICAgICAgOyBXYWl0IGEgc2VjCisgICAgICAgICAgb3V0IFwlMlwxMyAgICAgICAgICAgICAgICAgICAgOyBTZW5kIHBhc3N3b3JkCisKKzQ0MCAgICAgQ2hhbmdlICJzZXQgdGVybWluYWwgYnl0ZXN6aWUiIHRvICJzZXQgdGVybWluYWwgYnl0ZXNpemUiLgorICAgICAgICBDaGFuZ2UgImlucHV0IFBhc3N3b3JkOiIgdG8gImlucHV0IDEwIFBhc3N3b3JkIi4KKzQ0OCAgICAgRnJhbmNoaXNlIHNjcmlwdDogImFjY2VzcyBsaW5lIiBzaG91bGQgYmUgImFjY2VzcyBcbShsaW5lKSIuCis0NTMgICAgIFRoZXJlIGFyZSB0d28gaW5jb3JyZWN0bHkgY29kZWQgSUYgc3RhdGVtZW50cyBpbiB0aGUgREVMSVZFUiBtYWNybworICAgICAgICBkZWZpbml0aW9uLiAgUmVwbGFjZSBib3RoIG9jY3VycmVuY2VzIG9mICJpZiA+IFwlMSBcJTMgeyIgd2l0aAorICAgICAgICAieGlmID4gXCVpIFwlMyB7IiAocmVwbGFjZSAiaWYiIGJ5ICJ4aWYiIGFuZCAiXCUxIiB3aXRoICJcJWkiKS4KKzQ1MyAgICAgInRoZSB0aGUiIChsYXN0IHBhcmFncmFwaCkgc2hvdWxkIGJlICJ0aGUiLgorNDU0ICAgICBFT1QgKGxhc3QgcGFyYWdyYXBoKSBpcyBFbmQgb2YgVHJhbnNtaXNzaW9uLCBub3QgRW5kIG9mIFRleHQuCis0NTcgICAgIF9ERUZJTkUgZGVmaW5pdGlvbjogIm5hbWUgY29uc3RydWN0ZWQiIHNob3VsZCBiZSAibmFtZSBpcyBjb25zdHJ1Y3RlZCIuCis0NTcgICAgICJtYWNybyBmb3IgYW5kIiAobGFzdCBwYXJhZ3JhcGgpIHNob3VsZCBiZSAibWFjcm8gYW5kIi4KKzQ1OSAgICAgU2hvdWxkIGV4cGxhaW4gdGhhdCBcdih1c2VyKSBpcyBhIGxlZ2FsIGFiYnJldmlhdGlvbiBvZiBcdih1c2VyaWQpLgorNDgwICAgICBGaWd1cmUgSUktMiBpcyBiYWNrd2FyZHM7IHRoZSBsZWFzdC1zaWduaWZpY2FudCBiaXQgaXMgdHJhbnNtaXR0ZWQKKyAgICAgICAgZmlyc3QsIHRoZW4gdXAgdG8gdGhlIGhpZ2hlc3QsIGFuZCB0aGUgcGFyaXR5IGJpdCBsYXN0LgorNTM0ICAgICBUaGUgVk1TIEFwcGVuZGl4IHNlY3Rpb24gb24gT2RkIFJlY29yZCBMZW5ndGhzIG5vIGxvbmdlciBhcHBsaWVzOworICAgICAgICBDLUtlcm1pdCA3LjAgaGFuZGxlcyBvZGQgcmVjb3JkIGxlbmd0aHMgYXMgd2VsbCBhcyBldmVuIG9uZXMuCis1NTkgICAgIFRhYmxlIFZJSUktMywgUG9ydHVndWVzZSBlbnRyeS4gIENvbHVtbiA0LzAwIHNob3VsZCBzaG93IHNlY3Rpb24gc2lnbiwKKyAgICAgICAgbm90IGFjdXRlIGFjY2VudC4KKzU2MC01NjMgSFAtUm9tYW44IG1pc3NpbmcgZnJvbSBUYWJsZSBWSUktNDsgdGhlcmUgd2Fzbid0IHJvb20gdG8gc3F1ZWV6ZSBpdCBpbi4KKyAgICAgICAgSXQgaXMgbGlzdGVkIGluIHNlY3Rpb24gSUkoNikuCis1NjUgICAgICJkIHN0cm9rZSIgaW4gVGFibGUgVklJLTUgaGFzIHRoZSB3cm9uZyBhcHBlYXJhbmNlOyB0aGUgc3RlbSBzaG91bGQKKyAgICAgICAgYmUgdXByaWdodC4gIFRoZSBsZXR0ZXIgc2hvd24gaW4gdGhlIHRhYmxlIGlzIGFjdHVhbGx5IGEgbG93ZXJjYXNlCisgICAgICAgIEljZWxhbmRpYyBldGgsIHdoaWNoIGhhcyBhIGN1cnZlZCBzdGVtLgorNjAxLTYwNCBCZUJveCwgQmVPUywgUGxhbiA5LCBhbmQgcHJvYmFibHkgb3RoZXJzIG5vdCBsaXN0ZWQgaW4gdHJhZGVtYXJrcy4KKzYwNCAgICAgVGhlIHdvcmRzICJTQ1JJQkUgVEVYVCBGT1JNQVRURVIiIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0CisgICAgICAgIHNlbnRlbmNlIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGggb2YgdGhlIENvbG9waG9uLiAgVGhleSBzaG91bGQgaGF2ZQorICAgICAgICBiZWVuIGluIHRoZSBJbmRleC4KK0luZGV4OiAgTWlzc2luZyBlbnRyaWVzOiBTRVQgeyBTRU5ELCBSRUNFSVZFIH0gUEFUSE5BTUVTLCBDYWxsIHdhaXRpbmcsIC4uLgorICAgICAgICBcRigpICAgICAgICAgICAgUGFnZSA2MDUsIGFkZCBhbHNvIDQxMy00MTQKKyAgICAgICAgXEZicmVhayAgICAgICAgIDM4OQorICAgICAgICBcRmNhcGl0YWxpemUgICAgMzkwCisgICAgICAgIFxGY2hlY2tzdW0gICAgICA0MTQKKyAgICAgICAgXEZjcmMxNiAgICAgICAgIDQxNAorICAgICAgICBcRmV4ZWN1dGUgICAgICAgNDE0CisgICAgICAgIFxGaGV4aWZ5ICAgICAgICAzOTAKKyAgICAgICAgXEZsdHJpbSAgICAgICAgIDM5MQorICAgICAgICBcRnJlcGVhdCAgICAgICAgMzkyCisgICAgICAgIFxGc3Bhd24gICAgICAgICAzOTIKKyAgICAgICAgXEZ0b2Qyc2VjcyAgICAgIDM5OQorICAgICAgICBcdigpIGJ1aWx0X2luICAgUGFnZSA2MDYsIGFkZCBhbHNvIDM2MS0zNjQKKyAgICAgICAgXHYoX2xpbmUpICAgICAgIDM1NCwgMzYxCisgICAgICAgIFx2KGFwY2FjdGl2ZSkgICAzNjEKKyAgICAgICAgXHYoY2hhcnNldCkgICAgIDM2MgorICAgICAgICBcdihjcHUpICAgICAgICAgMzYyCisgICAgICAgIFx2KGNyYzE2KSAgICAgICAzNTcsIDM2MgorICAgICAgICBcdihkJHh4eCkgICAgICAgYWRkIHBhZ2UgMzYyCisgICAgICAgIFx2KGRpYWxudW1iZXIpICAzNjIKKyAgICAgICAgXHYoZGlhbHJlc3VsdCkgIDM2MgorICAgICAgICBcdihlcnJubykgICAgICAgMzYyCisgICAgICAgIFx2KGVycnN0cmluZykgICAzNjIKKyAgICAgICAgXHYoZXhlZGlyKSAgICAgIDM2MgorICAgICAgICBcdihpbmlkaXIpICAgICAgMzYzCisgICAgICAgIFx2KGlwYWRkcmVzcykgICAzNjMKKyAgICAgICAgXHYoa2V5Ym9hcmQpICAgIDM2MworICAgICAgICBcdihtYWNybykgICAgICAgMzYzCisgICAgICAgIFx2KG1pbnB1dCkgICAgICAzNjMKKyAgICAgICAgXHYobV94eHgpICAgICAgIDk0LCAzNjMKKyAgICAgICAgXHYocGFzc3dvcmQpICAgIDM2NAorICAgICAgICBcdihxdWVyeSkgICAgICAgMzY0CisgICAgICAgIFx2KHByb21wdCkgICAgICAzNjQKKyAgICAgICAgXHYoc3BlZWQpICAgICAgIDM1NiwgMzY0CisgICAgICAgIFx2KHN0YXJ0dXApICAgICAzNjQKKyAgICAgICAgXHYoc3RhdHVzKSAgICAgIDM2NAorICAgICAgICBcdihzeXNpZCkgICAgICAgMzY0CisgICAgICAgIFx2KHN5c3RlbSkgICAgICAzNjQKKyAgICAgICAgXHYoZnNpemUpICAgICAgIGF0IGxvd2VyIGhhbGYgcGFnZSA2MDYgc2hvdWxkIHJlYWQgXHYodGZzaXplKQorICAgICAgICBcdih4dmVyc2lvbikgICAgMzY0CisgICAgICAgIEJFRVAgQ29tbWFuZCAgICA0MAorICAgICAgICBTRVQgRkxPVyAgICAgICAgNjIsIDIxMgorCisgICBGaWd1cmUgSUktNSBvbiBwYWdlIDQ5My4gVGhlIHBpbiBhc3NpZ25tZW50cyBvZiB0aGUgTWluaSBEaW4tOAorICAgY29ubmVjdG9yIGFyZSBub3QgZGVzY3JpYmVkIGFueXdoZXJlLiBBcyBub3RlZCBpbiB0aGUgdGV4dCwgdGhlc2UgdGVuZAorICAgdG8gdmFyeSBmcm9tIHZlbmRvciB0byB2ZW5kb3IuIE9uZSBjb21tb24gYXJyYW5nZW1lbnQgaXM6CisKKyAgMS4gSFNLb3V0IChIYW5kc2hha2Ugb3V0IC0tIGRlZmluaXRpb24gZGVwZW5kcyBvbiBzb2Z0d2FyZSkKKyAgMi4gSFNLaW4gIChIYW5kc2hha2UgaW4gb3IgZXh0ZXJuYWwgY2xvY2spCisgIDMuIFR4RC0KKyAgNC4gTm90IHVzZWQKKyAgNS4gUnhELQorICA2LiBUeEQrCisgIDcuIE5vdCB1c2VkCisgIDguIFJ4RCsKKworICAgTm90ZSB0aGUgImJhbGFuY2VkIHBhaXJzIiBmb3IgUmVjZWl2ZSBEYXRhIChSeEQpIGFuZCBUcmFuc21pdCBEYXRhCisgICAoVHhEKSwgYW5kIHRoZSB1dHRlciBsYWNrIG9mIG1vZGVtIHNpZ25hbHMuIFRoZXNlIGNvbm5lY3RvcnMgZm9sbG93CisgICB0aGUgUlMtNDIzIHN0YW5kYXJkLCByYXRoZXIgdGhhbiBSUy0yMzIuIEluIHNvbWUgYXJyYW5nZW1lbnRzLCBQaW4gMQorICAgaXMgdXNlZCBmb3IgRFRSIGFuZCBQaW4gMiBmb3IgQ0Q7IGluIG90aGVycyBQaW4gMSBpcyBSVFMgYW5kIFBpbiAyIGlzCisgICBDVFMuCisKKyAgIFBsZWFzZSBzZW5kIHJlcG9ydHMgb2Ygb3RoZXIgZXJyb3JzIHRvIHRoZSBhdXRob3JzLCBhcyB3ZWxsIGFzCisgICBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnRzLCBhZGRpdGlvbmFsIGluZGV4IGVudHJpZXMsIGFuZCBhbnkgb3RoZXIKKyAgIGNvbW1lbnRzOgorCisgICBbNjM4XWtlcm1pdEBjb2x1bWJpYS5lZHUKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworQVBQRU5ESVggVi4gQURESVRJT05BTCBDT1BZUklHSFQgTk9USUNFUworCisgICBUaGUgZm9sbG93aW5nIGNvcHlyaWdodHMgY292ZXIgc29tZSBvZiB0aGUgc291cmNlIGNvZGUgdXNlZCBpbiB0aGUKKyAgIGRldmVsb3BtZW50IG9mIEMtS2VybWl0LCBLZXJtaXQgOTUsIG9yIEtlcm1pdCA5NSBzdXBwb3J0IGxpYnJhcmllcy4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5NSBieSBPeSBPbmxpbmUgU29sdXRpb25zIEx0ZC4gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBEaXN0cmlidXRpb24gb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBzdHJpY3RseSBmb3JiYmlkZGVuLiBVc2Ugb2YgdGhpcyAgICAqLworLyogICBzb3VyY2UgY29kZSBpcyBncmFudGVkIHRvIHRoZSBVbml2ZXJzaXR5IG9mIENvbHVtYmlhIEMtS2VybWl0IHByb2plY3QgICAqLworLyogICB0byBiZSBkaXN0cmlidXRlZCBpbiBiaW5hcnkgZm9ybWF0IG9ubHkuIFBsZWFzZSBmYW1pbGlhcml6ZSB5b3Vyc2VsZiAgICAqLworLyogICB3aXRoIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRS5QIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICB1c2VkIGZvciBYbW9kZW0sIFltb2RlbSwgYW5kIFptb2RlbSBwcm90b2NvbCBpbiBLZXJtaXQgOTUgKHA5NS5kbGwsCisgICBwMi5kbGwpCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgIENvcHlyaWdodCAoYykgMTk5NyBTdGFuZm9yZCBVbml2ZXJzaXR5CisKKyAgIFRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBmb3IgcmV2ZW51ZS1nZW5lcmF0aW5nIHB1cnBvc2VzIG1heSByZXF1aXJlIGEKKyAgIGxpY2Vuc2UgZnJvbSB0aGUgb3duZXJzIG9mIHRoZSB1bmRlcmx5aW5nIGludGVsbGVjdHVhbCBwcm9wZXJ0eS4KKyAgIFNwZWNpZmljYWxseSwgdGhlIFNSUC0zIHByb3RvY29sIG1heSBub3QgYmUgdXNlZCBmb3IKKyAgIHJldmVudWUtZ2VuZXJhdGluZyBwdXJwb3NlcyB3aXRob3V0IGEgbGljZW5zZS4KKworICAgV2l0aGluIHRoYXQgY29uc3RyYWludCwgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kCisgICBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcworICAgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzCisgICBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kCisgICByZWxhdGVkIGRvY3VtZW50YXRpb24uCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWQorICAgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisgICBJTiBOTyBFVkVOVCBTSEFMTCBTVEFORk9SRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLAorICAgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELCBPUiBBTlkgREFNQUdFUworICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIE9SIE5PVAorICAgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgICBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCisgICBTT0ZUV0FSRS4KKworICAgVXNlZCBmb3IgU2VjdXJlIFJlbW90ZSBQYXNzd29yZCAoVE0pIHByb3RvY29sIChTUlApIGluIEMtS2VybWl0LAorICAgS2VybWl0IDk1IChrOTUuZXhlLCBrMi5leGUsIGs5NWNyeXB0LmRsbCwgazJjcnlwdC5kbGwpCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgIENvcHlyaWdodCAxOTkwIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LiBBbGwKKyAgIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgRXhwb3J0IG9mIHRoaXMgc29mdHdhcmUgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIG1heSByZXF1aXJlCisgICBhIHNwZWNpZmljIGxpY2Vuc2UgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50LiBJdCBpcyB0aGUKKyAgIHJlc3BvbnNpYmlsaXR5IG9mIGFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uIGNvbnRlbXBsYXRpbmcgZXhwb3J0IHRvCisgICBvYnRhaW4gc3VjaCBhIGxpY2Vuc2UgYmVmb3JlIGV4cG9ydGluZy4KKworICAgV0lUSElOIFRIQVQgQ09OU1RSQUlOVCwgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kCisgICBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQKKyAgIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAgIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQKKyAgIHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZworICAgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yCisgICBwZXJtaXNzaW9uLiBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICAgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzCisgICBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisgICBVc2VkIGZvciBUZWxuZXQgQXV0aGVudGljYXRpb24gT3B0aW9uLCBUZWxuZXQgRW5jcnlwdGlvbiBPcHRpb24sIGFuZAorICAgS2VyYmVyb3MgKFRNKSBhdXRoZW50aWNhdGlvbiBpbiBDLUtlcm1pdCwgS2VybWl0IDk1IChrOTUuZXhlLCBrMi5leGUsCisgICBrOTVjcnlwdC5kbGwsIGsyY3J5cHQuZGxsKQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICAgbWV0OgorICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgICAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICAgICAgIGRpc3RyaWJ1dGlvbi4KKyAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisKKyAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICAgICBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAgICA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAgIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAgIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUworICAgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICAgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICAgSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgIFVzZWQgZm9yIFRlbG5ldCBBdXRoZW50aWNhdGlvbiBPcHRpb24sIFRlbG5ldCBFbmNyeXB0aW9uIE9wdGlvbiwgYW5kCisgICBLZXJiZXJvcyAoVE0pIGF1dGhlbnRpY2F0aW9uIGluIEMtS2VybWl0LCBLZXJtaXQgOTUgKGs5NS5leGUsIGsyLmV4ZSwKKyAgIGs5NWNyeXB0LmRsbCwgazJjcnlwdC5kbGwpCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSBBbGwgcmlnaHRzCisgICByZXNlcnZlZC4KKworICAgVGhpcyBwYWNrYWdlIGlzIGFuIERFUyBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAgIChlYXlAY3J5cHRzb2Z0LmNvbSkuIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtCisgICB3aXRoIE1JVCdzIGxpYmRlcy4KKworICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24uCisKKyAgIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgICB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwKKyAgIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uIGFzIHRoZSBhdXRob3Igb2YgdGhhdCB0aGUgU1NMCisgICBsaWJyYXJ5LiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtCisgICBzdGFydHVwIG9yIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZQorICAgcGFja2FnZS4KKworICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgICBtZXQ6CisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAgICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgICAgICAgZGlzdHJpYnV0aW9uLgorICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogVGhpcyBwcm9kdWN0CisgICAgICAgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorCisgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAgIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUgorICAgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCisgICBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCisgICBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgVGhlIGxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlCisgICB2ZXJzaW9uIG9yIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiBpLmUuIHRoaXMgY29kZQorICAgY2Fubm90IHNpbXBseSBiZSBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RydWJ1dGlvbiBsaWNlbnNlCisgICBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2Vuc2UuXQorCisgICBUaGUgcmVhc29uIGJlaGluZCB0aGlzIGJlaW5nIHN0YXRlZCBpbiB0aGlzIGRpcmVjdCBtYW5uZXIgaXMgcGFzdAorICAgZXhwZXJpZW5jZSBpbiBjb2RlIHNpbXBseSBiZWluZyBjb3BpZWQgYW5kIHRoZSBhdHRyaWJ1dGlvbiByZW1vdmVkCisgICBmcm9tIGl0IGFuZCB0aGVuIGJlaW5nIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2Ygb3RoZXIgcGFja2FnZXMuIFRoaXMKKyAgIGltcGxlbWVudGF0aW9uIHdhcyBhIG5vbi10cml2aWFsIGFuZCB1bnBhaWQgZWZmb3J0LgorCisgICBVc2VkIERFUyBlbmNyeXB0aW9uIGluIEtlcm1pdCA5NSAoazk1Y3J5cHQuZGxsLCBrMmNyeXB0LmRsbCkKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICogVGhpcyBpcyB2ZXJzaW9uIDEuMSBvZiBDcnlwdG9MaWIKKyAqCisgKiBUaGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBKYWNrIExhY3ksIERvbiBNaXRjaGVsbCBhbmQgTWF0dCBCbGF6ZQorICogICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBieSBBVCZULgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIGFuZCBtb2RpZnkgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGZlZQorICogaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBlbnRpcmUgbm90aWNlIGlzIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9mIGFueSBzb2Z0d2FyZSB3aGljaCBpcyBvciBpbmNsdWRlcyBhIGNvcHkgb3IKKyAqIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBpbiBhbGwgY29waWVzIG9mIHRoZSBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uIGZvciBzdWNoIHNvZnR3YXJlLgorICoKKyAqIE5PVEU6CisgKiBTb21lIG9mIHRoZSBhbGdvcml0aG1zIGluIGNyeXB0b2xpYiBtYXkgYmUgY292ZXJlZCBieSBwYXRlbnRzLgorICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIHRvIGVuc3VyZSB0aGF0IGFueSByZXF1aXJlZAorICogbGljZW5zZXMgYXJlIG9idGFpbmVkLgorICoKKyAqCisgKiBTT01FIFBBUlRTIE9GIENSWVBUT0xJQiBNQVkgQkUgUkVTVFJJQ1RFRCBVTkRFUiBVTklURUQgU1RBVEVTIEVYUE9SVAorICogUkVHVUxBVElPTlMuCisgKgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5UWS4gIElOIFBBUlRJQ1VMQVIsIE5FSVRIRVIgVEhFIEFVVEhPUlMgTk9SIEFUJlQgTUFLRSBBTlkKKyAqIFJFUFJFU0VOVEFUSU9OIE9SIFdBUlJBTlRZIE9GIEFOWSBLSU5EIENPTkNFUk5JTkcgVEhFIE1FUkNIQU5UQUJJTElUWQorICogT0YgVEhJUyBTT0ZUV0FSRSBPUiBJVFMgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworICAgVXNlZCBmb3IgQmlnIE51bWJlciBsaWJyYXJ5IGluIEtlcm1pdCA5NSAoazk1Y3J5cHQuZGxsLCBrMmNyeXB0LmRsbCkuCisKKyAgIFsgWzYzOV1Ub3AgXSBbIFs2NDBdQy1LZXJtaXQgXSBbIFs2NDFdS2VybWl0IEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICBDS0VSTUlUNzAuSFRNIC8gVGhlIEtlcm1pdCBQcm9qZWN0IC8gQ29sdW1iaWEgVW5pdmVyc2l0eSAvIDggRmViIDIwMDAKKworUmVmZXJlbmNlcworCisgICAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjY29udGVudHMKKyAgIDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgIDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG0KKyAgIDQuIG1haWx0bzprZXJtaXQtc3VwcG9ydEBjb2x1bWJpYS5lZHUKKyAgIDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKyAgIDYuIGh0dHA6Ly93d3cua2VybWl0LXByb2plY3Qub3JnLworICAgNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5ueWMubnkudXMva2VybWl0LworICAgOC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9DT1BZSU5HLlRYVAorICAgOS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja2NtYWkuYworICAxMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3h2CisgIDExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyAgMTIuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2tjYndyLnR4dAorICAxMy4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja3Vid3IudHh0CisgIDE0LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrdmJ3ci50eHQKKyAgMTUuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2t1YndyLnR4dAorICAxNi4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja2VybWl0NzAudHh0CisgIDE3LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL3NlY3VyaXR5LnR4dAorICAxOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NlY3VyaXR5Lmh0bQorICAxOS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9pa3NkLnR4dAorICAyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2lrc2QuaHRtCisgIDIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY3Vpa3NkLmh0bQorICAyMi4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi90ZWxuZXQudHh0CisgIDIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvdGVsbmV0Lmh0bQorICAyNC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9DT1BZSU5HLlRYVAorICAyNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2s5NS5odG1sCisgIDI2LiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnLworICAyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCisgIDI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeGkKKyAgMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4aWkKKyAgMzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MAorICAzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxCisgIDMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMAorICAzMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjEKKyAgMzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yCisgIDM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMworICAzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjQKKyAgMzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41CisgIDM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNS4xCisgIDM5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNS4yCisgIDQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNS4zCisgIDQxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNS40CisgIDQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNS41CisgIDQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNgorICA0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjcKKyAgNDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS44CisgIDQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuOQorICA0Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjEwCisgIDQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMTEKKyAgNDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xMS4xCisgIDUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMTEuMgorICA1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjExLjMKKyAgNTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xMS40CisgIDUzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMTEuNQorICA1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjExLjYKKyAgNTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xMS43CisgIDU2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMTIKKyAgNTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xMworICA1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjE0CisgIDU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMTUKKyAgNjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xNgorICA2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjE3CisgIDYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMTgKKyAgNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xOQorICA2NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIwCisgIDY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjEKKyAgNjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yMgorICA2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIyLjEKKyAgNjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yMi4yCisgIDY5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjIuMworICA3MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIyLjQKKyAgNzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yMi41CisgIDcyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjIuNgorICA3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIyLjcKKyAgNzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yMi44CisgIDc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjMKKyAgNzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yNAorICA3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyCisgIDc4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMAorICA3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEKKyAgODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjEKKyAgODEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjIKKyAgODIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjMKKyAgODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjQKKyAgODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjUKKyAgODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjYKKyAgODYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjcKKyAgODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjgKKyAgODguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjkKKyAgODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjEwCisgIDkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xMQorICA5MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEuMTIKKyAgOTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjEzCisgIDkzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xNAorICA5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEuMTUKKyAgOTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjE2CisgIDk2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMgorICA5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjIuMQorICA5OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjIuMgorICA5OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjMKKyAxMDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4zLjAKKyAxMDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4zLjEKKyAxMDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4zLjIKKyAxMDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4zLjMKKyAxMDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4zLjQKKyAxMDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4zLjUKKyAxMDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4zLjYKKyAxMDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi40CisgMTA4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNQorIDEwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjYKKyAxMTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi43CisgMTExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNy4wCisgMTEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNy4xCisgMTEzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNy4yCisgMTE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNy4zCisgMTE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNy40CisgMTE2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNy40LjEKKyAxMTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi43LjQuMgorIDExOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjcuNC4zCisgMTE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNy40LjQKKyAxMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi43LjQuNQorIDEyMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjgKKyAxMjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi45CisgMTIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuOS4xCisgMTI0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuOS4yCisgMTI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMTAKKyAxMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xMQorIDEyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEyCisgMTI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMTMKKyAxMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xNAorIDEzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjE1CisgMTMxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDMKKyAxMzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4My4xCisgMTMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDMuMgorIDEzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gzLjMKKyAxMzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4My40CisgMTM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQKKyAxMzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4wCisgMTM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMQorIDEzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEuMQorIDE0MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEuMgorIDE0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEuMworIDE0Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIKKyAxNDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjEKKyAxNDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjEuMQorIDE0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuMS4yCisgMTQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi4xLjMKKyAxNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjIKKyAxNDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjIuMQorIDE0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuMi4yCisgMTUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi4zCisgMTUxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi4zLjEKKyAxNTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjMuMgorIDE1My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuNAorIDE1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuNQorIDE1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuNgorIDE1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuNworIDE1Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuOAorIDE1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuOC4xCisgMTU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi44LjIKKyAxNjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjguMworIDE2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuOC40CisgMTYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMworIDE2My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjMuMQorIDE2NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjMuMgorIDE2NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjMuMworIDE2Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjMuNAorIDE2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjQKKyAxNjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC40LjEKKyAxNjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC40LjEuMQorIDE3MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjQuMS4yCisgMTcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNC4yCisgMTcyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNC4yLjEKKyAxNzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC40LjIuMS4xCisgMTc0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNC4yLjEuMgorIDE3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjQuMi4yCisgMTc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNQorIDE3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjUuMQorIDE3OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjUuMgorIDE3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjUuMi4xCisgMTgwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNS4yLjIKKyAxODEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC41LjMKKyAxODIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC41LjQKKyAxODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC42CisgMTg0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNworIDE4NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjcuMQorIDE4Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjcuMgorIDE4Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjcuMworIDE4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjgKKyAxODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC44LjEKKyAxOTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC44LjIKKyAxOTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CisgMTkyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuOS4xCisgMTkzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuOS4yCisgMTk0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuOS4zCisgMTk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTAKKyAxOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMQorIDE5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjExLjEKKyAxOTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMS4yCisgMTk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTEuMworIDIwMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjExLjQKKyAyMDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMS41CisgMjAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTEuNgorIDIwMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEyCisgMjA0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTMKKyAyMDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xNAorIDIwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjE1CisgMjA3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTYKKyAyMDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xNworIDIwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjE3LjEKKyAyMTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xNy4yCisgMjExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTgKKyAyMTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xOQorIDIxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIwCisgMjE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjAuMQorIDIxNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIwLjIKKyAyMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMC4yLjEKKyAyMTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMC4yLjIKKyAyMTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMC4yLjMKKyAyMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMC4yLjQKKyAyMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMC4yLjUKKyAyMjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMC4zCisgMjIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjEKKyAyMjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMgorIDIyNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIyLjEKKyAyMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMi4yCisgMjI2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjIuMworIDIyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIyLjQKKyAyMjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMi41CisgMjI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjIuNgorIDIzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIyLjcKKyAyMzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMi44CisgMjMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjMKKyAyMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yNAorIDIzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjI1CisgMjM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUKKyAyMzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NS4wCisgMjM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUuMQorIDIzOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g1LjIKKyAyMzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NS4zCisgMjQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUuMy4xCisgMjQxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUuMy4yCisgMjQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUuNAorIDI0My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g1LjUKKyAyNDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NS42CisgMjQ1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUuNworIDI0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2CisgMjQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuMAorIDI0OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjEKKyAyNDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni4yCisgMjUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuMworIDI1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjQKKyAyNTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni41CisgMjUzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNgorIDI1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjYuMQorIDI1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjYuMgorIDI1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjYuMgorIDI1Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjYuMworIDI1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjYuNAorIDI1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjYuNQorIDI2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjYuNS4xCisgMjYxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi41LjIKKyAyNjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni42LjUuMworIDI2My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjYuNS40CisgMjY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi41LjUKKyAyNjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni43CisgMjY2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcKKyAyNjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4wCisgMjY4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMQorIDI2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEuMQorIDI3MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEuMgorIDI3MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEuMworIDI3Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEuNAorIDI3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjIKKyAyNzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4zCisgMjc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNAorIDI3Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjUKKyAyNzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny42CisgMjc4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNworIDI3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjgKKyAyODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny45CisgMjgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuOS4xCisgMjgyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuOS4yCisgMjgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAKKyAyODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMC4xCisgMjg1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuMgorIDI4Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjMKKyAyODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMC40CisgMjg4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNQorIDI4OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjYKKyAyOTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMC43CisgMjkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuOAorIDI5Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjkKKyAyOTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMC4xMAorIDI5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjExCisgMjk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTIKKyAyOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMworIDI5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjE0CisgMjk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTUKKyAyOTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xNgorIDMwMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjE3CisgMzAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTgKKyAzMDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xOQorIDMwMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjIwCisgMzA0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMjAuMQorIDMwNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjIwLjIKKyAzMDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yMQorIDMwNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjIyCisgMzA4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMjMKKyAzMDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yNAorIDMxMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjI1CisgMzExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMjYKKyAzMTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yNi4xCisgMzEzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMjYuMgorIDMxNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjI3CisgMzE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDgKKyAzMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4OQorIDMxNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g5LjAKKyAzMTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4OS4xCisgMzE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDkuMgorIDMyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g5LjMKKyAzMjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MTAKKyAzMjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4aWlpCisgMzIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeGlpaS4xCisgMzI0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeGlpaS4xLjEKKyAzMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4aWlpLjEuMgorIDMyNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3hpaWkuMS4yLjEKKyAzMjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4aWlpLjEuMi4yCisgMzI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeGlpaS4xLjIuMworIDMyOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3hpaWkuMgorIDMzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3hpdgorIDMzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3h2CisgMzMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyAzMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2JyZXZpZXdzLmh0bWwKKyAzMzQuIGh0dHA6Ly93d3cuYmh1c2EuY29tLworIDMzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L21hbnVhbHMuaHRtbCNja2RlCisgMzM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvbWFudWFscy5odG1sI2t0YgorIDMzNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L25ld3MuaHRtbAorIDMzOC4gbmV3czpjb21wLnByb3RvY29scy5rZXJtaXQuYW5ub3VuY2UKKyAzMzkuIG5ld3M6Y29tcC5wcm90b2NvbHMua2VybWl0Lm1pc2MKKyAzNDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDM0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0CisgMzQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMworIDM0My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIzCisgMzQ0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNS4xCisgMzQ1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNQorIDM0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjcuMQorIDM0Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkuCisgMzQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyAzNDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny45LjIKKyAzNTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xNQorIDM1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g5LjEKKyAzNTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS42CisgMzUzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNAorIDM1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkuMQorIDM1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI21qZAorIDM1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI21qZAorIDM1Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkKKyAzNTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDM1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCisgMzYwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNQorIDM2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEyCisgMzYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNQorIDM2My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkuMQorIDM2NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjYuNQorIDM2NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkKKyAzNjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xOAorIDM2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjQKKyAzNjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xNQorIDM2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjMKKyAzNzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4zCisgMzcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNworIDM3Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEKKyAzNzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45LjEKKyAzNzQuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2tjY2ZnLnR4dAorIDM3NS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja2NjZmcudHh0CisgMzc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjIuNAorIDM3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIyLjUKKyAzNzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDM3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIyLjUKKyAzODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMgorIDM4MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEuMTYKKyAzODIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi43CisgMzgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMy41CisgMzg0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNQorIDM4NS4gaHR0cDovL3d3dy50ZWxlZm9uaWNhLmVzL2NhbWJpb2RlbnVtZXJhY2lvbi8KKyAzODYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny41CisgMzg3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyAzODguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4yLjIKKyAzODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjExCisgMzkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xMworIDM5MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEuMTIKKyAzOTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDM5My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEuMQorIDM5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCisgMzk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyAzOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjcKKyAzOTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjYKKyAzOTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDM5OS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi90ZWxuZXQudHh0CisgNDAwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvdGVsbmV0Lmh0bQorIDQwMS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi90ZWxuZXQudHh0CisgNDAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvdGVsbmV0Lmh0bQorIDQwMy4gZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjMTU3Mi50eHQKKyA0MDQuIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzc3OS50eHQKKyA0MDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDQwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEwCisgNDA3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuOAorIDQwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUKKyA0MDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMAorIDQxMC4gaHR0cDovL3d3dy5wc3kudXEub3ouYXUvfmZ0cC9DcnlwdG8vCisgNDExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtCisgNDEyLiBodHRwOi8vc3JwLnN0YW5mb3JkLmVkdS9zcnAvCisgNDEzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNy4xLAorIDQxNC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja2NjZmcudHh0CisgNDE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtCisgNDE2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyA0MTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi43CisgNDE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMAorIDQxOS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja3VpbnMudHh0CisgNDIwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrdWJ3ci50eHQKKyA0MjEuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2t1aW5zLnR4dAorIDQyMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2lrc2QuaHRtbCN4NC4yCisgNDIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaWtzZC5odG1sCisgNDI0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi44LjEKKyA0MjUuIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzE5NDUudHh0CisgNDI2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNQorIDQyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gzLjIKKyA0MjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4My4yCisgNDI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyA0MzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDQzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g1LjQKKyA0MzIuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2t1YndyLnR4dAorIDQzMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEwCisgNDM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNy4xCisgNDM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNy4zCisgNDM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMworIDQzNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEwCisgNDM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTEKKyA0MzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xNQorIDQ0MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuNAorIDQ0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjcKKyA0NDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjMKKyA0NDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjEuMworIDQ0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCisgNDQ1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi4yCisgNDQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNQorIDQ0Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuOC4yCisgNDQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMworIDQ0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEwCisgNDUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTEKKyA0NTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xNQorIDQ1Mi4gaHR0cDovL3d3dy50ZWxzdHJhLmNvbS5hdS9kb2NzL1BHUC8KKyA0NTMuIGh0dHA6Ly93d3cudGVsc3RyYS5jb20uYXUvZG9jcy9QR1AvcGdwZG9jMi9wZ3Bkb2MyXzE3Lmh0bWwKKyA0NTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zZWN1cml0eS5odG0KKyA0NTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi43CisgNDU2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyA0NTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xNAorIDQ1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIzCisgNDU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNworIDQ2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCisgNDYxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyA0NjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CisgNDYzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyA0NjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41LjQKKyA0NjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4zCisgNDY2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNS41CisgNDY3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNQorIDQ2OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkKKyA0NjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41LjQKKyA0NzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CisgNDcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNS40CisgNDcyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNS41CisgNDczLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyA0NzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDQ3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUKKyA0NzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS42CisgNDc3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAKKyA0NzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMC4xMQorIDQ3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjYKKyA0ODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjIKKyA0ODEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMQorIDQ4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUuNAorIDQ4My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkuMQorIDQ4NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjAuNgorIDQ4NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIKKyA0ODYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xCisgNDg3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNy4xCisgNDg4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyA0ODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41CisgNDkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi4yCisgNDkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNy4xCisgNDkyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMgorIDQ5My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEwCisgNDk0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi4yCisgNDk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNy4xCisgNDk2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMgorIDQ5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEwCisgNDk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMTEuNQorIDQ5OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjAuNgorIDUwMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjExCisgNTAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuOS4xCisgNTAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTEuMworIDUwMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkKKyA1MDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CisgNTA1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNS4xCisgNTA2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAKKyA1MDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMC41CisgNTA4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuMworIDUwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjUKKyA1MTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDUxMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjMKKyA1MTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMAorIDUxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjMKKyA1MTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMAorIDUxNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjE1CisgNTE2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTgKKyA1MTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMAorIDUxOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIwCisgNTE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjAKKyA1MjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xOQorIDUyMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjE2CisgNTIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTkKKyA1MjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMC4yLjMKKyA1MjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41CisgNTI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi41LjQKKyA1MjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMi4yCisgNTI3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjIuMworIDUyOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCisgNTI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyA1MzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4OS4zCisgNTMxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUuMi4xCisgNTMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNS4xCisgNTMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNS4yCisgNTM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNgorIDUzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3hpaWkKKyA1MzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4aWlpCisgNTM3LiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMxNDg5LnR4dAorIDUzOC4gZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjMjMxOS50eHQKKyA1MzkuIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvCisgNTQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi4yCisgNTQxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi41LjEKKyA1NDIuIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzI2NDAudHh0CisgNTQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi4yCisgNTQ0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuMAorIDU0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjUKKyA1NDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni40CisgNTQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyA1NDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMQorIDU0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjUKKyA1NTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi44CisgNTUxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNworIDU1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjIKKyA1NTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xOQorIDU1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkKKyA1NTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xCisgNTU2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMgorIDU1Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEKKyA1NTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yCisgNTU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xMQorIDU2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEwCisgNTYxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjZmVycnN0cmluZworIDU2Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuNQorIDU2My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEuMTAKKyA1NjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4OS4xCisgNTY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMjMKKyA1NjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yMworIDU2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIyCisgNTY4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNgorIDU2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjIzCisgNTcwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMjQKKyA1NzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yNAorIDU3Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuMworIDU3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEyCisgNTc0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuOQorIDU3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCisgNTc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTEuMworIDU3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjExLjMKKyA1NzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny41CisgNTc5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNworIDU4MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjcKKyA1ODEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjguNAorIDU4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuNQorIDU4My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjgKKyA1ODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45LjEKKyA1ODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDU4Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjE5CisgNTg3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTYKKyA1ODguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny45LjEKKyA1ODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny41CisgNTkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMworIDU5MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjExLjMKKyA1OTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC41LjEKKyA1OTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMAorIDU5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjEwCisgNTk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNQorIDU5Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjIzCisgNTk3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNworIDU5OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjcKKyA1OTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMS4zCisgNjAwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuMTEKKyA2MDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CisgNjAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuMworIDYwMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjMKKyA2MDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny45LjIKKyA2MDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDYwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjE3LjIKKyA2MDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yMgorIDYwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjcuMQorIDYwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIyCisgNjEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMworIDYxMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkKKyA2MTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yMgorIDYxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjYKKyA2MTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny41CisgNjE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNQorIDYxNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjE5CisgNjE3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuOS4xCisgNjE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDkuMworIDYxOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjUKKyA2MjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDYyMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjQKKyA2MjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yMC4yCisgNjIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNQorIDYyNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjkKKyA2MjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xMAorIDYyNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUKKyA2MjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC43LjEKKyA2MjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pa3NkLmh0bWwKKyA2MjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xOQorIDYzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEwCisgNjMxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTEKKyA2MzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4zCisgNjMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvZ2tlcm1pdC5odG1sCisgNjM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjAKKyA2MzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9na2VybWl0Lmh0bWwKKyA2MzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDYzNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjMKKyA2MzguIG1haWx0bzprZXJtaXRAY29sdW1iaWEuZWR1CisgNjM5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjdG9wCisgNjQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNjQxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbApkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrZXJtaXQ4MC50eHQgYi9ja2VybWl0LTguMC4yMTEvY2tlcm1pdDgwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTMzMzhhCi0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrZXJtaXQ4MC50eHQKQEAgLTAsMCArMSwxMDM0OSBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDLUtlcm1pdCA4LjAgVXBkYXRlIE5vdGVzCisKKyAgIFsgWzFdQ29udGVudHMgXSBbIFsyXUMtS2VybWl0IF0gWyBbM11LZXJtaXQgSG9tZSBdCisKKyAgICAgICAgICAgICAgU2Vjb25kIFN1cHBsZW1lbnQgdG8gVXNpbmcgQy1LZXJtaXQsIFNlY29uZCBFZGl0aW9uCisKK0ZvciBDLUtlcm1pdCA4LjAKKworICAgQXMgb2YgQy1LZXJtaXQgdmVyc2lvbjogOC4wLjIxMQorICAgRGF0ZSBvZiBDLUtlcm1pdCByZWxlYXNlOiAxMCBBcHJpbCAyMDAzCisgICBUaGlzIGZpbGUgbGFzdCB1cGRhdGVkOiBTYXQgQXByIDEwIDE2OjM2OjExIDIwMDQKKworICAgICAqIElGIFlPVSBBUkUgUkVBRElORyBBIFBMQUlOLVRFWFQgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50LCBub3RlCisgICAgICAgdGhhdCBpdCBpcyBhIHBsYWluLXRleHQgZHVtcCBvZiBhIFdlYiBwYWdlLiBZb3UgY2FuIHZpc2l0IHRoZQorICAgICAgIG9yaWdpbmFsIChhbmQgcG9zc2libHkgbW9yZSB1cC10by1kYXRlKSBXZWIgcGFnZSBoZXJlOgorICBbNF1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwKKyAgICAgKiBJZiB5b3UgYXJlIHJlYWRpbmcgdGhlIEhUTUwgdmVyc2lvbiBvZiB0aGlzIGZpbGUgd2l0aCBhIEdVSSBXZWIKKyAgICAgICBicm93c2VyLCB0aGUgZmVhdHVyZXMgYWRkZWQgc2luY2UgQy1LZXJtaXQgOC4wLjIwMSBhcmUgc2hvd24gaW4KKyAgICAgICByZWQgaWYgeW91ciBicm93c2VyIGFuZCBtb25pdG9yIHBlcm1pdC4gRmVhdHVyZXMgdGhhdCB3ZXJlIG5ldyB0bworICAgICAgIHZlcnNpb25zIDguMC4yMDAgYW5kIDIwMSBhcmUgaW4gYmxhY2suCisKK0F1dGhvcnM6IEZyYW5rIGRhIENydXogYW5kIENocmlzdGluZSBNLiBHaWFub25lCitBZGRyZXNzOiBUaGUgS2VybWl0IFByb2plY3QKKyAgICAgICAgIENvbHVtYmlhIFVuaXZlcnNpdHkKKyAgICAgICAgIDYxMiBXZXN0IDExNXRoIFN0cmVldAorICAgICAgICAgTmV3IFlvcmsgTlkgMTAwMjUtNzc5OQorICAgICAgICAgVVNBCitGYXg6ICAgICArMSAoMjEyKSA2NjItNjQ0MgorRS1NYWlsOiAgWzVda2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1CitXZWI6ICAgICBbNl1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvCitPcjogICAgICBbN11odHRwOi8vd3d3Lmtlcm1pdC1wcm9qZWN0Lm9yZy8KK09yOiAgICAgIFs4XWh0dHA6Ly93d3cuY29sdW1iaWEubnljLm55LnVzL2tlcm1pdC8KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICBOT1RJQ0VTCisKKyAgIFRoaXMgZG9jdW1lbnQ6CisgICAgICAgICAgQ29weXJpZ2h0IKkgMTk5NywgMjAwMiwgRnJhbmsgZGEgQ3J1eiBhbmQgQ2hyaXN0aW5lIE0uIEdpYW5vbmUuCisgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgS2VybWl0IDk1OgorICAgICAgICAgIENvcHlyaWdodCCpIDE5OTUsIDIwMDIsIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlCisgICAgICAgICAgQ2l0eSBvZiBOZXcgWW9yay4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgQy1LZXJtaXQ6CisgICAgICAgICAgQ29weXJpZ2h0IKkgMTk4NSwgMjAwMiwKKyAgICAgICAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLiBBbGwKKyAgICAgICAgICByaWdodHMgcmVzZXJ2ZWQuIFNlZSB0aGUgQy1LZXJtaXQgWzldQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICAgICAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgWzEwXWNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQKKyAgICAgICAgICBwZXJtaXNzaW9ucy4KKworICAgV2hlbiBLZXJiZXJvcyhUTSkgYW5kL29yIFNSUChUTSkgKFNlY3VyZSBSZW1vdGUgUGFzc3dvcmQpIGFuZC9vcgorICAgICAgICAgIFNTTC9UTFMgcHJvdG9jb2wgYXJlIGluY2x1ZGVkOgorICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCCpIDE5OTAsIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mCisgICAgICAgICAgVGVjaG5vbG9neS4KKyAgICAgICAgICBQb3J0aW9ucyBDb3B5cmlnaHQgqSAxOTkxLCAxOTkzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YKKyAgICAgICAgICBDYWxpZm9ybmlhLgorICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCCpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgYnkgQVQmVC4KKyAgICAgICAgICBQb3J0aW9ucyBDb3B5cmlnaHQgqSAxOTk3LCBTdGFuZm9yZCBVbml2ZXJzaXR5LgorICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCCpIDE5OTUtMTk5NywgRXJpYyBZb3VuZworICAgICAgICAgIDxlYXlAY3J5cHRvc29mdC5jb20+LgorCisgICBGb3IgdGhlIGZ1bGwgdGV4dCBvZiB0aGUgdGhpcmQtcGFydHkgY29weXJpZ2h0IG5vdGljZXMsIHNlZQorICAgWzExXUFwcGVuZGl4IFYuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgV0hBVCBJUyBJTiBUSElTIEZJTEUKKworICAgVGhpcyBmaWxlIGxpc3RzIGNoYW5nZXMgbWFkZSB0byBDLUtlcm1pdCBzaW5jZSB2ZXJzaW9uIDcuMCB3YXMKKyAgIHJlbGVhc2VkIGluIEphbnVhcnkgMjAwMC4gVXNlIHRoaXMgZmlsZSBhcyBhIHN1cHBsZW1lbnQgdG86CisKKyAgICAgKiBUaGUgc2Vjb25kIGVkaXRpb24gb2YgWzEyXVVzaW5nIEMtS2VybWl0OyBhbmQ6CisgICAgICogVGhlIFsxM11DLUtlcm1pdCA3LjAgVXBkYXRlIE5vdGVzLiBBbHNvIGF2YWlsYWJsZSBpbiBwbGFpbi10ZXh0CisgICAgICAgZm9ybSBhcyBbMTRdY2tlcm1pdDcwLnR4dC4KKworICAgdW50aWwgdGhlIHRoaXJkIGVkaXRpb24gb2YgVXNpbmcgQy1LZXJtaXQgaXMgcHVibGlzaGVkLiBXZSBhcG9sb2dpemUKKyAgIGZvciB0aGUgc2NhdHRlcmVkIGRvY3VtZW50YXRpb24gYW5kIHdpbGwgY29uc29saWRhdGUgaXQgd2hlbiB3ZSBhcmUKKyAgIGFibGUuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgIEFERElUSU9OQUwgRklMRVMgU2V2ZXJhbCBvdGhlciBmaWxlcyBhY2NvbXBhbnkgdGhpcyBuZXcgS2VybWl0CisgICByZWxlYXNlOgorCisgICBbMTVdY2t1dHV0b3IuaHRtbAorICAgICAgICAgIEMtS2VybWl0IFR1dG9yaWFsIChmb3IgVW5peCkuIEFsc28gZGlzdHJpYnV0ZWQgaW4gTnJvZmYgZm9ybSBhcworICAgICAgICAgIFsxNl1ja3VrZXIubnIsIHRoZSBVbml4IEMtS2VybWl0IG1hbnVhbCBwYWdlLgorCisgICBbMTddc2VjdXJpdHkuaHRtCisgICAgICAgICAgRGlzY3Vzc2lvbiBvZiBLZXJtaXQncyBuZXcgYXV0aGVudGljYXRpb24gYW5kIGVuY3J5cHRpb24KKyAgICAgICAgICBmZWF0dXJlcywgdXBkYXRlZCBmb3IgQy1LZXJtaXQgOC4wLgorCisgICBbMThddGVsbmV0Lmh0bQorICAgICAgICAgIERldGFpbGVkIGRvY3VtZW50YXRpb24gb2YgS2VybWl0J3MgVGVsbmV0IGNsaWVudCwgdXBkYXRlZCBmb3IKKyAgICAgICAgICBDLUtlcm1pdCA4LjAuCisKKyAgIFsxOV1mdHBzY3JpcHRzLmh0bWwKKyAgICAgICAgICBUdXRvcmlhbDogV3JpdGluZyBGVFAgYXV0b21hdGlvbiBzY3JpcHRzCisKKyAgIFsyMF1ja2Nid3IuaHRtbAorICAgICAgICAgIFBsYXRmb3JtLWluZGVwZW5kZW50IEMtS2VybWl0IGhpbnRzIGFuZCB0aXBzLiBBbHNvIGRpc3RyaWJ1dGVkCisgICAgICAgICAgaW4gcGxhaW4gdGV4dCBmb3JtIGFzIFsyMV1ja2Nid3IudHh0CisKKyAgIFsyMl1ja3Vid3IuaHRtbAorICAgICAgICAgIFVuaXgtc3BlY2lmaWMgQy1LZXJtaXQgaGludHMgYW5kIHRpcHMuIEFsc28gZGlzdHJpYnV0ZWQgaW4KKyAgICAgICAgICBwbGFpbiB0ZXh0IGZvcm0gYXMgWzIzXWNrdWJ3ci50eHQuCisKKyAgIFsyNF1ja3Zid3IuaHRtbAorICAgICAgICAgIFZNUy1zcGVjaWZpYyBDLUtlcm1pdCBoaW50cyBhbmQgdGlwcy4gQWxzbyBkaXN0cmlidXRlZCBpbiBwbGFpbgorICAgICAgICAgIHRleHQgZm9ybSBhcyBbMjVdY2t2YndyLnR4dC4KKworICAgWzI2XWNrdWlucy5odG1sCisgICAgICAgICAgVW5peCBDLUtlcm1pdCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLiBBbHNvIGRpc3RyaWJ1dGVkIGluCisgICAgICAgICAgcGxhaW4gdGV4dCBmb3JtIGFzIFsyN11ja3VpbnMudHh0LgorCisgICBbMjhdY2t2aW5zLmh0bWwKKyAgICAgICAgICBWTVMgQy1LZXJtaXQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4gQWxzbyBkaXN0cmlidXRlZCBpbgorICAgICAgICAgIHBsYWluIHRleHQgZm9ybSBhcyBbMjldY2t2aW5zLnR4dC4KKworICAgWzMwXWNrY2NmZy5odG1sCisgICAgICAgICAgQ29tcGlsZS10aW1lIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gQWxzbyBkaXN0cmlidXRlZCBpbiBwbGFpbgorICAgICAgICAgIHRleHQgZm9ybSBhcyBbMzFdY2tjY2ZnLnR4dC4KKworICAgWzMyXWNrY3BsbS5odG1sCisgICAgICAgICAgQy1LZXJtaXQgUHJvZ3JhbSBMb2dpYyBNYW51YWwuIEFsc28gZGlzdHJpYnV0ZWQgaW4gcGxhaW4gdGV4dAorICAgICAgICAgIGZvcm0gYXMgWzMzXWNrY3BsbS50eHQuCisKKyAgIFszNF1pa3NkLmh0bWwKKyAgICAgICAgICBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSBBbWluaXN0cmF0b3JzIEd1aWRlIGZvciBVbml4LgorCisgICBbMzVdc2tlcm1pdC5odG1sCisgICAgICAgICAgQy1LZXJtaXQgYXMgYW4gU1NIIFN1YnN5c3RlbSAoU0ZUUCBzZXJ2ZXIgcmVwbGFjZW1lbnQpLgorCisgICBbIFszNl1Ub3AgXSBbIFszN11DLUtlcm1pdCBdIFsgWzM4XUtlcm1pdCBIb21lIF0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworQ09OVEVOVFMKKworICAgICBbMzldMC4gV0hBVCdTIE5FVworICAgICBbNDBdMS4gRklYRVMgU0lOQ0UgVkVSU0lPTiA3LjAuMTk2CisgICAgIFs0MV0yLiBTU0ggQU5EIEhUVFAgCisgICAgICAgICBbNDJdMi4xLiBTU0ggQ29ubmVjdGlvbnMKKyAgICAgICAgIFs0M10yLjIuIEhUVFAgQ29ubmVjdGlvbnMKKyAgICAgICAgICAgIFs0NF0yLjIuMS4gSFRUUCBDb21tYW5kIFN3aXRjaGVzCisgICAgICAgICAgICBbNDVdMi4yLjIuIEhUVFAgQWN0aW9uIENvbW1hbmRzCisgICAgICAgICAgICBbNDZdMi4yLjMuIEhUVFAgSGVhZGVycworICAgICAgICAgICAgWzQ3XTIuMi40LiBTZWN1cmUgSFRUUCBDb25uZWN0aW9ucworICAgICAgICAgICAgWzQ4XTIuMi41LiBIVFRQIFZhcmlhYmxlcworICAgICAgICAgICAgWzQ5XTIuMi42LiBUaGUgSFRUUCBDb21tYW5kLUxpbmUgUGVyc29uYWxpdHkKKyAgICAgWzUwXTMuIFRIRSBCVUlMVC1JTiBGVFAgQ0xJRU5UCisgICAgICAgICBbNTFdMy4xLiBNYWtpbmcgYW5kIE1hbmFnaW5nIEZUUCBDb25uZWN0aW9ucworICAgICAgICAgICAgWzUyXTMuMS4xLiBLZXJtaXQgQ29tbWFuZC1MaW5lIE9wdGlvbnMgZm9yIEZUUAorICAgICAgICAgICAgWzUzXTMuMS4yLiBUaGUgRlRQIENvbW1hbmQtTGluZSBQZXJzb25hbGl0eQorICAgICAgICAgICAgWzU0XTMuMS4zLiBUaGUgRlRQIFVSTCBJbnRlcnByZXRlcgorICAgICAgICAgICAgWzU1XTMuMS40LiBJbnRlcmFjdGl2ZSBGVFAgU2Vzc2lvbiBFc3RhYmxpc2htZW50CisgICAgICAgICBbNTZdMy4yLiBNYWtpbmcgU2VjdXJlIEZUUCBDb25uZWN0aW9ucworICAgICAgICAgWzU3XTMuMy4gU2V0dGluZyBGVFAgUHJlZmVyZW5jZXMKKyAgICAgICAgIFs1OF0zLjQuIE1hbmFnaW5nIERpcmVjdG9yaWVzIGFuZCBGaWxlcworICAgICAgICAgWzU5XTMuNS4gVXBsb2FkaW5nIEZpbGVzIFdpdGggRlRQCisgICAgICAgICAgICBbNjBdMy41LjEuIEZUUCBQVVQgU3dpdGNoZXMKKyAgICAgICAgICAgIFs2MV0zLjUuMi4gVXBkYXRlIE1vZGUKKyAgICAgICAgICAgIFs2Ml0zLjUuMy4gUmVjb3ZlcnkKKyAgICAgICAgIFs2M10zLjYuIERvd25sb2FkaW5nIEZpbGVzIFdpdGggRlRQCisgICAgICAgICAgICBbNjRdMy42LjEuIEZUUCBHRVQgU3dpdGNoZXMKKyAgICAgICAgICAgIFs2NV0zLjYuMi4gRmlsZW5hbWUgQ29sbGlzaW9ucworICAgICAgICAgICAgWzY2XTMuNi4zLiBSZWNvdmVyeQorICAgICAgICAgWzY3XTMuNy4gVHJhbnNsYXRpbmcgQ2hhcmFjdGVyIFNldHMKKyAgICAgICAgICAgIFs2OF0zLjcuMS4gQ2hhcmFjdGVyIFNldHMgYW5kIFVwbG9hZGluZworICAgICAgICAgICAgWzY5XTMuNy4yLiBDaGFyYWN0ZXIgU2V0cyBhbmQgRG93bmxvYWRpbmcKKyAgICAgICAgIFs3MF0zLjguIEZUUCBDb21tYW5kIFNob3J0Y3V0cworICAgICAgICAgWzcxXTMuOS4gRHVhbCBTZXNzaW9ucworICAgICAgICAgWzcyXTMuMTAuIEF1dG9tYXRpbmcgRlRQIFNlc3Npb25zCisgICAgICAgICAgICBbNzNdMy4xMC4xLiBGVFAtU3BlY2lmaWMgVmFyaWFibGVzIGFuZCBGdW5jdGlvbnMKKyAgICAgICAgICAgIFs3NF0zLjEwLjIuIEV4YW1wbGVzCisgICAgICAgICAgICBbNzVdMy4xMC4zLiBBdXRvbWF0aW5nIFNlY3VyZSBGVFAgQ29ubmVjdGlvbnMKKyAgICAgICAgIFs3Nl0zLjExLiBBZHZhbmNlZCBGVFAgUHJvdG9jb2wgRmVhdHVyZXMgIFs3N100LiBGSUxFIFNDQU5OSU5HCisgICAgWzc4XTUuIEZJTEUgQU5EIERJUkVDVE9SWSBOQU1FUyBDT05UQUlOSU5HIFNQQUNFUworICAgIFs3OV02LiBPVEhFUiBDT01NQU5EIFBBUlNJTkcgSU1QUk9WRU1FTlRTCisgICAgICAgICBbODBdNi4xLiBHcm91cGluZyBNYWNybyBBcmd1bWVudHMKKyAgICAgICAgIFs4MV02LjIuIERpcmVjdG9yeSBhbmQgRmlsZSBOYW1lIENvbXBsZXRpb24KKyAgICAgICAgIFs4Ml02LjMuIFBhc3NpbmcgQXJndW1lbnRzIHRvIENvbW1hbmQgRmlsZXMKKyAgICAgICAgIFs4M102LjQuIE1vcmUtUHJvbXB0aW5nCisgICAgICAgICBbODRdNi41LiBDb21tYXMgaW4gTWFjcm8gRGVmaW5pdGlvbnMKKyAgICAgICAgIFs4NV02LjYuIEFycm93IEtleXMKKyAgICBbODZdNy4gTkVXIENPTU1BTkRTIEFORCBTV0lUQ0hFUworICAgIFs4N104LiBTQ1JJUFRJTkcgSU1QUk9WRU1FTlRTCisgICAgICAgICBbODhdOC4xLiBQZXJmb3JtYW5jZSBhbmQgRGVidWdnaW5nCisgICAgICAgICBbODldOC4yLiBVc2luZyBNYWNyb3MgYXMgTnVtZXJpYyBWYXJpYWJsZXMKKyAgICAgICAgIFs5MF04LjMuIE5ldyBJRiBDb25kaXRpb25zCisgICAgICAgICBbOTFdOC40LiBUaGUgT05fVU5LTk9XTl9DT01NQU5EIGFuZCBPTl9DRCBNYWNyb3MKKyAgICAgICAgIFs5Ml04LjUuIFRoZSBTSE9XIE1BQ1JPIENvbW1hbmQKKyAgICAgICAgIFs5M104LjYuIEFycmF5cworICAgICAgICAgWzk0XTguNy4gTmV3IG9yIEltcHJvdmVkIEJ1aWx0LWluIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zCisgICAgICAgICBbOTVdOC44LiBUaGUgUkVUVVJOIGFuZCBFTkQgQ29tbWFuZHMKKyAgICAgICAgIFs5Nl04LjkuIFVOREVGSU5pbmcgR3JvdXBzIG9mIFZhcmlhYmxlcworICAgICAgICAgWzk3XTguMTAuIFRoZSBJTlBVVCBhbmQgTUlOUFVUIENvbW1hbmRzCisgICAgICAgICBbOThdOC4xMS4gTGVhcm5lZCBTY3JpcHRzCisgICAgICAgICBbOTldOC4xMi4gUGF0dGVybiBNYXRjaGluZworICAgICAgICAgWzEwMF04LjEzLiBEYXRlcyBhbmQgVGltZXMKKyAgICAgICAgIFsxMDFdOC4xNC4gVHJhcHBpbmcgS2V5Ym9hcmQgSW50ZXJydXB0aW9uCisgICAgWzEwMl05LiBTLUVYUFJFU1NJT05TCisgICAgICAgICBbMTAzXTkuMS4gV2hhdCBpcyBhbiBTLUV4cHJlc3Npb24/CisgICAgICAgICBbMTA0XTkuMi4gSW50ZWdlciBhbmQgRmxvYXRpbmctUG9pbnQtQXJpdGhtZXRpYworICAgICAgICAgWzEwNV05LjMuIEhvdyB0byBVc2UgUy1FeHByZXNzaW9ucworICAgICAgICAgWzEwNl05LjQuIFN1bW1hcnkgb2YgQnVpbHQtaW4gQ29uc3RhbnRzIGFuZCBPcGVyYXRvcnMKKyAgICAgICAgIFsxMDddOS41LiBWYXJpYWJsZXMKKyAgICAgICAgIFsxMDhdOS42LiBBc3NpZ25tZW50cyBhbmQgU2NvcGUKKyAgICAgICAgIFsxMDldOS43LiBDb25kaXRpb25hbCBFeHByZXNzaW9ucworICAgICAgICAgWzExMF05LjguIEV4dGVuc2liaWxpdHkKKyAgICAgICAgIFsxMTFdOS45LiBFeGFtcGxlcworICAgICAgICAgWzExMl05LjEwLiBEaWZmZXJlbmNlcyBmcm9tIEFsZ2VicmFpYyBOb3RhdGlvbgorICAgICAgICAgWzExM105LjExLkRpZmZlcmVuY2VzIGZyb20gTGlzcAorICAgIFsxMTRdMTAuIEZJTEUgVFJBTlNGRVIKKyAgICBbMTE1XTExLiBNT0RFTVMgQU5EIERJQUxJTkcKKyAgICBbMTE2XTEyLiBURVJNSU5BTCBDT05ORUNUSU9OCisgICAgWzExN10xMy4gQ0hBUkFDVEVSIFNFVFMKKyAgICBbMTE4XTE0LiBESUFMT1VUIEZST00gVEVMTkVUIFRFUk1JTkFMIFNFUlZFUlMKKyAgICBbMTE5XTE1LiBDT1BJTkcgV0lUSCBCUk9LRU4gS0VSTUlUIFBBUlRORVJTCisgICAgWzEyMF0xNi4gTkVXIENPTU1BTkQtTElORSBPUFRJT05TCisgICAgWzEyMV0xNy4gTE9HUworCisgICBbIFsxMjJdVG9wIF0gWyBbMTIzXUMtS2VybWl0IF0gWyBbMTI0XUtlcm1pdCBIb21lIF0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMC4gV0hBVCdTIE5FVworCisgICBUaGUgSW5pdGlhbGl6YXRpb24gYW5kIEN1c3RvbWl6YXRpb24gRmlsZXMKKyAgICAgICAgICBDLUtlcm1pdCA4LjAgbm93IHN1cHBvcnRzIHNwZWNpZmljYXRpb24gb2YgdGhlIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgZmlsZSBuYW1lIChwYXRoKSBpbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgQ0tFUk1JVF9JTkkuIEl0CisgICAgICAgICAgYWxzbyByZWxpZXMgZmFyIGxlc3MgdGhhbiBiZWZvcmUgb24gdGhlIGluaXRpYWxpemF0aW9uIGZvcgorICAgICAgICAgIGZ1bmN0aW9uaW5nLiBTZWUgWzEyNV1TZWN0aW9uIDUgb2YgdGhlIFVuaXggQy1LZXJtaXQKKyAgICAgICAgICBbMTI2XWluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgZm9yIGRldGFpbHMuIEFzIG9mIHZlcnNpb24KKyAgICAgICAgICA4LjAuMjAxLCBDLUtlcm1pdCBhbHNvIGV4ZWN1dGVzIHlvdXIgY3VzdG9taXphdGlvbiBmaWxlIChpZiB5b3UKKyAgICAgICAgICBoYXZlIG9uZSkgZXZlbiBpZiB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZSB3YXMgbm90IGZvdW5kLgorICAgICAgICAgIFByZXZpb3VzbHksIHRoZSBjdXN0b21pemF0aW9uIGZpbGUgd2FzIGV4ZWN1dGVkIGJ5IGEgVEFLRQorICAgICAgICAgIGNvbW1hbmQgaW4gdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgKGFuZCBpdCBzdGlsbCBpcywgaWYgYW4KKyAgICAgICAgICBpbml0aWFsaXphdGlvbiBpcyBmb3VuZCkuCisKKyAgIEluY29tcGF0aWJsZSBDaGFuZ2VzCisgICAgICAgICAgQXMgYWx3YXlzLCB3ZSBkbyBvdXIgYmVzdCB0byBhdm9pZCBjaGFuZ2VzIHRoYXQgYnJlYWsgZXhpc3RpbmcKKyAgICAgICAgICBzY3JpcHRzLiBIb3dldmVyLCBDLUtlcm1pdCA4LjAgZG9lcyBpbmNsdWRlIGEgcmF0aGVyIHBlcnZhc2l2ZQorICAgICAgICAgIHN5bnRheCBjaGFuZ2UgdGhhdCBtaWdodCBhbHRlciB0aGUgYmVoYXZpb3Igb2Ygc2NyaXB0cyB0aGF0CisgICAgICAgICAgZGVwZW5kIG9uIHRoZSBwcmV2aW91cyBiZWhhdmlvci4gQXMgZGVzY3JpYmVkIGluIFsxMjddU2VjdGlvbgorICAgICAgICAgIDUsIEMtS2VybWl0IG5vdyBhY2NlcHRzIGRvdWJsZXF1b3RlcyBpbiBtb3N0IGNvbnRleHRzIHdoZXJlIHlvdQorICAgICAgICAgIHByZXZpb3VzbHkgaGFkIHRvIHVzZSBicmFjZXMgdG8gZ3JvdXAgbXVsdGlwbGUgd29yZHMgaW50byBhCisgICAgICAgICAgc2luZ2xlIGZpZWxkLCBvciB0byBmb3JjZSBpbmNsdXNpb24gb2YgbGVhZGluZyBvciB0cmFpbGluZworICAgICAgICAgIGJsYW5rcy4gTW9zdCBub3RpY2VhYmx5LCBpbiBDLUtlcm1pdCA3LjAgYW5kIGVhcmxpZXI6CisKKyAgZWNobyB7dGhpcyBpcyBhIHN0cmluZ30KKworICAgICAgICAgIHdvdWxkIHByaW50OgorCisgIHRoaXMgaXMgYSBzdHJpbmcKKworICAgICAgICAgIHdoZXJlYXM6CisKKyAgZWNobyAidGhpcyBpcyBhIHN0cmluZyIKKworICAgICAgICAgIHByaW50ZWQ6CisKKyAgInRoaXMgaXMgYSBzdHJpbmciCisKKyAgICAgICAgICBJbiBDLUtlcm1pdCA4LjAsIGJvdGggcHJpbnQ6CisKKyAgdGhpcyBpcyBhIHN0cmluZworCisgICAgICAgICAgVG8gZm9yY2UgdGhlIGRvdWJsZXF1b3RlcyB0byBiZSB0cmVhdGVkIGFzIHBhcnQgb2YgdGhlIHN0cmluZywKKyAgICAgICAgICB1c2UgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6CisKKyAgZWNobyB7InRoaXMgaXMgYSBzdHJpbmcifQorICBlY2hvICIidGhpcyBpcyBhIHN0cmluZyIiCisKKyAgICAgICAgICBTaW1pbGFybHksIHRvIGZvcmNlIGJyYWNlcyB0byBiZSB0cmVhdGVkIGFzIHBhcnQgb2YgdGhlIHN0cmluZzoKKworICBlY2hvICJ7dGhpcyBpcyBhIHN0cmluZ30iCisgIGVjaG8ge3t0aGlzIGlzIGEgc3RyaW5nfX0KKworICAgICAgICAgIE90aGVyIGluY29tcGF0aWJpbGl0aWVzOgorCisgICAgICAgICAxLiBVc2luZyB0aGUgU0VUIEhPU1QgY29tbWFuZCB0byBtYWtlIEhUVFAgY29ubmVjdGlvbnMgaXMgbm8KKyAgICAgICAgICAgIGxvbmdlciBzdXBwb3J0ZWQuIEluc3RlYWQsIHVzZSB0aGUgbmV3IEhUVFAgT1BFTiBjb21tYW5kLAorICAgICAgICAgICAgZGVzY3JpYmVkIGluIFsxMjhdU2VjdGlvbiAyLjIuCisKKyAgIEMtS2VybWl0IDcuMSBBbHBoYS4wMSAoOCBEZWNlbWJlciAyMDAwKQorCisgICAgIEl0cyBtYWpvciBuZXcgZmVhdHVyZXMgYXJlIHRob3NlIGxpc3RlZCBpbiB0aGUgWzEyOV1UYWJsZSBvZgorICAgICAgICAgIENvbnRlbnRzOiB0aGUgRlRQIGNsaWVudCwgZmlsZSBzY2FubmluZywgY29tbWFuZCBwYXJzaW5nIGFuZAorICAgICAgICAgIHNjcmlwdGluZyBpbXByb3ZlbWVudHMsIFMtRXhwcmVzc2lvbnMsIGFuZCBzdXBwb3J0IGZvciB0aGUKKyAgICAgICAgICBUZWxuZXQgQ29tIFBvcnQgT3B0aW9uLCBwbHVzIHdpZGVyIGF2YWlsYWJpbGl0eSBvZiB0aGUKKyAgICAgICAgICBLZXJiZXJvcywgU1NML1RMUywgYW5kIFNSUCBzZWN1cml0eSBvcHRpb25zIGZvciBzZWN1cmUgSW50ZXJuZXQKKyAgICAgICAgICBjb25uZWN0aW9ucy4KKworICAgQy1LZXJtaXQgNy4xLjE5OSBBbHBoYS4wMiAoNCBKYW51YXJ5IDIwMDEpCisKKyAgICAgICAgICArIEMtS2VybWl0IG5vdyBhY2NlcHRzIFsxMzBdRlRQLCBURUxORVQsIGFuZCBJS1NEIFVSTHMgYXMgaXRzCisgICAgICAgICAgICBmaXJzdCBjb21tYW5kLWxpbmUgYXJndW1lbnQuCisgICAgICAgICAgKyBDaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGFkZGVkIHRvIHRoZSBGVFAgY2xpZW50IGZvcgorICAgICAgICAgICAgWzEzMV1maWxlbmFtZXMuIAorICAgICAgICAgICsgT3B0aW9uYWwgWzEzMl1zZXR0aW5nIG9mIGRhdGUgb2YgaW5jb21pbmcgZmlsZXMgYnkgRlRQIFtNXUdFVAorICAgICAgICAgICAgZnJvbSB0aGUgc2VydmVyIGRhdGUuCisgICAgICAgICAgKyBbMTMzXUZUUCBDSEVDSyBmaWxlbmFtZSBhZGRlZCB0byBsZXQgRlRQIGNsaWVudCBjaGVjayB0aGUKKyAgICAgICAgICAgIGV4aXN0ZW5jZSBvZiBhIGZpbGUgb24gdGhlIHNlcnZlci4KKyAgICAgICAgICArIFsxMzRdRlRQIEdFVCAvTkFNRUxJU1Q6ZmlsZW5hbWUgYWRkZWQgdG8gZ2V0IGxpc3Qgb2Ygc2VydmVyCisgICAgICAgICAgICBmaWxlbmFtZXMgaW50byBhIGxvY2FsIGZpbGUuCisgICAgICAgICAgKyBbMTM1XUZUUCBbTV1QVVQgL1NFUlZFUi1SRU5BTUU6dGVtcGxhdGUgYWRkZWQgdG8gbWFrZSBzZXJ2ZXIKKyAgICAgICAgICAgIHJlbmFtZSBhIGZpbGUgYXMgaW5kaWNhdGVkIGJ5IHRoZSB0ZW1wbGF0ZSBhZnRlciBpdCBoYXMKKyAgICAgICAgICAgIGFycml2ZWQgY29tcGxldGVseS4KKyAgICAgICAgICArIEZUUCBbTV1HRVQgL1NFUlZFUi1SRU5BTUU6dGVtcGxhdGUgYWRkZWQgdG8gbWFrZSBzZXJ2ZXIKKyAgICAgICAgICAgIHJlbmFtZSBhIGZpbGUgYXMgaW5kaWNhdGVkIGJ5IHRoZSB0ZW1wbGF0ZSBhZnRlciBpdCBoYXMgYmVlbgorICAgICAgICAgICAgc2VudCBjb21wbGV0ZWx5LgorICAgICAgICAgICsgRlRQIFsxMzZdVkRJUkVDVE9SWSBhZGRlZCBmb3IgZ2V0dGluZyB2ZXJib3NlIGRpcmVjdG9yeQorICAgICAgICAgICAgbGlzdGluZ3MgZnJvbSBUT1BTLTIwLgorICAgICAgICAgICsgWzEzN11GVFAgVFlQRSBURU5FWCBhZGRlZCBmb3IgdHJhbnNmZXJyaW5nIDgtYml0IGJpbmFyeSBmaWxlcworICAgICAgICAgICAgd2l0aCBQRFAtMTBzLgorICAgICAgICAgICsgQWRkZWQgWzEzOF1hdXRvbWF0aWMgdGV4dC9iaW5hcnkgbW9kZSBzd2l0Y2hpbmcgZm9yIEZUUAorICAgICAgICAgICAgW01dR0VULCBiYXNlZCBvbiBmaWxlbmFtZSBwYXR0ZXJucyAoZS5nLiAqLnppcCwgKi5neiwgKi5leGUKKyAgICAgICAgICAgIGFyZSBiaW5hcnk7ICoudHh0LCAqLmMgYXJlIHRleHQpLgorICAgICAgICAgICsgWzEzOV1TRVQgU0VORCBJLVBBQ0tFVFMgT0ZGIGFkZGVkIGZvciBjb3Bpbmcgd2l0aCBLZXJtaXQKKyAgICAgICAgICAgIHNlcnZlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBJIHBhY2tldHMuCisgICAgICAgICAgKyBBIG5ldyBvcHRpb24gd2FzIGFkZGVkIHRvIFsxNDBdXGZ3b3JkKCkgYW5kIFxmc3BsaXQoKSBmb3IKKyAgICAgICAgICAgIHBhcnNpbmcgY29tbWEtc2VwYXJhdGVkIGxpc3RzIHRoYXQgbWlnaHQgY29udGFpbiBlbXB0eQorICAgICAgICAgICAgZWxlbWVudHMuCisgICAgICAgICAgKyBCdWcgZml4ZXMgaW5jbHVkaW5nOgorICAgICAgICAgICAgICAgbyB7fSBvciAiIiBjb3VsZCBub3QgYmUgdXNlZCBhcyBleHBlY3RlZCB0byByZXByZXNlbnQgdGhlCisgICAgICAgICAgICAgICAgIGVtcHR5IHN0cmluZy4KKyAgICAgICAgICAgICAgIG8gLC0gb24gYSBsaW5lIGJ5IGl0c2VsZiBpbiBhIG1hY3JvIGRlZmluaXRpb24gY2F1c2VkCisgICAgICAgICAgICAgICAgIHN1YnNlcXVlbnQgc3RhdGVtZW50cyB0byBiZSBza2lwcGVkLgorICAgICAgICAgICAgICAgbyBGVFAgW01dR0VUIGRpZG4ndCB3b3JrIHJpZ2h0IGlmIHBhdGggc2VnbWVudHMgd2VyZQorICAgICAgICAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgZmlsZXNwZWMuCisgICAgICAgICAgICAgICBvIEZUUCBNR0VULCBpZiBpbnRlcnJ1cHRlZCwgZGlkIG5vdCBjbGVhciBpdHMgZmlsZSBsaXN0LgorICAgICAgICAgICAgICAgbyBWYXJpb3VzIHByb2JsZW1zIHdpdGggRlRQIFBVVCAvQVMtTkFNRSB0aGF0IG5vYm9keQorICAgICAgICAgICAgICAgICBub3RpY2VkLgorICAgICAgICAgICAgICAgbyBTb21lIEZUUCBtZXNzYWdlcyBhbmQgZGlzcGxheXMgaW50ZXJmZXJlZCB3aXRoIGVhY2gKKyAgICAgICAgICAgICAgICAgb3RoZXIuCisgICAgICAgICAgICAgICBvIFBhcnNpbmcgb2YgWUVTVEVSREFZLCBUT0RBWSwgYW5kIFRPTU9SUk9XIGluIGRhdGUtdGltZQorICAgICAgICAgICAgICAgICBmaWVsZHMgd2FzIGJyb2tlbi4KKyAgICAgICAgICAgICAgIG8gQXV0b21hdGljIG9sZC10by1uZXcgZGlhbGluZyBkaXJlY3RvcnkgZm9ybWF0IGNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICAgd2FzIGJyb2tlbiBvbiBWTVMuCisgICAgICAgICAgICAgICBvIFZhcmlvdXMgc291cmNlLWNvZGUgcG9ydGFiaWxpdHkgcHJvYmxlbXMgZml4ZWQuCisgICAgICAgICAgKyBJbXByb3ZlbWVudCBvZiB2YXJpb3VzIEhFTFAgYW5kIFNIT1cgbWVzc2FnZXMuCisKKyAgIEMtS2VybWl0IDcuMS4xOTkgQWxwaGEuMDQgKDEgQXByaWwgMjAwMSkKKworICAgICAgICAgICsgQmlnIGNoYW5nZXM6CisgICAgICAgICAgICAgICBvIENoYW5nZWQgZGVmYXVsdCBtb2RlbSB0eXBlIGZyb20gTk9ORSB0byBHRU5FUklDLgorICAgICAgICAgICAgICAgbyBHZW5lcmljIGRpYWxpbmcgbm93IHNlbmRzIG5vIGluaXQgc3RyaW5nIGF0IGFsbC4KKyAgICAgICAgICAgICAgIG8gQ2hhbmdlZCBkZWZhdWx0IHRlcm1pbmFsIGJ5dGVzaXplIGZyb20gNyB0byA4LgorICAgICAgICAgICsgTmV3IGZlYXR1cmVzOgorICAgICAgICAgICAgICAgbyBTRVQgU0VTU0lPTi1MT0cgVElNRVNUQU1QRUQtVEVYVCBmb3IgdGltZXN0YW1wZWQgc2Vzc2lvbgorICAgICAgICAgICAgICAgICBsb2cuCisgICAgICAgICAgKyBOZXcgbW9kZW0gdHlwZXM6CisgICAgICAgICAgICAgICBvIENvbmV4YW50IG1vZGVtIGZhbWlseQorICAgICAgICAgICAgICAgbyBMdWNlbnQgVkVOVVMgY2hpcHNldAorICAgICAgICAgICAgICAgbyBQQ1RlbCBWLjkwIGNoaXBzZXQKKyAgICAgICAgICAgICAgIG8gWm9vbSBWLjkwCisgICAgICAgICAgICAgICBvIFpvb20gVi45MgorICAgICAgICAgICsgRlRQIGNsaWVudDoKKyAgICAgICAgICAgICAgIG8gRlRQIE9QRU4gL1BBU1NJVkUgYW5kIC9BQ1RJVkUgc3dpdGNoZXMgYWRkZWQuCisgICAgICAgICAgICAgICBvIE5vdyB3b3JrcyB3aXRoIHNlcnZlcnMgdGhhdCB0aGF0IGRvbid0IGluY2x1ZGUgcGF0aCBpbgorICAgICAgICAgICAgICAgICBOTFNUIHJlc3BvbnNlLgorICAgICAgICAgICAgICAgbyBGaXhlZCBTRU5EIC9SRUNVUlNJVkUgbm90IHRvIGZvbGxvdyBzeW1saW5rcyAoVU5JWCkuCisgICAgICAgICAgICAgICBvIFNFVCBGVFAgVkVSQk9TRS1NT0RFIGRlZmF1bHQgaXMgbm93IE9GRiBpbnN0ZWFkIG9mIE9OLgorICAgICAgICAgICsgS2VybWl0IHByb3RvY29sOgorICAgICAgICAgICAgICAgbyBGaXhlZCB3aGF0IEkgaG9wZSBpcyB0aGUgbGFzdCAiUmVjZWl2ZSB3aW5kb3cgZnVsbCIKKyAgICAgICAgICAgICAgICAgZXJyb3IuCisgICAgICAgICAgICAgICBvIFNFVCBQUkVGSVhJTkcgb3IgU0VUIENPTlRST0wgUFJFRklYIG5vdyBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICAgICAgIHNldHMgQ0xFQVJDSEFOTkVMIE9GRi4KKyAgICAgICAgICAgICAgIG8gRml4ZWQgaW5jb3JyZWN0IHJlcG9ydCBvZiBudW1iZXIgb2YgZmlsZXMgdHJhbnNmZXJyZWQgYXQKKyAgICAgICAgICAgICAgICAgZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICAgICAgICAgbyBGaXhlZCBTRU5EIC9SRUNVUlNJVkUgbm90IHRvIGZvbGxvdyBzeW1saW5rcyAoVU5JWCkuCisgICAgICAgICAgKyBVTklYOgorICAgICAgICAgICAgICAgbyBIVFRQIGFuZCBzaGFkb3cgcGFzc3dvcmRzIGVuYWJsZWQgZm9yIFNDTyA1LjAuNi4KKyAgICAgICAgICAgICAgIG8gRXZlbiB3aXRoIFNFVCBGSUxFTkFNRVMgQ09OVkVSVEVELCBzcGFjZXMgd2VyZSBzdGlsbAorICAgICAgICAgICAgICAgICBhY2NlcHRlZCBpbiBpbmNvbWluZyBmaWxlbmFtZXM7IG5vdyB0aGV5IGFyZSBjb252ZXJ0ZWQKKyAgICAgICAgICAgICAgICAgdG8gdW5kZXJzY29yZXMuCisgICAgICAgICAgICAgICBvIEFkZGVkIHN1cHBvcnQgZm9yIGNvbXBpbGUtdGltZSBta3RlbXAoKS9ta3N0ZW1wKCkKKyAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLgorICAgICAgICAgICsgVk1TOgorICAgICAgICAgICAgICAgbyBTZXNzaW9uLWxvZyBmb3JtYXQgZm9yIHNjcmlwdGVkIHNlc3Npb25zIGZpeGVkLgorICAgICAgICAgICsgU2NyaXB0aW5nOgorICAgICAgICAgICAgICAgbyBGaXhlZCBcZnJkaXIoKSBub3QgdG8gZm9sbG93IHN5bWxpbmtzIChVTklYKS4KKyAgICAgICAgICAgICAgIG8gRml4ZWQgXGZkYXkoKSBub3QgdG8gZHVtcCBjb3JlIGZvciBkYXRlcyBwcmlvciB0byAxNyBNYXIKKyAgICAgICAgICAgICAgICAgMTg1OC4KKyAgICAgICAgICArIEdlbmVyYWw6CisgICAgICAgICAgICAgICBvICJDbG9zaW5nIGJsYWguLi4iIG1lc3NhZ2UgdXBvbiBleGl0IGNvdWxkIG5vdCBiZQorICAgICAgICAgICAgICAgICBzdXJwcmVzc2VkLgorICAgICAgICAgICAgICAgbyBBZGRlZCAvUEFHRSBhbmQgL05PUEFHRSB0byBERUxFVEUgc3dpdGNoZXMuCisgICAgICAgICAgICAgICBvIEFkZGVkIEdPIHJlc3BvbnNlIGZvciBERUxFVEUgL0FTSyAoZGVsZXRlIGFsbCB0aGUgcmVzdAorICAgICAgICAgICAgICAgICB3aXRob3V0IGFza2luZykuCisgICAgICAgICAgICAgICBvIEFkZGVkIEdPIHJlc3BvbnNlIHRvICJtb3JlPyIgcHJvbXB0IChmb3IgbXVsdGktcGFnZQorICAgICAgICAgICAgICAgICBzY3JlZW4gb3V0cHV0KS4KKyAgICAgICAgICAgICAgIG8gVXBkYXRlZCBIRUxQIHRleHRzLgorCisgICBDLUtlcm1pdCA3LjEuMTk5IEJldGEuMDEgKDEwIE1heSAyMDAxKQorCisgICAgICAgICAgKyBGVFAgY2xpZW50IHZlcmJvc2l0eSBhZGp1c3RtZW50cy4KKyAgICAgICAgICArIEJ1ZyB3aXRoIGdlbmVyaWMgbW9kZW0gZGlhbGluZyBwYXVzaW5nIHNldmVyYWwgc2VjcyBmaXhlZC4KKyAgICAgICAgICArIFNFVCBIT1NUIC9VU0VSOiwgU0VUIExPR0lOIFVTRVJJRCwgZXRjLCBmaXhlZCB3aGVuIGdpdmVuIG5vCisgICAgICAgICAgICB1c2VyIElELgorICAgICAgICAgICsgQSBjb3VwbGUgXHYoZG1fYmxhaCkgZGlhbCBtb2RpZmllciB2YXJpYWJsZXMgYWRkZWQuCisgICAgICAgICAgKyAiLS12ZXJzaW9uIiBjb21tYW5kLWxpbmUgc3dpdGNoIGFkZGVkLgorICAgICAgICAgICsgRml4ZWQgTmV0QlNEIHNlcmlhbC1wb3J0IERUUiBoYW5kbGluZy4KKyAgICAgICAgICArIExvdHMgb2Ygc3ludGF4IGNsZWFudXBzIGZvciBGbGV4ZWxpbnQgYW5kIGdjYyAtV2FsbC4KKyAgICAgICAgICArIEZpeGVkIG1vZGVtLXR5cGUgYWxpYXNlcyB0byBub3QgdGFrZSBwcmVjZWRlbmNlIG92ZXIgcmVhbAorICAgICAgICAgICAgbmFtZXMuCisgICAgICAgICAgKyBGaXhlZCBmdW5ueSB0cmVhdG1lbnQgb2YgZG91YmxlcXVvdGVzIGJ5IEVDSE8gY29tbWFuZC4KKyAgICAgICAgICArIEVuYWJsZWQgU0VUIFNFU1NJT04tTE9HIGZvciBWTVMgYW5kIG90aGVyIG5vbi1VTklYIHBsYXRvcm1zLgorICAgICAgICAgICsgRml4ZWQgY2hhbmdpbmcgZGlyZWN0aW9uIGluIGNvbW1hbmQgaGlzdG9yeSBidWZmZXIuCisgICAgICAgICAgKyBGaXhlZCBoYW5kbGluZyBvZiBJS1NEIFVSTHMuCisgICAgICAgICAgKyBNYWRlIHN1cmUgREVMRVRFIHByaW50cyBhIG1lc3NhZ2UgaWYgaXQgZ290IGFueSBlcnJvcnMuCisKKyAgIEMtS2VybWl0IDguMC4yMDAgQmV0YS4wMiAoMjggSnVuZSAyMDAxKQorCisgICAgICAgICAgKyBNYWpvciB2ZXJzaW9uIG51bWJlciBpbmNyZWFzZWQgZnJvbSA3IHRvIDguCisgICAgICAgICAgKyBbMTQxXVNTSCBjb21tYW5kLgorICAgICAgICAgICsgTW9yZS1jb25zaXN0ZW50IEtlcm1pdCBwcm90b2NvbCBkZWZhdWx0cy4KKyAgICAgICAgICArIENPTk5FQ1QgaWRsZSB0aW1lb3V0IGFuZCBhY3Rpb24gc2VsZWN0aW9uLgorICAgICAgICAgICsgQ09OTkVDVCBzdGF0dXMgdmFyaWFibGUuCisgICAgICAgICAgKyBBIHdheSB0byBhbGxvY2F0ZSBtb3JlIHNwYWNlIGZvciBmaWxlbmFtZSBsaXN0cy4KKyAgICAgICAgICArIFBzZXVkb3Rlcm1pbmFsIGhhbmRsZXIgZml4ZWQgZm9yIGxhdGUtbW9kZWwgTGludXhlcy4KKyAgICAgICAgICArIENvbW1hbmQtbGluZSBvcHRpb24gLWRkIGZvciB0aW1lc3RhbXBlZCBkZWJ1ZyBsb2cuCisgICAgICAgICAgKyBEb3dubG9hZCBkaXJlY3Rvcnkgbm93IHdvcmtzIGZvciBleHRlcm5hbCBwcm90b2NvbHMgdG9vLgorICAgICAgICAgICsgR1JFUCAvQ09VTlQ6dmFyaWFibGUuCisgICAgICAgICAgKyBTRVQgQVRUUklCVVRFIFJFQ09SRC1GT1JNQVQgeyBPRkYsIE9OIH0uCisgICAgICAgICAgKyBCdWcgZml4ZXMuCisKKyAgIEMtS2VybWl0IDguMC4yMDAgQmV0YS4wMyAoOSBTZXAgMjAwMSkKKworICAgICAgICAgICsgWzE0Ml1IVFRQIDEuMSBjb25uZWN0aW9ucyBhbmQgc2NyaXB0aW5nCisgICAgICAgICAgKyBbMTQzXU9OX0NUUkxDIG1hY3JvIGZvciB0cmFwcGluZyBDdHJsLUMgaW4gc2NyaXB0cworICAgICAgICAgICsgWzE0NF1EYXRlLXRpbWUgcGFyc2luZyBpbXByb3ZlbWVudHMsIHRpbWV6b25lcywgY29tcGFyaXNvbiwKKyAgICAgICAgICAgIGFyaXRobWV0aWMKKyAgICAgICAgICArIFsxNDVdUGF0dGVybi1tYXRjaGluZyBpbXByb3ZlbWVudHMKKyAgICAgICAgICArIEZUUCBpbXByb3ZlbWVudHMKKyAgICAgICAgICArIFNFVCBFWElUIEhBTkdVUCB7IE9OLCBPRkYgfQorICAgICAgICAgICsgU0VUIEZJTEUgRU9GIHsgQ1RSTC1aLCBMRU5HVEggfQorICAgICAgICAgICsgQVNLW1FdIC9USU1FT1VUCisgICAgICAgICAgKyBCdWcgZml4ZXMKKyAgICAgICAgICArIE5ldyBwbGF0Zm9ybXMKKworICAgQy1LZXJtaXQgOC4wLjIwMCBCZXRhLjA0ICgxNiBOb3YgMjAwMSkKKworICAgICAgICAgICsgWzE0Nl1OZXcgVW5peCBtYW4gcGFnZQorICAgICAgICAgICsgWzE0N11OZXcgVW5peCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zCisgICAgICAgICAgKyBTRVQgVEVMT1BUIHBvbGljaWVzIGFyZSBub3cgZW5mb3JjZWQgb24gbm9uLVRlbG5ldCBwb3J0cyBpZgorICAgICAgICAgICAgdGhlIHNlcnZlciBiZWdpbnMgVGVsbmV0IG5lZ290aWF0aW9ucy4KKyAgICAgICAgICArIFNFVCBURVJNSU5BTCBJRExFLUFDVElPTiB7IFRFTE5FVC1OT1AsIFRFTE5FVC1BWVQgfS4KKyAgICAgICAgICArIFVVQ1AgbG9ja2ZpbGUgY3JlYXRpb24gcmFjZSBjb25kaXRpb24gZml4ZWQuCisgICAgICAgICAgKyBEaWFsb3V0LCBtb2RlbSBzaWduYWxzLCBoYW5ndXAsIGhhcmR3YXJlIGZsb3cgY29udHJvbCwgZXRjLAorICAgICAgICAgICAgdGVzdGVkIGV4dGVuc2l2ZWx5IG9uIG1hbnkgcGxhdGZvcm1zLCBudW1lcm91cyBwcm9ibGVtcworICAgICAgICAgICAgZml4ZWQuCisgICAgICAgICAgKyBJbXByb3ZlZCBoaW50cyB3aGVuIGRpYWxpbmcgZmFpbHMuCisgICAgICAgICAgKyBTRVQgU1RPUC1CSVRTIDIgY2FuIG5vdyBiZSBnaXZlbiB3aXRob3V0IFNFVCBGTE9XIEhBUkRXQVJFLgorICAgICAgICAgICsgTWFqb3IgaW1wcm92ZW1lbnRzIGluIFJGQyAyMjE3IFRlbG5ldCBDb20tUG9ydCBDb250cm9sLgorICAgICAgICAgICsgSW1wcm92ZWQgYWJpbGl0eSB0byBSRURJQUwgYSBtb2RlbSBzZXJ2ZXIgcG9ydC4KKyAgICAgICAgICArIGtlcm1pdCAtaCBub3cgc2hvd3MgdGhlIGNvbW1hbmQgbmFtZSBpbiB0aGUgdXNhZ2UgdXNhZ2UKKyAgICAgICAgICAgIHN0cmluZy4KKyAgICAgICAgICArIGtlcm1pdCAtaCBub3cgc2hvd3MgQUxMIGNvbW1hbmQtbGluZSBvcHRpb25zLgorICAgICAgICAgICsga2VybWl0IC1zIGJsYWgsIHdoZXJlIGJsYWggaXMgYSBzeW1saW5rLCBub3cgd29ya3MuCisgICAgICAgICAgKyAtLW5vcGVybXMgY29tbWFuZC1saW5lIG9wdGlvbiA9IFNFVCBBVFRSSUJVVEUgUEVSTUlTU0lPTlMKKyAgICAgICAgICAgIE9GRi4KKyAgICAgICAgICArIEhUVFAgYW5kIEhUVFBTIFVSTHMgbm93IHN1cHBvcnRlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICAgICsgQW4gaHR0cCBjb21tYW5kLWxpbmUgcGVyc29uYWxpdHkgaXMgbm93IGF2YWlsYWJsZS4KKyAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGZpbGUgc3RyZWFtbGluZWQgdG8gbG9hZCBmYXN0ZXIsIGFuYWNocm9uaXNtcworICAgICAgICAgICAgcmVtb3ZlZC4KKyAgICAgICAgICArIFVwZGF0ZWQgTkVXUywgSU5UUk8sIEhFTFAgdGV4dCwgU0hPVyBjb21tYW5kcy4gSW4gcGFydGljdWxhciwKKyAgICAgICAgICAgIHNlZSBTSE9XIENPTU0sIEhFTFAgU0VUIExJTkUsIEhFTFAgV0FJVC4KKyAgICAgICAgICArIERhdGUvdGltZSBhcml0aG1ldGljIHJvdXRpbmVzIGNvbnZlcnRlZCBmcm9tIGZsb2F0aW5nLXBvaW50CisgICAgICAgICAgICB0byBpbnRlZ2VyIGFyaXRobWV0aWMgKGludGVybmFsbHkpIGZvciBncmVhdGVyIGFjY3VyYWN5IGFuZAorICAgICAgICAgICAgcG9ydGFiaWxpdHkuCisgICAgICAgICAgKyBRdW90ZWQgc3RyaW5ncyBjb250YWluaW5nIGNvbW1hcyBubyBsb25nZXIgYnJlYWsgbWFjcm8KKyAgICAgICAgICAgIGV4ZWN1dGlvbi4KKyAgICAgICAgICArIER5bmFtaWMgS2VybWl0IGZpbGUtdHJhbnNmZXIgdGltZW91dHMgYXJlIG5vdyBtdWNoIG1vcmUKKyAgICAgICAgICAgIGFnZ3Jlc3NpdmUuCisgICAgICAgICAgKyBOZXcgImhvdCBrZXlzIiB0byB0dXJuIGRlYnVnLmxvZyBvbi9vZmYgZHVyaW5nIGZpbGUgdHJhbnNmZXIuCisgICAgICAgICAgKyBJbXByb3ZlZCBoaW50cyB3aGVuIGZpbGUgdHJhbnNmZXIgZmFpbHMuCisgICAgICAgICAgKyBGVFAgQ0Qgb3JpZW50YXRpb24gbWVzc2FnZXMgYXJlIG5vdyBwcmludGVkLgorICAgICAgICAgICsgLVIgbm93IGFjY2VwdGVkIG9uIHRoZSBGVFAgY29tbWFuZCBsaW5lIHRvIHJlcXVlc3QgUmVjdXJzaW9uLgorICAgICAgICAgICsgLW0gYWxsb3dzIEFjdGl2ZSBvciBQYXNzaXZlIG1vZGUgdG8gYmUgY2hvc2VuIG9uIHRoZSBGVFAKKyAgICAgICAgICAgIGNvbW1hbmQgbGluZS4KKyAgICAgICAgICArIC1kZCBvbiB0aGUgRlRQIGNvbW1hbmQgbGluZSBjcmVhdGVzIGEgdGltZXN0YW1wZWQgZGVidWcubG9nLgorICAgICAgICAgICsgRlRQIGNvbW1hbmQtbGluZSBzZWN1cml0eSBvcHRpb25zIGZpbGxlZCBpbi4KKyAgICAgICAgICArIEltcHJvdmVkIGF1dG9tYXRpYyB0ZXh0L2JpbmFyeSBtb2RlIHN3aXRjaGluZyBmb3IgTUdFVC4KKyAgICAgICAgICArIFJlbW92ZWQgc3B1cmlvdXMgZXJyb3IgbWVzc2FnZXMgdGhhdCBzb21ldGltZXMgb2NjdXIgZHVyaW5nCisgICAgICAgICAgICBNR0VULgorICAgICAgICAgICsgRElSRUNUT1JZLCBHUkVQLCBUWVBFLCBIRUFELCBhbmQgVEFJTCBub3cgaGF2ZSBhIC9PVVRQVVQ6ZmlsZQorICAgICAgICAgICAgb3B0aW9uLgorICAgICAgICAgICsgVFlQRSAvTlVNQkVSIGFkZHMgbGluZSBudW1iZXJzLgorICAgICAgICAgICsgQ0FUID0gVFlQRSAvTk9QQUdFOyBNT1JFID0gVFlQRSAvUEFHRS4KKyAgICAgICAgICArIEdFVE9LID8taGVscCBmaXhlZC4KKyAgICAgICAgICArIFx2KHRpbWVzdGFtcCkgKD0gIlx2KG5kYXRlKSBcdih0aW1lKSIpCisgICAgICAgICAgKyBcdihob3VyKSAoaG91ciBvZiB0aGUgZGF5LCAwLTIzKQorICAgICAgICAgICsgXGZ1bml4MmRvc3BhdGgoKSBjb252ZXJ0cyBhIFVOSVggcGF0aCAoLykgdG8gYSBET1Mgb25lIChcKS4KKyAgICAgICAgICArIFxmZG9zMnVuaXhwYXRoKCkgY29udmVydHMgYSBET1MgKFdpbmRvd3MsIE9TLzIpIHBhdGggdG8gYQorICAgICAgICAgICAgVU5JWCBvbmUuCisgICAgICAgICAgKyBcZmtleXdvcmR2YWwoKSBwYXJzZXMgbmFtZT12YWx1ZSBwYWlyLCBhbGxvd3MgbWFjcm8ga2V5d29yZAorICAgICAgICAgICAgcGFyYW1ldGVycy4KKyAgICAgICAgICArIFdlIG5vdyBtYWtlIGV2ZXJ5IGF0dGVtcHQgdG8gbm90IHdyaXRlIHBhc3N3b3JkcyB0byB0aGUKKyAgICAgICAgICAgIGRlYnVnLmxvZy4KKyAgICAgICAgICArIE5ldyBDZXJ0ZmljYXRlIEF1dGhvcml0eSBjZXJ0aWZpY2F0ZXMgZmlsZSwgaW5jbHVkZXMgdGhlCisgICAgICAgICAgICBLZXJtaXQgUHJvamVjdCBhdCBDb2x1bWJpYSBVbml2ZXJzaXR5IHNvIHlvdSBjYW4gYWNjZXNzIG91cgorICAgICAgICAgICAgSUtTRCBzZWN1cmVseS4KKyAgICAgICAgICArIFNlY3VyZSB0YXJnZXRzIGltcHJvdmVkIGFuZCBiZXR0ZXIgZG9jdW1lbnRlZCBpbiBVbml4CisgICAgICAgICAgICBtYWtlZmlsZS4KKyAgICAgICAgICArIEFsbCBMaW51eCAobGliYyBhbmQgZ2xpYmMpIGJ1aWxkcyBjb25zb2xpZGF0ZWQgdW5kZXIgIm1ha2UKKyAgICAgICAgICAgIGxpbnV4Ii4KKyAgICAgICAgICArIEhQLVVYIG1ha2VmaWxlIHRhcmdldHMgbm93IGhhdmUgY29uc2lzdGVudCBuYW1lcy4KKyAgICAgICAgICArIE5ldyBhaXg1MCBhbmQgYWl4NTEgdGFyZ2V0cyBhZGRlZC4KKworICAgQy1LZXJtaXQgOC4wLjIwMCBGaW5hbCAoMTIgRGVjIDIwMDEpCisKKyAgICAgICAgICArIFJlbW90ZS9sb2NhbC1tb2RlIGNvbmZ1c2lvbiBvbiBzb21lIHBsYXRmb3JtcyBpbnRyb2R1Y2VkIGluCisgICAgICAgICAgICBCZXRhLjA0LCBmaXhlZC4KKyAgICAgICAgICArIE1hbnkgb2YgdGhlIG1ha2VmaWxlIHRhcmdldHMgYWRqdXN0ZWQsIG5ldyBvbmVzIGFkZGVkLgorICAgICAgICAgICsgTmV3ICJtYWtlIGluc3RhbGwiIHRhcmdldCBzaG91bGQgcGxlYXNlIG1vc3QgcGVvcGxlLgorICAgICAgICAgICsgTmV3IGNvbW1hbmQ6IFNIT1cgSUtTRC4KKyAgICAgICAgICArIEZUUCBvdmVyIFRMUy4KKyAgICAgICAgICArIExhc3QtbWludXRlIHRvdWNodXBzIHRvIHRleHQgbWVzc2FnZXMsIEhFTFAgdGV4dCwgZXRjLgorICAgICAgICAgICsgRW5hYmxlIG1vZGVtLXNpZ25hbCByZWFkaW5nIGZvciBTQ08gT1NSNSBhbmQgVW5peHdhcmUgNy4KKyAgICAgICAgICArIFNwZWNpYWwgc3VwZXJmYXN0IFRSQU5TTUlUIC9CSU5BUlkgL05PRUNITyAvTk9XQUlUIG1vZGUKKyAgICAgICAgICAgIGFkZGVkLgorICAgICAgICAgICsgRml4ZWQgUEJYIGRpYWxpbmcgaW4gdW5tYXJrZWQtYXJlYS1jb2RlIGNhc2UuCisgICAgICAgICAgKyBJbXByb3ZlZCBTSE9XIENPTU1VTklDQVRJT05TIHRlbGxzIGxvY2tmaWxlIGRpcmVjdG9yeSwKKyAgICAgICAgICAgIHR5cGljYWwgZGlhbG91dCBkZXZpY2UgbmFtZS4KKyAgICAgICAgICArIFNvbWUgRlRQIE9QRU4gY29tbWFuZCBwYXJzaW5nIHByb2JsZW1zIGZpeGVkLgorICAgICAgICAgICsgU29tZSBlcnJvcnMgaW4gZGF0ZSBhcml0aG1ldGljIGZpeGVkLgorICAgICAgICAgICsgTmV3IGNvbW1hbmQ6IFNFVCBURVJNSU5BTCBBVVRPRE9XTkxPQUQgeyAuLi4sIEVSUk9SIHsgU1RPUCwKKyAgICAgICAgICAgIENPTlRJTlVFIH0gfQorICAgICAgICAgICsgTmV3IGNvbW1hbmQ6IEhFTFAgRklSRVdBTEwuCisgICAgICAgICAgKyBTRVQgTU9ERU0gSEFOR1VQLU1FVEhPRCBEVFIgYWRkZWQgYXMgc3lub215bSBmb3IgUlMyMzItU0lHTkFMCisgICAgICAgICAgKyBTdXBwb3J0IGZvciBzZWN1cmUgVVJMIHByb3RvY29scyBhZGRlZDogdGVsbmV0czosIGZ0cHM6LAorICAgICAgICAgICAgaHR0cHM6LgorCisgICBDLUtlcm1pdCA4LjAuMjAxICg4IEZlYiAyMDAyKQorCisgICAgICAgICAgKyBJbnN0YWxsYWJpbGl0eSBhcyBhbiBbMTQ4XVNTSCB2MiBTdWJzeXN0ZW0uCisgICAgICAgICAgKyBbMTQ5XVNFVCBMT0NVUyBjb21tYW5kLgorICAgICAgICAgICsgWzE1MF1MLXZlcnNpb25zIG9mIENELCBESVIsIERFTEVURSwgTUtESVIsIGV0YywgdG8gZm9yY2UKKyAgICAgICAgICAgIGxvY2FsIGV4ZWN1dGlvbi4KKyAgICAgICAgICArIFsxNTFdVVNFUiBhbmQgQUNDT1VOVCBhZGRlZCBhcyBzeW5vbnltcyBmb3IgRlRQIFVTRVIgYW5kIEZUUAorICAgICAgICAgICAgQUNDT1VOVC4KKyAgICAgICAgICArIFsxNTJdU0hPVyBWQVJJQUJMRVMgbm93IGFjY2VwdHMgYSBsaXN0IG9mIHZhcmlhYmxlcy4KKyAgICAgICAgICArIFJ1ZGltZW50YXJ5IHN1cHBvcnQgZm9yIFsxNTNdQ2FsbGVyIElEIHdoZW4gcmVjZWl2aW5nIHBob25lCisgICAgICAgICAgICBjYWxscy4KKyAgICAgICAgICArIFVwL0Rvd24gWzE1NF1BcnJvdy1rZXkgbmF2aWdhdGlvbiBvZiBjb21tYW5kIGhpc3RvcnkgYnVmZmVyLgorICAgICAgICAgICsgWzE1NV1BdXRvbWF0aWMgZXhlY3V0aW9uIG9mIGN1c3RvbWl6YXRpb24gZmlsZSBpZiBpbml0IGZpbGUKKyAgICAgICAgICAgIGlzIG1pc3NpbmcuCisKKyAgIEMtS2VybWl0IDguMC4yMDYgQmV0YS4wMSAoMTEgT2N0IDIwMDIpCisKKyAgICAgICAgTmV3IGNvbW1hbmRzOgorCisgICAgICAgICAgICAgICBvIE9SSUVOVEFUSU9OIGxpc3RzIGxvY2F0aW9uLXJlbGF0ZWQgdmFyaWFibGVzIGFuZCB0aGVpcgorICAgICAgICAgICAgICAgICB2YWx1ZXMuCisgICAgICAgICAgICAgICBvIEtDRCBjaGFuZ2VzIHRvIHNwZWNpYWwgZGlyZWN0b3JpZXMgYnkgdGhlaXIgc3ltYm9saWMKKyAgICAgICAgICAgICAgICAgbmFtZXMgKCJrY2QgPyIgZm9yIGEgbGlzdCkuCisgICAgICAgICAgICAgICBvIFNFVCBDRCBIT01FIHBhdGggdG8gc3BlY2lmeSBob21lIGRpcmVjdG9yeSBmb3IgQ0QgYW5kCisgICAgICAgICAgICAgICAgIEtDRCBjb21tYW5kcy4KKyAgICAgICAgICAgICAgIG8gQ09OVElOVUUgZ2l2ZW4gYXQgdG9wIGxldmVsIGlzIGVxdWl2YWxlbnQgdG8gRU5EIC0tCisgICAgICAgICAgICAgICAgIGhhbmR5IHdoZW4gUFJPTVBUJ2VkIG91dCBvZiBhIHNjcmlwdCwgdG8gY29udGludWUgdGhlCisgICAgICAgICAgICAgICAgIHNjcmlwdC4KKworICAgICAgICBOZXcgc3dpdGNoZXMgb3Igb3BlcmFuZHMgZm9yIGV4aXN0aW5nIGNvbW1hbmRzOgorCisgICAgICAgICAgICAgICBvIEdFVE9LIC9USU1FT1VUCisgICAgICAgICAgICAgICBvIEFTSywgQVNLUSwgR0VUT0sgL1FVSUVUIChzdXBwcmVzc2VzIGVycm9yIG1lc3NhZ2Ugb24KKyAgICAgICAgICAgICAgICAgdGltZW91dCkKKyAgICAgICAgICAgICAgIG8gQ09QWSAvQVBQRU5EIG5vdyBhbGxvd3MgY29uY2F0ZW5hdGluZyBtdWx0aXBsZSBzb3VyY2UKKyAgICAgICAgICAgICAgICAgZmlsZXMgaW50byBvbmUgZGVzdCBmaWxlLgorICAgICAgICAgICAgICAgbyBTRVQgVENQIHsgSFRUUC1QUk9YWSwgU09DS1MtU0VSVkVSIH0gL1VTRVIsIC9QQVNTV09SRC4KKyAgICAgICAgICAgICAgIG8gRElSRUNUT1JZIGNvbW1hbmQgbm93IGFjY2VwdHMgbXVsdGlwbGUgZmlsZXNwZWNzLCBlLmcuCisgICAgICAgICAgICAgICAgICJkaXIgYSBiIGMiLgorCisgICAgICAgIFNFVCBRVUlFVCBPTiBub3cgYWxzbyBhcHBsaWVzIHRvOgorCisgICAgICAgICAgICAgICBvIFNFVCBIT1NUIGNvbm5lY3Rpb24gcHJvZ3Jlc3MgbWVzc2FnZXMuCisgICAgICAgICAgICAgICBvICJQcmVzcyB0aGUgWCBvciBFIGtleSB0byBjYW5jZWwiIGZpbGUtdHJhbnNmZXIgbWVzc2FnZS4KKyAgICAgICAgICAgICAgIG8gUkVNT1RFIENEIHJlc3BvbnNlLgorICAgICAgICAgICAgICAgbyBSRU1PVEUgTE9HSU4gcmVzcG9uc2UuCisKKyAgICAgICAgSW1wcm92ZW1lbnRzIGFuZCBuZXcgZmVhdHVyZXM6CisKKyAgICAgICAgICAgICAgIG8gTnVtZXJvdXMgRlRQIGNsaWVudCBmaXhlcyBhbmQgbmV3IGZlYXR1cmVzLCBsaXN0ZWQKKyAgICAgICAgICAgICAgICAgYmVsb3cuCisgICAgICAgICAgICAgICBvIEMtS2VybWl0LCB3aGVuIGluIHJlbW90ZSBtb2RlIGF0IHRoZSBlbmQgb2YgYSBmaWxlCisgICAgICAgICAgICAgICAgIHRyYW5zZmVyLCBub3cgcHJpbnRzIGEgb25lLWxpbmUgIndoZXJlIiBtZXNzYWdlLiBDb250cm9sCisgICAgICAgICAgICAgICAgIHdpdGggU0VUIFRSQU5TRkVSIFJFUE9SVC4KKyAgICAgICAgICAgICAgIG8gVW5peCBtYWtlZmlsZSAiaW5zdGFsbCIgdGFyZ2V0IG5vdyBjcmVhdGVzIGFuIFVOSU5TVEFMTAorICAgICAgICAgICAgICAgICBzY3JpcHQuCisgICAgICAgICAgICAgICBvIEltcHJvdmVkIG9wZXJhdGlvbiBhbmQgcGVyZm9ybWFuY2Ugb24gUkZDIDIyMTcgVGVsbmV0CisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgbyBJbXByb3ZlZCBDT05ORUNUIChpbnRlcmFjdGl2ZSB0ZXJtaW5hbCBjb25uZWN0aW9uKQorICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS4KKyAgICAgICAgICAgICAgIG8gSEVMUCB0ZXh0IHVwZGF0ZWQgZm9yIG1hbnkgY29tbWFuZHMuCisKKyAgICAgICAgTmV3IG9yIGZpeGVkIG1ha2VmaWxlIHRhcmdldHM6CisKKyAgICAgICAgICAgICAgIG8gU29sYXJpcyA5IChzZXZlcmFsIHZhcmlhdGlvbnMpCisgICAgICAgICAgICAgICBvIENvbmN1cnJlbnQgUG93ZXJNQVgKKyAgICAgICAgICAgICAgIG8gTWFjIE9TIFggMTAuMgorICAgICAgICAgICAgICAgbyBGcmVlQlNEIDEuMAorICAgICAgICAgICAgICAgbyBGcmVlQlNEIDQuNiwgNS4wCisgICAgICAgICAgICAgICBvIEFJWCA1LjIsIDUuMworCisgICAgICAgIEJ1Z3MgZml4ZWQgKGdlbmVyYWwpOgorCisgICAgICAgICAgICAgICBvIEZhaWx1cmUgdG8gcnVuIGluIFZNUyBCYXRjaCBmaXhlZC4KKyAgICAgICAgICAgICAgIG8gTERJUkVDVE9SWSBmaXhlZCB0byBydW4gS2VybWl0J3MgYnVpbHQtaW4gRElSRUNUT1JZCisgICAgICAgICAgICAgICAgIGNvbW1hbmQgcmF0aGVyIHRoYW4gYW4gZXh0ZXJuYWwgb25lLgorICAgICAgICAgICAgICAgbyBGaXhlZCBTb2xhcmlzIGFuZCBvdGhlciBTVk9SUE9TSVggYnVpbGRzIHRvIGZpbmQgb3V0CisgICAgICAgICAgICAgICAgIHRoZWlyIGZ1bGwgaG9zdG5hbWVzIHJhdGhlciB0aGFuIGp1c3QgdGhlICJ1bmFtZSAtbiIKKyAgICAgICAgICAgICAgICAgbmFtZS4KKyAgICAgICAgICAgICAgIG8gRml4ZWQgc29tZSBwcm9ibGVtcyBtYXRjaGluZyBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aAorICAgICAgICAgICAgICAgICAiLiIuCisgICAgICAgICAgICAgICBvIEZpeGVkIHNvbWUgcHJvYmxlbXMgbWF0Y2hpbmcgcGF0dGVybiB0aGF0IGNvbnRhaW4KKyAgICAgICAgICAgICAgICAge2EsYixjfSBsaXN0cy4KKyAgICAgICAgICAgICAgIG8gRml4ZWQgZXJyb25lb3VzIHJlcG9ydGluZyBvZiB0ZXh0LW1vZGUgcmVjZXB0aW9uIGFzCisgICAgICAgICAgICAgICAgIGJpbmFyeSB3aGVuIHNlbmRlciBkaWQgbm90IHJlcG9ydCB0aGUgZmlsZSBzaXplCisgICAgICAgICAgICAgICAgIChjb3NtZXRpYyBvbmx5KS4KKyAgICAgICAgICAgICAgIG8gTWFueSBwcm9ibGVtcyB3aXRoIFNXSVRDSCBzdGF0ZW1lbnRzIGZpeGVkLgorICAgICAgICAgICAgICAgbyBGaXhlZCBTRVQgT1BUSU9OUyBESVJFQ1RPUlkgL0RPVEZJTEVTIHRvIHdvcmsgZm9yIHNlcnZlcgorICAgICAgICAgICAgICAgICB0b28uCisgICAgICAgICAgICAgICBvIEZpeGVkIERFTEVURSB0byBwcmludCBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBmaWxlIHdhcworICAgICAgICAgICAgICAgICBub3QgZm91bmQuCisgICAgICAgICAgICAgICBvIEZpeGVkIFNFVCBDT05UUk9MIFVOUFJFRklYIEFMTCBhbmQgU0VUIFBSRUZJWElORyBOT05FIHRvCisgICAgICAgICAgICAgICAgIGRvIHRoZSBzYW1lIHRoaW5nLgorICAgICAgICAgICAgICAgbyBGaXhlZCBidWdzIGV4ZWN1dGluZyBtYWNyb3MgZnJvbSB3aXRoaW4gdGhlIE9OX0VYSVQKKyAgICAgICAgICAgICAgICAgbWFjcm8uCisgICAgICAgICAgICAgICBvIFxmZGF5KCkgYW5kIFxmbmRheSgpIGZpeGVkIGZvciBkYXRlcyBwcmlvciB0byAxNyBOb3YKKyAgICAgICAgICAgICAgICAgMTg1OC4KKyAgICAgICAgICAgICAgIG8gU2VyaWFsIHNwZWVkLWNoYW5naW5nIGJ1ZyBpbiBMaW51eCBmaXhlZC4KKyAgICAgICAgICAgICAgIG8gIlVuYmFsYW5jZWQgYnJhY2VzIiBzY3JpcHQgcGFyc2luZyBlcnJvcnMgd2hlbiB1c2luZworICAgICAgICAgICAgICAgICBce251bWJlcn0gZml4ZWQuCisgICAgICAgICAgICAgICBvICJpZiBkZWZpbmVkIFx2KG5hbWUpIiBmaXhlZCB0byBiZWhhdmUgYXMgZGVzY3JpYmVkIGluCisgICAgICAgICAgICAgICAgIHRoZSBib29rLgorICAgICAgICAgICAgICAgbyBGaXhlZCBQcm9ibGVtcyBjYXVzZWQgYnkgTE9DQUwgdmFyaWFibGVzIHdob3NlIG5hbWVzIGFyZQorICAgICAgICAgICAgICAgICBsZWZ0IHN1YnN0cmluZ3Mgb2YgbWFjcm8gbmFtZXMuCisgICAgICAgICAgICAgICBvIFRoZSBJTlBVVCBjb21tYW5kIHdhcyBmaXhlZCB0byBob25vciB0aGUgUEFSSVRZIHNldHRpbmcuCisgICAgICAgICAgICAgICBvIEZpeGVkIGJ1ZyB3aXRoIENPUFkgdG8gZXhpc3RpbmcgZmlsZSB0aGF0IGlzIGxvbmdlciB0aGFuCisgICAgICAgICAgICAgICAgIHNvdXJjZSBmaWxlLgorICAgICAgICAgICAgICAgbyBSRUlOUFVUIGNvbW1hbmQgZmFpbGVkIHRvIHN0cmlwIGJyYWNlcy9xdW90ZXMgYXJvdW5kIGl0cworICAgICAgICAgICAgICAgICB0YXJnZXQgc3RyaW5nLgorICAgICAgICAgICAgICAgbyBOZXR3b3JrIGRpcmVjdG9yeSBsb29rdXBzIGRpZG4ndCB3b3JrIGZvciBTU0gKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMuCisgICAgICAgICAgICAgICBvIFJFTU9URSBTRVQgeyBGSUxFLCBUUkFOU0ZFUiB9IENIQVJBQ1RFUi1TRVQgZml4ZWQuCisgICAgICAgICAgICAgICBvIENsb3NlZCBzb21lIGhvbGVzIHdoZXJlYnkgYW4gaW5jb21wbGV0ZWx5IHJlY2VpdmVkIGZpbGUKKyAgICAgICAgICAgICAgICAgd2FzIG5vdCBkZWxldGVkIHdoZW4gU0VUIEZJTEUgSU5DT01QTEVURSBpcyBESVNDQVJELAorICAgICAgICAgICAgICAgICBlLmcuIHdoZW4gdGhlIEtlcm1pdCBpcyBodW5nIHVwIHVwb24uCisgICAgICAgICAgICAgICBvIFNFVCBYRkVSIENIQVJBQ1RFUi1TRVQgVFJBTlNQQVJFTlQgZml4ZWQgdG8gZG8gdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgYXMgU0VUIFhGRVIgVFJBTlNMQVRJT04gT0ZGLgorICAgICAgICAgICAgICAgbyBTRVQgSE9TVCBQVFkgKGUuZy4gU1NIKSBjb25uZWN0aW9uIGZpeGVkIHRvIHBhc3MgYWxvbmcKKyAgICAgICAgICAgICAgICAgd2luZG93LXNpemUgY2hhbmdlcy4KKyAgICAgICAgICAgICAgIG8gQy1LZXJtaXQgc2VhcmNoIHBhdGggZm9yIFRBS0UgZmlsZXMgd2FzIGFjY2lkZW50YWxseQorICAgICAgICAgICAgICAgICBkaXNhYmxlZC4KKworICAgICAgICBGVFAgY2xpZW50IGJ1Z3MgZml4ZWQ6CisKKyAgICAgICAgICAgICAgIG8gQ2hhcmFjdGVyIHNldCB0cmFuc2xhdGlvbiB3YXMgYnJva2VuIG9uIGxpdHRsZS1lbmRpYW4KKyAgICAgICAgICAgICAgICAgKGUuZy4gUEMpIGFyY2hpdGVjdHVyZXMuCisgICAgICAgICAgICAgICBvIEZUUCBQVVQgL1NFUlZFUi1SRU5BTUU6LCAvUkVOQU1FLVRPOiwgL01PVkUtVE86IHN3aXRjaGVzCisgICAgICAgICAgICAgICAgIHdlcmUgc3RpY2t5LgorICAgICAgICAgICAgICAgbyBNYWtlIFNFVCBUUkFOU0ZFUiBNT0RFIE1BTlVBTCBhcHBseSB0byBGVFAuCisgICAgICAgICAgICAgICBvIE1ha2UgU0VUIEZJTEUgSU5DT01QTEVURSB7IEtFRVAsIERJU0NBUkQgfSBhcHBseSB0byBGVFAuCisgICAgICAgICAgICAgICBvIEZUUCBNR0VUIC9VUERBVEUgaGFuZGxlZCBlcXVhbCB0aW1lcyBpbmNvcnJlY3RseS4KKyAgICAgICAgICAgICAgIG8gRlRQIE1HRVQgL1JFQ09WRVIgZml4ZWQgdG8gaWdub3JlIGZpbGUgZGF0ZXMsIHVzZSBvbmx5CisgICAgICAgICAgICAgICAgIHNpemUuCisgICAgICAgICAgICAgICBvIEZUUCBNR0VUIC9SRUNPVkVSIHNvbWV0aW1lcyBkb3dubG9hZGVkIGZpbGVzIGl0IGRpZG4ndAorICAgICAgICAgICAgICAgICBuZWVkIHRvLgorICAgICAgICAgICAgICAgbyBGVFAgZG93bmxvYWRzIHdpdGggVFJBTlNGRVIgRElTUExBWSBCUklFRiBjb3VsZCBnaXZlCisgICAgICAgICAgICAgICAgIG1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZXMuCisgICAgICAgICAgICAgICBvIEZUUCBNR0VUIHRlbXAgZmlsZSBub3QgZGVsZXRlZCBpZiBGVFAgREVCVUcgc2V0IHRvIE9GRgorICAgICAgICAgICAgICAgICBhZnRlciBpdCB3YXMgT04uCisgICAgICAgICAgICAgICBvIExPQ1VTIG5vdCBzd2l0Y2hlZCBiYWNrIHdoZW4gRlRQIGNvbm5lY3Rpb24gaXMgbG9zdC4KKyAgICAgICAgICAgICAgIG8gU2V0IGluY29taW5nIGZpbGUgZGF0ZSBldmVuIGlmIGl0IHdhcyBub3QgY29tcGxldGVseQorICAgICAgICAgICAgICAgICByZWNlaXZlZC4KKyAgICAgICAgICAgICAgIG8gRlRQIE1HRVQgc2VudCBTSVpFIGFuZCBNRFRNIGNvbW1hbmRzIGV2ZW4gd2hlbiBpdCBkaWRuJ3QKKyAgICAgICAgICAgICAgICAgaGF2ZSB0by4KKyAgICAgICAgICAgICAgIG8gRlRQIE1HRVQgc2VudCBTSVpFIGFuZCBNRFRNIGNvbW1hbmRzIGV2ZW4gd2hlbiBpdCBrbmV3CisgICAgICAgICAgICAgICAgIHRoZXkgd291bGRuJ3Qgd29yay4KKyAgICAgICAgICAgICAgIG8gRlRQIE1HRVQgZmFpbGVkIGlmIG5vIGZpbGVzIHdlcmUgc2VsZWN0ZWQgZm9yIGRvd25sb2FkLgorICAgICAgICAgICAgICAgbyBGVFAgTUdFVCBhKiBiKiBjKiB3b3VsZCBmYWlsIHRvIGdldCBhbnkgYyoncyBpZiBubyBiKidzCisgICAgICAgICAgICAgICAgIGV4aXN0ZWQuCisgICAgICAgICAgICAgICBvIEJpZyBwcm9ibGVtcyBjYW5jZWxpbmcgTUdFVCB3aXRoIEN0cmwtQy4KKyAgICAgICAgICAgICAgIG8gU29tZSBleHRyYW5lb3VzIExPQ1VTIGRpYWxvZ3Mgc3F1ZWxjaGVkLgorICAgICAgICAgICAgICAgbyBTb21lIGluY29uc2lzdGVuY2llcyBpbiBTRVQgRlRQIEZJTEVOQU1FUyBBVVRPIGZpeGVkLgorICAgICAgICAgICAgICAgbyBGaXhlZCBmaWxlLWRlc2NyaXB0b3IgcGlsZXVwIGFmdGVyIG11bHRpcGxlIE1HRVRzIHdoZW4KKyAgICAgICAgICAgICAgICAgdXNpbmcgbWtzdGVtcCgpLgorICAgICAgICAgICAgICAgbyBGaXhlZCAibWdldCBmb28iLCB3aGVyZSBmb28gaXMgYSBkaXJlY3RvcnkgbmFtZS4KKworICAgICAgICBGVFAgaW1wcm92ZW1lbnRzOgorCisgICAgICAgICAgICAgICBvIE5ldyBbMTU2XUZUUCBwcm90b2NvbCBmZWF0dXJlcyBhZGRlZCAoRkVBVCwgTUxTRCkuCisgICAgICAgICAgICAgICBvIEZUUCBNR0VUIC9SRUNVUlNJVkUgbm93IHdvcmtzIGFzIGV4cGVjdGVkIGlmIHNlcnZlcgorICAgICAgICAgICAgICAgICBzdXBwb3J0cyBNTFNELgorICAgICAgICAgICAgICAgbyBGVFAgTUdFVCAvREFURVMtRElGRkVSIHRvIGRvd25sb2FkIGlmIGxvY2FsIGFuZCByZW1vdGUKKyAgICAgICAgICAgICAgICAgZmlsZSBkYXRlcyBkaWZmZXIuCisgICAgICAgICAgICAgICBvIEZUUCBEQVRFUyBkZWZhdWx0IGNoYW5nZWQgdG8gT04uCisgICAgICAgICAgICAgICBvIEZUUCBNUFVULCBNR0VUIC9FWENFUFQgbm93IGFsbG93cyB1cCB0byA2NCBwYXR0ZXJucyAodXAKKyAgICAgICAgICAgICAgICAgZnJvbSA4KS4KKyAgICAgICAgICAgICAgIG8gVG9wLWxldmVsIFNJVEUgYW5kIFBBU1NJVkUgY29tbWFuZHMgYWRkZWQgZm9yCisgICAgICAgICAgICAgICAgIGNvbnZlbmllbmNlLgorICAgICAgICAgICAgICAgbyBNR0VUIC9DT0xMSVNJT046QVBQRU5EIC9BUy1OQU1FOm5ld2ZpbGUgKi4qIHB1dHMgYWxsCisgICAgICAgICAgICAgICAgIHJlbW90ZSBmaWxlcyBpbnRvIG9uZSBsb2NhbCBmaWxlLgorICAgICAgICAgICAgICAgbyBTRVQgRlRQIFNFUlZFUi1USU1FLU9GRlNFVCBmb3Igd2hlbiBzZXJ2ZXIgaGFzIHdyb25nCisgICAgICAgICAgICAgICAgIHRpbWV6b25lIHNldC4KKyAgICAgICAgICAgICAgIG8gQWxsb3cgZm9yIGFsdGVybmF0aXZlIHNlcnZlciBpbnRlcnByZXRhdGlvbnMgb2YgW01dTVBVVAorICAgICAgICAgICAgICAgICAvVU5JUVVFLgorICAgICAgICAgICAgICAgbyBTRVQgRlRQIEFOT05PTU9VUy1QQVNTV09SRCBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgIGFub255bW91cyBwYXNzd29yZC4KKyAgICAgICAgICAgICAgIG8gQWxsb3cgIkdFVCAvUkVDVVJTSVZFIHBhdGgvZmlsZSIgdG8gZm9yY2UgbG9jYWwKKyAgICAgICAgICAgICAgICAgc3ViZGlyZWN0b3J5IGNyZWF0aW9uLgorICAgICAgICAgICAgICAgbyBTRVQgRlRQIERJU1BMQVkgaXMgbGlrZSBTRVQgVFJBTlNGRVIgRElTUExBWSBidXQgYXBwbGllcworICAgICAgICAgICAgICAgICBvbmx5IHRvIEZUUC4KKyAgICAgICAgICAgICAgIG8gRlRQIHsgRU5BQkxFLCBESVNBQkxFIH0gbmV3LXByb3RvY29sLWZlYXR1cmUtbmFtZS4KKyAgICAgICAgICAgICAgIG8gRlRQIE1HRVQgL05PRE9URklMRVMuCisgICAgICAgICAgICAgICBvIERlYnVnIGxvZyBub3cgcmVjb3JkcyBGVFAgY29tbWFuZHMgYW5kIHJlc3BvbnNlcyBpbgorICAgICAgICAgICAgICAgICBncmVwLWFibGUgZm9ybWF0LgorCisgICBbIFsxNTddVG9wIF0gWyBbMTU4XUNvbnRlbnRzIF0gWyBbMTU5XUMtS2VybWl0IF0gWyBbMTYwXUtlcm1pdCBIb21lIF0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMS4gRklYRVMgU0lOQ0UgVkVSU0lPTiA3LjAuMTk2IEZpcnN0LCB0aGUgY2hhbmdlcyBmcm9tIDcuMC4xOTYgdG8gNy4wLjE5Ny4uLgorU291cmNlIGFuZCBtYWtlZmlsZSB0d2Vha3MgdG8gZ2V0IHN1Y2Nlc3NmdWwgYnVpbGRzIG9uIHBsYXRmb3JtcyB0aGF0IHdlcmUgbm90CithdmFpbGFibGUgaW4gdGltZSBmb3IgdGhlIDcuMCByZWxlYXNlOgorCisgICAgICogNC4yQlNECisgICAgICogNC4zQlNECisgICAgICogQUlYIDQuMworICAgICAqIEFUJlQgM0IyIGFuZCAzQjIwCisgICAgICogQmVPUyA0LjUKKyAgICAgKiBDTElYCisgICAgICogSW50ZXJhY3RpdmUgVU5JWCBTeXN0ZW0gVi8zODYgUjMuMiBWNC4xLjEKKyAgICAgKiBPUy05LzY4MDAwCisgICAgICogT1NGLzEgMS4zLgorICAgICAqIFBTLzIgQUlYIDEuMi4xCisgICAgICogU0NPIE9TUjUuMC54CisgICAgICogU0NPIFhlbml4IDIuMy40CisgICAgICogU0lOSVggNS40MS9JbnRlbAorICAgICAqIFN0cmF0dXMgRlRYCisgICAgICogU3RyYXR1cyBWT1MKKyAgICAgKiBTdW5PUyA0LjEgd2l0aCBYLjI1CisgICAgICogVWx0cml4IDQuMgorICAgICAqIFVuaXh3YXJlIDIuMAorCisgICBUaGVyZSB3ZXJlIG5vIGZ1bmN0aW9uYWwgY2hhbmdlcyBmcm9tIDE5NiB0byAxOTcuCisKKyAgIEZpeGVzIGFwcGxpZWQgYWZ0ZXIgQy1LZXJtaXQgNy4wLjE5NyB3YXMgcmVsZWFzZWQ6CisKKyAgIFNvdXJjZSBjb2RlOiBCaWcgZmxleGVsaW50IGFuZCAiZ2NjIC1XYWxsIiBhdWRpdCBhbmQgY2xlYW51cC4KKworICAgQ29uZmlndXJhdGlvbjoKKyAgICAgKiBTb2xhcmlzIFJUUy9DVFMgKGhhcmR3YXJlIGZsb3cgY29udHJvbCkgZGlkbid0IHdvcmsuCisgICAgICogQlNESSBSVFMvQ1RTIHdvcmtlZCBvbmx5IGluIG9uZSBkaXJlY3Rpb24uCisgICAgICogRnJlZUJTRCA0LjAgd2l0aCBuY3Vyc2VzIDUuMCBicm9rZSBpbnRlcmFjdGl2ZSBjb21tYW5kIHBhcnNpbmcuCisgICAgICogUU5YLTMyIGJ1aWxkIGxhY2tlZCAtREJJR0JVRk9LIHNvIGNvdWxkbid0IGV4ZWN1dGUgYmlnIG1hY3Jvcy4KKworICAgQ29ubmVjdGlvbnM6CisgICAgICogU0VUIEhPU1QgL1BUWSBkaWRuJ3Qgd29yayBvbiBzb21lIHBsYXRmb3Jtcy4KKyAgICAgKiBCcm9rZW4gU0VUIEhPU1QgL1VTRVI6eHh4IC9QQVNTV09SRDp5eXkgL0FDQ09VTlQ6enp6IHN3aXRjaGVzCisgICAgICAgZml4ZWQuCisgICAgICogVHJhbnNwYXJlbnQgcHJpbnRpbmcgd2FzIGJyb2tlbiBpbiBVbml4LgorICAgICAqIEFOU1dFUiAwICh3YWl0IGZvcmV2ZXIpIGRpZG4ndCB3b3JrLgorICAgICAqIFNvbWUgcHJvYmxlbXMgaW4gTXVsdGl0ZWNoIG1vZGVtIGNvbW1hbmQgc3RyaW5ncy4KKyAgICAgKiBTcHVyaW91cyAiP1NvcnJ5LCBjYW4ndCBjb25kaXRpb24gY29uc29sZSB0ZXJtaW5hbCIgZXJyb3JzLgorICAgICAqIERpc2FibGluZyBtb2RlbSBjb21tYW5kIHN0cmluZ3MgYnkgc2V0dGluZyB0aGVtIHRvIG5vdGhpbmcgYnJva2UKKyAgICAgICBkaWFsaW5nLgorICAgICAqIFNFVCBESUFMIFRJTUVPVVQgdmFsdWUgd2FzIHVzdWFsbHkgaWdub3JlZC4KKyAgICAgKiBTRVQgRElBTCBNRVRIT0QgUFVMU0UgZGlkbid0IHdvcmsuCisgICAgICogQ2VydGFpbiBtb2RlbSBjb21tYW5kcywgaWYgY2hhbmdlZCwgbm90IHJlZnJlc2hlZCBpZiBtb2RlbSB0eXBlCisgICAgICAgY2hhbmdlZC4KKyAgICAgKiBTRVQgU0VTU0lPTi1MT0cgY29tbWFuZCB3YXMgbWlzc2luZyBmcm9tIFZNUy4KKyAgICAgKiBWTVMgc2Vzc2lvbiBsb2cgZm9ybWF0IGZpeGVkIGZvciBzY3JpcHRzLgorICAgICAqIEhBTkdVUCBieSBkcm9wcGluZyBEVFIgZGlkbid0IHdvcmsgaW4gTmV0QlNELgorICAgICAqIFNFVCBGTE9XIC9BVVRPIHZlcnN1cyBTRVQgRkxPVyBjb25mdXNpb24gZml4ZWQuCisgICAgICogU3B1cmlvdXMgc2Vjb25kYXJ5IFNvbGFyaXMgbG9ja2ZpbGUgcmVtb3ZlZC4KKyAgICAgKiBTQ08gT1NSNSBEVFIgT24vT2ZmIGhhbmd1cC4KKyAgICAgKiBVVUNQIGxvY2tmaWxlIHJhY2UgY29uZGl0aW9uLgorCisgICBDb21tYW5kcyBhbmQgc2NyaXB0czoKKyAgICAgKiBNaXNzaW5nIENBVVRJT1VTIGFuZCBGQVNUIGNvbW1hbmRzIHJlc3RvcmVkLgorICAgICAqIEJyb2tlbiBQVFkgY29tbWFuZCBpbiBsYXRlLW1vZGVsIExpbnV4ZXMgZml4ZWQgKEFQSSBjaGFuZ2VkKS4KKyAgICAgKiBGaXhlZCBvZmYtYnktb25lIGVycm9yIGluIGNvbW1hbmQgcmVjYWxsIHdoZW4gc3dpdGNoaW5nIGRpcmVjdGlvbi4KKyAgICAgKiBGaXhlZCByZWNhbGwgb2YgY29tbWFuZHMgdGhhdCBjb250YWluICc/Jy4KKyAgICAgKiBDT1BZIC9TV0FQLUJZVEVTIGRpZG4ndCB3b3JrIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcy4KKyAgICAgKiBWYXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBDT1BZIHN3aXRjaGVzIGRpZG4ndCB3b3JrLgorICAgICAqIFZhcmlvdXMgcHJvYmxlbXMgd2l0aCBDT1BZIG9yIFJFTkFNRSB3aXRoIGEgZGlyZWN0b3J5IG5hbWUgYXMKKyAgICAgICB0YXJnZXQuCisgICAgICogU0hJRlQgZGlkbid0IGRlY3JlbWVudCBcdihhcmdjKSBpZiB1c2VkIHdpdGhpbiBJRiwgRUxTRSwgb3IgU1dJVENICisgICAgICAgYmxvY2suCisgICAgICogU0hJRlQgZGlkbid0IGFmZmVjdCB0aGUgXCUqIHZhcmlhYmxlLgorICAgICAqIERpdmlkZSBieSB6ZXJvIGltcHJvcGVybHkgaGFuZGxlZCBpbiBzb21lIFxmdW5jdGlvbigpcy4KKyAgICAgKiBQcm9ibGVtcyB3aXRoIFJFVFVSTiBmcm9tIHJpZ2h0LXJlY3Vyc2l2ZSBmdW5jdGlvbnMuCisgICAgICogRlNFRUsgL0xJTkUgXCVjIExBU1QgZGlkbid0IHdvcmsgaWYgYWxyZWFkeSBhdCBlbmQuCisgICAgICogU29tZSBidWZmZXIgdnVsbmVyYWJpbGl0aWVzIGFuZCBwb3RlbnRpYWwgbWVtb3J5IGxlYWtzIHdlcmUKKyAgICAgICBkaXNjb3ZlcmVkIGFuZCBmaXhlZC4KKyAgICAgKiBcZnJkaXJlY3RvcnkoKSBmaXhlZCBub3QgdG8gZm9sbG93IHN5bWJvbGljIGxpbmtzLgorICAgICAqIFNFVCBFWElUIFdBUk5JTkcgT0ZGIGZpeGVkIHRvIHdvcmsgd2hlbiBFWElUIGdpdmVuIGluIGEgc2NyaXB0LgorICAgICAqIE1pc3NpbmcgREVMRVRFIGFuZCBNS0RJUiBlcnJvciBtZXNzYWdlIGZpeGVkLgorICAgICAqIFxmZGF5KCkgY29yZSBkdW1wIGZvciBhbmNpZW50IGRhdGVzIGZpeGVkLgorCisgICBGaWxlIHRyYW5zZmVyOgorICAgICAqIFNFTkQgL0NPTU1BTkQgd2FzIGJyb2tlbi4KKyAgICAgKiBDUkVDRUlWRSB3YXMgYnJva2VuIChidXQgUkVDRUlWRSAvQ09NTUFORCB3YXMgT0spLgorICAgICAqIFF1b3Rpbmcgd2lsZGNhcmQgY2hhcnMgaW4gZmlsZW5hbWVzIGRpZG4ndCB3b3JrLgorICAgICAqIFByb2JsZW1zIGNhbmNlbGluZyBzdHJlYW1pbmcgZmlsZSB0cmFuc2ZlcnMgd2l0aCBYIG9yIFouCisgICAgICogUHJvYmxlbXMgc2hpZnRpbmcgYmV0d2VlbiBzdHJlYW1pbmcgYW5kIHdpbmRvd2luZyBmaWxlIHRyYW5zZmVyLgorICAgICAqIE5vbi1GVUxMIGZpbGUtdHJhbnNmZXIgZGlzcGxheXMgZXJyb25lb3VzbHkgc2FpZCBTVFJFQU1JTkcgd2hlbgorICAgICAgIG5vdC4KKyAgICAgKiBBbiBhY3RpdmUgU0VORC1MSVNUIHByZXZlbnRlZCBHRVQgZnJvbSB3b3JraW5nLgorICAgICAqIFNFVCBTRVJWRVIgR0VULVBBVEggaW50ZXJwcmV0YXRpb24gb2YgcmVsYXRpdmUgbmFtZXMgbGlrZSAiLiIgd2FzCisgICAgICAgd3JvbmcuCisgICAgICogVGhlIE1BSUwgY29tbWFuZCB3YXMgYnJva2VuLgorICAgICAqICJrZXJtaXQgLXMgKiIgbWlnaHQgaGF2ZSBza2lwcGVkIHNvbWUgZmlsZXMuCisgICAgICogVHJhbnNhY3Rpb24gbG9nIGVudHJpZXMgd2VyZSBub3QgbWFkZSBmb3IgZXh0ZXJuYWwgcHJvdG9jb2wKKyAgICAgICB0cmFuc2ZlcnMuCisgICAgICogRmlsZSBjb3VudCByZXBvcnQgZml4ZWQgdG8gc2hvdyBudW1iZXIgb2YgZmlsZXMgYWN0dWFsbHkKKyAgICAgICB0cmFuc2ZlcnJlZC4KKyAgICAgKiBGaXhlZCBmaWxlbmFtZSBjb252ZXJzaW9uIHRvIGNvbnZlcnQgc3BhY2VzIHRvIHVuZGVyc2NvcmVzLgorICAgICAqIE1hZGUgU0VUIFBSRUZJWElORyAvIFNFVCBDT05UUk9MIFBSRUZJWCBhbHNvIGFkanVzdCBDTEVBUkNIQU5ORUwuCisgICAgICogTW9yZSAiUmVjZWl2ZSB3aW5kb3cgZnVsbCIgZXJyb3JzIGZpeGVkLgorICAgICAqIEJyb2tlbiB0ZXJtaW5hbCBidWZmZXJpbmcgYWZ0ZXIgY3Vyc2VzIGRpc3BsYXkgaW4gU29sYXJpcyBmaXhlZC4KKyAgICAgKiBTRVQgRklMRSBJTkNPTVBMRVRFIERJU0NBUkQgZGlkIG5vdCB3b3JrIGluIGFsbCBjYXNlcy4KKyAgICAgKiBQYWNrZXQgbG9nIGNoYW5nZWQgdG8gcmVmb3JtYXQgdGhlIHN0YXJ0LW9mLXBhY2tldCBjaGFyYWN0ZXIKKyAgICAgICBwcmludGFibHkuCisgICAgICogRHluYW1pYyB0aW1lb3V0cyBjb3VsZCBncm93IHJpZGljdWxvdXNseSBsYXJnZS4KKworICAgQ2hhcmFjdGVyIHNldHM6CisgICAgICogSGVicmV3LTcgdHJhbnNsYXRpb25zIG1pc3NlZCB0aGUgbGV0dGVyIFRhdi4KKyAgICAgKiBDMSBhcmVhIG9mIENQMTI1MiB3YXMgaWdub3JlZC4KKyAgICAgKiBTRVQgVFJBTlNGRVIgQ0hBUkFDVEVSLVNFVCBUUkFOU1BBUkVOVCBjb3VsZCBnaXZlIGdhcmJhZ2UKKyAgICAgICB0cmFuc2xhdGlvbnMuCisgICAgICogVFJBTlNMQVRFIG1pZ2h0IG5vdCB3b3JrIG9uIExpdHRsZSBFbmRpYW4gYXJjaGl0ZWN0dXJlcy4KKyAgICAgKiBJbnN1ZmZpY2llbnQgcmFuZ2UgY2hlY2tpbmcgaW4gY2VydGFpbiBUUkFOU0xBVEUgb3BlcmF0aW9ucy4KKworICAgVGhlIGZvbGxvd2luZyBidWdzIGluIEMtS2VybWl0IDguMC4yMDAgd2VyZSBmaXhlZCBpbiA4LjAuMjAxOgorCisgICAgICogQW4gb2JzY3VyZSBwYXRoIHRocm91Z2ggdGhlIGNvZGUgY291bGQgY2F1c2UgdGhlIFVuaXggdmVyc2lvbiBvZgorICAgICAgIEMtS2VybWl0IHRvIGR1bXAgY29yZSBkdXJpbmcgaXRzIHN0YXJ0dXAgc2VxdWVuY2UuIFRoaXMgaGFwcGVuZWQKKyAgICAgICB0byBvbmx5IG9uZSBwZXJzb24sIGJ1dCBub3cgaXQncyBmaXhlZC4KKyAgICAgKiBXaGVuIEMtS2VybWl0IDguMCBpcyBpbiBLZXJtaXQgc2VydmVyIG1vZGUgYW5kIHRoZSBjbGllbnQgc2F5cworICAgICAgICJnZXQgYmxhaCIsIHdoZXJlIGJsYWggKG9uIHRoZSBzZXJ2ZXIpIGlzIGEgc3ltbGluayByYXRoZXIgdGhhbiBhCisgICAgICAgcmVhbCBmaWxlLCB0aGUgc2VydmVyIHVucmVhc29uYWJseSByZWZ1c2VkIHRvIHNlbmQgdGhlIGxpbmtlZC10bworICAgICAgIGZpbGUuCisgICAgICogV2hlbiBDLUtlcm1pdCBpcyBhbiBGVFAgY2xpZW50IGFuZCBzYXlzICJnZXQgZm9vL2JhciIgKGkuZS4gYQorICAgICAgIGZpbGVuYW1lIHRoYXQgaW5jbHVkZXMgb25lIG9yIG1vcmUgcGF0aCBzZWdtZW50cyksIGl0IGZhaWxlZCB0bworICAgICAgIGFjY2VwdCB0aGUgaW5jb21pbmcgZmlsZSAodGhpcyBoYXBwZW5lZCBvbmx5IHdpdGggR0VULCBub3QgTUdFVCkuCisgICAgICogQXJyYXkgcmVmZXJlbmNlcyBzaG91bGQgYmUgY2FzZSBpbnNlbnNpdGl2ZSBidXQgb25seSBsb3dlcmNhc2UKKyAgICAgICBhcnJheSBsZXR0ZXJzIHdlcmUgYWNjZXB0ZWQuCisgICAgICogU0hPVyBWQVJJQUJMRVMgZHVtcGVkIGNvcmUgb24gXHYoc2V4cHJlc3Npb24pIGFuZCBcdihzdmFsdWUpLgorICAgICAqIFNwdXJpb3VzIHJlZnVzYWxzIG9mIHJlbW90ZSBkaXJlY3RvcnkgbGlzdGluZ3MgaWYgdGhlIHJlbW90ZQorICAgICAgIHNlcnZlcidzIGRhdGUgd2FzIHNldCBpbiB0aGUgcGFzdC4KKyAgICAgKiBJbiBBSVgsIGFuZCBtYXliZSBlbHNld2hlcmUgdG9vLCBLZXJtaXQncyBDT1BZIGNvbW1hbmQgYWx3YXlzCisgICAgICAgZmFpbGVkIHdpdGggIlNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIHRoZSBzYW1lIGZpbGUiIHdoZW4gdGhlCisgICAgICAgZGVzdGluYXRpb24gZmlsZSBkaWRuJ3QgZXhpc3QuCisgICAgICogVGhlIFZNUyB2ZXJzaW9uIG9mIEMtS2VybWl0IGRpZCBub3Qgd29yayBpbiBCYXRjaCBvciB3aGVuIFNQQVdOJ2QuCisgICAgICAgVG8gY29tcG91bmQgdGhlIHByb2JsZW0sIGl0IGFsc28gcHJldHR5IG11Y2ggaWdub3JlZCB0aGUgLUIgYW5kIC16CisgICAgICAgY29tbWFuZC1saW5lIG9wdGlvbnMsIHdob3NlIHB1cnBvc2UgaXMgdG8gd29yayBhcm91bmQgc3VjaAorICAgICAgIHByb2JsZW1zLgorICAgICAqIEMtS2VybWl0IDguMCBjb3VsZCBub3QgYmUgYnVpbHQgb24gSVJJWCA1LnguCisgICAgICogVGhlIEMtS2VybWl0IDguMCBidWlsZCBmb3IgUU5YNiBzYWlkIGl0IHdhcyBhbiAiKHVua25vd24KKyAgICAgICB2ZXJzaW9uKSIuCisKKyAgIE90aGVyIGZpeGVzIGFyZSBsaXN0ZWQgaW4gdGhlIFsxNjFdcHJldmlvdXMgc2VjdGlvbi4KKworICAgWyBbMTYyXVRvcCBdIFsgWzE2M11Db250ZW50cyBdIFsgWzE2NF1DLUtlcm1pdCBdIFsgWzE2NV1LZXJtaXQgSG9tZSBdCisgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKzIuIFNTSCBBTkQgSFRUUAorCisgIDIuMS4gU1NIIENvbm5lY3Rpb25zCisKKyAgICAgVGhpcyBzZWN0aW9uIGRvZXMgbm90IGFwcGx5IHRvIFsxNjZdS2VybWl0IDk1IDIuMCwgd2hpY2ggaGFzIGl0cworICAgICBvd24gYnVpbHQtaW4gU1NIIGNsaWVudCwgd2hpY2ggaXMgZG9jdW1lbnRlZCBbMTY3XVNFUEFSQVRFTFkuIAorCisgICBPbiBtb3N0IFVOSVggcGxhdGZvcm1zLCBDLUtlcm1pdCBjYW4gbWFrZSBTU0ggKFNlY3VyZSBTSGVsbCkKKyAgIGNvbm5lY3Rpb24gYnkgcnVubmluZyB0aGUgZXh0ZXJuYWwgU1NIIGNvbW1hbmQgb3IgcHJvZ3JhbSB0aHJvdWdoIGl0cworICAgcHNldWRvdGVybWluYWwgaW50ZXJmYWNlLiBUaGUgY29tbWFuZCBpczoKKworICAgU1NIIHRleHQKKyAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gc3RhcnQgdGhlIGV4dGVybmFsIFNTSCBjbGllbnQsIHBhc3NpbmcgdGhlCisgICAgICAgICAgZ2l2ZW4gdGV4dCB0byBpdCBvbiB0aGUgY29tbWFuZCBsaW5lLiBOb3JtYWxseSB0aGUgdGV4dCBpcyBqdXN0CisgICAgICAgICAgdGhlIGhvc3RuYW1lLCBidXQgaXQgY2FuIGJlIGFueXRoaW5nIGVsc2UgdGhhdCBpcyBhY2NlcHRhYmxlIHRvCisgICAgICAgICAgdGhlIHNzaCBjbGllbnQuIElmIHRoZSBjb21tYW5kIHN1Y2NlZWRzLCB0aGUgY29ubmVjdGlvbiBpcyBtYWRlCisgICAgICAgICAgYW5kIEtlcm1pdCBhdXRvbWF0aWNhbGx5IGVudGVycyBDT05ORUNUICh0ZXJtaW5hbCkgbW9kZS4gWW91CisgICAgICAgICAgY2FuIHVzZSB0aGUgU1NIIGNvbW1hbmQgdG8gbWFrZSBhIGNvbm5lY3Rpb24gdG8gYW55IGhvc3QgdGhhdAorICAgICAgICAgIGhhcyBhbiBTU0ggc2VydmVyLgorCisgICBLZXJtaXQncyBTU0ggY29tbWFuZCBnaXZlcyB5b3UgYWxsIHRoZSBmZWF0dXJlcyBvZiBLZXJtaXQgb24gYW4gU1NICisgICBjb25uZWN0aW9uOiBjb21tYW5kIGxhbmd1YWdlLCBmaWxlIHRyYW5zZmVyLCBjaGFyYWN0ZXItc2V0CisgICB0cmFuc2xhdGlvbiwgc2NyaXB0aW5nLCBhbmQgYWxsIHRoZSByZXN0LiBCeSBkZWZhdWx0LCBDLUtlcm1pdCBpbnZva2VzCisgICBTU0ggd2l0aCAiLWUgbm9uZSIsIHdoaWNoIGRpc2FibGVzIHRoZSBzc2ggZXNjYXBlIGNoYXJhY3RlciBhbmQgbWFrZXMKKyAgIHRoZSBjb25uZWN0aW9uIHRyYW5zcGFyZW50IGZvciBwdXJwb3NlcyBvZiBmaWxlIHRyYW5zZmVyLiBZb3UgY2FuLAorICAgaG93ZXZlciwgY2hhbmdlIHRoZSBTU0ggaW52b2NhdGlvbiB0byB3aGF0ZXZlciBlbHNlIHlvdSBtaWdodCBuZWVkIChhbgorICAgZXhwbGljaXQgcGF0aCwgYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBldGMpIHdpdGg6CisKKyAgIFNFVCBTU0ggQ09NTUFORCB0ZXh0CisgICAgICAgICAgU3BlY2lmaWVzIHRoZSBzeXN0ZW0gY29tbWFuZCB0aGF0IEtlcm1pdCdzIFNTSCBjb21tYW5kIHNob3VsZAorICAgICAgICAgIHVzZSB0byBpbnZva2UgdGhlIGV4dGVybmFsIFNTSCBjbGllbnQuIFVzZSB0aGlzIGNvbW1hbmQgdG8KKyAgICAgICAgICBzdXBwbHkgYSBzcGVjaWZpYyBwYXRoIG9yIGFsdGVybmF0aXZlIG5hbWUsIG9yIHRvIGluY2x1ZGUKKyAgICAgICAgICBkaWZmZXJlbnQgb3IgbW9yZSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKworICAgSW4gbW9zdCBjYXNlcywgdGhlc2UgY29ubmVjdGlvbnMgd29yayBxdWl0ZSB3ZWxsLiBUaGV5IGNhbiBiZSBzY3JpcHRlZAorICAgbGlrZSBhbnkgb3RoZXIgY29ubmVjdGlvbiwgYW5kIGZpbGUgdHJhbnNmZXIgZ29lcyBhcyBmYXN0IGFzLCBvcgorICAgZmFzdGVyIHRoYW4sIG9uIGEgcmVndWxhciBUZWxuZXQgY29ubmVjdGlvbi4gSW4gc29tZSBjYXNlcywgaG93ZXZlciwKKyAgIHRoZSB1bmRlcmx5aW5nIHBzZXVkb3Rlcm1pbmFsIGRyaXZlciBpcyBhIGxpbWl0aW5nIGZhY3RvciwgcmVzdWx0aW5nCisgICBpbiBzbG93IG9yIGZhaWxlZCBmaWxlIHRyYW5zZmVycy4gU29tZXRpbWVzIHlvdSBjYW4gd29yayBhcm91bmQgc3VjaAorICAgcHJvYmxlbXMgYnkgcmVkdWNpbmcgdGhlIEtlcm1pdCBwYWNrZXQgbGVuZ3RoLiBOb3RlIHRoYXQgS2VybWl0IGRvZXMKKyAgIG5vdCBjb25zaWRlciBTU0ggY29ubmVjdGlvbnMgdG8gYmUgcmVsaWFibGUsIHNvIGl0IGRvZXMgbm90IG9mZmVyIHRvCisgICB1c2Ugc3RyZWFtaW5nIGluIEtlcm1pdCBwcm90b2NvbCB0cmFuc2ZlcnMgKGJ1dCB5b3UgY2FuIGZvcmNlIGl0IHdpdGgKKyAgIFNFVCBSRUxJQUJMRSBvciBTRVQgU1RSRUFNSU5HIGlmIHlvdSB3aXNoKS4KKworICAgVGhlIFNTSCBjb21tYW5kIGlzIGxpa2UgdGhlIFRFTE5FVCBjb21tYW5kOiBpdCBlbnRlcnMgQ09OTkVDVCBtb2RlCisgICBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgbWFkZS4gVGhlcmVmb3JlLCB0byBzY3JpcHQgYW4gU1NICisgICBjb25uZWN0aW9uLCB1c2U6CisKKyAgc2V0IGhvc3QgL3B0eSBzc2ggLWUgbm9uZSBbIG90aGVyLW9wdGlvbnMgXSBob3N0CisgIGlmIGZhaWwgLi4uCisKKyAgIHRvIG1ha2UgdGhlIGNvbm5lY3Rpb24uCisKKyAgIEhlcmUncyBhIHNlcXVlbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIGNvbm5lY3Rpb24gdG8gYSBnaXZlbgorICAgaG9zdCB1c2luZyBUZWxuZXQgaWYgdGhlIGhvc3QgYWNjZXB0cyBpdCwgb3RoZXJ3aXNlIFNTSDoKKworICBpZiBub3QgZGVmaW5lZCBcJTEgZXhpdCAxIFVzYWdlOiBcJTAgaG9zdAorICBzZXQgcXVpZXQgb24KKyAgc2V0IGhvc3QgXCUxIDIzIC90ZWxuZXQKKyAgaWYgZmFpbCB7CisgICAgICBzZXQgaG9zdCAvcHR5IHNzaCAtbCBcbSh1c2VyKSAtZSBub25lIFwlMQorICAgICAgaWYgZmFpbCBleGl0IDEgXCUxOiBUZWxuZXQgYW5kIFNTSCBib3RoIGZhaWwKKyAgICAgIGVjaG8gU1NIIGNvbm5lY3Rpb24gdG8gXCUxIHN1Y2Nlc3NmdWwKKyAgfSBlbHNlIHsKKyAgICAgIGVjaG8gVGVsbmV0IGNvbm5lY3Rpb24gdG8gXCUxIHN1Y2Nlc3NmdWwKKyAgfQorCisgICBJbiBTU0ggdjIsIGl0IGlzIHBvc3NpYmxlIHRvIG1ha2UgYW4gU1NIIGNvbm5lY3Rpb24gZGlyZWN0IHRvIGEgS2VybWl0CisgICBzZXJ2ZXIgc3lzdGVtIGlmIHRoZSBob3N0IGFkbWluaXN0cmF0b3IgaGFzIGNvbmZpZ3VyZWQgdGhlIFNTSCBzZXJ2ZXIKKyAgIHRvIGFsbG93IHRoaXM7IFsxNjhdQ0xJQ0sgSEVSRSBmb3IgZGV0YWlscy4KKworICAgU2luY2UgS2VybWl0IHVzZXMgZXh0ZXJuYWwgc3NoIGNsaWVudCBzb2Z0d2FyZSwgYW5kIHNpbmNlIHRoZXJlIGFyZQorICAgZGlmZmVyZW50IHNzaCBjbGllbnRzIChhbmQgZGlmZmVyZW50IHJlbGVhc2VzIG9mIGVhY2ggb25lKSwgdGhlIGV4YWN0CisgICBjb21tYW5kIHRvIGJlIHVzZWQgdG8gbWFrZSBhbiBTU0gvS2VybWl0IGNvbm5lY3Rpb24gY2FuIHZhcnkuIEhlcmUgaXMKKyAgIHRoZSBjb21tYW5kIGZvciB0aGUgT3BlblNTSCAzLjAuMnAxIGNsaWVudDoKKworc2V0IGhvc3QgL3BpcGUgc3NoIC1lIG5vbmUgWyAtbCB1c2VybmFtZSBdIC1UIC1zIGhvc3RuYW1lIGtlcm1pdAorCisgICBFeGFtcGxlOgorCitzZXQgaG9zdCAvcGlwZSBzc2ggLWUgbm9uZSAtbCBvbGdhIC1UIC1zIGhxLnh5emNvcnAuY29tIGtlcm1pdAorCisgICBUaGUgU1NIIGNsaWVudCBtaWdodCBvciBtaWdodCBub3QgcHJvbXB0IHlvdSBmb3IgYSBwYXNzd29yZCBvciBvdGhlcgorICAgaW5mb3JtYXRpb24gYmVmb3JlIGl0IG1ha2VzIHRoZSBjb25uZWN0aW9uOyB0aGlzIGRlcGVuZHMgb24geW91ciBTU0gKKyAgIGNvbmZpZ3VyYXRpb24gKHlvdXIgcHVibGljIGFuZCBwcml2YXRlIGtleXMsIHlvdXIgYXV0aG9yaXplZCBob3N0cworICAgZmlsZSwgZXRjKS4gSGVyZSdzIGEgYnJpZWYgc3lub3BzaXMgb2YgdGhlIE9wZW5TU0ggY2xpZW50IGNvbW1hbmQKKyAgIHN5bnRheCAoIm1hbiBzc2giIGZvciBkZXRhaWxzKToKKworICAgLWUgbm9uZQorICAgICAgICAgIFRoaXMgdGVsbHMgdGhlIFNTSCBjbGllbnQgdG8gdXNlIG5vIGVzY2FwZSBjaGFyYWN0ZXIuIFNpbmNlIHdlCisgICAgICAgICAgd2lsbCBiZSB0cmFuc2ZlcnJpbmcgZmlsZXMgYWNyb3NzIHRoZSBjb25uZWN0aW9uLCB3ZSBkb24ndCB3YW50CisgICAgICAgICAgdGhlIGNvbm5lY3Rpb24gdG8gc3VkZGVubHkgYmxvY2sgYmVjYXVzZSBzb21lIGNoYXJhY3RlciBpbiB0aGUKKyAgICAgICAgICBkYXRhLgorCisgICAtbCB1c2VybmFtZQorICAgICAgICAgIFRoaXMgaXMgdGhlIHVzZXJuYW1lIG9uIHRoZSByZW1vdGUgaG9zdC4gWW91IGNhbiBvbWl0IHRoZSAtbAorICAgICAgICAgIG9wdGlvbiBhbmQgaXRzIGFyZ3VtZW50IGlmIHlvdXIgbG9jYWwgYW5kIHJlbW90ZSB1c2VybmFtZXMgYXJlCisgICAgICAgICAgdGhlIHNhbWUuIElmIHRoZXkgYXJlIGRpZmZlcmVudCwgeW91IG11c3Qgc3VwcGx5IHRoZSByZW1vdGUKKyAgICAgICAgICB1c2VybmFtZS4KKworICAgLVQKKyAgICAgICAgICBUaGlzIHRlbGxzIHRoZSBTU0ggY2xpZW50IHRvIHRlbGwgdGhlIFNTSCBzZXJ2ZXIgbm90IHRvCisgICAgICAgICAgYWxsb2NhdGUgYSBwc2V1ZG90ZXJtaW5hbC4gV2UgYXJlIG5vdCBtYWtpbmcgYSB0ZXJtaW5hbAorICAgICAgICAgIGNvbm5lY3Rpb24sIHdlIGRvbid0IG5lZWQgYSB0ZXJtaW5hbCwgYW5kIGluIGZhY3QgaWYgYSB0ZXJtaW5hbAorICAgICAgICAgIHdlcmUgYWxsb2NhdGVkIG9uIHRoZSByZW1vdGUgZW5kLCB0aGUgY29ubmVjdGlvbiB3b3VsZCBub3QKKyAgICAgICAgICB3b3JrLgorCisgICAtcyAuLi4ga2VybWl0CisgICAgICAgICAgVGhpcyB0ZWxscyB0aGUgU1NIIGNsaWVudCB0byB0ZWxsIHRoZSBTU0ggc2VydmVyIHRvIHN0YXJ0IHRoZQorICAgICAgICAgIHNwZWNpZmllZCBzdWJzeXN0ZW0gKCJrZXJtaXQiKSBvbmNlIHRoZSBjb25uZWN0aW9uIGlzIG1hZGUuIFRoZQorICAgICAgICAgIHN1YnN5c3RlbSBuYW1lIGNvbWVzIGFmdGVyIHRoZSBob3N0bmFtZS4KKworICAgaG9zdG5hbWUKKyAgICAgICAgICBUaGUgSVAgaG9zdCBuYW1lIG9yIGFkZHJlc3Mgb2YgdGhlIGRlc2lyZWQgaG9zdC4KKworICAgWW91IG1pZ2h0IHdhbnQgdG8gaW5jbHVkZSBvdGhlciBvciBhZGRpdGlvbmFsIHNzaCBjb21tYW5kLWxpbmUKKyAgIG9wdGlvbnM7ICJtYW4gc3NoIiBleHBsYWlucyB3aGF0IHRoZXkgYXJlLiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIGZvcgorICAgdGhlIE9wZW5TU0ggMy4wLjJwMSBjbGllbnQ6CisKKyAgIC1vQ2xlYXJBbGxGb3J3YXJkaW5ncyB5ZXMKKyAgIC1vRm9yd2FyZEFnZW50IG5vCisgICAtb0ZvcndhcmRYMTEgbm8KKyAgIC1vRmFsbGJhY2tUb1JzaCBubworICAgICAgICAgIFRoZXNlIGVuc3VyZSB0aGF0IGEgc2VjdXJlIGNvbm5lY3Rpb24gaXMgdXNlZCBhbmQgdGhhdCB0aGUKKyAgICAgICAgICBjb25uZWN0aW9uIHVzZWQgZm9yIGZpbGUgdHJhbnNmZXIgaXMgbm90IGFsc28gdXNlZCBmb3IKKyAgICAgICAgICBmb3J3YXJkaW5nIG90aGVyIHRoaW5ncyB0aGF0IG1pZ2h0IGJlIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgICAgICBzc2hfY29uZmlnIGZpbGUuCisKKyAgIC1vUHJvdG9jb2wgMgorICAgICAgICAgIChpLmUuIFNTSCB2MikgRW5zdXJlcyB0aGF0IHRoZSBuZWdvdGlhdGVkIHByb3RvY29sIHN1cHBvcnRzCisgICAgICAgICAgc3Vic3lzdGVtcy4KKworICAgT25jZSB5b3UgaGF2ZSBhbiBTU0ggY29ubmVjdGlvbiB0byBhIEtlcm1pdCBzZXJ2ZXIsIGl0J3MganVzdCBsaWtlIGFueQorICAgb3RoZXIgY29ubmVjdGlvbiB0byBhIEtlcm1pdCBzZXJ2ZXIgKGFuZCB2ZXJ5IHNpbWlsYXIgdG8gYSBjb25uZWN0aW9uCisgICB0byBhbiBGVFAgc2VydmVyKS4gWW91IGdpdmUgdGhlIGNsaWVudCBmaWxlIHRyYW5zZmVyIGFuZCBtYW5hZ2VtZW50CisgICBjb21tYW5kcyBmb3IgdGhlIHNlcnZlciwgYW5kIHRoZSBzZXJ2ZXIgZXhlY3V0ZXMgdGhlbS4gT2YgY291cnNlIHlvdQorICAgY2FuIGFsc28gZ2l2ZSB0aGUgY2xpZW50IGFueSBvdGhlciBjb21tYW5kcyB5b3Ugd2lzaC4KKworICAgWyBbMTY5XVNTSCBLZXJtaXQgU2VydmVyIFN1YnN5c3RlbSBdIFsgWzE3MF1LZXJtaXQgOTUgQnVpbHQtaW4gU1NICisgICBDbGllbnQgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDIuMi4gSFRUUCBDb25uZWN0aW9ucworCisgICBIeXBlcnRleHQgVHJhbnNmZXIgUHJvdG9jb2wsIG9yIEhUVFAsIGlzIHRoZSBhcHBsaWNhdGlvbiBwcm90b2NvbCBvZgorICAgdGhlIFdvcmxkIFdpZGUgV2ViIChXV1cpLCB1c2VkIGJldHdlZW4gV2ViIGJyb3dzZXJzIChjbGllbnRzKSBhbmQgV2ViCisgICBzZXJ2ZXJzLiBJdCBhbGxvd3MgYSBjbGllbnQgdG8gZ2V0IGZpbGVzIGZyb20gd2Vic2l0ZXMsIHVwbG9hZCBmaWxlcworICAgdG8gd2Vic2l0ZXMsIGRlbGV0ZSBmaWxlcyBmcm9tIHdlYnNpdGVzLCBnZXQgaW5mb3JtYXRpb24gYWJvdXQgd2Vic2l0ZQorICAgZGlyZWN0b3JpZXMgYW5kIGZpbGVzLCBhbmQgaW50ZXJhY3Qgd2l0aCBzZXJ2ZXItc2lkZSBDR0kgc2NyaXB0cy4KKyAgIEMtS2VybWl0IGluY2x1ZGVzIGFuIEhUVFAgY2xpZW50IGNhcGFibGUgb2YgYm90aCBjbGVhci10ZXh0IGFuZCBzZWN1cmUKKyAgIEhUVFAgY29ubmVjdGlvbnMsIHRoYXQgY2FuIGRvIGFsbCB0aGVzZSB0YXNrcyBhbmQgY2FuIGJlIGF1dG9tYXRlZAorICAgdGhyb3VnaCB0aGUgS2VybWl0IHNjcmlwdGluZyBsYW5ndWFnZS4KKworICAgQWx0aG91Z2ggQy1LZXJtaXQgNy4wIGNvdWxkIG1ha2UgSFRUUCBjb25uZWN0aW9ucyB0byBXZWIgc2VydmVycywgaXQKKyAgIGNvdWxkIGRvIHNvIG9ubHkgd2hlbiBubyBvdGhlciBjb25uZWN0aW9uIHdhcyBvcGVuLCBhbmQgdGhlIHByb2NlZHVyZQorICAgd2FzIHNvbWV3aGF0IGF3a3dhcmQuIEMtS2VybWl0IDguMCBpbXByb3ZlcyBtYXR0ZXJzIGJ5OgorCisgICAgICogQWxsb3dpbmcgYW4gSFRUUCBjb25uZWN0aW9uIHRvIGJlIG9wZW4gYXQgdGhlIHNhbWUgdGltZSBhcyBhCisgICAgICAgcmVndWxhciBTRVQgTElORSBvciBTRVQgSE9TVCBjb25uZWN0aW9uLCBhbmQgYWxzbyBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAgYXMgYW4gRlRQIGNvbm5lY3Rpb24gKFsxNzFdU2VjdGlvbiAzKTsKKyAgICAgKiBVcGdyYWRpbmcgdGhlIEhUVFAgcHJvdG9jb2wgbGV2ZWwgZnJvbSAxLjAgdG8gMS4xLCB0aHVzIGFsbG93aW5nCisgICAgICAgZm9yIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMsIGluIHdoaWNoIGEgc2VyaWVzIG9mIGNvbW1hbmRzIGNhbiBiZQorICAgICAgIHNlbnQgb24gdGhlIHNhbWUgY29ubmVjdGlvbiwgcmF0aGVyIHRoYW4gb25seSBvbmUgYXMgaW4gSFRUUCAxLjAKKyAgICAgICAoYW5kIEMtS2VybWl0IDcuMCk7CisgICAgICogUHJvdmlkaW5nIGZvciAib25lLXNob3QiIFVSTC1kcml2ZW4gSFRUUCBvcGVyYXRpb25zIHN1Y2ggYXMgR0VUIG9yCisgICAgICAgUFVULgorICAgICAqIFByb3ZpZGluZyBhIGRpc3RpbmN0IEhUVFAgY29tbWFuZC1saW5lIHBlcnNvbmFsaXR5LgorCisgICBQZXJzaXN0ZW50IEhUVFAgY29ubmVjdGlvbnMgYXJlIG1hbmFnZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorCisgICBIVFRQIFsgc3dpdGNoZXMgXSBPUEVOIFsgc2VjdXJpdHktb3B0aW9ucyBdIGhvc3Qtb3ItdXJsIFsgcG9ydCBdIAorICAgICAgICAgIE9wZW5zIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCAoSVAgaG9zdAorICAgICAgICAgIG5hbWUgb3IgYWRkcmVzcykgb24gdGhlIHNwZWNpZmllZCBwb3J0LiBJZiBhbnkgc3dpdGNoZXMKKyAgICAgICAgICAob3B0aW9ucywgbGlzdGVkIGluIHRoZSBuZXh0IHNlY3Rpb24pIGFyZSBpbmNsdWRlZCwgdGhlaXIKKyAgICAgICAgICB2YWx1ZXMgYXJlIHNhdmVkIGFuZCB1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBIVFRQIGFjdGlvbgorICAgICAgICAgIGNvbW1hbmRzIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24uIElmIG5vIHBvcnQgaXMgc3BlY2lmaWVkLCBIVFRQCisgICAgICAgICAgKDgwKSBpcyB1c2VkLiBBIFVuaWZvcm0gUmVzb3VyY2UgTG9jYXRvciAoVVJMLCBbMTcyXVJGQyAxNzM4KQorICAgICAgICAgIGNhbiBiZSBnaXZlbiBpbnN0ZWFkIG9mIGEgaG9zdG5hbWUgKG9yIGFkZHJlc3MpIGFuZCBwb3J0IChidXQKKyAgICAgICAgICB0aGUgVVJMIGNhbiBub3QgaW5jbHVkZSBhIGRpcmVjdG9yeS9maWxlIHBhdGgpLiBUaGUgc2VjdXJpdHkKKyAgICAgICAgICBvcHRpb25zIGFyZSBleHBsYWluZWQgWzE3M11iZWxvdy4gVGhlIEhUVFAgT1BFTiBjb21tYW5kCisgICAgICAgICAgcmVwbGFjZXMgdGhlIEMtS2VybWl0IDcuMCBTRVQgSE9TVCBob3N0bmFtZSBIVFRQIGNvbW1hbmQsIHdoaWNoCisgICAgICAgICAgbm8gbG9uZ2VyIHdvcmtzIHdpdGggSFRUUCBHRVQgYW5kIHJlbGF0ZWQgY29tbWFuZHMuCisKKyAgIEhUVFAgQ0xPU0UKKyAgICAgICAgICBDbG9zZXMgYW55IG9wZW4gSFRUUCBjb25uZWN0aW9uIGFuZCBjbGVhcnMgYW55IHNhdmVkIHN3aXRjaAorICAgICAgICAgIHZhbHVlcy4KKworICAgQSBVUkwgc3RhcnRzIHdpdGggYSBwcm90b2NvbCBuYW1lLCB3aGljaCBtdXN0IGJlIGh0dHAgb3IgaHR0cHMgaW4gdGhpcworICAgY2FzZTsgb3B0aW9uYWxseSBpbmNsdWRlcyBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZDsgYW5kIG11c3QgY29udGFpbiBhCisgICBob3N0IG5hbWUgb3IgYWRkcmVzczoKKworICBwcm90b2NvbDovL1t1c2VyWy5wYXNzd29yZF1dQGhvc3RbOnBvcnRdW1VSSV0KKworICAgSFRUUCBpcyBIeXBlcnRleHQgVHJhbnNmZXIgUHJvdG9jb2wuIEhUVFBTIGlzIHRoZSBzZWN1cmUgKFNTTC9UTFMpCisgICB2ZXJzaW9uIG9mIEhUVFAuIFRoZSBUQ1Agc2VydmljZSBwb3J0IGlzIGRlcml2ZWQgZnJvbSB0aGUgcHJvdG9jb2wKKyAgIHByZWZpeCAoc28gbm9ybWFsbHkgdGhlICI6cG9ydCIgZmllbGQgaXMgb21pdHRlZCkuIFRodXMgdGhlIFVSTAorICAgcHJvdG9jb2wgbmFtZSBzcGVjaWZpZXMgYSBkZWZhdWx0IFRDUCBzZXJ2aWNlIHBvcnQgYW5kIHRoZSBVUkwgdXNlcgorICAgYW5kIHBhc3N3b3JkIGZpZWxkcyBjYW4gdGFrZSB0aGUgcGxhY2Ugb2YgdGhlIC9VU0VSIGFuZCAvUEFTU1dPUkQKKyAgIHN3aXRjaGVzIChbMTc0XVNlY3Rpb24gMi4yLjEpLiBUaGUgb3B0aW9uYWwgVVJJIGlzIGEgImNvbXBhY3Qgc3RyaW5nCisgICBvZiBjaGFyYWN0ZXJzIGZvciBpZGVudGlmeWluZyBhbiBhYnN0cmFjdCBvciBwaHlzaWNhbCByZXNvdXJjZSIKKyAgIChbMTc1XVJGQyAyMzk2KSwgc3VjaCBhcyBhIGZpbGUuIEl0IG11c3QgYmVnaW4gd2l0aCBhIHNsYXNoICgvKTsgaWYKKyAgIHRoZSBVUkkgaXMgb21pdHRlZCwgIi8iIGlzIHN1cHBsaWVkLiBFeGFtcGxlczoKKworICAgaHR0cCBvcGVuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1LworICAgICAgICAgIEVxdWl2YWxlbnQgdG8gaHR0cCBvcGVuIHd3dy5jb2x1bWJpYS5lZHUgb3IgaHR0cCBvcGVuCisgICAgICAgICAgd3d3LmNvbHVtYmlhLmVkdSBodHRwLgorCisgICBodHRwIG9wZW4gaHR0cHM6Ly9vbGdhLnNlY3JldEB3d3cxLnh5emNvcnAuY29tLworICAgICAgICAgIEVxdWl2YWxlbnQgdG8gaHR0cCAvdXNlcjpvbGdhIC9wYXNzOnNlY3JldCBvcGVuCisgICAgICAgICAgd3d3MS54eXpjb3JwLmNvbSBodHRwcy4KKworICAgUGVyc2lzdGVuY2UgaXMgYWNjb21wbGlzaGVkIHVuaWxhdGVyYWxseSBieSBDLUtlcm1pdCA4LjAuIEFuIEhUVFAgMS4wCisgICBzZXJ2ZXIgY2xvc2VzIHRoZSBjb25uZWN0aW9uIGFmdGVyIGVhY2ggYWN0aW9uLiBBbHRob3VnaCBIVFRQIDEuMQorICAgYWxsb3dzIG11bHRpcGxlIGFjdGlvbnMgb24gdGhlIHNhbWUgY29ubmVjdGlvbiwgYW4gSFRUUCAxLjEgc2VydmVyCisgICB0ZW5kcyB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiBpZiBpdCBpcyBpZGxlIGZvciBtb3JlIHRoYW4gYSBmZXcKKyAgIHNlY29uZHMsIHRvIGRlZmVuZCBpdHNlbGYgYWdhaW5zdCBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2tzLiBCdXQgd2hlbgorICAgeW91IHVzZSBLZXJtaXQncyBIVFRQIE9QRU4gY29tbWFuZCB0byBjcmVhdGUgYSBjb25uZWN0aW9uLCBLZXJtaXQKKyAgIHJlb3BlbnMgaXQgYXV0b21hdGljYWxseSAoaWYgbmVjZXNzYXJ5KSBmb3IgZWFjaCBIVFRQIGFjdGlvbiB1bnRpbCB5b3UKKyAgIGNsb3NlIGl0IHdpdGggSFRUUCBDTE9TRSwgcmVnYXJkbGVzcyBvZiB0aGUgc2VydmVyJ3MgSFRUUCBwcm90b2NvbAorICAgdmVyc2lvbiwgb3IgaG93IG1hbnkgdGltZXMgaXQgY2xvc2VzIHRoZSBjb25uZWN0aW9uLgorCisgICBGaXJld2FsbHMgY2FuIGJlIG5lZ290aWF0ZWQgdGhyb3VnaCBwcm94aWVzIHdpdGggdGhlIGZvbGxvd2luZworICAgY29tbWFuZHM6CisKKyAgIFNFVCBUQ1AgSFRUUC1QUk9YWSBbIGhvc3RbOnBvcnRdIF0KKyAgICAgICAgICBJZiBhIGhvc3QgKGJ5IGhvc3RuYW1lIG9yIElQIGFkZHJlc3MpIGlzIHNwZWNpZmllZCwgS2VybWl0IHVzZXMKKyAgICAgICAgICBpdCBhcyBhIHByb3h5IHNlcnZlciB3aGVuIGF0dGVtcHRpbmcgb3V0Z29pbmcgVENQIGNvbm5lY3Rpb25zCisgICAgICAgICAgLS0gbm90IG9ubHkgSFRUUCBjb25uZWN0aW9ucywgYnV0IGFsbCBUQ1AvSVAgY29ubmVjdGlvbnMsCisgICAgICAgICAgVGVsbmV0IGFuZCBGVFAgaW5jbHVkZWQuIFRoaXMgYWxsb3dzIEtlcm1pdCB0byBhZGFwdCB0byB0aGUKKyAgICAgICAgICBIVFRQIGZpcmV3YWxsIHBlbmV0cmF0aW9uIG1ldGhvZCAoYXMgb3Bwb3NlZCB0byBvdGhlciBtZXRob2RzCisgICAgICAgICAgc3VjaCBhcyBTT0NLUzQpLiBJZiBubyBob3N0bmFtZSBvciBpcC1hZGRyZXNzIGlzIHNwZWNpZmllZCwgYW55CisgICAgICAgICAgcHJldmlvdXNseSBzcGVjaWZpZWQgUHJveHkgc2VydmVyIGlzIHJlbW92ZWQuIElmIG5vIHBvcnQgbnVtYmVyCisgICAgICAgICAgaXMgc3BlY2lmaWVkLCB0aGUgImh0dHAiIHNlcnZpY2UgaXMgdXNlZC4gVGhpcyBjb21tYW5kIG11c3QgYmUKKyAgICAgICAgICBnaXZlbiBiZWZvcmUgdGhlIEhUVFAgT1BFTiBjb21tYW5kIGlmIGEgcHJveHkgaXMgdG8gYmUgdXNlZCBvcgorICAgICAgICAgIGNhbmNlbGVkLgorCisgICBIVFRQIFsgc3dpdGNoZXMgXSBDT05ORUNUIGhvc3RbOnBvcnRdCisgICAgICAgICAgSW5zdHJ1Y3RzIHRoZSBIVFRQIHNlcnZlciB0byBhY3QgYXMgYSBwcm94eSwgZXN0YWJsaXNoaW5nIGEKKyAgICAgICAgICBjb25uZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCAoSVAgaG9zdG5hbWUgb3IgYWRkcmVzcykgb24KKyAgICAgICAgICB0aGUgZ2l2ZW4gcG9ydCAoODAgPSBIVFRQIGJ5IGRlZmF1bHQpIGFuZCB0byByZWRpcmVjdCBhbGwgZGF0YQorICAgICAgICAgIHRyYW5zbWl0dGVkIGJldHdlZW4gS2VybWl0IGFuZCBpdHNlbGYgdG8gdGhlIGdpdmVuIGhvc3QgZm9yIHRoZQorICAgICAgICAgIGxpZmUgb2YgdGhlIGNvbm5lY3Rpb24uIFRoaXMgY29tbWFuZCBpcyB0byBiZSB1c2VkIG9ubHkgZm9yCisgICAgICAgICAgZGVidWdnaW5nIEhUVFAgcHJveHkgY29ubmVjdGlvbnMuIElmIGEgcHJveHkgY29ubmVjdGlvbiBpcworICAgICAgICAgIHJlcXVpcmVkLCBpbnN0cnVjdCBLZXJtaXQgdG8gdXNlIHRoZSBwcm94eSB3aXRoIHRoZSBTRVQgVENQCisgICAgICAgICAgSFRUUC1QUk9YWSBjb21tYW5kLgorCisgICAgMi4yLjEuIEhUVFAgQ29tbWFuZCBTd2l0Y2hlcworCisgICBIVFRQIHN3aXRjaGVzLCBsaWtlIGFsbCBvdGhlciBzd2l0Y2hlcywgYXJlIG9wdGlvbmFsLiBXaGVuIEhUVFAKKyAgIHN3aXRjaGVzIGFyZSBpbmNsdWRlZCB3aXRoIHRoZSBIVFRQIE9QRU4gY29tbWFuZCwgdGhleSBhcHBseQorICAgYXV0b21hdGljYWxseSB0byB0aGlzIGFuZCBhbGwgc3Vic2VxdWVudCBIVFRQIGFjdGlvbnMgKEdFVCwgUFVULCAuLi4pCisgICBvbiB0aGUgc2FtZSBjb25uZWN0aW9uIHVudGlsIGFuIEhUVFAgQ0xPU0UgY29tbWFuZCBpcyBnaXZlbi4gU28gaWYgeW91CisgICBpbmNsdWRlIHN3aXRjaGVzIChvciB0aGUgZXF1aXZhbGVudCBVUkwgZmllbGRzLCBzdWNoIGFzIHVzZXIgYW5kCisgICBwYXNzd29yZCkgaW4gdGhlIEhUVFAgT1BFTiBjb21tYW5kLCB5b3UgY2FuIG9taXQgdGhlbSBmcm9tIHN1YnNlcXVlbnQKKyAgIGNvbW1hbmRzIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24uIElmIHRoZSBjb25uZWN0aW9uIGhhcyBjbG9zZWQgc2luY2UKKyAgIHlvdXIgbGFzdCBjb21tYW5kLCBpdCBpcyBhdXRvbWF0aWNhbGx5IHJlb3BlbmVkIHdpdGggdGhlIHNhbWUgb3B0aW9ucy4KKworICAgSWYgeW91IGluY2x1ZGUgc3dpdGNoZXMgd2l0aCBhbiBIVFRQIGFjdGlvbiBjb21tYW5kIChzdWNoIGFzIEdFVCBvcgorICAgUFVUKSwgdGhleSBhcHBseSBvbmx5IHRvIHRoYXQgY29tbWFuZC4KKworICAgL1VTRVI6bmFtZQorICAgICAgICAgIFRvIGJlIHVzZWQgaW4gY2FzZSBhIHBhZ2UgcmVxdWlyZXMgYSB1c2VybmFtZSBmb3IgYWNjZXNzLiBUaGUKKyAgICAgICAgICB1c2VybmFtZSBpcyBzZW50IHdpdGggcGFnZSByZXF1ZXN0cy4gSWYgaXQgaXMgZ2l2ZW4gd2l0aCB0aGUKKyAgICAgICAgICBPUEVOIGNvbW1hbmQgaXQgaXMgc2F2ZWQgdW50aWwgbmVlZGVkLiBJZiBhIHVzZXJuYW1lIGlzCisgICAgICAgICAgaW5jbHVkZWQgaW4gYSBVUkwsIGl0IG92ZXJyaWRlcyB0aGUgdXNlcm5hbWUgZ2l2ZW4gaW4gdGhlCisgICAgICAgICAgc3dpdGNoLiBDQVVUSU9OOiBVc2VybmFtZSBhbmQgcGFzc3dvcmQgKGFuZCBhbGwgb3RoZXIKKyAgICAgICAgICBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGNyZWRpdCBjYXJkIG51bWJlcnMgYW5kIG90aGVyIG1hdGVyaWFsCisgICAgICAgICAgdGhhdCB5b3UgbWlnaHQgcHJlZmVyIHRvIHByb3RlY3QgZnJvbSBwdWJsaWMgdmlldykgYXJlIHNlbnQKKyAgICAgICAgICBhY3Jvc3MgdGhlIG5ldHdvcmsgaW4gY2xlYXIgdGV4dCBvbiByZWd1bGFyIEhUVFAgY29ubmVjdGlvbnMsCisgICAgICAgICAgYnV0IGF1dGhlbnRpY2F0aW9uIGlzIHBlcmZvcm1lZCBzZWN1cmVseSBvbiBIVFRQUyBjb25uZWN0aW9ucy4KKworICAgL1BBU1NXT1JEOnRleHQKKyAgICAgICAgICBUbyBiZSB1c2VkIGluIGNhc2UgYSB3ZWIgcGFnZSByZXF1aXJlcyBhIHBhc3N3b3JkIGZvciBhY2Nlc3MuCisgICAgICAgICAgVGhlIHBhc3N3b3JkIGlzIHNlbnQgd2l0aCBwYWdlIHJlcXVlc3RzLiBJZiBpdCBpcyBnaXZlbiB3aXRoCisgICAgICAgICAgdGhlIE9QRU4gY29tbWFuZCBpdCBpcyBzYXZlZCB1bnRpbCBuZWVkZWQuIElmIGEgcGFzc3dvcmQgaXMKKyAgICAgICAgICBnaXZlbiBpbiBhIFVSTCwgaXQgb3ZlcnJpZGVzIHRoZSBvbmUgZ2l2ZW4gaGVyZS4gQ0FVVElPTjogKHNhbWUKKyAgICAgICAgICBhcyBmb3IgL1VTRVI6KS4KKworICAgL0FHRU5UOnVzZXItYWdlbnQKKyAgICAgICAgICBJZGVudGlmaWVzIHRoZSBjbGllbnQgdG8gdGhlIHNlcnZlci4gT3ZlcnJpZGVzIHRoZSBkZWZhdWx0CisgICAgICAgICAgYWdlbnQgc3RyaW5nLCB3aGljaCBpcyAiQy1LZXJtaXQiIChmb3IgQy1LZXJtaXQpIG9yICJLZXJtaXQtOTUiCisgICAgICAgICAgKGZvciBLZXJtaXQgOTUpLgorCisgICAvQVJSQVk6YXJyYXktZGVzaWduYXRvcgorICAgICAgICAgIFRlbGxzIEtlcm1pdCB0byBzdG9yZSB0aGUgcmVzcG9uc2UgaGVhZGVycyBpbiB0aGUgZ2l2ZW4gYXJyYXksCisgICAgICAgICAgb25lIGxpbmUgcGVyIGVsZW1lbnQuIFRoZSBhcnJheSBuZWVkIG5vdCBiZSBkZWNsYXJlZCBpbgorICAgICAgICAgIGFkdmFuY2UuIEV4YW1wbGU6IC9hcnJheTomYS4KKworICAgL1RPU0NSRUVOCisgICAgICAgICAgVGVsbHMgS2VybWl0IHRvIGRpc3BsYXkgYW55IHJlc3BvbnNlIHRleHQgb24gdGhlIHNjcmVlbi4gSXQKKyAgICAgICAgICBhcHBsaWVzIGluZGVwZW5kZW50bHkgb2YgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb247IHRodXMgaXQKKyAgICAgICAgICBpcyBwb3NzaWJsZSB0byBoYXZlIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgZ28gdG8gdGhlIHNjcmVlbiwgYQorICAgICAgICAgIGZpbGUsIGJvdGgsIG9yIG5laXRoZXIuCisKKyAgIC9IRUFERVI6aGVhZGVyLWl0ZW0ocykKKyAgICAgICAgICBVc2VkIGZvciBzcGVjaWZ5aW5nIGFueSBvcHRpb25hbCBoZWFkZXJzIHRvIGJlIHNlbnQgd2l0aCBIVFRQCisgICAgICAgICAgcmVxdWVzdHMuCisKKyAgL0hFQURFUjp0YWc6dmFsdWUKKworICAgICAgICAgIFRvIHNlbmQgbW9yZSB0aGFuIG9uZSBoZWFkZXIsIHVzZSBicmFjZXMgZm9yIGdyb3VwaW5nOgorCisgIC9IRUFERVI6e3t0YWc6dmFsdWV9e3RhZzp2YWx1ZX0uLi59CisKKyAgICAgICAgICBGb3IgYSBsaXN0IG9mIHZhbGlkIHRhZ3MgYW5kIHZhbHVlIGZvcm1hdHMgc2VlIFsxNzZdUkZDIDI2MTYsCisgICAgICAgICAgIkh5cGVydGV4dCBUcmFuc2ZlciBQcm90b2NvbCAtLSBIVFRQLzEuMSIuIEEgbWF4aW11bSBvZiBlaWdodAorICAgICAgICAgIGhlYWRlcnMgbWF5IGJlIHNwZWNpZmllZC4KKworICAgIDIuMi4yLiBIVFRQIEFjdGlvbiBDb21tYW5kcworCisgICBIVFRQIGFjdGlvbnMgY2FuIG9jY3VyIHdpdGhpbiBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbiwgb3IgdGhleSBjYW4gYmUKKyAgIHNlbGYtY29udGFpbmVkICgiY29ubmVjdGlvbmxlc3MiKS4gQSBwZXJzaXN0ZW50IEhUVFAgY29ubmVjdGlvbiBiZWdpbnMKKyAgIHdpdGggYW4gSFRUUCBPUEVOIGNvbW1hbmQsIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBIVFRQIGFjdGlvbgorICAgY29tbWFuZHMsIGFuZCBpcyB0ZXJtaW5hdGVkIHdpdGggYW4gSFRUUCBDTE9TRSBjb21tYW5kOgorCisgIGh0dHAgb3BlbiB3d3cuY29sdW1iaWEuZWR1CisgIGlmIGZhaWx1cmUgc3RvcCAxIEhUVFAgT1BFTiBmYWlsZWQ6IFx2KGh0dHBfbWVzc2FnZSkKKyAgaHR0cCBnZXQga2VybWl0L2luZGV4Lmh0bWwKKyAgaWYgZmFpbHVyZSBzdG9wIDEgSFRUUCBHRVQgZmFpbGVkOiBcdihodHRwX21lc3NhZ2UpCisgIChtb3JlIGFjdGlvbnMgcG9zc2libGUgaGVyZS4uLikKKyAgaHR0cCBjbG9zZQorCisgICBBIHNlbGYtY29udGFpbmVkIEhUVFAgYWN0aW9uIG9jY3VycyB3aGVuIGEgVVJMIGlzIGdpdmVuIGluc3RlYWQgb2YgYQorICAgcmVtb3RlIGZpbGUgbmFtZSB0byBhbiBIVFRQIGFjdGlvbiBjb21tYW5kLiBJbiB0aGlzIGNhc2UsIEtlcm1pdCBtYWtlcworICAgdGhlIEhUVFAgY29ubmVjdGlvbiwgdGFrZXMgdGhlIGFjdGlvbiwgYW5kIHRoZW4gY2xvc2VzIHRoZSBjb25uZWN0aW9uLgorICAgSWYgYW4gSFRUUCBjb25uZWN0aW9uIHdhcyBhbHJlYWR5IG9wZW4sIGl0IGlzIGNsb3NlZCBzaWxlbnRseSBhbmQKKyAgIGF1dG9tYXRpY2FsbHkuCisKKyAgaHR0cCBnZXQgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKworICAgS2VybWl0J3MgSFRUUCBhY3Rpb24gY29tbWFuZHMgYXJlIGFzIGZvbGxvd3MuIFN3aXRjaGVzIG1heSBiZSBpbmNsdWRlZAorICAgd2l0aCBhbnkgb2YgdGhlc2UgdG8gb3ZlcnJpZGUgc3dpdGNoIChvciBkZWZhdWx0KSB2YWx1ZXMgZ2l2ZW4gaW4gdGhlCisgICBIVFRQIE9QRU4gY29tbWFuZC4KKworICAgSFRUUCBbIHN3aXRjaGVzIF0gR0VUIHJlbW90ZS1maWxlbmFtZSBbIGxvY2FsLWZpbGVuYW1lIF0KKyAgICAgICAgICBSZXRyaWV2ZXMgdGhlIG5hbWVkIGZpbGUgZnJvbSB0aGUgc2VydmVyIHNwZWNpZmllZCBpbiB0aGUgbW9zdAorICAgICAgICAgIHJlY2VudCBIVFRQIE9QRU4gY29tbWFuZCBmb3Igd2hpY2ggYSBjb3JyZXNwb25kaW5nIEhUVFAgQ0xPU0UKKyAgICAgICAgICBjb21tYW5kIGhhcyBub3QgYmVlbiBnaXZlbi4gVGhlIGZpbGVuYW1lIG1heSBub3QgaW5jbHVkZQorICAgICAgICAgIHdpbGRjYXJkcyAoSFRUUCBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHRoZW0pLiBJZiBubyBIVFRQCisgICAgICAgICAgT1BFTiBjb21tYW5kIGlzIGluIGVmZmVjdCwgdGhpcyBmb3JtIG9mIHRoZSBIVFRQIEdFVCBjb21tYW5kCisgICAgICAgICAgZmFpbHMuIFRoZSBkZWZhdWx0IGxvY2FsIGZpbGVuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSByZW1vdGUKKyAgICAgICAgICBuYW1lLCBidXQgd2l0aCBhbnkgcGF0aG5hbWUgc3RyaXBwZWQuIEZvciBleGFtcGxlLCB0aGUgY29tbWFuZAorICAgICAgICAgIGh0dHAgZ2V0IGtlcm1pdC9pbmRleC5odG1sIHN0b3JlcyB0aGUgZmlsZSBpbiB0aGUgY3VycmVudCBsb2NhbAorICAgICAgICAgIGRpcmVjdG9yeSBhcyBpbmRleC5odG1sLiBJZiB0aGUgL0hFQURFUlM6IHN3aXRjaCBpcyBpbmNsdWRlZCwKKyAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSBpcyBhbHNvIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICAgICAgYXJyYXkgKGV4cGxhaW5lZCBpbiBbMTc3XVNlY3Rpb24gMi4yLjMpLiBBbGwgZmlsZXMgYXJlCisgICAgICAgICAgdHJhbnNmZXJyZWQgaW4gYmluYXJ5IG1vZGUuIEhUVFAgZG9lcyBub3QgcHJvdmlkZSBmb3IKKyAgICAgICAgICByZWNvcmQtZm9ybWF0IG9yIGNoYXJhY3Rlci1zZXQgY29udmVyc2lvbi4KKworICAgSFRUUCBbIHN3aXRjaGVzIF0gR0VUIHVybCBbIGxvY2FsLWZpbGVuYW1lIF0KKyAgICAgICAgICBXaGVuIEhUVFAgR0VUIGlzIGdpdmVuIGEgVVJMIHJhdGhlciB0aGFuIGEgZmlsZW5hbWUsIEtlcm1pdAorICAgICAgICAgIG9wZW5zIGEgY29ubmVjdGlvbiB0byB0aGUgZGVzaWduYXRlZCBzZXJ2ZXIgKGNsb3NpbmcgYW55CisgICAgICAgICAgcHJldmlvdXNseSBvcGVuIEhUVFAgY29ubmVjdGlvbiksIGdldHMgdGhlIGZpbGUsIGFuZCB0aGVuCisgICAgICAgICAgY2xvc2VzIHRoZSBjb25uZWN0aW9uLiBJZiB0aGUgVVJMIGRvZXMgbm90IGluY2x1ZGUgYSBmaWxlbmFtZSwKKyAgICAgICAgICBpbmRleC5odG1sIGlzIHN1cHBsaWVkLiBUaGlzIGlzIHRoZSBzZWxmLWNvbnRhaW5lZCBvbmUtc3RlcAorICAgICAgICAgICJjb25uZWN0aW9ubGVzcyIgbWV0aG9kIGZvciBnZXR0aW5nIGEgZmlsZSBmcm9tIGEgV2ViIHNlcnZlci4KKyAgICAgICAgICBUaGUgZGF0YSBpcyBub3QgaW50ZXJwcmV0ZWQ7IEhUVFAgR0VUIGlzIGxpa2UgImx5bnggLXNvdXJjZSIKKyAgICAgICAgICByYXRoZXIgdGhhbiAibHlueCAtZHVtcCIuCisKKyAgIEluIHRoZSByZW1haW5pbmcgSFRUUCBhY3Rpb24gY29tbWFuZHMsIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGEKKyAgIHJlbW90ZSBmaWxlbmFtZSBhbmQgYSBVUkwgYXJlIHRoZSBzYW1lIGFzIGluIHRoZSBIVFRQIEdFVCBjb21tYW5kLgorCisgICBIVFRQIFsgc3dpdGNoZXMgXSBIRUFEIHJlbW90ZS1maWxlbmFtZS1vci11cmwgWyBsb2NhbC1maWxlbmFtZSBdCisgICAgICAgICAgTGlrZSBHRVQgZXhjZXB0IHdpdGhvdXQgYWN0dWFsbHkgZ2V0dGluZyB0aGUgZmlsZTsgaW5zdGVhZCBpdAorICAgICAgICAgIHJldHJpZXZlcyBvbmx5IHRoZSBoZWFkZXJzLiBJZiB0aGUgL0FSUkFZOiBvciAvVE9TQ1JFRU4gc3dpdGNoCisgICAgICAgICAgaXMgaW5jbHVkZWQsIHRoZXJlIGlzIG5vIGRlZmF1bHQgbG9jYWwgb3V0cHV0IGZpbGVuYW1lIGJ1dCB5b3UKKyAgICAgICAgICBjYW4gc3RpbGwgc3BlY2lmeSBvbmUuIElmIG5laXRoZXIgb2YgdGhlc2Ugc3dpdGNoZXMgaXMKKyAgICAgICAgICBpbmNsdWRlZCwgdGhlIGRlZmF1bHQgbG9jYWwgZmlsZW5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHJlbW90ZQorICAgICAgICAgIGZpbGVuYW1lLCBidXQgd2l0aCBhbnkgcGF0aCBzdHJpcHBlZCBhbmQgd2l0aCAiLmhlYWQiIGFwcGVuZGVkLgorICAgICAgICAgIFRoZSBIRUFEIGNvbW1hbmQgY2FuIGJlIHVzZWQgaW4gYSBzY3JpcHQgd2l0aCB0aGUgL0FSUkFZOgorICAgICAgICAgIHN3aXRjaCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIHRvCisgICAgICAgICAgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJlc291cmNlIHNob3VsZCBhY3R1YWxseSBiZSByZXRyaWV2ZWQKKyAgICAgICAgICB3aXRoIGEgc3Vic2VxdWVudCBHRVQgcmVxdWVzdC4KKworICAgSFRUUCBbIHN3aXRjaGVzIF0gSU5ERVggcmVtb3RlLWRpcmVjdG9yeS1vci11cmwgWyBsb2NhbC1maWxlbmFtZSBdCisgICAgICAgICAgQXNrcyB0aGUgc2VydmVyIHRvIHNlbmQgYSBsaXN0aW5nIG9mIHRoZSBmaWxlcyBpbiB0aGUgZ2l2ZW4KKyAgICAgICAgICBzZXJ2ZXIgZGlyZWN0b3J5LiBUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBieSBtb3N0IFdlYgorICAgICAgICAgIHNlcnZlcnMuIEV2ZW4gd2hlbiBpdCBpcyBzdXBwb3J0ZWQsIHRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvcm1hdAorICAgICAgICAgIGZvciB0aGUgbGlzdGluZy4KKworICAgSFRUUCBbIHN3aXRjaGVzIF0gUE9TVCBbIC9NSU1FLVRZUEU6dHlwZSBdIHNvdXJjZS1maWxlCisgICAgICAgICAgcmVtb3RlLXBhdGgtb3ItdXJsIFsgcmVzdWx0LWZpbGUgXQorICAgICAgICAgIFNlbmRzIGRhdGEgdG8gYSBwcm9jZXNzIHJ1bm5pbmcgb24gdGhlIHJlbW90ZSBob3N0OyB0aGUgcmVzdWx0CisgICAgICAgICAgaXMgdXN1YWxseSBhbiBIVE1MIGZpbGUgYnV0IGNvdWxkIGJlIGFueXRoaW5nLiBUaGUgZGF0YSB0byBiZQorICAgICAgICAgIHBvc3RlZCBtdXN0IGJlIHJlYWQgZnJvbSBhIGxvY2FsIGZpbGUgKHRoZSBzb3VyY2UtZmlsZSkuIElmIGEKKyAgICAgICAgICByZXN1bHQgZmlsZSBpcyBzcGVjaWZpZWQsIEtlcm1pdCBzdG9yZXMgdGhlIHNlcnZlcidzIHJlc3BvbnNlCisgICAgICAgICAgaW4gaXQuCisKKyAgIEhUVFAgWyBzd2l0Y2hlcyBdIFBVVCBbIE1JTUUtVFlQRTp0eXBlIF0gbG9jYWwtZmlsZSBbCisgICAgICAgICAgcmVtb3RlLWZpbGUtb3ItdXJsIFsgcmVzdWx0LWZpbGUgXSBdCisgICAgICAgICAgVXBsb2FkcyBhIGxvY2FsIGZpbGUgdG8gdGhlIHNlcnZlci4gT25seSB0aGUgbmFtZSBvZiBhIHNpbmdsZQorICAgICAgICAgIGZpbGUgY2FuIGJlIGdpdmVuOyB3aWxkY2FyZHMgKGFuZCBncm91cCB0cmFuc2ZlcnMpIGFyZSBub3QKKyAgICAgICAgICBzdXBwb3J0ZWQgYnkgSFRUUCBwcm90b2NvbC4gSWYgbm8gcmVtb3RlIGZpbGVuYW1lIGlzIGdpdmVuLCB0aGUKKyAgICAgICAgICBmaWxlIGlzIHNlbnQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBsb2NhbCBmaWxlLCBidXQgd2l0aCBhbnkKKyAgICAgICAgICBwYXRobmFtZSBzdHJpcHBlZC4KKworICAgSFRUUCBbIHN3aXRjaGVzIF0gREVMRVRFIHJlbW90ZS1maWxlLW9yLXVybCBbIGxvY2FsLXJlc3VsdC1maWxlIF0KKyAgICAgICAgICBBc2tzIHRoZSBzZXJ2ZXIgdG8gZGVsZXRlIHRoZSBzcGVjaWZpZWQgc2luZ2xlIGZpbGUuIElmIGEKKyAgICAgICAgICByZXN1bHQgZmlsZSBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgY29udGFpbiBhbnkgcmVzcG9uc2UgZGF0YQorICAgICAgICAgIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIuCisKKyAgIE5vdGUgdGhlIGxpbWl0YXRpb25zIG9mIEhUVFAgcHJvdG9jb2wgY29tcGFyZWQgdG8gKHNheSkgRlRQIG9yIEtlcm1pdC4KKyAgIFRoZXJlIGlzIG5vIGNvbW1hbmQgZm9yIGNoYW5naW5nIGRpcmVjdG9yaWVzLCBubyBzdGFuZGFyZCB3YXkgdG8gZ2V0CisgICBmaWxlIG9yIGRpcmVjdG9yeSBsaXN0cywgbm8gd2F5IHRvIHRyYW5zZmVyIGZpbGUgZ3JvdXBzIGJ5IHVzaW5nCisgICB3aWxkY2FyZCBub3RhdGlvbiwgZXRjLCBhbmQgdGhlcmVmb3JlIG5vIGdvb2Qgd2F5IHRvIChzYXkpIGZldGNoIGFsbAorICAgcGFnZXMsIGRlc2NlbmQgdGhyb3VnaCBzdWJkaXJlY3RvcmllcywgcGVyZm9ybSBhdXRvbWF0aWMgdXBkYXRlcywgZXRjLgorICAgVGhlcmUgaXMgbm8gYXNzdXJyYW5jZSBhIGNvbm5lY3Rpb24gd2lsbCBzdGF5IG9wZW4gYW5kLCBhcyBub3RlZCwKKyAgIHRoZXJlIGlzIG5vIHByb3Zpc2lvbiBmb3IgZGF0YSBjb252ZXJzaW9uIGJldHdlZW4gdW5saWtlIHBsYXRmb3Jtcy4KKyAgIFRoZSBkYXRhJ3MgTUlNRSBoZWFkZXJzIGNhbiBiZSB1c2VkIGZvciBwb3N0cHJvY2Vzc2luZy4KKworICAgIDIuMi4zLiBIVFRQIEhlYWRlcnMKKworICAgRWFjaCBIVFRQIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGNvbnRhaW5zIGEgc2V0IG9mIG5hbWUvdmFsdWUgcGFpcnMKKyAgIGNhbGxlZCBoZWFkZXJzLiBIVFRQIGhlYWRlcnMgYXJlIHNwZWNpZmllZCBpbiBbMTc4XVJGQyAyNjE2LiBGb3IKKyAgIGV4YW1wbGUsIGFuIEhUVFAgR0VUIHJlcXVlc3QgZm9yIC9pbmRleC5odG1sIG9uIHd3dy5jb2x1bWJpYS5lZHUKKyAgIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaGVhZGVyczoKKworICBHRVQgL2luZGV4Lmh0bWwgSFRUUC8xLjEKKyAgSG9zdDogd3d3LmNvbHVtYmlhLmVkdTo4MAorICBVc2VyLWFnZW50OiBDLUtlcm1pdCA4LjAKKyAgQXV0aG9yaXphdGlvbjogQmFzaWMgYmFzZTY0LWVuY29kZWQtdXNlcm5hbWUtcGFzc3dvcmQKKworICAgVGhlc2UgbWlnaHQgYmUgZm9sbG93ZWQgYnkgYW55IG90aGVycyBzcGVjaWZpZWQgd2l0aCBhIC9IRUFERVJTOgorICAgc3dpdGNoOgorCisgIEFjY2VwdDogaW1hZ2UvZ2lmLCBpbWFnZS94LXhiaXRtYXAsIGltYWdlL2pwZWcsICouKgorICBBY2NlcHQtRW5jb2Rpbmc6IGd6aXAKKyAgQWNjZXB0LUxhbmd1YWdlOiBlbgorICBBY2NlcHQtQ2hhcnNldDogaXNvLTg4NTktMSx1dGYtOAorICBDb29raWU6IGNvb2tpZS1kYXRhCisKKyAgIFRoZSBzZXJ2ZXIgc2VuZHMgYmFjayBhIHNob3J0IHJlcG9ydCBhYm91dCB0aGUgZmlsZSBwcmlvciB0byBzZW5kaW5nCisgICB0aGUgZmlsZSBjb250ZW50cy4gRXhhbXBsZToKKworICBIVFRQLzEuMSAyMDAgT0sKKyAgRGF0ZTogRnJpLCAyNCBBdWcgMjAwMSAyMTowOTozOSBHTVQKKyAgU2VydmVyOiBBcGFjaGUvMS4zLjQgKFVuaXgpCisgIExhc3QtTW9kaWZpZWQ6IE1vbiwgMDYgQXVnIDIwMDEgMjE6MTY6MTMgR01UCisgIEVUYWc6ICIxZmExMzctMTBkNy0zYjZmMDkxZCIKKyAgQWNjZXB0LVJhbmdlczogYnl0ZXMKKyAgQ29udGVudC1MZW5ndGg6IDQzMTEKKyAgQ29udGVudC1UeXBlOiB0ZXh0L2h0bWwKKworICAgSWYgeW91IHdhbnQgdG8gaGF2ZSB0aGlzIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBhIEtlcm1pdCBzY3JpcHQgeW91CisgICBjYW4gdXNlIHRoZSAvQVJSQVkgc3dpdGNoIHRvIGhhdmUgS2VybWl0IHB1dCBpdCBpbiBhcnJheSwgb25lIGxpbmUgcGVyCisgICBhcnJheSBlbGVtZW50LiBFeGFtcGxlOgorCisgIHNldCBleGl0IHdhcm5pbmcgb2ZmCisgIGh0dHAgb3BlbiB3d3cuY29sdW1iaWEuZWR1CisgIGlmIGZhaWwgZXhpdCAxIENhbid0IHJlYWNoIHNlcnZlcgorICBodHRwIC9hcnJheTomYSBnZXQgL2luZGV4Lmh0bWwKKyAgaWYgZmFpbCBleGl0IDEgQ2FuJ3QgZ2V0IGZpbGUKKyAgZWNobyBIZWFkZXIgbGluZXM6IFxmZGltKCZhKQorICBmb3IgXCVpIDEgXGZkaW0oJmEpIDEgeworICAgICAgZWNobyBcJWkuIFwmYVtcJWldCisgIH0KKworICAgTm90ZSB0aGF0IHRoZSAiRGF0ZToiIGl0ZW0gaXMgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZTsgdGhlCisgICAiTGFzdC1Nb2RpZmVkOiIgaXRlbSBpcyB0aGUgZmlsZSdzIG1vZGlmaWNhdGlvbiBkYXRlIGFuZCB0aW1lLiBBbgorICAgZXhhbXBsZSBzaG93aW5nIGhvdyB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbiBpcyBwcmVzZW50ZWQgaW4KKyAgIFsxNzldU2VjdGlvbiA4LjEzLjcuCisKKyAgICAyLjIuNC4gU2VjdXJlIEhUVFAgQ29ubmVjdGlvbnMKKworICAgU1NML1RMUyAoU2VjdXJlIFNvY2tldHMgTGF5ZXIgLyBUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkpIGlzIHRoZQorICAgcHJvdG9jb2wgdXNlZCB0byBzZWN1cmUgSFRUUCwgU01UUCwgYW5kIG90aGVyIEludGVybmV0IGFwcGxpY2F0aW9ucy4KKyAgIFNlZSB0aGUgWzE4MF1DLUtlcm1pdCBSZWZlcmVuY2UgU2VjdGlvbiA1LjQgZm9yIGFuIGludHJvZHVjdGlvbiB0bworICAgU1NML1RMUy4gVG8gbWFrZSBhIHNlY3VyZSBIVFRQIGNvbm5lY3Rpb24sIHlvdSBuZWVkOgorCisgICAgMS4gQSBzZWN1cmUgY2xpZW50IChhIHZlcnNpb24gb2YgQy1LZXJtaXQgb3IgS2VybWl0IDk1IHdpdGggU1NML1RMUworICAgICAgIHNlY3VyaXR5IGJ1aWx0IGluKS4gVHlwZSAiY2hlY2sgc3NsIiBhdCB0aGUgS2VybWl0IHByb21wdCB0byBtYWtlCisgICAgICAgc3VyZSB5b3UgaGF2ZSBpdC4KKyAgICAyLiBBIHNlY3VyZSBzZXJ2ZXIgdG8gY29ubmVjdCB0by4KKyAgICAzLiBUaGUgQ0EgUm9vdCBDZXJ0aWZpY2F0ZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGUgc2VydmVyIHRvIHRoZQorICAgICAgIGNsaWVudC4gKHNlZSBbMTgxXVNlY3Rpb24gMTUgb2YgdGhlIHNlY3VyaXR5IHJlZmVyZW5jZSBmb3IgYW4KKyAgICAgICBpbnRyb2R1Y3Rpb24gdG8gY2VydGlmaWNhdGVzKS4KKworICAgQW5kIHlvdSBtdXN0IG1ha2UgYSBjb25uZWN0aW9uIHRvIHRoZSBzZWN1cmUgSFRUUCBwb3J0OiBzZXJ2aWNlIG5hbWUKKyAgIEhUVFBTLCBwb3J0IG51bWJlciA0NDMgKGFzIG9wcG9zZWQgdG8gc2VydmljZSBIVFRQLCBwb3J0IDgwKS4gWW91IGNhbgorICAgYWxzbyBtYWtlIHNlY3VyZSBjb25uZWN0aW9ucyB0byBvdGhlciBwb3J0cyBieSBpbmNsdWRpbmcgdGhlIC9UTFMgb3IKKyAgIC9TU0wgc3dpdGNoIHdpdGggdGhlIEhUVFAgT1BFTiBjb21tYW5kLCBpZiB0aGUgaG9zdCBzdXBwb3J0cyBTU0wvVExTCisgICBvbiB0aGUgZ2l2ZW4gcG9ydDoKKworICAgVGhlIHF1YWxpdHkgb2YgdGhlIFNTTC9UTFMgY29ubmVjdGlvbiBkZXBlbmRzIG9uIHRoZSBjaXBoZXIgc3VpdGUuCisgICBUaGVyZSBhcmUgc2V2ZXJhbCBwb3NzaWJpbGl0aWVzOgorCisgICBBbm9ueW1vdXMgY2lwaGVyIHN1aXRlOgorICAgICAgICAgIElmIGFuIGFub255bW91cyBjaXBoZXIgc3VpdGUgaXMgbmVnb3RpYXRlZCwgdGhlIGNvbm5lY3Rpb24gaXMKKyAgICAgICAgICBlbmNyeXB0ZWQgYnV0IHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uLiBUaGlzIGNvbm5lY3Rpb24gaXMKKyAgICAgICAgICBzdWJqZWN0IHRvIGEgTWFuLUluLVRoZS1NaWRkbGUgKE1JVE0pIGF0dGFjay4KKworICAgWC41MDkgY2VydGlmaWNhdGUgb24gdGhlIHNlcnZlcjoKKyAgICAgICAgICBXaGVuIHlvdSBjb25uZWN0IHRvIGNlcnRhaW4gc2VjdXJlIHNlcnZlcnMsIGFuIFguNTA5CisgICAgICAgICAgY2VydGlmaWNhdGUgaXMgcmV0dXJuZWQuIFRoaXMgY2VydGlmaWNhdGUgaXMgaXNzdWVkIHRvIGEKKyAgICAgICAgICBzcGVjaWFsIGhvc3RuYW1lLCBzb21ldGhpbmcgbGlrZSB3d3cxLnh5emNvcnAuY29tIG9yCisgICAgICAgICAgd3d3cy54eXpjb3JwLmNvbSAocmF0aGVyIHRoYW4gdGhlIG5vcm1hbCB3d3cueHl6Y29ycC5jb20pLiBJdAorICAgICAgICAgIGlzIHNpZ25lZCBieSB0aGUgaG9zdCdzIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpLiBJZiB0aGUgaG9zdAorICAgICAgICAgIGNlcnRpZmljYXRlIGlzIGNvbmZpZ3VyZWQgb24gdGhlIGNsaWVudCwgaXQgY2FuIGJlIHVzZWQgdG8KKyAgICAgICAgICB2ZXJpZnkgdGhlIGNlcnRpZmljYXRlIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlci4gSWYgdGhlCisgICAgICAgICAgY2VydGlmaWNhdGUgaXQgdmVyaWZpZWQgYXMgYXV0aGVudGljLCBhIGNoZWNrIGlzIG1hZGUgdG8gZW5zdXJlCisgICAgICAgICAgaXQgaGFzIG5vdCBleHBpcmVkIGFuZCBpdCB3YXMgaXNzdWVkIHRvIHRoZSBob3N0IHlvdSB3ZXJlCisgICAgICAgICAgYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvLiBJZiB5b3UgaGFkIGFza2VkIHRvIGNvbm5lY3QgdG8gKHNheSkKKyAgICAgICAgICB3d3cueHl6Y29ycC5jb20gYnV0IHdlcmUgZ2l2ZW4gYSBjZXJ0aWZpY2F0ZSBmb3IKKyAgICAgICAgICB3d3cxLnh5emNvcnAuY29tLCB5b3Ugd291bGQgYmUgcHJvbXB0ZWQgZm9yIHBlcm1pc3Npb24gdG8KKyAgICAgICAgICBjb250aW51ZS4KKworICAgICAgICAgIElmIHRoZSB2ZXJpZmljYXRpb24gc3VjY2VlZGVkLCB0aGUgY29ubmVjdGlvbiB3b3VsZCBiZQorICAgICAgICAgIGVuY3J5cHRlZCB3aXRoIG9uZS13YXkgKHNlcnZlci10by1jbGllbnQpIGF1dGhlbnRpY2F0aW9uLiBUaGlzCisgICAgICAgICAgY29ubmVjdGlvbiBpcyBub3Qgc3ViamVjdCB0byBhIE1JVE0gYXR0YWNrLgorCisgICAgICAgICAgSWYgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYXJlIHRyYW5zbWl0dGVkIG92ZXIgdGhpcworICAgICAgICAgIGNvbm5lY3Rpb24sIHRoZXkgYXJlIG5vdCBzdWJqZWN0IHRvIGludGVyY2VwdGlvbi4gSG93ZXZlciwgdGhlCisgICAgICAgICAgc3RhbmRhcmQgcmlza3MgYXNzb2NpYXRlZCB3aXRoIHBhc3NpbmcgdGhlIHBhc3N3b3JkIHRvIHRoZSBob3N0CisgICAgICAgICAgZm9yIHZlcmlmaWNhdGlvbiBhcHBseTsgZm9yIGV4YW1wbGUsIGlmIHRoZSBob3N0IGhhcyBiZWVuCisgICAgICAgICAgY29tcHJvbWlzZWQsIHRoZSBwYXNzd29yZCB3aWxsIGJlIGNvbXByb21pc2VkLgorCisgICBYLjUwOSBjbGllbnQgY2VydGlmaWNhdGU6CisgICAgICAgICAgSWYgYSBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkIHdpdGggYW4gWC41MDkgc2VydmVyCisgICAgICAgICAgY2VydGlmaWNhdGUsIHRoZSBzZXJ2ZXIgY2FuIGFzayB0aGUgY2xpZW50IHRvIHNlbmQgYQorICAgICAgICAgIGNlcnRpZmljYXRlIG9mIGl0cyBvd24uIFRoaXMgY2VydGlmaWNhdGUgbXVzdCBiZSB2ZXJpZmllZAorICAgICAgICAgIGFnYWluc3QgYSBDQSBSb290IGNlcnRpZmljYXRlLiBUaGUgY2VydGlmaWNhdGUgaXRzZWxmIChvcgorICAgICAgICAgIHN1YmplY3QgaW5mbyBmcm9tIHRoZSBjZXJ0aWZpY2F0ZSkgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlCisgICAgICAgICAgYXV0aG9yaXphdGlvbiBmb3IgdGhlIGNsaWVudCwgYW5kIGlmIHN1Y2Nlc3NmdWwsIHRoZSB1c2VybmFtZQorICAgICAgICAgIGFuZCBwYXNzd29yZCBuZWVkIG5vdCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCisKKyAgIEtlcmJlcm9zIDU6CisgICAgICAgICAgSW5zdGVhZCBvZiB1c2luZyBYLjUwOSBjZXJ0aWZjYXRlcywgS2VyYmVyb3MgNSBjYW4gYmUgdXNlZCB0bworICAgICAgICAgIHBlcmZvcm0gdGhlIGF1dGhlbnRpY2F0aW9uIGFuZCBrZXkgZXhjaGFuZ2UuIEluIHRoaXMgc2l0dWF0aW9uLAorICAgICAgICAgIHRoZXJlIGlzIG11dHVhbCBhdXRoZW50aWNhdGlvbiBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4KKyAgICAgICAgICBUaGUgS2VyYmVyb3MgNSBwcmluY2lwYWwgaXMgdXNlZCBieSB0aGUgc2VydmVyIHRvIGxvb2sgdXAgdGhlCisgICAgICAgICAgYXBwcm9wcmlhdGUgYXV0aG9yaXphdGlvbiBkYXRhLiBUaGVyZSBpcyBubyBuZWVkIHRvIHNlbmQKKyAgICAgICAgICB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCisKKyAgIEFuIEhUVFAgY29ubmVjdGlvbiBpcyBtYWRlIHdpdGggdGhlIEhUVFAgT1BFTiBjb21tYW5kOgorCisgICBIVFRQIFsgc3dpdGNoZXMgXSBPUEVOIFsgeyAvU1NMLCAvVExTIH0gXSBob3N0IFsgcG9ydCBdIAorICAgICAgICAgIElmIC9TU0wgb3IgL1RMUyBzd2l0Y2hlcyBhcmUgaW5jbHVkZWQgKHRoZXNlIGFyZSBzeW5vbnltcyksIG9yCisgICAgICAgICAgaWYgdGhlIHNlcnZpY2UgaXMgSFRUUFMgb3IgdGhlIHBvcnQgaXMgNDQzLCBhIHNlY3VyZSBjb25uZWN0aW9uCisgICAgICAgICAgaXMgYXR0ZW1wdGVkIHVzaW5nIHRoZSBjdXJyZW50IGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzOyBzZWUKKyAgICAgICAgICBIRUxQIFNFVCBBVVRIRU5USUNBVElPTiBmb3IgZGV0YWlscyAoWzE4Ml1TZWN0aW9uIDYuMiBvZiB0aGUKKyAgICAgICAgICBzZWN1cml0eSByZWZlcmVuY2UpLiBJZiB0aGUgbm8gL1NTTCBvciAvVExTIHN3aXRjaCBpcyBpbmNsdWRlZAorICAgICAgICAgIGJ1dCB0aGUgcG9ydCBpcyA0NDMgb3IgdGhlIHNlcnZpY2UgaXMgSFRUUFMsIGEgc2VjdXJlCisgICAgICAgICAgY29ubmVjdGlvbiBpcyBhdHRlbXB0ZWQuIElmIGFuIC9TU0wgb3IgL1RMUyBzd2l0Y2ggaXMgaW5jbHVkZWQKKyAgICAgICAgICBidXQgYSBwb3J0IGlzIG5vdCBzcGVjaWZpZWQsIGFuIFNTTC9UTFMgY29ubmVjdGlvbiBpcyBhdHRlbXB0ZWQKKyAgICAgICAgICBvbiB0aGUgZGVmYXVsdCBwb3J0ICg4MCkuCisKKyAgIENlcnRpZmljYXRlcyBhcmUgY292ZXJlZCBpbiB0aGUgc2VwYXJhdGUgWzE4M11LZXJtaXQgU2VjdXJpdHkKKyAgIFJlZmVyZW5jZSBmb3IgQy1LZXJtaXQgOC4wLiBZb3Ugc2hvdWxkIGxldCBLZXJtaXQga25vdyB0byB2ZXJpZnkKKyAgIGNlcnRpZmljYXRlcyB3aXRoIHRoZSBTRVQgQVVUSEVOVElDQVRJT04gVExTIGNvbW1hbmQuIEZvciBleGFtcGxlOgorCisgICBTRVQgQVVUSEVOVElDQVRJT04gVExTIENSTC1ESVIgZGlyZWN0b3J5CisgICAgICAgICAgU3BlY2lmaWVzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgY2VydGlmaWNhdGUgcmV2b2NhdGlvbgorICAgICAgICAgIGZpbGVzIHdoZXJlIGVhY2ggZmlsZSBpcyBuYW1lZCBieSB0aGUgaGFzaCBvZiB0aGUgY2VydGlmaWNhdGUKKyAgICAgICAgICB0aGF0IGhhcyBiZWVuIHJldm9rZWQuCisKKyAgIFNFVCBBVVRIRU5USUNBVElPTiBUTFMgQ1JMLUZJTEUgZmlsZW5hbWUKKyAgICAgICAgICBTcGVjaWZpZXMgYSBmaWxlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGNlcnRpZmljYXRlCisgICAgICAgICAgcmV2b2NhdGlvbnMuCisKKyAgIFNFVCBBVVRIRU5USUNBVElPTiBUTFMgVkVSSUZZLURJUiBkaXJlY3RvcnkKKyAgICAgICAgICBTcGVjaWZpZXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyByb290IENBIGNlcnRpZmljYXRlIGZpbGVzCisgICAgICAgICAgdXNlZCB0byB2ZXJpZnkgdGhlIGNlcnRpZmljYXRlIGNoYWlucyBwcmVzZW50ZWQgYnkgdGhlIHBlZXIuCisgICAgICAgICAgRWFjaCBmaWxlIGlzIG5hbWVkIGJ5IGEgaGFzaCBvZiB0aGUgY2VydGlmaWNhdGUuCisKKyAgIFNFVCBBVVRIRU5USUNBVElPTiBUTFMgVkVSSUZZLUZJTEUgZmlsZW5hbWUKKyAgICAgICAgICBTcGVjaWZpZXMgYSBmaWxlIHRoYXQgY29udGFpbnMgcm9vdCBDQSBjZXJ0aWZpY2F0ZXMgdG8gYmUgdXNlZAorICAgICAgICAgIGZvciB2ZXJpZnlpbmcgY2VydGlmaWNhdGUgY2hhaW5zLgorCisgICBTRVQgQVVUSEVOVElDQVRJT04gVExTIFZFUklGWSBPRkYKKyAgICAgICAgICBUZWxscyBLZXJtaXQgbm90IHRvIHJlcXVpcmUgYSBjZXJ0aWZpY2F0ZSBhbmQgYWNjZXB0IGFueQorICAgICAgICAgIGNlcnRpZmljYXRlIHRoYXQgaXMgcHJlc2VudGVkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcworICAgICAgICAgIHZhbGlkLgorCisgICBUaGVyZSBhcmUgbWFueSBvdGhlciBvcHRpb25zOyBzZWUgdGhlIHNlY3VyaXR5IGRvY3VtZW50IGZvciBkZXRhaWxzLgorCisgICBOb3cgc3VwcG9zZSB5b3UgbmVlZCBuZWVkIHRvIGZldGNoIHRoZSBmaWxlIGRlbm90ZWQgYnkgdGhlIGZvbGxvd2luZworICAgVVJMOgorCisgIGh0dHBzOi8vbXl1c2VyaWQ6bXlwYXNzd29yZEB3d3dzLnh5emNvcnAuY29tL2NsaWVudHMvaW5mby9zZWNyZXQuaHRtbAorCisgICBPbmNlIHlvdSBoYXZlIHNldCB1cCB0aGUgaGFuZGxpbmcgb2YgY2VydGlmaWNhdGVzIGFzIGRlc2lyZWQsIHlvdSBjYW4KKyAgIHVzZSB0aGUgZm9sbG93aW5nIEtlcm1pdCBjb21tYW5kczoKKworICBodHRwIC91c2VyOm15dXNlcmlkIC9wYXNzd29yZDpteXBhc3N3b3JkIG9wZW4gd3d3MS54eXpjb3JwLmNvbSBodHRwcworICBpZiBzdWNjZXNzIHsKKyAgICAgIGh0dHAgZ2V0IC9jbGllbnRzL2luZm8vc2VjcmV0Lmh0bWwKKyAgICAgIGh0dHAgY2xvc2UKKyAgfQorCisgICBBcyBhbm90aGVyIGV4YW1wbGUsIGxldCdzIHNheSB0aGF0IHlvdSBoYXZlIGEgd2ViIGZvcm0geW91IG5lZWQgdG8KKyAgIHBvcHVsYXRlIHdpdGggdGhyZWUgZmllbGRzOiByZWQsd2hpdGUgYW5kIGJsdWUuCisKKyAgPEZPUk0gQUNUSU9OPSJodHRwOi8vd3d3Lnh5emNvcnAuY29tL2NnaS1iaW4vZm9ybS5jZ2kiIE1FVEhPRD0iUE9TVCI+CisgIDxJTlBVVCBOQU1FPSJSZWQiPgorICA8SU5QVVQgTkFNRT0iV2hpdGUiPgorICA8SU5QVVQgTkFNRT0iQmx1ZSI+CisgIDwvRk9STT4KKworICAgWW91IGNhbiBoYW5kbGUgdGhpcyB3aXRoIHRoZSBIVFRQIFBPU1QgY29tbWFuZC4gVGhlIGRhdGEgdG8gYmUgcG9zdGVkCisgICBpcyBzdG9yZWQgaW4gdGhlIGxvY2FsIGZpbGUgZGF0YS50eHQuCisKKyAgUmVkPXNldmVuIHN0cmlwZXMmV2hpdGU9c2l4IHN0cmlwZXMmQmx1ZT1maWZ0eSBzdGFycworCisgICBhbmQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciB3aWxsIGJlIHN0b3JlZCBpbnRvIHJlc3BvbnNlLnR4dC4KKworICBodHRwIG9wZW4gd3d3Lnh5emNvcnAuY29tIGh0dHAKKyAgaWYgc3VjY2VzcyB7CisgICAgaHR0cCAvYXJyYXk6YyBwb3N0IGRhdGEudHh0IC9jZ2ktYmluL2Zvcm0uY2dpIHJlc3BvbnNlLnR4dAorICAgIGh0dHAgY2xvc2UKKyAgfQorCisgICBJbiB0aGlzIHNjZW5hcmlvLCB0aGUgQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlIChDR0kpIHNlbmRzIGEgcmVzcG9uc2UKKyAgIHdoZXRoZXIgaXQgc3VjY2VlZHMgb3IgZmFpbHMgaW4gYSBzY3JpcHQtZGVwZW5kZW50IG1hbm5lci4gVGhlIHNjcmlwdAorICAgY2FuIGVpdGhlciByZXBvcnQgc3VjY2VzcyBhbmQgZW5jbG9zZSB0aGUgcmVzcG9uc2UgZGF0YTsgb3IgaXQgbWlnaHQKKyAgIHNlbmQgYSAzMDIgRm91bmQgZXJyb3Igd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlICJMb2NhdGlvbjoiIGhlYWRlcgorICAgc2hvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBVUkwgYXQgd2hpY2ggdGhlIGRhdGEgY2FuIGJlIGZvdW5kLgorCisgICAgMi4yLjUuIEhUVFAgVmFyaWFibGVzCisKKyAgIFx2KGh0dHBfY29kZSkKKyAgICAgICAgICBUaGUgSFRUUCBwcm90b2NvbCBjb2RlIG51bWJlciBvZiB0aGUgbW9zdCByZWNlbnQgc2VydmVyIHJlcGx5LAorICAgICAgICAgIGUuZy4gNDA0IGZvciAibm90IGZvdW5kIi4KKworICAgXHYoaHR0cF9jb25uZWN0ZWQpCisgICAgICAgICAgMSB3aGVuIGFuIEhUVFAgY29ubmVjdGlvbiBpcyBvcGVuLCAwIHdoZW4gdGhlcmUgaXMgbm8gSFRUUAorICAgICAgICAgIGNvbm5lY3Rpb24uCisKKyAgIFx2KGh0dHBfaG9zdCkKKyAgICAgICAgICBJZiBhbiBIVFRQIGNvbm5lY3Rpb24gaXMgb3BlbiwgdGhlIGhvc3RuYW1lOnBvcnQsIGUuZy4KKyAgICAgICAgICB3d3cuY29sdW1iaWEuZWR1OjgwOyBvdGhlcndpc2UsIGVtcHR5LgorCisgICBcdihodHRwX21lc3NhZ2UpCisgICAgICAgICAgU2VydmVyIGVycm9yIG1lc3NhZ2UsIGlmIGFueSwgZnJvbSBtb3N0IHJlY2VudCBIVFRQIGNvbW1hbmQuCisKKyAgIFx2KGh0dHBfc2VjdXJpdHkpCisgICAgICAgICAgQSBsaXN0IG9mIHRoZSBzZWN1cml0eSBwYXJhbWV0ZXJzIGFuZCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50CisgICAgICAgICAgY29ubmVjdGlvbiwgaWYgYW55LiBFbXB0eSBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgdG8gYSBzZWN1cmUKKyAgICAgICAgICBzZXJ2ZXIsIG9yIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24uCisKKyAgIFRvIGRpc3BsYXkgYWxsIHRoZSBIVFRQIHZhcmlhYmxlcyBhdCBvbmNlLCB0eXBlIFNIT1cgVkFSIEhUVFA6CisKKyAgQy1LZXJtaXQ+IGh0dHAgb3BlbiB3d3cuY29sdW1iaWEuZWR1CisgIEMtS2VybWl0PiBodHRwIGdldCBsa2psa2psa2psa2ogCisgIEMtS2VybWl0PiBzaG8gdmFyIGh0dHAKKyAgIFx2KGh0dHBfY29kZSkgPSA0MDQKKyAgIFx2KGh0dHBfY29ubmVjdGVkKSA9IDEKKyAgIFx2KGh0dHBfaG9zdCkgPSB3d3cuY29sdW1iaWEuZWR1OjgwCisgICBcdihodHRwX21lc3NhZ2UpID0gTm90IEZvdW5kCisgICBcdihodHRwX3NlY3VyaXR5KSA9IE5VTEwKKyAgQy1LZXJtaXQ+CisKKyAgICAyLjIuNi4gVGhlIEhUVFAgQ29tbWFuZC1MaW5lIFBlcnNvbmFsaXR5CisKKyAgIElmIHlvdSBpbnZva2UgQy1LZXJtaXQgd2l0aCB0aGUgbmFtZSAiaHR0cCIgb3IgImh0dHBzIiwgeW91IGNhbiB1c2UgYQorICAgc3BlY2lhbCBzZXQgb2YgSFRUUC1zcGVjaWZpYyBjb21tYW5kLWxpbmUgb3B0aW9ucy4gWW91IGNhbiBkbyB0aGlzIGJ5CisgICBjcmVhdGluZyBhIHN5bWJvbGljIGxpbmtlICJodHRwIiBvciAiaHR0cHMiIHRvIHRoZSBDLUtlcm1pdCA4LjAKKyAgIGV4ZWN1dGFibGUsIG9yIGJ5IGhhdmluZyBhIHNlcGFyYXRlIGNvcHkgb2YgaXQgY2FsbGVkICJodHRwIiBvcgorICAgImh0dHBzIi4gSGVyZSdzIHRoZSB1c2FnZSBtZXNzYWdlICgiaHR0cCAtaCIpOgorCisgIFVzYWdlOiAuL2h0dHAgaG9zdCBbIG9wdGlvbnMuLi4gXQorICAgLWggICAgICAgICAgICAgVGhpcyBtZXNzYWdlLgorICAgLWQgICAgICAgICAgICAgRGVidWcgdG8gZGVidWcubG9nLgorICAgLVMgICAgICAgICAgICAgU3RheSAoaXNzdWUgY29tbWFuZCBwcm9tcHQgd2hlbiBkb25lKS4KKyAgIC1ZICAgICAgICAgICAgIERvIG5vdCBleGVjdXRlIEtlcm1pdCBpbml0aWFsaXphdGlvbiBmaWxlLgorICAgLXEgICAgICAgICAgICAgUXVpZXQgKHN1cHByZXNzIG1vc3QgbWVzc2FnZXMpLgorICAgLXUgbmFtZSAgICAgICAgVXNlcm5hbWUuCisgICAtUCBwYXNzd29yZCAgICBQYXNzd29yZC4KKyAgIC1nIHBhdGhuYW1lICAgIEdldCByZW1vdGUgcGF0aG5hbWUuCisgICAtcCBwYXRobmFtZSAgICBQdXQgcmVtb3RlIHBhdGhuYW1lLgorICAgLUggcGF0aG5hbWUgICAgSGVhZCByZW1vdGUgcGF0aG5hbWUuCisgICAtbCBwYXRobmFtZSAgICBMb2NhbCBwYXRoIGZvciAtZywgLXAsIGFuZCAtSC4KKyAgIC16IG9wdFs9dmFsdWVdIFNlY3VyaXR5IG9wdGlvbnMuLi4KKyAgICAgIGNlcnQ9ZmlsZSAgIENsaWVudCBjZXJ0aWZpY2F0ZSBmaWxlCisgICAgICBjZXJ0c29rICAgICBBY2NlcHQgYWxsIGNlcnRpZmljYXRlcworICAgICAga2V5PWZpbGUgICAgQ2xpZW50IHByaXZhdGUga2V5IGZpbGUKKyAgICAgIHNlY3VyZSAgICAgIFVzZSBTU0wKKyAgICAgIHZlcmlmeT1uICAgIDAgPSBub25lLCAxID0gcGVlciAsIDIgPSBjZXJ0aWZpY2F0ZSByZXF1aXJlZAorCisgICBUaGUgImhvc3QiIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIGEgV2ViIGhvc3QsIGUuZy4gd3d3LmNvbHVtYmlhLmVkdS4KKyAgIFRoZSBhY3Rpb24gb3B0aW9ucyBhcmUgLXAsIC1nLCBhbmQgLUguIElmIHlvdSBnaXZlIGFuIGFjdGlvbiBvcHRpb24sCisgICBLZXJtaXQgZG9lcyB0aGUgYWN0aW9uIGFuZCB0aGVuIGV4aXRzLiBJZiB5b3UgZ2l2ZSBhIGhvc3Qgd2l0aG91dCBhbgorICAgYWN0aW9uIG9wdGlvbiwgS2VybWl0IG1ha2VzIGFuIEhUVFAgY29ubmVjdGlvbiB0byB0aGUgaG9zdCBhbmQgdGhlbgorICAgZ2l2ZXMgeW91IHRoZSBDLUtlcm1pdCBwcm9tcHQuIEhlcmUncyBhIHNpbXBsZSBleGFtcGxlIHRoYXQgZmV0Y2hlcyBhCisgICBwdWJsaWNseSByZWFkYWJsZSBXZWIgcGFnZToKKworICBodHRwIHd3dy5jb2x1bWJpYS5lZHUgLWcga2VybWl0L2luZGV4Lmh0bWwKKworICAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgd2Vic2l0ZSBmb3Igd2hpY2ggYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYXJlCisgICByZXF1aXJlZCwgeW91IGNhbiBzdXBwbHkgdGhlbSBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggLXUgYW5kIC1QLiBJZgorICAgeW91IGluY2x1ZGUgYSB1c2VybmFtZSBidXQgb21pdCB0aGUgcGFzc3dvcmQsIEtlcm1pdCBwcm9tcHRzIHlvdSBmb3IKKyAgIGl0OgorCisgIGh0dHAgd3d3LmNvbHVtYmlhLmVkdSAtdSBvbGdhIC1wIGtlcm1pdC9pbmRleC5odG1sIC1sIGluZGV4Lmh0bWwKKyAgUGFzc3dvcmQ6CisKKyAgIE5vdGUgdGhhdCB3aGVuIFBVVCdpbmcgZmlsZXMgdG8gd2Vic2l0ZXMsIHlvdSBoYXZlIHRvIHN1cHBseSBib3RoIHRoZQorICAgLXAgKHJlbW90ZSBwYXRobmFtZSkgYW5kIC1sIChsb2NhbCBwYXRoKSBvcHRpb25zLgorCisgICBJZiB5b3VyIHZlcnNpb24gb2YgS2VybWl0IGlzIGJ1aWx0IHdpdGggU1NML1RMUyBzZWN1cml0eSwgeW91IGNhbiBhbHNvCisgICB1c2UgdGhlIC16IG9wdGlvbiB0byBtYWtlIHNlY3VyZSBIVFRQIChodHRwcykgY29ubmVjdGlvbnMuCisKKyAgIEZpbmFsbHksIGFzIG5vdGVkIGluIFsxODRdU2VjdGlvbiAxNiwgeW91IGNhbiBhbHNvIGdpdmUgYSBVUkwgaW5zdGVhZAorICAgb2YgYSBob3N0IG5hbWUgYW5kIG9wdGlvbnMuCisKKyAgIFsgWzE4NV1Ub3AgXSBbIFsxODZdQ29udGVudHMgXSBbIFsxODddQy1LZXJtaXQgSG9tZSBdIFsgWzE4OF1LZXJtaXQKKyAgIEhvbWUgXQorICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCiszLiBUSEUgQlVJTFQtSU4gRlRQIENMSUVOVAorCisgICAgIDMuMS4gIFsxODldTWFraW5nIGFuZCBNYW5hZ2luZyBGVFAgQ29ubmVjdGlvbnMKKyAgICAgMy4yLiAgWzE5MF1NYWtpbmcgU2VjdXJlIEZUUCBDb25uZWN0aW9ucworICAgICAzLjMuICBbMTkxXVNldHRpbmcgRlRQIFByZWZlcmVuY2VzCisgICAgIDMuNC4gIFsxOTJdTWFuYWdpbmcgRGlyZWN0b3JpZXMgYW5kIEZpbGVzCisgICAgIDMuNS4gIFsxOTNdVXBsb2FkaW5nIEZpbGVzIFdpdGggRlRQCisgICAgIDMuNi4gIFsxOTRdRG93bmxvYWRpbmcgRmlsZXMgV2l0aCBGVFAKKyAgICAgMy43LiAgWzE5NV1UcmFuc2xhdGluZyBDaGFyYWN0ZXIgU2V0cworICAgICAzLjguICBbMTk2XUZUUCBDb21tYW5kIFNob3J0Y3V0cworICAgICAzLjkuICBbMTk3XUR1YWwgU2Vzc2lvbnMKKyAgICAgMy4xMC4gWzE5OF1BdXRvbWF0aW5nIEZUUCBTZXNzaW9ucworICAgICAzLjExLiBbMTk5XUFkdmFuY2VkIEZUUCBQcm90b2NvbCBGZWF0dXJlcworCisgICBFYXJsaWVyIHZlcnNpb25zIG9mIEMtS2VybWl0IGFuZCBLOTUgaW5jbHVkZWQgYW4gRlRQIGNvbW1hbmQsIGJ1dCBpdAorICAgc2ltcGx5IGludm9rZWQgYW4gZXh0ZXJuYWwgRlRQIGNsaWVudC4gTm93LCBieSBwb3B1bGFyIGRlbWFuZCwgS2VybWl0CisgICBpbmNsdWRlcyBpdHMgb3duIGJ1aWx0LWluIEZUUCBjbGllbnQgdGhhdCBvZmZlcnMgdGhlIGZvbGxvd2luZworICAgYWR2YW50YWdlcyBvdmVyIHRyYWRpdGlvbmFsIEZUUCBjbGllbnRzIChhbmQgaXRzIHByZXZpb3VzIGludGVyZmFjZSB0bworICAgdGhlbSk6CisKKyAgICAgKiBBbnkgb2YgS2VybWl0J3MgYnVpbHQtaW4gWzIwMF1zZWN1cml0eSBtZXRob2RzIGNhbiBiZSB1c2VkIHRvCisgICAgICAgZXN0YWJsaXNoIGFuZCBjb25kdWN0IHNlY3VyZSBGVFAgc2Vzc2lvbnMgd2l0aCBbMjAxXUZUUCBzZXJ2ZXJzCisgICAgICAgdGhhdCBzdXBwb3J0IHRoZXNlIG1ldGhvZHMuIChTZWN1cml0eSBtb2R1bGVzIGNhbiBiZSBzdWJqZWN0IHRvCisgICAgICAgZXhwb3J0IHJlc3RyaWN0aW9ucy4pCisgICAgICogS2VybWl0J3MgRlRQIGNsaWVudCB1c2VzICJwYXNzaXZlIG1vZGUiIGJ5IGRlZmF1bHQgdG8gYXZvaWQKKyAgICAgICBibG9ja2FnZSBieSBmaXJld2FsbHMgYW5kIG5ldHdvcmsgYWRkcmVzcyB0cmFuc2xhdG9ycy4gT2YgY291cnNlCisgICAgICAgYWN0aXZlIG1vZGUgY2FuIGJlIGNob3NlbiB0b28gd2hlbiBuZWVkZWQuCisgICAgICogWzIwMl1DaGFyYWN0ZXIgc2V0cyBjYW4gYmUgdHJhbnNsYXRlZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2ZlcgorICAgICAgIHByb2Nlc3MgZXZlbiB3aGVuIHRoZSBGVFAgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgY2hhcmFjdGVyLXNldAorICAgICAgIHRyYW5zbGF0aW9uLCBpbmNsdWRpbmcgdG8vZnJvbSB0aGUgbmV3IEludGVybmV0IHN0YW5kYXJkCisgICAgICAgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXIgc2V0LCBbMjAzXVVuaWNvZGUgVVRGLTguIFRoaXMgaW5jbHVkZXMKKyAgICAgICBib3RoIHRoZSBmaWxlJ3MgbmFtZSBhbmQgKGZvciB0ZXh0IGZpbGVzIG9ubHkpIGl0cyBjb250ZW50cy4KKyAgICAgKiBBbGwgb2YgQy1LZXJtaXQncyBbMjA0XWZpbGUtc2VsZWN0aW9uIG1lY2hhbmlzbXMgYXJlIGF2YWlsYWJsZToKKyAgICAgICBzaXplLCBkYXRlLCBuYW1lIHBhdHRlcm5zIGFuZCBsaXN0cywgZXhjZXB0aW9uIGxpc3RzLCBldGMuCisgICAgICogWzIwNV1BdG9taWMgZmlsZSBtb3ZlbWVudCBjYXBhYmlsaXRpZXMgYXJlIHByb3ZpZGVkIChkZWxldGUsIG1vdmUsCisgICAgICAgb3IgcmVuYW1lIGZpbGVzIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgc3VjY2Vzc2Z1bCB0cmFuc2ZlcikuCisgICAgICogVGhlIGNvcnJlY3QgZmlsZSB0eXBlLCAiYXNjaWkiIChpLmUuIHRleHQpIG9yIGJpbmFyeSwgaXMgY2hvc2VuCisgICAgICAgYXV0b21hdGljYWxseSBmb3IgZWFjaCBmaWxlIChleHBsYWluZWQgaW4gWzIwNl1TZWN0aW9uIDQpLCBhbmQgYW55CisgICAgICAgbWl4dHVyZSBvZiB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMgY2FuIGJlIHNlbnQgaW4gYSBzaW5nbGUKKyAgICAgICBvcGVyYXRpb24sIGV2ZW4gYWNyb3NzIHBsYXRmb3Jtcy4KKyAgICAgKiBVcGRhdGUgbW9kZSAoImRvbid0IGJvdGhlciB0cmFuc2ZlcnJpbmcgZmlsZXMgdGhhdCBkaWRuJ3QgY2hhbmdlCisgICAgICAgc2luY2UgbGFzdCB0aW1lIikgYW5kIHJlY292ZXJ5IChyZXN1bXB0aW9uIG9mIGFuIGludGVycnVwdGVkCisgICAgICAgdHJhbnNmZXIgZnJvbSB0aGUgcG9pbnQgb2YgZmFpbHVyZSkgYXJlIGF2YWlsYWJsZSBpbiBib3RoCisgICAgICAgZGlyZWN0aW9ucy4KKyAgICAgKiBXaGVuIHVwbG9hZGluZyBmaWxlcyBmcm9tIFVOSVggdG8gVU5JWCwgdGhlIGZpbGUncyBwZXJtaXNzaW9ucyBjYW4KKyAgICAgICBiZSBwcmVzZXJ2ZWQgaWYgZGVzaXJlZC4KKyAgICAgKiBSZWN1cnNpdmUgZGlyZWN0b3J5LXRyZWUgUFVUcyBhcmUgc3VwcG9ydGVkIGJldHdlZW4gYW55IHR3bworICAgICAgIHBsYXRmb3JtcyB0aGF0IGhhdmUgdHJlZS1zdHJ1Y3R1cmVkIGZpbGUgc3lzdGVtcy4gUmVjdXJzaXZlIEdFVHMKKyAgICAgICBhcmUgc3VwcG9ydGVkIGJldHdlZW4gbGlrZSBwbGF0Zm9ybXMgaWYgdGhlIHNlcnZlciBjb29wZXJhdGVzIGFuZAorICAgICAgIGJldHdlZW4gbGlrZSBvciB1bmxpa2UgcGxhdGZvcm1zIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgTUxTRAorICAgICAgIChbMjA3XVNlY3Rpb24gMy4xMSkuCisgICAgICogV2hlbiByZWNlaXZpbmcgZmlsZXMsIGFsbCBvZiBLZXJtaXQncyBmaWxlIGNvbGxpc2lvbiBhY3Rpb25zIGFyZQorICAgICAgIGF2YWlsYWJsZTogYmFja3VwLCB1cGRhdGUsIHJlZnVzZSwgcmVuYW1lLCBldGMuCisgICAgICogTXVsdGktZmlsZSB0cmFuc2ZlcnMgY2FuIGJlIGludGVycnVwdGVkIG9uIGEgcGVyLWZpbGUgYmFzaXMsCisgICAgICAgYXV0b21hdGljYWxseSBza2lwcGluZyB0byB0aGUgbmV4dCBmaWxlLgorICAgICAqIEZUUCBzZXNzaW9ucyBhcmUgWzIwOF1mdWxseSBzY3JpcHRhYmxlLgorICAgICAqIEFuIGVudGlyZSBGVFAgc2Vzc2lvbiAoY29ubmVjdCwgbG9naW4sIENELCB1cGxvYWQgb3IgZG93bmxvYWQsCisgICAgICAgbG9nb3V0KSBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aG91dCB1c2luZyBhCisgICAgICAgc2NyaXB0LgorICAgICAqIEFsbCBvZiBLZXJtaXQncyBsb2dnaW5nIG9wdGlvbnMgYW5kIGZvcm1hdHMgYXJlIGF2YWlsYWJsZSB0byBrZWVwCisgICAgICAgYW4gYWNjdXJhdGUgYW5kIGNvbXBsZXRlIHJlY29yZCBvZiBlYWNoIGNvbm5lY3Rpb24gYW5kIGZpbGUKKyAgICAgICB0cmFuc2ZlciwgYW5kIHRvIGFpZCBpbiB0cm91Ymxlc2hvb3RpbmcuCisgICAgICogQWxsIG9mIEtlcm1pdCdzIGZpbGUtdHJhbnNmZXIgZGlzcGxheSBvcHRpb25zIGFyZSBhdmFpbGFibGUKKyAgICAgICAoZnVsbHNjcmVlbiwgYnJpZWYsIENSVCwgc2VyaWFsLCBub25lKS4KKworICAgQW5kIGJlc3Qgb2YgYWxsOgorICAgICAqIEtlcm1pdCBkb2Vzbid0IGdpdmUgeW91IHRob3NlIGFubm95aW5nIHBlci1maWxlIHByb21wdHMgZXZlcnkgdGltZQorICAgICAgIHlvdSBzdGFydCBhIG11bHRpLWZpbGUgdHJhbnNmZXIgd2l0aG91dCByZW1lbWJlcmluZyB0byBnaXZlIGEKKyAgICAgICAicHJvbXB0IiBjb21tYW5kIGZpcnN0IDotKS4KKworICAgWyBbMjA5XVRvcCBdIFsgWzIxMF1GVFAgVG9wIF0gWyBbMjExXUZUUCBDbGllbnQgT3ZlcnZpZXcgXSBbIFsyMTJdRlRQCisgICBTY3JpcHQgVHV0b3JpYWwgXSBbIFsyMTNdQy1LZXJtaXQgSG9tZSBdIFsgWzIxNF1LZXJtaXQgSG9tZSBdCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4xLiBNYWtpbmcgYW5kIE1hbmFnaW5nIEZUUCBDb25uZWN0aW9ucworCisgICBFYWNoIGNvcHkgb2YgS2VybWl0IGNhbiBoYXZlIG9uZSBGVFAgY29ubmVjdGlvbiBvcGVuIGF0IGEgdGltZS4gRlRQCisgICBjb25uZWN0aW9ucyBhcmUgaW5kZXBlbmRlbnQgb2YgcmVndWxhciB0ZXJtaW5hbCBjb25uZWN0aW9uczsgYQorICAgdGVybWluYWwgY29ubmVjdGlvbiAoc2VyaWFsIG9yIG5ldHdvcmsgdmlhIFNFVCBMSU5FLCBESUFMLCBTRVQgSE9TVCwKKyAgIFRFTE5FVCwgZXRjKSBtYXkgYmUsIGJ1dCBuZWVkIG5vdCBiZSwgb3BlbiBhdCB0aGUgc2FtZSB0aW1lIGFzIGFuIEZUUAorICAgY29ubmVjdGlvbiwgYW5kIHRlcm1pbmFsIGNvbm5lY3Rpb25zIGNhbiBhbHNvIGJlIGNsb3NlZCwgYW5kIG5ldworICAgY29ubmVjdGlvbnMgb3BlbmVkLCB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggdGhlIEZUUCBjb25uZWN0aW9uIChhbmQKKyAgIHZpY2UgdmVyc2EpLiBUaHVzLCBmb3IgZXhhbXBsZSwgS2VybWl0IGNhbiBoYXZlIGFuIEZUUCBjb25uZWN0aW9uIGFuZAorICAgYSBURUxORVQgY29ubmVjdGlvbiBvcGVuIHRvIHRoZSBzYW1lIGhvc3Qgc2ltdWx0YW5lb3VzbHksIHVzaW5nIHRoZQorICAgVEVMTkVUIGNvbm5lY3Rpb24gKGUuZy4pIHRvIHNlbmQgbWFpbCBvciB0YWtlIG90aGVyIGRlc2lyZWQgYWN0aW9ucyBhcworICAgdmFyaW91cyBGVFAgYWN0aW9ucyBjb21wbGV0ZS4gT2YgY291cnNlLCBlYWNoIGNvcHkgb2YgS2VybWl0IGNhbiBkbworICAgb25seSBvbmUgdGhpbmcgYXQgYSB0aW1lLCBzbyBpdCBjYW4ndCAoZm9yIGV4YW1wbGUpIHRyYW5zZmVyIGEgZmlsZQorICAgd2l0aCBGVFAgYW5kIGFub3RoZXIgZmlsZSB3aXRoIEtlcm1pdCBwcm90b2NvbCBzaW11bHRhbmVvdXNseS4KKworICAgQSBLZXJtaXQgRlRQIHNlc3Npb24gY2FuIGJlIGVzdGFibGlzaGVkIGJ5IFsyMTVdY29tbWFuZC1saW5lIG9wdGlvbnMsCisgICBieSBbMjE2XVVSTCwgb3IgYnkgWzIxN11pbnRlcmFjdGl2ZSBjb21tYW5kcy4KKworICAgIDMuMS4xLiBLZXJtaXQgQ29tbWFuZC1MaW5lIE9wdGlvbnMgZm9yIEZUUAorCisgICBUaGUgbmV3IGNvbW1hbmQtbGluZSBvcHRpb24gJy05JyAoc29ycnksIHdlJ3JlIG91dCBvZiBsZXR0ZXJzKSBjYW4gYmUKKyAgIHVzZWQgd2hlbiBzdGFydGluZyBDLUtlcm1pdCwgdGVsbGluZyBpdCB0byBtYWtlIGFuIEZUUCBjb25uZWN0aW9uOgorCisgIGtlcm1pdCAtOSBob3N0bmFtZQorCisgICBvciBpZiBhIG5vbi1kZWZhdWx0IEZUUCBwb3J0IGlzIG5lZWRlZDoKKworICBrZXJtaXQgLTkgaG9zdG5hbWU6cG9ydAorCisgICBZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgdXNlcm5hbWUgb24gdGhlIGNvbW1hbmQgbGluZSB3aXRoIHRoZSAtTSAoIk15CisgICBVc2VyIElEIikgb3B0aW9uIHRoYXQgd2FzIGFscmVhZHkgdGhlcmUgZm9yIG90aGVyIGNvbm5lY3Rpb24gdHlwZXM6CisKKyAga2VybWl0IC05IGhvc3RuYW1lIC1NIG9sZ2EKKworICAgSWYgeW91IHNwZWNpZnkgdGhlIHVzZXJuYW1lIG9uIHRoZSBjb21tYW5kIGxpbmUsIEtlcm1pdCB1c2VzIGl0IHdoZW4KKyAgIG1ha2luZyB0aGUgY29ubmVjdGlvbiBhbmQgZG9lcyBub3QgcHJvbXB0IHlvdSBmb3IgaXQgKGJ1dCBpdCBkb2VzCisgICBwcm9tcHQgeW91IGZvciB0aGUgcGFzc3dvcmQgaWYgb25lIGlzIHJlcXVpcmVkKS4KKworICAgT25jZSB0aGUgY29ubmVjdGlvbiBpcyBtYWRlLCB5b3UgZ2V0IHRoZSByZWd1bGFyIEtlcm1pdCBwcm9tcHQsIGFuZAorICAgY2FuIGdpdmUgaW50ZXJhY3RpdmUgY29tbWFuZHMgc3VjaCBhcyB0aGUgb25lcyBkZXNjcmliZWQgYmVsb3cuIFdoZW4KKyAgIHlvdSBnaXZlIGEgQllFIGNvbW1hbmQsIEtlcm1pdCBjbG9zZXMgdGhlIHNlc3Npb24gYW5kIGV4aXRzLCBqdXN0IGFzIGEKKyAgIHJlZ3VsYXIgRlRQIGNsaWVudCB3b3VsZCBkby4gSWYgeW91IGRvbid0IHdhbnQgS2VybWl0IHRvIGV4aXQgd2hlbiB5b3UKKyAgIGdpdmUgYSBCWUUgY29tbWFuZCwgaW5jbHVkZSB0aGUgLVMgKCJTdGF5Iikgb3B0aW9uIG9uIHRoZSBjb21tYW5kCisgICBsaW5lLgorCisgICBPdGhlciBLZXJtaXQgY29tbWFuZC1saW5lIG9wdGlvbnMgdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIG5vbi1GVFAKKyAgIGNvbm5lY3Rpb25zIHNob3VsZCBhZmZlY3QgdGhlIEZUUCBzZXNzaW9uIGluIHRoZSBleHBlY3RlZCB3YXlzOyBmb3IKKyAgIGV4YW1wbGUsIC1pIGFuZCAtVCBmb3JjZSBiaW5hcnkgYW5kIHRleHQgbW9kZSB0cmFuc2ZlcnMsIHJlc3BlY3RpdmVseS4KKworICAgRmlsZSB0cmFuc2ZlcnMgY2FuIG5vdCBiZSBpbml0aWF0ZWQgb24gdGhlICJrZXJtaXQgLTkiIGNvbW1hbmQgbGluZTsKKyAgIGZvciB0aGF0IHlvdSBuZWVkIHRvIHVzZSBLZXJtaXQncyBGVFAgcGVyc29uYWxpdHkgKG5leHQgc2VjdGlvbikgb3IKKyAgIHlvdSBjYW4gdXNlIFVSTHMgKFsyMThdU2VjdGlvbiAzLjEuMykuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAzLjEuMi4gVGhlIEZUUCBDb21tYW5kLUxpbmUgUGVyc29uYWxpdHkKKworICAgSWYgeW91IHdhbnQgdG8gcmVwbGFjZSB5b3VyIHJlZ3VsYXIgRlRQIGNsaWVudCB3aXRoIEMtS2VybWl0LCB5b3UgY2FuCisgICBtYWtlIGEgbGluayBjYWxsZWQgImZ0cCIgdG8gdGhlIEMtS2VybWl0IGJpbmFyeSAob3IgeW91IGNhbiBzdG9yZSBhCisgICBjb3B5IG9mIHRoZSBDLUtlcm1pdCBiaW5hcnkgdW5kZXIgdGhlIG5hbWUgImZ0cCIpLiBXaGVuIEMtS2VybWl0IGlzCisgICBpbnZva2VkIHdpdGggYSBwcm9ncmFtIG5hbWUgb2YgImZ0cCIgKG9yICJGVFAiLCBjYXNlIGRvZXNuJ3QgbWF0dGVyKSwKKyAgIGl0IGFzc3VtZXMgdGhlIGNvbW1hbmQtbGluZSBwZXJzb25hbGl0eSBvZiB0aGUgcmVndWxhciBGVFAgY2xpZW50OgorCisgIGZ0cCBbIG9wdGlvbnMgXSBob3N0bmFtZSBbIHBvcnQgXQorCisgICBJbiB0aGlzIGNhc2UgdGhlIG9wdGlvbnMgYXJlIGxpa2UgdGhvc2Ugb2YgYSByZWd1bGFyIEZUUCBjbGllbnQ6CisKKyAgLWQgIERlYnVnOiBlbmFibGVzIGRlYnVnIG1lc3NhZ2VzIGFuZCBjcmVhdGVzIGEgZGVidWcubG9nIGZpbGUuCisgIC1uICBObyBhdXRvbG9naW46IEtlcm1pdCBzaG91bGQgbm90IHNlbmQgeW91ciB1c2VyIElEIGF1dG9tYXRpY2FsbHkuCisgIC10ICBQYWNrZXQgdHJhY2U6IGFjY2VwdGVkIGJ1dCBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIC1kLgorICAtdiAgVmVyYm9zZTogYWNjZXB0ZWQgYnV0IGlnbm9yZWQgKG9wZXJhdGlvbiBpcyB2ZXJib3NlIGJ5IGRlZmF1bHQpLgorICAtaSAgTm90IGludGVyYWN0aXZlOiBhY2NlcHRlZCBidXQgaWdub3JlZC4KKworICAgYW5kIHRoZSBob3N0bmFtZSBjYW4gYWxzbyBiZSBhIFVSTCAoZXhwbGFpbmVkIGluIFsyMTldU2VjdGlvbiAzLjEuMykuCisgICBUbyBzcGVjaWZ5IGEgbm9uLWRlZmF1bHQgVENQIHBvcnQgZm9yIHRoZSBGVFAgc2VydmVyLCBpbmNsdWRlIHRoZSBwb3J0CisgICBudW1iZXIgb3IgbmFtZSBhZnRlciB0aGUgaG9zdG5hbWUuCisKKyAgIFRoZXJlIGFyZSBhbHNvIHNvbWUgYm9udXMgb3B0aW9ucyB0aGF0IGFsbG93IHlvdSB0byBleGVjdXRlIGFuIGVudGlyZQorICAgRlRQIHNlc3Npb24gZnJvbSB0aGUgc2hlbGwgY29tbWFuZCBsaW5lLCBhcyBsb25nIGFzIHlvdSBkb24ndCBpbmNsdWRlCisgICB0aGUgLW4gb3B0aW9uLiBUaGVzZSBhcmUgbm90IGF2YWlsYWJsZSB3aXRoIHJlZ3VsYXIgRlRQIGNsaWVudHMsIGFuZAorICAgYXQgbGVhc3Qgb25lIG9mIHRoZXNlIG9wdGlvbnMgKC1nKSBjb25mbGljdHMgd2l0aCBVTklYIGZ0cCAod2hlcmUgLWcKKyAgIG1lYW5zICJubyBnbG9iYmluZyIsIHdoaWNoIGRvZXMgbm90IGFwcGx5IHRvIEtlcm1pdCksIGFuZCBzb21lIG9mIHRoZW0KKyAgIChsaWtlIHRoZSBvcHRpb25zIGFib3ZlKSBhbHNvIGNvbmZsaWN0IHdpdGggcmVndWxhciBLZXJtaXQKKyAgIGNvbW1hbmQtbGluZSBvcHRpb25zOgorCisgIC1tIG1vZGUgICAgICA9ICJwYXNzaXZlIiAoZGVmYXVsdCkgb3IgImFjdGl2ZSIKKyAgLVkgICAgICAgICAgICBEb24ndCBleGVjdXRlIHRoZSBLZXJtaXQgaW5pdGlhbGl6YXRpb24gZmlsZSBbMV0KKyAgLXEgICAgICAgICAgICBRdWlldCwgc3VwcHJlc3NlcyBhbGwgYnV0IGVycm9yIG1lc3NhZ2VzIFsxXQorICAtUyAgICAgICAgICAgIFN0YXksIGRvbid0IGV4aXQgYXV0b21hdGljYWxseSBbMV0KKyAgLUEgICAgICAgICAgICBBdXRvbG9naW4gYW5vbnltb3VzbHkgWzJdCisgIC11IG5hbWUgICAgICAgVXNlcm5hbWUgZm9yIGF1dG9sb2dpbiBbMl0gKHN5bm9ueW06IC1NIFsxXSkKKyAgLVAgcGFzc3dvcmQgICBQYXNzd29yZCBmb3IgYXV0b2xvZ2luIChzZWUgY2F1dGlvbnMgYmVsb3cpIFsyXQorICAtRCBkaXJlY3RvcnkgIGNkIGFmdGVyIGF1dG9sb2dpbiBbMl0KKyAgLWIgICAgICAgICAgICBCaW5hcnkgbW9kZSBbMl0KKyAgLWEgICAgICAgICAgICBUZXh0ICgiYXNjaWkiKSBtb2RlIFsyXSAoc3lub255bTogLVQgWzFdKQorICAtUiAgICAgICAgICAgIFJlY3Vyc2l2ZSAod29ya3Mgd2l0aCAtcCkgWzRdCisgIC1wIGZpbGVzICAgICAgRmlsZXMgdG8gcHV0ICh1cGxvYWQpIGFmdGVyIGF1dG9sb2dpbiBbMl0gKHN5bm9ueW06IC1zIFsxXSkKKyAgLWcgZmlsZXMgICAgICBGaWxlcyB0byBnZXQgKGRvd25sb2FkKSBhZnRlciBhdXRvbG9naW4gWzNdCisKKyAgIFsxXSBTYW1lIGFzIEtlcm1pdCwgbm90IGF2YWlsYWJsZSBpbiByZWd1bGFyIEZUUCBjbGllbnRzLgorICAgWzJdIENvbmZsaWN0cyB3aXRoIEtlcm1pdCwgbm90IGF2YWlsYWJsZSBpbiByZWd1bGFyIEZUUCBjbGllbnRzLgorICAgWzNdIFNhbWUgYXMgS2VybWl0LCBjb25mbGljdHMgd2l0aCByZWd1bGFyIEZUUCBjbGllbnRzLgorICAgWzRdIENvbmZsaWN0cyB3aXRoIEtlcm1pdCwgYXZhaWxhYmxlIGluIHNvbWUgRlRQIGNsaWVudHMuCisKKyAgIEZhbmNpZXIgb3B0aW9ucyBzdWNoIGFzIHJlc3RhcnQsIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24sIGZpbGVuYW1lCisgICBjb2xsaXNpb24gc2VsZWN0aW9uLCBhdXRvbWF0aWMgbW92ZS9yZW5hbWUvZGVsZXRlLCBldGMsIGFyZSBub3QKKyAgIGF2YWlsYWJsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmU7IGZvciB0aGVzZSB5b3UgY2FuIHVzZSB0aGUgY29tbWFuZHMKKyAgIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLiBUaGUgLVIgb3B0aW9uIG1pZ2h0IGFsc28gd29yaworICAgd2l0aCAtZyAoR0VUKSBidXQgdGhhdCBkZXBlbmRzIG9uIHRoZSBzZXJ2ZXIuCisKKyAgIFRoZSBmb2xsb3dpbmcgc2VjdXJpdHkgb3B0aW9ucyBhcmUgYWxzbyBhdmFpbGFibGUsIGV4cGxhaW5lZCBpbgorICAgWzIyMF1TZWN0aW9uIDMuMjoKKworICAtayByZWFsbSAgICAgIEtlcmJlcm9zIDQgcmVhbG0gWzRdCisgIC1mICAgICAgICAgICAgS2VyYmVyb3MgNSBjcmVkZW50aWFscyBmb3J3YXJkaW5nIFs0XQorICAteCAgICAgICAgICAgIGF1dG9lbmNyeXB0aW9uIG1vZGUgWzRdCisgIC1jIGNpcGhlciAgICAgU1JQIGNpcGhlciB0eXBlIFs0XQorICAtSCBoYXNoICAgICAgIFNSUCBlbmNyeXB0aW9uIGhhc2ggWzRdCisgIC16IG9wdGlvbiAgICAgU2VjdXJpdHkgb3B0aW9ucyBbNF0KKworICAgSWYgeW91IGluY2x1ZGUgLUEgb3Igc3BlY2lmeSBhIG5hbWUgb2YgImFub255bW91cyIgb3IgImZ0cCIsIHlvdSBhcmUKKyAgIGxvZ2dlZCBpbiBhbm9ueW1vdXNseSBhbmQsIGluIHRoZSBhYnNlbmNlIG9mIC1QLCBLZXJtaXQgYXV0b21hdGljYWxseQorICAgc3VwcGxpZXMgYSBwYXNzd29yZCBvZiAidXNlckBob3N0Iiwgd2hlcmUgInVzZXIiIGlzIHlvdXIgbG9jYWwgdXNlcgorICAgSUQsIGFuZCAiaG9zdCIgaXMgdGhlIGhvc3RuYW1lIG9mIHRoZSBjb21wdXRlciB3aGVyZSBLZXJtaXQgaXMKKyAgIHJ1bm5pbmcuIElmIHlvdSBkbyBub3QgaW5jbHVkZSAtcCBvciAtZywgS2VybWl0IGVudGVycyBjb21tYW5kIG1vZGUgc28KKyAgIHlvdSBjYW4gdHlwZSBjb21tYW5kcyBvciBleGVjdXRlIHRoZW0gZnJvbSBhIHNjcmlwdC4KKworICAgSWYgeW91IGluY2x1ZGUgLXAgb3IgLWcsIEtlcm1pdCBhdHRlbXB0cyB0byB0cmFuc2ZlciB0aGUgc3BlY2lmaWVkCisgICBmaWxlcyBhbmQgdGhlbiBleGl0cyBhdXRvbWF0aWNhbGx5IGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zZmVyIHVubGVzcworICAgeW91IGFsc28gaW5jbHVkZWQgLVMgKFN0YXkpLiBJdCB1c2VzIHRoZSAiYnJpZWYiIGZpbGUgdHJhbnNmZXIgZGlzcGxheQorICAgKG9uZSBsaW5lIHBlciBmaWxlKSB1bmxlc3MgeW91IGluY2x1ZGUgdGhlIC1xIG9wdGlvbiB0byBzdXBwcmVzcyBpdC4KKworICAgV2hlbiB1cGxvYWRpbmcgZmlsZXMgd2l0aCAtcCwgS2VybWl0IHN3aXRjaGVzIGF1dG9tYXRpY2FsbHkgYmV0d2VlbgorICAgdGV4dCBhbmQgYmluYXJ5IG1vZGUgZm9yIGVhY2ggZmlsZS4KKworICAgV2hlbiBkb3dubG9hZGluZywgeW91IGNhbiBlaXRoZXIgc3BlY2lmeSBhIHBhcnRpY3VsYXIgbW9kZSAodGV4dCBvcgorICAgYmluYXJ5KSB0byBiZSB1c2VkIGZvciBhbGwgdGhlIGZpbGVzLCBvciB5b3UgY2FuIGxldCBLZXJtaXQgc2VsZWN0IHRoZQorICAgdHlwZSBmb3IgZWFjaCBmaWxlIGF1dG9tYXRpY2FsbHksIGJhc2VkIG9uIGl0cyBuYW1lIChzZWUgWzIyMV1TZWN0aW9ucworICAgMy41IGFuZCBbMjIyXTMuNiBmb3IgZ3JlYXRlciBkZXRhaWwpLiBJbiBVTklYIGJlIHN1cmUgdG8gcXVvdGUgYW55CisgICB3aWxkY2FyZCBjaGFyYWN0ZXJzIHRvIHByZXZlbnQgdGhlIHNoZWxsIGZyb20gZXhwYW5kaW5nIHRoZW0sIGFzIHNob3duCisgICBpbiB0aGUgZXhhbXBsZXMganVzdCBiZWxvdy4gRmlsZW5hbWUgY29sbGlzaW9ucyBhcmUgaGFuZGxlZCBhY2NvcmRpbmcKKyAgIEtlcm1pdCdzIEZJTEUgQ09MTElTSU9OIHNldHRpbmcgKGlmIHNwZWNpZmllZCBpbiB5b3VyIEtlcm1pdAorICAgY3VzdG9taXphdGlvbiBmaWxlOyBvdGhlcndpc2UgdGhlIGRlZmF1bHQsIHdoaWNoIGlzIEJBQ0tVUCkuCisKKyAgIEl0IHNob3VsZCBnbyB3aXRob3V0IHNheWluZyB0aGF0IHRoZSAtUCBvcHRpb24gc2hvdWxkIGJlIHVzZWQgd2l0aAorICAgY2F1dGlvbi4gSW4gYWRkaXRpb24gdG8gdGhlIHdlbGwta25vd24gcmlza3Mgb2YgdHJhbnNtaXR0aW5nIHBsYWludGV4dAorICAgcGFzc3dvcmRzIG92ZXIgdGhlIEludGVybmV0LCBpbiB0aGlzIGNhc2UgdGhlIHBhc3N3b3JkIGFsc28gZWNob3MgdG8KKyAgIHRoZSBzY3JlZW4gaWYgeW91IHR5cGUgaXQsIGFuZCBjYW4gYmUgc2VlbiBpbiBwcyBhbmQgdyBsaXN0aW5ncyB0aGF0CisgICBzaG93IHRoZSB1c2VyJ3MgY3VycmVudGx5IGFjdGl2ZSBjb21tYW5kIGFuZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorICAgVGh1cyBjb21tYW5kLWxpbmUgRlRQIHNlc3Npb25zIGFyZSBtb3N0IGFwcHJvcHJpYXRlIGZvciBzZWN1cmUgb3IKKyAgIGFub255bW91cyBjb25uZWN0aW9ucyAodGhvc2UgdGhhdCBkbyBub3QgcmVxdWlyZSBwYXNzd29yZHMpLgorCisgICBIZXJlJ3MgYW4gZXhhbXBsZSBpbiB3aGljaCB5b3UgZG93bmxvYWQgdGhlIGxhdGVzdCBDLUtlcm1pdCAidGFyYmFsbCIKKyAgIGZyb20gdGhlIENvbHVtYmlhIFVuaXZlcnNpdHkgRlRQIGFyY2hpdmU6CisKKyAgZnRwIC1BIGtlcm1pdC5jb2x1bWJpYS5lZHUgLWJnIGtlcm1pdC9hcmNoaXZlcy9ja2VybWl0LnRhci5negorCisgICBUaGlzIGFzc3VtZXMgdGhhdCAiZnRwIiBpcyBhIHN5bWJvbGljIGxpbmsgdG8gQy1LZXJtaXQuIEl0IGxvZ3MgeW91IGluCisgICBhbm9ueW1vdXNseSBhbmQgZ2V0cyB0aGUgY2tlcm1pdC50YXIuZ3ogZmlsZSBpbiBiaW5hcnkgbW9kZSBmcm9tIHRoZQorICAga2VybWl0L2FyY2hpdmVzIGRpcmVjdG9yeS4KKworICAgSGVyZSdzIGEgc2xpZ2h0bHkgbW9yZSBhbWJpdGlvdXMgZXhhbXBsZSB0aGF0IGlsbHVzdHJhdGVzIENEJ2luZyB0bworICAgdGhlIGRlc2lyZWQgc2VydmVyIGRpcmVjdG9yeSB0byBnZXQgYSBncm91cCBvZiBmaWxlcyBpbiB0ZXh0IG1vZGUgKGluCisgICB0aGlzIGNhc2UgdGhlIEMtS2VybWl0IHNvdXJjZSBmaWxlcyk6CisKKyAgZnRwIC1BIGtlcm1pdC5jb2x1bWJpYS5lZHUgLUQga2VybWl0L2YgLWFnICJja1tjdXddKi5bY3doXSIgbWFrZWZpbGUKKworICAgSW4gdGhpcyBjYXNlIHdlIENEIHRvIHRoZSBrZXJtaXQvZiBkaXJlY3Rvcnkgc28gd2UgZG9uJ3QgaGF2ZSB0bworICAgaW5jbHVkZSBpdCBpbiBlYWNoIGZpbGUgc3BlY2lmaWNhdGlvbiwgYW5kIHdlIHF1b3RlIHRoZSBja1tjdXddKi5bY3doXQorICAgc3BlY2lmaWNhdGlvbiBzbyB0aGUgc2hlbGwgZG9lc24ndCBleHBhbmQgaXQsIHNpbmNlIHdlIGhhdmUgdG8gcGFzcyBpdAorICAgYXMtaXMgdG8gdGhlIHNlcnZlci4gTm90ZSBhbHNvIHRoYXQgdGhlIHF1b3RlcyBkb24ndCBnbyBhcm91bmQgdGhlCisgICBlbnRpcmUgZmlsZSBsaXN0OyBvbmx5IGFyb3VuZCBlYWNoIGZpbGUgc3BlY2lmaWNhdGlvbiB0aGF0IG5lZWRzIHRvIGJlCisgICBxdW90ZWQuCisKKyAgIEhlcmUncyBvbmUgbW9yZSBleGFtcGxlLCB0aGF0IHVwbG9hZHMgYSBkZWJ1ZyBsb2cgZmlsZSBpbiBiaW5hcnkgbW9kZQorICAgdG8gdGhlIEtlcm1pdCBpbmNvbWluZyBkaXJlY3RvcnkgKGFzIHdlIG1pZ2h0IGFzayB5b3UgdG8gZG8gd2hlbgorICAgZm9sbG93aW5nIHVwIG9uIGEgcHJvYmxlbSByZXBvcnQpOgorCisgIGZ0cCAtQSBrZXJtaXQuY29sdW1iaWEuZWR1IC1EIGtlcm1pdC9pbmNvbWluZyAtYnAgZGVidWcubG9nCisKKyAgIEluIHRoaXMgY2FzZSB0aGUgLUQgb3B0aW9uIGlzIHJlcXVpcmVkIHRvIHRlbGwgdGhlIHNlcnZlciB3aGVyZSB0byBwdXQKKyAgIHRoZSBpbmNvbWluZyBmaWxlLgorCisgICBVbmxlc3MgdGhlIC1ZIG9wdGlvbiBpcyBpbmNsdWRlZCwgeW91ciBLZXJtaXQgaW5pdGlhbGl6YXRpb24gZmlsZQorICAgKC5teWtlcm1yYyBpbiBVTklYLCBLOTUuSU5JIGluIFdpbmRvd3MpIGlzIGV4ZWN1dGVkIGJlZm9yZSB0aGUgY29tbWFuZAorICAgbGluZSBvcHRpb25zLCBzbyB5b3UgY2FuIHNldCBhbnkgRlRQLXJlbGF0ZWQgcHJlZmVyZW5jZXMgdGhlcmUsIGFzCisgICBkZXNjcmliZWQgaW4gdGhlIHN1YnNlcXVlbnQgc2VjdGlvbnMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAzLjEuMy4gVGhlIEZUUCBVUkwgSW50ZXJwcmV0ZXIKKworICAgSWYgS2VybWl0IGlzIGludm9rZWQgd2l0aCBlaXRoZXIgaXRzIHJlZ3VsYXIgcGVyc29uYWxpdHkgKGFzICJrZXJtaXQiKQorICAgICAgICAgIG9yIGl0cyBGVFAgcGVyc29uYWxpdHkgKGFzICJmdHAiKSwgeW91IGNhbiBhbHNvIGdpdmUgYSBVUkwKKyAgICAgICAgICAoVW5pdmVyc2FsIFJlc291cmNlIExvY2F0b3IpIGluc3RlYWQgb2YgYSBob3N0bmFtZSBhbmQgb3B0aW9ucywKKyAgICAgICAgICB3aXRoIG9yIHdpdGhvdXQgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQ6CisgICAgICAgICAgZnRwIGZ0cDovL3VzZXI6cGFzc3dvcmRAaG9zdC9wYXRoCisgICAgICAgICAgZnRwIGZ0cDovL3VzZXJAaG9zdC9wYXRoCisgICAgICAgICAgZnRwIGZ0cDovL0Bob3N0L3BhdGggICAob3IgZnRwOi8vOkBob3N0L3BhdGgpCisgICAgICAgICAgZnRwIGZ0cDovL2hvc3QvcGF0aAorICAgICAgICAgIGtlcm1pdCBmdHA6Ly9ob3N0L3BhdGgKKworICAgSWYgdGhlIEZUUCBwZXJzb25hbGl0eSBpcyB1c2VkLCB0aGUgc2VydmljZSBtdXN0IGJlICJmdHAiLiBJbiBhbGwKKyAgIGNhc2VzLCBhIGhvc3RuYW1lIG9yIGFkZHJlc3MgbXVzdCBiZSBpbmNsdWRlZC4gSWYgYSB1c2VyIGlzIGluY2x1ZGVkCisgICBidXQgbm8gcGFzc3dvcmQsIHlvdSBhcmUgcHJvbXB0ZWQgZm9yIHRoZSBwYXNzd29yZC4gSWYgYSBwYXRoCisgICAoZmlsZW5hbWUpIGlzIGluY2x1ZGVkOgorICAgICAqIElmICJAIiBpcyBpbmNsdWRlZCB3aXRob3V0IGEgdXNlciwgS2VybWl0IHByb21wdHMgZm9yIHRoZSB1c2VybmFtZQorICAgICAgIGFuZCBwYXNzd29yZC4KKyAgICAgKiBJZiBubyB1c2VyIGFuZCBubyAiQCIgYXJlIGluY2x1ZGVkLCAiYW5vbnltb3VzIiBpcyB1c2VkLgorICAgICAqIEdFVCBpcyBhc3N1bWVkLgorCisgICBJZiBubyBwYXRoIChhbmQgbm8gYWN0aW9uIG9wdGlvbnMpIGFyZSBpbmNsdWRlZCwgYW4gaW50ZXJhY3RpdmUgRlRQCisgICAgICAgICAgc2Vzc2lvbiBpcyBzdGFydGVkLCBhcyBpbiB0aGlzIGV4YW1wbGU6CisgICAgICAgICAgZnRwIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUKKworICAgSWYgYSBwYXRoIGlzIGluY2x1ZGVkLCBidXQgYSB1c2VybmFtZSBpcyBub3QgaW5jbHVkZWQsICJhbm9ueW1vdXMiIGlzCisgICB1c2VkIGFuZCBhbiBhcHByb3ByaWF0ZSB1c2VyQGhvc3QgcGFzc3dvcmQgaXMgc3VwcGxpZWQgYXV0b21hdGljYWxseS4KKyAgIElmIGF1dGhlbnRpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwsIEtlcm1pdCBhdHRlbXB0cyB0byBHRVQgdGhlIGZpbGUKKyAgIGluZGljYXRlZCBieSB0aGUgcGF0aCBvciwgaWYgdGhlIHBhdGggaXMgdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnksIGl0CisgICBhc2tzIHRoZSBzZXJ2ZXIgZm9yIGEgZGlyZWN0b3J5IGxpc3RpbmcuIEluIGJvdGggY2FzZXMsIEtlcm1pdAorICAgZGlzY29ubmVjdHMgZnJvbSB0aGUgc2VydmVyIGFuZCBleGl0cyBhZnRlciB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlCisgICAodW5sZXNzIHlvdSBoYXZlIGluY2x1ZGVkIHRoZSAtUyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZSkuCisKKyAgIEhlcmUncyBhbiBleGFtcGxlIHRoYXQgZ2V0cyBhIGxpc3Rpbmcgb2YgdGhlIEtlcm1pdCBkaXJlY3RvcnkgYXQgdGhlCisgICAgICAgICAgS2VybWl0IGZ0cCBzaXRlOgorICAgICAgICAgIGZ0cCBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC8KKworICAgVGhpcyBleGFtcGxlIGdldHMgdGhlIHRvcC1sZXZlbCBSRUFELk1FIGZpbGUgZnJvbSB0aGUgc2FtZSBkaXJlY3Rvcnk6CisgICAgICAgICAgZnRwIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L1JFQUQuTUUKKworICAgSGVyZSdzIHRoZSBzYW1lIGV4YW1wbGUsIGJ1dCByZXF1ZXN0aW5nIGEgdGV4dC1tb2RlIHRyYW5zZmVyOgorICAgICAgICAgIGZ0cCAtVCBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9SRUFELk1FCisgICAgICAgICAgVGhpcyBpbGx1c3RyYXRlcyB0aGF0IHlvdSBjYW4gbWl4IGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBVUkxzCisgICAgICAgICAgaWYgeW91IGRlc2lyZS4KKworICAgSGVyZSdzIGFuIGV4YW1wbGUgdGhhdCBsb2dzIGluIGFzIGEgKGZpY3RpdGlvdXMpIHJlYWwgdXNlciB0byBnZXQgYQorICAgICAgICAgIGZpbGU6CisgICAgICAgICAgZnRwIGZ0cDovL29sZ2FAZnRwLnh5emNvcnAuY29tL3Jlc3VtZS50eHQKKyAgICAgICAgICBUaGUgcGFzc3dvcmQgaXMgbm90IGluY2x1ZGVkLCBzbyBLZXJtaXQgcHJvbXB0cyBmb3IgaXQuCisKKyAgIFRoaXMgc2NoZW1lIGFsbG93cyBLZXJtaXQgdG8gYmUgdXNlZCBhcyB0aGUgRlRQIGhlbHBlciBvZiBvdGhlcgorICAgYXBwbGljYXRpb25zLCBzdWNoIGFzIFdlYiBicm93c2Vycywgd2l0aCBhbGwgaXRzIGFkdmFudGFnZXMgb3ZlciBvdGhlcgorICAgRlRQIGNsaWVudHMgKGVzcGVjaWFsbHkgdGhlIG9uZXMgdGhhdCBhcmUgYnVpbHQgaW4gdG8gbW9zdCBXZWIKKyAgIGJyb3dzZXJzKSwgZS5nLiB0aGF0IGl0IGNhbiBiZSBnaXZlbiB3aWxkY2FyZHMsIGFuZCBpdCBjYW4gcGljayB0ZXh0CisgICBhbmQgYmluYXJ5IG1vZGUgYXV0b21hdGljYWxseSBmb3IgZWFjaCBmaWxlLgorCisgICBISU5UOiBzdXBwb3NlIHNvbWVib2R5IHNlbmRzIHlvdSBhbiBGVFAgVVJMIGluIGVtYWlsLCBvciB5b3Ugc2VlIGl0IGluCisgICBzb21lIHRleHQuIElmIHlvdXIgdGVybWluYWwgc2NyZWVuIHN1cHBvcnRzIGNvcHkvcGFzdGUsIGNvcHkgdGhlIHVybCwKKyAgIGFuZCB0aGVuIGF0IHRoZSBzaGVsbCBwcm9tcHQgdHlwZSAia2VybWl0IiwgYSBzcGFjZSwgYW5kIHRoZW4gcGFzdGUKKyAgIHRoZSBVUkwsIGUuZy46CisKKyAgJCBrZXJtaXQgZnRwOi8vYWxwaGEuZ3JlZW5pZS5uZXQvcHViL21nZXR0eS9zb3VyY2UvMS4xL21nZXR0eTEuMS4yNy1PCisKKyAgICIkIGlzIHRoZSBzaGVsbCBwcm9tcHQ7IHRoZSBwYXJ0IHlvdSB0eXBlIGlzIHVuZGVybGluZWQsIHRoZSByZXN0IGlzCisgICBwYXN0ZWQgaW4uIEtlcm1pdCBkb2VzIHRoZSByZXN0LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMy4xLjQuIEludGVyYWN0aXZlIEZUUCBTZXNzaW9uIEVzdGFibGlzaG1lbnQKKworICAgQXMgeW91IHJlYWQgdGhpcyBhbmQgdGhlIGZvbGxvd2luZyBzZWN0aW9ucywgYmVhciBpbiBtaW5kIHRoYXQgYW55CisgICBjb21tYW5kIHRoYXQgY2FuIGJlIGdpdmVuIGF0IHRoZSBwcm9tcHQgY2FuIGFsc28gYmUgdXNlZCBpbiBhIHNjcmlwdAorICAgcHJvZ3JhbS4gS2VybWl0J3Mgc2NyaXB0IHByb2dyYW1taW5nIGxhbmd1YWdlIGlzIHRoZSBzYW1lIGFzIGl0cworICAgaW50ZXJhY3RpdmUgY29tbWFuZCBsYW5ndWFnZS4gWzIyM11DTElDSyBIRVJFIGlmIHlvdSB3b3VsZCBsaWtlIHRvCisgICBsZWFybiBhIGJpdCBtb3JlIGFib3V0IHNjcmlwdCB3cml0aW5nLgorCisgICBBbiBGVFAgc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZCB3aXRoIHRoZSBGVFAgT1BFTiBjb21tYW5kOgorCisgICBGVFAgWyBPUEVOIF0gWyB7IC9TU0wsIC9UTFMgfSBdIGhvc3RuYW1lIFsgc3dpdGNoZXMgXSBbIHBvcnQgXQorICAgICAgICAgIE9wZW5zIGFuIEZUUCBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBob3N0IG9uIHRoZSBnaXZlbiBwb3J0CisgICAgICAgICAgYW5kLCBpZiBGVFAgQVVUT0xPR0lOIGlzIE9OLCBhbHNvIGxvZ3MgeW91IGluIHRvIHRoZSBzZXJ2ZXIsCisgICAgICAgICAgcHJvbXB0aW5nIGZvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaWYgbmVjZXNzYXJ5LiBJZiBubyBwb3J0IGlzCisgICAgICAgICAgc3BlY2lmaWVkLCB0aGUgcmVndWxhciBGVFAgcHJvdG9jb2wgcG9ydCAoMjEpIGlzIHVzZWQuIFRoZSBPUEVOCisgICAgICAgICAga2V5d29yZCBpcyBvcHRpb25hbCAodW5sZXNzIHRoZSBob3N0bmFtZSBjb25mbGljdHMgd2l0aCBvbmUgb2YKKyAgICAgICAgICB0aGUgRlRQIGNvbW1hbmQga2V5d29yZHMsIHdoaWNoIHlvdSBjYW4gbGlzdCBieSB0eXBpbmcgImZ0cAorICAgICAgICAgID8iKS4KKworICAgVGhlIGhvc3RuYW1lIGNhbiBiZSBhbiBJUCBob3N0IG5hbWUsIG51bWVyaWMgSVAgYWRkcmVzcywgb3IgaWYgeW91CisgICBoYXZlIGEgbmV0d29yayBkaXJlY3RvcnkgYWN0aXZlIChTRVQgTkVUV09SSyBESVJFQ1RPUlk7IHNlZSBDaGFwdGVyIDYKKyAgIG9mIFsyMjRdVXNpbmcgQy1LZXJtaXQpLCBhbiBlbnRyeSBuYW1lIGluIHRoZSBkaXJlY3RvcnkuIEluIHRoZSBsYXR0ZXIKKyAgIGNhc2UsIGlmIHRoZSBnaXZlbiBob3N0bmFtZSBtYXRjaGVzIGV4YWN0bHkgb25lIGVudHJ5LCB0aGUgYXNzb2NpYXRlZAorICAgbmFtZSBvciBhZGRyZXNzIGlzIHVzZWQ7IGlmIGl0IG1hdGNoZXMgbW9yZSB0aGFuIG9uZSwgS2VybWl0IGN5Y2xlcworICAgdGhyb3VnaCB0aGVtIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0IGNhbiBiZSBvcGVuZWQ7IGlmIGl0IG1hdGNoZXMKKyAgIG5vbmUsIHRoZW4gdGhlIGhvc3RuYW1lIGlzIHVzZWQgYXMtaXMuIElmIGEgZGlyZWN0b3J5IGlzIGFjdGl2ZSBidXQKKyAgIHlvdSB3YW50IHRvIGJ5cGFzcyBkaXJlY3RvcnkgbG9va3VwLCBpbmNsdWRlIGFuICI9IiBzaWduIGF0IHRoZQorICAgYmVnaW5uaW5nIG9mIHRoZSBob3N0bmFtZSwgYW5kL29yIHVzZSBhIG51bWVyaWMgSVAgYWRkcmVzcy4KKworICAgV2hlbiBhbiBGVFAgY29ubmVjdGlvbiBpcyBvcGVuZWQsIHRoZSBkZWZhdWx0IGZpbGUtdHJhbnNmZXIgbW9kZSBpcworICAgc2V0IHRvIGJpbmFyeSBpZiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgcGxhdGZvcm1zIGFyZSBhbGlrZSAoZS5nLiBib3RoCisgICBvZiB0aGVtIGFyZSBzb21lIGtpbmQgb2YgVU5JWCksIGFuZCB0byB0ZXh0ICgiYXNjaWkiKSBpZiB0aGV5IGFyZSBub3QKKyAgIGFsaWtlLiBUaGlzIGhhcyBubyBwYXJ0aWN1bGFyIGVmZmVjdCBmb3IgdXBsb2FkaW5nIHNpbmNlIEtlcm1pdAorICAgYXV0b21hdGljYWxseSBzd2l0Y2hlcyBiZXR3ZWVuIHRleHQgYW5kIGJpbmFyeSBtb2RlIGZvciBlYWNoIGZpbGUsIGJ1dAorICAgbWlnaHQgYmUgaW1wb3J0YW50IGZvciBkb3dubG9hZGluZy4gVGhlIGNvbm5lY3Rpb24gaXMgYWxzbyBzZXQgdG8KKyAgIFN0cmVhbSBtb2RlIGFuZCBGaWxlIHN0cnVjdHVyZS4gUmVjb3JkLSBvciBwYWdlLW9yaWVudGVkIGZpbGUKKyAgIHRyYW5zZmVycyBhcmUgbm90IHN1cHBvcnRlZCBieSBDLUtlcm1pdCdzIEZUUCBjbGllbnQuCisKKyAgIFRoZSBvcHRpb25hbCBGVFAgT1BFTiBzd2l0Y2hlcyBhcmU6CisKKyAgIC9BTk9OWU1PVVMKKyAgICAgICAgICBMb2dzIHlvdSBpbiBhbm9ueW1vdXNseSwgYXV0b21hdGljYWxseSBzdXBwbHlpbmcgdXNlcm5hbWUKKyAgICAgICAgICAiYW5vbnltb3VzIiBhbmQgdXNlckBob3N0IGFzIHRoZSBwYXNzd29yZCwgYmFzZWQgb24geW91ciBsb2NhbAorICAgICAgICAgIHVzZXIgYW5kIGhvc3QgbmFtZXMuCisKKyAgIC9OT0xPR0lOCisKKyAgICAgICAgICBPdmVycmlkZXMgU0VUIEZUUCBBVVRPTE9HSU4gT04gZm9yIHRoaXMgY29ubmVjdGlvbiBvbmx5LgorCisgICAvVVNFUjpuYW1lCisgICAgICAgICAgVXNlcyB0aGUgZ2l2ZW4gdXNlcm5hbWUgdG8gbG9nIHlvdSBpbiwgdGh1cyBhdm9pZGluZyB0aGUgTmFtZToKKyAgICAgICAgICBwcm9tcHQuCisgICAgICAgICAgT3ZlcnJpZGVzIFNFVCBGVFAgQVVUT0xPR0lOIE9GRiBmb3IgdGhpcyBjb25uZWN0aW9uIG9ubHkuCisKKyAgIC9QQVNTV09SRDp0ZXh0CisgICAgICAgICAgVXNlcyB0aGUgZ2l2ZW4gdGV4dCBhcyB5b3VyIHBhc3N3b3JkLCB0aHVzIGF2b2lkaW5nIHRoZQorICAgICAgICAgIFBhc3N3b3JkOiBwcm9tcHQuIFRoaXMgc3dpdGNoIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlIGluCisgICAgICAgICAgc2NyaXB0IGZpbGVzLCB3aGljaCB3b3VsZCBiZSBhIHNlY3VyaXR5IHJpc2suCisKKyAgIC9BQ0NPVU5UOnRleHQKKyAgICAgICAgICBVc2VzIHRoZSBnaXZlbiB0ZXh0IGFzIHlvdXIgYWNjb3VudCAob3Igc2Vjb25kYXJ5IHBhc3N3b3JkLAorICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBzZXJ2ZXI7IG1vc3Qgc2VydmVycyBkbworICAgICAgICAgIG5vdCByZXF1aXJlIG9yIGFjY2VwdCBhbiBhY2NvdW50IG5hbWUpLiBJZiBhbiBhY2NvdW50IGlzIG5vdAorICAgICAgICAgIHN1cHBsaWVkLCB5b3UgYXJlIG5vdCBwcm9tcHRlZCBmb3Igb25lLgorCisgICAvUEFTU0lWRQorICAgICAgICAgIE9wZW5zIHRoZSBjb25uZWN0aW9uIGluIHBhc3NpdmUgbW9kZS4gUGFzc2l2ZSBtb2RlIGlzIHRoZQorICAgICAgICAgIGRlZmF1bHQgaW4gS2VybWl0J3MgRlRQIGNsaWVudCwgdW5saWtlIGluIG1vc3Qgb3RoZXJzLCBzaW5jZSBpdAorICAgICAgICAgIHdvcmtzIGJldHRlciB0aHJvdWdoIGZpcmV3YWxscy4gVGhlIC9QQVNTSVZFIGFuZCAvQUNUSVZFCisgICAgICAgICAgc3dpdGNoZXMgYXBwbHkgb25seSB0byB0aGUgY29ubmVjdGlvbiB0aGF0IGlzIGJlaW5nIG9wZW5lZCwgYW5kCisgICAgICAgICAgZG8gbm90IGFmZmVjdCB0aGUgZ2xvYmFsIEZUUCBQQVNTSVZFLU1PREUgc2V0dGluZy4KKworICAgL0FDVElWRQorICAgICAgICAgIE9wZW5zIHRoZSBjb25uZWN0aW9uIGluIGFjdGl2ZSBtb2RlLiBVc2UgdGhpcyBzd2l0Y2ggaWYgdGhlCisgICAgICAgICAgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgcGFzc2l2ZSBtb2RlLCBvciB1c2UgdGhlIGNvbW1hbmQgU0VUCisgICAgICAgICAgRlRQIFBBU1NJVkUtTU9ERSBPRkYuCisKKyAgIC9OT0lOSVQKKyAgICAgICAgICBBZGRlZCBpbiBDLUtlcm1pdCA4LjAuMjAxLiAgIFRlbGxzIEMtS2VybWl0IG5vdCB0byBzZW5kIFJFU1QsCisgICAgICAgICAgU1RSVSwgRkVBVCwgYW5kIE1PREUgY29tbWFuZHMgdG8gdGhlIHNlcnZlciB3aGVuIHRoZSBjb25uZWN0aW9uCisgICAgICAgICAgaXMgb3BlbmVkLCBzaW5jZSB0aGVzZSBoYXZlIGJlZW4gcmVwb3J0ZWQgdG8gY2F1c2UgY29uZnVzaW9uIGluCisgICAgICAgICAgY2VydGFpbiBzZXJ2ZXJzLgorCisgICBXaGVuIGEgdXNlcm5hbWUgb3IgcGFzc3dvcmQgaXMgbWlzc2luZywgYSBwcm9tcHQgaXMgaXNzdWVkIGF0IHRoZQorICAgY29udHJvbGxpbmcgdGVybWluYWwgYW5kIHlvdSBtdXN0IHR5cGUgdGhlIHJlc3BvbnNlOyB0aGUgcmVzcG9uc2UgY2FuCisgICBub3QgYmUgc2NyaXB0ZWQuIFVzZSB0aGUgc3dpdGNoZXMgdG8gYXZvaWQgcHJvbXB0cywgb3Igb25lIG9mIHRoZQorICAgc2VjdXJlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24sIG9yIHNlZQorICAgWzIyNV1TRVQgRlRQIEFVVE9MT0dJTiBhbmQgdGhlIFsyMjZdRlRQIFVTRVIgYW5kIHNpbWlsYXIgY29tbWFuZHMKKyAgIGRlc2NyaWJlZCBsYXRlciBpbiB0aGlzIHNlY3Rpb24uCisKKyAgIEV4YW1wbGVzOgorCisgIGZ0cCBvcGVuIGtlcm1pdC5jb2x1bWJpYS5lZHUgL2Fub255bW91cyAgOyBPcGVuIGFuZCBsb2cgaW4gYW5vbnltb3VzbHkKKyAgZnRwIGtlcm1pdC5jb2x1bWJpYS5lZHUgL2Fub255bW91cyAgICAgICA7IFRoZSBPUEVOIGtleXdvcmQgY2FuIGJlIG9taXR0ZWQKKyAgZnRwIHh5emNvcnAuY29tICAgICAgICAgICAgICAgICAgICAgICAgICA7IE9wZW4gYW5kIG1heWJlIHByb21wdCBmb3IgdXNlcm5hbWUKKyAgZnRwIHh5emNvcnAuY29tIC91c2VyOm9sZ2EgICAgICAgICAgICAgICA7IE9wZW4gYW5kIGxvZyBpbiBhcyBvbGdhCisgIGZ0cCB0ZXN0aW5nLmFiY2NvcnAuY29tIDQ0OSAgICAgICAgICAgICAgOyBTcGVjaWZ5IGEgc3BlY2lhbCBUQ1AgcG9ydCBudW1iZXIKKyAgZnRwIHRlc3RpbmcuYWJjY29ycC5jb20gL3VzZXI6b2xhZiAvcGFzc3dvcmQ6c2VjcmV0IDQ0OQorCisgICBUaGUgRlRQIE9QRU4gY29tbWFuZCBzdWNjZWVkcyBpZiBhIGNvbm5lY3Rpb24gd2FzIG9wZW5lZCB0byB0aGUgc2VydmVyCisgICAoZXZlbiBpZiB0aGUgZ2l2ZW4gdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHdlcmUgbm90IHZhbGlkKSBhbmQgZmFpbHMKKyAgIG90aGVyd2lzZSAoc2VlIFsyMjddU2VjdGlvbiAzLjggZm9yIGRldGFpbHMpLgorCisgICBXaGVuIHlvdXIgRlRQIHNlc3Npb24gaXMgY29tcGxldGUsIHlvdSBjYW4gdGVybWluYXRlIGl0IGFzIGZvbGxvd3M6CisKKyAgIEZUUCBCWUUKKyAgICAgICAgICBDbG9zZXMgdGhlIEZUUCBjb25uZWN0aW9uIGlmIG9uZSB3YXMgb3Blbi4gVGhlIEZUUCBwcmVmaXggY2FuCisgICAgICAgICAgYmUgb21pdHRlZCBpZiBubyBvdGhlciBjb25uZWN0aW9uIGlzIG9wZW4gYXQgdGhlIHNhbWUgdGltZSAoc2VlCisgICAgICAgICAgWzIyOF1TZWN0aW9uIDMuOCBmb3IgZGV0YWlscykuIElmIGEgY29ubmVjdGlvbiBsb2cgaXMgYWN0aXZlLAorICAgICAgICAgIGFuIEZUUCByZWNvcmQgaXMgd3JpdHRlbiB0byBpdC4gSWYgS2VybWl0IHdhcyBzdGFydGVkIHdpdGggdGhlCisgICAgICAgICAgLTkgY29tbWFuZC1saW5lIG9wdGlvbiBvciB3aXRoIGl0cyBGVFAgY29tbWFuZC1saW5lCisgICAgICAgICAgcGVyc29uYWxpdHksIGFuZCB0aGUgLVMgKFN0YXkpIG9wdGlvbiB3YXMgbm90IGdpdmVuLCBBTkQgdGhlcmUKKyAgICAgICAgICBpcyBubyBvdGhlciBhY3RpdmUgY29ubmVjdGlvbiwgdGhlIEZUUCBCWUUgY29tbWFuZCBhbHNvIGV4aXRzLAorICAgICAgICAgIGp1c3QgYXMgaXQgZG9lcyBvbiBhIHJlZ3VsYXIgRlRQIGNsaWVudC4gU3lub255bXM6IEZUUCBDTE9TRSwKKyAgICAgICAgICBGVFAgUVVJVCAoYnV0IGlmIHRoZSBGVFAgcHJlZml4IGlzIG9taXR0ZWQgZnJvbSBRVUlULCB0aGlzCisgICAgICAgICAgYmVjb21lcyB0aGUgcmVndWxhciBLZXJtaXQgUVVJVCBjb21tYW5kLCB3aGljaCBpcyBlcXVpdmFsZW50IHRvCisgICAgICAgICAgRVhJVDsgaS5lLiBpdCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gYW5kIGV4aXRzIGZyb20gS2VybWl0KS4KKworICAgVGhlIGZvbGxvd2luZyBjb21tYW5kcyBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIGdyZWF0ZXIgY29udHJvbCBvdmVyIHRoZQorICAgY29ubmVjdGlvbiBhbmQgbG9naW4gcHJvY2VzczoKKworICAgU0VUIEZUUCBBTk9OWU1PVVMtUEFTU1dPUkQgdGV4dAorICAgICAgICAgIEFsbG93cyB5b3UgdG8gY2hvb3NlIHRoZSBwYXNzd29yZCB0ZXh0IHRvIGJlIHNlbnQgYXV0b21hdGljYWxseQorICAgICAgICAgIGJ5IEtlcm1pdCB3aGVuIHlvdSBvcGVuIGFuIEZUUCBjb25uZWN0aW9uIHdpdGggdGhlIC9BTk9OWU1PVVMKKyAgICAgICAgICBzd2l0Y2guCisKKyAgIFNFVCBGVFAgQVVUT0xPR0lOIHsgT04sIE9GRiB9CisgICAgICAgICAgSWYgeW91IGdpdmUgdGhpcyBjb21tYW5kIHByaW9yIHRvIG9wZW5pbmcgYW4gRlRQIGNvbm5lY3Rpb24sIGl0CisgICAgICAgICAgY29udHJvbHMgd2hldGhlciBLZXJtaXQgdHJpZXMgdG8gbG9nIHlvdSBpbiBhdXRvbWF0aWNhbGx5IGFzCisgICAgICAgICAgcGFydCBvZiB0aGUgY29ubmVjdGlvbiBwcm9jZXNzLiBOb3JtYWxseSBPTiwgd2hpY2ggbWVhbnMgdGhlCisgICAgICAgICAgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSBzZW50IGF1dG9tYXRpY2FsbHkgKGFuZCBwcm9tcHRlZCBmb3IKKyAgICAgICAgICBpZiB0aGV5IGFyZSBub3QgeWV0IGtub3duKS4gV2hlbiBPRkYsIEZUUCBPUEVOIGNvbm5lY3RzIHRvIHRoZQorICAgICAgICAgIHNlcnZlciB3aXRob3V0IGxvZ2dpbmcgaW4uIE9GRiBpcyBlcXVpdmFsZW50IHRvIHRoZSAtbgorICAgICAgICAgIGNvbW1hbmQtbGluZSBvcHRpb24gd2hlbiB1c2luZyBLZXJtaXQncyBGVFAgY29tbWFuZC1saW5lCisgICAgICAgICAgcGVyc29uYWxpdHkuCisKKyAgIEZUUCBVU0VSIG5hbWUgWyBwYXNzd29yZCBbIGFjY291bnQgXSBdCisgICAgICAgICAgVXNlZCB0byBsb2cgaW4gdG8gYW4gRlRQIHNlcnZlciB0byB3aGljaCBhIGNvbm5lY3Rpb24gaGFzIGJlZW4KKyAgICAgICAgICBtYWRlIHdpdGhvdXQgYXV0b2xvZ2luLCBvciB3aGVuIGF1dG9sb2dpbiBmYWlsZWQuIElmIHRoZQorICAgICAgICAgIHBhc3N3b3JkIGlzIGZ1cm5pc2hlZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBpdCBpcyB1c2VkOworICAgICAgICAgIG90aGVyd2lzZSB5b3UgYXJlIHByb21wdGVkIGZvciBhIHBhc3N3b3JkLiBBbiBhY2NvdW50IG1heSBhbHNvCisgICAgICAgICAgYmUgZnVybmlzaGVkIGlmIHJlcXVpcmVkIGJ5IHRoZSBzZXJ2ZXI7IGl0IGlzIG5vdCByZXF1aXJlZCBieQorICAgICAgICAgIEtlcm1pdCBhbmQgaXMgbm90IHByb21wdGVkIGZvciBpZiBvbWl0dGVkLiBTeW5vbnltczogVVNFUiwgRlRQCisgICAgICAgICAgTE9HSU4uCisKKyAgIEZUUCBBQ0NPVU5UIHRleHQKKyAgICAgICAgICBTZW5kcyBhbiBhY2NvdW50IG5hbWUgdG8gYSBzZXJ2ZXIgdGhhdCBzdXBwb3J0cyBhY2NvdW50cy4gSWYKKyAgICAgICAgICB0aGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgYWNjb3VudHMsIGFuIGVycm9yIHJlc3BvbnNlIG9jY3Vycy4KKyAgICAgICAgICBJZiB0aGUgc2VydmVyIGRvZXMgc3VwcG9ydCBhY2NvdW50cywgdGhlIGFjY291bnQgaXMgYWNjZXB0ZWQgaWYKKyAgICAgICAgICBpdCBpcyB2YWxpZCBhbmQgcmVqZWN0ZWQgaWYgaXQgaXMgbm90LiBUaGUgYWNjb3VudCBtaWdodCBiZQorICAgICAgICAgIHVzZWQgZm9yIGNoYXJnaW5nIHB1cnBvc2VzIG9yIGl0IG1pZ2h0IGJlIGEgc2Vjb25kYXJ5IHBhc3N3b3JkLAorICAgICAgICAgIG9yIGl0IG1pZ2h0IGJlIHVzZWQgZm9yIGFueSBvdGhlciBwdXJwb3NlLCBzdWNoIGFzIGFuIGFjY2VzcworICAgICAgICAgIHBhc3N3b3JkIGZvciBhIHBhcnRpY3VsYXIgZGlzay4gU2VydmVycyB0aGF0IHN1cHBvcnQgYWNjb3VudHMKKyAgICAgICAgICBtaWdodCBvciBtaWdodCBub3QgYWxsb3cgb3IgcmVxdWlyZSB0aGUgYWNjb3VudCB0byBiZSBzZW50CisgICAgICAgICAgcHJpb3IgdG8gbG9naW47IHVzdWFsbHkgaXQgaXMgc2VudCBhZnRlciBsb2dpbiwgaWYgYXQgYWxsLgorICAgICAgICAgIFN5bm9ueW06IEFDQ09VTlQuCisKKyAgIEV4YW1wbGU6CisKK3NldCBmdHAgYXV0b2xvZ2luIG9mZiAgICAgICAgICAgICAgICAgIDsgT25lIHRoaW5nIGF0IGEgdGltZSBwbGVhc2UKK2Z0cCB4eXpjb3JwLmNvbSAgICAgICAgICAgICAgICAgICAgICAgIDsgVHJ5IHRvIG1ha2UgdGhlIGNvbm5lY3Rpb24KK2lmIGZhaWwgZXhpdCAxIEZUUCBjb25uZWN0aW9uIGZhaWxlZCAgIDsgQ2hlY2sgdGhhdCBpdCB3YXMgbWFkZQorZnRwIHVzZXIgb2xnYSBzZWNyZXQgICAgICAgICAgICAgICAgICAgOyBOb3cgbG9nIGluIHRvIHRoZSBzZXJ2ZXIKK2lmIGZhaWwgZXhpdCAxIEZUUCBsb2dpbiBmYWlsZWQgICAgICAgIDsgQ2hlY2sgdGhhdCBpdCB3b3JrZWQKK2Z0cCBhY2NvdW50IDEwMzg5Njg1NCAgICAgICAgICAgICAgICAgIDsgTG9naW4gT0sgLSBzZW5kIGFjY291bnQKK2lmIGZhaWwgZWNobyBXQVJOSU5HIC0gRlRQIEFDQ1QgZmFpbGVkIDsgV2FybiBpZiBwcm9ibGVtCisuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IChoYXZlIHNlc3Npb24gaGVyZSkKK2J5ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTG9nIG91dCBhbmQgZGlzY29ubmVjdAorCisgICBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSB1c2VkIHRvIGNvbnRyb2wgb3IgZ2V0IGluZm9ybWF0aW9uIGFib3V0CisgICB0aGUgRlRQIGNvbm5lY3Rpb24uIEFueSBwYXJ0aWN1bGFyIEZUUCBzZXJ2ZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkKKyAgIHN1cHBvcnQgYWxsIG9mIHRoZW0uCisKKyAgIEZUUCBSRVNFVAorICAgICAgICAgIFRlcm1pbmF0ZXMgYSB1c2VyIHNlc3Npb24gYnV0IGxlYXZlcyB0aGUgY29ubmVjdGlvbiBvcGVuLAorICAgICAgICAgIGFsbG93aW5nIGEgbmV3IGxvZ2luIHZpYSBGVFAgVVNFUi4KKworICAgRlRQIElETEUgWyBudW1iZXIgXQorICAgICAgICAgIE1vc3QgRlRQIHNlcnZlcnMgYXV0b21hdGljYWxseSBsb2cgeW91IG91dCBhbmQgYW5kIGRpc2Nvbm5lY3QKKyAgICAgICAgICB5b3VyIHNlc3Npb24gaWYgdGhlcmUgaGFzIGJlZW4gbm8gYWN0aXZpdHkgZm9yIGEgY2VydGFpbiBhbW91bnQKKyAgICAgICAgICBvZiB0aW1lLiBVc2UgdGhpcyBjb21tYW5kIHRvIGFzayB0aGUgc2VydmVyIHRvIHNldCBpdHMgaWRsZQorICAgICAgICAgIGxpbWl0IHRvIHRoZSBnaXZlbiBudW1iZXIgb2Ygc2Vjb25kcy4gT21pdCB0aGUgbnVtYmVyIHRvIGFzaworICAgICAgICAgIHRoZSBzZXJ2ZXIgdG8gaW5mb3JtIHlvdSBvZiBpdHMgY3VycmVudCBpZGxlIGxpbWl0LgorCisgICBGVFAgU1RBVFVTIFsgZmlsZW5hbWUgXQorICAgICAgICAgIEFza3MgdGhlIEZUUCBzZXJ2ZXIgdG8gc2VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudAorICAgICAgICAgIHNlc3Npb24uIFRoZSByZXN1bHQgaXMgYSBmcmVlLWZvcm1hdCByZXBvcnQgdGhhdCBtaWdodCBpbmNsdWRlCisgICAgICAgICAgc2VydmVyIGlkZW50aWZpY2F0aW9uLCB1c2VybmFtZSBhbmQgbG9naW4gdGltZSwgRlRQIHByb3RvY29sCisgICAgICAgICAgc2V0dGluZ3MsIGFuZCBmaWxlLXRyYW5zZmVyIHN0YXRpc3RpY3MuIElmIGEgZmlsZW5hbWUgaXMgZ2l2ZW4sCisgICAgICAgICAgdGhlIHNlcnZlciBpcyBzdXBwb3NlZCB0byBzZW5kIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgICAgICAgIGZpbGUuCisKKyAgIEZUUCBTWVNURU0KKyAgICAgICAgICBBc2tzIHRoZSBGVFAgc2VydmVyIHRvIGlkZW50aWZ5IGl0cyBvcGVyYXRpbmcgc3lzdGVtIChMaXN0ZWQgaW4KKyAgICAgICAgICBJbnRlcm5ldCBBc3NpZ25lZCBOdW1iZXJzLCBPcGVyYXRpbmcgU3lzdGVtIE5hbWVzKS4gRXhhbXBsZXM6CisgICAgICAgICAgVU5JWCwgVk1TLCBWTS9DTVMsIFdJTkRPV1MtTlQuIFVuZm9ydHVuYXRlbHkgbWFueSB2YXJpYXRpb25zCisgICAgICAgICAgYXJlIGFsbG93ZWQgKGUuZy4gTElOVVgtMi4wLCBMSU5VWC0yLjIsIEZSRUVCU0QsIFVMVFJJWCwgZXRjLAorICAgICAgICAgIGluc3RlYWQgb2YgVU5JWDsgV0lORE9XUy1OVC0zLCBXSU5ET1dTLU5ULTMuNSwgV0lORE9XUy1OVC0zLjUxLAorICAgICAgICAgIFdJTkRPV1MtTlQtNCwgZXRjKS4gVGhlIHJlcG9ydCBtaWdodCBhbHNvIGluY2x1ZGUgb3RoZXIKKyAgICAgICAgICBpbmZvcm1hdGlvbiBsaWtlICJUeXBlIEw4IiwgIlR5cGUgSSIsIG9yICJUeXBlIEEiLCBpbmRpY2F0aW5nCisgICAgICAgICAgdGhlIGZpbGUtdHJhbnNmZXIgbW9kZS4KKworICAgRlRQIEhFTFAgWyBrZXl3b3JkIFsga2V5d29yZCBbIC4uLiBdIF0KKyAgICAgICAgICBBc2tzIHRoZSBzZXJ2ZXIgdG8gbGlzdCB0aGUgY29tbWFuZHMgaXQgc3VwcG9ydHMuIFRoZSByZXNwb25zZQorICAgICAgICAgIGlzIHVzdWFsbHkgY3J5cHRpYywgbGlzdGluZyBGVFAgY29tbWFuZCBtbmVtb25pY3MsIG5vdCB0aGUKKyAgICAgICAgICBjb21tYW5kcyB1c2VkIGJ5IHRoZSBjbGllbnQgKHNpbmNlIHRoZSBzZXJ2ZXIgaGFzIG5vIHdheSBvZgorICAgICAgICAgIGtub3dpbmcgYW55dGhpbmcgYWJvdXQgdGhlIGNsaWVudCdzIHVzZXIgaW50ZXJmYWNlKS4gRm9yCisgICAgICAgICAgZXhhbXBsZSwgdGhlIFBVVCBjb21tYW5kIGlzIFNUT1IgaW4gRlRQIHByb3RvY29sLiBJZiBhIGtleXdvcmQKKyAgICAgICAgICBpcyBnaXZlbiwgd2hpY2ggc2hvdWxkIGJlIGFuIEZUUCBwcm90b2NvbCBjb21tYW5kLAorICAgICAgICAgIHNsaWdodGx5LW1vcmUtIGRldGFpbGVkIGhlbHAgaXMgZ2l2ZW4gYWJvdXQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICBjb21tYW5kIChpZiB0aGUgRlRQIHNlcnZlciBzdXBwb3J0cyB0aGlzIGZlYXR1cmUpLiBFeGFtcGxlczoKKyAgICAgICAgICAiZnRwIGhlbHAiLCAiZnRwIGhlbHAgc3RvciIuCisKKyAgIEZUUCBTSVRFIHRleHQKKyAgICAgICAgICAoQWR2YW5jZWQpIFNlbmRzIGFuIEZUUCBTSVRFIChzaXRlLXNwZWNpZmljKSBjb21tYW5kLiBVc3VhbGx5CisgICAgICAgICAgdGhpcyBtZWFucyB0aGF0IHRoZSBGVFAgc2VydmVyIGlzIGFza2VkIHRvIHJ1biBhbiBleHRlcm5hbAorICAgICAgICAgIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBZb3UgbWlnaHQgYmUgYWJsZSB0byBmaW5kIG91dAorICAgICAgICAgIHdoYXQgU0lURSBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIGJ5IHNlbmRpbmcgImZ0cCBoZWxwIHNpdGUiIHRvCisgICAgICAgICAgdGhlIHNlcnZlciwgYnV0IGluIGdlbmVyYWwgdGhlIGF2YWlsYWJpbGl0eSBvZiBhbmQgcmVzcG9uc2UgdG8KKyAgICAgICAgICBTSVRFIGNvbW1hbmRzIGlzIChub3Qgc3VycHJpc2luZ2x5KSBzaXRlIHNwZWNpZmljLgorCisgICBGVFAgUVVPVEUgdGV4dAorICAgICAgICAgIChBZHZhbmNlZCkgU2VuZHMgYW4gRlRQIGNvbW1hbmQgaW4gRlRQIHByb3RvY29sIGZvcm1hdC4gVXNlCisgICAgICAgICAgdGhpcyBjb21tYW5kIHRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIHNlcnZlciB0aGF0IHRoZSBGVFAgY2xpZW50CisgICAgICAgICAgbWlnaHQgbm90IGtub3cgYWJvdXQuCisKKyAgIFNIT1cgRlRQCisgICAgICAgICAgTGlzdHMgY2xpZW50IChLZXJtaXQpIEZUUCBzZXR0aW5ncyBhbmQgaW5mb3JtYXRpb24uIEFsc28gU0hPVworICAgICAgICAgIENPTk5FQ1RJT04sIFNIT1cgQ09NTVVOSUNBVElPTlMuCisKKyAgIEhFTFAgRlRQIFsga2V5d29yZCBdCisgICAgICAgICAgQXNrcyBLZXJtaXQgdG8gbGlzdCBhbmQgZGVzY3JpYmUgaXRzIGJ1aWx0LWluIEZUUCBjb21tYW5kcy4KKworICAgSEVMUCBTRVQgRlRQIFsga2V5d29yZCBdCisgICAgICAgICAgQXNrcyBLZXJtaXQgdG8gbGlzdCBhbmQgZGVzY3JpYmUgaXRzIGJ1aWx0LWluIFNFVCBGVFAgY29tbWFuZHMuCisKKyAgIFsgWzIyOV1Ub3AgXSBbIFsyMzBdRlRQIFRvcCBdIFsgWzIzMV1DLUtlcm1pdCBIb21lIF0gWyBbMjMyXUtlcm1pdAorICAgSG9tZSBdCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4yLiBNYWtpbmcgU2VjdXJlIEZUUCBDb25uZWN0aW9ucworCisgICBBbHNvIHNlZTogWzIzM11BY2Nlc3NpbmcgSUJNIEluZm9ybWF0aW9uIEV4Y2hhbmdlIHdpdGggS2VybWl0LgorCisgICBJbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgeW91IGNhbiBzZWUgc2V2ZXJhbCBleGFtcGxlcyBvZiB0cmFkaXRpb25hbAorICAgaW5zZWN1cmUgYXV0aGVudGljYXRpb246IHVzZXJuYW1lIGFuZCBwYXNzd29yZCBzZW50IGFjcm9zcyB0aGUgbmV0d29yaworICAgaW4gY2xlYXIgdGV4dC4gT2YgY291cnNlIHRoaXMgaXMgYmFkIHByYWN0aWNlIG9uIGF0IGxlYXN0IHR3byBjb3VudHM6CisgICAoMSkgc3RvcmluZyBwYXNzd29yZHMgaW4gZmlsZXMgKHN1Y2ggYXMgc2NyaXB0IGZpbGVzKSBnaXZlcyBhY2Nlc3MgdG8KKyAgIHRoZSB0YXJnZXQgc3lzdGVtcyB0byBhbnlib2R5IHdobyBjYW4gb2J0YWluIHJlYWQgYWNjZXNzIHRvIHlvdXIKKyAgIHNjcmlwdHM7IGFuZCAoMikgc2VuZGluZyB0aGlzIGluZm9ybWF0aW9uIG92ZXIgdGhlIG5ldHdvcmsgbGVhdmVzIGl0CisgICBvcGVuIHRvIGludGVyY2VwdGlvbiBieSBuZXR3b3JrIHNuaWZmZXJzIG9yIGNvbXByb21pc2VkIGhvc3RzLgorCisgICBCZWNhdXNlIG9mIHRoZSBpbmNyZWFzaW5nIG5lZWQgZm9yIHNlY3VyaXR5IG9uIHRoZSBJbnRlcm5ldCwgRlRQCisgICBzZXJ2ZXJzIGFyZSBiZWdpbm5pbmcgdG8gYXBwZWFyIHRoYXQgb2ZmZXIgc2VjdXJlIGZvcm1zIG9mCisgICBhdXRoZW50aWNhdGlvbiwgaW4gd2hpY2ggbm8gaW5mb3JtYXRpb24gaXMgc2VudCBvdmVyIHRoZSBuZXR3b3JrIHRoYXQKKyAgIHdvdWxkIGFsbG93IGFueW9uZSB3aG8gaW50ZXJjZXB0cyBpdCB0byB1c3VycCB5b3VyIGlkZW50aXR5IGFuZCBnYWluCisgICB5b3VyIGFjY2VzcyByaWdodHMuCisKKyAgIEtlcm1pdCBwcm92aWRlcyBhbiBlcXVpdmFsZW50IGZvcm0gb2YgRlRQIHNlY3VyaXR5IGZvciBlYWNoIHR5cGUgb2YKKyAgIElFVEYgc3RhbmRhcmQgc2VjdXJpdHkgaW1wbGVtZW50ZWQgaW4gVGVsbmV0LiBUaGVzZSBpbmNsdWRlCisgICBHU1NBUEktS0VSQkVST1M1LCBLRVJCRVJPUzQsIFNlY3VyZSBSZW1vdGUgUGFzc3dvcmQgKFNSUCksIGFuZAorICAgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChTU0wgYW5kIFRMUykuIEl0IGRvZXMgbm90IHByZXNlbnRseSBpbmNsdWRlCisgICBTU0wgdHVubmVsaW5nIG5vciBhbnkgZm9ybSBvZiBTU0ggdjEgb3IgdjIuIFdoZW4gS2VybWl0IGlzIGJ1aWx0IHdpdGgKKyAgIHRoZSBuZWNlc3NhcnkgbGlicmFyaWVzLCBzZWN1cmUgRlRQIGNvbm5lY3Rpb25zIGFyZSBhdHRlbXB0ZWQgYnkKKyAgIGRlZmF1bHQsIGluIHdoaWNoIGFsbCBjb25uZWN0aW9ucyBhcmUgYXV0aGVudGljYXRlZCBhbmQgdGhlIGNvbW1hbmQKKyAgIGFuZCBkYXRhIGNoYW5uZWxzIGFyZSBwcml2YXRlLgorCisgICBUaGUgdXNlIG9mIGF1dGhlbnRpY2F0aW9uIGFuZCBlbmNyeXB0aW9uIGZvciBGVFAgY29ubmVjdGlvbnMgY2FuIGJlCisgICBhZGp1c3RlZCB3aXRoIHRoZSBjb21tYW5kcyBsaXN0ZWQgYmVsb3csIHdoaWNoIGFyZSBhdmFpbGFibGUgb25seSBpZgorICAgeW91ciB2ZXJzaW9uIG9mIEtlcm1pdCB3YXMgYnVpbHQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBzZWN1cml0eQorICAgb3B0aW9ucyBhbmQgbGlicmFyaWVzOgorCisgICBTRVQgRlRQIEFVVEhUWVBFIHsgQVVUT01BVElDLCBHU1NBUEktS1JCNSwgS0VSQkVST1M0LCBTUlAsIFNTTCwgVExTIH0KKyAgICAgICAgICBTcGVjaWZpZXMgYW4gb3JkZXJlZCBsaXN0IG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgdG8gYmUKKyAgICAgICAgICBhdHRlbXB0ZWQgd2hlbiBBVVRPQVVUSEVOVElDQVRJT04gaXMgT04uIFRoZSBkZWZhdWx0IGxpc3QgaXM6CisgICAgICAgICAgR1NTQVBJLUtSQjUsIFNSUCwgS0VSQkVST1NfVjQsIFRMUywgU1NMLiBJZiBub25lIG9mIHRoZQorICAgICAgICAgIHNlbGVjdGVkIG1ldGhvZHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLCBhbiBpbnNlY3VyZSBsb2dpbgorICAgICAgICAgIGlzIHVzZWQgYXMgYSBmYWxsYmFjay4gTm90ZSwgYnkgdGhlIHdheSwgdGhhdCBTU0wgb3IgVExTIGNhbiBiZQorICAgICAgICAgIHVzZWQgdG8gc2VjdXJlIGFuIGFub255bW91cyBjb25uZWN0aW9uLgorCisgICBTRVQgRlRQIEFVVE9BVVRIRU5USUNBVElPTiB7IE9OLCBPRkYgfQorICAgICAgICAgIFRlbGxzIHdoZXRoZXIgYXV0aGVudGljYXRpb24gc2hvdWxkIGJlIG5lZ290aWF0ZWQgYnkgdGhlIEZUUAorICAgICAgICAgIE9QRU4gY29tbWFuZC4gRGVmYXVsdCBpcyBPTi4gVXNlIFNFVCBGVFAgQVVUT0FVVEhFTlRJQ0FUSU9OIE9GRgorICAgICAgICAgIHRvIGZvcmNlIGEgY2xlYXItdGV4dCwgdW5lbmNyeXB0ZWQgY29ubmVjdGlvbiB0byBGVFAgc2VydmVycworICAgICAgICAgIChzdWNoIGFzIHRoZSBvbmUgYXQgdGhlIEtlcm1pdCBGVFAgc2l0ZSkgdGhhdCBub3JtYWxseSB3b3VsZAorICAgICAgICAgIHRyeSB0byBuZWdvdGlhdGUgc2VjdXJlIGF1dGhlbnRpY2F0aW9uIGFuZCBlbmNyeXB0aW9uLgorCisgICBTRVQgRlRQIEFVVE9FTkNSWVBUSU9OIHsgT04sIE9GRiB9CisgICAgICAgICAgVGVsbHMgd2hldGhlciBlbmNyeXB0aW9uIChwcml2YWN5KSBzaG91bGQgYmUgbmVnb3RpYXRlZCBieSB0aGUKKyAgICAgICAgICBGVFAgT1BFTiBjb21tYW5kLCB3aGljaCBjYW4gaGFwcGVuIG9ubHkgaWYgc2VjdXJlCisgICAgICAgICAgYXV0aGVudGljYXRpb24gaXMgYWxzbyBuZWdvdGlhdGVkLiBEZWZhdWx0IGlzIE9OLgorCisgICBTRVQgRlRQIEFVVE9MT0dJTiB7IE9OLCBPRkYgfQorICAgICAgICAgIFRlbGxzIEtlcm1pdCB3aGV0aGVyIHRvIHRyeSBsb2dnaW5nIGluIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3UKKyAgICAgICAgICBtYWtlIGFuIEZUUCBjb25uZWN0aW9uLCBhcyBvcHBvc2VkIHRvIGxldHRpbmcgeW91IGRvIGl0ICJieQorICAgICAgICAgIGhhbmQiIHdpdGggdGhlIEZUUCBVU0VSIGNvbW1hbmQuCisKKyAgIFNFVCBGVFAgQ09NTUFORC1QUk9URUNUSU9OLUxFVkVMIHsgQ0xFQVIsIENPTkZJREVOVElBTCwgUFJJVkFURSwgU0FGRQorICAgICAgICAgIH0KKyAgICAgICAgICBEZXRlcm1pbmVzIHRoZSBsZXZlbCBvZiBwcm90ZWN0aW9uIGFwcGxpZWQgdG8gdGhlIGNvbW1hbmQKKyAgICAgICAgICBjaGFubmVsOgorCisgIENMRUFSICAgICAgICAgRGF0YSBpcyBzZW50IGluIHBsYWludGV4dCBhbmQgbm90IHByb3RlY3RlZCBhZ2FpbnN0IHRhbXBlcmluZy4KKyAgQ09ORklERU5USUFMICBEYXRhIGlzIGVuY3J5cHRlZCBidXQgbm90IHByb3RlY3RlZCBhZ2FpbnN0IHRhbXBlcmluZy4KKyAgUFJJVkFURSAgICAgICBEYXRhIGlzIGVuY3J5cHRlZCBhbmQgaXMgcHJvdGVjdGVkIGFnYWluc3QgdGFtcGVyaW5nLgorICBTQUZFICAgICAgICAgIERhdGEgaXMgc2VudCBpbiBwbGFpbnRleHQgYnV0IHByb3RlY3RlZCBhZ2FpbnN0IHRhbXBlcmluZy4KKworICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIFBSSVZBVEUuCisKKyAgIFNFVCBGVFAgQ1JFREVOVElBTC1GT1JXQVJESU5HIHsgT04sIE9GRiB9CisgICAgICAgICAgVGVsbHMgd2hldGhlciBlbmQtdXNlciBjcmVkZW50aWFscyBhcmUgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZQorICAgICAgICAgIHNlcnZlciBpZiBzdXBwb3J0ZWQgYnkgdGhlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCAoR1NTQVBJLUtSQjUKKyAgICAgICAgICBvbmx5KS4gVGhpcyBpcyBvZnRlbiByZXF1aXJlZCB0byBhbGxvdyBhY2Nlc3MgdG8gZGlzdHJpYnV0ZWQKKyAgICAgICAgICBmaWxlIHN5c3RlbXMgKGUuZy4gQUZTLikKKworICAgU0VUIEZUUCBEQVRBLVBST1RFQ1RJT04tTEVWRUwgeyBDTEVBUiwgQ09ORklERU5USUFMLCBQUklWQVRFLCBTQUZFIH0KKyAgICAgICAgICBUZWxscyB3aGF0IGxldmVsIG9mIHByb3RlY3Rpb24gaXMgYXBwbGllZCB0byBzdWJzZXF1ZW50IGRhdGEKKyAgICAgICAgICBjaGFubmVscy4gVGhlIG1lYW5pbmdzIG9mIHRoZSBwcm90ZWN0aW9uLWxldmVsIGtleXdvcmRzIGFyZSB0aGUKKyAgICAgICAgICBzYW1lIGFzIGZvciBTRVQgRlRQIENPTU1BTkQtUFJPVEVDVElPTi1MRVZFTC4gVGhlIGRlZmF1bHQgaXMKKyAgICAgICAgICBQUklWQVRFLgorCisgICBTRVQgRlRQIFNSUCBDSVBIRVIgbmFtZQorICAgICAgICAgIFNwZWNpZmllcyB0aGUgY2lwaGVyIHRvIGJlIHVzZWQgZm9yIGVuY3J5cHRpb24gd2hlbiBTUlAKKyAgICAgICAgICBhdXRoZW50aWNhdGlvbiBpcyBpbiB1c2UuIFRoZSBsaXN0IG9mIHBvc3NpYmxlIGNob2ljZXMgaXMKKyAgICAgICAgICBjb21wdXRlZCBiYXNlZCBvbiB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBsb2NhbCBTUlAgbGlicmFyeSBhbmQKKyAgICAgICAgICBpbmNsdWRlcyBOT05FIHBsdXMgemVybyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgQkxPV0ZJU0hfRUNCICAgICAgICBDQVNUNV9FQ0IgICAgICAgICAgREVTX0VDQiAgICAgICAgICBERVMzX0VDQgorICBCTE9XRklTSF9DQkMgICAgICAgIENBU1Q1X0NCQyAgICAgICAgICBERVNfQ0JDICAgICAgICAgIERFUzNfQ0JDCisgIEJMT1dGSVNIX0NGQjY0ICAgICAgQ0FTVDVfQ0ZCNjQgICAgICAgIERFU19DRkI2NCAgICAgICAgREVTM19DRkI2NAorICBCTE9XRklTSF9PRkI2NCAgICAgIENBU1Q1X09GQjY0ICAgICAgICBERVNfT0ZCNjQgICAgICAgIERFUzNfT0ZCNjQKKworICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIERFUzNfRUNCLgorCisgICBTRVQgRlRQIFNSUCBIQVNIIG5hbWUKKyAgICAgICAgICBTcGVjaWZpZXMgdGhlIGhhc2ggdG8gYmUgdXNlZCBmb3IgZGF0YSBwcm90ZWN0aW9uIHdoZW4gU1JQCisgICAgICAgICAgYXV0aGVudGljYXRpb24gaXMgaW4gdXNlLiBUaGUgY2hvaWNlcyBhcmUgTUQ1IGFuZCBTSEEuIFRoZQorICAgICAgICAgIGRlZmF1bHQgaXMgU0hBLgorCisgICBDb21tYW5kLWxpbmUgb3B0aW9uczoKKworICAgLWsgbmFtZQorICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVhbG0gdG8gYmUgdXNlZCB3aXRoIEtlcmJlcm9zIDQgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAoPSBTRVQgQVVUSCBLNCBSRUFMTSBuYW1lKS4KKworICAgLWYKKyAgICAgICAgICBFbmFibGVzIGZvcndhcmRpbmcgb2YgS2VyYmVyb3MgNSBjcmVkZW50aWFscyB0byB0aGUgaG9zdCB3aGVuCisgICAgICAgICAgdXNpbmcgR1NTQVBJIGF1dGhlbnRpY2F0aW9uICg9IFNFVCBBVVRIIEs1IEZPUldBUkRBQkxFIE9OKS4KKworICAgLXgKKyAgICAgICAgICBFbmFibGVzIGF1dG9lbmNyeXB0aW9uICg9IFNFVCBGVFAgQVVUT0VOQ1JZUFRJT04gT04pLgorCisgICAtYyBjaXBoZXIKKyAgICAgICAgICBTcGVjaWZpZXMgdGhlIGtpbmQgb2YgY2lwaGVyIHRvIGJlIHVzZWQgZm9yIGVuY3J5cHRpb24gd2l0aCBTUlAKKyAgICAgICAgICBhdXRoZW50aWNhdGlvbi4gRXF1aXZhbGVudCB0byBTRVQgRlRQIFNSUCBDSVBIRVIsIHdpdGggdGhlIHNhbWUKKyAgICAgICAgICBjaG9pY2VzLiBJZiB0aGlzIG9wdGlvbiBpcyBub3QgZ2l2ZW4sIENBU1Q1X0NCQyBpcyB1c2VkLgorCisgICAtSCBoYXNoCisgICAgICAgICAgU3BlY2lmaWVzIHRoZSBoYXNoIHRvIGJlIHVzZWQgZm9yIGVuY3J5cHRpb24gd2l0aCBTUlAKKyAgICAgICAgICBhdXRoZW50aWNhdGlvbi4gRXF1aXZhbGVudCB0byBTRVQgRlRQIFNSUCBIQVNILCB3aXRoIHRoZSBzYW1lCisgICAgICAgICAgY2hvaWNlcy4gSWYgdGhpcyBvcHRpb24gaXMgbm90IGdpdmVuLCBTSEEgaXMgdXNlZC4KKworICAgLXogZGVidWcKKyAgICAgICAgICBUdXJucyBvbiBTU0wvVExTIGRlYnVnZ2luZy4KKworICAgLXogc2VjdXJlCisgICAgICAgICAgUmVxdWlyZXMgc2VjdXJlIGNvbm5lY3Rpb24uCisKKyAgIC16IGNlcnRzb2sKKyAgICAgICAgICBTYXlzIHRvIGFjY2VwdCBhbGwgY2VydGlmaWNhdGVzIHdpdGhvdXQgY2hlY2tpbmcgdmFsaWRpdHkuCisKKyAgIC16IHZlcmlmeT1uCisgICAgICAgICAgU2V0cyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gbW9kZSB0byB0aGUgZ2l2ZW4gbnVtYmVyLCBuOgorICAgICAgICAgICAgMCA9IG5vIHZlcmlmaWNhdGlvbgorICAgICAgICAgICAgMSA9IHZlcmlmeSBjZXJ0aWZpY2F0ZSBpZiBwcmVzZW50ZWQKKyAgICAgICAgICAgIDIgPSByZXF1aXJlIHZlcmlmaWNhdGlvbiBvZiBjZXJ0aWZpY2F0ZQorCisgICAteiBjZXJ0PWZpbGVuYW1lCisgICAgICAgICAgU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIGEgY2xpZW50IGNlcnRpZmljYXRlIHRvIGJlCisgICAgICAgICAgcHJlc2VudGVkIHRvIHRoZSBGVFAgc2VydmVyLgorCisgICAteiBrZXk9ZmlsZW5hbWUKKyAgICAgICAgICBTcGVjaWZpZXMgYSBmaWxlIGNvbnRhaW5pbmcgYSBwcml2YXRlIGtleSBtYXRjaGluZyB0aGUgY2xpZW50CisgICAgICAgICAgY2VydGlmaWNhdGUuCisKKyAgIC16ICFrcmI0CisgICAgICAgICAgKG5va3JiNCkgRGlzYWJsZXMgdGhlIHVzZSBvZiBLZXJiZXJvcyA0LgorCisgICAteiAhZ3NzCisgICAteiBub2dzcworICAgICAgICAgIERpc2FibGVzIHRoZSB1c2Ugb2YgR1NTQVBJIC0gS2VyYmVyb3MgNS4KKworICAgLXogIXNycAorICAgLXogbm9zcnAKKyAgICAgICAgICBEaXNhYmxlcyB1c2Ugb2YgU1JQLgorCisgICAteiAhc3NsCisgICAteiBub3NzbAorICAgICAgICAgIERpc2FibGVzIHRoZSB1c2Ugb2YgU1NMLgorCisgICAteiAhdGxzCisgICAteiBub3RscworICAgICAgICAgIERpc2FibGVzIHRoZSB1c2Ugb2YgVExTLgorCisgICBDYXV0aW9uOiBJZiB5b3VyIEZUUCBjb25uZWN0aW9uIGlzIHNlY3VyZWQgdmlhIEFVVEggVExTLCBpdCBpcyBub3QKKyAgIHBvc3NpYmxlIHRvIGludGVycnVwdCBhIGZpbGUgdHJhbnNmZXIuIFRoaXMgaXMgYSBsaW1pdGF0aW9uIG9mIGFsbAorICAga25vd24gRlRQIHNlcnZlcnMgdGhhdCBzdXBwb3J0IEFVVEggVExTLgorCisgICBOb3RlIHRoYXQgd2hlbiB1c2luZyBjZXJ0YWluIHNlY3VyaXR5IG1ldGhvZHMsIHN1Y2ggYXMgU1NMIG9yIFRMUywgeW91CisgICBtYXkgYmUgcHJvbXB0ZWQgdG8gY29uZmlybSBvciB2ZXJpZnkgY2VydGFpbiBhY3Rpb25zIG9yIGNvbmRpdGlvbnMsCisgICBmb3IgZXhhbXBsZSwgd2hldGhlciB0byBhY2NlcHQgc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzLiBUaGlzIGNhbgorICAgaW50ZXJmZXJlIHdpdGggdW5hdHRlbmRlZCBvcGVyYXRpb24gb2Ygc2NyaXB0czsgc2VlIFsyMzRdU2VjdGlvbiAzLjEwLgorCisgICBbIFsyMzVdVG9wIF0gWyBbMjM2XUZUUCBUb3AgXSBbIFsyMzddQy1LZXJtaXQgSG9tZSBdIFsgWzIzOF1LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAzLjMuIFNldHRpbmcgRlRQIFByZWZlcmVuY2VzIEZUUCBwcmVmZXJlbmNlcyBjYW4gYmUgc2V0IGdsb2JhbGx5IGFuZAorICAgcGVyc2lzdGVudGx5IHdpdGggdGhlIGNvbW1hbmRzIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM7IG1hbnkgb2YKKyAgIHRoZXNlIGNhbiBhbHNvIGJlIG92ZXJyaWRkZW4gb24gYSBwZXItY29tbWFuZCBiYXNpcyB3aXRoIHN3aXRjaGVzIHRoYXQKKyAgIGhhdmUgdGhlIHNhbWUgbmFtZS4KKworICAgIDMuMy4xLiBMb2dzLCBNZXNzYWdlcywgYW5kIE90aGVyIEZlZWRiYWNrCisKKyAgIFlvdSBjYW4gY29udHJvbCB0aGUgYW1vdW50IG9mIGZlZWRiYWNrIHJlY2VpdmVkIGZyb20geW91ciBGVFAgc2Vzc2lvbgorICAgd2l0aCB0aGUgY29tbWFuZHMgaW4gdGhpcyBzZWN0aW9uLiBGaXJzdCwgeW91IGNhbiBjcmVhdGUgYSBsb2cgb2YgeW91cgorICAgRlRQIHRyYW5zZmVycyB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKyAgIFNFVCBUUkFOU0FDVElPTi1MT0cgeyBWRVJCT1NFLCBGVFAsIEJSSUVGIH0KKyAgICAgICAgICBTZWxlY3RzIHRoZSBsb2cgZm9ybWF0LiBWRVJCT1NFIGlzIHRoZSBkZWZhdWx0LCBhbmQgaXMKKyAgICAgICAgICBkZXNjcmliZWQgaW4gWzIzOV10aGUgbWFudWFsLiBGVFAgY2hvb3NlcyBhIFdVLUZUUEQgZm9ybWF0LCB0aGUKKyAgICAgICAgICBzYW1lIGFzIGlzIHVzZWQgYnkgdGhlIHBvcHVsYXIgRlRQIHNlcnZlci4gQlJJRUYgY3JlYXRlcworICAgICAgICAgIHBlci1maWxlIHJlY29yZHMgaW4gY29tbWEtc2VwYXJhdGVkLWxpc3QgZm9ybWF0LiBGb3IgZ3JlYXRlcgorICAgICAgICAgIGRldGFpbCwgc2VlIFsyNDBdU2VjdGlvbiA0LjE3IG9mIHRoZSBbMjQxXUMtS2VybWl0IDcuMCBVcGRhdGUKKyAgICAgICAgICBOb3Rlcy4KKworICAgTE9HIFRSQU5TQUNUSU9OUyBmaWxlbmFtZQorICAgICAgICAgIFJlY29yZHMgRlRQIChvciBLZXJtaXQsIG9yIGFueSBvdGhlciBwcm90b2NvbCkgdXBsb2FkcyBhbmQKKyAgICAgICAgICBkb3dubG9hZHMgaW4gdGhlIGdpdmVuIGZpbGUgdXNpbmcgdGhlIGZvcm1hdCBzZWxlY3RlZCBieSB0aGUKKyAgICAgICAgICBtb3N0IHJlY2VudCBTRVQgVFJBTlNBQ1RJT04tTE9HIGNvbW1hbmQsIGlmIGFueSwgb3IgZWxzZSB0aGUKKyAgICAgICAgICBkZWZhdWx0IGZvcm1hdC4KKworICAgRlRQIHNjcmVlbiBtZXNzYWdlcyBhbmQgZGlzcGxheXMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIGZvbGxvd2luZworICAgY29tbWFuZHM6CisKKyAgIFNFVCBUUkFOU0ZFUiBESVNQTEFZIHsgRlVMTFNDUkVFTiwgQ1JULCBTRVJJQUwsIEJSSUVGLCBOT05FLCBPRkYgfQorICAgICAgICAgIEZUUCB0cmFuc2ZlcnMgdXNlIEtlcm1pdCdzIG5vcm1hbCBmaWxlLXRyYW5zZmVyIGRpc3BsYXkgc3R5bGVzLgorICAgICAgICAgIFVzZSB0aGlzIGNvbW1hbmQgdG8gY2hvb3NlIHRoZSBkZXNpcmVkIGZvcm1hdDsgdGhlIGRlZmF1bHQgb24KKyAgICAgICAgICBtb3N0IHBsYXRmb3JtcyBpcyBGVUxMU0NSRUVOLiBUaGUgZGlzcGxheSBpcyBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgZGlzYWJsZWQgaWYgS2VybWl0IGlzIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQgb3IgaW4gYmF0Y2guCisgICAgICAgICAgQlJJRUYgaXMgYWx3YXlzIHVzZWQgZm9yIGNvbW1hbmQtbGluZSBpbml0aWF0ZWQgdHJhbnNmZXJzCisgICAgICAgICAgKHVubGVzcyBzdXBwcmVzc2VkIGJ5IC1xKS4gV2hpbGUgYSBmaWxlLXRyYW5zZmVyIGlzIGluCisgICAgICAgICAgcHJvZ3Jlc3MsIHlvdSBjYW4gaW50ZXJydXB0IGl0IGluIHRoZSBub3JtYWwgS2VybWl0IHdheSBieQorICAgICAgICAgIHR5cGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBrZXlzIG9yIGtleSBjb21iaW5hdGlvbnM6CisgICAgICAgICAgICBYIC0gQ2FuY2VsIGN1cnJlbnQgZmlsZSBidXQgZ28gb24gdG8gdGhlIG5leHQgb25lIChpZiBhbnkpLgorICAgICAgICAgICAgWiAtIENhbmNlbCB0aGUgZW50aXJlIHRyYW5zZmVyLiAgIEN0cmwtTCBvciBDdHJsLVcgLSBSZWZyZXNoCisgICAgICAgICAgdGhlIGZpbGUtdHJhbnNmZXIgZGlzcGxheSAoaWYgYW55KS4KKworICAgU0VUIEZUUCBESVNQTEFZIHsgRlVMTFNDUkVFTiwgQ1JULCBTRVJJQUwsIEJSSUVGLCBOT05FLCBPRkYgfQorICAgICAgICAgIExpa2UgU0VUIFRSQU5TRkVSIERJU1BMQVksIGJ1dCBhcHBsaWVzIG9ubHkgdG8gRlRQIGNvbm5lY3Rpb25zLAorICAgICAgICAgIGFuZCBkb2VzIG5vdCBhZmZlY3QgS2VybWl0LSBvciBvdGhlciBwcm90b2NvbCBmaWxlIHRyYW5zZmVycy4KKworICAgU0VUIFFVSUVUIHsgT04sIE9GRiB9CisgICAgICAgICAgVGhpcyBjb21tYW5kIGFwcGxpZXMgdG8gS2VybWl0IGluIGdlbmVyYWwsIG5vdCBqdXN0IEZUUC4gT0ZGIGJ5CisgICAgICAgICAgZGVmYXVsdDsgd2hlbiBPTiwgaXQgc3VycHJlc3NlcyBtb3N0IG1lc3NhZ2VzIGZyb20gbW9zdAorICAgICAgICAgIGNvbW1hbmRzIGFzIHdlbGwgYXMgdGhlIGZpbGUtdHJhbnNmZXIgZGlzcGxheS4KKworICAgU0VUIEZUUCBQUk9HUkVTUy1NRVNTQUdFUyB7IE9OLCBPRkYgfQorICAgICAgICAgIFRlbGxzIHdoZXRoZXIgS2VybWl0IHNob3VsZCBwcmludCBsb2NhbGx5LWdlbmVyYXRlZCBmZWVkYmFjaworICAgICAgICAgIG1lc3NhZ2VzIGZvciBlYWNoIG5vbi1maWxlLXRyYW5zZmVyIGNvbW1hbmQuIE9OIGJ5IGRlZmF1bHQuCisKKyAgIFNFVCBGVFAgVkVSQk9TRS1NT0RFIHsgT04sIE9GRiB9CisgICAgICAgICAgVGVsbHMgd2hldGhlciB0byBkaXNwbGF5IGFsbCByZXNwb25zZXMgZnJvbSB0aGUgRlRQIHNlcnZlci4gT0ZGCisgICAgICAgICAgYnkgZGVmYXVsdC4gVGhpcyBzaG93cyBhbGwgcmVzcG9uc2VzIHRvIGFsbCBjb21tYW5kcywgZXhjZXB0CisgICAgICAgICAgd2hlbiB0aGUgZmlsZS10cmFuc2ZlciBkaXNwbGF5IGlzIGFjdGl2ZSwgYW5kIHVubGVzcyB5b3UgaGF2ZQorICAgICAgICAgIFNFVCBRVUlFVCBPTi4gV2hlbiBPRkYsIHJlc3BvbnNlcyBhcmUgc2hvd24gb25seSBmb3IgY29tbWFuZHMKKyAgICAgICAgICBzdWNoIGFzIEZUUCBQV0Qgd2hvc2UgcHVycG9zZSBpcyB0byBkaXNwbGF5IGEgcmVzcG9uc2UuCisKKyAgIFNFVCBGVFAgREVCVUcgeyBPTiwgT0ZGIH0KKyAgICAgICAgICBUZWxscyB3aGV0aGVyIGxvY2FsIGNsaWVudCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gc2hvdWxkIGJlCisgICAgICAgICAgZGlzcGxheWVkLiBPRkYgYnkgZGVmYXVsdC4gV2hlbiBPTiwgdGhlIGNvbW1hbmRzIHRoYXQgYXJlIHNlbnQKKyAgICAgICAgICB0byB0aGUgc2VydmVyIGFyZSBzaG93biwgYXMgd2VsbCBhcyBpdHMgcmVzcG9uc2VzIChldmVuIGlmCisgICAgICAgICAgVkVSQk9TRS1NT0RFIGlzIE9GRiksIHBsdXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisgICAgICAgICAgYXJlIHByaW50ZWQgcmVnYXJkaW5nIHRoZSBwcm9ncmVzcyBvZiBzZWN1cmUgb3BlcmF0aW9ucy4gQWxzbywKKyAgICAgICAgICB0aGUgdGVtcG9yYXJ5IGZpbGUgY3JlYXRlZCBieSB0aGUgWzI0Ml1NR0VUIGNvbW1hbmQgaXMgbm90CisgICAgICAgICAgZGVsZXRlZCBzbyB5b3UgY2FuIHNlZSB3aGF0J3MgaW4gaXQuCisKKyAgIFNldCBhbGwgb2YgdGhlc2UgdG8gT0ZGIHdoZW4gc2lsZW50IHJ1bm5pbmcgaXMgZGVzaXJlZC4KKworICAgIDMuMy4yLiBPcGVyYXRpb25hbCBQcmVmZXJlbmNlcworCisgICBGVFAgRElTQUJMRSBuZXctcHJvdG9jb2wtZmVhdHVyZS1uYW1lCisgICBGVFAgRU5BQkxFIG5ldy1wcm90b2NvbC1mZWF0dXJlLW5hbWUKKyAgICAgICAgICBFeHBsYWluZWQgaW4gWzI0M11TZWN0aW9uIDMuMTEuCisKKyAgIFNFVCBGVFAgQVVUT0xPR0lOIHsgT04sIE9GRiB9CisgICAgICAgICAgSWYgeW91IGdpdmUgdGhpcyBjb21tYW5kIHByaW9yIHRvIG9wZW5pbmcgYW4gRlRQIGNvbm5lY3Rpb24sIGl0CisgICAgICAgICAgY29udHJvbHMgd2hldGhlciBLZXJtaXQgdHJpZXMgdG8gbG9nIHlvdSBpbiBhdXRvbWF0aWNhbGx5IGFzCisgICAgICAgICAgcGFydCBvZiB0aGUgY29ubmVjdGlvbiBwcm9jZXNzLiBOb3JtYWxseSBPTiwgd2hpY2ggbWVhbnMgdGhlCisgICAgICAgICAgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSBzZW50IGF1dG9tYXRpY2FsbHkgKGFuZCBwcm9tcHRlZCBmb3IKKyAgICAgICAgICBpZiB0aGV5IGFyZSBub3QgeWV0IGtub3duKS4gV2hlbiBPRkYsIEZUUCBPUEVOIGNvbm5lY3RzIHRvIHRoZQorICAgICAgICAgIHNlcnZlciB3aXRob3V0IGxvZ2dpbmcgaW4uIE9GRiBpcyBlcXVpdmFsZW50IHRvIHRoZSAtbgorICAgICAgICAgIGNvbW1hbmQtbGluZSBvcHRpb24gd2hlbiB1c2luZyBLZXJtaXQncyBGVFAgY29tbWFuZC1saW5lCisgICAgICAgICAgcGVyc29uYWxpdHkuIFNlZSBbMjQ0XVNlY3Rpb24gMy4xLjQgZm9yIHVzYWdlLgorCisgICBTRVQgRlRQIFBBU1NJVkUtTU9ERSB7IE9OLCBPRkYgfQorICAgICAgICAgIE9OIGJ5IGRlZmF1bHQsIHRvIGF2b2lkIHJhbmRvbSBUQ1AgcG9ydCBhc3NpZ25tZW50IGZvciBkYXRhCisgICAgICAgICAgY29ubmVjdGlvbnMsIHdoaWNoIGNhbiBwcmV2ZW50IEZUUCBwcm90b2NvbCBmcm9tIHdvcmtpbmcKKyAgICAgICAgICB0aHJvdWdoIGZpcmV3YWxscyBhbmQgbmV0d29yayBhZGRyZXNzIHRyYW5zbGF0b3JzIChmb3IgbW9yZSBvbgorICAgICAgICAgIHRoZXNlIHRvcGljcywgc2VlIHRoZSBbMjQ1XUtlcm1pdCBzZWN1cml0eSByZWZlcmVuY2UuIFNldCB0bworICAgICAgICAgIE9GRiBpbiBjYXNlIHRoZSBGVFAgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgcGFzc2l2ZSBtb2RlLCBvciBpbgorICAgICAgICAgIGNhc2UgdGhlIGNsaWVudCBoYXMgcHJvYmxlbXMgd2l0aCBpdCAoaXQgaGFzIGJlZW4gb2JzZXJ2ZWQsIGZvcgorICAgICAgICAgIGV4YW1wbGUsIHRoYXQgd2hlbiB1c2luZyBwYXNzaXZlIG1vZGUsIHRoZSBTQ08gWEVOSVggMi4zLjQKKyAgICAgICAgICBUQ1AvSVAgc3RhY2sgaGFuZ3MgaW4gdGhlIGNvbm5lY3QoKSBjYWxsIGZvcmV2ZXIpLiBTeW5vbnltczoKKyAgICAgICAgICBQQVNTSVZFIFsgT04gXSwgUEFTU0lWRSBPRkYsIFBBU1YgWyBPTiBdLCBQQVNWIE9GRi4KKworICAgU0VUIEZUUCBTRU5ELVBPUlQtQ09NTUFORFMgeyBPTiwgT0ZGIH0KKyAgICAgICAgICBUaGlzIGNvbW1hbmQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBGVFAgY2xpZW50IHNlbmRzIGEgbmV3IFBPUlQKKyAgICAgICAgICBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgd2hlbiBhY2NlcHRpbmcgaW5jb21pbmcgZGF0YSBjb25uZWN0aW9ucworICAgICAgICAgIChhcyB3aGVuIG5vdCB1c2luZyBwYXNzaXZlIG1vZGUuKSBXaGVuIFBBU1NJVkUtTU9ERSBpcyBPRkYgYW5kCisgICAgICAgICAgU0VUIFNFTkQtUE9SVCBpcyBPRkYsIHRoZSBwb3J0IHRoYXQgd2FzIG9yaWdpbmFsbHkgc3BlY2lmaWVkIGlzCisgICAgICAgICAgcmV1c2VkLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBub3JtYWwgRlRQIGNsaWVudHMgYnV0CisgICAgICAgICAgaXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBtYW55IGZpcmV3YWxscy4KKworICAgU0VUIEZUUCBDSEFSQUNURVItU0VULVRSQU5TTEFUSU9OIHsgT04sIE9GRiB9CisgICAgICAgICAgV2hldGhlciB0byB0cmFuc2xhdGUgY2hhcmFjdGVyIHNldHMgd2hlbiB0cmFuc2ZlcnJpbmcgZmlsZXMKKyAgICAgICAgICB3aXRoIEZUUCAoZXhwbGFpbmVkIGluIFsyNDZdU2VjdGlvbiAzLjcpLiBPRkYgYnkgZGVmYXVsdC4KKworICAgU0VUIEZUUCBTRVJWRVItQ0hBUkFDVEVSLVNFVCBuYW1lCisgICAgICAgICAgVGVsbHMgS2VybWl0IHRoZSBjaGFyYWN0ZXIgc2V0IHVzZWQgYnkgdGhlIEZUUCBzZXJ2ZXIsIFVURi04IGJ5CisgICAgICAgICAgZGVmYXVsdCAoWzI0N11TZWN0aW9uIDMuNykuCisKKyAgIFNFVCBGVFAgU0VSVkVSLVRJTUUtT0ZGU0VUIGRlbHRhLXRpbWUKKyAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gYXBwbHkgdGhlIGdpdmVuIFsyNDhdZGVsdGEgdGltZSB0byBmaWxlCisgICAgICAgICAgdGltZXN0YW1wcyBwcm92aWRlZCBieSB0aGUgc2VydmVyIGZvciBpdHMgZmlsZXM7IGZvciB1c2Ugd2hlbgorICAgICAgICAgIChmb3IgZXhhbXBsZSkgdGhlIHNlcnZlciBkb2VzIG5vdCBoYXZlIGl0cyB0aW1lem9uZSBzZXQKKyAgICAgICAgICBjb3JyZWN0bHkuCisKKyAgIFNFVCBGVFAgRVJST1ItQUNUSU9OIHsgUFJPQ0VFRCwgUVVJVCB9CisgICAgICAgICAgV2hlbiB0cmFuc2ZlcnJpbmcgYSBncm91cCBvZiBmaWxlcyB3aXRoIEZUUCwgYW5kIGFuIGVycm9yCisgICAgICAgICAgb2NjdXJzIHdpdGggb25lIG9mIHRoZSBmaWxlcywgS2VybWl0IG5vcm1hbGx5IGdvZXMgb24gdGhlIG5leHQKKyAgICAgICAgICBmaWxlLiBVc2UgU0VUIEZUUCBFUlJPUi1BQ1RJT04gdG8gUVVJVCB0byBtYWtlIEtlcm1pdCBzdG9wIHRoZQorICAgICAgICAgIHRyYW5zZmVyIGltbWVkaWF0ZWx5IGFuZCBmYWlsIGlmIGFuIGVycm9yIG9jY3VycyB3aXRoIGFueQorICAgICAgICAgIHNpbmdsZSBmaWxlIGluIHRoZSBncm91cC4gRXhhbXBsZTogeW91IGhhdmUgZ2l2ZW4gS2VybWl0IGEgbGlzdAorICAgICAgICAgIG9mIGZpbGVzIHRvIHNlbmQsIGFuZCBvbmUgb2YgdGhlIGZpbGVzIGNhbiBub3QgYmUgZm91bmQsIG9yCisgICAgICAgICAgcmVhZCBwZXJtaXNzaW9uIGlzIGRlbmllZC4gTm90ZSB0aGF0IGNhbmNlbGxpbmcgYSBmaWxlIGJ5CisgICAgICAgICAgdHlwaW5nICdYJyBkdXJpbmcgdHJhbnNmZXIgaXMgbm90IGNvbnNpZGVyZWQgYW4gZXJyb3IgKGlmIHlvdQorICAgICAgICAgIHdhbnQgdG8gY2FuY2VsIHRoZSBlbnRpcmUgdHJhbnNmZXIsIHR5cGUgJ1onIG9yIEN0cmwtQykuCisKKyAgIFNFVCBGVFAgUEVSTUlTU0lPTlMgeyBBVVRPLCBPTiwgT0ZGIH0KKyAgICAgICAgICBXaGVuIHVwbG9hZGluZyBmaWxlcyB3aXRoIFBVVCBvciBNUFVULCB0aGlzIHRlbGxzIHdoZXRoZXIKKyAgICAgICAgICBLZXJtaXQgc2hvdWxkIHNlbmQgZWFjaCBmaWxlJ3MgcGVybWlzc2lvbnMuIFRoZSBkZWZhdWx0IGlzIE9GRiwKKyAgICAgICAgICB3aGljaCBtZWFucyBub3QgdG8gc2VuZCBwZXJtaXNzaW9ucywgaW4gd2hpY2ggY2FzZSB0aGUgdXBsb2FkZWQKKyAgICAgICAgICBmaWxlJ3MgcGVybWlzc2lvbnMgYXJlIHNldCBieSB0aGUgRlRQIHNlcnZlciBhY2NvcmRpbmcgdG8gaXRzCisgICAgICAgICAgb3duIGNyaXRlcmlhLiBPTiBtZWFucyB0byBzZW5kIHRoZW0sIEFVVE8gbWVhbnMgdG8gc2VuZCB0aGVtCisgICAgICAgICAgb25seSBpZiB0aGUgY2xpZW50IChLZXJtaXQpIGFuZCBzZXJ2ZXIgYXJlIG9uIGxpa2UgcGxhdGZvcm1zCisgICAgICAgICAgKGUuZy4gYm90aCBVTklYKS4gVGhpcyBjb21tYW5kIGhhcyBubyBlZmZlY3Qgd2hlbiBkb3dubG9hZGluZywKKyAgICAgICAgICBzaW5jZSB0aGUgRlRQIHByb3RvY29sIGRvZXMgbm90IGluY2x1ZGUgYSB3YXkgZm9yIHRoZSBzZXJ2ZXIgdG8KKyAgICAgICAgICBpbmZvcm0gdGhlIGNsaWVudCBvZiBhIGZpbGUncyBwZXJtaXNzaW9ucy4gQWxzbyBzZWUgWzI0OV1GVFAKKyAgICAgICAgICBQVVQgL1BFUk1JU1NJT05TLiBOb3RlIHRoYXQgc2V0dGluZyBwZXJtaXNzaW9ucyBhZnRlciB1cGxvYWRpbmcKKyAgICAgICAgICBpcyBsaWtlbHkgdG8gd29yayAoY29ycmVjdGx5IG9yIGF0IGFsbCkgb25seSB3aGVuIHRoZSBjbGllbnQKKyAgICAgICAgICBhbmQgc2VydmVyIHBsYXRmb3JtcyBhcmUgYWxpa2UgKGUuZy4gYm90aCBvZiB0aGVtIGFyZSBzb21lIGZvcm0KKyAgICAgICAgICBvZiBVTklYKS4gQWxzbyBub3RlIHRoYXQgV2luZG93cyBmaWxlcyBkb24ndCBoYXZlIHBlcm1pc3Npb25zLgorICAgICAgICAgIEFsc28gc2VlIFsyNTBdRlRQIENITU9ELgorCisgICBTRVQgRlRQIERBVEVTIHsgT04sIE9GRiB9CisgICAgICAgICAgV2hlbiBkb3dubG9hZGluZyBmaWxlcyB3aXRoIEdFVCBvciBNR0VULCB0aGlzIHRlbGxzIHdoZXRoZXIKKyAgICAgICAgICBLZXJtaXQgc2hvdWxkIHRyeSB0byBzZXQgdGhlIHJlY2VpdmVkIGZpbGUncyBkYXRlIGZyb20gdGhlCisgICAgICAgICAgc2VydmVyJ3MgZGF0ZS4gRlRQIERBVEVTIGlzIE9OIGJ5IGRlZmF1bHQuIE5vdGUsIGhvd2V2ZXIsIHRoYXQKKyAgICAgICAgICBGVFAgcHJvdG9jb2wgZG9lcyBub3QgYWxsb3cgZGF0ZSBwcmVzZXJ2YXRpb24gd2hlbiB1cGxvYWRpbmcuCisgICAgICAgICAgU28gYXQgYmVzdCwgU0VUIEZUUCBEQVRFUyBPTiBjYW4gd29yayBvbmx5IHdoZW4gZG93bmxvYWRpbmcsCisgICAgICAgICAgYW5kIHRoZW4gb25seSB3aGVuIHRoZSBzZXJ2ZXIgYWdyZWVzIHRvIGZ1cm5pc2ggZmlsZSBkYXRlcy4KKworICAgU0VUIEZUUCBGSUxFTkFNRVMgeyBBVVRPLCBDT05WRVJURUQsIExJVEVSQUwgfQorICAgICAgICAgIFdoZW4gdXBsb2FkaW5nIChzZW5kaW5nKSBmaWxlcywgdGhpcyB0ZWxscyB3aGV0aGVyIHRvIGNvbnZlcnQKKyAgICAgICAgICBvdXRib3VuZCBmaWxlbmFtZXMgdG8gImNvbW1vbiBmb3JtIi4gVGhpcyBtZWFucyBhbGxvd2luZyBvbmx5CisgICAgICAgICAgb25lIHBlcmlvZCBpbiBhIG5hbWUsIHVwcGVyY2FzaW5nIGFueSBsb3dlcmNhc2UgbGV0dGVycywKKyAgICAgICAgICByZXBsYWNpbmcgc3BhY2VzIGJ5IHVuZGVyc2NvcmVzLCBldGMuIEFVVE9NQVRJQyBpcyB0aGUgZGVmYXVsdCwKKyAgICAgICAgICBtZWFuaW5nIExJVEVSQUwgd2hlbiBjbGllbnQgYW5kIHNlcnZlciBhcmUgdGhlIHNhbWUgdHlwZSBvZgorICAgICAgICAgIHN5c3RlbSAoZS5nLiBVTklYKSBhbmQgQ09OVkVSVEVEIG90aGVyd2lzZS4gU3BlY2lhbCBjYXNlOiBpZgorICAgICAgICAgIHRoZSBzZXR0aW5nIGlzIEFVVE9NQVRJQyBhbmQgdGhlIGNsaWVudCBpcyBub3QgVU5JWCBhbmQgdGhlCisgICAgICAgICAgc2VydmVyIGlkZW50aWZpZXMgaXRzZWxmIGFzIFVOSVgsIEtlcm1pdCB1c2VzIGEgbGVzcy1zdHJpY3QKKyAgICAgICAgICBmb3JtIG9mIGNvbnZlcnNpb24sIGluIHdoaWNoIGxvd2VyY2FzZSBsZXR0ZXJzIGFyZSBub3QKKyAgICAgICAgICB1cHBlcmNhc2VkIGFuZCB0aGUgZmlsZW5hbWUgY2FuIGNvbnRhaW4gYW55IG51bWJlciBvZiBwZXJpb2RzLAorICAgICAgICAgIGJ1dCBzcGFjZXMgYXJlIHN0aWxsIGNvbnZlcnRlZCB0byB1bmRlcnNjb3JlLiBXaGVuIHJlY2VpdmluZywKKyAgICAgICAgICBjb252ZXJzaW9uIGdlbmVyYWxseSBtZWFucyB0byBjaGFuZ2UgYWxsLXVwcGVyY2FzZSBuYW1lcyB0bworICAgICAgICAgIGxvd2VyY2FzZSBhbmQgc3BhY2VzIHRvIHVuZGVyc2NvcmUuCisKKyAgIFNFVCBGVFAgVU5JUVVFLVNFUlZFUi1OQU1FUyB7IE9OLCBPRkYgfQorICAgICAgICAgIEFwcGxpZXMgb25seSB0byB1cGxvYWRzLiBUZWxscyB0aGUgc2VydmVyIHRvIGNyZWF0ZSBuZXcsIHVuaXF1ZQorICAgICAgICAgIG5hbWVzIGZvciBpbmNvbWluZyBmaWxlcyB0aGF0IGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgZXhpc3RpbmcKKyAgICAgICAgICBmaWxlcy4gT0ZGIGJ5IGRlZmF1bHQsIGluIHdoaWNoIGNhc2UgdGhlIHNlcnZlciBvdmVyd3JpdGVzCisgICAgICAgICAgZXhpc3RpbmcgZmlsZXMgd2l0aCBuZXcgZmlsZXMgb2YgdGhlIHNhbWUgbmFtZS4gV2hlbiBPTiwgdGhlCisgICAgICAgICAgc2VydmVyIHVzZXMgaXRzIG93biBidWlsdC1pbiBtZXRob2QgZm9yIGNyZWF0aW5nIG5ldyBuYW1lcyBmb3IKKyAgICAgICAgICBpbmNvbWluZyBmaWxlczsgZm9yIGV4YW1wbGUsIGFwcGVuZGluZyBhIHBlcmlvZCAoLikgYW5kIGEKKyAgICAgICAgICBudW1iZXIgdG8gdGhlIG5hbWUuIENBVVRJT046IFVzZSB0aGlzIG9wdGlvbiBvbmx5IGlmIHlvdSBkbyBub3QKKyAgICAgICAgICBuZWVkIHRvIHJlZmVyIHRvIHRoZSBmaWxlIGFmdGVyIGl0IGlzIHVwbG9hZGVkLCBzaW5jZSBGVFAKKyAgICAgICAgICBwcm90b2NvbCBwcm92aWRlcyBubyBtZWNoYW5pc20gZm9yIHRoZSBjbGllbnQgdG8gZmluZCBvdXQgd2hhdAorICAgICAgICAgIG5hbWUgd2FzIGFzc2lnbmVkIGJ5IHRoZSBzZXJ2ZXIuCisKKyAgIFNFVCBGVFAgQ09MTElTSU9OIHsgLi4uIH0KKyAgICAgICAgICBXaGVuIGRvd25sb2FkaW5nLCB3aGF0IHRvIGRvIGlmIGFuIGluY29taW5nIGZpbGUgaGFzIHRoZSBzYW1lCisgICAgICAgICAgbmFtZSBhcyBhbiBleGlzdGluZyBmaWxlLiBPcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgU0VUIEZJTEUKKyAgICAgICAgICBDT0xMSVNJT04uIElmIHRoaXMgY29tbWFuZCBpcyBub3QgZ2l2ZW4sIEtlcm1pdCdzIHJlZ3VsYXIgRklMRQorICAgICAgICAgIENPTExJU0lPTiBzZXR0aW5nIGlzIHVzZWQuIElmIHRoaXMgY29tbWFuZCBpcyBnaXZlbiwgaXQKKyAgICAgICAgICBvdmVycmlkZXMgdGhlIEZJTEUgQ09MTElTSU9OIHNldHRpbmcgZm9yIEZUUCB0cmFuc2ZlcnMgb25seS4KKyAgICAgICAgICBTZWUgWzI1MV1TZWN0aW9uIDMuNi4yIGZvciBkZXRhaWxzLgorCisgICBTRVQgRlRQIFRZUEUgeyBURVhULCBCSU5BUlksIFRFTkVYIH0KKyAgICAgICAgICBDaGFuZ2VzIHRoZSBkZWZhdWx0IHRyYW5zZmVyIG1vZGUuIFdoZW4gc2VuZGluZyAodXBsb2FkaW5nKQorICAgICAgICAgIGZpbGVzLCB0aGlzIGNvbW1hbmQgaGFzIG5vIGVmZmVjdCB1bmxlc3MgeW91IGRpc2FibGUgYXV0b21hdGljCisgICAgICAgICAgdGV4dC9iaW5hcnkgbW9kZSBzd2l0Y2hpbmcgKFsyNTJdU2VjdGlvbiA0KSB3aXRoIFNFVCBGSUxFIFNDQU4KKyAgICAgICAgICBPRkYgb3IgU0VUIFRSQU5TRkVSIE1PREUgTUFOVUFMLiBXaGVuIHJlY2VpdmluZyAoZG93bmxvYWRpbmcpCisgICAgICAgICAgZmlsZXMsIHRoaXMgY29tbWFuZCBlc3RhYmxpc2hlcyB0aGUgdHJhbnNmZXIgbW9kZSB0byBiZSB1c2VkCisgICAgICAgICAgd2hlbiBhIGZpbGVuYW1lIGRvZXMgbm90IG1hdGNoIGFueSBvZiBLZXJtaXQncyB0ZXh0IG9yIGJpbmFyeQorICAgICAgICAgIGZpbGVuYW1lIHBhdHRlcm5zLCB1bmxlc3MgeW91IHVzZSBTRVQgRlRQCisgICAgICAgICAgR0VULUZJTEVUWVBFLVNXSVRDSElORyBvciBTRVQgVFJBTlNGRVIgTU9ERSBNQU5VQUwgdG8gZGlzYWJsZQorICAgICAgICAgIGF1dG9tYXRpYyBzd2l0Y2hpbmcsIGluIHdoaWNoIGNhc2UsIHRoaXMgY29tbWFuZCBlc3RhYmxpc2hlcworICAgICAgICAgIHRoZSB0cmFuc2ZlciBtb2RlIGZvciBhbGwgZG93bmxvYWRlZCBmaWxlcy4gSW4gYWxsIGNhc2VzLAorICAgICAgICAgIGhvd2V2ZXIsIHRoZSBGVFAgVFlQRSBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbnkgR0VUIG9yIFBVVAorICAgICAgICAgIGNvbW1hbmQgYnkgaW5jbHVkaW5nIGEgL1RFWFQgKC9BU0NJSSksIC9CSU5BUlksIG9yIC9URU5FWAorICAgICAgICAgIHN3aXRjaC4gVGhlIEZUUCBUWVBFIGlzIGluZGVwZW5kZW50IG9mIHRoZSBLZXJtaXQgRklMRSBUWVBFCisgICAgICAgICAgc2V0dGluZy4gVEVORVggaXMgdXNlZCBmb3Igc2VuZGluZyA4LWJpdCBiaW5hcnkgZmlsZXMgdG8gMzYtYml0CisgICAgICAgICAgcGxhdGZvcm1zIHN1Y2ggYXMgVE9QUy0xMCwgVE9QUy0yMCwgYW5kIFRFTkVYLCBhbmQgZ2V0dGluZyB0aGVtCisgICAgICAgICAgYmFjayBhZ2Fpbi4gU3lub255bTogQVNDSUkgPSBURVhULiBOb3RlOiB0aGVyZSBpcyBhbHNvIGFuIEZUUAorICAgICAgICAgIFRZUEUgY29tbWFuZCwgd2hpY2ggZG9lcyB3aGF0IFNFVCBGVFAgVFlQRSBkb2VzIGJ1dCBhbHNvIHNlbmRzCisgICAgICAgICAgYSBUWVBFIGNvbW1hbmQgdG8gdGhlIHNlcnZlciBpbW1lZGlhdGVseSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcworICAgICAgICAgIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IG9uZS4KKworICAgSWYgeW91IHdhbnQgd2FudCBzcGVjaWZpYyBGVFAgcHJlZmVyZW5jZSBzZXR0aW5ncyB0byBiZSBpbiBlZmZlY3QgZm9yCisgICBhbGwgeW91ciBLZXJtaXQgRlRQIHNlc3Npb25zLCBwdXQgdGhlIGRlc2lyZWQgU0VUIEZUUCBjb21tYW5kcyBpbiB5b3VyCisgICBLZXJtaXQgY3VzdG9taXphdGlvbiBmaWxlICh+Ly5teWtlcm1yYyBpbiBVTklYLCBLOTVDVVNUT00uSU5JIGluCisgICBXaW5kb3dzKS4KKworICAgWyBbMjUzXVRvcCBdIFsgWzI1NF1GVFAgVG9wIF0gWyBbMjU1XUMtS2VybWl0IEhvbWUgXSBbIFsyNTZdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjQuIE1hbmFnaW5nIERpcmVjdG9yaWVzIGFuZCBGaWxlcworCisgICBJbiBLZXJtaXQsIGNvbW1hbmRzIGZvciBkaXJlY3RvcnkgYW5kIGZpbGUgbWFuYWdlbWVudCBjYW4gcmVmZXIgdG86CisKKyAgICAgKiBUaGUgbG9jYWwgY29tcHV0ZXIKKyAgICAgKiBBIHJlbW90ZSBjb21wdXRlciB3aGVuIHlvdSBoYXZlIGEgY29ubmVjdGlvbiB0byBhIEtlcm1pdCBzZXJ2ZXIgb3IKKyAgICAgICBJS1NELgorICAgICAqIEEgcmVtb3RlIGNvbXB1dGVyIHdoZW4geW91IGhhdmUgYSBjb25uZWN0aW9uIHRvIGFuIEZUUCBzZXJ2ZXIuCisKKyAgIChUaGVyZSBjYW4gYWxzbyBiZSBhbiBIVFRQIGNvbm5lY3Rpb24sIGJ1dCB0aGUgY29tbWFuZHMgaW4gdGhpcworICAgc2VjdGlvbiBkb24ndCBhcHBseSB0byBIVFRQIGNvbm5lY3Rpb25zLikKKworICAgVGh1cyBpbiBnZW5lcmFsLCBlYWNoIHN1Y2ggY29tbWFuZCBjb21lcyBpbiB0aHJlZSBmb3JtczoKKworICAgIDEuIFdpdGggbm8gcHJlZml4IGluIEMtS2VybWl0IDguMC4yMDAsIGl0IHJlZmVycyB0byB0aGUgbG9jYWwKKyAgICAgICBjb21wdXRlciAoQ0QsIERJUiwgZXRjKS4gSW4gQy1LZXJtaXQgOC4wLjIwMSBhbmQgbGF0ZXIsIGhvd2V2ZXIsCisgICAgICAgdGhlICJsb2N1cyIgc3dpdGNoZXMgdG8gYXV0b21hdGljYWxseSB0byB0aGUgcmVtb3RlIEZUUCBzZXJ2ZXIKKyAgICAgICB3aGVuIHlvdSBtYWtlIGFuIEZUUCBjb25uZWN0aW9uIChzZWUgdGhlIFNFVCBMT0NVUyBkZXNjcmlwdGlvbgorICAgICAgIFsyNTddU2VjdGlvbiA3KTsgdGh1cyBDLUtlcm1pdCA4LjAuMjAxIGFjdHMgYWxtb3N0IGV4YWN0bHkgbGlrZSBhCisgICAgICAgcmVndWxhciBGVFAgY2xpZW50IHdoZW4gaXQgaGFzIGFuIEZUUCBjb25uZWN0aW9uLCB5ZXQgc3RpbGwgYWN0cworICAgICAgIGxpa2UgaXRzZWxmIG9uIG90aGVyIGtpbmRzIG9mIGNvbm5lY3Rpb25zLgorICAgIDIuIFdpdGggdGhlIFJFTU9URSBwcmVmaXgsIGl0IGlzIGZvciBhIEtlcm1pdCBzZXJ2ZXIgKFJFTU9URSBDRCwKKyAgICAgICBSRU1PVEUgRElSKS4KKyAgICAzLiBXaXRoIHRoZSBGVFAgcHJlZml4LCBpdCdzIGZvciBhbiBGVFAgc2VydmVyIChGVFAgQ0QsIEZUUCBESVIpLgorICAgIDQuIEFsc28gc2VlIFsyNThdU2VjdGlvbiAzLjgsIHdoaWNoIGV4cGxhaW5zICJSLWNvbW1hbmRzIiBhbmQKKyAgICAgICAiTC1jb21tYW5kcyIuCisKKyAgIEtlcm1pdCdzIEZUUCBmaWxlIGFuZCBkaXJlY3RvcnkgbWFuYWdlbWVudCBjb21tYW5kcyBhcmUgYXMgZm9sbG93cy4KKyAgIFdoZW4gYW4gUi1jb21tYW5kIGlzIGluY2x1ZGVkIGluIHRoZSBTeW5vbnltcyBsaXN0LCBiZSBzdXJlIHRvIHJlYWQKKyAgIFsyNTldU2VjdGlvbiAzLjggYWJvdXQgcnVsZXMgZm9yIHVzZSBvZiBSLWNvbW1hbmRzLgorCisgICBGVFAgQ0QgWyBkaXJlY3RvcnkgXQorICAgICAgICAgIFRlbGxzIHRoZSBGVFAgc2VydmVyIHRvIGNoYW5nZSBpdHMgZGVmYXVsdCAod29ya2luZykgZGlyZWN0b3J5CisgICAgICAgICAgdG8gdGhlIG9uZSBnaXZlbiwgd2hpY2ggdXN1YWxseSBtdXN0IGJlIGV4cHJlc3NlZCBpbiB0aGUgc3ludGF4CisgICAgICAgICAgb2YgdGhlIHNlcnZlciBwbGF0Zm9ybSAoVU5JWCwgVk1TLCBldGMpLiBJZiB0aGUgZGlyZWN0b3J5IGlzCisgICAgICAgICAgbm90IHNwZWNpZmllZCwgdGhlIHJlc3VsdCBkZXBlbmRzIG9uIHRoZSBGVFAgc2VydmVyIC0tIGl0IG1pZ2h0CisgICAgICAgICAgY29tcGxhaW4gdGhhdCB0aGUgY29tbWFuZCBpcyBpbGxlZ2FsLCBvciBpdCBtaWdodCBjaGFuZ2UgdG8KKyAgICAgICAgICB5b3VyIG9yaWdpbmFsIGxvZ2luIGRpcmVjdG9yeS4gU3lub255bXM6IEZUUCBDV0QgKENoYW5nZQorICAgICAgICAgIFdvcmRpbmcgRGlyZWN0b3J5KTsgUkNELgorCisgICBGVFAgQ0RVUAorICAgICAgICAgIFRlbGxzIHRoZSBGVFAgc2VydmVyIHRvIGNoYW5nZSBpdHMgZGVmYXVsdCAod29ya2luZykgZGlyZWN0b3J5CisgICAgICAgICAgdG8gdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgaXRzIGN1cnJlbnQgb25lIChlcXVpdmFsZW50IHRvCisgICAgICAgICAgImNkIC4uIiBpbiBVTklYLCBvciAiY2QgWy1dIiBpbiBWTVMpLiBTeW5vbnltczogUkNEVVAsIEZUUCBVUC4KKworICAgRlRQIFBXRAorICAgICAgICAgIEFza3MgdGhlIEZUUCBzZXJ2ZXIgdG8gcmVwb3J0ICgicHJpbnQiKSBpdHMgY3VycmVudCB3b3JraW5nCisgICAgICAgICAgZGlyZWN0b3J5LiBTeW5vbnltOiBSUFdELgorCisgICBGVFAgTUtESVIgZGlyZWN0b3J5CisgICAgICAgICAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byBjcmVhdGUgdGhlIGRpcmVjdG9yeSB3aG9zZSBuYW1lIGlzCisgICAgICAgICAgZ2l2ZW4uIEluIGdlbmVyYWwsIHRoZSBuYW1lIG11c3QgYmUgaW4gdGhlIHN5bnRheCBvZiB0aGUKKyAgICAgICAgICBzZXJ2ZXIncyBmaWxlIHN5c3RlbSwgYW5kIGl0IG11c3QgYmUgZWl0aGVyIGFic29sdXRlIChhIGZ1bGwKKyAgICAgICAgICBwYXRobmFtZSkgb3IgcmVsYXRpdmUgdG8gdGhlIHNlcnZlcidzIGN1cnJlbnQgKHdvcmtpbmcpCisgICAgICAgICAgZGlyZWN0b3J5LiBUaGlzIGNvbW1hbmQgZmFpbHMgaWYgdGhlIGRpcmVjdG9yeSBjYW4ndCBiZSBjcmVhdGVkCisgICAgICAgICAgZm9yIGFueSByZWFzb24sIGluY2x1ZGluZyB0aGF0IGl0IGV4aXN0cyBhbHJlYWR5LiBTeW5vbnltOgorICAgICAgICAgIFJNS0RJUi4KKworICAgRlRQIFJNRElSIGRpcmVjdG9yeQorICAgICAgICAgIEFza3MgdGhlIEZUUCBzZXJ2ZXIgdG8gcmVtb3ZlIHRoZSBkaXJlY3Rvcnkgd2hvc2UgbmFtZSBpcworICAgICAgICAgIGdpdmVuLiBUaGUgcnVsZXMgYXJlIHRoZSBzYW1lIGFzIGZvciBNS0RJUiwgcGx1cyBpbiBtb3N0IGNhc2VzLAorICAgICAgICAgIHRoZSBzZXJ2ZXIgd2lsbCBub3QgcmVtb3ZlIGFueSBkaXJlY3RvcnkgdW5sZXNzIGl0IGlzIGVtcHR5LgorICAgICAgICAgIFN5bm9ueW06IFJSTURJUi4KKworICAgRlRQIERJUkVDVE9SWSBbIGZpbGVzcGVjIF0gWyByZWRpcmVjdG9ycyBdCisgICAgICAgICAgVGVsbHMgdGhlIEZUUCBzZXJ2ZXIgdG8gc2VuZCBhIGRpcmVjdG9yeSBsaXN0aW5nIG9mIHRoZQorICAgICAgICAgIHNwZWNpZmllZCBmaWxlcy4gSWYgbm8gZmlsZXNwZWMgaXMgZ2l2ZW4sIHRoZSBzZXJ2ZXIgbGlzdHMgYWxsCisgICAgICAgICAgZmlsZXMgaW4gaXRzIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIFRoZSByZXN1bHRzIGFyZSBpbgorICAgICAgICAgIHdoYXRldmVyIGZvcm1hdCB0aGUgc2VydmVyIGNob29zZXMgdG8gc2VuZCB0aGVtLiBZb3UgY2FuIHVzZQorICAgICAgICAgIFVOSVgtbGlrZSByZWRpcmVjdG9ycyB0byBzZW5kIHRoZSBsaXN0aW5nIHRvIGEgZmlsZSBvciBhCisgICAgICAgICAgcGlwZWxpbmUsIGV4YWN0bHkgYXMgd2l0aCB0aGUgcmVndWxhciBLZXJtaXQgY2xpZW50L3NlcnZlcgorICAgICAgICAgIFJFTU9URSBESVJFQ1RPUlkgY29tbWFuZCAoWzI2MF1Vc2luZyBDLUtlcm1pdCwgQ2hhcHRlciAxMSkuCisgICAgICAgICAgU3lub255bTogUkRJUkVDVE9SWS4gRXhhbXBsZXM6CisKKyAgICBmdHAgZGlyICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBTaG93IGxpc3Rpbmcgb2YgYWxsIGZpbGVzIG9uIHNjcmVlbgorICAgIGZ0cCBkaXIgKi50eHQgICAgICAgICAgICAgICAgICAgICA7IExpc3QgKi50eHQgZmlsZXMgb24gc2NyZWVuCisgICAgZnRwIGRpciAqLnR4dCA+IHNvbWVmaWxlICAgICAgICAgIDsgUHV0IGxpc3RpbmcgaW4gc29tZWZpbGUKKyAgICBmdHAgZGlyICoudHh0ID4+IHNvbWVmaWxlICAgICAgICAgOyBBcHBlbmQgbGlzdGluZyB0byBzb21lZmlsZQorICAgIGZ0cCBkaXIgKi50eHQgfCBzb3J0ID4gc29tZWZpbGUgICA7IFB1dCBzb3J0ZWQgbGlzdGluZyBpbiBzb21lZmlsZQorICAgIGZ0cCBkaXIgfCBtb3JlICAgICAgICAgICAgICAgICAgICA7IFJ1bnMgbGlzdCB0aHJvdWdoICJtb3JlIgorICAgIGZ0cCBkaXIgfCBzb3J0IHwgbW9yZSAgICAgICAgICAgICA7IFJ1bnMgbGlzdCB0aHJvdWdoICJzb3J0IiBhbmQgIm1vcmUiCisKKyAgIEZUUCBWRElSRUNUT1JZIFsgZmlsZXNwZWMgXSBbIHJlZGlyZWN0b3JzIF0KKyAgICAgICAgICAiVmVyYm9zZSIgZGlyZWN0b3J5LiBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIEZUUCBESVJFQ1RPUlkKKyAgICAgICAgICBjb21tYW5kIHByaW1hcmlseSBmb3IgdXNlIHdpdGggREVDU1lTVEVNLTIwIChUT1BTLTIwKSBGVFAKKyAgICAgICAgICBzZXJ2ZXJzLCB3aGljaCBzZW5kIG9ubHkgZmlsZW5hbWVzIHdoZW4gZ2l2ZW4gYSBESVJFQ1RPUlkKKyAgICAgICAgICBjb21tYW5kOyB0aGUgVkRJUkVDVE9SWSBjb21tYW5kIG1ha2VzIHRoZW0gYWxzbyBzZW5kIGZpbGUKKyAgICAgICAgICBzaXplcywgZGF0ZXMsIGFuZCBhdHRyaWJ1dGVzLgorCisgICBGVFAgQ0hFQ0sgZmlsZXNwZWMKKyAgICAgICAgICBBc2tzIHRoZSBGVFAgc2VydmVyIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgZXhpc3RzIG9yLCBpZiB0aGUKKyAgICAgICAgICBmaWxlc3BlYyBjb250YWlucyB3aWxkY2FyZHMsIGlmIGFueSBmaWxlcyBtYXRjaCwgYW5kIHRoaXMKKyAgICAgICAgICBjb21tYW5kIHN1Y2NlZWRzIG9yIGZhaWxzIGFjY29yZGluZ2x5LgorCisgICBGVFAgTU9EVElNRSBmaWxlbmFtZQorICAgICAgICAgIEFza3MgdGhlIEZUUCBzZXJ2ZXIsIHZpYSB0aGUgbm90LXlldC1zdGFuZGFyZCBGVFAgTURUTSBjb21tYW5kLAorICAgICAgICAgIHRvIHNlbmQgdGhlIG1vZGlmaWNhdGlvbiBkYXRlIGFuZCB0aW1lIG9mIHRoZSBnaXZlbiBmaWxlLiBUaGUKKyAgICAgICAgICByZXNwb25zZSBzaG91bGQgYmUgYSBudW1lcmljIHN0cmluZyBpbiB0aGUgZm9ybWF0OgorICAgICAgICAgIHl5eXltbWRkaGhtbXNzeHh4eHguLi4gd2hlcmUgeXl5eSBpcyB0aGUgeWVhciwgbW0gaXMgdGhlIG1vbnRoLAorICAgICAgICAgIGRkIGlzIHRoZSBkYXksIGhoIGlzIHRoZSBob3VyICgwLTIzKSwgbW0gaXMgdGhlIG1pbnV0ZSwgc3MgaXMKKyAgICAgICAgICB0aGUgc2Vjb25kLCBhbmQgeHh4Li4uIGlzIHRoZSBvcHRpb25hbCBmcmFjdGlvbiBvZiB0aGUgc2Vjb25kCisgICAgICAgICAgKDAgb3IgbW9yZSBkaWdpdHMpLiBUaGUgZGF0ZSBhbmQgdGltZSBpcyBleHByZXNzZWQgaW4gVVRDIChHTVQsCisgICAgICAgICAgWnVsdSwgWmVyby1NZXJpZGlhbikuIFRoZSByZXN1bHQgaXMgYXZhaWxhYmxlIHByb2dyYW1tYXRpY2FsbHkKKyAgICAgICAgICBpbiB0aGUgWzI2MV1cdihmdHBfbWVzc2FnZSkgdmFyaWFibGUsIGFuZCBpcyB1bmRlcnN0YW5kYWJsZSBieQorICAgICAgICAgIEtlcm1pdCdzIGRhdGUtdGltZSBzd2l0Y2hlcyBhbmQgZnVuY3Rpb25zLiBGb3IgZXhhbXBsZSwgc3VwcG9zZQorICAgICAgICAgIHdlIHdhbnQgdG8gdXBsb2FkIGFsbCBsb2NhbCBmaWxlcyB0aGF0IGFyZSBuZXdlciB0aGFuIGEKKyAgICAgICAgICBwYXJ0aWN1bGFyIGZpbGUgb24gdGhlIHNlcnZlcjoKKworICBDLUtlcm1pdD4gZnRwIG1vZHRpbWUgc2lnbnBvc3QKKyAgQy1LZXJtaXQ+IGVjaG8gXHYoZnRwX21lc3NhZ2UpCisgIDIwMDEwODA3MTEzNTQyLjAxNAorICBDLUtlcm1pdD4gZnRwIG1wdXQgL2FmdGVyOlx2KGZ0cF9tZXNzYWdlKUdNVCAqCisKKyAgICAgICAgICBOb3RlIHRoYXQgd2UgbXVzdCBhcHBlbmQgIkdNVCIgdG8gdGhlIGRhdGUtdGltZSBzdHJpbmcgdG8gbGV0CisgICAgICAgICAgdGhlIC9BRlRFUiBzd2l0Y2gga25vdyB0aGUgdGltZSBpcyBHTVQgcmF0aGVyIHRoYW4gbG9jYWwuCisKKyAgIEZUUCBTSVpFIGZpbGVuYW1lCisgICAgICAgICAgQXNrcyB0aGUgRlRQIHNlcnZlciB0byBzZW5kIHRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIGdpdmVuCisgICAgICAgICAgZmlsZS4gVGhlIHJlc3VsdCBtaWdodCB2YXJ5IGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjdXJyZW50CisgICAgICAgICAgRlRQIFRZUEUgaXMgYmluYXJ5IG9yIHRleHQgKCJhc2NpaSIpLiBGb3IgYSByZWxpYWJsZSBieXRlCisgICAgICAgICAgY291bnQsIGRvIEZUUCBUWVBFIEJJTkFSWSBmaXJzdC4gVGhlIHJlc3VsdCBpcyBhdmFpbGFibGUKKyAgICAgICAgICBwcm9ncmFtbWF0aWNhbGx5IGluIHRoZSBbMjYyXVx2KGZ0cF9tZXNzYWdlKSB2YXJpYWJsZS4KKworICAgRlRQIENITU9EIHBlcm1pc3Npb25zIGZpbGVuYW1lCisgICAgICAgICAgVGVsbHMgdGhlIEZUUCBzZXJ2ZXIgdG8gc2V0IHRoZSBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbikgb2YgdGhlCisgICAgICAgICAgZ2l2ZW4gZmlsZSB0byB0aGUgb25lcyBnaXZlbi4gVGhlIHBlcm1pc3Npb25zIGFuZCBmaWxlbmFtZSBtdXN0CisgICAgICAgICAgYmUgZ2l2ZW4gaW4gd2hhdGV2ZXIgc3ludGF4IGlzIHJlcXVpcmVkIGJ5IHRoZSBzZXJ2ZXIuIEV4YW1wbGUKKyAgICAgICAgICAoZm9yIGEgVU5JWC1iYXNlZCBGVFAgc2VydmVyKToKKworICBmdHAgY2htb2QgNjY0IG9vZmEudHh0CisKKyAgICAgICAgICBOb3QgYWxsIHNlcnZlcnMgc3VwcG9ydCB0aGlzIGNvbW1hbmQuIEZvciBub24tVU5JWC1iYXNlZAorICAgICAgICAgIHNlcnZlcnMsIHlvdSBtaWdodCBuZWVkIHRvIHVzZSBGVFAgUVVPVEUgb3IgRlRQIFNJVEUgYW5kIHRoZQorICAgICAgICAgIGFwcHJvcHJpYXRlIHBsYXRmb3JtLXNwZWNpZmljIEZUUCBzZXJ2ZXIgY29tbWFuZC4KKworICAgRlRQIFVNQVNLIFsgbnVtYmVyIF0KKyAgICAgICAgICBUaGlzIGNvbW1hbmQgaXMgcHJvYmFibHkgc3BlY2lmaWMgdG8gVU5JWC1iYXNlZCBzZXJ2ZXJzOyBpdAorICAgICAgICAgIHNldHMgdGhlIFVOSVggInVtYXNrIiwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgcGVybWlzc2lvbnMgbWFzaworICAgICAgICAgIGZvciBuZXcgKGluIHRoaXMgY2FzZSwgaW5jb21pbmcpIGZpbGVzLiBDcnVkZWx5IHB1dCwgdGhlIFVOSVgKKyAgICAgICAgICB1bWFzayBpcyBhbiBvY3RhbCByZXByZXNlbnRhdGlvbiBvZiBhIGJpbmFyeSBudW1iZXIgaW4gaW4gd2hpY2gKKyAgICAgICAgICBhIDEgYml0IHN0YW5kcyBmb3IgYSBwZXJtaXNzaW9uIGJpdCB0aGF0IG11c3QgYmUgMCwgYW5kIGEgMCBiaXQKKyAgICAgICAgICBzdGFuZHMgZm9yIGEgcGVybWlzc2lvbiBiaXQgdGhhdCBjYW4gYmUgMCBvciAxIGRlcGVuZGluZyBvbgorICAgICAgICAgIG90aGVyIGZhY3RvcnMsIHN1Y2ggYXMgdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgorICAgICAgICAgIEV4YW1wbGU6ICJ1bWFzayAwMDciIHJlcXVpcmVzIHRoYXQgbmV3IGZpbGVzIGFyZSBjcmVhdGVkCisgICAgICAgICAgd2l0aG91dCByZWFkL3dyaXRlL2V4ZWN1dGUgd29ybGQgcGVybWlzc2lvbi4gSWYgdGhlIG51bWJlciBpcworICAgICAgICAgIG5vdCBzcGVjaWZpZWQsIHRoZSBzZXJ2ZXIncyBjdXJyZW50IHVtYXNrIGlzIHJlcG9ydGVkLgorCisgICBGVFAgUkVOQU1FIGZpbGVuYW1lIG5ld25hbWUKKyAgICAgICAgICBBc2tzIHRoZSBGVFAgc2VydmVyIHRvIHJlbmFtZSB0aGUgZmlsZSB3aG9zZSBuYW1lIGlzICJmaWxlbmFtZSIKKyAgICAgICAgICB0byAibmV3bmFtZSIuIFdvcmtzIG9ubHkgZm9yIG9uZSBmaWxlOyBjYW4gbm90IGJlIHVzZWQgd2l0aAorICAgICAgICAgIHdpbGRjYXJkcy4gVGhlIHNlcnZlcidzIGludGVycHJldGF0aW9uIG9mICJuZXduYW1lIiBjYW4gdmFyeQorICAgICAgICAgIChpbiBzb21lIGNhc2VzIGl0IG11c3QgYmUgYSBmaWxlbmFtZSwgaW4gb3RoZXJzIHBlcmhhcHMgaXQgY2FuCisgICAgICAgICAgYWxzbyBiZSBhIGRpcmVjdG9yeSBuYW1lLCBpbiB3aGljaCBjYXNlIGlmIHRoZSBmaWxlbmFtZSBkZW5vdGUKKyAgICAgICAgICBhIHJlZ3VsYXIgZmlsZSwgdGhlIGZpbGUgbWlnaHQgYmUgbW92ZWQgdG8gdGhlIGdpdmVuCisgICAgICAgICAgZGlyZWN0b3J5KS4gU29tZSBzZXJ2ZXJzIG1pZ2h0IGFsbG93IGZpbGVzIHRvIGJlIHJlbmFtZWQKKyAgICAgICAgICAoIm1vdmVkIikgYmV0d2VlbiBwaHlzaWNhbCBkaXNrcyBvciBwYXJ0aXRpb25zLCBvdGhlcnMgbWlnaHQKKyAgICAgICAgICBub3QuIFN5bm9ueW06IFJSRU5BTUUuCisKKyAgIEZUUCBERUxFVEUgWyBzd2l0Y2hlcyBdIGZpbGVzcGVjIFsgZmlsZXNwZWMgWyAuLi4gXSBdCisgICAgICAgICAgVGVsbHMgdGhlIEZUUCBzZXJ2ZXIgdG8gZGVsZXRlIHRoZSBmaWxlIG9yIGZpbGVzIGxpc3RlZC4gRWFjaAorICAgICAgICAgIGZpbGUgc3BlY2lmaWNhdGlvbiBtYXksIGJ1dCBuZWVkIG5vdCwgY29udGFpbiB3aWxkY2FyZAorICAgICAgICAgIGNoYXJhY3RlcnMgdG8gbWF0Y2ggbXVsdGlwbGUgZmlsZXMuIEZpbGUgc3BlY2lmaWNhdGlvbnMgYW5kCisgICAgICAgICAgd2lsZGNhcmQgc3ludGF4IG11c3QgYmUgdGhvc2Ugb2YgdGhlIHNlcnZlci4gQW55IGZpbGUKKyAgICAgICAgICBzcGVjaWZpY2F0aW9ucyB0aGF0IGNvbnRhaW4gc3BhY2VzIG11c3QgYmUgZW5jbG9zZWQgaW4gYnJhY2VzCisgICAgICAgICAgb3IgZG91YmxlcXVvdGVzLiBGVFAgREVMRVRFIHN3aXRjaGVzIGFyZToKKworIC9FUlJPUi1BQ1RJT046ICAvRklMRU5BTUVTOiAgICAgL05PQkFDS1VQRklMRVMgIC9RVUlFVAorIC9FWENFUFQ6ICAgICAgICAvTEFSR0VSLVRIQU46ICAgL05PRE9URklMRVMgICAgIC9OT1BBR0UKKyAvUEFHRSAgICAgICAgICAgL1JFQ1VSU0lWRSAgICAgIC9TTUFMTEVSLVRIQU46CisKKyAgICAgICAgICBXaGVuIHVzZWQgd2l0aCBGVFAgREVMRVRFLCB0aGUgL1JFQ1VSU0lWRSBzd2l0Y2ggZGVsZXRlcyBmaWxlcworICAgICAgICAgIGJ1dCBub3QgZGlyZWN0b3JpZXMsIGFuZCBmdXJ0aGVybW9yZSBkZXBlbmRzIG9uIHRoZSBzZXJ2ZXIKKyAgICAgICAgICBwcm92aWRpbmcgcmVjdXJzaXZlIGZpbGUgbGlzdHMsIHdoaWNoIGlzIG5vdCB0aGUgbm9ybWFsCisgICAgICAgICAgYmVoYXZpb3IuIEZvciBmdXJ0aGVyIGRldGFpbHMsIHNlZSB0aGUgZGVjcmlwdGlvbnMgb2YgdGhlc2UKKyAgICAgICAgICBzd2l0Y2hlcyBpbiBbMjYzXVNlY3Rpb24gMy42LiBTeW5vbnltczogRlRQIE1ERUxFVEUgKEtlcm1pdAorICAgICAgICAgIG1ha2VzIG5vIGRpc3RpbmN0aW9uIGJldHdlZW4gREVMRVRFIGFuZCBNREVMRVRFKTsgUkRFTEVURS4KKworICAgRlRQIFRZUEUgeyBURVhULCBCSU5BUlksIFRFTkVYIH0KKyAgICAgICAgICBUZWxscyB0aGUgRlRQIHNlcnZlciB0byBjaGFuZ2UgaXRzIGZpbGUtdHJhbnNmZXIgdHlwZSB0byB0aGUKKyAgICAgICAgICBvbmUgZ2l2ZW4sIGltbWVkaWF0ZWx5LiBTZWUgWzI2NF1TRVQgRlRQIFRZUEUgZm9yIGRldGFpbHMuCisKKyAgIFsgWzI2NV1Ub3AgXSBbIFsyNjZdRlRQIFRvcCBdIFsgWzI2N11DLUtlcm1pdCBIb21lIF0gWyBbMjY4XUtlcm1pdAorICAgSG9tZSBdCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy41LiBVcGxvYWRpbmcgRmlsZXMgV2l0aCBGVFAKKworICAgVXBsb2FkaW5nIG1lYW5zIHNlbmRpbmcgZmlsZXMgZnJvbSB0aGUgY2xpZW50IChLZXJtaXQpIHRvIHRoZSBGVFAKKyAgIHNlcnZlci4gVGhlIGJhc2ljIGNvbW1hbmQgZm9yIHVwbG9hZGluZyBmaWxlcyB3aXRoIEZUUCBpcyBQVVQ6CisKKyAgIEZUUCBQVVQgWyBzd2l0Y2hlcyBdIFsgZmlsZXNwZWMgWyBhcy1uYW1lIF0gXQorICAgICAgICAgIFVwbG9hZHMgKHNlbmRzKSB0aGUgZmlsZSBvciBmaWxlcyB0aGF0IG1hdGNoIHRoZSBmaWxlCisgICAgICAgICAgc3BlY2lmaWNhdGlvbiwgd2hpY2ggbWF5IGluY2x1ZGUgd2lsZGNhcmRzLCB0byB0aGUgc2VydmVyLiBJZgorICAgICAgICAgIG5vIGZpbGVzcGVjIGlzIGdpdmVuLCB0aGUgbmFtZXMgb2YgZmlsZXMgdG8gc2VuZCBhcmUgdGFrZW4gZnJvbQorICAgICAgICAgIHRoZSAvTElTVEZJTEU6IGZpbGUsIGlmIGFueSwgb3RoZXJ3aXNlIGZyb20gdGhlIFNFTkQtTElTVCwgaWYKKyAgICAgICAgICBhbnkuIFVubGVzcyB5b3UgZ28gb3V0IG9mIHlvdXIgd2F5IHRvIHByZXZlbnQgaXQsIEtlcm1pdAorICAgICAgICAgIGRldGVybWluZXMgdGhlIHRyYW5zZmVyIG1vZGUgKHRleHQgb3IgYmluYXJ5KSBmb3IgZWFjaCBmaWxlCisgICAgICAgICAgYXV0b21hdGljYWxseSwgYW5kIHN3aXRjaGVzIGF1dG9tYXRpY2FsbHkgb24gYSBwZXItZmlsZSBiYXNpcy4KKyAgICAgICAgICBJZiBhbiBhcy1uYW1lIGlzIGdpdmVuLCB0aGUgZmlsZSBpcyBzZW50IHVuZGVyIHRoYXQgbmFtZQorICAgICAgICAgIGluc3RlYWQgb2YgaXRzIG93biAoaWYgYW4gYXMtbmFtZSBpcyBnaXZlbiB3aXRoIGEgd2lsZGNhcmQKKyAgICAgICAgICBmaWxlc3BlYywgdGhlIHJlc3VsdCBpcyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkLCBhbmQgaXMKKyAgICAgICAgICBleHBsYWluZWQgbGF0ZXIgaW4gdGhpcyBzZWN0aW9uKS4KKworICAgVW5saWtlIG5vcm1hbCBGVFAgY2xpZW50cywgS2VybWl0IGRvZXMgbm90IHByb21wdCB5b3UgYnkgZGVmYXVsdCAob3IKKyAgIGF0IGFsbCkgZm9yIGVhY2ggZmlsZTsgaXQganVzdCBzZW5kcyB0aGVtLCBqdXN0IGFzIGl0IGRvZXMgd2l0aCBLZXJtaXQKKyAgIHByb3RvY29sLiBUaGUgZmlsZXNwZWMgY2FuIGJlIGEgbGl0ZXJhbCBmaWxlbmFtZSBvciBhIEtlcm1pdCBwYXR0ZXJuLAorICAgZGVzY3JpYmVkIGluOgorCisgIFsyNjldaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkKKworICAgS2VybWl0IHBhdHRlcm5zIGFyZSBlcXVpdmFsZW50IHRvIEMtU2hlbGwgcGF0dGVybnMgYW5kIHByb3ZpZGUgYSBmYWlyCisgICBhbW91bnQgb2YgZmxleGliaWxpdHkgaW4gc2VsZWN0aW5nIHdoaWNoIGZpbGVzIHRvIHNlbmQsIHdoaWNoIGlzCisgICBhdWdtZW50ZWQgYnkgdGhlIGZpbGUtc2VsZWN0aW9uIHN3aXRjaGVzIHByZXNlbnRlZCBpbiBbMjcwXVNlY3Rpb24KKyAgIDMuNS4xLgorCisgICBGVFAgTVBVVCBbIHN3aXRjaGVzIF0gZmlsZXNwZWMgWyBmaWxlc3BlYyBbIC4uLiBdIF0KKyAgICAgICAgICBGVFAgTVBVVCBpcyBqdXN0IGxpa2UgRlRQIFBVVCBleGNlcHQgaXQgYWxsb3dzIHlvdSB0byBnaXZlIG1vcmUKKyAgICAgICAgICB0aGFuIG9uZSBmaWxlIHNwZWNpZmljYXRpb24sIGFuZCBpdCBkb2VzIG5vdCBhbGxvdyBhbiBhcy1uYW1lCisgICAgICAgICAgaW4gdGhlIGZpbGUgbGlzdC4gSG93ZXZlciwgYXMtbmFtZXMgY2FuIGJlIGdpdmVuIHRvIGVpdGhlciBQVVQKKyAgICAgICAgICBvciBNUFVUIHdpdGggdGhlIC9BUy1OQU1FOiBzd2l0Y2guCisKKyAgIElmIGEgUFVUIG9yIE1QVVQgY29tbWFuZCByZXN1bHRzIGluIG9uZSBmaWxlIGJlaW5nIHVwbG9hZGVkLCBpdAorICAgc3VjY2VlZHMgaWYgdGhlIGZpbGUgaXMgdXBsb2FkZWQgY29tcGxldGVseSBhbmQgZmFpbHMgb3RoZXJ3aXNlLiBJZgorICAgbW9yZSB0aGFuIG9uZSBmaWxlIGlzIHNlbGVjdGVkIGZvciB1cGxvYWQsIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBkZXBlbmRzCisgICBvbiB0aGUgWzI3MV1GVFAgRVJST1ItQUNUSU9OIHNldHRpbmc7IGlmIGl0IGlzIFBST0NFRUQgKHRoZSBkZWZhdWx0CisgICBzZXR0aW5nKSwgdGhlbiB0aGUgW01dUFVUIGNvbW1hbmQgc3VjY2VlZHMgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZQorICAgZmlsZXMgd2FzIGNvbXBsZXRlbHkgdXBsb2FkZWQsIGFuZCBmYWlscyBvdGhlcndpc2UsIElmIEZUUAorICAgRVJST1ItQUNUSU9OIGlzIFFVSVQsIHRoZSBbTV1QVVQgY29tbWFuZCBzdWNjZWVkcyBpZiBhbGwgc2VsZWN0ZWQKKyAgIGZpbGVzIHdlcmUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5LCBhbmQgZmFpbHMgaWYgYW55IGZpbGUgZmFpbGVkLgorCisgICBGVFAgdXBsb2FkcyBtYXkgYmUgaW50ZXJydXB0ZWQganVzdCBsaWtlIEtlcm1pdCB1cGxvYWRzLiBXaGlsZSB0aGUKKyAgIHRyYW5zZmVyIGlzIGluIHByb2dyZXNzLCB0eXBlOgorCisgIFggdG8gaW50ZXJydXB0IHRoZSBjdXJyZW50IGZpbGUgYW5kIGdvIG9uIHRvIHRoZSBuZXh0IGZpbGUuCisgIFogdG8gY2FuY2VsIHRoZSBjdXJyZW50IGZpbGUgYW5kIGFsbCByZW1haW5pbmcgZmlsZXMuCisgIF5DIChDb250cm9sLUMpOiBMaWtlIFosIGJ1dCBtaWdodCBhY3QgbW9yZSBxdWlja2x5LgorCisgICBNUFVUIG1heSBiZSB1c2VkIGFzIGluIHJlZ3VsYXIgRlRQIGNsaWVudHMsIGJ1dCBpdCBpcyBub3QgcmVxdWlyZWQgdG8KKyAgIHNlbmQgbXVsdGlwbGUgZmlsZXM7IGluIEtlcm1pdCBpdCBpcyByZXF1aXJlZCBvbmx5IGlmIHlvdSB3YW50IHRvIGdpdmUKKyAgIG11bHRpcGxlIGZpbGUgc3BlY2lmaWNhdGlvbnMuIEV4YW1wbGVzOgorCisgIGZ0cCBwdXQgb29mYS50eHQgICAgICAgICAgICAgICA7IFNlbmQgYSBzaW5nbGUgZmlsZSBvb2ZhLnR4dAorICBmdHAgcHV0IG9vZmEudHh0IGJ1ZGdldC50eHQgICAgOyBTZW5kIHNpbmdsZSBmaWxlIG9vZmEudHh0IGFzIGJ1ZGdldC50eHQKKyAgZnRwIHB1dCAqLnR4dCAgICAgICAgICAgICAgICAgIDsgU2VuZCBhbGwgKi50eHQgZmlsZXMKKyAgZnRwIG1wdXQgKi50eHQgICAgICAgICAgICAgICAgIDsgU2VuZCBhbGwgKi50eHQgZmlsZXMgKHNhbWUgYXMgInB1dCAqLnR4dCIpCisgIGZ0cCBtcHV0ICoudHh0IGZvby5iYXIgICAgICAgICA7IFNlbmQgYWxsICoudHh0IGZpbGVzIHBsdXMgZm9vLmJhcgorCisgICBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBQVVQgYW5kIE1QVVQgaXMgaW1wb3J0YW50IG9ubHkgd2hlbiBtb3JlIHRoYW4KKyAgIG9uZSBmaWxlc3BlYyBpcyBnaXZlbiwganVzdCBsaWtlIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIEtlcm1pdCBTRU5ECisgICBhbmQgTVNFTkQ6CisKKyAgZnRwIHB1dCBvb2ZhLnR4dCBidWRnZXQudHh0ICAgIDsgU2VuZCBvb2ZhLnR4dCBBUyBidWRnZXQudHh0CisgIGZ0cCBtcHV0IG9vZmEudHh0IGJ1ZGdldC50eHQgICA7IFNlbmQgb29mYS50eHQgQU5EIGJ1ZGdldC50eHQKKworICAgSWYgdGhlIHNvdXJjZSBmaWxlIHNwZWNpZmljYXRpb24gaW5jbHVkZXMgYW55IHBhdGggc2VnbWVudHMsIGZvcgorICAgZXhhbXBsZToKKworICBwdXQgL3RtcC9vb2ZhLnR4dAorICBwdXQgc3ViZGlyL2Fub3RoZXIvYW5kYW5vdGhlci9vb2ZhLnR4dAorCisgICB0aGUgcGF0aCBwb3J0aW9uIGlzIHN0cmlwcGVkIGZyb20gdGhlIGZpbGVuYW1lIHRoYXQgaXMgc2VudCB0byB0aGUKKyAgIHNlcnZlci4gSG93ZXZlciwgaWYgYW4gYXMtbmFtZSBjb250YWlucyBhIHBhdGgsIGl0IGlzIHJldGFpbmVkLgorICAgRXhhbXBsZXM6CisKKyAgZnRwIHB1dCAvdXNyL2RvYy9vb2ZhLnR4dCAgICAgIDsgU2VuZCBhcyAib29mYS50eHQiLgorICBmdHAgcHV0IG9vZmEudHh0IC90bXAvb29mYS50eHQgOyBTZW5kIGFzICIvdG1wL29vZmEudHh0IgorCisgICBUaGUgbGF0dGVyIGV4YW1wbGUgc2VuZHMgdGhlIGZpbGUgb29mYS50eHQgZnJvbSB5b3VyIGN1cnJlbnQgbG9jYWwKKyAgIGRpcmVjdG9yeSB0byB0aGUgc2VydmVyJ3MgL3RtcCBkaXJlY3RvcnkuIFRoaXMgd29ya3Mgb25seSBpZiB0aGUKKyAgIHNlcnZlciB1c2VzIHRoZSBzYW1lIGRpcmVjdG9yeSBub3RhdGlvbiB0aGF0IHlvdSB1c2VkIGluIHRoZSBhcy1uYW1lCisgICBBTkQgdGhlIGdpdmVuIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgc2VydmVyIEFORCBpZiB5b3UgaGF2ZQorICAgd3JpdGUgYWNjZXNzIHRvIGl0LgorCisgICBVc2UgY2F1dGlvbiB3aGVuIHVwbG9hZGluZyBmcm9tIGEgY2FzZS1zZW5zaXRpdmUgZmlsZSBzeXN0ZW0sIHN1Y2ggYXMKKyAgIFVOSVgsIHRvIGEgZmlsZSBzeXN0ZW0gdGhhdCBpcyBub3QgY2FzZSBzZW5zaXRpdmUsIHN1Y2ggYXMgV2luZG93cyBvcgorICAgVk1TLiBJZiB5b3UgaGF2ZSB0d28gZmlsZXMgaW4gVU5JWCwgQUEgYW5kIGFhIGFuZCB1cGxvYWQgYm90aCBvZiB0aGVtLAorICAgdGhlIHNlY29uZCBvbmUgd2lsbCBvdmVyd3JpdGUgdGhlIGZpcnN0LiBUaGUgb25seSB3YXkgYXJvdW5kIHRoaXMKKyAgIHByb3ZpZGVkIGJ5IEZUUCBwcm90b2NvbCBpcyBpdHMgInVuaXF1ZSBzZXJ2ZXIgbmFtZXMiIGZlYXR1cmUgKFNFVCBGVFAKKyAgIFVOSVFVRS1TRVJWRVItTkFNRVMgb3IgdGhlIC9VTklRVUUgc3dpdGNoIGRlc2NyaWJlZCBiZWxvdykuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAzLjUuMS4gRlRQIFBVVCBTd2l0Y2hlcworCisgICBGVFAgUFVUIGFuZCBNUFVUIGFyZSBzaW1pbGFyIGluIGZvcm1hdCBhbmQgYmVoYXZpb3IgdG8gdGhlIHJlZ3VsYXIKKyAgIEtlcm1pdCBTRU5EIGFuZCBNU0VORCBjb21tYW5kcywgYW5kIHRoZXkgYWxsb3cgbW9zdCBvZiB0aGUgc2FtZQorICAgb3B0aW9uYWwgc3dpdGNoZXM6CisKK0MtS2VybWl0PmZ0cCBwdXQgPyBGaWxlbmFtZSwgb3Igc3dpdGNoLCBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAvYWZ0ZXI6ICAgICAgICAgICAgICAgICAvbGFyZ2VyLXRoYW46ICAgICAgICAgICAvcmVuYW1lLXRvOgorIC9hcnJheTogICAgICAgICAgICAgICAgIC9saXN0ZmlsZTogICAgICAgICAgICAgIC9zZXJ2ZXItY2hhcmFjdGVyLXNldDoKKyAvYXMtbmFtZTogICAgICAgICAgICAgICAvbG9jYWwtY2hhcmFjdGVyLXNldDogICAvc2VydmVyLXJlbmFtZS10bzoKKyAvYmVmb3JlOiAgICAgICAgICAgICAgICAvbW92ZS10bzogICAgICAgICAgICAgICAvc2ltdWxhdGUKKyAvYmluYXJ5ICAgICAgICAgICAgICAgICAvbm9iYWNrdXBmaWxlcyAgICAgICAgICAvc21hbGxlci10aGFuOgorIC9jb21tYW5kICAgICAgICAgICAgICAgIC9ub2RvdGZpbGVzICAgICAgICAgICAgIC90ZW5leAorIC9kZWxldGUgICAgICAgICAgICAgICAgIC9ub2ZvbGxvd2xpbmtzICAgICAgICAgIC90ZXh0CisgL2RvdGZpbGVzICAgICAgICAgICAgICAgL25vdC1hZnRlcjogICAgICAgICAgICAgL3RyYW5zcGFyZW50CisgL2Vycm9yLWFjdGlvbjogICAgICAgICAgL25vdC1iZWZvcmU6ICAgICAgICAgICAgL3R5cGU6CisgL2V4Y2VwdDogICAgICAgICAgICAgICAgL3Blcm1pc3Npb25zOiAgICAgICAgICAgL3VwZGF0ZQorIC9maWxlbmFtZXM6ICAgICAgICAgICAgIC9xdWlldCAgICAgICAgICAgICAgICAgIC91bmlxdWUtc2VydmVyLW5hbWVzCisgL2ZpbHRlcjogICAgICAgICAgICAgICAgL3JlY292ZXIKKyAvZm9sbG93bGlua3MgICAgICAgICAgICAvcmVjdXJzaXZlCisKKyAgIFNpbmNlIG1vc3Qgb2YgdGhlc2Ugc3dpdGNoZXMgYXJlIGNvbW1vbiB0byBLZXJtaXQncyBTRU5EIGFuZCBNU0VORAorICAgY29tbWFuZHMsIHRoZXkgZGVzY3JpYmVkIG9ubHkgYnJpZWZseSBoZXJlLiBGb3IgZ3JlYXRlciBkZXRhaWwgc2VlOgorCisgICAgIFsyNzJdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUgKGV4cGxhbmF0aW9uCisgICBvZiBzd2l0Y2hlcykKKyAgICAgWzI3M11odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNworICAgKGZpbGUtdHJhbnNmZXIgc3dpdGNoZXMpCisKKyAgIEZpcnN0IHRoZSBmaWxlLXNlbGVjdGlvbiBzd2l0Y2hlczoKKworICAgL0FGVEVSOmRhdGUtdGltZQorICAgL0JFRk9SRTpkYXRlLXRpbWUKKyAgIC9OT1QtQUZURVI6ZGF0ZS10aW1lCisgICAvTk9ULUJFRk9SRTpkYXRlLXRpbWUKKyAgICAgICAgICBPbmx5IHNlbmQgdGhvc2UgZmlsZXMgbW9kaWZpZWQgb24gb3IgYWZ0ZXIgb3IgYmVmb3JlIHRoZSBnaXZlbgorICAgICAgICAgIGRhdGUgYW5kIHRpbWUuIFRoZXNlIHN3aXRjaGVzIGNhbiBiZSBjb21iaW5lZCB0byBzZWxlY3QgZmlsZXMKKyAgICAgICAgICBtb2RpZmllZCBiZXR3ZWVuIHR3byBkYXRlL3RpbWVzLiBWYXJpb3VzIGRhdGUtdGltZSBmb3JtYXRzIGFyZQorICAgICAgICAgIGFjY2VwdGVkOyBpZiB0aGUgZGF0ZS10aW1lIGNvbnRhaW5zIHNwYWNlcywgaXQgbXVzdCBiZSBlbmNsb3NlZAorICAgICAgICAgIGluIGJyYWNlcyBvciBkb3VibGVxdW90ZXMuIFNlZQorICAgICAgICAgIFsyNzRdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjYgYW5kCisgICAgICAgICAgWzI3NV1TZWN0aW9uIDguMTMgb2YgdGhpcyBkb2N1bWVudCBmb3IgZGV0YWlscyBhYm91dCBkYXRlLXRpbWUKKyAgICAgICAgICBmb3JtYXRzLiBFeGFtcGxlczoKKworICBmdHAgcHV0IC9hZnRlcjp7MSBqYW4gMjAwMCAwOjAwOjAwfSAqCisgIGZ0cCBwdXQgL2FmdGVyOi01ZGF5cyAqCisKKyAgIC9MQVJHRVItVEhBTjpudW1iZXIKKyAgIC9TTUFMTEVSLVRIQU46bnVtYmVyCisgICAgICAgICAgT25seSBzZW5kIGZpbGVzIGxhcmdlciAoc21hbGxlcikgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgKG9jdGV0cykuIFRoZXNlIHN3aXRjaGVzIGNhbiBiZSBjb21iaW5lZCB0byBzZWxlY3QgZmlsZXMgaW4gYQorICAgICAgICAgIGNlcnRhaW4gc2l6ZSByYW5nZS4KKworICAgL1RZUEU6e1RFWFQsQklOQVJZfQorICAgICAgICAgIE9ubHkgc2VuZCBmaWxlcyB0aGF0IGFyZSB0aGUgZ2l2ZW4gdHlwZSwgd2hpY2ggaXMgZGV0ZXJtaW5lZAorICAgICAgICAgIGZvciBlYWNoIGZpbGUganVzdCBiZWZvcmUgc2VuZGluZyBpdCBieSBmaWxlIHNjYW5uaW5nLiBCSU5BUlkKKyAgICAgICAgICBpbmNsdWRlcyBURU5FWDsgaWYgeW91IGhhdmUgaW5jbHVkZWQgYSAvVEVORVggc3dpdGNoLCBvcgorICAgICAgICAgIHByZXZpb3VzbHkgZ2l2ZW4gYSBbU0VUXSBGVFAgVFlQRSBURU5FWCBjb21tYW5kLCBiaW5hcnkgZmlsZXMKKyAgICAgICAgICBhcmUgc2VudCBpbiBURU5FWCwgcmF0aGVyIHRoYW4gQklOQVJZIG1vZGUuCisKKyAgIC9bTk9dRE9URklMRVMKKyAgICAgICAgICBbRG9uJ3RdIGluY2x1ZGUgZmlsZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBkb3QgKC4pLiBCeQorICAgICAgICAgIGRlZmF1bHQsIHN1Y2ggZmlsZXMgYXJlIG5vdCBpbmNsdWRlZCB1bmxlc3MgeW91ciBmaWxlc3BlYworICAgICAgICAgIGV4cGxpY2l0bHkgbWVudGlvbnMgdGhlbS4KKworICAgL05PQkFDS1VQRklMRVMKKyAgICAgICAgICBEb24ndCBpbmNsdWRlIGZpbGVzIHdob3NlIG5hbWVzIGVuZCB3aXRoIC5+bm5ufiwgd2hlcmUgbm5uIGlzIGEKKyAgICAgICAgICBudW1iZXIsIGUuZy4gb29mYS50eHQufjI3fi4gVGhlc2UgYXJlIGJhY2t1cCBmaWxlcyBjcmVhdGVkIGJ5CisgICAgICAgICAgS2VybWl0LCBFTUFDUywgYW5kIG90aGVyIGFwcGxpY2F0aW9ucy4gQnkgZGVmYXVsdCwgYmFja3VwIGZpbGVzCisgICAgICAgICAgYXJlIGluY2x1ZGVkLgorCisgICAvTk9GT0xMT1dMSU5LUworICAgICAgICAgIChVTklYIG9ubHkpIFNraXAgb3ZlciBzeW1ib2xpYyBsaW5rcyByYXRoZXIgdGhhbiBmb2xsb3dpbmcgdGhlbQorICAgICAgICAgIChkZWZhdWx0KS4gVGhpcyBhcHBsaWVzIHRvIHdpbGRjYXJkIGFuZC9vciByZWN1cnNpdmUgW01dUFVUczsKKyAgICAgICAgICBpZiBhIHNpbmdsZSBmaWxlbmFtZSBpcyBnaXZlbiwgYW5kIGl0IGhhcHBlbnMgdG8gYmUgYSBzeW1ib2xpYworICAgICAgICAgIGxpbmssIHRoZSBmaWxlIGl0IHBvaW50cyB0byBpcyBzZW50LgorCisgICAvRk9MTE9XTElOS1MKKyAgICAgICAgICAoVU5JWCBvbmx5KSBBbHdheXMgZm9sbG93IChyZXNvbHZlKSBzeW1ib2xpYyBsaW5rcywgZXZlbiBpbgorICAgICAgICAgIHdpbGRjYXJkIG9yIHJlY3Vyc2l2ZSBbTV1QVVRzLiBVc2Ugd2l0aCBjYXV0aW9uLiBXYXRjaCBvdXQgZm9yCisgICAgICAgICAgY2lyY3VsYXIgbGlua3MsIGVuZGxlc3MgbG9vcHMsIGV0Yy4KKworICAgL0VYQ0VQVDpwYXR0ZXJuCisgICAgICAgICAgRXhjZXB0aW9uIGxpc3QgLS0gZG9uJ3Qgc2VuZCBmaWxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgZ2l2ZW4KKyAgICAgICAgICBwYXR0ZXJuLiBTZWUgWzI3Nl1TZWN0aW9uIDEuNS40IG9mIHRoZSBbMjc3XUMtS2VybWl0IDcuMCBVcGRhdGUKKyAgICAgICAgICBOb3RlcyBmb3IgZGV0YWlscy4gSWYgeW91IHdhbnQgdG8gZXhjbHVkZSBhIGRpcmVjdG9yeSBmcm9tIGEKKyAgICAgICAgICByZWN1cnNpdmUgW01dUFVULCB1c2UgL0VYQ0VQVDp7ZGlybmFtZS8qfS4KKworICAgL1JFQ1VSU0lWRQorICAgICAgICAgIFNlbmRzIHRoZSBkZXNpcmVkIGZpbGVzIGZyb20gdGhlIGN1cnJlbnQgKG9yIGdpdmVuKSBkaXJlY3RvcnksCisgICAgICAgICAgcGx1cyBhbGwgZGlyZWN0b3JpZXMgYmVuZWF0aCBpdCwgaW5jbHVkaW5nIGVtcHR5IGRpcmVjdG9yaWVzLAorICAgICAgICAgIHJlcGxpY2F0aW5nIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIG9uIHRoZSBzZXJ2ZXIuIE5vIHNwZWNpYWwKKyAgICAgICAgICBjYXBhYmlsaXRpZXMgYXJlIHJlcXVpcmVkIGluIHRoZSBzZXJ2ZXIsIGJ1dCBvZiBjb3Vyc2UgeW91cgorICAgICAgICAgIGxvZ2luIElEIG9uIHRoZSBzZXJ2ZXIgbXVzdCBoYXZlIHRoZSBhcHByb3ByaWF0ZSBhY2Nlc3MgYW5kCisgICAgICAgICAgcGVybWlzc2lvbiB0byBjcmVhdGUgZGlyZWN0b3JpZXMuIFJlY3Vyc2l2ZSBQVVRzIHdvcmsgbm90IG9ubHkKKyAgICAgICAgICBiZXR3ZWVuIGxpa2UgcGxhdGZvcm1zIChlLmcuIFVOSVggdG8gVU5JWCkgYnV0IGFsc28gYmV0d2VlbgorICAgICAgICAgIHVubGlrZSBvbmVzIChlLmcuIFVOSVggdG8gVk1TIG9yIFdpbmRvd3MpLCBpbiB3aGljaCBjYXNlCisgICAgICAgICAgdGV4dC1maWxlIGZvcm1hdCBkaWZmZXJlbmNlcyBhcmUgaGFuZGxlZCBieSBLZXJtaXQncyBhdXRvbWF0aWMKKyAgICAgICAgICB0ZXh0L2JpbmFyeSBtb2RlIHN3aXRjaGluZyAoWzI3OF1TZWN0aW9uIDQpIGFuZCBjaGFyYWN0ZXItc2V0CisgICAgICAgICAgdHJhbnNsYXRpb24gKFsyNzldU2VjdGlvbiAzLjcpLiBTeW5vbnltOiAvU1VCRElSRUNUT1JJRVMuCisKKyAgIC9VUERBVEUKKyAgICAgICAgICBTZW5kIG9ubHkgZmlsZXMgdGhhdCBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lIChbMjgwXVNlY3Rpb24KKyAgICAgICAgICAzLjUuMikuCisKKyAgIC9BUlJBWTphcnJheW5hbWUKKyAgICAgICAgICBUaGUgImZpbGUiIHRvIGJlIHNlbnQgaXMgYW4gYXJyYXksIG9yIGEgc2VnbWVudCBvZiBvbmUsIHJhdGhlcgorICAgICAgICAgIHRoYW4gYSByZWFsIGZpbGUuIEluIHRoaXMgY2FzZSB0aGUgb3RoZXIgc2VsZWN0aW9uIHN3aXRjaGVzCisgICAgICAgICAgZG9uJ3QgYXBwbHkuIFRoZSBhcnJheSBjb250ZW50cyBhcmUgc2VudCBpbiB0ZXh0IG1vZGUsIGFuZCBlYWNoCisgICAgICAgICAgYXJyYXkgZWxlbWVudCBpcyB0cmVhdGVkIGFzIGEgbGluZS4gRXhhbXBsZToKKworICBmdHAgcHV0IC9hcy1uYW1lOmFycmF5LnR4dCAvYXJyYXk6JmEKKworICAgICAgICAgIChvciwgdG8gc2VuZCBhIHNlZ21lbnQgb2YgdGhlIGFycmF5LCAvYXJyYXk6JmFbMTAwOjE5OV0pLiBJZgorICAgICAgICAgIHlvdSBkb24ndCBpbmNsdWRlIGFuIC9BUy1OQU1FLCBhIG5hbWUgb2YgIl9hcnJheV94XyIgaXMgdXNlZAorICAgICAgICAgICh3aGVyZSB4IGlzIHRoZSBhcnJheSBsZXR0ZXIpLiBJZiB5b3UgaW5jbHVkZSB0aGlzIHN3aXRjaCwgbW9zdAorICAgICAgICAgIG90aGVyIHN3aXRjaGVzIGFyZSBtZWFuaW5nbGVzcyBhbmQgaWdub3JlZC4KKworICAgL0NPTU1BTkQKKyAgICAgICAgICBUaGUgImZpbGUiIHRvIGJlIHNlbnQgaXMgdGhlIHN0YW5kYXJkIG91dHB1dCBvZiBhIGNvbW1hbmQsCisgICAgICAgICAgcmF0aGVyIHRoYW4gYSByZWFsIGZpbGUuIEl0IGlzIHNlbnQgaW4gdGV4dCBvciBiaW5hcnkgbW9kZQorICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgcHJldmFpbGluZyBGVFAgVFlQRSwgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4KKyAgICAgICAgICB3aXRoIGEgL1RFWFQgb3IgL0JJTkFSWSBzd2l0Y2guIEV4YW1wbGU6IEV4YW1wbGU6CisKKyAgZnRwIHB1dCAvY29tbWFuZCAvYXMtbmFtZTp7dXNlcmxpc3R9IHtmaW5nZXIgfCBzb3J0IC1yfQorCisgICAvTElTVEZJTEU6ZmlsZW5hbWUKKyAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gb2J0YWluIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHNlbnQgZnJvbSB0aGUKKyAgICAgICAgICBmaWxlIHdob3NlIG5hbWUgaXMgZ2l2ZW4uIFRoaXMgZmlsZSBtdXN0IGNvbnRhaW4gb25lIGZpbGUKKyAgICAgICAgICBzcGVjaWZpY2F0aW9uICh3aGljaCBtYXkgYmUgd2lsZCkgcGVyIGxpbmUuIElmIHRoZSBsaXN0CisgICAgICAgICAgaW5jbHVkZXMgZmlsZXMgZnJvbSBkaWZmZXJlbnQgZGlyZWN0b3JpZXMsIHN1Y2ggYXMgYSByZWN1cnNpdmUKKyAgICAgICAgICBsaXN0aW5nIG9mIGEgZGlyZWN0b3J5IHRyZWUsIHRoZSBwYXRocyBhcmUgcmVjcmVhdGVkIG9uIHRoZQorICAgICAgICAgIHNlcnZlciAoaWYgcG9zc2libGUpIGlmIHlvdSBpbmNsdWRlIHRoZSAvUkVDVVJTSVZFIHN3aXRjaDsKKyAgICAgICAgICBvdGhlcndpc2UgYWxsIHRoZSBmaWxlcyBhcmUgc2VudCB0byB0aGUgY3VycmVudCBkaXJlY3Rvcnkgb24KKyAgICAgICAgICB0aGUgc2VydmVyLgorCisgICBOb3cgdGhlIG90aGVyIHN3aXRjaGVzOgorCisgICAvQVMtTkFNRTp0ZXh0CisgICAgICAgICAgSWYgYSBzaW5nbGUgZmlsZSBpcyBiZWluZyBzZW50LCBzZW5kIGl0IHdpdGggdGhlIGdpdmVuIHRleHQgYXMKKyAgICAgICAgICBpdHMgbmFtZS4gSWYgbXVsdGlwbGUgZmlsZXMgYXJlIGJlaW5nIHNlbnQsIHRoZSB0ZXh0IG11c3QgYmUgYQorICAgICAgICAgIHRlbXBsYXRlIHRoYXQgaW5jbHVkZXMgdmFyaWFibGVzIHN1Y2ggYXMgXHYoZmlsZW5hbWUpLAorICAgICAgICAgIFx2KGZpbGVudW1iZXIpLCBcdihudGltZSksIHRvIGFsbG93IGR5bmFtaWMgY3JlYXRpb24gb2YgZWFjaAorICAgICAgICAgIG5hbWUuIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIGFzLW5hbWUgZmllbGQgb2YgdGhlIEZUUCBQVVQKKyAgICAgICAgICBjb21tYW5kLiBJZiB0aGlzIHN3aXRjaCBpcyBub3QgaW5jbHVkZWQgKGFuZCBhbiBhcy1uYW1lIGlzIG5vdAorICAgICAgICAgIGluY2x1ZGVkIGFzIHRoZSBzZWNvbmQgZmlsZW5hbWUgdG8gUFVUKSwgZWFjaCBmaWxlIGlzIHNlbnQgd2l0aAorICAgICAgICAgIGl0cyBvd24gbmFtZS4KKworICAgL0JJTkFSWQorICAgL1RFWFQKKyAgIC9URU5FWAorICAgICAgICAgIEZvcmNlcyB0aGlzIHVwbG9hZCB0byB0YWtlIHBsYWNlIGluIHRoZSBnaXZlbiBtb2RlLCByZWdhcmRsZXNzCisgICAgICAgICAgb2YgdGhlIGN1cnJlbnQgRlRQIFRZUEUgc2V0dGluZywgYW5kIHdpdGhvdXQgYXV0b21hdGljCisgICAgICAgICAgdGV4dC9iaW5hcnkgc3dpdGNoaW5nLiAvQVNDSUkgaXMgYSBzeW5vbnltIGZvciAvVEVYVC4KKworICAgL0ZJTFRFUjpjb21tYW5kCisgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGZpbGUocykgaXMvYXJlIHRvIGJlIHBhc3NlZCB0aHJvdWdoIHRoZQorICAgICAgICAgIGdpdmVuIGNvbW1hbmQgb3IgcGlwZWxpbmUgb24gdGhlaXIgd2F5IHRvIHRoZSBzZXJ2ZXIuIEV4YW1wbGU6CisKKyAgZnRwIHB1dCAvYmluYXJ5IC9maWx0ZXI6e2d6aXAgLWMgXHYoZmlsZW5hbWUpfSAvYXMtbmFtZTpcdihmaWxlbmFtZSkuZ3ogKgorCisgICAvVFJBTlNQQVJFTlQKKyAgIC9MT0NBTC1DSEFSQUNURVItU0VUOm5hbWUKKyAgIC9TRVJWRVItQ0hBUkFDVEVSLVNFVDpuYW1lCisgICAgICAgICAgQ2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiBmb3IgdGV4dCBmaWxlcywgZXhwbGFpbmVkIGluCisgICAgICAgICAgWzI4MV1TZWN0aW9uIDMuNy4KKworICAgL0VSUk9SLUFDVElPTjp7UFJPQ0VFRCxRVUlUfQorICAgICAgICAgIE92ZXJyaWRlcyB0aGUgcHJldmFpbGluZyBbMjgyXUZUUCBFUlJPUi1BQ1RJT04gZm9yIHRoZSBkdXJhdGlvbgorICAgICAgICAgIG9mIHRoaXMgUFVUIG9yIE1QVVQgY29tbWFuZCBvbmx5LgorCisgICAvUkVDT1ZFUgorICAgICAgICAgIFJlc3VtZSBhbiBpbnRlcnJ1cHRlZCB0cmFuc2ZlciB3aGVyZSBmcm9tIHRoZSBwb2ludCBvZgorICAgICAgICAgIGludGVycnVwdGlvbiAoZXhwbGFpbmVkIGluIFsyODNdU2VjdGlvbiAzLjUuMikuIFN5bm9ueW06CisgICAgICAgICAgL1JFU1RBUlQuCisKKyAgIC9ERUxFVEUKKyAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gZGVsZXRlIGVhY2ggc291cmNlIGZpbGUgaW1tZWRpYXRlbHkgYWZ0ZXIsIGFuZAorICAgICAgICAgIG9ubHkgaWYsIGl0IGhhcyBiZWVuIHVwbG9hZGVkIGNvbXBsZXRlbHkgYW5kIHN1Y2Nlc3NmdWxseS4KKyAgICAgICAgICBUaGlzLCBpbiBlZmZlY3QsIG1vdmVzIHRoZSBmaWxlIGZyb20gdGhlIGNsaWVudCB0byB0aGUgc2VydmVyLgorCisgICAvTU9WRS1UTzpkaXJlY3RvcnkKKyAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gbW92ZSBlYWNoIHNvdXJjZSBmaWxlIHRvIHRoZSBuYW1lZCBsb2NhbAorICAgICAgICAgIGRpcmVjdG9yeSBhZnRlciwgYW5kIG9ubHkgaWYsIGl0IGhhcyBiZWVuIHVwbG9hZGVkIGNvbXBsZXRlbHkKKyAgICAgICAgICBhbmQgc3VjY2Vzc2Z1bGx5LgorCisgICAvUkVOQU1FLVRPOnRlbXBsYXRlCisgICAgICAgICAgVGVsbHMgS2VybWl0IHRvIHJlbmFtZSBlYWNoIChsb2NhbCkgc291cmNlIGZpbGUgYWNjb3JkaW5nIHRvCisgICAgICAgICAgdGhlIGdpdmVuIHRlbXBsYXRlIGFmdGVyLCBhbmQgb25seSBpZiwgaXQgaGFzIGJlZW4gdXBsb2FkZWQKKyAgICAgICAgICBjb21wbGV0ZWx5IGFuZCBzdWNjZXNzZnVsbHkuIFRoZSB0ZW1wbGF0ZSB3b3JrcyBhcyBpbiAvQVMtTkFNRS4KKworICAgL1NFUlZFUi1SRU5BTUUtVE86dGVtcGxhdGUKKyAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gYXNrIHRoZSBzZXJ2ZXIgdG8gcmVuYW1lIGVhY2ggZmlsZSBhY2NvcmRpbmcgdG8KKyAgICAgICAgICB0aGUgZ2l2ZW4gdGVtcGxhdGUgYXMgc29vbiBhcywgYW5kIG9ubHkgaWYsIGl0IGhhcyBiZWVuCisgICAgICAgICAgcmVjZWl2ZWQgY29tcGxldGVseSBhbmQgc3VjY2Vzc2Z1bGx5LiBUaGUgdGVtcGxhdGUgd29ya3MgYXMgaW4KKyAgICAgICAgICAvQVMtTkFNRS4gUmVxdWlyZXMgd3JpdGUgYW5kIHJlbmFtZSBhY2Nlc3Mgb24gdGhlIHNlcnZlciwgc28KKyAgICAgICAgICBkb2Vzbid0IHVzdWFsbHkgd29yayB3aXRoIChlLmcuKSBhbm9ueW1vdXMgdXBsb2FkcyB0byBwdWJsaWMKKyAgICAgICAgICBpbmNvbWluZyBhcmVhcyB3aGVyZSB0aGUgcGVybWlzc2lvbnMgZG9uJ3QgYWxsb3cgcmVuYW1pbmcuCisgICAgICAgICAgRXhhbXBsZXM6CisKKyAgICAgICAgZnRwIG1wdXQgL3NlcnZlci1yZW5hbWU6XHYoZmlsZW5hbWUpLm9rICoKKyAgICAgICAgICAgICAgICBBcHBlbmRzICIub2siIHRvIGVhY2ggZmlsZW5hbWUgb24gdGhlIHNlcnZlciB3aGVuIGl0J3MKKyAgICAgICAgICAgICAgICBmaW5pc2hlZCB1cGxvYWRpbmcuCisKKyAgICAgICAgZnRwIG1wdXQgL2FzLW5hbWU6XHYoZmlsZW5hbWUpLnRtcCAvc2VydmVyLXJlbmFtZTpcdihmaWxlbmFtZSkgKgorICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHJldmVyc2Ugb2YgdGhlIHByZXZpb3VzIGV4YW1wbGU7IGl0IHVzZXMgYQorICAgICAgICAgICAgICAgIHRlbXBvcmFyeSBuYW1lIHdoaWxlIHVwbG9hZGluZyBpcyBpbiBwcm9ncmVzcyBhbmQgcmV2ZXJ0cworICAgICAgICAgICAgICAgIHRoZSBmaWxlIHRvIGl0cyByZWFsIG5hbWUgd2hlbiB1cGxvYWRpbmcgaXMgY29tcGxldGUuCisKKyAgICAgICAgZnRwIG1wdXQgL2FzLW5hbWU6XHYoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgL3NlcnZlci1yZW5hbWU6Li4vZmluYWwvXHYoZmlsZW5hbWUpICoKKyAgICAgICAgICAgICAgICBNb3ZlcyB0aGUgZmlsZSBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byBhIGZpbmFsCisgICAgICAgICAgICAgICAgZGlyZWN0b3J5IHdoZW4gdGhlIHVwbG9hZCBpcyBjb21wbGV0ZSwgYnV0IGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgIHlvdSBoYXZlIHRvIGtub3cgdGhlIHBhdGhuYW1lIHN5bnRheCBvZiB0aGUgc2VydmVyLiBJZgorICAgICAgICAgICAgICAgIHRoZSByZW5hbWUgZmFpbHMsIHRoZSBbTV1QVVQgY29tbWFuZCBmYWlscyBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICAgICB0aGUgWzI4NF1GVFAgRVJST1ItQUNUSU9OIHNlbGVjdGlvbi4KKworICAgL0ZJTEVOQU1FUzp7QVVUT01BVElDLENPTlZFUlRFRCxMSVRFUkFMfQorICAgICAgICAgIE92ZXJyaWRlcyB0aGUgWzI4NV1GVFAgRklMRU5BTUVTIHNldHRpbmcgZm9yIHRoaXMgdXBsb2FkIG9ubHkuCisKKyAgIC9QRVJNSVNTSU9OUzp7T04sT0ZGfQorICAgICAgICAgIE92ZXJyaWRlcyB0aGUgWzI4Nl1GVFAgUEVSTUlTU0lPTlMgc2V0dGluZyBmb3IgdGhpcyB1cGxvYWQKKyAgICAgICAgICBvbmx5LgorCisgICAvVU5JUVVFCisgICAgICAgICAgVGVsbHMgS2VybWl0IHRvIHRlbGwgdGhlIHNlcnZlciB0byBnaXZlIFsyODdddW5pcXVlIG5hbWVzIHRvCisgICAgICAgICAgaW5jb21pbmcgZmlsZXMgdGhhdCB3b3VsZCBvdGhlcndpc2Ugb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzCisgICAgICAgICAgdGhhdCBoYXZlIHRoZSBzYW1lIG5hbWUuIFRoaXMgc3dpdGNoIGNvbmZsaWN0cyB3aXRoIC9VUERBVEUsCisgICAgICAgICAgL1JFQ09WRVIsIC9QRVJNSVNTSU9OUywgYW5kIC9TRVJWRVItUkVOQU1FIHNpbmNlIHRoZSBjbGllbnQgaGFzCisgICAgICAgICAgbm8gd2F5IG9mIGtub3dpbmcgdGhlIG5hbWUgYXNzaWduZWQgYnkgdGhlIHNlcnZlci4KKworICAgL1FVSUVUCisgICAgICAgICAgRG9uJ3QgZGlzcGxheSBmaWxlLXRyYW5zZmVyIHByb2dyZXNzIG9yIHN0YXRpc3RpY3MuCisKKyAgIC9TSU1VTEFURQorICAgICAgICAgIFNob3dzIHdoaWNoIGZpbGVzIHdvdWxkIGJlIHNlbnQgd2l0aG91dCBhY3R1YWxseSBzZW5kaW5nIHRoZW0uCisgICAgICAgICAgVXNlZnVsIChmb3IgZXhhbXBsZSkgd2l0aCAvVVBEQVRFIChuZXh0IHNlY3Rpb24pLiBUaGUgcmVzdWx0cworICAgICAgICAgIGFyZSBzaG93biBpbiB0aGUgZmlsZS10cmFuc2ZlciBkaXNwbGF5IChpZiBpdCBpcyBub3QgZGlzYWJsZWQpCisgICAgICAgICAgYW5kIGluIHRoZSB0cmFuc2FjdGlvbiBsb2cgKGlmIG9uZSBpcyBhY3RpdmUpLiBIaW50OiB1c2UgU0VUCisgICAgICAgICAgVFJBTlNGRVIgRElTUExBWSBCUklFRi4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDMuNS4yLiBVcGRhdGUgTW9kZQorCisgICBXaGVuIHlvdSBpbmNsdWRlIHRoZSAvVVBEQVRFIHN3aXRjaCwgdGhpcyBtZWFucyB0byBza2lwIHNlbmRpbmcgYW55CisgICBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMgb24gdGhlIHNlcnZlciBpZiB0aGUgbG9jYWwgZmlsZSdzCisgICBtb2RpZmljYXRpb24gZGF0ZS90aW1lIGlzIG5vdCBsYXRlciB0aGFuIHRoYXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKyAgIGZpbGUgb24gdGhlIHNlcnZlci4gSGVyZSBpcyBhIHR5cGljYWwgYXBwbGljYXRpb24gZm9yIHVwZGF0ZSBtb2RlOgorICAgU3VwcG9zZSB0aGF0IG9uIENvbXB1dGVyIEEsIHlvdSBtYWludGFpbiBhIGxhcmdlIHNldCBvZiBmaWxlcyAoc2F5LCBhCisgICBjb2xsZWN0aW9uIG9mIFdlYiBwYWdlcyBhbmQgZ3JhcGhpY3MgaW1hZ2VzLCBvciB0aGUgc291cmNlIGZpbGVzIGZvciBhCisgICBzb2Z0d2FyZSBhcHBsaWNhdGlvbiksIGFuZCB5b3UgbmVlZCB0byBrZWVwIGEgcGFyYWxsZWwgY29weSBvbiBhbm90aGVyCisgICBDb21wdXRlciwgQi4gT2YgY291cnNlIHlvdSBjb3VsZCB1cGxvYWQgdGhlIGVudGlyZSBjb2xsZWN0aW9uIGV2ZXJ5CisgICBkYXk6CisKKyAgY2Qgc291cmNlLWRpcmVjdG9yeQorICBmdHAgY29tcHV0ZXJiLnh5emNvcnAuY29tCisgICggYXV0aGVudGljYXRpb24gZGV0YWlscy4uLiApCisgIGZ0cCBjZCB0YXJnZXQtZGlyZWN0b3J5CisgIGZ0cCBwdXQgWyBzd2l0Y2hlcyBdICoKKworICAgQnV0IGlmIHRoZSB0b3RhbCBzaXplIGlzIGxhcmdlIG9yIHRoZSBuZXR3b3JrIHNsb3csIHRoaXMgd291bGQgYmUKKyAgIHVubmVjZXNzYXJpbHkgdGltZS1jb25zdW1pbmcuIFdvcnNlLCBpZiBvdGhlciB1c2VycyBvciBzaXRlcyBoYWQgdG8KKyAgIHVwZGF0ZSB3aGVuZXZlciBuZXcgZmlsZXMgYXBwZWFyZWQgaW4gQidzIGRpcmVjdG9yeSwgdGhpcyB3b3VsZCBjYXVzZQorICAgdGhlbSB1bm5lY2Vzc2FyeSB3b3JrLiBCeSBpbmNsdWRpbmcgdGhlIC9VUERBVEUgc3dpdGNoOgorCisgIGZ0cCBwdXQgL3VwZGF0ZSBbIG90aGVyLXN3aXRjaGVzIF0gKgorCisgICBvbmx5IHRob3NlIGZpbGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUgYXJlIHVwbG9hZGVkLiBIZXJlJ3MgaG93CisgICBpdCB3b3Jrcy4gRm9yIGVhY2ggbG9jYWwgZmlsZSB0aGF0IGlzIHNlbGVjdGVkIGZvciB1cGxvYWRpbmc6CisKKyAgICAgKiBUaGUgcmVtb3RlIGZpbGVuYW1lIGlzIGRldGVybWluZWQgaW4gdGhlIG5vcm1hbCB3YXksIGFjY29yZGluZyB0bworICAgICAgIHRoZSBbMjg4XUZUUCBGSUxFTkFNRVMgc2V0dGluZywgL0ZJTEVOQU1FUyBzd2l0Y2gsIG9yIHRoZSBhcy1uYW1lLAorICAgICAgIGlmIGFueS4KKyAgICAgKiBLZXJtaXQgc2VuZHMgYW4gTURUTSAobW9kaWZpY2F0aW9uIHRpbWUpIGNvbW1hbmQgZm9yIHRoZQorICAgICAgIGNvcnJlc3BvbmRpbmcgcmVtb3RlIGZpbGVuYW1lIHRvIHRoZSBzZXJ2ZXIuCisgICAgICogSWYgdGhlIHNlcnZlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSBNRFRNIGNvbW1hbmQsIHRoZSBmaWxlIGlzCisgICAgICAgc2VudC4KKyAgICAgKiBJZiB0aGUgc2VydmVyIGNhbid0IGZpbmQgYSBmaWxlIHdpdGggdGhlIGdpdmVuIG5hbWUsIHRoZSBmaWxlIGlzCisgICAgICAgc2VudC4KKyAgICAgKiBJZiB0aGUgbG9jYWwgZmlsZSdzIG1vZGlmaWNhdGlvbiB0aW1lIGlzIGxhdGVyIHRoYW4gdGhhdCBvZiB0aGUKKyAgICAgICByZW1vdGUgZmlsZSwgdGhlIGZpbGUgaXMgc2VudC4KKyAgICAgKiBPdGhlcndpc2UgLS0gdGhlIHJlbW90ZSBmaWxlIGV4aXN0cyBidXQgaXRzIG1vZGlmaWNhdGlvbiB0aW1lIGlzCisgICAgICAgZXF1YWwgdG8gb3IgZWFybGllciB0aGFuIHRoYXQgb2YgdGhlIGxvY2FsIGZpbGUgLS0gdGhlIGZpbGUgaXMKKyAgICAgICBza2lwcGVkLgorCisgICBBbGwgdGltZSBjb21wYXJpc29ucyB0YWtlIHBsYWNlIGluIENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lCisgICAoVVRDKShbMjg5XTEpLCBhbHNvIGtub3duIGFzIEdNVCBvciBadWx1IHRpbWU6IFRpbWV6b25lIDA7IHN0YW5kYXJkCisgICB0aW1lLCB3aXRob3V0IGRheWxpZ2h0IHNhdmluZ3MuCisKKyAgICAgV0FSTklORzogU29tZSBGVFAgc2VydmVycywgc3VjaCBhcyBOb3ZlbGwgTldGVFBELk5MTSwgaWdub3JlIG9yCisgICAgIG1pc2ltcGxlbWVudCB0aGUgRlRQIHNwZWNpZmljYXRpb24gYW5kIHNlbmQgbG9jYWwgdGltZSByYXRoZXIgdGhhbgorICAgICBVVEMuCisKKyAgIFVwZGF0ZSBtb2RlIGlzIHVzZWZ1bCBvbmx5IHdoZW4gYWx3YXlzIHVzZWQgaW4gdGhlIHNhbWUgZGlyZWN0aW9uLgorICAgV2hlbiB5b3UgdXBsb2FkIChQVVQpIGEgZmlsZSB3aXRoIEZUUCwgdGhlIGRlc3RpbmF0aW9uIGZpbGUgcmVjZWl2ZXMKKyAgIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvbiB0aGUgc2VydmVyJ3MgY29tcHV0ZXIsIG5vdCB0aGUgb3JpZ2luYWwKKyAgIGZpbGUncyB0aW1lc3RhbXAgKFsyOTBdMikuIElmIHlvdSB0cnkgdG8gRlRQIFBVVCAvVVBEQVRFIHRoZSBzYW1lIGZpbGUKKyAgIGFnYWluLCBpdCB3aWxsIGJlIHNraXBwZWQgKGFzIGV4cGVjdGVkKSBzaW5jZSB0aGUgcmVtb3RlIGNvcHkgaXMKKyAgIG5ld2VyLiBIb3dldmVyLCBpZiB5b3UgdHJ5IHRvIEZUUCBHRVQgL1VQREFURSB0aGUgc2FtZSBmaWxlCisgICAoWzI5MV1TZWN0aW9uIDMuNiksIGl0IHdpbGwgYmUgdHJhbnNmZXJyZWQgZm9yIHRoZSBzYW1lIHJlYXNvbi4KKworICAgVG8gY2hlY2sgdGhlIGF2YWlsYWJpbGl0eSBvZiBQVVQgL1VQREFURSBvbiBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbiwKKyAgIGlzc3VlIGFuIEZUUCBNT0RUSU1FIGNvbW1hbmQgZm9yIGEgZmlsZSB0aGF0IGlzIGtub3duIHRvIGV4aXN0IG9uIHRoZQorICAgc2VydmVyLiBJZiBpdCBzdWNjZWVkcywgUFVUIC9VUERBVEUgc2hvdWxkIHdvcmsgYW5kIGluIHRoYXQgY2FzZSwgeW91CisgICBjYW4gcnVuIGEgcHJvY2VkdXJlIGxpa2UgdGhlIG9uZSBhYm92ZSBldmVyeSBkYXk6IHRoZSBmaXJzdCB0aW1lLCBpdAorICAgc2VuZHMgYWxsIHRoZSBmaWxlczsgYWZ0ZXIgdGhhdCwgaXQgc2VuZHMgb25seSB0aGUgb25lcyB0aGF0IGNoYW5nZWQuCisgICBJZiBhIHRyYW5zYWN0aW9uIGxvZyBpcyBhY3RpdmUsIGEgbm90YXRpb24gaXMgaW5jbHVkZWQgZm9yIGFueSBmaWxlcworICAgdGhhdCBhcmUgc2tpcHBlZC4KKworICAgTm90ZXM6CisgICAgMS4gV2h5IGlzIENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lIGFiYnJldmlhdGVkIFVUQz8gRnJvbSB0aGUKKyAgICAgICBbMjkyXU5hdGlvbmFsIEluc3RpdHV0ZSBvZiBTdGFuZGFyZHMgYW5kIFRlY2hub2xvZ3kgRkFROiAiSW4gMTk3MAorICAgICAgIHRoZSBDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSBzeXN0ZW0gd2FzIGRldmlzZWQgYnkgYW4KKyAgICAgICBpbnRlcm5hdGlvbmFsIGFkdmlzb3J5IGdyb3VwIG9mIHRlY2huaWNhbCBleHBlcnRzIHdpdGhpbiB0aGUKKyAgICAgICBJbnRlcm5hdGlvbmFsIFRlbGVjb21tdW5pY2F0aW9uIFVuaW9uIChJVFUpLiBUaGUgSVRVIGZlbHQgaXQgd2FzCisgICAgICAgYmVzdCB0byBkZXNpZ25hdGUgYSBzaW5nbGUgYWJicmV2aWF0aW9uIGZvciB1c2UgaW4gYWxsIGxhbmd1YWdlcworICAgICAgIGluIG9yZGVyIHRvIG1pbmltaXplIGNvbmZ1c2lvbi4gU2luY2UgdW5hbmltb3VzIGFncmVlbWVudCBjb3VsZAorICAgICAgIG5vdCBiZSBhY2hpZXZlZCBvbiB1c2luZyBlaXRoZXIgdGhlIEVuZ2xpc2ggd29yZCBvcmRlciwgQ1VULCBvcgorICAgICAgIHRoZSBGcmVuY2ggd29yZCBvcmRlciwgVFVDLCB0aGUgYWNyb255bSBVVEMgd2FzIGNob3NlbiBhcyBhCisgICAgICAgY29tcHJvbWlzZS4iCisgICAgMi4gVGhlIEtlcm1pdCBGVFAgY2xpZW50IGlzIHVudXN1YWwgaW4gdGhhdCwgd2hlbiBkb3dubG9hZGluZyBvbmx5LAorICAgICAgIGl0IGNhbiBzZXQgdGhlIHJlY2VpdmVkIGZpbGUncyBkYXRlIGZyb20gdGhlIGZpbGUncyBkYXRlIG9uIHRoZQorICAgICAgIHNlcnZlciwgYnV0IHRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIHVwZGF0ZSBmZWF0dXJlLiBXaGVuCisgICAgICAgdXBsb2FkaW5nIHRvIGFuIEZUUCBzZXJ2ZXIsIGhvd2V2ZXIsIHRoZXJlIGlzIG5vIG1lY2hhbmlzbSBmb3IgdGhlCisgICAgICAgY2xpZW50IHRvIHNldCB0aGUgZGF0ZSBvZiB0aGUgdXBsb2FkZWQgZmlsZSBvbiB0aGUgc2VydmVyLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMy41LjMgUmVjb3ZlcnkKKworICAgU3VwcG9zZSB0aGF0IHdoaWxlIHlvdSBhcmUgdXBsb2FkaW5nIGEgbGFyZ2UgZmlsZSBvdmVyIGEgc2xvdworICAgY29ubmVjdGlvbiwgdGhlIGNvbm5lY3Rpb24gaXMgbG9zdCBiZWZvcmUgdGhlIGVudGlyZSBmaWxlIGlzCisgICB0cmFuc2ZlcnJlZC4gV2l0aCBtb3N0IEZUUCBjbGllbnRzLCB5b3Ugd291bGQgaGF2ZSB0byBzdGFydCBvdmVyLCB0aHVzCisgICByZXNlbmRpbmcgdGhlIHBvcnRpb24gb2YgdGhlIGZpbGUgdGhhdCB3YXMgc2VudCBhbHJlYWR5LCBhbmQgdGhhdCBpcworICAgYWxyZWFkeSBvbiB0aGUgc2VydmVyLiBCdXQgS2VybWl0J3MgL1JFQ09WRVIgc3dpdGNoIChTeW5vbnltOgorICAgL1JFU1RBUlQpIGxldHMgeW91IGNvbnRpbnVlIGFuIGludGVycnVwdGVkIHRyYW5zZmVyIGZyb20gdGhlIHBvaW50IG9mCisgICBmYWlsdXJlLCB0aHVzIHRyYW5zZmVycmluZyBvbmx5IHRoZSBwYXJ0IHRoYXQgd2Fzbid0IHNlbnQgYWxyZWFkeS4gVGhlCisgICBwcmVyZXF1aXNpdGVzIGZvciByZWNvdmVyeSBhcmU6CisKKyAgICAgKiBUaGUgdHJhbnNmZXIgbXVzdCBiZSBpbiBCSU5BUlkgbW9kZSwgb3IgZWxzZSB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIKKyAgICAgICBtdXN0IHJlc2lkZSBvbiBsaWtlIHN5c3RlbXMgKGUuZy4gYm90aCBvbiBzb21lIGZvcm0gb2YgVU5JWCkuCisgICAgICogVGhlIEZUUCBzZXJ2ZXIgbXVzdCBzdXBwb3J0IHRoZSBTSVpFIGNvbW1hbmQuCisKKyAgIEhlcmUncyBob3cgaXQgd29ya3MuIFdoZW4geW91IGluY2x1ZGUgdGhlIC9SRUNPVkVSIHN3aXRjaDoKKworICAgICAqIEtlcm1pdCBjaGVja3MgZm9yIGNvbmZsaWN0aW5nIHN3aXRjaGVzLCBzdWNoIGFzIC9VUERBVEUgYW5kCisgICAgICAgL1VOSVFVRTsgaWYgL1JFQ09WRVIgaXMgZ2l2ZW4gd2l0aCB0aGVzZSBzd2l0Y2hlcyBhbiBlcnJvciBvY2N1cnMuCisgICAgICAgSWYgL1JFQ09WRVIgaXMgZ2l2ZW4gaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcyB3aGVyZSBpdCBjb3VsZCBzZXJ2ZQorICAgICAgIG5vIHVzZWZ1bCBwdXJwb3NlIChlLmcuIHdpdGggYXJyYXlzLCBwaXBlcywgb3IgZmlsdGVycyksIGl0IGlzCisgICAgICAgaWdub3JlZC4KKworICAgSWYgdGhlIHN3aXRjaCBpcyBhY2NlcHRlZCwgdGhlbiBmb3IgZWFjaCBzZWxlY3RlZCBmaWxlOgorCisgICAgICogSWYgaXQgaXMgbm90IGJpbmFyeSAoZGV0ZXJtaW5lZCBieSBzY2FubmluZykgYW5kIHRoZSBjbGllbnQgYW5kCisgICAgICAgc2VydmVyIGFyZSBub3Qgb24gbGlrZSBwbGF0Zm9ybXMsIHJlY292ZXJ5IGlzIGNhbmNlbGVkICh0aGUgZW50aXJlCisgICAgICAgZmlsZSBpcyBzZW50KS4gT3RoZXJ3aXNlOgorICAgICAqIEEgU0laRSBjb21tYW5kIGlzIHNlbnQgZm9yIHRoZSBmaWxlICh1c2luZyBpdHMgcmVtb3RlIG5hbWUpLiBJZgorICAgICAgIHRoZSByZXBseSBpbmRpY2F0ZXMgdGhlIGZpbGUgd2FzIG5vdCBmb3VuZCwgb3IgdGhlIFNJWkUgY29tbWFuZAorICAgICAgIHdhcyBub3QgdW5kZXJzdG9vZCwgb3IgYW55IG90aGVyIGtpbmQgb2YgZXJyb3IsIHJlY292ZXJ5IGlzCisgICAgICAgY2FuY2VsZWQuIE90aGVyd2lzZToKKyAgICAgKiBBIE1EVE0gKG1vZGlmaWNhdGlvbiB0aW1lKSBjb21tYW5kIGlzIHNlbnQgZm9yIHRoZSBmaWxlLiBJZiBhCisgICAgICAgdmFsaWQgcmVwbHkgaXMgcmVjZWl2ZWQsIGFuZCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGxvY2FsCisgICAgICAgZmlsZSBpcyBsYXRlciB0aGFuIHRoYXQgb2YgdGhlIHJlbW90ZSBmaWxlLCByZWNvdmVyeSBpcyBjYW5jZWxlZC4KKyAgICAgICBPdGhlcndpc2U6CisgICAgICogSWYgdGhlIHNpemVzIG9mIHRoZSB0d28gZmlsZXMgYXJlIGlkZW50aWNhbCwgdGhlIGZpbGUgaXMgbm90IHNlbnQuCisgICAgICAgT3RoZXJ3aXNlOgorICAgICAqIEtlcm1pdCBzZWVrcyB0byB0aGUgcmVjb3Zlcnkgc3BvdCBpbiB0aGUgbG9jYWwgZmlsZSwgdGVsbHMgdGhlCisgICAgICAgc2VydmVyIHRvIEFQUEVORCB0aGUgZGF0YSB3aGljaCBpcyBhYm91dCB0byBhcnJpdmUgdG8gdGhlIHJlbW90ZQorICAgICAgIGZpbGUsIGFuZCB0aGVuIHNlbmRzIHRoZSBkYXRhIHN0YXJ0aW5nIGF0IHRoZSByZWNvdmVyeSBwb2ludC4KKworICAgVG8gc2FmZWd1YXJkIGZpbGUgaW50ZWdyaXR5LCByZWNvdmVyeSBpcyBub3QgYXR0ZW1wdGVkIHVubGVzcyBhbGwgdGhlCisgICBwcmVjb25kaXRpb25zIGFyZSBtZXQuIEZvciB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZWZ1bG5lc3MsIEFQUEVORCBpcworICAgdXNlZCByYXRoZXIgdGhhbiBSRVNUQVJULiBGb3Igc3RyZWFtIHRyYW5zZmVycyAodGhlIG9ubHkga2luZCB0aGF0CisgICBLZXJtaXQgc3VwcG9ydHMpIHRoZSByZXN1bHRzIGFyZSB0aGUgc2FtZS4KKworICAgQnkgZGVzaWduLCB0aGUgL1JFQ09WRVIgc3dpdGNoIGNhbiBiZSBpbmNsdWRlZCB3aXRoIGFueSBGVFAgUFVUIG9yCisgICBNUFVUIGNvbW1hbmQsIGV2ZW4gaWYgaXQgc3BlY2lmaWVzIGEgZ3JvdXAgb2YgZmlsZXMuIFRoaXMgYWxsb3dzIHlvdQorICAgdG8gcmVzdW1lIGFuIGludGVycnVwdGVkIGJhdGNoIHRyYW5zZmVyIGZyb20gd2hlcmUgaXQgbGVmdCBvZmYuIFRoZQorICAgZmlsZXMgdGhhdCB3ZXJlIGFscmVhZHkgY29tcGxldGVseSBzZW50IGFyZSBza2lwcGVkLCB0aGUgZmlsZSB0aGF0IHdhcworICAgaW50ZXJydXB0ZWQgaXMgcmVjb3ZlcmVkLCBhbmQgdGhlIHJlbWFpbmluZyBmaWxlcyBhcmUgdXBsb2FkZWQuCisKKyAgIEJ5IHRoZSB3YXksIGl0IGRvZXNuJ3QgbWF0dGVyIGhvdyB0aGUgb3JpZ2luYWwgcGFydGlhbCBmaWxlIHdhcworICAgdXBsb2FkZWQgLS0gRlRQLCBLZXJtaXQsIFptb2RlbSwgZXRjOiBhcyBsb25nIGFzIHRoZSBwcmVjb25kaXRpb25zIGFyZQorICAgbWV0LCBpdCBjYW4gYmUgcmVjb3ZlcmVkIHdpdGggRlRQIFBVVCAvUkVDT1ZFUiwgb3IgZm9yIHRoYXQgbWF0dGVyCisgICBhbHNvIHVzaW5nIEtlcm1pdCBwcm90b2NvbCBhbmQgU0VORCAvUkVDT1ZFUi4KKworICAgQSB3b3JkIG9mIGNhdXRpb24sIGhvd2V2ZXIsIHdoZW4gdGhlIG9yaWdpbmFsIHVwbG9hZCB3YXMgaW4gdGV4dCBtb2RlCisgICB3aXRoIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gKFsyOTNdU2VjdGlvbiAzLjcpOgorCisgICAgICogSWYgdGhlIG9yaWdpbmFsIHVwbG9hZCBpbnZvbHZlZCBhIHRyYW5zbGF0aW9uIGZyb20gb25lIHNpbmdsZS1ieXRlCisgICAgICAgY2hhcmFjdGVyIHNldCB0byBhbm90aGVyIChlLmcuIENvZGUgUGFnZSA4NTAgdG8gTGF0aW4tMSksIHJlY292ZXJ5CisgICAgICAgaXMgc2FmZSBpZiB5b3Ugc3BlY2lmeSB0aGUgc2FtZSB0cmFuc2xhdGlvbnMgZm9yIHRoZSByZWNvdmVyeS4gSWYKKyAgICAgICB5b3UgZG9uJ3QsIHRoZSByZXN1bHRpbmcgZmlsZSB3aWxsIGNvbnRhaW4gYSBtaXh0dXJlIG9mIGNoYXJhY3RlcgorICAgICAgIHNldHMuCisgICAgICogSWYgdGhlIG9yaWdpbmFsIHVwbG9hZCBpbnZvbHZlZCBhIHRyYW5zbGF0aW9uIHRoYXQgY2hhbmdlZCB0aGUKKyAgICAgICBzaXplIG9mIHRoZSBmaWxlIChlLmcuIGZyb20gYW4gYWxwaGFiZXRpYyBDb2RlIFBhZ2Ugb3IgTGF0aW4KKyAgICAgICBBbHBoYWJldCB0byBVbmljb2RlLCBvciB2aWNlIHZlcnNhKSwgcmVjb3ZlcnkgaXMgTk9UIHNhZmUsIGV2ZW4gaWYKKyAgICAgICB5b3Ugc3BlY2lmeSB0aGUgc2FtZSB0cmFuc2xhdGlvbnMuCisKKyAgIEtlcm1pdCBoYXMgbm8gd2F5IG9mIGtub3dpbmcgYW55dGhpbmcgYWJvdXQgdGhlIHByZXZpb3VzIHVwbG9hZC4gQXMgYQorICAgc2FmZWd1YXJkLCBhbiBlcnJvciBvY2N1cnMgaWYgeW91IGluY2x1ZGUgL1JFQ09WRVIgYW5kIGFsc28gc3BlY2lmeSBhCisgICBjaGFyYWN0ZXItc2V0IG9mIFVDUzIgb3IgVVRGOCwgc2luY2UgcmVjb3ZlcnkgY2FuJ3QgcG9zc2libHkgd29yayBpbgorICAgdGhhdCBzaXR1YXRpb24uIE90aGVyd2lzZSwgaXQncyB1cCB0byB5b3UgdG8gYXZvaWQgdW5zYWZlIHJlY292ZXJ5CisgICBvcGVyYXRpb25zLgorCisgICBbIFsyOTRdVG9wIF0gWyBbMjk1XUZUUCBUb3AgXSBbIFsyOTZdQy1LZXJtaXQgSG9tZSBdIFsgWzI5N11LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuNi4gRG93bmxvYWRpbmcgRmlsZXMgV2l0aCBGVFAKKworICAgQWx0aG91Z2ggdXBsb2FkaW5nIGZpbGVzIHdpdGggS2VybWl0J3MgRlRQIGNsaWVudCBpcyBqdXN0IGFzIGVhc3kgYW5kCisgICBmbGV4aWJsZSBhcyBzZW5kaW5nIGZpbGVzIHdpdGggS2VybWl0IHByb3RvY29sLCB0aGUgc2FtZSBpcyBub3QgYWx3YXlzCisgICB0cnVlIGZvciBkb3dubG9hZGluZyBiZWNhdXNlIEZUUCBzZXJ2ZXJzIGxhY2sgc29tZSBvZiB0aGUgY2FwYWJpbGl0aWVzCisgICBvZiBhIEtlcm1pdCBzZXJ2ZXI6CisKKyAgICAgKiBJZiB5b3Ugd2FudCB0byBnZXQgbW9yZSB0aGFuIG9uZSBmaWxlLCB5b3UgaGF2ZSB0byB1c2UgTUdFVCwgbm90CisgICAgICAgR0VULCBzaW5jZSB0aGUgdW5kZXJseWluZyBGVFAgcHJvdG9jb2wgaXMgZGlmZmVyZW50IGluIHRoZSB0d28KKyAgICAgICBjYXNlcy4gS2VybWl0IGNhbid0ICJhdXRvZGV0ZWN0IiB3aGljaCBvbmUgeW91IG1lYW4sIGFzIGl0IGNhbgorICAgICAgIHdpdGggUFVUIGFuZCBNUFVULCBzaW5jZSBpdCBjYW4ndCBiZSBleHBlY3RlZCB0byBrbm93IHRoZSB3aWxkY2FyZAorICAgICAgIHN5bnRheCBvZiB0aGUgcmVtb3RlIHBsYXRmb3JtIGFuZC9vciBGVFAgc2VydmVyICh0aGUgc2FtZSBpcyB0cnVlCisgICAgICAgZm9yIGFsbCBvdGhlciBGVFAgY2xpZW50cykuIFRvIGNvbXBsaWNhdGUgbWF0dGVycywgRlRQIHByb3RvY29sCisgICAgICAgbm93IGluY2x1ZGVzIHR3byB1bmRlcmx5aW5nIG1lY2hhbmlzbXMgKE5MU1QgYW5kIE1MU0QpIGZvcgorICAgICAgIGFjY29tcGxpc2hpbmcgTUdFVCBvcGVyYXRpb25zIGFuZCwgYXMgZXhwbGFpbmVkIGluIFsyOThdU2VjdGlvbgorICAgICAgIDMuMTEsIHRoZSB0d28gYmVoYXZlIGRpZmZlcmVudGx5LgorICAgICAqIEF1dG9tYXRpYyB0ZXh0LWJpbmFyeSBtb2RlIHN3aXRjaGluZyBpcyBub3QgZG9uZSBieSB0aGUgc2VydmVyLiBJdAorICAgICAgIGNhbiBiZSBkb25lIGJ5IHRoZSBjbGllbnQgKEtlcm1pdCksIGJ1dCBpbiB0aGlzIGNhc2UgaXQgaXMgbm90CisgICAgICAgYmFzZWQgb24gYSBmaWxlIHNjYW4gKHNpbmNlIHRoZXJlIGlzIG5vIHdheSBmb3IgS2VybWl0IHByZXNjYW4gYQorICAgICAgIHNlcnZlciBmaWxlKSwgYnV0IHJhdGhlciBvbiB0aGUgZmlsZW5hbWUsIHVzaW5nIEMtS2VybWl0IDcuMAorICAgICAgIFsyOTldZmlsZW5hbWUgcGF0dGVybnMuCisgICAgICogU29tZSBvcHRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSB3aXRoIEZUUCBQVVQgY2FuIG5vdCBiZSB1c2VkIHdpdGgKKyAgICAgICBGVFAgW01dR0VUIG9yIGRvbid0IHdvcmsgdGhlIHNhbWUgd2F5OgorICAgICAgICAgL1BFUk1JU1NJT05TIChGVFAgcHJvdG9jb2wgaGFzIG5vIG1lY2hhbmlzbSBmb3IgdGhpcykuCisgICAgICAgICAvW05PVC1dQkVGT1JFLCAvW05PVC1dQUZURVIgKGJlY2F1c2Ugb2YgdGhlIHRpbWV6b25lIHByb2JsZW0pLgorICAgICAgICAgL1JFQ09WRVIgd29ya3Mgb25seSBpbiBiaW5hcnkgbW9kZS4gICAvUkVDVVJTSVZFIGhhcyBsaW1pdGVkCisgICAgICAgdXRpbGl0eS4KKworICAgVGhlIGNvbW1hbmRzIGZvciBkb3dubG9hZGluZyBhcmU6CisKKyAgIFNFVCBGSUxFIERPV05MT0FELURJUkVDVE9SWSBbIGRpcmVjdG9yeSBdCisgICAgICAgICAgQXMgd2l0aCBLZXJtaXQgdHJhbnNmZXJzLCB0aGlzIGNvbW1hbmQsIGlmIGdpdmVuLCB0ZWxscworICAgICAgICAgIEMtS2VybWl0IHdoZXJlIHRvIHN0b3JlIGluY29taW5nIGZpbGVzIGluIHRoZSBhYnNlbmNlIG9mIGEKKyAgICAgICAgICBzcGVjaWZpYyBhcy1uYW1lLiBJZiBub3QgZ2l2ZW4sIGluY29taW5nIGZpbGVzIGFyZSBzdG9yZWQgYXMKKyAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIGFzLW5hbWUsIGlmIGFueSwgb3RoZXJ3aXNlIGluIHRoZSBjdXJyZW50CisgICAgICAgICAgZGlyZWN0b3J5LCBqdXN0IGFzIHdpdGggS2VybWl0IHRyYW5zZmVycy4gVGhlIG1vcmUgdmVyYm9zZQorICAgICAgICAgIHRyYW5zZmVyIGRpc3BsYXkgZm9ybWF0cyBnaXZlIHRoZSBmdWxsIHBhdGhuYW1lIG9mIGVhY2gKKyAgICAgICAgICByZWNlaXZlZCBmaWxlLCBhbmQsIGluIGNhc2UgeW91IGhhdmUgdHJvdWJsZSBmaW5kaW5nIGEKKyAgICAgICAgICBkb3dubG9hZGVkIGZpbGUgYWZ0ZXJ3YXJkcywgaXRzIGZ1bGwgcGF0aCBpcyBhbHNvIGxpc3RlZCBpbiB0aGUKKyAgICAgICAgICB0cmFuc2FjdGlvbiBsb2cgKGlmIHlvdSBrZXB0IG9uZSksIGFuZCB5b3UgY2FuIGFsc28gYXNrIEtlcm1pdAorICAgICAgICAgIHdoZXJlIGl0IHdlbnQgd2l0aCB0aGUgWzMwMF1XSEVSRSBjb21tYW5kLgorCisgICBTRVQgRlRQIEdFVC1GSUxFVFlQRS1TV0lUQ0hJTkcgeyBPTiwgT0ZGIH0KKyAgICAgICAgICBPTiBieSBkZWZhdWx0LCBjYXVzaW5nIEtlcm1pdCB0byBzd2l0Y2ggYXV0b21hdGljYWxseSBpbnRvIHRleHQKKyAgICAgICAgICBvciBiaW5hcnkgbW9kZSBmb3IgZWFjaCBmaWxlIGJhc2VkIG9uIHdoZXRoZXIgaXRzIG5hbWUgbWF0Y2hlcworICAgICAgICAgIGEgdGV4dCBwYXR0ZXJuIG9yIGJpbmFyeSBwYXR0ZXJuLiBTZXQgdGhpcyBPRkYsIG9yIHVzZSBhIC9URVhULAorICAgICAgICAgIC9CSU5BUlksIG9yIC9URU5FWCBzd2l0Y2ggdG8gZGVmZWF0IHRoaXMgZmVhdHVyZS4gVXNlIFNIT1cKKyAgICAgICAgICBQQVRURVJOUyB0byBzZWUgdGhlIGN1cnJlbnQgcGF0dGVybiBsaXN0LgorCisgICBbIEZUUCBdIEdFVCBbIHN3aXRjaGVzIF0gZmlsZW5hbWUgWyBhcy1uYW1lIF0KKyAgICAgICAgICBBc2tzIHRoZSBzZXJ2ZXIgdG8gc2VuZCB0aGUgZ2l2ZW4gZmlsZSwgYW5kIGlmIGl0IGNvbWVzLCBzdG9yZXMKKyAgICAgICAgICBpdCBsb2NhbGx5IHVuZGVyIHRoZSBnaXZlbiBhcy1uYW1lLCBpZiBhbnksIG90aGVyd2lzZSB1bmRlciBpdHMKKyAgICAgICAgICBvcmlnaW5hbCBuYW1lIChtb2RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGZpbGVuYW1lCisgICAgICAgICAgY29udmVyc2lvbiBvcHRpb24pLCBpbiB5b3VyIGRvd25sb2FkIGRpcmVjdG9yeSwgaWYgeW91IGhhdmUKKyAgICAgICAgICBzcGVjaWZpZWQgb25lLCBvdGhlcndpc2UgaW4gdGhlIGRpcmVjdG9yeSBpbmRpY2F0ZWQgaW4gdGhlCisgICAgICAgICAgYXMtbmFtZSwgaWYgYW55LCBvdGhlcndpc2UgaW4geW91ciBjdXJyZW50IGRpcmVjdG9yeS4gSWYgeW91CisgICAgICAgICAgYWNjaWRlbnRhbGx5IHVzZSBhIHdpbGRjYXJkIGluIHRoZSBmaWxlbmFtZSAoImdldCAqLnR4dCIpIHRoZQorICAgICAgICAgIHNlcnZlciB3aWxsIHJlcGx5IHdpdGggYSBtZXNzYWdlIGxpa2UgIkZpbGUgbm90IGZvdW5kIiAodW5sZXNzCisgICAgICAgICAgdGhlcmUgaXMgYSBmaWxlIHdob3NlIG5hbWUgYWN0dWFsbHkgaXMgIioudHh0IikuIElmIEZUUAorICAgICAgICAgIEdFVC1GSUxFVFlQRS1TV0lUQ0hJTkcgaXMgT04sIGFuZCBpbiB0aGUgYWJzZW5jZSBvZiBhbnkgR0VUCisgICAgICAgICAgc3dpdGNoZXMgdG8gb3ZlcnJpZGUgaXQsIHRoZSBmaWxlIGlzIHRyYW5zZmVycmVkIGluIGJpbmFyeSBtb2RlCisgICAgICAgICAgaWYgaXQgbWF0Y2hlcyBhbnkgb2YgS2VybWl0J3MgYmluYXJ5IG5hbWUgcGF0dGVybnMsIGFuZCBpbiB0ZXh0CisgICAgICAgICAgbW9kZSBpZiBpdCBtYXRjaGVzIGFueSBvZiBLZXJtaXQncyB0ZXh0IG5hbWUgcGF0dGVybnMsIGFuZCBpbgorICAgICAgICAgIHRoZSBwcmV2YWlsaW5nIEZUUCBUWVBFIGlmIGl0IG1hdGNoZXMgbm9uZSBvZiB0aGVzZSBwYXR0ZXJucy4KKworICAgWyBGVFAgXSBNR0VUIFsgc3dpdGNoZXMgXSBmaWxlc3BlYyBbIGZpbGVzcGVjIFsgZmlsZXNwZWMgWyAuLi4gXSBdIF0KKyAgICAgICAgICBMaWtlIEdFVCwgYnV0IGZvciBtdWx0aXBsZSBmaWxlcy4gT25lIG9yIG1vcmUgZmlsZQorICAgICAgICAgIHNwZWNpZmljYXRpb25zIGNhbiBiZSBnaXZlbiwgYW5kIGFueSBvciBhbGwgKG9yIG5vbmUpIG9mIHRoZW0KKyAgICAgICAgICBjYW4gY29udGFpbiB3aWxkY2FyZHMgb3IgY2FuIGJlIGRpcmVjdG9yeSBuYW1lcy4gVGhlIGZpbGUgbGlzdAorICAgICAgICAgIG1heSBub3QgaW5jbHVkZSBhbiBhcy1uYW1lLCBidXQgeW91IGNhbiBzdGlsbCBnaXZlIG9uZSB3aXRoIHRoZQorICAgICAgICAgIC9BUy1OQU1FOiBzd2l0Y2guCisKKyAgIEluIGJvdGggdGhlIEZUUCBHRVQgYW5kIE1HRVQgY29tbWFuZHMsIGFueSBmaWxlbmFtZXMgdGhhdCBjb250YWluCisgICBzcGFjZXMgbXVzdCBiZSBlbmNsb3NlZCBpbiBicmFjZXMgb3IgZG91YmxlcXVvdGVzIChzZWUgWzMwMV1TZWN0aW9uIDUKKyAgIGZvciBkZXRhaWxzKS4KKworICAgRlRQIGRvd25sb2FkcyBtYXkgYmUgaW50ZXJydXB0ZWQganVzdCBsaWtlIEtlcm1pdCB0cmFuc2ZlcnMuIFdoaWxlIHRoZQorICAgdHJhbnNmZXIgaXMgaW4gcHJvZ3Jlc3MsIHR5cGU6CisKKyAgICAgKiBYIHRvIGludGVycnVwdCB0aGUgY3VycmVudCBmaWxlIGFuZCBnbyBvbiB0byB0aGUgbmV4dCBmaWxlLgorICAgICAqIFogKG9yIENvbnRyb2wtQykgdG8gY2FuY2VsIHRoZSBjdXJyZW50IGZpbGUgYW5kIGFsbCByZW1haW5pbmcKKyAgICAgICBmaWxlcy4KKworICAgQmVmb3JlIHByb2NlZWRpbmcsIGEgYnJpZWYgd29yZCBhYm91dCB0ZW1wb3JhcnkgZmlsZXMuIEluIEZUUAorICAgcHJvdG9jb2wsIHRoZSBNR0VUIGNvbW1hbmQgd29ya3MgYnkgcmVxdWVzdGluZyBhIGZpbGUgbGlzdCBmcm9tIHRoZQorICAgc2VydmVyLCBhbmQgdGhlbiAoaW50ZXJuYWxseSkgaXNzdWluZyBhIEdFVCBjb21tYW5kIChGVFAgUkVUUiBwcm90b2NvbAorICAgZGlyZWN0aXZlKSBmb3IgZWFjaCBmaWxlLiBUaGUgZmlsZSBsaXN0IHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIgY2FuIGJlCisgICBhbnkgc2l6ZSBhdCBhbGwsIHNvIGluIGNhc2UgaXQgaXMgaHVnZSwgd2UgZG9uJ3Qgc3RvcmUgaXQgaW4gbWVtb3J5OworICAgaW5zdGVhZCB3ZSBwdXQgaXQgaW4gYSB0ZW1wb3JhcnkgZmlsZS4gRm9yIHRyb3VibGVzaG9vdGluZyBwdXJwb3NlcywKKyAgIHlvdSBzaG91bGQgYmUgYXdhcmUgb2YgdHdvIHBvaW50czoKKworICAgIDEuIFRoZSBsb2NhdGlvbiBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgaXMgY2hvc2VuIGFjY29yZGluZyB0aGUgVE1QIG9yCisgICAgICAgVEVNUCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIElmIG5laXRoZXIgb2YgdGhlc2UgdmFyaWFibGVzIGlzCisgICAgICAgZGVmaW5lZCwgeW91IG1pZ2h0IG5lZWQgdG8gZGVmaW5lIGl0LiBJbiBjYXNlIHRoZXJlIGlzIG5vdCBlbm91Z2gKKyAgICAgICBzcGFjZSBvbiB0aGUgaW5kaWNhdGVkIGRpc2sgb3IgcGFydGl0aW9uIGZvciB0aGUgc2VydmVyJ3MgZmlsZQorICAgICAgIGxpc3QsIHlvdSBtaWdodCBuZWVkIHRvIGVpdGhlciBjbGVhbiB1cCB0aGUgdGVtcG9yYXJ5IGFyZWEsIG9yCisgICAgICAgcmVkZWZpbmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGluZGljYXRlIGEgZGlmZmVyZW50IGFyZWEKKyAgICAgICB0aGF0IGhhcyBzdWZmaWNpZW50IHNwYWNlLgorICAgIDIuIElmIHlvdSB3YW50IHRvIGxvb2sgYXQgdGhlIGxpc3QgeW91cnNlbGYsIHVzZSBTRVQgRlRQIERFQlVHIE9OLgorICAgICAgIFRoaXMgdGVsbHMgS2VybWl0IHRvIChhKSBnaXZlIHlvdSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUKKyAgICAgICB0ZW1wb3JhcnkgZmlsZSBhdCB0aGUgZW5kIG9mIGVhY2ggTUdFVCBjb21tYW5kLCBhbmQgKGIpIG5vdCB0bworICAgICAgIGRlbGV0ZSBpdCwgYXMgaXQgbm9ybWFsbHkgZG9lcy4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDMuNi4xLiBGVFAgR0VUIFN3aXRjaGVzCisKKyAgIFRoZSBmb2xsb3dpbmcgc3dpdGNoZXMgYXJlIGF2YWlsYWJsZSB3aXRoIEZUUCBHRVQgYW5kIE1HRVQ6CisKKyAgIC9URVhUCisgICAgICAgICAgU3BlY2lmaWVzIGEgdGV4dC1tb2RlIHRyYW5zZmVyLiBPdmVycmlkZXMgdGhlIGdsb2JhbCBGVFAgVFlQRQorICAgICAgICAgIHNldHRpbmcgYW5kIGZpbGVuYW1lIHBhdHRlcm4tbWF0Y2hpbmcgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUKKyAgICAgICAgICBjdXJyZW50IGNvbW1hbmQgb25seSwgQWxsIGZpbGVzIGFyZSBkb3dubG9hZGVkIGluIHRleHQgbW9kZS4KKyAgICAgICAgICBTeW5vbnltOiAvQVNDSUkuCisKKyAgIC9CSU5BUlkKKyAgICAgICAgICBTcGVjaWZpZXMgYSBiaW5hcnktbW9kZSB0cmFuc2Zlci4gT3ZlcnJpZGVzIHRoZSBnbG9iYWwgRlRQIFRZUEUKKyAgICAgICAgICBzZXR0aW5nIGFuZCBmaWxlbmFtZSBwYXR0ZXJuLW1hdGNoaW5nIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlCisgICAgICAgICAgY3VycmVudCBjb21tYW5kIG9ubHkuIEFsbCBmaWxlcyBhcmUgZG93bmxvYWRlZCBpbiBiaW5hcnkgbW9kZS4KKworICAgL1RFTkVYCisgICAgICAgICAgTGlrZSAvQklOQVJZIGJ1dCBzcGVjaWZpZXMgYSBzcGVjaWFsIGJpbmFyeSB0cmFuc2ZlciBtb2RlIHRvIGJlCisgICAgICAgICAgdXNlZCB3aGVuIGdldHRpbmcgOC1iaXQgYmluYXJ5IGZpbGVzIGZyb20gYSAzNi1iaXQgcGxhdGZvcm0KKyAgICAgICAgICBzdWNoIGFzIFRPUFMtMTAsIFRPUFMtMjAsIG9yIFRFTkVYLiBBbGwgZmlsZXMgYXJlIGRvd25sb2FkZWQgaW4KKyAgICAgICAgICB0aGUgc3BlY2lhbCBiaW5hcnkgbW9kZS4KKworICAgL1JFQ09WRVIKKyAgICAgICAgICBUaGlzIGluc3RydWN0cyBLZXJtaXQgdG8gdHJ5IHRvIHJlY292ZXIgYW4gaW5jb21wbGV0ZSBkb3dubG9hZAorICAgICAgICAgIGZyb20gdGhlIHBvaW50IG9mIGZhaWx1cmUuIFdvcmtzIG9ubHkgaW4gYmluYXJ5IG1vZGUsIGFuZCBvbmx5CisgICAgICAgICAgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyB0aGUgKG5vdC15ZXQtc3RhbmRhcmQpIEZUUCAiUkVTVCIKKyAgICAgICAgICBkaXJlY3RpdmUuIFNlZSBbMzAyXVNlY3Rpb24gMy42LjMgZm9yIGRldGFpbHMuIFN5bm9ueW06CisgICAgICAgICAgL1JFU1RBUlQuCisKKyAgIC9GSUxFTkFNRVM6e0NPTlZFUlRFRCxMSVRFUkFMfQorICAgICAgICAgIE92ZXJyaWRlcyB0aGUgWzMwM11GVFAgRklMRU5BTUVTIChmaWxlbmFtZSBjb252ZXJzaW9uKSBzZXR0aW5nCisgICAgICAgICAgZm9yIHRoaXMgZG93bmxvYWQgb25seSwgZm9yY2luZyBpbmNvbWluZyBmaWxlbmFtZXMgdG8gYmUgZWl0aGVyCisgICAgICAgICAgY29udmVydGVkIG9yIHRha2VuIGxpdGVyYWxseS4KKworICAgL0FTLU5BTUU6dGV4dAorICAgICAgICAgIEZvciBHRVQsIHRoaXMgaXMgZXF1aXZhbGVudCB0byBnaXZpbmcgYW4gYXMtbmFtZSBhZnRlciB0aGUKKyAgICAgICAgICBmaWxlbmFtZS4gRm9yIE1HRVQsIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIHNwZWNpZnkgYWx0ZXJuYXRpdmUKKyAgICAgICAgICBuYW1lcyBmb3IgdGhlIGluY29taW5nIGZpbGVzLiBXaXRoIE1HRVQsIHRoZSAvQVMtTkFNRSB0ZXh0CisgICAgICAgICAgc2hvdWxkIChtdXN0KSBjb250YWluIGEgS2VybWl0IHZhcmlhYmxlLCB1c3VhbGx5IFx2KGZpbGVuYW1lKQorICAgICAgICAgIG9yIFx2KGZpbGVudW1iZXIpLiBFeGFtcGxlOgorCisgIG1nZXQgL3RleHQgL2FzLW5hbWU6XHYoZmlsZW5hbWUpLm5ldyAqLmMKKworICAgICAgICAgIFRoaXMgZ2V0cyBhbGwgIi5jIiBmaWxlcyBhbmQgc3RvcmVzIHRoZW0gd2l0aCAiCisKKyAgICAgICAgICAubmV3IiBhcHBlbmRlZCB0byB0aGVpciBuYW1lcy4gU2VlIHRoZSBbMzA0XUMtS2VybWl0IDcuMCBVcGRhdGUKKyAgICAgICAgICBOb3RlcyBmb3IgZGV0YWlscy4KKworICAgL0NPTU1BTkQKKyAgICAgICAgICBUaGlzIHNwZWNpZmllcyB0aGF0IHRoZSBpbmNvbWluZyBmaWxlIGlzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlCisgICAgICAgICAgc3RhbmRhcmQgaW5wdXQgb2YgYSBjb21tYW5kLCByYXRoZXIgdGhhbiB0byBhIGZpbGUuIFRoZSBjb21tYW5kCisgICAgICAgICAgbmFtZSBpcyB0aGUgYXMtbmFtZSBmcm9tIHRoZSBHRVQgY29tbWFuZCBvciB0aGUgL0FTLU5BTUUKKyAgICAgICAgICBhcmd1bWVudC4gSWYgeW91IG5lZWQgdG8gcmVmZXIgdG8gdGhlIGluY29taW5nIGZpbGUncyBuYW1lIGluCisgICAgICAgICAgdGhlIGNvbW1hbmQsIHVzZSBcdihmaWxlbmFtZSkuIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCisgICAgICAgICAgcmVndWxhciBLZXJtaXQgWzMwNV1HRVQgL0NPTU1BTkQgY29tbWFuZCBmb3IgZGV0YWlscyBhbmQKKyAgICAgICAgICBleGFtcGxlcy4KKworICAgL1FVSUVUCisgICAgICAgICAgVHJhbnNmZXJzIHRoZSBmaWxlcyBxdWlldGx5OyBkb24ndCBwdXQgdXAgYSBmaWxlLXRyYW5zZmVyCisgICAgICAgICAgZGlzcGxheS4KKworICAgL0VSUk9SLUFDVElPTjp7UVVJVCxQUk9DRUVEfQorICAgICAgICAgIFRoaXMgc3dpdGNoIGFmZmVjdHMgb25seSBNR0VULiBJZiBhbiBlcnJvciBvY2N1cnMgd2l0aCBhCisgICAgICAgICAgcGFydGljdWxhciBmaWxlLCB0aGlzIHRlbGxzIHdoZXRoZXIgdG8gZ28gb24gdG8gdGhlIG5leHQgZmlsZQorICAgICAgICAgIChQUk9DRUVEKSBvciB0byBzdG9wIHJpZ2h0IGF3YXkgYW5kIGZhaWwgKFFVSVQpLiBUaGUgZGVmYXVsdCBpcworICAgICAgICAgIFBST0NFRUQuCisKKyAgIFRoZSBmaWxlIHNlbGVjdGlvbiBzd2l0Y2hlcyBhcmU6CisKKyAgIC9FWENFUFQ6e3BhdHRlcm59IG9yIC9FWENFUFQ6e3twYXR0ZXJufXtwYXR0ZXJufXsuLi59fQorICAgICAgICAgIEV4Y2VwdGlvbiBsaXN0IGZvciBNR0VUOyBza2lwIGRvd25sb2FkaW5nIGFueSBmaWxlIHdob3NlIG5hbWUKKyAgICAgICAgICBtYXRjaGVzIGFueSBvZiB0aGUgZ2l2ZW4gcGF0dGVybnMgKHdoZW4gdXNpbmcgdGhlIHNlY29uZAorICAgICAgICAgIGZvcm1hdCwgdXAgdG8gNjQgcGF0dGVybnMgbWF5IGJlIHNwZWNpZmllZCkuIFszMDZdQ0xJQ0sgSEVSRQorICAgICAgICAgIGZvciBzeW50YXggZGV0YWlscy4KKworICAgL1NNQUxMRVItVEhBTjpudW1iZXIKKyAgICAgICAgICBEb3dubG9hZCBvbmx5IGZpbGVzIHdob3NlIHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSBnaXZlbiBudW1iZXIKKyAgICAgICAgICBvZiBieXRlcyAob2N0ZXRzKS4gUmVxdWlyZXMgdGhhdCB0aGUgRlRQIHNlcnZlciBzdXBwb3J0IHRoZQorICAgICAgICAgIFNJWkUgb3IgTUxTRCBkaXJlY3RpdmUuCisKKyAgIC9MQVJHRVItVEhBTjpudW1iZXIKKyAgICAgICAgICBEb3dubG9hZCBvbmx5IGZpbGVzIHdob3NlIHNpemUgaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBudW1iZXIKKyAgICAgICAgICBvZiBieXRlcy4gUmVxdWlyZXMgdGhhdCB0aGUgRlRQIHNlcnZlciBzdXBwb3J0IHRoZSBTSVpFIG9yIE1MU0QKKyAgICAgICAgICBkaXJlY3RpdmUuCisKKyAgIC9OT0JBQ0tVUEZJTEVTCisgICAgICAgICAgRHVyaW5nIE1HRVQsIGRvbid0IGRvd25sb2FkIGFueSBmaWxlcyB3aG9zZSBuYW1lcyBlbmQgd2l0aAorICAgICAgICAgIGJhY2t1cCBzdWZmaXhlcyAoLn5ufiB3aGVyZSBuIGlzIGEgbnVtYmVyKS4KKworICAgL05PRE9URklMRVMKKyAgICAgICAgICBEdXJpbmcgTUdFVCwgZG9uJ3QgZG93bmxvYWQgYW55IGZpbGVzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGgKKyAgICAgICAgICBwZXJpb2QgKC4pLiBFcXVpdmFsZW50IHRvIC9FWENFUFQ6ey4qfS4KKworICAgL0xJU1RGSUxFOmxvY2FsLWZpbGVuYW1lCisgICAgICAgICAgVGhlIGdpdmVuIGZpbGUgY29udGFpbnMgYSBsaXN0IG9mIGZpbGVzIHRvIEdFVCwgb25lIHBlciBsaW5lLgorICAgICAgICAgIEZpbGVuYW1lcyBpbiB0aGUgbGlzdGZpbGUgY2FuIGNvbnRhaW4gd2lsZGNhcmQgY2hhcmFjdGVycyBpbgorICAgICAgICAgIHRoZSBzeW50YXggb2YgdGhlIHNlcnZlci4gVGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZgorICAgICAgICAgIGxpbmVzIGluIHRoZSBsaXN0ZmlsZS4KKworICAgL05BTUVMSVNUOmxvY2FsLWZpbGVuYW1lCisgICAgICAgICAgSWYgdGhpcyBzd2l0Y2ggaXMgZ2l2ZW4sIHRoZW4gaW5zdGVhZCBvZiBhY3R1YWxseSByZXRyaWV2aW5nCisgICAgICAgICAgdGhlIHNlbGVjdGVkIGZpbGVzLCB0aGUgR0VUIGNvbW1hbmQgcmV0cmlldmVzIGEgbGlzdCBvZiB0aGUKKyAgICAgICAgICBuYW1lcyBvZiB0aGUgZmlsZXMgdGhhdCB3b3VsZCBiZSByZXRyaWV2ZWQsIGFuZCBwbGFjZXMgaXQgaW4KKyAgICAgICAgICB0aGUgc3BlY2lmZWQgZmlsZS4gVGhlIHJlc3VsdGluZyBmaWxlIGlzIGFuIG9yZGluYXJ5IHRleHQgZmlsZSwKKyAgICAgICAgICB3aXRoIG9uZSBmaWxlbmFtZSBwZXIgbGluZSwgc3VpdGFibGUgZm9yIHJlYWRpbmcgYnkgYSBwZXJzb24sCisgICAgICAgICAgb3IgcHJvY2Vzc2luZyBieSBhIGNvbXB1dGVyIHByb2dyYW0sIGluY2x1ZGluZyBLZXJtaXQgaXRzZWxmCisgICAgICAgICAgKEZPUEVOIC8gRlJFQUQgLyBGV1JJVEUgLyBGQ0xPU0UpLCBhbmQgYXMgL0ZJTEVMSVNUOiBmaWxlLiBJZgorICAgICAgICAgIHRoZSBmaWxlbmFtZSBpcyBvbWl0dGVkIG9yIGdpdmVuIGFzICItIiAoZGFzaCwgaHlwaGVuKSwgdGhlCisgICAgICAgICAgbGlzdCBnb2VzIHRvIHRoZSBzY3JlZW4uIE5PVEU6IGlmIHlvdSB3YW50IGEgY29weSBvZiB0aGUKKyAgICAgICAgICBjb21wbGV0ZSBsaXN0IHNlbnQgYnkgdGhlIHNlcnZlciwgdXNlIFNFVCBGVFAgREVCVUcgT04sIHBlcmZvcm0KKyAgICAgICAgICBhbiBNR0VULCBhbmQgdGhlIHRlbXBvcmFyeSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpc3Qgd2lsbCBiZQorICAgICAgICAgIGtlcHQgcmF0aGVyIHRoYW4gZGVsZXRlZCAoYW5kIEtlcm1pdCB0ZWxscyB5b3UgaXRzIG5hbWUpLgorCisgICAvVVBEQVRFLCAvQ09MTElTSU9OOmtleXdvcmQKKyAgICAgICAgICBFeHBsYWluZWQgaW4gWzMwN11TZWN0aW9uIDMuNi4yLgorCisgICAvUkVDVVJTSVZFCisgICAgICAgICAgVGhpcyBtZWFucyB0byB0cnkgdG8gZG93bmxvYWQgYW4gZW50aXJlIGRpcmVjdG9yeSB0cmVlLCByYXRoZXIKKyAgICAgICAgICB0aGFuIGp1c3QgZmlsZXMgZnJvbSBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5LiBJbiBmYWN0LCBGVFAKKyAgICAgICAgICBwcm90b2NvbCBkb2VzIG5vdCBwcm92aWRlIGEgbWV0aG9kIHRvIHJlcXVlc3QgYSByZWN1cnNpdmUKKyAgICAgICAgICBkb3dubG9hZCAodW5sZXNzIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgTUxTRDsgc2VlIFszMDhdU2VjdGlvbgorICAgICAgICAgIDMuMTEpLCBzbyB0aGlzIHdvcmtzIG9ubHkgaWYgdGhlIEZUUCBzZXJ2ZXIgZG9lcyBpdCBhbnl3YXksCisgICAgICAgICAgd2l0aG91dCBiZWluZyBhc2tlZCwgYXMgc29tZSBkby4gSW4gdGhpcyBjYXNlLCBLZXJtaXQgZGV0ZWN0cworICAgICAgICAgIHRoYXQgbmFtZXMgaW4gdGhlIHJldHVybmVkIGZpbGUgbGlzdCBjb250YWluIGRpcmVjdG9yeQorICAgICAgICAgIHNlcGFyYXRvcnMsIGFuZCB0aGVyZWZvcmUgYXR0ZW1wdHMgdG8gY3JlYXRlIHRoZSBuZWVkZWQKKyAgICAgICAgICBkaXJlY3RvcmllcyBhcyB0aGUgZmlsZXMgYXJyaXZlLiBCdXQgdGhpcyBjYW4gd29yayBvbmx5IGlmIHRoZQorICAgICAgICAgIHNlcnZlciBpcyBvbiB0aGUgc2FtZSBraW5kIG9mIHBsYXRmb3JtIGFzIHRoZSBjbGllbnQsIHNvIHRoZQorICAgICAgICAgIHBhdGhuYW1lIHN5bnRheCBjYW4gYmUgcmVjb2duaXplZCwgYW5kIGFsc28gYmVjYXVzZSB0aGUgc2VydmVyCisgICAgICAgICAgZG9lcyBub3Qgc3dpdGNoIGJldHdlZW4gdGV4dCBhbmQgYmluYXJ5IG1vZGUsIHdoaWNoIHdvdWxkIGJlCisgICAgICAgICAgdml0YWwgZm9yIGNyb3NzLXBsYXRmb3JtIHRyYW5zZmVycy4gVXNlIHdpdGggY2F1dGlvbi4gU3lub255bToKKyAgICAgICAgICAvU1VCRElSRUNUT1JJRVMuCisKKyAgICAgICAgICBFdmVuIHdoZW4gdGhlIHNlcnZlciBkb2VzIG5vdCBwcm92aWRlIHJlY3Vyc2l2ZSBmaWxlIGxpc3RzLAorICAgICAgICAgIFtNXUdFVCAvUkVDVVJTSVZFIGZvcmNlcyBLZXJtaXQgdG8gcmVwbGljYXRlIGFueSBkaXJlY3RvcnkKKyAgICAgICAgICBzdHJ1Y3R1cmUgaW1wbGllZCBvciBleHByZXNzZWQgYnkgdGhlIHNlcnZlcidzIGZpbGUgbGlzdC4gRm9yCisgICAgICAgICAgZXhhbXBsZToKKworICBnZXQgc29tZXBhdGgvc29tZWZpbGUKKworICAgICAgICAgIEdldHMgdGhlIGZpbGUgbmFtZWQgc29tZWZpbGUgZnJvbSB0aGUgc2VydmVyJ3Mgc29tZXBhdGgKKyAgICAgICAgICBkaXJlY3RvcnkgYW5kIHB1dHMgaXQgS2VybWl0J3MgY3VycmVudCAob3IgZG93bmxvYWQpIGRpcmVjdG9yeSwKKyAgICAgICAgICB3aGVyZWFzOgorCisgIGdldCAvcmVjdXJzaXZlIHNvbWVwYXRoL3NvbWVmaWxlCisKKyAgICAgICAgICBjcmVhdGVzIHRoZSBwYXRoIGxvY2FsbHkgYW5kIHRoZW4gcHV0cyB0aGUgZmlsZSBpbiBpdC4KKyAgICAgICAgICBTaW1pbGFybHkgZm9yIE1HRVQ6CisKKyAgbWdldCAqL2RhdGEvKgorCisgICAgICAgICAgZG93bmxvYWRzIGFsbCB0aGUgZmlsZXMgaW4gYWxsIHRoZSBkYXRhIHN1YmRpcmVjdG9yaWVzIG9mIGFsbAorICAgICAgICAgIHRoZSBzdWJkaXJlY3RvcmllcyBvZiB0aGUgc2VydmVyJ3MgY3VycmVudCBkaXJlY3RvcnkgYW5kIHN0b3JlcworICAgICAgICAgIHRoZW0gbG9jYWxseSBpbiBLZXJtaXQncyBjdXJyZW50IChvciBkb3dubG9hZCkgZGlyZWN0b3J5LAorICAgICAgICAgIHdoZXJlYXM6CisKKyAgbWdldCAvcmVjdXJzaXZlICovZGF0YS8qCisKKyAgICAgICAgICByZS1jcmVhdGVzIHRoZSBzZXJ2ZXIncyBkaXJlY3Rvcnkgc3RydWN0dXJlIGxvY2FsbHkuCisKKyAgIFRoZSBGVFAgcHJvdG9jb2wgZG9lcyBub3QgaW5jbHVkZSBleHBsaWNpdCBtZWNoYW5pc21zIGZvciByZWN1cnNpb24sCisgICBzbyBLZXJtaXQgYnVpbGRzIHVwb24gd2hhdCBpcyBhdmFpbGFibGUuIEFsdGhvdWdoIGFuIEludGVybmV0IGRyYWZ0CisgICBkZXNjcmliZXMgYSBtZWNoYW5pc20gKCJNTFNEIikgdGhhdCB3b3VsZCBhbGxvdyBwcm90b2NvbC1kcml2ZW4KKyAgIHJlY3Vyc2lvbiwgc2ltaWxhciB0byBLZXJtaXQncyBGaWxlIEF0dHJpYnV0ZSBwYWNrZXRzIChjaXJjYSAxOTg0KSwgaXQKKyAgIGhhcyBub3QgeWV0IGF0dGFpbmVkIFJGQyBvciBzdGFuZGFyZCBzdGF0dXMsIGFuZCBzZXJ2ZXJzIGFyZSBub3QgeWV0CisgICB3aWRlbHkgYXZhaWxhYmxlIHRoYXQgb2ZmZXIgdGhpcyBmZWF0dXJlLiBJbiB0aGUgbWVhbnRpbWUsIHRoZQorICAgZWZmZWN0aXZlbmVzcyBvZiBNR0VUIC9SRUNVUlNJVkUgZGVwZW5kcyBvbiB0aGUgRlRQIHNlcnZlcgorICAgaW1wbGVtZW50YXRpb24uIElmIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIHJlY3Vyc2l2ZSBsaXN0IGluIHJlc3BvbnNlIHRvCisgICB0aGUgc3RhbmRhcmQgTkxTVCBjb21tYW5kICh3aG9zZSBiZWhhdmlvciBpcyBpbGwtZGVmaW5lZCksIEtlcm1pdCdzCisgICBGVFAgTUdFVCAvUkVDVVJTSVZFIGNvbW1hbmQgdXNlcyBpdCB0byByZS1jcmVhdGUgdGhlIHJlbW90ZSBkaXJlY3RvcnkKKyAgIHRyZWUgbG9jYWxseS4gSWYgdGhlIHNlcnZlciBzdXBwb3J0cyBNTFNELCBDLUtlcm1pdCA4LjAuMjA2IGFuZCBLZXJtaXQKKyAgIDk1IDIuMSBhbmQgbGF0ZXIgYXJlIGFibGUgdG8gc2Vuc2UgaXQgYXV0b21hdGljYWxseSBhbmQgdXNlIGl0LCBhcworICAgZGVzY3JpYmVkIGJlbG93IGluIFszMDldU2VjdGlvbiAzLjExLgorCisgICBUaGUgL0JFRk9SRTosIC9BRlRFUjosIC9OT1QtQkVGT1JFOiwgYW5kIC9OT1QtQUZURVI6IHN3aXRjaGVzIGFyZSBub3QKKyAgIGF2YWlsYWJsZSBmb3IgZG93bmxvYWRpbmcgYmVjYXVzZSBvZiB0aGUgY29uZnVzaW9uIHdpdGggdGltZXpvbmVzLgorICAgV291bGQgdGhlIGdpdmVuIHRpbWVzIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZSwgdGhlIHNlcnZlcidzIHRpbWV6b25lLAorICAgb3IgR01UPyBUaGUgRlRQIHNlcnZlcidzIGRpcmVjdG9yeSBsaXN0aW5ncyBzaG93IGl0cyBvd24gbG9jYWwgdGltZXMKKyAgIGJ1dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQgdGltZXpvbmUgdGhlIHNlcnZlciBpcyBpbiwgdGhlcmUncyBubyB3YXkKKyAgIHRvIHJlY29uY2lsZSBvdXIgbG9jYWwgdGltZXMgd2l0aCB0aGUgc2VydmVyJ3MuIFNpbWlsYXJseSwKKyAgIC9QRVJNSVNTSU9OUyBjYW4ndCBiZSBwcmVzZXJ2ZWQgaW4gZG93bmxvYWRzIGJlY2F1c2UgRlRQIHByb3RvY29sCisgICBwcm92aWRlcyBubyBtZWFucyBvZiBxdWVyeWluZyB0aGUgc2VydmVyIGZvciBhIGZpbGUncyBwZXJtaXNzaW9uLgorCisgICBTb3VyY2UtZmlsZSBkaXNwb3NpdGlvbiBzd2l0Y2hlczoKKworICAgL0RFTEVURQorICAgICAgICAgIEVhY2ggZmlsZSB0aGF0IGlzIGRvd25sb2FkZWQgc3VjY2Vzc2Z1bGx5IGlzIHRvIGJlIGRlbGV0ZWQgZnJvbQorICAgICAgICAgIHRoZSBzZXJ2ZXIuIFJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBmaWxlIGFjY2VzcyByaWdodHMgb24gdGhlCisgICAgICAgICAgc2VydmVyLgorCisgICAvU0VSVkVSLVJFTkFNRS1UTzp0ZW1wbGF0ZQorICAgICAgICAgIEFza3MgdGhlIHNlcnZlciB0byByZW5hbWUgZWFjaCAocmVtb3RlKSBzb3VyY2UgZmlsZSBpbW1lZGlhdGVseQorICAgICAgICAgIGFmdGVyLCBhbmQgb25seSBpZiwgaXQgaXMgc2VudCBjb3JyZWN0bHkuIFNlZSBbMzEwXVBVVAorICAgICAgICAgIC9TRVJWRVItUkVOQU1FLVRPOiBmb3IgZGV0YWlscy4KKworICAgRGVzdGluYXRpb24tZmlsZSBkaXNwb3NpdGlvbiBzd2l0Y2hlczoKKworICAgL1RPLVNDUkVFTgorICAgICAgICAgIERpc3BsYXlzIHRoZSBpbmNvbWluZyBmaWxlIG9uIHRoZSBzY3JlZW4gcmF0aGVyIHRoYW4gc3RvcmluZyBpdAorICAgICAgICAgIG9uIGRpc2suIElmIHRoaXMgc3dpdGNoIGlzIGdpdmVuLCB0aGUgL1JFTkFNRS1UTyBhbmQgL01PVkUtVE8KKyAgICAgICAgICBzd2l0Y2hlcyBhcmUgaWdub3JlZCwgdGhlIGZpbGUtdHJhbnNmZXIgZGlzcGxheSBpcyBzdXBwcmVzc2VkLAorICAgICAgICAgIGFuZCB0aGUgZ2l2ZW4gZmlsZShzKSBpcy9hcmUgc2hvd24gb24gdGhlIHNjcmVlbi4gQ2FuIGJlIHVzZWQKKyAgICAgICAgICB3aXRoIC9GSUxURVIsIGUuZy4KKworICBnZXQgL3RleHQgL3RvLXNjcmVlbiAvZmlsdGVyOm1vcmUgb29mYS50eHQKKworICAgICAgICAgIEluIGZhY3QsIHlvdSBzaG91bGQgYWx3YXlzIHVzZSAvVE8tU0NSRUVOIHdpdGggL0ZJTFRFUiBvcgorICAgICAgICAgIC9DT01NQU5EIHdoZW4gdGhlIGNvbW1hbmQgd291bGQgcmVzdWx0IGluIGRpc3BsYXlpbmcgdGhlCisgICAgICAgICAgaW5jb21pbmcgZmlsZSBvbiB0aGUgc2NyZWVuOyBvdGhlcndpc2UgQy1LZXJtaXQgd291bGQgaGF2ZSBubworICAgICAgICAgIHdheSBvZiBrbm93aW5nIHRvIHN1cHByZXNzIGl0cyBmaWxlIHRyYW5zZmVyIGRpc3BsYXkgKHNpbmNlIGl0CisgICAgICAgICAgY2FuJ3QgYmUgZXhwZWN0ZWQgdG8ga25vdyB3aGF0IHRoZSBjb21tYW5kIG9yIGZpbHRlciBkb2VzKS4KKworICAgL1JFTkFNRS1UTzp0ZW1wbGF0ZQorICAgICAgICAgIEVhY2ggZmlsZSB0aGF0IGlzIGRvd25sb2FkZWQgaXMgdG8gYmUgcmVuYW1lZCBhcyBpbmRpY2F0ZWQgaWYKKyAgICAgICAgICBhbmQgb25seSBpZiBpdCB3YXMgcmVjZWl2ZWQgY29tcGxldGVseSBhbmQgd2l0aG91dCBlcnJvci4gVGhlCisgICAgICAgICAgdGVtcGxhdGUgY2FuIGJlIGxpdGVyYWwgdGV4dCBvciBjYW4gY29udGFpbiB2YXJpYWJsZXMgdGhhdCBhcmUKKyAgICAgICAgICBldmFsdWF0ZWQgZm9yIGVhY2ggZmlsZS4gRm9yIE1HRVQsIHRoZSB0ZXh0IG11c3QgY29udGFpbgorICAgICAgICAgIHZhcmlhYmxlczsgZm9yIEdFVCBpdCBjYW4gYmUgYSBsaXRlcmFsIHN0cmluZy4gVGhlIFx2KGZpbGVuYW1lKQorICAgICAgICAgIHZhcmlhYmxlIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGZpbGUsIHNvOgorCisgIGZ0cCBtZ2V0IC9yZW5hbWUtdG86XHYoZmlsZW5hbWUpLm9rICoKKworICAgICAgICAgIGNhdXNlcyBlYWNoIGZpbGUgdGhhdCBpcyBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCB0byBoYXZlICIub2siCisgICAgICAgICAgYXBwZW5kZWQgdG8gaXRzIG5hbWUuIEZvciBkZXRhaWxzIHNlZSBbMzExXVNlY3Rpb24gNC4xIG9mIHRoZQorICAgICAgICAgIFszMTJdQy1LZXJtaXQgNy4wIFVwZGF0ZSBOb3Rlcy4KKworICAgL01PVkUtVE86dGV4dAorICAgICAgICAgIEp1c3QgbGlrZSAvUkVOQU1FLVRPOiwgZXhjZXB0IHRoZSB0ZXh0IGRlbm90ZXMgdGhlIG5hbWUgb2YgYQorICAgICAgICAgIGRpcmVjdG9yeSB0byB3aGljaCBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCBmaWxlcyBhcmUgdG8gYmUKKyAgICAgICAgICBtb3ZlZC4gSWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZC4KKworICAgVGhlIGZpbGUgdHJhbnNmZXIgZGlzcGxheSBkb2VzIG5vdCBzaG93IHRoZSAvTU9WRS1UTyBvciAvUkVOQU1FLVRPCisgICB2YWx1ZSwgc2luY2UgdGhlIGluY29taW5nIGZpbGUgaGFzIG5vdCB5ZXQgYmVlbiBtb3ZlZCBvciByZW5hbWVkLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMy42LjIuIEZpbGVuYW1lIENvbGxpc2lvbnMKKworICAgV2hhdCBzaG91bGQgaGFwcGVuIGlmIGFuIGluY29taW5nIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYW4KKyAgIGV4aXN0aW5nIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5PyBCeSBkZWZhdWx0LCBLZXJtaXQncyBGSUxFCisgICBDT0xMSVNJT04gc2V0dGluZyBhcHBsaWVzOiBCQUNLVVAsIFJFTkFNRSwgVVBEQVRFLCBESVNDQVJELCBldGMsIGFzCisgICBkZXNjcmliZWQgaW4gWzMxM11Vc2luZyBDLUtlcm1pdC4gS2VybWl0J3MgZGVmYXVsdCBGSUxFIENPTExJU0lPTgorICAgc2V0dGluZyBpcyBCQUNLVVAgKHJlbmFtZSB0aGUgZXhpc3RpbmcgZmlsZSBhbmQgc3RvcmUgdGhlIGluY29taW5nCisgICBmaWxlIHVuZGVyIGl0cyBvd24gbmFtZSkgYW5kIHRoZXJlZm9yZSB0aGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgRlRQCisgICBjb2xsaXNpb24gYWN0aW9uLgorCisgICBUaGUgbmFtZSB1bmRlciB3aGljaCBhbiBpbmNvbWluZyBmaWxlIGlzIHRvIGJlIHN0b3JlZCBpcyBkZXRlcm1pbmVkIGFzCisgICBmb2xsb3dzOgorCisgICAgICogSWYgYW4gYXMtbmFtZSB3YXMgZ2l2ZW4sIHRoZSBhcy1uYW1lIGlzIHVzZWQuIE90aGVyd2lzZToKKyAgICAgKiBJZiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgcGxhdGZvcm1zIGFyZSBhbGlrZSBvciBbMzE0XUZUUCBGSUxFTkFNRVMKKyAgICAgICBpcyBzZXQgdG8gTElURVJBTCAob3IgdGhlIC9GSUxFTkFNRVM6TElURVJBTCBzd2l0Y2ggd2FzIGdpdmVuIGZvcgorICAgICAgIHRoaXMgZG93bmxvYWQpLCB0aGUgaW5jb21pbmcgZmlsZW5hbWUgaXMgdXNlZCBsaXRlcmFsbHkuCisgICAgICAgT3RoZXJ3aXNlOgorICAgICAqIFRoZSBpbmNvbWluZyBmaWxlbmFtZSBpcyBjb252ZXJ0ZWQgdG8gYSBmb3JtIHRoYXQgaXMgZnJpZW5kbHkgdG8KKyAgICAgICB0aGUgbG9jYWwgcGxhdGZvcm0uIEZvciBVTklYLCBmb3IgZXhhbXBsZSwgaW5jb21pbmcgZmlsZW5hbWVzIHRoYXQKKyAgICAgICBhcmUgYWxsIHVwcGVyY2FzZSAoYXMgdGhleSBtaWdodCBiZSBmcm9tLCBzYXksIFZNUyBvciBhbiBJQk0KKyAgICAgICBtYWluZnJhbWUpIGFyZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLgorCisgICBJZiB0aGUgcmVzdWx0aW5nIG5hbWUgY29pbmNpZGVzIHdpdGggdGhlIG5hbWUgb2YgYSBsb2NhbCBmaWxlIHRoYXQKKyAgIGFscmVhZHkgZXhpc3RzLCB3ZSBoYXZlIGEgZmlsZW5hbWUgY29sbGlzaW9uLiBDb2xsaXNpb25zIGFyZSBoYW5kbGVkCisgICBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb2xsaXNpb24gYWN0aW9uOgorCisgICBTRVQgRlRQIENPTExJU0lPTiB7IEJBQ0tVUCwgUkVOQU1FLCBVUERBVEUsIERJU0NBUkQsIEFQUEVORCwgT1ZFUldSSVRFCisgICAgICAgICAgfQorICAgICAgICAgIFRoaXMgZXN0YWJsaXNoZXMgYSBmaWxlbmFtZSBjb2xsaXNpb24gZm9yIEZUUCwgc2VwYXJhdGUgZnJvbQorICAgICAgICAgIHRoZSBLZXJtaXQgb25lLiBUaGUgaW5pdGlhbCBGVFAgY29sbGlzaW9uIHNldHRpbmcgaXMgaW5oZXJpdGVkCisgICAgICAgICAgZnJvbSBLZXJtaXQncyBGSUxFIENPTExJU0lPTiBzZXR0aW5nIHdoZW4gdGhlIGZpcnN0IEZUUCBjb21tYW5kCisgICAgICAgICAgaXMgZ2l2ZW4sIGJ1dCBzdWJzZXF1ZW50IGNoYW5nZXMgdG8gS2VybWl0J3MgRklMRSBDT0xMSVNJT04KKyAgICAgICAgICBzZXR0aW5nIGRvIG5vdCBhZmZlY3QgdGhlIEZUUCBDT0xMSVNJT04gc2V0dGluZy4gU0hPVyBGVFAgdGVsbHMKKyAgICAgICAgICB0aGUgY3VycmVudCBGVFAgQ09MTElTSU9OIHNldHRpbmcuCisKKyAgIEZUUCBHRVQgL0NPTExJU0lPTjp7QkFDS1VQLFJFTkFNRSxVUERBVEUsRElTQ0FSRCxBUFBFTkQsT1ZFUldSSVRFfQorICAgICAgICAgIE92ZXJyaWRlcyB0aGUgY3VycmVudCBGVFAgQ09MTElTSU9OIGFjdGlvbiBmb3IgdGhpcyBkb3dubG9hZAorICAgICAgICAgIG9ubHkuCisKKyAgIEZUUCBHRVQgL1VQREFURQorICAgICAgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBHRVQgL0NPTExJU0lPTjpVUERBVEUsIGFuZCBpcyBpbmNsdWRlZAorICAgICAgICAgIGZvciBzeW1tZXRyeSB3aXRoIFBVVCAvVVBEQVRFCisKKyAgIEZUUCBHRVQgL1VQREFURSBhbmQgL0NPTExJU0lPTjpVUERBVEUgbWVhbiB0byBkb3dubG9hZCBvbmx5IHRob3NlCisgICBmaWxlcyB3aG9zZSBtb2RpZmljYXRpb24gZGF0ZXMgb24gdGhlIHNlcnZlciBhcmUgbGF0ZXIgdGhhbiB0aG9zZSBvbgorICAgdGhlIGNsaWVudC4gRGF0ZS10aW1lIGNvbXBhcmlzb25zIGFyZSBkb25lIGluIENvb3JkaW5hdGVkIFVuaXZlcnNhbAorICAgVGltZSAoVVRDLCBHTVQsIFpVTFUpLiBUaGUgY29tbWFuZDoKKworICAgICBGVFAgTUdFVCAvQ09MTElTSU9OOkFQUEVORCAvQVMtTkFNRTpuZXdmaWxlbmFtZSAqLioKKworICAgRG93bmxvYWRzIGFsbCBtYXRjaGluZyByZW1vdGUgZmlsZXMgaW50byBhIHNpbmdsZSBsb2NhbCBmaWxlIChpbgorICAgd2hhdGV2ZXIgb3JkZXIgdGhlIHNlcnZlciBzZW5kcyB0aGVtKS4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDMuNi4zLiBSZWNvdmVyeQorCisgICBSZWNvdmVyeSBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkcyB0b28sIGJ1dCB0aGVyZSBhcmUgc29tZQorICAgZGlmZmVyZW5jZXMgZnJvbSB0aGUgdXBsb2FkaW5nIGNhc2UgZGVzY3JpYmVkIGluIFszMTVdU2VjdGlvbiAzLjUuMzoKKworICAgICAqIFRoZSB0cmFuc2ZlciBtdXN0IGJlIGluIEJJTkFSWSBtb2RlLiBJdCBjYW4gbm90IGJlIGluIHRleHQgbW9kZSwKKyAgICAgICBldmVuIGlmIHRoZSBGVFAgc2VydmVyIGlzIG9uIHRoZSBzYW1lIGtpbmQgb2YgcGxhdGZvcm0gYXMgS2VybWl0LAorICAgICAgIGFuZCBldmVuIGlmIHRoZXJlIGlzIG5vIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24uIFRoZSBvcmlnaW5hbAorICAgICAgIGRvd25sb2FkIG11c3QgYWxzbyBoYXZlIGJlZW4gaW4gYmluYXJ5IG1vZGUuCisgICAgICogVGhlIEZUUCBzZXJ2ZXIgbXVzdCBzdXBwb3J0IHRoZSBSRVNUICgicmVzdGFydCIpIGRpcmVjdGl2ZS4KKyAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIG5vdCBhIHN0YW5kYXJkIGNvbW1hbmQ7IGF0IHRoaXMgd3JpdGluZywgaXQKKyAgICAgICBpcyBkZXNjcmliZWQgb25seSBpbiBhbiBJbnRlcm5ldCBEcmFmdCwgbm90IGFuIFJGQyBvciBJbnRlcm5ldAorICAgICAgIFN0YW5kYXJkLCBidXQgbmV2ZXJ0aGVsZXNzIGl0IGlzIGZvdW5kIGluIHNldmVyYWwgcG9wdWxhciBGVFAKKyAgICAgICBzZXJ2ZXJzLCBzdWNoIGFzIFszMTZdUHJvRlRQRC4KKworICAgSGVyZSdzIGhvdyBkb3dubG9hZCByZWNvdmVyeSB3b3JrczoKKworICAgICAqIEtlcm1pdCBjaGVja3MgZm9yIGNvbmZsaWN0aW5nIHN3aXRjaGVzLCBzdWNoIGFzIC9VUERBVEUsIC9DT01NQU5ELAorICAgICAgIG9yIC9GSUxURVIuIElmIC9SRUNPVkVSIGlzIGdpdmVuIHdpdGggdGhlc2Ugc3dpdGNoZXMgYW4gZXJyb3IKKyAgICAgICBvY2N1cnMuCisgICAgICogVGhlIHByZXZhaWxpbmcgdHJhbnNmZXIgbW9kZSAoU0VUIEZUUCBUWVBFKSBtdXN0IGJlIEJJTkFSWS4gSWYgaXQKKyAgICAgICBpcyBub3QsIHRoZSAvQklOQVJZIHN3aXRjaCBtdXN0IGhhdmUgYmVlbiBpbmNsdWRlZCB3aXRoIHRoZSBGVFAKKyAgICAgICBbTV1HRVQgY29tbWFuZC4KKworICAgSWYgdGhlIC9SRUNPVkVSIHN3aXRjaCBpcyBhY2NlcHRlZCwgdGhlbiBmb3IgZWFjaCBzZWxlY3RlZCBmaWxlOgorCisgICAgICogQSBTSVpFIGNvbW1hbmQgaXMgc2VudCBmb3IgdGhlIGZpbGUgKHVzaW5nIGl0cyByZW1vdGUgbmFtZSkuIElmCisgICAgICAgdGhlIHJlcGx5IGluZGljYXRlcyB0aGUgZmlsZSB3YXMgbm90IGZvdW5kLCBvciB0aGUgU0laRSBjb21tYW5kCisgICAgICAgd2FzIG5vdCB1bmRlcnN0b29kLCBvciBhbnkgb3RoZXIga2luZCBvZiBlcnJvciwgcmVjb3ZlcnkgaXMKKyAgICAgICBjYW5jZWxlZCAoaS5lLiB0aGUgZW50aXJlIGZpbGUgaXMgZG93bmxvYWRlZCkuCisgICAgICogSWYgdGhlIHNpemVzIG9mIHRoZSB0d28gZmlsZXMgYXJlIGlkZW50aWNhbCwgdGhlIGZpbGUgaXMgbm90IHNlbnQuCisgICAgICAgT3RoZXJ3aXNlOgorICAgICAqIEtlcm1pdCBzZW5kcyB0aGUgUkVTVCBkaXJlY3RpdmUgdG8gdGhlIHNlcnZlciwgaW5kaWNhdGluZyB0aGUgc2l6ZQorICAgICAgIG9mIHRoZSBsb2NhbCBmaWxlLiBJZiB0aGUgc2VydmVyIHJlc3BvbmRzIGFmZmlybWF0aXZlbHksIEtlcm1pdAorICAgICAgIG9wZW5zIHRoZSBsb2NhbCBmaWxlIGluIGFwcGVuZCBtb2RlIGFuZCBhcHBlbmRzIHRoZSBpbmNvbWluZyBkYXRhCisgICAgICAgdG8gaXQuIE90aGVyd2lzZSwgcmVjb3ZlcnkgaXMgY2FuY2VsZWQgYW5kIHRoZSBlbnRpcmUgZmlsZSBpcworICAgICAgIGRvd25sb2FkZWQuCisKKyAgIFRoZSAvUkVDT1ZFUiBzd2l0Y2ggY2FuIGJlIGluY2x1ZGVkIHdpdGggYW55IEZUUCBHRVQgb3IgTUdFVCBjb21tYW5kLAorICAgZXZlbiBpZiBpdCBzcGVjaWZpZXMgYSBncm91cCBvZiBmaWxlcy4gVGhpcyBsZXRzIHlvdSByZXN1bWUgYW4KKyAgIGludGVycnVwdGVkIGJhdGNoIHRyYW5zZmVyIGZyb20gd2hlcmUgaXQgbGVmdCBvZmYuIFRoZSBmaWxlcyB0aGF0IHdlcmUKKyAgIGFscmVhZHkgY29tcGxldGVseSBzZW50IGFyZSBza2lwcGVkLCB0aGUgZmlsZSB0aGF0IHdhcyBpbnRlcnJ1cHRlZCBpcworICAgcmVjb3ZlcmVkLCBhbmQgdGhlIHJlbWFpbmluZyBmaWxlcyBhcmUgdXBsb2FkZWQuIEJVVC4uLiB1bmxpa2Ugd2l0aAorICAgdXBsb2FkaW5nLCB3aGVyZSB0aGlzIGNhbiBiZSBkb25lIHdpdGggYW55IG1peHR1cmUgb2YgdGV4dCBhbmQgYmluYXJ5CisgICBmaWxlcywgd2hlbiBkb3dubG9hZGluZywgaXQgY2FuIG9ubHkgYmUgZG9uZSBpZiBhbGwgdGhlIGZpbGVzIGFyZQorICAgYmluYXJ5LgorCisgICBJdCBkb2Vzbid0IG1hdHRlciBob3cgdGhlIG9yaWdpbmFsIHBhcnRpYWwgZmlsZSB3YXMgZG93bmxvYWRlZCAtLSBGVFAsCisgICBLZXJtaXQsIEhUVFAsIFptb2RlbSwgZXRjOiBhcyBsb25nIGFzIHRoZSBwcmVjb25kaXRpb25zIGFyZSBtZXQsIGl0CisgICBjYW4gYmUgcmVjb3ZlcmVkIHdpdGggRlRQIFtNXUdFVCAvUkVDT1ZFUiwgb3IgZm9yIHRoYXQgbWF0dGVyIGFsc28KKyAgIHdpdGggR0VUIC9SRUNPVkVSICh1c2luZyBLZXJtaXQgcHJvdG9jb2wpLgorCisgICBbIFszMTddVG9wIF0gWyBbMzE4XUZUUCBUb3AgXSBbIFszMTldQy1LZXJtaXQgSG9tZSBdIFsgWzMyMF1LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuNy4gVHJhbnNsYXRpbmcgQ2hhcmFjdGVyIFNldHMKKworICAgQSBwb3NzaWJseSB1bmlxdWUgZmVhdHVyZSBvZiBLZXJtaXQncyBGVFAgY2xpZW50IGlzIGl0cyBhYmlsaXR5IHRvCisgICBjb252ZXJ0IGNoYXJhY3RlciBzZXRzIHdoZW4gdHJhbnNmZXJyaW5nIGZpbGVzIGluIHRleHQgbW9kZSwKKyAgIGluZGVwZW5kZW50IG9mIHRoZSBjYXBhYmlsaXRlcyBvZiB0aGUgRlRQIHNlcnZlciwgYXMgd2VsbCBhcyB0bworICAgdHJhbnNsYXRlIHRoZSBjaGFyYWN0ZXIgc2V0cyBvZiBmaWxlbmFtZXMgcmVnYXJkbGVzcyBvZiB0cmFuc2ZlciBtb2RlLgorICAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBGVFAgY2xpZW50cywgYW5kIGJlY2F1c2UgdGhlcmUgaXMgYQorICAgY2VydGFpbiBwZXJmb3JtYW5jZSBwZW5hbHR5LCBLZXJtaXQgd29uJ3QgZG8gdGhpcyB1bmxlc3MgeW91IGFzayBmb3IKKyAgIGl0LiBJZiB5b3UgZW5hYmxlIHRoaXMgZmVhdHVyZSwgeW91IG5lZWQgdG8gaW5mb3JtIEtlcm1pdCBvZiB0aGUKKyAgIGNoYXJhY3RlciBzZXQgKHRvIGJlKSB1c2VkIG9uIHRoZSBzZXJ2ZXIgYW5kIGluIHNvbWUgY2FzZXMgKGV4cGxhaW5lZAorICAgYmVsb3cpIGFsc28gdGhlIGxvY2FsIGZpbGUgY2hhcmFjdGVyIHNldC4gVGhpcyBkaXNjdXNzaW9uIGFzc3VtZXMgeW91CisgICBrbm93IGEgYml0IGFib3V0IGNoYXJhY3RlciBzZXRzIChhcyB5b3UgbXVzdCBpZiB5b3UgaGF2ZSB0byB1c2UgdGhlbSk7CisgICBzZWUgQ2hhcHRlciAxNiBvZiBbMzIxXVVzaW5nIEMtS2VybWl0IGZvciBhIGRldGFpbGVkIHRyZWF0bWVudC4gVGhlCisgICBLZXJtaXQgY29tbWFuZHMgZm9yIEZUUCBjaGFyYWN0ZXItc2V0IGNvbnZlcnNpb24gYXJlOgorCisgICBTRVQgRlRQIENIQVJBQ1RFUi1TRVQtVFJBTlNMQVRJT04geyBPTiwgT0ZGIH0KKyAgICAgICAgICBXaGV0aGVyIHRvIHRyYW5zbGF0ZSBjaGFyYWN0ZXIgc2V0cyB3aGVuIHRyYW5zZmVycmluZyB0ZXh0CisgICAgICAgICAgZmlsZXMgd2l0aCBGVFAuIE9GRiBieSBkZWZhdWx0LiBTZXQgdGhpcyB0byBPTiB0byBlbmFibGUKKyAgICAgICAgICBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGZvciBzdWJzZXF1ZW50IEZUUCB1cGxvYWRzIGFuZAorICAgICAgICAgIGRvd25sb2Fkcy4KKworICAgU0VUIEZUUCBTRVJWRVItQ0hBUkFDVEVSLVNFVCBbMzIyXW5hbWUKKyAgICAgICAgICBUZXh0IGNoYXJhY3RlciBzZXQgKHRvIGJlKSB1c2VkIGJ5IHRoZSBzZXJ2ZXIuIE1vc3QgRlRQIHNlcnZlcnMKKyAgICAgICAgICBhcmUgaWdub3JhbnQgb2YgY2hhcmFjdGVyIHNldHMsIHNvIGFsbCB0cmFuc2xhdGlvbnMgYXJlIGRvbmUKKyAgICAgICAgICB1bmlsYXRlcmFsbHkgYnkgS2VybWl0J3MgRlRQIGNsaWVudC4gVGhpcyBtZWFucyB0aGF0IHdoZW4KKyAgICAgICAgICBkb3dubG9hZGluZyBmaWxlcywgeW91IG11c3Qga25vdyBpbiBhZHZhbmNlIHRoZSBjaGFyYWN0ZXItc2V0CisgICAgICAgICAgdXNlZCBpbiB0aGUgZmlsZXMgeW91IGFyZSBkb3dubG9hZGluZyAoYW5kIGluIHRoZWlyIG5hbWVzKS4KKyAgICAgICAgICBXaGVuIHVwbG9hZGluZywgeW91IG11c3Qgc3BlY2lmeSB0aGUgY2hhcmFjdGVyLXNldCB0byB3aGljaAorICAgICAgICAgIGxvY2FsIGZpbGVuYW1lcyBhbmQgdGV4dC1maWxlIGNvbnRlbnRzIGFyZSB0byBiZSB0cmFuc2xhdGVkIGZvcgorICAgICAgICAgIHRyYW5zbWlzc2lvbiB0byB0aGUgc2VydmVyLiBJZiB5b3UgU0VUIEZUUAorICAgICAgICAgIENIQVJBQ1RFUi1TRVQtVFJBTlNMQVRJT04gT04gYnV0IGRvIG5vdCBzcGVjaWZ5IGFuIEZUUAorICAgICAgICAgIFNFUlZFUi1DSEFSQUNURVItU0VULCBbMzIzXVVURjggaXMgdXNlZCwgc2luY2UgdGhpcyBpcyB0aGUgbmV3CisgICAgICAgICAgSW50ZXJuZXQgc3RhbmRhcmQgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXIgc2V0OyBpdCBpcyB1cHdhcmRzCisgICAgICAgICAgY29tcGF0aWJsZSB3aXRoIEFTQ0lJIGFuZCBpdCBlbmNvbXBhc3NlcyBtb3N0IHdyaXR0ZW4gbGFuZ3VhZ2VzCisgICAgICAgICAgYW5kIHRoZXJlZm9yZSBkb2VzIG5vdCBmYXZvciBhbnkgcGFydGljdWxhciBncm91cCBvZiBwZW9wbGUsIGFzCisgICAgICAgICAgYW55IG90aGVyIGRlZmF1bHQgd291bGQgZG8uIElmIHlvdSBTRVQgRlRQIFNFUlZFUi1DSEFSQUNURVItU0VUCisgICAgICAgICAgdG8gc29tZXRoaW5nIChhbnl0aGluZykgd2hlbiBGVFAgQ0hBUkFDVEVSLVNFVCBUUkFOU0xBVElPTiBpcworICAgICAgICAgIE9GRiwgdGhpcyBhbHNvIHNldHMgdGhlIGxhdHRlciBPTi4KKworICAgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCBbMzI0XW5hbWUKKyAgICAgICAgICBUaGlzIGlzIHRoZSByZWd1bGFyIEtlcm1pdCAobm9uLUZUUC1zcGVjaWZpYykgY29tbWFuZCBmb3IKKyAgICAgICAgICBpZGVudGlmeWluZyB0aGUgY2hhcmFjdGVyIHNldCAodG8gYmUpIHVzZWQgaW4gbG9jYWwgdGV4dCBmaWxlcworICAgICAgICAgIGFuZCBmaWxlbmFtZXMuCisKKyAgIFRPIFJFSVRFUkFURTogSWYgeW91IFNFVCBGVFAgQ0hBUkFDVEVSLVNFVCBUUkFOU0xBVElPTiBPTiBidXQgZG8gbm90CisgICBzcGVjaWZ5IGFuIEZUUCBTRVJWRVItQ0hBUkFDVEVSLVNFVCwgb3V0Ym91bmQgdGV4dCBmaWxlcyBhcmUgY29udmVydGVkCisgICB0byBVVEYtOCBhbmQgaW5ib3VuZCB0ZXh0IGZpbGVzIGFyZSBhc3N1bWVkIHRvIGJlIFVURi04LiBJZiB0aGlzIGlzCisgICBub3QgYXBwcm9wcmlhdGUsIGJlIHN1cmUgdG8gYWxzbyBzcGVjaWZ5IHRoZSBkZXNpcmVkIEZUUAorICAgU0VSVkVSLUNIQVJBQ1RFUi1TRVQuCisKKyAgIFlvdSBjYW4gdXNlICJzcGVjaWFsIiAobm9uLUFTQ0lJKSBjaGFyYWN0ZXJzIGluIGZpbGVuYW1lcyBpbiBhbGwgdGhlCisgICBjbGllbnQgLyBzZXJ2ZXIgZmlsZSBtYW5hZ2VtZW50IGNvbW1hbmRzIChGVFAgTUtESVIsIFJNRElSLCBESVJFQ1RPUlksCisgICBWRElSRUNUT1JZLCBERUxFVEUsIGV0YyksIGFuZCBhbHNvIGluIGZpbGUtdHJhbnNmZXIgY29tbWFuZHMuIFdoZW4KKyAgIGdpdmluZyBjb21tYW5kcyBzdWNoIGFzIEZUUCBESVIgKFJESVIpIGFuZCBGVFAgUFdEIChSUFdEKSwgdGhlIHJlcGx5CisgICBpcyB0cmFuc2xhdGVkIHRvbywgc28geW91IGNhbiByZWFkIGl0LiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBjbGllbnQgYW5kCisgICBzZXJ2ZXIgdXNlIGVudGlyZWx5IGRpZmZlcmVudCBjb2RlcyB0byByZXByZXNlbnQgdGhlIHNwZWNpYWwKKyAgIGNoYXJhY3RlcnMgb2YgR2VybWFuOgorCisgIEMtS2VybWl0PiBmdHAgeHl6Y29ycC5kZSAvYW5vbnltb3VzCisgIEMtS2VybWl0PiBzZXQgZnRwIHNlcnZlci1jaGFyYWN0ZXItc2V0IGxhdGluMQorICBDLUtlcm1pdD4gc2V0IGZpbGUgY2hhcmFjdGVyLXNldCBnZXJtYW4KKyAgQy1LZXJtaXQ+IHJjZCBTdORkdGUKKyAgQy1LZXJtaXQ+IHJwd2QKKyAgIi9wdWIvZnRwL1N05GR0ZSBpcyBjdXJyZW50IGRpcmVjdG9yeSIKKyAgQy1LZXJtaXQ+IHJkaXIKKyAgLXJ3LXJ3LS0tLSAgMSBvbGFmICAgICA1NDAxOCBKYW4gIDYgMTc6NTggQWRlbmL8dHRlbC50eHQKKyAgLXJ3LXJ3LS0tLSAgMSB1cnN1bGEgICAgIDM3MyBKYW4gIDUgMTU6MTkgQd9sYXIudHh0CisgIC1ydy1ydy0tLS0gIDEgZ2lzYmVydCAgICA0ODIgSmFuICA1IDE1OjIwIEJsb3dhdHoudHh0CisgIC1ydy1ydy0tLS0gIDEgZ3VkcnVuICAgICAxMjQgSmFuICA1IDE1OjE5IEL2Ymxpbmdlbi50eHQKKyAgLXJ3LXJ3LS0tLSAgMSBvbGdhICAgICAxNDM0OCBKYW4gIDcgMTQ6MjMgS/Zsbi50eHQKKworICAgV2hlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgZmlsZSBzeXN0ZW1zIHVzZSBkaWZmZXJlbnQgY2hhcmFjdGVyIHNldHMsCisgICB5b3Ugc2hvdWxkIHRha2UgY2FyZSB0byB1c2Ugb25seSB0aG9zZSBjaGFyYWN0ZXJzIHRoYXQgdGhlIHR3byBzZXRzCisgICBzaGFyZSBpbiBjb21tb24gd2hlbiBjcmVhdGluZyBmaWxlbmFtZXMgb3IgdGV4dC1maWxlIGNvbnRlbnRzLiBGb3IKKyAgIGV4YW1wbGUsIFBDIGNvZGUgcGFnZXMgY29udGFpbiBhIGxvdCBsaW5lLSBhbmQgYm94LWRyYXdpbmcgY2hhcmFjdGVycywKKyAgIGFuZCBzb21ldGltZXMgInNtYXJ0IHF1b3RlcyIsIGV0YywgdGhhdCBhcmUgbm90IGZvdW5kIGluIElTTyBzdGFuZGFyZAorICAgOC1iaXQgY2hhcmFjdGVyIHNldHMuIFlvdSBzaG91bGQgYmUgZXNwZWNpYWxseSBjYXJlZnVsIHRvIGF2b2lkIHVzaW5nCisgICBzdWNoIGNoYXJhY3RlcnMgaW4gZmlsZW5hbWVzLgorCisgICBbIFszMjVdQy1LZXJtaXQgQ2hhcmFjdGVyIFNldHMgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgMy43LjEuIENoYXJhY3RlciBTZXRzIGFuZCBVcGxvYWRpbmcKKworICAgS2VybWl0J3MgUFVUIGFuZCBNUFVUIGNvbW1hbmRzIGluY2x1ZGUgZnVsbCBmaWxlLXNjYW5uaW5nCisgICBjYXBhYmlsaXRpZXMsIGFzIGRlc2NyaWJlZCBpbiBbMzI2XVNlY3Rpb24gNC4gVGh1cyBpZiBGVFAKKyAgIENIQVJBQ1RFUi1TRVQtVFJBTlNMQVRJT04gaXMgT04gYW5kIHlvdXIgY2hhcmFjdGVyLXNldCBhc3NvY2lhdGlvbnMKKyAgIGFyZSBzZXQgdXAgYXBwcm9wcmlhdGVseSwgS2VybWl0IGF1dG9tYXRpY2FsbHkgc3dpdGNoZXMgb24gYSBwZXItZmlsZQorICAgYmFzaXMgYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkgbW9kZSwgYW5kIGZvciBlYWNoIHRleHQgZmlsZSBiZXR3ZWVuCisgICB5b3VyIGNob3NlbiA3LWJpdCB0ZXh0IGNoYXJhY3RlciBzZXQgKGUuZy4gQVNDSUkgb3IgSVNPIDY0NiBHZXJtYW4pLAorICAgOC1iaXQgdGV4dCAoZS5nLiBMYXRpbi0xIG9yIEphcGFuZXNlIEVVQyksIFVDUy0yLCBhbmQgVVRGLTgsIGFuZAorICAgY29udmVydHMgZWFjaCBvZiB0aGVzZSBhdXRvbWF0aWNhbGx5IHRvIHRoZSBzZXJ2ZXIgY2hhcmFjdGVyLXNldCwgYW5kCisgICBmdXJ0aGVybW9yZSBhdXRvbWF0aWNhbGx5IGRpZmZlcmVudGlhdGVzIGJldHdlZW4gdGhlIExpdHRsZSBhbmQgQmlnCisgICBFbmRpYW4gZm9ybXMgb2YgVUNTLTIsIGFsd2F5cyBzZW5kaW5nIGluIEJpZyBFbmRpYW4gZm9ybS4KKworICAgICBXQVJOSU5HOiBJdCBpcyBub3QgYWR2aXNhYmxlIHRvIHVzZSBVQ1MtMiAob3IgYW55IFVuaWNvZGUKKyAgICAgdHJhbnNmb3JtYXRpb24gb3RoZXIgdGhhbiBVVEYtOCkgIm9uIHRoZSB3aXJlIiwgaS5lLiBhcyBhIHNlcnZlcgorICAgICBjaGFyYWN0ZXIgc2V0LiBNb3N0IEZUUCBzZXJ2ZXJzIGFyZSBub3QgYWJsZSB0byBjb3BlIHdpdGggaXQsIHNpbmNlCisgICAgIGl0IGNvbnRhaW5zIGxvdHMgb2YgMCAoTlVMKSBjaGFyYWN0ZXJzLiBJZiB5b3UgZG8gdXNlIGl0LCBLZXJtaXQKKyAgICAgZG9lcyBub3QgdHJhbnNsYXRlIGZpbGVuYW1lcyB0byBvciBmcm9tIFVDUy0yLCBmb3IgcmVhc29ucyB3ZWxsCisgICAgIGtub3duIHRvIEMgcHJvZ3JhbW1lcnMgKGZvciBleGFtcGxlLCBVTklYIEFQSXMgYXNzdW1lIGZpbGVuYW1lCisgICAgIHN0cmluZ3MgYXJlIE5VTC10ZXJtaW5hdGVkKS4gWzMyN11VVEYtOCBpcyB0aGUgcHJlZmVycmVkIChhbmQKKyAgICAgc3RhbmRhcmQpIFVuaWNvZGUgZm9ybWF0IGZvciB0aGUgSW50ZXJuZXQuCisKKyAgIEZUUCBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9ucyBkaWZmZXIgZnJvbSB0aGUgcmVndWxhciBLZXJtaXQgb25lcyBieQorICAgbm90IHJlc3RyaWN0aW5nIHRyYW5zbGF0aW9ucyB0byBhIGZpbGUtY2hhcmFjdGVyLXNldCAvCisgICB0cmFuc2Zlci1jaGFyYWN0ZXItc2V0IHBhaXIuIFlvdSBjYW4gaGF2ZSBLZXJtaXQncyBGVFAgY2xpZW50CisgICB0cmFuc2xhdGUgYmV0d2VlbiBhbnkgcGFpciBvZiBjaGFyYWN0ZXIgc2V0cyBpdCBrbm93cyBhYm91dC4gWW91IGNhbgorICAgc2VlIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjaGFyYWN0ZXIgc2V0cyBieSB0eXBpbmcgZWl0aGVyIG9mIHRoZQorICAgZm9sbG93aW5nOgorCisgIHNldCBmdHAgc2VydmVyLWNoYXJhY3Rlci1zZXQgPworICBzZXQgZmlsZSBjaGFyYWN0ZXItc2V0ID8KKworICAgQSB0eXBpY2FsIGxpc3QgbG9va3MgbGlrZSB0aGlzIChbMzI4XUNMSUNLIEhFUkUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mCisgICB0aGUgbmFtZXMpOgorCisgIEMtS2VybWl0PnNldCBmaWxlIGNoYXIgPyBPbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgIGFzY2lpICAgICAgICAgICAgY3A4NjktZ3JlZWsgICAgICAgaGVicmV3LTcgICAgICAgICBtYXpvdmlhLXBjCisgICBicml0aXNoICAgICAgICAgIGN5cmlsbGljLWlzbyAgICAgIGhlYnJldy1pc28gICAgICAgbmV4dC1tdWx0aW5hdGlvbmFsCisgICBidWxnYXJpYS1wYyAgICAgIGRhbmlzaCAgICAgICAgICAgIGhwLXJvbWFuOCAgICAgICAgbm9yd2VnaWFuCisgICBjYW5hZGlhbi1mcmVuY2ggIGRlYy1rYW5qaSAgICAgICAgIGh1bmdhcmlhbiAgICAgICAgcG9ydHVndWVzZQorICAgY3AxMjUwICAgICAgICAgICBkZWMtbXVsdGluYXRpb25hbCBpc28yMDIyanAta2FuamkgIHNoaWZ0LWppcy1rYW5qaQorICAgY3AxMjUxLWN5cmlsbGljICBkZy1pbnRlcm5hdGlvbmFsICBpdGFsaWFuICAgICAgICAgIHNob3J0LWtvaQorICAgY3AxMjUyICAgICAgICAgICBkdXRjaCAgICAgICAgICAgICBqaXM3LWthbmppICAgICAgIHNwYW5pc2gKKyAgIGNwNDM3ICAgICAgICAgICAgZWxvdDkyNy1ncmVlayAgICAga29pOCAgICAgICAgICAgICBzd2VkaXNoCisgICBjcDg1MCAgICAgICAgICAgIGVsb3Q5MjgtZ3JlZWsgICAgIGtvaThyICAgICAgICAgICAgc3dpc3MKKyAgIGNwODUyICAgICAgICAgICAgZXVjLWpwICAgICAgICAgICAga29pOHUgICAgICAgICAgICB1Y3MyCisgICBjcDg1NS1jeXJpbGxpYyAgIGZpbm5pc2ggICAgICAgICAgIGxhdGluMS1pc28gICAgICAgdXRmOAorICAgY3A4NTggICAgICAgICAgICBmcmVuY2ggICAgICAgICAgICBsYXRpbjItaXNvCisgICBjcDg2Mi1oZWJyZXcgICAgIGdlcm1hbiAgICAgICAgICAgIGxhdGluOS1pc28KKyAgIGNwODY2LWN5cmlsbGljICAgZ3JlZWstaXNvICAgICAgICAgbWFjaW50b3NoLWxhdGluCisgIEMtS2VybWl0PgorCisgICBUaHVzIHlvdSBjYW4gdHJhbnNsYXRlIG5vdCBvbmx5IGJldHdlZW4gcHJpdmF0ZSBzZXRzIChsaWtlIFBDIGNvZGUKKyAgIHBhZ2VzKSBhbmQgc3RhbmRhcmQgb25lcyAobGlrZSBMYXRpbi0xKSBhcyBpbiBLZXJtaXQgcHJvdG9jb2wsIGJ1dAorICAgYWxzbyBiZXR3ZWVuIGFueSBnaXZlbiBwYWlyIG9mIHByaXZhdGUgc2V0cyAoZS5nLiBDUDg1MiBhbmQgTWF6b3ZpYSkuCisgICBBbGwgY29udmVyc2lvbnMgZ28gdGhyb3VnaCBVbmljb2RlIGFzIHRoZSBpbnRlcm1lZGlhdGUgY2hhcmFjdGVyIHNldCwKKyAgIHJlc3VsdGluZyBpbiBhIG1pbmltdW0gb2YgY2hhcmFjdGVyIGxvc3MsIHNpbmNlIFVuaWNvZGUgaXMgYSBzdXBlcnNldAorICAgb2YgYWxsIG90aGVyIGNoYXJhY3RlciBzZXRzIGtub3duIHRvIEtlcm1pdC4KKworICAgSW4gYWRkaXRpb24gdG8gdGhlIFNFVCBjb21tYW5kcyBsaXN0ZWQgYWJvdmUsIHRoZSBGVFAgUFVUIGFuZCBNUFVUCisgICBjb21tYW5kcyBpbmNsdWRlIHN3aXRjaGVzIHRoYXQgYXBwbHkgb25seSB0byB0aGUgY3VycmVudCBjb21tYW5kOgorCisgICAvTE9DQUwtQ0hBUkFDVEVSLVNFVDpuYW1lCisgICAvU0VSVkVSLUNIQVJBQ1RFUi1TRVQ6bmFtZQorICAgICAgICAgIFVzZSB0aGVzZSBzd2l0Y2hlcyB0byBmb3JjZSBhIHBhcnRpY3VsYXIgdHJhbnNsYXRpb24uIFRoZXNlCisgICAgICAgICAgc3dpdGNoZXMgb3ZlcnJpZGUgdGhlIGdsb2JhbCBGVFAgQ0hBUkFDVEVSLVNFVC1UUkFOU0xBVElPTiBhbmQKKyAgICAgICAgICBTRVJWRVItQ0hBUkFDVEVSLVNFVCBzZXR0aW5ncyBhbmQgYWxzbyBjaGFyYWN0ZXItc2V0CisgICAgICAgICAgZGlmZmVyZW50aWF0aW9uIGJ5IGZpbGUgc2Nhbm5pbmcgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgUFVUIG9yCisgICAgICAgICAgTVBVVCBjb21tYW5kLiBUaGUgZmlsZSBzY2FuIGlzIHN0aWxsIHBlcmZvcm1lZCwgaG93ZXZlciwgdG8KKyAgICAgICAgICBkZXRlcm1pbmUgd2hldGhlciB0aGUgZmlsZSBpcyB0ZXh0IG9yIGJpbmFyeTsgdGh1cyB0aGVzZQorICAgICAgICAgIHN3aXRjaGVzIGRvIG5vdCBhZmZlY3QgYmluYXJ5IGZpbGVzIHVubGVzcyB5b3UgYWxzbyBpbmNsdWRlIHRoZQorICAgICAgICAgIC9URVhUIHN3aXRjaCB0byBmb3JjZSBhbGwgZmlsZXMgdG8gYmUgdHJlYXRlZCBhcyB0ZXh0LgorCisgICBJbiBvdGhlciB3b3JkcywgaWYgeW91IGluY2x1ZGUgb25lIG9yIGJvdGggb2YgdGhlc2Ugc3dpdGNoZXMgd2l0aCBhCisgICBQVVQgb3IgTVBVVCBjb21tYW5kLCB0aGV5IGFyZSB1c2VkLiBTaW1pbGFybHksIHRoZSAvVFJBTlNQQVJFTlQgc3dpdGNoCisgICBkaXNhYmxlcyBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGZvciB0aGUgUFVUIG9yIE1QVVQgY29tbWFuZCBkZXNwaXRlCisgICB0aGUgcHJldmFpbGluZyBGVFAgQ0hBUkFDVEVSLVNFVC1UUkFOU0xBVElPTiBhbmQgU0VSVkVSLUNIQVJBQ1RFUi1TRVQKKyAgIHNldHRpbmdzLgorCisgICBXaGVuIHVwbG9hZGluZywgdGhlIEZJTEUgQ0hBUkFDVEVSLVNFVCBzZXR0aW5nIGlzIGlnbm9yZWQgdW5sZXNzIHlvdQorICAgaGF2ZSBmb3JjZWQgS2VybWl0IG5vdCB0byBbMzI5XXNjYW4gbG9jYWwgZmlsZXMgYnkgaW5jbHVkaW5nIGEgL1RFWFQKKyAgIG9yIC9CSU5BUlkgc3dpdGNoIHdpdGggeW91ciBbTV1QVVQgY29tbWFuZCwgb3IgYnkgZGlzYWJsaW5nIGF1dG9tYXRpYworICAgdGV4dC9iaW5hcnkgc3dpdGNoaW5nIGluIHNvbWUgb3RoZXIgd2F5LgorCisgICBFeGFtcGxlczoKKworICAgIDEuIFN1cHBvc2UgeW91IGhhdmUgYSBDUDg1MiAoRWFzdCBFdXJvcGVhbikgdGV4dCBmaWxlIHRoYXQgeW91IHdhbnQKKyAgICAgICB0byB1cGxvYWQgYW5kIHN0b3JlIGluIElTTyBMYXRpbiBBbHBoYWJldCAyIGVuY29kaW5nOgorICBmdHAgcHV0IC9sb2NhbC1jaGFyOmNwODUyIC9zZXJ2ZXItY2hhcjpsYXRpbjIgbWFneWFyLnR4dAorICAgIDIuIFN1cHBvc2UgeW91IGFsd2F5cyB3YW50IHlvdXIgdGV4dCBmaWxlcyBjb252ZXJ0ZWQgdG8gTGF0aW4tMiB3aGVuCisgICAgICAgdXBsb2FkaW5nIHdpdGggRlRQLiBUaGVuIHB1dDoKKyAgc2V0IGZ0cCBzZXJ2ZXItY2hhcmFjdGVyLXNldCBsYXRpbjIKKyAgICAgICBpbiB5b3VyIEtlcm1pdCBjdXN0b21pemF0aW9uIGZpbGUsIGFuZCB0aGVuIHlvdSBjYW4gb21pdCB0aGUKKyAgICAgICAvU0VSVkVSLUNIQVJBQ1RFUi1TRVQ6IHN3aXRjaCBmcm9tIHlvdXIgRlRQIFBVVCBjb21tYW5kczoKKyAgZnRwIHB1dCAvbG9jYWwtY2hhcjpjcDg1MiBtYWd5YXIudHh0CisgICAgMy4gTm93IHN1cHBvc2UgdGhhdCBhbGwgdGhlIHRleHQgZmlsZXMgb24geW91ciBQQyBhcmUgd3JpdHRlbiBpbgorICAgICAgIEh1bmdhcmlhbiwgYnV0IHRoZXkgaGF2ZSBhIHZhcmlldHkgb2YgZW5jb2RpbmdzLCBhbmQgeW91IGRvbid0CisgICAgICAgd2FudCB0byBoYXZlIHRvIGluY2x1ZGUgdGhlIC9MT0NBTC1DSEFSQUNURVItU0VUOiBzd2l0Y2ggb24gZXZlcnkKKyAgICAgICBGVFAgUFVUIGNvbW1hbmQsIG9yIChtb3JlIHRvIHRoZSBwb2ludCkgeW91IHdhbnQgdG8gYmUgYWJsZSB0bworICAgICAgIHNlbmQgYSBtaXh0dXJlIG9mIHRoZXNlIGZpbGVzIGFsbCBhdCBvbmNlLiBQdXQgdGhlc2UgY29tbWFuZHMgaW4KKyAgICAgICB5b3VyIEtlcm1pdCBjdXN0b21pemF0aW9uIGZpbGU6CisgIHNldCBmdHAgc2VydmVyLWNoYXJhY3Rlci1zZXQgbGF0aW4yICAgICAgICAgICAgOyBJU08gODg1OS0yCisgIHNldCBmaWxlIGRlZmF1bHQgNy1iaXQtY2hhcmFjdGVyLXNldCBodW5nYXJpYW4gOyBJU08gNjQ2IEh1bmdhcmlhbgorICBzZXQgZmlsZSBkZWZhdWx0IDgtYml0LWNoYXJhY3Rlci1zZXQgY3A4NTIgICAgIDsgUEMgRWFzdCBFdXJvcGVhbiBDb2RlIFBhZ2UKKyAgICAgICBhbmQgbm93IFBVVCBhbmQgTVBVVCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGFuZCBzd2l0Y2ggYW1vbmcKKyAgICAgICBJU08gNjQ2IEh1bmdhcmlhbiwgQ29kZSBQYWdlIDg1MiwgVVRGLTgsIGFuZCBVQ1MtMiBlbmNvZGluZ3MsCisgICAgICAgdHJhbnNsYXRpbmcgZWFjaCBvbmUgdG8gTGF0aW4tMiBmb3IgdXBsb2FkaW5nOgorICBmdHAgcHV0ICoudHh0CisKKyAgIEFuZCBzaW5jZSBiaW5hcnkgZmlsZXMgYXJlIGFsc28gZGV0ZWN0ZWQgYXV0b21hdGljYWxseSwgdGhlIGxhdHRlciBjYW4KKyAgIGJlIHNpbXBsaWZpZWQgdG86CisKKyAgZnRwIHB1dCAqCisKKyAgIGV2ZW4gd2hlbiAiKiIgbWF0Y2hlcyBhIGRpdmVyc2UgY29sbGVjdGlvbiBvZiBiaW5hcnkgYW5kIHRleHQgZmlsZXMsCisgICBiZWNhdXNlIHRyYW5zbGF0aW9ucyBhcmUgc2tpcHBlZCBhdXRvbWF0aWNhbGx5IGZvciBiaW5hcnkgZmlsZXMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAzLjcuMi4gQ2hhcmFjdGVyIFNldHMgYW5kIERvd25sb2FkaW5nCisKKyAgIFRoZSBjb21tYW5kcyBhbmQgc3dpdGNoZXMgYXJlIHRoZSBzYW1lIGFzIGZvciB1cGxvYWRpbmcsIGJ1dCBhdXRvbWF0aWMKKyAgIGNoYXJhY3Rlci1zZXQgc3dpdGNoaW5nIHdvcmtzIGRpZmZlcmVudGx5LCBzaW5jZSBLZXJtaXQgY2FuJ3Qgc2NhbiB0aGUKKyAgIHNlcnZlciBmaWxlcyBpbiBhZHZhbmNlLiBJbnN0ZWFkLCB0aGUgdHJhbnNmZXIgbW9kZSAodGV4dCBvciBiaW5hcnkpCisgICBpcyBiYXNlZCBvbiB0aGUgZmlsZW5hbWVzOyBlYWNoIG5hbWUgaXMgY29tcGFyZWQgd2l0aCBLZXJtaXQncyBsaXN0IG9mCisgICB0ZXh0IG5hbWUgcGF0dGVybnMgYW5kIGJpbmFyeSBuYW1lIHBhdHRlcm5zLiBJZiB0aGUgbmFtZSBtYXRjaGVzIGEKKyAgIGJpbmFyeSBwYXR0ZXJuIChmb3IgZXhhbXBsZSwgaWYgdGhlIGZpbGVuYW1lIGlzIG9vZmEudGFyLmd6IGFuZCBvbmUgb2YKKyAgIHRoZSBmaWxlbmFtZSBwYXR0ZXJucyBpcyAiKi5neiIpLCB0aGUgZmlsZSBpcyBkb3dubG9hZGVkIGluIGJpbmFyeQorICAgbW9kZTsgb3RoZXJ3aXNlIGlmIGl0IG1hdGNoZXMgYSB0ZXh0IHBhdHRlcm4gKGUuZy4gb29mYS50eHQgbWF0Y2hlcworICAgIioudHh0IiksIGl0IGlzIHRyYW5zZmVycmVkIGluIHRleHQgKCJhc2NpaSIpIG1vZGUuIE90aGVyd2lzZSwgaXQgaXMKKyAgIHRyYW5zZmVycmVkIGluIHRoZSBwcmV2YWlsaW5nIEZUUCBUWVBFLgorCisgICBJbiBDLUtlcm1pdCA4LjAsIHRoZSBwYXR0ZXJuIGxpc3RzIHVzZWQgd2l0aCBGVFAgR0VUIGFyZSBub3QgdGhlIHNhbWUKKyAgIGxpc3RzIHVzZWQgd2l0aCBLZXJtaXQgdHJhbnNmZXJzLCBhbmQgY2FuIG5vdCBiZSB2aWV3ZWQgd2l0aCBTSE9XCisgICBQQVRURVJOUywgbm9yIGFkanVzdGVkIHdpdGggQUREIGFuZCBSRU1PVkUgVEVYVC1QQVRURVJOUyBhbmQKKyAgIEJJTkFSWS1QQVRURVJOUywgb3IgU0VUIEZJTEUgVEVYVC1QQVRURVJOUyBhbmQgQklOQVJZLVBBVFRFUk5TLgorICAgQ29uZmlndXJhdGlvbiBvZiB0aGUgRlRQIHBhdHRlcm5zIGxpc3Qgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZQorICAgcmVsZWFzZS4KKworICAgRXhhbXBsZXM6CisKKyAgIGdldCAvc2VydmVyLWNoYXI6bGF0aW4xIC9sb2NhbC1jaGFyOmNwODUwIEdy/N9lLnR4dAorICAgICAgICAgIEluIHRoaXMgY29tbWFuZCwgdGhlIGZpbGVuYW1lIGNvbnRhaW5zIHNwZWNpYWwgY2hhcmFjdGVycywKKyAgICAgICAgICB3aGljaCB5b3UgZW50ZXIgdXNpbmcgd2hhdGV2ZXIgY2hhcmFjdGVyIHNldCB5b3VyIGxvY2FsCisgICAgICAgICAgY29tcHV0ZXIgdXNlcywgaW4gdGhpcyBjYXNlIFBDIENvZGUgUGFnZSA4NTAgKGNwODUwKS4gVGhlCisgICAgICAgICAgY29tbWFuZCB0ZWxscyBLZXJtaXQgKGluIGNhc2UgaXQgZGlkbid0IGtub3cgYWxyZWFkeSBmcm9tIGl0cworICAgICAgICAgIEZJTEUgQ0hBUkFDVEVSLVNFVCBzZXR0aW5nKSB0aGF0IHRoZSBsb2NhbCBjaGFyYWN0ZXIgc2V0IGlzCisgICAgICAgICAgY3A4NTAgYW5kIHRoZSBzZXJ2ZXIncyBjaGFyYWN0ZXItc2V0IGlzIElTTyA4ODU5LTEgTGF0aW4KKyAgICAgICAgICBBbHBoYWJldCAxIChsYXRpbjEpLiBLZXJtaXQgdHJhbnNsYXRlcyB0aGUgZmlsZW5hbWUgZnJvbSBjcDg1MAorICAgICAgICAgIHRvIGxhdGluMSBhbmQgc2VuZHMgdGhlIGxhdGluMSBuYW1lIHRvIHRoZSBzZXJ2ZXIuIFNpbmNlIGl0J3MgYQorICAgICAgICAgIHRleHQgZmlsZSAobWF0Y2hlcyAiKi50eHQiKSwgaXRzIGNvbnRlbnRzIGFyZSB0cmFuc2xhdGVkIHRvCisgICAgICAgICAgY3A4NTAgb24gYXJyaXZhbCwgYW5kIGl0IGlzIHNhdmVkIHdpdGggYSBjcDg1MCBuYW1lLgorCisgICBtZ2V0IC90ZXh0IC9zZXJ2ZXI6bGF0aW4xIC9sb2NhbDp1dGY4ICoudHh0CisgICAgICAgICAgVGhpcyBjb21tYW5kOgorCisgICAgICAgICAgKyBUZWxscyBDLUtlcm1pdCB0aGF0IHRoZSBzZXJ2ZXIncyBmaWxlcyBhcmUgZW5jb2RlZCBpbiBJU08KKyAgICAgICAgICAgIDg4NTktMSBMYXRpbiBBbHBoYWJldCAxLgorICAgICAgICAgICsgVGVsbHMgQy1LZXJtaXQgdG8gdHJhbnNsYXRlIHRoZSBpbmNvbWluZyBmaWxlcyBpbnRvIFVuaWNvZGUKKyAgICAgICAgICAgIFVURi04IGZvciBzdG9yYWdlLgorICAgICAgICAgICsgQXNrcyB0aGUgc2VydmVyIHRvIHNlbmQgYWxsICIudHh0IiBmaWxlcyBpbiB0ZXh0IG1vZGUuCisKKyAgIG1nZXQgL3NlcnZlcjpsYXRpbjEgL2xvY2FsOnV0ZjggKgorICAgICAgICAgIFRlbGxzIEtlcm1pdCB0byBnZXQgYWxsIGZpbGVzIGZyb20gdGhlIHNlcnZlcidzIGRpcmVjdG9yeSwKKyAgICAgICAgICBzd2l0Y2hpbmcgYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkgbW9kZSBiYXNlZCBvbiB0aGUgZmlsZW5hbWUuCisgICAgICAgICAgVGhlIG5hbWVzIG9mIGFsbCB0aGUgZmlsZXMgYXJlIHRyYW5zbGF0ZWQgKHRvIFVURi04IGluIHRoaXMKKyAgICAgICAgICBjYXNlKSwgYnV0IGNvbnRlbnRzIGFyZSB0cmFuc2xhdGVkIChhbHNvIHRvIFVURi04KSBvbmx5IGZvcgorICAgICAgICAgIHRleHQgZmlsZXMuCisKKyAgIE5vdGUgdGhhdCBhbnkgcGFpciBvZiA4LWJpdCBjaGFyYWN0ZXIgc2V0cyBpcyBsaWtlbHkgdG8gaGF2ZSBzb21lCisgICBpbmNvbXBhdGliaWxpdGllcy4gQW55IGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSBmaWxlIHRoYXQgZG8gbm90IGhhdmUKKyAgIGVxdWl2YWxlbnRzIGluIHRoZSBkZXN0aW5hdGlvbiBmaWxlJ3MgY2hhcmFjdGVyIHNldCBhcmUgY29udmVydGVkIHRvCisgICBxdWVzdGlvbiBtYXJrcy4gVGhpcyBhcHBsaWVzIHRvIGJvdGggZmlsZW5hbWVzIGFuZCB0byB0ZXh0IGZpbGUKKyAgIGNvbnRlbnRzLgorCisgICBBbHNvIG5vdGUgdGhhdCB0aGUgc2VydmVyJ3MgYWJpbGl0eSB0byBhY2NlcHQgc3BlY2lhbCBjaGFyYWN0ZXJzIGluCisgICBmaWxlbmFtZXMgZGVwZW5kcyBvbiB0aGUgcGFydGljdWxhciBzZXJ2ZXIuIEZvciBleGFtcGxlOgorCisgIGdldCBHcvzfZS50eHQKKworICAgd29ya3Mgd2l0aCBXVS1GVFBELCBidXQ6CisKKyAgbWdldCBHcvzfKi50eHQKKworICAgZG9lcyBub3QuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAzLjcuMy4gUkZDMjY0MAorCisgICBbMzMwXVJGQzI2NDAsIEp1bHkgMTk5OSwgc3BlY2lmaWVzIGEgbWV0aG9kIGJ5IHdoaWNoIHRoZSBGVFAgY2xpZW50CisgICBhbmQgc2VydmVyIGNhbiBuZWdvdGlhdGUgdGhlIHVzZSBvZiBVVEY4LiBIb3dldmVyLCBSRkMyNjQwLWNhcGFibGUKKyAgIHNlcnZlcnMgYXJlIHJhcmUgdG8gbm9uZXhpc3RlbnQgYXQgdGhpcyB3cml0aW5nLCBhbmQgaW4gYW55IGNhc2UgeW91CisgICBkb24ndCBuZWVkIHRoZW0gdG8gYmUgYWJsZSB0byB0cmFuc2ZlciB0ZXh0IGluIFVURjguIEMtS2VybWl0IGxldHMgeW91CisgICB1cGxvYWQgYW5kIGRvd25sb2FkIHRleHQgZmlsZXMgaW4gYW55IGNoYXJhY3RlciBzZXQgaXQga25vd3MgYWJvdXQsCisgICBjb252ZXJ0aW5nIHRvIG9yIGZyb20gYW55IG90aGVyIGNoYXJhY3RlciBzZXQgaXQga25vd3MgYWJvdXQsIHdpdGhvdXQKKyAgIHRoZSBrbm93bGVkZ2UsIHBlcm1pc3Npb24sIG9yIGNvb3BlcmF0aW9uIG9mIHRoZSBzZXJ2ZXIsIGFuZAorICAgcmVnYXJkbGVzcyBvZiBpdHMgY2FwYWJpbGl0aWVzLgorCisgICBbIFszMzFdVG9wIF0gWyBbMzMyXUZUUCBUb3AgXSBbIFszMzNdQy1LZXJtaXQgSG9tZSBdIFsgWzMzNF1LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuOC4gRlRQIENvbW1hbmQgU2hvcnRjdXRzCisKKyAgIEMtS2VybWl0J3MgRlRQIGNsaWVudCBjb2V4aXN0cyB3aXRoIG90aGVyIEMtS2VybWl0IGZ1bmN0aW9ucyBieQorICAgcmVxdWlyaW5nIHRoZSAiZnRwIiBwcmVmaXggZm9yIGVhY2ggRlRQLXJlbGF0ZWQgY29tbWFuZDogRlRQIE9QRU4sIEZUUAorICAgR0VULCBGVFAgQllFLCBhbmQgc28gb24uIEZvciBpbnRlcmFjdGl2ZSB1c2UsIGhvd2V2ZXIsIHRoaXMgY2FuIGJlCisgICByYXRoZXIgYXdrd2FyZCBhbmQgc29tZXRpbWVzIHN1cnByaXNpbmcsIGZvciBleGFtcGxlIHdoZW4gYSBHRVQKKyAgIGNvbW1hbmQgc3RhcnRzIGEgS2VybWl0IEdFVCByYXRoZXIgdGhhbiBhbiBGVFAgR0VULiBJbiBmYWN0LCBtYW55CisgICBLZXJtaXQgY29tbWFuZHMgbWlnaHQganVzdCBhcyBlYXNpbHkgYXBwbHkgdG8gYW4gRlRQIGNvbm5lY3Rpb246IEdFVCwKKyAgIFBVVCAoU0VORCksIEJZRSwgYW5kIENMT1NFLiBUaGUgZm9sbG93aW5nIGNvbW1hbmQgbGV0cyB5b3UgY2hvb3NlIGhvdworICAgdGhlc2UgY29tbWFuZHMgYXJlIGludGVycHJldGVkOgorCisgICBTRVQgR0VULVBVVC1SRU1PVEUgeyBBVVRPLCBLRVJNSVQsIEZUUCB9CisgICAgICAgICAgQ29udHJvbHMgdGhlIG9yaWVudGF0aW9uIG9mIEdFVCwgUFVULCBSRU1PVEUgYW5kIG90aGVyCisgICAgICAgICAgZmlsZS10cmFuc2ZlciBhbmQgY2xpZW50L3NlcnZlciBjb21tYW5kcyB0aGF0IG1pZ2h0IGFwcGx5IHRvCisgICAgICAgICAgZWl0aGVyIEtlcm1pdCBvciBGVFAuIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgQVVUTywgbWVhbmluZyB0aGF0CisgICAgICAgICAgdGhlc2UgY29tbWFuZHMgYXBwbHkgdG8gRlRQIGlmIGFuIEZUUCBjb25uZWN0aW9uIGlzIG9wZW4sIGFuZAorICAgICAgICAgIHRvIEtlcm1pdCBvdGhlcndpc2UuIEtFUk1JVCBtZWFucyB0aGV5IGFsd2F5cyBhcHBseSB0byBLZXJtaXQsCisgICAgICAgICAgRlRQIG1lYW5zIHRoZXkgYWx3YXlzIGFwcGx5IHRvIEZUUC4KKworICAgSGVyZSBpcyBhIGNvbXBsZXRlIGxpc3Qgb2YgYWZmZWN0ZWQgY29tbWFuZHM6CisKKyBLZXJtaXQgQ29tbWFuZCAgICAgICAgICAgICAgIEZUUCBFcXVpdmFsZW50CisgIChub25lKSAgICAgICAgICAgICAgICAgICAgICAgRlRQIFsgT1BFTiBdCisgIExPR0lOICAgICAgICAgICAgICAgICAgICAgICAgRlRQIFVTRVIKKyAgTE9HT1VUICAgICAgICAgICAgICAgICAgICAgICBGVFAgUkVTRVQKKyAgQllFICAgICAgICAgICAgICAgICAgICAgICAgICBGVFAgQllFCisgIEZJTklTSCAgICAgICAgICAgICAgICAgICAgICAgRlRQIEJZRQorICBDTE9TRSAgICAgICAgICAgICAgICAgICAgICAgIEZUUCBCWUUKKyAgSEFOR1VQICAgICAgICAgICAgICAgICAgICAgICBGVFAgQllFCisgIEJJTkFSWSAgICAgICAgICAgICAgICAgICAgICAgRlRQIFRZUEUgQklOQVJZCisgIFRFWFQgKG9yIEFTQ0lJKSAgICAgICAgICAgICAgRlRQIFRZUEUgQVNDSUkKKyAgU0VORCAob3IgUFVUKSAgICAgICAgICAgICAgICBGVFAgUFVUCisgIE1TRU5EIChvciBNUFVUKSAgICAgICAgICAgICAgRlRQIE1QVVQKKyAgUkVTRU5EICAgICAgICAgICAgICAgICAgICAgICBGVFAgUFVUIC9SRUNPVkVSCisgIENTRU5EICAgICAgICAgICAgICAgICAgICAgICAgRlRQIFBVVCAvQ09NTUFORAorICBHRVQgICAgICAgICAgICAgICAgICAgICAgICAgIEZUUCBHRVQKKyAgTUdFVCAgICAgICAgICAgICAgICAgICAgICAgICBGVFAgTUdFVAorICBSRUdFVCAgICAgICAgICAgICAgICAgICAgICAgIEZUUCBHRVQgL1JFQ09WRVIKKyAgUkVNT1RFIEhFTFAgICAgICAoUkhFTFApICAgICBGVFAgSEVMUAorICBSRU1PVEUgQ0QgICAgICAgIChSQ0QpICAgICAgIEZUUCBDRCAoQ1dEKQorICBSRU1PVEUgUFdEICAgICAgIChSUFdEKSAgICAgIEZUUCBQV0QKKyAgUkVNT1RFIERJUkVDVE9SWSAoUkRJUikgICAgICBGVFAgRElSRUNUT1JZCisgIFJFTU9URSBERUxFVEUgICAgKFJERUwpICAgICAgRlRQIERFTEVURQorICBSRU1PVEUgTUtESVIgICAgIChSTUtESVIpICAgIEZUUCBNS0RJUgorICBSRU1PVEUgUk1ESVIgICAgIChSUk1ESVIpICAgIEZUUCBSTURJUgorICBSRU1PVEUgUkVOQU1FICAgIChSUkVOQU1FKSAgIEZUUCBSRU5BTUUKKyAgUkVNT1RFIFRZUEUgICAgICAoUlRZUEUpICAgICBGVFAgVFlQRQorICBSRU1PVEUgRVhJVCAgICAgIChSRVhJVCkgICAgIEZUUCBCWUUKKworICAgVGhlIGNvbW1hbmRzIGluIHRoZSByaWdodC1oYW5kIGNvbHVtbiBhbHdheXMgYWNjZXNzIEZUUC4gVGhlIGNvbW1hbmRzCisgICBpbiB0aGUgbGVmdCBjb2x1bW4gY2FuIGFjY2VzcyBlaXRoZXIgS2VybWl0IHByb3RvY29sIG9yIEZUUDoKKworICAgICAqIFdoZW4gR0VULVBVVC1SRU1PVEUgaXMgc2V0IHRvIEtFUk1JVCwgb3IgdG8gQVVUTyB3aGVuIHRoZXJlIGlzIG5vCisgICAgICAgRlRQIGNvbm5lY3Rpb24sIHRoZSBjb21tYW5kcyBpbiB0aGUgbGVmdC1oYW5kIGNvbHVtbiBhY2Nlc3MgS2VybWl0CisgICAgICAgcHJvdG9jb2wsIGFuZCB0aG9zZSByaWdodC1oYW5kIGNvbHVtbiBhcmUgcmVxdWlyZWQgZm9yIEZUUC4KKyAgICAgKiBXaGVuIEdFVC1QVVQtUkVNT1RFIGlzIHNldCB0byBGVFAsIG9yIHRvIEFVVE8gd2hlbiB0aGVyZSBpcyBhbgorICAgICAgIGFjdGl2ZSBGVFAgY29ubmVjdGlvbiwgdGhlIGNvbW1hbmRzIGluIHRoZSBsZWZ0LWhhbmQgY29sdW1uIGFjY2VzcworICAgICAgIHRoZSBGVFAgY29ubmVjdGlvbiBhbmQgY2FuIG5vdCBiZSB1c2VkIHRvIGFjY2VzcyBLZXJtaXQgcHJvdG9jb2wuCisgICAgICAgSW4gdGhpcyBjYXNlLCBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSBib3RoIEtlcm1pdCBwcm90b2NvbAorICAgICAgIGFuZCB0aGUgRlRQIGNvbm5lY3Rpb24sIHlvdSBtdXN0IFNFVCBHRVQtUFVULVJFTU9URSBLRVJNSVQsIGFuZAorICAgICAgIHRoZW4gdXNlIHRoZSBGVFAgY29tbWFuZHMgaW4gdGhlIHJpZ2h0LWhhbmQgY29sdW1uIHRvIGFjY2VzcyB0aGUKKyAgICAgICBGVFAgY29ubmVjdGlvbi4KKworICAgTm90ZSB0aGF0IGZpbGUtbWFuYWdlbWVudCBjb21tYW5kcyBzdWNoIGFzIERJUkVDVE9SWSwgREVMRVRFLCBDRCwgUFdELAorICAgTUtESVIsIFJNRElSLCBIRUxQLCBSRU5BTUUsIENPUFksIFRZUEUsIGFuZCBzbyBvbiwgYWx3YXlzIGFwcGx5CisgICBsb2NhbGx5LCBubyBtYXR0ZXIgd2hhdCBraW5kIG9mIGNvbm5lY3Rpb24geW91IGhhdmUuIFRoaXMgaXMgdGhlCisgICBvcHBvc2l0ZSBvZiBtb3N0IEZUUCBjbGllbnRzLCB3aGVyZSB0aGVzZSBjb21tYW5kcyBhcmUgaW50ZW5kZWQgZm9yCisgICB0aGUgc2VydmVyLCBhbmQgcmVxdWlyZSBhbiAiTCIgcHJlZml4IGZvciBsb2NhbCBleGVjdXRpb24gKGUuZy4gImRpciIKKyAgIGdldHMgYSBkaXJlY3RvcnkgbGlzdGluZyBmcm9tIHRoZSBzZXJ2ZXIsICJsZGlyIiBnZXRzIGEgbG9jYWwKKyAgIGRpcmVjdG9yeSBsaXN0aW5nKS4gVG8gaWxsdXN0cmF0ZSB3aXRoIHRoZSBDRCBjb21tYW5kIGFuZCBhIHR5cGljYWwKKyAgIFVOSVggRlRQIGNsaWVudDoKKworIENsaWVudCAgIFNlcnZlciAgICAgIENoYW5nZSBMb2NhbCBEaXJlY3RvcnkgICAgIENoYW5nZSBSZW1vdGUgRGlyZWN0b3J5CisgIEZUUCAgICAgIEZUUCAgICAgICAgIGxjZCAgICAgICAgICAgICAgICAgICAgICAgIGNkIChjd2QpCisgIEtlcm1pdCAgIEtlcm1pdCAgICAgIGNkICAgICAgICAgICAgICAgICAgICAgICAgIHJjZCwgcmVtb3RlIGNkCisgIEtlcm1pdCAgIEZUUCAgICAgICAgIGNkICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cCBjZCwgcmNkLCByZW1vdGUgY2QKKworICAgQWxzbyBub3RlIHRoYXQgbm90IGFsbCBSRU1PVEUgY29tbWFuZHMgYXJlIHVzZWZ1bCB3aXRoIEZUUCwgc2luY2UgRlRQCisgICBzZXJ2ZXJzIGRvIG5vdCBvZmZlciB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbnMuIFRoZXNlIGluY2x1ZGU6CisKKyAgICAgKiBSRU1PVEUgQVNTSUdOICAtIEZUUCBzZXJ2ZXJzIGRvbid0IGhhdmUgdmFyaWFibGVzCisgICAgICogUkVNT1RFIENPUFkgICAgLSBGVFAgc2VydmVycyBkb24ndCBjb3B5IGZpbGVzCisgICAgICogUkVNT1RFIEhPU1QgICAgLSBGVFAgc2VydmVycyBkb24ndCBleGVjdXRlIGhvc3QgKHNoZWxsKSBjb21tYW5kcworICAgICAqIFJFTU9URSBLRVJNSVQgIC0gRlRQIHNlcnZlcnMgZG9uJ3QgZXhlY3V0ZSBLZXJtaXQgY29tbWFuZHMKKyAgICAgKiBSRU1PVEUgUFJJTlQgICAtIEZUUCBzZXJ2ZXJzIGRvbid0IHByaW50IGZpbGVzCisgICAgICogUkVNT1RFIFFVRVJZICAgLSBGVFAgc2VydmVycyBkb24ndCBoYXZlIHZhcmlhYmxlcworICAgICAqIFJFTU9URSBTRVQgICAgIC0gRlRQIHNlcnZlcnMgZG9uJ3QgaGF2ZSBLZXJtaXQgc2V0dGluZ3MKKyAgICAgKiBSRU1PVEUgV0hPICAgICAtIEZUUCBzZXJ2ZXJzIGRvbid0IHNlbmQgdXNlciBsaXN0cworCisgICBGaW5hbGx5IG5vdGUgdGhhdCBjb21tYW5kIHNob3J0Y3V0cyBkbyBub3QgYXBwbHkgdG8gdGhlIEhFTFAgY29tbWFuZC4KKyAgIEZvciBoZWxwIGFib3V0IGFuIEZUUCBjb21tYW5kLCB1c2UgKGZvciBleGFtcGxlKSAiaGVscCBmdHAgZGVsZXRlIiwKKyAgIG5vdCAiaGVscCBkZWxldGUiIG9yICJoZWxwIHJkZWxldGUiLgorCisgICBbIFszMzVdVG9wIF0gWyBbMzM2XUZUUCBUb3AgXSBbIFszMzddQy1LZXJtaXQgSG9tZSBdIFsgWzMzOF1LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuOS4gRHVhbCBTZXNzaW9ucworCisgICBZb3UgY2FuIGhhdmUgYW4gRlRQIHNlc3Npb24gb3BlbiBhdCB0aGUgc2FtZSB0aW1lIGFzIGEgcmVndWxhciBLZXJtaXQKKyAgIFNFVCBMSU5FIG9yIFNFVCBIT1NUICh0ZXJtaW5hbCkgc2Vzc2lvbi4gSW4gdGhpcyBjYXNlLCB0aGUgZGVmYXVsdCBTRVQKKyAgIEdFVC1QVVQtUkVNT1RFIEFVVE8gc2V0dGluZyBzaG91bGQgZW5zdXJlIHRoYXQgYWxsICJ0d28tZmFjZWQiCisgICBjb21tYW5kcyBsaWtlIEdFVCwgUFVULCBSRU1PVEUsIEhBTkdVUCwgQllFLCBldGMsIGFwcGx5IHRvIHRoZSBLZXJtaXQKKyAgIHNlc3Npb24sIGFuZCBhbGwgY29tbWFuZHMgZm9yIHRoZSBGVFAgc2Vzc2lvbiBtdXN0IGluY2x1ZGUgdGhlIEZUUAorICAgcHJlZml4LiBUbyBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4sIHlvdSBjYW4gdXNlIFNFVCBHRVQtUFVULVJFTU9URQorICAgS0VSTUlULgorCisgIGZ0cCBmb28uYmFyLmJhei5jb20KKyAgaWYgZmFpbCAuLi4KKyAgKGxvZyBpbikKKyAgc2V0IGhvc3QgZm9vLmJhci5iYXouY29tCisgIGlmIGZhaWwgLi4uCisgIChsb2cgaW4pCisKKyAgIE5vdyB5b3UgaGF2ZSBib3RoIGFuIEZUUCBhbmQgVGVsbmV0IGNvbm5lY3Rpb24gdG8gdGhlIHNhbWUgaG9zdCAob2YKKyAgIGNvdXJzZSB0aGV5IGNvdWxkIGFsc28gYmUgdG8gZGlmZmVyZW50IGhvc3RzLCBhbmQgeW91IGNvdWxkIGFsc28gaGF2ZQorICAgYSBkaXJlY3Qgb3IgZGlhbGVkIHNlcmlhbCBjb25uZWN0aW9uIGluc3RlYWQgb2YgYSBUZWxuZXQgY29ubmVjdGlvbikuCisgICBOb3cgYXNzdW1pbmcgeW91IGhhdmUgYSBLZXJtaXQgc2VydmVyIG9uIHRoZSBmYXIgZW5kIG9mIHRoZSBLZXJtaXQKKyAgIGNvbm5lY3Rpb246CisKKyAgcmNkIGluY29taW5nICAgICAgOyBDaGFuZ2VzIEtlcm1pdCBzZXJ2ZXIncyBkaXJlY3RvcnkgKD0gUkVNT1RFIENEKQorICBmdHAgY2QgaW5jb21pbmcgICA7IENoYW5nZXMgRlRQIHNlcnZlcidzIGRpcmVjdG9yeQorICBwdXQgb29mYS50eHQgICAgICA7IFNlbmRzIGEgZmlsZSBvbiB0aGUgS2VybWl0IGNvbm5lY3Rpb24KKyAgZnRwIHB1dCBvb2ZhLnR4dCAgOyBTZW5kcyBhIGZpbGUgb24gdGhlIEZUUCBjb25uZWN0aW9uCisgIGJ5ZSAgICAgICAgICAgICAgIDsgU2h1dHMgZG93biB0aGUgS2VybWl0IGNvbm5lY3Rpb24KKyAgZnRwIGJ5ZSAgICAgICAgICAgOyBTaHV0cyBkb3duIHRoZSBGVFAgY29ubmVjdGlvbgorCisgICBOb3RlIHRoYXQgUFVUIGFuZCBTRU5EIGFyZSBzeW5vbnltcyBmb3IgYm90aCBGVFAgYW5kIEtlcm1pdAorICAgY29ubmVjdGlvbnMuCisKKyAgIFlvdSBjYW4gYWxzbyBlc3RhYmxpc2ggZHVhbCBzZXNzaW9ucyBvbiB0aGUgS2VybWl0IGNvbW1hbmQgbGluZToKKworICBrZXJtaXQgLWogaG9zdDEgLTkgaG9zdDIKKworICAgVGhpcyBtYWtlcyBhIFRlbG5ldCBjb25uZWN0aW9uIHRvIGhvc3QxIGFuZCBhbiBGVFAgY29ubmVjdGlvbiB0bworICAgaG9zdDIuCisKKyAgIFsgWzMzOV1Ub3AgXSBbIFszNDBdRlRQIFRvcCBdIFsgWzM0MV1DLUtlcm1pdCBIb21lIF0gWyBbMzQyXUtlcm1pdAorICAgSG9tZSBdCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4xMC4gQXV0b21hdGluZyBGVFAgU2Vzc2lvbnMKKworICAgTW9zdCBvZiBLZXJtaXQncyBzY3JpcHRpbmcgZmVhdHVyZXMgY2FuIGJlIHVzZWQgdG8gbWFrZSBhbmQgY29udHJvbAorICAgRlRQIHNlc3Npb25zOiBGT1IgYW5kIFdISUxFIGxvb3BzLCBJRi1FTFNFIGFuZCBTV0lUQ0ggY29uc3RydWN0aW9ucywKKyAgIHZhcmlhYmxlcywgYXJyYXlzLCBidWlsdC1pbiBmdW5jdGlvbnMsIGFuZCBhbGwgdGhlIHJlc3QuIFlvdSBjYW4ndCB1c2UKKyAgIElOUFVULCBNSU5QVVQsIE9VVFBVVCwgQ0xFQVIsIG9yIFNDUklQVCBvbiBhbiBGVFAgc2Vzc2lvbiwgYnV0IHRoZXNlCisgICBhcmUgbm90IG5lZWRlZCBzaW5jZSB0aGUgRlRQIHByb3RvY29sIGlzIHdlbGwgZGVmaW5lZC4KKworICAgWzM0M11DTElDSyBIRVJFIGZvciBhbiBGVFAgc2NyaXB0aW5nIHR1dG9yaWFsLgorCisgICAgMy4xMC4xLiBGVFAtU3BlY2lmaWMgVmFyaWFibGVzIGFuZCBGdW5jdGlvbnMKKworICAgVGhlIGZvbGxvd2luZyB2YXJpYWJsZSB0ZWxscyB3aGV0aGVyIGFuIEZUUCBjb25uZWN0aW9uIGlzIG9wZW46CisKKyAgIFx2KGZ0cF9jb25uZWN0ZWQpCisgICAgICAgICAgMSBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgRlRQIGNvbm5lY3Rpb24sIDAgaWYgdGhlcmUgaXNuJ3QuCisKKyAgIFRoZSBGVFAgT1BFTiBjb21tYW5kIHNldHM6CisKKyAgIFx2KGZ0cF9ob3N0KQorICAgICAgICAgIFRoZSBob3N0IHRvIHdoaWNoIHRoZSBtb3N0IHJlY2VudCBGVFAgY29ubmVjdGlvbiB3YXMgbWFkZS4KKworICAgXHYoZnRwX3NlY3VyaXR5KQorICAgICAgICAgIFRoZSBzZWN1cml0eSBtZXRob2QgbmVnb3RpYXRlZCBmb3IgdGhlIGN1cnJlbnQgRlRQIHNlc3Npb24uIFRoZQorICAgICAgICAgIHZhbHVlIGlzICJOVUxMIiB3aGVuIG5vIHNlY3VyaXR5IGlzIHVzZWQuIFNlZSBbMzQ0XTMuMi4gTWFraW5nCisgICAgICAgICAgU2VjdXJlIEZUUCBDb25uZWN0aW9ucy4KKworICAgXHYoZnRwX3NlcnZlcikKKyAgICAgICAgICBUaGUgT1MgdHlwZSAoVU5JWCwgVk1TLCBldGMpIG9mIHRoZSBGVFAgc2VydmVyIGhvc3QuCisKKyAgIFRoZSBGVFAgVVNFUiBjb21tYW5kIChvciBGVFAgT1BFTiAvVVNFUjosIG9yIEZUUCB3aXRoIGF1dG9tYXRpYyBsb2dpbikKKyAgIHNldHM6CisKKyAgIFx2KGZ0cF9sb2dnZWRpbikKKyAgICAgICAgICAxIGlmIHlvdSBhcmUgbG9nZ2VkIGluIHRvIGFuIEZUUCBzZXJ2ZXIsIDAgaWYgeW91IGFyZSBub3QuCisKKyAgIFRoZSBjdXJyZW50IENPTU1BTkQtUFJPVEVDVElPTi1MRVZFTCBhbmQgREFUQS1QUk9URUNUSU9OLUxFVkVMIHZhbHVlcworICAgYXJlIHJlZmxlY3RlZCBpbjoKKworICAgXHYoZnRwX2NwbCkKKyAgIFx2KGZ0cF9kcGwpCisgICAgICAgICAgVGhlIHZhbHVlcyBhcmUgImNsZWFyIiwgImNvbmZpZGVudGlhbCIsICJzYWZlIiBvciAicHJpdmF0ZSIuCisgICAgICAgICAgU2VlIFszNDVdMy4yLiBNYWtpbmcgU2VjdXJlIEZUUCBDb25uZWN0aW9ucy4KKworICAgVGhlIEZUUCBHRVQtUFVULVJFTU9URSBzZXR0aW5nIGlzIHJlZmxlY3RlZCBpbjoKKworICAgXHYoZnRwX2dldHB1dHJlbW90ZSkKKyAgICAgICAgICBUaGUgdmFsdWVzIGFyZSAiYXV0byIsICJmdHAiLCBvciAia2VybWl0Ii4KKworICAgRXZlcnkgRlRQIGNvbW1hbmQgc2V0cyB0aGUgXHYoc3VjY2VzcykgdmFyaWFibGUsIGFzIHdlbGwgYXMgdGhlCisgICBmb2xsb3dpbmcgdHdvIEZUUC1zcGVjaWZpYyB2YXJpYWJsZXM6CisKKyAgIFx2KGZ0cF9jb2RlKQorICAgICAgICAgIFRoZSBzdGFuZGFyZGl6ZWQgbnVtZXJpYyBGVFAgcHJvdG9jb2wgY29kZSBmcm9tIHRoZSBzZXJ2ZXIncworICAgICAgICAgIHJlc3BvbnNlIHRvIHRoZSBsYXN0IGNsaWVudCBjb21tYW5kLCBhIDMtZGlnaXQgZGVjaW1hbCBudW1iZXIKKyAgICAgICAgICBkZWZpbmVkIGluIFszNDZdUkZDOTU5LiBCcmllZmx5OgorCisgICAgICAgICAgMXh4ID0gUG9zaXRpdmUgUHJlbGltaW5hcnkgUmVwbHkKKyAgICAgICAgICAyeHggPSBQb3NpdGl2ZSBDb21wbGV0aW9uIFJlcGx5CisgICAgICAgICAgM3h4ID0gUG9zaXRpdmUgSW50ZXJtZWRpYXRlIFJlcGx5CisgICAgICAgICAgNHh4ID0gVHJhbnNpZW50IE5lZ2F0aXZlIENvbXBsZXRpb24gUmVwbHkKKyAgICAgICAgICA1eHggPSBQZXJtYW5lbnQgTmVnYXRpdmUgQ29tcGxldGlvbiBSZXBseQorCisgICBcdihmdHBfbWVzc2FnZSkKKyAgICAgICAgICBUaGUgdGV4dCBtZXNzYWdlLCBpZiBhbnksIGZyb20gdGhlIHNlcnZlcidzIHJlc3BvbnNlIHRvIHRoZQorICAgICAgICAgIGxhc3QgY2xpZW50IGNvbW1hbmQuIElmIHRoZSBtb3N0IHJlY2VudCByZXNwb25zZSBoYWQgbXVsdGlwbGUKKyAgICAgICAgICBsaW5lcywgdGhpcyB2YXJpYWJsZSBoYXMgb25seSB0aGUgZmluYWwgbGluZS4gVGhlc2UgbWVzc2FnZXMKKyAgICAgICAgICBhcmUgbm90IHN0YW5kYXJkaXplZCBhbmQgdmFyeSBpbiBmb3JtYXQgYW5kIGNvbnRlbnQgZnJvbSBzZXJ2ZXIKKyAgICAgICAgICB0byBzZXJ2ZXIuIFN5bm9ueW06IFx2KGZ0cF9tc2cpLgorCisgICBGVFAgZmlsZSB0cmFuc2ZlcnMgc2V0IHRoZSByZWd1bGFyIEtlcm1pdCB0cmFuc2ZlciBzdGF0dXMgdmFyaWFibGVzOgorCisgIFx2KGNwcykgICAgICAgICBDaGFyYWN0ZXJzIHBlciBzZWNvbmQgb2YgbW9zdCByZWNlbnQgdHJhbnNmZXIuCisgIFx2KGZpbGVzcGVjKSAgICBGaWxlIHNwZWNpZmljYXRpb24gdXNlZCBpbiBtb3N0IHJlY2VudCB0cmFuc2Zlci4KKyAgXHYoZnNpemUpICAgICAgIFNpemUgb2YgZmlsZSBtb3N0IHJlY2VudGx5IHRyYW5zZmVycmVkLgorICBcdih0ZnNpemUpICAgICAgVG90YWwgc2l6ZSBvZiBmaWxlIGdyb3VwIG1vc3QgcmVjZW50bHkgdHJhbnNmZXJyZWQuCisgIFx2KHhmZXJzdGF0dXMpICBTdGF0dXMgb2YgbW9zdCByZWNlbnQgdHJhbnNmZXIgKDAgPSBzdWNjZXNzLCAxID0gZmFpbHVyZSkuCisgIFx2KHRmdGltZSkgICAgICBFbGFwc2VkIHRpbWUgb2YgbW9zdCByZWNlbnQgdHJhbnNmZXIsIGluIHNlY29uZHMuCisKKyAgIER1cmluZyBhbiBGVFAgdHJhbnNmZXIsIHRoZSBwZXItZmlsZSB2YXJpYWJsZXMgYXJlOgorCisgIFx2KGZpbGVuYW1lKSAgICBOYW1lIG9mIGN1cnJlbnQgZmlsZS4KKyAgXHYoZmlsZW51bWJlcikgIE9yZGluYWwgZmlsZSBudW1iZXIgaW4gZ3JvdXAgKDEsIDIsIDMsIC4uLikKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDMuMTAuMi4gRXhhbXBsZXMKKworICAgTGV0J3MgYmVnaW4gd2l0aCBhIHNpbXBsZSBleGFtcGxlIHNob3dpbmcgaG93IHRvIGxvZyBpbiwgc2VuZCBzb21lCisgICBmaWxlcywgYW5kIGxvZyBvdXQ6CisKKyAgZGVmaW5lIGVycm9yIGlmIGZhaWwgeyBmdHAgYnllLCBzdG9wIDEgRXJyb3I6IFwlMSB9CisgIHNldCB0cmFuc2FjdCBicmllZgorICBsb2cgdAorICBmdHAgZnRwLnh5emNvcnAuY29tIC9hbm9ueW1vdXMKKyAgaWYgZmFpbCBzdG9wIDEgQ29ubmVjdGlvbiBmYWlsZWQKKyAgaWYgbm90IFx2KGZ0cF9sb2dnZWRpbikgc3RvcCAxIExvZ2luIGZhaWxlZAorICBmdHAgY2QgaW5jb21pbmcKKyAgZXJyb3Ige2Z0cCBjZH0KKyAgY2QgdXBsb2FkCisgIGVycm9yIHtsb2NhbCBjZH0KKyAgZnRwIHB1dCAvZGVsZXRlICoKKyAgZXJyb3Ige3B1dH0KKyAgZnRwIGJ5ZQorCisgICBGaXJzdCB3ZSBkZWZpbmUgYW4gZXJyb3IgaGFuZGxpbmcgbWFjcm8gdG8gYmUgdXNlZCBhZnRlciB0aGUKKyAgIGNvbm5lY3Rpb24gaXMgbWFkZS4gVGhlbiB3ZSBzZXQgdXAgYSBicmllZi1mb3JtYXQgdHJhbnNhY3Rpb24gbG9nIHRvCisgICBrZWVwIGEgcmVjb3JkIG9mIG91ciBmaWxlIHRyYW5zZmVycy4gVGhlbiB3ZSBtYWtlIGEgY29ubmVjdGlvbiB0byB0aGUKKyAgIGhvc3QgYW5kIGxvZyBpbiBhbm9ueW1vdXNseS4gVGhlICJpZiBmYWlsIiBjb21tYW5kIGNoZWNrcyB3aGV0aGVyIHRoZQorICAgY29ubmVjdGlvbiB3YXMgbWFkZS4gVGhlICJpZiBub3QiIGNvbW1hbmQgY2hlY2tzIHdoZXRoZXIgbG9naW4gd2FzCisgICBzdWNjZXNzZnVsLiBPYnZpb3VzbHkgdGhlIHNjcmlwdCBzaG91bGQgbm90IGNvbnRpbnVlIHVubGVzcyBib3RoIHRlc3RzCisgICBzdWNjZWVkLgorCisgICBOZXh0IHdlIGNoYW5nZSB0byB0aGUgc2VydmVyJ3MgJ2luY29taW5nJyBkaXJlY3RvcnkgYW5kIHRvIG91ciBvd24KKyAgICd1cGxvYWQnIGRpcmVjdG9yeSwgYW5kIHNlbmQgYWxsIHRoZSBmaWxlcyB0aGF0IGFyZSBpbiBpdCAodGhleSBjYW4gYmUKKyAgIGFueSBtaXh0dXJlIG9mIHRleHQgYW5kIGJpbmFyeSBmaWxlcyksIGRlbGV0aW5nIGVhY2ggc291cmNlIGZpbGUKKyAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgaXQgaXMgc3VjY2Vzc2Z1bGx5IHVwbG9hZGVkLiBFYWNoIG9mIHRoZXNlCisgICBvcGVyYXRpb25zIGlzIGNoZWNrZWQgd2l0aCB0aGUgRVJST1IgbWFjcm8sIHdoaWNoIHByZXZlbnRzIHRoZSBzY3JpcHQKKyAgIGZyb20gY29udGludWluZyBwYXN0IGEgZmFpbHVyZS4KKworICAgRmluYWxseSB3ZSBjbG9zZSB0aGUgRlRQIHNlc3Npb24gd2l0aCB0aGUgImJ5ZSIgY29tbWFuZC4KKworICAgSnVzdCBsaWtlIGFueSBvdGhlciBLZXJtaXQgc2NyaXB0LCB0aGlzIG9uZSBjYW4gYmUgdXNlZCBpbiBtYW55IHdheXM6CisKKyAgICAgKiBJdCBjYW4gYmUgc3RvcmVkIGluIGEgZmlsZSwgYW5kIEtlcm1pdCBjYW4gYmUgdG9sZCB0byBUQUtFIHRoZQorICAgICAgIGZpbGUuCisgICAgICogSW4gVU5JWCwgaXQgY2FuIGJlIGEgIlszNDdda2VyYmFuZyIgc2NyaXB0IGFuZCB0aGVyZWZvcmUgcnVuCisgICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgc2hlbGwgcHJvbXB0IG9yIGFzIGEgY3JvbiBqb2IuCisKKyAgIFdlIGNvdWxkIGhhdmUgdXNlZCBjb21tYW5kIHNob3J0Y3V0cyBsaWtlICJyY2QiLCAicHV0IiwgYW5kICJieWUiLCBidXQKKyAgIHNpbmNlIHRoZXkgY2FuIGJlIGFtYmlndW91cyB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIGl0IGlzIGJldHRlcgorICAgdG8gYXZvaWQgdGhlbSBpbiBzY3JpcHRzOyB0aGV5IGFyZSBpbnRlbmRlZCBtYWlubHkgZm9yIGNvbnZlbmllbmNlCisgICBkdXJpbmcgaW50ZXJhY3RpdmUgdXNlLiBIb3dldmVyLCBpZiB5b3Ugd2lzaCB0byB1c2UgdGhlIHNob3J0Y3V0cyBpbiBhCisgICBzY3JpcHQsIHlvdSBjYW4gZG8gaXQgdGhpcyB3YXkgKGVycm9yIGhhbmRsaW5nIG9taXR0ZWQgZm9yIGJyZXZpdHkpOgorCisgIGxvY2FsIFwldCAgICAgICAgICAgICAgICAgICAgICAgOyBEZWNsYXJlIGEgbG9jYWwgdGVtcG9yYXJ5IHZlcmlhYmxlCisgIGFzc2lnbiBcJXQgXHYoZnRwX2dldHB1dHJlbW90ZSkgOyBTYXZlIGN1cnJlbnQgRlRQIEdFVC1QVVQtUkVNT1RFIHNldHRpbmcKKyAgc2V0IGZ0cCBnZXQtcHV0LXJlbW90ZSBmdHAgICAgICA7IENob29zZSBGVFAgb3JpZW50YXRpb24KKyAgZnRwIHh5emNvcnAuY29tIC9hbm9ueW1vdXMgICAgICA7IE9wZW4gYW4gRlRQIGNvbm5lY3Rpb24KKyAgZ2V0IG9vZmEudHh0ICAgICAgICAgICAgICAgICAgICA7IEdFVCBhIGZpbGUKKyAgcHV0IGZvby5iYXIgICAgICAgICAgICAgICAgICAgICA7IFBVVCBhIGZpbGUKKyAgcmRlbCB5ZXN0ZXJkYXkubG9nICAgICAgICAgICAgICA7IERlbGV0ZSBhIGZpbGUgb24gdGhlIHNlcnZlcgorICBieWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTG9nIG91dCBhbmQgZGlzY29ubmVjdCBmcm9tIHNlcnZlci4KKyAgc2V0IGZ0cCBnZXQtcHV0LXJlbW90ZSBcJXQgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgR0VULVBVVC1SRU1PVEUgc2V0dGluZworCisgICBPZiBjb3Vyc2UsIEZUUCBzY3JpcHRzIGNhbiBhbHNvIGJlIHdyaXR0ZW4gYXMgbWFjcm9zLiBUaGlzIGxldHMgeW91CisgICBwYXNzIHBhcmFtZXRlcnMgc3VjaCBhcyBob3N0bmFtZXMsIHVzZXJuYW1lcywgYW5kIGZpbGVuYW1lcyB0byB0aGVtOgorCisgIGRlZmluZSBkb2Z0cGdldCB7CisgICAgICBpZiA8IFx2KGFyZ2MpIDQgZW5kIDEgVXNhZ2U6IFwlMCBob3N0IHVzZXIgcmVtb3RlZmlsZSBbIGxvY2FsZmlsZSBdCisgICAgICBmdHAgXCUxIC91c2VyOlwlMgorICAgICAgaWYgZmFpbCBlbmQgMSBGVFAgT1BFTiBcJTEgZmFpbGVkCisgICAgICBpZiBub3QgXHYoZnRwX2xvZ2dlZGluKSBlbmQgMSBGVFAgTE9HSU4gZmFpbGVkCisgICAgICBmdHAgZ2V0IHtcJTN9IHtcJTR9CisgICAgICBpZiBmYWlsIGVuZCAxIEZUUCBHRVQgXCUzIGZhaWxlZAorICAgICAgZnRwIGJ5ZQorICB9CisKKyAgIEFkZCB0aGlzIGRlZmluaXRpb24gdG8geW91ciBLZXJtaXQgY3VzdG9taXphdGlvbiBmaWxlLCBhbmQgaXQgd2lsbAorICAgYWx3YXlzIGJlIGF2YWlsYWJsZSB3aGVuIHlvdSBzdGFydCBLZXJtaXQuIFRoaXMgbWFjcm8gbGV0cyB5b3UKKyAgIGRvd25sb2FkIGEgZmlsZSB3aXRoIEZUUCBieSBnaXZpbmcgYSBzaW5nbGUgY29tbWFuZCwgZS5nLjoKKworICBkb2Z0cGdldCB4eXpjb3JwLmNvbSBhbm9ueW1vdXMgb29mYS50eHQKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDMuMTAuMy4gQXV0b21hdGluZyBTZWN1cmUgRlRQIFNlc3Npb25zCisKKyAgIE9mdGVuIHdoZW4gbWFraW5nIHNlY3VyZSBjb25uZWN0aW9ucywgeW91IGFyZSBwcm9tcHRlZCBpbnRlcmFjdGl2ZWx5CisgICBmb3IgY2VydGFpbiBpbmZvcm1hdGlvbiBvciBwZXJtaXNzaW9uIHRvIHByb2NlZWQuIFRoZXNlIHByb21wdHMgY2FuCisgICBzdG9wIGFuIGF1dG9tYXRlZCBwcm9jZWR1cmUuIFRvIGF2b2lkIHRoZW0sIHlvdSBtdXN0IGdpdmUgdGhlCisgICBhcHByb3ByaWF0ZSBjb21tYW5kcyB0byBkaXNhYmxlIHRoZW0sIGFuZC9vciBzdXBwbHkgdGhlIHByb21wdGVkLWZvcgorICAgaW5mb3JtYXRpb24gYmVmb3JlaGFuZC4gSGVyZSBhcmUgYSBmZXcgaGludHM6CisKKyAgICAgKiBNYWtlIHN1cmUgdGhhdCBTRVQgVEFLRSBFUlJPUiBhbmQgU0VUIE1BQ1JPIEVSUk9SIGFyZSBib3RoIE9GRi4KKyAgICAgICBUaGlzIGlzIHRoZSBkZWZhdWx0LCBidXQgaW4gY2FzZSB5b3UgaGF2ZSBzZXQgZWl0aGVyIG9uZSBvZiB0aGVzZQorICAgICAgIE9OIGluIHlvdXIgc2NyaXB0IG9yIGluaXRpYWxpemF0aW9uIGZpbGUsIHRoaXMgbWFrZXMgdGhlIHNjcmlwdAorICAgICAgIGhhbHQgb24gYW55IGtpbmQgb2YgZXJyb3IuIE5vcm1hbGx5IHlvdSB3b3VsZCB3YW50IHRvIGNoZWNrIGVhY2gKKyAgICAgICBvcGVyYXRpb24gZm9yIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhbmQgdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24uCisgICAgICogT24gU1NMIGFuZCBUTFMgY29ubmVjdGlvbnMsIHlvdSBtYXkgYmUgYXNrZWQgd2hldGhlciBpdCBpcyBPSyB0bworICAgICAgIHByb2NlZWQgd2l0aCBhIGNvbm5lY3Rpb24gdG8gc2VydmVyIHRoYXQgcHJlc2VudHMgYSBzZWxmLXNpZ25lZAorICAgICAgIGNlcnRpZmljYXRlLiBZb3UgY2FuIHVzZSB0aGUgU0VUIEFVVEhFTlRJQ0FUSU9OIFNTTCAob3IgVExTKQorICAgICAgIFZFUklGWSBvciBTRVQgQVVUSCBTU0wgKG9yIFRMUykgQ0VSVFMtT0sgY29tbWFuZHMgdG8gYXZvaWQgdGhpcworICAgICAgIHByb21wdCBieSBub3QgcmVxdWVzdGluZyBhIGNlcnRpZmljYXRlIGZyb20gdGhlIHBlZXIuCisgICAgICogKE1vcmUgdG8gYmUgYWRkZWQuLi4pCisKKyAgIFsgWzM0OF1Ub3AgXSBbIFszNDldRlRQIFRvcCBdIFsgWzM1MF1GVFAgU2NyaXB0IFR1dG9yaWFsIF0gWworICAgWzM1MV1DLUtlcm1pdCBIb21lIF0gWyBbMzUyXUtlcm1pdCBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjExLiBBZHZhbmNlZCBGVFAgUHJvdG9jb2wgRmVhdHVyZXMKKworICAgVGhlIHJlbWFpbmRlciBvZiB0aGUgRlRQIGRvY3VtZW50aW9uICh0aHJvdWdoIHRoZSBlbmQgb2YgU2VjdGlvbiAzKSBpcworICAgbmV3IHRvIEMtS2VybWl0IDguMC4yMDYsIGJ1dCB3ZSBsZWF2ZSBpdCBpbiBibGFjayB0byBwcmV2ZW50CisgICBoZWFkYWNoZXMuIEV4Y2VwdCBmb3IgdGl0bGVzLgorICAgICAqIFszNTNdVEVSTUlOT0xPR1kKKyAgICAgKiBbMzU0XUZFQVRVUkUgTkVHT1RJQVRJT04KKyAgICAgKiBbMzU1XVVTSU5HIE1HRVQ6IE5MU1QgVkVSU1VTIE1MU0QKKyAgICAgKiBbMzU2XUVYQU1QTEVTCisgICAgICogWzM1N11SRUZFUkVOQ0VTCisKKyAgIFRoZSBuZXcgcmVsZWFzZXMgb2YgWzM1OF1DLUtlcm1pdCAoOC4wLjIwNikgYW5kIFszNTldS2VybWl0IDk1ICgyLjEpCisgICBzdXBwb3J0IG5ldyBGVFAgcHJvdG9jb2wgZmVhdHVyZXMgZnJvbSBSRkMgMjM4OSBhcyB3ZWxsIGFzIG1vc3Qgb2YKKyAgIHdoYXQncyBpbiB0aGUgRWx6IGFuZCBIZXRobW9uIEV4dGVuc2lvbnMgdG8gRlRQIEludGVybmV0IERyYWZ0IChzZWUKKyAgIFszNjBdUmVmZXJlbmNlcykuIFNvbWUgb2YgdGhlc2UgZmVhdHVyZXMsIHN1Y2ggYXMgU0laRSAocmVxdWVzdCBhCisgICBmaWxlJ3Mgc2l6ZSksIE1EVE0gKHJlcXVlc3QgZmlsZSdzIG1vZGlmaWNhdGlvbiB0aW1lKSwgYW5kIFJFU1QKKyAgIChyZXN0YXJ0IGludGVycnVwdGVkIHRyYW5zZmVyKSBoYXZlIGJlZW4gd2lkZWx5IGltcGxlbWVudGVkIGluIEZUUAorICAgY2xpZW50cyBhbmQgc2VydmVycyBmb3IgeWVhcnMgKGFzIHdlbGwgYXMgaW4gdGhlIGluaXRpYWwgcmVsZWFzZSBvZgorICAgdGhlIEtlcm1pdCBGVFAgY2xpZW50cykuIE90aGVycyBzdWNoIGFzIEZFQVQgYW5kIE1MU0QgYXJlIHJhcmVseSBzZWVuCisgICBhbmQgYXJlIG5ldyB0byB0aGUgdXBjb21pbmcgS2VybWl0IHJlbGVhc2VzLiBUVkZTIChUcml2aWFsIFZpcnR1YWwKKyAgIEZpbGUgU3RvcmUpIGlzIHN1cHBvcnRlZCBpbXBsaWNpdGx5LCBhbmQgdGhlIFVURi04IGNoYXJhY3Rlci1zZXQgaXMKKyAgIGFscmVhZHkgZnVsbHkgc3VwcG9ydGVkIGF0IHRoZSBwcm90b2NvbCBhbmQgZGF0YS1pbnRlcmNoYW5nZSBsZXZlbC4KKworICAgRm9yIEtlcm1pdCB1c2VycywgdGhlIG1haW4gYmVuZWZpdCBvZiB0aGUgbmV3IEZUUCBwcm90b2NvbCBleHRlbnNpb25zCisgICBpcyB0aGUgYWJpbGl0eSB0byBkbyByZWN1cnNpdmUgZG93bmxvYWRzLiBCdXQgdGhlIGV4dGVuc2lvbnMgYWxzbworICAgaW50cm9kdWNlIGNvbXBsaWNhdGlvbnMgYW5kIHRyYWRlb2ZmcyB0aGF0IHlvdSBzaG91bGQgYmUgYXdhcmUgb2YuIE9mCisgICBjb3Vyc2UgS2VybWl0IHRyaWVzIHRvICJkbyB0aGUgcmlnaHQgdGhpbmciIGF1dG9tYXRpY2FsbHkgaW4gZXZlcnkKKyAgIGNhc2UgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBCdXQgKGFzIG5vdGVkIGxhdGVyKSBzb21lIGNhc2VzIGFyZQorICAgaW5oZXJlbnRseSBhbWJpZ3VvdXMgYW5kL29yIGNhbiByZXN1bHQgaW4gbmFzdHkgc3VycHJpc2VzLCBhbmQgZm9yCisgICB0aG9zZSBzaXR1YXRpb25zIG5ldyBjb21tYW5kcyBhbmQgc3dpdGNoZXMgYXJlIGF2YWlsYWJsZSB0byBnaXZlIHlvdQorICAgcHJlY2lzZSBjb250cm9sIG92ZXIgS2VybWl0J3MgYmVoYXZpb3IsIGluIGNhc2UgdGhlIGRlZmF1bHRzIGRvbid0CisgICBwcm9kdWNlIHRoZSBkZXNpcmVkIHJlc3VsdHMuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgIDMuMTEuMS4gVGVybWlub2xvZ3kgQ29tbWFuZC1saW5lIEZUUCBjbGllbnRzIHN1Y2ggYXMgS2VybWl0IChhcyB3ZWxsCisgICBhcyB0aGUgdHJhZGl0aW9uYWwgRlRQIHByb2dyYW1zIGZvdW5kIG9uIFVuaXgsIFZNUywgLi4uLCBldmVuIFdpbmRvd3MpCisgICBoYXZlIGNvbW1hbmRzIGxpa2UgUFVULCBNUFVULCBHRVQsIE1HRVQsIGFuZCBCWUUsIHdoaWNoIHRoZXkgY29udmVydAorICAgaW50byB6ZXJvIG9yIG1vcmUgRlRQIHByb3RvY29sIGNvbW1hbmRzLCBzdWNoIGFzIE5MU1QsIFJFVFIsIFFVSVQuIEZvcgorICAgY2xhcml0eSwgd2UnbGwgdXNlICJjb21tYW5kIiB0byByZWZlciB0byBjb21tYW5kcyBnaXZlbiBieSB0aGUgdXNlciB0bworICAgdGhlIEZUUCBjbGllbnQsIGFuZCAiZGlyZWN0aXZlIiBmb3IgRlRQIHByb3RvY29sIGNvbW1hbmRzIHNlbnQgYnkgdGhlCisgICBGVFAgY2xpZW50IHRvIHRoZSBGVFAgc2VydmVyLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAzLjExLjIuIEZlYXR1cmUgTmVnb3RpYXRpb24gTmV3IEZUUCBwcm90b2NvbCBmZWF0dXJlcyBhcmUgbmVnb3RpYXRlZAorICAgYnkgdGhlIGNsaWVudCBzZW5kaW5nIGEgRkVBVCBkaXJlY3RpdmUgYW5kIHRoZSBzZXJ2ZXIgcmVzcG9uZGluZyB3aXRoCisgICBhIGxpc3Qgb2YgKG5ldykgZmVhdHVyZXMgaXQgc3VwcG9ydHMsIG9yIGVsc2Ugd2l0aCBhbiBlcnJvciBpbmRpY2F0aW9uCisgICBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBGRUFUIGRpcmVjdGl2ZSBhdCBhbGwsIGluIHdoaWNoIGNhc2UgdGhlCisgICBjbGllbnQgaGFzIHRvIGd1ZXNzIHdoaWNoIG5ldyBmZWF0dXJlcyBpdCBzdXBwb3J0cyAoS2VybWl0IGd1ZXNzZXMKKyAgIHRoYXQgaXQgc3VwcG9ydHMgU0laRSBhbmQgTURUTSBidXQgbm90IE1MU1QpLiBOb3RlIHRoYXQgdGhlIE1MU1QKKyAgIGZlYXR1cmUgaW5jbHVkZXMgTUxTRCwgd2hpY2ggaXMgbm90IGxpc3RlZCBzZXBhcmF0ZWx5IGFzIGEgZmVhdHVyZS4KKworICAgR3Vlc3NpbmcgaXMgbmljZSB3aGVuIGl0IHdvcmtzLCBidXQgc29tZXRpbWVzIGl0IGRvZXNuJ3QsIGFuZCBzb21lIEZUUAorICAgc2VydmVycyBiZWNvbWUgY29uZnVzZWQgd2hlbiB5b3Ugc2VuZCB0aGVtIGEgZGlyZWN0aXZlIHRoZXkgZG9uJ3QKKyAgIHVuZGVyc3RhbmQsIG9yIHRoZXkgZG8gc29tZXRoaW5nIHlvdSBkaWRuJ3Qgd2FudCwgc29tZXRpbWVzIHRvIHRoZQorICAgcG9pbnQgb2YgY2xvc2luZyB0aGUgY29ubmVjdGlvbi4gRm9yIHRoaXMgcmVhc29uLCBLZXJtaXQgbGV0cyB5b3UKKyAgIG92ZXJyaWRlIGRlZmF1bHQgb3IgbmVnb3RpYXRlZCBmZWF0dXJlcyB3aXRoIHRoZSBmb2xsb3dpbmcgbmV3CisgICBjb21tYW5kczoKKworICAgRlRQIHsgRU5BQkxFLCBESVNBQkxFIH0gRkVBVAorICAgICAgICAgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGF1dG9tYXRpYyBzZW5kaW5nIG9mIGEgRkVBVCBkaXJlY3RpdmUKKyAgICAgICAgICB1cG9uIGNvbm5lY3Rpb24gdG8gYW4gRlRQIHNlcnZlci4gTm90ZSB0aGF0CisgICAgICAgICAgRlRQIFsgT1BFTiBdIC9OT0lOSVQgICBhbHNvIGluaGliaXRzIHNlbmRpbmcgdGhlIEZFQVQgZGlyZWN0aXZlCisgICAgICAgICAgKGFuZCBzZXZlcmFsIG90aGVycykgZm9yIHRoZSBjb25uZWN0aW9uIGJlaW5nIE9QRU4nZCwgYnV0CisgICAgICAgICAgd2l0aG91dCBuZWNlc3NhcmlseSBkaXNhYmxpbmcgRkVBVCBmb3Igc3Vic2VxdWVudCBjb25uZWN0aW9ucworICAgICAgICAgIGluIHRoZSBzYW1lIEtlcm1pdCBpbnN0YW5jZS4gRkVBVCBpcyBFTkFCTEVEIGJ5IGRlZmF1bHQsIGluCisgICAgICAgICAgd2hpY2ggY2FzZSBtYW55IEZUUCBzZXJ2ZXJzIGFyZSBsaWtlbHkgdG8gcmVwbHk6CisKKzUwMCAnRkVBVCc6IGNvbW1hbmQgbm90IHVuZGVyc3Rvb2QKKworICAgICAgICAgIHdoaWNoIGlzIG5vcm1hbGx5IGhhcm1sZXNzIChidXQgeW91IG5ldmVyIGtub3cpLiAoSW4gQy1LZXJtaXQKKyAgICAgICAgICA4LjAuMjA4LCB0aGlzIGVycm9yIG1lc3NhZ2UgaXMgc3VwcHJlc3NlZCB1bmxlc3MgeW91IFNFVCBGVFAKKyAgICAgICAgICBERUJVRyBPTi4pCisKKyAgIEZUUCBFTkFCTEUgeyBNRFRNLCBNTFNULCBTSVpFIH0KKyAgICAgICAgICBFbmFibGVzIHRoZSBnaXZlbiBkaXJlY3RpdmUgZm9yIGltcGxpY2l0IHVzZSBieSB0aGUgRlRQIEdFVCBhbmQKKyAgICAgICAgICBNR0VUIGNvbW1hbmRzIGluIGNhc2UgaXQgaGFzIGJlZW4gZGlzYWJsZWQgb3IgZXJyb25lb3VzbHkKKyAgICAgICAgICBvbWl0dGVkIGJ5IHRoZSBzZXJ2ZXIgaW4gaXRzIEZFQVQgcmVzcG9uc2UuIE5vdGU6IE1MU0QgY2FuIGJlCisgICAgICAgICAgdXNlZCBpbiB0aGUgRlRQIEVOQUJMRSBhbmQgRElTQUJMRSBjb21tYW5kcyBhcyBhIHN5bm9ueW0gZm9yCisgICAgICAgICAgTUxTVC4gWU9VIE1VU1QgR0lWRSBUSElTIENPTU1BTkQgQUZURVIgTUFLSU5HIFRIRSBGVFAKKyAgICAgICAgICBDT05ORUNUSU9OLgorCisgICBGVFAgRElTQUJMRSB7IE1EVE0sIE1MU1QsIFNJWkUgfQorICAgICAgICAgIERpc2FibGVzIGltcGxpY2l0IHVzZSBvZiB0aGUgZ2l2ZW4gZGlyZWN0aXZlIGJ5IEdFVCBvciBNR0VUIGluCisgICAgICAgICAgY2FzZSBpdCBjYXVzZXMgcHJvYmxlbXM7IGZvciBleGFtcGxlLCBiZWNhdXNlIGl0IG1ha2VzCisgICAgICAgICAgbXVsdGlmaWxlIGRvd25sb2FkcyB0YWtlIHRvbyBsb25nIG9yIHRoZSBzZXJ2ZXIgYW5ub3VuY2VzIGl0CisgICAgICAgICAgZXJyb25lb3VzbHkgb3IgbWlzaW1wbGVtZW50cyBpdC4gVXNlIERJU0FCTEUgRkVBVCBiZWZvcmUgbWFraW5nCisgICAgICAgICAgYSBjb25uZWN0aW9uIHRvIHByZXZlbnQgS2VybWl0IGZyb20gc2VuZGluZyB0aGUgRkVBVCBkaXJlY3RpdmUKKyAgICAgICAgICBhcyBwYXJ0IG9mIGl0cyBpbml0aWFsIHNlcXVlbmNlLiBOb3RlIHRoYXQgZGlzYWJsaW5nIEZFQVQsCisgICAgICAgICAgU0laRSwgb3IgTURUTSBkb2VzIG5vdCBwcmV2ZW50IHlvdSBmcm9tIGV4ZWN1dGluZyBleHBsaWNpdCBGVFAKKyAgICAgICAgICBGRUFUVVJFUywgRlRQIFNJWkUsIG9yIEZUUCBNT0RUSU1FIGNvbW1hbmRzLiBBbHNvIG5vdGUgdGhhdAorICAgICAgICAgIGRpc2FibGluZyBTSVpFIHByZXZlbnRzIFBVVCAvUkVTVEFSVCAocmVjb3Zlcnkgb2YgaW50ZXJydXB0ZWQKKyAgICAgICAgICB1cGxvYWRzKSBmcm9tIHdvcmtpbmcuIFlPVSBNVVNUIEdJVkUgVEhJUyBDT01NQU5EIEFGVEVSIE1BS0lORworICAgICAgICAgIFRIRSBGVFAgQ09OTkVDVElPTi4KKworICAgVG8gZW5hYmxlIG9yIGRpc2FibGUgbW9yZSB0aGFuIG9uZSBmZWF0dXJlLCB1c2UgbXVsdGlwbGUgRlRQIEVOQUJMRSBvcgorICAgRlRQIERJU0FCTEUgY29tbWFuZHMuIFRoZSBTSE9XIEZUUCBjb21tYW5kIHNob3dzIHdoaWNoIGZlYXR1cmVzIGFyZQorICAgY3VycmVudGx5IGVuYWJsZWQgYW5kIGRpc2FibGVkLgorCisgICBGVFAgRkVBVFVSRVMKKyAgICAgICAgICBUaGlzIGNvbW1hbmQgc2VuZHMgYSBGRUFUIGRpcmVjdGl2ZSB0byB0aGUgc2VydmVyLiBJbiBjYXNlIHlvdQorICAgICAgICAgIGhhdmUgYmVlbiBkaXNhYmxpbmcgYW5kIGVuYWJsaW5nIGRpZmZlcmVudCBmZWF0dXJlcywgdGhpcworICAgICAgICAgIHJlc3luY2hyb25pemVzIEtlcm1pdCdzIGZlYXR1cmUgbGlzdCB3aXRoIHRoZSBzZXJ2ZXIncy4gSWYgdGhlCisgICAgICAgICAgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIEZFQVQgZGlyZWN0aXZlLCBLZXJtaXQncyBmZWF0dXJlCisgICAgICAgICAgbGlzdCBpcyBub3QgY2hhbmdlZC4KKworICAgRlRQIE9QVElPTlMgZGlyZWN0aXZlCisgICAgICAgICAgSW5mb3JtYXRpb25hbCBvbmx5OiB0aGUgc2VydmVyIHRlbGxzIHdoYXQgb3B0aW9ucywgaWYgYW55LCBpdAorICAgICAgICAgIHN1cHBvcnRzIGZvciB0aGUgZ2l2ZW4gZGlyZWN0aXZlLCBlLmcuIE1MU1QuIEZhaWxzIGlmIHRoZQorICAgICAgICAgIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBPUFRTIGRpcmVjdGl2ZSBvciBpZiB0aGUgZGlyZWN0aXZlCisgICAgICAgICAgZm9yIHdoaWNoIG9wdGlvbnMgYXJlIHJlcXVlc3RlZCBpcyBub3QgdmFsaWQuIFRoZSBkaXJlY3RpdmUgaXMKKyAgICAgICAgICBjYXNlLWluc2Vuc2l0aXZlLgorCisgICBGVFAgU0laRSBmaWxlbmFtZQorICAgICAgICAgIFNlbmRzIGEgU0laRSBkaXJlY3RpdmUgdG8gdGhlIHNlcnZlciBmb3IgdGhlIGdpdmVuIGZpbGUuIFRoZQorICAgICAgICAgIGZpbGVuYW1lIG11c3Qgbm90IGNvbnRhaW4gd2lsZGNhcmRzLiBUaGUgc2VydmVyIHJlc3BvbmRzIHdpdGgKKyAgICAgICAgICBhbiBlcnJvciBpZiB0aGUgZmlsZSBjYW4ndCBiZSBmb3VuZCwgaXMgbm90IGFjY2Vzc2libGUsIG9yIHRoZQorICAgICAgICAgIFNJWkUgZGlyZWN0aXZlIGlzIG5vdCBzdXBwb3J0ZWQsIG90aGVyd2lzZSB3aXRoIHRoZSBsZW5ndGggb2YKKyAgICAgICAgICB0aGUgZmlsZSBpbiBieXRlcywgd2hpY2ggS2VybWl0IGRpc3BsYXlzIGFuZCBhbHNvIG1ha2VzCisgICAgICAgICAgYXZhaWxhYmxlIHRvIHlvdSBpbiBpdHMgXHYoZnRwX21lc3NhZ2UpIHZhcmlhYmxlLiBJZiB0aGUKKyAgICAgICAgICBkaXJlY3RpdmUgaXMgc3VjY2Vzc2Z1bCwgS2VybWl0IChyZS0pZW5hYmxlcyBpdCBmb3IgaW50ZXJuYWwKKyAgICAgICAgICB1c2UgYnkgdGhlIEdFVCBhbmQgTUdFVCBkaXJlY3RpdmVzIG9uIHRoaXMgY29ubmVjdGlvbi4KKworICAgRlRQIE1PRFRJTUUgZmlsZW5hbWUKKyAgICAgICAgICBXb3JrcyBqdXN0IGxpa2UgdGhlIFNJWkUgZGlyZWN0aXZlIGV4Y2VwdCBpdCBzZW5kcyBhbiBNRFRNCisgICAgICAgICAgZGlyZWN0aXZlLiBVcG9uIHN1Y2Nlc3MsIHRoZSBzZXJ2ZXIgc2VuZHMgbW9kaWZpY2F0aW9uCisgICAgICAgICAgZGF0ZS10aW1lIHN0cmluZywgd2hpY2ggS2VybWl0IGludGVycHJldHMgZm9yIHlvdSBhbmQgYWxzbworICAgICAgICAgIG1ha2VzIGF2YWlsYWJsZSBpbiBpdHMgXHYoZnRwX21lc3NhZ2UpIHZhcmlhYmxlLgorCisgICBXaGVuZXZlciBhIFNJWkUgb3IgTURUTSBkaXJlY3RpdmUgaXMgc2VudCBpbXBsaWNpdGx5IGFuZCByZWplY3RlZCBieQorICAgdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIHVua25vd24sIEtlcm1pdCBhdXRvbWF0aWNhbGx5IGRpc2FibGVzIGl0LgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAzLjExLjMuIFVzaW5nIE1HRVQ6IE5MU1QgdmVyc3VzIE1MU0QgV2hlbiB5b3UgZ2l2ZSBhbiBNR0VUIGNvbW1hbmQgdG8KKyAgIGFuIEZUUCBjbGllbnQsIGl0IHNlbmRzIGEgcmVxdWVzdCB0byB0aGUgRlRQIHNlcnZlciBmb3IgYSBsaXN0IG9mCisgICBmaWxlcywgYW5kIHRoZW4gdXBvbiBzdWNjZXNzZnVsIHJlY2VpcHQgb2YgdGhlIGxpc3QsIGdvZXMgdGhyb3VnaCBpdAorICAgYW5kIGlzc3VlcyBhIFJFVFIgKHJldHJpZXZlKSBkaXJlY3RpdmUgZm9yIGVhY2ggZmlsZSBvbiB0aGUgbGlzdCAob3IKKyAgIHBvc3NpYmx5IG9ubHkgZm9yIHNlbGVjdGVkIGZpbGVzKS4KKworICAgV2l0aCB0aGUgbmV3IEZUUCBwcm90b2NvbCBleHRlbnNpb25zLCBub3cgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGdldAorICAgdGhlIGxpc3Qgb2YgZmlsZXM6IHRoZSBOTFNUIGRpcmVjdGl2ZSwgd2hpY2ggaGFzIGJlZW4gcGFydCBvZiBGVFAKKyAgIHByb3RvY29sIHNpbmNlIHRoZSBiZWdpbm5pbmcsIGFuZCB0aGUgbmV3IE1MU0QgZGlyZWN0aXZlLCB3aGljaCBpcyBuZXcKKyAgIGFuZCBub3QgeWV0IHdpZGVseSBpbXBsZW1lbnRlZC4gV2hlbiBOTFNUIGlzIHVzZWQgYW5kIHlvdSBnaXZlIGEKKyAgIGNvbW1hbmQgbGlrZSAibWdldCAqLnR4dCIsIHRoZSBGVFAgY2xpZW50IHNlbmRzOgorCitOTFNUICoudHh0CisKKyAgIGFuZCB0aGUgc2VydmVyIHNlbmRzIGJhY2sgYSBsaXN0IG9mIHRoZSBmaWxlcyB3aG9zZSBuYW1lcyBtYXRjaCwgZS5nLgorCitmb28udHh0CitiYXIudHh0CitiYXoudHh0CisKKyAgIFRoZW4gd2hlbiBkb3dubG9hZGluZyBlYWNoIGZpbGUsIHRoZSBjbGllbnQgc2VuZHMgU0laRSAoaWYgaXQgd2FudHMKKyAgIGhhdmUgYSBwZXJjZW50LWRvbmUgZGlzcGxheSkgYW5kIE1EVE0gKGlmIGl0IHdhbnRzIHRvIHNldCB0aGUKKyAgIGRvd25sb2FkZWQgZmlsZSdzIHRpbWVzdGFtcCB0byBtYXRjaCB0aGF0IG9mIHRoZSBvcmlnaW5hbCksIGFzIHdlbGwgYXMKKyAgIFJFVFIgKHRvIHJldHJpZXZlIHRoZSBmaWxlKS4KKworICAgQnV0IHdoZW4gTUxTRCBpcyB1c2VkLCB0aGUgY2xpZW50IGlzIG5vdCBzdXBwb3NlZCB0byBzZW5kIHRoZSBmaWxlbmFtZQorICAgb3Igd2lsZGNhcmQgdG8gdGhlIHNlcnZlcjsgaW5zdGVhZCBpdCBzZW5kcyBhbiBNTFNEIGRpcmVjdGl2ZSB3aXRoIG5vCisgICBhcmd1bWVudCAob3IgdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnkpLCBhbmQgdGhlIHNlcnZlciBzZW5kcyBiYWNrIGEKKyAgIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBpbiB0aGUgY3VycmVudCBvciBnaXZlbiBkaXJlY3Rvcnk7IHRoZW4gdGhlCisgICBjbGllbnQgZ29lcyB0aHJvdWdoIHRoZSBsaXN0IGFuZCBjaGVja3MgZWFjaCBmaWxlIHRvIHNlZSBpZiBpdCBtYXRjaGVzCisgICB0aGUgZ2l2ZW4gcGF0dGVybiwgdGhlIHJhdGlvbmFsZSBiZWluZyB0aGF0IHRoZSB1c2VyIGtub3dzIG9ubHkgdGhlCisgICBsb2NhbCBjb252ZW50aW9ucyBmb3Igd2lsZGNhcmRzIGFuZCBub3QgbmVjZXNzYXJpbHkgdGhlIHNlcnZlcidzCisgICBjb252ZW50aW9ucy4gU28gd2l0aCBOTFNUIHRoZSBzZXJ2ZXIgaW50ZXJwcmV0cyB3aWxkY2FyZHM7IHdpdGggTUxTRAorICAgdGhlIGNsaWVudCBkb2VzLgorCisgICAgIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBOTFNUIHdpbGRjYXJkcyBieSB0aGUgc2VydmVyIGlzIG5vdAorICAgICBuZWNlc3NhcmlseSByZXF1aXJlZCBvciBldmVuIGVudmlzaW9uZWQgYnkgdGhlIEZUUCBwcm90b2NvbAorICAgICBkZWZpbml0aW9uIChSRkMgOTU5KSwgYnV0IGluIHByYWN0aWNlIG1vc3QgY2xpZW50cyBhbmQgc2VydmVycyB3b3JrCisgICAgIHRoaXMgd2F5LiAKKworICAgVGhlIHByaW5jaXBhbCBhZHZhbnRhZ2Ugb2YgTUxTRCBpcyB0aGF0IGluc3RlYWQgb2Ygc2VuZGluZyBiYWNrIGEKKyAgIHNpbXBsZSBsaXN0IG9mIGZpbGVuYW1lcywgaXQgc2VuZHMgYmFjayBhIGtpbmQgb2YgZGF0YWJhc2UgaW4gd2hpY2gKKyAgIGVhY2ggZW50cnkgY29udGFpbnMgYSBmaWxlbmFtZSB0b2dldGhlciB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgZmlsZTogdHlwZSwgc2l6ZSwgdGltZXN0YW1wLCBhbmQgc28gb247IGZvciBleGFtcGxlOgorCitzaXplPTA7dHlwZT1kaXI7cGVybT1lbDttb2RpZnk9MjAwMjA0MDkxOTE1MzA7IGJpbgorc2l6ZT0zOTE5MzEyO3R5cGU9ZmlsZTtwZXJtPXI7bW9kaWZ5PTIwMDAwMzEwMTQwNDAwOyBiYXIudHh0CitzaXplPTY2ODYxNzY7dHlwZT1maWxlO3Blcm09cjttb2RpZnk9MjAwMDEyMTUxODEwMDA7IGJhei50eHQKK3NpemU9MzgyMDA5Mjt0eXBlPWZpbGU7cGVybT1yO21vZGlmeT0yMDAwMDMxMDE0MDMwMDsgZm9vLnR4dAorc2l6ZT0yNzQzOTt0eXBlPWZpbGU7cGVybT1yO21vZGlmeT0yMDAyMDkyMzE1MTMxMjsgZm9vLnppcAorKGV0YyBldGMuLi4pCisKKyAgIChJZiB0aGUgZm9ybWF0IG9mIHRoZSBmaWxlIGxpc3Qgd2VyZSB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gTkxTVAorICAgYW5kIE1MU0QsIHRoZSBkaXNjdXNzaW9uIHdvdWxkIGJlIGZpbmlzaGVkOiBpdCB3b3VsZCBhbHdheXMgYmUgYmV0dGVyCisgICB0byB1c2UgTUxTRCB3aGVuIGF2YWlsYWJsZSwgYW5kIHRoZSBNR0VUIHVzZXIgaW50ZXJmYWNlIHdvdWxkIG5lZWQgbm8KKyAgIGNoYW5nZXMuIEJ1dCB0aGVyZSdzIGEgbG90IG1vcmUgdG8gTUxTRCB0aGFuIHRoZSBmaWxlLWxpc3QgZm9ybWF0OworICAgcmVhZCBvbi4uLikKKworICAgVGhlIGNsaWVudCBsZWFybnMgd2hldGhlciB0aGUgc2VydmVyIHN1cHBvcnRzIE1MU0QgaW4gRkVBVCBleGNoYW5nZS4KKyAgIEJ1dCB0aGUgZmFjdCB0aGF0IHRoZSBzZXJ2ZXIgc3VwcG9ydHMgTUxTRCBkb2Vzbid0IG1lYW4gdGhlIGNsaWVudAorICAgc2hvdWxkIGFsd2F5cyB1c2UgaXQuIEl0IGlzIGJldHRlciB0byB1c2UgTUxTRDoKKworICAgICAqIE9uIGNvbm5lY3Rpb25zIHdoZXJlIHRoZSBzZXJ2ZXIgaW1wb3NlcyBhIHRpbWUgcGVuYWx0eSBmb3IgZXZlcnkKKyAgICAgICBjb21tYW5kLCBlLmcuIHRoZSBSZWQgSGF0IFJhd2hpZGUgc2VydmVyLiBXaXRoIE1MU0QsIHRoZSBjbGllbnQKKyAgICAgICBuZWVkcyB0byBzZW5kIG9ubHkgb25lIGNvbW1hbmQgKFJFVFIpIHBlciBmaWxlLCB3aGVyZWFzIE5MU1QKKyAgICAgICByZXF1aXJlcyB0aHJlZSAoU0laRSwgUkVUUiwgYW5kIE1EVE0pLiBTdXBwb3NlIHRoZXJlIGlzIGEKKyAgICAgICAzMC1zZWNvbmQgZGVsYXkgZm9yIGVhY2ggY29tbWFuZCBhbmQgMTAwMCBmaWxlcyBhcmUgdG8gYmUgZmV0Y2hlZDsKKyAgICAgICBpbiB0aGF0IGNhc2UsIE1MU0Qgc2F2ZXMgNjAsMDAwIHNlY29uZHMgPSAxMDAwIG1pbnV0ZXMgPSAxNiBob3VycworICAgICAgIGFuZCA0MCBtaW51dGVzLgorICAgICAqIEZvciByZWN1cnNpdmUgZG93bmxvYWRzIHNpbmNlIHRoZXJlIGlzIG5vIGRlcGVuZGFibGUgd2F5IHRvCisgICAgICAgZG93bmxvYWQgZGlyZWN0b3J5IHRyZWVzIHdpdGggTkxTVC4KKworICAgQnV0IGl0IGlzIGJldHRlciB0byB1c2UgTkxTVDoKKworICAgICAqIElmIHlvdSB3YW50IG9ubHkgYSBjb3VwbGUgc2hvcnQgZmlsZXMgb3V0IG9mIGEgbGFyZ2UgZGlyZWN0b3J5LiBJbgorICAgICAgIHRoaXMgY2FzZSwgTkxTVCBpcyB0aGUgYmV0dGVyIGNob2ljZSBzaW5jZSB0aGUgc2VydmVyIHNlbmRzIGEgbGlzdAorICAgICAgIG9mIG9ubHkgdGhlIGZpbGVzIHlvdSB3YW50LCBub3QgYSBsaXN0IG9mIChzYXkpIGEgbWlsbGlvbiBmaWxlcywKKyAgICAgICB3aGljaCBjYW4gbWFrZSBhIGJpZyBkaWZmZXJlbmNlIG9uIHNsb3cgY29ubmVjdGlvbnMuIEZvciBleGFtcGxlLAorICAgICAgIHN1cHBvc2UgeW91ciB3aWxkY2FyZCBtYXRjaGVzIHRocmVlIGZpbGVzIG9mIDFLIGVhY2gsIGJ1dCB0aGUKKyAgICAgICBtaWxsaW9uLWZpbGUgbGlzdGluZyBpcyA4ME1CIGxvbmcsIGFuZCB5b3VyIGNvbm5lY3Rpb24gaXMgdGhyb3VnaAorICAgICAgIGEgbW9kZW0uIFRoZSBvdmVyaGVhZCBvZiB1c2luZyBNTFNEIGlzIHByYWN0aWNhbGx5IGluZmluaXRlLgorICAgICAqIElmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgd2lsZGNhcmRpbmcgZmVhdHVyZXMgbm90IGtub3duIHRvIHRoZQorICAgICAgIGNsaWVudCwgYnV0IHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNoaWV2ZSBkZXNpcmFibGUgZWZmZWN0cworICAgICAgIG90aGVyd2lzZSB1bm9idGFpbmFibGUsIHN1Y2ggYXMgIltkaXIuLi5dKi50eHQiIGluIFZNUyBvciBBT1MvVlMKKyAgICAgICAiZXhjZXB0IiBjbGF1c2VzLgorICAgICAqIElmIHlvdSBoYXZlIGJlZW4gZ2l2ZW4gYSB3aWxkY2FyZCBzdHJpbmcgYnkgYW4gRlRQIHNpdGUKKyAgICAgICBhZG1pbmlzdHJhdG9yIGZvciBmZXRjaGluZyBhIHNwZWNpZmljIGdyb3VwIG9mIGZpbGVzIG91dCBvZiBhCisgICAgICAgbGFyZ2VyIGRpcmVjdG9yeSwgZS5nLiAibWdldCBja1tjdXddKi5bY3doXSBtYWtlZmlsZSIsIHRoYXQgaXMKKyAgICAgICBleHBlY3RlZCB0byB3b3JrIHdpdGggYW55IGNsaWVudCAoYW4gRlRQIHNpdGUgYWRtaW5pc3RyYXRvciBjYW4ndAorICAgICAgIGJlIGV4cGVjdGVkIHRvIGtub3cgdGhlIHdpbGRjYXJkIHN5bnRheCBvZiBldmVyeSBGVFAgY2xpZW50KS4KKworICAgQnV0IHdoZW4gdXNpbmcgTUxTRCB0aGVyZSBhcmUgY29tcGxpY2F0aW9uczoKKworICAgICAqIE1MU0Qgd2FudHMgZWl0aGVyIGEgYmxhbmsgYXJndW1lbnQgKG1lYW5pbmcgdGhlIGN1cnJlbnQgZGlyZWN0b3J5KQorICAgICAgIG9yIGVsc2UgdGhlIG5hbWUgb2YgYSBzcGVjaWZpYyBkaXJlY3RvcnkuIFRoZSBjbGllbnQgbXVzdCBub3Qgc2VuZAorICAgICAgIGl0IGEgd2lsZGNhcmQgb3IgYSBmaWxlbmFtZS4KKyAgICAgKiBCdXQgaWYgdGhlIHVzZXIncyBjb21tYW5kIGlzICJtZ2V0IHh4eCIsIGhvdyBkb2VzIHRoZSBjbGllbnQga25vdworICAgICAgIHdoZXRoZXIgdG8gc2VuZCAieHh4IiBpbiB0aGUgTUxTRCBkaXJlY3RpdmU/IEl0IG1pZ2h0IGJlIHRoZSBuYW1lCisgICAgICAgb2YgYSBkaXJlY3Rvcnkgb24gb24gdGhlIHNlcnZlciwgaW4gd2hpY2ggY2FzZSBpdCBzaG91bGQgYmUgc2VudCwKKyAgICAgICBvciBpdCBtaWdodCBiZSB0aGUgbmFtZSBvZiBhIGZpbGUgb24gdGhlIHNlcnZlciAob3IgYSB3aWxkY2FyZCksCisgICAgICAgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IG5vdCBiZSBzZW50LiBTaW5jZSB0aGUgY2xpZW50IGtub3dzIGl0cyBvd24KKyAgICAgICB3aWxkY2FyZCBzeW50YXgsIHRoZW4gaW4gbW9zdCBjYXNlcyBpdCB3b3VsZCBiZSByaWdodCB0byBzZW5kCisgICAgICAgIk1MU0QiIHdpdGggbm8gYXJndW1lbnQgaWYgeHh4IGlzIHdpbGQsIGFuZCB0byBzZW5kICJNTFNEIHh4eCIgaWYKKyAgICAgICBpdCBpcyBub3QuCisgICAgICogQnV0IHN1cHBvc2UgdGhlIHNlcnZlcidzIGZpbGUgc3lzdGVtIGFsbG93cyBmaWxlbmFtZSBjaGFyYWN0ZXJzCisgICAgICAgdGhhdCBjb3JyZXNwb25kIHdpdGggdGhlIGNsaWVudCdzIHdpbGRjYXJkIHN5bnRheD8gRm9yIGV4YW1wbGU6CisgICAgICAgIlthYmNdIiBjb3VsZCBiZSBlaXRoZXIgYSB2YWxpZCBWTVMgZGlyZWN0b3J5IG5hbWUgb3IgYSB3aWxkY2FyZAorICAgICAgIHBhdHRlcm4gdXNlZCBieSB0aGUgRlRQIGNsaWVudC4gV2hhdCBzaG91bGQgdGhlIGNsaWVudCBkbyB3aXRoCisgICAgICAgIm1nZXQgW2FiY10iPyBJbiB0aGlzIGNhc2UgdGhlcmUgbXVzdCBiZSBhIHdheSBmb3IgdGhlIHVzZXIgdG8KKyAgICAgICBmb3JjZSBzZW5kaW5nIHRoZSBNR0VUIGFyZ3VtZW50IGFzIHRoZSBNTFNEIGFyZ3VtZW50LgorICAgICAqIElmICJ4eHgiIGlzIGEgcmVndWxhciBmaWxlIGluIHRoZSBzZXJ2ZXIncyBjdXJyZW50IGRpcmVjdG9yeSwKKyAgICAgICAibWdldCB4eHgiIHdvcmtzIHdpdGggTkxTVCBidXQgbm90IHdpdGggTUxTRC4KKworICAgVG8gZnVydGhlciBjb21wbGljYXRlIG1hdHRlcnMsIE5MU1QgY2FuIChpbiB0aGVvcnkpIHdvcmsganVzdCBsaWtlCisgICBNTFNEOiBpZiBzZW50IHdpdGggYSBibGFuayBhcmd1bWVudCBvciBhIGRpcmVjdG9yeSBuYW1lLCBpdCBpcworICAgc3VwcG9zZWQgdG8gcmV0dXJuIGEgY29tcGxldGUgbGlzdCBvZiBmaWxlcyBpbiB0aGUgY3VycmVudCBvciBnaXZlbgorICAgZGlyZWN0b3J5LCB3aGljaCB0aGUgY2xpZW50IGNhbiBtYXRjaCBsb2NhbGx5IGFnYWluc3Qgc29tZSBwYXR0ZXJuLiBJdAorICAgaXMgbm90IGtub3duIGlmIGFueSBGVFAgc2VydmVyIG9yIGNsaWVudCBkb2VzIHRoaXMgYnV0IG5ldmVydGhlbGVzcywKKyAgIGl0IHNob3VsZCBiZSBwb3NzaWJsZSBzaW5jZSB0aGlzIGJlaGF2aW9yIGNhbiBiZSBpbmZlcnJlZCBmcm9tIFJGQworICAgOTU5LgorCisgICBJbiB2aWV3IG9mIHRoZXNlIGNvbnNpZGVyYXRpb25zLCBhbmQgZ2l2ZW4gdGhlIG5lZWQgdG8gcHJlc2VydmUgdGhlCisgICB0cmFkaXRpb25hbCBGVFAgY2xpZW50IGNvbW1hbmQgc3RydWN0dXJlIGFuZCBiZWhhdmlvciBzbyB0aGUgc29mdHdhcmUKKyAgIHdpbGwgYmUgdXNhYmxlIGJ5IG1vc3QgcGVvcGxlOgorCisgICAgMS4gVGhlIE1HRVQgY29tbWFuZCBzaG91bGQgcHJvZHVjZSB0aGUgZXhwZWN0ZWQgcmVzdWx0IGluIHRoZSBjb21tb24KKyAgICAgICBjYXNlcywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIE5MU1Qgb3IgTUxTRCBpcyB1c2VkIHVuZGVybmVhdGguCisgICAgMi4gRm9yIGFub21hbG91cyBjYXNlcywgdGhlIHVzZXIgbmVlZHMgYSB3YXkgdG8gY29udHJvbCB3aGV0aGVyIHRoZQorICAgICAgIE1HRVQgYXJndW1lbnQgaXMgc2VudCB0byB0aGUgc2VydmVyIG9yIGtlcHQgZm9yIGxvY2FsIHVzZS4KKyAgICAzLiBBdCB0aGUgc2FtZSB0aW1lLCB0aGUgdXNlciBtaWdodCBuZWVkIGEgd2F5IHRvIHNlbmQgYSBkaXJlY3RvcnkKKyAgICAgICBuYW1lIHRvIHRoZSBzZXJ2ZXIsIGluZGVwZW5kZW50IG9mIGFueSB3aWxkY2FyZCBwYXR0ZXJuLgorICAgIDQuIFRoZSB1c2VyIG5lZWRzIGEgd2F5IHRvIGZvcmNlIE5MU1Qgb3IgTUxTRCBmb3IgYSBnaXZlbiBNR0VUCisgICAgICAgY29tbWFuZC4KKworICAgQnkgZGVmYXVsdCwgS2VybWl0J3MgTUdFVCBjb21tYW5kIHVzZXMgTUxTRCBpZiBNTFNUIGlzIHJlcG9ydGVkIGJ5IHRoZQorICAgc2VydmVyIGluIGl0cyBGRUFUIGxpc3QuIFdoZW4gTUxTRCBpcyB1c2VkLCB0aGUgZmlsZXNwZWMgaXMgc2VudCB0bworICAgdGhlIHNlcnZlciBpZiBpdCBpcyBub3Qgd2lsZCAoYWNjb3JkaW5nIHRvIEtlcm1pdCdzIG93biBkZWZpbml0aW9uIG9mCisgICAid2lsZCIgc2luY2UgaXQgY2FuJ3QgcG9zc2libHkga25vdyB0aGUgc2VydmVyJ3MgZGVmaW5pdGlvbikuIElmIHRoZQorICAgZmlsZXNwZWMgaXMgd2lsZCBpdCBpcyBoZWxkIGZvciBsb2NhbCB1c2UgdG8gc2VsZWN0IGZpbGVzIGZyb20gdGhlCisgICBsaXN0IHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIuIElmIE1MU1QgaXMgbm90IHJlcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIgb3IKKyAgIGlzIGRpc2FibGVkLCBLZXJtaXQgc2VuZHMgdGhlIE1HRVQgZmlsZXNwZWMgd2l0aCB0aGUgTkxTVCBkaXJlY3RpdmUuCisKKyAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGNhbiBiZSBvdmVycmlkZGVuIGdsb2JhbGx5IHdpdGggRlRQIERJU0FCTEUgTUxTVCwKKyAgIHdoaWNoIGZvcmNlcyBLZXJtaXQgdG8gdXNlIE5MU1QgdG8gZ2V0IGZpbGUgbGlzdHMuIEFuZCB0aGVuIGZvcgorICAgc2l0dWF0aW9ucyBpbiB3aGljaCBNTFNEIGlzIGVuYWJsZWQsIHRoZSBmb2xsb3dpbmcgTUdFVCBzd2l0Y2hlcyBjYW4KKyAgIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzIGZvciBhIHNwZWNpZmljIE1HRVQgb3BlcmF0aW9uOgorCisgICAvTkxTVAorICAgICAgICAgIEZvcmNlcyB0aGUgY2xpZW50IHRvIHNlbmQgTkxTVC4gRXhhbXBsZToKKworbWdldCAvbmxzdCBmb28uKgorCisgICAvTUxTRAorICAgICAgICAgIEZvcmNlcyB0aGUgY2xpZW50IHRvIHNlbmQgTUxTRCAoZXZlbiBpZiBNTFNUIGlzIGRpc2FibGVkKS4KKyAgICAgICAgICBFeGFtcGxlOgorCittZ2V0IC9tbHNkIGZvby4qCisKKyAgIC9NQVRDSDpwYXR0ZXJuCisgICAgICAgICAgV2hlbiB0aGlzIHN3aXRjaCBpcyBnaXZlbiwgaXQgZm9yY2VzIHRoZSBjbGllbnQgdG8gaG9sZCB0aGUKKyAgICAgICAgICBwYXR0ZXJuIGZvciBsb2NhbCB1c2UgYWdhaW5zdCB0aGUgcmV0dXJuZWQgZmlsZSBsaXN0LiBJZiBhCisgICAgICAgICAgcmVtb3RlIGZpbGVzcGVjIGlzIGFsc28gZ2l2ZW4gKGUuZy4gdGhlICJibGFoIiBpbiAibWdldAorICAgICAgICAgIC9tYXRjaDoqLnR4dCBibGFoIiksIHRoZW4gaXQgaXMgc2VudCBhcyB0aGUgTkxTVCBvciBNTFNECisgICAgICAgICAgYXJndW1lbnQsIHByZXN1bWFibHkgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdob3NlIGZpbGVzIGFyZQorICAgICAgICAgIHRvIGJlIGxpc3RlZC4gV2hlbiB0aGUgL01BVENIIHN3aXRjaCBpcyBub3QgZ2l2ZW4sIHRoZSBNR0VUCisgICAgICAgICAgZmlsZXNwZWMgaXMgc2VudCB0byB0aGUgc2VydmVyIGlmIHRoZSBkaXJlY3RpdmUgaXMgTkxTVCBvciBpZgorICAgICAgICAgIHRoZSBmaWxlc3BlYyBpcyBub3Qgd2lsZC4gRXhhbXBsZXM6CisKKyAgQ29tbWFuZDogICAgICAgICAgICAgICAgICAgV2l0aCBOTFNUOiAgICAgV2l0aCBNTFNEOgorICAgIG1nZXQgICAgICAgICAgICAgICAgICAgICAgTkxTVCAgICAgICAgICAgTUxTRAorICAgIG1nZXQgKi50eHQgICAgICAgICAgICAgICAgTkxTVCAqLnR4dCAgICAgTUxTRAorICAgIG1nZXQgZm9vICAgICAgICAgICAgICAgICAgTkxTVCBmb28gICAgICAgTUxTRCBmb28KKyAgICBtZ2V0IC9tYXRjaDoqLnR4dCAgICAgICAgIE5MU1QgICAgICAgICAgIE1MU0QKKyAgICBtZ2V0IC9tYXRjaDoqLnR4dCBmb28gICAgIE5MU1QgZm9vICAgICAgIE1MU0QgZm9vCisKKyAgIEluIG90aGVyIHdvcmRzLCB0aGUgcGF0dGVybiBpcyBhbHdheXMgaW50ZXByZXRlZCBsb2NhbGx5IHVubGVzcyBNR0VUCisgICB1c2VzIE5MU1QgYW5kIG5vIC9NQVRDSCBzd2l0Y2ggd2FzIGdpdmVuLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAzLjExLjQuIEV4YW1wbGVzCisKKyAgMy4xMS40LjEuIERvd25sb2FkaW5nIGEgU2luZ2xlIEZpbGUKKworICAgVGhlcmUgYXJlIG5vIGNob2ljZXMgaGVyZSwganVzdCB1c2UgdGhlIEZUUCBHRVQgY29tbWFuZC4gS2VybWl0IGFsd2F5cworICAgc2VuZHMgdGhlIFJFVFIgZGlyZWN0aXZlLCBhbmQgcG9zc2libHkgU0laRSBhbmQvb3IgTURUTS4gVGhlIHNtYWxsCisgICBhZHZhbnRhZ2Ugb2YgdXNpbmcgTUxTVCBpbiB0aGlzIGNhc2UgaXMgb3V0d2VpZ2hlZCBieSB0aGUgcmlzayBhbmQKKyAgIGVmZm9ydCBvZiBjb2RpbmcgYSBzcGVjaWFsIGNhc2UuCisKKyAgMy4xMS40LjIuIERvd25sb2FkaW5nIGEgR3JvdXAgb2YgRmlsZXMgZnJvbSBhIFNpbmdsZSBEaXJlY3RvcnkKKworICAgVGhpcyBjYXNlIHByZXNlbnRzIHRyYWRlb2ZmcywgZXNwZWNpYWxseSBvbiBzbG93IGNvbm5lY3Rpb25zOgorCisgICAgICogRm9yIGRvd25sb2FkaW5nIGFsbCBvciBtb3N0IG9mIHRoZSBmaWxlcyBpbiBhIGRpcmVjdG9yeSwgTUxTRCBpcworICAgICAgIGJldHRlciBiZWNhdXNlIGl0IGVsaW1pbmF0ZXMgdGhlIG5lZWQgdG8gc2VuZCBTSVpFIGFuZCBNRFRNIGZvcgorICAgICAgIGVhY2ggZmlsZS4gTm8gc3BlY2lhbCBhY3Rpb25zIGFyZSByZXF1aXJlZCBpbiB0aGlzIGNhc2U7IEtlcm1pdAorICAgICAgIHVzZXMgTUxTRCBhdXRvbWF0aWNhbGx5IGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgaXQgKHVubGVzcyB5b3UgaGF2ZQorICAgICAgIGRpc2FibGVkIGl0KS4KKyAgICAgKiBGb3IgYSBzbWFsbCBudW1iZXIgb2YgZmlsZXMgZnJvbSBhIGxhcmdlIGRpcmVjdG9yeSwgTkxTVCBpcyBiZXR0ZXIKKyAgICAgICBiZWNhdXNlIGl0IGJ5cGFzc2VzIGRvd25sb2FkaW5nIG9mIGEgcG90ZW50aWFsbHkgaHVnZSBmaWxlIGxpc3QKKyAgICAgICBwcmlvciB0byB0aGUgZmlsZXMgdGhlbXNlbHZlcy4gSWYgeW91IGhhdmUgYSBjb25uZWN0aW9uIHRvIGEKKyAgICAgICBzZXJ2ZXIgdGhhdCBzdXBwb3J0cyBNTFNELCB1c2UgdGhlIC9OTFNUIHN3aXRjaCB0byBmb3JjZSBOTFNUOgorCittZ2V0IC9ubHN0IHRbMTIzNF0uaAorCisgICAgICogSWYgdGhlIHNlcnZlciBzdXBwb3J0cyBNTFNEIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IHNlcGFyYXRlIFNJWkUgb3IKKyAgICAgICBNRFRNIGRpcmVjdGl2ZXMsIGFuZCB5b3UgbmVlZCB0aGUgc2l6ZSBhbmQvb3IgdGltZXN0YW1wCisgICAgICAgaW5mb3JtYXRpb24sIE1MU0QgaXMgYmV0dGVyOyBubyBzcGVjaWFsIGFjdGlvbnMgcmVxdWlyZWQuCisgICAgICogSWYgdGhlIHNlcnZlciBzdXBwb3J0cyBNTFNEIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IHRoZSAic2l6ZSIgYW5kCisgICAgICAgIm1vZGlmeSIgZmFjdHMsIGJ1dCBpdCBkb2VzIHN1cHBvcnQgdGhlIFNJWkUgb3IgTURUTSBkaXJlY3RpdmVzLAorICAgICAgIGFuZCB5b3UgbmVlZCB0aGUgc2l6ZSBhbmQvb3IgdGltZXN0YW1wIGluZm9ybWF0aW9uLCBOTFNUIGlzCisgICAgICAgYmV0dGVyLgorCisgIDMuMTEuNC4zLiBEb3dubG9hZGluZyBhIERpcmVjdG9yeSBUcmVlCisKKyAgIE1MU0QgaXMgdGhlIG9ubHkgY2hvaWNlIGZvciByZWN1cnNpdmUgZG93bmxvYWRzOyB0aGV5IHJhcmVseSwgaWYgZXZlciwKKyAgIHdvcmsgd2l0aCBOTFNUICh0aGUgZmV3IGNhc2VzIHdoZXJlIHRoZXkgZG8gd29yayByZWx5IG9uCisgICBleHRyYS1wcm90b2NvbCAic2VjcmV0IiBub3RhdGlvbnMgZm9yIHRoZSBOTFNUIGFyZ3VtZW50KS4gTm8gc3BlY2lhbAorICAgYWN0aW9ucyBhcmUgcmVxdWlyZWQgdG8gZm9yY2UgTUxTRCB3aGVuIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgaXQsIHVubGVzcworICAgeW91IGhhdmUgZGlzYWJsZWQgaXQuIEV4YW1wbGVzOgorCisgICBNR0VUIC9SRUNVUlNJVkUKKyAgICAgICAgICBUaGlzIHRlbGxzIHRoZSBzZXJ2ZXIgdG8gc2VuZCBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIHRoZQorICAgICAgICAgIHRyZWUgcm9vdGVkIGF0IGl0cyBjdXJyZW50IGRpcmVjdG9yeS4KKworICAgTUdFVCAvUkVDVVJTSVZFICoudHh0CisgICAgICAgICAgVGhpcyB0ZWxscyB0aGUgc2VydmVyIHRvIHNlbmQgYWxsICoudHh0IGZpbGVzIGluIHRoZSB0cmVlCisgICAgICAgICAgcm9vdGVkIGF0IGl0cyBjdXJyZW50IGRpcmVjdG9yeS4KKworICAgTUdFVCAvTUxTRCAvUkVDVVJTSVZFICoudHh0CisgICAgICAgICAgU2FtZSBhcyB0aGUgcHJldmlvdXMgZXhhbXBsZSBidXQgZm9yY2VzIEtlcm1pdCB0byBzZW5kIE1MU0QgaW4KKyAgICAgICAgICBjYXNlIGl0IHdhcyBkaXNhYmxlZCwgb3IgaW4gY2FzZSB0aGUgc2VydmVyIGlzIGtub3duIHRvIHN1cHBvcnQKKyAgICAgICAgICBpdCBldmVuIHRob3VnaCBpdCBkaWQgbm90IGFubm91bmNlIGl0IGluIGl0cyBGRUFUIGxpc3RpbmcuCisKKyAgIE1HRVQgL1JFQ1VSU0lWRSAvTUFUQ0g6Ki56aXAgYXJjaGl2ZXMKKyAgICAgICAgICBUZWxscyB0aGUgc2VydmVyIHRvIHNlbmQgYWxsIFpJUCBmaWxlcyBpbiB0aGUgdHJlZSByb290ZWQgYXQKKyAgICAgICAgICBpdHMgImFyY2hpdmVzIiBkaXJlY3RvcnkuCisKKyAgIE1HRVQgL1JFQ1VSU0lWRSAvTUFUQ0g6KiBbYWJjXQorICAgICAgICAgIFRoZSBzZXJ2ZXIgaXMgcnVubmluZyBvbiBWTVMgYW5kIHlvdSB3YW50IGl0IHRvIHNlbmQgYWxsIHRoZQorICAgICAgICAgIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgdHJlZSByb290ZWQgYXQgW0FCQ10uIEJ1dCBzaW5jZSAiW2FiY10iCisgICAgICAgICAgbG9va3MganVzdCBsaWtlIGEgd2lsZGNhcmQsIHlvdSBoYXZlIHRvIGluY2x1ZGUgYSAvTUFUQ0g6CisgICAgICAgICAgc3dpdGNoIHRvIGZvcmNlIEtlcm1pdCB0byBzZW5kICJbYWJjXSIgYXMgdGhlIE1MU0QgYXJndW1lbnQuCisKKyAgIEluIGFsbCBjYXNlcyBpbiB3aGljaCB0aGUgL1JFQ1VSU0lWRSBzd2l0Y2ggaXMgaW5jbHVkZWQsIHRoZSBzZXJ2ZXIncworICAgdHJlZSBpcyBkdXBsaWNhdGVkIGxvY2FsbHkuCisKKyAgICAgQWx0aG91Z2ggTUxTRCBhbGxvd3MgcmVjdXJzaW9uIGFuZCBOTFNUIGRvZXMgbm90LCB0aGUgTUxTRAorICAgICBzcGVjaWZpY2F0aW9uIHBsYWNlcyBhIGhlYXZ5IGJ1cmRlbiBvbiB0aGUgY2xpZW50OyB0aGUgb2J2aW91cywKKyAgICAgc3RyYWlnaHRmb3J3YXJkLCBhbmQgZWxlZ2FudCBpbXBsZW1lbnRhdGlvbiAoZGVwdGgtZmlyc3QsIHRoZSBvbmUKKyAgICAgdGhhdCBLZXJtaXQgY3VycmVudGx5IHVzZXMpIHJlcXVpcmVzIGFzIG1hbnkgb3BlbiB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgYXMgdGhlIHNlcnZlcidzIGRpcmVjdG9yeSB0cmVlIGlzIGRlZXAsIGFuZCB0aGVyZWZvcmUgY2xpZW50CisgICAgIHJlc291cmNlIGV4aGF1c3Rpb24gLS0gZS5nLiBleGNlZWRpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIG9wZW4KKyAgICAgZmlsZXMgLS0gaXMgYSBkYW5nZXIuIFVuZm9ydHVuYXRlbHkgTUxTRCB3YXMgbm90IGRlc2lnbmVkIHdpdGgKKyAgICAgcmVjdXJzaW9uIGluIG1pbmQuIChCcmVhZHRoLWZpcnN0IHRyYXZlcnNhbCBjb3VsZCBiZSBwcm9ibGVtYXRpYworICAgICBkdWUgdG8gbGFjayBvZiBzdWZmaWNpZW50IG5hdmlnYXRpb24gaW5mb3JtYXRpb24uKSAKKworICAgT2YgY291cnNlIGFsbCBvZiBLZXJtaXQncyBvdGhlciBNR0VUIHN3aXRjaGVzIGNhbiBiZSB1c2VkIHRvbywgZS5nLgorICAgZm9yIGZpbmVyLWdyYWluZWQgZmlsZSBzZWxlY3Rpb24gKGJ5IGRhdGUsIHNpemUsIGV0YyksIGZvciBtb3Zpbmcgb3IKKyAgIHJlbmFtaW5nIGZpbGVzIGFzIHRoZXkgYXJyaXZlLCB0byBvdmVycmlkZSBLZXJtaXQncyBhdXRvbWF0aWMgcGVyLWZpbGUKKyAgIHRleHQvYmluYXJ5IG1vZGUgc3dpdGNoaW5nLCB0byBwYXNzIHRoZSBpbmNvbWluZyBmaWxlcyB0aHJvdWdoIGEKKyAgIGZpbHRlciwgdG8gY29udmVydCB0ZXh0LWZpbGUgY2hhcmFjdGVyIHNldHMsIGFuZCBzbyBvbi4KKworICAzLjExLjQuNC4gTkxTVC9NTFNEIFN1bW1hcnkgVGFibGUKKworICAgSGVyZSdzIGEgdGFibGUgc3VtbWFyaXppbmcgTUdFVCBiZWhhdmlvciB3aGVuIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgYm90aAorICAgTkxTVCBhbmQgTUxTRC4gL05MU1QgYW5kIC9NTFNEIHN3aXRjaGVzIGFyZSBpbmNsdWRlZCBmb3IgY2xhcml0eSB0bworICAgaW5kaWNhdGUgd2hpY2ggcHJvdG9jb2wgaXMgYmVpbmcgdXNlZCwgYW5kIHRoZSBleHBlY3RlZCBlZmZlY3RzLiBJbgorICAgcHJhY3RpY2UgeW91IGNhbiBvbWl0IHRoZSAvTkxTVCBhbmQgL01MU0Qgc3dpdGNoZXMgYW5kIHRoZSBLZXJtaXQKKyAgIGNsaWVudCBjaG9vc2VzIHRoZSBhcHByb3ByaWF0ZSBvciBkZXNpcmVkIHByb3RvY29sIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAgIFNhbXBsZSBjb21tYW5kcyBwcmVzdW1lIGEgVW5peCBmaWxlIHN5c3RlbSBvbiB0aGUgc2VydmVyLCBidXQgb2YKKyAgIGNvdXJzZSB0aGUgc2VydmVyIGNhbiBoYXZlIGFueSBmaWxlIHN5c3RlbSBvciBzeW50YXggYXQgYWxsLgorCisgICBVc2VyJ3MgQ29tbWFuZCBGVFAgU2VuZHMgUmVtYXJrcworICAgbWdldCAvbmxzdCBOTFNUIEdldHMgYSBsaXN0IG9mIGFsbCB0aGUgZmlsZXMgaW4gdGhlIHNlcnZlcidzIGN1cnJlbnQKKyAgIGFuZCBkb3dubG9hZHMgZWFjaCBmaWxlLiBUaGUgbGlzdCBpbmNsdWRlcyBuYW1lcyBvbmx5LCBzbyBLZXJtaXQgYWxzbworICAgbXVzdCBzZW5kIFNJWkUgYW5kIE1EVE0gZGlyZWN0aXZlcyBpZiBzaXplIGFuZCB0aW1lc3RhbXAgaW5mb3JtYXRpb24KKyAgIGlzIHJlcXVpcmVkICh0aGlzIGlzIGFsd2F5cyB0cnVlIG9mIE5MU1QpLiBTZW5kaW5nIE5MU1Qgd2l0aG91dCBhbgorICAgYXJndW1lbnQgaXMgYWxsb3dlZCBieSB0aGUgUkZDOTU5IE5MU1QgZGVmaW5pdGlvbiBhbmQgYnkgdGhlIEtlcm1pdAorICAgRlRQIGNsaWVudCwgYnV0IG1pZ2h0IG5vdCB3b3JrIHdpdGggb3RoZXIgY2xpZW50cywgYW5kIGFsc28gbWlnaHQgbm90CisgICB3b3JrIHdpdGggZXZlcnkgc2VydmVyLgorICAgbWdldCAvbmxzdCBmb28gTkxTVCBmb28gSWYgImZvbyIgaXMgYSBkaXJlY3RvcnksIHRoaXMgZ2V0cyBhIGxpc3Qgb2YKKyAgIGFsbCB0aGUgZmlsZXMgZnJvbSB0aGUgc2VydmVyJ3MgImZvbyIgZGlyZWN0b3J5IGFuZCBkb3dubG9hZHMgZWFjaAorICAgZmlsZTsgb3RoZXJ3aXNlIHRoaXMgZG93bmxvYWRzIHRoZSBmaWxlIG5hbWVkICJmb28iIChpZiBhbnkpIGZyb20gdGhlCisgICBzZXJ2ZXIncyBjdXJyZW50IGRpcmVjdG9yeS4KKyAgIG1nZXQgL25sc3QgKi50eHQgTkxTVCAqLnR4dCBHZXRzIGEgbGlzdCBvZiB0aGUgZmlsZXMgaW4gdGhlIHNlcnZlcidzCisgICBjdXJyZW50IGRpcmVjdG9yeSB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcGF0dGVybiAqLnR4dCwgYW5kIHRoZW4KKyAgIGRvd25sb2FkcyBlYWNoIGZpbGUgZnJvbSB0aGUgbGlzdC4gQmVjYXVzZSB3ZSBhcmUgdXNpbmcgTkxTVCwgd2Ugc2VuZAorICAgdGhlIGZpbGVzcGVjICgqLnR4dCkgdG8gdGhlIHNlcnZlciBhbmQgdGhlIHNlcnZlciBpbnRlcnByZXRzIGFueQorICAgd2lsZGNhcmRzLgorICAgbWdldCAvbmxzdCBmb28vKi50eHQgTkxTVCBmb28vKi50eHQgIEdldHMgYSBsaXN0IG9mIHRoZSBmaWxlcyBpbiB0aGUKKyAgIHNlcnZlcidzICJmb28iIGRpcmVjdG9yeSB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcGF0dGVybiAqLnR4dCwgYW5kIHRoZW4KKyAgIGRvd25sb2FkcyBlYWNoIGZpbGUgZnJvbSB0aGUgbGlzdCAoc2VydmVyIGludGVycHJldHMgd2lsZGNhcmRzKS4KKyAgIG1nZXQgL25sc3QgL21hdGNoOioudHh0IE5MU1QgR2V0cyBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBpbiB0aGUKKyAgIHNlcnZlcidzIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCB0aGVuIGRvd25sb2FkcyBlYWNoIG9uZSB3aG9zZSBuYW1lCisgICBtYXRjaGVzIHRoZSBwYXR0ZXJuICoudHh0IChjbGllbnQgaW50ZXJwcmV0cyB3aWxkY2FyZHMpLgorICAgbWdldCAvbmxzdCAvbWF0Y2g6Ki50eHQgZm9vICBOTFNUIGZvbyBHZXRzIGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIGluCisgICB0aGUgc2VydmVyJ3MgImZvbyIgZGlyZWN0b3J5IGFuZCB0aGVuIGRvd25sb2FkcyBlYWNoIG9uZSB3aG9zZSBuYW1lCisgICBtYXRjaGVzIHRoZSBwYXR0ZXJuICoudHh0IChjbGllbnQgaW50ZXJwcmV0cyB3aWxkY2FyZHMpLgorICAgbWdldCAvbWxzZCBNTFNEIEdldHMgYSBsaXN0IG9mIGFsbCB0aGUgZmlsZXMgZnJvbSB0aGUgc2VydmVyJ3MgY3VycmVudAorICAgZGlyZWN0b3J5IGFuZCB0aGVuIGRvd25sb2FkcyBlYWNoIG9uZS4gVGhlIGxpc3QgbWlnaHQgaW5jbHVkZSBzaXplIGFuZAorICAgdGltZXN0YW1wIGluZm9ybWF0aW9uLCBpbiB3aGljaCBjYXNlIEtlcm1pdCBkb2VzIG5vdCBuZWVkIHRvIHNlbmQgU0laRQorICAgYW5kIE1EVE0gZGlyZWN0aXZlcyBmb3IgZWFjaCBmaWxlICh0aGlzIGlzIGFsd2F5cyB0cnVlIG9mIE1MU0QpLgorICAgbWdldCAvbWxzZCBmb28gTUxTRCBmb28gR2V0cyBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIncworICAgImZvbyIgZGlyZWN0b3J5ICh3aGVyZSB0aGUgc3RyaW5nICJmb28iIGRvZXMgbm90IGNvbnRhaW4gd2lsZGNhcmRzKQorICAgYW5kIHRoZW4gZG93bmxvYWRzIGVhY2ggb25lLiBJZiAiZm9vIiBpcyBhIHJlZ3VsYXIgZmlsZSBhbmQgbm90IGEKKyAgIGRpcmVjdG9yeSwgdGhpcyBjb21tYW5kIGlzIHN1cHBvc2VkIHRvIGZhaWwsIGJ1dCBzb21lIHNlcnZlcnMgaGF2ZQorICAgYmVlbiBvYnNlcnZlZCB0aGF0IHNlbmQgdGhlIGZpbGUuCisgICBtZ2V0IC9tbHNkICoudHh0IE1MU0QgR2V0cyBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIncworICAgY3VycmVudCBkaXJlY3RvcnkgYW5kIHRoZW4gZG93bmxvYWRzIG9ubHkgdGhlIG9uZXMgd2hvc2UgbmFtZXMgbWF0Y2gKKyAgIHRoZSBwYXR0ZXJuICIqLnR4dCIuIEJlY2F1c2Ugd2UgYXJlIHVzaW5nIE1MU0QgYW5kIHRoZSBNR0VUIGZpbGVzcGVjCisgICBpcyB3aWxkLCB3ZSBkbyBub3Qgc2VuZCB0aGUgZmlsZXNwZWMgdG8gdGhlIHNlcnZlciwgYnV0IHRyZWF0IGl0IGFzCisgICB0aG91Z2ggaXQgaGFkIGJlZW4gZ2l2ZW4gaW4gYSAvTUFUQ0g6IHN3aXRjaCBhbmQgdXNlIGl0IGxvY2FsbHkgdG8KKyAgIG1hdGNoIHRoZSBuYW1lcyBpbiB0aGUgbGlzdC4KKyAgIG1nZXQgL21sc2QgZm9vLyoudHh0IE1MU0QgVGhpcyBvbmUgd29uJ3Qgd29yayBiZWNhdXNlIE1MU0QgcmVxdWlyZXMKKyAgIHRoYXQgdGhlIG5vdGlvbnMgb2Ygc2VydmVyIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWUtbWF0Y2hpbmcgcGF0dGVybiBiZQorICAgc2VwYXJhdGVkLiBIb3dldmVyLCB0aGUgY2xpZW50LCB3aGljaCBjYW4ndCBiZSBleHBlY3RlZCB0byBrbm93IHRoZQorICAgc2VydmVyJ3MgZmlsZS1zeXN0ZW0gc3ludGF4LCB3aW5kcyB1cCBzZW5kaW5nIGEgcmVxdWVzdCB0aGF0IHRoZQorICAgc2VydmVyIHdpbGwgKG9yIHNob3VsZCkgcmVqZWN0LgorICAgbWdldCAvbWxzZCAvbWF0Y2g6Ki50eHQgTUxTRCBHZXRzIGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIGZyb20gdGhlCisgICBzZXJ2ZXIncyBjdXJyZW50IGRpcmVjdG9yeSBhbmQgdGhlbiBkb3dubG9hZHMgb25seSB0aGUgb25lcyB3aG9zZQorICAgbmFtZXMgbWF0Y2ggdGhlIHBhdHRlcm4gIioudHh0IiAoY2xpZW50IGludGVycHJldHMgd2lsZGNhcmRzKS4KKyAgIG1nZXQgL21sc2QgL21hdGNoOioudHh0IGZvbyBNTFNEIGZvbyBJZiAiZm9vIiBpcyBhIGRpcmVjdG9yeSBvbiB0aGUKKyAgIHNlcnZlciwgdGhpcyBnZXRzIGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIGZyb20gdGhlIHNlcnZlcidzICJmb28iCisgICBkaXJlY3RvcnkgYW5kIHRoZW4gZG93bmxvYWRzIG9ubHkgdGhlIG9uZXMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlCisgICBwYXR0ZXJuICIqLnR4dCIgKGNsaWVudCBpbnRlcnByZXRzIHdpbGRjYXJkcykuIFRoaXMgbGVhdmVzIHRoZSBzZXJ2ZXIKKyAgIENEJ2QgdG8gdGhlICJmb28iIGRpcmVjdG9yeTsgdGhlcmUncyBubyB3YXkgdGhlIGNsaWVudCBjYW4gcmVzdG9yZSB0aGUKKyAgIHNlcnZlcidzIG9yaWdpbmFsIGRpcmVjdG9yeSBiZWNhdXNlIE1MU0QgZG9lc24ndCBnaXZlIHRoYXQKKyAgIGluZm9ybWF0aW9uLCBhbmQgc2luY2UgdGhlIGNsaWVudCBjYW4gbm90IGJlIGV4cGVjdGVkIHRvIGtub3cgdGhlCisgICBzZXJ2ZXIncyBmaWxlLXN5c3RlbSBzeW50YXgsIGl0IHdvdWxkIG5vdCBiZSBzYWZlIHRvIGd1ZXNzLiBJZiAiZm9vIgorICAgaXMgYSByZWd1bGFyIGZpbGUsIE1MU0QgZmFpbHMuCisgICBtZ2V0IC9tbHNkIGZvbyBiYXIgTUxTRCBUaGlzIG9uZSBpcyBwcm9ibGVtYXRpYy4gWW91J3JlIHN1cHBvc2VkIHRvIGJlCisgICBhYmxlIHRvIGdpdmUgTUdFVCBhIGxpc3QgYSBmaWxlc3BlY3M7IGluIHRoaXMgY2FzZSB3ZSBuYW1lIHR3bworICAgZGlyZWN0b3JpZXMuIFRoZSBjbGllbnQgbXVzdCBjaGFuZ2UgdGhlIHNlcnZlcidzIGRpcmVjdG9yeSB0byAiZm9vIiB0bworICAgZ2V0IHRoZSBsaXN0IG9mIGZpbGVzLCBhbmQgdGhlbiB0aGUgZmlsZXMgdGhlbXNlbHZlcy4gQnV0IHRoZW4gaXQgaGFzCisgICBubyB3YXkgdG8gcmV0dXJuIHRvIHRoZSBzZXJ2ZXIncyBwcmV2aW91cyBkaXJlY3RvcnkgaW4gb3JkZXIgdG8gZG8gdGhlCisgICBzYW1lIGZvciAiYmFyIiwgYXMgZXhwbGFpbmVkIGluIHRoZSBwcmV2aW91cyBleGFtcGxlLgorICAgbWdldCAvbWxzZCAvbWF0Y2g6KiBbYWJjXSBNTFNEIFthYmNdIEluY2x1ZGluZyBhIC9NQVRDSDogc3dpdGNoIGZvcmNlcworICAgW2FiY10gdG8gYmUgc2VudCB0byB0aGUgc2VydmVyIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgd291bGQgbm9ybWFsbHkKKyAgIHRoaW5rIGl0IHdhcyBhIHdpbGRjYXJkIGFuZCBob2xkIGl0IGZvciBsb2NhbCBpbnRlcnByZXRhdGlvbi4gSW4gdGhpcworICAgZXhhbXBsZSwgW2FiY10gbWlnaHQgYmUgYSBWTVMgZGlyZWN0b3J5IG5hbWUuCisgICBtZ2V0IC9tbHNkIC9tYXRjaDoqIHQqLmggTUxTRCB0Ki5oIENvbnRyYXJ5IHRvIHRoZSBNTFNEIHNwZWNpZmljYXRpb24sCisgICBzb21lIE1MU0QtY2FwYWJsZSBGVFAgc2VydmVycyBkbyBpbnRlcnByZXQgd2lsZGNhcmRzLiBUaGlzIGZvcm0gb2YgdGhlCisgICBNR0VUIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSB3aWxkY2FyZCB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIKKyAgIGZvciBpbnRlcnByZXRhdGlvbi4KKworICAgV2hlbiBNTFNEIGlzIHVzZWQgaW1wbGljaXRseSAodGhhdCBpcywgd2l0aG91dCBhbiAvTUxTRCBzd2l0Y2ggZ2l2ZW4KKyAgIHRvIGZvcmNlIHRoZSB1c2Ugb2YgTUxTRCkgYW5kIGFuIE1HRVQgY29tbWFuZCBzdWNoIGFzICJtZ2V0IGZvby8qLnR4dCIKKyAgIGZhaWxzLCBLZXJtaXQgYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIE5MU1QgYW5kIHRyaWVzIGFnYWluLgorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAzLjExLjUuIFJlZmVyZW5jZXMKKworICAgIDEuIFBvc3RlbCwgSi4sIGFuZCBKLiBSZXlub2xkcywgRmlsZSBUcmFuc2ZlciBQcm90b2NvbCAoRlRQKSwgUkZDCisgICAgICAgOTU5LCBPY3RvYmVyIDE5ODU6IFszNjFdZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjOTU5LnR4dC4KKyAgICAyLiBIZXRobW9uLCBQLCBhbmQgUi4gRWx6LCBGZWF0dXJlIG5lZ290aWF0aW9uIG1lY2hhbmlzbSBmb3IgdGhlIEZpbGUKKyAgICAgICBUcmFuc2ZlciBQcm90b2NvbCwgUkZDIDIzODksIEF1Z3VzdCAxOTk4OgorICAgICAgIFszNjJdZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjMjM4OS50eHQuCisgICAgMy4gRWx6LCBSLCBhbmQgUC4gSGV0aG1vbiwgRXh0ZW5zaW9ucyB0byBGVFAsIEludGVybmV0IERyYWZ0CisgICAgICAgZHJhZnQtaWV0Zi1mdHBleHQtbWxzdC0xNi50eHQsIFNlcHRlbWJlciAyMDAyOgorICAgICAgIFszNjNdaHR0cDovL3d3dy5pZXRmLm9yZy9pbnRlcm5ldC1kcmFmdHMvZHJhZnQtaWV0Zi1mdHBleHQtbWxzdC0xNgorICAgICAgIC50eHQuCisgICAgNC4gWzM2NF1UaGUgS2VybWl0IEZUUCBDbGllbnQgKG92ZXJ2aWV3KS4KKworICAgWyBbMzY1XVRvcCBdIFsgWzM2Nl1GVFAgVG9wIF0gWyBbMzY3XUMtS2VybWl0IEhvbWUgXSBbIFszNjhdS2VybWl0CisgICBIb21lIF0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworNC4gRklMRSBTQ0FOTklORworCisgICBBIG5ldyBmZWF0dXJlIGNhbGxlZCBmaWxlIHNjYW5uaW5nIGlzIHVzZWQgaW4gdmFyaW91cyBjb250ZXh0cyB0bworICAgZGV0ZXJtaW5lIGlmIGEgZmlsZSBpcyB0ZXh0IG9yIGJpbmFyeSwgYW5kIGlmIGl0IGlzIHRleHQsIHdoYXQga2luZCBvZgorICAgdGV4dC4gVGhlIG92ZXJoZWFkIG9mIGZpbGUgc2Nhbm5pbmcgaXMgc3VycHJpc2luZ2x5IHRvbGVyYWJsZSwgdXN1YWxseQorICAgYWJvdXQgYSBxdWFydGVyIHNlY29uZCBwZXIgZmlsZS4gRmlsZSBzY2FubmluZyBpcyBub3cgdXNlZCBpbnN0ZWFkIG9mCisgICBmaWxlbmFtZSBwYXR0ZXJucyB1bmxlc3MgeW91IFNFVCBGSUxFIFNDQU4gT0ZGLCB3aGljaCByZXN0b3JlcyB0aGUKKyAgIHByZXZpb3VzIGJlaGF2aW9yLgorCisgICBUaGUgcHJpbWFyeSBiZW5lZml0IG9mIGZpbGUgc2Nhbm5pbmcgaXMgaW4gZmlsZSB0cmFuc2Zlci4gRm9yIGFsbAorICAgcHJhY3RpY2FsIHB1cnBvc2VzLCBub3cgeW91IGNhbiBzdG9wIHdvcnJ5aW5nIGFib3V0IHdoZXRoZXIgYSBmaWxlCisgICBzaG91bGQgYmUgc2VudCBpbiBiaW5hcnkgb3IgdGV4dCBtb2RlLCBvciBhYm91dCBzZW5kaW5nIG1peHR1cmVzIG9mCisgICB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLCBvciBjb25maWd1cmluZyBhbmQKKyAgIGZpbmUtdHVuaW5nIHlvdXIgbGlzdHMgb2YgYmluYXJ5LWZpbGUgYW5kIHRleHQtZmlsZSBuYW1lIHBhdHRlcm5zOiBub3cKKyAgIGl0IGFsbCBqdXN0IHdvcmtzLgorCisgICBGaWxlIHNjYW5uaW5nIGlzIGRvbmUgYnkgdGhlIGZpbGUgc2VuZGVyLCB3aGljaCBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mCisgICBlYWNoIGZpbGUgYmVmb3JlIGl0IHNlbmRzIGl0IGFuZCBpbmZvcm1zIHRoZSByZWNlaXZlciAoS2VybWl0IG9yIEZUUAorICAgc2VydmVyKSBvZiB0aGUgdHlwZS4gRmlsZSBzY2FubmluZyBpcyBOT1QgZG9uZSBieSB0aGUgcmVjZWl2ZXIsCisgICBiZWNhdXNlIGl0IGlzIHRoZSBzZW5kZXIncyByZXNwb25zaWJpbGl0eSB0byBkZXRlcm1pbmUgZWFjaCBmaWxlJ3MKKyAgIHR5cGUsIHNlbmQgdGhlIGZpbGUgaW4gdGhlIHJpZ2h0IG1vZGUsIGFuZCBpbmZvcm0gdGhlIHJlY2VpdmVyIG9mIHRoZQorICAgbW9kZS4gSWYgYm90aCB0cmFuc2ZlciBwYXJ0bmVycyBhcmUgY2FwYWJsZSBvZiB0aGlzIChvciBhbnkgb3RoZXIpCisgICBmb3JtIG9mIGF1dG9tYXRpYyB0ZXh0L2JpbmFyeSBtb2RlIHN3aXRjaGluZywgdGhlbiBmaWxlcyBjYW4gYmUgc2VudAorICAgaW4gYm90aCBkaXJlY3Rpb25zIHdpdGggbm8gd29ycmllcyBhYm91dCBjb3JydXB0aW9uIGR1ZSB0bworICAgaW5hcHByb3ByaWF0ZSB0cmFuc2ZlciBtb2RlLiAoQXMgbm90ZWQgaW4gWzM2OV1TZWN0aW9uIDMsIEZUUCBzZXJ2ZXJzCisgICBkb24ndCBkbyB0aGlzLCBzbyB0aGlzIGRpc2N1c3Npb24gZG9lcyBub3QgYXBwbHkgd2hlbiB1c2luZyBLZXJtaXQgdG8KKyAgIGRvd25sb2FkIGZyb20gYW4gRlRQIHNlcnZlci4pCisKKyAgIFRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbiBpcyBtYWlubHkgZm9yIHRoZSBjdXJpb3VzLiBJZiB5b3UgZG9uJ3QgcmVhZAorICAgaXQgYW5kIHNpbXBseSBhY2NlcHQgYWxsIGRlZmF1bHRzLCBldmVyeSBmaWxlIHlvdSBzZW5kIHNob3VsZCBnbyBpbgorICAgdGhlIGFwcHJvcHJpYXRlIG1vZGUgYXV0b21hdGljYWxseS4gQXMgYWx3YXlzLCBob3dldmVyLCBmb3IKKyAgIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gdG8gd29yayBmb3IgNy0gYW5kIDgtYml0IGNoYXJhY3Rlci1zZXQKKyAgIGZpbGVzLCB0aGUgYXBwcm9wcmlhdGUgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCBjb21tYW5kKHMpIG11c3QgaGF2ZQorICAgYmVlbiBleGVjdXRlZCB0byBpZGVudGlmeSB0aGVpciBlbmNvZGluZyAoS2VybWl0J3MgZGVmYXVsdCBmaWxlCisgICBjaGFyYWN0ZXItc2V0IGlzIG5ldXRyYWwgQVNDSUkgZXhjZXB0IG9uIHBsYXRmb3JtcyBsaWtlIEhQLVVYIG9yCisgICBERy9VWCwgd2hlcmUgdGhlIGRlZmF1bHQgZmlsZSBjaGFyYWN0ZXItc2V0IGlzIGtub3duKS4gQW5kIG9mIGNvdXJzZSwKKyAgIHJlY2VpdmluZyBpcyBhbm90aGVyIG1hdHRlciAtLSBvYnZpb3VzbHkgdGhlIG90aGVyIEtlcm1pdCBtdXN0IGFsc28KKyAgIHNlbmQgZWFjaCBmaWxlIGluIHRoZSBhcHByb3ByaWF0ZSBtb2RlLgorCisgICBTY2FubmluZyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gZmlsZW5hbWUgcGF0dGVybnMgc2ltcGx5IGJlY2F1c2UKKyAgIGZpbGVuYW1lcyBhcmUgbm90IHJlbGlhYmxlIGluZGljYXRvcnMgb2YgdGhlIGZpbGUncyBjb250ZW50cy4gQ2xhc3NpYworICAgZXhhbXBsZXMgaW5jbHVkZSAiLmRvYyIgZmlsZXMsIHdoaWNoIGFyZSBiaW5hcnkgaWYgTWljcm9zb2Z0IFdvcmQKKyAgIGRvY3VtZW50cyBidXQgdGV4dCBvbiBtb3N0IG90aGVyIHBsYXRmb3JtcywgYW5kICIuY29tIiBmaWxlcywgd2hpY2gKKyAgIGFyZSBiaW5hcnkgb24gRE9TIGFuZCBXaW5kb3dzIGJ1dCB0ZXh0IG9uIFZNUy4gQW55d2F5LCBub2JvZHkga25vd3MKKyAgIHRoZSBuYW1pbmcgY29udmVudGlvbnMgKGlmIGFueSkgb2YgYWxsIHRoZSBhcHBsaWNhdGlvbnMgKGFuZCBwZXJzb25zISkKKyAgIG9uIHlvdXIgY29tcHV0ZXIuIFNjYW5uaW5nLCBvbiB0aGUgb3RoZXIgaGFuZCwgZGV0ZXJtaW5lcyBlYWNoIGZpbGUncworICAgdHlwZSBieSBpbnNwZWN0aW5nIGl0cyBjb250ZW50cyByYXRoZXIgdGhhbiBqdXN0IGxvb2tpbmcgYXQgaXRzIG5hbWUuCisKKyAgIEFsc28sIGZpbGUgcGF0dGVybnMgLS0gZXZlbiB3aGVuIHRoZXkgd29yayBhcyBpbnRlbmRlZCAtLSBjYXRlZ29yaXplCisgICBlYWNoIGZpbGUgb25seSBhcyB0ZXh0IG9yIGJpbmFyeSwgd2hlcmVhcyBmaWxlIHNjYW5uaW5nIGNhbiBtYWtlIGZpbmVyCisgICBkaXN0aW5jdGlvbnM6CisKKyAgIEJJTkFSWQorICAgICAgICAgIEJpbmFyeSBkYXRhLCBub3QgdG8gYmUgY29udmVydGVkIGluIGFueSB3YXkuIEV4YW1wbGVzIGluY2x1ZGUKKyAgICAgICAgICBiaW5hcnkgbWFjaGluZSBjb2RlIChleGVjdXRhYmxlIHByb2dyYW1zKSwgZ3JhcGhpY3MgaW1hZ2VzCisgICAgICAgICAgKEdJRiwgSlBHLCBldGMpLCBjb21wcmVzc2VkIGZpbGVzIChaLCBHWiwgZXRjKSwgYXJjaGl2ZXMgYW5kCisgICAgICAgICAgcGFja2FnZXMgKFpJUCwgVEFSLCBSUE0sIGV0YyksIG9iamVjdCBmaWxlcyBhbmQgbGlicmFyaWVzIChPQkosCisgICAgICAgICAgRExMLCBldGMpLgorCisgICA3LUJJVCBURVhUCisgICAgICAgICAgVGV4dCBlbmNvZGVkIGluIGEgNy1iaXQgY2hhcmFjdGVyIHNldCBzdWNoIGFzIEFTQ0lJIG9yIG9uZSBvZgorICAgICAgICAgIHRoZSBJU08gNjQ2IG5hdGlvbmFsIHZlcnNpb25zLiBLZXJtaXQgaGFzIG5vIHdheSB0byB0ZWxsIHdoaWNoCisgICAgICAgICAgY2hhcmFjdGVyIGlzIHVzZWQsIG9ubHkgdGhhdCBpdCdzIDctYml0IHRleHQuIFR5cGljYWwgZXhhbXBsZXMKKyAgICAgICAgICBpbmNsdWRlIHByb2dyYW0gc291cmNlIGNvZGUsIFJFQURNRSBmaWxlcywgUGVybCBvciBLZXJtaXQKKyAgICAgICAgICBzY3JpcHRzLCBwbGFpbi10ZXh0IGVtYWlsLCBIVE1MLCBUZVgsIGFuZCB2YXJpb3VzIHRleHR1YWwKKyAgICAgICAgICBlbmNvZGluZ3Mgb2YgYmluYXJ5IGZpbGVzOiBIZXgsIEJhc2U2NCwgZXRjLiBXaGVuIHNlbmRpbmcgc3VjaAorICAgICAgICAgIGZpbGVzLCB0aGUgRklMRSBERUZBVUxUIDdCSVQtQ0hBUkFDVEVSLVNFVCBpcyB1c2VkIGFzIHRoZSBmaWxlCisgICAgICAgICAgY2hhcmFjdGVyLXNldCwgYW5kIHRoZW4gdGhlIGFwcHJvcHJpYXRlIHRyYW5zZmVyIGNoYXJhY3RlciBzZXQKKyAgICAgICAgICBpcyBjaG9zZW4gZnJvbSB0aGUgYXNzb2NpYXRpb25zIGxpc3QgKEFTU09DSUFURSwgU0hPVworICAgICAgICAgIEFTU09DSUFUSU9OUykuCisKKyAgIDgtQklUIFRFWFQKKyAgICAgICAgICBUZXh0IGVuY29kZWQgaW4gYW4gOC1iaXQgY2hhcmFjdGVyIHNldCBzdWNoIGFzIExhdGluLTEsCisgICAgICAgICAgTGF0aW4tMiwgTGF0aW4vSGVicmV3LCBMYXRpbi9DeXJpbGxpYywgS09JOCwgSFAtUm9tYW44LCBKSVMgWAorICAgICAgICAgIDAyMDgsIENvZGUgUGFnZSA0MzcsIG9yIENvZGUgUGFnZSAxMjUyLiBBZ2FpbiwgS2VybWl0IGhhcyBubworICAgICAgICAgIHdheSBvZiBrbm93aW5nIHdoaWNoIHBhcnRpY3VsYXIgc2V0IGlzIGluIHVzZSwgb25seSB0aGF0IGl0J3MKKyAgICAgICAgICA4LWJpdCB0ZXh0LiBXaGVuIHNlbmRpbmcgc3VjaCBmaWxlcywgdGhlIEZJTEUgREVGQVVMVAorICAgICAgICAgIDhCSVQtQ0hBUkFDVEVSLVNFVCBpcyB1c2VkIGFzIHRoZSBmaWxlIGNoYXJhY3Rlci1zZXQsIGFuZCB0aGVuCisgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHRyYW5zZmVyIGNoYXJhY3RlciBzZXQgaXMgY2hvc2VuIGZyb20gdGhlCisgICAgICAgICAgYXNzb2NpYXRpb25zIGxpc3QuCisKKyAgIFVDUzIgVEVYVAorICAgICAgICAgIFVuaWNvZGUgaW4gaXRzIGJhc2ljIGZvcm0sIDE2IGJpdHMgKDIgb2N0ZXRzKSBwZXIgY2hhcmFjdGVyLgorICAgICAgICAgIFdoZW4gc2VuZGluZyBzdWNoIGZpbGVzLCBVQ1MyIGlzIHRoZSBmaWxlIGNoYXJhY3Rlci1zZXQgYW5kIHRoZQorICAgICAgICAgIGJ5dGUgb3JkZXIgaXMgaWRlbnRpZmllZCBhdXRvbWF0aWNhbGx5OyB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgICB0cmFuc2ZlciBjaGFyYWN0ZXIgc2V0IGlzIGNob3NlbiBmcm9tIHRoZSBhc3NvY2lhdGlvbnMgbGlzdC4KKyAgICAgICAgICBOb3JtYWxseSB0aGlzIHdvdWxkIGJlIFVURjguIFVURi0xNiBpcyBub3Qgc3VwcG9ydGVkIHlldDsKKyAgICAgICAgICBLZXJtaXQncyBVbmljb2RlIHRyYW5zbGF0aW9ucyBhcmUgcmVzdHJpY3RlZCB0byBQbGFuZSAwLCB0aGUKKyAgICAgICAgICBCYXNlIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKS4KKworICAgVVRGOCBURVhUCisgICAgICAgICAgVW5pY29kZSBpbiBpdHMgOC1iaXQgdHJhbnNmb3JtYXRpb24gZm9ybWF0LiBXaGVuIHNlbmRpbmcgc3VjaAorICAgICAgICAgIGZpbGVzLCBVVEY4IGlzIHRoZSBmaWxlIGNoYXJhY3Rlci1zZXQ7IHRoZSBhcHByb3ByaWF0ZSB0cmFuc2ZlcgorICAgICAgICAgIGNoYXJhY3RlciBzZXQgaXMgY2hvc2VuIGZyb20gdGhlIGFzc29jaWF0aW9ucyBsaXN0LCBub3JtYWxseQorICAgICAgICAgIFVDUzIgb3IgVVRGOC4KKworICAgRmlsZSBzY2FubmluZyBpcyBhdmFpbGFibGUgaW4gVU5JWCBDLUtlcm1pdCwgaW4gSy05NSwgYW5kIHRvIGEgbGltaXRlZAorICAgZXh0ZW50LCBpbiBWTVMgQy1LZXJtaXQgKGZ1bGwgc2Nhbm5pbmcgaXMgcHJvYmxlbWF0aWMgaW4gVk1TIGJlY2F1c2UKKyAgIGV2ZW4gcGxhaW4tdGV4dCBmaWxlcyBtaWdodCBjb250YWluIGJpbmFyeSByZWNvcmQtZm9ybWF0IGluZm9ybWF0aW9uKS4KKyAgIFRoZSByZWxldmFudCBjb21tYW5kcyBhcmU6CisKKyAgIFNFVCBUUkFOU0ZFUiBNT0RFIHsgQVVUT01BVElDLCBNQU5VQUwgfQorICAgICAgICAgIFRlbGxzIHdoZXRoZXIgdGhlIGZpbGUtdHJhbnNmZXIgbW9kZSAodGV4dCBvciBiaW5hcnkpIHNob3VsZCBiZQorICAgICAgICAgIHNldCBieSBhdXRvbWF0aWMgb3IgIm1hbnVhbCIgbWVhbnMuIEFVVE9NQVRJQyBpcyB0aGUgZGVmYXVsdCwKKyAgICAgICAgICB3aGljaCBhbGxvd3MgYW55IG9mIHRoZSBhdXRvbWF0aWMgbWV0aG9kcyB0aGF0IGFyZSBlbmFibGVkIHRvCisgICAgICAgICAgZG8gdGhlaXIgam9iczogRklMRSBTQ0FOLCBGSUxFIFBBVFRFUk5TLCBwZWVyIHJlY29nbml0aW9uLCBldGMuCisgICAgICAgICAgTUFOVUFMIGxldHMgeW91IGNvbnRyb2wgdGhlIHRyYW5zZmVyIG1vZGUgd2l0aCB0aGUgU0VUIEZJTEUKKyAgICAgICAgICBUWVBFIGNvbW1hbmRzLiBBcyBhbHdheXMsIC9URVhUIGFuZCAvQklOQVJZIHN3aXRjaGVzIG9uIHlvdXIKKyAgICAgICAgICBmaWxlLXRyYW5zZmVyIGNvbW1hbmRzIG92ZXJyaWRlIGFsbCBvdGhlciBtZXRob2RzOyBpZiB5b3UgZ2l2ZQorICAgICAgICAgIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcywgc2Nhbm5pbmcgaXMgbm90IGRvbmUuIFNIT1cgVFJBTlNGRVIKKyAgICAgICAgICBkaXNwbGF5cyB0aGUgY3VycmVudCBUUkFOU0ZFUiBNT0RFIHNldHRpbmcuCisKKyAgIFNFVCBGSUxFIFNDQU4geyBPTiBbIG51bWJlciBdLCBPRkYgfQorICAgICAgICAgIFR1cm5zIHRoaXMgZmVhdHVyZSBvbiBhbmQgb2ZmLiBJdCdzIE9OIGJ5IGRlZmF1bHQuIFdoZW4gT0ZGLAorICAgICAgICAgIHRoZSBwcmV2aW91cyBydWxlcyBhcHBseSAoU0VUIEZJTEUgUEFUVEVSTlMsIGV0YykuIFdoZW4gT04gaXMKKyAgICAgICAgICBnaXZlbiwgeW91IGNhbiBhbHNvIHNwZWNpZnkgYSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgc2Nhbm5lZC4KKyAgICAgICAgICBUaGUgZGVmYXVsdCBpcyA0OTE1MiAoPSA0OEspLiBJZiBhIG5lZ2F0aXZlIG51bWJlciBpcyBnaXZlbiwKKyAgICAgICAgICB0aGUgZW50aXJlIGZpbGUgaXMgc2Nhbm5lZCwgbm8gbWF0dGVyIGhvdyBiaWcsIGZvciBtYXhpbXVtCisgICAgICAgICAgY2VydGFpbnR5IChmb3IgZXhhbXBsZSwgYSBQb3N0U2NyaXB0IGZpbGUgdGhhdCBhcHBlYXJzIHRvIGJlCisgICAgICAgICAgcGxhaW4gdGV4dCBtaWdodCBpbmNsdWRlIGFuIGVtYmVkZGVkIGdyYXBoaWMgcGFzdCB0aGUgbm9ybWFsCisgICAgICAgICAgc2Nhbm5pbmcgbGltaXQpLiBTSE9XIEZJTEUgZGlzcGxheXMgdGhlIGN1cnJlbnQgRklMRSBTQ0FOCisgICAgICAgICAgc2V0dGluZy4KKworICAgU0VUIEZJTEUgREVGQVVMVCA3QklULUNIQVJBQ1RFUi1TRVQgbmFtZQorICAgICAgICAgIFRlbGxzIHRoZSA3LWJpdCBjaGFyYWN0ZXItc2V0IHRvIHVzZSBpZiBzY2FubmluZyBpZGVudGlmaWVzIGEKKyAgICAgICAgICA3LWJpdCB0ZXh0IGZpbGUsIGUuZy4gR0VSTUFOLiBTSE9XIEZJTEUgZGlzcGxheXMgdGhlIGN1cnJlbnQKKyAgICAgICAgICBTRVQgRklMRSBERUZBVUxUIHNldHRpbmdzLiBTbyBkb2VzIFNIT1cgQ0hBUkFDVEVSLVNFVFMuCisKKyAgIFNFVCBGSUxFIERFRkFVTFQgOEJJVC1DSEFSQUNURVItU0VUIG5hbWUKKyAgICAgICAgICBUZWxscyB0aGUgOC1iaXQgY2hhcmFjdGVyLXNldCB0byB1c2UgaWYgc2Nhbm5pbmcgaWRlbnRpZmllcyBhbgorICAgICAgICAgIDgtYml0IHRleHQgZmlsZSwgZS5nLiBMQVRJTjEuIFNIT1cgRklMRSBhbmQgU0hPVyBDSEFSQUNURVItU0VUCisgICAgICAgICAgZGlzcGxheSB0aGlzLgorCisgICBBU1NPQ0lBVEUgRklMRS1DSEFSQUNURVItU0VUIGZjcyB0Y3MKKyAgICAgICAgICBXaGVuIHNlbmRpbmcgZmlsZXMgYW5kIGEgZmlsZSBjaGFyYWN0ZXItc2V0IChmY3MpIGlzIGlkZW50aWZpZWQKKyAgICAgICAgICBieSBzY2FubmluZywgdGhpcyB0ZWxscyBDLUtlcm1pdCB3aGljaCB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0CisgICAgICAgICAgKHRjcykgdG8gdHJhbnNsYXRlIGl0IHRvLiBJdCBhbHNvIGFsbG93cyBDLUtlcm1pdCB0byBzZXQgdGhlCisgICAgICAgICAgYXBwcm9wcmlhdGUgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCBhdXRvbWF0aWNhbGx5IHdoZW5ldmVyIHlvdQorICAgICAgICAgIGdpdmUgYSBTRVQgRklMRSBDSEFSQUNURVItU0VUIGNvbW1hbmQuCisKKyAgIEFTU09DSUFURSBUUkFOU0ZFUi1DSEFSQUNURVItU0VUIHRjcyBmY3MKKyAgICAgICAgICBXaGVuIHJlY2VpdmluZ2luZyBmaWxlcyBhbmQgYSBmaWxlIGFycml2ZXMgd2hvc2UgdHJhbnNmZXIKKyAgICAgICAgICBjaGFyYWN0ZXItc2V0ICh0Y3MpIGlzIGFubm91bmNlZCBieSB0aGUgc2VuZGVyLCB0aGlzIGNvbW1hbmQKKyAgICAgICAgICB0ZWxscyBDLUtlcm1pdCB3aGljaCBmaWxlIGNoYXJhY3Rlci1zZXQgKGZjcykgdG8gdHJhbnNsYXRlIGl0CisgICAgICAgICAgdG8uIEl0IGFsc28gYWxsb3dzIEMtS2VybWl0IHRvIHNldCB0aGUgYXBwcm9wcmlhdGUgZmlsZQorICAgICAgICAgIGNoYXJhY3Rlci1zZXQgd2hlbmV2ZXIgeW91IGdpdmUgYSBTRVQgVFJBTlNGRVIgQ0hBUkFDVEVSLVNFVAorICAgICAgICAgIGNvbW1hbmQuCisKKyAgIFNFVCBGSUxFIENIQVJBQ1RFUi1TRVQgbmFtZQorICAgICAgICAgIFdoZW4gZ2l2ZW4gZm9yIGEgNy1iaXQgc2V0LCBhbHNvIHNldHMgRklMRSBERUZBVUxUCisgICAgICAgICAgN0JJVC1DSEFSQUNURVItU0VUIHRvIHRoZSBzYW1lIHNldC4gV2hlbiBnaXZlbiBmb3IgYW4gOC1iaXQKKyAgICAgICAgICBzZXQsIGFsc28gc2V0cyBGSUxFIERFRkFVTFQgOEJJVC1DSEFSQUNURVItU0VUIHRvIHRoZSBzYW1lIHNldC4KKyAgICAgICAgICBJZiBhbiBBU1NPQ0lBVEUgRklMRS1DSEFSQUNURVItU0VUIGNvbW1hbmQgaGFzIGJlZW4gZ2l2ZW4gZm9yCisgICAgICAgICAgdGhpcyBzZXQsIGFsc28gc2V0cyB0aGUgY29ycmVzcG9uZGluZyB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0LgorCisgICBESVJFQ1RPUlkgL1hGRVJNT0RFIFsgZmlsZXNwZWMgXQorICAgICAgICAgIFBlcmZvcm1zIGEgZmlsZSBzY2FuIG9mIHRoZSBnaXZlbiBmaWxlcywgbGlzdGluZyB0aGUgcmVzdWx0IGZvcgorICAgICAgICAgIGVhY2ggZmlsZS4gSWYgRklMRSBTQ0FOIGlzIE9GRiBidXQgUEFUVEVSTlMgYXJlIE9OLCB0aGUgcmVzdWx0CisgICAgICAgICAgc2hvd24gYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IEZJTEUgVEVYVC1QQVRURVJOUyBhbmQKKyAgICAgICAgICBCSU5BUlktUEFUVEVSTlMsIGFuZCBhcmUgcmVzdHJpY3RlZCB0byAoQikgYW5kIChUKS4gV2hlbiBGSUxFCisgICAgICAgICAgU0NBTiBpcyBPTiwgdGhlIHJlc3VsdHMgYXJlOgorCisgIChCKSAgICAgICAgICBCaW5hcnkKKyAgKFQpKDdCSVQpICAgIFRleHQ6IDctYml0CisgIChUKSg4QklUKSAgICBUZXh0OiA4LWJpdAorICAoVCkoVVRGOCkgICAgVGV4dDogVW5pY29kZSBVVEY4CisgIChUKShVQ1MyQkUpICBUZXh0OiBVbmljb2RlIFVDUzIgQmlnIEVuZGlhbgorICAoVCkoVUNTMkxFKSAgVGV4dDogVW5pY29kZSBVQ1MyIExpdHRsZSBFbmRpYW4KKworICAgICAgICAgIFNvIHlvdSBjYW4gdXNlIERJUiAvWEZFUiB0byBnZXQgYSBwcmV2aWV3IG9mIGhvdyBlYWNoIGZpbGUgaW4gYQorICAgICAgICAgIHNlbGVjdGVkIGdyb3VwIHdpbGwgYmUgdHJhbnNmZXJyZWQuIEV2ZXJ5dGhpbmcgdG8gdGhlIHJpZ2h0IG9mCisgICAgICAgICAgdGhlIChCKSBvciAoVCkgaXMgbmV3LiBJZiBGSUxFIFNDQU4gaXMgT0ZGLCB5b3Ugb25seSBnZXQgdGhlCisgICAgICAgICAgKEIpIG9yIChUKSBhcyBiZWZvcmUuCisKKyAgICAgICAgICBOb3RlOiBCaWcgYW5kIExpdHRsZSBFbmRpYW4gcmVmZXIgdG8gdGhlIG9yZGVyaW5nIG9mIGJ5dGVzCisgICAgICAgICAgd2l0aGluIGEgY29tcHV0ZXIgd29yZC4gQmlnIEVuZGlhbiBhcmNoaXRlY3R1cmUgaXMgc3RhbmRhcmQgYW5kCisgICAgICAgICAgaXMgdXNlZCBvbiBtb3N0IG5vbi1QQyBjb21wdXRlcnMuIExpdHRsZSBFbmRpYW4gYXJjaGl0ZWN0dXJlIGlzCisgICAgICAgICAgdXNlZCBvbiBQQ3MuCisKKyAgIFRvIGlsbHVzdHJhdGUgZmlsZS10cmFuc2ZlciB3aXRoIHNjYW5uaW5nLCBzdXBwb3NlIHlvdSBoYXZlIGEKKyAgIGRpcmVjdG9yeSBjb250YWluaW5nIGEgbWl4dHVyZSBvZiB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMsIGFuZCBlYWNoIHRleHQKKyAgIGZpbGUgY2FuIGJlIDctYml0IEdlcm1hbiBJU08gNjQ2LCA4LWJpdCBMYXRpbi0xLCBvciBVbmljb2RlIGluIGFueSBvZgorICAgdGhlIGZvbGxvd2luZyBmb3JtczogVUNTMiBMaXR0bGUgRW5kaWFuLCBVQ1MyIEJpZyBFbmRpYW4sIG9yIFVURjgKKyAgIChbMzcwXVVURi0xNiBpcyBub3Qgc3VwcG9ydGVkIHlldCkuIEFzc3VtaW5nIGFsbCB0aGUgYnVpbHQtaW4gZGVmYXVsdHMKKyAgIGFyZSBpbiBlZmZlY3QsIHRoZSBmb2xsb3dpbmcgdGhyZWUgY29tbWFuZHMgZG8gdGhlIGpvYjoKKworICBzZXQgZmlsZSBjaGFyIGdlcm1hbiAgIDsgVGhpcyBzZXRzIHRoZSBkZWZhdWx0IGZvciA3LWJpdCB0ZXh0IGZpbGVzCisgIHNldCBmaWxlIGNoYXIgbGF0aW4xICAgOyBUaGlzIHNldHMgdGhlIGRlZmF1bHQgZm9yIDgtYml0IHRleHQgZmlsZXMKKyAgc2VuZCAqCisKKyAgIEVhY2ggZmlsZSBpcyBzZW50IGluIHRoZSBhcHByb3ByaWF0ZSBtb2RlICh0ZXh0IG9yIGJpbmFyeSksIHdpdGggdGV4dAorICAgZmlsZXMgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IGFuZCBsYWJlbGVkCisgICBzbyB0aGUgcmVjZWl2ZXIgY2FuIGNvbnZlcnQgdGhlbSBhY2NvcmRpbmcgdG8gaXRzIG93biBsb2NhbAorICAgY29udmVudGlvbnMuCisKKyAgIEJ5IHRoZSB3YXksIHdoYXQgaWYgeW91IHdhbnQgdG8gaW5oaWJpdCBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGJ1dAorICAgc3RpbGwgYWxsb3cgYXV0b21hdGljIHRleHQvYmluYXJ5IG1vZGUgc3dpdGNoaW5nPyBQcmV2aW91c2x5LCB5b3UKKyAgIGNvdWxkIHNpbXBseSBTRVQgVFJBTlNGRVIgQ0hBUkFDVEVSLVNFVCBUUkFOU1BBUkVOVC4gQnV0IG5vdyB3aXRoIGZpbGUKKyAgIHNjYW5uaW5nLCB0aGUgZmlsZSBhbmQgdHJhbnNmZXIgY2hhcmFjdGVyLXNldHMgYXJlIHNldCBhdXRvbWF0aWNhbGx5CisgICBwZXIgZmlsZS4gQSBuZXcgY29tbWFuZCB3YXMgYWRkZWQgZm9yIHRoaXMgcHVycG9zZToKKworICAgU0VUIFRSQU5TRkVSIFRSQU5TTEFUSU9OIHsgT04sIE9GRiB9CisgICAgICAgICAgRW5hYmxlcyBhbmQgZGlzYWJsZXMgZmlsZS10cmFuc2ZlciBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uLgorICAgICAgICAgIEl0IGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKworICAgV2hlbiBUUkFOU0ZFUiBUUkFOU0xBVElPTiBpcyBPRkYgYnV0IEZJTEUgU0NBTiBpcyBPTiwgZmlsZXMgYXJlIHN0aWxsCisgICBzY2FubmVkIHRvIHNlZSBpZiB0aGV5IGFyZSB0ZXh0IG9yIGJpbmFyeSwgYnV0IG5vIGNoYXJhY3Rlci1zZXQKKyAgIHRyYW5zbGF0aW9uIGlzIGRvbmUgd2hlbiB0aGV5IHRleHQ6IG9ubHkgdGhlIG5vcm1hbCByZWNvcmQtZm9ybWF0CisgICBjb252ZXJzaW9uLgorCisgICBMaWtlIGFsbCBTRVQgY29tbWFuZHMsIFNFVCBUUkFOU0ZFUiBUUkFOU0xBVElPTiBpcyBnbG9iYWwgYW5kCisgICBwZXJzaXN0ZW50LiBZb3UgY2FuIGFsc28gZm9yY2UgYSBwYXJ0aWN1bGFyIGZpbGUtdHJhbnNmZXIgY29tbWFuZAorICAgKFNFTkQsIE1TRU5ELCBHRVQsIFJFQ0VJVkUsIFRSQU5TTUlULCBldGMpIHRvIG5vdCB0cmFuc2xhdGUgd2l0aG91dAorICAgYWZmZWN0aW5nIHRoZSBnbG9iYWwgdHJhbnNsYXRpb24gc2V0dGluZ3MgYnkgaW5jbHVkaW5nIHRoZSBuZXcKKyAgIC9UUkFOU1BBUkVOVCBzd2l0Y2gsIGUuZy4KKworICBzZW5kIC90cmFuc3BhcmVudCBvb2ZhLnR4dAorCisgICBBcyBvZiBDLUtlcm1pdCA4LjAuMjA2LCBTRVQgVFJBTlNGRVIgQ0hBUkFDVEVSLVNFVCBUUkFOU1BBUkVOVCBpbXBsaWVzCisgICBTRVQgVFJBTlNGRVIgVFJBTlNMQVRJT04gT0ZGLgorCisgICBGaWxlIHNjYW5uaW5nIGlzIGFsc28gdXNlZCBpbiB0aGUgVFlQRSBjb21tYW5kLiBUaGUgc291cmNlIGZpbGUgdHlwZQorICAgYW5kIGNoYXJhY3RlciBzZXQgYXJlIGRldGVybWluZWQgYXMgYWJvdmUsIGFuZCB0aGVuIHRoZSBmaWxlIGlzCisgICBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byB5b3VyIGRpc3BsYXkgY2hhcmFjdGVyLXNldCwgbGluZSBieSBsaW5lLgorICAgSW4gS2VybWl0IDk1LCB0aGUgZGlzcGxheSBjaGFyYWN0ZXItc2V0IGlzIFVuaWNvZGUsIHBlcmhhcHMgY29udmVydGVkCisgICB0byB5b3VyIGN1cnJlbnQgY29uc29sZSBjb2RlIHBhZ2U7IGluIG90aGVyIHZlcnNpb25zIG9mIEMtS2VybWl0LCBpdAorICAgaXMgeW91ciBjdXJyZW50IGZpbGUgY2hhcmFjdGVyLXNldC4gVGh1cyBpZiB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIHNldAorICAgYXBwcmlhdGVseToKKworICBTRVQgRklMRSBDSEFSQUNURVItU0VUIChuZWNlc3NhcnkgaW4gVW5peCBidXQgbm90IEs5NSkKKyAgU0VUIEZJTEUgREVGQVVMVCA3QklUIENIQVJBQ1RFUi1TRVQKKyAgU0VUIEZJTEUgREVGQVVMVCA4QklUIENIQVJBQ1RFUi1TRVQKKworICAgdGhlbiB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gVFlQRSBhbnkgdGV4dCBmaWxlIGFuZCBzZWUgc29tZXRoaW5nCisgICByZWFzb25hYmxlLiBGb3IgZXhhbXBsZSwgaW4gVW5peCwgaWYgeW91ciBERUZBVUxUIDdCSVQtQ0hBUkFDVEVSLVNFVAorICAgaXMgSVRBTElBTiBhbmQgeW91ciBERUZBVUxUIDhCSVQtQ0hBUkFDVEVSLVNFVCBpcyBMQVRJTjEsIGFuZCB5b3VyCisgICBGSUxFIENIQVJBQ1RFUi1TRVQgaXMgTEFUSU4xLCB5b3UgY2FuIFRZUEUgYW4gSXRhbGlhbiBJU08gNjQ2IGZpbGUsIGEKKyAgIExhdGluLTEgZmlsZSwgb3IgYW55IGtpbmQgb2YgVW5pY29kZSBmaWxlLCBhbmQgaGF2ZSBpdCB0cmFuc2xhdGVkCisgICBhdXRvbWF0aWNhbGx5IHRvIExhdGluLTEgZm9yIHlvdXIgZGlzcGxheS4KKworICAgSW4gdGhlIEdVSSB2ZXJzaW9uIG9mIEtlcm1pdCA5NSwgeW91IGNhbiBzZWUgbWl4dHVyZXMgb2YgbWFueQorICAgZGlmZmVyZW50IHNjcmlwdHMgaWYgdGhlIGZpbGUgaXMgVVRGOCBvciBVQ1MyOiBSb21hbiwgQ3lyaWxsaWMsCisgICBIZWJyZXcsIEdyZWVrLCBBcm1lbmlhbiwgR2VvcmdpYW4sIGV0YywgYWxsIG9uIHRoZSBzYW1lIHNjcmVlbiBhdAorICAgb25jZS4KKworICAgRmlsZSBzY2FubmluZyBhbHNvIGFkZHMgYSBuZXcgY3JpdGVyaW9uIGZvciBmaWxlIHNlbGVjdGlvbiwgaS5lLiB0bworICAgc2VsZWN0IG9ubHkgdGV4dCAob3IgYmluYXJ5KSBmaWxlcy4gU2V2ZXJhbCBjb21tYW5kcyBub3cgaW5jbHVkZSBhIG5ldworICAgc3dpdGNoLCAvVFlQRTp7QklOQVJZLFRFWFQsQUxMfS4gQklOQVJZIG1lYW5zIHNlbGVjdCBvbmx5IGJpbmFyeQorICAgcmVndWxhciBmaWxlcyAobm90IGRpcmVjdG9yaWVzKS4gVEVYVCBtZWFucyBzZWxlY3Qgb25seSB0ZXh0IGZpbGVzLgorICAgQUxMIG1lYW5zIGRvbid0IHNjYW47IHNlbGVjdCBhbGwgZmlsZXMuIEV4YW1wbGVzOgorCisgICBTRU5EIC9UWVBFOkJJTkFSWSAqLioKKyAgICAgICAgICBTZW5kcyBvbmx5IGJpbmFyeSBmaWxlcywgc2tpcHBpbmcgb3ZlciB0ZXh0IGZpbGVzLgorCisgICBOT1RFOiBGaWxlIHNjYW5uaW5nIGlzIE5PVCBkb25lIHdoZW4gdXNpbmcgZXh0ZXJuYWwgcHJvdG9jb2xzIChiZWNhdXNlCisgICB0aGUgZXh0ZXJuYWwgcHJvdG9jb2wgcHJvZ3JhbXMsIHN1Y2ggYXMgc3osIGFyZSBwcm9jZXNzaW5nIGVhY2ggZmlsZSwKKyAgIG5vdCBLZXJtaXQpLgorCisgICBESVJFQ1RPUlkgL1RZUEU6VEVYVAorICAgICAgICAgIExpc3RzIG9ubHkgdGV4dCBmaWxlcyBidXQgbm90IGJpbmFyeSBmaWxlcy4KKworICAgREVMRVRFIC9UWVBFOkJJTkFSWSBmb28uKgorICAgICAgICAgIERlbGV0ZXMgYWxsIGZvby4qIGZpbGVzIHRoYXQgYXJlIHJlZ3VsYXIgYmluYXJ5IGZpbGVzIGJ1dCBkb2VzCisgICAgICAgICAgbm90IGRlbGV0ZSBhbnkgdGV4dCBmaWxlcy4KKworICAgQ0hNT0QgL1RZUEU6QklOQVJZIDc3NSAqCisgICAgICAgICAgKFVOSVgpIENoYW5nZXMgdGhlIHBlcm1pc3Npb25zIG9mIGFsbCBiaW5hcnkgZmlsZXMgdG8gNzc1LgorCisgICBXaGVuIEZJTEUgU0NBTiBpcyBPRkYgYW5kIEZJTEUgUEFUVEVSTlMgYXJlIE9OLCBiZWhhdmlvciBpcyBhcyBiZWZvcmUKKyAgIHdpdGggUEFUVEVSTlMgT04sIGJ1dCB3aXRoIHNvbWUgaW1wcm92ZW1lbnRzOgorCisgICAgICogUGF0aG5hbWVzIGFyZSBub3cgc3RyaXBwZWQgcHJpb3IgdG8gcGF0dGVybiBtYXRjaGluZy4KKyAgICAgKiBCYWNrdXAgc3VmZml4ZXMgKGxpa2UgLn4zfikgYXJlIHN0cmlwcGVkIHByaW9yIHRvIHBhdHRlcm4KKyAgICAgICBtYXRjaGluZy4KKworICAgWyBbMzcxXVRvcCBdIFsgWzM3Ml1Db250ZW50cyBdIFsgWzM3M11DLUtlcm1pdCBIb21lIF0gWyBbMzc0XUtlcm1pdAorICAgSG9tZSBdCisgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKzUuIEZJTEUgQU5EIERJUkVDVE9SWSBOQU1FUyBDT05UQUlOSU5HIFNQQUNFUworCisgICBQcmlvciB0byB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UgKEdVSSksIGl0CisgICB3YXMgaW5jb25jZWl2YWJsZSB0aGF0IGZpbGUgb3IgZGlyZWN0b3J5IG5hbWVzIGNvdWxkIGNvbnRhaW4gc3BhY2VzLAorICAgYmVjYXVzZSBzcGFjZSBpcyBhIGZpZWxkIGRlbGltaXRlciBpbiBhbGwgY29tbWFuZCBsYW5ndWFnZXMuIEdVSXMsCisgICBob3dldmVyLCB1c2UgZGlhbG9nIGJveGVzIGZvciBmaWxlbmFtZXMsIHNvIHRoZXJlIGlzIG5ldmVyIGFueQorICAgcXVlc3Rpb24gb2YgZGlzdGluZ3Vpc2hpbmcgYSBmaWxlbmFtZSBmcm9tIGFkamFjZW50IGZpZWxkcyAtLSBiZWNhdXNlCisgICB0aGVyZSBhcmUgbm8gYWRqYWNlbnQgZmllbGRzIC0tIGFuZCB0aGVyZWZvcmUgaXQgaGFzIGJlY29tZSBxdWl0ZQorICAgY29tbW9uIG9uIGNvbXB1dGVycyB0aGF0IGhhdmUgR1VJcyB0byBoYXZlIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcworICAgY29tcG9zZWQgb2YgbXVsdGlwbGUgd29yZHMuIE9mIGNvdXJzZSB0aGlzIHBvc2VzIHByb2JsZW1zIGZvciBjb21tYW5kCisgICBzaGVsbHMgYW5kIG90aGVyIHRleHQtb3JpZW50ZWQgcHJvZ3JhbXMuCisKKyAgIE1vc3QgY29tbWFuZCBzaGVsbHMgYWRkcmVzcyB0aGVzZSBwcm9ibGVtcyBieSBhbGxvd2luZyBzdWNoIG5hbWVzIHRvCisgICBiZSBlbmNsb3NlZCBpbiBkb3VibGVxdW90ZXMsIGUuZy46CisKKyAgY2QgImM6XFByb2dyYW0gRmlsZXMiCisKKyAgIEMtS2VybWl0IHByZXZpb3VzbHkgdXNlZCBicmFjZXMgZm9yIHRoaXM6CisKKyAgY2Qge2M6XFByb2dyYW0gRmlsZXN9CisKKyAgIHdoaWNoIHdhcyBub3Qgd2hhdCBtb3N0IHBlb3BsZSBleHBlY3RlZC4gQW5kIGV2ZW4gd2hlbiBicmFjZXMgd2VyZQorICAgdXNlZCwgS2VybWl0IGhhZCBkaWZmaWN1bHRpZXMgd2l0aCBjb21wbGV0aW9uLCBmaWxlIG1lbnVzLCBhbmQgc28KKyAgIGZvcnRoLCB3aXRoaW4gYnJhY2VkIGZpZWxkcy4KKworICAgQy1LZXJtaXQgOC4wIGFsbG93cyBlaXRoZXIgZG91YmxlcXVvdGVzIG9yIGJyYWNlcyB0byBiZSB1c2VkIGZvcgorICAgZ3JvdXBpbmc6CisKKyAgc2VuZCAidGhpcyBmaWxlIgorICBzZW5kIHt0aGlzIGZpbGV9CisgIHJlbmFtZSAidGhpcyBmaWxlIiAidGhhdCBmaWxlIgorICByZW5hbWUge3RoaXMgZmlsZX0gInRoYXQgZmlsZSIKKyAgcmVuYW1lICJ0aGlzIGZpbGUiIHt0aGF0IGZpbGV9CisgIGNkIHtQcm9ncmFtIEZpbGVzfQorICBjZCAiUHJvZ3JhbSBGaWxlcyIKKworICAgTm90ZSB0aGF0IHRoZSBkb3VibGVxdW90ZXMgb3IgYnJhY2tldHMgbXVzdCBlbmNsb3NlIHRoZSB3aG9sZSBmaWxlIG9yCisgICBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbjoKKworICAiYzpcTXkgRGlyZWN0b3J5IgorCisgICBub3Q6CisKKyAgYzpcIk15IERpcmVjdG9yeSIKKworICAgSW4gQy1LZXJtaXQgOC4wLCB5b3UgY2FuIGFsc28gdXNlIGNvbXBsZXRpb24gb24gdGhlc2UgZmlsZW5hbWVzLCBpbgorICAgd2hpY2ggY2FzZSBLZXJtaXQgc3VwcGxpZXMgdGhlIHF1b3RlcyAob3IgYnJhY2VzKSBhdXRvbWF0aWNhbGx5LgorICAgRXhhbXBsZSAoaW4gd2hpY2ggdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGNvbnRhaW5zIG9ubHkgb25lIGZpbGUgd2hvc2UKKyAgIG5hbWUgc3RhcnRzIHdpdGggInRoIiBhbmQgaXRzIGZ1bGwgbmFtZSBpcyAidGhpcyBmaWxlIiAod2l0aG91dCB0aGUKKyAgIHF1b3RlcywgYnV0IHdpdGggdGhlIHNwYWNlKSk6CisKKyAgY2F0IHRoPFRhYj4KKworICAgS2VybWl0IHJlcGFpbnRzIHRoZSBmaWxlbmFtZSBmaWVsZCBsaWtlIHRoaXM6CisKKyAgY2F0ICJ0aGlzIGZpbGUiCisKKyAgIFRoYXQgaXMsIGl0IGJhY2tzcGFjZXMgb3ZlciB0aGUgb3JpZ2luYWwgInRoIiBhbmQgdGhlbiB3cml0ZXMgdGhlCisgICBmaWxlbmFtZSBpbiBkb3VibGVxdW90ZXMuCisKKyAgIElmIGNvbXBsZXRpb24gaXMgb25seSBwYXJ0aWFsLCBLZXJtaXQgc3RpbGwgc3VwcGxpZXMgdGhlIHF1b3RlcywgYnV0CisgICBpbiB0aGlzIGNhc2UgYWxzbyBiZWVwcy4gVG8gY29udGludWUgdGhlIGZpbGVuYW1lLCB5b3UgbXVzdCBmaXJzdAorICAgYmFja3NwYWNlIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuIFRoZSBjbG9zaW5nIHF1b3RlIGlzIHN1cHBsaWVkIGluCisgICB0aGlzIGNhc2UgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGNhbiBzZWUgdGhlIHNwYWNlcywgZXNwZWNpYWxseSBpZiB0aGV5CisgICBhcmUgdHJhaWxpbmcuIEZvciBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgY29udGFpbnMgdHdvIGZpbGVzCisgICB3aG9zZSBuYW1lcyBzdGFydCB3aXRoICJ0aCIsIGFuZCB0aGVpciBmaWxsIG5hbWVzIGFyZSAidGhpcyBmaWxlIiBhbmQKKyAgICJ0aGlzIG90aGVyIGZpbGUiOgorCisgIGNhdCB0aDxUYWI+CisKKyAgIEtlcm1pdCBwcmludHM6CisKKyAgY2F0ICJ0aGlzICI8QmVlcD4KKworICAgSWYgaXQgZGlkbid0IHByaW50IHRoZSBjbG9zaW5nIHF1b3RlLCB5b3Ugd291bGQgcHJvYmFibHkgd29uZGVyIHdoeSBpdAorICAgd2FzIGJlZXBpbmcuCisKKyAgIEFsc28sIGlmIHlvdSBiZWdpbiBhIGZpbGVuYW1lIGZpZWxkIHdpdGggYSBkb3VibGVxdW90ZSBvciBvcGVuaW5nCisgICBicmFjZSwgbm93IHlvdSBjYW4gdXNlIGNvbXBsZXRpb24gb3IgZ2V0ID8taGVscDsgdGhpcyB3YXMgbmV2ZXIKKyAgIHBvc3NpYmxlIGJlZm9yZS4KKworIEMtS2VybWl0PnR5cGUgInRoaT8gSW5wdXQgZmlsZSBzcGVjaWZpY2F0aW9uLCBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgIHRoaXMgZmlsZSAgICAgICAgdGhpcyBvdGhlciBmaWxlCisgQy1LZXJtaXQ+dHlwZSAidGhpXworCisgICBbIFszNzVdVG9wIF0gWyBbMzc2XUNvbnRlbnRzIF0gWyBbMzc3XUMtS2VybWl0IEhvbWUgXSBbIFszNzhdS2VybWl0CisgICBIb21lIF0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworNi4gT1RIRVIgQ09NTUFORCBQQVJTSU5HIElNUFJPVkVNRU5UUworCisgIDYuMS4gR3JvdXBpbmcgTWFjcm8gQXJndW1lbnRzCisKKyAgIERvdWJsZXF1b3RlcyBub3cgY2FuIGJlIHVzZWQgaW4gbWFjcm8gaW52b2NhdGlvbnMgdG8gZ3JvdXAgYXJndW1lbnRzCisgICBjb250YWluaW5nIHNwYWNlcywgd2hlcmUgcHJldmlvdXNseSBvbmx5IGJyYWNlcyBjb3VsZCBiZSB1c2VkOgorCisgIGRlZmluZSB4eCBzaG93IGFyZ3MKKyAgeHggb25lICJ0aGlzIGlzIHR3byIgdGhyZWUKKworICAgUmVzdWx0OgorCisgIE1hY3JvIGFyZ3VtZW50cyBhdCBsZXZlbCAwIChcdihhcmdjKSA9IDQpOgorICAgXCUwID0geHgKKyAgIFwlMSA9IG9uZQorICAgXCUyID0gdGhpcyBpcyB0d28KKyAgIFwlMyA9IHRocmVlCisKKyAgIEFsc28sIHlvdSBjYW4gbm93IHF1b3RlIGJyYWNlcyBhbmQgcXVvdGVzIGluIG1hY3JvIGFyZ3MgKHRoaXMgZGlkbid0CisgICB3b3JrIGJlZm9yZSkuIEV4YW1wbGVzOgorCisgIHh4ICJ7IiAgOyBUaGUgYXJndW1lbnQgaXMgYSBzaW5nbGUgbGVmdCBicmFjZQorICB4eCB7In0gIDsgVGhlIGFyZ3VtZW50IGlzIGEgZG91YmxlcXVvdGUgY2hhcmFjdGVyCisKKyAgIEluIGNhc2UgdGhpcyBuZXcgYmVoYXZpb3IgaW50ZXJmZXJlcyB3aXRoIHlvdXIgc2NyaXB0cywgeW91IGNhbgorICAgcmVzdG9yZSB0aGUgcHJldmlvdXMgYmVoYXZpb3Igd2l0aDoKKworICBTRVQgQ09NTUFORCBET1VCTEVRVU9USU5HIE9GRgorCisgIDYuMi4gRGlyZWN0b3J5IGFuZCBGaWxlIE5hbWUgQ29tcGxldGlvbgorCisgICBDLUtlcm1pdCA4LjAgYWxzbyBpbmNsdWRlcyBiZXR0ZXIgY29tcGxldGlvbiBmb3IgZGlyZWN0b3J5IG5hbWVzLCBlLmcuCisgICBpbiB0aGUgQ0QgY29tbWFuZC4gSWYgdGhlIG5hbWUgdHlwZWQgc28gZmFyIHVuaXF1ZWx5IG1hdGNoZXMgYQorICAgZGlyZWN0b3J5IG5hbWUsIGl0IGlzIGNvbXBsZXRlZCAoYXMgYmVmb3JlKSwgYnV0IG5vdyBpZiB0aGUgZGlyZWN0b3J5CisgICBjb250YWlucyBhbnkgc3ViZGlyZWN0b3JpZXMsIGNvbXBsZXRpb24gaXMgcGFydGlhbCAoYWxsb3dpbmcgeW91IHRvCisgICBzdXBwbHkgYWRkaXRpb25hbCBwYXRoIHNlZ21lbnRzIHdpdGhvdXQgYmFja3NwYWNpbmcpOyBvdGhlcndpc2UgaXQgaXMKKyAgIGNvbXBsZXRlLgorCisgICBDb21wbGV0aW9uIGhhcyBhbHNvIGJlZW4gaW1wcm92ZWQgZm9yIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyB0aGF0CisgICBjb250YWluIG5vdCBvbmx5IHNwYWNlcyAoYXMgZGVzY3JpYmVkIGFib3ZlKSBidXQgYWxzbyAibWV0YWNoYXJhY3RlcnMiCisgICBzdWNoIGFzIGFzdGVyaXNrICgqKSBhbmQgdGlsZGUgKH4pOiBub3cgdGhlIGZpZWxkIGlzIHJlcGFpbnRlZCBpZgorICAgbmVjZXNzYXJ5LiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGNvbnRhaW5zIG9ubHkgb25lCisgICBmaWxlIHdob3NlIG5hbWUgY29udGFpbnMgImJsYWgiLCB0aGVuIGluOgorCisgIHR5cGUgKmJsYWg8VGFiPgorCisgICAiKmJsYWgiIGlzIHJlcGxhY2VkIGJ5IHRoZSBmaWxlbmFtZS4gSW4gZWFybGllciByZWxlYXNlcywgdGhlIHBhcnQKKyAgIHR5cGVkIHNvIGZhciB3YXMgbGVmdCBvbiB0aGUgY29tbWFuZCBsaW5lIChhbmQgaW4gdGhlIGhpc3RvcnkgYnVmZmVyKSwKKyAgIHNvIGV2ZW4gd2hlbiB0aGUgb3JpZ2luYWwgY29tbWFuZCB3b3JrZWQsIHRoZSByZWNhbGxlZCB2ZXJzaW9uIHdvdWxkCisgICBub3QuIFNpbWlsYXJseSBmb3IgfiAodGhlIG5lYXJseS11bml2ZXJzYWwgVW5peCBub3RhdGlvbiBmb3IKKyAgIHVzZXJuYW1lKToKKworICB0eXBlIH5vbGdhL3g8VGFiPgorCisgICBpcyByZXBhaW50ZWQgYXMgKGUuZy4pOgorCisgIHR5cGUgL3VzZXJzL2hvbWUvb2xnYS94KEJlZXApCisKKyAgIFNwZWFraW5nIG9mIGNvbW1hbmQgaGlzdG9yeSwgdGhlIG5ldyBTSE9XIEhJU1RPUlkgY29tbWFuZCBzaG93cyB5b3VyCisgICBjb21tYW5kIGhpc3RvcnkgYW5kIHJlY2FsbCBidWZmZXIuIFNBVkUgQ09NTUFORCBISVNUT1JZIHNhdmVzIGl0IGludG8KKyAgIGEgZmlsZSBvZiB5b3VyIGNob2ljZS4KKworICA2LjMuIFBhc3NpbmcgQXJndW1lbnRzIHRvIENvbW1hbmQgRmlsZXMKKworICAgVGhlIG1ldGhvZCBmb3IgcGFzc2luZyBhcmd1bWVudHMgdG8gY29tbWFuZCBmaWxlcyBoYXMgYmVlbiBpbXByb3ZlZC4KKyAgIFByaW9yIHRvIEMtS2VybWl0IDcuMCB0aGVyZSB3YXMgbm8gcHJvdmlzaW9uIGZvciBkb2luZyB0aGlzLiBJbgorICAgQy1LZXJtaXQgNy4wLCB0aGUgVEFLRSBjb21tYW5kIHdhcyBjaGFuZ2VkIHRvIGFsbG93IGFyZ3VtZW50cyB0byBiZQorICAgZ2l2ZW4gYWZ0ZXIgdGhlIGZpbGVuYW1lOgorCisgIHRha2UgY29tbWFuZGZpbGUgYXJnMSBhcmcyIC4uLgorCisgICBUaGlzIHdhcyBhY2NvbXBsaXNoZWQgYnkgcmVwbGFjaW5nIHRoZSBjdXJyZW50IFwlMSwgXCUyLCBldGMsIHdpdGggdGhlCisgICBnaXZlbiBhcmd1bWVudHMsIHNpbmNlIGEgbmV3IHNldCBvZiBtYWNybyBhcmd1bWVudCB2YXJpYWJsZXMgaXMKKyAgIGNyZWF0ZWQgb25seSB3aGVuIGEgbWFjcm8gaXMgZXhlY3V0ZWQsIG5vdCBhIGNvbW1hbmQgZmlsZS4gSXQgaXMgbXVjaAorICAgbW9yZSBpbnR1aXRpdmUsIGhvd2V2ZXIsIGlmIGFyZ3VtZW50cyB0byBjb21tYW5kIGZpbGVzIHdvcmtlZCBsaWtlCisgICB0aG9zZSB0byBtYWNyb3M6IHRoZSBjb21tYW5kIGZpbGUgc2VlcyB0aGUgYXJndW1lbnRzIGFzIGl0cyBvd24gXCUxLAorICAgXCUyLCBldGMsIGJ1dCB0aGUgY2FsbGVyJ3MgdmFyaWFibGVzIGFyZSBub3QgZGlzdHVyYmVkLiBDLUtlcm1pdCA4LjAKKyAgIGFjY29tcGxpc2hlcyB0aGlzIGJ5IGF1dG9tYXRpY2FsbHkgY3JlYXRpbmcgYW4gaW50ZXJtZWRpYXRlIHRlbXBvcmFyeQorICAgbWFjcm8gdG8gc3RhcnQgdGhlIGNvbW1hbmQgZmlsZSAoaWYgYW55IGFyZ3VtZW50cyB3ZXJlIGdpdmVuKSwgdGh1cworICAgY3JlYXRpbmcgYSBuZXcgbGV2ZWwgb2YgYXJndW1lbnRzIGFzIGV4cGVjdGVkLgorCisgIDYuNC4gTW9yZS1Qcm9tcHRpbmcKKworICAgVGhlIGZhbWlsaWFyIC0tbW9yZT8tLSBwcm9tcHQgdGhhdCBhcHBlYXJzIGF0IHRoZSBlbmQgb2YgZWFjaAorICAgc2NyZWVuZnVsIG9mIGNvbW1hbmQtcmVzcG9uc2Ugb3V0cHV0IG5vdyBhY2NlcHRzIGEgbmV3IGFuc3dlcjogRyAoR28pCisgICBtZWFuaW5nICJzaG93IGFsbCB0aGUgcmVzdCB3aXRob3V0IHBhdXNpbmcgYW5kIGFza2luZyBtZSBhbnkgbW9yZQorICAgcXVlc3Rpb25zIi4gUCAoUHJvY2VlZCkgaXMgYSBzeW5vbnltIGZvciBHLgorCisgIDYuNS4gQ29tbWFzIGluIE1hY3JvIERlZmluaXRpb25zCisKKyAgIEFzIG5vdGVkIGluIHRoZSBbMzc5XUMtS2VybWl0IG1hbnVhbCwgY29tbWEgaXMgdXNlZCB0byBzZXBhcmF0ZQorICAgY29tbWFuZHMgaW4gYSBtYWNybyBkZWZpbml0aW9uLiBFdmVuIHdoZW4gdGhlIG1hY3JvIGlzIGRlZmluZWQgb24KKyAgIG11bHRpcGxlIGxpbmVzIHVzaW5nIGN1cmx5LWJyYWNlIGJsb2NrLXN0cnVjdHVyZSBub3RhdGlvbiB3aXRob3V0CisgICBjb21tYXMsIHRoZSBkZWZpbml0aW9uIGlzIHN0aWxsIHN0b3JlZCBpbnRlcm5hbGx5IGFzIGEgY29tbWEtc2VwYXJhdGVkCisgICBsaXN0IG9mIGNvbW1hbmRzLiBUaGVyZWZvcmUgc3BlY2lhbCB0cmlja3MgYXJlIG5lZWRlZCB0byBpbmNsdWRlIGEKKyAgIGNvbW1hIGluIGEgY29tbWFuZC4gVGhlIGNsYXNzaWMgZXhhbXBsZSBpczoKKworICBkZWZpbmUgZm9vIHsKKyAgICAgIChzb21lIGNvbW1hbmQpCisgICAgICBpZiBmYWlsIGVjaG8gU29ycnksIGJsYWggZmFpbGVkLi4uCisgIH0KKworICAgVGhpcyB3b3VsZCByZXN1bHQgaW4gS2VybWl0IHRyeWluZyB0byBleGVjdXRlIGEgImJsYWgiIGNvbW1hbmQuIFRoaXMKKyAgIGNvdWxkIGFsd2F5cyBiZSBoYW5kbGVkIGJ5IGVuY2xvc2luZyB0aGUgdGV4dCBpbiBicmFjZXM6CisKKyAgZGVmaW5lIGZvbyB7CisgICAgICAoc29tZSBjb21tYW5kKQorICAgICAgaWYgZmFpbCBlY2hvIHtTb3JyeSwgYmxhaCBmYWlsZWQuLi59CisgIH0KKworICAgYnV0IGRvdWJsZXF1b3RlcyAobW9yZSBpbnR1aXRpdmUpIHNob3VsZCBoYXZlIHdvcmtlZCB0b28uIE5vdyB0aGV5IGRvOgorCisgIGRlZmluZSBmb28geworICAgICAgKHNvbWUgY29tbWFuZCkKKyAgICAgIGlmIGZhaWwgZWNobyAiU29ycnksIGJsYWggZmFpbGVkLi4uIgorICB9CisKKyAgNi42LiBBcnJvdyBLZXlzCisKKyAgIEFzIG9mIHZlcnNpb24gOC4wLjIwMSwgQy1LZXJtaXQgb24gbW9zdCBwbGF0Zm9ybXMgbGV0cyB5b3UgYWNjZXNzIHRoZQorICAgY29tbWFuZCBoaXN0b3J5IGJ1ZmZlciB3aXRoIGFycm93IGtleXMsIGp1c3QgYXMgeW91IGFsd2F5cyBjb3VsZCB3aXRoCisgICBjb250cm9sIGNoYXJhY3RlcnMuIFRoZSByZXN0cmljdGlvbnMgYXJlOgorCisgICAgMS4gT25seSBVcCBhbmQgRG93biBhcnJvdyBrZXlzIGFyZSBhY2NlcHRlZC4KKyAgICAyLiBPbmx5IDctYml0IEFOU0kgYXJyb3cta2V5IHNlcXVlbmNlcyBhcmUgdW5kZXJzdG9vZCAoRVNDIGZvbGxvd2VkCisgICAgICAgYnkgWyBvciB1cHBlcmNhc2UgbGV0dGVyIE8sIGZvbGxvd2VkIGJ5IHVwcGVyY2FzZSBsZXR0ZXIgQSBvciAodXApCisgICAgICAgQiAoZG93bikuCisKKyAgIFRoaXMgY2hhbmdlIHdhcyBtYWRlIHRvIGZhY2lsaXRhdGUgY29tbWFuZCByZWNhbGwgaW4gTGludXgtYmFzZWQgUERBcworICAgdGhhdCBkb24ndCBoYXZlIGEgQ29udHJvbCBrZXksIG9yIGF0IGxlYXN0IG5vdCBvbmUgdGhhdCdzIGVhc2lseSAob3IKKyAgIGFsd2F5cykgYWNjZXNzaWJsZSwgc3VjaCBhcyB0aGUgU2hhcnAgWmF1cnVzIFNMNTUwMC4KKworICAgWyBbMzgwXVRvcCBdIFsgWzM4MV1Db250ZW50cyBdIFsgWzM4Ml1DLUtlcm1pdCBIb21lIF0gWyBbMzgzXUtlcm1pdAorICAgSG9tZSBdCisgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKzcuIE5FVyBDT01NQU5EUyBBTkQgU1dJVENIRVMKKworICAgU2VlIFszODRdU2VjdGlvbiA0IGZvciBtb3JlIGFib3V0IGZpbGUgc2Nhbm5pbmcgYW5kIHRoZSAvVFlQRTogc3dpdGNoLgorCisgICBBU0tbUV0gWyAvVElNRU9VVDpudW1iZXIgL1FVSUVUIC9ERUZBVUxUOnRleHQgXSB2YXJpYWJsZSBbIHByb21wdCBdCisgICAgICAgICAgVGhlIG5ldyBvcHRpb25hbCAvVElNRU9VVDogc3dpdGNoIGZvciBBU0sgYW5kIEFTS1EgY2F1c2VzIHRoZQorICAgICAgICAgIGNvbW1hbmQgdG8gdGltZSBvdXQgYW5kIGFuZCBmYWlsIGlmIG5vIHJlc3BvbnNlIGlzIGdpdmVuIHdpdGhpbgorICAgICAgICAgIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY29uZHMsIDEgb3IgZ3JlYXRlciAoMCBvciBsZXNzIG1lYW5zCisgICAgICAgICAgbm8gdGltZW91dCwgd2FpdCBmb3JldmVyKS4gVGhpcyB3b3JrcyBqdXN0IGxpa2UgU0VUIEFTSy1USU1FUiwKKyAgICAgICAgICBleGNlcHQgaXRzIGVmZmVjdCBpcyBsb2NhbCB0byB0aGUgQVNLIGNvbW1hbmQgd2l0aCB3aGljaCBpdCBpcworICAgICAgICAgIGdpdmVuIGFuZCBpdCBkb2VzIG5vdCBkaXN0dXJiIHRoZSBnbG9iYWwgYXNrIHRpbWVyIHNldHRpbmcuIFRoZQorICAgICAgICAgIG5ldyAvUVVJRVQgc3dpdGNoIHRlbGxzIEtlcm1pdCBub3QgdG8gcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBpZgorICAgICAgICAgIHRoZSBBU0sgb3IgQVNLUSBjb21tYW5kIHRpbWVzIG91dCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlLgorCisgICAgICAgICAgVmVyc2lvbiA4LjAuMjExIGFkZHMgdGhlIC9ERUZBVUxUOnRleHQgc3dpdGNoIGZvciBBU0stQ2xhc3MKKyAgICAgICAgICBjb21tYW5kcyAoQVNLLCBBU0tRLCBhbmQgR0VUT0spLiBUaGlzIGxldHMgeW91IHN1cHBseSBhIGRlZmF1bHQKKyAgICAgICAgICBhbnN3ZXIgaW4gY2FzZSB0aGUgdXNlciBzdXBwbGllcyBhbiBlbXB0eSBhbnN3ZXIgb3IgdGhlCisgICAgICAgICAgL1RJTUVPVVQ6IHN3aXRjaCB3YXMgaW5jbHVkZWQgYW5kIHRoZSB0aW1lIGxpbWl0IGV4cGlyZWQKKyAgICAgICAgICB3aXRob3V0IGFuIGFuc3dlci4gSW4gYm90aCB0aGVzZSBjYXNlcywgdGhlIGNvbW1hbmQgc3VjY2VlZHMuCisKKyAgIENBVCBmaWxlbmFtZQorICAgICAgICAgIEVxdWl2YWxlbnQgdG8gVFlQRSAvTk9QQUdFLgorCisgICBDRFVQCisgICAgICAgICAgQ2hhbmdlcyBLZXJtaXQncyBsb2NhbCB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgcGFyZW50IG9mIHRoZQorICAgICAgICAgIGN1cnJlbnQgb25lLiBFcXVpdmFsZW50IHRvICJjZCAuLiIgaW4gVU5JWCBvciBXaW5kb3dzLCAiY2QgWy1dIgorICAgICAgICAgIGluIFZNUywgImNkIF4iIGluIEFPUy9WUywgZXRjOyBpbiBvdGhlciB3b3JkcywgaXQncyBhCisgICAgICAgICAgcGxhdGZvcm0taW5kZXBlbmRlbnQgd2F5IG9mIG1vdmluZyBvbmUgbGV2ZWwgdXAgaW4gYSBkaXJlY3RvcnkKKyAgICAgICAgICB0cmVlLgorCisgICBDSE1PRCBbIHN3aXRjaGVzIF0gcGVybWlzc2lvbiBmaWxlcworICAgICAgICAgIFVOSVggb25seS4gU2V0cyBmaWxlIHBlcm1pc3Npb25zIGZvciBvbmUgb3IgbW9yZSBmaWxlcyBvcgorICAgICAgICAgIGRpcmVjdG9yaWVzLiBUaGUgcGVybWlzc2lvbiBtdXN0IGJlIGdpdmVuIGFzIGFuIG9jdGFsIG51bWJlciwKKyAgICAgICAgICBlLmcuIDY2NCwgNzU1LiBTd2l0Y2hlczogL0RJUkVDVE9SSUVTLCAvRklMRVMsIC9OT0xJU1QsIC9QQUdFLAorICAgICAgICAgIC9ET1RGSUxFUywgL0xJU1QsIC9OT1BBR0UsIC9SRUNVUlNJVkUsIC9UWVBFOntURVhULEJJTkFSWSxBTEx9LAorICAgICAgICAgIC9TSU1VTEFURS4gVGhlIC9UWVBFOiBzd2l0Y2ggYWxsb3dzIHNlbGVjdGlvbiBvZiBvbmx5IHRleHQgb3IKKyAgICAgICAgICBiaW5hcnkgZmlsZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIG1peHR1cmUgb2Ygc291cmNlCisgICAgICAgICAgZmlsZXMgYW5kIGV4ZWN1dGFibGVzLCB5b3UgY2FuIHVzZSAiY2htb2QgL2ZpbGVzIC90eXBlOnRleHQKKyAgICAgICAgICA2NjQiIHRvIGdpdmUgb3duZXIvZ3JvdXAgcmVhZC93cml0ZSBhbmQgd29ybGQgcmVhZCBwZXJtaXNzaW9uCisgICAgICAgICAgdG8gdGhlIHRleHQgZmlsZXMsIGFuZCAiY2htb2QgL2ZpbGVzIC90eXBlOmJpbmFyeSA3NzUiIHRvIGdpdmUKKyAgICAgICAgICB0aGUgc2FtZSBwbHVzIGV4ZWN1dGUgcGVybWlzc2lvbiB0byB0aGUgZXhlY3V0YWJsZXMuIFVzZQorICAgICAgICAgIC9TSU1VTEFURSB0byBzZWUgd2hpY2ggZmlsZXMgd291bGQgYmUgYWZmZWN0ZWQsIHdpdGhvdXQKKyAgICAgICAgICBhY3R1YWxseSBjaGFuZ2luZyB0aGVpciBwZXJtaXNzaW9ucy4KKworICAgQ0xFQVIgS0VZQk9BUkQtQlVGRkVSCisgICAgICAgICAgRmx1c2hlcyBhbnkgYXMteWV0IHVucmVhZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGtleWJvYXJkIGlucHV0CisgICAgICAgICAgYnVmZmVyLiBVc2VmdWwgZm9yIGZsdXNoaW5nIHR5cGVhaGVhZCBpbiBzY3JpcHRzLgorCisgICBDT05USU5VRQorICAgICAgICAgIFdoZW4gZ2l2ZW4gYXQgYW4gaW50ZXJhY3RpdmUgY29tbWFuZCBwcm9tcHQgdGhhdCB3YXMgcmVhY2hlZCBieQorICAgICAgICAgIGlzc3VpbmcgYSBQUk9NUFQgY29tbWFuZCAoZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbikgZnJvbSBhCisgICAgICAgICAgc2NyaXB0LCB0aGlzIGNvbW1hbmQgcmV0dXJucyB0byB0aGUgc2NyaXB0LCBjb250aW51aW5nIGl0cworICAgICAgICAgIGV4ZWN1dGlvbiBhdCB0aGUgY29tbWFuZCBhZnRlciB0aGUgUFJPTVBUIGNvbW1hbmQuIEluIHRoaXMKKyAgICAgICAgICBjb250ZXh0LCBDT05USU5VRSBpcyBzaW1wbHkgYSBtb3JlLWludHVpdGl2ZSBzeW5vbnltIGZvciBFTkQuCisKKyAgIENPUFksIFJFTkFNRSwgYW5kIFRSQU5TTEFURQorICAgICAgICAgIFRoZXNlIGNvbW1hbmRzIG5vdyB3b3JrIG9uIGZpbGUgZ3JvdXBzIGlmIHRoZSB0YXJnZXQgZmlsZW5hbWUKKyAgICAgICAgICBpcyBhIGRpcmVjdG9yeSwgZS5nLiAiY29weSBvb2ZhLiogLi4iLCAicmVuYW1lICogfm9sZ2EvdG1wLyIKKworICAgQ09QWSAvQVBQRU5EIHNvdXJjZSBkZXN0aW5hdGlvbgorICAgICAgICAgIFRoZSBzb3VyY2UgZmlsZSBzcGVjaWZpY2F0aW9uIGNhbiBub3cgaW5jbHVkZSB3aWxkY2FyZHMsIGluCisgICAgICAgICAgd2hpY2ggY2FzZSBhbGwgb2YgdGhlIHNvdXJjZSBmaWxlcyB0aGF0IG1hdGNoIHdpbGwgZ28gaW50byB0aGUKKyAgICAgICAgICBkZXN0aW5hdGlvbiBmaWxlIGluIGFscGhhYmV0aWNhbCBvcmRlciBieSBuYW1lLgorCisgICBERUxFVEUgL0FTSworICAgICAgICAgIEFza3MgcGVybWlzc2lvbiB0byBkZWxldGUgZWFjaCBmaWxlIGJlZm9yZSBkZWxldGluZyBpdC4gSW4KKyAgICAgICAgICBDLUtlcm1pdCA3LjAsIHRoZSBhbnN3ZXJzIHdlcmUgInllcyIgKG9yICJvayIpIGFuZCAibm8iLgorICAgICAgICAgIEMtS2VybWl0IDguMCBhZGRzICJnbyIgKG1lYW5pbmcsIGRlbGV0ZSBhbGwgdGhlIHJlc3Qgd2l0aG91dAorICAgICAgICAgIGFza2luZykgYW5kICJxdWl0IiAoY2FuY2VsIHRoZSBERUxFVEUgY29tbWFuZCBhbmQgcmV0dXJuIHRvIHRoZQorICAgICAgICAgIHByb21wdCkuCisKKyAgIERFTEVURSAvRElSRUNUT1JJRVMKKyAgICAgICAgICBEZWxldGVzIG5vdCBvbmx5IGZpbGVzIGJ1dCBhbHNvIGRpcmVjdG9yaWVzLgorCisgICBERUxFVEUgL1JFQ1VSU0lWRQorICAgICAgICAgIERlbGV0ZXMgYWxsIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGZpbGUgc3BlY2lmaWNhdGlvbiBpbgorICAgICAgICAgIHRoZSBjdXJyZW50IChvciBnaXZlbikgZGlyZWN0b3J5IGFuZCBhbGwgZGlyZWN0b3JpZXMgYmVuZWF0aAorICAgICAgICAgIGl0LgorCisgICBERUxFVEUgL1NVTU1BUlkKKyAgICAgICAgICBQcmludHMgb25seSB0aGUgbnVtYmVyIG9mIGZpbGVzIGRlbGV0ZWQgYW5kIHRvdGFsIHNpemUgZnJlZWQsCisgICAgICAgICAgd2l0aG91dCBsaXN0aW5nIGVhY2ggZmlsZS4KKworICAgREVMRVRFIC9UUkVFCisgICAgICAgICAgU2hvcnRoYW5kIGZvciBERUxFVEUgL1JFQ1VSU0lWRSAvRElSRUNUT1JJRVMgL0RPVEZJTEVTLy4KKyAgICAgICAgICBFcXVpdmFsZW50IHRvIFdpbmRvd3MgREVMVFJFRSBvciBVbml4ICJybSAtUmYiLiBJZiBubyBmaWxlCisgICAgICAgICAgc3BlY2lmaWNhdGlvbiBpcyBnaXZlbiwgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwKKyAgICAgICAgICBwbHVzIGFsbCBvZiBpdHMgc3ViZGlyZWN0b3JpZXMgYW5kIHRoZWlyIGNvbnRlbnRzLCBhcmUgZGVsZXRlZC4KKworICAgREVMRVRFIC9UWVBFOkJJTkFSWQorICAgICAgICAgIERlbGV0ZSBvbmx5IHJlZ3VsYXIgYmluYXJ5IGZpbGVzIChyZXF1aXJlcyBGSUxFIFNDQU4gT04pLgorCisgICBERUxFVEUgL1RZUEU6VEVYVAorICAgICAgICAgIERlbGV0ZSBvbmx5IHJlZ3VsYXIgdGV4dCBmaWxlcyAocmVxdWlyZXMgRklMRSBTQ0FOIE9OKS4KKworICAgRElSRUNUT1JZIFsgc3dpdGNoZXMgXSBbIGZpbGVzcGVjIFsgZmlsZXNwZWMgWyBmaWxlc3BlYyAuLi4gXSBdIF0KKyAgICAgICAgICBUaGUgRElSRUNUT1JZIGNvbW1hbmQgbm93IGFjY2VwdHMgbW9yZSB0aGFuIG9uZSBmaWxlCisgICAgICAgICAgc3BlY2lmaWNhdGlvbjsgZS5nLiAiZGlyZWN0b3J5IG1vb24udHh0IHN1bi5kb2Mgc3RhcnMuKiIuCisKKyAgIERJUkVDVE9SWSAvTk9SRUNVUlNJVkUgeHh4CisgICAgICAgICAgSWYgeHh4IGlzIGEgZGlyZWN0b3J5IG5hbWUsIGZvcmNlcyBsaXN0aW5nIG9mIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICBpdHNlbGYgcmF0aGVyIHRoYW4gaXRzIGNvbnRlbnRzLgorCisgICBESVJFQ1RPUlkgL0ZPTExPV0xJTktTIHh4eAorICAgICAgICAgIChVTklYIG9ubHkpIFRlbGxzIHRoZSBESVJFQ1RPUlkgY29tbWFuZCB0byBmb2xsb3cgc3ltYm9saWMKKyAgICAgICAgICBsaW5rcy4gVGhpcyBub3QgdGhlIGRlZmF1bHQgYmVjYXVzZSBpdCBjYW4gY2F1c2UgZW5kbGVzcyBsb29wcy4KKworICAgRElSRUNUT1JZIC9OT0ZPTExPV0xJTktTIHh4eAorICAgICAgICAgIChVTklYIG9ubHkpIFRlbGxzIHRoZSBESVJFQ1RPUlkgY29tbWFuZCBub3QgdG8gZm9sbG93IHN5bWJvbGljCisgICAgICAgICAgbGlua3MsIGJ1dCByYXRoZXIsIG1lcmVseSB0byBsaXN0IHRoZW0uIFRoaXMgaXMgdGhlIGRlZmF1bHQuCisKKyAgIERJUkVDVE9SWSAvT1VUUFVUOmZpbGVuYW1lCisgICAgICAgICAgU2VuZHMgdGhlIHJlc3VsdHMgb2YgdGhlIERJUkVDVE9SWSBjb21tYW5kIHRvIHRoZSBnaXZlbiBmaWxlLgorCisgICBESVJFQ1RPUlkgL1NVTU1BUlkKKyAgICAgICAgICBQcmludHMgb25seSB0aGUgbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyBhbmQgdGhlIHRvdGFsCisgICAgICAgICAgc2l6ZSwgd2l0aG91dCBsaXN0aW5nIGVhY2ggZmlsZS4KKworICAgRElSRUNUT1JZIC9UWVBFOntURVhULEJJTkFSWX0KKyAgICAgICAgICBTaG93cyBvbmx5IGZpbGVzIG9mIHRoZSBzZWxlY3RlZCB0eXBlLCBiYXNlZCBvbiBmaWxlIHNjYW4uCisKKyAgIERJUkVDVE9SWSAvWEZFUk1PREUKKyAgICAgICAgICBOb3cgc2hvd3MgcmVzdWx0cyBvZiBmaWxlIHNjYW4gKHNlZSBbMzg1XVNlY3Rpb24gNCkuCisKKyAgIEZPUEVOIFsgc3dpdGNoZXMgXSBjaGFubmVsIGZpbGVuYW1lCisKKyAgICAgICAgICBBcyBvZiB2ZXJzaW9uIDguMC4yMTEsIEZPUEVOIGFsbG93cyAvZGV2L3R0eSBhcyBhIGZpbGVuYW1lIGluCisgICAgICAgICAgVW5peC1iYXNlZCBvcGVyYXRpbmcgc3lzdGVtcy4KKworICAgRlJFQUQgL1RSSU0KKyAgICAgICAgICAoOC4wLjIxMSkgVHJpbXMgYW55IHRyYWlsaW5nIGJsYW5rcyBvciB0YWJzIGZyb20gdGhlIGl0ZW0gKHN1Y2gKKyAgICAgICAgICBhcyBhIGxpbmUgb2YgdGV4dCkgdGhhdCBpdCBoYXMgcmVhZC4KKworICAgRlJFQUQgL1VOVEFCSUZZCisgICAgICAgICAgKDguMC4yMTEpIENvbnZlcnRzIEhvcml6b250YWwgVGFiIGNoYXJhY3RlcnMgdG8gdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgbnVtYmVyIG9mIHNwYWNlcywgYmFzZWQgb24gVlQxMDAtbGlrZSB0YWIgc3RvcHMKKyAgICAgICAgICAoMSw5LDE3LDI1LC4uLikuCisKKyAgIEdSRVAgWyBzd2l0Y2hlcyBdIHBhdHRlcm4gZmlsZXMKKyAgICAgICAgICBTaW1pbGFyIHRvIFVuaXggZ3JlcCBjb21tYW5kOiBkaXNwbGF5cyBmaWxlIGxpbmVzIHRoYXQgbWF0Y2gKKyAgICAgICAgICB0aGUgZ2l2ZW4gWzM4Nl1wYXR0ZXJuLiBTd2l0Y2hlczoKKworICAgICAgICAvQ09VTlRbOnZhcmlhYmxlXQorICAgICAgICAgICAgICAgIERvbid0IHNob3cgdGhlIG1hdGNoaW5nIGxpbmVzLCBqdXN0IHRlbGwgaG93IG1hbnkgbGluZXMKKyAgICAgICAgICAgICAgICBtYXRjaC4gSWYgYSB2YXJpYWJsZSBuYW1lIGlzIHNwZWNpZmllZCwgdGhlIGNvdW50IGlzCisgICAgICAgICAgICAgICAgc3RvcmVkIGluIHRoZSBnaXZlbiB2YXJpYWJsZS4KKworICAgICAgICAvRE9URklMRVMKKyAgICAgICAgICAgICAgICBJbmNsdWRlIGZpbGVzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggZG90LgorCisgICAgICAgIC9MSU5FTlVNQkVSUworICAgICAgICAgICAgICAgIFNob3cgbGluZSBudW1iZXJzIG9mIG1hdGNoaW5nIGxpbmVzLgorCisgICAgICAgIC9OQU1FT05MWQorICAgICAgICAgICAgICAgIG9ubHkgbGlzdCB0aGUgbmFtZXMgb2YgZmlsZXMgdGhhdCBjb250YWluIG1hdGNoaW5nIGxpbmVzLAorICAgICAgICAgICAgICAgIGJ1dCBub3QgdGhlIGxpbmVzIHRoZW1zZWx2ZXMuCisKKyAgICAgICAgL05PQkFDS1VQCisgICAgICAgICAgICAgICAgU2tpcCBiYWNrdXAgZmlsZXMuCisKKyAgICAgICAgL05PQ0FTRQorICAgICAgICAgICAgICAgIElnbm9yZSBhbHBoYWJldGljIGNhc2Ugd2hpbGUgcGF0dGVybiBtYXRjaGluZy4KKworICAgICAgICAvTk9ET1RGSUxFUworICAgICAgICAgICAgICAgIHNraXAgZmlsZXMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCBkb3QgKHBlcmlvZCkuCisKKyAgICAgICAgL05PTElTVAorICAgICAgICAgICAgICAgIFN1cHByZXNzIG91dHB1dCBidXQgc2V0IFNVQ0NFU1Mgb3IgRkFJTFVSRSBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICAgICBzZWFyY2ggcmVzdWx0LgorCisgICAgICAgIC9OT01BVENICisgICAgICAgICAgICAgICAgTG9vayBmb3IgbGluZXMgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4uCisKKyAgICAgICAgL05PUEFHRQorICAgICAgICAgICAgICAgIERvbid0IHBhdXNlIGJldHdlZW4gc2NyZWVucyBvZiBvdXRwdXQuCisKKyAgICAgICAgL09VVFBVVDpmaWxlbmFtZQorICAgICAgICAgICAgICAgIFdyaXRlIHJlc3VsdHMgaW50byB0aGUgZ2l2ZW4gZmlsZS4KKworICAgICAgICAvUEFHRQorICAgICAgICAgICAgICAgIFBhdXNlIGJldHdlZW4gc2NyZWVucyBvZiBvdXRwdXQuCisKKyAgICAgICAgL1JFQ1VSU0lWRQorICAgICAgICAgICAgICAgIFNlYXJjaCBmaWxlcyBpbiBzdWJkaXJlY3RvcmllcyB0b28uCisKKyAgICAgICAgL1RZUEU6e1RFWFQsQklOQVJZfQorICAgICAgICAgICAgICAgIFNlYXJjaCBvbmx5IGZpbGVzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKworICAgICAgICAgIFN5bm9ueW1zOiBGSU5ELCBTRUFSQ0guCisKKyAgIEdFVE9LIC9USU1FT1VUOm4gL1FVSUVUIC9ERUZBVUxUOnRleHQKKyAgICAgICAgICBUaGUgbmV3IC9RVUlFVCBzd2l0Y2ggaW5zdHJ1Y3RzIEdFVE9LLCB3aGVuIGdpdmVuIGEgdGltZW91dCwKKyAgICAgICAgICBub3QgdG8gcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBpZiBpdCB0aW1lcyBvdXQuIEFzIG9mIDguMC4yMTEsIGEKKyAgICAgICAgICBkZWZhdWx0IGFuc3dlciBjYW4gYmUgc3VwcGxpZWQgKHNlZSBBU0spLgorCisgICBIRUFEIFsgc3dpdGNoZXMgXSBmaWxlbmFtZQorICAgICAgICAgIEVxdWl2YWxlbnQgdG8gVFlQRSAvSEVBRCBbIG90aGVyLXN3aXRjaGVzIF0gZmlsZW5hbWUuCisKKyAgIEhFTFAgREFURQorICAgICAgICAgIEV4cGxhaW5zIGRhdGUtdGltZSBmb3JtYXRzLCBpbmNsdWRpbmcgdGltZXpvbmUgbm90YXRpb24gYW5kCisgICAgICAgICAgZGVsdGEgdGltZXMuCisKKyAgIEhFTFAgRklSRVdBTExTCisgICAgICAgICAgRXhwbGFpbnMgdGhlIGZpcmV3YWxsIG5lZ290aWF0aW9uIGNhcGFiaWxpdGllcyBvZiB5b3VyIHZlcnNpb24KKyAgICAgICAgICBvZiBLZXJtaXQuCisKKyAgIEtDRCBbIHN5bWJvbGljLWRpcmVjdG9yeS1uYW1lIF0KKyAgICAgICAgICBDaGFuZ2VzIEtlcm1pdCdzIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBuYW1lZCBzeW1ib2xpYworICAgICAgICAgIGRpcmVjdG9yeSwgc3VjaCBhcyBzdWNoIGFzIGV4ZWRpciwgaW5pZGlyLCBzdGFydHVwLCBkb3dubG9hZCwKKyAgICAgICAgICBvciBhbmQgaG9tZS4gVHlwZSAia2NkID8iIGZvciBhIGxpc3Qgb2Ygc3ltYm9saWMgZGlyZWN0b3J5CisgICAgICAgICAgbmFtZXMga25vd24gdG8geW91ciBjb3B5IG9mIEtlcm1pdCwgb3IgZ2l2ZSB0aGUgbmV3IE9SSUVOVEFUSU9OCisgICAgICAgICAgY29tbWFuZCBmb3IgYSBtb3JlIGRldGFpbGVkIGV4cGxhbmF0aW9uLiBJZiB5b3UgZ2l2ZSBhIEtDRAorICAgICAgICAgIGNvbW1hbmQgd2l0aG91dCBhIGRpcmVjdG9yeSBuYW1lLCBLZXJtaXQgcmV0dXJucyB0byBpdHMgImhvbWUiCisgICAgICAgICAgZGlyZWN0b3J5LCB3aGljaCBpcyBkZXRlcm1pbmVkIGluIHNvbWUgd2F5IHRoYXQgZGVwZW5kcyBvbiB0aGUKKyAgICAgICAgICB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0sIGJ1dCB3aGljaCB5b3UgY2FuIHJlZGVmaW5lIHdpdGgKKyAgICAgICAgICB0aGUgKG5ldykgU0VUIENEIEhPTUUgY29tbWFuZC4gWW91ciBob21lIGRpcmVjdG9yeSBpcyBzaG93biBieQorICAgICAgICAgIFNIT1cgQ0QgYW5kIGl0J3MgYWxzbyB0aGUgdmFsdWUgb2YgdGhlIFx2KGhvbWUpIHZhcmlhYmxlLgorCisgICBMSUNFTlNFCisgICAgICAgICAgRGlzcGxheXMgdGhlIEMtS2VybWl0IGxpY2Vuc2UuCisKKyAgIEwtY29tbWFuZHMKKyAgICAgICAgICBXaGVuIEtlcm1pdCBoYXMgYSBjb25uZWN0aW9uIHRvIGEgS2VybWl0IG9yIEZUUCBzZXJ2ZXIsIGZpbGUKKyAgICAgICAgICBtYW5hZ21lbnQgY29tbWFuZHMgc3VjaCBhcyBDRCwgRElSRUNUT1JZLCBhbmQgREVMRVRFIG1pZ2h0IGJlCisgICAgICAgICAgaW50ZW5kZWQgZm9yIHRoZSBsb2NhbCBjb21wdXRlciBvciB0aGUgcmVtb3RlIHNlcnZlci4gQy1LZXJtaXQKKyAgICAgICAgICA4LjAuMjAwIGFuZCBlYXJsaWVyIGFsd2F5cyBleGVjdXRlcyB0aGVzZSBjb21tYW5kcyBvbiB0aGUgbG9jYWwKKyAgICAgICAgICBjb21wdXRlci4gSWYgeW91IHdhbnQgdGhlbSBleGVjdXRlZCBieSB0aGUgcmVtb3RlIHNlcnZlciwgeW91CisgICAgICAgICAgaGF2ZSB0byBwcmVmaXggdGhlbSB3aXRoIFJFTU9URSAoZS5nLiBSRU1PVEUgQ0QpIG9yIHVzZSBzcGVjaWFsCisgICAgICAgICAgUi1jb21tYW5kIGFsaWFzZXMgKGUuZy4gUkNEID0gUkVNT1RFIENELCBSRElSID0gUkVNT1RFIERJUiwKKyAgICAgICAgICBldGMpLiBCdXQgdGhpcyBmZWVscyB1bm5hdHVyYWwgdG8gRlRQIHVzZXJzLCB3aG8gZXhwZWN0CisgICAgICAgICAgdW5wcmVmaXhlZCBmaWxlIG1hbmFnZW1lbnQgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlCisgICAgICAgICAgcmVtb3RlIHNlcnZlciwgcmF0aGVyIHRoYW4gbG9jYWxseS4gQy1LZXJtaXQgOC4wLjIwMSBhZGRzCisgICAgICAgICAgYXV0b21hdGljIGxvY3VzIHN3aXRjaGluZyB0byBwcmVzZW50IGFuIEZUUC1saWtlIGludGVyZmFjZSBmb3IKKyAgICAgICAgICBGVFAgY29ubmVjdGlvbnMgYW5kIHRoZSBub3JtYWwgS2VybWl0IGludGVyZmFjZSBmb3IgS2VybWl0CisgICAgICAgICAgY29ubmVjdGlvbnMsIGFuZCBhIFNFVCBMT0NVUyBjb21tYW5kIChkZXNjcmliZWQgYmVsb3cpIHRvCisgICAgICAgICAgY29udHJvbCB3aGV0aGVyIG9yIGhvdyB0aGlzIGlzIGRvbmUuIEZvciB3aGVuIExPQ1VTIGlzIFJFTU9URSwKKyAgICAgICAgICBhIG5ldyBzZXQgb2YgY29tbWFuZHMgd2FzIGFkZGVkIGZvciBsb2NhbCBtYW5hZ2VtZW50OiBMQ0QKKyAgICAgICAgICAoTG9jYWwgQ0QpLCBMRElSIChMb2NhbCBESVIpLCBldGMuIFRoZXNlIGFyZSBkZXNjcmliZWQgYmVsb3cKKyAgICAgICAgICB1bmRlciBTRVQgTE9DVVMuCisKKyAgIE1PUkUgZmlsZW5hbWUKKyAgICAgICAgICBFcXVpdmFsZW50IHRvIFRZUEUgL1BBR0UuCisKKyAgIE9SSUVOVEFUSU9OCisgICAgICAgICAgRGlzcGxheXMgc3ltYm9saWMgZGlyZWN0b3J5IG5hbWVzIGFuZCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgIHZhcmlhYmxlIG5hbWVzIGFuZCB2YWx1ZXMuIFRoZSBzeW1ib2xpYyBuYW1lcywgc3VjaCBhcyBleGVkaXIsCisgICAgICAgICAgaW5pZGlyLCBzdGFydHVwLCBkb3dubG9hZCwgYW5kIGhvbWUsIGNhbiBiZSB1c2VkIGFzIGFyZ3VtZW50cworICAgICAgICAgIHRvIHRoZSBuZXcgS0NEIGNvbW1hbmQuCisKKyAgIFBST01QVCBbIHRleHQgXQorICAgICAgICAgIEZvciB1c2UgaW4gYSBtYWNybyBvciBjb21tYW5kIGZpbGU6IGVudGVycyBpbnRlcmFjdGl2ZSBjb21tYW5kCisgICAgICAgICAgbW9kZSB3aXRoaW4gdGhlIGN1cnJlbnQgY29udGV4dCAoWzM4N11TZWN0aW9uIDguMSkuIElmIHRoZQorICAgICAgICAgIG9wdGlvbmFsIHRleHQgaXMgaW5jbHVkZWQsIHRoZSBwcm9tcHQgaXMgc2V0IHRvIGl0LiBUaGUgdGV4dAorICAgICAgICAgIGNhbiBpbmNsdWRlIHZhcmlhYmxlcywgZnVuY3Rpb25zLCBldGMsIGFzIGluIHRoZSBTRVQgUFJPTVBUCisgICAgICAgICAgY29tbWFuZC4gVGhleSBhcmUgZXZhbHVhdGVkIGVhY2ggdGltZSB0aGUgcHJvbXB0IGlzIHByaW50ZWQuCisgICAgICAgICAgVW5saWtlIHRoZSBTRVQgUFJPTVBUIGNvbW1hbmQsIHRoZSB0ZXh0IGFyZ3VtZW50IGFwcGxpZXMgb25seQorICAgICAgICAgIHRvIHRoZSBjdXJyZW50IGNvbW1hbmQgbGV2ZWwuIFRodXMgeW91IGNhbiBoYXZlIGRpZmZlcmVudAorICAgICAgICAgIHByb21wdHMgYXQgZGlmZmVyZW50IGxldmVscy4KKworICAgUkVNT1RFIFNFVCBNQVRDSCB7IERPVElGSUxFLCBGSUZPIH0geyBPTiwgT0ZGIH0KKyAgICAgICAgICBBbGxvd3MgdGhlIGNsaWVudCB0byB0ZWxsIHRoZSBzZXJ2ZXIgd2hldGhlciB3aWxkY2FyZHMgc2VudCB0bworICAgICAgICAgIHRoZSBzZXJ2ZXIgc2hvdWxkIG1hdGNoIGRvdCBmaWxlcyAoZmlsZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aAorICAgICAgICAgIHBlcmlvZCkgb3IgRklGT3MgKG5hbWVkIHBpcGVzKS4gU2VlIFNFVCBNQVRDSC4KKworICAgU0VUIEFUVFJJQlVURSBSRUNPUkQtRk9STUFUIHsgT04sIE9GRiB9CisgICAgICAgICAgQWxsb3dzIGNvbnRyb2wgb2YgdGhlIEtlcm1pdCdzIFJlY29yZC1Gb3JtYXQgYXR0cmlidXRlLiBTZXQKKyAgICAgICAgICB0aGlzIHRvIE9GRiBpbiBjYXNlIGluY29taW5nIGZpbGUgYXJlIHJlZnVzZWQgZHVlIHRvIHVua25vd24gb3IKKyAgICAgICAgICBpbnZhbGlkIHJlY29yZCBmb3JtYXRzIGlmIHlvdSB3YW50IHRvIGFjY2VwdCB0aGUgZmlsZSBhbnl3YXkKKyAgICAgICAgICAoYW5kLCBwZXJoYXBzLCBwb3N0cHJvY2VzcyBpdCB0byBmaXggaXRzIHJlY29yZCBmb3JtYXQpLgorCisgICBTRVQgQ0QgSE9NRSBbIGRpcmVjdG9yeSBdCisgICAgICAgICAgU3BlY2lmaWVzIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGZvciB0aGUgQ0QgYW5kIEtDRCBjb21tYW5kcywKKyAgICAgICAgICB3aGVuIHRoZXkgYXJlIGdpdmVuIHdpdGhvdXQgYW4gYXJndW1lbnQsIGFuZCBhbHNvIHNldHMgdGhlCisgICAgICAgICAgdmFsdWUgb2YgdGhlIFx2KGhvbWUpIHZhcmlhYmxlLgorCisgICBTRVQgRVhJVCBIQU5HVVAgeyBPRkYsIE9OIH0KKyAgICAgICAgICBOb3JtYWxseSBPTiwgbWVhbmluZyB0aGF0IHdoZW4gS2VybWl0IGV4aXRzLCBpdCBhbHNvIGV4cGxpY2l0bHkKKyAgICAgICAgICBoYW5ncyB1cCB0aGUgY3VycmVudCBTRVQgTElORSAvIFNFVCBQT1JUIHNlcmlhbCBwb3J0IGFjY29yZGluZworICAgICAgICAgIHRvIHRoZSBjdXJyZW50IFNFVCBNT0RFTSBUWVBFIGFuZCBTRVQgTU9ERU0gSEFOR1VQIE1FVEhPRCwgYW5kCisgICAgICAgICAgY2xvc2VzIHRoZSBwb3J0IGRldmljZSBpZiBpdCB3YXMgb3BlbmVkIGJ5IEtlcm1pdCBpbiB0aGUgZmlyc3QKKyAgICAgICAgICBwbGFjZSAoYXMgb3Bwb3NlZCB0byBpbmhlcml0ZWQpLiBTRVQgRVhJVCBIQU5HVVAgT0ZGIHRlbGxzCisgICAgICAgICAgS2VybWl0IG5vdCB0byBkbyB0aGlzLiBUaGlzIGNhbid0IHByZXZlbnQgdGhlIG9wZXJhdGluZyBzeXN0ZW0KKyAgICAgICAgICBmcm9tIGNsb3NpbmcgdGhlIGRldmljZSB3aGVuIEtlcm1pdCBleGl0cyAoYW5kIGl0J3MgYSAibGFzdAorICAgICAgICAgIGNsb3NlIikgYnV0IGlmIHRoZSBwb3J0IG9yIG1vZGVtIGhhdmUgYmVlbiBjb25kaXRpb25lZCB0bworICAgICAgICAgIHNvbWVob3cgaWdub3JlIHRoZSBjbG9zZSBhbmQga2VlcCB0aGUgY29ubmVjdGlvbiBvcGVuLCBhdCBsZWFzdAorICAgICAgICAgIEtlcm1pdCBpdHNlbGYgd29uJ3QgZG8gYW55dGhpbmcgZXhwbGljaXQgdG8gaGFuZyBpdCB1cCBvciBjbG9zZQorICAgICAgICAgIGl0LgorCisgICBTRVQgRklMRSBFT0YgeyBDVFJMLVosIExFTkdUSCB9CisgICAgICAgICAgU3BlY2lmaWVzIHRoZSBlbmQtb2YtZmlsZSBkZXRlY3Rpb24gbWV0aG9kIHRvIGJlIHVzZWQgYnkKKyAgICAgICAgICBDLUtlcm1pdCB3aGVuIHNlbmRpbmcgYW5kIHJlY2VpdmluZyB0ZXh0IGZpbGVzLCBhbmQgaW4gdGhlIFRZUEUKKyAgICAgICAgICBhbmQgc2ltaWxhciB0ZXh0LWZpbGUgb3JpZW50ZWQgY29tbWFuZHMuIFRoZSBub3JtYWwgYW5kIGRlZmF1bHQKKyAgICAgICAgICBtZXRob2QgaXMgTEVOR1RILiBZb3UgY2FuIHNwZWNpZnkgQ1RSTC1aIHdoZW4gaGFuZGxpbmcgQ1AvTSBvcgorICAgICAgICAgIE1TLURPUyBmb3JtYXQgdGV4dCBmaWxlcywgaW4gd2hpY2ggYSBDdHJsLVogKEFTQ0lJIDI2KQorICAgICAgICAgIGNoYXJhY3RlciB3aXRoaW4gdGhlIGZpbGUgbWFya3MgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKworICAgU0VUIEZJTEUgTElTVFNJWkUgbnVtYmVyCisgICAgICAgICAgQWxsb2NhdGVzIHNwYWNlIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGZpbGVuYW1lcyB0byBiZSBmaWxsZWQKKyAgICAgICAgICBpbiBieSB0aGUgd2lsZGNhcmQgZXhwYW5kZXIuIFRoZSBjdXJyZW50IG51bWJlciBpcyBzaG93biBieQorICAgICAgICAgIFNIT1cgRklMRS4gSWYgeW91IGdpdmUgYSBjb21tYW5kIHRoYXQgaW5jbHVkZXMgYSBmaWxlbmFtZQorICAgICAgICAgIGNvbnRhaW5pbmcgYSB3aWxkY2FyZCAoc3VjaCBhcyAiKiIpIHRoYXQgbWF0Y2hlcyBtb3JlIGZpbGVzCisgICAgICAgICAgdGhhdCBLZXJtaXQncyBsaXN0IGhhcyByb29tIGZvciwgeW91IGNhbiBhZGp1c3QgdGhlIGxpc3Qgc2l6ZQorICAgICAgICAgIHdpdGggdGhpcyBjb21tYW5kLgorCisgICBTRVQgRklMRSBTVFJJTkdTUEFDRSBudW1iZXIKKyAgICAgICAgICBBbGxvY2F0ZXMgc3BhY2UgZm9yIHRoZSBnaXZlbiBhbW91bnQgb2YgZmlsZW5hbWUgc3RyaW5ncyBmb3IKKyAgICAgICAgICB1c2UgYnkgdGhlIHdpbGRjYXJkIGV4cGFuZGVyLiBUaGUgY3VycmVudCBudW1iZXIgaXMgc2hvd24gYnkKKyAgICAgICAgICBTSE9XIEZJTEUuIFRoZSBudW1iZXIgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBvZiBhbGwgdGhlCisgICAgICAgICAgZmlsZSBzcGVjaWZpY2F0aW9ucyB0aGF0IG1hdGNoIHRoZSBnaXZlbiB3aWxkY2FyZC4KKworICAgICBJZiB5b3UgbmVlZCB0byBwcm9jZXNzIGEgYmlnZ2VyIGxpc3Qgb2YgZmlsZXMgdGhhbiB5b3VyIGNvbXB1dGVyCisgICAgIGhhcyBtZW1vcnkgZm9yLCB5b3UgbWlnaHQgYmUgYWJsZSB1c2UgYW4gZXh0ZXJuYWwgZmlsZSBsaXN0LiBUaGUKKyAgICAgS2VybWl0IFNFTkQgYW5kIHRoZSBGVFAgUFVUIGFuZCBHRVQgY29tbWFuZHMgYWNjZXB0IGEgL0xJU1RGSUxFOgorICAgICBzd2l0Y2gsIHdoaWNoIGdpdmVzIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBsaXN0IG9mCisgICAgIGZpbGVzIHRvIGJlIHRyYW5zZmVycmVkLiBFeGFtcGxlIGZvciBVTklYOgorCisgICFmaW5kIC4gLXByaW50IHwgZ3JlcCAvID4gL3RtcC9uYW1lcworICBmdHAgcHV0IC91cGRhdGUgL3JlY3Vyc2l2ZSAvbGlzdGZpbGU6L3RtcC9uYW1lcworCisgICBTRVQgTE9DVVMgeyBBVVRPLCBMT0NBTCwgUkVNT1RFIH0KKyAgICAgICAgICBBZGRlZCBpbiBDLUtlcm1pdCA4LjAuMjAxLiAgIFNldHMgdGhlIGxvY3VzIGZvciB1bnByZWZpeGVkIGZpbGUKKyAgICAgICAgICBtYW5hZ2VtZW50IGNvbW1hbmRzIHN1Y2ggYXMgQ0QsIERJUkVDVE9SWSwgTUtESVIsIGV0Yy4gV2hlbgorICAgICAgICAgIExPQ1VTIGlzIExPQ0FMIHRoZXNlIGNvbW1hbmRzIGFjdCBsb2NhbGx5IGFuZCBhIFJFTU9URSAob3IgUikKKyAgICAgICAgICBwcmVmaXggKGUuZy4gUkVNT1RFIENELCBSQ0QsIFJESVIpIGlzIHJlcXVpcmVkIHRvIHNlbmQgZmlsZQorICAgICAgICAgIG1hbmFnZW1lbnQgY29tbWFuZHMgdG8gYSByZW1vdGUgc2VydmVyLiBXaGVuIExPQ1VTIGlzIFJFTU9URSwKKyAgICAgICAgICBhbiBMIHByZWZpeCBpcyByZXF1aXJlZCB0byBpc3N1ZSBsb2NhbCBmaWxlIG1hbmFnZW1lbnQgY29tbWFuZHMKKyAgICAgICAgICAoZS5nLiBMQ0QsIExESVIpLiBUaGUgd29yZCBMT0NBTCBjYW4ndCBiZSB1c2VkIGFzIGEgcHJlZml4CisgICAgICAgICAgc2luY2UgaXQgaXMgYWxyZWFkeSB1c2VkIGZvciBkZWNsYXJpbmcgbG9jYWwgdmFyaWFibGVzLiBMT0NVUworICAgICAgICAgIGFwcGxpZXMgdG8gYWxsIHR5cGVzIG9mIGNvbm5lY3Rpb25zLCBhbmQgdGh1cyBpcyBvcnRob2dvbmFsIHRvCisgICAgICAgICAgU0VUIEdFVC1QVVQtUkVNT1RFLCB3aGljaCBzZWxlY3RzIGJldHdlZW4gS2VybWl0IGFuZCBGVFAgZm9yCisgICAgICAgICAgcmVtb3RlIGZpbGUtdHJhbnNmZXIgYW5kIG1hbmFnZW1lbnQgY29tbWFuZHMuIFRoZSBkZWZhdWx0IExPQ1VTCisgICAgICAgICAgaXMgQVVUTywgd2hpY2ggbWVhbnMgd2Ugc3dpdGNoIHRvIFJFTU9URSB3aGVuZXZlciBhbiBGVFAKKyAgICAgICAgICBjb25uZWN0aW9uIGlzIG1hZGUsIGFuZCB0byBMT0NBTCB3aGVuZXZlciBhIG5vbi1GVFAgY29ubmVjdGlvbgorICAgICAgICAgIGlzIG1hZGUsIGFuZCBzd2l0Y2ggYmFjayBhY2NvcmRpbmdseSB3aGVuZXZlciBhIGNvbm5uZWN0aW9uIGlzCisgICAgICAgICAgY2xvc2VkLiBTbyBieSBkZWZhdWx0LCBLZXJtaXQgYmVoYXZlcyBpbiBpdHMgdHJhZGl0aW9uYWwgbWFubmVyCisgICAgICAgICAgdW5sZXNzIHlvdSBtYWtlIGFuIEZUUCBjb25uZWN0aW9uLCBpbiB3aGljaCBjYXNlIGl0IGFjdHMgbGlrZSBhCisgICAgICAgICAgcmVndWxhciBGVFAgY2xpZW50IChidXQgYmV0dGVyIDotKSAgIExPQ1VTIGFwcGxpZXMgdG8gdGhlCisgICAgICAgICAgZm9sbG93aW5nIGNvbW1hbmRzOgorCisgIFVucHJlZml4ZWQgICAgUmVtb3RlICAgICAgIExvY2FsICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgCisgICBDRCAoQ1dEKSAgICAgIFJDRCAgICAgICAgICBMQ0QgICAgICAgICAgQ2hhbmdlIChXb3JraW5nKSBEaXJlY3RvcnkKKyAgIENEVVAgICAgICAgICAgUkNEVVAgICAgICAgIExDRFVQICAgICAgICBDRCBVcAorICAgUFdEICAgICAgICAgICBSUFdEICAgICAgICAgTFBXRCAgICAgICAgIFByaW50IFdvcmtpbmcgRGlyZWN0b3J5CisgICBESVJFQ1RPUlkgICAgIFJESVIgICAgICAgICBMRElSICAgICAgICAgUmVxdWVzdCBhIGRpcmVjdG9yeSBsaXN0aW5nYQorICAgREVMRVRFICAgICAgICBSREVMICAgICAgICAgTERFTCAgICAgICAgIERlbGV0ZSAoYSkgZmlsZShzKQorICAgUkVORU1FICAgICAgICBSUkVOICAgICAgICAgTFJFTiAgICAgICAgIFJlbmFtZSBhIGZpbGUKKyAgIE1LRElSICAgICAgICAgUk1LRElSICAgICAgIExNS0RJUiAgICAgICBDcmVhdGUgYSBkaXJlY3RvcnkKKyAgIFJNRElSICAgICAgICAgUlJNRElSICAgICAgIExSTURJUiAgICAgICBSZW1vdmUgYSBkaXJlY3RvcnkKKworICAgU0VUIE1BVENIIHsgRE9USUZJTEUsIEZJRk8gfSB7IE9OLCBPRkYgfQorICAgICAgICAgIFdoZXRoZXIgQy1LZXJtaXQgZmlsZW5hbWUgcGF0dGVybnMgKHdpbGRjYXJkcykgc2hvdWxkIG1hdGNoCisgICAgICAgICAgZmlsZW5hbWVzIHRoYXQgc3RhcnQgd2l0aCBkb3QgKHBlcmlvZCksIG9yIChVbml4IG9ubHkpIEZJRk9zCisgICAgICAgICAgKG5hbWVkIHBpcGVzKS4gVGhlIGRlZmF1bHRzIGFyZSB0byBza2lwIGRvdGZpbGVzIGluIFVuaXggYnV0CisgICAgICAgICAgbWF0Y2ggdGhlbSBlbHNld2hlcmUsIGFuZCB0byBza2lwIEZJRk9zLiBBcHBsaWVzIHRvIGJvdGgKKyAgICAgICAgICBpbnRlcmFjdGl2ZSB1c2UgYW5kIHRvIHNlcnZlciBtb2RlLCB3aGVuIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMKKyAgICAgICAgICB3aWxkY2FyZHMsIGUuZy4gaW4gYSBHRVQgY29tbWFuZC4gQWxzbyBzZWUgUkVNT1RFIFNFVCBNQVRDSC4KKworICAgU0VUIE9QVElPTlMgRElSRUNUT1JZIC9ET1RGSUxFUworICAgICAgICAgIE5vdyB3b3JrcyBmb3Igc2VydmVyIGxpc3RpbmdzIHRvbyAoVU5JWCBvbmx5KS4gR2l2ZSB0aGlzCisgICAgICAgICAgY29tbWFuZCBwcmlvciB0byBoYXZpbmcgS2VybWl0IGVudGVyIHNlcnZlciBtb2RlLCBhbmQgdGhlbiBpdAorICAgICAgICAgIHdpbGwgc2hvdyBmaWxlcyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIGRvdCAocGVyaW9kKSB3aGVuIHNlbnQgYQorICAgICAgICAgIFJFTU9URSBESVJFQ1RPUlkgY29tbWFuZC4KKworICAgU0VUIFFVSUVUIE9OCisgICAgICAgICAgKGFzIHdlbGwgYXMgdGhlIC1xIGNvbW1hbmQtbGluZSBvcHRpb24pIE5vdyBhcHBsaWVzIGFsc28gdG86CisKKyAgICAgICAgICArIFNFVCBIT1NUIGNvbm5lY3Rpb24gcHJvZ3Jlc3MgbWVzc2FnZXMuCisgICAgICAgICAgKyAiUHJlc3MgdGhlIFggb3IgRSBrZXkgdG8gY2FuY2VsIiBmaWxlLXRyYW5zZmVyIG1lc3NhZ2UuCisgICAgICAgICAgKyBSRU1PVEUgQ0QgcmVzcG9uc2UuCisgICAgICAgICAgKyBSRU1PVEUgTE9HSU4gcmVzcG9uc2UuCisKKyAgIFNFVCBSRUNFSVZFIFBFUk1JU1NJT05TIHsgT04sIE9GRiB9CisgICAgICAgICAgVGVsbHMgQy1LZXJtaXQgd2hldGhlciB0byBzZXQgdGhlIHBlcm1pc3Npb25zIG9mIGluY29taW5nIGZpbGVzCisgICAgICAgICAgKHJlY2VpdmVkIHdpdGggS2VybWl0IHByb3RvY29sKSBmcm9tIHRoZSBwZXJtaXNzaW9ucyBzdXBwbGllZAorICAgICAgICAgIGluIHRoZSBmaWxlJ3MgQXR0cmlidXRlIHBhY2tldCAoaWYgYW55KS4gTm9ybWFsbHkgT04uIEFsc28gc2VlCisgICAgICAgICAgU0VUIFNFTkQgUEVSTUlTU0lPTlMuCisKKyAgIFNFVCBST09UIGRpcmVjdG9yeQorICAgICAgICAgIExpa2UgVU5JWCBjaHJvb3QsIHdpdGhvdXQgcmVxdWlyaW5nIHByaXZpbGVnZS4gU2V0cyB0aGUgcm9vdAorICAgICAgICAgIGZvciBmaWxlIGFjY2VzcywgZG9lcyBub3QgYWxsb3cgcmVmZXJlbmNlIHRvIG9yIGNyZWF0aW9uIG9mCisgICAgICAgICAgZmlsZXMgb3V0c2lkZSB0aGUgcm9vdCwgYW5kIGNhbid0IGJlIHVuZG9uZS4KKworICAgU0VUIFNFTkQgUEVSTUlTU0lPTlMgeyBPTiwgT0ZGIH0KKyAgICAgICAgICBUZWxscyBDLUtlcm1pdCB3aGV0aGVyIHRvIGluY2x1ZGUgZmlsZSBwZXJtaXNzaW9ucyBpbiB0aGUKKyAgICAgICAgICBhdHRyaWJ1dGVzIGl0IGluY2x1ZGVzIHdpdGggZWFjaCBmaWxlIHdoZW4gc2VuZGluZyB3aXRoIEtlcm1pdAorICAgICAgICAgIHByb3RvY29sLiBBbHNvIHNlZSBTRVQgUkVDRUlWRSBQRVJNSVNTSU9OUy4KKworICAgU0VUIFRDUCB7IEhUVFAtUFJPWFksIFNPQ0tTLVNFUlZFUiB9IC9VU0VSOm5hbWUgL1BBU1NXT1JEOnRleHQKKyAgICAgICAgICBUaGVzZSBjb21tYW5kcyBub3cgYWxsb3cgc3BlY2lmaWNhdGlvbiBvZiB1c2VybmFtZSBhbmQKKyAgICAgICAgICBwYXNzd29yZC4KKworICAgU0VUIFRFUk1JTkFMIC4gLiAuCisgICAgICAgICAgKFNlZSBbMzg4XVNlY3Rpb24gMTIuKQorCisgICBTRVQgVFJBTlNGRVIgTUVTU0FHRSBbIHRleHQgXQorICAgICAgICAgIFNldHMgYW4gaW5pdGlhbCB0ZXh0IG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGluIHRoZQorICAgICAgICAgIGZpbGUtdHJhbnNmZXIgZGlzcGxheS4gVGhlIHRyYW5zZmVyIG1lc3NhZ2UgaXMgYXV0b21hdGljYWxseQorICAgICAgICAgIGRlbGV0ZWQgb25jZSB1c2VkLCBzbyBtdXN0IGJlIHNldCBlYWNoIHRpbWUgYSBtZXNzYWdlIGEKKyAgICAgICAgICBkZXNpcmVkLiBBbnkgdmFyaWFibGVzIGluIHRoZSBtZXNzYWdlIGFyZSBldmFsdWF0ZWQgYXQgdGhlIHRpbWUKKyAgICAgICAgICB0aGUgU0VUIGNvbW1hbmQgaXMgZ2l2ZW4uIElmIHRoZSBvcHRpb25hbCB0ZXh0IGlzIG9taXR0ZWQsIGFueQorICAgICAgICAgIHRyYW5zZmVyIG1lc3NhZ2UgdGhhdCBpcyBjdXJyZW50bHkgc2V0IGlzIHJlbW92ZWQuIFN5bm9ueW06IFNFVAorICAgICAgICAgIFhGRVIgTVNHLiBTSE9XIFRSQU5TRkVSIGRpc3BsYXlzIGl0IGlmIGl0IGhhcyBiZWVuIHNldCBidXQgbm90CisgICAgICAgICAgeWV0IHVzZWQuCisKKyAgIFNIT1cgQ09NTVVOSUNBVElPTlMKKyAgICAgICAgICBJbiBDLUtlcm1pdCA4LjAsIFNIT1cgQ09NTVVOSUNBVElPTlMsIHdoZW4gZ2l2ZW4gaW4gcmVtb3RlIG1vZGUKKyAgICAgICAgICAoaS5lLiBiZWZvcmUgYW55IGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQpLCB0ZWxscyB0aGUKKyAgICAgICAgICB0eXBpY2FsIGRpYWxvdXQgZGV2aWNlIG5hbWUgZm9yIHRoZSBwYXJ0aWN1bGFyIHBsYXRmb3JtIG9uCisgICAgICAgICAgd2hpY2ggaXQncyBydW5uaW5nIChlLmcuIFRYQTA6IGZvciBWTVMsIG9yIC9kZXYvY3VhMHAwIGZvcgorICAgICAgICAgIEhQLVVYKS4gT24gVW5peCBwbGF0Zm9ybXMsIGl0IGFsc28gdGVsbHMgdGhlIG5hbWUgb2YgdGhlCisgICAgICAgICAgbG9ja2ZpbGUgZGlyZWN0b3J5LiBUaGlzIHdheSwgeW91IGhhdmUgYW4gaWRlYSBvZiB3aGF0IHRoZSBTRVQKKyAgICAgICAgICBMSU5FIGRldmljZSBuYW1lIHNob3VsZCBsb29rIGxpa2UsIGFuZCBpZiB0aGUgU0VUIExJTkUgY29tbWFuZAorICAgICAgICAgIGZhaWxzLCB5b3Uga25vdyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IG9yIGRldmljZSB0aGF0IGlzCisgICAgICAgICAgcHJvdGVjdGVkIGFnYWluc3QgeW91LgorCisgICBTSE9XIFZBUklBQkxFUyBbIG5hbWUgWyBuYW1lIFsgLi4uIF0gXSBdCisgICAgICAgICAgSW4gQy1LZXJtaXQgOC4wLjIwMSB5b3UgY2FuIHJlcXVlc3QgdmFsdWVzIG9mIGEgbGlzdCBvZgorICAgICAgICAgIGJ1aWx0LWluIChcdih4eHgpKSB2YXJpYWJsZXMuIEVhY2ggbmFtZSBpcyBhIHBhdHRlcm4sIGFzCisgICAgICAgICAgYmVmb3JlLCBidXQgbm93IGl0IGEgZnJlZSBwYXR0ZXJuIHJhdGhlciB0aGFuIGFuIGFuY2hvcmVkIG9uZQorICAgICAgICAgIChleHBsYWluZWQgaW4gWzM4OV1TZWN0aW9uIDguMTIpIHNvIG5vdyAic2hvdyB2YXIgZGF0ZSB0aW1lIgorICAgICAgICAgIHNob3dzIHRoZSB2YWx1ZXMgb2YgYWxsIHZhcmlhYmxlcyB3aG9zZSBuYW1lcyBpbmNsdWRlIHRoZQorICAgICAgICAgIHN0cmluZ3MgImRhdGUiIG9yICJ0aW1lIi4KKworICAgVEFJTCBbIHN3aXRjaGVzIF0gZmlsZW5hbWUKKyAgICAgICAgICBFcXVpdmFsZW50IHRvIFRZUEUgL1RBSUwgWyBvdGhlci1zd2l0Y2hlcyBdIGZpbGVuYW1lLgorCisgICBUUkFOU01JVCAvTk9FQ0hPIFsgb3RoZXIgc3dpdGNoZXMgXSBmaWxlbmFtZQorICAgICAgICAgIFRoZSAvTk9FQ0hPIHN3aXRjaCBpcyBlcXVpdmFsZW50IHRvIGdpdmluZyB0aGUgY29tbWFuZCBTRVQKKyAgICAgICAgICBUUkFOU01JVCBFQ0hPIE9GRiBwcmlvciB0byB0aGUgVFJBTlNNSVQgY29tbWFuZCwgZXhjZXB0IHRoZQorICAgICAgICAgIHN3aXRjaCBhZmZlY3RzIG9ubHkgdGhlIGNvbW1hbmQgd2l0aCB3aGljaCBpdCB3YXMgZ2l2ZW4gYW5kCisgICAgICAgICAgZG9lcyBub3QgYWZmZWN0IHRoZSBwcmV2YWlsaW5nIGdsb2JhbCBzZXR0aW5nLgorCisgICBUUkFOU01JVCAvTk9XQUlUIFsgb3RoZXIgc3dpdGNoZXMgXSBmaWxlbmFtZQorICAgICAgICAgIFRoZSAvTk9XQUlUIHN3aXRjaCBpcyBlcXVpdmFsZW50IHRvIGdpdmluZyB0aGUgY29tbWFuZCBTRVQKKyAgICAgICAgICBUUkFOU01JVCBQUk9NUFQgMCBwcmlvciB0byB0aGUgVFJBTlNNSVQgY29tbWFuZCwgZXhjZXB0IHRoZQorICAgICAgICAgIHN3aXRjaCBhZmZlY3RzIG9ubHkgdGhlIGNvbW1hbmQgd2l0aCB3aGljaCBpdCB3YXMgZ2l2ZW4gYW5kCisgICAgICAgICAgZG9lcyBub3QgYWZmZWN0IHRoZSBwcmV2YWlsaW5nIGdsb2JhbCBzZXR0aW5nLgorCisgICBUUkFOU01JVCAvTk9XQUlUIC9OT0VDSE8gL0JJTkFSWSBbIG90aGVyIHN3aXRjaGVzIF0gZmlsZW5hbWUKKyAgICAgICAgICBXaGVuIHRoZSBUUkFOU01JVCBjb21tYW5kIGlzIGdpdmVuIHdpdGggdGhlIC9OT1dBSVQsIC9OT0VDSE8sCisgICAgICAgICAgYW5kIC9CSU5BUlkgc3dpdGNoZXMsIHRoaXMgYWN0aXZhdGVzIGEgc3BlY2lhbCAiYmxhc3QgdGhlIHdob2xlCisgICAgICAgICAgZmlsZSBvdXQgdGhlIGNvbW11bmljYXRpb25zIGNvbm5lY3Rpb24gYWxsIGF0IG9uY2UiIG1vZGUgdGhhdAorICAgICAgICAgIEtlcm1pdCBkaWRuJ3QgaGF2ZSBwcmlvciB0byB2ZXJzaW9uIDguMC4gVGhlcmUgaGFzIGJlZW4KKyAgICAgICAgICBpbmNyZWFzaW5nIGRlbWFuZCBmb3IgdGhpcyB0eXBlIG9mIHRyYW5zbWlzc2lvbiB3aXRoIHRoZSBhZHZlbnQKKyAgICAgICAgICBvZiBkZXZpY2VzIHRoYXQgZXhwZWN0IGltYWdlIChlLmcuIC5KUEcpIG9yIHNvdW5kIChlLmcuIC5NUDMpCisgICAgICAgICAgZmlsZXMgYXMgcmF3IGlucHV0LiBUaGUgb2J2aW91cyBxdWVzdGlvbiBpczogaG93IGRvZXMgdGhlCisgICAgICAgICAgcmVjZWl2aW5nIGRldmljZSBrbm93IHdoZW4gaXQgaGFzIHRoZSB3aG9sZSBmaWxlPyBUaGlzIGRlcGVuZHMKKyAgICAgICAgICBvbiB0aGUgZGV2aWNlLCBvZiBjb3Vyc2U7IHVzdWFsbHkgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZgorICAgICAgICAgIHRpbWUgZWxhcHNlcyB3aXRoIG5vdGhpbmcgYXJyaXZpbmcsIG9yIGVsc2Ugd2hlbiBLZXJtaXQgaGFuZ3MKKyAgICAgICAgICB1cCBvciBjbG9zZXMgdGhlIGNvbm5lY3Rpb24uCisKKyAgIFRZUEUgL0NIQVJBQ1RFUi1TRVQ6bmFtZQorICAgICAgICAgIEFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIHNldCBpbiB3aGljaCB0aGUgZmlsZSB0byBiZQorICAgICAgICAgIHR5cGVkIGlzIGVuY29kZWQuCisKKyAgIFRZUEUgL05VTUJFUgorICAgICAgICAgIEFkZHMgbGluZSBudW1iZXJzLgorCisgICBUWVBFIC9PVVRQVVQ6ZmlsZW5hbWUKKyAgICAgICAgICBTZW5kcyB0aGUgcmVzdWx0cyBvZiB0aGUgVFlQRSBjb21tYW5kIHRvIHRoZSBnaXZlbiBmaWxlLgorCisgICBUWVBFIC9UUkFOU0xBVEUtVE86bmFtZQorICAgICAgICAgIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBUWVBFIC9DSEFSQUNURVItU0VUOnh4eDsgYWxsb3dzIHlvdSB0bworICAgICAgICAgIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBzZXQgaW4gd2hpY2ggdGhlIGZpbGUgaXMgdG8gYmUgZGlzcGxheWVkLgorCisgICBUWVBFIC9UUkFOU1BBUkVOVAorICAgICAgICAgIFVzZWQgdG8gZGlzYWJsZSBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGluIHRoZSBUWVBFIGNvbW1hbmQsCisgICAgICAgICAgd2hpY2ggb3RoZXJ3aXNlIGNhbiB0YWtlIHBsYWNlIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gZmlsZQorICAgICAgICAgIHNjYW5uaW5nLCBldmVuIHdoZW4gL0NIQVJBQ1RFUi1TRVQgYW5kIC9UUkFOU0xBVEUtVE8gc3dpdGNoZXMKKyAgICAgICAgICBhcmUgbm90IGdpdmVuLgorCisgICBWT0lEIHRleHQKKyAgICAgICAgICBQYXJzZXMgdGhlIHRleHQsIGV2YWx1YXRpbmcgYW55IGJhY2tzbGFzaCBpdGVtcyBpbiBpdCAoc3VjaCBhcworICAgICAgICAgIGZ1bmN0aW9uIGNhbGxzKSBidXQgZG9lc24ndCBkbyBhbnl0aGluZyBmdXJ0aGVyLCBleGNlcHQKKyAgICAgICAgICBwb3NzaWJseSBwcmludGluZyBlcnJvciBtZXNzYWdlcy4gVXNlZnVsIGZvciBpbnZva2luZyBmdW5jdGlvbnMKKyAgICAgICAgICB0aGF0IGhhdmUgc2lkZSBlZmZlY3RzIHdpdGhvdXQgdXNpbmcgb3IgcHJpbnRpbmcgdGhlaXIgZGlyZWN0CisgICAgICAgICAgcmVzdWx0cywgZS5nLiAidm9pZCBcZnNwbGl0KFwlYSwmYSkiLgorCisgIFN5bWJvbGljIExpbmtzIGluIFVOSVgKKworICAgVGhlIFVOSVggdmVyc2lvbnMgb2YgQy1LZXJtaXQgaGF2ZSBoYWQgL0ZPTExPV0xJTktTIGFuZCAvTk9GT0xMT1dMSU5LUworICAgc3dpdGNoZXMgYWRkZWQgdG8gc2V2ZXJhbCBjb21tYW5kcyB0byBjb250cm9sIHRoZSB0cmVhdG1lbnQgb2YKKyAgIHN5bWJvbGljIGxpbmtzLiBEaWZmZXJlbnQgY29tbWFuZHMgZGVhbCBkaWZmZXJlbnRseSB3aXRoIHN5bWJvbGljCisgICBsaW5rczoKKworICAgS2VybWl0IFNFTkQsIEZUUCBNUFVUCisgICAgICAgICAgL05PRk9MTE9XTElOS1MgaXMgdGhlIGRlZmF1bHQsIHdoaWNoIG1lYW5zIHN5bWJvbGljIGxpbmtzIGFyZQorICAgICAgICAgIHNraXBwZWQgZW50aXJlbHkuIFRoZSBhbHRlcm5hdGl2ZSwgL0ZPTExPV0xJTktTLCBzaG91bGQgYmUgdXNlZAorICAgICAgICAgIHdpdGggY2F1dGlvbiwgc2luY2UgYW4gaW5ub2NlbnQgbGluayBtaWdodCBwb2ludCB0byBhIHdob2xlCisgICAgICAgICAgZmlsZSBzeXN0ZW0sIG9yIGl0IG1pZ2h0IGNhdXNlIGEgbG9vcC4gVGhlcmUgaXMgbm8gd2F5IGluCisgICAgICAgICAgS2VybWl0IG9yIEZUUCBwcm90b2NvbCB0byBzZW5kIHRoZSBsaW5rIGl0c2VsZi4gV2UgZWl0aGVyIHNraXAKKyAgICAgICAgICB0aGVtIG9yIGZvbGxvdyB0aGVtOyB3ZSBjYW4ndCBkdXBsaWNhdGUgdGhlbS4KKworICAgRElSRUNUT1JZCisgICAgICAgICAgL05PRk9MTE9XTElOS1MgaXMgdGhlIGRlZmF1bHQsIHdoaWNoIG1lYW5zIHRoZSBESVJFQ1RPUlkKKyAgICAgICAgICBjb21tYW5kIGxpc3RzIHN5bWJvbGljIGxpbmtzIGluIGEgd2F5IHRoYXQgc2hvd3MgdGhleSBhcmUKKyAgICAgICAgICBsaW5rcywgYnV0IGl0IGRvZXMgbm90IGZvbGxvdyB0aGVtLiBUaGUgYWx0ZXJuYXRpdmUsCisgICAgICAgICAgL0ZPTExPV0xJTktTLCBmb2xsb3dzIGxpbmtzIGFuZCBnaXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgICAgICBsaW5rZWQtdG8gZGlyZWN0b3JpZXMgYW5kIGZpbGVzLgorCisgICBERUxFVEUsIFJNRElSCisgICAgICAgICAgVGhlIERFTEVURSBjb21tYW5kIGRvZXMgbm90IGhhdmUgbGluay1zcGVjaWZpYyBzd2l0Y2hlcy4gREVMRVRFCisgICAgICAgICAgbmV2ZXIgZm9sbG93cyBsaW5rcy4gSWYgeW91IHRlbGwgS2VybWl0IHRvIGRlbGV0ZSBhIHN5bWJvbGljCisgICAgICAgICAgbGluaywgaXQgZGVsZXRlcyB0aGUgbGluayBpdHNlbGYsIG5vdCB0aGUgbGlua2VkLXRvIGZpbGUuIERpdHRvCisgICAgICAgICAgZm9yIFJNRElSLgorCisgICBDT1BZCisgICAgICAgICAgVGhlIENPUFkgY29tbWFuZCBiZWhhdmVzIGp1c3QgbGlrZSB0aGUgVU5JWCBjcCBjb21tYW5kOyBpdAorICAgICAgICAgIGFsd2F5cyBmb2xsb3dzIGxpbmtzLgorCisgICBSRU5BTUUKKyAgICAgICAgICBUaGUgUkVOQU1FIGNvbW1hbmQgYmVoYXZlcyBqdXN0IGxpa2UgdGhlIFVOSVggbXYgY29tbWFuZDsgaXQKKyAgICAgICAgICBvcGVyYXRlcyBvbiBsaW5rcyBkaXJlY3RseSByYXRoZXIgdGhhbiBmb2xsb3dpbmcuCisKKyAgIFsgWzM5MF1Ub3AgXSBbIFszOTFdQ29udGVudHMgXSBbIFszOTJdQy1LZXJtaXQgSG9tZSBdIFsgWzM5M11LZXJtaXQKKyAgIEhvbWUgXQorICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCis4LiBPVEhFUiBTQ1JJUFRJTkcgSU1QUk9WRU1FTlRTCisKKyAgOC4xLiBQZXJmb3JtYW5jZSBhbmQgRGVidWdnaW5nCisKKyAgIEEgY29tbWFuZCBjYWNoZSBmb3IgZnJlcXVlbnRseSB1c2VkIGNvbW1hbmRzIHBsdXMgc29tZSByZWxhdGVkCisgICBvcHRpbWl6YXRpb25zIGluY3JlYXNlcyB0aGUgc3BlZWQgb2YgY29tcHV0ZS1ib3VuZCBzY3JpcHRzIGJ5IGFueXdoZXJlCisgICBmcm9tIDUwJSB0byAxMDAwJS4KKworICAgVGhlIG5ldyBQUk9NUFQgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBzZXQgYnJlYWtwb2ludHMgZm9yIGRlYnVnZ2luZworICAgc2NyaXB0cy4gSWYgZXhlY3V0ZWQgaW4gYSBjb21tYW5kIGZpbGUgb3IgbWFjcm8sIGl0IGdpdmVzIHlvdSBhbgorICAgaW50ZXJhY3RpdmUgY29tbWFuZCBwcm9tcHQgaW4gdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgc2NyaXB0LCB3aXRoCisgICBhbGwgaXRzIHZhcmlhYmxlcywgYXJndW1lbnRzLCBjb21tYW5kIHN0YWNrLCBldGMsIGF2YWlsYWJsZSBmb3IKKyAgIGV4YW1pbmF0aW9uIG9yIGNoYW5nZSwgYW5kIHRoZSBhYmlsaXR5IHRvIHJlc3VtZSB0aGUgc2NyaXB0IGF0IGFueQorICAgcG9pbnQgKEVORCByZXN1bWVzIGl0LCBDdHJsLUMgb3IgU1RPUCBjYW5jZWxzIGl0IGFuZCByZXR1cm5zIHRvIHRvcAorICAgbGV2ZWwpLgorCisgICBUaGUgbmV3IEN0cmwtQyB0cmFwcGluZyBmZWF0dXJlIChbMzk0XVNlY3Rpb24gOC4xNCkgbGV0cyB5b3UgaW50ZXJjZXB0CisgICBpbnRlcnJ1cHRpb24gb2Ygc2NyaXB0cy4gVGhpcyBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZQorICAgUFJPTVBUIGNvbW1hbmQgdG8gZGVidWcgc2NyaXB0cy4gRXhhbXBsZToKKworZGVmaW5lIE9OX0NUUkxDIHsKKyAgICBlY2hvIElOVEVSUlVQVEVEIEJZIENUUkwtQy4uLgorICAgIGVjaG8gVGhlIGNvbW1hbmQgc3RhY2sgaGFzIG5vdCB5ZXQgYmVlbiByb2xsZWQgYmFjazoKKyAgICBzaG93IHN0YWNrCisgICAgZWNobyBUeXBlIEN0cmwtQyBhZ2FpbiBvciB1c2UgdGhlIEVORCBjb21tYW5kIHRvIHJldHVybiB0byB0b3AgbGV2ZWwuCisgICAgcHJvbXB0IERlYnVnPgorfQorCisgICBBZGRpbmcgdGhpcyBPTl9DVFJMIGRlZmluaXRpb24gdG8geW91ciBzY3JpcHQgbGV0cyB5b3UgaW50ZXJydXB0IGl0IGF0CisgICBhbnkgcG9pbnQgYW5kIGdldCBwcm9tcHQgdGhhdCBpcyBpc3N1ZWQgYXQgdGhlIGN1cnJlbnQgY29tbWFuZCBsZXZlbCwKKyAgIHNvIHlvdSBjYW4gcXVlcnkgbG9jYWwgdmFyaWFibGVzLCBldGMuCisKKyAgIFsgWzM5NV1Ub3AgXSBbIFszOTZdQ29udGVudHMgXSBbIFszOTddQy1LZXJtaXQgSG9tZSBdIFsgWzM5OF1LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDguMi4gVXNpbmcgTWFjcm9zIGFzIE51bWVyaWMgVmFyaWFibGVzCisKKyAgIEEgbWFjcm8gaXMgYSB3YXkgdG8gYXNzaWduIGEgdmFsdWUgdG8gYSBuYW1lLCBhbmQgdGhlbiB1c2UgdGhlIG5hbWUgdG8KKyAgIHJlZmVyIHRvIHRoZSB2YWx1ZS4gTWFjcm9zIGFyZSB1c2VkIGluIHR3byB3YXlzIGluIEtlcm1pdDogYXMKKyAgICJzdWJyb3V0aW5lcyIgb3IgZnVuY3Rpb25zIGNvbXBvc2VkIG9mIEtlcm1pdCBjb21tYW5kcywgd2hpY2ggYXJlCisgICBleGVjdXRlZCwgb3IgYXMgdmFyaWFibGVzIHRvIGhvbGQgYXJiaXRyYXJ5IHZhbHVlcyAtLSB0ZXh0LCBudW1iZXJzLAorICAgZmlsZW5hbWVzLCBldGMuCisKKyAgIFdoZW4gYSBtYWNybyBpcyB0byBiZSBleGVjdXRlZCwgaXRzIG5hbWUgaXMgZ2l2ZW4gYXMgaWYgaXQgd2VyZSBhCisgICBDLUtlcm1pdCBjb21tYW5kLCBvcHRpb25hbGx5IHByZWNlZGVkIGJ5IHRoZSB3b3JkICJkbyIuIFdoZW4gYSBtYWNybworICAgaXMgdXNlZCBhcyBhIHZhcmlhYmxlLCBpdCBtdXN0IGJlICJlc2NhcGVkIiB3aXRoIFxtKHh4eCkgKG9yCisgICBlcXVpdmFsZW50IGZ1bmN0aW9uLCBlLmcuIFxzKHh4eCksIFw6KHh4eCksIFxmZGVmaW5pdGlvbih4eHgpKSwgd2hlcmUKKyAgIHh4eCBpcyB0aGUgbWFjcm8gbmFtZSwgZm9yIGV4YW1wbGU6CisKKyAgZGVmaW5lIGZpbGVuYW1lIC91c3Ivb2xnYS9vb2ZhLnR4dAorICBzZW5kIFxtKGZpbGVuYW1lKQorCisgICBPZiBjb3Vyc2UgdmFyaWFibGVzIGNhbiBhbHNvIGhvbGQgbnVtYmVyczoKKworICBkZWZpbmUgc2l6ZSAxNworICBkZWNsYXJlIFwmYVtcbShzaXplKV0KKyAgLi4uCisgIGRlZmluZSBpbmRleCAzCisgIGlmICggPT0gXG0oaW5kZXgpIDMgKSBlY2hvIFRoZSB0aGlyZCB2YWx1ZSBpczogXCZhW1xtKGluZGV4KV0KKyAgZXZhbHVhdGUgaW5kZXggKFxtKGluZGV4KSAqIDQpCisgIGlmICggPiBcbShpbmRleCkgXG0oc2l6ZSkgKSBlY2hvIE91dCBvZiByYW5nZSEKKworICAgQnV0IHRoZXNlIGFyZSBjb250ZXh0cyBpbiB3aGljaCBvbmx5IG51bWJlcnMgYXJlIHZhbGlkLiBDLUtlcm1pdCA4LjAKKyAgIGhhcyBiZWVuIGNoYW5nZWQgdG8gdHJlYXQgbm9uLWVzY2FwZWQgbm9uLW51bWVyaWMgaXRlbXMgaW4gc3RyaWN0bHkKKyAgIG51bWVyaWMgY29udGV4dHMgYXMgbWFjcm8gbmFtZXMuIFNvIGl0IGlzIG5vdyBwb3NzaWJsZSAoYnV0IG5vdAorICAgcmVxdWlyZWQpIHRvIG9taXQgdGhlIFxtKC4uLikgbm90YXRpb24gYW5kIGp1c3QgdXNlIHRoZSBtYWNybyBuYW1lIGluCisgICB0aGVzZSBjb250ZXh0czoKKworICBkZWZpbmUgc2l6ZSAxNworICBkZWNsYXJlIFwmYVtzaXplXQorICAuLi4KKyAgZGVmaW5lIGluZGV4IDMKKyAgaWYgKCA9PSBpbmRleCAzICkgZWNobyBUaGUgdGhpcmQgdmFsdWUgaXM6IFwmYVtpbmRleF0KKyAgZXZhbHVhdGUgaW5kZXggKGluZGV4ICogNCkKKyAgaWYgKCA+IGluZGV4IHNpemUgKSBlY2hvIE91dCBvZiByYW5nZSEKKworICAgVGhpcyBpcyBlc3BlY2lhbGx5IG5pY2UgZm9yIGxvb3BzIHRoYXQgZGVhbCB3aXRoIGFycmF5cy4gSGVyZSwgZm9yCisgICBleGFtcGxlLCBpcyBhIGxvb3AgdGhhdCByZXZlcnNlcyB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGluIGFuCisgICBhcnJheS4gV2hlcmVhcyBmb3JtZXJseSBpdCB3YXMgbmVjZXNzYXJ5IHRvIHdyaXRlOgorCisgIC5cJW4gOjo9IFxmZGltKCZhKQorICBmb3IgXCVpIDEgXCVuLzIgMSB7CisgICAgICAudG1wIDo9IFwmYVtcJW4tXCVpKzFdCisgICAgICAuXCZhW1wlbi1cJWkrMV0gOj0gXCZhW1wlaV0KKyAgICAgIC5cJmFbXCVpXSA6PSBcbSh0bXApCisgIH0KKworICAgUmVjb2RpbmcgdGhpcyB0byB1c2UgbWFjcm8gbmFtZXMgImkiIGFuZCAibiIgaW5zdGVhZCBvZiB0aGUgYmFja3NsYXNoCisgICB2YXJpYWJsZXMgXCVpIGFuZCBcJW4sIHdlIGhhdmU6CisKKyAgLm4gOjo9IFxmZGltKCZhKQorICBmb3IgaSAxIG4vMiAxIHsKKyAgICAgIC50bXAgOj0gXCZhW24taSsxXQorICAgICAgLlwmYVtuLWkrMV0gOj0gXCZhW2ldCisgICAgICAuXCZhW2ldIDo9IFxtKHRtcCkKKyAgfQorCisgICB3aGljaCByZWR1Y2VzIHRoZSBiYWNrc2xhc2ggY291bnQgdG8gbGVzcyB0aGFuIGhhbGYuIFRoZSBmaW5hbAorICAgc3RhdGVtZW50IGluIHRoZSBsb29wIGNvdWxkIGJlIHdyaXR0ZW4gIi5cJmFbaV0gOjo9IHRtcCIgaWYgdGhlIGFycmF5CisgICBjb250YWluZWQgb25seSBudW1iZXJzIChzaW5jZSA6Oj0gaW5kaWNhdGVzIGFyaXRobWV0aWMgZXhwcmVzc2lvbgorICAgZXZhbHVhdGlvbikuCisKKyAgIEFsc28sIG5vdyB5b3UgY2FuIHVzZSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGluIGludGVnZXIgY29udGV4dHMgKHN1Y2gKKyAgIGFzIGFycmF5IHN1YnNjcmlwdHMpLCBpbiB3aGljaCBjYXNlIHRoZXkgYXJlIHRydW5jYXRlZCB0byBhbiBpbnRlZ2VyCisgICB2YWx1ZSAoaS5lLiB0aGUgZnJhY3Rpb25hbCBwYXJ0IGlzIGRpc2NhcmRlZCkuCisKKyAgIEV4YW1wbGVzIG9mIG51bWVyaWMgY29udGV4dHMgaW5jbHVkZToKKworICAgICAqIEFycmF5IHN1YnNjcmlwdHMuCisgICAgICogQW55IG51bWVyaWMgZnVuY3Rpb24gYXJndW1lbnQuCisgICAgICogUmlnaHQtaGFuZCBzaWRlIG9mIDo6PSBhc3NpZ25tZW50cy4KKyAgICAgKiBFVkFMVUFURSBjb21tYW5kIG9yIFxmZXZhbHVhdGUoKSBmdW5jdGlvbiBleHByZXNzaW9uLgorICAgICAqIFRoZSBJTkNSRU1FTlQgb3IgREVDUkVNRU5UIGJ5LXZhbHVlLgorICAgICAqIElGID0sID4sIDwsICE9LCA+PSwgYW5kIDw9IGNvbXBhcmFuZHMuCisgICAgICogVGhlIElGIG51bWJlciBjb25zdHJ1Y3QuCisgICAgICogRk9SLWxvb3AgdmFyaWFibGVzLgorICAgICAqIFNUT1AsIEVORCwgYW5kIEVYSVQgc3RhdHVzIGNvZGVzLgorICAgICAqIFRoZSBJTlBVVCB0aW1lb3V0IHZhbHVlLgorICAgICAqIFBBVVNFLCBXQUlULCBTTEVFUCwgTVNMRUVQIGludGVydmFscy4KKyAgICAgKiBUaGUgU0hJRlQgYXJndW1lbnQuCisgICAgICogTnVtZXJpYyBzd2l0Y2ggYXJndW1lbnRzLCBlLmcuIFRZUEUgL1dJRFRIOm51bWJlciwgU0VORAorICAgICAgIC9MQVJHRVI6bnVtYmVyLgorICAgICAqIFNDUkVFTiBNT1ZFLVRPIHJvdyBhbmQgY29sdW1uIG51bWJlci4KKyAgICAgKiBWYXJpb3VzIFNFVCBESUFMIHBhcmFtZXRlcnMgKHRpbWVvdXQsIHJldHJ5IGxpbWl0LCBldGMpLgorICAgICAqIFZhcmlvdXMgU0VUIFNFTkQgb3IgUkVDRUlWRSBwYXJhbWV0ZXJzIChwYWNrZXQgbGVuZ3RoLCB3aW5kb3cKKyAgICAgICBzaXplLCBldGMpLgorICAgICAqIFZhcmlvdXMgb3RoZXIgU0VUIHBhcmFtZXRlcnMuCisKKyAgIGFuZDoKKworICAgICAqIFMtRXhwcmVzc2lvbnMgKGV4cGxhaW5lZCBpbiBbMzk5XVNlY3Rpb24gOSkuCisKKyAgIE1hY3JvIG5hbWVzIHVzZWQgaW4gbnVtZXJpYyBjb250ZXh0cyBtdXN0IG5vdCBpbmNsdWRlIG1hdGhlbWF0aWNhbAorICAgb3BlcmF0b3JzLiBBbHRob3VnaCBpdCBpcyBsZWdhbCB0byBjcmVhdGUgYSBtYWNybyBjYWxsZWQgImZvbytiYXIiLCBpbgorICAgYSBudW1lcmljIGNvbnRleHQgdGhpcyB3b3VsZCBiZSB0YWtlbiBhcyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgb2YKKyAgICJmb28iIGFuZCAiYmFyIi4gQW55IHN1Y2ggY29uZmxpY3QgY2FuIGJlIGF2b2lkZWQsIG9mIGNvdXJzZSwgYnkKKyAgIGVuY2xvc2luZyB0aGUgbWFjcm8gbmFtZSBpbiBcbSguLi4pLgorCisgICBbIFs0MDBdVG9wIF0gWyBbNDAxXUNvbnRlbnRzIF0gWyBbNDAyXUMtS2VybWl0IEhvbWUgXSBbIFs0MDNdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA4LjMuIE5ldyBJRiBDb25kaXRpb25zCisKKyAgIFNldmVyYWwgbmV3IElGIGNvbmRpdGlvbnMgYXJlIGF2YWlsYWJsZToKKworICAgSUYgREVDTEFSRUQgYXJyYXluYW1lCisgICAgICAgICAgRXhwbGFpbmVkIGluIFs0MDRdU2VjdGlvbiA4LjYuCisKKyAgIElGIEtCSElUCisgICAgICAgICAgQWxsb3dzIGEgc2NyaXB0IHRvIHRlc3Qgd2hldGhlciBhIGtleSB3YXMgcHJlc3NlZCB3aXRob3V0CisgICAgICAgICAgYWN0dWFsbHkgdHJ5aW5nIHRvIHJlYWQgaXQuCisKKyAgIElGIEtFUkJBTkcgKFVuaXggb25seSkKKyAgICAgICAgICBUcnVlIGlmIEtlcm1pdCB3YXMgc3RhcnRlZCBmcm9tIGEgS2VyYmFuZyBzY3JpcHQuIFRoaXMgaXMKKyAgICAgICAgICB1c2VmdWwgZm9yIGtub3dpbmcgaG93IHRvIGludGVycHJldCB0aGUgXCZAW10gYW5kIFwmX1tdCisgICAgICAgICAgYXJndW1lbnQgdmVjdG9yIGFycmF5cywgYW5kIHVuZGVyIHdoYXQgY29uZGl0aW9ucyB0byBleGl0LgorCisgICBJRiBJTlRFR0VSIG4KKyAgICAgICAgICBUaGlzIGlzIGp1c3QgYSBzeW5vbnltIGZvciBJRiBOVU1FUklDLCB3aGljaCBpcyB0cnVlIGlmIG4KKyAgICAgICAgICBjb250YWlucyBvbmx5IGRpZ2l0cyAob3IsIGlmIG4gaXMgYSB2YXJpYWJsZSwgaXRzIHZhbHVlCisgICAgICAgICAgY29udGFpbnMgb25seSBkaWdpdHMpLgorCisgICBCeSBjb250cmFzdCwgSUYgRkxPQVQgbiBzdWNjZWVkcyBpZiBuIGlzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIE9SIGFuCisgICBpbnRlZ2VyIChvciBhIHZhcmlhYmxlIHdpdGggZmxvYXRpbmctcG9pbnQgb3IgaW50ZWdlciB2YWx1ZSkuCisgICBUaGVyZWZvcmUsIElGIEZMT0FUIHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIGFueSBraW5kIG9mIG51bWJlciBpcworICAgYWNjZXB0YWJsZSwgd2hlcmVhcyBJRiBJTlRFR0VSIChvciBJRiBOVU1FUklDKSB3aGVuIG9ubHkgYW4gaW50ZWdlcgorICAgY2FuIGJlIHVzZWQuCisKKyAgIFsgWzQwNV1Ub3AgXSBbIFs0MDZdQ29udGVudHMgXSBbIFs0MDddQy1LZXJtaXQgSG9tZSBdIFsgWzQwOF1LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDguNC4gVGhlIE9OX1VOS05PV05fQ09NTUFORCBNYWNybworCisgICBUaGUgbmV3IE9OX1VOS05PV05fQ09NTUFORCBtYWNybywgaWYgZGVmaW5lZCwgaXMgZXhlY3V0ZWQgd2hlbmV2ZXIgeW91CisgICBnaXZlIGEgY29tbWFuZCB0aGF0IGlzIG5vdCBrbm93biB0byBDLUtlcm1pdDsgYW55IG9wZXJhbmRzIGFyZSBwYXNzZWQKKyAgIGFzIGFyZ3VtZW50cy4gSGVyZSBhcmUgc29tZSBzYW1wbGUgZGVmaW5pdGlvbnM6CisKKyAgREVGIE9OX1VOS05PV05fQ09NTUFORCB0ZWxuZXQgXCUxIDsgVHJlYXQgdW5rbm93biBjb21tYW5kcyBhcyBob3N0bmFtZXMKKyAgREVGIE9OX1VOS05PV05fQ09NTUFORCBkaWFsIFwlMSAgIDsgVHJlYXQgdW5rbm93biBjb21tYW5kcyBwaG9uZSBudW1iZXJzCisgIERFRiBPTl9VTktOT1dOX0NPTU1BTkQgdGFrZSBcJTEgICA7IFRyZWF0IHVua25vd24gY29tbWFuZHMgYXMgZmlsZW5hbWVzCisgIERFRiBPTl9VTktOT1dOX0NPTU1BTkQgIVwlKiAgICAgICA7IFRyZWF0IHVua25vd24gY29tbWFuZHMgYXMgc2hlbGwgY29tbWFuZHMKKworICAgVGhlIE9OX0NEIG1hY3JvLCBpZiBkZWZpbmVkLCBpcyBleGVjdXRlZCB3aGVuZXZlciBLZXJtaXQgaXMgZ2l2ZW4gYSBDRAorICAgKGNoYW5nZSBkaXJlY3RvcnkpIGNvbW1hbmQgKDguMC4yMTEpLiBVcG9uIGVudHJ5IHRvIHRoaXMgbWFjcm8sIHRoZQorICAgZGlyZWN0b3J5IGhhcyBhbHJlYWR5IGNoYW5nZWQgYW5kIHRoZSBuZXcgZGlyZWN0b3J5IHN0cmluZyBpcworICAgYXZhaWxhYmxlIGluIHRoZSBcdihkaXJlY3RvcnkpIHZhcmlhYmxlLCBhbmQgYWxzbyBhcyB0aGUgZmlyc3QKKyAgIGFyZ3VtZW50IChcJTEpLgorCisgICBbIFs0MDldVG9wIF0gWyBbNDEwXUNvbnRlbnRzIF0gWyBbNDExXUMtS2VybWl0IEhvbWUgXSBbIFs0MTJdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA4LjUuIFRoZSBTSE9XIE1BQ1JPIENvbW1hbmQKKworICAgVGhlIFNIT1cgTUFDUk8gY29tbWFuZCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGFjY2VwdCBtb3JlIHRoYW4gb25lIG1hY3JvCisgICBuYW1lOgorCisgIChzZXRxIGEgMSBiIDIgYyAzKQorICBzaG93IG1hYyBhIGIgYworICBhID0gMQorICBiID0gMgorICBjID0gMworCisgICBBbiBleGFjdCBtYXRjaCBpcyByZXF1aXJlZCBmb3IgZWFjaCBuYW1lIChleGNlcHQgdGhhdCBjYXNlIGRvZXNuJ3QKKyAgIG1hdHRlcikuIElmIHlvdSBpbmNsdWRlIHdpbGRjYXJkIGNoYXJhY3RlcnMsIGhvd2V2ZXIsIGEgcGF0dGVybiBtYXRjaAorICAgaXMgcGVyZm9ybWVkOgorCisgIHNob3cgbWFjIFthLWNdKngKKworICAgc2hvd3MgYWxsIG1hY3JvcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIGEsIGIsIG9yIGMsIGFuZCBlbmQgd2l0aCB4LgorCisgICBbIFs0MTNdVG9wIF0gWyBbNDE0XUNvbnRlbnRzIF0gWyBbNDE1XUMtS2VybWl0IEhvbWUgXSBbIFs0MTZdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA4LjYuIEFycmF5cworCisgICBBIGNsYXJpZmljYXRpb24gcmVnYXJkaW5nIHJlZmVyZW5jZXMgdG8gYXJyYXkgbmFtZXMgKGFzIG9wcG9zZWQgdG8KKyAgIGFycmF5IGVsZW1lbnRzKTogWW91IGNhbiB1c2UgYXJyYXktbmFtZSAiYWJicmV2aWF0aW9ucyIgbGlrZSAmYSBvbmx5CisgICBpbiBjb250ZXh0cyB0aGF0IGV4cGVjdCBhcnJheSBuYW1lcywgbGlrZSBBUlJBWSBjb21tYW5kcyBvciBhcnJheS1uYW1lCisgICBmdW5jdGlvbiBhcmd1bWVudHMgc3VjaCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIFxmc3BsaXQoKS4gSW4gYQorICAgTE9DQUwgc3RhdGVtZW50LCBob3dldmVyLCB5b3UgaGF2ZSB0byB3cml0ZSBcJmFbXSwgc2luY2UgImxvY2FsICZhIgorICAgbWlnaHQgcmVmZXIgdG8gYSBtYWNybyBuYW1lZCAiJmEiLgorCisgICBJbiBmdW5jdGlvbiBhcmd1bWVudHMsIGhvd2V2ZXIsIHlvdSBNVVNUIHVzZSB0aGUgYWJicmV2aWF0ZWQgZm9ybToKKyAgIFxmc3BsaXQoXCVhLCZhKSBvciBcZnNwbGl0KFwlYSwmYVtdKS4gSWYgeW91IGluY2x1ZGUgdGhlIGJhY2tzbGFzaCAoYXMKKyAgIGluICJcZnNwbGl0KFwlYSxcJmFbXSkiKSBhIHBhcnNlIGVycm9yIG9jY3Vycy4KKworICAgSGVyZSBhcmUgdGhlIG5ldyBhcnJheS1yZWxhdGVkIGNvbW1hbmRzOgorCisgICBJRiBERUNMQVJFRCBhcnJheW5hbWUKKyAgICAgICAgICBBbGxvd3MgYSBzY3JpcHQgdG8gdGVzdCB3aGV0aGVyIGFuIGFycmF5IGhhcyBiZWVuIGRlY2xhcmVkLiBUaGUKKyAgICAgICAgICBhcnJheW5hbWUgY2FuIGJlIGEgbm9uLWFycmF5IGJhY2tzbGFzaCB2YXJpYWJsZSBzdWNoIGFzIFwlMSBvcgorICAgICAgICAgIFxtKG5hbWUpLCBpbiB3aGljaCBjYXNlIGl0IGlzIGV2YWx1YXRlZCBmaXJzdCwgYW5kIHRoZSByZXN1bHQKKyAgICAgICAgICBpcyB0cmVhdGVkIGFzIHRoZSBhcnJheSBuYW1lLiBPdGhlcndpc2UsIGFycmF5bmFtZSBpcyB0cmVhdGVkCisgICAgICAgICAgYXMgaW4gdGhlIEFSUkFZIGNvbW1hbmRzOiBpdCBjYW4gYmUgYSwgJmEsICZhW10sIFwmYSwgXCZhW10sCisgICAgICAgICAgXCZhWzNdLCBcJmFbMzo5XSwgZXRjLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSByZXN1bHRzIGluIGVhY2gKKyAgICAgICAgICBjYXNlLiBTeW5vbnltOiBJRiBEQ0wuCisKKyAgIFVOREVDTEFSRSBhcnJheW5hbWUKKyAgICAgICAgICBVTkRFQ0xBUkUgaXMgYSBuZXcgdG9wLWxldmVsIGNvbW1hbmQgdG8gdW5kZWNsYXJlIGFuIGFycmF5LgorICAgICAgICAgIFByZXZpb3VzbHkgdGhpcyBjb3VsZCBvbmx5IGJlIGRvbmUgd2l0aCAiZGVjbGFyZSBcJmFbMF0iIChpLmUuCisgICAgICAgICAgcmUtZGVjbGFyZSB0aGUgYXJyYXkgd2l0aCBhIGRpbWVuc2lvbiBvZiAwKS4KKworICAgQVJSQVkgTElOSyBsaW5rbmFtZSBhcnJheW5hbWUKKyAgICAgICAgICBDcmVhdGVzIGEgc3ltYm9saWMgbGluayBmcm9tIHRoZSBhcnJheSBuYW1lZCBieSBsaW5rbmFtZSAod2hpY2gKKyAgICAgICAgICBtdXN0IGJlIHRoZSBuYW1lIG9mIGFuIGFycmF5IHRoYXQgaXMgbm90IHlldCBkZWNsYXJlZCBpbiB0aGUKKyAgICAgICAgICBjdXJyZW50IGNvbnRleHQpIHRvIHRoZSBhcnJheSBuYW1lZCBieSBhcnJheW5hbWUgKHdoaWNoIG11c3QKKyAgICAgICAgICB0aGUgbmFtZSBvZiBhIGN1cnJlbnRseSBkZWNsYXJlZCBhcnJheSB0aGF0IGlzIG5vdCBpdHNlbGYgYQorICAgICAgICAgIGxpbmssIG9yIGEgdmFyaWFibGUgY29udGFpbmluZyB0aGUgbmFtZSBvZiBzdWNoIGFuIGFycmF5KS4gVGhlCisgICAgICAgICAgdHdvIG5hbWVzIGluZGljYXRlIHRoZSBzYW1lIGFycmF5OiBpZiB5b3UgY2hhbmdlIGFuIGFycmF5CisgICAgICAgICAgZWxlbWVudCwgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgaW4gdGhlIGxpbmsgdG9vLCBhbmQgdmljZQorICAgICAgICAgIHZlcnNhLiBJZiB5b3UgdW5kZWNsYXJlIHRoZSBsaW5rLCB0aGUgcmVhbCBhcnJheSBpcyB1bmFmZmVjdGVkLgorICAgICAgICAgIElmIHlvdSB1bmRlY2xhcmUgdGhlIHJlYWwgYXJyYXksIGFsbCBsaW5rcyB0byBpdCBkaXNhcHBlYXIuIElmCisgICAgICAgICAgeW91IHJlc2l6ZSBhbiBhcnJheSAoZGlyZWN0bHkgb3IgdGhyb3VnaCBhIGxpbmspLCBhbGwgbGlua3MgdG8KKyAgICAgICAgICBpdCBhcmUgdXBkYXRlZCBhdXRvbWF0aWNhbGx5LgorCisgICBBcnJheSBsaW5rcyBsZXQgeW91IHBhc3MgYXJyYXkgbmFtZXMgYXMgYXJndW1lbnRzIHRvIG1hY3Jvcy4gRm9yCisgICBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYWQgYSBwcm9ncmFtIHRoYXQgbmVlZGVkIHRvIHVwcGVyY2FzZSBhbGwgdGhlCisgICBlbGVtZW50cyBvZiBkaWZmZXJlbnQgYXJyYXlzIGF0IGRpZmZlcmVudCB0aW1lcy4gWW91IGNvdWxkIHdyaXRlIGEKKyAgIG1hY3JvIHRvIGRvIHRoaXMsIHdpdGggdGhlIGFycmF5IG5hbWUgYXMgYW4gYXJndW1lbnQuIEJ1dCB3aXRob3V0CisgICBhcnJheSBsaW5rcywgdGhlcmUgd291bGQgYmUgbm8gd2F5IHRvIHJlZmVyIHRvIHRoZSBhcmd1bWVudCBhcnJheQorICAgd2l0aGluIHRoZSBtYWNyby4gQXJyYXkgbGlua3MgbWFrZSBpdCBlYXN5OgorCisgIGRlZmluZSBhcnJheXVwcGVyIHsKKyAgICAgIGxvY2FsIFwmZVtdIFwlaQorICAgICAgYXJyYXkgbGluayBcJmVbXSBcJTEKKyAgICAgIGZvciBpIDEgXGZkaW0oJmUpIDEgeyAuXCZlW2ldIDo9IFxmdXBwZXIoXCZlW2ldKSB9CisgIH0KKyAgZGVjbGFyZSBcJmFbXSA9IHRoZXNlIGFyZSBzb21lIHdvcmRzCisgIGFycmF5dXBwZXIgJmEKKyAgc2hvdyBhcnJheSAmYQorCisgICBUaGUgbWFjcm8gZGVjbGFyZXMgdGhlIGFycmF5IGxpbmsgTE9DQUwsIHdoaWNoIG1lYW5zIGl0IGRvZXNuJ3QKKyAgIGNvbmZsaWN0IHdpdGggYW55IGFycmF5IG9mIHRoZSBzYW1lIG5hbWUgdGhhdCBtaWdodCBleGlzdCBvdXRzaWRlIHRoZQorICAgbWFjcm8sIGFuZCB0aGF0IHRoZSBsaW5rIGlzIGRlc3Ryb3llZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIG1hY3JvCisgICBleGl0cy4gVGhpcyB3b3JrcywgYnkgdGhlIHdheSwgZXZlbiBpZiB0aGUgbGluayBuYW1lIGFuZCB0aGUgbWFjcm8KKyAgIGFyZ3VtZW50IG5hbWUgYXJlIHRoZSBzYW1lLCBhcyBsb25nIGFzIHRoZSBsaW5rIGlzIGRlY2xhcmVkIExPQ0FMLgorCisgICBBcyBub3RlZCwgeW91IGNhbid0IG1ha2UgYSBsaW5rIHRvIGEgbm9uZXhpc3RlbnQgYXJyYXkuIFNvIHdoZW4KKyAgIHdyaXRpbmcgYSBtYWNybyB3aG9zZSBqb2IgaXMgdG8gY3JlYXRlIGFuIGFycmF5IHdob3NlIG5hbWUgaXMgcGFzc2VkCisgICBhcyBhbiBhcmd1bWVudCwgeW91IG11c3QgZGVjbGFyZSB0aGUgYXJyYXkgZmlyc3QgKHRoZSBzaXplIGRvZXNuJ3QKKyAgIG1hdHRlciBhcyBsb25nIGFzIGl0J3MgZ3JlYXRlciB0aGFuIDApLiBFeGFtcGxlOgorCisgIGRlZmluZSB0cnltZSB7ICAgICAgICAgICAgICAgIDsgRGVtb25zdHJhdGlvbiBtYWNybworICAgICAgbG9jYWwgXCZlW10gICAgICAgICAgICAgICA7IFdlIG9ubHkgbmVlZCB0aGlzIGluc2lkZSB0aGUgbWFjcm8KKyAgICAgIGFycmF5IGxpbmsgXCZlW10gXCUxICAgICAgOyBNYWtlIGxvY2FsIGxpbmsKKyAgICAgIHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgOyBTaGlmdCBhcmd1bWVudCBsaXN0CisgICAgICB2b2lkIFxmc3BsaXQoXCUqLCZlKSAgICAgIDsgU3BsaXQgcmVtYWluZGVyIG9mIGFyZyBsaXN0IGludG8gYXJyYXkKKyAgfQorICBkZWNsYXJlIFwmYVsxXSAgICAgICAgICAgICAgICA7IERlY2xhcmUgdGFyZ2V0IGFycmF5IGluIGFkdmFuY2UKKyAgdHJ5bWUgJmEgaGVyZSBhcmUgc29tZSB3b3JkcyAgOyBJbnZva2UgdGhlIG1hY3JvIHdpdGggYXJyYXkgbmFtZSBhbmQgd29yZHMKKyAgc2hvdyBhcnJheSBhICAgICAgICAgICAgICAgICAgOyBTZWUgdGhlIHJlc3VsdHMKKworICAgT25lIGZpbmFsIGltcHJvdmVtZW50IGFsbG93cyB0aGUgbWFjcm8gaXRzZWxmIHRvIGRlY2xhcmUgdGhlIGFycmF5CisgICAodGhpcyB3YXMgbm90IHBvc3NpYmxlIGluIGVhcmxpZXIgS2VybWl0IHJlbGVhc2VzKTogaWYgdGhlIGFycmF5IG5hbWUKKyAgIGluIHRoZSBERUNMQVJFIGNvbW1hbmQgaXMgYSB2YXJpYWJsZSAoYW5kIG5vdCBhbiBhcnJheSBuYW1lKSwgb3IKKyAgIGluY2x1ZGVzIHZhcmlhYmxlcywgdGhlIHJlc3VsdGluZyB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBhcnJheSBuYW1lLiBTbzoKKworICBkZWZpbmUgdHJ5bWUgeyAgICAgICAgICAgICAgICA7IERlbW9uc3RyYXRpb24gbWFjcm8KKyAgICAgIGRlY2xhcmUgXCUxWzFdICAgICAgICAgICAgOyBQcmVsaW1pbmFyeSBkZWNsYXJhdGlvbiBmb3IgdGFyZ2V0IGFycmF5CisgICAgICBsb2NhbCBcJmVbXSAgICAgICAgICAgICAgIDsgV2Ugb25seSBuZWVkIHRoaXMgaW5zaWRlIHRoZSBtYWNybworICAgICAgYXJyYXkgbGluayBcJmVbXSBcJTEgICAgICA7IE1ha2UgbG9jYWwgbGluaworICAgICAgc2hpZnQgICAgICAgICAgICAgICAgICAgICA7IFNoaWZ0IGFyZ3VtZW50IGxpc3QKKyAgICAgIHZvaWQgXGZzcGxpdChcJSosJmUpICAgICAgOyBTcGxpdCByZW1haW5kZXIgb2YgYXJnIGxpc3QgaW50byBhcnJheQorICB9CisgIHRyeW1lICZhIGhlcmUgYXJlIHNvbWUgd29yZHMgIDsgSW52b2tlIHRoZSBtYWNybyB3aXRoIGFycmF5IG5hbWUgYW5kIHdvcmRzCisgIHNob3cgYXJyYXkgYSAgICAgICAgICAgICAgICAgIDsgU2VlIHRoZSByZXN1bHRzCisKKyAgIFRoZSBTSE9XIEFSUkFZIGNvbW1hbmQgbm93IGluZGljYXRlcyB3aGV0aGVyIGFuIGFycmF5IG5hbWUgaXMgYSBsaW5rLgorCisgICBBbHNvIHNlZSB0aGUgZGVzY3JpcHRpb25zIG9mIFs0MTddXGZqb2luKCkgYW5kIFs0MThdXGZzcGxpdCgpLCBwbHVzCisgICBbNDE5XVNlY3Rpb24gOC4xMCBvbiB0aGUgTUlOUFVUIGNvbW1hbmQsIHdoaWNoIHNob3dzIGhvdyBhbiBlbnRpcmUKKyAgIGFycmF5IChvciBzZWdtZW50IG9mIGl0KSBjYW4gYmUgdXNlZCBhcyB0aGUgTUlOUFVUIHRhcmdldCBsaXN0LgorCisgICBbIFs0MjBdVG9wIF0gWyBbNDIxXUNvbnRlbnRzIF0gWyBbNDIyXUMtS2VybWl0IEhvbWUgXSBbIFs0MjNdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA4LjcuIE5ldyBvciBJbXByb3ZlZCBCdWlsdC1pbiBWYXJpYWJsZXMgYW5kIEZ1bmN0aW9ucworCisgICBUaGUgZm9sbG93aW5nIG5ldyBidWlsdC1pbiB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZToKKworICBcdihidWlsZGlkKSAgICAgICBBIGRhdGUgc3RyaW5nIGxpa2UgIjIwMDAwODA4IiBpbmRpY2F0aW5nIHdoZW4gQy1LZXJtaXQgd2FzCitidWlsdC4KKyAgXHYoZnRpbWUpICAgICAgICAgQ3VycmVudCB0aW1lLCBzZWNzIHNpbmNlIG1pZG5pZ2h0LCBpbmNsdWRpbmcgZnJhY3Rpb24gb2Ygc2UKK2NvbmQuCisgIFx2KGlwcm9tcHQpICAgICAgIFRoZSBjdXJyZW50IFNFVCBQUk9NUFQgdmFsdWUKKyAgXHYoc2V4cCkgICAgICAgICAgVGhlIG1vc3QgcmVjZW50IFMtRXhwcmVzc2lvbiAoc2VlIFs0MjRdU2VjdGlvbiA5KQorICBcdihzZGVwdGgpICAgICAgICBUaGUgY3VycmVudCBTLUV4cHJlc3Npb24gaW52b2NhdGlvbiBkZXB0aCAoWzQyNV1TZWN0aW9uIDkpCisgIFx2KHN2YWx1ZSkgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgbW9zdCByZWNlbnQgUy1FeHByZXNzaW9uIChbNDI2XVNlY3Rpb24gOSkKKworICBcdihmdHBfY29kZSkgICAgICBNb3N0IHJlY2VudCBGVFAgcmVzcG9uc2UgY29kZSAoWzQyN11TZWN0aW9uIDMpCisgIFx2KGZ0cF9jb25uZWN0ZWQpIEZUUCBjb25uZWN0aW9uIHN0YXR1cyAoWzQyOF1TZWN0aW9uIDMpCisgIFx2KGZ0cF9jcGwpICAgICAgIEZUUCBDb21tYW5kIFByb3RlY3Rpb24gTGV2ZWwgKFs0MjldU2VjdGlvbiAzLjIpCisgIFx2KGZ0cF9kcGwpICAgICAgIEZUUCBEYXRhIFByb3RlY3Rpb24gTGV2ZWwgKFs0MzBdU2VjdGlvbiAzLjIpCisgIFx2KGZ0cF9nZXRwdXRyZW1vdGUpIFRoZSBjdXJyZW50IFNFVCBHRVQtUFVULVJFTU9URSBzZXR0aW5nIChbNDMxXVNlY3Rpb24gMy44CispCisgIFx2KGZ0cF9ob3N0KSAgICAgIE5hbWUgb3IgSVAgYWRkcmVzcyBvZiBGVFAgc2VydmVyIChbNDMyXVNlY3Rpb24gMykKKyAgXHYoZnRwX2xvZ2dlZGluKSAgRlRQIGxvZ2luIHN0YXR1cyAoWzQzM11TZWN0aW9uIDMpCisgIFx2KGZ0cF9tZXNzYWdlKSAgIE1vc3QgcmVjZW50IEZUUCByZXNwb25zZSBtZXNzYWdlIChbNDM0XVNlY3Rpb24gMykKKyAgXHYoZnRwX3NlY3VyaXR5KSAgRlRQIFNlY3VyaXR5IG1ldGhvZCAoWzQzNV1TZWN0aW9uIDMuMikKKyAgXHYoZnRwX3NlcnZlcikgICAgT1MgdHlwZSBvZiBGVFAgc2VydmVyIChbNDM2XVNlY3Rpb24gMykKKworICBcdihodHRwX2NvZGUpICAgICAgIE1vc3QgcmVjZW50IEhUVFAgcmVzcG9uc2UgY29kZQorICBcdihodHRwX2Nvbm5lY3RlZCkgIEhUVFAgY29ubmVjdGlvbiBzdGF0dXMKKyAgXHYoaHR0cF9ob3N0KSAgICAgICBOYW1lIG9yIElQIGFkZHJlc3Mgb2YgSFRUUCBzZXJ2ZXIKKyAgXHYoaHR0cF9tZXNzYWdlKSAgICBNb3N0IHJlY2VudCBIVFRQIHJlc3BvbnNlIG1lc3NhZ2UKKyAgXHYoaHR0cF9zZWN1cml0eSkgICBUTFMgY2lwaGVyIHVzZWQgdG8gc2VjdXJlIHRoZSBIVFRQIHNlc3Npb24KKworICBcdihob3VyKSAgICAgICAgICAgIEhvdXIgb2YgdGhlIGRheSwgMCB0byAyMy4KKyAgXHYodGltZXN0YW1wKSAgICAgICBFcXVpdmFsZW50IHRvICJcdihuZGF0ZSkgXHYodGltZSkiLgorCisgIFx2KGxvZ19kZWJ1ZykgICAgICAgQ3VycmVudCBkZWJ1ZyBsb2cgZmlsZSwgaWYgYW55LgorICBcdihsb2dfcGFja2V0KSAgICAgIEN1cnJlbnQgcGFja2V0IGxvZyBmaWxlLCBpZiBhbnkuCisgIFx2KGxvZ19zZXNzaW9uKSAgICAgQ3VycmVudCBzZXNzaW9uIGxvZyBmaWxlLCBpZiBhbnkuCisgIFx2KGxvZ190cmFuc2FjdGlvbikgQ3VycmVudCB0cmFuc2FjdGlvbiBsb2cgZmlsZSwgaWYgYW55LgorICBcdihsb2dfY29ubmVjdGlvbikgIEN1cnJlbnQgY29ubmVjdGlvbiBsb2cgZmlsZSwgaWYgYW55LgorCisgICBUaGUgZm9sbG93aW5nIG5ldyBvciBpbXByb3ZlZCBidWlsdC1pbiBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZToKKworICBcZmNtZHN0YWNrKCkgICAgICAgICAgICBBbGxvd3MgcHJvZ3JhbW1hdGljIGFjY2VzcyB0byB0aGUgY29tbWFuZCBzdGFjay4KKyAgXGZjdnRkYXRlKCkgICAgICAgICAgICAgWzQzN11TZWN0aW9uIDguMTMsIGZvcm1hdCBvcHRpb25zIGFkZGVkCisgIFxmZGVsdGEyc2VjcygpICAgICAgICAgIFs0MzhdU2VjdGlvbiA4LjEzCisgIFxmZG9zdG91bml4cGF0aChzMSkgICAgIENvbnZlcnRzIGEgRE9TIGZpbGVuYW1lIHRvIFVuaXggZm9ybWF0LgorICBcZnNwbGl0KCkgICAgICAgICAgICAgICBOb3cgYWxsb3dzIGdyb3VwaW5nL25lc3RpbmcgaW4gc291cmNlIHN0cmluZy4KKyAgXGZ3b3JkKCkgICAgICAgICAgICAgICAgQWxsb3dzIHRoZSBzYW1lIGdyb3VwaW5nIGFuZCBuZXN0aW5nLgorICBcZmpvaW4oJmEsczEsbjEsbjIpICAgICBDb3BpZXMgYW4gYXJyYXkgaW50byBhIHNpbmdsZSBzdHJpbmcuCisgIFxmc3Vic3RpdHV0ZShzMSxzMixzMykgIFN1YnN0aXR1dGVzIGNoYXJhY3RlcnMgd2l0aGluIGEgc3RyaW5nLgorICBcZnJlcGxhY2UoKSAgICAgICAgICAgICBIYXMgbmV3IDR0aCAib2NjdXJyZW5jZSIgYXJndW1lbnQuCisgIFxmc2V4cHJlc3Npb24oKSAgICAgICAgIEV2YWx1YXRlcyBhbiBTLUV4cHJlc3Npb24gKGV4cGxhaW5lZCBpbiBbNDM5XVNlY3Rpb24KKzkpLgorICBcZnRyaW0oKSwgXGZsdHJpbSgpICAgICBOb3cgdHJpbSBDUiBhbmQgTEYgYnkgZGVmYXVsdCwgYXMgd2VsbCBhcyBTUCBhbmQgVGFiLgorICBcZnVuaXh0b2Rvc3BhdGgoczEpICAgICBDb252ZXJ0cyBhIFVuaXggZmlsZW5hbWUgdG8gRE9TIGZvcm1hdC4KKyAgXGZrZXl3b3JkdmFsKHMxLGMxKSAgICAgQXNzaWducyB2YWx1ZXMgdG8ga2V5d29yZHMgKG1hY3JvcykgKGV4cGxhaW5lZCBiZWxvdykKKy4KKworICAgTW9zdCBmdW5jdGlvbnMgdGhhdCBoYXZlICIyIiBpbiB0aGVpciBuYW1lcyB0byBzdGFuZCBmb3IgdGhlIHdvcmQgInRvIgorICAgY2FuIG5vdyBhbHNvIGJlIHdyaXR0ZW4gd2l0aCAidG8iLCBlLmcuICJcZmRlbHRhMnNlY3MoKSwiCisgICBcZmRlbHRhdG9zZWNzKCkuIgorCisgICBcZnVudGFiaWZ5KHN0cmluZykKKyAgICAgICAgICAoTmV3IHRvIDguMC4yMTEpIFJlcGxhY2VzIEhvcml6b250YWwgVGFiIGNoYXJhY3RlcnMgaW4gdGhlCisgICAgICAgICAgZ2l2ZW4gc3RyaW5nIHdpdGggc3BhY2VzIGJhc2VkIG9uIFZUMTAwLWxpa2UgdGFiIHN0b3BzLgorCisgICBcZnZlcmlmeShzMSxzMixuKQorICAgICAgICAgIEFzIG9mIHZlcnNpb24gOC4wLjIxMSwgcmV0dXJucyAtMSBpZiBzMiBpcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICAgUHJldmlvdXNseSBpdCByZXR1cm5lZCAwLCBtYWtpbmcgXGZ2ZXJpZnkoYWJjLFwlYSkgbG9vayBhcyBpZgorICAgICAgICAgIFwlYSB3YXMgYSBzdHJpbmcgY29tYm9zZWQgb2YgYSdzLCBiJ3MsIGFuZC9vciBjJ3Mgd2hlbiBpbiBmYWN0CisgICAgICAgICAgaXQgY29udGFpbmVkIG5vdGhpbmcuCisKKyAgIFxmY29kZShzdHJpbmcpCisgICAgICAgICAgQXMgb2YgdmVyc2lvbiA4LjAuMjExLCByZXR1cm5zIDAgaWYgc3RyaW5nIGlzIGVtcHR5IG9yIG1pc3NpbmcuCisgICAgICAgICAgUHJldmlvdXNseSBpdCByZXR1cm5lZCB0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBtYWRlIGl0IHVuc2FmZQorICAgICAgICAgIHRvIHVzZSBpbiBhcml0aG1ldGljIG9yIGJvb2xlYW4gZXhwcmVzc2lvbnMuCisKKyAgIFx2KGluc2NhbGUpCisgICAgICAgICAgTmV3IHRvIHZlcnNpb24gOC4wLjIxMSwgaXRzIHZhbHVlIGlzIHRoZSBJTlBVVCBTQ0FMRS1GQUNUT1IKKyAgICAgICAgICAoWzQ0MF1TZWN0aW9uIDguMTApLCBkZWZhdWx0IDEuMC4KKworICA4LjcuMS4gVGhlIFxma2V5d29yZHZhbCgpIEZ1bmN0aW9uCisKKyAgIFxma2V5d29yZHZhbChzMSxjMSkgaXMgbmV3IHRvIEMtS2VybWl0IDguMC4gR2l2ZW4gYSBzdHJpbmcgczEgb2YgdGhlCisgICBmb3JtICJuYW1lPXZhbHVlIiwgaXQgY3JlYXRlcyBhIG1hY3JvIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGFzc2lnbnMKKyAgIGl0IHRoZSBnaXZlbiB2YWx1ZS4gSWYgbm8gdmFsdWUgYXBwZWFycyBhZnRlciB0aGUgZXF1YWwgc2lnbiwgYW55CisgICBleGlzdGluZyBtYWNybyBvZiB0aGUgZ2l2ZW4gbmFtZSBpcyB1bmRlZmluZWQuIEJsYW5rcyBhcmUKKyAgIGF1dG9tYXRpY2FsbHkgdHJpbW1lZCBmcm9tIGFyb3VuZCB0aGUgbmFtZSBhbmQgdmFsdWUuIFRoZSBvcHRpb25hbCBjMQorICAgcGFyYW1ldGVyIGlzIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yIGNoYXJhY3RlciwgZXF1YWwgc2lnbiAoPSkgYnkKKyAgIGRlZmF1bHQuIFRoaXMgZnVuY3Rpb24gaXMgaGFuZHkgZm9yIHByb2Nlc3Npbmcga2V5d29yZCBwYXJhbWV0ZXJzIG9yCisgICBhbnkgb3RoZXIgZm9ybSBvZiBwYXJhbWV0ZXItdmFsdWUgcGFpci4gU3VwcG9zZSwgZm9yIGV4YW1wbGUsIHlvdSB3YW50CisgICB0byB3cml0ZSBhIG1hY3JvIHRoYXQgYWNjZXB0cyBrZXl3b3JkIHBhcmFtZXRlcnMgcmF0aGVyIHRoYW4KKyAgIHBvc2l0aW9uYWwgb25lczoKKworICBkZWZpbmUgTVlESUFMIHsKKyAgICAgIGxvY2FsIFwlaSBtb2RlbSBoYW5ndXAgbWV0aG9kIGRldmljZSBzcGVlZCBudW1iZXIKKyAgICAgIGRlZiBudW1iZXIgNTU1MTIzNCAgICAgICAgICA7IEFzc2lnbiBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgIGRlZiBzcGVlZCA1NzYwMAorICAgICAgZGVmIG1vZGVtIHVzcm9ib3RpY3MKKyAgICAgIGRlZiBoYW5ndXAgcnMyMzIKKyAgICAgIGRlZiBtZXRob2QgdG9uZQorICAgICAgZGVmIGNvdW50cnkgMQorICAgICAgZm9yIFwlaSAxIFx2KGFyZ2MpLTEgMSB7ICAgIDsgUGFyc2UgYW55IGtleXdvcmQgcGFyYW1ldGVycy4uLgorICAgICAgICAgIGlmIG5vdCBcZmtleXdvcmR2YWwoXCZfW1wlaV0pIGVuZCAxIEJhZCBwYXJhbWV0ZXI6ICJcJl9bXCVpXSIKKyAgICAgIH0KKyAgICAgIHNldCBkaWFsIGNvdW50cnkgXG0oY291bnRyeSkKKyAgICAgIHNldCBtb2RlbSB0eXBlIFxtKG1vZGVtKQorICAgICAgc2V0IG1vZGVtIGhhbmcgXG0oaGFuZ3VwKQorICAgICAgc2V0IGRpYWwgbWV0aG9kIFxtKHRvbmUpCisgICAgICBzZXQgbGluZSBcbShkZXZpY2UpCisgICAgICBpZiBmYWlsIHN0b3AgMQorICAgICAgc2V0IHNwZWVkIFxtKHNwZWVkKQorICAgICAgaWYgZmFpbCBzdG9wIDEKKyAgICAgIHNob3cgY29tbQorICAgICAgc2V0IGRpYWwgZGlzcGxheSBvbgorICAgICAgZGlhbCBcbShudW1iZXIpCisgICAgICBpZiBzdWNjZXNzIGNvbm5lY3QKKyAgfQorCisgICBJbiB0aGlzIGV4YW1wbGUsIGFsbCB0aGUgZGVmYXVsdHMgYXJlIHNldCB1cCBpbnNpZGUgdGhlIG1hY3JvLCBhbmQKKyAgIHRoZXJlZm9yZSBpdCBjYW4gYmUgaW52b2tlZCB3aXRoIG5vIHBhcmFtZXRlcnMgYXQgYWxsLiBCdXQgaWYgeW91IHdhbnQKKyAgIHRvIGhhdmUgdGhlIG1hY3JvIGRpYWwgYSBkaWZmZXJlbnQgbnVtYmVyLCB5b3UgY2FuIHN1cHBseSBpdCBhcworICAgZm9sbG93czoKKworICBteWRpYWwgbnVtYmVyPTc2NTQzMjEKKworICAgWW91IGNhbiBzdXBwbHkgYW55IG51bWJlciBvZiBrZXl3b3JkIHBhcmFtZXRlcnMsIGFuZCB5b3UgY2FuIGdpdmUgdGhlbQorICAgaW4gYW55IG9yZGVyOgorCisgIG15ZGlhbCBudW1iZXI9NzY1NDMyMSBoYW5ndXA9bW9kZW0gc3BlZWQ9MTE1MjAwCisKKyAgOC43LjIuIFRoZSBcZnNwbGl0KCksIFxmam9pbigpLCBhbmQgXGZ3b3JkKCkgRnVuY3Rpb25zCisKKyAgIFxmam9pbigmYSxzMSxuMSxuMikgaXMgYWxzbyBuZXc7IGl0IGNyZWF0ZXMgYSBzdHJpbmcgZnJvbSBhbiBhcnJheSAob3IKKyAgIGEgcGllY2Ugb2Ygb25lKS4gJmEgaXMgdGhlIG5hbWUgb2YgdGhlIGFycmF5IChhIHJhbmdlIHNwZWNpZmllciBjYW4gYmUKKyAgIGluY2x1ZGVkKTsgczEgaXMgYSBjaGFyYWN0ZXIgb3Igc3RyaW5nIHRvIHNlcGFyYXRlIGVhY2ggZWxlbWVudCBpbiB0aGUKKyAgIHJlc3VsdCBzdHJpbmcgKGNhbiBiZSBvbWl0dGVkLCBpbiB3aGljaCBjYXNlIHRoZSBlbGVtZW50cyBhcmUgbm90CisgICBzZXBhcmF0ZWQgYXQgYWxsKSwgYW5kIG4xIGlzIGEgZ3JvdXBpbmcgbWFzaywgZXhwbGFpbmVkIGJlbG93LiBJZiBzMQorICAgaXMgZW1wdHkgb3Igbm90IHNwZWNpZmllZCwgdGhlIGFycmF5IGVsZW1lbnRzIGFyZSBzZXBhcmF0ZWQgd2l0aAorICAgc3BhY2VzLiBJZiB5b3Ugd2FudCB0aGUgZWxlbWVudHMgY29uY2F0ZW5hdGVkIHdpdGggbm8gc2VwYXJhdG9yLAorICAgaW5jbHVkZSBhIG5vbnplcm8gbjIgYXJndW1lbnQuIEdpdmVuIHRoZSBhcnJheToKKworICBkZWNsYXJlIFwmYVtdID0gMCAxIDIgMyA0IDUgNiA3IDggOQorCisgICB5b3UgY2FuIGdldCBlZmZlY3RzIGxpa2UgdGhpczoKKworICBcZmpvaW4oJmEpICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOQorICBcZmpvaW4oJmEsOikgICAgMDoxOjI6Mzo0OjU6Njo3Ojg6OQorICBcZmpvaW4oJmEseyx9KSAgMCwxLDIsMyw0LDUsNiw3LDgsOQorICBcZmpvaW4oJmEsLi4uKSAgMC4uLjEuLi4yLi4uMy4uLjQuLi41Li4uNi4uLjcuLi44Li4uOQorICBcZmpvaW4oJmEsLCwxKSAgMDEyMzQ1Njc4OQorCisgICBcZnNwbGl0KCksIFxmd29yZCgpLCBcZnN0cmlwYigpLCBhbmQgXGZqb2luKCkgYWNjZXB0IGEgImdyb3VwaW5nIG1hc2siCisgICBhcmd1bWVudCwgbjEsIHdoaWNoIGlzIGEgbnVtYmVyIGZyb20gMCB0byA2MywgaW4gd2hpY2g6CisKKyAgIDEgPSAiIiBkb3VibGVxdW90ZXMKKyAgIDIgPSB7fSBicmFjZXMKKyAgIDQgPSAnJyBzaW5nbGVxdW90ZXMKKyAgIDggPSAoKSBwYXJlbnRoZXNlcworICAxNiA9IFtdIHNxdWFyZSBicmFja2V0cworICAzMiA9IDw+IGFuZ2xlIGJyYWNrZXRzCisKKyAgIFRoZXNlIGNhbiBiZSBPUidkIChhZGRlZCkgdG9nZXRoZXIgdG8gbWFrZSBhbnkgbnVtYmVyIDAtNjMgKC0xIGlzCisgICB0cmVhdGVkIHRoZSBzYW1lIGFzIDYzLCAwIG1lYW5zIG5vIGdyb3VwaW5nKS4gSWYgYSBiaXQgaXMgb24sIHRoZQorICAgY29ycmVzcG9uZGluZyBraW5kIG9mIGdyb3VwaW5nIGlzIHNlbGVjdGVkLiAoSWYgbW9yZSB0aGFuIDEgYml0IGlzIHNldAorICAgZm9yIFxmam9pbigpLCBvbmx5IHRoZSBsb3dlc3Qtb3JkZXIgb25lIGlzIHVzZWQuKQorCisgICBJZiB5b3UgaW5jbHVkZSB0aGUgc2FtZSBjaGFyYWN0ZXIgaW4gdGhlIGdyb3VwaW5nIG1hc2sgYW5kIHRoZSBpbmNsdWRlCisgICBsaXN0LCB0aGUgZ3JvdXBpbmcgbWFzayB0YWtlcyBwcmVjZWRlbmNlLiBFeGFtcGxlOgorCisgIGRlZiBcJWEgIGEgImIgYyBkIiBlCisgIFxmc3BsaXQoXCVhLCZhW10sLCwtMSkgID0gMyAgPC0tIGRvdWJsZXF1b3RlIHVzZWQgZm9yIGdyb3VwaW5nCisgIFxmc3BsaXQoXCVhLCZhW10sLCIsLTEpID0gMyAgPC0tIGRvdWJsZXF1b3RlIHN0aWxsIHVzZWQgZm9yIGdyb3VwaW5nCisKKyAgIE5lc3Rpbmcgb2YgbWF0Y2hlZCBsZWZ0IGFuZCByaWdodCBncm91cGluZyBjaGFyYWN0ZXJzIChwYXJlbnRoZXNlcywKKyAgIGJyYWNlcywgYW5kIGJyYWNrZXRzLCBidXQgbm90IHF1b3RlcykgaXMgcmVjb2duaXplZC4gRXhhbXBsZToKKworICBkZWYgXCVhIGEgKGIgYyA8ZCBlIFtmIGcge2ggaX0gaiBrXSBsIG0+IG4gbykgcAorICBcZnNwbGl0KFwlYSwmYSwsLDApICA9IDE2IChubyBncm91cGluZykKKyAgXGZzcGxpdChcJWEsJmEsLCwyKSAgPSAxNSAoYnJhY2VzIG9ubHkpCisgIFxmc3BsaXQoXCVhLCZhLCwsMTYpID0gMTEgKHNxdWFyZSBicmFja2V0cyBvbmx5KQorICBcZnNwbGl0KFwlYSwmYSwsLDMyKSA9ICA3IChhbmdsZSBicmFja2V0cyBvbmx5KQorICBcZnNwbGl0KFwlYSwmYSwsLDYzKSA9ICAzIChhbGwpCisgIFxmc3BsaXQoXCVhLCZhLCwsLTEpID0gIDMgKGFsbCkKKworICAgXGZzcGxpdCgpIGFuZCBcZmpvaW4oKSBhcmUgInJlY2lwcm9jYWwiIGZ1bmN0aW9ucy4gWW91IGNhbiBzcGxpdCBhCisgICBzdHJpbmcgdXAgaW50byBhbiBhcnJheSBhbmQgam9pbiBpdCBiYWNrIGludG8gYSBuZXcgc3RyaW5nIHRoYXQgaXMKKyAgIGVxdWl2YWxlbnQsIGFzIGxvbmcgYXMgXGZzcGxpdCgpIGFuZCBcZmpvaW4oKSBhcmUgZ2l2ZW4gZXF1aXZhbGVudAorICAgZ3JvdXBpbmcgbWFza3MsIGV4Y2VwdCB0aGF0IHRoZSB0eXBlIG9mIGJyYWNlcyBtaWdodCBjaGFuZ2UuIEV4YW1wbGU6CisKKyAgZGVmIFwlYSBhIHtiIGMgW2QgZV0gZiBnfSAiaCBpIiBqIDxrIGw+IG0KKyAgZWNobyBTVFJJTkc9W1wlYV0KKyAgZWNobyBXT1JEUz1cZnNwbGl0KFwlYSwmYSwsLC0xKQorICBzaG93IGFycmF5IGEKKyAgYXNnIFwlYiBcZmpvaW4oJmEseyB9LDIpCisgIGVjaG8gSk9JTiAgPVtcJWJdCisgIGVjaG8gV09SRFM9XGZzcGxpdChcJWIsJmIsLCwtMSkKKyAgc2hvdyBhcnJheSBiCisKKyAgIFRoZSBhcnJheXMgYSBhbmQgYiBhcmUgaWRlbnRpY2FsLiBUaGUgc3RyaW5ncyBhIGFuZCBiIGFyZSBhcyBmb2xsb3dzOgorCisgIFwlYTogYSB7YiBjIFtkIGVdIGYgZ30gImggaSIgaiA8ayBsPiBtCisgIFwlYjogYSB7YiBjIFtkIGVdIGYgZ30ge2ggaX0gaiB7ayBsfSBtCisKKyAgIEl0IGlzIHBvc3NpYmxlIHRvIHF1b3RlIHNlcGFyYXRvciBncm91cGluZyBjaGFyYWN0ZXJzIHdpdGggYmFja3NsYXNoCisgICB0byBvdmVycmlkZSB0aGVpciBncm91cGluZyBmdW5jdGlvbi4gQW5kIG9mIGNvdXJzZSB0byBpbmNsdWRlCisgICBiYWNrc2xhc2ggaXRzZWxmIGluIHRoZSBzdHJpbmcsIGl0IG11c3QgYmUgcXVvdGVkIHRvby4gRnVydGhlcm1vcmUsCisgICBlYWNoIGJhY2tzbGFzaCBtdXN0IGJlIGRvdWJsZWQsIHNvIHRoZSBjb21tYW5kIHBhcnNlciB3aWxsIHN0aWxsIHBhc3MKKyAgIG9uZSBiYWNrc2xhc2ggdG8gXGZzcGxpdCgpIGZvciBlYWNoIHR3byB0aGF0IGl0IHNlZXMuIEhlcmUgYXJlIHNvbWUKKyAgIGV4YW1wbGVzIHVzaW5nIFxmc3BsaXQoKSB3aXRoIGEgZ3JvdXBpbmcgbWFzayBvZiA4ICh0cmVhdCBwYXJlbnRoZXNlcworICAgYXMgZ3JvdXBpbmcgY2hhcmFjdGVycykuCisKKyAgU3RyaW5nICAgICAgICAgICAgICAgICAgUmVzdWx0CisgICAgYSBiIGMgZCBlIGYgICAgICAgICAgICAgNgorICAgIGEgYlxcIGMgZCBlIGYgICAgICAgICAgIDUKKyAgICBhIGIgKGMgZCBlKSBmICAgICAgICAgICA0CisgICAgYSBiIFxcKGMgZCBlXFwpIGYgICAgICAgNgorICAgIGEgYiBcXFxcKGMgZCBlXFxcXCkgZiAgIDcKKworICAgXGZzcGxpdCgpIGhhcyBhbHNvIGJlZW4gY2hhbmdlZCB0byBjcmVhdGUgaXRzIGFycmF5IChpZiBvbmUgaXMgZ2l2ZW4pCisgICBlYWNoIHRpbWUgaXQgaXMgY2FsbGVkLCBzbyBub3cgaXQgY2FuIGJlIGNvbnZlbmllbnRseSBjYWxsZWQgaW4gYSBsb29wCisgICB3aXRob3V0IGhhdmluZyB0byByZWRlY2xhcmUgdGhlIGFycmF5IGVhY2ggdGltZS4KKworICAgSW5jaWRlbnRhbGx5Li4uIFNvbWV0aW1lcyB5b3UgbWlnaHQgd2FudCB0byBpbnZva2UgXGZzcGxpdCgpIGluIGEKKyAgIHNpdHVhdGlvbiB3aGVyZSB5b3UgZG9uJ3QgY2FyZSBhYm91dCBpdHMgcmV0dXJuIHZhbHVlLCBlLmcuIHdoZW4geW91CisgICBqdXN0IHdhbnQgdG8gZmlsbCB0aGUgYXJyYXkuIE5vdyB5b3UgY2FuICJjYWxsIiBcZnNwbGl0KCkgb3IgYW55IG90aGVyCisgICBmdW5jdGlvbiB3aXRoIHRoZSBuZXcgWzQ0MV1WT0lEIGNvbW1hbmQ6CisKKyAgdm9pZCBcZnNwbGl0KFwlYSwmYSkKKworICAgXGZzcGxpdCgpIGFuZCBcZmpvaW4oKSBhbHNvIGFjY2VwdCBhIG5ldywgb3B0aW9uYWwgNnRoIGFyZ3VtZW50LCBhbgorICAgb3B0aW9ucyBmbGFnLCBhIG51bWJlciB0aGF0IGNhbiBzcGVjaWZ5IGEgbnVtYmVyIG9mIG9wdGlvbnMuIFNvIGZhcgorICAgdGhlcmUgaXMganVzdCBvbmUgb3B0aW9uLCB3aG9zZSB2YWx1ZSBpcyAxOgorCisgICBzZXBhcmF0b3ItZmxhZworICAgICAgICAgIE5vcm1hbGx5IHNlcGFyYXRvcnMgYXJlIGNvbGxhcHNlZC4gU28sIGZvciBleGFtcGxlLAorCisgIFxmd29yZChUaHJlZSAgICAgICAgbGl0dGxlICAgICAgICAgIHdvcmRzLDIpCisKKyAgICAgICAgICByZXR1cm5zICJsaXR0bGUiICh0aGUgc2Vjb25kIHdvcmQpLiBTcGFjZSBpcyBhIHNlcGFyYXRvciwgYnV0CisgICAgICAgICAgdGhlcmUgYXJlIG11bHRpcGxlIHNwYWNlcyBiZXR3ZWVuIGVhY2ggd29yZC4gSWYgdGhlIHZhbHVlIDEgaXMKKyAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgb3B0aW9uIGZsYWcsIGhvd2V2ZXIsIGVhY2ggc2VwYXJhdG9yIGNvdW50cy4gSWYKKyAgICAgICAgICB0d28gc2VwYXJhdG9ycyBhcmUgYWRqYWNlbnQsIGFuIGVtcHR5IHdvcmQgaXMgcHJvZHVjZWQgYmV0d2VlbgorICAgICAgICAgIHRoZW0uIFRoaXMgaXMgdXNlZnVsIGZvciBwYXJzaW5nIChlLmcuKSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMKKyAgICAgICAgICBleHBvcnRlZCBmcm9tIGRhdGFiYXNlcyBvciBzcHJlYWRzaGVldHMuCisKKyAgOC43LjMuIFRoZSBcZmNtZHN0YWNrKCkgRnVuY3Rpb24KKworICAgVGhlIG5ldyBcZmNtZHN0YWNrKCkgZnVuY3Rpb24gZ2l2ZXMgYWNjZXNzIHRvIHRoZSBjb21tYW5kIHN0YWNrOgorCisgICBcZmNtZHN0YWNrKG4xLG4yKQorICAgICAgICAgIEFyZ3VtZW50czogbjEgaXMgdGhlIGNvbW1hbmQgc3RhY2sgbGV2ZWwuIElmIG9taXR0ZWQsIHRoZQorICAgICAgICAgIGN1cnJlbnQgbGV2ZWwsIFx2KGNtZGxldmVsKSwgaXMgdXNlZC4gbjIgaXMgYSBmdW5jdGlvbiBjb2RlCisgICAgICAgICAgc3BlY2lmeWluZyB0aGUgZGVzaXJlZCB0eXBlIG9mIGluZm9ybWF0aW9uOgorCisgIDAgKGRlZmF1bHQpID0gbmFtZSBvZiBvYmplY3QgYXQgbGV2ZWwgbjEuCisgIDEgKG5vbnplcm8pID0gb2JqZWN0IHR5cGUgKDAgPSBwcm9tcHQ7IDEgPSBjb21tYW5kIGZpbGU7IDIgPSBtYWNybykuCisKKyAgICAgICAgICBUaGUgZGVmYXVsdCBmb3IgbjIgaXMgMC4KKworICAgVGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHByb21wdCBpcyAiKHByb21wdCkiLiBIZXJlJ3MgYSBsb29wIHRoYXQgY2FuCisgICBiZSBpbmNsdWRlZCBpbiBhIG1hY3JvIG9yIGNvbW1hbmQgZmlsZSB0byBzaG93IHRoZSBzdGFjayAoc2ltaWxhciB0bworICAgd2hhdCB0aGUgU0hPVyBTVEFDSyBjb21tYW5kIGRvZXMpOgorCisgIGZvciBcJWkgXHYoY21kbGV2ZWwpIDAgLTEgeworICAgICAgZWNobyBcJWkuIFtcZmNtZHN0YWNrKFwlaSwxKV0gXGZjbWRzdGFjayhcJWksMCkKKyAgfQorCisgICBJbiB0aGlzIGNvbm5lY3Rpb24sIG5vdGUgdGhhdCBcdihjbWRmaWxlKSBhbHdheXMgaW5kaWNhdGVzIHRoZSBtb3N0CisgICByZWNlbnRseSBpbnZva2VkIGFjdGl2ZSBjb21tYW5kIGZpbGUgKGlmIGFueSksIGV2ZW4gaWYgdGhhdCBmaWxlIGlzCisgICBleGVjdXRpbmcgYSBtYWNyby4gU2ltaWxhcmx5LCBcdihtYWNybykgaW5kaWNhdGVzIHRoZSBtb3N0IHJlY2VudGx5CisgICBpbnZva2VkIG1hY3JvIChpZiBhbnkpLCBldmVuIGlmIHRoZSBjdXJyZW50IGNvbW1hbmQgc291cmNlIGlzIG5vdCBhCisgICBtYWNyby4gVGhlIG5hbWUgb2YgdGhlICJjYWxsZXIiIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIG9iamVjdAorICAgKGNvbW1hbmQgZmlsZSBvciBtYWNybykgaXM6CisKKyAgXGZjbWRzdGFjayhcdihjbWRsZXZlbCktMSkKKworICAgYW5kIGl0cyB0eXBlIGlzOgorCisgIFxmY21kc3RhY2soXHYoY21kbGV2ZWwpLTEsMSkKKworICAgVG8gZmluZCB0aGUgbmFtZSBvZiB0aGUgbWFjcm8gdGhhdCBpbnZva2VkIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nCisgICBvYmplY3QsIGV2ZW4gaWYgb25lIG9yIG1vcmUgaW50ZXJtZWRpYXRlIGNvbW1hbmQgZmlsZXMgKG9yIHByb21wdGluZworICAgbGV2ZWxzKSBhcmUgaW52b2x2ZWQsIHVzZSBhIGxvb3AgbGlrZSB0aGlzOgorCisgIGZvciBcJWkgXHYoY21kbGV2ZWwpLTEgMCAtMSB7CisgICAgICBpZiA9IFxmY21kc3RhY2soXCVpLDEpIDIgZWNobyBDQUxMRVIgPSBcZmNtZHN0YWNrKFwlaSwwKQorICB9CisKKyAgIE9mIGNvdXJzZSBpZiB5b3UgbWFrZSBhIG1hY3JvIHRvIGRvIHRoaXMsIHRoZSBtYWNybyBtdXN0IGFjY291bnQgZm9yCisgICBpdHMgb3duIGFkZGl0aW9uYWwgbGV2ZWw6CisKKyAgZGVmaW5lIENBTExFUiB7CisgICAgICBmb3IgXCVpIFx2KGNtZGxldmVsKS0yIDAgLTEgeworICAgICAgICAgIGlmID0gXGZjbWRzdGFjayhcJWksMSkgMiByZXR1cm4gXGZjbWRzdGFjayhcJWksMCkKKyAgICAgIH0KKyAgICAgIHJldHVybiAiKG5vbmUpIgorICB9CisKKyAgIFRoZSBidWlsdC1pbiB2YXJpYWJsZSBcdihjbWRzb3VyY2UpIGdpdmVzIHRoZSBjdXJyZW50IGNvbW1hbmQgc291cmNlCisgICBhcyBhIHdvcmQgKCJwcm9tcHQiLCAiZmlsZSIsIG9yICJtYWNybyIpLgorCisgIDguNy40LiBUaGUgVk9JRCBDb21tYW5kCisKKyAgIFZPSUQgaXMgbGlrZSBFQ0hPIGluIHRoYXQgYWxsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGluIGl0cyBhcmd1bWVudAorICAgdGV4dCBhcmUgZXZhbHVhdGVkLiBidXQgaXQgZG9lc24ndCBwcmludCBhbnl0aGluZyAoZXhjZXB0IHBvc3NpYmx5IGFuCisgICBlcnJvciBtZXNzYWdlIGlmIGEgZnVuY3Rpb24gd2FzIGludm9jYXRpb24gY29udGFpbmVkIG9yIHJlc3VsdGVkIGluCisgICBhbnkgZXJyb3JzKS4gVk9JRCBzZXRzIEZBSUxVUkUgaWYgaXQgZW5jb3VudGVycyBhbnkgZXJyb3JzLCBTVUNDRVNTCisgICBvdGhlcndpc2UuCisKKyAgIFsgWzQ0Ml1Ub3AgXSBbIFs0NDNdQ29udGVudHMgXSBbIFs0NDRdQy1LZXJtaXQgSG9tZSBdIFsgWzQ0NV1LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDguOC4gVGhlIFJFVFVSTiBhbmQgRU5EIENvbW1hbmRzCisKKyAgIFRoZSBleGVjdXRpb24gb2YgYSBtYWNybyBpcyB0ZXJtaW5hdGVkIGluIGFueSBvZiB0aGUgZm9sbG93aW5nIHdheXM6CisKKyAgICAgKiBXaXRoIGFuIEVORCBbIG51bWJlciBbIG1lc3NhZ2UgXSBdIGNvbW1hbmQuIElmIGEgbnVtYmVyIGlzIGdpdmVuLAorICAgICAgIHRoZSBtYWNybyBzdWNjZWVkcyBpZiB0aGUgbnVtYmVyIGlzIDAsIGFuZCBmYWlscyBpZiBpdCBpcyBub3QKKyAgICAgICB6ZXJvOyBpZiBhIG51bWJlciBpcyBub3QgZ2l2ZW4sIHRoZSBtYWNybyBzdWNjZWVkcy4KKyAgICAgKiBXaXRoIGEgU1RPUCBjb21tYW5kLCB3aGljaCB3b3JrcyBqdXN0IGxpa2UgRU5EIGV4Y2VwdCBpdCBwZWVscworICAgICAgIGJhY2sgdGhlIGNvbW1hbmQgc3RhY2sgYWxsIHRoZSB3YXkgdG8gdG9wIGxldmVsLgorICAgICAqIFdpdGggYSBSRVRVUk4gWyB0ZXh0IF0gY29tbWFuZCwgaW4gd2hpY2ggY2FzZSB0aGUgbWFjcm8gYWx3YXlzCisgICAgICAgc3VjY2VlZHMuCisgICAgICogQnkgcnVubmluZyBvdXQgb2YgY29tbWFuZHMgdG8gZXhlY3V0ZSwgaW4gd2hpY2ggY2FzZSB0aGUgbWFjcm8KKyAgICAgICBzdWNjZWVkcyBvciBmYWlscyBhY2NvcmRpbmcgdGhlIG1vc3QgcmVjZW50bHkgZXhlY3V0ZWQgY29tbWFuZAorICAgICAgIHRoYXQgc2V0cyBzdWNjZXNzIG9yIGZhaWx1cmUuCisKKyAgIFRoZSBzYW1lIGNvbnNpZGVyYXRpb25zIGFwcGx5IHRvIGNvbW1hbmQgZmlsZXMgaW52b2tlZCBieSB0aGUgVEFLRQorICAgY29tbWFuZC4KKworICAgSWYgYSBtYWNybyBkb2VzIG5vdCBleGVjdXRlIGFueSBjb21tYW5kcyB0aGF0IHNldCBzdWNjZXNzIG9yIGZhaWx1cmUsCisgICB0aGVuIGludm9raW5nIHRoZSBtYWNybyBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgU1VDQ0VTUy9GQUlMVVJFCisgICBzdGF0dXMuIEl0IGZvbGxvd3MsIHRoZW4sIHRoYXQgdGhlIG1lcmUgaW52b2NhdGlvbiBvZiBhIG1hY3JvIGRvZXMgbm90CisgICBjaGFuZ2UgdGhlIFNVQ0NFU1MvRkFJTFVSRSBzdGF0dXMgZWl0aGVyLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvCisgICB3cml0ZSBtYWNyb3MgdG8gcmVhY3QgdG8gdGhlIHN0YXR1cyBvZiBvdGhlciBjb21tYW5kcyAob3IgbWFjcm9zKSwgZm9yCisgICBleGFtcGxlOgorCisgIGRlZmluZSBDSEtMSU5FIHsKKyAgICAgIGlmIHN1Y2Nlc3MgZW5kIDAKKyAgICAgIHN0b3AgMSBTRVQgTElORSBmYWlsZWQgLSBwbGVhc2UgdHJ5IGFub3RoZXIgZGV2aWNlLgorICB9CisgIHNldCBtb2RlbSB0eXBlIHVzcm9ib3RpY3MKKyAgc2V0IGxpbmUgL2Rldi9jdWEwCisgIGNoa2xpbmUKKyAgc2V0IHNwZWVkIDU3NjAwCisgIGRpYWwgNzY1NDMyMQorCisgICBCeSB0aGUgd2F5LCBub25lIG9mIHRoaXMgaXMgbmV3cy4gQnV0IGl0IHdhcyBub3QgZXhwbGljaXRseSBkb2N1bWVudGVkCisgICBiZWZvcmUsIGFuZCBDLUtlcm1pdCA3LjAgYW5kIGVhcmxpZXIgZGlkIG5vdCBhbHdheXMgaGFuZGxlIHRoZSBSRVRVUk4KKyAgIHN0YXRlbWVudCBhcyBpdCBzaG91bGQgaGF2ZS4KKworICAgWyBbNDQ2XVRvcCBdIFsgWzQ0N11Db250ZW50cyBdIFsgWzQ0OF1DLUtlcm1pdCBIb21lIF0gWyBbNDQ5XUtlcm1pdAorICAgSG9tZSBdCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOC45LiBVTkRFRklOaW5nIEdyb3VwcyBvZiBWYXJpYWJsZXMKKworICAgVGhlIFVOREVGSU5FIGNvbW1hbmQsIHdoaWNoIHByZXZpb3VzbHkgYWNjZXB0ZWQgb25lIHZhcmlhYmxlIG5hbWUsIG5vdworICAgYWNjZXB0cyBhIGxpc3Qgb2YgdGhlbSwgYW5kIGFsc28gYWNjZXB0cyB3aWxkY2FyZCBub3RhdGlvbiB0byBhbGxvdworICAgZGVsZXRpb24gb2YgdmFyaWFibGVzIHRoYXQgbWF0Y2ggYSBnaXZlbiBwYXR0ZXJuLgorCisgICBVTkRFRklORSBbIHN3aXRjaGVzIF0gbmFtZSBbIG5hbWUgWyBuYW1lIFsgLi4uIF0gXSBdCisgICAgICAgICAgVW5kZWZpbmVzIHRoZSB2YXJpYWJsZXMgd2hvc2UgbmFtZXMgYXJlIGdpdmVuLiBVcCB0byA2NCBuYW1lcworICAgICAgICAgIG1heSBiZSBnaXZlbiBpbiBvbmUgVU5ERUZJTkUgY29tbWFuZC4KKworICAgSWYgeW91IG9taXQgdGhlIHN3aXRjaGVzIGFuZCBpbmNsdWRlIG9ubHkgb25lIG5hbWUsIHRoZSBVTkRFRklORQorICAgY29tbWFuZCB3b3JrcyBhcyBiZWZvcmUuCisKKyAgIFN3aXRjaGVzIGluY2x1ZGU6CisKKyAgIC9NQVRDSElORworICAgICAgICAgIFNwZWNpZmllcyB0aGF0IHRoZSBuYW1lcyBnaXZlbiBhcmUgdG8gdHJlYXRlZCBhcyBwYXR0ZXJucworICAgICAgICAgIHJhdGhlciB0aGFuIGxpdGVyYWwgdmFyaWFibGUgbmFtZXMuIE5vdGU6IHBhdHRlcm4gbWF0Y2hpbmcKKyAgICAgICAgICBjYW4ndCBiZSB1c2VkIHdpdGggYXJyYXkgcmVmZXJlbmNlczsgdXNlIHRoZSBBUlJBWSBjb21tYW5kIHRvCisgICAgICAgICAgbWFuaXB1bGF0ZSBhcnJheXMgYW5kIHN1YmFycmF5cy4KKworICAgL0xJU1QKKyAgICAgICAgICBMaXN0IHRoZSBuYW1lIG9mIGVhY2ggdmFyaWFibGUgdG8gYmUgdW5kZWZpbmVkLCBhbmQgd2hldGhlciBpdAorICAgICAgICAgIHdhcyB1bmRlZmluZWQgc3VjY2Vzc2Z1bGx5ICgib2siIG9yICJlcnJvciIpLCBwbHVzIGEgc3VtbWFyeQorICAgICAgICAgIGNvdW50IGF0IHRoZSBlbmQuCisKKyAgIC9TSU1VTEFURQorICAgICAgICAgIExpc3QgdGhlIG5hbWVzIG9mIHRoZSB2YXJpYWJsZXMgdGhhdCB3b3VsZCBiZSBkZWxldGVkIHdpdGhvdXQKKyAgICAgICAgICBhY3R1YWxseSBkZWxldGluZyB0aGVtLiBJbXBsaWVzIC9MSVNULgorCisgICBUaGUgVU5ERUZJTkUgY29tbWFuZCBmYWlscyBpZiB0aGVyZSB3ZXJlIGFueSBlcnJvcnMgYW5kIHN1Y2NlZWRzCisgICBvdGhlcndpc2UuCisKKyAgIFRoZSBuZXcgX1VOREVGSU5FIGNvbW1hbmQgaXMgbGlrZSBVTkRFRklORSwgZXhjZXB0IHRoZSBuYW1lcyBhcmUKKyAgIGFzc3VtZWQgdG8gYmUgdmFyaWFibGUgbmFtZXMgdGhlbXNlbHZlcywgd2hpY2ggY29udGFpbiB0aGUgbmFtZXMgKG9yCisgICBwYXJ0cyBvZiB0aGVtKSBvZiB0aGUgdmFyaWFibGVzIHRvIGJlIHVuZGVmaW5lZC4gRm9yIGV4YW1wbGUsIGlmIHlvdQorICAgaGF2ZSB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOgorCisgIGRlZmluZSBcJWEgZm9vCisgIGRlZmluZSBmb28gVGhpcyBpcyBzb21lIHRleHQKKworICAgdGhlbjoKKworICB1bmRlZiBcJWEKKworICAgdW5kZWZpbmVzIHRoZSB2YXJpYWJsZSBcJWEsIGJ1dDoKKworICBfdW5kZWYgXCVhCisKKyAgIHVuZGVmaW5lcyB0aGUgbWFjcm8gZm9vLgorCisgICBOb3JtYWwgS2VybWl0IHBhdHRlcm5zIGFyZSB1c2VkIGZvciBtYXRjaGluZzsgbWV0YWNoYXJhY3RlcnMgaW5jbHVkZQorICAgYXN0ZXJpc2ssIHF1ZXN0aW9uIG1hcmssIGJyYWNlcywgYW5kIHNxdWFyZSBicmFja2V0cy4gVGh1cywgd2hlbiB1c2luZworICAgdGhlIC9NQVRDSElORyBzd2l0Y2gsIGlmIHRoZSBuYW1lcyBvZiB0aGUgbWFjcm9zIHlvdSB3YW50IHRvIHVuZGVmaW5lCisgICBjb250YWluIGFueSBvZiB0aGVzZSBjaGFyYWN0ZXJzLCB5b3UgbXVzdCBxdW90ZSB0aGVtIHdpdGggYmFja3NsYXNoIHRvCisgICBmb3JjZSB0aGVtIHRvIGJlIHRha2VuIGxpdGVyYWxseS4gQWxzbyBub3RlIHRoYXQgXCUqIGlzIG5vdCB0aGUgbmFtZQorICAgb2YgYSB2YXJpYWJsZTsgaXQgaXMgYSBzcGVjaWFsIG5vdGF0aW9uIHVzZWQgd2l0aGluIGEgbWFjcm8gZm9yICJhbGwKKyAgIG15IGFyZ3VtZW50cyIuIFRoZSBjb21tYW5kICJ1bmRlZiAvbWF0Y2ggXCUqIiBkZWxldGVzIGFsbCBcJXgKKyAgIHZhcmlhYmxlcywgd2hlcmUgeCBpcyAwLi45IGFuZCBhLi56LiBVc2UgInVuZGVmIC9tYXRjaCBcJVswLTldIiB0bworICAgZGVsZXRlIG1hY3JvIGFyZ3VtZW50IHZhcmlhYmxlcyBvciAidW5kZWYgL21hdGNoIFwlW2ktbl0iIHRvIGRlbGV0ZSBhCisgICByYW5nZSBvZiBcJXggdmFyaWFibGVzLgorCisgICBbIFs0NTBdVG9wIF0gWyBbNDUxXUNvbnRlbnRzIF0gWyBbNDUyXUMtS2VybWl0IEhvbWUgXSBbIFs0NTNdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA4LjEwLiBUaGUgSU5QVVQgYW5kIE1JTlBVVCBDb21tYW5kcworCisgICBBcyBvZiBDLUtlcm1pdCA4LjAuMjExLCB0aGUgSU5QVVQgYW5kIE1JTlBVVCBjb21tYW5kcyBhY2NlcHQgYSBzd2l0Y2g6CisKKyAgIFtNXUlOUFVUIC9OT01BVENIIHRpbWVvdXQKKyAgICAgICAgICBUaGUgL05PTUFUQ0ggc3dpdGNoIGFsbG93cyBJTlBVVCBvciBNSU5QVVQgdG8gcmVhZCBpbmNvbWluZworICAgICAgICAgIG1hdGVyaWFsIGZvciB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLCB3aXRob3V0IGF0dGVtcHRpbmcKKyAgICAgICAgICB0byBtYXRjaCBpdCB3aXRoIGFueSB0ZXh0IG9yIHBhdHRlcm5zLiBXaGVuIHRoaXMgc3dpdGNoIGlzCisgICAgICAgICAgaW5jbHVkZWQsIHRoZSBbTV1JTlBVVCBjb21tYW5kIHN1Y2NlZWRzIHdoZW4gdGhlIHRpbWVvdXQKKyAgICAgICAgICBpbnRlcnZhbCBleHBpcmVzLCB3aXRoIFx2KGluc3RhdHVzKSBzZXQgdG8gMSwgbWVhbmluZyAidGltZWQKKyAgICAgICAgICBvdXQiLCBvciBmYWlscyB1cG9uIGludGVycnVwdGlvbiBvciBpL28gZXJyb3IuCisKKyAgIEFsc28gaW4gdmVyc2lvbiA4LjAuMjExLCB0aGVyZSBpcyBhIG5ldyB3YXkgdG8gYXBwbHkgYSBzY2FsZSBmYWN0b3IgdG8KKyAgIFtNXUlOUFVUIHRpbWVvdXRzOgorCisgICBTRVQgSU5QVVQgU0NBTEUtRkFDVE9SIGZsb2F0aW5nLXBvaW50LW51bWJlcgorICAgICAgICAgIFRoaXMgc2NhbGVzIGFsbCBbTV1JTlBVVCB0aW1lb3V0cyBieSB0aGUgZ2l2ZW4gZmFjdG9yLCBhbGxvd2luZworICAgICAgICAgIHRpbWUtc2Vuc2l0aXZlIHNjcmlwdHMgdG8gYmUgYWRqdXN0ZWQgdG8gY2hhbmdpbmcgY29uZGl0aW9ucworICAgICAgICAgIHN1Y2ggYXMgY29uZ2VzdGVkIG5ldHdvcmtzIG9yIGRpZmZlcmVudC1zcGVlZCBtb2RlbXMgd2l0aG91dAorICAgICAgICAgIGhhdmluZyB0byBjaGFuZ2UgZWFjaCBJTlBVVC1jbGFzcyBjb21tYW5kLiBUaGlzIGFmZmVjdHMgb25seQorICAgICAgICAgIHRob3NlIHRpbWVvdXRzIHRoYXQgYXJlIGdpdmVuIGluIHNlY29uZHMsIG5vdCBhcyB3YWxsLWNsb2NrCisgICAgICAgICAgdGltZXMuIEFsdGhvdWdoIHRoZSBzY2FsZSBmYWN0b3IgY2FuIGhhdmUgYSBmcmFjdGlvbmFsIHBhcnQsCisgICAgICAgICAgdGhlIElOUFVUIHRpbWVvdXQgaXMgc3RpbGwgYW4gaW50ZWdlci4gVGhlIG5ldyBidWlsdC1pbgorICAgICAgICAgIHZhcmlhYmxlIFx2KGluc2NhbGUpIHRlbGxzIHRoZSBjdXJyZW50IElOUFVUIFNDQUxFLUZBQ1RPUi4KKworICAgVGhlIE1JTlBVVCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHNlYXJjaCB0aGUgaW5jb21pbmcgZGF0YSBzdHJlYW0gZm9yCisgICBzZXZlcmFsIHRhcmdldHMgc2ltdWx0YW5lb3VzbHkuIEZvciBleGFtcGxlOgorCisgIE1JTlBVVCA4IG9uZSB0d28gdGhyZWUKKworICAgd2FpdHMgdXAgdG8gOCBzZWNvbmRzIGZvciBvbmUgb2YgdGhlIHdvcmRzICJvbmUiLCAidHdvIiwgb3IgInRocmVlIiB0bworICAgYXJyaXZlLiBXb3JkcyBjYW4gYmUgZ3JvdXBlZCB0byBpbmRpY2F0ZSB0YXJnZXRzIHRoYXQgY29udGFpbiBzcGFjZXM6CisKKyAgTUlOUFVUIDggbmluZXRlZWVuIHR3ZW50eSAidHdlbnR5IG9uZSIKKworICAgQW5kIG9mIGNvdXJzZSB5b3UgY2FuIGFsc28gdXNlIHZhcmlhYmxlcyBpbiBwbGFjZSBvZiAob3IgYXMgcGFydCBvZikKKyAgIHRoZSB0YXJnZXQgbmFtZXM6CisKKyAgTUlOUFVUIDggXCVhIFwmeFszXSBcbShmb28pCisKKyAgIFVudGlsIG5vdyB5b3UgaGFkIHRvIGtub3cgdGhlIG51bWJlciBvZiB0YXJnZXRzIGluIGFkdmFuY2Ugd2hlbgorICAgd3JpdGluZyB0aGUgTUlOUFVUIHN0YXRlbWVudC4gRWFjaCBvZiB0aGUgZXhhbXBsZXMgYWJvdmUgaGFzIGV4YWN0bHkKKyAgIHRocmVlIHRhcmdldHMuCisKKyAgIEJ1dCBzdXBwb3NlIHlvdXIgc2NyaXB0IG5lZWRzIHRvIGxvb2sgZm9yIGEgdmFyaWFibGUgbnVtYmVyIG9mCisgICB0YXJnZXRzLiBGb3IgdGhpcyB5b3UgY2FuIHVzZSBhcnJheXMgYW5kIFxmam9pbigpLCBkZXNjcmliZWQgaW4KKyAgIFs0NTRdU2VjdGlvbiA4LjcuIEFueSBudW1iZXIgb2YgXGZqb2luKCkgaW52b2NhdGlvbnMgY2FuIGJlIGluY2x1ZGVkCisgICBpbiB0aGUgTUlOUFVUIHRhcmdldCBsaXN0LCBhbmQgZWFjaCBvbmUgaXMgZXhwYW5kZWQgaW50byB0aGUKKyAgIGFwcHJvcHJpYXRlIG51bWJlciBvZiBzZXBhcmF0ZSB0YXJnZXRzIGVhY2ggdGltZSB0aGUgTUlOUFVUIGNvbW1hbmQgaXMKKyAgIGV4ZWN1dGVkLiBFeGFtcGxlOgorCisgIGRlY2xhcmUgXCZhWzEwXSA9IG9uZSB0d28gdGhyZWUKKyAgbWlucHV0IDEwIGZvbyBcZmpvaW4oJmEpIGJhcgorCisgICBUaGlzIGRlY2xhcmVzIGFuIGFycmF5IG9mIHRlbiBlbGVtZW50cywgYW5kIGFzc2lnbnMgdmFsdWVzIHRvIHRoZQorICAgZmlyc3QgdGhyZWUgb2YgdGhlbS4gVGhlIE1JTlBVVCBjb21tYW5kIGxvb2tzIGZvciB0aGVzZSB0aHJlZSAoYXMgd2VsbAorICAgYXMgdGhlIHdvcmRzICJmb28iIGFuZCAiYmFyIikuIExhdGVyLCBpZiB5b3UgYXNzaWduIGFkZGl0aW9uYWwKKyAgIGVsZW1lbnRzIHRvIHRoZSBhcnJheSwgdGhlIHNhbWUgTUlOUFVUIGNvbW1hbmQgYWxzbyBsb29rcyBmb3IgdGhlIG5ldworICAgZWxlbWVudHMuCisKKyAgIElmIGFuIGFycmF5IGVsZW1lbnQgY29udGFpbnMgc3BhY2VzLCBlYWNoIHdvcmQgYmVjb21lcyBhIHNlcGFyYXRlCisgICB0YXJnZXQuIFRvIGNyZWF0ZSBvbmUgdGFyZ2V0IHBlciBhcnJheSBlbGVtZW50LCB1c2UgXGZqb2luKCkncworICAgZ3JvdXBpbmcgZmVhdHVyZToKKworICBkY2wgXCZhW10gPSB7YWFhIGJiYn0ge2NjYyBkZGR9IHt4eHggeXl5IHp6en0KKworICBtaW5wdXQgMTAgXGZqb2luKCZhKSAgICAgPC0tIDcgdGFyZ2V0cworICBtaW5wdXQgMTAgXGZqb2luKCZhLCwyKSAgPC0tIDMgdGFyZ2V0cworCisgICBbIFs0NTVdVG9wIF0gWyBbNDU2XUNvbnRlbnRzIF0gWyBbNDU3XUMtS2VybWl0IEhvbWUgXSBbIFs0NThdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA4LjExLiBMZWFybmVkIFNjcmlwdHMKKworICAgQy1LZXJtaXQgbm93IGluY2x1ZGVzIGEgc2ltcGxlIHNjcmlwdCByZWNvcmRlciB0aGF0IG1vbml0b3JzIHlvdXIKKyAgIGNvbW1hbmRzLCBwbHVzIHlvdXIgYWN0aW9ucyBkdXJpbmcgQ09OTkVDVCBtb2RlLCBhbmQgYXV0b21hdGljYWxseQorICAgZ2VuZXJhdGVzIGEgc2NyaXB0IHByb2dyYW0gdGhhdCBtaW1pY3Mgd2hhdCBpdCBvYnNlcnZlZC4gWW91IHNob3VsZAorICAgdGhpbmsgb2YgdGhpcyBmZWF0dXJlIGFzIGEgc2NyaXB0LXdyaXRpbmcgQVNTSVNUQU5UIHNpbmNlLCBhcyB5b3Ugd2lsbAorICAgc2VlIFs0NTldbGF0ZXIgaW4gdGhpcyBzZWN0aW9uLCB0aGUgcmVzdWx0IGdlbmVyYWxseSBuZWVkcyBzb21lCisgICBlZGl0aW5nIHRvIG1ha2UgaXQgYm90aCBzZWN1cmUgYW5kIGZsZXhpYmxlLiBUaGUgc2NyaXB0IHJlY29yZGVyIGlzCisgICBjb250cm9sbGVkIGJ5IHRoZSBuZXcgTEVBUk4gY29tbWFuZDoKKworICAgTEVBUk4gWyAvT04gL09GRiAvQ0xPU0UgXSBbIGZpbGVuYW1lIF0KKyAgICAgICAgICBJZiB5b3UgZ2l2ZSBhIGZpbGVuYW1lLCB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHN1YnNlcXVlbnQKKyAgICAgICAgICByZWNvcmRpbmcuIFRoZSAvT04gc3dpdGNoIGVuYWJsZXMgcmVjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGZpbGUKKyAgICAgICAgICAoaWYgYW55KTsgL09GRiBkaXNhYmxlcyByZWNvcmRpbmcuIC9DTE9TRSBjbG9zZXMgdGhlIGN1cnJlbnQKKyAgICAgICAgICBzY3JpcHQgcmVjb3JkaW5nIGZpbGUgKGlmIGFueSkuIElmIHlvdSBnaXZlIGEgZmlsZW5hbWUgd2l0aG91dAorICAgICAgICAgIGFueSBzd2l0Y2hlcywgL09OIGlzIGFzc3VtZWQuCisKKyAgIFRoZSAvT0ZGIGFuZCAvT04gc3dpdGNoZXMgbGV0IHlvdSB0dXJuIHJlY29yZGluZyBvZmYgYW5kIG9uIGR1cmluZyBhCisgICBzZXNzaW9uIHdpdGhvdXQgY2xvc2luZyB0aGUgZmlsZS4KKworICAgV2hlbiByZWNvcmRpbmc6CisKKyAgICAgKiBBbGwgY29tbWFuZHMgdGhhdCB5b3UgdHlwZSAob3IgcmVjYWxsKSBhdCB0aGUgcHJvbXB0IGFyZSByZWNvcmRlZAorICAgICAgIGluIHRoZSBmaWxlIGV4Y2VwdDoKKyAgICAgICAgICArIExFQVJOIGNvbW1hbmRzIGFyZSBub3QgcmVjb3JkZWQuCisgICAgICAgICAgKyBUaGUgQ09OTkVDVCBjb21tYW5kIGlzIG5vdCByZWNvcmRlZC4KKyAgICAgICAgICArIFRoZSBURUxORVQgY29tbWFuZCBpcyBjb252ZXJ0ZWQgdG8gU0VUIEhPU1QgL05FVFdPUks6VENQLgorICAgICAqIENvbW1hbmRzIG9idGFpbmVkIGZyb20gbWFjcm9zIG9yIGNvbW1hbmQgZmlsZXMgYXJlIG5vdCByZWNvcmRlZC4KKyAgICAgKiBEdXJpbmcgQ09OTkVDVDoKKyAgICAgICAgICArIEV2ZXJ5IGxpbmUgeW91IHR5cGUgaXMgY29udmVydGVkIHRvIGFuIE9VVFBVVCBjb21tYW5kLgorICAgICAgICAgICsgVGhlIGxhc3QgcHJvbXB0IGJlZm9yZSBhbnkgbGluZSB5b3UgdHlwZSBiZWNvbWVzIGFuIElOUFVUCisgICAgICAgICAgICBjb21tYW5kLgorICAgICAgICAgICsgVGltZW91dHMgYXJlIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSBmb3IgZWFjaCBJTlBVVCBjb21tYW5kLgorICAgICAgICAgICsgQSBQQVVTRSBjb21tYW5kIGlzIGluc2VydGVkIGJlZm9yZSBlYWNoIE9VVFBVVCBjb21tYW5kIGp1c3QKKyAgICAgICAgICAgIHRvIGJlIHNhZmUuCisKKyAgIFRodXMgdGhlIHNjcmlwdCByZWNvcmRlciBpcyBpbmhlcmVudGx5IGxpbmUtb3JpZW50ZWQuIEl0IGNhbid0IGJlIHVzZWQKKyAgIHRvIHNjcmlwdCBjaGFyYWN0ZXItb3JpZW50ZWQgaW50ZXJhY3Rpb25zIGxpa2UgdHlwaW5nIFNwYWNlIHRvIGEKKyAgICJNb3JlPyIgcHJvbXB0IG9yIGVkaXRpbmcgYSB0ZXh0IGZpbGUgd2l0aCBWSSBvciBFTUFDUy4KKworICAgQnV0IGl0IGhhcyBhZHZhbnRhZ2VzIHRvbzsgZm9yIGV4YW1wbGUgaXQgdGFrZXMgY29udHJvbCBjaGFyYWN0ZXJzCisgICBpbnRvIGFjY291bnQgdGhhdCBtaWdodCBub3QgYmUgdmlzaWJsZSB0byB5b3Ugb3RoZXJ3aXNlLCBhbmQgaXQKKyAgIGF1dG9tYXRpY2FsbHkgY29udmVydHMgY29udHJvbCBjaGFyYWN0ZXJzIGluIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQKKyAgIHN0cmVhbXMgdG8gdGhlIGFwcHJvcHJpYXRlIG5vdGF0aW9uLiBJdCBjYW4gdGVsbCwgZm9yIGV4YW1wbGUgdGhhdCB0aGUKKyAgICIkICIgcHJvbXB0IG9uIHRoZSBsZWZ0IG1hcmdpbiBpbiBVTklYIGlzIHJlYWxseSB7XHsxM31cezEwfSQgfSwKKyAgIHdoZXJlYXMgaW4gVk1TIGl0IG1pZ2h0IGJlIHtcezEzfVx7MTB9XHsxM30kIH0uIFRoZXNlIHNlcXVlbmNlcyBhcmUKKyAgIGRldGVjdGVkIGFuZCByZWNvcmRlZCBhdXRvbWF0aWNhbGx5LgorCisgICBBIGxlYXJuZWQgc2NyaXB0IHNob3VsZCBleGVjdXRlIGNvcnJlY3RseSB3aGVuIHlvdSBnaXZlIGEgVEFLRSBjb21tYW5kCisgICBmb3IgaXQuIEhvd2V2ZXIsIGl0IGlzIHVzdWFsbHkgYXBwcm9wcmlhdGUgdG8gZWRpdCB0aGUgc2NyaXB0IGEgYml0LgorICAgVGhlIG1vc3QgaW1wb3J0YW50IGNoYW5nZSB3b3VsZCBiZSB0byByZW1vdmUgYW55IHBhc3N3b3JkcyBmcm9tIGl0LgorICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBzY3JpcHQgY29udGFpbnM6CisKKyAgSU5QVVQgOSB7XHsxM31cezEwfVBhc3N3b3JkOiB9CisgIElGIEZBSUwgU1RPUCAxIElOUFVUIHRpbWVvdXQKKyAgUEFVU0UgMQorICBPVVRQVVQgYmlnc2VjcmV0XHsxM30KKworICAgeW91IHNob3VsZCByZXBsYWNlIHRoaXMgYnkgc29tZXRoaW5nIGxpa2U6CisKKyAgSU5QVVQgOSB7XHsxM31cezEwfVBhc3N3b3JkOiB9CisgIElGIEZBSUwgU1RPUCAxIElOUFVUIHRpbWVvdXQKKyAgQVNLUSBwc3dkIFBsZWFzZSB0eXBlIHlvdXIgcGFzc3dvcmQ6CisgIFBBVVNFIDEKKyAgT1VUUFVUIFxtKHBzd2QpXHsxM30KKworICAgVGhlIExFQVJOIGNvbW1hbmQgY2FuJ3QgZG8gdGhpcyBmb3IgeW91IHNpbmNlIGl0IGtub3dzIG5vdGhpbmcgYWJvdXQKKyAgICJjb250ZW50IjsgaXQgb25seSBrbm93cyBhYm91dCBsaW5lcyBhbmQgY2FuJ3QgYmUgZXhwZWN0ZWQgdG8gcGFyc2Ugb3IKKyAgIHVuZGVyc3RhbmQgdGhlbSAtLSBhZnRlciBhbGwsIHRoZSBQYXNzd29yZCBwcm9tcHQgbWlnaHQgYmUgaW4gc29tZQorICAgb3RoZXIgbGFuZ3VhZ2UuIFNvIHJlbWVtYmVyOiBpZiB5b3UgdXNlIHRoZSBMRUFSTiBjb21tYW5kIHRvIHJlY29yZCBhCisgICBsb2dpbiBzY3JpcHQsIGJlIHN1cmUgZWRpdCB0aGUgcmVzdWx0aW5nIGZpbGUgdG8gcmVtb3ZlIGFueSBwYXNzd29yZHMuCisgICBBbHNvIGJlIHN1cmUgdG8gZGVsZXRlIGFueSBiYWNrdXAgY29waWVzIHlvdXIgZWRpdG9yIG9yIE9TIG1pZ2h0IGhhdmUKKyAgIG1hZGUgb2YgdGhlIGZpbGUuCisKKyAgIE90aGVyIG1hbnVhbCBhZGp1c3RtZW50cyBtaWdodCBhbHNvIGJlIGFwcHJvcHJpYXRlOgorCisgICAgICogSWYgdGhlIHRhcmdldCBvZiBhbiBJTlBVVCBjb21tYW5kIGNhbiB2YXJ5LCB5b3UgY2FuIHJlcGxhY2UgdGhlCisgICAgICAgSU5QVVQgY29tbWFuZCB3aXRoIE1JTlBVVCBhbmQgdGhlIGFwcHJvcHJpYXRlIHRhcmdldCBsaXN0LCBhbmQvb3IKKyAgICAgICB0aGUgdGFyZ2V0IHdpdGggYSBcZnBhdHRlcm4oKS4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGFyZQorICAgICAgIGRpYWxpbmcgYSBudW1iZXIgdGhhdCBjYW4gYmUgYW5zd2VyZWQgYnkgYW55IG9uZSBvZiAxMDAgdGVybWluYWwKKyAgICAgICBzZXJ2ZXJzLCB3aG9zZSBwcm9tcHRzIGFyZSB0cy0wMD4sIHRzLTAxPiwgdHMtMDI+LCAuLi4gdHMtOTk+LiBUaGUKKyAgICAgICBzY3JpcHQgcmVjb3JkcyBhIHBhcnRpY3VsYXIgb25lIG9mIHRoZXNlLCBidXQgeW91IHdhbnQgaXQgdG8gd29yaworICAgICAgIGZvciBhbGwgb2YgdGhlbSwgc28gY2hhbmdlIChlLmcuKToKKyAgSU5QVVQgMTAgdHMtMjM+ICA7IG9yIHdoYXRldmVyCisgICAgICAgdG86CisgIElOUFVUIDEwIFxmcGF0dGVybih0cy1bMC05XVswLTldPikKKyAgICAgKiBUaGUgSU5QVVQgdGltZW91dCB2YWx1ZXMgYXJlIGNvbnNlcnZhdGl2ZSwgYnV0IHRoZXkgYXJlIGJhc2VkIG9ubHkKKyAgICAgICBvbiBhIHNpbmdsZSBvYnNlcnZhdGlvbjsgeW91IG1pZ2h0IG5lZWQgdG8gdHVuZSB0aGVtLgorICAgICAqIFRoZSBQQVVTRSBjb21tYW5kcyBtaWdodCBub3QgYmUgbmVjZXNzYXJ5LCBvciB0aGUgUEFVU0UgaW50ZXJ2YWwKKyAgICAgICBtaWdodCBuZWVkIGFkanVzdG1lbnQuCisgICAgICogSW4gY2FzZSB5b3UgbWFkZSB0eXBvZ3JhcGhpY2FsIGVycm9ycyBkdXJpbmcgcmVjb3JkaW5nLCB0aGV5IGFyZQorICAgICAgIGluY29ycG9yYXRlZCBpbiB5b3VyIHNjcmlwdDsgeW91IGNhbiBlZGl0IHRoZW0gb3V0IGlmIHlvdSB3YW50IHRvLgorCisgICBIZXJlIGlzIGEgc2FtcGxlIHNjcmlwdCBnZW5lcmF0ZWQgYnkgS2VybWl0ICgibGVhcm4gdm1zLmtzYyIpIGluIHdoaWNoCisgICBhIFRlbG5ldCBjb25uZWN0aW9uIGlzIG1hZGUgdG8gYSBWTVMgY29tcHV0ZXIsIHRoZSB1c2VyIGxvZ3MgaW4sCisgICBzdGFydHMgS2VybWl0IG9uIFZNUywgc2VuZHMgaXQgYSBmaWxlLCBhbmQgdGhlbiBsb2dzIG91dDoKKworICA7IFNjcmlwdGZpbGU6IHZtcy5rc2MKKyAgOyBEaXJlY3Rvcnk6ICAvdXNyL29sZ2EKKyAgOyBSZWNvcmRlZDogICAyMDAwMTEyNCAxNToyMToyMworCisgIFNFVCBIT1NUIC9ORVRXT1JLOlRDUCB2bXMueHl6Y29ycC5jb20KKyAgSUYgRkFJTCBTVE9QIDEgQ29ubmVjdGlvbiBmYWlsZWQKKworICBJTlBVVCA3IHtcezEzfVx7MTB9XHsxM31Vc2VybmFtZTogfQorICBJRiBGQUlMIFNUT1AgMSBJTlBVVCB0aW1lb3V0CisgIFBBVVNFIDEKKyAgT1VUUFVUIG9sZ2FcezEzfQorICBJTlBVVCAzIHtcezEzfVx7MTB9XHsxM31QYXNzd29yZDogfQorICBJRiBGQUlMIFNUT1AgMSBJTlBVVCB0aW1lb3V0CisgIFBBVVNFIDEKKyAgT1VUUFVUIHNlY3JldFx7MTN9CisgIElOUFVUIDE4IHtcezEzfVx7MTB9XHsxM30kIH0KKyAgSUYgRkFJTCBTVE9QIDEgSU5QVVQgdGltZW91dAorICBQQVVTRSAxCisgIE9VVFBVVCBzZXQgZGVmYXVsdCBbLmluY29taW5nXVx7MTN9CisgIElOUFVUIDEyIHtcezEzfVx7MTB9XHsxM30kIH0KKyAgSUYgRkFJTCBTVE9QIDEgSU5QVVQgdGltZW91dAorICBQQVVTRSAxCisgIE9VVFBVVCBrZXJtaXRcezEzfQorICBJTlBVVCAxNSB7XHsxM31cezEwfVx7MTN9QUxUTzpbT0xHQS5JTkNPTUlOR10gQy1LZXJtaXQ+fQorICBJRiBGQUlMIFNUT1AgMSBJTlBVVCB0aW1lb3V0CisgIFBBVVNFIDEKKyAgT1VUUFVUIHJlY2VpdmVcezEzfQorICBzZW5kIG15ZmlsZS50eHQKKworICBJTlBVVCAxOCB7XHsxM31cezEwfVx7MTN9QUxUTzpbT0xHQS5JTkNPTUlOR10gQy1LZXJtaXQ+fQorICBJRiBGQUlMIFNUT1AgMSBJTlBVVCB0aW1lb3V0CisgIFBBVVNFIDEKKyAgT1VUUFVUIGV4aXRcezEzfQorICBJTlBVVCA2IHtcezEzfVx7MTB9XHsxM30kIH0KKyAgSUYgRkFJTCBTVE9QIDEgSU5QVVQgdGltZW91dAorICBQQVVTRSAxCisgIE9VVFBVVCBsb2dvdXRcezEzfQorICBjbG9zZQorICBleGl0CisKKyAgIFRoZSBjb21tYW5kcyBnZW5lcmF0ZWQgYnkgS2VybWl0IGR1cmluZyBDT05ORUNUIChJTlBVVCwgSUYgRkFJTCwKKyAgIFBBVVNFLCBhbmQgT1VUUFVUKSBoYXZlIHVwcGVyY2FzZSBrZXl3b3JkczsgdGhlIGNvbW1hbmRzIHR5cGVkIGJ5IHRoZQorICAgdXNlciBhcmUgaW4gd2hhdGV2ZXIgZm9ybSB0aGUgdXNlciB0eXBlZCB0aGVtIChpbiB0aGlzIGNhc2UsCisgICBsb3dlcmNhc2UpLgorCisgICBbIFs0NjBdVG9wIF0gWyBbNDYxXUNvbnRlbnRzIF0gWyBbNDYyXUMtS2VybWl0IEhvbWUgXSBbIFs0NjNdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA4LjEyLiBQYXR0ZXJuIE1hdGNoaW5nCisKKyAgIEEgcGF0dGVybiBpcyBhIGNoYXJhY3RlciBzdHJpbmcgdGhhdCBpcyB1c2VkIHRvIG1hdGNoIG90aGVyIHN0cmluZ3MuCisgICBQYXR0ZXJucyBjYW4gY29udGFpbiBtZXRhY2hhcmFjdGVycyB0aGF0IHJlcHJlc2VudCBzcGVjaWFsIGFjdGlvbnMKKyAgIGxpa2UgIm1hdGNoIGFueSBzaW5nbGUgY2hhcmFjdGVyIiwgIm1hdGNoIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzIiwKKyAgICJtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlciBmcm9tIGEgbGlzdCIsIGFuZCBzbyBvbi4gVGhlIGJlc3Qga25vd24KKyAgIGFwcGxpY2F0aW9uIG9mIHBhdHRlcm5zIGlzIGluIGZpbGUgc3BlY2lmaWNhdGlvbnMgdGhhdCBjb250YWluCisgICB3aWxkY2FyZHMsIGFzIGluICJzZW5kICoudHh0IiwgbWVhbmluZyAic2VuZCBhbGwgZmlsZXMgd2hvc2UgbmFtZXMgZW5kCisgICB3aXRoIC50eHQiLgorCisgICBQYXR0ZXJucyBhcmUgYWxzbyB1c2VkIGluIGluY3JlYXNpbmdseSBtYW55IG90aGVyIHdheXMsIHRvIHRoZSBleHRlbnQKKyAgIGl0IGlzIHVzZWZ1bCB0byBwb2ludCBvdXQgY2VydGFpbiBpbXBvcnRhbnQgZGlzdGluY3Rpb25zIGluIHRoZSB3YXlzCisgICBpbiB3aGljaCB0aGV5IGFyZSB1c2VkOgorCisgICBBbmNob3JlZCBQYXR0ZXJucworICAgICAgICAgIElmIGFuIGFuY2hvcmVkIHBhdHRlcm4gZG9lcyBub3QgYmVnaW4gd2l0aCAiKiIsIGl0IG11c3QgbWF0Y2gKKyAgICAgICAgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIGFuZCBpZiBpdCBkb2VzIG5vdCBlbmQgd2l0aCAiKiIsCisgICAgICAgICAgaXQgbXVzdCBtYXRjaCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIEZvciBleGFtcGxlLCB0aGUgYW5jaG9yZWQKKyAgICAgICAgICBwYXR0ZXJuICJhYmMiIG1hdGNoZXMgb25seSB0aGUgc3RyaW5nICJhYmMiLCBub3QgImFiY2RlIiBvcgorICAgICAgICAgICJ4eXphYmMiIG9yICJhYmNhYmMiLiBUaGUgYW5jaG9yZWQgcGF0dGVybiAiYWJjKiIgbWF0Y2hlcyBhbnkKKyAgICAgICAgICBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCAiYWJjIjsgdGhlIGFuY2hvcmVkIHBhdHRlcm4gIiphYmMiCisgICAgICAgICAgbWF0Y2hlcyBhbnkgc3RyaW5nIHRoYXQgZW5kcyB3aXRoICJhYmMiOyB0aGUgYW5jaG9yZWQgcGF0dGVybgorICAgICAgICAgICIqYWJjKiIgbWF0Y2hlcyBhbnkgc3RyaW5nIHRoYXQgY29udGFpbnMgImFiYyIgKGluY2x1ZGluZyBhbnkKKyAgICAgICAgICB0aGF0IHN0YXJ0IGFuZC9vciBlbmQgd2l0aCBpdCkuCisKKyAgIEZsb2F0aW5nIFBhdHRlcm5zCisgICAgICAgICAgQSBmbG9hdGluZyBwYXR0ZXJuIG1hdGNoZXMgYW55IHN0cmluZyB0aGF0IGNvbnRhaW5zIGEgc3Vic3RyaW5nCisgICAgICAgICAgdGhhdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLiBJbiBvdGhlciB3b3JkcywgYSBmbG9hdGluZyBwYXR0ZXJuCisgICAgICAgICAgaGFzIGFuIGltcGxpZWQgIioiIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZC4gWW91IGNhbiBhbmNob3IgYQorICAgICAgICAgIGZsb2F0aW5nIHBhdHRlcm4gdG8gdGhlIGJlZ2lubmluZyBieSBzdGFydGluZyBpdCB3aXRoICJeIiwgYW5kCisgICAgICAgICAgeW91IGNhbiBhbmNob3IgaXQgdG8gdGhlIGVuZCBieSBlbmRpbmcgaXQgd2l0aCAiJCIgKHNlZQorICAgICAgICAgIGV4YW1wbGVzIGJlbG93KS4KKworICAgV2lsZGNhcmRzCisgICAgICAgICAgQSB3aWxkY2FyZCBpcyBhbiBhbmNob3JlZCBwYXR0ZXJuIHRoYXQgaGFzIHRoZSBhZGRpdGlvbmFsCisgICAgICAgICAgcHJvcGVydHkgdGhhdCAiKiIgZG9lcyBub3QgbWF0Y2ggZGlyZWN0b3J5IHNlcGFyYXRvcnMuCisKKyAgIFRoaXMgdGVybWlub2xvZ3kgbGV0cyB1cyBkZXNjcmliZSBLZXJtaXQncyBjb21tYW5kcyB3aXRoIGEgYml0IG1vcmUKKyAgIHByZWNpc2lvbi4gV2hlbiBhIHBhdHRlcm4gaXMgdXNlZCBmb3IgbWF0Y2hpbmcgZmlsZW5hbWVzLCBpdCBpcyBhCisgICB3aWxkY2FyZCwgZXhjZXB0IGluIHRoZSBURVhULVBBVFRFUk5TIGFuZCBCSU5BUlktUEFUVEVSTlMgbGlzdHMgYW5kCisgICAvRVhDRVBUOiBjbGF1c2VzLCBpbiB3aGljaCBjYXNlIGRpcmVjdG9yeSBzZXBhcmF0b3JzIGFyZSBub3QKKyAgIHNpZ25pZmljYW50IChmb3IgZXhhbXBsZSwgYSBCSU5BUlktUEFUVEVSTiBvZiAiKi5leGUiIG1hdGNoZXMgYW55IGZpbGUKKyAgIHdob3NlIG5hbWUgZW5kcyBpbiAuZXhlLCBubyBtYXR0ZXIgaG93IGRlZXBseSBpdCBtaWdodCBiZSBidXJpZWQgaW4KKyAgIHN1YmRpcmVjdG9yaWVzKS4gV2hlbiBLZXJtaXQgcGFyc2VzIGEgZmlsZSBzcGVjaWZpY2F0aW9uIGRpcmVjdGx5LAorICAgaG93ZXZlciwgaXQgdXNlcyB0aGUgc3RyaWN0IHdpbGRjYXJkIGRlZmluaXRpb24uIEZvciBleGFtcGxlLCAic2VuZAorICAgYSpiIiBzZW5kcyBhbGwgZmlsZXMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCAiYSIgYW5kIGVuZCB3aXRoICJiIiBpbgorICAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgbm90IGFueSBmaWxlcyB3aG9zZSBuYW1lcyBlbmQgd2l0aCAiYiIgdGhhdAorICAgaGFwcGVuIHRvIGJlIGluIHN1YmRpcmVjdG9yaWVzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggImEiLiBBbmQgYXMKKyAgIG5vdGVkLCB3aWxkY2FyZHMgYXJlIGFuY2hvcmVkLCBzbyAiZGVsZXRlIGZvbyIgZGVsZXRlcyB0aGUgZmlsZSBuYW1lZAorICAgImZvbyIsIGFuZCBub3QgYWxsIGZpbGVzIHdob3NlIG5hbWVzIGhhcHBlbiB0byBjb250YWluICJmb28iLgorCisgICBNb3N0IG90aGVyIHBhdHRlcm5zIGFyZSBhbmNob3JlZC4gRm9yIGV4YW1wbGU6CisKKyAgaWYgbWF0Y2ggYWJjIGJjIC4uLgorCisgICBkb2VzIG5vdCBzdWNjZWVkIChhbmQgeW91IHdvdWxkIGJlIHN1cnByaXNlZCBpZiBpdCBkaWQhKS4gSW4gZmFjdCwgdGhlCisgICBvbmx5IGZsb2F0aW5nIHBhdHRlcm5zIGFyZSB0aGUgb25lcyB1c2VkIGJ5IGNvbW1hbmRzIG9yIGZ1bmN0aW9ucyB0aGF0CisgICBzZWFyY2ggZm9yIHBhdHRlcm5zIGluIGZpbGVzLCBhcnJheXMsIG9yIHN0cmluZ3MuIFRoZXNlIGluY2x1ZGU6CisKKyAgICAgKiBUaGUgR1JFUCBhbmQgVFlQRSAvTUFUQ0ggY29tbWFuZHMuCisgICAgICogVGhlIFxmc2VhcmNoKCksIFxmcnNlYXJjaCgpLCBhbmQgXGZhcnJheWxvb2soKSBmdW5jdGlvbnMuCisKKyAgIFRodXMgdGhlc2UgYXJlIHRoZSBvbmx5IGNvbnRleHRzIGluIHdoaWNoIGV4cGxpY2l0IGFuY2hvcnMgKCJeIiBhbmQKKyAgICIkIikgbWF5IGJlIHVzZWQ6CisKKyAgIGdyZXAgYWJjICoudHh0CisgICAgICAgICAgUHJpbnRzIGFsbCBsaW5lcyBjb250YWluaW5nICJhYmMiIGluIGFsbCBmaWxlcyB3aG9zZSBuYW1lcyBlbmQKKyAgICAgICAgICB3aXRoICIudHh0Ii4KKworICAgZ3JlcCBeYWJjICoudHh0CisgICAgICAgICAgUHJpbnRzIGFsbCBsaW5lcyB0aGF0IHN0YXJ0IHdpdGggImFiYyIgaW4gYWxsICIudHh0IiBmaWxlcy4KKworICAgZ3JlcCBhYmMkICoudHh0CisgICAgICAgICAgUHJpbnRzIGFsbCBsaW5lcyB0aGF0IGVuZCB3aXRoICJhYmMiIGluIGFsbCAiLnR4dCIgZmlsZXMuCisKKyAgIGdyZXAgXmEqeiQgKi50eHQKKyAgICAgICAgICBQcmludHMgYWxsIGxpbmVzIHRoYXQgc3RhcnQgd2l0aCAiYSIgYW5kIGVuZCB3aXRoICJ6IiBpbiBhbGwKKyAgICAgICAgICAiLnR4dCIgZmlsZXMuCisKKyAgIFNpbWlsYXJseSBmb3IgVFlQRSAvUEFHRSwgL2ZzZWFyY2goKSwgL2Zyc2VhcmNoKCksIGFuZCBcZmFycmF5bG9vaygpLgorCisgICBIZXJlIGlzIGEgYnJpZWYgc3VtbWFyeSBvZiBhbmNob3JlZCBhbmQgZmxvYXRpbmcgcGF0dGVybiBlcXVpdmFsZW5jZXM6CisKKyAgQW5jaG9yZWQgICBGbG9hdGluZworICAgIGFiYyAgICAgICBeYWJjJAorICAgICphYmMgICAgICBhYmMkCisgICAgYWJjKiAgICAgIF5hYmMKKyAgICAqYWJjKiAgICAgYWJjCisKKyAgIFsgWzQ2NF1Ub3AgXSBbIFs0NjVdQ29udGVudHMgXSBbIFs0NjZdQy1LZXJtaXQgSG9tZSBdIFsgWzQ2N11LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDguMTMuIERhdGVzIGFuZCBUaW1lcworCisgICBDLUtlcm1pdCdzIGNvbXByZWhlbnNpb24gb2YgZGF0ZS10aW1lIGZvcm1hdHMgaXMgY29uc2lkZXJhYmx5IGV4cGFuZGVkCisgICBpbiB2ZXJzaW9uIDguMC4gQW55IGNvbW1hbmQgdGhhdCByZWFkcyBkYXRlcywgaW5jbHVkaW5nIHRoZSBEQVRFCisgICBjb21tYW5kIGl0c2VsZiwgb3IgYW55IHN3aXRjaCwgc3VjaCBhcyB0aGUgL0JFRk9SRTogYW5kIC9BRlRFUjoKKyAgIHN3aXRjaGVzLCBvciBhbnkgZnVuY3Rpb24gc3VjaCBhcyBcZmN2dGRhdGUoKSwgbm93IGNhbiB1bmRlcnN0YW5kCisgICBkYXRlcyBhbmQgdGltZXMgZXhwcmVzc2VkIGluIGFueSBJU08gODYwMSBmb3JtYXQsIGluIFVuaXggImFzY3RpbWUiCisgICBmb3JtYXQsIGluIEZUUCBNRFRNIGZvcm1hdCwgYW5kIGluIHByYWN0aWNhbGx5IGFueSBmb3JtYXQgdXNlZCBpbiBSRkMKKyAgIDgyMiBvciBSRkMgMjgyMiBlbGVjdHJvbmljIG1haWwsIHdpdGggb3Igd2l0aG91dCB0aW1lem9uZXMsIGFuZCBpbiBhCisgICBncmVhdCBtYW55IG90aGVyIGZvcm1hdHMgYXMgd2VsbC4gSEVMUCBEQVRFIGJyaWVmbHkgc3VtbWFyaXplcyB0aGUKKyAgIGFjY2VwdGFibGUgZGF0ZS10aW1lIGZvcm1hdHMuCisKKyAgIEZ1cnRoZXJtb3JlLCBDLUtlcm1pdCA4LjAgaW5jbHVkZXMgYSBuZXcgYW5kIGVhc3ktdG8tdXNlIGZvcm0gb2YKKyAgIGRhdGUtdGltZSBhcml0aG1ldGljLCBpbiB3aGljaCBhbnkgZGF0ZSBvciB0aW1lIGNhbiBiZSBjb21iaW5lZCB3aXRoIGEKKyAgICJkZWx0YSB0aW1lIiwgdG8gYWRkIG9yIHN1YnRyYWN0IHRoZSBkZXNpcmVkIHRpbWUgaW50ZXJ2YWwgKHllYXJzLAorICAgbW9udGhzLCB3ZWVrcywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpIHRvL2Zyb20gdGhlIGdpdmVuIGRhdGUuCisgICBBbmQgbmV3IGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGNvbXBhcmUgZGF0ZXMgYW5kIHRvIGNvbXB1dGUgdGhlaXIKKyAgIGRpZmZlcmVuY2VzLgorCisgICBBcyB5b3UgY2FuIGltYWdpbmUsIGFsbCB0aGlzIHJlcXVpcmVzIHF1aXRlIGEgYml0IG9mICJzeW50YXgiLiBUaGUKKyAgIGJhc2ljIGZvcm1hdCBpczoKKworICBbIGRhdGUgXSBbIHRpbWUgXSBbIGRlbHRhIF0KKworICAgRWFjaCBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IGluIG1vc3QgY2FzZXMgKGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCkKKyAgIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGZpZWxkLiBJZiBhIGRhdGUgaXMgZ2l2ZW4sIGl0IG11c3QgY29tZQorICAgZmlyc3QuIElmIG5vIGRhdGUgaXMgZ2l2ZW4sIHRoZSBjdXJyZW50IGRhdGUgaXMgYXNzdW1lZC4gSWYgbm8gdGltZSBpcworICAgZ2l2ZW4sIGFuIGFwcHJvcHJpYXRlIHRpbWUgaXMgc3VwcGxpZWQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYSBkYXRlIHdhcworICAgc3VwcGxpZWQuIElmIG5vIGRlbHRhIGlzIGdpdmVuLCBubyBhcml0aG1ldGljIGlzIGRvbmUuIElmIGEgZGVsdGEgaXMKKyAgIGdpdmVuIHdpdGhvdXQgYSBkYXRlIG9yIHRpbWUsIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgYXJlIHVzZWQgYXMKKyAgIHRoZSBiYXNlLgorCisgICBEYXRlLXRpbWUtZGVsdGEgZmllbGRzIGFyZSBsaWtlbHkgdG8gY29udGFpbiBzcGFjZXMgKGFsdGhvdWdoIHRoZXkKKyAgIG5lZWQgbm90OyBzcGFjZS1mcmVlIGZvcm1zIGFyZSBhbHdheXMgYXZhaWxhYmxlKS4gVGhlcmVmb3JlLCBpbiBtb3N0CisgICBjb250ZXh0cyAtLSBhbmQgbm90YWJseSBhcyBzd2l0Y2ggYXJndW1lbnRzIC0tIGRhdGUtdGltZSBpbmZvcm1hdGlvbgorICAgbXVzdCBiZSBlbmNsb3NlZCBpbiBicmFjZXMgb3IgZG91YmxlcXVvdGVzLCBmb3IgZXhhbXBsZToKKworICBzZW5kIC9hZnRlcjoiOC1BdWctMjAwMSAxMjowMCBVVEMiICoudHh0CisKKyAgIEtlcm1pdCdzIHN0YW5kYXJkIGludGVybmFsIGZvcm1hdCBmb3IgZGF0ZXMgYW5kIHRpbWVzIGlzOgorCisgIHl5eXltbWRkIGhoOm1tOnNzCisKKyAgIGZvciBleGFtcGxlOgorCisgIDIwMDEwMjA4IDEwOjI4OjAxCisKKyAgIERhdGUtdGltZXMgY2FuIGFsd2F5cyBiZSBnaXZlbiBpbiB0aGlzIGZvcm1hdC4geXl5eSBpcyB0aGUgNC1kaWdpdAorICAgeWVhciwgbW0gaXMgdGhlIHR3by1kaWdpdCBtb250aCAoMS0xMjsgc3VwcGx5IGxlYWRpbmcgemVybyBmb3IKKyAgIEphbi1TZXApLCBkZCBpcyB0aGUgMi1kaWdpdCBkYXkgKGxlYWRpbmcgemVybyBmb3IgMS05KSwgaGggaXMgdGhlIGhvdXIKKyAgICgwLTIzKSwgbW0gdGhlIG1pbnV0ZSAoMC01OSksIHNzIHRoZSBzZWNvbmQgKDAtNTkpLCBlYWNoIHdpdGggbGVhZGluZworICAgemVybyBpZiBsZXNzIHRoYW4gdGhlIGZpZWxkIHdpZHRoLiBUaGUgZGF0ZSBhbmQgdGltZSBjYW4gYmUgc2VwYXJhdGVkCisgICBieSBhIHNwYWNlLCBhbiB1bmRlcnNjb3JlLCBhIGNvbG9uLCBvciB0aGUgbGV0dGVyIFQuIFRoZSB0aW1lIGlzIGluCisgICAyNC1ob3VyIGZvcm1hdC4gVGh1cyB0aGUgdmFyaW91cyBxdWFudGl0ZXMgYXJlIGF0IHRoZSBmb2xsb3dpbmcgZml4ZWQKKyAgIHBvc2l0aW9uczoKKworUG9zaXRpb24gIENvbnRlbnRzICAgICAgICAgICAgICAgICAgICAKKyAgIDEtNCAgICBZZWFyICAgKDQgZGlnaXRzLCAwMDAwLTk5OTkpCisgICA1LTYgICAgTW9udGggICgyIGRpZ2l0cywgMS0xMikKKyAgIDctOCAgICBEYXkgICAgKDIgZGlnaXRzLCAxLTMxKQorICAgOSAgICAgIERhdGUtVGltZSBTZXBhcmF0b3IgKHNwYWNlLCA6LCBfLCBvciB0aGUgbGV0dGVyIFQpCisgIDEwLTExICAgSG91ciAgICgyIGRpZ2l0cywgMC0yMykKKyAgMTIgICAgICBIb3VyLU1pbnV0ZSBTZXBhcmF0b3IgKGNvbG9uKQorICAxMy0xNCAgIE1pbnV0ZSAoMiBkaWdpdHMsIDAtNTkpCisgIDE1ICAgICAgTWludXRlLVNlY29uZCBTZXBhcmF0b3IgKGNvbG9uKQorICAxNi0xNyAgIFNlY29uZCAoMiBkaWdpdHMsIDAtNTkpCisKKyAgIEV4YW1wbGU6CisKKyAgMTk4MDA1MjYgMTM6MDc6MTIgIDI2IE1heSAxOTgwLCAxMzowNzoxMiAoMTowNzoxMlBNKQorCisgICBUaGlzIGlzIHRoZSBmb3JtYXQgcHJvZHVjZWQgYnkgdGhlIERBVEUgY29tbWFuZCBhbmQgYnkgYW55IGZ1bmN0aW9uCisgICB0aGF0IHJldHVybnMgYSBkYXRlLXRpbWUuIEl0IGlzIHN1aXRhYmxlIGZvciBsZXhpY2FsIGNvbXBhcmlzb24gYW5kCisgICBzb3J0aW5nLCBhbmQgZm9yIHVzZSBhcyBhIGRhdGUtdGltZSBpbiBhbnkgS2VybWl0IGNvbW1hbmQuIFdoZW4gdGhpcworICAgZm9ybWF0IGlzIGdpdmVuIGFzIGlucHV0IHRvIGEgY29tbWFuZCBvciBmdW5jdGlvbiwgdmFyaW91cyBkYXRlLXRpbWUKKyAgIHNlcGFyYXRvcnMgKGFzIG5vdGVkKSBhcmUgYWNjZXB0ZWQ6CisKKyAgMTk4MDA1MjYgMTM6MDc6MTIgIDI2IE1heSAxOTgwLCAxMzowNzoxMiAoMTowNzoxMlBNKQorICAyMDAxMDIwOF8xMDoyODozNSAgMiBGZWJydWFyeSAyMDAxLCAxMDoyODozNSBBTQorICAxODU4MDEwMToxMjowMDowMCAgMSBKYW51YXJ5IDE4NTgsIG5vb24KKyAgMjAxMTAyMDhUMDA6MDA6MDAgIDIgRmVicnVhcnkgMjAxMSwgbWlkbmlnaHQKKworICAgQ2VydGFpbiBvdGhlciBzcGVjaWFsIGRhdGUtdGltZSBmb3JtYXRzIHRoYXQgYXJlIGVuY291bnRlcmVkIG9uCisgICBjb21wdXRlciBuZXR3b3JrcyBhcmUgcmVjb2duaXplZDoKKworICAgQXNjdGltZSBGb3JtYXQKKyAgICAgICAgICBUaGlzIGlzIGEgZml4ZWQgZm9ybWF0IHVzZWQgYnkgVW5peCwgbmFtZWQgYWZ0ZXIgVW5peCdzCisgICAgICAgICAgYXNjdGltZSgpICgiQVNDSUkgdGltZSIpIGZ1bmN0aW9uLiBJdCBpcyBhbHdheXMgZXhhY3RseSAyNAorICAgICAgICAgIGNoYXJhY3RlcnMgbG9uZy4gRXhhbXBsZTogRnJpIEF1ZyAxMCAxNjozODowMSAyMDAxCisKKyAgIEFzY3RpbWUgd2l0aCBUaW1lem9uZQorICAgICAgICAgIFRoaXMgaXMgbGlrZSBBc2N0aW1lIGZvcm1hdCwgYnV0IGluY2x1ZGVzIGEgMy1jaGFyYWN0ZXIKKyAgICAgICAgICB0aW1lem9uZSBiZXR3ZWVuIHRoZSB0aW1lIGFuZCB5ZWFyLiBJdCBpcyBleGFjdGx5IDI4IGNoYXJhY3RlcnMKKyAgICAgICAgICBsb25nLiBFeGFtcGxlOiBGcmkgQXVnIDEwIDE2OjM4OjAxIEdNVCAyMDAxCisKKyAgIEUtTWFpbCBGb3JtYXQKKyAgICAgICAgICBFLW1haWwgZGF0ZS10aW1lIGZvcm1hdHMgYXJlIGRlZmluZWQgaW4gWzQ2OF1SRkMgMjgyMiB3aXRoIGEKKyAgICAgICAgICBmYWlyIGFtb3VudCBvZiBmbGV4aWJpbGl0eSBhbmQgb3B0aW9ucy4gVGhlIGZvbGxvd2luZyBleGFtcGxlcworICAgICAgICAgIGFyZSB0eXBpY2FsIG9mIGUtbWFpbHMgYW5kIEhUVFAgKHdlYi1wYWdlKSBoZWFkZXJzOgorCisgIFNhdCwgMTQgSnVsIDIwMDEgMTE6NDk6MjkgICAgICAgICAgICAgICAgKE5vIHRpbWV6b25lKQorICBGcmksIDI0IE1hciAyMDAwIDE0OjE5OjU5IEVTVCAgICAgICAgICAgIChTeW1ib2xpYyB0aW1lem9uZSkKKyAgVHVlLCAyNiBKdW4gMjAwMSAxMDoxOTo0NSAtMDQwMCAoRURUKSAgICAoR01UIE9mZnNldCArIGNvbW1lbnQpCisKKyAgIEZUUCBNRFRNIEZvcm1hdAorICAgICAgICAgIFRoaXMgaXMgdGhlIGRhdGUtdGltZSBmb3JtYXQgc3VwcGxpZWQgYnkgRlRQIHNlcnZlcnMgdGhhdAorICAgICAgICAgIHN1cHBvcnQgdGhlIChub3QgeWV0IHN0YW5kYXJkIGJ1dCB3aWRlbHkgdXNlZCBuZXZlcnRoZWxlc3MpCisgICAgICAgICAgTURUTSBjb21tYW5kLCBieSB3aGljaCB0aGUgRlRQIGNsaWVudCBhc2tzIGZvciBhIGZpbGUncworICAgICAgICAgIG1vZGlmaWNhdGlvbiB0aW1lOgorCisgIHl5eXltbWRkaGhtbXNzWy5mZmZmXQorCisgICAgICAgICAgd2hlcmUgeXl5eSBpcyB0aGUgNC1kaWdpdCB5ZWFyLCBtbSBpcyB0aGUgMi1kaWdpdCBtb250aCwgYW5kIHNvCisgICAgICAgICAgb24sIGV4YWN0bHkgMTQgZGlnaXRzIGxvbmcuIEFuIG9wdGlvbmFsIGZyYWN0aW9uYWwgcGFydAorICAgICAgICAgIChmcmFjdGlvbiBvZiBzZWNvbmQpIG1heSBhbHNvIGJlIGluY2x1ZGVkLCBzZXBhcmF0ZWQgYnkgYQorICAgICAgICAgIGRlY2ltYWwgcG9pbnQgKHBlcmlvZCkuIEtlcm1pdCByb3VuZHMgdG8gdGhlIG5lYXJlc3Qgc2Vjb25kLgorICAgICAgICAgIEV4YW1wbGU6CisKKyAgMjAwMjAyMDgxMDI4MzUuNTE1ICAgICAgICAgICAgICAgICAgICAgICAoOCBGZWJydWFyeSAyMDAyIDEwOjI4OjM2IEFNKQorCisgICAgOC4xMy4xLiBUaGUgRGF0ZQorCisgICBUaGUgZGF0ZSwgaWYgZ2l2ZW4sIG11c3QgcHJlY2VkZSB0aGUgdGltZSBhbmQvb3IgZGVsdGEsIGFuZCBjYW4gYmUgaW4KKyAgIG1hbnksIG1hbnkgZm9ybWF0cy4gRm9yIHN0YXJ0ZXJzLCB5b3UgY2FuIHVzZSBzZXZlcmFsIHN5bWJvbGljIGRhdGUKKyAgIG5hbWVzIGluIHBsYWNlIG9mIGFjdHVhbCBkYXRlczoKKworICAgTk9XCisgICAgICAgICAgVGhpcyBpcyByZXBsYWNlZCBieSB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lLiBUaGUgdGltZSBjYW4gbm90CisgICAgICAgICAgYmUgb3ZlcnJpZGVuIChpZiB5b3Ugd2FudCB0byBzdXBwbHkgYSBzcGVjaWZpYyB0aW1lLCB1c2UgVE9EQVkKKyAgICAgICAgICByYXRoZXIgdGhhbiBOT1cpLgorCisgICBUT0RBWQorICAgICAgICAgIFRoaXMgaXMgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgYSBkZWZhdWx0IHRpbWUgb2YKKyAgICAgICAgICAwMDowMDowMCBpcyBzdXBwbGllZCwgYnV0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3BlY2lmaWMgdGltZTsKKyAgICAgICAgICBmb3IgZXhhbXBsZSwgaWYgdG9kYXkgaXMgOCBGZWJydWFyeSAyMDAyLCB0aGVuICJUT0RBWSIgaXMKKyAgICAgICAgICAiMjAwMjA4MDIgMDA6MDA6MDAiIGJ1dCAiVE9EQVkgMTA6MjgiIGlzICIyMDAyMDgwMiAxMDoyODowMCIuCisKKyAgIFRPTU9SUk9XCisgICAgICAgICAgTGlrZSBUT0RBWSwgYnV0IG9uZSBkYXkgbGF0ZXIgKGlmIHRvZGF5IGlzIDggRmVicnVhcnkgMjAwMiwKKyAgICAgICAgICB0aGVuICJUT01PUlJPVyIgaXMgIjIwMDIwODAzIDAwOjAwOjAwIiBidXQgIlRPTU9SUk9XIDE2OjMwIiBpcworICAgICAgICAgICIyMDAyMDgwMyAxNjozMDowMCIpLgorCisgICBZRVNURVJEQVkKKyAgICAgICAgICBMaWtlIFRPREFZLCBidXQgb25lIGRheSBlYXJsaWVyLgorCisgICBNT05EQVksIFRVRVNEQVksIFdFRE5FU0RBWSwgLi4uLCBTVU5EQVkKKyAgICAgICAgICBUaGUgZGF0ZSBvbiB0aGUgZ2l2ZW4gZGF5IG9mIHRoZSB3ZWVrLCB0b2RheSBvciBsYXRlci4gQQorICAgICAgICAgIGRlZmF1bHQgdGltZSBvZiAwMDowMDowMCBpcyBzdXBwbGllZCBidXQgY2FuIGJlIG92ZXJyaWRkZW4uCisgICAgICAgICAgRXhhbXBsZTogIlNBVFVSREFZIDEyOjAwIiBtZWFucyBuZXh0IFNhdHVyZGF5IChvciB0b2RheSwgaWYKKyAgICAgICAgICB0b2RheSBpcyBTYXR1cmRheSkgYXQgbm9vbi4KKworICAgWW91IGNhbiBnaXZlIGFuIGV4cGxpY2l0IGRhdGUgaW4gYWxtb3N0IGFueSBjb25jZWl2YWJsZSBmb3JtYXQsIGJ1dAorICAgdGhlcmUgYXJlIHNvbWUgcnVsZXM6CisKKyAgICAgKiBJZiBhIGRhdGUgaXMgZ2l2ZW4sIGl0IG11c3QgaGF2ZSB0aHJlZSBmaWVsZHM6IGRheSwgbW9udGgsIGFuZAorICAgICAgIHllYXI7IHRoZSBvcmRlciBjYW4gdmFyeSAoZXhjZXB0IHRoYXQgdGhlIG1vbnRoIGNhbiBub3QgYmUgbGFzdCkuCisgICAgICogSWYgbmFtZXMgYXJlIHVzZWQgZm9yIGRheXMsIG1vbnRocywgZXRjLCB0aGV5IG11c3QgYmUgRW5nbGlzaC4KKyAgICAgKiBUaGUgeWVhciBtdXN0IGxpZSBiZXR3ZWVuIDAwMDAgYW5kIDk5OTksIGluY2x1c2l2ZS4KKyAgICAgKiBBbGwgY2FsZW5kYXIgY2FsY3VsYXRpb25zIHVzZSBHcmVnb3JpYW4gZGF0aW5nLCBzbyBjYWxjdWxhdGVkCisgICAgICAgZGF0ZXMgZm9yIHllYXJzIHByaW9yIHRvIDE1ODIgKG9yIGxhdGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvdW50cnkpCisgICAgICAgd2lsbCBub3QgYWdyZWUgd2l0aCBoaXN0b3JpY2FsIGRhdGVzLiBPdGhlciBmb3JtcyBvZiBkYXRpbmcgKGUuZy4KKyAgICAgICBIZWJyZXcsIENoaW5lc2UpIGFyZSBub3Qgc3VwcG9ydGVkLgorCisgICBWYXJpb3VzIGRhdGUtZmllbGQgc2VwYXJhdG9ycyBhcmUgYWNjZXB0ZWQ6IGh5cGhlbiwgc2xhc2gsIHNwYWNlLAorICAgdW5kZXJzY29yZSwgcGVyaW9kLiBUaGUgc2FtZSBmaWVsZCBzZXBhcmF0b3IgKGlmIGFueSkgbXVzdCBiZSB1c2VkIGluCisgICBib3RoIHBsYWNlczsgZm9yIGV4YW1wbGUgMTgtU2VwLTIwMDEgYnV0IG5vdCAxOC1TZXAvMjAwMS4gTW9udGhzIGNhbgorICAgYmUgbnVtZXJpYyAoMS0xMikgb3IgRW5nbGlzaCBuYW1lcyBvciBhYmJyZXZpYXRpb25zLiBNb250aCBuYW1lCisgICBhYmJyZXZpYXRpb25zIGFyZSBub3JtYWxseSB0aHJlZSBsZXR0ZXJzLCBlLmcuIEFwciwgTWF5LCBKdW4sIEp1bC4KKyAgIENhcGl0YWxpemF0aW9uIGRvZXNuJ3QgbWF0dGVyLgorCisgICBIZXJlIGFyZSBhIGZldyBleGFtcGxlczoKKworICAxOCBTZXAgMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFbmdsaXNoIG1vbnRoLCBhYmJyZXZpYXRlZCkKKyAgMTggU2VwdGVtYmVyIDIwMDEgICAgICAgICAgICAgICAgICAgICAgICAoRW5nbGlzaCBtb250aCwgc3BlbGxlZCBvdXQpCisgIDIwMDEgU2VwdCAxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFllYXIsIG1vbnRoLCBkYXkpCisgIDE4LVNlcC0yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdpdGggaHlwaGVucykKKyAgMTgvMDkvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQWxsIG51bWVyaWMgd2l0aCBzbGFzaGVzKQorICAxOC4wOS4yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEaXR0bywgd2l0aCBwZXJpb2RzKQorICAxOF8wOV8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEaXR0bywgd2l0aCB1bmRlcnNjb3JlcykKKyAgMDkvMTgvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2VlIGJlbG93KQorICAyMDAxLzA5LzE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTZWUgYmVsb3cpCisgIFNlcHRlbWJlciAxOCwgMjAwMSAgICAgICAgICAgICAgICAgICAgICAgKENvcnJlc3BvbmRlbmNlIHN0eWxlKQorICBTZXAtMTgtMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNb250aC1kYXkteWVhcikKKyAgMjAwMTA5MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTnVtZXJpYywgbm8gc2VwYXJhdG9ycykKKworICAgWW91IGNhbiBhbHNvIGluY2x1ZGUgdGhlIGRheSBvZiB0aGUgd2VlayB3aXRoIGEgc3BlY2lmaWMgZGF0ZSwgaW4KKyAgIHdoaWNoIGNhc2UgaXQgaXMgYWNjZXB0ZWQgKGlmIGl0IGlzIGEgdmFsaWQgZGF5IG5hbWUpLCBidXQgbm90CisgICB2ZXJpZmllZCB0byBhZ3JlZSB3aXRoIHRoZSBnaXZlbiBkYXRlOgorCisgIFR1ZSwgMTggU2VwIDIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgKEFiYnJldmlhdGVkLCB3aXRoIGNvbW1hKQorICBUdWUsMTggU2VwIDIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgIChDb21tYSBidXQgbm8gc3BhY2UpCisgIFR1ZSAxOCBTZXAgMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgKEFiYnJldmlhdGVkLCBubyBjb21tYSkKKyAgVHVlc2RheSAxOCBTZXAgMjAwMSAgICAgICAgICAgICAgICAgICAgICAoU3BlbGxlZCBvdXQpCisgIFR1ZXNkYXksIDE4IFNlcCAyMDAxICAgICAgICAgICAgICAgICAgICAgKGV0YykKKyAgRnJpZGF5LCAxOCBTZXAgMjAwMSAgICAgICAgICAgICAgICAgICAgICAoQWNjZXB0ZWQgZXZlbiBpZiBub3QgRnJpZGF5KQorCisgICBJbiBhbGwtbnVtZXJpYyBkYXRlcyB3aXRoIHRoZSB5ZWFyIGxhc3QsIHN1Y2ggYXMgMTgvMDkvMjAwMSwgS2VybWl0CisgICBpZGVudGlmaWVzIHRoZSB5ZWFyIGJlY2F1c2UgaXQncyA0IGRpZ2l0cywgdGhlbiBkZWNpZGVzIHdoaWNoIG9mIHRoZQorICAgb3RoZXIgdHdvIG51bWJlcnMgaXMgdGhlIG1vbnRoIG9yIGRheSBiYXNlZCBvbiBpdHMgdmFsdWUuIElmIGJvdGggYXJlCisgICAxMiBvciBsZXNzIGFuZCBhcmUgdW5lcXVhbCwgdGhlIGRhdGUgaXMgYW1iaWd1b3VzIGFuZCBpcyByZWplY3RlZC4gSW4KKyAgIGFsbC1udW1lcmljIGRhdGVzIHdpdGggdGhlIHllYXIgZmlyc3QsIHRoZSBzZWNvbmQgZmllbGQgaXMgYWx3YXlzIHRoZQorICAgbW9udGggYW5kIHRoZSB0aGlyZCBpcyB0aGUgZGF5LiBUaGUgbW9udGggbmV2ZXIgY29tZXMgbGFzdC4gQSBkYXRlCisgICB3aXRoIG5vIHNlcGFyYXRvcnMgaXMgYWNjZXB0ZWQgb25seSBpZiBpdCBpcyBhbGwgbnVtZXJpYyBhbmQgaGFzCisgICBleGFjdGx5IGVpZ2h0IGRpZ2l0cywgYW5kIGlzIGFzc3VtZWQgdG8gYmUgaW4geXl5eW1tZGQgZm9ybWF0LgorCisgIDIwMDEwOTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE4LVNlcC0yMDAxIDAwOjAwOjAwKQorCisgICBvciAxNCBkaWdpdHMgKGFzIGluIEZUUCBNRFRNIGZvcm1hdCk6CisKKyAgMjAwMTA5MTgxMjM0NTYgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTgtU2VwLTIwMDEgMTI6MzQ6NTYpCisKKyAgIFlvdSBjYW4gYWx3YXlzIGF2b2lkIGFtYmlndWl0eSBieSBwdXR0aW5nIHRoZSB5ZWFyIGZpcnN0LCBvciBieSB1c2luZworICAgYW4gRW5nbGlzaCwgcmF0aGVyIHRoYW4gbnVtZXJpYywgbW9udGguIEEgZGF0ZSBzdWNoIGFzIDA5LzA4LzIwMDEKKyAgIHdvdWxkIGJlIGFtYmlndW91cyBidXQgMjAwMS8wOS8wOCBpcyBub3QsIG5vciBpcyAwOS1BdWctMjAwMS4KKworICAgVW50aWwgdGhlIGxhdGUgMTk5MHMsIGl0IHdhcyBjb21tb24gdG8gZW5jb3VudGVyIDItZGlnaXQgeWVhcnMsIGFuZAorICAgdGhlc2UgYXJlIGZvdW5kIHRvIHRoaXMgZGF5IGluIG9sZCBlLW1haWxzIGFuZCBvdGhlciBkb2N1bWVudHMuIEtlcm1pdAorICAgYWNjZXB0cyB0aGVzZSBkYXRlcyBpZiB0aGV5IGhhdmUgRW5nbGlzaCBtb250aHMsIGFuZCBpbnRlcnByZXRzIHRoZW0KKyAgIGFjY29yZGluZyB0byB0aGUgd2luZG93aW5nIHJ1bGVzIG9mIFs0NjldUkZDIDI4MjI6ICJJZiBhIHR3byBkaWdpdAorICAgeWVhciBpcyBlbmNvdW50ZXJlZCB3aG9zZSB2YWx1ZSBpcyBiZXR3ZWVuIDAwIGFuZCA0OSwgdGhlIHllYXIgaXMKKyAgIGludGVycHJldGVkIGJ5IGFkZGluZyAyMDAwLCBlbmRpbmcgdXAgd2l0aCBhIHZhbHVlIGJldHdlZW4gMjAwMCBhbmQKKyAgIDIwNDkuIElmIGEgdHdvIGRpZ2l0IHllYXIgaXMgZW5jb3VudGVyZWQgd2l0aCBhIHZhbHVlIGJldHdlZW4gNTAgYW5kCisgICA5OSwgb3IgYW55IHRocmVlIGRpZ2l0IHllYXIgaXMgZW5jb3VudGVyZWQsIHRoZSB5ZWFyIGlzIGludGVycHJldGVkIGJ5CisgICBhZGRpbmcgMTkwMC4iCisKKyAgIElmIHlvdSBuZWVkIHRvIHNwZWNpZnkgYSB5ZWFyIHByaW9yIHRvIDEwMDAsIHVzZSBsZWFkaW5nIHplcm9zIHRvCisgICBlbnN1cmUgaXQgaXMgbm90IG1pc2ludGVycHJldGVkIGFzIGEgIm5vbi1ZMkstY29tcGxpYW50IiBtb2Rlcm4geWVhcjoKKworICA3LU9jdC03NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTc3MTAwNyAwMDowMDowMCkKKyAgNy1PY3QtMDA3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMDA3NzEwMDcgMDA6MDA6MDApCisKKyAgICA4LjEzLjIuIFRoZSBUaW1lCisKKyAgIFRoZSBiYXNpYyB0aW1lIGZvcm1hdCBpcyBoaDptbTpkZDsgdGhhdCBpcyBob3VycywgbWludXRlcywgc2Vjb25kcywKKyAgIHNlcGFyYXRlZCBieSBjb2xvbnMsIHBlcmhhcHMgd2l0aCBhbiBvcHRpb25hbCBmcmFjdGlvbmFsIHNlY29uZAorICAgc2VwYXJhdGVkIGJ5IGEgZGVjaW1hbCBwb2ludCAocGVyaW9kKS4gVGhlIGhvdXJzIGFyZSBpbiAyNC1ob3VyCisgICBmb3JtYXQ7IDEyIGlzIG5vb24sIDEzIGlzIDFwbSwgYW5kIHNvIG9uLiBGaWVsZHMgb21pdHRlZCBmcm9tIHRoZQorICAgcmlnaHQgZGVmYXVsdCB0byB6ZXJvLiBGaWVsZHMgY2FuIGJlIG9taXR0ZWQgZnJvbSB0aGUgbGVmdCBvciBtaWRkbGUKKyAgIGJ5IGluY2x1ZGluZyB0aGUgZmllbGQncyB0ZXJtaW5hdGluZyBjb2xvbi4gRXhhbXBsZXM6CisKKyAgMTE6NTk6NTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6NTk6NTkgQU0pCisgIDExOjU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExOjU5OjAwIEFNKQorICAxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMTowMDowMCBBTSkKKyAgMTE6NTk6NTkuMzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6NTk6NTkgQU0pCisgIDExOjU5OjU5LjY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vb24pCisgIDAzOjIxOjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM6MjE6MDAgQU0pCisgIDM6MjE6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM6MjE6MDAgQU0pCisgIDE1OjIxOjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM6MjE6MDAgUE0pCisgIDoyMTowMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAwOjIxOjAwIEFNKQorICA6OjAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwMDowMDowMSBBTSkKKyAgMTE6OjU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6MDA6NTkgQU0pCisKKyAgIExlYWRpbmcgemVyb3MgY2FuIGJlIG9taXR0ZWQsIGJ1dCBpdCBpcyBjdXN0b21hcnkgYW5kIG1vcmUgcmVhZGFibGUgdG8KKyAgIGtlZXAgdGhlbSBpbiB0aGUgbWludXRlIGFuZCBzZWNvbmQgZmllbGRzOgorCisgIDAzOjAyOjAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAzOjAyOjAxIEFNKQorICAzOjAyOjAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwMzowMjowMSBBTSkKKyAgMzoyOjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMDM6MDI6MDEgQU0pCisKKyAgIEFNL1BNIG5vdGF0aW9uIGlzIGFjY2VwdGVkIGlmIHlvdSB3aXNoIHRvIHVzZSBpdDoKKworICAxMTo1OTo1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMTo1OTo1OSBBTSkKKyAgMTE6NTk6NTlBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6NTk6NTkgQU0pCisgIDExOjU5OjU5QS5NLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExOjU5OjU5IEFNKQorICAxMTo1OTo1OWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMTo1OTo1OSBBTSkKKyAgMTE6NTk6NTlhLm0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6NTk6NTkgQU0pCisgIDExOjU5OjU5UE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExOjU5OjU5IFBNID0gMjM6NTk6NTkpCisgIDExOjU5OjU5UC5NLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExOjU5OjU5IFBNID0gMjM6NTk6NTkpCisgIDExOjU5OjU5cG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExOjU5OjU5IFBNID0gMjM6NTk6NTkpCisgIDExOjU5OjU5cC5tLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExOjU5OjU5IFBNID0gMjM6NTk6NTkpCisKKyAgIFlvdSBjYW4gb21pdCB0aGUgY29sb25zIGlmIHlvdSB3aXNoLCBpbiB3aGljaCBjYXNlIEtlcm1pdCB1c2VzIHRoZQorICAgZm9sbG93aW5nIHJ1bGVzIHRvIGludGVycHJldCB0aGUgdGltZToKKworICAgIDEuIDYgZGlnaXRzIGlzIGhoOm1tOnNzLCBlLmcuIDEyMzQ1NiBpcyAxMjozNDo1Ni4KKyAgICAyLiA1IGRpZ2l0cyBpcyBoOm1tOnNzLCBlLmcuIDEyMzQ1IGlzIDE6MjM6NDUuCisgICAgMy4gNCBkaWdpdHMgaXMgaGg6bW0sIGUuZy4gMTIzNCBpcyAxMjozNC4KKyAgICA0LiAzIGRpZ2l0cyBpcyBoOm1tLCBlLmcuIDEyMyBpcyAxOjIzLgorICAgIDUuIDIgZGlnaXRzIGlzIGhoLCBlLmcuIDEyIGlzIDEyOjAwLgorICAgIDYuIDEgZGlnaXQgaXMgaCAodGhlIGhvdXIpLCBlLmcuIDEgaXMgMTowMC4KKworICAgRXhhbXBsZXM6CisKKyAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMDE6MDA6MDAgQU0pCisgIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwOjAwOjAwIEFNKQorICAyMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwMjozMDowMCBBTSkKKyAgMjMwcG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMDI6MzA6MDAgUE0gPSAxNDozMDowMCkKKyAgMTExNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTE6MTU6MDAgQU0pCisgIDIzMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExOjE1OjAwIFBNID0gMjM6MTU6MDAgUE0pCisgIDIzMTUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAyOjMxOjUwIEFNKQorICAyMzE1MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyMzoxNTowMCBQTSkKKworICAgIDguMTMuMy4gVGltZSBab25lcworCisgICBJZiBhIHRpbWUgaXMgZ2l2ZW4sIGl0IGNhbiAoYnV0IG5lZWQgbm90KSBiZSBmb2xsb3dlZCBieSBhIHRpbWUgem9uZQorICAgZGVzaWduYXRvci4gSWYgbm8gdGltZSB6b25lIGlzIGluY2x1ZGVkLCB0aGUgdGltZSBpcyB0cmVhdGVkIGFzIGxvY2FsCisgICB0aW1lIGFuZCBubyB0aW1lem9uZSBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLgorCisgICBUaGUgcHJlZmVycmVkIHRpbWUgem9uZSBkZXNpZ25hdG9yIGlzIHRoZSBVVEMgT2Zmc2V0LCBhcyBzcGVjaWZpZWQgaW4KKyAgIFs0NzBdUkZDIDI4MjI6IGEgcGx1cyBzaWduIG9yIG1pbnVzIHNpZ24gaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkKKyAgIGV4YWN0bHkgZm91ciBkZWNpbWFsIGRpZ2l0cywgc2lnbmlmeWluZyB0aGUgZGlmZmVyZW5jZSBpbiBoaCAoaG91cnMpCisgICBhbmQgbW0gKG1pbnV0ZXMpIGZyb20gVW5pdmVyc2FsIENvb3JkaW5hdGVkIFRpbWUgKFVUQywgYWxzbyBrbm93biBhcworICAgR3JlZW53aWNoIE1lYW4gVGltZSwgb3IgR01UKSwgd2l0aCBuZWdhdGl2ZSBudW1iZXJzIHRvIHRoZSBXZXN0IGFuZAorICAgcG9zaXRpdmUgbnVtYmVycyB0byB0aGUgRWFzdC4gRm9yIGV4YW1wbGU6CisKKyAgRnJpLCAxMyBKdWwgMjAwMSAxMjo1NDoyOSAtMDcwMAorCisgICBpbmRpY2F0ZXMgYSBsb2NhbCB0aW1lIG9mIDEyOjU0OjI5IHRoYXQgaXMgMDcgaG91cnMgYW5kIDAwIG1pbnV0ZXMKKyAgIGJlaGluZCAobGVzcyB0aGFuLCBFYXN0IG9mKSBVbml2ZXJzYWwgVGltZS4gVGhlIHNwYWNlIGlzIG9wdGlvbmFsLCBzbworICAgdGhlIGV4YW1wbGUgY291bGQgYWxzbyBiZSB3cml0dGVuIGFzOgorCisgIEZyaSwgMTMgSnVsIDIwMDEgMTI6NTQ6MjktMDcwMAorCisgICBUaGUgZm9sbG93aW5nIHN5bWJvbGljIHRpbWUgem9uZXMgYXJlIGFsc28gYWNjZXB0ZWQsIGFzIHNwZWNpZmllZCBieQorICAgWzQ3MV1SRkMgMjgyMiBhbmQvb3IgaW4gSVNPIDg2MDE6CisKKyAgR01UICA9ICArMDAwMCAgICAgICBHcmVlbndpY2ggTWVhbiBUaW1lCisgIFogICAgPSAgKzAwMDAgICAgICAgWnVsdSAoWmVybyBNZXJpZGlhbikgVGltZQorICBVVEMgID0gICswMDAwICAgICAgIFVuaXZlcnNhbCBDb29yZGluYXRlZCBUaW1lCisgIFVUICAgPSAgKzAwMDAgICAgICAgVW5pdmVyc2FsIFRpbWUKKyAgRURUICA9ICAtMDQwMCAgICAgICBFYXN0ZXJuIChVU0EpIERheWxpZ2h0IFRpbWUKKyAgRVNUICA9ICAtMDUwMCAgICAgICBFYXN0ZXJuIChVU0EpIFN0YW5kYXJkIFRpbWUKKyAgQ0RUICA9ICAtMDUwMCAgICAgICBDZW50cmFsIChVU0EpIERheWxpZ2h0IFRpbWUKKyAgQ1NUICA9ICAtMDYwMCAgICAgICBDZW50cmFsIChVU0EpIFN0YW5kYXJkIFRpbWUKKyAgTURUICA9ICAtMDYwMCAgICAgICBNb3VudGFpbiAoVVNBKSBEYXlsaWdodCBUaW1lCisgIE1TVCAgPSAgLTA3MDAgICAgICAgTW91bnRhaW4gKFVTQSkgU3RhbmRhcmQgVGltZQorICBQRFQgID0gIC0wNzAwICAgICAgIFBhY2lmaWMgKFVTQSkgRGF5bGlnaHQgVGltZQorICBQU1QgID0gIC0wODAwICAgICAgIFBhY2lmaWMgKFVTQSkgU3RhbmRhcmQgVGltZQorCisgICBOb3RlIHRoYXQgR01ULCBaLCBVVEMsIGFuZCBVVCBhbGwgZXhwcmVzcyB0aGUgc2FtZSBjb25jZXB0OiBzdGFuZGFyZAorICAgKG5vdCBkYXlsaWdodCkgdGltZSBhdCB0aGUgWmVybyBNZXJpZGlhbi4gVVRDLCBieSB0aGUgd2F5LCBpcyBhbgorICAgaW50ZXJuYXRpb25hbCBzdGFuZGFyZCBzeW1ib2wgYW5kIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gdGhlIG9yZGVyIG9mCisgICB0aGUgRW5nbGlzaCB3b3JkcywgVW5pdmVyc2FsIENvb3JkaW5hdGVkIFRpbWUsIGJ1dCBpdCBoYXBwZW5zIHRvIGhhdmUKKyAgIHRoZSBzYW1lIGluaXRpYWwgbGV0dGVycyBhcyB0aGVzZSB3b3Jkcy4gT2YgY291cnNlIGh1bmRyZWRzIG9mIG90aGVyCisgICBzeW1ib2xpYyB0aW1lem9uZXMgYW5kIHZhcmlhdGlvbnMgZXhpc3QsIGJ1dCB0aGV5IGFyZSBub3QKKyAgIHN0YW5kYXJkaXplZCwgYW5kIGFyZSB0aGVyZWZvcmUgbm90IHN1cHBvcnRlZCBieSBLZXJtaXQuCisKKyAgIFdoZW4gYSB0aW1lIHpvbmUgaXMgaW5jbHVkZWQgd2l0aCBhIHRpbWUsIHRoZSB0aW1lIGlzIGNvbnZlcnRlZCB0bworICAgbG9jYWwgdGltZS4gSW4gY2FzZSB0aGUgY29udmVyc2lvbiBjcm9zc2VzIGEgbWlkbmlnaHQgYm91bmRhcnksIHRoZQorICAgZGF0ZSBpcyBhZGp1c3RlZCBhY2NvcmRpbmdseS4gRXhhbXBsZXMgY29udmVydGluZyB0byBFU1QgKEVhc3Rlcm4gVVNBCisgICBTdGFuZGFyZCBUaW1lID0gLTA1MDApOgorCisgMTE6MzA6MDAgICAgICA9ICAxMTozMDowMAorIDExOjMwOjAwIEVTVCAgPSAgMTE6MzA6MDAKKyAxMTozMDowMCBHTVQgID0gIDA2OjMwOjAwCisgMTE6MzA6MDAgUFNUICA9ICAxNDozMDowMAorIDExOjMwOjAwWiAgICAgPSAgMDY6MzA6MDAKKyAxMTozMFBNIEdNVCAgID0gIDE4OjMwOjAwCisgMTE6MzAgLTA1MDAgICA9ICAxMTozMDowMAorIDExOjMwIC0wODAwICAgPSAgMDg6MzA6MDAKKyAxMTozMCArMDIwMCAgID0gIDA0OjMwOjAwCisKKyAgIFVubGlrZSBtb3N0IG9mIEtlcm1pdCdzIG90aGVyIGRhdGUtdGltZSBjb252ZXJzaW9ucywgdGltZXpvbmUKKyAgIGtub3dsZWRnZSAoc3BlY2lmaWNhbGx5LCB0aGUgb2Zmc2V0IG9mIGxvY2FsIHRpbWUgZnJvbSBVVEMpIGlzCisgICBlbWJvZGllZCBpbiB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtLCBub3QgaW4gS2VybWl0IGl0c2VsZiwgYW5kCisgICBhbnkgY29udmVyc2lvbiBlcnJvcnMgaW4gdGhpcyBkZXBhcnRtZW50IGFyZSB0aGUgZmF1bHQgb2YgdGhlIE9TLiBGb3IKKyAgIGV4YW1wbGUsIG1vc3QgVU5JWCBwbGF0Zm9ybXMgZG8gbm90IHBlcmZvcm0gY29udmVyc2lvbnMgZm9yIHllYXJzCisgICBwcmlvciB0byAxOTcwLgorCisgICAgOC4xMy40LiBEZWx0YSBUaW1lCisKKyAgIERhdGUvdGltZSBleHByZXNzaW9ucyBjYW4gYmUgY29tcG9zZWQgb2YgYSBkYXRlIGFuZC9vciB0aW1lIGFuZCBhCisgICBkZWx0YSB0aW1lLCBvciBhIGRlbHRhIHRpbWUgYnkgaXRzZWxmLiBXaGVuIGEgZGVsdGEgdGltZSBpcyBnaXZlbiBieQorICAgaXRzZWxmLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBsb2NhbCBkYXRlIGFuZCB0aW1lLiBEZWx0YSB0aW1lcworICAgaGF2ZSB0aGUgZm9sbG93aW5nIGdlbmVyYWwgZm9ybWF0OgorCisgIHsrLC19W251bWJlciB1bml0c11baGhbOm1tWzpzc11dXQorCisgICBJbiBvdGhlciB3b3JkcywgYSBkZWx0YSB0aW1lIGFsd2F5cyBzdGFydHMgd2l0aCBhIHBsdXMgb3IgbWludXMgc2lnbiwKKyAgIHdoaWNoIGlzIGZvbGxvd2VkIGJ5IGEgInBhcnQxIiwgYSAicGFydDIiLCBvciBib3RoLiBUaGUgInBhcnQxIiwgaWYKKyAgIGdpdmVuLCBzcGVjaWZpZXMgYSBudW1iZXIgb2YgZGF5cywgd2Vla3MsIG1vbnRocywgb3IgeWVhcnM7ICJwYXJ0MiIKKyAgIHNwZWNpZmllcyBhIHRpbWUgaW4gaGg6bW06c3Mgbm90YXRpb24uIEluIGFyaXRobWV0aWMgdGVybXMsIHRoZXNlCisgICByZXByZXNlbnRzIHNvbWUgbnVtYmVyIG9mIGRheXMgb3Igb3RoZXIgYmlnIHRpbWUgdW5pdHMsIGFuZCB0aGVuIGEKKyAgIGZyYWN0aW9uIG9mIGEgZGF5IGV4cHJlc3NlZCBhcyBob3VycywgbWludXRlcywgYW5kIHNlY29uZHM7IHRoZXNlIGFyZQorICAgdG8gYmUgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZSBnaXZlbiAob3IgaW1wbGllZCkgZGF0ZSBhbmQKKyAgIHRpbWUuIFRoZSBzeW50YXggaXMgc29tZXdoYXQgZmxleGlibGUsIGFzIHNob3duIGJ5IHRoZSBmb2xsb3dpbmcKKyAgIGV4YW1wbGVzOgorCisgICsxIGRheSAgICAgICAgICAgICAgICAoUGx1cyBvbmUgZGF5KQorICArMWRheSAgICAgICAgICAgICAgICAgKERpdHRvKQorICArMWQgICAgICAgICAgICAgICAgICAgKERpdHRvKQorICArIDEgZGF5ICAgICAgICAgICAgICAgKERpdHRvKQorICArIDEgZGF5IDM6MDAgICAgICAgICAgKFBsdXMgb25lIGRheSBhbmQgMyBob3VycykKKyAgKzFkMzowMCAgICAgICAgICAgICAgIChEaXR0bykKKyAgKzFkMyAgICAgICAgICAgICAgICAgIChEaXR0bykKKyAgKzM6MDA6MDAgICAgICAgICAgICAgIChQbHVzIDMgaG91cnMpCisgICszOjAwICAgICAgICAgICAgICAgICAoRGl0dG8pCisgICszICAgICAgICAgICAgICAgICAgICAoRGl0dG8pCisgICsyIGRheXMgICAgICAgICAgICAgICAoUGx1cyAyIGRheXMpCisgIC0xMiBkYXlzIDc6MTQ6MjIgICAgICAoTWludXMgMTIgZGF5cywgNyBob3VycywgMTQgbWludXRlcywgYW5kIDIyIHNlY29uZHMpCisKKyAgIFRoZSB3b3JkcyAid2VlayIsICJtb250aCIsIGFuZCAieWVhciIgY2FuIGJlIHVzZWQgbGlrZSAiZGF5IiBpbiB0aGUKKyAgIGV4YW1wbGVzIGFib3ZlLiBBIHdlZWsgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvIDcgZGF5cy4gV2hlbiBtb250aHMKKyAgIGFyZSBzcGVjaWZpZWQsIHRoZSBudW1lcmljIG1vbnRoIG51bWJlciBvZiB0aGUgZGF0ZSBpcyBpbmNyZW1lbnRlZCBvcgorICAgZGVjcmVtZW50ZWQgYnkgdGhlIGdpdmVuIG51bWJlciwgYW5kIHRoZSB5ZWFyIGFuZCBkYXkgYWRqdXN0ZWQKKyAgIGFjY29yZGluZ2x5IGlmIG5lY2Vzc2FyeSAoZm9yIGV4YW1wbGUsIDMxLUphbi0yMDAxICsxbW9udGggPQorICAgMDMtTWFyLTIwMDEgYmVjYXVzZSBGZWJydWFyeSBkb2VzIG5vdCBoYXZlIDMxIGRheXMpLiBXaGVuIHllYXJzIGFyZQorICAgc3BlY2lmaWVkLCB0aGV5IGFyZSBhZGRlZCBvciBzdWJ0cmFjdGVkIHRvIHRoZSBiYXNlIHllYXIuIEV4YW1wbGVzCisgICAoYXNzdW1pbmcgdGhlIGN1cnJlbnQgZGF0ZSBpcyAxMC1BdWctMjAwMSBhbmQgdGhlIGN1cnJlbnQgdGltZSBpcworICAgMTk6MjE6MTEpOgorCisgIDE4LVNlcC0yMDAxICsxZGF5ICAgICAgICAgICAgICAoMjAwMTA5MTggMDA6MDA6MDApCisgIHRvZGF5ICsxZGF5ICAgICAgICAgICAgICAgICAgICAoMjAwMTA4MTEgMDA6MDA6MDApCisgIG5vdysxZCAgICAgICAgICAgICAgICAgICAgICAgICAoMjAwMTA4MTEgMTk6MjE6MTEpCisgICsgMSBkYXkgICAgICAgICAgICAgICAgICAgICAgICAoMjAwMTA4MTEgMTk6MjE6MTEpCisgICsgMSBkYXkgMzoxNDo0MiAgICAgICAgICAgICAgICAoMjAwMTA4MTEgMjI6MzU6NTQpCisgICsgNyB3ZWVrcyAgICAgICAgICAgICAgICAgICAgICAoMjAwMTA5MjggMTk6MjE6MTEpCisgICsxZDM6MTQ6NDIgICAgICAgICAgICAgICAgICAgICAoMjAwMTA4MTEgMjI6MzU6NTQpCisgICsxdzM6MTQ6NDIgICAgICAgICAgICAgICAgICAgICAoMjAwMTA4MTcgMjI6MzU6NTQpCisgICsxbTM6MTQ6NDIgICAgICAgICAgICAgICAgICAgICAoMjAwMTA5MTAgMjI6MzU6NTQpCisgICsxeTM6MTQ6NDIgICAgICAgICAgICAgICAgICAgICAoMjAwMjA4MTAgMjI6MzU6NTQpCisgIDIgZmViIDIwMDEgKyAxMCB5ZWFycyAgICAgICAgICAoMjAxMTAyMDggMDA6MDA6MDApCisgIDIwMDEtMDItMDggKzEweTEyICAgICAgICAgICAgICAoMjAxMTAyMDggMTI6MDA6MDApCisgIDMxLWRlYy0xOTk5IDIzOjU5OjU5KzAwOjAwOjAxICAoMjAwMDAxMDEgMDA6MDA6MDApCisgIDI4LWZlYi0xOTk2ICsxZGF5ICAgICAgICAgICAgICAoMTk5NjAyMjkgMDA6MDA6MDApIChsZWFwIHllYXIpCisgIDI4LWZlYi0xOTk3ICsxZGF5ICAgICAgICAgICAgICAoMTk5NzAzMDEgMDA6MDA6MDApIChub25sZWFwIHllYXIpCisgIDI4LWZlYi0xOTk3ICsxbW9udGggICAgICAgICAgICAoMTk5NzAzMjggMDA6MDA6MDApCisgIDI4LWZlYi0xOTk3ICsxbW9udGggMTE6NTk6NTkgICAoMTk5NzAzMjggMTE6NTk6NTkpCisgIDI4LWZlYi0xOTk3ICsyMHllYXJzICAgICAgICAgICAoMjAxNzAyMjggMDA6MDA6MDApCisgIDI4LWZlYi0xOTk3ICs4MDAweWVhcnMgICAgICAgICAoOTk5NzAyMjggMDA6MDA6MDApCisKKyAgIEZvciBjb21wYXRpYmlsaXR5IHdpdGggVk1TLCB0aGUgZm9sbG93aW5nIHNwZWNpYWwgZGVsdGEtdGltZSBmb3JtYXQgaXMKKyAgIGFsc28gYWNjZXB0ZWQ6CisKKyAgK251bWJlci1oaDptbTpzcworICAtbnVtYmVyLWhoOm1tOnNzCisKKyAgIChubyBzcGFjZXMpLiBUaGUgaHlwaGVuIGFmdGVyIHRoZSBudW1iZXIgaW5kaWNhdGVzIGRheXMuIEl0CisgICBjb3JyZXNwb25kcyBleGFjdGx5IHRvIHRoZSBLZXJtaXQgbm90YXRpb246CisKKyAgK251bWJlcmRoaDptbTpzcworICAtbnVtYmVyZGhoOm1tOnNzCisKKyAgIFRoZSBmb2xsb3dpbmcgZm9ybXMgYWxsIGluZGljYXRlIGV4YWN0bHkgdGhlIHNhbWUgZGF0ZSBhbmQgdGltZToKKworICAxOC1TZXAtMjAwMSAxMjozNDo1NiArMS0zOjIzOjAxCisgIDE4LVNlcC0yMDAxIDEyOjM0OjU2ICsxZDM6MjM6MDEKKyAgMTgtU2VwLTIwMDEgMTI6MzQ6NTYgKzEgZGF5IDM6MjM6MDEKKworICAgYW5kIG1lYW4gImFkZCBhIGRheSBwbHVzIDMgaG91cnMsIDIzIG1pbnV0ZXMsIGFuZCAxIHNlY29uZCIgdG8gdGhlCisgICBnaXZlbiBkYXRlLgorCisgICBOb3RlIHRoYXQgZGVsdGEgdGltZXMgYXJlIG5vdCBhdCBhbGwgdGhlIHNhbWUgYXMgVVRDIG9mZnNldHM7IHRoZQorICAgZm9ybWVyIHNwZWNpZmllcyBhbiBhZGp1c3RtZW50IHRvIHRoZSBnaXZlbiBkYXRlL3RpbWUgYW5kIHRoZSBsYXR0ZXIKKyAgIHNwZWNpZmllcyB0aGF0IHRoZSBsb2NhbCB0aW1lIGlzIGEgcGFydGljdWxhciBkaXN0YW5jZSBmcm9tIFVuaXZlcnNhbAorICAgVGltZSwgZm9yIGV4YW1wbGU6CisKKyAgMTEtQXVnLTIwMDEgMTI6MzQ6NTYgLTA4MDAgICAgICAgICAgKDIwMDEwODExIDE2OjM0OjU2IC0tIFVUQyBPZmZzZXQpCisgIDExLUF1Zy0yMDAxIDEyOjM0OjU2IC0wODowMCAgICAgICAgICgyMDAxMDgxMSAwNDozNDo1NiAtLSBEZWx0YSB0aW1lKQorCisgICBJZiB5b3UgZ2l2ZSBhIHRpbWUgZm9sbG93ZWQgYnkgYSBtb2RpZmVyIHRoYXQgc3RhcnRzIHdpdGggYSArIG9yIC0KKyAgIHNpZ24sIGhvdyBkb2VzIEtlcm1pdCBrbm93IHdoZXRoZXIgaXQncyBhIFVUQyBvZmZzZXQgb3IgYSBkZWx0YSB0aW1lPworICAgSXQgaXMgdHJlYXRlZCBhcyBhIFVUQyBvZmZzZXQgaWYgdGhlIHNpZ24gaXMgZm9sbG93ZWQgYnkgZXhhY3RseSBmb3VyCisgICBkZWNpbWFsIGRpZ2l0czsgb3RoZXJ3aXNlIGl0IGlzIGEgZGVsdGEgdGltZS4gRXhhbXBsZXMgKGZvciBVU0EKKyAgIEVhc3Rlcm4gRGF5bGlnaHQgVGltZSk6CisKKyAgMTEtQXVnLTIwMDEgMTI6MzQ6NTYgLTA4MDAgICAgICAgICAgKDIwMDEwODExIDE2OjM0OjU2IC0tIFVUQyBPZmZzZXQpCisgIDExLUF1Zy0yMDAxIDEyOjM0OjU2IC0wODowMCAgICAgICAgICgyMDAxMDgxMSAwNDozNDo1NiAtLSBEZWx0YSB0aW1lKQorICAxMS1BdWctMjAwMSAxMjozNDo1NiAtODAwICAgICAgICAgICAoMjAwMTA4MTEgMDQ6MzQ6NTYgLS0gRGVsdGEgdGltZSkKKyAgMTEtQXVnLTIwMDEgMTI6MzQ6NTYgLTggICAgICAgICAgICAgKDIwMDEwODExIDA0OjM0OjU2IC0tIERlbHRhIHRpbWUpCisKKyAgIFRoZSBmaXJzdCBleGFtcGxlIHNheXMgdGhhdCBhdCBzb21lIHVua25vd24gcGxhY2Ugd2hpY2ggaXMgOCBob3VycworICAgYWhlYWQgb2YgVW5pdmVyc2FsIFRpbWUsIHRoZSB0aW1lIGlzIDEyOjM0OjU2LCBhbmQgdGhpcyBjb3JyZXNwb25kcyB0bworICAgMTY6MzQ6NTYgaW4gRWFzdGVybiBEYXlsaWdodCB0aW1lLiBUaGUgc2Vjb25kIGV4YW1wbGUgc2F5cyB0byBzdWJ0cmFjdAorICAgOCBob3VycyBmcm9tIHRoZSBsb2NhbCB0aW1lLiBUaGUgdGhpcmQgYW5kIGZvdXJ0aCBhcmUgZGVsdGEgdGltZXMKKyAgIGJlY2F1c2UsIGV2ZW4gdGhvdWdoIGEgY29sb24gaXMgbm90IGluY2x1ZGVkLCB0aGUgdGltZSBkb2VzIG5vdAorICAgY29uc2lzdCBvZiBleGFjdGx5IDQgZGlnaXRzLgorCisgICBXaGVuIGEgZGVsdGEgdGltZSBpcyB3cml0dGVuIGFmdGVyIGEgdGltZXpvbmUsIGhvd2V2ZXIsIHRoZXJlIGlzIG5vCisgICBhbWJpZ3VpdHkgYW5kIG5vIHN5bnRheCBkaXN0aW5jdGlvbiBpcyByZXF1aXJlZDoKKworICAxMS1BdWctMjAwMSAxMjozNDo1NiAtMDgwMCAtMDgwMCAgICAoMjAwMTA4MTEgMDg6MzQ6NTYpCisgIDExLUF1Zy0yMDAxIDEyOjM0OjU2IC0wODAwIC0wODowMCAgIChEaXR0bykKKyAgMTEtQXVnLTIwMDEgMTI6MzQ6NTYgLTA4OjAwIC0wODowMCAgKElsbGVnYWwpCisKKyAgICA4LjEzLjUuIFRoZSBEQVRFIENvbW1hbmQKKworICAgT2J2aW91c2x5IGEgZ3JlYXQgbWFueSBjb21iaW5hdGlvbnMgb2YgZGF0ZSwgdGltZSwgdGltZSB6b25lLCBhbmQKKyAgIGRlbHRhIHRpbWUgYXJlIHBvc3NpYmxlLCBhcyB3ZWxsIGFzIG1hbnkgZm9ybWF0dGluZyBvcHRpb25zLiBUaGUKKyAgIHB1cnBvc2Ugb2YgYWxsIHRoaXMgZmxleGliaWxpdHkgaXMgdG8gY29tcGx5IHdpdGggYXMgbWFueSBzdGFuZGFyZHMgYXMKKyAgIHBvc3NpYmxlIC0tIEludGVybmV0IFJGQ3MsIElTTyBzdGFuZGFyZHMsIGFuZCBwcm92ZW4gY29ycG9yYXRlCisgICBzdGFuZGFyZHMgLS0gYXMgd2VsbCBhcyB3aXRoIG5vdGF0aW9ucyBjb21tb25seSB1c2VkIGJ5IHJlYWwgcGVvcGxlLAorICAgaW4gb3JkZXIgdGhhdCBkYXRlcyBhbmQgdGltZXMgZnJvbSB0aGUgd2lkZXN0IHZhcmlldHkgb2Ygc291cmNlcyBjYW4KKyAgIGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgYW5kIHVzZWQgaW4gYW55IGRhdGUtdGltZSBmaWVsZCBpbiBhbnkKKyAgIEtlcm1pdCBjb21tYW5kLgorCisgICBZb3UgY2FuIHRlc3QgYW55IGRhdGUtYW5kL29yLXRpbWUgZm9ybWF0IHdpdGggdGhlIERBVEUgY29tbWFuZCwgd2hpY2gKKyAgIGNvbnZlcnRzIGl0IHRvIHN0YW5kYXJkIHl5eXltbWRkIGhoOm1tOnNzIGZvcm1hdCBpZiBpdCBpcyB1bmRlcnN0b29kLAorICAgb3IgZWxzZSBnaXZlcyBhbiBleHBsaWNpdCBlcnJvciBtZXNzYWdlIChyYXRoZXIgdGhhbiBqdXN0ICJCQUQgREFURSIKKyAgIGFzIGluIHByZXZpb3VzIEMtS2VybWl0IHJlbGVhc2VzKSB0byBpbmRpY2F0ZSB3aGF0IGlzIHdyb25nIHdpdGggaXQuCisgICBFeGFtcGxlcyAob24gVHVlc2RheSwgMzEgSnVseSAyMDAxIGluIE5ldyBZb3JrIENpdHksIEVhc3Rlcm4gRGF5bGlnaHQKKyAgIFRpbWUsIFVUQyAtMDQwMCk6CisKKyAgREFURSBjb21tYW5kIGFyZ3VtZW50ICAgICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgICAgICAgCisgIDEyOjMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDczMSAxMjozMDowMAorICAxMjozMDowMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA3MzEgMTI6MzA6MDEKKyAgMTI6MzA6MDEuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMxIDEyOjMwOjAyCisgIDEyMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDczMSAxMjozMDowMAorICAyMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA3MzEgMDI6MzA6MDAKKyAgMjMwKzFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAxIDAyOjMwOjAwCisgIDIzMCsxZDM6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDgwMSAwNTozMDowMAorICAyMDAxMDcxOCAxOToyMToxNSAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA3MTggMTk6MjE6MTUKKyAgMjAwMTA3MThfMTkyMTE1ICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE5OjIxOjE1CisgIDIwMDEwNzE4VDE5MjExNSAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDcxOCAxOToyMToxNQorICAxOCBKdWwgMjAwMSArMDQwMCAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA3MTcgMjM6NTk6NTkKKyAgMTggSnVsIDIwMDEgMTkyMTE1ICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE5OjIxOjE1CisgIDE4IEp1bCAyMDAxIDE5MjExNS44ICAgICAgICAgICAgICAgICAgICAyMDAxMDcxOCAxOToyMToxNgorICAxOC1KdWwtMjAwMVQxOTIxICAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA3MTggMTk6MjE6MDAKKyAgMTgtSnVsLTIwMDEgMTkyMVogICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE1OjIxOjAwCisgIDE4LUp1bC0yMDAxIDE5MjEgR01UICAgICAgICAgICAgICAgICAgICAyMDAxMDcxOCAxNToyMTowMAorICAxOC1KdWwtMjAwMSAxOTIxIFVUQyAgICAgICAgICAgICAgICAgICAgMjAwMTA3MTggMTU6MjE6MDAKKyAgMTgtSnVsLTIwMDEgMTkyMSBaICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzE4IDE1OjIxOjAwCisgIDE4LUp1bC0yMDAxIDE5MjFaICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDcxOCAxNToyMTowMAorICAxOC1KdWwtMjAwMSAxOTIxIC0wNDowMDowMCAgICAgICAgICAgICAgMjAwMTA3MTggMTk6MjE6MDAKKyAgMjEtSnVsLTIwMDFfMDg6MjA6MDBhbSAgICAgICAgICAgICAgICAgIDIwMDEwNzIxIDA4OjIwOjAwCisgIDIxLUp1bC0yMDAxXzg6MjA6MDBQLk0uICAgICAgICAgICAgICAgICAyMDAxMDcyMSAyMDoyMDowMAorICBGcmkgSnVsIDIwIDExOjI2OjI1IDIwMDEgICAgICAgICAgICAgICAgMjAwMTA3MjAgMTE6MjY6MjUKKyAgRnJpIEp1bCAyMCAxMToyNjoyNSBHTVQgMjAwMSAgICAgICAgICAgIDIwMDEwNzIwIDA3OjI2OjI1CisgIFN1biwgOSBBcHIgMjAwMCAwNjo0Njo0NiArMDEwMCAgICAgICAgICAyMDAwMDQwOSAwMTo0Njo0NgorICBTdW5kYXksIDkgQXByIDIwMDAgMDY6NDY6NDYgKzAxMDAgICAgICAgMjAwMDA0MDkgMDE6NDY6NDYKKyAgbm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMxIDE5OjQxOjEyCisgIHRvZGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDczMSAwMDowMDowMAorICB0b2RheSAwOTowMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA3MzEgMDk6MDA6MDAKKyAgdG9tb3Jyb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAxIDAwOjAwOjAwCisgIHRvbW9ycm93IDA5OjAwICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDgwMSAwOTowMDowMAorICB0b21vcnJvdyAwOTowMCBHTVQgICAgICAgICAgICAgICAgICAgICAgMjAwMTA4MDEgMDU6MDA6MDAKKyAgeWVzdGVyZGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMwIDAwOjAwOjAwCisgIHllc3RlcmRheSAwOTowMCAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDczMCAwOTowMDowMAorICArIDMgZGF5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA4MDMgMDA6MDA6MDAKKyAgKzMgZGF5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAzIDAwOjAwOjAwCisgICszZGF5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDgwMyAwMDowMDowMAorICArIDNkYXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA4MDMgMDA6MDA6MDAKKyAgKyAzIGRheXMgMDk6MDAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAzIDA5OjAwOjAwCisgICsgMiB3ZWVrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDgxNCAwMDowMDowMAorICArIDEgbW9udGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA4MzEgMDA6MDA6MDAKKyAgLSA3IG1vbnRocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDAxMjMxIDAwOjAwOjAwCisgICsgMTAgeWVhcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDExMDczMSAwMDowMDowMAorICBmcmlkYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA4MDMgMDA6MDA6MDAKKyAgc2F0dXJkYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODA0IDAwOjAwOjAwCisgIHN1bmRheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDgwNSAwMDowMDowMAorICBtb25kYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA4MDYgMDA6MDA6MDAKKyAgdHVlc2RheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwNzMxIDAwOjAwOjAwCisgIHdlZG5lc2RheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDgwMSAwMDowMDowMAorICB0aHVyc2RheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA4MDIgMDA6MDA6MDAKKyAgZnJpZGF5IDA3OjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODAzIDA3OjAwOjAwCisgIHRodXJzZGF5IDE6MDBwbSAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDgwMiAxMzowMDowMAorICB0aHVyc2RheSAxOjAwcG0gR01UICAgICAgICAgICAgICAgICAgICAgMjAwMTA4MDIgMDk6MDA6MDAKKyAgVGh1LCAxMCBOb3YgOTQgMTA6NTA6NDcgRVNUICAgICAgICAgICAgIDE5OTQxMTEwIDEwOjUwOjQ3CisgIEZyaSwgMjAgT2N0IDE5OTUgMTg6MzU6MTUgLTA0MDAgKEVEVCkgICAxOTk1MTAyMCAxODozNToxNQorICAzMS8xMi8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMTEyMzEgMDA6MDA6MDAKKyAgMTIvMzEvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDExMjMxIDAwOjAwOjAwCisgIDIwMDEtSnVseS0yMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAxMDcyMCAwMDowMDowMAorICAyMDAxLVNlcHRlbWJlci0zMCAgICAgICAgICAgICAgICAgICAgICAgMjAwMTA5MzAgMDA6MDA6MDAKKyAgMzAtU2VwdGVtYmVyLTIwMDEgICAgICAgICAgICAgICAgICAgICAgIDIwMDEwOTMwIDAwOjAwOjAwCisgIFNlcCAzMCwgMjAwMSAxMjozNDo1NiAgICAgICAgICAgICAgICAgICAyMDAxMDkzMCAxMjozNDo1NgorICBTZXB0ZW1iZXIgMzAsIDIwMDEgICAgICAgICAgICAgICAgICAgICAgMjAwMTA5MzAgMDA6MDA6MDAKKyAgU2VwdGVtYmVyIDMwLCAyMDAxIDYzMCAgICAgICAgICAgICAgICAgIDIwMDEwOTMwIDA2OjMwOjAwCisgIFNlcHRlbWJlciAzMCAyMDAxIDYzMCAgICAgICAgICAgICAgICAgICAyMDAxMDkzMCAwNjozMDowMAorICBTZXAtMzAtMjAwMSAxMjozNDo1OSAgICAgICAgICAgICAgICAgICAgMjAwMTA5MzAgMTI6MzQ6NTkKKyAgMjAwMTA4MDcxMTM1NDIuMDE0ICAgICAgICAgICAgICAgICAgICAgIDIwMDEwODA3IDExOjM1LjQyCisgIDIwMDEwODA3MTEzNTQyLjAxNFogICAgICAgICAgICAgICAgICAgICAyMDAxMDgwNyAwNzozNTo0MgorCisgICAgOC4xMy42LiBOZXcgRGF0ZS1UaW1lIEZ1bmN0aW9ucworCisgICBJbiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9ucywgZGF0ZS10aW1lIGZ1bmN0aW9uIGFyZ3VtZW50cyBhcmUgdGhlCisgICBzYW1lIGZyZWUtZm9ybWF0IGRhdGUtdGltZSBzdHJpbmdzIGRpc2N1c3NlZCBhYm92ZSwgd2l0aCB0aGUgc2FtZQorICAgZGVmYXVsdHMgZm9yIG1pc3NpbmcgZmllbGRzLiBUaGV5IGFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0bworICAgc3RhbmRhcmQgZm9ybWF0IGludGVybmFsbHkgcHJpb3IgdG8gcHJvY2Vzc2luZy4KKworICAgXGZjdnRkYXRlKGQxKQorICAgICAgICAgIENvbnZlcnRzIHRoZSBkYXRlLXRpbWUgZDEgdG8gc3RhbmRhcmQgZm9ybWF0IGFuZCBsb2NhbCB0aW1lLgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG5ldywgYnV0IG5vdyBpdCBhY2NlcHRzIGEgd2lkZXIgcmFuZ2Ugb2YKKyAgICAgICAgICBhcmd1bWVudCBmb3JtYXRzIHRoYXQgY2FuIGluY2x1ZGUgdGltZXpvbmVzIGFuZC9vciBkZWx0YSB0aW1lcy4KKyAgICAgICAgICBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgb21pdHRlZCwgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBhcmUKKyAgICAgICAgICBhc3N1bWVkLiBUaGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IGlzIGEgZm9ybWF0IGNvZGUgZm9yIHRoZQorICAgICAgICAgIHJlc3VsdDoKKworICAgICBuMSA9IDE6IHl5eXktbW1tLWRkIGhoOm1tOnNzIChtbW0gPSBFbmdsaXNoIDMtbGV0dGVyIG1vbnRoCisgICAgIGFiYnJldmlhdGlvbikKKyAgICAgbjEgPSAyOiBkZC1tbW0teXl5eSBoaDptbTpzcyAoZGl0dG8pCisgICAgIG4xID0gMzogeXl5eW1tZGRoaG1tc3MgKGFsbCBudW1lcmljKQorCisgICBcZnV0Y2RhdGUoZDEpCisgICAgICAgICAgQ29udmVydHMgdGhlIGRhdGUtdGltZSBkMSB0byBVbml2ZXJzYWwgQ29vcmRpbmF0ZWQgVGltZSAoVVRDKSwKKyAgICAgICAgICBhbHNvIGtub3duIGFzIEdNVCBvciBadWx1IG9yIFplcm8tTWVyaWRpYW4gdGltZS4gVGhlIGRlZmF1bHQgZDEKKyAgICAgICAgICBpcyBOT1cuIElmIGQxIGlzIGEgdmFsaWQgZGF0ZS10aW1lLCB0aGUgVVRDIHJlc3VsdCBpcyByZXR1cm5lZAorICAgICAgICAgIGluIHN0YW5kYXJkIGZvcm1hdCwgeXl5eW1tZGQgaGg6c3M6bW0uCisKKyAgIFxmY21wZGF0ZXMoZDEsZDIpCisgICAgICAgICAgQ29tcGFyZXMgdHdvIGZyZWUtZm9ybWF0IGRhdGUtdGltZXMsIGQxIGFuZCBkMiwgYW5kLCBpZiBib3RoCisgICAgICAgICAgYXJndW1lbnRzIGFyZSB2YWxpZCwgcmV0dXJucyBhIG51bWJlcjogLTEgaWYgZDEgaXMgZWFybGllciB0aGFuCisgICAgICAgICAgKGJlZm9yZSkgZDI7IDAgaWYgZDEgaXMgdGhlIHNhbWUgYXMgZDI7IDEgaWYgZDEgaXMgbGF0ZXIgdGhhbgorICAgICAgICAgIChhZnRlcikgZDIuCisKKyAgIFxmZGlmZmRhdGVzKGQxLGQyKQorICAgICAgICAgIENvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGZyZWUtZm9ybWF0IGRhdGUtdGltZXMsIGQxCisgICAgICAgICAgYW5kIGQyLiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgdmFsaWQsIHJldHVybnMgYSBkZWx0YSB0aW1lIHdoaWNoCisgICAgICAgICAgaXMgbmVnYXRpdmUgaWYgZDEgaXMgZWFybGllciB0aGFuIChiZWZvcmUpIGQyIGFuZCBwb3NpdGl2ZQorICAgICAgICAgIG90aGVyd2lzZS4gSWYgZDEgYW5kIGQyIGFyZSBlcXVhbCwgdGhlIHJlc3VsdCBpcyAiKzA6MDAiLgorICAgICAgICAgIE90aGVyd2lzZSwgdGhlIHJlc3VsdCBjb25zaXN0cyBvZiB0aGUgbnVtYmVyIG9mIGRheXMsIGhvdXJzLAorICAgICAgICAgIG1pbnV0ZXMsIGFuZCBzZWNvbmRzIHRoYXQgc2VwYXJhdGUgdGhlIHR3byBkYXRlLXRpbWVzLiBJZiB0aGUKKyAgICAgICAgICBudW1iZXIgb2YgZGF5cyBpcyB6ZXJvLCBpdCBpcyBvbWl0dGVkLiBJZiB0aGUgbnVtYmVyIG9mIGRheXMgaXMKKyAgICAgICAgICBub256ZXJvIGJ1dCB0aGUgaG91cnMsIG1pbnV0ZXMsIGFuZCBzZWNvbmRzIGFyZSBhbGwgemVybywgdGhlCisgICAgICAgICAgdGltZSBpcyBvbWl0dGVkLiBpZiB0aGUgc2Vjb25kcyBhcmUgemVybywgdGhleSBhcmUgb21pdHRlZC4KKworICAgXGZkZWx0YTJzZWNzKGR0KQorICAgICAgICAgIENvbnZlcnRzIGEgZGVsdGEgdGltZSB0byBzZWNvbmRzLiBGb3IgZXhhbXBsZSwgIisxZDAwOjAwOjAxIiB0bworICAgICAgICAgIDg2NDAxLiBWYWxpZCBkZWx0YSB0aW1lcyBtdXN0IHN0YXJ0IHdpdGggYSArIG9yIC0gc2lnbi4gRGF5cworICAgICAgICAgIGFyZSBhY2NlcHRlZCBhcyB0aW1lIHVuaXRzLCBidXQgbm90IHllYXJzLCBtb250aHMsIG9yIHdlZWtzLiBJZgorICAgICAgICAgIHRoZSByZXN1bHQgd291bGQgb3ZlcmZsb3cgYSBjb21wdXRlciBsb25nIHdvcmQgKGFzIHdvdWxkIGhhcHBlbgorICAgICAgICAgIHdpdGggMzItYml0IGxvbmcgd29yZHMgd2hlbiB0aGUgbnVtYmVyIG9mIGRheXMgaXMgZ3JlYXRlciB0aGFuCisgICAgICAgICAgMjQ4NTQpLCB0aGUgZnVuY3Rpb24gZmFpbHMuCisKKyAgIEhJTlQ6IEFsdGhvdWdoIEtlcm1pdCBoYXMgYSBudW1iZXIgb2YgYnVpbHQtaW4gZGF0ZSBhbmQgdGltZQorICAgdmFyaWFibGVzLCBpdCBkb2Vzbid0IGhhdmUgYSBzaW5nbGUgb25lIHN1aXRhYmxlIGZvciB3cml0aW5nIGEKKyAgIHRpbWVzdGFtcC4gRm9yIHRoaXMgeW91IHdvdWxkIG5vcm1hbGx5IHVzZSBzb21ldGhpbmcgbGlrZSAiXHYobmRhdGUpCisgICBcdih0aW1lKSIuIEJ1dCBcZmN2dGRhdGUoKSAod2l0aCBubyBhcmd1bWVudHMpIGlzIGVxdWl2YWxlbnQ6IGl0CisgICByZXR1cm5zIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgaW4geXl5eW1tZGQgaGg6bW06c3MgZm9ybWF0LAorICAgc3VpdGFibGUgZm9yIHRpbWUgc3RhbXBpbmcuCisKKyAgICA4LjEzLjcuIERhdGUtVGltZSBQcm9ncmFtbWluZyBFeGFtcGxlcworCisgICBIZXJlJ3MgYSBtYWNybyB0aGF0IGNvbnZlcnRzIGFueSBkYXRlLXRpbWUgdG8gVVRDLCB3aGljaCB5b3UgbWlnaHQgdXNlCisgICBpZiBDLUtlcm1pdCBkaWRuJ3QgYWxyZWFkeSBoYXZlIGEgXGZ1dGNkYXRlKCkgZnVuY3Rpb246CisKKyAgZGVmaW5lIHV0Y2RhdGUgeworICAgICAgLmxvY2FsIDo9IFxmY3Z0ZGF0ZShcJSopICAgICAgICAgICAgICAgICA7IDEuCisgICAgICAudG1wIDo9IFxmY3Z0ZGF0ZShcbShsb2NhbClVVEMpICAgICAgICAgIDsgMi4KKyAgICAgIC5vZmZzZXQgOj0gXGZkaWZmZGF0ZShcbShsb2NhbCksXG0odG1wKSkgOyAzLgorICAgICAgLnV0YyA6PSBcZmN2dGRhdGUoXG0obG9jYWwpXG0ob2Zmc2V0KSkgICA7IDQuCisgICAgICBzaG8gbWFjIHV0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgNS4KKyAgfQorCisgICBCcmllZiBleHBsYW5hdGlvbjogTGluZSAxIGNvbnZlcnRzIHRoZSBtYWNybyBhcmd1bWVudCwgYSBmcmVlLWZvcm1hdAorICAgZGF0ZS10aW1lLCB0byBzdGFuZGFyZC1mb3JtYXQgbG9jYWwgdGltZS4gTGluZSAyIGFwcGVuZHMgdGhlICJVVEMiCisgICB0aW1lem9uZSB0byB0aGUgbG9jYWwgdGltZSBhbmQgY29udmVydHMgdGhlIHJlc3VsdCB0byBsb2NhbCB0aW1lLiBJbgorICAgb3RoZXIgd29yZHMsIHdlIHRha2UgdGhlIHNhbWUgdGltZSBhcyB0aGUgbG9jYWwgdGltZSwgYnV0IHByZXRlbmQgaXQncworICAgVVRDIHRpbWUsIGFuZCBjb252ZXJ0IGl0IHRvIGxvY2FsIHRpbWUuIEZvciBleGFtcGxlLCBpZiBOZXcgWW9yayB0aW1lCisgICBpcyA0IGhvdXJzIGFoZWFkIG9mIFVUQywgdGhlbiA2OjAwcG0gTmV3IFlvcmsgdGltZSBpcyAyOjAwcG0gVVRDLiBMaW5lCisgICAzIGdldHMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHR3byByZXN1bHRzIChlLmcuICIrMDQ6MDAiKS4gTGluZSA0CisgICBhcHBlbmRzIHRoZSBkaWZmZXJlbmNlIChkZWx0YSB0aW1lKSB0byB0aGUgbG9jYWwgdGltZSwgYW5kIGNvbnZlcnRzIGl0CisgICBhZ2Fpbiwgd2hpY2ggYWRkcyAob3Igc3VidHJhY3RzKSB0aGUgVVRDIG9mZnNldCB0byB0aGUgZ2l2ZW4gdGltZS4KKyAgIExpbmUgNSBkaXNwbGF5cyB0aGUgcmVzdWx0LgorCisgICBIZXJlJ3MgYSBzY3JpcHQgdGhhdCBvcGVucyBhIHdlYiBwYWdlLCBnZXRzIGl0cyBoZWFkZXJzIGludG8gYW4gYXJyYXksCisgICBzY2FucyB0aGUgYXJyYXkgZm9yIHRoZSAiTGFzdC1Nb2RpZmllZDoiIGhlYWRlciwgYW5kIGludGVwcmV0cyBpdDoKKyAgaHR0cCBvcGVuIHd3dy5jb2x1bWJpYS5lZHUKKyAgaWYgZmFpbCBzdG9wIDEgSFRUUCBPUEVOIGZhaWxlZAorICBodHRwIC9hcnJheTphIGhlYWQgaW5kZXguaHRtbCAvZGV2L251bGwKKyAgaWYgZmFpbCBzdG9wIDEgSFRUUCBHRVQgZmFpbGVkCisgIHNob3cgYXJyYXkgYQorICBmb3IgXCVpIDEgXGZkaW0oJmEpIDEgeworICAgICAgLlwleCA6PSBcZmluZGV4KDosXCZhW1wlaV0pCisgICAgICBpZiBub3QgXCV4IGNvbnRpbnVlCisgICAgICAudGFnIDo9IFxmbGVmdChcJmFbXCVpXSxcJXgtMSkKKyAgICAgIC52YWwgOj0gXGZsdHJpbShcZnN1YnN0cihcJmFbXCVpXSxcJXgrMSkpCisgICAgICBpZiAoIGVxICJcbSh0YWcpIiAiTGFzdC1Nb2RpZmllZCIgKSB7CisgICAgICAgICAgZWNobyBIVFRQIERhdGU6IFxtKHZhbCkKKyAgICAgICAgICAucmRhdGUgOj0gXGZjdnRkYXRlKFxtKHZhbCkpCisgICAgICAgICAgZWNobyB7U3RhbmRhcmQgRGF0ZSAobG9jYWwpOiBcbShyZGF0ZSl9CisgICAgICAgICAgZWNobyB7U3RhbmRhcmQgRGF0ZSAoVVRDKTogICBcZnV0Y2RhdGUoXG0ocmRhdGUpKX0KKyAgICAgICAgICBicmVhaworICAgICAgfQorICB9CisgIGh0dHAgY2xvc2UKKworICAgVGhlIHJlc3VsdDoKKworICBIVFRQIERhdGU6IE1vbiwgMTMgQXVnIDIwMDEgMjA6MDU6NDIgR01UCisgIFN0YW5kYXJkIERhdGUgKGxvY2FsKTogMjAwMTA4MTMgMTY6MDU6NDIKKyAgU3RhbmRhcmQgRGF0ZSAoVVRDKTogICAyMDAxMDgxMyAyMDowNTo0MgorCisgICBBcyB5b3UgY2FuIHNlZSwgS2VybWl0IGhhZCBubyB0cm91YmxlIGRlY29kaW5nIHRoZSBkYXRlLXRpbWUtc3RyaW5nCisgICBmcm9tIHRoZSB3ZWJzaXRlLCBjb252ZXJ0aW5nIHRvIGxvY2FsIHRpbWUsIGFuZCBjb252ZXJ0aW5nIGJhY2sgdG8gVVRDCisgICB3aXRoIG5vIGNvbmZsaWN0cyBvciBsb3NzIG9mIGluZm9ybWF0aW9uLiBJZiBpdCBoYWQgYmVlbiBpbiBhbnkgb3RoZXIKKyAgIGtub3duIGZvcm1hdCwgdGhlIHJlc3VsdCB3b3VsZCBoYXZlIGJlZW4gdGhlIHNhbWUuCisKKyAgIE5vdyBzdXBwb3NlIHdlIHdhbnQgdG8gZG93bmxvYWQgdGhlIHdlYiBwYWdlIG9ubHkgaWYgaXQgaXMgbmV3ZXIgdGhhbgorICAgb3VyIGxvY2FsIGNvcHkuIFRoZSBcZmRhdGUoZmlsZW5hbWUpIGZ1bmN0aW9uICh3aGljaCByZXR1cm5zIHRoZQorICAgbW9kaWZpY2F0aW9uIGRhdGUtdGltZSBvZiB0aGUgZ2l2ZW4gZmlsZSkgYW5kIHRoZSBuZXcgXGZjbXBkYXRlcygpCisgICBmdW5jdGlvbiBtYWtlIGl0IGVhc3kuIEluc2VydCB0aGUgZm9sbG93aW5nIGp1c3QgYmVmb3JlIHRoZSBCUkVBSworICAgc3RhdGVtZW50OgorCisgIGlmICggPCAwIFxmY21wZGF0ZXMoXG0ocmRhdGUpLFxmZGF0ZShpbmRleC5odG1sKSkgKSB7CisgICAgIGVjaG8gR0VUVElORyBpbmRleC5odG1sLi4uCisgICAgIGh0dHAgZ2V0IGluZGV4Lmh0bWwgaW5kZXguaHRtbAorICAgICBpZiBzdWNjZXNzIGVjaG8gSFRUUCBHRVQgT0sKKyAgfSBlbHNlIHsKKyAgICAgZWNobyBpbmRleC5odG1sOiBubyB1cGRhdGUgbmVlZGVkCisgIH0KKyAgaHR0cCBjbG9zZQorICBleGl0CisKKyAgIFRoaXMgc2F5cywgImlmIDAgaXMgbGVzcyB0aGFuIHRoZSBjb21wYXJpc29uIG9mIHRoZSByZW1vdGUgZmlsZSBkYXRlCisgICBhbmQgdGhlIGxvY2FsIGZpbGUgZGF0ZSwgZ2V0IHRoZSByZW1vdGUgZmlsZSwgb3RoZXJ3aXNlIHNraXAgaXQuIiBBbmQKKyAgIGl0IGF1dG9tYXRpY2FsbHkgcmVjb25jaWxlcyB0aGUgdGltZS16b25lIGRpZmZlcmVuY2UgKGlmIGFueSkuCisKKyAgIEl0IHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZSB0byBleHRlbmQgdGhpcyBzY3JpcHQgaW50byBhCisgICBnZW5lcmFsLXB1cnBvc2Ugd2Vic2l0ZSB1cGRhdGVyLCBidXQgdW5mb3J0dW5hdGVseSBIVFRQIHByb3RvY29sCisgICBkb2Vzbid0IHByb3ZpZGUgYW55IG1lY2hhbmlzbSBmb3IgdGhlIGNsaWVudCB0byBhc2sgdGhlIHNlcnZlciBmb3IgYQorICAgbGlzdCBvZiBmaWxlcywgcmVjdXJzaXZlIG9yIG90aGVyd2lzZS4KKworICAgWyBbNDcyXVRvcCBdIFsgWzQ3M11Db250ZW50cyBdIFsgWzQ3NF1DLUtlcm1pdCBIb21lIF0gWyBbNDc1XUtlcm1pdAorICAgSG9tZSBdCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOC4xNC4gVHJhcHBpbmcgS2V5Ym9hcmQgSW50ZXJydXB0aW9uCisKKyAgIE5vcm1hbGx5IHdoZW4geW91IHR5cGUgQ3RybC1DIGFuZCBLZXJtaXQgaXMgaW4gY29tbWFuZCBtb2RlIChhcworICAgb3Bwb3NlZCB0byBDT05ORUNUIG1vZGUpIHdpdGggQ09NTUFORCBJTlRFUlJVUFRJT04gT04gKGFzIGl0IGlzIHVubGVzcworICAgeW91IGhhdmUgc2V0IGl0IE9GRiksIEtlcm1pdCBpbnRlcnJ1cHRzIGFueSBjb21tYW5kIHRoYXQgaXMgY3VycmVudGx5CisgICBpbiBwcm9ncmVzcywgYW5kIGlmIGEgY29tbWFuZCBmaWxlIG9yIG1hY3JvIGlzIGV4ZWN1dGluZywgcm9sbHMgdGhlCisgICBjb21tYW5kIHN0YWNrIGJhY2sgdG8gdG9wIGxldmVsLCBjbG9zaW5nIGFsbCBvcGVuIGNvbW1hbmQgZmlsZXMsCisgICBkZWFjdGl2YXRpbmcgYWxsIG1hY3JvcywgZGVhbGxvY2F0aW5nIGFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIGFycmF5cywKKyAgIGFuZCBsZWF2aW5nIHlvdSBhdCB0aGUgY29tbWFuZCBwcm9tcHQuCisKKyAgIFN1cHBvc2UsIGhvd2V2ZXIsIHlvdSB3YW50IGNlcnRhaW4gYWN0aW9ucyB0byBvY2N1ciB3aGVuIGEgc2NyaXB0IGlzCisgICBpbnRlcnJ1cHRlZDsgZm9yIGV4YW1wbGUsIGNsb3Npbmcgb3BlbiBmaWxlcywgd3JpdGluZyBsb2cgZW50cmllcywgb3IKKyAgIGRpc3BsYXlpbmcgc3VtbWFyeSByZXN1bHRzLiBZb3UgY2FuIGRvIHRoaXMgYnkgZGVmaW5pbmcgYSBtYWNybyBuYW1lZAorICAgT05fQ1RSTEMuIFdoZW4gQ3RybC1DIGlzIGRldGVjdGVkLCBhbmQgYSBtYWNybyB3aXRoIHRoaXMgbmFtZSBpcworICAgZGVmaW5lZCwgS2VybWl0IGV4ZWN1dGVzIGl0IGZyb20gdGhlIGN1cnJlbnQgY29tbWFuZCBsZXZlbCwgdGh1cworICAgZ2l2aW5nIGl0IGZ1bGwgYWNjZXNzIHRvIHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgaW50ZXJydXB0aW9uCisgICBvY2N1cnJlZCwgaW5jbHVkaW5nIGxvY2FsIHZhcmlhYmxlcyBhbmQgb3BlbiBmaWxlcy4gT25seSB3aGVuIHRoZQorICAgT05fQ1RSTEMgbWFjcm8gY29tcGxldGVzIGV4ZWN1dGlvbiBpcyB0aGUgY29tbWFuZCBzdGFjayByb2xsZWQgYmFjayB0bworICAgdG9wIGxldmVsLgorCisgICBPbmNlIHRoZSBPTl9DVFJMQyBtYWNybyBpcyBkZWZpbmVkLCBpdCBjYW4gYmUgZXhlY3V0ZWQgb25seSBvbmNlLiBUaGlzCisgICBpcyB0byBwcmV2ZW50IHJlY3Vyc2lvbiBpZiB0aGUgdXNlciB0eXBlcyBDdHJsLUMgd2hpbGUgdGhlIE9OX0NUUkxDCisgICBtYWNybyBpcyBleGVjdXRpbmcuIElmIHlvdSB0eXBlIEN0cmwtQyB3aGlsZSB0aGUgQ3RybC1DIG1hY3JvIGlzCisgICBhY3RpdmUsIHRoaXMgZG9lcyBub3Qgc3RhcnQgYSBuZXcgY29weSBvZiBPTl9DVFJMQzsgcmF0aGVyLCBpdCByZXR1cm5zCisgICB0byB0aGUgdG9wLWxldmVsIGNvbW1hbmQgcHJvbXB0LiBBZnRlciB0aGUgT05fQ1RSTEMgbWFjcm8gcmV0dXJucywgaXQKKyAgIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbWFjcm8gdGFibGUgc28gaWYgeW91IHdhbnQgdG8gdXNlIGl0IGFnYWluCisgICBvciBpbnN0YWxsIGEgZGlmZmVyZW50IEN0cmwtQyB0cmFwLCB5b3UgbXVzdCBleGVjdXRlIGEgbmV3IERFRklORQorICAgT05fQ1RSTEMgY29tbWFuZC4gSW4gYW55IGNhc2UsIGFzIGFsd2F5cyB3aGVuIHlvdSBpbnRlcnJ1cHQgYSBzY3JpcHQKKyAgIHdpdGggQ3RybC1DLCBpdHMgY29tcGxldGlvbiBzdGF0dXMgaXMgRkFJTFVSRS4KKworICAgTm9ybWFsbHkgdGhlIE9OX0NUUkxDIG1hY3JvIHdvdWxkIGJlIGRlZmluZWQgaW4gdGhlIGNvbW1hbmQgZmlsZSBvcgorICAgbWFjcm8gdG8gd2hpY2ggaXQgYXBwbGllcywgYW5kIHNob3VsZCBiZSBkZWNsYXJlZCBMT0NBTC4gVGhpcyB3YXksIGlmCisgICB0aGUgY29tbWFuZCBmaWxlIG9yIG1hY3JvIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgd2l0aG91dCBiZWluZworICAgaW50ZXJydXB0ZWQsIHRoZSBPTl9DVFJMQyBkZWZpbml0aW9uIGRpc2FwcGVhcnMgYXV0b21hdGljYWxseS4KKyAgIE90aGVyd2lzZSB0aGUgZGVmaW5pdGlvbiB3b3VsZCBzdGlsbCBiZSB2YWxpZCBhbmQgdGhlIG1hY3JvIHdvdWxkIGJlCisgICBleGVjdXRlZCwgcHJvYmFibHkgb3V0IG9mIGNvbnRleHQsIHRoZSBuZXh0IHRpbWUgeW91IHR5cGVkIEN0cmwtQy4KKworICAgSGVyZSdzIGEgc2ltcGxlIGV4YW1wbGUgb2YgYSBjb21tYW5kIGZpbGUgdGhhdCBzZXRzIGEgQ3RybC1DIHRyYXAgZm9yCisgICBpdHNlbGY6CisKKyAgbG9jYWwgb25fY3RybGMgICAgICAgICAgICAgIDsgTWFrZSBDdHJsLUMgdHJhcCBsb2NhbCB0byB0aGlzIGNvbW1hbmQgZmlsZS4KKyAgZGVmaW5lIG9uX2N0cmxjIHsgICAgICAgICAgIDsgRGVmaW5lIHRoZSBPTl9DVFJMQyBtYWNyby4KKyAgICAgIGVjaG8gSW50ZXJydXB0ZWQgYXQgXHYodGltZSkuCisgICAgICBlY2hvIEl0ZXJhdGlvbnM6IFwlbgorICB9CisgIHhlY2hvIFR5cGUgQ3RybC1DIHRvIHF1aXQKKyAgZm9yIFwlbiAxIDk5OSAxIHsgICAgICAgICAgIDsgUHJpbnRzIGEgZG90IGV2ZXJ5IHNlY29uZCB1bnRpbCBpbnRlcnJ1cHRlZC4KKyAgICAgIHNsZWVwIDEKKyAgICAgIHhlY2hvIC4KKyAgfQorICBlY2hvIEZpbmlzaGVkIG5vcm1hbGx5IGF0IFx2KHRpbWUpIDsgR2V0IGhlcmUgb25seSBpZiBub3QgaW50ZXJydXB0ZWQuCisgIGRlY3JlbWVudCBcJW4KKyAgZWNobyBJdGVyYXRpb25zOiBcJW4KKworICAgVGhpcyBwcmludHMgYSBzdW1tYXJ5IG5vIG1hdHRlciB3aGV0aGVyIGl0IGNvbXBsZXRlcyBub3JtYWxseSBvciBpcworICAgaW50ZXJydXB0ZWQgZnJvbSB0aGUga2V5Ym9hcmQuIEluIGJvdGggY2FzZXMgdGhlIHRyYXAgaXMgYXV0b21hdGljYWxseQorICAgcmVtb3ZlZCBhZnRlcndhcmRzLgorCisgICBGb3IgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIE9OX0NUUkxDIHRvIGRlYnVnIHNjcmlwdHMsIHNlZQorICAgWzQ3Nl1TZWN0aW9uIDguMS4KKworICAgWyBbNDc3XVRvcCBdIFsgWzQ3OF1Db250ZW50cyBdIFsgWzQ3OV1DLUtlcm1pdCBIb21lIF0gWyBbNDgwXUtlcm1pdAorICAgSG9tZSBdCisgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKzkuIFMtRVhQUkVTU0lPTlMKKworICAgVGhpcyBzZWN0aW9uIGlzIHByaW1hcmlseSBmb3IgdGhvc2Ugd2hvIHdhbnQgdG8gd3JpdGUKKyAgIGNhbGN1bGF0aW9uLWludGVuc2l2ZSBzY3JpcHRzLCBlc3BlY2lhbGx5IGlmIHRoZXkgcmVxdWlyZQorICAgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYywgYW5kL29yIGZvciB0aG9zZSB3aG8gYXJlIGZhbWlsaWFyIHdpdGggdGhlCisgICBMSVNQIHByb2dyYW1taW5nIGxhbmd1YWdlLgorCisgICBFdmVyIHNpbmNlIEMtS2VybWl0IHZlcnNpb24gNSB3YXMgcmVsZWFzZWQgaW4gMTk4OCwgc2NyaXB0aW5nIGhhcyBiZWVuCisgICBvbmUgb2YgaXRzIG1ham9yIGF0dHJhY3Rpb25zLCBhbmQgYXJpdGhtZXRpYyBpcyBhIGtleSBwYXJ0IG9mIGl0LgorICAgVmVyc2lvbnMgNSBhbmQgNiBpbmNsdWRlZCBpbnRlZ2VyIGFyaXRobWV0aWMgb25seSwgdXNpbmcgdHJhZGl0aW9uYWwKKyAgIGFsZ2VicmFpYyBub3RhdGlvbiwgZS5nLjoKKworICBlY2hvIFxmZXZhbHVhdGUoMyooMis3KS8yKQorICAxMworCisgICBDLUtlcm1pdCA3LjAgYWRkZWQgc3VwcG9ydCBmb3IgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYywgYnV0IG9ubHkKKyAgIHRocm91Z2ggZnVuY3Rpb24gY2FsbHM6CisKKyAgZWNobyBcZmZwZGl2aWRlKFxmZnBtdWx0aXBseSgzLjAsXGZmcGFkZCgyLjAsNy4wKSksMi4wKQorICAxMy41CisKKyAgIEMtS2VybWl0IDguMCBpbnRyb2R1Y2VzIGEgdGhpcmQgZm9ybSBvZiBhcml0aG1ldGljIHRoYXQgdHJlYXRzCisgICBpbnRlZ2VycyBhbmQgZmxvYXRpbmctcG9pbnQgbnVtYmVycyB1bmlmb3JtbHksIGlzIGVhc2llciB0byByZWFkIGFuZAorICAgd3JpdGUsIGFuZCBleGVjdXRlcyB2ZXJ5IHF1aWNrbHk6CisKKyAgKC8gKCogMyAoKyAyIDcpKSAyKQorICAxMy41CisKKyAgIEJ1dCBmaXJzdCBzb21lIGJhY2tncm91bmQuCisKKyAgIFRoZSBLZXJtaXQgY29tbWFuZCBhbmQgc2NyaXB0aW5nIGxhbmd1YWdlIGRpZmZlcnMgZnJvbSB0cnVlCisgICBwcm9ncmFtbWluZyBsYW5ndWFnZXMgKHN1Y2ggYXMgQyBvciBGb3J0cmFuKSBpbiBtYW55IHdheXM7IG9uZSBvZiB0aGUKKyAgIG1vc3QgcHJvbWluZW50IGRpZmZlcmVuY2VzIGlzIHRoZSB3YXkgaW4gd2hpY2ggdmFyaWFibGVzIGFyZQorICAgZGlzdGluZ3Vpc2hlZCBmcm9tIGNvbnN0YW50cy4gSW4gYSBjb21tYW5kIGxhbmd1YWdlLCB3b3JkcyBhcmUgdGFrZW4KKyAgIGxpdGVyYWxseTsgZm9yIGV4YW1wbGUsIHRoZSBVbml4IHNoZWxsOgorCisgIGNhdCBmb28uYmFyCisKKyAgIGRpc3BsYXlzIHRoZSBmaWxlIG5hbWVkIGZvby5iYXIuIFdoZXJlYXMgaW4gYSBwcm9ncmFtbWluZyBsYW5ndWFnZQorICAgbGlrZSBDLCB3b3JkcyBhcmUgYXNzdW1lZCB0byBiZSB2YXJpYWJsZXM6CisKKyAgcyA9IGZvby5iYXI7ICAgIC8qIEFzc2lnbnMgdGhlIHZhbHVlIG9mIGZvby5iYXIgdG8gdGhlIHZhcmlhYmxlIHMgKi8KKworICAgVG8gbWFrZSBhIHByb2dyYW1taW5nIGxhbmd1YWdlIHRha2Ugd29yZHMgbGl0ZXJhbGx5LCB5b3UgaGF2ZSB0byBxdW90ZQorICAgb3IgImVzY2FwZSIgdGhlbToKKworICBzID0gImZvby5iYXIiOyAgLyogQXNzaWducyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyAiZm9vLmJhciIgdG8gdGhlIHZhcmlhYmxlCitzICovCisKKyAgIFRoZSBvcHBvc2l0ZSBob2xkcyBmb3IgY29tbWFuZCBsYW5ndWFnZXM6IHRvIGdldCB0aGVtIHRvIHRyZWF0IGEgd29yZAorICAgYXMgYSB2YXJpYWJsZSByYXRoZXIgdGhhbiBhIGNvbnN0YW50LCB5b3UgaGF2ZSB0byBlc2NhcGUgdGhlbS4gRm9yCisgICBleGFtcGxlLCBpbiB0aGUgVW5peCBzaGVsbDoKKworICBmb289MTIzICAgICAgICAgOyBBc3NpZ24gdmFsdWUgMTIzIHRvIHZhcmlhYmxlIGZvby4KKyAgZWNobyBmb28gICAgICAgIDsgUHJpbnRzICJmb28iCisgIGVjaG8gJGZvbyAgICAgICA7IFByaW50cyAiMTIzIgorCisgICBBbmQgaW4gS2VybWl0OgorCisgIGRlZmluZSBmb28gMTIzICA7IEFzc2lnbiB2YWx1ZSAxMjMgdG8gdmFyaWFibGUgZm9vLgorICBlY2hvIDEyMyAgICAgICAgOyBUaGlzIHByaW50cyAiMTIzIi4KKyAgZWNobyBmb28gICAgICAgIDsgVGhpcyBwcmludHMgImZvbyIuCisgIGVjaG8gXG0oZm9vKSAgICA7IFRoaXMgcHJpbnRzICIxMjMiLgorCisgICBJbiBvdGhlciB3b3JkcywgY2hhcmFjdGVyIHN0cmluZ3MgKHN1Y2ggYXMgImZvbyIgYWJvdmUpIGFyZQorICAgaW50ZXJwcmV0ZWQgYXMgbGl0ZXJhbCBzdHJpbmdzLCByYXRoZXIgdGhhbiB2YXJpYWJsZSBuYW1lcywgZXhjZXB0IGluCisgICBzcGVjaWFsIGNvbW1hbmRzIGxpa2UgREVGSU5FIHRoYXQgZGVhbCBzcGVjaWZpY2FsbHkgd2l0aCB2YXJpYWJsZQorICAgbmFtZXMgKG9yIGluIG51bWVyaWMgY29udGV4dHMgYXMgZXhwbGFpbmVkIGluIFs0ODFdU2VjdGlvbiA4LjIpLiBUaGUKKyAgIHNwZWNpYWwgImVzY2FwZSIgY2hhcmFjdGVyIChkb2xsYXIgc2lnbiAoJCkgZm9yIHRoZSBzaGVsbCwgYmFja3NsYXNoCisgICAoXCkgZm9yIEtlcm1pdCkgaW5kaWNhdGVzIHRoYXQgYSB2YXJpYWJsZSBpcyB0byBiZSByZXBsYWNlZCBieSBpdHMKKyAgIHZhbHVlLgorCisgICBUaGUgcmVxdWlyZW1lbnQgdG8gZXNjYXBlIHZhcmlhYmxlIG5hbWVzIGluIGNvbW1hbmQgbGFuZ3VhZ2VzIG5vcm1hbGx5CisgICBkb2VzIG5vdCBpbXBvc2UgYW55IHNwZWNpYWwgaGFyZHNoaXAsIGJ1dCBjYW4gYWRkIGEgY29uc2lkZXJhYmxlCisgICBub3RhdGlvbmFsIGJ1cmRlbiB0byBhcml0aG1ldGljIGV4cHJlc3Npb25zLCB3aGljaCBhcmUgdHlwaWNhbGx5IGZ1bGwKKyAgIG9mIHZhcmlhYmxlcy4gRXNwZWNpYWxseSBpbiBLZXJtaXQgd2hlbiBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZQorICAgaW52b2x2ZWQsIHdoZXJlIHlvdSBtdXN0IHVzZSBzcGVjaWFsIFxmZnB4eHgoKSBmdW5jdGlvbnMsIGUuZy4KKyAgICJcZmZwYWRkKFxtKGEpLFxtKGIpKSIgcmF0aGVyIHRoYW4gdGhlIHNpbXBsZSAiKyIgb3BlcmF0b3IgdG8gYWRkIHR3bworICAgZmxvYXRpbmctcG9pbnQgbnVtYmVycyB0b2dldGhlciwgYmVjYXVzZSB0aGUgb3JpZ2luYWwgYXJpdGhtZXRpYworICAgaGFuZGxlciBkb2Vzbid0IHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQgKHRoaXMgbWlnaHQgY2hhbmdlIGluIHRoZQorICAgZnV0dXJlKS4gVG8gaWxsdXN0cmF0ZSwgdGhlIGdlbmVyYWwgZm9ybXVsYSBmb3IgdGhlIGFyZWEgb2YgYSB0cmlhbmdsZQorICAgaXM6CisKKyAgc3FydChzICogKHMgLSBhKSAqIChzIC0gYikgKiAocyAtIGMpKQorCisgICB3aGVyZSBhLCBiLCBhbmQgYyBhcmUgdGhlIGxlbmd0aHMgb2YgdGhlIHRyaWFuZ2xlJ3MgdGhyZWUgc2lkZXMgYW5kOgorCisgIHMgPSAoYSArIGIgKyBjKSAvIDIKKworICAgRXhjZXB0IGluIHNwZWNpYWwgY2FzZXMgKGUuZy4gYSA9IDMsIGIgPSA0LCBjID0gNSksIHRoZSByZXN1bHQgaGFzIGEKKyAgIGZyYWN0aW9uYWwgcGFydCBzbyB0aGUgY29tcHV0YXRpb24gbXVzdCBiZSBkb25lIHVzaW5nIGZsb2F0aW5nLXBvaW50CisgICBhcml0aG1ldGljLiBXZSBjYW4gY3JlYXRlIGEgS2VybWl0IDcuMCBmdW5jdGlvbiBmb3IgdGhpcyBhcyBmb2xsb3dzOgorCisgIGRlZiBhcmVhIHsKKyAgICAgIGxvY2FsIHMgdDEgdDIgdDMKKyAgICAgIGFzc2lnbiBzIFxmZnBkaXYoXGZmcGFkZChcZmZwYWRkKFwlMSxcJTIpLFwlMyksMi4wKQorICAgICAgYXNzaWduIHQxIFxmZnBzdWIoXG0ocyksXCUxKQorICAgICAgYXNzaWduIHQyIFxmZnBzdWIoXG0ocyksXCUyKQorICAgICAgYXNzaWduIHQzIFxmZnBzdWIoXG0ocyksXCUzKQorICAgICAgcmV0dXJuIFxmZnBzcXJ0KFxmZnBtdWwoXG0ocyksXGZmcG11bChcbSh0MSksXGZmcG11bChcbSh0MiksXG0odDMpKSkpKQorICB9CisKKyAgIEJ1dCBhcyB5b3UgY2FuIHNlZSwgdGhpcyBpcyByYXRoZXIgY3VtYmVyc29tZS4gTm90ZSwgaW4gcGFydGljdWxhciwKKyAgIHRoYXQgYXJpdGhtZXRpYyBmdW5jdGlvbnMgbGlrZSBcZmZwYWRkKCksIFxmZnBtdWwoKSwgZXRjLCB0YWtlIGV4YWN0bHkKKyAgIHR3byBvcGVyYW5kcyAobGlrZSB0aGVpciBzeW1ib2xpYyBjb3VudGVycGFydHMgKyBhbmQgKiksIHNvIG9idGFpbmluZworICAgdGhlIHByb2R1Y3Qgb2YgdGhyZWUgb3IgbW9yZSBudW1iZXJzIChhcyB3ZSBkbyBpbiB0aGlzIGNhc2UpIGlzCisgICBhd2t3YXJkLgorCisgICBVc2luZyB0aGUgYWx0ZXJuYXRpdmUgUy1FeHByZXNzaW9uIG5vdGF0aW9uLCB3ZSBjYW4gcmVkdWNlIHRoaXMgdG8gYQorICAgZm9ybSB0aGF0IGlzIGJvdGggZWFzaWVyIHRvIHJlYWQgYW5kIGV4ZWN1dGVzIGZhc3RlciAodGhlIGRldGFpbHMgYXJlCisgICBleHBsYWluZWQgbGF0ZXIpOgorCisgIGRlZiBuZXdhcmVhIHsKKyAgICAgIChsZXQgcyAoLyAoKyBcJTEgXCUyIFwlMykgMi4wKSkKKyAgICAgIChzcXJ0ICgqIHMgKC0gcyBcJTEpICgtIHMgXCUyKSAoLSBzIFwlMykpKQorICB9CisKKyAgIEluIGJvdGggZXhhbXBsZXMsIHRoZSBcJTEuLjMgdmFyaWFibGVzIGFyZSB0aGUgbm9ybWFsIEtlcm1pdCBtYWNybworICAgYXJndW1lbnRzLCByZWZlcmVuY2VkIGJ5IHRoZSBub3JtYWwgZXNjYXBpbmcgbWVjaGFuaXNtLiBGb3IgaW5jcmVhc2VkCisgICByZWFkYWJpbGl0eSwgd2UgY2FuIGFsc28gYXNzaWduIHRoZSBtYWNybyBhcmd1bWVudHMgXCUxLCBcJTIsIGFuZCBcJTMKKyAgIHRvIHRoZSBsZXR0ZXJzIGEsIGIsIGFuZCBjIGNvcnJlc3BvbmRpbmcgdG8gb3VyIGZvcm11bGE6CisKK2RlZiBuZXdhcmVhIHsKKyAgICAobGV0IGEgXCUxIGIgXCUyIGMgXCUzKQorICAgIChsZXQgcyAoLyAoKyBhIGIgYykgMi4wKSkKKyAgICAoc3FydCAoKiBzICgtIHMgYSkgKC0gcyBiKSAoLSBzIGMpKSkKK30KKworICAgQW5kIG5vdyB0aGUgS2VybWl0IGZ1bmN0aW9uIHJlYWRzIGFsbW9zdCBsaWtlIHRoZSBvcmlnaW5hbCBmb3JtdWxhLgorICAgSGVyZSBLZXJtaXQgYmVoYXZlcyBtb3JlIGxpa2UgYSByZWd1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLiBJbiBhbgorICAgUy1FeHByZXNzaW9uLCBtYWNybyBuYW1lcyBuZWVkIG5vdCBiZSBlc2NhcGVkIHdoZW4gdGhleSBhcmUgdXNlZCBhcworICAgdGhlIG5hbWVzIG9mIG51bWVyaWMgdmFyaWFibGVzLgorCisgICBbIFs0ODJdVG9wIF0gWyBbNDgzXUNvbnRlbnRzIF0gWyBbNDg0XUMtS2VybWl0IEhvbWUgXSBbIFs0ODVdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA5LjEuIFdoYXQgaXMgYW4gUy1FeHByZXNzaW9uPworCisgICBUaGUgUy1FeHByZXNzaW9uIGNvbmNlcHQgaXMgYm9ycm93ZWQgZnJvbSB0aGUgTGlzcCBwcm9ncmFtbWluZworICAgbGFuZ3VhZ2UuICJTLUV4cHJlc3Npb24iIGlzIHNob3J0IGZvciBTeW1ib2xpYyBFeHByZXNzaW9uIChpdHNlbGYKKyAgIHNvbWV0aW1lcyBzaG9ydGVuZWQgdG8gU0VYUCkuIFMtRXhwcmVzc2lvbnMgcHJvdmlkZSBhIGtpbmQgb2YKKyAgIEFsdGVybmF0aXZlIE1pbmktVW5pdmVyc2Ugd2l0aGluIHRoZSBLZXJtaXQgY29tbWFuZCBsYW5ndWFnZSB3aGVuIHRoZQorICAgcmVndWxhciBydWxlcyBkb24ndCBhcHBseSwgYSB1bml2ZXJzZSBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcy4KKworICAgQy1LZXJtaXQgZG9lcyBub3QgcHJldGVuZCB0byBiZSBhIGZ1bGwgTGlzcCBpbnRlcnByZXRlcjsgb25seSB0aGUKKyAgIGFyaXRobWV0aWMgcGFydHMgb2YgTGlzcCBoYXZlIGJlZW4gaW5jb3Jwb3JhdGVkOiBTLUV4cHJlc3Npb25zIHRoYXQKKyAgIG9wZXJhdGUgb24gbnVtYmVycyBhbmQgcmV0dXJuIG51bWVyaWMgdmFsdWVzIChwbHVzIGV4dGVuc2liaWxpdHkKKyAgIGZlYXR1cmVzIGRlc2NyaWJlZCBpbiBbNDg2XVNlY3Rpb24gOS44LCB3aGljaCBhbGxvdyBzb21lIGRlZ3JlZSBvZgorICAgc3RyaW5nIHByb2Nlc3NpbmcpLgorCisgICBBbiBTLUV4cHJlc3Npb24gaXMgYSBsaXN0IG9mIHplcm8gb3IgbW9yZSBpdGVtcywgc2VwYXJhdGVkIGJ5IHNwYWNlcywKKyAgIHdpdGhpbiBwYXJlbnRoZXNlcy4gRXhhbXBsZXM6CisKKyAgKCkKKyAgKDEpCisgIChhKQorICAoKyBhIDEpCisgICgqIDIgYSBiKQorCisgICBJZiB0aGUgUy1FeHByZXNzaW9uIGlzIGVtcHR5LCBpdCBoYXMgdGhlIE5JTCAoZW1wdHkpIHZhbHVlLiBJZiBpdCBpcworICAgbm90IGVtcHR5IGFuZCB0aGUgZmlyc3QgaXRlbSBpcyBhbiBvcGVyYXRvciAoc3VjaCBhcyArIG9yICopLCB0aGVyZQorICAgY2FuIGJlIHplcm8gb3IgbW9yZSBzdWJzZXF1ZW50IGl0ZW1zLCBjYWxsZWQgdGhlIG9wZXJhbmRzOgorCisgICgrIDEgMikKKworICAgSGVyZSB0aGUgb3BlcmF0b3IgaXMgIisiIGFuZCB0aGUgb3BlcmFuZHMgYXJlICIxIiBhbmQgIjIiLCBhbmQgdGhlCisgICB2YWx1ZSBvZiB0aGUgUy1FeHByZXNzaW9uIGlzIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmF0aW9uIChpbiB0aGlzIGNhc2UKKyAgIDMpLiBUaGUgb3BlcmF0b3IgYWx3YXlzIGNvbWVzIGZpcnN0LCB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgIGZhbWlsaWFyIGFsZ2VicmFpYyBub3RhdGlvbjsgdGhpcyBiZWNhdXNlIFMtRXhwcmVzc2lvbiBvcGVyYXRvcnMgY2FuCisgICBoYXZlIGRpZmZlcmVudCBudW1iZXJzIG9mIG9wZXJhbmRzOgorCisgICgrIDEpCisgICgrIDEgMikKKyAgKCsgMSAyIDMgNCA1IDYgNyA4IDkpCisKKyAgIElmIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBTLUV4cHJlc3Npb24gaXMgbm90IGFuIG9wZXJhdG9yLCB0aGVuIGl0IG11c3QKKyAgIGJlIGEgdmFyaWFibGUgb3IgYSBudW1iZXIgKG9yIGEgbWFjcm87IHNlZSBbNDg3XVNlY3Rpb24gOS44KSwgYW5kIHRoZQorICAgUy1FeHByZXNzaW9uIGNhbiBvbmx5IGNvbnRhaW4gb25lIGl0ZW07IGluIHRoaXMgY2FzZSwgdGhlCisgICBTLUV4cHJlc3Npb24ncyB2YWx1ZSBpcyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIG9yIG51bWJlcjoKKworICAoYSkKKyAgKDMpCisKKyAgIE9wZXJhbmRzIGNhbiBiZSBudW1iZXJzLCB2YXJpYWJsZXMgdGhhdCBoYXZlIG51bWVyaWMgdmFsdWVzLCBmdW5jdGlvbnMKKyAgIHRoYXQgcmV0dXJuIG51bWJlcnMsIG9yIG90aGVyIFMtRXhwcmVzc2lvbnMuIFRvIGlsbHVzdHJhdGUgYW4KKyAgIFMtRXhwcmVzc2lvbiB3aXRoaW4gYW4gUy1FeHByZXNzaW9uLCBvYnNlcnZlIHRoYXQ6CisKKyAgKCsgMSAyKQorCisgICBpcyBlcXVpdmFsZW50IHRvIGFueSBvZiB0aGUgZm9sbG93aW5nIChwbHVzIGFuIGluZmluaXRlIG51bWJlciBvZgorICAgb3RoZXJzKToKKworICAoKyAxICgrIDEgMSkpCisgICgrICgtIDMgMikgKC8gMTQgKCsgMyA0KSkpCisKKyAgIFMtRXhwcmVzc2lvbnMgY2FuIGJlIG5lc3RlZCB0byBhbnkgcmVhc29uYWJsZSBsZXZlbDsgZm9yIGV4YW1wbGUsIHRoZQorICAgdmFsdWUgb2YgdGhlIGZvbGxvd2luZyBTLUV4cHJlc3Npb24gaXMgNjQ6CisKKyAgKC0gKCogKCsgMiAoKiAzIDQpKSAoLSA5ICgqIDIgMikpKSA2KQorCisgICBPcGVyYXRvcnMgaGF2ZSBubyBwcmVjZWRlbmNlLCBpbXBsaWVkIG9yIG90aGVyd2lzZSwgc2luY2UgdGhleSBjYW4ndAorICAgYmUgbWl4ZWQuIFRoZSBvbmx5IGV4Y2VwdGlvbnMgYXJlIHVuYXJ5ICsgYW5kIC0sIHdoaWNoIHNpbXBseSBpbmRpY2F0ZQorICAgdGhlIHNpZ24gb2YgYSBudW1iZXI6CisKKyAgKCogMyAtMSkKKworICAgT3JkZXIgb2YgZXZhbHVhdGlvbiBpcyBzcGVjaWZpZWQgZW50aXJlbHkgYnkgcGFyZW50aGVzZXMsIHdoaWNoIGFyZQorICAgcmVxdWlyZWQgYXJvdW5kIGVhY2ggb3BlcmF0b3IgYW5kIGl0cyBvcGVyYW5kczogKCsgYSAoKiBiIGMpKSBpbnN0ZWFkCisgICBvZiAoYSArIGIgKiBjKS4KKworICAgUy1FeHByZXNzaW9ucyBwcm92aWRlIGEgc2ltcGxlIGFuZCBpc29sYXRlZCBlbnZpcm9ubWVudCBpbiB3aGljaAorICAgS2VybWl0J3MgbWFjcm8gbmFtZXMgY2FuIGJlIHVzZWQgd2l0aG91dCB0aGUgXG0oLi4uKSBlc2NhcGluZyB0aGF0IGlzCisgICBub3JtYWxseSByZXF1aXJlZC4gR2l2ZW46CisKKyAgZGVmaW5lIGEgMQorICBkZWZpbmUgYiAyCisgIGRlZmluZSBjIDMKKworICAgVGhlbjoKKworICAoKyBcbShhKSBcbShiKSBcbShjKSkKKworICAgaXMgZXF1aXZhbGVudCB0bzoKKworICAoKyBhIGIgYykKKworICAgV2l0aGluIGFuIFMtRXhwcmVzc2lvbiwgYXMgaW4gb3RoZXIgc3RyaWN0bHkgbnVtZXJpYyBjb250ZXh0cworICAgKFs0ODhdU2VjdGlvbiA4LjIpLCBhbnkgb3BlcmFuZCB0aGF0IHN0YXJ0cyB3aXRoIGEgbGV0dGVyIGlzIHRyZWF0ZWQKKyAgIGFzIGEgS2VybWl0IG1hY3JvIG5hbWUuIEluIHRoaXMgY29udGV4dCwgYWJicmV2aWF0aW9ucyBhcmUgbm90CisgICBhY2NlcHRlZDsgdmFyaWFibGUgbmFtZXMgbXVzdCBiZSBzcGVsbGVkIG91dCBpbiBmdWxsLiBBbHBoYWJldGljIGNhc2UKKyAgIGlzIG5vdCBzaWduaWZpY2FudDsgImEiIGFuZCAiQSIgYXJlIHRoZSBzYW1lIHZhcmlhYmxlLCBidXQgYm90aCBhcmUKKyAgIGRpZmZlcmVudCBmcm9tICJhcmVhIi4KKworICAgT2YgY291cnNlLCByZWd1bGFyIEtlcm1pdCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbgorICAgUy1FeHByZXNzaW9ucyBpbiB0aGUgbm9ybWFsIHdheXM6CisKKyAgKCogXHYobWF0aF9waSkgKF4gXCVyIDIpKSAgICAgICAgICAgICA7IEFyZWEgb2YgYSBjaXJjbGUgd2l0aCByYWRpdXMgXCVyCisgICgrIFxmam9pbigmYSkpICAgICAgICAgICAgICAgICAgICAgICAgOyBTdW0gb2YgYWxsIGVsZW1lbnRzIG9mIGFycmF5IFwmYVtdCisKKyAgIFsgWzQ4OV1Ub3AgXSBbIFs0OTBdQ29udGVudHMgXSBbIFs0OTFdQy1LZXJtaXQgSG9tZSBdIFsgWzQ5Ml1LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDkuMi4gSW50ZWdlciBhbmQgRmxvYXRpbmctUG9pbnQtQXJpdGhtZXRpYworCisgICBOb3JtYWxseSwgaWYgYWxsIG51bWJlcnMgaW4gYW4gUy1FeHByZXNzaW9uIGFyZSBpbnRlZ2VycywgdGhlIHJlc3VsdAorICAgaXMgYW4gaW50ZWdlcjoKKworICAoKyAxIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgUmVzdWx0IGlzIDIKKyAgKC8gOSAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3VsdCBpcyAzCisKKyAgIElmIGFueSBvZiB0aGUgb3BlcmFuZHMgaXMgZmxvYXRpbmcgcG9pbnQsIGhvd2V2ZXIsIHRoZSByZXN1bHQgaXMgYWxzbworICAgZmxvYXRpbmcgcG9pbnQ6CisKKyAgKCsgMSAxLjApICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3VsdCBpcyAyLjAKKyAgKC8gOS4wIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3VsdCBpcyAzLjAKKworICAgSWYgYWxsIHRoZSBvcGVyYW5kcyBhcmUgaW50ZWdlcnMgYnV0IHRoZSByZXN1bHQgaGFzIGEgZnJhY3Rpb25hbCBwYXJ0LAorICAgdGhlIHJlc3VsdCBpcyBmbG9hdGluZyBwb2ludDoKKworICAoLyAxMCAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgUmVzdWx0IGlzIDMuMzMzMzMzMzMzMzMzMzMzCisKKyAgIFRvIGZvcmNlIGFuIGludGVnZXIgcmVzdWx0IGluIHN1Y2ggY2FzZXMsIHVzZSB0aGUgVFJVTkNBVEUgb3BlcmF0b3I6CisKKyAgKHRydW5jYXRlICgvIDEwIDMpKSAgICAgICAgICAgICAgICAgICA7IFJlc3VsdCBpcyAzCisKKyAgIFNpbWlsYXJseSwgdG8gZm9yY2UgYSBjb21wdXRhdGlvbiB0byBvY2N1ciBpbiBmbG9hdGluZyBwb2ludCwgeW91IGNhbgorICAgY29lcmNlIG9uZSBvZiBpdHMgb3BlcmFuZHMgdG8gRkxPQVQ6CisKKyAgKCsgMSAoZmxvYXQgMSkpICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3VsdCBpcyAyLjAKKworICAgVGhlIHJlc3VsdCBpcyBhbHNvIGZsb2F0aW5nIHBvaW50IGlmIHRoZSBtYWduaXR1ZGUgb2YgYW55IGludGVnZXIKKyAgIG9wZXJhbmQsIGludGVybWVkaWF0ZSByZXN1bHQsIG9yIHRoZSByZXN1bHQgaXRzZWxmLCBpcyBsYXJnZXIgdGhhbiB0aGUKKyAgIG1heGltdW0gZm9yIHRoZSB1bmRlcmx5aW5nIG1hY2hpbmUgYXJjaGl0ZWN0dXJlOgorCisgICheIDEwMCAxMDApCisKKyAgIElmIHRoZSByZXN1bHQgaXMgdG9vIGxhcmdlIGV2ZW4gZm9yIGZsb2F0aW5nLXBvaW50IHJlcHJlc2VudGF0aW9uLAorICAgIkluZmluaXR5IiBpcyBwcmludGVkOyBpZiBpdCBpcyB0b28gc21hbGwgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIDAsCisgICAwLjAgaXMgcmV0dXJuZWQuCisKKyAgIExhcmdlIG51bWJlcnMgY2FuIGJlIHVzZWQgYW5kIGxhcmdlIHJlc3VsdHMgZ2VuZXJhdGVkLCBidXQgdGhleSBhcmUKKyAgIGFjY3VyYXRlIG9ubHkgdG8gdGhlIHByZWNpc2lvbiBvZiB0aGUgdW5kZXJseWluZyBtYWNoaW5lLiBGb3IgZXhhbXBsZSwKKyAgIHRoZSByZXN1bHQgb2Y6CisKKyAoKyAxMTExMTExMTExMTExMTExMTExMTEgMjIyMjIyMjIyMjIyMjIyMjIyMjIyKQorCisgICBzaG91bGQgYmUgMzMzMzMzMzMzMzMzMzMzMzMzMzMzLCBidXQgMzMzMzMzMzMzMzMzMzMzMzAwMDAwLjAgaXMKKyAgIHByb2R1Y2VkIGluc3RlYWQgaWYgdGhlIG1hY2hpbmUgaXMgYWNjdXJhdGUgdG8gb25seSBhYm91dCAxNiBkZWNpbWFsCisgICBkaWdpdHMsIGV2ZW4gd2l0aCBjb2VyY2lvbiB0byBmbG9hdGluZy1wb2ludC4gVGhlIG9yZGVyIG9mIG1hZ25pdHVkZQorICAgaXMgY29ycmVjdCBidXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0cyBhcmUgd3JvbmcuIFRoZSBpbXByZWNpc2UKKyAgIG5hdHVyZSBvZiB0aGUgcmVzdWx0IGlzIGluZGljYXRlZCBieSB0aGUgIi4wIiBhdCB0aGUgZW5kLiBDb250cmFzdAorICAgd2l0aDoKKworICgrIDExMTExMTExMSAyMjIyMjIyMjIpCisKKyAgIHdoaWNoIHByb2R1Y2VzIGFuIGV4YWN0IGludGVnZXIgcmVzdWx0LgorCisgICBbIFs0OTNdVG9wIF0gWyBbNDk0XUNvbnRlbnRzIF0gWyBbNDk1XUMtS2VybWl0IEhvbWUgXSBbIFs0OTZdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA5LjMuIEhvdyB0byBVc2UgUy1FeHByZXNzaW9ucworCisgICBTLUV4cHJlc3Npb25zIG1heSBiZSBnaXZlbiBhcyBjb21tYW5kcyB0byBDLUtlcm1pdC4gQW55IGNvbW1hbmQgd2hvc2UKKyAgIGZpcnN0IGNoYXJhY3RlciBpcyAiKCIgKGxlZnQgcGFyZW50aGVzaXMpIGlzIGludGVycHJldGVkIGFzIGFuCisgICBTLUV4cHJlc3Npb24uCisKKyAgIElmIHlvdSBlbnRlciBhbiBTLUV4cHJlc3Npb24gYXQgdGhlIEMtS2VybWl0PiBwcm9tcHQsIGl0cyByZXN1bHQgaXMKKyAgIHByaW50ZWQ6CisKKyAgQy1LZXJtaXQ+KC8gMTAuMCAzKQorICAgMy4zMzMzMzMzMzMzMzMzMzMKKyAgQy1LZXJtaXQ+CisKKyAgIElmIGFuIFMtRXhwcmVzc2lvbiBpcyBleGVjdXRlZCB3aXRoaW4gYSBtYWNybyBvciBjb21tYW5kIGZpbGUsIGl0cworICAgdmFsdWUgaXMgbm90IHByaW50ZWQuIEhvd2V2ZXIsIHlvdSBjYW4gY29udHJvbCB0aGUgcHJpbnRpbmcgYWN0aW9uCisgICB3aXRoOgorCisgICBTRVQgU0VYUFJFU1NJT04gRUNITyB7IEFVVE8sIE9OLCBPRkYgfQorICAgICAgICAgIEFVVE8gaXMgdGhlIGRlZmF1bHQsIG1lYW5pbmcgcHJpbnQgdGhlIHZhbHVlIGF0IHRvcCBsZXZlbCBvbmx5OworICAgICAgICAgIE9OIG1lYW5zIGFsd2F5cyBwcmludCB0aGUgdmFsdWU7IE9GRiBtZWFucyBuZXZlciBwcmludCBpdC4KKworICAgSW4gYW55IGNhc2UsIHRoZSB2YWx1ZSBvZiB0aGUgbW9zdCByZWNlbnQgUy1FeHByZXNzaW9uIChhbmQgdGhlCisgICBTLUV4cHJlc3Npb24gaXRzZWxmKSBtYXkgYmUgYWNjZXNzZWQgcHJvZ3JhbW1hdGljYWxseSB0aHJvdWdoIHRoZQorICAgZm9sbG93aW5nIHZhcmlhYmxlczoKKworICAgXHYoc2V4cHJlc3Npb24pCisgICAgICAgICAgVGhlIFMtRXhwcmVzc2lvbiBtb3N0IHJlY2VudGx5IGV4ZWN1dGVkLgorCisgICBcdihzdmFsdWUpCisgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBTLUV4cHJlc3Npb24gbW9zdCByZWNlbnRseSBleGVjdXRlZC4KKworICAgQmVzaWRlcyBpc3N1aW5nIFMtRXhwcmVzc2lvbnMgYXMgY29tbWFuZHMgaW4gdGhlbXNlbHZlcywgeW91IGNhbiBhbHNvCisgICBleGVjdXRlIHRoZW0gYW55d2hlcmUgd2l0aGluIGEgS2VybWl0IGNvbW1hbmQsIGJ1dCBpbiB0aGlzIGNhc2UgdGhleQorICAgbXVzdCBiZSBlbmNsb3NlZCBpbiBhIGZ1bmN0aW9uIGNhbGwgKG90aGVyd2lzZSB0aGV5IGFyZSB0YWtlbgorICAgbGl0ZXJhbGx5KToKKworICAgXGZzZXhwcmVzc2lvbihzKQorICAgICAgICAgIFRoZSBhcmd1bWVudCAicyIgaXMgYW4gUy1FeHByZXNzaW9uOyB0aGUgb3V0ZXIgcGFyZW50aGVzZXMgbWF5CisgICAgICAgICAgYmUgb21pdHRlZC4gVGhlIHZhbHVlIG9mIHRoZSBTLUV4cHJlc3Npb24gaXMgcmV0dXJuZWQuIE5vdGUKKyAgICAgICAgICB0aGF0IHNpbmNlIFMtRXhwcmVzc2lvbnMgdXN1YWxseSBjb250YWluIHNwYWNlcywgc29tZSBmb3JtIG9mCisgICAgICAgICAgZ3JvdXBpbmcgb3IgcXVvdGluZyBtaWdodCBiZSBuZWVkZWQgaW4gc29tZSBjb250ZXh0czoKKworICBlY2hvIFxmc2V4cHJlc3Npb24oKCsgMSAxKSkgICAgICAgICAgICA7IE91dGVyIHBhcmVudGhlc2VzIG1heSBiZSBpbmNsdWRlZAorICBlY2hvIFxmc2V4cHIoKyAxIDEpICAgICAgICAgICAgICAgICAgICA7IE91dGVyIHBhcmVudGhlc2VzIG1heSBiZSBvbWl0dGVkCisgIGVjaG8gVmFsdWUgPSAiXGZzZXhwKCsgMSBhKSIgICAgICAgICAgIDsgQ2FuIGJlIGVtYmVkZGVkIGluIHN0cmluZ3MKKyAgZWNobyBWYWx1ZSA9IFwmYVtcZnNleHAoLyBiIDIpXSAgICAgICAgOyBDYW4gYmUgdXNlZCBpbiBhcnJheSBzdWJzY3JpcHRzCisgIGlmID0ge1xmc2V4cCgrIDEgMSl9IDIgeyAgICAgICAgICAgICAgIDsgQnJhY2VzIG5lZWRlZCBoZXJlIGZvciBncm91cGluZworICAgICAgZWNobyBPbmUgcGx1cyBvbmUgc3RpbGwgZXF1YWxzIHR3bworICB9CisKKyAgIFRoZSBJRiBzdGF0ZW1lbnQgaWxsdXN0cmF0ZXMgaG93IHRvIHVzZSBTLUV4cHJlc3Npb25zIGFzIChvciBpbikgSUYgb3IKKyAgIFdISUxFIGNvbmRpdGlvbnM6CisKKyAgICAgKiBBbHRob3VnaCBTLUV4cHJlc3Npb25zIGFuZCBJRiBjb25kaXRpb25zIGFyZSBzaW1pbGFyIGluCisgICAgICAgYXBwZWFyYW5jZSwgdGhleSBhcmUgbm90IGludGVyY2hhbmdlYWJsZS4gVGhlcmVmb3JlIHlvdSBtdXN0IHVzZQorICAgICAgIFxmc2V4cHIoKSB0byBsZXQgS2VybWl0IGtub3cgaXQncyBhbiBTLUV4cHJlc3Npb24gcmF0aGVyIHRoYW4gYQorICAgICAgIHJlZ3VsYXIgSUYgY29uZGl0aW9uLCBvciBhIGJvb2xlYW4gb3IgYWxnZWJyYWljIGV4cHJlc3Npb24gd2l0aGluCisgICAgICAgYW4gSUYgY29uZGl0aW9uLgorICAgICAqIEluIGNvbnRleHRzIHdoZXJlIGEgc2luZ2xlICJ3b3JkIiBpcyBleHBlY3RlZCwgeW91IG11c3QgZW5jbG9zZQorICAgICAgIHRoZSBcZnNleHAoKSBpbnZvY2F0aW9uIGluIGJyYWNlcyBpZiB0aGUgUy1FeHByZXNzaW9uIGNvbnRhaW5zCisgICAgICAgc3BhY2VzIChhbmQgbW9zdCBvZiB0aGVtIGRvKS4KKworICAgSWYgYW4gUy1FeHByZXNzaW9uIGlzIHRoZSBsYXN0IGNvbW1hbmQgZXhlY3V0ZWQgaW4gYSBtYWNybywgaXRzIHZhbHVlCisgICBiZWNvbWVzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1hY3JvOyBubyBSRVRVUk4gY29tbWFuZCBpcyBuZWVkZWQuCisgICBFeGFtcGxlOgorCisgIGRlZiBuZXdhcmVhIHsKKyAgICAgIChsZXQgcyAoLyAoKyBcJTEgXCUyIFwlMykgMi4wKSkKKyAgICAgIChzcXJ0ICgqIHMgKC0gcyBcJTEpICgtIHMgXCUyKSAoLSBzIFwlMykpKQorICB9CisKKyAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG1vcmUgZWZmaWNpZW50IHRoYW4pOgorCisgIGRlZiBuZXdhcmVhIHsKKyAgICAgIChsZXQgcyAoLyAoKyBcJTEgXCUyIFwlMykgMi4wKSkKKyAgICAgIHJldHVybiBcZnNleHAoc3FydCAoKiBzICgtIHMgXCUxKSAoLSBzIFwlMikgKC0gcyBcJTMpKSkKKyAgfQorCisgICBXaGVuIGFuIFMtRXhwcmVzc2lvbiBpcyBlbnRlcmVkIGFzIGEgY29tbWFuZCAtLSB0aGF0IGlzLCB0aGUgZmlyc3QKKyAgIG5vbmJsYW5rIGNoYXJhY3RlciBvZiB0aGUgY29tbWFuZCBpcyBhIGxlZnQgcGFyZW50aGVzaXMgLS0gdGhlbiBpdCBpcworICAgYWxsb3dlZCB0byBzcGFuIG11bHRpcGxlIGxpbmVzLCBhcyBtYW55IGFzIHlvdSBsaWtlLCB1bnRpbCB0aGUgZmlyc3QKKyAgIGxlZnQgcGFyZW50aGVzaXMgaXMgbWF0Y2hlZDoKKworICAobGV0IHMgKC8KKyAgICAgICAgICAoKworICAgICAgICAgICBcJTEKKyAgICAgICAgICAgXCUyCisgICAgICAgICAgIFwlMworICAgICAgICAgICApCisgICAgICAgICAgMi4wCisgICAgICAgICAgKQorICAgICAgICkKKyAgKHNxcnQgKCoKKyAgICAgICAgIHMKKyAgICAgICAgICgtIHMgXCUxKQorICAgICAgICAgKC0gcyBcJTIpCisgICAgICAgICAoLSBzIFwlMykKKyAgICAgICAgICkKKyAgICAgICAgKQorCisgICBUaGUgUy1FeHByZXNzaW9uIGNvbmNlcHQgbGVuZHMgaXRzZWxmIGVhc2lseSB0byBlbWJlZGRpbmcgYW5kCisgICByZWN1cnNpb24sIGJ1dCB0aGUgZGVwdGggdG8gd2hpY2ggcmVjdXJzaW9uIGNhbiBvY2N1ciBpcyBsaW1pdGVkIGJ5CisgICB0aGUgcmVzb3VyY2VzIG9mIHRoZSBjb21wdXRlciAobWVtb3J5IHNpemUsIGFkZHJlc3Mgc3BhY2UsIHN3YXAgc3BhY2UKKyAgIG9uIGRpc2spIGFuZCBvdGhlciBmYWN0b3JzLiBUaGVyZSBpcyBubyB3YXkgdGhhdCBDLUtlcm1pdCBjYW4ga25vdworICAgd2hhdCB0aGlzIGxpbWl0IGlzLCBzaW5jZSBpdCB2YXJpZXMgbm90IG9ubHkgZnJvbSBjb21wdXRlciB0bworICAgY29tcHV0ZXIsIGJ1dCBhbHNvIGZyb20gbW9tZW50IHRvIG1vbWVudC4gSWYgcmVzb3VyY2VzIGFyZSBleGhhdXN0ZWQKKyAgIGJ5IHJlY3Vyc2lvbiwgQy1LZXJtaXQgc2ltcGx5IGNyYXNoZXM7IHRoZXJlJ3Mgbm8gd2F5IHRvIHRyYXAgdGhpcworICAgZXJyb3IuIEhvd2V2ZXIsIHlvdSBjYW4gc2V0IGEgZGVwdGggbGltaXQgb24gUy1FeHByZXNzaW9uczoKKworICAgU0VUIFNFWFBSRVNTSU9OIERFUFRILUxJTUlUIG51bWJlcgorICAgICAgICAgIExpbWl0cyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBTLUV4cHJlc3Npb24gcmVhZGVyIGNhbiBpbnZva2UKKyAgICAgICAgICBpdHNlbGYgd2l0aG91dCByZXR1cm5pbmcgdG8gdGhlIGdpdmVuIG51bWJlci4gVGhlIGRlZmF1bHQgbGltaXQKKyAgICAgICAgICBpcyAxMDAwLiBUaGlzIGxpbWl0IGFwcGxpZXMgdG8gUy1FeHByZXNzaW9ucyBlbWJlZGRlZCB3aXRoaW4KKyAgICAgICAgICBvdGhlciBTLUV4cHJlc3Npb25zIGFzIHdlbGwgYXMgdG8gUy1FeHByZXNzaW9ucyB0aGF0IGludm9rZQorICAgICAgICAgIHJlY3Vyc2l2ZSBtYWNyb3MuIElmIHRoZSBsaW1pdCBpcyBleGNlZWRlZCwgS2VybWl0IHByaW50cworICAgICAgICAgICI/Uy1FeHByZXNzaW9uIGRlcHRoIGxpbWl0IGV4Y2VlZGVkIiBhbmQgcmV0dXJucyB0byBpdHMgcHJvbXB0LgorICAgICAgICAgIE1vcmUgYWJvdXQgcmVjdXJzaW9uIGluIFs0OTddU2VjdGlvbiA5LjguCisKKyAgIFlvdSBjYW4gYWxzbyB0ZXN0IHRoZSBkZXB0aCBwcm9ncmFtbWF0aWNhbGx5OgorCisgICBcdihzZGVwdGgpCisgICAgICAgICAgVGhlIGN1cnJlbnQgUy1FeHByZXNzaW9uIGludm9jYXRpb24gZGVwdGguIFRoZSBkZXB0aCBpbmNsdWRlcworICAgICAgICAgIGJvdGggbmVzdGluZyBsZXZlbCBhbmQgcmVjdXJzaW9uLiBGb3IgZXhhbXBsZSwgaW46CisgICAgICAgICAgKGZvbyAoZm9vIChmb28gKGZvbyAoZm9vKSkpKSksIHRoZSBpbm5lcm1vc3QgKGZvbykgaXMgYXQgZGVwdGgKKyAgICAgICAgICA1LgorCisgICBIZWxwLCBjb21wbGV0aW9uLCBhbmQgc3ludGF4IGNoZWNraW5nIGFyZSBub3QgYXZhaWxhYmxlIHdpdGhpbiBhbgorICAgUy1FeHByZXNzaW9uLiBJZiB5b3UgdHlwZSA/IHdpdGhpbiBhbiBTLUV4cHJlc3Npb24sIGl0IHNheXM6CisKKyAgQy1LZXJtaXQ+KD8gUy1FeHByZXNzaW9uICgiaGVscCBzZXhwIiBmb3IgZGV0YWlscykKKworICAgQXMgaXQgc2F5cywgdHlwaW5nICJoZWxwIHNleHAiIHdpbGwgZGlzcGxheSBhIGJyaWVmIGhlbHAgdGV4dC4KKworICAgVGhlIFNIT1cgU0VYUFJFU1NJT04gY29tbWFuZCBkaXNwbGF5cyBjdXJyZW50IFNFVCBTRVhQUkVTU0lPTiBzZXR0aW5ncworICAgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24uCisKKyAgIFsgWzQ5OF1Ub3AgXSBbIFs0OTldQ29udGVudHMgXSBbIFs1MDBdQy1LZXJtaXQgSG9tZSBdIFsgWzUwMV1LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDkuNC4gU3VtbWFyeSBvZiBCdWlsdC1pbiBDb25zdGFudHMgYW5kIE9wZXJhdG9ycworCisgICBUaHJlZSBjb25zdGFudHMgYXJlIGJ1aWx0IGluOgorCisgICAgICogUEksIHdob3NlIHZhbHVlIGlzIHRoZSB2YWx1ZSBvZiBwaSAodGhlIHF1b3RpZW50IG9mIGNpcmN1bWZlcmVuY2UKKyAgICAgICBvZiBhbnkgY2lyY2xlIGFuZCBpdHMgZGlhbWV0ZXIsIDMuMTQxNTkyNjUzLi4uKSB0byB0aGUgdW5kZXJseWluZworICAgICAgIG1hY2hpbmUncyBwcmVjaXNpb247CisgICAgICogVCwgd2hpY2ggYWx3YXlzIGhhcyB0aGUgdmFsdWUgMSwgd2hpY2ggc2lnbmlmaWVzIHRydXRoIGluIEtlcm1pdAorICAgICAgIGxvZ2ljYWwgZXhwcmVzc2lvbnMgb3IgUy1FeHByZXNzaW9uczsKKyAgICAgKiBOSUwsIHdoaWNoIGFsd2F5cyBoYXMgdGhlIGVtcHR5IHZhbHVlLCBhbmQgY2FuIHNlcnZlIGFzIGEgRmFsc2UKKyAgICAgICB0cnV0aCB2YWx1ZS4KKworICAgVGhlc2UgY29uc3RhbnRzIGFyZSBzcGVjaWZpYyB0byBTLUV4cHJlc3Npb25zIGFuZCBhcmUgbm90IHZpc2libGUKKyAgIG91dHNpZGUgdGhlbS4gVGhleSBtYXkgbm90IGJlIHVzZWQgYXMgdGhlIHRhcmdldCBvZiBhbiBhc3NpZ25tZW50LiBTbywKKyAgIGZvciBleGFtcGxlOgorCisgIChzZXRxIHQgMCkgICBGYWlscworICBhc3NpZ24gdCAwICAgU3VjY2VlZHMgYnV0IHRoaXMgaXMgbm90IHRoZSBzYW1lIFQhCisKKyAgIEUgKHRoZSBiYXNlIG9mIG5hdHVyYWwgbG9nYXJpdGhtcywgMi43MTgyODE4MTg0Li4uKSBpcyBub3QgYnVpbHQgaW4KKyAgIHNpbmNlIGl0IGlzIG5vdCBpbnRyaW5zaWMgaW4gbW9zdCBMaXNwIGRpYWxlY3RzLiBJZiB5b3Ugd2FudCBFIHRvIGJlCisgICB0aGUgYmFzZSBvZiBuYXR1cmFsIGxvZ2FyaXRobXMgeW91IGNhbjoKKworICAoc2V0cSBlIChleHAgMSkpCisKKyAgIE9wZXJhdG9ycyBhcmUgZWl0aGVyIHN5bWJvbHMgKHN1Y2ggYXMgIisiKSBvciB3b3Jkcy4gV29yZHMgbXVzdCBiZQorICAgc3BlbGxlZCBvdXQgaW4gZnVsbCwgbm90IGFiYnJldmlhdGVkLiBEaWZmZXJlbmNlcyBvZiBhbHBoYWJldGljIGNhc2UKKyAgIGFyZSBpZ25vcmVkLgorCisgICBUaGUgbW9zdCBiYXNpYyBvcGVyYXRpb24gaW4gUy1FeHByZXNzaW9ucyBpcyBldmFsdWF0aW9uOgorCisgICBFVkFMIFsgcy1leHByZXNzaW9uIG9yIHZhcmlhYmxlIG9yIG51bWJlciBbIGFub3RoZXIgWyBhbm90aGVyIC4uLiBdIF0KKyAgICAgICAgICBdCisgICAgICAgICAgRXZhbHVhdGVzIGl0cyBvcGVyYW5kcyBhbmQgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGxhc3Qgb25lCisgICAgICAgICAgZXZhbHVhdGVkLiBFeGFtcGxlczoKKworICAoZXZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgKGV2YWwgMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgIChldmFsIGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgYQorICAoZXZhbCAoKyAxIGEpKSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIGErMQorICAoZXZhbCAoc2V0cSBhIDEpIChzZXRxIGIgKCsgYSAwLjUpKSkgIHZhbHVlIG9mIGIgKD0gYSswLjUpCisKKyAgICAgICAgICBZb3UgY2FuIHVzZSAiLiIgYXMgYSBzaG9ydGhhbmQgZm9yIEVWQUw6CisKKyAgKC4pCisgICguIDEpCisgICguIGEpCisgICguICgrIDEgYSkpCisgICguIChzZXRxIGEgMSkgKHNldHEgYiAoKyBhIDAuNSkpKQorCisgICBPcHBvc2l0ZSBvZiBFVkFMIGlzIHRoZSBvcGVyYXRvciB0aGF0IHN1cHByZXNzZXMgZXZhbHVhdGlvbiBvZiBpdHMKKyAgIG9wZXJhbmQ6CisKKyAgIFFVT1RFIGl0ZW0KKyAgICAgICAgICBUaGUgdmFsdWUgKHF1b3RlIGl0ZW0pIGlzICJpdGVtIi4gSWYgdGhlIGl0ZW0gaXMgaXRzZWxmIGFuCisgICAgICAgICAgUy1FeHByZXNzaW9uLCB0aGUgcmVzdWx0IGlzIHRoZSBTLUV4cHJlc3Npb24gd2l0aCB0aGUgb3V0ZXIKKyAgICAgICAgICBwYXJlbnRoZXNlcyBzdHJpcHBlZC4gRXhhbXBsZXM6CisKKyAgKHF1b3RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWxsZWdhbCkKKyAgKHF1b3RlIGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhCisgIChxdW90ZSBoZWxsbykgICAgICAgICAgICAgICAgICAgICAgICAgaGVsbG8KKyAgKHF1b3RlICh0aGlzIGlzIGEgc3RyaW5nKSkgICAgICAgICAgICB0aGlzIGlzIGEgc3RyaW5nCisgIChxdW90ZSB0aGlzIGlzIGEgc3RyaW5nKSAgICAgICAgICAgICAgKGlsbGVnYWwpCisKKyAgICAgICAgICBBIHNob3J0aGFuZCBub3RhdGlvbiBpcyBhbHNvIGFjY2VwdGVkIGZvciBxdW90aW5nOgorICAgICAgICAgICdhIGlzIGVxdWl2YWxlbnQgdG8gKHF1b3RlIGEpLiBBbmQgdGhlcmVmb3JlOgorICAgICAgICAgICcoYSBiIGMpIGlzIGVxdWl2YWxlbnQgdG8gKHF1b3RlIChhIGIgYykpLgorICAgICAgICAgIE1vcmUgYWJvdXQgcXVvdGluZyBpbiBbNTAyXVNlY3Rpb24gOS44LgorCisgICBTVFJJTkcgaXRlbQorICAgICAgICAgIElzIGEgY29tYmluYXRpb24gb2YgRVZBTCBhbmQgUVVPVEUuIEl0IGV2YWx1YXRlcyB0aGUgaXRlbSBhcyBhbgorICAgICAgICAgIFMtRXhwcmVzc2lvbiwgYW5kIHRoZW4gcHV0cyBxdW90ZXMgYXJvdW5kIHRoZSByZXN1bHQgKG1vcmUKKyAgICAgICAgICBhYm91dCB0aGlzIGluIFs1MDNdU2VjdGlvbiA5LjgpLgorCisgICBUaGUgZm9sbG93aW5nIG9wZXJhdG9ycyBhc3NpZ24gdmFsdWVzIHRvIHZhcmlhYmxlczoKKworICAgU0VUUSBbIHZhcmlhYmxlIFsgdmFsdWUgWyB2YXJpYWJsZSBbIHZhbHVlIFsgLi4uIF0gXSBdIF0gXQorICAgICAgICAgIEFwcGxpZXMgdG8gZ2xvYmFsIHZhcmlhYmxlcy4gRm9yIGVhY2ggdmFyaWFibGUgZ2l2ZW46IGlmIGEKKyAgICAgICAgICB2YWx1ZSBpcyBub3QgZ2l2ZW4sIHRoZSB2YXJpYWJsZSBpcyB1bmRlZmluZWQuIElmIGEgdmFsdWUgaXMKKyAgICAgICAgICBnaXZlbiwgYXNzaWducyB0aGUgdmFsdWUgdG8gdGhlIHZhcmlhYmxlLiBUaGUgdmFsdWUgbWF5IGJlIGEKKyAgICAgICAgICBudW1iZXIsIGEgdmFyaWFibGUsIG9yIGFueXRoaW5nIHRoYXQgcmVzb2x2ZXMgdG8gYSBudW1iZXIKKyAgICAgICAgICBpbmNsdWRpbmcgYW4gUy1FeHByZXNzaW9uLiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdAorICAgICAgICAgIGFzc2lnbm1lbnQuIEV4YW1wbGVzOgorCisgIChzZXRxKSAgICAgICAgICAgICBEb2VzIG5vdGhpbmcsIHJldHVybnMgTklMLgorICAoc2V0cSBhKSAgICAgICAgICAgVW5kZWZpbmVzIGEsIHJldHVybnMgTklMLgorICAoc2V0cSBhIDEpICAgICAgICAgQXNzaWducyAxIHRvIGEsIHJldHVybnMgMS4KKyAgKHNldHEgYSAxIGIgMikgICAgIEFzc2lnbnMgMSB0byBhLCAyIHRvIGIsIHJldHVybnMgMi4KKyAgKHNldHEgYSAxIGIgMiBjKSAgIEFzc2lnbnMgMSB0byBhLCAyIHRvIGIsIHVuZGVmaW5lcyBjLCByZXR1cm5zIE5JTC4KKworICAgVG8gdW5kZWZpbmUgYSB2YXJpYWJsZSB0aGF0IGlzIG5vdCB0aGUgZmluYWwgb25lIGluIHRoZSBsaXN0LCBnaXZlIGl0CisgICBhIHZhbHVlIG9mICIoKSIgb3IgTklMOgorCisgIChzZXRxIGEgKCkgYiAyKSAgICBVbmRlZmluZXMgYSwgYXNzaWducyAyIHRvIGIsIHJldHVybnMgMi4KKyAgKHNldHEgYSBuaWwgYiAyKSAgIERpdHRvLgorCisgICBOb3RlIHRoYXQgYSB2YXJpYWJsZSBjYW4gYmUgdXNlZCByaWdodCBhd2F5IG9uY2UgaXQgaGFzIGEgdmFsdWU6CisKKyAgKHNldHEgYSAxIGIgYSkgICAgIEFzc2lnbnMgMSB0byBhLCB0aGUgdmFsdWUgb2YgYSAoMSkgdG8gYiwgcmV0dXJucyAxLgorCisgICBUaGUgcmVzdWx0cyBvZiBTRVRRICh3aGVuIHVzZWQgd2l0aCBtYWNybyBuYW1lcykgY2FuIGJlIGNoZWNrZWQKKyAgIGNvbnZlbmllbnRseSB3aXRoIFNIT1cgTUFDUk8sIGUuZzoKKworICBzaG93IG1hYyBhIGIgYworCisgICBMRVQgWyB2YXJpYWJsZSBbIHZhbHVlIFsgdmFyaWFibGUgWyB2YWx1ZSBbIC4uLiBdIF0gXSBdIF0KKyAgICAgICAgICBMaWtlIFNFVFEsIGJ1dCBhcHBsaWVzIHRvIGxvY2FsIHZhcmlhYmxlcy4gTm90ZSB0aGF0ICJsb2NhbCIgaXMKKyAgICAgICAgICB1c2VkIGluIHRoZSBLZXJtaXQgc2Vuc2UsIG5vdCB0aGUgTGlzcCBzZW5zZTsgaXQgYXBwbGllcyB0byB0aGUKKyAgICAgICAgICBjdXJyZW50IEtlcm1pdCBjb21tYW5kIGxldmVsLCBub3QgdG8gdGhlIGN1cnJlbnQgUy1FeHByZXNzaW9uLgorCisgICBJZiB5b3Ugd2FudCB0byB1c2UgU0VUUSBvciBMRVQgdG8gYXNzaWduIGEgdmFsdWUgdG8gYSBiYWNrc2xhc2gKKyAgIHZhcmlhYmxlIHN1Y2ggYXMgXCVhIG9yIFwmYVsyXSwgeW91IG11c3QgZG91YmxlIHRoZSBiYWNrc2xhc2g6CisKKyAgKHNldHEgXFwlYSAzKQorICAoc2V0cSBcXCViICgrIFwlYSAxKSkKKyAgKHNldHEgXFwmYVsyXSAoc2V0cSAoXFwlYyAoKyBcJWEgXCViKSkpKQorCisgICBJbiBvdGhlciB3b3JkczoKKworICAgICAqIERvdWJsZSB0aGUgYmFja3NsYXNoIHdoZW4geW91IHdhbnQgdG8gaW5kaWNhdGUgdGhlIHZhcmlhYmxlJ3MKKyAgICAgICBOQU1FOworICAgICAqIERvbid0IGRvdWJsZSB0aGUgYmFja3NsYXNoIHdoZW4geW91IHdhbnQgaXRzIFZBTFVFLgorCisgICBTZWUgWzUwNF1TZWN0aW9uIDkuNiBmb3IgYSBmdWxsZXIgZXhwbGFuYXRpb24gb2YgdmFyaWFibGUgc3ludGF4IGFuZAorICAgc2NvcGUuCisKKyAgIEhlcmUncyBhIHN1bW1hcnkgdGFibGUgb2YgYXJpdGhtZXRpYyBvcGVyYXRvcnM7IGluIHRoZSBleGFtcGxlcywgYSBpcworICAgMiBhbmQgYiBpcyAtMS4zOgorCisgIE9wZXJhdG9yICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlICAgICAgICAgICBSZXN1bHQKKyAgKyAgICAgICAgIEFkZHMgYWxsIG9wZXJhbmRzICgwIG9yIG1vcmUpICAgICAgICAgICgrIGEgYikgICAgICAgICAgIDAuNworICAtICAgICAgICAgU3VidHJhY3RzIGFsbCBvcGVyYW5kcyAoMCBvciBtb3JlKSAgICAgKC0gOSA1IDIgMSkgICAgICAgMQorICAqICAgICAgICAgTXVsdGlwbGllcyBhbGwgb3BlcmFuZHMgKDAgb3IgbW9yZSkgICAgKCogYSAoKyBiIDEpIDMpICAtMS44MAorICAvICAgICAgICAgRGl2aWRlcyBhbGwgb3BlcmFuZHMgKDIgb3IgbW9yZSkgICAgICAgKC8gYiBhIDIpICAgICAgICAtMC4zMjUKKyAgXiAgICAgICAgIFJhaXNlIGdpdmVuIG51bWJlciB0byBnaXZlbiBwb3dlciAgICAgICheIDMgMikgICAgICAgICAgIDkKKyAgKysgICAgICAgIEluY3JlbWVudHMgdmFyaWFibGVzICAgICAgICAgICAgICAgICAgICgrKyBhIDEuMikgICAgICAgIDMuMgorICAtLSAgICAgICAgRGVjcmVtZW50cyB2YXJpYWJsZXMgICAgICAgICAgICAgICAgICAgKC0tIGEpICAgICAgICAgICAgMQorICBBQlMgICAgICAgQWJzb2x1dGUgdmFsdWUgb2YgMSBvcGVyYW5kICAgICAgICAgICAgKGFicyAoKiBhIGIgMykpICAgNy44CisgIE1BWCAgICAgICBNYXhpbXVtIG9mIGFsbCBvcGVyYW5kcyAoMSBvciBtb3JlKSAgICAobWF4IDEgMiAzIDQpICAgICA0CisgIE1JTiAgICAgICBNaW5pbXVtIG9mIGFsbCBvcGVyYW5kcyAoMSBvciBtb3JlKSAgICAobWluIDEgMiAzIDQpICAgICAxCisgIE1PRCAoJSkgICBNb2R1bHVzIG9mIGFsbCBvcGVyYW5kcyAoMSBvciBtb3JlKSAgICAobW9kIDcgNCAyKSAgICAgICAxCisgIEZMT0FUICAgICBDb252ZXJ0IGFuIGludGVnZXIgdG8gZmxvYXRpbmctcG9pbnQgICAoZmxvYXQgMSkgICAgICAgICAxLjAKKyAgVFJVTkNBVEUgIEludGVnZXIgcGFydCBvZiBmbG9hdGluZy1wb2ludCBvcGVyYW5kICh0cnVuY2F0ZSAzLjMzMykgIDMKKyAgQ0VJTElORyAgIENlaWxpbmcgb2YgZmxvYXRpbmctcG9pbnQgb3BlcmFuZCAgICAgIChjZWlsaW5nIDEuMjUpICAgIDIKKyAgRkxPT1IgICAgIEZsb29yIG9mIGZsb2F0aW5nLXBvaW50IG9wZXJhbmQgICAgICAgIChmbG9vciAxLjI1KSAgICAgIDEKKyAgUk9VTkQgICAgIE9wZXJhbmQgcm91bmRlZCB0byBuZWFyZXN0IGludGVnZXIgICAgIChyb3VuZCAxLjc1KSAgICAgIDIKKyAgU1FSVCAgICAgIFNxdWFyZSByb290IG9mIDEgb3BlcmFuZCAgICAgICAgICAgICAgIChzcXJ0IDIpICAgICAgICAgIDEuNDE0Li4KKyAgRVhQICAgICAgIGUgKDIuNzE4MjguLikgdG8gdGhlIGdpdmVuIHBvd2VyICAgICAgIChleHAgLTEpICAgICAgICAgIDAuMzY3Li4KKyAgU0lOICAgICAgIFNpbmUgb2YgYW5nbGUtaW4tcmFkaWFucyAgICAgICAgICAgICAgIChzaW4gKC8gcGkgMikpICAgIDEuMAorICBDT1MgICAgICAgQ29zaW5lIG9mIGFuZ2xlLWluLXJhZGlhbnMgICAgICAgICAgICAgKGNvcyBwaSkgICAgICAgICAtMS4wCisgIFRBTiAgICAgICBUYW5nZW50IG9mIGFuZ2xlLWluLXJhZGlhbnMgICAgICAgICAgICAodGFuIHBpKSAgICAgICAgICAwLjAKKyAgTE9HICAgICAgIE5hdHVyYWwgbG9nIChiYXNlIGUpIG9mIGdpdmVuIG51bWJlciAgIChsb2cgMi43MTgzKSAgICAgIDEuMDAwLi4KKyAgTE9HMTAgICAgIExvZyBiYXNlIDEwIG9mIGdpdmVuIG51bWJlciAgICAgICAgICAgIChsb2cxMCAxMDAwKSAgICAgIDMuMAorCisgICBUaGUgKysgYW5kIC0tIG9wZXJhdG9ycyBhcmUgYWxzbyBhc3NpZ25tZW50IG9wZXJhdG9ycyBhbmQgd29yayBqdXN0CisgICBsaWtlIFNFVFEgYW5kIExFVCBpbiB0aGVpciBpbnRlcnByZXRhdGlvbnMgb2Ygb3BlcmF0b3JzIGFuZCBvcGVyYW5kcywKKyAgIGJ1dDoKKworICAgICAqIEVhY2ggdGFyZ2V0IHZhcmlhYmxlIG11c3QgYWxyZWFkeSBiZSBkZWZpbmVkIGFuZCBoYXZlIGEgbnVtZXJpYworICAgICAgIHZhbHVlOworICAgICAqIFRoZSBhc3NpZ25tZW50IHZhbHVlIGlzIHRoZSBhbW91bnQgYnkgd2hpY2ggdG8gaW5jcmVtZW50IG9yCisgICAgICAgZGVjcmVtZW50IHRoZSB2YXJpYWJsZS4KKyAgICAgKiBJZiBhbiBhc3NpZ25tZW50IHZhbHVlIGlzIG5vdCBnaXZlbiwgMSBpcyB1c2VkLgorCisgICBJZiB5b3UgaW5jbHVkZSBtb3JlIHRoYW4gb25lIHZhcmlhYmxlLXZhbHVlIHBhaXIgaW4gYSArKyBvciAtLQorICAgZXhwcmVzc2lvbiwgZXZlcnkgdmFyaWFibGUgKGV4Y2VwdCwgb3B0aW9uYWxseSwgdGhlIGxhc3QpIG11c3QgYmUKKyAgIGZvbGxvd2VkIGJ5IGEgdmFsdWUuIEV4YW1wbGVzOgorCisgICgrKyBhKSAgICAgICAgICAgICAgICBFcXVpdmFsZW50IHRvIChzZXRxIGEgKCsgYSAxKSkgYW5kIHRvICgrKyBhIDEpCisgICgrKyBhIDIpICAgICAgICAgICAgICBFcXVpdmFsZW50IHRvIChzZXRxIGEgKCsgYSAyKSkKKyAgKC0tIGEgKCogMiBwaSkpICAgICAgIEVxdWl2YWxlbnQgdG8gKHNldHEgYSAoLSBhICgqIDIgcGkpKSkKKyAgKCsrIGEgMSBiIDEgYyAxIGQpICAgIEVxdWl2YWxlbnQgdG8gZm91ciBTRVRRcyBpbmNyZW1lbnRpbmcgYSxiLGMsZCBieSAxLgorCisgICBBbm90aGVyIGdyb3VwIG9mIG9wZXJhdG9ycyBmb3JtcyB0aGUgcHJlZGljYXRlcy4gVGhlc2UgcmV0dXJuIGEgInRydXRoCisgICB2YWx1ZSIsIGluIHdoaWNoIDAgKG9yIE5JTCkgaXMgZmFsc2UsIGFuZCAxIG9yIGFueSBvdGhlciBub256ZXJvCisgICBudW1iZXIgaXMgdHJ1ZS4KKworICBPcGVyYXRvciAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZSAgICAgICAgICAgUmVzdWx0CisgID0gKG9yID09KSBPcGVyYW5kcyBhcmUgZXF1YWwgICAgICAgICAgICAgICAgICAgICAoPSAxIDEuMCkgICAgICAgICAxCisgICE9ICAgICAgICBPcGVyYW5kcyBhcmUgbm90IGVxdWFsICAgICAgICAgICAgICAgICAoIT0gMSAxLjApICAgICAgICAwCisgIDwgICAgICAgICBPcGVyYW5kcyBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIgICAoPCAxIDIgMykgICAgICAgICAxCisgIDw9ICAgICAgICBPcGVyYW5kcyBpbiBhc2NlbmRpbmcgb3JkZXIgICAgICAgICAgICAoPD0gMSAxIDIgMykgICAgICAxCisgID4gICAgICAgICBPcGVyYW5kcyBpbiBzdHJpY3RseSBkZXNjZW5kaW5nIG9yZGVyICAoPiAzIDIgMSkgICAgICAgICAxCisgID49ICAgICAgICBPcGVyYW5kcyBpbiBkZXNjZW5kaW5nIG9yZGVyICAgICAgICAgICAoPD0gMyAzIDIgMSkgICAgICAxCisgIEFORCAoJiYpICBPcGVyYW5kcyBhcmUgYWxsIHRydWUgICAgICAgICAgICAgICAgICAoYW5kIDEgMSAxIDEgMCkgICAwCisgIE9SICAofHwpICBBdCBsZWFzdCBvbmUgb3BlcmFuZCBpcyB0cnVlICAgICAgICAgICAob3IgMSAxIDEgMSAwKSAgICAxCisgIFhPUiAgICAgICBMb2dpY2FsIEV4Y2x1c2l2ZSBPUiAgICAgICAgICAgICAgICAgICAoeG9yIDMgMSkgICAgICAgICAwCisgIE5PVCAoISkgICBSZXZlcnNlcyB0cnV0aCB2YWx1ZSBvZiBvcGVyYW5kICAgICAgICAobm90IDMpICAgICAgICAgICAwCisKKyAgIFRoZSBFeGNsdXNpdmUgT1Igb2YgdHdvIHZhbHVlcyBpcyB0cnVlIGlmIG9uZSB2YWx1ZSBpcyB0cnVlIGFuZCB0aGUKKyAgIG90aGVyIHZhbHVlIGlzIGZhbHNlLgorCisgICBBbmQgYW5vdGhlciBncm91cCBvcGVyYXRlcyBvbiBiaXRzIHdpdGhpbiBhbiBpbnRlZ2VyIHdvcmQ6CisKKyAgT3BlcmF0b3IgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGUgICAgICAgICAgIFJlc3VsdAorICAmICAgICAgICAgQml0d2lzZSBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCYgNyAyKSAgICAgICAgICAgMgorICB8ICAgICAgICAgQml0d2lzZSBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHwgMSAyIDMgNCkgICAgICAgNworICAjICAgICAgICAgQml0d2lzZSBFeGNsdXNpdmUgT1IgICAgICAgICAgICAgICAgICAgKCMgMyAxKSAgICAgICAgICAgMgorICB+ICAgICAgICAgUmV2ZXJzZXMgYWxsIGJpdHMgICAgICAgICAgICAgICAgICAgICAgKH4gMykgICAgICAgICAgICAtNAorCisgICBUaGVzZSBvcGVyYXRvcnMgY29lcmNlIHRoZWlyIG9wZXJhbmRzIHRvIGludGVnZXIgYnkgdHJ1bmNhdGlvbiBpZgorICAgbmVjZXNzYXJ5LiBUaGUgcmVzdWx0IG9mIGJpdCByZXZlcnNhbCBpcyBoYXJkd2FyZSBkZXBlbmRlbnQuCisKKyAgIFRoZSBmaW5hbCBjYXRlZ29yeSBvZiBvcGVyYXRvciB3b3JrcyBvbiB0cnV0aCB2YWx1ZXM6CisKKyAgT3BlcmF0b3IgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGUgICAgICAgICAgIFJlc3VsdAorICBJRiAgICAgICAgQ29uZGl0aW9uYWwgZXZhbHVhdGlvbiAgICAgICAgICAgICAgICAgKGlmICgxKSAyIDMpICAgICAgMgorCisgICBJRiAocHJlZGljYXRlKSAoczEpIFsgKHMyKSBdCisgICAgICAgICAgVGhlIElGIG9wZXJhdG9yIGlzIHNpbWlsYXIgdG8gS2VybWl0J3MgSUYgY29tbWFuZC4gSWYgdGhlCisgICAgICAgICAgcHJlZGljYXRlIGlzIHRydWUgKGkuZS4gZXZhbHVhdGVzIHRvIGEgbm9uemVybyBudW1iZXIpLCB0aGUKKyAgICAgICAgICBmaXJzdCBTLUV4cHJlc3Npb24gKHMxKSBpcyBldmFsdWF0ZWQgYW5kIGl0cyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgICAgICAgICBPdGhlcndpc2UsIGlmIChzMikgaXMgZ2l2ZW4sIGl0IGlzIGV2YWx1YXRlZCBhbmQgaXRzIHZhbHVlCisgICAgICAgICAgcmV0dXJuZWQ7IGlmIChzMikgaXMgbm90IGdpdmVuLCBub3RoaW5nIGhhcHBlbnMgYW5kIHRoZSBOSUwKKyAgICAgICAgICAoZW1wdHkpIHZhbHVlIGlzIHJldHVybmVkLgorCisgICBZb3UgY2FuIGdyb3VwIG11bHRpcGxlIGV4cHJlc3Npb25zIGluIHRoZSBzMSBhbmQgczIgZXhwcmVzc2lvbnMgdXNpbmcKKyAgIEVWQUwgKG9yICIuIik6CisKKyAgKGlmICg8IGEgMCkgKGV2YWwgKHNldHEgeCAwKSAoc2V0cSB5IDApKSAoZXZhbCAoc2V0cSB4IGEpIChzZXRxIHkgYikpKQorCisgICBvciBlcXVpdmFsZW50bHk6CisKKyAgKGlmICg8IGEgMCkgKC4gKHNldHEgeCAwKSAoc2V0cSB5IDApKSAoLiAoc2V0cSB4IGEpIChzZXRxIHkgYikpKQorCisgICBFYWNoIG9wZXJhdG9yIGhhcyBpdHMgb3duIHJlcXVpcmVtZW50IGFzIHRvIG51bWJlciBhbmQgdHlwZSBvZgorICAgb3BlcmFuZHMuIEluIHRoZSBmb2xsb3dpbmcgdGFibGUsICJudW1iZXIiIG1lYW5zIGFueSBraW5kIG9mIG51bWJlciAtLQorICAgaW50ZWdlciBvciBmbG9hdGluZy1wb2ludCAtLSBvciBhIHZhcmlhYmxlLCBmdW5jdGlvbiwgbWFjcm8sIG9yCisgICBTLUV4cHJlc3Npb24gdGhhdCByZXR1cm5zIGEgbnVtYmVyOyAidm5hbWUiIG1lYW5zIHZhcmlhYmxlIG5hbWUsCisgICAiZnBudW1iZXIiIG1lYW5zIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIChvciBhbnl0aGluZyB0aGF0IHJlc29sdmVzIHRvCisgICBvbmUpLCBhbmQgImludGVnZXIiIG1lYW5zIGludGVnZXIgKG9yIGFueXRoaW5nIHRoYXQgcmVzb2x2ZXMgdG8gb25lKS4KKyAgICJ0cnV0aHZhbHVlIiBtZWFucyBhbnl0aGluZyB0aGF0IHJlc29sdmVzIHRvIGEgdmFsdWUgb2YgemVybyBvciBhbgorICAgZW1wdHkgdmFsdWUgKHdoaWNoIGluZGljYXRlcyBmYWxzZSkgb3IgYSBub256ZXJvIHZhbHVlICh3aGljaAorICAgaW5kaWNhdGVzIHRydWUpLiAiYW55IiBtZWFucyBhbnkga2luZCBvZiB2YWx1ZSwgaW5jbHVkaW5nIG5vbmUgYXQgYWxsLgorCisgIE9wZXJhdG9yICBOdW1iZXIgb2Ygb3BlcmFuZHMgICBUeXBlIG9mIG9wZXJhbmRzICAgIFJldHVybnMKKyAgRVZBTCAgKC4pIDAgb3IgbW9yZSAgICAgICAgICAgIFMtRXhwcmVzc2lvbiAgICAgICAgTGFzdCB2YWx1ZSAoZGVmYXVsdCBOSUwpCisgIFNUUklORyAgICAxICAgICAgICAgICAgICAgICAgICBTLUV4cHJlc3Npb24gICAgICAgIHN0cmluZworICBRVU9URSAoJykgMSAgICAgICAgICAgICAgICAgICAgd29yZCAgICAgICAgICAgICAgICBzdHJpbmcKKyAgU0VUUSAgICAgIDAgb3IgbW9yZSAgICAgICAgICAgIHZuYW1lIHZhbHVlIHBhaXJzICAgTGFzdCB2YWx1ZSAoZGVmYXVsdCBOSUwpCisgIExFVCAgICAgICAwIG9yIG1vcmUgICAgICAgICAgICB2bmFtZSB2YWx1ZSBwYWlycyAgIExhc3QgdmFsdWUgKGRlZmF1bHQgTklMKQorICArICAgICAgICAgMCBvciBtb3JlICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICBudW1iZXIgICAgIChkZWZhdWx0IDApCisgIC0gICAgICAgICAwIG9yIG1vcmUgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIG51bWJlciAgICAgKGRlZmF1bHQgMCkKKyAgKiAgICAgICAgIDAgb3IgbW9yZSAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgbnVtYmVyICAgICAoc2VlIG5vdGUgKDEpKQorICAvICAgICAgICAgMiBvciBtb3JlICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICBudW1iZXIKKyAgXiAgICAgICAgIDIgb3IgbW9yZSAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgbnVtYmVyCisgICsrICAgICAgICAxIG9yIG1vcmUgICAgICAgICAgICB2bmFtZSB2YWx1ZSBwYWlycyAgIFJlc3VsdCBvZiBsYXN0IGluY3JlbWVudAorICAtLSAgICAgICAgMSBvciBtb3JlICAgICAgICAgICAgdm5hbWUgdmFsdWUgcGFpcnMgICBSZXN1bHQgb2YgbGFzdCBkZWNyZW1lbnQKKyAgQUJTICAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgbnVtYmVyCisgIE1BWCAgICAgICAxIG9yIG1vcmUgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIG51bWJlcgorICBNSU4gICAgICAgMSBvciBtb3JlICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICBudW1iZXIKKyAgTU9EICglKSAgIDIgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgbnVtYmVyCisgIEZMT0FUICAgICAxICAgICAgICAgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIGZwbnVtYmVyCisgIFRSVU5DQVRFICAxICAgICAgICAgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIGludGVnZXIKKyAgQ0VJTElORyAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgaW50ZWdlcgorICBGTE9PUiAgICAgMSAgICAgICAgICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICBpbnRlZ2VyCisgIFJPVU5EICAgICAxICAgICAgICAgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIGludGVnZXIKKyAgU1FSVCAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgZnBudW1iZXIKKyAgRVhQICAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgZnBudW1iZXIKKyAgU0lOICAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgZnBudW1iZXIKKyAgQ09TICAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgZnBudW1iZXIKKyAgVEFOICAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgZnBudW1iZXIKKyAgTE9HICAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgZnBudW1iZXIKKyAgTE9HMTAgICAgIDEgICAgICAgICAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgZnBudW1iZXIKKyAgPSAoPT0pICAgIDEgb3IgbW9yZSAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgdHJ1dGh2YWx1ZQorICAhPSAgICAgICAgMSBvciBtb3JlICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICB0cnV0aHZhbHVlCisgIDwgICAgICAgICAxIG9yIG1vcmUgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIHRydXRodmFsdWUKKyAgPD0gICAgICAgIDEgb3IgbW9yZSAgICAgICAgICAgIG51bWJlciAgICAgICAgICAgICAgdHJ1dGh2YWx1ZQorICA+ICAgICAgICAgMSBvciBtb3JlICAgICAgICAgICAgbnVtYmVyICAgICAgICAgICAgICB0cnV0aHZhbHVlCisgID49ICAgICAgICAxIG9yIG1vcmUgICAgICAgICAgICBudW1iZXIgICAgICAgICAgICAgIHRydXRodmFsdWUKKyAgQU5EICgmJikgIDEgb3IgbW9yZSAgICAgICAgICAgIHRydXRodmFsdWUgICAgICAgICAgdHJ1dGh2YWx1ZQorICBPUiAgKHx8KSAgMSBvciBtb3JlICAgICAgICAgICAgdHJ1dGh2YWx1ZSAgICAgICAgICB0cnV0aHZhbHVlCisgIFhPUiAgICAgICAyICAgICAgICAgICAgICAgICAgICB0cnV0aHZhbHVlICAgICAgICAgIHRydXRodmFsdWUKKyAgTk9UICghKSAgIDEgICAgICAgICAgICAgICAgICAgIHRydXRodmFsdWUgICAgICAgICAgdHJ1dGh2YWx1ZQorICAmICAgICAgICAgMSBvciBtb3JlICAgICAgICAgICAgbnVtYmVyIChzZWUgbm90ZSAyKSBpbnRlZ2VyCisgIHwgICAgICAgICAxIG9yIG1vcmUgICAgICAgICAgICBudW1iZXIgKHNlZSBub3RlIDIpIGludGVnZXIKKyAgIyAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgIG51bWJlciAoc2VlIG5vdGUgMikgaW50ZWdlcgorICB+ICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgbnVtYmVyIChzZWUgbm90ZSAyKSBpbnRlZ2VyCisgIElGICAgICAgICAyIG9yIDMgICAgICAgICAgICAgICB0cnV0aHZhbHVlLGFueSxhbnkgIGFueQorCisgICBPcGVyYXRvcnMgdGhhdCBkb24ndCByZXF1aXJlIGFueSBhcmd1bWVudHMgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlcworICAgc2hvd24uCisKKyAgICAxLiBUaGUgdmFsdWUgb2YgIioiLCB3aGVuIHVzZWQgYXMgYW4gb3BlcmF0b3IsIGlzIGluaXRpYWxseSAiMSIgYW5kCisgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBtb3N0IHJlY2VudCBTLUV4cHJlc3Npb24gdGhlcmVhZnRlciwgYXMgaW4gRnJhbnoKKyAgICAgICBMaXNwLiBUaGlzIGlzIGhhbmR5IHdoZW4gZG9pbmcgYSBzZXJpZXMgb2YgY2FsY3VsYXRpb25zIGJ5IGhhbmQ6CisgIEMtS2VybWl0PigqIDEzMjcyLjQyIDAuNDApCisgICA1MzA4Ljk2OAorICBDLUtlcm1pdD4oLyAqIDIpCisgICAyNjU0LjQ4NDAKKyAgQy1LZXJtaXQ+CisgICAgMi4gVGhlIGJpdHdpc2Ugb3BlcmF0b3JzIGNvZXJjZSB0aGVpciBvcGVyYW5kcyB0byBpbnRlZ2VyIGJ5CisgICAgICAgdHJ1bmNhdGlvbi4KKworICAgWyBbNTA1XVRvcCBdIFsgWzUwNl1Db250ZW50cyBdIFsgWzUwN11DLUtlcm1pdCBIb21lIF0gWyBbNTA4XUtlcm1pdAorICAgSG9tZSBdCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOS41LiBWYXJpYWJsZXMKKworICAgQXMgbm90ZWQgZWxzZXdoZXJlIGluIHRoaXMgZGlzY3Vzc2lvbiwgYWxsIGJhY2tzbGFzaCBpdGVtcyAodmFyaWFibGVzCisgICBzdWNoIGFzIFwlYSwgbWFjcm8gcGFyYW1ldGVycyBzdWNoIGFzIFwlMSwgYXJyYXkgZWxlbWVudHMgc3VjaCBhcworICAgXCZhW1wlaV0sIGJ1aWx0LWluIHZhcmlhYmxlcyBzdWNoIGFzIFx2KG5kYXRlKSwgYnVpbHQtaW4gZnVuY3Rpb25zCisgICBzdWNoIGFzIFxmam9pbigpLCBtYWNybyBuYW1lcyBlbmNsb3NlZCBpbiBcbSgpLCBccygpLCBvciBcOigpLCBldGMpCisgICBhcmUgZXZhbHVhdGVkIGF0ICJ0b3AgbGV2ZWwiIGJlZm9yZSB0aGUgUy1FeHByZXNzaW9uIGlzIHNlbnQgdG8gdGhlCisgICBTLUV4cHJlc3Npb24gcmVhZGVyLiBUbyB1c2UgYSBiYWNrc2xhc2ggdmFyaWFibGUgYXMgdGhlIHRhcmdldCBvZiBhbgorICAgYXNzaWdubWVudCAoZS5nLiBieSBTRVRRLCBMRVQsICsrLCBvciAtLSksIHlvdSBtdXN0IGRvdWJsZSB0aGUKKyAgIGJhY2tzbGFzaCwgZS5nLiAoc2V0cSBcXCVyIDEyMzQpLiBUaGlzIGlzIGRpc2N1c3NlZCBhdCBncmVhdGVyIGxlbmd0aAorICAgaW4gdGhlIG5leHQgc2VjdGlvbi4KKworICAgVGh1cyBTLUV4cHJlc3Npb24gcmVhZGVyIGdlbmVyYWxseSBkZWFscyBvbmx5IHdpdGggbWFjcm8gbmFtZXMgKG5vdAorICAgYmFja3NsYXNoIGl0ZW1zKSBhcyB2YXJpYWJsZXMuIEl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIGhvdyB0aGUKKyAgIHJlYWRlciBoYW5kbGVzIG1hY3JvIG5hbWVzLiBUaGVyZSBhcmUgZnVuZGFtZW50YWxseSB0d28ga2luZHMgb2YKKyAgIFMtRXhwcmVzc2lvbnM6IHRob3NlIHRoYXQgY29udGFpbiBhIHNpbmdsZSBlbGVtZW50LCBzdWNoIGFzOgorCisgIChmb28pCisKKyAgIGFuZCB0aG9zZSB0aGF0IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBlbGVtZW50OgorCisgIChmb28gYSBiIGMpCisKKyAgIElmIGFuIFMtRXhwcmVzc2lvbiBjb250YWlucyBvbmx5IG9uZSBlbGVtZW50LCBhbmQgaXQgaXMgdGhlIG5hbWUgb2YgYQorICAgbWFjcm8sIHRoZSBtYWNybydzIGRlZmluaXRpb24gaXMgZXhhbWluZWQuIElmIHRoZSBkZWZpbml0aW9uIGlzIGEKKyAgIG51bWJlciAoaW50ZWdlciBvciBmbG9hdGluZy1wb2ludCwgcG9zaXRpdmUgb3IgbmVnYXRpdmUpLCB0aGVuIHRoaXMKKyAgIGJlY29tZXMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiBJZiB0aGUgZGVmaW5pdGlvbiBzdGFydHMgd2l0aCAnCisgICAoYXBvc3Ryb3BoZSksIHRoZW4gdGhlIHF1b3RlZCB3b3JkIG9yIHN0cmluZyBpcyB0aGUgdmFsdWUgb2YgdGhlCisgICBleHByZXNzaW9uIChleHBsYWluZWQgaW4gWzUwOV1TZWN0aW9uIDkuOCkuIE90aGVyd2lzZSwgdGhlIG1hY3JvIGlzCisgICBhc3N1bWVkIHRvIGJlIGNvbXBvc2VkIG9mIEtlcm1pdCBjb21tYW5kcyAocG9zc2libHkgaW5jbHVkaW5nCisgICBTLUV4cHJlc3Npb25zKSwgd2hpY2ggYXJlIGV4ZWN1dGVkLiBJZiB0aGUgbWFjcm8gaGFzIGEgUkVUVVJOIHZhbHVlLAorICAgb3IgaXQgZXhlY3V0ZXMgYW4gUy1FeHByZXNzaW9uIGFzIGl0cyBsYXN0IGNvbW1hbmQsIHRoZSByZXN1bHQgYmVjb21lcworICAgdGhlIHZhbHVlIG9mIHRoZSBTLUV4cHJlc3Npb247IG90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIGVtcHR5LgorCisgICBGb3IgUy1FeHByZXNzaW9ucyB0aGF0IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBlbGVtZW50LCBhbmQgdGhlIGZpcnN0CisgICBlbGVtZW50IGlzIHRoZSBuYW1lIG9mIGEgbWFjcm8sIHRoZW4gdGhpcyBtYWNybyBpcyBleGVjdXRlZCB3aXRoIHRoZQorICAgYXJndW1lbnRzIHRoYXQgYXJlIGdpdmVuLCBhZnRlciB0aGUgYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgYnkgdGhlCisgICBTLUV4cHJlc3Npb24gcmVhZGVyLiBMaWtld2lzZSwgSWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYSBidWlsdC1pbgorICAgb3BlcmF0b3IsIHRoZW4gaXQgaXMgYXBwbGllZCB0byB0aGUgb3BlcmFuZHMgYWZ0ZXIgdGhleSBhcmUgZXZhbHVhdGVkLgorICAgSW4gYm90aCBjYXNlcywgZWFjaCBvcGVyYW5kIGlzIGZlZCB0byB0aGUgUy1FeHByZXNzaW9uIHJlYWRlcgorICAgcmVjdXJzaXZlbHkgZm9yIGV2YWx1YXRpb24uIElmIGFuIG9wZXJhbmQgaXMgYSBudW1iZXIgb3IgYSBxdW90ZWQKKyAgIHN0cmluZywgaXQgaXMgdXNlZCBhcy1pcy4gQnV0IGlmIGl0J3MgYSBtYWNybyBuYW1lLCB0aGlzIGRlZ2VuZXJhdGVzCisgICBpbnRvIHRoZSBmaXJzdCBjYXNlLCBhbmQgdGhlIHByZXZpb3VzIHBhcmFncmFwaCBhcHBsaWVzLgorCisgICBFeGFtcGxlczoKKworICBkZWZpbmUgZm9vIDEyMworICAoZm9vKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0OiAxMjMKKyAgZGVmaW5lIGZvbyAnYWJjCisgIChmb28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQ6IGFiYworICBkZWZpbmUgZm9vICcob25lIHR3byB0aHJlZSkKKyAgKGZvbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdDogb25lIHR3byB0aHJlZQorICBkZWZpbmUgZm9vIHJldHVybiBcZnJhbmRvbSgxMDAwKQorICAoZm9vKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0OiA3MTMgKG9yIG90aGVyIG51bWJlcikKKyAgZGVmaW5lIGZvbyAoKyBhIGIpCisgIChmb28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQ6IFRoZSBzdW0gb2YgYSBhbmQgYgorCisgICBBIG1vcmUgZGlmZmljdWx0IGV4YW1wbGU6CisKKyAgZGVmaW5lIGZvbyBhYmMKKyAgKGZvbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdDogPz8/CisKKyAgIFRoZSByZXN1bHQgaW4gdGhlIGxhc3QgZXhhbXBsZSBkZXBlbmRzIG9uIHRoZSBkZWZpbml0aW9uIG9mIGFiYzoKKworICAgICAqIElmIGl0IGhhcyBubyBkZWZpbml0aW9uLCBhbiBlcnJvciBvY2N1cnM7IG90aGVyd2lzZToKKyAgICAgKiBJZiB0aGUgZGVmaW5pdGlvbiBpcyBhbiBTLUV4cHJlc3Npb24sIHRoZSByZXN1bHQgaXMgdGhlCisgICAgICAgUy1FeHByZXNzaW9uJ3MgdmFsdWU7IG90aGVyd2lzZToKKyAgICAgKiBJZiB0aGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBLZXJtaXQgY29tbWFuZHMsIHRoZXkgYXJlIGV4ZWN1dGVkLgorICAgICAgIEJ1dCBpbiB0aGlzIGNhc2UgIihmb28pIiBwcm9kdWNlcyB0aGUgZW1wdHkgcmVzdWx0LCBiZWNhdXNlIGl0CisgICAgICAgZG9lc24ndCBSRVRVUk4gYW55dGhpbmcuCisKKyAgIFRoZSB1c2Ugb2YgbWFjcm9zIGFzIFMtRXhwcmVzc2lvbiBvcGVyYXRvcnMgaXMgZGVzY3JpYmVkIGluCisgICBbNTEwXVNlY3Rpb24gOS44LgorCisgICBbIFs1MTFdVG9wIF0gWyBbNTEyXUNvbnRlbnRzIF0gWyBbNTEzXUMtS2VybWl0IEhvbWUgXSBbIFs1MTRdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA5LjYuIEFzc2lnbm1lbnRzIGFuZCBTY29wZQorCisgICBUaGUgYXNzaWdubWVudCBvcGVyYXRvcnMgU0VUUSBhbmQgTEVUIGFwcGx5IHRvIGdsb2JhbCBhbmQgbG9jYWwKKyAgIHZhcmlhYmxlcywgcmVzcGVjdGl2ZWx5LiBTRVRRIGFuZCBMRVQgYXJlIHN0YW5kYXJkIExpc3Agb3BlcmF0b3JzCisgICBhZGFwdGVkIHRvIEtlcm1pdCBzY29waW5nIHJ1bGVzLiBXaGVuIHRoZSBvcGVyYW5kcyBhcmUgbnVtZXJpYyBvcgorICAgYXJpdGhtZXRpYywgU0VUUSBpcyBlcXVpdmFsZW50IHRvIEtlcm1pdCdzIEVWQUxVQVRFIGNvbW1hbmQ6CisKKyAgKHNldHEgYSAoKyAxIDIpKQorICBldmFsdWF0ZSBhIDEgKyAyCisKKyAgIFdoZW4gdGhlIG9wZXJhbmQgaXMgYSBzdHJpbmcsIFNFVFEgaXMgZXF1aXZhbGVudCB0byBERUZJTkU6CisKKyAgKHNldHEgYSAnKHRoaXMgaXMgYSBzdHJpbmcpKQorICBkZWZpbmUgYSB0aGlzIGlzIGEgc3RyaW5nCisKKyAgIEluIHRoZSBmaXJzdCBjYXNlLCBib3RoIHN0YXRlbWVudHMgY3JlYXRlIGEgbWFjcm8gbmFtZWQgImEiIHdpdGggYQorICAgdmFsdWUgb2YgMy4gQnV0IGluIG5laXRoZXIgY2FzZSBpcyB0aGUgbWFjcm8gImEiIG5lY2Vzc2FyaWx5IGdsb2JhbC4KKyAgIElmIGVpdGhlciBvZiB0aGVzZSBjb21tYW5kcyBleGVjdXRlcyBpbiBhbiBlbnZpcm9ubWVudCAoaS5lLiBtYWNybworICAgaW52b2NhdGlvbiBsZXZlbCkgd2hlcmUgYSAibG9jYWwgYSIgY29tbWFuZCBoYXMgYmVlbiBnaXZlbiwgdGhlICJhIgorICAgbWFjcm8gaXMgZ2xvYmFsIHRvIHRoYXQgZW52aXJvbm1lbnQsIGJ1dCBpcyBub3QgdmlzaWJsZSBvdXRzaWRlIGl0LgorCisgICBMRVQgaXMgZXF1aXZhbGVudCB0byB0aGUgS2VybWl0IExPQ0FMIGNvbW1hbmQsIGZvbGxvd2VkIGJ5IHRoZQorICAgY29ycmVzcG9uZGluZyBFVkFMVUFURToKKworICAobGV0IGEgKCsgMSAyKSkKKworICAgaXMgZXF1aXZhbGVudCB0bzoKKworICBsb2NhbCBhCisgIGV2YWx1YXRlIGEgMSArIDIKKworICAgQWdhaW4sICJsb2NhbCIgaW4gdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8gdGhlIEtlcm1pdCBtYWNybyBpbnZvY2F0aW9uCisgICBzdGFjaywgbm90IHRvIHRoZSBTLUV4cHJlc3Npb24gbmVzdGluZyBsZXZlbC4gVG8gaWxsdXN0cmF0ZSwgcmVjYWxsCisgICBvdXIgIm5ld2FyZWEiIG1hY3JvOgorCitkZWYgbmV3YXJlYSB7CisgICAgKGxldCBhIFwlMSBiIFwlMiBjIFwlMykKKyAgICAobGV0IHMgKC8gKCsgYSBiIGMpIDIuMCkpCisgICAgKHNxcnQgKCogcyAoLSBzIGEpICgtIHMgYikgKC0gcyBjKSkpCit9CisKKyAgIEJlY2F1c2UgU0VUUSBhbmQgTEVUIGV4cHJlc3Npb25zIHJldHVybiBhIHZhbHVlLCB0aGV5IGNhbiBiZSBwbGFjZWQKKyAgIHdpdGhpbiBhIGxhcmdlciBTLUV4cHJlc3Npb24uIEluIHRoaXMgY2FzZSB3ZSBjYW4gcmVwbGFjZSB0aGUgZmlyc3QKKyAgIHJlZmVyZW5jZSB0byB0aGUgInMiIHZhcmlhYmxlIGJ5IGl0cyBkZWZpbmluZyBleHByZXNzaW9uOgorCitkZWYgbmV3YXJlYSB7CisgICAgKGxldCBhIFwlMSBiIFwlMiBjIFwlMykKKyAgICAoc3FydCAoKiAobGV0IHMgKC8gKCsgYSBiIGMpIDIuMCkpICgtIHMgYSkgKC0gcyBiKSAoLSBzIGMpKSkKK30KKworICAgVGhpcyB3b3VsZCBub3Qgd29yayBpZiBMRVQgd2VyZSBsb2NhbCB0byB0aGUgUy1FeHByZXNzaW9uLCBidXQgaXQKKyAgIHdvcmtzIG5pY2VseSBpbiB0aGUgY29udGV4dCBvZiBLZXJtaXQgbWFjcm9zLiBUaGUgcHJldmlvdXMgZGVmaW5pdGlvbgorICAgaXMgZXF1aXZhbGVudCB0bzoKKworZGVmIG5ld2FyZWEgeworICAgIGxvY2FsIGEgYiBjIHMKKyAgICAoc2V0cSBhIFwlMSBiIFwlMiBjIFwlMykKKyAgICAoc3FydCAoKiAoc2V0cSBzICgvICgrIGEgYiBjKSAyLjApKSAoLSBzIGEpICgtIHMgYikgKC0gcyBjKSkpCit9CisKKyAgIEluIGJvdGggY2FzZXMsIHRoZSB2YXJpYWJsZXMgYSwgYiwgYywgYW5kIHMgYXJlIGxvY2FsIHRvIHRoZSAibmV3YXJlYSIKKyAgIG1hY3JvLCBhbmQgZ2xvYmFsIHdpdGhpbiBpdC4KKworICAgTXVsdGlwbGUgYXNzaWdubWVudHMgY2FuIGJlIGhhbmRsZWQgaW4gc2V2ZXJhbCB3YXlzLiBIZXJlIGlzIHRoZQorICAgb2J2aW91cyB3YXkgdG8gaW5pdGlhbGl6ZSBhIHNlcmllcyBvZiB2YXJpYWJsZXMgdG8gdGhlIHNhbWUgdmFsdWU6CisKKyAgKHNldHEgYSAwKQorICAoc2V0cSBiIDApCisgIChzZXRxIGMgMCkKKyAgKHNldHEgcyAwKQorCisgICBIZXJlIGlzIGEgbW9yZSBjb21wYWN0IGFuZCBlZmZpY2llbnQgd2F5IG9mIGRvaW5nIHRoZSBzYW1lIHRoaW5nOgorCisgIChzZXRxIGEgMCBiIDAgYyAwIHMgMCkKKworICAgSG93ZXZlciwgaW4gY2FzZSB0aGUgdmFsdWUgd2FzIG1vcmUgY29tcGxleCwgaXQncyBiZXR0ZXIgdG8gcHV0IG9ubHkKKyAgIG9uZSBjb3B5IG9mIGl0IGluIHRoZSBTLUV4cHJlc3Npb247IGluIHRoaXMgY2FzZSB3ZSByZWx5IG9uIHRoZSBmYWN0CisgICB0aGF0IFNFVFEgcmV0dXJucyB0aGUgdmFsdWUgb2YgaXRzIGxhc3QgYXNzaWdubWVudDoKKworICAoc2V0cSBhIChzZXRxIGIgKHNldHEgYyAoc2V0cSBzICgqIHggKF4geSAyKSkpKSkpCisKKyAgIFNpbWlsYXJseSwgdG8gc2V0IGEgc2VyaWVzIG9mIHZhcmlhYmxlcyB0byB4LCB4KzEsIHgrMiwgLi4uCisKKyAgKHNldHEgYyAoKyAoc2V0cSBiICgrIChzZXRxIGEgKCsgKHNldHEgcyB4KSAxKSkgMSkpIDEpKQorCisgICBJbiB0aGUgbGFzdCBleGFtcGxlLCB5b3UgY2FuIHNlZSB3aHkgImxhc3QiIGRvZXMgbm90IGFsd2F5cyBjb3JyZXNwb25kCisgICB0byAicmlnaHRtb3N0IiAodGhlIGxlZnRtb3N0IHZhcmlhYmxlICJjIiBpcyBhc3NpZ25lZCBsYXN0KS4KKworICAgSWYgeW91IGFyZSB3b3JraW5nIHdpdGggYmFja3NsYXNoIHZhcmlhYmxlcyBsaWtlIFwlYSBvciBhcnJheSBlbGVtZW50cworICAgbGlrZSBcJmFbMV0sIHJlbWVtYmVyIHR3byBydWxlczoKKyAgICAxLiBEb24ndCBwdXQgc3BhY2VzIGluc2lkZSBhcnJheSBicmFja2V0cy4KKyAgICAyLiBZb3UgbXVzdCBkb3VibGUgdGhlIGJhY2tzbGFzaCB3aGVuIHVzaW5nIFNFVFEsIExFVCwgKyssIG9yIC0tIHRvCisgICAgICAgYXNzaWduIGEgdmFsdWUgdG8gYSBiYWNrc2xhc2ggdmFyaWFibGUuCisKKyAgIEV4YW1wbGVzIG9mIGFzc2lnbmluZyB0byBhIGJhY2tzbGFzaCB2YXJpYWJsZToKKworICAoc2V0cSB4IDEpCisgIChzZXRxIFxcJWEgMCkKKyAgKHNldHEgXFwmYVt4KzFdIDEpCisgICgrKyBcXCV4KQorICAoLS0gXFwmYVt4KzJdKQorCisgICBFeGFtcGxlcyBvZiByZWZlcnJpbmcgdG8gYSBiYWNrc2xhc2ggdmFyaWFibGUncyB2YWx1ZToKKworICAoc2V0cSBhICgrIFwlYSAxKSkKKyAgKHNldHEgYiAoKyBcJWEgXCZhWzFdKSkKKyAgKCsrIGEgXCV4KQorICAoLS0gYiBcJmFbMV0pCisKKyAgIFRoZSBzcGVjaWFsIG5vdGF0aW9uIGlzIHJlcXVpcmVkIGJlY2F1c2UgYWxsIGJhY2tzbGFzaGVkIGl0ZW1zIChcJXgKKyAgIHZhcmlhYmxlcywgYXJyYXkgZWxlbWVudHMsIGJ1aWx0LWluIFx2KHh4eCkgdmFyaWFibGVzLCBhbmQgXGZ4eHgoKQorICAgZnVuY3Rpb24gaW52b2NhdGlvbnMpIGFyZSBldmFsdWF0ZWQgaW4gYSBzaW5nbGUgcGFzcyBCRUZPUkUgdGhlCisgICBTLUV4cHJlc3Npb24gaXMgZXhlY3V0ZWQ7IGFueSBvdGhlciBhcHByb2FjaCB3b3VsZCByZXN1bHQgaW4KKyAgIHVuYWNjZXB0YWJsZSBwZXJmb3JtYW5jZS4gU28sIGZvciBleGFtcGxlLCBpbjoKKworICBkZWNsYXJlIFwmYVtdID0gMSAyIDMKKyAgZGVmaW5lIFwleCA0CisgIGRlZmluZSBcJXkgMAorICAoc2V0cSBcXCV5ICgrIFwleCBcJmFbMV0pKQorCisgICB0aGUgUy1FeHByZXNzaW9uIGJlY29tZXM6CisKKyAgKHNldHEgXCV5ICgrIDQgMSkpCisKKyAgIGJlZm9yZSBpdCBpcyBzZW50IHRvIHRoZSBTLUV4cHJlc3Npb24gZXZhbHVhdG9yLiBJZiB0aGUgYmFja3NsYXNoIGhhZAorICAgbm90IGJlZW4gZG91YmxlZCBvbiB0aGUgYXNzaWdubWVudCB0YXJnZXQsIHRoZSByZXN1bHQgd291bGQgaGF2ZSBiZWVuOgorCisgIChzZXRxIDAgKCsgNCAxKSkKKworICAgd2hpY2ggaXMgaWxsZWdhbCBiZWNhdXNlIHlvdSBjYW4ndCBhc3NpZ24gYSB2YWx1ZSB0byBhIG51bWJlci4KKyAgIENvbnZlcnNlbHksIGlmIGJhY2tzbGFzaGVzIHdlcmUgZG91YmxlZCBvbiByaWdodC1oYW5kLXNpZGUgdmFsdWVzOgorCisgIChzZXRxIFxcJXkgKCsgXFwleCBcXCZhWzFdKQorCisgICB0aGlzIHRvbywgd291bGQgZ2l2ZSBhbiBlcnJvciAobm90IG51bWVyaWMgLSAiXCV4IikuCisKKyAgIElmIHlvdSBvbWl0IHRoZSBkb3VibGUgYmFja3NsYXNoIGluIHRoZSBhc3NpZ25tZW50IHRhcmdldCwgdGhlIHJlc3VsdAorICAgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSB2YXJpYWJsZSBhbHJlYWR5IGhhcyBhIHZhbHVlOgorCisgIChzZXRxIFwlYSAoKiAzIDMpKQorCisgICBJZiBcJWEgaGFzIGEgbm9uLW51bWVyaWMgc2luZ2xlLXdvcmQgdmFsdWUsIHRoZW4gdGhpcyBiZWNvbWVzIHRoZSBuYW1lCisgICBvZiB0aGUgdmFyaWFibGUgdGhhdCBpcyBhc3NpZ25lZCBieSBTRVRRLiBUbyBpbGx1c3RyYXRlOgorCisgIGRlZmluZSBcJWEgZm9vCisgIGVjaG8gXCVhCisgIGZvbworICAoc2V0cSBcJWEgKCogMyAzKSkKKyAgZWNobyBcJWEKKyAgZm9vCisgIHNob3cgbWFjcm8gZm9vCisgIGZvbyA9IDkKKworICAgSWYgXCVhIGhhcyBubyB2YWx1ZSwgYSBudW1lcmljIHZhbHVlLCBvciBhIG11bHRpd29yZCB2YWx1ZSwgYW4KKyAgICJpbnZhbGlkIGFzc2lnbm1lbnQiIGVycm9yIG9jY3Vycy4KKworICAgWyBbNTE1XVRvcCBdIFsgWzUxNl1Db250ZW50cyBdIFsgWzUxN11DLUtlcm1pdCBIb21lIF0gWyBbNTE4XUtlcm1pdAorICAgSG9tZSBdCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOS43LiBDb25kaXRpb25hbCBFeHByZXNzaW9ucworCisgICBUaGUgSUYgb3BlcmF0b3IgcHJvdmlkZXMgYSBjb21wYWN0IGZvcm0gb2YgZGVjaXNpb24tbWFraW5nIHdpdGhpbgorICAgUy1FeHByZXNzaW9ucy4gQW4gSUYgZXhwcmVzc2lvbiBjYW4gc3RhbmQgd2hlcmV2ZXIgYSBudW1iZXIgbWlnaHQKKyAgIHN0YW5kLCBhcyBsb25nIGlzIGl0IHJldHVybnMgYSBudW1iZXIuIEhlcmUncyBhIHF1aWNrIHdheSB0byBvYnRhaW4KKyAgIHRoZSBhdmVyYWdlIHZhbHVlIG9mIGFsbCB0aGUgZWxlbWVudHMgaW4gYW4gYXJyYXkgdGhhdCBjb250YWlucyBvbmx5CisgICBudW1iZXJzOgorCisgICgvICgrIFxmam9pbigmYSkpIChmbG9hdCBcZmRpbSgmYSkpKQorCisgICBUaGlzIHJlc3VsdHMgaW4gYSAiRGl2aWRlIGJ5IHplcm8iIGVycm9yIGlmIHRoZSBhcnJheSBpcyBlbXB0eS4gSWYgeW91CisgICB3YW50IHRvIGRlZmluZSB0aGUgYXZlcmFnZSB2YWx1ZSBvZiBhbiBlbXB0eSBhcnJheSB0byBiZSAwIGluc3RlYWQgb2YKKyAgIGdldHRpbmcgYW4gZXJyb3IsIHlvdSBjYW4gdXNlIElGIHRvIGNoZWNrIHRoZSBhcnJheSBzaXplOgorCisgIChpZiBcZmRpbSgmYSkgKC8gKCsgXGZqb2luKCZhKSkgKGZsb2F0IFxmZGltKCZhKSkpIDApCisKKyAgIG9yIGVxdWl2YWxlbnRseToKKworICAoaWYgKG5vdCBcZmRpbSgmYSkpIDAgKC8gKCsgXGZqb2luKCZhKSkgKGZsb2F0IFxmZGltKCZhKSkpKQorCisgICBPZiBjb3Vyc2UsIElGIGNhbiBmaXQgYW55d2hlcmUgZWxzZSBpbnRvIGFuIFMtRXhwcmVzc2lvbjoKKworICAoc2V0cSBhICgrIGIgKGlmICg8IGMgMCkgMCBjKSkpCisKKyAgIGFuZCB0aGUgSUYgZXhwcmVzc2lvbiBjYW4gYmUgYXMgY29tcGxleCBhcyB5b3UgbGlrZToKKworICAoc2V0cSBhICgrIGIgKGlmIChhbmQgKG9yICg+IHggMCkgKD4geSAwKSkgKDwgYyAwKSAoPiBkIDEpICghPSBlIDApKSAxIDApKSkKKworICAgYW5kIHRoZSAidGhlbiIgYW5kICJlbHNlIiBwYXJ0cyBjYW4gY29udGFpbiBtdWx0aXBsZSBTLUV4cHJlc3Npb25zCisgICBlbmNsb3NlZCB3aXRoaW4gKEVWQUwgLi4uKToKKworICAoaWYgeCAoZXZhbCAoLi4uKSAoLi4uKSAoLi4uKSkgKGV2YWwgKC4uLikgKC4uLikgKC4uLikpKQorCisgICBBTkQgYW5kIE9SIG9wZXJhdG9ycyBhcmUgZ3VhcmFudGVlZCB0byAic2hvcnQgY2lyY3VpdCIuIElmIGFueSBvcGVyYW5kCisgICBvZiBBTkQgaXMgZmFsc2UsIG5vbmUgb2YgdGhlIHN1YnNlcXVlbnQgb3BlcmFuZHMgaXMgZXZhbHVhdGVkOworICAgbGlrZXdpc2UsIGlmIGFuIE9SIG9wZXJhbmQgaXMgdHJ1ZSwgbm8gZnVydGhlciBvcGVyYW5kcyBhcmUgZXZhbHVhdGVkLgorCisgICBCZWFyIGluIG1pbmQgdGhhdCB0aGUgUy1FeHByZXNzaW9uIElGIGlzIG5vdCB0aGUgc2FtZSBhcyBLZXJtaXQgSUY7CisgICB0aGUgY29uZGl0aW9uIGlzIG9ubHkgYWxsb3dlZCB0byBiZSBhbiBTLUV4cHJlc3Npb24gb3IgYSB2YXJpYWJsZSBvcgorICAgbnVtYmVyLCBub3QgdGhlIHdob2xlIGxpc3Qgb2YgcG9zc2liaWxpdGllcyB5b3Ugc2VlIHdoZW4geW91IHR5cGUgImlmCisgICA/IiBhdCB0aGUgQy1LZXJtaXQ+IHByb21wdC4gQnV0IGtlZXAgcmVhZGluZy4uLgorCisgICBbIFs1MTldVG9wIF0gWyBbNTIwXUNvbnRlbnRzIF0gWyBbNTIxXUMtS2VybWl0IEhvbWUgXSBbIFs1MjJdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA5LjguIEV4dGVuc2liaWxpdHkKKworICAgVG8gZXh0ZW5kIHRoZSBjYXBhYmlsaXRpZXMgb2YgUy1FeHByZXNzaW9ucywgeW91IGNhbiB1c2UgS2VybWl0IG1hY3JvCisgICBuYW1lcyBhcyBvcGVyYXRvcnMsIHdpdGggdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczoKKworICAgICAqIFRoZSBtYWNybyBtdXN0IG5vdCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYSBidWlsdC1pbiBvcGVyYXRvci4KKyAgICAgKiBZb3UgbXVzdCB1c2UgdGhlIGZ1bGwgbWFjcm8gbmFtZSwgbm90IGFuIGFiYnJldmlhdGlvbi4KKworICAgQW5kIHdpdGggdGhlIGZvbGxvd2luZyBlbmhhbmNlbWVudDoKKworICAgICAqIElmIHRoZSBsYXN0IHN0YXRlbWVudCBleGVjdXRlZCBieSB0aGUgbWFjcm8gaXMgYW4gUy1FeHByZXNzaW9uLAorICAgICAgIGl0cyB2YWx1ZSBpcyByZXR1cm5lZCBhdXRvbWF0aWNhbGx5LiBJbiBvdGhlciB3b3JkczoKKworICBkZWZpbmUgYnVtcCAoKysgXCUxKQorCisgICBpcyBlcXVpdmFsZW50IHRvOgorCisgIGRlZmluZSBidW1wIHJldHVybiBcZnNleHByZXNzaW9uKCsrIFwlMSkKKworICAgSGVyZSdzIGFuIGV4YW1wbGUgaW4gd2hpY2ggd2UgZGVmaW5lIGEgRklCT05BQ0NJIG9wZXJhdG9yIHRoYXQgcmV0dXJucworICAgdGhlIG50aCBlbGVtZW50LCBuID49IDAsIG9mIHRoZSBGaWJvbmFjY2kgc2VyaWVzLCAwIDEgMSAyIDMgNSA4IDEzIDIxCisgICAzNCA1NSwgLiAuIC4sIGluIHdoaWNoIHRoZSBmaXJzdCBlbGVtZW50IGlzIDAsIHRoZSBzZWNvbmQgaXMgMSwgYW5kCisgICBlYWNoIHN1YnNlcXVlbnQgZWxlbWVudCBpcyB0aGUgc3VtIG9mIHRoZSB0d28gYmVmb3JlIGl0LiBUaGlzIHNlcmllcworICAgd2FzIGRldmlzZWQgYnkgTGVvbmFyZG8gUGlzYW5vLCBGaWxpdXMgQm9uYWNjaSAoRmlib25hY2NpIGZvciBzaG9ydCkKKyAgIGluIDEyMDIgdG8gZGVzY3JpYmUgaG93IGZhc3QgcmFiYml0cyBjYW4gYnJlZWQsIGFuZCBhbHNvIGZvcm1zIHRoZQorICAgYmFzaXMgZm9yIHRoZSBHb2xkZW4gTWVhbiwgdGhlIGJyYW5jaGluZyBiZWhhdmlvciBvZiBwbGFudHMsIHRoZQorICAgc3BpcmFsIG9mIGEgbmF1dGlsdXMgc2hlbGwsIGV0Yy4gKFRoYW5rcyB0byBbNTIzXURhdCBUaHVjIE5ndXllbiBmb3IKKyAgIERlY2VtYmVyIDIwMDMgY29ycmVjdGlvbnMgdG8gdGhpcyBzZWN0aW9uISkKKworICAgV2UgY2FuIHdyaXRlIGEgRklCT05BQ0NJIGZ1bmN0aW9uIGFzIGEgbWFjcm8gZWFzaWx5IHdpdGgKKyAgIFMtRXhwcmVzc2lvbnM6CisKKyAgZGVmaW5lIEZJQk9OQUNDSSB7CisgICAgKGlmICg9PSBcJTEgMCkgMAorICAgICAgICAoaWYgKD09IFwlMSAxKSAxICgrIChmaWJvbmFjY2kgKC0gXCUxIDIpKSAoZmlib25hY2NpICgtIFwlMSAxKSkpKSkKKyAgfQorCisgICBZb3UgY2FuIHJlYWQgdGhpcyBhczoKKworICAgICBJZiB0aGUgYXJndW1lbnQgKFwlMSkgaXMgMCwgcmV0dXJuIGEgcmVzdWx0IG9mIDA7IGlmIGl0IGlzIDEsCisgICAgIHJldHVybiAxOyBvdGhlcndpc2U6CisgICAgIHJldHVybiB0aGUgc3VtIG9mIGZpYm9uYWNjaShhcmd1bWVudCAtIDIpIGFuZCBmaWJvbmFjY2koYXJndW1lbnQgLQorICAgICAxKQorCisgICBOb3RlIHRoYXQgYSBSRVRVUk4gc3RhdGVtZW50IGlzIG5vdCBuZWVkZWQsIHNpbmNlIFMtRXhwcmVzc2lvbnMKKyAgIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlaXIgY29udGFpbmluZyBtYWNyb3MuCisKKyAgIEZvciBjb21wYXJpc29uLCBoZXJlJ3MgaG93IGl0IHdvdWxkIGJlIGNvZGVkIHdpdGhvdXQgUy1FeHByZXNzaW9uczoKKworICBkZWZpbmUgRklCT05BQ0NJIHsKKyAgICAgIGlmID09IFwlMSAwIHsKKyAgICAgICAgICByZXR1cm4gMAorICAgICAgfSBlbHNlIGlmID09IFwlMSAxIHsKKyAgICAgICAgICByZXR1cm4gMQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gXGZldmFsKFxmZXhlYyhmaWJvbmFjY2kgXGZldmFsKFwlMS0yKSkgLQorICAgICAgICAgICAgICAgKyBcZmV4ZWMoZmlib25hY2NpIFxmZXZhbChcJTEtMSkpKQorICAgICAgfQorICB9CisKKyAgIE5vdyB3ZSBjYW4gdXNlIHRoZSBGSUJPTkFDQ0kgZnVuY3Rpb24gKHdoaWNoZXZlciB3YXkgeW91IHdyaXRlIGl0KQorICAganVzdCBhcyBpZiBpdCB3ZXJlIGEgYnVpbHQtaW4gb3BlcmF0b3I6CisKKyAgKGZpYm9uYWNjaSA2KQorCisgICBPcjoKKworICAoc2V0cSBhIDEwKQorICAoZmlib25hY2NpIGEpCisKKyAgIFdpdGhpbiBTLUV4cHJlc3Npb25zIG9ubHkgKG5vdCBvdXRzaWRlIHRoZW0pLCBTLUV4cHJlc3Npb25zIHRoZW1zZWx2ZXMKKyAgIGNhbiBiZSB1c2VkIGFzIG1hY3JvIGFyZ3VtZW50czoKKworICAoc2V0cSBhIDIgYiA0KQorICAoc2V0cSB4IChmaWJvbmFjY2kgKCogYSBiICkpKQorCisgICBUaGUgdmFsdWUgb2YgdGhlIFMtRXhwcmVzc2lvbiAoaW4gdGhpcyBjYXNlICI4IiksIGFuZCBub3QgdGhlCisgICBTLUV4cHJlc3Npb24gaXRzZWxmLCBpcyBzZW50IHRvIHRoZSBtYWNyby4KKworICAgWW91ciBtYWNybyBpcyByZXNwb25zaWJsZSBmb3IgYXJndW1lbnQgdmFsaWRhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmcuCisgICBBIHJvYnVzdCBGaWJvbmFjY2kgbWFjcm8gd291bGQgYmUgbW9yZSBsaWtlIHRoaXM6CisKKyAgZGVmaW5lIEZJQk9OQUNDSSB7CisgICAgICBpZiA8IFx2KGFyZ2MpIDIgZW5kIDEgP1wlMDogTWlzc2luZyBhcmd1bWVudAorICAgICAgaWYgPiBcdihhcmdjKSAyIGVuZCAxID9cJTA6IFRvbyBtYW55IGFyZ3VtZW50cworICAgICAgaWYgbm90IGludGVnZXIgXCUxIGVuZCAxID9cJTA6IEludGVnZXJzIG9ubHkKKyAgICAgIGlmIDwgXCUxIDEgZW5kIDEgP1wlMDogQXJndW1lbnQgb3V0IG9mIHJhbmdlCisgICAgICAoaWYgKD09IFwlMSAwKSAwCisgICAgICAgICAoaWYgKD09IFwlMSAxKSAxICgrIChmaWJvbmFjY2kgKC0gXCUxIDIpKSAoZmlib25hY2NpICgtIFwlMSAxKSkpKSkKKyAgfQorCisgICBSZWNhbGwgdGhhdCAiRU5EIG5vbnplcm8tbnVtYmVyIFsgbWVzc2FnZSBdIiBjYXVzZXMgYSBtYWNybyBpbnZvY2F0aW9uCisgICB0byBmYWlsLiBXaGVuIHRoZSBtYWNybyBpcyB0aGUgb3BlcmF0b3IgaW4gYW4gUy1FeHByZXNzaW9uLCB0aGlzIG1ha2VzCisgICB0aGUgUy1FeHByZXNzaW9uIGZhaWwgdG9vLiBBbHNvIG5vdGUgdGhhdCBvdXIgRmlib25hY2NpIG1hY3JvIGlzIGp1c3QKKyAgIGFuIGlsbHVzdHJhdGlvbiwgbm90IGEgcHJhY3RpY2FsIGV4YW1wbGUuIFNpbmNlIGl0IGlzIHJlY3Vyc2l2ZSAoY2FsbHMKKyAgIGl0c2VsZiksIGl0IHdvbid0IHdvcmsgZm9yIGxhcmdlIGFyZ3VtZW50cyBiZWNhdXNlIHRoZSBjYWxsIHN0YWNrIGNhbgorICAgZXhjZWVkIGF2YWlsYWJsZSBtZW1vcnkuIFNlZSBbNTI0XVNlY3Rpb24gOS45LjIgZm9yIGEgcHJhY3RpY2FsCisgICBhbHRlcm5hdGl2ZS4KKworICAgS2VybWl0IG1hY3Jvcywgd2hlbiB1c2VkIGFzIFMtRXhwcmVzc2lvbiBvcGVyYXRvcnMsIGNhbiBkbyBhbnl0aGluZyBhdAorICAgYWxsIGV4Y2VwdCBpbml0aWF0ZSBmaWxlIHRyYW5zZmVyczogdGhleSBjYW4gcHJpbnQgbWVzc2FnZXMgb24gdGhlCisgICBzY3JlZW4sIHJlYWQgYW5kIHdyaXRlIGZpbGVzLCBpbnRlcmFjdCB3aXRoIHRoZSB1c2VyLCBhbmQgc28gb24uIEZvcgorICAgZXhhbXBsZSwgaGVyZSdzIGEgbWFjcm8gQVNLTUUgdGhhdCBhc2tzIHlvdSB0byBlbnRlciBhIG51bWJlciwgbWFrZXMKKyAgIHN1cmUgdGhhdCB5b3UgZGlkLCBhbmQgdGhlbiByZXR1cm5zIGl0cyB2YWx1ZSBmb3IgdXNlIGluIHRoZQorICAgUy1FeHByZXNzaW9uOgorCisgIGRlZmluZSBBU0tNRSB7CisgICAgICBsb2NhbCBcJW4KKyAgICAgIHdoaWxlIHRydWUgeworICAgICAgICAgIGFzayBcJW4geyBOdW1iZXI6IH0KKyAgICAgICAgICBpZiBub3QgZGVmIFwlbiBjb250aW51ZQorICAgICAgICAgIGlmIG5vdCBudW1lcmljIFwlbiB7CisgICAgICAgICAgICAgIGVjaG8gTm90IG51bWVyaWMgLSAiXCVuIgorICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhaworICAgICAgfQorICAgICAgcmV0dXJuIFwlbgorICB9CisgIChzZXRxIGEgKCogMiAoYXNrbWUpKSkgOyBHZXQgbnVtYmVyIGZyb20gdXNlciwgZG91YmxlIGl0LCBhc3NpZ24gcmVzdWx0IHRvIGEuCisKKyAgIEhlcmUncyBhIG1hY3JvIHlvdSBjYW4gdXNlIHRvIHZhbGlkYXRlIHRoYXQgYSBudW1iZXIgaXMgaW4gYSBnaXZlbgorICAgcmFuZ2U6CisKKyAgZGVmaW5lIGlucmFuZ2UgeworICAgICAgaWYgIT0gXHYoYXJnYykgNCBlbmQgMSA/XCUwOiBXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzCisgICAgICBpZiAoIDwgXCUxIFwlMiB8fCA+IFwlMSBcJTMgKSByZXR1cm4gMAorICAgICAgcmV0dXJuIDEKKyAgfQorCisgICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIG51bWJlciB0byBiZSBjaGVja2VkLCB0aGUgc2Vjb25kIGlzIHRoZQorICAgbWluaW11bSBhY2NlcHRhYmxlIHZhbHVlLCB0aGUgdGhpcmQgaXMgdGhlIG1heGltdW0uIFlvdSBjYW4gdXNlIHRoaXMKKyAgIChmb3IgZXhhbXBsZSkgaW4gSUYgY29uZGl0aW9uczoKKworICBkZWZpbmUgeWVzIGVjaG8gXCUxIElTIE9LCisgIGRlZmluZSBubyBlY2hvIFwlMSBJUyBOT1QgT0sKKworICAoc2V0cSBhIC0xIGIgOTk5KQorICAoaWYgKGlucmFuZ2UgYSAwIDEwMCkgKHllcyBhKSAobm8gYSkpCisgIChpZiAoaW5yYW5nZSBiIC0xMDAwICsxMDAwKSAoeWVzIGIpIChubyBiKSkKKworICAgVGhpcyBpcyBqdXN0IGFuIGlsbHVzdHJhdGlvbiwgb2YgY291cnNlOyB0aGVyZSdzIGFscmVhZHkgYSBidWlsdC1pbgorICAgb3BlcmF0b3IgdG8gbGV0IHlvdSBkbyByYW5nZSBjaGVja2luZyB3aXRob3V0IGhlbHAgZnJvbSBtYWNyb3M6CisKKyAgKGlmICg8PSAwIGEgMTAwKSAoeWVzIGEpIChubyBhKSkKKyAgKGlmICg8PSAtMTAwMCBiICsxMDAwKSAoeWVzIGIpIChubyBiKSkKKworICAgVG8gc2VuZCBzdHJpbmcgcGFyYW1ldGVycyB0byBhIG1hY3JvLCBzb21lIGtpbmQgb2YgcXVvdGluZyBpcyByZXF1aXJlZAorICAgdG8gdGVsbCB0aGUgUy1FeHByZXNzaW9uIHBhcnNlciB0byB0YWtlIGEgZ2l2ZW4gIndvcmQiIGxpdGVyYWxseQorICAgcmF0aGVyIHRoYW4gcmVwbGFjaW5nIGl0IGJ5IGl0cyB2YWx1ZS4gRm9yIHRoaXMgd2UgdXNlIHRoZSBMaXNwIFFVT1RFCisgICBvcGVyYXRvcjoKKworICBkZWZpbmUgbGVuZ3RoIHJldHVybiBcZmxlbmd0aChcJTEpCisgIChsZW5ndGggKHF1b3RlIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6KSkKKyAgMjYKKworICAgVGhpcyBjYXVzZXMgdGhlIHN0cmluZyAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiIHRvIGJlIHNlbnQKKyAgIGxpdGVyYWxseSB0byB0aGUgTEVOR1RIIG1hY3JvLiBLZXJtaXQsIGxpa2UgTGlzcCwgYWxzbyBvZmZlcnMgYQorICAgc2hvcnRjdXQgZm9yIFFVT1RFLCB0aGF0IGxldHMgdXMgcXVvdGUgYSB3b3JkIGJ5IHByZWZpeGluZyBpdCB3aXRoIGEKKyAgIHNpbmdsZSBxdW90ZSAoJykgY2hhcmFjdGVyLCBhbHNvIGNhbGxlZCBhcG9zdG9waGUgKEFTQ0lJIDM5KToKKworICAobGVuZ3RoICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eikKKyAgMjYKKworICAgVGhlIHR3byBmb3JtcyBhcmUgZXF1aXZhbGVudC4KKworICAgSG93IHRoZSBtYWNybyB0cmVhdHMgaXRzIGFyZ3VtZW50cyBpcyB1cCB0byB0aGUgbWFjcm8uIEluIHRoZSBleGFtcGxlCisgICBhYm92ZSwgdGhlIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBsaXRlcmFsIHN0cmluZy4gSG93ZXZlciwgaXQgY2FuCisgICBhbHNvIGJlIHRyZWF0ZWQgYXMgYSB2YXJpYWJsZSBuYW1lOgorCisgIGRlZmluZSBzdHJpbmcgVGhpcyBpcyBhIHN0cmluZworICBkZWZpbmUgbGVuZ3RoIHJldHVybiBcZmxlbmd0aChcbShcJTEpKQorICAobGVuZ3RoICdzdHJpbmcpCisgIDE2CisKKyAgIE5vdGUgdGhlIGNvbnN0cnVjdCBcbShcJTEpLiBUaGlzIG1lYW5zICJ0aGUgdmFsdWUgb2YgdGhlIG1hY3JvIHdob3NlCisgICBuYW1lIGlzIHRoZSB2YWx1ZSBvZgorICAgXCUxIi4gVGhlIHZhbHVlIG9mIFwlMSBpbiB0aGlzIGNhc2UgaXMgdGhlIHdvcmQgInN0cmluZyIsIGFuZCB0aGUKKyAgIHZhbHVlIG9mIHRoZSBtYWNybyB3aG9zZSBuYW1lIGlzICJzdHJpbmciIGlzICJUaGlzIGlzIGEgc3RyaW5nIi4KKworICAgV2hhdCBpZiB0aGUgbWFjcm8gdGFrZXMgbXVsdGlwbGUgYXJndW1lbnRzLCBvciBhIHZhcmlhYmxlIG51bWJlciBvZgorICAgdGhlbT8gSGVyZSdzIGEgc2ltcGxlIG1hY3JvIHRoYXQgcHJpbnRzIGEgcGhyYXNlIHRoYXQgaW5jbHVkZXMgaXRzCisgICBhcmd1bWVudHM6CisKKyAgZGVmaW5lIGNvbXBsYWluIGVjaG8gSXQncyB0b28gXCUqIQorCisgICAoUmVjYWxsIHRoYXQgXCUqIG1lYW5zICJhbGwgYXJndW1lbnRzIi4pCisKKyAgIEl0IGNhbiBiZSBjYWxsZWQgaW4gdGhlIHRyYWRpdGlvbmFsIHdheToKKworICBjb21wbGFpbiBob3QgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdDogIkl0J3MgdG9vIGhvdCEiCisgIGNvbXBsYWluIGNvbGQgYW5kIHdldCAgICAgICAgICAgICAgUmVzdWx0OiAiSXQncyB0b28gY29sZCBhbmQgd2V0ISIKKworICAgT3IgZnJvbSBhbiBTLUV4cHJlc3Npb24gaWYgeW91IHF1b3RlIHRoZSBhcmd1bWVudHM6CisKKyAgKGNvbXBsYWluICdob3QpICAgICAgICAgICAgICAgICAgICBSZXN1bHQ6ICJJdCdzIHRvbyBob3QhIgorICAoY29tcGxhaW4gJ2NvbGQgJ2FuZCAnd2V0KSAgICAgICAgIFJlc3VsdDogIkl0J3MgdG9vIGNvbGQgYW5kIHdldCEiCisKKyAgIFRvIGdyb3VwIG11bHRpcGxlIHdvcmRzIGludG8gYSBzaW5nbGUgYXJndW1lbnQsIHVzZSBwYXJlbnRoZXNlczoKKworICAoY29tcGxhaW4gKHF1b3RlIChjb2xkIGFuZCB3ZXQpKSkgIFJlc3VsdDogIkl0J3MgdG9vIGNvbGQgYW5kIHdldCEiCisgIChjb21wbGFpbiAnKGNvbGQgYW5kIHdldCkpICAgICAgICAgUmVzdWx0OiAiSXQncyB0b28gY29sZCBhbmQgd2V0ISIKKworICAgTm90ZSB0aGUgZGlmZmVyZW5jZToKKworICAoY29tcGxhaW4gJ2NvbGQgJ2FuZCAnd2V0KSAgICAgICAgIFRocmVlIGFyZ3VtZW50cworICAoY29tcGxhaW4gJyhjb2xkIGFuZCB3ZXQpKSAgICAgICAgIE9uZSBhcmd1bWVudAorCisgICBTaW5jZSB0aGUgQ09NUExBSU4gbWFjcm8gdXNlcyBcJSogdG8gcmVmZXIgdG8gYWxsIGl0cyBhcmd1bWVudHMsIG5vCisgICBtYXR0ZXIgaG93IG1hbnksIGl0IGRvZXNuJ3QgY2FyZSB3aGljaCBmb3JtIHlvdSB1c2UuIEJ1dCBpdCBtYWtlcyBhCisgICBkaWZmZXJlbmNlIGluIGNhc2VzIHdoZXJlIHRoZSBtYWNybyByZWZlcnMgdG8gaXRzIGFyZ3VtZW50cworICAgaW5kaXZpZHVhbGx5LgorCisgICBUbyBpbGx1c3RyYXRlLCBsZXQncyBjb25zaWRlciBhIG1hY3JvIHRoYXQgcmVjZWl2ZXMgdGhlIG5hbWUgb2YgYQorICAgbWFjcm8gYW5kIGl0cyBhcmd1bWVudCBsaXN0IGFuZCBleGVjdXRlcyBpdCB3aXRoIGl0cyBhcmd1bWVudHMsCisgICB3aXRob3V0IGtub3dpbmcgaG93IG1hbnkgYXJndW1lbnRzIHRoZXJlIGFyZS4gVGhlIGZvbGxvd2luZyBMT09QIG1hY3JvCisgICBpcyB1c2VkIHRvIGV4ZWN1dGUgdGhlIGdpdmVuIG1hY3JvIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50IGxpc3QgdGhlCisgICByZXF1ZXN0ZWQgbnVtYmVyIG9mIHRpbWVzOgorCisgIGRlZiBsb29wIHsgbG9jYWwgaSwgZm9yIGkgMSBcJTEgMSBkbyBcJTIgXCUzIH0KKworICAgV2l0aGluIHRoZSBMT09QIG1hY3JvLCB0aGUgZmlyc3QgYXJndW1lbnQgKFwlMSkgaXMgdGhlIGxvb3AgY291bnQsIFwlMgorICAgaXMgdGhlIG1hY3JvIG5hbWUsIGFuZCBcJTMgaXMgdGhlIGFyZ3VtZW50IGxpc3QuIFdoZW4gdGhlIExPT1AgbWFjcm8KKyAgIGlzIGludm9rZWQgdHJhZGl0aW9uYWxseSBsaWtlIHRoaXM6CisKKyAgbG9vcCAzIGNvbXBsYWluIGhvdAorCisgICBpdCBwcmludHMgIkl0J3MgdG9vIGhvdCEiIHRocmVlIHRpbWVzLiBUbyBpbnZva2UgaXQgZnJvbSBhbgorICAgUy1FeHByZXNzaW9uLCB5b3UgbXVzdCBxdW90ZSBib3RoIHRoZSBtYWNybyBuYW1lIGFzIHdlbGwgYXMgdGhlCisgICBhcmd1bWVudCwgc2luY2UgaW4gdGhpcyBjYXNlIHRoZSBtYWNybyBuYW1lIGl0c2VsZiBpcyBhbiBhcmd1bWVudDoKKworICAobG9vcCAzICdjb21wbGFpbiAnaG90KQorCisgICBOb3cgd2hhdCBpZiB5b3UgbmVlZCB0byBzZW5kIGRpZmZlcmVudCBvciB2YXJpYWJsZSBudW1iZXJzIG9mCisgICBhcmd1bWVudHMgdG8gdGhlIExPT1AgbWFjcm8/IFRoZSBMT09QIG1hY3JvIGNhbiBoYW5kbGUgaXQgYWxyZWFkeSwKKyAgIHByb3ZpZGVkIHlvdSBncm91cCB0aGUgYXJndW1lbnRzIGludG8gTE9PUCdzIHRoaXJkIGFyZ3VtZW50IChcJTMpLiBJbgorICAgS2VybWl0IHN5bnRheCwgd2l0aG91dCBncm91cGluZzoKKworICBsb29wIDMgY29tcGxhaW4gY29sZCBhbmQgd2V0CisKKyAgIHByaW50cyAiSXQncyB0b28gY29sZCEiIHRocmVlIHRpbWVzICgiYW5kIHdldCIgaXMgbG9zdCk7IGJ1dCB3aXRoCisgICBncm91cGluZyAoZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGZvcm1zKToKKworICBsb29wIDMgY29tcGxhaW4ge2NvbGQgYW5kIHdldH0KKyAgbG9vcCAzIGNvbXBsYWluICJjb2xkIGFuZCB3ZXQiCisKKyAgIHRoZSBMT09QIG1hY3JvIHByaW50cyAiSXQncyB0b28gY29sZCBhbmQgd2V0ISIgdGhyZWUgdGltZXMgYXMgZGVzaXJlZC4KKworICAgVG8gZG8gdGhlIHNhbWUgdGhpbmcgaW4gYW4gUy1FeHByZXNzaW9uLCBqdXN0IHVzZSB0aGUgTGlzcCBmb3JtcyBvZgorICAgcXVvdGluZyBpbnN0ZWFkIG9mIHRoZSBLZXJtaXQgZm9ybXM7IHRoZSBmb2xsb3dpbmcgdHdvIGFyZSBlcXVpdmFsZW50OgorCisgIChsb29wIDMgJ2NvbXBsYWluIChxdW90ZSAoY29sZCBhbmQgd2V0KSkpCisgIChsb29wIDMgJ2NvbXBsYWluICcoY29sZCBhbmQgd2V0KSkKKworICAgSGVyZSdzIGEgc2ltaWxhciBleGFtcGxlIGluIHdoaWNoIHdlIHdyaXRlIGEgbWFjcm8gdGhhdCBzaG93cyBib3RoIHRoZQorICAgbmFtZSBhbmQgdGhlIHZhbHVlIG9mIG9uZSBvciBtb3JlIG90aGVyIG1hY3Jvcywgd2hvc2UgbmFtZXMgYXJlIGdpdmVuCisgICBhcyBhcmd1bWVudHMgKHNpbWlsYXIgdG8gInNob3cgbWFjcm8iKToKKworICBkZWZpbmUgZGlzcGxheSB7CisgICAgICBsb2NhbCBcJWkKKyAgICAgIGZvciBcJWkgMSBcdihhcmdjKS0xIDEgeworICAgICAgICAgIGVjaG8gXCZfW1wlaV0gPSBcbShcJl9bXCVpXSkKKyAgICAgIH0KKyAgfQorCisgICAoUmVjYWxsIHRoYXQgXCZfW10gaXMgdGhlIG1hY3JvJ3MgYXJndW1lbnQgdmVjdG9yIGFycmF5LCBlcXVpdmFsZW50IHRvCisgICBcJTEsIFwlMiwgLi4uKSBUaGUgRElTUExBWSBtYWNybyBjYW4gYmUgdXNlZCBpbiBTLUV4cHJlc3Npb25zIGxpa2UKKyAgIHRoaXM6CisKKyAgKHNldHEgYSAxIGIgMiBjIDMpCisgIChkaXNwbGF5ICdhICdiICdjICdkKQorCisgICB3aGljaCBwcmludHM6CisKKyAgYSA9IDEKKyAgYiA9IDIKKyAgYyA9IDMKKyAgZCA9CisKKyAgIFRoZSBuYW1lcyBtdXN0IGJlIHF1b3RlZCB0byBwcmV2ZW50IHRoZWlyIGV2YWx1YXRpb24gYmVmb3JlIHRoZXkgYXJlCisgICBzZW50IHRvIHRoZSBtYWNyby4gVGhpcyBhYmlsaXR5IHRvIHBhc3MgdmFyaWFibGVzICJieSBuYW1lIiB0byBtYWNyb3MsCisgICByYXRoZXIgdGhhbiBieSB2YWx1ZSwgbGV0cyB5b3Ugd3JpdGUgbWFjcm9zIHRoYXQgY2hhbmdlIHRoZSB2YWx1ZXMgb2YKKyAgIGFyZ3VtZW50IHZhcmlhYmxlcy4gRm9yIGV4YW1wbGUsIGhlcmUncyBhIG1hY3JvIHRoYXQgZG91YmxlcyB0aGUgdmFsdWUKKyAgIG9mIGl0cyBhcmd1bWVudCB2YXJpYWJsZToKKworICBkZWZpbmUgZG91YmxlICgrKyBcJTEgXCUxKQorCisgICB3aGljaCB5b3UgY2FuIGNhbGwgbGlrZSB0aGlzOgorCisgIChzZXRxIGEgMTIpCisgIChkb3VibGUgJ2EpCisKKyAgIEluIHRoZSBtYWNybywgXCUxIGlzIHJlcGxhY2UgYnkgdGhlIHZhcmlhYmxlIG5hbWUgImEiOyAiKCsrIGEgYSkiIGFkZHMKKyAgICJhIiB0byBpdHNlbGYsIGFuZCBzZXRzIHRoZSB2YWx1ZSBvZiAiYSIgdG8gdGhlIHJlc3VsdC4KKworICAgVGhlcmUgYXJlIG5vIGJ1aWx0LWluIG9wZXJhdG9ycyBvdGhlciB0aGFuIFFVT1RFLCAnLCBhbmQgU1RSSU5HIGZvcgorICAgaGFuZGxpbmcgc3RyaW5ncyBpbiBTLUV4cHJlc3Npb25zLCBidXQgdXNpbmcganVzdCB0aGVzZSwgcGx1cyBtYWNyb3MKKyAgIHRoYXQgdXNlIEtlcm1pdCdzIHJlZ3VsYXIgc3RyaW5nLWhhbmRsaW5nIGZlYXR1cmVzLCB5b3UgY2FuIGVhc2lseQorICAgZXh0ZW5kIFMtRXhwcmVzc2lvbnMgdG8gZG8gc3RyaW5nIG1hbmlwdWxhdGlvbjoKKworICBkZWZpbmUgbGVuIHJldHVybiBcZmxlbihcJTEpICAgICAgICAgICAgICAgUmV0dXJucyBsZW5ndGggb2YgYXJndW1lbnQgc3RyaW5nCisgIGRlZmluZSBjYXAgcmV0dXJuIFxmdXBwZXIoXCUxKSAgICAgICAgICAgICBVcHBlcmNhc2UgYXJndW1lbnQgc3RyaW5nCisgIGRlZmluZSByZXYgcmV0dXJuIFxmcmV2ZXJzZShcJTEpICAgICAgICAgICBSZXZlcnNlcyBhcmd1bWVudCBzdHJpbmcKKyAgZGVmaW5lIHN1YiByZXR1cm4gXGZzdWJzdHIoXCUxLFwlMixcJTMpICAgIFJldHVybnMgc3Vic3RyaW5nIG9mIGFyZyBzdHJpbmcKKworICAobGVuICcodGhpcyBpcyBhIHN0cmluZykpICAgICAgICAgICAgICAgICAgUmVzdWx0OiAxNgorICAocmV2ICcodGhpcyBpcyBhIHN0cmluZykpICAgICAgICAgICAgICAgICAgUmVzdWx0OiBnbmlydHMgYSBzaSBzaWh0CisgIChyZXYgKGNhcCAnKHRoaXMgaXMgYSBzdHJpbmcpKSkgICAgICAgICAgICBSZXN1bHQ6IEdOSVJUUyBBIFNJIFNJSFQKKyAgKHN1YiAocmV2IChjYXAgJyh0aGlzIGlzIGEgc3RyaW5nKSkpIDUgOSkgIFJlc3VsdDogVFMgQSBTSSBTCisKKyAgIFlvdSBjYW4gYXNzaWduIGEgc3RyaW5nIHRvIGEgbWFjcm8gbmFtZSBhcyBmb2xsb3dzOgorCisgIChzZXRxIGZvbyAnKHRoaXMgaXMgYSBzdHJpbmcpKQorICAoc2V0cSBmb28gKHF1b3RlICh0aGlzIGlzIGEgc3RyaW5nKSkpCisKKyAgIFRoZSB0d28gYXJlIGV4YWN0bHkgZXF1aXZhbGVudC4gSW4gYm90aCBjYXNlcywgdGhlIG1hY3JvICJmb28iIGhhcyB0aGUKKyAgIHZhbHVlOgorCisgICcodGhpcyBpcyBhIHN0cmluZykKKworICAgc28gd2hlbiBpdCBpcyByZXRyaWV2ZWQgaXQgY2FuIGJlIGlkZW50aWZpZWQgYXMgYSBzdHJpbmcgcmF0aGVyIHRoYW4gYQorICAgbnVtYmVyIG9yIGNvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkLiBUaHVzOgorCisgIChzZXRxIGZvbyAocXVvdGUgKHRoaXMgaXMgYSBzdHJpbmcpKSkKKyAgc2hvdyBtYWNybyBmb28KKyAgZm9vID0gJyh0aGlzIGlzIGEgc3RyaW5nKQorICAoZm9vKQorICB0aGlzIGlzIGEgc3RyaW5nCisKKyAgIE5vdGUgdGhlIGRpZmZlcmVudCByZXN1bHRzIGZvciAic2hvdyBtYWNybyBmb28iIGFuZCAiKGZvbykiLiBUaGUKKyAgIGZvcm1lciBzaG93cyB0aGUgaW50ZXJuYWwgZGVmaW5pdGlvbjsgdGhlIGxhdHRlciBldmFsdWF0ZXMgdGhlCisgICB2YXJpYWJsZSwgd2hpY2ggcmVtb3ZlcyB0aGUgcXVvdGluZy4gQW5kIHBlcmhhcHMgbW9yZSBpbXBvcnRhbnQsIG5vdGUKKyAgIHRoYXQgaWYgdGhlIGFwb3N0cm9waGUgYW5kIHN1cnJvdW5kaW5nIHBhcmVudGhlc2VzIHdlcmUgbm90IHN0b3JlZCBhcworICAgcGFydCBvZiB0aGUgZGVmaW5pdGlvbiwgKGZvbykgd291bGQgdHJ5IHRvIGV4ZWN1dGUgInRoaXMgaXMgYSBzdHJpbmciCisgICBhcyBhIGNvbW1hbmQuCisKKyAgIEdpdmVuIHRoZSBhc3NpZ25tZW50IGFib3ZlLCB0aGUgZm9sbG93aW5nIHdvcmsgYXMgZXhwZWN0ZWQ6CisKKyAgKGxlbiBmb28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdDogMTYKKyAgKHJldiBmb28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdDogZ25pcnRzIGEgc2kgc2lodAorICAocmV2IChjYXAgZm9vKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0OiBHTklSVFMgQSBTSSBTSUhUCisgIChzdWIgKHJldiAoY2FwIGZvbykpIDUgOCkgICAgICAgICAgICAgICAgICBSZXN1bHQ6IFRTIEEgU0kgUworCisgICBOb3RlIHRoYXQsIHVubGlrZSBidWlsdC1pbiBTLUV4cHJlc3Npb24gb3BlcmF0b3JzIHRoYXQgcmV0dXJuIG51bWJlcnMKKyAgIG9yIHRydXRoIHZhbHVlcywgdGhlc2Ugb3BlcmF0b3JzIHJldHVybiBzdHJpbmdzLiBJZiB5b3Ugd2FudCB0byBhc3NpZ24KKyAgIHRoZWlyIHJldHVybiB2YWx1ZXMgdG8gb3RoZXIgdmFyaWFibGVzLCB5b3UgY2FuIGRvIHNvOgorCisgIChzZXRxIGJhciAocmV2IChjYXAgZm9vKSkpICAgICAgICAgICAgICAgICBSZXN1bHQ6IEdOSVJUUyBBIFNJIFNJSFQKKworICAgQnV0IG5vdyB0aGUgUy1FeHByZXNzaW9uIHByb2Nlc3NvciBkb2Vzbid0IGtub3cgdGhlIHZhbHVlIG9mICJiYXIiIGlzCisgICBzdXBwb3NlZCB0byBiZSBhIHN0cmluZywgcmF0aGVyIHRoYW4gYSBtYWNybyB0byBleGVjdXRlLiBGb3IgdGhpcyB5b3UKKyAgIG5lZWQgb25lIGZpbmFsIHNwZWNpYWwgb3BlcmF0b3IsIFNUUklORy4gVGhlIFNUUklORyBvcGVyYXRvciB0YWtlcyBhbgorICAgUy1FeHByZXNzaW9uIGFzIGFuIG9wZXJhbmQsIGV2YWx1YXRlcyBpdCwgYW5kIHRoZW4gcmV0dXJucyBpdHMgdmFsdWUKKyAgIGVuY2xvc2VkIGluICcoKSwgc28geW91IGNhbiB1c2UgdGhlIHZhbHVlIGFzIGEgc3RyaW5nIGlzIHN1YnNlcXVlbnQKKyAgIFMtRXhwcmVzc2lvbnMuIFVzZSBTVFJJTkcgZm9yIHJlZmVyZW5jaW5nIG1hY3JvcyB0aGF0IHJldHVybiBzdHJpbmdzOgorCisgIChzZXRxIGJhciAoc3RyaW5nIChyZXYgKGNhcCBmb28pKSkpICAgICAgICBSZXN1bHQ6ICcoR05JUlRTIEEgU0kgU0lIVCkKKworICAgU1RSSU5HIGlzIGxpa2UgUVVPVEUsIGV4Y2VwdCB0aGF0IGl0IGV2YWx1YXRlcyBpdHMgb3BlcmFuZCBiZWZvcmUKKyAgIGFwcGx5aW5nIHRoZSBxdW90aW5nLCByYXRoZXIgdGhhbiB0YWtpbmcgdGhlIG9wZXJhbmQgbGl0ZXJhbGx5LgorCisgICBUbyByZWZlcmVuY2UgYmFja3NsYXNoIHZhcmlhYmxlcyBvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gc3RyaW5nCisgICB2YWx1ZXMsIHlvdSBtdXN0IHVzZSB0aGUgcmVndWxhciBxdW90aW5nIG1lY2hhbmlzbXM6CisKKyAgKHNldHEgdGltZSAnKFx2KHRpbWUpKSkKKyAgKHNldHEgZGF0ZSAnKFx2KGRhdGUpKSkKKyAgYXNzaWduIFwlciB0aGlzIGlzIGEgc3RyaW5nCisgIChzZXRxIHMxICcoXCVyKSkKKworICAgVGhhdCdzIGJlY2F1c2UgYmFja3NsYXNoIGl0ZW1zIGFyZSBldmFsdWF0ZWQgQkVGT1JFIHRoZSBTLUV4cHJlc3Npb24KKyAgIHBhcnNlciBldmVyIHNlZXMgdGhlbSwgYW5kIHRoZSB2YWx1ZXMgb2YgXHYodGltZSkgYW5kIHNvIG9uIGFyZSBub3QKKyAgIHZhbGlkIFMtRXhwcmVzc2lvbnMsIHNvIFNUUklORyB3b24ndCBsaWtlIHRoZW0uCisKKyAgIEZpbmFsbHkgYSBicmllZiB3b3JkIG9uIHRoZSB0b3VjaHkgdG9waWMgb2YgcXVvdGluZy4gU3VwcG9zZSB5b3Ugd2FudAorICAgdG8gaW5jbHVkZSAoc2F5KSBsaXRlcmFsIHBhcmVudGhlc2VzIGluIGEgc3RyaW5nIHRoYXQgd2lsbCBsYXRlciBiZQorICAgcHJvY2Vzc2VkIGJ5IHRoZSBTLUV4cHJlc3Npb24gcmVhZGVyIChvciBcZnNwbGl0KCkgb3IgXGZ3b3JkKCkpLgorICAgTm9ybWFsbHksIHlvdSBjYW4ndCBkbyB0aGlzIGJlY2F1c2UgcGFyZW50aGVzZXMgYXJlIG1lYW5pbmdmdWwgaW4KKyAgIHRoZXNlIGNvbnRleHRzLiBUbyBkZWZlYXQgdGhlIG5vcm1hbCBwYXJzaW5nIHJ1bGVzLCB5b3UgY2FuIHF1b3RlIHRoZQorICAgcGFyZW50aGVzZXMgd2l0aCBiYWNrc2xhc2guIEhvd2V2ZXIsIGR1ZSB0byB0aGUgbWFueSBsZXZlbHMgb2Ygc3RyaW5nCisgICBwcm9jZXNzaW5nIGludm9sdmVkLCBhIHN1cnByaXNpbmdseSBsYXJnZSBhbW91bnQgb2YgYmFja3NsYXNoZXMgbWlnaHQKKyAgIGJlIHJlcXVpcmVkLCBmb3IgZXhhbXBsZToKKworICAoc2V0cSBzICcoYSBiIChjIGQpIFxcXFxcXFxcXFxcXFxcXFwoZSBmIChnIGgpIHhcXFxcXFxcXFxcXFxcXFxcKSBqIGspKQorCisgICBUaGlzIGlzIG5lYXJseSBpbXBvc3NpYmxlIHRvIGV4cGxhaW4oKikuIEluc3RlYWQsIGp1c3QgcmVtZW1iZXIgdHdvCisgICBwb2ludHM6CisKKyAgICAgKiBJbiBzaXR1YXRpb25zIGxpa2UgdGhpcywgaXQncyBiZXR0ZXIgdG8gdXNlIERFRklORSB0byBjcmVhdGUgdGhlCisgICAgICAgc3RyaW5nLCByYXRoZXIgdGhhbiBTRVRRLiBUaGUgZXhhbXBsZSBhYm92ZSByZXF1aXJlcyBvbmx5IGRvdWJsZQorICAgICAgIGJhY2tzbGFzaGVzIHdoZW4gREVGSU5FIGlzIHVzZWQ6CisgIGRlZmluZSBzICcoYSBiIChjIGQpIFxcKGUgZiAoZyBoKSB4XFwpIGogaykKKyAgICAgKiBUaGUgbGV2ZWwgb2YgcXVvdGluZyBkZXBlbmRzIG9uIGhvdyBtYW55IGxldmVscyBvZiBldmFsdWF0aW9uIHRoZQorICAgICAgIHN0cmluZyBtdXN0IHBhc3MgdGhyb3VnaCwgd2hpY2ggaXMgbm90IGFsd2F5cyBvYnZpb3VzLiBIb3dldmVyLAorICAgICAgIHRoZSBudW1iZXIgb2YgYmFja3NsYXNoZXMgcmVxdWlyZWQgaW4gYW55IGdpdmVuIHNpdHVhdGlvbiBpcworICAgICAgIGFsd2F5cyBhIHBvd2VyIG9mIDIuIFNvIGlmIDEgZG9lc24ndCB3b3JrLCB0cnkgMjsgaWYgMiBkb2Vzbid0CisgICAgICAgd29yaywgdHJ5IDQ7IGlmIDQgZG9lc24ndCB3b3JrLCB0cnkgOCwgMTYsIDMyLCBhbmQgc28gb24uCisKKyAgIENvbnNpZGVyYXRpb25zIGxpa2UgdGhpcyBhcHBseSBpbiBhbnkgc2NyaXB0aW5nIGxhbmd1YWdlIChzaGVsbCwgVGNsLAorICAgUGVybCwgUHl0aG9uLCBldGMpLiBUaGUgc2l0dWF0aW9uIGlzIGtub3duIGFzICJRdW90aW5nIEhlbGwiLgorCisgICAoKikgSWYgeW91IHJlYWxseSB3YW50IGFuIGV4cGxhbmF0aW9uLCBoZXJlIGl0IGlzOgorCisgICAgICogRXZlcnkgU0VYUCBoYXMgaXRzIGJhY2tzbGFzaCBpdGVtcyBldmFsdWF0ZWQgaW4gYSBzaW5nbGUgcGFzcyBhdAorICAgICAgIHRvcCBsZXZlbCBiZWZvcmUgYmVpbmcgcGFzc2VkIHRvIHRoZSBTRVhQIHJlYWRlciwgc28gXCUxLAorICAgICAgIFx2KGZ0aW1lKSwgZXRjLCBjYW4gYmUgZXZhbHVhdGVkIHVwIGZyb250LCBmcmVlaW5nIHRoZSBTRVhQIHJlYWRlcgorICAgICAgIG9mIGhhdmluZyB0byBrbm93IGFib3V0IHN1Y2ggdGhpbmdzLCB3aGljaCBpbiB0dXJuIG1ha2VzIGl0IG11Y2gKKyAgICAgICBtb3JlIGVmZmljaWVudC4gVGhlcmVmb3JlIG9uZSBsZXZlbCBvZiBxdW90aW5nIGlzIGxvc3QgcmlnaHQgYXdheSwKKyAgICAgICBhbmQgdGhlcmVmb3JlIHlvdSBtdXN0IGRvdWJsZSBlYWNoIGJhY2tzbGFzaCB0aGF0IGlzIHRvIGJlIHVzZWQgYXMKKyAgICAgICBhIHF1b3RlLgorICAgICAqIFdoZW4gdGhlIFNFWFAgcmVhZGVyIHNlZXMgJ1wnLCBpdCB0cmVhdHMgaXQgYXMgYSBxdW90ZTsgZGlzY2FyZHMKKyAgICAgICBpdCBhbmQga2VlcHMgdGhlIG5leHQgY2hhcmFjdGVyLiBUaHVzICdcXCcgYmVjb21lcyAnXCcuIFRoaXMgd291bGQKKyAgICAgICBiZSB0aGUgZW5kIG9mIGl0LCBleGNlcHQgdGhhdDoKKyAgICAgKiBUaGUgU0VYUCByZWFkZXIgbXVzdCBjYWxsIGl0c2VsZiByZWN1cnNpdmVseSBvbiBpdHMgb3BlcmFuZHMsIHNvCisgICAgICAgd2UgbXVzdCBkb3VibGUgYW55IHF1b3RlcyBpbiB0aGUgb3BlcmFuZHM6IDJeMiA9IDQuCisgICAgICogSWYgdGhlIHJlc3VsdCBpcyB0byBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gYSBtYWNybywgdGhlCisgICAgICAgYmFja3NsYXNoZXMgbXVzdCBhZ2FpbiBiZSBkb3VibGVkLCBiZWNhdXNlIHRoZSBtYWNybyBwcm9jZXNzb3IKKyAgICAgICBldmFsdWF0ZXMgdGhlIGFyZ3VtZW50cyBiZWZvcmUgc2VuZGluZyB0aGVtIHRvIHRoZSBtYWNybzogMl4zID0gOC4KKyAgICAgKiBJZiB0aGUgbWFjcm8gaXRzZWxmIGlzIHRvIHNlZSB0aGUgcXVvdGVzLCByYXRoZXIgdGhhbiBqdXN0IHRoZQorICAgICAgIHJlc3VsdCBvZiB0aGUgcXVvdGluZywgdGhlIHF1b3RlcyBtdXN0IGJlIGRvdWJsZWQgYWdhaW46IDJeNCA9IDE2LgorCisgICBNb3JhbDogVG8gY3JlYXRlIHN0cmluZyBjb25zdGFudHMgaW4gd2hpY2ggZ3JvdXBpbmcgY2hhcmFjdGVycyBtdXN0IGJlCisgICBxdW90ZWQsIHVzZSBERUZJTkUgcmF0aGVyIHRoYW4gU0VUUS4KKworICAgWyBbNTI1XVRvcCBdIFsgWzUyNl1Db250ZW50cyBdIFsgWzUyN11DLUtlcm1pdCBIb21lIF0gWyBbNTI4XUtlcm1pdAorICAgSG9tZSBdCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOS45LiBFeGFtcGxlcworCisgICAgOS45LjEuIFN0YXRpc3RpY3MKKworICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIGNvbXB1dGVzIHN0YXRpc3RpY3MgLS0gbWVhbnMsIG1heGltYSwgbWltaW1hLAorICAgdmFyaWFuY2UsIHN0YW5kYXJkIGRldmlhdGlvbiwgYW5kIGNvcnJlbGF0aW9uIC0tIGZyb20gZGF0YSBzdG9yZWQgaW4KKyAgIHBhcmFsbGVsIGFycmF5cywgXCZ4W10gYW5kIFwmeVtdLCB3aGljaCBjYW4gY29udGFpbiBhbnkgbWl4dHVyZSBvZgorICAgaW50ZWdlciBhbmQgZmxvYXRpbmctcG9pbnQgbnVtYmVyczogcG9zaXRpdmUsIG5lZ2F0aXZlLCBvciB6ZXJvLiBBcnJheQorICAgc2V0dXAgYW5kIHZhbGlkYXRpb24gYXJlIG5vdCBzaG93bi4gRXhjZXB0IGZvciB0aGUgdHJhZGl0aW9uYWwgRk9SCisgICBsb29wIGFuZCBwcmludGluZyB0aGUgcmVzdWx0cyBhdCB0aGUgZW5kLCB0aGUgZW50aXJlIGNvbXB1dGF0aW9uIGlzCisgICBkb25lIHdpdGggUy1FeHByZXNzaW9uczoKKworOyBJbml0aWFsaXplIHN1bXMsIG1heGltYSwgbWluaW1hLCBhbmQgbnVtYmVyIG9mIGVsZW1lbnRzCisKKyAgKHNldHEgeHN1bSAwIHlzdW0gMCB4c3VtMiAwIHlzdW0yIDAgeHlzdW0gMCkKKyAgKHNldHEgeG1pbiAoc2V0cSB4bWF4IFwmeFsxXSkgeW1pbiAoc2V0cSB5bWF4IFwmeVsxXSkpCisgIChzZXRxIG4gXGZkaW0oJngpKQorCis7IExvb3AgdGhyb3VnaCBlbGVtZW50cyBhbmQgYWNjdW11bGF0ZSBzdW1zLCBtYXhpbWEsIGFuZCBtaW5pbWEKKworICBmb3IgaSAxIG4gMSB7CisgICAgICAoc2V0cSB4IFwmeFtpXSB5IFwmeVtpXSkgICAgICAgICAgICAgICAgICAgIDsgTm90YXRpb25hbCBjb252ZW5pZW5jZQorICAgICAgKHNldHEgeG1heCAobWF4IHhtYXggeCkgeW1heCAobWF4IHltYXggeSkpICA7IFggYW5kIFkgbWF4aW1hCisgICAgICAoc2V0cSB4bWluIChtaW4geG1pbiB4KSB5bWluIChtaW4geW1pbiB5KSkgIDsgWCBhbmQgWSBtaW5pbWEKKyAgICAgICgrKyB4c3VtIHggeXN1bSB5KSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBYIGFuZCBZIHN1bXMKKyAgICAgICgrKyB4c3VtMiAoXiB4IDIpIHlzdW0yICheIHkgMikpICAgICAgICAgICAgOyBTdW0gb2YgWCBhbmQgWSBzcXVhcmVzCisgICAgICAoKysgeHlzdW0gKCogeCB5KSkgICAgICAgICAgICAgICAgICAgICAgICAgIDsgU3VtIG9mIFhZIHByb2R1Y3RzCisgIH0KKworOyBDYWxjdWxhdGUgcmVzdWx0cworCisgIChzZXRxIHhtZWFuICgvIHhzdW0gbikgeW1lYW4gKC8geXN1bSBuKSkgICAgICAgIDsgTWVhbiBYIGFuZCBZCisgIChzZXRxIHhzcyAoLSB4c3VtMiAoLyAoXiB4c3VtIDIpIG4pKSkgICAgICAgICAgIDsgSW50ZXJtZWRpYXRlIHZhbHVlcworICAoc2V0cSB5c3MgKC0geXN1bTIgKC8gKF4geXN1bSAyKSBuKSkpCisgIChzZXRxIHh5c3MgKC0geHlzdW0gKC8gKCogeHN1bSB5c3VtKSBuKSkpCisgIChzZXRxIHh2YXIgKC8geHNzIG4pIHl2YXIgKC8geXNzIG4pKSAgICAgICAgICAgIDsgWCBhbmQgWSB2YXJpYW5jZQorICAoc2V0cSBzZHggKHNxcnQgeHZhcikgc2R5IChzcXJ0IHl2YXIpKSAgICAgICAgICA7IFN0ZCBkZXZpYXRpb24gaW4gWCBhbmQgWQorICAoc2V0cSB0bXAgKCogeHNzIHlzcykpCisgIChzZXRxIGNjIChpZiB0bXAgKC8geHlzcyAoc3FydCB0bXApKSAxLjApKSAgICAgIDsgQ29ycmVsYXRpb24gY29lZmZpY2llbnQKKyAgc2hvdyBtYWNybyB4bWVhbiB5bWVhbiB4dmFyIHl2YXIgc2R4IHNkeSBjYyAgICAgOyBQcmludCB0aGUgcmVzdWx0cworCisgICBUaGUgZmluYWwgImlmIHRtcCIgY2hlY2sgYWNjb3VudHMgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGJvdGggYXJyYXlzCisgICBjb250YWluIGFsbCAwJ3MuIFJlc3VsdHMgY2FuIGFsc28gYmUgcHJpbnRlZCB3aXRoICJlY2hvIENDID0gXG0oY2MpIiwKKyAgIG9yIGFueSBvdGhlciBkZXNpcmVkIHdheS4gSW50ZXJlc3RpbmdseSwgaWYgd2UgaGFkIG5vdCBuZWVkZWQgdGhlIHN1bQorICAgb2YgdGhlIHNxdWFyZXMgYW5kIHByb2R1Y3RzLCB3ZSBjb3VsZCBoYXZlIG9idGFpbmVkIHRoZSBzdW1zLCBtYXhpbWEsCisgICBhbmQgbWluaW1hIG9mIHRoZSBYJ3MgYW5kIFkncyB3aXRob3V0IGEgbG9vcCBsaWtlIHRoaXM6CisKKyAgKHNldHEgeHN1bSAoKyBcZmpvaW4oJngpKSB5c3VtICgrIFxmam9pbigmeSkpKQorICAoc2V0cSB4bWF4IChtYXggXGZqb2luKCZ4KSkgeW1heCAobWF4IFxmam9pbigmeSkpKQorICAoc2V0cSB4bWluIChtaW4gXGZqb2luKCZ4KSkgeW1pbiAobWluIFxmam9pbigmeSkpKQorCisgICBBbnkgS2VybWl0IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBudW1iZXJzIG9yIGxpc3RzIG9mIG51bWJlcnMgY2FuIGJlCisgICBpbmNsdWRlZCBpbiBhbiBTLUV4cHJlc3Npb24gYXMgYW4gb3BlcmFuZC4KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDkuOS4yLiBQcmFjdGljYWwgRmlib25hY2NpIFNlcmllcworCisgICBUaGUgcmVjdXJzaXZlIEZpYm9uYWNjaSBleGFtcGxlIGdpdmVuIHByZXZpb3VzbHkgaXMgc2ltcGxlIGFuZAorICAgZWxlZ2FudCwgYnV0IG5vdCB2ZXJ5IHVzZWZ1bCBzaW5jZSBpdCBjYXVzZXMgbWVtb3J5IG9jY3VwYXRpb24gdG8gZ3JvdworICAgZWFjaCB0aW1lIGl0IGNhbGxzIGl0c2VsZiwgdW50aWwgZXZlbnR1YWxseSBib3RoIHBoeXNpY2FsIG1lbW9yeSBhbmQKKyAgIGRpc2sgc3dhcCBzcGFjZSBhcmUgZmlsbGVkIGFuZCB0aGUgcHJvZ3JhbSBjcmFzaGVzLiBFdmVuIGZvciBzbWFsbAorICAgYXJndW1lbnRzLCBsaWtlIDE3LCBleGVjdXRpb24gdGltZSBjYW4gYmUgcHJvaGliaXRpdmU6CisKKyAgKHNldHEgdDEgXHYoZnRpbWUpKQorICAoc2V0cSByZXN1bHQgKGZpYm9uYWNjaSAxNykpCisgIChzZXRxIHQyICgtIFx2KGZ0aW1lKSB0MSkpCisgIGVjaG8gRklCT05BQ0NJKDE3KSA9IFxtKHJlc3VsdCk6IFRJTUUgPSBcZmZwcm91bmQodDIsMykKKworICAgcHJpbnRzIChvbiBhIGNlcnRhaW4gcmF0aGVyIHNsb3cgY29tcHV0ZXIpOgorCisgIEZJQk9OQUNDSSgxNykgPSAxNTk3OiBUSU1FID0gNS44NjEKKworICAgQW55IHJlY3Vyc2l2ZSBmdW5jdGlvbiBjYW4gYmUgcmVjb2RlZCBpdGVyYXRpdmVseS4gVGhlIHJlc3VsdCBpcyBub3QKKyAgIGFzIHByZXR0eSwgYnV0IGV4ZWN1dGlvbiBpcyBmYXIgbGVzcyBleHBlbnNpdmU6CisKKyAgICBkZWZpbmUgRklCSVRFUiB7CisgICAgICAgIChpZiAoPT0gXCUzIDApIChcJTIpIChmaWJpdGVyICgrIFwlMSBcJTIpIFwlMSAoLSBcJTMgMSkpKQorICAgIH0KKyAgICBkZWZpbmUgRklCT05BQ0NJIHsKKyAgICAgICAgKGZpYml0ZXIgMSAwIFwlMSkKKyAgICB9CisKKyAgIEhlcmUncyB0aGUgcmVzdWx0IG9uIHRoZSBzYW1lIGNvbXB1dGVyIGZvciB0aGUgc2FtZSBhcmd1bWVudCBvZiAxNzoKKworICBGSUJPTkFDQ0koMTcpID0gMTU5NzogVElNRSA9IDAuMDE1CisKKyAgICg0NyB0aW1lcyBmYXN0ZXIuKSBFeGVjdXRpb24gdGltZSBpbmNyZWFzZXMgcHJvcG9ydGlvbmFsbHkgdG8gdGhlIHNpemUKKyAgIG9mIHRoZSBhcmd1bWVudCBpbiB0aGUgaXRlcmF0aXZlIGNhc2UsIHdoZXJlYXMgaW4gdGhlIHJlY3Vyc2l2ZSBjYXNlCisgICBpdCBnb2VzIHVwIGdlb21ldHJpY2FsbHksIHF1aWNrbHkgcmVhY2hpbmcgaW5maW5pdHkuCisKKyAgIFsgWzUyOV1Ub3AgXSBbIFs1MzBdQ29udGVudHMgXSBbIFs1MzFdQy1LZXJtaXQgSG9tZSBdIFsgWzUzMl1LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDkuMTAuIERpZmZlcmVuY2VzIGZyb20gQWxnZWJyYWljIE5vdGF0aW9uCisKKyAgIEluIEMtS2VybWl0OgorCisgICAgICogQWxnZWJyYWljIG5vdGF0aW9uIHVzZXMgaW5maXggb3BlcmF0b3JzIGFuZCBub3JtYWwgcnVsZXMgb2YKKyAgICAgICBvcGVyYXRvciBwcmVjZWRlbmNlLCB3aXRoIHBhcmVudGhlc2VzIHVzZWQgdG8gZm9yY2UgZXhjZXB0aW9ucyB0bworICAgICAgIHRoZSBydWxlczsgbWFueSBvcGVyYXRpb25zIGNhbiBiZSBpbmNsdWRlZCBpbiBhbiBleHByZXNzaW9uLgorICAgICAgIFMtRXhwcmVzc2lvbnMgdXNlIHByZWZpeCBvcGVyYXRvcnMgd2l0aCBubyBpbnRyaW5zaWMgcHJlY2VkZW5jZTsKKyAgICAgICBlYWNoIG9wZXJhdGlvbiBpcyBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcywgYW5kIHRoZSBhcnJhbmdlbWVudCBvZgorICAgICAgIHBhcmVudGhlc2VzIGRldGVybWluZXMgcHJlY2VkZW5jZS4KKyAgICAgKiBBbGdlYnJhaWMgaW5maXggb3BlcmF0b3JzIHJlcXVpcmUgdHdvIG9wZXJhbmRzOyBTLUV4cHJlc3Npb24KKyAgICAgICBwcmVmaXggb3BlcmF0b3JzIGNhbiBhY2NlcHQgYSB2YXJpYWJsZSBudW1iZXIgb2Ygb3BlcmFuZHMuCisgICAgICogWW91IGNhbiB1c2UgYWxnZWJyYWljIG5vdGF0aW9uIGFueXdoZXJlIHRoYXQgQy1LZXJtaXQgYWNjZXB0cyBhCisgICAgICAgbnVtYmVyLCBlLmcuICJlY2hvIFwmYVsoKDErMSkqMi0xXSIsIGJ1dCB5b3UgY2FuIHVzZSBTLUV4cHJlc3Npb25zCisgICAgICAgb25seSBhcyB0b3AtbGV2ZWwgY29tbWFuZHMuIFlvdSBjYW4sIGhvd2V2ZXIsIHVzZSBlaXRoZXIgYWxnZWJyYWljCisgICAgICAgb3IgUy1FeHByZXNzaW9ucyBhbnl3aGVyZSBhdCBhbGwgYnkgZW5jbG9zaW5nIHRoZW0gaW4gXGZldmFsdWF0ZSgpCisgICAgICAgb3IgXGZzZXhwcmVzc2lvbigpLCByZXNwZWN0aXZlbHkuCisgICAgICogWW91IGNhbiB1c2UgYW55IG1peHR1cmUgb2YgaW50ZWdlciBhbmQgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBpbgorICAgICAgIFMtRXhwcmVzc2lvbnMsIGJ1dCBvbmx5IGludGVnZXJzIGFyZSBwZXJtaXR0ZWQgaW4gYWxnZWJyYWljCisgICAgICAgZXhwcmVzc2lvbnMuIE91dHNpZGUgb2YgUy1FeHByZXNzaW9ucywgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYworICAgICAgIGlzIHN1cHBvcnRlZCBvbmx5IGJ5IFxmZnAuLi4oKSBmdW5jdGlvbiBjYWxscy4KKyAgICAgKiBPcGVyYXRvcnMgYW5kIG9wZXJhbmRzIGluIFMtRXhwcmVzc2lvbnMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkKKyAgICAgICBzcGFjZXMsIGUuZy4gIigrIGEgYikiLiBTcGFjZXMgYXJlIG5vdCByZXF1aXJlZCBpbiBhbGdlYnJhaWMKKyAgICAgICBleHByZXNzaW9uczogIigoYStiKSpjKSIuCisgICAgICogV2hlbiBhc3NpZ25pbmcgdmFsdWVzIHRvIGJhY2tzbGFzaCB2YXJpYWJsZXMgKHN1Y2ggYXMgXCV4IG9yCisgICAgICAgXCZhWzJdKSB1c2luZyBTRVRRIG9yIExFVCwgeW91IG11c3QgZG91YmxlIHRoZSBiYWNrc2xhc2guCisKKyAgIFsgWzUzM11Ub3AgXSBbIFs1MzRdQ29udGVudHMgXSBbIFs1MzVdQy1LZXJtaXQgSG9tZSBdIFsgWzUzNl1LZXJtaXQKKyAgIEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDkuMTEuIERpZmZlcmVuY2VzIGZyb20gTGlzcAorCisgICAgICogS2VybWl0IGhhcyBhIGxvdCBvZiBidWlsdC1pbiBvcGVyYXRvcnMgbm90IGZvdW5kIGluIExpc3A6ICsrLCBeLAorICAgICAgIGV0Yy4KKyAgICAgKiBNb3N0IGRpYWxlY3RzIG9mIHJlYWwgTGlzcCBkbyBub3QgYWxsb3cgUy1FeHByZXNzaW9ucyB0aGF0IGRvbid0CisgICAgICAgc3RhcnQgd2l0aCBhbiBvcGVyYXRvciwgZm9yIGV4YW1wbGU6CisgIChhKQorICAgICAgIFRoaXMgZXhwcmVzc2lvbiBjYW4gY2F1c2UgYW4gZXJyb3IgaW4gTGlzcCAoZXZlbiBpZiAiYSIgaGFzIGEKKyAgICAgICB2YWx1ZSksIGJ1dCBpcyBhY2NlcHRhYmxlIGluIEtlcm1pdCwgd2hlcmUgaXQgcmV0dXJucyB0aGUgdmFsdWUgb2YKKyAgICAgICB0aGUgdmFyaWFibGUgImEiLiBTaW1pbGFybHksICgxKSByZXR1cm5zIHRoZSB2YWx1ZSAiMSIuCisgICAgICogSW4gcmVhbCBMaXNwLCBFVkFMIHJlcXVpcmVzIGV4YWN0bHkgb25lIG9wZXJhbmQuIEluIEtlcm1pdCwgaXQgY2FuCisgICAgICAgaGF2ZSAwLCAxLCAyLCBvciBtb3JlIG9wZXJhbmRzLiBJdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdAorICAgICAgIG9wZXJhbmQgZXZhbHVhdGVkLgorICAgICAqIFJlYWwgTGlzcCBTRVRRIGFuZCBMRVQgdXN1YWxseSByZXF1aXJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9wZXJhbmRzLgorICAgICAgIEtlcm1pdCBhbGxvd3MgYW4gb2RkIG51bWJlciwgaW4gd2hpY2ggY2FzZSB0aGUgbGFzdCAob3Igb25seSkKKyAgICAgICB2YXJpYWJsZSBpcyB1bmRlZmluZWQgKGkuZS4gZGVsZXRlZCwgZGVzdHJveWVkKS4KKyAgICAgKiBLZXJtaXQgZG9lcyBub3Qgc3VwcG9ydCByYXRpb3Mgc3VjaCBhcyAiNy84Ii4gU29tZSBMaXNwIGRpYWxlY3RzCisgICAgICAgYWNjZXB0IHJhdGlvcyBhcyBudW1iZXJzLCBhbmQgZ2VuZXJhdGUgcmF0aW9zIHdoZW4gdG9sZCB0byBkaXZpZGUKKyAgICAgICB0d28gaW50ZWdlcnMgd2hvc2UgcXVvdGllbnQgaXMgbm90IGEgd2hvbGUgbnVtYmVyOyBlLmcuIGluIENvbW1vbgorICAgICAgIExpc3A6CisgIFsxM10gVVNFUigzNyk6ICgvICgrIDEgMiAzIDQpIDMpCisgIDEwLzMKKyAgWzEzXSBVU0VSKDM4KToKKyAgICAgKiBUaGUgcmVzdWx0IG9mICgvIDEwIDMpIGlzIDMuMzMzLi4uLiBTb21lIExpc3AgZGlhbGVjdHMgdHJ1bmNhdGUKKyAgICAgICB0aGUgcmVzdWx0IHRvIDMgc2luY2UgYm90aCBvcGVyYW5kcyBhcmUgaW50ZWdlcnMsIHNvbWUgZG9uJ3Q7IHNvbWUKKyAgICAgICBnaXZlIHRoZSByZXN1bHQgYXMgYSByYXRpby4gQy1LZXJtaXQgYWx3YXlzIGdpdmVzIGEgZmxvYXRpbmcgcG9pbnQKKyAgICAgICByZXN1bHQgd2hlbiB0aGVyZSBpcyBhIGZyYWN0aW9uYWwgcGFydC4gSWYgeW91IHdhbnQgYW4gaW50ZWdlcgorICAgICAgIHJlc3VsdCwgeW91IGNhbiB1c2UgVFJVTkNBVEUsIEZMT09SLCBvciBDRUlMSU5HLCBlLmcuICh0cnVuY2F0ZSAoLworICAgICAgIDEwIDMpKS4KKyAgICAgKiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gImJpZ251bSIgc3VwcG9ydC4gTGFyZ2UgbnVtYmVycyBjYW4gYmUgdXNlZAorICAgICAgIGFuZCBsYXJnZSByZXN1bHRzIGdlbmVyYXRlZCwgYnV0IChhcyBub3RlZCBpbiBbNTM3XVNlY3Rpb24gOS4yKQorICAgICAgIHRoZXkgYXJlIGFjY3VyYXRlIG9ubHkgdG8gdGhlIHByZWNpc2lvbiBvZiB0aGUgdW5kZXJseWluZyBtYWNoaW5lLgorICAgICAgIFx2KG1hdGhfcHJlY2lzaW9uKSBnaXZlcyB0aGUgbWFjaGluZSBwcmVjaXNpb24gYXMgYSBudW1iZXIgb2YKKyAgICAgICBkZWNpbWFsIGRpZ2l0cywgZS5nLiAxNi4KKyAgICAgKiBTY2llbnRpZmljIG5vdGF0aW9uIGZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgSWYgdGhlIG1hZ25pdHVkZSBvZiBhIG51bWJlciBpcyBncmVhdGVyIHRoYW4gdGhlIHByZWNpc2lvbiBvZiB0aGUKKyAgICAgICB1bmRlcmx5aW5nIGhhcmR3YXJlLCB0aGUgbGVzcy1zaWduaWZpY2FudCBkaWdpdHMgYXJlIHNob3duIGJ1dAorICAgICAgIHRoZWlyIHZhbHVlcyBhcmUgbWVhbmluZ2xlc3MuIElmIGl0IHRoZSBudW1iZXIgaXMgdG9vIHNtYWxsIHRvIGJlCisgICAgICAgcmVwcmVzZW50ZWQgaW50ZXJuYWxseSwgaXQgaXMgc2hvd24gYXMgIjAuMCIuCisgICAgICogTWFueSBMaXNwIGZlYXR1cmVzIGFyZSBvbWl0dGVkOiBMaXN0IHByb2Nlc3NpbmcgKENBUiwgQ0RSLCBldGMpLAorICAgICAgIERFRlVOLCBMaXNwLXNwZWNpZmljIGNvbnRyb2wgc3RydWN0dXJlcywgYW5kIHNvIG9uLgorCisgICBbIFs1MzhdVG9wIF0gWyBbNTM5XUNvbnRlbnRzIF0gWyBbNTQwXUMtS2VybWl0IEhvbWUgXSBbIFs1NDFdS2VybWl0CisgICBIb21lIF0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMTAuIEZJTEUgVFJBTlNGRVIKKworICAgTmV3IGNvbW1hbmRzIGFuZCBzd2l0Y2hlczoKKworICAgU0VUIFRSQU5TRkVSIFJFUE9SVCB7IE9GRiwgT04gfQorICAgICAgICAgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIChuZXcpIG9uZS1saW5lIG1lc3NhZ2UgcHJpbnRlZCBieQorICAgICAgICAgIEtlcm1pdCBhZnRlciBhIHJlbW90ZS1tb2RlIGZpbGUgdHJhbnNmZXIgdG8gaW5kaWNhdGUgdGhlIHNvdXJjZQorICAgICAgICAgIGFuZCBkZXN0aW5hdGlvbiBmaWxlLCBjb21wbGV0ZSB3aXRoIHBhdGgsIHRvIGxldCB5b3Uga25vdyB3aGVyZQorICAgICAgICAgIHRoZSBmaWxlIHdlbnQuCisKKyAgIFNFTkQgL1RZUEU6e1RFWFQsQklOQVJZfQorICAgICAgICAgIFNlbmRzIG9ubHkgZmlsZXMgb2YgdGhlIGdpdmVuIHR5cGUgKHNlZSBbNTQyXVNlY3Rpb24gNCkuCisKKyAgIFNFTkQgL05PRk9MTE9XTElOS1M6CisgICAgICAgICAgKFVOSVggb25seSkgU2tpcCBvdmVyIHN5bWJvbGljIGxpbmtzIHJhdGhlciB0aGFuIGZvbGxvd2luZyB0aGVtCisgICAgICAgICAgKGRlZmF1bHQpLiBUaGlzIGFwcGxpZXMgdG8gd2lsZGNhcmQgYW5kL29yIHJlY3Vyc2l2ZSBTRU5EczsgaWYKKyAgICAgICAgICBhIHNpbmdsZSBmaWxlbmFtZSBpcyBnaXZlbiwgYW5kIGl0IGhhcHBlbnMgdG8gYmUgYSBzeW1ib2xpYworICAgICAgICAgIGxpbmssIHRoZSBmaWxlIGl0IHBvaW50cyB0byBpcyBzZW50LgorCisgICBTRU5EIC9GT0xMT1dMSU5LUzoKKyAgICAgICAgICAoVU5JWCBvbmx5KSBGb2xsb3cgKHJlc29sdmUpIHN5bWJvbGljIGxpbmtzLiBXYXRjaCBvdXQgZm9yCisgICAgICAgICAgY2lyY3VsYXIgbGlua3MsIGVuZGxlc3MgbG9vcHMsIGV0Yy4KKworICAgU0VUIFNFTkQgSS1QQUNLRVRTIHsgT0ZGLCBPTiB9CisgICAgICAgICAgV2hlbiBzZW5kaW5nIGNvbW1hbmRzIHRvIGEgS2VybWl0IHNlcnZlciwgdGhpcyB0ZWxscyB3aGV0aGVyCisgICAgICAgICAgY29tbWFuZCBwYWNrZXRzIHNob3VsZCBiZSBwcmVjZWRlZCBieSBhbiBJIChpbmZvcm1hdGlvbikKKyAgICAgICAgICBwYWNrZXQsIHdoaWNoIGlzIHVzZWQgdG8gc3luY2hyb25pemUgcGFyYW1ldGVycyBwcmlvciB0bworICAgICAgICAgIGV4ZWN1dGluZyB0aGUgY29tbWFuZC4gTm9ybWFsbHkgT04uIFRoZSBvbmx5IHJlYXNvbiB0byBzZXQgdGhpcworICAgICAgICAgIE9GRiBpcyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIGJ1Z2d5IEtlcm1pdCBzZXJ2ZXJzIHRoYXQKKyAgICAgICAgICBtaXNiZWhhdmUgd2hlbiBhbiBJIHBhY2tldCBpcyBzZW50IHRvIHRoZW0uIFRoZXJlIGlzIGFsc28gYSBTRVQKKyAgICAgICAgICBSRUNFSVZFIEktUEFDS0VUUyBjb21tYW5kLCBidXQgcHJlc2VudGx5IGl0IGhhcyBubyBlZmZlY3QuCisKKyAgIFNFVCBUUkFOU0ZFUiBNRVNTQUdFIFsgdGV4dCBdCisgICAgICAgICAgU2V0cyBhbiBpbml0aWFsIG1lc3NhZ2UgdG8gYmUgc2hvd24gaW4gdGhlIExhc3QgTWVzc2FnZSBmaWVsZAorICAgICAgICAgIG9mIHRoZSBmdWxsc2NyZWVuIGZpbGUtdHJhbnNmZXIgZGlzcGxheS4KKworICAgU0VUIFRSQU5TRkVSIFRSQU5TTEFUSU9OIHsgT04sIE9GRiB9CisgICAgICAgICAgSW5oaWJpdHMgb3IgcmUtZW5hYmxlcyB0ZXh0LWZpbGUgdHJhbnNmZXIgY2hhcmFjdGVyLXNldAorICAgICAgICAgIHRyYW5zbGF0aW9uIGdsb2JhbGx5LgorCisgICB7IFNFTkQsIE1TRU5ELCBHRVQsIFJFQ0VJVkUgfSAvVFJBTlNQQVJFTlQKKyAgICAgICAgICBJbmhpYml0cyBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGZvciB0aGlzIHRyYW5zZmVyIG9ubHkuCisKKyAgIHsgR0VULCBSRUNFSVZFIH0gL1BJUEVTOntPTixPRkZ9CisgICAgICAgICAgT3ZlcnJpZGVzIGdsb2JhbCBUUkFOU0ZFUiBQSVBFUyBzZXR0aW5nIGZvciB0aGlzIHRyYW5zZmVyIG9ubHk7CisgICAgICAgICAgT04gYWxsb3dzIGluY29taW5nIGZpbGVzIHdpdGggbmFtZXMgbGlrZSAiIXRhciB4ZiAtIiB0byBiZQorICAgICAgICAgIG9wZW5lZCBhcyBwaXBlbGluZXMgcmF0aGVyIHRoYW4gcmVndWxhciBmaWxlcy4KKworICAgVGhlIGZvbGxvd2luZyBuZXcgImhvdCBrZXlzIiBhcmUgYXZhaWxhYmxlIHdoZW4gS2VybWl0J3MgZmlsZS10cmFuc2ZlcgorICAgZGlzcGxheSBpcyB2aXNpYmxlOgorCisgICAgIEQ6IFR1cm4gb24gZGVidWdnaW5nLCBvcGVuICJkZWJ1Zy5sb2ciIGlmIG5vdCBhbHJlYWR5IG9wZW4uCisgICAgIGQ6IFR1cm4gb2ZmIGRlYnVnZ2luZyBidXQgbGVhdmUgbG9nIG9wZW4gKGlmIGl0IHdhcyBvcGVuKS4KKyAgICAgVDogVHVybiBvbiBkZWJ1Zy1sb2cgdGltZXN0YW1wcy4KKyAgICAgdDogVHVybiBvZmYgZGVidWctbG9nIHRpbWVzdGFtcHMuCisKKyAgIE90aGVyIGltcHJvdmVtZW50czoKKyAgICAgKiBTRVQgRklMRSBET1dOTE9BRC1ESVJFQ1RPUlkgbm93IHdvcmtzIGZvciBleHRlcm5hbCBwcm90b2NvbHMgKGUuZy4KKyAgICAgICBzei9yeikgdG9vLgorICAgICAqIEltcHJvdmVkIGF1dG9tYXRpYyBwZXItZmlsZSB0ZXh0L2JpbmFyeSBzd2l0Y2hpbmcsIGRlc2NyaWJlZCBpbgorICAgICAgIFs1NDNdU2VjdGlvbiA0LgorICAgICAqIFdoZW4gc2VuZGluZyBhIGZpbGUgZ3JvdXAgKGUuZy4gInNlbmQgKi4qIiksIGZhaWx1cmUgdG8gb3BlbiBhCisgICAgICAgZmlsZSBpcyBubyBsb25nZXIgZmF0YWw7IG5vdyBDLUtlcm1pdCBzaW1wbHkgZ29lcyBhaGVhZCB0byB0aGUKKyAgICAgICBuZXh0IGZpbGUuCisgICAgICogVHJhbnNhY3Rpb24gbG9nIGVudHJpZXMgYXJlIG5vdyBtYWRlIGZvciBleHRlcm5hbCBwcm90b2NvbHMgdG9vLgorCisgICBbIFs1NDRdVG9wIF0gWyBbNTQ1XUNvbnRlbnRzIF0gWyBbNTQ2XUMtS2VybWl0IEhvbWUgXSBbIFs1NDddS2VybWl0CisgICBIb21lIF0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMTEuIE1PREVNUyBBTkQgRElBTElORworCisgICBJbiBDLUtlcm1pdCA4LjAsIHRoZSBkZWZhdWx0IG1vZGVtIHR5cGUgZm9yIGRpYWxpbmcgaGFzIGNoYW5nZWQgZnJvbQorICAgTk9ORSAoPSBESVJFQ1QsIG1lYW5pbmcgbm8gbW9kZW0pIHRvIEdFTkVSSUMuIFRoaXMgY2hhbmdlIHNob3VsZCBoYXZlCisgICBubyBpbXBhY3Qgb24gZGlyZWN0IGNvbm5lY3Rpb25zLiBGb3IgZGlhbGluZywgaXQgbWVhbnMgdGhhdCwgdW5sZXNzCisgICB5b3UgU0VUIE1PREVNIFRZUEUgdG8gYSBzcGVjaWZpYyB0eXBlLCBzdWNoIGFzIFVTUk9CT1RJQ1Mgb3IgQ09ORVhBTlQsCisgICBLZXJtaXQgYXNzdW1lczoKKworICAgIDEuIFRoZSBtb2RlbSB1c2VzIHRoZSBIYXllcyBBVCBjb21tYW5kIHNldC4KKyAgICAyLiBUaGUgbW9kZW0gc3VwcG9ydHMgZXJyb3IgY29ycmVjdGlvbiwgZGF0YSBjb21wcmVzc2lvbiwgYW5kCisgICAgICAgaGFyZHdhcmUgZmxvdyBjb250cm9sIGFuZCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgdG8gdXNlIHRoZW0uCisKKyAgIEluIGZhY3QsIEtlcm1pdCBhc3N1bWVzIHRoZSBtb2RlbSBpcyBjb21wbGV0ZWx5IGNvbmZpZ3VyZWQsIGFuZAorICAgdGhlcmVmb3JlIGRvZXMgbm90IHNlbmQgaXQgYW4gaW5pdGlhbGl6YXRpb24gc3RyaW5nIG9yIGFueQorICAgY29uZmlndXJhdGlvbiBjb21tYW5kcy4gSW5zdGVhZCwgaXQgc2VuZHMgb25seSB0aGUgc2ltcGxlc3QgYW5kIG1vc3QKKyAgIHBvcnRhYmxlIGNvbW1hbmRzOgorCisgICAgIEFUUTBWMSAgICAgICAgICBHaXZlIGRpYWwgcmVzdWx0IGNvZGVzLgorICAgICBBVERUbnVtYmVyICAgICAgRGlhbCB0aGUgbnVtYmVyLgorCisgICAob3IgQVREIG9yIEFURFAsIGFzIGFwcHJvcHJpYXRlKS4KKworICAgVGhlIG5ldyBkZWZhdWx0cyB3b3JrIGZvciBkaXJlY3QgY29ubmVjdGlvbnMgYW5kIGZvciBtb3N0IG1vZGVybgorICAgbW9kZW1zIG9uIG1vc3QgcGxhdGZvcm1zLCBhbmQgdGhleSB3b3JrIG11Y2ggZmFzdGVyIHRoYW4KKyAgICJmdWxsLXRyZWF0bWVudCIgZGlhbGluZy4gSWYgdGhlIG5ldyBkZWZhdWx0cyBkb24ndCB3b3JrIGZvciB5b3UsIG9yCisgICBpZiB5b3UgbmVlZCB0byBwZXJmb3JtIGV4cGxpY2l0IG1vZGVtIGNvbmZpZ3VhdGlvbnMgb3IgaW50ZXJhY3Rpb25zLAorICAgdGhlbiBzZXQgYSBzcGVjaWZpYyBtb2RlbSB0eXBlIGFuZCB1c2UgdGhlIFNFVCBNT0RFTSBhbmQgU0VUIERJQUwKKyAgIGNvbW1hbmRzIGFzIGRvY3VtZW50ZWQgaW4gVXNpbmcgQy1LZXJtaXQuCisKKyAgICAgV0FSTklORzogRG9uJ3QgdXNlIHRoZSBnZW5lcmljIG1vZGVtIG9uIGhvc3RzIHRoYXQgZG8gbm90IHN1cHBvcnQKKyAgICAgUlRTL0NUUyBmbG93IGNvbnRyb2wuIElmIFhvbi9Yb2ZmIGlzIGluIHVzZSBvbiB0aGUgc2VyaWFsIHBvcnQsCisgICAgIHlvdSdsbCBuZWVkIHRvIHNlbGVjdCBhIHBhcnRpY3VsYXIgbW9kZW0gdHlwZSBzbyBLZXJtaXQga25vd3Mgd2hhdAorICAgICBjb21tYW5kIHRvIGdpdmUgaXQgdG8gZW5hYmxlIFhvbi9Yb2ZmIGZsb3cgY29udHJvbCBiZXR3ZWVuIGl0c2VsZgorICAgICBhbmQgeW91ciBzZXJpYWwgcG9ydC4KKworICAgVGhlIGZvbGxvd2luZyBuZXcgbW9kZW0gdHlwZXMgd2VyZSBhZGRlZCBpbiBDLUtlcm1pdCA4LjA6CisKKyAgICAgbHVjZW50OiAgICAgICAgICBMdWNlbnQgVmVudXMgY2hpcHNldAorICAgICBwY3RlbDogICAgICAgICAgIFBDVGVsIFYuOTAgY2hpcHNldAorICAgICBjb25leGFudDogICAgICAgIENvbmV4YW50IChleC1Sb2Nrd2VsbCkgbW9kZW0gZmFtaWx5CisgICAgIHpvb20tdjMyYmlzOiAgICAgTmV3IG5hbWUgZm9yICJab29tIgorICAgICB6b29tLXYzNCAgICAgICAgIFpvb20gVi4zNAorICAgICB6b29tLXY5MCAgICAgICAgIFpvb20gVi45MCA1NksKKyAgICAgem9vbS12OTI6ICAgICAgICBab29tIFYuOTIgd2l0aCBWLjQ0IGRhdGEgY29tcHJlc3Npb24KKyAgICAgem9sdHJpeC12MzQ6ICAgICBOZXcgbmFtZSBmb3IgInpvbHRyaXgiCisgICAgIHpvbHRyaXgtaHNwLXY5MDogU3lub255bSBmb3IgUENUZWwKKyAgICAgem9sdHJpeC1oY2YtdjkwOiBTeW5vbnltIGZvciBJVFUtVC1WMjUwCisgICAgIHNtYXJ0bGluay12OTA6ICAgU3lub255bSBmb3IgdXNyb2JvdGljcyAoc2FtZSBjaGlwc2V0KQorICAgICBhY2VyLXY5MDogICAgICAgIFN5bm9ueW0gZm9yIFJvY2t3ZWxsLXY5MAorCisgICBOZXcgRElBTC1yZWxhdGVkIHZhcmlhYmxlczoKKworICAgICBcdihkbV9oZik6ICBEaWFsIG1vZGlmaWVyOiBXYWl0IGZvciBIb29rLUZsYXNoLgorICAgICBcdihkbV93Yik6ICBEaWFsIG1vZGlmaWVyOiBXYWl0IGZvciBCb25nLgorCisgICBGaW5hbGx5LCBpZiBkaWFsaW5nIGZhaWxzLCBLZXJtaXQgbm93IHByaW50cyBhIGNvbnRleHQtc2Vuc2l0aXZlIGhpbnQKKyAgIHN1Z2dlc3RpbmcgcG9zc2libGUgcmVhc29ucyBhbmQgcmVtZWRpZXMuCisKKyAgIEFkZGVkIGluIEMtS2VybWl0IDguMC4yMDE6ICAgUnVkaW1lbnRhcnkgc3VwcG9ydCBmb3IgQ2FsbGVyIElELCBmb3IKKyAgIHVzZSB3aXRoIHRoZSBBTlNXRVIgY29tbWFuZC4gSWYgdGhlIG1vZGVtIHJlcG9ydHMgQ2FsbGVyIElECisgICBpbmZvcm1hdGlvbiwgS2VybWl0IHN0b3JlcyBpdCBpbiB2YXJpYWJsZXMgdGhhdCB5b3UgY2FuIGFjY2VzcyBhZnRlcgorICAgdGhlIGNhbGwgaXMgYW5zd2VyZWQ6CisKKyAgXHYoY2FsbGlkX2RhdGUpICAgVGhlIGRhdGUgb2YgdGhlIGNhbGwKKyAgXHYoY2FsbGlkX3RpbWUpICAgVGhlIHRpbWUgb2YgdGhlIGNhbGwKKyAgXHYoY2FsbGlkX25hbWUpICAgVGhlIG5hbWUgb2YgdGhlIGNhbGxlcgorICBcdihjYWxsaWRfbm1icikgICBUaGUgdGVsZXBob25lIG51bWJlciBvZiB0aGUgY2FsbGVyCisgIFx2KGNhbGxpZF9tZXNnKSAgIEEgbWVzc2FnZQorCisgICBUaGUgZm9ybWF0IG9mIHRoZXNlIGl0ZW1zIGRlcGVuZHMgb24gdGhlIG9yaWdpbmF0aW5nIGFuZCBhbnN3ZXJpbmcKKyAgIHBob25lIGNvbXBhbmllcyBhbmQgdGhlIG1vZGVtcyBhbmQgdGhlaXIgY29uZmlndXJhdGlvbi4KKworICAgTm90IHZlcnkgbWFueSBtb2RlbXMgc3VwcG9ydCBDYWxsZXIgSUQsIGFuZCB0aG9zZSB0aGF0IGRvIChhKSB0ZW5kIHRvCisgICBoYXZlIGl0IGRpc2FibGVkIGJ5IGRlZmF1bHQsIGFuZCAoYikgdXNlIGRpZmZlcmVudCBjb21tYW5kcyB0byBlbmFibGUKKyAgIGl0LiBBIHF1aWNrIHN1cnZleSBzaG93cyBvZiBzb21lIGN1cnJlbnQgbW9kZWxzIHNob3dzOgorCisgICAtIFVTUiBWLjkwOiAgICAgIE5vCisgICAtIElUVS1UIFYuMjUwOiAgIE5vCisgICAtIEx1Y2VudCBWZW51czogIE5vCisgICAtIERpYW1vbmQgU3VwcmE6ICNDSUQ9MQorICAgLSBSb2Nrd2VsbCA1Nks6ICAjQ0lEPTEKKyAgIC0gUENURUw6ICAgICAgICAgI0NJRD0xCisgICAtIFpvbHRyaXg6ICAgICAgICtWQ0lEPTEKKyAgIC0gQ29uZXhhbnQ6ICAgICAgK1ZDSUQ9MQorCisgICBUbyB1c2UgS2VybWl0J3MgQ2FsbGVyIElEIGZlYXR1cmUsIHlvdSBoYXZlIHRvIHNldCB0aGUgbW9kZW0gdG8gd2FpdAorICAgZm9yIGF0IGxlYXN0IHR3byByaW5ncyBiZWZvcmUgYW5zd2VyaW5nLCBhbmQgeW91IGhhdmUgdG8gZ2l2ZSB0aGUKKyAgIGNvbW1hbmQgdG8gZW5hYmxlIENhbGxlciBJRDsgZm9yIGV4YW1wbGUgKGFmdGVyIGNob29zaW5nIGEgbW9kZW0gd2l0aAorICAgU0VUIE1PREVNIFRZUEUpOgorCisgIHNldCBtb2RlbSBjb21tYW5kIGF1dG9hbnN3ZXIgb24gQVRTMD0yI0NJRD0xXHsxM30KKyAgc2V0IG1vZGVtIGNvbW1hbmQgYXV0b2Fuc3dlciBvbiBBVFMwPTIrVkNJRD0xXHsxM30KKworICAgVGhlc2UgY29tbWFuZHMgY2FuIGJlIHVuZG9uZSB3aXRoOgorCisgIHNldCBtb2RlbSBjb21tYW5kIGF1dG9hbnN3ZXIgb24gQVRTMD0xI0NJRD0wXHsxM30KKyAgc2V0IG1vZGVtIGNvbW1hbmQgYXV0b2Fuc3dlciBvbiBBVFMwPTErVkNJRD0wXHsxM30KKworICAgS2VybWl0IHByZXNlbnRseSBoYXMgbm8gYnVpbHQtaW4ga25vd2xlZGdlIG9mIHRoZSBDYWxsZXIgSUQKKyAgIGNhcGFiaWxpdGllcyBvciBjb21tYW5kcyBvZiB0aGUgbW9kZW1zIGluIGl0cyBkYXRhYmFzZS4KKworICAgU2luY2UgdGhlIHZhcmlhYmxlcyBjYW4gYmUgYWNjZXNzZWQgb25seSBhZnRlciB0aGUgY2FsbCBpcyBhbnN3ZXJlZCwKKyAgIHRoZSBvbmx5IHdheSB0byByZWZ1c2UgYSBjYWxsIGlzIHRvIGFuc3dlciBpdCwgaW5zcGVjdCB0aGUgdmFyaWFibGVzLAorICAgYW5kIHRoZW4gaGFuZyBpdCB1cCBpZiBkZXNpcmVkLgorCisgICBbIFs1NDhdVG9wIF0gWyBbNTQ5XUNvbnRlbnRzIF0gWyBbNTUwXUMtS2VybWl0IEhvbWUgXSBbIFs1NTFdS2VybWl0CisgICBIb21lIF0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMTIuIFRFUk1JTkFMIENPTk5FQ1RJT04KKworICAgTm93IHRoYXQgNy1iaXQgY29ubmVjdGlvbnMgYXJlIG5vIGxvbmdlciB0aGUgbm9ybSwgdGhlIGRlZmF1bHQKKyAgIHRlcm1pbmFsIGJ5dGVzaXplIChhbHNvIGNhbGxlZCAiZGF0YSBzaXplIiBvciAid29yZCBzaXplIikgaW4gQy1LZXJtaXQKKyAgIDguMCBpcyA4IGJpdHMsIHJhdGhlciB0aGFuIDcgYml0cyBhcyBpdCB3YXMgaW4gQy1LZXJtaXQgNy4wIGFuZAorICAgZWFybGllcjoKKworICAgU0VUIEVTQ0FQRSBjaGFyYWN0ZXIKKyAgICAgICAgICBUaGlzIGNvbW1hbmQsIHdoaWNoIHNwZWNpZmllcyB5b3VyIENPTk5FQ1QtbW9kZSBlc2NhcGUKKyAgICAgICAgICBjaGFyYWN0ZXIsIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhbnkgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXIgaW4KKyAgICAgICAgICBhIHZhcmlldHkgb2YgZm9ybWF0cy4gQy1LZXJtaXQgOC4wLjIwMSBub3cgYWxzbyBsZXRzIHlvdQorICAgICAgICAgIHNwZWNpZnkgYW55IDgtYml0IHZhbHVlLCAxMjgtMjU1LCBhcyB0aGUgZXNjYXBlIGNoYXJhY3Rlci4gSW4KKyAgICAgICAgICB0aGUgU0VUIEVTQ0FQRSBjb21tYW5kLCB5b3UgY2FuIHR5cGUgdGhlIDgtYml0IGNoYXJhY3RlcgorICAgICAgICAgIGxpdGVyYWxseSBvciB5b3UgY2FuIGVudGVyIGl0cyBudW1lcmljIGNvZGUuIEhlcmUgYXJlIGV4YW1wbGVzCisgICAgICAgICAgdGhhdCB5b3UgY2FuIGVudGVyIGZyb20gYSB0ZXJtaW5hbCBvciBjb25zb2xlIHRoYXQgdXNlcyB0aGUgSVNPCisgICAgICAgICAgTGF0aW4tMSBjaGFyYWN0ZXIgc2V0OgorCisgIEMtS2VybWl0PiBzZXQgZXNjYXBlIMMKKyAgQy1LZXJtaXQ+IHNldCBlc2NhcGUgMTk1CisgIEMtS2VybWl0PiBzaG93IGVzY2FwZQorICAgRXNjYXBlIGNoYXJhY3RlcjogQ29kZSAxOTUgKMMpOiBlbmFibGVkCisgIEMtS2VybWl0PgorCisgICAgICAgICAgQm90aCBvZiB0aGVzZSBjb21tYW5kcyBzZXQgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgdmFsdWUgdG8gMTk1CisgICAgICAgICAgKGRlY2ltYWwpLCB3aGljaCBoYXBwZW5zIHRvIGJlIHVwcGVyY2FzZSBsZXR0ZXIgQSB3aXRoIFRpbGRlIGluCisgICAgICAgICAgTGF0aW4tMS4gU0hPVyBFU0NBUEUgYW5kIFNIT1cgVEVSTUlOQUwgc2hvdyB0aGUgdmFsdWUsIGFzIGRvZXMKKyAgICAgICAgICB0aGUgQ09OTkVDVCBtZXNzYWdlLgorCisgICBTRVQgVEVSTUlOQUwgQVVUT0RPV05MT0FEIEVSUk9SIHsgU1RPUCwgQ09OVElOVUUgfQorICAgICAgICAgIFdoZW4gS2VybWl0IGhhcyBhIHRlcm1pbmFsIGNvbm5lY3Rpb24gdG8gYW5vdGhlciBjb21wdXRlciwgYW5kCisgICAgICAgICAgYSBmaWxlIHRyYW5zZmVyIGlzIGluaXRpYXRlZCBhdXRvbWF0aWNhbGx5IGJlY2F1c2UgYSBLZXJtaXQKKyAgICAgICAgICBwYWNrZXQgd2FzIHJlY2VpdmVkIGluIENPTk5FQ1QgbW9kZSAoaS5lLiBpbiB0aGUgdGVybWluYWwKKyAgICAgICAgICBzY3JlZW4pLCB0aGlzIGNvbW1hbmQgdGVsbHMgd2hhdCBLZXJtaXQgc2hvdWxkIGRvIGlmIHRoZQorICAgICAgICAgIHRyYW5zZmVyIGZhaWxzLiBUaGUgZGVmYXVsdCBpcyB0byBTVE9QLCB3aGljaCBsZWF2ZXMgS2VybWl0IGluCisgICAgICAgICAgY29tbWFuZCBtb2RlIHdpdGggaXRzIGZpbGUtdHJhbnNmZXIgZGlzcGxheSBzaG93aW5nLCBzbyB5b3UgY2FuCisgICAgICAgICAgc2VlIHRoYXQgdGhlIHRyYW5zZmVyIGZhaWxlZCBhbmQgd2h5LiBJZiB5b3UgU0VUIFRFUk1JTkFMCisgICAgICAgICAgQVVUT0RPV05MT0FEIEVSUk9SIENPTlRJTlVFLCB0aGlzIGNhdXNlcyBLZXJtaXQgdG8gcmV0dXJuCisgICAgICAgICAgYXV0b21hdGljYWxseSB0byBpdHMgdGVybWluYWwgc2NyZWVuIChpLmUuIHJlc3VtZSBpdHMgQ09OTkVDVAorICAgICAgICAgIHNlc3Npb24pIGFzIGlmIHRoZSB0cmFuc2ZlciBoYWQgc3VjY2VlZGVkOyB0aGlzIGNhbiBiZQorICAgICAgICAgIGRlc2lyYWJsZSBpZiB0aGUgZW50aXJlIHNlc3Npb24gaXMgdW5kZXIgY29udHJvbCBvZiBhCisgICAgICAgICAgaG9zdC1iYXNlZCBzY3JpcHQuCisKKyAgIFNFVCBURVJNSU5BTCBCWVRFU0laRSB7IDcsIDggfQorICAgICAgICAgIFRoZSBieXRlIHNpemUgdG8gdXNlIGR1cmluZyBDT05ORUNUIGFuZCBJTlBVVCBjb21tYW5kCisgICAgICAgICAgZXhlY3V0aW9uLCB3aGljaCBjYW4gYmUgbW9yZSByZXN0cmljdGl2ZSB0aGFuIHRoZSBieXRlc2l6ZQorICAgICAgICAgIGltcGxpZWQgYnkgdGhlIGN1cnJlbnQgUEFSSVRZIHNldHRpbmcsIGJ1dCBub3QgbGVzcworICAgICAgICAgIHJlc3RyaWN0aXZlLiBJbiBDLUtlcm1pdCA3LjAgYW5kIGVhcmxpZXIsIHRoZSB0ZXJtaW5hbCBieXRlc2l6ZQorICAgICAgICAgIHdhcyA3IGJ5IGRlZmF1bHQgdG8gcHJvdGVjdCBhZ2FpbnN0IHRoZSBsaWtlbGlob29kIHRoYXQgcGFyaXR5CisgICAgICAgICAgd2FzIGluIHVzZSBvbiB0aGUgY29ubmVjdGlvbiB3aXRob3V0IHRoZSB1c2VyJ3Mga25vd2xlZGdlLiBXaGVuCisgICAgICAgICAgdGhlIHRlcm1pbmFsIGJ5dGVzaXplIGlzIDggKGFzIGl0IGlzIGluIEMtS2VybWl0IDguMCBhbmQKKyAgICAgICAgICBsYXRlciksIHRoZSB1c2VyIHdpbGwgc2VlIGdhcmJhZ2UgaW4gdGhpcyAoaW5jcmVhc2luZ2x5CisgICAgICAgICAgdW5saWtlbHkpIHNpdHVhdGlvbi4gTm90ZSB0aGF0IDggZGF0YSBiaXRzIGFyZSByZXF1aXJlZCBmb3IKKyAgICAgICAgICBtb3N0IGNoYXJhY3RlciBzZXRzIG90aGVyIHRoYW4gQVNDSUk6IExhdGluLTEsIFVURi04LCBhbmQgc28KKyAgICAgICAgICBvbi4KKworICAgQSBuZXcgY29tbWFuZCBoYXMgYmVlbiBhZGRlZCB0byBwcm9kdWNlIHRpbWVzdGFtcGVkIHNlc3Npb24gbG9nczoKKworICAgU0VUIFRFUk1JTkFMIFNFU1NJT04tTE9HIFRJTUVTVEFNUEVELVRFWFQKKyAgICAgICAgICBSZWNvcmRzIHRoZSB0ZXJtaW5hbCBzZXNzaW9uIGluIHRleHQgbW9kZSAobGlrZSBTRVQgVEVSTUlOQUwKKyAgICAgICAgICBTRVNTSU9OLUxPRyBURVhUKSBidXQgYWRkcyBhIHRpbWVzdGFtcCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2gKKyAgICAgICAgICBsaW5lLiBUaGUgdGltZXN0YW1wIGZvcm1hdCBpcyBoaDptbTpzcy5ubm4sIGFuZCBpbmRpY2F0ZXMgdGhlCisgICAgICAgICAgdGltZSBhdCB3aGljaCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lIGFwcGVhcmVkLgorCisgICBJbiBtb3N0IFVOSVggdmVyc2lvbnMgKHRob3NlIGJ1aWx0IHdpdGggdGhlIHNlbGVjdCgpLWNhcGFibGUgQ09OTkVDVAorICAgbW9kdWxlIC0tIHByZXR0eSBtdWNoIGFsbCB0aGUgb25lcyB0aGF0IGhhdmUgb3IgY291bGQgaGF2ZSBURUxORVQKKyAgIGluY2x1ZGVkKSwgYW4gaWRsZSB0aW1lb3V0IGZlYXR1cmUgaGFzIGJlZW4gYWRkZWQ6CisKKyAgIFNFVCBURVJNSU5BTCBJRExFLVRJTUVPVVQgbnVtYmVyCisgICAgICAgICAgSWYgdGhlIG51bWJlciBpcyBub3QgMCwgdGhlbiBLZXJtaXQgaXMgdG8gdGFrZSBhbiBhY3Rpb24gd2hlbgorICAgICAgICAgIHRoZSBnaXZlbiBhbW91bnQgb2YgdGltZSBwYXNzZXMgd2l0aCBubyBhY3Rpdml0eSBkdXJpbmcgQ09OTkVDVAorICAgICAgICAgIG1vZGUuIElmIHRoZSBudW1iZXIgaXMgcG9zaXRpdmUgaXQgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mCisgICAgICAgICAgaWRsZSBzZWNvbmRzOyBpZiBudW1iZXIgaXMgbmVnYXRpdmUgaXQgcmVwcmVzZW50cyBtaWxsaXNlY29uZHMKKyAgICAgICAgICAodGhvdXNhbmR0aHMgb2Ygc2Vjb25kcykuIElmIDAgaXMgZ2l2ZW4gYXMgdGhlIG51bWJlciwgdGhlcmUKKyAgICAgICAgICBhcmUgbm8gaWRsZSB0aW1lb3V0cy4gU3lub255bTogU0VUIFRFUk1JTkFMIElETEUtTElNSVQuCisKKyAgIFNFVCBURVJNSU5BTCBJRExFLUFDVElPTiB7IFJFVFVSTiwgSEFOR1VQLCBFWElULCBPVVRQVVQgWyBzdHJpbmcgXSB9CisgICAgICAgICAgVGhlIGFjdGlvbiB0byBiZSB0YWtlbiB1cG9uIGFuIGlkbGUgdGltZW91dCBpbiBDT05ORUNUIG1vZGUuCisgICAgICAgICAgUkVUVVJOIHRvIHRoZSBwcm9tcHQsIEhBTkdVUCB0aGUgY29ubmVjdGlvbiwgRVhJVCBmcm9tIEtlcm1pdCwKKyAgICAgICAgICBvciBPVVRQVVQgdGhlIGdpdmVuIHN0cmluZyAoaWYgbm8gc3RyaW5nIGlzIGdpdmVuLCBhIE5VTCAoQVNDSUkKKyAgICAgICAgICAwKSBjaGFyYWN0ZXIgaXMgc2VudCkuCisKKyAgIFNFVCBURVJNSU5BTCBJRExFLUFDVElPTiB7IFRFTE5FVC1OT1AsIFRFTE5FVC1BWVQgfQorICAgICAgICAgIEFjdGlvbnMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgb24gVGVsbmV0IGNvbm5lY3Rpb25zIG9ubHksIHRoYXQKKyAgICAgICAgICBtaWdodCBiZSB1c2VmdWwgaWYgaWRsZSBsaW1pdHMgYXJlIGVuZm9yY2VkIGJ5IHRoZSBUZWxuZXQKKyAgICAgICAgICBzZXJ2ZXIgb3IgaW4gdGhlIFRDUC9JUCBwcm90b2NvbDogVEVMTkVULU5PUCBzZW5kcyBhICJOTworICAgICAgICAgIE9wZXJhdGlvbiIgKGRvLW5vdGhpbmcpIGNvbW1hbmQsIHdoaWNoIGNhdXNlcyBubyByZXNwb25zZSBmcm9tCisgICAgICAgICAgdGhlIHNlcnZlcjsgVEVMTkVULUFZVCBzZW5kcyBhbiAiQXJlIFlvdSBUaGVyZSIgbWVzc2FnZSB0byB0aGUKKyAgICAgICAgICBzZXJ2ZXIsIHdoaWNoIHNob3VsZCBtYWtlIHRoZSBzZXJ2ZXIgc2VuZCBiYWNrIGEgbWVzc2FnZS4KKyAgICAgICAgICBOZWl0aGVyIG9mIHRoZXNlIGFjdGlvbnMgaW50ZXJmZXJlcyB3aXRoIHlvdXIgcmVtb3RlIHNlc3Npb24uCisKKyAgIFNFVCBURVJNSU5BTCBJRExFLUFDVElPTiBpcyB1c2VmdWwgZm9yIGNvbm5lY3Rpb25zIHRvIGhvc3RzIG9yCisgICBzZXJ2aWNlcyB0aGF0IGF1dG9tYXRpY2FsbHkgbG9nIHlvdSBvdXQgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZiBpZGxlCisgICB0aW1lLCBlLmcuOgorCisgIHNldCB0ZXJtIGlkbGUtdGltZW91dCAzMDAKKyAgc2V0IHRlcm0gaWRsZS1hY3Rpb24gb3V0cHV0IFwzMgorCisgICBzZW5kcyBhIHNwYWNlIChhcyBpZiB5b3UgaGFkIHByZXNzZWQgdGhlIHNwYWNlIGJhcikgZXZlcnkgMzAwIHNlY29uZHMKKyAgIChmaXZlIG1pbnV0ZXMpIHdoaWxlIHRoZXJlIGlzIG5vIGFjdGl2aXR5ICgzMiBpcyB0aGUgQVNDSUkgY29kZSBmb3IKKyAgIHNwYWNlKS4KKworICAgV2hlbiBDLUtlcm1pdCByZXR1cm5zIGZyb20gQ09OTkVDVCB0byBjb21tYW5kIG1vZGUsIHRoZSByZWFzb24gZm9yIHRoZQorICAgdHJhbnNpdGlvbiBpcyBnaXZlbiBpbiBhIG5ldyB2YXJpYWJsZSwgXHYoY3hfc3RhdHVzKToKKworICAgICAgMCAgTm8gQ09OTkVDVCBjb21tYW5kIGdpdmVuIHlldC4KKyAgICAgIDEgIFVzZXIgZXNjYXBlZCBiYWNrIG1hbnVhbGx5LgorICAgICAgMiAgQSB0cmlnZ2VyIHN0cmluZyB3YXMgZW5jb3VudGVyZWQuCisgICAgICAzICBJS1NEIGVudGVyZWQgc2VydmVyIG1vZGUuCisgICAgICA0ICBBcHBsaWNhdGlvbiBQcm9ncmFtIENvbW1hbmQgcmVjZWl2ZWQgZnJvbSBob3N0LgorICAgICAgNSAgSWRsZSB0aW1lb3V0LgorICAgICAgNiAgVGVsbmV0IHByb3RvY29sIGVycm9yLgorICAgICAgNyAgS2V5c3Ryb2tlIG1hY3JvLgorICAgICAgOCAgVGltZSBsaW1pdCBleGNlZWRlZC4KKyAgICAxMDAgIEludGVybmFsIGVycm9yLgorICAgIDEwMSAgQ2FycmllciByZXF1aXJlZCBieSBub3QgZGV0ZWN0ZWQuCisgICAgMTAyICBJL08gZXJyb3Igb24gY29ubmVjdGlvbi4KKyAgICAxMDMgIERpc2Nvbm5lY3RlZCBieSBob3N0LgorICAgIDEwNCAgRGlzY29ubmVjdGVkIGJ5IHVzZXIuCisgICAgMTA1ICBTZXNzaW9uIGxpbWl0IGV4Y2VlZGVkLgorICAgIDEwNiAgUmVqZWN0ZWQgZHVlIHRvIFRlbG5ldCBwb2xpY3kuCisgICAgMTA3ICBSZWNlaXZlZCBraWxsIHNpZ25hbC4KKworICAgVmFsdWVzIDEwMCBhbmQgYWJvdmUgaW5kaWNhdGUgdGhlcmUgaXMgbm8gY29ubmVjdGlvbi4KKworICAgWyBbNTUyXVRvcCBdIFsgWzU1M11Db250ZW50cyBdIFsgWzU1NF1DLUtlcm1pdCBIb21lIF0gWyBbNTU1XUtlcm1pdAorICAgSG9tZSBdCisgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKzEzLiBDSEFSQUNURVIgU0VUUworCisgICBTZWUgdGhlIHNlY3Rpb24gb24gWzU1Nl1maWxlIHNjYW5uaW5nIGFib3ZlLCBhbmQgdGhlIHNlY3Rpb24gb24KKyAgIGNoYXJhY3Rlci1zZXQgY29udmVyc2lvbiBpbiBbNTU3XUZUUC4gQWxzbzoKKworICAgICAqIFRydWUgc3VwcG9ydCBmb3IgQ1AxMjUyIChyYXRoZXIgdGhhbiB0cmVhdGluZyBpdCBhcyBMYXRpbi0xKS4KKyAgICAgKiBQcm9wZXIgaGFuZGxpbmcgb2YgQzEgdmFsdWVzIHdoZW4gY29udmVydGluZyBJU08gOC1iaXQgdGV4dCB0bworICAgICAgIFVURi04LgorICAgICAqIFRZUEUgL0NIQVJBQ1RFUi1TRVQ6IC9UUkFOU0xBVEUtVE86IGFsbG93cyBzcGVjaWZpYyB0cmFuc2xhdGlvbnMuCisgICAgICogVGhlIFRSQU5TTEFURSBjb21tYW5kIG5vdyB3b3JrcyBvbiBtdWx0aXBsZSBmaWxlcy4KKyAgICAgKiBLX0NIQVJTRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gc2V0IHRoZSBmaWxlIGNoYXJhY3Rlci1zZXQuCisgICAgICogU0VUIFRSQU5TRkVSIFRSQU5TTEFUSU9OIE9GRi4KKyAgICAgKiBGVFAgY2xpZW50IGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gKFs1NThdU2VjdGlvbiAzLjcpLgorCisgICBbIFs1NTldVG9wIF0gWyBbNTYwXUNvbnRlbnRzIF0gWyBbNTYxXUMtS2VybWl0IEhvbWUgXSBbIFs1NjJdS2VybWl0CisgICBIb21lIF0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMTQuIERJQUxPVVQgRlJPTSBURUxORVQgVEVSTUlOQUwgU0VSVkVSUworCisgICBGb3IgeWVhcnMsIEMtS2VybWl0IGhhcyBzdXBwb3J0ZWQgZGlhbGluZyBvdXQgZnJvbSBUZWxuZXQgbW9kZW0KKyAgIHNlcnZlcnMgKGFsc28gY2FsbGVkIHJldmVyc2UgdGVybWluYWwgc2VydmVycyBvciBhY2Nlc3Mgc2VydmVycyksIGJ1dAorICAgdW50aWwgbm93IHRoZXJlIHdhcyBubyB3YXkgZm9yIEtlcm1pdCB0byBjb250cm9sIHRoZSBjb21tdW5pY2F0aW9uCisgICBwYXJhbWV0ZXJzIChzcGVlZCwgcGFyaXR5LCBldGMpIG9uIHRoZSBzZXJpYWwgcG9ydCBvZiB0aGUgdGVybWluYWwKKyAgIHNlcnZlcjsgaXQgaGFkIHRvIHVzZSB3aGF0ZXZlciB3YXMgdGhlcmUuCisKKyAgIEJ1dCBub3csIGlmIHlvdSBtYWtlIGEgY29ubmVjdGlvbiB0byBhIHNlcnZlciB0aGF0IHN1cHBvcnRzIHRoZSBUZWxuZXQKKyAgIENvbSBQb3J0IENvbnRyb2wgT3B0aW9uLCBbNTYzXVJGQyAyMjE3LCB5b3UgaGF2ZSB0aGUgc2FtZSBkZWdyZWUgb2YKKyAgIGNvbnRyb2wgYXMgeW91IHdvdWxkIGhhdmUgb3ZlciBhIHNlcmlhbCBwb3J0IG9uIHRoZSBjb21wdXRlciB3aGVyZQorICAgS2VybWl0IGlzIHJ1bm5pbmc6IFNFVCBTUEVFRCwgU0VUIEZMT1csIFNFVCBQQVJJVFksIFNFVCBTVE9QLUJJVFMsCisgICBTSE9XIENPTU0sIFdBSVQsIFNFVCBDQVJSSUVSLVdBVENILCB0aGUgbW9kZW0tc2lnbmFsIHZhcmlhYmxlcywKKyAgIHNlbmRpbmcgQnJlYWssIGFuZCBzbyBvbiwgYXBwbHkgdG8gdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgdGVybWluYWwKKyAgIHNlcnZlciBhbmQgdGhlIG1vZGVtLgorCisgICBGb3IgZXhhbXBsZSwgdXNpbmcgYSBDaXNjbyBBY2Nlc3MgU2VydmVyIDI1MDksIHdoZXJlIHNwZWNpZnlpbmcgYSBUQ1AKKyAgIHBvcnQgaW4gdGhlIDYwMDAncyBzZWxlY3RzIGEgc2VyaWFsIHBvcnQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGlhbGluZworICAgb3V0OgorCisgIHNldCBob3N0IHh4eCA2MDAxICAgICAgOyB4eHggaXMgdGhlIElQIGhvc3RuYW1lIG9yIGFkZHJlc3Mgb2YgdGhlIHNlcnZlcgorICAobG9nIGluIGlmIG5lY2Vzc2FyeSkgIDsgV2l0aCBhIHNjcmlwdCBvciBieSBoYW5kCisgIHNldCBtb2RlbSB0eXBlIHVzciAgICAgOyBUZWxsIEtlcm1pdCB3aGF0IGtpbmQgb2YgbW9kZW0gaXQgaGFzCisgIHNldCBzcGVlZCA1NzYwMCAgICAgICAgOyBUaGlzIGFmZmVjdHMgdGhlIHNlcnZlcidzIHBvcnQKKyAgc2V0IGZsb3cgcnRzL2N0cyAgICAgICA7IERpdHRvCisgIGRpYWwgNzY1NDMyMQorCisgICBUaGUgbW9kZW0gc2VydmVyIG1pZ2h0IG9yIG1pZ2h0IG5vdCByZXF1aXJlIGEgbG9naW4gc2VxdWVuY2UuIEl0IG1pZ2h0CisgICBhbHNvIGFsbG93IGZvciBhdXRvbWF0aWMgYXV0aGVudGljYXRpb24sIGUuZy4gdmlhIEtlcmJlcm9zIHRpY2tldHMuCisgICBOT1RFOiBJZiB0aGUgbW9kZW0gc2VydmVyIHJlcXVpcmVzIGEgbG9naW4gc2VxdWVuY2UsIHRoZW4gUkVESUFMIG1pZ2h0CisgICBub3Qgd29yayBhcyBleHBlY3RlZC4KKworICAgV2hlbiB5b3UgaGF2ZSBhIFRlbG5ldCBDb20gUG9ydCBjb25uZWN0aW9uLCB5b3VyIFNFVCBTUEVFRCBhbmQgU0VUCisgICBGTE9XIG9wdGlvbnMgY2hhbmdlIGF1dG9tYXRpY2FsbHkgdG8gcmVmbGVjdCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZQorICAgc2VydmVyLCByYXRoZXIgdGhhbiB0aG9zZSBvZiB5b3VyIGxvY2FsIGNvbXB1dGVyLgorCisgICBTZWUgdGhlIGNvbmZpZ3VyYXRpb24gbWFudWFsIGZvciB5b3VyIHNlcnZlciBmb3IgYWRkaXRpb25hbAorICAgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCBob3cgdG8gc2V0IHVwIHRoZSBzZXJ2ZXIgdG8gZHJvcCB0aGUgVGVsbmV0CisgICBjb25uZWN0aW9uIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgdGVsZXBob25lIGNhbGwgaXMgaHVuZyB1cCAoZS5nLgorICAgImF1dG9oYW5ndXAiIG9uIENpc2NvIG1vZGVscykuCisKKyAgIEZvciBhIExpbnV4LWJhc2VkIFRlbG5ldCBDb20tUG9ydCBzZXJ2ZXIsIGNsaWNrIHRoZSBTcmRpcmQgbGluazoKKworICAgWyBbNTY0XVRvcCBdIFsgWzU2NV1Db250ZW50cyBdIFsgWzU2Nl1TcmVkaXJkIF0gWyBbNTY3XUMtS2VybWl0IEhvbWUgXQorICAgWyBbNTY4XUtlcm1pdCBIb21lIF0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMTUuIENPUElORyBXSVRIIEJST0tFTiBLRVJNSVQgUEFSVE5FUlMKKworICAgVGhlcmUgYXJlIGxvdHMgb2YgZmF1bHR5IEtlcm1pdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMgb3V0IHRoZXJlLAorICAgZm91bmQgbWFpbmx5IGluIDNyZC1wYXJ0eSBwcm9kdWN0cyByYW5naW5nIGZyb20gY29tbXVuaWNhdGlvbnMKKyAgIHNvZnR3YXJlIHBhY2thZ2VzIHRvIGZpbGUtdHJhbnNmZXIgZnVuY3Rpb25zIGltYmVkZGVkIHdpdGhpbiBkZXZpY2VzLgorICAgVGhpcyB0b3BpYyBpcyBjb3ZlcmVkIFs1NjldSEVSRSBmb3IgQy1LZXJtaXQgNy4wLCBidXQgQy1LZXJtaXQgOC4wCisgICBhZGRzIHNvbWUgYWRkaXRpb25hbCB0cmlja3MuCisKKyAgIFNFVCBBVFRSSUJVVEUgUkVDT1JELUZPUk1BVCB7IE9OLCBPRkYgfQorICAgICAgICAgIEFsbG93cyBjb250cm9sIG9mIHRoZSBLZXJtaXQncyBSZWNvcmQtRm9ybWF0IGF0dHJpYnV0ZS4gU2V0CisgICAgICAgICAgdGhpcyB0byBPRkYgaW4gY2FzZSBpbmNvbWluZyBmaWxlIGFyZSByZWZ1c2VkIGR1ZSB0byB1bmtub3duIG9yCisgICAgICAgICAgaW52YWxpZCByZWNvcmQgZm9ybWF0cyBpZiB5b3Ugd2FudCB0byBhY2NlcHQgdGhlIGZpbGUgYW55d2F5LgorCisgICBTRVQgU0VORCBJLVBBQ0tFVFMgeyBPTiwgT0ZGIH0KKyAgICAgICAgICBBIEtlcm1pdCBzZXJ2ZXIgaXMgc3VwcG9zZWQgdG8gYWNjZXB0IEktcGFja2V0czsgdGhpcyBpcyBob3cKKyAgICAgICAgICB0aGUgY2xpZW50IGxldHMgdGhlIHNlcnZlciBrbm93IGl0cyBjYXBhYmlsaXRpZXMgYW5kCisgICAgICAgICAgcHJlZmVyZW5jZXMgYmVmb3JlIHNlbmRpbmcgYSBjb21tYW5kLiBBcHBhcmVudGx5IHRoZXJlIGlzIGF0CisgICAgICAgICAgbGVhc3Qgb25lIEtlcm1pdCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIG5vdCBhY2NlcHQKKyAgICAgICAgICBJLXBhY2tldHMsIGFuZCBkb2VzIG5vdCBwcm9wZXJseSByZXNwb25kIHdpdGggYW4gRXJyb3IgcGFja2V0CisgICAgICAgICAgaWYgaXQgZ2V0cyBvbmUuIFRvIGdldCBhcm91bmQgc3VjaCBzaXR1YXRpb25zIGluIEMtS2VybWl0IDguMCwKKyAgICAgICAgICB5b3UgY2FuIHVzZSBTRVQgU0VORCBJLVBBQ0tFVFMgT0ZGIHRvIGluaGliaXQgdGhlIHNlbmRpbmcgb2YgSQorICAgICAgICAgIHBhY2tldHMuIEluIHRoaXMgY2FzZSwgdGhlIGNsaWVudCBtdXN0IGJlIGFibGUgdG8gYWRqdXN0IHRvIHRoZQorICAgICAgICAgIHNlcnZlcidzIGNvbmZpZ3VyYXRpb24sIHJhdGhlciB0aGFuIHRoZSBvdGhlciB3YXkgYXJvdW5kIGFzIHdlCisgICAgICAgICAgYXJlIHVzZWQgdG8uCisKKyAgIFNFVCBQUk9UT0NPTCBLRVJNSVQge30ge30ge30KKyAgICAgICAgICBDLUtlcm1pdCA2LjAgYW5kIGxhdGVyIGF1dG9tYXRpY2FsbHkgc2VuZCAiYXV0b3VwbG9hZCIgYW5kCisgICAgICAgICAgImF1dG9kb3dubG9hZCIgY29tbWFuZHMgd2hlbiBpbiBsb2NhbCBtb2RlIGFuZCB5b3UgZ2l2ZSBhIGZpbGUKKyAgICAgICAgICB0cmFuc2ZlciBjb21tYW5kLiBGb3IgZXhhbXBsZSwgaWYgeW91IHRlbGwga2VybWl0IHRvICJzZW5kCisgICAgICAgICAgb29mYS50eHQiLCBLZXJtaXQgc2VuZHMgImtlcm1pdCAtciIgYW5kIGEgY2FycmlhZ2UgcmV0dXJuLCBpbgorICAgICAgICAgIGNhc2UgeW91IGhhZCBmb3Jnb3R0ZW4gdG8gc3RhcnQgS2VybWl0IG9uIHRoZSBmYXIgZW5kIGFuZCB0b2xkCisgICAgICAgICAgaXQgdG8gcmVjZWl2ZSBhIGZpbGUuIElmIGEgS2VybWl0IHByb2dyYW0gaGFkIGFscmVhZHkgYmVlbgorICAgICAgICAgIHN0YXJ0ZWQgb24gdGhlIGZhciBlbmQsIGl0IHNob3VsZCBoYXJtbGVzc2x5IGFic29yYiB0aGlzCisgICAgICAgICAgc3RyaW5nLiBIb3dldmVyLCBzb21lIEtlcm1pdCBwcm9ncmFtcyB2aW9sYXRlIHRoZSBLZXJtaXQKKyAgICAgICAgICBwcm90b2NvbCBkZWZpbml0aW9uIGFuZCB0cmVhdCBzdWNoIHN0cmluZ3MgYXMgS2VybWl0IHBhY2tldHMKKyAgICAgICAgICBldmVuIHRob3VnaCB0aGV5IGFyZSBub3QuIEluIHN1Y2ggY2FzZXMsIGdpdmUgdGhpcyBjb21tYW5kIHRvCisgICAgICAgICAgc2V0IHRoZSBLZXJtaXQgcHJvdG9jb2wgYXV0b3VwbG9hZCBhbmQgZG93bmxvYWQgc3RyaW5ncyB0bworICAgICAgICAgIG5vdGhpbmcsIHdoaWNoIHRlbGxzIEtlcm1pdCBub3QgdG8gc2VuZCB0aGVtLiAoVGhpcyBpcyBub3QgYQorICAgICAgICAgIG5ldyBmZWF0dXJlLCBidXQgaXQgd2FzIG5vdCBwcmV2aW91c2x5IGluY2x1ZGVkIGluIHRoZSAiQ29waW5nIgorICAgICAgICAgIHNlY3Rpb24gb2YgdGhlIGRvY3VtZW50YXRpb24uKQorCisgICBbIFs1NzBdVG9wIF0gWyBbNTcxXUNvbnRlbnRzIF0gWyBbNTcyXUMtS2VybWl0IEhvbWUgXSBbIFs1NzNdS2VybWl0CisgICBIb21lIF0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMTYuIE5FVyBDT01NQU5ELUxJTkUgT1BUSU9OUworCisgICBrZXJtaXQgLWggTm93IHByaW50cyBhIGNvbXBsZXRlIGxpc3Rpbmcgb2YgaXRzIGNvbW1hbmQtbGluZSBvcHRpb25zLAorICAgcmF0aGVyIHRoYW4gYW4gYWJicmV2aWF0ZWQgbGlzdCBzcXVlZXplZCBpbnRvIGEgMjR4ODAgc3BhY2UuCisKKyAgIC1kZCAgICAgICAgICAgICAgRGVidWcsIGxpa2UgLWQgYnV0IGFkZHMgdGltZXN0YW1wcworICAgLS12ZXJzaW9uICBTaG93cyBDLUtlcm1pdCB2ZXJzaW9uIG51bWJlci4KKyAgIC0tbm9wZXJtcyAgRXF1aXZhbGVudCB0byBTRVQgQVRUUklCVVRFIFBST1RFQ1RJT04gT0ZGLgorCisgICBLZXJtaXQgbm93IGFjY2VwdHMgYSBzZWxlY3Rpb24gb2YgVVJMcyAoVW5pdmVyc2FsIFJlc291cmNlIExvY2F0b3JzKQorICAgYXMgaXRzIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudC4gVGhlc2UgYXJlOgorCisgICB0ZWxuZXQ6aG9zdG5hbWUKKyAgICAgICAgICBNYWtlcyBhIFRlbG5ldCBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBob3N0IChJUCBob3N0bmFtZSBvcgorICAgICAgICAgIGFkZHJlc3MpLgorCisgICBmdHA6Ly9bdXNlcls6cGFzc3dvcmRdQF1ob3N0bmFtZVsvcGF0aC4uLl0KKyAgICAgICAgICBNYWtlcyBhbiBGVFAgY29ubmVjdGlvbiB0byB0aGUgZ2l2ZW4gaG9zdCAoSVAgaG9zdG5hbWUgb3IKKyAgICAgICAgICBhZGRyZXNzKS4gSWYgYSB1c2VybmFtZSBpcyBnaXZlbiwgS2VybWl0IHRyaWVzIHRvIGxvZyB5b3UgaW47CisgICAgICAgICAgaWYgYSBwYXNzd29yZCBpcyBnaXZlbiwgaXQgaXMgdXNlZDsgaWYgbm90LCB5b3UgYXJlIHByb21wdGVkCisgICAgICAgICAgZm9yIG9uZS4gSWYgbm8gdXNlcm5hbWUgaXMgZ2l2ZW4sIGFuIGFub255bW91cyBsb2dpbiBpcworICAgICAgICAgIHBlcmZvcm1lZC4gSWYgYSBwYXRobmFtZSBpcyBpbmNsdWRlZCwgS2VybWl0IHRyaWVzIHRvIEdFVCB0aGUKKyAgICAgICAgICBnaXZlbiBmaWxlLiBTZWUgWzU3NF1TZWN0aW9uIDMuMS4zIGZvciBkZXRhaWxzLgorCisgICBmdHBzOi8vW3VzZXJbOnBhc3N3b3JkXUBdaG9zdG5hbWVbL3BhdGguLi5dCisgICAgICAgICAgTWFrZXMgYSBzZWN1cmUgRlRQIGNvbm5lY3Rpb24gb3ZlciBTU0wuCisKKyAgIHRlbG5ldHM6Ly9bdXNlcls6cGFzc3dvcmRdQF1ob3N0bmFtZQorICAgICAgICAgIE1ha2VzIGEgc2VjdXJlIFRlbG5ldCBjb25uZWN0aW9uIG92ZXIgU1NMLgorCisgICBrZXJtaXQ6Ly9bdXNlcls6cGFzc3dvcmRdQF1ob3N0bmFtZVsvcGF0aC4uLl0KKyAgICAgICAgICBNYWtlcyBhIGNvbm5lY3Rpb24gdG8gYW4gWzU3NV1JbnRlcm5ldCBLZXJtaXQgU2VydmVyLgorCisgICBodHRwOi8vW3VzZXJbOnBhc3N3b3JkXUBdaG9zdG5hbWVbL3BhdGguLi5dCisgICAgICAgICAgTWFrZXMgYSBjb25uZWN0aW9uIHRvIFdlYiBzZXJ2ZXIuCisKKyAgIGh0dHBzOi8vW3VzZXJbOnBhc3N3b3JkXUBdaG9zdG5hbWVbL3BhdGguLi5dCisgICAgICAgICAgTWFrZXMgYSBjb25uZWN0aW9uIHRvIHNlY3VyZSBXZWIgc2VydmVyLgorCisgICBbIFs1NzZdVG9wIF0gWyBbNTc3XUNvbnRlbnRzIF0gWyBbNTc4XUMtS2VybWl0IEhvbWUgXSBbIFs1NzldS2VybWl0CisgICBIb21lIF0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMTcuIExPR1MKKworICAgSW4gQy1LZXJtaXQgOC4wLCB3ZSBtYWtlIGFuIGVmZm9ydCB0byBrZWVwIHBhc3N3b3JkcyBvdXQgb2YgdGhlIGRlYnVnCisgICBsb2cuIFRoaXMgY2FuIG5ldmVyIGJlIDEwMCUgZWZmZWN0aXZlLCBidXQgaXQncyBiZXR0ZXIgdGhhbiBiZWZvcmUsCisgICB3aGVuIHRoZXJlIHdlcmUgbm8gcHJlY2F1dGlvbnMgYXQgYWxsLiBXaGVuZXZlciBLZXJtaXQga25vd3MgaXQncworICAgcHJvbXB0aW5nIGZvciwgcGFyc2luZywgb3IgdHJhbnNtaXR0aW5nIGEgcGFzc3dvcmQsIGl0IHRlbXBvcmFyaWx5CisgICB0dXJucyBvZmYgbG9nZ2luZyBhbmQgdGhlbiB0dXJucyBpdCBiYWNrIG9uIGFmdGVyd2FyZHMuIFRoaXMga2VlcHMgdGhlCisgICBkZWJ1ZyBsb2cgcGFzc3dvcmQtZnJlZSBpbiBtb3N0IGNvbW1vbiBjYXNlcywgYnV0IHRoZXJlIGNhbiBiZSBubworICAgZ3VhcmFudGVlcy4KKworICAgQXMgbm90ZWQgZWxzZXdoZXJlLCB0aGUgbmV3ICItZGQiIGNvbW1hbmQtbGluZSBvcHRpb24gc2VsZWN0cyBhCisgICB0aW1lc3RhbXBlZCBkZWJ1ZyBsb2cgKGVxdWl2YWxlbnQgdG8gInNldCBkZWJ1ZyB0aW1lc3RhbXBzIG9uIiwgImxvZworICAgZGVidWcgZGVidWcubG9nIikuCisKKyAgIEMtS2VybWl0IDguMCBhbHNvIHN1cHBvcnRzIGEgbmV3IHRpbWVzdGFtcGVkIHNlc3Npb24gbG9nIHZpYSAic2V0CisgICBzZXNzaW9uLWxvZyB0aW1lc3RhbXBlZC10ZXh0IiwgImxvZyBzZXNzaW9uIi4KKworICAgVGhlcmUgaGF2ZSBiZWVuIHJlcXVlc3RzIGZvciBvdGhlciBraW5kcyBvZiBsb2dzLCBmb3IgZXhhbXBsZSBhCisgICBjb21tYW5kIGxvZy4gVGhlc2UgbWlnaHQgYmUgYWRkZWQgYXQgc29tZSBwb2ludC4gT25lIHBlcnNvbiB3YW50ZWQgdG8KKyAgIGJlIGFibGUgdG8gbG9nIGNvbW1hbmRzIHdpdGggdGltZXN0YW1wcywgYnV0IG9ubHkgY29tbWFuZHMgaXNzdWVkIGF0CisgICB0aGUgcHJvbXB0LCBub3QgY29tbWFuZHMgZnJvbSBmaWxlcyBvciBtYWNyb3MsIGFuZCBhbHNvIHdhbnRlZCBhCisgICBoZWFkZXIgbGluZSBhdCB0aGUgYmVnaW5uaW5nIHNob3dpbmcgdGhlIGRhdGUsIHVzZXIsIGFuZCBob3N0LiBUaGlzCisgICBjYW4gYmUgZG9uZSBhcyBmb2xsb3dzOgorCisgIC5maWxlbmFtZSA6PSBcdihob21lKWNvbW1hbmRzLmxvZyAgOyAoZm9yIGV4YW1wbGUpCisgIGZvcGVuIC93cml0ZSBcJWMgXG0oZmlsZW5hbWUpCisgIGlmIHN1Y2Nlc3MgeworICAgICAgZndyaXRlIC9saW5lIFwlYyBcdihkYXRlKTogVXNlcj1cdih1c2VyKSBIb3N0PVx2KGhvc3QpCisgICAgICBmY2xvc2UgXCVjCisgICAgICBzZXQgZGVidWcgdGltZXN0YW1wcyBvbgorICAgICAgbG9nIGRlYnVnIHt8IGdyZXAgIkNNRChQKSIgPj4gXG0oZmlsZW5hbWUpfSBhcHBlbmQKKyAgfQorCisgICBbIFs1ODBdVG9wIF0gWyBbNTgxXUNvbnRlbnRzIF0gWyBbNTgyXUMtS2VybWl0IEhvbWUgXSBbIFs1ODNdS2VybWl0CisgICBIb21lIF0KKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgQy1LZXJtaXQgOC4wIFVwZGF0ZSBOb3RlcyAvIFs1ODRdVGhlIEtlcm1pdCBQcm9qZWN0IC8gQ29sdW1iaWEKKyAgIFVuaXZlcnNpdHkgLyAxNSBEZWMgMjAwMworCitSZWZlcmVuY2VzCisKKyAgIDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworICAgMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorICAgMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAgIDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbAorICAgNS4gbWFpbHRvOmtlcm1pdC1zdXBwb3J0QGNvbHVtYmlhLmVkdQorICAgNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworICAgNy4gaHR0cDovL3d3dy5rZXJtaXQtcHJvamVjdC5vcmcvCisgICA4LiBodHRwOi8vd3d3LmNvbHVtYmlhLm55Yy5ueS51cy9rZXJtaXQvCisgICA5LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL0NPUFlJTkcuVFhUCisgIDEwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrY21haS5jCisgIDExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeHYKKyAgMTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9jazYwbWFudWFsLmh0bWwKKyAgMTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWk3MC5odG1sCisgIDE0LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrZXJtaXQ3MC50eHQKKyAgMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sCisgIDE2LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrdWtlci5ucgorICAxNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NlY3VyaXR5Lmh0bQorICAxOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3RlbG5ldC5odG0KKyAgMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9mdHBzY3JpcHRzLmh0bWwKKyAgMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbAorICAyMS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja2Nid3IudHh0CisgIDIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwKKyAgMjMuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2t1YndyLnR4dAorICAyNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdmJ3ci5odG1sCisgIDI1LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrdmJ3ci50eHQKKyAgMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbAorICAyNy4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja3VpbnMudHh0CisgIDI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t2aW5zLmh0bWwKKyAgMjkuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2t2aW5zLnR4dAorICAzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sCisgIDMxLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrY2NmZy50eHQKKyAgMzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbAorICAzMy4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja2NwbG0udHh0CisgIDM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaWtzZC5odG1sCisgIDM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2tlcm1pdC5odG1sCisgIDM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgIDM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgIDM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorICAzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gwCisgIDQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDEKKyAgNDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MgorICA0Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gyLjEKKyAgNDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Mi4yCisgIDQ0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMi4xCisgIDQ1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMi4yCisgIDQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMi4zCisgIDQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMi40CisgIDQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMi41CisgIDQ5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMi42CisgIDUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMKKyAgNTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xCisgIDUyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMS4xCisgIDUzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMS4yCisgIDU0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMS4zCisgIDU1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMS40CisgIDU2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMgorICA1Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjMKKyAgNTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My40CisgIDU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNQorICA2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjUuMQorICA2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjUuMgorICA2Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjUuMworICA2My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjYKKyAgNjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My42LjEKKyAgNjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My42LjIKKyAgNjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My42LjMKKyAgNjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43CisgIDY4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNy4xCisgIDY5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNy4yCisgIDcwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuOAorICA3MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjkKKyAgNzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMAorICA3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjEwLjEKKyAgNzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMC4yCisgIDc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMTAuMworICA3Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExCisgIDc3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDQKKyAgNzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4NQorICA3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g2CisgIDgwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDYuMQorICA4MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g2LjIKKyAgODIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Ni4zCisgIDgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDYuNAorICA4NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g2LjUKKyAgODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Ni42CisgIDg2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDcKKyAgODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OAorICA4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjEKKyAgODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4yCisgIDkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMworICA5MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjQKKyAgOTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC41CisgIDkzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguNgorICA5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjcKKyAgOTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC44CisgIDk2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguOQorICA5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjEwCisgIDk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTEKKyAgOTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMgorIDEwMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjEzCisgMTAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTQKKyAxMDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OQorIDEwMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjEKKyAxMDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS4yCisgMTA1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDkuMworIDEwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjQKKyAxMDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS41CisgMTA4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDkuNgorIDEwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjcKKyAxMTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS44CisgMTExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDkuOQorIDExMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjEwCisgMTEzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDkuMTEKKyAxMTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MTAKKyAxMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MTEKKyAxMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MTIKKyAxMTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MTMKKyAxMTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MTQKKyAxMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MTUKKyAxMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MTYKKyAxMjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MTcKKyAxMjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyAxMjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAxMjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMTI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDUKKyAxMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbAorIDEyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g1CisgMTI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMgorIDEyOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgMTMwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDE1CisgMTMxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNworIDEzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cGRhdGVzCisgMTMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwY2hlY2sKKyAxMzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHBuYW1lbGlzdAorIDEzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3NydnJlbmFtZQorIDEzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cHZkaXIKKyAxMzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNzZXRmdHB0eXBlCisgMTM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNgorIDEzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gxNQorIDE0MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjcKKyAxNDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Mi4xCisgMTQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMgorIDE0My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g4LjE0CisgMTQ0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTMKKyAxNDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMworIDE0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwKKyAxNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbAorIDE0OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NrZXJtaXQuaHRtbAorIDE0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3NldGxvY3VzCisgMTUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjbGNvbW1hbmRzCisgMTUxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwdXNlcgorIDE1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3Nob3d2YXIKKyAxNTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjYWxsZXJpZAorIDE1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g2LjYKKyAxNTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MAorIDE1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExCisgMTU3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgMTU4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKKyAxNTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAxNjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMTYxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDAKKyAxNjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyAxNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDE2NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDE2NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAxNjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9rOTUuaHRtbAorIDE2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NzaGNsaWVudC5odG1sCisgMTY4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2tlcm1pdC5odG1sCisgMTY5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2tlcm1pdC5odG1sCisgMTcwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc3NoY2xpZW4uaHRtCisgMTcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMKKyAxNzIuIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzE3MzgudHh0CisgMTczLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMi4yCisgMTc0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDIuMi4xCisgMTc1LiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMyMzk2LnR4dAorIDE3Ni4gZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjMjYxNi50eHQKKyAxNzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4Mi4yLjMKKyAxNzguIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzI2MTYudHh0CisgMTc5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTMuNworIDE4MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NlY3VyaXR5Lmh0bSN4NS40CisgMTgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtI3gxNQorIDE4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NlY3VyaXR5Lmh0bSN4Ni4yCisgMTgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtbAorIDE4NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gxNgorIDE4NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDE4Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgMTg3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTg4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDE4OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjEKKyAxOTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4yCisgMTkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMworIDE5Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjQKKyAxOTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My41CisgMTk0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNgorIDE5NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjcKKyAxOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My44CisgMTk3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuOQorIDE5OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjEwCisgMTk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMTEKKyAyMDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zZWN1cml0eS5odG0KKyAyMDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zZWN1cml0eS5odG0jc2VydmVycworIDIwMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3NldHMuaHRtbAorIDIwMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3VuaWNvZGUuaHRtbAorIDIwNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaTcwLmh0bSN4MS41LjQKKyAyMDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9jYXNlMTAuaHRtbAorIDIwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g0CisgMjA3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMTEKKyAyMDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9mdHBzY3JpcHRzLmh0bWwKKyAyMDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyAyMTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHAKKyAyMTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9mdHBjbGllbnQuaHRtbAorIDIxMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2Z0cHNjcmlwdHMuaHRtbAorIDIxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDIxNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAyMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xLjEKKyAyMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xLjMKKyAyMTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xLjQKKyAyMTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xLjMKKyAyMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xLjMKKyAyMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4yCisgMjIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNQorIDIyMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjYKKyAyMjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9mdHBzY3JpcHRzLmh0bWwKKyAyMjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDIyNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cGF1dG9sb2cKKyAyMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHB1c2VyCisgMjI3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuOAorIDIyOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjgKKyAyMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyAyMzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHAKKyAyMzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAyMzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMjMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaWJtX2llLmh0bWwKKyAyMzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMAorIDIzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDIzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cAorIDIzNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDIzOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAyMzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9jazYwbWFudWFsLmh0bWwKKyAyNDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xNworIDI0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sCisgMjQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNgorIDI0My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExCisgMjQ0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMS40CisgMjQ1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtbAorIDI0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjcKKyAyNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43CisgMjQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTMuNAorIDI0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3Blcm1zd2l0Y2gKKyAyNTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHBjaG1vZAorIDI1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjYuMgorIDI1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g0CisgMjUzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgMjU0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwCisgMjU1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMjU2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDI1Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g3CisgMjU4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuOAorIDI1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjgKKyAyNjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDI2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjEwCisgMjYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMTAKKyAyNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My42CisgMjY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjc2V0ZnRwdHlwZQorIDI2NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDI2Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cAorIDI2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDI2OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAyNjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CisgMjcwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNS4xCisgMjcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZXJyb3JhY3Rpb24KKyAyNzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41CisgMjczLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNworIDI3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjYKKyAyNzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMworIDI3Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaTcwLmh0bSN4MS41LjQKKyAyNzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWk3MC5odG0KKyAyNzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4NAorIDI3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjcKKyAyODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My41LjIKKyAyODEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My43CisgMjgyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZXJyb3JhY3Rpb24KKyAyODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My41LjIKKyAyODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNlcnJvcmFjdGlvbgorIDI4NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cGZpbGVuYW1lcworIDI4Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cHBlcm1zCisgMjg3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwdW5pcXVlCisgMjg4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwZmlsZW5hbWVzCisgMjg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjbm90ZV91dGMKKyAyOTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNub3RlX2RhdGUKKyAyOTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My42CisgMjkyLiBodHRwOi8vd3d3LmJvdWxkZXIubmlzdC5nb3YvdGltZWZyZXEvZmFxL2ZhcS5odG0jMTA6CisgMjkzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNworIDI5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDI5NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cAorIDI5Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDI5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAyOTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMQorIDI5OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaTcwLmh0bSN4NC4zCisgMzAwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwKKyAzMDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4NQorIDMwMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjYuMworIDMwMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cGZpbGVuYW1lcworIDMwNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaTcwLmh0bSN4NC4xCisgMzA1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pNzAuaHRtI3g0LjIuMgorIDMwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaTcwLmh0bSN4MS41LjQKKyAzMDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My42LjIKKyAzMDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMQorIDMwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExCisgMzEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjc3J2cmVuYW1lCisgMzExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pNzAuaHRtI3g0LjEKKyAzMTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWk3MC5odG0KKyAzMTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQorIDMxNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cGZpbGVuYW1lcworIDMxNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjUuMworIDMxNi4gaHR0cDovL3d3dy5wcm9mdHBkLm5ldC8KKyAzMTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyAzMTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHAKKyAzMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAzMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMzIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyAzMjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NzZXRzLmh0bWwKKyAzMjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC91bmljb2RlLmh0bWwKKyAzMjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NzZXRzLmh0bWwKKyAzMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NzZXRzLmh0bWwKKyAzMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4NAorIDMyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3V0ZjguaHRtbAorIDMyOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3NldHMuaHRtbAorIDMyOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g0CisgMzMwLiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMyNjQwLnR4dAorIDMzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDMzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Z0cAorIDMzMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDMzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAzMzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyAzMzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHAKKyAzMzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAzMzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMzM5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgMzQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnRwCisgMzQxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMzQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDM0My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2Z0cHNjcmlwdHMuaHRtbAorIDM0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjIKKyAzNDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4yCisgMzQ2LiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmM5NTkudHh0CisgMzQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tzY3JpcHRzLmh0bWwKKyAzNDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyAzNDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHAKKyAzNTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9mdHBzY3JpcHQuaHRtbAorIDM1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDM1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAzNTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMS4xCisgMzU0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMTEuMgorIDM1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjExLjMKKyAzNTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My4xMS40CisgMzU3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMTEuNQorIDM1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDM1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2s5NS5odG1sCisgMzYwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMTEuNQorIDM2MS4gZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjOTU5LnR4dAorIDM2Mi4gZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjMjM4OS50eHQKKyAzNjMuIGh0dHA6Ly93d3cuaWV0Zi5vcmcvaW50ZXJuZXQtZHJhZnRzL2RyYWZ0LWlldGYtZnRwZXh0LW1sc3QtMTYudHh0CisgMzY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvZnRwY2xpZW50Lmh0bWwKKyAzNjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyAzNjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNmdHAKKyAzNjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAzNjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMzY5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMKKyAzNzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN1Y3MyCisgMzcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgMzcyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKKyAzNzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAzNzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMzc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgMzc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKKyAzNzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAzNzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgMzc5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KKyAzODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyAzODEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDM4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDM4My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAzODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4NAorIDM4NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g0CisgMzg2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTIKKyAzODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xCisgMzg4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDEyCisgMzg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTIKKyAzOTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyAzOTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDM5Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDM5My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAzOTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xNAorIDM5NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDM5Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgMzk3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMzk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDM5OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5CisgNDAwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgNDAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKKyA0MDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyA0MDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgNDA0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguNgorIDQwNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDQwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNDA3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNDA4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDQwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDQxMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNDExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNDEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDQxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDQxNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNDE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNDE2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDQxNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2Zqb2luCisgNDE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjZnNwbGl0CisgNDE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTAKKyA0MjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyA0MjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDQyMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDQyMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyA0MjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OQorIDQyNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5CisgNDI2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDkKKyA0MjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MworIDQyOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzCisgNDI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMgorIDQzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjIKKyA0MzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4My44CisgNDMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMKKyA0MzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4MworIDQzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzCisgNDM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuMgorIDQzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzCisgNDM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTMKKyA0MzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xMworIDQzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5CisgNDQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMTAKKyA0NDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC43LjQKKyA0NDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyA0NDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDQ0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDQ0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyA0NDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyA0NDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDQ0OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDQ0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyA0NTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyA0NTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDQ1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDQ1My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyA0NTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC43CisgNDU1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgNDU2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKKyA0NTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyA0NTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgNDU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjc2NyaXB0ZWRpdAorIDQ2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDQ2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNDYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNDYzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDQ2NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDQ2NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNDY2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNDY3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDQ2OC4gZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjMjgyMi50eHQKKyA0NjkuIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzI4MjIudHh0CisgNDcwLiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMyODIyLnR4dAorIDQ3MS4gZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjMjgyMi50eHQKKyA0NzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyA0NzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDQ3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDQ3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyA0NzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OC4xCisgNDc3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgNDc4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKKyA0NzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyA0ODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgNDgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMgorIDQ4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDQ4My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNDg0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNDg1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDQ4Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjgKKyA0ODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS44CisgNDg4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDguMgorIDQ4OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDQ5MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNDkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNDkyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDQ5My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDQ5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNDk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNDk2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDQ5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjgKKyA0OTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyA0OTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDUwMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDUwMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyA1MDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS44CisgNTAzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDkuOAorIDUwNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g5LjYKKyA1MDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyA1MDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDUwNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDUwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyA1MDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS44CisgNTEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDkuOAorIDUxMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDUxMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNTEzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNTE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDUxNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDUxNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNTE3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNTE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDUxOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDUyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNTIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNTIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDUyMy4gbWFpbHRvOnRodWNkYXRAaG90bWFpbC5jb20KKyA1MjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS45LjIKKyA1MjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyA1MjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDUyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDUyOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyA1MjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyA1MzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDUzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDUzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyA1MzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyA1MzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDUzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDUzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyA1MzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4OS4yCisgNTM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgNTM5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKKyA1NDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyA1NDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgNTQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDQKKyA1NDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN4NAorIDU0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDU0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNTQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNTQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDU0OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDU0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNTUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNTUxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDU1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDU1My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNTU0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNTU1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDU1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3g0CisgNTU3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjeDMuNworIDU1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjcKKyA1NTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCN0b3AKKyA1NjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbCNjb250ZW50cworIDU2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDU2Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyA1NjMuIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzIyMTcudHh0CisgNTY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgNTY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKKyA1NjYuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L3NyZWRpcmQvCisgNTY3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNTY4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDU2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaTcwLmh0bSN4NC4yMgorIDU3MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3RvcAorIDU3MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI2NvbnRlbnRzCisgNTcyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgNTczLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbAorIDU3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sI3gzLjEuMworIDU3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2N1aWtzZC5odG1sCisgNTc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgNTc3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKKyA1NzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyA1NzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgNTgwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjdG9wCisgNTgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwjY29udGVudHMKKyA1ODIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyA1ODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgNTg0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbApkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrZXJtb2QuaW5pIGIvY2tlcm1pdC04LjAuMjExL2NrZXJtb2QuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NDhjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2tlcm1vZC5pbmkKQEAgLTAsMCArMSwxNDQgQEAKKzsgRmlsZSBDS0VSTU9ELklOSSwgU2FtcGxlIEMtS2VybWl0IDcuMCBjdXN0b21pemF0aW9uIGZpbGUuCis7Cis7IFRoaXMgZmlsZSwgd2hpY2ggaXMgT05MWSBBIFNBTVBMRSwgc2hvdWxkIGJlIGNhbGxlZDoKKzsKKzsgICAubXlrZXJtcmMgICAoVU5JWCwgT1MtOSwgQWVnaXMsIEJlQm94LCBQbGFuIDkpCis7ICAgQ0tFUk1PRC5JTkkgKFZNUywgT3BlblZNUywgQU9TL1ZTLCBPUy8yLCBBbWlnYSwgQXRhcmkgU1QpCis7ICAgY2tlcm1vZC5pbmkgKFN0cmF0dXMgVk9TKQorOworOyBUaGlzIGZpbGUgaXMgZXhlY3V0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgc3RhbmRhcmQgQy1LZXJtaXQgaW5pdGlhbGl6YXRpb24KKzsgZmlsZSwgQ0tFUk1JVC5JTkkgKG9yIC5rZXJtcmMpLiAgVGhpcyBmaWxlIGlzIG5vdCBleGVjdXRlZCBieSBDLUtlcm1pdCBpdHNlbGYKKzsgdW5sZXNzIHRoZSBpbml0aWFsaXphdGlvbiBmaWxlIGlzIG5vdCBmb3VuZC4KKzsKKzsgTU9EaWZ5IHRoaXMgZmlsZSB0byBzdWl0IHlvdXIgbmVlZHMgYW5kIHByZWZlcmVuY2VzLCBhbmQgaW5zdGFsbCBpdCBpbiB5b3VyCis7IGhvbWUgZGlyZWN0b3J5LiAgT3IgcmVwbGFjZSBpdCBlbnRpcmVseSB3aXRoIGEgbmV3IGZpbGUuCis7Cis7IFRoZSBkZXNpZ24gb2YgdGhpcyBzYW1wbGUgY3VzdG9taXphdGlvbiBmaWxlIGxldHMgeW91IGZpbGwgaW4gYSBzZWN0aW9uIGZvcgorOyBlYWNoIGRpZmZlcmVudCBvcGVyYXRpbmcgc3lzdGVtIHdoZXJlIHlvdSBydW4gQy1LZXJtaXQuCis7Cis7IEluIFVOSVgsIGlmIHlvdSBnaXZlIHRoaXMgZmlsZSBleGVjdXRlIHBlcm1pc3Npb24gYW5kIG1ha2Ugc3VyZSB0aGUgdG9wCis7IGxpbmUgaW5kaWNhdGVzIHRoZSBmdWxsIHBhdGggb2YgdGhlIEMtS2VybWl0IDcuMC1vci1sYXRlciBleGVjdXRhYmxlLCB5b3UKKzsgY2FuIGV4ZWN1dGUgdGhpcyBmaWxlIGRpcmVjdGx5LCBhcyBpZiBpdCB3YXMgYSBzaGVsbCBzY3JpcHQsIGV4Y2VwdCBpdCBpcworOyBpbnRlcnByZXRlZCBieSBLZXJtaXQgcmF0aGVyIHRoYW4gdGhlIHNoZWxsLiAgVGhpcyBsZXRzIHlvdSBoYXZlIGFzIG1hbnkKKzsgZGlmZmVyZW50IHN0YXJ0dXAgZmlsZXMgYXMgeW91IGxpa2UsIGVhY2ggc3VpdGVkIHRvIGEgcGFydGljdWxhciBwdXJwb3NlLgorOworOyBBdXRob3JzOiAgQ2hyaXN0aW5lIEdpYW5vbmUsIEZyYW5rIGRhIENydXosIEplZmZyZXkgQWx0bWFuLAorOyAgICAgICAgICAgVGhlIEtlcm1pdCBQcm9qZWN0LCBDb2x1bWJpYSBVbml2ZXJzaXR5LgorOyBDcmVhdGlvbjogMjMgTm92ZW1iZXIgMTk5MiBmb3IgQy1LZXJtaXQgNUEoMTg4KS4KKzsgTW9kaWZpZWQ6IDMwIEp1bmUgMTk5MyBmb3IgZWRpdCAxODkuCis7ICAgICAgICAgICAwNCBPY3RvYmVyIDE5OTQgZm9yIGVkaXQgMTkwLgorOyAgICAgICAgICAgMTcgQXByaWwgMTk5NSBmb3IgZWRpdCAxOTEuCis7ICAgICAgICAgICAgNiBTZXB0ZW1iZXIgMTk5NiBmb3IgdmVyc2lvbiA2LjAsIGVkaXQgMTkyLgorOyAgICAgICAgICAgIDEgSmFudWFyeSAyMDAwIGZvciB2ZXJzaW9uIDcuMCwgZWRpdCAxOTYuCis7ICAgICAgICAgICAxNCBPY3RvYmVyIDIwMDEgZm9yIHZlcnNpb24gOC4wLCBlZGl0IDIwMC4KKworRUNITworRUNITyBFeGVjdXRpbmcgU0FNUExFIEMtS2VybWl0IGN1c3RvbWl6YXRpb24gZmlsZSBcdihjbWRmaWxlKSBmb3IgXHYoc3lzdGVtKS4uLgorRUNITyB7IFBsZWFzZSBlZGl0IHRoaXMgZmlsZSB0byByZWZsZWN0IHlvdXIgbmVlZHMgYW5kIHByZWZlcmVuY2VzLn0KK0VDSE8KKzsKKzsgLi4uIGFuZCB0aGVuIHJlbW92ZSB0aGUgRUNITyBjb21tYW5kcyBhYm92ZS4KKworQ09NTUVOVCAtIFNldHRpbmdzIHRoYXQgYXBwbHkgdG8gYWxsIHRoZSBzeXN0ZW1zIEkgdXNlOgorOworc2V0IGRlbGF5IDEgICAgICAgICAgICAgICAgICA7IEkgZXNjYXBlIGJhY2sgcXVpY2tseQorc2V0IGRpYWwgZGlzcGxheSBvbiAgICAgICAgICA7IEkgbGlrZSB0byB3YXRjaCBDLUtlcm1pdCBkaWFsCisKKzsgRGlhbGluZyBsb2NhbGUgYW5kIG1ldGhvZAorOworOyBTRVQgRElBTCBDT1VOVFJZLUNPREUgMSAgICA7IFVuY29tbWVudCBhbmQgcmVwbGFjZSB3aXRoIHlvdXJzCis7IFNFVCBESUFMIEFSRUEtQ09ERSAwMDAgICAgIDsgVW5jb21tZW50IGFuZCByZXBsYWNlIHdpdGggeW91cnMKKzsgU0VUIERJQUwgTEQtUFJFRklYIDEgICAgICAgOyBVbmNvbW1lbnQgYW5kIHJlcGxhY2Ugd2l0aCB5b3VycworOyBTRVQgRElBTCBJTlRMLVBSRUZJWCAwMTEgICA7IFVuY29tbWVudCBhbmQgcmVwbGFjZSB3aXRoIHlvdXJzCis7IFNFVCBESUFMIE1FVEhPRCBUT05FICAgICAgIDsgVW5jb21tZW50IGFuZCByZXBsYWNlIHdpdGggUFVMU0UgaWYgbmVjZXNzYXJ5Cis7IFNFVCBESUFMIERJUkVDVE9SWSAuLi4gLi4uIDsgTGlzdCBkaWFsaW5nIGRpcmVjdG9yeSBmaWxlcyBoZXJlCisKK2lmIDwgXHYodmVyc2lvbikgNjAwMTkyIC0KKyAgc3RvcCAxIFx2KGNtZGZpbGUpOiBDLUtlcm1pdCA2LjAuMTkyIG9yIGxhdGVyIHJlcXVpcmVkLgorCitzZXQgdGFrZSBlcnJvciBvbiAgICAgICAgICAgIDsgTWFrZSBlcnJvcnMgZmF0YWwgdGVtcG9yYXJpbHkKK2NoZWNrIGlmICAgICAgICAgICAgICAgICAgICAgOyBEbyB3ZSBoYXZlIGFuIElGIGNvbW1hbmQ/CitzZXQgdGFrZSBlcnJvciBvZmYgICAgICAgICAgIDsgWWVzIHdlIGRvLCBiYWNrIHRvIG5vcm1hbAorCis7IFRoZSBPTl9FWElUIG1hY3JvIGlzIGV4ZWN1dGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBDLUtlcm1pdCBleGl0cy4KKzsgRGVmaW5lIGFzIGRlc2lyZWQuCis7CitkZWZpbmUgT05fRVhJVCBlY2hvIFJldHVybmluZyB5b3UgdG8gXHYoc3lzdGVtKSBub3cuCisKKzsgU3lzdGVtLWluZGVwZW5kZW50IHF1aWNrIGRpYWxpbmcgbWFjcm8uICBEZXBlbmRzIG9uIGhhdmluZyB0aGUKKzsgbWFjcm9zIE1ZTU9ERU0sIE1ZUE9SVCwgYW5kIChvcHRpb25hbGx5KSBNWVNQRUVEIGRlZmluZWQgaW4gdGhlCis7IHN5c3RlbS1kZXBlbmRlbnQgc2VjdGlvbnMgYmVsb3cuCis7CitkZWZpbmUgTVlESUFMIHsKKyAgICBpZiBub3QgZGVmaW5lZCBNWU1PREVNIGVuZCAxIHtcJTA6IE1vZGVtIHR5cGUgbm90IGRlZmluZWQufQorICAgIHNldCBtb2RlbSB0eXBlIFxtKE1ZTU9ERU0pCisgICAgaWYgZmFpbCBlbmQgMSB7XCUwOiBcbShNWU1PREVNKTogVW5zdXBwb3J0ZWQgbW9kZW0gdHlwZS59CisgICAgaWYgbm90IGRlZmluZWQgTVlQT1JUIGVuZCAxIHtcJTA6IENvbW11bmljYXRpb24gcG9ydCBub3QgZGVmaW5lZC59CisgICAgc2V0IHBvcnQgXG0oTVlQT1JUKQorICAgIGlmIGZhaWwgZW5kIDEge1wlMDogU0VUIFBPUlQgXG0oTVlQT1JUKSBmYWlsZWQufQorICAgIGlmIGRlZmluZWQgTVlGTE9XIHNldCBmbG93IFxtKE1ZRkxPVykKKyAgICBpZiBmYWlsIGVuZCAxIHtcJTA6IFNFVCBGTE9XIFxtKE1ZRkxPVykgZmFpbGVkLn0KKyAgICBpZiBkZWZpbmVkIE1ZU1BFRUQgc2V0IHNwZWVkIFxtKE1ZU1BFRUQpCisgICAgaWYgZmFpbCBlbmQgMSB7XCUwOiBTRVQgU1BFRUQgXG0oTVlTUEVFRCkgZmFpbGVkLn0KKyAgICBkaWFsIFwlMVwlMlwlM1wlNFwlNVwlNlwlN1wlOFwlOQorICAgIGVuZCBcdihzdGF0dXMpCit9CisKK2ZvcndhcmQgXHYoc3lzdGVtKSAgICAgICAgICAgICAgOyBHbyBleGVjdXRlIHN5c3RlbS1kZXBlbmRlbnQgY29tbWFuZHMKKworOlVOSVggICAgICAgICAgICAgICAgICAgICAgICAgICA7IFVOSVgsIGFsbCB2ZXJzaW9ucy4uLgorZGVmaW5lIE1ZUE9SVCAvZGV2L2N1YSAgICAgICAgICA7IE15IGRpYWxpbmcgZW52aXJvbm1lbnQKK2RlZmluZSBNWU1PREVNIHVzciAgICAgICAgICAgICAgOyBSZXBsYWNlIHRoZXNlIGJ5IHdoYXQgeW91IGFjdHVhbGx5IGhhdmUKK2RlZmluZSBNWVNQRUVEIDU3NjAwCis7Cis7IElmIHlvdSB3YW50IGFsbCB5b3VyIGRvd25sb2FkcyB0byBnbyB0byB0aGUgc2FtZSBkaXJlY3RvcnksIG5vIG1hdHRlcgorOyB3aGF0IHlvdXIgY3VycmVudCBkaXJlY3RvcnkgaXMsIHVuY29tbWVudCBhbmQgZWRpdCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6Cis7Cis7ICAgc2V0IGZpbGUgZG93bmxvYWQtZGlyZWN0b3J5IH4vZG93bmxvYWQgOyBEb3dubG9hZCBkaXJlY3RvcnkgZm9yIFVOSVgKKworOyBQdXQgb3RoZXIgVU5JWC1zcGVjaWZpYyBjb21tYW5kcyBoZXJlLi4uCitlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIFVOSVggc2VjdGlvbgorCis6Vk1TICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgVk1TIGFuZCBPcGVuVk1TCitkZWZpbmUgTVlQT1JUIFRYQTA6ICAgICAgICAgICAgIDsgTXkgZGlhbGluZyBlbnZpcm9ubWVudAorZGVmaW5lIE1ZTU9ERU0gdXNyICAgICAgICAgICAgICA7IFJlcGxhY2UgdGhlc2UgYnkgd2hhdCB5b3UgYWN0dWFsbHkgaGF2ZQorZGVmaW5lIE1ZU1BFRUQgNTc2MDAKKzsgc2V0IGZpbGUgZG93bmxvYWQtZGlyZWN0b3J5IFtcJChVU0VSKS5ET1dOTE9BRF0gOyBEb3dubG9hZCBkaXJlY3RvcnkgZm9yIFZNUworOyBQdXQgb3RoZXIgVk1TLXNwZWNpZmljIGNvbW1hbmRzIGhlcmUuLi4KK2VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgVk1TIHNlY3Rpb24KKworOldJTjMyICAgICAgICAgICAgICAgICAgICAgICAgICA7IFdpbmRvd3MgYW5kIE9TLzIgY3VzdG9taXphdGlvbnMuLi4KKzpPUy8yCitkZWZpbmUgTVlQT1JUIENPTTEgICAgICAgICAgICAgIDsgTXkgZGlhbGluZyBlbnZpcm9ubWVudAorZGVmaW5lIE1ZTU9ERU0gdXNyICAgICAgICAgICAgICA7IFJlcGxhY2UgdGhlc2UgYnkgd2hhdCB5b3UgYWN0dWFsbHkgaGF2ZQorZGVmaW5lIE1ZU1BFRUQgNTc2MDAKK3NldCBjb21tYW5kIGJ5dGUgOCAgICAgICAgICAgICAgOyBVc2UgOCBiaXRzIGJldHdlZW4gS2VybWl0IGFuZCBjb25zb2xlCitzZXQgeGZlciBjaGFyIGxhdGluMSAgICAgICAgICAgIDsgVXNlIExhdGluLTEgZm9yIHRleHQgZmlsZSB0cmFuc2Zlcgorc2V0IHRlcm0gY2hhciBsYXRpbjEgICAgICAgICAgICA7IEFuZCB1c2UgTGF0aW4tMSBkdXJpbmcgQ09OTkVDVCBtb2RlCis7IHNldCBmaWxlIGRvd25sb2FkLWRpcmVjdG9yeSBDOlxET1dOTE9BRFMKK2VuZAorCis6T1M5LzY4SyAgICAgICAgICAgICAgICAgICAgICAgIDsgT1MtOS82ODAwMAorZGVmaW5lIE1ZUE9SVCAvdDMgICAgICAgICAgICAgICA7IE15IGRpYWxpbmcgZW52aXJvbm1lbnQKK2RlZmluZSBNWU1PREVNIHVzciAgICAgICAgICAgICAgOyBSZXBsYWNlIHRoZXNlIGJ5IHdoYXQgeW91IGFjdHVhbGx5IGhhdmUKK2RlZmluZSBNWVNQRUVEIDk2MDAKKzsgc2V0IGZpbGUgZG93bmxvYWQtZGlyZWN0b3J5IH4vZG93bmxvYWRzCitlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIE9TLTkgc2VjdGlvbgorCis6QU9TL1ZTICAgICAgICAgICAgICAgICAgICAgICAgIDsgRGF0YSBHZW5lcmFsIEFPUy9WUworZGVmaW5lIE1ZUE9SVCBAY29uMyAgICAgICAgICAgICA7IE15IGRpYWxpbmcgZW52aXJvbm1lbnQKK2RlZmluZSBNWU1PREVNIHVzciAgICAgICAgICAgICAgOyBSZXBsYWNlIHRoZXNlIGJ5IHdoYXQgeW91IGFjdHVhbGx5IGhhdmUKK2RlZmluZSBNWVNQRUVEIDk2MDAKKzsgc2V0IGZpbGUgZG93bmxvYWQtZGlyZWN0b3J5IFx2KGhvbWUpRE9XTkxPQURTCitlbmQKKworOyBBbmQgc28gb24sIHlvdSBnZXQgdGhlIGlkZWEuLi4KKzsgRmlsbCBpbiB0aGUgc2VjdGlvbnMgdGhhdCBhcHBseSB0byB5b3UuCisKKzpTdHJhdHVzX1ZPUwkJCTsgU3RyYXR1cyBWT1MKKzpBbWlnYSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBDb21tb2RvcmUgQW1pZ2EKKzpBdGFyaV9TVCAgICAgICAgICAgICAgICAgICAgICAgOyBBdGFyaSBTVAorOk1hY2ludG9zaCAgICAgICAgICAgICAgICAgICAgICA7IEFwcGxlIE1hY2ludG9zaAorOnVua25vd24gICAgICAgICAgICAgICAgICAgICAgICA7IE90aGVycworCis7IChFbmQgb2YgQ0tFUk1PRC5JTkkpCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2t1YXQyLmggYi9ja2VybWl0LTguMC4yMTEvY2t1YXQyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlOGUxMAotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja3VhdDIuaApAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAgQyBLIFUgQSBUIDIgLiBIICAtLSAgS2VyYmVyb3MgaGVhZGVycyBmb3IgQy1LZXJtaXQKKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorCisgIEF1dGhvcjoKKyAgICBLZXJiZXJvcyBJViBhbmQgViBpbnRlcmdyYXRpb24uCisgICAgSmVmZnJleSBFIEFsdG1hbiAoamFsdG1hbkBzZWN1cmUtZW5kcG9pbnRzLmNvbSkKKyAgICBTZWN1cmUgRW5kcG9pbnRzIEluYy4sIE5ldyBZb3JrIENpdHkKKyovCisvKgorICogQmFzZWQgb24gYSBjb25jYXRlbmF0aW9uIG9mIGFsbCBuZWNlc3NhcnkgaW5jbHVkZSBmaWxlcyBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGUgS2VyYmVyb3MgNSBOVCBBbHBoYSAyIFRlbG5ldCBwYWNrYWdlIGZyb20gTUlULgorICovCisKKyNpZm5kZWYgS1JCNV9URUxORVRfSAorI2RlZmluZSBLUkI1X1RFTE5FVF9ICisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAgICAgIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAgICAgIEAoIyllbmNyeXB0LmggICA4LjEgKEJlcmtlbGV5KSA2LzQvOTMKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAxOTkwIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogRXhwb3J0IG9mIHRoaXMgc29mdHdhcmUgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIG1heQorICogcmVxdWlyZSBhIHNwZWNpZmljIGxpY2Vuc2UgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50LgorICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uIGNvbnRlbXBsYXRpbmcKKyAqIGV4cG9ydCB0byBvYnRhaW4gc3VjaCBhIGxpY2Vuc2UgYmVmb3JlIGV4cG9ydGluZy4KKyAqCisgKiBXSVRISU4gVEhBVCBDT05TVFJBSU5ULCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZAorICogd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdAorICogdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nCisgKiB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IKKyAqIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcworICogb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaWZkZWYgIENLX0VOQ1JZUFRJT04KKworI2lmbmRlZiBfX0VOQ1JZUFRJT05fXworI2RlZmluZSBfX0VOQ1JZUFRJT05fXworCisjZGVmaW5lIERJUl9ERUNSWVBUICAgICAgICAgICAgIDEKKyNkZWZpbmUgRElSX0VOQ1JZUFQgICAgICAgICAgICAgMgorCisjaWZuZGVmIENLX0RFU19DCisjaWZuZGVmIE5PQkxPQ0tERUYKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBCbG9ja1s4XTsKKyNlbmRpZiAvKiBOT0JMT0NLREVGICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKkJsb2NrVDsKKyNpZm5kZWYgS1JCNCAgICAvKiBhbHJlYWR5IGRlZmluZWQgaW4ga2VyYmVyb3Npdi9kZXMuaCAqLwordHlwZWRlZiBzdHJ1Y3QgZGVzX2tzX3N0cnVjdCB7IEJsb2NrIF87IH0gU2NoZWR1bGVbMTZdOworI2Vsc2UgLyogS1JCNCAqLworI2lmbmRlZiBPUzIKKyNpZm5kZWYgTk9CTE9DS0RFRiAgICAvKiBhbHJlYWR5IGRlZmluZWQgaW4ga2VyYmVyb3Npdi9kZXMuaCAqLwordHlwZWRlZiBzdHJ1Y3QgZGVzX2tzX3N0cnVjdCB7IEJsb2NrIF87IH0gU2NoZWR1bGVbMTZdOworI2VuZGlmIC8qIE5PQkxPQ0tERUYgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBLUkI0ICovCisKKyNkZWZpbmUgVkFMSURLRVkoa2V5KSAoa2V5WzBdfGtleVsxXXxrZXlbMl18a2V5WzNdfGtleVs0XXxrZXlbNV18a2V5WzZdfGtleVs3XSkKKworI2RlZmluZSBTQU1FS0VZKGsxLCBrMikgKCFtZW1jbXAoKHZvaWQgKilrMSwgKHZvaWQgKilrMiwgc2l6ZW9mKEJsb2NrKSkpCisjZW5kaWYgLyogQ0tfREVTX0MgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3Nlc3Npb25fa2V5IHsKKyAgc2hvcnQgICAgICAgICB0eXBlOworICBpbnQgICAgICAgICAgIGxlbmd0aDsKKyAgdW5zaWduZWQgY2hhciAqZGF0YTsKK30gU2Vzc2lvbl9LZXk7CisKKyNpZmRlZiBfX1NURENfXwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyICAqbmFtZTsKKyAgaW50ICAgdHlwZTsKKyAgdm9pZCAgKCpvdXRwdXQpKHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKyAgaW50ICAgKCppbnB1dCkoaW50KTsKKyAgdm9pZCAgKCppbml0KShpbnQpOworICBpbnQgICAoKnN0YXJ0KShpbnQsIGludCk7CisgIGludCAgICgqaXMpKHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKyAgaW50ICAgKCpyZXBseSkodW5zaWduZWQgY2hhciAqLCBpbnQpOworICBpbnQgICAoKnNlc3Npb24pKFNlc3Npb25fS2V5ICosIGludCk7CisgIGludCAgICgqa2V5aWQpKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQgKik7CisgIHZvaWQgICgqcHJpbnRzdWIpKHVuc2lnbmVkIGNoYXIgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCk7Cit9IEVuY3J5cHRpb25zOworI2lmICFkZWZpbmVkKFApCisjZGVmaW5lIFAoeCkgeAorI2VuZGlmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyICAqbmFtZTsKKyAgaW50ICAgdHlwZTsKKyAgdm9pZCAgKCpvdXRwdXQpKCk7CisgIGludCAgICgqaW5wdXQpKCk7CisgIHZvaWQgICgqaW5pdCkoKTsKKyAgaW50ICAgKCpzdGFydCkoKTsKKyAgaW50ICAgKCppcykoKTsKKyAgaW50ICAgKCpyZXBseSkoKTsKKyAgaW50ICAgKCpzZXNzaW9uKSgpOworICBpbnQgICAoKmtleWlkKSgpOworICB2b2lkICAoKnByaW50c3ViKSgpOworfSBFbmNyeXB0aW9uczsKKyNpZiAhZGVmaW5lZChQKQorI2RlZmluZSBQKHgpICgpCisjZW5kaWYKKyNlbmRpZgorCitpbnQgZW5jcnlwdF9wYXJzZSh1bnNpZ25lZCBjaGFyICosIGludCk7CisKKyNpZmRlZiBERUJVRworaW50IHByaW50c3ViKGNoYXIsIHVuc2lnbmVkIGNoYXIgKiwgc2l6ZV90KTsKKyNlbmRpZgorCisjZGVmaW5lIFNLX0dFTkVSSUMgICAgICAwICAgICAgIC8qIEp1c3QgYSBzdHJpbmcgb2YgYml0cyAqLworI2RlZmluZSBTS19ERVMgICAgICAgICAgMSAgICAgICAvKiBNYXRjaGVkIEtlcmJlcm9zIHY1IEVOQ1RZUEVfREVTICovCisKK3ZvaWQgZW5jcnlwdF9pbml0IFAoKGtzdHJlYW0saW50KSk7CitFbmNyeXB0aW9ucyAqZmluZGVuY3J5cHRpb24gUCgoaW50KSk7Cit2b2lkIGVuY3J5cHRfc2VuZF9zdXBwb3J0IFAoKHZvaWQpKTsKK3ZvaWQgZW5jcnlwdF9hdXRvIFAoKGludCkpOwordm9pZCBkZWNyeXB0X2F1dG8gUCgoaW50KSk7CitpbnQgIGVuY3J5cHRfaXMgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2ludCAgZW5jcnlwdF9yZXBseSBQKCh1bnNpZ25lZCBjaGFyICosIGludCkpOwordm9pZCBlbmNyeXB0X3N0YXJ0X2lucHV0IFAoKGludCkpOworaW50ICBlbmNyeXB0X3Nlc3Npb25fa2V5IFAoKFNlc3Npb25fS2V5ICosIGludCkpOworaW50ICBlbmNyeXB0X2RvbnRfc3VwcG9ydCBQKChpbnQpKTsKK3ZvaWQgZW5jcnlwdF9lbmRfaW5wdXQgUCgodm9pZCkpOwordm9pZCBlbmNyeXB0X3N0YXJ0X291dHB1dCBQKChpbnQpKTsKK3ZvaWQgZW5jcnlwdF9lbmRfb3V0cHV0IFAoKHZvaWQpKTsKK3ZvaWQgZW5jcnlwdF9zZW5kX3JlcXVlc3Rfc3RhcnQgUCgodm9pZCkpOwordm9pZCBlbmNyeXB0X3NlbmRfcmVxdWVzdF9lbmQgUCgodm9pZCkpOwordm9pZCBlbmNyeXB0X3NlbmRfZW5kIFAoKHZvaWQpKTsKK3ZvaWQgZW5jcnlwdF93YWl0IFAoKHZvaWQpKTsKK2ludCAgZW5jcnlwdF9pc19lbmNyeXB0aW5nIFAoKHZvaWQpKTsKK3ZvaWQgZW5jcnlwdF9zZW5kX3N1cHBvcnQgUCgodm9pZCkpOworaW50ICBlbmNyeXB0X3NlbmRfa2V5aWQgUCgoaW50LCB1bnNpZ25lZCBjaGFyICosIGludCwgaW50KSk7CisKK2ludCBlbmNyeXB0X2NtZCBQKChpbnQsIGNoYXIgKiopKTsKK3ZvaWQgZW5jcnlwdF9kaXNwbGF5IFAoKHZvaWQpKTsKKworI2lmZGVmIENLX0tFUkJFUk9TCit2b2lkIGtyYmRlc19lbmNyeXB0IFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CitpbnQgIGtyYmRlc19kZWNyeXB0IFAoKGludCkpOworaW50ICBrcmJkZXNfaXMgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2ludCAga3JiZGVzX3JlcGx5IFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7Cit2b2lkIGtyYmRlc19pbml0IFAoKGludCkpOworaW50ICBrcmJkZXNfc3RhcnQgUCgoaW50LCBpbnQpKTsKK3ZvaWQga3JiZGVzX3Nlc3Npb24gUCgoU2Vzc2lvbl9LZXkgKiwgaW50KSk7Cit2b2lkIGtyYmRlc19wcmludHN1YiBQKCh1bnNpZ25lZCBjaGFyICosIGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQpKTsKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCit2b2lkIGNmYjY0X2VuY3J5cHQgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2ludCBjZmI2NF9kZWNyeXB0IFAoKGludCkpOwordm9pZCBjZmI2NF9pbml0IFAoKGludCkpOworaW50IGNmYjY0X3N0YXJ0IFAoKGludCwgaW50KSk7CitpbnQgY2ZiNjRfaXMgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2ludCBjZmI2NF9yZXBseSBQKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworaW50IGNmYjY0X3Nlc3Npb24gUCgoU2Vzc2lvbl9LZXkgKiwgaW50KSk7CitpbnQgY2ZiNjRfa2V5aWQgUCgoaW50LCB1bnNpZ25lZCBjaGFyICosIGludCAqKSk7Cit2b2lkIGNmYjY0X3ByaW50c3ViIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCkpOworCit2b2lkIG9mYjY0X2VuY3J5cHQgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2ludCBvZmI2NF9kZWNyeXB0IFAoKGludCkpOwordm9pZCBvZmI2NF9pbml0IFAoKGludCkpOworaW50IG9mYjY0X3N0YXJ0IFAoKGludCwgaW50KSk7CitpbnQgb2ZiNjRfaXMgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2ludCBvZmI2NF9yZXBseSBQKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworaW50IG9mYjY0X3Nlc3Npb24gUCgoU2Vzc2lvbl9LZXkgKiwgaW50KSk7CitpbnQgb2ZiNjRfa2V5aWQgUCgoaW50LCB1bnNpZ25lZCBjaGFyICosIGludCAqKSk7Cit2b2lkIG9mYjY0X3ByaW50c3ViIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCkpOworCit2b2lkIGRlczNfY2ZiNjRfZW5jcnlwdCBQKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworaW50ICBkZXMzX2NmYjY0X2RlY3J5cHQgUCgoaW50KSk7Cit2b2lkIGRlczNfY2ZiNjRfaW5pdCBQKChpbnQpKTsKK2ludCAgZGVzM19jZmI2NF9zdGFydCBQKChpbnQsIGludCkpOworaW50ICBkZXMzX2NmYjY0X2lzIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CitpbnQgIGRlczNfY2ZiNjRfcmVwbHkgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2ludCAgZGVzM19jZmI2NF9zZXNzaW9uIFAoKFNlc3Npb25fS2V5ICosIGludCkpOworaW50ICBkZXMzX2NmYjY0X2tleWlkIFAoKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQgKikpOwordm9pZCBkZXMzX2NmYjY0X3ByaW50c3ViIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCkpOworCit2b2lkIGRlczNfb2ZiNjRfZW5jcnlwdCBQKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworaW50ICBkZXMzX29mYjY0X2RlY3J5cHQgUCgoaW50KSk7Cit2b2lkIGRlczNfb2ZiNjRfaW5pdCBQKChpbnQpKTsKK2ludCAgZGVzM19vZmI2NF9zdGFydCBQKChpbnQsIGludCkpOworaW50ICBkZXMzX29mYjY0X2lzIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CitpbnQgIGRlczNfb2ZiNjRfcmVwbHkgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2ludCAgZGVzM19vZmI2NF9zZXNzaW9uIFAoKFNlc3Npb25fS2V5ICosIGludCkpOworaW50ICBkZXMzX29mYjY0X2tleWlkIFAoKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQgKikpOwordm9pZCBkZXMzX29mYjY0X3ByaW50c3ViIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCkpOworCisjaWZkZWYgQ0FTVF9FTkNSWVBUSU9OCit2b2lkIGNhc3RfY2ZiNjRfZW5jcnlwdCBQKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworaW50ICBjYXN0X2NmYjY0X2RlY3J5cHQgUCgoaW50KSk7Cit2b2lkIGNhc3RfY2ZiNjRfaW5pdCBQKChpbnQpKTsKK2ludCAgY2FzdF9jZmI2NF9zdGFydCBQKChpbnQsIGludCkpOworaW50ICBjYXN0X2NmYjY0X2lzIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CitpbnQgIGNhc3RfY2ZiNjRfcmVwbHkgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2ludCAgY2FzdF9jZmI2NF9zZXNzaW9uIFAoKFNlc3Npb25fS2V5ICosIGludCkpOworaW50ICBjYXN0X2NmYjY0X2tleWlkIFAoKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQgKikpOwordm9pZCBjYXN0X2NmYjY0X3ByaW50c3ViIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCkpOworCit2b2lkIGNhc3Rfb2ZiNjRfZW5jcnlwdCBQKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworaW50ICBjYXN0X29mYjY0X2RlY3J5cHQgUCgoaW50KSk7Cit2b2lkIGNhc3Rfb2ZiNjRfaW5pdCBQKChpbnQpKTsKK2ludCAgY2FzdF9vZmI2NF9zdGFydCBQKChpbnQsIGludCkpOworaW50ICBjYXN0X29mYjY0X2lzIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CitpbnQgIGNhc3Rfb2ZiNjRfcmVwbHkgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2ludCAgY2FzdF9vZmI2NF9zZXNzaW9uIFAoKFNlc3Npb25fS2V5ICosIGludCkpOworaW50ICBjYXN0X29mYjY0X2tleWlkIFAoKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQgKikpOwordm9pZCBjYXN0X29mYjY0X3ByaW50c3ViIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCkpOworCit2b2lkIGNhc3RleHBfY2ZiNjRfZW5jcnlwdCBQKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworaW50ICBjYXN0ZXhwX2NmYjY0X2RlY3J5cHQgUCgoaW50KSk7Cit2b2lkIGNhc3RleHBfY2ZiNjRfaW5pdCBQKChpbnQpKTsKK2ludCAgY2FzdGV4cF9jZmI2NF9zdGFydCBQKChpbnQsIGludCkpOworaW50ICBjYXN0ZXhwX2NmYjY0X2lzIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CitpbnQgIGNhc3RleHBfY2ZiNjRfcmVwbHkgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2ludCAgY2FzdGV4cF9jZmI2NF9zZXNzaW9uIFAoKFNlc3Npb25fS2V5ICosIGludCkpOworaW50ICBjYXN0ZXhwX2NmYjY0X2tleWlkIFAoKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQgKikpOwordm9pZCBjYXN0ZXhwX2NmYjY0X3ByaW50c3ViIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCkpOworCit2b2lkIGNhc3RleHBfb2ZiNjRfZW5jcnlwdCBQKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworaW50ICBjYXN0ZXhwX29mYjY0X2RlY3J5cHQgUCgoaW50KSk7Cit2b2lkIGNhc3RleHBfb2ZiNjRfaW5pdCBQKChpbnQpKTsKK2ludCAgY2FzdGV4cF9vZmI2NF9zdGFydCBQKChpbnQsIGludCkpOworaW50ICBjYXN0ZXhwX29mYjY0X2lzIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CitpbnQgIGNhc3RleHBfb2ZiNjRfcmVwbHkgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2ludCAgY2FzdGV4cF9vZmI2NF9zZXNzaW9uIFAoKFNlc3Npb25fS2V5ICosIGludCkpOworaW50ICBjYXN0ZXhwX29mYjY0X2tleWlkIFAoKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQgKikpOwordm9pZCBjYXN0ZXhwX29mYjY0X3ByaW50c3ViIFAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCkpOworI2VuZGlmIC8qIENBU1RfRU5DUllQVElPTiAqLworCisvKiBpbnQgIGRlc19zdHJpbmdfdG9fa2V5IFAoKGNoYXIgKiwgQmxvY2spKTsgKi8KKworI2lmZGVmIERFQlVHCitleHRlcm4gaW50IGVuY3J5cHRfZGVidWdfbW9kZTsKKyNlbmRpZgorCisjaWZuZGVmIENSWVBUX0RMTAorZXh0ZXJuIGludCAoKmRlY3J5cHRfaW5wdXQpIFAoKGludCkpOworZXh0ZXJuIHZvaWQgKCplbmNyeXB0X291dHB1dCkgUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKKyNlbmRpZiAvKiBDUllQVF9ETEwgKi8KKworaW50IGRlY3J5cHRfa3NfaGFjayh1bnNpZ25lZCBjaGFyICosIGludCk7CisKKyNlbmRpZiAvKiBfX0VOQ1JZUFRJT05fXyAqLworI2VuZGlmIC8qIEVOQ1JZUFRJT04gKi8KKworI2lmZGVmIENSWVBUX0RMTAorc3RydWN0IF9jcnlwdF9kbGxfaW5pdCB7CisgICAgaW50IHZlcnNpb247CisKKyAgICAvKiBWZXJzaW9uIDEgdmFyaWFibGVzICovCisgICAgaW50ICgqcF90dG9sKShjaGFyICosaW50KTsKKyAgICBpbnQgKCpwX2RvZGVidWcpKGludCxjaGFyICosY2hhciAqLGxvbmcpOworICAgIGludCAoKnBfZG9oZXhkdW1wKShjaGFyICosY2hhciAqLGludCk7CisgICAgdm9pZCAoKnBfdG5fZGVidWcpKGNoYXIgKik7CisgICAgaW50ICgqcF92c2NybnByaW50ZikoY2hhciAqLCAuLi4pOworCisgICAgLyogVmVyc2lvbiAyIHZhcmlhYmxlcyAqLworICAgIHZvaWQgKiBwX2s1X2NvbnRleHQ7CisKKyAgICAvKiBWZXJzaW9uIDMgdmFyaWFibGVzICovCisgICAgdm9pZCAoKnBfaW5zdGFsbF9mdW5jcykoY2hhciAqLHZvaWQgKik7CisKKyAgICAvKiBWZXJzaW9uIDUgdmFyaWFibGVzICovCisgICAgdW5zaWduZWQgbG9uZyAoKnBfcmVxdGVsbXV0ZXgpKHVuc2lnbmVkIGxvbmcpOworICAgIHVuc2lnbmVkIGxvbmcgKCpwX3JlbHRlbG11dGV4KSh2b2lkKTsKK307CisjZW5kaWYgLyogQ1JZUFRfRExMICovCisKKy8qIHBlciBLZXJiZXJvcyB2NSBwcm90b2NvbCBzcGVjICovCisjaWZuZGVmIEVOQ1RZUEVfTlVMTAorI2RlZmluZSBFTkNUWVBFX05VTEwgICAgICAgICAgICAweDAwMDAKKyNlbmRpZgorI2lmbmRlZiAgRU5DVFlQRV9ERVNfQ0JDX0NSQworI2RlZmluZSBFTkNUWVBFX0RFU19DQkNfQ1JDICAgICAweDAwMDEgIC8qIERFUyBjYmMgbW9kZSB3aXRoIENSQy0zMiAqLworI2VuZGlmCisjaWZuZGVmICBFTkNUWVBFX0RFU19DQkNfTUQ0CisjZGVmaW5lIEVOQ1RZUEVfREVTX0NCQ19NRDQgICAgIDB4MDAwMiAgLyogREVTIGNiYyBtb2RlIHdpdGggUlNBLU1ENCAqLworI2VuZGlmCisjaWZuZGVmICBFTkNUWVBFX0RFU19DQkNfTUQ1CisjZGVmaW5lIEVOQ1RZUEVfREVTX0NCQ19NRDUgICAgIDB4MDAwMyAgLyogREVTIGNiYyBtb2RlIHdpdGggUlNBLU1ENSAqLworI2VuZGlmCisjaWZuZGVmICBFTkNUWVBFX0RFU19DQkNfUkFXCisjZGVmaW5lIEVOQ1RZUEVfREVTX0NCQ19SQVcgICAgIDB4MDAwNCAgLyogREVTIGNiYyBtb2RlIHJhdyAqLworI2VuZGlmCisvKiBYWFggZGVwcmVjYXRlZD8gKi8KKyNpZm5kZWYgIEVOQ1RZUEVfREVTM19DQkNfU0hBCisjZGVmaW5lIEVOQ1RZUEVfREVTM19DQkNfU0hBICAgIDB4MDAwNSAgLyogREVTLTMgY2JjIG1vZGUgd2l0aCBOSVNULVNIQSAqLworI2VuZGlmCisjaWZuZGVmICBFTkNUWVBFX0RFUzNfQ0JDX1JBVworI2RlZmluZSBFTkNUWVBFX0RFUzNfQ0JDX1JBVyAgICAweDAwMDYgIC8qIERFUy0zIGNiYyBtb2RlIHJhdyAqLworI2VuZGlmCisjaWZuZGVmICBFTkNUWVBFX0RFU19ITUFDX1NIQTEKKyNkZWZpbmUgRU5DVFlQRV9ERVNfSE1BQ19TSEExICAgMHgwMDA4CisjZW5kaWYKKyNpZm5kZWYgIEVOQ1RZUEVfREVTM19DQkNfU0hBMQorI2RlZmluZSBFTkNUWVBFX0RFUzNfQ0JDX1NIQTEgIDB4MDAxMAorI2VuZGlmCisjaWZuZGVmIEVOQ1RZUEVfQUVTMTI4X0NUU19ITUFDX1NIQTFfOTYKKyNkZWZpbmUgRU5DVFlQRV9BRVMxMjhfQ1RTX0hNQUNfU0hBMV85NiAgMHgwMDExCisjZW5kaWYKKyNpZm5kZWYgRU5DVFlQRV9BRVMyNTZfQ1RTX0hNQUNfU0hBMV85NgorI2RlZmluZSBFTkNUWVBFX0FFUzI1Nl9DVFNfSE1BQ19TSEExXzk2ICAweDAwMTIKKyNlbmRpZgorI2lmbmRlZiBFTkNUWVBFX0FSQ0ZPVVJfSE1BQworI2RlZmluZSBFTkNUWVBFX0FSQ0ZPVVJfSE1BQyAgICAgMHgwMDE3CisjZW5kaWYKKyNpZm5kZWYgRU5DVFlQRV9BUkNGT1VSX0hNQUNfRVhQCisjZGVmaW5lIEVOQ1RZUEVfQVJDRk9VUl9ITUFDX0VYUCAweDAwMTgKKyNlbmRpZgorI2lmbmRlZiBFTkNUWVBFX0xPQ0FMX1JDNF9NRDQKKyNkZWZpbmUgRU5DVFlQRV9MT0NBTF9SQzRfTUQ0ICAgIDB4RkZGRkZGODAKKyNlbmRpZgorI2lmbmRlZiAgRU5DVFlQRV9VTktOT1dOCisjZGVmaW5lIEVOQ1RZUEVfVU5LTk9XTiAgICAgICAgIDB4MDFmZgorI2VuZGlmCisvKiBsb2NhbCBjcnVkICovCisvKiBtYXJjJ3MgREVTLTMgd2l0aCAzMi1iaXQgbGVuZ3RoICovCisjaWZuZGVmICBFTkNUWVBFX0xPQ0FMX0RFUzNfSE1BQ19TSEExCisjZGVmaW5lIEVOQ1RZUEVfTE9DQUxfREVTM19ITUFDX1NIQTEgMHg3MDA3CisjZW5kaWYKKyNlbmRpZiAvKiBLUkI1X1RFTE5FVF9IICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2t1YXRoLmMgYi9ja2VybWl0LTguMC4yMTEvY2t1YXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhNDM2MAotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja3VhdGguYwpAQCAtMCwwICsxLDEzMjg3IEBACitjaGFyICpja2F0aHYgPSAiQXV0aGVudGljYXRpb24sIDguMC4yMzIsIDcgRmViIDIwMDQiOworLyoKKyAgQyBLIFUgQSBUIEggLiBDICAtLSAgQXV0aGVudGljYXRpb24gZm9yIEMtS2VybWl0CisKKyAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKworICAgIEF1dGhvcjogIEplZmZyZXkgRSBBbHRtYW4gKGphbHRtYW5Ac2VjdXJlLWVuZHBvaW50cy5jb20pCisgICAgICAgICAgICAgICBTZWN1cmUgRW5kcG9pbnRzIEluYy4sIE5ldyBZb3JrIENpdHkKKyovCisvKgorICogQWRkaXRpb25hbCBjb3B5cmlnaHRzIGluY2x1ZGVkIHdpdGggYWZmZWN0ZWQgY29kZS4KKyAqLworCisjaWZkZWYgSEVJTURBTAorLyoKKyAgVHVybmVkIG9mZiBVc2VyIHRvIFVzZXIgc3VwcG9ydAorICBUdXJuZWQgb2ZmIEtERVNUUk9ZIHN1cHBvcnQKKyAgVHVybmVkIG9mZiBLTElTVCBzdXBwb3J0CisgIFR1cm5lZCBvZmYga3JiNV9wcm9tcHRlcigpIHN1cHBvcnQKKyAgVHVybmVkIG9mZiB0aWNrZXQgdmFsaWRhdGlvbgorICBUdXJuZWQgb2ZmIHRpY2tldCByZW5ld2FsCisgIFR1cm5lZCBvZmYgYWx0ZXJuYXRpdmUgY2FjaGUgc3VwcG9ydCBpbiBrNV9nZXRfY2NhY2hlKCkKKworICBSZW1haW5pbmcgbGluayBwcm9ibGVtczoKKworICBja3VhdGgubzogSW4gZnVuY3Rpb24gYGNrX2tyYjVfaW5pdFRHVCc6CisgIGNrdWF0aC5vKC50ZXh0KzB4NTBjMik6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYGtyYjVfc3RyaW5nX3RvX2RlbHRhdCcKKyAgY2t1YXRoLm8oLnRleHQrMHg1MTZkKTogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBga3JiNV9zdHJpbmdfdG9fZGVsdGF0JworICBja3VhdGgubygudGV4dCsweDUxZWYpOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGBrcmI1X3N0cmluZ190b19kZWx0YXQnCisqLworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKworLyoKKyAqIEltcGxlbWVudHMgS2VyYmVyb3MgNC81LCBTUlAsIFNTTCwgTlRMTSBhdXRoZW50aWNhdGlvbiBhbmQgU1RBUlRfVExTCisgKi8KKworI2luY2x1ZGUgImNrY3N5bS5oIgorI2luY2x1ZGUgImNrY2RlYi5oIgorCisjaWZkZWYgQ0tfU0VDVVJJVFkKKworI2RlZmluZSBDS1VBVEhfQworI2luY2x1ZGUgImNrY2tlci5oIgorI2luY2x1ZGUgImNrdXVzci5oIgorI2luY2x1ZGUgImNrdWNtZC5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIHN0cnVjdCBrZXl0YWIgKi8KKyNpbmNsdWRlICJja2NuZXQuaCIKKyNpbmNsdWRlICJja2N0ZWwuaCIKKworY2hhciBzelVzZXJOYW1lUmVxdWVzdGVkW1VJREJVRkxFTisxXTsgICAgLyogZm9yIGluY29taW5nIGNvbm5lY3Rpb25zICovCitjaGFyIHN6VXNlck5hbWVBdXRoZW50aWNhdGVkW1VJREJVRkxFTisxXTsvKiBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgKi8KK2NoYXIgc3pIb3N0TmFtZVtVSURCVUZMRU4rMV07CitjaGFyIHN6VXNlck5hbWVbVUlEQlVGTEVOKzFdOworc3RhdGljIGNoYXIgc3pJUFsxNl07CitzdGF0aWMgaW50ICB2YWxpZFVzZXIgPSBBVVRIX1JFSkVDVDsgICAgLyogVXNlciBzdGFydHMgb3V0IGludmFsaWQgKi8KK2ludCBhdXRoZW50aWNhdGlvbl92ZXJzaW9uID0gQVVUSFRZUEVfTlVMTDsKK2ludCBhY2NlcHRfY29tcGxldGUgPSAwOworCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyNpZmRlZiBDS19TU0wKKyNpZmRlZiBLUkI1CisjZGVmaW5lIFRMU19WRVJJRlkKKyNlbmRpZiAvKiBLUkI1ICovCisjZW5kaWYgLyogQ0tfU1NMICovCisKKyNpZmRlZiBDS19ERVMKKyNpZmRlZiBDS19TU0wKKyNpZm5kZWYgTElCREVTCisjZGVmaW5lIExJQkRFUworI2VuZGlmIC8qIExJQkRFUyAqLworI2VuZGlmIC8qIENLX1NTTCAqLworI2VuZGlmIC8qIENLX0RFUyAqLworCisjaWZkZWYgQ1JZUFRfRExMCisjaWZuZGVmIExJQkRFUworI2RlZmluZSBMSUJERVMKKyNlbmRpZiAvKiBMSUJERVMgKi8KKyNpZmRlZiBPUzIKKyNpZmRlZiBOVAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlIC8qIE5UICovCisjZGVmaW5lIElOQ0xfRE9TTU9EVUxFTUdSCisjaW5jbHVkZSA8b3MyLmg+CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDUllQVF9ETEwgKi8KKworI2lmZGVmIE5UCisjZGVmaW5lIEtSQjVfQVVUT0NPTkZfXworI2RlZmluZSBOVExNCisjZW5kaWYgLyogTlQgKi8KKworI2lmZGVmIENLX0tFUkJFUk9TCisjZGVmaW5lIEtJTklUCisjaWZuZGVmIEhFSU1EQUwKKyNkZWZpbmUgS0xJU1QKKyNkZWZpbmUgS0RFU1RST1kKKyNlbmRpZiAvKiBIRUlNREFMICovCisjZGVmaW5lIENIRUNLQUREUlMKKyNlbHNlIC8qIENLX0tFUkJFUk9TICovCisjaWZkZWYgS1JCNAorI3VuZGVmIEtSQjQKKyNlbmRpZiAvKiBLUkI0ICovCisjaWZkZWYgS1JCNQorI3VuZGVmIEtSQjUKKyNlbmRpZiAvKiBLUkI1ICovCisjaWZkZWYgS1JCNTI0CisjdW5kZWYgS1JCNTI0CisjZW5kaWYgLyogS1JCNTI0ICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZm5kZWYgbWFsbG9jCisjaWZuZGVmIFZNUworI2lmbmRlZiBGUkVFQlNENAorI2lmbmRlZiBPcGVuQlNECisjaW5jbHVkZSA8bWFsbG9jLmg+CisjZW5kaWYgLyogT3BlbkJTRCAqLworI2VuZGlmIC8qIEZSRUVCU0Q0ICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogbWFsbG9jICovCisjaWZkZWYgT1MyCisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIEtSQjUKKyNpZmRlZiBIRUlNREFMCisjaWZkZWYgcHJpbnRmCisjZGVmaW5lIHNhdmVwcmludGYgcHJpbnRmCisjdW5kZWYgcHJpbnRmCisjZW5kaWYgLyogcHJpbnRmICovCisjaW5jbHVkZSAia3JiNS5oIgorI2luY2x1ZGUgImNvbV9lcnIuaCIKKyNpZmRlZiBzYXZlcHJpbnRmCisjZGVmaW5lIHByaW50ZiBzYXZlcHJpbnRmCisjZW5kaWYgLyogc2F2ZXByaW50ZiAqLworI2Vsc2UgLyogSEVJTURBTCAqLworI2luY2x1ZGUgImtyYjUuaCIKKyNpbmNsdWRlICJwcm9maWxlLmgiCisjaW5jbHVkZSAiY29tX2Vyci5oIgorI2lmZGVmIEtSQjVfR0VUX0lOSVRfQ1JFRFNfT1BUX1RLVF9MSUZFCisjZGVmaW5lIEtSQjVfSEFWRV9HRVRfSU5JVF9DUkVEUworI2Vsc2UKKyNkZWZpbmUga3JiNV9mcmVlX3VucGFyc2VkX25hbWUoY29uLHZhbCkga3JiNV94ZnJlZSgoY2hhciAqKSh2YWwpKQorI2VuZGlmCisjaWZuZGVmIEtSQjVfSEFWRV9HRVRfSU5JVF9DUkVEUworI2RlZmluZSBrcmI1X2ZyZWVfZGF0YV9jb250ZW50cyhjLHYpIGtyYjVfeGZyZWUoKGNoYXIgKikodiktPmRhdGEpCisjZW5kaWYKKyNlbmRpZiAvKiBIRUlNREFMICovCisjaWZkZWYgSEFWRV9QV0RfSAorI2luY2x1ZGUgPHB3ZC5oPgorI2VuZGlmCisjZW5kaWYgLyogS1JCNSAqLworCisjaWZkZWYgS1JCNAorI2RlZmluZSAgZGVzX2NibG9jayBCbG9jaworI2RlZmluZSAgY29uc3RfZGVzX2NibG9jayBjb25zdCBCbG9jaworI2RlZmluZSAgZGVzX2tleV9zY2hlZHVsZSBTY2hlZHVsZQorI2lmZGVmIEtSQjUyNAorI2lmZGVmIE5UCisjZGVmaW5lIF9XSU5ET1dTCisjZW5kaWYgLyogTlQgKi8KKyNpbmNsdWRlICJrZXJiZXJvc0lWL2tyYi5oIgorI2lmbmRlZiBPUzIKKyNpZmRlZiBLUkI1MjRfQ09OVgorI2luY2x1ZGUgImtyYjUyNC5oIgorI2VuZGlmIC8qIEtSQjUyNF9DT05WICovCitfUFJPVE9UWVAoY29uc3QgY2hhciAqIGtyYl9nZXRfZXJyX3RleHRfZW50cnksIChpbnQpKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbHNlIC8qIEtSQjUyNCAqLworI2lmZGVmIFNPTEFSSVMKKyNpZm5kZWYgc3VuCisvKiBmb3Igc29tZSByZWFzb24gdGhlIE1ha2VmaWxlIGVudHJpZXMgZm9yIHRoZSBTb2xhcmlzIHN5c3RlbXMgaGF2ZSAtVXN1biAqLworI2RlZmluZSBzdW4KKyNlbmRpZiAvKiBzdW4gKi8KKyNlbmRpZiAvKiBTT0xBUklTICovCisjaW5jbHVkZSAia3JiLmgiCisjZGVmaW5lIGtyYl9nZXRfZXJyX3RleHRfZW50cnkga3JiX2dldF9lcnJfdGV4dAorI2VuZGlmIC8qIEtSQjUyNCAqLworI2Vsc2UgLyogS1JCNCAqLworI2lmZGVmIENLX1NTTAorI2RlZmluZSAgZGVzX2NibG9jayBCbG9jaworI2lmZGVmIENPTU1FTlQKKyNkZWZpbmUgIGNvbnN0X2Rlc19jYmxvY2sgY29uc3QgQmxvY2sKKyNlbmRpZiAvKiBDT01NRU5UICovCisjZGVmaW5lICBkZXNfa2V5X3NjaGVkdWxlIFNjaGVkdWxlCisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogS1JCNCAqLworCisjaW5jbHVkZSAiY2t1YXRoLmgiCisjaWZkZWYgQ0tfS0VSQkVST1MKKyNpZm5kZWYgS1JCNQorI2RlZmluZSBOT0JMT0NLREVGCisjZWxzZSAvKiBLUkI1ICovCisjaWZkZWYgS1JCNTI0CisjZGVmaW5lIE5PQkxPQ0tERUYKKyNlbmRpZiAvKiBLUkI1MjQgKi8KKyNlbmRpZiAvKiBLUkI1ICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyNpbmNsdWRlICJja3VhdDIuaCIKKworI2lmZGVmIENLX1NTTAorI2lmZGVmIExJQkRFUworI2lmZGVmIE9QRU5TU0xfMDk3CisjZGVmaW5lIE9QRU5TU0xfRU5BQkxFX09MRF9ERVNfU1VQUE9SVAorI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisjZW5kaWYgLyogT1BFTlNTTF8wOTcgKi8KKyNpZm5kZWYgSEVBREVSX0RFU19ICisjZGVmaW5lIEhFQURFUl9ERVNfSAorI2VuZGlmIC8qIEhFQURFUl9ERVNfSCAqLworI2VuZGlmIC8qIExJQkRFUyAqLworI2luY2x1ZGUgImNrX3NzbC5oIgorZXh0ZXJuIGludCBzc2xfZmluaXNoZWRfbWVzc2FnZXM7CisjZW5kaWYgLyogU1NMICovCisKKyNkZWZpbmUgUFdEX1NaIDEyOAorCisjaWZuZGVmIExJQkRFUworI2lmZGVmIFVOSVgKKyNkZWZpbmUgZGVzX3NldF9yYW5kb21fZ2VuZXJhdG9yX3NlZWQoeCkgZGVzX2luaXRfcmFuZG9tX251bWJlcl9nZW5lcmF0b3IoeCkKKyNlbmRpZiAvKiBVTklYICovCisjZWxzZSAvKiBMSUJERVMgKi8KKyNkZWZpbmUgZGVzX2ZpeHVwX2tleV9wYXJpdHkgZGVzX3NldF9vZGRfcGFyaXR5CisjZW5kaWYgLyogTElCREVTICovCisKKyNpZmRlZiBPUzIKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisjZGVmaW5lIE1BUF9ERVMKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjaWZkZWYgS1JCNAorI2RlZmluZSBNQVBfS1JCNAorI2VuZGlmIC8qIEtSQjQgKi8KKyNpZmRlZiBTUlBETEwKKyNkZWZpbmUgTUFQX1NSUAorI2VuZGlmIC8qIFNSUERMTCAqLworI2lmZGVmIEtSQjUKKyNkZWZpbmUgTUFQX0tSQjUKKyNlbmRpZiAvKiBLUkI1ICovCisjaWZkZWYgQ1JZUFRfRExMCisjZGVmaW5lIE1BUF9DUllQVAorI2VuZGlmIC8qIENSWVBUX0RMTCAqLworI2RlZmluZSBNQVBfTlRMTQorI2luY2x1ZGUgImNrb2F0aC5oIgorI2luY2x1ZGUgImNrb3N5bi5oIgorI2VuZGlmIC8qIE9TMiAqLworCisvKgorICogR2xvYmFscworICovCitpbnQgYXV0aF90eXBlX3VzZXJbQVVUSFRZUExTVFNaXSA9IHtBVVRIVFlQRV9BVVRPLCBBVVRIVFlQRV9OVUxMfTsKK2ludCBhdXRoX2hvdz0wOworaW50IGF1dGhfY3J5cHQ9MDsKK2ludCBhdXRoX2Z3ZD0wOworCisvKiBUaGVzZSBhcmUgc3RhdGUgY29tcGxldGlvbiB2YXJpYWJsZXMgKi8KK3N0YXRpYyBpbnQgbXV0dWFsX2NvbXBsZXRlID0gMDsKKworI2lmZGVmIEtSQjQKKyNpZmRlZiBPUzIKK3N0YXRpYyBMRUFTSF9DUkVERU5USUFMUyBjcmVkOworI2Vsc2UgLyogT1MyICovCitzdGF0aWMgQ1JFREVOVElBTFMgY3JlZDsKKyNlbmRpZiAvKiBPUzIgKi8KK3N0YXRpYyBLVEVYVF9TVCBrNF9hdXRoOworc3RhdGljIGNoYXIgICAgIGs0X25hbWVbQU5BTUVfU1pdOworc3RhdGljIEFVVEhfREFUIGs0X2FkYXQgID0geyAwIH07CitzdGF0aWMgTVNHX0RBVCAgazRfbXNnX2RhdGE7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorc3RhdGljIEJsb2NrICAgIGs0X3Nlc3Npb25fa2V5ICAgICA9IHsgMCB9Oworc3RhdGljIFNjaGVkdWxlIGs0X3NjaGVkOworc3RhdGljIEJsb2NrICAgIGs0X2NoYWxsZW5nZSAgICAgICA9IHsgMCB9OworI2lmZGVmIE1JVF9DVVJSRU5UCitzdGF0aWMga3JiNV9rZXlibG9jayBrNF9rcmJrZXk7CisjZW5kaWYgLyogTUlUX0NVUlJFTlQgKi8KKyNlbmRpZiAvKiBFTkNSWVBUSU9OICovCisjZGVmaW5lIEtSQjRfU0VSVklDRV9OQU1FICAgICJyY21kIgorCitfUFJPVE9UWVAoc3RhdGljIGludCBrNF9hdXRoX3NlbmQsKFZPSUQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IGs0X2F1dGhfcmVwbHksKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CitfUFJPVE9UWVAoc3RhdGljIGludCBrNF9hdXRoX2lzLCh1bnNpZ25lZCBjaGFyICosIGludCkpOworI2VuZGlmIC8qIEtSQjQgKi8KKworI2lmZGVmIEtSQjUKK3N0YXRpYyBrcmI1X2RhdGEgICAgICAgICAgazVfYXV0aDsKK3N0YXRpYyBrcmI1X2F1dGhfY29udGV4dCAgYXV0aF9jb250ZXh0Oworc3RhdGljIGtyYjVfa2V5YmxvY2sgICAgICprNV9zZXNzaW9uX2tleSA9IE5VTEw7CitzdGF0aWMga3JiNV90aWNrZXQgICAgICAgKms1X3RpY2tldCA9IE5VTEw7CisjaWZuZGVmIEtSQjVfU0VSVklDRV9OQU1FCisjZGVmaW5lIEtSQjVfU0VSVklDRV9OQU1FICAgICJob3N0IgorI2VuZGlmCisKK19QUk9UT1RZUChzdGF0aWMgaW50IGs1X2F1dGhfc2VuZCwoaW50LGludCxpbnQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IGs1X2F1dGhfcmVwbHksKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IGs1X2F1dGhfaXMsKGludCx1bnNpZ25lZCBjaGFyICosIGludCkpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgU2VuZEs1QXV0aFNCLChpbnQsIHZvaWQgKiwgaW50KSk7CisjaWZkZWYgVExTX1ZFUklGWQorc3RhdGljIGludCBrcmI1X3Rsc192ZXJpZmllZCA9IDA7CisjZW5kaWYgLyogVExTX1ZFUklGWSAqLworI2VuZGlmIC8qIEtSQjUgKi8KKworI2lmZGVmIEdTU0FQSV9LUkI1CisjaW5jbHVkZSA8Z3NzYXBpL2dzc2FwaS5oPgorI2luY2x1ZGUgPGdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGdzc2FwaS9nc3NhcGlfa3JiNS5oPgorCitzdGF0aWMgZ3NzX2N0eF9pZF90IGdjb250ZXh0OworI2RlZmluZSBHU1NfQlVGU0laIDQwOTYKK3N0YXRpYyBnc3NfYnVmZmVyX2Rlc2MgZ3NzX3NlbmRfdG9rLCBnc3NfcmVjdl90b2ssICpnc3NfdG9rZW5fcHRyOworc3RhdGljIGNoYXIgZ3NzX3N0YnVmW0dTU19CVUZTSVpdOworc3RhdGljIGdzc19uYW1lX3QgZ3NzX3RhcmdldF9uYW1lOworc3RhdGljIHN0cnVjdCBnc3NfY2hhbm5lbF9iaW5kaW5nc19zdHJ1Y3QgZ3NzX2NoYW47CisKK19QUk9UT1RZUChzdGF0aWMgaW50IGdzc2s1X2F1dGhfc2VuZCwoaW50LGludCxpbnQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IGdzc2s1X2F1dGhfcmVwbHksKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IGdzc2s1X2F1dGhfaXMsKGludCx1bnNpZ25lZCBjaGFyICosIGludCkpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgU2VuZEdTU0s1QXV0aFNCLChpbnQsIHZvaWQgKiwgaW50KSk7CisjZW5kaWYgLyogR1NTQVBJX0tSQjUgKi8KKworI2lmZGVmIENLX1NSUAorI2lmZGVmIFBSRV9TUlBfMV83XzMKK19QUk9UT1RZUChzdGF0aWMgaW50IHNycF9yZXBseSwoaW50LCB1bnNpZ25lZCBjaGFyICosIGludCkpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgc3JwX2lzLChpbnQsIHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CisjZWxzZSAvKiBQUkVfU1JQXzFfN18zICovCitfUFJPVE9UWVAoc3RhdGljIGludCBuZXdfc3JwX3JlcGx5LChpbnQsIHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CitfUFJPVE9UWVAoc3RhdGljIGludCBuZXdfc3JwX2lzLChpbnQsIHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CisjZW5kaWYgLyogUFJFX1NSUF8xXzdfMyAqLworI2VuZGlmIC8qIFNSUCAqLworCisjaWZkZWYgQ0tfRU5DUllQVElPTgoraW50IGVuY3J5cHRfZmxhZyA9IDE7CisjZW5kaWYKKyNpZmRlZiBGT1JXQVJECitpbnQgZm9yd2FyZF9mbGFnID0gMDsgICAgICAgICAgICAgIC8qIGZvcndhcmQgdGlja2V0cz8gKi8KK2ludCBmb3J3YXJkYWJsZV9mbGFnID0gMTsgICAgICAgICAgLyogZ2V0IGZvcndhcmRhYmxlIHRpY2tldHMgdG8gZm9yd2FyZD8gKi8KK2ludCBmb3J3YXJkZWRfdGlja2V0cyA9IDA7ICAgICAgICAgLyogd2VyZSB0aWNrZXRzIGZvcndhcmRlZD8gKi8KKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBzdHJfZGF0YVs0MDk2XSA9IHsgSUFDLCBTQiwgVEVMT1BUX0FVVEhFTlRJQ0FUSU9OLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhUWVBFX0tFUkJFUk9TX1Y1LCB9OworI2RlZmluZSBBVVRIVE1QQkwgMjA0OAorc3RhdGljIGNoYXIgc3RyVG1wW0FVVEhUTVBCTCsxXTsKK3N0YXRpYyBjaGFyIHN6TG9jYWxIb3N0TmFtZVtVSURCVUZMRU4rMV07CitzdGF0aWMga3N0cmVhbSBnX2tzdHJlYW09TlVMTDsKKworI2lmZGVmIEtSQjUKK2tyYjVfY29udGV4dCBrNV9jb250ZXh0PU5VTEw7CitzdGF0aWMga3JiNV9jcmVkcyAqIHJldF9jcmVkPU5VTEw7CitzdGF0aWMga3JiNV9jb250ZXh0IHRlbG5ldF9jb250ZXh0PU5VTEw7CitzdGF0aWMgY2hhciAqIHRlbG5ldF9rcmI1X3JlYWxtID0gTlVMTDsKK3N0YXRpYyBrcmI1X3ByaW5jaXBhbCBmd2Rfc2VydmVyID0gTlVMTDsKKyNlbmRpZiAvKiBLUkI1ICovCisKKyNpZmRlZiBDS19TUlAKKyNpZmRlZiBQUkVfU1JQXzFfNF80CisjaWZuZGVmIFBSRV9TUlBfMV80XzUKKyNkZWZpbmUgUFJFX1NSUF8xXzRfNQorI2VuZGlmIC8qIFBSRV9TUlBfMV80XzUgKi8KKyNlbmRpZiAvKiBQUkVfU1JQXzFfNF81ICovCisjaWZkZWYgUFJFX1NSUF8xXzRfNQorI2lmbmRlZiBQUkVfU1JQXzFfN18zCisjZGVmaW5lIFBSRV9TUlBfMV83XzMKKyNlbmRpZiAvKiBQUkVfU1JQXzFfN18zICovCisjZW5kaWYgLyogUFJFX1NSUF8xXzRfNSAqLworI2luY2x1ZGUgPHRfcHdkLmg+CisjaW5jbHVkZSA8dF9jbGllbnQuaD4KKyNpbmNsdWRlIDx0X3NlcnZlci5oPgorc3RhdGljIHN0cnVjdCB0X3NlcnZlciAqIHRzID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgdF9jbGllbnQgKiB0YyA9IE5VTEw7CisjaWZkZWYgUFJFX1NSUF8xXzRfNAorc3RhdGljIHN0cnVjdCB0X3B3ICogdHB3ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgdF9jb25mICogdGNvbmYgPSBOVUxMOworI2VuZGlmIC8qIFBSRV9TUlBfMV80XzQgKi8KKyNpZm5kZWYgUFJFX1NSUF8xXzdfMworI2lmbmRlZiBTVERDX0hFQURFUlMKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKKyNlbmRpZiAvKiBTVERDX0hFQURFUlMgKi8KKyNpbmNsdWRlIDxzcnAuaD4KK3N0YXRpYyBTUlAgKiBzX3NycCA9IE5VTEw7CitzdGF0aWMgY3N0ciAqIHNfa2V5ID0gTlVMTDsKK3N0YXRpYyBTUlAgKiBjX3NycCA9IE5VTEw7CitzdGF0aWMgY3N0ciAqIGNfa2V5ID0gTlVMTDsKKyNlbmRpZiAvKiBQUkVfU1JQXzFfN18zICovCitzdGF0aWMgaW50IHNycF93YWl0cmVzcCA9IDA7ICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgcmVhZGluZXNzIGZvciByZXNwb25zZSAqLworc3RhdGljIGNoYXIgc3JwX3Bhc3N3ZFtQV0RfU1pdOworI2VuZGlmIC8qIENLX1NSUCAqLworCisjaWZkZWYgQ0tfS0VSQkVST1MKKyNpZmRlZiBSTE9HQ09ERQorI2RlZmluZSBPUFRTX0ZPUldBUkRfQ1JFRFMgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgT1BUU19GT1JXQVJEQUJMRV9DUkVEUyAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEtDTURfS0VZVVNBR0UgICAgICAgICAgICAgICAgMTAyNgorCisjZGVmaW5lIFJMT0dfQlVGU0laIDUxMjAKK3N0YXRpYyBpbnQgcmxvZ19lbmNyeXB0ID0gMDsKK2NoYXIgZGVzX2luYnVmWzIqUkxPR19CVUZTSVpdOyAgICAgICAvKiBuZWVkcyB0byBiZSA+IGxhcmdlc3QgcmVhZCBzaXplICovCitjaGFyIGRlc19vdXRwa3RbMipSTE9HX0JVRlNJWis0XTsgICAgLyogbmVlZHMgdG8gYmUgPiBsYXJnZXN0IHdyaXRlIHNpemUgKi8KKyNpZmRlZiBLUkI1CitrcmI1X2RhdGEgZGVzaW5idWYsZGVzb3V0YnVmOwora3JiNV9lbmNyeXB0X2Jsb2NrIGVibG9jazsgICAgICAgICAgICAgLyogZWJsb2NrIGZvciBlbmNyeXB0L2RlY3J5cHQgKi8KK3N0YXRpYyBrcmI1X2RhdGEgZW5jaXZlY19pWzJdLCBlbmNpdmVjX29bMl07CisKK2VudW0ga3JiNV9rY21kX3Byb3RvIHsKKyAgLyogT2xkIHByb3RvY29sOiBERVMgZW5jcnlwdGlvbiBvbmx5LiAgTm8gc3Via2V5cy4gIE5vIHByb3RlY3Rpb24KKyAgICAgZm9yIGNsZWFydGV4dCBsZW5ndGguICBObyBpdmVjIHN1cHBsaWVkLiAgT09CIGhhY2tzIHVzZWQgZm9yCisgICAgIHJsb2dpbi4gIENoZWNrc3VtIG1heSBiZSBvbWl0dGVkIGF0IGNvbm5lY3Rpb24gc3RhcnR1cC4gICovCisgIEtDTURfT0xEX1BST1RPQ09MID0gMSwKKyAgLyogTmV3IHByb3RvY29sOiBBbnkgZW5jcnlwdGlvbiBzY2hlbWUuICBDbGllbnQtZ2VuZXJhdGVkIHN1YmtleQorICAgICByZXF1aXJlZC4gIFByZXBlbmQgY2xlYXJ0ZXh0LWxlbmd0aCB0byBjbGVhcnRleHQgZGF0YSAoYnV0IGRvbid0CisgICAgIGluY2x1ZGUgaXQgaW4gY291bnQpLiAgU3RhcnRpbmcgaXZlYyBkZWZpbmVkLCBjaGFpbmVkLiAgSW4tYmFuZAorICAgICBzaWduYWxsaW5nLiAgQ2hlY2tzdW0gcmVxdWlyZWQuICAqLworICBLQ01EX05FV19QUk9UT0NPTCwKKyAgLyogSGFjazogR2V0IGNyZWRlbnRpYWxzLCBhbmQgdXNlIHRoZSBvbGQgcHJvdG9jb2wgaWZmIHRoZSBzZXNzaW9uCisgICAgIGtleSB0eXBlIGlzIHNpbmdsZS1ERVMuICAqLworICBLQ01EX1BST1RPQ09MX0NPTVBBVF9IQUNLLAorICBLQ01EX1VOS05PV05fUFJPVE9DT0wKK307CitlbnVtIGtyYjVfa2NtZF9wcm90byBrcmI1X3Jsb2dfdmVyID0gS0NNRF9QUk9UT0NPTF9DT01QQVRfSEFDSzsKKyNlbmRpZiAvKiBLUkI1ICovCisjZW5kaWYgLyogUkxPR0NPREUgKi8KK3N0YXRpYyBjaGFyIHN0b3JhZ2VbNjU1MzZdOyAgICAgICAgICAgIC8qIHN0b3JhZ2UgZm9yIHRoZSBkZWNyeXB0aW9uICovCitzdGF0aWMgaW50IG5zdG9yZWQgPSAwOworc3RhdGljIGNoYXIgKnN0b3JlX3B0ciA9IHN0b3JhZ2U7CisKK2V4dGVybiBjaGFyICoga3JiNV9kX3ByaW5jaXBhbDsgICAgICAgICAvKiBEZWZhdWx0IHByaW5jaXBhbCAqLworZXh0ZXJuIGNoYXIgKiBrcmI1X2RfaW5zdGFuY2U7ICAgICAgICAgIC8qIERlZmF1bHQgaW5zdGFuY2UgKi8KK2V4dGVybiBjaGFyICoga3JiNV9kX3JlYWxtOyAgICAgICAgICAgICAvKiBEZWZhdWx0IHJlYWxtICovCitleHRlcm4gY2hhciAqIGtyYjVfZF9jYzsgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBjcmVkZW50aWFscyBjYWNoZSAqLworZXh0ZXJuIGNoYXIgKiBrcmI1X2Rfc3J2OyAgICAgICAgICAgICAgIC8qIERlZmF1bHQgc2VydmljZSBuYW1lICovCitleHRlcm4gaW50ICAgIGtyYjVfZF9saWZldGltZTsgICAgICAgICAgLyogRGVmYXVsdCBsaWZldGltZSAqLworZXh0ZXJuIGludCAgICBrcmI1X2RfZm9yd2FyZGFibGU7CitleHRlcm4gaW50ICAgIGtyYjVfZF9wcm94aWFibGU7CitleHRlcm4gaW50ICAgIGtyYjVfZF9yZW5ld2FibGU7CitleHRlcm4gaW50ICAgIGtyYjVfYXV0b2dldDsKK2V4dGVybiBpbnQgICAga3JiNV9jaGVja2FkZHJzOworZXh0ZXJuIGludCAgICBrcmI1X2RfZ2V0azQ7CitleHRlcm4gaW50ICAgIGtyYjVfZF9ub19hZGRyZXNzZXM7CitleHRlcm4gY2hhciAqIGs1X2tleXRhYjsKKworZXh0ZXJuIGludCAgICBrcmI1X2Vycm5vOworZXh0ZXJuIGNoYXIgKiBrcmI1X2Vycm1zZzsKKworZXh0ZXJuIGNoYXIgKiBrcmI0X2RfcHJpbmNpcGFsOyAgICAgICAgIC8qIERlZmF1bHQgcHJpbmNpcGFsICovCitleHRlcm4gY2hhciAqIGtyYjRfZF9yZWFsbTsgICAgICAgICAgICAgLyogRGVmYXVsdCByZWFsbSAqLworZXh0ZXJuIGNoYXIgKiBrcmI0X2Rfc3J2OyAgICAgICAgICAgICAgIC8qIERlZmF1bHQgc2VydmljZSBuYW1lICovCitleHRlcm4gaW50ICAgIGtyYjRfZF9saWZldGltZTsgICAgICAgICAgLyogRGVmYXVsdCBsaWZldGltZSAqLworZXh0ZXJuIGludCAgICBrcmI0X2RfcHJlYXV0aDsKK2V4dGVybiBjaGFyICoga3JiNF9kX2luc3RhbmNlOworZXh0ZXJuIGludCAgICBrcmI0X2F1dG9nZXQ7CitleHRlcm4gaW50ICAgIGtyYjRfY2hlY2thZGRyczsKK2V4dGVybiBjaGFyICogazRfa2V5dGFiOworCitleHRlcm4gaW50ICAgIGtyYjRfZXJybm87CitleHRlcm4gY2hhciAqIGtyYjRfZXJybXNnOworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKK2V4dGVybiBjaGFyIHRuX21zZ1tdLCBoZXhidWZbXTsgICAgICAgICAvKiBmcm9tIGNrY25ldC5jICovCitleHRlcm4gQ0hBUiBwd2J1ZltdOworZXh0ZXJuIGludCAgcHdmbGcsIHB3Y3J5cHQ7CitleHRlcm4gaW50IGRlYmxvZywgZGVic2VzLCB0bl9kZWI7CitleHRlcm4gaW50IHNzdGVsbmV0LCBpbnNlcnZlcjsKKyNpZmRlZiBDS19MT0dJTgorZXh0ZXJuIGludCBja3hhbm9uOworI2VuZGlmIC8qIENLX0xPR0lOICovCitleHRlcm4gaW50IHRuX2F1dGhfaG93OworZXh0ZXJuIGludCB0bl9hdXRoX2VuYzsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCitleHRlcm4gaW50IGN4X3R5cGU7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworZXh0ZXJuIGludCBxdWlldCwgdHR5ZmQsIHR0bnByb3RvOworCitpbnQKK2NrX2dzc2FwaV9pc19pbnN0YWxsZWQoKQoreworI2lmZGVmIEtSQjUKKyNpZmRlZiBPUzIKKyAgICByZXR1cm4oaEdTU0FQSSAhPSBOVUxMKTsKKyNlbHNlIC8qIE9TMiAqLworICAgIHJldHVybigxKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbHNlIC8qIEtSQjUgKi8KKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogS1JCNSAqLworfQorCitpbnQKK2NrX2tyYjVfaXNfaW5zdGFsbGVkKCkKK3sKKyNpZmRlZiBLUkI1CisjaWZkZWYgT1MyCisgICAgcmV0dXJuKGhLUkI1XzMyICE9IE5VTEwpOworI2Vsc2UgLyogT1MyICovCisgICAgcmV0dXJuKDEpOworI2VuZGlmIC8qIE9TMiAqLworI2Vsc2UgLyogS1JCNSAqLworICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBLUkI1ICovCit9CisKKworaW50Citja19rcmI1X2lzX2luc3RhbGxlZF9hc19zZXJ2ZXIoKQoreworI2lmZGVmIEtSQjUKKyNpZmRlZiBIRUlNREFMCisgICAga3JiNV9lcnJvcl9jb2RlIHJldDsKKyAgICBrcmI1X2tleXRhYiBrdDsKKyAgICBrcmI1X2t0X2N1cnNvciBjdXJzb3I7CisKKyAgICByZXQgPSBrcmI1X2t0X2RlZmF1bHQoazVfY29udGV4dCwgJmt0KTsKKyAgICBpZiAoIHJldCApIHsKKyAgICAgICAga3JiNV9rdF9jbG9zZShrNV9jb250ZXh0LCBrdCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBrcmI1X2t0X2VuZF9zZXFfZ2V0KGs1X2NvbnRleHQsIGt0LCAmY3Vyc29yKTsKKyAgICAgICAga3JiNV9rdF9jbG9zZShrNV9jb250ZXh0LCBrdCk7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisjZWxzZSAvKiBIRUlNREFMICovCisjaWZuZGVmIENPTU1FTlQKKyAgICBjaGFyIGt0bmFtZVtDS01BWFBBVEhdPSIiOworCisgICAgaWYgKCBrNV9rZXl0YWIgKSB7CisgICAgICAgIGNrc3RybmNweShrdG5hbWUsazVfa2V5dGFiLENLTUFYUEFUSCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAga3JiNV9lcnJvcl9jb2RlIGNvZGU7CisKKyAgICAgICAgaWYgKCBrNV9jb250ZXh0ID09IE5VTEwpCisgICAgICAgICAgICBpZiAoa3JiNV9pbml0X2NvbnRleHQoJms1X2NvbnRleHQpKQorICAgICAgICAgICAgICAgIHJldHVybigwKTsKKworICAgICAgICBjb2RlID0ga3JiNV9rdF9kZWZhdWx0X25hbWUoazVfY29udGV4dCxrdG5hbWUsQ0tNQVhQQVRIKTsKKyAgICAgICAgZGVidWcoRjEwMSwia3JiNV9rdF9kZWZhdWx0X25hbWUiLCIiLGNvZGUpOworICAgICAgICBpZiAoIGNvZGUgKSB7CisgICAgICAgICAgICAvKiBXZSBjYW4ndCBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIHRoZSBmaWxlIHNpbmNlIHdlIGNhbid0ICAgKi8KKyAgICAgICAgICAgIC8qIGRldGVybWluZSB0aGUgZmlsZSBuYW1lLiAgU28gd2UgcmV0dXJuIFRSVUUgYW5kIGxldCAgICAgICAqLworICAgICAgICAgICAgLyogS3JiNSBiZSBvZmZlcmVkIHRvIHRoZSB1c2VyIGV2ZW4gdGhvdWdoIGl0IG1heSBmYWlsIGxhdGVyICovCisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoICFzdHJuY21wKCJGSUxFOiIsa3RuYW1lLDUpICkgeworICAgICAgICBpZiAoIHpjaGtpKCZrdG5hbWVbNV0pID4gMCApCisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoa3RuYW1lWzBdKQorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2Vsc2UgLyogQ09NTUVOVCAqLworICAgIGtyYjVfZXJyb3JfY29kZSAgICAgICAgICAgICBrcmI1cmMgPSBLUkI1S1JCX0VSUl9HRU5FUklDOworICAgIGtyYjVfY29udGV4dCAgICAgICAgICAgICAgICBrcmI1Y29udGV4dCA9IE5VTEw7CisgICAga3JiNV9jY2FjaGUgICAgICAgICAgICAgICAgIGtyYjVjY2RlZiA9IE5VTEw7CisgICAga3JiNV9jcmVkcyAgICAgICAgICAgICAgICAgIGtyYjVjcmVkcywgKmtyYjVjcmVkc3AgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICByYyA9IDA7CisKKyAgICBpZiAoICFja19rcmI1X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgbWVtc2V0KChjaGFyICopJmtyYjVjcmVkcywgMCwgc2l6ZW9mKGtyYjVjcmVkcykpOworCisgICAgaWYgKChrcmI1cmMgPSBrcmI1X2luaXRfY29udGV4dCgma3JiNWNvbnRleHQpKSAhPSAwKQorICAgICAgICBnb3RvIGVycjsKKworICAgIGlmICgoa3JiNXJjID0ga3JiNV9zbmFtZV90b19wcmluY2lwYWwoa3JiNWNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekhvc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9kX3NydiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2Rfc3J2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtSQjVfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1JCNV9OVF9TUlZfSFNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtyYjVjcmVkcy5zZXJ2ZXIpKSAhPSAwKQorICAgICAgZ290byBlcnI7CisKKyAgICBpZiAoKGtyYjVyYyA9IGtyYjVfY2NfZGVmYXVsdChrcmI1Y29udGV4dCwgJmtyYjVjY2RlZikpICE9IDApCisgICAgICAgIGdvdG8gZXJyOworCisgICAgaWYgKChrcmI1cmMgPSBrcmI1X2NjX2dldF9wcmluY2lwYWwoa3JiNWNvbnRleHQsIGtyYjVjY2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtyYjVjcmVkcy5jbGllbnQpKSAhPSAwKQorICAgICAgICBnb3RvIGVycjsKKworICAgIGlmICgoa3JiNXJjID0ga3JiNV9nZXRfY3JlZGVudGlhbHMoa3JiNWNvbnRleHQsIDAsIGtyYjVjY2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma3JiNWNyZWRzLCAma3JiNWNyZWRzcCkpICE9IDApCisgICAgICAgIGdvdG8gZXJyOworICAgIHJjID0gMTsKKworICBlcnI6CisKKyAgICBpZiAoa3JiNWNyZWRzLmNsaWVudCkKKyAgICAgIGtyYjVfZnJlZV9wcmluY2lwYWwoa3JiNWNvbnRleHQsIGtyYjVjcmVkcy5jbGllbnQpOworICAgIGlmIChrcmI1Y3JlZHMuc2VydmVyKQorICAgICAga3JiNV9mcmVlX3ByaW5jaXBhbChrcmI1Y29udGV4dCwga3JiNWNyZWRzLnNlcnZlcik7CisgICAgaWYgKGtyYjVjb250ZXh0KQorICAgICAga3JiNV9mcmVlX2NvbnRleHQoa3JiNWNvbnRleHQpOworICAgIHJldHVybihyYyk7CisKKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogSEVJTURBTCAqLworI2Vsc2UgLyogS1JCNSAqLworICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBLUkI1ICovCit9CisKK2ludAorY2tfa3JiNF9pc19pbnN0YWxsZWQoKQoreworI2lmZGVmIEtSQjQKKyNpZmRlZiBPUzIKKyAgICByZXR1cm4oaEtSQjRfMzIgIT0gTlVMTCk7CisjZWxzZSAvKiBPUzIgKi8KKyAgICByZXR1cm4oMSk7CisjZW5kaWYgLyogT1MyICovCisjZWxzZSAvKiBLUkI0ICovCisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIEtSQjQgKi8KK30KKworaW50Citja19rcmI0X2lzX2luc3RhbGxlZF9hc19zZXJ2ZXIoKQoreworICAgIGlmICggIWNrX2tyYjRfaXNfaW5zdGFsbGVkKCkgKQorICAgICAgICByZXR1cm4oMCk7CisKKyNpZmRlZiBLUkI0CisgICAgaWYgKCAhazRfa2V5dGFiICkgeworI2lmZGVmIE5UCisgICAgICAgIGNoYXIgbmFtZVtDS01BWFBBVEhdPSIiOworICAgICAgICBEV09SRCBsZW4gPSBDS01BWFBBVEg7CisKKyAgICAgICAgbGVuID0gR2V0V2luZG93c0RpcmVjdG9yeShuYW1lLGxlbik7CisgICAgICAgIGlmICggbGVuID4gMCApCisgICAgICAgICAgICBja3N0cm5jYXQobmFtZSwiL3NydnRhYiIsQ0tNQVhQQVRIKTsKKyAgICAgICAgaWYgKCBuYW1lWzBdICkKKyAgICAgICAgICAgIG1ha2VzdHIoJms0X2tleXRhYixuYW1lKTsKKyNlbHNlIC8qIE5UICovCisgICAgICAgIG1ha2VzdHIoJms0X2tleXRhYiwiL2V0Yy9zcnZ0YWIiKTsKKyNlbmRpZiAvKiBOVCAqLworICAgIH0KKworICAgIGlmICggIWs0X2tleXRhYiApCisgICAgICAgIHJldHVybigwKTsKKworICAgIGlmICggemNoa2koazRfa2V5dGFiKSA+IDAgKQorICAgICAgICByZXR1cm4oMSk7CisjaWZkZWYgS1JCNTI0CisgICAgZWxzZSBpZiAoY2tfa3JiNV9pc19pbnN0YWxsZWRfYXNfc2VydmVyKCkpCisgICAgICAgIHJldHVybigxKTsKKyNlbmRpZiAvKiBLUkI1MjQgKi8KKyAgICBlbHNlCisgICAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBLUkI0ICovCit9CisKK2ludAorY2tfc3JwX2lzX2luc3RhbGxlZF9hc19zZXJ2ZXIoKQoreworI2lmZGVmIENLX1NSUAorI2lmZGVmIFNSUERMTAorICAgIGlmICggaFNSUCA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIFNSUERMTCAqLworI2lmZGVmIENPTU1FTlQKKyAgICAvKiBUaGlzIGlzIHRoZSBuZXcgQVBJIGFzIG9mIDEuNy40LiAgSG93ZXZlciwgYWxsIGl0IGRvZXMKKyAgICAgICBpcyBhbGxvY2F0ZSBhIGRhdGEgc3RydWN0dXJlLiAgSXQgY2FuIG5ldmVyIGZhaWwuCisgICAgICovCisgICAgeworICAgICAgICBTUlAgKiBzX3NycCA9IFNSUF9uZXcoU1JQX1JGQzI5NDVfc2VydmVyX21ldGhvZCgpKTsKKyAgICAgICAgaWYgKCBzX3NycCApIHsKKyAgICAgICAgICAgIFNSUF9mcmVlKHNfc3JwKTsKKyAgICAgICAgICAgIHNfc3JwID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2Vsc2UgLyogQ09NTUVOVCAqLworICAgIHsKKyAgICAgICAgc3RydWN0IHRfcHcgKiB0cHcgPSBOVUxMOworICAgICAgICBzdHJ1Y3QgdF9jb25mICogdGNvbmYgPSBOVUxMOworICAgICAgICBpZigodGNvbmYgPSB0X29wZW5jb25mKE5VTEwpKSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICBpZigodHB3ID0gdF9vcGVucHcoTlVMTCkpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHRfY2xvc2Vjb25mKHRjb25mKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgICAgICB0X2Nsb3NlY29uZih0Y29uZik7CisgICAgICAgIHRfY2xvc2Vwdyh0cHcpOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbHNlIC8qIFNSUCAqLworICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBTUlAgKi8KK30KKworaW50Citja19zcnBfaXNfaW5zdGFsbGVkKCkKK3sKKyNpZmRlZiBDS19TUlAKKyNpZmRlZiBTUlBETEwKKyAgICBpZiAoIGhTUlAgPT0gTlVMTCApCisgICAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBTUlBETEwgKi8KKyAgICByZXR1cm4oMSk7CisjZWxzZSAvKiBDS19TUlAgKi8KKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogQ0tfU1JQICovCit9CisKK2ludAorY2tfa3J5cHRvX2lzX2luc3RhbGxlZCgpCit7CisjaWZkZWYgQ0tfU1JQCisjaWZkZWYgT1MyCisgICAgaWYgKCBoTElCS1JZUFRPID09IE5VTEwgKQorICAgICAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogT1MyICovCisgICAgcmV0dXJuKDEpOworI2Vsc2UgLyogQ0tfU1JQICovCisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIENLX1NSUCAqLworfQorCitpbnQKK2NrX2NyeXB0X2lzX2luc3RhbGxlZCgpCit7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorI2lmZGVmIENSWVBUX0RMTAorICAgIHJldHVybihoQ1JZUFQgIT0gTlVMTCk7CisjZWxzZSAvKiBDUllQVF9ETEwgKi8KKyAgICByZXR1cm4oMSk7CisjZW5kaWYgLyogQ1JZUFRfRExMICovCisjZWxzZSAvKiBFTkNSWVBUSU9OICovCisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIEVOQ1JZUFRJT04gKi8KK30KKworaW50Citja19udGxtX2lzX2luc3RhbGxlZCgpCit7CisjaWZkZWYgTlQKKyAgICByZXR1cm4oaFNTUEkgIT0gTlVMTCk7CisjZWxzZSAvKiBOVCAqLworICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBOVCAqLworfQorCitpbnQKK2NrX3RuX2F1dGhfdmFsaWQoKQoreworICAgIHJldHVybih2YWxpZFVzZXIpOworfQorCisvKiBDIEsgXyBLIFIgQiBfIEEgVSBUIEggXyBJIE4gXyBQIFIgTyBHIFIgRSBTIFMKKyAqCisgKiBJcyBhbiBhdXRoZW50aWNhdGlvbiBuZWdvdGlhdGlvbiBzdGlsbCBpbiBwcm9ncmVzcz8KKyAqCisgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2NrX3RuX2F1dGhfaW5fcHJvZ3Jlc3Modm9pZCkKKyNlbHNlCitja190bl9hdXRoX2luX3Byb2dyZXNzKCkKKyNlbmRpZgoreworICAgIHN3aXRjaCAoYXV0aGVudGljYXRpb25fdmVyc2lvbikgeworICAgIGNhc2UgQVVUSFRZUEVfQVVUTzoKKyAgICAgICAgcmV0dXJuKDEpOworICAgIGNhc2UgQVVUSFRZUEVfTlVMTDoKKyAgICAgICAgcmV0dXJuKDApOworI2lmZGVmIEtSQjQKKyAgICBjYXNlIEFVVEhUWVBFX0tFUkJFUk9TX1Y0OgorICAgICAgICBpZiAoIWFjY2VwdF9jb21wbGV0ZSkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwiY2tfYXV0aF9pbl9wcm9ncmVzcygpIEtlcmJlcm9zIDQgIWFjY2VwdF9jb21wbGV0ZSIsCisgICAgICAgICAgICAgICAgICAgIiIsMCk7CisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGF1dGhfaG93ICYgQVVUSF9IT1dfTUFTSykgJiYgIW11dHVhbF9jb21wbGV0ZSkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwiY2tfYXV0aF9pbl9wcm9ncmVzcygpIEtlcmJlcm9zIDQgIW11dHVhbF9jb21wbGV0ZSIsCisgICAgICAgICAgICAgICAgICAgIiIsMCk7CisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIEtSQjQgKi8KKyNpZmRlZiBLUkI1CisgICAgY2FzZSBBVVRIVFlQRV9LRVJCRVJPU19WNToKKyAgICAgICAgaWYgKCFhY2NlcHRfY29tcGxldGUpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsImNrX2F1dGhfaW5fcHJvZ3Jlc3MoKSBLZXJiZXJvcyA1ICFhY2NlcHRfY29tcGxldGUiLAorICAgICAgICAgICAgICAgICAgICIiLDApOworICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChhdXRoX2hvdyAmIEFVVEhfSE9XX01BU0spICYmICFtdXR1YWxfY29tcGxldGUpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsImNrX2F1dGhfaW5fcHJvZ3Jlc3MoKSBLZXJiZXJvcyA1ICFtdXR1YWxfY29tcGxldGUiLAorICAgICAgICAgICAgICAgICAgICIiLDApOworICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybigwKTsKKyNpZmRlZiBHU1NBUElfSzUKKyAgICBjYXNlIEFVVEhUWVBFX0dTU0FQSV9LUkI1OgorICAgICAgICBpZiAoIWFjY2VwdF9jb21wbGV0ZSkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwKKwkJICAiY2tfYXV0aF9pbl9wcm9ncmVzcygpIEdTU0FQSSBLZXJiZXJvcyA1ICFhY2NlcHRfY29tcGxldGUiLAorCQkgICIiLAorCQkgIDAKKwkJICApOworICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChhdXRoX2hvdyAmIEFVVEhfSE9XX01BU0spICYmICFtdXR1YWxfY29tcGxldGUpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsCisJCSAgImNrX2F1dGhfaW5fcHJvZ3Jlc3MoKSBHU1NBUEkgS2VyYmVyb3MgNSAhbXV0dWFsX2NvbXBsZXRlIiwKKwkJICAiIiwKKwkJICAwCisJCSAgKTsKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgfSBlbHNlCisJICByZXR1cm4oMCk7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEdTU0FQSV9LNSAqLworI2VuZGlmIC8qIEtSQjUgKi8KKyNpZmRlZiBDS19TUlAKKyAgICBjYXNlIEFVVEhUWVBFX1NSUDoKKyAgICAgICAgaWYgKCFhY2NlcHRfY29tcGxldGUgfHwgc3JwX3dhaXRyZXNwKQorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogQ0tfU1JQICovCisjaWZkZWYgTlRMTQorICAgIGNhc2UgQVVUSFRZUEVfTlRMTToKKyAgICAgICAgaWYgKCFhY2NlcHRfY29tcGxldGUpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsImNrX2F1dGhfaW5fcHJvZ3Jlc3MoKSBOVExNICFhY2NlcHRfY29tcGxldGUiLAorICAgICAgICAgICAgICAgICAgICIiLDApOworICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBOVExNICovCisgICAgY2FzZSBBVVRIVFlQRV9TU0w6CisgICAgICAgIGlmICghYWNjZXB0X2NvbXBsZXRlKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJja19hdXRoX2luX3Byb2dyZXNzKCkgU1NMICFhY2NlcHRfY29tcGxldGUiLAorICAgICAgICAgICAgICAgICAgICIiLDApOworICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworCisvKiAgQyBLIF8gSyBSIEIgXyBUIE4gXyBBIFUgVCBIIF8gUiBFIFEgVSBFIFMgVAorICoKKyAqICBCdWlsZHMgYSBUZWxuZXQgQXV0aGVudGljYXRpb24gU2VuZCBOZWdvdGlhdGlvbiBwcm92aWRpbmcgdGhlCisgKiAgbGlzdCBvZiBzdXBwb3J0ZWQgYXV0aGVudGljYXRpb24gbWV0aG9kcy4gIFRvIGJlIHVzZWQgb25seQorICogIHdoZW4gYWNjZXB0aW5nIGluY29taW5nIGNvbm5lY3Rpb25zIGFzIG9ubHkgdGhlIHNlcnZlciAoRE8pIHNpZGUgb2YgdGhlCisgKiAgVGVsbmV0IG5lZ290aWF0aW9uIGlzIGFsbG93ZWQgdG8gc2VuZCBhbiBBVVRIIFNFTkQuCisgKgorICogIFJldHVybnM6IDAgb24gc3VjY2VzcyBhbmQgLTEgb24gZmFpbHVyZQorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHN0cl9yZXF1ZXN0WzY0XSA9IHsgSUFDLCBTQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9BVVRIRU5USUNBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTFFVQUxfU0VORCB9OworI2lmZGVmIEdTU0FQSV9LNQorc3RhdGljIGludAorY2tfdG5fYXV0aF9yZXF1ZXN0X2dzc2tyYjUoaW50IGkpCit7CisgICAgaWYgKGNrX2dzc2FwaV9pc19pbnN0YWxsZWQoKSAmJiBja19rcmI1X2lzX2luc3RhbGxlZF9hc19zZXJ2ZXIoKSkgeworICAgICAgICBpZiAoICh0bl9hdXRoX2hvdyA9PSBUTl9BVVRIX0hPV19BTlkgfHwKKyAgICAgICAgICAgICAgIHRuX2F1dGhfaG93ID09IFROX0FVVEhfSE9XX01VVFVBTCkgICYmCisgICAgICAgICAgICAgKHRuX2F1dGhfZW5jID09IFROX0FVVEhfRU5DX0FOWSB8fAorICAgICAgICAgICAgICAgdG5fYXV0aF9lbmMgPT0gVE5fQVVUSF9FTkNfRVhDSCkgKSB7CisgICAgICAgICAgICBzdHJfcmVxdWVzdFtpKytdID0gQVVUSFRZUEVfS0VSQkVST1NfVjU7CisgICAgICAgICAgICBzdHJfcmVxdWVzdFtpXSA9IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiB8IEFVVEhfSE9XX01VVFVBTDsKKyAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldIHw9IEFVVEhfRU5DUllQVF9BRlRFUl9FWENIQU5HRTsKKworICAgICAgICAgICAgaWYgKCBkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcyApCisgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywKKyAgICAgICAgICAgICAgICAiS0VSQkVST1NfVjUgQ0xJRU5UX1RPX1NFUlZFUnxNVVRVQUx8RU5DUllQVF9BRlRFUl9FWENIQU5HRSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvKiBHU1NBUElfSzUgKi8KKworI2lmZGVmIEtSQjUKK3N0YXRpYyBpbnQKK2NrX3RuX2F1dGhfcmVxdWVzdF9rcmI1KGludCBpKQoreworICAgIGlmIChja19rcmI1X2lzX2luc3RhbGxlZF9hc19zZXJ2ZXIoKSkgeworI2lmZGVmIENLX1NTTAorICAgICAgICBpZiAoIGNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSAmJgorICAgICAgICAgICAgICh0bHNfYWN0aXZlX2ZsYWcgfHwgc3NsX2FjdGl2ZV9mbGFnKSAmJgorICAgICAgICAgICAgIHNzbF9maW5pc2hlZF9tZXNzYWdlcyApCisgICAgICAgIHsKKyNpZmRlZiBVU0VfSU5JX0NSRURfRldECisgICAgICAgICAgICBpZiAoIGZvcndhcmRfZmxhZyAmJgorICAgICAgICAgICAgICAgICAodG5fYXV0aF9ob3cgPT0gVE5fQVVUSF9IT1dfQU5ZIHx8CisgICAgICAgICAgICAgICAgICAgdG5fYXV0aF9ob3cgPT0gVE5fQVVUSF9IT1dfTVVUVUFMKSAgJiYKKyAgICAgICAgICAgICAgICAgKHRuX2F1dGhfZW5jID09IFROX0FVVEhfRU5DX0FOWSB8fAorICAgICAgICAgICAgICAgICAgIHRuX2F1dGhfZW5jID09IFROX0FVVEhfRU5DX1RFTE9QVCkKKyAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2krK10gPSBBVVRIVFlQRV9LRVJCRVJPU19WNTsKKyAgICAgICAgICAgICAgICBzdHJfcmVxdWVzdFtpXSA9IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiB8IEFVVEhfSE9XX01VVFVBTDsKKyAgICAgICAgICAgICAgICBzdHJfcmVxdWVzdFtpXSB8PSBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTOworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldIHw9IElOSV9DUkVEX0ZXRF9PTjsKKworICAgICAgICAgICAgICAgIGlmICggZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMgKQorICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnLAorICJLRVJCRVJPU19WNSBDTElFTlRfVE9fU0VSVkVSfE1VVFVBTHxFTkNSWVBUX1NUQVJUX1RMU3xJTklfQ1JFRF9GV0RfT04gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lOSV9DUkVEX0ZXRCAqLworICAgICAgICAgICAgaWYgKCAodG5fYXV0aF9ob3cgPT0gVE5fQVVUSF9IT1dfQU5ZIHx8CisgICAgICAgICAgICAgICAgICAgdG5fYXV0aF9ob3cgPT0gVE5fQVVUSF9IT1dfTVVUVUFMKSAgJiYKKyAgICAgICAgICAgICAgICAgKHRuX2F1dGhfZW5jID09IFROX0FVVEhfRU5DX0FOWSB8fAorICAgICAgICAgICAgICAgICAgIHRuX2F1dGhfZW5jID09IFROX0FVVEhfRU5DX1RFTE9QVCkgKSB7CisgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaSsrXSA9IEFVVEhUWVBFX0tFUkJFUk9TX1Y1OworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldID0gQVVUSF9DTElFTlRfVE9fU0VSVkVSIHwgQVVUSF9IT1dfTVVUVUFMOworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldIHw9IEFVVEhfRU5DUllQVF9TVEFSVF9UTFM7CisKKyAgICAgICAgICAgICAgICBpZiAoIGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzICkKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAiS0VSQkVST1NfVjUgQ0xJRU5UX1RPX1NFUlZFUnxNVVRVQUx8RU5DUllQVF9TVEFSVF9UTFMgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROX01TR19MRU4pOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggdG5fYXV0aF9ob3cgPT0gVE5fQVVUSF9IT1dfQU5ZIHx8CisgICAgICAgICAgICAgICAgIHRuX2F1dGhfaG93ID09IFROX0FVVEhfSE9XX09ORV9XQVkgKSB7CisgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaSsrXSA9IEFVVEhUWVBFX0tFUkJFUk9TX1Y1OworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldID0gQVVUSF9DTElFTlRfVE9fU0VSVkVSIHwgQVVUSF9IT1dfT05FX1dBWTsKKyAgICAgICAgICAgICAgICBzdHJfcmVxdWVzdFtpXSB8PSBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTOworCisgICAgICAgICAgICAgICAgaWYgKCBkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcyApCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csCisgICAgICAgICAgICAgICAgICAgICJLRVJCRVJPU19WNSBDTElFTlRfVE9fU0VSVkVSfE9ORV9XQVl8RU5DUllQVF9TVEFSVF9UTFMgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisjaWZkZWYgVVNFX0lOSV9DUkVEX0ZXRAorICAgICAgICAgICAgaWYgKCBmb3J3YXJkX2ZsYWcgJiYKKyAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pICE9IFROX05HX1JGICYmCisgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pICE9IFROX05HX1JGICYmCisgICAgICAgICAgICAgICAgICh0bl9hdXRoX2hvdyA9PSBUTl9BVVRIX0hPV19BTlkgfHwKKyAgICAgICAgICAgICAgICAgICB0bl9hdXRoX2hvdyA9PSBUTl9BVVRIX0hPV19NVVRVQUwpICAmJgorICAgICAgICAgICAgICAgICAodG5fYXV0aF9lbmMgPT0gVE5fQVVUSF9FTkNfQU5ZIHx8CisgICAgICAgICAgICAgICAgICAgdG5fYXV0aF9lbmMgPT0gVE5fQVVUSF9FTkNfVEVMT1BUKQorICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaSsrXSA9IEFVVEhUWVBFX0tFUkJFUk9TX1Y1OworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldID0gQVVUSF9DTElFTlRfVE9fU0VSVkVSIHwgQVVUSF9IT1dfTVVUVUFMOworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldIHw9IEFVVEhfRU5DUllQVF9VU0lOR19URUxPUFQ7CisgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaV0gfD0gSU5JX0NSRURfRldEX09OOworCisgICAgICAgICAgICAgICAgaWYgKCBkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcyApCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csCisgICJLRVJCRVJPU19WNSBDTElFTlRfVE9fU0VSVkVSfE1VVFVBTHxFTkNSWVBUX1VTSU5HX1RFTE9QVHxJTklfQ1JFRF9GV0RfT04gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lOSV9DUkVEX0ZXRCAqLworCisgICAgICAgICAgICBpZiAoIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSAhPSBUTl9OR19SRiAmJgorICAgICAgICAgICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSAhPSBUTl9OR19SRiAmJgorICAgICAgICAgICAgICAgICAodG5fYXV0aF9ob3cgPT0gVE5fQVVUSF9IT1dfQU5ZIHx8CisgICAgICAgICAgICAgICAgICAgdG5fYXV0aF9ob3cgPT0gVE5fQVVUSF9IT1dfTVVUVUFMKSAgJiYKKyAgICAgICAgICAgICAgICAgKHRuX2F1dGhfZW5jID09IFROX0FVVEhfRU5DX0FOWSB8fAorICAgICAgICAgICAgICAgICAgIHRuX2F1dGhfZW5jID09IFROX0FVVEhfRU5DX1RFTE9QVCkgKSB7CisgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaSsrXSA9IEFVVEhUWVBFX0tFUkJFUk9TX1Y1OworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldID0gQVVUSF9DTElFTlRfVE9fU0VSVkVSIHwgQVVUSF9IT1dfTVVUVUFMOworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldIHw9IEFVVEhfRU5DUllQVF9VU0lOR19URUxPUFQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzICkKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywKKyAgICAgICAgICAgICAgIktFUkJFUk9TX1Y1IENMSUVOVF9UT19TRVJWRVJ8TVVUVUFMfEVOQ1JZUFRfVVNJTkdfVEVMT1BUICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5fTVNHX0xFTik7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorI2lmZGVmIENLX1NTTAorICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworCisgICAgICAgIGlmICggVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pICE9IFROX05HX01VICYmCisgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgIT0gVE5fTkdfTVUgJiYKKyAgICAgICAgICAgICAodG5fYXV0aF9lbmMgPT0gVE5fQVVUSF9FTkNfQU5ZIHx8CisgICAgICAgICAgICAgICB0bl9hdXRoX2VuYyA9PSBUTl9BVVRIX0VOQ19OT05FKQorI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICYmICEoY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpICYmCisgICAgICAgICAgICAgICAgICAgKHRsc19hY3RpdmVfZmxhZyB8fCBzc2xfYWN0aXZlX2ZsYWcpICYmCisgICAgICAgICAgICAgICAgICAgdGxzX2lzX2Fub24oMCkpCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgKQorICAgICAgICB7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgLyogQ2FuJ3QgcGVyZm9ybSBtdXR1YWwgYXV0aGVudGljYXRpb24gd2l0aG91dCBlbmNyeXB0aW9uICovCisgICAgICAgICAgICBpZiAoIHRuX2F1dGhfaG93ID09IFROX0FVVEhfSE9XX0FOWSB8fAorICAgICAgICAgICAgICAgICB0bl9hdXRoX2hvdyA9PSBUTl9BVVRIX0hPV19NVVRVQUwgKSB7CisgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaSsrXSA9IEFVVEhUWVBFX0tFUkJFUk9TX1Y1OworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldID0gQVVUSF9DTElFTlRfVE9fU0VSVkVSIHwgQVVUSF9IT1dfTVVUVUFMOworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldIHw9IEFVVEhfRU5DUllQVF9PRkY7CisKKyAgICAgICAgICAgICAgICBpZiAoIGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzICkKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiS0VSQkVST1NfVjUgQ0xJRU5UX1RPX1NFUlZFUnxNVVRVQUwgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICAgICAgaWYgKCB0bl9hdXRoX2hvdyA9PSBUTl9BVVRIX0hPV19BTlkgfHwKKyAgICAgICAgICAgICAgICAgdG5fYXV0aF9ob3cgPT0gVE5fQVVUSF9IT1dfT05FX1dBWSApIHsKKyAgICAgICAgICAgICAgICBzdHJfcmVxdWVzdFtpKytdID0gQVVUSFRZUEVfS0VSQkVST1NfVjU7CisgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaV0gPSBBVVRIX0NMSUVOVF9UT19TRVJWRVIgfCBBVVRIX0hPV19PTkVfV0FZOworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldIHw9IEFVVEhfRU5DUllQVF9PRkY7CisKKyAgICAgICAgICAgICAgICBpZiAoIGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzICkKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiS0VSQkVST1NfVjUgQ0xJRU5UX1RPX1NFUlZFUnxPTkVfV0FZICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5fTVNHX0xFTik7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybihpKTsKK30KKyNlbmRpZiAvKiBLUkI1ICovCisjaWZkZWYgS1JCNAorc3RhdGljIGludAorY2tfdG5fYXV0aF9yZXF1ZXN0X2tyYjQoaW50IGkpCit7CisgICAgaWYgKGNrX2tyYjRfaXNfaW5zdGFsbGVkX2FzX3NlcnZlcigpKSB7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICBpZiAoVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pICE9IFROX05HX1JGICYmCisgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgIT0gVE5fTkdfUkYgJiYKKyAgICAgICAgICAgICAodG5fYXV0aF9ob3cgPT0gVE5fQVVUSF9IT1dfQU5ZIHx8CisgICAgICAgICAgICAgICB0bl9hdXRoX2hvdyA9PSBUTl9BVVRIX0hPV19NVVRVQUwpICAmJgorICAgICAgICAgICAgICh0bl9hdXRoX2VuYyA9PSBUTl9BVVRIX0VOQ19BTlkgfHwKKyAgICAgICAgICAgICAgIHRuX2F1dGhfZW5jID09IFROX0FVVEhfRU5DX1RFTE9QVCkgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJfcmVxdWVzdFtpKytdID0gQVVUSFRZUEVfS0VSQkVST1NfVjQ7CisgICAgICAgICAgICBzdHJfcmVxdWVzdFtpXSA9IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiB8IEFVVEhfSE9XX01VVFVBTDsKKyAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldIHw9IEFVVEhfRU5DUllQVF9VU0lOR19URUxPUFQ7CisKKyAgICAgICAgICAgIGlmICggZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMgKQorICAgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnLCJLRVJCRVJPU19WNCBDTElFTlRfVE9fU0VSVkVSfE1VVFVBTHxFTkNSWVBUICIsCisgICAgICAgICAgICAgICAgICAgICAgICBUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKworICAgICAgICBpZiAoVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pICE9IFROX05HX01VICYmCisgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgIT0gVE5fTkdfTVUgJiYKKyAgICAgICAgICAgICAodG5fYXV0aF9lbmMgPT0gVE5fQVVUSF9FTkNfQU5ZIHx8CisgICAgICAgICAgICAgICB0bl9hdXRoX2VuYyA9PSBUTl9BVVRIX0VOQ19OT05FKSApCisgICAgICAgIHsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAvKiBDYW4ndCBwZXJmb3JtIG11dHVhbCBhdXRoZW50aWNhdGlvbiB3aXRob3V0IGVuY3J5cHRpb24gKi8KKyAgICAgICAgICAgIGlmICggdG5fYXV0aF9ob3cgPT0gVE5fQVVUSF9IT1dfQU5ZIHx8CisgICAgICAgICAgICAgICAgIHRuX2F1dGhfaG93ID09IFROX0FVVEhfSE9XX01VVFVBTCApIHsKKyAgICAgICAgICAgICAgICBzdHJfcmVxdWVzdFtpKytdID0gQVVUSFRZUEVfS0VSQkVST1NfVjQ7CisgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaV0gPSBBVVRIX0NMSUVOVF9UT19TRVJWRVIgfCBBVVRIX0hPV19NVVRVQUw7CisgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaV0gfD0gQVVUSF9FTkNSWVBUX09GRjsKKworICAgICAgICAgICAgICAgIGlmICggZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMgKQorICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnLCJLRVJCRVJPU19WNCBDTElFTlRfVE9fU0VSVkVSfE1VVFVBTCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROX01TR19MRU4pOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICBpZiAoIHRuX2F1dGhfaG93ID09IFROX0FVVEhfSE9XX0FOWSB8fAorICAgICAgICAgICAgICAgICB0bl9hdXRoX2hvdyA9PSBUTl9BVVRIX0hPV19PTkVfV0FZICkgeworICAgICAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2krK10gPSBBVVRIVFlQRV9LRVJCRVJPU19WNDsKKyAgICAgICAgICAgICAgICBzdHJfcmVxdWVzdFtpXSA9IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiB8IEFVVEhfSE9XX09ORV9XQVk7CisgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaV0gfD0gQVVUSF9FTkNSWVBUX09GRjsKKworICAgICAgICAgICAgICAgIGlmICggZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMgKQorICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnLCJLRVJCRVJPU19WNCBDTElFTlRfVE9fU0VSVkVSfE9ORV9XQVkgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oaSk7Cit9CisjZW5kaWYgLyogS1JCNCAqLworCisjaWZkZWYgQ0tfU1JQCitzdGF0aWMgaW50Citja190bl9hdXRoX3JlcXVlc3Rfc3JwKGludCBpKQoreworICAgIGlmIChja19zcnBfaXNfaW5zdGFsbGVkX2FzX3NlcnZlcigpKSB7CisjaWZuZGVmIFBSRV9TUlBfMV80XzUKKyAgICAgICAgLyogRG9udCcgZG8gdGhpcyB5ZXQuICBTUlAgd2hlbiBpdCB1c2VzIHRoZSBFTkNSWVBUX1VTSU5HX1RFTE9QVCAgICovCisgICAgICAgIC8qIGZsYWcgaXQgbXVzdCBwZXJmb3JtIGEgY2hlY2tzdW0gb2YgdGhlIGF1dGgtdHlwZS1wYWlyIGJ1dCB0aGVyZSAqLworICAgICAgICAvKiBpcyBubyBtZWNoYW5zaW0gdG8gZG8gdGhhdCB5ZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgaWYgKCBja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkgJiYKKyAgICAgICAgICAgICAodGxzX2FjdGl2ZV9mbGFnIHx8IHNzbF9hY3RpdmVfZmxhZykgJiYKKyAgICAgICAgICAgICBzc2xfZmluaXNoZWRfbWVzc2FnZXMgJiYKKyAgICAgICAgICAgICAgICAgKHRuX2F1dGhfaG93ID09IFROX0FVVEhfSE9XX0FOWSB8fAorICAgICAgICAgICAgICAgICAgIHRuX2F1dGhfaG93ID09IFROX0FVVEhfSE9XX09ORV9XQVkpICAmJgorICAgICAgICAgICAgICAgICAodG5fYXV0aF9lbmMgPT0gVE5fQVVUSF9FTkNfQU5ZIHx8CisgICAgICAgICAgICAgICAgICAgdG5fYXV0aF9lbmMgPT0gVE5fQVVUSF9FTkNfVEVMT1BUKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyX3JlcXVlc3RbaSsrXSA9IEFVVEhUWVBFX1NSUDsKKyAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldID0gQVVUSF9DTElFTlRfVE9fU0VSVkVSIHwgQVVUSF9IT1dfT05FX1dBWTsKKyAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldIHw9IEFVVEhfRU5DUllQVF9TVEFSVF9UTFM7CisKKyAgICAgICAgICAgIGlmICggZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMgKQorICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1JQIENMSUVOVF9UT19TRVJWRVJ8T05FX1dBWXxFTkNSWVBUX1NUQVJUX1RMUyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5fTVNHX0xFTik7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgIGVsc2UgeworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICBpZiAoVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pICE9IFROX05HX1JGICYmCisgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pICE9IFROX05HX1JGICYmCisgICAgICAgICAgICAgICAgICh0bl9hdXRoX2hvdyA9PSBUTl9BVVRIX0hPV19BTlkgfHwKKyAgICAgICAgICAgICAgICAgICB0bl9hdXRoX2hvdyA9PSBUTl9BVVRIX0hPV19PTkVfV0FZKSAgJiYKKyAgICAgICAgICAgICAgICAgKHRuX2F1dGhfZW5jID09IFROX0FVVEhfRU5DX0FOWSB8fAorICAgICAgICAgICAgICAgICAgIHRuX2F1dGhfZW5jID09IFROX0FVVEhfRU5DX1RFTE9QVCkKKyAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaSsrXSA9IEFVVEhUWVBFX1NSUDsKKyAgICAgICAgICAgICAgICBzdHJfcmVxdWVzdFtpXSA9IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiB8IEFVVEhfSE9XX09ORV9XQVk7CisgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaV0gfD0gQVVUSF9FTkNSWVBUX1VTSU5HX1RFTE9QVDsKKworICAgICAgICAgICAgICAgIGlmICggZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMgKQorICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnLAorICAgICAgICAgICAgICAgICAgICAiU1JQIENMSUVOVF9UT19TRVJWRVJ8T05FX1dBWXxFTkNSWVBUX1VTSU5HX1RFTE9QVCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROX01TR19MRU4pOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNlbmRpZiAvKiBQUkVfU1JQXzFfNF81ICovCisgICAgICAgIGlmIChURUxPUFRfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgIT0gVE5fTkdfTVUgJiYKKyAgICAgICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSAhPSBUTl9OR19NVSAmJgorICAgICAgICAgICAgICh0bl9hdXRoX2hvdyA9PSBUTl9BVVRIX0hPV19BTlkgfHwKKyAgICAgICAgICAgICAgIHRuX2F1dGhfaG93ID09IFROX0FVVEhfSE9XX01VVFVBTCkgICYmCisgICAgICAgICAgICAgKHRuX2F1dGhfZW5jID09IFROX0FVVEhfRU5DX0FOWSB8fAorICAgICAgICAgICAgICAgdG5fYXV0aF9lbmMgPT0gVE5fQVVUSF9FTkNfTk9ORSkKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAmJiAhKGNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSAmJgorICAgICAgICAgICAgICAgICAgICh0bHNfYWN0aXZlX2ZsYWcgfHwgc3NsX2FjdGl2ZV9mbGFnKSAmJgorICAgICAgICAgICAgICAgICAgIHRsc19pc19hbm9uKDApKQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyX3JlcXVlc3RbaSsrXSA9IEFVVEhUWVBFX1NSUDsKKyAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldID0gQVVUSF9DTElFTlRfVE9fU0VSVkVSIHwgQVVUSF9IT1dfT05FX1dBWTsKKyAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2ldIHw9IEFVVEhfRU5DUllQVF9PRkY7CisKKyAgICAgICAgICAgIGlmICggZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMgKQorICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csIlNSUCBDTElFTlRfVE9fU0VSVkVSfE9ORV9XQVkgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFROX01TR19MRU4pOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKGkpOworfQorI2VuZGlmIC8qIENLX1NSUCAqLworCisjaWZkZWYgQ0tfU1NMCitzdGF0aWMgaW50Citja190bl9hdXRoX3JlcXVlc3Rfc3NsKGludCBpKQoreworICAgIGlmIChja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkKKyAgICAgICAgICYmICF0bHNfYWN0aXZlX2ZsYWcgJiYgIXNzbF9hY3RpdmVfZmxhZyAmJiBzc2xfaW5pdGlhbGl6ZWQKKyAgICAgICAgICkgeworICAgICAgICBpZiAoVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pICE9IFROX05HX01VICYmCisgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgIT0gVE5fTkdfTVUgJiYKKyAgICAgICAgICAgICAodG5fYXV0aF9ob3cgPT0gVE5fQVVUSF9IT1dfQU5ZIHx8CisgICAgICAgICAgICAgICB0bl9hdXRoX2hvdyA9PSBUTl9BVVRIX0hPV19PTkVfV0FZKSAgJiYKKyAgICAgICAgICAgICAodG5fYXV0aF9lbmMgPT0gVE5fQVVUSF9FTkNfQU5ZIHx8CisgICAgICAgICAgICAgICB0bl9hdXRoX2VuYyA9PSBUTl9BVVRIX0VOQ19OT05FKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2krK10gPSBBVVRIVFlQRV9TU0w7CisgICAgICAgICAgICBzdHJfcmVxdWVzdFtpXSA9IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiB8IEFVVEhfSE9XX09ORV9XQVk7CisgICAgICAgICAgICBzdHJfcmVxdWVzdFtpXSB8PSBBVVRIX0VOQ1JZUFRfT0ZGOworICAgICAgICAgICAgaWYgKCBkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcyApCisgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiU1NMIENMSUVOVF9UT19TRVJWRVJ8T05FX1dBWSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5fTVNHX0xFTik7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oaSk7Cit9CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgTlRMTQorc3RhdGljIGludAorY2tfdG5fYXV0aF9yZXF1ZXN0X250bG0oaW50IGkpCit7CisgICAgLyogTWljcm9zb2Z0J3MgVGVsbmV0IGNsaWVudCB3b24ndCBwZXJmb3JtIGF1dGhlbnRpY2F0aW9uIGlmICovCisgICAgLyogTlRMTSBpcyBub3QgZmlyc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCBja19udGxtX2lzX3ZhbGlkKDEpICkgeworICAgICAgICBpZiAoVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pICE9IFROX05HX01VICYmCisgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgIT0gVE5fTkdfTVUgJiYKKyAgICAgICAgICAgICAodG5fYXV0aF9ob3cgPT0gVE5fQVVUSF9IT1dfQU5ZIHx8CisgICAgICAgICAgICAgICB0bl9hdXRoX2hvdyA9PSBUTl9BVVRIX0hPV19PTkVfV0FZKSAgJiYKKyAgICAgICAgICAgICAodG5fYXV0aF9lbmMgPT0gVE5fQVVUSF9FTkNfQU5ZIHx8CisgICAgICAgICAgICAgICB0bl9hdXRoX2VuYyA9PSBUTl9BVVRIX0VOQ19OT05FKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cl9yZXF1ZXN0W2krK10gPSBBVVRIVFlQRV9OVExNOworICAgICAgICAgICAgc3RyX3JlcXVlc3RbaV0gPSBBVVRIX0NMSUVOVF9UT19TRVJWRVIgfCBBVVRIX0hPV19PTkVfV0FZOworICAgICAgICAgICAgc3RyX3JlcXVlc3RbaV0gfD0gQVVUSF9FTkNSWVBUX09GRjsKKyAgICAgICAgICAgIGlmICggZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMgKQorICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csIk5UTE0gQ0xJRU5UX1RPX1NFUlZFUnxPTkVfV0FZICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihpKTsKK30KKyNlbmRpZiAvKiBOVExNICovCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tfdG5fYXV0aF9yZXF1ZXN0KHZvaWQpCisjZWxzZQorY2tfdG5fYXV0aF9yZXF1ZXN0KCkKKyNlbmRpZgoreworICAgIGludCBpID0gNCwgcmMgPSAtMTsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIGlmICggZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMgKQorICAgICAgICBzdHJjcHkodG5fbXNnLCJURUxORVQgU0VOVCBTQiBBVVRIRU5USUNBVElPTiBTRU5EICIpOworCisgICAgLyogQ3JlYXRlIGEgbGlzdCBvZiBhY2NlcHRhYmxlIEF1dGhlbnRpY2F0aW9uIHR5cGVzIHRvIHNlbmQgdG8gKi8KKyAgICAvKiB0aGUgY2xpZW50IGFuZCBsZXQgaXQgY2hvb3NlIGZpbmQgb25lIHRoYXQgd2Ugc3VwcG9ydCAgICAgICAqLworCisgICAgLyogRm9yIHRob3NlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgdGhhdCBzdXBwb3J0IEVuY3J5cHRpb24gb3IgKi8KKyAgICAvKiBDcmVkZW50aWFscyBGb3J3YXJkaW5nIHdlIG11c3Qgc2VuZCBhbGwgb2YgdGhlIGFwcHJvcHJpYXRlICAqLworICAgIC8qIGNvbWJpbmF0aW9ucyBiYXNlZCB1cG9uIHRoZSBzdGF0ZSBvZiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogVEVMT1BUX3hfTU9ERShURUxPUFRfRU5DUllQVElPTikgYW5kIGZvcndhcmRfZmxhZy4gICAgICAgICAgKi8KKworICAgIGlmICggYXV0aF90eXBlX3VzZXJbMF0gPT0gQVVUSFRZUEVfQVVUTyApIHsKKyNpZmRlZiBHU1NBUElfSzUKKyAgICAgICAgaSA9IGNrX3RuX2F1dGhfcmVxdWVzdF9nc3NrcmI1KGkpOworI2VuZGlmIC8qIEdTU0FQSV9LNSAqLworI2lmZGVmIEtSQjUKKyAgICAgICAgaSA9IGNrX3RuX2F1dGhfcmVxdWVzdF9rcmI1KGkpOworI2VuZGlmIC8qIEtSQjUgKi8KKyNpZmRlZiBLUkI0CisgICAgICAgIGkgPSBja190bl9hdXRoX3JlcXVlc3Rfa3JiNChpKTsKKyNlbmRpZiAvKiBLUkI0ICovCisjaWZkZWYgQ0tfU1JQCisgICAgICAgIGkgPSBja190bl9hdXRoX3JlcXVlc3Rfc3JwKGkpOworI2VuZGlmIC8qIFNSUCAqLworI2lmZGVmIENLX1NTTAorICAgICAgICBpID0gY2tfdG5fYXV0aF9yZXF1ZXN0X3NzbChpKTsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBOVExNCisgICAgICAgIGkgPSBja190bl9hdXRoX3JlcXVlc3RfbnRsbShpKTsKKyNlbmRpZiAvKiBOVExNICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvciAoIGo9MDsKKyAgICAgICAgICAgICAgajxBVVRIVFlQTFNUU1ogJiYgYXV0aF90eXBlX3VzZXJbal0gIT0gQVVUSFRZUEVfTlVMTDsKKyAgICAgICAgICAgICAgaisrKSB7CisjaWZkZWYgTlRMTQorICAgICAgICAgICAgaWYgKGF1dGhfdHlwZV91c2VyW2pdID09IEFVVEhUWVBFX05UTE0pCisgICAgICAgICAgICAgICAgaSA9IGNrX3RuX2F1dGhfcmVxdWVzdF9udGxtKGkpOworI2VuZGlmIC8qIE5UTE0gKi8KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgIGlmICggYXV0aF90eXBlX3VzZXJbal0gPT0gQVVUSFRZUEVfU1NMICkKKyAgICAgICAgICAgICAgICBpID0gY2tfdG5fYXV0aF9yZXF1ZXN0X3NzbChpKTsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBDS19TUlAKKyAgICAgICAgICAgIGlmICggYXV0aF90eXBlX3VzZXJbal0gPT0gQVVUSFRZUEVfU1JQICkKKyAgICAgICAgICAgICAgICBpID0gY2tfdG5fYXV0aF9yZXF1ZXN0X3NycChpKTsKKyNlbmRpZiAvKiBTUlAgKi8KKyNpZmRlZiBHU1NBUElfSzUKKyAgICAgICAgICAgIGlmICggYXV0aF90eXBlX3VzZXJbal0gPT0gQVVUSFRZUEVfR1NTQVBJX0tSQjUgKQorICAgICAgICAgICAgICAgIGkgPSBja190bl9hdXRoX3JlcXVlc3RfZ3Nza3JiNShpKTsKKyNlbmRpZiAvKiBHU1NBUElfSzUgKi8KKyNpZmRlZiBLUkI1CisgICAgICAgICAgICBpZiAoIGF1dGhfdHlwZV91c2VyW2pdID09IEFVVEhUWVBFX0tFUkJFUk9TX1Y1ICkKKyAgICAgICAgICAgICAgICBpID0gY2tfdG5fYXV0aF9yZXF1ZXN0X2tyYjUoaSk7CisjZW5kaWYgLyogS1JCNSAqLworI2lmZGVmIEtSQjQKKyAgICAgICAgICAgIGlmICggYXV0aF90eXBlX3VzZXJbal0gPT0gQVVUSFRZUEVfS0VSQkVST1NfVjQgKQorICAgICAgICAgICAgICAgIGkgPSBja190bl9hdXRoX3JlcXVlc3Rfa3JiNChpKTsKKyNlbmRpZiAvKiBLUkI0ICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdHJfcmVxdWVzdFtpKytdID0gSUFDOworICAgIHN0cl9yZXF1ZXN0W2krK10gPSBTRTsKKyAgICBpZiAoIGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzICkgeworICAgICAgICBja3N0cm5jYXQodG5fbXNnLCJJQUMgU0UiLFROX01TR19MRU4pOworICAgICAgICBkZWJ1ZyhGMTAwLHRuX21zZywiIiwwKTsKKyAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZyk7CisgICAgfQorCisgICAgLyogU2VuZCBkYXRhICovCisjaWZkZWYgT1MyCisgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyAgICByYyA9IHR0b2woKENIQVIgKilzdHJfcmVxdWVzdCwgaSk7CisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBpZiAoIHJjID09IGkgKQorICAgICAgICByZXR1cm4oMCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oLTEpOworfQorCisjaWZkZWYgQ0tfRU5DUllQVElPTgorVk9JRAorY2tfdG5fZW5jX3N0YXJ0KCkKK3sKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfRU5DUllQVElPTikgJiYgIVRFTE9QVF9VKFRFTE9QVF9FTkNSWVBUSU9OKSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghVEVMT1BUX1NCKFRFTE9QVF9FTkNSWVBUSU9OKS5lbmNyeXB0LnN0b3AgJiYKKyAgICAgICAgICghZW5jcnlwdF9pc19kZWNyeXB0aW5nKCkgfHwgIWVuY3J5cHRfaXNfZW5jcnlwdGluZygpKSkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJja190bl9lbmNfc3RhcnQiLCJub3RoaW5nIHRvIGRvIiwwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBURUxPUFRfU0IoVEVMT1BUX0VOQ1JZUFRJT04pLmVuY3J5cHQuc3RvcCA9IDA7CisgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfRU5DUllQVElPTikgJiYgIWVuY3J5cHRfaXNfZW5jcnlwdGluZygpKSB7CisgICAgICAgIGRlYnVnKEYxMTAsImNrX3RuX2VuY19zdGFydCIsImVuY3J5cHRfcmVxdWVzdF9zdGFydCIsMCk7CisgICAgICAgIGVuY3J5cHRfcmVxdWVzdF9zdGFydCgpOworICAgIH0KKyAgICBpZiAoVEVMT1BUX1UoVEVMT1BUX0VOQ1JZUFRJT04pICYmICFlbmNyeXB0X2lzX2RlY3J5cHRpbmcoKSkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJja190bl9lbmNfc3RhcnQiLCJlbmNyeXB0X3NlbmRfcmVxdWVzdF9zdGFydCIsMCk7CisgICAgICAgIGVuY3J5cHRfc2VuZF9yZXF1ZXN0X3N0YXJ0KCk7CisgICAgfQorICAgIHRuX3dhaXQoImVuY3J5cHQgc3RhcnQiKTsKKyAgICB0bl9wdXNoKCk7Cit9CisKK1ZPSUQKK2NrX3RuX2VuY19zdG9wKCkKK3sKKyAgICBpZiAoIVRFTE9QVF9NRShURUxPUFRfRU5DUllQVElPTikgJiYgIVRFTE9QVF9VKFRFTE9QVF9FTkNSWVBUSU9OKSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0VOQ1JZUFRJT04pLmVuY3J5cHQuc3RvcCB8fAorICAgICAgICAgIShlbmNyeXB0X2lzX2RlY3J5cHRpbmcoKSB8fCBlbmNyeXB0X2lzX2VuY3J5cHRpbmcoKSkpIHsKKyAgICAgICAgZGVidWcoRjExMCwiY2tfdG5fZW5jX3N0b3AiLCJub3RoaW5nIHRvIGRvIiwwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgVEVMT1BUX1NCKFRFTE9QVF9FTkNSWVBUSU9OKS5lbmNyeXB0LnN0b3AgPSAxOworICAgIGlmIChURUxPUFRfVShURUxPUFRfRU5DUllQVElPTikgJiYgZW5jcnlwdF9pc19kZWNyeXB0aW5nKCkpIHsKKyAgICAgICAgZGVidWcoRjExMCwiY2tfdG5fZW5jX3N0b3AiLCJlbmNyeXB0X3NlbmRfcmVxdWVzdF9lbmQiLDApOworICAgICAgICBlbmNyeXB0X3NlbmRfcmVxdWVzdF9lbmQoKTsKKyAgICB9CisgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfRU5DUllQVElPTikgJiYgZW5jcnlwdF9pc19lbmNyeXB0aW5nKCkpIHsKKyAgICAgICAgZGVidWcoRjExMCwiY2tfdG5fZW5jX3N0b3AiLCJlbmNyeXB0X3NlbmRfZW5kIiwwKTsKKyAgICAgICAgZW5jcnlwdF9zZW5kX2VuZCgpOworICAgIH0KKyAgICB0bl93YWl0KCJlbmNyeXB0IHN0b3AiKTsKKyAgICB0bl9wdXNoKCk7Cit9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworCisvKiAgQyBLIF8gSyBSIEIgXyBUIE4gXyBTIEIgXyBBIFUgVCBICisgKiAgQW4gaW50ZXJmYWNlIGJldHdlZW4gdGhlIEMtS2VybWl0IFRlbG5ldCBDb21tYW5kIFBhcnNlciBhbmQgdGhlIEF1dGhlbnQtCisgKiAgaWNhdGlvbiBvcHRpb24gcGFyc2VyIGltcGxlbWVudGVkIGluIHRoZSBLZXJiZXJvcyBUZWxuZXQgY2xpZW50LgorICoKKyAqICBzYiAgIC0gdGhlIHN1Ym5lZ290aWF0aW9uIGFzIGNhbGN1bGF0ZWQgaW4gY2tjbmV0LmMKKyAqICBsZW4gIC0gdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyCisgKgorICogIFJldHVybnM6IDAgb24gc3VjY2VzcyBhbmQgLTEgb24gZmFpbHVyZQorICovCisKK2ludAorI2lmZGVmIENLX0FOU0lDCitja190bl9zYl9hdXRoKGNoYXIgKiBzYiwgaW50IGxlbikKKyNlbHNlIC8qIENLX0FOU0lDICovCitja190bl9zYl9hdXRoKHNiLGxlbikgY2hhciAqIHNiOyBpbnQgbGVuOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgLyogYXV0aF9wYXJzZSgpIGFzc3VtZXMgdGhhdCBzYiBzdGFydHMgYXQgcG9zIDEgbm90IDAgYXMgaW4gY2tjbmV0LmMgKi8KKyAgICAvKiBhbmQgaXQgd2FudHMgdGhlIGxlbmd0aCB0byBleGNsdWRlIHRoZSBJQUMgU0UgYnl0ZXMgICAgICAgICAgICAgICAqLworICAgIENIQVIgKiBidWY7CisgICAgaW50IHJjID0gLTE7CisKKyAgICBidWYgPSBtYWxsb2MobGVuLTEpOworICAgIGlmICggIWJ1ZiApIHJldHVybigtMSk7CisKKyAgICBidWZbMF0gPSBTQjsKKyAgICBtZW1jcHkoICZidWZbMV0sIHNiLCBsZW4tMiApOworICAgIHJjID0gYXV0aF9wYXJzZShidWYsbGVuLTEpOworICAgIGZyZWUoYnVmKTsKKyAgICBkZWJ1ZyhGMTExLCJja190bl9zYl9hdXRoIiwicmMiLHJjKTsKKyAgICBpZiAocmMgPT0gQVVUSF9GQUlMVVJFKSB7CisgICAgICAgIGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gPSBBVVRIVFlQRV9OVUxMOworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgICAgIGlwYWRsMjUoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgaXBhZGwyNSgpOworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qICBDIEsgXyBLIFIgQiBfIFQgTiBfIFMgQiBfIEUgTiBDIFIgWSBQIFQKKyAqICBBbiBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgQy1LZXJtaXQgVGVsbmV0IENvbW1hbmQgUGFyc2VyIGFuZCB0aGUgRW5jcnlwdGlvbgorICogIG9wdGlvbiBwYXJzZXIgaW1wbGVtZW50ZWQgaW4gdGhlIEtlcmJlcm9zIFRlbG5ldCBjbGllbnQuCisgKgorICogIHNiICAgLSB0aGUgc3VibmVnb3RpYXRpb24gYXMgY2FsY3VsYXRlZCBpbiBja2NuZXQuYworICogIGxlbiAgLSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIKKyAqCisgKiAgUmV0dXJuczogQWx3YXlzIHJldHVybnMgMCBmb3Igc3VjY2VzcyBzaW5jZSBlbmNyeXB0X3BhcnNlIGlzIHZvaWQKKyAqLworCisKK2ludAorI2lmZGVmIENLX0FOU0lDCitja190bl9zYl9lbmNyeXB0KGNoYXIgKiBzYiwgaW50IGxlbikKKyNlbHNlCitja190bl9zYl9lbmNyeXB0KHNiLGxlbikgY2hhciAqIHNiOyBpbnQgbGVuOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgLyogZW5jcnlwdF9wYXJzZSgpIGFzc3VtZXMgdGhhdCBzYiBzdGFydHMgYXQgcG9zIDEgbm90IDAgYXMgaW4gY2tjbmV0LmMgKi8KKyAgICAvKiBhbmQgaXQgd2FudHMgdGhlIGxlbmd0aCB0byBleGNsdWRlIHRoZSBJQUMgU0UgYnl0ZXMgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBjaGFyICogYnVmOworICAgIGludCByYyA9IC0xOworCisgICAgYnVmID0gbWFsbG9jKGxlbi0xKTsKKyAgICBpZiAoICFidWYgKSByZXR1cm4oLTEpOworCisgICAgYnVmWzBdID0gU0I7CisgICAgbWVtY3B5KCAmYnVmWzFdLCBzYiwgbGVuLTIgKTsKKyAgICByYyA9IGVuY3J5cHRfcGFyc2UoYnVmLGxlbi0xKTsKKworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgZnJlZShidWYpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIFRoaXMgaXMgYSBoYWNrLiAgSXQgZG9lcyBub3QgYmVsb25nIGhlcmUgYnV0IHNob3VsZCByZWFsbHkgYmUgaW4gKi8KKyAgICAvKiBlbmNyeXB0X3BhcnNlKCkgYnV0IGluIEs5NSB0aGUgZW5jcnlwdF9wYXJzZSgpIHJvdXRpbmUgZG9lcyBub3QgICovCisgICAgLyogaGF2ZSBhY2Nlc3MgdG8gdGhlIHRlbG9wdF9zdGF0ZXMgYXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICggYnVmWzFdID09IEVOQ1JZUFRfUkVRRU5EICkKKyAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9FTkNSWVBUSU9OKS5lbmNyeXB0LnN0b3AgPSAxOworICAgIGVsc2UgaWYgKCBidWZbMV0gPT0gRU5DUllQVF9SRVFTVEFSVCApCisgICAgICAgIFRFTE9QVF9TQihURUxPUFRfRU5DUllQVElPTikuZW5jcnlwdC5zdG9wID0gMDsKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgIGlwYWRsMjUoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgZnJlZShidWYpOworI2VuZGlmIC8qIEVOQ1JZUFRJT04gKi8KKyAgICByZXR1cm4oMCk7Cit9CisKKworLyogIEMgSyBfIEsgUiBCIF8gRSBOIEMgUiBZIFAgVCBJIE4gRworICogIFJldHVybnMgMSBpZiB3ZSBhcmUgZW5jcnlwdGluZyBhbmQgMCBpZiB3ZSBhcmUgbm90CisgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2NrX3RuX2VuY3J5cHRpbmcoVk9JRCkKKyNlbHNlIC8qIENLX0FOU0lDICovCitja190bl9lbmNyeXB0aW5nKCkKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBpZiAoIGdfa3N0cmVhbSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuKDApOworICAgIGlmICggZ19rc3RyZWFtLT5lbmNyeXB0ICYmIGVuY3J5cHRfaXNfZW5jcnlwdGluZygpKSB7CisgICAgICAgIGRlYnVnKEYxMTEsImNrX3RuX2VuY3J5cHRpbmciLCJlbmNyeXB0aW5nIiwKKyAgICAgICAgICAgICAgIGdfa3N0cmVhbS0+ZW5jcnlwdF90eXBlKTsKKyAgICAgICAgcmV0dXJuKGdfa3N0cmVhbS0+ZW5jcnlwdF90eXBlKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgIGRlYnVnKEYxMTAsImNrX3RuX2VuY3J5cHRpbmciLCJub3QgZW5jcnlwdGluZyIsMCk7CisgICAgcmV0dXJuKDApOworfQorCisvKiAgQyBLIF8gSyBSIEIgXyBEIEUgQyBSIFkgUCBUIEkgTiBHCisgKiAgUmV0dXJucyAxIGlmIHdlIGFyZSBkZWNyeXB0aW5nIGFuZCAwIGlmIHdlIGFyZSBub3QKKyAqLworCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tfdG5fZGVjcnlwdGluZyhWT0lEKQorI2Vsc2UKK2NrX3RuX2RlY3J5cHRpbmcoKQorI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIGlmICggZ19rc3RyZWFtID09IE5VTEwgKQorICAgICAgICByZXR1cm4oMCk7CisgICAgaWYgKCBnX2tzdHJlYW0tPmRlY3J5cHQgJiYgZW5jcnlwdF9pc19kZWNyeXB0aW5nKCkpIHsKKyAgICAgICAgZGVidWcoRjExMSwiY2tfdG5fZGVjcnlwdGluZyIsImRlY3J5cHRpbmciLAorICAgICAgICAgICAgICAgZ19rc3RyZWFtLT5kZWNyeXB0X3R5cGUpOworICAgICAgICByZXR1cm4oZ19rc3RyZWFtLT5kZWNyeXB0X3R5cGUpOworICAgIH0KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgZGVidWcoRjExMCwiY2tfdG5fZGVjcnlwdGluZyIsIm5vdCBkZWNyeXB0aW5nIiwwKTsKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qICBDIEsgXyBLIFIgQiBfIEEgVSBUIEggRSBOIFQgSSBDIEEgVCBFIEQKKyAqICBSZXR1cm5zIHRoZSBhdXRoZW50aWNhdGlvbiB0eXBlOiBBVVRIVFlQRV9OVUxMLCBBVVRIVFlQRV9LRVJCRVJPUzQsCisgKiAgb3IgQVVUSFRZUEVfS0VSQkVST1M1LCBBVVRIVFlQRV9TUlAsIC4uLiAoc2VlIGNrY3RlbC5oKQorICovCisKK2ludAorI2lmZGVmIENLX0FOU0lDCitja190bl9hdXRoZW50aWNhdGVkKFZPSUQpCisjZWxzZQorY2tfdG5fYXV0aGVudGljYXRlZCgpCisjZW5kaWYKK3sKKyAgICByZXR1cm4oYXV0aGVudGljYXRpb25fdmVyc2lvbik7Cit9CisKKy8qICBDIEsgXyBLIFIgQiBfIEUgTiBDIFIgWSBQIFQKKyAqICBlbmNyeXB0cyBuIGNoYXJhY3RlcnMgaW4gcyBpZiB3ZSBhcmUgZW5jcnlwdGluZworICovCisKK1ZPSUQKKyNpZmRlZiBDS19BTlNJQworY2tfdG5fZW5jcnlwdCggY2hhciAqIHMsIGludCBuICkKKyNlbHNlCitja190bl9lbmNyeXB0KCBzLG4gKSBjaGFyICogczsgaW50IG47CisjZW5kaWYKK3sKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgc3RydWN0IGtzdHJlYW1fZGF0YV9ibG9jayBpOworCisgICAgaWYgKGdfa3N0cmVhbS0+ZW5jcnlwdCAmJiBlbmNyeXB0X2lzX2VuY3J5cHRpbmcoKSkgeworI2lmZGVmIERFQlVHCisgICAgICBoZXhkdW1wKCJmcm9tIHBsYWludGV4dCIsIHMsIG4pOworI2VuZGlmCisgICAgICAgIGkucHRyID0gczsKKyAgICAgICAgaS5sZW5ndGggPSBuOworICAgICAgICBnX2tzdHJlYW0tPmVuY3J5cHQoJmksIE5VTEwpOworI2lmZGVmIERFQlVHCisgICAgICAgIGhleGR1bXAoInRvIGN5cGhlcnRleHQiLCBzLCBuKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGRlYnVnKEYxMDEsImNrX3RuX2VuY3J5cHQgbm90IGVuY3J5cHRpbmciLCIiLG4pOworI2VuZGlmIC8qIEVOQ1JZUFRJT04gKi8KK30KKworLyogIEMgSyBfIEsgUiBCIF8gRCBFIEMgUiBZIFAgVAorICogIGRlY3J5cHRzIG4gY2hhcmFjdGVycyBpbiBzIGlmIHdlIGFyZSBkZWNyeXB0aW5nCisgKi8KKworVk9JRAorI2lmZGVmIENLX0FOU0lDCitja190bl9kZWNyeXB0KCBjaGFyICogcywgaW50IG4gKQorI2Vsc2UKK2NrX3RuX2RlY3J5cHQoIHMsbiApIGNoYXIgKiBzOyBpbnQgbjsKKyNlbmRpZgoreworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBzdHJ1Y3Qga3N0cmVhbV9kYXRhX2Jsb2NrIGk7CisKKyAgICBpZiAoZ19rc3RyZWFtLT5kZWNyeXB0ICYmIGVuY3J5cHRfaXNfZGVjcnlwdGluZygpKSB7CisKKyNpZmRlZiBERUJVRworICAgICAgICBoZXhkdW1wKCJmcm9tIGN5cGhlcnRleHQiLCBzLCBuKTsKKyNlbmRpZgorCisgICAgICAgIGkucHRyID0gczsKKyAgICAgICAgaS5sZW5ndGggPSBuOworICAgICAgICBnX2tzdHJlYW0tPmRlY3J5cHQoJmksIE5VTEwpOworI2lmZGVmIERFQlVHCisgICAgICAgIGhleGR1bXAoInRvIHBsYWludGV4dCIsIHMsIG4pOworI2VuZGlmCisgICAgfQorICAgIGVsc2UgZGVidWcoRjEwMSwiY2tfdG5fZGVjcnlwdCBub3QgZGVjcnlwdGluZyIsIiIsbik7CisjZW5kaWYgLyogRU5DUllQVElPTiAqLworfQorCisvKiAgUyBFIE4gRCBLIDUgQSBVIFQgSCBTIEIKKyAqICBTZW5kIGEgS2VyYmVyb3MgNSBBdXRoZW50aWNhdGlvbiBTdWJuZWdvdGlhdGlvbiB0byBob3N0IGFuZAorICogIG91dHB1dCBhcHByb3ByaWF0ZSBUZWxuZXQgRGVidWcgbWVzc2FnZXMKKyAqCisgKiAgdHlwZSAtIFN1YiBOZWdvdGlhdGlvbiB0eXBlCisgKiAgZGF0YSAtIHB0ciB0byBidWZmZXIgY29udGFpbmluZyBkYXRhCisgKiAgbGVuICAtIGxlbiBvZiBidWZmZXIgaWYgbm90IE5VTCB0ZXJtaW5hdGVkCisgKgorICogIHJldHVybnMgbnVtYmVyIG9mIGNoYXJhY3RlcnMgc2VudCBvciBlcnJvciB2YWx1ZQorICovCisKK3N0YXRpYyBpbnQKKyNpZmRlZiBDS19BTlNJQworU2VuZEs1QXV0aFNCKGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgbGVuKQorI2Vsc2UKK1NlbmRLNUF1dGhTQih0eXBlLGRhdGEsbGVuKSBpbnQgdHlwZTsgdm9pZCAqZGF0YTsgaW50IGxlbjsKKyNlbmRpZgoreworICAgIGludCByYzsKKyAgICB1bnNpZ25lZCBjaGFyICpwID0gc3RyX2RhdGEgKyAzOworICAgIHVuc2lnbmVkIGNoYXIgKmNkID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOworICAgIGV4dGVybiBpbnQgc3N0ZWxuZXQ7CisKKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9TVEFSVF9UTFMpLnN0YXJ0X3Rscy5tZV9mb2xsb3dzKSB7CisgICAgICAgIGlmICh0dGNoaygpIDwgMCkKKyAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4oMSk7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgaWYgKCB0eXBlIDwgMCB8fCB0eXBlID4gNyApICAgICAgICAgLyogQ2hlY2sgZm9yIGludmFsaWQgdmFsdWVzICovCisgICAgICAgIHJldHVybigwKTsKKworICAgIGlmICghY2QpIHsKKyAgICAgICAgY2QgPSAodW5zaWduZWQgY2hhciAqKSIiOworICAgICAgICBsZW4gPSAwOworICAgIH0KKworICAgIGlmIChsZW4gPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlIHN0cmxlbigpIGZvciBsZW4gKi8KKyAgICAgICAgbGVuID0gc3RybGVuKChjaGFyICopY2QpOworCisgICAgLyogQ29uc3RydWN0IE1lc3NhZ2UgKi8KKyAgICAqcCsrID0gc3N0ZWxuZXQgPyBURUxRVUFMX1JFUExZIDogVEVMUVVBTF9JUzsKKyAgICAqcCsrID0gQVVUSFRZUEVfS0VSQkVST1NfVjU7CisgICAgKnAgPSBBVVRIX0NMSUVOVF9UT19TRVJWRVI7CisgICAgKnAgfD0gYXV0aF9ob3c7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICpwIHw9IGF1dGhfY3J5cHQ7CisjZW5kaWYKKyNpZmRlZiBVU0VfSU5JX0NSRURfRldECisgICAgaWYgKGF1dGhfZndkKQorICAgICAgICAqcCB8PSBJTklfQ1JFRF9GV0RfT047CisjZW5kaWYgLyogVVNFX0lOSV9DUkVEX0ZXRCAqLworICAgIHArKzsKKyAgICAqcCsrID0gdHlwZTsKKyAgICB3aGlsZSAobGVuLS0gPiAwKSB7CisgICAgICAgIGlmICgoKnArKyA9ICpjZCsrKSA9PSBJQUMpCisgICAgICAgICAgICAqcCsrID0gSUFDOworICAgIH0KKyAgICAqcCsrID0gSUFDOworICAgICpwKysgPSBTRTsKKworICAgIC8qIEhhbmRsZSBUZWxuZXQgRGVidWdnaW5nIE1lc3NhZ2VzICovCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgZGVibGVuPXAtc3RyX2RhdGEtMjsKKyAgICAgICAgY2hhciAqcz1OVUxMOworICAgICAgICBpbnQgbW9kZSA9IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiB8IChhdXRoX2hvdyAmIEFVVEhfSE9XX01BU0spIHwKKyAgICAgICAgICAgIGF1dGhfY3J5cHQKKyNpZmRlZiBVU0VfSU5JX0NSRURfRldECisgICAgICAgICAgICAgIHwgKGF1dGhfZndkP0lOSV9DUkVEX0ZXRF9PTjpJTklfQ1JFRF9GV0RfT0ZGKQorI2VuZGlmIC8qIFVTRV9JTklfQ1JFRF9GV0QgKi8KKyAgICAgICAgICAgICAgICAgICAgOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBzID0gIkFVVEgiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHMgPSAiUkVKRUNUIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBzID0gIkFDQ0VQVCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcyA9ICJSRVNQT05TRSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgcyA9ICJGT1JXQVJEIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBzID0gIkZPUldBUkRfQUNDRVBUIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBzID0gIkZPUldBUkRfUkVKRUNUIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBzID0gIlRMU19WRVJJRlkiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2ttYWt4bXNnKHRuX21zZyxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsCisgICAgICAgICAgICAgICAgIFRFTE9QVChURUxPUFRfQVVUSEVOVElDQVRJT04pLCIgIiwKKyAgICAgICAgICAgICAgICAgc3RyX2RhdGFbM10gPT0gVEVMUVVBTF9JUyA/ICJJUyIgOgorICAgICAgICAgICAgICAgICBzdHJfZGF0YVszXSA9PSBURUxRVUFMX1JFUExZID8gIlJFUExZIiA6ICI/Pz8iLCIgIiwKKyAgICAgICAgICAgICAgICAgQVVUSFRZUEVfTkFNRShhdXRoZW50aWNhdGlvbl92ZXJzaW9uKSwiICIsCisgICAgICAgICAgICAgICAgIEFVVEhNT0RFX05BTUUobW9kZSksIiAiLAorICAgICAgICAgICAgICAgICBzLCIgIixOVUxMKTsKKyAgICAgICAgdG5faGV4KChDSEFSICopdG5fbXNnLFROX01TR19MRU4sJnN0cl9kYXRhWzddLGRlYmxlbi03KTsKKyAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiSUFDIFNFIixUTl9NU0dfTEVOKTsKKyAgICAgICAgZGVidWcoRjEwMCx0bl9tc2csIiIsMCk7CisgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgIH0KKworICAgIC8qIFNlbmQgZGF0YSAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisgICAgcmMgPSB0dG9sKChDSEFSICopc3RyX2RhdGEsIHAgLSBzdHJfZGF0YSk7CisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBkZWJ1ZyhGMTExLCJTZW5kSzVBdXRoU0IiLCJ0dG9sKCkiLHJjKTsKKyAgICByZXR1cm4ocmMpOworfQorCisvKiAgUyBFIE4gRCBLIDQgQSBVIFQgSCBTIEIKKyAqICBTZW5kIGEgS2VyYmVyb3MgNCBBdXRoZW50aWNhdGlvbiBTdWJuZWdvdGlhdGlvbiB0byBob3N0IGFuZAorICogIG91dHB1dCBhcHByb3ByaWF0ZSBUZWxuZXQgRGVidWcgbWVzc2FnZXMKKyAqCisgKiAgdHlwZSAtIFN1YiBOZWdvdGlhdGlvbiB0eXBlCisgKiAgZGF0YSAtIHB0ciB0byBidWZmZXIgY29udGFpbmluZyBkYXRhCisgKiAgbGVuICAtIGxlbiBvZiBidWZmZXIgaWYgbm90IE5VTCB0ZXJtaW5hdGVkCisgKgorICogIHJldHVybnMgbnVtYmVyIG9mIGNoYXJhY3RlcnMgc2VudCBvciBlcnJvciB2YWx1ZQorICovCisKK3N0YXRpYyBpbnQKKyNpZmRlZiBDS19BTlNJQworU2VuZEs0QXV0aFNCKGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgbGVuKQorI2Vsc2UKK1NlbmRLNEF1dGhTQih0eXBlLGRhdGEsbGVuKSBpbnQgdHlwZTsgdm9pZCAqZGF0YTsgaW50IGxlbjsKKyNlbmRpZgoreworICAgIGludCByYzsKKyAgICB1bnNpZ25lZCBjaGFyICpwID0gc3RyX2RhdGEgKyAzOworICAgIHVuc2lnbmVkIGNoYXIgKmNkID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOworICAgIGV4dGVybiBpbnQgc3N0ZWxuZXQ7CisgICAgaW50IG1vZGUgPSAoYXV0aF9ob3cgJiBBVVRIX0hPV19NQVNLKSB8CisgICAgICAgIGF1dGhfY3J5cHQ7CisKKyAgICBpZiAoIHR5cGUgPCAwIHx8IHR5cGUgPiA0ICkgICAgICAgICAvKiBDaGVjayBmb3IgaW52YWxpZCB2YWx1ZXMgKi8KKyAgICAgICAgcmV0dXJuKDApOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICBpZiAodHRjaGsoKSA8IDApCisgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIGlmICghY2QpIHsKKyAgICAgICAgY2QgPSAodW5zaWduZWQgY2hhciAqKSIiOworICAgICAgICBsZW4gPSAwOworICAgIH0KKworICAgIGlmIChsZW4gPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlIHN0cmxlbigpIGZvciBsZW4gKi8KKyAgICAgICAgbGVuID0gc3RybGVuKChjaGFyICopY2QpOworCisKKyAgICAvKiBDb25zdHJ1Y3QgTWVzc2FnZSAqLworICAgICpwKysgPSBzc3RlbG5ldCA/IFRFTFFVQUxfUkVQTFkgOiBURUxRVUFMX0lTOworICAgICpwKysgPSBBVVRIVFlQRV9LRVJCRVJPU19WNDsKKyAgICAqcCA9IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUjsKKyAgICAqcCB8PSBtb2RlOworICAgIHArKzsKKyAgICAqcCsrID0gdHlwZTsKKyAgICB3aGlsZSAobGVuLS0gPiAwKSB7CisgICAgICAgIGlmICgoKnArKyA9ICpjZCsrKSA9PSBJQUMpCisgICAgICAgICAgICAqcCsrID0gSUFDOworICAgICAgICB9CisgICAgKnArKyA9IElBQzsKKyAgICAqcCsrID0gU0U7CisKKyAgICAvKiBIYW5kbGUgVGVsbmV0IERlYnVnZ2luZyBNZXNzYWdlcyAqLworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGRlYmxlbj1wLXN0cl9kYXRhLTI7CisgICAgICAgIGNoYXIgKnM9TlVMTDsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcyA9ICJBVVRIIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzID0gIlJFSkVDVCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcyA9ICJBQ0NFUFQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHMgPSAiQ0hBTExFTkdFIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBzID0gIlJFU1BPTlNFIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2ttYWt4bXNnKHRuX21zZyxUTl9NU0dfTEVOLCJURUxORVQgU0VOVCBTQiAiLAorICAgICAgICAgICAgICAgICBURUxPUFQoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSwiICIsCisgICAgICAgICAgICAgICAgIHN0cl9kYXRhWzNdID09IFRFTFFVQUxfSVMgPyAiSVMiIDoKKyAgICAgICAgICAgICAgICAgKHN0cl9kYXRhWzNdID09IFRFTFFVQUxfUkVQTFkgPyAiUkVQTFkiIDogIj8/PyIpLCIgIiwKKyAgICAgICAgICAgICAgICAgQVVUSFRZUEVfTkFNRShhdXRoZW50aWNhdGlvbl92ZXJzaW9uKSwiICIsCisgICAgICAgICAgICAgICAgIEFVVEhNT0RFX05BTUUobW9kZSksIiAiLAorICAgICAgICAgICAgICAgICBzLCIgIixOVUxMKTsKKyAgICAgICAgdG5faGV4KChDSEFSICopdG5fbXNnLFROX01TR19MRU4sJnN0cl9kYXRhWzddLGRlYmxlbi03KTsKKyAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiSUFDIFNFIixUTl9NU0dfTEVOKTsKKyAgICAgICAgZGVidWcoRjEwMCx0bl9tc2csIiIsMCk7CisgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgIH0KKworICAgIC8qIFNlbmQgZGF0YSAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisgICAgcmMgPSB0dG9sKChDSEFSICopc3RyX2RhdGEsIHAgLSBzdHJfZGF0YSk7CisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICBkZWJ1ZyhGMTExLCJTZW5kSzRBdXRoU0IiLCJ0dG9sKCkiLHJjKTsKKyAgICByZXR1cm4ocmMpOworfQorCisvKiAgUyBFIE4gRCBTIFIgUCBBIFUgVCBIIFMgQgorICogIFNlbmQgYSBTUlAgQXV0aGVudGljYXRpb24gU3VibmVnb3RpYXRpb24gdG8gaG9zdCBhbmQKKyAqICBvdXRwdXQgYXBwcm9wcmlhdGUgVGVsbmV0IERlYnVnIG1lc3NhZ2VzCisgKgorICogIHR5cGUgLSBTdWIgTmVnb3RpYXRpb24gdHlwZQorICogIGRhdGEgLSBwdHIgdG8gYnVmZmVyIGNvbnRhaW5pbmcgZGF0YQorICogIGxlbiAgLSBsZW4gb2YgYnVmZmVyIGlmIG5vdCBOVUwgdGVybWluYXRlZAorICoKKyAqICByZXR1cm5zIG51bWJlciBvZiBjaGFyYWN0ZXJzIHNlbnQgb3IgZXJyb3IgdmFsdWUKKyAqLworCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK1NlbmRTUlBBdXRoU0IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIGludCBsZW4pCisjZWxzZQorU2VuZFNSUEF1dGhTQih0eXBlLGRhdGEsbGVuKSBpbnQgdHlwZTsgdm9pZCAqZGF0YTsgaW50IGxlbjsKKyNlbmRpZgoreworICAgIGludCByYzsKKyAgICB1bnNpZ25lZCBjaGFyICpwID0gc3RyX2RhdGEgKyAzOworICAgIHVuc2lnbmVkIGNoYXIgKmNkID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOworICAgIGV4dGVybiBpbnQgc3N0ZWxuZXQ7CisKKyAgICAvKiBDaGVjayBmb3IgaW52YWxpZCB2YWx1ZXMgKi8KKyAgICBpZiAoIHR5cGUgIT0gU1JQX0VYUCAmJiB0eXBlICE9IFNSUF9SRVNQT05TRSAmJgorICAgICAgICAgdHlwZSAhPSBTUlBfUkVKRUNUICYmIHR5cGUgIT0gU1JQX0FDQ0VQVCAmJgorICAgICAgICAgdHlwZSAhPSBTUlBfQ0hBTExFTkdFICYmIHR5cGUgIT0gU1JQX1BBUkFNUyAmJgorICAgICAgICAgdHlwZSAhPSBTUlBfQVVUSCkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgaWYgKGxlbiA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2Ugc3RybGVuKCkgZm9yIGxlbiAqLworICAgICAgICBsZW4gPSBzdHJsZW4oKGNoYXIgKiljZCk7CisKKyAgICAvKiBDb25zdHJ1Y3QgTWVzc2FnZSAqLworICAgICpwKysgPSBzc3RlbG5ldCA/IFRFTFFVQUxfUkVQTFkgOiBURUxRVUFMX0lTOworICAgICpwKysgPSBBVVRIVFlQRV9TUlA7CisgICAgKnAgPSBBVVRIX0NMSUVOVF9UT19TRVJWRVI7CisgICAgKnAgfD0gYXV0aF9ob3c7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICpwIHw9IGF1dGhfY3J5cHQ7CisjZW5kaWYKKyAgICBwKys7CisgICAgKnArKyA9IHR5cGU7CisgICAgd2hpbGUgKGxlbi0tID4gMCkgeworICAgICAgICBpZiAoKCpwKysgPSAqY2QrKykgPT0gSUFDKQorICAgICAgICAgICAgKnArKyA9IElBQzsKKyAgICAgICAgfQorICAgICpwKysgPSBJQUM7CisgICAgKnArKyA9IFNFOworCisgICAgLyogSGFuZGxlIFRlbG5ldCBEZWJ1Z2dpbmcgTWVzc2FnZXMgKi8KKyAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBkZWJsZW49cC1zdHJfZGF0YS0yOworICAgICAgICBjaGFyICpzPU5VTEw7CisgICAgICAgIGludCBtb2RlID0gQVVUSF9DTElFTlRfVE9fU0VSVkVSIHwgKGF1dGhfaG93ICYgQVVUSF9IT1dfTUFTSykgfAorICAgICAgICAgICAgYXV0aF9jcnlwdDsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcyA9ICJBVVRIIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzID0gIlJFSkVDVCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcyA9ICJBQ0NFUFQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHMgPSAiQ0hBTExFTkdFIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBzID0gIlJFU1BPTlNFIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBzID0gIkZPUldBUkQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIHMgPSAiRk9SV0FSRF9BQ0NFUFQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIHMgPSAiRk9SV0FSRF9SRUpFQ1QiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHMgPSAiRVhQIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICBzID0gIlBBUkFNUyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNrbWFreG1zZyh0bl9tc2csVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICJURUxORVQgU0VOVCBTQiAiLAorICAgICAgICAgICAgICAgICBURUxPUFQoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSwiICIsCisgICAgICAgICAgICAgICAgIHN0cl9kYXRhWzNdID09IFRFTFFVQUxfUkVQTFkgPyAiUkVQTFkiIDoKKyAgICAgICAgICAgICAgICAgc3RyX2RhdGFbM10gPT0gVEVMUVVBTF9JUyA/ICJJUyIgOiAiPz8/IiwiICIsCisgICAgICAgICAgICAgICAgIEFVVEhUWVBFX05BTUUoYXV0aGVudGljYXRpb25fdmVyc2lvbiksIiAiLAorICAgICAgICAgICAgICAgICBBVVRITU9ERV9OQU1FKG1vZGUpLCIgIiwKKyAgICAgICAgICAgICAgICAgcywiICIsTlVMTCk7CisgICAgICAgIHRuX2hleCgoQ0hBUiAqKXRuX21zZyxUTl9NU0dfTEVOLCZzdHJfZGF0YVs3XSxkZWJsZW4tNyk7CisgICAgICAgIGNrc3RybmNhdCh0bl9tc2csIklBQyBTRSIsVE5fTVNHX0xFTik7CisgICAgICAgIGRlYnVnKEYxMDAsdG5fbXNnLCIiLDApOworICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnKTsKKyAgICB9CisKKyAgICAvKiBTZW5kIGRhdGEgKi8KKyNpZmRlZiBPUzIKKyAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorICAgIHJjID0gdHRvbCgoQ0hBUiAqKXN0cl9kYXRhLCBwIC0gc3RyX2RhdGEpOworI2lmZGVmIE9TMgorICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgcmV0dXJuKHJjKTsKK30KKworI2lmZGVmIENLX0VOQ1JZUFRJT04KKy8qCisgKiBGdW5jdGlvbjogRW5hYmxlIG9yIGRpc2FibGUgdGhlIGVuY3J5cHRpb24gcHJvY2Vzcy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgICBlbmFibGUgLSBUUlVFIHRvIGVuYWJsZSwgRkFMU0UgdG8gZGlzYWJsZS4KKyAqLworc3RhdGljIFZPSUQKKyNpZmRlZiBDS19BTlNJQworYXV0aF9lbmNyeXB0X2VuYWJsZShCT09MIGVuYWJsZSkKKyNlbHNlCithdXRoX2VuY3J5cHRfZW5hYmxlKGVuYWJsZSkgQk9PTCBlbmFibGU7CisjZW5kaWYKK3sKKyAgZW5jcnlwdF9mbGFnID0gZW5hYmxlOworfQorI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbjogQWJvcnQgdGhlIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MKKyAqCisgKiBQYXJhbWV0ZXJzOgorICovCitzdGF0aWMgVk9JRAorI2lmZGVmIENLX0FOU0lDCithdXRoX2Fib3J0KGNoYXIgKmVycm1zZywgbG9uZyByKQorI2Vsc2UKK2F1dGhfYWJvcnQoZXJybXNnLHIpIGNoYXIgKmVycm1zZzsgbG9uZyByOworI2VuZGlmCit7CisgICAgY2hhciBidWZbOV07CisgICAgZXh0ZXJuIGludCBzc3RlbG5ldDsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX1NUQVJUX1RMUykuc3RhcnRfdGxzLm1lX2ZvbGxvd3MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICBkZWJ1ZyhGMTExLCJhdXRoX2Fib3J0IixlcnJtc2cscik7CisKKyAgICAvKiBDb25zdHJ1Y3QgVGVsbmV0IERlYnVnZ2luZyBtZXNzYWdlcyAqLworICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICBja21ha3htc2codG5fbXNnLFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSwKKyAgICAgICAgICAgICAgICAgICIgSVMgIixBVVRIVFlQRV9OQU1FKEFVVEhUWVBFX05VTEwpLCIgIiwKKyAgICAgICAgICAgICAgICAgICBBVVRIVFlQRV9OQU1FKEFVVEhUWVBFX05VTEwpLCIgSUFDIFNFIiwKKyAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwKKyAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgZGVidWcoRjEwMCx0bl9tc2csIiIsMCk7CisgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgIH0KKworICAgIC8qIENvbnN0cnVjdCB0aGUgQWJvcnQgbWVzc2FnZSB0byBzZW5kIHRvIHRoZSBob3N0ICAgKi8KKyAgICAvKiBCYXNpY2x5IHdlIGNoYW5nZSB0aGUgYXV0aGVudGljYXRpb24gdHlwZSB0byBOVUxMICovCisgICAgc3ByaW50ZihidWYsICIlYyVjJWMlYyVjJWMlYyVjIiwgSUFDLCBTQiwgVEVMT1BUX0FVVEhFTlRJQ0FUSU9OLAorICAgICAgICAgICAgIHNzdGVsbmV0ID8gVEVMUVVBTF9SRVBMWSA6IFRFTFFVQUxfSVMsIEFVVEhUWVBFX05VTEwsCisgICAgICAgICAgICAgQVVUSFRZUEVfTlVMTCwgSUFDLCBTRSk7ICAgLyogc2FmZSAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisgICAgdHRvbCgoQ0hBUiAqKWJ1ZiwgOCk7CisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKworICAgIC8qIElmIHRoZXJlIGlzIGFuIGVycm9yIG1lc3NhZ2UsIGFuZCBlcnJvciBudW1iZXIgY29uc3RydWN0ICovCisgICAgLyogYW4gZXhwbGFuYXRpb24gdG8gZGlzcGxheSB0byB0aGUgdXNlciAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoZXJybXNnICE9IE5VTEwpIHsKKyAgICAgICAgY2tzdHJuY3B5KHN0clRtcCwgZXJybXNnLCBBVVRIVE1QQkwpOworICAgIH0gZWxzZQorICAgICAgICBzdHJUbXBbMF0gPSAnXDAnOworCisKKyAgICBpZiAociAhPSBBVVRIX1NVQ0NFU1MpIHsKKyAgICAgICAgY2tzdHJuY2F0KHN0clRtcCwgIlxyXG4iLEFVVEhUTVBCTCk7CisjaWZkZWYgS1JCNAorICAgICAgICBpZiAoIGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gPT0gQVVUSFRZUEVfS0VSQkVST1NfVjQgKSB7CisgICAgICAgICAgICBja3N0cm5jYXQoc3RyVG1wLCAoY2hhciAqKWtyYl9nZXRfZXJyX3RleHRfZW50cnkociksCisgICAgICAgICAgICAgICAgICAgICAgIEFVVEhUTVBCTCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJhdXRoX2Fib3J0IiwoY2hhciAqKWtyYl9nZXRfZXJyX3RleHRfZW50cnkocikscik7CisgICAgICAgIH0KKyNlbmRpZgorI2lmZGVmIEtSQjUKKyAgICAgICAgaWYgKCBhdXRoZW50aWNhdGlvbl92ZXJzaW9uID09IEFVVEhUWVBFX0tFUkJFUk9TX1Y1ICkgeworICAgICAgICAgICAgY2tzdHJuY2F0KHN0clRtcCwgZXJyb3JfbWVzc2FnZShyKSxBVVRIVE1QQkwpOworICAgICAgICAgICAgZGVidWcoRjExMSwiYXV0aF9hYm9ydCIsZXJyb3JfbWVzc2FnZShyKSxyKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHByaW50ZigiQXV0aGVudGljYXRpb24gZmFpbGVkOiAlc1xyXG4iLHN0clRtcCk7CisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX0xJICYmIGNreGxvZ2dpbmcpIHsKKyAgICAgICAgY2tzeXNsb2coU1lTTEdfTEksIDAsICJUZWxuZXQgYXV0aGVudGljYXRpb24gZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAoY2hhciAqKSBzelVzZXJOYW1lUmVxdWVzdGVkLAorICAgICAgICAgICAgICAgICAgc3RyVG1wKTsKKyAgICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyAgICBhdXRoZW50aWNhdGlvbl92ZXJzaW9uID0gQVVUSFRZUEVfTlVMTDsKK30KKworCisvKgorICogRnVuY3Rpb246IENvcHkgZGF0YSB0byBidWZmZXIsIGRvdWJsaW5nIElBQyBjaGFyYWN0ZXIgaWYgcHJlc2VudC4KKyAqCisgKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCitjb3B5X2Zvcl9uZXQodW5zaWduZWQgY2hhciAqdG8sIHVuc2lnbmVkIGNoYXIgKmZyb20sIGludCBjKQorI2Vsc2UKK2NvcHlfZm9yX25ldCh0byxmcm9tLGMpIHVuc2lnbmVkIGNoYXIgKnRvOyB1bnNpZ25lZCBjaGFyICpmcm9tOyBpbnQgYzsKKyNlbmRpZgoreworICAgIGludCBuOworCisgICAgbiA9IGM7CisgICAgZGVidWcoRjExMSwiY29weV9mb3JfbmV0IiwiYmVmb3JlIixuKTsKKyAgICB3aGlsZSAoYy0tID4gMCkgeworICAgICAgICBpZiAoKCp0bysrID0gKmZyb20rKykgPT0gSUFDKSB7CisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAqdG8rKyA9IElBQzsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJjb3B5X2Zvcl9uZXQiLCJhZnRlciIsbik7CisgICAgcmV0dXJuIG47Cit9CisKKyNpZmRlZiBDS19TU0wKKy8qICBTIEUgTiBEIFMgUyBMIEEgVSBUIEggUyBCCisgKiAgU2VuZCBhIFNTTCBBdXRoZW50aWNhdGlvbiBTdWJuZWdvdGlhdGlvbiB0byBob3N0IGFuZAorICogIG91dHB1dCBhcHByb3ByaWF0ZSBUZWxuZXQgRGVidWcgbWVzc2FnZXMKKyAqCisgKiAgdHlwZSAtIFN1YiBOZWdvdGlhdGlvbiB0eXBlCisgKiAgZGF0YSAtIHB0ciB0byBidWZmZXIgY29udGFpbmluZyBkYXRhCisgKiAgbGVuICAtIGxlbiBvZiBidWZmZXIgaWYgbm90IE5VTCB0ZXJtaW5hdGVkCisgKgorICogIHJldHVybnMgbnVtYmVyIG9mIGNoYXJhY3RlcnMgc2VudCBvciBlcnJvciB2YWx1ZQorICovCisKK2ludAorI2lmZGVmIENLX0FOU0lDCitTZW5kU1NMQXV0aFNCKGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgbGVuKQorI2Vsc2UKK1NlbmRTU0xBdXRoU0IodHlwZSxkYXRhLGxlbikgaW50IHR5cGU7IHZvaWQgKmRhdGE7IGludCBsZW47CisjZW5kaWYKK3sKKyAgICBpbnQgcmM7CisgICAgdW5zaWduZWQgY2hhciAqcCA9IHN0cl9kYXRhICsgMzsKKyAgICB1bnNpZ25lZCBjaGFyICpjZCA9ICh1bnNpZ25lZCBjaGFyICopZGF0YTsKKyAgICBleHRlcm4gaW50IHNzdGVsbmV0OworCisgICAgLyogQ2hlY2sgZm9yIGludmFsaWQgdmFsdWVzICovCisgICAgaWYgKCB0eXBlICE9IFNTTF9TVEFSVCAmJiB0eXBlICE9IFNTTF9BQ0NFUFQgJiYKKyAgICAgICAgIHR5cGUgIT0gU1NMX1JFSkVDVCkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykgeworICAgICAgICBpZiAodHRjaGsoKSA8IDApCisgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworICAgIGlmIChsZW4gPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlIHN0cmxlbigpIGZvciBsZW4gKi8KKyAgICAgICAgbGVuID0gc3RybGVuKChjaGFyICopY2QpOworCisgICAgLyogQ29uc3RydWN0IE1lc3NhZ2UgKi8KKyAgICAqcCsrID0gc3N0ZWxuZXQgPyBURUxRVUFMX1JFUExZIDogVEVMUVVBTF9JUzsKKyAgICAqcCsrID0gQVVUSFRZUEVfU1NMOworICAgICpwID0gQVVUSF9DTElFTlRfVE9fU0VSVkVSOworICAgICpwIHw9IGF1dGhfaG93OworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAqcCB8PSBhdXRoX2NyeXB0OworI2VuZGlmCisgICAgcCsrOworICAgICpwKysgPSB0eXBlOworICAgIHdoaWxlIChsZW4tLSA+IDApIHsKKyAgICAgICAgaWYgKCgqcCsrID0gKmNkKyspID09IElBQykKKyAgICAgICAgICAgICpwKysgPSBJQUM7CisgICAgICAgIH0KKyAgICAqcCsrID0gSUFDOworICAgICpwKysgPSBTRTsKKworICAgIC8qIEhhbmRsZSBUZWxuZXQgRGVidWdnaW5nIE1lc3NhZ2VzICovCisgICAgaWYgKGRlYmxvZyB8fCB0bl9kZWIgfHwgZGVic2VzKSB7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgZGVibGVuPXAtc3RyX2RhdGEtMjsKKyAgICAgICAgY2hhciAqcz1OVUxMOworICAgICAgICBpbnQgbW9kZSA9IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiB8IChhdXRoX2hvdyAmIEFVVEhfSE9XX01BU0spIHwKKyAgICAgICAgICAgIChhdXRoX2NyeXB0P0FVVEhfRU5DUllQVF9VU0lOR19URUxPUFQ6QVVUSF9FTkNSWVBUX09GRik7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgU1NMX1NUQVJUOgorICAgICAgICAgICAgcyA9ICJTVEFSVCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTU0xfQUNDRVBUOgorICAgICAgICAgICAgcyA9ICJBQ0NFUFQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1NMX1JFSkVDVDoKKyAgICAgICAgICAgIHMgPSAiUkVKRUNUIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2ttYWt4bXNnKHRuX21zZyxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsCisgICAgICAgICAgICAgICAgIFRFTE9QVChURUxPUFRfQVVUSEVOVElDQVRJT04pLCIgIiwKKyAgICAgICAgICAgICAgICAgc3RyX2RhdGFbM10gPT0gVEVMUVVBTF9SRVBMWSA/ICJSRVBMWSIgOgorICAgICAgICAgICAgICAgICBzdHJfZGF0YVszXSA9PSBURUxRVUFMX0lTID8gIklTIiA6ICI/Pz8iLCIgIiwKKyAgICAgICAgICAgICAgICAgQVVUSFRZUEVfTkFNRShhdXRoZW50aWNhdGlvbl92ZXJzaW9uKSwiICIsCisgICAgICAgICAgICAgICAgIEFVVEhNT0RFX05BTUUobW9kZSksIiAiLAorICAgICAgICAgICAgICAgICBzLCIgIixOVUxMKTsKKyAgICAgICAgdG5faGV4KChDSEFSICopdG5fbXNnLFROX01TR19MRU4sJnN0cl9kYXRhWzddLGRlYmxlbi03KTsKKyAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiSUFDIFNFIixUTl9NU0dfTEVOKTsKKyAgICAgICAgZGVidWcoRjEwMCx0bl9tc2csIiIsMCk7CisgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgIH0KKworICAgIC8qIFNlbmQgZGF0YSAqLworI2lmZGVmIE9TMgorICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisgICAgcmMgPSB0dG9sKChDSEFSICopc3RyX2RhdGEsIHAgLSBzdHJfZGF0YSk7CisjaWZkZWYgT1MyCisgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICByZXR1cm4ocmMpOworfQorI2VuZGlmICAvKiBDS19TU0wgKi8KKworaW50Cit0bl9ob3dfb2soaW50IGhvdykKK3sKKyAgICBzd2l0Y2ggKCB0bl9hdXRoX2hvdyApIHsKKyAgICBjYXNlIFROX0FVVEhfSE9XX0FOWToKKyAgICAgICAgcmV0dXJuKDEpOworICAgIGNhc2UgVE5fQVVUSF9IT1dfT05FX1dBWToKKyAgICAgICAgcmV0dXJuKChob3cgJiBBVVRIX0hPV19NQVNLKSA9PSBBVVRIX0hPV19PTkVfV0FZKTsKKyAgICBjYXNlIFROX0FVVEhfSE9XX01VVFVBTDoKKyAgICAgICAgcmV0dXJuKChob3cgJiBBVVRIX0hPV19NQVNLKSA9PSBBVVRIX0hPV19NVVRVQUwpOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybigwKTsKKyAgICB9Cit9CisKK2ludAordG5fZW5jX29rKGludCBlbmMpCit7CisgICAgc3dpdGNoICggdG5fYXV0aF9lbmMgKSB7CisgICAgY2FzZSBUTl9BVVRIX0VOQ19BTlk6CisgICAgICAgIGlmICgoZW5jICYgQVVUSF9FTkNSWVBUX01BU0spID09IEFVVEhfRU5DUllQVF9TVEFSVF9UTFMgJiYKKyAgICAgICAgICAgICghY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICAgfHwgIXNzbF9maW5pc2hlZF9tZXNzYWdlcyB8fAorICAgICAgICAgICAgICEodGxzX2FjdGl2ZV9mbGFnIHx8IHNzbF9hY3RpdmVfZmxhZykKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICApKSB7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICBpZiAoIXNzbF9maW5pc2hlZF9tZXNzYWdlcykKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ0bl9lbmNfb2sgIXNzbF9maW5pc2hlZF9tZXNzYWdlcyIsIiIsMCk7CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKDEpOworICAgIGNhc2UgVE5fQVVUSF9FTkNfTk9ORToKKyAgICAgICAgcmV0dXJuKChlbmMgJiBBVVRIX0VOQ1JZUFRfTUFTSykgPT0gQVVUSF9FTkNSWVBUX09GRik7CisgICAgY2FzZSBUTl9BVVRIX0VOQ19URUxPUFQ6CisgICAgICAgIHJldHVybigoZW5jICYgQVVUSF9FTkNSWVBUX01BU0spID09IEFVVEhfRU5DUllQVF9VU0lOR19URUxPUFQpOworICAgIGNhc2UgVE5fQVVUSF9FTkNfRVhDSDoKKyAgICAgICAgcmV0dXJuKChlbmMgJiBBVVRIX0VOQ1JZUFRfTUFTSykgPT0gQVVUSF9FTkNSWVBUX0FGVEVSX0VYQ0hBTkdFKTsKKyAgICBjYXNlIFROX0FVVEhfRU5DX1RMUzoKKyAgICAgICAgcmV0dXJuKCgoZW5jICYgQVVUSF9FTkNSWVBUX01BU0spID09IEFVVEhfRU5DUllQVF9TVEFSVF9UTFMpICYmCisgICAgICAgICAgICAgICBja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICYmIHNzbF9maW5pc2hlZF9tZXNzYWdlcyAmJgorICAgICAgICAgICAgICAgKHRsc19hY3RpdmVfZmxhZyB8fCBzc2xfYWN0aXZlX2ZsYWcpCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KK30KKworc3RhdGljIGludAorYXRvayhpbnQgYXQpIHsKKyAgICBpbnQgaTsKKyAgICBpZiAoIGF1dGhfdHlwZV91c2VyWzBdID09IEFVVEhUWVBFX0FVVE8gKQorICAgICAgICByZXR1cm4oMSk7CisgICAgaWYgKCBhdXRoX3R5cGVfdXNlclswXSA9PSBBVVRIVFlQRV9OVUxMICkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgZm9yICggaT0wOworICAgICAgICAgIGk8QVVUSFRZUExTVFNaICYmIGF1dGhfdHlwZV91c2VyW2ldICE9IEFVVEhUWVBFX05VTEw7CisgICAgICAgICAgaSsrICkgeworICAgICAgICBpZiAoIGF1dGhfdHlwZV91c2VyW2ldID09IGF0ICkKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyAgICByZXR1cm4oMCk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uOiBQYXJzZSBhdXRoZW50aWNhdGlvbiBzZW5kIGNvbW1hbmQKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogIHBhcnNlZGF0IC0gdGhlIHN1Yi1jb21tYW5kIGRhdGEuCisgKgorICogICAgICBlbmRfc3ViIC0gaW5kZXggb2YgdGhlIGNoYXJhY3RlciBpbiB0aGUgJ3BhcnNlZGF0JyBhcnJheSB3aGljaAorICogICAgICAgICAgICAgIGlzIHRoZSBsYXN0IGJ5dGUgaW4gYSBzdWItbmVnb3RpYXRpb24KKyAqCisgKiBSZXR1cm5zOiBLZXJiZXJvcyBlcnJvciBjb2RlLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNlbmRfbGlzdFs1MTJdOworc3RhdGljIGludCAgc2VuZF9sZW4gPSAwOworCitfUFJPVE9UWVAoc3RhdGljIGludCBhdXRoX3NlbmQsICh1bnNpZ25lZCBjaGFyICpwYXJzZWRhdCwgaW50IGVuZF9zdWIpKTsKKworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCithdXRoX3Jlc2VuZChpbnQgdHlwZSkKKyNlbHNlCithdXRoX3Jlc2VuZCh0eXBlKSBpbnQgdHlwZTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGludCBpPTI7CisgICAgd2hpbGUgKGkrMSA8PSBzZW5kX2xlbikgeworICAgICAgICBpZiAoc2VuZF9saXN0W2ldID09IHR5cGUpIHsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgc2VuZF9sZW4gLT0gMjsKKyAgICAgICAgICAgIGZvciAoaiA9IGk7IGogPCBzZW5kX2xlbjsgaisrKQorICAgICAgICAgICAgICAgIHNlbmRfbGlzdFtqXSA9IHNlbmRfbGlzdFtqKzJdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaSArPSAyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybihhdXRoX3NlbmQoc2VuZF9saXN0LHNlbmRfbGVuKSk7Cit9CisKK3N0YXRpYyBpbnQKKyNpZmRlZiBDS19BTlNJQworYXV0aF9zZW5kKHVuc2lnbmVkIGNoYXIgKnBhcnNlZGF0LCBpbnQgZW5kX3N1YikKKyNlbHNlCithdXRoX3NlbmQocGFyc2VkYXQsZW5kX3N1YikgdW5zaWduZWQgY2hhciAqcGFyc2VkYXQ7IGludCBlbmRfc3ViOworI2VuZGlmCit7CisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmWzQwOTZdOworICAgIHVuc2lnbmVkIGNoYXIgKnBuYW1lOworICAgIGludCBwbGVuOworICAgIGludCByOworICAgIGludCBpOworICAgIGludCBtb2RlOworI2lmZGVmIE1JVF9DVVJSRU5UCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIGtyYjVfZGF0YSBkYXRhOworICAgIGtyYjVfZW5jX2RhdGEgZW5jZGF0YTsKKyAgICBrcmI1X2Vycm9yX2NvZGUgY29kZTsKKyAgICBrcmI1X2tleWJsb2NrIHJhbmRvbV9rZXk7CisjZW5kaWYgLyogRU5DUllQVElPTiAqLworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisjaWZkZWYgS1JCNQorICAgIGludCBrcmI1X21zZyA9IDA7CisjZW5kaWYgLyogS1JCNSAqLworI2lmZGVmIEtSQjQKKyAgICBpbnQga3JiNF9tc2cgPSAwOworI2VuZGlmIC8qIEtSQjQgKi8KKyNpZmRlZiBHU1NBUElfS1JCNQorICAgIGludCBnc3NrNV9tc2cgPSAwOworI2VuZGlmIC8qIEdTU0FQSV9LUkI1ICovCisgICAgaW50IGlhY2NudD0wOworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKFRFTE9QVF9TQihURUxPUFRfU1RBUlRfVExTKS5zdGFydF90bHMubWVfZm9sbG93cykKKyAgICAgICAgcmV0dXJuKEFVVEhfU1VDQ0VTUyk7CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICBhdXRoX2hvdyA9IC0xOyAgICAgICAgICAgICAgLyogV2UgaGF2ZSBub3QgZm91bmQgYW4gYXV0aCBtZXRob2QgICovCisgICAgYXV0aF9jcnlwdCA9IDA7ICAgICAgICAgICAgIC8qIFdlIGFyZSBub3QgdXNpbmcgZW5jcnlwdGlvbiAoeWV0KSAqLworICAgIHNlbmRfbGVuID0gZW5kX3N1YiA+IDUxMiA/IDUxMiA6IGVuZF9zdWI7CisgICAgbWVtY3B5KHNlbmRfbGlzdCxwYXJzZWRhdCxzZW5kX2xlbik7CisKKyAgICAvKiBTZWFyY2ggdGhlIGxpc3Qgb2YgYWNjZXB0YWJsZSBBdXRoZW50aWNhdGlvbiB0eXBlcyBzZW50IGZyb20gKi8KKyAgICAvKiB0aGUgaG9zdCBhbmQgZmluZCBvbmUgdGhhdCB3ZSBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8qIEZvciBLZXJiZXJvcyBhdXRoZW50aWNhdGlvbnMsIHRyeSB0byBkZXRlcm1pbmUgaWYgd2UgaGF2ZSBhICAqLworICAgIC8qIHZhbGlkIFRHVCwgaWYgbm90IHNraXAgb3ZlciB0aGUgYXV0aGVudGljYXRpb24gdHlwZSBiZWNhdXNlICAqLworICAgIC8qIHdlIHdvdWxkbid0IGJlIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IGxvZ2luIGFueXdheS4gIFBlcmhhcHMgICAqLworICAgIC8qIHRoZXJlIGlzIGFub3RoZXIgc3VwcG9ydGVkIGF1dGhlbnRpY2F0aW9uIHdoaWNoIHdlIGNvdWxkIHVzZSAqLworCisjaWZkZWYgTk9fRlRQX0FVVEgKKyAgICAvKiBJZiB0aGUgdXNlcmlkIGlzICJmdHAiIG9yICJhbm9ueW1vdXMiIHJlZnVzZSB0byBwZXJmb3JtIEFVVEggKi8KKyAgICAvKiBmb3IgS2VyYmVyb3Mgb3IgU1JQLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAvKiBOT19GVFBfQVVUSCAqLworCisgICAgaWYgKCBhdXRoX3R5cGVfdXNlclswXSA9PSBBVVRIVFlQRV9BVVRPICkgeworICAgIGZvciAoaSA9IDI7IGkrMSA8PSBlbmRfc3ViOyBpICs9IDIpIHsKKyNpZmRlZiBOVExNCisgICAgICAgIGlmIChwYXJzZWRhdFtpXSA9PSBBVVRIVFlQRV9OVExNICYmCisgICAgICAgICAgICAgY2tfbnRsbV9pc192YWxpZCgxKSAmJgorICAgICAgICAgICAgIG50bG1fYXV0aF9zZW5kKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKChwYXJzZWRhdFtpKzFdICYgQVVUSF9XSE9fTUFTSykgPT0gQVVUSF9DTElFTlRfVE9fU0VSVkVSICYmCisgICAgICAgICAgICAgICAgIHRuX2hvd19vayhwYXJzZWRhdFtpKzFdKSAmJiB0bl9lbmNfb2socGFyc2VkYXRbaSsxXSkpIHsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgLyogTlRMTSBkb2VzIG5vdCBzdXBwb3J0IFRlbG5ldCBFbmNyeXB0aW9uICovCisgICAgICAgICAgICAgICAgaWYgKChwYXJzZWRhdFtpKzFdICYgQVVUSF9FTkNSWVBUX01BU0spKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBhdXRoX2NyeXB0ID0gcGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gPSBBVVRIVFlQRV9OVExNOworICAgICAgICAgICAgICAgIGF1dGhfaG93ID0gcGFyc2VkYXRbaSsxXSAmIEFVVEhfSE9XX01BU0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBOVExNICovCisjaWZkZWYgQ0tfU1NMCisgICAgICAgIGlmICggcGFyc2VkYXRbaV0gPT0gQVVUSFRZUEVfU1NMICYmIHNzbF9pbml0aWFsaXplZCAmJgorI2lmZGVmIFNTTERMTAorICAgICAgICAgICAgIGNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSAmJgorI2VuZGlmIC8qIFNTTERMTCAqLworICAgICAgICAgICAgICF0bHNfYWN0aXZlX2ZsYWcgJiYgIXNzbF9hY3RpdmVfZmxhZworI2lmbmRlZiBVU0VfQ0VSVF9DQgorICAgICAgICAgICAgICYmIHRsc19sb2FkX2NlcnRzKHNzbF9jdHgsc3NsX2NvbiwwKQorI2VuZGlmIC8qIFVTRV9DRVJUX0NCICovCisgICAgICAgICAgICAgKSB7CisKKyAgICAgICAgICAgIGlmICgocGFyc2VkYXRbaSsxXSAmIEFVVEhfV0hPX01BU0spID09IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiAmJgorICAgICAgICAgICAgICAgICB0bl9ob3dfb2socGFyc2VkYXRbaSsxXSkgJiYgdG5fZW5jX29rKHBhcnNlZGF0W2krMV0pKSB7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgICAgIC8qIFNTTCBkb2VzIG5vdCBzdXBwb3J0IFRlbG5ldCBFbmNyeXB0aW9uICovCisgICAgICAgICAgICAgICAgaWYgKChwYXJzZWRhdFtpKzFdICYgQVVUSF9FTkNSWVBUX01BU0spKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBhdXRoX2NyeXB0ID0gcGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gPSBBVVRIVFlQRV9TU0w7CisgICAgICAgICAgICAgICAgYXV0aF9ob3cgPSBwYXJzZWRhdFtpKzFdICYgQVVUSF9IT1dfTUFTSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIFNTTCAqLworI2lmZGVmIENLX1NSUAorICAgICAgICBpZiAoIHBhcnNlZGF0W2ldID09IEFVVEhUWVBFX1NSUAorI2lmZGVmIFNSUERMTAorICAgICAgICAgICAgICYmIGhTUlAKKyNlbmRpZiAvKiBTUlBETEwgKi8KKyNpZmRlZiBOT19GVFBfQVVUSAorICAgICAgICAgICAgICYmIHN0cmNtcCgiZnRwIixzelVzZXJOYW1lKSAmJiBzdHJjbXAoImFub255bW91cyIsc3pVc2VyTmFtZSkKKyNlbmRpZiAvKiBOT19GVFBfQVVUSCAqLworICAgICAgICAgICAgICkgeworICAgICAgICAgICAgaWYgKChwYXJzZWRhdFtpKzFdICYgQVVUSF9XSE9fTUFTSykgPT0gQVVUSF9DTElFTlRfVE9fU0VSVkVSICYmCisgICAgICAgICAgICAgICAgIHRuX2hvd19vayhwYXJzZWRhdFtpKzFdKSAmJiB0bl9lbmNfb2socGFyc2VkYXRbaSsxXSkpIHsKKyNpZmRlZiBQUkVfU1JQXzFfNF81CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlZGF0W2krMV0gJiBBVVRIX0VOQ1JZUFRfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgIC8qIERvIG5vdCBzdXBwb3J0IEVOQ1JZUFRfVVNJTkdfVEVMT1BUIHlldC4gKi8KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisjZW5kaWYgLyogUFJFX1NSUF8xXzRfNSAqLworICAgICAgICAgICAgICAgIGlmICgoKHBhcnNlZGF0W2krMV0gJiBBVVRIX0VOQ1JZUFRfTUFTSykgPT0KKyAgICAgICAgICAgICAgICAgICAgIEFVVEhfRU5DUllQVF9VU0lOR19URUxPUFQpICYmCisgICAgICAgICAgICAgICAgICAgIChURUxPUFRfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPT0gVE5fTkdfUkYgfHwKKyAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID09IFROX05HX1JGKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBhdXRoX2NyeXB0ID0gcGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLOworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgICAgICBpZiAoIGF1dGhfY3J5cHQgPT0gQVVUSF9FTkNSWVBUX1VTSU5HX1RFTE9QVCApIHsKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfTVU7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfTVU7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICBpZiAoIGF1dGhfY3J5cHQgPT0gQVVUSF9FTkNSWVBUX1NUQVJUX1RMUyAmJgorICAgICAgICAgICAgICAgICAgICAgY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAodGxzX2FjdGl2ZV9mbGFnIHx8IHNzbF9hY3RpdmVfZmxhZykgKSB7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICAgICAgICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl92ZXJzaW9uID0gQVVUSFRZUEVfU1JQOworICAgICAgICAgICAgICAgIGF1dGhfaG93ID0gcGFyc2VkYXRbaSsxXSAmIEFVVEhfSE9XX01BU0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBTUlAgKi8KKyNpZmRlZiBHU1NBUElfS1JCNQorICAgICAgICBpZiAocGFyc2VkYXRbaV0gPT0gQVVUSFRZUEVfR1NTQVBJX0tSQjUgJiYKKyAgICAgICAgICAgIChwYXJzZWRhdFtpKzFdICYgQVVUSF9FTkNSWVBUX01BU0spID09CisgICAgICAgICAgICBBVVRIX0VOQ1JZUFRfQUZURVJfRVhDSEFOR0UgJiYKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGhHU1NBUEkgJiYKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBOT19GVFBfQVVUSAorICAgICAgICAgICAgIHN0cmNtcCgiZnRwIixzelVzZXJOYW1lKSAmJiBzdHJjbXAoImFub255bW91cyIsc3pVc2VyTmFtZSkgJiYKKyNlbmRpZiAvKiBOT19GVFBfQVVUSCAqLworICAgICAgICAgICAgIGNrX2dzc2FwaV9pc19pbnN0YWxsZWQoKSAmJiAhZ3NzazVfbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICFnc3NrNV9hdXRoX3NlbmQocGFyc2VkYXRbaSsxXSAmIEFVVEhfSE9XX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZGF0W2krMV0gJiBJTklfQ1JFRF9GV0RfTUFTSykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIElmIHdlIGFyZSBhdXRvLWdldHRpbmcgVEdUcywgdHJ5ICovCisgICAgICAgICAgICAgICAgaWYgKCAhY2tfa3JiNV9pc190Z3RfdmFsaWQoKSApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIktlcmJlcm9zIDU6IFRpY2tldCBHZXR0aW5nIFRpY2tldCBub3QgdmFsaWQuXHJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnc3NrNV9tc2cgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHBhcnNlZGF0W2krMV0gJiBBVVRIX1dIT19NQVNLKSA9PQorICAgICAgICAgICAgICAgICAgICAgIEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiAmJgorICAgICAgICAgICAgICAgICAgICAgIHRuX2hvd19vayhwYXJzZWRhdFtpKzFdKSAmJiB0bl9lbmNfb2socGFyc2VkYXRbaSsxXSkpIHsKKyAgICAgICAgICAgICAgICBhdXRoX2NyeXB0ID0gcGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLOworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgICAgICBpZiAoIGF1dGhfY3J5cHQgPT0gQVVUSF9FTkNSWVBUX0FGVEVSX0VYQ0hBTkdFICkgeworICAgICAgICAgICAgICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICAgICAgICAgIGF1dGhfZndkID0gcGFyc2VkYXRbaSsxXSAmIElOSV9DUkVEX0ZXRF9NQVNLOworICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gPSBBVVRIVFlQRV9HU1NBUElfS1JCNTsKKyAgICAgICAgICAgICAgICBhdXRoX2hvdyA9IHBhcnNlZGF0W2krMV0gJiBBVVRIX0hPV19NQVNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogR1NTQVBJX0tSQjUgKi8KKyNpZmRlZiBLUkI1CisgICAgICAgIGlmIChwYXJzZWRhdFtpXSA9PSBBVVRIVFlQRV9LRVJCRVJPU19WNSAmJgorI2lmZGVmIE9TMgorICAgICAgICAgICAgIGhLUkI1XzMyICYmCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgTk9fRlRQX0FVVEgKKyAgICAgICAgICAgICBzdHJjbXAoImZ0cCIsc3pVc2VyTmFtZSkgJiYgc3RyY21wKCJhbm9ueW1vdXMiLHN6VXNlck5hbWUpICYmCisjZW5kaWYgLyogTk9fRlRQX0FVVEggKi8KKyAgICAgICAgICAgICBja19rcmI1X2lzX2luc3RhbGxlZCgpICYmICFrcmI1X21zZykgeworCisgICAgICAgICAgICAvKiBXaXRob3V0IGVuY3J5cHRpb24gd2UgY2FuJ3QgcGVyZm9ybSBtdXR1YWwgYXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGlmICggKHBhcnNlZGF0W2krMV0gJiBBVVRIX0hPV19NQVNLKSA9PSBBVVRIX0hPV19NVVRVQUwgJiYKKyAgICAgICAgICAgICAgICAgIWNrX2NyeXB0X2lzX2luc3RhbGxlZCgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvKiBTa2lwIG92ZXIgZW50cmllcyB0aGF0IHJlcXVlc3QgY3JlZGVudGlhbCBmb3J3YXJkaW5nICovCisgICAgICAgICAgICAvKiBpZiB3ZSBhcmUgbm90IGZvcndhcmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKCFmb3J3YXJkX2ZsYWcgJiYgKHBhcnNlZGF0W2krMV0gJiBJTklfQ1JFRF9GV0RfTUFTSykpIHx8CisgICAgICAgICAgICAgICAgKGZvcndhcmRfZmxhZyAmJgorICAgICAgICAgICAgICAgICAgKChwYXJzZWRhdFtpKzFdICYgQVVUSF9IT1dfTUFTSykgPT0gQVVUSF9IT1dfT05FX1dBWSkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoICFrNV9hdXRoX3NlbmQocGFyc2VkYXRbaSsxXSAmIEFVVEhfSE9XX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZGF0W2krMV0gJiBBVVRIX0VOQ1JZUFRfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkYXRbaSsxXSAmIElOSV9DUkVEX0ZXRF9NQVNLKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSWYgd2UgYXJlIGF1dG8tZ2V0dGluZyBUR1RzLCB0cnkgKi8KKyAgICAgICAgICAgICAgICBpZiAoICFja19rcmI1X2lzX3RndF92YWxpZCgpICkgeworICAgICAgICAgICAgICAgIHByaW50ZigiS2VyYmVyb3MgNTogVGlja2V0IEdldHRpbmcgVGlja2V0IG5vdCB2YWxpZC5cclxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGtyYjVfbXNnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChwYXJzZWRhdFtpKzFdICYgQVVUSF9XSE9fTUFTSykgPT0KKyAgICAgICAgICAgICAgICAgICAgICBBVVRIX0NMSUVOVF9UT19TRVJWRVIgJiYKKyAgICAgICAgICAgICAgICAgICAgICB0bl9ob3dfb2socGFyc2VkYXRbaSsxXSkgJiYgdG5fZW5jX29rKHBhcnNlZGF0W2krMV0pKSB7CisgICAgICAgICAgICAgICAgaWYgKCgocGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLKSA9PQorICAgICAgICAgICAgICAgICAgICAgQVVUSF9FTkNSWVBUX1VTSU5HX1RFTE9QVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIChURUxPUFRfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPT0gVE5fTkdfUkYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPT0gVE5fTkdfUkYpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoKChwYXJzZWRhdFtpKzFdICYgQVVUSF9FTkNSWVBUX01BU0spID09CisgICAgICAgICAgICAgICAgICAgICBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTKSAmJgorICAgICAgICAgICAgICAgICAgICAgKCFja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgISh0bHNfYWN0aXZlX2ZsYWcgfHwgc3NsX2FjdGl2ZV9mbGFnKQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGF1dGhfY3J5cHQgPSBwYXJzZWRhdFtpKzFdICYgQVVUSF9FTkNSWVBUX01BU0s7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgICAgIGlmICggYXV0aF9jcnlwdCA9PSBBVVRIX0VOQ1JZUFRfVVNJTkdfVEVMT1BUICkgeworICAgICAgICAgICAgICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19NVTsKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19NVTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICAgIGlmICggYXV0aF9jcnlwdCA9PSBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTICYmCisgICAgICAgICAgICAgICAgICAgICBja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICh0bHNfYWN0aXZlX2ZsYWcgfHwgc3NsX2FjdGl2ZV9mbGFnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICAgIGF1dGhfZndkID0gcGFyc2VkYXRbaSsxXSAmIElOSV9DUkVEX0ZXRF9NQVNLOworICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gPSBBVVRIVFlQRV9LRVJCRVJPU19WNTsKKyAgICAgICAgICAgICAgICBhdXRoX2hvdyA9IHBhcnNlZGF0W2krMV0gJiBBVVRIX0hPV19NQVNLOworICAgICAgICAgICAgICAgIGlmICggYXV0aF9ob3cgPT0gQVVUSF9IT1dfT05FX1dBWSApIHsKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogS1JCNSAqLworI2lmZGVmIEtSQjQKKyAgICAgICAgaWYgKHBhcnNlZGF0W2ldID09IEFVVEhUWVBFX0tFUkJFUk9TX1Y0ICYmCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgaEtSQjRfMzIgJiYKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBOT19GVFBfQVVUSAorICAgICAgICAgICAgIHN0cmNtcCgiZnRwIixzelVzZXJOYW1lKSAmJiBzdHJjbXAoImFub255bW91cyIsc3pVc2VyTmFtZSkgJiYKKyNlbmRpZiAvKiBOT19GVFBfQVVUSCAqLworICAgICAgICAgICAgIGNrX2tyYjRfaXNfaW5zdGFsbGVkKCkgJiYgIWtyYjRfbXNnKSB7CisgICAgICAgICAgICBpbnQgcmMgPSAwOworCisgICAgICAgICAgICAvKiBXaXRob3V0IGVuY3J5cHRpb24gd2UgY2FuJ3QgcGVyZm9ybSBtdXR1YWwgYXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGlmICggKHBhcnNlZGF0W2krMV0gJiBBVVRIX0hPV19NQVNLKSA9PSBBVVRIX0hPV19NVVRVQUwgJiYKKyAgICAgICAgICAgICAgICAgIWNrX2NyeXB0X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKCAhazRfYXV0aF9zZW5kKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIElmIHdlIGFyZSBhdXRvLWdldHRpbmcgVEdUcywgdHJ5ICovCisgICAgICAgICAgICAgICAgaWYgKCAhY2tfa3JiNF9pc190Z3RfdmFsaWQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJLZXJiZXJvcyA0OiBUaWNrZXQgR2V0dGluZyBUaWNrZXQgbm90IHZhbGlkLlxyXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAga3JiNF9tc2cgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHBhcnNlZGF0W2krMV0gJiBBVVRIX1dIT19NQVNLKSA9PQorICAgICAgICAgICAgICAgICAgICAgIEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiAmJgorICAgICAgICAgICAgICAgICAgICAgIHRuX2hvd19vayhwYXJzZWRhdFtpKzFdKSAmJiB0bl9lbmNfb2socGFyc2VkYXRbaSsxXSkpIHsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgaWYgKChwYXJzZWRhdFtpKzFdICYgQVVUSF9FTkNSWVBUX01BU0spICYmCisgICAgICAgICAgICAgICAgICAgICAoVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID09IFROX05HX1JGIHx8CisgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID09IFROX05HX1JGKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgYXV0aF9jcnlwdCA9IHBhcnNlZGF0W2krMV0gJiBBVVRIX0VOQ1JZUFRfTUFTSzsKKyAgICAgICAgICAgICAgICBpZiAoIGF1dGhfY3J5cHQgPT0gQVVUSF9FTkNSWVBUX1VTSU5HX1RFTE9QVCApIHsKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfTVU7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfTVU7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl92ZXJzaW9uID0gQVVUSFRZUEVfS0VSQkVST1NfVjQ7CisgICAgICAgICAgICAgICAgYXV0aF9ob3cgPSBwYXJzZWRhdFtpKzFdICYgQVVUSF9IT1dfTUFTSzsKKyAgICAgICAgICAgICAgICBpZiAoIGF1dGhfaG93ID09IEFVVEhfSE9XX09ORV9XQVkgKSB7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICAgICAgICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIEtSQjQgKi8KKyAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMjsgaSsxIDw9IGVuZF9zdWI7IGkgKz0gMikgeworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgaWYgKCBhdG9rKEFVVEhUWVBFX1NTTCkgJiYgcGFyc2VkYXRbaV0gPT0gQVVUSFRZUEVfU1NMICYmCisjaWZkZWYgU1NMRExMCisgICAgICAgICAgICAgICAgIGNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSAmJgorI2VuZGlmIC8qIFNTTERMTCAqLworICAgICAgICAgICAgICAgICAhdGxzX2FjdGl2ZV9mbGFnICYmICFzc2xfYWN0aXZlX2ZsYWcgJiYgc3NsX2luaXRpYWxpemVkCisjaWZuZGVmIFVTRV9DRVJUX0NCCisgICAgICAgICAgICAgICAgICYmIHRsc19sb2FkX2NlcnRzKHNzbF9jdHgsc3NsX2NvbiwwKQorI2VuZGlmIC8qIFVTRV9DRVJUX0NCICovCisgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBhcnNlZGF0W2krMV0gJiBBVVRIX1dIT19NQVNLKSA9PSBBVVRIX0NMSUVOVF9UT19TRVJWRVIgJiYKKyAgICAgICAgICAgICAgICAgICAgIHRuX2hvd19vayhwYXJzZWRhdFtpKzFdKSAmJiB0bl9lbmNfb2socGFyc2VkYXRbaSsxXSkpIHsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgICAgIC8qIFNTTCBkb2VzIG5vdCBzdXBwb3J0IFRlbG5ldCBFbmNyeXB0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmICgocGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBhdXRoX2NyeXB0ID0gcGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gPSBBVVRIVFlQRV9TU0w7CisgICAgICAgICAgICAgICAgICAgIGF1dGhfaG93ID0gcGFyc2VkYXRbaSsxXSAmIEFVVEhfSE9XX01BU0s7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBTU0wgKi8KKyNpZmRlZiBDS19TUlAKKyAgICAgICAgICAgIGlmICggYXRvayhBVVRIVFlQRV9TUlApICYmCisgICAgICAgICAgICAgICAgIHBhcnNlZGF0W2ldID09IEFVVEhUWVBFX1NSUAorI2lmZGVmIFNSUERMTAorICAgICAgICAgICAgICAgICAmJiBoU1JQCisjZW5kaWYgLyogU1JQRExMICovCisjaWZkZWYgTk9fRlRQX0FVVEgKKyAgICAgICAgICAgICAgICAgJiYgc3RyY21wKCJmdHAiLHN6VXNlck5hbWUpICYmIHN0cmNtcCgiYW5vbnltb3VzIixzelVzZXJOYW1lKQorI2VuZGlmIC8qIE5PX0ZUUF9BVVRIICovCisgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGlmICgocGFyc2VkYXRbaSsxXSAmIEFVVEhfV0hPX01BU0spID09IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiAmJgorICAgICAgICAgICAgICAgICAgICAgdG5faG93X29rKHBhcnNlZGF0W2krMV0pICYmIHRuX2VuY19vayhwYXJzZWRhdFtpKzFdKSkgeworI2lmZGVmIFBSRV9TUlBfMV80XzUKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgLyogRG8gbm90IHN1cHBvcnQgRU5DUllQVF9VU0lOR19URUxPUFQgeWV0LiAqLworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbmRpZiAvKiBQUkVfU1JQXzFfNF81ICovCisgICAgICAgICAgICAgICAgaWYgKCgocGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLKSA9PQorICAgICAgICAgICAgICAgICAgICAgQVVUSF9FTkNSWVBUX1VTSU5HX1RFTE9QVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIChURUxPUFRfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPT0gVE5fTkdfUkYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPT0gVE5fTkdfUkYpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoKChwYXJzZWRhdFtpKzFdICYgQVVUSF9FTkNSWVBUX01BU0spID09CisgICAgICAgICAgICAgICAgICAgICBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTKSAmJgorICAgICAgICAgICAgICAgICAgICAgKCFja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgISh0bHNfYWN0aXZlX2ZsYWcgfHwgc3NsX2FjdGl2ZV9mbGFnKQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgYXV0aF9jcnlwdCA9IHBhcnNlZGF0W2krMV0gJiBBVVRIX0VOQ1JZUFRfTUFTSzsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgICAgIGlmICggYXV0aF9jcnlwdCA9PSBBVVRIX0VOQ1JZUFRfVVNJTkdfVEVMT1BUICkgeworICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfTVU7CisgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX01VOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICAgIGlmICggYXV0aF9jcnlwdCA9PSBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTICYmCisgICAgICAgICAgICAgICAgICAgICBja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICh0bHNfYWN0aXZlX2ZsYWcgfHwgc3NsX2FjdGl2ZV9mbGFnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl92ZXJzaW9uID0gQVVUSFRZUEVfU1JQOworICAgICAgICAgICAgICAgICAgICBhdXRoX2hvdyA9IHBhcnNlZGF0W2krMV0gJiBBVVRIX0hPV19NQVNLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogU1JQICovCisjaWZkZWYgR1NTQVBJX0tSQjUKKyAgICAgICAgaWYgKGF0b2soQVVUSFRZUEVfR1NTQVBJX0tSQjUpICYmCisgICAgICAgICAgICBwYXJzZWRhdFtpXSA9PSBBVVRIVFlQRV9HU1NBUElfS1JCNSAmJgorICAgICAgICAgICAgKHBhcnNlZGF0W2krMV0gJiBBVVRIX0VOQ1JZUFRfTUFTSykgPT0KKyAgICAgICAgICAgIEFVVEhfRU5DUllQVF9BRlRFUl9FWENIQU5HRSAmJgorI2lmZGVmIE9TMgorICAgICAgICAgICAgaEdTU0FQSSAmJgorI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIE5PX0ZUUF9BVVRICisgICAgICAgICAgICBzdHJjbXAoImZ0cCIsc3pVc2VyTmFtZSkgJiYgc3RyY21wKCJhbm9ueW1vdXMiLHN6VXNlck5hbWUpICYmCisjZW5kaWYgLyogTk9fRlRQX0FVVEggKi8KKyAgICAgICAgICAgIGNrX2dzc2FwaV9pc19pbnN0YWxsZWQoKSAmJiAhZ3NzazVfbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICFnc3NrNV9hdXRoX3NlbmQocGFyc2VkYXRbaSsxXSAmIEFVVEhfSE9XX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZGF0W2krMV0gJiBJTklfQ1JFRF9GV0RfTUFTSykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIElmIHdlIGFyZSBhdXRvLWdldHRpbmcgVEdUcywgdHJ5ICovCisgICAgICAgICAgICAgICAgaWYgKCAhY2tfa3JiNV9pc190Z3RfdmFsaWQoKSApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIktlcmJlcm9zIDU6IFRpY2tldCBHZXR0aW5nIFRpY2tldCBub3QgdmFsaWQuXHJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnc3NrNV9tc2cgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHBhcnNlZGF0W2krMV0gJiBBVVRIX1dIT19NQVNLKSA9PQorICAgICAgICAgICAgICAgICAgICAgIEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiAmJgorICAgICAgICAgICAgICAgICAgICAgIHRuX2hvd19vayhwYXJzZWRhdFtpKzFdKSAmJiB0bl9lbmNfb2socGFyc2VkYXRbaSsxXSkpIHsKKyAgICAgICAgICAgICAgICBhdXRoX2NyeXB0ID0gcGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLOworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgICAgICBpZiAoIGF1dGhfY3J5cHQgPT0gQVVUSF9FTkNSWVBUX0FGVEVSX0VYQ0hBTkdFICkgeworICAgICAgICAgICAgICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICAgICAgICAgIGF1dGhfZndkID0gcGFyc2VkYXRbaSsxXSAmIElOSV9DUkVEX0ZXRF9NQVNLOworICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gPSBBVVRIVFlQRV9HU1NBUElfS1JCNTsKKyAgICAgICAgICAgICAgICBhdXRoX2hvdyA9IHBhcnNlZGF0W2krMV0gJiBBVVRIX0hPV19NQVNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogR1NTQVBJX0tSQjUgKi8KKyNpZmRlZiBLUkI1CisgICAgICAgICAgICBpZiAoIGF0b2soQVVUSFRZUEVfS0VSQkVST1NfVjUpICYmCisgICAgICAgICAgICAgICAgIHBhcnNlZGF0W2ldID09IEFVVEhUWVBFX0tFUkJFUk9TX1Y1ICYmCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgIGhLUkI1XzMyICYmCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgTk9fRlRQX0FVVEgKKyAgICAgICAgICAgICAgICAgc3RyY21wKCJmdHAiLHN6VXNlck5hbWUpICYmIHN0cmNtcCgiYW5vbnltb3VzIixzelVzZXJOYW1lKSAmJgorI2VuZGlmIC8qIE5PX0ZUUF9BVVRIICovCisgICAgICAgICAgICAgICAgIGNrX2tyYjVfaXNfaW5zdGFsbGVkKCkgJiYgIWtyYjVfbXNnKSB7CisKKyAgICAgICAgICAgICAgICAvKiBXaXRob3V0IGVuY3J5cHRpb24gd2UgY2FuJ3QgcGVyZm9ybSBtdXR1YWwgYXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoIChwYXJzZWRhdFtpKzFdICYgQVVUSF9IT1dfTUFTSykgPT0gQVVUSF9IT1dfTVVUVUFMICYmCisgICAgICAgICAgICAgICAgICAgICAhY2tfY3J5cHRfaXNfaW5zdGFsbGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgLyogU2tpcCBvdmVyIGVudHJpZXMgdGhhdCByZXF1ZXN0IGNyZWRlbnRpYWwgZm9yd2FyZGluZyAqLworICAgICAgICAgICAgICAgIC8qIGlmIHdlIGFyZSBub3QgZm9yd2FyZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKCFmb3J3YXJkX2ZsYWcgJiYgKHBhcnNlZGF0W2krMV0gJiBJTklfQ1JFRF9GV0RfTUFTSykpIHx8CisgICAgICAgICAgICAgICAgICAgICAoZm9yd2FyZF9mbGFnICYmCisgICAgICAgICAgICAgICAgICAgICAgICgocGFyc2VkYXRbaSsxXSAmIEFVVEhfSE9XX01BU0spID09IEFVVEhfSE9XX09ORV9XQVkpKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAoICFrNV9hdXRoX3NlbmQocGFyc2VkYXRbaSsxXSAmIEFVVEhfSE9XX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRhdFtpKzFdICYgQVVUSF9FTkNSWVBUX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRhdFtpKzFdICYgSU5JX0NSRURfRldEX01BU0spICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIGFyZSBhdXRvLWdldHRpbmcgVEdUcywgdHJ5ICovCisgICAgICAgICAgICAgICAgICAgIGlmICggIWNrX2tyYjVfaXNfdGd0X3ZhbGlkKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2VyYmVyb3MgNTogVGlja2V0IEdldHRpbmcgVGlja2V0IG5vdCB2YWxpZC5cclxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga3JiNV9tc2cgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgocGFyc2VkYXRbaSsxXSAmIEFVVEhfV0hPX01BU0spID09CisgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICB0bl9ob3dfb2socGFyc2VkYXRbaSsxXSkgJiYgdG5fZW5jX29rKHBhcnNlZGF0W2krMV0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgocGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhfRU5DUllQVF9VU0lOR19URUxPUFQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9PSBUTl9OR19SRiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPT0gVE5fTkdfUkYpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKHBhcnNlZGF0W2krMV0gJiBBVVRIX0VOQ1JZUFRfTUFTSykgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICghY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKHRsc19hY3RpdmVfZmxhZyB8fCBzc2xfYWN0aXZlX2ZsYWcpCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGF1dGhfY3J5cHQgPSBwYXJzZWRhdFtpKzFdICYgQVVUSF9FTkNSWVBUX01BU0s7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aF9jcnlwdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfTVU7CisgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX01VOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICAgICAgICBpZiAoIGF1dGhfY3J5cHQgPT0gQVVUSF9FTkNSWVBUX1NUQVJUX1RMUyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIGNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICh0bHNfYWN0aXZlX2ZsYWcgfHwgc3NsX2FjdGl2ZV9mbGFnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl92ZXJzaW9uID0gQVVUSFRZUEVfS0VSQkVST1NfVjU7CisgICAgICAgICAgICAgICAgICAgIGF1dGhfaG93ID0gcGFyc2VkYXRbaSsxXSAmIEFVVEhfSE9XX01BU0s7CisgICAgICAgICAgICAgICAgICAgIGlmICggYXV0aF9ob3cgPT0gQVVUSF9IT1dfT05FX1dBWSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogS1JCNSAqLworI2lmZGVmIEtSQjQKKyAgICAgICAgICAgIGlmICggYXRvayhBVVRIVFlQRV9LRVJCRVJPU19WNCkgJiYKKyAgICAgICAgICAgICAgICAgcGFyc2VkYXRbaV0gPT0gQVVUSFRZUEVfS0VSQkVST1NfVjQgJiYKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgaEtSQjRfMzIgJiYKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBOT19GVFBfQVVUSAorICAgICAgICAgICAgICAgICBzdHJjbXAoImZ0cCIsc3pVc2VyTmFtZSkgJiYgc3RyY21wKCJhbm9ueW1vdXMiLHN6VXNlck5hbWUpICYmCisjZW5kaWYgLyogTk9fRlRQX0FVVEggKi8KKyAgICAgICAgICAgICAgICAgY2tfa3JiNF9pc19pbnN0YWxsZWQoKSAmJiAha3JiNF9tc2cpIHsKKyAgICAgICAgICAgICAgICBpbnQgcmMgPSAwOworCisgICAgICAgICAgICAgICAgLyogV2l0aG91dCBlbmNyeXB0aW9uIHdlIGNhbid0IHBlcmZvcm0gbXV0dWFsIGF1dGhlbnRpY2F0aW9uICovCisgICAgICAgICAgICAgICAgaWYgKCAocGFyc2VkYXRbaSsxXSAmIEFVVEhfSE9XX01BU0spID09IEFVVEhfSE9XX01VVFVBTCAmJgorICAgICAgICAgICAgICAgICAgICAgIWNrX2NyeXB0X2lzX2luc3RhbGxlZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmICggIWs0X2F1dGhfc2VuZCgpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIGFyZSBhdXRvLWdldHRpbmcgVEdUcywgdHJ5ICovCisgICAgICAgICAgICAgICAgICAgIGlmICggIWNrX2tyYjRfaXNfdGd0X3ZhbGlkKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiS2VyYmVyb3MgNDogVGlja2V0IEdldHRpbmcgVGlja2V0IG5vdCB2YWxpZC5cclxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga3JiNF9tc2cgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgocGFyc2VkYXRbaSsxXSAmIEFVVEhfV0hPX01BU0spID09CisgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICB0bl9ob3dfb2socGFyc2VkYXRbaSsxXSkgJiYgdG5fZW5jX29rKHBhcnNlZGF0W2krMV0pKQorICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgICAgIGlmICgocGFyc2VkYXRbaSsxXSAmIEFVVEhfRU5DUllQVF9NQVNLKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9PSBUTl9OR19SRiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID09IFROX05HX1JGKSkKKyAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgYXV0aF9jcnlwdCA9IHBhcnNlZGF0W2krMV0gJiBBVVRIX0VOQ1JZUFRfTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGhfY3J5cHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX01VOworICAgICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19NVTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb25fdmVyc2lvbiA9IEFVVEhUWVBFX0tFUkJFUk9TX1Y0OworICAgICAgICAgICAgICAgICAgICBhdXRoX2hvdyA9IHBhcnNlZGF0W2krMV0gJiBBVVRIX0hPV19NQVNLOworICAgICAgICAgICAgICAgICAgICBpZiAoIGF1dGhfaG93ID09IEFVVEhfSE9XX09ORV9XQVkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8qIEtSQjQgKi8KKyNpZmRlZiBOVExNCisgICAgICAgIGlmICggYXRvayhBVVRIVFlQRV9OVExNKSAmJgorICAgICAgICAgICAgIHBhcnNlZGF0W2ldID09IEFVVEhUWVBFX05UTE0gJiYKKyAgICAgICAgICAgICBja19udGxtX2lzX3ZhbGlkKDEpICYmCisgICAgICAgICAgICAgbnRsbV9hdXRoX3NlbmQoKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKHBhcnNlZGF0W2krMV0gJiBBVVRIX1dIT19NQVNLKSA9PSBBVVRIX0NMSUVOVF9UT19TRVJWRVIgJiYKKyAgICAgICAgICAgICAgICAgdG5faG93X29rKHBhcnNlZGF0W2krMV0pICYmIHRuX2VuY19vayhwYXJzZWRhdFtpKzFdKSkgeworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgICAgICAvKiBOVExNIGRvZXMgbm90IHN1cHBvcnQgVGVsbmV0IEVuY3J5cHRpb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoKHBhcnNlZGF0W2krMV0gJiBBVVRIX0VOQ1JZUFRfTUFTSykpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGF1dGhfY3J5cHQgPSBwYXJzZWRhdFtpKzFdICYgQVVUSF9FTkNSWVBUX01BU0s7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb25fdmVyc2lvbiA9IEFVVEhUWVBFX05UTE07CisgICAgICAgICAgICAgICAgYXV0aF9ob3cgPSBwYXJzZWRhdFtpKzFdICYgQVVUSF9IT1dfTUFTSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIE5UTE0gKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhdXRoX2hvdyA9PSAtMSkgeyAgICAgICAgICAgICAgIC8qIERpZCB3ZSBmaW5kIG9uZT8gKi8KKyAgICAgICAgc3dpdGNoICggYXV0aF90eXBlX3VzZXJbMF0gKSB7ICAvKiBJZiBub3QsIGFib3J0IHRoZSBuZWdvdGlhdGlvbiAqLworICAgICAgICBjYXNlIEFVVEhUWVBFX05VTEw6CisgICAgICAgICAgICBhdXRoX2Fib3J0KCJVc2VyIHJlZnVzZWQgdG8gYWNjZXB0IGFueSBhdXRoZW50aWNhdGlvbiBtZXRob2QiLDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVUSFRZUEVfQVVUTzoKKyAgICAgICAgICAgIGF1dGhfYWJvcnQoIk5vIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBhdmFpbGFibGUiLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBjaGFyIG1zZ1s4MF07CisgICAgICAgICAgICBja21ha21zZyhtc2csODAsQVVUSFRZUEVfTkFNRShhdXRoX3R5cGVfdXNlclswXSksCisgICAgICAgICAgICAgICAgICAgICAgIiBjb3VsZCBub3QgYmUgbmVnb3RpYXRlZCIsTlVMTCxOVUxMCisgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgYXV0aF9hYm9ydChtc2csIDApOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisgICAgfQorCisgICAgcHJpbnRmKCJBdXRoZW50aWNhdGluZyB3aXRoICVzXHJcbiIsCisgICAgICAgICAgICBBVVRIVFlQRV9OQU1FKGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24pKTsKKworICAgIC8qIFNlbmQgVGVsbmV0IEF1dGggTmFtZSBtZXNzYWdlIChpZiBuZWNlc3NhcnkpICovCisgICAgc3dpdGNoICggYXV0aGVudGljYXRpb25fdmVyc2lvbiApIHsKKyAgICBjYXNlIEFVVEhUWVBFX1NSUDoKKyAgICBjYXNlIEFVVEhUWVBFX0tFUkJFUk9TX1Y0OgorICAgIGNhc2UgQVVUSFRZUEVfS0VSQkVST1NfVjU6CisgICAgY2FzZSBBVVRIVFlQRV9HU1NBUElfS1JCNToKKyAgICAgICAgLyogaWYgd2UgZG8gbm90IGhhdmUgYSBuYW1lIHRvIGxvZ2luIHdpdGggZ2V0IG9uZSBub3cuICovCisgICAgICAgIHdoaWxlICggc3pVc2VyTmFtZVswXSA9PSAnXDAnICkgeworICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiB0bl9wcl91aWQ7CisgICAgICAgICAgICBpbnQgb2sgPSB1cV90eHQoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgIHRuX3ByX3VpZCAmJiB0bl9wcl91aWRbMF0gPyB0bl9wcl91aWQgOiAiSG9zdCBVc2VyaWQ6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCwgc3pVc2VyTmFtZSwgNjMsIE5VTEwsREVGQVVMVF9VUV9USU1FT1VUKTsKKyAgICAgICAgICAgIGlmICggIW9rICkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIHBsZW4gPSBzdHJsZW4oc3pVc2VyTmFtZSk7CisgICAgICAgIHBuYW1lID0gKHVuc2lnbmVkIGNoYXIgKikgc3pVc2VyTmFtZTsKKworICAgICAgICAvKiBDb25zdHJ1Y3QgVGVsbmV0IERlYnVnZ2luZyBNZXNzYWdlICovCisgICAgICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICAgICAgY2ttYWt4bXNnKHRuX21zZyxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIiBOQU1FICIsKGNoYXIgKilwbmFtZSwiIElBQyBTRSIsTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLHRuX21zZywiIiwwKTsKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29uc3RydWN0IGFuZCBzZW5kIEF1dGhlbnRpY2F0aW9uIE5hbWUgc3VibmVnb3RpYXRpb24gKi8KKyAgICAgICAgaWYgKCBwbGVuIDwgc2l6ZW9mKGJ1ZikgLSA2ICkgeworICAgICAgICAgICAgc3ByaW50ZigoY2hhciAqKWJ1ZiwgIiVjJWMlYyVjIiwgSUFDLCBTQiwgCisgICAgICAgICAgICAgICAgICAgICBURUxPUFRfQVVUSEVOVElDQVRJT04sCisgICAgICAgICAgICAgICAgICAgICBURUxRVUFMX05BTUUpOworICAgICAgICAgICAgbWVtY3B5KCZidWZbNF0sIHBuYW1lLCBwbGVuKTsgICAgICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICBzcHJpbnRmKChjaGFyICopJmJ1ZltwbGVuICsgNF0sICIlYyVjIiwgSUFDLCBTRSk7ICAgLyogc2FmZSAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyAgICAgICAgICAgIHR0b2woKENIQVIgKilidWYsIHBsZW4rNik7CisjaWZkZWYgT1MyCisgICAgICAgICAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3ByaW50ZigoY2hhciAqKWJ1ZiwgIiVjJWMlYyVjJWMlYyIsIElBQywgU0IsIAorICAgICAgICAgICAgICAgICAgICAgVEVMT1BUX0FVVEhFTlRJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAgVEVMUVVBTF9OQU1FLCBJQUMsIFNFKTsgICAgLyogc2FmZSAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyAgICAgICAgICAgIHR0b2woKENIQVIgKilidWYsIDYpOworI2lmZGVmIE9TMgorICAgICAgICAgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENvbnN0cnVjdCBBdXRoZW50aWNhdGlvbiBNb2RlIHN1Ym5lZ290aWF0aW9uIG1lc3NhZ2UgKGlmIG5lY2Vzc2FyeSkgKi8KKyAgICBzd2l0Y2ggKCBhdXRoZW50aWNhdGlvbl92ZXJzaW9uICkgeworICAgIGNhc2UgQVVUSFRZUEVfU1JQOgorICAgIGNhc2UgQVVUSFRZUEVfS0VSQkVST1NfVjQ6CisgICAgY2FzZSBBVVRIVFlQRV9LRVJCRVJPU19WNToKKyAgICBjYXNlIEFVVEhUWVBFX0dTU0FQSV9LUkI1OgorICAgIGNhc2UgQVVUSFRZUEVfTlRMTToKKyAgICAgICAgbW9kZSA9IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiB8IChhdXRoX2hvdyAmIEFVVEhfSE9XX01BU0spIHwgYXV0aF9jcnlwdAorI2lmZGVmIFVTRV9JTklfQ1JFRF9GV0QKKyAgICAgICAgICAgICAgIHwgKCgoYXV0aGVudGljYXRpb25fdmVyc2lvbiA9PSBBVVRIVFlQRV9LRVJCRVJPU19WNSkgJiYKKyAgICAgICAgICAgICAgICAgIGF1dGhfZndkKT9JTklfQ1JFRF9GV0RfT046SU5JX0NSRURfRldEX09GRikKKyNlbmRpZiAvKiBVU0VfSU5JX0NSRURfRldEICovCisgICAgICAgICAgICAgICA7CisgICAgICAgIHNwcmludGYoKGNoYXIgKilidWYsICIlYyVjJWMlYyVjJWMlYyIsCisgICAgICAgICAgICAgICAgIElBQywgU0IsIFRFTE9QVF9BVVRIRU5USUNBVElPTiwKKyAgICAgICAgICAgICAgICAgVEVMUVVBTF9JUywKKyAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb25fdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgS1JCX0FVVEgpOyAgICAgLyogc2FmZSAqLworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBTZW5kIGluaXRpYWwgYXV0aGVudGljYXRpb24gZGF0YSAqLworICAgIHN3aXRjaCAoIGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gKSB7CisjaWZkZWYgQ0tfU1NMCisgICAgY2FzZSBBVVRIVFlQRV9TU0w6CisgICAgICAgIFNlbmRTU0xBdXRoU0IoU1NMX1NUQVJULE5VTEwsMCk7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFNTTCAqLworI2lmZGVmIENLX1NSUAorICAgIGNhc2UgQVVUSFRZUEVfU1JQOgorICAgICAgICBzcHJpbnRmKCZidWZbN10sICIlYyVjIiwgSUFDLCBTRSk7ICAgICAgLyogc2FmZSAqLworICAgICAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgICAgIGNrbWFreG1zZyh0bl9tc2csVE5fTVNHX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAiVEVMTkVUIFNFTlQgU0IgIixURUxPUFQoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAiIElTICIsQVVUSFRZUEVfTkFNRShhdXRoZW50aWNhdGlvbl92ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAiIEFVVEggIixBVVRITU9ERV9OQU1FKG1vZGUpLCIgSUFDIFNFIiwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLHRuX21zZywiIiwwKTsKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgICAgICB9CisjaWZkZWYgT1MyCisgICAgICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisgICAgICAgIHR0b2woKENIQVIgKilidWYsIDkpOworI2lmZGVmIE9TMgorICAgICAgICBSZWxlYXNlVGVsbmV0TXV0ZXgoKTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBTUlAgKi8KKyNpZmRlZiBOVExNCisgICAgY2FzZSBBVVRIVFlQRV9OVExNOiB7CisgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgIGZvciAoIGk9MCA7IGk8TlRMTVNlY0J1ZlswXS5jYkJ1ZmZlciA7IGkrKyApIHsKKyAgICAgICAgICAgIGlmICggKChjaGFyICopTlRMTVNlY0J1ZlswXS5wdkJ1ZmZlcilbaV0gPT0gSUFDICkKKyAgICAgICAgICAgICAgICBpYWNjbnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKCAyKnNpemVvZihVTE9ORykgKyBOVExNU2VjQnVmWzBdLmNiQnVmZmVyICsgaWFjY250ICsgMTApICA8CisgICAgICAgICAgICAgc2l6ZW9mKGJ1ZikgKSB7CisgICAgICAgICAgICBsZW5ndGggPSBjb3B5X2Zvcl9uZXQoJmJ1Zls3XSwoY2hhciAqKSZOVExNU2VjQnVmWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKnNpemVvZihVTE9ORykpOworICAgICAgICAgICAgbGVuZ3RoICs9IGNvcHlfZm9yX25ldCgmYnVmWzcrbGVuZ3RoXSwgTlRMTVNlY0J1ZlswXS5wdkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVExNU2VjQnVmWzBdLmNiQnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBzcHJpbnRmKCZidWZbNytsZW5ndGhdLCAiJWMlYyIsIElBQywgU0UpOworCisgICAgICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBja21ha3htc2codG5fbXNnLFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9BVVRIRU5USUNBVElPTiksCisgICAgICAgICAgICAgICAgICAgICAgIiBJUyAiLEFVVEhUWVBFX05BTUUoYXV0aGVudGljYXRpb25fdmVyc2lvbiksIiAiLAorICAgICAgICAgICAgICAgICAgICAgIEFVVEhNT0RFX05BTUUobW9kZSksIiBOVExNX0FVVEggIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMCisgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHRuX2hleCgoY2hhciAqKXRuX21zZyxUTl9NU0dfTEVOLCZidWZbN10sbGVuZ3RoKTsKKyAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csIklBQyBTRSIsVE5fTVNHX0xFTik7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLHRuX21zZywiIiwwKTsKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgICAgICB9CisjaWZkZWYgT1MyCisgICAgICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisgICAgICAgIHR0b2woKENIQVIgKilidWYsIGxlbmd0aCs5KTsKKyNpZmRlZiBPUzIKKyAgICAgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIE5UTE0gKi8KKyNpZmRlZiBLUkI0CisgICAgY2FzZSBBVVRIVFlQRV9LRVJCRVJPU19WNDoKKyAgICAgICAgZm9yICggaT0wIDsgaTxrNF9hdXRoLmxlbmd0aCA7IGkrKyApIHsKKyAgICAgICAgICAgIGlmICggazRfYXV0aC5kYXRbaV0gPT0gSUFDICkKKyAgICAgICAgICAgICAgICBpYWNjbnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggazRfYXV0aC5sZW5ndGggKyBpYWNjbnQgKyAxMCA8IHNpemVvZihidWYpICkKKyAgICAgICAgICBrNF9hdXRoLmxlbmd0aCA9IGNvcHlfZm9yX25ldCgmYnVmWzddLCBrNF9hdXRoLmRhdCwgazRfYXV0aC5sZW5ndGgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBrNF9hdXRoLmxlbmd0aCA9IDA7CisgICAgICAgIHNwcmludGYoJmJ1ZltrNF9hdXRoLmxlbmd0aCs3XSwgIiVjJWMiLCBJQUMsIFNFKTsKKworICAgICAgICBpZiAoZGVibG9nIHx8IHRuX2RlYiB8fCBkZWJzZXMpIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgY2ttYWt4bXNnKHRuX21zZyxUTl9NU0dfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICJURUxORVQgU0VOVCBTQiAiLFRFTE9QVChURUxPUFRfQVVUSEVOVElDQVRJT04pLCIgSVMgIiwKKyAgICAgICAgICAgICAgICAgICAgICBBVVRIVFlQRV9OQU1FKGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24pLCIgIiwKKyAgICAgICAgICAgICAgICAgICAgICBBVVRITU9ERV9OQU1FKG1vZGUpLCIgQVVUSCAiLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTAorICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHRuX2hleCgoY2hhciAqKXRuX21zZyxUTl9NU0dfTEVOLCZidWZbN10sazRfYXV0aC5sZW5ndGgpOworICAgICAgICAgICAgY2tzdHJuY2F0KHRuX21zZywiSUFDIFNFIixUTl9NU0dfTEVOKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsdG5fbXNnLCIiLDApOworICAgICAgICAgICAgaWYgKHRuX2RlYiB8fCBkZWJzZXMpIHRuX2RlYnVnKHRuX21zZyk7CisgICAgICAgIH0KKyNpZmRlZiBPUzIKKyAgICAgICAgUmVxdWVzdFRlbG5ldE11dGV4KCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZW5kaWYKKyAgICAgICAgdHRvbCgoQ0hBUiAqKWJ1ZiwgazRfYXV0aC5sZW5ndGgrOSk7CisjaWZkZWYgT1MyCisgICAgICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisKKyNpZm5kZWYgUkVNT1ZFX0ZPUl9FWFBPUlQKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHdlIGFyZSBkb2luZyBtdXR1YWwgYXV0aGVudGljYXRpb24sIGdldCBzZXQgdXAgdG8gc2VuZAorICAgICAgICAgKiB0aGUgY2hhbGxlbmdlLCBhbmQgdmVyaWZ5IGl0IHdoZW4gdGhlIHJlc3BvbnNlIGNvbWVzIGJhY2suCisgICAgICAgICAqLworICAgICAgICBpZiAoKGF1dGhfaG93ICYgQVVUSF9IT1dfTUFTSykgPT0gQVVUSF9IT1dfTVVUVUFMKSB7CisgICAgICAgICAgICByZWdpc3RlciBpbnQgaTsKKyAgICAgICAgICAgIGludCByYyA9IDA7CisKKyNpZmRlZiBNSVRfQ1VSUkVOVAorICAgICAgICAgICAgZGF0YS5kYXRhID0gY3JlZC5zZXNzaW9uOworICAgICAgICAgICAgZGF0YS5sZW5ndGggPSA4OyAvKiBzaXplb2YoY3JlZC5zZXNzaW9uKSAqLzsKKworICAgICAgICAgICAgaWYgKGNvZGUgPSBrcmI1X2NfcmFuZG9tX3NlZWQoazVfY29udGV4dCwgJmRhdGEpKSB7CisgICAgICAgICAgICAgICAgY29tX2VycigibGlidGVsbmV0IiwgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAid2hpbGUgc2VlZGluZyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciIpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvZGUgPSBrcmI1X2NfbWFrZV9yYW5kb21fa2V5KGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQ1RZUEVfREVTX0NCQ19SQVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5kb21fa2V5KSkgeworICAgICAgICAgICAgICAgIGNvbV9lcnIoImxpYnRlbG5ldCIsIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIndoaWxlIGNyZWF0aW5nIHJhbmRvbSBzZXNzaW9uIGtleSIpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogdGhlIGtyYjQgY29kZSB1c2VzIGVjYiBtb2RlLCBidXQgb24gYSBzaW5nbGUgYmxvY2sKKyAgICAgICAgICAgIHdpdGggYSB6ZXJvIGl2ZWMsIGVjYiBhbmQgY2JjIGFyZSB0aGUgc2FtZSAqLworICAgICAgICAgICAgazRfa3Jia2V5LmVuY3R5cGUgPSBFTkNUWVBFX0RFU19DQkNfUkFXOworICAgICAgICAgICAgazRfa3Jia2V5Lmxlbmd0aCA9IDg7CisgICAgICAgICAgICBrNF9rcmJrZXkuY29udGVudHMgPSBjcmVkLnNlc3Npb247CisKKyAgICAgICAgICAgIGVuY2RhdGEuY2lwaGVydGV4dC5kYXRhID0gcmFuZG9tX2tleS5jb250ZW50czsKKyAgICAgICAgICAgIGVuY2RhdGEuY2lwaGVydGV4dC5sZW5ndGggPSByYW5kb21fa2V5Lmxlbmd0aDsKKyAgICAgICAgICAgIGVuY2RhdGEuZW5jdHlwZSA9IEVOQ1RZUEVfVU5LTk9XTjsKKworICAgICAgICAgICAgZGF0YS5kYXRhID0gazRfc2Vzc2lvbl9rZXk7CisgICAgICAgICAgICBkYXRhLmxlbmd0aCA9IDg7CisKKyAgICAgICAgICAgIGNvZGUgPSBrcmI1X2NfZGVjcnlwdChrNV9jb250ZXh0LCAmazRfa3Jia2V5LCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jZGF0YSwgJmRhdGEpOworCisgICAgICAgICAgICBrcmI1X2ZyZWVfa2V5YmxvY2tfY29udGVudHMoazVfY29udGV4dCwgJnJhbmRvbV9rZXkpOworCisgICAgICAgICAgICBpZiAoY29kZSkgeworICAgICAgICAgICAgICAgIGNvbV9lcnIoImxpYnRlbG5ldCIsIGNvZGUsICJ3aGlsZSBlbmNyeXB0aW5nIHJhbmRvbSBrZXkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVuY2RhdGEuY2lwaGVydGV4dC5kYXRhID0gazRfc2Vzc2lvbl9rZXk7CisgICAgICAgICAgICBlbmNkYXRhLmNpcGhlcnRleHQubGVuZ3RoID0gODsKKyAgICAgICAgICAgIGVuY2RhdGEuZW5jdHlwZSA9IEVOQ1RZUEVfVU5LTk9XTjsKKworICAgICAgICAgICAgZGF0YS5kYXRhID0gazRfY2hhbGxlbmdlOworICAgICAgICAgICAgZGF0YS5sZW5ndGggPSA4OworCisgICAgICAgICAgICBjb2RlID0ga3JiNV9jX2RlY3J5cHQoazVfY29udGV4dCwgJms0X2tyYmtleSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY2RhdGEsICZkYXRhKTsKKyNlbHNlIC8qIE1JVF9DVVJSRU5UICovCisgICAgICAgICAgICBtZW1zZXQoazRfc2NoZWQsMCxzaXplb2YoU2NoZWR1bGUpKTsKKyAgICAgICAgICAgIGhleGR1bXAoImF1dGhfc2VuZCIsY3JlZC5zZXNzaW9uLDgpOworICAgICAgICAgICAgcmMgPSBkZXNfa2V5X3NjaGVkKGNyZWQuc2Vzc2lvbiwgazRfc2NoZWQpOworICAgICAgICAgICAgaWYgKCByYyA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9JbnZhbGlkIERFUyBrZXkgc3BlY2lmaWVkIGluIGNyZWRlbnRpYWxzXHJcbiIpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImF1dGhfc2VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgREVTIEtleSBzcGVjaWZpZWQgaW4gY3JlZGVudGlhbHMiLDApOworICAgICAgICAgICAgfSBlbHNlIGlmICggcmMgPT0gLTIgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/V2VhayBERVMga2V5IHNwZWNpZmllZCBpbiBjcmVkZW50aWFsc1xyXG4iKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJhdXRoX3NlbmQiLAorICAgICAgICAgICAgICAgICAgICAgICJ3ZWFrIERFUyBLZXkgc3BlY2lmaWVkIGluIGNyZWRlbnRpYWxzIiwwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHJjICE9IDAgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/REVTIEtleSBTY2hlZHVsZSBub3Qgc2V0IGJ5IGNyZWRlbnRpYWxzXHJcbiIpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImF1dGhfc2VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgIkRFUyBLZXkgU2NoZWR1bGUgbm90IHNldCBieSBjcmVkZW50aWFscyIsMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoZXhkdW1wKCJhdXRoX3NlbmQgc2NoZWR1bGUiLGs0X3NjaGVkLDgqMTYpOworCisgICAgICAgICAgICBkZXNfc2V0X3JhbmRvbV9nZW5lcmF0b3Jfc2VlZChjcmVkLnNlc3Npb24pOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgZGVzX25ld19yYW5kb21fa2V5KGs0X3Nlc3Npb25fa2V5KTsKKyAgICAgICAgICAgICAgICBkZXNfZml4dXBfa2V5X3Bhcml0eShrNF9zZXNzaW9uX2tleSk7CisgICAgICAgICAgICB9IHdoaWxlICggY2tfZGVzX2lzX3dlYWtfa2V5KGs0X3Nlc3Npb25fa2V5KSApOworCisgICAgICAgICAgICBoZXhkdW1wKCJhdXRoX3NlbmQgZGVzX25ld19yYW5kb21fa2V5KGs0X3Nlc3Npb25fa2V5KSIsCisgICAgICAgICAgICAgICAgICAgICBrNF9zZXNzaW9uX2tleSw4KTsKKworICAgICAgICAgICAgLyogRGVjcnlwdCB0aGUgc2Vzc2lvbiBrZXkgc28gdGhhdCB3ZSBjYW4gc2VuZCBpdCB0byB0aGUgKi8KKyAgICAgICAgICAgIC8qIGhvc3QgYXMgYSBjaGFsbGVuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgTlQKKyAgICAgICAgICAgIGRlc19lY2JfZW5jcnlwdChrNF9zZXNzaW9uX2tleSwgazRfc2Vzc2lvbl9rZXksIGs0X3NjaGVkLCAwKTsKKyNlbHNlIC8qIE5UICovCisgICAgICAgICAgICBkZXNfZWNiX2VuY3J5cHQoJms0X3Nlc3Npb25fa2V5LCAmazRfc2Vzc2lvbl9rZXksIGs0X3NjaGVkLCAwKTsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgaGV4ZHVtcCgKKyAgICAgICAgICAgICAgICAiYXV0aF9zZW5kIGRlc19lY2JfZW5jcnlwdChrNF9zZXNzaW9uX2tleSxrNF9zZXNzaW9uX2tleSwwKSIsCisgICAgICAgICAgICAgICAgazRfc2Vzc2lvbl9rZXksOAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgLyogUHJlcGFyZSB0aGUgcmVzdWx0IG9mIHRoZSBjaGFsbGVuZ2UgKi8KKyAgICAgICAgICAgIC8qIERlY3J5cHQgdGhlIHNlc3Npb25fa2V5LCBhZGQgMSwgYW5kIHRoZW4gZW5jcnlwdCBpdCAqLworICAgICAgICAgICAgLyogVGhlIHJlc3VsdCBzdG9yZWQgaW4gazRfY2hhbGxlbmdlIHNob3VsZCBtYXRjaCB0aGUgICovCisgICAgICAgICAgICAvKiBLUkI0X1JFU1BPTlNFIHZhbHVlIGZyb20gdGhlIGhvc3QuICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBOVAorICAgICAgICAgICAgZGVzX2VjYl9lbmNyeXB0KGs0X3Nlc3Npb25fa2V5LCBrNF9jaGFsbGVuZ2UsIGs0X3NjaGVkLCAwKTsKKyNlbHNlIC8qIE5UICovCisgICAgICAgICAgICBkZXNfZWNiX2VuY3J5cHQoJms0X3Nlc3Npb25fa2V5LCAmazRfY2hhbGxlbmdlLCBrNF9zY2hlZCwgMCk7CisjZW5kaWYgLyogTlQgKi8KKworICAgICAgICAgICAgaGV4ZHVtcCgiYXV0aF9zZW5kIGRlc19lY2JfZW5jcnlwdChrNF9zZXNzaW9uX2tleSxrNF9jaGFsbGVuZ2UsMCkiLAorICAgICAgICAgICAgICAgICAgICAgazRfY2hhbGxlbmdlLDgpOworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgKiBJbmNyZW1lbnQgdGhlIGNoYWxsZW5nZSBieSAxLCBhbmQgZW5jcnlwdCBpdCBmb3IKKyAgICAgICAgICAgICogbGF0ZXIgY29tcGFyaXNvbi4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGkgPSA3OyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGludCB4OworICAgICAgICAgICAgICAgIHggPSAodW5zaWduZWQgaW50KWs0X2NoYWxsZW5nZVtpXSArIDE7CisgICAgICAgICAgICAgICAgazRfY2hhbGxlbmdlW2ldID0geDsgICAgLyogaWdub3JlIG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgaWYgKHggPCAyNTYpICAgICAgICAgICAgLyogaWYgbm8gb3ZlcmZsb3csIGFsbCBkb25lICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGV4ZHVtcCgiYXV0aF9zZW5kIGs0X2NoYWxsZW5nZSsxIixrNF9jaGFsbGVuZ2UsOCk7CisjaWZkZWYgTUlUX0NVUlJFTlQKKyAgICAgICAgICAgIGRhdGEuZGF0YSA9IGs0X2NoYWxsZW5nZTsKKyAgICAgICAgICAgIGRhdGEubGVuZ3RoID0gODsKKworICAgICAgICAgICAgZW5jZGF0YS5jaXBoZXJ0ZXh0LmRhdGEgPSBrNF9jaGFsbGVuZ2U7CisgICAgICAgICAgICBlbmNkYXRhLmNpcGhlcnRleHQubGVuZ3RoID0gODsKKyAgICAgICAgICAgIGVuY2RhdGEuZW5jdHlwZSA9IEVOQ1RZUEVfVU5LTk9XTjsKKworICAgICAgICAgICAgaWYgKGNvZGUgPSBrcmI1X2NfZW5jcnlwdChrNV9jb250ZXh0LCAmazRfa3Jia2V5LCAwLCAwLCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNkYXRhKSkgeworICAgICAgICAgICAgICAgIGNvbV9lcnIoImxpYnRlbG5ldCIsIGNvZGUsICJ3aGlsZSBlbmNyeXB0aW5nIHJhbmRvbSBrZXkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9CisjZWxzZSAvKiBNSVRfQ1VSUkVOVCAqLworI2lmZGVmIE5UCisgICAgICAgICAgICBkZXNfZWNiX2VuY3J5cHQoazRfY2hhbGxlbmdlLCBrNF9jaGFsbGVuZ2UsIGs0X3NjaGVkLCAxKTsKKyNlbHNlIC8qIE5UICovCisgICAgICAgICAgICBkZXNfZWNiX2VuY3J5cHQoJms0X2NoYWxsZW5nZSwgJms0X2NoYWxsZW5nZSwgazRfc2NoZWQsIDEpOworI2VuZGlmIC8qIE5UICovCisgICAgICAgICAgICBoZXhkdW1wKCJhdXRoX3NlbmQgZGVzX2VjYl9lbmNyeXB0KGs0X3Nlc3Npb25fa2V5LGs0X2NoYWxsZW5nZSwxKSIsCisgICAgICAgICAgICAgICAgICAgICBrNF9jaGFsbGVuZ2UsOCk7CisjZW5kaWYgLyogTUlUX0NVUlJFTlQgKi8KKyAgICAgICAgfQorI2VuZGlmICAvKiBFTkNSWVBUSU9OICovCisjZW5kaWYgLyogUkVNT1ZFX0ZPUl9FWFBPUlQgKi8KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogS1JCNCAqLworI2lmZGVmIEdTU0FQSV9LUkI1CisgICAgY2FzZSBBVVRIVFlQRV9HU1NBUElfS1JCNToKKyAgICAgICAgZm9yICggaT0wIDsgaTxnc3Nfc2VuZF90b2subGVuZ3RoIDsgaSsrICkgeworICAgICAgICAgICAgaWYgKCAoKGNoYXIgKilnc3Nfc2VuZF90b2sudmFsdWUpW2ldID09IElBQyApCisgICAgICAgICAgICAgICAgaWFjY250Kys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGdzc19zZW5kX3Rvay5sZW5ndGggKyBpYWNjbnQgKyAxMCA8IHNpemVvZihidWYpICkKKyAgICAgICAgICAgIGdzc19zZW5kX3Rvay5sZW5ndGggPSBjb3B5X2Zvcl9uZXQoJmJ1Zls3XSwgZ3NzX3NlbmRfdG9rLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3Nfc2VuZF90b2subGVuZ3RoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ3NzX3NlbmRfdG9rLmxlbmd0aCA9IDA7CisgICAgICAgIHNwcmludGYoJmJ1Zltnc3Nfc2VuZF90b2subGVuZ3RoKzddLCAiJWMlYyIsIElBQywgU0UpOyAgICAgICAvKiBzYWZlICovCisgICAgICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBja21ha3htc2codG5fbXNnLFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9BVVRIRU5USUNBVElPTiksIiBJUyAiLAorICAgICAgICAgICAgICAgICAgICAgIEFVVEhUWVBFX05BTUUoYXV0aGVudGljYXRpb25fdmVyc2lvbiksIiAiLAorICAgICAgICAgICAgICAgICAgICAgIEFVVEhNT0RFX05BTUUobW9kZSksIiBBVVRIICIsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMCisgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgdG5faGV4KChjaGFyICopdG5fbXNnLFROX01TR19MRU4sJmJ1Zls3XSxnc3Nfc2VuZF90b2subGVuZ3RoKTsKKyAgICAgICAgICAgIGNrc3RybmNhdCh0bl9tc2csIklBQyBTRSIsVE5fTVNHX0xFTik7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLHRuX21zZywiIiwwKTsKKyAgICAgICAgICAgIGlmICh0bl9kZWIgfHwgZGVic2VzKSB0bl9kZWJ1Zyh0bl9tc2cpOworICAgICAgICB9CisjaWZkZWYgT1MyCisgICAgICAgIFJlcXVlc3RUZWxuZXRNdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApOworI2VuZGlmCisgICAgICAgIHR0b2woKENIQVIgKilidWYsIGdzc19zZW5kX3Rvay5sZW5ndGgrOSk7CisjaWZkZWYgT1MyCisgICAgICAgIFJlbGVhc2VUZWxuZXRNdXRleCgpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEdTU0FQSV9LUkI1ICovCisjaWZkZWYgS1JCNQorICAgIGNhc2UgQVVUSFRZUEVfS0VSQkVST1NfVjU6CisgICAgICAgIGRlYnVnKEYxMTEsImF1dGhfc2VuZCBLUkI1IiwiazVfYXV0aC5sZW5ndGgiLGs1X2F1dGgubGVuZ3RoKTsKKyAgICAgICAgZm9yICggaT0wIDsgaTxrNV9hdXRoLmxlbmd0aCA7IGkrKyApIHsKKyAgICAgICAgICAgIGlmICggKChjaGFyICopazVfYXV0aC5kYXRhKVtpXSA9PSBJQUMgKQorICAgICAgICAgICAgICAgIGlhY2NudCsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBrNV9hdXRoLmxlbmd0aCArIGlhY2NudCArIDEwIDwgc2l6ZW9mKGJ1ZikgKQorICAgICAgICAgIGs1X2F1dGgubGVuZ3RoID0gY29weV9mb3JfbmV0KCZidWZbN10sIGs1X2F1dGguZGF0YSwgazVfYXV0aC5sZW5ndGgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBkZWJ1ZyhGMTAwLCJhdXRoX3NlbmQoKSBLUkI1IGF1dGggZGF0YSB0b28gbGFyZ2UgZm9yIGJ1ZmZlciIsIiIsMCk7CisgICAgICAgICAgazVfYXV0aC5sZW5ndGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgc3ByaW50ZigmYnVmW2s1X2F1dGgubGVuZ3RoKzddLCAiJWMlYyIsIElBQywgU0UpOyAgICAgICAvKiBzYWZlICovCisgICAgICAgIGlmIChkZWJsb2cgfHwgdG5fZGViIHx8IGRlYnNlcykgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBja21ha3htc2codG5fbXNnLFROX01TR19MRU4sCisgICAgICAgICAgICAgICAgICAgICAgIlRFTE5FVCBTRU5UIFNCICIsVEVMT1BUKFRFTE9QVF9BVVRIRU5USUNBVElPTiksIiBJUyAiLAorICAgICAgICAgICAgICAgICAgICAgIEFVVEhUWVBFX05BTUUoYXV0aGVudGljYXRpb25fdmVyc2lvbiksIiAiLAorICAgICAgICAgICAgICAgICAgICAgIEFVVEhNT0RFX05BTUUobW9kZSksIiBBVVRIICIsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMCisgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgdG5faGV4KChjaGFyICopdG5fbXNnLFROX01TR19MRU4sJmJ1Zls3XSxrNV9hdXRoLmxlbmd0aCk7CisgICAgICAgICAgICBja3N0cm5jYXQodG5fbXNnLCJJQUMgU0UiLFROX01TR19MRU4pOworICAgICAgICAgICAgZGVidWcoRjEwMCx0bl9tc2csIiIsMCk7CisgICAgICAgICAgICBpZiAodG5fZGViIHx8IGRlYnNlcykgdG5fZGVidWcodG5fbXNnKTsKKyAgICAgICAgfQorI2lmZGVmIE9TMgorICAgICAgICBSZXF1ZXN0VGVsbmV0TXV0ZXgoIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNlbmRpZgorICAgICAgICB0dG9sKChDSEFSICopYnVmLCBrNV9hdXRoLmxlbmd0aCs5KTsKKyNpZmRlZiBPUzIKKyAgICAgICAgUmVsZWFzZVRlbG5ldE11dGV4KCk7CisjZW5kaWYKKyNpZmRlZiBIRUlNREFMCisgICAgICAgIGtyYjVfZGF0YV9mcmVlKCZrNV9hdXRoKTsKKyNlbHNlIC8qIEhFSU1EQUwgKi8KKyAgICAgICAga3JiNV9mcmVlX2RhdGFfY29udGVudHMoazVfY29udGV4dCwmazVfYXV0aCk7CisgICAgICAgIG1lbXNldCgmazVfYXV0aCwwLHNpemVvZihrcmI1X2RhdGEpKTsKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEtSQjUgKi8KKyAgICB9CisgICAgcmV0dXJuIEFVVEhfU1VDQ0VTUzsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiBQYXJzZSBhdXRoZW50aWNhdGlvbiBSRVBMWSBjb21tYW5kCisgKgorICogUGFyYW1ldGVyczoKKyAqICBwYXJzZWRhdCAtIHRoZSBzdWItY29tbWFuZCBkYXRhLgorICoKKyAqICAgICAgZW5kX3N1YiAtIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgaW4gdGhlICdwYXJzZWRhdCcgYXJyYXkgd2hpY2gKKyAqICAgICAgICAgICAgICBpcyB0aGUgbGFzdCBieXRlIGluIGEgc3ViLW5lZ290aWF0aW9uCisgKgorICogUmV0dXJuczogS2VyYmVyb3MgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCithdXRoX3JlcGx5KHVuc2lnbmVkIGNoYXIgKnBhcnNlZGF0LCBpbnQgZW5kX3N1YikKKyNlbHNlCithdXRoX3JlcGx5KHBhcnNlZGF0LGVuZF9zdWIpIHVuc2lnbmVkIGNoYXIgKnBhcnNlZGF0OyBpbnQgZW5kX3N1YjsKKyNlbmRpZgoreworICAgIGludCBuID0gQVVUSF9GQUlMVVJFOworCisgICAgaWYgKCBwYXJzZWRhdFsyXSAhPSBhdXRoZW50aWNhdGlvbl92ZXJzaW9uICkgeworICAgICAgICBwcmludGYoIkF1dGhlbnRpY2F0aW9uIHZlcnNpb24gbWlzbWF0Y2ggKCVzIFslZF0gIT0gJXMgWyVkXSlcclxuIiwKKyAgICAgICAgICAgICAgICBBVVRIVFlQRV9OQU1FKHBhcnNlZGF0WzJdKSxwYXJzZWRhdFsyXSwKKyAgICAgICAgICAgICAgICBBVVRIVFlQRV9OQU1FKGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24pLGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24pOworICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgfQorICAgIGlmICggcGFyc2VkYXRbM10gIT0gKGF1dGhfaG93fGF1dGhfY3J5cHR8YXV0aF9md2QpICkgeworICAgICAgICBwcmludGYoIkF1dGhlbnRpY2F0aW9uIG1vZGUgbWlzbWF0Y2ggKCVzICE9ICVzKVxyXG4iLAorICAgICAgICAgICAgICAgIEFVVEhNT0RFX05BTUUocGFyc2VkYXRbM10pLAorICAgICAgICAgICAgICAgIEFVVEhNT0RFX05BTUUoYXV0aF9ob3d8YXV0aF9jcnlwdHxhdXRoX2Z3ZCkpOworICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgfQorCisjaWZkZWYgS1JCNAorICAgIGlmIChhdXRoZW50aWNhdGlvbl92ZXJzaW9uID09IEFVVEhUWVBFX0tFUkJFUk9TX1Y0KQorICAgICAgICBuID0gazRfYXV0aF9yZXBseShwYXJzZWRhdCwgZW5kX3N1Yik7CisjZW5kaWYKKyNpZmRlZiBLUkI1CisgICAgaWYgKGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gPT0gQVVUSFRZUEVfS0VSQkVST1NfVjUpCisgICAgICAgIG4gPSBrNV9hdXRoX3JlcGx5KGF1dGhfaG93fGF1dGhfY3J5cHR8YXV0aF9md2QsIHBhcnNlZGF0LCBlbmRfc3ViKTsKKyNlbmRpZgorI2lmZGVmIENLX1NSUAorICAgIGlmIChhdXRoZW50aWNhdGlvbl92ZXJzaW9uID09IEFVVEhUWVBFX1NSUCkgeworI2lmbmRlZiBQUkVfU1JQXzFfN18zCisgICAgICAgIG4gPSBuZXdfc3JwX3JlcGx5KGF1dGhfaG93fGF1dGhfY3J5cHR8YXV0aF9md2QsIHBhcnNlZGF0LCBlbmRfc3ViKTsKKyNlbHNlIC8qIFBSRV9TUlBfMV83XzMgKi8KKyAgICAgICAgbiA9IHNycF9yZXBseShhdXRoX2hvd3xhdXRoX2NyeXB0fGF1dGhfZndkLCBwYXJzZWRhdCwgZW5kX3N1Yik7CisjZW5kaWYgLyogUFJFX1NSUF8xXzdfMyAqLworICAgIH0KKyNlbmRpZiAvKiBTUlAgKi8KKyNpZmRlZiBDS19TU0wKKyAgICBpZiAoYXV0aGVudGljYXRpb25fdmVyc2lvbiA9PSBBVVRIVFlQRV9TU0wpCisgICAgICAgIG4gPSBzc2xfcmVwbHkoYXV0aF9ob3d8YXV0aF9jcnlwdHxhdXRoX2Z3ZCwgcGFyc2VkYXQsIGVuZF9zdWIpOworI2VuZGlmIC8qIFNTTCAqLworI2lmZGVmIE5UTE0KKyAgICBpZiAoYXV0aGVudGljYXRpb25fdmVyc2lvbiA9PSBBVVRIVFlQRV9OVExNKQorICAgICAgICBuID0gbnRsbV9yZXBseShhdXRoX2hvd3xhdXRoX2NyeXB0fGF1dGhfZndkLCBwYXJzZWRhdCwgZW5kX3N1Yik7CisjZW5kaWYgLyogTlRMTSAqLworICAgIHJldHVybiBuOworfQorCisKKy8qCisgKiBGdW5jdGlvbjogUGFyc2UgYXV0aGVudGljYXRpb24gSVMgY29tbWFuZAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgcGFyc2VkYXQgLSB0aGUgc3ViLWNvbW1hbmQgZGF0YS4KKyAqCisgKiAgICAgIGVuZF9zdWIgLSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZSAncGFyc2VkYXQnIGFycmF5IHdoaWNoCisgKiAgICAgICAgICAgICAgaXMgdGhlIGxhc3QgYnl0ZSBpbiBhIHN1Yi1uZWdvdGlhdGlvbgorICoKKyAqIFJldHVybnM6IEtlcmJlcm9zIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQKKyNpZmRlZiBDS19BTlNJQworYXV0aF9pcyh1bnNpZ25lZCBjaGFyICpwYXJzZWRhdCwgaW50IGVuZF9zdWIpCisjZWxzZQorYXV0aF9pcyhwYXJzZWRhdCxlbmRfc3ViKSB1bnNpZ25lZCBjaGFyICpwYXJzZWRhdDsgaW50IGVuZF9zdWI7CisjZW5kaWYKK3sKKyAgICBpbnQgbiA9IEFVVEhfRkFJTFVSRTsKKworICAgIGlmICggcGFyc2VkYXRbMl0gPT0gQVVUSFRZUEVfTlVMTCApIHsKKyAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgIHJldHVybihBVVRIX0ZBSUxVUkUpOworICAgIH0KKworICAgIC8qCisgICAgICogIElmIENMSUVOVF9DSE9PU0VfT05DRSBpcyBzZWxlY3RlZCB0aGUgc2VydmVyIHdpbGwgbm90IGFsbG93IHRoZQorICAgICAqICBjbGllbnQgdG8gc3dpdGNoIHRvIGFuIGFsdGVybmF0ZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgaWYgdGhlIG9uZQorICAgICAqICBpdCBvcmlnaW5hbGx5IHNlbGVjdGVkIGZhaWxzLiAgKGllLCBpZiB0aGUgaG9zdCdzIFNSUCBwYXJhbWV0ZXJzCisgICAgICogIGFyZSBpbnZhbGlkLikgIEhvd2V2ZXIsIEkgdGhpbmsgdGhpcyBpcyBhIGJpdCBvZiBhIHNlY3VyaXR5IHJpc2sKKyAgICAgKiAgc2luY2UgYWxsb3dpbmcgdGhhdCBmdW5jdGlvbmFsaXR5IG1lYW5zIHRoYXQgaXQgaXMgaW1wb3NzaWJsZSB0bworICAgICAqICBkZXRlY3QgaWYgYW4gYXR0YWNrIGlzIGJlaW5nIGNhcnJpZWQgb3V0IG9uCisgICAgICovCisjZGVmaW5lIENMSUVOVF9DSE9PU0VfT05DRQorI2lmZGVmIENMSUVOVF9DSE9PU0VfT05DRQorICAgIGlmICggYXV0aGVudGljYXRpb25fdmVyc2lvbiA9PSBBVVRIVFlQRV9BVVRPICkKKyNlbmRpZiAvKiBDTElFTlRfQ0hPT1NFX09OQ0UgKi8KKyAgICB7CisgICAgICAgIC8qIHRoaXMgYmxvY2sgb2YgY29kZSBuZWVkcyB0byBjaGVjayB0aGUgaW5pdGlhbCBwYXJhbWV0ZXJzICovCisgICAgICAgIC8qIHRvIGVuc3VyZSB0aGF0IHRob3NlIHJldHVybmVkIG1hdGNoIG9uZSBvZiB0aGUgc2V0cyB0aGF0ICovCisgICAgICAgIC8qIHdlcmUgc2VudCB0byB0aGUgY2xpZW50IGluIHRoZSBmaXJzdCBwbGFjZS4gICAgICAgICAgICAgICovCisKKyAgICAgICAgaW50IGk9MDsKKyAgICAgICAgZm9yICggaT00OyBzdHJfcmVxdWVzdFtpXSAhPSBJQUMgOyBpKz0yKSB7CisgICAgICAgICAgICBpZiAoc3RyX3JlcXVlc3RbaV0gPT0gcGFyc2VkYXRbMl0gJiYKKyAgICAgICAgICAgICAgICAgc3RyX3JlcXVlc3RbaSsxXSA9PSBwYXJzZWRhdFszXSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggc3RyX3JlcXVlc3RbaV0gPT0gSUFDICkgeworICAgICAgICAgICAgcHJpbnRmKCJJbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHR5cGUgcGFpciAoJXMsJXMpXHJcbiIsCisgICAgICAgICAgICAgICAgICAgIEFVVEhUWVBFX05BTUUocGFyc2VkYXRbMl0pLAorICAgICAgICAgICAgICAgICAgICBBVVRITU9ERV9OQU1FKHBhcnNlZGF0WzNdKSk7CisgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgIHJldHVybihBVVRIX0ZBSUxVUkUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gIT0gcGFyc2VkYXRbMl0pIHsKKyAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gPSBwYXJzZWRhdFsyXTsKKyAgICAgICAgICAgIGF1dGhfaG93ID0gKHBhcnNlZGF0WzNdICYgQVVUSF9IT1dfTUFTSyk7CisgICAgICAgICAgICBhdXRoX2NyeXB0ID0gKHBhcnNlZGF0WzNdICYgQVVUSF9FTkNSWVBUX01BU0spOworICAgICAgICAgICAgYXV0aF9md2QgPSAocGFyc2VkYXRbM10gJiBJTklfQ1JFRF9GV0RfTUFTSyk7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJhdXRoX2lzIiwiYXV0aGVudGljYXRpb25fdmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl92ZXJzaW9uKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImF1dGhfaXMiLCJhdXRoX2hvdyIsYXV0aF9ob3cpOworICAgICAgICAgICAgZGVidWcoRjExMSwiYXV0aF9pcyIsImF1dGhfY3J5cHQiLGF1dGhfY3J5cHQpOworICAgICAgICAgICAgZGVidWcoRjExMSwiYXV0aF9pcyIsImF1dGhfZndkIixhdXRoX2Z3ZCk7CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBDTElFTlRfQ0hPT1NFX09OQ0UKKyAgICBpZiAoIHBhcnNlZGF0WzJdICE9IGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gKSB7CisgICAgICAgIHByaW50ZigiQXV0aGVudGljYXRpb24gdmVyc2lvbiBtaXNtYXRjaCAoJXMgWyVkXSAhPSAlcyBbJWRdKVxyXG4iLAorICAgICAgICAgICAgICAgIEFVVEhUWVBFX05BTUUocGFyc2VkYXRbMl0pLHBhcnNlZGF0WzJdLAorICAgICAgICAgICAgICAgIEFVVEhUWVBFX05BTUUoYXV0aGVudGljYXRpb25fdmVyc2lvbiksYXV0aGVudGljYXRpb25fdmVyc2lvbik7CisgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICByZXR1cm4oQVVUSF9GQUlMVVJFKTsKKyAgICB9CisgICAgaWYgKCBwYXJzZWRhdFszXSAhPSAoYXV0aF9ob3d8YXV0aF9jcnlwdHxhdXRoX2Z3ZCkgKSB7CisgICAgICAgIHByaW50ZigiQXV0aGVudGljYXRpb24gbW9kZSBtaXNtYXRjaCAoJXMgIT0gJXMpXHJcbiIsCisgICAgICAgICAgICAgICAgQVVUSE1PREVfTkFNRShwYXJzZWRhdFszXSksCisgICAgICAgICAgICAgICAgQVVUSE1PREVfTkFNRShhdXRoX2hvd3xhdXRoX2NyeXB0fGF1dGhfZndkKSk7CisgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICByZXR1cm4oQVVUSF9GQUlMVVJFKTsKKyAgICB9CisjZW5kaWYgLyogQ0xJRU5UX0NIT09TRV9PTkNFICovCisKKyAgICBzd2l0Y2ggKGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24pIHsKKyNpZmRlZiBLUkI0CisgICAgY2FzZSBBVVRIVFlQRV9LRVJCRVJPU19WNDoKKyAgICAgICAgbiA9IGs0X2F1dGhfaXMocGFyc2VkYXQsIGVuZF9zdWIpOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEtSQjUKKyAgICBjYXNlIEFVVEhUWVBFX0tFUkJFUk9TX1Y1OgorICAgICAgICBuID0gazVfYXV0aF9pcyhwYXJzZWRhdFszXSxwYXJzZWRhdCwgZW5kX3N1Yik7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQ0tfU1JQCisgICAgY2FzZSBBVVRIVFlQRV9TUlA6CisjaWZuZGVmIFBSRV9TUlBfMV83XzMKKyAgICAgICAgbiA9IG5ld19zcnBfaXMocGFyc2VkYXRbM10sIHBhcnNlZGF0LCBlbmRfc3ViKTsKKyNlbHNlIC8qIFBSRV9TUlBfMV83XzMgKi8KKyAgICAgICAgbiA9IHNycF9pcyhwYXJzZWRhdFszXSwgcGFyc2VkYXQsIGVuZF9zdWIpOworI2VuZGlmIC8qIFBSRV9TUlBfMV83XzMgKi8KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogU1JQICovCisjaWZkZWYgQ0tfU1NMCisgICAgY2FzZSBBVVRIVFlQRV9TU0w6CisgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICBURUxPUFRfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworICAgICAgICBuID0gc3NsX2lzKHBhcnNlZGF0LCBlbmRfc3ViKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogU1NMICovCisjaWZkZWYgTlRMTQorICAgIGNhc2UgQVVUSFRZUEVfTlRMTToKKyAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgIG4gPSBudGxtX2lzKHBhcnNlZGF0LCBlbmRfc3ViKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTlRMTSAqLworICAgIGNhc2UgQVVUSFRZUEVfTlVMTDoKKyAgICBkZWZhdWx0OgorICAgICAgICBuID0gQVVUSF9GQUlMVVJFOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJhdXRoX2lzIiwibiIsbik7CisgICAgcmV0dXJuIG47Cit9CisKKy8qCisgKiBGdW5jdGlvbjogUGFyc2UgYXV0aGVudGljYXRpb24gTkFNRSBjb21tYW5kCisgKgorICogUGFyYW1ldGVyczoKKyAqICBwYXJzZWRhdCAtIHRoZSBzdWItY29tbWFuZCBkYXRhLgorICoKKyAqICAgICAgZW5kX3N1YiAtIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgaW4gdGhlICdwYXJzZWRhdCcgYXJyYXkgd2hpY2gKKyAqICAgICAgICAgICAgICBpcyB0aGUgbGFzdCBieXRlIGluIGEgc3ViLW5lZ290aWF0aW9uCisgKgorICogUmV0dXJuczogS2VyYmVyb3MgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCithdXRoX25hbWUodW5zaWduZWQgY2hhciAqcGFyc2VkYXQsIGludCBlbmRfc3ViKQorI2Vsc2UKK2F1dGhfbmFtZShwYXJzZWRhdCxlbmRfc3ViKSB1bnNpZ25lZCBjaGFyICpwYXJzZWRhdDsgaW50IGVuZF9zdWI7CisjZW5kaWYKK3sKKyAgICBpbnQgbGVuID0gKGVuZF9zdWItMikgPiA2MyA/IDYzIDogKGVuZF9zdWItMik7CisgICAgaWYgKCBsZW4gPiAwICYmIChsZW4gKyAxKSA8IHNpemVvZihzelVzZXJOYW1lUmVxdWVzdGVkKSkgeworICAgICAgICBtZW1jcHkoc3pVc2VyTmFtZVJlcXVlc3RlZCwmcGFyc2VkYXRbMl0sbGVuKTsgICAgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgc3pVc2VyTmFtZVJlcXVlc3RlZFtsZW5dID0gJ1wwJzsKKyAgICB9IGVsc2UKKyAgICAgIHN6VXNlck5hbWVSZXF1ZXN0ZWRbMF0gPSAnXDAnOworICAgIGRlYnVnKEYxMTEsImF1dGhfbmFtZSBzelVzZXJOYW1lUmVxdWVzdGVkIixzelVzZXJOYW1lUmVxdWVzdGVkLGxlbik7CisgICAgcmV0dXJuKEFVVEhfU1VDQ0VTUyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogUGFyc2UgdGhlIGF0aG9yaXphdGlvbiBzdWItb3B0aW9ucyBhbmQgcmVwbHkuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgICAgcGFyc2VkYXQgLSBzdWItb3B0aW9uIHN0cmluZyB0byBwYXJzZS4KKyAqCisgKiAgICAgIGVuZF9zdWIgLSBsYXN0IGNoYXJjdGVyIHBvc2l0aW9uIGluIHBhcnNlZGF0LgorICovCitpbnQKK2F1dGhfcGFyc2UodW5zaWduZWQgY2hhciAqcGFyc2VkYXQsIGludCBlbmRfc3ViKQoreworICAgIGludCByYyA9IEFVVEhfRkFJTFVSRTsKKyAgICBzd2l0Y2ggKHBhcnNlZGF0WzFdKSB7CisgICAgY2FzZSBURUxRVUFMX1NFTkQ6CisgICAgICAgIHJjID0gYXV0aF9zZW5kKHBhcnNlZGF0LCBlbmRfc3ViKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBURUxRVUFMX1JFUExZOgorICAgICAgICByYz0gYXV0aF9yZXBseShwYXJzZWRhdCwgZW5kX3N1Yik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVEVMUVVBTF9JUzoKKyAgICAgICAgcmMgPSBhdXRoX2lzKHBhcnNlZGF0LCBlbmRfc3ViKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBURUxRVUFMX05BTUU6CisgICAgICAgIHJjID0gYXV0aF9uYW1lKHBhcnNlZGF0LCBlbmRfc3ViKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlYnVnKEYxMTEsImF1dGhfcGFyc2UiLCJyYyIscmMpOworICAgIHJldHVybihyYyk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uOiBJbml0aWFsaXphdGlvbiByb3V0aW5lIGNhbGxlZCBrc3RyZWFtIGVuY3J5cHRpb24gc3lzdGVtLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgZGF0YSAtIHVzZXIgZGF0YS4KKyAqLworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2F1dGhfaW5pdChrc3RyZWFtIGtzKQorI2Vsc2UKK2F1dGhfaW5pdChrcykga3N0cmVhbV9wdHIga3M7CisjZW5kaWYKK3sKKyNpZmRlZiBGT1JXQVJECisgICAgZm9yd2FyZGVkX3RpY2tldHMgPSAwOyAgLyogd2VyZSB0aWNrZXRzIGZvcndhcmRlZD8gKi8KKyNlbmRpZiAvKiBGT1JXQVJEICovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIGVuY3J5cHRfaW5pdChrcyxjeF90eXBlKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBGdW5jdGlvbjogRGVzdHJveSByb3V0aW5lIGNhbGxlZCBrc3RyZWFtIGVuY3J5cHRpb24gc3lzdGVtLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgZGF0YSAtIHVzZXIgZGF0YS4KKyAqLworVk9JRAorI2lmZGVmIENLX0FOU0lDCithdXRoX2Rlc3Ryb3kodm9pZCkKKyNlbHNlCithdXRoX2Rlc3Ryb3koKQorI2VuZGlmCit7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uOiBDYWxsYmFjayB0byBlbmNyeXB0IGEgYmxvY2sgb2YgY2hhcmFjdGVycworICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgb3V0IC0gcmV0dXJuIGFzIHBvaW50ZXIgdG8gY29udmVydGVkIGJ1ZmZlci4KKyAqCisgKiAgaW4gLSB0aGUgYnVmZmVyIHRvIGNvbnZlcnQKKyAqCisgKiBSZXR1cm5zOiBudW1iZXIgb2YgY2hhcmFjdGVycyBjb252ZXJ0ZWQuCisgKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCithdXRoX2VuY3J5cHQoc3RydWN0IGtzdHJlYW1fZGF0YV9ibG9jayAqb3V0LAorICAgICAgICAgICAgIHN0cnVjdCBrc3RyZWFtX2RhdGFfYmxvY2sgKmluKQorI2Vsc2UKK2F1dGhfZW5jcnlwdChvdXQsaW4pCisgICAgc3RydWN0IGtzdHJlYW1fZGF0YV9ibG9jayAqb3V0OyBzdHJ1Y3Qga3N0cmVhbV9kYXRhX2Jsb2NrICppbjsKKyNlbmRpZgoreworICAgIG91dC0+cHRyID0gaW4tPnB0cjsKKworICAgIG91dC0+bGVuZ3RoID0gaW4tPmxlbmd0aDsKKworICAgIHJldHVybihvdXQtPmxlbmd0aCk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uOiBDYWxsYmFjayB0byBkZWNyeXB0IGEgYmxvY2sgb2YgY2hhcmFjdGVycworICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgb3V0IC0gcmV0dXJuIGFzIHBvaW50ZXIgdG8gY29udmVydGVkIGJ1ZmZlci4KKyAqCisgKiAgaW4gLSB0aGUgYnVmZmVyIHRvIGNvbnZlcnQKKyAqCisgKiBSZXR1cm5zOiBudW1iZXIgb2YgY2hhcmFjdGVycyBjb252ZXJ0ZWQuCisgKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCithdXRoX2RlY3J5cHQoc3RydWN0IGtzdHJlYW1fZGF0YV9ibG9jayAqb3V0LAorICAgICAgICAgICAgIHN0cnVjdCBrc3RyZWFtX2RhdGFfYmxvY2sgKmluKQorI2Vsc2UKK2F1dGhfZGVjcnlwdChvdXQsaW4pCisgICAgc3RydWN0IGtzdHJlYW1fZGF0YV9ibG9jayAqb3V0OyBzdHJ1Y3Qga3N0cmVhbV9kYXRhX2Jsb2NrICppbjsKKyNlbmRpZgoreworICAgIG91dC0+cHRyID0gaW4tPnB0cjsKKworICAgIG91dC0+bGVuZ3RoID0gaW4tPmxlbmd0aDsKKworICAgIHJldHVybihvdXQtPmxlbmd0aCk7Cit9CisKKyNpZmRlZiBLUkI0CisjaWZkZWYgTlQKK3ZvaWQKK2NrX2tyYjRfZGVidWcoaW50IHgpCit7CisgICAgc2V0X2tyYl9kZWJ1Zyh4KTsKKyAgICBzZXRfa3JiX2FwX3JlcV9kZWJ1Zyh4KTsKK30KKyNlbmRpZiAvKiBOVCAqLworaW50Citja19rcmI0X2F1dG9nZXRfVEdUKGNoYXIgKiByZWFsbSkKK3sKKyAgICBleHRlcm4gc3RydWN0IGtyYl9vcF9kYXRhIGtyYl9vcDsKKyAgICBleHRlcm4gc3RydWN0IGtyYjRfaW5pdF9kYXRhIGtyYjRfaW5pdDsKKyAgICBjaGFyIHBhc3N3ZFtQV0RfU1pdOworICAgIGNoYXIgcHJvbXB0WzI1Nl07CisgICAgY2hhciAqIHNhdmVyZWFsbT1OVUxMOworICAgIGludCAgcmMgPSAtMTsKKyAgICBleHRlcm4gY2hhciAqIGs0cHJwcm9tcHQ7CisgICAgZXh0ZXJuIGNoYXIgKiBrNHB3cHJvbXB0OworCisgICAgaW5pX2tlcmIoKTsgICAgICAgICAvKiBQbGFjZSBkZWZhdWx0cyBpbiBhYm92ZSBzdHJ1Y3RzICovCisgICAgcGFzc3dkWzBdID0gJ1wwJzsKKworICAgIGlmICgga3JiNF9pbml0LnByaW5jaXBhbCA9PSBOVUxMIHx8CisgICAgICAgICBrcmI0X2luaXQucHJpbmNpcGFsWzBdID09ICdcMCcpIHsKKyAgICAgICAgaW50IG9rID0gdXFfdHh0KE5VTEwsIAorICAgICAgICAgICAgICAgICBrNHBycHJvbXB0ICYmIGs0cHJwcm9tcHRbMF0gPworICAgICAgICAgICAgICAgICBrNHBycHJvbXB0IDoKKyAgICAgICAgICAgICAgICAgIktlcmJlcm9zIDQgUHJpbmNpcGFsOiAiLAorICAgICAgICAgICAgICAgICAyLCBOVUxMLCBwYXNzd2QsUFdEX1NaLTEsIE5VTEwsIERFRkFVTFRfVVFfVElNRU9VVCk7CisgICAgICAgIGlmICggb2sgJiYgcGFzc3dkWzBdICkKKyAgICAgICAgICAgIG1ha2VzdHIoJmtyYjRfaW5pdC5wcmluY2lwYWwscGFzc3dkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIC8qIFNhdmUgcmVhbG0gaW4gaW5pdCBzdHJ1Y3R1cmUgc28gaXQgY2FuIGJlIHJlc3RvcmVkICovCisgICAgaWYgKCByZWFsbSApIHsKKyAgICAgICAgc2F2ZXJlYWxtID0ga3JiNF9pbml0LnJlYWxtOworICAgICAgICBrcmI0X2luaXQucmVhbG0gPSByZWFsbTsKKyAgICB9CisKKyAgICBpZiAoIHBhc3N3ZFswXSB8fCAhKHB3YnVmWzBdICYmIHB3ZmxnKSApIHsKKyAgICAgICAgaW50IG9rOworICAgICAgICBpZiAoIGs0cHdwcm9tcHQgJiYgazRwd3Byb21wdFswXSAmJgorICAgICAgICAgICAgIChzdHJsZW4oazRwd3Byb21wdCkgKyBzdHJsZW4oa3JiNF9pbml0LnByaW5jaXBhbCkgKworICAgICAgICAgICAgICAgc3RybGVuKGtyYjRfaW5pdC5yZWFsbSkgLSA0KSA8IHNpemVvZihwcm9tcHQpKSB7CisgICAgICAgICAgICBzcHJpbnRmKHByb21wdCxrNHB3cHJvbXB0LGtyYjRfaW5pdC5wcmluY2lwYWwsa3JiNF9pbml0LnJlYWxtKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBja21ha3htc2cocHJvbXB0LHNpemVvZihwcm9tcHQpLAorICAgICAgICAgICAgICAgICAgIktlcmJlcm9zIDQgUGFzc3dvcmQgZm9yICIsa3JiNF9pbml0LnByaW5jaXBhbCwiQCIsCisgICAgICAgICAgICAgICAgICBrcmI0X2luaXQucmVhbG0sIjogIiwKKyAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgICAgICBvayA9IHVxX3R4dChOVUxMLHByb21wdCwyLE5VTEwscGFzc3dkLFBXRF9TWi0xLE5VTEwsCisJCSAgICBERUZBVUxUX1VRX1RJTUVPVVQpOworICAgICAgICBpZiAoICFvayApCisgICAgICAgICAgICBwYXNzd2RbMF0gPSAnXDAnOworICAgIH0gZWxzZSB7CisgICAgICAgIGNrc3RybmNweShwYXNzd2QscHdidWYsc2l6ZW9mKHBhc3N3ZCkpOworI2lmZGVmIE9TMgorICAgICAgICBpZiAoIHB3Y3J5cHQgKQorICAgICAgICAgICAgY2tfZW5jcnlwdCgoY2hhciAqKXBhc3N3ZCk7CisjZW5kaWYgLyogT1MyICovCisgICAgfQorCisgICAgaWYgKCBwYXNzd2RbMF0gKSB7CisgICAgICAgIG1ha2VzdHIoJmtyYjRfaW5pdC5wYXNzd29yZCxwYXNzd2QpOworICAgICAgICByYyA9IGNrX2tyYjRfaW5pdFRHVCgma3JiX29wLCAma3JiNF9pbml0KTsKKyAgICAgICAgZnJlZShrcmI0X2luaXQucGFzc3dvcmQpOworICAgICAgICBrcmI0X2luaXQucGFzc3dvcmQgPSBOVUxMOworICAgIH0KKworICAgIGtyYjRfaW5pdC5wYXNzd29yZCA9IE5VTEw7CisgICAgbWVtc2V0KHBhc3N3ZCwwLFBXRF9TWik7CisKKyAgICAvKiByZXN0b3JlIHJlYWxtIHRvIGluaXQgc3RydWN0dXJlIGlmIG5lZWRlZCAqLworICAgIGlmICggc2F2ZXJlYWxtICkKKyAgICAgICAga3JiNF9pbml0LnJlYWxtID0gc2F2ZXJlYWxtOworICAgIHJldHVybihyYyA9PSAwKTsKK30KKworY2hhciAqCitja19rcmI0X3JlYWxtb2Zob3N0KGNoYXIgKmhvc3QpCit7CisgICAgcmV0dXJuIChjaGFyICopa3JiX3JlYWxtb2Zob3N0KGhvc3QpOworfQorCisvKgorICoKKyAqIEs0X2F1dGhfc2VuZCAtIGdldHMgYXV0aGVudGljYXRpb24gYml0cyB3ZSBuZWVkIHRvIHNlbmQgdG8gS0RDLgorICoKKyAqIFJlc3VsdCBpcyBsZWZ0IGluIGF1dGgKKyAqCisgKiBSZXR1cm5zOiAwIG9uIGZhaWx1cmUsIDEgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK2s0X2F1dGhfc2VuZCh2b2lkKQorI2Vsc2UKK2s0X2F1dGhfc2VuZCgpCisjZW5kaWYKK3sKKyAgICBpbnQgcj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiB2YWx1ZSAqLworICAgIGNoYXIgaW5zdGFuY2VbSU5TVF9TWisxXT0iIjsKKyAgICBjaGFyICpyZWFsbT1OVUxMOworICAgIGNoYXIgdGd0WzQqUkVBTE1fU1orMV07CisKKyAgICBtZW1zZXQoaW5zdGFuY2UsIDAsIHNpemVvZihpbnN0YW5jZSkpOworCisjaWZkZWYgQ09NTUVOVAorICAgIC8qIHdlIG9ubHkgbmVlZCB0byBjYWxsIGtyYl9nZXRfcGhvc3QgaWYgdGhlIGhvc3RuYW1lICovCisgICAgLyogaXMgbm90IGZ1bGx5IHF1YWxpZmllZC4gIEJ1dCB3ZSBoYXZlIGFscmVhZHkgZG9uZSAgKi8KKyAgICAvKiB0aGlzIGluIG5ldG9wZW4oKSBjYWxsLiAgVGhpcyB3aWxsIHNhdmUgYSByb3VuZCBvZiAqLworICAgIC8qIEROUyBxdWVyaWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZGVidWcoRjExMCwiazRfYXV0aF9zZW5kIiwia3JiX2dldF9waG9zdCIsMCk7CisgICAgaWYgKHJlYWxtID0gKGNoYXIgKilrcmJfZ2V0X3Bob3N0KHN6SG9zdE5hbWUpKSB7CisgICAgICAgIGNrc3RybmNweShpbnN0YW5jZSwgcmVhbG0sIElOU1RfU1opOworICAgIH0KKyNlbHNlIC8qIENPTU1FTlQgKi8KKyAgICB7CisgICAgICAgIGNoYXIgKnA7CisgICAgICAgIGNrc3RybmNweShpbnN0YW5jZSwgc3pIb3N0TmFtZSwgSU5TVF9TWik7CisgICAgICAgIGZvciAoIHA9aW5zdGFuY2U7ICpwICYmICpwICE9ICcuJyA7IHArKyApOworICAgICAgICAqcCA9ICdcMCc7CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIGRlYnVnKEYxMTAsIms0X2F1dGhfc2VuZCIsImtyYl9nZXRfcmVhbG1vZmhvc3QiLDApOworICAgIHJlYWxtID0gKGNoYXIgKilrcmJfcmVhbG1vZmhvc3Qoc3pIb3N0TmFtZSk7CisKKyAgICBpZiAoIXJlYWxtKSB7CisgICAgICAgIHN0cmNweShzdHJUbXAsICJDYW4ndCBmaW5kIHJlYWxtIGZvciBob3N0IFwiIik7CisgICAgICAgIGNrc3RybmNhdChzdHJUbXAsIHN6SG9zdE5hbWUsQVVUSFRNUEJMKTsKKyAgICAgICAgY2tzdHJuY2F0KHN0clRtcCwgIlwiIixBVVRIVE1QQkwpOworICAgICAgICBwcmludGYoIj9LZXJiZXJvcyA0IGVycm9yOiAlc1xyXG4iLHN0clRtcCk7CisgICAgICAgIGtyYjRfZXJybm8gPSByOworICAgICAgICBtYWtlc3RyKCZrcmI0X2Vycm1zZyxzdHJUbXApOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgY2ttYWttc2codGd0LHNpemVvZih0Z3QpLCJrcmJ0Z3QuIixyZWFsbSwiQCIscmVhbG0pOworICAgIHIgPSBja19rcmI0X3RrdF9pc3ZhbGlkKHRndCk7CisKKyAgICBpZiAoIHIgPD0gMCAmJiBrcmI0X2F1dG9nZXQgKQorICAgICAgICBja19rcmI0X2F1dG9nZXRfVEdUKHJlYWxtKTsKKworICAgIGRlYnVnKEYxMTAsIms0X2F1dGhfc2VuZCIsImtyYl9ta19yZXEiLDApOworICAgIHIgPSBrcmJfbWtfcmVxKCZrNF9hdXRoLCBrcmI0X2Rfc3J2ID8ga3JiNF9kX3NydiA6IEtSQjRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgcmVhbG0sIDApOworCisgICAgaWYgKHIgPT0gMCkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJrNF9hdXRoX3NlbmQiLCJrcmJfZ2V0X2NyZWQiLDApOworICAgICAgICByID0ga3JiX2dldF9jcmVkKGtyYjRfZF9zcnYgPyBrcmI0X2Rfc3J2IDogS1JCNF9TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCByZWFsbSwgJmNyZWQpOworICAgICAgICBpZiAocikKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIms0X2F1dGhfc2VuZCIsImtyYl9nZXRfY3JlZCgpIGZhaWxlZCIscik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZGVidWcoRjExMSwiazRfYXV0aF9zZW5kIiwia3JiX21rX3JlcSgpIGZhaWxlZCIscik7CisKKyAgICBpZiAocikgeworICAgICAgICBzdHJjcHkoc3RyVG1wLCAiQ2FuJ3QgZ2V0IFwiIik7CisgICAgICAgIGNrc3RybmNhdChzdHJUbXAsCisgICAgICAgICAgICAgICAgICBrcmI0X2Rfc3J2ID8ga3JiNF9kX3NydiA6IEtSQjRfU0VSVklDRV9OQU1FLEFVVEhUTVBCTCk7CisgICAgICAgIGlmIChpbnN0YW5jZVswXSAhPSAwKSB7CisgICAgICAgICAgICBja3N0cm5jYXQoc3RyVG1wLCAiLiIsQVVUSFRNUEJMKTsKKyAgICAgICAgICAgIGNrc3RybmNhdChzdHJUbXAsIGluc3RhbmNlLEFVVEhUTVBCTCk7CisgICAgICAgIH0KKyAgICAgICAgY2tzdHJuY2F0KHN0clRtcCwgIkAiLEFVVEhUTVBCTCk7CisgICAgICAgIGNrc3RybmNhdChzdHJUbXAsIHJlYWxtLEFVVEhUTVBCTCk7CisgICAgICAgIGNrc3RybmNhdChzdHJUbXAsICJcIiB0aWNrZXRcclxuICAiLEFVVEhUTVBCTCk7CisgICAgICAgIGNrc3RybmNhdChzdHJUbXAsIChjaGFyICopa3JiX2dldF9lcnJfdGV4dF9lbnRyeShyKSxBVVRIVE1QQkwpOworICAgICAgICBkZWJ1ZyhGMTExLCJrNF9hdXRoX3NlbmQiLChjaGFyICopa3JiX2dldF9lcnJfdGV4dF9lbnRyeShyKSxyKTsKKyAgICAgICAgcHJpbnRmKCI/S2VyYmVyb3MgNCBlcnJvcjogJXNcclxuIixzdHJUbXApOworICAgICAgICBrcmI0X2Vycm5vID0gcjsKKyAgICAgICAgbWFrZXN0cigma3JiNF9lcnJtc2csa3JiX2dldF9lcnJfdGV4dF9lbnRyeShrcmI0X2Vycm5vKSk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyNpZmRlZiBPUzIKKyAgICBpZiAoICFzelVzZXJOYW1lWzBdIHx8ICFzdHJpY21wKHN6VXNlck5hbWUsY3JlZC5wbmFtZSkgKSB7CisgICAgICAgIGNrc3RybmNweShzelVzZXJOYW1lLCBjcmVkLnBuYW1lLCBVSURCVUZMRU4pOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBrcmI0X2Vycm5vID0gcjsKKyAgICBtYWtlc3RyKCZrcmI0X2Vycm1zZyxrcmJfZ2V0X2Vycl90ZXh0X2VudHJ5KGtyYjRfZXJybm8pKTsKKyAgICBkZWJ1ZyhGMTEwLCJrNF9hdXRoX3NlbmQiLGtyYjRfZXJybXNnLDApOworICAgIHJldHVybigxKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiBLNCBwYXJzZSBhdXRoZW50aWNhdGlvbiByZXBseSBjb21tYW5kCisgKgorICogUGFyYW1ldGVyczoKKyAqICBwYXJzZWRhdCAtIHRoZSBzdWItY29tbWFuZCBkYXRhLgorICoKKyAqICBlbmRfc3ViIC0gaW5kZXggb2YgdGhlIGNoYXJhY3RlciBpbiB0aGUgJ3BhcnNlZGF0JyBhcnJheSB3aGljaAorICogICAgICAgICAgICAgIGlzIHRoZSBsYXN0IGJ5dGUgaW4gYSBzdWItbmVnb3RpYXRpb24KKyAqCisgKiBSZXR1cm5zOiBLZXJiZXJvcyBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK2s0X2F1dGhfcmVwbHkodW5zaWduZWQgY2hhciAqcGFyc2VkYXQsIGludCBlbmRfc3ViKQorI2Vsc2UKK2s0X2F1dGhfcmVwbHkocGFyc2VkYXQsZW5kX3N1YikgdW5zaWduZWQgY2hhciAqcGFyc2VkYXQ7IGludCBlbmRfc3ViOworI2VuZGlmCit7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIFNlc3Npb25fS2V5IHNrZXk7CisjaWZkZWYgTUlUX0NVUlJFTlQKKyAgICBrcmI1X2RhdGEga2RhdGE7CisgICAga3JiNV9lbmNfZGF0YSBlbmNkYXRhOworICAgIGtyYjVfZXJyb3JfY29kZSBjb2RlOworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisjZW5kaWYKKyAgICB0aW1lX3QgdDsKKyAgICBpbnQgeDsKKyAgICBpbnQgaTsKKworICAgIGlmIChlbmRfc3ViIDwgNCB8fCBwYXJzZWRhdFsyXSAhPSBBVVRIVFlQRV9LRVJCRVJPU19WNCkgeworICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAocGFyc2VkYXRbNF0gPT0gS1JCX1JFSkVDVCkgeworICAgICAgICBzdHJUbXBbMF0gPSAwOworCisgICAgICAgIGZvciAoaSA9IDU7IGkgPD0gZW5kX3N1YjsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGFyc2VkYXRbaV0gPT0gSUFDKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgc3RyVG1wW2ktNV0gPSBwYXJzZWRhdFtpXTsKKyAgICAgICAgICAgIHN0clRtcFtpLTRdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3RyVG1wWzBdKQorICAgICAgICAgICAgc3RyY3B5KHN0clRtcCwgIkF1dGhlbnRpY2F0aW9uIHJlamVjdGVkIGJ5IHJlbW90ZSBtYWNoaW5lISIpOworICAgICAgICBwcmludGYoIktlcmJlcm9zIFY0IGF1dGhlbnRpY2F0aW9uIGZhaWxlZCFcclxuJXNcclxuIixzdHJUbXApOworICAgICAgICBrcmI0X2Vycm5vID0gLTE7CisgICAgICAgIG1ha2VzdHIoJmtyYjRfZXJybXNnLHN0clRtcCk7CisgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworICAgIH0KKworICAgIGlmIChwYXJzZWRhdFs0XSA9PSBLUkJfQUNDRVBUKSB7CisgICAgICAgIGludCBuZXRfbGVuOworICAgICAgICBpZiAoKHBhcnNlZGF0WzNdICYgQVVUSF9IT1dfTUFTSykgPT0gQVVUSF9IT1dfT05FX1dBWSkgeworICAgICAgICAgICAgY2ttYWttc2coc3RyVG1wLHNpemVvZihzdHJUbXApLCJLZXJiZXJvcyBWNCBhY2NlcHRzIHlvdSBhcyAiLAorICAgICAgICAgICAgICAgICAgICAgIHN6VXNlck5hbWUsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgIHByaW50ZigiJXNcclxuIixzdHJUbXApOworICAgICAgICAgICAgYWNjZXB0X2NvbXBsZXRlID0gMTsKKyAgICAgICAgICAgIGtyYjRfZXJybm8gPSAwOworICAgICAgICAgICAgbWFrZXN0cigma3JiNF9lcnJtc2csc3RyVG1wKTsKKyAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9VU0VSKTsKKyAgICAgICAgICAgIHJldHVybiBBVVRIX1NVQ0NFU1M7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBhcnNlZGF0WzNdICYgQVVUSF9IT1dfTUFTSykgIT0gQVVUSF9IT1dfTVVUVUFMKSB7CisgICAgICAgICAgICBwcmludGYoIktlcmJlcm9zIFY0IGF1dGhlbnRpY2F0aW9uIGZhaWxlZCFcclxuIik7CisgICAgICAgICAgICBja3N0cm5jcHkoc3RyVG1wLAorICAgICAgICAiS2VyYmVyb3MgVjQgYWNjZXB0ZWQgeW91LCBidXQgZGlkbid0IHByb3ZpZGUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0clRtcCkpOworICAgICAgICAgICAgcHJpbnRmKCIlc1xyXG4iLHN0clRtcCk7CisgICAgICAgICAgICBrcmI0X2Vycm5vID0gLTE7CisgICAgICAgICAgICBtYWtlc3RyKCZrcmI0X2Vycm1zZyxzdHJUbXApOworICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworICAgICAgICB9CisKKyNpZm5kZWYgUkVNT1ZFX0ZPUl9FWFBPUlQKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgIFNlbmRLNEF1dGhTQihLUkI0X0NIQUxMRU5HRSxrNF9zZXNzaW9uX2tleSxzaXplb2YoazRfc2Vzc2lvbl9rZXkpKTsKKworICAgICAgICAvKiBXZSBoYXZlIHNlbnQgdGhlIGRlY3J5cHRlZCBzZXNzaW9uIGtleSB0byB0aGUgaG9zdCBhcyBhIGNoYWxsZW5nZSAqLworICAgICAgICAvKiBub3cgZW5jcnlwdCBpdCB0byByZXN0b3JlIGl0IHRvIGl0cyBvcmlnaW5hbCB2YWxpZCBERVMga2V5IHZhbHVlICovCisjaWZkZWYgTUlUX0NVUlJFTlQKKyAgICAgICAga2RhdGEuZGF0YSA9IGs0X3Nlc3Npb25fa2V5OworICAgICAgICBrZGF0YS5sZW5ndGggPSA4OworCisgICAgICAgIGVuY2RhdGEuY2lwaGVydGV4dC5kYXRhID0gazRfc2Vzc2lvbl9rZXk7CisgICAgICAgIGVuY2RhdGEuY2lwaGVydGV4dC5sZW5ndGggPSA4OworICAgICAgICBlbmNkYXRhLmVuY3R5cGUgPSBFTkNUWVBFX1VOS05PV047CisKKyAgICAgICAgaWYgKGNvZGUgPSBrcmI1X2NfZW5jcnlwdChrNV9jb250ZXh0LCAmazRfa3Jia2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAma2RhdGEsICZlbmNkYXRhKSkgeworICAgICAgICAgICAgY29tX2VycigiazRfYXV0aF9yZXBseSIsIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAid2hpbGUgZW5jcnlwdGluZyBzZXNzaW9uX2tleSIpOworICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworICAgICAgICB9CisjZWxzZSAvKiBNSVRfQ1VSUkVOVCAqLworI2lmZGVmIE5UCisgICAgICAgIGRlc19lY2JfZW5jcnlwdChrNF9zZXNzaW9uX2tleSwgazRfc2Vzc2lvbl9rZXksIGs0X3NjaGVkLCAxKTsKKyNlbHNlIC8qIE5UICovCisgICAgICAgIGRlc19lY2JfZW5jcnlwdCgmazRfc2Vzc2lvbl9rZXksICZrNF9zZXNzaW9uX2tleSwgazRfc2NoZWQsIDEpOworI2VuZGlmIC8qIE5UICovCisgICAgICAgIGhleGR1bXAoCisgICAgICAgICAgICAiazRfYXV0aF9yZXBseSBkZXNfZWNiX2VuY3J5cHQoazRfc2Vzc2lvbl9rZXksazRfc2Vzc2lvbl9rZXksMSkiLAorICAgICAgICAgICAgIGs0X3Nlc3Npb25fa2V5LAorICAgICAgICAgICAgIDgKKyAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgaWYgKCEoc3NsX2FjdGl2ZV9mbGFnIHx8IHRsc19hY3RpdmVfZmxhZykpCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgIHsKKyAgICAgICAgLyogQW5kIHRoZW4gdXNlIGl0IHRvIGNvbmZpZ3VyZSB0aGUgZW5jcnlwdGlvbiBzdGF0ZSBtYWNoaW5lLiAqLworICAgICAgICAgICAgc2tleS50eXBlID0gU0tfREVTOworICAgICAgICAgICAgc2tleS5sZW5ndGggPSA4OworICAgICAgICAgICAgc2tleS5kYXRhID0gazRfc2Vzc2lvbl9rZXk7CisgICAgICAgICAgICBlbmNyeXB0X3Nlc3Npb25fa2V5KCZza2V5LCBBVVRIX0NMSUVOVF9UT19TRVJWRVIpOworICAgICAgICB9CisjZW5kaWYgLyogRU5DUllQVElPTiAqLworI2VuZGlmIC8qIFJFTU9WRV9GT1JfRVhQT1JUICovCisgICAgICAgIGFjY2VwdF9jb21wbGV0ZSA9IDE7CisgICAgICAgIGNrbWFrbXNnKHN0clRtcCxzaXplb2Yoc3RyVG1wKSwKKyAgICAgICAgICAgICAgICAgIktlcmJlcm9zIFY0IGFjY2VwdHMgeW91IGFzICIsc3pVc2VyTmFtZSxOVUxMLE5VTEwpOworICAgICAgICBwcmludGYoIiVzXHJcbiIsc3RyVG1wKTsKKyAgICAgICAga3JiNF9lcnJubyA9IDA7CisgICAgICAgIG1ha2VzdHIoJmtyYjRfZXJybXNnLHN0clRtcCk7CisgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9VU0VSKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpZiAocGFyc2VkYXRbNF0gPT0gS1JCNF9SRVNQT05TRSkgeworICAgICAgICBpZiAoZW5kX3N1YiA8IDEyKSB7CisgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisgICAgICAgIH0KKworICAgICAgICBoZXhkdW1wKCJLUkI0X1JFU1BPTlNFICZwYXJzZWRhdFs1XSIsJnBhcnNlZGF0WzVdLDgpOworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgaGV4ZHVtcCgiS1JCNF9SRVNQT05TRSBrNF9jaGFsbGVuZ2UiLGs0X2NoYWxsZW5nZSw4KTsKKworICAgICAgICAvKiBUaGUgZGF0YWJsb2NrIHJldHVybmVkIGZyb20gdGhlIGhvc3Qgc2hvdWxkIG1hdGNoIHRoZSB2YWx1ZSAqLworICAgICAgICAvKiB3ZSBzdG9yZWQgaW4gazRfY2hhbGxlbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZiAobWVtY21wKCZwYXJzZWRhdFs1XSwgazRfY2hhbGxlbmdlLCBzaXplb2YoazRfY2hhbGxlbmdlKSkgIT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCJLZXJiZXJvcyBWNCBhdXRoZW50aWNhdGlvbiBmYWlsZWQhXHJcbiVzXHJcbiIsCisgICAgICAgICAgICAiUmVtb3RlIG1hY2hpbmUgaXMgYmVpbmcgaW1wZXJzb25hdGVkISIpOworICAgICAgICAgICAga3JiNF9lcnJubyA9IC0xOworICAgICAgICAgICAgbWFrZXN0cigma3JiNF9lcnJtc2csIlJlbW90ZSBtYWNoaW5lIGlzIGJlaW5nIGltcGVyc29uYXRlZCEiKTsKKyAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyAgICAgICAgfQorI2Vsc2UgLyogRU5DUllQVElPTiAqLworICAgICAgICBtYWtlc3RyKCZrcmI0X2Vycm1zZywiS2VybWl0IGJ1aWx0IHdpdGhvdXQgc3VwcG9ydCBmb3IgZW5jcnlwdGlvbi4iKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyNlbmRpZiAvKiBFTkNSWVBUSU9OICovCisgICAgICAgIG11dHVhbF9jb21wbGV0ZSA9IDE7CisgICAgICAgIGNrc3RybmNweShzdHJUbXAsIlJlbW90ZSBtYWNoaW5lIGhhcyBiZWVuIG11dHVhbGx5IGF1dGhlbnRpY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJUbXApKTsKKyAgICAgICAgcHJpbnRmKCIlc1xyXG4iLHN0clRtcCk7CisgICAgICAgIGtyYjRfZXJybm8gPSAwOworICAgICAgICBtYWtlc3RyKCZrcmI0X2Vycm1zZyxzdHJUbXApOworICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfVVNFUik7CisgICAgICAgIHJldHVybiBBVVRIX1NVQ0NFU1M7CisgICAgfQorICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogSzQgcGFyc2UgYXV0aGVudGljYXRpb24gSVMgY29tbWFuZAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgcGFyc2VkYXQgLSB0aGUgc3ViLWNvbW1hbmQgZGF0YS4KKyAqCisgKiAgZW5kX3N1YiAtIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgaW4gdGhlICdwYXJzZWRhdCcgYXJyYXkgd2hpY2gKKyAqICAgICAgICAgICAgaXMgdGhlIGxhc3QgYnl0ZSBpbiBhIHN1Yi1uZWdvdGlhdGlvbgorICoKKyAqIFJldHVybnM6IEtlcmJlcm9zIGVycm9yIGNvZGUuCisgKi8KKworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCitrNF9hdXRoX2lzKHVuc2lnbmVkIGNoYXIgKnBhcnNlZGF0LCBpbnQgZW5kX3N1YikKKyNlbHNlCitrNF9hdXRoX2lzKHBhcnNlZGF0LGVuZF9zdWIpIHVuc2lnbmVkIGNoYXIgKnBhcnNlZGF0OyBpbnQgZW5kX3N1YjsKKyNlbmRpZgoreworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBTZXNzaW9uX0tleSBza2V5OworI2lmZGVmIE1JVF9DVVJSRU5UCisgICAgQmxvY2sgZGF0YWJsb2NrLCB0bXBrZXk7CisgICAga3JiNV9kYXRhIGtkYXRhOworICAgIGtyYjVfZW5jX2RhdGEgZW5jZGF0YTsKKyAgICBrcmI1X2Vycm9yX2NvZGUgY29kZTsKKyNlbHNlIC8qIE1JVF9DVVJSRU5UICovCisgICAgQmxvY2sgZGF0YWJsb2NrOworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisjZW5kaWYgIC8qIEVOQ1JZUFRJT04gKi8KKyAgICBjaGFyIHJlYWxtW1JFQUxNX1NaKzFdOworICAgIGNoYXIgaW5zdGFuY2VbSU5TVF9TWl07CisgICAgaW50IHIgPSAwOworICAgIGNoYXIgKiBkYXRhID0gJnBhcnNlZGF0WzVdOworICAgIGludCAgICBjbnQgPSBlbmRfc3ViIC0gNTsKKyAgICBleHRlcm4gY2hhciBteWlwYWRkcltdOworICAgIHN0cnVjdCBob3N0ZW50ICpob3N0OworICAgIHN0cnVjdCBpbl9hZGRyIGluYWRkcjsKKyAgICBpbnQgaTsKKworICAgIGlmIChlbmRfc3ViIDwgNCB8fCBwYXJzZWRhdFsyXSAhPSBBVVRIVFlQRV9LRVJCRVJPU19WNCkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJrNF9hdXRoX2lzIiwiTm90IGtlcmJlcm9zIHY0IiwwKTsKKyAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisgICAgfQorCisgICAgc3dpdGNoIChwYXJzZWRhdFs0XSkgeworICAgIGNhc2UgS1JCX0FVVEg6CisgICAgICAgIGRlYnVnKEYxMTAsIms0X2F1dGhfaXMiLCJLUkJfQVVUSCIsMCk7CisgICAgICAgIGNrc3RybmNweShyZWFsbSxja19rcmI0X2dldHJlYWxtKCksUkVBTE1fU1orMSk7CisgICAgICAgIGlmIChyZWFsbVswXSA9PSAnXDAnKSB7CisgICAgICAgICAgICBTZW5kSzRBdXRoU0IoS1JCX1JFSkVDVCwgKHZvaWQgKikiTm8gbG9jYWwgVjQgUmVhbG0uIiwgLTEpOworICAgICAgICAgICAgcHJpbnRmKCJcclxuPyBLZXJiZXJvcyA0IC0gTm8gTG9jYWwgUmVhbG1cclxuIik7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJrNF9hdXRoX2lzIiwiTm8gbG9jYWwgcmVhbG0iLDApOworICAgICAgICAgICAga3JiNF9lcnJubyA9IC0xOworICAgICAgICAgICAgbWFrZXN0cigma3JiNF9lcnJtc2csIk5vIGxvY2FsIHJlYWxtIik7CisgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjExMCwiazRfYXV0aF9pcyIscmVhbG0sMCk7CisgICAgICAgIGlmICggY250IDwgc2l6ZW9mKGs0X2F1dGguZGF0KSApIHsKKyAgICAgICAgICAgIGs0X2F1dGgubGVuZ3RoID0gY250OworICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopazRfYXV0aC5kYXQsICh2b2lkICopZGF0YSwgazRfYXV0aC5sZW5ndGgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGs0X2F1dGgubGVuZ3RoID0gMDsKKyAgICAgICAgaGV4ZHVtcCgiazRfYXV0aC5kYXQiLGs0X2F1dGguZGF0LCBrNF9hdXRoLmxlbmd0aCk7CisKKyAgICAgICAgLyogR2V0IEluc3RhbmNlICovCisgICAgICAgIGluYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIobXlpcGFkZHIpOworICAgICAgICBob3N0ID0gZ2V0aG9zdGJ5YWRkcigodW5zaWduZWQgY2hhciAqKSZpbmFkZHIsNCxQRl9JTkVUKTsKKyAgICAgICAgaWYgKCBob3N0ICkgeworI2lmZGVmIEhBRERSTElTVAorICAgICAgICAgICAgaG9zdCA9IGNrX2NvcHlob3N0ZW50KGhvc3QpOworI2VuZGlmIC8qIEhBRERSTElTVCAqLworICAgICAgICAgICAgY2tzdHJuY3B5KGluc3RhbmNlLGhvc3QtPmhfbmFtZSxJTlNUX1NaKTsKKyAgICAgICAgICAgIGZvciAoIGk9MDtpPElOU1RfU1o7aSsrICkgeworICAgICAgICAgICAgICAgIGlmICggaW5zdGFuY2VbaV0gPT0gJy4nICkKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VbaV0gPSAnXDAnOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VbaV0gPSB0b2xvd2VyKGluc3RhbmNlW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluc3RhbmNlWzBdID0gJyonOworICAgICAgICAgICAgaW5zdGFuY2VbMV0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHIgPSBrcmJfcmRfcmVxKCZrNF9hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjRfZF9zcnYgPyBrcmI0X2Rfc3J2IDogS1JCNF9TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIDAsICZrNF9hZGF0LCBrNF9rZXl0YWIpKSB7CisKKyAgICAgICAgICAgIGhleGR1bXAoIms0X2FkYXQiLCAmazRfYWRhdCwgc2l6ZW9mKEFVVEhfREFUKSk7CisgICAgICAgICAgICBrcmJfa250b2xuKCZrNF9hZGF0LCBrNF9uYW1lKTsKKyAgICAgICAgICAgIGNrbWFrbXNnKHN0clRtcCxzaXplb2Yoc3RyVG1wKSwKKyAgICAgICAgICAgICAgICAgICAgICJLZXJiZXJvcyBmYWlsZWQgaGltIGFzICIsIGs0X25hbWUsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgIHByaW50ZigiJXNcclxuIixzdHJUbXApOworICAgICAgICAgICAga3JiNF9lcnJubyA9IHI7CisgICAgICAgICAgICBtYWtlc3RyKCZrcmI0X2Vycm1zZyxzdHJUbXApOworICAgICAgICAgICAgU2VuZEs0QXV0aFNCKEtSQl9SRUpFQ1QsICh2b2lkICopa3JiX2dldF9lcnJfdGV4dF9lbnRyeShyKSwgLTEpOworICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworICAgICAgICB9CisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgIG1lbWNweSgodm9pZCAqKWs0X3Nlc3Npb25fa2V5LCAodm9pZCAqKWs0X2FkYXQuc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICBzaXplb2YoQmxvY2spKTsgICAgICAgICAgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgaGV4ZHVtcCgiazRfYXV0aF9pcyBrNF9zZXNzaW9uX2tleSIsazRfc2Vzc2lvbl9rZXksc2l6ZW9mKEJsb2NrKSk7CisjZW5kaWYgLyogRU5DUllQVElPTiAqLworICAgICAgICBrcmJfa250b2xuKCZrNF9hZGF0LCBrNF9uYW1lKTsKKworICAgICAgICBja3N0cm5jcHkoc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWQsazRfbmFtZSxVSURCVUZMRU4pOworICAgICAgICBpZiAoc3pVc2VyTmFtZVJlcXVlc3RlZCAmJiAha3VzZXJvaygmazRfYWRhdCwgazRfbmFtZSkpIHsKKyAgICAgICAgICAgIFNlbmRLNEF1dGhTQihLUkJfQUNDRVBULCAodm9pZCAqKTAsIDApOworICAgICAgICAgICAgaWYgKCAhc3RyY21wKGs0X25hbWUsc3pVc2VyTmFtZVJlcXVlc3RlZCkgKQorICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9WQUxJRCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1VTRVIpOworICAgICAgICAgICAgYWNjZXB0X2NvbXBsZXRlID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFNlbmRLNEF1dGhTQihLUkJfUkVKRUNULAorICAgICAgICAgICAgICAgICAgKHZvaWQgKikidXNlciBpcyBub3QgYXV0aG9yaXplZCIsIC0xKTsKKyAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAga3JiNF9lcnJubyA9IHI7CisgICAgICAgICAgICBtYWtlc3RyKCZrcmI0X2Vycm1zZywidXNlciBpcyBub3QgYXV0aG9yaXplZCIpOworICAgICAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEtSQjRfQ0hBTExFTkdFOgorICAgICAgICBkZWJ1ZyhGMTEwLCJrNF9hdXRoX2lzIiwiS1JCX0NIQUxMRU5HRSIsMCk7CisjaWZuZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgU2VuZEs0QXV0aFNCKEtSQjRfUkVTUE9OU0UsICh2b2lkICopMCwgMCk7CisjZWxzZSAgIC8qIEVOQ1JZUFRJT04gKi8KKyAgICAgICAgaWYgKCFWQUxJREtFWShrNF9zZXNzaW9uX2tleSkpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIFdlIGRvbid0IGhhdmUgYSB2YWxpZCBzZXNzaW9uIGtleSwgc28ganVzdAorICAgICAgICAgICAgKiBzZW5kIGJhY2sgYSByZXNwb25zZSB3aXRoIGFuIGVtcHR5IHNlc3Npb24KKyAgICAgICAgICAgICoga2V5LgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFNlbmRLNEF1dGhTQihLUkI0X1JFU1BPTlNFLCAodm9pZCAqKTAsIDApOworICAgICAgICAgICAgbXV0dWFsX2NvbXBsZXRlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgKiBJbml0aWFsaXplIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBzaW5jZSBpdCdzCisgICAgICAgICogdXNlZCBsYXRlciBvbiBieSB0aGUgZW5jcnlwdGlvbiByb3V0aW5lLgorICAgICAgICAqLworI2lmZGVmIE1JVF9DVVJSRU5UCisgICAgICAgIGtkYXRhLmRhdGEgPSBrNF9zZXNzaW9uX2tleTsKKyAgICAgICAga2RhdGEubGVuZ3RoID0gODsKKworICAgICAgICBpZiAoY29kZSA9IGtyYjVfY19yYW5kb21fc2VlZChrNV9jb250ZXh0LCAma2RhdGEpKSB7CisgICAgICAgICAgICBjb21fZXJyKCJrNF9hdXRoX2lzIiwgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICJ3aGlsZSBzZWVkaW5nIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIik7CisgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoKHZvaWQgKilkYXRhYmxvY2ssICh2b2lkICopZGF0YSwgc2l6ZW9mKEJsb2NrKSk7IC8qIHNhZmUgKi8KKyAgICAgICAgLyoKKyAgICAgICAgKiBUYWtlIHRoZSByZWNlaXZlZCBlbmNyeXB0ZWQgY2hhbGxlbmdlLCBhbmQgZW5jcnlwdAorICAgICAgICAqIGl0IGFnYWluIHRvIGdldCBhIHVuaXF1ZSBzZXNzaW9uX2tleSBmb3IgdGhlCisgICAgICAgICogRU5DUllQVCBvcHRpb24uCisgICAgICAgICovCisgICAgICAgIGs0X2tyYmtleS5lbmN0eXBlID0gRU5DVFlQRV9ERVNfQ0JDX1JBVzsKKyAgICAgICAgazRfa3Jia2V5Lmxlbmd0aCA9IDg7CisgICAgICAgIGs0X2tyYmtleS5jb250ZW50cyA9IGs0X3Nlc3Npb25fa2V5OworCisgICAgICAgIGtkYXRhLmRhdGEgPSBkYXRhYmxvY2s7CisgICAgICAgIGtkYXRhLmxlbmd0aCA9IDg7CisKKyAgICAgICAgZW5jZGF0YS5jaXBoZXJ0ZXh0LmRhdGEgPSB0bXBrZXk7CisgICAgICAgIGVuY2RhdGEuY2lwaGVydGV4dC5sZW5ndGggPSA4OworICAgICAgICBlbmNkYXRhLmVuY3R5cGUgPSBFTkNUWVBFX1VOS05PV047CisKKyAgICAgICAgaWYgKGNvZGUgPSBrcmI1X2NfZW5jcnlwdChrNV9jb250ZXh0LCAmazRfa3Jia2V5LCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2RhdGEsICZlbmNkYXRhKSkgeworICAgICAgICAgICAgY29tX2VycigiazRfYXV0aF9pcyIsIGNvZGUsICJ3aGlsZSBlbmNyeXB0aW5nIHJhbmRvbSBrZXkiKTsKKyAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyAgICAgICAgfQorCisjaWZkZWYgQ0tfU1NMCisgICAgICAgIGlmICghKHNzbF9hY3RpdmVfZmxhZyB8fCB0bHNfYWN0aXZlX2ZsYWcpKQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICB7CisgICAgICAgICAgICBza2V5LnR5cGUgPSBTS19ERVM7CisgICAgICAgICAgICBza2V5Lmxlbmd0aCA9IDg7CisgICAgICAgICAgICBza2V5LmRhdGEgPSB0bXBrZXk7CisgICAgICAgICAgICBlbmNyeXB0X3Nlc3Npb25fa2V5KCZza2V5LCBBVVRIX1NFUlZFUl9UT19DTElFTlQpOworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgICogTm93IGRlY3J5cHQgdGhlIHJlY2VpdmVkIGVuY3J5cHRlZCBjaGFsbGVuZ2UsCisgICAgICAgICogaW5jcmVtZW50IGJ5IG9uZSwgcmUtZW5jcnlwdCBpdCBhbmQgc2VuZCBpdCBiYWNrLgorICAgICAgICAqLworICAgICAgICBlbmNkYXRhLmNpcGhlcnRleHQuZGF0YSA9IGRhdGFibG9jazsKKyAgICAgICAgZW5jZGF0YS5jaXBoZXJ0ZXh0Lmxlbmd0aCA9IDg7CisgICAgICAgIGVuY2RhdGEuZW5jdHlwZSA9IEVOQ1RZUEVfVU5LTk9XTjsKKworICAgICAgICBrZGF0YS5kYXRhID0gazRfY2hhbGxlbmdlOworICAgICAgICBrZGF0YS5sZW5ndGggPSA4OworCisgICAgICAgIGlmIChjb2RlID0ga3JiNV9jX2RlY3J5cHQoazVfY29udGV4dCwgJms0X2tyYmtleSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY2RhdGEsICZrZGF0YSkpIHsKKyAgICAgICAgICAgIGNvbV9lcnIoIms0X2F1dGhfaXMiLCBjb2RlLCAid2hpbGUgZGVjcnlwdGluZyBjaGFsbGVuZ2UiKTsKKyAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyAgICAgICAgfQorI2Vsc2UgLyogTUlUX0NVUlJFTlQgKi8KKyAgICAgICAgZGVzX3NldF9yYW5kb21fZ2VuZXJhdG9yX3NlZWQoazRfc2Vzc2lvbl9rZXkpOworICAgICAgICByID0gZGVzX2tleV9zY2hlZChrNF9zZXNzaW9uX2tleSwgazRfc2NoZWQpOworICAgICAgICBpZiAoIHIgPT0gLTEgKSB7CisgICAgICAgICAgICBwcmludGYoIj9JbnZhbGlkIERFUyBrZXkgc3BlY2lmaWVkIGluIGNyZWRlbnRpYWxzXHJcbiIpOworICAgICAgICAgICAgZGVidWcoRjExMCwiYXV0aF9pcyBDSEFMTEVOR0UiLAorICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIERFUyBLZXkgc3BlY2lmaWVkIGluIGNyZWRlbnRpYWxzIiwwKTsKKyAgICAgICAgfSBlbHNlIGlmICggciA9PSAtMiApIHsKKyAgICAgICAgICAgIHByaW50ZigiP1dlYWsgREVTIGtleSBzcGVjaWZpZWQgaW4gY3JlZGVudGlhbHNcclxuIik7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJhdXRoX2lzIENIQUxMRU5HRSIsCisgICAgICAgICAgICAgICAgICAgIndlYWsgREVTIEtleSBzcGVjaWZpZWQgaW4gY3JlZGVudGlhbHMiLDApOworICAgICAgICB9IGVsc2UgaWYgKCByICE9IDAgKSB7CisgICAgICAgICAgICBwcmludGYoIj9ERVMgS2V5IFNjaGVkdWxlIG5vdCBzZXQgYnkgY3JlZGVudGlhbHNcclxuIik7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJhdXRoX2lzIENIQUxMRU5HRSIsCisgICAgICAgICAgICAgICAgICAgIkRFUyBLZXkgU2NoZWR1bGUgbm90IHNldCBieSBjcmVkZW50aWFscyIsMCk7CisgICAgICAgIH0KKyAgICAgICAgaGV4ZHVtcCgiYXV0aF9pcyBzY2hlZHVsZSIsazRfc2NoZWQsOCoxNik7CisKKyAgICAgICAgbWVtY3B5KCh2b2lkICopZGF0YWJsb2NrLCAodm9pZCAqKWRhdGEsIHNpemVvZihCbG9jaykpOyAvKiBzYWZlICovCisgICAgICAgIGhleGR1bXAoImF1dGhfaXMgY2hhbGxlZ2UiLGRhdGFibG9jayxzaXplb2YoQmxvY2spKTsKKworICAgICAgICAvKgorICAgICAgICAqIFRha2UgdGhlIHJlY2VpdmVkIGVuY3J5cHRlZCBjaGFsbGVuZ2UsIGFuZCBlbmNyeXB0CisgICAgICAgICogaXQgYWdhaW4gdG8gZ2V0IGEgdW5pcXVlIGs0X3Nlc3Npb25fa2V5IGZvciB0aGUKKyAgICAgICAgKiBFTkNSWVBUIG9wdGlvbi4KKyAgICAgICAgKi8KKyNpZmRlZiBOVAorICAgICAgICBkZXNfZWNiX2VuY3J5cHQoZGF0YWJsb2NrLCBrNF9zZXNzaW9uX2tleSwgazRfc2NoZWQsIDEpOworI2Vsc2UgLyogTlQgKi8KKyAgICAgICAgZGVzX2VjYl9lbmNyeXB0KCZkYXRhYmxvY2ssICZrNF9zZXNzaW9uX2tleSwgazRfc2NoZWQsIDEpOworI2VuZGlmIC8qIE5UICovCisgICAgICAgIGhleGR1bXAoImF1dGhfaXMgZGVzX2VjYl9lbmNyeXB0KGRhdGFibG9jayxrNF9zZXNzaW9uX2tleSwxKSIsCisgICAgICAgICAgICAgICAgIGs0X3Nlc3Npb25fa2V5LDgpOworCisjaWZkZWYgQ0tfU1NMCisgICAgICAgIGlmICghKHNzbF9hY3RpdmVfZmxhZyB8fCB0bHNfYWN0aXZlX2ZsYWcpKQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICB7CisgICAgICAgICAgICBza2V5LnR5cGUgPSBTS19ERVM7CisgICAgICAgICAgICBza2V5Lmxlbmd0aCA9IDg7CisgICAgICAgICAgICBza2V5LmRhdGEgPSBrNF9zZXNzaW9uX2tleTsKKyAgICAgICAgICAgIGVuY3J5cHRfc2Vzc2lvbl9rZXkoJnNrZXksIEFVVEhfU0VSVkVSX1RPX0NMSUVOVCk7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgKiBOb3cgZGVjcnlwdCB0aGUgcmVjZWl2ZWQgZW5jcnlwdGVkIGNoYWxsZW5nZSwKKyAgICAgICAgKiBpbmNyZW1lbnQgYnkgb25lLCByZS1lbmNyeXB0IGl0IGFuZCBzZW5kIGl0IGJhY2suCisgICAgICAgICovCisjaWZkZWYgTlQKKyAgICAgICAgZGVzX2VjYl9lbmNyeXB0KGRhdGFibG9jaywgazRfY2hhbGxlbmdlLCBrNF9zY2hlZCwgMCk7CisjZWxzZSAvKiBOVCAqLworICAgICAgICBkZXNfZWNiX2VuY3J5cHQoJmRhdGFibG9jaywgJms0X2NoYWxsZW5nZSwgazRfc2NoZWQsIDApOworI2VuZGlmIC8qIE5UICovCisgICAgICAgIGhleGR1bXAoImF1dGhfaXMgZGVzX2VjYl9lbmNyeXB0KGRhdGFibG9jayxrNF9jaGFsbGVuZ2UsMCkiLAorICAgICAgICAgICAgICAgICBrNF9zZXNzaW9uX2tleSw4KTsKKyNlbmRpZiAvKiBNSVRfQ1VSUkVOVCAqLworICAgICAgICBmb3IgKHIgPSA3OyByID49IDA7IHItLSkgeworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IHQ7CisgICAgICAgICAgICB0ID0gKHVuc2lnbmVkIGludClrNF9jaGFsbGVuZ2Vbcl0gKyAxOworICAgICAgICAgICAgazRfY2hhbGxlbmdlW3JdID0gdDsgICAgICAgIC8qIGlnbm9yZSBvdmVyZmxvdyAqLworICAgICAgICAgICAgaWYgKHQgPCAyNTYpICAgICAgICAgICAgICAgIC8qIGlmIG5vIG92ZXJmbG93LCBhbGwgZG9uZSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGhleGR1bXAoImF1dGhfaXMgazRfY2hhbGxlbmdlKzEiLGs0X2NoYWxsZW5nZSw4KTsKKworI2lmZGVmIE1JVF9DVVJSRU5UCisgICAgICAgIGtkYXRhLmRhdGEgPSBrNF9jaGFsbGVuZ2U7CisgICAgICAgIGtkYXRhLmxlbmd0aCA9IDg7CisKKyAgICAgICAgZW5jZGF0YS5jaXBoZXJ0ZXh0LmRhdGEgPSBrNF9jaGFsbGVuZ2U7CisgICAgICAgIGVuY2RhdGEuY2lwaGVydGV4dC5sZW5ndGggPSA4OworICAgICAgICBlbmNkYXRhLmVuY3R5cGUgPSBFTkNUWVBFX1VOS05PV047CisKKyAgICAgICAgaWYgKGNvZGUgPSBrcmI1X2NfZW5jcnlwdChrNV9jb250ZXh0LCAmazRfa3Jia2V5LCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2RhdGEsICZlbmNkYXRhKSkgeworICAgICAgICAgICAgY29tX2VycigiazRfYXV0aF9pcyIsIGNvZGUsICJ3aGlsZSBkZWNyeXB0aW5nIGNoYWxsZW5nZSIpOworICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworICAgICAgICB9CisjZWxzZSAvKiBNSVRfQ1VSUkVOVCAqLworI2lmZGVmIE5UCisgICAgICAgIGRlc19lY2JfZW5jcnlwdChrNF9jaGFsbGVuZ2UsIGs0X2NoYWxsZW5nZSwgazRfc2NoZWQsIDEpOworI2Vsc2UgLyogTlQgKi8KKyAgICAgICAgZGVzX2VjYl9lbmNyeXB0KCZrNF9jaGFsbGVuZ2UsICZrNF9jaGFsbGVuZ2UsIGs0X3NjaGVkLCAxKTsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICBoZXhkdW1wKCJhdXRoX2lzIGRlc19lY2JfZW5jcnlwdChrNF9jaGFsbGVuZ2Vfa2V5LGs0X2NoYWxsZW5nZSwxKSIsCisgICAgICAgICAgICAgICAgIGs0X2NoYWxsZW5nZSw4KTsKKworI2VuZGlmIC8qIE1JVF9DVVJSRU5UICovCisgICAgICAgIFNlbmRLNEF1dGhTQihLUkI0X1JFU1BPTlNFLCh2b2lkICopazRfY2hhbGxlbmdlLHNpemVvZihrNF9jaGFsbGVuZ2UpKTsKKyNlbmRpZiAgLyogRU5DUllQVElPTiAqLworICAgICAgICBtdXR1YWxfY29tcGxldGUgPSAxOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgxKQorICAgICAgICAgICAgcHJpbnRmKCJVbmtub3duIEtlcmJlcm9zIG9wdGlvbiAlZFxyXG4iLCBkYXRhWy0xXSk7CisgICAgICAgIFNlbmRLNEF1dGhTQihLUkJfUkVKRUNULCAwLCAwKTsKKyAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgfQorICAgIGtyYjRfZXJybm8gPSByOworICAgIG1ha2VzdHIoJmtyYjRfZXJybXNnLGtyYl9nZXRfZXJyX3RleHRfZW50cnkoa3JiNF9lcnJubykpOworICAgIHJldHVybihBVVRIX1NVQ0NFU1MpOworfQorI2VuZGlmIC8qIEtSQjQgKi8KKworI2lmZGVmIEtSQjUKK2ludAorY2tfa3JiNV9hdXRvZ2V0X1RHVChjaGFyICogcmVhbG0pCit7CisgICAgZXh0ZXJuIHN0cnVjdCBrcmJfb3BfZGF0YSBrcmJfb3A7CisgICAgZXh0ZXJuIHN0cnVjdCBrcmI1X2luaXRfZGF0YSBrcmI1X2luaXQ7CisgICAgY2hhciBwYXNzd2RbUFdEX1NaXTsKKyAgICBjaGFyIHByb21wdFs2NF07CisgICAgY2hhciAqIHNhdmVyZWFsbT1OVUxMOworICAgIGludCAgcmMgPSAtMTsKKyAgICBleHRlcm4gY2hhciAqIGs1cHJwcm9tcHQ7CisgICAgZXh0ZXJuIGNoYXIgKiBrNXB3cHJvbXB0OworCisgICAgaW5pX2tlcmIoKTsgICAgICAgICAvKiBQbGFjZSBkZWZhdWx0cyBpbiBhYm92ZSBzdHJ1Y3RzICovCisgICAgcGFzc3dkWzBdID0gJ1wwJzsKKworICAgIGlmICgga3JiNV9pbml0LnByaW5jaXBhbCA9PSBOVUxMIHx8CisgICAgICAgICBrcmI1X2luaXQucHJpbmNpcGFsWzBdID09ICdcMCcpIHsKKyAgICAgICAgaW50IG9rID0gdXFfdHh0KE5VTEwsazVwcnByb21wdCAmJiBrNXBycHJvbXB0WzBdID8gazVwcnByb21wdCA6CisgICAgICAgICAgICAgICAgICAiS2VyYmVyb3MgNSBQcmluY2lwYWw6ICIsMixOVUxMLHBhc3N3ZCxQV0RfU1otMSxOVUxMLAorCQkJREVGQVVMVF9VUV9USU1FT1VUKTsKKyAgICAgICAgaWYgKCBvayAmJiBwYXNzd2RbMF0gKQorICAgICAgICAgICAgbWFrZXN0cigma3JiNV9pbml0LnByaW5jaXBhbCxwYXNzd2QpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgLyogU2F2ZSByZWFsbSBpbiBpbml0IHN0cnVjdHVyZSBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgKi8KKyAgICBpZiAoIHJlYWxtICkgeworICAgICAgICBzYXZlcmVhbG0gPSBrcmI1X2luaXQucmVhbG07CisgICAgICAgIGtyYjVfaW5pdC5yZWFsbSA9IHJlYWxtOworICAgIH0KKworICAgIGlmICggcGFzc3dkWzBdIHx8ICEocHdidWZbMF0gJiYgcHdmbGcpICkgeworICAgICAgICBpbnQgb2s7CisgICAgICAgIGlmICggazVwd3Byb21wdCAmJiBrNXB3cHJvbXB0WzBdICYmCisgICAgICAgICAgICAgKHN0cmxlbihrNXB3cHJvbXB0KSArIHN0cmxlbihrcmI1X2luaXQucHJpbmNpcGFsKSArCisgICAgICAgICAgICAgIHN0cmxlbihrcmI1X2luaXQucmVhbG0pIC0gNCkgPCBzaXplb2YocHJvbXB0KSkgeworICAgICAgICAgICAgc3ByaW50Zihwcm9tcHQsazVwd3Byb21wdCxrcmI1X2luaXQucHJpbmNpcGFsLGtyYjVfaW5pdC5yZWFsbSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICBja21ha3htc2cocHJvbXB0LHNpemVvZihwcm9tcHQpLAorICAgICAgICAgICAgICAgICAgazVwd3Byb21wdCAmJiBrNXB3cHJvbXB0WzBdID8gazVwd3Byb21wdCA6CisgICAgICAgICAgICAgICAgICAiS2VyYmVyb3MgNSBQYXNzd29yZCBmb3IgIiwKKyAgICAgICAgICAgICAgICAgIGtyYjVfaW5pdC5wcmluY2lwYWwsIkAiLGtyYjVfaW5pdC5yZWFsbSwiOiAiLAorICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTAorICAgICAgICAgICAgICAgICApOworICAgICAgICBvayA9IHVxX3R4dChOVUxMLHByb21wdCwyLE5VTEwscGFzc3dkLFBXRF9TWi0xLE5VTEwsCisJCSAgICBERUZBVUxUX1VRX1RJTUVPVVQpOworICAgICAgICBpZiAoICFvayApCisgICAgICAgICAgICBwYXNzd2RbMF0gPSAnXDAnOworICAgIH0gZWxzZSB7CisgICAgICAgIGNrc3RybmNweShwYXNzd2QscHdidWYsc2l6ZW9mKHBhc3N3ZCkpOworI2lmZGVmIE9TMgorICAgICAgICBpZiAoIHB3Y3J5cHQgKQorICAgICAgICAgICAgY2tfZW5jcnlwdCgoY2hhciAqKXBhc3N3ZCk7CisjZW5kaWYgLyogT1MyICovCisgICAgfQorCisgICAgaWYgKCBwYXNzd2RbMF0gKSB7CisgICAgICAgIGV4dGVybiBzdHJ1Y3Qga3JiNF9pbml0X2RhdGEga3JiNF9pbml0OworICAgICAgICBjaGFyICogc2F2ZWs0cmVhbG09TlVMTDsKKworICAgICAgICBtYWtlc3RyKCZrcmI1X2luaXQucGFzc3dvcmQscGFzc3dkKTsKKworICAgICAgICBpZiAoIGtyYjVfZF9nZXRrNCApIHsKKyAgICAgICAgICAgIGtyYjVfaW5pdC5nZXRrNCA9IDE7CisgICAgICAgICAgICBtYWtlc3RyKCZrcmI0X2luaXQucHJpbmNpcGFsLGtyYjVfaW5pdC5wcmluY2lwYWwpOworICAgICAgICAgICAgbWFrZXN0cigma3JiNF9pbml0LnBhc3N3b3JkLHBhc3N3ZCk7CisgICAgICAgICAgICBpZiAoIHJlYWxtICkgeworICAgICAgICAgICAgICAgIHNhdmVrNHJlYWxtID0ga3JiNF9pbml0LnJlYWxtOworICAgICAgICAgICAgICAgIGtyYjRfaW5pdC5yZWFsbSA9IHJlYWxtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmMgPSBja19rcmI1X2luaXRUR1QoJmtyYl9vcCwgJmtyYjVfaW5pdCwma3JiNF9pbml0KTsKKworICAgICAgICAgICAgaWYgKCBzYXZlazRyZWFsbSApCisgICAgICAgICAgICAgICAga3JiNF9pbml0LnJlYWxtID0gc2F2ZWs0cmVhbG07CisgICAgICAgICAgICBmcmVlKGtyYjRfaW5pdC5wYXNzd29yZCk7CisgICAgICAgICAgICBrcmI0X2luaXQucGFzc3dvcmQgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmMgPSBja19rcmI1X2luaXRUR1QoJmtyYl9vcCwgJmtyYjVfaW5pdCxOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyZWUoa3JiNV9pbml0LnBhc3N3b3JkKTsKKyAgICAgICAga3JiNV9pbml0LnBhc3N3b3JkID0gTlVMTDsKKworICAgICAgICBtZW1zZXQocGFzc3dkLDAsUFdEX1NaKTsKKyAgICB9CisKKyAgICAvKiByZXN0b3JlIHJlYWxtIHRvIGluaXQgc3RydWN0dXJlIGlmIG5lZWRlZCAqLworICAgIGlmICggc2F2ZXJlYWxtICkKKyAgICAgICAga3JiNV9pbml0LnJlYWxtID0gc2F2ZXJlYWxtOworICAgIHJldHVybihyYyA9PSAwKTsKK30KKworc3RhdGljIGtyYjVfZXJyb3JfY29kZQorI2lmZGVmIENLX0FOU0lDCitrNV9nZXRfY2NhY2hlKCBrcmI1X2NvbnRleHQgazVfY29udGV4dCwga3JiNV9jY2FjaGUgKiBwX2NjYWNoZSwKKyAgICAgICAgICAgICAgIGNoYXIgKiBjY19uYW1lICkKKyNlbHNlICAvKiBDS19BTlNJQyAqLworazVfZ2V0X2NjYWNoZShrNV9jb250ZXh0LCBwX2NjYWNoZSwgY2NfbmFtZSkKKyAgICBrcmI1X2NvbnRleHQgazVfY29udGV4dDsKKyAgICBrcmI1X2NjYWNoZSAqIHBfY2NhY2hlOworICAgIGNoYXIgKiBjY19uYW1lOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAga3JiNV9lcnJvcl9jb2RlIHI9MDsKKyAgICBjaGFyIGNjX3RtcFtDS01BWFBBVEgrMV07CisgICAgY29uc3QgY2hhciAqIGRlZl9uYW1lID0gTlVMTDsKKworI2lmbmRlZiBIRUlNREFMCisgICAgaWYgKCBjY19uYW1lICkgeworICAgICAgICBpZiAoIHN0cm5jbXAoIkZJTEU6IixjY19uYW1lLDUpICYmCisgICAgICAgICAgICAgc3RybmNtcCgiTUVNT1JZOiIsY2NfbmFtZSw3KSAmJgorICAgICAgICAgICAgIHN0cm5jbXAoIkFQSToiLGNjX25hbWUsNCkgJiYKKyAgICAgICAgICAgICBzdHJuY21wKCJTVERJTzoiLGNjX25hbWUsNikgJiYKKwkgICAgIHN0cm5jbXAoIk1TTFNBOiIsY2NfbmFtZSw2KSkKKyNpZmRlZiBOVAorICAgICAgICAgICAgY2ttYWttc2coY2NfdG1wLENLTUFYUEFUSCwiQVBJOiIsY2NfbmFtZSxOVUxMLE5VTEwpOworI2Vsc2UgLyogTlQgKi8KKyAgICAgICAgICAgIGNrbWFrbXNnKGNjX3RtcCxDS01BWFBBVEgsIkZJTEU6IixjY19uYW1lLE5VTEwsTlVMTCk7CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBja3N0cm5jcHkoY2NfdG1wLGNjX25hbWUsQ0tNQVhQQVRIKTsKKyAgICAgICAgfQorICAgICAgICByID0ga3JiNV9jY19yZXNvbHZlIChrNV9jb250ZXh0LCBjY190bXAsIHBfY2NhY2hlKTsKKyAgICAgICAgaWYgKHIgIT0gMCkgeworICAgICAgICAgICAgY29tX2VycigiazVfZ2V0X2NjYWNoZSByZXNvbHZpbmcgY2NhY2hlIixyLAorICAgICAgICAgICAgICAgICAgICAgY2NfdG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSBHU1NBUEkgc2VlcyB0aGUgc2FtZSBjYWNoZSB3ZSBhcmUgdXNpbmcgKi8KKyAgICAgICAgICAgIGNoYXIgYnVmWzEyOF07CisgICAgICAgICAgICBja21ha21zZygoY2hhciAqKWJ1ZiwxMjgsIktSQjVDQ05BTUU9IixjY190bXAsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgIHB1dGVudihidWYpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgga3JiNV9kX2NjICkgeworICAgICAgICBpZiAoIHN0cm5jbXAoIkZJTEU6IixrcmI1X2RfY2MsNSkgJiYKKyAgICAgICAgICAgICBzdHJuY21wKCJNRU1PUlk6IixrcmI1X2RfY2MsNykgJiYKKyAgICAgICAgICAgICBzdHJuY21wKCJBUEk6IixrcmI1X2RfY2MsNCkgJiYKKyAgICAgICAgICAgICBzdHJuY21wKCJTVERJTzoiLGtyYjVfZF9jYyw2KSAmJgorCSAgICAgc3RybmNtcCgiTVNMU0E6Iiwga3JiNV9kX2NjLDYpKQorI2lmZGVmIE5UCisgICAgICAgICAgICBja21ha21zZyhjY190bXAsQ0tNQVhQQVRILCJBUEk6IixrcmI1X2RfY2MsTlVMTCxOVUxMKTsKKyNlbHNlIC8qIE5UICovCisgICAgICAgICAgICBja21ha21zZyhjY190bXAsQ0tNQVhQQVRILCJGSUxFOiIsa3JiNV9kX2NjLE5VTEwsTlVMTCk7CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBja3N0cm5jcHkoY2NfdG1wLGtyYjVfZF9jYyxDS01BWFBBVEgpOworICAgICAgICB9CisgICAgICAgIHIgPSBrcmI1X2NjX3Jlc29sdmUgKGs1X2NvbnRleHQsIGNjX3RtcCwgcF9jY2FjaGUpOworICAgICAgICBpZiAociAhPSAwKSB7CisgICAgICAgICAgICBjb21fZXJyKCJrNV9nZXRfY2NhY2hlIHJlc29sdmluZyBjY2FjaGUiLHIsCisgICAgICAgICAgICAgICAgICAgICBrcmI1X2RfY2MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTWFrZSBzdXJlIEdTU0FQSSBzZWVzIHRoZSBzYW1lIGNhY2hlIHdlIGFyZSB1c2luZyAqLworICAgICAgICAgICAgY2hhciBidWZbMTI4XTsKKyAgICAgICAgICAgIGNrbWFrbXNnKChjaGFyICopYnVmLDEyOCwiS1JCNUNDTkFNRT0iLGNjX3RtcCxOVUxMLE5VTEwpOworICAgICAgICAgICAgcHV0ZW52KGJ1Zik7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgeworICAgICAgICBpZiAoKHIgPSBrcmI1X2NjX2RlZmF1bHQoazVfY29udGV4dCwgcF9jY2FjaGUpKSkgeworICAgICAgICAgICAgY29tX2VycigiazVfZ2V0X2NjYWNoZSIsciwid2hpbGUgZ2V0dGluZyBkZWZhdWx0IGNjYWNoZSIpOworICAgICAgICB9CisgICAgfQorICAgIC8qIGRvIG5vdCBzZXQga3JiNV9lcnJuby9rcmI1X2Vycm1zZyBoZXJlIHNpbmNlIHRoZSB2YWx1ZSByZXR1cm5lZCAqLworICAgIC8qIGlzIGJlaW5nIHBhc3NlZCBpbnRlcm5hbGx5IHdpdGhpbiB0aGUga3JiNSBmdW5jdGlvbnMuICAgICAgICAgICAqLworICAgIHJldHVybihyKTsKK30KKworCitjaGFyICoKK2NrX2tyYjVfcmVhbG1vZmhvc3QoY2hhciAqaG9zdCkKK3sKKyAgICBjaGFyICoqIHJlYWxtbGlzdD1OVUxMOworICAgIGtyYjVfY29udGV4dCBwcml2YXRlX2NvbnRleHQ9TlVMTDsKKyAgICBzdGF0aWMgY2hhciAqIHJlYWxtID0gTlVMTDsKKworICAgIGlmICggIWhvc3QgKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICggcmVhbG0gKSB7CisgICAgICAgIGZyZWUocmVhbG0pOworICAgICAgICByZWFsbSA9IE5VTEw7CisgICAgfQorCisgICAgLyogY3JlYXRlIHByaXZhdGVfY29udGV4dCAqLworICAgIGlmIChrcmI1X2luaXRfY29udGV4dCgmcHJpdmF0ZV9jb250ZXh0KSkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJja19rcmI1X3JlYWxtb2Zob3N0KCkiLCJ1bmFibGUgdG8gaW5pdF9jb250ZXh0IiwwKTsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKworICAgIGtyYjVfZ2V0X2hvc3RfcmVhbG0ocHJpdmF0ZV9jb250ZXh0LGhvc3QsJnJlYWxtbGlzdCk7CisgICAgaWYgKHJlYWxtbGlzdCAmJiByZWFsbWxpc3RbMF0pIHsKKyAgICAgICAgbWFrZXN0cigmcmVhbG0scmVhbG1saXN0WzBdKTsKKyAgICAgICAga3JiNV9mcmVlX2hvc3RfcmVhbG0ocHJpdmF0ZV9jb250ZXh0LHJlYWxtbGlzdCk7CisgICAgICAgIHJlYWxtbGlzdCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKCBwcml2YXRlX2NvbnRleHQgKSB7CisgICAgICAgIGtyYjVfZnJlZV9jb250ZXh0KHByaXZhdGVfY29udGV4dCk7CisgICAgICAgIHByaXZhdGVfY29udGV4dCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGNrc3RyY2hyKHJlYWxtLCcuJykgPT0gTlVMTCkgeworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIGNoYXIgKiBwID0gaG9zdDsKKyAgICAgICAgd2hpbGUgKCAocCA9IGNrc3RyY2hyKHAsJy4nKSkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgICAgICBpZiAobiA9PSAxKSB7CisgICAgICAgICAgICBtYWtlc3RyKCZyZWFsbSxob3N0KTsKKyAgICAgICAgICAgIGNrdXBwZXIocmVhbG0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJlZShyZWFsbSk7CisgICAgICAgICAgICByZWFsbSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKHJlYWxtKTsKK30KKworLyoKKyAqCisgKiBLNV9hdXRoX3NlbmQgLSBnZXRzIGF1dGhlbnRpY2F0aW9uIGJpdHMgd2UgbmVlZCB0byBzZW5kIHRvIEtEQy4KKyAqCisgKiBDb2RlIGxpZnRlZCBmcm9tIHRlbG5ldCBzYW1wbGUgY29kZSBpbiB0aGUgYXBwbCBkaXJlY3RvcnkuCisgKgorICogUmVzdWx0IGlzIGxlZnQgaW4gazVfYXV0aAorICoKKyAqIFJldHVybnM6IDAgb24gZmFpbHVyZSwgMSBvbiBzdWNjZXNzCisgKgorICovCisKK3N0YXRpYyBpbnQKKyNpZmRlZiBDS19BTlNJQworazVfYXV0aF9zZW5kKGludCBob3csIGludCBlbmNyeXB0LCBpbnQgZm9yd2FyZCkKKyNlbHNlCitrNV9hdXRoX3NlbmQoaG93LGVuY3J5cHQsZm9yd2FyZCkgaW50IGhvdzsgaW50IGVuY3J5cHQ7IGludCBmb3J3YXJkOworI2VuZGlmCit7CisgICAga3JiNV9lcnJvcl9jb2RlIHI9MDsKKyAgICBrcmI1X2NjYWNoZSBjY2FjaGU9TlVMTDsKKyNpZm5kZWYgSEVJTURBTAorICAgIGtyYjVfY3JlZHMgY3JlZHM7CisjZW5kaWYgLyogSEVJTURBTCAqLworICAgIGtyYjVfY3JlZHMgKiBuZXdfY3JlZHM9TlVMTDsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAga3JiNV9rZXlibG9jayAqbmV3a2V5ID0gMDsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAga3JiNV9mbGFncyBhcF9vcHRzLCBhdXRoX2ZsYWdzOworICAgIGNoYXIgdHlwZV9jaGVja1szMl07CisgICAga3JiNV9kYXRhIGNoZWNrc3VtOworICAgIGludCBsZW49MDsKKyAgICBjaGFyICogcmVhbG0gPSBOVUxMOworICAgIGNoYXIgdGd0WzI1Nl07CisKKyAgICByZWFsbSA9IGNrX2tyYjVfcmVhbG1vZmhvc3Qoc3pIb3N0TmFtZSk7CisgICAgaWYgKCFyZWFsbSkgeworICAgICAgICBja3N0cm5jcHkoc3RyVG1wLCAiQ2FuJ3QgZmluZCByZWFsbSBmb3IgaG9zdCBcIiIsQVVUSFRNUEJMKTsKKyAgICAgICAgY2tzdHJuY2F0KHN0clRtcCwgc3pIb3N0TmFtZSxBVVRIVE1QQkwpOworICAgICAgICBja3N0cm5jYXQoc3RyVG1wLCAiXCIiLEFVVEhUTVBCTCk7CisgICAgICAgIHByaW50ZigiP0tlcmJlcm9zIDUgZXJyb3I6ICVzXHJcbiIsc3RyVG1wKTsKKyAgICAgICAga3JiNV9lcnJubyA9IEtSQjVfRVJSX0hPU1RfUkVBTE1fVU5LTk9XTjsKKyAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csc3RyVG1wKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIGNrbWFrbXNnKHRndCxzaXplb2YodGd0KSwia3JidGd0LyIscmVhbG0sIkAiLHJlYWxtKTsKKyAgICBkZWJ1ZyhGMTEwLCJrNV9hdXRoX3NlbmQgVEdUIix0Z3QsMCk7CisgICAgaWYgKCBrcmI1X2F1dG9nZXQgJiYKKyAgICAgICAgICEoKGNrX2tyYjVfdGt0X2lzdmFsaWQoTlVMTCx0Z3QpID4gMCkgfHwKKyAgICAgICAgICAoY2tfa3JiNV9pc190Z3RfdmFsaWQoKSA+IDApKSApCisgICAgICAgIGNrX2tyYjVfYXV0b2dldF9UR1QocmVhbG0pOworCisgICAgciA9IGs1X2dldF9jY2FjaGUoazVfY29udGV4dCwmY2NhY2hlLE5VTEwpOworICAgIGlmICggciApIHsKKyAgICAgICAgY29tX2VycihOVUxMLCByLCAid2hpbGUgYXV0aG9yaXppbmcgKDApLiIpOworICAgICAgICBrcmI1X2Vycm5vID0gcjsKKyAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csZXJyb3JfbWVzc2FnZShrcmI1X2Vycm5vKSk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyNpZm5kZWYgSEVJTURBTAorICAgIG1lbXNldCgoY2hhciAqKSZjcmVkcywgMCwgc2l6ZW9mKGNyZWRzKSk7CisgICAgaWYgKHIgPSBrcmI1X3NuYW1lX3RvX3ByaW5jaXBhbChrNV9jb250ZXh0LCBzekhvc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2Rfc3J2ID8ga3JiNV9kX3NydiA6IEtSQjVfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLUkI1X05UX1NSVl9IU1QsICZjcmVkcy5zZXJ2ZXIpKSB7CisgICAgICAgIGNvbV9lcnIoTlVMTCwgciwgIndoaWxlIGF1dGhvcml6aW5nICgxKS4iKTsKKyAgICAgICAga3JiNV9lcnJubyA9IHI7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGVycm9yX21lc3NhZ2Uoa3JiNV9lcnJubykpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgaWYgKGZvcndhcmRfZmxhZykgeworICAgICAgICBpZiAoZndkX3NlcnZlcikgeworICAgICAgICAgICAga3JiNV9mcmVlX3ByaW5jaXBhbChrNV9jb250ZXh0LGZ3ZF9zZXJ2ZXIpOworICAgICAgICAgICAgZndkX3NlcnZlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAga3JiNV9jb3B5X3ByaW5jaXBhbChrNV9jb250ZXh0LGNyZWRzLnNlcnZlciwmZndkX3NlcnZlcik7CisgICAgfQorCisgICAgciA9IGtyYjVfY2NfZ2V0X3ByaW5jaXBhbChrNV9jb250ZXh0LCBjY2FjaGUsICZjcmVkcy5jbGllbnQpOworICAgIGlmIChyKSB7CisgICAgICAgIGNvbV9lcnIoTlVMTCwgciwgIndoaWxlIGF1dGhvcml6aW5nICgyKS4iKTsKKyAgICAgICAga3JiNV9mcmVlX2NyZWRfY29udGVudHMoazVfY29udGV4dCwgJmNyZWRzKTsKKyAgICAgICAga3JiNV9lcnJubyA9IHI7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGVycm9yX21lc3NhZ2Uoa3JiNV9lcnJubykpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgaWYgKHN6VXNlck5hbWVbMF0gPT0gJ1wwJykgeyAgICAgICAgICAgICAgICAvKiBHZXQgdXNlciBuYW1lIG5vdyAqLworICAgICAgICBsZW4gID0ga3JiNV9wcmluY19jb21wb25lbnQoazVfY29udGV4dCwgY3JlZHMuY2xpZW50LCAwKS0+bGVuZ3RoOworICAgICAgICBpZiAoIGxlbiA8IHNpemVvZihzelVzZXJOYW1lKSApIHsKKyAgICAgICAgICAgIG1lbWNweShzelVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICBrcmI1X3ByaW5jX2NvbXBvbmVudChrNV9jb250ZXh0LCBjcmVkcy5jbGllbnQsIDApLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICBsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgIHN6VXNlck5hbWVbbGVuXSA9ICdcMCc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciAqIG5hbWUgPSBOVUxMOworICAgICAgICBsZW4gID0ga3JiNV9wcmluY19jb21wb25lbnQoazVfY29udGV4dCwgY3JlZHMuY2xpZW50LCAwKS0+bGVuZ3RoOworICAgICAgICBpZiAoIGxlbiA9PSBzdHJsZW4oc3pVc2VyTmFtZSkgKSB7CisgICAgICAgICAgICBuYW1lID0ga3JiNV9wcmluY19jb21wb25lbnQoazVfY29udGV4dCwgY3JlZHMuY2xpZW50LCAwKS0+ZGF0YTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGlmICggIXN0cm5pY21wKHN6VXNlck5hbWUsbmFtZSxsZW4pICkKKyAgICAgICAgICAgICAgICBtZW1jcHkoc3pVc2VyTmFtZSxuYW1lLGxlbik7ICAgIC8qIHNhZmUgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIHRuX2F1dGhfa3JiNV9kZXNfYnVnICkgeyAgIC8qICFBTExPV19LUkJfM0RFU19FTkNSWVBUICovCisgICAgICAgIC8qIE5vdCBzdXJlIGlmIHRoaXMgaXMgbmVjZXNzYXJ5IGFueW1vcmUuICBXaGF0IGltcGFjdCBkb2VzIGl0IGhhdmUKKyAgICAgICAgICogb24gV2luMjAwMCBUR1RzIHRoYXQgdXNlIERFU19DQkNfTUQ1IG9yIFJDNF9ITUFDPworICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHByZXZlbnRzIHVzaW5nIDNERVMgU2VydmljZSBUaWNrZXRzLgorICAgICAgICAgKi8KKyAgICAgICAgY3JlZHMua2V5YmxvY2suZW5jdHlwZT1FTkNUWVBFX0RFU19DQkNfQ1JDOworICAgIH0KKworICAgIGlmIChyID0ga3JiNV9nZXRfY3JlZGVudGlhbHMoazVfY29udGV4dCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2FjaGUsICZjcmVkcywgJm5ld19jcmVkcykpIHsKKyAgICAgICAgY29tX2VycihOVUxMLCByLCAid2hpbGUgYXV0aG9yaXppbmcgKDMpLiIpOworICAgICAgICBrcmI1X2ZyZWVfY3JlZF9jb250ZW50cyhrNV9jb250ZXh0LCAmY3JlZHMpOworICAgICAgICBrcmI1X2Vycm5vID0gcjsKKyAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csZXJyb3JfbWVzc2FnZShrcmI1X2Vycm5vKSk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogSEVJTURBTCAqLworCisgICAgaWYgKGF1dGhfY29udGV4dCkgeworICAgICAgICBrcmI1X2F1dGhfY29uX2ZyZWUoazVfY29udGV4dCwgYXV0aF9jb250ZXh0KTsKKyAgICAgICAgYXV0aF9jb250ZXh0ID0gMDsKKyAgICB9CisgICAgaWYgKHIgPSBrcmI1X2F1dGhfY29uX2luaXQoazVfY29udGV4dCwgJmF1dGhfY29udGV4dCkpIHsKKyAgICAgICAgY29tX2VycihOVUxMLCByLCAid2hpbGUgaW5pdGlhbGl6aW5nIGF1dGggY29udGV4dCIpOworICAgICAgICBrcmI1X2Vycm5vID0gcjsKKyAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csZXJyb3JfbWVzc2FnZShrcmI1X2Vycm5vKSk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICAvKiBVUERBVEUgZm9yIFNUQVJUX1RMUy4gIEFVVEhfRU5DUllQVF9TVEFSVF9UTFMgYW5kIGluY2x1c2lvbiBvZiAqLworICAgIC8qIGNsaWVudCBhbmQgdGhlbiBzZXJ2ZXIgZmluaXNoZWQgbWVzc2FnZXMuICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICB0eXBlX2NoZWNrWzBdID0gQVVUSFRZUEVfS0VSQkVST1NfVjU7CisgICAgdHlwZV9jaGVja1sxXSA9IEFVVEhfQ0xJRU5UX1RPX1NFUlZFUiB8CisgICAgICAgIChob3cgPyBBVVRIX0hPV19NVVRVQUwgOiBBVVRIX0hPV19PTkVfV0FZKSB8CisgICAgICAgIChlbmNyeXB0KSB8CisgICAgICAgIChmb3J3YXJkID8gSU5JX0NSRURfRldEX09OIDogSU5JX0NSRURfRldEX09GRik7CisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKGVuY3J5cHQgPT0gQVVUSF9FTkNSWVBUX1NUQVJUX1RMUykgeworICAgICAgICBzc2xfZ2V0X2NsaWVudF9maW5pc2hlZCgmdHlwZV9jaGVja1syXSwxMik7CisgICAgICAgIHNzbF9nZXRfc2VydmVyX2ZpbmlzaGVkKCZ0eXBlX2NoZWNrWzE0XSwxMik7CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworCisjaWZuZGVmIEhFSU1EQUwKKyAgICBjaGVja3N1bS5tYWdpYyA9IEtWNU1fREFUQTsKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgY2hlY2tzdW0ubGVuZ3RoID0KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgKGVuY3J5cHQgPT0gQVVUSF9FTkNSWVBUX1NUQVJUX1RMUykgPyAyNiA6CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgIDI7CisgICAgY2hlY2tzdW0uZGF0YSA9IChjaGFyICopJnR5cGVfY2hlY2s7CisKKyAgICBhcF9vcHRzID0gMDsKKyAgICBpZiAoKGhvdyAmIEFVVEhfSE9XX01BU0spID09IEFVVEhfSE9XX01VVFVBTCkKKyAgICAgICAgYXBfb3B0cyB8PSBBUF9PUFRTX01VVFVBTF9SRVFVSVJFRDsKKworI2lmZGVmIEhFSU1EQUwKKyAgICByID0ga3JiNV9hdXRoX3NldGtleXR5cGUoazVfY29udGV4dCwgYXV0aF9jb250ZXh0LCBLRVlUWVBFX0RFUyk7CisgICAgaWYgKHIpCisgICAgICAgIGNvbV9lcnIoTlVMTCwgciwgIndoaWxlIHNldHRpbmcgYXV0aCBrZXl0eXBlIik7CisgICAgciA9IGtyYjVfYXV0aF9jb25fc2V0YWRkcnNfZnJvbV9mZChrNV9jb250ZXh0LGF1dGhfY29udGV4dCwgJnR0eWZkKTsKKyAgICBpZiAocikKKyAgICAgICAgY29tX2VycihOVUxMLCByLCAid2hpbGUgc2V0dGluZyBhdXRoIGFkZHJzIik7CisgICAgciA9IGtyYjVfbWtfcmVxKGs1X2NvbnRleHQsICZhdXRoX2NvbnRleHQsIGFwX29wdHMsCisgICAgICAgICAgICAgICAgICAgIGtyYjVfZF9zcnYgPyBrcmI1X2Rfc3J2IDogS1JCNV9TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgIHN6SG9zdE5hbWUsICZjaGVja3N1bSwgY2NhY2hlLCAmazVfYXV0aCk7CisgICAgaWYgKHIpCisgICAgICAgIGNvbV9lcnIoTlVMTCwgciwgIndoaWxlIG1ha2luZyByZXF1ZXN0Iik7CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgYXV0aF9mbGFncyA9IEtSQjVfQVVUSF9DT05URVhUX1JFVF9USU1FOworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBhcF9vcHRzIHw9IEFQX09QVFNfVVNFX1NVQktFWTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjaWZkZWYgVExTX1ZFUklGWQorICAgIGlmICgoaG93ICYgQVVUSF9FTkNSWVBUX01BU0spID09IEFVVEhfRU5DUllQVF9TVEFSVF9UTFMpIHsKKyAgICAgICAgYXV0aF9mbGFncyB8PSBLUkI1X0FVVEhfQ09OVEVYVF9ET19TRVFVRU5DRTsKKyAgICAgICAgaWYgKCFrcmI1X2Rfbm9fYWRkcmVzc2VzKQorICAgICAgICAgICAgciA9IGtyYjVfYXV0aF9jb25fZ2VuYWRkcnMoazVfY29udGV4dCwgYXV0aF9jb250ZXh0LCB0dHlmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtSQjVfQVVUSF9DT05URVhUX0dFTkVSQVRFX1JFTU9URV9GVUxMX0FERFIpOworICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICBrcmI1X2F1dGhfY29uX3NldGZsYWdzKGs1X2NvbnRleHQsIGF1dGhfY29udGV4dCwgYXV0aF9mbGFncyk7CisgICAgciA9IGtyYjVfbWtfcmVxX2V4dGVuZGVkKGs1X2NvbnRleHQsICZhdXRoX2NvbnRleHQsIGFwX29wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hlY2tzdW0sIG5ld19jcmVkcywgJms1X2F1dGgpOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBpZiAoIXIpIHsKKyAgICAgICAgciA9IGtyYjVfYXV0aF9jb25fZ2V0bG9jYWxzdWJrZXkoazVfY29udGV4dCwgYXV0aF9jb250ZXh0LCAmbmV3a2V5KTsKKyAgICAgICAgaWYgKHIpCisgICAgICAgICAgICByID0ga3JiNV9hdXRoX2Nvbl9nZXRrZXkoazVfY29udGV4dCwgYXV0aF9jb250ZXh0LCAmbmV3a2V5KTsKKworICAgICAgICBpZiAoazVfc2Vzc2lvbl9rZXkpIHsKKyAgICAgICAgICAgIGtyYjVfZnJlZV9rZXlibG9jayhrNV9jb250ZXh0LCBrNV9zZXNzaW9uX2tleSk7CisgICAgICAgICAgICBrNV9zZXNzaW9uX2tleSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5ld2tleSkgeworICAgICAgICAvKgorICAgICAgICAqIGtlZXAgdGhlIGtleSBpbiBvdXIgcHJpdmF0ZSBzdG9yYWdlLCBidXQgZG9uJ3QgdXNlIGl0CisgICAgICAgICogeWV0LS0tc2VlIGtlcmJlcm9zNV9yZXBseSgpIGJlbG93CisgICAgICAgICovCisjaWZkZWYgSEVJTURBTAorICAgICAgICBpZiAoKG5ld2tleS0+a2V5dHlwZSA9PSBFVFlQRV9ERVNfQ0JDX0NSQykgfHwKKyAgICAgICAgICAgICAobmV3a2V5LT5rZXl0eXBlID09IEVUWVBFX0RFU19DQkNfTUQ1KSB8fAorICAgICAgICAgICAgIChuZXdrZXktPmtleXR5cGUgPT0gRVRZUEVfREVTX0NCQ19NRDQpKQorICAgICAgICB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJrNV9hdXRoX3NlbmQoKSIsIm5ld2tleS0+a2V5dHlwZSIsbmV3a2V5LT5rZXl0eXBlKTsKKyAgICAgICAgICAgIGtyYjVfY29weV9rZXlibG9jayhrNV9jb250ZXh0LCBuZXdrZXksICZrNV9zZXNzaW9uX2tleSk7CisgICAgICAgIH0KKyNlbHNlIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgLyogbG9vayBmb3IgYWxsIHBvc3NpYmxlIERFUyBrZXlzIGZpcnN0IC0ganVzdCBmb3IgY29tcGF0aWJpbGl0eSAqLworICAgICAgICAvKiBvdGhlciBrZXkgdHlwZXMgYXJlIG11Y2ggbGVzcyBsaWtlbHkgdG8gYmUgYXZhaWxhYmxlICAgICAgICAgICovCisgICAgICAgIGlmICgobmV3a2V5LT5lbmN0eXBlID09IEVOQ1RZUEVfREVTX0NCQ19DUkMpIHx8CisgICAgICAgICAgICAgKG5ld2tleS0+ZW5jdHlwZSA9PSBFTkNUWVBFX0RFU19DQkNfTUQ1KSB8fAorICAgICAgICAgICAgIChuZXdrZXktPmVuY3R5cGUgPT0gRU5DVFlQRV9ERVNfQ0JDX01ENCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIms1X2F1dGhfc2VuZCgpIiwibmV3a2V5LT5lbmN0eXBlIixuZXdrZXktPmVuY3R5cGUpOworICAgICAgICAgICAga3JiNV9jb3B5X2tleWJsb2NrKGs1X2NvbnRleHQsIG5ld2tleSwgJms1X3Nlc3Npb25fa2V5KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgobmV3X2NyZWRzLT5rZXlibG9jay5lbmN0eXBlID09IEVOQ1RZUEVfREVTX0NCQ19DUkMpIHx8CisgICAgICAgICAgICAgICAgIChuZXdfY3JlZHMtPmtleWJsb2NrLmVuY3R5cGUgPT0gRU5DVFlQRV9ERVNfQ0JDX01ENSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHVzZSB0aGUgc2Vzc2lvbiBrZXkgaW4gY3JlZGVudGlhbHMgaW5zdGVhZCAqLworICAgICAgICAgICAgZGVidWcoRjExMSwiazVfYXV0aF9zZW5kKCkiLCJuZXdfY3JlZHMtPmtleWJsb2NrLmVuY3R5cGUiLAorICAgICAgICAgICAgICAgICAgIG5ld19jcmVkcy0+a2V5YmxvY2suZW5jdHlwZSk7CisgICAgICAgICAgICBrcmI1X2NvcHlfa2V5YmxvY2soazVfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19jcmVkcy0+a2V5YmxvY2ssICZrNV9zZXNzaW9uX2tleSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobmV3a2V5LT5lbmN0eXBlICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIms1X2F1dGhfc2VuZCgpIiwibmV3a2V5LT5lbmN0eXBlIixuZXdrZXktPmVuY3R5cGUpOworICAgICAgICAgICAga3JiNV9jb3B5X2tleWJsb2NrKGs1X2NvbnRleHQsIG5ld2tleSwgJms1X3Nlc3Npb25fa2V5KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChuZXdfY3JlZHMtPmtleWJsb2NrLmVuY3R5cGUgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogdXNlIHRoZSBzZXNzaW9uIGtleSBpbiBjcmVkZW50aWFscyBpbnN0ZWFkICovCisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJrNV9hdXRoX3NlbmQoKSIsIm5ld19jcmVkcy0+a2V5YmxvY2suZW5jdHlwZSIsCisgICAgICAgICAgICAgICAgICAgbmV3X2NyZWRzLT5rZXlibG9jay5lbmN0eXBlKTsKKyAgICAgICAgICAgIGtyYjVfY29weV9rZXlibG9jayhrNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3X2NyZWRzLT5rZXlibG9jaywgJms1X3Nlc3Npb25fa2V5KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsIms1X2F1dGhfc2VuZCgpIiwiTk8gS0VZIGluIG5ld2tleSIsMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgIGtyYjVfZnJlZV9rZXlibG9jayhrNV9jb250ZXh0LCBuZXdrZXkpOworICAgIH0KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjaWZuZGVmIEhFSU1EQUwKKyAgICBrcmI1X2ZyZWVfY3JlZF9jb250ZW50cyhrNV9jb250ZXh0LCAmY3JlZHMpOworICAgIGtyYjVfZnJlZV9jcmVkcyhrNV9jb250ZXh0LCBuZXdfY3JlZHMpOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICBrcmI1X2NjX2Nsb3NlKGs1X2NvbnRleHQsY2NhY2hlKTsKKworICAgIGlmIChyKSB7CisgICAgICAgIGNvbV9lcnIoTlVMTCwgciwgIndoaWxlIGF1dGhvcml6aW5nICg0KS4iKTsKKyAgICAgICAga3JiNV9lcnJubyA9IHI7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGVycm9yX21lc3NhZ2Uoa3JiNV9lcnJubykpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGtyYjVfZXJybm8gPSAwOworICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLCJPSyIpOworICAgIHJldHVybigxKTsKK30KKworLyoKKyAqIEs1X2F1dGhfcmVwbHkgLS0gY2hlY2tzIHRoZSByZXBseSBmb3IgbXV0dWFsIGF1dGhlbnRpY2F0aW9uLgorICovCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK2s1X2F1dGhfcmVwbHkoaW50IGhvdywgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGNudCkKKyNlbHNlCitrNV9hdXRoX3JlcGx5KGhvdyxkYXRhLGNudCkgaW50IGhvdzsgdW5zaWduZWQgY2hhciAqZGF0YTsgaW50IGNudDsKKyNlbmRpZgoreworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBTZXNzaW9uX0tleSBza2V5OworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKworICAgIGRhdGEgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gc3RhdHVzIGJ5dGUgKi8KKyAgICBjbnQgLT01OworCisgICAgc3dpdGNoICgqZGF0YSsrKSB7CisgICAgY2FzZSBLUkJfUkVKRUNUOgorICAgICAgICBpZiAoY250ID4gMCkgeworICAgICAgICAgICAgY2hhciAqczsKKyAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICBja3N0cm5jcHkoc3RyVG1wLCJLZXJiZXJvcyBWNSByZWZ1c2VzIGF1dGhlbnRpY2F0aW9uIGJlY2F1c2VcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RyVG1wKSk7CisgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc3RyVG1wKTsKKyAgICAgICAgICAgIGlmICggbGVuICsgY250IDwgc2l6ZW9mKHN0clRtcCkgKSB7CisgICAgICAgICAgICAgICAgcyA9IHN0clRtcCArIHN0cmxlbihzdHJUbXApOworICAgICAgICAgICAgICAgIG1lbWNweShzLCBkYXRhLCBjbnQpOyAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgICAgIHNbY250XSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgY2tzdHJuY3B5KHN0clRtcCwiS2VyYmVyb3MgVjUgcmVmdXNlcyBhdXRoZW50aWNhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0clRtcCkpOworICAgICAgICBrcmI1X2Vycm5vID0gLTE7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLHN0clRtcCk7CisgICAgICAgIHByaW50ZigiS2VyYmVyb3MgYXV0aGVudGljYXRpb24gZmFpbGVkIVxyXG4lc1xyXG4iLHN0clRtcCk7CisgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworCisgICAgY2FzZSBLUkJfQUNDRVBUOgorICAgICAgICBpZiAoIW11dHVhbF9jb21wbGV0ZSkgeworICAgICAgICAgICAgaWYgKChob3cgJiBBVVRIX0hPV19NQVNLKSA9PSBBVVRIX0hPV19NVVRVQUwgJiYgIW11dHVhbF9jb21wbGV0ZSkgeworICAgICAgICAgICAgICAgIGNrc3RybmNweShzdHJUbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXJiZXJvcyBWNSBhY2NlcHRlZCB5b3UsIGJ1dCBkaWRuJ3QgcHJvdmlkZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtdXR1YWwgYXV0aGVudGljYXRpb24iLHNpemVvZihzdHJUbXApKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIktlcmJlcm9zIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCFcclxuJXNcclxuIixzdHJUbXApOworICAgICAgICAgICAgICAgIGtyYjVfZXJybm8gPSAtMTsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxzdHJUbXApOworICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICBpZiAoazVfc2Vzc2lvbl9rZXkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRuX2F1dGhfa3JiNV9kZXNfYnVnICkgeyAgIC8qICFBTExPV19LUkJfM0RFU19FTkNSWVBUICovCisgICAgICAgICAgICAgICAgICAgIHNrZXkudHlwZSA9IFNLX0RFUzsKKyAgICAgICAgICAgICAgICAgICAgc2tleS5sZW5ndGggPSA4OworI2lmZGVmIEhFSU1EQUwKKyAgICAgICAgICAgICAgICAgICAgc2tleS5kYXRhID0gazVfc2Vzc2lvbl9rZXktPmtleXZhbHVlLmRhdGE7CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgIHNrZXkuZGF0YSA9IGs1X3Nlc3Npb25fa2V5LT5jb250ZW50czsKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBIRUlNREFMCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIGs1X3Nlc3Npb25fa2V5LT5rZXl0eXBlICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEVUWVBFX0RFU19DQkNfQ1JDOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEVUWVBFX0RFU19DQkNfTUQ1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEVUWVBFX0RFU19DQkNfTUQ0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2tleS50eXBlID0gU0tfREVTOworICAgICAgICAgICAgICAgICAgICAgICAgc2tleS5sZW5ndGggPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBza2V5LnR5cGUgPSBTS19HRU5FUklDOworICAgICAgICAgICAgICAgICAgICAgICAgc2tleS5sZW5ndGggPSBrNV9zZXNzaW9uX2tleS0+bGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdF9kb250X3N1cHBvcnQoRU5DVFlQRV9ERVNfQ0ZCNjQpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdF9kb250X3N1cHBvcnQoRU5DVFlQRV9ERVNfT0ZCNjQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNrZXkuZGF0YSA9IGs1X3Nlc3Npb25fa2V5LT5rZXl2YWx1ZS5kYXRhOworI2Vsc2UgLyogSEVJTURBTCAqLworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBrNV9zZXNzaW9uX2tleS0+ZW5jdHlwZSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFTkNUWVBFX0RFU19DQkNfQ1JDOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEVOQ1RZUEVfREVTX0NCQ19NRDU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRU5DVFlQRV9ERVNfQ0JDX01ENDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrZXkudHlwZSA9IFNLX0RFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrZXkubGVuZ3RoID0gODsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrZXkudHlwZSA9IFNLX0dFTkVSSUM7CisgICAgICAgICAgICAgICAgICAgICAgICBza2V5Lmxlbmd0aCA9IGs1X3Nlc3Npb25fa2V5LT5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0X2RvbnRfc3VwcG9ydChFTkNUWVBFX0RFU19DRkI2NCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0X2RvbnRfc3VwcG9ydChFTkNUWVBFX0RFU19PRkI2NCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2tleS5kYXRhID0gazVfc2Vzc2lvbl9rZXktPmNvbnRlbnRzOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5jcnlwdF9zZXNzaW9uX2tleSgmc2tleSwgQVVUSF9DTElFTlRfVE9fU0VSVkVSKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKCBjbnQgPiAwICkgeworICAgICAgICAgICAgY2hhciAqczsKKyAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICBja3N0cm5jcHkoc3RyVG1wLCJLZXJiZXJvcyBWNSBhY2NlcHRzIHlvdSBhcyAiLHNpemVvZihzdHJUbXApKTsKKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzdHJUbXApOworICAgICAgICAgICAgaWYgKCBsZW4gKyBjbnQgPCBzaXplb2Yoc3RyVG1wKSApIHsKKyAgICAgICAgICAgICAgICBzID0gc3RyVG1wICsgc3RybGVuKHN0clRtcCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHMsZGF0YSxjbnQpOworICAgICAgICAgICAgICAgIHNbY250XSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYWNjZXB0X2NvbXBsZXRlID0gMTsKKyAgICAgICAgcHJpbnRmKCIlc1xyXG4iLHN0clRtcCk7CisKKyNpZmRlZiBGT1JXQVJECisgICAgICAgIGlmIChmb3J3YXJkX2ZsYWcKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgLyogTWFyYyBIb3Jvd2l0eiA8bWFyY0BtaXQuZWR1PiBoYXMgc3VjY2Vzc2Z1bGx5IGFyZ3VlZAorICAgICAgICAgICAgICAgIHRoYXQgaXQgaXMgaW5kZWVkIHNhZmUgdG8gc2VuZCBGb3J3YXJkZWQgY3JlZGVudGlhbHMKKyAgICAgICAgICAgICAgICB0byBhbiB1bnRydXN0ZWQgaG9zdC4KKyAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAmJiAoYXV0aF9ob3cgJiBBVVRIX0hPV19NQVNLKSA9PSBBVVRIX0hPV19NVVRVQUwKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgKQorICAgICAgICAgICAga2VyYmVyb3M1X2ZvcndhcmQoKTsKKyNlbmRpZiAvKiBGT1JXQVJEICovCisgICAgICAgIGtyYjVfZXJybm8gPSAwOworICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxzdHJUbXApOworICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfVVNFUik7CisgICAgICAgIHJldHVybiBBVVRIX1NVQ0NFU1M7CisKKyAgICBjYXNlIEtSQjVfUkVTUE9OU0U6CisjaWZkZWYgVExTX1ZFUklGWQorICAgICAgICBpZiAoKGhvdyAmIEFVVEhfRU5DUllQVF9NQVNLKSA9PSBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTICYmCisgICAgICAgICAgICAha3JiNV90bHNfdmVyaWZpZWQpIHsKKyAgICAgICAgICAgIHByaW50ZigKKyAgICAiTWFuIGluIHRoZSBtaWRkbGUgYXR0YWNrIGRldGVjdGVkLiAgU2Vzc2lvbiB0ZXJtaW5hdGVkLlxyXG4iKTsKKyNpZm5kZWYgQkVUQVRFU1QKKyAgICAgICAgICAgIG5ldGNsb3MoKTsKKyNlbmRpZiAvKiBCRVRBVEVTVCAqLworICAgICAgICAgICAga3JiNV9lcnJubyA9IC0xOworICAgICAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csIlRMUyBub3QgdmVyaWZpZWQiKTsKKyAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBpZigoc3NsX2FjdGl2ZV9mbGFnIHx8IHRsc19hY3RpdmVfZmxhZykgJiYKKyAgICAgICAgICAgIChob3cgJiBBVVRIX0VOQ1JZUFRfTUFTSykgPT0gQVVUSF9FTkNSWVBUX1NUQVJUX1RMUykgeworICAgICAgICAgICAgcHJpbnRmKCJUTFMgc2Vzc2lvbiBwYXJhbWV0ZXJzIHZlcmlmaWVkIGJ5IEtlcmJlcm9zIDVcclxuIik7CisgICAgICAgIH0KKyNlbmRpZiAvKiBUTFNfVkVSSUZZICovCisgICAgICAgIGlmICgoaG93ICYgQVVUSF9IT1dfTUFTSykgPT0gQVVUSF9IT1dfTVVUVUFMKSB7CisgICAgICAgICAgICAvKiB0aGUgcmVzdCBvZiB0aGUgcmVwbHkgc2hvdWxkIGNvbnRhaW4gYSBrcmJfYXBfcmVwICovCisgICAgICAgICAgICBrcmI1X2FwX3JlcF9lbmNfcGFydCAqcmVwbHk7CisgICAgICAgICAgICBrcmI1X2RhdGEgaW5idWY7CisgICAgICAgICAgICBrcmI1X2Vycm9yX2NvZGUgcjsKKworICAgICAgICAgICAgaW5idWYubGVuZ3RoID0gY250OworICAgICAgICAgICAgaW5idWYuZGF0YSA9IChjaGFyICopZGF0YTsKKworICAgICAgICAgICAgaWYgKHIgPSBrcmI1X3JkX3JlcChrNV9jb250ZXh0LCBhdXRoX2NvbnRleHQsICZpbmJ1ZiwgJnJlcGx5KSkgeworICAgICAgICAgICAgICAgIGNvbV9lcnIoTlVMTCwgciwgIndoaWxlIGF1dGhvcml6aW5nLiAoNSkiKTsKKyAgICAgICAgICAgICAgICBrcmI1X2Vycm5vID0gcjsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJvcl9tZXNzYWdlKGtyYjVfZXJybm8pKTsKKyAgICAgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICAgICAga3JiNV9mcmVlX2FwX3JlcF9lbmNfcGFydChrNV9jb250ZXh0LCByZXBseSk7CisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICBpZiAoZW5jcnlwdF9mbGFnICYmIGs1X3Nlc3Npb25fa2V5KSB7CisgICAgICAgICAgICAgICAgaWYgKCB0bl9hdXRoX2tyYjVfZGVzX2J1ZyApIHsgICAvKiAhQUxMT1dfS1JCXzNERVNfRU5DUllQVCAqLworICAgICAgICAgICAgICAgICAgICBza2V5LnR5cGUgPSBTS19ERVM7CisgICAgICAgICAgICAgICAgICAgIHNrZXkubGVuZ3RoID0gODsKKyNpZmRlZiBIRUlNREFMCisgICAgICAgICAgICAgICAgICAgIHNrZXkuZGF0YSA9IGs1X3Nlc3Npb25fa2V5LT5rZXl2YWx1ZS5kYXRhOworI2Vsc2UgLyogSEVJTURBTCAqLworICAgICAgICAgICAgICAgICAgICBza2V5LmRhdGEgPSBrNV9zZXNzaW9uX2tleS0+Y29udGVudHM7CisjZW5kaWYgLyogSEVJTURBTCAqLworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgSEVJTURBTAorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBrNV9zZXNzaW9uX2tleS0+a2V5dHlwZSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFVFlQRV9ERVNfQ0JDX0NSQzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFVFlQRV9ERVNfQ0JDX01ENToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFVFlQRV9ERVNfQ0JDX01ENDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrZXkudHlwZSA9IFNLX0RFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrZXkubGVuZ3RoID0gODsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrZXkudHlwZSA9IFNLX0dFTkVSSUM7CisgICAgICAgICAgICAgICAgICAgICAgICBza2V5Lmxlbmd0aCA9IGs1X3Nlc3Npb25fa2V5LT5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2tleS5kYXRhID0gazVfc2Vzc2lvbl9rZXktPmtleXZhbHVlLmRhdGE7CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIGs1X3Nlc3Npb25fa2V5LT5lbmN0eXBlICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEVOQ1RZUEVfREVTX0NCQ19DUkM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRU5DVFlQRV9ERVNfQ0JDX01ENToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFTkNUWVBFX0RFU19DQkNfTUQ0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2tleS50eXBlID0gU0tfREVTOworICAgICAgICAgICAgICAgICAgICAgICAgc2tleS5sZW5ndGggPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBza2V5LnR5cGUgPSBTS19HRU5FUklDOworICAgICAgICAgICAgICAgICAgICAgICAgc2tleS5sZW5ndGggPSBrNV9zZXNzaW9uX2tleS0+bGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNrZXkuZGF0YSA9IGs1X3Nlc3Npb25fa2V5LT5jb250ZW50czsKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuY3J5cHRfc2Vzc2lvbl9rZXkoJnNrZXksIEFVVEhfQ0xJRU5UX1RPX1NFUlZFUik7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogRU5DUllQVElPTiAqLworICAgICAgICAgICAgbXV0dWFsX2NvbXBsZXRlID0gMTsKKyAgICAgICAgfQorICAgICAgICBja3N0cm5jcHkoc3RyVG1wLCJSZW1vdGUgbWFjaGluZSBoYXMgYmVlbiBtdXR1YWxseSBhdXRoZW50aWNhdGVkIiwKKyAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJUbXApKTsKKyAgICAgICAga3JiNV9lcnJubyA9IDA7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLHN0clRtcCk7CisgICAgICAgIHByaW50ZigiJXNcclxuIixzdHJUbXApOworICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfVVNFUik7CisgICAgICAgIHJldHVybiBBVVRIX1NVQ0NFU1M7CisKKyNpZmRlZiBGT1JXQVJECisgICAgY2FzZSBLUkI1X0ZPUldBUkRfQUNDRVBUOgorICAgICAgICBmb3J3YXJkZWRfdGlja2V0cyA9IDE7CisgICAgICAgIGNrc3RybmNweShzdHJUbXAsIlJlbW90ZSBtYWNoaW5lIGhhcyBhY2NlcHRlZCBmb3J3YXJkZWQgY3JlZGVudGlhbHMiLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0clRtcCkpOworICAgICAgICBrcmI1X2Vycm5vID0gMDsKKyAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csc3RyVG1wKTsKKyAgICAgICAgcHJpbnRmKCIlc1xyXG4iLHN0clRtcCk7CisgICAgICAgIHJldHVybiBBVVRIX1NVQ0NFU1M7CisKKyAgICBjYXNlIEtSQjVfRk9SV0FSRF9SRUpFQ1Q6CisgICAgICAgIGZvcndhcmRlZF90aWNrZXRzID0gMDsKKyAgICAgICAgaWYgKGNudCA+IDApIHsKKyAgICAgICAgICAgIGNoYXIgKnM7CisgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgbGVuID0gY2tzdHJuY3B5KHN0clRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAiS2VyYmVyb3MgVjUgcmVmdXNlcyBmb3J3YXJkZWQgY3JlZGVudGlhbHMgYmVjYXVzZSAiLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RyVG1wKSk7CisgICAgICAgICAgICBpZiAoIGxlbiArIGNudCA8IHNpemVvZihzdHJUbXApICkgeworICAgICAgICAgICAgICAgIHMgPSBzdHJUbXAgKyBzdHJsZW4oc3RyVG1wKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocywgZGF0YSwgY250KTsKKyAgICAgICAgICAgICAgICBzW2NudF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNrc3RybmNweShzdHJUbXAsICJLZXJiZXJvcyBWNSByZWZ1c2VzIGZvcndhcmRlZCBjcmVkZW50aWFscyIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0clRtcCkpOworCisgICAgICAgIHByaW50ZigiJXNcclxuIixzdHJUbXApOworICAgICAgICBrcmI1X2Vycm5vID0gLTE7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLHN0clRtcCk7CisgICAgICAgIHJldHVybiBBVVRIX1NVQ0NFU1M7CisjZW5kaWYgIC8qIEZPUldBUkQgKi8KKworI2lmZGVmIFRMU19WRVJJRlkKKyAgICBjYXNlIEtSQjVfVExTX1ZFUklGWToKKyAgICAgICAgaWYgKChob3cgJiBBVVRIX0VOQ1JZUFRfTUFTSykgPT0gQVVUSF9FTkNSWVBUX1NUQVJUX1RMUykgeworICAgICAgICAgICAga3JiNV9kYXRhIHJlcGx5LCBtc2c7CisgICAgICAgICAgICBjaGFyIHRsc192ZXJpZnlbMjRdOworICAgICAgICAgICAga3JiNV9yZXBsYXlfZGF0YSByZXBkYXRhOworICAgICAgICAgICAga3JiNV9lcnJvcl9jb2RlIHI7CisKKyAgICAgICAgICAgIHNzbF9nZXRfc2VydmVyX2ZpbmlzaGVkKCZ0bHNfdmVyaWZ5WzBdLDEyKTsKKyAgICAgICAgICAgIHNzbF9nZXRfY2xpZW50X2ZpbmlzaGVkKCZ0bHNfdmVyaWZ5WzEyXSwxMik7CisKKyAgICAgICAgICAgIHJlcGx5LmRhdGEgPSBkYXRhOworICAgICAgICAgICAgcmVwbHkubGVuZ3RoID0gY250OworCisJCQlrcmI1X2F1dGhfY29uX2dlbmFkZHJzKGs1X2NvbnRleHQsIGF1dGhfY29udGV4dCwgdHR5ZmQsCisJCQkJCQkJCSAgIEtSQjVfQVVUSF9DT05URVhUX0dFTkVSQVRFX1JFTU9URV9GVUxMX0FERFIpOworCisgICAgICAgICAgICBpZiAociA9IGtyYjVfcmRfc2FmZShrNV9jb250ZXh0LGF1dGhfY29udGV4dCwmcmVwbHksJm1zZywmcmVwZGF0YSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb21fZXJyKCIiLCByLCAiZGVjb2RpbmcgdGxzIHZlcmlmaWVyIik7CisgICAgICAgICAgICAgICAga3JiNV9lcnJubyA9IHI7CisgICAgICAgICAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csIlRMUyB2ZXJpZnkgZmFpbHVyZSIpOworICAgICAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgICAgIHJldHVybihBVVRIX0ZBSUxVUkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBtc2cubGVuZ3RoID09IDI0ICYmICFtZW1jbXAobXNnLmRhdGEsdGxzX3ZlcmlmeSwyNCkgKQorICAgICAgICAgICAgICAgICBrcmI1X3Rsc192ZXJpZmllZCA9IDE7CisgICAgICAgICAgICBrcmI1X2ZyZWVfZGF0YV9jb250ZW50cyhrNV9jb250ZXh0LCZtc2cpOworICAgICAgICAgICAgaWYgKGtyYjVfdGxzX3ZlcmlmaWVkKQorICAgICAgICAgICAgICAgIHJldHVybihBVVRIX1NVQ0NFU1MpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiTWFuIGluIHRoZSBtaWRkbGUgYXR0YWNrIGRldGVjdGVkLiAgU2Vzc2lvbiB0ZXJtaW5hdGVkLlxyXG4iKTsKKyAgICAgICAgbmV0Y2xvcygpOworICAgICAgICBrcmI1X2Vycm5vID0gLTE7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLCJUTFMgdmVyaWZ5IGZhaWx1cmUiKTsKKyAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgIHJldHVybihBVVRIX0ZBSUxVUkUpOworI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgZGVmYXVsdDoKKyAgICAgICAga3JiNV9lcnJubyA9IC0xOworICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZywiVW5rbm93biByZXBseSB0eXBlIik7CisgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVua25vd24gcmVwbHkgdHlwZSAqLworICAgIH0KK30KKworI2lmZGVmIEZPUldBUkQKKy8qIERlY29kZSwgZGVjcnlwdCBhbmQgc3RvcmUgdGhlIGZvcndhcmRlZCBjcmVkcyBpbiB0aGUgbG9jYWwgY2NhY2hlLiAqLworLyogTmVlZGVkIGZvciBLUkI1X0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMga3JiNV9lcnJvcl9jb2RlCityZF9hbmRfc3RvcmVfZm9yX2NyZWRzKGNvbnRleHQsIGF1dGhfY29udGV4dCwgaW5idWYsIGNsaWVudCkKKyAgICBrcmI1X2NvbnRleHQgY29udGV4dDsKKyAgICBrcmI1X2F1dGhfY29udGV4dCBhdXRoX2NvbnRleHQ7CisgICAga3JiNV9kYXRhICppbmJ1ZjsKKyAgICBrcmI1X2NvbnN0X3ByaW5jaXBhbCBjbGllbnQ7Cit7CisgICAga3JiNV9jcmVkcyAqKiBjcmVkcz1OVUxMOworICAgIGtyYjVfZXJyb3JfY29kZSByZXR2YWw7CisgICAga3JiNV9jY2FjaGUgY2NhY2hlPU5VTEw7CisKKyNpZmRlZiBIRUlNREFMCisgICAgLyoKKyAgICBIZWltZGFsIFRlbG5ldGQgY3JlYXRlcyB0aGUgY2FjaGUgZmlsZSBhdCB0aGlzIHBvaW50IGFuZCBzZXRzCisgICAgdGhlIEtSQjVDQ05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKyAgICBzdHJ1Y3QgcGFzc3dkICpwd2Q7CisgICAgY2hhciBjY25hbWVbMTAyNF07CisKKyAgICBwd2QgPSBnZXRwd25hbShzelVzZXJOYW1lUmVxdWVzdGVkKTsKKyAgICBpZiAocHdkID09IE5VTEwpCisgICAgICAgIGJyZWFrOworICAgIHNucHJpbnRmKGNjbmFtZSwgc2l6ZW9mKGNjbmFtZSktMSwgIkZJTEU6L3RtcC9rcmI1Y2NfJXUiLHB3ZC0+cHdfdWlkKTsKKyAgICByZXR2YWwgPSBrcmI1X2NjX3Jlc29sdmUoY29udGV4dCxjY25hbWUsJmNjYWNoZSk7CisKKyAgICBjaG93bihjY25hbWUgKyA1LCBwd2QtPnB3X3VpZCwgLTEpOworICAgICovCisjZW5kaWYgLyogSEVJTURBTCAqLworCisgICAgaWYgKHJldHZhbCA9IGs1X2dldF9jY2FjaGUoY29udGV4dCwmY2NhY2hlLE5VTEwpKQorICAgICAgICByZXR1cm4ocmV0dmFsKTsKKworI2lmZGVmIEhFSU1EQUwKKyAgICBpZiAoKHJldHZhbCA9IGtyYjVfY2NfaW5pdGlhbGl6ZShjb250ZXh0LCBjY2FjaGUsIGNsaWVudCkpKQorICAgICAgICByZXR1cm4ocmV0dmFsKTsKKworICAgIGlmICgocmV0dmFsID0ga3JiNV9yZF9jcmVkKGNvbnRleHQsIGF1dGhfY29udGV4dCwgY2NhY2hlLCBpbmJ1ZikpKQorICAgICAgICByZXR1cm4ocmV0dmFsKTsKKyNlbHNlIC8qIEhFSU1EQUwgKi8KKyAgICBpZiAoKHJldHZhbCA9IGtyYjVfcmRfY3JlZChjb250ZXh0LCBhdXRoX2NvbnRleHQsIGluYnVmLCAmY3JlZHMsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuKHJldHZhbCk7CisKKyAgICBpZiAoKHJldHZhbCA9IGtyYjVfY2NfaW5pdGlhbGl6ZShjb250ZXh0LCBjY2FjaGUsIGNyZWRzWzBdLT5jbGllbnQpKSkKKyAgICAgICAgZ290byBjbGVhbnVwOworCisgICAgaWYgKChyZXR2YWwgPSBrcmI1X2NjX3N0b3JlX2NyZWQoY29udGV4dCwgY2NhY2hlLCBjcmVkc1swXSkpKQorICAgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICBpZiAoKHJldHZhbCA9IGtyYjVfY2NfY2xvc2UoY29udGV4dCwgY2NhY2hlKSkpCisgICAgICAgIGdvdG8gY2xlYW51cDsKKworICBjbGVhbnVwOgorICAgIGtyYjVfZnJlZV90Z3RfY3JlZHMoY29udGV4dCwgY3JlZHMpOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmIC8qIEZPUldBUkQgKi8KKworLyoKKyAqCisgKiBLNV9hdXRoX2lzLgorICoKKyAqLworCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK2s1X2F1dGhfaXMoaW50IGhvdywgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGNudCkKKyNlbHNlCitrNV9hdXRoX2lzKGhvdyxkYXRhLGNudCkgaW50IGhvdzsgdW5zaWduZWQgY2hhciAqZGF0YTsgaW50IGNudDsKKyNlbmRpZgoreworICAgIGludCByID0gMDsKKyAgICBrcmI1X3ByaW5jaXBhbCBzZXJ2ZXI7CisgICAga3JiNV9rZXlibG9jayAqbmV3a2V5ID0gTlVMTDsKKyAgICBrcmI1X2RhdGEgb3V0YnVmOworICAgIGNoYXIgZXJyYnVmWzEyOF09IiI7CisgICAgY2hhciAqZ2V0ZW52KCk7CisjaWZuZGVmIEhFSU1EQUwKKyAgICBrcmI1X2F1dGhlbnRpY2F0b3IgKmF1dGhlbnRpY2F0b3I7CisgICAga3JiNV9rZXl0YWIga2V5dGFiaWQgPSAwOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICBrcmI1X2RhdGEgaW5idWY7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIFNlc3Npb25fS2V5IHNrZXk7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgIGNoYXIgcHJpbmNbMjU2XT0iIjsKKyAgICBpbnQgbGVuOworCisgICAgZGF0YSArPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBzdGF0dXMgYnl0ZSAqLworICAgIGNudCAtPSA0OworCisgICAgaGV4ZHVtcCgiazVfYXV0aF9pcyBkYXRhIixkYXRhLGNudCk7CisgICAgZGVidWcoRjExMSwiazVfYXV0aF9pcyIsImhvdyIsaG93KTsKKworICAgIGlmIChjbnQtLSA8IDEpIHsKKyAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisgICAgfQorICAgIHN3aXRjaCAoKmRhdGErKykgeworICAgIGNhc2UgS1JCX0FVVEg6CisgICAgICAgIGs1X2F1dGguZGF0YSA9IChjaGFyICopZGF0YTsKKyAgICAgICAgazVfYXV0aC5sZW5ndGggPSBjbnQ7CisKKyAgICAgICAgZGVidWcoRjExMCwiazVfYXV0aF9pcyIsIktSQl9BVVRIIiwwKTsKKyAgICAgICAgZGVidWcoRjExMSwiazVfYXV0aF9pcyIsImF1dGhfY29udGV4dCIsYXV0aF9jb250ZXh0KTsKKworICAgICAgICBpZiAoIXIgJiYgIWF1dGhfY29udGV4dCkgeworICAgICAgICAgICAgciA9IGtyYjVfYXV0aF9jb25faW5pdChrNV9jb250ZXh0LCAmYXV0aF9jb250ZXh0KTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIms1X2F1dGhfaXMiLCJrcmI1X2F1dGhfY29uX2luaXQiLHIpOworICAgICAgICB9CisKKyNpZmRlZiBIRUlNREFMCisgICAgICAgIGlmICghcikKKyAgICAgICAgICAgIHIgPSBrcmI1X2F1dGhfY29uX3NldGFkZHJzX2Zyb21fZmQoazVfY29udGV4dCxhdXRoX2NvbnRleHQsJnR0eWZkKTsKKworICAgICAgICBpZiAoIXIpCisgICAgICAgICAgICByID0ga3JiNV9zb2NrX3RvX3ByaW5jaXBhbChrNV9jb250ZXh0LDAsImhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1JCNV9OVF9TUlZfSFNULCZzZXJ2ZXIpOworCisgICAgICAgIGlmICghcikKKyNlbHNlIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgaWYgKCFyKSB7CisgICAgICAgICAgICBrcmI1X3JjYWNoZSByY2FjaGUgPSBOVUxMOworCisgICAgICAgICAgICByID0ga3JiNV9hdXRoX2Nvbl9nZXRyY2FjaGUoazVfY29udGV4dCwgYXV0aF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmNhY2hlKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIms1X2F1dGhfaXMiLCJrcmI1X2F1dGhfY29uX2dldHJjYWNoZSIscik7CisKKyAgICAgICAgICAgIGlmICghciAmJiAhcmNhY2hlKSB7CisgICAgICAgICAgICAgICAgLyogRG8gbm90IHJlc29sdmUgc2VydmVyJ3MgcHJpbmNpcGFsIG5hbWUsIHdlIHdpbGwgY2hlY2sgKi8KKyAgICAgICAgICAgICAgICAvKiBmb3IgdmFsaWRpdHkgYWZ0ZXIgdGhlIGtyYjVfcmRfcmVxKCkgY2FsbC4gICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHIgPSBrcmI1X3NuYW1lX3RvX3ByaW5jaXBhbChrNV9jb250ZXh0LCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1JCNV9OVF9TUlZfSFNULCAmc2VydmVyKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJrNV9hdXRoX2lzIiwia3JiNV9zbmFtZV90b19wcmluY2lwYWwiLHIpOworCisgICAgICAgICAgICAgICAgaWYgKCFyKSB7CisgICAgICAgICAgICAgICAgICAgIHIgPSBrcmI1X2dldF9zZXJ2ZXJfcmNhY2hlKGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X3ByaW5jX2NvbXBvbmVudChrNV9jb250ZXh0LCBzZXJ2ZXIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJjYWNoZSk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIms1X2F1dGhfaXMiLCJrcmI1X2dldF9zZXJ2ZXJfcmNhY2hlIixyKTsKKyAgICAgICAgICAgICAgICAgICAga3JiNV9mcmVlX3ByaW5jaXBhbChrNV9jb250ZXh0LCBzZXJ2ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcikgeworICAgICAgICAgICAgICAgIHIgPSBrcmI1X2F1dGhfY29uX3NldHJjYWNoZShrNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9jb250ZXh0LCByY2FjaGUpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIms1X2F1dGhfaXMiLCJrcmI1X2F1dGhfY29uX3NldHJjYWNoZSIscik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyICYmIGs1X2tleXRhYikgeworICAgICAgICAgICAgciA9IGtyYjVfa3RfcmVzb2x2ZShrNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgazVfa2V5dGFiLCAma2V5dGFiaWQpOworICAgICAgICAgICAgZGVidWcoRjExMSwiazVfYXV0aF9pcyIsImtyYjVfa3RfcmVzb2x2ZSIscik7CisgICAgICAgIH0KKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgIGlmICghcikgeworICAgICAgICAgICAgciA9IGtyYjVfcmRfcmVxKGs1X2NvbnRleHQsICZhdXRoX2NvbnRleHQsICZrNV9hdXRoLAorI2lmZGVmIEhFSU1EQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLCBOVUxMLCBOVUxMLAorI2Vsc2UgLyogSEVJTURBTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBrZXl0YWJpZCwgTlVMTCwKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrNV90aWNrZXQpOworICAgICAgICAgICAgZGVidWcoRjExMSwiazVfYXV0aF9pcyIsImtyYjVfcmRfcmVxIixyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocikgeworICAgICAgICAgICAgKHZvaWQpIGNrc3RybmNweShlcnJidWYsICJrcmI1X3JkX3JlcSBmYWlsZWQ6ICIsc2l6ZW9mKGVycmJ1ZikpOworICAgICAgICAgICAgKHZvaWQpIGNrc3RybmNhdChlcnJidWYsIGVycm9yX21lc3NhZ2Uociksc2l6ZW9mKGVycmJ1ZikpOworICAgICAgICAgICAgZ290byBlcnJvdXQ7CisgICAgICAgIH0KKyNpZmRlZiBIRUlNREFMCisgICAgICAgIGtyYjVfZnJlZV9wcmluY2lwYWwoazVfY29udGV4dCwgc2VydmVyKTsKKworICAgICAgICB7CisgICAgICAgICAgICBjaGFyIHR5cGVfY2hlY2tbMjZdOworCisgICAgICAgICAgICAvKiBVUERBVEUgZm9yIFNUQVJUX1RMUy4gQVVUSF9FTkNSWVBUX1NUQVJUX1RMUyBhbmQgaW5jbHVzaW9uIG9mICovCisgICAgICAgICAgICAvKiBjbGllbnQgYW5kIHRoZW4gc2VydmVyIGZpbmlzaGVkIG1lc3NhZ2VzLiAqLworCisgICAgICAgICAgICB0eXBlX2NoZWNrWzBdID0gQVVUSFRZUEVfS0VSQkVST1NfVjU7CisgICAgICAgICAgICB0eXBlX2NoZWNrWzFdID0gaG93OyAgICAgICAgLyogbm90IGJyb2tlbiBpbnRvIHBhcnRzICovCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICBpZiAoKGhvdyAmIEFVVEhfRU5DUllQVF9NQVNLKSA9PSBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTKSB7CisgICAgICAgICAgICAgICAgc3NsX2dldF9jbGllbnRfZmluaXNoZWQoJnR5cGVfY2hlY2tbMl0sMTIpOworICAgICAgICAgICAgICAgIHNzbF9nZXRfc2VydmVyX2ZpbmlzaGVkKCZ0eXBlX2NoZWNrWzE0XSwxMik7CisgICAgICAgICAgICAgICAgaGV4ZHVtcCgiazVfYXV0aF9pcyB0eXBlX2NoZWNrIix0eXBlX2NoZWNrLDI2KTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgICAgICAgICAgciA9IGtyYjVfdmVyaWZ5X2F1dGhlbnRpY2F0b3JfY2hlY2tzdW0oazVfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9jaGVjaywKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICAoKGhvdyAmIEFVVEhfRU5DUllQVF9NQVNLKSA9PSBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTKSA/IDI2IDoKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgfQorI2Vsc2UgLyogSEVJTURBTCAqLworICAgICAgICBsZW4gPSBrcmI1X3ByaW5jX2NvbXBvbmVudChrNV9jb250ZXh0LGs1X3RpY2tldC0+c2VydmVyLDApLT5sZW5ndGg7CisgICAgICAgIGlmIChsZW4gPCAyNTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweShwcmluYywKKyAgICAgICAgICAgICAgICAgICBrcmI1X3ByaW5jX2NvbXBvbmVudChrNV9jb250ZXh0LGs1X3RpY2tldC0+c2VydmVyLDApLT5kYXRhLAorICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgICAgICAgICBwcmluY1tsZW5dID0gJ1wwJzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHN0cmNtcCgoa3JiNV9kX3NydiA/IGtyYjVfZF9zcnYgOiBLUkI1X1NFUlZJQ0VfTkFNRSksIHByaW5jKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsIms1X2F1dGhfaXMgaW5jb3JyZWN0IHNlcnZpY2UgbmFtZSIscHJpbmMsMCk7CisgICAgICAgICAgICBja3N0cm5jcHkoZXJyYnVmLCJpbmNvcnJlY3Qgc2VydmljZSBuYW1lOiAiLHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgICAgIGNrc3RybmNhdChlcnJidWYsa3JiNV9kX3NydiA/IGtyYjVfZF9zcnYgOiBLUkI1X1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgICAgIGNrc3RybmNhdChlcnJidWYsIiAhPSAiLHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgICAgIGNrc3RybmNhdChlcnJidWYscHJpbmMsc2l6ZW9mKGVycmJ1ZikpOworICAgICAgICAgICAgZ290byBlcnJvdXQ7CisgICAgICAgIH0KKworICAgICAgICByID0ga3JiNV9hdXRoX2Nvbl9nZXRhdXRoZW50aWNhdG9yKGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGhlbnRpY2F0b3IpOworICAgICAgICBkZWJ1ZyhGMTExLCJrNV9hdXRoX2lzIiwia3JiNV9hdXRoX2Nvbl9nZXRhdXRoZW50aWNhdG9yIixyKTsKKyAgICAgICAgaWYgKHIpIHsKKyAgICAgICAgICAgICh2b2lkKSBja3N0cm5jcHkoZXJyYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia3JiNV9hdXRoX2Nvbl9nZXRhdXRoZW50aWNhdG9yIGZhaWxlZDogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVycmJ1ZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICh2b2lkKSBja3N0cm5jYXQoZXJyYnVmLCBlcnJvcl9tZXNzYWdlKHIpLHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3V0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF1dGhlbnRpY2F0b3ItPmNoZWNrc3VtKSB7CisgICAgICAgICAgICBjaGFyIHR5cGVfY2hlY2tbMjZdOworICAgICAgICAgICAga3JiNV9jaGVja3N1bSAqY2tzdW0gPSBhdXRoZW50aWNhdG9yLT5jaGVja3N1bTsKKyAgICAgICAgICAgIGtyYjVfa2V5YmxvY2sgKmtleTsKKworICAgICAgICAgICAgLyogVVBEQVRFIGZvciBTVEFSVF9UTFMuIEFVVEhfRU5DUllQVF9TVEFSVF9UTFMgYW5kIGluY2x1c2lvbiBvZiAqLworICAgICAgICAgICAgLyogY2xpZW50IGFuZCB0aGVuIHNlcnZlciBmaW5pc2hlZCBtZXNzYWdlcy4gKi8KKworICAgICAgICAgICAgdHlwZV9jaGVja1swXSA9IEFVVEhUWVBFX0tFUkJFUk9TX1Y1OworICAgICAgICAgICAgdHlwZV9jaGVja1sxXSA9IGhvdzsgICAgICAgIC8qIG5vdCBicm9rZW4gaW50byBwYXJ0cyAqLworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgaWYgKChob3cgJiBBVVRIX0VOQ1JZUFRfTUFTSykgPT0gQVVUSF9FTkNSWVBUX1NUQVJUX1RMUykgeworICAgICAgICAgICAgICAgIHNzbF9nZXRfY2xpZW50X2ZpbmlzaGVkKCZ0eXBlX2NoZWNrWzJdLDEyKTsKKyAgICAgICAgICAgICAgICBzc2xfZ2V0X3NlcnZlcl9maW5pc2hlZCgmdHlwZV9jaGVja1sxNF0sMTIpOworICAgICAgICAgICAgICAgIGhleGR1bXAoIms1X2F1dGhfaXMgdHlwZV9jaGVjayIsdHlwZV9jaGVjaywyNik7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyAgICAgICAgICAgIHIgPSBrcmI1X2F1dGhfY29uX2dldGtleShrNV9jb250ZXh0LCBhdXRoX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXkpOworICAgICAgICAgICAgZGVidWcoRjExMSwiazVfYXV0aF9pcyIsImtyYjVfYXV0aF9jb25fZ2V0a2V5IixyKTsKKyAgICAgICAgICAgIGlmIChyKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIGNrc3RybmNweShlcnJidWYsICJrcmI1X2F1dGhfY29uX2dldGtleSBmYWlsZWQ6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVycmJ1ZikpOworICAgICAgICAgICAgICAgICh2b2lkKSBja3N0cm5jYXQoZXJyYnVmLCBlcnJvcl9tZXNzYWdlKHIpLHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgciA9IGtyYjVfdmVyaWZ5X2NoZWNrc3VtKGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrc3VtLT5jaGVja3N1bV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfY2hlY2ssCisgICAgICAgICAgICAgICAgICAoKGhvdyAmIEFVVEhfRU5DUllQVF9NQVNLKSA9PSBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTKSA/IDI2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LT5jb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LT5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIms1X2F1dGhfaXMiLCJrcmI1X3ZlcmlmeV9jaGVja3N1bSIscik7CisgICAgICAgICAgICBpZiAocikgeworICAgICAgICAgICAgICAgICh2b2lkKSBja3N0cm5jcHkoZXJyYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrc3VtIHZlcmlmaWNhdGlvbiBmYWlsZWQ6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZXJyYnVmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAodm9pZCkgY2tzdHJuY2F0KGVycmJ1ZiwgZXJyb3JfbWVzc2FnZShyKSxzaXplb2YoZXJyYnVmKSk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrcmI1X2ZyZWVfa2V5YmxvY2soazVfY29udGV4dCwga2V5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoaG93ICYgQVVUSF9FTkNSWVBUX01BU0spID09IEFVVEhfRU5DUllQVF9VU0lOR19URUxPUFQpIHsKKyAgICAgICAgICAgICAgICAodm9pZCkgc3RyY3B5KGVycmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0aGVudGljYXRvciBpcyBtaXNzaW5nIHJlcXVpcmVkIGNoZWNrc3VtIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBrcmI1X2ZyZWVfYXV0aGVudGljYXRvcihrNV9jb250ZXh0LCBhdXRoZW50aWNhdG9yKTsKKyNlbmRpZiAvKiBIRUlNREFMICovCisKKyNpZmRlZiBUTFNfVkVSSUZZCisgICAgICAgIGlmICgoaG93ICYgQVVUSF9FTkNSWVBUX01BU0spID09IEFVVEhfRU5DUllQVF9TVEFSVF9UTFMpIHsKKyAgICAgICAgICAgIGtyYjVfZGF0YSBpbiwgbXNnOworICAgICAgICAgICAgY2hhciB0bHNfdmVyaWZ5WzI0XTsKKyAgICAgICAgICAgIGtyYjVfcmVwbGF5X2RhdGEgcmVwZGF0YTsKKworICAgICAgICAgICAgc3NsX2dldF9zZXJ2ZXJfZmluaXNoZWQoJnRsc192ZXJpZnlbMF0sMTIpOworICAgICAgICAgICAgc3NsX2dldF9jbGllbnRfZmluaXNoZWQoJnRsc192ZXJpZnlbMTJdLDEyKTsKKworICAgICAgICAgICAgaW4uZGF0YSA9IHRsc192ZXJpZnk7CisgICAgICAgICAgICBpbi5sZW5ndGggPSAyNDsKKworICAgICAgICAgICAga3JiNV9hdXRoX2Nvbl9nZW5hZGRycyhrNV9jb250ZXh0LCBhdXRoX2NvbnRleHQsIHR0eWZkLAorCQkJCQkJCQkgICBLUkI1X0FVVEhfQ09OVEVYVF9HRU5FUkFURV9MT0NBTF9GVUxMX0FERFIpOworICAgICAgICAgICAgaWYgKHIgPSBrcmI1X21rX3NhZmUoazVfY29udGV4dCxhdXRoX2NvbnRleHQsJmluLCZtc2csJnJlcGRhdGEpKSB7CisgICAgICAgICAgICAgICAgY29tX2VycigiIiwgciwgImVuY29kaW5nIHRscyB2ZXJpZmllciIpOworICAgICAgICAgICAgICAgICh2b2lkKSBja3N0cm5jYXQoZXJyYnVmLCBlcnJvcl9tZXNzYWdlKHIpLHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNlbmRLNUF1dGhTQihLUkI1X1RMU19WRVJJRlksIG1zZy5kYXRhLCBtc2cubGVuZ3RoKTsKKyAgICAgICAgICAgIGtyYjVfZnJlZV9kYXRhX2NvbnRlbnRzKGs1X2NvbnRleHQsJm1zZyk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgaWYgKChob3cgJiBBVVRIX0hPV19NQVNLKSA9PSBBVVRIX0hPV19NVVRVQUwpIHsKKyAgICAgICAgICAgIC8qIGRvIGFwX3JlcCBzdHVmZiBoZXJlICovCisgICAgICAgICAgICBpZiAoKHIgPSBrcmI1X21rX3JlcChrNV9jb250ZXh0LAorI2lmZGVmIEhFSU1EQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXV0aF9jb250ZXh0LAorI2Vsc2UgLyogSEVJTURBTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfY29udGV4dCwKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dGJ1ZikpKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiazVfYXV0aF9pcyIsImtyYjVfbWtfcmVwIixyKTsKKyAgICAgICAgICAgICAgICAodm9pZCkgY2tzdHJuY3B5KGVycmJ1ZiwgIk1ha2UgcmVwbHkgZmFpbGVkOiAiLHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgICAgICAgICAodm9pZCkgY2tzdHJuY2F0KGVycmJ1ZiwgZXJyb3JfbWVzc2FnZShyKSxzaXplb2YoZXJyYnVmKSk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJrNV9hdXRoX2lzIiwia3JiNV9ta19yZXAiLHIpOworCisgICAgICAgICAgICBTZW5kSzVBdXRoU0IoS1JCNV9SRVNQT05TRSwgb3V0YnVmLmRhdGEsIG91dGJ1Zi5sZW5ndGgpOworICAgICAgICAgICAgbXV0dWFsX2NvbXBsZXRlID0gMTsKKyAgICAgICAgfQorCisjaWZkZWYgSEVJTURBTAorICAgICAgICB7CisgICAgICAgICAgICBjaGFyICogbmFtZSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoa3JiNV91bnBhcnNlX25hbWUoazVfY29udGV4dCwgazVfdGlja2V0LT5jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzelVzZXJOYW1lQXV0aGVudGljYXRlZFswXSA9ICdcMCc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNrc3RybmNweShzelVzZXJOYW1lQXV0aGVudGljYXRlZCxVSURCVUZMRU4sbmFtZSk7CisgICAgICAgICAgICAgICAgZnJlZShuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2Vsc2UgLyogSEVJTURBTCAqLworICAgICAgICBpZiAoIGtyYjVfYW5hbWVfdG9fbG9jYWxuYW1lKGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs1X3RpY2tldC0+ZW5jX3BhcnQyLT5jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJREJVRkxFTixzelVzZXJOYW1lQXV0aGVudGljYXRlZCkgKQorICAgICAgICAgICAgc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWRbMF0gPSAnXDAnOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKworICAgICAgICBTZW5kSzVBdXRoU0IoS1JCX0FDQ0VQVCwgc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWRbMF0gPyAtMSA6IDApOworICAgICAgICBhY2NlcHRfY29tcGxldGUgPSAxOworICAgICAgICBja21ha21zZyhzdHJUbXAsc2l6ZW9mKHN0clRtcCksCisgICAgICAgICAgICAgICAgICJLZXJiZXJvczUgaWRlbnRpZmllcyBoaW0gYXMgYGAiLAorICAgICAgICAgICAgICAgICBzelVzZXJOYW1lQXV0aGVudGljYXRlZCwiJyciLE5VTEwpOworICAgICAgICBwcmludGYoIiVzXHJcbiIsc3RyVG1wKTsKKworICAgICAgICBpZiAoc3pVc2VyTmFtZVJlcXVlc3RlZFswXSAmJgorICAgICAgICAgICAga3JiNV9rdXNlcm9rKGs1X2NvbnRleHQsCisjaWZkZWYgSEVJTURBTAorICAgICAgICAgICAgICAgICAgICAgICAgICBrNV90aWNrZXQtPmNsaWVudCwKKyNlbHNlIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgazVfdGlja2V0LT5lbmNfcGFydDItPmNsaWVudCwKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN6VXNlck5hbWVSZXF1ZXN0ZWQpKQorICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1ZBTElEKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1VTRVIpOworCisgICAgICAgIGtyYjVfYXV0aF9jb25fZ2V0cmVtb3Rlc3Via2V5KGs1X2NvbnRleHQsIGF1dGhfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdrZXkpOworICAgICAgICBpZiAoazVfc2Vzc2lvbl9rZXkpIHsKKyAgICAgICAgICAgIGtyYjVfZnJlZV9rZXlibG9jayhrNV9jb250ZXh0LCBrNV9zZXNzaW9uX2tleSk7CisgICAgICAgICAgICBrNV9zZXNzaW9uX2tleSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5ld2tleSkgeworICAgICAgICAgICAga3JiNV9jb3B5X2tleWJsb2NrKGs1X2NvbnRleHQsIG5ld2tleSwgJms1X3Nlc3Npb25fa2V5KTsKKyAgICAgICAgICAgIGtyYjVfZnJlZV9rZXlibG9jayhrNV9jb250ZXh0LCBuZXdrZXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAga3JiNV9jb3B5X2tleWJsb2NrKGs1X2NvbnRleHQsCisjaWZkZWYgSEVJTURBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmazVfdGlja2V0LT50aWNrZXQua2V5LAorI2Vsc2UgLyogSEVJTURBTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrNV90aWNrZXQtPmVuY19wYXJ0Mi0+c2Vzc2lvbiwKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrNV9zZXNzaW9uX2tleSk7CisgICAgICAgIH0KKworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyNpZmRlZiBIRUlNREFMCisgICAgICAgIHNrZXkudHlwZSA9IGs1X3Nlc3Npb25fa2V5LT5rZXl2YWx1ZS5sZW5ndGggPT0gOCA/IFNLX0RFUyA6IFNLX0dFTkVSSUM7CisgICAgICAgIHNrZXkubGVuZ3RoID0gazVfc2Vzc2lvbl9rZXktPmtleXZhbHVlLmxlbmd0aDsKKyAgICAgICAgc2tleS5kYXRhID0gazVfc2Vzc2lvbl9rZXktPmtleXZhbHVlLmRhdGE7CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgICAgIHNrZXkudHlwZSA9IGs1X3Nlc3Npb25fa2V5LT5sZW5ndGggPT0gOCA/IFNLX0RFUyA6IFNLX0dFTkVSSUM7CisgICAgICAgIHNrZXkubGVuZ3RoID0gazVfc2Vzc2lvbl9rZXktPmxlbmd0aDsKKyAgICAgICAgc2tleS5kYXRhID0gazVfc2Vzc2lvbl9rZXktPmNvbnRlbnRzOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgZW5jcnlwdF9zZXNzaW9uX2tleSgmc2tleSwgQVVUSF9TRVJWRVJfVE9fQ0xJRU5UKTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgIGRlYnVnKEYxMDAsIms1X2F1dGhfaXMgQVVUSF9TVUNDRVNTIiwiIiwwKTsKKyAgICAgICAga3JiNV9lcnJubyA9IHI7CisgICAgICAgIGlmICgga3JiNV9lcnJubyApCisgICAgICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJvcl9tZXNzYWdlKGtyYjVfZXJybm8pKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csc3RyVG1wKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfU1VDQ0VTUzsKKworI2lmZGVmIEZPUldBUkQKKyAgICBjYXNlIEtSQjVfRk9SV0FSRDoKKyAgICAgICAgaWYgKCAhZm9yd2FyZF9mbGFnICkgeworICAgICAgICAgICAgU2VuZEs1QXV0aFNCKEtSQjVfRk9SV0FSRF9SRUpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3J3YXJkZWQgY3JlZGVudGlhbHMgYXJlIGJlaW5nIHJlZnVzZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpOworICAgICAgICAgICAgcmV0dXJuKEFVVEhfU1VDQ0VTUyk7CisgICAgICAgIH0KKworICAgICAgICBpbmJ1Zi5sZW5ndGggPSBjbnQ7CisgICAgICAgIGluYnVmLmRhdGEgPSAoY2hhciAqKWRhdGE7CisgICAgICAgIGlmICgKKyNpZm5kZWYgSEVJTURBTAorICAgICAgICAgICAgKCFrcmI1X2Rfbm9fYWRkcmVzc2VzICYmCisgICAgICAgICAgICAociA9IGtyYjVfYXV0aF9jb25fZ2VuYWRkcnMoazVfY29udGV4dCxhdXRoX2NvbnRleHQsZ19rc3RyZWFtLT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtSQjVfQVVUSF9DT05URVhUX0dFTkVSQVRFX1JFTU9URV9GVUxMX0FERFIpKSkgfHwKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgICAgICAociA9IHJkX2FuZF9zdG9yZV9mb3JfY3JlZHMoazVfY29udGV4dCwgYXV0aF9jb250ZXh0LCZpbmJ1ZiwKKyNpZmRlZiBIRUlNREFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs1X3RpY2tldC0+Y2xpZW50CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs1X3RpY2tldC0+ZW5jX3BhcnQyLT5jbGllbnQKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKSB7CisgICAgICAgICAgICAodm9pZCkgY2tzdHJuY3B5KGVycmJ1ZiwgIlJlYWQgZm9yd2FyZGVkIGNyZWRzIGZhaWxlZDogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgICAgICh2b2lkKSBja3N0cm5jYXQoZXJyYnVmLCBlcnJvcl9tZXNzYWdlKHIpLHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgICAgIFNlbmRLNUF1dGhTQihLUkI1X0ZPUldBUkRfUkVKRUNULCBlcnJidWYsIC0xKTsKKyAgICAgICAgICAgIHByaW50ZigiQ291bGQgbm90IHJlYWQgZm9yd2FyZGVkIGNyZWRlbnRpYWxzXHJcbiIpOworICAgICAgICAgICAga3JiNV9lcnJubyA9IHI7CisgICAgICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJvcl9tZXNzYWdlKGtyYjVfZXJybm8pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFNlbmRLNUF1dGhTQihLUkI1X0ZPUldBUkRfQUNDRVBULCAwLCAwKTsKKyAgICAgICAgICAgIGNrc3RybmNweShzdHJUbXAsIkZvcndhcmRlZCBjcmVkZW50aWFscyBvYnRhaW5lZCIsc2l6ZW9mKHN0clRtcCkpOworICAgICAgICAgICAgcHJpbnRmKCIlc1xyXG4iLHN0clRtcCk7CisgICAgICAgICAgICBrcmI1X2Vycm5vID0gMDsKKyAgICAgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLHN0clRtcCk7CisgICAgICAgIH0KKyAgICAgICAgLyogQSBmYWlsdXJlIHRvIGFjY2VwdCBmb3J3YXJkZWQgY3JlZGVudGlhbHMgaXMgbm90IGFuICovCisgICAgICAgIC8qIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICByZXR1cm4gQVVUSF9TVUNDRVNTOworI2VuZGlmICAvKiBGT1JXQVJEICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJVbmtub3duIEtlcmJlcm9zIG9wdGlvbiAlZFxyXG4iLCBkYXRhWy0xXSk7CisgICAgICAgIFNlbmRLNUF1dGhTQihLUkJfUkVKRUNULCAwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisKKyAgZXJyb3V0OgorICAgIFNlbmRLNUF1dGhTQihLUkJfUkVKRUNULCBlcnJidWYsIC0xKTsKKyAgICBrcmI1X2Vycm5vID0gcjsKKyAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJidWYpOworICAgIHByaW50ZigiJXNcclxuIiwgZXJyYnVmKTsKKyAgICBpZiAoYXV0aF9jb250ZXh0KSB7CisgICAgICAgIGtyYjVfYXV0aF9jb25fZnJlZShrNV9jb250ZXh0LCBhdXRoX2NvbnRleHQpOworICAgICAgICBhdXRoX2NvbnRleHQgPSAwOworICAgIH0KKyAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworfQorCisjaWZkZWYgRk9SV0FSRAoraW50CisjaWZkZWYgQ0tfQU5TSUMKK2tlcmJlcm9zNV9mb3J3YXJkKHZvaWQpCisjZWxzZQora2VyYmVyb3M1X2ZvcndhcmQoKQorI2VuZGlmCit7CisgICAga3JiNV9lcnJvcl9jb2RlIHI7CisgICAga3JiNV9jY2FjaGUgY2NhY2hlPU5VTEw7CisgICAga3JiNV9wcmluY2lwYWwgY2xpZW50ID0gMDsKKyAgICBrcmI1X3ByaW5jaXBhbCBzZXJ2ZXIgPSAwOworICAgIGtyYjVfZGF0YSBmb3J3X2NyZWRzOworI2lmZGVmIEhFSU1EQUwKKyAgICBrcmI1X2NyZWRzICAgICAgY3JlZHM7CisjZW5kaWYgLyogSEVJTURBTCAqLworCisgICAgZm9yd19jcmVkcy5kYXRhID0gMDsKKworICAgIHIgPSBrNV9nZXRfY2NhY2hlKGs1X2NvbnRleHQsJmNjYWNoZSxOVUxMKTsKKyAgICBpZiAoIHIgKSB7CisgICAgICAgIGNvbV9lcnIoTlVMTCwgciwgIktlcmJlcm9zIFY1OiBjb3VsZCBub3QgZ2V0IGRlZmF1bHQgY2NhY2hlIik7CisgICAgICAgIGtyYjVfZXJybm8gPSByOworICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJvcl9tZXNzYWdlKGtyYjVfZXJybm8pKTsKKyAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgfQorCisgICAgaWYgKChyID0ga3JiNV9jY19nZXRfcHJpbmNpcGFsKGs1X2NvbnRleHQsIGNjYWNoZSwgJmNsaWVudCkpKSB7CisgICAgICAgIGNvbV9lcnIoTlVMTCwgciwgIktlcmJlcm9zIFY1OiBjb3VsZCBub3QgZ2V0IGRlZmF1bHQgcHJpbmNpcGFsIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyNpZmRlZiBIRUlNREFMCisgICAgbWVtc2V0KCZjcmVkcywgMCwgc2l6ZW9mKGNyZWRzKSk7CisgICAgY3JlZHMuY2xpZW50ID0gY2xpZW50OworCisgICAgaWYgKHIgPSBrcmI1X2J1aWxkX3ByaW5jaXBhbChrNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlZHMuc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oY2xpZW50LT5yZWFsbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPnJlYWxtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtyYnRndCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPnJlYWxtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7CisgICAgICAgIGNvbV9lcnIoTlVMTCwgciwgIktlcmJlcm9zIFY1OiBjb3VsZCBub3QgZ2V0IHByaW5jaXBhbCIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgY3JlZHMudGltZXMuZW5kdGltZSA9IDA7CisKKyAgICBpZiAociA9IGtyYjVfZ2V0X2ZvcndhcmRlZF9jcmVkcyhrNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pIb3N0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9yd19jcmVkcykpIHsKKyAgICAgICAgY29tX2VycihOVUxMLCByLCAiS2VyYmVyb3MgVjU6IGVycm9yIGdldHRpbmcgZm9yd2FyZGVkIGNyZWRzIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgLyogd2Ugc2hvdWxkIG5vdCBuZWVkIHRvIG1ha2UgdGhpcyBjYWxsIHNpbmNlIHdlIGFyZSBzdG9yaW5nIHRoZSAqLworICAgIC8qIHNlcnZlcidzIHByaW5jaXBhbCBpbiBmd2Rfc2VydmVyIGZyb20gb3VyIGNhbGwgdG8gICAgICAgICAgICAgKi8KKyAgICAvKiBrcmI1X3NuYW1lX3RvX3ByaW5jaXBhbCgpIGluIGs1X2F1dGhfc2VuZCgpICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKGZ3ZF9zZXJ2ZXIgPT0gTlVMTCkgeworICAgICAgICBpZiAoKHIgPSBrcmI1X3NuYW1lX3RvX3ByaW5jaXBhbChrNV9jb250ZXh0LCBzekhvc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9kX3NydiA/IGtyYjVfZF9zcnYgOiBLUkI1X1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtSQjVfTlRfU1JWX0hTVCwgJnNlcnZlcikpKSB7CisgICAgICAgICAgICBjb21fZXJyKE5VTEwsIHIsICJLZXJiZXJvcyBWNTogY291bGQgbm90IG1ha2Ugc2VydmVyIHByaW5jaXBhbCIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFrcmI1X2Rfbm9fYWRkcmVzc2VzICYmCisgICAgICAgIChyID0ga3JiNV9hdXRoX2Nvbl9nZW5hZGRycyhrNV9jb250ZXh0LCBhdXRoX2NvbnRleHQsIGdfa3N0cmVhbS0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtSQjVfQVVUSF9DT05URVhUX0dFTkVSQVRFX0xPQ0FMX0ZVTExfQUREUikpKQorICAgIHsKKyAgICAgICAgY29tX2VycihOVUxMLCByLCAiS2VyYmVyb3MgVjU6IGNvdWxkIG5vdCBnZW4gbG9jYWwgZnVsbCBhZGRyZXNzIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBpZiAociA9IGtyYjVfZndkX3RndF9jcmVkcyhrNV9jb250ZXh0LCBhdXRoX2NvbnRleHQsIDAsIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZndkX3NlcnZlciA/IGZ3ZF9zZXJ2ZXIgOiBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjYWNoZSwgZm9yd2FyZGFibGVfZmxhZywgJmZvcndfY3JlZHMpKSB7CisgICAgICAgIGNvbV9lcnIoTlVMTCwgciwgIktlcmJlcm9zIFY1OiBlcnJvciBnZXR0aW5nIGZvcndhcmRhYmxlIGNyZWRlbnRpYWxzIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisjZW5kaWYgLyogSEVJTURBTCAqLworCisgICAgLyogU2VuZCBmb3J3YXJkZWQgY3JlZGVudGlhbHMgKi8KKyAgICBpZiAoIVNlbmRLNUF1dGhTQihLUkI1X0ZPUldBUkQsIGZvcndfY3JlZHMuZGF0YSwgZm9yd19jcmVkcy5sZW5ndGgpKSB7CisgICAgICAgIHByaW50ZigiS2VyYmVyb3MgVjUgZm9yd2FyZGluZyBlcnJvciFcclxuJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggcm9vbSBmb3IgYXV0aGVudGljYXRpb24gZGF0YSIpOworICAgIH0KKworY2xlYW51cDoKKyAgICBpZiAoY2xpZW50KQorICAgICAgICBrcmI1X2ZyZWVfcHJpbmNpcGFsKGs1X2NvbnRleHQsIGNsaWVudCk7CisgICAgaWYgKHNlcnZlcikKKyAgICAgICAga3JiNV9mcmVlX3ByaW5jaXBhbChrNV9jb250ZXh0LCBzZXJ2ZXIpOworI2lmZGVmIEhFSU1EQUwKKyAgICBrcmI1X2RhdGFfZnJlZSgmZm9yd19jcmVkcyk7CisjZWxzZSAvKiBIRUlNREFMICovCisgICAga3JiNV9mcmVlX2RhdGFfY29udGVudHMoazVfY29udGV4dCwmZm9yd19jcmVkcyk7CisjZW5kaWYgLyogSEVJTURBTCAqLworICAgIGtyYjVfY2NfY2xvc2UoazVfY29udGV4dCwgY2NhY2hlKTsKKworICAgIGtyYjVfZXJybm8gPSByOworICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGtyYjVfZXJybm8/ZXJyb3JfbWVzc2FnZShrcmI1X2Vycm5vKToiT0siKTsKKyAgICByZXR1cm4ocj9BVVRIX0ZBSUxVUkU6QVVUSF9TVUNDRVNTKTsKK30KKyNlbmRpZiAvKiBGT1JXQVJEICovCisjZWxzZSAvKiBLUkI1ICovCitpbnQKK2NrX2tyYjVfYXV0b2dldF9UR1QoY2hhciAqIGR1bW15KQoreworICAgIHJldHVybigwKTsKK30KKyNpZmRlZiBDS19LRVJCRVJPUworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2NrX2tyYjVfaW5pdFRHVCggc3RydWN0IGtyYl9vcF9kYXRhICogb3AsIHN0cnVjdCBrcmI1X2luaXRfZGF0YSAqIGluaXQsCisgICAgICAgICAgICAgICAgIHN0cnVjdCBrcmI0X2luaXRfZGF0YSAqIGs0X2luaXQpCisjZWxzZQorY2tfa3JiNV9pbml0VEdUKG9wLGluaXQsazRfaW5pdCkKKyAgICBrcmJfb3BfZGF0YSAqIG9wOyBzdHJ1Y3Qga3JiNV9pbml0X2RhdGEgKiBpbml0OworICAgIHN0cnVjdCBrcmI0X2luaXRfZGF0YSAqIGs0X2luaXQ7CisjZW5kaWYgLyogQ0tfQU5TSUMqLworeworICAgIHJldHVybigtMSk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitja19rcmI1X2Rlc3Ryb3koc3RydWN0IGtyYl9vcF9kYXRhICogb3ApCisjZWxzZQorY2tfa3JiNV9kZXN0cm95KG9wKSBzdHJ1Y3Qga3JiX29wX2RhdGEgKiBvcDsKKyNlbmRpZgoreworICAgIHJldHVybigtMSk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitja19rcmI1X2xpc3RfY3JlZHMoc3RydWN0IGtyYl9vcF9kYXRhICogb3AsIHN0cnVjdCBrcmI1X2xpc3RfY3JlZF9kYXRhICogbGMpCisjZWxzZQorY2tfa3JiNV9saXN0X2NyZWRzKG9wLGxjKQorICAgIHN0cnVjdCBrcmJfb3BfZGF0YSAqIG9wOyBzdHJ1Y3Qga3JiNV9saXN0X2NyZWRfZGF0YSAqIGxjOworI2VuZGlmCit7CisgICAgcmV0dXJuKC0xKTsKK30KKyNlbHNlIC8qIENLX0tFUkJFUk9TICovCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNV9pbml0VEdUKHZvaWQgKiBvcCwgdm9pZCAqIGluaXQsIHZvaWQgKiBrNF9pbml0ICkKKyNlbHNlCitja19rcmI1X2luaXRUR1Qob3AsaW5pdCxrNF9pbml0KQorICAgIHZvaWQgKiBvcDsgdm9pZCAqIGluaXQ7IHZvaWQgKiBrNF9pbml0OworI2VuZGlmIC8qIENLX0FOU0lDKi8KK3sKKyAgICByZXR1cm4oLTEpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNV9kZXN0cm95KHZvaWQgKiBvcCkKKyNlbHNlCitja19rcmI1X2Rlc3Ryb3kob3ApIHZvaWQgKiBvcDsKKyNlbmRpZgoreworICAgIHJldHVybigtMSk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitja19rcmI1X2xpc3RfY3JlZHModm9pZCAqIG9wLCB2b2lkICogbGMpCisjZWxzZQorY2tfa3JiNV9saXN0X2NyZWRzKG9wLGxjKQorICAgIHZvaWQgKiBvcDsgdm9pZCAqIGxjOworI2VuZGlmCit7CisgICAgcmV0dXJuKC0xKTsKK30KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2VuZGlmIC8qIEtSQjUgKi8KKworI2lmZGVmIEdTU0FQSV9LUkI1CisvKgorICoKKyAqIGdzc2s1X2F1dGhfc2VuZCAtIGdldHMgYXV0aGVudGljYXRpb24gYml0cyB3ZSBuZWVkIHRvIHNlbmQgdG8gS0RDLgorICoKKyAqIFJlc3VsdCBpcyBsZWZ0IGluIGs1X2F1dGgKKyAqCisgKiBSZXR1cm5zOiAwIG9uIGZhaWx1cmUsIDEgb24gc3VjY2VzcworICoKKyAqLworCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK2dzc2s1X2F1dGhfc2VuZChpbnQgaG93LCBpbnQgZW5jcnlwdCwgaW50IGZvcndhcmQpCisjZWxzZQorZ3NzazVfYXV0aF9zZW5kKGhvdyxlbmNyeXB0LGZvcndhcmQpIGludCBob3c7IGludCBlbmNyeXB0OyBpbnQgZm9yd2FyZDsKKyNlbmRpZgoreworICAgIE9NX3VpbnQzMiBtYWpfc3RhdCwgbWluX3N0YXQ7CisjaWZkZWYgS1JCNQorICAgIGNoYXIgKiByZWFsbSA9IE5VTEw7CisgICAgY2hhciB0Z3RbMjU2XTsKKyNlbmRpZiAvKiBLUkI1ICovCisKKyAgICBnc3NfY2hhbi5pbml0aWF0b3JfYWRkcnR5cGUgPSBHU1NfQ19BRl9JTkVUOyAvKiBPTV91aW50MzIgICovCisgICAgZ3NzX2NoYW4uaW5pdGlhdG9yX2FkZHJlc3MubGVuZ3RoID0gNDsKKyAgICBnc3NfY2hhbi5pbml0aWF0b3JfYWRkcmVzcy52YWx1ZSA9ICZteWN0bGFkZHIuc2luX2FkZHIuc19hZGRyOworICAgIGdzc19jaGFuLmFjY2VwdG9yX2FkZHJ0eXBlID0gR1NTX0NfQUZfSU5FVDsgLyogT01fdWludDMyICovCisgICAgZ3NzX2NoYW4uYWNjZXB0b3JfYWRkcmVzcy5sZW5ndGggPSA0OworICAgIGdzc19jaGFuLmFjY2VwdG9yX2FkZHJlc3MudmFsdWUgPSAmaGlzY3RsYWRkci5zaW5fYWRkci5zX2FkZHI7CisgICAgZ3NzX2NoYW4uYXBwbGljYXRpb25fZGF0YS5sZW5ndGggPSAwOworICAgIGdzc19jaGFuLmFwcGxpY2F0aW9uX2RhdGEudmFsdWUgPSAwOworCisjaWZkZWYgS1JCNQorICAgIHJlYWxtID0gY2tfa3JiNV9yZWFsbW9maG9zdChmdHBfaG9zdCk7CisgICAgaWYgKHJlYWxtKSB7CisgICAgICAgIGNrbWFrbXNnKHRndCxzaXplb2YodGd0KSwia3JidGd0LyIscmVhbG0sIkAiLHJlYWxtKTsKKyAgICAgICAgZGVidWcoRjExMCwiZnRwX2F1dGgoR1NTQVBJKSBUR1QiLHRndCwwKTsKKyAgICAgICAgaWYgKCBrcmI1X2F1dG9nZXQgJiYKKyAgICAgICAgICAgICAhKChja19rcmI1X3RrdF9pc3ZhbGlkKE5VTEwsdGd0KSA+IDApIHx8CisgICAgICAgICAgICAgICAgKGNrX2tyYjVfaXNfdGd0X3ZhbGlkKCkgPiAwKSkgKQorICAgICAgICAgICAgY2tfa3JiNV9hdXRvZ2V0X1RHVChyZWFsbSk7CisgICAgfQorI2VuZGlmIC8qIEtSQjUgKi8KKworICAgIC8qIEJsb2IgZnJvbSBnc3MtY2xpZW50ICovCisgICAgLyogaG9zdEBob3N0bmFtZSAqLworICAgIC8qIHRoZSBWNSBHU1NBUEkgYmluZGluZyBjYW5vbmljYWxpemVzIHRoaXMgZm9yIHVzLi4uICovCisgICAgY2ttYWttc2coZ3NzX3N0YnVmLEdTU19CVUZTSVosCisgICAgICAgICAgICAga3JiNV9kX3NydiA/IGtyYjVfZF9zcnYgOiBLUkI1X1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAiQCIsCisgICAgICAgICAgICAgc3pIb3N0TmFtZSwKKyAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICApOworICAgIGZwcmludGYoc3RkZXJyLCAiQXV0aGVudGljYXRpbmcgdG8gPCVzPi4uLlxuIiwgZ3NzX3N0YnVmKTsKKyAgICBnc3Nfc2VuZF90b2sudmFsdWUgPSBnc3Nfc3RidWY7CisgICAgZ3NzX3NlbmRfdG9rLmxlbmd0aCA9IHN0cmxlbihnc3Nfc3RidWYpOworICAgIG1hal9zdGF0ID0gZ3NzX2ltcG9ydF9uYW1lKCZtaW5fc3RhdCwgJmdzc19zZW5kX3RvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzX250X3NlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdzc190YXJnZXRfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIGlmIChtYWpfc3RhdCAhPSBHU1NfU19DT01QTEVURSkgeworICAgICAgICB1c2VyX2dzc19lcnJvcihtYWpfc3RhdCwgbWluX3N0YXQsICJwYXJzaW5nIG5hbWUiKTsKKyAgICAgICAgc2VjdXJlX2Vycm9yKCJuYW1lIHBhcnNlZCA8JXM+XG4iLCBnc3Nfc3RidWYpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIHRva2VuX3B0ciA9IEdTU19DX05PX0JVRkZFUjsKKyAgICBnY29udGV4dCA9IEdTU19DX05PX0NPTlRFWFQ7IC8qIHN0cnVjdHVyZSBjb3B5ICovCisKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNhbGxpbmcgZ3NzX2luaXRfc2VjX2NvbnRleHRcbiIpOworICAgIG1hal9zdGF0ID0KKyAgICAgICAgZ3NzX2luaXRfc2VjX2NvbnRleHQoJm1pbl9zdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NTX0NfTk9fQ1JFREVOVElBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc190YXJnZXRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc19tZWNoX2tyYjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1NfQ19NVVRVQUxfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1NfQ19SRVBMQVlfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZvcndhcmQgJiYgZm9yd2FyZF9mbGFnKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTU19DX0RFTEVHX0ZMQUcgOiAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa3JiNV9kX25vX2FkZHJlc3NlcyA/IC8qIGNoYW5uZWwgYmluZGluZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NTX0NfTk9fQ0hBTk5FTF9CSU5ESU5HUyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnc3NfY2hhbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3NfdG9rZW5fcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgIC8qIGlnbm9yZSBtZWNoIHR5cGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnc3Nfc2VuZF90b2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgLyogaWdub3JlIHJldF9mbGFncyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsgICAgICAgIC8qIGlnbm9yZSB0aW1lX3JlYyAqLworCisKKyAgICAgICAgaWYgKG1hal9zdGF0ICE9IEdTU19TX0NPTVBMRVRFICYmCisgICAgICAgICAgICAgbWFqX3N0YXQgIT0gR1NTX1NfQ09OVElOVUVfTkVFREVEKSB7CisgICAgICAgICAgICB1c2VyX2dzc19lcnJvcihtYWpfc3RhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc3RhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdGlhbGl6aW5nIGNvbnRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGdzc19yZWxlYXNlX25hbWUoJm1pbl9zdGF0LCAmZ3NzX3RhcmdldF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oMSk7Cit9CisKKy8qCisgKiBnc3NrNV9hdXRoX3JlcGx5IC0tIGNoZWNrcyB0aGUgcmVwbHkgZm9yIG11dHVhbCBhdXRoZW50aWNhdGlvbi4KKyAqLworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCitnc3NrNV9hdXRoX3JlcGx5KGludCBob3csIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBjbnQpCisjZWxzZQorZ3NzazVfYXV0aF9yZXBseShob3csZGF0YSxjbnQpIGludCBob3c7IHVuc2lnbmVkIGNoYXIgKmRhdGE7IGludCBjbnQ7CisjZW5kaWYKK3sKKyAgICBkYXRhICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIHN0YXR1cyBieXRlICovCisgICAgY250IC09NTsKKworICAgIHN3aXRjaCAoKmRhdGErKykgeworICAgIGNhc2UgR1NTX1JFSkVDVDoKKyAgICAgICAgaWYgKGNudCA+IDApIHsKKyAgICAgICAgICAgIGNoYXIgKnM7CisgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgY2tzdHJuY3B5KHN0clRtcCwiR1NTQVBJIHJlZnVzZXMgYXV0aGVudGljYXRpb24gYmVjYXVzZVxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJUbXApKTsKKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzdHJUbXApOworICAgICAgICAgICAgaWYgKCBsZW4gKyBjbnQgPCBzaXplb2Yoc3RyVG1wKSApIHsKKyAgICAgICAgICAgICAgICBzID0gc3RyVG1wICsgc3RybGVuKHN0clRtcCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHMsIGRhdGEsIGNudCk7ICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICAgICAgc1tjbnRdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBja3N0cm5jcHkoc3RyVG1wLCJHU1NBUEkgcmVmdXNlcyBhdXRoZW50aWNhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0clRtcCkpOworICAgICAgICBwcmludGYoIkdTU0FQSSBhdXRoZW50aWNhdGlvbiBmYWlsZWQhXHJcbiVzXHJcbiIsc3RyVG1wKTsKKyAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisKKyAgICBjYXNlIEdTU19BQ0NFUFQ6CisgICAgICAgIGlmICggY250ID4gMCApIHsKKyAgICAgICAgICAgIGNoYXIgKnM7CisgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgY2tzdHJuY3B5KHN0clRtcCwiR1NTQVBJIGFjY2VwdHMgeW91IGFzICIsc2l6ZW9mKHN0clRtcCkpOworICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0clRtcCk7CisgICAgICAgICAgICBpZiAoIGxlbiArIGNudCA8IHNpemVvZihzdHJUbXApICkgeworICAgICAgICAgICAgICAgIHMgPSBzdHJUbXAgKyBzdHJsZW4oc3RyVG1wKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocyxkYXRhLGNudCk7CisgICAgICAgICAgICAgICAgc1tjbnRdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhY2NlcHRfY29tcGxldGUgPSAxOworICAgICAgICBwcmludGYoIiVzXHJcbiIsc3RyVG1wKTsKKyAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1VTRVIpOworICAgICAgICByZXR1cm4gQVVUSF9TVUNDRVNTOworCisgICAgY2FzZSBHU1NfUkVTUE9OU0U6CisgICAgICAgIGdzc190b2tlbl9wdHIgPSAmZ3NzX3JlY3ZfdG9rOworICAgICAgICBnc3NfcmVjdl90b2sudmFsdWUgPSBkYXRhOworICAgICAgICBnc3NfcmVjdl90b2subGVuZ3RoID0gY250OworCisgICAgICAgIG1hal9zdGF0ID0KKyAgICAgICAgICAgIGdzc19pbml0X3NlY19jb250ZXh0KCZtaW5fc3RhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1NfQ19OT19DUkVERU5USUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3NfdGFyZ2V0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzX2tyYjVfbWVjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1NfQ19NVVRVQUxfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NTX0NfUkVQTEFZX0ZMQUcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3J3YXJkX2ZsYWcgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NTX0NfREVMRUdfRkxBRyA6IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtyYjVfZF9ub19hZGRyZXNzZXMgPyAvKiBjaGFubmVsIGJpbmRpbmdzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1NfQ19OT19DSEFOTkVMX0JJTkRJTkdTIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnc3NfY2hhbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzX3Rva2VuX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKiBpZ25vcmUgbWVjaCB0eXBlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdzc19zZW5kX3RvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKiBpZ25vcmUgcmV0X2ZsYWdzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7ICAgIC8qIGlnbm9yZSB0aW1lX3JlYyAqLworCisgICAgICAgIGlmICggbWFqX3N0YXQgPT0gR1NTX1NfQ09NUExFVEUgKQorICAgICAgICB7CisKKyAgICAgICAgfSBlbHNlIGlmICggbWFqX3N0YXQgPT0gQ1NTX1NfQ09OVElOVUVfTkVFREVEICkgeworICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisKKyAgICAgICAgY2tzdHJuY3B5KHN0clRtcCwiUmVtb3RlIG1hY2hpbmUgaGFzIGJlZW4gbXV0dWFsbHkgYXV0aGVudGljYXRlZCIsCisgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RyVG1wKSk7CisgICAgICAgIHByaW50ZigiJXNcclxuIixzdHJUbXApOworICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfVVNFUik7CisgICAgICAgIHJldHVybiBBVVRIX1NVQ0NFU1M7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVbmtub3duIHJlcGx5IHR5cGUgKi8KKyAgICB9Cit9CisKKy8qCisgKgorICogZ3NzazVfYXV0aF9pcy4KKyAqCisgKi8KKworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCitrNV9hdXRoX2lzKGludCBob3csIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBjbnQpCisjZWxzZQorazVfYXV0aF9pcyhob3csZGF0YSxjbnQpIGludCBob3c7IHVuc2lnbmVkIGNoYXIgKmRhdGE7IGludCBjbnQ7CisjZW5kaWYKK3sKKyAgICBpbnQgcmVwbGllZCA9IDA7CisgICAgZ3NzX2NyZWRfaWRfdCBzZXJ2ZXJfY3JlZHMsIGRlbGVnX2NyZWRzOworICAgIGdzc19uYW1lX3QgY2xpZW50OworICAgIGludCByZXRfZmxhZ3M7CisgICAgZ3NzX2J1ZmZlcl9kZXNjIG5hbWVfYnVmOworICAgIGdzc19uYW1lX3Qgc2VydmVyX25hbWU7CisgICAgT01fdWludDMyIGFjcXVpcmVfbWFqLAorICAgICAgYWNxdWlyZV9taW4sCisgICAgICBhY2NlcHRfbWFqLAorICAgICAgYWNjZXB0X21pbiwKKyAgICAgIHN0YXRfbWFqLAorICAgICAgc3RhdF9taW47CisgICAgZ3NzX09JRCBtZWNoaWQ7CisgICAgZ3NzX2J1ZmZlcl9kZXNjIHRvaywgb3V0X3RvazsKKyAgICBjaGFyIGdidWZbR1NTX0JVRlNJWl07CisgICAgdV9jaGFyIGdvdXRfYnVmW0dTU19CVUZTSVpdOworICAgIGNoYXIgbG9jYWxuYW1lW01BWEhPU1ROQU1FTEVOXTsKKyAgICBjaGFyIHNlcnZpY2VfbmFtZVtNQVhIT1NUTkFNRUxFTisxMF07CisgICAgY2hhciAqKnNlcnZpY2U7CisgICAgc3RydWN0IGhvc3RlbnQgKmhwOworCisgICAgZGF0YSArPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBzdGF0dXMgYnl0ZSAqLworICAgIGNudCAtPSA0OworCisgICAgaGV4ZHVtcCgiZ3NzazVfYXV0aF9pcyBkYXRhIixkYXRhLGNudCk7CisgICAgZGVidWcoRjExMSwiZ3NzazVfYXV0aF9pcyIsImhvdyIsaG93KTsKKworICAgIGlmIChjbnQtLSA8IDEpIHsKKyAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisgICAgfQorICAgIHN3aXRjaCAoKmRhdGErKykgeworICAgIGNhc2UgR1NTX0FVVEg6CisgICAgICAgIGdzc19jaGFuLmluaXRpYXRvcl9hZGRydHlwZSA9IEdTU19DX0FGX0lORVQ7CisgICAgICAgIGdzc19jaGFuLmluaXRpYXRvcl9hZGRyZXNzLmxlbmd0aCA9IDQ7CisgICAgICAgIGdzc19jaGFuLmluaXRpYXRvcl9hZGRyZXNzLnZhbHVlID0gJmhpc19hZGRyLnNpbl9hZGRyLnNfYWRkcjsKKyAgICAgICAgZ3NzX2NoYW4uYWNjZXB0b3JfYWRkcnR5cGUgPSBHU1NfQ19BRl9JTkVUOworICAgICAgICBnc3NfY2hhbi5hY2NlcHRvcl9hZGRyZXNzLmxlbmd0aCA9IDQ7CisgICAgICAgIGdzc19jaGFuLmFjY2VwdG9yX2FkZHJlc3MudmFsdWUgPSAmY3RybF9hZGRyLnNpbl9hZGRyLnNfYWRkcjsKKyAgICAgICAgZ3NzX2NoYW4uYXBwbGljYXRpb25fZGF0YS5sZW5ndGggPSAwOworICAgICAgICBnc3NfY2hhbi5hcHBsaWNhdGlvbl9kYXRhLnZhbHVlID0gMDsKKworICAgICAgICB0b2sudmFsdWUgPSBkYXRhOworICAgICAgICB0b2subGVuZ3RoID0gY250OworCisgICAgICAgIGlmIChnZXRob3N0bmFtZShsb2NhbG5hbWUsIE1BWEhPU1ROQU1FTEVOKSkgeworICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGlmICghKGhwID0gZ2V0aG9zdGJ5bmFtZShsb2NhbG5hbWUpKSkgeworICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworICAgICAgICB9CisjaWZkZWYgSEFERFJMSVNUCisgICAgICAgIGhwID0gY2tfY29weWhvc3RlbnQoaHApOworI2VuZGlmIC8qIEhBRERSTElTVCAqLworICAgICAgICBzdHJuY3B5KGxvY2FsbmFtZSwgaHAtPmhfbmFtZSwgc2l6ZW9mKGxvY2FsbmFtZSkgLSAxKTsKKyAgICAgICAgbG9jYWxuYW1lW3NpemVvZihsb2NhbG5hbWUpIC0gMV0gPSAnXDAnOworCisgICAgICAgIHNwcmludGYoc2VydmljZV9uYW1lLCAiJXNAJXMiLCAqc2VydmljZSwgbG9jYWxuYW1lKTsKKyAgICAgICAgbmFtZV9idWYudmFsdWUgPSBzZXJ2aWNlX25hbWU7CisgICAgICAgIG5hbWVfYnVmLmxlbmd0aCA9IHN0cmxlbihuYW1lX2J1Zi52YWx1ZSkgKyAxOworICAgICAgICBzdGF0X21haiA9IGdzc19pbXBvcnRfbmFtZSgmc3RhdF9taW4sICZuYW1lX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc19udF9zZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyX25hbWUpOworICAgICAgICBpZiAoc3RhdF9tYWogIT0gR1NTX1NfQ09NUExFVEUpIHsKKyAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyAgICAgICAgfQorCisgICAgICAgIGFjcXVpcmVfbWFqID0gZ3NzX2FjcXVpcmVfY3JlZCgmYWNxdWlyZV9taW4sIHNlcnZlcl9uYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTU19DX05VTExfT0lEX1NFVCwgR1NTX0NfQUNDRVBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXJfY3JlZHMsIE5VTEwsIE5VTEwpOworICAgICAgICAodm9pZCkgZ3NzX3JlbGVhc2VfbmFtZSgmc3RhdF9taW4sICZzZXJ2ZXJfbmFtZSk7CisKKyAgICAgICAgaWYgKGFjcXVpcmVfbWFqICE9IEdTU19TX0NPTVBMRVRFKSB7CisgICAgICAgICAgICByZXBseV9nc3NfZXJyb3IoNTM1LCBhY2NlcHRfbWFqLCBhY2NlcHRfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VwdGluZyBjb250ZXh0Iik7CisgICAgICAgICAgICBzeXNsb2coTE9HX0VSUiwgImZhaWxlZCBhY2NlcHRpbmcgY29udGV4dCIpOworICAgICAgICAgICAgKHZvaWQpIGdzc19yZWxlYXNlX2NyZWQoJnN0YXRfbWluLCAmc2VydmVyX2NyZWRzKTsKKyAgICAgICAgICAgIGlmIChyZXRfZmxhZ3MgJiBHU1NfQ19ERUxFR19GTEFHKQorICAgICAgICAgICAgICAgICh2b2lkKSBnc3NfcmVsZWFzZV9jcmVkKCZzdGF0X21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbGVnX2NyZWRzKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgZ2NvbnRleHQgPSBHU1NfQ19OT19DT05URVhUOworICAgICAgICBhY2NlcHRfbWFqID0gZ3NzX2FjY2VwdF9zZWNfY29udGV4dCgmYWNjZXB0X21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdjb250ZXh0LCAvKiBjb250ZXh0X2hhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJpZmllcl9jcmVkX2hhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfY3JlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b2ssIC8qIGlucHV0X3Rva2VuICovCisJCQkJCSAgICAoa3JiNV9kX25vX2FkZHJlc3NlcyA/CisJCQkJCSAgICAgLyogY2hhbm5lbCBiaW5kaW5ncyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1NfQ19OT19DSEFOTkVMX0JJTkRJTkdTIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdzc19jaGFuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnQsIC8qIHNyY19uYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWNoaWQsIC8qIG1lY2hfdHlwZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0X3RvaywgLyogb3V0cHV0X3Rva2VuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgIC8qIGlnbm9yZSB0aW1lX3JlYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3J3YXJkZWQgY3JlZGVudGlhbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbGVnX2NyZWRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgaWYgKGFjY2VwdF9tYWohPUdTU19TX0NPTVBMRVRFICYmIGFjY2VwdF9tYWohPUdTU19TX0NPTlRJTlVFX05FRURFRCkgeworICAgICAgICAgICAgcmVwbHlfZ3NzX2Vycm9yKDUzNSwgYWNjZXB0X21haiwgYWNjZXB0X21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VwdGluZyBjb250ZXh0Iik7CisgICAgICAgICAgICBzeXNsb2coTE9HX0VSUiwgImZhaWxlZCBhY2NlcHRpbmcgY29udGV4dCIpOworICAgICAgICAgICAgKHZvaWQpIGdzc19yZWxlYXNlX2NyZWQoJnN0YXRfbWluLCAmc2VydmVyX2NyZWRzKTsKKyAgICAgICAgICAgIGlmIChyZXRfZmxhZ3MgJiBHU1NfQ19ERUxFR19GTEFHKQorICAgICAgICAgICAgICAgICh2b2lkKSBnc3NfcmVsZWFzZV9jcmVkKCZzdGF0X21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbGVnX2NyZWRzKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dF90b2subGVuZ3RoKSB7CisgICAgICAgICAgICBpZiAoa2Vycm9yID0gcmFkaXhfZW5jb2RlKG91dF90b2sudmFsdWUsZ2J1Ziwmb3V0X3Rvay5sZW5ndGgsIDApKSB7CisgICAgICAgICAgICAgICAgc2VjdXJlX2Vycm9yKCJDb3VsZG4ndCBlbmNvZGUgQURBVCByZXBseSAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXhfZXJyb3Ioa2Vycm9yKSk7CisgICAgICAgICAgICAgICAgc3lzbG9nKExPR19FUlIsICJjb3VsZG4ndCBlbmNvZGUgQURBVCByZXBseSIpOworICAgICAgICAgICAgICAgICh2b2lkKSBnc3NfcmVsZWFzZV9jcmVkKCZzdGF0X21pbiwgJnNlcnZlcl9jcmVkcyk7CisgICAgICAgICAgICAgICAgaWYgKHJldF9mbGFncyAmIEdTU19DX0RFTEVHX0ZMQUcpCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgZ3NzX3JlbGVhc2VfY3JlZCgmc3RhdF9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsZWdfY3JlZHMpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0X21haiA9PSBHU1NfU19DT01QTEVURSkgeworICAgICAgICAgICAgICAgIHJlcGx5KDIzNSwgIkFEQVQ9JXMiLCBnYnVmKTsKKyAgICAgICAgICAgICAgICByZXBsaWVkID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogSWYgdGhlIHNlcnZlciBhY2NlcHRzIHRoZSBzZWN1cml0eSBkYXRhLCBhbmQKKyAgICAgICAgICAgICAgICAgICByZXF1aXJlcyBhZGRpdGlvbmFsIGRhdGEsIGl0IHNob3VsZCByZXNwb25kCisgICAgICAgICAgICAgICAgICAgd2l0aCByZXBseSBjb2RlIDMzNS4gKi8KKyAgICAgICAgICAgICAgICByZXBseSgzMzUsICJBREFUPSVzIiwgZ2J1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCkgZ3NzX3JlbGVhc2VfYnVmZmVyKCZzdGF0X21pbiwgJm91dF90b2spOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXRfbWFqID09IEdTU19TX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAvKiBHU1NBUEkgYXV0aGVudGljYXRpb24gc3VjY2VlZGVkICovCisgICAgICAgICAgICBzdGF0X21haiA9IGdzc19kaXNwbGF5X25hbWUoJnN0YXRfbWluLCBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRfbmFtZSwgJm1lY2hpZCk7CisgICAgICAgICAgICBpZiAoc3RhdF9tYWogIT0gR1NTX1NfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICAvKiAiSWYgdGhlIHNlcnZlciByZWplY3RzIHRoZSBzZWN1cml0eSBkYXRhIChpZgorICAgICAgICAgICAgICAgICAgIGEgY2hlY2tzdW0gZmFpbHMsIGZvciBpbnN0YW5jZSksIGl0IHNob3VsZAorICAgICAgICAgICAgICAgICAgIHJlc3BvbmQgd2l0aCByZXBseSBjb2RlIDUzNS4iICovCisgICAgICAgICAgICAgICAgcmVwbHlfZ3NzX2Vycm9yKDUzNSwgc3RhdF9tYWosIHN0YXRfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0cmFjdGluZyBHU1NBUEkgaWRlbnRpdHkgbmFtZSIpOworICAgICAgICAgICAgICAgIHN5c2xvZyhMT0dfRVJSLCAiZ3NzYXBpIGVycm9yIGV4dHJhY3RpbmcgaWRlbnRpdHkiKTsKKyAgICAgICAgICAgICAgICAodm9pZCkgZ3NzX3JlbGVhc2VfY3JlZCgmc3RhdF9taW4sICZzZXJ2ZXJfY3JlZHMpOworICAgICAgICAgICAgICAgIGlmIChyZXRfZmxhZ3MgJiBHU1NfQ19ERUxFR19GTEFHKQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGdzc19yZWxlYXNlX2NyZWQoJnN0YXRfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbGVnX2NyZWRzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dGhfdHlwZSA9IHRlbXBfYXV0aF90eXBlOworICAgICAgICAgICAgdGVtcF9hdXRoX3R5cGUgPSBOVUxMOworCisgICAgICAgICAgICAodm9pZCkgZ3NzX3JlbGVhc2VfY3JlZCgmc3RhdF9taW4sICZzZXJ2ZXJfY3JlZHMpOworICAgICAgICAgICAgaWYgKHJldF9mbGFncyAmIEdTU19DX0RFTEVHX0ZMQUcpIHsKKyAgICAgICAgICAgICAgICBpZiAod2FudF9jcmVkcykKKyAgICAgICAgICAgICAgICAgICAgZnRwZF9nc3NfY29udmVydF9jcmVkcyhjbGllbnRfbmFtZS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdfY3JlZHMpOworICAgICAgICAgICAgICAgICh2b2lkKSBnc3NfcmVsZWFzZV9jcmVkKCZzdGF0X21pbiwgJmRlbGVnX2NyZWRzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSWYgdGhlIHNlcnZlciBhY2NlcHRzIHRoZSBzZWN1cml0eSBkYXRhLCBidXQgZG9lcworICAgICAgICAgICAgICAgbm90IHJlcXVpcmUgYW55IGFkZGl0aW9uYWwgZGF0YSAoaS5lLiwgdGhlIHNlY3VyaXR5CisgICAgICAgICAgICAgICBkYXRhIGV4Y2hhbmdlIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KSwgaXQgbXVzdAorICAgICAgICAgICAgICAgcmVzcG9uZCB3aXRoIHJlcGx5IGNvZGUgMjM1LiAqLworICAgICAgICAgICAgaWYgKCFyZXBsaWVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZXRfZmxhZ3MgJiBHU1NfQ19ERUxFR19GTEFHICYmICFoYXZlX2NyZWRzKQorICAgICAgICAgICAgICAgICAgcmVwbHkoMjM1LAorICJHU1NBUEkgQXV0aGVudGljYXRpb24gc3VjY2VlZGVkLCBidXQgY291bGQgbm90IGFjY2VwdCBmb3J3YXJkZWQgY3JlZGVudGlhbHMiCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHJlcGx5KDIzNSwgIkdTU0FQSSBBdXRoZW50aWNhdGlvbiBzdWNjZWVkZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0X21haiA9PSBHU1NfU19DT05USU5VRV9ORUVERUQpIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBzZXJ2ZXIgYWNjZXB0cyB0aGUgc2VjdXJpdHkgZGF0YSwgYW5kCisgICAgICAgICAgICByZXF1aXJlcyBhZGRpdGlvbmFsIGRhdGEsIGl0IHNob3VsZCByZXNwb25kIHdpdGgKKyAgICAgICAgICAgIHJlcGx5IGNvZGUgMzM1LiAqLworICAgICAgICAgICAgcmVwbHkoMzM1LCAibW9yZSBkYXRhIG5lZWRlZCIpOworICAgICAgICAgICAgKHZvaWQpIGdzc19yZWxlYXNlX2NyZWQoJnN0YXRfbWluLCAmc2VydmVyX2NyZWRzKTsKKyAgICAgICAgICAgIGlmIChyZXRfZmxhZ3MgJiBHU1NfQ19ERUxFR19GTEFHKQorICAgICAgICAgICAgICAgICh2b2lkKSBnc3NfcmVsZWFzZV9jcmVkKCZzdGF0X21pbiwgJmRlbGVnX2NyZWRzKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qICJJZiB0aGUgc2VydmVyIHJlamVjdHMgdGhlIHNlY3VyaXR5IGRhdGEgKGlmCisgICAgICAgICAgICBhIGNoZWNrc3VtIGZhaWxzLCBmb3IgaW5zdGFuY2UpLCBpdCBzaG91bGQKKyAgICAgICAgICAgIHJlc3BvbmQgd2l0aCByZXBseSBjb2RlIDUzNS4iICovCisgICAgICAgICAgICByZXBseV9nc3NfZXJyb3IoNTM1LCBzdGF0X21haiwgc3RhdF9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHU1NBUEkgZmFpbGVkIHByb2Nlc3NpbmcgQURBVCIpOworICAgICAgICAgICAgc3lzbG9nKExPR19FUlIsICJHU1NBUEkgZmFpbGVkIHByb2Nlc3NpbmcgQURBVCIpOworICAgICAgICAgICAgKHZvaWQpIGdzc19yZWxlYXNlX2NyZWQoJnN0YXRfbWluLCAmc2VydmVyX2NyZWRzKTsKKyAgICAgICAgICAgIGlmIChyZXRfZmxhZ3MgJiBHU1NfQ19ERUxFR19GTEFHKQorICAgICAgICAgICAgICAgICh2b2lkKSBnc3NfcmVsZWFzZV9jcmVkKCZzdGF0X21pbiwgJmRlbGVnX2NyZWRzKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlYnVnKEYxMDAsImdzc2s1X2F1dGhfaXMgQVVUSF9TVUNDRVNTIiwiIiwwKTsKKyAgICAgICAga3JiNV9lcnJubyA9IHI7CisgICAgICAgIGlmICgga3JiNV9lcnJubyApCisgICAgICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJvcl9tZXNzYWdlKGtyYjVfZXJybm8pKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csc3RyVG1wKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfU1VDQ0VTUzsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ZigiVW5rbm93biBLZXJiZXJvcyBvcHRpb24gJWRcclxuIiwgZGF0YVstMV0pOworICAgICAgICBTZW5kR1NTSzVBdXRoU0IoR1NTX1JFSkVDVCwgMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworfQorI2VuZGlmIC8qIEdTU0FQSV9LUkI1ICovCisKKyNpZmRlZiBDS19TUlAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgU3RhbmZvcmQgVW5pdmVyc2l0eQorICoKKyAqIFRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBmb3IgcmV2ZW51ZS1nZW5lcmF0aW5nIHB1cnBvc2VzIG1heSByZXF1aXJlIGEKKyAqIGxpY2Vuc2UgZnJvbSB0aGUgb3duZXJzIG9mIHRoZSB1bmRlcmx5aW5nIGludGVsbGVjdHVhbCBwcm9wZXJ0eS4KKyAqIFNwZWNpZmljYWxseSwgdGhlIFNSUC0zIHByb3RvY29sIG1heSBub3QgYmUgdXNlZCBmb3IgcmV2ZW51ZS1nZW5lcmF0aW5nCisgKiBwdXJwb3NlcyB3aXRob3V0IGEgbGljZW5zZS4KKyAqCisgKiBOT1RFOiBDb2x1bWJpYSBVbml2ZXJzaXR5IGhhcyBhIGxpY2Vuc2UuCisgKgorICogV2l0aGluIHRoYXQgY29uc3RyYWludCwgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZAorICogd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24KKyAqIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTVEFORk9SRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLAorICogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSCisgKiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUCisgKiBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKK3N0YXRpYyB2b2lkCitzcnBfZW5jb2RlX2xlbmd0aChkYXRhLCBudW0pCisgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7CisgICAgaW50IG51bTsKK3sKKyAgICAqZGF0YSA9IChudW0gPj4gOCkgJiAweGZmOworICAgICorK2RhdGEgPSBudW0gJiAweGZmOworfQorCitzdGF0aWMgaW50CitzcnBfZGVjb2RlX2xlbmd0aChkYXRhKQorICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOworeworICAgIHJldHVybiAoKChpbnQpICpkYXRhICYgMHhmZikgPDwgOCkgfCAoKihkYXRhICsgMSkgJiAweGZmKTsKK30KKworI2lmZGVmIFBSRV9TUlBfMV83XzMKK3N0YXRpYyBpbnQKKyNpZmRlZiBDS19BTlNJQworc3JwX3JlcGx5KGludCBob3csIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBjbnQpCisjZWxzZQorc3JwX3JlcGx5KGhvdyxkYXRhLGNudCkgaW50IGhvdzsgdW5zaWduZWQgY2hhciAqZGF0YTsgaW50IGNudDsKKyNlbmRpZgoreworICAgIHN0cnVjdCB0X251bSBuOworICAgIHN0cnVjdCB0X251bSBnOworICAgIHN0cnVjdCB0X251bSBzOworICAgIHN0cnVjdCB0X251bSBCOworICAgIHN0cnVjdCB0X251bSAqIEE7CisgICAgY2hhciB0eXBlX2NoZWNrWzI2XTsKKyAgICBpbnQgcGZsYWc7CisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgU2Vzc2lvbl9LZXkgc2tleTsKKyNlbmRpZiAvKiBFTkNSWVBUSU9OICovCisKKyAgICBjaGFyICogc3RyPU5VTEw7CisKKyAgICBkYXRhICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBzdGF0dXMgYnl0ZSAqLworICAgIGNudCAgLT0gNDsKKworICAgIGlmKGNudC0tIDwgMSkgeworICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyAgICB9CisKKyAgICBzd2l0Y2goKmRhdGErKykgeworICAgIGNhc2UgU1JQX1JFSkVDVDoKKyAgICAgICAgY2ttYWttc2coc3RyVG1wLHNpemVvZihzdHJUbXApLAorICAgICAgICAgICAgICAgICAgIlNSUCByZWZ1c2VzIGF1dGhlbnRpY2F0aW9uIGZvciAnIixzelVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgIidcclxuIixOVUxMKTsKKyAgICAgICAgaWYgKGNudCA+IDApIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4oc3RyVG1wKTsKKyAgICAgICAgICAgIGlmICggbGVuICsgY250IDwgc2l6ZW9mKHN0clRtcCkgKSB7CisgICAgICAgICAgICAgICAgc3RyID0gc3RyVG1wICsgc3RybGVuKHN0clRtcCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHN0cixkYXRhLGNudCk7CisgICAgICAgICAgICAgICAgc3RyW2NudF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZigiU1JQIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCFcclxuJXNcclxuIixzdHJUbXApOworICAgICAgICBpZiAodGMgIT0gTlVMTCkgeworICAgICAgICAgICAgdF9jbGllbnRjbG9zZSh0Yyk7CisgICAgICAgICAgICB0YyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisKKyAgICBjYXNlIFNSUF9BQ0NFUFQ6CisgICAgICAgIGlmKGNudCA8IFJFU1BPTlNFX0xFTiB8fCAhc3JwX3dhaXRyZXNwIHx8CisgICAgICAgICAgICB0YyA9PSBOVUxMCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIHByaW50ZigiU1JQIFByb3RvY29sIGVycm9yXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKGF1dGhfcmVzZW5kKEFVVEhUWVBFX1NSUCkpOworICAgICAgICB9CisgICAgICAgIHNycF93YWl0cmVzcCA9IDA7CisKKyAgICAgICAgaWYodF9jbGllbnR2ZXJpZnkodGMsIGRhdGEpID09IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiU1JQIGFjY2VwdHMgeW91IGFzICVzXHJcbiIsc3pVc2VyTmFtZSk7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICBpZigoc3NsX2FjdGl2ZV9mbGFnIHx8IHRsc19hY3RpdmVfZmxhZykgJiYKKyAgICAgICAgICAgICAgICAoaG93ICYgQVVUSF9FTkNSWVBUX01BU0spID09IEFVVEhfRU5DUllQVF9TVEFSVF9UTFMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlRMUyBzZXNzaW9uIHBhcmFtZXRlcnMgdmVyaWZpZWQgYnkgU1JQXHJcbiIpOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogQ0tfU1NMICovCisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2tleS50eXBlID0gU0tfR0VORVJJQzsKKyAgICAgICAgICAgICAgICBza2V5Lmxlbmd0aCA9IFNFU1NJT05fS0VZX0xFTjsKKyAgICAgICAgICAgICAgICBza2V5LmRhdGEgPSB0Yy0+c2Vzc2lvbl9rZXk7CisgICAgICAgICAgICAgICAgZW5jcnlwdF9zZXNzaW9uX2tleSgmc2tleSwgQVVUSF9DTElFTlRfVE9fU0VSVkVSKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBFTkNSWVBUSU9OICovCisgICAgICAgICAgICB0X2NsaWVudGNsb3NlKHRjKTsKKyAgICAgICAgICAgIHRjID0gTlVMTDsKKyAgICAgICAgICAgIGFjY2VwdF9jb21wbGV0ZSA9IDE7CisgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfVkFMSUQpOworICAgICAgICAgICAgcmV0dXJuIEFVVEhfU1VDQ0VTUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiU1JQIHNlcnZlciBhdXRoZW50aWNhdGlvbiBmYWlsZWQhXHJcbiIpOworICAgICAgICAgICAgdF9jbGllbnRjbG9zZSh0Yyk7CisgICAgICAgICAgICB0YyA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4oYXV0aF9yZXNlbmQoQVVUSFRZUEVfU1JQKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNSUF9QQVJBTVM6CisgICAgICAgIGlmKCFzelVzZXJOYW1lKSB7CisgICAgICAgICAgICBwcmludGYoIk5vIHVzZXJuYW1lIGF2YWlsYWJsZVxyXG4iKTsKKyAgICAgICAgICAgIHJldHVybihhdXRoX3Jlc2VuZChBVVRIVFlQRV9TUlApKTsKKyAgICAgICAgfQorCisgICAgICAgIG4ubGVuID0gc3JwX2RlY29kZV9sZW5ndGgoZGF0YSk7CisgICAgICAgIGRhdGEgKz0gMjsKKyAgICAgICAgY250IC09IDI7CisgICAgICAgIGlmKG4ubGVuID4gY250KSB7CisgICAgICAgICAgICBwcmludGYoIm4gdG9vIGxvbmdcclxuIik7CisgICAgICAgICAgICByZXR1cm4oYXV0aF9yZXNlbmQoQVVUSFRZUEVfU1JQKSk7CisgICAgICAgIH0KKyAgICAgICAgbi5kYXRhID0gZGF0YTsKKyAgICAgICAgZGF0YSArPSBuLmxlbjsKKyAgICAgICAgY250IC09IG4ubGVuOworCisgICAgICAgIGcubGVuID0gc3JwX2RlY29kZV9sZW5ndGgoZGF0YSk7CisgICAgICAgIGRhdGEgKz0gMjsKKyAgICAgICAgY250IC09IDI7CisgICAgICAgIGlmKGcubGVuID4gY250KSB7CisgICAgICAgICAgICBwcmludGYoImcgdG9vIGxvbmdcclxuIik7CisgICAgICAgICAgICByZXR1cm4oYXV0aF9yZXNlbmQoQVVUSFRZUEVfU1JQKSk7CisgICAgICAgIH0KKyAgICAgICAgZy5kYXRhID0gZGF0YTsKKyAgICAgICAgZGF0YSArPSBnLmxlbjsKKyAgICAgICAgY250IC09IGcubGVuOworCisgICAgICAgIHMubGVuID0gc3JwX2RlY29kZV9sZW5ndGgoZGF0YSk7CisgICAgICAgIGRhdGEgKz0gMjsKKyAgICAgICAgY250IC09IDI7CisgICAgICAgIGlmKHMubGVuID4gY250KSB7CisgICAgICAgICAgICBwcmludGYoInNhbHQgdG9vIGxvbmdcclxuIik7CisgICAgICAgICAgICByZXR1cm4oYXV0aF9yZXNlbmQoQVVUSFRZUEVfU1JQKSk7CisgICAgICAgIH0KKyAgICAgICAgcy5kYXRhID0gZGF0YTsKKyAgICAgICAgZGF0YSArPSBzLmxlbjsKKyAgICAgICAgY250IC09IHMubGVuOworCisgICAgICAgIC8qIElmIHRoZSBwYXJhbWV0ZXJzIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2ZXIgY2Fubm90IGJlCisgICAgICAgICAqIHZhbGlkYXRlZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHdpbGwgZmFpbC4KKyAgICAgICAgICovCisgICAgICAgIHRjID0gdF9jbGllbnRvcGVuKHN6VXNlck5hbWUsICZuLCAmZywgJnMpOworICAgICAgICBpZiAodGMgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRmKCJTUlAgcGFyYW1ldGVyIGluaXRpYWxpemF0aW9uIGVycm9yXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKGF1dGhfcmVzZW5kKEFVVEhUWVBFX1NSUCkpOworICAgICAgICB9CisgICAgICAgIEEgPSB0X2NsaWVudGdlbmV4cCh0Yyk7CisgICAgICAgIGlmKEEgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRmKCJTUlAgcHJvdG9jb2wgZXJyb3JcclxuIik7CisgICAgICAgICAgICByZXR1cm4oYXV0aF9yZXNlbmQoQVVUSFRZUEVfU1JQKSk7CisgICAgICAgIH0KKyAgICAgICAgU2VuZFNSUEF1dGhTQihTUlBfRVhQLCBBLT5kYXRhLCBBLT5sZW4pOworCisgICAgICAgIGlmICggcHdidWZbMF0gJiYgcHdmbGcgKSB7CisgICAgICAgICAgICBwcmludGYoIlNSUCB1c2luZyAlZC1iaXQgbW9kdWx1cyBmb3IgJyVzJ1xyXG4iLAorICAgICAgICAgICAgICAgICAgIDggKiBuLmxlbiwKKyAgICAgICAgICAgICAgICAgICBzelVzZXJOYW1lCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNrc3RybmNweShzcnBfcGFzc3dkLHB3YnVmLHNpemVvZihzcnBfcGFzc3dkKSk7CisjaWZkZWYgT1MyCisgICAgICAgICAgICBpZiAoIHB3Y3J5cHQgKQorICAgICAgICAgICAgICAgIGNrX2VuY3J5cHQoKGNoYXIgKilzcnBfcGFzc3dkKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4dGVybiBjaGFyICogc3JwcHdwcm9tcHQ7CisgICAgICAgICAgICBjaGFyIHByZWZhY2VbMTI4XTsKKyAgICAgICAgICAgIGludCBvazsKKworICAgICAgICAgICAgaWYgKHNycHB3cHJvbXB0ICYmIHNycHB3cHJvbXB0WzBdICYmCisJCShzdHJsZW4oc3JwcHdwcm9tcHQpICsgc3RybGVuKHN6VXNlck5hbWUpIC0gMikgPAorCQlzaXplb2YocHJlZmFjZSkpIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHByZWZhY2Usc3JwcHdwcm9tcHQsc3pVc2VyTmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNrbWFreG1zZyggcHJlZmFjZSxzaXplb2YocHJlZmFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTUlAgdXNpbmcgIixja2l0b2EoOCpuLmxlbiksIi1iaXQgbW9kdWx1cyBmb3IgJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN6VXNlck5hbWUsICInIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvayA9IHVxX3R4dCggcHJlZmFjZSwiUGFzc3dvcmQ6ICIsMixOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNycF9wYXNzd2Qsc2l6ZW9mKHNycF9wYXNzd2QpLTEsTlVMTCwKKwkJCSBERUZBVUxUX1VRX1RJTUVPVVQpOworICAgICAgICAgICAgaWYgKCAhb2sgKQorICAgICAgICAgICAgICAgIHNycF9wYXNzd2RbMF0gPSAnXDAnOworICAgICAgICB9CisKKyAgICAgICAgdF9jbGllbnRwYXNzd2QodGMsIHNycF9wYXNzd2QpOworICAgICAgICBtZW1zZXQoc3JwX3Bhc3N3ZCwgMCwgc2l6ZW9mKHNycF9wYXNzd2QpKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfU1VDQ0VTUzsKKworICAgIGNhc2UgU1JQX0NIQUxMRU5HRToKKyAgICAgICAgaWYodGMgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRmKCJTUlAgcHJvdG9jb2wgZXJyb3JcclxuIik7CisgICAgICAgICAgICByZXR1cm4oYXV0aF9yZXNlbmQoQVVUSFRZUEVfU1JQKSk7CisgICAgICAgIH0KKworI2lmbmRlZiBQUkVfU1JQXzFfNF81CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBvcmlnaW5hbCBTUlAgQVVUSCBpbXBsZW1lbnRhdGlvbiBkaWQgbm90IHByb3RlY3QgYWdhaW5zdAorICAgICAgICAgKiB0YW1wZXJpbmcgb2YgdGhlIGF1dGgtdHlwZS1wYWlycy4gIFRoZXJlZm9yZSwgd2hlbiB0aGUKKyAgICAgICAgICogQVVUSF9FTkNSWVBUX01BU0sgYml0cyBhcmUgemVybywgbm8gZXh0cmEgZGF0YSBpcyBpbnNlcnRlZAorICAgICAgICAgKiBpbnRvIHRoZSBTUlAgaGFzaCBjb21wdXRhdGlvbi4gIFdoZW4gQVVUSF9FTkNSWVBUX1NUQVJUX1RMUworICAgICAgICAgKiBpcyBzZXQgd2UgYWxzbyBpbnNlcnQgdGhlIFNTTC9UTFMgY2xpZW50IGFuZCBzZXJ2ZXIgZmluaXNoZWQKKyAgICAgICAgICogbWVzc2FnZXMgdG8gZW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gbWFuIGluIHRoZSBtaWRkbGUgYXR0YWNrCisgICAgICAgICAqIHVuZGVyd2F5IG9uIHRoZSBTU0wvVExTIGNvbm5lY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBpZiAoKGhvdyAmIEFVVEhfRU5DUllQVF9NQVNLKSAhPSBBVVRIX0VOQ1JZUFRfT0ZGKSB7CisgICAgICAgICAgICB0eXBlX2NoZWNrWzBdID0gQVVUSFRZUEVfU1JQOworICAgICAgICAgICAgdHlwZV9jaGVja1sxXSA9IGhvdzsKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgIGlmICgoaG93ICYgQVVUSF9FTkNSWVBUX01BU0spID09IEFVVEhfRU5DUllQVF9TVEFSVF9UTFMpIHsKKyAgICAgICAgICAgICAgICBzc2xfZ2V0X2NsaWVudF9maW5pc2hlZCgmdHlwZV9jaGVja1syXSwxMik7CisgICAgICAgICAgICAgICAgc3NsX2dldF9zZXJ2ZXJfZmluaXNoZWQoJnR5cGVfY2hlY2tbMTRdLDEyKTsKKyAgICAgICAgICAgICAgICB0X2NsaWVudGFkZGV4ZGF0YSh0Yyx0eXBlX2NoZWNrLDI2KTsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICAgIHRfY2xpZW50YWRkZXhkYXRhKHRjLHR5cGVfY2hlY2ssMik7CisgICAgICAgIH0KKyNlbmRpZiAvKiBQUkVfU1JQXzFfNF81ICovCisKKyAgICAgICAgQi5kYXRhID0gZGF0YTsKKyAgICAgICAgQi5sZW4gPSBjbnQ7CisgICAgICAgIHRfY2xpZW50Z2V0a2V5KHRjLCAmQik7CisKKyAgICAgICAgU2VuZFNSUEF1dGhTQihTUlBfUkVTUE9OU0UsIHRfY2xpZW50cmVzcG9uc2UodGMpLCBSRVNQT05TRV9MRU4pOworICAgICAgICBzcnBfd2FpdHJlc3AgPSAxOworICAgICAgICByZXR1cm4gQVVUSF9TVUNDRVNTOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKGF1dGhfcmVzZW5kKEFVVEhUWVBFX1NSUCkpOworICAgIH0KKyAgICByZXR1cm4gQVVUSF9GQUlMVVJFOworfQorCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK3NycF9pcyhpbnQgaG93LCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgY250KQorI2Vsc2UKK3NycF9pcyhob3csZGF0YSxjbnQpIGludCBob3c7IHVuc2lnbmVkIGNoYXIgKmRhdGE7IGludCBjbnQ7CisjZW5kaWYKK3sKKyAgICBjaGFyICogcGJ1ZiA9IE5VTEw7CisgICAgY2hhciAqIHB0cjsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgU2Vzc2lvbl9LZXkgc2tleTsKKyNlbmRpZgorICAgIHN0cnVjdCB0X251bSBBOworICAgIHN0cnVjdCB0X3B3ICogdHB3ID0gTlVMTDsKKyAgICBzdHJ1Y3QgdF9jb25mICogdGNvbmYgPSBOVUxMOworICAgIHN0cnVjdCBwYXNzd2QgKiBwYXNzOworICAgIHN0YXRpYyBzdHJ1Y3QgdF9udW0gKiBCID0gTlVMTDsgICAgIC8qIEhvbGRlciBmb3IgQiAqLworI2lmZGVmIENLX1NTTAorICAgIGNoYXIgdHlwZV9jaGVja1syNl07CisjZWxzZQorICAgIGNoYXIgdHlwZV9jaGVja1syXTsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIGlmICgoY250IC09IDQpIDwgMSkgeworICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyAgICB9CisKKyAgICBkYXRhICs9IDQ7CisgICAgY250ICAtPSAxOworICAgIHN3aXRjaCgqZGF0YSsrKSB7CisgICAgY2FzZSBTUlBfQVVUSDoKKyAgICAgICAgLyogU2VuZCBwYXJhbWV0ZXJzIGJhY2sgdG8gY2xpZW50ICovCisgICAgICAgIGlmKHRzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRfc2VydmVyY2xvc2UodHMpOworICAgICAgICAgICAgdHMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmKCFzelVzZXJOYW1lUmVxdWVzdGVkWzBdKSB7CisgICAgICAgICAgICBpZiAoMSkKKyAgICAgICAgICAgICAgICBwcmludGYoIk5vIHVzZXJuYW1lIGF2YWlsYWJsZVxyXG4iKTsKKyAgICAgICAgICAgIFNlbmRTUlBBdXRoU0IoU1JQX1JFSkVDVCwgKHZvaWQgKikgIk5vIHVzZXJuYW1lIHN1cHBsaWVkIiwgLTEpOworICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICByZXR1cm4oQVVUSF9GQUlMVVJFKTsKKyAgICAgICAgfQorI2lmZGVmIElLU0QKKyNpZmRlZiBDS19MT0dJTgorICAgICAgICBpZiAoaW5zZXJ2ZXIgJiYgY2t4YW5vbiAmJgorICAgICAgICAgICAgICFzdHJjbXAoc3pVc2VyTmFtZVJlcXVlc3RlZCwiYW5vbnltb3VzIikpIHsKKyAgICAgICAgICAgIFNlbmRTUlBBdXRoU0IoU1JQX1JFSkVDVCwgKHZvaWQgKikKKyAgICAgICAgICAgICJhbm9ueW1vdXMgbG9naW4gY2Fubm90IGJlIHBlcmZvcm1lZCB3aXRoIFNlY3VyZSBSZW1vdGUgUGFzc3dvcmQiLAorICAgICAgICAgICAgLTEpOworICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICByZXR1cm4oQVVUSF9GQUlMVVJFKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX0xPR0lOICovCisjZW5kaWYgLyogSUtTRCAqLworI2lmbmRlZiBQUkVfU1JQXzFfNF80CisgICAgICAgIGlmKHRwdyA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZigodHB3ID0gdF9vcGVucHcoTlVMTCkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoMSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJVbmFibGUgdG8gb3BlbiBwYXNzd29yZCBmaWxlXHJcbiIpOworICAgICAgICAgICAgICAgIFNlbmRTUlBBdXRoU0IoU1JQX1JFSkVDVCwgKHZvaWQgKikgIk5vIHBhc3N3b3JkIGZpbGUiLCAtMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYodGNvbmYgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYoKHRjb25mID0gdF9vcGVuY29uZihOVUxMKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICgxKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCJVbmFibGUgdG8gb3BlbiBjb25maWd1cmF0aW9uIGZpbGVcclxuIik7CisgICAgICAgICAgICAgICAgU2VuZFNSUEF1dGhTQihTUlBfUkVKRUNULCAodm9pZCAqKSJObyBjb25maWd1cmF0aW9uIGZpbGUiLCAtMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHMgPSB0X3NlcnZlcm9wZW5mcm9tZmlsZXMoc3pVc2VyTmFtZVJlcXVlc3RlZCwgdHB3LCB0Y29uZik7CisgICAgICAgIHRfY2xvc2Vwdyh0cHcpOworICAgICAgICB0cHcgPSBOVUxMOworICAgICAgICB0X2Nsb3NlY29uZih0Y29uZik7CisgICAgICAgIHRjb25mID0gTlVMTDsKKyNlbHNlIC8qIFBSRV9TUlBfMV80XzQgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgIC8qIHRoZSBjb2RlIGluIHRoaXMgYmxvY2sgc2hvdWxkIG5vIGxvbmdlciBiZSBuZWNlc3Nhcnkgb24gT1MvMgorICAgICAgICAgICBvciBXaW5kb3dzIGJlY2F1c2UgSSBoYXZlIGFkZGVkIGZ1bmN0aW9uYWxpdHkgdG8gbGlic3JwLmxpYgorICAgICAgICAgICB0byBmaW5kIHRoZSBzcnAgZmlsZXMuICAgNC8yMi8yMDAwCisgICAgICAgICovCisKKyAgICAgICAgLyogT24gV2luZG93cyBhbmQgT1MvMiB0aGVyZSBpcyBubyB3ZWxsIGRlZmluZWQgcGxhY2UgZm9yIHRoZSAqLworICAgICAgICAvKiBFVEMgZGlyZWN0b3J5LiAgU28gd2UgbG9vayBmb3IgZWl0aGVyIGFuIFNSUF9FVEMgb3IgRVRDICAgICovCisgICAgICAgIC8qIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoYXQgb3JkZXIuICBJZiB3ZSBmaW5kIG9uZSB3ZSAgICAgKi8KKyAgICAgICAgLyogYXR0ZW1wdCB0byBvcGVuIHRoZSBmaWxlcyBtYW51YWxseS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBXZSB3aWxsIHJldXNlIHRoZSBzdHJUbXBbXSBmb3IgdGhlIGZpbGUgbmFtZXMuICovCisgICAgICAgIHB0ciA9IGdldGVudigiU1JQX0VUQyIpOworICAgICAgICBpZiAoICFwdHIgKQorICAgICAgICAgICAgcHRyID0gZ2V0ZW52KCJFVEMiKTsKKyNpZmRlZiBOVAorICAgICAgICBpZiAoICFwdHIgKSB7CisgICAgICAgICAgICBEV09SRCBsZW47CisgICAgICAgICAgICBsZW4gPSBBVVRIVE1QQkw7CisKKyAgICAgICAgICAgIGxlbiA9IEdldFdpbmRvd3NEaXJlY3Rvcnkoc3RyVG1wLGxlbik7CisgICAgICAgICAgICBpZiAoIGxlbiA+IDAgJiYgbGVuIDwgQVVUSFRNUEJMKSB7CisgICAgICAgICAgICAgICAgaWYgKCAhaXNXaW45NSgpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGxlbiA9PSAxICkKKwkJICAgICAgY2tzdHJuY2F0KHN0clRtcCwiU1lTVEVNMzIvRFJJVkVSUy9FVEMiLHNpemVvZihzdHJUbXApKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorCQkgICAgICBja3N0cm5jYXQoc3RyVG1wLCIvU1lTVEVNMzIvRFJJVkVSUy9FVEMiLHNpemVvZihzdHJUbXApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdHIgPSBzdHJUbXA7CisgICAgICAgIH0KKyNlbmRpZiAvKiBOVCAqLworICAgICAgICBpZiAoIHB0ciApIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4ocHRyKTsKKyAgICAgICAgICAgIGludCBpOworCSAgICBpZiAocHRyICE9IHN0clRtcCkKKwkJc3RyY3B5KHN0clRtcCxwdHIpOworICAgICAgICAgICAgZm9yICggaT0wO2k8bGVuO2krKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN0clRtcFtpXSA9PSAnXFwnICkKKyAgICAgICAgICAgICAgICAgICAgc3RyVG1wW2ldID0gJy8nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdHJUbXBbbGVuLTFdICE9ICcvJyApCisgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHN0clRtcCwiL3RwYXNzd2QiLHNpemVvZihzdHJUbXApKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBja3N0cm5jYXQoc3RyVG1wLCJ0cGFzc3dkIixzaXplb2Yoc3RyVG1wKSk7CisgICAgICAgICAgICB0cHcgPSB0X29wZW5wd2J5bmFtZShzdHJUbXApOworCisgICAgICAgICAgICBja3N0cm5jYXQoc3RyVG1wLCIuY29uZiIsc2l6ZW9mKHN0clRtcCkpOworICAgICAgICAgICAgdGNvbmYgPSB0X29wZW5jb25mYnluYW1lKHN0clRtcCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHRwdyAmJiB0Y29uZiApCisgICAgICAgICAgICB0cyA9IHRfc2VydmVyb3BlbmZyb21maWxlcyhzelVzZXJOYW1lUmVxdWVzdGVkLCB0cHcsIHRjb25mKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHMgPSB0X3NlcnZlcm9wZW4oc3pVc2VyTmFtZVJlcXVlc3RlZCk7CisgICAgICAgIGlmICggdHB3ICkgeworICAgICAgICAgICAgdF9jbG9zZXB3KHRwdyk7CisgICAgICAgICAgICB0cHcgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICggdGNvbmYgKSB7CisgICAgICAgICAgICB0X2Nsb3NlY29uZih0Y29uZik7CisgICAgICAgICAgICB0Y29uZiA9IE5VTEw7CisgICAgICAgIH0KKyNlbHNlIC8qIENPTU1FTlQgKi8KKyAgICAgICAgdHMgPSB0X3NlcnZlcm9wZW4oc3pVc2VyTmFtZVJlcXVlc3RlZCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIFBSRV9TUlBfMV80XzQgKi8KKworICAgICAgICBpZiggdHMgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIHByaW50ZigiVXNlciAlcyBub3QgZm91bmRcclxuIiwgc3pVc2VyTmFtZVJlcXVlc3RlZCk7CisgICAgICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9SRUpFQ1QsICh2b2lkICopICJQYXNzd29yZCBub3Qgc2V0IiwgLTEpOworICAgICAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgICAgIH0KKworCXBidWYgPSAoY2hhciAqKW1hbGxvYyh0cy0+bi5sZW4gKyB0cy0+Zy5sZW4gKyB0cy0+cy5sZW4gKyA3KTsKKwlwdHIgPSBwYnVmOworCisgICAgICAgIHNycF9lbmNvZGVfbGVuZ3RoKHB0ciwgdHMtPm4ubGVuKTsKKyAgICAgICAgcHRyICs9IDI7CisgICAgICAgIG1lbWNweShwdHIsIHRzLT5uLmRhdGEsIHRzLT5uLmxlbik7ICAgICAvKiBzYWZlICovCisgICAgICAgIHB0ciArPSB0cy0+bi5sZW47CisKKyAgICAgICAgc3JwX2VuY29kZV9sZW5ndGgocHRyLCB0cy0+Zy5sZW4pOworICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgbWVtY3B5KHB0ciwgdHMtPmcuZGF0YSwgdHMtPmcubGVuKTsgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgcHRyICs9IHRzLT5nLmxlbjsKKworICAgICAgICBzcnBfZW5jb2RlX2xlbmd0aChwdHIsIHRzLT5zLmxlbik7CisgICAgICAgIHB0ciArPSAyOworICAgICAgICBtZW1jcHkocHRyLCB0cy0+cy5kYXRhLCB0cy0+cy5sZW4pOyAgICAgLyogc2FmZSAqLworICAgICAgICBwdHIgKz0gdHMtPnMubGVuOworCisgICAgICAgIFNlbmRTUlBBdXRoU0IoU1JQX1BBUkFNUywgcGJ1ZiwgcHRyIC0gcGJ1Zik7CisJZnJlZShwYnVmKTsgcGJ1ZiA9IE5VTEw7CisKKyAgICAgICAgQiA9IHRfc2VydmVyZ2VuZXhwKHRzKTsKKyAgICAgICAgY2tzdHJuY3B5KHN6VXNlck5hbWVBdXRoZW50aWNhdGVkLHN6VXNlck5hbWVSZXF1ZXN0ZWQsVUlEQlVGTEVOKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfU1VDQ0VTUzsKKworICAgIGNhc2UgU1JQX0VYUDoKKyAgICAgICAgLyogQ2xpZW50IGlzIHNlbmRpbmcgQSB0byB1cywgY29tcHV0ZSBjaGFsbGVuZ2UgJiBleHBlY3RlZCByZXNwb25zZS4gKi8KKyAgICAgICAgaWYgKHRzID09IE5VTEwgfHwgQiA9PSBOVUxMKSB7CisgICAgICAgICAgICBwcmludGYoIlByb3RvY29sIGVycm9yOiBTUlBfRVhQIHVuZXhwZWN0ZWRcclxuIik7CisgICAgICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9SRUpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICJQcm90b2NvbCBlcnJvcjogdW5leHBlY3RlZCBFWFAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAtMQorICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBXYWl0IHVudGlsIG5vdyB0byBzZW5kIEIsIHNpbmNlIGl0IGNvbnRhaW5zIHRoZSBrZXkgdG8gInUiICovCisgICAgICAgIFNlbmRTUlBBdXRoU0IoU1JQX0NIQUxMRU5HRSwgQi0+ZGF0YSwgQi0+bGVuKTsKKyAgICAgICAgQiA9IE5VTEw7CisKKyNpZm5kZWYgUFJFX1NSUF8xXzRfNQorICAgICAgICAvKgorICAgICAgICAgKiBUaGUgb3JpZ2luYWwgU1JQIEFVVEggaW1wbGVtZW50YXRpb24gZGlkIG5vdCBwcm90ZWN0IGFnYWluc3QKKyAgICAgICAgICogdGFtcGVyaW5nIG9mIHRoZSBhdXRoLXR5cGUtcGFpcnMuICBUaGVyZWZvcmUsIHdoZW4gdGhlCisgICAgICAgICAqIEFVVEhfRU5DUllQVF9NQVNLIGJpdHMgYXJlIHplcm8sIG5vIGV4dHJhIGRhdGEgaXMgaW5zZXJ0ZWQKKyAgICAgICAgICogaW50byB0aGUgU1JQIGhhc2ggY29tcHV0YXRpb24uICBXaGVuIEFVVEhfRU5DUllQVF9TVEFSVF9UTFMKKyAgICAgICAgICogaXMgc2V0IHdlIGFsc28gaW5zZXJ0IHRoZSBTU0wvVExTIGNsaWVudCBhbmQgc2VydmVyIGZpbmlzaGVkCisgICAgICAgICAqIG1lc3NhZ2VzIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIG1hbiBpbiB0aGUgbWlkZGxlIGF0dGFjaworICAgICAgICAgKiB1bmRlcndheSBvbiB0aGUgU1NML1RMUyBjb25uZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCAoaG93ICYgQVVUSF9FTkNSWVBUX01BU0spICE9IEFVVEhfRU5DUllQVF9PRkYgKSB7CisgICAgICAgICAgICB0eXBlX2NoZWNrWzBdID0gQVVUSFRZUEVfU1JQOworICAgICAgICAgICAgdHlwZV9jaGVja1sxXSA9IGhvdzsKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgIGlmICgoaG93ICYgQVVUSF9FTkNSWVBUX01BU0spID09IEFVVEhfRU5DUllQVF9TVEFSVF9UTFMpIHsKKyAgICAgICAgICAgICAgICBzc2xfZ2V0X2NsaWVudF9maW5pc2hlZCgmdHlwZV9jaGVja1syXSwxMik7CisgICAgICAgICAgICAgICAgc3NsX2dldF9zZXJ2ZXJfZmluaXNoZWQoJnR5cGVfY2hlY2tbMTRdLDEyKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgIHRfc2VydmVyYWRkZXhkYXRhKHRzLHR5cGVfY2hlY2ssCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICAgICAgICAoKGhvdyAmIEFVVEhfRU5DUllQVF9NQVNLKSA9PSBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTKSA/IDI2IDoKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFBSRV9TUlBfMV80XzUgKi8KKworICAgICAgICBBLmRhdGEgPSBkYXRhOworICAgICAgICBBLmxlbiA9IGNudDsKKyAgICAgICAgcHRyID0gdF9zZXJ2ZXJnZXRrZXkodHMsICZBKTsKKworICAgICAgICBpZihwdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKDEpCisgICAgICAgICAgICAgIHByaW50ZigiU2VjdXJpdHkgYWxlcnQ6IFRyaXZpYWwgc2Vzc2lvbiBrZXkgYXR0ZW1wdGVkXHJcbiIpOworICAgICAgICAgICAgU2VuZFNSUEF1dGhTQihTUlBfUkVKRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAiVHJpdmlhbCBzZXNzaW9uIGtleSBkZXRlY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICByZXR1cm4oQVVUSF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBzcnBfd2FpdHJlc3AgPSAxOworICAgICAgICByZXR1cm4gQVVUSF9TVUNDRVNTOworCisgICAgY2FzZSBTUlBfUkVTUE9OU0U6CisgICAgICAgIC8qIEdvdCB0aGUgcmVzcG9uc2U7IHNlZSBpZiBpdCdzIGNvcnJlY3QgKi8KKyAgICAgICAgaWYgKCFzcnBfd2FpdHJlc3AgfHwKKyAgICAgICAgICAgICB0cyA9PSBOVUxMCisgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBpZiAoMSkKKyAgICAgICAgICAgICAgcHJpbnRmKCJQcm90b2NvbCBlcnJvcjogU1JQX1JFU1BPTlNFIHVuZXhwZWN0ZWRcclxuIik7CisgICAgICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9SRUpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICJQcm90b2NvbCBlcnJvcjogdW5leHBlY3RlZCBSRVNQT05TRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICByZXR1cm4oQVVUSF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBzcnBfd2FpdHJlc3AgPSAwOyAgICAgICAvKiB3ZSBnb3QgYSByZXNwb25zZSAqLworCisgICAgICAgIGlmIChjbnQgPCBSRVNQT05TRV9MRU4pIHsKKyAgICAgICAgICAgIGlmICgxKQorICAgICAgICAgICAgICBwcmludGYoIlByb3RvY29sIGVycm9yOiBtYWxmb3JtZWQgcmVzcG9uc2VcclxuIik7CisgICAgICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9SRUpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICJQcm90b2NvbCBlcnJvcjogbWFsZm9ybWVkIHJlc3BvbnNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHJldHVybihBVVRIX0ZBSUxVUkUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRfc2VydmVydmVyaWZ5KHRzLCBkYXRhKSA9PSAwKSB7CisgICAgICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9BQ0NFUFQsIHRfc2VydmVycmVzcG9uc2UodHMpLCBSRVNQT05TRV9MRU4pOworICAgICAgICAgICAgYWNjZXB0X2NvbXBsZXRlID0gMTsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICBpZiAoIShzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnKSkKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKCJTUlBfUkVTUE9OU0UgdHMiLHRzLHNpemVvZih0cykpOworICAgICAgICAgICAgICAgIGhleGR1bXAoIlNSUF9SRVNQT05TRSBzZXNzaW9uX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHMtPnNlc3Npb25fa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIFNFU1NJT05fS0VZX0xFTgorICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgc2tleS50eXBlID0gU0tfR0VORVJJQzsKKyAgICAgICAgICAgICAgICBza2V5Lmxlbmd0aCA9IFNFU1NJT05fS0VZX0xFTjsKKyAgICAgICAgICAgICAgICBza2V5LmRhdGEgPSB0cy0+c2Vzc2lvbl9rZXk7CisgICAgICAgICAgICAgICAgZW5jcnlwdF9zZXNzaW9uX2tleSgmc2tleSwgQVVUSF9TRVJWRVJfVE9fQ0xJRU5UKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfVkFMSUQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgU2VuZFNSUEF1dGhTQihTUlBfUkVKRUNULCAodm9pZCAqKSAiTG9naW4gaW5jb3JyZWN0IiwgLTEpOworICAgICAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgICAgICByZXR1cm4oQVVUSF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVVUSF9TVUNDRVNTOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJVbmtub3duIFNSUCBvcHRpb24gJWRcclxuIiwgZGF0YVstMV0pOworICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9SRUpFQ1QsICh2b2lkICopICJVbmtub3duIG9wdGlvbiByZWNlaXZlZCIsIC0xKTsKKyAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgfQorfQorI2Vsc2UgLyogUFJFX1NSUF8xXzdfMyAqLworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCituZXdfc3JwX3JlcGx5KGludCBob3csIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBjbnQpCisjZWxzZQorbmV3X3NycF9yZXBseShob3csZGF0YSxjbnQpIGludCBob3c7IHVuc2lnbmVkIGNoYXIgKmRhdGE7IGludCBjbnQ7CisjZW5kaWYKK3sKKyAgICBkYXRhICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBzdGF0dXMgYnl0ZSAqLworICAgIGNudCAgLT0gNDsKKworICAgIGlmKGNudC0tIDwgMSkgeyAgICAgICAgICAgICAgICAgICAgIC8qIE1hdGNoZXMgd2l0aCBkYXRhKysgKi8KKyAgICAgICAgYXV0aF9maW5pc2hlZChBVVRIX1JFSkVDVCk7CisgICAgICAgIHJldHVybiBBVVRIX0ZBSUxVUkU7CisgICAgfQorCisgICAgc3dpdGNoKCpkYXRhKyspIHsKKyAgICBjYXNlIFNSUF9QQVJBTVM6IHsKKyAgICAgICAgc3RydWN0IHRfbnVtIG47CisgICAgICAgIHN0cnVjdCB0X251bSBnOworICAgICAgICBzdHJ1Y3QgdF9udW0gczsKKyAgICAgICAgY3N0ciAqIEE7CisKKyAgICAgICAgaWYoIXN6VXNlck5hbWUpIHsKKyAgICAgICAgICAgIHByaW50ZigiTm8gdXNlcm5hbWUgYXZhaWxhYmxlXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKGF1dGhfcmVzZW5kKEFVVEhUWVBFX1NSUCkpOworICAgICAgICB9CisKKyAgICAgICAgbi5sZW4gPSBzcnBfZGVjb2RlX2xlbmd0aChkYXRhKTsKKyAgICAgICAgZGF0YSArPSAyOworICAgICAgICBjbnQgLT0gMjsKKyAgICAgICAgaWYobi5sZW4gPiBjbnQpIHsKKyAgICAgICAgICAgIHByaW50ZigibiB0b28gbG9uZ1xyXG4iKTsKKyAgICAgICAgICAgIHJldHVybihhdXRoX3Jlc2VuZChBVVRIVFlQRV9TUlApKTsKKyAgICAgICAgfQorICAgICAgICBuLmRhdGEgPSBkYXRhOworICAgICAgICBkYXRhICs9IG4ubGVuOworICAgICAgICBjbnQgLT0gbi5sZW47CisKKyAgICAgICAgZy5sZW4gPSBzcnBfZGVjb2RlX2xlbmd0aChkYXRhKTsKKyAgICAgICAgZGF0YSArPSAyOworICAgICAgICBjbnQgLT0gMjsKKyAgICAgICAgaWYoZy5sZW4gPiBjbnQpIHsKKyAgICAgICAgICAgIHByaW50ZigiZyB0b28gbG9uZ1xyXG4iKTsKKyAgICAgICAgICAgIHJldHVybihhdXRoX3Jlc2VuZChBVVRIVFlQRV9TUlApKTsKKyAgICAgICAgfQorICAgICAgICBnLmRhdGEgPSBkYXRhOworICAgICAgICBkYXRhICs9IGcubGVuOworICAgICAgICBjbnQgLT0gZy5sZW47CisKKyAgICAgICAgcy5sZW4gPSBzcnBfZGVjb2RlX2xlbmd0aChkYXRhKTsKKyAgICAgICAgZGF0YSArPSAyOworICAgICAgICBjbnQgLT0gMjsKKyAgICAgICAgaWYocy5sZW4gIT0gY250KSB7CisgICAgICAgICAgICBwcmludGYoImludmFsaWQgc2FsdFxyXG4iKTsKKyAgICAgICAgICAgIHJldHVybihhdXRoX3Jlc2VuZChBVVRIVFlQRV9TUlApKTsKKyAgICAgICAgfQorICAgICAgICBzLmRhdGEgPSBkYXRhOworICAgICAgICBkYXRhICs9IHMubGVuOworICAgICAgICBjbnQgLT0gcy5sZW47CisKKyAgICAgICAgLyogSWYgdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgdGhlIHNlcnZlciBjYW5ub3QgYmUKKyAgICAgICAgICogdmFsaWRhdGVkIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gd2lsbCBmYWlsLgorICAgICAgICAgKi8KKyAgICAgICAgY19zcnAgPSBTUlBfbmV3KFNSUF9SRkMyOTQ1X2NsaWVudF9tZXRob2QoKSk7CisgICAgICAgIGlmIChjX3NycCA9PSBOVUxMIHx8CisJICAgIFNSUF9zZXRfdXNlcm5hbWUoY19zcnAsIHN6VXNlck5hbWUpICE9IFNSUF9TVUNDRVNTIHx8CisJICAgIFNSUF9zZXRfcGFyYW1zKGNfc3JwLG4uZGF0YSxuLmxlbixnLmRhdGEsZy5sZW4scy5kYXRhLHMubGVuKSAhPQorCSAgICBTUlBfU1VDQ0VTUykgeworICAgICAgICAgICAgcHJpbnRmKCJTUlAgUGFyYW1ldGVyIGluaXRpYWxpemF0aW9uIGVycm9yXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKGF1dGhfcmVzZW5kKEFVVEhUWVBFX1NSUCkpOworICAgICAgICB9CisKKyAgICAgICAgQSA9IGNzdHJfbmV3KCk7CisgICAgICAgIGlmKFNSUF9nZW5fcHViKGNfc3JwLCAmQSkgIT0gU1JQX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHByaW50ZigiU1JQIEVycm9yIGdlbmVyYXRpbmcga2V5IGV4Y2hhbmdlXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKGF1dGhfcmVzZW5kKEFVVEhUWVBFX1NSUCkpOworICAgICAgICB9CisKKyAgICAgICAgU2VuZFNSUEF1dGhTQihTUlBfRVhQLCBBLT5kYXRhLCBBLT5sZW5ndGgpOworICAgICAgICBjc3RyX2ZyZWUoQSk7CisKKyAgICAgICAgaWYgKCBwd2J1ZlswXSAmJiBwd2ZsZyApIHsKKyAgICAgICAgICAgIHByaW50ZigiU1JQIHVzaW5nICVkLWJpdCBtb2R1bHVzIGZvciAnJXMnXHJcbiIsCisgICAgICAgICAgICAgICAgICAgOCAqIG4ubGVuLAorICAgICAgICAgICAgICAgICAgIHN6VXNlck5hbWUKKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2tzdHJuY3B5KHNycF9wYXNzd2QscHdidWYsc2l6ZW9mKHNycF9wYXNzd2QpKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGlmICggcHdjcnlwdCApCisgICAgICAgICAgICAgICAgY2tfZW5jcnlwdCgoY2hhciAqKXNycF9wYXNzd2QpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBzcnBwd3Byb21wdDsKKyAgICAgICAgICAgIGNoYXIgcHJlZmFjZVsxMjhdOworICAgICAgICAgICAgaW50IG9rOworCisgICAgICAgICAgICBpZiAoc3JwcHdwcm9tcHQgJiYgc3JwcHdwcm9tcHRbMF0gJiYKKwkJKHN0cmxlbihzcnBwd3Byb21wdCkgKyBzdHJsZW4oc3pVc2VyTmFtZSkgLSAyKSA8CisJCXNpemVvZihwcmVmYWNlKSkgeworICAgICAgICAgICAgICAgIHNwcmludGYocHJlZmFjZSxzcnBwd3Byb21wdCxzelVzZXJOYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2ttYWt4bXNnKCBwcmVmYWNlLHNpemVvZihwcmVmYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNSUCB1c2luZyAiLGNraXRvYSg4Km4ubGVuKSwiLWJpdCBtb2R1bHVzIGZvciAnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3pVc2VyTmFtZSwgIiciLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9rID0gdXFfdHh0KHByZWZhY2UsIlBhc3N3b3JkOiAiLDIsTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNycF9wYXNzd2Qsc2l6ZW9mKHNycF9wYXNzd2QpLTEsTlVMTCwKKwkJCURFRkFVTFRfVVFfVElNRU9VVCk7CisgICAgICAgICAgICBpZiAoICFvayApCisgICAgICAgICAgICAgICAgc3JwX3Bhc3N3ZFswXSA9ICdcMCc7CisgICAgICAgIH0KKworICAgICAgICBpZihTUlBfc2V0X2F1dGhfcGFzc3dvcmQoY19zcnAsIHNycF9wYXNzd2QpICE9IFNSUF9TVUNDRVNTKSB7CisgICAgICAgICAgICBtZW1zZXQoc3JwX3Bhc3N3ZCwgMCwgc2l6ZW9mKHNycF9wYXNzd2QpKTsKKyAgICAgICAgICAgIHByaW50ZigiU1JQIEVycm9yIHNldHRpbmcgY2xpZW50IHBhc3N3b3JkXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKGF1dGhfcmVzZW5kKEFVVEhUWVBFX1NSUCkpOworICAgICAgICB9CisgICAgICAgIG1lbXNldChzcnBfcGFzc3dkLCAwLCBzaXplb2Yoc3JwX3Bhc3N3ZCkpOworICAgICAgICByZXR1cm4gQVVUSF9TVUNDRVNTOworICAgIH0KKyAgICBjYXNlIFNSUF9DSEFMTEVOR0U6IHsKKyAgICAgICAgY2hhciB0eXBlX2NoZWNrWzI2XTsKKyAgICAgICAgY3N0ciAqIHJlc3AgPSBOVUxMOworCisgICAgICAgIGlmKGNfc3JwID09IE5VTEwpIHsKKyAgICAgICAgICAgIHByaW50ZigiU1JQIHByb3RvY29sIGVycm9yXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKGF1dGhfcmVzZW5kKEFVVEhUWVBFX1NSUCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIG9yaWdpbmFsIFNSUCBBVVRIIGltcGxlbWVudGF0aW9uIGRpZCBub3QgcHJvdGVjdCBhZ2FpbnN0CisgICAgICAgICAqIHRhbXBlcmluZyBvZiB0aGUgYXV0aC10eXBlLXBhaXJzLiAgVGhlcmVmb3JlLCB3aGVuIHRoZQorICAgICAgICAgKiBBVVRIX0VOQ1JZUFRfTUFTSyBiaXRzIGFyZSB6ZXJvLCBubyBleHRyYSBkYXRhIGlzIGluc2VydGVkCisgICAgICAgICAqIGludG8gdGhlIFNSUCBoYXNoIGNvbXB1dGF0aW9uLiAgV2hlbiBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTCisgICAgICAgICAqIGlzIHNldCB3ZSBhbHNvIGluc2VydCB0aGUgU1NML1RMUyBjbGllbnQgYW5kIHNlcnZlciBmaW5pc2hlZAorICAgICAgICAgKiBtZXNzYWdlcyB0byBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBtYW4gaW4gdGhlIG1pZGRsZSBhdHRhY2sKKyAgICAgICAgICogdW5kZXJ3YXkgb24gdGhlIFNTTC9UTFMgY29ubmVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGlmICgoaG93ICYgQVVUSF9FTkNSWVBUX01BU0spICE9IEFVVEhfRU5DUllQVF9PRkYpIHsKKyAgICAgICAgICAgIHR5cGVfY2hlY2tbMF0gPSBBVVRIVFlQRV9TUlA7CisgICAgICAgICAgICB0eXBlX2NoZWNrWzFdID0gaG93OworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgaWYgKChob3cgJiBBVVRIX0VOQ1JZUFRfTUFTSykgPT0gQVVUSF9FTkNSWVBUX1NUQVJUX1RMUykgeworICAgICAgICAgICAgICAgIHNzbF9nZXRfY2xpZW50X2ZpbmlzaGVkKCZ0eXBlX2NoZWNrWzJdLDEyKTsKKyAgICAgICAgICAgICAgICBzc2xfZ2V0X3NlcnZlcl9maW5pc2hlZCgmdHlwZV9jaGVja1sxNF0sMTIpOworICAgICAgICAgICAgICAgIFNSUF9hZGRfZXhfZGF0YShjX3NycCwgdHlwZV9jaGVjaywgMjYpOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgICAgU1JQX2FkZF9leF9kYXRhKGNfc3JwLCB0eXBlX2NoZWNrLCAyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKFNSUF9jb21wdXRlX2tleShjX3NycCwgJmNfa2V5LCBkYXRhLCBjbnQpICE9IFNSUF9TVUNDRVNTKSB7CisgICAgICAgICAgICBwcmludGYoIlNSUCBFUlJPUjogdW5hYmxlIHRvIGNvbXB1dGUgY2xpZW50IGtleVxyXG4iKTsKKyAgICAgICAgICAgIHJldHVybihhdXRoX3Jlc2VuZChBVVRIVFlQRV9TUlApKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3AgPSBjc3RyX25ldygpOworICAgICAgICBpZihTUlBfcmVzcG9uZChjX3NycCwgJnJlc3ApICE9IFNSUF9TVUNDRVNTKSB7CisgICAgICAgICAgICBwcmludGYoIlNSUCBFUlJPUjogdW5hYmxlIHRvIGNvbXB1dGUgY2xpZW50IHJlc3BvbnNlXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKGF1dGhfcmVzZW5kKEFVVEhUWVBFX1NSUCkpOworICAgICAgICB9CisgICAgICAgIFNlbmRTUlBBdXRoU0IoU1JQX1JFU1BPTlNFLCByZXNwLT5kYXRhLCByZXNwLT5sZW5ndGgpOworICAgICAgICBjc3RyX2ZyZWUocmVzcCk7CisgICAgICAgIHNycF93YWl0cmVzcCA9IDE7CisgICAgICAgIHJldHVybiBBVVRIX1NVQ0NFU1M7CisgICAgfQorICAgIGNhc2UgU1JQX0FDQ0VQVDogeworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgU2Vzc2lvbl9LZXkgc2tleTsKKyNlbmRpZiAvKiBFTkNSWVBUSU9OICovCisKKyAgICAgICAgaWYoY250IDwgUkVTUE9OU0VfTEVOIHx8ICFzcnBfd2FpdHJlc3AgfHwgY19zcnAgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRmKCJTUlAgUHJvdG9jb2wgZXJyb3JcclxuIik7CisgICAgICAgICAgICByZXR1cm4oYXV0aF9yZXNlbmQoQVVUSFRZUEVfU1JQKSk7CisgICAgICAgIH0KKyAgICAgICAgc3JwX3dhaXRyZXNwID0gMDsKKworICAgICAgICBpZihTUlBfdmVyaWZ5KGNfc3JwLCBkYXRhLCBjbnQpID09IFNSUF9TVUNDRVNTKSB7CisgICAgICAgICAgICBwcmludGYoIlNSUCBhY2NlcHRzIHlvdSBhcyAlc1xyXG4iLHN6VXNlck5hbWUpOworCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICBpZigoc3NsX2FjdGl2ZV9mbGFnIHx8IHRsc19hY3RpdmVfZmxhZykgJiYKKyAgICAgICAgICAgICAgICAoaG93ICYgQVVUSF9FTkNSWVBUX01BU0spID09IEFVVEhfRU5DUllQVF9TVEFSVF9UTFMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlRMUyBzZXNzaW9uIHBhcmFtZXRlcnMgdmVyaWZpZWQgYnkgU1JQXHJcbiIpOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNrZXkudHlwZSA9IFNLX0dFTkVSSUM7CisgICAgICAgICAgICAgICAgc2tleS5sZW5ndGggPSBjX2tleS0+bGVuZ3RoOworICAgICAgICAgICAgICAgIHNrZXkuZGF0YSA9IGNfa2V5LT5kYXRhOworICAgICAgICAgICAgICAgIGVuY3J5cHRfc2Vzc2lvbl9rZXkoJnNrZXksIEFVVEhfQ0xJRU5UX1RPX1NFUlZFUik7CisgICAgICAgICAgICAgICAgY3N0cl9jbGVhcl9mcmVlKGNfa2V5KTsKKyAgICAgICAgICAgICAgICBjX2tleSA9IE5VTEw7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICAgICAgYWNjZXB0X2NvbXBsZXRlID0gMTsKKyAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9WQUxJRCk7CisgICAgICAgICAgICBTUlBfZnJlZShjX3NycCk7CisgICAgICAgICAgICBjX3NycCA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gQVVUSF9TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJbIEVycm9yOiBTUlAgc2VydmVyIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBdXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKGF1dGhfcmVzZW5kKEFVVEhUWVBFX1NSUCkpOworICAgICAgICB9CisgICAgfQorICAgIGNhc2UgU1JQX1JFSkVDVDogeworICAgICAgICBjaGFyICogc3RyPU5VTEw7CisKKyAgICAgICAgY2ttYWttc2coc3RyVG1wLHNpemVvZihzdHJUbXApLAorICAgICAgICAgICAgICAgICAgIlNSUCByZWZ1c2VzIGF1dGhlbnRpY2F0aW9uIGZvciAnIixzelVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgIidcclxuIixOVUxMKTsKKyAgICAgICAgaWYgKGNudCA+IDApIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4oc3RyVG1wKTsKKyAgICAgICAgICAgIGlmICggbGVuICsgY250IDwgc2l6ZW9mKHN0clRtcCkgKSB7CisgICAgICAgICAgICAgICAgc3RyID0gc3RyVG1wICsgc3RybGVuKHN0clRtcCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHN0cixkYXRhLGNudCk7CisgICAgICAgICAgICAgICAgc3RyW2NudF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZigiU1JQIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCFcclxuJXNcclxuIixzdHJUbXApOworICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJVbmtub3duIFNSUCBvcHRpb24gJWRcclxuIiwgZGF0YVstMV0pOworICAgICAgICByZXR1cm4oYXV0aF9yZXNlbmQoQVVUSFRZUEVfU1JQKSk7CisgICAgfQorICAgIC8qIE5FVkVSIFJFQUNIRUQgKi8KK30KKworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCituZXdfc3JwX2lzKGludCBob3csIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBjbnQpCisjZWxzZQorbmV3X3NycF9pcyhob3csZGF0YSxjbnQpIGludCBob3c7IHVuc2lnbmVkIGNoYXIgKmRhdGE7IGludCBjbnQ7CisjZW5kaWYKK3sKKyAgICBjaGFyICogcGJ1ZiA9IE5VTEw7CisgICAgY2hhciAqIHB0cjsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgU2Vzc2lvbl9LZXkgc2tleTsKKyNlbmRpZgorICAgIHN0YXRpYyBjc3RyICogQiA9IE5VTEw7ICAgICAgICAgICAgIC8qIEhvbGRlciBmb3IgQiAqLworICAgIHN0cnVjdCB0X3Bhc3N3ZCAqIHBhc3M7CisgICAgY3N0ciAqIHJlc3A7CisgICAgY2hhciB0eXBlX2NoZWNrWzI2XTsKKworICAgIGlmICgoY250IC09IDQpIDwgMSkgeworICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfRkFJTFVSRTsKKyAgICB9CisKKyAgICBkYXRhICs9IDQ7CisgICAgY250ICAtPSAxOworICAgIHN3aXRjaCgqZGF0YSsrKSB7CisgICAgY2FzZSBTUlBfQVVUSDoKKyAgICAgICAgLyogU2VuZCBwYXJhbWV0ZXJzIGJhY2sgdG8gY2xpZW50ICovCisgICAgICAgIGlmKHNfc3JwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFNSUF9mcmVlKHNfc3JwKTsKKyAgICAgICAgICAgIHNfc3JwID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQiAhPSBOVUxMKSB7CisgICAgICAgICAgICBjc3RyX2ZyZWUoQik7CisgICAgICAgICAgICBCID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZighc3pVc2VyTmFtZVJlcXVlc3RlZFswXSkgeworICAgICAgICAgICAgaWYgKDEpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJObyB1c2VybmFtZSBhdmFpbGFibGVcclxuIik7CisgICAgICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9SRUpFQ1QsICh2b2lkICopICJObyB1c2VybmFtZSBzdXBwbGllZCIsIC0xKTsKKyAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgICAgIH0KKyNpZmRlZiBJS1NECisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgICAgaWYgKGluc2VydmVyICYmIGNreGFub24gJiYKKyAgICAgICAgICAgICAhc3RyY21wKHN6VXNlck5hbWVSZXF1ZXN0ZWQsImFub255bW91cyIpKSB7CisgICAgICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9SRUpFQ1QsICh2b2lkICopCisgICAgICAgICAgICAiYW5vbnltb3VzIGxvZ2luIGNhbm5vdCBiZSBwZXJmb3JtZWQgd2l0aCBTZWN1cmUgUmVtb3RlIFBhc3N3b3JkIiwKKyAgICAgICAgICAgIC0xKTsKKyAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9SRUpFQ1QpOworICAgICAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgc19zcnAgPSBTUlBfbmV3KFNSUF9SRkMyOTQ1X3NlcnZlcl9tZXRob2QoKSk7CisgICAgICAgIGlmKHNfc3JwID09IE5VTEwpIHsKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3IgaW5pdGlhbGl6aW5nIFNSUCBzZXJ2ZXJcclxuIik7CisgICAgICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9SRUpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICJTUlAgc2VydmVyIGluaXQgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHJldHVybihBVVRIX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIHBhc3MgPSBnZXR0cG5hbShzelVzZXJOYW1lUmVxdWVzdGVkKTsKKyAgICAgICAgaWYocGFzcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBwcmludGYoIlVzZXIgJXMgbm90IGZvdW5kXHJcbiIsIHN6VXNlck5hbWVSZXF1ZXN0ZWQpOworICAgICAgICAgICAgU2VuZFNSUEF1dGhTQihTUlBfUkVKRUNULCAodm9pZCAqKSAiUGFzc3dvcmQgbm90IHNldCIsIC0xKTsKKyAgICAgICAgICAgIHJldHVybihBVVRIX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIGlmKFNSUF9zZXRfdXNlcm5hbWUoc19zcnAsIHN6VXNlck5hbWVSZXF1ZXN0ZWQpICE9IFNSUF9TVUNDRVNTIHx8CisJICAgU1JQX3NldF9wYXJhbXMoc19zcnAsIHBhc3MtPnRjLm1vZHVsdXMuZGF0YSwKKwkJCSAgcGFzcy0+dGMubW9kdWx1cy5sZW4sCisJCQkgIHBhc3MtPnRjLmdlbmVyYXRvci5kYXRhLAorCQkJICBwYXNzLT50Yy5nZW5lcmF0b3IubGVuLAorCQkJICBwYXNzLT50cC5zYWx0LmRhdGEsCisJCQkgIHBhc3MtPnRwLnNhbHQubGVuKSAhPSBTUlBfU1VDQ0VTUyB8fAorCSAgIFNSUF9zZXRfYXV0aGVudGljYXRvcihzX3NycCwKKwkJCQkgcGFzcy0+dHAucGFzc3dvcmQuZGF0YSwKKwkJCQkgcGFzcy0+dHAucGFzc3dvcmQubGVuKSAhPSBTUlBfU1VDQ0VTUykgeworICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBpbml0aWFsaXppbmcgU1JQIHBhcmFtZXRlcnNcclxuIik7CisgICAgICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9SRUpFQ1QsKHZvaWQgKikiU1JQIHBhcmFtZXRlciBpbml0IGZhaWxlZCIsIC0xKTsKKyAgICAgICAgICAgIHJldHVybihBVVRIX0ZBSUxVUkUpOworICAgICAgICB9CisKKwlwYnVmID0gKGNoYXIgKiltYWxsb2MocGFzcy0+dGMubW9kdWx1cy5sZW4gKyBwYXNzLT50Yy5nZW5lcmF0b3IubGVuICsKKwkJCSAgICAgICBwYXNzLT50cC5zYWx0LmxlbiArIDcpOworICAgICAgICBwdHIgPSBwYnVmOworCisgICAgICAgIHNycF9lbmNvZGVfbGVuZ3RoKHB0ciwgcGFzcy0+dGMubW9kdWx1cy5sZW4pOworICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgbWVtY3B5KHB0ciwgcGFzcy0+dGMubW9kdWx1cy5kYXRhLCBwYXNzLT50Yy5tb2R1bHVzLmxlbik7CisgICAgICAgIHB0ciArPSBwYXNzLT50Yy5tb2R1bHVzLmxlbjsKKworICAgICAgICBzcnBfZW5jb2RlX2xlbmd0aChwdHIsIHBhc3MtPnRjLmdlbmVyYXRvci5sZW4pOworICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgbWVtY3B5KHB0ciwgcGFzcy0+dGMuZ2VuZXJhdG9yLmRhdGEsIHBhc3MtPnRjLmdlbmVyYXRvci5sZW4pOworICAgICAgICBwdHIgKz0gcGFzcy0+dGMuZ2VuZXJhdG9yLmxlbjsKKworICAgICAgICBzcnBfZW5jb2RlX2xlbmd0aChwdHIsIHBhc3MtPnRwLnNhbHQubGVuKTsKKyAgICAgICAgcHRyICs9IDI7CisgICAgICAgIG1lbWNweShwdHIsIHBhc3MtPnRwLnNhbHQuZGF0YSwgcGFzcy0+dHAuc2FsdC5sZW4pOworICAgICAgICBwdHIgKz0gcGFzcy0+dHAuc2FsdC5sZW47CisKKyAgICAgICAgU2VuZFNSUEF1dGhTQihTUlBfUEFSQU1TLCBwYnVmLCBwdHIgLSBwYnVmKTsKKwlmcmVlKHBidWYpOworCXBidWYgPSBOVUxMOworCisgICAgICAgIGlmKFNSUF9nZW5fcHViKHNfc3JwLCAmQikgIT0gU1JQX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3IgZ2VuZXJhdGluZyBTUlAgcHVibGljIHZhbHVlXHJcbiIpOworICAgICAgICAgICAgU2VuZFNSUEF1dGhTQihTUlBfUkVKRUNULCAodm9pZCAqKSAiU1JQX2dlbl9wdWIgZmFpbGVkIiwgLTEpOworICAgICAgICAgICAgcmV0dXJuKEFVVEhfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgY2tzdHJuY3B5KHN6VXNlck5hbWVBdXRoZW50aWNhdGVkLHN6VXNlck5hbWVSZXF1ZXN0ZWQsVUlEQlVGTEVOKTsKKyAgICAgICAgcmV0dXJuIEFVVEhfU1VDQ0VTUzsKKworICAgIGNhc2UgU1JQX0VYUDoKKyAgICAgIC8qIENsaWVudCBpcyBzZW5kaW5nIEEgdG8gdXMsIGNvbXB1dGUgY2hhbGxlbmdlIGFuZCBleHBlY3RlZCByZXNwb25zZS4gKi8KKyAgICAgICAgaWYgKHNfc3JwID09IE5VTEwgfHwgQiA9PSBOVUxMKSB7CisJICAgIHByaW50ZigiUHJvdG9jb2wgZXJyb3I6IFNSUF9FWFAgdW5leHBlY3RlZFxyXG4iKTsKKwkgICAgU2VuZFNSUEF1dGhTQihTUlBfUkVKRUNULAorCQkgIAkodm9pZCAqKSJQcm90b2NvbCBlcnJvcjogdW5leHBlY3RlZCBFWFAiLCAtMSk7CisJICAgIHJldHVybihBVVRIX0ZBSUxVUkUpOworCX0KKyAgICAgICAgLyogV2FpdCB1bnRpbCBub3cgdG8gc2VuZCBCLCBzaW5jZSBpdCBjb250YWlucyB0aGUga2V5IHRvICJ1IiAqLworICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9DSEFMTEVOR0UsIEItPmRhdGEsIEItPmxlbmd0aCk7CisgICAgICAgIGNzdHJfZnJlZShCKTsKKyAgICAgICAgQiA9IE5VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIG9yaWdpbmFsIFNSUCBBVVRIIGltcGxlbWVudGF0aW9uIGRpZCBub3QgcHJvdGVjdCBhZ2FpbnN0CisgICAgICAgICAqIHRhbXBlcmluZyBvZiB0aGUgYXV0aC10eXBlLXBhaXJzLiAgVGhlcmVmb3JlLCB3aGVuIHRoZQorICAgICAgICAgKiBBVVRIX0VOQ1JZUFRfTUFTSyBiaXRzIGFyZSB6ZXJvLCBubyBleHRyYSBkYXRhIGlzIGluc2VydGVkCisgICAgICAgICAqIGludG8gdGhlIFNSUCBoYXNoIGNvbXB1dGF0aW9uLiAgV2hlbiBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTCisgICAgICAgICAqIGlzIHNldCB3ZSBhbHNvIGluc2VydCB0aGUgU1NML1RMUyBjbGllbnQgYW5kIHNlcnZlciBmaW5pc2hlZAorICAgICAgICAgKiBtZXNzYWdlcyB0byBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBtYW4gaW4gdGhlIG1pZGRsZSBhdHRhY2sKKyAgICAgICAgICogdW5kZXJ3YXkgb24gdGhlIFNTTC9UTFMgY29ubmVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGlmICggKGhvdyAmIEFVVEhfRU5DUllQVF9NQVNLKSAhPSBBVVRIX0VOQ1JZUFRfT0ZGICkgeworICAgICAgICAgICAgdHlwZV9jaGVja1swXSA9IEFVVEhUWVBFX1NSUDsKKyAgICAgICAgICAgIHR5cGVfY2hlY2tbMV0gPSBob3c7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICBpZiAoKGhvdyAmIEFVVEhfRU5DUllQVF9NQVNLKSA9PSBBVVRIX0VOQ1JZUFRfU1RBUlRfVExTKSB7CisgICAgICAgICAgICAgICAgc3NsX2dldF9jbGllbnRfZmluaXNoZWQoJnR5cGVfY2hlY2tbMl0sMTIpOworICAgICAgICAgICAgICAgIHNzbF9nZXRfc2VydmVyX2ZpbmlzaGVkKCZ0eXBlX2NoZWNrWzE0XSwxMik7CisgICAgICAgICAgICAgICAgU1JQX2FkZF9leF9kYXRhKHNfc3JwLCB0eXBlX2NoZWNrLCAyNik7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICBTUlBfYWRkX2V4X2RhdGEoc19zcnAsIHR5cGVfY2hlY2ssIDIpOworICAgICAgICB9CisKKyAgICAgICAgaWYoU1JQX2NvbXB1dGVfa2V5KHNfc3JwLCAmc19rZXksIGRhdGEsIGNudCkgIT0gU1JQX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHByaW50ZigiU2VjdXJpdHkgYWxlcnQ6IFRyaXZpYWwgc2Vzc2lvbiBrZXkgYXR0ZW1wdGVkXHJcbiIpOworICAgICAgICAgICAgU2VuZFNSUEF1dGhTQihTUlBfUkVKRUNULAorCQkJICAodm9pZCAqKSAiVHJpdmlhbCBzZXNzaW9uIGtleSBkZXRlY3RlZCIsIC0xKTsKKyAgICAgICAgICAgIHJldHVybihBVVRIX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIHNycF93YWl0cmVzcCA9IDE7CisgICAgICAgIHJldHVybiBBVVRIX1NVQ0NFU1M7CisKKyAgICBjYXNlIFNSUF9SRVNQT05TRToKKyAgICAgICAgLyogR290IHRoZSByZXNwb25zZTsgc2VlIGlmIGl0J3MgY29ycmVjdCAqLworICAgICAgICBpZiAoIXNycF93YWl0cmVzcCB8fCBzX3NycCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoMSkKKyAgICAgICAgICAgICAgcHJpbnRmKCJQcm90b2NvbCBlcnJvcjogU1JQX1JFU1BPTlNFIHVuZXhwZWN0ZWRcclxuIik7CisgICAgICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9SRUpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICJQcm90b2NvbCBlcnJvcjogdW5leHBlY3RlZCBSRVNQT05TRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICByZXR1cm4oQVVUSF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBzcnBfd2FpdHJlc3AgPSAwOyAgICAgICAvKiB3ZSBnb3QgYSByZXNwb25zZSAqLworCisgICAgICAgIGlmIChjbnQgPCBSRVNQT05TRV9MRU4pIHsKKyAgICAgICAgICAgIGlmICgxKQorICAgICAgICAgICAgICBwcmludGYoIlByb3RvY29sIGVycm9yOiBtYWxmb3JtZWQgcmVzcG9uc2VcclxuIik7CisgICAgICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9SRUpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICJQcm90b2NvbCBlcnJvcjogbWFsZm9ybWVkIHJlc3BvbnNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHJldHVybihBVVRIX0ZBSUxVUkUpOworICAgICAgICB9CisKKyAgICAgICAgaWYoU1JQX3ZlcmlmeShzX3NycCwgZGF0YSwgY250KSA9PSBTUlBfU1VDQ0VTUykgeworICAgICAgICAgICAgcmVzcCA9IGNzdHJfbmV3KCk7CisgICAgICAgICAgICBpZihTUlBfcmVzcG9uZChzX3NycCwgJnJlc3ApICE9IFNSUF9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBjb21wdXRpbmcgcmVzcG9uc2VcclxuIik7CisgICAgICAgICAgICAgICAgU2VuZFNSUEF1dGhTQihTUlBfUkVKRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgIkVycm9yIGNvbXB1dGluZyByZXNwb25zZSIsIC0xKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oQVVUSF9GQUlMVVJFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNlbmRTUlBBdXRoU0IoU1JQX0FDQ0VQVCwgcmVzcC0+ZGF0YSwgcmVzcC0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGFjY2VwdF9jb21wbGV0ZSA9IDE7CisgICAgICAgICAgICBjc3RyX2ZyZWUocmVzcCk7CisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICBpZiAoIShzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnKSkKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBza2V5LnR5cGUgPSBTS19HRU5FUklDOworICAgICAgICAgICAgICAgIHNrZXkubGVuZ3RoID0gc19rZXktPmxlbmd0aDsKKyAgICAgICAgICAgICAgICBza2V5LmRhdGEgPSBzX2tleS0+ZGF0YTsKKyAgICAgICAgICAgICAgICBlbmNyeXB0X3Nlc3Npb25fa2V5KCZza2V5LCBBVVRIX1NFUlZFUl9UT19DTElFTlQpOworICAgICAgICAgICAgICAgIGNzdHJfY2xlYXJfZnJlZShzX2tleSk7CisgICAgICAgICAgICAgICAgc19rZXkgPSBOVUxMOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgICAgIGF1dGhfZmluaXNoZWQoQVVUSF9WQUxJRCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBTZW5kU1JQQXV0aFNCKFNSUF9SRUpFQ1QsICh2b2lkICopICJMb2dpbiBpbmNvcnJlY3QiLCAtMSk7CisgICAgICAgICAgICBhdXRoX2ZpbmlzaGVkKEFVVEhfUkVKRUNUKTsKKyAgICAgICAgICAgIHJldHVybihBVVRIX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBVVRIX1NVQ0NFU1M7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBwcmludGYoIlVua25vd24gU1JQIG9wdGlvbiAlZFxyXG4iLCBkYXRhWy0xXSk7CisgICAgICAgIFNlbmRTUlBBdXRoU0IoU1JQX1JFSkVDVCwgKHZvaWQgKikgIlVua25vd24gb3B0aW9uIHJlY2VpdmVkIiwgLTEpOworICAgICAgICByZXR1cm4oQVVUSF9GQUlMVVJFKTsKKyAgICB9Cit9CisjZW5kaWYgLyogUFJFX1NSUF8xXzdfMyAqLworI2VuZGlmIC8qIFNSUCAqLworCisjaWZkZWYgS1JCNQorI2lmZGVmIEtJTklUCisvKgorICogY2xpZW50cy9raW5pdC9raW5pdC5jCisgKgorICogQ29weXJpZ2h0IDE5OTAgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIEV4cG9ydCBvZiB0aGlzIHNvZnR3YXJlIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSBtYXkKKyAqICAgcmVxdWlyZSBhIHNwZWNpZmljIGxpY2Vuc2UgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50LgorICogICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYW55IHBlcnNvbiBvciBvcmdhbml6YXRpb24gY29udGVtcGxhdGluZworICogICBleHBvcnQgdG8gb2J0YWluIHN1Y2ggYSBsaWNlbnNlIGJlZm9yZSBleHBvcnRpbmcuCisgKgorICogV0lUSElOIFRIQVQgQ09OU1RSQUlOVCwgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQKKyAqIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQKKyAqIHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZworICogdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yCisgKiBwZXJtaXNzaW9uLiAgTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3MKKyAqIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIEluaXRpYWxpemUgYSBjcmVkZW50aWFscyBjYWNoZS4KKyAqLworCisjZGVmaW5lIEtSQjVfREVGQVVMVF9PUFRJT05TIDAKKyNkZWZpbmUgS1JCNV9ERUZBVUxUX0xJRkUgNjAqNjAqMTAgLyogMTAgaG91cnMgKi8KKworc3RhdGljIGtyYjVfZGF0YSB0Z3RuYW1lID0geworI2lmbmRlZiBIRUlNREFMCisgICAgMCwKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgS1JCNV9UR1NfTkFNRV9TSVpFLAorICAgIEtSQjVfVEdTX05BTUUKK307CisKKy8qIEludGVybmFsIHByb3RvdHlwZXMgKi8KK19QUk9UT1RZUChzdGF0aWMga3JiNV9lcnJvcl9jb2RlIGtyYjVfdmFsaWRhdGVfdGd0LAorICAgICAgICAoa3JiNV9jb250ZXh0LCBrcmI1X2NjYWNoZSxrcmI1X3ByaW5jaXBhbCwga3JiNV9kYXRhICopKTsKK19QUk9UT1RZUChzdGF0aWMga3JiNV9lcnJvcl9jb2RlIGtyYjVfcmVuZXdfdGd0LAorICAgICAgICAoa3JiNV9jb250ZXh0LCBrcmI1X2NjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfcHJpbmNpcGFsLCBrcmI1X2RhdGEgKikpOworX1BST1RPVFlQKHN0YXRpYyBrcmI1X2Vycm9yX2NvZGUga3JiNV90Z3RfZ2VuLAorICAgICAgICAoa3JiNV9jb250ZXh0LCBrcmI1X2NjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfcHJpbmNpcGFsLCBrcmI1X2RhdGEgKiwgaW50IG9wdCkpOworCisjaWZkZWYgS1JCNV9IQVZFX0dFVF9JTklUX0NSRURTCitzdGF0aWMga3JiNV9lcnJvcl9jb2RlIEtSQjVfQ0FMTENPTlYKK2NrX2tyYjVfcHJvbXB0ZXIoIGtyYjVfY29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiYW5uZXIsCisgICAgICAgICAgICAgICAgICBpbnQgbnVtX3Byb21wdHMsCisgICAgICAgICAgICAgICAgICBrcmI1X3Byb21wdCBwcm9tcHRzW10pCit7CisgICAga3JiNV9lcnJvcl9jb2RlICAgICBlcnJjb2RlID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisjaWZkZWYgS1VJCisgICAgc3RydWN0IHR4dGJveCAqIHRiID0gTlVMTDsKKyNlbHNlIC8qIEtVSSAqLworICAgIGNoYXIgKiBwcm9tcHQgPSBOVUxMOworI2VuZGlmIC8qIEtVSSAqLworICAgIGludCAgICBsZW4gPSAwLCBibGVuPTAsIG5sZW49MDsKKworICAgIGRlYnVnKEYxMTAsImNrX2tyYjVfcHJvbXB0ZXIgbmFtZSIsbmFtZSwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJja19rcmI1X3Byb21wdGVyIGJhbm5lciIsYmFubmVyLDApOworICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfcHJvbXB0ZXIgbnVtX3Byb21wdHMiLCIiLG51bV9wcm9tcHRzKTsKKworICAgIGlmIChuYW1lKQorICAgICAgICBubGVuID0gc3RybGVuKG5hbWUpKzI7CisKKyAgICBpZiAoYmFubmVyKQorICAgICAgICBibGVuID0gc3RybGVuKGJhbm5lcikrMjsKKworI2lmZGVmIEtVSQorICAgIHRiID0gKHN0cnVjdCB0eHRib3ggKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHh0Ym94KSAqIG51bV9wcm9tcHRzKTsKKyAgICBpZiAoIHRiICE9IE5VTEwgKSB7CisgICAgICAgIGludCBvazsKKyAgICAgICAgbWVtc2V0KHRiLDAsc2l6ZW9mKHN0cnVjdCB0eHRib3gpICogbnVtX3Byb21wdHMpOworICAgICAgICBmb3IgKCBpPTA7IGkgPCBudW1fcHJvbXB0czsgaSsrICkgeworICAgICAgICAgICAgdGJbaV0udF9idWYgPSBwcm9tcHRzW2ldLnJlcGx5LT5kYXRhOworICAgICAgICAgICAgdGJbaV0udF9sZW4gPSBwcm9tcHRzW2ldLnJlcGx5LT5sZW5ndGg7CisgICAgICAgICAgICB0YltpXS50X2xibCA9IHByb21wdHNbaV0ucHJvbXB0OworICAgICAgICAgICAgdGJbaV0udF9kZmx0ID0gTlVMTDsKKyAgICAgICAgICAgIHRiW2ldLnRfZWNobyA9IChwcm9tcHRzW2ldLmhpZGRlbiA/IDIgOiAxKTsKKyAgICAgICAgfSAgIAorCisgICAgICAgIG9rID0gdXFfbXR4dCgoY2hhciAqKWJhbm5lcixOVUxMLG51bV9wcm9tcHRzLHRiKTsKKyAgICAgICAgaWYgKCBvayApIHsKKyAgICAgICAgICAgIGZvciAoIGk9MDsgaSA8IG51bV9wcm9tcHRzOyBpKysgKQorICAgICAgICAgICAgICAgIHByb21wdHNbaV0ucmVwbHktPmxlbmd0aCA9IHN0cmxlbihwcm9tcHRzW2ldLnJlcGx5LT5kYXRhKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBlcnJjb2RlID0gLTI7CisgICAgfQorI2Vsc2UgLyogS1VJICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9wcm9tcHRzOyBpKyspIHsKKyAgICAgICAgZGVidWcoRjExMSwiY2tfa3JiNV9wcm9tcHRlciBwcm9tcHQiLHByb21wdHNbaV0ucHJvbXB0LGkpOworCisgICAgICAgIGlmICggcHJvbXB0ICYmIGxlbiA8IChubGVuICsgYmxlbiArIHN0cmxlbihwcm9tcHRzW2ldLnByb21wdCkrMikgKSB7CisgICAgICAgICAgICBmcmVlKHByb21wdCk7CisgICAgICAgICAgICBwcm9tcHQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICggIXByb21wdCApCisgICAgICAgICAgICBwcm9tcHQgPSAoY2hhciAqKW1hbGxvYyhubGVuICsgYmxlbiArIHN0cmxlbihwcm9tcHRzW2ldLnByb21wdCkrMik7CisgICAgICAgIGlmICggIXByb21wdCApIHsKKyAgICAgICAgICAgIGVycmNvZGUgPSBLUkI1X1JDX01BTExPQzsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSBubGVuICsgYmxlbiArIHN0cmxlbihwcm9tcHRzW2ldLnByb21wdCkrMjsKKyAgICAgICAgY2ttYWt4bXNnKHByb21wdCxsZW4sCisgICAgICAgICAgICAgICAgIChjaGFyICopIChuYW1lP25hbWU6IiIpLAorICAgICAgICAgICAgICAgICBuYW1lPyJcclxuIjoiIiwKKyAgICAgICAgICAgICAgICAgKGNoYXIgKikgKGJhbm5lcj9iYW5uZXI6IiIpLAorICAgICAgICAgICAgICAgICBiYW5uZXI/IlxyXG4iOiIiLAorICAgICAgICAgICAgICAgICAoY2hhciAqKXByb21wdHNbaV0ucHJvbXB0LAorICAgICAgICAgICAgICAgICAiOiAiLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKworICAgICAgICBtZW1zZXQocHJvbXB0c1tpXS5yZXBseS0+ZGF0YSwgMCwgcHJvbXB0c1tpXS5yZXBseS0+bGVuZ3RoKTsKKyAgICAgICAgaWYgKHByb21wdHNbaV0uaGlkZGVuKSB7CisgICAgICAgICAgICByZWFkcGFzcyhwcm9tcHQsIHByb21wdHNbaV0ucmVwbHktPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgcHJvbXB0c1tpXS5yZXBseS0+bGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlYWR0ZXh0KHByb21wdCwgcHJvbXB0c1tpXS5yZXBseS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBwcm9tcHRzW2ldLnJlcGx5LT5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHByb21wdHNbaV0ucmVwbHktPmxlbmd0aCA9IHN0cmxlbihwcm9tcHRzW2ldLnJlcGx5LT5kYXRhKTsKKyAgICB9CisjZW5kaWYgLyogS1VJICovCisKKyAgY2xlYW51cDoKKyNpZmRlZiBLVUkKKyAgICBpZiAoIHRiICkKKyAgICAgICAgZnJlZSh0Yik7CisjZWxzZSAvKiBLVUkgKi8KKyAgICBpZiAoIHByb21wdCApCisgICAgICAgIGZyZWUocHJvbXB0KTsKKyNlbmRpZiAvKiBLVUkgKi8KKyAgICBpZiAoZXJyY29kZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Byb21wdHM7IGkrKykgeworICAgICAgICAgICAgbWVtc2V0KHByb21wdHNbaV0ucmVwbHktPmRhdGEsIDAsIHByb21wdHNbaV0ucmVwbHktPmxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycmNvZGU7Cit9CisKKy8qCisgKiAgICAgIEknbSBub3QgcmVhbGx5IHN1cmUgd2hhdCB0byBkbyB3aXRoIHRoaXMuICBUaGUgTlJMIERMTHMgdXNlIGEKKyAqICAgICAgZGlmZmVyZW50IGludGVyZmFjZSBmb3IgdGhlIGtyYjVfcHJvbXB0ZXIgY2FsbGJhY2suICBJdCBoYXMKKyAqICAgICAgb25lIGxlc3MgcGFyYW1ldGVyLiAgIFRoaXMgaXMgZ29pbmcgdG8gYmUgdWdseS4KKyAqLworc3RhdGljIGtyYjVfZXJyb3JfY29kZSBLUkI1X0NBTExDT05WCitja19OUkxfa3JiNV9wcm9tcHRlcigga3JiNV9jb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiYW5uZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wcm9tcHRzLAorICAgICAgICAgICAgICAgICAgICAgIGtyYjVfcHJvbXB0IHByb21wdHNbXSkKK3sKKyAgICByZXR1cm4oY2tfa3JiNV9wcm9tcHRlcihjb250ZXh0LE5VTEwsbmFtZSxiYW5uZXIsbnVtX3Byb21wdHMscHJvbXB0cykpOworfQorI2VuZGlmIC8qIEtSQjVfSEFWRV9HRVRfSU5JVF9DUkVEUyAqLworCisjaWZkZWYgS1JCNTI0X0NPTlYKK2xvbmcKK3RyeV9jb252ZXJ0NTI0KGtyYjVfY29udGV4dCBjdHgsIGtyYjVfcHJpbmNpcGFsIG1lLCBrcmI1X2NjYWNoZSBjYykKK3sKKyAgICBjaGFyICogcHJvZ25hbWUgPSAiY29udmVydDUyNCI7CisgICAga3JiNV9lcnJvcl9jb2RlIGNvZGUgPSAwOworICAgIGludCBpY29kZSA9IDA7CisgICAga3JiNV9wcmluY2lwYWwga3Bjc2VydmVyID0gMDsKKyAgICBrcmI1X2NyZWRzICp2NWNyZWRzID0gMDsKKyAgICBrcmI1X2NyZWRzIGluY3JlZHM7CisjaWZkZWYgT1MyCisgICAgTEVBU0hfQ1JFREVOVElBTFMgdjRjcmVkczsKKyNlbHNlIC8qIE9TMiAqLworICAgIENSRURFTlRJQUxTIHY0Y3JlZHM7CisjZW5kaWYgLyogT1MyICovCisKKyAgICBtZW1zZXQoKGNoYXIgKikgJmluY3JlZHMsIDAsIHNpemVvZihpbmNyZWRzKSk7CisgICAgLyoKKyAgICAgIEZyb20gdGhpcyBwb2ludCBvbiwgd2UgY2FuIGdvdG8gY2xlYW51cCBiZWNhdXNlIGluY3JlZHMgaXMKKyAgICAgIGluaXRpYWxpemVkLgorICAgICovCisKKyAgICBpZiAoKGNvZGUgPSBrcmI1X2J1aWxkX3ByaW5jaXBhbChjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtwY3NlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X3ByaW5jX3JlYWxtKGN0eCwgbWUpLT5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9wcmluY19yZWFsbShjdHgsIG1lKS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia3JidGd0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X3ByaW5jX3JlYWxtKGN0eCwgbWUpLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSkgeworICAgICAgICBjb21fZXJyKHByb2duYW1lLCBjb2RlLAorICAgICAgICAgICAgICAgICJ3aGlsZSBjcmVhdGluZyBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBtZW1zZXQoKGNoYXIqKSAmaW5jcmVkcywgMCwgc2l6ZW9mKGluY3JlZHMpKTsKKyAgICBpbmNyZWRzLmNsaWVudCA9IG1lOworICAgIGluY3JlZHMuc2VydmVyID0ga3Bjc2VydmVyOworICAgIC8qIFByZXZlbnQgZHVwbGljYXRlIGZyZWUgY2FsbHMuICAqLworICAgIGtwY3NlcnZlciA9IDA7CisKKyAgICBpbmNyZWRzLnRpbWVzLmVuZHRpbWUgPSAwOworICAgIGluY3JlZHMua2V5YmxvY2suZW5jdHlwZSA9IEVOQ1RZUEVfREVTX0NCQ19DUkM7CisgICAgaWYgKChjb2RlID0ga3JiNV9nZXRfY3JlZGVudGlhbHMoY3R4LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmNyZWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2NWNyZWRzKSkpIHsKKyAgICAgICAgY29tX2Vycihwcm9nbmFtZSwgY29kZSwKKyAgICAgICAgICAgICAgICAiZ2V0dGluZyBWNSBjcmVkZW50aWFscyIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIGlmICgoaWNvZGUgPSBrcmI1MjRfY29udmVydF9jcmVkc19rZGMoY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjVjcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2NGNyZWRzKSkpIHsKKyAgICAgICAgY29tX2Vycihwcm9nbmFtZSwgaWNvZGUsCisgICAgICAgICAgICAgICAgImNvbnZlcnRpbmcgdG8gVjQgY3JlZGVudGlhbHMiKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKyAgICAvKiB0aGlzIGlzIHN0b2xlbiBmcm9tIHRoZSB2NCBraW5pdCAqLworICAgIC8qIGluaXRpYWxpemUgdGlja2V0IGNhY2hlICovCisgICAgaWYgKChpY29kZSA9IGtyYl9pbl90a3QodjRjcmVkcy5wbmFtZSwgdjRjcmVkcy5waW5zdCwgdjRjcmVkcy5yZWFsbSkKKyAgICAgICAgICE9IEtTVUNDRVNTKSkgeworICAgICAgICBjb21fZXJyKHByb2duYW1lLCBpY29kZSwKKyAgICAgICAgICAgICAgICAidHJ5aW5nIHRvIGNyZWF0ZSB0aGUgVjQgdGlja2V0IGZpbGUiKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKyAgICAvKiBzdGFzaCB0aWNrZXQsIHNlc3Npb24ga2V5LCBldGMuIGZvciBmdXR1cmUgdXNlICovCisgICAgaWYgKChpY29kZSA9IGtyYl9zYXZlX2NyZWRlbnRpYWxzKHY0Y3JlZHMuc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjRjcmVkcy5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjRjcmVkcy5yZWFsbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjRjcmVkcy5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NGNyZWRzLmxpZmV0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NGNyZWRzLmt2bm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYodjRjcmVkcy50aWNrZXRfc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NGNyZWRzLmlzc3VlX2RhdGUpKSkgeworICAgICAgICBjb21fZXJyKHByb2duYW1lLCBpY29kZSwKKyAgICAgICAgICAgICAgICAidHJ5aW5nIHRvIHNhdmUgdGhlIFY0IHRpY2tldCIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgY2xlYW51cDoKKyAgICBtZW1zZXQoJnY0Y3JlZHMsIDAsIHNpemVvZih2NGNyZWRzKSk7CisgICAgaWYgKHY1Y3JlZHMpCisgICAgICAgIGtyYjVfZnJlZV9jcmVkcyhjdHgsIHY1Y3JlZHMpOworICAgIGluY3JlZHMuY2xpZW50ID0gMDsKKyAgICBrcmI1X2ZyZWVfY3JlZF9jb250ZW50cyhjdHgsICZpbmNyZWRzKTsKKyAgICBpZiAoa3Bjc2VydmVyKQorICAgICAgICBrcmI1X2ZyZWVfcHJpbmNpcGFsKGN0eCwga3Bjc2VydmVyKTsKKyAgICByZXR1cm4gIShjb2RlIHx8IGljb2RlKTsKK30KKyNlbmRpZiAvKiBLUkI1MjRfQ09OViAqLworCisjZGVmaW5lIE5PX0tFWVRBQgorCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNV9pbml0VEdUKCBzdHJ1Y3Qga3JiX29wX2RhdGEgKiBvcCwgc3RydWN0IGtyYjVfaW5pdF9kYXRhICogaW5pdCwKKyAgICAgICAgICAgICAgICAgc3RydWN0IGtyYjRfaW5pdF9kYXRhICogazRfaW5pdCkKKyNlbHNlCitja19rcmI1X2luaXRUR1Qob3AsaW5pdCxrNF9pbml0KQorICAgIGtyYl9vcF9kYXRhICogb3A7IHN0cnVjdCBrcmI1X2luaXRfZGF0YSAqIGluaXQ7CisgICAgc3RydWN0IGtyYjRfaW5pdF9kYXRhICogazRfaW5pdDsKKyNlbmRpZiAvKiBDS19BTlNJQyovCit7CisgICAga3JiNV9jb250ZXh0IGtjb250ZXh0OworICAgIGtyYjVfY2NhY2hlIGNjYWNoZSA9IE5VTEw7CisgICAga3JiNV9kZWx0YXQgbGlmZXRpbWUgPSBLUkI1X0RFRkFVTFRfTElGRTsgICAvKiAtbCBvcHRpb24gKi8KKyAgICBrcmI1X3RpbWVzdGFtcCBzdGFydHRpbWUgPSAwOworICAgIGtyYjVfZGVsdGF0IHJsaWZlID0gMDsKKyAgICBpbnQgb3B0aW9ucyA9IEtSQjVfREVGQVVMVF9PUFRJT05TOworICAgIGludCBvcHRpb247CisgICAgaW50IGVycmZsZyA9IDA7CisgICAga3JiNV9lcnJvcl9jb2RlIGNvZGU7CisgICAga3JiNV9wcmluY2lwYWwgbWU9TlVMTDsKKyAgICBrcmI1X3ByaW5jaXBhbCBzZXJ2ZXI9TlVMTDsKKyAgICBrcmI1X2NyZWRzIG15X2NyZWRzOworICAgIGtyYjVfdGltZXN0YW1wIG5vdzsKKyNpZm5kZWYgSEVJTURBTAorICAgIGtyYjVfYWRkcmVzcyAqKmFkZHJzID0gKGtyYjVfYWRkcmVzcyAqKikwOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICBpbnQgYWRkcl9jb3VudD0wOworICAgIGludCBpLGo7CisjaWZuZGVmIE5PX0tFWVRBQgorICAgIGludCB1c2Vfa2V5dGFiID0gMDsgICAgICAgICAgICAgICAgIC8qIC1rIG9wdGlvbiAqLworICAgIGtyYjVfa2V5dGFiIGtleXRhYiA9IE5VTEw7CisjZW5kaWYgLyogTk9fS0VZVEFCICovCisgICAgc3RydWN0IHBhc3N3ZCAqcHcgPSAwOworICAgIGludCBwd3NpemU7CisgICAgY2hhciAqY2xpZW50X25hbWU9TlVMTCwgcHJpbmNpcGFsWzI1Nl09IiIsIHJlYWxtWzI1Nl09IiIsIG51bXN0cls0MF09IiI7CisgICAgY2hhciAqcGFzc3dvcmQ9TlVMTCwgcGFzc3dkWzgwXT0iIjsKKyNpZmRlZiBLUkI1X0hBVkVfR0VUX0lOSVRfQ1JFRFMKKyAgICBrcmI1X2dldF9pbml0X2NyZWRzX29wdCBvcHRzOworI2VuZGlmCisgICAgY2hhciAqIG5hbWU7CisgICAgaW50IGxlbjsKKworICAgIGlmICggIWNrX2tyYjVfaXNfaW5zdGFsbGVkKCkgKQorICAgICAgICByZXR1cm4oLTEpOworCisjaWZkZWYgQ09NTUVOVAorICAgIHByaW50ZigiS2VyYmVyb3MgViBpbml0aWFsaXphdGlvblxyXG4iKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICBjb2RlID0ga3JiNV9pbml0X2NvbnRleHQoJmtjb250ZXh0KTsKKyAgICBpZiAoY29kZSkgeworICAgICAgICBjb21fZXJyKCJrcmI1X2tpbml0Iixjb2RlLCJ3aGlsZSBpbml0X2NvbnRleHQiKTsKKyAgICAgICAga3JiNV9lcnJubyA9IGNvZGU7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGVycm9yX21lc3NhZ2Uoa3JiNV9lcnJubykpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIGRlYnVnKEYxMTAsImtyYjVfaW5pdCIsImtyYjVfaW5pdF9jb250ZXh0IiwwKTsKKworICAgIGlmICgoY29kZSA9IGtyYjVfdGltZW9mZGF5KGtjb250ZXh0LCAmbm93KSkpIHsKKyAgICAgICAgY29tX2Vycigia3JiNV9raW5pdCIsY29kZSwid2hpbGUgZ2V0dGluZyB0aW1lIG9mIGRheSIpOworICAgICAgICBnb3RvIGV4aXRfazVfaW5pdDsKKyAgICB9CisKKyNpZmRlZiBLUkI1X0hBVkVfR0VUX0lOSVRfQ1JFRFMKKyAgICBtZW1zZXQoJm9wdHMsIDAsIHNpemVvZihvcHRzKSk7CisgICAga3JiNV9nZXRfaW5pdF9jcmVkc19vcHRfaW5pdCgmb3B0cyk7CisgICAgZGVidWcoRjExMCwia3JiNV9pbml0Iiwia3JiNV9nZXRfaW5pdF9jcmVkc19vcHRfaW5pdCIsMCk7CisjZW5kaWYKKworICAgIGlmICggaW5pdC0+cmVuZXdhYmxlICkgeworICAgICAgICBvcHRpb25zIHw9IEtEQ19PUFRfUkVORVdBQkxFOworICAgICAgICBja21ha21zZyhudW1zdHIsc2l6ZW9mKG51bXN0ciksY2tpdG9hKGluaXQtPnJlbmV3YWJsZSksIm0iLE5VTEwsTlVMTCk7CisjaWZkZWYgSEVJTURBTAorICAgICAgICBjb2RlID0gLTE7CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgICAgIGNvZGUgPSBrcmI1X3N0cmluZ190b19kZWx0YXQobnVtc3RyLCAmcmxpZmUpOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgaWYgKGNvZGUgIT0gMCB8fCBybGlmZSA9PSAwKSB7CisgICAgICAgICAgICBwcmludGYoIkJhZCByZW5ld2FibGUgdGltZSB2YWx1ZSAlc1xyXG4iLCBudW1zdHIpOworICAgICAgICAgICAgZXJyZmxnKys7CisgICAgICAgIH0KKyNpZmRlZiBLUkI1X0hBVkVfR0VUX0lOSVRfQ1JFRFMKKyAgICAgICAga3JiNV9nZXRfaW5pdF9jcmVkc19vcHRfc2V0X3JlbmV3X2xpZmUoJm9wdHMsIHJsaWZlKTsKKyNlbmRpZgorICAgIH0KKyAgICBpZiAoIGluaXQtPnJlbmV3ICkgeworICAgICAgICAvKiByZW5ldyB0aGUgdGlja2V0ICovCisgICAgICAgIG9wdGlvbnMgfD0gS0RDX09QVF9SRU5FVzsKKyAgICB9CisKKyAgICBpZiAoIGluaXQtPnZhbGlkYXRlICkgeworICAgICAgICAvKiB2YWxpZGF0ZSB0aGUgdGlja2V0ICovCisgICAgICAgIG9wdGlvbnMgfD0gS0RDX09QVF9WQUxJREFURTsKKyAgICB9CisgICAgaWYgKCBpbml0LT5wcm94aWFibGUgKSB7CisgICAgICAgIG9wdGlvbnMgfD0gS0RDX09QVF9QUk9YSUFCTEU7CisjaWZkZWYgS1JCNV9IQVZFX0dFVF9JTklUX0NSRURTCisgICAgICAgIGtyYjVfZ2V0X2luaXRfY3JlZHNfb3B0X3NldF9wcm94aWFibGUoJm9wdHMsIDEpOworI2VuZGlmCisgICAgfQorICAgIGlmICggaW5pdC0+Zm9yd2FyZGFibGUgKSB7CisgICAgICAgIG9wdGlvbnMgfD0gS0RDX09QVF9GT1JXQVJEQUJMRTsKKyNpZmRlZiBLUkI1X0hBVkVfR0VUX0lOSVRfQ1JFRFMKKyAgICAgICAga3JiNV9nZXRfaW5pdF9jcmVkc19vcHRfc2V0X2ZvcndhcmRhYmxlKCZvcHRzLCAxKTsKKyNlbmRpZgorICAgIH0KKyNpZm5kZWYgTk9fS0VZVEFCCisgICAgaWYgKCAgKSB7CisgICAgICAgIHVzZV9rZXl0YWIgPSAxOworICAgIH0KKyAgICBpZiAoICApIHsKKyAgICAgICAgaWYgKGtleXRhYiA9PSBOVUxMICYmIGtleXRhYl9uYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNvZGUgPSBrcmI1X2t0X3Jlc29sdmUoa2NvbnRleHQsIGtleXRhYl9uYW1lLCAma2V5dGFiKTsKKyAgICAgICAgICAgIGlmIChjb2RlICE9IDApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJrcmI1X2luaXQgcmVzb2x2aW5nIGtleXRhYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5dGFiX25hbWUsY29kZSk7CisgICAgICAgICAgICAgICAgZXJyZmxnKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTk9fS0VZVEFCICovCisgICAgaWYgKCBpbml0LT5saWZldGltZSApIHsKKyAgICAgICAgY2ttYWttc2cobnVtc3RyLHNpemVvZihudW1zdHIpLGNraXRvYShpbml0LT5saWZldGltZSksIm0iLE5VTEwsTlVMTCk7CisjaWZkZWYgSEVJTURBTAorICAgICAgICBjb2RlID0gLTE7CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgICAgIGNvZGUgPSBrcmI1X3N0cmluZ190b19kZWx0YXQobnVtc3RyLCAmbGlmZXRpbWUpOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgaWYgKGNvZGUgIT0gMCB8fCBsaWZldGltZSA9PSAwKSB7CisgICAgICAgICAgICBwcmludGYoIkJhZCBsaWZldGltZSB2YWx1ZSAlc1xyXG4iLCBudW1zdHIpOworICAgICAgICAgICAgZXJyZmxnKys7CisgICAgICAgIH0KKyNpZmRlZiBLUkI1X0hBVkVfR0VUX0lOSVRfQ1JFRFMKKyAgICAgICAga3JiNV9nZXRfaW5pdF9jcmVkc19vcHRfc2V0X3RrdF9saWZlKCZvcHRzLCBsaWZldGltZSk7CisjZW5kaWYKKyAgICB9CisgICAgaWYgKCBpbml0LT5wb3N0ZGF0ZSApIHsKKyAgICAgICAgLyogQ29udmVydCBjbWRhdGUoKSB0byBhIHRpbWVfdCB2YWx1ZSAqLworICAgICAgICBzdHJ1Y3QgdG0gKiB0aW1lX3RtOworICAgICAgICBzdHJ1Y3QgdG0gKiBjbWRhdGUydG0oY2hhciAqLGludCk7CisgICAgICAgIHRpbWVfdG0gPSBjbWRhdGUydG0oaW5pdC0+cG9zdGRhdGUsMCk7CisgICAgICAgIGlmICggdGltZV90bSApCisgICAgICAgICAgICBzdGFydHRpbWUgPSAoa3JiNV90aW1lc3RhbXApIG1rdGltZSh0aW1lX3RtKTsKKworICAgICAgICBpZiAoY29kZSAhPSAwIHx8IHN0YXJ0dGltZSA9PSAwIHx8IHN0YXJ0dGltZSA9PSAtMSkgeworICAgICAgICAgICAga3JiNV9kZWx0YXQga3RtcDsKKyNpZmRlZiBIRUlNREFMCisgICAgICAgICAgICBjb2RlID0gLTE7CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgICAgICAgICBjb2RlID0ga3JiNV9zdHJpbmdfdG9fZGVsdGF0KGluaXQtPnBvc3RkYXRlLCAma3RtcCk7CisjZW5kaWYgLyogSEVJTURBTCAqLworICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCAmJiBrdG1wICE9IDApIHsKKyAgICAgICAgICAgICAgICBzdGFydHRpbWUgPSBub3cgKyBrdG1wOworICAgICAgICAgICAgICAgIG9wdGlvbnMgfD0gS0RDX09QVF9QT1NUREFURUQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiQmFkIHBvc3RkYXRlIHN0YXJ0IHRpbWUgdmFsdWUgJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXQtPnBvc3RkYXRlKTsKKyAgICAgICAgICAgICAgICBlcnJmbGcrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wdGlvbnMgfD0gS0RDX09QVF9QT1NUREFURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWJ1ZyhGMTEwLCJrcmI1X2luaXQgc2VhcmNoaW5nIGZvciBjY2FjaGUiLG9wLT5jYWNoZSwwKTsKKworICAgIGNvZGUgPSBrNV9nZXRfY2NhY2hlKGtjb250ZXh0LCZjY2FjaGUsb3AtPmNhY2hlKTsKKyAgICBpZiAoY29kZSAhPSAwKSB7CisgICAgICAgIGNvbV9lcnIoImtyYjVfa2luaXQiLGNvZGUsIndoaWxlIGdldHRpbmcgZGVmYXVsdCBjY2FjaGUiKTsKKyAgICAgICAgZ290byBleGl0X2s1X2luaXQ7CisgICAgfQorCisgICAgLyogVGhpcyBpcyBvdXIgcmVhbG0gdW5sZXNzIGl0IGlzIGNoYW5nZWQgKi8KKyAgICBja3N0cm5jcHkocmVhbG0saW5pdC0+cmVhbG0gPyBpbml0LT5yZWFsbSA6IGtyYjVfZF9yZWFsbSwgMjU2KTsKKworI2lmZGVmIEJFVEFURVNUCisgICAgLyogVGhpcyBjb2RlIGlzIGdvaW5nIHRvIHRha2UgdGhlIHJlYWxtIGFuZCBhdHRlbXB0IHRvIGNvcnJlY3QgKi8KKyAgICAvKiB0aGUgY2FzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHsKKyAgICAgICAgcHJvZmlsZV90IHByb2ZpbGU7CisKKyAgICAgICAgY29kZSA9IGtyYjVfZ2V0X3Byb2ZpbGUoa2NvbnRleHQsICZwcm9maWxlKTsKKyAgICAgICAgaWYgKCAhY29kZSApIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgICpuYW1lc1s0XTsKKyAgICAgICAgICAgIGNoYXIgKiogcmVhbG1zOworICAgICAgICAgICAgaW50IGZvdW5kID0gMDsKKworICAgICAgICAgICAgbmFtZXNbMF0gPSAicmVhbG1zIjsKKyAgICAgICAgICAgIG5hbWVzWzFdID0gTlVMTDsKKworICAgICAgICAgICAgY29kZSA9IHByb2ZpbGVfZ2V0X3N1YnNlY3Rpb25fbmFtZXMocHJvZmlsZSxuYW1lcywmcmVhbG1zKTsKKyAgICAgICAgICAgIGlmICggY29kZSA9PSAwICkgeworICAgICAgICAgICAgICAgIGludCBpPTA7CisgICAgICAgICAgICAgICAgd2hpbGUgKCByZWFsbXNbaV0gKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChja3N0cmNtcChyZWFsbSxyZWFsbXNbaV0sLTEsMCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHJlYWxtLHJlYWxtc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisjaWZkZWYgQ0tfRE5TX1NSVgorICAgICAgICAgICAgaWYgKCAhZm91bmQgKSB7CisgICAgICAgICAgICAgICAgY2hhciAqIGRuc19yZWFsbSA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAvKiBXZSBkaWQgbm90IGZpbmQgdGhlIHJlYWxtIGluIHRoZSBwcm9maWxlIHNvIGxldCdzIHRyeSBETlMgKi8KKyAgICAgICAgICAgICAgICBsb2NhdGVfdHh0X3JyKCJfa2VyYmVyb3MiLHJlYWxtLCZkbnNfcmVhbG0pOworICAgICAgICAgICAgICAgIGlmICggZG5zX3JlYWxtICYmCisgICAgICAgICAgICAgICAgICAgICBja3N0cmNtcChyZWFsbSxkbnNfcmVhbG0sLTEsMCkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgY2tzdHJjbXAocmVhbG0sZG5zX3JlYWxtLC0xLDEpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkocmVhbG0sZG5zX3JlYWxtLDI1Nik7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoZG5zX3JlYWxtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfRE5TX1NSViAqLworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluaXQtPnJlYWxtICYmCisgICAgICAgICAgICAgY2tzdHJjbXAocmVhbG0saW5pdC0+cmVhbG0sLTEsMCkgPT0gMCAmJgorICAgICAgICAgICAgIGNrc3RyY21wKHJlYWxtLGluaXQtPnJlYWxtLC0xLDEpICE9IDApCisgICAgICAgICAgICBzdHJjcHkoaW5pdC0+cmVhbG0scmVhbG0pOworICAgICAgICBpZiAoY2tzdHJjbXAocmVhbG0sa3JiNV9kX3JlYWxtLC0xLDApID09IDAgJiYKKyAgICAgICAgICAgICBja3N0cmNtcChyZWFsbSxrcmI1X2RfcmVhbG0sLTEsMSkgIT0gMCkKKyAgICAgICAgICAgIHN0cmNweShrcmI1X2RfcmVhbG0scmVhbG0pOworICAgIH0KKyNlbmRpZiAvKiBCRVRBVEVTVCAqLworCisgICAgaWYgKGluaXQtPnByaW5jaXBhbCA9PSBOVUxMKSB7ICAgICAgIC8qIE5vIHByaW5jaXBhbCBuYW1lIHNwZWNpZmllZCAqLworI2lmbmRlZiBOT19LRVlUQUIKKyAgICAgICAgaWYgKHVzZV9rZXl0YWIpIHsKKyAgICAgICAgICAgIC8qIFVzZSB0aGUgZGVmYXVsdCBob3N0L3NlcnZpY2UgbmFtZSAqLworICAgICAgICAgICAgY29kZSA9IGtyYjVfc25hbWVfdG9fcHJpbmNpcGFsKGtjb250ZXh0LCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLUkI1X05UX1NSVl9IU1QsICZtZSk7CisgICAgICAgICAgICBpZiAoY29kZSA9PSAwICYmCisgICAgICAgICAgICAgICAga3JiNV9wcmluY19yZWFsbShrY29udGV4dCwgbWUpLT5sZW5ndGggPCBzaXplb2YocmVhbG0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhlIHJlYWxtICovCisgICAgICAgICAgICAgICAgbWVtY3B5KHJlYWxtLGtyYjVfcHJpbmNfcmVhbG0oa2NvbnRleHQsIG1lKS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfcHJpbmNfcmVhbG0oa2NvbnRleHQsIG1lKS0+bGVuZ3RoKTsgLyogc2FmZSAqLworICAgICAgICAgICAgICAgIHJlYWxtW2tyYjVfcHJpbmNfcmVhbG0oa2NvbnRleHQsIG1lKS0+bGVuZ3RoXT0nXDAnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb21fZXJyKCJrcmI1X2tpbml0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAid2hlbiBjcmVhdGluZyBkZWZhdWx0IHNlcnZlciBwcmluY2lwYWwgbmFtZSIpOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9pbml0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBOT19LRVlUQUIgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICAgIGNoYXIgKiBuYW1lOworCisgICAgICAgICAgICAvKiBHZXQgZGVmYXVsdCBwcmluY2lwYWwgZnJvbSBjYWNoZSBpZiBvbmUgZXhpc3RzICovCisgICAgICAgICAgICBjb2RlID0ga3JiNV9jY19nZXRfcHJpbmNpcGFsKGtjb250ZXh0LCBjY2FjaGUsICZtZSk7CisjaWZkZWYgSEVJTURBTAorICAgICAgICAgICAgbmFtZSA9IG1lLT5yZWFsbTsKKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbihuYW1lKTsKKyNlbHNlIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgICAgIGxlbiA9IGtyYjVfcHJpbmNfcmVhbG0oa2NvbnRleHQsIG1lKS0+bGVuZ3RoOworICAgICAgICAgICAgbmFtZSA9IGtyYjVfcHJpbmNfcmVhbG0oa2NvbnRleHQsIG1lKS0+ZGF0YTsKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgICAgICBpZiAoY29kZSA9PSAwICYmIGxlbiA8IHNpemVvZihyZWFsbSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgcmVhbG0gKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkocmVhbG0sbmFtZSxsZW4pOyAvKiBzYWZlICovCisgICAgICAgICAgICAgICAgcmVhbG1bbGVuXT0nXDAnOworICAgICAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBIQVZFX1BXRF9ICisgICAgICAgICAgICAgICAgLyogRWxzZSBzZWFyY2ggcGFzc3dkIGZpbGUgZm9yIGNsaWVudCAqLworCisgICAgICAgICAgICAgICAgcHcgPSBnZXRwd3VpZCgoaW50KSBnZXR1aWQoKSk7CisgICAgICAgICAgICAgICAgaWYgKHB3KSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgcHJpbmNfcmVhbG1bMjU2XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RybGVuKHB3LT5wd19uYW1lKSArIHN0cmxlbihyZWFsbSkgKyAxKSA+IDI1NSApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXRfazVfaW5pdDsKKworICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkocHJpbmNpcGFsLHB3LT5wd19uYW1lLDI1Nik7CisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShwcmluY19yZWFsbSxwdy0+cHdfbmFtZSwyNTYpOworICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQocHJpbmNfcmVhbG0sIkAiLDI1Nik7CisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdChwcmluY19yZWFsbSxyZWFsbSwyNTYpOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoY29kZSA9IGtyYjVfcGFyc2VfbmFtZShrY29udGV4dCxwcmluY19yZWFsbSwmbWUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9lcnJubyA9IGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21fZXJyKCJrcmI1X2tpbml0Iixjb2RlLCJ3aGVuIHBhcnNpbmcgbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbmNfcmVhbG0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0X2s1X2luaXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGlkZW50aWZ5IHVzZXIgZnJvbSBwYXNzd29yZCBmaWxlXHJcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXRfazVfaW5pdDsKKyAgICAgICAgICAgICAgICB9CisjZWxzZSAvKiBIQVZFX1BXRF9IICovCisgICAgICAgICAgICAgICAgcHJpbnRmKCJVbmFibGUgdG8gaWRlbnRpZnkgdXNlclxyXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXRfazVfaW5pdDsKKyNlbmRpZiAvKiBIQVZFX1BXRF9IICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmZGVmIEhFSU1EQUwKKyAgICAgICAgbGVuID0gbWUtPm5hbWUubmFtZV9zdHJpbmcubGVuOworICAgICAgICBuYW1lID0gKm1lLT5uYW1lLm5hbWVfc3RyaW5nLnZhbDsKKyNlbHNlIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgbGVuID0ga3JiNV9wcmluY19uYW1lKGtjb250ZXh0LCBtZSktPmxlbmd0aDsKKyAgICAgICAgbmFtZSA9IGtyYjVfcHJpbmNfbmFtZShrY29udGV4dCwgbWUpLT5kYXRhOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgaWYgKCBsZW4gPCBzaXplb2YocHJpbmNpcGFsKSApIHsKKyAgICAgICAgICAgIG1lbWNweShwcmluY2lwYWwsbmFtZSxsZW4pOyAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgcHJpbmNpcGFsW2xlbl09J1wwJzsKKyAgICAgICAgfQorICAgIH0gLyogVXNlIHNwZWNpZmllZCBuYW1lICovCisgICAgZWxzZSB7CisgICAgICAgIGNoYXIgcHJpbmNfcmVhbG1bMjU2XTsKKyAgICAgICAgaWYgKCAoc3RybGVuKGluaXQtPnByaW5jaXBhbCkgKworICAgICAgICAgICAgICAoaW5pdC0+aW5zdGFuY2UgPyBzdHJsZW4oaW5pdC0+aW5zdGFuY2UpKzEgOiAwKSArCisgICAgICAgICAgICAgIHN0cmxlbihyZWFsbSkKKyAgICAgICAgICAgICAgKyAyKSA+IDI1NSApCisgICAgICAgICAgICAgZ290byBleGl0X2s1X2luaXQ7CisKKyAgICAgICAgY2tzdHJuY3B5KHByaW5jaXBhbCxpbml0LT5wcmluY2lwYWwsMjU2KTsKKyAgICAgICAgY2tzdHJuY3B5KHByaW5jX3JlYWxtLGluaXQtPnByaW5jaXBhbCwyNTYpOworICAgICAgICBpZiAoaW5pdC0+aW5zdGFuY2UpIHsKKyAgICAgICAgICAgIGNrc3RybmNhdChwcmluY19yZWFsbSwiLyIsMjU2KTsKKyAgICAgICAgICAgIGNrc3RybmNhdChwcmluY19yZWFsbSxpbml0LT5pbnN0YW5jZSwyNTYpOworICAgICAgICB9CisgICAgICAgIGlmIChyZWFsbVswXSkgeworICAgICAgICAgIGNrc3RybmNhdChwcmluY19yZWFsbSwiQCIsMjU2KTsKKyAgICAgICAgICBja3N0cm5jYXQocHJpbmNfcmVhbG0scmVhbG0sMjU2KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNvZGUgPSBrcmI1X3BhcnNlX25hbWUgKGtjb250ZXh0LCBwcmluY19yZWFsbSwgJm1lKSkpIHsKKyAgICAgICAgICAgIGNvbV9lcnIoImtyYjVfa2luaXQiLGNvZGUsIndoZW4gcGFyc2luZyBuYW1lIixwcmluY19yZWFsbSk7CisgICAgICAgICAgICBnb3RvIGV4aXRfazVfaW5pdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoY29kZSA9IGtyYjVfdW5wYXJzZV9uYW1lKGtjb250ZXh0LCBtZSwgJmNsaWVudF9uYW1lKSkpIHsKKyAgICAgICAgY29tX2Vycigia3JiNV9raW5pdCIsY29kZSwid2hlbiB1bnBhcnNpbmcgbmFtZSIpOworICAgICAgICBnb3RvIGV4aXRfazVfaW5pdDsKKyAgICB9CisgICAgZGVidWcoRjExMCwia3JiNV9pbml0IGNsaWVudF9uYW1lIixjbGllbnRfbmFtZSwwKTsKKworCisgICAgbWVtc2V0KChjaGFyICopJm15X2NyZWRzLCAwLCBzaXplb2YobXlfY3JlZHMpKTsKKyAgICBteV9jcmVkcy5jbGllbnQgPSBtZTsKKworICAgIGlmIChpbml0LT5zZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKChjb2RlID0KKyAgICAgICAgICAgICBrcmI1X2J1aWxkX3ByaW5jaXBhbF9leHQoa2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihyZWFsbSkscmVhbG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRndG5hbWUubGVuZ3RoLCB0Z3RuYW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihyZWFsbSkscmVhbG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKSkgeworICAgICAgICAgICAgY29tX2Vycigia3JiNV9raW5pdCIsY29kZSwid2hpbGUgYnVpbGRpbmcgc2VydmVyIG5hbWUiKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9pbml0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNvZGUgPSBrcmI1X3BhcnNlX25hbWUoa2NvbnRleHQsIGluaXQtPnNlcnZpY2UsICZzZXJ2ZXIpKSB7CisgICAgICAgICAgICBjb21fZXJyKCJrcmI1X2tpbml0Iixjb2RlLCJ3aGlsZSBwYXJzaW5nIHNlcnZpY2UgbmFtZSIsCisgICAgICAgICAgICAgICAgICAgIGluaXQtPnNlcnZpY2UpOworICAgICAgICAgICAgZ290byBleGl0X2s1X2luaXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBteV9jcmVkcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisKKyAgICBpZiAob3B0aW9ucyAmIEtEQ19PUFRfUE9TVERBVEVEKSB7CisgICAgICAgIG15X2NyZWRzLnRpbWVzLnN0YXJ0dGltZSA9IHN0YXJ0dGltZTsKKyAgICAgICAgbXlfY3JlZHMudGltZXMuZW5kdGltZSA9IHN0YXJ0dGltZSArIGxpZmV0aW1lOworICAgIH0gZWxzZSB7CisgICAgICAgIG15X2NyZWRzLnRpbWVzLnN0YXJ0dGltZSA9IDA7ICAgLyogc3RhcnQgdGltZXIgd2hlbiByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cyB0byBLREMgKi8KKyAgICAgICAgbXlfY3JlZHMudGltZXMuZW5kdGltZSA9IG5vdyArIGxpZmV0aW1lOworICAgIH0KKyAgICBpZiAob3B0aW9ucyAmIEtEQ19PUFRfUkVORVdBQkxFKSB7CisgICAgICAgIG15X2NyZWRzLnRpbWVzLnJlbmV3X3RpbGwgPSBub3cgKyBybGlmZTsKKyAgICB9IGVsc2UKKyAgICAgICAgbXlfY3JlZHMudGltZXMucmVuZXdfdGlsbCA9IDA7CisKKyAgICBpZiAob3B0aW9ucyAmIEtEQ19PUFRfVkFMSURBVEUpIHsKKyAgICAgICAga3JiNV9kYXRhIG91dGJ1ZjsKKworI2lmZGVmIEtSQjVfSEFWRV9HRVRfSU5JVF9DUkVEUworICAgICAgICBjb2RlID0ga3JiNV9nZXRfdmFsaWRhdGVkX2NyZWRzKGtjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZteV9jcmVkcywgbWUsIGNjYWNoZSwgaW5pdC0+c2VydmljZSk7CisgICAgICAgIGlmICggY29kZSA9PSAtMSApCisjZW5kaWYKKyAgICAgICAgeworI2lmZGVmIEhFSU1EQUwKKyAgICAgICAgICAgIHByaW50ZigiP3ZhbGlkYXRlIG5vdCBpbXBsZW1lbnRlZFxyXG4iKTsKKyAgICAgICAgICAgIGNvZGUgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9pbml0OworI2Vsc2UgLyogSEVJTURBTCAqLworICAgICAgICAgICAgY29kZSA9IGtyYjVfdmFsaWRhdGVfdGd0KGtjb250ZXh0LCBjY2FjaGUsIHNlcnZlciwgJm91dGJ1Zik7CisjZW5kaWYgLyogSEVJTURBTCAqLworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlKSB7CisgICAgICAgICAgICBjb21fZXJyKCJrcmI1X2tpbml0Iixjb2RlLCJ2YWxpZGF0aW5nIHRndCIpOworICAgICAgICAgICAgZ290byBleGl0X2s1X2luaXQ7CisgICAgICAgIH0KKyAgICAgICAgLyogc2hvdWxkIGJlIGRvbmUuLi4gKi8KKyAgICAgICAgZ290byBleGl0X2s1X2luaXQ7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMgJiBLRENfT1BUX1JFTkVXKSB7CisgICAgICAgIGtyYjVfZGF0YSBvdXRidWY7CisKKyNpZmRlZiBLUkI1X0hBVkVfR0VUX0lOSVRfQ1JFRFMKKyAgICAgICAgY29kZSA9IGtyYjVfZ2V0X3JlbmV3ZWRfY3JlZHMoa2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZteV9jcmVkcywgbWUsIGNjYWNoZSwgaW5pdC0+c2VydmljZSk7CisgICAgICAgIGlmICggY29kZSA9PSAtMSApCisjZW5kaWYKKyAgICAgICAgeworI2lmZGVmIEhFSU1EQUwKKyAgICAgICAgICAgIHByaW50ZigiP3JlbmV3IG5vdCBpbXBsZW1lbnRlZFxyXG4iKTsKKyAgICAgICAgICAgIGNvZGUgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9pbml0OworI2Vsc2UgLyogSEVJTURBTCAqLworICAgICAgICAgICAgY29kZSA9IGtyYjVfcmVuZXdfdGd0KGtjb250ZXh0LCBjY2FjaGUsIHNlcnZlciwgJm91dGJ1Zik7CisjZW5kaWYgLyogSEVJTURBTCAqLworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlKSB7CisgICAgICAgICAgICBjb21fZXJyKCJrcmI1X2tpbml0Iixjb2RlLCJ3aGlsZSByZW5ld2luZyB0Z3QiKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9pbml0OworICAgICAgICB9CisgICAgICAgIC8qIHNob3VsZCBiZSBkb25lLi4uICovCisgICAgICAgIGdvdG8gc3RvcmVfY3JlZDsKKyAgICB9CisKKyNpZm5kZWYgSEVJTURBTAorICAgIGlmICggaW5pdC0+YWRkcnMgJiYgIWluaXQtPm5vX2FkZHJlc3NlcyApIHsKKyAgICAgICAgLyogY29uc3RydWN0IGFuIGFycmF5IG9mIGtyYjVfYWRkcmVzcyBzdHJ1Y3RzIHRvIHBhc3MgdG8gZ2V0X2luX3RrdCAqLworICAgICAgICAvKiBpbmNsdWRlIGJvdGggdGhlIGxvY2FsIGlwIGFkZHJlc3NlcyBhcyB3ZWxsIGFzIGFueSBvdGhlciB0aGF0ICAgICovCisgICAgICAgIC8qIGFyZSBzcGVjaWZpZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyBpcGFkZHI7CisKKyAgICAgICAgZm9yICggYWRkcl9jb3VudD0wO2FkZHJfY291bnQ8S1JCNV9OVU1fT0ZfQUREUlM7YWRkcl9jb3VudCsrICkKKyAgICAgICAgICAgIGlmICggaW5pdC0+YWRkcnNbYWRkcl9jb3VudF0gPT0gTlVMTCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGFkZHJfY291bnQgPiAwKSB7CisgICAgICAgICAgICBrcmI1X2FkZHJlc3MgKiogbG9jYWxfYWRkcnM9TlVMTDsKKyAgICAgICAgICAgIGtyYjVfb3NfbG9jYWxhZGRyKGtjb250ZXh0LCAmbG9jYWxfYWRkcnMpOworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoIGxvY2FsX2FkZHJzW2ldICkKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBhZGRyX2NvdW50ICs9IGk7CisKKyAgICAgICAgICAgIGFkZHJzID0gKGtyYjVfYWRkcmVzcyAqKikKKyAgICAgICAgICAgICAgbWFsbG9jKChhZGRyX2NvdW50KzEpICogc2l6ZW9mKGtyYjVfYWRkcmVzcyAqKSk7CisgICAgICAgICAgICBpZiAoICFhZGRycyApIHsKKyAgICAgICAgICAgICAgICBrcmI1X2ZyZWVfYWRkcmVzc2VzKGtjb250ZXh0LCBsb2NhbF9hZGRycyk7CisgICAgICAgICAgICAgICAgZ290byBleGl0X2s1X2luaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1zZXQoYWRkcnMsIDAsIHNpemVvZihrcmI1X2FkZHJlc3MgKikgKiAoYWRkcl9jb3VudCsxKSk7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIHdoaWxlICggbG9jYWxfYWRkcnNbaV0gKSB7CisgICAgICAgICAgICAgICAgYWRkcnNbaV0gPSAoa3JiNV9hZGRyZXNzICopbWFsbG9jKHNpemVvZihrcmI1X2FkZHJlc3MpKTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkcnNbaV0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBrcmI1X2ZyZWVfYWRkcmVzc2VzKGtjb250ZXh0LCBsb2NhbF9hZGRycyk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9pbml0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFkZHJzW2ldLT5tYWdpYyA9IGxvY2FsX2FkZHJzW2ldLT5tYWdpYzsKKyAgICAgICAgICAgICAgICBhZGRyc1tpXS0+YWRkcnR5cGUgPSBsb2NhbF9hZGRyc1tpXS0+YWRkcnR5cGU7CisgICAgICAgICAgICAgICAgYWRkcnNbaV0tPmxlbmd0aCA9IGxvY2FsX2FkZHJzW2ldLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgYWRkcnNbaV0tPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MoYWRkcnNbaV0tPmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFhZGRyc1tpXS0+Y29udGVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAga3JiNV9mcmVlX2FkZHJlc3NlcyhrY29udGV4dCwgbG9jYWxfYWRkcnMpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXRfazVfaW5pdDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoYWRkcnNbaV0tPmNvbnRlbnRzLGxvY2FsX2FkZHJzW2ldLT5jb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2FkZHJzW2ldLT5sZW5ndGgpOyAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtyYjVfZnJlZV9hZGRyZXNzZXMoa2NvbnRleHQsIGxvY2FsX2FkZHJzKTsKKworICAgICAgICAgICAgZm9yICggaj0wO2k8YWRkcl9jb3VudDtpKyssaisrICkgeworICAgICAgICAgICAgICAgIGFkZHJzW2ldID0gKGtyYjVfYWRkcmVzcyAqKW1hbGxvYyhzaXplb2Yoa3JiNV9hZGRyZXNzKSk7CisgICAgICAgICAgICAgICAgaWYgKGFkZHJzW2ldID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9pbml0OworCisgICAgICAgICAgICAgICAgYWRkcnNbaV0tPm1hZ2ljID0gS1Y1TV9BRERSRVNTOworICAgICAgICAgICAgICAgIGFkZHJzW2ldLT5hZGRydHlwZSA9IEFGX0lORVQ7CisgICAgICAgICAgICAgICAgYWRkcnNbaV0tPmxlbmd0aCA9IDQ7CisgICAgICAgICAgICAgICAgYWRkcnNbaV0tPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MoYWRkcnNbaV0tPmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFhZGRyc1tpXS0+Y29udGVudHMpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9pbml0OworCisgICAgICAgICAgICAgICAgaXBhZGRyID0gaW5ldF9hZGRyKGluaXQtPmFkZHJzW2pdKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYWRkcnNbaV0tPmNvbnRlbnRzLCZpcGFkZHIsNCk7ICAgLyogc2FmZSAqLworICAgICAgICAgICAgfQorI2lmZGVmIEtSQjVfSEFWRV9HRVRfSU5JVF9DUkVEUworICAgICAgICAgICAga3JiNV9nZXRfaW5pdF9jcmVkc19vcHRfc2V0X2FkZHJlc3NfbGlzdCgmb3B0cyxhZGRycyk7CisjZW5kaWYKKyAgICAgICAgfQorICAgICB9CisjZW5kaWYgLyogIUhFSU1EQUwgKi8KKyNpZmRlZiBLUkI1X0hBVkVfR0VUX0lOSVRfQ1JFRFMKKyAgICBpZiAoIGluaXQtPm5vX2FkZHJlc3NlcyApCisgICAgICAgIGtyYjVfZ2V0X2luaXRfY3JlZHNfb3B0X3NldF9hZGRyZXNzX2xpc3QoJm9wdHMsTlVMTCk7CisjZW5kaWYKKworI2lmbmRlZiBOT19LRVlUQUIKKyAgICBpZiAoIXVzZV9rZXl0YWIpCisjZW5kaWYKKyAgICB7CisgICAgICAgIGlmICggaW5pdC0+cGFzc3dvcmQgKSB7CisgICAgICAgICAgICBwd3NpemUgPSBzdHJsZW4oaW5pdC0+cGFzc3dvcmQpOworICAgICAgICAgICAgaWYgKCBwd3NpemUgKQorICAgICAgICAgICAgICAgIHBhc3N3b3JkID0gaW5pdC0+cGFzc3dvcmQ7CisgICAgICAgIH0gZWxzZSBpZiAoaW5pdC0+Z2V0azQgJiYgazRfaW5pdCkgeworICAgICAgICAgICAgLyogV2hlbiB3ZSBhcmUgcmVxdWVzdGluZyB0aGF0IEs0IHRpY2tldHMgYmUgYXV0b21hdGljYWxseSAqLworICAgICAgICAgICAgLyogYWNxdWlyZWQgd2hlbiBLNSB0aWNrZXRzIGFyZSBhY3F1aXJlZCwgd2UgbXVzdCBnZXQgdGhlICAqLworICAgICAgICAgICAgLyogcGFzc3dvcmQgdXAgZnJvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgY2hhciBwcm1wdFsyNTZdOworICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBrNXBycHJvbXB0OworICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBrNXB3cHJvbXB0OworICAgICAgICAgICAgaW50IG9rID0gMDsKKworICAgICAgICAgICAgaWYgKCBrNXB3cHJvbXB0ICYmIGs1cHdwcm9tcHRbMF0gJiYKKyAgICAgICAgICAgICAgICAgKHN0cmxlbihrNXB3cHJvbXB0KSArIHN0cmxlbihwcmluY2lwYWwpICsKKyAgICAgICAgICAgICAgICAgIHN0cmxlbihyZWFsbSkgLSA0KSA8IHNpemVvZihwcm1wdCkpIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHBybXB0LGs1cHdwcm9tcHQscHJpbmNpcGFsLHJlYWxtKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGNrbWFreG1zZyhwcm1wdCxzaXplb2YocHJtcHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgazVwd3Byb21wdCAmJiBrNXB3cHJvbXB0WzBdID8gazVwd3Byb21wdCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2VyYmVyb3MgNSBQYXNzd29yZCBmb3IgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW5jaXBhbCwiQCIscmVhbG0sIjogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBvayA9IHVxX3R4dChOVUxMLHBybXB0LDIsTlVMTCxwYXNzd2QsODAsTlVMTCxERUZBVUxUX1VRX1RJTUVPVVQpOworICAgICAgICAgICAgaWYgKCBvayApCisgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBwYXNzd2Q7CisKKyAgICAgICAgICAgIGlmICggazRfaW5pdC0+cGFzc3dvcmQgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgbWFrZXN0cigmazRfaW5pdC0+cGFzc3dvcmQscGFzc3dkKTsKKyAgICAgICAgfQorI2lmZGVmIEtSQjVfSEFWRV9HRVRfSU5JVF9DUkVEUworICAgICAgICBkZWJ1ZyhGMTAwLCJrcmI1X2luaXQgY2FsbGluZyBrcmI1X2dldF9pbml0X2NyZWRzX3Bhc3N3b3JkKCkiLCIiLDApOworI2lmZGVmIE9TMgorICAgICAgICBpZiAoIGlzX05STF9LUkI1KCkgKQorICAgICAgICAgICAgY29kZSA9IGtyYjVfZ2V0X2luaXRfY3JlZHNfcGFzc3dvcmQoa2NvbnRleHQsICZteV9jcmVkcywgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilja19OUkxfa3JiNV9wcm9tcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dGltZSwgaW5pdC0+c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0cyk7CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIGNvZGUgPSBrcmI1X2dldF9pbml0X2NyZWRzX3Bhc3N3b3JkKGtjb250ZXh0LCAmbXlfY3JlZHMsIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrX2tyYjVfcHJvbXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHRpbWUsIGluaXQtPnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdHMpOworICAgICAgICBkZWJ1ZyhGMTExLCJrcmI1X2luaXQiLCJrcmI1X2dldF9pbml0X2NyZWRzX3Bhc3N3b3JkKCkiLGNvZGUpOworCisgICAgICAgIGlmICggY29kZSA9PSAtMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghcGFzc3dvcmQpIHsKKyAgICAgICAgICAgICAgICBjaGFyIHBybXB0WzI1Nl07CisgICAgICAgICAgICAgICAgaW50IG9rOworCisgICAgICAgICAgICAgICAgY2ttYWttc2cocHJtcHQsc2l6ZW9mKHBybXB0KSwiS2VyYmVyb3MgNSBQYXNzd29yZCBmb3IgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X25hbWUsIjogIixOVUxMKTsKKyAgICAgICAgICAgICAgICBvayA9IHVxX3R4dChOVUxMLHBybXB0LDIsTlVMTCxwYXNzd2QsODAsTlVMTCwKKwkJCSAgICBERUZBVUxUX1VRX1RJTUVPVVQpOworICAgICAgICAgICAgICAgIGlmICggb2sgKQorICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCA9IHBhc3N3ZDsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IC0yOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXRfazVfaW5pdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggIXBhc3N3b3JkICkgCisgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSAiIjsKKyAgICAgICAgICAgIGNvZGUgPSBrcmI1X2dldF9pbl90a3Rfd2l0aF9wYXNzd29yZChrY29udGV4dCwgb3B0aW9ucywKKyNpZmRlZiBIRUlNREFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisjZWxzZSAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQtPm5vX2FkZHJlc3NlcyA/IE5VTEwgOmFkZHJzLAorI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZteV9jcmVkcywgTlVMTCk7CisgICAgICAgICAgICBpZiAoIGNvZGUgKQorICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImtyYjVfaW5pdCIsImtyYjVfZ2V0X2luX3RrdF93aXRoX3Bhc3N3b3JkKCkiLGNvZGUpOworICAgICAgICB9CisjZWxzZSAvKiBLUkI1X0hBVkVfR0VUX0lOSVRfQ1JFRFMgKi8KKyAgICAgICAgaWYgKCFwYXNzd29yZCkgeworICAgICAgICAgICAgY2hhciBwcm1wdFsyNTZdOworICAgICAgICAgICAgaW50IG9rOworCisgICAgICAgICAgICBja21ha21zZyhwcm1wdCxzaXplb2YocHJtcHQpLCJLZXJiZXJvcyA1IFBhc3N3b3JkIGZvciAiLAorICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9uYW1lLCI6ICIsTlVMTCk7CisgICAgICAgICAgICBvayA9IHVxX3R4dChOVUxMLHBybXB0LDIsTlVMTCxwYXNzd2QsODAsTlVMTCxERUZBVUxUX1VRX1RJTUVPVVQpOworICAgICAgICAgICAgaWYgKCBvayApCisgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBwYXNzd2Q7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb2RlID0gLTI7CisgICAgICAgICAgICAgICAgZ290byBleGl0X2s1X2luaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhcGFzc3dvcmQgKSAKKyAgICAgICAgICAgIHBhc3N3b3JkID0gIiI7CisgICAgICAgIGNvZGUgPSBrcmI1X2dldF9pbl90a3Rfd2l0aF9wYXNzd29yZChrY29udGV4dCwgb3B0aW9ucywKKyNpZmRlZiBIRUlNREFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyNlbHNlIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC0+bm9fYWRkcmVzc2VzID8gTlVMTCA6YWRkcnMsCisjZW5kaWYgLyogSEVJTURBTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJm15X2NyZWRzLCBOVUxMKTsKKyAgICAgICAgaWYgKCBjb2RlICkKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImtyYjVfaW5pdCIsImtyYjVfZ2V0X2luX3RrdF93aXRoX3Bhc3N3b3JkKCkiLGNvZGUpOworI2VuZGlmIC8qIEtSQjVfSEFWRV9HRVRfSU5JVF9DUkVEUyAqLworCisgICAgICAgIGlmICggaW5pdC0+cGFzc3dvcmQgJiYgcHdzaXplID4gMCApCisgICAgICAgICAgICBtZW1zZXQoaW5pdC0+cGFzc3dvcmQsIDAsIHB3c2l6ZSk7CisgICAgICAgIG1lbXNldChwYXNzd2QsMCw4MCk7CisgICAgfQorI2lmbmRlZiBOT19LRVlUQUIKKyAgICBlbHNlIHsKKyNpZmRlZiBLUkI1X0hBVkVfR0VUX0lOSVRfQ1JFRFMKKyAgICAgICAgY29kZSA9IGtyYjVfZ2V0X2luaXRfY3JlZHNfa2V5dGFiKGtjb250ZXh0LCAmbXlfY3JlZHMsIG1lLCBrZXl0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR0aW1lLCBpbml0LT5zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRzKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgaWYgKCBjb2RlID09IC0xKQorICAgICAgICAgICAgY29kZSA9IGtyYjVfZ2V0X2luX3RrdF93aXRoX2tleXRhYihrY29udGV4dCwgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LT5ub19hZGRyZXNzZXMgPyBOVUxMIDphZGRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIGtleXRhYiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZteV9jcmVkcywgMCk7CisjZW5kaWYgLyogT1MyICovCisjZWxzZSAvKiBLUkI1X0hBVkVfR0VUX0lOSVRfQ1JFRFMgKi8KKyAgICAgICAgY29kZSA9IGtyYjVfZ2V0X2luX3RrdF93aXRoX2tleXRhYihrY29udGV4dCwgb3B0aW9ucywKKyNpZmRlZiBIRUlNREFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisjZWxzZSAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQtPm5vX2FkZHJlc3NlcyA/IE5VTEwgOmFkZHJzLAorI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwga2V5dGFiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXlfY3JlZHMsIDApOworI2VuZGlmIC8qIEtSQjVfSEFWRV9HRVRfSU5JVF9DUkVEUyAqLworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGNvZGUpIHsKKyAgICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgS1JCNUtSQl9BUF9FUlJfQkFEX0lOVEVHUklUWToKKyAgICAgICAgICAgIHByaW50ZigiUGFzc3dvcmQgaW5jb3JyZWN0XHJcbiIpOworICAgICAgICAgICAgZ290byBleGl0X2s1X2luaXQ7CisgICAgICAgIGNhc2UgS1JCNUtSQl9BUF9FUlJfVjRfUkVQTFk6CisgICAgICAgICAgICBpZiAoaW5pdC0+Z2V0azQgJiYgazRfaW5pdCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiS2VyYmVyb3MgNSBUaWNrZXRzIG5vdCBzdXBwb3J0IGJ5IHNlcnZlci4gICIpOworICAgICAgICAgICAgICAgIHByaW50ZigiQSB2ZXJzaW9uIDQgVGlja2V0IHdpbGwgYmUgcmVxdWVzdGVkLlxyXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9pbml0OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBleGl0X2s1X2luaXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgc3RvcmVfY3JlZDoKKyAgICBkZWJ1ZyhGMTAwLCJrcmI1X2luaXQgY2FsbGluZyBrcmI1X2NjX2luaXRpYWxpemUoKSIsIiIsMCk7CisKKyAgICBjb2RlID0ga3JiNV9jY19pbml0aWFsaXplIChrY29udGV4dCwgY2NhY2hlLCBtZSk7CisgICAgaWYgKCBjb2RlID09IEtSQjVfQ0NfQkFETkFNRSApIHsKKyAgICAgICAgLyogVGhpcyBpcyBhIHJlYWxseSB1Z2x5IGhhY2sgdGhhdCBzaG91bGQgbm90IGhhdmUgdG8gYmUgaGVyZS4KKyAgICAgICAgICoga3JiNV9jY19pbml0aWFsaXplIHNob3VsZCBub3QgZmFpbCB3aXRoIGFuIGVycm9yIGlmIHRoZQorICAgICAgICAgKiBjYWNoZSBhbHJlYWR5IGV4aXN0cy4gIFRoZSByZWFzb24gdGhlIHByb2JsZW0gaXMgb2NjdXJpbmcKKyAgICAgICAgICogaXMgdGhhdCB0aGUga3JiNSBsaWJyYXJ5IGlzIG5vIGxvbmdlciBjYWxsaW5nIGNjX2Rlc3Ryb3koKQorICAgICAgICAgKiB3aGVuIGNjX2luaXRpYWxpemUoKSBpcyBjYWxsZWQgYW5kIHRoZSBDQ0FQSSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgKiBvbiBXaW5kb3dzIGhhcyBub3QgeWV0IGJlZW4gY29ycmVjdGVkIHRvIGhhbmRsZSBpdC4gIFRvCisgICAgICAgICAqIGVuc3VyZSB0aGF0IEs5NSB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBib3RoIHdlIHdpbGwgY2FsbAorICAgICAgICAgKiBjY19kZXN0cm95KCkgaWYgdGhlIGNjX2luaXRpYWxpemUoKSBjYWxsIGZhaWxzIHdpdGggYSBCQUROQU1FCisgICAgICAgICAqIGVycm9yLiAgSWYgdGhlIGNjX2Rlc3Ryb3koKSBpcyBzdWNjZXNzZnVsLCB3ZSB3aWxsIHRyeSBhZ2Fpbi4KKyAgICAgICAgICovCisKKyAgICAgICAgZGVidWcoRjEwMCwia3JiNV9pbml0IGNhbGxpbmcga3JiNV9jY19kZXN0cm95KCkiLCIiLDApOworICAgICAgICBjb2RlID0ga3JiNV9jY19kZXN0cm95IChrY29udGV4dCwgY2NhY2hlKTsKKyAgICAgICAgaWYgKCAhY29kZSApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsImtyYjVfaW5pdCBjYWxsaW5nIGs1X2dldF9jY2FjaGUoKSIsIiIsMCk7CisgICAgICAgICAgICBjb2RlID0gazVfZ2V0X2NjYWNoZShrY29udGV4dCwmY2NhY2hlLG9wLT5jYWNoZSk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJrcmI1X2luaXQgY2FsbGluZyBrcmI1X2NjX2luaXRpYWxpemUoKSIsIiIsMCk7CisgICAgICAgICAgICBjb2RlID0ga3JiNV9jY19pbml0aWFsaXplIChrY29udGV4dCwgY2NhY2hlLCBtZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgY29kZSA9IEtSQjVfQ0NfQkFETkFNRTsKKyAgICB9CisgICAgaWYgKGNvZGUpIHsKKyAgICAgICAgY29tX2Vycigia3JiNV9raW5pdCIsY29kZSwid2hlbiBpbml0aWFsaXppbmcgY2FjaGUiLG9wLT5jYWNoZSk7CisgICAgICAgIGdvdG8gZXhpdF9rNV9pbml0OworICAgIH0KKworICAgIGRlYnVnKEYxMDAsImtyYjVfaW5pdCBjYWxsaW5nIGtyYjVfY2Nfc3RvcmVfY3JlZCgpIiwiIiwwKTsKKyAgICBjb2RlID0ga3JiNV9jY19zdG9yZV9jcmVkKGtjb250ZXh0LCBjY2FjaGUsICZteV9jcmVkcyk7CisgICAgaWYgKGNvZGUpIHsKKyAgICAgICAgY29tX2Vycigia3JiNV9raW5pdCIsY29kZSwid2hpbGUgc3RvcmluZyBjcmVkZW50aWFscyIpOworICAgICAgICBnb3RvIGV4aXRfazVfaW5pdDsKKyAgICB9CisKKyAgICBpZiAoIGluaXQtPmdldGs0ICYmIAorI2lmZGVmIEtSQjUyNF9DT05WCisgICAgICAgICAhdHJ5X2NvbnZlcnQ1MjQoa2NvbnRleHQsbWUsY2NhY2hlKSAmJiAKKyNlbmRpZiAvKiBLUkI1MjRfQ09OViAqLworICAgICAgICAgazRfaW5pdCApIHsKKyAgICAgICAgaW50IGs0cmMgPSBja19rcmI0X2luaXRUR1Qob3AsazRfaW5pdCk7CisgICAgICAgIGlmIChrNHJjIDwgMCkKKyAgICAgICAgICAgIGNvZGUgPSAtMzsKKyAgICB9CisKK2V4aXRfazVfaW5pdDoKKyAgICBkZWJ1ZyhGMTAwLCJrcmI1X2luaXQgZXhpdF9rNV9pbml0IiwiIiwwKTsKKworI2lmbmRlZiBIRUlNREFMCisgICAgLyogRnJlZSBrcmI1X2FkZHJlc3Mgc3RydWN0dXJlcyBpZiB3ZSBjcmVhdGVkIHRoZW0gKi8KKyAgICBpZiAoIGFkZHJzICkgeworICAgICAgICBmb3IgKCBpPTA7aTxhZGRyX2NvdW50O2krKyApIHsKKyAgICAgICAgICAgIGlmICggYWRkcnNbaV0gKSB7CisgICAgICAgICAgICAgICAgaWYgKCBhZGRyc1tpXS0+Y29udGVudHMgKQorICAgICAgICAgICAgICAgICAgICBmcmVlKGFkZHJzW2ldLT5jb250ZW50cyk7CisgICAgICAgICAgICAgICAgZnJlZShhZGRyc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogSEVJTURBTCAqLworCisKKyAgICBrcmI1X2Vycm5vID0gY29kZTsKKyAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxrcmI1X2Vycm5vID8gZXJyb3JfbWVzc2FnZShrcmI1X2Vycm5vKSA6ICJPSyIpOworCisgICAgaWYgKGNsaWVudF9uYW1lKQorICAgICAgICBrcmI1X2ZyZWVfdW5wYXJzZWRfbmFtZShrY29udGV4dCwgY2xpZW50X25hbWUpOworCisgICAgLyogbXlfY3JlZHMgaXMgcG9pbnRpbmcgYXQgc2VydmVyICovCisgICAgZGVidWcoRjEwMCwia3JiNV9pbml0IGNhbGxpbmcga3JiNV9mcmVlX3ByaW5jaXBhbCgpIiwiIiwwKTsKKyAgICBrcmI1X2ZyZWVfcHJpbmNpcGFsKGtjb250ZXh0LCBzZXJ2ZXIpOworICAgIGRlYnVnKEYxMDAsImtyYjVfaW5pdCBjYWxsaW5nIGtyYjVfY2NfY2xvc2UoKSIsIiIsMCk7CisgICAga3JiNV9jY19jbG9zZShrY29udGV4dCxjY2FjaGUpOworICAgIGRlYnVnKEYxMDAsImtyYjVfaW5pdCBjYWxsaW5nIGtyYjVfZnJlZV9jb250ZXh0KCkiLCIiLDApOworICAgIGtyYjVfZnJlZV9jb250ZXh0KGtjb250ZXh0KTsKKworICAgIGlmIChjb2RlICE9IC0yKQorICAgICAgICBwcmludGYoIlJlc3VsdCBmcm9tIHJlYWxtICVzOiAlc1xyXG4iLHJlYWxtLAorICAgICAgICAgICAgICAgIGNvZGU9PS0zPyJVbmFibGUgdG8gcmV0cmlldmUgS2VyYmVyb3MgSVYgY3JlZGVudGlhbHMiOgorICAgICAgICAgICAgICAgIGNvZGU/ZXJyb3JfbWVzc2FnZShjb2RlKToiT0siKTsKKyAgICByZXR1cm4oY29kZT8tMTowKTsKK30KKworI2lmbmRlZiBIRUlNREFMCisjZGVmaW5lIFZBTElEQVRFIDAKKyNkZWZpbmUgUkVORVcgMQorCisvKiBzdHJpcHBlZCBkb3duIHZlcnNpb24gb2Yga3JiNV9ta19yZXEgKi8KK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUKKyNpZmRlZiBDS19BTlNJQwora3JiNV92YWxpZGF0ZV90Z3QoIGtyYjVfY29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgIGtyYjVfY2NhY2hlIGNjYWNoZSwKKyAgICAgICAgICAgICAgICAgICBrcmI1X3ByaW5jaXBhbCAgICAgc2VydmVyLCAvKiB0Z3RuYW1lICovCisgICAgICAgICAgICAgICAgICAga3JiNV9kYXRhICpvdXRidWYgKQorI2Vsc2UKK2tyYjVfdmFsaWRhdGVfdGd0KGNvbnRleHQsIGNjYWNoZSwgc2VydmVyLCBvdXRidWYpCisgICAgIGtyYjVfY29udGV4dCBjb250ZXh0OworICAgICBrcmI1X2NjYWNoZSBjY2FjaGU7CisgICAgIGtyYjVfcHJpbmNpcGFsICAgICBzZXJ2ZXI7IC8qIHRndG5hbWUgKi8KKyAgICAga3JiNV9kYXRhICpvdXRidWY7CisjZW5kaWYKK3sKKyAgICByZXR1cm4ga3JiNV90Z3RfZ2VuKGNvbnRleHQsIGNjYWNoZSwgc2VydmVyLCBvdXRidWYsIFZBTElEQVRFKTsKK30KKworLyogc3RyaXBwZWQgZG93biB2ZXJzaW9uIG9mIGtyYjVfbWtfcmVxICovCitzdGF0aWMga3JiNV9lcnJvcl9jb2RlCisjaWZkZWYgQ0tfQU5TSUMKK2tyYjVfcmVuZXdfdGd0KGtyYjVfY29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgIGtyYjVfY2NhY2hlIGNjYWNoZSwKKyAgICAgICAgICAgICAgICBrcmI1X3ByaW5jaXBhbCAgICBzZXJ2ZXIsIC8qIHRndG5hbWUgKi8KKyAgICAgICAgICAgICAgICBrcmI1X2RhdGEgKm91dGJ1ZikKKyNlbHNlCitrcmI1X3JlbmV3X3RndChjb250ZXh0LCBjY2FjaGUsIHNlcnZlciwgb3V0YnVmKQorICAgICBrcmI1X2NvbnRleHQgY29udGV4dDsKKyAgICAga3JiNV9jY2FjaGUgY2NhY2hlOworICAgICBrcmI1X3ByaW5jaXBhbCAgICAgICBzZXJ2ZXI7IC8qIHRndG5hbWUgKi8KKyAgICAga3JiNV9kYXRhICpvdXRidWY7CisjZW5kaWYKK3sKKyAgICByZXR1cm4ga3JiNV90Z3RfZ2VuKGNvbnRleHQsIGNjYWNoZSwgc2VydmVyLCBvdXRidWYsIFJFTkVXKTsKK30KKworCisvKiBzdHJpcHBlZCBkb3duIHZlcnNpb24gb2Yga3JiNV9ta19yZXEgKi8KK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUKKyNpZmRlZiBDS19BTlNJQwora3JiNV90Z3RfZ2VuKGtyYjVfY29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICBrcmI1X2NjYWNoZSBjY2FjaGUsCisgICAgICAgICAgICAgIGtyYjVfcHJpbmNpcGFsICAgICAgc2VydmVyLCAvKiB0Z3RuYW1lICovCisgICAgICAgICAgICAgIGtyYjVfZGF0YSAqb3V0YnVmLAorICAgICAgICAgICAgICBpbnQgb3B0KQorI2Vsc2UKK2tyYjVfdGd0X2dlbihjb250ZXh0LCBjY2FjaGUsIHNlcnZlciwgb3V0YnVmLCBvcHQpCisgICAgIGtyYjVfY29udGV4dCBjb250ZXh0OworICAgICBrcmI1X2NjYWNoZSBjY2FjaGU7CisgICAgIGtyYjVfcHJpbmNpcGFsICAgICAgIHNlcnZlcjsgLyogdGd0bmFtZSAqLworICAgICBrcmI1X2RhdGEgKm91dGJ1ZjsKKyAgICAgaW50IG9wdDsKKyNlbmRpZgoreworICAgIGtyYjVfZXJyb3JfY29kZSAgICAgICByZXR2YWw7CisgICAga3JiNV9jcmVkcyAgICAgICAgICAqIGNyZWRzcDsKKyAgICBrcmI1X2NyZWRzICAgICAgICAgICAgY3JlZHM7CisKKyAgICAvKiBvYnRhaW4gdGlja2V0ICYgc2Vzc2lvbiBrZXkgKi8KKyAgICBtZW1zZXQoKGNoYXIgKikmY3JlZHMsIDAsIHNpemVvZihjcmVkcykpOworICAgIGlmICgocmV0dmFsID0ga3JiNV9jb3B5X3ByaW5jaXBhbChjb250ZXh0LCBzZXJ2ZXIsICZjcmVkcy5zZXJ2ZXIpKSkKKyAgICAgICAgZ290byBjbGVhbnVwOworCisgICAgaWYgKChyZXR2YWwgPSBrcmI1X2NjX2dldF9wcmluY2lwYWwoY29udGV4dCwgY2NhY2hlLCAmY3JlZHMuY2xpZW50KSkpCisgICAgICAgIGdvdG8gY2xlYW51cF9jcmVkczsKKworICAgIGlmIChvcHQgPT0gVkFMSURBVEUpIHsKKyAgICAgICAgaWYgKChyZXR2YWwgPSBrcmI1X2dldF9jcmVkZW50aWFsc192YWxpZGF0ZShjb250ZXh0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjYWNoZSwgJmNyZWRzLCAmY3JlZHNwKSkpCisgICAgICAgICAgZ290byBjbGVhbnVwX2NyZWRzOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgocmV0dmFsID0ga3JiNV9nZXRfY3JlZGVudGlhbHNfcmVuZXcoY29udGV4dCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2FjaGUsICZjcmVkcywgJmNyZWRzcCkpKQorICAgICAgICAgIGdvdG8gY2xlYW51cF9jcmVkczsKKyAgICB9CisKKyAgICAvKiB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGRvIHRoZSBta19yZXEsIGp1c3QgZ2V0IHRoZSBjcmVkcy4gKi8KK2NsZWFudXBfY3JlZHM6CisgICAga3JiNV9mcmVlX2NyZWRfY29udGVudHMoY29udGV4dCwgJmNyZWRzKTsKKworY2xlYW51cDoKKworICAgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYgLyogSEVJTURBTCAqLworI2VuZGlmIC8qIEtJTklUICovCisjaWZkZWYgS0RFU1RST1kKK2ludAorI2lmZGVmIENLX0FOU0lDCitja19rcmI1X2Rlc3Ryb3koc3RydWN0IGtyYl9vcF9kYXRhICogb3ApCisjZWxzZQorY2tfa3JiNV9kZXN0cm95KG9wKSBzdHJ1Y3Qga3JiX29wX2RhdGEgKiBvcDsKKyNlbmRpZgoreworICAgIGtyYjVfY29udGV4dCBrY29udGV4dDsKKyAgICBrcmI1X2Vycm9yX2NvZGUgcmV0dmFsOworICAgIGludCBjOworICAgIGtyYjVfY2NhY2hlIGNjYWNoZSA9IE5VTEw7CisgICAgY2hhciAqY2FjaGVfbmFtZSA9IE5VTEw7CisgICAgaW50IGNvZGU7CisgICAgaW50IGVycmZsZz0wOworICAgIGludCBxdWlldCA9IDA7CisKKyAgICBpZiAoICFja19rcmI1X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIGNvZGUgPSBrcmI1X2luaXRfY29udGV4dCgma2NvbnRleHQpOworICAgIGlmIChjb2RlKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfZGVzdHJveSB3aGlsZSBpbml0aWFsaXppbmcga3JiNSIsIiIsY29kZSk7CisgICAgICAgIGtyYjVfZXJybm8gPSBjb2RlOworICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJvcl9tZXNzYWdlKGtyYjVfZXJybm8pKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBjb2RlID0gazVfZ2V0X2NjYWNoZShrY29udGV4dCwmY2NhY2hlLG9wLT5jYWNoZSk7CisgICAgaWYgKGNvZGUgIT0gMCkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X2Rlc3Ryb3kgd2hpbGUgZ2V0dGluZyBjY2FjaGUiLAorICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgIGtyYjVfZnJlZV9jb250ZXh0KGtjb250ZXh0KTsKKyAgICAgICAga3JiNV9lcnJubyA9IGNvZGU7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGVycm9yX21lc3NhZ2Uoa3JiNV9lcnJubykpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIGNvZGUgPSBrcmI1X2NjX2Rlc3Ryb3kgKGtjb250ZXh0LCBjY2FjaGUpOworICAgIGlmIChjb2RlICE9IDApIHsKKyAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV9kZXN0cm95IHdoaWxlIGRlc3Ryb3lpbmcgY2FjaGUiLCIiLGNvZGUpOworICAgICAgICBpZiAoIGNvZGUgPT0gS1JCNV9GQ0NfTk9GSUxFICkKKyAgICAgICAgICAgIHByaW50ZigiTm8gdGlja2V0IGNhY2hlIHRvIGRlc3Ryb3kuXHJcbiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoIlRpY2tldCBjYWNoZSBOT1QgZGVzdHJveWVkIVxyXG4iKTsKKyAgICAgICAga3JiNV9jY19jbG9zZShrY29udGV4dCxjY2FjaGUpOworICAgICAgICBrcmI1X2ZyZWVfY29udGV4dChrY29udGV4dCk7CisgICAgICAgIGtyYjVfZXJybm8gPSBjb2RlOworICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJvcl9tZXNzYWdlKGtyYjVfZXJybm8pKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBwcmludGYoIlRpY2tldHMgZGVzdHJveWVkLlxyXG4iKTsKKyAgICAvKiBEbyBub3QgY2FsbCBrcmI1X2NjX2Nsb3NlKCkgYmVjYXVzZSBjYWNoZSBoYXMgYmVlbiBkZXN0cm95ZWQgKi8KKyAgICBrcmI1X2ZyZWVfY29udGV4dChrY29udGV4dCk7CisgICAga3JiNV9lcnJubyA9IDA7CisgICAgbWFrZXN0cigma3JiNV9lcnJtc2csIk9LIik7CisgICAgcmV0dXJuICgwKTsKK30KKyNlbHNlIC8qIEtERVNUUk9ZICovCisjaWZkZWYgS1JCNQoraW50CisjaWZkZWYgQ0tfQU5TSUMKK2NrX2tyYjVfZGVzdHJveShzdHJ1Y3Qga3JiX29wX2RhdGEgKiBvcCkKKyNlbHNlCitja19rcmI1X2Rlc3Ryb3kob3ApIHN0cnVjdCBrcmJfb3BfZGF0YSAqIG9wOworI2VuZGlmCit7CisgICAgcHJpbnRmKCI/Tm90IGltcGxlbWVudGVkLlxyXG4iKTsKKyAgICByZXR1cm4oLTEpOworfQorI2VuZGlmIC8qIEtSQjUgKi8KKyNlbmRpZiAvKiBLREVTVFJPWSAqLworI2lmbmRlZiBLTElTVAorI2lmZGVmIEtSQjUKK2ludAorI2lmZGVmIENLX0FOU0lDCitja19rcmI1X2xpc3RfY3JlZHMoc3RydWN0IGtyYl9vcF9kYXRhICogb3AsIHN0cnVjdCBrcmI1X2xpc3RfY3JlZF9kYXRhICogbGMpCisjZWxzZQorY2tfa3JiNV9saXN0X2NyZWRzKG9wLGxjKQorICAgIHN0cnVjdCBrcmJfb3BfZGF0YSAqIG9wOyBzdHJ1Y3Qga3JiNV9saXN0X2NyZWRfZGF0YSAqIGxjOworI2VuZGlmCit7CisgICAgcHJpbnRmKCI/Tm90IGltcGxlbWVudGVkLlxyXG4iKTsKKyAgICByZXR1cm4oLTEpOworfQorI2VuZGlmIC8qIEtSQjUgKi8KKyNlbHNlIC8qIEtMSVNUICovCitzdGF0aWMgaW50IHNob3dfZmxhZ3MgPSAwLCBzaG93X3RpbWUgPSAwLCBzdGF0dXNfb25seSA9IDAsIHNob3dfa2V5cyA9IDA7CitzdGF0aWMgaW50IHNob3dfZXR5cGUgPSAwLCBzaG93X2FkZHIgPSAwOworc3RhdGljIGNoYXIgKmRlZm5hbWU7CitzdGF0aWMgY2hhciAqcHJvZ25hbWU7CitzdGF0aWMga3JiNV9pbnQzMiBub3c7CitzdGF0aWMgaW50IHRpbWVzdGFtcF93aWR0aDsKKworX1BST1RPVFlQKHN0YXRpYyBjaGFyICogZXR5cGVfc3RyaW5nLCAoa3JiNV9lbmN0eXBlICkpOworX1BST1RPVFlQKHN0YXRpYyB2b2lkIHNob3dfY3JlZGVudGlhbCwoa3JiNV9jb250ZXh0LGtyYjVfY3JlZHMgKikpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgZG9fY2NhY2hlLCAoa3JiNV9jb250ZXh0LGNoYXIgKikpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgZG9fa2V5dGFiLCAoa3JiNV9jb250ZXh0LGNoYXIgKikpOworX1BST1RPVFlQKHN0YXRpYyB2b2lkIHByaW50dGltZSwgKHRpbWVfdCkpOworX1BST1RPVFlQKHN0YXRpYyB2b2lkIGZpbGxpdCwgKGludCwgaW50KSk7CisKKyNkZWZpbmUgREVGQVVMVCAwCisjZGVmaW5lIENDQUNIRSAxCisjZGVmaW5lIEtFWVRBQiAyCisKK2ludAorI2lmZGVmIENLX0FOU0lDCitja19rcmI1X2xpc3RfY3JlZHMoc3RydWN0IGtyYl9vcF9kYXRhICogb3AsIHN0cnVjdCBrcmI1X2xpc3RfY3JlZF9kYXRhICogbGMpCisjZWxzZQorY2tfa3JiNV9saXN0X2NyZWRzKG9wLGxjKQorICAgIHN0cnVjdCBrcmJfb3BfZGF0YSAqIG9wOyBzdHJ1Y3Qga3JiNV9saXN0X2NyZWRfZGF0YSAqIGxjOworI2VuZGlmCit7CisgICAga3JiNV9jb250ZXh0IGtjb250ZXh0OworICAgIGtyYjVfZXJyb3JfY29kZSByZXR2YWw7CisgICAgaW50IGNvZGU7CisgICAgY2hhciAqbmFtZSA9IG9wLT5jYWNoZTsKKyAgICBpbnQgbW9kZTsKKworICAgIGlmICggIWNrX2tyYjVfaXNfaW5zdGFsbGVkKCkgKQorICAgICAgICByZXR1cm4oLTEpOworCisgICAgY29kZSA9IGtyYjVfaW5pdF9jb250ZXh0KCZrY29udGV4dCk7CisgICAgaWYgKGNvZGUpIHsKKyAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV9saXN0X2NyZWRzIHdoaWxlIGluaXRpYWxpemluZyBrcmI1IiwiIixjb2RlKTsKKyAgICAgICAga3JiNV9lcnJubyA9IGNvZGU7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGVycm9yX21lc3NhZ2Uoa3JiNV9lcnJubykpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIG5hbWUgPSBvcC0+Y2FjaGU7CisgICAgbW9kZSA9IERFRkFVTFQ7CisgICAgc2hvd19mbGFncyA9IDA7CisgICAgc2hvd190aW1lID0gMDsKKyAgICBzdGF0dXNfb25seSA9IDA7CisgICAgc2hvd19rZXlzID0gMDsKKyAgICBzaG93X2V0eXBlID0gMDsKKyAgICBzaG93X2FkZHIgPSAwOworCisgICAgc2hvd19mbGFncyA9IGxjLT5mbGFnczsKKyAgICBzaG93X2V0eXBlID0gbGMtPmVuY3J5cHRpb247CisgICAgc2hvd19hZGRyICA9IGxjLT5hZGRyOworICAgIHNob3dfdGltZSA9IDE7CisgICAgc2hvd19rZXlzID0gMTsKKyAgICBtb2RlID0gQ0NBQ0hFOworCisgICAgaWYgKChjb2RlID0ga3JiNV90aW1lb2ZkYXkoa2NvbnRleHQsICZub3cpKSkgeworICAgICAgICBpZiAoIXN0YXR1c19vbmx5KQorICAgICAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV9saXN0X2NyZWRzIHdoaWxlIGdldHRpbmcgdGltZSBvZiBkYXkuIiwKKyAgICAgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAga3JiNV9mcmVlX2NvbnRleHQoa2NvbnRleHQpOworICAgICAgICBrcmI1X2Vycm5vID0gY29kZTsKKyAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csZXJyb3JfbWVzc2FnZShrcmI1X2Vycm5vKSk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjaGFyIHRtcFtCVUZTSVpdOworCisgICAgICAgIGlmICgha3JiNV90aW1lc3RhbXBfdG9fc2ZzdHJpbmcobm93LCB0bXAsIDIwLCAoY2hhciAqKSBOVUxMKSB8fAorICAgICAgICAgICAgIWtyYjVfdGltZXN0YW1wX3RvX3Nmc3RyaW5nKG5vdywgdG1wLCBzaXplb2YodG1wKSwgKGNoYXIgKikgTlVMTCkpCisgICAgICAgICAgICB0aW1lc3RhbXBfd2lkdGggPSAoaW50KSBzdHJsZW4odG1wKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGltZXN0YW1wX3dpZHRoID0gMTU7CisgICAgfQorCisgICAgaWYgKG1vZGUgPT0gREVGQVVMVCB8fCBtb2RlID09IENDQUNIRSkKKyAgICAgICAgIHJldHZhbCA9IGRvX2NjYWNoZShrY29udGV4dCxuYW1lKTsKKyAgICBlbHNlCisgICAgICAgICByZXR2YWwgPSBkb19rZXl0YWIoa2NvbnRleHQsbmFtZSk7CisgICAga3JiNV9mcmVlX2NvbnRleHQoa2NvbnRleHQpOworICAgIHJldHVybihyZXR2YWwpOworfQorCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK2RvX2tleXRhYihrcmI1X2NvbnRleHQga2NvbnRleHQsIGNoYXIgKiBuYW1lKQorI2Vsc2UKK2RvX2tleXRhYihrY29udGV4dCxuYW1lKSBrcmI1X2NvbnRleHQga2NvbnRleHQ7IGNoYXIgKiBuYW1lOworI2VuZGlmCit7CisgICAga3JiNV9rZXl0YWIga3Q7CisgICAga3JiNV9rZXl0YWJfZW50cnkgZW50cnk7CisgICAga3JiNV9rdF9jdXJzb3IgY3Vyc29yOworICAgIGNoYXIgYnVmW0JVRlNJWl07IC8qIGhvcGVmdWxseSBsYXJnZSBlbm91Z2ggZm9yIGFueSB0eXBlICovCisgICAgY2hhciAqcG5hbWU7CisgICAgaW50IGNvZGUgPSAwOworCisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICBpZiAoKGNvZGUgPSBrcmI1X2t0X2RlZmF1bHQoa2NvbnRleHQsICZrdCkpKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X2xpc3RfY3JlZHMgd2hpbGUgZ2V0dGluZyBkZWZhdWx0IGtleXRhYiIsCisgICAgICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgICAgICBrcmI1X2Vycm5vID0gY29kZTsKKyAgICAgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGVycm9yX21lc3NhZ2Uoa3JiNV9lcnJubykpOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoY29kZSA9IGtyYjVfa3RfcmVzb2x2ZShrY29udGV4dCwgbmFtZSwgJmt0KSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImNrX2tyYjVfbGlzdF9jcmVkcyB3aGlsZSByZXNvbHZpbmcga2V5dGFiIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUsY29kZSk7CisgICAgICAgICAgICBrcmI1X2Vycm5vID0gY29kZTsKKyAgICAgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGVycm9yX21lc3NhZ2Uoa3JiNV9lcnJubykpOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoY29kZSA9IGtyYjVfa3RfZ2V0X25hbWUoa2NvbnRleHQsIGt0LCBidWYsIEJVRlNJWikpKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfbGlzdF9jcmVkcyB3aGlsZSBnZXR0aW5nIGtleXRhYiBuYW1lIiwKKyAgICAgICAgICAgICAgICIiLGNvZGUpOworICAgICAgICBrcmI1X2Vycm5vID0gY29kZTsKKyAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csZXJyb3JfbWVzc2FnZShrcmI1X2Vycm5vKSk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgIHByaW50ZigiS2V5dGFiIG5hbWU6ICVzXHJcbiIsIGJ1Zik7CisKKyAgICAgaWYgKChjb2RlID0ga3JiNV9rdF9zdGFydF9zZXFfZ2V0KGtjb250ZXh0LCBrdCwgJmN1cnNvcikpKSB7CisgICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X2xpc3RfY3JlZHMgd2hpbGUgc3RhcnRpbmcga2V5dGFiIHNjYW4iLAorICAgICAgICAgICAgICAgICIiLGNvZGUpOworICAgICAgICAga3JiNV9lcnJubyA9IGNvZGU7CisgICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJvcl9tZXNzYWdlKGtyYjVfZXJybm8pKTsKKyAgICAgICAgIHJldHVybigtMSk7CisgICAgIH0KKworICAgICBpZiAoc2hvd190aW1lKSB7CisgICAgICAgICAgcHJpbnRmKCJLVk5PIFRpbWVzdGFtcCIpOworICAgICAgICAgIGZpbGxpdCh0aW1lc3RhbXBfd2lkdGggLSBzaXplb2YoIlRpbWVzdGFtcCIpICsgMiwgKGludCkgJyAnKTsKKyAgICAgICAgICBwcmludGYoIlByaW5jaXBhbFxyXG4iKTsKKyAgICAgICAgICBwcmludGYoIi0tLS0gIik7CisgICAgICAgICAgZmlsbGl0KHRpbWVzdGFtcF93aWR0aCwgKGludCkgJy0nKTsKKyAgICAgICAgICBwcmludGYoIiAiKTsKKyAgICAgICAgICBmaWxsaXQoNzggLSB0aW1lc3RhbXBfd2lkdGggLSBzaXplb2YoIktWTk8iKSwgKGludCkgJy0nKTsKKyAgICAgICAgICBwcmludGYoIlxyXG4iKTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGYoIktWTk8gUHJpbmNpcGFsXHJcbiIpOworICAgICAgICAgIHByaW50ZigKKyItLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXAorLS0tLS0tXHJcbiIpOworICAgICB9CisKKyAgICB3aGlsZSAoKGNvZGUgPSBrcmI1X2t0X25leHRfZW50cnkoa2NvbnRleHQsIGt0LCAmZW50cnksICZjdXJzb3IpKSA9PSAwKSB7CisgICAgICAgIGlmICgoY29kZSA9IGtyYjVfdW5wYXJzZV9uYW1lKGtjb250ZXh0LCBlbnRyeS5wcmluY2lwYWwsICZwbmFtZSkpKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X2xpc3RfY3JlZHMgd2hpbGUgdW5wYXJzaW5nIHByaW5jaXBhbCBuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAgICAgIGtyYjVfZXJybm8gPSBjb2RlOworICAgICAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csZXJyb3JfbWVzc2FnZShrcmI1X2Vycm5vKSk7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiJTRkICIsIGVudHJ5LnZubyk7CisgICAgICAgIGlmIChzaG93X3RpbWUpIHsKKyAgICAgICAgICAgIHByaW50dGltZShlbnRyeS50aW1lc3RhbXApOworICAgICAgICAgICAgcHJpbnRmKCIgIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCIlcyIsIHBuYW1lKTsKKyAgICAgICAgaWYgKHNob3dfZXR5cGUpCisgICAgICAgICAgICBwcmludGYoIiAoJXMpICIgLAorI2lmZGVmIEhFSU1EQUwKKyAgICAgICAgICAgICAgICAgICAgZXR5cGVfc3RyaW5nKGVudHJ5LmtleS5rZXl0eXBlKQorI2Vsc2UgLyogSEVJTURBTCAqLworICAgICAgICAgICAgICAgICAgICBldHlwZV9zdHJpbmcoZW50cnkua2V5LmVuY3R5cGUpCisjZW5kaWYgLyogSEVJTURBTCAqLworICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBpZiAoc2hvd19rZXlzKSB7CisgICAgICAgICAgICBwcmludGYoIiAoMHgiKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZW50cnkua2V5Lmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUwMngiLAorI2lmZGVmIEhFSU1EQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5rZXkua2V5dmFsdWVbaV0KKyNlbHNlIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5rZXkuY29udGVudHNbaV0KKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiKSIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXHJcbiIpOworICAgICAgICBrcmI1X2ZyZWVfdW5wYXJzZWRfbmFtZShrY29udGV4dCxwbmFtZSk7CisgICAgfQorICAgIGlmIChjb2RlICYmIGNvZGUgIT0gS1JCNV9LVF9FTkQpIHsKKyAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV9saXN0X2NyZWRzIHdoaWxlIHNjYW5uaW5nIGtleXRhYiIsCisgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAga3JiNV9lcnJubyA9IGNvZGU7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGVycm9yX21lc3NhZ2Uoa3JiNV9lcnJubykpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBpZiAoKGNvZGUgPSBrcmI1X2t0X2VuZF9zZXFfZ2V0KGtjb250ZXh0LCBrdCwgJmN1cnNvcikpKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfbGlzdF9jcmVkcyB3aGlsZSBlbmRpbmcga2V5dGFiIHNjYW4iLAorICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgIGtyYjVfZXJybm8gPSBjb2RlOworICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJvcl9tZXNzYWdlKGtyYjVfZXJybm8pKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAga3JiNV9lcnJubyA9IDA7CisgICAgbWFrZXN0cigma3JiNV9lcnJtc2csIk9LIik7CisgICAgcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK2RvX2NjYWNoZShrcmI1X2NvbnRleHQga2NvbnRleHQsIGNoYXIgKiBjY19uYW1lKQorI2Vsc2UKK2RvX2NjYWNoZShrY29udGV4dCxuYW1lKSBrcmI1X2NvbnRleHQga2NvbnRleHQ7IGNoYXIgKiBjY19uYW1lOworI2VuZGlmCit7CisgICAga3JiNV9jY2FjaGUgY2FjaGUgPSBOVUxMOworICAgIGtyYjVfY2NfY3Vyc29yIGN1cjsKKyAgICBrcmI1X2NyZWRzIGNyZWRzOworICAgIGtyYjVfcHJpbmNpcGFsIHByaW5jPU5VTEw7CisgICAga3JiNV9mbGFncyBmbGFncz0wOworICAgIGtyYjVfZXJyb3JfY29kZSBjb2RlID0gMDsKKyAgICBpbnQgZXhpdF9zdGF0dXMgPSAwOworCisgICAgaWYgKHN0YXR1c19vbmx5KQorICAgICAgICAvKiBleGl0X3N0YXR1cyBpcyBzZXQgYmFjayB0byAwIGlmIGEgdmFsaWQgdGd0IGlzIGZvdW5kICovCisgICAgICAgIGV4aXRfc3RhdHVzID0gMTsKKworICAgIGNvZGUgPSBrNV9nZXRfY2NhY2hlKGtjb250ZXh0LCZjYWNoZSxjY19uYW1lKTsKKyAgICBpZiAoY29kZSAhPSAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsImRvX2NjYWNoZSB3aGlsZSBnZXR0aW5nIGNjYWNoZSIsCisgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlKGNvZGUpLGNvZGUpOworICAgICAgICBrcmI1X2Vycm5vID0gY29kZTsKKyAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csZXJyb3JfbWVzc2FnZShrcmI1X2Vycm5vKSk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgZmxhZ3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHVybnMgb2ZmIE9QRU5DTE9TRSBtb2RlICovCisgICAgaWYgKChjb2RlID0ga3JiNV9jY19zZXRfZmxhZ3Moa2NvbnRleHQsIGNhY2hlLCBmbGFncykpKSB7CisgICAgICAgIGlmIChjb2RlID09IEVOT0VOVCkgeworICAgICAgICAgICAgZGVidWcoRjExMSwiY2tfa3JiNV9saXN0X2NyZWRzICh0aWNrZXQgY2FjaGUpIiwKKyAgICAgICAgICAgICAgICAgICBrcmI1X2NjX2dldF9uYW1lKGtjb250ZXh0LCBjYWNoZSksY29kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLAorICAgICAgICAgICAgICAgICAiY2tfa3JiNV9saXN0X2NyZWRzIHdoaWxlIHNldHRpbmcgY2FjaGUgZmxhZ3MgKHRpY2tldCBjYWNoZSkiLAorICAgICAgICAgICAgICAgICAga3JiNV9jY19nZXRfbmFtZShrY29udGV4dCwgY2FjaGUpLGNvZGUpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiTm8gdGlja2V0IEZpbGUuXHJcbiIpOworICAgICAgICBrcmI1X2Vycm5vID0gY29kZTsKKyAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csZXJyb3JfbWVzc2FnZShrcmI1X2Vycm5vKSk7CisgICAgICAgIGtyYjVfY2NfY2xvc2Uoa2NvbnRleHQsY2FjaGUpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBpZiAoKGNvZGUgPSBrcmI1X2NjX2dldF9wcmluY2lwYWwoa2NvbnRleHQsIGNhY2hlLCAmcHJpbmMpKSkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X2xpc3RfY3JlZHMgd2hpbGUgcmV0cmlldmluZyBwcmluY2lwYWwgbmFtZSIsCisgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAga3JiNV9lcnJubyA9IGNvZGU7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGVycm9yX21lc3NhZ2Uoa3JiNV9lcnJubykpOworICAgICAgICBrcmI1X2NjX2Nsb3NlKGtjb250ZXh0LGNhY2hlKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgaWYgKChjb2RlID0ga3JiNV91bnBhcnNlX25hbWUoa2NvbnRleHQsIHByaW5jLCAmZGVmbmFtZSkpKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfbGlzdF9jcmVkcyB3aGlsZSB1bnBhcnNpbmcgcHJpbmNpcGFsIG5hbWUiLAorICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgIGtyYjVfZXJybm8gPSBjb2RlOworICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJvcl9tZXNzYWdlKGtyYjVfZXJybm8pKTsKKyAgICAgICAga3JiNV9jY19jbG9zZShrY29udGV4dCxjYWNoZSk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGlmICghc3RhdHVzX29ubHkpIHsKKyAgICAgICAgcHJpbnRmKCJUaWNrZXQgY2FjaGU6ICAgICAgJXM6JXNcclxuRGVmYXVsdCBwcmluY2lwYWw6ICVzXHJcblxyXG4iLAorICAgICAgICAgICAgICAgIGtyYjVfY2NfZ2V0X3R5cGUoa2NvbnRleHQsIGNhY2hlKSwKKyAgICAgICAgICAgICAgICBrcmI1X2NjX2dldF9uYW1lKGtjb250ZXh0LCBjYWNoZSksIGRlZm5hbWUpOworICAgICAgICBwcmludGYoIlZhbGlkIHN0YXJ0aW5nIik7CisgICAgICAgIGZpbGxpdCh0aW1lc3RhbXBfd2lkdGggLSBzaXplb2YoIlZhbGlkIHN0YXJ0aW5nIikgKyAzLAorICAgICAgICAgICAgICAgKGludCkgJyAnKTsKKyAgICAgICAgcHJpbnRmKCJFeHBpcmVzIik7CisgICAgICAgIGZpbGxpdCh0aW1lc3RhbXBfd2lkdGggLSBzaXplb2YoIkV4cGlyZXMiKSArIDMsCisgICAgICAgICAgICAgICAoaW50KSAnICcpOworICAgICAgICBwcmludGYoIlNlcnZpY2UgcHJpbmNpcGFsXHJcbiIpOworICAgIH0KKyAgICBpZiAoKGNvZGUgPSBrcmI1X2NjX3N0YXJ0X3NlcV9nZXQoa2NvbnRleHQsIGNhY2hlLCAmY3VyKSkpIHsKKyAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV9saXN0X2NyZWRzIHdoaWxlIHN0YXJ0aW5nIHRvIHJldHJpZXZlIHRpY2tldHMiLAorICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgIGtyYjVfZXJybm8gPSBjb2RlOworICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJvcl9tZXNzYWdlKGtyYjVfZXJybm8pKTsKKyAgICAgICAga3JiNV9jY19jbG9zZShrY29udGV4dCxjYWNoZSk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIHdoaWxlICghKGNvZGUgPSBrcmI1X2NjX25leHRfY3JlZChrY29udGV4dCwgY2FjaGUsICZjdXIsICZjcmVkcykpKSB7CisgICAgICAgIGlmIChzdGF0dXNfb25seSkgeworICAgICAgICAgICAgaWYgKGV4aXRfc3RhdHVzICYmIGNyZWRzLnNlcnZlci0+bGVuZ3RoID09IDIgJiYKKyAgICAgICAgICAgICAgICBzdHJjbXAoY3JlZHMuc2VydmVyLT5yZWFsbS5kYXRhLCBwcmluYy0+cmVhbG0uZGF0YSkgPT0gMCAmJgorICAgICAgICAgICAgICAgIHN0cmNtcCgoY2hhciAqKWNyZWRzLnNlcnZlci0+ZGF0YVswXS5kYXRhLCAia3JidGd0IikgPT0gMCAmJgorICAgICAgICAgICAgICAgIHN0cmNtcCgoY2hhciAqKWNyZWRzLnNlcnZlci0+ZGF0YVsxXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBwcmluYy0+cmVhbG0uZGF0YSkgPT0gMCAmJgorICAgICAgICAgICAgICAgIGNyZWRzLnRpbWVzLmVuZHRpbWUgPiBub3cpCisgICAgICAgICAgICAgICAgZXhpdF9zdGF0dXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2hvd19jcmVkZW50aWFsKGtjb250ZXh0LCAmY3JlZHMpOworICAgICAgICB9CisgICAgICAgIGtyYjVfZnJlZV9jcmVkX2NvbnRlbnRzKGtjb250ZXh0LCAmY3JlZHMpOworICAgIH0KKyAgICBwcmludGYoIlxyXG4iKTsKKyAgICBpZiAoY29kZSA9PSBLUkI1X0NDX0VORCB8fCBjb2RlID09IEtSQjVfQ0NfTk9URk9VTkQpIHsKKyAgICAgICAgaWYgKChjb2RlID0ga3JiNV9jY19lbmRfc2VxX2dldChrY29udGV4dCwgY2FjaGUsICZjdXIpKSkgeworICAgICAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV9saXN0X2NyZWRzIHdoaWxlIGZpbmlzaGluZyB0aWNrZXQgcmV0cmlldmFsIiwKKyAgICAgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAgICAgIGtyYjVfZXJybm8gPSBjb2RlOworICAgICAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csZXJyb3JfbWVzc2FnZShrcmI1X2Vycm5vKSk7CisgICAgICAgICAgICBrcmI1X2NjX2Nsb3NlKGtjb250ZXh0LGNhY2hlKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBLUkI1X1RDX09QRU5DTE9TRTsgICAgICAvKiB0dXJucyBvbiBPUEVOQ0xPU0UgbW9kZSAqLworICAgICAgICBpZiAoKGNvZGUgPSBrcmI1X2NjX3NldF9mbGFncyhrY29udGV4dCwgY2FjaGUsIGZsYWdzKSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfbGlzdF9jcmVkcyB3aGlsZSBjbG9zaW5nIGNjYWNoZSIsCisgICAgICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgICAgICBrcmI1X2Vycm5vID0gY29kZTsKKyAgICAgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGVycm9yX21lc3NhZ2Uoa3JiNV9lcnJubykpOworICAgICAgICAgICAga3JiNV9jY19jbG9zZShrY29udGV4dCxjYWNoZSk7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgICAgIGtyYjVfZXJybm8gPSAwOworICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZywiT0siKTsKKyAgICAgICAga3JiNV9jY19jbG9zZShrY29udGV4dCxjYWNoZSk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X2xpc3RfY3JlZHMgd2hpbGUgcmV0cmlldmluZyBhIHRpY2tldCIsIiIsY29kZSk7CisgICAgICAgIGtyYjVfZXJybm8gPSBjb2RlOworICAgICAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZyxlcnJvcl9tZXNzYWdlKGtyYjVfZXJybm8pKTsKKyAgICAgICAga3JiNV9jY19jbG9zZShrY29udGV4dCxjYWNoZSk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGtyYjVfZXJybm8gPSAwOworICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLCJPSyIpOworICAgIGtyYjVfY2NfY2xvc2Uoa2NvbnRleHQsY2FjaGUpOworICAgIHJldHVybigwKTsKK30KKworc3RhdGljIGNoYXIgKgorI2lmZGVmIENLX0FOU0lDCisjaWZkZWYgSEVJTURBTAorZXR5cGVfc3RyaW5nKGtyYjVfa2V5dHlwZSBlbmN0eXBlKQorI2Vsc2UgLyogSEVJTURBTCAqLworZXR5cGVfc3RyaW5nKGtyYjVfZW5jdHlwZSBlbmN0eXBlKQorI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyNlbHNlCisjaWZkZWYgSEVJTURBTAorZXR5cGVfc3RyaW5nKGVuY3R5cGUpIGtyYjVfa2V5dHlwZSBlbmN0eXBlOworI2Vsc2UgLyogSEVJTURBTCAqLworZXR5cGVfc3RyaW5nKGVuY3R5cGUpIGtyYjVfZW5jdHlwZSBlbmN0eXBlOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyNlbmRpZgoreworICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMl07CisKKyAgICBzd2l0Y2ggKGVuY3R5cGUpIHsKKyAgICBjYXNlIEVOQ1RZUEVfTlVMTDoKKyAgICAgICAgcmV0dXJuICJOVUxMIjsKKyAgICBjYXNlIEVOQ1RZUEVfREVTX0NCQ19DUkM6CisgICAgICAgIHJldHVybiAiREVTLUNCQy1DUkMiOworICAgIGNhc2UgRU5DVFlQRV9ERVNfQ0JDX01ENDoKKyAgICAgICAgcmV0dXJuICJERVMtQ0JDLU1ENCI7CisgICAgY2FzZSBFTkNUWVBFX0RFU19DQkNfTUQ1OgorICAgICAgICByZXR1cm4gIkRFUy1DQkMtTUQ1IjsKKyAgICBjYXNlIEVOQ1RZUEVfREVTX0NCQ19SQVc6CisgICAgICAgIHJldHVybiAiREVTLUNCQy1SQVciOworICAgIGNhc2UgRU5DVFlQRV9ERVMzX0NCQ19TSEE6CisgICAgICAgIHJldHVybiAiREVTMy1DQkMtU0hBIjsKKyAgICBjYXNlIEVOQ1RZUEVfREVTM19DQkNfUkFXOgorICAgICAgICByZXR1cm4gIkRFUzMtQ0JDLVJBVyI7CisgICAgY2FzZSBFTkNUWVBFX0RFU19ITUFDX1NIQTE6CisgICAgICAgIHJldHVybiAiREVTLUhNQUMtU0hBMSI7CisgICAgY2FzZSBFTkNUWVBFX0RFUzNfQ0JDX1NIQTE6CisgICAgICAgIHJldHVybiAiREVTMy1DQkMtU0hBMSI7CisgICAgY2FzZSBFTkNUWVBFX0FFUzEyOF9DVFNfSE1BQ19TSEExXzk2OgorICAgICAgICByZXR1cm4gIkFFUzEyOF9DVFMtSE1BQy1TSEExXzk2IjsKKyAgICBjYXNlIEVOQ1RZUEVfQUVTMjU2X0NUU19ITUFDX1NIQTFfOTY6CisgICAgICAgIHJldHVybiAiQUVTMjU2X0NUUy1ITUFDLVNIQTFfOTYiOworICAgIGNhc2UgRU5DVFlQRV9BUkNGT1VSX0hNQUM6CisgICAgICAgIHJldHVybiAiUkM0LUhNQUMtTlQiOworICAgIGNhc2UgRU5DVFlQRV9BUkNGT1VSX0hNQUNfRVhQOgorICAgICAgICByZXR1cm4gIlJDNC1ITUFDLU5ULUVYUCI7CisgICAgY2FzZSBFTkNUWVBFX1VOS05PV046CisgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgY2FzZSBFTkNUWVBFX0xPQ0FMX0RFUzNfSE1BQ19TSEExOgorICAgICAgICByZXR1cm4gIkxPQ0FMLURFUzMtSE1BQy1TSEExIjsKKyAgICBjYXNlIEVOQ1RZUEVfTE9DQUxfUkM0X01ENDoKKyAgICAgICAgcmV0dXJuICJMT0NBTC1SQzQtTUQ0IjsKKyAgICBkZWZhdWx0OgorICAgICAgICBja21ha21zZyhidWYsIHNpemVvZihidWYpLCJldHlwZSAiLCBja2l0b2EoZW5jdHlwZSksTlVMTCxOVUxMKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqCisjaWZkZWYgQ0tfQU5TSUMKK2ZsYWdzX3N0cmluZyhyZWdpc3RlciBrcmI1X2NyZWRzICpjcmVkKQorI2Vsc2UKK2ZsYWdzX3N0cmluZyhjcmVkKSByZWdpc3RlciBrcmI1X2NyZWRzICpjcmVkOworI2VuZGlmCit7CisgICAgc3RhdGljIGNoYXIgYnVmWzMyXTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBpZiAoY3JlZC0+dGlja2V0X2ZsYWdzICYgVEtUX0ZMR19GT1JXQVJEQUJMRSkKKyAgICAgICAgYnVmW2krK10gPSAnRic7CisgICAgaWYgKGNyZWQtPnRpY2tldF9mbGFncyAmIFRLVF9GTEdfRk9SV0FSREVEKQorICAgICAgICBidWZbaSsrXSA9ICdmJzsKKyAgICBpZiAoY3JlZC0+dGlja2V0X2ZsYWdzICYgVEtUX0ZMR19QUk9YSUFCTEUpCisgICAgICAgIGJ1ZltpKytdID0gJ1AnOworICAgIGlmIChjcmVkLT50aWNrZXRfZmxhZ3MgJiBUS1RfRkxHX1BST1hZKQorICAgICAgICBidWZbaSsrXSA9ICdwJzsKKyAgICBpZiAoY3JlZC0+dGlja2V0X2ZsYWdzICYgVEtUX0ZMR19NQVlfUE9TVERBVEUpCisgICAgICAgIGJ1ZltpKytdID0gJ0QnOworICAgIGlmIChjcmVkLT50aWNrZXRfZmxhZ3MgJiBUS1RfRkxHX1BPU1REQVRFRCkKKyAgICAgICAgYnVmW2krK10gPSAnZCc7CisgICAgaWYgKGNyZWQtPnRpY2tldF9mbGFncyAmIFRLVF9GTEdfSU5WQUxJRCkKKyAgICAgICAgYnVmW2krK10gPSAnaSc7CisgICAgaWYgKGNyZWQtPnRpY2tldF9mbGFncyAmIFRLVF9GTEdfUkVORVdBQkxFKQorICAgICAgICBidWZbaSsrXSA9ICdSJzsKKyAgICBpZiAoY3JlZC0+dGlja2V0X2ZsYWdzICYgVEtUX0ZMR19JTklUSUFMKQorICAgICAgICBidWZbaSsrXSA9ICdJJzsKKyAgICBpZiAoY3JlZC0+dGlja2V0X2ZsYWdzICYgVEtUX0ZMR19IV19BVVRIKQorICAgICAgICBidWZbaSsrXSA9ICdIJzsKKyAgICBpZiAoY3JlZC0+dGlja2V0X2ZsYWdzICYgVEtUX0ZMR19QUkVfQVVUSCkKKyAgICAgICAgYnVmW2krK10gPSAnQSc7CisgICAgYnVmW2ldID0gJ1wwJzsKKyAgICByZXR1cm4oYnVmKTsKK30KKworc3RhdGljIGNoYXIgICAqCisjaWZkZWYgQ0tfQU5TSUMKK3Nob3J0X2RhdGUobG9uZyAgICpkcCkKKyNlbHNlCitzaG9ydF9kYXRlKGRwKSBsb25nICAgKmRwOworI2VuZGlmCit7CisgICAgcmVnaXN0ZXIgY2hhciAqY3A7CisjaWZuZGVmIGN0aW1lCisgICAgZXh0ZXJuIGNoYXIgKmN0aW1lKCk7CisjZW5kaWYgLyogY3RpbWUgKi8KKyAgICBjcCA9IGN0aW1lKGRwKSArIDQ7CisgICAgY3BbMTVdID0gJ1wwJzsKKyAgICByZXR1cm4gKGNwKTsKK30KKworCitzdGF0aWMgVk9JRAorI2lmZGVmIENLX0FOU0lDCitwcmludHRpbWUodGltZV90IHR2KQorI2Vsc2UKK3ByaW50dGltZSh0dikgdGltZV90IHR2OworI2VuZGlmCit7CisgICAgY2hhciB0aW1lc3RyaW5nW0JVRlNJWl07CisgICAgY2hhciBmb3JtYXRbMTJdOworICAgIGNoYXIgZmlsbDsKKworICAgIGZpbGwgPSAnICc7CisgICAgc3ByaW50Zihmb3JtYXQsIiUlLSVkcyIsdGltZXN0YW1wX3dpZHRoKTsgICAvKiBzYWZlICovCisgICAgaWYgKCFrcmI1X3RpbWVzdGFtcF90b19zZnN0cmluZygoa3JiNV90aW1lc3RhbXApIHR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wX3dpZHRoKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGwpKSB7CisgICAgICAgIHByaW50Zihmb3JtYXQsdGltZXN0cmluZyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludGYoZm9ybWF0LHNob3J0X2RhdGUoJnR2KSk7CisgICAgfQorCit9CisKK3N0YXRpYyB2b2lkCisjaWZkZWYgQ0tfQU5TSUMKK29uZV9hZGRyKGtyYjVfYWRkcmVzcyAqYSkKKyNlbHNlCitvbmVfYWRkcihhKSBrcmI1X2FkZHJlc3MgKmE7CisjZW5kaWYKK3sKKyAgICBzdHJ1Y3QgaG9zdGVudCAqaDsKKyAgICBleHRlcm4gdGNwX3JkbnM7CisKKyAgICBpZiAoKGEtPmFkZHJ0eXBlID09IEFERFJUWVBFX0lORVQpICYmCisgICAgICAgIChhLT5sZW5ndGggPT0gNCkpIHsKKyAgICAgICAgaWYgKHRjcF9yZG5zICE9IFNFVF9PRkYpIHsKKyAgICAgICAgICAgIGggPSBnZXRob3N0YnlhZGRyKGEtPmNvbnRlbnRzLCA0LCBBRl9JTkVUKTsKKyAgICAgICAgICAgIGlmIChoKSB7CisjaWZkZWYgSEFERFJMSVNUCisgICAgICAgICAgICAgICAgaCA9IGNrX2NvcHlob3N0ZW50KGgpOworI2VuZGlmIC8qIEhBRERSTElTVCAqLworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgKCVkLiVkLiVkLiVkKSIsIGgtPmhfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEtPmNvbnRlbnRzWzBdLCBhLT5jb250ZW50c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEtPmNvbnRlbnRzWzJdLCBhLT5jb250ZW50c1szXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRjcF9yZG5zID09IFNFVF9PRkYgfHwgIWgpIHsKKyAgICAgICAgICAgIHByaW50ZigiJWQuJWQuJWQuJWQiLCBhLT5jb250ZW50c1swXSwgYS0+Y29udGVudHNbMV0sCisgICAgICAgICAgICAgICAgICAgYS0+Y29udGVudHNbMl0sIGEtPmNvbnRlbnRzWzNdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigidW5rbm93biBhZGRyIHR5cGUgJWQiLCBhLT5hZGRydHlwZSk7CisgICAgfQorfQorCitzdGF0aWMgVk9JRAorI2lmZGVmIENLX0FOU0lDCitzaG93X2NyZWRlbnRpYWwoa3JiNV9jb250ZXh0IGtjb250ZXh0LCByZWdpc3RlciBrcmI1X2NyZWRzICogY3JlZCkKKyNlbHNlCitzaG93X2NyZWRlbnRpYWwoa2NvbnRleHQsIGNyZWQpCisgICAga3JiNV9jb250ZXh0ICAgICAgICAgIGtjb250ZXh0OworICAgIHJlZ2lzdGVyIGtyYjVfY3JlZHMgKiBjcmVkOworI2VuZGlmCit7CisgICAga3JiNV9lcnJvcl9jb2RlIHJldHZhbD0wOworICAgIGtyYjVfdGlja2V0ICp0a3Q9TlVMTDsKKyAgICBjaGFyICpuYW1lPU5VTEwsICpzbmFtZT1OVUxMLCAqZmxhZ3M9TlVMTDsKKyAgICBpbnQgZXh0cmFfZmllbGQgPSAwOworCisgICAgcmV0dmFsID0ga3JiNV91bnBhcnNlX25hbWUoa2NvbnRleHQsIGNyZWQtPmNsaWVudCwgJm5hbWUpOworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV9saXN0X2NyZWRzIHdoaWxlIHVucGFyc2luZyBjbGllbnQgbmFtZSIsIiIscmV0dmFsKTsKKyAgICAgICAga3JiNV9lcnJubyA9IHJldHZhbDsKKyAgICAgICAgbWFrZXN0cigma3JiNV9lcnJtc2csZXJyb3JfbWVzc2FnZShrcmI1X2Vycm5vKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmV0dmFsID0ga3JiNV91bnBhcnNlX25hbWUoa2NvbnRleHQsIGNyZWQtPnNlcnZlciwgJnNuYW1lKTsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfbGlzdF9jcmVkcyB3aGlsZSB1bnBhcnNpbmcgc2VydmVyIG5hbWUiLCIiLHJldHZhbCk7CisgICAgICAgIGZyZWUobmFtZSk7CisgICAgICAgIGtyYjVfZXJybm8gPSByZXR2YWw7CisgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLGVycm9yX21lc3NhZ2Uoa3JiNV9lcnJubykpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghY3JlZC0+dGltZXMuc3RhcnR0aW1lKQorICAgICAgICBjcmVkLT50aW1lcy5zdGFydHRpbWUgPSBjcmVkLT50aW1lcy5hdXRodGltZTsKKworICAgIHByaW50dGltZShjcmVkLT50aW1lcy5zdGFydHRpbWUpOworICAgIHByaW50ZigiICAiKTsKKworICAgIGlmICggdGltZSgwKSA8IGNyZWQtPnRpbWVzLmVuZHRpbWUgKQorICAgICAgICBwcmludHRpbWUoY3JlZC0+dGltZXMuZW5kdGltZSk7CisgICAgZWxzZQorICAgICAgICBwcmludGYoIioqIGV4cGlyZWQgKiogIik7CisKKyAgICBwcmludGYoIiAgJXNcclxuIiwgc25hbWUpOworCisgICAgaWYgKHN0cmNtcChuYW1lLCBkZWZuYW1lKSkgeworICAgICAgICBwcmludGYoIiAgIGZvciBjbGllbnQgJXMiLCBuYW1lKTsKKyAgICAgICAgZXh0cmFfZmllbGQrKzsKKyAgICB9CisKKyAgICBpZiAoY3JlZC0+dGltZXMucmVuZXdfdGlsbCkgeworICAgICAgICBpZiAoIWV4dHJhX2ZpZWxkKQorICAgICAgICAgICAgcHJpbnRmKCIgICAiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICBwcmludGYoInJlbmV3IHVudGlsICIpOworICAgICAgICBwcmludHRpbWUoY3JlZC0+dGltZXMucmVuZXdfdGlsbCk7CisgICAgICAgIGV4dHJhX2ZpZWxkICs9IDI7CisgICAgfQorCisgICAgaWYgKGV4dHJhX2ZpZWxkID4gMykgeworICAgICAgICBwcmludGYoIlxyXG4iKTsKKyAgICAgICAgZXh0cmFfZmllbGQgPSAwOworICAgIH0KKworICAgIGlmIChzaG93X2ZsYWdzKSB7CisgICAgICAgIGZsYWdzID0gZmxhZ3Nfc3RyaW5nKGNyZWQpOworICAgICAgICBpZiAoZmxhZ3MgJiYgKmZsYWdzKSB7CisgICAgICAgICAgICBpZiAoIWV4dHJhX2ZpZWxkKQorICAgICAgICAgICAgICAgIHByaW50ZigiICAgIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICAgICAgcHJpbnRmKCJGbGFnczogJXMiLCBmbGFncyk7CisgICAgICAgICAgICBleHRyYV9maWVsZCsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGV4dHJhX2ZpZWxkID4gMikgeworICAgICAgICBwcmludGYoIlxyXG4iKTsKKyAgICAgICAgZXh0cmFfZmllbGQgPSAwOworICAgIH0KKworICAgIGlmIChzaG93X2V0eXBlKSB7CisgICAgICAgIHJldHZhbCA9IGRlY29kZV9rcmI1X3RpY2tldCgmY3JlZC0+dGlja2V0LCAmdGt0KTsKKyAgICAgICAgaWYgKCFleHRyYV9maWVsZCkKKyAgICAgICAgICAgIHByaW50ZigiICAgIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiLCAiKTsKKyNpZmRlZiBIRUlNREFMCisgICAgICAgIHByaW50ZigiRXR5cGUgKHNrZXksIHRrdCk6ICVzLCAlcyAiLAorICAgICAgICAgICAgICAgZXR5cGVfc3RyaW5nKGNyZWQtPnNlc3Npb24ua2V5dHlwZSksCisgICAgICAgICAgICAgICBldHlwZV9zdHJpbmcodGt0LT5lbmNfcGFydC5rZXl0eXBlKSk7CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgICAgIHByaW50ZigiRXR5cGUgKHNrZXksIHRrdCk6ICVzLCAlcyAiLAorICAgICAgICAgICAgICAgZXR5cGVfc3RyaW5nKGNyZWQtPmtleWJsb2NrLmVuY3R5cGUpLAorICAgICAgICAgICAgICAgZXR5cGVfc3RyaW5nKHRrdC0+ZW5jX3BhcnQuZW5jdHlwZSkpOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICAgICAga3JiNV9mcmVlX3RpY2tldChrY29udGV4dCwgdGt0KTsKKyAgICAgICAgZXh0cmFfZmllbGQrKzsKKyAgICB9CisKKyAgICAvKiBpZiBhbnkgYWRkaXRpb25hbCBpbmZvIHdhcyBwcmludGVkLCBleHRyYV9maWVsZCBpcyBub24temVybyAqLworICAgIGlmIChleHRyYV9maWVsZCkKKyAgICAgICAgcHJpbnRmKCJcclxuIik7CisKKyAgICBpZiAoIHNob3dfYWRkciApIHsKKyAgICAgICAgaWYgKCFjcmVkLT5hZGRyZXNzZXMgfHwgIWNyZWQtPmFkZHJlc3Nlc1swXSkgeworICAgICAgICAgICAgcHJpbnRmKCJcdEFkZHJlc3NlczogKG5vbmUpXHJcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGk9MDsgY3JlZC0+YWRkcmVzc2VzW2ldOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgICAgICIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICBBZGRyZXNzZXM6ICIpOworICAgICAgICAgICAgICAgIG9uZV9hZGRyKGNyZWQtPmFkZHJlc3Nlc1tpXSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcclxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBrcmI1X2ZyZWVfdW5wYXJzZWRfbmFtZShrY29udGV4dCxuYW1lKTsKKyAgICBrcmI1X2ZyZWVfdW5wYXJzZWRfbmFtZShrY29udGV4dCxzbmFtZSk7CisKKyAgICBrcmI1X2Vycm5vID0gMDsKKyAgICBtYWtlc3RyKCZrcmI1X2Vycm1zZywiT0siKTsKK30KKworc3RhdGljIFZPSUQKKyNpZmRlZiBDS19BTlNJQworZmlsbGl0KGludCBudW0sIGludCBjKQorI2Vsc2UKK2ZpbGxpdChudW0sIGMpIGludCBudW07IGludCBjOworI2VuZGlmCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaTxudW07IGkrKykKKyAgICAgICAgcHJpbnRmKCIlYyIsYyk7Cit9CisjZW5kaWYgLyogS0xJU1QgKi8KKyNlbmRpZiAvKiBLUkI1ICovCisKKyNpZmRlZiBLUkI0CisjZGVmaW5lIEtERUJVRyAxCitpbnQgazRkZWJ1ZyA9IDA7ICAgICAgICAgICAgICAgIC8qIEtlcmJlcm9zIDQgcnVudGltZSBkZWJ1Z2dpbmcgKi8KKworI2lmZGVmIEtJTklUCisjZGVmaW5lIEtSQl9ERUZBVUxUX0xJRkUgMTIwIC8qIDEwIGhvdXJzIGluIDUgbWludXRlIGludGVydmFscyAqLworCisjaWZkZWYgU05LNAorLyogU05LNCBpcyBhIGhhcmR3YXJlIGF1dGhlbnRpY2F0aW9uIHN5c3RlbSB1c2VkIHRvIHByZS1hdXRoZW50aWNhdGUgICAgKi8KKy8qIGEgdGlja2V0IGdldHRpbmcgdGlja2V0LiAgV2UgZG8gbm90IHN1cHBvcnQgdGhpcyBjb2RlIGF0IHRoZSBwcmVzZW50ICovCisvKiB0aW1lIGluIEtlcm1pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordm9pZAorZ2V0X2lucHV0KHMsIHNpemUsIHN0cmVhbSkKK2NoYXIgKnM7CitpbnQgc2l6ZTsKK0ZJTEUgKnN0cmVhbTsKK3sKKyAgICBjaGFyICpwOworCisgICAgaWYgKGZnZXRzKHMsIHNpemUsIHN0cmVhbSkgPT0gTlVMTCkKKyAgICAgICAgZXhpdCgxKTsKKyAgICBpZiAoIChwID0gc3RyY2hyKHMsICdcbicpKSAhPSBOVUxMKQorICAgICAgICAqcCA9ICdcMCc7Cit9CisjZW5kaWYgLyogU05LNCAqLworCisjaWZkZWYgQ09NTUVOVAorc3RhdGljIGNoYXIKKyNpZmRlZiBDS19BTlNJQworaGV4X3NjYW5fbnliYmxlKGNoYXIgYykKKyNlbHNlCitoZXhfc2Nhbl9ueWJibGUoYykgY2hhciBjOworI2VuZGlmCit7CisgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICByZXR1cm4gYyAtICcwJzsKKyAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgICAgIHJldHVybiBjIC0gJ0EnICsgMTA7CisgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorICAgICAgICByZXR1cm4gYyAtICdhJyArIDEwOworICAgIHJldHVybiAtMTsKK30KKworLyogcmV0dXJuczogTlVMTCBmb3Igb2ssIHBvaW50ZXIgdG8gZXJyb3Igc3RyaW5nIGZvciBiYWQgaW5wdXQgKi8KK3N0YXRpYyBjaGFyKgorI2lmZGVmIENLX0FOU0lDCitoZXhfc2Nhbl9mb3VyX2J5dGVzKGNoYXIgKm91dCwgY2hhciAqaW4pCisjZWxzZQoraGV4X3NjYW5fZm91cl9ieXRlcyhvdXQsIGluKSBjaGFyICpvdXQ7IGNoYXIgKmluOworI2VuZGlmCit7CisgICAgaW50IGk7CisgICAgaW50IGM7CisgICAgY2hhciBjMTsKKyAgICBmb3IgKGk9MDsgaTw4OyBpKyspIHsKKyAgICAgICAgaWYoIWluW2ldKQorICAgICAgICAgICAgcmV0dXJuICJub3QgZW5vdWdoIGlucHV0IjsKKyAgICAgICAgYyA9IGhleF9zY2FuX255YmJsZShpbltpXSk7CisgICAgICAgIGlmKGM8MCkKKyAgICAgICAgICAgIHJldHVybiAiaW52YWxpZCBkaWdpdCI7CisgICAgICAgIGMxID0gYzsKKyAgICAgICAgaSsrOworICAgICAgICBpZighaW5baV0pCisgICAgICAgICAgICByZXR1cm4gIm5vdCBlbm91Z2ggaW5wdXQiOworICAgICAgICBjID0gaGV4X3NjYW5fbnliYmxlKGluW2ldKTsKKyAgICAgICAgaWYoYzwwKQorICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkIGRpZ2l0IjsKKyAgICAgICAgKm91dCsrID0gKGMxIDw8IDQpICsgYzsKKyAgICB9CisgICAgc3dpdGNoKGluW2ldKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgJ1xyJzoKKyAgICBjYXNlICdcbic6CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiZXh0cmEgY2hhcmFjdGVycyBhdCBlbmQgb2YgaW5wdXQiOworICAgIH0KK30KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qIGNrX2tyYjRfaW5pdFRHVCgpIHJldHVybnMgMCBvbiBzdWNjZXNzICovCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNF9pbml0VEdUKHN0cnVjdCBrcmJfb3BfZGF0YSAqIG9wLCBzdHJ1Y3Qga3JiNF9pbml0X2RhdGEgKiBpbml0KQorI2Vsc2UKK2NrX2tyYjRfaW5pdFRHVChvcCxpbml0KQorICAgIHN0cnVjdCBrcmJfb3BfZGF0YSAqIG9wLCBzdHJ1Y3Qga3JiNF9pbml0X2RhdGEgKiBpbml0CisjZW5kaWYKK3sKKyAgICBjaGFyICAgIGFuYW1lW0FOQU1FX1NaKzFdOworICAgIGNoYXIgICAgaW5zdFtJTlNUX1NaKzFdOworICAgIGNoYXIgICAgcmVhbG1bUkVBTE1fU1orMV07CisgICAgY2hhciAgICAqcGFzc3dvcmQ9TlVMTDsKKyAgICBjaGFyICAgIHBhc3N3ZFs4MF09IiI7CisgICAgY2hhciAgICAqdXNlcm5hbWUgPSBOVUxMOworICAgIGNoYXIgICAgKnVzZXJuYW1lcHRyPU5VTEw7CisgICAgaW50ICAgICBpZmxhZywgICAgICAvKiBJbnN0YW5jZSAqLworICAgICAgICAgICAgcmZsYWcsICAgICAgLyogUmVhbG0gKi8KKyAgICAgICAgICAgIHZmbGFnLCAgICAgIC8qIFZlcmJvc2UgKi8KKyAgICAgICAgICAgIGxmbGFnLCAgICAgIC8qIExpZmV0aW1lICovCisgICAgICAgICAgICBwZmxhZywgICAgICAvKiBQcmVhdXRoICovCisgICAgICAgICAgICBsaWZldGltZT1LUkJfREVGQVVMVF9MSUZFLCAgIC8qIExpZmUgVGltZSAqLworICAgICAgICAgICAga19lcnJubzsKKyAgICByZWdpc3RlciBjaGFyICpjcDsKKyAgICByZWdpc3RlciBpOworCisgICAgaWYgKCAhY2tfa3JiNF9pc19pbnN0YWxsZWQoKSApCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICAqaW5zdCA9ICpyZWFsbSA9ICdcMCc7CisgICAgaWZsYWcgPSByZmxhZyA9IHZmbGFnID0gbGZsYWcgPSBwZmxhZyA9IDA7CisKKyAgICB2ZmxhZyA9IGluaXQtPnZlcmJvc2U7CisgICAgcGZsYWcgPSBpbml0LT5wcmVhdXRoOworCisgICAgaWYgKCBpbml0LT5saWZldGltZSApIHsKKyAgICAgICAgbGlmZXRpbWUgPSBpbml0LT5saWZldGltZTw1PzE6aW5pdC0+bGlmZXRpbWUvNTsKKyAgICAgICAgaWYgKCBsaWZldGltZSA+IDI1NSApIGxpZmV0aW1lID0gMjU1OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGxpZmV0aW1lID0gS1JCX0RFRkFVTFRfTElGRTsKKworICAgIHVzZXJuYW1lID0gaW5pdC0+cHJpbmNpcGFsOworCisgICAgaWYgKHVzZXJuYW1lICYmIHVzZXJuYW1lWzBdICYmCisgICAgICAgIChrX2Vycm5vID0ga25hbWVfcGFyc2UoYW5hbWUsIGluc3QsIHJlYWxtLCB1c2VybmFtZSkpCisgICAgICAgICE9IEFVVEhfU1VDQ0VTUykgeworICAgICAgICBrcmI0X2Vycm5vID0ga19lcnJubzsKKyAgICAgICAgbWFrZXN0cigma3JiNF9lcnJtc2csa3JiX2dldF9lcnJfdGV4dF9lbnRyeShrX2Vycm5vKSk7CisgICAgICAgIHByaW50ZigiJXNcclxuIiwga3JiX2dldF9lcnJfdGV4dF9lbnRyeShrX2Vycm5vKSk7CisgICAgICAgIGlmbGFnID0gcmZsYWcgPSAxOworICAgICAgICB1c2VybmFtZSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKCBpbml0LT5yZWFsbSApIHsKKyAgICAgICAgY2tzdHJuY3B5KHJlYWxtLGluaXQtPnJlYWxtLFJFQUxNX1NaKTsKKyAgICB9CisKKyAgICBpZiAoIGluaXQtPmluc3RhbmNlICkgeworICAgICAgICBja3N0cm5jcHkoaW5zdCxpbml0LT5pbnN0YW5jZSwgSU5TVF9TWik7CisgICAgfQorCisjaWZkZWYgQ09NTUVOVAorICAgIGlmICggdmZsYWcgKQorICAgICAgICBwcmludGYoIktlcmJlcm9zIElWIGluaXRpYWxpemF0aW9uXHJcbiIpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIGlmICghdXNlcm5hbWUgfHwgIXVzZXJuYW1lWzBdKSB7CisgICAgICAgIGRlYnVnKEYxMDAsImNrX2tyYjRfaW5pdFRHVCBubyB1c2VybmFtZSBzcGVjaWZpZWQiLCIiLDApOworICAgICAgICBwcmludGYoIj9JbnZhbGlkIHByaW5jaXBhbCBzcGVjaWZpZWQuXHJcbiIpOworICAgICAgICBrcmI0X2Vycm5vID0gLTE7CisgICAgICAgIG1ha2VzdHIoJmtyYjRfZXJybXNnLCJObyBwcmluY2lwYWwgc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGlmICghKnJlYWxtKSB7CisgICAgICAgIGNrc3RybmNweShyZWFsbSxja19rcmI0X2dldHJlYWxtKCksUkVBTE1fU1opOworICAgIH0KKworICAgIGlmICggaW5pdC0+cGFzc3dvcmQgKQorICAgICAgICBwYXNzd29yZCA9IGluaXQtPnBhc3N3b3JkOworICAgIGVsc2UgeworICAgICAgICBjaGFyIHBybXB0WzgwXTsKKyAgICAgICAgaW50IG9rOworCisgICAgICAgIGNrbWFreG1zZyhwcm1wdCxzaXplb2YocHJtcHQpLAorICAgICAgICAgICAgICAgICAgIktlcmJlcm9zIDQgUGFzc3dvcmQgZm9yICIsdXNlcm5hbWUsIkAiLHJlYWxtLCI6ICIsCisgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgIG9rID0gdXFfdHh0KE5VTEwscHJtcHQsMixOVUxMLHBhc3N3ZCw4MCxOVUxMLERFRkFVTFRfVVFfVElNRU9VVCk7CisgICAgICAgIGlmICggb2sgKQorICAgICAgICAgICAgcGFzc3dvcmQgPSBwYXNzd2Q7CisgICAgfQorCisgICAgaWYgKHBmbGFnKSB7CisgICAgICAgIGtfZXJybm8gPSBrcmJfZ2V0X3B3X2luX3RrdF9wcmVhdXRoKCBhbmFtZSwgaW5zdCwgcmVhbG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia3JidGd0IiwgcmVhbG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZldGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkKTsKKyAgICAgICAgaWYgKGtfZXJybm8gPT0gLTEpIHsgICAgLyogcHJlYXV0aCBtZXRob2Qgbm90IGF2YWlsYWJsZSAqLworICAgICAgICAgICAga19lcnJubyA9IGtyYl9nZXRfcHdfaW5fdGt0KGFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LCByZWFsbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtyYnRndCIsIHJlYWxtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZldGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAga19lcnJubyA9IGtyYl9nZXRfcHdfaW5fdGt0KGFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QsIHJlYWxtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrcmJ0Z3QiLCByZWFsbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZldGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCk7CisgICAgfQorCisgICAgbWVtc2V0KHBhc3N3ZCwwLHNpemVvZihwYXNzd2QpKTsKKyAgICBpZiAoa19lcnJubykgeworICAgICAgICBwcmludGYoIiVzIGZvciBwcmluY2lwYWwgJXMlcyVzQCVzXHJcbiIsCisgICAgICAgICAgICAgICAga3JiX2dldF9lcnJfdGV4dF9lbnRyeShrX2Vycm5vKSwgYW5hbWUsCisgICAgICAgICAgICAgICAgaW5zdFswXT8iLiI6IiIsIGluc3QsIHJlYWxtKTsKKyAgICAgICAga3JiNF9lcnJubyA9IGtfZXJybm87CisgICAgICAgIG1ha2VzdHIoJmtyYjRfZXJybXNnLGtyYl9nZXRfZXJyX3RleHRfZW50cnkoa19lcnJubykpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0gZWxzZSBpZiAodmZsYWcpIHsKKyAgICAgICAgcHJpbnRmKCJSZXN1bHQgZnJvbSByZWFsbSAlczogIiwgcmVhbG0pOworICAgICAgICBwcmludGYoIiVzXHJcbiIsIGtyYl9nZXRfZXJyX3RleHRfZW50cnkoa19lcnJubykpOworICAgIH0KKyAgICBrcmI0X2Vycm5vID0ga19lcnJubzsKKyAgICBtYWtlc3RyKCZrcmI0X2Vycm1zZyxrcmJfZ2V0X2Vycl90ZXh0X2VudHJ5KGtfZXJybm8pKTsKKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogS0lOSVQgKi8KKyNpZmRlZiBLREVTVFJPWQoraW50CisjaWZkZWYgQ0tfQU5TSUMKK2NrX2tyYjRfZGVzdHJveShzdHJ1Y3Qga3JiX29wX2RhdGEgKiBvcCkKKyNlbHNlCitja19rcmI0X2Rlc3Ryb3kob3ApIHN0cnVjdCBrcmJfb3BfZGF0YSAqIG9wOworI2VuZGlmCit7CisgICAgaW50IGtfZXJybm89MDsKKworICAgIGlmICggIWNrX2tyYjRfaXNfaW5zdGFsbGVkKCkgKQorICAgICAgICByZXR1cm4oLTEpOworCisgICAga19lcnJubyA9IGRlc3RfdGt0KCk7CisKKyAgICBrcmI0X2Vycm5vID0ga19lcnJubzsKKyAgICBtYWtlc3RyKCZrcmI0X2Vycm1zZyxrcmJfZ2V0X2Vycl90ZXh0X2VudHJ5KGtfZXJybm8pKTsKKworICAgIGlmIChrX2Vycm5vID09IDApCisgICAgICAgIHByaW50ZigiVGlja2V0cyBkZXN0cm95ZWQuXHJcbiIpOworICAgIGVsc2UgaWYgKGtfZXJybm8gPT0gUkVUX1RLRklMKQorICAgICAgICBwcmludGYoIk5vIHRpY2tldHMgdG8gZGVzdHJveS5cclxuIik7CisgICAgZWxzZSB7CisgICAgICAgIHByaW50ZigiVGlja2V0cyBNQVkgTk9UIGJlIGRlc3Ryb3llZC5cclxuIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBLREVTVFJPWSAqLworI2lmZGVmIEtMSVNUCitfUFJPVE9UWVAoc3RhdGljIGludCBkaXNwbGF5X3RrdGZpbGUsKGNoYXIgKiwgaW50LCBpbnQsIGludCkpOworCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNF9saXN0X2NyZWRzKHN0cnVjdCBrcmJfb3BfZGF0YSAqIG9wKQorI2Vsc2UKK2NrX2tyYjRfbGlzdF9jcmVkcyhvcCkgc3RydWN0IGtyYl9vcF9kYXRhICogb3A7CisjZW5kaWYKK3sKKyAgICBpbnQgICAgIGxvbmdfZm9ybSA9IDE7CisgICAgaW50ICAgICB0Z3RfdGVzdCA9IDA7CisgICAgaW50ICAgICBkb19zcnZ0YWIgPSAwOworICAgIGludCAgICAgc2hvd19rdm5vcyA9IDA7CisgICAgY2hhciAgICp0a3RfZmlsZSA9IE5VTEw7CisKKyAgICBpZiAoICFja19rcmI0X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmICggb3AtPmNhY2hlICkKKyAgICAgICAgdGt0X2ZpbGUgPSBvcC0+Y2FjaGU7CisKKyAgICBpZiAoIGs0ZGVidWcgKSB7CisgICAgICAgIHNob3dfa3Zub3MgPSAxOworICAgIH0KKworICAgIGlmIChkb19zcnZ0YWIpCisgICAgICAgIHJldHVybihkaXNwbGF5X3NydnRhYih0a3RfZmlsZSkpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKGRpc3BsYXlfdGt0ZmlsZSh0a3RfZmlsZSwgdGd0X3Rlc3QsIGxvbmdfZm9ybSwgc2hvd19rdm5vcykpOworfQorCisjaWZuZGVmIEtSQjUKK3N0YXRpYyBpbnQgdGltZXN0YW1wX3dpZHRoPTA7CisKK3N0YXRpYyBjaGFyICAgKgorI2lmZGVmIENLX0FOU0lDCitzaG9ydF9kYXRlKGxvbmcgICAqZHApCisjZWxzZQorc2hvcnRfZGF0ZShkcCkgbG9uZyAgICpkcDsKKyNlbmRpZgoreworICAgIHJlZ2lzdGVyIGNoYXIgKmNwOworICAgIGV4dGVybiBjaGFyICpjdGltZSgpOworICAgIGNwID0gY3RpbWUoZHApICsgNDsKKyAgICBjcFsxNV0gPSAnXDAnOworICAgIHJldHVybiAoY3ApOworfQorCisKK3N0YXRpYyBWT0lECisjaWZkZWYgQ0tfQU5TSUMKK3ByaW50dGltZSh0aW1lX3QgdHYpCisjZWxzZQorcHJpbnR0aW1lKHR2KSB0aW1lX3QgdHY7CisjZW5kaWYKK3sKKyAgICBjaGFyIHRpbWVzdHJpbmdbQlVGU0laXTsKKyAgICBjaGFyIGZvcm1hdFsxMl07CisgICAgY2hhciBmaWxsOworCisgICAgZmlsbCA9ICcgJzsKKyAgICBzcHJpbnRmKGZvcm1hdCwiJSUtJWRzIix0aW1lc3RhbXBfd2lkdGgpOyAgIC8qIHNhZmUgKi8KKyAgICBwcmludGYoZm9ybWF0LHNob3J0X2RhdGUoJnR2KSk7Cit9CisjZW5kaWYgLyogS1JCNSAqLworCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK2Rpc3BsYXlfdGt0ZmlsZShjaGFyICpmaWxlLCBpbnQgdGd0X3Rlc3QsIGludCBsb25nX2Zvcm0sIGludCBzaG93X2t2bm9zKQorI2Vsc2UKK2Rpc3BsYXlfdGt0ZmlsZShmaWxlLHRndF90ZXN0LGxvbmdfZm9ybSxzaG93X2t2bm9zKQorICAgIGNoYXIgKmZpbGU7IGludCB0Z3RfdGVzdDsgaW50IGxvbmdfZm9ybTsgaW50IHNob3dfa3Zub3M7CisjZW5kaWYKK3sKKyAgICBjaGFyICAgIHBuYW1lW0FOQU1FX1NaXTsKKyAgICBjaGFyICAgIHBpbnN0W0lOU1RfU1pdOworICAgIGNoYXIgICAgcHJlYWxtW1JFQUxNX1NaXTsKKyAgICBjaGFyICAgIGJ1ZjFbMjBdLCBidWYyWzIwXTsKKyAgICBpbnQgICAgIGtfZXJybm87CisjaWZkZWYgT1MyCisgICAgTEVBU0hfQ1JFREVOVElBTFMgY3JlZHM7CisjZWxzZSAvKiBPUzIgKi8KKyAgICBDUkVERU5USUFMUyBjcmVkczsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpbnQgICAgIGhlYWRlciA9IDE7CisKKyAgICBmaWxlID0gdGt0X3N0cmluZygpOworCisgICAgaWYgKGxvbmdfZm9ybSkgeworICAgICAgICBwcmludGYoIlRpY2tldCBjYWNoZTogICAgICAlc1xyXG4iLCBmaWxlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNpbmNlIGtyYl9nZXRfdGZfcmVhbG0gd2lsbCByZXR1cm4gYSB0aWNrZXRfZmlsZSBlcnJvciwKKyAgICAgKiB3ZSB3aWxsIGNhbGwgdGZfaW5pdCBhbmQgdGZfY2xvc2UgZmlyc3QgdG8gZmlsdGVyIG91dAorICAgICAqIHRoaW5ncyBsaWtlIG5vIHRpY2tldCBmaWxlLiAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgdGhhdAorICAgICAqIHRoZSB1c2VyIHdvdWxkIHNlZSB3b3VsZCBiZQorICAgICAqIGtsaXN0OiBjYW4ndCBmaW5kIHJlYWxtIG9mIHRpY2tldCBmaWxlOiBObyB0aWNrZXQgZmlsZSAodGZfdXRpbCkKKyAgICAgKiBpbnN0ZWFkIG9mCisgICAgICoga2xpc3Q6IE5vIHRpY2tldCBmaWxlICh0Zl91dGlsKQorICAgICAqLworCisgICAgLyogT3BlbiB0aWNrZXQgZmlsZSAqLworICAgIGlmIChrX2Vycm5vID0gdGZfaW5pdChmaWxlLCBSX1RLVF9GSUwpKSB7CisgICAgICAgIGlmICghdGd0X3Rlc3QpCisgICAgICAgICAgICBwcmludGYoIiVzXHJcbiIsIGtyYl9nZXRfZXJyX3RleHRfZW50cnkgKGtfZXJybm8pKTsKKyAgICAgICAga3JiNF9lcnJubyA9IGtfZXJybm87CisgICAgICAgIG1ha2VzdHIoJmtyYjRfZXJybXNnLGtyYl9nZXRfZXJyX3RleHRfZW50cnkoa19lcnJubykpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworCisgICAgLyogQ2xvc2UgdGlja2V0IGZpbGUgKi8KKyAgICAodm9pZCkgdGZfY2xvc2UoKTsKKworICAgIC8qCisgICAgICogV2UgbXVzdCBmaW5kIHRoZSByZWFsbSBvZiB0aGUgdGlja2V0IGZpbGUgaGVyZSBiZWZvcmUgY2FsbGluZworICAgICAqIHRmX2luaXQgYmVjYXVzZSBzaW5jZSB0aGUgcmVhbG0gb2YgdGhlIHRpY2tldCBmaWxlIGlzIG5vdAorICAgICAqIHJlYWxseSBzdG9yZWQgaW4gdGhlIHByaW5jaXBhbCBzZWN0aW9uIG9mIHRoZSBmaWxlLCB0aGUKKyAgICAgKiByb3V0aW5lIHdlIHVzZSBtdXN0IGl0c2VsZiBjYWxsIHRmX2luaXQgYW5kIHRmX2Nsb3NlLgorICAgICAqLworICAgIGlmICgoa19lcnJubyA9IGtyYl9nZXRfdGZfcmVhbG0oZmlsZSwgcHJlYWxtKSkgIT0gQVVUSF9TVUNDRVNTKSB7CisgICAgICAgIGlmICghdGd0X3Rlc3QpCisgICAgICAgICAgICBwcmludGYoImNhbid0IGZpbmQgcmVhbG0gb2YgdGlja2V0IGZpbGU6ICVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgIGtyYl9nZXRfZXJyX3RleHRfZW50cnkgKGtfZXJybm8pKTsKKyAgICAgICAga3JiNF9lcnJubyA9IGtfZXJybm87CisgICAgICAgIG1ha2VzdHIoJmtyYjRfZXJybXNnLGtyYl9nZXRfZXJyX3RleHRfZW50cnkoa19lcnJubykpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIE9wZW4gdGlja2V0IGZpbGUgKi8KKyAgICBpZiAoa19lcnJubyA9IHRmX2luaXQoZmlsZSwgUl9US1RfRklMKSkgeworICAgICAgICBpZiAoIXRndF90ZXN0KQorICAgICAgICAgICAgcHJpbnRmKCIlc1xyXG4iLCBrcmJfZ2V0X2Vycl90ZXh0X2VudHJ5IChrX2Vycm5vKSk7CisgICAgICAgIGtyYjRfZXJybm8gPSBrX2Vycm5vOworICAgICAgICBtYWtlc3RyKCZrcmI0X2Vycm1zZyxrcmJfZ2V0X2Vycl90ZXh0X2VudHJ5KGtfZXJybm8pKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgLyogR2V0IHByaW5jaXBhbCBuYW1lIGFuZCBpbnN0YW5jZSAqLworICAgIGlmICgoa19lcnJubyA9IHRmX2dldF9wbmFtZShwbmFtZSkpIHx8CisgICAgICAgICAoa19lcnJubyA9IHRmX2dldF9waW5zdChwaW5zdCkpKSB7CisgICAgICAgICh2b2lkKSB0Zl9jbG9zZSgpOworICAgICAgICBpZiAoIXRndF90ZXN0KQorICAgICAgICAgICAgcHJpbnRmKCIlc1xyXG4iLCBrcmJfZ2V0X2Vycl90ZXh0X2VudHJ5IChrX2Vycm5vKSk7CisgICAgICAgIGtyYjRfZXJybm8gPSBrX2Vycm5vOworICAgICAgICBtYWtlc3RyKCZrcmI0X2Vycm1zZyxrcmJfZ2V0X2Vycl90ZXh0X2VudHJ5KGtfZXJybm8pKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFlvdSBtYXkgdGhpbmsgdGhhdCB0aGlzIGlzIHRoZSBvYnZpb3VzIHBsYWNlIHRvIGdldCB0aGUKKyAgICAgKiByZWFsbSBvZiB0aGUgdGlja2V0IGZpbGUsIGJ1dCBpdCBjYW4ndCBiZSBkb25lIGhlcmUgYXMgdGhlCisgICAgICogcm91dGluZSB0byBkbyB0aGlzIG11c3Qgb3BlbiB0aGUgdGlja2V0IGZpbGUuICBUaGlzIGlzIHdoeQorICAgICAqIGl0IHdhcyBkb25lIGJlZm9yZSB0Zl9pbml0LgorICAgICAqLworCisgICAgaWYgKCF0Z3RfdGVzdCAmJiBsb25nX2Zvcm0pCisgICAgICAgIHByaW50ZigiRGVmYXVsdCBwcmluY2lwYWw6ICVzJXMlcyVzJXNcclxuXHJcbiIsIHBuYW1lLAorICAgICAgICAgICAgICAgKHBpbnN0WzBdID8gIi4iIDogIiIpLCBwaW5zdCwKKyAgICAgICAgICAgICAgIChwcmVhbG1bMF0gPyAiQCIgOiAiIiksIHByZWFsbSk7CisKKyAgICB3aGlsZSAoKGtfZXJybm8gPSB0Zl9nZXRfY3JlZCgmY3JlZHMpKSA9PSBBVVRIX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKCF0Z3RfdGVzdCAmJiBsb25nX2Zvcm0gJiYgaGVhZGVyKSB7CisgICAgICAgICAgICBwcmludGYoIiUtMTdzICAlLTE3cyAgJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAiVmFsaWQgc3RhcnRpbmciLCAiRXhwaXJlcyIsICJTZXJ2aWNlIHByaW5jaXBhbCIpOworICAgICAgICAgICAgaGVhZGVyID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGd0X3Rlc3QpIHsKKyAgICAgICAgICAgIGNyZWRzLmlzc3VlX2RhdGUgKz0gKCh1bnNpZ25lZCBjaGFyKSBjcmVkcy5saWZldGltZSkgKiA1ICogNjA7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChjcmVkcy5zZXJ2aWNlLCAia3JidGd0IikgJiYKKyAgICAgICAgICAgICAgICAhc3RyY21wKGNyZWRzLmluc3RhbmNlLCBwcmVhbG0pKSB7CisgICAgICAgICAgICAgICAga3JiNF9lcnJubyA9IGtfZXJybm87CisgICAgICAgICAgICAgICAgbWFrZXN0cigma3JiNF9lcnJtc2csa3JiX2dldF9lcnJfdGV4dF9lbnRyeShrX2Vycm5vKSk7CisKKyAgICAgICAgICAgICAgICAodm9pZCkgdGZfY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZSgwKSA8IGNyZWRzLmlzc3VlX2RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOyAgICAgICAgICAvKiB0Z3QgaGFzbid0IGV4cGlyZWQgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOyAgICAgICAgIC8qIGhhcyBleHBpcmVkICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgIC8qIG5vdCBhIHRndCAqLworICAgICAgICB9CisgICAgICAgIGlmIChsb25nX2Zvcm0pIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcF93aWR0aCA9IDE3OyAgICAgICAvKiBmb3IgazUgZGlzcGxheSBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIGF2YWlsYWJsZSAgICAgICAgICAgICovCisgICAgICAgICAgICBwcmludHRpbWUoY3JlZHMuaXNzdWVfZGF0ZSk7CisgICAgICAgICAgICBwcmludGYoIiAgIik7CisgICAgICAgICAgICBjcmVkcy5pc3N1ZV9kYXRlICs9ICgodW5zaWduZWQgY2hhcikgY3JlZHMubGlmZXRpbWUpICogNSAqIDYwOworICAgICAgICAgICAgaWYgKCB0aW1lKDApIDwgY3JlZHMuaXNzdWVfZGF0ZSApCisgICAgICAgICAgICAgICAgcHJpbnR0aW1lKGNyZWRzLmlzc3VlX2RhdGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiKioqIGV4cGlyZWQgKioqICAiKTsKKyAgICAgICAgICAgIHByaW50ZigiICAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2hvd19rdm5vcykKKyAgICAgICAgICBwcmludGYoIiVzJXMlcyVzJXMgKCVkKVxyXG4iLAorICAgICAgICAgICAgICAgICBjcmVkcy5zZXJ2aWNlLCAoY3JlZHMuaW5zdGFuY2VbMF0gPyAiLiIgOiAiIiksIGNyZWRzLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAoY3JlZHMucmVhbG1bMF0gPyAiQCIgOiAiIiksIGNyZWRzLnJlYWxtLCBjcmVkcy5rdm5vKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZigiJXMlcyVzJXMlc1xyXG4iLAorICAgICAgICAgICAgICAgICBjcmVkcy5zZXJ2aWNlLCAoY3JlZHMuaW5zdGFuY2VbMF0gPyAiLiIgOiAiIiksIGNyZWRzLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAoY3JlZHMucmVhbG1bMF0gPyAiQCIgOiAiIiksIGNyZWRzLnJlYWxtKTsKKworI2lmZGVmIE9TMgorICAgICAgICBpZiAoIGNyZWRzLmFkZHJlc3NbMF0gKQorICAgICAgICAgICAgcHJpbnRmKCIgICBBZGRyZXNzOiAlc1xyXG4iLGNyZWRzLmFkZHJlc3MpOworI2VuZGlmIC8qIE9TMiAqLworICAgIH0KKworICAgICh2b2lkKSB0Zl9jbG9zZSgpOworCisgICAgaWYgKHRndF90ZXN0KSB7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfS8qIG5vIHRndCBmb3VuZCAqLworICAgIGlmIChoZWFkZXIgJiYgbG9uZ19mb3JtICYmIGtfZXJybm8gPT0gRU9GKSB7CisgICAgICAgIHByaW50ZigiTm8gdGlja2V0cyBpbiBmaWxlLlxyXG4iKTsKKyAgICB9CisgICAga3JiNF9lcnJubyA9IGtfZXJybm87CisgICAgbWFrZXN0cigma3JiNF9lcnJtc2csa3JiX2dldF9lcnJfdGV4dF9lbnRyeShrX2Vycm5vKSk7CisgICAgcmV0dXJuKDApOworfQorCisjaWZkZWYgQ09NTUVOVAorLyogSnVzdCBzbyB3ZSByZW1lbWJlciB3aGF0IHRoZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIGxvb2tlZCBsaWtlICovCit1c2FnZSgpCit7CisgICAgcHJpbnRmKAorICAgICAgICAiVXNhZ2U6IFsgLXMgfCAtdCBdIFsgLWZpbGUgZmlsZW5hbWUgXSBbIC1zcnZ0YWIgXSBbIC12ZXJzaW9uIF1cclxuIik7CisgICAgcmV0dXJuKC0xKTsKK30KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qIGFkYXB0ZWQgZnJvbSBnZXRzdCgpIGluIGxpYnJrYiAqLworLyoKKyAqIG9rX2dldHN0KCkgdGFrZXMgYSBmaWxlIGRlc2NyaXB0b3IsIGEgc3RyaW5nIGFuZCBhIGNvdW50LiAgSXQgcmVhZHMKKyAqIGZyb20gdGhlIGZpbGUgdW50aWwgZWl0aGVyIGl0IGhhcyByZWFkICJjb3VudCIgY2hhcmFjdGVycywgb3IgdW50aWwKKyAqIGl0IHJlYWRzIGEgbnVsbCBieXRlLiAgV2hlbiBmaW5pc2hlZCwgd2hhdCBoYXMgYmVlbiByZWFkIGV4aXN0cyBpbgorICogdGhlIGdpdmVuIHN0cmluZyAicyIuICBJZiAiY291bnQiIGNoYXJhY3RlcnMgd2VyZSBhY3R1YWxseSByZWFkLCB0aGUKKyAqIGxhc3QgaXMgY2hhbmdlZCB0byBhIG51bGwsIHNvIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgYWx3YXlzIG51bGwtCisgKiB0ZXJtaW5hdGVkLiAgb2tfZ2V0c3QoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBpbmNsdWRpbmcKKyAqIHRoZSBudWxsIHRlcm1pbmF0b3IuCisgKgorICogSWYgdGhlcmUgaXMgYSByZWFkIGVycm9yLCBpdCByZXR1cm5zIC0xIChsaWtlIHRoZSByZWFkKDIpIHN5c3RlbSBjYWxsKQorICovCisKK3N0YXRpYyBpbnQKKyNpZmRlZiBDS19BTlNJQworb2tfZ2V0c3QoaW50IGZkLCByZWdpc3RlciBjaGFyICpzLCBpbnQgbikKKyNlbHNlCitva19nZXRzdChmZCwgcywgbikgaW50IGZkOyByZWdpc3RlciBjaGFyICpzOyBpbnQgbjsKKyNlbmRpZgoreworICAgIHJlZ2lzdGVyIGludCBjb3VudCA9IG47CisgICAgaW50IGVycjsKKyAgICB3aGlsZSAoKGVyciA9IHJlYWQoZmQsIHMsIDEpKSA+IDAgJiYgLS1jb3VudCkKKyAgICAgICAgaWYgKCpzKysgPT0gJ1wwJykKKyAgICAgICAgICAgIHJldHVybiAobiAtIGNvdW50KTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAqcyA9ICdcMCc7CisgICAgcmV0dXJuIChuIC0gY291bnQpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworZGlzcGxheV9zcnZ0YWIoY2hhciAqZmlsZSkKKyNlbHNlCitkaXNwbGF5X3NydnRhYihmaWxlKSBjaGFyICpmaWxlOworI2VuZGlmCit7CisgICAgaW50IHN0YWI7CisgICAgY2hhciBzZXJ2W1NOQU1FX1NaXTsKKyAgICBjaGFyIGluc3RbSU5TVF9TWl07CisgICAgY2hhciBybG1bUkVBTE1fU1pdOworICAgIHVuc2lnbmVkIGNoYXIga2V5WzhdOworICAgIHVuc2lnbmVkIGNoYXIgdm5vOworICAgIGludCBjb3VudDsKKworICAgIHByaW50ZigiU2VydmVyIGtleSBmaWxlOiAgICVzXHJcbiIsIGZpbGUpOworI2lmZGVmIE5UCisjaWZuZGVmIE9fUkRPTkxZCisjZGVmaW5lIE9fUkRPTkxZIF9PX1JET05MWQorI2VuZGlmIC8qIE9fUkRPTkxZICovCisjZW5kaWYgLyogTlQgKi8KKworICAgIGlmICgoc3RhYiA9IG9wZW4oZmlsZSwgT19SRE9OTFksIDA0MDApKSA8IDApIHsKKyAgICAgICAgcGVycm9yKGZpbGUpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBwcmludGYoIiUtMTVzICUtMTVzICUtMTBzICVzXHJcbiIsIlNlcnZpY2UiLCJJbnN0YW5jZSIsIlJlYWxtIiwKKyAgICAgICAgICAgIktleSBWZXJzaW9uIik7CisgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIik7CisKKyAgICAvKiBhcmdoLiBnZXRzdCBkb2Vzbid0IHJldHVybiBlcnJvciBjb2RlcywgaXQgc2lsZW50bHkgZmFpbHMgKi8KKyAgICB3aGlsZSAoKChjb3VudCA9IG9rX2dldHN0KHN0YWIsIHNlcnYsIFNOQU1FX1NaKSkgPiAwKQorICAgICAgICAgICAmJiAoKGNvdW50ID0gb2tfZ2V0c3Qoc3RhYiwgaW5zdCwgSU5TVF9TWikpID4gMCkKKyAgICAgICAgICAgJiYgKChjb3VudCA9IG9rX2dldHN0KHN0YWIsIHJsbSwgUkVBTE1fU1opKSA+IDApKSB7CisgICAgICAgIGlmICgoKGNvdW50ID0gcmVhZChzdGFiLChjaGFyICopICZ2bm8sMSkpICE9IDEpIHx8CisgICAgICAgICAgICAgKChjb3VudCA9IHJlYWQoc3RhYiwoY2hhciAqKSBrZXksOCkpICE9IDgpKSB7CisgICAgICAgICAgICBpZiAoY291bnQgPCAwKQorICAgICAgICAgICAgICAgIHBlcnJvcigicmVhZGluZyBmcm9tIGtleSBmaWxlIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJrZXkgZmlsZSB0cnVuY2F0ZWRcclxuIik7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiJS0xNXMgJS0xNXMgJS0xNXMgJWRcclxuIixzZXJ2LGluc3QscmxtLHZubyk7CisgICAgfQorICAgIGlmIChjb3VudCA8IDApCisgICAgICAgIHBlcnJvcihmaWxlKTsKKyAgICAodm9pZCkgY2xvc2Uoc3RhYik7CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIEtMSVNUICovCisjZWxzZSAvKiBLUkI0ICovCitpbnQKK2NrX2tyYjRfYXV0b2dldF9UR1QoY2hhciAqIGR1bW15KQoreworICAgIHJldHVybigtMSk7Cit9CisjaWZkZWYgQ0tfS0VSQkVST1MKK2ludAorI2lmZGVmIENLX0FOU0lDCitja19rcmI0X2luaXRUR1Qoc3RydWN0IGtyYl9vcF9kYXRhICogb3AsIHN0cnVjdCBrcmI0X2luaXRfZGF0YSAqIGluaXQpCisjZWxzZQorY2tfa3JiNF9pbml0VEdUKG9wLGluaXQpCisgICAgc3RydWN0IGtyYl9vcF9kYXRhICogb3AsIHN0cnVjdCBrcmI0X2luaXRfZGF0YSAqIGluaXQKKyNlbmRpZgoreworICAgIHJldHVybigtMSk7Cit9CisKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNF9kZXN0cm95KHN0cnVjdCBrcmJfb3BfZGF0YSAqIG9wKQorI2Vsc2UKK2NrX2tyYjRfZGVzdHJveShvcCkgc3RydWN0IGtyYl9vcF9kYXRhICogb3A7CisjZW5kaWYKK3sKKyAgICByZXR1cm4oLTEpOworfQoraW50CisjaWZkZWYgQ0tfQU5TSUMKK2NrX2tyYjRfbGlzdF9jcmVkcyhzdHJ1Y3Qga3JiX29wX2RhdGEgKiBvcCkKKyNlbHNlCitja19rcmI0X2xpc3RfY3JlZHMob3ApIHN0cnVjdCBrcmJfb3BfZGF0YSAqIG9wOworI2VuZGlmCit7CisgICAgcmV0dXJuKC0xKTsKK30KKyNlbHNlIC8qIENLX0tFUkJFUk9TICovCitpbnQgY2tfa3JiNF9pbml0VEdUKHZvaWQgKiBhLCB2b2lkICpiKQoreworICAgIHJldHVybigtMSk7Cit9CitpbnQgY2tfa3JiNF9kZXN0cm95KHZvaWQgKmEpCit7CisgICAgcmV0dXJuKC0xKTsKK30KK2ludCBja19rcmI0X2xpc3RfY3JlZHModm9pZCAqYSkKK3sKKyAgICByZXR1cm4oLTEpOworfQorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisjZW5kaWYgLyogS1JCNCAqLworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIEtlcm1pdCBTY3JpcHQgTGFuZ3VhZ2UgKi8KKy8qIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdHJ1Y3QgdGt0X2xpc3RfaXRlbSB7CisgICAgY2hhciAqIG5hbWU7CisgICAgc3RydWN0IHRrdF9saXN0X2l0ZW0gKiBuZXh0OworfTsKKworc3RhdGljIHN0cnVjdCB0a3RfbGlzdF9pdGVtICogazRfdGt0X2xpc3QgPSBOVUxMOworCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNF9nZXRfdGt0cyhWT0lEKQorI2Vsc2UKK2NrX2tyYjRfZ2V0X3RrdHMoKQorI2VuZGlmCit7CisjaWZkZWYgS1JCNAorICAgIGNoYXIgICAqZmlsZT1OVUxMOworICAgIGNoYXIgICAgcG5hbWVbQU5BTUVfU1pdOworICAgIGNoYXIgICAgcGluc3RbSU5TVF9TWl07CisgICAgY2hhciAgICBwcmVhbG1bUkVBTE1fU1pdOworICAgIGNoYXIgICAgYnVmMVsyMF0sIGJ1ZjJbMjBdOworICAgIGludCAgICAga19lcnJubzsKKyNpZmRlZiBPUzIKKyAgICBMRUFTSF9DUkVERU5USUFMUyBjcmVkczsKKyNlbHNlIC8qIE9TMiAqLworICAgIENSRURFTlRJQUxTIGNyZWRzOworI2VuZGlmIC8qIE9TMiAqLworICAgIGludCAgICAgdGt0X2NvdW50PTA7CisgICAgc3RydWN0ICB0a3RfbGlzdF9pdGVtICoqIGxpc3QgPSAmazRfdGt0X2xpc3Q7CisKKyAgICB3aGlsZSAoIGs0X3RrdF9saXN0ICkgeworICAgICAgICBzdHJ1Y3QgdGt0X2xpc3RfaXRlbSAqIG5leHQ7CisgICAgICAgIG5leHQgPSBrNF90a3RfbGlzdC0+bmV4dDsKKyAgICAgICAgZnJlZShrNF90a3RfbGlzdC0+bmFtZSk7CisgICAgICAgIGZyZWUoazRfdGt0X2xpc3QpOworICAgICAgICBrNF90a3RfbGlzdCA9IG5leHQ7CisgICAgfQorCisgICAgaWYgKCAhY2tfa3JiNF9pc19pbnN0YWxsZWQoKSApCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICBmaWxlID0gdGt0X3N0cmluZygpOworCisgICAgLyoKKyAgICAgKiBTaW5jZSBrcmJfZ2V0X3RmX3JlYWxtIHdpbGwgcmV0dXJuIGEgdGlja2V0X2ZpbGUgZXJyb3IsCisgICAgICogd2Ugd2lsbCBjYWxsIHRmX2luaXQgYW5kIHRmX2Nsb3NlIGZpcnN0IHRvIGZpbHRlciBvdXQKKyAgICAgKiB0aGluZ3MgbGlrZSBubyB0aWNrZXQgZmlsZS4gIE90aGVyd2lzZSwgdGhlIGVycm9yIHRoYXQKKyAgICAgKiB0aGUgdXNlciB3b3VsZCBzZWUgd291bGQgYmUKKyAgICAgKiBrbGlzdDogY2FuJ3QgZmluZCByZWFsbSBvZiB0aWNrZXQgZmlsZTogTm8gdGlja2V0IGZpbGUgKHRmX3V0aWwpCisgICAgICogaW5zdGVhZCBvZgorICAgICAqIGtsaXN0OiBObyB0aWNrZXQgZmlsZSAodGZfdXRpbCkKKyAgICAgKi8KKworICAgIC8qIE9wZW4gdGlja2V0IGZpbGUgKi8KKyAgICBpZiAoa19lcnJubyA9IHRmX2luaXQoZmlsZSwgUl9US1RfRklMKSkgeworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIENsb3NlIHRpY2tldCBmaWxlICovCisgICAgKHZvaWQpIHRmX2Nsb3NlKCk7CisKKyAgICAvKgorICAgICAqIFdlIG11c3QgZmluZCB0aGUgcmVhbG0gb2YgdGhlIHRpY2tldCBmaWxlIGhlcmUgYmVmb3JlIGNhbGxpbmcKKyAgICAgKiB0Zl9pbml0IGJlY2F1c2Ugc2luY2UgdGhlIHJlYWxtIG9mIHRoZSB0aWNrZXQgZmlsZSBpcyBub3QKKyAgICAgKiByZWFsbHkgc3RvcmVkIGluIHRoZSBwcmluY2lwYWwgc2VjdGlvbiBvZiB0aGUgZmlsZSwgdGhlCisgICAgICogcm91dGluZSB3ZSB1c2UgbXVzdCBpdHNlbGYgY2FsbCB0Zl9pbml0IGFuZCB0Zl9jbG9zZS4KKyAgICAgKi8KKyAgICBpZiAoKGtfZXJybm8gPSBrcmJfZ2V0X3RmX3JlYWxtKGZpbGUsIHByZWFsbSkpICE9IEFVVEhfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIE9wZW4gdGlja2V0IGZpbGUgKi8KKyAgICBpZiAoa19lcnJubyA9IHRmX2luaXQoZmlsZSwgUl9US1RfRklMKSkgeworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICAvKiBHZXQgcHJpbmNpcGFsIG5hbWUgYW5kIGluc3RhbmNlICovCisgICAgaWYgKChrX2Vycm5vID0gdGZfZ2V0X3BuYW1lKHBuYW1lKSkgfHwKKyAgICAgICAgIChrX2Vycm5vID0gdGZfZ2V0X3BpbnN0KHBpbnN0KSkpIHsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFlvdSBtYXkgdGhpbmsgdGhhdCB0aGlzIGlzIHRoZSBvYnZpb3VzIHBsYWNlIHRvIGdldCB0aGUKKyAgICAgKiByZWFsbSBvZiB0aGUgdGlja2V0IGZpbGUsIGJ1dCBpdCBjYW4ndCBiZSBkb25lIGhlcmUgYXMgdGhlCisgICAgICogcm91dGluZSB0byBkbyB0aGlzIG11c3Qgb3BlbiB0aGUgdGlja2V0IGZpbGUuICBUaGlzIGlzIHdoeQorICAgICAqIGl0IHdhcyBkb25lIGJlZm9yZSB0Zl9pbml0LgorICAgICAqLworCisgICAgd2hpbGUgKChrX2Vycm5vID0gdGZfZ2V0X2NyZWQoJmNyZWRzKSkgPT0gQVVUSF9TVUNDRVNTKSB7CisgICAgICAgIGNoYXIgdGt0X2J1ZlsyNTZdOworICAgICAgICBja21ha3htc2codGt0X2J1ZixzaXplb2YodGt0X2J1ZiksCisgICAgICAgICAgICAgICAgIGNyZWRzLnNlcnZpY2UsIChjcmVkcy5pbnN0YW5jZVswXSA/ICIuIiA6ICIiKSwgY3JlZHMuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgIChjcmVkcy5yZWFsbVswXSA/ICJAIiA6ICIiKSwgY3JlZHMucmVhbG0sCisgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgICAgICAqbGlzdCA9IChzdHJ1Y3QgdGt0X2xpc3RfaXRlbSAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB0a3RfbGlzdF9pdGVtKSk7CisgICAgICAgICgqbGlzdCktPm5hbWUgPSBzdHJkdXAodGt0X2J1Zik7CisgICAgICAgICgqbGlzdCktPm5leHQgPSBOVUxMOworICAgICAgICBsaXN0ID0gJigoKmxpc3QpLT5uZXh0KTsKKyAgICAgICAgdGt0X2NvdW50Kys7CisgICAgfQorCisgICAgdGZfY2xvc2UoKTsKKyAgICByZXR1cm4odGt0X2NvdW50KTsKKyNlbHNlIC8qIEtSQjQgKi8KKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogS1JCNCAqLworfQorCitjaGFyICoKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNF9nZXRfbmV4dF90a3QoVk9JRCkKKyNlbHNlCitja19rcmI0X2dldF9uZXh0X3RrdCgpCisjZW5kaWYKK3sKKyNpZmRlZiBLUkI0CisgICAgc3RhdGljIGNoYXIgKiBzPU5VTEw7CisgICAgc3RydWN0IHRrdF9saXN0X2l0ZW0gKiBuZXh0PU5VTEw7CisKKyAgICBpZiAoIHMgKSB7CisgICAgICAgIGZyZWUocyk7CisgICAgICAgIHMgPSBOVUxMOworICAgIH0KKworICAgIGlmICggazRfdGt0X2xpc3QgPT0gTlVMTCApCisgICAgICAgIHJldHVybihOVUxMKTsKKworICAgIG5leHQgPSBrNF90a3RfbGlzdC0+bmV4dDsKKyAgICBzID0gazRfdGt0X2xpc3QtPm5hbWU7CisgICAgZnJlZShrNF90a3RfbGlzdCk7CisgICAgazRfdGt0X2xpc3QgPSBuZXh0OworICAgIHJldHVybihzKTsKKyNlbHNlIC8qIEtSQjQgKi8KKyAgICByZXR1cm4oTlVMTCk7CisjZW5kaWYgLyogS1JCNCAqLworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNF90a3RfaXN2YWxpZChjaGFyICogdGt0bmFtZSkKKyNlbHNlCitja19rcmI0X3RrdF9pc3ZhbGlkKHRrdG5hbWUpIGNoYXIgKiB0a3RuYW1lOworI2VuZGlmCit7CisjaWZkZWYgS1JCNAorICAgIGNoYXIgICAqZmlsZT1OVUxMOworICAgIGNoYXIgICAgcG5hbWVbQU5BTUVfU1pdOworICAgIGNoYXIgICAgcGluc3RbSU5TVF9TWl07CisgICAgY2hhciAgICBwcmVhbG1bUkVBTE1fU1pdOworICAgIGNoYXIgICAgYnVmMVsyMF0sIGJ1ZjJbMjBdOworICAgIGludCAgICAga19lcnJubzsKKyAgICB0aW1lX3QgIGlzc3VlX3QsIGV4cGlyZV90LCBub3dfdDsKKyNpZmRlZiBPUzIKKyAgICBMRUFTSF9DUkVERU5USUFMUyBjcmVkczsKKyNlbHNlIC8qIE9TMiAqLworICAgIENSRURFTlRJQUxTIGNyZWRzOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgaWYgKCAhY2tfa3JiNF9pc19pbnN0YWxsZWQoKSApCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICBkZWJ1ZyhGMTEwLCJja19rcmI0X3RrdF9pc3ZhbGlkIiwidGt0X3N0cmluZyIsMCk7CisgICAgZmlsZSA9IHRrdF9zdHJpbmcoKTsKKworICAgIC8qCisgICAgICogU2luY2Uga3JiX2dldF90Zl9yZWFsbSB3aWxsIHJldHVybiBhIHRpY2tldF9maWxlIGVycm9yLAorICAgICAqIHdlIHdpbGwgY2FsbCB0Zl9pbml0IGFuZCB0Zl9jbG9zZSBmaXJzdCB0byBmaWx0ZXIgb3V0CisgICAgICogdGhpbmdzIGxpa2Ugbm8gdGlja2V0IGZpbGUuICBPdGhlcndpc2UsIHRoZSBlcnJvciB0aGF0CisgICAgICogdGhlIHVzZXIgd291bGQgc2VlIHdvdWxkIGJlCisgICAgICoga2xpc3Q6IGNhbid0IGZpbmQgcmVhbG0gb2YgdGlja2V0IGZpbGU6IE5vIHRpY2tldCBmaWxlICh0Zl91dGlsKQorICAgICAqIGluc3RlYWQgb2YKKyAgICAgKiBrbGlzdDogTm8gdGlja2V0IGZpbGUgKHRmX3V0aWwpCisgICAgICovCisKKyAgICAvKiBPcGVuIHRpY2tldCBmaWxlICovCisgICAgZGVidWcoRjExMCwiY2tfa3JiNF90a3RfaXN2YWxpZCIsInRmX2luaXQiLDApOworICAgIGlmIChrX2Vycm5vID0gdGZfaW5pdChmaWxlLCBSX1RLVF9GSUwpKSB7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgLyogQ2xvc2UgdGlja2V0IGZpbGUgKi8KKyAgICBkZWJ1ZyhGMTEwLCJja19rcmI0X3RrdF9pc3ZhbGlkIiwidGZfY2xvc2UiLDApOworICAgICh2b2lkKSB0Zl9jbG9zZSgpOworCisgICAgLyoKKyAgICAgKiBXZSBtdXN0IGZpbmQgdGhlIHJlYWxtIG9mIHRoZSB0aWNrZXQgZmlsZSBoZXJlIGJlZm9yZSBjYWxsaW5nCisgICAgICogdGZfaW5pdCBiZWNhdXNlIHNpbmNlIHRoZSByZWFsbSBvZiB0aGUgdGlja2V0IGZpbGUgaXMgbm90CisgICAgICogcmVhbGx5IHN0b3JlZCBpbiB0aGUgcHJpbmNpcGFsIHNlY3Rpb24gb2YgdGhlIGZpbGUsIHRoZQorICAgICAqIHJvdXRpbmUgd2UgdXNlIG11c3QgaXRzZWxmIGNhbGwgdGZfaW5pdCBhbmQgdGZfY2xvc2UuCisgICAgICovCisgICAgZGVidWcoRjExMCwiY2tfa3JiNF90a3RfaXN2YWxpZCIsImtyYl9nZXRfdGZfcmVhbG0iLDApOworICAgIGlmICgoa19lcnJubyA9IGtyYl9nZXRfdGZfcmVhbG0oZmlsZSwgcHJlYWxtKSkgIT0gQVVUSF9TVUNDRVNTKSB7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgLyogT3BlbiB0aWNrZXQgZmlsZSAqLworICAgIGRlYnVnKEYxMTAsImNrX2tyYjRfdGt0X2lzdmFsaWQiLCJ0Zl9pbml0IiwwKTsKKyAgICBpZiAoa19lcnJubyA9IHRmX2luaXQoZmlsZSwgUl9US1RfRklMKSkgeworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICAvKiBHZXQgcHJpbmNpcGFsIG5hbWUgYW5kIGluc3RhbmNlICovCisgICAgZGVidWcoRjExMCwiY2tfa3JiNF90a3RfaXN2YWxpZCIsInRmX2dldF9uYW1lL3RmX2dldF9waW5zdCIsMCk7CisgICAgaWYgKChrX2Vycm5vID0gdGZfZ2V0X3BuYW1lKHBuYW1lKSkgfHwKKyAgICAgICAgIChrX2Vycm5vID0gdGZfZ2V0X3BpbnN0KHBpbnN0KSkpIHsKKworICAgICAgICAvKiBDbG9zZSB0aWNrZXQgZmlsZSAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJja19rcmI0X3RrdF9pc3ZhbGlkIiwidGZfY2xvc2UiLDApOworICAgICAgICAodm9pZCkgdGZfY2xvc2UoKTsKKworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qCisgICAgICogWW91IG1heSB0aGluayB0aGF0IHRoaXMgaXMgdGhlIG9idmlvdXMgcGxhY2UgdG8gZ2V0IHRoZQorICAgICAqIHJlYWxtIG9mIHRoZSB0aWNrZXQgZmlsZSwgYnV0IGl0IGNhbid0IGJlIGRvbmUgaGVyZSBhcyB0aGUKKyAgICAgKiByb3V0aW5lIHRvIGRvIHRoaXMgbXVzdCBvcGVuIHRoZSB0aWNrZXQgZmlsZS4gIFRoaXMgaXMgd2h5CisgICAgICogaXQgd2FzIGRvbmUgYmVmb3JlIHRmX2luaXQuCisgICAgICovCisKKyAgICBkZWJ1ZyhGMTEwLCJja19rcmI0X3RrdF9pc3ZhbGlkIiwidGZfZ2V0X2NyZWQiLDApOworICAgIHdoaWxlICgoa19lcnJubyA9IHRmX2dldF9jcmVkKCZjcmVkcykpID09IEFVVEhfU1VDQ0VTUykgeworICAgICAgICBjaGFyIHRrdF9idWZbMjU2XTsKKyAgICAgICAgY2ttYWt4bXNnKHRrdF9idWYsc2l6ZW9mKHRrdF9idWYpLAorICAgICAgICAgICAgICAgICBjcmVkcy5zZXJ2aWNlLCAoY3JlZHMuaW5zdGFuY2VbMF0gPyAiLiIgOiAiIiksIGNyZWRzLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAoY3JlZHMucmVhbG1bMF0gPyAiQCIgOiAiIiksIGNyZWRzLnJlYWxtLAorICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKCAhc3RyY21wKHRrdG5hbWUsdGt0X2J1ZikgKSB7CisKKyAgICAgICAgICAgIC8qIHdlIGZvdW5kIHRoZSB0aWNrZXQgd2UgYXJlIGxvb2tpbmcgZm9yICovCisgICAgICAgICAgICBpc3N1ZV90ID0gY3JlZHMuaXNzdWVfZGF0ZTsKKyAgICAgICAgICAgIGV4cGlyZV90ID0gY3JlZHMuaXNzdWVfZGF0ZQorICAgICAgICAgICAgICAgICsgKCh1bnNpZ25lZCBjaGFyKSBjcmVkcy5saWZldGltZSkgKiA1ICogNjA7CisgICAgICAgICAgICBub3dfdCA9IHRpbWUoMCk7CisKKyAgICAgICAgICAgIC8qIFdlIGFkZCBhIDUgbWludXRlcyBmdWRnZSBmYWN0b3IgdG8gY29tcGVuc2F0ZSBmb3IgcG90ZW50aWFsICovCisgICAgICAgICAgICAvKiBjbG9jayBza2V3IGVycm9ycyBiZXR3ZWVuIHRoZSBLREMgYW5kIEs5NSdzIGhvc3QgT1MgICAgICAgICAqLworCisgICAgICAgICAgICBpZiAoIG5vd190ID49IChpc3N1ZV90LTMwMCkgJiYgbm93X3QgPCBleHBpcmVfdCkgeworI2lmZGVmIE9TMgorI2lmZGVmIENIRUNLQUREUlMKKyAgICAgICAgICAgICAgICBpZiAoIGtyYjRfY2hlY2thZGRycyApIHsKKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgbXlpcGFkZHJbMjBdOyAgICAgICAvKiBGcm9tIGNrY25ldC5jICovCisgICAgICAgICAgICAgICAgICAgIGlmICggIW15aXBhZGRyWzBdICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGJ1Zls2MF07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBpPTA7aTw2NDtpKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBnZXRsb2NhbGlwYWRkcnMoYnVmLDYwLGkpIDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhc3RyY21wKGJ1ZixjcmVkcy5hZGRyZXNzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xvc2UgdGlja2V0IGZpbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfa3JiNF90a3RfaXN2YWxpZCIsInRmX2Nsb3NlIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHRmX2Nsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigxKTsgLyogVGhleSdyZSB0aGUgc2FtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xvc2UgdGlja2V0IGZpbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX2tyYjRfdGt0X2lzdmFsaWQiLCJ0Zl9jbG9zZSIsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgdGZfY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAvKiBUaGV5J3JlIGRpZmZlcmVudCAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBzdHJjbXAobXlpcGFkZHIsY3JlZHMuYWRkcmVzcykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbG9zZSB0aWNrZXQgZmlsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfa3JiNF90a3RfaXN2YWxpZCIsInRmX2Nsb3NlIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSB0Zl9jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgIC8qIFRoZXkncmUgZGlmZmVyZW50ICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbG9zZSB0aWNrZXQgZmlsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfa3JiNF90a3RfaXN2YWxpZCIsInRmX2Nsb3NlIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSB0Zl9jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOyAgICAgICAgICAgICAgICAgIC8qIFRoZXkncmUgdGhlIHNhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIENsb3NlIHRpY2tldCBmaWxlICovCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX2tyYjRfdGt0X2lzdmFsaWQiLCJ0Zl9jbG9zZSIsMCk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB0Zl9jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oMSk7ICAgICAgICAgICAgICAgICAgLyogVGhleSdyZSB0aGUgc2FtZSAqLworICAgICAgICAgICAgICAgIH0KKyNlbHNlIC8qIENIRUNLQUREUlMgKi8KKyAgICAgICAgICAgICAgICAvKiBDbG9zZSB0aWNrZXQgZmlsZSAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX2tyYjRfdGt0X2lzdmFsaWQiLCJ0Zl9jbG9zZSIsMCk7CisgICAgICAgICAgICAgICAgKHZvaWQpIHRmX2Nsb3NlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKDEpOyAgICAgIC8qIHZhbGlkIGJ1dCBubyBpcCBhZGRyZXNzIGNoZWNrICovCisjZW5kaWYgLyogQ0hFQ0tBRERSUyAqLworI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgICAgICAgLyogQ2xvc2UgdGlja2V0IGZpbGUgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJja19rcmI0X3RrdF9pc3ZhbGlkIiwidGZfY2xvc2UiLDApOworICAgICAgICAgICAgICAgICh2b2lkKSB0Zl9jbG9zZSgpOworICAgICAgICAgICAgICAgIHJldHVybigxKTsgICAgICAvKiBWYWxpZCBidXQgbm8gaXAgYWRkcmVzcyBjaGVjayAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogQ2xvc2UgdGlja2V0IGZpbGUgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJja19rcmI0X3RrdF9pc3ZhbGlkIiwidGZfY2xvc2UiLDApOworICAgICAgICAgICAgICAgICh2b2lkKSB0Zl9jbG9zZSgpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsgICAgICAvKiBleHBpcmVkIG9yIG90aGVyd2lzZSBpbnZhbGlkICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQ2xvc2UgdGlja2V0IGZpbGUgKi8KKyAgICBkZWJ1ZyhGMTEwLCJja19rcmI0X3RrdF9pc3ZhbGlkIiwidGZfY2xvc2UiLDApOworICAgICh2b2lkKSB0Zl9jbG9zZSgpOworICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAvKiBjb3VsZCBub3QgZmluZCB0aGUgZGVzaXJlZCB0aWNrZXQgKi8KKyNlbHNlIC8qIEtSQjQgKi8KKyAgICByZXR1cm4oLTEpOworI2VuZGlmIC8qIEtSQjQgKi8KK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2NrX2tyYjRfaXNfdGd0X3ZhbGlkKFZPSUQpCisjZWxzZQorY2tfa3JiNF9pc190Z3RfdmFsaWQoKQorI2VuZGlmCit7CisjaWZkZWYgS1JCNAorICAgIGNoYXIgdGd0WzI1Nl07CisgICAgY2hhciAqIHM7CisgICAgaW50IHJjID0gMDsKKworICAgIHMgPSBrcmI0X2RfcmVhbG0gPyBrcmI0X2RfcmVhbG0gOiBja19rcmI0X2dldHJlYWxtKCk7CisgICAgY2ttYWttc2codGd0LHNpemVvZih0Z3QpLCJrcmJ0Z3QuIixzLCJAIixzKTsKKyAgICByYyA9IGNrX2tyYjRfdGt0X2lzdmFsaWQodGd0KTsKKyAgICBkZWJ1ZyhGMTExLCJja19rcmI0X2lzX3RndF92YWxpZCIsdGd0LHJjKTsKKyAgICByZXR1cm4ocmMgPiAwKTsKKyNlbHNlIC8qIEtSQjQgKi8KKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogS1JCNCAqLworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNF90a3RfdGltZShjaGFyICogdGt0bmFtZSkKKyNlbHNlCitja19rcmI0X3RrdF90aW1lKHRrdG5hbWUpIGNoYXIgKiB0a3RuYW1lOworI2VuZGlmCit7CisjaWZkZWYgS1JCNAorICAgIGNoYXIgICAqZmlsZT1OVUxMOworICAgIGNoYXIgICAgcG5hbWVbQU5BTUVfU1pdOworICAgIGNoYXIgICAgcGluc3RbSU5TVF9TWl07CisgICAgY2hhciAgICBwcmVhbG1bUkVBTE1fU1pdOworICAgIGNoYXIgICAgYnVmMVsyMF0sIGJ1ZjJbMjBdOworICAgIGludCAgICAga19lcnJubzsKKyNpZmRlZiBPUzIKKyAgICBMRUFTSF9DUkVERU5USUFMUyBjcmVkczsKKyNlbHNlIC8qIE9TMiAqLworICAgIENSRURFTlRJQUxTIGNyZWRzOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgaWYgKCAhY2tfa3JiNF9pc19pbnN0YWxsZWQoKSApCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICBmaWxlID0gdGt0X3N0cmluZygpOworCisgICAgLyoKKyAgICAgKiBTaW5jZSBrcmJfZ2V0X3RmX3JlYWxtIHdpbGwgcmV0dXJuIGEgdGlja2V0X2ZpbGUgZXJyb3IsCisgICAgICogd2Ugd2lsbCBjYWxsIHRmX2luaXQgYW5kIHRmX2Nsb3NlIGZpcnN0IHRvIGZpbHRlciBvdXQKKyAgICAgKiB0aGluZ3MgbGlrZSBubyB0aWNrZXQgZmlsZS4gIE90aGVyd2lzZSwgdGhlIGVycm9yIHRoYXQKKyAgICAgKiB0aGUgdXNlciB3b3VsZCBzZWUgd291bGQgYmUKKyAgICAgKiBrbGlzdDogY2FuJ3QgZmluZCByZWFsbSBvZiB0aWNrZXQgZmlsZTogTm8gdGlja2V0IGZpbGUgKHRmX3V0aWwpCisgICAgICogaW5zdGVhZCBvZgorICAgICAqIGtsaXN0OiBObyB0aWNrZXQgZmlsZSAodGZfdXRpbCkKKyAgICAgKi8KKworICAgIC8qIE9wZW4gdGlja2V0IGZpbGUgKi8KKyAgICBpZiAoa19lcnJubyA9IHRmX2luaXQoZmlsZSwgUl9US1RfRklMKSkgeworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIENsb3NlIHRpY2tldCBmaWxlICovCisgICAgKHZvaWQpIHRmX2Nsb3NlKCk7CisKKyAgICAvKgorICAgICAqIFdlIG11c3QgZmluZCB0aGUgcmVhbG0gb2YgdGhlIHRpY2tldCBmaWxlIGhlcmUgYmVmb3JlIGNhbGxpbmcKKyAgICAgKiB0Zl9pbml0IGJlY2F1c2Ugc2luY2UgdGhlIHJlYWxtIG9mIHRoZSB0aWNrZXQgZmlsZSBpcyBub3QKKyAgICAgKiByZWFsbHkgc3RvcmVkIGluIHRoZSBwcmluY2lwYWwgc2VjdGlvbiBvZiB0aGUgZmlsZSwgdGhlCisgICAgICogcm91dGluZSB3ZSB1c2UgbXVzdCBpdHNlbGYgY2FsbCB0Zl9pbml0IGFuZCB0Zl9jbG9zZS4KKyAgICAgKi8KKyAgICBpZiAoKGtfZXJybm8gPSBrcmJfZ2V0X3RmX3JlYWxtKGZpbGUsIHByZWFsbSkpICE9IEFVVEhfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIE9wZW4gdGlja2V0IGZpbGUgKi8KKyAgICBpZiAoa19lcnJubyA9IHRmX2luaXQoZmlsZSwgUl9US1RfRklMKSkgeworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICAvKiBHZXQgcHJpbmNpcGFsIG5hbWUgYW5kIGluc3RhbmNlICovCisgICAgaWYgKChrX2Vycm5vID0gdGZfZ2V0X3BuYW1lKHBuYW1lKSkgfHwKKyAgICAgICAgIChrX2Vycm5vID0gdGZfZ2V0X3BpbnN0KHBpbnN0KSkpIHsKKyAgICAgICAgdGZfY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFlvdSBtYXkgdGhpbmsgdGhhdCB0aGlzIGlzIHRoZSBvYnZpb3VzIHBsYWNlIHRvIGdldCB0aGUKKyAgICAgKiByZWFsbSBvZiB0aGUgdGlja2V0IGZpbGUsIGJ1dCBpdCBjYW4ndCBiZSBkb25lIGhlcmUgYXMgdGhlCisgICAgICogcm91dGluZSB0byBkbyB0aGlzIG11c3Qgb3BlbiB0aGUgdGlja2V0IGZpbGUuICBUaGlzIGlzIHdoeQorICAgICAqIGl0IHdhcyBkb25lIGJlZm9yZSB0Zl9pbml0LgorICAgICAqLworCisgICAgd2hpbGUgKChrX2Vycm5vID0gdGZfZ2V0X2NyZWQoJmNyZWRzKSkgPT0gQVVUSF9TVUNDRVNTKSB7CisgICAgICAgIGNoYXIgdGt0X2J1ZlsyNTZdOworICAgICAgICBja21ha3htc2codGt0X2J1ZixzaXplb2YodGt0X2J1ZiksCisgICAgICAgICAgICAgICAgIGNyZWRzLnNlcnZpY2UsIChjcmVkcy5pbnN0YW5jZVswXSA/ICIuIiA6ICIiKSwKKyAgICAgICAgICAgICAgICAgY3JlZHMuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgIChjcmVkcy5yZWFsbVswXSA/ICJAIiA6ICIiKSwgY3JlZHMucmVhbG0sCisgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgICAgICBpZiAoICFzdHJjbXAodGt0bmFtZSx0a3RfYnVmKSApIHsKKyAgICAgICAgICAgIC8qIHdlIGZvdW5kIHRoZSB0aWNrZXQgd2UgYXJlIGxvb2tpbmcgZm9yICovCisgICAgICAgICAgICBpbnQgbiA9IChjcmVkcy5pc3N1ZV9kYXRlCisgICAgICAgICAgICAgICAgICAgICAgKyAoKCh1bnNpZ25lZCBjaGFyKSBjcmVkcy5saWZldGltZSkgKiA1ICogNjApKQorICAgICAgICAgICAgICAgIC0gdGltZSgwKTsKKyAgICAgICAgICAgIHRmX2Nsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4obiA8PSAwID8gMCA6IG4pOworICAgICAgICB9CisgICAgfQorICAgIHRmX2Nsb3NlKCk7CisgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgIC8qIGNvdWxkIG5vdCBmaW5kIHRoZSBkZXNpcmVkIHRpY2tldCAqLworI2Vsc2UgLyogS1JCNCAqLworICAgIHJldHVybigtMSk7CisjZW5kaWYgLyogS1JCNCAqLworfQorCitjaGFyICoKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNF9nZXRyZWFsbSh2b2lkKQorI2Vsc2UKK2NrX2tyYjRfZ2V0cmVhbG0oKQorI2VuZGlmCit7CisjaWZkZWYgS1JCNAorICAgIGNoYXIgICAqZmlsZT1OVUxMOworICAgIGludCAgICAga19lcnJubzsKKyAgICBzdGF0aWMgY2hhciByZWFsbVsyNTZdPSIiOworICAgIHJlYWxtWzBdPSdcMCc7CisKKyAgICBpZiAoICFja19rcmI0X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuKHJlYWxtKTsKKworICAgIC8qIFRyeSB0byBnZXQgcmVhbG0gZnJvbSB0aWNrZXQgZmlsZSAqLworICAgIC8qIElmIGZhaWx1cmUgZ2V0IHRoZSBsb2NhbCByZWFsbSAgICAqLworCisgICAgLyoKKyAgICAqIFNpbmNlIGtyYl9nZXRfdGZfcmVhbG0gd2lsbCByZXR1cm4gYSB0aWNrZXRfZmlsZSBlcnJvciwKKyAgICAqIHdlIHdpbGwgY2FsbCB0Zl9pbml0IGFuZCB0Zl9jbG9zZSBmaXJzdCB0byBmaWx0ZXIgb3V0CisgICAgKiB0aGluZ3MgbGlrZSBubyB0aWNrZXQgZmlsZS4KKyAgICAqLworCisgICAgLyogT3BlbiB0aWNrZXQgZmlsZSAqLworICAgIGZpbGUgPSB0a3Rfc3RyaW5nKCk7CisgICAgaWYgKGZpbGUgPT0gTlVMTCB8fCAhZmlsZVswXSkKKyAgICAgICAgcmV0dXJuKHJlYWxtKTsKKworICAgIGlmICgoa19lcnJubyA9IHRmX2luaXQoZmlsZSwgUl9US1RfRklMKSkgPT0gS1NVQ0NFU1MpIHsKKyAgICAgICAgLyogQ2xvc2UgdGlja2V0IGZpbGUgKi8KKyAgICAgICAgKHZvaWQpIHRmX2Nsb3NlKCk7CisKKyAgICAgICAga19lcnJubyA9IGtyYl9nZXRfdGZfcmVhbG0oZmlsZSwgcmVhbG0pOworICAgIH0KKyAgICBpZiAoa19lcnJubyAhPSBLU1VDQ0VTUykgeworICAgICAgICBrX2Vycm5vID0ga3JiX2dldF9scmVhbG0ocmVhbG0sIDEpOworICAgIH0KKyAgICByZXR1cm4ocmVhbG0pOworI2Vsc2UgLyogS1JCNCAqLworICAgIHJldHVybigiIik7CisjZW5kaWYgLyogS1JCNCAqLworfQorCitjaGFyICoKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNF9nZXRwcmluY2lwYWwodm9pZCkKKyNlbHNlCitja19rcmI0X2dldHByaW5jaXBhbCgpCisjZW5kaWYKK3sKKyNpZmRlZiBLUkI0CisgICAgY2hhciAgICpmaWxlPU5VTEw7CisgICAgaW50ICAgICBrX2Vycm5vOworICAgIHN0YXRpYyBjaGFyIHByaW5jaXBhbFsyNTZdPSIiOworICAgIGNoYXIgICAgICAgIGluc3RhbmNlWzI1Nl09IiI7CisgICAgY2hhciAgICAgICAgcmVhbG1bMjU2XT0iIjsKKyAgICBwcmluY2lwYWxbMF09J1wwJzsKKworICAgIGlmICggIWNrX2tyYjRfaXNfaW5zdGFsbGVkKCkgKQorICAgICAgICByZXR1cm4ocHJpbmNpcGFsKTsKKworICAgIC8qIFRyeSB0byBnZXQgcmVhbG0gZnJvbSB0aWNrZXQgZmlsZSAqLworICAgIC8qIElmIGZhaWx1cmUgZ2V0IHRoZSBsb2NhbCByZWFsbSAgICAqLworCisgICAgLyoKKyAgICAqIFNpbmNlIGtyYl9nZXRfdGZfcmVhbG0gd2lsbCByZXR1cm4gYSB0aWNrZXRfZmlsZSBlcnJvciwKKyAgICAqIHdlIHdpbGwgY2FsbCB0Zl9pbml0IGFuZCB0Zl9jbG9zZSBmaXJzdCB0byBmaWx0ZXIgb3V0CisgICAgKiB0aGluZ3MgbGlrZSBubyB0aWNrZXQgZmlsZS4KKyAgICAqLworCisgICAgLyogT3BlbiB0aWNrZXQgZmlsZSAqLworICAgIGZpbGUgPSB0a3Rfc3RyaW5nKCk7CisgICAgaWYgKGZpbGUgPT0gTlVMTCB8fCAhZmlsZVswXSkKKyAgICAgICAgcmV0dXJuKHByaW5jaXBhbCk7CisKKyAgICBpZiAoKGtfZXJybm8gPSB0Zl9pbml0KGZpbGUsIFJfVEtUX0ZJTCkpID09IEtTVUNDRVNTKSB7CisgICAgICAgIC8qIENsb3NlIHRpY2tldCBmaWxlICovCisgICAgICAgICh2b2lkKSB0Zl9jbG9zZSgpOworCisgICAgICAgIGtfZXJybm8gPSBrcmJfZ2V0X3RmX2Z1bGxuYW1lKGZpbGUsIHByaW5jaXBhbCwgaW5zdGFuY2UsIHJlYWxtKTsKKyAgICB9CisgICAgcmV0dXJuKHByaW5jaXBhbCk7CisjZWxzZSAvKiBLUkI0ICovCisgICAgcmV0dXJuKCIiKTsKKyNlbmRpZiAvKiBLUkI0ICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgdGt0X2xpc3RfaXRlbSAqIGs1X3RrdF9saXN0ID0gTlVMTDsKKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2NrX2tyYjVfZ2V0X3RrdHMoY2hhciAqIGNjX25hbWUpCisjZWxzZQorY2tfa3JiNV9nZXRfdGt0cyhjY19uYW1lKSBjaGFyICogY2NfbmFtZTsKKyNlbmRpZgoreworI2lmZGVmIEtSQjUKKyNpZm5kZWYgSEVJTURBTAorICAgIGtyYjVfY29udGV4dCBrY29udGV4dDsKKyAgICBrcmI1X2Vycm9yX2NvZGUgcmV0dmFsOworICAgIGtyYjVfY2NhY2hlIGNhY2hlID0gTlVMTDsKKyAgICBrcmI1X2NjX2N1cnNvciBjdXI7CisgICAga3JiNV9jcmVkcyBjcmVkczsKKyAgICBrcmI1X3ByaW5jaXBhbCBwcmluYz1OVUxMOworICAgIGtyYjVfZmxhZ3MgZmxhZ3M9MDsKKyAgICBrcmI1X2Vycm9yX2NvZGUgY29kZT0wOworICAgIGludCBleGl0X3N0YXR1cyA9IDA7CisKKyAgICBpbnQgICAgIHRrdF9jb3VudD0wOworICAgIHN0cnVjdCAgdGt0X2xpc3RfaXRlbSAqKiBsaXN0ID0gJms1X3RrdF9saXN0OworCisgICAgd2hpbGUgKCBrNV90a3RfbGlzdCApIHsKKyAgICAgICAgc3RydWN0IHRrdF9saXN0X2l0ZW0gKiBuZXh0OworICAgICAgICBuZXh0ID0gazVfdGt0X2xpc3QtPm5leHQ7CisgICAgICAgIGZyZWUoazVfdGt0X2xpc3QtPm5hbWUpOworICAgICAgICBmcmVlKGs1X3RrdF9saXN0KTsKKyAgICAgICAgazVfdGt0X2xpc3QgPSBuZXh0OworICAgIH0KKworICAgIGlmICggIWNrX2tyYjVfaXNfaW5zdGFsbGVkKCkgKQorICAgICAgICByZXR1cm4oLTEpOworCisgICAgcmV0dmFsID0ga3JiNV9pbml0X2NvbnRleHQoJmtjb250ZXh0KTsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfZ2V0X3RrdHMgd2hpbGUgaW5pdGlhbGl6aW5nIGtyYjUiLCIiLHJldHZhbCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgY29kZSA9IGs1X2dldF9jY2FjaGUoa2NvbnRleHQsJmNhY2hlLGNjX25hbWUpOworICAgIGlmIChjb2RlICE9IDApIHsKKyAgICAgICAgZGVidWcoRjExMSwiY2tfa3JiNV9nZXRfdGt0cyB3aGlsZSBnZXR0aW5nIGNjYWNoZSIsCisgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlKGNvZGUpLGNvZGUpOworICAgICAgICB0a3RfY291bnQgPSAtMTsKKyAgICAgICAgZ290byBleGl0X2s1X2dldF90a3Q7CisgICAgfQorCisgICAgZmxhZ3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHVybnMgb2ZmIE9QRU5DTE9TRSBtb2RlICovCisgICAgaWYgKChjb2RlID0ga3JiNV9jY19zZXRfZmxhZ3Moa2NvbnRleHQsIGNhY2hlLCBmbGFncykpKSB7CisgICAgICAgIGlmIChjb2RlID09IEVOT0VOVCkgeworICAgICAgICAgICAgZGVidWcoRjExMSwiY2tfa3JiNV9nZXRfdGt0cyAodGlja2V0IGNhY2hlKSIsCisgICAgICAgICAgICAgICAgICAga3JiNV9jY19nZXRfbmFtZShrY29udGV4dCwgY2FjaGUpLGNvZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgICAgImNrX2tyYjVfZ2V0X3RrdHMgd2hpbGUgc2V0dGluZyBjYWNoZSBmbGFncyAodGlja2V0IGNhY2hlKSIsCisgICAgICAgICAgICAgICAgICBrcmI1X2NjX2dldF9uYW1lKGtjb250ZXh0LCBjYWNoZSksY29kZSk7CisgICAgICAgIH0KKyAgICAgICAgdGt0X2NvdW50ID0gLTE7CisgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgIH0KKyAgICBpZiAoKGNvZGUgPSBrcmI1X2NjX2dldF9wcmluY2lwYWwoa2NvbnRleHQsIGNhY2hlLCAmcHJpbmMpKSkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X2dldF90a3RzIHdoaWxlIHJldHJpZXZpbmcgcHJpbmNpcGFsIG5hbWUiLAorICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgIHRrdF9jb3VudCA9IC0xOworICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICB9CisgICAgaWYgKChjb2RlID0ga3JiNV91bnBhcnNlX25hbWUoa2NvbnRleHQsIHByaW5jLCAmZGVmbmFtZSkpKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfZ2V0X3RrdHMgd2hpbGUgdW5wYXJzaW5nIHByaW5jaXBhbCBuYW1lIiwKKyAgICAgICAgICAgICAgICIiLGNvZGUpOworICAgICAgICB0a3RfY291bnQgPSAtMTsKKyAgICAgICAgZ290byBleGl0X2s1X2dldF90a3Q7CisgICAgfQorCisgICAgaWYgKChjb2RlID0ga3JiNV9jY19zdGFydF9zZXFfZ2V0KGtjb250ZXh0LCBjYWNoZSwgJmN1cikpKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfZ2V0X3RrdHMgd2hpbGUgc3RhcnRpbmcgdG8gcmV0cmlldmUgdGlja2V0cyIsCisgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAgdGt0X2NvdW50ID0gLTE7CisgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgIH0KKworICAgIHdoaWxlICghKGNvZGUgPSBrcmI1X2NjX25leHRfY3JlZChrY29udGV4dCwgY2FjaGUsICZjdXIsICZjcmVkcykpKSB7CisgICAgICAgIGNoYXIgKnNuYW1lPU5VTEw7CisKKyAgICAgICAgcmV0dmFsID0ga3JiNV91bnBhcnNlX25hbWUoa2NvbnRleHQsIGNyZWRzLnNlcnZlciwgJnNuYW1lKTsKKyAgICAgICAgaWYgKHJldHZhbCkgeworICAgICAgICAgICAgZGVidWcoRjEwMSwKKyAgICAgICAgICAgICAgICAgICJja19rcmI1X2dldF90a3RzIHdoaWxlIHVucGFyc2luZyBzZXJ2ZXIgbmFtZSIsIiIscmV0dmFsKTsKKyAgICAgICAgICAgIHRrdF9jb3VudCA9IC0xOworICAgICAgICAgICAgZ290byBleGl0X2s1X2dldF90a3Q7CisgICAgICAgIH0KKworICAgICAgICAqbGlzdCA9IChzdHJ1Y3QgdGt0X2xpc3RfaXRlbSAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB0a3RfbGlzdF9pdGVtKSk7CisgICAgICAgICgqbGlzdCktPm5hbWUgPSBzbmFtZTsKKyAgICAgICAgKCpsaXN0KS0+bmV4dCA9IE5VTEw7CisgICAgICAgIGxpc3QgPSAmKCgqbGlzdCktPm5leHQpOworCisgICAgICAgIGtyYjVfZnJlZV91bnBhcnNlZF9uYW1lKGtjb250ZXh0LHNuYW1lKTsKKyAgICAgICAga3JiNV9mcmVlX2NyZWRfY29udGVudHMoa2NvbnRleHQsICZjcmVkcyk7CisgICAgICAgIHRrdF9jb3VudCsrOworICAgIH0KKworICAgIGlmIChjb2RlID09IEtSQjVfQ0NfRU5EKSB7CisgICAgICAgIGlmICgoY29kZSA9IGtyYjVfY2NfZW5kX3NlcV9nZXQoa2NvbnRleHQsIGNhY2hlLCAmY3VyKSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfZ2V0X3RrdHMgd2hpbGUgZmluaXNoaW5nIHRpY2tldCByZXRyaWV2YWwiLAorICAgICAgICAgICAgICAgICAgICIiLGNvZGUpOworICAgICAgICAgICAgdGt0X2NvdW50ID0gLTE7CisgICAgICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IEtSQjVfVENfT1BFTkNMT1NFOyAgICAgIC8qIHR1cm5zIG9uIE9QRU5DTE9TRSBtb2RlICovCisgICAgICAgIGlmICgoY29kZSA9IGtyYjVfY2Nfc2V0X2ZsYWdzKGtjb250ZXh0LCBjYWNoZSwgZmxhZ3MpKSkgeworICAgICAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV9nZXRfdGt0cyB3aGlsZSBjbG9zaW5nIGNjYWNoZSIsCisgICAgICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgICAgICB0a3RfY291bnQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV9nZXRfdGt0cyB3aGlsZSByZXRyaWV2aW5nIGEgdGlja2V0IiwiIixjb2RlKTsKKyAgICAgICAgdGt0X2NvdW50ID0gLTE7CisgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgIH0KKworICBleGl0X2s1X2dldF90a3Q6CisgICAga3JiNV9mcmVlX3ByaW5jaXBhbChrY29udGV4dCxwcmluYyk7CisgICAga3JiNV9mcmVlX3VucGFyc2VkX25hbWUoa2NvbnRleHQsZGVmbmFtZSk7CisgICAga3JiNV9jY19jbG9zZShrY29udGV4dCxjYWNoZSk7CisgICAga3JiNV9mcmVlX2NvbnRleHQoa2NvbnRleHQpOworICAgIHJldHVybih0a3RfY291bnQpOworI2Vsc2UgLyogSEVJTURBTCAqLworICAgIHJldHVybigtMSk7CisjZW5kaWYgLyogSEVJTURBTCAqLworI2Vsc2UgLyogS1JCNSAqLworICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBLUkI1ICovCit9CisKK2NoYXIgKgorI2lmZGVmIENLX0FOU0lDCitja19rcmI1X2dldF9uZXh0X3RrdChWT0lEKQorI2Vsc2UKK2NrX2tyYjVfZ2V0X25leHRfdGt0KCkKKyNlbmRpZgoreworI2lmZGVmIEtSQjUKKyNpZm5kZWYgSEVJTURBTAorICAgIHN0YXRpYyBjaGFyICogcz1OVUxMOworICAgIHN0cnVjdCB0a3RfbGlzdF9pdGVtICogbmV4dD1OVUxMOworCisgICAgaWYgKCBzICkgeworICAgICAgICBmcmVlKHMpOworICAgICAgICBzID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIGs1X3RrdF9saXN0ID09IE5VTEwgKQorICAgICAgICByZXR1cm4oTlVMTCk7CisKKyAgICBuZXh0ID0gazVfdGt0X2xpc3QtPm5leHQ7CisgICAgcyA9IGs1X3RrdF9saXN0LT5uYW1lOworICAgIGZyZWUoazVfdGt0X2xpc3QpOworICAgIGs1X3RrdF9saXN0ID0gbmV4dDsKKyAgICByZXR1cm4ocyk7CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgcmV0dXJuKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyNlbmRpZiAvKiBIRUlNREFMICovCisjZWxzZSAvKiBLUkI1ICovCisgICAgcmV0dXJuKE5VTEwpOworI2VuZGlmIC8qIEtSQjUgKi8KK30KKworY2hhciAqCisjaWZkZWYgQ0tfQU5TSUMKK2NrX2tyYjVfdGt0X2ZsYWdzKGNoYXIgKiBjY19uYW1lLCBjaGFyICogdGt0bmFtZSkKKyNlbHNlCitja19rcmI1X3RrdF9mbGFncyhjY19uYW1lLHRrdG5hbWUpIGNoYXIgKiBjY19uYW1lOyBjaGFyICogdGt0bmFtZTsKKyNlbmRpZgoreworI2lmZGVmIEtSQjUKKyNpZm5kZWYgSEVJTURBTAorICAgIGtyYjVfY29udGV4dCBrY29udGV4dDsKKyAgICBrcmI1X2Vycm9yX2NvZGUgcmV0dmFsOworICAgIGtyYjVfY2NhY2hlIGNhY2hlID0gTlVMTDsKKyAgICBrcmI1X2NjX2N1cnNvciBjdXI7CisgICAga3JiNV9jcmVkcyBjcmVkczsKKyAgICBrcmI1X3ByaW5jaXBhbCBwcmluYz1OVUxMOworICAgIGtyYjVfZmxhZ3MgZmxhZ3M9MDsKKyAgICBrcmI1X2Vycm9yX2NvZGUgY29kZT0wOworICAgIGNoYXIgKiBmbGFnX3N0ciA9ICIiOworCisgICAgaWYgKCAhY2tfa3JiNV9pc19pbnN0YWxsZWQoKSApCisgICAgICAgIHJldHVybigiIik7CisKKyAgICByZXR2YWwgPSBrcmI1X2luaXRfY29udGV4dCgma2NvbnRleHQpOworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV90a3RfZmxhZ3Mgd2hpbGUgaW5pdGlhbGl6aW5nIGtyYjUiLCIiLHJldHZhbCk7CisgICAgICAgIHJldHVybigiIik7CisgICAgfQorCisgICAgY29kZSA9IGs1X2dldF9jY2FjaGUoa2NvbnRleHQsJmNhY2hlLGNjX25hbWUpOworICAgIGlmIChjb2RlICE9IDApIHsKKyAgICAgICAgZGVidWcoRjExMSwiY2tfa3JiNV90a3RfaXN2YWxpZCB3aGlsZSBnZXR0aW5nIGNjYWNoZSIsCisgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlKGNvZGUpLGNvZGUpOworICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICB9CisKKyAgICBmbGFncyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0dXJucyBvZmYgT1BFTkNMT1NFIG1vZGUgKi8KKyAgICBpZiAoKGNvZGUgPSBrcmI1X2NjX3NldF9mbGFncyhrY29udGV4dCwgY2FjaGUsIGZsYWdzKSkpIHsKKyAgICAgICAgaWYgKGNvZGUgPT0gRU5PRU5UKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJja19rcmI1X3RrdF9mbGFncyAodGlja2V0IGNhY2hlKSIsCisgICAgICAgICAgICAgICAgICAga3JiNV9jY19nZXRfbmFtZShrY29udGV4dCwgY2FjaGUpLGNvZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWcoRjExMSwKKyAgICAgICAgICAgICAgICAgImNrX2tyYjVfdGt0X2ZsYWdzIHdoaWxlIHNldHRpbmcgY2FjaGUgZmxhZ3MgKHRpY2tldCBjYWNoZSkiLAorICAgICAgICAgICAgICAgICAga3JiNV9jY19nZXRfbmFtZShrY29udGV4dCwgY2FjaGUpLGNvZGUpOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IC0xOworICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICB9CisgICAgaWYgKChjb2RlID0ga3JiNV9jY19nZXRfcHJpbmNpcGFsKGtjb250ZXh0LCBjYWNoZSwgJnByaW5jKSkpIHsKKyAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV90a3RfZmxhZ3Mgd2hpbGUgcmV0cmlldmluZyBwcmluY2lwYWwgbmFtZSIsCisgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAgcmV0dmFsID0gLTE7CisgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgIH0KKyAgICBpZiAoKGNvZGUgPSBrcmI1X3VucGFyc2VfbmFtZShrY29udGV4dCwgcHJpbmMsICZkZWZuYW1lKSkpIHsKKyAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV90a3RfZmxhZ3Mgd2hpbGUgdW5wYXJzaW5nIHByaW5jaXBhbCBuYW1lIiwKKyAgICAgICAgICAgICAgICIiLGNvZGUpOworICAgICAgICByZXR2YWwgPSAtMTsKKyAgICAgICAgZ290byBleGl0X2s1X2dldF90a3Q7CisgICAgfQorCisgICAgaWYgKChjb2RlID0ga3JiNV9jY19zdGFydF9zZXFfZ2V0KGtjb250ZXh0LCBjYWNoZSwgJmN1cikpKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfdGt0X2ZsYWdzIHdoaWxlIHN0YXJ0aW5nIHRvIHJldHJpZXZlIHRpY2tldHMiLAorICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgIHJldHZhbCA9IC0xOworICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICB9CisKKyAgICBpZiAoKGNvZGUgPSBrcmI1X3RpbWVvZmRheShrY29udGV4dCwgJm5vdykpKSB7CisgICAgICAgIGlmICghc3RhdHVzX29ubHkpCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X3RrdF9mbGFncyB3aGlsZSBnZXR0aW5nIHRpbWUgb2YgZGF5LiIsCisgICAgICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgIHJldHZhbCA9IC0xOworICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICB9CisKKyAgICB3aGlsZSAoIShjb2RlID0ga3JiNV9jY19uZXh0X2NyZWQoa2NvbnRleHQsIGNhY2hlLCAmY3VyLCAmY3JlZHMpKSkgeworICAgICAgICBjaGFyICpzbmFtZT1OVUxMOworCisgICAgICAgIHJldHZhbCA9IGtyYjVfdW5wYXJzZV9uYW1lKGtjb250ZXh0LCBjcmVkcy5zZXJ2ZXIsICZzbmFtZSk7CisgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsCisgICAgICAgICAgICAgICAgICAiY2tfa3JiNV90a3RfZmxhZ3Mgd2hpbGUgdW5wYXJzaW5nIHNlcnZlciBuYW1lIiwiIixyZXR2YWwpOworICAgICAgICAgICAgcmV0dmFsID0gLTE7CisgICAgICAgICAgICBrcmI1X2ZyZWVfY3JlZF9jb250ZW50cyhrY29udGV4dCwgJmNyZWRzKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAhc3RyY21wKHNuYW1lLHRrdG5hbWUpICkgeworICAgICAgICAgICAgLyogd2UgZm91bmQgdGhlIHRpY2tldCB3ZSBhcmUgbG9va2luZyBmb3IgKi8KKworICAgICAgICAgICAgZmxhZ19zdHIgPSBmbGFnc19zdHJpbmcoJmNyZWRzKTsKKworICAgICAgICAgICAga3JiNV9mcmVlX3VucGFyc2VkX25hbWUoa2NvbnRleHQsc25hbWUpOworICAgICAgICAgICAga3JiNV9mcmVlX2NyZWRfY29udGVudHMoa2NvbnRleHQsICZjcmVkcyk7CisgICAgICAgICAgICBjb2RlID0gS1JCNV9DQ19FTkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBrcmI1X2ZyZWVfdW5wYXJzZWRfbmFtZShrY29udGV4dCxzbmFtZSk7CisgICAgICAgIGtyYjVfZnJlZV9jcmVkX2NvbnRlbnRzKGtjb250ZXh0LCAmY3JlZHMpOworICAgIH0KKworICAgIGlmIChjb2RlID09IEtSQjVfQ0NfRU5EKSB7CisgICAgICAgIGlmICgoY29kZSA9IGtyYjVfY2NfZW5kX3NlcV9nZXQoa2NvbnRleHQsIGNhY2hlLCAmY3VyKSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfdGt0X2ZsYWdzIHdoaWxlIGZpbmlzaGluZyB0aWNrZXQgcmV0cmlldmFsIiwKKyAgICAgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gS1JCNV9UQ19PUEVOQ0xPU0U7ICAgICAgLyogdHVybnMgb24gT1BFTkNMT1NFIG1vZGUgKi8KKyAgICAgICAgaWYgKChjb2RlID0ga3JiNV9jY19zZXRfZmxhZ3Moa2NvbnRleHQsIGNhY2hlLCBmbGFncykpKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X3RrdF9mbGFncyB3aGlsZSBjbG9zaW5nIGNjYWNoZSIsCisgICAgICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfdGt0X2ZsYWdzIHdoaWxlIHJldHJpZXZpbmcgYSB0aWNrZXQiLCIiLGNvZGUpOworICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICB9CisKKyAgZXhpdF9rNV9nZXRfdGt0OgorICAgIGtyYjVfZnJlZV9wcmluY2lwYWwoa2NvbnRleHQscHJpbmMpOworICAgIGtyYjVfZnJlZV91bnBhcnNlZF9uYW1lKGtjb250ZXh0LGRlZm5hbWUpOworICAgIGtyYjVfY2NfY2xvc2Uoa2NvbnRleHQsY2FjaGUpOworICAgIGtyYjVfZnJlZV9jb250ZXh0KGtjb250ZXh0KTsKKyAgICByZXR1cm4oZmxhZ19zdHIpOworI2Vsc2UgLyogSEVJTURBTCAqLworICAgIHJldHVybigiTm90IGltcGxlbWVudGVkIik7CisjZW5kaWYgLyogSEVJTURBTCAqLworI2Vsc2UgLyogS1JCNSAqLworICAgIHJldHVybigiIik7CisjZW5kaWYgLyogS1JCNSAqLworfQorCisKK2ludAorI2lmZGVmIENLX0FOU0lDCitja19rcmI1X3RrdF9pc3ZhbGlkKGNoYXIgKiBjY19uYW1lLCBjaGFyICogdGt0bmFtZSkKKyNlbHNlCitja19rcmI1X3RrdF9pc3ZhbGlkKGNjX25hbWUsdGt0bmFtZSkgY2hhciAqIGNjX25hbWU7IGNoYXIgKiB0a3RuYW1lOworI2VuZGlmCit7CisjaWZkZWYgS1JCNQorI2lmbmRlZiBIRUlNREFMCisgICAga3JiNV9jb250ZXh0IGtjb250ZXh0PU5VTEw7CisgICAga3JiNV9lcnJvcl9jb2RlIHJldHZhbDsKKyAgICBrcmI1X2NjYWNoZSBjYWNoZSA9IE5VTEw7CisgICAga3JiNV9jY19jdXJzb3IgY3VyOworICAgIGtyYjVfY3JlZHMgY3JlZHM7CisgICAga3JiNV9wcmluY2lwYWwgcHJpbmM9TlVMTDsKKyAgICBrcmI1X2ZsYWdzIGZsYWdzPTA7CisgICAga3JiNV9lcnJvcl9jb2RlIGNvZGU9MDsKKyNpZmRlZiBDSEVDS0FERFJTCisgICAga3JiNV9hZGRyZXNzICoqICAgICBteUFkZHJzPU5VTEw7CisgICAga3JiNV9hZGRyZXNzICoqICAgICBwPU5VTEw7CisgICAgQk9PTCAgICAgICAgICAgICAgICBBZGRyZm91bmQgPSBGQUxTRTsKKyNlbmRpZiAvKkNIRUNLQUREUlMqLworCisgICAgaWYgKCAhY2tfa3JiNV9pc19pbnN0YWxsZWQoKSApCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICByZXR2YWwgPSBrcmI1X2luaXRfY29udGV4dCgma2NvbnRleHQpOworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV90a3RfaXN2YWxpZCB3aGlsZSBpbml0aWFsaXppbmcga3JiNSIsIiIscmV0dmFsKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBjb2RlID0gazVfZ2V0X2NjYWNoZShrY29udGV4dCwmY2FjaGUsY2NfbmFtZSk7CisgICAgaWYgKGNvZGUgIT0gMCkgeworICAgICAgICBkZWJ1ZyhGMTExLCJja19rcmI1X3RrdF9pc3ZhbGlkIHdoaWxlIGdldHRpbmcgY2NhY2hlIiwKKyAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UoY29kZSksY29kZSk7CisgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgIH0KKworICAgIGZsYWdzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHR1cm5zIG9mZiBPUEVOQ0xPU0UgbW9kZSAqLworICAgIGlmICgoY29kZSA9IGtyYjVfY2Nfc2V0X2ZsYWdzKGtjb250ZXh0LCBjYWNoZSwgZmxhZ3MpKSkgeworICAgICAgICBpZiAoY29kZSA9PSBFTk9FTlQpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImNrX2tyYjVfdGt0X2lzdmFsaWQgKHRpY2tldCBjYWNoZSkiLAorICAgICAgICAgICAgICAgICAgIGtyYjVfY2NfZ2V0X25hbWUoa2NvbnRleHQsIGNhY2hlKSxjb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsCisgICAgICAgICAgICAgICAgImNrX2tyYjVfdGt0X2lzdmFsaWQgd2hpbGUgc2V0dGluZyBjYWNoZSBmbGFncyAodGlja2V0IGNhY2hlKSIsCisgICAgICAgICAgICAgICAgICBrcmI1X2NjX2dldF9uYW1lKGtjb250ZXh0LCBjYWNoZSksY29kZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gLTE7CisgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgIH0KKyAgICBpZiAoKGNvZGUgPSBrcmI1X2NjX2dldF9wcmluY2lwYWwoa2NvbnRleHQsIGNhY2hlLCAmcHJpbmMpKSkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X3RrdF9pc3ZhbGlkIHdoaWxlIHJldHJpZXZpbmcgcHJpbmNpcGFsIG5hbWUiLAorICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgIHJldHZhbCA9IC0xOworICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICB9CisgICAgaWYgKChjb2RlID0ga3JiNV91bnBhcnNlX25hbWUoa2NvbnRleHQsIHByaW5jLCAmZGVmbmFtZSkpKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfdGt0X2lzdmFsaWQgd2hpbGUgdW5wYXJzaW5nIHByaW5jaXBhbCBuYW1lIiwKKyAgICAgICAgICAgICAgICIiLGNvZGUpOworICAgICAgICByZXR2YWwgPSAtMTsKKyAgICAgICAgZ290byBleGl0X2s1X2dldF90a3Q7CisgICAgfQorCisgICAgaWYgKChjb2RlID0ga3JiNV9jY19zdGFydF9zZXFfZ2V0KGtjb250ZXh0LCBjYWNoZSwgJmN1cikpKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfdGt0X2lzdmFsaWQgd2hpbGUgc3RhcnRpbmcgdG8gcmV0cmlldmUgdGlja2V0cyIsCisgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAgcmV0dmFsID0gLTE7CisgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgIH0KKworICAgIGlmICgoY29kZSA9IGtyYjVfdGltZW9mZGF5KGtjb250ZXh0LCAmbm93KSkpIHsKKyAgICAgICAgaWYgKCFzdGF0dXNfb25seSkKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfdGt0X2lzdmFsaWQgd2hpbGUgZ2V0dGluZyB0aW1lIG9mIGRheS4iLAorICAgICAgICAgICAgICAgICAgICIiLGNvZGUpOworICAgICAgICByZXR2YWwgPSAtMTsKKyAgICAgICAgZ290byBleGl0X2s1X2dldF90a3Q7CisgICAgfQorCisgICAgd2hpbGUgKCEoY29kZSA9IGtyYjVfY2NfbmV4dF9jcmVkKGtjb250ZXh0LCBjYWNoZSwgJmN1ciwgJmNyZWRzKSkpIHsKKyAgICAgICAgY2hhciAqc25hbWU9TlVMTDsKKworICAgICAgICByZXR2YWwgPSBrcmI1X3VucGFyc2VfbmFtZShrY29udGV4dCwgY3JlZHMuc2VydmVyLCAmc25hbWUpOworICAgICAgICBpZiAocmV0dmFsKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLAorICAgICAgICAgICAgICAgICAgImNrX2tyYjVfdGt0X2lzdmFsaWQgd2hpbGUgdW5wYXJzaW5nIHNlcnZlciBuYW1lIiwiIixyZXR2YWwpOworICAgICAgICAgICAgcmV0dmFsID0gLTE7CisgICAgICAgICAgICBrcmI1X2ZyZWVfY3JlZF9jb250ZW50cyhrY29udGV4dCwgJmNyZWRzKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAhc3RyY21wKHNuYW1lLHRrdG5hbWUpICkgeworICAgICAgICAgICAgLyogd2UgZm91bmQgdGhlIHRpY2tldCB3ZSBhcmUgbG9va2luZyBmb3IgKi8KKworICAgICAgICAgICAgLyogV2UgYWRkIGEgNSBtaW51dGVzIGZ1ZGdlIGZhY3RvciB0byBjb21wZW5zYXRlIGZvciBwb3RlbnRpYWwgKi8KKyAgICAgICAgICAgIC8qIGNsb2NrIHNrZXcgZXJyb3JzIGJldHdlZW4gdGhlIEtEQyBhbmQgSzk1J3MgaG9zdCBPUyAgICAgICAgICovCisKKyAgICAgICAgICAgIHJldHZhbCA9ICgoY3JlZHMudGltZXMuc3RhcnR0aW1lID4gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgbm93ID49IChjcmVkcy50aW1lcy5zdGFydHRpbWUgLSAzMDApICYmCisgICAgICAgICAgICAgICAgICAgICAgIG5vdyA8IChjcmVkcy50aW1lcy5lbmR0aW1lICsgMzAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAhKGNyZWRzLnRpY2tldF9mbGFncyAmIFRLVF9GTEdfSU5WQUxJRCkpOworCisjaWZkZWYgQ0hFQ0tBRERSUworICAgICAgICAgICAgaWYgKCByZXR2YWwgJiYga3JiNV9jaGVja2FkZHJzICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkcy5hZGRyZXNzZXMgJiYgY3JlZHMuYWRkcmVzc2VzWzBdICkgeworICAgICAgICAgICAgICAgIC8qIGlmIHdlIHRoaW5rIGl0IGlzIHZhbGlkLCB0aGVuIGxldHMgY2hlY2sgdGhlIElQIEFkZHJlc3NlcyAqLworICAgICAgICAgICAgICAgIC8qIHRvIG1ha2Ugc3VyZSBpdCBpcyB2YWxpZCBmb3Igb3VyIGN1cnJlbnQgY29ubmVjdGlvbi4gICAgICAqLworICAgICAgICAgICAgICAgIC8qIEFsc28gbWFrZSBzdXJlIGl0J3MgZm9yIHRoZSBjb3JyZWN0IElQIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgICByZXR2YWwgPSBrcmI1X29zX2xvY2FsYWRkcihrY29udGV4dCwgJm15QWRkcnMpOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tX2VycihOVUxMLCByZXR2YWwsICJyZXRyaWV2aW5nIG15IElQIGFkZHJlc3MiKTsKKyAgICAgICAgICAgICAgICAgICAga3JiNV9mcmVlX3VucGFyc2VkX25hbWUoa2NvbnRleHQsc25hbWUpOworICAgICAgICAgICAgICAgICAgICBrcmI1X2ZyZWVfY3JlZF9jb250ZW50cyhrY29udGV4dCwgJmNyZWRzKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IEtSQjVfQ0NfRU5EOworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgLyogU2VlIGlmIGFueSBvZiBvdXIgYWRkcmVzc2VzIG1hdGNoIGFueSBpbiBjYWNoZWQgY3JlZGVudGlhbHMgKi8KKworICAgICAgICAgICAgICAgIGZvciAoQWRkcmZvdW5kPUZBTFNFLCBwPW15QWRkcnM7CisgICAgICAgICAgICAgICAgICAgICAoQWRkcmZvdW5kPT1GQUxTRSkgJiYgKCpwKTsKKyAgICAgICAgICAgICAgICAgICAgIHArKworICAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChrcmI1X2FkZHJlc3Nfc2VhcmNoKGtjb250ZXh0LCAqcCwgY3JlZHMuYWRkcmVzc2VzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBrcmI1X2ZyZWVfYWRkcmVzc2VzKGs1X2NvbnRleHQsIG15QWRkcnMpOworCisgICAgICAgICAgICAgICAgaWYgKEFkZHJmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBrcmI1X2ZyZWVfdW5wYXJzZWRfbmFtZShrY29udGV4dCxzbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGtyYjVfZnJlZV9jcmVkX2NvbnRlbnRzKGtjb250ZXh0LCAmY3JlZHMpOworICAgICAgICAgICAgICAgICAgICBjb2RlID0gS1JCNV9DQ19FTkQ7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGtyYjVfZnJlZV91bnBhcnNlZF9uYW1lKGtjb250ZXh0LHNuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAga3JiNV9mcmVlX2NyZWRfY29udGVudHMoa2NvbnRleHQsICZjcmVkcyk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBLUkI1X0NDX0VORDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8qIENIRUNLQUREUlMgKi8KKworICAgICAgICAgICAga3JiNV9mcmVlX3VucGFyc2VkX25hbWUoa2NvbnRleHQsc25hbWUpOworICAgICAgICAgICAga3JiNV9mcmVlX2NyZWRfY29udGVudHMoa2NvbnRleHQsICZjcmVkcyk7CisgICAgICAgICAgICBjb2RlID0gS1JCNV9DQ19FTkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBrcmI1X2ZyZWVfdW5wYXJzZWRfbmFtZShrY29udGV4dCxzbmFtZSk7CisgICAgICAgIGtyYjVfZnJlZV9jcmVkX2NvbnRlbnRzKGtjb250ZXh0LCAmY3JlZHMpOworICAgIH0KKworICAgIGlmIChjb2RlID09IEtSQjVfQ0NfRU5EKSB7CisgICAgICAgIGlmICgoY29kZSA9IGtyYjVfY2NfZW5kX3NlcV9nZXQoa2NvbnRleHQsIGNhY2hlLCAmY3VyKSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfdGt0X2lzdmFsaWQgd2hpbGUgZmluaXNoaW5nIHRpY2tldCByZXRyaWV2YWwiLAorICAgICAgICAgICAgICAgICAgICIiLGNvZGUpOworICAgICAgICAgICAgcmV0dmFsID0gLTE7CisgICAgICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IEtSQjVfVENfT1BFTkNMT1NFOyAgICAgIC8qIHR1cm5zIG9uIE9QRU5DTE9TRSBtb2RlICovCisgICAgICAgIGlmICgoY29kZSA9IGtyYjVfY2Nfc2V0X2ZsYWdzKGtjb250ZXh0LCBjYWNoZSwgZmxhZ3MpKSkgeworICAgICAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV90a3RfaXN2YWxpZCB3aGlsZSBjbG9zaW5nIGNjYWNoZSIsCisgICAgICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgICAgICByZXR2YWwgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV90a3RfaXN2YWxpZCB3aGlsZSByZXRyaWV2aW5nIGEgdGlja2V0IiwiIixjb2RlKTsKKyAgICAgICAgcmV0dmFsID0gLTE7CisgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgIH0KKworICBleGl0X2s1X2dldF90a3Q6CisgICAga3JiNV9mcmVlX3ByaW5jaXBhbChrY29udGV4dCxwcmluYyk7CisgICAga3JiNV9mcmVlX3VucGFyc2VkX25hbWUoa2NvbnRleHQsZGVmbmFtZSk7CisgICAga3JiNV9jY19jbG9zZShrY29udGV4dCxjYWNoZSk7CisgICAga3JiNV9mcmVlX2NvbnRleHQoa2NvbnRleHQpOworICAgIHJldHVybihyZXR2YWwpOworI2Vsc2UgLyogSEVJTURBTCAqLworICAgIHJldHVybigtMSk7CisjZW5kaWYgLyogSEVJTURBTCAqLworI2Vsc2UgLyogS1JCNSAqLworICAgIHJldHVybigtMSk7CisjZW5kaWYgLyogS1JCNSAqLworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNV9pc190Z3RfdmFsaWQoVk9JRCkKKyNlbHNlCitja19rcmI1X2lzX3RndF92YWxpZCgpCisjZW5kaWYKK3sKKyNpZmRlZiBLUkI1CisjaWZuZGVmIEhFSU1EQUwKKyAgICBjaGFyIHRndFsyNTZdOworICAgIGNoYXIgKiBzOworICAgIGludCByYyA9IDA7CisKKyAgICBzID0gY2tfa3JiNV9nZXRyZWFsbShrcmI1X2RfY2MpOworICAgIGNrbWFrbXNnKHRndCxzaXplb2YodGd0KSwia3JidGd0LyIscywiQCIscyk7CisgICAgcmMgPSBja19rcmI1X3RrdF9pc3ZhbGlkKGtyYjVfZF9jYyx0Z3QpOworICAgIGRlYnVnKEYxMTEsImNrX2tyYjVfaXNfdGd0X3ZhbGlkIix0Z3QscmMpOworICAgIHJldHVybihyYz4wKTsKKyNlbHNlIC8qIEhFSU1EQUwgKi8KKyAgICByZXR1cm4oLTEpOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyNlbHNlIC8qIEtSQjUgKi8KKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogS1JCNSAqLworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNV90a3RfdGltZShjaGFyICogY2NfbmFtZSwgY2hhciAqIHRrdG5hbWUpCisjZWxzZQorY2tfa3JiNV90a3RfdGltZShjY19uYW1lLCB0a3RuYW1lKSBjaGFyICogY2NfbmFtZTsgY2hhciAqIHRrdG5hbWU7CisjZW5kaWYKK3sKKyNpZmRlZiBLUkI1CisjaWZuZGVmIEhFSU1EQUwKKyAgICBrcmI1X2NvbnRleHQga2NvbnRleHQ7CisgICAga3JiNV9lcnJvcl9jb2RlIHJldHZhbDsKKyAgICBrcmI1X2NjYWNoZSBjYWNoZSA9IE5VTEw7CisgICAga3JiNV9jY19jdXJzb3IgY3VyOworICAgIGtyYjVfY3JlZHMgY3JlZHM7CisgICAga3JiNV9wcmluY2lwYWwgcHJpbmM9TlVMTDsKKyAgICBrcmI1X2ZsYWdzIGZsYWdzPTA7CisgICAga3JiNV9lcnJvcl9jb2RlIGNvZGU9MDsKKworICAgIGlmICggIWNrX2tyYjVfaXNfaW5zdGFsbGVkKCkgKQorICAgICAgICByZXR1cm4oLTEpOworCisgICAgcmV0dmFsID0ga3JiNV9pbml0X2NvbnRleHQoJmtjb250ZXh0KTsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfbGlzdF9jcmVkcyB3aGlsZSBpbml0aWFsaXppbmcga3JiNSIsIiIscmV0dmFsKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBjb2RlID0gazVfZ2V0X2NjYWNoZShrY29udGV4dCwmY2FjaGUsY2NfbmFtZSk7CisgICAgaWYgKGNvZGUgIT0gMCkgeworICAgICAgICBkZWJ1ZyhGMTExLCJja19rcmI1X3RrdF90aW1lIHdoaWxlIGdldHRpbmcgY2NhY2hlIiwKKyAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UoY29kZSksY29kZSk7CisgICAgICAgIHJldHZhbCA9IC0xOworICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICB9CisKKyAgICBmbGFncyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0dXJucyBvZmYgT1BFTkNMT1NFIG1vZGUgKi8KKyAgICBpZiAoKGNvZGUgPSBrcmI1X2NjX3NldF9mbGFncyhrY29udGV4dCwgY2FjaGUsIGZsYWdzKSkpIHsKKyAgICAgICAgaWYgKGNvZGUgPT0gRU5PRU5UKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJja19rcmI1X2xpc3RfY3JlZHMgKHRpY2tldCBjYWNoZSkiLAorICAgICAgICAgICAgICAgICAgIGtyYjVfY2NfZ2V0X25hbWUoa2NvbnRleHQsIGNhY2hlKSxjb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsCisgICAgICAgICAgICAgICAgICJja19rcmI1X2xpc3RfY3JlZHMgd2hpbGUgc2V0dGluZyBjYWNoZSBmbGFncyAodGlja2V0IGNhY2hlKSIsCisgICAgICAgICAgICAgICAgICBrcmI1X2NjX2dldF9uYW1lKGtjb250ZXh0LCBjYWNoZSksY29kZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gLTE7CisgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgIH0KKyAgICBpZiAoKGNvZGUgPSBrcmI1X2NjX2dldF9wcmluY2lwYWwoa2NvbnRleHQsIGNhY2hlLCAmcHJpbmMpKSkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X2xpc3RfY3JlZHMgd2hpbGUgcmV0cmlldmluZyBwcmluY2lwYWwgbmFtZSIsCisgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAgcmV0dmFsID0gLTE7CisgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgIH0KKyAgICBpZiAoKGNvZGUgPSBrcmI1X3VucGFyc2VfbmFtZShrY29udGV4dCwgcHJpbmMsICZkZWZuYW1lKSkpIHsKKyAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV9saXN0X2NyZWRzIHdoaWxlIHVucGFyc2luZyBwcmluY2lwYWwgbmFtZSIsCisgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAgcmV0dmFsID0gLTE7CisgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgIH0KKworICAgIGlmICgoY29kZSA9IGtyYjVfY2Nfc3RhcnRfc2VxX2dldChrY29udGV4dCwgY2FjaGUsICZjdXIpKSkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X2xpc3RfY3JlZHMgd2hpbGUgc3RhcnRpbmcgdG8gcmV0cmlldmUgdGlja2V0cyIsCisgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAgcmV0dmFsID0gLTE7CisgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfdGt0OworICAgIH0KKworICAgIGlmICgoY29kZSA9IGtyYjVfdGltZW9mZGF5KGtjb250ZXh0LCAmbm93KSkpIHsKKyAgICAgICAgaWYgKCFzdGF0dXNfb25seSkKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImNrX2tyYjVfbGlzdF9jcmVkcyB3aGlsZSBnZXR0aW5nIHRpbWUgb2YgZGF5LiIsCisgICAgICAgICAgICAgICAgICAgIiIsY29kZSk7CisgICAgICAgIGtyYjVfZnJlZV9jb250ZXh0KGtjb250ZXh0KTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICB3aGlsZSAoIShjb2RlID0ga3JiNV9jY19uZXh0X2NyZWQoa2NvbnRleHQsIGNhY2hlLCAmY3VyLCAmY3JlZHMpKSkgeworICAgICAgICBjaGFyICpzbmFtZT1OVUxMOworCisgICAgICAgIHJldHZhbCA9IGtyYjVfdW5wYXJzZV9uYW1lKGtjb250ZXh0LCBjcmVkcy5zZXJ2ZXIsICZzbmFtZSk7CisgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsCisgICAgICAgICAgICAgICAgICAiY2tfa3JiNV9saXN0X2NyZWRzIHdoaWxlIHVucGFyc2luZyBzZXJ2ZXIgbmFtZSIsIiIscmV0dmFsKTsKKyAgICAgICAgICAgIHJldHZhbCA9IC0xOworICAgICAgICAgICAga3JiNV9mcmVlX3VucGFyc2VkX25hbWUoa2NvbnRleHQsc25hbWUpOworICAgICAgICAgICAga3JiNV9mcmVlX2NyZWRfY29udGVudHMoa2NvbnRleHQsICZjcmVkcyk7CisgICAgICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggIXN0cmNtcChzbmFtZSx0a3RuYW1lKSApIHsKKyAgICAgICAgICAgIC8qIHdlIGZvdW5kIHRoZSB0aWNrZXQgd2UgYXJlIGxvb2tpbmcgZm9yICovCisgICAgICAgICAgICBpbnQgdmFsaWQgPSAoY3JlZHMudGltZXMuc3RhcnR0aW1lICYmCisgICAgICAgICAgICAgICAgICAgICAgIG5vdyA+IGNyZWRzLnRpbWVzLnN0YXJ0dGltZSAmJgorICAgICAgICAgICAgICAgICAgICAgICBub3cgPCBjcmVkcy50aW1lcy5lbmR0aW1lICYmCisgICAgICAgICAgICAgICAgICAgICAgICEoY3JlZHMudGlja2V0X2ZsYWdzICYgVEtUX0ZMR19JTlZBTElEKSk7CisgICAgICAgICAgICBpZiAoIHZhbGlkICkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IGNyZWRzLnRpbWVzLmVuZHRpbWUgLSBub3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dmFsID0gMDsKKyAgICAgICAgICAgIGtyYjVfZnJlZV91bnBhcnNlZF9uYW1lKGtjb250ZXh0LHNuYW1lKTsKKyAgICAgICAgICAgIGtyYjVfZnJlZV9jcmVkX2NvbnRlbnRzKGtjb250ZXh0LCAmY3JlZHMpOworICAgICAgICAgICAgY29kZSA9IEtSQjVfQ0NfRU5EOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAga3JiNV9mcmVlX3VucGFyc2VkX25hbWUoa2NvbnRleHQsc25hbWUpOworICAgICAgICBrcmI1X2ZyZWVfY3JlZF9jb250ZW50cyhrY29udGV4dCwgJmNyZWRzKTsKKyAgICB9CisKKyAgICBpZiAoY29kZSA9PSBLUkI1X0NDX0VORCkgeworICAgICAgICBpZiAoKGNvZGUgPSBrcmI1X2NjX2VuZF9zZXFfZ2V0KGtjb250ZXh0LCBjYWNoZSwgJmN1cikpKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X2xpc3RfY3JlZHMgd2hpbGUgZmluaXNoaW5nIHRpY2tldCByZXRyaWV2YWwiLAorICAgICAgICAgICAgICAgICAgICIiLGNvZGUpOworICAgICAgICAgICAgcmV0dmFsID0gLTE7CisgICAgICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IEtSQjVfVENfT1BFTkNMT1NFOyAgICAgIC8qIHR1cm5zIG9uIE9QRU5DTE9TRSBtb2RlICovCisgICAgICAgIGlmICgoY29kZSA9IGtyYjVfY2Nfc2V0X2ZsYWdzKGtjb250ZXh0LCBjYWNoZSwgZmxhZ3MpKSkgeworICAgICAgICAgICAgZGVidWcoRjEwMSwiY2tfa3JiNV9saXN0X2NyZWRzIHdoaWxlIGNsb3NpbmcgY2NhY2hlIiwKKyAgICAgICAgICAgICAgICAgICAiIixjb2RlKTsKKyAgICAgICAgICAgIHJldHZhbCA9IC0xOworICAgICAgICAgICAgZ290byBleGl0X2s1X2dldF90a3Q7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkZWJ1ZyhGMTAxLCJja19rcmI1X2xpc3RfY3JlZHMgd2hpbGUgcmV0cmlldmluZyBhIHRpY2tldCIsIiIsY29kZSk7CisgICAgICAgIHJldHZhbCA9IC0xOworICAgICAgICBnb3RvIGV4aXRfazVfZ2V0X3RrdDsKKyAgICB9CisKKyAgZXhpdF9rNV9nZXRfdGt0OgorICAgIGtyYjVfZnJlZV9wcmluY2lwYWwoa2NvbnRleHQscHJpbmMpOworICAgIGtyYjVfZnJlZV91bnBhcnNlZF9uYW1lKGtjb250ZXh0LGRlZm5hbWUpOworICAgIGtyYjVfY2NfY2xvc2Uoa2NvbnRleHQsY2FjaGUpOworICAgIGtyYjVfZnJlZV9jb250ZXh0KGtjb250ZXh0KTsKKyAgICByZXR1cm4ocmV0dmFsKTsKKyNlbHNlIC8qIEhFSU1EQUwgKi8KKyAgICByZXR1cm4oLTEpOworI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyNlbHNlIC8qIEtSQjUgKi8KKyAgICByZXR1cm4oLTEpOworI2VuZGlmIC8qIEtSQjUgKi8KK30KKworY2hhciAqCisjaWZkZWYgQ0tfQU5TSUMKK2NrX2tyYjVfZ2V0X2NjX25hbWUodm9pZCkKKyNlbHNlCitja19rcmI1X2dldF9jY19uYW1lKCkKKyNlbmRpZgoreworI2lmZGVmIEtSQjUKKyNpZm5kZWYgSEVJTURBTAorICAgIHN0YXRpYyBjaGFyIGNjX25hbWVbQ0tNQVhQQVRIKzFdPSIiOworICAgIGtyYjVfY29udGV4dCBrY29udGV4dCA9IE5VTEw7CisgICAga3JiNV9jY2FjaGUgY2NhY2hlID0gTlVMTDsKKyAgICBrcmI1X2Vycm9yX2NvZGUgY29kZTsKKyAgICBjaGFyICogcD1OVUxMOworCisgICAgY2NfbmFtZVswXSA9ICdcMCc7CisKKyAgICBpZiAoICFja19rcmI1X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuKGNjX25hbWUpOworCisgICAgcCA9IGdldGVudigiS1JCNUNDTkFNRSIpOworICAgIGlmICggIXAgKSB7CisgICAgICAgIGNvZGUgPSBrcmI1X2luaXRfY29udGV4dCgma2NvbnRleHQpOworICAgICAgICBpZiAoY29kZSkgeworICAgICAgICAgICAgY29tX2VycigiY2tfa3JiNV9nZXRfY2NfbmFtZSIsY29kZSwid2hpbGUgaW5pdF9jb250ZXh0Iik7CisgICAgICAgICAgICByZXR1cm4oY2NfbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjb2RlID0ga3JiNV9jY19kZWZhdWx0KGtjb250ZXh0LCAmY2NhY2hlKSkpIHsKKyAgICAgICAgICAgIGNvbV9lcnIoImNrX2tyYjVfZ2V0X2NjX25hbWUiLGNvZGUsIndoaWxlIGdldHRpbmcgZGVmYXVsdCBjY2FjaGUiKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdF9rNV9nZXRfY2M7CisgICAgICAgIH0KKworICAgICAgICBja21ha21zZyhjY19uYW1lLHNpemVvZihjY19uYW1lKSwKKyAgICAgICAgICAgICAgICAgKGNoYXIgKilrcmI1X2NjX2dldF90eXBlKGtjb250ZXh0LGNjYWNoZSksIjoiLAorICAgICAgICAgICAgICAgICAoY2hhciAqKWtyYjVfY2NfZ2V0X25hbWUoa2NvbnRleHQsY2NhY2hlKSxOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBja3N0cm5jcHkoY2NfbmFtZSxwLENLTUFYUEFUSCk7CisgICAgfQorCisgICAgaWYgKCAhc3RybmNtcCgiRklMRToiLGNjX25hbWUsNSkgKSB7CisgICAgICAgIGZvciAoIHA9Y2NfbmFtZTsgKnAgOyBwKysgKQorICAgICAgICAgICAgaWYgKCAqcCA9PSAnXFwnICkgKnAgPSAnLyc7CisgICAgfQorCisgIGV4aXRfazVfZ2V0X2NjOgorICAgIGlmICggY2NhY2hlICkKKyAgICAgICAga3JiNV9jY19jbG9zZShrY29udGV4dCxjY2FjaGUpOworICAgIGlmICgga2NvbnRleHQgKQorICAgICAgICBrcmI1X2ZyZWVfY29udGV4dChrY29udGV4dCk7CisgICAgcmV0dXJuKGNjX25hbWUpOworI2Vsc2UgLyogSEVJTURBTCAqLworICAgIHJldHVybigiTm90IGltcGxlbWVudGVkIik7CisjZW5kaWYgLyogSEVJTURBTCAqLworI2Vsc2UgLyogS1JCNSAqLworICAgIHJldHVybigiIik7CisjZW5kaWYgLyogS1JCNSAqLworfQorCitjaGFyICoKKyNpZmRlZiBDS19BTlNJQworY2tfa3JiNV9nZXRyZWFsbShjaGFyICogY2NfbmFtZSkKKyNlbHNlCitja19rcmI1X2dldHJlYWxtKGNjX25hbWUpIGNoYXIgKiBjY19uYW1lOworI2VuZGlmCit7CisjaWZkZWYgS1JCNQorI2lmbmRlZiBIRUlNREFMCisgICAgc3RhdGljIGNoYXIgcmVhbG1bMjU2XT0iIjsKKyAgICBrcmI1X2NvbnRleHQga2NvbnRleHQ7CisgICAga3JiNV9jY2FjaGUgY2NhY2hlID0gTlVMTDsKKyAgICBrcmI1X2Vycm9yX2NvZGUgY29kZTsKKyAgICBrcmI1X3ByaW5jaXBhbCBtZT1OVUxMOworCisgICAgcmVhbG1bMF0gPSAnXDAnOworCisgICAgaWYgKCAhY2tfa3JiNV9pc19pbnN0YWxsZWQoKSApCisgICAgICAgIHJldHVybihyZWFsbSk7CisKKyAgICBjb2RlID0ga3JiNV9pbml0X2NvbnRleHQoJmtjb250ZXh0KTsKKyAgICBpZiAoY29kZSkgeworICAgICAgICByZXR1cm4ocmVhbG0pOworICAgIH0KKworICAgIGNvZGUgPSBrNV9nZXRfY2NhY2hlKGtjb250ZXh0LCZjY2FjaGUsY2NfbmFtZSk7CisgICAgaWYgKGNvZGUgIT0gMCkgeworICAgICAgICBnb3RvIGV4aXRfazVfZ2V0cmVhbG07CisgICAgfQorCisJY29kZSA9IGtyYjVfY2NfZ2V0X3ByaW5jaXBhbChrY29udGV4dCwgY2NhY2hlLCAmbWUpOworCWlmIChjb2RlKQorCQljb2RlID0ga3JiNV9wYXJzZV9uYW1lKGtjb250ZXh0LCAiZm9vIiwgJm1lKTsKKyAgICBpZiAoY29kZSkgeworICAgICAgICBnb3RvIGV4aXRfazVfZ2V0cmVhbG07CisgICAgfQorICAgIGlmICgga3JiNV9wcmluY19yZWFsbShrY29udGV4dCwgbWUpLT5sZW5ndGggPCBzaXplb2YocmVhbG0pICkgeworICAgICAgICBtZW1jcHkocmVhbG0sa3JiNV9wcmluY19yZWFsbShrY29udGV4dCwgbWUpLT5kYXRhLAorICAgICAgICAgICAgICAgIGtyYjVfcHJpbmNfcmVhbG0oa2NvbnRleHQsIG1lKS0+bGVuZ3RoKTsgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICByZWFsbVtrcmI1X3ByaW5jX3JlYWxtKGtjb250ZXh0LCBtZSktPmxlbmd0aF09J1wwJzsKKyAgICB9CisgIGV4aXRfazVfZ2V0cmVhbG06CisgICAgaWYgKCBtZSApCisgICAgICAgIGtyYjVfZnJlZV9wcmluY2lwYWwoa2NvbnRleHQsbWUpOworICAgIGlmICggY2NhY2hlICkKKyAgICAgICAga3JiNV9jY19jbG9zZShrY29udGV4dCxjY2FjaGUpOworICAgIGlmIChrY29udGV4dCkKKyAgICAgICAga3JiNV9mcmVlX2NvbnRleHQoa2NvbnRleHQpOworICAgIHJldHVybihyZWFsbSk7CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgcmV0dXJuKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyNlbmRpZiAvKiBIRUlNREFMICovCisjZWxzZSAvKiBLUkI1ICovCisgICAgcmV0dXJuKCIiKTsKKyNlbmRpZiAvKiBLUkI1ICovCit9CisKK2NoYXIgKgorI2lmZGVmIENLX0FOU0lDCitja19rcmI1X2dldHByaW5jaXBhbChjaGFyICogY2NfbmFtZSkKKyNlbHNlCitja19rcmI1X2dldHByaW5jaXBhbChjY19uYW1lKSBjaGFyICogY2NfbmFtZTsKKyNlbmRpZgoreworI2lmZGVmIEtSQjUKKyNpZm5kZWYgSEVJTURBTAorICAgIHN0YXRpYyBjaGFyIHByaW5jaXBhbFtVSURCVUZMRU4rMV09IiI7CisgICAga3JiNV9jb250ZXh0IGtjb250ZXh0OworICAgIGtyYjVfY2NhY2hlIGNjYWNoZSA9IE5VTEw7CisgICAga3JiNV9lcnJvcl9jb2RlIGNvZGU7CisgICAga3JiNV9wcmluY2lwYWwgbWU7CisgICAgY2hhciAqIHA9TlVMTDsKKyAgICBpbnQgaTsKKworICAgIHByaW5jaXBhbFswXSA9ICdcMCc7CisKKyAgICBpZiAoICFja19rcmI1X2lzX2luc3RhbGxlZCgpICkKKyAgICAgICAgcmV0dXJuKHByaW5jaXBhbCk7CisKKyAgICBjb2RlID0ga3JiNV9pbml0X2NvbnRleHQoJmtjb250ZXh0KTsKKyAgICBpZiAoY29kZSkgeworICAgICAgICByZXR1cm4ocHJpbmNpcGFsKTsKKyAgICB9CisKKyAgICBjb2RlID0gazVfZ2V0X2NjYWNoZShrY29udGV4dCwmY2NhY2hlLGNjX25hbWUpOworICAgIGlmIChjb2RlICE9IDApIHsKKyAgICAgICAgZ290byBleGl0X2s1X2dldHByaW5jaXBhbDsKKyAgICB9CisKKyAgICBpZiAoKGNvZGUgPSBrcmI1X2NjX2dldF9wcmluY2lwYWwoa2NvbnRleHQsIGNjYWNoZSwgJm1lKSkpIHsKKyAgICAgICAgZ290byBleGl0X2s1X2dldHByaW5jaXBhbDsKKyAgICB9CisKKyAgICBpZiAoKGNvZGUgPSBrcmI1X3VucGFyc2VfbmFtZSAoa2NvbnRleHQsIG1lLCAmcCkpKSB7CisgICAgICAgIGtyYjVfZnJlZV9wcmluY2lwYWwoa2NvbnRleHQsbWUpOworICAgICAgICBnb3RvIGV4aXRfazVfZ2V0cHJpbmNpcGFsOworICAgIH0KKworICAgIGNrc3RybmNweShwcmluY2lwYWwscCxVSURCVUZMRU4pOworICAgIGkgPSBja2luZGV4KCJAIixwcmluY2lwYWwsMCwwLDApOworICAgIGlmIChpKQorICAgICAgcHJpbmNpcGFsW2ktMV0gPSAnXDAnOworCisgICAga3JiNV9mcmVlX3VucGFyc2VkX25hbWUoa2NvbnRleHQscCk7CisKKyAgZXhpdF9rNV9nZXRwcmluY2lwYWw6CisgICAgaWYgKCBjY2FjaGUgKQorICAgICAgICBrcmI1X2NjX2Nsb3NlKGtjb250ZXh0LGNjYWNoZSk7CisgICAgaWYgKGtjb250ZXh0KQorICAgICAgICBrcmI1X2ZyZWVfY29udGV4dChrY29udGV4dCk7CisgICAgcmV0dXJuKHByaW5jaXBhbCk7CisjZWxzZSAvKiBIRUlNREFMICovCisgICAgcmV0dXJuKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyNlbmRpZiAvKiBIRUlNREFMICovCisjZWxzZSAvKiBLUkI1ICovCisgICAgcmV0dXJuKCIiKTsKKyNlbmRpZiAvKiBLUkI1ICovCit9CisKKyNpZm5kZWYgQ1JZUFRfRExMCitpbnQKK2NrX2dldF9jcnlwdF90YWJsZShzdHJ1Y3Qga2V5dGFiICoqIHBUYWJsZSwgaW50ICogcE4pCit7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIHJldHVybihnZXRfY3J5cHRfdGFibGUocFRhYmxlLCBwTikpOworI2Vsc2UgLyogRU5DUllQVElPTiAqLworICAgIGludCBpPTA7CisjaWZuZGVmIE9TMgorICAgIGNoYXIgKiB0bXBzdHJpbmcgPSBOVUxMOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgaWYgKCAqcFRhYmxlICkKKyAgICB7CisgICAgICAgIGZvciAoIGk9MCA7IGkgPCAqcE4gOyBpKysgKQorICAgICAgICAgICAgZnJlZSggKCpwVGFibGUpW2ldLmt3ZCApIDsKKyAgICAgICAgZnJlZSAoICpwVGFibGUgKSAgOworICAgIH0KKyAgICAqcFRhYmxlID0gTlVMTDsKKyAgICAqcE4gPSAwOworCisgICAgKnBUYWJsZSA9IG1hbGxvYyggc2l6ZW9mKHN0cnVjdCBrZXl0YWIpICogMiApIDsKKyAgICBpZiAoICEoKnBUYWJsZSkgKQorICAgICAgICByZXR1cm4oMCk7CisKKyNpZmRlZiBPUzIKKyAgICAoKnBUYWJsZSlbMF0ua3dkID1zdHJkdXAoImF1dG9tYXRpYyIpOworI2Vsc2UgLyogT1MyICovCisgICAgbWFrZXN0cigmdG1wc3RyaW5nLCJhdXRvbWF0aWMiKTsKKyAgICAoKnBUYWJsZSlbMF0ua3dkID0gdG1wc3RyaW5nOworICAgIHRtcHN0cmluZyA9IE5VTEw7CisjZW5kaWYgLyogT1MyICovCisgICAgKCpwVGFibGUpWzBdLmt3dmFsID0gRU5DVFlQRV9BTlk7CisgICAgKCpwVGFibGUpWzBdLmZsZ3MgPSAwOworI2lmZGVmIE9TMgorICAgICgqcFRhYmxlKVsxXS5rd2QgPXN0cmR1cCgibm9uZSIpOworI2Vsc2UgLyogT1MyICovCisgICAgbWFrZXN0cigmdG1wc3RyaW5nLCJub25lIik7CisgICAgKCpwVGFibGUpWzFdLmt3ZCA9IHRtcHN0cmluZzsKKyAgICB0bXBzdHJpbmcgPSBOVUxMOworI2VuZGlmIC8qIE9TMiAqLworICAgICgqcFRhYmxlKVsxXS5rd3ZhbCA9IDk5OTsKKyAgICAoKnBUYWJsZSlbMV0uZmxncyA9IDA7CisgICAgKCpwTikgPSAyOworCisgICAgcmV0dXJuKDIpOworI2VuZGlmIC8qIEVOQ1JZUFRJT04gKi8KK30KKworVk9JRAorY2tfZW5jcnlwdF9zZW5kX3N1cHBvcnQoKQoreworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBlbmNyeXB0X3NlbmRfc3VwcG9ydCgpOworI2VuZGlmIC8qIEVOQ1JZUFRJT04gKi8KK30KKyNlbmRpZiAvKiBDUllQVF9ETEwgKi8KKworLyoKKyAqCisgKiBLc3RyZWFtCisgKgorICogRW11bGF0ZXMgdGhlIGtzdHJlYW0gcGFja2FnZSBpbiBLZXJiZXJvcyA0CisgKgorICovCisKK2ludAora3N0cmVhbV9kZXN0cm95KCkKK3sKKyAgICBpZiAoZ19rc3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgYXV0aF9kZXN0cm95KCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0cm95IGF1dGhvcml6aW5nICovCisgICAgICAgIGZyZWUoZ19rc3RyZWFtKTsKKyAgICAgICAgZ19rc3RyZWFtPU5VTEw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2tzdHJlYW1fc2V0X2J1ZmZlcl9tb2RlKGludCBtb2RlKQorI2Vsc2UKK2tzdHJlYW1fc2V0X2J1ZmZlcl9tb2RlKG1vZGUpIGludCBtb2RlOworI2VuZGlmCit7Cit9CisKKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2tzdHJlYW1fY3JlYXRlX2Zyb21fZmQoaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICBrc3RyZWFtX3B0ciBkYXRhKQorI2Vsc2UKK2tzdHJlYW1fY3JlYXRlX2Zyb21fZmQoZmQsZGF0YSkKKyAgICBpbnQgZmQ7IGtzdHJlYW1fcHRyIGRhdGE7CisjZW5kaWYKK3sKKyAgICBpbnQgbjsKKworICAgIGdfa3N0cmVhbSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGtzdHJlYW1faW50KSk7CisgICAgaWYgKGdfa3N0cmVhbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGdfa3N0cmVhbS0+ZmQgPSBmZDsKKworICAgIG4gPSBhdXRoX2luaXQoZ19rc3RyZWFtKTsgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBhdXRob3JpemluZyAqLworICAgIGlmIChuKSB7CisgICAgICAgIGZyZWUoZ19rc3RyZWFtKTsKKyAgICAgICAgZ19rc3RyZWFtID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZ19rc3RyZWFtLT5lbmNyeXB0ID0gTlVMTDsKKyAgICBnX2tzdHJlYW0tPmRlY3J5cHQgPSBOVUxMOworICAgIGdfa3N0cmVhbS0+ZW5jcnlwdF90eXBlID0gRU5DVFlQRV9BTlk7CisgICAgZ19rc3RyZWFtLT5kZWNyeXB0X3R5cGUgPSBFTkNUWVBFX0FOWTsKKyAgICByZXR1cm4gMTsKK30KKworI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgUkxPR0NPREUKK3N0YXRpYyBpbnQgZG9fbGVuY2hlY2ssIHVzZV9pdmVjczsKK2V4dGVybiBpbnQgcmxvZ19pbmJhbmQ7CisKKyNpZmRlZiBLUkI1Cit2b2lkCityY21kX3N0cmVhbV9pbml0X2tyYjUoaW5fa2V5YmxvY2ssIGVuY3J5cHRfZmxhZywgbGVuY2hlY2ssIGFtX2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvbnVtKQorICAgICBrcmI1X2tleWJsb2NrICppbl9rZXlibG9jazsKKyAgICAgaW50IGVuY3J5cHRfZmxhZzsKKyAgICAgaW50IGxlbmNoZWNrOworICAgICBpbnQgYW1fY2xpZW50OworICAgICBlbnVtIGtyYjVfa2NtZF9wcm90byBwcm90b251bTsKK3sKKyAgICBrcmI1X2Vycm9yX2NvZGUgc3RhdHVzOworICAgIHNpemVfdCBibG9ja3NpemU7CisKKyAgICBpZiAoIWVuY3J5cHRfZmxhZykKKyAgICAgICAgcmV0dXJuOworCisgICAgZGVzaW5idWYuZGF0YSA9IGRlc19pbmJ1ZjsKKyAgICBkZXNvdXRidWYuZGF0YSA9IGRlc19vdXRwa3QrNDsgICAgICAvKiBTZXQgdXAgZGVzIGJ1ZmZlcnMgKi8KKyAgICBrNV9zZXNzaW9uX2tleSA9IGluX2tleWJsb2NrOworCisgICAgZG9fbGVuY2hlY2sgPSBsZW5jaGVjazsKKworICAgIGlmICggcHJvdG9udW0gPT0gS0NNRF9PTERfUFJPVE9DT0wgKSB7CisgICAgICAgIHVzZV9pdmVjcyA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1c2VfaXZlY3MgPSAxOworCisgICAgaWYgKHN0YXR1cyA9IGtyYjVfY19ibG9ja19zaXplKGs1X2NvbnRleHQsIGs1X3Nlc3Npb25fa2V5LT5lbmN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2tzaXplKSkgeworICAgICAgICAvKiBYWFggd2hhdCBkbyBJIGRvPyAqLworICAgICAgICBwcmludGYoImZhdGFsIGtlcmJlcm9zIDUgY3J5cHRvIGxpYnJhcnkgZXJyb3JcbiIpOworICAgICAgICB0dGNsb3MoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlbmNpdmVjX2lbMF0ubGVuZ3RoID0gZW5jaXZlY19pWzFdLmxlbmd0aCA9IAorICAgIGVuY2l2ZWNfb1swXS5sZW5ndGggPSBlbmNpdmVjX29bMV0ubGVuZ3RoID0gYmxvY2tzaXplOworCisgICAgaWYgKChlbmNpdmVjX2lbMF0uZGF0YSA9IG1hbGxvYyhlbmNpdmVjX2lbMF0ubGVuZ3RoICogNCkpID09IE5VTEwpIHsKKyAgICAgICAgLyogWFhYIHdoYXQgZG8gSSBkbz8gKi8KKyAgICAgICAgcHJpbnRmKCJmYXRhbCBtYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgICAgdHRjbG9zKDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZW5jaXZlY19pWzFdLmRhdGEgPSBlbmNpdmVjX2lbMF0uZGF0YSArIGVuY2l2ZWNfaVswXS5sZW5ndGg7CisgICAgZW5jaXZlY19vWzBdLmRhdGEgPSBlbmNpdmVjX2lbMV0uZGF0YSArIGVuY2l2ZWNfaVsxXS5sZW5ndGg7CisgICAgZW5jaXZlY19vWzFdLmRhdGEgPSBlbmNpdmVjX29bMF0uZGF0YSArIGVuY2l2ZWNfb1swXS5sZW5ndGg7CisKKyAgICAvKiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gaW5pdGlhbGl6ZSB0aGlzPyAqLworICAgIG1lbXNldChlbmNpdmVjX2lbMF0uZGF0YSwgYW1fY2xpZW50LCBibG9ja3NpemUpOworICAgIG1lbXNldChlbmNpdmVjX29bMF0uZGF0YSwgMSAtIGFtX2NsaWVudCwgYmxvY2tzaXplKTsKKyAgICBtZW1zZXQoZW5jaXZlY19pWzFdLmRhdGEsIDIgfCBhbV9jbGllbnQsIGJsb2Nrc2l6ZSk7CisgICAgbWVtc2V0KGVuY2l2ZWNfb1sxXS5kYXRhLCAyIHwgKDEgLSBhbV9jbGllbnQpLCBibG9ja3NpemUpOworfQorI2VuZGlmIC8qIEtSQjUgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2NrX2tyYl9ybG9naW4oQ0hBUiAqIGhvc3RuYW1lLCBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgIENIQVIgKiBsb2NhbHVzZXIsIENIQVIgKiByZW1vdGV1c2VyLCBDSEFSICogdGVybV9zcGVlZCwKKyAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqIGxfYWRkciwgc3RydWN0IHNvY2thZGRyX2luICogcl9hZGRyLAorICAgICAgICAgICAgICAgaW50IGt2ZXJzaW9uLCBpbnQgZW5jcnlwdF9mbGFnKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2NrX2tyYl9ybG9naW4oaG9zdG5hbWUsIHBvcnQsCisgICAgICAgICAgICAgICBsb2NhbHVzZXIsIHJlbW90ZXVzZXIsIHRlcm1fc3BlZWQsIGxfYWRkciwgcl9hZGRyLCBlbmNyeXB0X2ZsYWcpCisgICAgQ0hBUiAqIGhvc3RuYW1lOyBpbnQgcG9ydDsKKyAgICBDSEFSICogbG9jYWx1c2VyOyBDSEFSICogcmVtb3RldXNlcjsgQ0hBUiAqIHRlcm1fc3BlZWQ7CisgICAgc3RydWN0IHNvY2thZGRyX2luICogbF9hZGRyOyBzdHJ1Y3Qgc29ja2FkZHJfaW4gKiByX2FkZHI7CisgICAgaW50IGt2ZXJzaW9uOyBpbnQgZW5jcnlwdF9mbGFnOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisgICAgdW5zaWduZWQgbG9uZyBzdGF0dXM7CisgICAgY2hhciAqIHJlYWxtPU5VTEw7CisgICAgZXh0ZXJuIGludCB0dHlmZDsKKyAgICBpbnQgYzsKKyAgICBsb25nIG1zZ2xlbjsKKworICAgIGRlYnVnKEYxMTEsImNrX2tyYl9ybG9naW4iLGhvc3RuYW1lLHBvcnQpOworCisgICAgaWYgKCBrdmVyc2lvbiA9PSA0ICYmICFja19rcmI0X2lzX2luc3RhbGxlZCgpICkgeworICAgICAgICBwcmludGYoIj9LZXJiZXJvcyA0IGlzIG5vdCBpbnN0YWxsZWRcclxuIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfSBlbHNlIGlmICgga3ZlcnNpb24gPT0gNSAmJiAhY2tfa3JiNV9pc19pbnN0YWxsZWQoKSApIHsKKyAgICAgICAgcHJpbnRmKCI/S2VyYmVyb3MgNSBpcyBub3QgaW5zdGFsbGVkXHJcbiIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIGlmICggZW5jcnlwdF9mbGFnICYmICFja19jcnlwdF9pc19pbnN0YWxsZWQoKSApIHsKKyAgICAgICAgcHJpbnRmKCI/RW5jcnlwdGlvbiBpcyBub3QgaW5zdGFsbGVkXHJcbiIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIGlmICgga3ZlcnNpb24gPT0gNSApIHsKKyNpZmRlZiBLUkI1CisgICAgICAgIGtyYjVfZmxhZ3MgYXV0aG9wdHM9MDsKKyAgICAgICAga3JiNV9jY2FjaGUgY2NhY2hlPU5VTEw7CisgICAgICAgIGNoYXIgKmNrc3VtYnVmPU5VTEw7CisgICAgICAgIGNoYXIgKnNlcnZpY2U9TlVMTDsKKyAgICAgICAgY2hhciAqIGtjbWRfdmVyc2lvbj1OVUxMOworICAgICAgICBlbnVtIGtyYjVfa2NtZF9wcm90byB1c2VfcHJvdG87CisgICAgICAgIGtyYjVfZGF0YSBja3N1bWRhdDsKKyAgICAgICAga3JiNV9jcmVkcyAqZ2V0X2NyZWQgPSAwOworICAgICAgICBrcmI1X2Vycm9yX2NvZGUgc3RhdHVzOworICAgICAgICBrcmI1X2Vycm9yICAgICAgKmVycm9yID0gMDsKKyAgICAgICAga3JiNV9hcF9yZXBfZW5jX3BhcnQgKnJlcF9yZXQgPSBOVUxMOworICAgICAgICBrcmI1X2RhdGEgb3V0YnVmOworICAgICAgICBpbnQgcmM7CisgICAgICAgIGtyYjVfaW50MzIgc2Vxbm89MDsKKyAgICAgICAga3JiNV9pbnQzMiBzZXJ2ZXJfc2Vxbm89MDsKKyAgICAgICAgY2hhciAqKiByZWFsbWxpc3Q9TlVMTDsKKyAgICAgICAgaW50IGJ1ZmxlbjsKKyAgICAgICAgY2hhciB0Z3RbMjU2XTsKKworICAgICAgICBkZWJ1ZyhGMTAwLCJja19rcmJfcmxvZ2luIHZlcnNpb24gNSIsIiIsMCk7CisKKyAgICAgICAgcmVhbG0gPSBja19rcmI1X3JlYWxtb2Zob3N0KGhvc3RuYW1lKTsKKyAgICAgICAgaWYgKCFyZWFsbSkgeworICAgICAgICAgICAgY2tzdHJuY3B5KHN0clRtcCwgIkNhbid0IGZpbmQgcmVhbG0gZm9yIGhvc3QgXCIiLEFVVEhUTVBCTCk7CisgICAgICAgICAgICBja3N0cm5jYXQoc3RyVG1wLCBob3N0bmFtZSxBVVRIVE1QQkwpOworICAgICAgICAgICAgY2tzdHJuY2F0KHN0clRtcCwgIlwiIixBVVRIVE1QQkwpOworICAgICAgICAgICAgcHJpbnRmKCI/S2VyYmVyb3MgNSBlcnJvcjogJXNcclxuIixzdHJUbXApOworICAgICAgICAgICAga3JiNV9lcnJubyA9IEtSQjVfRVJSX0hPU1RfUkVBTE1fVU5LTk9XTjsKKyAgICAgICAgICAgIG1ha2VzdHIoJmtyYjVfZXJybXNnLHN0clRtcCk7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKworICAgICAgICBja21ha21zZyh0Z3Qsc2l6ZW9mKHRndCksImtyYnRndC8iLHJlYWxtLCJAIixyZWFsbSk7CisgICAgICAgIGRlYnVnKEYxMTAsImNrX3Jsb2dfcmxvZ2luIFRHVCIsdGd0LDApOworICAgICAgICBpZiAoIGtyYjVfYXV0b2dldCAmJgorICAgICAgICAgICAgICEoKGNrX2tyYjVfdGt0X2lzdmFsaWQoTlVMTCx0Z3QpID4gMCkgfHwKKyAgICAgICAgICAgICAgICAoY2tfa3JiNV9pc190Z3RfdmFsaWQoKSA+IDApKSApCisgICAgICAgICAgICBja19rcmI1X2F1dG9nZXRfVEdUKHJlYWxtKTsKKworICAgICAgICBidWZsZW4gPSBzdHJsZW4odGVybV9zcGVlZCkrc3RybGVuKHJlbW90ZXVzZXIpKzY0OworICAgICAgICBpZiAoKGNrc3VtYnVmID0gbWFsbG9jKGJ1ZmxlbikpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY2hlY2tzdW0gYnVmZmVyLlxyXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKworICAgICAgICBja21ha21zZyhja3N1bWJ1ZixidWZsZW4sY2t1aXRvYSgodW5zaWduZWQgc2hvcnQpIG50b2hzKHBvcnQpKSwiOiIsCisgICAgICAgICAgICAgICAgICB0ZXJtX3NwZWVkLHJlbW90ZXVzZXIpOworICAgICAgICBja3N1bWRhdC5kYXRhID0gY2tzdW1idWY7CisgICAgICAgIGNrc3VtZGF0Lmxlbmd0aCA9IHN0cmxlbihja3N1bWJ1Zik7CisKKyAgICAgICAgc3RhdHVzID0ga3JiNV9pbml0X2NvbnRleHQoJms1X2NvbnRleHQpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJja19rcmJfcmxvZ2luKCkiLCJ1bmFibGUgdG8gaW5pdF9jb250ZXh0IiwwKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKworICAgICAgICBkZXNpbmJ1Zi5kYXRhID0gZGVzX2luYnVmOworICAgICAgICBkZXNvdXRidWYuZGF0YSA9IGRlc19vdXRwa3QrNDsgIC8qIFNldCB1cCBkZXMgYnVmZmVycyAqLworCisgICAgICAgIHJjID0gazVfZ2V0X2NjYWNoZShrNV9jb250ZXh0LCZjY2FjaGUsTlVMTCk7CisgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICBjb21fZXJyKE5VTEwsIHJjLCAid2hpbGUgZ2V0dGluZyBjY2FjaGUuIik7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKworICAgICAgICBzZXJ2aWNlID0ga3JiNV9kX3NydiA/IGtyYjVfZF9zcnYgOiBLUkI1X1NFUlZJQ0VfTkFNRTsKKworICAgICAgICBpZiAoIShnZXRfY3JlZCA9IChrcmI1X2NyZWRzICopY2FsbG9jKDEsIHNpemVvZihrcmI1X2NyZWRzKSkpKSB7CisgICAgICAgICAgICBwcmludGYoImNrX2tyYl9ybG9naW46IG5vIG1lbW9yeVxyXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGdldF9jcmVkLDAsc2l6ZW9mKGtyYjVfY3JlZHMpKTsKKyAgICAgICAgc3RhdHVzID0ga3JiNV9zbmFtZV90b19wcmluY2lwYWwoazVfY29udGV4dCwgaG9zdG5hbWUsIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLUkI1X05UX1NSVl9IU1QsICZnZXRfY3JlZC0+c2VydmVyKTsKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgcHJpbnRmKCJja19rcmJfcmxvZ2luOiBrcmI1X3NuYW1lX3RvX3ByaW5jaXBhbCBmYWlsZWQ6ICVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlKHN0YXR1cykpOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIHR0b2MoMCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9IGtyYjVfY2NfZ2V0X3ByaW5jaXBhbChrNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2V0X2NyZWQtPmNsaWVudCkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgKHZvaWQpIGtyYjVfY2NfY2xvc2UoazVfY29udGV4dCwgY2NhY2hlKTsKKyAgICAgICAgICAgIGtyYjVfZnJlZV9jcmVkcyhrNV9jb250ZXh0LCBnZXRfY3JlZCk7CisgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChrcmI1X3Jsb2dfdmVyID09IEtDTURfT0xEX1BST1RPQ09MKQorICAgICAgICAgICAgZ2V0X2NyZWQtPmtleWJsb2NrLmVuY3R5cGU9RU5DVFlQRV9ERVNfQ0JDX0NSQzsKKworICAgICAgICAvKiBHZXQgdGlja2V0IGZyb20gY3JlZGVudGlhbHMgY2FjaGUgb3Iga2RjICovCisgICAgICAgIHN0YXR1cyA9IGtyYjVfZ2V0X2NyZWRlbnRpYWxzKGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXRfY3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBrcmI1X2ZyZWVfY3JlZHMoazVfY29udGV4dCwgZ2V0X2NyZWQpOworICAgICAgICBnZXRfY3JlZCA9IE5VTEw7CisgICAgICAgICh2b2lkKSBrcmI1X2NjX2Nsb3NlKGs1X2NvbnRleHQsIGNjYWNoZSk7CisKKyAgICAgICAgaWYgKHN0YXR1cykgCisgICAgICAgICAgICBnb3RvIGJhZDsKKworICAgICAgICAvKiBSZXNldCBpbnRlcm5hbCBmbGFnczsgdGhlc2Ugc2hvdWxkIG5vdCBiZSBzZXQuICovCisgICAgICAgIGF1dGhvcHRzICY9ICh+T1BUU19GT1JXQVJEX0NSRURTKTsKKyAgICAgICAgYXV0aG9wdHMgJj0gKH5PUFRTX0ZPUldBUkRBQkxFX0NSRURTKTsKKworICAgICAgICBpZiAoa3JiNV9hdXRoX2Nvbl9pbml0KGs1X2NvbnRleHQsICZhdXRoX2NvbnRleHQpKQorICAgICAgICAgICAgZ290byBiYWQ7CisKKyAgICAgICAgaWYgKGtyYjVfYXV0aF9jb25fc2V0ZmxhZ3MoazVfY29udGV4dCwgYXV0aF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1JCNV9BVVRIX0NPTlRFWFRfUkVUX1RJTUUpKQorICAgICAgICAgICAgZ290byBiYWQ7CisKKyAgICAgICAgLyogT25seSBuZWVkIGxvY2FsIGFkZHJlc3MgZm9yIG1rX2NyZWQoKSB0byBzZW5kIHRvIGtybG9naW5kICovCisgICAgICAgIGlmICgha3JiNV9kX25vX2FkZHJlc3NlcykKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPSBrcmI1X2F1dGhfY29uX2dlbmFkZHJzKGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtSQjVfQVVUSF9DT05URVhUX0dFTkVSQVRFX0xPQ0FMX0ZVTExfQUREUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAgICAgZ290byBiYWQ7CisKKyAgICAgICAgLyogSGVyZSBpcyB3aGVyZSB3ZSBzdGFydCB0byBoYW5kbGUgdGhlIG5ldyBwcm90b2NvbCBpbiBlYXJuZXN0ICovCisgICAgICAgIGlmICgga3JiNV9ybG9nX3ZlciA9PSBLQ01EX1BST1RPQ09MX0NPTVBBVF9IQUNLICkgeworICAgICAgICAgICAga3JiNV9ib29sZWFuIGlzX2RlczsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9IGtyYjVfY19lbmN0eXBlX2NvbXBhcmUoIGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5DVFlQRV9ERVNfQ0JDX0NSQywKKyNpZmRlZiBIRUlNREFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0X2NyZWQtPnNlc3Npb24ua2V5dHlwZSwKKyNlbHNlIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfY3JlZC0+a2V5YmxvY2suZW5jdHlwZSwKKyNlbmRpZiAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzX2RlcykpIHsKKyAgICAgICAgICAgICAgICBrcmI1X2ZyZWVfY3JlZHMoazVfY29udGV4dCwgcmV0X2NyZWQpOworICAgICAgICAgICAgICAgIHJldF9jcmVkID0gTlVMTDsKKyAgICAgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBpc19kZXMgKSB7CisgICAgICAgICAgICAgICAga2NtZF92ZXJzaW9uID0gIktDTURWMC4xIjsKKyAgICAgICAgICAgICAgICB1c2VfcHJvdG8gPSBLQ01EX09MRF9QUk9UT0NPTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXV0aG9wdHMgPSBBUF9PUFRTX1VTRV9TVUJLRVk7CisgICAgICAgICAgICAgICAga2NtZF92ZXJzaW9uID0gIktDTURWMC4yIjsKKyAgICAgICAgICAgICAgICB1c2VfcHJvdG8gPSBLQ01EX05FV19QUk9UT0NPTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZV9wcm90byA9IGtyYjVfcmxvZ192ZXI7CisgICAgICAgICAgICBzd2l0Y2ggKCBrcmI1X3Jsb2dfdmVyICkgeworICAgICAgICAgICAgY2FzZSBLQ01EX05FV19QUk9UT0NPTDoKKyAgICAgICAgICAgICAgICBhdXRob3B0cyA9IEFQX09QVFNfVVNFX1NVQktFWTsKKyAgICAgICAgICAgICAgICBrY21kX3ZlcnNpb24gPSAiS0NNRFYwLjIiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBLQ01EX09MRF9QUk9UT0NPTDoKKyAgICAgICAgICAgICAgICBrY21kX3ZlcnNpb24gPSAiS0NNRFYwLjEiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGNhbGwgS2VyYmVyb3MgbGlicmFyeSByb3V0aW5lIHRvIG9idGFpbiBhbiBhdXRoZW50aWNhdG9yLAorICAgICAgICAgICBwYXNzIGl0IG92ZXIgdGhlIHNvY2tldCB0byB0aGUgc2VydmVyLCBhbmQgb2J0YWluIG11dHVhbAorICAgICAgICAgICBhdXRoZW50aWNhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1cyA9IGtyYjVfc2VuZGF1dGgoazVfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXV0aF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrcmI1X3BvaW50ZXIpICZ0dHlmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrY21kX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0X2NyZWQtPmNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfY3JlZC0+c2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2tzdW1kYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0X2NyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcF9yZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGtyYjVfZnJlZV9kYXRhX2NvbnRlbnRzKGs1X2NvbnRleHQsJmNrc3VtZGF0KTsKKworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoICFxdWlldCApCisgICAgICAgICAgICAgICAgcHJpbnRmKCJDb3VsZG4ndCBhdXRoZW50aWNhdGUgdG8gc2VydmVyOiAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZShzdGF0dXMpKTsKKyAgICAgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgICAgIGlmICggIXF1aWV0ICkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlNlcnZlciByZXR1cm5lZCBlcnJvciBjb2RlICVkICglcylcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLT5lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UoRVJST1JfVEFCTEVfQkFTRV9rcmI1ICsgZXJyb3ItPmVycm9yKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci0+dGV4dC5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3IgdGV4dCBzZW50IGZyb20gc2VydmVyOiAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci0+dGV4dC5kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBrcmI1X2ZyZWVfZXJyb3IoazVfY29udGV4dCwgZXJyb3IpOworICAgICAgICAgICAgICAgIGVycm9yID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcF9yZXQpIHsKKyAgICAgICAgICAgIHNlcnZlcl9zZXFubyA9IHJlcF9yZXQtPnNlcV9udW1iZXI7CisgICAgICAgICAgICBrcmI1X2ZyZWVfYXBfcmVwX2VuY19wYXJ0KGs1X2NvbnRleHQsIHJlcF9yZXQpOworICAgICAgICB9CisKKyAgICAgICAgKHZvaWQpIHR0b2wocmVtb3RldXNlciwgc3RybGVuKHJlbW90ZXVzZXIpKzEpOworICAgICAgICAodm9pZCkgdHRvbCh0ZXJtX3NwZWVkLCBzdHJsZW4odGVybV9zcGVlZCkrMSk7CisgICAgICAgICh2b2lkKSB0dG9sKGxvY2FsdXNlciwgc3RybGVuKGxvY2FsdXNlcikrMSk7CisKKyAgICAgICAgaWYgKGZvcndhcmRfZmxhZykgeyAgIC8qIEZvcndhcmQgY3JlZGVudGlhbHMgKGdsb2JhbCkgKi8KKyAgICAgICAgICAgIGlmIChzdGF0dXMgPSBrcmI1X2Z3ZF90Z3RfY3JlZHMoIGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldF9jcmVkLT5jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfY3JlZC0+c2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3J3YXJkYWJsZV9mbGFnID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUU19GT1JXQVJEQUJMRV9DUkVEUyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dGJ1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBmb3J3YXJkaW5nIGNyZWRlbnRpYWxzOiAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2Uoc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgZ290byBiYWQyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTZW5kIGZvcndhcmRlZCBjcmVkZW50aWFscyAqLworICAgICAgICAgICAgc3RhdHVzID0ga3JiNV93cml0ZV9tZXNzYWdlKGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrcmI1X3BvaW50ZXIpJnR0eWZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0YnVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8qIER1bW15IHdyaXRlIHRvIHNpZ25hbCBubyBmb3J3YXJkaW5nICovCisgICAgICAgICAgYmFkMjoKKyAgICAgICAgICAgIG91dGJ1Zi5sZW5ndGggPSAwOworICAgICAgICAgICAgc3RhdHVzID0ga3JiNV93cml0ZV9tZXNzYWdlKGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrcmI1X3BvaW50ZXIpJnR0eWZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0YnVmKTsKKyAgICAgICAgfSAgICAgICAKKworICAgICAgICBpZiAoKGMgPSB0dGluYygwKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoYz09LTEpIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoaG9zdG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImNrX2tyYl9ybG9naW46IGJhZCBjb25uZWN0aW9uIHdpdGggcmVtb3RlIGhvc3RcclxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisgICAgICAgIGlmIChjICE9IDApIHsKKyAgICAgICAgICAgIHdoaWxlICgoYyA9IHR0aW5jKDEpKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIHByaW50ZigiJWMiLGMpOworICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gLTE7CisgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggc3RhdHVzID09IDAgKSB7ICAgICAgICAvKiBzdWNjZXNzICovCisgICAgICAgICAgICBrcmI1X2tleWJsb2NrICoga2V5ID0gMDsKKworICAgICAgICAgICAgaWYgKCB1c2VfcHJvdG8gPT0gS0NNRF9ORVdfUFJPVE9DT0wgKSB7CisgICAgICAgICAgICAgICAgaW50IG9uID0gMTsKKyAgICAgICAgICAgICAgICBybG9nX2luYmFuZCA9IDE7CisgICAgICAgICAgICAgICAgc2V0c29ja29wdCh0dHlmZCwgU09MX1NPQ0tFVCwgU09fT09CSU5MSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJm9uLCBzaXplb2Ygb24pOworCisgICAgICAgICAgICAgICAgc3RhdHVzID0ga3JiNV9hdXRoX2Nvbl9nZXRsb2NhbHN1YmtleSggazVfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSk7CisgICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgfHwgIWtleSkgJiYgZW5jcnlwdF9mbGFnICkKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWQyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBrZXkgPT0gMCApIHsKKyNpZmRlZiBIRUlNREFMCisgICAgICAgICAgICAgICAga2V5ID0gJnJldF9jcmVkLT5zZXNzaW9uOworI2Vsc2UgLyogSEVJTURBTCAqLworICAgICAgICAgICAgICAgIGtleSA9ICZyZXRfY3JlZC0+a2V5YmxvY2s7CisjZW5kaWYgLyogSEVJTURBTCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByY21kX3N0cmVhbV9pbml0X2tyYjUoa2V5LCBlbmNyeXB0X2ZsYWcsIDEsIDEsIHVzZV9wcm90byk7CisgICAgICAgICAgICBpZiAoIGVuY3J5cHRfZmxhZyApCisgICAgICAgICAgICAgICAgcmxvZ19lbmNyeXB0ID0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKDApOyAgICAgLyogc3VjY2VzcyAqLworCisgICAgICBiYWQ6CisgICAgICAgIGlmICggc3RhdHVzICYmICFxdWlldCApIHsKKyAgICAgICAgICAgIHByaW50ZigiS2VyYmVyb3MgYXV0aGVudGljYXRpb24gZXJyb3I6ICVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2Uoc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldF9jcmVkKSB7CisgICAgICAgICAgICBrcmI1X2ZyZWVfY3JlZHMoazVfY29udGV4dCwgcmV0X2NyZWQpOworICAgICAgICAgICAgcmV0X2NyZWQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoc3RhdHVzKTsKKyNlbHNlIC8qIEtSQjUgKi8KKyAgICAgICAgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBLUkI1ICovCisgICAgfSBlbHNlIGlmIChrdmVyc2lvbiA9PSA0KSB7CisjaWZkZWYgS1JCNAorICAgICAgICBjaGFyIHRndFs0KlJFQUxNX1NaKzFdOworICAgICAgICBkZWJ1ZyhGMTAwLCJja19rcmJfcmxvZ2luIHZlcnNpb24gNCIsIiIsMCk7CisKKyAgICAgICAgcmVhbG0gPSAoY2hhciAqKWtyYl9yZWFsbW9maG9zdChob3N0bmFtZSk7CisgICAgICAgIGlmICghcmVhbG0pIHsKKyAgICAgICAgICAgIHN0cmNweShzdHJUbXAsICJDYW4ndCBmaW5kIHJlYWxtIGZvciBob3N0IFwiIik7CisgICAgICAgICAgICBja3N0cm5jYXQoc3RyVG1wLCBob3N0bmFtZSxBVVRIVE1QQkwpOworICAgICAgICAgICAgY2tzdHJuY2F0KHN0clRtcCwgIlwiIixBVVRIVE1QQkwpOworICAgICAgICAgICAgcHJpbnRmKCI/S2VyYmVyb3MgNCBlcnJvcjogJXNcclxuIixzdHJUbXApOworICAgICAgICAgICAga3JiNF9lcnJubyA9IDA7CisgICAgICAgICAgICBtYWtlc3RyKCZrcmI0X2Vycm1zZyxzdHJUbXApOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisKKyAgICAgICAgY2ttYWttc2codGd0LHNpemVvZih0Z3QpLCJrcmJ0Z3QuIixyZWFsbSwiQCIscmVhbG0pOworICAgICAgICBzdGF0dXMgPSBja19rcmI0X3RrdF9pc3ZhbGlkKHRndCk7CisKKyAgICAgICAgaWYgKCBzdGF0dXMgPD0gMCAmJiBrcmI0X2F1dG9nZXQgKQorICAgICAgICAgICAgY2tfa3JiNF9hdXRvZ2V0X1RHVChyZWFsbSk7CisKKyAgICAgICAgdHRvYygwKTsgICAgICAgIC8qIHdyaXRlIGEgTlVMICovCisKKyAgICAgICAgc3RhdHVzID0ga3JiX3NlbmRhdXRoKGVuY3J5cHRfZmxhZz9LT1BUX0RPX01VVFVBTDowLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eWZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrNF9hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjRfZF9zcnYgPyBrcmI0X2Rfc3J2IDogS1JCNF9TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGdldHBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrNF9tc2dfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlZCwKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJms0X3NjaGVkLAorI2Vsc2UgLyogRU5DUllQVElPTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisjZW5kaWYgLyogRU5DUllQVElPTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktDTURWMC4xIik7CisgICAgICAgIGRlYnVnKEYxMTEsImNrX2tyYl9ybG9naW4iLCJrcmJfc2VuZGF1dGgiLHN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gS1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHByaW50ZiggImtyYl9zZW5kYXV0aCBmYWlsZWQ6ICVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgIGtyYl9nZXRfZXJyX3RleHRfZW50cnkoc3RhdHVzKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICB0dG9sKHJlbW90ZXVzZXIsc3RybGVuKHJlbW90ZXVzZXIpKzEpOworICAgICAgICB0dG9sKHRlcm1fc3BlZWQsc3RybGVuKHRlcm1fc3BlZWQpKzEpOworCisgICAgICByZXJlYWQ6CisgICAgICAgIGlmICgoYyA9IHR0aW5jKDApKSA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZigicmNtZDogYmFkIGNvbm5lY3Rpb24gd2l0aCByZW1vdGUgaG9zdFxyXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjExMSwiY2tfa3JiX3Jsb2dpbiIsImZpcnN0IGJ5dGUiLGMpOworCisgICAgICAgIGlmIChjICE9IDApIHsKKyAgICAgICAgICAgIGNoYXIgKmNoZWNrID0gImxkLnNvOiB3YXJuaW5nOiI7CisgICAgICAgICAgICAvKiBJZiBybG9naW5kIHdhcyBjb21waWxlZCBvbiBTdW5PUzQsIGFuZCBpdCBzb21laG93CisgICAgICAgICAgICBnb3QgdGhlIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24gbnVtYmVycyB3cm9uZywgaXQKKyAgICAgICAgICAgIG1heSBnaXZlIGFuIGxkLnNvIHdhcm5pbmcgYWJvdXQgYW4gb2xkIHZlcnNpb24gb2YgYQorICAgICAgICAgICAgc2hhcmVkIGxpYnJhcnkuICBKdXN0IGlnbm9yZSBhbnkgc3VjaCB3YXJuaW5nLgorICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSB3YXJuaW5nIGlzIGEgY2hhcmFjdGVyaXN0aWMgb2YgdGhlCisgICAgICAgICAgICBzZXJ2ZXI7IHdlIG1heSBub3Qgb3Vyc2VsdmVzIGJlIHJ1bm5pbmcgdW5kZXIKKyAgICAgICAgICAgIFN1bk9TNC4gICovCisgICAgICAgICAgICBpZiAoYyA9PSAnbCcpIHsKKyAgICAgICAgICAgICAgICBjaGFyICpwOworICAgICAgICAgICAgICAgIGNoYXIgY2M7CisKKyAgICAgICAgICAgICAgICBwID0gJmNoZWNrWzFdOworICAgICAgICAgICAgICAgIHdoaWxlICgoYyA9IHR0aW5jKDApKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gKnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgICAgZ290byByZXJlYWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaW50ZihjaGVjayk7CisgICAgICAgICAgICB3aGlsZSAoKGMgPSB0dGluYygxKSkgPj0gMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiJWMiLGMpOworICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjExMCwiY2tfa3JiX3Jsb2dpbiIsImZhdGFsIGVycm9yIDEiLDApOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICBpZiAoIGVuY3J5cHRfZmxhZyApIHsKKyAgICAgICAgICAgIC8qIGlmIHdlIGFyZSBlbmNyeXB0aW5nIHdlIG5lZWQgdG8gc2V0dXAgdGhlIGVuY3J5cHRpb24gKi8KKyAgICAgICAgICAgIC8qIHJvdXRpbmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRlc19rZXlfc2NoZWQoY3JlZC5zZXNzaW9uLCBrNF9zY2hlZCk7CisgICAgICAgICAgICBybG9nX2VuY3J5cHQgPSAxOworICAgICAgICB9CisjZW5kaWYgLyogRU5DUllQVElPTiAqLworI2Vsc2UgLyogS1JCNCAqLworICAgICAgICByZXR1cm4oLTEpOworI2VuZGlmIC8qIEtSQjQgKi8KKyAgICB9CisgICAgcmV0dXJuKDApOyAvKiBzdWNjZXNzICovCit9CisKKyNkZWZpbmUgU1JBTkQgICBzcmFuZAorI2RlZmluZSBSQU5EICAgIHJhbmQKKyNkZWZpbmUgUkFORF9UWVBFICAgICAgIGludAorCitzdGF0aWMgbG9uZworcmFuZG9tX2NvbmZvdW5kZXIoc2l6ZSwgZmlsbGluKQorc2l6ZV90IHNpemU7CitjaGFyICogZmlsbGluOworeworICAgIHN0YXRpYyBpbnQgc2VlZGVkID0gMDsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpyZWFsX2ZpbGw7CisgICAgUkFORF9UWVBFICAgcnZhbDsKKworICAgIGlmICghc2VlZGVkKSB7CisgICAgICAgIC8qIHRpbWUoKSBkZWZpbmVkIGluIDQuMTIuMi40LCBidXQgcmV0dXJucyBhIHRpbWVfdCwgd2hpY2ggaXMgYW4KKyAgICAgICAgICAgImFyaXRobWV0aWMgdHlwZSIgKDQuMTIuMSkgKi8KKyAgICAgICAgcnZhbCA9IChSQU5EX1RZUEUpIHRpbWUoMCk7CisgICAgICAgIFNSQU5EKHJ2YWwpOworICAgICAgICBydmFsID0gUkFORCgpOworICAgICAgICBydmFsIF49IGdldHBpZCgpOworICAgICAgICBTUkFORChydmFsKTsKKyAgICAgICAgc2VlZGVkID0gMTsKKyAgICB9CisKKyAgICByZWFsX2ZpbGwgPSAodW5zaWduZWQgY2hhciAqKWZpbGxpbjsKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgcnZhbCA9IFJBTkQoKTsKKyAgICAgICAgKnJlYWxfZmlsbCA9IHJ2YWwgJiAweGZmOworICAgICAgICByZWFsX2ZpbGwrKzsKKyAgICAgICAgc2l6ZS0tOworICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgKnJlYWxfZmlsbCA9IChydmFsID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIHJlYWxfZmlsbCsrOworICAgICAgICAgICAgc2l6ZS0tOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWZkZWYgS1JCNQoraW50CitrcmI1X2Rlc19hdmFpbChmZCkKKyAgICBpbnQgZmQ7Cit7CisgICAgcmV0dXJuKG5zdG9yZWQpOworfQorCitpbnQKK2tyYjVfZGVzX3JlYWQoZmQsIGJ1ZiwgbGVuLCBzZWNvbmRhcnkpCisgICAgaW50IGZkOworICAgIHJlZ2lzdGVyIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOworICAgIGludCBzZWNvbmRhcnk7Cit7CisgICAgaW50IG5yZXR1cm5lZCA9IDA7CisgICAgbG9uZyBuZXRfbGVuLHJkX2xlbjsKKyAgICBpbnQgY2M7CisgICAga3JiNV9lcnJvcl9jb2RlIHN0YXR1czsKKyAgICB1bnNpZ25lZCBjaGFyIGM7CisgICAga3JiNV9kYXRhIHBsYWluOworICAgIGtyYjVfZW5jX2RhdGEgY2lwaGVyOworCisgICAgZGVidWcoRjExMSwia3JiNV9kZXNfcmVhZCIsImxlbiIsbGVuKTsKKyAgICBkZWJ1ZyhGMTExLCJrcmI1X2Rlc19yZWFkIiwicmxvZ19lbmNyeXB0IixybG9nX2VuY3J5cHQpOworICAgIGlmICggIXJsb2dfZW5jcnlwdCApIHsKKyAgICAgICAgY2MgPSBuZXRfcmVhZChmZCwgYnVmLCBsZW4pOworICAgICAgICBkZWJ1ZyhGMTExLCJrcmI1X2Rlc19yZWFkIiwiY2hhcnMgcmVhZCIsY2MpOworICAgICAgICBpZiAoIGNjIDwgMCApCisgICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgIHJldHVybihjYyk7CisgICAgfQorCisgICAgaWYgKG5zdG9yZWQgPj0gbGVuKSB7CisgICAgICAgIGlmICggYnVmICkgeworICAgICAgICAgICAgbWVtY3B5KGJ1Ziwgc3RvcmVfcHRyLCBsZW4pOyAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgc3RvcmVfcHRyICs9IGxlbjsKKyAgICAgICAgICAgIG5zdG9yZWQgLT0gbGVuOworICAgICAgICAgICAgcmV0dXJuKGxlbik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgIH0gZWxzZSBpZiAobnN0b3JlZCkgeworICAgICAgICBpZiAoIGJ1ZiApIHsKKyAgICAgICAgICAgIG1lbWNweShidWYsIHN0b3JlX3B0ciwgbnN0b3JlZCk7ICAgIC8qIHNhZmUgKi8KKyAgICAgICAgICAgIG5yZXR1cm5lZCArPSBuc3RvcmVkOworICAgICAgICAgICAgYnVmICs9IG5zdG9yZWQ7CisgICAgICAgICAgICBsZW4gLT0gbnN0b3JlZDsKKyAgICAgICAgICAgIG5zdG9yZWQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICAvKiBTZWUgdGhlIGNvbW1lbnQgaW4gdjRfZGVzX3JlYWQuICovCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgY2MgPSBuZXRfcmVhZChmZCwgJmMsIDEpOworICAgICAgICAvKiB3ZSBzaG91bGQgY2hlY2sgZm9yIG5vbi1ibG9ja2luZyBoZXJlLCBidXQgd2UnZCBoYXZlCisgICAgICAgIHRvIG1ha2UgaXQgc2F2ZSBwYXJ0aWFsIHJlYWRzIGFzIHdlbGwuICovCisgICAgICAgIGlmIChjYyA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gY2M7IC8qIHJlYWQgZXJyb3IgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoY2MgPT0gMSkgeworICAgICAgICAgICAgaWYgKGMgPT0gMCB8fCAhZG9fbGVuY2hlY2spIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmRfbGVuID0gYzsKKyAgICBpZiAoKGNjID0gbmV0X3JlYWQoZmQsICZjLCAxKSkgIT0gMSkgcmV0dXJuIDA7CisgICAgcmRfbGVuID0gKHJkX2xlbiA8PCA4KSB8IGM7CisgICAgaWYgKChjYyA9IG5ldF9yZWFkKGZkLCAmYywgMSkpICE9IDEpIHJldHVybiAwOworICAgIHJkX2xlbiA9IChyZF9sZW4gPDwgOCkgfCBjOworICAgIGlmICgoY2MgPSBuZXRfcmVhZChmZCwgJmMsIDEpKSAhPSAxKSByZXR1cm4gMDsKKyAgICByZF9sZW4gPSAocmRfbGVuIDw8IDgpIHwgYzsKKworICAgIGlmIChzdGF0dXMgPSBrcmI1X2NfZW5jcnlwdF9sZW5ndGgoazVfY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrNV9zZXNzaW9uX2tleS0+ZW5jdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9pdmVjcyA/IHJkX2xlbiArIDQgOiByZF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV0X2xlbikpIHsKKyAgICAgICAgZXJybm8gPSBzdGF0dXM7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgaWYgKChuZXRfbGVuIDw9IDApIHx8IChuZXRfbGVuID4gc2l6ZW9mKGRlc19pbmJ1ZikpKSB7CisgICAgICAgIC8qIHByZXBvc3Rlcm91cyBsZW5ndGg7IGFzc3VtZSBvdXQtb2Ytc3luYzsgb25seQorICAgICAgICAgICByZWNvdXJzZSBpcyB0byBjbG9zZSBjb25uZWN0aW9uLCBzbyByZXR1cm4gMCAqLworICAgICAgICBwcmludGYoIlJlYWQgc2l6ZSBwcm9ibGVtLlxyXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBpZiAoKGNjID0gbmV0X3JlYWQoZmQsIGRlc2luYnVmLmRhdGEsIG5ldF9sZW4pKSAhPSBuZXRfbGVuICkKKyAgICB7CisgICAgICAgIC8qIHBpcGUgbXVzdCBoYXZlIGNsb3NlZCwgcmV0dXJuIDAgKi8KKyAgICAgICAgcHJpbnRmKCAiUmVhZCBlcnJvcjogbGVuZ3RoIHJlY2VpdmVkICVkICE9IGV4cGVjdGVkICVkLlxyXG4iLAorICAgICAgICAgICAgICAgIGNjLAorICAgICAgICAgICAgICAgIG5ldF9sZW4KKyAgICAgICAgICAgICAgICApOworICAgICAgICByZXR1cm4oY2MpOworICAgIH0KKworCisgICAgLyogZGVjcnlwdCBpbmZvICovCisgICAgY2lwaGVyLmVuY3R5cGUgPSBFTkNUWVBFX1VOS05PV047CisgICAgY2lwaGVyLmNpcGhlcnRleHQubGVuZ3RoID0gbmV0X2xlbjsKKyAgICBjaXBoZXIuY2lwaGVydGV4dC5kYXRhID0gZGVzaW5idWYuZGF0YTsKKyAgICBwbGFpbi5sZW5ndGggPSBzaXplb2Yoc3RvcmFnZSk7CisgICAgcGxhaW4uZGF0YSA9IHN0b3JhZ2U7CisKKyAgICBpZiAoIHN0YXR1cyA9IGtyYjVfY19kZWNyeXB0KGs1X2NvbnRleHQsIGs1X3Nlc3Npb25fa2V5LCBLQ01EX0tFWVVTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2l2ZWNzID8gZW5jaXZlY19pICsgc2Vjb25kYXJ5IDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2lwaGVyLCZwbGFpbikgKSB7CisgICAgICAgIC8qIHByb2JhYmx5IG91dCBvZiBzeW5jICovCisgICAgICAgIHByaW50ZigiQ2Fubm90IGRlY3J5cHQgZGF0YSBmcm9tIG5ldHdvcms6ICVzXHJcbiIsCisgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2Uoc3RhdHVzKSk7CisgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICAKKyAgICBzdG9yZV9wdHIgPSBzdG9yYWdlOworICAgIG5zdG9yZWQgPSByZF9sZW47CisKKyAgICBpZiAoIHVzZV9pdmVjcyApIHsKKyAgICAgICAgaW50IHJkX2xlbjI7CisgICAgICAgIHJkX2xlbjIgPSBzdG9yYWdlWzBdICYgMHhmZjsKKyAgICAgICAgcmRfbGVuMiA8PD0gODsgcmRfbGVuMiB8PSBzdG9yYWdlWzFdICYgMHhmZjsKKyAgICAgICAgcmRfbGVuMiA8PD0gODsgcmRfbGVuMiB8PSBzdG9yYWdlWzJdICYgMHhmZjsKKyAgICAgICAgcmRfbGVuMiA8PD0gODsgcmRfbGVuMiB8PSBzdG9yYWdlWzNdICYgMHhmZjsKKyAgICAgICAgaWYgKHJkX2xlbjIgIT0gcmRfbGVuKSB7CisgICAgICAgICAgICAvKiBjbGVhcnRleHQgbGVuZ3RoIHRyYXNoZWQ/ICovCisgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdG9yZV9wdHIgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoICFidWYgKQorICAgICAgICByZXR1cm4oMCk7CisKKyNpZmRlZiBSTE9HQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBibGFoICovCisgICAgaWYgKHJsb2dfaW5iYW5kICYmICh0dG5wcm90byA9PSBOUF9LNUxPR0lOIHx8IHR0bnByb3RvID09IE5QX0VLNUxPR0lOKSkKKyAgICB7CisgICAgICAgIGludCBpLCBsZWZ0LCBuOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuc3RvcmVkOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdG9yZV9wdHJbaV0gPT0gJ1wzNzcnICYmCisgICAgICAgICAgICAgICAgc3RvcmVfcHRyW2krMV0gPT0gJ1wzNzcnKSB7CisgICAgICAgICAgICAgICAgbGVmdCA9IG5zdG9yZWQgLSBpOworICAgICAgICAgICAgICAgIG4gPSBybG9nX2N0cmwoJnN0b3JlX3B0cltpXSwgbGVmdCk7CisgICAgICAgICAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxlZnQgLT0gKC1uKTsKKyAgICAgICAgICAgICAgICAgICAgbnN0b3JlZCA9IGxlZnQ7CisgICAgICAgICAgICAgICAgICAgIC8qIGZsdXNoIGJlZm9yZSwgYW5kICgtbikgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbWVtbW92ZShzdG9yZV9wdHIsICZzdG9yZV9wdHJbaS1uXSwgbGVmdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuKSB7CisgICAgICAgICAgICAgICAgICAgIGxlZnQgLT0gbjsKKyAgICAgICAgICAgICAgICAgICAgbnN0b3JlZCAtPSBuOworICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKHN0b3JlX3B0ciwgJnN0b3JlX3B0cltuXSwgbGVmdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisKKyAgICBpZiAobnN0b3JlZCA+IGxlbikgeworICAgICAgICBtZW1jcHkoYnVmLCBzdG9yZV9wdHIsIGxlbik7ICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICBucmV0dXJuZWQgKz0gbGVuOworICAgICAgICBzdG9yZV9wdHIgKz0gbGVuOworICAgICAgICBuc3RvcmVkIC09IGxlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkoYnVmLCBzdG9yZV9wdHIsIG5zdG9yZWQpOyAgICAgICAgLyogc2FmZSAqLworICAgICAgICBucmV0dXJuZWQgKz0gbnN0b3JlZDsKKyAgICAgICAgbnN0b3JlZCA9IDA7CisgICAgfQorICAgIHJldHVybihucmV0dXJuZWQpOworfQorCitpbnQKK2tyYjVfZGVzX3dyaXRlKGZkLCBidWYsIGxlbiwgc2Vjb25kYXJ5KQorICAgIGludCBmZDsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGxlbjsKKyAgICBpbnQgc2Vjb25kYXJ5OworeworICAgIGNoYXIgdG1wYnVmWzIqUkxPR19CVUZTSVorOF07CisgICAgdW5zaWduZWQgY2hhciAqbGVuX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHRtcGJ1ZjsKKyAgICBrcmI1X2Vycm9yX2NvZGUgc3RhdHVzOworICAgIGtyYjVfZGF0YSBwbGFpbjsKKyAgICBrcmI1X2VuY19kYXRhIGNpcGhlcjsKKworICAgIGRlYnVnKEYxMTEsImtyYjVfZGVzX3dyaXRlIiwicmxvZ19lbmNyeXB0IixybG9nX2VuY3J5cHQpOworICAgIGlmICggIXJsb2dfZW5jcnlwdCApIHsKKyAgICAgICAgaW50IGNjID0gbmV0X3dyaXRlKGZkLCBidWYsIGxlbik7CisgICAgICAgIGRlYnVnKEYxMTEsIm5ldF93cml0ZSIsImNoYXJzIHdyaXR0ZW4iLGNjKTsKKyAgICAgICAgcmV0dXJuKGNjICE9IGxlbiA/IC0xIDogbGVuKTsKKyAgICB9CisKKyAgICBpZiAodXNlX2l2ZWNzKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmxlbmJ1ZjIgPSAodW5zaWduZWQgY2hhciAqKSB0bXBidWY7CisgICAgICAgIGlmIChsZW4gKyA0ID4gc2l6ZW9mKHRtcGJ1ZikpCisgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgbGVuYnVmMlswXSA9IChsZW4gJiAweGZmMDAwMDAwKSA+PiAyNDsKKyAgICAgICAgbGVuYnVmMlsxXSA9IChsZW4gJiAweGZmMDAwMCkgPj4gMTY7CisgICAgICAgIGxlbmJ1ZjJbMl0gPSAobGVuICYgMHhmZjAwKSA+PiA4OworICAgICAgICBsZW5idWYyWzNdID0gKGxlbiAmIDB4ZmYpOworICAgICAgICBtZW1jcHkgKHRtcGJ1ZiArIDQsIGJ1ZiwgbGVuKTsKKworICAgICAgICBwbGFpbi5kYXRhID0gdG1wYnVmOworICAgICAgICBwbGFpbi5sZW5ndGggPSBsZW4gKyA0OworICAgIH0gZWxzZSB7CisgICAgICAgIHBsYWluLmRhdGEgPSBidWY7CisgICAgICAgIHBsYWluLmxlbmd0aCA9IGxlbjsKKyAgICB9CisKKyAgICBjaXBoZXIuY2lwaGVydGV4dC5sZW5ndGggPSBzaXplb2YoZGVzX291dHBrdCktNDsKKyAgICBjaXBoZXIuY2lwaGVydGV4dC5kYXRhID0gZGVzb3V0YnVmLmRhdGE7CisKKyAgICBpZiAoIHN0YXR1cyA9IGtyYjVfY19lbmNyeXB0KGs1X2NvbnRleHQsIGs1X3Nlc3Npb25fa2V5LCBLQ01EX0tFWVVTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9pdmVjcyA/IGVuY2l2ZWNfbyArIHNlY29uZGFyeSA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBsYWluLCAmY2lwaGVyKSkgeworICAgICAgICBwcmludGYoIldyaXRlIGVuY3J5cHQgcHJvYmxlbTogJXMuXHJcbiIsCisgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2Uoc3RhdHVzKSk7CisgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBkZXNvdXRidWYubGVuZ3RoID0gY2lwaGVyLmNpcGhlcnRleHQubGVuZ3RoOworCisgICAgbGVuX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGRlc19vdXRwa3Q7CisgICAgbGVuX2J1ZlswXSA9IChsZW4gJiAweGZmMDAwMDAwKSA+PiAyNDsKKyAgICBsZW5fYnVmWzFdID0gKGxlbiAmIDB4ZmYwMDAwKSA+PiAxNjsKKyAgICBsZW5fYnVmWzJdID0gKGxlbiAmIDB4ZmYwMCkgPj4gODsKKyAgICBsZW5fYnVmWzNdID0gKGxlbiAmIDB4ZmYpOworCisgICAgaWYgKG5ldF93cml0ZShmZCwgZGVzX291dHBrdCxkZXNvdXRidWYubGVuZ3RoKzQpCisgICAgICAgICAhPSBkZXNvdXRidWYubGVuZ3RoKzQpeworICAgICAgICBwcmludGYoIkNvdWxkIG5vdCB3cml0ZSBvdXQgYWxsIGRhdGFcclxuIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGVsc2UgcmV0dXJuKGxlbik7Cit9CisjZW5kaWYgLyogS1JCNSAqLworCisjaWZkZWYgS1JCNAorLyoKKyAqIE5vdGUgdGhhdCB0aGUgZW5jcnlwdGVkIHJsb2dpbiBwYWNrZXRzIHRha2UgdGhlIGZvcm0gb2YgYSBmb3VyLWJ5dGUKKyAqIGxlbmd0aCBmb2xsb3dlZCBieSBlbmNyeXB0ZWQgZGF0YS4gIE9uIHdyaXRpbmcgdGhlIGRhdGEgb3V0LCBhIHNpZ25pZmljYW50CisgKiBwZXJmb3JtYW5jZSBwZW5hbHR5IGlzIHN1ZmZlcmVkIChhdCBsZWFzdCBvbmUgUlRUIHBlciBjaGFyYWN0ZXIsIHR3byBpZiB3ZQorICogYXJlIHdhaXRpbmcgZm9yIGEgc2hlbGwgdG8gZWNobykgYnkgd3JpdGluZyB0aGUgZGF0YSBzZXBhcmF0ZWx5IGZyb20gdGhlCisgKiBsZW5ndGguICBTbywgdW5saWtlIHRoZSBpbnB1dCBidWZmZXIsIHdoaWNoIGp1c3QgY29udGFpbnMgdGhlIG91dHB1dAorICogZGF0YSwgdGhlIG91dHB1dCBidWZmZXIgcmVwcmVzZW50cyB0aGUgZW50aXJlIHBhY2tldC4KKyAqLworCitpbnQKK2tyYjRfZGVzX2F2YWlsKGZkKQorICAgIGludCBmZDsKK3sKKyAgICByZXR1cm4obnN0b3JlZCk7Cit9CisKK2ludAora3JiNF9kZXNfcmVhZChmZCwgYnVmLCBsZW4pCitpbnQgZmQ7CityZWdpc3RlciBjaGFyICpidWY7CitpbnQgbGVuOworeworICAgIGludCBucmV0dXJuZWQgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgbmV0X2xlbiwgcmRfbGVuOworICAgIGludCBjYzsKKyAgICB1bnNpZ25lZCBjaGFyIGM7CisgICAgaW50IGdvdHplcm8gPSAwOworCisgICAgZGVidWcoRjExMSwia3JiNF9kZXNfcmVhZCIsInJsb2dfZW5jcnlwdCIscmxvZ19lbmNyeXB0KTsKKyAgICBkZWJ1ZyhGMTExLCJrcmI0X2Rlc19yZWFkIiwibGVuIixsZW4pOworICAgIGlmICggIXJsb2dfZW5jcnlwdCApIHsKKyAgICAgICAgY2MgPSBuZXRfcmVhZChmZCwgYnVmLCBsZW4pOworICAgICAgICBkZWJ1ZyhGMTExLCJrcmI0X2Rlc19yZWFkIiwiY2hhcnMgcmVhZCIsY2MpOworICAgICAgICBpZiAoIGNjIDwgMCApCisgICAgICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgIHJldHVybihjYyk7CisgICAgfQorCisgICAgaWYgKG5zdG9yZWQgPj0gbGVuKSB7CisgICAgICAgIGlmICggYnVmICkgeworICAgICAgICAgICAgZGVidWcoRjExMSwia3JiNF9kZXNfcmVhZCAobnN0b3JlZCA+PSBsZW4pIiwibnN0b3JlZCIsbnN0b3JlZCk7CisgICAgICAgICAgICBtZW1jcHkoYnVmLCBzdG9yZV9wdHIsIGxlbik7ICAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICBzdG9yZV9wdHIgKz0gbGVuOworICAgICAgICAgICAgbnN0b3JlZCAtPSBsZW47CisgICAgICAgICAgICByZXR1cm4obGVuKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgfSBlbHNlIGlmIChuc3RvcmVkKSB7CisgICAgICAgIGlmICggYnVmICkgeworICAgICAgICAgICAgZGVidWcoRjExMSwia3JiNF9kZXNfcmVhZCAobnN0b3JlZCkiLCJuc3RvcmVkIixuc3RvcmVkKTsKKyAgICAgICAgICAgIG1lbWNweShidWYsIHN0b3JlX3B0ciwgbnN0b3JlZCk7ICAgIC8qIHNhZmUgKi8KKyAgICAgICAgICAgIG5yZXR1cm5lZCArPSBuc3RvcmVkOworICAgICAgICAgICAgYnVmICs9IG5zdG9yZWQ7CisgICAgICAgICAgICBsZW4gLT0gbnN0b3JlZDsKKyAgICAgICAgICAgIG5zdG9yZWQgPSAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICAvKiBXZSdyZSBmZXRjaGluZyB0aGUgbGVuZ3RoIHdoaWNoIGlzIE1TQiBmaXJzdCwgYW5kIHRoZSBNU0IKKyAgICBoYXMgdG8gYmUgemVybyB1bmxlc3MgdGhlIGNsaWVudCBpcyBzZW5kaW5nIG1vcmUgdGhhbiAyXjI0CisgICAgKDE2TSkgYnl0ZXMgaW4gYSBzaW5nbGUgd3JpdGUgKHdoaWNoIGlzIHdoeSB0aGlzIGNvZGUgaXMgaW4KKyAgICBybG9naW4gYnV0IG5vdCByY3Agb3IgcnNoLikgVGhlIG9ubHkgcmVhc29ucyB3ZSdkIGdldCBzb21ldGhpbmcKKyAgICBvdGhlciB0aGFuIHplcm8gYXJlOgorICAgIC0tIGNvcnJ1cHRpb24gb2YgdGhlIHRjcCBzdHJlYW0gKHdoaWNoIHdpbGwgc2hvdyB1cCB3aGVuCisgICAgZXZlcnl0aGluZyBlbHNlIGlzIG91dCBvZiBzeW5jIHRvbykKKyAgICAtLSB1bi1jYXVnaHQgQmVya2VsZXktc3R5bGUgInBzZXVkbyBvdXQtb2YtYmFuZCBkYXRhIiB3aGljaAorICAgIGhhcHBlbnMgYW55IHRpbWUgdGhlIHVzZXIgaGl0cyBeQyB0d2ljZS4KKyAgICBUaGUgbGF0dGVyIGlzICp2ZXJ5KiBjb21tb24sIGFzIHNob3duIGJ5IGFuICdybG9naW4gLXggLWQnCisgICAgdXNpbmcgdGhlIENOUyBWNCBybG9naW4uICAgICAgICAgTWFyayBFSWNoaW4gMS85NQorICAgICovCisgICAgZGVidWcoRjExMCwia3JiNF9kZXNfcmVhZCIsCisgICAgICAgICAgImFib3V0IHRvIGNhbGwgbmV0X3JlYWQoKSB0aGlzIHdpbGwgYmxvY2siLAorICAgICAgICAgIDAKKyAgICAgICAgICApOworICAgIGRvIHsKKyAgICAgICAgY2MgPSBuZXRfcmVhZChmZCwgJmMsIDEpOworICAgICAgICBkZWJ1ZyhGMTExLCJuZXRfcmVhZCIsImNoYXJzIHJlYWQiLGNjKTsKKyAgICAgICAgaWYgKGNjIDw9IDApIHsKKyAgICAgICAgICAgIG5ldGNsb3MoKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNjICE9IDEpIHJldHVybiAwOyAvKiByZWFkIGVycm9yICovCisgICAgICAgIGlmIChjYyA9PSAxKSB7CisgICAgICAgICAgICBpZiAoYyA9PSAwKSBnb3R6ZXJvID0gMTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKCFnb3R6ZXJvKTsKKworICAgIGRlYnVnKEYxMTAsImtyYjRfZGVzX3JlYWQiLCJnb3R6ZXJvIiwwKTsKKyAgICBjYyA9IG5ldF9yZWFkKGZkLCAmYywgMSk7CisgICAgZGVidWcoRjExMSwibmV0X3JlYWQiLCJjaGFycyByZWFkIixjYyk7CisgICAgaWYgKGNjIDwgMCkgeworICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfSBlbHNlIGlmICggY2MgIT0gMSApCisgICAgICAgIHJldHVybigwKTsKKyAgICBuZXRfbGVuID0gYzsKKyAgICBjYyA9IG5ldF9yZWFkKGZkLCAmYywgMSk7CisgICAgZGVidWcoRjExMSwibmV0X3JlYWQiLCJjaGFycyByZWFkIixjYyk7CisgICAgaWYgKGNjIDwgMCkgeworICAgICAgICBuZXRjbG9zKCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfSBlbHNlIGlmICggY2MgIT0gMSApCisgICAgICAgIHJldHVybigwKTsKKyAgICBuZXRfbGVuID0gKG5ldF9sZW4gPDwgOCkgfCBjOworICAgIGRlYnVnKEYxMTEsIm5ldF9yZWFkIiwiY2hhcnMgcmVhZCIsY2MpOworICAgIGNjID0gbmV0X3JlYWQoZmQsICZjLCAxKTsKKyAgICBpZiAoY2MgPCAwKSB7CisgICAgICAgIG5ldGNsb3MoKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9IGVsc2UgaWYgKCBjYyAhPSAxICkKKyAgICAgICAgcmV0dXJuKDApOworICAgIG5ldF9sZW4gPSAobmV0X2xlbiA8PCA4KSB8IGM7CisgICAgZGVidWcoRjExMSwia3JiNF9kZXNfcmVhZCIsIm5ldF9sZW4iLG5ldF9sZW4pOworCisgICAgLyogTm90ZTogbmV0X2xlbiBpcyB1bnNpZ25lZCAqLworICAgIGlmIChuZXRfbGVuID4gc2l6ZW9mKGRlc19pbmJ1ZikpIHsKKyAgICAgICAgLyogWFhYIHByZXBvc3Rlcm91cyBsZW5ndGgsIHByb2JhYmx5IG91dCBvZiBzeW5jLgorICAgICAgICBhY3QgYXMgaWYgcGlwZSBjbG9zZWQgKi8KKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICAvKiB0aGUgd3JpdGVyIHRlbGxzIHVzIGhvdyBtdWNoIHJlYWwgZGF0YSB3ZSBhcmUgZ2V0dGluZywgYnV0CisgICAgd2UgbmVlZCB0byByZWFkIHRoZSBwYWQgYnl0ZXMgKDgtYnl0ZSBib3VuZGFyeSkgKi8KKyNpZm5kZWYgcm91bmR1cAorI2RlZmluZSByb3VuZHVwKHgseSkgKCgoKHgpKyh5KS0xKS8oeSkpKih5KSkKKyNlbmRpZiAvKiByb3VuZHVwICovCisgICAgcmRfbGVuID0gcm91bmR1cChuZXRfbGVuLCA4KTsKKyAgICBkZWJ1ZyhGMTExLCJrcmI0X2Rlc19yZWFkIiwicmRfbGVuIixyZF9sZW4pOworICAgIGNjID0gbmV0X3JlYWQoZmQsIGRlc19pbmJ1ZiwgcmRfbGVuKTsKKyAgICBkZWJ1ZyhGMTExLCJuZXRfcmVhZCIsImNoYXJzIHJlYWQiLGNjKTsKKyAgICBpZiAoY2MgPCAwKSB7CisgICAgICAgIG5ldGNsb3MoKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9IGVsc2UgaWYgKCBjYyAhPSByZF9sZW4gKQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICBoZXhkdW1wKCJrcmI0X2Rlc19yZWFkIGRlc19pbmJ1ZiIsZGVzX2luYnVmLDgpOworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyNpZmRlZiBLUkI1MjQKKyAgICAodm9pZCkgZGVzX3BjYmNfZW5jcnlwdChkZXNfaW5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXRfbGVuIDwgOCkgPyA4IDogbmV0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgazRfc2NoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWQuc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDUllQVCk7CisjZWxzZSAvKiBLUkI1MjQgKi8KKyAgICAodm9pZCkgZGVzX3BjYmNfZW5jcnlwdCgoQmxvY2sgKilkZXNfaW5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCbG9jayAqKXN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXRfbGVuIDwgOCkgPyA4IDogbmV0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgazRfc2NoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVkLnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ1JZUFQpOworI2VuZGlmIC8qIEtSQjUyNCAqLworI2VuZGlmIC8qIEVOQ1JZUFRJT04gKi8KKyAgICBoZXhkdW1wKCJrcmI0X2Rlc19yZWFkIHN0b3JhZ2UiLHN0b3JhZ2UsOCk7CisKKyAgICAvKgorICAgICogd2hlbiB0aGUgY2xlYXJ0ZXh0IGJsb2NrIGlzIDwgOCBieXRlcywgaXQgaXMgInJpZ2h0LWp1c3RpZmllZCIKKyAgICAqIGluIHRoZSBibG9jaywgc28gd2UgbmVlZCB0byBhZGp1c3QgdGhlIHBvaW50ZXIgdG8gdGhlIGRhdGEKKyAgICAqLworICAgIGlmIChuZXRfbGVuIDwgOCkKKyAgICAgICAgc3RvcmVfcHRyID0gc3RvcmFnZSArIDggLSBuZXRfbGVuOworICAgIGVsc2UKKyAgICAgICAgc3RvcmVfcHRyID0gc3RvcmFnZTsKKyAgICBuc3RvcmVkID0gbmV0X2xlbjsKKworICAgIGlmICggIWJ1ZiApCisgICAgICAgIHJldHVybigwKTsKKworICAgIGlmIChuc3RvcmVkID4gbGVuKSB7CisgICAgICAgIG1lbWNweShidWYsIHN0b3JlX3B0ciwgbGVuKTsgICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgIG5yZXR1cm5lZCArPSBsZW47CisgICAgICAgIHN0b3JlX3B0ciArPSBsZW47CisgICAgICAgIG5zdG9yZWQgLT0gbGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShidWYsIHN0b3JlX3B0ciwgbnN0b3JlZCk7ICAgICAgICAvKiBzYWZlICovCisgICAgICAgIG5yZXR1cm5lZCArPSBuc3RvcmVkOworICAgICAgICBuc3RvcmVkID0gMDsKKyAgICB9CisKKyAgICBkZWJ1ZyhGMTExLCJuZXRfcmVhZCIsIm5yZXR1cm5lZCIsbnJldHVybmVkKTsKKyAgICByZXR1cm4obnJldHVybmVkKTsKK30KKworaW50CitrcmI0X2Rlc193cml0ZShmZCwgYnVmLCBsZW4pCitpbnQgZmQ7CitjaGFyICpidWY7CitpbnQgbGVuOworeworICAgIHN0YXRpYyBjaGFyIGdhcmJhZ2VfYnVmWzhdOworICAgIHVuc2lnbmVkIGNoYXIgKmxlbl9idWYgPSAodW5zaWduZWQgY2hhciAqKSBkZXNfb3V0cGt0OworICAgIGludCBjYzsKKworICAgIGRlYnVnKEYxMTEsImtyYjRfZGVzX3dyaXRlIiwicmxvZ19lbmNyeXB0IixybG9nX2VuY3J5cHQpOworICAgIGlmICggIXJsb2dfZW5jcnlwdCApIHsKKyAgICAgICAgY2MgPSBuZXRfd3JpdGUoZmQsIGJ1ZiwgbGVuKTsKKyAgICAgICAgZGVidWcoRjExMSwibmV0X3dyaXRlIiwiY2hhcnMgd3JpdHRlbiIsY2MpOworICAgICAgICByZXR1cm4oY2MpOworICAgIH0KKworICAgIC8qCisgICAgKiBwY2JjX2VuY3J5cHQgb3V0cHV0cyBpbiA4LWJ5dGUgKDY0IGJpdCkgaW5jcmVtZW50cworICAgICoKKyAgICAqIGl0IHplcm8tZmlsbHMgdGhlIGNsZWFydGV4dCB0byA4LWJ5dGUgcGFkZGluZywKKyAgICAqIHNvIGlmIHdlIGhhdmUgY2xlYXJ0ZXh0IG9mIDwgOCBieXRlcywgd2Ugd2FudAorICAgICogdG8gaW5zZXJ0IHJhbmRvbSBnYXJiYWdlIGJlZm9yZSBpdCBzbyB0aGF0IHRoZSBjaXBoZXJ0ZXh0CisgICAgKiBkaWZmZXJzIGZvciBlYWNoIHRyYW5zbWlzc2lvbiBvZiB0aGUgc2FtZSBjbGVhcnRleHQuCisgICAgKiBpZiBsZW4gPCA4IC0gc2l6ZW9mKGxvbmcpLCBzaXplb2YobG9uZykgYnl0ZXMgb2YgcmFuZG9tCisgICAgKiBnYXJiYWdlIHNob3VsZCBiZSBzdWZmaWNpZW50OyBsZWF2ZSB0aGUgcmVzdCBhcy1pcyBpbiB0aGUgYnVmZmVyLgorICAgICogaWYgbGVuID4gOCAtIHNpemVvZihsb25nKSwganVzdCBnYXJiYWdlIGZpbGwgdGhlIHJlc3QuCisgICAgKi8KKyAgICBpZiAobGVuIDwgOCkgeworICAgICAgICByYW5kb21fY29uZm91bmRlcig4IC0gbGVuLCBnYXJiYWdlX2J1Zik7CisgICAgICAgIC8qIHRoaXMgInJpZ2h0LWp1c3RpZmllcyIgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICAodm9pZCkgbWVtY3B5KGdhcmJhZ2VfYnVmICsgOCAtIGxlbiwgYnVmLCBsZW4pOyAvKiBzYWZlICovCisgICAgICAgIGhleGR1bXAoImtyYjRfZGVzX3dyaXRlIGdhcmJhZ2VfYnVmIixnYXJiYWdlX2J1Ziw4KTsKKyAgICB9IGVsc2UKKyAgICAgICAgaGV4ZHVtcCgia3JiNF9kZXNfd3JpdGUgYnVmIixidWYsOCk7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorI2lmZGVmIEtSQjUyNAorICAgICh2b2lkKSBkZXNfcGNiY19lbmNyeXB0KChsZW4gPCA4KSA/IGdhcmJhZ2VfYnVmIDogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNfb3V0cGt0KzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW4gPCA4KSA/IDggOiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs0X3NjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkLnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQ1JZUFQpOworI2Vsc2UgLyogS1JCNTI0ICovCisgICAgKHZvaWQpIGRlc19wY2JjX2VuY3J5cHQoKEJsb2NrICopKChsZW4gPCA4KSA/IGdhcmJhZ2VfYnVmIDogYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJsb2NrICopKGRlc19vdXRwa3QrNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW4gPCA4KSA/IDggOiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs0X3NjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlZC5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkNSWVBUKTsKKyNlbmRpZiAvKiBLUkI1MjQgKi8KKyNlbmRpZiAvKiBFTkNSWVBUSU9OICovCisgICAgaWYgKCBsZW4gPCA4ICkKKyAgICAgICAgaGV4ZHVtcCgia3JiNF9kZXNfd3JpdGUgKHBvc3QgcGNiYykgZ2FyYmFnZV9idWYiLGdhcmJhZ2VfYnVmLDgpOworICAgIGVsc2UKKyAgICAgICAgaGV4ZHVtcCgia3JiNF9kZXNfd3JpdGUgKHBvc3QgcGNiYykgYnVmIixidWYsOCk7CisgICAgaGV4ZHVtcCgia3JiNF9kZXNfd3JpdGUgKGRlc19vdXRwa3QrNCkiLChkZXNfb3V0cGt0KzQpLDgpOworCisgICAgLyogdGVsbCB0aGUgb3RoZXIgZW5kIHRoZSByZWFsIGFtb3VudCwgYnV0IHNlbmQgYW4gOC1ieXRlIHBhZGRlZAorICAgIHBhY2tldCAqLworICAgIGxlbl9idWZbMF0gPSAobGVuICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisgICAgbGVuX2J1ZlsxXSA9IChsZW4gJiAweGZmMDAwMCkgPj4gMTY7CisgICAgbGVuX2J1ZlsyXSA9IChsZW4gJiAweGZmMDApID4+IDg7CisgICAgbGVuX2J1ZlszXSA9IChsZW4gJiAweGZmKTsKKyAgICBoZXhkdW1wKCJrcmI0X2Rlc193cml0ZSBkZXNfb3V0cGt0IGxlbiIsZGVzX291dHBrdCwxMik7CisgICAgY2MgPSBuZXRfd3JpdGUoZmQsIGRlc19vdXRwa3QsIHJvdW5kdXAobGVuLDgpKzQpOworICAgIGRlYnVnKEYxMTEsIm5ldF93cml0ZSIsImNoYXJzIHdyaXR0ZW4iLGNjKTsKKyAgICByZXR1cm4obGVuKTsKK30KKyNlbmRpZiAvKiBLUkI0ICovCisjZW5kaWYgLyogUkxPR0NPREUgKi8KKworI2lmZGVmIEtSQjUyNAorI2lmbmRlZiBPUzIKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBtaXNzaW5nIGZyb20gdGhlIGNvbXBhdGliaWxpdHkgbGlicmFyeSAqLworY29uc3QgY2hhciAqCitrcmJfZ2V0X2Vycl90ZXh0X2VudHJ5KHIpIGludCByOworeworICAgIGV4dGVybiBjaGFyIGtyYl9lcnJfdGV4dFtdOworICAgIHJldHVybihrcmJfZXJyX3R4dFtyXSk7Cit9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogS1JCNTI0ICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKworI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgS1JCNV9VMlUKKy8qIEtlcmJlcm9zIDUgVXNlciB0byBVc2VyIENsaWVudCAqLworaW50CitrNV91c2VyX3RvX3VzZXJfY2xpZW50X2F1dGgoKQoreworICAgIGV4dGVybiBpbnQgdHR5ZmQ7CisgICAgcmVnaXN0ZXIgaW50IHJldHZhbCwgaTsKKyAgICBjaGFyICoqc3JlYWxtczsgICAgICAgICAgICAgLyogcmVhbG0ocykgb2Ygc2VydmVyICovCisgICAgY2hhciAqcHJpbmM7ICAgICAgICAgICAgICAgIC8qIHByaW5jaXBhbCBpbiBjcmVkZW50aWFscyBjYWNoZSAqLworICAgIGtyYjVfY2NhY2hlIGNjOworICAgIGtyYjVfY3JlZHMgY3JlZHMsICpuZXdfY3JlZHM7CisgICAga3JiNV9kYXRhIHJlcGx5LCBtc2csIG1zZ3RleHQsIHByaW5jX2RhdGE7CisgICAga3JiNV90aWNrZXQgKiB0aWNrZXQgPSBOVUxMOworCisgICAgaWYgKHJldHZhbCA9IGs1X2dldF9jY2FjaGUoazVfY29udGV4dCwmY2MsTlVMTCkpCisgICAgeworICAgICAgICBjb21fZXJyKCJ1dS1jbGllbnQiLCByZXR2YWwsICJnZXR0aW5nIGNyZWRlbnRpYWxzIGNhY2hlIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgbWVtc2V0ICgoY2hhciopJmNyZWRzLCAwLCBzaXplb2YoY3JlZHMpKTsKKyAgICBpZiAocmV0dmFsID0ga3JiNV9jY19nZXRfcHJpbmNpcGFsKGs1X2NvbnRleHQsIGNjLCAmY3JlZHMuY2xpZW50KSkKKyAgICB7CisgICAgICAgIGNvbV9lcnIoInV1LWNsaWVudCIsIHJldHZhbCwgImdldHRpbmcgcHJpbmNpcGFsIG5hbWUiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBpZiAocmV0dmFsID0ga3JiNV9nZXRfaG9zdF9yZWFsbShrNV9jb250ZXh0LCBzekhvc3ROYW1lLCAmc3JlYWxtcykpCisgICAgeworICAgICAgICBjb21fZXJyKCJ1dS1jbGllbnQiLCByZXR2YWwsICJnZXR0aW5nIHJlYWxtcyBmb3IgXCIlc1wiIiwgc3pIb3N0TmFtZSk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgaWYgKHJldHZhbCA9IGtyYjVfYnVpbGRfcHJpbmNpcGFsX2V4dChrNV9jb250ZXh0LCAmY3JlZHMuc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9wcmluY19yZWFsbShrNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZHMuY2xpZW50KS0+bGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9wcmluY19yZWFsbShrNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZHMuY2xpZW50KS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsICJrcmJ0Z3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9wcmluY19yZWFsbShrNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZHMuY2xpZW50KS0+bGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9wcmluY19yZWFsbShrNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZHMuY2xpZW50KS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgIHsKKyAgICAgICAgY29tX2VycigidXUtY2xpZW50IiwgcmV0dmFsLCAic2V0dGluZyB1cCB0Z3Qgc2VydmVyIG5hbWUiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICAvKiBHZXQgVEdUIGZyb20gY3JlZGVudGlhbHMgY2FjaGUgKi8KKyAgICBpZiAocmV0dmFsID0ga3JiNV9nZXRfY3JlZGVudGlhbHMoazVfY29udGV4dCwgS1JCNV9HQ19DQUNIRUQsIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWRzLCAmbmV3X2NyZWRzKSkKKyAgICB7CisgICAgICAgIGNvbV9lcnIoInV1LWNsaWVudCIsIHJldHZhbCwgImdldHRpbmcgVEdUIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgaWYgKHJldHZhbCA9IGtyYjVfdW5wYXJzZV9uYW1lKGs1X2NvbnRleHQsIGNyZWRzLmNsaWVudCwgJnByaW5jKSkgeworICAgICAgICBjb21fZXJyKCJ1dS1jbGllbnQiLCByZXR2YWwsICJwcmludGluZyBwcmluY2lwYWwgbmFtZSIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBpID0gc3RybGVuKHByaW5jKSArIDE7CisgICAgcHJpbmNfZGF0YS5kYXRhID0gcHJpbmM7CisgICAgcHJpbmNfZGF0YS5sZW5ndGggPSBpOyAgICAgICAgICAgICAgLyogaW5jbHVkZSBudWxsIHRlcm1pbmF0b3IgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyJ3MgY29udmVuaWVuY2UgKi8KKyAgICByZXR2YWwgPSBrcmI1X3dyaXRlX21lc3NhZ2UoazVfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtyYjVfcG9pbnRlcikgJnR0eWZkLCAmcHJpbmNfZGF0YSk7CisgICAgaWYgKHJldHZhbCkKKyAgICB7CisgICAgICAgIGNvbV9lcnIoInV1LWNsaWVudCIsIHJldHZhbCwgInNlbmRpbmcgcHJpbmNpcGFsIG5hbWUgdG8gc2VydmVyIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGtyYjVfZnJlZV91bnBhcnNlZF9uYW1lKGs1X2NvbnRleHQscHJpbmMpOworCisgICAgcmV0dmFsID0ga3JiNV93cml0ZV9tZXNzYWdlKGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrcmI1X3BvaW50ZXIpICZ0dHlmZCwgJm5ld19jcmVkcy0+dGlja2V0KTsKKyAgICBpZiAocmV0dmFsKQorICAgIHsKKyAgICAgICAgY29tX2VycigidXUtY2xpZW50IiwgcmV0dmFsLCAic2VuZGluZyB0aWNrZXQgdG8gc2VydmVyIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgcmV0dmFsID0ga3JiNV9yZWFkX21lc3NhZ2UoazVfY29udGV4dCwgKGtyYjVfcG9pbnRlcikgJnR0eWZkLCAmcmVwbHkpOworICAgIGlmIChyZXR2YWwpCisgICAgeworICAgICAgICBjb21fZXJyKCJ1dS1jbGllbnQiLCByZXR2YWwsICJyZWFkaW5nIHJlcGx5IGZyb20gc2VydmVyIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgaWYgKHJldHZhbCA9IGtyYjVfYXV0aF9jb25faW5pdChrNV9jb250ZXh0LCAmYXV0aF9jb250ZXh0KSkgeworICAgICAgICBjb21fZXJyKCJ1dS1jbGllbnQiLCByZXR2YWwsICJpbml0aWFsaXppbmcgdGhlIGF1dGhfY29udGV4dCIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIGlmICgha3JiNV9kX25vX2FkZHJlc3NlcykgeworICAgICAgaWYgKHJldHZhbCA9IGtyYjVfYXV0aF9jb25fZ2VuYWRkcnMoazVfY29udGV4dCwgYXV0aF9jb250ZXh0LCB0dHlmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtSQjVfQVVUSF9DT05URVhUX0dFTkVSQVRFX0xPQ0FMX0ZVTExfQUREUiB8CisgICAgICAgICAgICAgICAgICAgICAgICBLUkI1X0FVVEhfQ09OVEVYVF9HRU5FUkFURV9SRU1PVEVfRlVMTF9BRERSKSkgeworICAgICAgICBjb21fZXJyKCJ1dS1jbGllbnQiLCByZXR2YWwsICJnZW5lcmF0aW5nIGFkZHJzIGZvciBhdXRoX2NvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmV0dmFsID0ga3JiNV9hdXRoX2Nvbl9zZXRmbGFncyhrNV9jb250ZXh0LCBhdXRoX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1JCNV9BVVRIX0NPTlRFWFRfRE9fU0VRVUVOQ0UpKSB7CisgICAgICAgIGNvbV9lcnIoInV1LWNsaWVudCIsIHJldHZhbCwgImluaXRpYWxpemluZyB0aGUgYXV0aF9jb250ZXh0IGZsYWdzIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgaWYgKHJldHZhbCA9IGtyYjVfYXV0aF9jb25fc2V0dXNlcnVzZXJrZXkoazVfY29udGV4dCwgYXV0aF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfY3JlZHMtPmtleWJsb2NrKSkgeworICAgICAgICBjb21fZXJyKCJ1dS1jbGllbnQiLCByZXR2YWwsICJzZXR0aW5nIHVzZXJ1c2Vya2V5IGZvciBhdXRoY29udGV4dCIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIHJlYWQgdGhlIGFwX3JlcSB0byBnZXQgdGhlIHNlc3Npb24ga2V5ICovCisgICAgcmV0dmFsID0ga3JiNV9yZF9yZXEoazVfY29udGV4dCwgJmF1dGhfY29udGV4dCwgJnJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAmdGlja2V0KTsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIGNvbV9lcnIoInV1LWNsaWVudCIsIHJldHZhbCwgInJlYWRpbmcgQVBfUkVRIGZyb20gc2VydmVyIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgaWYgKGs1X3UydV9yZWFkX21zZyhrNV9jb250ZXh0LCZtc2cpIDwgMCkKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmICggc3RyY21wKCJLZXJtaXQgaW1wbGVtZW50cyBLZXJiZXJvcyA1IFVzZXIgdG8gVXNlciIsbXNnLmRhdGEpICkKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICBrcmI1X2ZyZWVfZGF0YV9jb250ZW50cyhrNV9jb250ZXh0LCZtc2cpOworCisgICAgbXNndGV4dC5kYXRhID0gIkFzIGRvIEkhIDotKSI7CisgICAgbXNndGV4dC5sZW5ndGggPSBzdHJsZW4obXNndGV4dC5kYXRhKSsxOworCisgICAgaWYgKGs1X3UydV93cml0ZV9tc2coazVfY29udGV4dCwmbXNndGV4dCkgPCAwKQorICAgICAgICByZXR1cm4oLTEpOworCisgICAgaWYgKHJldHZhbCA9IGtyYjVfdW5wYXJzZV9uYW1lKGs1X2NvbnRleHQsCisjaWZkZWYgSEVJTURBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja2V0LT5jbGllbnQsCisjZWxzZSAvKiBIRUlNREFMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrZXQtPmVuY19wYXJ0Mi0+Y2xpZW50LAorI2VuZGlmIC8qIEhFSU1EQUwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmluYykpCisgICAgICAgIGNvbV9lcnIoInV1LWNsaWVudCIsIHJldHZhbCwgIndoaWxlIHVucGFyc2luZyBjbGllbnQgbmFtZSIpOworICAgIGVsc2UgeworICAgICAgICBja3N0cm5jcHkoc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWQscHJpbmMsVUlEQlVGTEVOKTsKKyAgICAgICAgdmFsaWRVc2VyID0gQVVUSF9WQUxJRDsKKyAgICAgICAgYXV0aGVudGljYXRpb25fdmVyc2lvbiA9IEFVVEhUWVBFX0tFUkJFUk9TX1Y1OworICAgICAgICBpZiAoICFxdWlldCApCisgICAgICAgICAgICBwcmludGYoIlBlZXIgbmFtZSBpcyBcIiVzXCJcbiIsIHByaW5jKTsKKyAgICAgICAga3JiNV9mcmVlX3VucGFyc2VkX25hbWUoazVfY29udGV4dCxwcmluYyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBLZXJiZXJvcyA1IFVzZXIgdG8gVXNlciBTZXJ2ZXIgKi8KKworaW50CitrNV91c2VyX3RvX3VzZXJfc2VydmVyX2F1dGgoKQoreworICAgIGtyYjVfZGF0YSBwbmFtZV9kYXRhLCB0a3RfZGF0YTsKKyAgICBpbnQgcmV0dmFsOworICAgIGtyYjVfY3JlZHMgY3JlZHMsICpuZXdfY3JlZHM7CisgICAga3JiNV9jY2FjaGUgY2M7CisgICAga3JiNV9kYXRhIG1zZywgbXNndGV4dDsKKyAgICBleHRlcm4gaW50IHR0eWZkOworCisgICAgaWYgKHJldHZhbCA9IGtyYjVfcmVhZF9tZXNzYWdlKGs1X2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrcmI1X3BvaW50ZXIpICZ0dHlmZCwgJnBuYW1lX2RhdGEpKSB7CisgICAgICAgIGNvbV9lcnIgKCJ1dS1zZXJ2ZXIiLCByZXR2YWwsICJyZWFkaW5nIHBuYW1lIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIC8qIGNsaWVudCBzZW5kcyBpdCBhbHJlYWR5IG51bGwtdGVybWluYXRlZC4gKi8KKyAgICBpZiAoICFxdWlldCApCisgICAgICAgIHByaW50ZiAoIlBlZXIgbmFtZSBpcyBcIiVzXCIuXG4iLCBwbmFtZV9kYXRhLmRhdGEpOworICAgIGNrc3RybmNweShzelVzZXJOYW1lQXV0aGVudGljYXRlZCxwbmFtZV9kYXRhLmRhdGEsVUlEQlVGTEVOKTsKKyAgICB2YWxpZFVzZXIgPSBBVVRIX1ZBTElEOworICAgIGF1dGhlbnRpY2F0aW9uX3ZlcnNpb24gPSBBVVRIVFlQRV9LRVJCRVJPU19WNTsKKworICAgIGlmIChyZXR2YWwgPSBrcmI1X3JlYWRfbWVzc2FnZShrNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa3JiNV9wb2ludGVyKSAmdHR5ZmQsICZ0a3RfZGF0YSkpIHsKKyAgICAgICAgY29tX2VyciAoInV1LXNlcnZlciIsIHJldHZhbCwgInJlYWRpbmcgdGlja2V0IGRhdGEiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBpZiAocmV0dmFsID0gazVfZ2V0X2NjYWNoZShrNV9jb250ZXh0LCZjYyxOVUxMKSkKKyAgICB7CisgICAgICAgIGNvbV9lcnIoInV1LXNlcnZlciIsIHJldHZhbCwgImdldHRpbmcgY3JlZGVudGlhbHMgY2FjaGUiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBtZW1zZXQgKChjaGFyKikmY3JlZHMsIDAsIHNpemVvZihjcmVkcykpOworICAgIGlmIChyZXR2YWwgPSBrcmI1X2NjX2dldF9wcmluY2lwYWwoazVfY29udGV4dCwgY2MsICZjcmVkcy5jbGllbnQpKQorICAgIHsKKyAgICAgICAgY29tX2VycigidXUtc2VydmVyIiwgcmV0dmFsLCAiZ2V0dGluZyBwcmluY2lwYWwgbmFtZSIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIGlmIChyZXR2YWwgPSBrcmI1X3BhcnNlX25hbWUoazVfY29udGV4dCwgcG5hbWVfZGF0YS5kYXRhLCAmY3JlZHMuc2VydmVyKSkKKyAgICB7CisgICAgICAgIGNvbV9lcnIoInV1LXNlcnZlciIsIHJldHZhbCwgInBhcnNpbmcgY2xpZW50IG5hbWUiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgY3JlZHMuc2Vjb25kX3RpY2tldCA9IHRrdF9kYXRhOworCisgICAgaWYgKHJldHZhbCA9IGtyYjVfZ2V0X2NyZWRlbnRpYWxzKGs1X2NvbnRleHQsIEtSQjVfR0NfVVNFUl9VU0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MsICZjcmVkcywgJm5ld19jcmVkcykpCisgICAgeworICAgICAgICBjb21fZXJyKCJ1dS1zZXJ2ZXIiLCByZXR2YWwsICJnZXR0aW5nIHVzZXItdXNlciB0aWNrZXQiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICAvKiBzZW5kIGEgdGlja2V0L2F1dGhlbnRpY2F0b3IgdG8gdGhlIG90aGVyIHNpZGUsIHNvIGl0IGNhbiBnZXQgdGhlIGtleQorICAgICAgIHdlJ3JlIHVzaW5nIGZvciB0aGUga3JiX3NhZmUgYmVsb3cuICovCisKKyAgICBpZiAocmV0dmFsID0ga3JiNV9hdXRoX2Nvbl9pbml0KGs1X2NvbnRleHQsICZhdXRoX2NvbnRleHQpKSB7CisgICAgICAgIGNvbV9lcnIoInV1LXNlcnZlciIsIHJldHZhbCwgIm1ha2luZyBhdXRoX2NvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBpZiAocmV0dmFsID0ga3JiNV9hdXRoX2Nvbl9zZXRmbGFncyhrNV9jb250ZXh0LCBhdXRoX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtSQjVfQVVUSF9DT05URVhUX0RPX1NFUVVFTkNFKSkgeworICAgICAgICBjb21fZXJyKCJ1dS1zZXJ2ZXIiLCByZXR2YWwsICJpbml0aWFsaXppbmcgdGhlIGF1dGhfY29udGV4dCBmbGFncyIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIGlmICgha3JiNV9kX25vX2FkZHJlc3NlcykgeworICAgICAgaWYgKHJldHZhbCA9IGtyYjVfYXV0aF9jb25fZ2VuYWRkcnMoazVfY29udGV4dCwgYXV0aF9jb250ZXh0LCB0dHlmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1JCNV9BVVRIX0NPTlRFWFRfR0VORVJBVEVfTE9DQUxfRlVMTF9BRERSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1JCNV9BVVRIX0NPTlRFWFRfR0VORVJBVEVfUkVNT1RFX0ZVTExfQUREUikpIHsKKyAgICAgICAgY29tX2VycigidXUtc2VydmVyIiwgcmV0dmFsLCAiZ2VuZXJhdGluZyBhZGRycyBmb3IgYXV0aF9jb250ZXh0Iik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHJldHZhbCA9IGtyYjVfYXV0aF9jb25fc2V0dXNlcnVzZXJrZXkoazVfY29udGV4dCwgYXV0aF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfY3JlZHMtPmtleWJsb2NrKSkgeworICAgICAgICBjb21fZXJyKCJ1dS1zZXJ2ZXIiLCByZXR2YWwsICJzZXR0aW5nIHVzZXJ1c2Vya2V5IGZvciBhdXRoY29udGV4dCIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIGlmIChyZXR2YWwgPSBrcmI1X21rX3JlcV9leHRlbmRlZChrNV9jb250ZXh0LCAmYXV0aF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUF9PUFRTX1VTRV9TRVNTSU9OX0tFWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQX09QVFNfTVVUVUFMX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBuZXdfY3JlZHMsICZtc2cpKSB7CisgICAgICAgIGNvbV9lcnIoInV1LXNlcnZlciIsIHJldHZhbCwgIm1ha2luZyBBUF9SRVEiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgcmV0dmFsID0ga3JiNV93cml0ZV9tZXNzYWdlKGs1X2NvbnRleHQsIChrcmI1X3BvaW50ZXIpICZ0dHlmZCwgJm1zZyk7CisgICAgaWYgKHJldHZhbCkgeworICAgICAgICBjb21fZXJyKCJ1dS1zZXJ2ZXIiLCByZXR2YWwsICJ3cml0aW5nIG1lc3NhZ2UgdG8gY2xpZW50Iik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGtyYjVfZnJlZV9kYXRhX2NvbnRlbnRzKGs1X2NvbnRleHQsJm1zZyk7CisKKyAgICBtc2d0ZXh0LmRhdGEgPSAiS2VybWl0IGltcGxlbWVudHMgS2VyYmVyb3MgNSBVc2VyIHRvIFVzZXIiOworICAgIG1zZ3RleHQubGVuZ3RoID0gc3RybGVuKG1zZ3RleHQuZGF0YSkrMTsKKworICAgIGlmIChrNV91MnVfd3JpdGVfbXNnKGs1X2NvbnRleHQsJm1zZ3RleHQpIDwgMCkKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmIChrNV91MnVfcmVhZF9tc2coazVfY29udGV4dCwmbXNnKSA8IDApCisgICAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAoIHN0cmNtcCgiQXMgZG8gSSEgOi0pIixtc2cuZGF0YSkgKQorICAgICAgICByZXR1cm4oLTEpOworICAgIGtyYjVfZnJlZV9kYXRhX2NvbnRlbnRzKGs1X2NvbnRleHQsJm1zZyk7CisKKworICAgIHJldHVybigwKTsKK30KKworaW50CitrNV91MnVfcmVhZF9tc2coa3JiNV9jb250ZXh0IGNvbnRleHQsIGludCBmZCwga3JiNV9kYXRhICogbXNnKQoreworICAgIGludCByZXR2YWw7CisgICAga3JiNV9kYXRhIHJlcGx5OworCisgICAgcmV0dmFsID0ga3JiNV9yZWFkX21lc3NhZ2UoY29udGV4dCwgKGtyYjVfcG9pbnRlcikgJmZkLCAmcmVwbHkpOworICAgIGlmIChyZXR2YWwpCisgICAgeworICAgICAgICBjb21fZXJyKCJ1dS1jbGllbnQiLCByZXR2YWwsICJyZWFkaW5nIHJlcGx5Iik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgaWYgKHJldHZhbCA9IGtyYjVfcmRfcHJpdihjb250ZXh0LCBhdXRoX2NvbnRleHQsICZyZXBseSwgbXNnLCBOVUxMKSkgeworICAgICAgICBjb21fZXJyKCJ1dS1jbGllbnQiLCByZXR2YWwsICJkZWNvZGluZyByZXBseSIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorazVfdTJ1X3dyaXRlX21zZyhrcmI1X2NvbnRleHQgY29udGV4dCwgaW50IGZkLCBrcmI1X2RhdGEgKiBtc2d0ZXh0KQoreworICAgIGludCByZXR2YWw7CisgICAga3JiNV9kYXRhIG1zZzsKKworICAgIGlmIChyZXR2YWwgPSBrcmI1X21rX3ByaXYoazVfY29udGV4dCwgYXV0aF9jb250ZXh0LCBtc2d0ZXh0LCAmbXNnLCBOVUxMKSkKKyAgICB7CisgICAgICAgIGNvbV9lcnIoInV1LXNlcnZlciIsIHJldHZhbCwgImVuY29kaW5nIG1lc3NhZ2UiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICByZXR2YWwgPSBrcmI1X3dyaXRlX21lc3NhZ2UoazVfY29udGV4dCwgKGtyYjVfcG9pbnRlcikgJmZkLCAmbXNnKTsKKyAgICBrcmI1X2ZyZWVfZGF0YV9jb250ZW50cyhrNV9jb250ZXh0LCZtc2cpOworICAgIGlmIChyZXR2YWwpCisgICAgeworICAgICAgICBjb21fZXJyKCJ1dS1zZXJ2ZXIiLCByZXR2YWwsICJ3cml0aW5nIG1lc3NhZ2UiKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCitpbnQKK2tyYjVfdTJ1X2F2YWlsKGZkKQorICAgIGludCBmZDsKK3sKKyAgICByZXR1cm4obnN0b3JlZCk7Cit9CisKK2ludAora3JiNV91MnVfcmVhZChmZCwgYnVmLCBsZW4pCisgICAgIGludCBmZDsKKyAgICAgcmVnaXN0ZXIgY2hhciAqYnVmOworICAgICBpbnQgbGVuOworeworICAgIGludCBucmV0dXJuZWQgPSAwOworICAgIGtyYjVfZGF0YSBtc2c7CisKKyAgICBkZWJ1ZyhGMTExLCJrcmI1X3UydV9yZWFkIiwibGVuIixsZW4pOworCisgICAgaWYgKCAhYnVmICkKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgaWYgKG5zdG9yZWQgPj0gbGVuKSB7CisgICAgICAgIG1lbWNweShidWYsIHN0b3JlX3B0ciwgbGVuKTsgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgc3RvcmVfcHRyICs9IGxlbjsKKyAgICAgICAgbnN0b3JlZCAtPSBsZW47CisgICAgICAgIHJldHVybihsZW4pOworICAgIH0gZWxzZSBpZiAobnN0b3JlZCkgeworICAgICAgICBtZW1jcHkoYnVmLCBzdG9yZV9wdHIsIG5zdG9yZWQpOyAgICAvKiBzYWZlICovCisgICAgICAgIG5yZXR1cm5lZCArPSBuc3RvcmVkOworICAgICAgICBidWYgKz0gbnN0b3JlZDsKKyAgICAgICAgbGVuIC09IG5zdG9yZWQ7CisgICAgICAgIG5zdG9yZWQgPSAwOworICAgIH0KKworICAgIGlmIChrNV91MnVfcmVhZF9tc2coazVfY29udGV4dCwgZmQsICZtc2cpIDwgMCkKKyAgICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmICggbXNnLmxlbmd0aCA8PSBsZW4gKSB7CisgICAgICAgIG1lbWNweShidWYsIG1zZy5kYXRhLCBtc2cubGVuZ3RoKTsKKyAgICAgICAgbnJldHVybmVkICs9IG1zZy5sZW5ndGg7CisgICAgICAgIG5zdG9yZWQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShidWYsIG1zZy5kYXRhLCBsZW4pOworICAgICAgICBucmV0dXJuZWQgKz0gbGVuOworCisgICAgICAgIGlmICggbXNnLmxlbmd0aCAtIGxlbiA8IHNpemVvZihzdG9yYWdlKSApIHsKKyAgICAgICAgICAgIHN0b3JlX3B0ciA9IHN0b3JhZ2U7CisgICAgICAgICAgICBuc3RvcmVkID0gbXNnLmxlbmd0aCAtIGxlbjsKKyAgICAgICAgICAgIG1lbWNweShzdG9yYWdlLG1zZy5kYXRhK2xlbixuc3RvcmVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5zdG9yZWQgPSAwOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4obnJldHVybmVkKTsKK30KKworaW50CitrcmI1X3UydV93cml0ZShmZCwgYnVmLCBsZW4pCisgICAgIGludCBmZDsKKyAgICAgY2hhciAqYnVmOworICAgICBpbnQgbGVuOworeworICAgIGtyYjVfZGF0YSBtc2c7CisKKyAgICBtc2cubGVuZ3RoID0gbGVuOworICAgIG1zZy5kYXRhID0gYnVmOworCisgICAgaWYgKCBrNV91MnVfd3JpdGVfbXNnKGs1X2NvbnRleHQsIGZkLCAmbXNnKSA8IDAgKQorICAgICAgICByZXR1cm4oLTEpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKGxlbik7Cit9CisKKyNlbmRpZiAvKiBLUkI1X1UyVSAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKyNpZmRlZiBDS19GT1JXQVJEX1gKKy8qCisKK0NvcHlyaWdodCAoYykgMTk4OCAgWCBDb25zb3J0aXVtCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorWCBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIHRoZSBYIENvbnNvcnRpdW0gc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgWCBDb25zb3J0aXVtLgorCisqLworLyogIE1vZGlmaWVkIGZvciBzdGFuZC1hbG9uZSBjb21waWxpbmcgYnkKKyAqICBQZXRlciAnTHVuYScgUnVuZXN0aWcgPHBldGVyQHJ1bmVzdGlnLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNkZWZpbmUgVGltZV90IHRpbWVfdAorCit2b2lkCitYYXVEaXNwb3NlQXV0aCAoYXV0aCkKK1hhdXRoICAgKmF1dGg7Cit7CisgICAgaWYgKGF1dGgpIHsKKyAgICAgICAgaWYgKGF1dGgtPmFkZHJlc3MpICh2b2lkKSBmcmVlIChhdXRoLT5hZGRyZXNzKTsKKyAgICAgICAgaWYgKGF1dGgtPm51bWJlcikgKHZvaWQpIGZyZWUgKGF1dGgtPm51bWJlcik7CisgICAgICAgIGlmIChhdXRoLT5uYW1lKSAodm9pZCkgZnJlZSAoYXV0aC0+bmFtZSk7CisgICAgICAgIGlmIChhdXRoLT5kYXRhKSB7CisgICAgICAgICAgICAodm9pZCkgYnplcm8gKGF1dGgtPmRhdGEsIGF1dGgtPmRhdGFfbGVuZ3RoKTsKKyAgICAgICAgICAgICh2b2lkKSBmcmVlIChhdXRoLT5kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBmcmVlICgoY2hhciAqKSBhdXRoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitjaGFyICoKK1hhdUZpbGVOYW1lICgpCit7CisgICAgY2hhciAqc2xhc2hEb3RYYXV0aG9yaXR5ID0gIi8uWGF1dGhvcml0eSI7CisgICAgY2hhciAgICAqbmFtZTsKKyAgICBzdGF0aWMgY2hhciAqYnVmPU5VTEw7CisgICAgc3RhdGljIGludCAgYnNpemU9MDsKKyAgICBpbnQgICAgIHNpemUsIG5hbWVsZW47CisgICAgZXh0ZXJuIGNoYXIgKiB0bl9md2R4X3hhdXRob3JpdHk7CisKKyAgICBpZiAoIHRuX2Z3ZHhfeGF1dGhvcml0eSApCisgICAgICAgIHJldHVybih0bl9md2R4X3hhdXRob3JpdHkpOworCisgICAgaWYgKG5hbWUgPSBnZXRlbnYgKCJYQVVUSE9SSVRZIikpCisgICAgICAgIHJldHVybihuYW1lKTsKKyAgICBuYW1lID0gemhvbWUoKTsKKyAgICBpZiAoICFuYW1lICkKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIG5hbWVsZW4gPSBzdHJsZW4gKG5hbWUpOworICAgIHNpemUgPSBuYW1lbGVuICsgc3RybGVuKHNsYXNoRG90WGF1dGhvcml0eSkgKyAxOworICAgIGlmIChzaXplID4gYnNpemUpIHsKKyAgICAgICAgaWYgKGJ1ZikKKyAgICAgICAgICAgIGZyZWUgKGJ1Zik7CisgICAgICAgIGJ1ZiA9IG1hbGxvYyAoKHVuc2lnbmVkKSBzaXplKTsKKyAgICAgICAgaWYgKCFidWYpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYnNpemUgPSBzaXplOworICAgIH0KKyAgICBja3N0cm5jcHkgKGJ1ZiwgbmFtZSwgYnNpemUpOworICAgIGlmICggbmFtZVtuYW1lbGVuLTFdICE9ICcvJworI2lmZGVmIE9TMgorICAgICAgICAgJiYgbmFtZVtuYW1lbGVuLTFdICE9ICdcXCcKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICkKKyAgICAgICAgY2tzdHJuY2F0IChidWYsIHNsYXNoRG90WGF1dGhvcml0eSwgYnNpemUpOworICAgIGVsc2UKKyAgICAgICAgY2tzdHJuY2F0IChidWYsICZzbGFzaERvdFhhdXRob3JpdHlbMV0sIGJzaXplKTsKKyAgICByZXR1cm4oYnVmKTsKK30KKworc3RhdGljIGludAorYmluYXJ5RXF1YWwgKGEsIGIsIGxlbikKK3JlZ2lzdGVyIGNoYXIgICAqYSwgKmI7CityZWdpc3RlciBpbnQgICAgbGVuOworeworICAgIHdoaWxlIChsZW4tLSkKKyAgICAgICAgaWYgKCphKysgIT0gKmIrKykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCisjaWZuZGVmIFJfT0sKKyNkZWZpbmUgUl9PSyAwNAorI2VuZGlmIC8qIFJfT0sgKi8KKworWGF1dGggKgorWGF1R2V0QXV0aEJ5QWRkciAoZmFtaWx5LCBhZGRyZXNzX2xlbmd0aCwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX2xlbmd0aCwgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbmd0aCwgbmFtZSkKK3Vuc2lnbmVkIGludCAgICBmYW1pbHk7Cit1bnNpZ25lZCBpbnQgICAgYWRkcmVzc19sZW5ndGg7Citjb25zdCBjaGFyICAgICAgKmFkZHJlc3M7Cit1bnNpZ25lZCBpbnQgICAgbnVtYmVyX2xlbmd0aDsKK2NvbnN0IGNoYXIgICAgICAqbnVtYmVyOwordW5zaWduZWQgaW50ICAgIG5hbWVfbGVuZ3RoOworY29uc3QgY2hhciAgICAgICpuYW1lOworeworICAgIEZJTEUgICAgKmF1dGhfZmlsZTsKKyAgICBjaGFyICAgICphdXRoX25hbWU7CisgICAgWGF1dGggICAqZW50cnk7CisKKyAgICBhdXRoX25hbWUgPSBYYXVGaWxlTmFtZSgpOworICAgIGlmICghYXV0aF9uYW1lKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYWNjZXNzIChhdXRoX25hbWUsIFJfT0spICE9IDApICAgICAgICAgIC8qIGNoZWNrcyBSRUFMIGlkICovCisgICAgICAgIHJldHVybiAwOworICAgIGF1dGhfZmlsZSA9IGZvcGVuIChhdXRoX25hbWUsICJyYiIpOworICAgIGlmICghYXV0aF9maWxlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGVudHJ5ID0gWGF1UmVhZEF1dGggKGF1dGhfZmlsZSk7CisgICAgICAgIGlmICghZW50cnkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyoKKyAgICAgICAgICogTWF0Y2ggd2hlbjoKKyAgICAgICAgICogICBlaXRoZXIgZmFtaWx5IG9yIGVudHJ5LT5mYW1pbHkgYXJlIEZhbWlseVdpbGQgb3IKKyAgICAgICAgICogICAgZmFtaWx5IGFuZCBlbnRyeS0+ZmFtaWx5IGFyZSB0aGUgc2FtZQorICAgICAgICAgKiAgYW5kCisgICAgICAgICAqICAgZWl0aGVyIGFkZHJlc3Mgb3IgZW50cnktPmFkZHJlc3MgYXJlIGVtcHR5IG9yCisgICAgICAgICAqICAgIGFkZHJlc3MgYW5kIGVudHJ5LT5hZGRyZXNzIGFyZSB0aGUgc2FtZQorICAgICAgICAgKiAgYW5kCisgICAgICAgICAqICAgZWl0aGVyIG51bWJlciBvciBlbnRyeS0+bnVtYmVyIGFyZSBlbXB0eSBvcgorICAgICAgICAgKiAgICBudW1iZXIgYW5kIGVudHJ5LT5udW1iZXIgYXJlIHRoZSBzYW1lCisgICAgICAgICAqICBhbmQKKyAgICAgICAgICogICBlaXRoZXIgbmFtZSBvciBlbnRyeS0+bmFtZSBhcmUgZW1wdHkgb3IKKyAgICAgICAgICogICAgbmFtZSBhbmQgZW50cnktPm5hbWUgYXJlIHRoZSBzYW1lCisgICAgICAgICAqLworCisvKiAgICAgIGlmICgoZmFtaWx5ID09IEZhbWlseVdpbGQgfHwgZW50cnktPmZhbWlseSA9PSBGYW1pbHlXaWxkIHx8CisgICAgICAgICAgICAgKGVudHJ5LT5mYW1pbHkgPT0gZmFtaWx5ICYmCisgICAgICAgICAgICAgIGFkZHJlc3NfbGVuZ3RoID09IGVudHJ5LT5hZGRyZXNzX2xlbmd0aCAmJgorICAgICAgICAgICAgICBiaW5hcnlFcXVhbCAoZW50cnktPmFkZHJlc3MsIGFkZHJlc3MsIChpbnQpYWRkcmVzc19sZW5ndGgpKSkgJiYKKyAgICAgICAgICAgIChudW1iZXJfbGVuZ3RoID09IDAgfHwgZW50cnktPm51bWJlcl9sZW5ndGggPT0gMCB8fAorICAgICAgICAgICAgIChudW1iZXJfbGVuZ3RoID09IGVudHJ5LT5udW1iZXJfbGVuZ3RoICYmCisgICAgICAgICAgICAgIGJpbmFyeUVxdWFsIChlbnRyeS0+bnVtYmVyLCBudW1iZXIsIChpbnQpbnVtYmVyX2xlbmd0aCkpKSAmJgorICAgICAgICAgICAgKG5hbWVfbGVuZ3RoID09IDAgfHwgZW50cnktPm5hbWVfbGVuZ3RoID09IDAgfHwKKyAgICAgICAgICAgICAoZW50cnktPm5hbWVfbGVuZ3RoID09IG5hbWVfbGVuZ3RoICYmCisgICAgICAgICAgICAgIGJpbmFyeUVxdWFsIChlbnRyeS0+bmFtZSwgbmFtZSwgKGludCluYW1lX2xlbmd0aCkpKSkgKi8KKyAgICAgICAgLyogdGhlIG9yaWdpbmFsIG1hdGNoaW5nIGNvZGUgYWJvdmUgZG9lc24ndCBzZWVtIHRvIG1lZXQgdGhlIG1hdGNoaW5nCisgICAgICAgICAqIGFsZ29yaXRobSwgaXQgZG9lc24ndCBjaGVjayBpZiAiYWRkcmVzc19sZW5ndGggPT0gMCB8fAorICAgICAgICAgKiBlbnRyeS0+YWRkcmVzc19sZW5ndGggPT0gMCIuIC8gTHVuYSAyMDAwLTAyLTA5CisgICAgICAgICAqLworICAgICAgICBpZiAoKGZhbWlseSA9PSBGYW1pbHlXaWxkIHx8IGVudHJ5LT5mYW1pbHkgPT0gRmFtaWx5V2lsZCB8fAorICAgICAgICAgICAgICBlbnRyeS0+ZmFtaWx5ID09IGZhbWlseSkgJiYKKyAgICAgICAgICAgIChhZGRyZXNzX2xlbmd0aCA9PSAwIHx8IGVudHJ5LT5hZGRyZXNzX2xlbmd0aCA9PSAwIHx8CisgICAgICAgICAgICAgIChhZGRyZXNzX2xlbmd0aCA9PSBlbnRyeS0+YWRkcmVzc19sZW5ndGggJiYKKyAgICAgICAgICAgICAgYmluYXJ5RXF1YWwgKGVudHJ5LT5hZGRyZXNzLCBhZGRyZXNzLCAoaW50KWFkZHJlc3NfbGVuZ3RoKSkpICYmCisgICAgICAgICAgICAobnVtYmVyX2xlbmd0aCA9PSAwIHx8IGVudHJ5LT5udW1iZXJfbGVuZ3RoID09IDAgfHwKKyAgICAgICAgICAgICAobnVtYmVyX2xlbmd0aCA9PSBlbnRyeS0+bnVtYmVyX2xlbmd0aCAmJgorICAgICAgICAgICAgICBiaW5hcnlFcXVhbCAoZW50cnktPm51bWJlciwgbnVtYmVyLCAoaW50KW51bWJlcl9sZW5ndGgpKSkgJiYKKyAgICAgICAgICAgIChuYW1lX2xlbmd0aCA9PSAwIHx8IGVudHJ5LT5uYW1lX2xlbmd0aCA9PSAwIHx8CisgICAgICAgICAgICAgKGVudHJ5LT5uYW1lX2xlbmd0aCA9PSBuYW1lX2xlbmd0aCAmJgorICAgICAgICAgICAgICBiaW5hcnlFcXVhbCAoZW50cnktPm5hbWUsIG5hbWUsIChpbnQpbmFtZV9sZW5ndGgpKSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgWGF1RGlzcG9zZUF1dGggKGVudHJ5KTsKKyAgICB9CisgICAgKHZvaWQpIGZjbG9zZSAoYXV0aF9maWxlKTsKKyAgICByZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyBpbnQKK3JlYWRfc2hvcnQgKHNob3J0cCwgZmlsZSkKK3Vuc2lnbmVkIHNob3J0ICAqc2hvcnRwOworRklMRSAgICAgICAgICAgICpmaWxlOworeworICAgIHVuc2lnbmVkIGNoYXIgICBmaWxlX3Nob3J0WzJdOworCisgICAgaWYgKGZyZWFkICgoY2hhciAqKSBmaWxlX3Nob3J0LCAoaW50KSBzaXplb2YgKGZpbGVfc2hvcnQpLCAxLCBmaWxlKSAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICAqc2hvcnRwID0gZmlsZV9zaG9ydFswXSAqIDI1NiArIGZpbGVfc2hvcnRbMV07CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3JlYWRfY291bnRlZF9zdHJpbmcgKGNvdW50cCwgc3RyaW5ncCwgZmlsZSkKK3Vuc2lnbmVkIHNob3J0ICAqY291bnRwOworY2hhciAgICAqKnN0cmluZ3A7CitGSUxFICAgICpmaWxlOworeworICAgIHVuc2lnbmVkIHNob3J0ICBsZW47CisgICAgY2hhciAgICAgICAgICAgICpkYXRhOworCisgICAgaWYgKHJlYWRfc2hvcnQgKCZsZW4sIGZpbGUpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICBkYXRhID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhID0gbWFsbG9jICgodW5zaWduZWQpIGxlbik7CisgICAgICAgIGlmICghZGF0YSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoZnJlYWQgKGRhdGEsIChpbnQpIHNpemVvZiAoY2hhciksIChpbnQpIGxlbiwgZmlsZSkgIT0gbGVuKSB7CisgICAgICAgICAgICBiemVybyAoZGF0YSwgbGVuKTsKKyAgICAgICAgICAgIGZyZWUgKGRhdGEpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgKnN0cmluZ3AgPSBkYXRhOworICAgICpjb3VudHAgPSBsZW47CisgICAgcmV0dXJuIDE7Cit9CisKK1hhdXRoICoKK1hhdVJlYWRBdXRoIChhdXRoX2ZpbGUpCitGSUxFICAgICphdXRoX2ZpbGU7Cit7CisgICAgWGF1dGggICBsb2NhbDsKKyAgICBYYXV0aCAgICpyZXQ7CisKKyAgICBpZiAocmVhZF9zaG9ydCAoJmxvY2FsLmZhbWlseSwgYXV0aF9maWxlKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocmVhZF9jb3VudGVkX3N0cmluZyAoJmxvY2FsLmFkZHJlc3NfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9jYWwuYWRkcmVzcywgYXV0aF9maWxlKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocmVhZF9jb3VudGVkX3N0cmluZyAoJmxvY2FsLm51bWJlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2NhbC5udW1iZXIsIGF1dGhfZmlsZSkgPT0gMCkgeworICAgICAgICBpZiAobG9jYWwuYWRkcmVzcykgZnJlZSAobG9jYWwuYWRkcmVzcyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAocmVhZF9jb3VudGVkX3N0cmluZyAoJmxvY2FsLm5hbWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9jYWwubmFtZSwgYXV0aF9maWxlKSA9PSAwKSB7CisgICAgICAgIGlmIChsb2NhbC5hZGRyZXNzKSBmcmVlIChsb2NhbC5hZGRyZXNzKTsKKyAgICAgICAgaWYgKGxvY2FsLm51bWJlcikgZnJlZSAobG9jYWwubnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChyZWFkX2NvdW50ZWRfc3RyaW5nICgmbG9jYWwuZGF0YV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2NhbC5kYXRhLCBhdXRoX2ZpbGUpID09IDApIHsKKyAgICAgICAgaWYgKGxvY2FsLmFkZHJlc3MpIGZyZWUgKGxvY2FsLmFkZHJlc3MpOworICAgICAgICBpZiAobG9jYWwubnVtYmVyKSBmcmVlIChsb2NhbC5udW1iZXIpOworICAgICAgICBpZiAobG9jYWwubmFtZSkgZnJlZSAobG9jYWwubmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXQgPSAoWGF1dGggKikgbWFsbG9jIChzaXplb2YgKFhhdXRoKSk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgaWYgKGxvY2FsLmFkZHJlc3MpIGZyZWUgKGxvY2FsLmFkZHJlc3MpOworICAgICAgICBpZiAobG9jYWwubnVtYmVyKSBmcmVlIChsb2NhbC5udW1iZXIpOworICAgICAgICBpZiAobG9jYWwubmFtZSkgZnJlZSAobG9jYWwubmFtZSk7CisgICAgICAgIGlmIChsb2NhbC5kYXRhKSB7CisgICAgICAgICAgICBiemVybyAobG9jYWwuZGF0YSwgbG9jYWwuZGF0YV9sZW5ndGgpOworICAgICAgICAgICAgZnJlZSAobG9jYWwuZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpyZXQgPSBsb2NhbDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Cit3cml0ZV9zaG9ydCAocywgZmlsZSkKK3Vuc2lnbmVkIHNob3J0ICBzOworRklMRSAgICAgICAgICAgICpmaWxlOworeworICAgIHVuc2lnbmVkIGNoYXIgICBmaWxlX3Nob3J0WzJdOworCisgICAgZmlsZV9zaG9ydFswXSA9IChzICYgKHVuc2lnbmVkKTB4ZmYwMCkgPj4gODsKKyAgICBmaWxlX3Nob3J0WzFdID0gcyAmIDB4ZmY7CisgICAgaWYgKGZ3cml0ZSAoKGNoYXIgKikgZmlsZV9zaG9ydCwgKGludCkgc2l6ZW9mIChmaWxlX3Nob3J0KSwgMSwgZmlsZSkgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3dyaXRlX2NvdW50ZWRfc3RyaW5nIChjb3VudCwgc3RyaW5nLCBmaWxlKQordW5zaWduZWQgc2hvcnQgIGNvdW50OworY2hhciAgICAqc3RyaW5nOworRklMRSAgICAqZmlsZTsKK3sKKyAgICBpZiAod3JpdGVfc2hvcnQgKGNvdW50LCBmaWxlKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoZndyaXRlIChzdHJpbmcsIChpbnQpIHNpemVvZiAoY2hhciksIChpbnQpIGNvdW50LCBmaWxlKSAhPSBjb3VudCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludAorWGF1V3JpdGVBdXRoIChhdXRoX2ZpbGUsIGF1dGgpCitGSUxFICAgICphdXRoX2ZpbGU7CitYYXV0aCAgICphdXRoOworeworICAgIGlmICh3cml0ZV9zaG9ydCAoYXV0aC0+ZmFtaWx5LCBhdXRoX2ZpbGUpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICh3cml0ZV9jb3VudGVkX3N0cmluZyAoYXV0aC0+YWRkcmVzc19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5hZGRyZXNzLCBhdXRoX2ZpbGUpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICh3cml0ZV9jb3VudGVkX3N0cmluZyAoYXV0aC0+bnVtYmVyX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPm51bWJlciwgYXV0aF9maWxlKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAod3JpdGVfY291bnRlZF9zdHJpbmcgKGF1dGgtPm5hbWVfbGVuZ3RoLCBhdXRoLT5uYW1lLCBhdXRoX2ZpbGUpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICh3cml0ZV9jb3VudGVkX3N0cmluZyAoYXV0aC0+ZGF0YV9sZW5ndGgsIGF1dGgtPmRhdGEsIGF1dGhfZmlsZSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBLUkI1CisjaWZkZWYgSzVfWEFVVEgKKy8qCisgKiBmdW5jdGlvbnMgdG8gZW5jb2RlL2RlY29kZSBLZXJiZXJvcyBWNSBwcmluY2lwYWxzCisgKiBpbnRvIHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZWFzb25hYmxlIHNwZXdlZCBvdmVyCisgKiB0aGUgd2lyZQorICoKKyAqIEF1dGhvcjogVG9tIFl1IDx0bHl1QE1JVC5FRFU+CisgKgorICogU3RpbGwgbmVlZHMgdG8gYmUgZml4ZWQgdXAgd3J0IHNpZ25lZC91bnNpZ25lZCBsZW5ndGhzLCBidXQgd2UnbGwgd29ycnkKKyAqIGFib3V0IHRoYXQgbGF0ZXIuCisgKi8KKworLyoKKyAqIFhhdUtyYjVFbmNvZGUKKyAqCisgKiB0aGlzIGZ1bmN0aW9uIGVuY29kZXMgdGhlIHByaW5jaXBhbCBwYXNzZWQgdG8gaXQgaW4gYSBmb3JtYXQgdGhhdCBjYW4KKyAqIGVhc2lseSBiZSBkZWFsdCB3aXRoIGJ5IHN0dWZmaW5nIGl0IGludG8gYW4gWCBwYWNrZXQuICBFbmNvZGluZyBpcyBhcworICogZm9sbG93czoKKyAqICAgbGVuZ3RoIGNvdW50IG9mIHRoZSByZWFsbSBuYW1lCisgKiAgIHJlYWxtCisgKiAgIGNvbXBvbmVudCBjb3VudAorICogICBsZW5ndGggb2YgY29tcG9uZW50CisgKiAgIGFjdHVhbCBwcmluY2lwYWwgY29tcG9uZW50CisgKiAgIGV0Yy4uLi4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBodW5rIG9mIG1lbW9yeSwgd2hpY2ggbXVzdCBiZQorICogZnJlZWQgdG8gYXZvaWQgbmFzdHkgbWVtb3J5IGxlYWsgdHlwZSB0aGluZ3MuICBBbGwgY291bnRzIGFyZQorICogYnl0ZS1zd2FwcGVkIGlmIG5lZWRlZC4gKGV4Y2VwdCBmb3IgdGhlIHRvdGFsIGxlbmd0aCByZXR1cm5lZCkKKyAqCisgKiBuZXZlcm1pbmQuLi4uIHN0dWZmaW5nIHRoZSBlbmNvZGVkIHBhY2tldCBpbiBuZXQgYnl0ZSBvcmRlciBqdXN0IHRvCisgKiBhbHdheXMgZG8gdGhlIHJpZ2h0IHRoaW5nLiAgRG9uJ3QgaGF2ZSB0byBmcm9iIHdpdGggYWxpZ25tZW50IHRoYXQgd2F5LgorICovCitpbnQKK1hhdUtyYjVFbmNvZGUocHJpbmMsIG91dGJ1ZikKKyAgICBrcmI1X3ByaW5jaXBhbCBwcmluYzsgICAgICAgLyogcHJpbmNpcGFsIHRvIGVuY29kZSAqLworICAgIGtyYjVfZGF0YSAqb3V0YnVmOyAgICAgICAgICAvKiBvdXRwdXQgYnVmZmVyICovCit7CisgICAgQ0FSRDE2IGksIG51bXBhcnRzLCB0b3RsZW4gPSAwLCBwbGVuLCBybGVuOworICAgIGNoYXIgKmNwLCAqcGRhdGE7CisKKyAgICBybGVuID0ga3JiNV9wcmluY19yZWFsbShwcmluYyktPmxlbmd0aDsKKyAgICBudW1wYXJ0cyA9IGtyYjVfcHJpbmNfc2l6ZShwcmluYyk7CisgICAgdG90bGVuID0gMiArIHJsZW4gKyAyOyAgICAgIC8qIGluY2x1ZGUgcm9vbSBmb3IgcmVhbG0gbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBjb21wb25lbnQgY291bnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtcGFydHM7IGkrKykKKyAgICAgICAgdG90bGVuICs9IGtyYjVfcHJpbmNfY29tcG9uZW50KHByaW5jLCBpKS0+bGVuZ3RoICsgMjsKKyAgICAvKiBhZGQgMiBieXRlcyBlYWNoIHRpbWUgZm9yIGxlbmd0aCAqLworICAgIGlmICgob3V0YnVmLT5kYXRhID0gKGNoYXIgKiltYWxsb2ModG90bGVuKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGNwID0gb3V0YnVmLT5kYXRhOworICAgICpjcCsrID0gKGNoYXIpKChpbnQpKDB4ZmYwMCAmIHJsZW4pID4+IDgpOworICAgICpjcCsrID0gKGNoYXIpKDB4MDBmZiAmIHJsZW4pOworICAgIG1lbWNweShjcCwga3JiNV9wcmluY19yZWFsbShwcmluYyktPmRhdGEsIHJsZW4pOyAgICAvKiBzYWZlICovCisgICAgY3AgKz0gcmxlbjsKKyAgICAqY3ArKyA9IChjaGFyKSgoaW50KSgweGZmMDAgJiBudW1wYXJ0cykgPj4gOCk7CisgICAgKmNwKysgPSAoY2hhcikoMHgwMGZmICYgbnVtcGFydHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1wYXJ0czsgaSsrKQorICAgIHsKKyAgICAgICAgcGxlbiA9IGtyYjVfcHJpbmNfY29tcG9uZW50KHByaW5jLCBpKS0+bGVuZ3RoOworICAgICAgICBwZGF0YSA9IGtyYjVfcHJpbmNfY29tcG9uZW50KHByaW5jLCBpKS0+ZGF0YTsKKyAgICAgICAgKmNwKysgPSAoY2hhcikoKGludCkoMHhmZjAwICYgcGxlbikgPj4gOCk7CisgICAgICAgICpjcCsrID0gKGNoYXIpKDB4MDBmZiAmIHBsZW4pOworICAgICAgICBtZW1jcHkoY3AsIHBkYXRhLCBwbGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgIGNwICs9IHBsZW47CisgICAgfQorICAgIG91dGJ1Zi0+bGVuZ3RoID0gdG90bGVuOworICAgIHJldHVybiAwOworfQorCisvKgorICogWGF1S3JiNURlY29kZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZXNzZW50aWFsbHkgcmV2ZXJzZXMgd2hhdCBYYXVLcmI1RW5jb2RlIGRvZXMuCisgKiByZXR1cm4gdmFsdWU6IDAgaWYgb2theSwgLTEgaWYgbWFsbG9jIGZhaWxzLCAtMiBpZiBpbmJ1ZiBmb3JtYXQgYmFkCisgKi8KK2ludAorWGF1S3JiNURlY29kZShpbmJ1ZiwgcHJpbmMpCisgICAga3JiNV9kYXRhIGluYnVmOworICAgIGtyYjVfcHJpbmNpcGFsICpwcmluYzsKK3sKKyAgICBDQVJEMTYgaSwgbnVtcGFydHMsIHBsZW4sIHJsZW47CisgICAgQ0FSRDggKmNwLCAqcGRhdGE7CisKKyAgICBpZiAoaW5idWYubGVuZ3RoIDwgNCkKKyAgICB7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisgICAgKnByaW5jID0gKGtyYjVfcHJpbmNpcGFsKW1hbGxvYyhzaXplb2YgKGtyYjVfcHJpbmNpcGFsX2RhdGEpKTsKKyAgICBpZiAoKnByaW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBiemVybygqcHJpbmMsIHNpemVvZiAoa3JiNV9wcmluY2lwYWxfZGF0YSkpOworICAgIGNwID0gKENBUkQ4ICopaW5idWYuZGF0YTsKKyAgICBybGVuID0gKmNwKysgPDwgODsKKyAgICBybGVuIHw9ICpjcCsrOworICAgIGlmIChpbmJ1Zi5sZW5ndGggPCA0ICsgKGludClybGVuICsgMikKKyAgICB7CisgICAgICAgIGtyYjVfZnJlZV9wcmluY2lwYWwoKnByaW5jKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKyAgICBrcmI1X3ByaW5jX3JlYWxtKCpwcmluYyktPmRhdGEgPSAoY2hhciAqKW1hbGxvYyhybGVuKTsKKyAgICBpZiAoa3JiNV9wcmluY19yZWFsbSgqcHJpbmMpLT5kYXRhID09IE5VTEwpCisgICAgeworICAgICAgICBrcmI1X2ZyZWVfcHJpbmNpcGFsKCpwcmluYyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAga3JiNV9wcmluY19yZWFsbSgqcHJpbmMpLT5sZW5ndGggPSBybGVuOworICAgIG1lbWNweShrcmI1X3ByaW5jX3JlYWxtKCpwcmluYyktPmRhdGEsIGNwLCBybGVuKTsgICAvKiBzYWZlICovCisgICAgY3AgKz0gcmxlbjsKKyAgICBudW1wYXJ0cyA9ICpjcCsrIDw8IDg7CisgICAgbnVtcGFydHMgfD0gKmNwKys7CisgICAga3JiNV9wcmluY19uYW1lKCpwcmluYykgPQorICAgICAgICAoa3JiNV9kYXRhICopbWFsbG9jKG51bXBhcnRzICogc2l6ZW9mIChrcmI1X2RhdGEpKTsKKyAgICBpZiAoa3JiNV9wcmluY19uYW1lKCpwcmluYykgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtyYjVfZnJlZV9wcmluY2lwYWwoKnByaW5jKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBrcmI1X3ByaW5jX3NpemUoKnByaW5jKSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG51bXBhcnRzOyBpKyspCisgICAgeworICAgICAgICBpZiAoY3AgKyAyID4gKENBUkQ4ICopaW5idWYuZGF0YSArIGluYnVmLmxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAga3JiNV9mcmVlX3ByaW5jaXBhbCgqcHJpbmMpOworICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICB9CisgICAgICAgIHBsZW4gPSAqY3ArKyA8PCA4OworICAgICAgICBwbGVuIHw9ICpjcCsrOworICAgICAgICBpZiAoY3AgKyBwbGVuID4gKENBUkQ4ICopaW5idWYuZGF0YSArIGluYnVmLmxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAga3JiNV9mcmVlX3ByaW5jaXBhbCgqcHJpbmMpOworICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICB9CisgICAgICAgIHBkYXRhID0gKENBUkQ4ICopbWFsbG9jKHBsZW4pOworICAgICAgICBpZiAocGRhdGEgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAga3JiNV9mcmVlX3ByaW5jaXBhbCgqcHJpbmMpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGtyYjVfcHJpbmNfY29tcG9uZW50KCpwcmluYywgaSktPmRhdGEgPSAoY2hhciAqKXBkYXRhOworICAgICAgICBrcmI1X3ByaW5jX2NvbXBvbmVudCgqcHJpbmMsIGkpLT5sZW5ndGggPSBwbGVuOworICAgICAgICBtZW1jcHkocGRhdGEsIGNwLCBwbGVuKTsgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgY3AgKz0gcGxlbjsKKyAgICAgICAga3JiNV9wcmluY19zaXplKCpwcmluYykrKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogSzVfWEFVVEggKi8KKyNlbmRpZiAvKiBLUkI1ICovCisjZW5kaWYgLyogQ0tfRk9SV0FSRF9YICovCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKworLyogQyBLIF8gQSBVIFQgSCBfIEkgTiBJIFQKKyAqIEluaXRpYWxpemUgdGhlIEtlcmJlcm9zIHN5c3RlbSBmb3IgYSBwZW5kaW5nIGNvbm5lY3Rpb24KKyAqICAgaG9zdG5hbWUgLSBhIHJldmVyc2UgRE5TIGxvb2t1cCBvZiB0aGUgaG9zdG5hbWUgd2hlbiBwb3NzaWJsZQorICogICBpcGFkZHIgICAtIHRoZSBpcCBhZGRyZXNzIG9mIHRoZSBob3N0CisgKiAgIHVzZXJuYW1lIC0gdGhlIG5hbWUgdGhlIHVzZXIgd2FudHMgdG8gY29ubmVjdCB1bmRlciBub3QgbmVjZXNzYXJpbHkKKyAqICAgICAgICAgICAgICB0aGUgc2FtZSBhcyBwcmluY2lwYWwKKyAqICAgc29ja2V0ICAgLSB0aGUgc29ja2V0IGhhbmRsZSAodHR5ZmQgaW4gS2VybWl0IHNwZWFrKQorICoKKyAqIFJldHVybnM6IDEgb24gc3VjY2VzcyBhbmQgMCBvbiBmYWlsdXJlCisgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2NrX2F1dGhfaW5pdCggY2hhciAqIGhvc3RuYW1lLCBjaGFyICogaXBhZGRyLCBjaGFyICogdXNlcm5hbWUsIGludCBzb2NrZXQgKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2NrX2F1dGhfaW5pdCggaG9zdG5hbWUsIGlwYWRkciwgdXNlcm5hbWUsIHNvY2tldCApCisgICAgY2hhciAqIGhvc3RuYW1lOyBjaGFyICogaXBhZGRyOyBjaGFyICp1c2VybmFtZTsgaW50IHNvY2tldDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisjaWZkZWYgT1MyCisgICAgaWYgKCAhY2tfc2VjdXJpdHlfbG9hZGRsbCgpICkgeworICAgICAgICBURUxPUFRfTUVfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID0gVE5fTkdfUkY7CisgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9IFROX05HX1JGOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FJVE9OICovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIGlmICggISFja19jcnlwdF9pc19pbnN0YWxsZWQoKSApIHsKKyAgICAgICAgVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKworICAgIGlmICghaG9zdG5hbWUpIGhvc3RuYW1lID0gIiI7CisgICAgaWYgKCFpcGFkZHIpIGlwYWRkciA9ICIiOworICAgIGlmICghdXNlcm5hbWUpIHVzZXJuYW1lID0gIiI7CisKKyAgICBkZWJ1ZyhGMTEwLCJja19hdXRoX2luaXQgVXNlcm5hbWUiLHVzZXJuYW1lLDApOworICAgIGRlYnVnKEYxMTAsImNrX2F1dGhfaW5pdCBIb3N0bmFtZSIsaG9zdG5hbWUsMCk7CisgICAgZGVidWcoRjExMCwiY2tfYXV0aF9pbml0IElwYWRkciIsaXBhZGRyLDApOworCisgICAgY2tzdHJuY3B5KCBzelVzZXJOYW1lLCB1c2VybmFtZSwgVUlEQlVGTEVOICk7CisgICAgY2tzdHJuY3B5KCBzekhvc3ROYW1lLCBob3N0bmFtZSwgVUlEQlVGTEVOICk7CisgICAgY2tzdHJuY3B5KCBzeklQLCBpcGFkZHIsIDE2ICk7CisgICAgc3pVc2VyTmFtZVJlcXVlc3RlZFswXSA9ICdcMCc7CisgICAgc3pVc2VyTmFtZUF1dGhlbnRpY2F0ZWRbMF0gPSAnXDAnOworICAgIHZhbGlkVXNlciA9IEFVVEhfUkVKRUNUOworICAgIGFjY2VwdF9jb21wbGV0ZSA9IDA7CisgICAgYXV0aGVudGljYXRpb25fdmVyc2lvbiA9IEFVVEhUWVBFX05VTEw7CisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgIGF1dGhfaG93ID0gMDsKKyAgICBhdXRoX2NyeXB0ID0gMDsKKyAgICBhdXRoX2Z3ZCA9IDA7CisgICAgbXV0dWFsX2NvbXBsZXRlID0gMDsKKyAgICBpZiAoIHNzdGVsbmV0ICkKKyAgICAgICAgc3RyX2RhdGFbM10gPSBURUxRVUFMX1JFUExZOworICAgIGVsc2UKKyAgICAgICAgc3RyX2RhdGFbM10gPSBURUxRVUFMX0lTOworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisKKyNpZmRlZiBDS19TUlAKKyAgICBzcnBfd2FpdHJlc3AgPSAwOworI2VuZGlmIC8qIFNSUCAqLworCisjaWZkZWYgQ0tfS0VSQkVST1MKKyNpZmRlZiBLUkI1CisgICAgLyogZnJlZSBwcmV2aW91cyByZXRfY3JlZCAgKi8KKyAgICBpZiAoIHJldF9jcmVkICkgeworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyNpZmRlZiBIRUlNREFMCisgICAgICAgIGlmICggazVfc2Vzc2lvbl9rZXkgPT0gJnJldF9jcmVkLT5zZXNzaW9uKQorICAgICAgICAgICAgazVfc2Vzc2lvbl9rZXkgPSBOVUxMOworI2Vsc2UgLyogSEVJTURBTCAqLworICAgICAgICBpZiAoIGs1X3Nlc3Npb25fa2V5ID09ICZyZXRfY3JlZC0+a2V5YmxvY2spCisgICAgICAgICAgICBrNV9zZXNzaW9uX2tleSA9IE5VTEw7CisjZW5kaWYgLyogSEVJTURBTCAqLworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAga3JiNV9mcmVlX2NyZWRzKGs1X2NvbnRleHQsIHJldF9jcmVkKTsKKyAgICAgICAgcmV0X2NyZWQgPSBOVUxMOworICAgIH0KKyAgICBpZiAoazVfdGlja2V0KSB7CisgICAgICAgIGtyYjVfZnJlZV90aWNrZXQoazVfY29udGV4dCwgazVfdGlja2V0KTsKKyAgICAgICAgazVfdGlja2V0ID0gTlVMTDsKKyAgICB9CisgICAgLyogYW5kIGNvbnRleHQgKi8KKyAgICBpZiAoIGs1X2NvbnRleHQgKSB7CisgICAgICAgIGtyYjVfZnJlZV9jb250ZXh0KGs1X2NvbnRleHQpOworICAgICAgICBrNV9jb250ZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgazVfY29udGV4dCAqLworICAgIGtyYjVfaW5pdF9jb250ZXh0KCZrNV9jb250ZXh0KTsKKyNpZm5kZWYgTUlUX0NVUlJFTlQKKyAgICBpZiAoazVfY29udGV4dCkKKyAgICAgICAga3JiNV9pbml0X2V0cyhrNV9jb250ZXh0KTsKKyNlbmRpZiAvKiBNSVRfQ1VSUkVOVCAqLworI2lmZGVmIEtSQjUyNF9DT05WCisgICAga3JiNTI0X2luaXRfZXRzKGs1X2NvbnRleHQpOworI2VuZGlmIC8qIEtSQjUyNF9DT05WICovCisgICAgbWVtc2V0KCZrNV9hdXRoLDAsc2l6ZW9mKGs1X2F1dGgpKTsKKyAgICBpZiAoYXV0aF9jb250ZXh0KSB7CisgICAgICAgIGtyYjVfYXV0aF9jb25fZnJlZShrNV9jb250ZXh0LCBhdXRoX2NvbnRleHQpOworICAgICAgICBhdXRoX2NvbnRleHQgPSAwOworICAgIH0KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgaWYgKGs1X3Nlc3Npb25fa2V5KSB7CisgICAgICAgIGtyYjVfZnJlZV9rZXlibG9jayhrNV9jb250ZXh0LCBrNV9zZXNzaW9uX2tleSk7CisgICAgICAgIGs1X3Nlc3Npb25fa2V5ID0gMDsKKyAgICB9CisjZW5kaWYgLyogRU5DUllQVElPTiAqLworI2lmZGVmIFRMU19WRVJJRlkKKyAgICBrcmI1X3Rsc192ZXJpZmllZCA9IDA7CisjZW5kaWYgLyogVExTX1ZFUklGWSAqLworI2VuZGlmIC8qIEtSQjUgKi8KKworI2lmZGVmIEtSQjQKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgLyogSW5pdGlhbGl6ZSBidWZmZXJzIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uICovCisgICAgbWVtc2V0KCZrNF9zZXNzaW9uX2tleSwgMCwgc2l6ZW9mKGs0X3Nlc3Npb25fa2V5KSk7CisgICAgbWVtc2V0KCZrNF9jaGFsbGVuZ2UsIDAsIHNpemVvZihrNF9jaGFsbGVuZ2UpKTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjZW5kaWYgLyogS1JCNCAqLworCisjaWZkZWYgUkxPR0NPREUKKyAgICBybG9nX2VuY3J5cHQgPSAwOworI2VuZGlmIC8qIFJMT0dDT0RFICovCisgICAgbnN0b3JlZCA9IDA7CisgICAgc3RvcmVfcHRyID0gc3RvcmFnZTsKKyAgICBtZW1zZXQoc3RvcmFnZSwwLHNpemVvZihzdG9yYWdlKSk7CisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBrc3RyZWFtX2Rlc3Ryb3koKTsKKyAgICBpZiAoIWtzdHJlYW1fY3JlYXRlX2Zyb21fZmQoc29ja2V0LCBOVUxMKSkKKyAgICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICByZXR1cm4oMSk7Cit9CisKK3ZvaWQKK2F1dGhfZmluaXNoZWQocmVzdWx0KSBpbnQgcmVzdWx0OyB7CisgICAgZXh0ZXJuIGNoYXIgdWlkYnVmW107CisgICAgZXh0ZXJuIGludCBzc3RlbG5ldDsKKworICAgIHZhbGlkVXNlciA9IHJlc3VsdDsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgIGNhc2UgQVVUSF9SRUpFQ1Q6ICAgICAgICAgICAvKiBSZWplY3RlZCAqLworICAgICAgICBpZiAoc3N0ZWxuZXQpCisgICAgICAgICAgICB1aWRidWZbMF0gPSAnXDAnOworICAgICAgICBhdXRoZW50aWNhdGlvbl92ZXJzaW9uID0gQVVUSFRZUEVfTlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVVRIX1VOS05PV046ICAgICAgICAgIC8qIFdlIGRvbid0IGtub3cgd2hvIGhlIGlzLCBidXQgaGUncyBva2F5ICovCisgICAgICAgIGlmIChzc3RlbG5ldCkKKyAgICAgICAgICAgIHN0cmNweSh1aWRidWYsIih1bmtub3duKSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVVEhfT1RIRVI6ICAgICAgICAgICAgLyogV2Uga25vdyBoaW0sIGJ1dCBub3QgaGlzIG5hbWUgKi8KKyAgICAgICAgaWYgKHNzdGVsbmV0KQorICAgICAgICAgICAgc3RyY3B5KHVpZGJ1ZiwiKG90aGVyKSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVVEhfVVNFUjogICAgICAgICAgICAgLyogV2Uga25vdyBoZSBuYW1lICovCisgICAgY2FzZSBBVVRIX1ZBTElEOiAgICAgICAgICAgIC8qIFdlIGtub3cgaGltLCBhbmQgaGUgbmVlZHMgbm8gcGFzc3dvcmQgKi8KKyAgICAgICAgaWYgKHNzdGVsbmV0KQorICAgICAgICAgICAgc3RyY3B5KHVpZGJ1ZixzelVzZXJOYW1lUmVxdWVzdGVkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorI2VuZGlmIC8qIENLX1NFQ1VSSVRZICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2t1YXRoLmggYi9ja2VybWl0LTguMC4yMTEvY2t1YXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRiZThkYwotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja3VhdGguaApAQCAtMCwwICsxLDIyOCBAQAorLyogIEMgSyBVIEEgVCBIIC4gSCAtLSAgIkMtS2VybWl0IHRvIEF1dGhlbnRpY2F0aW9uIiBpbnRlcmZhY2UgICovCisKKy8qCisgIEF1dGhvcjogSmVmZnJleSBFIEFsdG1hbiA8amFsdG1hbkBzZWN1cmUtZW5kcG9pbnRzLmNvbT4sCisgICAgICAgICAgICBTZWN1cmUgRW5kcG9pbnRzIEluYy4sIE5ldyBZb3JrIENpdHkuCisKKyAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisKKy8qCisgKiBCYXNlZCBvbiBhIGNvbmNhdGVuYXRpb24gb2YgYWxsIG5lY2Vzc2FyeSBpbmNsdWRlIGZpbGVzIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoZSBLZXJiZXJvcyA1IE5UIEFscGhhIDIgVGVsbmV0IHBhY2thZ2UgZnJvbSBNSVQuCisgKi8KKworI2lmbmRlZiBLUkI1X0tFUk1JVF9ICisjZGVmaW5lIEtSQjVfS0VSTUlUX0gKKworI2lmbmRlZiBCT09MCisjZGVmaW5lIEJPT0wgaW50CisjZW5kaWYKKworLyogSGVhZGVyIGZpbGUgZm9yIGVuY3J5cHRlZC1zdHJlYW0gbGlicmFyeS4KKyAqIFdyaXR0ZW4gYnkgS2VuIFJhZWJ1cm4gKFJhZWJ1cm5AQ3lnbnVzLkNPTSkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTQgYnkgQ3lnbnVzIFN1cHBvcnQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQKKyAqIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKyAqIEN5Z251cyBTdXBwb3J0IG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3MKKyAqIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworI2lmbmRlZiBLNVNUUkVBTV9ICisjZGVmaW5lIEs1U1RSRUFNX0gKKwordHlwZWRlZiB2b2lkICprc3RyZWFtX3B0cjsgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBzZW5kIG9uIHRoZSBrc3RyZWFtICovCitzdHJ1Y3Qga3N0cmVhbV9kYXRhX2Jsb2NrIHsKKyAga3N0cmVhbV9wdHIgcHRyOworICBzaXplX3QgbGVuZ3RoOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga3N0cmVhbV9pbnQgeyAgICAgICAgICAgICAgICAgICAgLyogT2JqZWN0IHdlIHBhc3MgYXJvdW5kICovCisgICAgaW50IGZkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9wZW4gc29ja2V0IGRlc2NyaXB0b3IgKi8KKyAgICBpbnQgKCplbmNyeXB0KShzdHJ1Y3Qga3N0cmVhbV9kYXRhX2Jsb2NrICosIC8qIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgIHN0cnVjdCBrc3RyZWFtX2RhdGFfYmxvY2sgKik7IC8qIGlucHV0ICovCisgICAgaW50IGVuY3J5cHRfdHlwZTsKKyAgICBpbnQgKCpkZWNyeXB0KShzdHJ1Y3Qga3N0cmVhbV9kYXRhX2Jsb2NrICosIC8qIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgIHN0cnVjdCBrc3RyZWFtX2RhdGFfYmxvY2sgKik7IC8qIGlucHV0ICovCisgICAgaW50IGRlY3J5cHRfdHlwZTsKK30gKmtzdHJlYW07CisKKy8qIFByb3RvdHlwZXMgKi8KKworaW50ICBrc3RyZWFtX2Rlc3Ryb3koKTsKK3ZvaWQga3N0cmVhbV9zZXRfYnVmZmVyX21vZGUoaW50KTsKK2ludCAga3N0cmVhbV9jcmVhdGVfZnJvbV9mZChpbnQgZmQsIGtzdHJlYW1fcHRyKTsKK2ludCBrc3RyZWFtX3dyaXRlKHZvaWQgKiwgc2l6ZV90KTsKK2ludCBrc3RyZWFtX3JlYWQodm9pZCAqLCBzaXplX3QpOworCisjZW5kaWYgLyogSzVTVFJFQU1fSCAqLworCisvKgorICogSW1wbGVtZW50cyBUZWxuZXQgYXV0aGVudGljYXRpb24gYW5kIGVuY3J5cHRpb24KKyAqLworCisjaWZuZGVmIFRFTE5FVF9BVVRIX0gKKyNkZWZpbmUgVEVMTkVUX0FVVEhfSAorCitpbnQgYXV0aF9wYXJzZSh1bnNpZ25lZCBjaGFyICosIGludCk7CisKK2ludCBhdXRoX2luaXQoa3N0cmVhbSk7CisKK3ZvaWQgYXV0aF9kZXN0cm95KHZvaWQpOworCitpbnQgYXV0aF9lbmNyeXB0KHN0cnVjdCBrc3RyZWFtX2RhdGFfYmxvY2sgKiwgc3RydWN0IGtzdHJlYW1fZGF0YV9ibG9jayAqKTsKKworaW50IGF1dGhfZGVjcnlwdChzdHJ1Y3Qga3N0cmVhbV9kYXRhX2Jsb2NrICosIHN0cnVjdCBrc3RyZWFtX2RhdGFfYmxvY2sgKik7CisKK2V4dGVybiBCT09MIGZvcndhcmRfZmxhZzsKK2V4dGVybiBCT09MIGZvcndhcmRhYmxlX2ZsYWc7CitleHRlcm4gQk9PTCBmb3J3YXJkZWRfdGlja2V0czsKKyNlbmRpZiAvKiBURUxfQVVUSF9IICovCisKKworLyogQy1LZXJtaXQgc3BlY2lmaWMgZnVuY3Rpb25zICovCitfUFJPVE9UWVAodm9pZCBhdXRoX2ZpbmlzaGVkLChpbnQpKTsKK19QUk9UT1RZUChpbnQgY2tfYXV0aF9pbml0LCAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50KSk7CitfUFJPVE9UWVAoaW50IGNrX3RuX2F1dGhfdmFsaWQsIChWT0lEKSk7CitfUFJPVE9UWVAoaW50IGNrX3RuX2F1dGhfaW5fcHJvZ3Jlc3MsKFZPSUQpKTsKK19QUk9UT1RZUChpbnQgY2tfdG5fc2JfYXV0aCwgKGNoYXIgKiwgaW50KSk7CitfUFJPVE9UWVAoaW50IGNrX3RuX3NiX2VuY3J5cHQsIChjaGFyICosIGludCkpOworX1BST1RPVFlQKGludCBja190bl9hdXRoX3JlcXVlc3QsIChWT0lEKSk7CitfUFJPVE9UWVAodm9pZCBja190bl9lbmNyeXB0LCAoY2hhciAqLCBpbnQpKTsKK19QUk9UT1RZUCh2b2lkIGNrX3RuX2RlY3J5cHQsIChjaGFyICosIGludCkpOworX1BST1RPVFlQKHZvaWQgY2tfdG5fZW5jcnlwdF9zdGFydCwgKFZPSUQpKTsKK19QUk9UT1RZUCh2b2lkIGNrX3RuX2VuY3J5cHRfc3RvcCwgKFZPSUQpKTsKK19QUk9UT1RZUChpbnQgY2tfdG5fYXV0aGVudGljYXRlZCwgKFZPSUQpKTsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCitfUFJPVE9UWVAoaW50IGNrX3RuX2VuY3J5cHRpbmcsIChWT0lEKSk7CitfUFJPVE9UWVAoaW50IGNrX3RuX2RlY3J5cHRpbmcsIChWT0lEKSk7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmIENLX1NTTAorX1BST1RPVFlQKGludCBja190bl90bHNfbmVnb3RpYXRlLCAoVk9JRCkpOworX1BST1RPVFlQKGludCBTZW5kU1NMQXV0aFNCLCAoaW50LCB2b2lkICosIGludCkpOworI2VuZGlmIC8qIENLX1NTTCAqLworCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAvKiBEZWZpbmUgTUlUX0NVUlJFTlQgdG8gY29tcGlsZSB0aGUgY29kZSBmb3IgdXNlIHdpdGggdmVyc2lvbnMgb2YgKi8KKyAgICAvKiBLZXJiZXJvcyBsYXRlciB0aGFuIEtSQjUgMS4wLjUuICBOb3RlLiAgVGhpcyB3aWxsIG5vdCBjb21waWxlICAgKi8KKyAgICAvKiBzdWNjZXNzZnVsbHkgaW4gS2VybWl0IDk1IGR1ZSB0byB0aGUgc2VnbWVudGF0aW9uIG9mIGNyeXB0byAgICAgKi8KKyAgICAvKiBpbnRvIGEgc2VwYXJhdGUgRExMLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBLUkJfREVGVElNIDYwMCAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgbGlmZXRpbWUgKG1pbnV0ZXMpICovCisKKy8qIEtlcmJlcm9zIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAqLworCitzdHJ1Y3Qga3JiX29wX2RhdGEgeyAgICAgICAgICAgICAgICAgICAgLyogT3BlcmF0aW9uYWwgZGF0YSBmb3IgYWxsIGFjdGlvbnMgKi8KKyAgICBpbnQgdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBLZXJiZXJvcyB2ZXJzaW9uICAgICovCisgICAgY2hhciAqIGNhY2hlOyAgICAgICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgY2FjaGUgZmlsZSAqLworfTsKKworc3RydWN0IGtyYjRfaW5pdF9kYXRhIHsgICAgICAgICAgICAgICAgIC8qIElOSVRJQUxJWkUgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICBpbnQgbGlmZXRpbWU7CisgICAgY2hhciAqIHByaW5jaXBhbDsgICAgICAgICAgICAgICAgICAgLyogUHJpbmNpcGFsIHN0cmluZyAqLworICAgIGNoYXIgKiBpbnN0YW5jZTsKKyAgICBjaGFyICogcmVhbG07ICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFsbSBzdHJpbmcgKi8KKyAgICBjaGFyICogcGFzc3dvcmQ7ICAgICAgICAgICAgICAgICAgICAvKiBLZXJiZXJvcyBwYXNzd29yZCAqLworICAgIGludCAgICBwcmVhdXRoOyAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSBwcmVhdXRoIG1vZGU/ICovCisgICAgaW50ICAgIHZlcmJvc2U7ICAgICAgICAgICAgICAgICAgICAgLyogVmVyYm9zZSBvdXRwdXQ/ICovCit9OworCisjZGVmaW5lIEtSQjVfTlVNX09GX0FERFJTIDE2CitzdHJ1Y3Qga3JiNV9pbml0X2RhdGEgeyAgICAgICAgICAgICAgICAgLyogSU5JVElBTElaRSBkYXRhIHN0cnVjdHVyZSAqLworICAgIGludCBmb3J3YXJkYWJsZTsgICAgICAgICAgICAgICAgICAgIC8qIFN3aXRjaCB2YWx1ZXMgKi8KKyAgICBpbnQgcHJveGlhYmxlOyAgICAgICAgICAgICAgICAgICAgICAvKiBDb3JyZXNwb25kIHRvIHN3aXRjaCBuYW1lcy4uLiAqLworICAgIGludCBsaWZldGltZTsKKyAgICBpbnQgcmVuZXc7CisgICAgaW50IHJlbmV3YWJsZTsKKyAgICBpbnQgdmFsaWRhdGU7CisgICAgY2hhciAqIHBvc3RkYXRlOworICAgIGNoYXIgKiBzZXJ2aWNlOworICAgIGNoYXIgKiBwcmluY2lwYWw7ICAgICAgICAgICAgICAgICAgIC8qIFByaW5jaXBhbCBzdHJpbmcgKi8KKyAgICBjaGFyICogaW5zdGFuY2U7CisgICAgY2hhciAqIHJlYWxtOyAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhbG0gc3RyaW5nICovCisgICAgY2hhciAqIHBhc3N3b3JkOyAgICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgcGFzc3dvcmQgKi8KKyAgICBpbnQgICAgcHJlYXV0aDsgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgcHJlYXV0aCBtb2RlPyAqLworICAgIGludCAgICB2ZXJib3NlOyAgICAgICAgICAgICAgICAgICAgIC8qIFZlcmJvc2Ugb3V0cHV0PyAqLworICAgIGludCAgICBnZXRrNDsgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBLNCBUR1Q/ICovCisgICAgY2hhciAqIGFkZHJzW0tSQjVfTlVNX09GX0FERFJTKzFdOyAgLyogTGlzdCBvZiBJUCBBZGRyZXNzZXMgKi8KKyAgICBpbnQgIG5vX2FkZHJlc3NlczsgICAgICAgICAgICAgICAgICAvKiBEbyBub3QgaW5jbHVkZSBJUCBBZGRyZXNzZXMgKi8KK307CisKK3N0cnVjdCBrcmI1X2xpc3RfY3JlZF9kYXRhIHsgICAgICAgICAgICAvKiBMaXN0IENyZWRlbnRpYWxzIGRhdGEgKi8KKyAgICBpbnQgZW5jcnlwdGlvbjsKKyAgICBpbnQgZmxhZ3M7CisgICAgaW50IGFkZHI7Cit9OworCitfUFJPVE9UWVAoaW50IGNrX2tyYjVfYXV0b2dldF9UR1QsIChjaGFyICopKTsKK19QUk9UT1RZUChpbnQgY2tfa3JiNV9pbml0VEdULCAoc3RydWN0IGtyYl9vcF9kYXRhICosc3RydWN0IGtyYjVfaW5pdF9kYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga3JiNF9pbml0X2RhdGEgKikpOworX1BST1RPVFlQKGludCBja19rcmI1X2Rlc3Ryb3ksIChzdHJ1Y3Qga3JiX29wX2RhdGEgKikpOworX1BST1RPVFlQKGludCBja19rcmI1X2xpc3RfY3JlZHMsIChzdHJ1Y3Qga3JiX29wX2RhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBrcmI1X2xpc3RfY3JlZF9kYXRhICopKTsKK19QUk9UT1RZUChjaGFyICogY2tfa3JiNV9nZXRyZWFsbSwgKGNoYXIgKikpOworX1BST1RPVFlQKGNoYXIgKiBja19rcmI1X2dldHByaW5jaXBhbCwgKGNoYXIgKikpOworX1BST1RPVFlQKGNoYXIgKiBja19rcmI1X2dldF9jY19uYW1lLCAoVk9JRCkpOworCitfUFJPVE9UWVAoaW50IGNrX2tyYjRfYXV0b2dldF9UR1QsIChjaGFyICopKTsKK19QUk9UT1RZUChpbnQgY2tfa3JiNF9pbml0VEdULCAoc3RydWN0IGtyYl9vcF9kYXRhICosc3RydWN0IGtyYjRfaW5pdF9kYXRhICopKTsKK19QUk9UT1RZUChpbnQgY2tfa3JiNF9kZXN0cm95LCAoc3RydWN0IGtyYl9vcF9kYXRhICopKTsKK19QUk9UT1RZUChpbnQgY2tfa3JiNF9saXN0X2NyZWRzLCAoc3RydWN0IGtyYl9vcF9kYXRhICopKTsKK19QUk9UT1RZUChjaGFyICogY2tfa3JiNF9nZXRyZWFsbSwgKFZPSUQpKTsKK19QUk9UT1RZUChjaGFyICogY2tfa3JiNF9nZXRwcmluY2lwYWwsIChWT0lEKSk7CisKK19QUk9UT1RZUChpbnQgY2tfa3JiNF9nZXRfdGt0cywgKFZPSUQpKTsKK19QUk9UT1RZUChjaGFyICogY2tfa3JiNF9nZXRfbmV4dF90a3QsIChWT0lEKSk7CitfUFJPVE9UWVAoaW50IGNrX2tyYjRfdGt0X2lzdmFsaWQsKGNoYXIgKikpOworX1BST1RPVFlQKGludCBja19rcmI0X2lzX3RndF92YWxpZCwoVk9JRCkpOworX1BST1RPVFlQKGludCBja19rcmI0X3RrdF90aW1lLChjaGFyICopKTsKKworX1BST1RPVFlQKGludCBja19rcmI1X2dldF90a3RzLCAoY2hhciAqKSk7CitfUFJPVE9UWVAoY2hhciAqIGNrX2tyYjVfZ2V0X25leHRfdGt0LCAoVk9JRCkpOworX1BST1RPVFlQKGludCBja19rcmI1X3RrdF9pc3ZhbGlkLChjaGFyICosY2hhciAqKSk7CitfUFJPVE9UWVAoY2hhciAqIGNrX2tyYjVfdGt0X2ZsYWdzLChjaGFyICosY2hhciAqKSk7CitfUFJPVE9UWVAoaW50IGNrX2tyYjVfaXNfdGd0X3ZhbGlkLChWT0lEKSk7CitfUFJPVE9UWVAoaW50IGNrX2tyYjVfdGt0X3RpbWUsKGNoYXIgKixjaGFyICopKTsKKworX1BST1RPVFlQKGludCBrcmI0X2Rlc19hdmFpbCwoaW50KSk7CitfUFJPVE9UWVAoaW50IGtyYjRfZGVzX3dyaXRlLChpbnQsY2hhciAqLGludCkpOworX1BST1RPVFlQKGludCBrcmI0X2Rlc19yZWFkLCAoaW50LGNoYXIgKixpbnQpKTsKK19QUk9UT1RZUChpbnQga3JiNV9kZXNfYXZhaWwsKGludCkpOworX1BST1RPVFlQKGludCBrcmI1X2Rlc193cml0ZSwoaW50LGNoYXIgKixpbnQsaW50KSk7CitfUFJPVE9UWVAoaW50IGtyYjVfZGVzX3JlYWQsIChpbnQsY2hhciAqLGludCxpbnQpKTsKK19QUk9UT1RZUChpbnQga3JiNV91MnVfYXZhaWwsKGludCkpOworX1BST1RPVFlQKGludCBrcmI1X3UydV93cml0ZSwoaW50LGNoYXIgKixpbnQpKTsKK19QUk9UT1RZUChpbnQga3JiNV91MnVfcmVhZCwgKGludCxjaGFyICosaW50KSk7CitfUFJPVE9UWVAoaW50IGs1X3VzZXJfdG9fdXNlcl9zZXJ2ZXJfYXV0aCwoVk9JRCkpOworX1BST1RPVFlQKGludCBrNV91c2VyX3RvX3VzZXJfY2xpZW50X2F1dGgsKFZPSUQpKTsKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCitfUFJPVE9UWVAoaW50IGNrX2tyYjVfaXNfaW5zdGFsbGVkLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IGNrX2tyYjRfaXNfaW5zdGFsbGVkLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IGNrX3NycF9pc19pbnN0YWxsZWQsKHZvaWQpKTsKK19QUk9UT1RZUChpbnQgY2tfbnRsbV9pc19pbnN0YWxsZWQsKHZvaWQpKTsKK19QUk9UT1RZUChpbnQgY2tfY3J5cHRfaXNfaW5zdGFsbGVkLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IGNrX3NzbGVheV9pc19pbnN0YWxsZWQsKHZvaWQpKTsKK19QUk9UT1RZUChpbnQgY2tfZ3NzYXBpX2lzX2luc3RhbGxlZCwodm9pZCkpOworX1BST1RPVFlQKGludCBja19rcnlwdG9faXNfaW5zdGFsbGVkLCh2b2lkKSk7CisKK19QUk9UT1RZUChWT0lEIGNrX2VuY3J5cHRfc2VuZF9zdXBwb3J0LChWT0lEKSk7CitfUFJPVE9UWVAoaW50IGNrX2dldF9jcnlwdF90YWJsZSwoc3RydWN0IGtleXRhYiAqKiwgaW50ICopKTsKK19QUk9UT1RZUChjaGFyICogY2tfa3JiNF9yZWFsbW9maG9zdCwoY2hhciAqKSk7CitfUFJPVE9UWVAoY2hhciAqIGNrX2tyYjVfcmVhbG1vZmhvc3QsKGNoYXIgKikpOworCisjZGVmaW5lIEZPUldBUkQgIC8qIGFsbG93IGZvcndhcmRpbmcgb2YgY3JlZGVudGlhbCAqLworI2lmZGVmIEZPUldBUkQKK19QUk9UT1RZUChpbnQga2VyYmVyb3M1X2ZvcndhcmQsKFZPSUQpKTsKKyNlbmRpZiAvKiBGT1JXQVJEICovCisKKyNkZWZpbmUgQVVUSFRZUExTVFNaIDgKKyNlbmRpZiAvKktSQjVfS0VSTUlUX0gqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdWJ3ci50eHQgYi9ja2VybWl0LTguMC4yMTEvY2t1YndyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjBkMzg3Ci0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrdWJ3ci50eHQKQEAgLTAsMCArMSw1MzMwIEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgQy1LZXJtaXQgOC4wIFVuaXggSGludHMgYW5kIFRpcHMKKworICAgICBGcmFuayBkYSBDcnV6CisgICAgIFsxXVRoZSBLZXJtaXQgUHJvamVjdCwgWzJdQ29sdW1iaWEgVW5pdmVyc2l0eQorCisgICBBcyBvZjogQy1LZXJtaXQgOC4wLjIxMSAxMCBBcHJpbCAyMDA0CisgICBUaGlzIHBhZ2UgbGFzdCB1cGRhdGVkOiBGcmkgQXByIDE2IDE2OjEzOjE0IDIwMDQgKE5ldyBZb3JrIFVTQSBUaW1lKQorCisgICAgIElGIFlPVSBBUkUgUkVBRElORyBBIFBMQUlOLVRFWFQgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50LCBub3RlIGl0CisgICAgIGlzIGEgcGxhaW4tdGV4dCBkdW1wIG9mIGEgV2ViIHBhZ2UuIFlvdSBjYW4gdmlzaXQgdGhlIG9yaWdpbmFsIChhbmQKKyAgICAgcG9zc2libHkgbW9yZSB1cC10by1kYXRlKSBXZWIgcGFnZSBoZXJlOgorCisgIFszXWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbAorCisgICAgIFNpbmNlIHRoZSBtYXRlcmlhbCBpbiB0aGlzIGZpbGUgaGFzIGJlZW4gYWNjdW11bGF0aW5nIHNpbmNlIDE5ODUsCisgICAgIHNvbWUgKG11Y2gpIG9mIGl0IG1pZ2h0IGJlIGRhdGVkLiBbNF1GZWVkYmFjayBmcm9tIGV4cGVydHMgb24KKyAgICAgcGFydGljdWxhciBPUydzIGFuZCBwbGF0Zm9ybXMgaXMgYWx3YXlzIHdlbGNvbWUuIAorCisgICBbIFs1XUMtS2VybWl0IF0gWyBbNl1JbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zIF0gWyBbN11UVVRPUklBTCBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgQ09OVEVOVFMKKworICAgIDEuIFs4XUlOVFJPRFVDVElPTgorICAgIDIuIFs5XVBSRUJVSUxUIEMtS0VSTUlUIEJJTkFSSUVTCisgICAgMy4gWzEwXVBMQVRGT1JNLVNQRUNJRklDIE5PVEVTCisgICAgNC4gWzExXUdFTkVSQUwgVU5JWC1TUEVDSUZJQyBMSU1JVEFUSU9OUyBBTkQgQlVHUworICAgIDUuIFsxMl1JTklUSUFMSVpBVElPTiBBTkQgQ09NTUFORCBGSUxFUworICAgIDYuIFsxM11DT01NVU5JQ0FUSU9OIFNQRUVEIFNFTEVDVElPTgorICAgIDcuIFsxNF1DT01NVU5JQ0FUSU9OUyBBTkQgRElBTElORworICAgIDguIFsxNV1IQVJEV0FSRSBGTE9XIENPTlRST0wKKyAgICA5LiBbMTZdVEVSTUlOQUwgQ09OTkVDVElPTiBBTkQgS0VZIE1BUFBJTkcKKyAgIDEwLiBbMTddRklMRSBUUkFOU0ZFUgorICAgMTEuIFsxOF1FWFRFUk5BTCBGSUxFIFRSQU5TRkVSIFBST1RPQ09MUworICAgMTIuIFsxOV1TRUNVUklUWQorICAgMTMuIFsyMF1NSVNDRUxMQU5FT1VTIFVTRVIgUkVQT1JUUworICAgMTQuIFsyMV1USElSRC1QQVJUWSBEUklWRVJTCisKKyAgIFF1aWNrIExpbmtzOiAgIFsgWzIyXUxpbnV4IF0gWyBbMjNdKkJTRCBdIFtbMjRdTWFjIE9TIFhdIFsgWzI1XUFJWCBdIFsKKyAgIFsyNl1IUC1VWCBdIFsgWzI3XVNvbGFyaXMgXSBbIFsyOF1TQ08gXSBbIFsyOV1ERUMvQ29tcGFxIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxLiBJTlRST0RVQ1RJT04KKworICAgWyBbMzBdVG9wIF0gWyBbMzFdQ29udGVudHMgXSBbIFszMl1OZXh0IF0KKworICAgU0VDVElPTiBDT05URU5UUworCisgIDEuMS4gWzMzXURvY3VtZW50YXRpb24KKyAgMS4yLiBbMzRdVGVjaG5pY2FsIFN1cHBvcnQKKyAgMS4zLiBbMzVdVGhlIFllYXIgMjAwMAorICAxLjQuIFszNl1UaGUgRXVybworCisgICBUSElTIElTIFdIQVQgVVNFRCBUTyBCRSBDQUxMRUQgdGhlICJiZXdhcmUgZmlsZSIgZm9yIHRoZSBVbml4IHZlcnNpb24KKyAgIG9mIEMtS2VybWl0LCBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIGFzIGNrdWJ3ci50eHQgYW5kLCBiZWZvcmUgdGhhdCwgYXMKKyAgIGNrdWtlci5id3IsIGFmdGVyIHRoZSBmYXNoaW9uIG9mIG9sZCBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbgorICAgKERFQykgc29mdHdhcmUgcmVsZWFzZXMgdGhhdCBjYW1lIHdpdGggcmVsZWFzZSBub3RlcyAoZGVzY3JpYmluZyB3aGF0CisgICBoYWQgY2hhbmdlZCkgYW5kIGEgImJld2FyZSBmaWxlIiBsaXN0aW5nIGtub3duIGJ1Z3MsIGxpbWl0YXRpb25zLAorICAgIm5vbi1nb2FscyIsIGFuZCB0aGluZ3MgdG8gd2F0Y2ggb3V0IGZvci4gVGhlIEMtS2VybWl0IGJld2FyZSBmaWxlIGhhcworICAgYmVlbiBhY2N1bXVsYXRpbmcgc2luY2UgMTk4NSwgYW5kIGl0IGFwcGxpZXMgdG8gbWFueSBkaWZmZXJlbnQKKyAgIGhhcmR3YXJlIHBsYXRmb3JtcyBhbmQgb3BlcmF0aW5nIHN5c3RlbXMsIGFuZCBtYW55IHZlcnNpb25zIG9mIHRoZW0sCisgICBzbyBpdCBpcyBxdWl0ZSBsYXJnZS4gUHJpb3IgdG8gQy1LZXJtaXQgOC4wLCBpdCB3YXMgZGlzdHJpYnV0ZWQgb25seQorICAgaW4gcGxhaW4tdGV4dCBmb3JtYXQuIE5vdyBpdCBpcyBhdmFpbGFibGUgYXMgYSBXZWIgZG9jdW1lbnQgd2l0aAorICAgbGlua3MsIGludGVybmFsIGNyb3NzIHJlZmVyZW5jZXMsIGFuZCBzbyBvbiwgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdXNlLgorCisgICBUaGlzIGRvY3VtZW50IGFwcGxpZXMgdG8gVW5peCBDLUtlcm1pdCBpbiBnZW5lcmFsLCBhcyB3ZWxsIGFzIHRvCisgICBzcGVjaWZpYyBVbml4IHZhcmlhdGlvbnMgbGlrZSBbMzddTGludXgsIFszOF1BSVgsIFszOV1IUC1VWCwKKyAgIFs0MF1Tb2xhcmlzLCBhbmQgc28gb24sIGFuZCBzaG91bGQgYmUgcmVhZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorICAgWzQxXXBsYXRmb3JtLWluZGVwZW5kZW50IEMtS2VybWl0IGJld2FyZSBmaWxlLCB3aGljaCBjb250YWlucyBzaW1pbGFyCisgICBpbmZvcm1hdGlvbiwgYnV0IGFwcGx5aW5nIHRvIGFsbCB2ZXJzaW9ucyBvZiBDLUtlcm1pdCAoVk1TLCBXaW5kb3dzLAorICAgT1MvMiwgQU9TL1ZTLCBWT1MsIGV0YywgYXMgd2VsbCBhcyB0byBVbml4KS4KKworICAgVGhlcmUgaXMgbXVjaCBpbiB0aGlzIGRvY3VtZW50IHRoYXQgaXMgKG9ubHkpIG9mIGhpc3RvcmljYWwgaW50ZXJlc3QuCisgICBUaGUgbmF2aWdhdGlvbiBsaW5rcyBzaG91bGQgaGVscCB5b3Ugc2tpcCBkaXJlY3RseSB0byB0aGUgc2VjdGlvbnMKKyAgIHRoYXQgYXJlIHJlbGV2YW50IHRvIHlvdS4gTnVtZXJvdXMgb2Zmc2l0ZSBXZWIgbGlua3MgYXJlIHN1cHBvc2VkIHRvCisgICBsZWFkIHRvIGZ1cnRoZXIgaW5mb3JtYXRpb24gYnV0LCBhcyB5b3Uga25vdywgV2ViIGxpbmtzIGdvIHN0YWxlCisgICBmcmVxdWVudGx5IGFuZCB3aXRob3V0IHdhcm5pbmcuIElmIHlvdSBjYW4gc3VwcGx5IGFkZGl0aW9uYWwsCisgICBjb3JyZWN0ZWQsIHVwZGF0ZWQsIG9yIGJldHRlciBXZWIgbGlua3MsIHBsZWFzZSBmZWVsIGZyZWUgdG8gWzQyXWxldAorICAgdXMga25vdy4KKworICAxLjEuIERvY3VtZW50YXRpb24KKworICAgWyBbNDNdVG9wIF0gWyBbNDRdQ29udGVudHMgXSBbIFs0NV1OZXh0IF0KKworICAgQy1LZXJtaXQgNi4wIGlzIGRvY3VtZW50ZWQgaW4gdGhlIGJvb2sgWzQ2XVVzaW5nIEMtS2VybWl0LCBTZWNvbmQKKyAgIEVkaXRpb24sIGJ5IEZyYW5rIGRhIENydXogYW5kIENocmlzdGluZSBNLiBHaWFub25lLCBEaWdpdGFsIFByZXNzLAorICAgQnVybGluZ3RvbiwgTUEsIFVTQSwgSVNCTiAxLTU1NTU4LTE2NC0xICgxOTk3KSwgNjIyIHBhZ2VzLiBUaGlzCisgICByZW1haW5zIHRoZSBkZWZpbml0aXZlIEMtS2VybWl0IGRvY3VtZW50YXRpb24uIFVudGlsIHRoZSB0aGlyZCBlZGl0aW9uCisgICBpcyBwdWJsaXNoZWQgKHNvcnJ5LCB0aGVyZSBpcyBubyBmaXJtIHRpbWVmcmFtZSBmb3IgdGhpcyksIHBsZWFzZSBhbHNvCisgICByZWZlciB0bzoKKworICAgWzQ3XVN1cHBsZW1lbnQgdG8gVXNpbmcgQy1LZXJtaXQsIFNlY29uZCBFZGl0aW9uLCBGb3IgQy1LZXJtaXQgNy4wCisgICAgICAgICAgVGhvcm91Z2ggZG9jdW1lbnRhdGlvbiBvZiBmZWF0dXJlcyBuZXcgdG8gdmVyc2lvbiA3LjAuCisKKyAgIFs0OF1TdXBwbGVtZW50IHRvIFVzaW5nIEMtS2VybWl0LCBTZWNvbmQgRWRpdGlvbiwgRm9yIEMtS2VybWl0IDguMAorICAgICAgICAgIFRob3JvdWdoIGRvY3VtZW50YXRpb24gb2YgZmVhdHVyZXMgbmV3IHRvIHZlcnNpb24gOC4wLgorCisgIDEuMi4gVGVjaG5pY2FsIFN1cHBvcnQKKworICAgWyBbNDldVG9wIF0gWyBbNTBdQ29udGVudHMgXSBbIFs1MV1TZWN0aW9uIENvbnRlbnRzIF0gWyBbNTJdTmV4dCBdIFsKKyAgIFs1M11QcmV2aW91cyBdCisKKyAgIEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2V0IHRlY2huaWNhbCBzdXBwb3J0LCBwbGVhc2UgdmlzaXQ6CisKKyAgICBbNTRdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3N1cHBvcnQuaHRtbAorCisgIDEuMy4gVGhlIFllYXIgMjAwMAorCisgICBbIFs1NV1Ub3AgXSBbIFs1Nl1Db250ZW50cyBdIFsgWzU3XVNlY3Rpb24gQ29udGVudHMgXSBbIFs1OF1OZXh0IF0gWworICAgWzU5XVByZXZpb3VzIF0KKworICAgVGhlIFVuaXggdmVyc2lvbiBvZiBDLUtlcm1pdCwgcmVsZWFzZSA2LjAgYW5kIGxhdGVyLCBpcyAiWWVhciAyMDAwCisgICBjb21wbGlhbnQiLCBidXQgb25seSBpZiB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtIGlzIHRvby4KKyAgIENvbnRhY3QgeW91ciBVbml4IG9wZXJhdGluZyBzeXN0ZW0gdmVuZG9yIHRvIGZpbmQgb3V0IHdoaWNoIG9wZXJhdGluZworICAgc3lzdGVtIHZlcnNpb25zLCBwYXRjaGVzLCBoYXJkd2FyZSwgYW5kL29yIHVwZGF0ZXMgYXJlIHJlcXVpcmVkLgorICAgKFF1aXRlIGEgZmV3IG9sZCBVbml4ZXMgYXJlIHN0aWxsIGluIG9wZXJhdGlvbiBpbiB0aGUgbmV3IG1pbGxlbml1bSwKKyAgIGJ1dCB3aXRoIHRoZWlyIGRhdGUgc2V0IDI4IHllYXJzIGluIHRoZSBwYXN0IHNvIGF0IGxlYXN0IHRoZSBub24teWVhcgorICAgcGFydHMgb2YgdGhlIGNhbGVuZGFyIGFyZSBjb3JyZWN0LikKKworICAgQXMgb2YgQy1LZXJtaXQgNi4wICg2IFNlcHRlbWJlciAxOTk2KSwgcG9zdC1taWxsZW5pdW0gZmlsZSBkYXRlcyBhcmUKKyAgIHJlY29nbml6ZWQsIHRyYW5zbWl0dGVkLCByZWNlaXZlZCwgYW5kIHJlcHJvZHVjZWQgY29ycmVjdGx5IGR1cmluZyB0aGUKKyAgIGZpbGUgdHJhbnNmZXIgcHJvY2VzcyBpbiBDLUtlcm1pdCdzIEZpbGUgQXR0cmlidXRlIHBhY2tldHMuIElmCisgICBwb3N0LW1pbGxlbml1bSBkYXRlcyBhcmUgbm90IHByb2Nlc3NlZCBjb3JyZWN0bHkgb24gdGhlIG90aGVyIGVuZCwKKyAgIGZpbGUgdHJhbnNmZXIgc3RpbGwgdGFrZXMgcGxhY2UsIGJ1dCB0aGUgbW9kaWZpY2F0aW9uIG9yIGNyZWF0aW9uIGRhdGUKKyAgIG9mIHRoZSByZWNlaXZlZCBmaWxlIG1pZ2h0IGJlIGluY29ycmVjdC4gVGhlIG9ubHkgZXhjZXB0aW9uIHdvdWxkIGJlCisgICBpZiB0aGUgImZpbGUgY29sbGlzaW9uIHVwZGF0ZSIgZmVhdHVyZSBpcyBiZWluZyB1c2VkIHRvIHByZXZlbnQKKyAgIHVubmVjZXNzYXJ5IHRyYW5zZmVyIG9mIGZpbGVzIHRoYXQgaGF2ZSBub3QgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdAorICAgdGltZSBhIHRyYW5zZmVyIHRvb2sgcGxhY2U7IGluIHRoaXMgY2FzZSwgYSBmaWxlIG1pZ2h0IGJlIHRyYW5zZmVycmVkCisgICB1bm5lY2Vzc2FyaWx5LCBvciBpdCBtaWdodCBub3QgYmUgdHJhbnNmZXJyZWQgd2hlbiBpdCBzaG91bGQgaGF2ZQorICAgYmVlbi4gQ29ycmVjdCBvcGVyYXRpb24gb2YgdGhlIHVwZGF0ZSBmZWF0dXJlIGRlcGVuZHMgb24gYm90aCBLZXJtaXQKKyAgIHByb2dyYW1zIGhhdmluZyB0aGUgY29ycmVjdCBkYXRlIGFuZCB0aW1lLgorCisgICBPZiBzZWNvbmRhcnkgaW1wb3J0YW5jZSBhcmUgdGhlIHRpbWUgc3RhbXBzIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQvb3IKKyAgIGRlYnVnIGxvZ3MsIGFuZCB0aGUgZGF0ZS1yZWxhdGVkIHNjcmlwdCBwcm9ncmFtbWluZyBjb25zdHJ1Y3RzLCBzdWNoCisgICBhcyBcdihkYXRlKSwgXHYobmRhdGUpLCBcdihkYXkpLCBcdihuZGF5KSwgYW5kIHBlcmhhcHMgYWxzbyB0aGUKKyAgIHRpbWUtcmVsYXRlZCBvbmVzLCBcdih0aW1lKSBhbmQgXHYobnRpbWUpLCBpbnNvZmFyIGFzIHRoZXkgbWlnaHQgYmUKKyAgIGFmZmVjdGVkIGJ5IHRoZSBkYXRlLiBUaGUgXHYobmRhdGUpIGlzIGEgbnVtZXJpYy1mb3JtYXQgZGF0ZSBvZiB0aGUKKyAgIGZvcm0geXl5eW1tZGQsIHN1aXRhYmxlIGZvciBib3RoIGxleGljYWwgYW5kIG51bWVyaWMgY29tcGFyaXNvbiBhbmQKKyAgIHNvcnRpbmc6IGUuZy4gMTk5NzAyMDggb3IgMjAwMTEyMzEuIElmIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0KKyAgIHJldHVybnMgdGhlIGNvcnJlY3QgZGF0ZSBpbmZvcm1hdGlvbiwgdGhlc2UgdmFyaWFibGVzIHdpbGwgaGF2ZSB0aGUKKyAgIHByb3BlciB2YWx1ZXMuIElmIG5vdCwgdGhlbiBzY3JpcHRzIHRoYXQgbWFrZSBkZWNpc2lvbnMgYmFzZWQgb24gdGhlc2UKKyAgIHZhcmlhYmxlcyBtaWdodCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyAgIE1vc3QgZGF0ZS1yZWxhdGVkIGNvZGUgaXMgYmFzZWQgdXBvbiB0aGUgQyBMaWJyYXJ5IGFzY3RpbWUoKSBzdHJpbmcsCisgICB3aGljaCBhbHdheXMgaGFzIGEgZm91ci1kaWdpdCB5ZWFyLiBJbiBVbml4LCB0aGUgb25lIGJpdCBvZiBjb2RlIGluCisgICBDLUtlcm1pdCB0aGF0IGlzIGFuIGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUgaXMgc2V2ZXJhbCBjYWxscyB0bworICAgbG9jYWx0aW1lKCksIHdoaWNoIHJldHVybnMgYSBwb2ludGVyIHRvIGEgdG0gc3RydWN0LCBpbiB3aGljaCB0aGUgeWVhcgorICAgaXMgcHJlc3VtZWQgdG8gYmUgZXhwcmVzc2VkIGFzICJ5ZWFycyBzaW5jZSAxOTAwIi4gVGhlIGNvZGUgZGVwZW5kcyBvbgorICAgdGhpcyBhc3N1bXB0aW9uLiBBbnkgcGxhdGZvcm1zIHRoYXQgdmlvbGF0ZSBpdCB3aWxsIG5lZWQgc3BlY2lhbAorICAgY29kaW5nLiBBcyBvZiB0aGlzIHdyaXRpbmcsIG5vIHN1Y2ggcGxhdGZvcm1zIGFyZSBrbm93bi4KKworICAgQ29tbWFuZCBhbmQgc2NyaXB0IHByb2dyYW1taW5nIGZ1bmN0aW9ucyB0aGF0IGRlYWwgd2l0aCBkYXRlcyB1c2UKKyAgIEMtS2VybWl0IHNwZWNpZmljIGNvZGUgdGhhdCBhbHdheXMgdXNlcyBmdWxsIHllYXJzLgorCisgIDEuNC4gVGhlIEV1cm8KKworICAgWyBbNjBdVG9wIF0gWyBbNjFdQ29udGVudHMgXSBbIFs2Ml1TZWN0aW9uIENvbnRlbnRzIF0gWyBbNjNdUHJldmlvdXMgXQorCisgICBDLUtlcm1pdCA3LjAgYW5kIGxhdGVyIHN1cHBvcnQgVW5pY29kZSAoSVNPIDEwNjQ2KSwgSVNPIDg4NTktMTUgTGF0aW4KKyAgIEFscGhhYmV0IDksIFBDIENvZGUgUGFnZSA4NTgsIFdpbmRvd3MgQ29kZSBQYWdlcyAxMjUwIGFuZCAxMjUxLCBhbmQKKyAgIHBlcmhhcHMgb3RoZXIgY2hhcmFjdGVyIHNldHMsIHRoYXQgZW5jb2RlIHRoZSBFdXJvIHN5bWJvbCwgYW5kIGNhbgorICAgdHJhbnNsYXRlIGFtb25nIHRoZW0gYXMgbG9uZyBhcyBubyBpbnRlcm1lZGlhdGUgY2hhcmFjdGVyLXNldCBpcworICAgaW52b2x2ZWQgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBFdXJvLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDIuIFBSRUJVSUxUIEMtS0VSTUlUIEJJTkFSSUVTCisKKyAgIFsgWzY0XVRvcCBdIFsgWzY1XUNvbnRlbnRzIF0gWyBbNjZdTmV4dCBdIFsgWzY3XVByZXZpb3VzIF0KKworICAgSXQgaXMgb2Z0ZW4gZGFuZ2Vyb3VzIHRvIHJ1biBhIGJpbmFyeSBDLUtlcm1pdCAob3IgYW55IG90aGVyKSBwcm9ncmFtCisgICBidWlsdCBvbiBhIGRpZmZlcmVudCBjb21wdXRlci4gUGFydGljdWxhcmx5IGlmIHRoYXQgY29tcHV0ZXIgaGFkIGEKKyAgIGRpZmZlcmVudCBDIGNvbXBpbGVyLCBsaWJyYXJpZXMsIG9wZXJhdGluZyBzeXN0ZW0gdmVyc2lvbiwgcHJvY2Vzc29yCisgICBmZWF0dXJlcywgZXRjLCBhbmQgZXNwZWNpYWxseSBpZiB0aGUgcHJvZ3JhbSB3YXMgYnVpbHQgd2l0aCBzaGFyZWQKKyAgIGxpYnJhcmllcywgYmVjYXVzZSBhcyBzb29uIGFzIHlvdSB1cGRhdGUgdGhlIGxpYnJhcmllcyBvbiB5b3VyIHN5c3RlbSwKKyAgIHRoZXkgbm8gbG9uZ2VyIG1hdGNoIHRoZSBvbmVzIHJlZmVyZW5jZWQgaW4gdGhlIGJpbmFyeSwgYW5kIHRoZSBiaW5hcnkKKyAgIG1pZ2h0IHJlZnVzZSB0byBsb2FkIHdoZW4geW91IHJ1biBpdCwgaW4gd2hpY2ggY2FzZSB5b3UnbGwgc2VlIGVycm9yCisgICBtZXNzYWdlcyBzaW1pbGFyIHRvOgorCisgIENvdWxkIG5vdCBsb2FkIHByb2dyYW0ga2VybWl0CisgIE1lbWJlciBzaHI0Lm8gbm90IGZvdW5kIG9yIGZpbGUgbm90IGFuIGFyY2hpdmUKKyAgQ291bGQgbm90IGxvYWQgbGlicmFyeSBsaWJjdXJzZXMuYVtzaHI0Lm9dCisgIEVycm9yIHdhczogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorCisgICAoVGhlc2Ugc2FtcGxlcyBhcmUgZnJvbSBBSVguKSBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIHRyeSB0byBidWlsZAorICAgQy1LZXJtaXQgd2l0aCBzdGF0aWNhbGx5IGxpbmtlZCBsaWJyYXJpZXMgd2hlbmV2ZXIgd2UgY2FuLCBidXQgdGhpcyBpcworICAgaW5jcmVhc2luZ2x5IGltcG9zc2libGUgYXMgc2hhcmVkIGxpYnJhcmllcyBiZWNvbWUgdGhlIG5vcm0uCisKKyAgIEl0IGlzIG9mdGVuIE9LIHRvIHJ1biBhIGJpbmFyeSBidWlsdCBvbiBhbiBlYXJsaWVyIE9TIHZlcnNpb24sIGJ1dCBpdAorICAgaXMgcmFyZWx5IHBvc3NpYmxlIChvciBzYWZlKSB0byBydW4gYSBiaW5hcnkgYnVpbHQgb24gYSBsYXRlciBvbmUsIGZvcgorICAgZXhhbXBsZSB0byBydW4gYSBiaW5hcnkgYnVpbHQgdW5kZXIgU29sYXJpcyA4IG9uIFNvbGFyaXMgMi42LgorICAgU29tZXRpbWVzIGV2ZW4gdGhlIE9TLW9yLWxpYnJhcnkgcGF0Y2gvRUNPIGxldmVsIG1ha2VzIGEgZGlmZmVyZW5jZS4KKworICAgQSBwYXJ0aWN1bGFybHkgaW5zaWRpb3VzIHByb2JsZW0gb2NjdXJzIHdoZW4gYSBiaW5hcnkgd2FzIGJ1aWx0IG9uIGEKKyAgIHZlcnNpb24gb2YgdGhlIE9TIHRoYXQgaGFzIHBhdGNoZXMgZnJvbSB0aGUgdmVuZG9yIChlLmcuIHRvCisgICBsaWJyYXJpZXMpOyBpbiBtYW55IGNhc2VzIHlvdSB3b24ndCBiZSBhYmxlIHRvIHJ1biBzdWNoIGEgYmluYXJ5IG9uIGFuCisgICB1bnBhdGNoZWQgdmVyc2lvbiBvZiB0aGUgc2FtZSBwbGF0Zm9ybS4KKworICAgV2hlbiBpbiBkb3VidCwgYnVpbGQgQy1LZXJtaXQgZnJvbSB0aGUgc291cmNlIGNvZGUgb24gdGhlIGNvbXB1dGVyCisgICB3aGVyZSBpdCBpcyB0byBiZSBydW4gKGlmIHBvc3NpYmxlISkuIElmIG5vdCwgYXNrIHVzIGZvciBhIGJpbmFyeQorICAgc3BlY2lmaWMgdG8geW91ciBjb25maWd1cmF0aW9uLiBXZSBtaWdodCBoYXZlIG9uZSwgYW5kIGlmIHdlIGRvbid0LCB3ZQorICAgbWlnaHQgYmUgYWJsZSB0byBmaW5kIHNvbWVib2R5IHdobyB3aWxsIGJ1aWxkIG9uZSBmb3IgeW91LgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuIE5PVEVTIE9OIFNQRUNJRklDIFVOSVggVkVSU0lPTlMKKworICAgWyBbNjhdVG9wIF0gWyBbNjldQ29udGVudHMgXSBbIFs3MF1OZXh0IF0gWyBbNzFdUHJldmlvdXMgXQorCisgICBTRUNUSU9OIENPTlRFTlRTCisKKyAgMy4wLiAgWzcyXUMtS0VSTUlUIE9OIFBDLUJBU0VEIFVOSVhFUworICAzLjEuICBbNzNdQy1LRVJNSVQgQU5EIEFJWAorICAzLjIuICBbNzRdQy1LRVJNSVQgQU5EIEhQLVVYCisgIDMuMy4gIFs3NV1DLUtFUk1JVCBBTkQgTElOVVgKKyAgMy40LiAgWzc2XUMtS0VSTUlUIEFORCBORVhUU1RFUAorICAzLjUuICBbNzddQy1LRVJNSVQgQU5EIFFOWAorICAzLjYuICBbNzhdQy1LRVJNSVQgQU5EIFNDTworICAzLjcuICBbNzldQy1LRVJNSVQgQU5EIFNPTEFSSVMKKyAgMy44LiAgWzgwXUMtS0VSTUlUIEFORCBTVU5PUworICAzLjkuICBbODFdQy1LRVJNSVQgQU5EIFVMVFJJWAorICAzLjEwLiBbODJdQy1LRVJNSVQgQU5EIFVOSVhXQVJFCisgIDMuMTEuIFs4M11DLUtFUk1JVCBBTkQgQVBPTExPIFNSMTAKKyAgMy4xMi4gWzg0XUMtS0VSTUlUIEFORCBUQU5EWSBYRU5JWCAzLjAKKyAgMy4xMy4gWzg1XUMtS0VSTUlUIEFORCBPU0YvMSAoRElHSVRBTCBVTklYKSAoVFJVNjQgVU5JWCkKKyAgMy4xNC4gWzg2XUMtS0VSTUlUIEFORCBTR0kgSVJJWAorICAzLjE1LiBbODddQy1LRVJNSVQgQU5EIFRIRSBCRUJPWAorICAzLjE2LiBbODhdQy1LRVJNSVQgQU5EIERHL1VYCisgIDMuMTcuIFs4OV1DLUtFUk1JVCBBTkQgU0VRVUVOVCBEWU5JWAorICAzLjE4LiBbOTBdQy1LRVJNSVQgQU5EIHtGUkVFLE9QRU4sTkVUfUJTRAorICAzLjE5LiBbOTFdQy1LRVJNSVQgQU5EIE1BQyBPUyBYCisgIDMuMjAuIFs5Ml1DLUtFUk1JVCBBTkQgQ09IRVJFTlQKKworICAgVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBhcHBseSB0byBzcGVjaWZpYyBVbml4IHZlcnNpb25zLiBNb3N0IG9mIHRoZW0KKyAgIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBGQVFzIChGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyksIGJ1dCB0aGVzZQorICAgdGVuZCB0byBiZSBlcGhlbWVyYWwuIEZvciBwb3NzaWJseSBtb3JlIGN1cnJlbnQgaW5mb3JtYXRpb24gc2VlOgorCisgIFs5M11odHRwOi8vd3d3LmZhcXMub3JnCisgIFs5NF1odHRwOi8vYXBsYXdyZW5jZS5jb20vVW5peGFydC9uZXd0b3VuaXguaHRtbAorCisgICBPbmUgdGhyZWFkIHRoYXQgcnVucyB0aHJvdWdoIG1hbnkgb2YgdGhlbSwgYW5kIGltcGxpY2l0bHkgcGVyaGFwcworICAgdGhyb3VnaCBhbGwsIGNvbmNlcm5zIHRoZSBwcm9ibGVtcyB0aGF0IG9jY3VyIHdoZW4gdHJ5aW5nIHRvIGRpYWwgb3V0CisgICBvbiBhIHNlcmlhbCBkZXZpY2UgdGhhdCBpcyAoYWxzbykgZW5hYmxlZCBmb3IgZGlhbGluZyBpbi4gVGhlCisgICAic29sdXRpb25zIiB0byB0aGlzIHByb2JsZW0gYXJlIG1hbnksIHZhcmllZCwgZGl2ZXJzZSwgYW5kIHVzdWFsbHkKKyAgIGdyb3NzLCBpbnZvbHZpbmcgY29uZmlndXJpbmcgdGhlIGRldmljZSBmb3IgYmlkaXJlY3Rpb25hbCB1c2UuIFRoaXMgaXMKKyAgIGRvbmUgaW4gYSBoaWdobHkgT1MtZGVwZW5kZW50IGFuZCBvZnRlbiBvYnNjdXJlIG1hbm5lciwgYW5kIHRoZQorICAgZWZmZWN0cyAoZ29vZCBvciBldmlsKSBhcmUgYWxzbyBoaWdobHkgZGVwZW5kZW50IG9uIHRoZSBwYXJ0aWN1bGFyIE9TCisgICAoYW5kIGdldHR5IHZhcmlldHksIGV0YykuIE1hbnkgZXhhbXBsZXMgYXJlIGdpdmVuIGluIHRoZQorICAgWzk1XU9TLXNwZWNpZmljIHNlY3Rpb25zIGJlbG93LgorCisgICBBbiBpbXBvcnRhbnQgcG9pbnQgdG8ga2VlcCBpbiBtaW5kIGlzIHRoYXQgQy1LZXJtaXQgaXMgYQorICAgY3Jvc3MtcGxhdGZvcm0sIHBvcnRhYmxlIHNvZnR3YXJlIHByb2dyYW0uIEl0IHdhcyBub3QgZGVzaWduZWQKKyAgIHNwZWNpZmljYWxseSBhbmQgb25seSBmb3IgeW91ciBwYXJ0aWN1bGFyIFVuaXggdmVyc2lvbiwgb3IgZm9yIHRoYXQKKyAgIG1hdHRlciwgZm9yIFVuaXggaW4gcGFydGljdWxhciBhdCBhbGwuIEl0IGFsc28gcnVucyBvbiBWTVMsIEFPUy9WUywKKyAgIFZPUywgYW5kIG90aGVyIG5vbi1Vbml4IHBsYXRmb3Jtcy4gQWxsIHRoZSBVbml4IHZlcnNpb25zIG9mIEMtS2VybWl0CisgICBzaGFyZSBjb21tb24gaS9vIG1vZHVsZXMsIHdpdGggY29tcGlsZS10aW1lICNpZmRlZiBjb25zdHJ1Y3Rpb25zIHVzZWQKKyAgIHRvIGFjY291bnQgZm9yIHRoZSBkaWZmZXJlbmNlcyBhbW9uZyB0aGUgbWFueSBVbml4IHByb2R1Y3RzIGFuZAorICAgcmVsZWFzZXMuIElmIHlvdSB0aGluayB0aGF0IEMtS2VybWl0IGlzIGJlaGF2aW5nIGJhZGx5IG9yIG1pc3NpbmcKKyAgIHNvbWV0aGluZyBvbiB5b3VyIHBhcnRpY3VsYXIgVW5peCB2ZXJzaW9uLCB5b3UgbWlnaHQgYmUgcmlnaHQgLS0gd2UKKyAgIGNhbid0IGNsYWltIHRvIGJlIGV4cGVydCBpbiBodW5kcmVkcyBvZiBkaWZmZXJlbnQgT1MgLyB2ZXJzaW9uIC8KKyAgIGhhcmR3YXJlIC8gbGlicmFyeSBjb21iaW5hdGlvbnMuIElmIHlvdSdyZSBhIHByb2dyYW1tZXIsIHRha2UgYSBsb29rCisgICBhdCB0aGUgc291cmNlIGNvZGUgYW5kIFs5Nl1zZW5kIHVzIHlvdXIgc3VnZ2VzdGVkIGZpeGVzIG9yIGNoYW5nZXMuIE9yCisgICBlbHNlIGp1c3QgWzk3XXNlbmQgdXMgYSByZXBvcnQgYWJvdXQgd2hhdCBzZWVtcyB0byBiZSB3cm9uZyBhbmQgd2UnbGwKKyAgIHNlZSB3aGF0IHdlIGNhbiBkby4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjAuIEMtS0VSTUlUIE9OIFBDLUJBU0VEIFVOSVhFUworCisgICBbIFs5OF1Ub3AgXSBbIFs5OV1Db250ZW50cyBdIFsgWzEwMF1TZWN0aW9uIENvbnRlbnRzIF0gWyBbMTAxXU5leHQgXQorCisgICBBbHNvIHNlZTogWzEwMl1odHRwOi8vd3d3LnBjdW5peC5jb20vLgorCisgICBTRUNUSU9OIENPTlRFTlRTCisKKyAgMy4wLjEuIFsxMDNdSW50ZXJydXB0IENvbmZsaWN0cworICAzLjAuMi4gWzEwNF1XaW5kb3dzLVNwZWNpZmljIEhhcmR3YXJlCisgIDMuMC4zLiBbMTA1XU1vZGVtcworICAzLjAuNC4gWzEwNl1DaGFyYWN0ZXIgU2V0cworICAzLjAuNS4gWzEwN11LZXlib2FyZCwgU2NyZWVuLCBhbmQgTW91c2UgQWNjZXNzCisgIDMuMC42LiBbMTA4XUxhcHRvcHMKKworICAzLjAuMS4gSW50ZXJydXB0IENvbmZsaWN0cworCisgICBbIFsxMDldVG9wIF0gWyBbMTEwXUNvbnRlbnRzIF0gWyBbMTExXVNlY3Rpb24gQ29udGVudHMgXSBbIFsxMTJdTmV4dCBdCisKKyAgIFBDcyBhcmUgbm90IHRoZSBiZXN0IHBsYXRmb3JtIGZvciByZWFsIG9wZXJhdGluZyBzeXN0ZW1zIGxpa2UgVW5peC4KKyAgIFRoZSBhcmNoaXRlY3R1cmUgc3VmZmVycyBmcm9tIG51bWVyb3VzIGRlZmljaWVuY2llcywgbm90IHRoZSBsZWFzdCBvZgorICAgd2hpY2ggaXMgdGhlIHN0aWZsaW5nbHkgc21hbGwgbnVtYmVyIG9mIGhhcmR3YXJlIGludGVycnVwdHMgKGVpdGhlciA3CisgICBvciAxNSwgbWFueSBvZiB3aGljaCBhcmUgcHJlYWxsb2NhdGVkKS4gVGh1cyBhZGRpbmcgZGV2aWNlcywgdXNpbmcKKyAgIG11bHRpcGxlIHNlcmlhbCBwb3J0cywgZXRjLCBpcyBhbHdheXMgYSBjaGFsbGVuZ2UgYW5kIG9mdGVuIGEKKyAgIG5pZ2h0bWFyZS4gVGhlIGZyZWUtZm9yLWFsbCBuYXR1cmUgb2YgdGhlIFBDIG1hcmtldCBhbmQgdGhlIGxhY2sgb2YKKyAgIHN0YW5kYXJkcyBjb21iaW5lZCB3aXRoIHRoZSBkaXZlcnNpdHkgb2YgVW5peCBPUyB2ZXJzaW9ucyBtYWtlIGl0CisgICBkaWZmaWN1bHQgdG8gZmluZCBkcml2ZXJzIGZvciBhbnkgcGFydGljdWxhciBkZXZpY2Ugb24gYW55IHBhcnRpY3VsYXIKKyAgIHZlcnNpb24gb2YgVW5peC4KKworICAgT2Ygc3BlY2lhbCBpbnRlcmVzdCB0byBLZXJtaXQgdXNlcnMgaXMgdGhlIGZhY3QgdGhhdCB0aGVyZSBpcyBubworICAgc3RhbmRhcmQgcHJvdmlzaW9uIGluIHRoZSBQQyBhcmNoaXRlY3R1cmUgZm9yIG1vcmUgdGhhbiAyCisgICBjb21tdW5pY2F0aW9uIChzZXJpYWwpIHBvcnRzLiBDT00zIGFuZCBDT000IChvciBoaWdoZXIpIHdpbGwgbm90IHdvcmsKKyAgIHVubGVzcyB5b3UgKGEpIGZpbmQgb3V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIGFuZCBpbnRlcnJ1cHQgZm9yIGVhY2gsCisgICAoYikgZmluZCBvdXQgaG93IHRvIHByb3ZpZGUgeW91ciBVbml4IHZlcnNpb24gd2l0aCB0aGlzIGluZm9ybWF0aW9uLAorICAgYW5kIChjKSBhY3R1YWxseSBzZXQgdXAgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIFVuaXggc3RhcnR1cCBmaWxlcworICAgKG9yIHdoYXRldmVyIG90aGVyIG1ldGhvZCBpcyB1c2VkKS4gV2F0Y2ggb3V0IGZvciBpbnRlcnJ1cHQgY29uZmxpY3RzLAorICAgZXNwZWNpYWxseSB3aGVuIHVzaW5nIGEgc2VyaWFsIG1vdXNlLCBhbmQgZG9uJ3QgZXhwZWN0IHRvIGJlIGFibGUgdG8KKyAgIHVzZSBtb3JlIHRoYW4gdHdvIHNlcmlhbCBwb3J0cy4KKworICAgVGhlIHRlY2huaXF1ZXMgZm9yIHJlc29sdmluZyBpbnRlcnJ1cHQgY29uZmxpY3RzIGFyZSBkaWZmZXJlbnQgZm9yCisgICBlYWNoIG9wZXJhdGluZyBzeXN0ZW0gKExpbnV4LCBOZXRCU0QsIGV0YykuIEluIGdlbmVyYWwsIHRoZXJlIGlzIGEKKyAgIGNvbmZpZ3VyYXRpb24gZmlsZSBzb21ld2hlcmUgdGhhdCBsaXN0cyBDT00gcG9ydHMsIHNvbWV0aGluZyBsaWtlCisgICB0aGlzOgorCisgIGNvbTAgICAgYXQgaXNhPyBwb3J0IDB4M2Y4IGlycSA0ICAgICAgIyBET1MgQ09NMQorICBjb20xICAgIGF0IGlzYT8gcG9ydCAweDJmOCBpcnEgMyAgICAgICMgRE9TIENPTTIKKworICAgVGhlIGFkZHJlc3MgYW5kIElSUSB2YWx1ZXMgaW4gdGhpcyBmaWxlIG11c3QgYWdyZWUgd2l0aCB0aGUgdmFsdWVzIGluCisgICB0aGUgUEMgQklPUyBhbmQgd2l0aCB0aGUgcG9ydHMgdGhlbXNlbHZlcywgYW5kIHRoZXJlIG11c3Qgbm90IGJlIG1vcmUKKyAgIHRoYW4gb25lIGRldmljZSB3aXRoIHRoZSBzYW1lIGludGVycnVwdC4gVW5mb3J0dW5hdGVseSwgZHVlIHRvIHRoZQorICAgc21hbGwgbnVtYmVyIG9mIGF2YWlsYWJsZSBpbnRlcnJ1cHRzLCBpbnN0YWxsaW5nIG5ldyBkZXZpY2VzIG9uIGEgUEMKKyAgIGFsbW9zdCBhbHdheXMgY3JlYXRlcyBhIGNvbmZsaWN0LiBIZXJlIGlzIGEgdHlwaWNhbCB0YWxlIGZyb20gYSBMaW51eAorICAgdXNlciAoRnJlZCBTbWl0aCkgYWJvdXQgaW5zdGFsbGluZyBhIHRoaXJkIHNlcmlhbCBwb3J0OgorCisgICAgIC4uLnByb2JsZW1zIGNhbiBjb21lIGZyb20gYSBudW1iZXIgb2YgY2F1c2VzLiBUaGUgb25lIEkgZm91Z2h0IHdpdGgKKyAgICAgZm9yIHNvbWUgdGltZSwgYW5kIGZpbmFsbHkgY29ucXVlcmVkLCB3YXMgdGhhdCBteSBtb2RlbSBpcyBvbiBhbgorICAgICBhZGQtaW4gc2VyaWFsIHBvcnQsIGN1YTMvSVJRNS4gQnkgZGVmYXVsdCBJUlE1IGhhcyBhIHZlcnkgbG93CisgICAgIHByaW9yaXR5LCBhbmQgZG9lcyBub3QgZ2V0IGVub3VnaCBzZXJ2aWNlIGluIHRpbWVzIHdoZW4gdGhlIHN5c3RlbQorICAgICBpcyBidXN5IHRvIHByZXZlbnQgbG9zaW5nIGRhdGEuIFRoaXMgaW4gdHVybiBjYXVzZXMgbWFueSByZXNlbmRzLgorICAgICBUaGVyZSBhcmUgdHdvICdmaXhlcycgdGhhdCBJIGtub3cgb2YsIG9uZSBpcyB0byByZWxheCBoYXJkIGRpc2sKKyAgICAgaW50ZXJydXB0IGhvZ2dpbmcgYnkgdXNpbmcgdGhlIGNvcnJlY3QgcGFyYW1ldGVyIHRvIGhkcGFybSwgYnV0IEkKKyAgICAgZG9uJ3QgbGlrZSB0aGF0IG9uZSBiZWNhdXNlIHRoZSBoZHBhcm0gbWFuIHBhZ2UgaW5kaWNhdGVzIGl0IGlzCisgICAgIHJpc2t5IHRvIHVzZS4gVGhlIG90aGVyIG9uZSwgdGhlIG9uZSBJIHVzZWQsIHdhcyB0byBnZXQgJ2lycXR1bmUnCisgICAgIGFuZCB1c2UgaXQgdG8gZ2l2ZSBJUlE1IHRoZSBoaWdoZXN0IHByaW9yaXR5IGluc3RlYWQgb2YgbmVhcmx5IHRoZQorICAgICBsb3dlc3QuIENvbXBsZXRlbHkgY3VyZWQgdGhlIHByb2JsZW0uCisKKyAgIEhlcmUncyBhbm90aGVyIG9uZSBmcm9tIGEgbmV3c2dyb3VwIHBvc3Rpbmc6CisKKyAgICAgQWZ0ZXIgbXVjaCBoYWlyIHB1bGxpbmcsIEkndmUgZGlzY292ZXJlZCB3aHkgbXkgc2VyaWFsIHBvcnQgd29uJ3QKKyAgICAgd29yay4gQXBwYXJlbnRseSBteSBbUENdIGhhcyB0aHJlZSBzZXJpYWwgZGV2aWNlcyAodHdvIGNvbW0gcG9ydHMKKyAgICAgYW5kIGFuIElSIHBvcnQpLCBvZiB3aGljaCBvbmx5IHR3byBhdCBhIHRpbWUgY2FuIGJlIGFjdGl2ZS4gSQorICAgICBsb29rZWQgaW4gdGhlIEJJT1Mgc2V0dXAgYW5kIG5vdGljZWQgdGhhdCB0aGUgSVIgcG9ydCB3YXMKKyAgICAgYWN0aXZhdGVkLCBidXQgZGlkbid0IHJlYWxpemUgYXQgdGhlIHRpbWUgdGhhdCB0aGlzIG1lYW50IHRoYXQgQ09NMgorICAgICB3YXMgdGhlcmVieSBkZS1hY3RpdmF0ZWQuIEkgdHVybmVkIG9mZiB0aGUgSVIgcG9ydCBhbmQgbm93IHRoZQorICAgICBzZXJpYWwgcG9ydCB3b3JrcyBhcyBhZHZlcnRpc2VkLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMC4yLiBXaW5kb3dzLVNwZWNpZmljIEhhcmR3YXJlCisKKyAgIFsgWzExM11Ub3AgXSBbIFsxMTRdQ29udGVudHMgXSBbIFsxMTVdU2VjdGlvbiBDb250ZW50cyBdIFsgWzExNl1OZXh0IF0KKyAgIFsgWzExN11QcmV2aW91cyBdCisKKyAgIFRvIGNvbXBsaWNhdGUgbWF0dGVycywgdGhlIFBDIHBsYXRmb3JtIGlzIGJlY29taW5nIGluY3JlYXNpbmdseSBhbmQKKyAgIGluZXhvcmFibHkgV2luZG93cy1vcmllbnRlZC4gTW9yZSBhbmQgbW9yZSBhZGQtb24gZGV2aWNlcyBhcmUgIldpbmRvd3MKKyAgIG9ubHkiIC0tIG1lYW5pbmcgdGhleSBhcmUgaW5jb21wbGV0ZSBhbmQgcmVseSBvbiBwcm9wcmlldGFyeQorICAgV2luZG93cy1iYXNlZCBzb2Z0d2FyZSBkcml2ZXJzIHRvIGRvIHRoZSBqb2JzIHRoYXQgeW91IHdvdWxkIGV4cGVjdAorICAgdGhlIGRldmljZSBpdHNlbGYgdG8gZG8uIFBDTUNJQSwgUENJLCBvciAiUGx1Zy1uLVBsYXkiIGRldmljZXMgYXJlCisgICByYXJlbHkgc3VwcG9ydGVkIG9uIFBDLWJhc2VkIFVuaXggdmVyc2lvbnMgc3VjaCBhcyBTQ087IFdpbm1vZGVtcywKKyAgIFdpbnByaW50ZXJzLCBhbmQgdGhlIGxpa2UgYXJlIG5vdCBzdXBwb3J0ZWQgb24gYW55IFVuaXggdmFyaWV0eSAod2l0aAorICAgWzExOF1hIGZldyBleGNlcHRpb25zKS4gVGhlIHNlbGYtcHJvY2xhaW1lZCBNaWNyb3NvZnQgUEMgOTcgKG9yIGxhdGVyKQorICAgc3RhbmRhcmQgb25seSBtYWtlcyBtYXR0ZXJzIHdvcnNlIHNpbmNlIGl0cyBvbmx5IHB1cnBvc2UgdG8gZW5zdXJlCisgICB0aGF0IFBDcyBhcmUgIm9wdGltaXplZCB0byBydW4gV2luZG93cyA5NSBhbmQgV2luZG93cyBOVCA0LjAgYW5kCisgICBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlc2Ugb3BlcmF0aW5nIHN5c3RlbXMiLgorCisgICBXaXRoIHRoZSBleGNlcHRpb24gbm90ZWQgKHRoZSBMdWNlbnQgbW9kZW0sIHBlcmhhcHMgYSBoYW5kZnVsIG9mCisgICBvdGhlcnMgYnkgdGhlIHRpbWUgeW91IHJlYWQgdGhpcyksIGRyaXZlcnMgZm9yICJXaW4iIGRldmljZXMgYXJlCisgICBhdmFpbGFibGUgb25seSBmb3IgV2luZG93cywgc2luY2UgdGhlIFdpbmRvd3MgbWFya2V0IGR3YXJmcyB0aGF0IG9mCisgICBhbnkgcGFydGljdWxhciBVbml4IGJyYW5kLCBhbmQgZm9yIHRoYXQgbWF0dGVyIGFsbCBVbml4ZXMgKG9yIGZvciB0aGF0CisgICBtYXR0ZXIsIGFsbCBub24tV2luZG93cyBvcGVyYXRpbmcgc3lzdGVtcykgY29tYmluZWQuIElmIHlvdXIgdmVyc2lvbgorICAgb2YgVW5peCAoU0NPLCBMaW51eCwgQlNESSwgRnJlZUJTRCwgZXRjKSBkb2VzIG5vdCBzdXBwb3J0IGEgcGFydGljdWxhcgorICAgZGV2aWNlLCB0aGVuIEMtS2VybWl0IGNhbid0IHVzZSBpdCBlaXRoZXIuIEMtS2VybWl0LCBsaWtlIGFueSBVbml4CisgICBhcHBsaWNhdGlvbiwgbXVzdCBhY2Nlc3MgYWxsIGRldmljZXMgdGhyb3VnaCBkcml2ZXJzIGFuZCBub3QgZGlyZWN0bHkKKyAgIGJlY2F1c2UgVW5peCBpcyBhIHJlYWwgb3BlcmF0aW5nIHN5c3RlbS4KKworICAgRG9uJ3Qgd2FzdGUgdGltZSB0aGlua2luZyB0aGF0IHlvdSwgb3IgYW55Ym9keSBlbHNlLCBjb3VsZCB3cml0ZSBhCisgICBMaW51eCAob3Igb3RoZXIgVW5peCkgZHJpdmVyIGZvciBhIFdpbm1vZGVtIG9yIG90aGVyICJXaW4iIGRldmljZS4KKyAgIEZpcnN0IG9mIGFsbCwgdGhlc2UgZGV2aWNlcyBnZW5lcmFsbHkgcmVxdWlyZSByZWFsdGltZSBjb250cm9sLCBidXQKKyAgIHNpbmNlIFVuaXggaXMgYSB0cnVlIG11bHRpdGFza2luZyBvcGVyYXRpbmcgc3lzdGVtLCByZWFsdGltZSBkZXZpY2UKKyAgIGNvbnRyb2wgaXMgbm90IHBvc3NpYmxlIG91dHNpZGUgdGhlIGtlcm5lbC4gU2Vjb25kLCB0aGUgc3BlY2lmaWNhdGlvbnMKKyAgIGZvciB0aGVzZSBkZXZpY2VzIGFyZSBzZWNyZXQgYW5kIHByb3ByaWV0YXJ5LCBhbmQgZWFjaCBvbmUgKGFuZCBlYWNoCisgICB2ZXJzaW9uIG9mIGVhY2ggb25lKSBpcyBwb3RlbnRpYWxseSBkaWZmZXJlbnQuIFRoaXJkLCBhIFdpbm1vZGVtCisgICBkcml2ZXIgd291bGQgYmUgZW5vcm1vdXNseSBjb21wbGV4OyBpdCB3b3VsZCB0YWtlIHllYXJzIHRvIHdyaXRlIGFuZAorICAgZGVidWcsIGJ5IHdoaWNoIHRpbWUgaXQgd291bGQgYmUgb2Jzb2xldGUuCisKKyAgIEEgbW9yZSByZWNlbnQgZ2VuZXJhdGlvbiBvZiBQQ3MgKGNpcmNhIDE5OTktMjAwMCkgaXMgbWFya2V0ZWQgYXMKKyAgICJMZWdhY3kgRnJlZSIuIE9uZSBjYW4gb25seSBzcGVjdWxhdGUgd2hhdCB0aGF0IGNvdWxkIG1lYW4uIE1vc3QKKyAgIGxpa2VseSBpdCBtZWFucyBpdCB3aWxsIE9OTFkgcnVuIHRoZSB2ZXJ5IGxhdGVzdCB2ZXJzaW9ucyBvZiBXaW5kb3dzLAorICAgYW5kIGlzIG1hZGUgZXhjbHVzaXZlbHkgb2YgV2lubW9kZW1zLCBXaW5wcmludGVycywgV2lubWVtb3J5LCBhbmQKKyAgIFdpbi1DUFUtZmFucyAoTGVnYWN5IEZyZWUgaXMgYSBjb25jZXB0IFsxMTldcGlvbmVlcmVkIGJ5IE1pY3Jvc29mdCkuCisKKyAgIEJlZm9yZSB5b3UgYnV5IGEgbmV3IFBDIG9yIGFkZC1vbiBlcXVpcG1lbnQsIGVzcGVjaWFsbHkgc2VyaWFsIHBvcnRzLAorICAgaW50ZXJuYWwgbW9kZW1zLCBvciBwcmludGVycywgbWFrZSBzdXJlIHRoZXkgYXJlIGNvbXBhdGlibGUgd2l0aCB5b3VyCisgICB2ZXJzaW9uIG9mIFVuaXguIFRoaXMgaXMgYmVjb21pbmcgYW4gZXZlci1ncmVhdGVyIGNoYWxsZW5nZTsgb25seSBhCisgICBodWdlIGNvbXBhbnkgbGlrZSBNaWNyb3NvZnQgY2FuIGFmZm9yZCB0byBiZSBjb25zdGFudGx5IGNyYW5raW5nIG91dAorICAgYW5kL29yIHZlcmlmeWluZyBkcml2ZXJzIGZvciB0aGUgdGhvdXNhbmRzIG9mIHZpZGVvIGJvYXJkcywgc291bmQKKyAgIGNhcmRzLCBuZXR3b3JrIGFkYXB0ZXJzLCBTQ1NJIGFkYXB0ZXJzLCBidXNlcywgZXRjLCB0aGF0IHNwZXcgZm9ydGggaW4KKyAgIGFuIHVuY29udHJvbGxlZCBtYW5uZXIgZnJvbSBhbGwgY29ybmVycyBvZiB0aGUgd29ybGQgb24gYSBkYWlseSBiYXNpcy4KKyAgIFdpdGggdmVyeSBmZXcgZXhjZXB0aW9ucywgbWFrZXJzIG9mIFBDcyBhc3NlbWJsZSB0aGUgdmFyaW91cworICAgY29tcG9uZW50cyBhbmQgdGhlbiB2ZXJpZnkgdGhlbSBvbmx5IHdpdGggV2luZG93cywgd2hpY2ggdGhleSBtdXN0IGRvCisgICBzaW5jZSB0aGV5IGFyZSwgbm8gZG91YnQsIHByZWxvYWRpbmcgdGhlIFBDIHdpdGggV2luZG93cy4gVG8gZmluZCBhCisgICBtb2Rlcm4gUEMgdGhhdCBpcyBjYXBhYmxlIG9mIHJ1bm5pbmcgYSB2YXJpZXR5IG9mIG5vbi1XaW5kb3dzCisgICBvcGVyYXRpbmcgc3lzdGVtcyAoZS5nLiBMaW51eCwgU0NPIE9wZW5TZXJ2ZXIsIFVuaXh3YXJlLCBhbmQgU29sYXJpcykKKyAgIGlzIGEgZm9ybWlkYWJsZSBjaGFsbGVuZ2UgcmVxdWlyaW5nIGNhcmVmdWwgc3R1ZHkgb2YgZWFjaCB2ZW5kb3IncworICAgImNvbXBhdGliaWxpdHkgbGlzdHMiIGFuZCBwcmVjaXNlIGF0dGVudGlvbiB0byBleGFjdCBjb21wb25lbnQgbW9kZWwKKyAgIG51bWJlcnMgYW5kIHJldmlzaW9uIGxldmVscy4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjAuMy4gTW9kZW1zCisKKyAgIFsgWzEyMF1Ub3AgXSBbIFsxMjFdQ29udGVudHMgXSBbIFsxMjJdU2VjdGlvbiBDb250ZW50cyBdIFsgWzEyM11OZXh0IF0KKyAgIFsgWzEyNF1QcmV2aW91cyBdCisKKyAgIEV4dGVybmFsIG1vZGVtcyBhcmUgcmVjb21tZW5kZWQ6CisKKyAgICAgKiBUaGV5IGRvbid0IG5lZWQgYW55IHNwZWNpYWwgZHJpdmVycy4KKyAgICAgKiBZb3UgY2FuIHVzZSB0aGUgbGlnaHRzIGFuZCBzcGVha2VyIHRvIHRyb3VibGVzaG9vdCBkaWFsaW5nLgorICAgICAqIFlvdSBjYW4gc2hhcmUgdGhlbSBhbW9uZyBhbGwgdHlwZXMgb2YgY29tcHV0ZXJzLgorICAgICAqIFlvdSBjYW4gZWFzaWx5IHR1cm4gdGhlbSBvZmYgYW5kIG9uIHdoZW4gcG93ZXItY3ljbGluZyBzZWVtcworICAgICAgIHdhcnJhbnRlZC4KKyAgICAgKiBUaGV5IGFyZSBtb3JlIGxpa2VseSB0byBoYXZlIG1hbnVhbHMuCisKKyAgIEludGVybmFsIFBDIG1vZGVtcyAoZXZlbiB3aGVuIHRoZXkgYXJlIG5vdCBXaW5tb2RlbXMsIHdoaWNoIGlzCisgICBpbmNyZWFzaW5nbHkgdW5saWtlbHkgaW4gbmV3IFBDcykgYXJlIGFsd2F5cyB0cm91YmxlLCBlc3BlY2lhbGx5IGluCisgICBVbml4LiBFdmVuIHdoZW4gdGhleSB3b3JrIGZvciBkaWFsaW5nIG91dCwgdGhleSBtaWdodCBub3Qgd29yayBmb3IKKyAgIGRpYWxpbmcgaW4sIGV0Yy4gUHJvYmxlbXMgdGhhdCBvY2N1ciB3aGVuIHVzaW5nIGFuIGludGVybmFsIG1vZGVtIGNhbgorICAgYWxtb3N0IGFsd2F5cyBiZSBlbGltaW5hdGVkIGJ5IHN3aXRjaGluZyB0byBhbiBleHRlcm5hbCBvbmUuIEV2ZW4gd2hlbgorICAgYW4gaW50ZXJuYWwgbW9kZW0gaXMgbm90IGEgV2lubW9kZW0gb3IgUGx1Zy1uLVBsYXksIGl0IGlzIG9mdGVuIGEKKyAgIG5vLW5hbWUgbW9kZWwgb2YgdW5rbm93biBxdWFsaXR5IC0tIG5vdCB0aGUgc29ydCBvZiB0aGluZyB5b3Ugd2FudAorICAgc2l0dGluZyBkaXJlY3RseSBvbiB5b3VyIGNvbXB1dGVyJ3MgYnVzLiAoRXZlbiBpZiBpdCBkb2VzIG5vdCBjYXVzZQorICAgaGFyZHdhcmUgcHJvYmxlbXMsIGl0IHByb2JhYmx5IGNhbWUgd2l0aG91dCBhIGNvbW1hbmQgbGlzdCwgc28gbm8gVW5peAorICAgc29mdHdhcmUgd2lsbCBrbm93IGhvdyB0byBjb250cm9sIGl0LikgRm9yIG1vcmUgYWJvdXQgVW5peCBjb21wYXRpYmxlCisgICBtb2RlbXMsIHNlZToKKworICBbMTI1XWh0dHA6Ly93d3cuaWRpci5uZXQvfmdyb21pdGtjL3dpbm1vZGVtLmh0bWwKKworICAgUmVtZW1iZXIgdGhhdCBQQ3MsIGV2ZW4gbm93IC0tIG1vcmUgdGhhbiB0d28gZGVjYWRlcyBhZnRlciB0aGV5IHdlcmUKKyAgIGZpcnN0IGludHJvZHVjZWQgLS0gYXJlIG5vdCAoaW4gZ2VuZXJhbCkgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIG1vcmUKKyAgIHRoYW4gMiBzZXJpYWwgZGV2aWNlcy4gSGVyZSdzIGEgc2hvcnQgc3VjY2VzcyBzdG9yeSBmcm9tIGEgcmVjZW50CisgICBuZXdzZ3JvdXAgcG9zdGluZzogIkkgaGF2ZSBhIERpYW1vbmQgU3VwcmFTb25pYyBJSSBkdWFsIG1vZGVtIGluIG15CisgICBtYWNoaW5lLiBXaGF0IEkgaGFkIHRvIGVuZCB1cCBkb2luZyBpcyBidXlpbmcgYSBQUy8yIG1vdXNlIGFuZCBwb3J0CisgICBhbmQgaW5zdGFsbCBpdC4gSGFkIHRvIGdldCByaWQgb2YgbXkgc2VyaWFsIG1vdXNlLiBJIGFsc28gaGFkIHRvCisgICBkaXNhYmxlIFBuUCBpbiBteSBjb21wdXRlciBiaW9zLiBJIHdhcyBoYXZpbmcgSVJRIGNvbmZsaWN0cyBiZXR3ZWVuIG15CisgICBzZXJpYWwgbW91c2UgYW5kICdjb20gMycuIEJvdGggbW9kZW1zIHdvcmsgZmluZSBmb3IgbWUuIE15IGZpcnN0IG1vZGVtCisgICBpcyB0dHlTMCBhbmQgbXkgc2Vjb25kIGlzIHR0eVMxLiIgU3BlY2lhbCB0aGlyZC1wYXJ0eSBtdWx0aXBvcnQgYm9hcmRzCisgICBzdWNoIGFzIFsxMjZdRGlnaUJvYXJkIGFyZSBhdmFpbGFibGUgZm9yIGNlcnRhaW4gVW5peCBwbGF0Zm9ybXMKKyAgICh0eXBpY2FsbHkgU0NPLCBtYXliZSBMaW51eCkgdGhhdCBjb21lIHdpdGggc3BlY2lhbCBwbGF0Zm9ybS1zcGVjaWZpYworICAgZHJpdmVycy4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjAuNC4gQ2hhcmFjdGVyIFNldHMKKworICAgWyBbMTI3XVRvcCBdIFsgWzEyOF1Db250ZW50cyBdIFsgWzEyOV1TZWN0aW9uIENvbnRlbnRzIF0gWyBbMTMwXU5leHQgXQorICAgWyBbMTMxXVByZXZpb3VzIF0KKworICAgUENzIGdlbmVyYWxseSBoYXZlIFBDIGNvZGUgcGFnZXMgc3VjaCBhcyBDUDQzNyBvciBDUDg1MCwgYW5kIHRoZXNlIGFyZQorICAgb2Z0ZW4gdXNlZCBieSBQQy1iYXNlZCBVbml4IG9wZXJhdGluZyBzeXN0ZW1zLCBwYXJ0aWN1bGFybHkgb24gdGhlCisgICBjb25zb2xlLiBUaGVzZSBhcmUgc3VwcG9ydGVkIGRpcmVjdGx5IGJ5IEMtS2VybWl0J3MgU0VUIEZJTEUKKyAgIENIQVJBQ1RFUi1TRVQgYW5kIFNFVCBURVJNSU5BTCBDSEFSQUNURVItU0VUIGNvbW1hbmRzLiBTb21lIFBDLWJhc2VkCisgICBVbml4IHZlcnNpb25zLCBzdWNoIGFzIHJlY2VudCBSZWQgSGF0IExpbnV4IHJlbGVhc2VzLCBtaWdodCBhbHNvCisgICBzdXBwb3J0IE1pY3Jvc29mdCBXaW5kb3dzIGNvZGUgcGFnZXMgc3VjaCBhcyBDUDEyNTIsIG9yIGV2ZW4gTGF0aW4KKyAgIEFscGhhYmV0IDEgaXRzZWxmIChwZXJoYXBzIGRpc3BsYXllZCB3aXRoIENQNDM3IGdseXBocykuIChBbmQgd29yayBpcworICAgaW4gcHJvZ3Jlc3MgdG8gc3VwcG9ydCBVbmljb2RlIFVURjggaW4gTGludXguKQorCisgICBDZXJ0YWluIFdpbmRvd3MgY29kZSBwYWdlcyBhcmUgbm90IHN1cHBvcnRlZCBkaXJlY3RseSBieSBDLUtlcm1pdCwgYnV0CisgICBzaW5jZSB0aGV5IGFyZSBJU08gTGF0aW4gQWxwaGFiZXRzIHdpdGggbm9uc3RhbmRhcmQgImV4dGVuc2lvbnMiIGluCisgICB0aGUgQzEgY29udHJvbCByYW5nZSwgeW91IGNhbiBzdWJzdGl0dXRlIHRoZSBjb3JyZXNwb25kaW5nIExhdGluCisgICBhbHBoYWJldCAob3Igb3RoZXIgY2hhcmFjdGVyIHNldCkgaW4gYW55IEMtS2VybWl0IGNoYXJhY3Rlci1zZXQKKyAgIHJlbGF0ZWQgY29tbWFuZHM6CisKKyAgV2luZG93cyBDb2RlIFBhZ2UgICAgU3Vic3RpdHV0aW9uCisgICBDUCAxMDA0ICAgICAgICAgICAgICBMYXRpbi0xCisgICBDUCAxMDUxICAgICAgICAgICAgICBIUCBSb21hbi04CisKKyAgIE90aGVyIFdpbmRvd3MgY29kZSBwYWdlcyBhcmUgbW9zdGx5IChvciB0b3RhbGx5KSBpbmNvbXBhdGlibGUgd2l0aAorICAgdGhlaXIgTGF0aW4gQWxwaGFiZXQgY291bnRlcnBhcnRzIChlLmcuIENQMTI1MCBhbmQgTGF0aW4tMiksIGFuZAorICAgc2V2ZXJhbCBvZiB0aGVzZSBhcmUgYWxyZWFkeSBzdXBwb3J0ZWQgYnkgQy1LZXJtaXQgNy4wIGFuZCBsYXRlcgorICAgKDEyNTAsIDEyNTEsIGFuZCAxMjUyKS4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjAuNS4gS2V5Ym9hcmQsIFNjcmVlbiwgYW5kIE1vdXNlIEFjY2VzcworCisgICBbIFsxMzJdVG9wIF0gWyBbMTMzXUNvbnRlbnRzIF0gWyBbMTM0XVNlY3Rpb24gQ29udGVudHMgXSBbIFsxMzVdTmV4dCBdCisgICBbIFsxMzZdUHJldmlvdXMgXQorCisgICBGaW5hbGx5LCBub3RlIHRoYXQgYXMgYSByZWFsIG9wZXJhdGluZyBzeXN0ZW0sIFVuaXggKHVubGlrZSBXaW5kb3dzKQorICAgZG9lcyBub3QgcHJvdmlkZSB0aGUgaW50aW1hdGUgY29ubmVjdGlvbiB0byB0aGUgUEMga2V5Ym9hcmQsIHNjcmVlbiwKKyAgIGFuZCBtb3VzZSB0aGF0IHlvdSBtaWdodCBleHBlY3QuIFVuaXggYXBwbGljYXRpb25zIGNhbiBub3QgInNlZSIgdGhlCisgICBrZXlib2FyZCwgYW5kIHRoZXJlZm9yZSBjYW4gbm90IGJlIHByb2dyYW1tZWQgdG8gdW5kZXJzdGFuZCBGLWtleXMsCisgICBFZGl0aW5nIGtleXMsIEFycm93IGtleXMsIEFsdC1rZXkgY29tYmluYXRpb25zLCBhbmQgdGhlIGxpa2UuIFRoaXMgaXMKKyAgIGJlY2F1c2U6CisKKyAgICBhLiBVbml4IGlzIGEgcG9ydGFibGUgb3BlcmF0aW5nIHN5c3RlbSwgbm90IG9ubHkgZm9yIFBDczsKKyAgICBiLiBVbml4IHNlc3Npb25zIGNhbiBjb21lIGZyb20gYW55d2hlcmUsIG5vdCBqdXN0IHRoZSBQQydzIG93bgorICAgICAgIGtleWJvYXJkIGFuZCBzY3JlZW47IGFuZDoKKyAgICBjLiBldmVuIHRob3VnaCBpdCBtaWdodCBiZSBwb3NzaWJsZSBmb3IgYW4gYXBwbGljYXRpb24gdGhhdCBhY3R1YWxseQorICAgICAgIGlzIHJ1bm5pbmcgb24gdGhlIFBDJ3Mga2V5Ym9hcmQgYW5kIHNjcmVlbiB0byBhY2Nlc3MgdGhlc2UgZGV2aWNlcworICAgICAgIGRpcmVjdGx5LCB0aGVyZSBhcmUgbm8gQVBJcyAob3V0c2lkZSBvZiBYKSBmb3IgdGhpcy4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjAuNi4gTGFwdG9wcworCisgICBbIFsxMzddVG9wIF0gWyBbMTM4XUNvbnRlbnRzIF0gWyBbMTM5XVNlY3Rpb24gQ29udGVudHMgXSBbCisgICBbMTQwXVByZXZpb3VzIF0KKworICAgKFRvIGJlIGZpbGxlZCBpbiAuIC4gLikKKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjEuIEMtS0VSTUlUIEFORCBBSVgKKworICAgWyBbMTQxXVRvcCBdIFsgWzE0Ml1Db250ZW50cyBdIFsgWzE0M11TZWN0aW9uIENvbnRlbnRzIF0gWyBbMTQ0XU5leHQgXQorICAgWyBbMTQ1XVByZXZpb3VzIF0KKworICAgU0VDVElPTiBDT05URU5UUworCisgIDMuMS4xLiBbMTQ2XUFJWDogR2VuZXJhbAorICAzLjEuMi4gWzE0N11BSVg6IE5ldHdvcmsgQ29ubmVjdGlvbnMKKyAgMy4xLjMuIFsxNDhdQUlYOiBTZXJpYWwgQ29ubmVjdGlvbnMKKyAgMy4xLjQuIFsxNDldQUlYOiBGaWxlIFRyYW5zZmVyCisgIDMuMS41LiBbMTUwXUFJWDogWHRlcm0gS2V5IE1hcAorCisgICBGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzZWU6CisgICAgICogWzE1MV1odHRwOi8vd3d3LmVtZXJzb24uZW1vcnkuZWR1L3NlcnZpY2VzL2FpeC1mYXEvCisgICAgICogWzE1Ml1odHRwOi8vd3d3LmZhcXMub3JnL2ZhcXMvYnktbmV3c2dyb3VwL2NvbXAvY29tcC51bml4LmFpeC5odG1sCisgICAgICogWzE1M11odHRwOi8vd3d3LmNpcy5vaGlvLXN0YXRlLmVkdS9oeXBlcnRleHQvZmFxL3VzZW5ldC9haXgtZmFxL3RvCisgICAgICAgcC5odG1sCisgICAgICogWzE1NF1odHRwOi8vYWl4cGRzbGliLnNlYXMudWNsYS5lZHUvCisgICAgICogWzE1NV1odHRwOi8vd3d3LnJvb3R2Zy5uZXQgKEFJWCBoaXN0b3J5KQorICAgICAqIFsxNTZdZnRwOi8vcnRmbS5taXQuZWR1L3B1Yi91c2VuZXQvbmV3cy5hbnN3ZXJzL2FpeC1mYXEvcGFydDEKKyAgICAgKiBbMTU3XWZ0cDovL21pcnJvcnMuYW9sLmNvbS9wdWIvcnRmbS91c2VuZXQtYnktaGllcmFyY2h5L2NvbXAvdW5peC8KKyAgICAgICBhaXgKKworICAgYW5kL29yIHJlYWQgdGhlIFsxNThdY29tcC51bml4LmFpeCBuZXdzZ3JvdXAuCisgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAzLjEuMS4gQUlYOiBHZW5lcmFsCisKKyAgIFsgWzE1OV1Ub3AgXSBbIFsxNjBdQ29udGVudHMgXSBbIFsxNjFdU2VjdGlvbiBDb250ZW50cyBdIFsgWzE2Ml1OZXh0IF0KKworICAgQWJvdXQgQUlYIHZlcnNpb24gbnVtYmVyczogInVuYW1lIC1hIiB0ZWxscyB0aGUgdHdvLWRpZ2l0IHZlcnNpb24KKyAgIG51bWJlciwgc3VjaCBhcyAzLjIgb3IgNC4xLiBUaGUgdGhyZWUtZGlnaXQgZm9ybSBjYW4gYmUgc2VlbiB3aXRoIHRoZQorICAgIm9zbGV2ZWwiIGNvbW1hbmQgKHRoaXMgaW5mb3JtYXRpb24gaXMgdW5hdmFpbGFibGUgYXQgdGhlIEFQSSBsZXZlbAorICAgYW5kIGlzIHJlcG9ydGVkbHkgb2J0YWluZWQgYnkgc2Nhbm5pbmcgdGhlIGluc3RhbGxlZCBwYXRjaCBsaXN0KS4KKyAgIFN1cHBvc2VkbHkgYWxsIHRocmVlLWRpZ2l0IHZlcnNpb25zIHdpdGhpbiB0aGUgc2FtZSB0d28tZGlnaXQgdmVyc2lvbgorICAgKGUuZy4gNC4zLjEsIDQuMy4yKSBhcmUgYmluYXJ5IGNvbXBhdGlibGU7IGkuZS4gYSBiaW5hcnkgYnVpbHQgb24gYW55CisgICBvbmUgb2YgdGhlbSBzaG91bGQgcnVuIG9uIGFsbCBvdGhlcnMsIGJ1dCB3aG8ga25vd3MuIE1vc3QgQUlYCisgICBhZHZvY2F0ZXMgdGVsbCB5b3UgdGhhdCBhbnkgQUlYIGJpbmFyeSB3aWxsIHJ1biBvbiBhbnkgQUlYIHZlcnNpb24KKyAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgb25lIHVuZGVyIHdoaWNoIGl0IHdhcyBidWlsdCwgYnV0CisgICBleHBlcmllbmNlIHdpdGggQy1LZXJtaXQgc3VnZ2VzdHMgb3RoZXJ3aXNlLiBJdCBpcyBhbHdheXMgYmVzdCB0byBydW4KKyAgIGEgYmluYXJ5IGJ1aWx0IHVuZGVyIHlvdXIgZXhhY3Qgc2FtZSBBSVggdmVyc2lvbiwgZG93biB0byB0aGUgdGhpcmQKKyAgIGRlY2ltYWwgcGxhY2UsIGlmIHBvc3NpYmxlLiBJZGVhbGx5LCBidWlsZCBpdCBmcm9tIHNvdXJjZSBjb2RlCisgICB5b3Vyc2VsZi4gWWVzLCB0aGlzIGFkdmljZSB3b3VsZCBiZSBlYXNpZXIgdG8gZm9sbG93IGlmIEFJWCBjYW1lIHdpdGgKKyAgIGEgQyBjb21waWxlci4KKyAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDMuMS4yLiBBSVg6IE5ldHdvcmsgQ29ubmVjdGlvbnMKKworICAgWyBbMTYzXVRvcCBdIFsgWzE2NF1Db250ZW50cyBdIFsgWzE2NV1TZWN0aW9uIENvbnRlbnRzIF0gWyBbMTY2XU5leHQgXQorICAgWyBbMTY3XVByZXZpb3VzIF0KKworICAgRmlsZSB0cmFuc2ZlcnMgaW50byBBSVggNC4yIG9yIDQuMyB0aHJvdWdoIHRoZSBBSVggVGVsbmV0IG9yIFJsb2dpbgorICAgc2VydmVyIGhhdmUgYmVlbiBvYnNlcnZlZCB0byBmYWlsIChvciBhY2N1bXVsYXRlIGh1Z2UgbnVtYmVycyBvZgorICAgY29ycmVjdGFibGUgZXJyb3JzLCBvciBldmVuIGRpc2Nvbm5lY3QgdGhlIHNlc3Npb24pLCB3aGVuIGV4YWN0bHkgdGhlCisgICBzYW1lIGtpbmQgb2YgdHJhbnNmZXJzIGludG8gQUlYIDQuMSB3b3JrIHdpdGhvdXQgaW5jaWRlbnQsIGFzIGRvIHN1Y2gKKyAgIHRyYW5zZmVycyBpbnRvIGFsbCBub24tQUlYIHBsYXRmb3JtcyBvbiB0aGUgc2FtZSBraW5kIG9mIGNvbm5lY3Rpb25zCisgICAod2l0aCBhIGZldyBleGNlcHRpb25zIG5vdGVkIGVsc2V3aGVyZSBpbiB0aGlzIGRvY3VtZW50KS4gQUlYIDQuMy4zCisgICBzZWVtcyB0byBiZSBwYXJ0aWN1bGFybHkgZnJhZ2lsZSBpbiB0aGlzIHJlZ2FyZDsgdGhlIHdlYWtuZXNzIHNlZW1zIHRvCisgICBiZSBpbiBpdHMgcHNldWRvdGVybWluYWwgKHB0eSkgZHJpdmVyLiBIaWdoLXNwZWVkIHN0cmVhbWluZyB0cmFuc2ZlcnMKKyAgIHdvcmsgcGVyZmVjdGx5LCBob3dldmVyLCBpZiB0aGUgQUlYIFRlbG5ldCBzZXJ2ZXIgYW5kIHB0eSBkcml2ZXIgYXJlCisgICByZW1vdmVkIGZyb20gdGhlIHBpY3R1cmU7IGUuZywgYnkgdXNpbmcgInNldCBob3N0ICogMzAwMCIgb24gQUlYLgorCisgICBUaGUgcHJvYmxlbSBjYW4gYmUgY29tcGxldGVseSBjdXJlZCBieSByZXBsYWNpbmcgdGhlIElCTSBUZWxuZXQgc2VydmVyCisgICB3aXRoIFsxNjhdTUlUJ3MgS2VyYmVyb3MgVGVsbmV0IHNlcnZlciAtLSBldmVuIGlmIHlvdSBkb24ndCBhY3R1YWxseQorICAgdXNlIHRoZSBLZXJiZXJvcyBwYXJ0LiBEaWFnbm9zaXM6IEFJWCBwc2V1ZG90ZXJtaW5hbHMgKHdoaWNoIGFyZQorICAgY29udHJvbGxlZCBieSB0aGUgVGVsbmV0IHNlcnZlciB0byBnaXZlIHlvdSBhIGxvZ2luIHRlcm1pbmFsIGZvciB5b3VyCisgICBzZXNzaW9uKSBoYXZlIHF1aXJrcyB0aGF0IG5vdCBldmVuIElCTSBrbm93cyBhYm91dC4gVGhlIHNpdHVhdGlvbiB3aXRoCisgICBBSVggNS54IGlzIG5vdCBrbm93biwgYnV0IGlmIGl0IGhhcyB0aGUgc2FtZSBwcm9ibGVtLCB0aGUgc2FtZSBjdXJlIGlzCisgICBhdmFpbGFibGUuCisKKyAgIE1lYW53aGlsZSwgdGhlIG9ubHkgcmVtZWR5IHdoZW4gZ29pbmcgdGhyb3VnaCB0aGUgSUJNIFRlbG5ldCBzZXJ2ZXIgaXMKKyAgIHRvIGN1dCBiYWNrIG9uIEtlcm1pdCdzIHBlcmZvcm1hbmNlIHNldHRpbmdzIHVudGlsIHlvdSBmaW5kIGEKKyAgIGNvbWJpbmF0aW9uIHRoYXQgd29ya3M6CisKKyAgICAgKiBTRVQgU1RSRUFNSU5HIE9GRgorICAgICAqIFNFVCBXSU5ET1ctU0laRSBzbWFsbC1udW1iZXIKKyAgICAgKiBTRVQgeyBTRU5ELCBSRUNFSVZFIH0gUEFDS0VULUxFTkdUSCBzbWFsbC1udW1iZXIKKyAgICAgKiBTRVQgUFJFRklYSU5HIHsgQ0FVVElPVVMsIEFMTCB9CisKKyAgIEluIHNvbWUgY2FzZXMsIHNldmVyZSBjdXRiYWNrcyBhcmUgcmVxdWlyZWQsIGUuZy4gdGhvc2UgaW1wbGllZCBieSB0aGUKKyAgIFJPQlVTVCBjb21tYW5kLiBBbHNvIGJlIHN1cmUgdGhhdCB0aGUgQUlYIEMtS2VybWl0IG9uIHRoZSByZW1vdGUgZW5kCisgICBoYXMgInNldCBmbG93IG5vbmUiICh3aGljaCBpcyB0aGUgZGVmYXVsdCkuIE5PVEU6IE1heWJlIHRoaXMgb25lIGNhbgorICAgYWxzbyBiZSBhZGRyZXNzZWQgYnkgc3RhcnRpbmcgQUlYIHRlbG5ldGQgd2l0aCB0aGUgIi1hIiBvcHRpb24uIFRoZQorICAgc2l0dWF0aW9uIHdpdGggU1NIIGNvbm5lY3Rpb25zIGlzIG5vdCBrbm93biwgYnV0IGFsbW9zdCBjZXJ0YWlubHkgdGhlCisgICBzYW1lLgorCisgICBXaGVuIHRoZXNlIHByb2JsZW1zIG9jY3VyLCB0aGUgc3lzdGVtIGVycm9yIGxvZyBjb250YWluczoKKworICBMQUJFTDogICAgICAgICAgVFRZX1RUWUhPRworICBJREVOVElGSUVSOiAgICAgMDg3M0NGOUYKKyAgVHlwZTogICAgICAgICAgIFRFTVAKKyAgUmVzb3VyY2UgTmFtZTogIHB0cy8xCisKKyAgRGVzY3JpcHRpb24KKyAgVFRZSE9HIE9WRVItUlVOCisKKyAgRmFpbHVyZSBDYXVzZXMKKyAgRVhDRVNTSVZFIExPQUQgT04gUFJPQ0VTU09SCisKKyAgUmVjb21tZW5kZWQgQWN0aW9ucworICBSRURVQ0UgU1lTVEVNIExPQUQuCisgIFJFRFVDRSBTRVJJQUwgUE9SVCBCQVVEIFJBVEUKKworICAgQmVmb3JlIGxlYXZpbmcgdGhlIHRvcGljIG9mIEFJWCBwc2V1ZG90ZXJtaW5hbHMsIGl0IGlzIHZlcnkgbGlrZWx5CisgICB0aGF0IEtlcm1pdCdzIFBUWSBhbmQgU1NIIGNvbW1hbmRzIGRvIG5vdCB3b3JrIHdlbGwgZWl0aGVyLCBmb3IgdGhlCisgICBzYW1lIHJlYXNvbiB0aGF0IFRlbG5ldCBjb25uZWN0aW9ucyBpbnRvIEFJWCBkb24ndCB3b3JrIHdlbGwuIEEgYnJpZWYKKyAgIHRlc3Qgd2l0aCAicHR5IHJsb2dpbiBzb21laG9zdCIgZ290IGEgcGVyZmVjdGx5IHVzYWJsZSB0ZXJtaW5hbAorICAgKENPTk5FQ1QpIHNlc3Npb24sIGJ1dCBmaWxlLXRyYW5zZmVyIHByb2JsZW1zIGxpa2UgdGhvc2UganVzdAorICAgZGVzY3JpYmVkLgorCisgICBSZXBvcnRlZGx5LCB0ZWxuZXQgZnJvbSBBSVggNC4xLXBvaW50LXNvbWV0aGluZyB0byBub24tVGVsbmV0IHBvcnRzCisgICBkb2VzIG5vdCB3b3JrIHVubGVzcyB0aGUgcG9ydCBudW1iZXIgaXMgaW4gdGhlIC9ldGMvc2VydmljZXMgZmlsZTsKKyAgIGl0J3Mgbm90IGNsZWFyIGZyb20gdGhlIHJlcG9ydCB3aGV0aGVyIHRoaXMgaXMgYSBwcm9ibGVtIHdpdGggQUlYCisgICBUZWxuZXQgKGluIHdoaWNoIGNhc2UgaXQgd291bGQgbm90IGFmZmVjdCBLZXJtaXQpLCBvciB3aXRoIHRoZSBzb2NrZXRzCisgICBsaWJyYXJ5IChpbiB3aGljaCBjYXNlIGl0IHdvdWxkKS4gVGhlIHB1cnBvcnRlZCBmaXggaXMgSUJNIEFQQVIKKyAgIElYNjE1MjMuCisKKyAgIEMtS2VybWl0IFNFVCBIT1NUIG9yIFRFTE5FVCBmcm9tIG9uZSBBSVggMy4xIChvciBlYXJsaWVyKSBzeXN0ZW0gdG8KKyAgIGFub3RoZXIgd29uJ3Qgd29yayByaWdodCB1bmxlc3MgeW91IHNldCB5b3VyIGxvY2FsIHRlcm1pbmFsIHR5cGUgdG8KKyAgIHNvbWV0aGluZyBvdGhlciB0aGFuIEFJWFRFUk0uIFdoZW4geW91ciB0ZXJtaW5hbCB0eXBlIGlzIEFJWFRFUk0sIEFJWAorICAgVEVMTkVUIHNlbmRzIHR3byBlc2NhcGVzIHdoZW5ldmVyIHlvdSB0eXBlIG9uZSwgYW5kIHRoZSBBSVggdGVsbmV0CisgICBzZXJ2ZXIgc3dhbGxvd3Mgb25lIG9mIHRoZW0uIFRoaXMgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIHRoZSAiaGZ0IgorICAgZGV2aWNlLiBUaGlzIGJlaGF2aW9yIHNlZW1zIHRvIGJlIHJlbW92ZWQgaW4gQUlYIDMuMiBhbmQgbGF0ZXIuCisgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAzLjEuMy4gQUlYOiBTZXJpYWwgQ29ubmVjdGlvbnMKKworICAgWyBbMTY5XVRvcCBdIFsgWzE3MF1Db250ZW50cyBdIFsgWzE3MV1TZWN0aW9uIENvbnRlbnRzIF0gWyBbMTcyXU5leHQgXQorICAgWyBbMTczXVByZXZpb3VzIF0KKworICAgSW4gQUlYIDMsIDQsIG9yIDUsIEMtS2VybWl0IHdvbid0IGJlIGFibGUgdG8gInNldCBsaW5lIC9kZXYvdHR5MCIgKG9yCisgICBhbnkgb3RoZXIgZGlhbG91dCBkZXZpY2UpIGlmIHlvdSBoYXZlbid0IGluc3RhbGxlZCAiY3UiIG9yICJ1dWNwIiBvbgorICAgeW91ciBzeXN0ZW0sIGJlY2F1c2UgaW5zdGFsbGluZyB0aGVzZSBpcyB3aGF0IGNyZWF0ZXMgdGhlIFVVQ1AKKyAgIGxvY2tmaWxlIGRpcmVjdG9yeS4gSWYgU0VUIExJTkUgY29tbWFuZHMgYWx3YXlzIHJlc3VsdCBpbiAiU29ycnksCisgICBhY2Nlc3MgdG8gbG9jayBkZW5pZWQiLCBldmVuIHdoZW4gQy1LZXJtaXQgaGFzIGJlZW4gZ2l2ZW4gdGhlIHNhbWUKKyAgIG93bmVyLCBncm91cCwgYW5kIHBlcm1pc3Npb25zIGFzIGN1OgorCisgIC1yLXNyLXhyLXggICAxIHV1Y3AgICAgIHV1Y3AgICAgICAgNjcyMTYgSnVsIDI3IDE5OTkgIGN1CisKKyAgIGFuZCBldmVuIHdoZW4geW91IHJ1biBpdCBhcyByb290LCB0aGVuIHlvdSBtdXN0IGdvIGJhY2sgYW5kIGluc3RhbGwKKyAgICJjdSIgZnJvbSB5b3VyIEFJWCBpbnN0YWxsYXRpb24gbWVkaWEuCisKKyAgIEFjY29yZGluZyB0byBJQk0ncyAiRnJvbSBTdHJlbmd0aCB0byBTdHJlbmd0aCIgZG9jdW1lbnQgKDIxIEFwcmlsCisgICAxOTk4KSwgaW4gQUlYIDQuMiBhbmQgbGF0ZXIgIkFzeW5jIHN1cHBvcnRzIHNwZWVkcyBvbiBuYXRpdmUgc2VyaWFsCisgICBwb3J0cyB1cCB0byAxMTUuMmticHMiLiBIb3dldmVyLCBubyBBUEkgaXMgZG9jdW1lbnRlZCB0byBhY2hpZXZlCisgICBzZXJpYWwgc3BlZWRzIGhpZ2hlciB0aGFuIDM4NDAwIGJwcy4gQXBwYXJlbnRseSB0aGUgd2F5IHRvIGRvIHRoaXMgLS0KKyAgIHdoaWNoIG1pZ2h0IG9yIG1pZ2h0IG5vdCB3b3JrIG9ubHkgb24gdGhlIElCTSAxMjgtcG9ydCBtdWx0aXBsZXhlciAtLQorICAgaXM6CisKKyAgY3htYS1zdHR5IGZhc3RiYXVkIC9kZXYvdHR5MAorCisgICB3aGljaCwgYWNjb3JkaW5nIHRvICJtYW4gY3htYS1zdHR5IjoKKworICAgICBmYXN0YmF1ZCBBbHRlcnMgdGhlIGJhdWQgcmF0ZSB0YWJsZSwgc28gNTAgYmF1ZCBiZWNvbWVzIDU3NjAwIGJhdWQuCisgICAgIC1mYXN0YmF1ZCBSZXN0b3JlcyB0aGUgYmF1ZCByYXRlIHRhYmxlLCBzbyA1NzYwMCBiYXVkIGJlY29tZXMgNTAKKyAgICAgYmF1ZC4KKworICAgUHJlc3VtYWJseSAoYnV0IG5vdCBjZXJ0YWlubHkpIHRoaXMgZXh0cmFwb2xhdGVzIHRvIDExMCAiYmF1ZCIgYmVjb21lcworICAgNzY4MDAgYnBzLCBhbmQgMTUwIGJlY29tZXMgMTE1MjAwIGJwcy4gU28gdG8gdXNlIGhpZ2ggc2VyaWFsIHNwZWVkcyBpbgorICAgQUlYIDQuMiBvciA0LjMsIHRoZSB0cmljayB3b3VsZCBiZSB0byBnaXZlIHRoZSAiY3htYS1zdHR5IGZhc3RiYXVkIgorICAgY29tbWFuZCBmb3IgdGhlIGRlc2lyZWQgdHR5IGRldmljZSBiZWZvcmUgc3RhcnRpbmcgS2VybWl0LCBhbmQgdGhlbgorICAgdXNlICJzZXQgc3BlZWQgNTAiLCAic2V0IHNwZWVkIDExMCIsIG9yICJzZXQgc3BlZWQgMTUwIiB0byBzZWxlY3QKKyAgIDU2NzAwLCA3NjgwMCwgb3IgMTE1MjAwIGJwcy4gSXQgaXMgbm90IGtub3duIHdoZXRoZXIgY3htYS1zdHR5CisgICByZXF1aXJlcyBwcml2aWxlZ2UuCisKKyAgIEFjY29yZGluZyB0byBvbmUgcmVwb3J0LCAiRnVydGhlciBpbnZlc3RpZ2F0aW9uIHdpdGggSUJNIHNlZW1zIHRvCisgICBpbmRpY2F0ZSB0aGF0IHRoZSBvbmx5IGhhcmR3YXJlIGNhcGFibGUgb2YgZG9pbmcgdGhpcyBpcyB0aGUgMTI4LXBvcnQKKyAgIG11bHRpcGxleG9yIHdpdGggb25lIChvciBtb3JlKSBvZiB0aGUgMTYgcG9ydCBicmVha291dCBjYWJsZXMKKyAgIChFbmhhbmNlZCBSZW1vdGUgQXN5bmMgTm9kZSAxNi1Qb3J0IEVJQS0yMzIpLiBXZSBhcmUgbG9va2luZyBhdCBhYm91dAorICAgQ0ROJDQsMDAwIGluIGhhcmR3YXJlIGp1c3QgdG8gaGFuZyBhIDU2a2IgbW9kZW0gb24gdGhlcmUuIE9mIGNvdXJzZSwKKyAgIHdlIGNhbiB0aGVuIGhhbmcgMTUgbW9yZSwgaWYgd2Ugd2FudC4gVGhpcyBoYXJkd2FyZSBjb21ibyBpcyBkZXNjcmliZWQKKyAgIHRvIGJlIGdvb2QgdG8gMjMwLjRrYnBzLiIKKworICAgQW5vdGhlciByZXBvcnQgc2F5cyAocXVvdGUgZnJvbSBBSVggbmV3c2dyb3VwLCBNYXJjaCAxOTk5KToKKworICAgICBUaGUgbWFjaGluZSB0eXBlIGFuZCB0aGUgYWRhcHRlciBkZXRlcm1pbmUgdGhlIHNwZWVkIHRoYXQgb25lIGNhbgorICAgICBhY3R1YWxseSBydW4gYXQuIFRoZSBvbGRlciBtaWNyb2NoYW5uZWwgbWFjaGluZXMgaGF2ZSBtdWNoIHNsb3dlcgorICAgICBjcnlzdGFsIGZyZXF1ZW5jaWVzIGFuZCBtYXkgbm90IGdvIGJleW9uZCA3Niw4MDAuIEEgZmVhdHVyZSBwdXQKKyAgICAgaW50byBBSVggNDIxIGFsbG93cyBvbmUgdG8ga2V5IGluIG5vbi1QT1NJWCBiYXVkIHJhdGVzIGFuZCBpZiB0aGUKKyAgICAgdWFydCBjYW4gc3VwcG9ydCB0aGF0IHNwZWVkLCBpdCB3aWxsIGdldCBzZXQuIHRoaXMgYXBwbGllcyBhbHNvIHRvCisgICAgIDQzcCdzIGFuZCBiZXlvbmQuIDExNTIwMCBpcyB0aGUgbWF4IGZvciB0aGUgNDNQJ3MgbmF0aXZlIHNlcmlhbAorICAgICBwb3J0LiBBcyBjcnl0YWwgZnJlcXVlbmNpZXMgY29udGludWUgdG8gaW5jcmVhc2UsIHRoZSBidWlsdC1pbgorICAgICBzZXJpYWwgcG9ydHMgc3BlZWRzIHdpbGwgaW1wcm92ZS4gVG8gdXNlICd1dWNwJyBvciAnYXRlJyBhdCB0aGUKKyAgICAgaGlnaGVyIGJhdWQgcmF0ZXMsIGNvbmZpZ3VyZSB0aGUgcG9ydCBmb3IgdGhlIGRlc2lyZWQgc3BlZWQsIGJ1dAorICAgICBzZXQgdGhlIHNwZWVkIG9mIHV1Y3Agb3IgYXRlIHRvIDUwLiBBbnkgbm9uLVBPU0lYIHNwZWVkcyBzZXQgaW4gdGhlCisgICAgIHR0eXMgY29uZmlndXJhdGlvbiB3aWxsIHRoZSBiZSB1c2VkLiBJbiB0aGUgY2FzZSBvZiB0aGUgMTI4LXBvcnQKKyAgICAgYWRhcHRlcnMgb3IgdGhlIElTQSA4LXBvcnQgb3IgUENJIDgtcG9ydCBhZGFwdGVyLCB0aGVyZSBhcmUgb25seSBhCisgICAgIGZldyBoaWdoZXIgYmF1ZCByYXRlcy4KKworICAgIGEuIENoYW5nZSB0aGUgcG9ydCB0byBlbmFibGUgaGlnaCBiYXVkIHJhdGVzOgorICAgICAgICAgICsgQjUwIGZvciA1NzYwMAorICAgICAgICAgICsgQjc1IGZvciA3NjgwMAorICAgICAgICAgICsgQjExMCBmb3IgMTE1MjAwCisgICAgICAgICAgKyBCMjAwIGZvciAyMzAwMDAKKyAgICBiLiBjaGRldiAtbCB0dHlYIC1hIGZhc3RiYXVkPWVuYWJsZQorICAgICAgICAgICsgRm9yIHRoZSAxMjggcG9ydHMgb3JpZ2luYWwgc3R5bGUgcmFucywgb25seSA1NzYwMCBicHMgaXMKKyAgICAgICAgICAgIHN1cHBvcnRlZC4KKyAgICAgICAgICArIEZvciB0aGUgbmV3IGVuaGFuY2VkIFJBTnMsIHVwIHRvIDIzMEticHMgaXMgc3VwcG9ydGVkLgorCisgICBJbiBBSVggMi4yLjEgb24gdGhlIFJUIFBDIHdpdGggdGhlIDgtcG9ydCBtdWx0aXBsZXhlciwgU0VUIFNQRUVEIDM4NDAwCisgICBnaXZlcyA5NjAwIGJwcywgYnV0IFNFVCBTUEVFRCAxOTIwMCBnaXZlcyAxOTIwMCAob24gdGhlIGJ1aWx0LWluIFMxCisgICBwb3J0KS4KKworICAgTm90ZSB0aGF0IHNvbWUgUlMvNjAwMHMgKGUuZy4gdGhlIElCTSBQb3dlclNlcnZlciAzMjApIGhhdmUKKyAgIG5vbnN0YW5kYXJkIHJlY3Rhbmd1bGFyIDEwLXBpbiBzZXJpYWwgcG9ydHM7IHRoZSBEQi0yNSBjb25uZWN0b3IgaXMKKyAgIE5PVCBhIHNlcmlhbCBwb3J0OyBpdCBpcyBhIHBhcmFsbGVsIHByaW50ZXIgcG9ydC4gSUJNIGNhYmxlcyBhcmUKKyAgIHJlcXVpcmVkIGZvciB0aGUgc2VyaWFsIHBvcnRzLCAoVGhlIElCTSBSVCBQQyBhbHNvIGhhZCByZWN0YW5ndWxhcgorICAgc2VyaWFsIHBvcnRzIC0tIHBlcmhhcHMgdGhlIHNhbWUgYXMgdGhlc2UsIHBlcmhhcHMgZGlmZmVyZW50LikKKworICAgSWYgeW91IGRpYWwgaW4gdG8gQUlYIHRocm91Z2ggYSBtb2RlbSB0aGF0IGlzIGNvbm5lY3RlZCBkaXJlY3RseSB0byBhbgorICAgQUlYIHBvcnQgKGUuZy4gb24gdGhlIDEyOC1wb3J0IG11bHRpcGxleGVyKSBhbmQgZmluZCB0aGF0IGRhdGEgaXMKKyAgIGxvc3QsIGVzcGVjaWFsbHkgd2hlbiB1cGxvYWRpbmcgZmlsZXMgdG8gdGhlIEFJWCBzeXN0ZW0gKGFuZCBzeXN0ZW0KKyAgIGVycm9yIGxvZ3MgcmVwb3J0IGJ1ZmZlciBvdmVycnVucyBvbiB0aGUgcG9ydCk6CisKKyAgICAxLiBNYWtlIHN1cmUgdGhlIHBvcnQgYW5kIG1vZGVtIGFyZSBCT1RIIGNvbmZpZ3VyZWQgZm9yIGhhcmR3YXJlCisgICAgICAgKFJUUy9DVFMpIGZsb3cgY29udHJvbC4gVGhlIHBvcnQgaXMgY29uZmlndXJlZCBzb21ld2hlcmUgaW4gdGhlCisgICAgICAgc3lzdGVtIGNvbmZpZ3VyYXRpb24sIG91dHNpZGUgb2YgS2VybWl0LgorICAgIDIuIFRlbGwgQy1LZXJtaXQgdG8gInNldCBmbG93IGtlZXAiOyBleHBlcmltZW50YXRpb24gc2hvd3MgdGhhdCBTRVQKKyAgICAgICBGTE9XIFJUUy9DVFMgaGFzIG5vIGVmZmVjdCB3aGVuIHVzZWQgaW4gcmVtb3RlIG1vZGUgKGkuZS4gb24KKyAgICAgICAvZGV2L3R0eSwgYXMgb3Bwb3NlZCB0byBhIHNwZWNpZnkgcG9ydCBkZXZpY2UpLgorICAgIDMuIEZpeGVzIGZvciBidWdzIGluIHRoZSBvcmlnaW5hbCBBSVggNC4yIHR0eSAoc2VyaWFsIGkvbykgc3VwcG9ydAorICAgICAgIGFuZCBvdGhlciBBSVggYnVncyBhcmUgYXZhaWxhYmxlIGZyb20gSUJNIGF0OgorICBbMTc0XWh0dHA6Ly9zZXJ2aWNlLnNvZnR3YXJlLmlibS5jb20vcnM2MDAwLworICAgICAgIERvd25sb2FkcyAtPiBTb2Z0d2FyZSBGaXhlcyAtPiBEb3dubG9hZCBGaXhEaXN0IGdldHMgYW4KKyAgICAgICBhcHBsaWNhdGlvbiBmb3IgbG9va2luZyB1cCBrbm93biBwcm9ibGVtcy4KKworICAgTWFueSBwcm9ibGVtcyByZXBvcnRlZCB3aXRoIGJpZGlyZWN0aW9uYWwgdGVybWluYWwgbGluZXMgb24gQUlYIDMuMi54CisgICBvbiB0aGUgUlMvNjAwMC4gV29ya2Fyb3VuZDogZG9uJ3QgdXNlIGJpZGlyZWN0aW9uYWwgdGVybWluYWwgbGluZXMsIG9yCisgICB3cml0ZSBhIHNoZWxsLXNjcmlwdCB3cmFwcGVyIGZvciBLZXJtaXQgdGhhdCB0dXJucyBnZXR0eSBvZmYgb24gdGhlCisgICBsaW5lIGJlZm9yZSBzdGFydGluZyBLZXJtaXQsIG9yIGJlZm9yZSBLZXJtaXQgYXR0ZW1wdHMgdG8gZG8gdGhlIFNFVAorICAgTElORS4gKEJ1dCBub3RlOiBUaGVzZSBwcm9ibGVtcyBNSUdIVCBiZSBmaXhlZCBpbiBDLUtlcm1pdCA2LjAgYW5kCisgICBsYXRlci4pIFRoZSBjb21tYW5kcyBmb3IgdHVybmluZyBnZXR0eSBvZmYgYW5kIG9uIChyZXNwZWN0aXZlbHkpIGFyZQorICAgL3Vzci9zYmluL3BkaXNhYmxlIGFuZCAvdXNyL3NiaW4vcGVuYWJsZS4KKyAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgIDMuMS40LiBBSVg6IEZpbGUgVHJhbnNmZXIKKworICAgWyBbMTc1XVRvcCBdIFsgWzE3Nl1Db250ZW50cyBdIFsgWzE3N11TZWN0aW9uIENvbnRlbnRzIF0gWyBbMTc4XU5leHQgXQorICAgWyBbMTc5XVByZXZpb3VzIF0KKworICAgRXZpZGVudGx5IEFJWCA0LjMgKEkgZG9uJ3Qga25vdyBhYm91dCBlYXJsaWVyIHZlcnNpb25zKSBkb2VzIG5vdCBhbGxvdworICAgb3BlbiBmaWxlcyB0byBiZSBvdmVyd3JpdHRlbi4gVGhpcyBjYW4gY2F1c2UgS2VybWl0IHRyYW5zZmVycyB0byBmYWlsCisgICB3aGVuIEZJTEUgQ09MTElTSU9OIGlzIE9WRVJXUklURSwgd2hlcmUgdGhleSBtaWdodCB3b3JrIG9uIG90aGVyIFVuaXgKKyAgIHZhcmlldGllcyBvciBlYXJsaWVyIEFJWCB2ZXJzaW9ucy4KKworICAgVHJhbnNmZXIgb2YgYmluYXJ5IC0tIGFuZCBtYXliZSBldmVuIHRleHQgLS0gZmlsZXMgY2FuIGZhaWwgaW4gQUlYIGlmCisgICB0aGUgQUlYIHRlcm1pbmFsIGhhcyBwYXJ0aWN1bGFyIHBvcnQgY2FuIGhhdmUgY2hhcmFjdGVyLXNldAorICAgdHJhbnNsYXRpb24gZG9uZSBmb3IgaXQgYnkgdGhlIHR0eSBkcml2ZXIuIFRoZSBmb2xsb3dpbmcgYWR2aWNlIGZyb20gYQorICAga25vd2xlZGdlYWJsZSBBSVggdXNlcjoKKworICAgICBbVGhpcyBmZWF0dXJlXSBoYXMgdG8gYmUgY2hlY2tlZCAoYW5kIHNldC9jbGVhcmVkKSB3aXRoIGEgc2VwYXJhdGUKKyAgICAgY29tbWFuZCwgdW5mb3J0dW5hdGVseSBzdHR5IGRvZXNuJ3QgaGFuZGxlIHRoaXMuIFRvIGNoZWNrOgorCisgICQgc2V0bWFwcworICBpbnB1dCBtYXA6IG5vbmUgaW5zdGFsbGVkCisgIG91dHB1dCBtYXA6IG5vbmUgaW5zdGFsbGVkCisKKyAgICAgSWYgaXQgc2F5cyBhbnl0aGluZyBvdGhlciB0aGFuICJub25lIGluc3RhbGxlZCIgZm9yIGVpdGhlciBvbmUsIGl0CisgICAgIGlzIGxpa2VseSB0byBjYXVzZSBhIHByb2JsZW0gd2l0aCBrZXJtaXQuIFRvIGdldCByaWQgb2YgaW5zdGFsbGVkCisgICAgIG1hcHM6CisKKyAgJCBzZXRtYXBzIC10IE5PTUFQCisKKyAgICAgSG93ZXZlciwgSSBzZWVtIHRvIHJlY2FsbCB0aGF0IHdpdGggc29tZSB2ZXJzaW9ucyBvZiBBSVggYmVmb3JlCisgICAgIDMuMi41LCBvbmx5IHJvb3QgY291bGQgY2hhbmdlIHRoZSBzZXR0aW5nLiBJJ20gbm90IHN1cmUgd2hhdAorICAgICB2ZXJzaW9ucyAtIGl0IG1pZ2h0IGhhdmUgb25seSBiZWVuIHVuZGVyIEFJWCAzLjEgdGhhdCB0aGlzIHdhcworICAgICB0cnVlLiBBdCBsZWFzdCB3aXRoIEFJWCAzLjIuNSBhbiBvcmRpbmFyeSB1c2VyIGNhbiBzZXQgb3IgY2xlYXIgdGhlCisgICAgIG1hcHMuCisKKyAgIE9uIHRoZSBzYW1lIHByb2JsZW0sIGFub3RoZXIga25vd2xlZGdlYWJsZSBBSVggdXNlciBzYXlzOgorCisgICAgIFRoZSB3YXkgdG8gZ2V0IGluZm9ybWF0aW9uIG9uIHRoZSBOTFMgbWFwcGluZyB1bmRlciBBSVggKDMuMi41CisgICAgIGFueXdheSkgaXMgYXMgZm9sbG93cy4gRnJvbSB0aGUgY29tbWFuZCBsaW5lIHR5cGU6CisKKyAgbHNhdHRyIC1sIHR0eSMgLWEgaW1hcCAtYSBvbWFwIC1FIC1ICisKKyAgICAgUmVwbGFjZSB0aGUgdHR5IG51bWJlciBmb3IgdGhlIG51bWJlciBzaWduIGFib3ZlLiBUaGlzIHdpbGwgZ2l2ZSBhCisgICAgIGh1bWFuIHJlYWRhYmxlIG91dHB1dCBvZiB0aGUgc2V0dGluZ3MgdGhhdCBsb29rcyBsaWtlIHRoaXM7CisKKyAgIyBsc2F0dHIgLWwgdHR5MiAtYSBpbWFwIC1hIG9tYXAgLUUgLUgKKyAgYXR0cmlidXRlIHZhbHVlIGRlc2NyaXB0aW9uICAgICB1c2VyX3NldHRhYmxlCisKKyAgaW1hcCAgICAgIG5vbmUgIElOUFVUIG1hcCBmaWxlICBUcnVlCisgIG9tYXAgICAgICBub25lICBPVVRQVVQgbWFwIGZpbGUgVHJ1ZQorCisgICAgIElmIHlvdSBjaGFuZ2UgdGhlIC1IIHRvIGEgLU8sIHlvdSBnZXQgb3V0cHV0IHRoYXQgY2FuIGVhc2lseSBiZQorICAgICBwcm9jZXNzZWQgYnkgYW5vdGhlciBwcm9ncmFtIG9yIGEgc2hlbGwgc2NyaXB0LCBmb3IgZXhhbXBsZToKKworICAjIGxzYXR0ciAtbCB0dHkyIC1hIGltYXAgLWEgb21hcCAtRSAtTworICAjaW1hcDpvbWFwCisgIG5vbmU6bm9uZQorCisgICAgIFRvIGNoYW5nZSB0aGUgc2V0dGluZ3MgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB0aGUgY2hkZXYgY29tbWFuZCBpcworICAgICB1c2VkIHdpdGggdGhlIGZvbGxvd2luZyBzeW50YXguCisKKyAgY2hkZXYgLWwgdHR5IyAtYSBpbWFwPSdub25lJyAtYSBvbWFwPSdub25lJworCisgICAgIEFnYWluIHN1YnN0aXR1dGluZyB0aGUgYXBwcm9wcmlhdGUgdHR5IHBvcnQgbnVtYmVyIGZvciB0aGUgbnVtYmVyCisgICAgIHNpZ24sICJub25lIiBiZWluZyB0aGUgdmFsdWUgd2Ugd2FudCBmb3IgQy1LZXJtaXQuIE9mIGNvdXJzZSwgdGhlCisgICAgIGFib3ZlIGNhbiBhbHNvIGJlIGNoYW5nZWQgYnkgdXNpbmcgdGhlIFNNSVQgdXRpbGl0eSBhbmQgc2VsZWN0aW5nCisgICAgIGRldmljZXMgLSB0dHkuICguLi5lbmQgcXVvdGUpCisgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAzLjEuNS4gQUlYOiBYdGVybSBLZXkgTWFwCisKKyAgIFsgWzE4MF1Ub3AgXSBbIFsxODFdQ29udGVudHMgXSBbIFsxODJdU2VjdGlvbiBDb250ZW50cyBdIFsKKyAgIFsxODNdUHJldmlvdXMgXQorCisgICBIZXJlIGlzIGEgc2FtcGxlIGNvbmZpZ3VyYXRpb24gZm9yIHNldHRpbmcgdXAgYW4geHRlcm0ga2V5Ym9hcmQgZm9yCisgICBWVDIyMCBvciBoaWdoZXIgdGVybWluYWwgZW11bGF0aW9uIG9uIEFJWCwgY291cnRlc3kgb2YgQnJ1Y2UgTW9tamlhbiwKKyAgIERyZXhlbCBIaWxsLCBQQS4gWHRlcm0gY2FuIGJlIHN0YXJ0ZWQgbGlrZSB0aGlzOgorCisgIHh0ZXJtICRYVEVSTUZMQUdTICtydyArc2IgK2xzICRAIC10bSAnZXJhc2UgXj8gaW50ciBeYycgLW5hbWUgdnQyMjAgXAorICAgICAgICAgIC10aXRsZSB2dDIyMCAtdG4geHRlcm0tMjIwICIkQCIgJgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgWFRlcm0qVlQxMDAuVHJhbnNsYXRpb25zOiAjb3ZlcnJpZGUgXG5cCisgICAgICAgICAgPEtleT5Ib21lOiBzdHJpbmcoMHgxYikgc3RyaW5nKCJbM34iKSBcbiBcCisgICAgICAgICAgPEtleT5FbmQ6IHN0cmluZygweDFiKSBzdHJpbmcoIls0fiIpIFxuCisgIHZ0MjIwKlZUMTAwLlRyYW5zbGF0aW9uczogI292ZXJyaWRlIFxuXAorICBTaGlmdCAgIDxLZXk+RjE6IHN0cmluZygiWzIzfiIpIFxuIFwKKyAgU2hpZnQgICA8S2V5PkYyOiBzdHJpbmcoIlsyNH4iKSBcbiBcCisgIFNoaWZ0ICAgPEtleT5GMzogc3RyaW5nKCJbMjV+IikgXG4gXAorICBTaGlmdCAgIDxLZXk+RjQ6IHN0cmluZygiWzI2fiIpIFxuIFwKKyAgU2hpZnQgICA8S2V5PkY1OiBzdHJpbmcoIltLfiIpIFxuIFwKKyAgU2hpZnQgICA8S2V5PkY2OiBzdHJpbmcoIlszMX4iKSBcbiBcCisgIFNoaWZ0ICAgPEtleT5GNzogc3RyaW5nKCJbMzF+IikgXG4gXAorICBTaGlmdCAgIDxLZXk+Rjg6IHN0cmluZygiWzMyfiIpIFxuIFwKKyAgU2hpZnQgICA8S2V5PkY5OiBzdHJpbmcoIlszM34iKSBcbiBcCisgIFNoaWZ0ICAgPEtleT5GMTA6IHN0cmluZygiWzM0fiIpIFxuIFwKKyAgU2hpZnQgICA8S2V5PkYxMTogc3RyaW5nKCJbMjh+IikgXG4gXAorICBTaGlmdCAgIDxLZXk+RjEyOiBzdHJpbmcoIlsyOX4iKSBcbiBcCisgICAgICAgICAgPEtleT5QcmludDogc3RyaW5nKDB4MWIpIHN0cmluZygiWzMyfiIpIFxuXAorICAgICAgICAgIDxLZXk+Q2FuY2VsOiBzdHJpbmcoMHgxYikgc3RyaW5nKCJbMzN+IikgXG5cCisgICAgICAgICAgPEtleT5QYXVzZTogc3RyaW5nKDB4MWIpIHN0cmluZygiWzM0fiIpIFxuXAorICAgICAgICAgIDxLZXk+SW5zZXJ0OiBzdHJpbmcoMHgxYikgc3RyaW5nKCJbMn4iKSBcblwKKyAgICAgICAgICA8S2V5PkRlbGV0ZTogc3RyaW5nKDB4MWIpIHN0cmluZygiWzN+IikgXG5cCisgICAgICAgICAgPEtleT5Ib21lOiBzdHJpbmcoMHgxYikgc3RyaW5nKCJbMX4iKSBcblwKKyAgICAgICAgICA8S2V5PkVuZDogc3RyaW5nKDB4MWIpIHN0cmluZygiWzR+IikgXG5cCisgICAgICAgICAgPEtleT5Qcmlvcjogc3RyaW5nKDB4MWIpIHN0cmluZygiWzV+IikgXG5cCisgICAgICAgICAgPEtleT5OZXh0OiBzdHJpbmcoMHgxYikgc3RyaW5nKCJbNn4iKSBcblwKKyAgICAgICAgICA8S2V5PkJhY2tTcGFjZTogc3RyaW5nKDB4N2YpIFxuXAorICAgICAgICAgIDxLZXk+TnVtX0xvY2s6IHN0cmluZygweDFiKSBzdHJpbmcoIk9QIikgXG5cCisgICAgICAgICAgPEtleT5LUF9EaXZpZGU6IHN0cmluZygweDFiKSBzdHJpbmcoIk9sIikgXG5cCisgICAgICAgICAgPEtleT5LUF9NdWx0aXBseTogc3RyaW5nKDB4MWIpIHN0cmluZygiT20iKSBcblwKKyAgICAgICAgICA8S2V5PktQX1N1YnRyYWN0OiBzdHJpbmcoMHgxYikgc3RyaW5nKCJPUyIpIFxuXAorICAgICAgICAgIDxLZXk+S1BfQWRkOiBzdHJpbmcoMHgxYikgc3RyaW5nKCJPTSIpIFxuXAorICAgICAgICAgIDxLZXk+S1BfRW50ZXI6IHN0cmluZygweDFiKSBzdHJpbmcoIk9NIikgXG5cCisgICAgICAgICAgPEtleT5LUF9EZWNpbWFsOiBzdHJpbmcoMHgxYikgc3RyaW5nKCJPbiIpIFxuXAorICAgICAgICAgIDxLZXk+S1BfMDogc3RyaW5nKDB4MWIpIHN0cmluZygiT3AiKSBcblwKKyAgICAgICAgICA8S2V5PktQXzE6IHN0cmluZygweDFiKSBzdHJpbmcoIk9xIikgXG5cCisgICAgICAgICAgPEtleT5LUF8yOiBzdHJpbmcoMHgxYikgc3RyaW5nKCJPciIpIFxuXAorICAgICAgICAgIDxLZXk+S1BfMzogc3RyaW5nKDB4MWIpIHN0cmluZygiT3MiKSBcblwKKyAgICAgICAgICA8S2V5PktQXzQ6IHN0cmluZygweDFiKSBzdHJpbmcoIk90IikgXG5cCisgICAgICAgICAgPEtleT5LUF81OiBzdHJpbmcoMHgxYikgc3RyaW5nKCJPdSIpIFxuXAorICAgICAgICAgIDxLZXk+S1BfNjogc3RyaW5nKDB4MWIpIHN0cmluZygiT3YiKSBcblwKKyAgICAgICAgICA8S2V5PktQXzc6IHN0cmluZygweDFiKSBzdHJpbmcoIk93IikgXG5cCisgICAgICAgICAgPEtleT5LUF84OiBzdHJpbmcoMHgxYikgc3RyaW5nKCJPeCIpIFxuXAorICAgICAgICAgIDxLZXk+S1BfOTogc3RyaW5nKDB4MWIpIHN0cmluZygiT3kiKSBcbgorCisgICEgICAgICAgPEtleT5VcDogc3RyaW5nKDB4MWIpIHN0cmluZygiW0EiKSBcblwKKyAgISAgICAgICA8S2V5PkRvd246IHN0cmluZygweDFiKSBzdHJpbmcoIltCIikgXG5cCisgICEgICAgICAgPEtleT5SaWdodDogc3RyaW5nKDB4MWIpIHN0cmluZygiW0MiKSBcblwKKyAgISAgICAgICA8S2V5PkxlZnQ6IHN0cmluZygweDFiKSBzdHJpbmcoIltEIikgXG5cCisKKyAgKnZpc3VhbEJlbGw6ICAgIHRydWUKKyAgKnNhdmVMaW5lczogICAgIDEwMDAKKyAgKmN1cnNlc2VtdWw6ICAgIHRydWUKKyAgKnNjcm9sbEtleTogICAgIHRydWUKKyAgKnNjcm9sbEJhcjogICAgIHRydWUKKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjIuIEMtS0VSTUlUIEFORCBIUC1VWAorCisgICBbIFsxODRdVG9wIF0gWyBbMTg1XUNvbnRlbnRzIF0gWyBbMTg2XVNlY3Rpb24gQ29udGVudHMgXSBbIFsxODddTmV4dCBdCisgICBbIFsxODhdUHJldmlvdXMgXQorCisgICBTRUNUSU9OIENPTlRFTlRTCisKKyAgMy4yLjAuIFsxODldQ29tbW9uIFByb2JsZW1zCisgIDMuMi4xLiBbMTkwXUJ1aWxkaW5nIEMtS2VybWl0IG9uIEhQLVVYCisgIDMuMi4yLiBbMTkxXUZpbGUgVHJhbnNmZXIKKyAgMy4yLjMuIFsxOTJdRGlhbGluZyBPdXQgYW5kIFVVQ1AgTG9ja2ZpbGVzIGluIEhQLVVYCisgIDMuMi40LiBbMTkzXU5vdGVzIG9uIFNwZWNpZmljIEhQLVVYIFJlbGVhc2VzCisgIDMuMi41LiBbMTk0XUhQLVVYIGFuZCBYLjI1CisKKyAgIFJFRkVSRU5DRVMKKworICAgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24sIHJlYWQgdGhlIFsxOTVdY29tcC5zeXMuaHAuaHB1eCBuZXdzZ3JvdXAuCisKKyAgIEMtS2VybWl0IGlzIGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIEhQLVVYIG9wZXJhdGluZyBzeXN0ZW0gYnkgY29udHJhY3QKKyAgIGJldHdlZW4gSGV3bGV0dCBQYWNrYXJkIGFuZCBDb2x1bWJpYSBVbml2ZXJzaXR5IGZvciBIUC1VWCAxMC4wMCBhbmQKKyAgIGxhdGVyLiBFYWNoIGxldmVsIG9mIEhQLVVYIGluY2x1ZGVzIGEgZnJlc2hseSBidWlsdCBDLUtlcm1pdCBiaW5hcnkgaW4KKyAgIC9iaW4va2VybWl0LCB3aGljaCBzaG91bGQgd29yayBjb3JyZWN0bHkuIEJpbmFyaWVzIGJ1aWx0IGZvciByZWd1bGFyCisgICBIUC1VWCBtYXkgYmUgdXNlZCBvbiBUcnVzdGVkIEhQLVVYIGFuZCB2aWNlLXZlcnNhLCBleGNlcHQgZm9yIHVzZSBhcworICAgSUtTRCBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbnQgYXV0aGVudGljYXRpb24gbWV0aG9kcy4KKworICAgTm90ZSB0aGF0IEhQIGRvZXMgbm90IHVwZGF0ZSBDLUtlcm1pdCB2ZXJzaW9ucyBmb3IgYW55IGJ1dCBpdHMgbW9zdAorICAgY3VycmVudCBIUC1VWCByZWxlYXNlLiBTbywgZm9yIGV4YW1wbGUsIEhQLVVYIDEwLjIwIGhhcyBDLUtlcm1pdCA2LjA7CisgICAxMS4wMCBoYXMgQy1LZXJtaXQgNy4wLCBhbmQgMTEuMjIgaGFzIDguMC4gT2YgY291cnNlLCBhcyB3aXRoIGFsbAorICAgc29mdHdhcmUsIG9sZGVyIEtlcm1pdCB2ZXJzaW9ucyBoYXZlIGJ1Z3MgKHN1Y2ggYXMgYnVmZmVyIG92ZXJmbG93CisgICB2dWxuZXJhYmlsaXRpZXMpIHRoYXQgYXJlIGZpeGVkIGluIGxhdGVyIHZlcnNpb25zLiBGcm9tIHRpbWUgdG8gdGltZSwKKyAgIEhQIGRpc2NvdmVycyBvbmUgb2YgdGhlc2UgKGxvbmctYWdvIGZpeGVkKSBidWdzIGFuZCBpc3N1ZXMgYSBzZWN1cml0eQorICAgYWxlcnQgZm9yIHRoZSBvbGRlciBPUydzLCByZWNvbW1lbmRpbmcgc29tZSBkcmFjb25pYW4gbWVhc3VyZSB0byBhdm9pZAorICAgdGhlIHByb2JsZW0uIFRoZSB0cnVlIGZpeCBpbiBlYWNoIHNpdHVhdGlvbiBpcyB0byBpbnN0YWxsIHRoZSBjdXJyZW50CisgICByZWxlYXNlIG9mIEMtS2VybWl0LgorCisgIDMuMi4wLiBDb21tb24gUHJvYmxlbXMKKworICAgWyBbMTk2XVRvcCBdIFsgWzE5N11Db250ZW50cyBdIFsgWzE5OF1TZWN0aW9uIENvbnRlbnRzIF0gWyBbMTk5XU5leHQgXQorCisgICBTb21lIEhQIHdvcmtzdGF0aW9ucyBoYXZlIGEgQlJFQUsvUkVTRVQga2V5LiBJZiB5b3UgaGl0IHRoaXMga2V5IHdoaWxlCisgICBDLUtlcm1pdCBpcyBydW5uaW5nLCBpdCBtaWdodCBraWxsIG9yIHN1c3BlbmQgdGhlIEMtS2VybWl0IHByb2Nlc3MuCisgICBDLUtlcm1pdCBhcm1zIGl0c2VsZiBhZ2FpbnN0IHRoZXNlIHNpZ25hbHMsIGJ1dCBldmlkZW50bHkgdGhlCisgICBCUkVBSy9SRVNFVCBrZXkgaXMgLS0gYXQgbGVhc3QgaW4gc29tZSBjaXJjdW1zdGFuY2VzLCBvbiBjZXJ0YWluIEhQLVVYCisgICB2ZXJzaW9ucyAtLSB0b28gcG93ZXJmdWwgdG8gYmUgY2F1Z2h0LiAoU29tZSByZXBvcnQgdGhhdCB0aGUgZmlyc3QKKyAgIEJSRUFLL1JFU0VUIHNob3dzIHVwIGFzIFNJR0lOVCBhbmQgaXMgY2F1Z2h0IGJ5IEMtS2VybWl0J3MgZm9ybWVyCisgICBTSUdJTlQgaGFuZGxlciBldmVuIHdoZW4gU0lHSU5UIGlzIGN1cnJlbnRseSBzZXQgdG8gU0lHX0lHTjsgdGhlCisgICBzZWNvbmQga2lsbHMgS2VybWl0OyBvdGhlciByZXBvcnRzIHN1Z2dlc3QgdGhlIGZpcnN0IEJSRUFLL1JFU0VUIHNlbmRzCisgICBhIFNJR1RTVFAgKHN1c3BlbmQgc2lnbmFsKSB0byBLZXJtaXQsIHdoaWNoIGl0IGNhdGNoZXMgYW5kIHN1c3BlbmRzCisgICBpdHNlbGYuIFlvdSBjYW4gdGVsbCBDLUtlcm1pdCB0byBpZ25vcmUgc3VzcGVuZCBzaWduYWxzIHdpdGggU0VUCisgICBTVVNQRU5EIE9GRi4gWW91IGNhbiB0ZWxsIEMtS2VybWl0IHRvIGlnbm9yZSBTSUdJTlQgd2l0aCBTRVQgQ09NTUFORAorICAgSU5URVJSVVBUSU9OIE9GRi4gSXQgaXMgbm90IGtub3duIHdoZXRoZXIgdGhlc2UgY29tbWFuZHMgYWxzbyBncmFudAorICAgaW1tdW5pdHkgdG8gdGhlIEJSRUFLL1JFU0VUIGtleSAob25lIHJlcG9ydCBzdGF0ZXMgdGhhdCB3aXRoIFNFVAorICAgU1VTUEVORCBPRkYsIHRoZSBCUkVBSy9SRVNFVCBrZXkgaXMgaWdub3JlZCB0aGUgZmlyc3QgZm91ciB0aW1lcywgYnV0CisgICBraWxscyBLZXJtaXQgdGhlIDV0aCB0aW1lKS4gSW4gYW55IGNhc2U6CisKKyAgICAxLiBJZiB0aGlzIGtleSBpcyBtYXBwZWQgdG8gU0lHSU5UIG9yIFNJR1RTVFAsIEMtS2VybWl0IGNhdGNoZXMgb3IKKyAgICAgICBpZ25vcmVzIGl0LCBkZXBlbmRpbmcgb24gd2hpY2ggbW9kZSAoQ09OTkVDVCwgY29tbWFuZCwgZXRjKSBLZXJtaXQKKyAgICAgICBpcyBpbi4KKyAgICAyLiBJZiBpdCBjYXVzZXMgSFAtVVggdG8ga2lsbCBDLUtlcm1pdCwgdGhlcmUgaXMgbm90aGluZyBDLUtlcm1pdCBjYW4KKyAgICAgICBkbyB0byBwcmV2ZW50IGl0LgorCisgICBXaGVuIEhQLVVYIGlzIG9uIHRoZSByZW1vdGUgZW5kIG9mIHRoZSBjb25uZWN0aW9uLCBpdCBpcyBlc3NlbnRpYWwKKyAgIHRoYXQgSFAtVVggQy1LZXJtaXQgYmUgY29uZmlndXJlZCBmb3IgWG9uL1hvZmYgZmxvdyBjb250cm9sICh0aGlzIGlzCisgICB0aGUgZGVmYXVsdCwgYnV0IGluIGNhc2UgeW91IGNoYW5nZSBpdCBhbmQgdGhlbiBleHBlcmllbmNlCisgICBmaWxlLXRyYW5zZmVyIGZhaWx1cmVzLCB0aGlzIGlzIGEgbGlrZWx5IHJlYXNvbikuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4yLjEuIEJ1aWxkaW5nIEMtS2VybWl0IG9uIEhQLVVYCisKKyAgIFsgWzIwMF1Ub3AgXSBbIFsyMDFdQ29udGVudHMgXSBbIFsyMDJdU2VjdGlvbiBDb250ZW50cyBdIFsgWzIwM11OZXh0IF0KKyAgIFsgWzIwNF1QcmV2aW91cyBdCisKKyAgICAgVGhpcyBzZWN0aW9uIGFwcGxpZXMgbWFpbmx5IHRvIG9sZCAocHJlLTEwLjIwKSBIUC1VWCB2ZXJzaW9uIG9uCisgICAgIG9sZCwgc2xvdywgYW5kL29yIG1lbW9yeS1jb25zdHJhaW5lZCBoYXJkd2FyZS4KKworICAgRHVyaW5nIHRoZSBDLUtlcm1pdCA2LjAgQmV0YSBjeWNsZSwgc29tZXRoaW5nIGhhcHBlbmVkIHRvIGNrY3Byby53CisgICAob3IsIG1vcmUgcHJlY2lzZWx5LCB0aGUgY2tjcHJvLmMgZmlsZSB0aGF0IGlzIGdlbmVyYXRlZCBmcm9tIGl0KQorICAgd2hpY2ggY2F1c2VzIEhQIG9wdGltaXppbmcgY29tcGlsZXJzIHVuZGVyIEhQLVVYIHZlcnNpb25zIDcuMCBhbmQgOC4wCisgICAoYXBwYXJlbnRseSBvbiBhbGwgcGxhdGZvcm1zKSBhcyB3ZWxsIGFzIHVuZGVyIEhQLVVYIDkuMCBvbiBNb3Rvcm9sYQorICAgcGxhdGZvcm1zIG9ubHksIHRvIGJsb3cgdXAuIEluIHZlcnNpb25zIDcuMCBhbmQgOC4wIHRoZSBwcm9ibGVtIGhhcworICAgc3ByZWFkIHRvIG90aGVyIG1vZHVsZXMuCisKKyAgIFRoZSBzeW1wdG9tcyB2YXJ5IGZyb20gdGhlIHN5c3RlbSBncmluZGluZyB0byBhIGhhbHQsIHRvIHRoZSBjb21waWxlcgorICAgY3Jhc2hpbmcsIHRvIHRoZSBjb21waWxhdGlvbiBvZiB0aGUgY2tjcHJvLmMgbW9kdWxlIHRha2luZyB2ZXJ5IGxvbmcKKyAgIHBlcmlvZHMgb2YgdGltZSwgbGlrZSA5IGhvdXJzLiBUaGlzIHByb2JsZW0gaXMgaGFuZGxlZCBieSBjb21waWxpbmcKKyAgIHRoZSBtb2R1bGVzIHRoYXQgdGlja2xlIGl0IHdpdGhvdXQgb3B0aW1pemF0aW9uOyB0aGUgbmV3IEMtS2VybWl0CisgICBtYWtlZmlsZSB0YWtlcyBjYXJlIG9mIHRoaXMsIGFuZCBzaG93cyBob3cgdG8gZG8gaXQgaW4gY2FzZSB0aGUgc2FtZQorICAgdGhpbmcgYmVnaW5zIGhhcHBlbmluZyB3aXRoIG90aGVyIG1vZHVsZXMuCisKKyAgIE9uIEhQLVVYIDkuMCwgYSBrZXJuZWwgcGFyYW1ldGVyLCBtYXhkc2l6IChtYXhpbXVtIHByb2Nlc3MgZGF0YQorICAgc2VnbWVudCBzaXplKSwgc2VlbXMgdG8gYmUgaW1wb3J0YW50LiBPbiBNb3Rvcm9sYSBzeXN0ZW1zLCBpdCBpcyAxNk1CCisgICBieSBkZWZhdWx0LCB3aGVyZWFzIG9uIFJJU0Mgc3lzdGVtcyB0aGUgZGVmYXVsdCBpcyBtdWNoIGJpZ2dlci4KKyAgIEluY3JlYXNpbmcgbWF4ZHNpeiB0byBhYm91dCA4ME1CIHNlZW1zIHRvIG1ha2UgdGhlIHByb2JsZW0gZ28gYXdheSwKKyAgIGJ1dCBvbmx5IGlmIHRoZSBzeXN0ZW0gYWxzbyBoYXMgYSBsb3Qgb2YgcGh5c2ljYWwgbWVtb3J5IC0tIG90aGVyd2lzZQorICAgaXQgc3dhcHMgaXRzZWxmIHRvIGRlYXRoLgorCisgICBUaGUgb3B0aW1pemluZyBjb21waWxlciBtaWdodCBjb21wbGFpbiBhYm91dCAic29tZSBvcHRpbWl6YXRpb25zCisgICBza2lwcGVkIiBvbiBjZXJ0YWluIG1vZHVsZXMsIGR1ZSB0byBsYWNrIG9mIHNwYWNlIGF2YWlsYWJsZSB0byB0aGUKKyAgIG9wdGltaXplci4gWW91IGNhbiBpbmNyZWFzZSB0aGUgc3BhY2UgKHRoZSBpbmNhbnRhdGlvbiBkZXBlbmRzIG9uIHRoZQorICAgcGFydGljdWxhciBjb21waWxlciB2ZXJzaW9uIC0tIHNlZSB0aGUgWzIwNV1tYWtlZmlsZSksIGJ1dCBkb2luZyBzbworICAgdGVuZHMgdG8gbWFrZSB0aGUgY29tcGlsYXRpb25zIHRha2UgYSBtdWNoIGxvbmdlciB0aW1lLiBGb3IgZXhhbXBsZSwKKyAgIHRoZSAiaHB1eDAxMDBvKyIgbWFrZWZpbGUgdGFyZ2V0IGFkZHMgdGhlICIrT25vbGltaXQiIGNvbXBpbGVyIGZsYWcsCisgICBhbmQgYWJvdXQgYW4gaG91ciB0byB0aGUgY29tcGlsZSB0aW1lIG9uIGFuIEhQLTkwMDAvNzMwLiBCdXQgaXQgKmRvZXMqCisgICBwcm9kdWNlIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhYm91dCAxMEsgc21hbGxlciA6LSkKKworICAgSW4gdGhlIG1ha2VmaWxlLCBhbGwgSFAtVVggZW50cmllcyBhdXRvbWF0aWNhbGx5IHNraXAgb3B0aW1pemF0aW9uIG9mCisgICBwcm9ibGVtYXRpYyBtb2R1bGVzLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMi4yLiBGaWxlIFRyYW5zZmVyCisKKyAgIFsgWzIwNl1Ub3AgXSBbIFsyMDddQ29udGVudHMgXSBbIFsyMDhdU2VjdGlvbiBDb250ZW50cyBdIFsgWzIwOV1OZXh0IF0KKyAgIFsgWzIxMF1QcmV2aW91cyBdCisKKyAgIFRlbG5ldCBjb25uZWN0aW9ucyBpbnRvIEhQLVVYIHZlcnNpb25zIHVwIHRvIGFuZCBpbmNsdWRpbmcgMTEuMTEgKGFuZAorICAgcG9zc2libHkgMTEuMjApIHRlbmQgbm90IHRvIGxlbmQgdGhlbXNlbHZlcyB0byBmaWxlIHRyYW5zZmVyIGR1ZSB0bworICAgbGltaXRhdGlvbnMsIHJlc3RyaWN0aW9ucywgYW5kL29yIGJ1Z3MgaW4gdGhlIEhQLVVYIFRlbG5ldCBzZXJ2ZXIKKyAgIGFuZC9vciBwc2V1ZG90ZXJtaW5hbCAocHR5KSBkcml2ZXIuCisKKyAgIEluIEMtS2VybWl0IDYuMCAoMTk5NikgYW4gdW5leHBlY3RlZCBzbG93bmVzcyB3YXMgbm90ZWQgd2hlbgorICAgdHJhbnNmZXJyaW5nIGZpbGVzIG92ZXIgbG9jYWwgRXRoZXJuZXQgY29ubmVjdGlvbnMgd2hlbiBhbiBIUC1VWAorICAgc3lzdGVtICg5LjA1IG9yIDEwLjAwKSB3YXMgb24gdGhlIHJlbW90ZSBlbmQuIFRoZSBmb2xsb3dpbmcgZXhwZXJpbWVudAorICAgd2FzIGNvbmR1Y3RlZCB0byBkZXRlcm1pbmUgdGhlIGNhdXNlLiBDLUtlcm1pdCA2LjAgd2FzIHVzZWQ7IHRoZQorICAgc2l0dWF0aW9uIGlzIHNsaWdodGx5IGJldHRlciB1c2luZyBDLUtlcm1pdCA3LjAncyBzdHJlYW1pbmcgZmVhdHVyZQorICAgYW5kIEhQLVVYIDEwLjIwIG9uIHRoZSBmYXIgZW5kLgorCisgICBUaGUgc3lzdGVtcyB3ZXJlIEhQLVVYIDEwLjAwIChvbiA3MTUvMzMpIGFuZCBTdW5PUyA0LjEuMyAob24KKyAgIFNwYXJjLTIwKSwgYm90aCBvbiB0aGUgc2FtZSBsb2NhbCAxME1icHMgRXRoZXJuZXQsIHBhY2tldCBsZW5ndGggNDA5NiwKKyAgIHBhcml0eSBub25lLCBjb250cm9sIHByZWZpeGluZyAiY2F1dGlvdXMiLCB1c2luZyBvbmx5IGxvY2FsIGRpc2tzIG9uCisgICBlYWNoIG1hY2hpbmUgLS0gbm8gTkZTLiBJbiB0aGUgQy1LZXJtaXQgNi4wIChBQ0svTkFLKSBjYXNlLCB0aGUgd2luZG93CisgICBzaXplIHdhcyAyMDsgaW4gdGhlIHN0cmVhbWluZyBjYXNlIHRoZXJlIGlzIG5vIHdpbmRvdyBzaXplIChpLmUuIGl0IGlzCisgICBpbmZpbml0ZSkuIFRoZSB0ZXN0IGZpbGUgd2FzIEMtS2VybWl0IGV4ZWN1dGFibGUsIHRyYW5zZmVycmVkIGluCisgICBiaW5hcnkgbW9kZS4gQ29uZGl0aW9ucyB3ZXJlIHJlbGF0aXZlbHkgcG9vcjogdGhlIFN1biBhbmQgdGhlIGxvY2FsCisgICBuZXQgaGVhdmlseSBsb2FkZWQ7IHRoZSBIUCBzeXN0ZW0gaXMgb2xkLCBzbG93LCBhbmQKKyAgIG1lbW9yeS1jb25zdHJhaW5lZC4KKworICAgICAgICAgICAgICAgICAgIEMtS2VybWl0IDYuMC4uLiAgICBDLUtlcm1pdCA3LjAuLi4KKyBMb2NhbCAgICBSZW1vdGUgICBBQ0svTkFLLi4uLi4uLi4gICAgU3RyZWFtaW5nLi4uLi4uCisgQ2xpZW50ICAgU2VydmVyICAgU2VuZCAgICBSZWNlaXZlICAgIFNlbmQgICAgUmVjZWl2ZQorICBTdW4gICAgICBIUCAgICAgICAzNiAgICAgICAxOCAgICAgICAgNjQgICAgICAgMTgKKyAgSFAgICAgICAgSFAgICAgICAgMjUgICAgICAgMTUgICAgICAgIDM3ICAgICAgIDE2CisgIEhQICAgICAgIFN1biAgICAgIDc3ICAgICAgIDgzICAgICAgIDExOCAgICAgICA5MgorICBTdW4gICAgICBTdW4gICAgICA2MCAgICAgICA2MCAgICAgICAxNTMgICAgICAxNTgKKworICAgU28gd2hlbmV2ZXIgSFAgaXMgdGhlIHJlbW90ZSB3ZSBoYXZlIHBvb3IgcGVyZm9ybWFuY2UuIFdoeT8KKworICAgICAqIENoYW5naW5nIGZpbGUgZGlzcGxheSB0byBDUlQgaGFzIG5vIGVmZmVjdCAoc28gaXQncyBub3QgdGhlIGN1cnNlcworICAgICAgIGxpYnJhcnkgb24gdGhlIGNsaWVudCBzaWRlKS4KKyAgICAgKiBDaGFuZ2luZyBUQ1AgUkVDVi1CVUZGRVIgb3IgU0VORC1CVUZGRVIgaGFzIGxpdHRsZSBlZmZlY3QuCisgICAgICogVGVsbGluZyB0aGUgY2xpZW50IHRvIG1ha2UgYSBiaW5hcnktbW9kZSBjb25uZWN0aW9uIChTRVQgVEVMTkVUCisgICAgICAgQklOQVJZIFJFUVVFU1RFRCwgd2hpY2ggc3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZXMgYSBiaW5hcnkKKyAgICAgICBjb25uZWN0aW9uKSBoYXMgbm8gZWZmZWN0IG9uIHRocm91Z2hwdXQuCisKKyAgIEJVVC4uLiBJZiBJIHN0YXJ0IEhQLVVYIEMtS2VybWl0IGFzIGEgVENQIHNlcnZpY2U6CisKKyAgc2V0IGhvc3QgKiAzMDAwCisgIHNlcnZlcgorCisgICBhbmQgdGhlbiBmcm9tIHRoZSBjbGllbnQgInNldCBob3N0IHh4eCAzMDAwIiwgSSBnZXQ6CisKKyAgICAgICAgICAgICAgICAgICBDLUtlcm1pdCA2LjAuLi4gICAgQy1LZXJtaXQgNy4wLi4uCisgTG9jYWwgICAgUmVtb3RlICAgQUNLL05BSy4uLi4uLi4uICAgIFN0cmVhbWluZy4uLi4uLgorIENsaWVudCAgIFNlcnZlciAgIFNlbmQgICAgUmVjZWl2ZSAgICBTZW5kICAgIFJlY2VpdmUKKyAgU3VuICAgICAgSFAgICAgICAgNzcgICAgICAgNjcgICAgICAgMTA2ICAgICAgMTM5CisgIEhQICAgICAgIEhQICAgICAgIDUwICAgICAgIDUwICAgICAgICA2NCAgICAgICA2MgorICBIUCAgICAgICBTdW4gICAgICA1NyAgICAgICA4NSAgICAgICAxNTUgICAgICAxMDUKKyAgU3VuICAgICAgU3VuICAgICAgNTcgICAgICAgNTAgICAgICAgMzIxICAgICAgMzE0CisKKyAgIFRoZXJlZm9yZSB0aGUgSFAtVVggdGVsbmV0IHNlcnZlciBvciBwdHkgZHJpdmVyIHNlZW1zIHRvIGJlIGFkZGluZworICAgbW9yZSBvdmVyaGVhZCB0aGFuIHRoZSBTdW5PUyBvbmUsIGFuZCBtb3N0IG90aGVycy4gV2hlbiBnb2luZyB0aHJvdWdoCisgICB0aGlzIHR5cGUgb2YgY29ubmVjdGlvbiAoYSByZW1vdGUgdGVsbmV0IHNlcnZlcikgdGhlcmUgaXMgbGl0dGxlCisgICBLZXJtaXQgY2FuIGRvIGltcHJvdmUgbWF0dGVycywgc2luY2UgdGhlIHRlbG5ldCBzZXJ2ZXIgYW5kIHB0eSBkcml2ZXIKKyAgIGFyZSBiZXR3ZWVuIHRoZSB0d28gS2VybWl0cywgYW5kIG5laXRoZXIgS2VybWl0IHByb2dyYW0gY2FuIGhhdmUgYW55CisgICBpbmZsdWVuY2Ugb3ZlciB0aGVtIChleGNlcHQgcHV0dGluZyB0aGUgVGVsbmV0IGNvbm5lY3Rpb24gaW4gYmluYXJ5CisgICBtb2RlLCBidXQgdGhhdCBkb2Vzbid0IGhlbHApLgorCisgICAoVGhlIG51bWJlcnMgZm9yIHRoZSBIUC1IUCB0cmFuc2ZlcnMgYXJlIGxvd2VyIHRoYW4gdGhlIG90aGVycyBzaW5jZQorICAgYm90aCBLZXJtaXQgcHJvY2Vzc2VzIGFyZSBydW5uaW5nIG9uIHRoZSBzYW1lIHNsb3cgMzNNSHogQ1BVLikKKworICAgTWF0dGVycyBzZWVtIHRvIGhhdmUgZGV0ZXJpb3JhdGVkIGluIEhQLVVYIDExLiBOb3cgZmlsZSB0cmFuc2ZlcnMgb3ZlcgorICAgVGVsbmV0IGNvbm5lY3Rpb25zIGZhaWwgY29tcGxldGVseSwgcmF0aGVyIHRoYW4ganVzdCBiZWluZyBzbG93LiBJbgorICAgdGhlIGZvbGxvd2luZyB0cmlhbCwgYSBUZWxuZXQgY29ubmVjdGlvbiB3YXMgbWFkZSBmcm9tIEtlcm1pdCA5NSB0bworICAgSFAtVVggMTEuMTEgb24gYW4gSFAtOTAwMC83ODUvQjIwMDAgb3ZlciBsb2NhbCAxME1icHMgRXRoZXJuZXQgcnVubmluZworICAgQy1LZXJtaXQgOC4wMCBpbiBzZXJ2ZXIgbW9kZSAodW5kZXIgdGhlIEhQLVVYIFRlbG5ldCBzZXJ2ZXIpOgorCisgICAgICAgICAgICAgICAgICAgVGV4dC4uLi4uLi4uICAgIEJpbmFyeS4uLi4uLgorICBTdHJlYW0gIFBrdGxlbiAgIEdFVCAgICAgU0VORCAgICBHRVQgICAgIFNFTkQKKyAgICBPbiAgICAgNDAwMCAgICBGYWlsICAgIEZhaWwgICAgRmFpbCAgICBGYWlsCisgICAgT2ZmICAgIDQwMDAgICAgRmFpbCAgICBGYWlsICAgIEZhaWwgICAgRmFpbAorICAgIE9mZiAgICAyMDAwICAgIE9LICAgICAgRmFpbCAgICBPSyAgICAgIEZhaWwKKyAgICBPbiAgICAgMjAwMCAgICBPSyAgICAgIEZhaWwgICAgT0sgICAgICBGYWlsCisgICAgT24gICAgIDMwMDAgICAgRmFpbCAgICBGYWlsICAgIEZhaWwgICAgRmFpbAorICAgIE9uICAgICAyNTAwICAgIEZhaWwgICAgRmFpbCAgICBGYWlsICAgIEZhaWwKKyAgICBPbiAgICAgMjA0NyAgICBPSyAgICAgIEZhaWwgICAgT0sgICAgICBGYWlsCisgICAgT24gICAgIDIwNDUgICAgT0sgICAgICBGYWlsICAgIE9LICAgICAgRmFpbAorICAgIE9mZiAgICAgNTAwICAgIE9LICAgICAgT0sgICAgICBPSyAgICAgIE9LCisgICAgT24gICAgICA1MDAgICAgT0sgICAgICBGYWlsICAgIE9LICAgICAgRmFpbAorICAgIE9uICAgICAgMjQwICAgIE9LICAgICAgRmFpbCAgICBPSyAgICAgIEZhaWwKKworICAgQXMgeW91IGNhbiBzZWUsIGRvd25sb2FkcyBhcmUgcHJvYmxlbWF0aWMgdW5sZXNzIHRoZSByZWNlaXZlcidzIEtlcm1pdAorICAgcGFja2V0IGxlbmd0aCBpcyAyMDQ1IG9yIGxlc3MsIGJ1dCB1cGxvYWRzIHdvcmsgb25seSB3aXRoIHN0cmVhbWluZworICAgZGlzYWJsZWQgYW5kIHRoZSBwYWNrZXQgbGVuZ3RoIHJlc3RyaWN0ZWQgdG8gNTAwLiBUbyBmb3JjZSBmaWxlCisgICB0cmFuc2ZlcnMgdG8gd29yayBvbiB0aGlzIGNvbm5lY3Rpb24sIHRoZSBkZXNrdG9wIEtlcm1pdCBtdXN0IGJlIHRvbGQKKyAgIHRvOgorCisgIHNldCBzdHJlYW1pbmcgb2ZmCisgIHNldCByZWNlaXZlIHBhY2tldC1sZW5ndGggMjAwMAorICBzZXQgc2VuZCBwYWNrZXQtbGVuZ3RoIDUwMAorCisgICBIb3dldmVyLCBpZiBhIGNvbm5lY3Rpb24gaXMgbWFkZSBiZXR3ZWVuIHRoZSBzYW1lIHR3byBwcm9ncmFtcyBvbiB0aGUKKyAgIHNhbWUgdHdvIGNvbXB1dGVycyBvdmVyIHRoZSBzYW1lIG5ldHdvcmssIGJ1dCB0aGlzIHRpbWUgYSBkaXJlY3QKKyAgIHNvY2tldC10by1zb2NrZXQgY29ubmVjdGlvbiBieXBhc3NpbmcgdGhlIEhQLVVYIFRlbG5ldCBzZXJ2ZXIgYW5kIHB0eQorICAgZHJpdmVyICh0ZWxsIEhQLVVYIEMtS2VybWl0IHRvICJzZXQgaG9zdCAvc2VydmVyICogMzAwMCAvcmF3IjsgdGVsbAorICAgZGVza3RvcCBjbGllbnQgcHJvZ3JhbSB0byAic2V0IGhvc3QgYmxhaCAzMDAwIC9yYXciKSwgZXZlcnl0aGluZyB3b3JrcworICAgcGVyZmVjdGx5IHdpdGggdGhlIGRlZmF1bHQgS2VybWl0IHNldHRpbmdzIChzdHJlYW1pbmcsIDRLIHBhY2tldHMsCisgICBsaWJlcmFsIGNvbnRyb2wtY2hhcmFjdGVyIHVucHJlZml4aW5nLCA4LWJpdCB0cmFuc3BhcmVuY3ksIGV0Yyk6CisKKyAgICAgICAgICAgICAgICAgICBUZXh0Li4uLi4uLi4gICAgQmluYXJ5Li4uLi4uCisgIFN0cmVhbSAgUGt0bGVuICAgR0VUICAgICBTRU5EICAgIEdFVCAgICAgU0VORAorICAgIE9uICAgICA0MDAwICAgIE9LICAgICAgT0sgICAgICBPSyAgICAgIE9LCisKKyAgIEFuZCBpbiB0aGlzIGNhc2UsIHRyYW5zZmVyIHJhdGVzIHdlcmUgYXBwcm94aW1hdGVseSA5MDAsMDAwIGNwcy4gVG8KKyAgIHZlcmlmeSB0aGF0IHRoZSBiZWhhdmlvciByZXBvcnRlZCBoZXJlIGlzIG5vdCBjYXVzZWQgYnkgdGhlIG5ldyBLZXJtaXQKKyAgIHJlbGVhc2UsIHRoZSBzYW1lIGV4cGVyaW1lbnQgd2FzIHBlcmZvcm1lZCBvbiBhIFRlbG5ldCBjb25uZWN0aW9uIGZyb20KKyAgIHRoZSBzYW1lIFBDIG92ZXIgdGhlIHNhbWUgbmV0d29yayB0byB0aGUgb2xkIDcxNS8zMyBydW5uaW5nIEhQLVVYCisgICAxMC4yMCBhbmQgQy1LZXJtaXQgOC4wMC4gVGV4dCBhbmQgYmluYXJ5IHVwbG9hZHMgYW5kIGRvd25sb2FkcyB3b3JrZWQKKyAgIHBlcmZlY3RseSAoYWxiZWl0IHNsb3dseSkgd2l0aCBhbGwgdGhlIGRlZmF1bHQgc2V0dGluZ3MgLS0gc3RyZWFtaW5nLAorICAgNEsgcGFja2V0cywgZXRjLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMi4zLiBEaWFsaW5nIE91dCBhbmQgVVVDUCBMb2NrZmlsZXMgaW4gSFAtVVgKKworICAgWyBbMjExXVRvcCBdIFsgWzIxMl1Db250ZW50cyBdIFsgWzIxM11TZWN0aW9uIENvbnRlbnRzIF0gWyBbMjE0XU5leHQgXQorICAgWyBbMjE1XVByZXZpb3VzIF0KKworICAgSFAgd29ya3N0YXRpb25zIGRvIG5vdCBjb21lIHdpdGggZGlhbG91dCBkZXZpY2VzIGNvbmZpZ3VyZWQ7IHlvdSBoYXZlCisgICB0byBkbyBpdCB5b3Vyc2VsZiAoYXMgcm9vdCkuIEZpcnN0IGxvb2sgaW4gL2RldiB0byBzZWUgd2hhdCdzIHRoZXJlOworICAgZm9yIGV4YW1wbGUgaW4gSFAtVVggMTAuMDAgb3IgbGF0ZXI6CisKKyAgbHMgLWwgL2Rldi9jdWEqCisgIGxzIC1sIC9kZXYvdHR5KgorCisgICBJZiB5b3UgZmluZCBhIHR0eTBwMCBkZXZpY2UgYnV0IG5vIGN1YTBwMCwgeW91J2xsIG5lZWQgdG8gY3JlYXQgb25lIGlmCisgICB5b3Ugd2FudCB0byBkaWFsIG91dDsgdGhlIHR0eTBwMCBkb2VzIG5vdCB3b3JrIGZvciBkaWFsaW5nIG91dC4gSXQncworICAgZWFzeTogc3RhcnQgU0FNOyBpbiB0aGUgbWFpbiBTYW0gd2luZG93LCBkb3VibGUtY2xpY2sgb24gUGVyaXBoZXJhbAorICAgRGV2aWNlLCB0aGVuIGluIHRoZSBQZXJpcGhlcmFsIERldmljZXMgd2luZG93LCBkb3VibGUtY2xpY2sgb24KKyAgIFRlcm1pbmFscyBhbmQgTW9kZW1zLiBJbiB0aGUgVGVybWluYWxzIGFuZCBNb2RlbXMgZGlhbG9nLCBjbGljayBvbgorICAgQWN0aW9ucywgdGhlbiBjaG9vc2UgIkFkZCBtb2RlbSIgYW5kIGZpbGwgaW4gdGhlIGJsYW5rcy4gRm9yIGV4YW1wbGU6CisgICBQb3J0IG51bWJlciAwLCBzcGVlZCA1NzYwMCAoaGlnaGVyIHNwZWVkcyB0ZW5kIG5vdCB0byB3b3JrIHJlbGlhYmx5KSwKKyAgICJVc2UgZGV2aWNlIGZvciBjYWxsaW5nIG91dCIsIGRvIE5PVCAiUmVjZWl2ZSBpbmNvbWluZyBjYWxscyIgKHVubGVzcworICAgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nKSwgbGVhdmUgIkNDSVRUIG1vZGVtIiB1bmNoZWNrZWQgdW5sZXNzIHlvdQorICAgcmVhbGx5IGhhdmUgb25lLCBhbmQgZG8gc2VsZWN0ICJVc2UgaGFyZHdhcmUgZmxvdyBjb250cm9sIChSVFMvQ1RTKSIuCisgICBUaGVuIGNsaWNrIE9LLiBUaGlzIGNyZWF0ZXMgY3VhMHAwIGFzIHdlbGwgYXMgY3VsMHAwIGFuZCB0dHlkMHAwCisKKyAgIElmIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6CisKKyAgc2V0IGxpbmUgL2Rldi9jdWEwcDAgOyBvciBvdGhlciBkZXZpY2UKKyAgc2V0IHNwZWVkIDExNTIwMCAgICAgOyBvciBvdGhlciBub3JtYWwgc3BlZWQKKworICAgcHJvZHVjZXMgdGhlIG1lc3NhZ2UgIj9VbnN1cHBvcnRlZCBsaW5lIHNwZWVkIi4gVGhpcyBtZWFucyBlaXRoZXIgdGhhdAorICAgdGhlIHBvcnQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRpYWxvdXQgKGdvIGludG8gU0FNIGFzIGRlc2NyaWJlZCBhYm92ZQorICAgYW5kIG1ha2Ugc3VyZSAiVXNlIGRldmljZSBmb3IgY2FsbGluZyBvdXQiIGlzIHNlbGVjdGVkKSwgb3IgZWxzZSB0aGF0CisgICBzcGVlZCB5b3UgaGF2ZSBnaXZlbiAoc3VjaCBhcyA0NjA4MDApIGlzIHN1cHBvcnRlZCBieSB0aGUgb3BlcmF0aW5nCisgICBzeXN0ZW0gYnV0IG5vdCBieSB0aGUgcGh5c2ljYWwgZGV2aWNlIChpbiB3aGljaCBjYXNlLCB1c2UgYSBsb3dlcgorICAgc3BlZWQgbGlrZSA1NzYwMCkuCisKKyAgIEluIEhQLVVYIDkuMCwgc2VyaWFsIGRldmljZSBuYW1lcyBiZWdhbiB0byBjaGFuZ2UuIFRoZSBvbGRlciBuYW1lcworICAgbG9va2VkIGxpa2UgIi9kZXYvY3VhMDAiLCAiL2Rldi90dHkwMSIsIGV0YyAoc29tZXRpbWVzIHdpdGggb25seSBvbmUKKyAgIGRpZ2l0KS4gVGhlIG5ld2VyIG5hbWVzIGhhdmUgdHdvIGRpZ2l0cyB3aXRoIHRoZSBsZXR0ZXIgInAiIGluCisgICBiZXR3ZWVuLiBIUC1VWCA4Lnh4IGFuZCBlYXJsaWVyIGhhdmUgdGhlIG9sZGVyIGZvcm0sIEhQLVVYIDEwLjAwIGFuZAorICAgbGF0ZXIgaGF2ZSB0aGUgbmV3ZXIgZm9ybS4gSFAtVVggOS54eCBoYXMgdGhlIG5ld2VyIGZvcm0gb24gU2VyaWVzIDgwMAorICAgbWFjaGluZXMsIGFuZCB0aGUgb2xkZXIgZm9ybSBvbiBvdGhlciBoYXJkd2FyZSBtb2RlbHMuIFRoZSBzaXR1YXRpb24KKyAgIGlzIHN1bW1hcml6ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSAodGhlIENvbnZpbyAxMC4wIGNvbHVtbiBhcHBsaWVzCisgICB0byBIUC1VWCAxMCBhbmQgMTEpLgorCisgIENvbnZlcmdlZCBIUC1VWCBTZXJpYWwgSS9PIEZpbGVuYW1lcyA6IFRUWSBNdXggTmFtaW5nCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBHZW5lcmFsIG1lYW5pbmcgICAgICBPbGQgRm9ybSAgICAgUzgwMCA5LjAgICAgICAgICAgIENvbnZpbyAxMC4wCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB0dHkqIGhhcmR3aXJlZCBwb3J0cyAgdHR5PFlZPiAgICAgdHR5PFg+cDxZPiAgICAgICAgIHR0eTxEPnA8cD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6bXV4PFg+ICAgICAgICBkaWFnOm11eDxEPgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdHR5ZCogZGlhbC1pbiBtb2RlbXMgIHR0eWQ8WVk+ICAgIHR0eWQ8WD5wPFk+ICAgICAgICB0dHlkPEQ+cDxwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzp0dHlkPFg+cDxZPiAgIGRpYWc6dHR5ZDxEPnA8cD4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGN1YSogYXV0by1kaWFsIG91dCAgICBjdWE8WVk+ICAgICBjdWE8WD5wPFk+ICAgICAgICAgY3VhPEQ+cDxwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzpjdWE8WD5wPFk+CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBjdWwqIGRpYWwtb3V0ICAgICAgICAgY3VsPFlZPiAgICAgY3VsPFg+cDxZPiAgICAgICAgIGN1bDxEPnA8cD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6Y3VsPFg+cDxZPgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIDxYPj0gTFUgKExvZ2ljYWwgVW5pdCkgIDxEPj0gRGV2c3BlYyAoZGVjaW1hbCBjYXJkIGluc3RhbmNlKQorICAgPFk+IG9yIDxZWT4gPSBQb3J0ICAgICAgPHA+PSBQb3J0CisKKyAgIEZvciBkaWFsaW5nIG91dCwgeW91IHNob3VsZCB1c2UgdGhlIGN1YSBvciBjdWwgZGV2aWNlcy4gV2hlbgorICAgQy1LZXJtaXQncyBDQVJSSUVSIHNldHRpbmcgaXMgQVVUTyBvciBPTiwgQy1LZXJtaXQgc2hvdWxkIHBvcCBiYWNrIHRvCisgICBpdHMgcHJvbXB0IGF1dG9tYXRpY2FsbHkgaWYgdGhlIGNhcnJpZXIgc2lnbmFsIGRyb3BzLCBlLmcuIHdoZW4geW91CisgICBsb2cgb3V0IGZyb20gdGhlIHJlbW90ZSBjb21wdXRlciBvciBzZXJ2aWNlLiBJZiB5b3UgdXNlIHRoZSB0dHk8RD5wPGQ+CisgICAoZS5nLiB0dHkwcDApIGRldmljZSwgdGhlIGNhcnJpZXIgc2lnbmFsIHNob3VsZCBiZSBpZ25vcmVkLiBUaGUKKyAgIHR0eTxEPnA8ZD4gZGV2aWNlIHNob3VsZCBiZSB1c2VkIGZvciBkaXJlY3QgY29ubmVjdGlvbnMgd2hlcmUgdGhlCisgICBjYXJyaWVyIHNpZ25hbCBkb2VzIG5vdCBmb2xsb3cgUlMtMjMyIGNvbnZlbnRpb25zICh1c2UgdGhlIGN1bCBkZXZpY2UKKyAgIGZvciBoYXJkd2lyZWQgY29ubmVjdGlvbnMgdGhyb3VnaCBhIHRydWUgbnVsbCBtb2RlbSkuIERvIG5vdCB1c2UgdGhlCisgICB0dHlkPEQ+cDxkPiBkZXZpY2UgZm9yIGRpYWxpbmcgb3V0LgorCisgICBLZXJtaXQncyBhY2Nlc3MgdG8gc2VyaWFsIGRldmljZXMgaXMgY29udHJvbGxlZCBieSAiVVVDUCBsb2NrZmlsZXMiLAorICAgd2hpY2ggYXJlIGludGVuZGVkIHRvIHByZXZlbnQgZGlmZmVyZW50IHVzZXJzIHVzaW5nIGRpZmZlcmVudCBzb2Z0d2FyZQorICAgcHJvZ3JhbXMgKEtlcm1pdCwgY3UsIGV0YywgYW5kIFVVQ1AgaXRzZWxmKSBmcm9tIGFjY2Vzc2luZyB0aGUgc2FtZQorICAgc2VyaWFsIGRldmljZSBhdCB0aGUgc2FtZSB0aW1lLiBXaGVuIGEgZGV2aWNlIGlzIGluIHVzZSBieSBhCisgICBwYXJ0aWN1bGFyIHVzZXIsIGEgZmlsZSB3aXRoIGEgc3BlY2lhbCBuYW1lIGlzIGNyZWF0ZWQgaW46CisKKyAgL3Zhci9zcG9vbC9sb2NrcyAgKEhQLVVYIDEwLjAwIGFuZCBsYXRlcikKKyAgL3Vzci9zcG9vbC91dWNwICAgKEhQLVVYIDkueHggYW5kIGVhcmxpZXIpCisKKyAgIFRoZSBmaWxlJ3MgbmFtZSBpbmRpY2F0ZXMgdGhlIGRldmljZSB0aGF0IGlzIGluIHVzZSwgYW5kIGl0cyBjb250ZW50cworICAgaW5kaWNhdGVzIHRoZSBwcm9jZXNzIElEIChwaWQpIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgdXNpbmcgdGhlCisgICBkZXZpY2UuIFNpbmNlIHNlcmlhbCBkZXZpY2VzIGFuZCB0aGUgbG9ja3MgZGlyZWN0b3J5IGFyZSBub3QgYm90aAorICAgcHVibGljbHkgcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBLZXJtaXQgYW5kIG90aGVyIGNvbW11bmljYXRpb24KKyAgIHNvZnR3YXJlIG11c3QgYmUgaW5zdGFsbGVkIHNldHVpZCB0byB0aGUgb3duZXIgKGJpbikgb2YgdGhlIHNlcmlhbAorICAgZGV2aWNlIGFuZCBzZXRnaWQgdG8gdGhlIGdyb3VwIChkYWVtb24pIG9mIHRoZSAvdmFyL3Nwb29sL2xvY2tzCisgICBkaXJlY3RvcnkuIEtlcm1pdCdzIHNldHVpZCBhbmQgc2V0Z2lkIHByaXZpbGVnZXMgYXJlIGVuYWJsZWQgb25seSB3aGVuCisgICBvcGVuaW5nIHRoZSBkZXZpY2UgYW5kIGFjY2Vzc2luZyB0aGUgbG9ja2ZpbGVzLgorCisgICBMZXQncyBzYXkgInVuaXQiIG1lYW5zIGEgc3RyaW5nIG9mIGRlY2ltYWwgZGlnaXRzICh0aGUgaW50ZXJmYWNlCisgICBpbnN0YW5jZSBudW1iZXIpIGZvbGxvd2VkIChpbiBIUC1VWCAxMC4wMCBhbmQgbGF0ZXIpIGJ5IHRoZSBsZXR0ZXIgInAiCisgICAobG93ZXJjYXNlKSwgZm9sbG93ZWQgYnkgYW5vdGhlciBzdHJpbmcgb2YgZGVjaW1hbCBkaWdpdHMgKHRoZSBwb3J0CisgICBudW1iZXIgb24gdGhlIGludGVyZmFjZSksIGUuZy46CisKKyAgIjBwMCIsICIwcDEiLCAiMXAwIiwgZXRjICAgICAgIChIUC1VWCAxMC4wMCBhbmQgbGF0ZXIpCisgICIwcDAiLCAiMHAxIiwgIjFwMCIsIGV0YyAgICAgICAoSFAtVVggOS54eCBvbiBTZXJpZXMgODAwKQorICAiMDAiLCAgIjAxIiwgICIxMCIsICAiMCIsIGV0YyAgKEhQLVVYIDkueHggbm90IG9uIFNlcmllcyA4MDApCisgICIwMCIsICAiMDEiLCAgIjEwIiwgICIwIiwgZXRjICAoSFAtVVggOC54eCBhbmQgZWFybGllcikKKworICAgVGhlbiBhIG5vcm1hbCBzZXJpYWwgZGV2aWNlIChkcml2ZXIpIG5hbWUgY29uc2lzdHMgb2YgYSBwcmVmaXggKCJ0dHkiLAorICAgInR0eWQiLCAiY3VhIiwgImN1bCIsIG9yIHBvc3NpYmx5ICJjdWFkIiBvciAiY3VsZCIpIGZvbGxvd2VkIGJ5IGEKKyAgIHVuaXQsIGUuZy4gImN1YTBwMCIuIEtlcm1pdCdzIHRyZWF0bWVudCBvZiBVVUNQIGxvY2tmaWxlcyBpcyBhcyBjbG9zZQorICAgYXMgcG9zc2libGUgdG8gdGhhdCBvZiB0aGUgSFAtVVggImN1IiBwcm9ncmFtLiBIZXJlIGlzIGEgdGFibGUgb2YgdGhlCisgICBsb2NrZmlsZXMgdGhhdCBLZXJtaXQgY3JlYXRlcyBmb3IgdW5pdCAwcDA6CisKKyAgU2VsZWN0aW9uICAgICAgTG9ja2ZpbGUgMSAgICAgTG9ja2ZpbGUgMiAgCisgIC9kZXYvdHR5MHAwICAgIExDSy4udHR5MHAwICAgIChub25lKQorKiAvZGV2L3R0eWQwcDAgICBMQ0suLnR0eWQwcDAgICAobm9uZSkKKyAgL2Rldi9jdWEwcDAgICAgTENLLi5jdWEwcDAgICAgTENLLi50dHlkMHAwCisgIC9kZXYvY3VsMHAwICAgIExDSy4uY3VsMHAwICAgIExDSy4udHR5ZDBwMAorICAvZGV2L2N1YWQwcDAgICBMQ0suLmN1YWQwcDAgICBMQ0suLnR0eWQwcDAKKyAgL2Rldi9jdWxkMHAwICAgTENLLi5jdWxkMHAwICAgTENLLi50dHlkMHAwCisgIDxvdGhlcj4gICAgICAgIExDSy4uPG90aGVyPiAgIChub25lKQorCisgICAoKiA9IERpYWxpbiBkZXZpY2UsIHNob3VsZCBub3QgYmUgdXNlZC4pCisKKyAgIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgZGV2aWNlIG5hbWUgYmVnaW5zIHdpdGggImN1IiwgYSBzZWNvbmQgbG9ja2ZpbGUKKyAgIGZvciB0aGUgInR0eWQiIGRldmljZSwgc2FtZSB1bml0LCBpcyBjcmVhdGVkLCB3aGljaCBzaG91bGQgcHJldmVudAorICAgZGlhbGluIGFjY2VzcyBvbiB0aGF0IGRldmljZS4KKworICAgVGhlIDxvdGhlcj4gY2FzZSBhbGxvd3MgZm9yIHN5bWJvbGljIGxpbmtzLCBldGMsIGJ1dCBvZiBjb3Vyc2UgaXQgaXMKKyAgIG5vdCBmb29scHJvb2Ygc2luY2Ugd2UgaGF2ZSBubyB3YXkgb2YgdGVsbGluZyB3aGljaCBkZXZpY2UgaXMgcmVhbGx5CisgICBiZWluZyB1c2VkLgorCisgICBXaGVuIEMtS2VybWl0IHRyaWVzIHRvIG9wZW4gYSBkaWFsb3V0IGRldmljZSB3aG9zZSBuYW1lIGVuZHMgd2l0aCBhCisgICAidW5pdCIsIGl0IHNlYXJjaGVzIHRoZSBsb2NrZmlsZSBkaXJlY3RvcnkgZm9yIGFsbCBwb3NzaWJsZSBuYW1lcyBmb3IKKyAgIHRoZSBzYW1lIHVuaXQuIEZvciBleGFtcGxlLCBpZiB1c2VyIHNlbGVjdHMgL2Rldi9jdWwycDMsIEtlcm1pdCBsb29rcworICAgZm9yIGxvY2tmaWxlcyBuYW1lZDoKKworICBMQ0suLnR0eTJwMworICBMQ0suLnR0eWQycDMKKyAgTENLLi5jdWEycDMKKyAgTENLLi5jdWwycDMKKyAgTENLLi5jdWFkMnAzCisgIExDSy4uY3VsZDJwMworCisgICBJZiBhbnkgb2YgdGhlc2UgZmlsZXMgYXJlIGZvdW5kLCBLZXJtaXQgb3BlbnMgdGhlbSB0byBmaW5kIG91dCB0aGUgSUQKKyAgIChwaWQpIG9mIHRoZSBwcm9jZXNzIHRoYXQgY3JlYXRlZCB0aGVtOyBpZiB0aGUgcGlkIGlzIHN0aWxsIHZhbGlkLCB0aGUKKyAgIHByb2Nlc3MgaXMgc3RpbGwgYWN0aXZlLCBhbmQgc28gdGhlIFNFVCBMSU5FIGNvbW1hbmQgZmFpbHMgYW5kIHRoZQorICAgdXNlciBpcyBpbmZvcm1lZCBvZiB0aGUgcGlkIHNvIHMvaGUgY2FuIHVzZSAicHMiIHRvIGZpbmQgb3V0IHdobyBpcworICAgdXNpbmcgdGhlIGRldmljZS4KKworICAgSWYgdGhlIHBpZCBpcyBub3QgdmFsaWQsIHRoZSBmaWxlIGlzIGRlbGV0ZWQuIElmIGFsbCBzdWNoIGZpbGVzIChpLmUuCisgICB3aXRoIHNhbWUgInVuaXQiIGRlc2lnbmF0aW9uKSBhcmUgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIHRoZW4gdGhlIFNFVAorICAgTElORSBjb21tYW5kIHN1Y2NlZWRzOyB1cCB0byBzaXggbWVzc2FnZXMgYXJlIHByaW50ZWQgdGVsbGluZyB0aGUgdXNlcgorICAgd2hpY2ggInN0YWxlIGxvY2tmaWxlcyIgYXJlIGJlaW5nIHJlbW92ZWQuCisKKyAgIFdoZW4gdGhlICJzZXQgbGluZSIgY29tbWFuZCBzdWNjZWVkcyBpbiBIUC1VWCAxMC4wMCBhbmQgbGF0ZXIsCisgICBDLUtlcm1pdCBhbHNvIGNyZWF0ZXMgYSBVbml4IFN5c3RlbSBWIFI0ICJhZHZpc29yeSBsb2NrIiBhcyBhIGZ1cnRoZXIKKyAgIHByZWNhdXRpb24gKGJ1dCBub3QgZ3VhcmFudGVlKSBhZ2FpbnN0IGFueSBvdGhlciBwcm9jZXNzIG9idGFpbmluZworICAgYWNjZXNzIHRvIHRoZSBkZXZpY2Ugd2hpbGUgeW91IGFyZSB1c2luZyBpdC4KKworICAgSWYgdGhlIHNlbGVjdGVkIGRldmljZSB3YXMgaW4gdXNlIGJ5ICJjdSIsIEtlcm1pdCBjYW4ndCBvcGVuIGl0LAorICAgYmVjYXVzZSAiY3UiIGhhcyBjaGFuZ2VkIGl0cyBvd25lcnNoaXAsIHNvIHdlIG5ldmVyIGdldCBhcyBmYXIgYXMKKyAgIGxvb2tpbmcgYXQgdGhlIGxvY2tmaWxlcy4gSW4gdGhlIG5vcm1hbCBjYXNlLCB3ZSBjYW4ndCBldmVuIGxvb2sgYXQKKyAgIHRoZSBkZXZpY2UgdG8gc2VlIHdobyB0aGUgb3duZXIgaXMgYmVjYXVzZSBpdCBpcyB2aXNpYmxlIG9ubHkgdG8gaXRzCisgICAocHJlc2VudCkgb3duZXIuIEluIHRoaXMgY2FzZSwgS2VybWl0IHNheXMgKGZvciBleGFtcGxlKToKKworICAvZGV2L2N1YTBwMDogUGVybWlzc2lvbiBkZW5pZWQKKworICAgV2hlbiBLZXJtaXQgcmVsZWFzZXMgYSBkZXZpY2UgaXQgaGFzIHN1Y2Nlc3NmdWxseSBvcGVuZWQsIGl0IHJlbW92ZXMKKyAgIGFsbCB0aGUgbG9ja2ZpbGVzIHRoYXQgaXQgY3JlYXRlZC4gVGhpcyBhbHNvIGhhcHBlbnMgd2hlbmV2ZXIgS2VybWl0CisgICBleGl0cyAidW5kZXIgaXRzIG93biBwb3dlciIuCisKKyAgIElmIEtlcm1pdCBpcyBraWxsZWQgd2l0aCBhIGRldmljZSBvcGVuLCB0aGUgbG9ja2ZpbGUocykgYXJlIGxlZnQKKyAgIGJlaGluZC4gVGhlIG5leHQgS2VybWl0IHByb2dyYW0gdGhhdCB0cmllcyB0byBhc3NpZ24gdGhlIGRldmljZSwgdW5kZXIKKyAgIGFueSBvZiBpdHMgdmFyaW91cyBuYW1lcywgd2lsbCBhdXRvbWF0aWNhbGx5IGNsZWFuIHVwIHRoZSBzdGFsZQorICAgbG9ja2ZpbGVzIGJlY2F1c2UgdGhlIHBpZHMgdGhleSBjb250YWluIGFyZSBpbnZhbGlkLiBUaGUgYmVoYXZpb3Igb2YKKyAgIGN1IGFuZCBvdGhlciBjb21tdW5pY2F0aW9uIHByb2dyYW1zIHVuZGVyIHRoZXNlIGNvbmRpdGlvbnMgc2hvdWxkIGJlCisgICB0aGUgc2FtZS4KKworICAgSGVyZSwgYnkgdGhlIHdheSwgaXMgYSBzdW1tYXJ5IG9mIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBIUC1VWAorICAgcG9ydCBkcml2ZXIgdHlwZXMgZnJvbSBKb2huIFBlenphbm8gb2YgSFA6CisKKyAgICAgVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIGRldmljZSBmaWxlcyBmb3IgZWFjaCBwb3J0LgorCisgICAgIFRoZSB0dHlkWFhYIGRldmljZSBmaWxlIGlzIGRlc2lnbmVkIHRvIHdvcmsgYXMgZm9sbG93czoKKworICAgIDEuIFRoZSBwcm9jZXNzIHRoYXQgb3BlbnMgaXQgZG9lcyBOT1QgZ2V0IGNvbnRyb2wgb2YgdGhlIHBvcnQgdW50aWwKKyAgICAgICBDRCBpcyBhc3NlcnRlZC4gVGhpcyB3YXMgaW50ZW50aW9uYWwgKG92ZXIgMTUgeWVhcnMgYWdvKSB0byBhbGxvdworICAgICAgIGdldHR5IHRvIG9wZW4gdGhlIHBvcnQgYnV0IG5vdCBjb250cm9sIGl0IHVudGlsIHNvbWVvbmUgY2FsbGVkIGluLgorICAgICAgIElmIGEgcHJvY2VzcyB3YW50cyB0byB1c2UgdGhlIGRpcmVjdCBvciBjYWxsb3V0IGRldmljZSBmaWxlcworICAgICAgICh0dHlYWFggYW5kIGN1bFhYWCByZXNwZWN0aXZlbHkpLCB0aGV5IHdpbGwgdGhlbiBnZXQgY29udHJvbCBhbmQKKyAgICAgICBnZXR0eSB3b3VsZCBiZSBibG9ja2VkLiBUaGlzIGVsaW1pbmF0ZWQgdGhlIG5lZWQgdG8gdXNlIHV1Z2V0dHkKKyAgICAgICAoYW5kIGl0cyBpbmhlcmVudCBwcm9ibGVtcyB3aXRoIGxvY2sgZmlsZXMpIGZvciBtb2RlbXMuIFlvdSBjYW4KKyAgICAgICBzZWUgdGhpcyBkZW1vbnN0cmF0ZWQgYnkgdGhlIGZhY3QgdGhhdCAicHMgLWVmIiBzaG93cyBhID8gaW4gdGhlCisgICAgICAgdHR5IGNvbHVtbiBmb3IgdGhlIGdldHR5IHByb2Nlc3MgYXMgZ2V0dHkgZG9lcyBub3QgaGF2ZSB0aGUgcG9ydAorICAgICAgIHlldC4KKyAgICAyLiBPbmNlIENEIGlzIGFzc2VydGVkLCB0aGUgcG9ydCBpcyBjb250cm9sbGVkIGJ5IGdldHR5IChvciB0aGUKKyAgICAgICBwcm9jZXNzIGhhbmRsaW5nIGFuIGluY29taW5nIGNhbGwpIGlmIHRoZXJlIHdhcyBubyBwcm9jZXNzIHVzaW5nCisgICAgICAgdGhlIHBvcnQuIFRoZSA/IGluIHRoZSAicHMiIGNvbW1hbmQgbm93IHNob3dzIHRoZSBwb3J0LiBBdCB0aGlzCisgICAgICAgcG9pbnQsIHRoZSBwb3J0IGFjY2VwdHMgZGF0YS4KKworICAgICBUaGVyZWZvcmUgeW91IHNob3VsZCB1c2UgZWl0aGVyIHRoZSBjYWxsb3V0IGN1bFhYWCBkZXZpY2UgZmlsZQorICAgICAoaW1tZWRpYXRlIGNvbnRyb2wgYnV0IG5vIGRhdGEgdW50aWwgQ0QgaXMgYXNzZXJ0ZWQpIG9yIHRoZSBkaXJlY3QKKyAgICAgZGV2aWNlIGZpbGUgdHR5WFhYIHdoaWNoIGdpdmVzIGltbWVkaWF0ZSBjb250cm9sIGFuZCBpbW1lZGlhdGUgZGF0YQorICAgICBhbmQgd2hpY2ggaWdub3JlcyBieSBkZWZhdWx0IG1vZGVtIGNvbnRyb2wgc2lnbmFscy4KKworICAgICBUaGUgdHR5ZFhYWCBkZXZpY2Ugc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgY2FsbGluIGFuZCBteQorICAgICByZWNvbW1lbmRhdGlvbiBpcyB0byB1c2UgaXQgb25seSBmb3IgZ2V0dHkgYW5kIHV1Z2V0dHkuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4yLjQgTm90ZXMgb24gU3BlY2lmaWMgSFAtVVggUmVsZWFzZXMKKworICAgU0VDVElPTiBDT05URU5UUworCisgIDMuMi40LjEuIFsyMTZdSFAtVVggMTEKKyAgMy4yLjQuMi4gWzIxN11IUC1VWCAxMAorICAzLjIuNC4zLiBbMjE4XUhQLVVYIDkKKyAgMy4yLjQuNC4gWzIxOV1IUC1VWCA4CisgIDMuMi40LjUuIFsyMjBdSFAtVVggNyBhbmQgRWFybGllcgorCisgIDMuMi40LjEuIEhQLVVYIDExCisKKyAgIFsgWzIyMV1Ub3AgXSBbIFsyMjJdQ29udGVudHMgXSBbIFsyMjNdU2VjdGlvbiBDb250ZW50cyBdIFsgWzIyNF1OZXh0IF0KKworICAgQXMgbm90ZWQgaW4gWzIyNV1TZWN0aW9uIDMuMi4yLCB0aGUgSFAtVVggMTEgVGVsbmV0IHNlcnZlciBhbmQvb3IKKyAgIHBzZXVkb3Rlcm1pbmFsIGRyaXZlciBhcmUgYSBzZXJpb3VzIGltcGVkaW1lbnQgdG8gZmlsZSB0cmFuc2ZlciBvdmVyCisgICBUZWxuZXQgY29ubmVjdGlvbnMgaW50byBIUC1VWC4gSWYgeW91IGhhdmUgYSBUZWxuZXQgY29ubmVjdGlvbiBpbnRvCisgICBIUC1VWCAxMSwgdGVsbCB5b3VyIGRlc2t0b3AgS2VybWl0IHByb2dyYW0gdG86CisKKyAgc2V0IHN0cmVhbWluZyBvZmYKKyAgc2V0IHJlY2VpdmUgcGFja2V0LWxlbmd0aCAyMDAwCisgIHNldCBzZW5kIHBhY2tldC1sZW5ndGggNTAwCisKKyAgIEZpbGUgdHJhbnNmZXIgc3BlZWRzIG92ZXIgY29ubmVjdGlvbnMgZnJvbSBIUC1VWCAxMSAoZGlhbGVkIG9yIFRlbG5ldCkKKyAgIGFyZSBub3QgaW1wZWRlZCB3aGF0c29ldmVyLCBhbmQgY2FuIGdvIGF0IHdoYXRldmVyIHNwZWVkIGlzIGFsbG93ZWQgYnkKKyAgIHRoZSBjb25uZWN0aW9uIGFuZCB0aGUgS2VybWl0IHBhcnRuZXIgb24gdGhlIGZhciBlbmQuCisKKyAgIFBBLVJJU0MgYmluYXJpZXMgZm9yIEhQLVVYIDEwLjIwIG9yIGxhdGVyIHNob3VsZCBydW4gb24gYW55IFBBLVJJU0MKKyAgIHN5c3RlbSwgUzcwMCBvciBTODAwLCBhcyBsb25nIGFzIHRoZSBiaW5hcnkgd2FzIG5vdCBidWlsdCB1bmRlciBhCisgICBsYXRlciBIUC1VWCB2ZXJzaW9uIHRoYW4gdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbS4gSFAtVVggMTEuMDAgYW5kCisgICAxMS4xMSBhcmUgb25seSBmb3IgUEEtUklTQyBzeXN0ZW1zLiBIUC1VWCAxMS4yMCBpcyBvbmx5IGZvciBJQTY0CisgICAoc3Vic2VxdWVudCBIUC1VWCByZWxlYXNlcyB3aWxsIGJlIGZvciBib3RoIFBBLVJJU0MgYW5kIElBNjQpLiBUbworICAgY2hlY2sgYmluYXJ5IGNvbXBhdGliaWxpdHksIHRoZSBmb2xsb3dpbmcgQy1LZXJtaXQgOC4wIGJpbmFyaWVzIHdlcmUKKyAgIHJ1biBzdWNjZXNzZnVsbHkgb24gYW4gSFAtOTAwMC83ODUgd2l0aCBIUC1VWCAxMS4xMToKKworICAgICAqIE1vZGVsIDd4eCBIUC1VWCAxMC4yMAorICAgICAqIE1vZGVsIDh4eCBIUC1VWCAxMC4yMAorICAgICAqIE1vZGVsIDd4eCBIUC1VWCAxMS4wMAorICAgICAqIE1vZGVsIDh4eCBIUC1VWCAxMS4wMAorICAgICAqIE1vZGVsIDd4eCBIUC1VWCAxMS4xMQorICAgICAqIE1vZGVsIDh4eCBIUC1VWCAxMS4xMQorCisgICBCaW5hcmllcyBidWlsdCB1bmRlciBzb21lIG9mIHRoZSBlYXJsaWVyIEhQLVVYIHJlbGVhc2VzLCBzdWNoIGFzIDkuMDUsCisgICBtaWdodCBhbHNvIHdvcmssIGJ1dCBvbmx5IGlmIGJ1aWx0IGZvciB0aGUgc2FtZSBoYXJkd2FyZSBmYW1pbHkgKGUuZy4KKyAgIHM3MDApLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMi40LjIuIEhQLVVYIDEwCisKKyAgIFsgWzIyNl1Ub3AgXSBbIFsyMjddQ29udGVudHMgXSBbIFsyMjhdU2VjdGlvbiBDb250ZW50cyBdIFsgWzIyOV1OZXh0IF0KKyAgIFsgWzIzMF1QcmV2aW91cyBdCisKKyAgIEJlZ2lubmluZyBpbiBIUC1VWCAxMC4xMCwgbGliY3Vyc2VzIGlzIGxpbmtlZCB0byBsaWJ4Y3Vyc2VzLCB0aGUgbmV3CisgICBVTklYOTUgKFgvT3BlbikgdmVyc2lvbiBvZiBjdXJzZXMsIHdoaWNoIGhhcyBzb21lIHNlcmlvdXMgYnVnczsgc29tZQorICAgcm91dGluZXMsIHdoZW4gY2FsbGVkLCB3b3VsZCBoYW5nIGFuZCBuZXZlciByZXR1cm4sIHNvbWUgd291bGQgZHVtcAorICAgY29yZS4gRXZpZGVudGx5IGxpYnhjdXJzZXMgY29udGFpbnMgYSBzZWxlY3QoKSByb3V0aW5lLCBhbmQgd2hlbmV2ZXIKKyAgIEMtS2VybWl0IGNhbGxzIHdoYXQgaXQgdGhpbmtzIGlzIHRoZSByZWd1bGFyIChzb2NrZXRzKSBzZWxlY3QoKSwgaXQKKyAgIGdldHMgdGhlIGN1cnNlcyBvbmUsIGNhdXNpbmcgYSBzZWdtZW50YXRpb24gZmF1bHQuIFRoZXJlIGlzIGEgcGF0Y2gKKyAgIGZvciB0aGlzIGZyb20gSFAsIFBIQ09fODA4NiwgInM3MDBfODAwIDEwLjEwIGxpYmN1cnNlcyBwYXRjaCIsICJzaGFyZWQKKyAgIGxpYiBjdXJzZXMgcHJvZ3JhbSBoYW5ncyBvbiAxMC4xMCIsICIxMC4xMCBlbmhhbmNlZCBYL09wZW4gY3Vyc2VzIGNvcmUKKyAgIGR1bXBzIGR1ZSB0byB1c2luZyB3cm9uZyBzZWxlY3QgY2FsbCIsIDk2LzA4LzAyICh5b3UgY2FuIHRlbGwgaWYgdGhlCisgICBwYXRjaCBpcyBpbnN0YWxsZWQgd2l0aCAid2hhdCAvdXNyL2xpYi9saWJ4Y3Vyc2VzLjEiOyB0aGUgdW5wYXRjaGVkCisgICB2ZXJzaW9uIGlzIDc2LjIwLCB0aGUgcGF0Y2hlZCBvbmUgaXMgNzYuMjAuMS4yKS4gSXQgaGFzIGJlZW4gdmVyaWZpZWQKKyAgIHRoYXQgQy1LZXJtaXQgd29ya3MgT0sgd2l0aCB0aGUgcGF0Y2hlZCBsaWJyYXJ5LCBidXQgcmVzdWx0cyBhcmUgbm90CisgICBkZWZpbml0ZSBmb3IgSFAtVVggMTAuMjAgb3IgaGlnaGVyLgorCisgICBUbyBlbnN1cmUgdGhhdCBDLUtlcm1pdCB3b3JrcyBldmVuIG9uIG5vbi1wYXRjaGVkIEhQLVVYIDEwLjEwIHN5c3RlbXMsCisgICBzZXBhcmF0ZSBtYWtlZmlsZSBlbnRyaWVzIGFyZSBwcm92aWRlZCBmb3IgSFAtVVggMTAuMDAvMTAuMDEsIDEwLjEwLAorICAgMTAuMjAsIGV0YywgaW4gd2hpY2ggdGhlIGVudHJpZXMgZm9yIDEwLjEwIGFuZCBhYm92ZSBsaW5rIHdpdGgKKyAgIGxpYkhjdXJzZXMsIHdoaWNoIGlzICJIUCBjdXJzZXMiLCB0aGUgb25lIHRoYXQgd2FzIHVzZWQgaW4KKyAgIDEwLjAwLzEwLjAxLiBIUC1VWCAxMS4yMCBhbmQgbGF0ZXIsIGhvd2V2ZXIsIGxpbmsgd2l0aCBsaWJjdXJzZXMsIGFzCisgICBsaWJIY3Vyc2VzIGRpc2FwcGVhcmVkIGluIDExLjIwLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMi40LjMuIEhQLVVYIDkKKworICAgWyBbMjMxXVRvcCBdIFsgWzIzMl1Db250ZW50cyBdIFsgWzIzM11TZWN0aW9uIENvbnRlbnRzIF0gWyBbMjM0XU5leHQgXQorICAgWyBbMjM1XVByZXZpb3VzIF0KKworICAgSFAtVVggOS4wMCBhbmQgOS4wMSBuZWVkIHBhdGNoIFBITkVfMTA1NzIgKG5vdGU6IHRoaXMgcmVwbGFjZXMKKyAgIFBITkVfMzY0MSkgZm9yIGhwdHQwLm8sIGFzaW8wLm8sIGFuZCB0dHljb21uLm8gaW4gbGliaHAtdXguYS4gQ29udGFjdAorICAgSGV3bGV0dCBQYWNrYXJkIGlmIHlvdSBuZWVkIHRoaXMgcGF0Y2guIFdpdGhvdXQgaXQsIHRoZSBkaWFsb3V0IGRldmljZQorICAgKHR0eSkgd2lsbCBiZSBodW5nIGFmdGVyIGZpcnN0IHVzZTsgc3Vic2VxdWVudCBhdHRlbXB0cyB0byB1c2Ugd2lsbAorICAgcmV0dXJuIGFuIGVycm9yIGxpa2UgImRldmljZSBidXN5Ii4gKFRoZXJlIGFyZSBhbHNvIGVxdWl2YWxlbnQgcGF0Y2hlcworICAgZm9yIHM3MDAgOS4wMyA5LjA1IDkuMDcgKFBITkVfMTA1NzMpIGFuZCBzODAwIDkuMDAgOS4wNCAoUEhORV8xMDQxNikuCisKKyAgIFdoZW4gQy1LZXJtaXQgaXMgaW4gc2VydmVyIG1vZGUsIGl0IG1pZ2h0IGhhdmUgdHJvdWJsZSBleGVjdXRpbmcKKyAgIFJFTU9URSBIT1NUIGNvbW1hbmRzLiBUaGlzIHByb2JsZW0gaGFwcGVucyB1bmRlciBIUC1VWCA5LjAwIChNb3Rvcm9sYSkKKyAgIGFuZCBIUC1VWCA5LjAxIChSSVNDKSBJRiB0aGUgQy1TaGVsbCBpcyB0aGUgbG9naW4gc2hlbGwgQU5EIHdpdGggdGhlCisgICBDLVNoZWxsIFJldmlzaW9uIDcwLjE1LiBCZXN0IHRoaW5nIGlzIHRvIGluc3RhbGwgSFAncyBQYXRjaCBQSENPXzQ5MTkKKyAgIGZvciBTZXJpZXMgMzAwLzQwMCBhbmQgUEhDT181MDE1IGZvciB0aGUgU2VyaWVzIDcwMC84MDAuIFBIQ09fNTAxNSBpcworICAgY2FsbGVkICJzNzAwXzgwMCA5LlggY3VtdWxhdGl2ZSBjc2goMSkgcGF0Y2ggd2l0aCBtZW1vcnkgbGVhayBmaXgiCisgICB3aGljaCB3b3JrcyBmb3IgSFAtVVggOS4wMCwgOS4wMSwgOS4wMywgOS4wNCwgOS4wNSBhbmQgOS4wNy4gQXQgbGVhc3QKKyAgIHlvdSBuZWVkIEMtU2hlbGwgUmV2aXNpb24gNzIuMTIhCisKKyAgIEMtS2VybWl0IHdvcmtzIGZpbmUgLS0gaW5jbHVkaW5nIGl0cyBjdXJzZXMtYmFzZWQgZmlsZS10cmFuc2ZlcgorICAgZGlzcGxheSAtLSBvbiB0aGUgY29uc29sZSB0ZXJtaW5hbCwgaW4gYSByZW1vdGUgc2Vzc2lvbiAoZS5nLiB3aGVuCisgICBsb2dnZWQgaW4gdG8gdGhlIEhQIDkwMDAgb24gYSB0ZXJtaW5hbCBwb3J0IG9yIHdoZW4gdGVsbmV0dGVkIG9yCisgICBybG9naW4nZCksIGFuZCBpbiBhbiBIUC1WVUUgaHB0ZXJtIHdpbmRvdyBvciBhbiB4dGVybSB3aW5kb3cuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4yLjQuNC4gSFAtVVggOAorCisgICBbIFsyMzZdVG9wIF0gWyBbMjM3XUNvbnRlbnRzIF0gWyBbMjM4XVNlY3Rpb24gQ29udGVudHMgXSBbIFsyMzldTmV4dCBdCisgICBbIFsyNDBdUHJldmlvdXMgXQorCisgICBUbyBtYWtlIEMtS2VybWl0IHdvcmsgb24gSFAtVVggOC4wNSBvbiBhIG1vZGVsIDcyMCwgb2J0YWluIGFuZCBpbnN0YWxsCisgICBIUC1VWCBwYXRjaCBQSE5FXzA4OTkuIFRoaXMgcGF0Y2ggZGVhbHMgd2l0aCBhIGxvdCBvZiBkcml2ZXIgaXNzdWVzLAorICAgcGFydGljdWxhcmx5IHJlbGF0ZWQgdG8gY29tbXVuaWNhdGlvbiBhdCBoaWdoZXIgc3BlZWRzLgorCisgICBPbmUgdXNlciByZXBvcnRzOgorCisgICAgIE9uIEhQLVVYIDggRE9OJ1QgaW5zdGFsbCAndHR5IHBhdGNoJyBQSEtMXzQ2NTYsIGluc3RhbGwgUEhLTF8zMDQ3CisgICAgIGluc3RlYWQhIFllc3RlcmRheSBJIHRyaWVkIHRoaXMgbGF0ZXN0IHR0eSBwYXRjaCBQSEtMXzQ2NTYgYW5kIGhhZAorICAgICB0ZXJyaWJsZSBwcm9ibGVtcy4gVGhpcyBwYXRjaCBzaG91bGQgZml4IFJUUy9DVFMgcHJvYmxlbXMuIFdpdGgKKyAgICAgdGV4dCB0cmFuc3ZlciBhbGwgbG9va3MgbmljZS4gQnV0IHdoZW4gSSBzd2l0Y2hlZCBvdmVyIHRvIGJpbmFyeQorICAgICBmaWxlcyB0aGUgc2VyaWFsIGludGVyZmFjZSByZXR1cm5lZCBvbmx5IHJ1YmlzaCB0byBDLUtlcm1pdC4gQWxsCisgICAgIHNvcnRzIG9mIHByb3RvY29sLCBDUkMgYW5kIHBhY2tlZCBlcnJvcnMgSSBoYWQuIEFmdGVyIHNldmVyYWwgdGVzdHMKKyAgICAgYW5kIGFmdGVyIHVuaW5zdGFsbGluZyB0aGF0IHBhdGNoLCBhbGwgdHJhbnN2ZXJzIHdvcmtlZCBmaW5lLiBNQidzCisgICAgIG9mIGRhdGEgd2l0aG91dCBhbnkgZXJyb3JzLiBTbyBrZWVwIHlvdXIgZmluZ2VycyBhd2F5IGZyb20gdGhhdAorICAgICBwYXRjaC4gSWYgYW55Ym9keSBuZWVkcyB0aGUgUEhLTF8zMDQ3IHBhdGNoIEkgaGF2ZSBpdCBoZXJlLiBJdCBpcworICAgICBubyBsb25nZXIgYXZhaWxhYmVsIGZyb20gSFAncyBwYXRjaCBiYXNlLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMi40LjUuIEhQLVVYIDcgYW5kIEVhcmxpZXIKKworICAgWyBbMjQxXVRvcCBdIFsgWzI0Ml1Db250ZW50cyBdIFsgWzI0M11TZWN0aW9uIENvbnRlbnRzIF0gWworICAgWzI0NF1QcmV2aW91cyBdCisKKyAgIFdoZW4gdHJhbnNmZXJyaW5nIGZpbGVzIGludG8gSFAtVVggNSBvciA2IG92ZXIgYSBUZWxuZXQgY29ubmVjdGlvbiwKKyAgIHlvdSBtdXN0IG5vdCB1c2Ugc3RyZWFtaW5nLCBhbmQgeW91IG11c3Qgbm90IHVzZSBhIHBhY2tldCBsZW5ndGgKKyAgIGdyZWF0ZXIgdGhhbiA1MTIuIEhvd2V2ZXIsIHlvdSBjYW4gdXNlIHN0cmVhbWluZyBhbmQgbG9uZ2VyIHBhY2tldHMKKyAgIHdoZW4gc2VuZGluZyBmaWxlcyBmcm9tIEhQLVVYIG9uIGEgVGVsbmV0IGNvbm5lY3Rpb24uIEluIEMtS2VybWl0IDguMCwKKyAgIHRoZSBkZWZhdWx0IHJlY2VpdmUgcGFja2V0IGxlbmd0aCBmb3IgSFAtVVggNSBhbmQgNiB3YXMgY2hhbmdlZCB0byA1MDAKKyAgIChidXQgeW91IGNhbiBzdGlsbCBpbmNyZWFzZSBpdCB3aXRoIFNFVCBSRUNFSVZFIFBBQ0tFVC1MRU5HVEggaWYgeW91CisgICB3aXNoLCBlLmcuIGZvciBub24tVGVsbmV0IGNvbm5lY3Rpb25zKS4gRGlzYWJsZSBzdHJlYW1pbmcgd2l0aCBTRVQKKyAgIFNUUkVBTUlORyBPRkYuCisKKyAgIFRoZSBIUC1VWCA1LjAwIHZlcnNpb24gb2YgQy1LZXJtaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgZnVsbHNjcmVlbgorICAgZmlsZS10cmFuc2ZlciBiZWNhdXNlIG9mIHByb2JsZW1zIHdpdGggdGhlIGN1cnNlcyBsaWJyYXJ5LgorCisgICBJZiBIUC1VWCA1LjIxIHdpdGggV29sbG9uZ29uZyBUQ1AvSVAgaXMgb24gdGhlIHJlbW90ZSBlbmQgb2YgYSBUZWxuZXQKKyAgIGNvbm5lY3Rpb24sIHN0cmVhbWluZyB0cmFuc2ZlcnMgdG8gSFAtVVggaW52YXJpYWJseSBmYWlsLiBXb3JrYXJvdW5kOgorICAgU0VUIFNUUkVBTUlORyBPRkYuIFBhY2tldHMgbG9uZ2VyIHRoYW4gYWJvdXQgMTAwMCBzaG91bGQgbm90IGJlIHVzZWQuCisgICBUcmFuc2ZlcnMgZnJvbSB0aGVzZSBzeXN0ZW1zLCBob3dldmVyLCBjYW4gdXNlIHN0cmVhbWluZyBhbmQvb3IgbG9uZ2VyCisgICBwYWNrZXRzLgorCisgICBSZXBvcnRlZGx5LCAiW3RoZXJlIGlzXSBhIGJ1ZyBpbiBDLUtlcm1pdCB1c2luZyBIUC1VWCB2ZXJzaW9uIDUuMjEgb24KKyAgIHRoZSBIUC05MDAwIHNlcmllcyA1MDAgY29tcHV0ZXJzLiBJdCBvbmx5IG9jY3VycyB3aGVuIHRoZSBjb250cm9sbGluZworICAgdGVybWluYWwgaXMgdXNpbmcgYW4gSFAtMjcxNDAgc2l4LXBvcnQgbW9kZW0gbXV4LiBUaGUgcHJvYmxlbSBpcyBub3QKKyAgIHByZXNlbnQgaWYgdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIGlzIGxvZ2dlZCBpbnRvIGFuIEhQLTI3MTMwCisgICBlaWdodC1wb3J0IG11eC4gVGhlIHN5bXB0b20gaXMgdGhhdCBqdXN0IGFmdGVyIGRpYWxpbmcgc3VjY2Vzc2Z1bGx5CisgICBhbmQgY29ubmVjdGluZyBLZXJtaXQgbG9ja3MgdXAgYW5kIHRoZSBwb3J0IGlzIHVudXNhYmxlIHVudGlsIGJvdGgKKyAgIGZvcmtzIG9mIEtlcm1pdCBhbmQgdGhlIGxvZ2luIHNoZWxsIGFyZSBraWxsZWQuIiAoVGhpcyByZXBvcnQgcHJlZGF0ZXMKKyAgIEMtS2VybWl0IDYuMCBhbmQgbWlnaHQgbm8gbG9uZ2VyIGFwcGx5LikKKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjIuNS4gSFAtVVggYW5kIFguMjUKKworICAgWyBbMjQ1XVRvcCBdIFsgWzI0Nl1Db250ZW50cyBdIFsgWzI0N11TZWN0aW9uIENvbnRlbnRzIF0gWworICAgWzI0OF1QcmV2aW91cyBdCisKKyAgIEFsdGhvdWdoIEMtS2VybWl0IHByZXNlbnRseSBkb2VzIG5vdCBpbmNsdWRlIGJ1aWx0LWluIHN1cHBvcnQgZm9yCisgICBIUC1VWCBYLjI1IChhcyBpdCBkb2VzIGZvciB0aGUgU3VuIGFuZCBJQk0gWC4yNSBwcm9kdWN0cyksIGl0IGNhbgorICAgc3RpbGwgYmUgdXNlZCB0byBtYWtlIFguMjUgY29ubmVjdGlvbnMgYXMgZm9sbG93czogc3RhcnQgS2VybWl0IGFuZAorICAgdGhlbiB0ZWxuZXQgdG8gbG9jYWxob3N0LiBBZnRlciBsb2dnaW5nIGJhY2sgaW4sIHN0YXJ0IHBhZGVtIGFzIHlvdQorICAgd291bGQgbm9ybWFsbHkgZG8gdG8gY29ubmVjdCBvdmVyIFguMjUuIFBhZGVtIGFjdHMgYXMgYSBwaXBlIGJldHdlZW4KKyAgIEtlcm1pdCBhbmQgWC4yNS4gSW4gQy1LZXJtaXQgNy4wLCB5b3UgbWlnaHQgYWxzbyBiZSBhYmxlIHRvIGF2b2lkIHRoZQorICAgInRlbG5ldCBsb2NhbGhvc3QiIHN0ZXAgYnkgdXNpbmc6CisKKyAgQy1LZXJtaXQ+IHB0eSBwYWRlbSBhZGRyZXNzCisKKyAgIFRoaXMgd29ya3MgaWYgcGFkZW0gdXNlcyBzdGFuZGFyZCBpL28gKHdobyBrbm93cz8pLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMy4gQy1LRVJNSVQgQU5EIExJTlVYCisKKyAgIFsgWzI0OV1Ub3AgXSBbIFsyNTBdQ29udGVudHMgXSBbIFsyNTFdU2VjdGlvbiBDb250ZW50cyBdIFsgWzI1Ml1OZXh0IF0KKyAgIFsgWzI1M11QcmV2aW91cyBdCisKKyAgIFNFQ1RJT04gQ09OVEVOVFMKKworICAzLjMuMS4gWzI1NF1Qcm9ibGVtcyBCdWlsZGluZyBDLUtlcm1pdCBmb3IgTGludXgKKyAgMy4zLjIuIFsyNTVdUHJvYmxlbXMgd2l0aCBTZXJpYWwgRGV2aWNlcyBpbiBMaW51eAorICAzLjMuMy4gWzI1Nl1UZXJtaW5hbCBFbXVsYXRpb24gaW4gTGludXgKKyAgMy4zLjQuIFsyNTddRGF0ZXMgYW5kIFRpbWVzCisgIDMuMy41LiBbMjU4XVN0YXJ0dXAgRXJyb3JzCisgIDMuMy42LiBbMjU5XVRoZSBGdWxsc2NyZWVuIEZpbGUgVHJhbnNmZXIgRGlzcGxheQorCisgICBSRUZFUkVOQ0VTCisKKyAgIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCByZWFkIHRoZSBbMjYwXWNvbXAub3MubGludXgubWlzYywKKyAgIFsyNjFdY29tcC5vcy5saW51eC5hbnN3ZXJzLCBhbmQgb3RoZXIgTGludXgtb3JpZW50ZWQgbmV3c2dyb3VwcywgYW5kCisgICBzZWU6CisKKyAgIFRoZSBMaW51eCBEb2N1bWVudCBQcm9qZWN0IChMRFApCisgICAgICAgICAgWzI2Ml1odHRwOi8vd3d3LnRsZHAub3JnLworCisgICBUaGUgTGludXggRkFRCisgICAgICAgICAgWzI2M11odHRwOi8vd3d3LnRsZHAub3JnL0ZBUS9MaW51eC1GQVEuaHRtbAorCisgICBUaGUgTGludXggSE9XVE9zIChlc3BlY2lhbGx5IHRoZSBTZXJpYWwgSE9XVE8pCisKKyAgICAgWzI2NF1odHRwOi8vd3d3LnRsZHAub3JnL0hPV1RPL1NlcmlhbC1IT1dUTy5odG1sCisKKyAgICAgWzI2NV1odHRwOi8vdGxkcC5vcmcvSE9XVE8vTW9kZW0tSE9XVE8uaHRtbAorCisgICAgIFsyNjZdZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9kb2NzL0hPV1RPCisKKyAgICAgWzI2N11mdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvZG9jcy9IT1dUTworCisgICAgIFsyNjhdaHR0cDovL3d3dy50bGRwLm9yZy9IT1dUTy8KKworICAgICBbMjY5XWh0dHA6Ly93d3cudGxkcC5vcmcvaG1pcnJvcnMuaHRtbAorCisgICBMaW51eCBWZW5kb3IgVGVjaCBTdXBwb3J0IFBhZ2VzOgorCisgICAgIFsyNzBdaHR0cDovL3d3dy5yZWRoYXQuY29tL2FwcHMvc3VwcG9ydC8KKworICAgICBbMjcxXWh0dHA6Ly93d3cuZGViaWFuLm9yZy9zdXBwb3J0CisKKyAgICAgWzI3Ml1odHRwOi8vd3d3LnNsYWNrd2FyZS5jb20vc3VwcG9ydC8KKworICAgICBbMjczXWh0dHA6Ly93d3cuY2FsZGVyYS5jb20vc3VwcG9ydC8KKworICAgICBbMjc0XWh0dHA6Ly93d3cuc3VzZS5jb20vc3VwcG9ydC8KKworICAgICBbMjc1XWh0dHA6Ly93d3cubWFuZHJha2UuY29tL3N1cHBvcnQvCisKKyAgICAgWzI3Nl1odHRwOi8vd3d3LnR1cmJvbGludXguY29tL3N1cHBvcnQvCisKKyAgIExpbnV4IFdpbm1vZGVtIFN1cHBvcnQKKyAgICAgICAgICBbMjc3XWh0dHA6Ly93d3cubGlubW9kZW1zLm9yZy8KKworICAgQWxzbyBzZWUgZ2VuZXJhbCBjb21tZW50cyBvbiBQQy1iYXNlZCBVbml4ZXMgaW4gWzI3OF1TZWN0aW9uIDMuMC4KKworICAgV2hhdCBMaW51eCB2ZXJzaW9uIGlzIGl0PyAtLSAidW5hbWUgLWEiIHN1cHBsaWVzIG9ubHkga2VybmVsCisgICBpbmZvcm1hdGlvbiwgYnV0IHRoZXNlIGRheXMgaXQncyB0aGUgZGlzdHJpYnV0aW9uIHRoYXQgbWF0dGVyczogUmVkCisgICBIYXQgNy4zLCBEZWJpYW4gMi4yLCBTbGFja3dhcmUgOC4wLCBldGMuIFVuZm9ydHVuYXRlbHkgdGhlcmUncyBubworICAgY29uc2lzdGVudCB3YXkgdG8gZ2V0IHRoZSBkaXN0cmlidXRpb24gdmVyc2lvbi4gVXN1YWxseSBpdCdzIGluIGEKKyAgIGRpc3RyaWJ1dGlvbi1zcGVjaWZpYyBmaWxlOgorCisgICAgIFJlZCBIYXQ6ICAgL2V0Yy9pc3N1ZSBvciAvZXRjL3JlZGhhdC1yZWxlYXNlCisgICAgIERlYmlhbjogICAgL2V0Yy9kZWJpYW5fdmVyc2lvbgorICAgICBTbGFja3dhcmU6IC9ldGMvc2xhY2t3YXJlLXZlcnNpb24gKGF0IGxlYXN0IGluIGxhdGVyIHZlcnNpb25zKQorCisgICBEaWQgeW91IGtub3c6IERFQ25ldCBpcyBhdmFpbGFibGUgZm9yIExpbnV4PyBTZWU6CisKKyAgWzI3OV1odHRwOi8vbGludXguZHJlYW10aW1lLm9yZy9kZWNuZXQvCisKKyAgIChCdXQgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgaXQgaW4gQy1LZXJtaXQgLS0gYW55Ym9keSBpbnRlcmVzdGVkIGluCisgICBhZGRpbmcgaXQsIHBsZWFzZSBbMjgwXWxldCB1cyBrbm93KS4KKworICAgQmVmb3JlIHByb2NlZWRpbmcsIGxldCdzIGhhbmRsZSB0aGUgc29tZSBvZiB0aGUgbW9zdCBmcmVxdWVudGx5IGFza2VkCisgICBxdWVzdGlvbiBpbiB0aGUgTGludXggbmV3c2dyb3VwczoKKworICAgIDEuIE5laXRoZXIgQy1LZXJtaXQgbm9yIGFueSBvdGhlciBMaW51eCBhcHBsaWNhdGlvbiBjYW4gdXNlCisgICAgICAgV2lubW9kZW1zLCBleGNlcHQgaW4gdGhlIFsyODFdcmFyZSBjYXNlcyB3aGVyZSBMaW51eCBkcml2ZXJzIGhhdmUKKyAgICAgICBiZWVuIHdyaXR0ZW4gZm9yIHRoZW0uIFNlZSBbMjgyXVNlY3Rpb24gMy4wLjIgZm9yIGRldGFpbHMuCisgICAgMi4gIldoeSBkb2VzIGl0IHRha2Ugc3VjaCBhIGxvbmcgdGltZSB0byBtYWtlIGEgdGVsbmV0IGNvbm5lY3Rpb24gdG8KKyAgICAgICAob3IgZnJvbSkgbXkgTGludXggUEM/IiAodGhpcyBhcHBsaWVzIHRvIEMtS2VybWl0IGFuZCB0byByZWd1bGFyCisgICAgICAgVGVsbmV0KS4gTW9zdCB0ZWxuZXQgc2VydmVycyB0aGVzZSBkYXlzIHBlcmZvcm0gcmV2ZXJzZSBETlMKKyAgICAgICBsb29rdXBzIG9uIHRoZSBjbGllbnQgKGZvciBzZWN1cml0eSBhbmQvb3IgbG9nZ2luZyByZWFzb25zKS4gSWYKKyAgICAgICB0aGUgVGVsbmV0IGNsaWVudCdzIGFkZHJlc3MgY2Fubm90IGJlIGZvdW5kIGJ5IHRoZSBzZXJ2ZXIncyBsb2NhbAorICAgICAgIEROUyBzZXJ2ZXIsIHRoZSBETlMgcmVxdWVzdCBnb2VzIG91dCB0byB0aGUgSW50ZXJuZXQgYXQgbGFyZ2UsIGFuZAorICAgICAgIHRoaXMgY2FuIHRha2UgcXVpdGUgc29tZSB0aW1lLiBUaGUgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtIGlzIHRvCisgICAgICAgbWFrZSBzdXJlIHRoYXQgYm90aCBjbGllbnQgYW5kIGhvc3QgYXJlIHJlZ2lzdGVyZWQgaW4gRE5TLCBhbmQKKyAgICAgICB0aGF0IHRoZSByZWdpc3RyYXRpb25zIGFyZSBleHBvcnRlZC4gQy1LZXJtaXQgaXRzZWxmIHBlcmZvcm1zCisgICAgICAgcmV2ZXJzZSBETlMgbG9va3VwcyB1bmxlc3MgeW91IHRlbGwgaXQgbm90IHRvOyB0aGlzIGlzIHRvIGFsbG93CisgICAgICAgQy1LZXJtaXQgdG8gbGV0IHlvdSBrbm93IHdoaWNoIGhvc3QgaXQgaXMgYWN0dWFsbHkgY29ubmVjdGVkIHRvIGluCisgICAgICAgY2FzZSB5b3UgaGF2ZSBtYWRlIGEgY29ubmVjdGlvbiB0byBhIGhvc3QgcG9vbCAobXVsdGlob21lZCBob3N0KS4KKyAgICAgICBZb3UgY2FuIGRpc2FibGUgQy1LZXJtaXQncyByZXZlcnNlIEROUyBsb29rdXAgd2l0aCBTRVQgVENQCisgICAgICAgUkVWRVJTRS1ETlMtTE9PS1VQIE9GRi4KKyAgICAzLiAoQW55IHF1ZXN0aW9uIHRoYXQgaGFzIHRoZSB3b3JkICJUZWxuZXQiIGluIGl0Li4uKSBUaGUga25lZS1qZXJrCisgICAgICAgcmVhY3Rpb24gaXMgImRvbid0IHVzZSBUZWxuZXQsIHVzZSBTU0ghIiBUaGVyZSdzIG5vdGhpbmcgd3JvbmcKKyAgICAgICB3aXRoIFRlbG5ldC4gSW4gZmFjdCBpdCdzIGZhciBzdXBlcmlvciB0byBTU0ggYXMgYSBwcm90b2NvbCBpbgorICAgICAgIHRlcm1zIG9mIGZlYXR1cmVzIGFuZCBleHRlbnNpYmlsaXR5LCBub3QgdG8gbWVudGlvbiBwbGF0Zm9ybQorICAgICAgIG5ldXRyYWxpdHkuIFRoZSBpc3N1ZSBsdXJraW5nIGJlaGluZCB0aGUga25lZS1qZXJrIHJlYWN0aW9uIGlzCisgICAgICAgc2VjdXJpdHkuIFNTSCBpcyB0aG91Z2h0IHRvIGJlIHNlY3VyZSwgd2hlcmVhcyBUZWxuZXQgaXMgdGhvdWdodAorICAgICAgIHRvIGJlIGluc2VjdXJlLiBUaGlzIGlzIHRydWUgZm9yIGNsZWFyLXRleHQgVGVsbmV0IChiZWNhdXNlCisgICAgICAgcGFzc3dvcmRzIHRyYXZlbCBpbiB0aGUgY2xlYXIgYWNyb3NzIHRoZSBuZXR3b3JrKSwgYnV0IGFwcGFyZW50bHkKKyAgICAgICBmZXcgcGVvcGxlIHJlYWxpemUgdGhhdCBbMjgzXXNlY3VyZSBUZWxuZXQgY2xpZW50cyBhbmQgc2VydmVycworICAgICAgIGhhdmUgYmVlbiBhdmFpbGFibGUgZm9yIHllYXJzLCBhbmQgdGhlc2UgYXJlIG1vcmUgc2VjdXJlIHRoYW4gU1NICisgICAgICAgKGZvciByZWFzb25zIGV4cGxhaW5lZCBbMjg0XUhFUkUuCisgICAgNC4gKEFueSBxdWVzdGlvbiB0aGF0IGhhcyB0aGUgd29yZCAiRlRQIiBpbiBpdC4uLikgVGhlIGtuZWUtamVyaworICAgICAgIHJlYWN0aW9uIGJlaW5nICJEb24ndCB1c2UgRlRQLCB1c2UgU0NQISIgKG9yIFNGVFApLiBTYW1lIGFuc3dlciBhcworICAgICAgIGFib3ZlLCBidXQgbW9yZXNvLiBTQ1AgYW5kIFNGVFAgYXJlIG5vdCBvbmx5IG5vdCBwbGF0Zm9ybSBuZXV0cmFsLAorICAgICAgIHRoZXkncmUgZGl2ZXJzaXR5LWhvc3RpbGUuIFRoZXkgdHJhbnNmZXIgZmlsZXMgb25seSBpbiBiaW5hcnkKKyAgICAgICBtb2RlLCB3aGljaCBtYW5nbGVzIHRleHQgZmlsZXMgYWNyb3NzIGRpZmZlcmVudCBwbGF0Zm9ybXMsIHRvIHRoZQorICAgICAgIHNhbWUgZGVncmVlIHRoZSBwbGF0Zm9ybSdzIHRleHQtZmlsZSByZWNvcmQgZm9ybWF0IGFuZCBjaGFyYWN0ZXIKKyAgICAgICBzZXQgZGlmZmVyLiBBbiBleHRyZW1lIGV4YW1wbGUgd291bGQgYmUgYW4gVmFyaWFibGUtQmxvY2sgZm9ybWF0CisgICAgICAgRUJDRElDIHRleHQgZmlsZSBvbiBhbiBJQk0gbWFpbmZyYW1lLCBiaW5hcnkgdHJhbnNmZXIgb2Ygd2hpY2ggdG8KKyAgICAgICBVbml4IHdvdWxkIGRvIHlvdSBsaXR0bGUgZ29vZCBpbmRlZWQuIEZUUCB3YXMgZGVzaWduZWQgd2l0aAorICAgICAgIGRpdmVyc2l0eSBpbiBtaW5kIGFuZCBzZWN1cmUgdmVyc2lvbnMgYXJlIGF2YWlsYWJsZS4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjMuMS4gUHJvYmxlbXMgQnVpbGRpbmcgQy1LZXJtaXQgZm9yIExpbnV4CisKKyAgIFsgWzI4NV1Ub3AgXSBbIFsyODZdQ29udGVudHMgXSBbIFsyODddU2VjdGlvbiBDb250ZW50cyBdIFsgWzI4OF1OZXh0IF0KKworICAgTW9kZXJuIExpbnV4IGRpc3RyaWJ1dGlvbnMgbGlrZSBSZWQgSGF0IGdpdmUgeW91IGEgY2hvaWNlIGF0CisgICBpbnN0YWxsYXRpb24gd2hldGhlciB0byBpbmNsdWRlICJkZXZlbG9wZXIgdG9vbHMiLiBPYnZpb3VzbHksIHlvdQorICAgY2FuJ3QgYnVpbGQgQy1LZXJtaXQgb3IgYW55IG90aGVyIEMgcHJvZ3JhbSBmcm9tIHNvdXJjZSBjb2RlIGlmIHlvdQorICAgaGF2ZSBub3QgaW5zdGFsbGVkIHRoZSBkZXZlbG9wZXIgdG9vbHMuIEJ1dCB0byBjb25mdXNlIG1hdHRlcnMsIHlvdQorICAgbWlnaHQgYWxzbyBoYXZlIHRvIGNob29zZSAoc2VwYXJhdGVseSkgdG8gaW5zdGFsbCB0aGUgImN1cnNlcyIgb3IKKyAgICJuY3Vyc2VzIiB0ZXJtaW5hbCBjb250cm9sIGxpYnJhcnk7IHRodXMgaXQgaXMgcG9zc2libGUgdG8gaW5zdGFsbCB0aGUKKyAgIEMgY29tcGlsZXIgYW5kIGxpbmtlciwgYnV0IG9taXQgdGhlIChuKWN1cnNlcyBsaWJyYXJ5IGFuZCBoZWFkZXJzLiBJZgorICAgY3Vyc2VzIGlzIG5vdCBpbnN0YWxsZWQsIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGJ1aWxkIGEgdmVyc2lvbiBvZgorICAgQy1LZXJtaXQgdGhhdCBzdXBwb3J0cyB0aGUgZnVsbHNjcmVlbiBmaWxlLXRyYW5zZmVyIGRpc3BsYXksIGluIHdoaWNoCisgICBjYXNlIHlvdSdsbCBuZWVkIHRvIHVzZSB0aGUgImxpbnV4bmMiIG1ha2VmaWxlIHRhcmdldCAobmMgPSBObyBDdXJzZXMpCisgICBvciBlbHNlIGluc3RhbGwgbmN1cnNlcyBiZWZvcmUgYnVpbGRpbmcuCisKKyAgIFRoZXJlIGFyZSBhbGwgc29ydHMgb2YgY29uZnVzaW5nIGlzc3VlcyBjYXVzZWQgYnkgdGhlIG1hbnkgYW5kIHZhcmllZAorICAgTGludXggZGlzdHJpYnV0aW9ucy4gU29tZSBvZiB0aGUgd29yc3QgaW52b2x2ZSB0aGUgY3Vyc2VzIGxpYnJhcnkgYW5kCisgICBoZWFkZXIgZmlsZXM6IHdoZXJlIGFyZSB0aGV5LCB3aGF0IGFyZSB0aGV5IGNhbGxlZCwgd2hpY2ggb25lcyBhcmUKKyAgIHRoZXkgcmVhbGx5PyBPdGhlciB2ZXhpbmcgcXVlc3Rpb25zIGludm9sdmUgbGliYzUgdnMgbGliYzYgdnMgZ2xpYmMgdnMKKyAgIGdsaWJjMiAoQyBsaWJyYXJpZXMpLCBnY2MgdnMgZWdjcyB2cyBsY2MgKGNvbXBpbGVycyksIHBsdXMgdXNpbmcgb3IKKyAgIGF2b2lkaW5nIGZlYXR1cmVzIHRoYXQgd2VyZSBhZGRlZCBpbiBhIGNlcnRhaW4gdmVyc2lvbiBvZiBMaW51eCBvciBhCisgICBsaWJyYXJ5IG9yIGEgZGlzdHJpYnV0aW9uLCBhbmQgYXJlIG5vdCBhdmFpbGFibGUgaW4gb3RoZXJzLiBBcyBvZgorICAgQy1LZXJtaXQgOC4wLCB0aGVzZSBxdWVzdGlvbnMgc2hvdWxkIGJlIHJlc29sdmVkIGJ5IHRoZSAibGludXgiCisgICBtYWtlZmlsZSB0YXJnZXQgaXRzZWxmLCB3aGljaCBkb2VzIGEgYml0IG9mIGxvb2tpbmcgYXJvdW5kIHRvIHNlZQorICAgd2hhdCdzIHdoYXQsIGFuZCB0aGVuIHNldHMgdGhlIGFwcHJvcHJpYXRlIENGTEFHUy4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjMuMi4gUHJvYmxlbXMgd2l0aCBTZXJpYWwgRGV2aWNlcyBpbiBMaW51eAorCisgICBbIFsyODldVG9wIF0gWyBbMjkwXUNvbnRlbnRzIF0gWyBbMjkxXVNlY3Rpb24gQ29udGVudHMgXSBbIFsyOTJdTmV4dCBdCisgICBbIFsyOTNdUHJldmlvdXMgXQorCisgICAgIEFsc28gc2VlOiAibWFuIHNldHNlcmlhbCIsICJtYW4gaXJxdHVuZSIuCisgICAgIEFuZDogWzI5NF1TZWN0aW9ucyAzLjAsIFsyOTVdNiwgWzI5Nl03LCBhbmQgWzI5N104IG9mIHRoaXMKKyAgICAgZG9jdW1lbnQuCisKKyAgICAgTk9URTogUmVkIEhhdCBMaW51eCA3LjIgYW5kIGxhdGVyIGluY2x1ZGUgYSBuZXcgQVBJIHRoYXQgYWxsb3dzCisgICAgIHNlcmlhbC1wb3J0IGFyYml0cmF0aW9uIGJ5IG5vbi1zZXR1aWQvZ2lkIHByb2dyYW1zLiBUaGlzIEFQSSBoYXMKKyAgICAgbm90IHlldCBiZWVuIGFkZGVkIHRvIEMtS2VybWl0LiBJZiBDLUtlcm1pdCBpcyB0byBiZSB1c2VkIGZvcgorICAgICBkaWFsaW5nIG91dCBvbiBSZWQgSGF0IDcuMiBvciBsYXRlciwgaXQgbXVzdCBzdGlsbCBiZSBpbnN0YWxsZWQgYXMKKyAgICAgZGVzY3JpYmVkIGluIGluIFNlY3Rpb25zIFsyOThdMTAgYW5kIFsyOTldMTEgb2YgdGhlCisgICAgIFszMDBdSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucy4gCisKKyAgIERvbid0IGV4cGVjdCBpdCB0byBiZSBlYXN5LiBRdWVyaWVzIGxpa2UgdGhlIGZvbGxvd2luZyBhcmUgcG9zdGVkIHRvCisgICB0aGUgTGludXggbmV3c2dyb3VwcyBhbG1vc3QgZGFpbHk6CisKKyAgICAgUHJvYmxlbSBvZiBhIG1ham9yIGtpbmQgd2l0aCBteSBDb21wYXEgUHJlc2FyaW8gMTgwNSBpbiB0aGUgc2Vuc2UKKyAgICAgdGhhdCB0aGUgcG5wZHVtcCBkb2Vzbid0IGZpbmQgdGhlIG1vZGVtIGFuZCB0aGUgY29uZmlndXJhdGlvbiB0ZWxscworICAgICBtZSB0aGF0IHRoZSBtb2RlbSBpcyBidXN5IHdoZW4gSSBzZXQgZXZlcnl0aGluZyBieSBoYW5kIQorCisgICAgIEkgaGF2ZSA8c29tZSByZWNlbnQgU3VTRSBkaXN0cmlidXRpb24+LCBrZXJuZWwgMi4wLjM1LiBVc2luZyB0aGUKKyAgICAgQ29tcGFxIHRlbGxzIG1lIHRoYXQgdGhlIG1vZGVtICh3aGljaCBpcyBpbnRlcm5hbCkgaXMgb24gQ09NMiwgd2l0aAorICAgICB0aGUgdXN1YWwgSVJRIGFuZCBwb3J0IG51bWJlcnMuIFJ1bm5pbmcgdmFyaW91cyBXaW5kb3dzIGRpYWdub3N0aWNzCisgICAgIHNob3cgbWUgQVQtc3R5bGUgY29tbWFuZHMgZXhjaGFuZ2VkIHNvIEkgaGF2ZSBubyByZWFzb24gdG8gYmVsZWl2ZQorICAgICB0aGF0IGl0IGlzIGEgV2lubW9kZW0uIEFsc28sIHRoZSBkaWFnbm9zdGljcyB1bmRlciBXaW45OCB0ZWxsIG1lCisgICAgIHRoYXQgSSBhbSB0YWxraW5nIHRvIGFuIE5TIDE2NTUwQU4uCisKKyAgIFtFZGl0b3IncyBub3RlOiBUaGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gaXQgaXNuJ3QgYSBXaW5tb2RlbS5dCisKKyAgICAgVW5kZXIgTGludXgsIG5vIGpveSB0cnlpbmcgdG8gdGFsayB0byB0aGUgbW9kZW0gb24gL2Rldi9jdWExCisgICAgIHdoZXRoZXIgdmlhIG1pbmljb20sIGtwcHAsIG9yIGNoYXQ7IGtwcHAgYXQgbGVhc3QgdGVsbHMgbWUgdGhhdAorICAgICB0Y2dldGF0dHIoKSBmYWlsZWQuCisKKyAgICAgVXNhZ2Ugb2Ygc2V0c2VyaWFsOgorCisgIHNldHNlcmlhbCAvZGV2L2N1YTEgcG9ydCAweDJGOCBpcnEgMyBhdXRvY29uZmlnCisgIHNldHNlcmlhbCAtZyAvZGV2L2N1YTEKKworICAgICB0ZWxscyBtZSB0aGF0IHRoZSB1YXJ0IGlzICd1bmtub3duJy4gSSBoYXZlIHRyaWVkIHNldHRpbmcgdGhlIFVBUlQKKyAgICAgbWFudWxsYXkgdmlhLiBzZXRzZXJpYWwgdG8gMTY1NTBBLCAxNjU1MCwgYW5kIHRoZSBvdGhlciBvbmUgKDg1NTA/KQorICAgICAoSSBkaWRuJ3QgdHJ5IDE2NTQwKS4gTm9uZSBvZiB0aGVzZSBtYW51YWwgc2V0dGluZ3MgcmVzdWx0ZWQgaW4gYW55CisgICAgIHN1Y2Nlc3MuCisKKyAgICAgQSBsb29rIGF0IHBhc3QgYXJ0aWNsZXMgbGVhZHMgbWUgdG8gaW52ZXN0aWdhdGUgUE5QIGlzc3VlcyBieQorICAgICBjYWxsaW5nIHBucGR1bXAgYnV0IHBucGR1bXAgcmV0dXJucyAibm8gYm9hcmRzIGZvdW5kIi4gSSBoYXZlCisgICAgIGxvb2tlZCBhcm91bmQgb24gbXkgQklPUyAoUGhvZW5peCkgYW5kIHRoZXJlIGlzIG5vdCBtdWNoIGV2aWRlbmNlCisgICAgIG9mIGl0IGJlaW5nIFBOUCBhd2FyZS4gSG93ZXZlciBmb3Igd2hhdCBpdCBjYWxscyAiU2VyaWFsIHBvcnQgQSIsCisgICAgIGl0IG9mZmVycyBhIGNob2ljZSBvZiBBdXRvLCBEaXNhYmxlZCBvciBNYW51YWwgc2V0dGluZ3MgKGN1cnJlbnRseQorICAgICBzZXQgdG8gQXV0byksIGJ1dCB1c2luZyB0aGUgQklPUyBpbnRlcmZhY2UgSSB0cmllZCB0byBjaGFuZ2UgdG8KKyAgICAgJ21hbnVhbCcgYW5kIHNhdyB0aGUgZGVmYXVsdCBzZXR0aW5ncyBvZmZlcmVkIHRvIGJlIHdlcmUgMHgzRjggYW5kCisgICAgIElSUSA0IChDT00xKS4gVGhlIEJJT1MgbWVudXMgZGlkIG5vdCBnaXZlIG1lIGFueSBjaGFuY2UgdG8KKyAgICAgY29uZmlndXJlIENPTTIgb3IgYW55ICJtb2RlbSIuIEkgZW5kZWQgdXAgbm90IHNhdmluZyBhbnkgQklPUworICAgICBjaGFuZ2VzIGluIHRoZSBjb3Vyc2Ugb2YgbXkgaW52ZXN0aWdhdGlvbnMuCisKKyAgIFlvdSBjYW4gYWxzbyBmaW5kIG91dCBhIGZhaXIgYW1vdW50IGFib3V0IHlvdXIgUEMncyBoYXJkd2FyZQorICAgY29uZmlndXJhdGlvbiBpbiB0aGUgdGV4dCBmaWxlcyBpbiAvcHJvYywgZS5nLjoKKworICAtci0tci0tci0tICAgIDEgcm9vdCAgICAgICAgICAgIDAgU2VwICA0IDE0OjAwIC9wcm9jL2RldmljZXMKKyAgLXItLXItLXItLSAgICAxIHJvb3QgICAgICAgICAgICAwIFNlcCAgNCAxNDowMCAvcHJvYy9pbnRlcnJ1cHRzCisgIC1yLS1yLS1yLS0gICAgMSByb290ICAgICAgICAgICAgMCBTZXAgIDQgMTQ6MDAgL3Byb2MvaW9wb3J0cworICAtci0tci0tci0tICAgIDEgcm9vdCAgICAgICAgICAgIDAgU2VwICA0IDE0OjAwIC9wcm9jL3BjaQorCisgICBGcm9tIHRoZSBkaXJlY3RvcnkgbGlzdGluZyB0aGV5IGxvb2sgbGlrZSBlbXB0eSBmaWxlcywgYnV0IGluIGZhY3QKKyAgIHRoZXkgYXJlIHRleHQgZmlsZXMgdGhhdCB5b3UgImNhdCI6CisKKyQgY2F0IC9wcm9jL3BjaQorICAgQnVzICAwLCBkZXZpY2UgIDE0LCBmdW5jdGlvbiAgMDoKKyAgICAgU2VyaWFsIGNvbnRyb2xsZXI6IFVTIFJvYm90aWNzLzNDb20gNTZLIEZheE1vZGVtIE1vZGVsIDU2MTAgKHJldiAxKS4KKyAgICAgICBJUlEgMTAuCisgICAgICAgSS9PIGF0IDB4MTA1MCBbMHgxMDU3XS4KKworJCBzZXRzZXJpYWwgLWcgL2Rldi90dHlTNAorL2Rldi90dHlTNCwgVUFSVDogMTY1NTBBLCBQb3J0OiAweDEwNTAsIElSUTogMTAKKworJCBjYXQgL3Byb2MvaW9wb3J0cworMTA1MC0xMDU3IDogVVMgUm9ib3RpY3MvM0NvbSA1NksgRmF4TW9kZW0gTW9kZWwgNTYxMAorICAgMTA1MC0xMDU3IDogc2VyaWFsKGF1dG8pCisKKyQgY2F0IC9wcm9jL2ludGVycnVwdHMKKyAgICAgICAgICAgIENQVTAKKyAgIDA6ICAgIDcwMzc1MTUgICAgICAgICAgWFQtUElDICB0aW1lcgorICAgMTogICAgICAgICAgMiAgICAgICAgICBYVC1QSUMgIGtleWJvYXJkCisgICAyOiAgICAgICAgICAwICAgICAgICAgIFhULVBJQyAgY2FzY2FkZQorICAgNDogICAgICAgICAgMCAgICAgICAgICBYVC1QSUMgIHNlcmlhbAorICAgODogICAgICAgICAgMSAgICAgICAgICBYVC1QSUMgIHJ0YworICAgOTogICAgIDIwOTgxMSAgICAgICAgICBYVC1QSUMgIHVzYi11aGNpLCBldGgwCisgIDE0OiAgICAgMjgyMDE1ICAgICAgICAgIFhULVBJQyAgaWRlMAorICAxNTogICAgICAgICAgNiAgICAgICAgICBYVC1QSUMgIGlkZTEKKworICAgV2F0Y2ggb3V0IGZvciBQQ0ksIFBDTUNJQSBhbmQgUGx1Zy1uLVBsYXkgZGV2aWNlcywgV2lubW9kZW1zLCBhbmQgdGhlCisgICBsaWtlIChzZWUgY2F1dGlvbnMgaW4gWzMwMV1TZWN0aW9uIDMuMCBMaW51eCBzdXBwb3J0cyBQbHVnLW4tUGxheQorICAgZGV2aWNlcyB0byBzb21lIGRlZ3JlZSB2aWEgdGhlIGlzYXBucCBhbmQgcG5wZHVtcCBwcm9ncmFtczsgcmVhZCB0aGUKKyAgIG1hbiBwYWdlcyBmb3IgdGhlbS4gKElmIHlvdSBkb24ndCBoYXZlIHRoZW0sIGxvb2sgb24geW91ciBpbnN0YWxsYXRpb24KKyAgIENEIGZvciBpc2FwbnB0b29sIG9yIGRvd25sb2FkIGl0IGZyb20gc3Vuc2l0ZSBvciBhIHN1bnNpdGUgbWlycm9yIG9yCisgICBvdGhlciBwb2xpdGljYWxseSBjb3JyZWN0IGxvY2F0aW9uIGR1IGpvdXIpLgorCisgICBQQ0kgbW9kZW1zIGRvIG5vdCB1c2Ugc3RhbmRhcmQgQ09NIHBvcnQgYWRkcmVzc2VzLiBUaGUgSS9PIGFkZHJlc3MgYW5kCisgICBJUlEgYXJlIGFzc2lnbmVkIGJ5IHRoZSBCSU9TLiBBbGwgeW91IG5lZWQgdG8gZG8gdG8gZ2V0IG9uZSB3b3JraW5nLAorICAgZmluZCBvdXQgdGhlIEkvTyBhZGRyZXNzIGFuZCBpbnRlcnJ1cHQgbnVtYmVyIHdpdGggKGFzIHJvb3QpICJsc3BjaSAtdgorICAgfCBtb3JlIiBhbmQgdGhlbiBnaXZlIHRoZSByZXN1bHRpbmcgYWRkcmVzcyBhbmQgaW50ZXJydXB0IG51bWJlciB0bworICAgc2V0c2VyaWFsLgorCisgICBFdmVuIHdoZW4geW91IGhhdmUgYSByZWFsIHNlcmlhbCBwb3J0LCBhbHdheXMgYmUgd2FyeSBvZiBpbnRlcnJ1cHQKKyAgIGNvbmZsaWN0cyBhbmQgc2ltaWxhciBQQyBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGlzc3VlczogYSBQQyBpcyBub3QgYQorICAgcmVhbCBjb21wdXRlciBsaWtlIG90aGVyIFVuaXggd29ya3N0YXRpb25zIC0tIGl0IGlzIGdlbmVyYWxseSBwaWVjZWQKKyAgIHRvZ2V0aGVyIGZyb20gd2hhdGV2ZXIgcmFuZG9tIGNvbXBvbmVudHMgd2VyZSB0aGUgYmVzdCBiYXJnYWluIG9uIHRoZQorICAgY29tbW9kaXR5IG1hcmtldCB0aGUgd2VlayBpdCB3YXMgYnVpbHQuIE9uY2UgaXQncyBhc3NlbWJsZWQgYW5kIGJveGVkLAorICAgbm90IGV2ZW4gdGhlIG1hbnVmYWN0dXJlciB3aWxsIHJlbWVtYmVyIHdoYXQgaXQncyBtYWRlIG9mIG9yIGhvdyBpdAorICAgd2FzIHB1dCB0b2dldGhlciBiZWNhdXNlIHRoZXkndmUgbW92ZWQgb24gdG8gYSBuZXcgbW9kZWwuIFRoZWlyIGpvYiBpcworICAgdG8gZ2V0IGl0IChiYXJlbHkpIHdvcmtpbmcgd2l0aCBXaW5kb3dzOyBmb3IgTGludXggYW5kIG90aGVyIE9TJ3MgeW91CisgICBhcmUgb24geW91ciBvd24uCisKKyAgICJzZXQgbGluZSAvZGV2L21vZGVtIiBvciAic2V0IGxpbmUgL2Rldi90dHlTMiIsIGV0YywgcmVzdWx0cyBpbiBhbgorICAgZXJyb3IsICIvZGV2L21vZGVtIGlzIG5vdCBhIHR0eSIuIENhdXNlIHVua25vd24sIGJ1dCBvYnZpb3VzbHkgYQorICAgZHJpdmVyIGlzc3VlLCBub3QgYSBLZXJtaXQgb25lIChLZXJtaXQgdXNlcyAiaXNhdHR5KCkiIHRvIGNoZWNrIHRoYXQKKyAgIHRoZSBkZXZpY2UgaXMgYSB0dHksIHNvIGl0IGtub3dzIGl0IHdpbGwgYmUgYWJsZSB0byBpc3N1ZSBhbGwgdGhlCisgICB0dHktcmVsYXRlZCBpb2N0bCdzIG9uIGl0LCBsaWtlIHNldHRpbmcgdGhlIHNwZWVkICYgZmxvdyBjb250cm9sKS4gVHJ5CisgICBhIGRpZmZlcmVudCBuYW1lIChpLmUuIGRyaXZlcikgZm9yIHRoZSBzYW1lIHBvcnQsIGUuZy4gInNldCBsaW5lCisgICAvZGV2L2N1YTIiIG9yIHdoYXRldmVyLgorCisgICBUbyBmaW5kIHdoYXQgc2VyaWFsIHBvcnRzIHdlcmUgcmVnaXN0ZXJlZCBhdCB0aGUgbW9zdCByZWNlbnQgc3lzdGVtCisgICBib290LCB0eXBlIChhcyByb290KTogImdyZXAgdHR5IC92YXIvbG9nL2RtZXNnIi4KKworICAgInNldCBtb2RlbSB0eXBlIHh4eCIgKHdoZXJlIHh4eCBpcyB0aGUgbmFtZSBvZiBhIG1vZGVtKSBmb2xsb3dlZCBieQorICAgInNldCBsaW5lIC9kZXYvbW9kZW0iIG9yICJzZXQKKyAgIGxpbmUgL2Rldi90dHlTMiIsIGV0YywgaGFuZ3MgKGJ1dCBjYW4gYmUgaW50ZXJydXB0ZWQgd2l0aCBDdHJsLUMpLgorICAgRXhwZXJpbWVudGF0aW9uIHNob3dzIHRoYXQgaWYgdGhlIG1vZGVtIGlzIGNvbmZpZ3VyZWQgdG8gYWx3YXlzIGFzc2VydAorICAgY2FycmllciAoJkMwKSB0aGUgc2FtZSBjb21tYW5kIGRvZXMgbm90IGhhbmcuIEFnYWluLCBhIGRyaXZlciBpc3N1ZS4KKyAgIFVzZSAvZGV2L2N1YTIgKG9yIHdoYXRldmVyKSBpbnN0ZWFkLiAoT3Igbm90IC0tIGhvcGVmdWxseSBub25lIG9mCisgICB0aGVzZSBzeW1wdG9tcyBvY2N1cnMgaW4gQy1LZXJtaXQgNy4wIG9yIGxhdGVyLikKKworICAgInNldCBsaW5lIC9kZXYvY3VhMCIgcmVwb3J0cyAiRGV2aWNlIGlzIGJ1c3kiLCBidXQgInNldCBsaW5lCisgICAvZGV2L3R0eVMwIiB3b3JrcyBPSy4KKworICAgSW4gc2hvcnQ6IElmIHRoZSBjdWEgZGV2aWNlIGRvZXNuJ3Qgd29yaywgdHJ5IHRoZSBjb3JyZXNwb25kaW5nIHR0eVMKKyAgIGRldmljZS4gSWYgdGhlIHR0eVMgZGV2aWNlIGRvZXNuJ3Qgd29yaywgdHJ5IHRoZSBjb3JyZXNwb25kaW5nIGN1YQorICAgZGV2aWNlIC0tIGJ1dCBub3RlIHRoYXQgTGludXggZGV2ZWxvcGVycyBkbyBub3QgcmVjb21tZW5kIHRoaXMsIGFuZAorICAgYXJlIHBoYXNpbmcgb3V0IHRoZSBjdWEgZGV2aWNlcy4gRnJvbSAvdXNyL2RvYy9mYXEvaG93dG8vU2VyaWFsLUhPV1RPOgorCisgICAxMi40LiBXaGF0J3MgVGhlIFJlYWwgRGlmZmVyZW5jZSBCZXR3ZWVuIHRoZSAvZGV2L2N1YU4gQW5kIC9kZXYvdHR5U04KKyAgICAgICAgICBEZXZpY2VzPworICAgICAgICAgIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhlIHdheSB0aGF0IHRoZSBkZXZpY2VzIGFyZSBvcGVuZWQuIFRoZQorICAgICAgICAgIGRpYWxpbiBkZXZpY2VzIC9kZXYvdHR5U04gYXJlIG9wZW5lZCBpbiBibG9ja2luZyBtb2RlLCB1bnRpbCBDRAorICAgICAgICAgIGlzIGFzc2VydGVkIChpZSBzb21lb25lIGNvbm5lY3RzKS4gU28sIHdoZW4gc29tZW9uZSB3YW50cyB0bworICAgICAgICAgIHVzZSB0aGUgL2Rldi9jdWFOIGRldmljZSwgdGhlcmUgaXMgbm8gY29uZmxpY3Qgd2l0aCBhIHByb2dyYW0KKyAgICAgICAgICB3YXRjaGluZyB0aGUgL2Rldi90dHlTTiBkZXZpY2UgKHVubGVzcyBzb21lb25lIGlzIGNvbm5lY3RlZCBvZgorICAgICAgICAgIGNvdXJzZSkuIFRoZSBtdWx0aXBsZSAvZGV2IGVudHJpZXMsIGFsbG93IG9wZXJhdGlvbiBvZiB0aGUgc2FtZQorICAgICAgICAgIHBoeXNpY2FsIGRldmljZSB3aXRoIGRpZmZlcmVudCBvcGVyYXRpbmcgY2hhcmFjdGVyaXN0aWNzLiBJdAorICAgICAgICAgIGFsc28gYWxsb3dzIHN0YW5kYXJkIGdldHR5IHByb2dyYW1zIHRvIGNvZXhpc3Qgd2l0aCBhbnkgb3RoZXIKKyAgICAgICAgICBzZXJpYWwgcHJvZ3JhbSwgd2l0aG91dCB0aGUgZ2V0dHkgYmVpbmcgcmV0cm9maXR0ZWQgd2l0aAorICAgICAgICAgIGxvY2tpbmcgb2Ygc29tZSBzb3J0LiBJdCdzIGVzcGVjaWFsbHkgdXNlZnVsIHNpbmNlIHN0YW5kYXJkCisgICAgICAgICAgVW5peCBrZXJuZWwgZmlsZSBsb2NraW5nLCBhbmQgVVVDUCBsb2NraW5nIGFyZSBib3RoIGFkdmlzb3J5CisgICAgICAgICAgYW5kIG5vdCBtYW5kYXRvcnkuCisKKyAgIEl0IHdhcyBkaXNjb3ZlcmVkIGR1cmluZyBkZXZlbG9wbWVudCBvZiBDLUtlcm1pdCA3LjAgdGhhdCByZWJ1aWxkaW5nCisgICBDLUtlcm1pdCB3aXRoIC1ETk9DT1RGTUMgKE5vIENsb3NlL09wZW4gVG8gRm9yY2UgTW9kZSBDaGFuZ2UpIG1hZGUgdGhlCisgICBhZm9yZW1lbnRpb25lZCBwcm9ibGVtIHdpdGggL2Rldi90dHlTMCBnbyBhd2F5LiBJdCBpcyBub3QgeWV0IGNsZWFyLAorICAgaG93ZXZlciwgd2hhdCBpdHMgYWZmZWN0IG1pZ2h0IGJlIG9uIHRoZSAvZGV2L2N1YSogZGV2aWNlcy4gQXMgb2YgMTkKKyAgIE1hcmNoIDE5OTgsIHRoaXMgb3B0aW9uIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBDRkxBR1MgaW4gdGhlIG1ha2VmaWxlCisgICBlbnRyaWVzIGZvciBMaW51eCAoIm1ha2UgbGludXgiKS4KKworICAgTm90ZSB0aGF0IHRoZSBjdWEgZGV2aWNlIGlzIG5vdyAiZGVwcmVjYXRlZCIsIGFuZCBuZXcgZWRpdGlvbnMgb2YKKyAgIExpbnV4IHdpbGwgcGhhc2UgKGhhdmUgcGhhc2VkKSBpdCBvdXQgaW4gZmF2b3Igb2YgdGhlIHR0eVMgZGV2aWNlLiBTZWUKKyAgIChpZiBpdCdzIHN0aWxsIHRoZXJlKToKKworICBbMzAyXWh0dHA6Ly9saW51eHd3dy5kYi5lcmF1LmVkdS9tYWlsX2FyY2hpdmVzL2xpbnV4LWtlcm5lbC9NYXJfOTgvMTQ0MS5odG1sCisKKyAgIChubywgb2YgY291cnNlIGl0IGlzbid0OyB5b3UnbGwgaGF2ZSB0byB1c2UgeW91ciBpbWFnaW5hdGlvbikuIE9uZQorICAgdXNlciByZXBvcnRlZCB0aGF0IEMtS2VybWl0IDcuMCwgd2hlbiBidWlsdCB3aXRoIGVnY3MgMS4xLjIgYW5kIHJ1biBvbgorICAgTGludXggMi4yLjYgd2l0aCBnbGliYyAyLjEgKGhhcmR3YXJlIHVua25vd24gYnV0IHByb2JhYmx5IGEgUEMpIGR1bXBzCisgICBjb3JlIHdoZW4gZ2l2ZW4gYSAic2V0IGxpbmUgL2Rldi90dHlTMSIgY29tbWFuZC4gV2hlbiByZWJ1aWx0IHdpdGgKKyAgIGdjYywgaXQgd29ya3MgZmluZS4KKworICAgQWxsIHZlcnNpb25zIG9mIExpbnV4IHNlZW0gdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGRlZmljaWVuY3k6IFdoZW4gYQorICAgbW9kZW0gY2FsbCBpcyBodW5nIHVwIGFuZCBDRCBkcm9wcywgS2VybWl0IGNhbiBubyBsb25nZXIgcmVhZCB0aGUKKyAgIG1vZGVtIHNpZ25hbHM7IFNIT1cgQ09NTVVOSUNBVElPTlMgc2F5cyAiTW9kZW0gc2lnbmFscyBub3QgYXZhaWxhYmxlIi4KKyAgIFRoZSBUSU9DTUdFVCBpb2N0bCgpIHJldHVybnMgLTEgd2l0aCBlcnJubyA1ICgiSS9PIEVycm9yIikuCisKKyAgIFRoZSBMaW51eCB2ZXJzaW9uIG9mIFBPU0lYIHRjc2VuZGJyZWFrKCksIHdoaWNoIGlzIHVzZWQgYnkgQy1LZXJtaXQgdG8KKyAgIHNlbmQgcmVndWxhciAoMjc1bXNlYykgYW5kIGxvbmcgKDEuNXNlYykgQlJFQUsgc2lnbmFscywgYXBwZWFycyB0bworICAgaWdub3JlIGl0cyBhcmd1bWVudCAoZGVzcGl0ZSBpdHMgZGVzY3JpcHRpb24gaW4gdGhlIG1hbiBwYWdlIGFuZCBpbmZvCisgICB0b3BpYyksIGFuZCBhbHdheXMgc2VuZHMgYSByZWd1bGFyIDI3NW1zZWMgQlJFQUsuIFRoaXMgaGFzIGJlZW4KKyAgIG9ic2VydmVkIGluIExpbnV4IHZlcnNpb25zIHJhbmdpbmcgZnJvbSBEZWJpYW4gMi4xIHRvIFJlZCBIYXQgNy4xLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMy4zLiBUZXJtaW5hbCBFbXVsYXRpb24gaW4gTGludXgKKworICAgWyBbMzAzXVRvcCBdIFsgWzMwNF1Db250ZW50cyBdIFsgWzMwNV1TZWN0aW9uIENvbnRlbnRzIF0gWyBbMzA2XU5leHQgXQorICAgWyBbMzA3XVByZXZpb3VzIF0KKworICAgQy1LZXJtaXQgaXMgbm90IGEgdGVybWluYWwgZW11bGF0b3IuIEZvciBhIGJyaWVmIGV4cGxhbmF0aW9uIG9mIHdoeQorICAgbm90LCBzZWUgWzMwOF1TZWN0aW9uIDMuMC41LiBGb3IgYSBmdWxsZXIgZXhwbGFuYXRpb24sIFszMDldQ2xJQ0sKKyAgIEhFUkUuCisKKyAgIEluIFVuaXgsIHRlcm1pbmFsIGVtdWxhdGlvbiBpcyBzdXBwbGllZCBieSB0aGUgV2luZG93IGluIHdoaWNoIHlvdSBydW4KKyAgIEtlcm1pdDogdGhlIHJlZ3VsYXIgY29uc29sZSBzY3JlZW4sIHdoaWNoIHByb3ZpZGVzIExpbnV4IENvbnNvbGUKKyAgICJlbXVsYXRpb24iIHZpYSB0aGUgImNvbnNvbGUiIHRlcm1jYXAgZW50cnksIG9yIHVuZGVyIFgtV2luZG93cyBpbiBhbgorICAgeHRlcm0gd2luZG93LCB3aGljaCBnaXZlcyBWVHh4eCBlbXVsYXRpb24uIEFuIHh0ZXJtIHRoYXQgaW5jbHVkZXMKKyAgIGNvbG9yIEFOU0kgYW5kIFZUMjIwIGVtdWxhdGlvbiBpcyBhdmFpbGFibGUgd2l0aCBYZnJlZTg2OgorCisgIFszMTBdaHR0cDovL2RpY2tleS5oaXMuY29tL3h0ZXJtL3h0ZXJtLmh0bWwKKworICAgQmVmb3JlIHN0YXJ0aW5nIEMtS2VybWl0IGluIGFuIHh0ZXJtIHdpbmRvdywgeW91IG1pZ2h0IG5lZWQgdG8gdGVsbAorICAgdGhlIHh0ZXJtIHdpbmRvdydzIHNoZWxsIHRvICJzdHR5IHNhbmUiLgorCisgICBUbyBzZXQgdXAgeW91ciBQQyBjb25zb2xlIGtleWJvYXJkIHRvIHNlbmQgVlQyMjAga2V5IHNlcXVlbmNlcyB3aGVuCisgICB1c2luZyBDLUtlcm1pdCBhcyB5b3VyIGNvbW11bmljYXRpb25zIHByb2dyYW0gaW4gYW4gWCB0ZXJtaW5hbCB3aW5kb3cKKyAgIChpZiBpdCBkb2Vzbid0IGFscmVhZHkpLCBjcmVhdGUgYSBmaWxlIHNvbWV3aGVyZSAoZS5nLiBpbiAvcm9vdC8pCisgICBjYWxsZWQgLnhtb2RtYXByYywgY29udGFpbmluZyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOgorCisgIGtleWNvZGUgNzcgID0gS1BfRjEgICAgICAgISBOdW0gTG9jayAgICAgPT4gREVDIEdvbGQgKFBGMSkKKyAga2V5Y29kZSAxMTIgPSBLUF9GMiAgICAgICAhIEtleXBhZCAvICAgICA9PiBERUMgUEYxCisgIGtleWNvZGUgNjMgID0gS1BfRjMgICAgICAgISBLZXlwYWQgKiAgICAgPT4gREVDIFBGMworICBrZXljb2RlIDgyICA9IEtQX0Y0ICAgICAgICEgS2V5cGFkIC0gICAgID0+IERFQyBQRjQKKyAga2V5Y29kZSAxMTEgPSBIZWxwICAgICAgICAhIFByaW50IFNjcmVlbiA9PiBERUMgSGVscAorICBrZXljb2RlIDc4ICA9IEYxNiAgICAgICAgICEgU2Nyb2xsIExvY2sgID0+IERFQyBEbworICBrZXljb2RlIDExMCA9IEYxNiAgICAgICAgICEgUGF1c2UgICAgICAgID0+IERFQyBEbworICBrZXljb2RlIDEwNiA9IEZpbmQgICAgICAgICEgSW5zZXJ0ICAgICAgID0+IERFQyBGaW5kCisgIGtleWNvZGUgOTcgID0gSW5zZXJ0ICAgICAgISBIb21lICAgICAgICAgPT4gREVDIEluc2VydAorICBrZXljb2RlIDk5ICA9IDB4MTAwMGZmMDAgICEgUGFnZSBVcCAgICAgID0+IERFQyBSZW1vdmUKKyAga2V5Y29kZSAxMDcgPSBTZWxlY3QgICAgICAhIERlbGV0ZSAgICAgICA9PiBERUMgU2VsZWN0CisgIGtleWNvZGUgMTAzID0gUGFnZV9VcCAgICAgISBFbmQgICAgICAgICAgPT4gREVDIFByZXYgU2NyZWVuCisgIGtleWNvZGUgMjIgID0gRGVsZXRlICAgICAgISBCYWNrc3BhY2Ugc2VuZHMgRGVsZXRlICgxMjcpCisKKyAgIFRoZW4gcHV0ICJ4bW9kbWFwIGZpbGVuYW1lIiBpbiB5b3VyIC54aW5pdHJjIGZpbGUgKGluIHlvdXIgbG9naW4KKyAgIGRpcmVjdG9yeSksIGUuZy4KKworICB4bW9kbWFwIC9yb290Ly54bW9kbWFwcmMKKworICAgT2YgY291cnNlIHlvdSBjYW4gbW92ZSB0aGluZ3MgYXJvdW5kLiBVc2UgdGhlIHhldiBwcm9ncmFtIHRvIGZpbmQgb3V0CisgICBrZXkgY29kZXMuCisKKyAgIENvbnNvbGUtbW9kZSBrZXlzIGFyZSBtYXBwZWQgc2VwYXJhdGVseSB1c2luZyBsb2Fka2V5cywgYW5kIGRpZmZlcmVudAorICAga2V5Y29kZXMgYXJlIHVzZWQuIEZpbmQgb3V0IHdoYXQgdGhleSBhcmUgd2l0aCBzaG93a2V5LgorCisgICBGb3IgYSBtdWNoIG1vcmUgY29tcGxldGUgVlQyMjAvMzIwIGtleSBtYXBwaW5nIGZvciBbMzExXVhmcmVlODYgeHRlcm0sCisgICBbMzEyXUNMSUNLIEhFUkUuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4zLjQuIERhdGVzIGFuZCBUaW1lcworCisgICBbIFszMTNdVG9wIF0gWyBbMzE0XUNvbnRlbnRzIF0gWyBbMzE1XVNlY3Rpb24gQ29udGVudHMgXSBbIFszMTZdTmV4dCBdCisgICBbIFszMTddUHJldmlvdXMgXQorCisgICBJZiBDLUtlcm1pdCdzIGRhdGUtdGltZSAoZS5nLiBhcyBzaG93biBieSBpdHMgREFURSBjb21tYW5kKSBkaWZmZXJzCisgICBmcm9tIHRoZSBzeXN0ZW0ncyBkYXRlIGFuZCB0aW1lOgorCisgICAgYS4gTWFrZSBzdXJlIHRoZSBsaWJjIHRvIHdoaWNoIEtlcm1pdCBpcyBsaW5rZWQgaXMgc2V0IHRvIEdNVCBvciBpcworICAgICAgIG5vdCBzZXQgdG8gYW55IHRpbWUgem9uZS4gV2F0Y2ggb3V0IGZvciBtaXhlZCBsaWJjNS9saWJjNiBzeXN0ZW1zOworICAgICAgIGVhY2ggbXVzdCBiZSBzZXQgaW5kcGVuZGVudGx5LgorICAgIGIuIElmIHlvdSBoYXZlIGNoYW5nZWQgeW91ciBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZXhwb3J0ZWQuIFRoaXMgaXMgbm9ybWFsbHkgZG9uZSBpbiAvZXRjL3Byb2ZpbGUgb3IgL2V0Yy9UWi4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjMuNS4gU3RhcnR1cCBFcnJvcnMKKworICAgWyBbMzE4XVRvcCBdIFsgWzMxOV1Db250ZW50cyBdIFsgWzMyMF1TZWN0aW9uIENvbnRlbnRzIF0gWyBbMzIxXU5leHQgXQorICAgWyBbMzIyXVByZXZpb3VzIF0KKworICAgQy1LZXJtaXQgc2hvdWxkIHdvcmsgb24gYWxsIHZlcnNpb25zIG9mIExpbnV4IGN1cnJlbnQgdGhyb3VnaCBNYXJjaAorICAgMjAwMywgcHJvdmlkZWQgaXQgd2FzIGJ1aWx0IG9uIHRoZSBzYW1lIHZlcnNpb24geW91IGhhdmUsIHdpdGggdGhlCisgICBzYW1lIGxpYnJhcmllcyBhbmQgaGVhZGVyIGZpbGVzIChqdXN0IGdldCB0aGUgc291cmNlIGNvZGUgYW5kICJtYWtlCisgICBsaW51eCIpLiBCaW5hcmllcyB0ZW5kIG5vdCB0byB0cmF2ZWwgd2VsbCBmcm9tIG9uZSBMaW51eCBtYWNoaW5lIHRvCisgICBhbm90aGVyLCBkdWUgdG8gdGhlaXIgbWFueSBkaWZmZXJlbmNlcy4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYQorICAgcGFydGljdWxhciBDLUtlcm1pdCBiaW5hcnkgd2lsbCBub3Qgc3RvcCB3b3JraW5nIGF0IGEgbGF0ZXIgZGF0ZSwKKyAgIHNpbmNlIExpbnV4IHRlbmRzIHRvIGNoYW5nZSBvdXQgZnJvbSB1bmRlciBpdHMgYXBwbGljYXRpb25zLiBJZiB0aGF0CisgICBoYXBwZW5zLCByZWJ1aWxkIEMtS2VybWl0IGZyb20gc291cmNlLiBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoCisgICB0aGUgYnVpbGQgcHJvY2VzcywgbG9vayBvbiB0aGUgWzMyM11DLUtlcm1pdCB3ZWJzaXRlIGZvciBhIG5ld2VyCisgICB2ZXJzaW9uLiBJZiB5b3UgaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24sIHRoZW4gWzMyNF1yZXBvcnQgdGhlIHByb2JsZW0KKyAgIHRvIHVzLgorCisgICBJbmFiaWxpdHkgdG8gdHJhbnNmZXIgZmlsZXMgaW4gUmVkIEhhdCA3LjI6IHRoZSB0eXBpY2FsIHN5bXB0b20gd291bGQKKyAgIGJlIGlmIHlvdSBzdGFydCBLZXJtaXQgYW5kIHRlbGwgaXQgdG8gUkVDRUlWRSwgaXQgZmFpbHMgcmlnaHQgYXdheQorICAgd2l0aCAiPy9kZXYvdHR5OiBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzIiBvciAiP0JhZCBmaWxlIGRlc2NyaXB0b3IiLgorICAgT25lIHJlcG9ydCBzYXlzIHRoaXMgaXMgYmVjYXVzZSBvZiBjc2gsIGFuZCBpZiB5b3UgY2hhbmdlIHlvdXIgc2hlbGwKKyAgIHRvIGJhc2ggb3Igb3RoZXIgc2hlbGwsIGl0IGRvZXNuJ3QgaGFwcGVuLiBBbm90aGVyIHJlcG9ydCBjaXRlIGJ1Z3MgaW4KKyAgIFJlZCBIYXQgNy4yIFRlbG5ldGQgInZlcnkgc2VsZG9tIChpZiBldmVyKSBwcm92aWRpbmcgYSBjb250cm9sbGluZworICAgdHR5LCBhbmQgbG90cyBvZiBvdGhlciBwZW9wbGUgcGlsZWQgb24gc2F5aW5nIHRoZXkgaGF2ZSB0aGUgc2FtZQorICAgcHJvYmxlbS4iKSBBIHRoaXJkIHRoZW9yeSBpcyB0aGF0IHRoaXMgaGFwcGVucyBvbmx5IHdoZW4gTGludXggaGFzCisgICBiZWVuIGluc3RhbGxlZCB3aXRob3V0ICJ2aXJ0dWFsIHRlcm1pbmFsIHN1cHBvcnQiLgorCisgICBBIHNlYXJjaCBvZiBSZWRIYXQncyBlcnJhdGEgcGFnZXMgc2hvd3MgYSBidWcgYWR2aXNvcnkgKFJIQkEtMjAwMS0xNTMpCisgICBpc3N1ZWQgMTMgTm92ZW1iZXIgMjAwMSwgYnV0IHVwZGF0ZWQgNiBEZWNlbWJlciwgYWJvdXQgdGhpcyBzYW1lCisgICBzeW1wdG9tIChidXQgd2l0aCB0Y3NoIGFuZCBsb2dpbi4pIFNlZW1zIHRoYXQgbG9naW4gd2FzIG5vdCBhbHdheXMKKyAgIGFzc2lnbmluZyBhIGNvbnRyb2xsaW5nIFRUWSBmb3IgdGhlIHNlc3Npb24sIHdoaWNoIHdvdWxkIG1ha2UgbW9zdCB1c2UKKyAgIG9mICIvZGV2L3R0eSIgc29tZXdoYXQgbGVzcyB0aGFuIHVzZWZ1bC4KKworICBbMzI1XWh0dHA6Ly93d3cucmVkaGF0LmNvbS9zdXBwb3J0L2VycmF0YS9SSEJBLTIwMDEtMTUzLmh0bWwKKworICAgUXVvdGluZzogIkR1ZSB0byB0ZXJtaW5hbCBoYW5kbGluZyBwcm9ibGVtcyBpbiAvYmluL2xvZ2luLCB0Y3NoIHdvdWxkCisgICBub3QgZmluZCB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgY29ycmVjdGx5LCBhbmQgYSBzaGVsbCBpbiBzaW5nbGUKKyAgIHVzZXIgbW9kZSB3b3VsZCBleGhpYml0IHN0cmFuZ2UgdGVybWluYWwgaW5wdXQgY2hhcmFjdGVyaXN0aWNzLiBUaGlzCisgICB1cGRhdGUgZml4ZXMgYm90aCBvZiB0aGVzZSBwcm9ibGVtcy4iCisKKyAgIFNpbmNlIHRoZSBSZWQgSGF0IDUuMSByZWxlYXNlIChjaXJjYSBBdWd1c3QgMTk5OCksIHRoZXJlIGhhdmUgYmVlbgorICAgbnVtZXJvdXMgcmVwb3J0cyBvZiBwcmVidWlsdCBMaW51eCBleGVjdXRhYmxlcywgYW5kIHBhcnRpY3VsYXJseSB0aGUKKyAgIEtlcm1pdCBSUE0gZm9yIFJlZCBIYXQgTGludXgsIG5vdCB3b3JraW5nOyBlaXRoZXIgaXQgd29uJ3Qgc3RhcnQgYXQKKyAgIGFsbCwgb3IgaXQgZ2l2ZXMgZXJyb3IgbWVzc2FnZXMgYWJvdXQgInRlcm1pbmFsIHR5cGUgdW5rbm93biIgYW5kCisgICByZWZ1c2VzIHRvIGluaXRpYWxpemUgaXRzIGN1cnNlcyBzdXBwb3J0LiBUaGUgZm9sbG93aW5nIGlzIGZyb20gdGhlCisgICBbMzI2XUtlcm1pdCBuZXdzZ3JvdXA6CisKKyAgICAgRnJvbTogcmNoYW5kcmFAaGFsOTAwMC5idWYuc2VydnRlY2guY29tCisgICAgIE5ld3Nncm91cHM6IGNvbXAucHJvdG9jb2xzLmtlcm1pdC5taXNjCisgICAgIFN1YmplY3Q6IFJlZCBIYXQgTGludXgvSW50ZWwgNS4xIGFuZCBuY3Vyc2VzOiBzdWdnZXN0aW9ucworICAgICBEYXRlOiAyMiBBdWcgMTk5OCAxNTo1NDo0NiBHTVQKKyAgICAgT3JnYW5pemF0aW9uOiBWZXJpbyBOZXcgWW9yaworICAgICBLZXl3b3JkczogUmVkSGF0IFJQTSA1LjEKKworICAgICBTZXZlcmFsIGZhY3RvcnMgY2FuIGluZmx1ZW5jZSB3aGV0aGVyICJsaW51eCIgaXMgcmVjb2duaXplZCBhcyBhCisgICAgIHRlcm1pbmFsIHR5cGUgb24gbWFueSBMaW51eCBzeXN0ZW1zLgorCisgICAgMS4gWW91ciBwcm9ncmFtLCBvciB0aGUgbGlicmFyaWVzIGl0IGxpbmtlZCB3aXRoIChpZiBzdGF0aWNhbGx5CisgICAgICAgbGlua2VkKSwgb3IgdGhlIGxpYnJhcmllcyBpdCBkeW5hbWljYWxseSBsaW5rcyB3aXRoIGF0IHJ1bnRpbWUsCisgICAgICAgYXJlIGxvb2tpbmcgZm9yIGFuIGVudHJ5IGluIC9ldGMvdGVybWNhcCB0aGF0IGlzbid0IHRoZXJlLiAobm90CisgICAgICAgbGlrZWx5LCBidXQgcG9zc2libGUuLi4gSSBiZWxpZXZlIGJ1dCBhbSBub3QgY2VydGFpbiB0aGF0IHRoaXMgaXMKKyAgICAgICBhIHZlcnkgb2xkIHByYWN0aWNlIGluIHZlcnkgb2xkIFtuXWN1cnNlcyBsaWJyYXJ5IGltcGxlbWVudGF0aW9ucworICAgICAgIHRvIHVzZSBhIHNpbmdsZSBmaWxlIGZvciBhbGwgdGVybWluYWwgZGVzY3JpcHRpb25zLikKKyAgICAyLiBZb3VyIHByb2dyYW0sIG9yIHRoZSBsaWJyYXJpZXMuLi5hcmUgbG9va2luZyBmb3IgYSB0ZXJtaW5mbyBmaWxlCisgICAgICAgdGhhdCBqdXN0IHBsYWluIGlzbid0IHRoZXJlLiAoYWxzbyBub3Qgc28gbGlrZWx5LCBzaW5jZSBtYW55CisgICAgICAgcGVvcGxlIGluIG90aGVyIHJlY2VudCBtZXNzYWdlIHRocmVhZHMgc2FpZCB0aGF0IG90aGVyIHByb2dyYW1zCisgICAgICAgd29yayBPSykuCisgICAgMy4gWW91ciBwcm9ncmFtLCBvciB0aGUgbGlicmFyaWVzLi4uYXJlIGxvb2tpbmcgZm9yIGEgdGVybWluZm8gZmlsZQorICAgICAgIHRoYXQgaXMgc3RvcmVkIGF0IGEgcGF0aG5hbWUgdGhhdCBpc24ndCBleHBlY3RlZCBieSB5b3VyIHByb2dyYW0sCisgICAgICAgdGhlIGxpYnJhcmllcy0tYW5kIHNvIG9uLiBJIGZvcmdvdCBpZiBJIHJlYWQgdGhpcyBpbiB0aGUgZXJyYXRhCisgICAgICAgV2ViIHBhZ2Ugb3Igd2hlcmUgZXhhY3RseSBJIGRpc2NvdmVyZWQgdGhpcyAoTmV0c2NhcGUgaW5zdGFsbD8KKyAgICAgICBBY3JvYmF0IGluc3RhbGw/KSwgYnV0IGl0IG1heSBqdXN0IGJlIHRoYXQgb25lIGxpYmMgKGxldCdzIHNheSBmb3IKKyAgICAgICBzYWtlIG9mIGFyZ3VtZW50LCBsaWJjNSwgYnV0IEkgZG9uJ3Qga25vdyB0aGlzIHRvIGJlIHRydWUpIGV4cGVjdHMKKyAgICAgICB5b3VyIHRlcm1pbmZvIHRvIGJlIGluIC91c3Ivc2hhcmUvdGVybWluZm8sIGFuZCB0aGUgb3RoZXIgKGxldCdzCisgICAgICAgc2F5IGxpYmM2L2dsaWJjKSBleHBlY3RzIC91c3IvbGliL3Rlcm1pbmZvLiBJIHJlbWVtYmVyIHRoYXQgdGhlCisgICAgICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgYnVnZml4L3dvcmthcm91bmQgd2VyZSB0byBkbyB0aGUKKyAgICAgICBmb2xsb3dpbmcgb3IgZXF1aXZhbGVudDoKKyAgY2QgL3Vzci9saWIKKyAgbG4gLXMgLi4vc2hhcmUvdGVybWluZm8gLi90ZXJtaW5mbworICAgICAgIG9yOgorICBsbiAtcyAvdXNyL3NoYXJlL3Rlcm1pbmZvIC91c3IvbGliL3Rlcm1pbmZvCisKKyAgICAgU28gd2hhdCB0aGlzIHNheXMgaXMgdGhhdCB0aGUgdGVybWluZm8gZGF0YWJhc2UvZGlyZWN0b3J5IHN0cnVjdHVyZQorICAgICBjYW4gYmUgYWNjZXNzZWQgYnkgZWl0aGVyIHBhdGguIFdoZW4gc29tZXRoaW5nIGdvZXMgdG8gcmVmZXJlbmNlCisgICAgIC91c3IvbGliL3Rlcm1pbmZvLCB0aGUgc3ltbGluayByZWRpcmVjdHMgaXQgdG8gZXNzZW50aWFsbHkKKyAgICAgL3Vzci9zaGFyZS90ZXJtaW5mbywgd2hpY2ggaXMgd2hlcmUgaXQgcmVhbGx5IHJlc2lkZXMgb24geW91cgorICAgICBzeXN0ZW0uIEkgcGVyc29uYWxseSBwcmVmZXIgd2hlcmV2ZXIgcG9zc2libGUgdG8gdXNlIHJlbGF0aXZlCisgICAgIHN5bWxpbmtzLCBiZWNhdXNlIHRoZXkgc3RpbGwgaG9sZCwgbW9yZSBvZnRlbiB0aGFuIGJyZWFrLCBhY3Jvc3MKKyAgICAgbW91bnQgcG9pbnRzLCBwYXJ0aWN1bGFybHkgTkZTIG1vdW50cywgd2hlcmUgdGhlIGRpcmVjdG9yeQorICAgICBzdHJ1Y3R1cmUgbWF5IGJlIGRpZmZlcmVudCBvbiB0aGUgZGlmZmVyZW50IHN5c3RlbXMuCisKKyAgIEV2aWRlbnRseSB0aGUgdGVybWluZm8gZmlsZSBtb3ZlZCBiZXR3ZWVuIFJlZCBIYXQgNS4wIGFuZCA1LjEsIGJ1dCBSZWQKKyAgIEhhdCBkaWQgbm90IGluY2x1ZGUgYSBsaW5rIHRvIGxldCBhcHBsaWNhdGlvbnMgYnVpbHQgcHJpb3IgdG8gNS4xIGZpbmQKKyAgIGl0LiBVc2VycyByZXBvcnRlZCB0aGF0IGluc3RhbGxpbmcgdGhlIGxpbmsgZml4ZXMgdGhlIHByb2JsZW0uCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4zLjYuIFRoZSBGdWxsc2NyZWVuIEZpbGUgVHJhbnNmZXIgRGlzcGxheQorCisgICBbIFszMjddVG9wIF0gWyBbMzI4XUNvbnRlbnRzIF0gWyBbMzI5XVNlY3Rpb24gQ29udGVudHMgXSBbCisgICBbMzMwXVByZXZpb3VzIF0KKworICAgU3RhcnRpbmcgd2l0aCBuY3Vyc2VzIHZlcnNpb25zIGRhdGVkIDE5OTgtMTItMTIgKGFib3V0IGEgeWVhciBiZWZvcmUKKyAgIG5jdXJzZXMgNS4wKSwgbmN1cnNlcyBzZXRzIHRoZSB0ZXJtaW5hbCBmb3IgYnVmZmVyZWQgaS9vLCBidXQKKyAgIHVuZm9ydHVuYXRlbHkgaXMgbm90IGFibGUgdG8gcmVzdG9yZSBpdCB1cG9uIGV4aXQgZnJvbSBjdXJzZXMgKHZpYQorICAgZW5kd2luKCkpLiBUaHVzIGFmdGVyIGEgZmlsZSB0cmFuc2ZlciB0aGF0IHVzZXMgdGhlIGZ1bGxzY3JlZW4gZmlsZQorICAgdHJhbnNmZXIgZGlzcGxheSwgdGhlIHRlcm1pbmFsIG5vIGxvbmdlciBlY2hvcyBub3IgcmVzcG9uZHMKKyAgIGltbWVkaWF0ZWx5IHRvIFRhYiwgPywgYW5kIG90aGVyIHNwZWNpYWwgY29tbWFuZCBjaGFyYWN0ZXJzLiBUaGUgc2FtZQorICAgdGhpbmcgaGFwcGVucyBvbiBvdGhlciBwbGF0Zm9ybXMgdGhhdCB1c2UgbmN1cnNlcywgZS5nLiBGcmVlQlNELgorICAgV29ya2Fyb3VuZHM6CisKKyAgICAgKiBVc2UgU0VUIFhGRVIgRElTUExBWSBCUklFRiwgQ1JULCBTRVJJQUwsIG9yIE5PTkUgaW5zdGVhZCBvZgorICAgICAgIEZVTExTQ1JFRU47IG9yOgorICAgICAqIFJlYnVpbGQgd2l0aCBLRkxBR1M9LUROT05PU0VUQlVGIChDLUtlcm1pdCA4LjApCisKKyAgIEluIFJlZCBIYXQgNy4xLCB3aGVuIHVzaW5nIEMtS2VybWl0IGluIGEgR25vbWUgdGVybWluYWwgd2luZG93LCBpdCB3YXMKKyAgIG5vdGljZWQgdGhhdCB3aGVuIHRoZSBmdWxsc2NyZWVuIGZpbGUgdHJhbnNmZXIgZGlzcGxheSBleGl0cyAodmlhCisgICBlbmR3aW4oKSksIHRoZSBwcmV2aW91cyAocHJlLWZpbGUtdHJhbnNmZXItZGlzcGxheSkgc2NyZWVuIGlzCisgICByZXN0b3JlZC4gVGh1cyB5b3UgY2FuJ3QgbG9vayBhdCB0aGUgY29tcGxldGVkIGRpc3BsYXkgdG8gc2VlIHdoYXQKKyAgIGhhcHBlbmVkLiBUaGlzIGlzIGEgZXZpZGVudGx5IGEgbmV3IGZlYXR1cmUgb2YgeHRlcm0uIEkgY2FuIG9ubHkKKyAgIHNwZWN1bGF0ZSB0aGF0IGluaXRzY3JlZW4oKSBhbmQgZW5kd2luKCkgbXVzdCBzZW5kIHNvbWUga2luZCBvZgorICAgc3BlY2lhbCBlc2NhcGUgc2VxdWVuY2VzIHRoYXQgY29tbWFuZCB4dGVybSB0byBzYXZlIGFuZCByZXN0b3JlIHRoZQorICAgc2NyZWVuLiBUbyBkZWZlYXQgdGhpcyBlZmZlY3QsIHRlbGwgTGludXggeW91IGhhdmUgYSB2dDEwMCBvciBvdGhlcgorICAgeHRlcm0tY29tcGF0aWJsZSB0ZXJtaW5hbCB0aGF0IGlzIG5vdCBhY3R1YWxseSBhbiB4dGVybSwgb3IgZWxzZSB0ZWxsCisgICBLZXJtaXQgdG8gU0VUIFRSQU5TRkVSIERJU1BMQVkgdG8gc29tZXRoaW5nIGJlc2lkZXMgRlVMTFNDUkVFTi4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjQuIEMtS0VSTUlUIEFORCBORVhUU1RFUAorCisgICBbIFszMzFdVG9wIF0gWyBbMzMyXUNvbnRlbnRzIF0gWyBbMzMzXVNlY3Rpb24gQ29udGVudHMgXSBbIFszMzRdTmV4dCBdCisgICBbIFszMzVdUHJldmlvdXMgXQorCisgICBSdW4gQy1LZXJtaXQgaW4gYSBUZXJtaW5hbCwgU3R1YXJ0LCBvciB4dGVybSB3aW5kb3csIG9yIHdoZW4gbG9nZ2VkIGluCisgICByZW1vdGVseSB0aHJvdWdoIGEgc2VyaWFsIHBvcnQgb3IgVEVMTkVUIGNvbm5lY3Rpb24uIEMtS2VybWl0IGRvZXMgbm90CisgICB3b3JrIGNvcnJlY3RseSB3aGVuIGludm9rZWQgZGlyZWN0bHkgZnJvbSB0aGUgTmVYVFNURVAgRmlsZSBWaWV3ZXIgb3IKKyAgIERvY2suIFRoaXMgaXMgYmVjYXVzZSB0aGUgdGVybWluYWwtb3JpZW50ZWQgZ3R0eSwgc3R0eSwgJiBpb2N0bCBjYWxscworICAgZG9uJ3Qgd29yayBvbiB0aGUgbGl0dGxlIHdpbmRvdyB0aGF0IE5lWFRTVEVQIHBvcHMgdXAgZm9yIG5vbi1OZVhUU1RFUAorICAgYXBwbGljYXRpb25zIGxpa2UgS2VybWl0LiBDQlJFQUsgYW5kIE5vLUVDSE8gc2V0dGluZ3MgZG8gbm90IHRha2UKKyAgIGVmZmVjdCBpbiB0aGUgY29tbWFuZCBwYXJzZXIgLS0gY29tbWFuZHMgYXJlIHBhcnNlZCBzdHJpY3RseSBsaW5lIGF0IGEKKyAgIHRpbWUuICJzZXQgbGluZSAvZGV2L2N1YSIgd29ya3MuIER1cmluZyBDT05ORUNUIG1vZGUsIHRoZSBjb25zb2xlCisgICBzdGF5cyBpbiBjb29rZWQgbW9kZSwgc28gY2hhcmFjdGVycyBhcmUgbm90IHRyYW5zbWl0dGVkIHVudGlsIGNhcnJpYWdlCisgICByZXR1cm4gb3IgbGluZWZlZWQgaXMgdHlwZWQsIGFuZCB5b3UgY2FuJ3QgZXNjYXBlIGJhY2suIElmIHlvdSB3YW50IHRvCisgICBydW4gS2VybWl0IGRpcmVjdGx5IGZyb20gdGhlIEZpbGUgVmlld2VyLCB0aGVuIGxhdW5jaCBpdCBmcm9tIGEgc2hlbGwKKyAgIHNjcmlwdCB0aGF0IHB1dHMgaXQgaW4gdGhlIGRlc2lyZWQga2luZCBvZiB3aW5kb3csIHNvbWV0aGluZyBsaWtlIHRoaXMKKyAgIChmb3IgIlRlcm1pbmFsIik6CisKKyAgVGVybWluYWwgLUxpbmVzIDI0IC1Db2x1bW5zIDgwIC1XaW5Mb2NYIDEwMCAtV2luTG9jWSAxMDAgJEZPTlQgJEZPTlRTSVpFIFwKKyAgLVNvdXJjZURvdExvZ2luIC1TaGVsbCAvdXNyL2xvY2FsL2Jpbi9rZXJtaXQgJgorCisgICBDLUtlcm1pdCBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBvbiBhIE5lWFQgd2l0aCBOZVhUU1RFUCAzLjAgdG8gd2hpY2gKKyAgIHlvdSBoYXZlIGVzdGFibGlzaGVkIGFuIHJsb2dpbiBjb25uZWN0aW9uLCBkdWUgdG8gYSBidWcgaW4gTmVYVFNURVAKKyAgIDMuMCwgd2hpY2ggaGFzIGJlZW4gcmVwb3J0ZWQgdG8gTmVYVC4KKworICAgVGhlIFNFVCBDQVJSSUVSIGNvbW1hbmQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgTmVYVCAtLSB0aGlzIGlzIGEKKyAgIGxpbWl0YXRpb24gb2YgdGhlIE5lWFRTVEVQIHNlcmlhbC1wb3J0IGRldmljZSBkcml2ZXJzLgorCisgICBIYXJkd2FyZSBmbG93IGNvbnRyb2wgb24gdGhlIE5lWFQgaXMgc2VsZWN0ZWQgbm90IGJ5ICJzZXQgZmxvdworICAgcnRzL2N0cyIgaW4gS2VybWl0IChzaW5jZSBOZVhUU1RFUCBvZmZlcnMgbm8gQVBJIGZvciB0aGlzKSwgYnV0CisgICByYXRoZXIsIGJ5IHVzaW5nIGEgc3BlY2lhbGx5LW5hbWVkIGRyaXZlciBmb3IgdGhlIHNlcmlhbCBkZXZpY2U6CisgICAvZGV2L2N1ZmEgaW5zdGVhZCAvZGV2L2N1YTsgL2Rldi9jdWZiIGluc3RlYWQgb2YgL2Rldi9jdWIuIFRoaXMgaXMKKyAgIGF2YWlsYWJsZSBvbmx5IG9uIDY4MDQwLWJhc2VkIE5lWFQgbW9kZWxzICh0aGUgc2l0dWF0aW9uIGZvciBJbnRlbAorICAgTmVYVFNURVAgaW1wbGVtZW50YXRpb25zIGlzIHVua25vd24pLgorCisgICBOZVhULWJ1aWx0IDY4MDMwIGFuZCA2ODA0MCBtb2RlbHMgaGF2ZSBkaWZmZXJlbnQga2luZHMgb2Ygc2VyaWFsCisgICBpbnRlcmZhY2VzOyB0aGUgNjgwMzAgaGFzIGEgTWFjaW50b3NoLWxpa2UgUlMtNDIyIGludGVyZmFjZSwgd2hpY2gKKyAgIGxhY2tzIFJUUyBhbmQgQ1RTIHNpZ25hbHM7IHRoZSA2ODA0MCBoYXMgYW4gUlMtNDIzIChSUy0yMzIgY29tcGF0aWJsZSkKKyAgIGludGVyZmFjZSwgd2hpY2ggc3VwcG9ydHMgdGhlIGNvbW1vbmx5LXVzZWQgbW9kZW0gc2lnbmFscy4gV0FSTklORzoKKyAgIHRoZSBjb25uZWN0b3JzIGxvb2sgZXhhY3RseSB0aGUgc2FtZSwgYnV0IHRoZSBwaW5zIGFyZSB1c2VkIGluCisgICBjb21wbGV0ZWx5IERJRkZFUkVOVCB3YXlzIC0tIGRpZmZlcmVudCBjYWJsZXMgYXJlIHJlcXVpcmVkIGZvciB0aGUgdHdvCisgICBraW5kcyBvZiBpbnRlcmZhY2VzLgorCisgICAgIElGIFlPVSBHRVQgTE9UUyBPRiBSRVRSQU5TTUlTU0lPTlMgZHVyaW5nIGZpbGUgdHJhbnNmZXIsIGV2ZW4gd2hlbgorICAgICB1c2luZyBhIC9kZXYvY3VmKiBkZXZpY2UgYW5kIHRoZSBtb2RlbSBpcyBjb3JyZWN0bHkgY29uZmlndXJlZCBmb3IKKyAgICAgUlRTL0NUUyBmbG93IGNvbnRyb2wsIFlPVSBQUk9CQUJMWSBIQVZFIFRIRSBXUk9ORyBLSU5EIE9GIENBQkxFLgorCisgICBPbiB0aGUgTmVYVCwgS2VybWl0IHJlcG9ydGVkbHkgKGJ5IFRpbWVNb24pIGNhdXNlcyB0aGUga2VybmVsIHRvIHVzZSBhCisgICBsb3Qgb2YgQ1BVIHRpbWUgd2hlbiB1c2luZyBhICJzZXQgbGluZSIgY29ubmVjdGlvbi4gVGhhdCdzIGJlY2F1c2UKKyAgIHRoZXJlIGlzIG5vIERNQSBjaGFubmVsIGZvciB0aGUgTmVYVCBzZXJpYWwgcG9ydCwgc28gdGhlIHBvcnQgbXVzdAorICAgaW50ZXJydXB0IHRoZSBrZXJuZWwgZm9yIGVhY2ggY2hhcmFjdGVyIGluIG9yIG91dC4KKworICAgT25lIHVzZXIgcmVwb3J0ZWQgdHJvdWJsZSBydW5uaW5nIEMtS2VybWl0IG9uIGEgTmVYVCBmcm9tIHdpdGhpbgorICAgTmVYVCdzIFN1YnByb2Nlc3MgY2xhc3MgdW5kZXIgTmVYVHN0ZXAgMy4wLCBhbmQvb3Igd2hlbiBybG9naW4nZCBmcm9tCisgICBvbmUgTmVYVCB0byBhbm90aGVyOiBFcnJvciBvcGVuaW5nIC9kZXYvdHR5OiwgY29uZ206IE5vIHN1Y2ggZGV2aWNlIG9yCisgICBhZGRyZXNzLiBEaWFnbm9zaXM6IEJ1ZyBpbiBOZVhUU1RFUCAzLjAsIGN1cmUgdW5rbm93bi4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjUuIEMtS0VSTUlUIEFORCBRTlgKKworICAgWyBbMzM2XVRvcCBdIFsgWzMzN11Db250ZW50cyBdIFsgWzMzOF1TZWN0aW9uIENvbnRlbnRzIF0gWyBbMzM5XU5leHQgXQorICAgWyBbMzQwXVByZXZpb3VzIF0KKworICAgU2VlIGFsc286IFRoZSBbMzQxXWNvbXAub3MucW54IG5ld3Nncm91cC4KKworICAgU3VwcG9ydCBmb3IgUU5YIDQueCB3YXMgYWRkZWQgaW4gQy1LZXJtaXQgNUEoMTkwKS4gVGhpcyBpcyBhCisgICBmdWxsLWZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLCB0aG9yb3VnaGx5IHRlc3RlZCBvbiBRTlggNC4yMSBhbmQgbGF0ZXIsCisgICBhbmQgdmVyaWZpZWQgdG8gd29yayBpbiBib3RoIDE2LWJpdCBhbmQgMzItYml0IHZlcnNpb25zLiBUaGUgMTYtYml0CisgICB2ZXJzaW9uIHdhcyBkcm9wcGVkIGluIEMtS2VybWl0IDcuMCBzaW5jZSBpdCBjYW4gbm8gbG9uZ2VyIGJlIGJ1aWx0CisgICBzdWNjZXNzZnVsbHkgKGFmdGVyIHN0cmlwcGluZyBtb3N0IG1vc3QgZmVhdHVyZXMsIEkgc3VjY2VlZGVkIGluCisgICBnZXR0aW5nIGl0IHRvIGNvbXBpbGUgYW5kIGxpbmsgd2l0aG91dCBjb21wbGFpbnQsIGJ1dCB0aGUgZXhlY3V0YWJsZQorICAganVzdCBiZWVwcyB3aGVuIHlvdSBydW4gaXQpOyBmb3IgMTYtYml0IFFOWCA0LjJ4LCB1c2UgQy1LZXJtaXQgNi4wIG9yCisgICBlYXJsaWVyLCBvciBlbHNlIFszNDJdRy1LZXJtaXQuCisKKyAgIFRoZSAzMi1iaXQgdmVyc2lvbiAoYW5kIHRoZSAxNi1iaXQgdmVyc2lvbiBwcmlvciB0byBDLUtlcm1pdCA3LjApCisgICBzdXBwb3J0cyBtb3N0IG9mIEMtS2VybWl0J3MgYWR2YW5jZWQgZmVhdHVyZXMgaW5jbHVkaW5nIFRDUC9JUCwgaGlnaAorICAgc2VyaWFsIHNwZWVkcywgaGFyZHdhcmUgZmxvdy1jb250cm9sLCBtb2RlbS1zaWduYWwgYXdhcmVuZXNzLCBjdXJzZXMKKyAgIHN1cHBvcnQsIGV0Yy4KKworICAgQlVHOiBJbiBDLUtlcm1pdCA2LjAgb24gUU5YIDQuMjIgYW5kIGVhcmxpZXIsIHRoZSBmdWxsc2NyZWVuIGZpbGUKKyAgIHRyYW5zZmVyIGRpc3BsYXkgd29ya2VkIGZpbmUgdGhlIGZpcnN0IHRpbWUsIGJ1dCB3YXMgZnJhY3R1cmVkIG9uCisgICBzdWJzZXF1ZW50IGZpbGUgdHJhbnNmZXJzLiBDYXVzZSBhbmQgY3VyZSB1bmtub3duLiBJbiBDLUtlcm1pdCA3LjAgYW5kCisgICBRTlggNC4yNSwgdGhpcyBubyBsb25nZXIgb2NjdXJzLiBJdCBpcyBub3Qga25vd24gaWYgaXQgd291bGQgb2NjdXIgaW4KKyAgIEMtS2VybWl0IDcuMCBvciBsYXRlciBvbiBlYXJsaWVyIFFOWCB2ZXJzaW9ucy4KKworICAgRGlhbG91dCBkZXZpY2VzIGFyZSBub3JtYWxseSAvZGV2L3NlcjEsIC9kZXYvc2VyMiwgLi4uLCBhbmQgY2FuIGJlCisgICBvcGVuZWQgZXhwbGljaXRseSB3aXRoIFNFVCBMSU5FLiBSZXBvcnRlZGx5LCAiL2Rldi9zZXIiIChubyB1bml0CisgICBudW1iZXIpIG9wZW5zIHRoZSBmaXJzdCBhdmFpbGFibGUgL2Rldi9zZXJuIGRldmljZS4KKworICAgTGlrZSBhbGwgb3RoZXIgVW5peCBDLUtlcm1pdCBpbXBsZW1lbnRhdGlvbnMsIFFOWCBDLUtlcm1pdCBkb2VzIG5vdAorICAgcHJvdmlkZSBhbnkga2luZCBvZiB0ZXJtaW5hbCBlbXVsYXRpb24uIFRlcm1pbmFsIHNwZWNpZmljIGZ1bmN0aW9ucworICAgYXJlIHByb3ZpZGVkIGJ5IHlvdXIgdGVybWluYWwsIHRlcm1pbmFsIHdpbmRvdyAoZS5nLiBRTlggVGVybWluYWwgb3IKKyAgIHh0ZXJtKSwgb3IgZW11bGF0b3IuCisKKyAgIFFOWCBDLUtlcm1pdCwgYXMgZGlzdHJpYnV0ZWQsIGRvZXMgbm90IGluY2x1ZGUgc3VwcG9ydCBmb3IgVVVDUAorICAgbGluZS1sb2NraW5nOyB0aGUgUU5YIG1ha2VmaWxlIGVudHJpZXMgKHFueDMyIGFuZCBxbngxNikgaW5jbHVkZSB0aGUKKyAgIC1ETk9VVUNQIHN3aXRjaC4gVGhpcyBpcyBiZWNhdXNlIFFOWCwgYXMgZGlzdHJpYnV0ZWQsIGRvZXMgbm90IGluY2x1ZGUKKyAgIFVVQ1AsIGFuZCBpdHMgb3duIGNvbW11bmljYXRpb25zIHNvZnR3YXJlIChlLmcuIHF0ZXJtKSBkb2VzIG5vdCB1c2UKKyAgIFVVQ1AgbGluZSBsb2NraW5nLiBJZiB5b3UgaGF2ZSBhIFVVQ1AgcHJvZHVjdCBpbnN0YWxsZWQgb24geW91ciBRTlgKKyAgIHN5c3RlbSwgcmVtb3ZlIHRoZSAtRE5PVVVDUCBzd2l0Y2ggZnJvbSB0aGUgbWFrZWZpbGUgZW50cnkgYW5kCisgICByZWJ1aWxkLiBUaGVuIGNoZWNrIHRvIHNlZSB0aGF0IEtlcm1pdCdzIFVVQ1AgbG9ja2ZpbGUgY29udmVudGlvbnMgYXJlCisgICB0aGUgc2FtZSBhcyB0aG9zZSBvZiB5b3VyIFVVQ1AgcGFja2FnZTsgaWYgbm90LCByZWFkIHRoZSBbMzQzXVVVQ1AKKyAgIGxvY2tmaWxlIHNlY3Rpb24gb2YgdGhlIFszNDRdSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucyBhbmQgbWFrZSB0aGUKKyAgIG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHRoZSBtYWtlZmlsZSBlbnRyeSAoZS5nLiBhZGQgLURIREJVVUNQKS4KKworICAgUU5YIGRvZXMsIGhvd2V2ZXIsIGFsbG93IGEgcHJvZ3JhbSB0byBnZXQgdGhlIGRldmljZSBvcGVuIGNvdW50LiBUaGlzCisgICBjYW4gbm90IGJlIGEgcmVsaWFibGUgZm9ybSBvZiBsb2NraW5nIHVubGVzcyBhbGwgYXBwbGljYXRpb25zIGRvIGl0LAorICAgc28gYnkgZGVmYXVsdCwgS2VybWl0IHVzZXMgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGZvciBwcmludGluZyBhCisgICB3YXJuaW5nIG1lc3NhZ2Ugc3VjaCBhczoKKworICBDLUtlcm1pdD5zZXQgbGluZSAvZGV2L3NlcjEKKyAgV0FSTklORyAtICIvZGV2L3NlcjEiIGxvb2tzIGJ1c3kuLi4KKworICAgSG93ZXZlciwgaWYgeW91IHdhbnQgdG8gdXNlIGl0IGFzIGEgbG9jaywgeW91IGNhbiBkbyBzbyB3aXRoOgorCisgIFNFVCBRTlgtUE9SVC1MT0NLIHsgT04sIE9GRiB9CisKKyAgIFRoaXMgaXMgT0ZGIGJ5IGRlZmF1bHQ7IGlmIHlvdSBzZXQgaW4gT04sIEMtS2VybWl0IHdpbGwgZmFpbCB0byBvcGVuCisgICBhbnkgZGlhbG91dCBkZXZpY2Ugd2hlbiBpdHMgb3BlbiBjb3VudCBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MKKyAgIGhhcyBpdCBvcGVuLiBTSE9XIENPTU0gKGluIFFOWCBvbmx5KSBkaXNwbGF5cyB0aGUgc2V0dGluZywgYW5kIGlmIHlvdQorICAgaGF2ZSBhIHBvcnQgb3BlbiwgaXQgYWxzbyBzaG93cyB0aGUgb3BlbiBjb3VudC4KKworICAgQXMgb2YgQy1LZXJtaXQgOC4wLCBDLUtlcm1pdCdzICJvcGVuLWNvdW50IiBmb3JtIG9mIGxpbmUgbG9ja2luZyB3b3JrcworICAgb25seSBpbiBRTlg0LCBub3QgaW4gUU5YNiAodGhpcyBtaWdodCBjaGFuZ2UgaW4gYSBmdXR1cmUgQy1LZXJtaXQKKyAgIHJlbGVhc2UpLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuNi4gQy1LRVJNSVQgQU5EIFNDTworCisgICBbIFszNDVdVG9wIF0gWyBbMzQ2XUNvbnRlbnRzIF0gWyBbMzQ3XVNlY3Rpb24gQ29udGVudHMgXSBbIFszNDhdTmV4dCBdCisgICBbIFszNDldUHJldmlvdXMgXQorCisgICBTRUNUSU9OIENPTlRFTlRTCisKKzMuNi4xLiBbMzUwXVNDTyBYRU5JWAorMy42LjIuIFszNTFdU0NPIFVOSVggYW5kIE9TUjUKKzMuNi4zLiBbMzUyXVVuaXh3YXJlCiszLjYuNC4gWzM1M11PcGVuIFVOSVggOAorCisgICBSRUZFUkVOQ0VTCisKKyAgICAgKiBUaGUgY29tcC51bml4LnNjby4qIG5ld3Nncm91cHMuCisgICAgICogWzM1NF1TZWN0aW9uIDMuMTAgYmVsb3cgZm9yIFVuaXh3YXJlLgorICAgICAqIFRoZSBmb2xsb3dpbmcgRkFRczoKKworICAgICAgICBUaGUgY29tcC5zY28ubWlzYyBGQVE6CisgICAgICAgICAgICAgICAgWzM1NV1odHRwOi8vYXBsYXdyZW5jZS5jb20vU0NPRkFRLworCisgICAgICAgIENhbGRlcmEgKFNDTykgY29tcC51bml4LnNjby5wcm9ncmFtbWVyIEZBUToKKyAgICAgICAgICAgICAgICBbMzU2XWh0dHA6Ly93d3cuemVuZXouY29tL2NnaS1iaW4vc2NvcHJvZ2ZhcS9mYXEucGwKKworICAgICAgICBUaGUgVW5peFdhcmUgNy9PcGVuVU5JWCA4IEZBUToKKyAgICAgICAgICAgICAgICBbMzU3XWh0dHA6Ly93d3cuemVuZXouY29tL2NnaS1iaW4vc2NvdXc3ZmFxL2ZhcS5wbAorICAgICAgICAgICAgICAgIFszNThdaHR0cDovL3plbmV6LnBjdW5peC5jb20vY2dpLWJpbi9zY291dzdmYXEvZmFxLnBsCisKKyAgICAgICAgSGlnaCBTcGVlZCBNb2RlbXMgZm9yIFNDTyBVbml4OgorICAgICAgICAgICAgICAgIFszNTldaHR0cDovL3BjdW5peC5jb20vVW5peGFydC9tb2RlbXMuaHRtbAorCisgICAgICAgIFRoZSBVbml4V2FyZSBGQVEKKyAgICAgICAgICAgICAgICBbMzYwXWh0dHA6Ly93d3cuZnJlZWJpcmQub3JnL2ZhcS8KKworICAgICAgICBUaGUgVW5peFdhcmUgMS54IGFuZCAyLjAgUHJvZ3JhbW1lciBGQVEKKyAgICAgICAgICAgICAgICBbMzYxXWh0dHA6Ly93d3cuZnJlZWJpcmQub3JnL2ZhcS9kZXZlbG9wZXIuaHRtbAorCisgICAgICAgIENhbGRlcmEgU3VwcG9ydCBLbm93bGVkZ2UgQmFzZQorICAgICAgICAgICAgICAgIFszNjJdaHR0cDovL3N1cHBvcnQuY2FsZGVyYS5jb20vY2FsZGVyYQorCisgICAgICAgIFszNjNdaHR0cDovL3N0YWdlLmNhbGRlcmEuY29tL3RhLworICAgICAgICAgICAgICAgIENhbGRlcmEgKFNDTykgVGVjaG5pY2FsIEFydGljbGUgU2VhcmNoIENlbnRlcgorCisgICAgICAgIFszNjRdaHR0cDovL2FwbGF3cmVuY2UuY29tL25ld3Rvc2NvLmh0bWwKKyAgICAgICAgICAgICAgICBOZXcgdG8gU0NPIChUb255IExhd3JlbmNlKQorCisgICBUaGUgc2FtZSBjb21tZW50cyByZWdhcmRpbmcgdGVybWluYWwgZW11bGF0aW9uIGFuZCBrZXkgbWFwcGluZyBhcHBseQorICAgdG8gU0NPIG9wZXJhdGluZyBzeXN0ZW1zIGFzIHRvIGFsbCBvdGhlciBVbml4ZXMuIEMtS2VybWl0IGlzIG5vdCBhCisgICB0ZXJtaW5hbCBlbXVsYXRvciwgYW5kIHlvdSBjYW4ndCB1c2UgaXQgdG8gbWFwIEYta2V5cywgQXJyb3cga2V5cywKKyAgIGV0Yy4gVGhlIHdheSB0byBkbyB0aGlzIGlzIHdpdGggeG1vZG1hcCAoeHRlcm0pIG9yIGxvYWRrZXlzIChjb25zb2xlKS4KKyAgIEZvciBhIGJyaWVmIGV4cGxhbmF0aW9uLCBzZWUgWzM2NV1TZWN0aW9uIDMuMC41LiBGb3IgYSBmdWxsZXIKKyAgIGV4cGxhbmF0aW9uLCBbMzY2XUNsSUNLIEhFUkUuCisKKyAgIEFsc28gc2VlIGdlbmVyYWwgY29tbWVudHMgb24gUEMtYmFzZWQgVW5peGVzIGluIFszNjddU2VjdGlvbiAzLjAuCisKKyAgMy42LjEuIFNDTyBYRU5JWAorCisgICBbIFszNjhdVG9wIF0gWyBbMzY5XUNvbnRlbnRzIF0gWyBbMzcwXVNlY3Rpb24gQ29udGVudHMgXSBbIFszNzFdTmV4dCBdCisKKyAgIE9sZCBYZW5peCB2ZXJzaW9ucy4uLiBEaWQgeW91IGtub3c6IFhlbml4IDMuMCBpcyAqb2xkZXIqIHRoYW4gWGVuaXgKKyAgIDIuMD8KKworICAgSW4gWGVuaXggMi4zLjQgYW5kIHByb2JhYmx5IG90aGVyIFhlbml4IHZlcnNpb25zLCBtb21lbnRhcmlseSBkcm9wcGluZworICAgRFRSIHRvIGhhbmcgdXAgYSBtb2RlbSBkb2VzIG5vdCB3b3JrLiBEVFIgZ29lcyBkb3duIGJ1dCBkb2VzIG5vdCBjb21lCisgICB1cCBhZ2Fpbi4gV29ya2Fyb3VuZDogVXNlIFNFVCBNT0RFTSBIQU5HVVAtTUVUSE9EIE1PREVNLUNPTU1BTkQuCisgICBBbnlib2R5IHdobyB3b3VsZCBsaWtlIHRvIGZpeCB0aGlzIGlzIHdlbGNvbWUgdG8gdGFrZSBhIGxvb2sgYXQKKyAgIHR0aGFuZygpIGluIFszNzJdY2t1dGlvLmMuIEFsc286IG1vZGVtIHNpZ25hbHMgY2FuIG5vdCBiZSByZWFkIGluCisgICBYZW5peCwgYW5kIHRoZSBtYXhpbXVtIHNlcmlhbCBzcGVlZCBpcyAzODQwMC4KKworICAgVGhlcmUgaXMgYWxsIHNvcnRzIG9mIGNvbmZ1c2lvbiBhbW9uZyBTQ08gdmVyc2lvbnMsIHBhcnRpY3VsYXJseSB3aGVuCisgICB0aGlyZC0gcGFydHkgY29tbXVuaWNhdGlvbnMgYm9hcmRzIGFuZCBkcml2ZXJzIGFyZSBpbnN0YWxsZWQsCisgICByZWdhcmRpbmcgbG9ja2ZpbGUgbmFtaW5nIGNvbnZlbnRpb25zLCBhcyB3ZWxsIGFzIGJhc2ljIGZ1bmN0aW9uYWxpdHkuCisgICBBcyBmYXIgYXMgbG9ja2ZpbGVzIGdvLCBhbGwgYmV0cyBhcmUgb2ZmIGlmIHlvdSBhcmUgdXNpbmcgYQorICAgdGhpcmQtcGFydHkgbXVsdGlwb3J0IGJvYXJkLiBBdCBsZWFzdCB5b3UgaGF2ZSB0aGUgc291cmNlIGNvZGUuCisgICBIb3BlZnVsbHkgeW91IGFsc28gaGF2ZSBhIEMgY29tcGlsZXIgOi0pCisKKyAgIFhlbml4IDIuMy4wIGFuZCBsYXRlciBjbGFpbSB0byBzdXBwb3J0IFJUU0ZMT1cgYW5kIENUU0ZMT1csIGJ1dCB0aGlzCisgICBpcyBub3QgbW9kZXJuIGJpZGlyZWN0aW9uYWwgaGFyZHdhcmUgZmxvdyBjb250cm9sOyByYXRoZXIgaXQKKyAgIGltcGxlbWVudHMgdGhlIG9yaWdpbmFsIFJTLTIzMiBtZWFuaW5ncyBvZiB0aGVzZSBzaWduYWxzIGZvcgorICAgdW5pZGlyZWN0aW9uYWwgaGFsZi1kdXBsZXggbGluZSBhY2Nlc3M6IElmIGJvdGggUlRTRkxPVyBhbmQgQ1RTRkxPVworICAgYml0cyBhcmUgc2V0LCBYZW5peCBhc3NlcnRzIFJUUyB3aGVuIGl0IHdhbnRzIHRvIHNlbmQgZGF0YSBhbmQgd2FpdHMKKyAgIGZvciBDVFMgYXNzZXJ0aW9uIGJlZm9yZSBpdCBhY3R1YWxseSBzdGFydHMgc2VuZGluZyBkYXRhIChhbHNvLAorICAgcmVwb3J0ZWRseSwgZXZlbiB0aGlzIGlzIGJyb2tlbiBpbiBYZW5peCAyLjMuMCBhbmQgMi4zLjEpLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuNi4yLiBTQ08gVU5JWCBBTkQgT1NSNQorCisgICBbIFszNzNdVG9wIF0gWyBbMzc0XUNvbnRlbnRzIF0gWyBbMzc1XVNlY3Rpb24gQ29udGVudHMgXSBbIFszNzZdTmV4dCBdCisgICBbIFszNzddUHJldmlvdXMgXQorCisgICBTQ08gc3lzdGVtcyB0ZW5kIHRvIHVzZSBkaWZmZXJlbnQgbmFtZXMgKGkuZS4gZHJpdmVycykgZm9yIHRoZSBzYW1lCisgICBkZXZpY2UuIFR5cGljYWxseSAvZGV2L3R0eTFhIHJlZmVycyB0byBhIHRlcm1pbmFsIGRldmljZSB0aGF0IGhhcyBubworICAgbW9kZW0gY29udHJvbDsgb3BlbiwgcmVhZCwgd3JpdGUsIGFuZCBjbG9zZSBvcGVyYXRpb25zIGRvIG5vdCBkZXBlbmQKKyAgIG9uIGNhcnJpZXIuIE9uIHRoZSBvdGhlciBoYW5kLCAvZGV2L3R0eTFBIChzYW1lIG5hbWUsIGJ1dCB3aXRoIGZpbmFsCisgICBsZXR0ZXIgdXBwZXIgY2FzZSksIGlzIHRoZSBzYW1lIGRldmljZSB3aXRoIG1vZGVtIGNvbnRyb2wsIGluIHdoaWNoCisgICBjYXJyaWVyIGlzIHJlcXVpcmVkICh0aGUgU0VUIExJTkUgY29tbWFuZCBkb2VzIG5vdCBjb21wbGV0ZSB1bnRpbAorICAgY2FycmllciBhcHBlYXJzLCByZWFkL3dyaXRlIG9wZXJhdGlvbnMgZmFpbCBpZiB0aGVyZSBpcyBubyBjYXJyaWVyLAorICAgZXRjKS4KKworICAgU0NPIE9wZW5TZXJ2ZXIgNS4wLjUgYW5kIGVhcmxpZXIgZG8gbm90IHN1cHBvcnQgdGhlIHJlYWRpbmcgb2YgbW9kZW0KKyAgIHNpZ25hbHMuIFRodXMgInNob3cgY29tbSIgZG9lcyBub3QgbGlzdCBtb2RlbSBzaWduYWxzLCBhbmQgQy1LZXJtaXQKKyAgIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcG9wIGJhY2sgdG8gaXRzIHByb21wdCB3aGVuIHRoZSBtb2RlbSBoYW5ncyB1cAorICAgdGhlIGNvbm5lY3Rpb24gKGRyb3BzIENEKS4gVGhlIGlvY3RsKCkgY2FsbCBmb3IgdGhpcyBpcyBzaW1wbHkgbm90CisgICBpbXBsbWVudGVkLCBhdCBsZWFzdCBub3QgaW4gdGhlIHN0YW5kYXJkIGRyaXZlcnMuIE9TUjUuMC42IGF0dGVtcHRzIHRvCisgICBkZWFsIHdpdGggbW9kZW0gc2lnbmFscyBidXQgZmFpbHM7IGhvd2V2ZXIgT1NSNS4wLjZhIGFwcGVhcnMgdG8KKyAgIGZ1bmN0aW9uIHByb3Blcmx5LgorCisgICBEaWFsaW5nIGlzIGxpa2VseSBub3QgdG8gd29yayB3ZWxsIGluIFNDTyBPcGVuU2VydmVyIDUuMC54IGJlY2F1c2UKKyAgIG1hbnkgb2YgdGhlIHNlcmlhbC1wb3J0IEFQSXMgc2ltcGx5IGRvIG5vdCBvcGVyYXRlIHdoZW4gdXNpbmcgdGhlCisgICBzdGFuZGFyZCBkcml2ZXJzLiBGb3IgZXhhbXBsZSwgaWYgRFRSIGlzIGRyb3BwZWQgYnkgdGhlIHJlY29tbWVuZGVkCisgICBtZXRob2QgKHNldHRpbmcgc3BlZWQgdG8gMCBmb3IgaGFsZiBhIHNlY29uZHMsIHRoZW4gcmVzdG9yaW5nIHRoZQorICAgc3BlZWQpLCBEVFIgYW5kIFJUUyBnbyBkb3duIGJ1dCBuZXZlciBjb21lIGJhY2sgdXAuIFdoZW4gaW4gZG91YnQgU0VUCisgICBNT0RFTSBIQU5HVVAtTUVUSE9EIE1PREVNLUNPTU1BTkQgb3IgU0VUIERJQUwgSEFOR1VQIE9GRi4KKworICAgT24gdGhlIG90aGVyIGhhbmQsIGNlcnRhaW4gZnVuY3Rpb25zIHRoYXQgbWlnaHQgbm90IChkbyBub3QpIHdvcmsKKyAgIHJpZ2h0IG9yIGF0IGFsbCB3aGVuIHVzaW5nIFNDTyBkcml2ZXJzIChlLmcuIGhpZ2ggc2VyaWFsIHNwZWVkcywKKyAgIGhhcmR3YXJlIGZsb3cgY29udHJvbCwgYW5kL29yIHJlYWRpbmcgb2YgbW9kZW0gc2lnbmFscykgbWlnaHQgd29yaworICAgcmlnaHQgd2hlbiB1c2luZyB0aGlyZC1wYXJ0eSBkcml2ZXJzLiAoRXhhbXBsZTogaGFyZHdhcmUgZmxvdyBjb250cm9sCisgICB3b3JrcywgcmVwb3J0ZWRseSwgb25seSBvbiB1cHBlcmNhc2UgZGV2aWNlIGxpa2UgdHR5MUEgLS0gbm90IHR0eTFhIC0tCisgICBhbmQgb25seSB3aGVuIENMT0NBTCBpcyBjbGVhciB3aGVuIHVzaW5nIHRoZSBTQ08gc2lvIGRyaXZlciwgYnV0IHRoZXJlCisgICBhcmUgbm8gc3VjaCByZXN0cmljdGlvbnMgaW4sIGUuZy4sIFszNzhdRGlnaWJvYXJkIGRyaXZlcnMpLgorCisgICBPbmUgdXNlciByZXBvcnRzIHRoYXQgaGUgY2FuJ3QgdHJhbnNmZXIgbGFyZ2UgZmlsZXMgd2l0aCBDLUtlcm1pdAorICAgdW5kZXIgU0NPIE9TUjUuMC4wIGFuZCA1LjAuNCAtLSBhZnRlciB0aGUgZmlyc3QgNUssIGV2ZXJ5dGhpbmcgZmFsbHMKKyAgIGFwYXJ0LiBTYW1lIHRoaW5nIHdpdGhvdXQgS2VybWl0IC0tIGUuZy4gd2l0aCBmdHAgb3ZlciBhIFBQUAorICAgY29ubmVjdGlvbi4gTGF0ZXIsIGhlIHNhaWQgdGhhdCByZXBsYWNpbmcgU0NPJ3MgU0lPIGRyaXZlciB3aXRoIEZBUywKKyAgIGFuIGFsdGVybmF0aXZlIGNvbW11bmljYXRpb25zIGRyaXZlciwgbWFkZSB0aGUgcHJvYmxlbSBnbyBhd2F5OgorCisgIFszNzldZnRwOi8vZnRwLmZ1LWJlcmxpbi5kZS9wdWIvdW5peC9kcml2ZXIvZmFzCisKKyAgIFdpdGggcmVnYXJkIHRvIGJpZGlyZWN0aW9uYWwgc2VyaWFsIHBvcnRzIG9uIE9wZW5TZXJ2ZXIgNS4wLjQsIHRoZQorICAgZm9sbG93aW5nIGFkdmljZSBhcHBlYXJlZCBvbiBhbiBTQ08tcmVsYXRlZCBuZXdzZ3JvdXA6CisKKyAgICAgTm8gYW1vdW50IG9mIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgZ29pbmcgdG8gaGVscCB5b3Ugb24KKyAgICAgNS4wLjQgdW5sZXNzIGl0IGluY2x1ZGVzIHRoZSBrbHVkZ2UgZm9yIHRoZSBwcmltYXJ5IHByb2JsZW0uIFdpdGgKKyAgICAgYWxtb3N0IGV2ZXJ5IG1vZGVtLCB0aGUgNS4wLjQgZ2V0dHkgd2lsbCBiYXJmIG1lc3NhZ2VzIGFuZCBtYXkgb3IKKyAgICAgbWF5IG5vdCBjb25uZWN0LiBUaGVyZSBhcmUgMiBzb2x1dGlvbnMgYW5kIG9ubHkgb25lIHdvcmtzIG9uIDUuMC40LgorICAgICBHZXQgdGhlIGF0ZGlhbGVyIGJpbmFyeSBmcm9tIGEgNS4wLjAgc3lzdGVtIGFuZCBzdWJzdGl0dXRlIGl0IGZvcgorICAgICB0aGUgbmF0aXZlIDUuMC40IGF0ZGlhbGVyLiBUaGUgb3RoZXIgc29sdXRpb24gaXMgdG8gdXBncmFkZSB0bworICAgICA1LjAuNS4gQW5kLCBtb3N0IG9mIGFsbCwgb24gYW55IE9wZW5TZXJ2ZXIgcHJvZHVjdHMsIGRvIE5PVCBydW4gdGhlCisgICAgIGJhZGx5IGJyb2tlbiBNb2RlbSBNYW5hZ2VyLiBDb25maWd1cmUgdGhlIG1vZGVtcyBpbiB0aGUgdGltZQorICAgICBob25vcmVkIHdheSB0aGF0IGRhdGVzIGJhY2sgdG8gWGVuaXguCisKKyAgIFVzZSBTQ08tcHJvdmlkZWQgdXRpbGl0aWVzIGZvciBzd2l0Y2hpbmcgdGhlIGRpcmVjdGlvbmFsaXR5IG9mIGEgbW9kZW0KKyAgIGxpbmUsIHN1Y2ggYXMgImVuYWJsZSIgYW5kICJkaXNhYmxlIiBjb21tYW5kcy4gRm9yIGV4YW1wbGUsIHRvIGRpYWwKKyAgIG91dCBvbiB0dHkxYSwgd2hpY2ggaXMgbm9ybWFsbHkgc2V0IHVwIGZvciBsb2dpbnM6CisKKyAgZGlzYWJsZSB0dHkxYQorICBrZXJtaXQgLWwgL2Rldi90dHkxYQorICBlbmFibGUgdHR5MWEKKworICAgSWYgYSB0dHkgZGV2aWNlIGlzIGxpc3RlZCBhcyBhbiBBQ1UgaW4gL3Vzci9saWIvdXVjcC9EZXZpY2VzIGFuZCBpcworICAgZW5hYmxlZCwgZ2V0dHkgcmVzZXRzIHRoZSBvd25lcnNoaXAgYW5kIHBlcm1pc3Npb25zIHRvIHV1Y3AudXVjcCBhbmQKKyAgIDY0MCBldmVyeSB0aW1lIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgZGV2aWNlCisgICBvbmx5IGZvciBkaWFsb3V0LCBhbmQgeW91IHdhbnQgdG8gc3BlY2lmeSBvdGhlciBvd25lcnMgb3IgcGVybWlzc2lvbnMsCisgICB5b3Ugc2hvdWxkIGRpc2FibGUgaXQgaW4gL3Vzci9saWIvdXVjcC9EZXZpY2VzOyB0aGlzIHdpbGwgcHJldmVudAorICAgZ2V0dHkgZnJvbSBkb2luZyB0aGluZ3MgdG8gaXQuIFlvdSBzaG91bGQgYWxzbyBjaGFuZ2VzIHRoZSBkZXZpY2UncworICAgZmlsZSBtb2RlcyBpbiAvZXRjL2NvbmYvbm9kZS5kL3NpbyBieSBjaGFuZ2luZyBmaWVsZHMgNS03IGZvciB0aGUKKyAgIGRlc2lyZWQgZGV2aWNlKHMpOyB0aGlzIGRldGVybWluZXMgaG93IHRoZSBkZXZpY2VzIGFyZSBzZXQgaWYgeW91CisgICByZWxpbmsgdGhlIGtlcm5lbC4KKworICAgT25lIFNDTyB1c2VyIG9mIEMtS2VybWl0IDVBKDE5MCkgcmVwb3J0ZWQgdGhhdCBvbmx5IG9uZSBjb3B5IG9mIEtlcm1pdAorICAgY2FuIHJ1biBhdCBhIHRpbWUgd2hlbiBhIFN0YWxsaW9uIFRlY2hub2xvZ2llcyBtdWx0aXBvcnQgYm9hcmRzIGFyZQorICAgaW5zdGFsbGVkLiBDYXVzZSwgY3VyZSwgYW5kIHByZXNlbnQgc3RhdHVzIHVua25vd24gKHNlZSBbMzgwXVNlY3Rpb24KKyAgIDE0IGZvciBtb3JlIGluZm8gcmVnYXJkaW5nIFN0YWxsaW9uKS4KKworICAgUHJpb3IgdG8gU0NPIE9wZW5TZXJ2ZXIgNS4wLjQsIHRoZSBoaWdoZXN0IHNlcmlhbCBwb3J0IHNwZWVkIHN1cHBvcnRlZAorICAgYnkgU0NPIHdhcyAzODQwMC4gSG93ZXZlciwgaW4gc29tZSBTQ08gdmVyc2lvbnMgKGUuZy4gT1NSNSkgaXQgaXMKKyAgIHBvc3NpYmxlIHRvIG1hcCByYXJlbHktdXNlZCBsb3dlciBzcGVlZHMgKGxpa2UgNjAwIGFuZCAxODAwKSB0byBoaWdoZXIKKyAgIG9uZXMgbGlrZSA1NzYwMCBhbmQgMTE1MjAwLiBUbyBmaW5kIG91dCBob3csIGdvIHRvCisgICBbMzgxXWh0dHA6Ly93d3cuc2NvLmNvbS8gYW5kIHNlYXJjaCBmb3IgIjExNTIwMCIuIEluIE9TUjUuMC40LCBzZXJpYWwKKyAgIHNwZWVkcyB1cCB0byA5MjE2MDAgYXJlIHN1cHBvcnRlZCB0aHJvdWdoIHRoZSBQT1NJWCBpbnRlcmZhY2U7CisgICBDLUtlcm1pdCA2LjEuMTkzIG9yIGxhdGVyLCB3aGVuIGJ1aWx0IGZvciBPU1I1LjAuNCB1c2luZyAvYmluL2NjIChOT1QKKyAgIHRoZSBVREssIHdoaWNoIGhpZGVzIHRoZSBoaWdoLXNwZWVkIGRlZmluaXRpb25zIGZyb20gQ1BQKSwgc3VwcG9ydHMKKyAgIHRoZXNlIHNwZWVkcywgYnV0IHlvdSBtaWdodCBiZSBhYmxlIHRvIHJ1biB0aGlzIGJpbmFyeSBvbiBlYXJsaWVyCisgICByZWxlYXNlcyB0byBnZXQgdGhlIGhpZ2ggc2VyaWFsIHNwZWVkcywgZGVwZW5kaW5nIG9uIHZhcmlvdXMgZmFjdG9ycywKKyAgIGRlc2NyaWJlZCBieSBCZWxhIEx1YmtpbiBvZiBTQ086CisKKyAgU2VyaWFsIHNwZWVkcyB1bmRlciBTQ08gVW5peCAvIE9wZW4gRGVza3RvcCAvIE9wZW5TZXJ2ZXIKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVGhpcmQgcGFydHkgZHJpdmVycyAoaW50ZWxsaWdlbnQgc2VyaWFsIGJvYXJkcykgbWF5IHByb3ZpZGUgYW55IHNwZWVkcworICB0aGV5IGRlc2lyZTsgbW9zdCBzdXBwb3J0IHVwIHRvIDExNS4yS2Jwcy4KKworICBTQ08ncyAic2lvIiBkcml2ZXIsIHdoaWNoIGlzIHVzZWQgdG8gZHJpdmUgc3RhbmRhcmQgc2VyaWFsIHBvcnRzIHdpdGgKKyAgODI1MC8xNjQ1MC8xNjU1MCBhbmQgc2ltaWxhciBVQVJUcywgd2FzIGxpbWl0ZWQgdG8gMzg0MDBicHMgaW4gb2xkZXIKKyAgcmVsZWFzZXMuICBTdXBwb3J0IGZvciByYXRlcyB0aHJvdWdoIDExNS4yS2JwcyB3YXMgYWRkZWQgaW4gdGhlCisgIGZvbGxvd2luZyByZWxlYXNlczoKKworICAgIFNDTyBPcGVuU2VydmVyIFJlbGVhc2UgNS4wLjAgKHJlcXVpcmVzIHN1cHBsZW1lbnQgInJzNDBiIikKKyAgICBTQ08gT3BlblNlcnZlciBSZWxlYXNlIDUuMC4yIChyZXF1aXJlcyBzdXBwbGVtZW50ICJyczQwYSIgb3IgInJzNDBiIikKKyAgICBTQ08gT3BlblNlcnZlciBSZWxlYXNlIDUuMC40IG9yIGxhdGVyCisgICAgU0NPIEludGVybmV0IEZhc3RTdGFydCBSZWxlYXNlIDEuMC4wIG9yIGxhdGVyCisKKyAgIFNDTyBzdXBwbGVtZW50cyBhcmUgYXQgWzM4Ml1mdHA6Ly9mdHAuc2NvLmNvbS87IHRoZSAicnM0MCIgc2VyaWVzIGFyZQorICAgdW5kZXIgZGlyZWN0b3J5IC9TdXBwbGVtZW50cy9pbnRlcm5ldAorCisgICBLZXJtaXQgaW5jbHVkZXMgdGhlIGhpZ2ggc2VyaWFsIHNwZWVkcyBpbiBhbGwgT1NSNSBidWlsZHMsIGJ1dCB0aGF0CisgICBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuIHRoZXkgd29yay4gRm9yIGV4YW1wbGUsIG9uIG91ciBpbi1ob3VzZQorICAgNS4wLjUgc3lzdGVtLCBTRVQgU1BFRUQgNTc2MDAgb3IgaGlnaGVyIHNlZW1zIHRvIHN1Y2NlZWQgKG5vIGVycm9yCisgICBvY2N1cnMpIGJ1dCB3aGVuIHdlIHJlYWQgdGhlIHNwZWVkIGJhY2sgdGhlIGRyaXZlciBzYXlzIGl0IGlzIDUwLgorICAgU2ltaWxhcmx5LCA3NjgwMCBiZWNvbWVzIDc1LCBhbmQgMTE1MjAwIGJlY29tZXMgMTEwLiBUZXN0aW5nIHNob3dzIHRoZQorICAgcmVzdWx0aW5nIHNwZWVkIGlzIGluZGVlZCB0aGUgbG93IG9uZSB3ZSByZWFkIGJhY2ssIG5vdCB0aGUgaGlnaCBvbmUKKyAgIHdlIGFza2VkIGZvci4gTW9yYWw6IFVzZSBzcGVlZHMgaGlnaGVyIHRoYW4gMzg0MDAgd2l0aCBjYXV0aW9uIG9uIFNDTworICAgT1NSNS4KKworICAgUmVwb3J0ZWRseSwgaWYgeW91IGhhdmUgYSBzY3JpcHQgdGhhdCBtYWtlcyBhIFRDUC9JUCBTRVQgSE9TVCAoZS5nLgorICAgVGVsbmV0KSBjb25uZWN0aW9uIHRvIFNDTyAzLjJ2NC4yIHdpdGggVENQL0lQIDEuMi4xLCBhbmQgdGhlbiBkb2VzIHRoZQorICAgZm9sbG93aW5nOgorCisgIHNjcmlwdCAkIGV4aXQKKyAgaGFuZ3VwCisKKyAgIHRoaXMgY2F1c2VzIGEgcHNldWRvdGVybWluYWwgKHB0eSkgdG8gYmUgY29uc3VtZWQgb24gdGhlIFNDTyBzeXN0ZW07CisgICBpZiB5b3UgZG8gaXQgZW5vdWdoIHRpbWVzLCBpdCB3aWxsIHJ1biBvdXQgb2YgcHR5cy4gQW4gImV4aXQiIGNvbW1hbmQKKyAgIGlzIGJlaW5nIHNlbnQgdG8gdGhlIFNDTyBzaGVsbCwgYW5kIGEgSEFOR1VQIGNvbW1hbmQgaXMgZXhlY3V0ZWQKKyAgIGxvY2FsbHksIHNvIHRoZSBjaGFuY2VzIGFyZSBnb29kIHRoYXQgYm90aCBzaWRlcyBhcmUgdHJ5aW5nIHRvIGNsb3NlCisgICB0aGUgY29ubmVjdGlvbiBhdCBvbmNlLCBwZXJoYXBzIGluZHVjaW5nIGEgcmFjZSBjb25kaXRpb24gaW4gd2hpY2ggdGhlCisgICByZW1vdGUgcHR5IGlzIG5vdCByZWxlYXNlZC4gSXQgd2FzIHNwZWN1bGF0ZWQgdGhhdCB0aGlzIHdvdWxkIGJlIGZpeGVkCisgICBieSBhcHBseWluZyBTTFMgbmV0MzgyZSwgYnV0IGl0IGRpZCBub3QuIE1lYW53aGlsZSwgdGhlIHdvcmthcm91bmQgaXMKKyAgIHRvIGluc2VydCBhICJwYXVzZSIgYmV0d2VlbiB0aGUgU0NSSVBUIGFuZCBIQU5HVVAgY29tbWFuZHMuIChUaGUKKyAgIHNpdHVhdGlvbiB3aXRoIGxhdGVyIFNDTyByZWxlYXNlcyBpcyBub3Qga25vd24uKQorCisgICBTQ08gVU5JWCBhbmQgT3BlblNlcnZlciBhbGxvdyB0aGVpciBjb25zb2xlIGFuZC9vciB0ZXJtaW5hbCBkcml2ZXJzIHRvCisgICBiZSBjb25maWd1cmVkIHRvIHRyYW5zbGF0ZSBjaGFyYWN0ZXIgc2V0cyBmb3IgeW91LiBET04nVCBETyBUSElTIFdIRU4KKyAgIFVTSU5HIEtFUk1JVCEgRmlyc3Qgb2YgYWxsLCB5b3UgZG9uJ3QgbmVlZCBpdCAtLSBLZXJtaXQgaXRzZWxmIGFscmVhZHkKKyAgIGRvZXMgdGhpcyBmb3IgeW91LiBBbmQgc2Vjb25kLCBpdCB3aWxsIChhKSBwcm9iYWJseSBydWluIHRoZQorICAgZm9ybWF0dGluZyBvZiB5b3VyIHNjcmVlbnMgKGRlcGVuZGluZyBvbiB3aGljaCBlbXVsYXRpb24geW91IGFyZQorICAgdXNpbmcpOyBhbmQgKGIpIGludGVyZmVyZSB3aXRoIGFsbCBzb3J0cyBvZiBvdGhlciB0aGluZ3MgLS0gbGVnaWJpbGl0eQorICAgb2Ygbm9uLUFTQ0lJIHRleHQgb24gdGhlIHRlcm1pbmFsIHNjcmVlbiwgZmlsZSB0cmFuc2ZlciwgZXRjLiBVc2U6CisKKyAgbWFwY2hhbiAtbgorCisgICB0byB0dXJuIG9mZiB0aGlzIGZlYXR1cmUuCisKKyAgIE5vdGUgdGhhdCB0aGVyZSBpcyBhIG11bHRpdHVkZSBvZiBTQ08gZW50cmllcyBpbiB0aGUgbWFrZWZpbGUsIG1hbnkgb2YKKyAgIHRoZW0gZXhoaWJpdGluZyBhbiB1bnVzdWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGNvbXBpbGVyIG9wdGlvbnMuIFNvbWUKKyAgIHBlb3BsZSBhY3R1YWxseSB1bmRlcnN0YW5kIGFsbCBvZiB0aGlzLiBSZXBvcnRlZGx5LCB0aGluZ3MgYXJlCisgICBzZXR0bGluZyBkb3duIHdpdGggU0NPIE9wZW5TZXJ2ZXIgNS54IGFuZCBVbml4d2FyZSA3IChhbmQgT3BlbiBVTklYIDgKKyAgIGFuZCB3aG8ga25vd3Mgd2hhdCB0aGUgbmV4dCBvbmUgd2lsbCBiZSAtLSBMaW51eCBwcm9iYWJseSkgLS0gdGhlIFNDTworICAgVURLIGNvbXBpbGVyIGlzIHNhaWQgdG8gZ2VuZXJhdGUgYmluYXJpZXMgdGhhdCB3aWxsIHJ1biBvbiBlaXRoZXIKKyAgIHBsYXRmb3JtLCBieSBkZWZhdWx0LCBhdXRvbWF0aWNhbGx5LiBXaGVuIHVzaW5nIGdjYyBvciBlZ2NzLCBvbiB0aGUKKyAgIG90aGVyIGhhbmQsIGRpZmZlcmVuY2VzIHBlcnNpc3QsIHBsdXMgaXNzdWVzIHJlZ2FyZGluZyB0aGUgdHlwZSBvZgorICAgYmluYXJ5IHRoYXQgaXMgZ2VuZXJhdGVkIChDT0ZGLCBFTEYsIGV0YyksIGFuZCB3aGVyZSBhbmQgaG93IGl0IGNhbgorICAgcnVuLiBBbGwgb2YgdGhpcyBjb3VsZCBzdGFuZCBmdXJ0aGVyIGNsYXJpZmljYXRpb24gYnkgU0NPIGV4cGVydHMuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy42LjMuIFVuaXh3YXJlCisKKyAgIFsgWzM4M11Ub3AgXSBbIFszODRdQ29udGVudHMgXSBbIFszODVdU2VjdGlvbiBDb250ZW50cyBdIFsgWzM4Nl1OZXh0IF0KKyAgIFsgWzM4N11QcmV2aW91cyBdCisKKyAgIFVuaXh3YXJlIGNoYW5nZWQgaGFuZHMgc2V2ZXJhbCB0aW1lcyBiZWZvcmUgbGFuZGluZyBhdCBTQ08sIGFuZCBzbyBoYXMKKyAgIGl0cyBbMzg4XW93biBzZWN0aW9uIGluIHRoaXMgZG9jdW1lbnQuIChCcmllZmx5OiBBVCZUIFVOSVggU3lzdGVtcworICAgTGFib3JhdG9yaWVzIHNvbGQgdGhlIHJpZ2h0cyB0byB0aGUgVU5JWCBuYW1lIGFuZCB0byBTeXN0ZW0gViBSNCAob3IKKyAgIFI1PykgdG8gTm92ZWxsOyBsYXRlciBOb3ZlbGwgc3B1biBpdHMgVU5JWCBkaXZpc2lvbiBvZmYgaW50byBhIG5ldworICAgY29tcGFueSBjYWxsZWQgVW5pdmVsLCB3aGljaCBldmVudHVhbGx5IHdhcyBib3VnaHQgYnkgU0NPLCB3aGljaCBsYXRlcgorICAgd2FzIGJvdWdodCBieSBDYWxkZXJhLCB3aGljaCBsYXRlciBzb3J0IG9mIHNlbWktc3B1bi1vZmYgU0NPLi4uKQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuNi40LiBPcGVuIFVOSVggOAorCisgICBbIFszODldVG9wIF0gWyBbMzkwXUNvbnRlbnRzIF0gWyBbMzkxXVNlY3Rpb24gQ29udGVudHMgXSBbCisgICBbMzkyXVByZXZpb3VzIF0KKworICAgU0NPIHdhcyBib3VnaHQgYnkgQ2FsZGVyYSBpbiAyMDAwIG9yIDIwMDEgYW5kIGV2b2x2ZWQgVW5peHdhcmUgNy4xCisgICBpbnRvIENhbGRlcmEgT3BlbiBVTklYIDguMDAuIEl0J3MganVzdCBsaWtlIFVuaXh3YXJlIDcuMSBhcyBmYXIgYXMKKyAgIEtlcm1pdCBpcyBjb25jZXJuZWQgKHRoZSBVbml4d2FyZSA3LjEgbWFrZWZpbGUgdGFyZ2V0IHdvcmtzIGZvciBPcGVuCisgICBVTklYIDguMDAsIGFuZCBpbiBmYWN0IGEgVW5peHdhcmUgNy4xIEtlcm1pdCBiaW5hcnkgYnVpbHQgb24gVW5peHdhcmUKKyAgIDcuMSBydW5zIHVuZGVyIE9VODsgYSBzZXBhcmF0ZSBPVTggbWFrZWZpbGUgdGFyZ2V0IGV4aXN0cyBzaW1wbHkgdG8KKyAgIGdlbmVyYXRlIGFuIGFwcHJvcHJpYXRlIHByb2dyYW0gc3RhcnR1cCBoZXJhbGQpLiBPcGVuIFVuaXggaXMgbm93CisgICBkZWZ1bmN0OyBzdWJzZXF1ZW50IHJlbGVhc2VzIGFyZSBjYWxsZWQgVW5peFdhcmUgYWdhaW4gKGUuZy4gVW5peFdhcmUKKyAgIDcuMS4zKS4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjcuIEMtS0VSTUlUIEFORCBTT0xBUklTCisKKyAgIFsgWzM5M11Ub3AgXSBbIFszOTRdQ29udGVudHMgXSBbIFszOTVdU2VjdGlvbiBDb250ZW50cyBdIFsgWzM5Nl1OZXh0IF0KKyAgIFsgWzM5N11QcmV2aW91cyBdCisKKyAgIFNFQ1RJT04gQ09OVEVOVFMKKworMy43LjEuIFszOThdU2VyaWFsIFBvcnQgQ29uZmlndXJhdGlvbgorMy43LjIuIFszOTldU2VyaWFsIFBvcnQgUHJvYmxlbXMKKzMuNy4zLiBbNDAwXVN1bkxpbmsgWC4yNQorMy43LjQuIFs0MDFdU3VuIFdvcmtzdGF0aW9uIEtleWJvYXJkIE1hcHBpbmcKKzMuNy41LiBbNDAyXVNvbGFyaXMgMi40IGFuZCBFYXJsaWVyCisKKyAgIFJFRkVSRU5DRVMKKworICAgICAqIFRoZSBbNDAzXWNvbXAudW5peC5zb2xhcmlzIG5ld3Nncm91cAorICAgICAqIFs0MDRdaHR0cDovL2FjY2VzczEuc3VuLmNvbS8KKyAgICAgKiBbNDA1XWh0dHA6Ly9kb2NzLnN1bi5jb20vCisgICAgICogWzQwNl1odHRwOi8vd3d3LnN1bmhlbHAuY29tLworICAgICAqIFs0MDddaHR0cDovL3d3dy53aW5zLnV2YS5ubC9wdWIvc29sYXJpcy9zb2xhcmlzMi8KKyAgICAgKiBbNDA4XWh0dHA6Ly93d3cud2lucy51dmEubmwvY2dpLWJpbi9zZmFxLmNnaQorICAgICAqIFs0MDldZnRwOi8vZnRwLndpbnMudXZhLm5sL3B1Yi9zb2xhcmlzCisgICAgICogWzQxMF1odHRwOi8vd3d3LnNjaWVuY2UudXZhLm5sL3B1Yi9zb2xhcmlzL3NvbGFyaXMyLmh0bWwKKworICAgQW5kIGFib3V0IHNlcmlhbCBjb21tdW5pY2F0aW9ucyBpbiBwYXJ0aWN1bGFyLCBzZWUgIkNlbGVzdGUncyBUdXRvcmlhbAorICAgb24gU29sYXJpcyAyLnggTW9kZW1zIGFuZCBUZXJtaW5hbHMiOgorCisgIFs0MTFdaHR0cDovL3d3dy5zdG9rZWx5LmNvbS8KKworICAgSW4gcGFydGljdWxhcjoKKworICBbNDEyXWh0dHA6Ly93d3cuc3Rva2VseS5jb20vdW5peC5zeXNhZG0ucmVzb3VyY2VzL2ZhcXMuc3VuLmh0bWwKKworICAgRm9yIFBDLWJhc2VkIFNvbGFyaXMsIGFsc28gc2VlIGdlbmVyYWwgY29tbWVudHMgb24gUEMtYmFzZWQgVW5peGVzIGluCisgICBbNDEzXVNlY3Rpb24gMy4wLiBEb24ndCBleHBlY3QgU29sYXJpcyBvciBhbnkgb3RoZXIga2luZCBvZiBVbml4IHRvCisgICB3b3JrIHJpZ2h0IG9uIGEgUEMgdW50aWwgeW91IHJlc29sdmUgYWxsIGludGVycnVwdCBjb25mbGljdHMuIERvbid0CisgICBleHBlY3QgdG8gYmUgYWJsZSB0byB1c2UgQ09NMyBvciBDT000IChvciBldmVuIENPTTIpIHVudGlsIHlvdSBoYXZlCisgICBjb25maWd1cmVkIHRoZWlyIGFkZHJlc3NlcyBhbmQgaW50ZXJydXB0cy4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjcuMS4gU2VyaWFsIFBvcnQgQ29uZmlndXJhdGlvbgorCisgICBbIFs0MTRdVG9wIF0gWyBbNDE1XUNvbnRlbnRzIF0gWyBbNDE2XVNlY3Rpb24gQ29udGVudHMgXSBbCisgICBbNDE3XVNlY3Rpb24gQ29udGVudHMgXSBbIFs0MThdTmV4dCBdCisKKyAgIFlvdXIgc2VyaWFsIHBvcnQgY2FuJ3QgYmUgdXNlZCAtLSBvciBhdCBsZWFzdCB3b24ndCB3b3JrIHJpZ2h0IC0tCisgICB1bnRpbCBpdCBpcyBlbmFibGVkIGluIFNvbGFyaXMuIEZvciBleGFtcGxlLCB5b3UgZ2V0IGEgbWVzc2FnZSBsaWtlCisgICAiU0VSSUFMOiBPcGVyYXRpb24gd291bGQgYmxvY2siIHdoZW4gYXR0ZW1wdGluZyB0byBkaWFsLiBUaGlzIHByb2JhYmx5CisgICBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VyaWFsIHBvcnQgaGFzIG5vdCBiZWVuIGVuYWJsZWQgZm9yIHVzZSB3aXRoCisgICBtb2RlbXMuIFlvdSdsbCBuZWVkIHRvIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHlvdXIgc3lzdGVtIHNldHVwIG9yCisgICBtYW5hZ2VtZW50IG1hbnVhbCwgc3VjaCBhcyAoZS5nLikgdGhlIERlc2t0b3AgU1BBUkMgU3VuIFN5c3RlbSAmCisgICBOZXR3b3JrIE1hbmFnZXIncyBHdWlkZSwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gYSBzZWN0aW9uICJTZXR0aW5nIHVwCisgICBNb2RlbSBTb2Z0d2FyZSI7IHJlYWQgaXQgYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zLiBUaGVzZSBtaWdodCAob3IKKyAgIG1pZ2h0IG5vdCkgaW5jbHVkZSBydW5uaW5nIGEgcHJvZ3JhbSBjYWxsZWQgImVlcHJvbSIsIGVkaXRpbmcgc29tZQorICAgc3lzdGVtIGNvbmZpZ3VyYXRpb24gZmlsZSAoc3VjaCBhcywgZm9yIGV4YW1wbGU6CisKKyAgL3BsYXRmb3JtL2k4NnBjL2tlcm5lbC9kcnYvYXN5LmNvbmYKKworICAgYW5kIHRoZW4gZG9pbmcgYSBjb25maWd1cmF0aW9uIHJlYm9vdCwgb3IgcnVubmluZyBzb21lIG90aGVyIHByb2dyYW1zCisgICBsaWtlIGRydmNvbmZpZyBhbmQgZGV2bGlua3MuICJtYW4gZWVwcm9tIiBmb3IgZGV0YWlscy4KKworICAgQWxzbywgb24gY2VydGFpbiBTdW4gbW9kZWxzIGxpa2UgSVBDLCB0aGUgc2VyaWFsIHBvcnQgaGFyZHdhcmUgbWlnaHQKKyAgIG5lZWQgdG8gaGF2ZSBhIGp1bXBlciBjaGFuZ2VkIHRvIG1ha2UgaXQgYW4gUlMtMjMyIHBvcnQgcmF0aGVyIHRoYW4KKyAgIFJTLTQyMy4KKworICAgZWVwcm9tIGFwcGxpZXMgb25seSB0byByZWFsIHNlcmlhbCBwb3J0cywgbm90IHRvICJTcGlmZiIgZGV2aWNlcworICAgKHNlcmlhbCBwb3J0IGV4cGFuZGVyKSwgaW4gd2hpY2ggY2FzZSBzZXR1cCB3aXRoIFNvbGFyaXMnIGFkbWludG9vbCBpcworICAgcmVxdWlyZWQuCisKKyAgIEFub3RoZXIgY29tbWFuZCB5b3UgbWlnaHQgbmVlZCB0byB1c2UgaXMgcG1hZG0sIGUuZy46CisKKyAgcG1hZG0gLWQgLXAgenNtb24gLXMgdHR5MworICBwbWFkbSAtZSAtcCB6c21vbiAtcyB0dHkzCisKKyAgIFlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB0byBjaGVjayBpZiBhIHByb2Nlc3MgaGFzIHRoZSBkZXZpY2UKKyAgIG9wZW46CisKKyAgZnVzZXIgLWYgL2Rldi90ZXJtLzMKKworICAgSW4gc29tZSBjYXNlcywgaG93ZXZlciAoYWNjb3JkaW5nIHRvIFN1biBzdXBwb3J0LCBNYXkgMjAwMSkgIkl0IGlzCisgICBzdGlsbCBwb3NzaWJsZSB0aGF0IGEgem9tYmllIHByb2Nlc3MgaGFzIGhvbGQgb2YgdGhlIHBvcnQgRVZFTiBJRgorICAgdGhlcmUgaXMgbm8gbG9jayBmaWxlIGFuZCB0aGUgZnVzZXIgY29tbWFuZCBjb21lcyB1cCBlbXB0eS4gSW4gdGhhdAorICAgY2FzZSwgdGhlIG9ubHkgd2F5IHRvIHJlc29sdmUgdGhlIHByb2JsZW0gaXMgYnkgcmVib290aW5nLiIKKworICAgSWYgeW91IGNhbid0IGVzdGFibGlzaCBjb21tdW5pY2F0aW9uIHRocm91Z2ggYSBzZXJpYWwgcG9ydCB0byBhIGRldmljZQorICAgdGhhdCBpcyBub3QgYXNzZXJ0aW5nIENEIChDYXJyaWVyIERldGVjdCksIHRyeSBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudAorICAgdmFyaWFibGUgInR0eWEtaWdub3JlLWNkIiB0byAidHJ1ZSIgKHJlcGxhY2UgInR0eWEiIHdpdGggdGhlIHBvcnQKKyAgIG5hbWUpLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuNy4yLiBTZXJpYWwgUG9ydCBQcm9ibGVtcworCisgICBbIFs0MTldVG9wIF0gWyBbNDIwXUNvbnRlbnRzIF0gWyBbNDIxXVNlY3Rpb24gQ29udGVudHMgXSBbIFs0MjJdTmV4dCBdCisgICBbIFs0MjNdUHJldmlvdXMgXQorCisgICBDdXJyZW50IGFkdmljZSBmcm9tIFN1biBpcyB0byBhbHdheXMgdGhlIC9kZXYvY3VhL3ggZGV2aWNlcyBmb3IKKyAgIGRpYWxpbmcgb3V0LCByYXRoZXIgdGhhbiB0aGUgL2Rldi90ZXJtL3guIE5ldmVydGhlbGVzcywgaWYgeW91IGhhdmUKKyAgIHRyb3VibGUgZGlhbGluZyBvdXQgd2l0aCBvbmUsIHRyeSB0aGUgb3RoZXIuCisKKyAgIFJlcG9ydGVkbHksIGlmIHlvdSBzdGFydCBDLUtlcm1pdCBhbmQgInNldCBsaW5lIiB0byBhIHBvcnQgdGhhdCBoYXMgYQorICAgbW9kZW0gY29ubmVjdGVkIHRvIGl0IHRoYXQgaXMgbm90IHR1cm5lZCBvbiwgYW5kIHRoZW4gInNldCBmbG93CisgICBydHMvY3RzIiwgdGhlcmUgbWlnaHQgYmUgc29tZSAodW5zcGVjaWZpZWQpIGRpZmZpY3VsdGllcyBjbG9zaW5nIHRoZQorICAgZGV2aWNlIGJlY2F1c2UgdGhlIENUUyBzaWduYWwgaXMgbm90IGNvbWluZyBpbiBmcm9tIHRoZSBtb2RlbS4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjcuMy4gU3VuTGluayBYLjI1CisKKyAgIFsgWzQyNF1Ub3AgXSBbIFs0MjVdQ29udGVudHMgXSBbIFs0MjZdU2VjdGlvbiBDb250ZW50cyBdIFsgWzQyN11OZXh0IF0KKyAgIFsgWzQyOF1QcmV2aW91cyBdCisKKyAgIFRoZSBidWlsdC1pbiBTdW5MaW5rIFguMjUgc3VwcG9ydCBmb3IgU29sYXJpcyAyLjMvMi40Li8yNSBhbmQgU3VuTGluaworICAgOC4wMSBvciA5LjAwIHdvcmtzIE9LIHByb3ZpZGVkIHRoZSBYLjI1IHN5c3RlbSBoYXMgYmVlbiBpbnN0YWxsZWQgYW5kCisgICBpbml0aWFsaXplZCBwcm9wZXJseS4gUGFja2V0IHNpemVzIG1pZ2h0IG5lZWQgdG8gYmUgcmVkdWNlZCB0byAyNTYsCisgICBtYXliZSBldmVuIGxlc3MsIGRlcGVuZGluZyBvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgWC4yNQorICAgaW5zdGFsbGF0aW9uLiBPbiBvbmUgY29ubmVjdGlvbiB3aGVyZSBDLUtlcm1pdCA2LjAgd2FzIHRlc3RlZCwgdmVyeQorICAgbGFyZ2UgcGFja2V0cyBhbmQgd2luZG93IHNpemVzIGNvdWxkIGJlIHVzZWQgaW4gb25lIGRpcmVjdGlvbiwgYnV0CisgICBvbmx5IHZlcnkgc21hbGwgb25lcyB3b3VsZCB3b3JrIGluIHRoZSBvdGhlci4KKworICAgSW4gYW55IGNhc2UsIGFjY29yZGluZyB0byBTdW4sIEMtS2VybWl0J3MgWC4yNSBzdXBwb3J0IGlzIHN1cGVyZmx1b3VzCisgICB3aXRoIFN1bkxpbmsgOC54IC8gU29sYXJpcyAyLjMuIFF1b3RpbmcgYW4gYW5vbnltb3VzIFN1biBlbmdpbmVlcjoKKworICAgICAuLi4gdGhlcmUgaXMgbm93IG5vIG5lZWQgdG8gaW5jbHVkZSBhbnkgWC4yNSBjb2RlIHdpdGhpbiBrZXJtaXQuIEFzCisgICAgIG9mIFguMjUgOC4wLjEgd2Ugc3VwcG9ydCB0aGUgdXNlIG9mIGtlcm1pdCwgdXVjcCBhbmQgc2ltaWxhcgorICAgICBwcm90b2NvbHMgb3ZlciBkZXZpY2VzIG9mIHR5cGUgL2Rldi94dHkuIFRoaXMgZmFjaWxpdHkgd2FzIHRoZXJlIGluCisgICAgIDguMCwgYW5kIHNob3VsZCBhbHNvIHdvcmsgb24gdGhlIDguMCByZWxlYXNlIGlmIHBhdGNoIDEwMTUyNCBpcworICAgICBhcHBsaWVkLCBidXQgSSdtIG5vdCAxMDAlIHN1cmUgaXQgd2lsbCB3b3JrIGluIGFsbCBjYXNlcywgd2hpY2ggaXMKKyAgICAgd2h5IHdlIG9ubHkgY2xhaW0gc3VwcG9ydCBmcm9tIDguMC4xIG9ud2FyZHMuCisKKyAgICAgV2hlbiBjb25maWd1cmluZyBYLjI1LCBvbiB0aGUgIkFkdmFuY2VkIENvbmZpZ3VyYXRpb24tPlBhcmFtZXRlcnMiCisgICAgIHNjcmVlbiBvZiB0aGUgeDI1dG9vbCB5b3UgY2FuIHNlbGVjdCBhIG51bWJlciBvZiBYVFkgZGV2aWNlcy4gSWYKKyAgICAgeW91IHNldCB0aGlzIHRvIGJlID4gMSwgcHJlc3MgQXBwbHksIGFuZCByZWJvb3QsIHlvdSB3aWxsIGdldCBhCisgICAgIG51bWJlciBvZiAvZGV2L3h0eSBlbnRyaWVzIGNyZWF0ZWQuCisKKyAgICAgSWdub3JlIC9kZXYveHR5MCwgaXQgaXMgYSBzcGVjaWFsIGNhc2UuIEFsbCB0aGUgb3RoZXJzIGNhbiBiZSB1c2VkCisgICAgIGV4YWN0bHkgYXMgaWYgdGhleSB3ZXJlIGEgc2VyaWFsIGxpbmUgKGUuZy4gL2Rldi90dHkpIGNvbm5lY3RlZCB0bworICAgICBhIG1vZGVtLCBleGNlcHQgdGhhdCBpbnN0ZWFkIG9mIHVzaW5nIEhheWVzLXN0eWxlIGNvbW1hbmRzLCB5b3UgdXNlCisgICAgIFBBRCBjb21tYW5kcy4KKworICAgICBGcm9tIGtlcm1pdCB5b3UgY2FuIGRvIGEgJ3NldCBsaW5lJyBjb21tYW5kIHRvLCBzYXksIC9kZXYveHR5MSwKKyAgICAgdGhlbiBzZXQgeW91ciBkaWFsaW5nIGNvbW1hbmQgdG8gYmUgIkNBTEwgMTIzNDU2NzgiLCBldGMuIEFsbCB0aGUKKyAgICAgdXN1YWwgUEFEIGNvbW1hbmRzIHdpbGwgd29yayAoU0VULCBQQVIsIGV0YykuCisKKyAgICAgSSBrbm93IG9mIG9uZSBjdXN0b21lciBpbiBBdXN0cmFsaWEgd2hvIGlzIHN1Y2Nlc3NmdWxseSB1c2luZyB0aGlzLAorICAgICB3aXRoIGtlcm1pdCBzY3JpcHRzLCB0byBtYW5hZ2Ugc29tZSBYLjI1LWNvbm5lY3RlZCBzd2l0Y2hlcy4gSGUKKyAgICAgdXNlZCBzdGFuZGFyZCBrZXJtaXQsIGNvbXBpbGVkIGZvciBTb2xhcmlzIDIsIHdpdGggWC4yNSA4LjAgeHR5CisgICAgIGRldmljZXMuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy43LjQuIFN1biBXb3Jrc3RhdGlvbiBLZXlib2FyZCBNYXBwaW5nCisKKyAgIFsgWzQyOV1Ub3AgXSBbIFs0MzBdQ29udGVudHMgXSBbIFs0MzFdU2VjdGlvbiBDb250ZW50cyBdIFsgWzQzMl1OZXh0IF0KKyAgIFsgWzQzM11QcmV2aW91cyBdCisKKyAgIEhpbnRzIGZvciB1c2luZyBhIFN1biB3b3Jrc3RhdGlvbiBrZXlib2FyZCBmb3IgVlQgZW11bGF0aW9uIHdoZW4KKyAgIGFjY2Vzc2luZyBWTVMsIGZyb20gdGhlIFs0MzRdY29tcC5vcy52bXMgbmV3c2dyb3VwOgorCisgICAgIEZyb206IEplcnJ5IExlaWNodGVyIDxsZWljaHRlckBzbWFydHMuY29tPgorICAgICBOZXdzZ3JvdXBzOiBjb21wLm9zLnZtcworICAgICBTdWJqZWN0OiBSZTogVlQxMDAga2V5Ym9hcmQgbWFwcGluZyB0byBTdW4gWCBzZXJ2ZXIKKyAgICAgRGF0ZTogTW9uLCAxOSBBdWcgMTk5NiAxMjo0NDoyMSAtMDQwMAorCisgICAgID4gSSBhbSBzdHVjayByaWdodCBub3cgdXNpbmcgYSBTdW4ga2V5Ym9hcmQgKHR5cGUgNSkgb24gc3lzdGVtcworICAgICBydW5uaW5nIFN1bk9TCisgICAgID4gYW5kIFNvbGFyaXMuIEkgd291bGQgbGlrZSB0byB1c2UgRVZFIG9uIGFuIE9wZW5WTVMgYm94IHdpdGgKKyAgICAgZGlzcGxheSBiYWNrIHRvCisgICAgID4gdGhlIFN1bi4gRG9lcyBhbnlvbmUga25vdyBvZiBhIGtleWJvYXJkIG1hcHBpbmcgKG9yIHNvbWUgb3RoZXIKKyAgICAgcHJvY2VkdXJlKQorICAgICA+IHdoaWNoIHdpbGwgYWxsb3cgdGhlIFN1biBrZXlib2FyZCB0byBhcHByb3hpbWF0ZSBhIFZUMTAwL1ZUMjIwPworCisgICAgIFlvdSBjYW4ndCBnZXQgaXQgZXhhY3RseSAtIGJlY2F1c2UgdGhlIGtleXBhZCBoYXMgb25lIGZld2VyIGtleSAtCisgICAgIGJ1dCB5b3UgY2FuIGNvbWUgcHJldHR5IGNsb3NlLiBIZXJlJ3MgYSBzZXQgb2Yga2V5ZGVmcyBJIHVzZToKKworICBrZXljb2RlIDEwMT1LUF8wCisgIGtleWNvZGUgMTE5PUtQXzEKKyAga2V5Y29kZSAxMjA9S1BfMgorICBrZXljb2RlIDEyMT1LUF8zCisgIGtleWNvZGUgOTg9S1BfNAorICBrZXljb2RlIDk5PUtQXzUKKyAga2V5Y29kZSAxMDA9S1BfNgorICBrZXljb2RlIDc1PUtQXzcKKyAga2V5Y29kZSA3Nj1LUF84CisgIGtleWNvZGUgNzc9S1BfOQorICBrZXljb2RlIDUyPUtQX0YxCisgIGtleWNvZGUgNTM9S1BfRjIKKyAga2V5Y29kZSA1ND1LUF9GMworICBrZXljb2RlIDU3PUtQX0RlY2ltYWwKKyAga2V5Y29kZSAyOD1MZWZ0CisgIGtleWNvZGUgMjk9UmlnaHQKKyAga2V5Y29kZSAzMD1LUF9TZXBhcmF0b3IKKyAga2V5Y29kZSAxMDU9S1BfRjQKKyAga2V5Y29kZSA3OD1LUF9TdWJ0cmFjdAorICBrZXljb2RlIDg9TGVmdAorICBrZXljb2RlIDEwPVJpZ2h0CisgIGtleWNvZGUgMzI9VXAKKyAga2V5Y29kZSAzMz1Eb3duCisgIGtleWNvZGUgOTc9S1BfRW50ZXIKKworICAgICBQdXQgdGhpcyBpbiBhIGZpbGUgLSBJIHVzZSAia2V5ZGVmcyIgaW4gbXkgaG9tZSBkaXJlY3RvcnkgYW5kIGZlZWQKKyAgICAgaXQgaW50byB4bW9kbWFwOgorCisgIHhtb2RtYXAgLSA8JEhPTUUva2V5ZGVmcworCisgICAgIFRoaXMgdGFrZXMgY2FyZSBvZiB0aGUgYXJyb3cga2V5cyBhbmQgdGhlICJjYWxjdWxhdG9yIiBrZXkgY2x1c3Rlci4KKyAgICAgVGhlICIrIiBrZXkgd2lsbCBwbGF5IHRoZSByb2xlIG9mIHRoZSBERUMgIiwiIGtleS4gVGhlIFN1biAiLSIga2V5CisgICAgIHdpbGwgYmUgbGlrZSB0aGUgREVDICItIiBrZXksIHRob3VnaCBpdCdzIGluIGEgcGh5c2ljYWxseSBkaWZmZXJlbnQKKyAgICAgcG9zaXRpb24gLSB3aGVyZSB0aGUgREVDIFBGNCBrZXkgaXMuIFRoZSBQRjQga2V5IGlzIC4uLiBkYW1uLCBJJ20KKyAgICAgbm90IHN1cmUgd2hlcmUgImtleSAxMDUiIGlzLiBJICp0aGluayogaXQgbWF5IGJlIG9uIHRoZSBsZWZ0bW9zdAorICAgICBrZXkgb2YgdGhlIGdyb3VwIG9mIGZvdXIganVzdCBhYm92ZSB0aGUgImNhbGN1bGF0b3IiIGtleSBjbHVzdGVyLgorCisgICAgIEkgYWxzbyBleGVjdXRlIHRoZSBmb2xsb3dpbmcgKHRoaXMgaXMgYWxsIGluIG15IHhpbml0cmMgZmlsZSk6CisKKyAgeG1vZG1hcCAtZSAna2V5c3ltIEtQX0RlY2ltYWwgPSBLUF9EZWNpbWFsJworICB4bW9kbWFwIC1lICdrZXlzeW0gQmFja1NwYWNlID0gRGVsZXRlIEJhY2tTcGFjZScgXAorICAgICAgICAgIC1lICdrZXlzeW0gRGVsZXRlID0gQmFja1NwYWNlIERlbGV0ZScKKyAgeG1vZG1hcCAtZSAna2V5c3ltIEtQX0RlY2ltYWwgPSBEZWxldGUgRGVsZXRlIEtQX0RlY2ltYWwnCisgIHhtb2RtYXAgLWUgJ2FkZCBtb2QxID0gTWV0YV9SJworICB4bW9kbWFwIC1lICdhZGQgbW9kMSA9IE1ldGFfTCcKKworICAgICBCZXdhcmUgb2Ygb25lIHRoaW5nIGFib3V0IHhtb2RtYXA6IEtleW1hcCBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRvCisgICAgIHRoZSAqd2hvbGUgd29ya3N0YXRpb24qLCBub3QganVzdCB0byBpbmRpdmlkdWFsIHdpbmRvd3MuIFRoZXJlIGlzLAorICAgICBpbiBmYWN0LCBubyB3YXkgSSBrbm93IG9mIHRvIGFwcGx5IHRoZW0gdG8gaW5kaXZpZHVhbCB3aW5kb3dzLgorICAgICBUaGVzZSBkZWZpbml0aW9ucyAqbWF5KiBjb25mdXNlIHNvbWUgVW5peCBwcm9ncmFtcyAoYW5kL29yIHNvbWUKKyAgICAgVW5peCB1c2VycykuCisKKyAgICAgSWYgeW91J3JlIHVzaW5nIE1vdGlmLCB5b3UgbWF5IGFsc28gbmVlZCB0byBhcHBseSBiaW5kaW5ncyBhdCB0aGUKKyAgICAgTW90aWYgbGV2ZWwuIElmIGp1c3QgdXNpbmcgeG1vZG1hcCBkb2Vzbid0IHdvcmssIEkgY2FuIHRyeSBhbmQgZGlnCisgICAgIHRoYXQgc3R1ZmYgdXAgZm9yIHlvdS4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjcuNS4gU29sYXJpcyBQUFAgQ29ubmVjdGlvbnMKKworICAgWyBbNDM1XVRvcCBdIFsgWzQzNl1Db250ZW50cyBdIFsgWzQzN11TZWN0aW9uIENvbnRlbnRzIF0gWyBbNDM4XU5leHQgXQorICAgWyBbNDM5XVByZXZpb3VzIF0KKworICAgVGhlIGZvbGxvd2luZyBpcyBhIHJlcG9ydCBmcm9tIGEgdXNlciBvZiBDLUtlcm1pdCA4LjAgb24gU29sYXJpcyA4IGFuZAorICAgOSwgd2hvIGhhZCBjb21wbGFpbmVkIHRoYXQgd2hpbGUgS2VybWl0IGZpbGUgdHJhbnNmZXJzIHdvcmtlZAorICAgcGVyZmVjdGx5IG9uIGRpcmVjdCAobm9uLVBQUCkgZGlhbG91dCBjb25uZWN0aW9ucywgdGhleSBmYWlsZWQKKyAgIG1pc2VyYWJseSBvbiBQUFAgY29ubmVjdGlvbnMuIFdlIHN1Z2dlc3RlZCB0aGF0IHRoZSBQUFAgZGlhbGVyCisgICBwcm9iYWJseSB3YXMgbm90IHNldHRpbmcgdGhlIHBvcnQgYW5kL29yIG1vZGVtIHVwIGluIHRoZSBzYW1lIHdheSB0aGF0CisgICBLZXJtaXQgZGlkOgorCisgICAgIEkgd2FudCB0byBnZXQgYmFjayBvbiB0aGlzIGFuZCB0ZWxsIHlvdSB3aGF0IHRoZSByZXNvbHV0aW9uIHdhcy4KKyAgICAgWW91IHBvaW50ZWQgbWUgaW4gdGhlIGRpcmVjdGlvbiBvZiBmbG93IGNvbnRyb2wsIHdoaWNoIHR1cm5lZCBvdXQKKyAgICAgdG8gYmUgdGhlIGtleS4KKworICAgICBTb21lIGRpc2N1c3Npb24gb24gdGhlIGNvbXAudW5peC5zb2xhcmlzIG5ld3Nncm91cCBsZWQgdG8gc29tZQorICAgICBjb21tZW50cyBmcm9tIEdyZWcgQW5kcmV3cyBhYm91dCB0aGUgbmVlZCB0byB1c2UgdGhlIHV1Y3AgZHJpdmVyIHRvCisgICAgIHRhbGsgdG8gdGhlIG1vZGVtICgvZGV2L2N1YS9hKS4gSSBoYWQgdG8gcmVtaW5kIEdyZWcgdGhhdCBubyBtYXR0ZXIKKyAgICAgd2hhdCB0aGUgbWFucGFnZXMgZm9yIHRoZSB6cyBhbmQgc2UgZHJpdmVycyBzYXksIHRoZSBwcHAgdGhhdCBTdW4KKyAgICAgcmVsZWFzZWQgd2l0aCBTb2xhcmlzIDggNy8wMSwgYW5kIGhhcyBpbiBTb2xhcmlzIDksIGlzIGEgc2V0dWlkCisgICAgIHJvb3QgcHJvZ3JhbSwgYW5kIHNpbXBseSB0cnlpbmcgdG8gbWFrZSBhIHBwcGQgY2FsbCBmcm9tIHVzZXIgc3BhY2UKKyAgICAgc3BlY2lmeWluZyAvZGV2L2N1YS9hIHdvdWxkIGZhaWwgYmVjYXVzZSBvZiBwZXJtaXNzaW9ucy4gR3JlZworICAgICBmaW5hbGx5IHB1dCB0aGUgcXVlc3Rpb24gdG8gdGhlIHBwcCBwZW9wbGUsIHdobyBjYW1lIGJhY2sgd2l0aAorICAgICBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBsYWlkIG91dCBhbnl3aGVyZSBpbiB0aGUgZG9jcyBhdmFpbGFibGUgZm9yCisgICAgIFNvbGFyaXMgdXNlcnMuIE5hbWVseSwgcHV0IC9kZXYvY3VhL2EgaW4gb25lIG9mIHRoZSBwcml2aWxlZGdlZAorICAgICBvcHRpb25zIGZpbGVzIGluIHRoZSAvZXRjL3BwcCBkaXJlY3RvcnkuIFRoYXQsIHBsdXMgcmVzZXR0aW5nIHRoZQorICAgICBPQlAgdHR5YS1pZ25vcmUtY2QgZmxhZyAodGhpcyBpcyBTdW4gaGFyZHdhcmUpIHRvIGZhbHNlLCBzZWVtcyB0bworICAgICBoYXZlIHNvbHZlZCB0aGUgcHJvYmxlbXMuCisKKyAgICAgV2hpbGUgSSBub3RlIHRoYXQgSSBoYWQgaW5zdGFsbGVkIEtlcm1pdCBzdWlkIHRvIHV1Y3AgdG8gdXNlCisgICAgIC9kZXYvY3VhL2Egb24gdGhpcyBwYXJ0aWN1bGFyIGJveCwgaXQgc2VlbXMgdG8gcnVuIGZpbmUgdGhyb3VnaAorICAgICAvZGV2L3Rlcm0vYS4gTm90IHNvIHdpdGggcHBwZC4KKworICAgICBXaXRoIHRoaXMgY2hhbmdlIGluIHBsYWNlLCBJIHNlZW0gdG8gYmUgYWJsZSB0byB1cGxvYWQgYW5kIGRvd25sb2FkCisgICAgIHRocm91Z2ggdGVsbmV0IHJ1biBvbiBLZXJtaXQgd2l0aCB0aGUgbWF4aW11bSBsZW5ndGggcGFja2V0cy4gSQorICAgICBub3RlIHRoYXQgdGhlIHdpbmRvdyBhbGxvY2F0aW9uIGRpc3BsYXkgZG9lcyBzaG93IFNUUkVBTUlORywgdXNpbmcKKyAgICAgdGVsbmV0LiBSdW5uaW5nIHNzaCBvbiBLZXJtaXQsIEkgc2VlIHRoZSBzdGFuZGFyZCAxIG9mIDMwIHdpbmRvd3MKKyAgICAgZGlzcGxheSwgYW5kIG5vdGUgdGhhdCB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgYnVmZmVyIGxlbmd0aCBsaW1pdAorICAgICBiZXR3ZWVuIDEwMDAgYW5kIDIwMDAgYnl0ZXMuIFJ1biB3aXRoIDEwMDAsIGFuZCBpdCdzIHRpY2stdG9jaywKKyAgICAgc29saWQgYXMgYSByb2NrLiBXaXRoIDIwMDAgSSBzZWUgdGltZW91dCBlcnJvcnMgYW5kIFJUUy9DVFMgYWN0aW9uCisgICAgIG9uIHRoZSBtb2RlbS4KKworICAgS2VybWl0J3MgcGFja2V0LWxlbmd0aCBhbmQgb3RoZXIgY29udHJvbHMgbGV0IHlvdSBtYWtlIGFkanVzdG1lbnRzCisgICBsaWtlIHRoaXMgdG8gZ2V0IGFyb3VuZCB3aGF0ZXZlciBvYnN0YWNsZXMgbWlnaHQgYmUgdGhyb3duIHVwIC0tIGluCisgICB0aGlzIGNhc2UgKHJ1bm5pbmcgS2VybWl0IG92ZXIgc3NoKSwgdGhlIHVuZGVybGluZyBTb2xhcmlzIFBUWSBkcml2ZXIuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy43LjYuIFNvbGFyaXMgMi40IGFuZCBFYXJsaWVyCisKKyAgIFsgWzQ0MF1Ub3AgXSBbIFs0NDFdQ29udGVudHMgXSBbIFs0NDJdU2VjdGlvbiBDb250ZW50cyBdIFsKKyAgIFs0NDNdUHJldmlvdXMgXQorCisgICBDLUtlcm1pdCBjYW4ndCBiZSBjb21waWxlZCBzdWNjZXNzZnVsbHkgdW5kZXIgU29sYXJpcyAyLjMgdXNpbmcKKyAgIFNVTldzcHJvIGNjIDIuMC4xIHVubGVzcyBhdCBsZWFzdCBzb21lIG9mIHRoZSBmb2xsb3dpbmcgcGF0Y2hlcyBhcmUKKyAgIGFwcGxpZWQgdG8gY2MgKGl0IGlzIG5vdCBrbm93biB3aGljaCBvbmUocyksIGlmIGFueSwgZml4IHRoZSBwcm9ibGVtKToKKworICAgICAqIDEwMDkzNS0wMSBTcGFyY0NvbXBpbGVyIEMgMi4wLjE6IGJhZCBjb2RlIGdlbmVyYXRlZCB3aGVuIGFkZHJlc3NlcworICAgICAgIG9mIHR3byBkb3VibGUgYXJndW1lbnRzIGFyZSBpbnZvbHZlZAorICAgICAqIDEwMDk2MS0wNSBTUEFSQ2NvbXBpbGVycyBDIDIuMC4xOiBjb25kaXRpb25hbCBleHByZXNzaW9uIHdpdGgKKyAgICAgICBmdW5jdGlvbiByZXR1cm5pbmcgc3RydWN0dXJlIGdpdmVzIHdyb25nIHZhbHVlCisgICAgICogMTAwOTc0LTAxIFNwYXJjV29ya3MgMi4wLjE6IGRieCBqdW1ibyBwYXRjaAorICAgICAqIDEwMTQyNC0wMSBTUEFSQ3dvcmtzIDIuMC4xIG1ha2V0b29sIFNFR1YncyBpbnN0YW50bHkgb24gU29sYXJpcworICAgICAgIDIuMworCisgICBXaXRoIHVucGF0Y2hlZCBjYyAyLjAuMSwgdGhlIHN5bXB0b20gaXMgdGhhdCBjZXJ0YWluIG1vZHVsZXMgZ2VuZXJhdGUKKyAgIHRydW5jYXRlZCBvYmplY3QgZmlsZXMsIHJlc3VsdGluZyBpbiBtYW55IHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBhdAorICAgbGluayB0aW1lLgorCisgICAgIFRoZSByZXN0IG9mIHRoZSBwcm9ibGVtcyBpbiB0aGlzIHNlY3Rpb24gaGF2ZSB0byBkbyB3aXRoCisgICAgIGJpZGlyZWN0aW9uYWwgdGVybWluYWwgcG9ydHMgYW5kIHRoZSBTb2xhcmlzIFBvcnQgTW9uaXRvci4gQSBidWcgaW4KKyAgICAgQy1LZXJtaXQgNUEgdGlja2VkIGEgYnVnIGluIFNvbGFyaXMuIFRoZSBDLUtlcm1pdCBidWcgd2FzIGZpeGVkIGluCisgICAgIHZlcnNpb24gNi4wLCBhbmQgdGhlIFNvbGFyaXMgYnVnIHdhcyBmaXhlZCBpbiAyLjQgKEkgdGhpbmssIG9yCisgICAgIG1heWJlIDIuNSkuIAorCisgICBSZXBvcnRlZGx5LCAiQy1LZXJtaXQgLi4uIGNhdXNlcyBhIFNQQVJDc3RhdGlvbiBydW5uaW5nIFNvbGFyaXMgMi4zIHRvCisgICBwYW5pYyBhZnRlciB0aGUgbW9kZW0gY29ubmVjdHMuIEkgaGF2ZSB0cmllZCBjb21waWxpbmcgQy1LZXJtaXQgd2l0aAorICAgU3VuJ3MgdW5idW5kbGVkIEMgY29tcGlsZXIsIHdpdGggR0NDIFZlcnNpb25zIDIuNC41IGFuZCAyLjUuMywgd2l0aAorICAgbWFrZSB0YXJnZXRzICdzdW5vczUxJywgJ3N1bm9zNTF0Y3AnLCAnc3Vub3M1MWdjYycsIGFuZCBldmVuICdzeXM1cjQnLAorICAgYW5kIGVhY2ggdGltZSBpdCBjb21waWxlcyBhbmQgc3RhcnRzIHVwIGNsZWFubHksIGJ1dCB3aXRob3V0IGZhaWwsIGFzCisgICBzb29uIGFzIEkgZGlhbCB0aGUgbnVtYmVyIGFuZCBnZXQgYSAnQ09OTkVDVCcgbWVzc2FnZSBmcm9tIHRoZSBtb2RlbSwKKyAgIEkgZ2V0OgorCisgIEJBRCBUUkFQCisgIGtlcm1pdDogRGF0YSBmYXVsdAorICBrZXJuZWwgcmVhZCBmYXVsdCBhdCBhZGRyPTB4NDVjLCBwbWU9MHgwCisgIFN5bmMgRXJyb3IgUmVnIDgwIDxJTlZBTElEPgorICAuLi4KKyAgcGFuaWM6IERhdGEgRmF1bHQuCisgIC4uLgorICBSZWJvb3RpbmcuLi4KKworICAgVGhlIHNhbWUgbW9kZW0gd29ya3MgZmluZSBmb3IgVVVDUC90aXAgY2FsbGluZy4iIEFsc28gKHJlcG9ydGVkbHkpLAorICAgdGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlIGRpYWxvdXQgcG9ydCBpcyBjb25maWd1cmVkIGFzIGluL291dCB2aWEKKyAgIGFkbWludG9vbC4gSWYgaXQgaXMgY29uZmlndXJlZCBhcyBvdXQtb25seSwgbm8gcHJvYmxlbS4gVGhpcyBpcyB0aGUKKyAgIHNhbWUgZGlhbGluZyBjb2RlIHRoYXQgd29ya3Mgb24gaHVuZHJlZHMgb2Ygb3RoZXIgU3lzdGVtLVYgYmFzZWQgVW5peAorICAgT1Mncy4gU2luY2UgaXQgc2hvdWxkIGJlIGltcG9zc2libGUgZm9yIGEgdXNlciBwcm9ncmFtIHRvIGNyYXNoIHRoZQorICAgb3BlcmF0aW5nIHN5c3RlbSwgdGhpcyBwcm9ibGVtIG11c3QgYmUgY2hhbGtlZCB1cCB0byBhIFNvbGFyaXMgYnVnLgorICAgRXZlbiBpZiB5b3UgU0VUIENBUlJJRVIgT0ZGLCBDT05ORUNULCBhbmQgZGlhbCBtYW51YWxseSBieSB0eXBpbmcKKyAgIEFURFRubm5ubm5uLCB0aGUgc3lzdGVtIHBhbmljcyBhcyBzb29uIGFzIHRoZSBtb2RlbSBpc3N1ZXMgaXRzIENPTk5FQ1QKKyAgIG1lc3NhZ2UuIChDbGVhcmx5LCB3aGVuIHlvdSBhcmUgZGlhbGluZyBtYW51YWxseSwgQy1LZXJtaXQgZG9lcyBub3QKKyAgIGtub3cgYSB0aGluZyBhYm91dCB0aGUgQ09OTkVDVCBtZXNzYWdlLCBhbmQgc28gdGhlIHBhbmljIGlzIGFsbW9zdAorICAgY2VydGFpbmx5IGNhdXNlZCBieSB0aGUgdHJhbnNpdGlvbiBvZiB0aGUgQ2FycmllciBEZXRlY3QgKENEKSBsaW5lCisgICBmcm9tIG9mZiB0byBvbi4pIFRoaXMgcHJvYmxlbSB3YXMgcmVwb3J0ZWQgYnkgbWFueSB1c2VycywgYWxsIG9mIHdob20KKyAgIHNheSB0aGF0IEMtS2VybWl0IHdvcmtlZCBmaW5lIG9uIFNvbGFyaXMgMi4xIGFuZCAyLjIuIElmIHRoZQorICAgc3BlY3VsYXRpb24gYWJvdXQgQ0QgaXMgdHJ1ZSwgdGhlbiBhIHBvc3NpYmxlIHdvcmthcm91bmQgbWlnaHQgYmUgdG8KKyAgIGNvbmZpZ3VyZSB0aGUgbW9kZW0gdG8gbGVhdmUgQ0Qgb24gKG9yIG9mZikgYWxsIHRoZSB0aW1lLiBQZXJoYXBzIGJ5CisgICB0aGUgdGltZSB5b3UgcmVhZCB0aGlzLCBhIHBhdGNoIHdpbGwgaGF2ZSBiZWVuIGlzc3VlZCBmb3IgU29sYXJpcyAyLjMuCisKKyAgIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSBLYXJsIFMuIE1hcnNoLCBTeXN0ZW1zICYgTmV0d29ya3MgQWRtaW5pc3RyYXRvciwKKyAgIEFNQklYIFN5c3RlbXMgQ29ycCwgUm9jaGVzdGVyLCBOWToKKworICAgICBFbnZpcm9ubWVudDogU29sYXJpcyAyLjMgUGF0Y2ggMTAxMzE4LTQ1IEMtS2VybWl0IDVBKDE4OSkgKGFuZAorICAgICBwcmVzdW1hYmx5IHRoaXMgYXBwbGllcyB0byAxODggYW5kIDE5MCBhbHNvKS4gZWVwcm9tIHNldHRpbmc6CisKKyAgdHR5YS1ydHMtZHRyLW9mZj1mYWxzZQorICB0dHlhLWlnbm9yZS1jZD1mYWxzZQorICB0dHlhLW1vZGU9MTkyMDAsOCxuLDgsLQorCisgICAgIFRvIHVzZSBDLUtlcm1pdCBvbiBhIGJpZGlyZWN0aW9uYWwgcG9ydCBpbiB0aGlzIGVudmlyb25tZW50LCBkbyBub3QKKyAgICAgdXNlIGFkbWludG9vbCB0byBjb25maWd1cmUgdGhlIHBvcnQuIFVzZSBhZG1pbnRvb2wgdG8gZGVsZXRlIGFueQorICAgICBzZXJ2aWNlcyBydW5uaW5nIG9uIHRoZSBwb3J0IGFuZCB0aGVuIHF1aXQgYWRtaW50b29sIGFuZCBpc3N1ZSB0aGUKKyAgICAgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgcG1hZG0gLWEgLXAgenNtb24gLXMgdHR5YiAtaSByb290IC1mdSAtdiAxIC1tICJgdHR5YWRtIC1iIC1kIC9kZXYvdGVybS9iIFwKKyAgLWwgY29udHR5SCAtbSBsZHRlcm0sdHRjb21wYXQgLXMgL3Vzci9iaW4vbG9naW4gLVMgbmAiCisKKyAgICAgW05PVEU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIGEgYmx1cnJ5IGZheCwgc28gcGxlYXNlIGNoZWNrIGl0CisgICAgIGNhcmVmdWxseV0gd2hlcmU6CisKKyAgLWEgPSBBZGQgc2VydmljZQorICAtcCA9IHBtdGFnICh6c21vbikKKyAgLXMgPSBzZXJ2aWNlIHRhZyAodHR5YikKKyAgLWkgPSBpZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggc2VydmljZSB0YWcgKHJvb3QpCisgIC1mdSA9IGNyZWF0ZSB1dG1wIGVudHJ5CisgIC12ID0gdmVyc2lvbiBvZiB0dHlhZG0KKyAgLW0gPSBwb3J0IG1vbml0b3Itc3BlY2lmaWMgcG9ydGlvbiBvZiB0aGUgcG9ydCBtb25pdG9yIGFkbWluaXN0cmF0aXZlIGZpbGUKKyAgICAgICBlbnRyeSBmb3IgdGhlIHNlcnZpY2UKKyAgLWIgPSBzZXQgdXAgcG9ydCBmb3IgYmlkaXJlY3Rpb25hbCB1c2UKKyAgLWQgPSBmdWxsIHBhdGggbmFtZSBvZiBkZXZpY2UKKyAgLWwgPSB3aGljaCB0dHlsYWJlbCBpbiB0aGUgL2V0Yy90dHlkZWZzIGZpbGUgdG8gdXNlCisgIC1tID0gYSBsaXN0IG9mIHB1c2hhYmxlIFNUUkVBTVMgbW9kdWxlcworICAtcyA9IHBhdGhuYW1lIG9mIHNlcnZpY2UgdG8gYmUgaW52b2tlZCB3aGVuIGNvbm5lY3Rpb24gcmVxdWVzdCByZWNlaXZlZAorICAtUyA9IHNvZnR3YXJlIGNhcnJpZXIgZGV0ZWN0IG9uIG9yIG9mZiAobiA9IG9mZikKKworICAgICAiVGhpcyBpcyBleGFjdGx5IGhvdyBJIHdhcyBhYmxlIHRvIGdldCBLZXJtaXQgdG8gd29yayBvbiBhCisgICAgIGJpLWRpcmVjdGlvbmFsIHBvcnQgd2l0aG91dCBjcmFzaGluZyB0aGUgc3lzdGVtLiIKKworICAgT24gdGhlIFNvbGFyaXMgcHJvYmxlbSwgYWxzbyBzZWUgU3VuU29sdmUgQnVnIElEIDExNTA0NTcgKCJVc2luZworICAgQy1LZXJtaXQsIGdldCBCYWQgVHJhcCBvbiByZWNlaXZpbmcgcHJvbXB0IGZyb20gcmVtb3RlIHN5c3RlbSIpLgorICAgQW5vdGhlciB1c2VyIHJlcG9ydGVkICJTbywgSSBoYXZlIGNvbW11bmljYXRlZCB3aXRoIHRoZSBTdW4gdGVjaAorICAgc3VwcG9ydCBwZXJzb24gdGhhdCBzdWJtaXR0ZWQgdGhpcyBidWcgcmVwb3J0IFsxMTUwNDU3XS4gQXBwYXJlbnRseSwKKyAgIHRoaXMgYnVnIHdhcyBmaXhlZCB1bmRlciBvbmUgb2YgdGhlIGp1bWJvIGtlcm5lbCBwYXRjaGVzLiBJdCB3b3VsZAorICAgc2VlbSB0aGF0IHRoZSBmaXggZGlkIG5vdCBsaXZlIG9uIGludG8gMTAxMzE4LTQ1LCBhcyB0aGlzIGlzIEVYQUNUTFkKKyAgIHRoZSBlcnJvciB0aGF0IEkgc2VlIHdoZW4gSSBhdHRlbXB0IHRvIHVzZSBrZXJtaXQgb24gbXkgc3lzdGVtLiIKKworICAgTGF0ZXIgKEF1ZyA5NCkuLi4gQy1LZXJtaXQgZGlhbG91dCBzdWNjZXNzZnVsbHkgdGVzdGVkIG9uIGEgU3VuNG0gd2l0aAorICAgYSBoZWF2aWx5IHBhdGNoZWQgU29sYXJpcyAyLjMuIFRoZSBwYXRjaGVzIG1vc3QgbGlrZWx5IHRvIGhhdmUgYmVlbgorICAgcmVsZXZhbnQ6CisKKyAgICAgKiAxMDEzMTgtNTA6IFN1bk9TIDUuMzogSnVtYm8gcGF0Y2ggZm9yIGtlcm5lbCAoaW5jbHVkZXMgbGliYywKKyAgICAgICBsb2NrZCkKKyAgICAgKiAxMDE3MjAtMDE6IFN1bk9TIDUuMzogdHR5bW9uIC0gcHJvbXB0IG5vdCBhbHdheXMgdmlzaWJsZSBvbiBhCisgICAgICAgbW9kZW0gY29ubmVjdGlvbgorICAgICAqIDEwMTgxNS0wMTogU3VuT1MgNS4zOiBEYXRhIGZhdWx0IGluIHB1dCgpIE5VTEwgcXVldWUgcGFzc2VkIGZyb20KKyAgICAgICB0dHljb21tb25fcWZ1bGwoKQorICAgICAqIDEwMTMyOC0wMTogU3VuT1MgNS4zOiBBdXRvbWF0aW9uIHNjcmlwdCB0byBwcm9wZXJseSBzZXR1cCB0dHkKKyAgICAgICBwb3J0cyBwcmlvciB0byBQQ1RTIGV4ZWN1dGlvbgorCisgICBTdGlsbCBsYXRlciAoTm92IDk0KTogYW5vdGhlciB1c2VyIChCbyBLdWxsbWFyIGluIFN3ZWRlbikgcmVwb3J0cyB0aGF0CisgICBhZnRlciB1c2luZyBDLUtlcm1pdCB0byBkaWFsIG91dCBvbiBhIGJpZGlyZWN0aW9uYWwgcG9ydCwgdGhlIHBvcnQKKyAgIG1pZ2h0IG5vdCBhbnN3ZXIgc3Vic2VxdWVudCBpbmNvbWluZyBjYWxscywgYW5kIHNheXMgInRoZSBwcm9ibGVtIGlzCisgICBlYXN5IGVub3VnaCB0byBmaXggd2l0aCB0aGUgU2VyaWFsIFBvcnQgTWFuYWdlcjsgSSBqdXN0IGRlbGV0ZSB0aGUKKyAgIHNlcnZpY2UgYW5kIGluc3RhbGwgaXQgYWdhaW4gdXNpbmcgdGhlIGdyYXBoaWNhbCBpbnRlcmZhY2UsIHdoaWNoCisgICB1bmRlcm5lYXRoIHVzZXMgY29tbWFuZHMgbGlrZSBzYWNhZG0gYW5kIHBtYWRtLiIgTGF0ZXIgQm8gcmVwb3J0cywgIkkKKyAgIGhhdmUgZm91bmQgdGhhdCBpZiBJIHJ1biBLZXJtaXQgd2l0aCB0aGUgZm9sbG93aW5nIHNjcmlwdCB0aGVuIGl0CisgICB3b3Jrcy4gVGhpcyBzY3JpcHQgaXMgZm9yIC9kZXYvY3VhL2EsICItcyBhIiBpcyB0aGUgbGFzdCBhIGluCisgICAvZGV2L2N1YS9hOgorCisgICMhIC9iaW4vc2gKKyAga2VybWl0CisgIHNsZWVwIDIKKyAgc3VydW4gcG1hZG0gLWUgLXAgenNtb24gLXMgYQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuOC4gQy1LRVJNSVQgQU5EIFNVTk9TCisKKyAgIFsgWzQ0NF1Ub3AgXSBbIFs0NDVdQ29udGVudHMgXSBbIFs0NDZdU2VjdGlvbiBDb250ZW50cyBdIFsgWzQ0N11OZXh0IF0KKyAgIFsgWzQ0OF1QcmV2aW91cyBdCisKKyAgIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzZWUgIkNlbGVzdGUncyBUdXRvcmlhbCBvbiBTdW5PUyA0LjEuMysKKyAgIE1vZGVtcyBhbmQgVGVybWluYWxzIjoKKworICBbNDQ5XWh0dHA6Ly93d3cuc3Rva2VseS5jb20vCisKKyAgIEZvciBGQVFzLCBldGMsIGZyb20gU3VuLCBzZWU6CisgICAgICogWzQ1MF1odHRwOi8vYWNjZXNzMS5zdW4uY29tLworCisgICBGb3IgaGlzdG9yeSBvZiBTdW4gbW9kZWxzIGFuZCBTdW5PUyB2ZXJzaW9ucywgc2VlIChzaG91bGQgYmUgYWxsIHRoZQorICAgc2FtZSk6CisgICAgICogWzQ1MV1odHRwOi8vd3d3Lmx1ZGQubHV0aC5zZS9+YmVhci9wcm9qZWN0L3N1bi9zdW4uaGFyZHdhcmUudHh0CisgICAgICogWzQ1Ml1mdHA6Ly9mdHAubmV0Y29tLmNvbS9wdWIvcnUvcnViaWNvbi9zdW4uaGR3ci5yZWYKKyAgICAgKiBbNDUzXWZ0cDovL2Z0cC5pbnRuZXQubmV0L3B1Yi9TVU4vU3VuLUhhcmR3YXJlLVJlZgorCisgICBTdW4gU1BBUkNzdGF0aW9uIHVzZXJzIHNob3VsZCByZWFkIHRoZSBzZWN0aW9uICJTZXR0aW5nIHVwIE1vZGVtCisgICBTb2Z0d2FyZSIgaW4gdGhlIERlc2t0b3AgU1BBUkMgU3VuIFN5c3RlbSAmIE5ldHdvcmsgTWFuYWdlcidzIEd1aWRlLgorICAgSWYgeW91IGRvbid0IHNldCB1cCB5b3VyIHNlcmlhbCBwb3J0cyBjb3JyZWN0bHksIEtlcm1pdCAoYW5kIG90aGVyCisgICBjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZSkgd29uJ3Qgd29yayByaWdodC4KKworICAgQWxzbywgb24gY2VydGFpbiBTdW4gbW9kZWxzIGxpa2UgSVBDLCB0aGUgc2VyaWFsIHBvcnQgaGFyZHdhcmUgbWlnaHQKKyAgIG5lZWQgdG8gaGF2ZSBhIGp1bXBlciBjaGFuZ2VkIHRvIG1ha2UgaXQgYW4gUlMtMjMyIHBvcnQgcmF0aGVyIHRoYW4KKyAgIFJTLTQyMy4KKworICAgUmVwb3J0ZWRseSwgQy1LZXJtaXQgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgb24gYSBTdW4gU1BBUkNzdGF0aW9uIGluCisgICBhbiBPcGVuIFdpbmRvd3Mgd2luZG93IHdpdGggc2Nyb2xsaW5nIGVuYWJsZWQuIERpc2FibGUgc2Nyb2xsaW5nLCBvcgorICAgZWxzZSBpbnZva2UgS2VybWl0IGluIGEgdGVybWluYWwgZW11bGF0aW9uIHdpbmRvdyAoeHRlcm0sIGNydHRvb2wsCisgICB2dHRvb2wpIHVuZGVyIFN1blZpZXcgKHRoaXMgbWlnaHQgYmUgZml4ZWQgaW4gbGF0ZXIgU3VuT1MgcmVsZWFzZXMpLgorCisgICBPbiB0aGUgU3VuIHdpdGggT3BlbiBXaW5kb3dzLCBhbiBhZGRpdGlvbmFsIHN5bXB0b20gaGFzIGJlZW4gcmVwb3J0ZWQ6CisgICBvdXRib3VuZCBTdW5MaW5rIFguMjUgY29ubmVjdGlvbnMgIm1hZ2ljYWxseSIgdHJhbnNsYXRlIENSIHR5cGVkIGF0CisgICB0aGUga2V5Ym9hcmQgaW50byBMRiBiZWZvcmUgdHJhbnNtaXNzaW9uIHRvIHRoZSByZW1vdGUgaG9zdC4gVGhpcworICAgZG9lc24ndCBoYXBwZW4gdW5kZXIgU3VuVmlldy4KKworICAgU0VUIENBUlJJRVIgT04sIHdoZW4gdXNlZCBvbiB0aGUgU3VuT1MgNC4xIHZlcnNpb24gb2YgQy1LZXJtaXQKKyAgIChjb21waWxlZCBpbiB0aGUgQlNEIHVuaXZlcnNlKSwgY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGhhbmcKKyAgIHVuaW50ZXJydXB0aWJseSB3aGVuIFNFVCBMSU5FIGlzIGlzc3VlZCBmb3IgYSBkZXZpY2UgdGhhdCBpcyBub3QKKyAgIGFzc2VydGluZyBjYXJyaWVyLiBXaGVuIEtlcm1pdCBpcyBidWlsdCBpbiB0aGUgU3lzIFYgdW5pdmVyc2Ugb24gdGhlCisgICBzYW1lIGNvbXB1dGVyLCB0aGVyZSBpcyBubyBwcm9ibGVtIChpdCBjYW4gYmUgaW50ZXJydXB0ZWQgd2l0aAorICAgQ3RybC1DKS4gVGhpcyBpcyBhcHBhcmVudGx5IGEgbGltaXRhdGlvbiBvZiB0aGUgQlNELXN0eWxlIHR0eSBkcml2ZXIuCisKKyAgIFN1bk9TIDQuMSBDLUtlcm1pdCBoYXMgYmVlbiBvYnNlcnZlZCB0byBkdW1wIGNvcmUgd2hlbiBydW5uaW5nIGEKKyAgIGNvbXBsaWNhdGVkIHNjcmlwdCBwcm9ncmFtIHVuZGVyIGNyb24uIFRoZSBkdW1wIGludmFyaWFibHkgb2NjdXJzIGluCisgICB0dG9jKCksIHdoaWxlIHRyeWluZyB0byBvdXRwdXQgYSBjaGFyYWN0ZXIgdG8gYSBUQ1AvSVAgVEVMTkVUCisgICBjb25uZWN0aW9uLiB0dG9jKCkgY29udGFpbnMgYSB3cml0ZSgpIGNhbGwsIGFuZCB3aGVuIHRoZSBzeXN0ZW0gb3IgdGhlCisgICBuZXR3b3JrIGlzIHZlcnkgYnVzeSwgdGhlIHdyaXRlKCkgY2FsbCBjYW4gZ2V0IHN0dWNrIGZvciBsb25nIHBlcmlvZHMKKyAgIG9mIHRpbWUuIFRvIGJyZWFrIG91dCBvZiBkZWFkbG9ja3MgY2F1c2VkIGJ5IHN0dWNrIHdyaXRlKCkgY2FsbHMsCisgICB0aGVyZSBpcyBhbiBhbGFybSBhcm91bmQgdGhlIHdyaXRlKCkuIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNvcmUKKyAgIGR1bXAgb2NjdXJzIHdoZW4gdGhpcyBhbGFybSBzaWduYWwgaXMgY2F1Z2h0LiAoVGhpcyBvbmUgaGFzIG5vdCBiZWVuCisgICBvYnNlcnZlZCByZWNlbnRseSAtLSBwb3NzaWJseSBmaXhlZCBpbiBlZGl0IDE5MC4pCisKKyAgIE9uIFN1biBjb21wdXRlcnMgd2l0aCBTdW5PUyA0LjAgb3IgNC4xLCBTRVQgRkxPVyBSVFMvQ1RTIHdvcmtzIG9ubHkgaWYKKyAgIHRoZSBjYXJyaWVyIHNpZ25hbCBpcyBwcmVzZW50IGZyb20gdGhlIGNvbW11bmljYXRpb24gZGV2aWNlIGF0IHRoZQorICAgdGltZSB3aGVuIEMtS2VybWl0IGVudGVycyBwYWNrZXQgbW9kZSBvciBDT05ORUNUIG1vZGUuIElmIGNhcnJpZXIgaXMKKyAgIG5vdCBzZW5zZWQgKGUuZy4gd2hlbiBkaWFsaW5nKSwgQy1LZXJtaXQgZG9lcyBub3QgYXR0ZW1wdCB0byB0dXJuIG9uCisgICBSVFMvQ1RTIGZsb3cgY29udHJvbC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBTdW5PUyBzZXJpYWwgZGV2aWNlIGRyaXZlcgorICAgZG9lcyBub3QgYWxsb3cgY2hhcmFjdGVycyB0byBiZSBvdXRwdXQgaWYgUlRTL0NUUyBpcyBzZXQgKENSVFNDVFMpIGJ1dAorICAgY2FycmllciAoYW5kIERTUikgYXJlIG5vdCBwcmVzZW50LiBXb3JrYXJvdW5kIChtYXliZSk6IFNFVCBDQVJSSUVSIE9GRgorICAgYmVmb3JlIGdpdmluZyB0aGUgU0VUIExJTkUgY29tbWFuZCwgZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uLCB0aGVuIFNFVAorICAgRkxPVyBSVFMvQ1RTCisKKyAgIEl0IGhhcyBhbHNvIGJlZW4gcmVwb3J0ZWQgdGhhdCBSVFMvQ1RTIGZsb3cgY29udHJvbCB1bmRlciBTdW5PUyA0LjEKKyAgIHRocm91Z2ggNC4xLjMgd29ya3Mgb25seSBvbiBJTlBVVCwgbm90IG9uIG91dHB1dCwgYW5kIHRoYXQgdGhlcmUgaXMgYQorICAgcGF0Y2ggZnJvbSBTdW4gdG8gY29ycmVjdCB0aGlzIHByb2JsZW06IFBhdGNoLUlEIyBUMTAwNTEzLTA0LCAyMCBKdWx5CisgICAxOTkzICh0aGlzIHBhdGNoIG1pZ2h0IGFwcGx5IG9ubHkgdG8gU3VuT1MgNC4xLjMpLiBJdCBtaWdodCBhbHNvIGJlCisgICBuZWNlc3NhcnkgdG8gY29uZmlndXJlIHRoZSBlZXByb20gcGFyYW1ldGVycyBvZiB0aGUgc2VyaWFsIHBvcnQ7IGUuZy4KKyAgIGRvIHRoZSBmb2xsb3dpbmcgYXMgcm9vdCBhdCB0aGUgc2hlbGwgcHJvbXB0OgorCisgIGVlcHJvbSAgdHR5YS1pZ25vcmUtY2Q9ZmFsc2UKKyAgZWVwcm9tICB0dHlhLXJ0cy1kdHItb2ZmPXRydWUKKworICAgVGhlcmUgaGF2ZSBiZWVuIHJlcG9ydHMgb2YgZmlsZSB0cmFuc2ZlciBmYWlsdXJlcyBvbiBTdW4tMyBzeXN0ZW1zCisgICB3aGVuIHVzaW5nIGxvbmcgcGFja2V0cyBhbmQvb3IgbGFyZ2Ugd2luZG93IHNpemVzLiBPbmUgdXNlciBzYXlzIHRoYXQKKyAgIHdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgY29uc29sZSBpc3N1ZXMgbWFueSBjb3BpZXMgb2YgdGhpcyBtZXNzYWdlOgorCisgIGNoYW9zIHZtdW5peDogenMxOiByaW5nIGJ1ZmZlciBvdmVyZmxvdworCisgICBUaGlzIG1lYW5zIHRoYXQgU3VuT1MgaXMgbm90IHNjaGVkdWxpbmcgS2VybWl0IGZyZXF1ZW50bHkgZW5vdWdoIHRvCisgICBzZXJ2aWNlIGludGVycnVwdHMgZnJvbSB0aGUgenMgc2VyaWFsIGRldmljZSAoWmlsb2cgODM1MCBTQ0Mgc2VyaWFsCisgICBjb21tdW5pY2F0aW9uIHBvcnQpIGJlZm9yZSBpdHMgaW5wdXQgc2lsbyBvdmVyZmxvd3MuIFdvcmthcm91bmQ6IHVzZQorICAgc21hbGxlciBwYWNrZXRzIGFuZC9vciBhIHNtYWxsZXIgd2luZG93IHNpemUsIG9yIHVzZSAibmljZSIgdG8KKyAgIGluY3JlYXNlIEtlcm1pdCdzIHByaW9yaXR5LiBVc2UgaGFyZHdhcmUgZmxvdyBjb250cm9sIGlmIGF2YWlsYWJsZSwgb3IKKyAgIHJlbW92ZSBvdGhlciBhY3RpdmUgcHJvY2Vzc2VzIGJlZm9yZSBydW5uaW5nIEtlcm1pdC4KKworICAgU3VuTGluayBYLjI1IHN1cHBvcnQgaW4gQy1LZXJtaXQgNUEoMTkwKSB3YXMgYnVpbHQgYW5kIHRlc3RlZAorICAgc3VjY2Vzc2Z1bGx5IHVuZGVyIFN1bk9TIDQuMS4zYiBhbmQgU3VuTGluayBYLjI1IDcuMDAuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy45LiBDLUtFUk1JVCBBTkQgVUxUUklYCisKKyAgIFsgWzQ1NF1Ub3AgXSBbIFs0NTVdQ29udGVudHMgXSBbIFs0NTZdU2VjdGlvbiBDb250ZW50cyBdIFsgWzQ1N11OZXh0IF0KKyAgIFsgWzQ1OF1QcmV2aW91cyBdCisKKyAgIFNlZSBhbHNvOiBUaGUgWzQ1OV1jb21wLnVuaXgudWx0cml4IGFuZCBbNDYwXWNvbXAuc3lzLmRlYyBuZXdzZ3JvdXBzLgorCisgICBUaGVyZSBpcyBubyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaW4gVWx0cml4LiBUaGF0J3Mgbm90IGEgS2VybWl0CisgICBkZWZpY2llbmN5LCBidXQgYW4gVWx0cml4IG9uZS4KKworICAgV2hlbiBzZW5kaW5nIGZpbGVzIHRvIEMtS2VybWl0IG9uIGEgVGVsbmV0IGNvbm5lY3Rpb24gdG8gYSByZW1vdGUKKyAgIFVsdHJpeCBzeXN0ZW0sIHlvdSBtdXN0IFNFVCBQUkVGSVhJTkcgQUxMIChvciBhdCBsZWFzdCBwcmVmaXggbW9yZQorICAgY29udHJvbCBjaGFyYWN0ZXJzIHRoYW4gYXJlIHNlbGVjdGVkIGJ5IFNFVCBQUkVGSVhJTkcgQ0FVVElPVVMpLgorCisgICBSZXBvcnRlZGx5LCBERUMgVUxUUklYIDQuMyBpcyBpbW11bmUgdG8gQy1LZXJtaXQncyBkaXNhYmxpbmcgb2YKKyAgIFNJR1FVSVQsIHdoaWNoIGlzIHRoZSBzaWduYWwgdGhhdCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgdXNlciB0eXBlcworICAgQ3RybC1cLCB3aGljaCBraWxscyB0aGUgY3VycmVudCBwcm9jZXNzIChpLmUuIEMtS2VybWl0KSBhbmQgZHVtcHMKKyAgIGNvcmUuIERpYWdub3NpcyBhbmQgY3VyZSB1bmtub3duLiBXb3JrYXJvdW5kOiBiZWZvcmUgc3RhcnRpbmcgQy1LZXJtaXQKKyAgIC0tIG9yIGZvciB0aGF0IG1hdHRlciwgd2hlbiB5b3UgZmlyc3QgbG9nIGluIGJlY2F1c2UgdGhpcyBhcHBsaWVzIHRvCisgICBhbGwgcHJvY2Vzc2VzLCBub3QganVzdCBLZXJtaXQgLS0gZ2l2ZSB0aGUgZm9sbG93aW5nIFVuaXggY29tbWFuZDoKKworICBzdHR5IHF1aXQgdW5kZWYKKworICAgQ2VydGFpbiBvcGVyYXRpb25zIGRyaXZlbiBieSBSUy0yMzIgbW9kZW0gc2lnbmFsIGRvIG5vdCB3b3JrIG9uCisgICBERUNzdGF0aW9ucyBvciBvdGhlciBERUMgcGxhdGZvcm1zIHdob3NlIHNlcmlhbCBpbnRlcmZhY2VzIHVzZSBNTVAKKyAgIGNvbm5lY3RvcnMgKERFQyB2ZXJzaW9uIG9mIFJKNDUgdGVsZXBob25lIGphY2sgd2l0aCBvZmZzZXQgdGFiKS4gVGhlc2UKKyAgIGNvbm5lY3RvcnMgY29udmV5IG9ubHkgdGhlIERTUiBhbmQgRFRSIG1vZGVtIHNpZ25hbHMsIGJ1dCBub3QgY2FycmllcgorICAgKENEKSwgUlRTLCBDVFMsIG9yIFJJLiBVc2UgU0VUIENBUlJJRVIgT0ZGIHRvIGVuYWJsZSBjb21tdW5pY2F0aW9uLCBvcgorICAgImhvdHdpcmUiIERTUiB0byBDRC4KKworICAgVGhlIG1heGltdW0gc2VyaWFsIHNwZWVkIG9uIHRoZSBERUNzdGF0aW9uIDUwMDAgaXMgbm9ybWFsbHkgMTkyMDAsIGJ1dAorICAgdmFyaW91cyB0cmlja3MgYXJlIGF2YWlsYWJsZSAob3V0c2lkZSBLZXJtaXQpIHRvIGVuYWJsZSBoaWdoZXIgcmF0ZXMuCisgICBGb3IgZXhhbXBsZSwgb24gdGhlIDUwMDAvMjAwLCAxOTIwMCBjYW4gYmUgcmVtYXBwZWQgKHNvbWVob3csCisgICBzb21ldGhpbmcgdG8gZG8gd2l0aCAiYSBiaXQgaW4gdGhlIFNJUiIsIHdoYXRldmVyIHRoYXQgaXMpIHRvIDM4NDAwLAorICAgYnV0IGluIHNvZnR3YXJlIHlvdSBtdXN0IHN0aWxsIHJlZmVyIHRvIHRoaXMgc3BlZWQgYXMgMTkyMDA7IHlvdSBjYW4ndAorICAgaGF2ZSAxOTIwMCBhbmQgMzg0MDAgYXZhaWxhYmxlIGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgIDE5MjAwLCByZXBvcnRlZGx5LCBpcyBhbHNvIHRoZSBoaWdoZXN0IHNwZWVkIHN1cHBvcnRlZCBieSBVbHRyaXgsIGJ1dAorICAgTmV0QlNEIHJlcG9ydGVkbHkgc3VwcG9ydHMgc3BlZWRzIHVwIHRvIDU3NjAwIG9uIHRoZSBERUNzdGF0aW9uLAorICAgYWx0aG91Z2ggd2hldGhlciBhbmQgaG93IHdlbGwgdGhpcyB3b3JrcyBpcyBhbm90aGVyIHF1ZXN0aW9uLgorCisgICBJbiBhbnkgY2FzZSwgZ2l2ZW4gdGhlIGxhY2sgb2YgaGFyZHdhcmUgZmxvdyBjb250cm9sIGluIFVsdHJpeCwgaGlnaAorICAgc2VyaWFsIHNwZWVkcyBhcmUgcHJvYmxlbWF0aWMgYXQgYmVzdC4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjEwLiBDLUtFUk1JVCBBTkQgVU5JWFdBUkUKKworICAgWyBbNDYxXVRvcCBdIFsgWzQ2Ml1Db250ZW50cyBdIFsgWzQ2M11TZWN0aW9uIENvbnRlbnRzIF0gWyBbNDY0XU5leHQgXQorICAgWyBbNDY1XVByZXZpb3VzIF0KKworICAgU2VlIGFsc286CisgICAgICogVGhlIEZyZWViaXJkIFByb2plY3QgKFVuaXh3YXJlIHNvZnR3YXJlIHJlcG9zaXRvcnkpCisgICAgICAgWzQ2Nl1odHRwOi8vd3d3LmZyZWViaXJkLm9yZy8KKyAgICAgKiBUaGUgVW5peFdhcmUgRkFROiBbNDY3XWh0dHA6Ly93d3cuZnJlZWJpcmQub3JnL2ZhcS8KKyAgICAgKiBUaGUgZm9sbG93aW5nIG5ld3Nncm91cHM6CisgICAgICAgICAgKyBbNDY4XWNvbXAudW5peC51bml4d2FyZS5taXNjCisgICAgICAgICAgKyBbNDY5XWNvbXAudW5peC5zY28ubWlzYy4KKworICAgQWxzbyBzZWUgZ2VuZXJhbCBjb21tZW50cyBvbiBQQy1iYXNlZCBVbml4ZXMgaW4gWzQ3MF1TZWN0aW9uIDMuMC4gQnkKKyAgIHRoZSB3YXksIHRoaXMgc2VjdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBTQ08gKENhbGRlcmEpIHNlY3Rpb24KKyAgIGJlY2F1c2UgYXQgdGhlIHRpbWUgdGhpcyBzZWN0aW9uIHdhcyBzdGFydGVkLCBVbml4d2FyZSB3YXMgb3duZWQgYnkgYQorICAgY29tcGFueSBjYWxsZWQgVW5pdmVsLiBMYXRlciBpdCB3YXMgc29sZCB0byBOb3ZlbGwsIGFuZCB0aGVuIHRvIFNDTy4KKyAgIFN0aWxsIGxhdGVyLCBTQ08gd2FzIHNvbGQgdG8gQ2FsZGVyYS4KKworICAgSW4gVW5peHdhcmUgMi4wIGFuZCBsYXRlciwgdGhlIHByZWZlcnJlZCBzZXJpYWwgZGV2aWNlIG5hbWVzIChkcml2ZXJzKQorICAgYXJlIC9kZXYvdGVybS8wMCAoZXRjKSwgcmF0aGVyIHRoYW4gL2Rldi90dHkwMCAoZXRjKS4gTm90ZSB0aGUKKyAgIGZvbGxvd2luZyBjb3JyZXNwb25kZW5jZSBvZiBkZXZpY2UgbmFtZXMgYW5kIGRyaXZlciBjaGFyYWN0ZXJpc3RpY3M6CisKKyAgTmV3IG5hbWUgICAgICAgT2xkIG5hbWUgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAKKyAgL2Rldi90ZXJtLzAwICAgL2Rldi90dHkwMCAgID8/PworICAvZGV2L3Rlcm0vMDBoICAvZGV2L3R0eTAwaCAgTW9kZW0gc2lnbmFscyBhbmQgaGFyZHdhcmUgZmxvdyBjb250cm9sCisgIC9kZXYvdGVybS8wMG0gIC9kZXYvdHR5MDBtICBNb2RlbSBzaWduYWxzKD8pCisgIC9kZXYvdGVybS8wMHMgIC9kZXYvdHR5MDBzICBNb2RlbSBzaWduYWxzIGFuZCBzb2Z0d2FyZSBmbG93IGNvbnRyb2wKKyAgL2Rldi90ZXJtLzAwdCAgL2Rldi90dHkwMHQgID8/PworCisgICBMb2NrZmlsZSBuYW1lcyB1c2UgZGV2aWNlLm1ham9yLm1pbm9yIG51bWJlcnMsIGUuZy46CisKKyAgL3Zhci9zcG9vbC9sb2Nrcy9MSy43Njc5LjAwMy4wMDUKKworICAgVGhlIG1pbm9yIG51bWJlciB2YXJpZXMgYWNjb3JkaW5nIHRvIHRoZSBkZXZpY2UgbmFtZSBzdWZmaXggKG5vbmUsIGgsCisgICBtLCBzLCBvciB0KS4gT25seSB0aGUgZGV2aWNlIGFuZCBtYWpvciBudW1iZXIgYXJlIGNvbXBhcmVkLCBhbmQgdGh1cworICAgYWxsIG9mIHRoZSBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSBzYW1lIHBoeXNpY2FsIGRldmljZSAoZS5nLiBhbGwgb2YKKyAgIHRob3NlIHNob3duIGluIHRoZSB0YWJsZSBhYm92ZSkgaW50ZXJsb2NrIGVmZmVjdGl2ZWx5LgorCisgICBQcmlvciB0byBVbml4V2FyZSA3LCBzZXJpYWwgc3BlZWRzIGhpZ2hlciB0aGFuIDM4NDAwIGFyZSBub3QKKyAgIHN1cHBvcnRlZC4gSW4gVW5peFdhcmUgNywgd2UgYWxzbyBzdXBwb3J0IDU3NjAwIGFuZCAxMTUyMDAsIHBsdXMgc29tZQorICAgdW5leHBlY3RlZCBvbmVzIGxpa2UgMTQ0MDAsIDI4ODAwLCBhbmQgNzY4MDAsIGJ5IHZpcnR1ZSBvZiBhIHN0cmFuZ2UKKyAgIG5ldyBpbnRlcmZhY2UsIGV2aWRlbnRseSBwZWN1bGlhciB0byBVbml4V2FyZSA3LCBkaXNjb3ZlcmVkIHdoaWxlCisgICBkaWdnaW5nIHRocm91Z2ggdGhlIGhlYWRlciBmaWxlczogdGNzZXRzcGVlZCgpLiBBY2Nlc3MgdG8gdGhpcworICAgaW50ZXJmYWNlIGlzIGFsbG93ZWQgb25seSBpbiBQT1NJWCBidWlsZHMsIGFuZCB0aHVzIHRoZSBVbml4V2FyZSA3CisgICB2ZXJzaW9uIG9mIEMtS2VybWl0IGlzIFBPU0lYLWJhc2VkLCB1bmxpa2UgQy1LZXJtaXQgZm9yIFVuaXh3YXJlIDEueAorICAgYW5kIDIueCAoc2luY2UgdGhlIGVhcmxpZXIgVW5peFdhcmUgdmVyc2lvbnMgZGlkIG5vdCBzdXBwb3J0IGhpZ2gKKyAgIHNlcmlhbCBzcGVlZHMsIHBlcmlvZCkuCisKKyAgIEhPV0VWRVIsIHR1cm5pbmcgb24gUE9TSVggZmVhdHVyZXMgZW5nYWdlcyBhbGwgb2YgdGhlICIjaWYKKyAgICghX1BPU0lYX1NPVVJDRSkiIGNsYXVzZXMgaW4gdGhlIFVuaXhXYXJlIGhlYWRlciBmaWxlcywgd2hpY2ggaW4gdHVybgorICAgcHJldmVudCB1cyBmcm9tIGhhdmluZyBtb2RlbSBzaWduYWxzLCBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIGZsb3cKKyAgIGNvbnRyb2wgQVBJcywgc2VsZWN0KCksIGV0YyAtLSBpbiBzaG9ydCwgYWxsIHRoZSBvdGhlciB0aGluZ3Mgd2UgbmVlZAorICAgaW4gY29tbXVuaWNhdGlvbnMgc29mdHdhcmUsIGVzcGVjaWFsbHkgd2hlbiBoaWdoIHNwZWVkcyBhcmUgdXNlZC4gT2gKKyAgIHRoZSBpcm9ueS4gQW5kIHNvIEMtS2VybWl0IG11c3QgYmUgc2hhbWVsZXNzbHkgYnV0Y2hlcmVkIC0tIGFzIGl0IGhhcworICAgYmVlbiBzbyBtYW55IHRpbWVzIGJlZm9yZSAtLSB0byBhbGxvdyB1cyB0byBoYXZlIHRoZSBuZWVkZWQgZmVhdHVyZXMKKyAgIGZyb20gdGhlIFBPU0lYIGFuZCBub24tUE9TSVggd29ybGRzLiBTZWUgdGhlIFVOSVhXQVJFUE9TSVggc2VjdGlvbnMgb2YKKyAgIFs0NzFdY2t1dGlvLmMuCisKKyAgIEFmdGVyIHRoZSBidXRjaGVyeSwgd2Ugd2luZCB1cCB3aXRoIFVuaXh3YXJlIDIueCBoYXZpbmcgZnVsbAorICAgbW9kZW0tc2lnbmFsIGNhcGFiaWxpdHksIGJ1dCBwb2xpdGljYWxseS1jb3JyZWN0IFVuaXh3YXJlIDcueCBsYWNraW5nCisgICB0aGUgYWJpbGl0eSB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBhIGJyb2tlbiBjb25uZWN0aW9uIHdoZW4gY2FycmllcgorICAgZHJvcHMuCisKKyAgIE1lYW53aGlsZSB0aGUgVW5peHdhcmUgdGNzZXRzcGVlZCgpIGZ1bmN0aW9uIGFsbG93cyBhbnkgbnVtYmVyIGF0IGFsbAorICAgKGFueSBsb25nLCAwIG9yIHBvc2l0aXZlKSBhcyBhbiBhcmd1bWVudCBhbmQgc3VjY2VlZHMgaWYgdGhlIG51bWJlciBpcworICAgYSBsZWdhbCBiaXQgcmF0ZSBmb3IgdGhlIHNlcmlhbCBkZXZpY2UsIGFuZCBmYWlscyBvdGhlcndpc2UuIFRoZXJlIGlzCisgICBubyBsaXN0IGFueXdoZXJlIG9mIGxlZ2FsIHNwZWVkcy4gVGh1cyB0aGUgU0VUIFNQRUVEIGtleXdvcmQgdGFibGUKKyAgICgic2V0IHNwZWVkID8iIHRvIHNlZSBpdCkgaXMgaGFyZHdpcmVkIGJhc2VkIG9uIHRyaWFsIGFuZCBlcnJvciB3aXRoCisgICBhbGwga25vd24gc2VyaWFsIHNwZWVkcywgdGhlIG1heGltdW0gYmVpbmcgMTE1MjAwLiBIb3dldmVyLCB0byBhbGxvdworICAgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IG90aGVyIHNwZWVkcyBtaWdodCBiZSBhbGxvd2VkIGluIHRoZSBmdXR1cmUKKyAgIChvciB3aXRoIGRpZmZlcmVudCBwb3J0IGRyaXZlcnMpLCB0aGUgU0VUIFNQRUVEIGNvbW1hbmQgZm9yIFVuaXhXYXJlIDcKKyAgIG9ubHkgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGFueSBudW1iZXIgYXQgYWxsOyBhIHdhcm5pbmcgaXMgcHJpbnRlZCBpZgorICAgdGhlIG51bWJlciBpcyBub3QgaW4gdGhlIGxpc3QsIGJ1dCB0aGUgbnVtYmVyIGlzIGFjY2VwdGVkIGFueXdheTsgdGhlCisgICBjb21tYW5kIHN1Y2NlZWRzIGlmIHRjc2V0c3BlZWQoKSBhY2NlcHRzIHRoZSBudW1iZXIsIGFuZCBmYWlscworICAgb3RoZXJ3aXNlLgorCisgICBJbiBDLUtlcm1pdCA4LjAgdGVzdGluZywgaXQgd2FzIG5vdGljZWQgdGhhdCB0aGUgUE9TSVggbWV0aG9kIGZvcgorICAgaGFuZ2luZyB1cCB0aGUgcGhvbmUgYnkgZHJvcHBpbmcgRFRSIChzZXQgc3BlZWQgMCwgcGF1c2UsIHJlc3RvcmUKKyAgIHNwZWVkKSBkaWQgbm90IGFjdHVhbGx5IGRyb3AgRFRSLiBUaGUgQVBJcyBkbyBub3QgcmV0dXJuIGFueSBlcnJvcgorICAgaW5kaWNhdGlvbiwgYnV0IG5vdGhpbmcgaGFwcGVucy4gSSBjaGFuZ2VkIHR0aGFuZygpIHRvIHNraXAgdGhlCisgICBzcGVjaWFsIGNhc2UgSSBoYWQgbWFkZSBmb3IgVW5peHdhcmUgYW5kIGluc3RlYWQgZm9sbG93IHRoZSBub3JtYWwKKyAgIHBhdGg6IGlmIFRJT0NTRFRSIGlzIGRlZmluZWQgdXNlIHRoYXQsIG90aGVyd2lzZSBibGFoIGJsYWguLi4gSXQgdHVybnMKKyAgIG91dCBUSU9DU0RUUiAqaXMqIGRlZmluZWQsIGFuZCBpdCB3b3Jrcy4KKworICAgU28gaW4gVW5peHdhcmUgKGF0IGxlYXN0IGluIDIuMS4zKSB3ZSBjYW4gcmVhZCBtb2RlbSBzaWduYWxzLCBoYW5ndXAKKyAgIGJ5IHRvZ2dsaW5nIERUUiwgYW5kIHNvIG9uLCBCVVQuLi4gQnV0IG9uY2UgdGhlIHJlbW90ZSBoYW5ncyB1cCBhbmQKKyAgIENhcnJpZXIgZHJvcHMsIHRoZSBBUEkgZm9yIHJlYWRpbmcgbW9kZW0gc2lnbmFscyBjZWFzZXMgdG8gZnVuY3Rpb247CisgICBhbHRob3VnaCB0aGUgZGV2aWNlIGlzIHN0aWxsIG9wZW4sIHRoZSBUSU9DTUdFVCBpb2N0bCBhbHdheXMgcmFpc2VzCisgICBlcnJubyA2ID0gRU5YSU8sICJObyBzdWNoIGRldmljZSBvciBhZGRyZXNzIi4KKworICAgT2xkIGJ1c2luZXNzOgorCisgICBVc2luZyBDLUtlcm1pdCA2LjAgb24gdGhlIFVuaXhXYXJlIDEuMSBBcHBsaWNhdGlvbiBTZXJ2ZXIsIG9uZSB1c2VyCisgICByZXBvcnRlZCBhIHN5c3RlbSBwYW5pYyB3aGVuIHRoZSBmb2xsb3dpbmcgc2NyaXB0IHByb2dyYW0gaXMgZXhlY3V0ZWQ6CisKKyAgc2V0IGxpbmUgL2Rldi90dHk0CisgIHNldCBzcGVlZCA5NjAwCisgIG91dHB1dCBcMTMKKyAgY29ubmVjdAorCisgICBUaGUgcGFuaWMgZG9lcyBub3QgaGFwcGVuIGlmIGEgUEFVU0UgaXMgaW5zZXJ0ZWQ6CisKKyAgc2V0IGxpbmUgL2Rldi90dHk0CisgIHNldCBzcGVlZCA5NjAwCisgIHBhdXNlIDEKKyAgb3V0cHV0IFwxMworICBjb25uZWN0CisKKyAgIFRoaXMgaXMgdXNpbmcgYSBTdGFsbGlvbiBFYXN5SU8gY2FyZCBpbnN0YWxsZWQgYXMgYm9hcmQgMCBvbiBJUlEgMTIgb24KKyAgIGEgR2F0ZXdheSAzODYgd2l0aCB0aGUgU3RhbGxpb24tc3VwcGxpZWQgZHJpdmVyLiBUaGUgcHJvYmxlbSB3YXMKKyAgIHJlcG9ydGVkIHRvIE5vdmVsbCBhbmQgU3RhbGxpb24gYW5kIChyZXBvcnRlZGx5KSBpcyBub3cgZml4ZWQuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4xMS4gQy1LRVJNSVQgQU5EIEFQT0xMTyBTUjEwCisKKyAgIFsgWzQ3Ml1Ub3AgXSBbIFs0NzNdQ29udGVudHMgXSBbIFs0NzRdU2VjdGlvbiBDb250ZW50cyBdIFsgWzQ3NV1OZXh0IF0KKyAgIFsgWzQ3Nl1QcmV2aW91cyBdCisKKyAgIFJlcG9ydGVkbHksIHZlcnNpb24gNUEoMTkwKSwgd2hlbiBidWlsdCB1bmRlciBBcG9sbG8gU1IxMCB1c2luZyAibWFrZQorICAgc3IxMC1ic2QiLCBjb21waWxlcywgbGlua3MsIGFuZCBleGVjdXRlcyBPSywgYnV0IGxlYXZlcyB0aGUgdGVybWluYWwKKyAgIHVudXNhYmxlIGFmdGVyIGl0IGV4aXRzIC0tIHRoZSAiY3M3IiBvciAiY3M4IiAoY2hhcmFjdGVyIHNpemUpCisgICBwYXJhbWV0ZXIgaGFzIGJlY29tZSBjczUuIFRoZSB0ZXJtaW5hbCBtdXN0IGJlIHJlc2V0IGZyb20gYW5vdGhlcgorICAgdGVybWluYWwuIENhdXNlIGFuZCBjdXJlIHVua25vd24uIFN1Z2dlc3RlZCB3b3JrYXJvdW5kOiBXcmFwIEtlcm1pdCBpbgorICAgYSBzaGVsbCBzY3JpcHQgc29tZXRoaW5nIGxpa2U6CisKKyAga2VybWl0IEAqCisgIHN0dHkgc2FuZQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMTIuIEMtS0VSTUlUIEFORCBUQU5EWSBYRU5JWCAzLjAKKworICAgWyBbNDc3XVRvcCBdIFsgWzQ3OF1Db250ZW50cyBdIFsgWzQ3OV1TZWN0aW9uIENvbnRlbnRzIF0gWyBbNDgwXU5leHQgXQorICAgWyBbNDgxXVByZXZpb3VzIF0KKworICAgQy1LZXJtaXQgNy4wIHdhcyB0b28gYmlnIHRvIGJlIGJ1aWx0IG9uIFRhbmR5IFhlbml4LCBldmVuIGluIGEgbWluaW11bQorICAgY29uZmlndXJhdGlvbjsgdmVyc2lvbiA2LjAgaXMgdGhlIGxhc3Qgb25lIHRoYXQgZml0cy4KKworICAgUmVwb3J0ZWRseSwgaW4gQy1LZXJtaXQgNi4wLCBpZiB5b3UgdHlwZSBsb3RzIG9mIEN0cmwtQydzIGR1cmluZworICAgZXhlY3V0aW9uIG9mIHRoZSBpbml0aWFsaXphdGlvbiBmaWxlLCBnaG9zdCBLZXJtaXQgcHJvY2Vzc2VzIHdpbGwgYmUKKyAgIGNyZWF0ZWQsIGFuZCB3aWxsIGNvbXBldGUgZm9yIHRoZSBrZXlib2FyZC4gVGhleSBjYW4gb25seSBiZSByZW1vdmVkCisgICB2aWEgImtpbGwgLTkiIGZyb20gYW5vdGhlciB0ZXJtaW5hbCwgb3IgYnkgcmVib290aW5nLiBEaWFnbm9zaXMgLS0KKyAgIHNvbWV0aGluZyBzdHJhbmdlIGhhcHBlbmluZyB3aXRoIHRoZSBTSUdJTlQgaGFuZGxlciB3aGlsZSB0aGUgcHJvY2VzcworICAgaXMgcmVhZGluZyB0aGUgZGlyZWN0b3J5IChpdCBzZWVtcyB0byBvY2N1ciBkdXJpbmcgdGhlIFNFVCBQUk9NUFQKKyAgIFtcdihkaXIpXSAuLi4gc2VxdWVuY2UpLiBDdXJlOiB1bmtub3duLiBXb3JrYXJvdW5kOiBkb24ndCBpbnRlcnJ1cHQKKyAgIEMtS2VybWl0IHdoaWxlIGl0IGlzIGV4ZWN1dGluZyBpdHMgaW5pdCBmaWxlIG9uIHRoZSBUYW5keSAxNi82MDAwLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMTMuIEMtS0VSTUlUIEFORCBPU0YvMSAoRElHSVRBTCBVTklYKSAoVFJVNjQgVU5JWCkKKworICAgWyBbNDgyXVRvcCBdIFsgWzQ4M11Db250ZW50cyBdIFsgWzQ4NF1TZWN0aW9uIENvbnRlbnRzIF0gWyBbNDg1XU5leHQgXQorICAgWyBbNDg2XVByZXZpb3VzIF0KKworICAgV2hpbGUgcHV0dGluZyB0b2dldGhlciBhbmQgdGVzdGluZyBDLUtlcm1pdCA4LjAsIGl0IHdhcyBkaXNjb3ZlcmVkCisgICB0aGF0IGJpbmFyaWVzIGJ1aWx0IGZvciBvbmUgdmVyc2lvbiBvZiBUcnU2NCBVbml4IChlLmcuIDQuMEcpIG1pZ2h0CisgICBleGhpYml0IHZlcnkgc3RyYW5nZSBiZWhhdmlvciBpZiBydW4gb24gYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiBUcnU2NAorICAgVW5peCAoZS5nLiA1LjFBKS4gVGhlIHR5cGljYWwgc3ltcHRvbSB3YXMgdGhhdCBhIHNlY3Rpb24gb2YgdGhlCisgICBpbml0aWFsaXphdGlvbiBmaWxlIHdvdWxkIGJlIHNraXBwZWQsIG5vdGFibHkgbG9jYXRpbmcgdGhlIGRpYWxpbmcKKyAgIGFuZC9vciBuZXR3b3JrIGRpcmVjdG9yeSBhcyB3ZWxsIGFzIGZpbmRpbmcgYW5kIGV4ZWN1dGluZyB0aGUKKyAgIGN1c3RvbWl6YXRpb24gZmlsZSwgfi8ubXlrZXJtcmMuIFRoaXMgcHJvYmxlbSBhbHNvIGlzIHJlcG9ydGVkIHRvCisgICBvY2N1ciBvbiBUcnU2NCBVbml4IDUuMCAoUmV2IDczMikgZXZlbiB3aGVuIHJ1bm5pbmcgYSBDLUtlcm1pdCBiaW5hcnkKKyAgIHRoYXQgd2FzIGJ1aWx0IHRoZXJlLiBIb3dldmVyLCB0aGUgVHJ1NjQgNS4xQSBiaW5hcnkgd29ya3MgY29ycmVjdGx5CisgICBvbiA1LjAuIEdvIGZpZ3VyZS4KKworICAgV2hlbiBtYWtpbmcgVGVsbmV0IGNvbm5lY3Rpb25zIHRvIGEgRGlnaXRhbCBVbml4IG9yIFRydTY0IHN5c3RlbSwgYW5kCisgICB5b3VyIFRlbG5ldCBjbGllbnQgZm9yd2FyZHMgeW91ciB1c2VyIG5hbWUsIHRoZSBUZWxuZXQgc2VydmVyCisgICBldmlkZW50bHkgc3R1ZmZzIHRoZSB1c2VybmFtZSBpbnRvIGxvZ2luJ3Mgc3RhbmRhcmQgaW5wdXQsIGFuZCB5b3UKKyAgIHNlZToKKworICBsb2dpbjogaXZhbgorICBQYXNzd29yZDoKKworICAgVGhpcyBpcyBjbGVhcmx5IGdvaW5nIHRvIHBsYXkgaGF2b2Mgd2l0aCBzY3JpcHRzIHRoYXQgbG9vayBmb3IKKyAgICJsb2dpbjoiLiBXb3JrYXJvdW5kICh3aGVuIEtlcm1pdCBpcyB5b3VyIFRlbG5ldCBjbGllbnQpOiBTRVQgTE9HSU4KKyAgIFVTRVIgdG8gbm90aGluZywgdG8gcHJldmVudCBLZXJtaXQgZnJvbSBzZW5kaW5nIHlvdXIgdXNlciBJRC4KKworICAgQmVmb3JlIHlvdSBjYW4gdXNlIGEgc2VyaWFsIHBvcnQgb24gYSBuZXcgRGlnaXRhbCBVbml4IHN5c3RlbSwgeW91CisgICBtdXN0IHJ1biB1dWNwc2V0dXAgdG8gZW5hYmxlIG9yIGNvbmZpZ3VyZSB0aGUgcG9ydC4gRXZpZGVudGx5IHRoZQorICAgL2Rldi90dHkwMCBhbmQgMDEgZGV2aWNlcyB0aGF0IGFwcGVhciBpbiB0aGUgY29uZmlndXJhdGlvbiBhcmUgbm90CisgICB1c2FibGU7IHV1Y3BzZXR1cCB0dXJucyB0aGVtIGludG8gL2Rldi90dHlkMDAgYW5kIDAxLCB3aGljaCBhcmUuIE5vdGUKKyAgIHRoYXQgdXVjcHNldHVwIGFuZCBvdGhlciB1dWNwLWZhbWlseSBwcm9ncmFtcyBhcmUgcXVpdGUgcHJpbWl0aXZlIC0tCisgICB0aGV5IG9ubHkga25vdyBhYm91dCBzcGVlZHMgdXAgdG8gOTYwMCBicHMgYW5kIHRoZWlyIHNlbGVjdGlvbiBvZgorICAgbW9kZW1zIGRhdGVzIGZyb20gdGhlIGVhcmx5IDE5ODBzLiBOb25lIG9mIHRoaXMgYWZmZWN0cyBLZXJtaXQsIHRob3VnaAorICAgLS0gd2l0aCBDLUtlcm1pdCwgeW91IGNhbiB1c2Ugc3BlZWRzIHVwIHRvIDExNTIwMCBicHMgKGF0IGxlYXN0IGluCisgICBEVTQuMCBhbmQgbGF0ZXIpIGFuZCBtb2Rlcm4gbW9kZW1zIHdpdGggaGFyZHdhcmUgZmxvdyBjb250cm9sIGFuZCBhbGwKKyAgIHRoZSByZXN0LgorCisgICBSZXBvcnRlZGx5LCBpZiBhIG1vZGVtIGlzIHNldCBmb3IgJlMwIChhc3NlcnQgRFNSIGF0IGFsbCB0aW1lcyksIHRoZQorICAgc3lzdGVtIHJlc2V0cyBvciBkcm9wcyBEVFIgZXZlcnkgMzAgc2Vjb25kczsgcmVwb3J0ZWRseSBERUMgc2F5cyB0bworICAgc2V0ICZTMS4KKworICAgRGlnaXRhbCBVbml4IDMuMiBldmlkZW50bHkgd2FudHMgdG8gYmVsaWV2ZSB5b3VyIHRlcm1pbmFsIGlzIG9uZSBsaW5lCisgICBsb25nZXIgdGhhbiB5b3Ugc2F5IGl0IGlzLCBlLmcuIHdoZW4gYSAibW9yZSIgb3IgIm1hbiIgY29tbWFuZCBpcworICAgZ2l2ZW4uIFRoaXMgaXMgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBDLUtlcm1pdCwgYnV0IHRlbmRzIHRvIGFubm95CisgICB0aG9zZSB3aG8gdXNlIEtlcm1pdCBvciBvdGhlciB0ZXJtaW5hbCBlbXVsYXRvcnMgdG8gYWNjZXNzIERpZ2l0YWwKKyAgIFVuaXggc3lzdGVtcy4gV29ya2Fyb3VuZDogdGVsbCBVbml4IHRvICJzdHR5IHJvd3MgMjMiIChvciB3aGF0ZXZlcikuCisKKyAgIFJlcG9ydGVkbHksIHRoZXJlIGlzIHNvbWUgYml6YXJyZSBiZWhhdmlvciB3aGVuIHRyeWluZyB0byB1c2UgYQorICAgdmVyc2lvbiBvZiBDLUtlcm1pdCBidWlsdCBvbiBvbmUgRGlnaXRhbCBVbml4IDQuMCBzeXN0ZW0gb24gYW5vdGhlcgorICAgb25lLCBwb3NzaWJseSBkdWUgdG8gZGlmZmVyaW5nIE9TIG9yIGxpYnJhcnkgcmV2aXNpb24gbGV2ZWxzOyBmb3IKKyAgIGV4YW1wbGUsIHRoZSBpbmFiaWxpdHkgdG8gY29ubmVjdCB0byBjZXJ0YWluIFRDUC9JUCBob3N0cy4gU29sdXRpb246CisgICByZWJ1aWxkIEMtS2VybWl0IGZyb20gc291cmNlIGNvZGUgb24gdGhlIHN5c3RlbSB3aGVyZSB5b3Ugd2lsbCBiZQorICAgdXNpbmcgaXQuCisKKyAgIERpZ2l0YWwgVW5peCB0Z2V0c3RyKCkgY2F1c2VzIGEgc2VnbWVudGF0aW9uIGZhdWx0LiBDLUtlcm1pdCA3LjAgYWRkZWQKKyAgICNpZmRlZnMgdG8gYXZvaWQgY2FsbGluZyB0aGlzIHJvdXRpbmUgaW4gRGlnaXRhbCBVbml4LiBBcyBhIHJlc3VsdCwKKyAgIHRoZSBTQ1JFRU4gY29tbWFuZHMgYWx3YXlzIHNlbmQgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIC0tIGV2ZW4gdGhvdWdoCisgICBjdXJzZXMga25vd3MgeW91ciBhY3R1YWwgdGVybWluYWwgdHlwZS4KKworICAgUmVwb3J0ZWR5IHRoZSBUcnU2NCBVbml4IDQuMEUgMTA5MSBUZWxuZXQgc2VydmVyIGRvZXMgbm90IHRvbGVyYXRlCisgICBzdHJlYW1pbmcgdHJhbnNmZXJzIGludG8gaXRzZWxmLCBhdCBsZWFzdCBub3Qgd2hlbiB0aGUgc2VuZGluZyBLZXJtaXQKKyAgIGlzIG9uIHRoZSBzYW1lIGxvY2FsIG5ldHdvcmsuIFNvbHV0aW9uOiB0ZWxsIG9uZSBLZXJtaXQgb3IgdGhlIG90aGVyCisgICAob3IgYm90aCkgdG8gInNldCBzdHJlYW1pbmcgb2ZmIi4gVGhpcyBtaWdodCBvciBtaWdodCBiZSB0aGUgY2FzZSB3aXRoCisgICBlYXJsaWVyIGFuZC9vciBsYXRlciBUcnU2NCwgRGlnaXRhbCBVbml4LCBhbmQgT1NGLzEgcmVsZWFzZXMuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4xNC4gQy1LRVJNSVQgQU5EIFNHSSBJUklYCisKKyAgIFsgWzQ4N11Ub3AgXSBbIFs0ODhdQ29udGVudHMgXSBbIFs0ODldU2VjdGlvbiBDb250ZW50cyBdIFsgWzQ5MF1OZXh0IF0KKyAgIFsgWzQ5MV1QcmV2aW91cyBdCisKKyAgIFNlZSBhbHNvOgorICAgICAqIFRoZSBbNDkyXWNvbXAuc3lzLnNnaS5taXNjIGFuZCBbNDkzXWNvbXAuc3lzLnNnaS5hZG1pbiBuZXdzZ3JvdXBzLgorICAgICAgIFs0OTRdVGhlIFNHSSB3ZWJzaXRlCisgICAgICogVGhlIFNHSSBGQVE6CisgICAgICAgICAgKyBbNDk1XWh0dHA6Ly93d3ctdml6LnRhbXUuZWR1L35zZ2ktZmFxLworICAgICAgICAgICsgWzQ5Nl1mdHA6Ly92aXoudGFtdS5lZHUvcHViL3NnaS9mYXEvCisKKyAgIEFib3V0IElSSVggdmVyc2lvbiBudW1iZXJzOiAidW5hbWUgLWEiIHRlbGxzIHRoZSAidHdvLWRpZ2l0IiB2ZXJzaW9uCisgICBudW1iZXIsIHN1Y2ggYXMgIjUuMyIgb3IgIjYuNSIuIFRoZSB0aHJlZS1kaWdpdCBmb3JtIGNhbiBiZSBzZWVuIHdpdGgKKyAgICJ1bmFtZSAtUiIuICh0aGlzIGluZm9ybWF0aW9uIGlzIHVuYXZhaWxhYmxlIGF0IHRoZSBzaW1wbGUgQVBJIGxldmVsKS4KKyAgIFN1cHBvc2VkbHkgYWxsIHRocmVlLWRpZ2l0IHZlcnNpb25zIHdpdGhpbiB0aGUgc2FtZSB0d28tZGlnaXQgdmVyc2lvbgorICAgKGUuZy4gNi41LjIsIDYuNS4zKSBhcmUgYmluYXJ5IGNvbXBhdGlibGU7IGkuZS4gYSBiaW5hcnkgYnVpbHQgb24gYW55CisgICBvbmUgb2YgdGhlbSBzaG91bGQgcnVuIG9uIGFsbCBvdGhlcnMuIFRoZSAibSIgc3VmZml4IGRlbm90ZXMganVzdAorICAgcGF0Y2hlczsgdGhlICJmIiBzdWZmaXggaW5kaWNhdGVzIHRoYXQgZmVhdHVyZXMgd2VyZSBhZGRlZC4KKworICAgQW4gSVJJWCBiaW5hcnkgYnVpbHQgb24gbG93ZXIgTUlQUyBtb2RlbCAoSW5zdHJ1Y3Rpb24gU2V0CisgICBBcmNoaXRlY3R1cmUsIElTQSkgY2FuIHJ1biBvbiBoaWdoZXIgbW9kZWxzLCBidXQgbm90IHZpY2UgdmVyc2E6CisKKyAgICAgTUlQUzEgUjMwMDAgYW5kIGJlbG93CisgICAgIE1JUFMyIFI0MDAwCisgICAgIE1JUFMzIFI0eDAwCisgICAgIE1JUFM0IFI1MDAwIGFuZCBhYm92ZQorCisgICBGdXJ0aGVybW9yZSwgdGhlcmUgYXJlIGRpZmZlcmVudCBBcHBsaWNhdGlvbiBCaW5hcnkgSW5mZXJmYWNlcyAoQUJJcyk6CisKKyAgICAgQ09GRiAgICAzMiBiaXRzLCBJUklYIDUuMywgNS4yLCA1LjEsIDQueCBhbmQgYmVsb3cKKyAgICAgbzMyIEVMRiAzMiBiaXRzLCBJUklYIDUuMywgNi4wIC0gNi41CisgICAgIE4zMiBFTEYgMzIgYml0cywgSVJJWCA2LjIgLSA2LjUKKyAgICAgTjY0IEVMRiA2NCBiaXRzLCBJUklYIDYuMiAtIDYuNQorCisgICBUaHVzIGEgcHJlYnVpbHQgSVJJWCBiaW5hcnkgd29ya3Mgb24gYSBwYXJ0aWN1bGFyIG1hY2hpbmUgb25seSBpZiAoYSkKKyAgIHRoZSBtYWNoaW5lJ3MgSVJJWCB2ZXJzaW9uICh0byBvbmUgZGVjaW1hbCBwbGFjZSkgaXMgZXF1YWwgdG8gb3IKKyAgIGdyZWF0ZXIgdGhhbiB0aGUgdmVyc2lvbiB1bmRlciB3aGljaCB0aGUgYmluYXJ5IHdhcyBidWlsdDsgKGIpIHRoZQorICAgbWFjaGluZSdzIE1JUFMgbGV2ZWwgaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGF0IG9mIHRoZSBiaW5hcnk7IGFuZAorICAgKGMpIHRoZSBtYWNoaW5lIHN1cHBvcnRzIHRoZSBBQkkgb2YgdGhlIGJpbmFyeS4gSWYgYWxsIHRocmVlCisgICBjb25kaXRpb25zIGFyZSBub3Qgc2F0aXNmaWVkLCBvZiBjb3Vyc2UsIHlvdSBjYW4gYnVpbGQgYSBiaW5hcnkKKyAgIHlvdXJzZWxmIGZyb20gc291cmNlIGNvZGUgc2luY2UsIHVubGlrZSBzb21lIG90aGVyIFVuaXggdmVuZG9ycywgU0dJCisgICBkb2VzIHN1cHBseSBhIEMgY29tcGlsZXIgYW5kIGxpYnJhcmllcy4KKworICAgU0dJIGRpZCBub3Qgc3VwcGx5IGFuIEFQSSBmb3IgaGFyZHdhcmUgZmxvdyBjb250cm9sIHByaW9yIHRvIElSSVggNS4yLgorICAgQy1LZXJtaXQgNi4xIGFuZCBoaWdoZXIgZm9yIElSSVggNS4yIGFuZCBoaWdoZXIgc3VwcG9ydHMgaGFyZHdhcmUgZmxvdworICAgY29udHJvbCBpbiB0aGUgbm9ybWFsIHdheSwgdmlhICJzZXQgZmxvdyBydHMvY3RzIi4KKworICAgRm9yIGhhcmR3YXJlIGZsb3cgY29udHJvbCBvbiBlYXJsaWVyIElSSVggYW5kL29yIEMtS2VybWl0IHZlcnNpb25zLAorICAgdXNlIHRoZSB0dHlmKiAobW9kZW0gY29udHJvbCBBTkQgaGFyZHdhcmUgZmxvdyBjb250cm9sKSBkZXZpY2VzIGFuZAorICAgbm90IHRoZSB0dHlkKiAoZGlyZWN0KSBvciB0dHltKiAobW9kZW0gY29udHJvbCBidXQgbm8gaGFyZHdhcmUgZmxvdworICAgY29udHJvbCkgb25lcywgYW5kIG9idGFpbiB0aGUgcHJvcGVyICJoYXJkd2FyZSBoYW5kc2hha2luZyIgY2FibGUgZnJvbQorICAgU0dJLCB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgb25lcyBmb3IgdGhlIE1hY2ludG9zaCBhbmQgTmVYVAorICAgZXZlbiB0aG91Z2ggdGhleSBsb29rIHRoZSBzYW1lICgibWFuIHNlcmlhbCIgZm9yIGZ1cnRoZXIgaW5mbykgYW5kCisgICB0ZWxsIEtlcm1pdCB0byAic2V0IGZsb3cga2VlcCIgYW5kICJzZXQgbW9kZW0gZmxvdyBydHMvY3RzIi4KKworICAgU2VyaWFsIHNwZWVkcyBoaWdoZXIgdGhhbiAzODQwMCBhcmUgYXZhaWxhYmxlIGluIElSSVggNi4yIGFuZCBsYXRlciwKKyAgIG9uIE8tY2xhc3MgbWFjaGluZXMgKGUuZy4gT3JpZ2luLCBPY3RhbmUpIG9ubHksIGFuZCBhcmUgc3VwcG9ydGVkIGJ5CisgICBDLUtlcm1pdCA3LjAgYW5kIGxhdGVyLiBDb21tYW5kcyBzdWNoIGFzICJzZXQgc3BlZWQgMTE1MjAwIiBtYXkgYmUKKyAgIGdpdmVuIG9uIG90aGVyIG1vZGVscyAoZS5nLiBJcmlzLCBJbmR5LCBJbmRpZ28pIGJ1dCB3aWxsIGZhaWwgYmVjYXVzZQorICAgdGhlIE9TIHJlcG9ydHMgYW4gaW52YWxpZCBzcGVlZCBmb3IgdGhlIGRldmljZS4KKworICAgRXhwZXJpbWVudGF0aW9uIHdpdGggYm90aCBJUklYIDUuMyBhbmQgNi4yIHNob3dzIHRoYXQgd2hlbiBsb2dnZWQgaW4KKyAgIHRvIElSSVggdmlhIFRlbG5ldCwgdGhhdCByZW1vdGUtbW9kZSBDLUtlcm1pdCBjYW4ndCBzZW5kIGZpbGVzIGlmIHRoZQorICAgcGFja2V0IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gNDA5NjsgdGhlIFRlbG5ldCBzZXJ2ZXIgZXZpZGVudGx5IGhhcworICAgdGhpcyByZXN0cmljdGlvbiAob3IgYnVnKSwgc2luY2UgdGhlcmUgaXMgbm8gcHJvYmxlbSBzZW5kaW5nIGxvbmcKKyAgIHBhY2tldHMgb24gc2VyaWFsIG9yIHJsb2dpbiBjb25uZWN0aW9ucy4gSG93ZXZlciwgaXQgY2FuIHJlY2VpdmUgZmlsZXMKKyAgIHdpdGggbm8gcHJvYmxlbSBpZiB0aGUgcGFja2V0IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gNDA5Ni4gQXMgYQorICAgd29ya2Fyb3VuZCwgdGhlIEZBU1QgbWFjcm8gZm9yIElSSVggaW5jbHVkZXMgInNldCBzZW5kIHBhY2tldC1sZW5ndGgKKyAgIDQwMDAiLiBJUklYIDYuNS4xIGRvZXMgbm90IGhhdmUgdGhpcyBwcm9ibGVtLCBzbyBldmlkZW50bHkgaXQgd2FzCisgICBmaXhlZCBzb21lIHRpbWUgYWZ0ZXIgSVJJWCA2LjIuIFRlc3RzIHNob3cgZmlsZS10cmFuc2ZlciBzcGVlZHMgYXJlCisgICBiZXR0ZXIgKG5vdCB3b3JzZSkgd2l0aCA4SyBwYWNrZXRzIHRoYW4gd2l0aCA0SyBwYWNrZXRzIGZyb20gSVJJWAorICAgNi41LjEuCisKKyAgIFJlcG9ydGVkbHkgc29tZSBJbmR5cyBoYXZlIGJhZCBzZXJpYWwgcG9ydCBoYXJkd2FyZS4gSVJJWCA1LjIsIGZvcgorICAgZXhhbXBsZSwgbmVlZHMgcGF0Y2ggMTUxIHRvIHdvcmsgYXJvdW5kIHRoaXM7IG9yIHVwZ3JhZGUgdG8gYSBsYXRlcgorICAgcmVsZWFzZS4gU2ltaWxhcmx5LCBJUklYIDUuMiBoYXMgc2V2ZXJhbCBwcm9ibGVtcyB3aXRoIHNlcmlhbCBpL28sCisgICBmbG93IGNvbnRyb2wsIGV0Yy4gQWdhaW4sIHBhdGNoIG9yIHVwZ3JhZGUuCisKKyAgIFJlcG9ydGVkbHkgb24gbWFjaGluZXMgd2l0aCBJUklYIDQuMCwgS2VybWl0IGNhbm5vdCBiZSBzdXNwZW5kZWQgYnkKKyAgIHR5cGluZyB0aGUgc3VzcGVuZCAoInN3dGNoIikgY2hhcmFjdGVyIGlmIGl0IHdhcyBzdGFydGVkIGZyb20gY3NoLAorICAgZXZlbiB0aG91Z2ggb3RoZXIgcHJvZ3JhbXMgY2FuIGJlIHN1c3BlbmRlZCB0aGlzIHdheSwgYW5kIGV2ZW4gdGhvdWdoCisgICB0aGUgWiBhbmQgU1VTUEVORCBjb21tYW5kcyBzdGlsbCB3b3JrIGNvcnJlY3RseS4gVGhpcyBpcyBldmlkZW50bHkKKyAgIGJlY2F1c2UgSVJJWCdzIGNzaCBkb2VzIG5vdCBkZWxpdmVyIHRoZSBTSUdUU1RQIHNpZ25hbCB0byBLZXJtaXQuIFRoZQorICAgcmVhc29uIG90aGVyIHByb2dyYW1zIGNhbiBiZSBzdXNwZW5kZWQgaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgaXMKKyAgIHByb2JhYmx5IHRoYXQgdGhleSBkbyBub3QgdHJhcCBTSUdUU1RQIHRoZW1zZWx2ZXMsIHNvIHRoZSBzaGVsbCBpcworICAgZG9pbmcgdGhlIHN1c3BlbmRpbmcgcmF0aGVyIHRoYW4gdGhlIGFwcGxpY2F0aW9uLgorCisgICBBbHNvIHNlZSBub3RlcyBhYm91dCBJUklYIDMueCBpbiB0aGUgWzQ5N11DLUtlcm1pdCBmb3IgVW5peAorICAgSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucy4KKworICAgSWYgeW91IGhhdmUgcHJvYmxlbXMgbWFraW5nIFRDUC9JUCBjb25uZWN0aW9ucyBpbiB2ZXJzaW9ucyBvZiBJUklYCisgICBidWlsdCB3aXRoIEdDQyAyLjk1LjIsIHNlZSB0aGUgYnVncyBzZWN0aW9uIG9mOgorCisgIFs0OThdaHR0cDovL2ZyZWV3YXJlLnNnaS5jb20vSW5zdGFsbGFibGUvZ2NjLTIuOTUuMi5odG1sLgorCisgICBSZXBvcnRlZGx5LCBpZiB5b3UgYWxsb3cgZ2NjIHRvIGNvbXBpbGUgQy1LZXJtaXQgb24gSXJpeCB5b3Ugc2hvdWxkIGJlCisgICBhd2FyZSB0aGF0IHRoZXJlIG1pZ2h0IGJlIHByb2JsZW1zIHdpdGggc29tZSBvZiB0aGUgbmV0d29yayBjb2RlLiBUaGUKKyAgIHNwZWNpZmljcyBhcmUgYXQKKyAgIFs0OTldaHR0cDovL2ZyZWV3YXJlLnNnaS5jb20vSW5zdGFsbGFibGUvZ2NjLTIuOTUuMi5odG1sOyBzY3JvbGwgZG93bgorICAgdG8gdGhlICJrbm93biBidWdzIiBzZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMTUuIEMtS0VSTUlUIEFORCBUSEUgQkVCT1gKKworICAgWyBbNTAwXVRvcCBdIFsgWzUwMV1Db250ZW50cyBdIFsgWzUwMl1TZWN0aW9uIENvbnRlbnRzIF0gWyBbNTAzXU5leHQgXQorICAgWyBbNTA0XVByZXZpb3VzIF0KKworICAgU2VlIGFsc286IFRoZSBbNTA1XWNvbXAuc3lzLmJlIG5ld3Nncm91cC4KKworICAgVGhlIEJlQm94IGhhcyBiZWVuIGRpc2NvbnRpbnVlZCBhbmQgQmVPUyByZXBvc2l0aW9uZWQgZm9yIFBDCisgICBwbGF0Zm9ybXMuIFRoZSBQT1NJWCBwYXJ0cyBvZiBCZU9TIGFyZSBub3QgZmluaXNoZWQsIG5vciBpcyB0aGUKKyAgIHNvY2tldHMgbGlicmFyeSwgdGhlcmVmb3JlIGEgZnVsbHkgZnVuY3Rpb25hbCB2ZXJzaW9uIG9mIEMtS2VybWl0IGlzCisgICBub3QgcG9zc2libGUuIEluIHZlcnNpb24gNi4wIG9mIEMtS2VybWl0LCB3cml0dGVuIGZvciBCZU9TIERSNywgaXQgd2FzCisgICBwb3NzaWJsZSB0bzoKKworICAgICAqIHNldCBsaW5lIC9kZXYvc2VyaWFsMiAoYW5kIHByb2JhYmx5IHRoZSBvdGhlciBzZXJpYWwgcG9ydHMpCisgICAgICogc2V0IHNwZWVkIDExNTIwMCAoYW5kIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGxvd2VyIGJhdWQgcmF0ZXMpCisgICAgICogY29ubmVjdAorICAgICAqIHNldCBtb2RlbSB0eXBlIGhheWVzIChhbmQgbGlrZWx5IG90aGVycywgdG9vKQorICAgICAqIGRpYWwgcGhvbmUtbnVtYmVyCisgICAgICogc2V0IHNlbmQgcGFja2V0LWxlbmd0aCAyMDQ4IChvdGhlciBsZW5ndGhzIGZvciBib3RoIHNlbmQgYW5kCisgICAgICAgcmVjZWl2ZSkKKyAgICAgKiBzZXQgcmVjZWl2ZSBwYWNrZXQgbGVuZ3RoIDIwNDgKKyAgICAgKiBzZXQgZmlsZSB0eXBlIGJpbmFyeSAodGV4dCBtb2RlIHdvcmtzLCB0b28pICh3aXRoIHJlbW90ZSBrZXJtaXQKKyAgICAgICBzZXNzaW9uIGluIHNlcnZlciBtb2RlKQorICAgICAqIHB1dCBiZWRyb3AuanBnCisgICAgICogZ2V0IGJlZHJvcC5qcGcKKyAgICAgKiBnZXQgYmVkcm9wLmpwZyBiZWRyb3AuanBnMgorICAgICAqIGZpbmlzaCwgYnllCisKKyAgIFRoZSBmb2xsb3dpbmcgZG8gbm90IHdvcms6CisgICAgICoga2VybWl0IGRvZXMgbm90IGRldGVjdCBtb2RlbSBoYW5ndXAKKyAgICAgKiAhL1JVTi9QVVNIIFtjb21tYW5kbGluZSBjb21tYW5kXQorICAgICAqIFJ1bm5pbmcga2VybWl0IGluIHJlbW90ZSBtb2RlCisgICAgICogVXNpbmcgb3RoZXIgcHJvdG9jb2xzICh4L3kvem1vZGVtKQorICAgICAqIFRDUCBuZXR3b3JraW5nIGludGVyZmFjZSAoQmUncyBUQ1AvSVAgQVBJIGhhcyBhIHdheXMgdG8gZ28sIHN0aWxsKQorCisgICBDLUtlcm1pdCBkb2VzIG5vdCB3b3JrIG9uIEJlT1MgRFI4IGJlY2F1c2Ugb2YgY2hhbmdlcyBpbiB0aGUKKyAgIHVuZGVybHlpbmcgQVBJcy4gVW5mb3J0dW5hdGVseSBub3QgZW5vdWdoIGNoYW5nZXMgd2VyZSBtYWRlIHRvIGFsbG93CisgICB0aGUgcmVndWxhciBQT1NJWC1iYXNlZCBDLUtlcm1pdCB0byB3b3JrIGVpdGhlci4gTm90ZTogdGhlIGxhY2sgb2YgYQorICAgZm9yaygpIHNlcnZpY2UgcmVxdWlyZXMgdGhlIHNlbGVjdCgpLWJhc2VkIENPTk5FQ1QgbW9kdWxlLCBidXQgdGhlcmUKKyAgIGlzIG5vIHNlbGVjdCgpLiBUaGVyZSBpcyBhIHNlbGVjdCgpIGluIERSOCwgYnV0IGl0IGRvZXNuJ3Qgd29yay4KKworICAgQy1LZXJtaXQgNy4wIHdhcyBidWlsdCBmb3IgQmVPUyA0LjUgYW5kIHdvcmtzIGluIHJlbW90ZSBtb2RlLiBJdCBkb2VzCisgICBub3QgaW5jbHVkZSBuZXR3b3JraW5nIHN1cHBvcnQgc2luY2UgdGhlIEFQSXMgYXJlIHN0aWxsIG5vdCB0aGVyZS4gSXQKKyAgIGlzIG5vdCBrbm93biBpZiBkaWFsaW5nIG91dCB3b3JrcywgYnV0IHByb2JhYmx5IG5vdC4gQmUgZXhwZXJ0cyBhcmUKKyAgIHdlbGNvbWUgdG8gbGVuZCBhIGhhbmQuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4xNi4gQy1LRVJNSVQgQU5EIERHL1VYCisKKyAgIFsgWzUwNl1Ub3AgXSBbIFs1MDddQ29udGVudHMgXSBbIFs1MDhdU2VjdGlvbiBDb250ZW50cyBdIFsgWzUwOV1OZXh0IF0KKyAgIFsgWzUxMF1QcmV2aW91cyBdCisKKyAgIFNvbWVib2R5IGRvd25sb2FkZWQgdGhlIEMtS2VybWl0IDYuMCBiaW5hcnkgYnVpbHQgdW5kZXIgREcvVVggNS40MCBhbmQKKyAgIHJhbiBpdCB1bmRlciBERy9VWCA1LjRSMy4xMCAtLSBpdCB3b3JrZWQgT0sgZXhjZXB0IHRoYXQgZmlsZSBkYXRlcyBmb3IKKyAgIGluY29taW5nIGZpbGVzIHdlcmUgYWxsIHdyaXR0ZW4gYXMgMSBKYW4gMTk3MC4gQ2F1c2UgYW5kIGN1cmUgdW5rbm93bi4KKyAgIFdvcmthcm91bmQ6IFNFVCBBVFRSSUJVVEUgREFURSBPRkYuIEJldHRlcjogVXNlIGEgdmVyc2lvbiBvZiBDLUtlcm1pdAorICAgYnVpbHQgdW5kZXIgYW5kIGZvciBERy9VWCA1LjRSMy4xMC4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjE3LiBDLUtFUk1JVCBBTkQgU0VRVUVOVCBEWU5JWAorCisgICBbIFs1MTFdVG9wIF0gWyBbNTEyXUNvbnRlbnRzIF0gWyBbNTEzXVNlY3Rpb24gQ29udGVudHMgXSBbIFs1MTRdTmV4dCBdCisgICBbIFs1MTVdUHJldmlvdXMgXQorCisgICBSZXBvcnRlZGx5LCB3aGVuIGNvbWluZyBpbnRvIGEgU2VxdWVudCBVbml4IChEWU5JWCkgc3lzdGVtIHRocm91Z2ggYW4KKyAgIFguMjUgY29ubmVjdGlvbiwgS2VybWl0IGRvZXNuJ3Qgd29yayByaWdodCBiZWNhdXNlIHRoZSBTZXF1ZW50J3MKKyAgIEZJT05SRUFEIGlvY3RsIHJldHVybnMgaW5jb3JyZWN0IGRhdGEuIFRvIHdvcmsgYXJvdW5kLCB1c2UgdGhlCisgICAxLWNoYXJhY3Rlci1hdC1hLXRpbWUgdmVyc2lvbiBvZiBteXJlYWQoKSBpbiBja3V0aW8uYyAoaS5lLiB1bmRlZmluZQorICAgTVlSRUFEIGluIGNrdXRpby5jIGFuZCByZWJ1aWxkIHRoZSBwcm9ncmFtKS4gVGhpcyBpcyB1bnNhdGlzZnlpbmcKKyAgIGJlY2F1c2UgdHdvIHZlcnNpb25zIG9mIHRoZSBwcm9ncmFtIHdvdWxkIGJlIG5lZWRlZCAtLSBvbmUgZm9yIHVzZQorICAgb3ZlciBYLjI1LCBhbmQgdGhlIG90aGVyIGZvciBzZXJpYWwgYW5kIFRDUC9JUCBjb25uZWN0aW9ucy4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAzLjE4LiBDLUtFUk1JVCBBTkQge0ZSRUUsT1BFTixORVR9QlNECisKKyAgIFsgWzUxNl1Ub3AgXSBbIFs1MTddQ29udGVudHMgXSBbIFs1MThdU2VjdGlvbiBDb250ZW50cyBdIFsgWzUxOV1OZXh0IF0KKyAgIFsgWzUyMF1QcmV2aW91cyBdCisKKyAgIFNvbWUgTmViQlNEIHVzZXJzIGhhdmUgcmVwb3J0ZWQgZGlmZmljdWx0eSBlc2NhcGluZyBiYWNrIGZyb20gQ09OTkVDVAorICAgbW9kZSwgdXN1YWxseSB3aGVuIHJ1bm5pbmcgTmV0QlNEIG9uIG5vbi1QQyBoYXJkd2FyZS4gUHJvYmFibHkgYQorICAga2V5Ym9hcmQgaXNzdWUuCisKKyAgIE5ldEJTRCB1c2VycyBoYXZlIGFsc28gcmVwb3J0ZWQgdGhhdCBDLUtlcm1pdCBkb2Vzbid0IHBvcCBiYWNrIHRvIHRoZQorICAgcHJvbXB0IGlmIHRoZSBtb2RlbSBkcm9wcyBjYXJyaWVyLiBUaGlzIG5lZWRzIHRvIGJlIGNoZWNrZWQgb3V0ICYKKyAgIGZpeGVkIGlmIHBvc3NpYmxlLgorCisgICAoQWxsIHRoZSBhYm92ZSBzZWVtcyB0byB3b3JrIHByb3Blcmx5IGluIEMtS2VybWl0IDcuMCBhbmQgbGF0ZXIuKQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDMuMTkuIEMtS0VSTUlUIEFORCBNQUMgT1MgWCAoUmhhcHNvZHksIERhcndpbiwgSmFndWFyLCBQYW50aGVyKQorCisgICBbIFs1MjFdVG9wIF0gWyBbNTIyXUNvbnRlbnRzIF0gWyBbNTIzXVNlY3Rpb24gQ29udGVudHMgXSBbIFs1MjRdTmV4dCBdCisgICBbIFs1MjVdUHJldmlvdXMgXQorCisgICBNYWMgT1MgWCBpcyBBcHBsZSdzIDQuNEJTRCBVbml4IHZhcmlldHksIGNsb3NlbHkgcmVsYXRlZCB0byBGcmVlQlNELAorICAgYnV0IGRpZmZlcmVudC4gInVuYW1lIC1hIiBpcyBzaW5ndWxhcmx5IHVuaW5mb3JtYXRpdmUsIGFzIGluIExpbnV4LAorICAgZ2l2aW5nIG9ubHkgdGhlIERhcndpbiBrZXJuZWwgdmVyc2lvbiBudW1iZXIuIEFzIGZhciBhcyBJIGNhbiB0ZWxsLAorICAgdGhlcmUgaXMgbm8gd2F5IHRvIGZpbmQgb3V0IHRoZSBNYWMgT1MgWCB2ZXJzaW9uIG51bWJlciwgc3VjaCBhcyAxMC4zCisgICAoaW4gTGludXggeW91IGNhbiBmaW5kIHRoZSBkaXN0cmlidXRpb24gdmVyc2lvbiBpbiBhCisgICBkaXN0cmlidXRpb24tZGVwZW5kZW50IGZpbGUpLiBIZXJlIGFyZSBzb21lIHBvaW50cyB0byBiZSBhd2FyZSBvZjoKKworICAgICAqIFRoZSBiaWdnZXN0IGdvdGNoYSBmb3IgS2VybWl0IHVzZXJzIGlzIHRoYXQgTWFjIE9TIFggZG9lcyBub3QKKyAgICAgICBzdXBwb3J0IHNlcmlhbCBwb3J0cyBhbmQsIGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBkb2Vzbid0IHN1cHBvcnQKKyAgICAgICBpdHMgYnVpbHQtaW4gbW9kZW0gZWl0aGVyLCBmb3IgYW55dGhpbmcgb3RoZXIgdGhhbiBtYWtpbmcgSW50ZXJuZXQKKyAgICAgICBjb25uZWN0aW9ucy4gTWFjaW50b3NoZXMgY2FwYWJsZSBvZiBydW5uaW5nIE1hYyBPUyBYLCBzdWNoIGFzIHRoZQorICAgICAgIEc1LCBzb21lIHdpdGhvdXQgc2VyaWFsIHBvcnRzIGFuZCB3aXRob3V0IGFueSBBUElzIHRvIHN1cHBvcnQKKyAgICAgICB0aGVtLCBhbmQgYWxzbyB3aXRob3V0IHRoZSBVVUNQIGZhbWlseSBvZiBwcm9ncmFtcyAoaW5jbHVkaW5nIGN1KSwKKyAgICAgICBub3IgYW55IHN0YW5kYXJkIGZvciBzZXJpYWwtcG9ydCBsb2NrZmlsZSBkaXJlY3RvcnkuCisgICAgICogQXQgbGVhc3QgZWFybHkgdmVyc2lvbnMgb2YgTWFjIE9TIFggY2FtZSB3aXRob3V0IEN1cnNlcywgVGVybWxpYiwKKyAgICAgICBvciBUZXJtaW5mbyBsaWJyYXJpZXMuIExhdGVyIHZlcnNpb25zIHNlZW0gdG8gaGF2ZSBuY3Vyc2VzLiBLZXJtaXQKKyAgICAgICB1c2VzIGN1cnNlcyBmb3IgaXRzIGZpbGUtdHJhbnNmZXIgZGlzcGxheS4gU2VlIGVsc2V3aGVyZSBhYm91dAorICAgICAgIGN1cnNlcy12cy1uY3Vyc2VzIGNvbmZ1c2lvbi4KKyAgICAgKiBJbiB0aGUgSEZTKyBmaWxlIHN5c3RlbSwgZmlsZW5hbWVzIGFyZSBjYXNlLWZvbGRlZC4gVGh1cworICAgICAgICJtYWtlZmlsZSIgYW5kICJNYWtlZmlsZSIgYXJlIHRoZSBzYW1lIGZpbGUuIFRoZSBVRlMgZmlsZSBzeXN0ZW0KKyAgICAgICBpcywgbGlrZSBub3JtYWwgVW5peCwgY2FzZS1zZW5zaXRpdmUuCisgICAgICogRmlsZXMgdGhhdCBhcmUgY29tcG9zZWQgb2YgYSByZXNvdXJjZSBmb3JrIGFuZCBhIGRhdGEgZm9yay4uLiBJCisgICAgICAgZG91YnQgdGhhdCBDLUtlcm1pdCBkb2VzIGFueXRoaW5nIHVzZWZ1bCB3aXRoIHRoZW0uIFRoZXJlIGlzIG5vCisgICAgICAgY29kZSBpbiBDLUtlcm1pdCBmb3IgdHJhZGl0aW9uYWwgdHdvLWZvcmtlZCBNYWNpbnRvc2ggZmlsZXMsIGJ1dAorICAgICAgIGl0IGNvdWxkIGJlIGFkZGVkIGlmIHRoZXJlIGlzIGFueSBkZW1hbmQuCisgICAgICogSW4gY2FzZSB5b3Ugd2FudCB0byB0cmFuc2ZlciBhIHRyYWRpdGlvbmFsIE1hY2ludG9zaCB0ZXh0IGZpbGUgKG9yCisgICAgICAgZGF0YSBmb3JrIG9mIGEgZmlsZSB0aGF0IGlzIHBsYWluIHRleHQpLCB5b3UgY2FuIHVzZSB0aGVzZQorICAgICAgIEMtS2VybWl0IGNvbW1hbmRzOgorCitzZXQgZmlsZSBlb2wgY3IKK3NldCBmaWxlIGNoYXJhY3Rlci1zZXQgYXBwbGUtcXVpY2tkcmF3CitzZW5kIC90ZXh0IGZpbGVuYW1lCisKKyAgICAgKiBGaWxlIG9yIHBhdGhuYW1lcyB0aGF0IGluY2x1ZGUgc3BhY2VzIG11c3QgYmUgZW5jbG9zZWQgaW4gZWl0aGVyCisgICAgICAgZG91YmxlcXVvdGVzIG9yIGN1cmx5IGJyYWNlcyBpbiBDLUtlcm1pdCBjb21tYW5kcy4KKyAgICAgKiBNYWMgT1MgWCBoYXMgaXRzIG93biBwYWNrYWdlIGZvcm1hdCBmb3IgYXBwbGljYXRpb25zLCBjYWxsZWQKKyAgICAgICAiZmluayIuIFZhcmlvdXMgZmluayBwYWNrYWdlcyBmb3IgQy1LZXJtaXQgYXJlIGZsb2F0aW5nIGFyb3VuZAorICAgICAgIHRoYXQgYXJlIG5vdCBzdGFuZGFyZCByZWxlYXNlcy4gRm9yIGV4YW1wbGUsIHRoZXJlJ3MgYSBDLUtlcm1pdAorICAgICAgIDguMC4yMDEgcGFja2FnZSBpbiB3aGljaCBDLUtlcm1pdCB3YXMgbW9kaWZlZCAoYXQgbGVhc3QpIHRvIHVzZSBhCisgICAgICAgVVVDUCBsb2NrZmlsZSBkaXJlY3RvcnkgdGhhdCBkb2VzIG5vdCBleGlzdCBvbiB2YW5pbGxhIE1hYyBPUyBYCisgICAgICAgc3lzdGVtcy4KKworICAgIE1hYyBPUyBYIGFuZCBTZXJpYWwgUG9ydHMKKworICAgQXBwbGUgaXMgaW4gdGhlIGZvcmVmcm9udCBvZiBjb21wYW5pZXMgdGhhdCBiZWxpZXZlIHNlcmlhbCBwb3J0cyBoYXZlCisgICBubyB1c2UgaW4gdGhlIG1vZGVybiB3b3JsZCBhbmQgc28gaGFzIHNpbXBseSBlbGltaW5hdGVkIGFsbCB0cmFjZXMgb2YKKyAgIHRoZW0gZnJvbSBpdHMgbWFjaGluZXMgYW5kIE9TLiBCdXQgb2YgY291cnNlIHNlcmlhbCBwb3J0cyBhcmUgc3RpbGwKKyAgIG5lZWRlZCB0byBjb25uZWN0IG5vdCBvbmx5IHRvIGV4dGVybmFsIG1vZGVtcywgYnV0IGFsc28gdG8gdGhlIGNvbnRyb2wKKyAgIHBvcnRzIG9mIGh1YnMsIHJvdXRlcnMsIHRlcm1pbmFsIHNlcnZlcnMsIFBCWHMsIGFuZCBzaW1pbGFyIGRldmljZXMsCisgICBub3QgdG8gbWVudGlvbiBiYXJjb2RlIHJlYWRlcnMsIFBPUyBzeXN0ZW1zIGFuZCBjb21wb25lbnRzLCBhdXRvbWF0ZWQKKyAgIGZhY3RvcnktZmxvb3IgZXF1aXBtZW50LCBhbmQgc2NpZW50aWZpYywgbWVkaWNhbCwgYW5kIGxhYiBlcXVpcG1lbnQKKyAgICh0byBuYW1lIGEgZmV3KS4gQW1vbmcgd29ya2VycyBpbiB0aGVzZSBhcmVhcywgdGhlcmUgaXMgYSBuZWVkIHRvIGFkZAorICAgc2VyaWFsIHBvcnRzIGJhY2sgb250byB0aGlzIHBsYXRmb3JtLCB3aGljaCBpcyBiZWluZyBmaWxsZWQgYnkKKyAgIHRoaXJkLXBhcnR5IHByb2R1Y3RzIHN1Y2ggYXMgdGhlIFs1MjZdS2V5c3BhbiBVU0IgU2VyaWFsIEFkYXB0ZXIuIFRvCisgICB1c2UgdGhlIEtleXNwYW4gZGV2aWNlLCB5b3UgbXVzdCBpbnN0YWxsIHRoZSBhY2NvbXBhbnlpbmcgZGV2aWNlCisgICBkcml2ZXJzLCB3aGljaCB3aW5kIHVwIGdpdmluZyB5b3Ugc2VyaWFsIHBvcnRzIHdpdGggbmFtZXMgbGlrZQorICAgL2Rldi9jdS5VU0ExOUgzYjFQMS4xLgorCisgICBUbyBjb25maWd1cmUgeW91ciBNYWMgT1MgWCBzeXN0ZW0gdG8gYWxsb3cgQy1LZXJtaXQgdG8gdXNlIHRoZXNlIChvcgorICAgYW55IG90aGVyKSBzZXJpYWwgZGV2aWNlczoKKworICAgIDEuIHN1CisgICAgICAgY2hncnAgeHh4eCAvdmFyL3Nwb29sL2xvY2sKKyAgICAgICBjaG1vZCBnK3cgL3Zhci9zcG9vbC9sb2NrCisgICAgICAgY2hncnAgeHh4eCAvZGV2L2N1LioKKyAgICAgICAod2hlcmUgeHh4eCBpcyB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAgZm9yIHVzZXJzIHRvIHdob20gc2VyaWFsLXBvcnQKKyAgICAgICBhY2Nlc3MgaXMgdG8gYmUgZ3JhbnRlZCkuIFVzZSAiYWRtaW4iIG9yIG90aGVyIGV4aXN0aW5nIGdyb3VwLCBvcgorICAgICAgIGNyZWF0ZSBhIG5ldyBncm91cCBpZiBkZXNpcmVkLiBOQjoKKworICAgICBJbiB0aGUgYWJzZW5jZSBvZiBvZmZpY2lhbCBndWlkYW5jZSBmcm9tIEFwcGxlIG9yIGFueW9uZSBlbHNlLCB3ZQorICAgICBjaG9vc2UgL3Zhci9zcG9vbC9sb2NrIGFzIHRoZSBsb2NrZmlsZSBkaXJlY3RvcnkgYmVjYXVzZSB0aGlzCisgICAgIGRpcmVjdG9yeSAoYSkgYWxyZWFkeSBleGlzdHMgb24gdmFuaWxsYSBNYWMgT1MgWCBpbnN0YWxsYXRpb25zLCBhbmQKKyAgICAgKGIpIGl0IGlzIHRoZSBkaXJlY3RvcnkgdXNlZCBmb3Igc2VyaWFsLXBvcnQgbG9ja2ZpbGVzIG9uIG1hbnkKKyAgICAgb3RoZXIgcGxhdGZvcm1zLiAKKyAgICAyLiBQdXQgYWxsIHVzZXJzIHdobyBuZWVkIGFjY2VzcyB0byB0aGUgc2VyaWFsIHBvcnQgaW4gdGhlIHNhbWUKKyAgICAgICBncm91cC4KKyAgICAzLiBNYWtlIHN1cmUgdGhlIHNlcmlhbCBkZXZpY2UgZmlsZXMgdGhhdCBhcmUgdG8gYmUgdXNlZCBieSBDLUtlcm1pdAorICAgICAgIGhhdmUgZ3JvdXAgcmVhZC13cml0ZSBwZXJtaXNzaW9uIGFuZCAoaWYgeW91IGNhcmUpIGxhY2sgd29ybGQKKyAgICAgICByZWFkLXdyaXRlIHBlcm1pc3Npb24sIGUuZy46CisgICAgICAgY2htb2QgZytydyxvLXJ3IC9kZXYvY3UuKgorCisgICBJZiB5b3UgZG8gdGhlIGFib3ZlLCB0aGVuIHRoZXJlJ3Mgbm8gbmVlZCB0byBiZWNvbWUgcm9vdCB0byB1c2UKKyAgIEtlcm1pdCwgb3IgdG8gbWFrZSBLZXJtaXQgc3VpZCBvciBzZ2lkLiBKdXN0IGRvIHRoaXM6CisKK2NobW9kIDc3NSB3ZXJtaXQKK212IHdlcm1pdCAvdXNyL2xvY2FsL2Jpbi9rZXJtaXQKKworICAgKG9yIHdoYXRldmVyIHNwb3QgaXMgbW9yZSBhcHByb3ByaWF0ZSkuIEZvciBncmVhdGVyIGRldGFpbCBhYm91dAorICAgaW5zdGFsbGF0aW9uIChtYW4gcGFnZSwgZXRjKSwgWzUyN11DTElDSyBIRVJFLgorCisgICBCYWNrIHdoZW4gTWFjcyBoYWQgc2VyaWFsIHBvcnRzLCB0aGV5IHdlcmUgbm90IFJTLTIzMiAodGhlIHN0YW5kYXJkCisgICBmb3IgY29ubmVjdGluZyBjb21wdXRlcnMgd2l0aCBuZWFyYnkgbW9kZW1zKSBidXQgcmF0aGVyIFJTLTQyMiBvciAtNDIzCisgICAoYSBzdGFuZGFyZCBmb3IgY29ubmVjdGluZyBzZXJpYWwgZGV2aWNlcyBvdmVyIGxvbmdlciBkaXN0YW5jZXMpLgorICAgTWFjaW50b3NoIHNlcmlhbCBwb3J0cyBkbyBub3Qgc3VwcG9ydCBtb2RlbXMgd2VsbCBiZWNhdXNlIHRoZXkgZG8gbm90CisgICBoYXZlIGVub3VnaCB3aXJlcyAob3IgbW9yZSBwcm9wZXJseSBpbiB0aGUgY2FzZSBSUy00MjIvNDIzLCB3aXJlCisgICBwYWlycykgdG8gY29udmV5IGEgdXNlZnVsIHN1YnNldCBvZiBtb2RlbSBzaWduYWxzLiBUaGUgS2V5c3BhbiBVU0IKKyAgIGFkYXB0ZXIgZ2l2ZXMgeW91IHR3byBNaW5pLURpbjggUlMtNDIyIHBvcnRzLCB0aGF0IGFyZSBubyBiZXR0ZXIgKG9yCisgICB3b3JzZSkgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBtb2RlbXMgb3Igc2VyaWFsIGRldmljZXMgdGhhbiBhIHJlYWwgTWFjCisgICBEaW4tOCBwb3J0IHdhcy4gSW4gZXNzZW5zZSwgeW91IGdldCBEYXRhIEluLCBEYXRhIE91dCwgYW5kIHR3byBtb2RlbQorICAgc2lnbmFscy4gSXQgbG9va3MgdG8gbWUgYXMgaWYgdGhlIHNpZ25hbHMgY2hvc2VuIGJ5IEtleXNwYW4gYXJlIFJUUworICAgYW5kIENUUy4gVGhpcyBnaXZlcyB5b3UgaGFyZHdhcmUgZmxvdyBjb250cm9sLCBidXQgYXQgdGhlIGV4cGVuc2Ugb2YKKyAgIENhcnJpZXIgRGV0ZWN0LiBUaHVzIHRvIHVzZSBDLUtlcm1pdCB3aXRoIGEgS2V5c3BhbiBVU0Igc2VyaWFsIHBvcnQsCisgICB5b3UgbXVzdCB0ZWxsIEMtS2VybWl0IHRvOgorCitzZXQgbW9kZW0gdHlwZSBub25lICAgICAgICAgICAgICAgIDsgKGRvbid0IGV4cGVjdCBhIG1vZGVtKQorc2V0IGNhcnJpZXItd2F0Y2ggb2ZmICAgICAgICAgICAgICA7IChpZ25vcmUgY2FycmllciBzaWduYWwpCitzZXQgcG9ydCAvZGV2L2N1LlVTQTE5SDNiMVAxLjEgICAgIDsgKG9wZW4gdGhlIHBvcnQpCitzZXQgZmxvdyBydHMvY3RzICAgICAgICAgICAgICAgICAgIDsgKHRoaXMgaXMgdGhlIGRlZmF1bHQpCitzZXQgc3BlZWQgNTc2MDAgICAgICAgICAgICAgICAgICAgIDsgKG9yIHdoYXRldmVyKQorY29ubmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IChvciB3aGF0ZXZlcikKKworICAgVXNlIEN0cmwtXEMgaW4gdGhlIG5vcm1hbCBtYW5uZXIgdG8gZXNjYXBlIGJhY2sgdG8gdGhlIEMtS2VybWl0PgorICAgcHJvbXB0LiBLZXJtaXQgY2FuJ3QgcG9wIGJhY2sgdG8gaXRzIHByb21wdCBhdXRvbWF0aWNhbGx5IHdoZW4gQ2FycmllcgorICAgZHJvcHMgYmVjYXVzZSB0aGVyZSBpcyBubyBDYXJyaWVyIHNpZ25hbC4KKworICAgICAgICAgSW5zdHJ1Y3Rpb25zIGZvciB0aGUgYnVpbHQtaW4gbW9kZW0gcmVtYWluIHRvIGJlIHdyaXR0ZW4uCisKKyAgIExpbmtzOgorICAgICAqIFs1MjhdVW5peCB0aXBzIGZvciBNYWMgT1MgWCAoSmVycnkgU3RyYXR0b24pCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMy4yMC4gQy1LRVJNSVQgQU5EIENPSEVSRU5UCisKKyAgIFsgWzUyOV1Ub3AgXSBbIFs1MzBdQ29udGVudHMgXSBbIFs1MzFdU2VjdGlvbiBDb250ZW50cyBdIFsKKyAgIFs1MzJdUHJldmlvdXMgXQorCisgICBBbHNvIHNlZToKKworICAgICBbNTMzXWh0dHA6Ly93d3cudW5pLWdpZXNzZW4uZGUvZmFxL2FyY2hpdi9jb2hlcmVudC1mYXEuZ2VuZXJhbC9tc2cwMAorICAgMDAwLmh0bWwKKworICAgTWFyayBXaWxsaWFtcyBDT0hFUkVOVCB3YXMgcGVyaGFwcyB0aGUgZmlyc3QgY29tbWVyY2lhbCBVbml4LWJhc2VkCisgICBvcGVyYXRpbmcgc3lzdGVtIGZvciBQQ3MsIGZpcnN0IGFwcGVhcmluZyBhYm91dCAxOTgzIG9yIC04NCBmb3IgdGhlCisgICBQQy9YVCAoPyksIGFuZCBwb3B1bGFyIHVudGlsIGFib3V0IDE5OTMsIHdoZW4gTGludXggdG9vayBvdmVyLgorICAgQy1LZXJtaXQsIGFzIG9mIHZlcnNpb24gOC4wLCBpcyBzdGlsbCBjdXJyZW50IGZvciBDT0hFUkVOVCAzODYgNC4yCisgICAoaS5lLiBvbmx5IGZvciBpMzg2IGFuZCBhYm92ZSkuIEN1cnNlcyBpcyBpbmNsdWRlZCwgYnV0IGxvdHMgb2Ygb3RoZXIKKyAgIGZlYXR1cmVzIGFyZSBvbWl0dGVkIGR1ZSB0byBsYWNrIG9mIHRoZSBhcHByb3ByaWF0ZSBPUyBmZWF0dXJlcywgQVBJcywKKyAgIGxpYnJhcmllcywgaGFyZHdhcmUsIG9yIGp1c3Qgc3BhY2U6IGUuZy4gVENQL0lQLCBmbG9hdGluZy1wb2ludAorICAgYXJpdGhtZXRpYywgbGVhcm5lZCBzY3JpcHRzLiBFYXJsaWVyIHZlcnNpb25zIG9mIENPSEVSRU5UIHJhbiBvbiA4MDg2CisgICBhbmQgODAyODYsIGJ1dCB0aGVzZSBhcmUgdG8gc21hbGwgdG8gYnVpbGQgb3IgcnVuIEMtS2VybWl0LCBidXQKKyAgIEctS2VybWl0IHNob3VsZCBiZSBPSyAoYXMgbWlnaHQgYmUgYW5jaWVudCB2ZXJzaW9ucyBvZiBDLUtlcm1pdCkuCisKKyAgIFlvdSBjYW4gYWN0dWFsbHkgYnVpbGQgYSB2ZXJzaW9uIHdpdGggZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCAtLSBqdXN0CisgICB0YWtlIC1ETk9GTE9BVCBvdXQgb2YgQ0ZMQUdTIGFuZCBhZGQgLWxtIHRvIExJQlM7IE5PRkxPQVQgaXMgdGhlCisgICBkZWZhdWx0IGJlY2F1c2UgQ09IRVJFTlQgdGVuZHMgdG8gcnVuIG9uIG9sZCBQQ3MgdGhhdCBkb24ndCBoYXZlCisgICBmbG9hdGluZy1wb2ludCBoYXJkd2FyZS4gWW91IGNhbiBhbHNvIGFkZCAiLWYiIHRvIENGTEFHUyB0byBoYXZlIGl0CisgICBsaW5rIGluIHRoZSBmbG9hdGluZy1wb2ludCBlbXVsYXRpb24gbGlicmFyeS4gQWxzbyBJJ20gbm90IHN1cmUgd2h5CisgICAtRE5PTEVBUk4gaXMgaW5jbHVkZWQsIHNpbmNlIGl0IGRlcGVuZHMgb24gc2VsZWN0KCksIHdoaWNoIENPSEVSRU5UCisgICBoYXMuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC4gR0VORVJBTCBVTklYLVNQRUNJRklDIEhJTlRTLCBMSU1JVEFUSU9OUywgQU5EIEJVR1MKKworICAgWyBbNTM0XVRvcCBdIFsgWzUzNV1Db250ZW50cyBdIFsgWzUzNl1OZXh0IF0gWyBbNTM3XVByZXZpb3VzIF0KKworICA0LjEuIE1vZGVtIFNpZ25hbHMKKworICAgVGhlcmUgc2VlbXMgdG8gYmUgYW4gZXNjYWxhdGluZyBkZW1hbmQgZm9yIHRoZSBhYmlsaXR5IHRvIGNvbnRyb2wKKyAgICJkdW1iIHNlcmlhbCBkZXZpY2VzIiAoc3VjaCBhcyAic21hcnRjYXJkIHJlYWRlcnMiLCBiYXJjb2RlIHJlYWRlcnMsCisgICBldGMpIGJ5IGV4cGxpY2l0bHkgbWFuaXB1bGF0aW5nIG1vZGVtIHNpZ25hbHMsIHBhcnRpY3VsYXJseSBSVFMuIFRoaXMKKyAgIG1pZ2h0IGhhdmUgYmVlbiBlYXN5IHRvIGRvIGluIERPUywgd2hlcmUgdGhlcmUgaXMgbm8gb3BlcmF0aW5nIHN5c3RlbQorICAgc3RhbmRpbmcgYmV0d2VlbiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBzZXJpYWwgZGV2aWNlLCBidXQgaXQgaXMKKyAgIHByb2JsZW1hdGljIGluIFVuaXgsIHdoZXJlIG1vZGVtIHNpZ25hbHMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIHNlcmlhbAorICAgZGV2aWNlIGRyaXZlci4gSWYgdGhlIGRyaXZlciBkb2VzIG5vdCBwcm92aWRlIGFuIEFQSSBmb3IgZG9pbmcgdGhpcywKKyAgIHRoZW4gdGhlIGFwcGxpY2F0aW9uIGNhbid0IGRvIGl0LiBJZiBpdCBkb2VzIHByb3ZpZGUgYW4gQVBJLCBleHBlY3QgaXQKKyAgIHRvIGJlIHRvdGFsbHkgZGlmZmVyZW50IG9uIGVhY2ggVW5peCBwbGF0Zm9ybSwgc2luY2UgdGhlcmUgaXMgbm8KKyAgIHN0YW5kYXJkIGZvciB0aGlzLgorCisgIDQuMi4gTkZTIFRyb3VibGVzCisKKyAgIEJlZ2lubmluZyB3aXRoIEMtS2VybWl0IDYuMCwgdGhlIGRlZmF1bHQgQy1LZXJtaXQgcHJvbXB0IGluY2x1ZGVzIHlvdXIKKyAgIGN1cnJlbnQgKHdvcmtpbmcpIGRpcmVjdG9yeTsgZm9yIGV4YW1wbGU6CisKKyAgWy91c3Ivb2xnYV0gQy1LZXJtaXQ+CisKKyAgIChJbiBDLUtlcm1pdCA3LjAgdGhlIHNxdWFyZSBicmFjZXMgd2VyZSByZXBsYWNlZCBieSByb3VuZCBwYXJlbnRoZXNlcworICAgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggSVNPIDY0NiBuYXRpb25hbCBjaGFyYWN0ZXIgc2V0cy4pCisKKyAgIElmIHRoYXQgZGlyZWN0b3J5IGlzIG9uIGFuIE5GUy1tb3VudGVkIGRpc2ssIGFuZCBORlMgc3RvcHMgd29ya2luZyBvcgorICAgdGhlIGRpc2sgYmVjb21lcyB1bmF2YWlsYWJsZSwgQy1LZXJtaXQgd2lsbCBoYW5nIHdhaXRpbmcgZm9yIE5GUworICAgYW5kL29yIHRoZSBkaXNrIHRvIGNvbWUgYmFjay4gV2hldGhlciB5b3UgY2FuIGludGVycnVwdCBDLUtlcm1pdCB3aGVuCisgICBpdCBpcyBodW5nIHRoaXMgd2F5IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIE9TLiBLZXJtaXQgaGFzIGNhbGxlZCB0aGUKKyAgIG9wZXJhdGluZyBzeXN0ZW1zJ3MgZ2V0Y3dkKCkgZnVuY3Rpb24sIGFuZCBpcyB3YWl0aW5nIGZvciBpdCB0bworICAgcmV0dXJuLiBTb21lIHZlcnNpb25zIG9mIFVuaXggKGUuZy4gSFAtVVggOS54KSBhbGxvdyB0aGlzIGZ1bmN0aW9uIHRvCisgICBiZSBpbnRlcnJ1cHRlZCB3aXRoIFNJR0lOVCAoQ3RybC1DKSwgb3RoZXJzIChzdWNoIGFzIEhQLVVYIDgueCkgZG8KKyAgIG5vdC4gVG8gYXZvaWQgdGhpcyBlZmZlY3QsIHlvdSBjYW4gYWx3YXlzIHVzZSBTRVQgUFJPTVBUIHRvIGNoYW5nZQorICAgeW91ciBwcm9tcHQgdG8gc29tZXRoaW5nIHRoYXQgZG9lcyBub3QgaW52b2x2ZSBjYWxsaW5nIGdldGN3ZCgpLCBidXQKKyAgIGlmIE5GUyBpcyBub3QgcmVzcG9uZGluZywgQy1LZXJtaXQgd2lsbCBzdGlsbCBoYW5nIGFueSB0aW1lIHlvdSBnaXZlIGEKKyAgIGNvbW1hbmQgdGhhdCByZWZlcnMgdG8gYW4gTkZTLW1vdW50ZWQgZGlyZWN0b3J5LiBBbHNvIG5vdGUgdGhhdCBpbgorICAgc29tZSBjYXNlcywgdGhlIHVuaW50ZXJydXB0aWJpbGl0eSBvZiBORlMtZGVwZW5kZW50IHN5c3RlbSBvciBsaWJyYXJ5CisgICBjYWxscyBpcyBjb25zaWRlcmVkIGEgYnVnLCBhbmQgc29tZXRpbWVzIHRoZXJlIGFyZSBwYXRjaGVzLiBGb3IgSFAtVVgsCisgICBmb3IgZXhhbXBsZToKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZCBieToKKyAgSFAtVVggMTAuMjAgICAgIGxpYmMgICAgUEhDT184NzY0ICAgICAgICAgICAgICAgICAgICAgUEhDT18xNDg5MS9QSENPXzE2NzIzCisgIEhQLVVYIDEwLjEwICAgICBsaWJjICAgIFBIQ09fODc2MyAgICAgICAgICAgICAgICAgICAgIFBIQ09fMTQyNTQvUEhDT18xNjcyMgorICBIUC1VWCA5LnggICAgICAgbGliYyAgICBQSENPXzc3NDcgICAgICAgUzcwMCAgICAgICAgICBQSENPXzEzMDk1CisgIEhQLVVYIDkueCAgICAgICBsaWJjICAgIFBIQ09fNjc3OSAgICAgICBTODAwICAgICAgICAgIFBIQ09fMTExNjIKKworICA0LjMuIEMtS2VybWl0IGFzIExvZ2luIFNoZWxsCisKKyAgIFlvdSBtaWdodCBoYXZlIHJlYXNvbiB0byBtYWtlIEMtS2VybWl0IHRoZSBsb2dpbiBzaGVsbCBmb3IgYSBzcGVjaWZpYworICAgdXNlciwgYnkgZW50ZXJpbmcgdGhlIHBhdGhuYW1lIG9mIEtlcm1pdCAocG9zc2libHkgd2l0aCBjb21tYW5kLWxpbmUKKyAgIHN3aXRjaGVzLCBzdWNoIGFzIC14IHRvIHB1dCBpdCBpbiBzZXJ2ZXIgbW9kZSkgaW50byB0aGUgc2hlbGwgZmllbGQgb2YKKyAgIHRoZSAvZXRjL3Bhc3N3ZCBmaWxlLiBUaGlzIHdvcmtzIHByZXR0eSB3ZWxsLiBJbiBzb21lIGNhc2VzLCBmb3IKKyAgICJ1bHRpbWF0ZSBzZWN1cml0eSIsIHlvdSBtaWdodCB3YW50IHRvIHVzZSBhIHZlcnNpb24gYnVpbHQgd2l0aAorICAgLUROT1BVU0ggKHNlZSB0aGUgWzUzOF1Db25maWd1cmF0aW9ucyBPcHRpb25zIGRvY3VtZW50IGZvciB0aGlzLCBidXQKKyAgIGV2ZW4gaWYgeW91IGRvbid0LCB0aGVuIFBVU0hpbmcgb3Igc2hlbGxpbmcgb3V0IGZyb20gQy1LZXJtaXQganVzdAorICAgYnJpbmdzIHVwIGEgbmV3IGNvcHkgb2YgQy1LZXJtaXQgKGJ1dCB3YXJuaW5nOiB0aGlzIGRvZXMgbm90IHByZXZlbnQKKyAgIHRoZSB1c2VyIGZyb20gZXhwbGljaXRseSBydW5uaW5nIGEgc2hlbGw7IGUuZy4gInJ1biAvYmluL3NoIjsgdXNlCisgICBOT1BVU0ggdG8gcHJldmVudCB0aGlzKS4KKworICA0LjQuIEMtS2VybWl0IHZlcnN1cyBzY3JlZW4gYW5kIHNwbGl0dnQKKworICAgQy1LZXJtaXQgZmlsZSB0cmFuc2ZlcnMgd2lsbCBwcm9iYWJseSBub3Qgd29yayBpZiBhdHRlbXBlZCB0aHJvdWdoIHRoZQorICAgInNwbGl0dnQiIG9yIEdOVSAic2NyZWVuIiBwcm9ncmFtcyBiZWNhdXNlIHRoZSBzY3JlZW4gb3B0aW1pemF0aW9uIChvcgorICAgYXQgbGVhc3QsIGxpbmUgd3JhcHBpbmcsIGNvbnRyb2wtY2hhcmFjdGVyIGFic29ycHRpb24pIGRvbmUgYnkgdGhpcworICAgcGFja2FnZSBpbnRlcmZlcmVzIHdpdGggS2VybWl0J3MgcGFja2V0cy4KKworICAgVGhlIHNhbWUgY2FuIGFwcGx5IHRvIGFueSBvdGhlciBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgdXNlcidzCisgICBzZXNzaW9uIGlzIGNhcHR1cmVkLCBtb25pdG9yZWQsIHJlY29yZGVkLCBvciBtYW5pcHVsYXRlZC4gRXhhbXBsZXMKKyAgIGluY2x1ZGUgdGhlICdzY3JpcHQnIHByb2dyYW0gKGZvciBtYWtpbmcgYSB0eXBlc2NyaXB0IG9mIGEgc2Vzc2lvbiksCisgICB0aGUgQ29tcHV0cm9uaWNzIFBFRUsgcGFja2FnZSBhbmQgcGtzaCAoYXQgbGVhc3QgdmVyc2lvbnMgb2YgaXQgcHJpb3IKKyAgIHRvIDEuOUspLCBhbmQgc28gb24uCisKKyAgIFlvdSBtaWdodCB0cnkgdGhlIGZvbGxvd2luZyAtLSB3aGF0IHdlIGNhbGwgImRvb21zZGF5IEtlcm1pdCIgLS0KKyAgIHNldHRpbmdzIHRvIHB1c2ggcGFja2V0cyB0aHJvdWdoIGV2ZW4gdGhlIGRlbnNlc3QgYW5kIG1vc3Qgb2JzdHJ1Y3RpdmUKKyAgIGNvbm5lY3Rpb25zLCBzdWNoIGFzICJzY3JlZW4iIGFuZCAic3BsaXR2dCIgKGFuZCBjZXJ0YWluIGtpbmRzIG9mIDMyNzAKKyAgIHByb3RvY29sIGVtdWxhdG9ycyk6IEdpdmUgdGhlc2UgY29tbWFuZHMgdG8gQk9USCBLZXJtaXQgcHJvZ3JhbXM6CisKKyAgU0VUIEZMT1cgTk9ORQorICBTRVQgQ09OVFJPTCBQUkVGSVggQUxMCisgIFNFVCBSRUNFSVZFIFBBQ0tFVC1MRU5HVEggNzAKKyAgU0VUIFJFQ0VJVkUgU1RBUlQgNjIKKyAgU0VUIFNFTkQgU1RBUlQgNjIKKyAgU0VUIFNFTkQgUEFVU0UgMTAwCisgIFNFVCBCTE9DSyBCCisKKyAgIElmIGl0IHdvcmtzLCBpdCB3aWxsIGJlIHNsb3cuCisKKyAgNC41LiBDLUtlcm1pdCB2ZXJzdXMgRE9TIEVtdWxhdG9ycworCisgICBPbiBVbml4IHdvcmtzdGF0aW9ucyBlcXVpcHBlZCB3aXRoIERPUyBlbXVsYXRvcnMgbGlrZSBTb2Z0UEMsIHdhdGNoCisgICBvdXQgZm9yIHdoYXQgdGhlc2UgZW11bGF0b3JzIGRvIHRvIHRoZSBzZXJpYWwgcG9ydCBkcml2ZXJzLiBBZnRlcgorICAgdXNpbmcgYSBET1MgZW11bGF0b3IsIHBhcnRpY3VsYXJseSBpZiB5b3UgdXNlIGl0IHRvIHJ1biBET1MKKyAgIGNvbW11bmljYXRpb25zIHNvZnR3YXJlLCB5b3UgbWlnaHQgaGF2ZSB0byByZWNvbmZpZ3VyZSB0aGUgc2VyaWFsCisgICBwb3J0cyBmb3IgdXNlIGJ5IFVuaXguCisKKyAgNC42LiBDLUtlcm1pdCB2ZXJzdXMgSm9iIENvbnRyb2wKKworICAgSW50ZXJydXB0aW9uIGJ5IEN0cmwtWiBtYWtlcyBVbml4IEMtS2VybWl0IHRyeSB0byBzdXNwZW5kIGl0c2VsZiB3aXRoCisgICBraWxsKDAsU0lHVFNUUCksIGJ1dCBvbmx5IG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgam9iIGNvbnRyb2wsIGFzCisgICBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIgdGhlIHN5bWJvbCBTSUdUU1RQIGlzIGRlZmluZWQgKG9yIG9uIFBPU0lYIG9yCisgICBTVlI0IHN5c3RlbXMsIGlmIHN5Y29uZihfU0NfSk9CX0NPTlRST0wpIG9yIF9QT1NJWF9KT0JfQ09OVFJPTCBpbgorICAgYWRkaXRpb24gdG8gU0lHVFNUUCkuIEhvd2V2ZXIsIGlmIEtlcm1pdCBpcyBydW5uaW5nIHVuZGVyIGEgbG9naW4KKyAgIHNoZWxsIChzdWNoIGFzIHRoZSBvcmlnaW5hbCBCb3VybmUgc2hlbGwpIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBqb2IKKyAgIGNvbnRyb2wsIHRoZSB1c2VyJ3Mgc2Vzc2lvbiBoYW5ncyBhbmQgbXVzdCBiZSBsb2dnZWQgb3V0IGZyb20gYW5vdGhlcgorICAgdGVybWluYWwsIG9yIGh1bmcgdXAgb24uIFRoZXJlIGlzIG5vIHdheSBLZXJtaXQgY2FuIGRlZmVuZCBpdHNlbGYKKyAgIGFnYWluc3QgdGhpcy4gSWYgeW91IHVzZSBhIG5vbi1qb2IgY29udHJvbCBzaGVsbCBvbiBhIGNvbXB1dGVyIHRoYXQKKyAgIHN1cHBvcnRzIGpvYiBjb250cm9sLCBnaXZlIGEgY29tbWFuZCBsaWtlICJzdHR5IHN1c3AgdW5kZWYiIHRvIGZpeCBpdAorICAgc28gdGhlIHN1c3BlbmQgc2lnbmFsIGlzIG5vdCBhdHRhY2hlZCB0byBhbnkgcGFydGljdWxhciBrZXksIG9yIGdpdmUKKyAgIHRoZSBjb21tYW5kIFNFVCBTVVNQRU5EIE9GRiB0byBDLUtlcm1pdCwgb3IgYnVpbGQgQy1LZXJtaXQgd2l0aAorICAgLUROT0pDLgorCisgIDQuNy4gRGF0ZXMgYW5kIFRpbWVzCisKKyAgIFVuaXggdGltZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyB0eXBpY2FsbHkgYXBwbHkgbG9jYWxlIHJ1bGVzIHRvIHJldHVybgorICAgbG9jYWwgdGltZSBpbiB0ZXJtcyBvZiBhbnkgc2Vhc29uYWwgdGltZSB6b25lIGNoYW5nZSBpbiBlZmZlY3QgZm9yIHRoZQorICAgZ2l2ZW4gZGF0ZS4gVGhlIGRpZmZkYXRlIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgc2FtZSB0aW1lem9uZSBydWxlcworICAgYXJlIGluIGVmZmVjdCBmb3IgYm90aCBkYXRlcywgYnV0IGEgZGF0ZSB3aXRoIHRpbWV6b25lIGluZm9ybWF0aW9uCisgICB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgbG9jYWwgdGltZSB6b25lIGluIGVmZmVjdCBhdCB0aGUgZ2l2ZW4gdGltZSwKKyAgIGUuZy4sIGEgR01UIHNwZWNpZmljYXRpb24gd2lsbCBwcm9kdWNlIGVpdGhlciBhIFN0YW5kYXJkIFRpbWUgb3IKKyAgIERheWxpZ2h0IFNhdmluZ3MgVGltZSwgZGVwZW5kaW5nIG9uIHdoaWNoIGFwcGxpZXMgYXQgdGhlIGdpdmVuIHRpbWUuCisgICBBbiBleGFtcGxlIHVzaW5nIHRoZSAyMDAxIHNlYXNvbmFsIGNoYW5nZSBmcm9tIEVEVCAoLTA0MDApIHRvIEVTVAorICAgKC0wNTAwKToKKworICBDLUtlcm1pdD4gREFURSAyMDAxMTAyOCAwNTowMTowMiBHTVQgIDsgRURUCisgIDIwMDExMDI4IDAxOjAxOjAyCisgIEMtS2VybWl0PiBEQVRFIDIwMDExMDI4IDA2OjAxOjAyIEdNVCAgOyBFU1QKKyAgMjAwMTEwMjggMDE6MDE6MDIKKyAgQy1LZXJtaXQ+CisKKyAgIGJ1dCB0aGUgaW1wbGljaXQgY2hhbmdlIGluIHRpbWV6b25lIG9mZnNldCBpcyBub3QgcmVjb2duaXplZDoKKworICBDLUtlcm1pdD4gZWNobyBcZmRpZmZkYXRlKDIwMDExMDI4IDA1OjAxOjAyIEdNVCwgMjAwMTEwMjggMDY6MDE6MDIgR01UKQorICArMDowMAorICBDLUtlcm1pdD4KKworICAgRGF0ZS90aW1lIGFyaXRobWV0aWMsIG9mZnNldHMsIGRlbHRhIHRpbWVzLCBhbmQgdGltZXpvbmUgc3VwcG9ydCBhcmUKKyAgIG5ldyB0byBDLUtlcm1pdCA4LjAsIGFuZCBtaWdodCBiZSBleHBlY3RlZCB0byBldm9sdmUgYW5kIGltcHJvdmUgaW4KKyAgIHN1YnNlcXVlbnQgcmVsZWFzZXMuCisKKyAgIE9uIHNvbWUgcGxhdGZvcm1zLCBmaWxlcyBkb3dubG9hZGVkIHdpdGggSFRUUCByZWNlaXZlIHRoZSBjdXJyZW50CisgICB0aW1lc3RhbXAsIHJhdGhlciB0aGFuIHRoZSBIVFRQICJMYXN0IE1vZGlmaWVkIiB0aW1lICh0aGlzIGNhbiBiZQorICAgZml4ZWQgYnkgaW5jbHVkaW5nIHV0aW1lLmgsIGUuZy4gaW4gU3VuT1MgYW5kIFRydTY0Li4uKS4KKworICA0LjguIFBzZXVkb3Rlcm1pbmFscworCisgICBUaGUgU1NIIGFuZCBQVFkgY29tbWFuZHMgd29yayBieSBhc3NpZ25pbmcgYSBwc2V1ZG90ZXJtaW5hbCBhbmQKKyAgIHJlYWRpbmcgYW5kIHdyaXRpbmcgZnJvbSBpdC4gUGVyZm9ybWFuY2UgdmFyaWVzIGFjY29yZGluZyB0byB0aGUKKyAgIHNwZWNpZmljIHBsYXRmb3JtIHJhbmdpbmcgZnJvbSB2ZXJ5IGZhc3QgdG8gdmVyeSBmbG93LgorCisgICBTU0ggYW5kIFBUWSBjb21tYW5kcyBjYW4gZmFpbCBpZiAoYSkgYWxsIHBzZXVkb3Rlcm1pbmFscyBhcmUgaW4gdXNlOworICAgb3IgKGIpIHlvdSBkbyBub3QgaGF2ZSByZWFkL3dyaXRlIGFjY2VzcyB0byB0aGUgcHNldWRvdGVybWluYWwgdGhhdAorICAgd2FzIGFzc2lnbmVkLiBBbiBleGFtcGxlIG9mIChiKSB3YXMgcmVwb3J0ZWQgd2l0aCB0aGUgWmlwc2xhY2sKKyAgIFNsYWNrd2FyZSBMaW51eCBkaXN0cmlidXRpb24sIGluIHdoaWNoIHRoZSBwc2V1ZG90ZXJtaW5hbHMgd2VyZQorICAgY3JlYXRlZCB3aXRoIGNydy1yLS1yLS0gcGVybWlzc2lvbiwgaW5zdGVhZCBvZiBjcnctcnctcnctLgorCisgIDQuOS4gTWlzY2VsbGFuZW91cworCisgICAgICogUmVwb3J0ZWRseSwgdGhlIFVuaXggQy1LZXJtaXQgc2VydmVyLCB1bmRlciBzb21lIGNvbmRpdGlvbnMsIG9uCisgICAgICAgY2VydGFpbiBwYXJ0aWN1bGFyIHN5c3RlbXMsIGZhaWxzIHRvIGxvZyBvdXQgaXRzIGxvZ2luIHNlc3Npb24KKyAgICAgICB1cG9uIHJlY2VpcHQgb2YgYSBCWUUgY29tbWFuZC4gQmVmb3JlIHJlbHlpbmcgb24gdGhlIEJZRSBjb21tYW5kCisgICAgICAgd29ya2luZywgdGVzdCBpdCBhIGZldyB0aW1lcyB0byBtYWtlIHN1cmUgaXQgd29ya3Mgb24geW91ciBzeXN0ZW06CisgICAgICAgdGhlcmUgbWlnaHQgYmUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gb3Igc2VjdXJpdHkgbWVjaGFuaXNtcyB0bworICAgICAgIHByZXZlbnQgYW4gaW5mZXJpb3IgcHJvY2VzcyAobGlrZSBLZXJtaXQpIGZyb20ga2lsbGluZyBhIHN1cGVyaW9yCisgICAgICAgb25lIChsaWtlIHRoZSBsb2dpbiBzaGVsbCkuCisgICAgICogT24gQVQmVCA3MzAwICgzQjEpIG1hY2hpbmVzLCB5b3UgbWlnaHQgaGF2ZSB0byAic3R0eSBubDEiIGJlZm9yZQorICAgICAgIHN0YXJ0aW5nIEMtS2VybWl0LiBEbyB0aGlzIGlmIGNoYXJhY3RlcnMgYXJlIGxvc3QgZHVyaW5nCisgICAgICAgY29tbXVuaWNhdGlvbnMgb3BlcmF0aW9ucy4KKyAgICAgKiBVbmRlciB0aGUgYmFzaCBzaGVsbCAodmVyc2lvbnMgcHJpb3IgdG8gMS4wNyBmcm9tIENXUlUpLCAicHVzaGluZyIKKyAgICAgICB0byBhbiBpbmZlcmlvciBzaGVsbCBhbmQgdGhlbiBleGl0aW5nIGJhY2sgdG8gS2VybWl0IGxlYXZlcyBLZXJtaXQKKyAgICAgICBpbiB0aGUgYmFja2dyb3VuZCBzdWNoIHRoYXQgaXQgbXVzdCBiZSBleHBsaWNpdGx5IGZnJ2QuIFRoaXMgaXMKKyAgICAgICByZXBvcnRlZGx5IGZpeGVkIGluIHZlcnNpb24gMS4wNyBvZiBiYXNoIChhbmQgZGVmaW5pdGVseSBpbiBtb2Rlcm4KKyAgICAgICBiYXNoIHZlcnNpb25zKS4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA1LiBJTklUSUFMSVpBVElPTiBBTkQgQ09NTUFORCBGSUxFUworCisgICBbIFs1MzldVG9wIF0gWyBbNTQwXUNvbnRlbnRzIF0gWyBbNTQxXU5leHQgXSBbIFs1NDJdUHJldmlvdXMgXQorCisgICBDLUtlcm1pdCdzIGluaXRpYWxpemF0aW9uIGZpbGUgZm9yIFVuaXggaXMgLmtlcm1yYyAobG93ZXJjYXNlLCBzdGFydHMKKyAgIHdpdGggcGVyaW9kKSBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5LCB1bmxlc3MgS2VybWl0IHdhcyBidWlsdCB3aXRoIHRoZQorICAgc3lzdGVtLXdpZGUgaW5pdGlhbGl6YXRpb24tZmlsZSBvcHRpb24gKHNlZSB0aGUgWzU0M11DLUtlcm1pdCBmb3IgVW5peAorICAgSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucykuCisKKyAgIEMtS2VybWl0IGlkZW50aWZpZXMgeW91ciBob21lIGRpcmVjdG9yeSBiYXNlZCBvbiB0aGUgZW52aXJvbm1lbnQKKyAgIHZhcmlhYmxlLCBIT01FLiBNb3N0IFVuaXggc3lzdGVtcyBzZXQgdGhpcyB2YXJpYWJsZSBhdXRvbWF0aWNhbGx5IHdoZW4KKyAgIHlvdSBsb2cgaW4uIElmIEMtS2VybWl0IGNhbid0IGZpbmQgeW91ciBpbml0aWFsaXphdGlvbiBmaWxlLCBjaGVjaworICAgeW91ciBIT01FIHZhcmlhYmxlOgorCisgIGVjaG8gJEhPTUUgICAgICAoYXQgdGhlIFVuaXggcHJvbXB0KQorCisgICBvcjoKKworICBlY2hvIFwkKEhPTUUpICAgKGF0IHRoZSBDLUtlcm1pdCBwcm9tcHQpCisKKyAgIElmIEhPTUUgaXMgbm90IGRlZmluZWQsIG9yIGlzIGRlZmluZWQgaW5jb3JyZWN0bHksIGFkZCB0aGUgYXBwcm9wcmlhdGUKKyAgIGRlZmluaXRpb24gdG8geW91ciBVbml4IC5wcm9maWxlIG9yIC5sb2dpbiBmaWxlLCBkZXBlbmRpbmcgb24geW91cgorICAgc2hlbGw6CisKKyAgc2V0ZW52IEhPTUUgZnVsbC1wYXRobmFtZS1vZi15b3VyLWhvbWUtZGlyZWN0b3J5ICAoQy1TaGVsbCwgLmxvZ2luIGZpbGUpCisKKyAgIG9yOgorCisgIEhPTUU9ZnVsbC1wYXRobmFtZS1vZi15b3VyLWhvbWUtZGlyZWN0b3J5ICAgICAgICAgKHNoLCBrc2gsIC5wcm9maWxlIGZpbGUpCisgIGV4cG9ydCBIT01FCisKKyAgIE5PVEU6IFZhcmlvdXMgb3RoZXIgb3BlcmF0aW9ucyBkZXBlbmQgb24gdGhlIGNvcnJlY3QgZGVmaW5pdGlvbiBvZgorICAgSE9NRS4gVGhlc2UgaW5jbHVkZSB0aGUgInRpbGRlLWV4cGFuc2lvbiIgZmVhdHVyZSwgd2hpY2ggYWxsb3dzIHlvdSB0bworICAgcmVmZXIgdG8geW91ciBob21lIGRpcmVjdG9yeSBhcyAifiIgaW4gZmlsZW5hbWVzIHVzZWQgaW4gQy1LZXJtaXQKKyAgIGNvbW1hbmRzLCBlLmcuOgorCisgIHNlbmQgfi8ua2VybXJjCisKKyAgIGFzIHdlbGwgYXMgdGhlIFx2KGhvbWUpIHZhcmlhYmxlLgorCisgICBQcmlvciB0byB2ZXJzaW9uIDVBKDE5MCksIEMtS2VybWl0IHdvdWxkIGxvb2sgZm9yIGl0cyBpbml0aWFsaXphdGlvbgorICAgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgaXQgd2FzIG5vdCBmb3VuZCBpbiB0aGUgaG9tZQorICAgZGlyZWN0b3J5LiBUaGlzIGZlYXR1cmUgd2FzIHJlbW92ZWQgZnJvbSA1QSgxOTApIGJlY2F1c2UgaXQgd2FzIGEKKyAgIHNlY3VyaXR5IHJpc2suIFNvbWUgcGVvcGxlLCBob3dldmVyLCBsaWtlZCB0aGlzIGJlaGF2aW9yIGFuZCBoYWQKKyAgIC5rZXJtcmMgZmlsZXMgaW4gYWxsIHRoZWlyIGRpcmVjdG9yaWVzIHRoYXQgd291bGQgc2V0IHVwIHRoaW5ncworICAgYXBwcm9wcmlhdGVseSBmb3IgdGhlIGZpbGVzIHRoZXJlaW4uIElmIHlvdSB3YW50IHRoaXMgYmVoYXZpb3IsIHlvdQorICAgY2FuIGFjY29tcGxpc2ggaXQgaW4gdmFyaW91cyB3YXlzLCBmb3IgZXhhbXBsZToKKworICAgICAqIENyZWF0ZSBhIHNoZWxsIGFsaWFzLCBmb3IgZXhhbXBsZToKKyAgYWxpYXMga2Q9Imtlcm1pdCAtWSAuLy5rZXJtcmMiCisgICAgICogQ3JlYXRlIGEgLmtlcm1yYyBmaWxlIGluIHlvdXIgaG9tZSBkaXJlY3RvcnksIHdob3NlIGNvbnRlbnRzIGFyZToKKyAgdGFrZSAuLy5rZXJtcmMKKworICAgU3VwcG9zZSB5b3UgbmVlZCB0byBwYXNzIGEgcGFzc3dvcmQgZnJvbSB0aGUgVW5peCBjb21tYW5kIGxpbmUgdG8gYQorICAgQy1LZXJtaXQgc2NyaXB0IHByb2dyYW0sIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBkb2VzIG5vdCBzaG93IHVwIGluCisgICAicHMiIG9yICJ3IiBsaXN0aW5ncy4gSGVyZSBpcyBhIG1ldGhvZCAobm90IGd1YXJhbnRlZWQgdG8gYmUgMTAwJQorICAgc2VjdXJlLCBidXQgZGVmaW5pdGVseSBtb3JlIHNlY3VyZSB0aGFuIHRoZSBtb3JlIG9idmlvdXMgbWV0aG9kcyk6CisKKyAgZWNobyBteXBhc3N3b3JkIHwga2VybWl0IG15c2NyaXB0CisKKyAgIFRoZSAibXlzY3JpcHQiIGZpbGUgY29udGFpbnMgYWxsIHRoZSBjb21tYW5kcyB0aGF0IG5lZWQgdG8gYmUgZXhlY3V0ZWQKKyAgIGR1cmluZyB0aGUgS2VybWl0IHNlc3Npb24sIHVwIHRvIGFuZCBpbmNsdWRpbmcgRVhJVCwgYW5kIGFsc28gaW5jbHVkZXMKKyAgIGFuIEFTSyBvciBBU0tRIGNvbW1hbmQgdG8gcmVhZCB0aGUgcGFzc3dvcmQgZnJvbSBzdGFuZGFyZCBpbnB1dCwgd2hpY2gKKyAgIGhhcyBiZWVuIHBpcGVkIGluIGZyb20gdGhlIFVuaXggJ2VjaG8nIGNvbW1hbmQsIGJ1dCBpdCBtdXN0IG5vdAorICAgaW5jbHVkZSBhIENPTk5FQ1QgY29tbWFuZC4gT25seSAia2VybWl0IG15c2NyaXB0IiBzaG93cyB1cCBpbiB0aGUgcHMKKyAgIGxpc3RpbmcuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNi4gQ09NTVVOSUNBVElPTiBTUEVFRCBTRUxFQ1RJT04KKworICAgWyBbNTQ0XVRvcCBdIFsgWzU0NV1Db250ZW50cyBdIFsgWzU0Nl1OZXh0IF0gWyBbNTQ3XVByZXZpb3VzIF0KKworICAgVmVyc2lvbi03IGJhc2VkIFVuaXggaW1wbGVtZW50YXRpb25zLCBpbmNsdWRpbmcgNC4zIEJTRCBhbmQgZWFybGllcgorICAgYW5kIFVuaXggc3lzdGVtcyBiYXNlZCB1cG9uIEJTRCwgdXNlIGEgNC1iaXQgZmllbGQgdG8gcmVjb3JkIGEgc2VyaWFsCisgICBkZXZpY2UncyB0ZXJtaW5hbCBzcGVlZC4gVGhpcyBsZWF2ZXMgcm9vbSBmb3IgMTYgc3BlZWRzLCBvZiB3aGljaCB0aGUKKyAgIGZpcnN0IDE0IGFyZSBub3JtYWxseToKKworICAgICAwLCA1MCwgNzUsIDExMCwgMTM0LjUsIDE1MCwgMjAwLCAzMDAsIDYwMCwgMTIwMCwgMTgwMCwgMjQwMCwgNDgwMCwKKyAgICAgYW5kIDk2MDAKKworICAgVGhlIHJlbWFpbmluZyB0d28gYXJlIHVzdWFsbHkgY2FsbGVkIEVYVEEgYW5kIEVYVEIsIGFuZCBhcmUgZGVmaW5lZCBieQorICAgdGhlIHBhcnRpY3VsYXIgVW5peCBpbXBsZW1lbnRhdGlvbi4gQy1LZXJtaXQgZGV0ZXJtaW5lcyB3aGljaCBzcGVlZHMKKyAgIGFyZSBhdmFpbGFibGUgb24geW91ciBzeXN0ZW0gYmFzZWQgb24gd2hldGhlciBzeW1ib2xzIGZvciB0aGVtIGFyZQorICAgZGVmaW5lZCBpbiB5b3VyIHRlcm1pbmFsIGRldmljZSBoZWFkZXIgZmlsZXMuIEVYVEEgaXMgZ2VuZXJhbGx5CisgICBhc3N1bWVkIHRvIGJlIDE5MjAwIGFuZCBFWFRCIDM4NDAwLCBidXQgdGhlc2UgYXNzdW1wdGlvbnMgbWlnaHQgYmUKKyAgIHdyb25nLCBvciB0aGV5IG1pZ2h0IG5vdCBhcHBseSB0byBhIHBhcnRpY3VsYXIgZGV2aWNlIHRoYXQgZG9lcyBub3QKKyAgIHN1cHBvcnQgdGhlc2Ugc3BlZWRzLiBQcmVzdW1hYmx5LCBpZiB5b3UgdHJ5IHRvIHNldCBhIHNwZWVkIHRoYXQgaXMKKyAgIG5vdCBsZWdhbCBvbiBhIHBhcnRpY3VsYXIgZGV2aWNlLCB0aGUgZHJpdmVyIHdpbGwgcmV0dXJuIGFuIGVycm9yLCBidXQKKyAgIHRoaXMgY2FuIG5vdCBiZSBndWFyYW50ZWVkLgorCisgICBPbiB0aGVzZSBzeXN0ZW1zLCBpdCBpcyB1c3VhbGx5IG5vdCBwb3NzaWJsZSB0byBzZWxlY3QgYSBzcGVlZCBvZgorICAgMTQ0MDAgYnBzIGZvciB1c2Ugd2l0aCBWLjMyYmlzIG1vZGVtcy4gSW4gdGhhdCBjYXNlLCB1c2UgMTkyMDAgb3IKKyAgIDM4NDAwIGJwcywgY29uZmlndXJlIHlvdXIgbW9kZW0gdG8gbG9jayBpdHMgaW50ZXJmYWNlIHNwZWVkIGFuZCB0byB1c2UKKyAgIFJUUy9DVFMgZmxvdyBjb250cm9sLCBhbmQgdGVsbCBDLUtlcm1pdCB0byBTRVQgRkxPVyBSVFMvQ1RTIGFuZCBTRVQKKyAgIERJQUwgU1BFRUQtTUFUQ0hJTkcgT0ZGLgorCisgICBUaGUgc2l0dWF0aW9uIGlzIHNpbWlsYXIsIGJ1dCBkaWZmZXJlbnQsIGluIFN5c3RlbSBWLiBTVklEIFRoaXJkCisgICBFZGl0aW9uIGxpc3RzIHRoZSBzYW1lIHNwZWVkcywgMCB0aHJvdWdoIDM4NDAwLgorCisgICBTb21lIHZlcnNpb25zIG9mIFVuaXgsIGFuZC9vciB0ZXJtaW5hbCBkZXZpY2UgZHJpdmVycyB0aGF0IGNvbWUgd2l0aAorICAgY2VydGFpbiB0aGlyZC1wYXJ0eSBhZGQtaW4gaGlnaC1zcGVlZCBzZXJpYWwgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2VzLAorICAgdXNlIHRoZSBsb3cgImJhdWQgcmF0ZXMiIHRvIHN0YW5kIGZvciBoaWdoZXIgb25lcy4gRm9yIGV4YW1wbGUsIFNFVAorICAgU1BFRUQgNTAgZ2V0cyB5b3UgNTc2MDAgYnBzOyBTRVQgU1BFRUQgNzUgZ2V0cyB5b3UgNzY4MDA7IFNFVCBTUEVFRAorICAgMTEwIGdldHMgMTE1MjAwLgorCisgICBTQ08gT0RUIDMuMCBpcyBhbiBleGFtcGxlIHdoZXJlIGEgImJhdWQtcmF0ZS10YWJsZSBwYXRjaCIgY2FuIGJlCisgICBhcHBsaWVkIHRoYXQgY2FuIHJvdGF0ZSB0aGUgdHR5IGRyaXZlciBiYXVkIHJhdGUgdGFibGUgc3VjaCB0aGF0CisgICA2MDA9NTc2MDAgYW5kIDE4MDA9MTE1ayBiYXVkLiBTaW1pbGFybHkgZm9yIERpZ2lib2FyZAorICAgbXVsdGlwb3J0L3BvcnRzZXJ2ZXJzLCB3aGljaCBoYXZlIGEgImZhc3RiYXVkIiBzZXR0aW5nIHRoYXQgZG9lcyB0aGlzLgorICAgTGludXggaGFzIGEgInNldHNlcmlhbCIgY29tbWFuZCB0aGF0IGNhbiBkbyBpdCwgZXRjLgorCisgICBNb3JlIG1vZGVybiBVbml4ZXMgc3VwcG9ydCBQT1NJWC1iYXNlZCBzcGVlZCBzZXR0aW5nLCBpbiB3aGljaCB0aGUKKyAgIHNlbGVjdGlvbiBvZiBzcGVlZHMgaXMgbm90IGxpbWl0ZWQgYnkgYSA0LWJpdCBmaWVsZC4gQy1LZXJtaXQgNi4xCisgICBpbmNvcnBvcmF0ZXMgYSBuZXcgbWVjaGFuaXNtIGZvciBmaW5kaW5nIG91dCAoYXQgY29tcGlsZSB0aW1lKSB3aGljaAorICAgc2VyaWFsIHNwZWVkcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgZG9lcyBub3QKKyAgIGludm9sdmUgZWRpdGluZyBvZiBzb3VyY2UgY29kZSBieSBoYW5kOyBvbiBzeXN0ZW1zIGxpa2UgU29sYXJpcyA1LjEsCisgICBJUklYIDYuMiwgYW5kIFNDTyBPU1I1LjAuNCwgInNldCBzcGVlZCA/IiB3aWxsIGxpc3Qgc3BlZWRzIHVwIHRvCisgICA0NjA4MDAgb3IgOTIxNjAwLiBJbiBDLUtlcm1pdCA3LjAgYW5kIGxhdGVyOgorCisgICAgMS4gSWYgYSBzeW1ib2wgZm9yIGEgcGFydGljdWxhciBzcGVlZCAoc2F5IEIyMzA0MDAgZm9yIDIzMDQwMCBicHMpCisgICAgICAgYXBwZWFycyBpbiB3aGF0ZXZlciBoZWFkZXIgZmlsZSBkZWZpbmVzIGFjY2VwdGFibGUgc2VyaWFsIHNwZWVkcworICAgICAgIChlLmcuIDx0ZXJtYml0cy5oPiBvciA8c3lzL3Rlcm1pb3MuaD4gb3IgPHN5cy90dHlkZXYuaD4sIGV0YyksIHRoZQorICAgICAgIGNvcnJlc3BvbmRpbmcgc3BlZWQgd2lsbCBhcHBlYXIgaW4gQy1LZXJtaXQncyAic2V0IHNwZWVkID8iIGxpc3QuCisgICAgMi4gVGhlIGZhY3QgdGhhdCBhIGdpdmVuIHNwZWVkIGlzIGxpc3RlZCBpbiB0aGUgaGVhZGVyIGZpbGVzIGFuZAorICAgICAgIGFwcGVhcnMgaW4gQy1LZXJtaXQncyBsaXN0IGRvZXMgbm90IG1lYW4gdGhlIGRyaXZlciB3aWxsIGFjY2VwdAorICAgICAgIGl0LiBGb3IgZXhhbXBsZSwgYSBjb21wdXRlciBtaWdodCBoYXZlIHNvbWUgc3RhbmRhcmQgc2VyaWFsIHBvcnRzCisgICAgICAgcGx1cyBzb21lIGFkZC1vbiBvbmVzIHdpdGggZGlmZmVyZW50IGRyaXZlcnMgdGhhdCBhY2NlcHQgYQorICAgICAgIGRpZmZlcmVudCByZXBlcnRvaXJlIG9mIHNwZWVkcy4KKyAgICAzLiBUaGUgZmFjdCB0aGF0IGEgZ2l2ZW4gc3BlZWQgaXMgYWNjZXB0ZWQgYnkgdGhlIGRyaXZlciBkb2VzIG5vdAorICAgICAgIGd1YXJhbnRlZSB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBjYW4gYWNjZXB0IGl0LgorCisgICBXaGVuIEtlcm1pdCBpcyBnaXZlbiBhICJzZXQgc3BlZWQiIGNvbW1hbmQgZm9yIGEgcGFydGljdWxhciBkZXZpY2UsCisgICB0aGUgdW5kZXJseWluZyBzeXN0ZW0gc2VydmljZSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBzcGVlZDsgaXRzIHJldHVybgorICAgY29kZSBpcyBjaGVja2VkIGFuZCB0aGUgU0VUIFNQRUVEIGNvbW1hbmQgZmFpbHMgaWYgdGhlIHJldHVybiBjb2RlCisgICBpbmRpY2F0ZXMgZmFpbHVyZS4gUmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtIHNlcnZpY2UgcmV0dXJuIHN0YXR1cywgdGhlCisgICBkZXZpY2UncyBzcGVlZCBpcyB0aGVuIHJlYWQgYmFjayBhbmQgaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIHNwZWVkCisgICB0aGF0IHdhcyByZXF1ZXN0ZWQsIGFuIGVycm9yIG1lc3NhZ2UgaXMgcHJpbnRlZCBhbmQgdGhlIGNvbW1hbmQgZmFpbHMuCisKKyAgIEV2ZW4gd2hlbiB0aGUgY29tbWFuZCBzdWNjZWVkcywgdGhpcyBkb2VzIG5vdCBndWFyYW50ZWUgc3VjY2Vzc2Z1bAorICAgb3BlcmF0aW9uIGF0IGEgcGFydGljdWxhciBzcGVlZCwgZXNwZWNpYWxseSBhIGhpZ2ggb25lLiBUaGF0IGRlcGVuZHMKKyAgIG9uIGVsZWN0cmljaXR5LCBpbmZvcm1hdGlvbiB0aGVvcnksIGV0Yy4gSG93IGxvbmcgaXMgdGhlIGNhYmxlLCB3aGF0CisgICBpcyBpdHMgY2FwYWNpdGFuY2UsIGhvdyB3ZWxsIGlzIGl0IHNoaWVsZGVkLCBldGMsIG5vdCB0byBtZW50aW9uIHRoYXQKKyAgIGV2ZXJ5IGNvbm5lY3Rpb24gaGFzIHR3byBlbmRzIGFuZCBpdHMgc3VjY2VzcyBkZXBlbmRzIG9uIGJvdGggb2YgdGhlbS4KKyAgIChXaXRoIHRoZSBvYnZpb3VzIGNhdmVhdHMgYWJvdXQgaW50ZXJuYWwgbW9kZW1zLCBpcyB0aGUgY2FibGUgcmVhbGx5CisgICBjb25uZWN0ZWQsIGludGVycnVwdCBjb25mbGljdHMsIGV0YyBldGMgZXRjKS4KKworICAgTm90ZSwgaW4gcGFydGljdWxhciwgdGhhdCB0aGVyZSBpcyBhIGNlcnRhaW4gdGhyZXNob2xkIGFib3ZlIHdoaWNoCisgICBtb2RlbXMgY2FuIG5vdCAiYXV0b2JhdWQiIC0tIGkuZS4gZGV0ZWN0IHRoZSBzZXJpYWwgaW50ZXJmYWNlIHNwZWVkCisgICB3aGVuIHlvdSB0eXBlIEFUIChvciB3aGF0ZXZlciBlbHNlIHRoZSBtb2RlbSdzIHJlY29nbml0aW9uIHNlcXVlbmNlCisgICBtaWdodCBiZSkuIFN1Y2ggbW9kZW1zIG5lZWQgdG8gYmUgZW5nYWdlZCBhdCBhIGxvd2VyIHNwZWVkIChzYXkgMjQwMAorICAgb3IgOTYwMCBvciBldmVuIDExNTIwMCAtLSBhbnkgc3BlZWQgYmVsb3cgdGhlaXIgYXV0b2JhdWQgdGhyZXNob2xkKQorICAgYW5kIHRoZW4gbXVzdCBiZSBnaXZlbiBhIG1vZGVtLXNwZWNpZmljIGNvbW1hbmQgKHdoaWNoIGNhbiBiZSBmb3VuZCBpbgorICAgdGhlIG1vZGVtIG1hbnVhbCkgdG8gY2hhbmdlIHRoZWlyIGludGVyZmFjZSBzcGVlZCB0byB0aGUgZGVzaXJlZAorICAgaGlnaGVyIHNwZWVkLCBhbmQgdGhlbiB0aGUgc29mdHdhcmUgbXVzdCBhbHNvIGJlIHRvbGQgdG8gY2hhbmdlIHRvIHRoZQorICAgbmV3LCBoaWdoZXIgc3BlZWQuCisKKyAgIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCByZWFkIFs1NDhdU2VjdGlvbiA5LjUgb2YgdGhlIEluc3RhbGxhdGlvbgorICAgSW5zdHJ1Y3Rpb25zLCBwbHVzIGFueSBwbGF0Zm9ybS1zcGVjaWZpYyBub3RlcyBpbiBbNTQ5XVNlY3Rpb24gMworICAgYWJvdmUuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNy4gQ09NTVVOSUNBVElPTlMgQU5EIERJQUxJTkcKKworICAgWyBbNTUwXVRvcCBdIFsgWzU1MV1Db250ZW50cyBdIFsgWzU1Ml1OZXh0IF0gWyBbNTUzXVByZXZpb3VzIF0KKworICA3LjEuIFNlcmlhbCBQb3J0cyBhbmQgTW9kZW1zCisKKyAgIElmIHlvdSBTRVQgTElORSB0byBhIHNlcmlhbCBwb3J0IG1vZGVtLWNvbnRyb2wgZGV2aWNlIHRoYXQgaGFzIG5vdGhpbmcKKyAgIHBsdWdnZWQgaW4gdG8gaXQsIG9yIGhhcyBhIG1vZGVtIGNvbm5lY3RlZCB0aGF0IGlzIHBvd2VyZWQgb2ZmLCBhbmQKKyAgIHlvdSBoYXZlIG5vdCBnaXZlbiBhIHByaW9yIFNFVCBNT0RFTSBUWVBFIG9yIFNFVCBDQVJSSUVSLVdBVENIIE9GRgorICAgY29tbWFuZCwgdGhlIFNFVCBMSU5FIGNvbW1hbmQgaXMgbGlrZWx5IHRvIGhhbmcuIEluIG1vc3QgY2FzZXMsIHlvdQorICAgY2FuIEN0cmwtQyBvdXQuIElmIG5vdCwgeW91J2xsIGhhdmUgdG8ga2lsbCBDLUtlcm1pdCBmcm9tIGFub3RoZXIKKyAgIHRlcm1pbmFsLgorCisgICBTaW1pbGFybHksIGlmIHlvdSBnaXZlIGEgU0VUIE1PREVNIFRZUEUgSEFZRVMgKG9yIFVTUiwgb3IgYW55IG90aGVyCisgICBtb2RlbSB0eXBlIGJlc2lkZXMgRElSRUNULCBOT05FLCBvciBVTktOT1dOKSBhbmQgdGhlbiBTRVQgTElORSB0byBhbgorICAgZW1wdHkgcG9ydCwgdGhlIHN1YnNlcXVlbnQgY2xvc2UgKGltcGxpY2l0IG9yIGV4cGxpY2l0KSBpcyBsaWFibGUgdG8KKyAgIGhhbmcgb3IgZXZlbiBjcmFzaCAodGhyb3VnaCBubyBmYXVsdCBvZiBLZXJtaXQncyAtLSB0aGUgaGFuZ2luZyBvcgorICAgY3Jhc2hpbmcgaXMgaW5zaWRlIGEgc3lzdGVtIGNhbGwgc3VjaCBhcyBjZnNldG9zcGVlZCgpIG9yIGNsb3NlKCkpLgorCisgICBUaGUgU0VUIENBUlJJRVItV0FUQ0ggY29tbWFuZCB3b3JrcyBhcyBhZHZlcnRpc2VkIG9ubHkgaWYgdGhlCisgICB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0gYW5kIGRldmljZSBkcml2ZXJzIHN1cHBvcnQgdGhpcyBmZWF0dXJlOworICAgaW4gcGFydGljdWxhciBvbmx5IGlmIGEgcmVhZCgpIG9wZXJhdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggYW4KKyAgIGVycm9yIGNvZGUgaWYgdGhlIGNhcnJpZXIgc2lnbmFsIGdvZXMgYXdheSBvciwgZmFpbGluZyB0aGF0LCBpZgorICAgQy1LZXJtaXQgY2FuIG9idGFpbiB0aGUgbW9kZW0gc2lnbmFscyBmcm9tIHRoZSBkZXZpY2UgZHJpdmVyICh5b3UgY2FuCisgICB0ZWxsIGJ5IGdpdmluZyBhICJzZXQgbGluZSIgY29tbWFuZCB0byBhIHNlcmlhbCBkZXZpY2UsIGFuZCB0aGVuIGEKKyAgICJzaG93IGNvbW11bmljYXRpb25zIiBjb21tYW5kIC0tIGlmIG1vZGVtIHNpZ25hbHMgYXJlIG5vdCBsaXN0ZWQsCisgICBDLUtlcm1pdCB3b24ndCBiZSBhYmxlIHRvIGRldGVjdCBjYXJyaWVyIGxvc3MsIHRoZSBXQUlUIGNvbW1hbmQgd2lsbAorICAgbm90IHdvcmssIGV0YykuIE9mIGNvdXJzZSwgdGhlIGRldmljZSBpdHNlbGYgKGUuZy4gbW9kZW0pIG11c3QgYmUKKyAgIGNvbmZpZ3VyZWQgYXBwcm9wcmlhdGVseSBhbmQgdGhlIGNhYmxlcyBjb252ZXkgdGhlIGNhcnJpZXIgYW5kIG90aGVyCisgICBuZWVkZWQgc2lnbmFscywgZXRjLgorCisgICBJZiB5b3UgZGlhbCBvdXQgZnJvbSBVbml4IHN5c3RlbSwgYnV0IHRoZW4gbm90aWNlIGEgbG90IG9mIHdlaXJkCisgICBjaGFyYWN0ZXIgc3RyaW5ncyBiZWluZyBzdHVjayBpbnRvIHlvdXIgc2Vzc2lvbiBhdCByYW5kb20gdGltZXMKKyAgIChlc3BlY2lhbGx5IGlmIHRoZXkgbG9vayBsaWtlICsrK0FUUTBIMCBvciBsb2dpbiBiYW5uZXJzIG9yIHByb21wdHMpLAorICAgdGhhdCBtZWFucyB0aGF0IGdldHR5IGlzIGFsc28gdHJ5aW5nIHRvIGNvbnRyb2wgdGhlIHNhbWUgZGV2aWNlLgorICAgWW91J2xsIG5lZWQgdG8gZGlhbCBvdXQgb24gYSBkZXZpY2UgdGhhdCBpcyBub3Qgd2FpdGluZyBmb3IgYSBsb2dpbiwKKyAgIG9yIGVsc2UgZGlzYWJsZSBnZXR0eSBvbiB0aGUgZGV2aWNlLgorCisgICBBcyBvZiB2ZXJzaW9uIDcuMCwgQy1LZXJtaXQgbWFrZXMgZXhwbGljaXQgY2hlY2tzIGZvciB0aGUgQ2FycmllcgorICAgRGV0ZWN0IHNpZ25hbCwgYW5kIHNvIGNhdGNoZXMgaHVuZy11cCBjb25uZWN0aW9ucyBtdWNoIGJldHRlciB0aGFuIDYuMAorICAgYW5kIGVhcmxpZXIuIEhvd2V2ZXIsIGl0IHN0aWxsIGNhbiBub3QgYmUgZ3VhcmFudGVlZCB0byBjYXRjaCBldmVyeQorICAgZXZlciBDRCBvbi10by1vZmYgdHJhbnNpdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gdGhlIEhQLVVYIHZlcnNpb24gb2YKKyAgIEMtS2VybWl0IGlzIGluIENPTk5FQ1QgbW9kZSBvbiBhIGRpYWxlZCBjb25uZWN0aW9uIGFuZCBDQVJSSUVSLVdBVENICisgICBPTiBvciBBVVRPLCBhbmQgeW91IHR1cm4gb2ZmIHRoZSBtb2RlbSwgSFAtVVggaXMgc3R1Y2sgaW4gYSByZWFkKCkKKyAgIHRoYXQgbmV2ZXIgcmV0dXJucy4gKEMtS2VybWl0IGRvZXMgbm90IHBvcCBiYWNrIHRvIGl0cyBwcm9tcHQKKyAgIGF1dG9tYXRpY2FsbHksIGJ1dCB5b3UgY2FuIHN0aWxsIGVzY2FwZSBiYWNrLikKKworICAgSWYsIG9uIHRoZSBvdGhlciBoYW5kLCB5b3UgbG9nIG91dCBmcm9tIHRoZSByZW1vdGUgc3lzdGVtLCBhbmQgaXQKKyAgIGhhbmdzIHVwLCBhbmQgQ0QgZHJvcHMgb24gdGhlIGxvY2FsIG1vZGVtLCBDLUtlcm1pdCBkZXRlY3RzIHRoaXMgYW5kCisgICBwb3BzIGJhY2sgdG8gdGhlIHByb21wdCBhcyBpdCBzaG91bGQuIChFdmlkZW50bHkgdGhlcmUgY2FuIGJlIGEKKyAgIGRpZmZlcmVuY2UgYmV0d2VlbiBDRCBhbmQgRFNSIHR1cm5pbmcgb2ZmIGF0IHRoZSBzYW1lIHRpbWUsIHZlcnN1cyBDRAorICAgdHVybmluZyBvZmYgd2hpbGUgRFNSIHN0YXlzIG9uOyBleHBlcmltZW50YXRpb24gd2l0aCAmUzAvJlMxLyZTMiBvbgorICAgeW91ciBtb2RlbSBtaWdodCBwcm9kdWNlIHRoZSBkZXNpcmVkIHJlc3VsdHMpLgorCisgICBXaGVuIFVuaXggQy1LZXJtaXQgZXhpdHMsIGl0IGNsb3NlcyAoYW5kIG11c3QgY2xvc2UpIHRoZQorICAgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiBJZiB5b3Ugd2VyZSBkaWFsZWQgb3V0LCB0aGlzIHdpbGwgbW9zdCBsaWtlbHkKKyAgIGhhbmcgdXAgdGhlIGNvbm5lY3Rpb24uIElmIHlvdSB3YW50IHRvIGdldCBvdXQgb2YgS2VybWl0IGFuZCBzdGlsbCB1c2UKKyAgIEtlcm1pdCdzIGNvbW11bmljYXRpb24gZGV2aWNlLCB5b3UgaGF2ZSBzZXZlcmFsIGNob2ljZXM6CisKKyAgICAxLiBTaGVsbCBvdXQgZnJvbSBLZXJtaXQgb3Igc3VzcGVuZCBLZXJtaXQsIGFuZCByZWZlciB0byB0aGUgZGV2aWNlCisgICAgICAgbGl0ZXJhbGx5IChhcyBpbiAidGVybSAtYmxhaCAtYmxhaCA8IC9kZXYvY3VhID4gL2Rldi9jdWEiKS4KKyAgICAyLiBTaGVsbCBvdXQgZnJvbSBLZXJtaXQgYW5kIHVzZSB0aGUgZGV2aWNlJ3MgZmlsZSBkZXNjcmlwdG9yIHdoaWNoCisgICAgICAgS2VybWl0IG1ha2VzIGF2YWlsYWJsZSB0byB5b3UgaW4gdGhlIFx2KHR0eWZkKSB2YXJpYWJsZS4KKyAgICAzLiBVc2UgQy1LZXJtaXQncyBSRURJUkVDVCBjb21tYW5kLgorICAgIDQuIFVzZSBDLUtlcm1pdCBuZXcgRVhFQyAvUkVESVJFQ1QgY29tbWFuZC4KKworICAgSWYgeW91IGFyZSBoYXZpbmcgdHJvdWJsZSBkaWFsaW5nOgorCisgICAgMS4gTWFrZSBzdXJlIHRoZSBkaWFsb3V0IGxpbmUgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkuIE1vcmUgYWJvdXQKKyAgICAgICB0aGlzIGJlbG93LgorICAgIDIuIE1ha2Ugc3VyZSBhbGwgbmVjZXNzYXJ5IHBhdGNoZXMgYXJlIGluc3RhbGxlZCBmb3IgeW91ciBvcGVyYXRpbmcKKyAgICAgICBzeXN0ZW0uCisgICAgMy4gSWYgeW91IGNhbid0IGRpYWwgb24gYSAiYmlkaXJlY3Rpb25hbCIgbGluZSwgdGhlbiBjb25maWd1cmUgaXQgZm9yCisgICAgICAgb3V0Ym91bmQtb25seSAocmVtb3ZlIHRoZSBnZXR0eSkgYW5kIHRyeSBhZ2Fpbi4gKFRoZSBtZWNoYW5pc21zIC0tCisgICAgICAgaWYgYW55IC0tIGZvciBncmFiYmluZyBiaWRpcmVjdGlvbmFsIGxpbmVzIGZvciBkaWFsb3V0IHZhcnkgd2lsZGx5CisgICAgICAgYW1vbmcgVW5peCBpbXBsZW1lbnRhdGlvbnMgYW5kIHJlbGVhc2VzLCBhbmQgQy1LZXJtaXQgLS0gd2hpY2gKKyAgICAgICBydW5zIG9uIHdlbGwgb3ZlciAzMDAgZGlmZmVyZW50IFVuaXggdmFyaWF0aW9ucyAtLSBtYWtlcyBubyBlZmZvcnQKKyAgICAgICB0byBrZWVwIHVwIHdpdGggdGhlbTsgdGhlIHJlY29tbWVuZGVkIG1ldGhvZCBmb3IgY29waW5nIHdpdGggdGhpcworICAgICAgIHNpdHVhdGlvbiBpcyB0byB3cmFwIEMtS2VybWl0IGluIGEgc2hlbGwgc2NyaXB0IHRoYXQgdGFrZXMgdGhlCisgICAgICAgYXBwcm9wcmlhdGUgYWN0aW9ucy4pCisgICAgNC4gTWFrZSBzdXJlIEMtS2VybWl0J3MgU0VUIERJQUwgYW5kIFNFVCBNT0RFTSBwYXJhbWV0ZXJzIGFncmVlIHdpdGgKKyAgICAgICB0aGUgbW9kZW0geW91IGFyZSBhY3R1YWxseSB1c2luZyAtLSBwYXkgcGFydGljdWxhciBhdHRlbnRpb24gdG8KKyAgICAgICBTRVQgRElBTCBTUEVFRC1NQVRDSElORy4KKyAgICA1LiBJZiBNT0RFTSBIQU5HVVAtTUVUSE9EIGlzIHNldCB0byBSUzIzMi1TSUdOQUwsIGNoYW5nZSBpdCB0bworICAgICAgIE1PREVNLUNPTU1BTkQuIE9yIHZpY2UtdmVyc2EuCisgICAgNi4gVHJ5IFNFVCBESUFMIEhBTkdVUCBPRkYgYmVmb3JlIHRoZSBESUFMIGNvbW1hbmQuIEFsc28sIFNFVCBESUFMCisgICAgICAgRElTUExBWSBPTiB0byB3YXRjaCB3aGF0J3MgaGFwcGVuaW5nLiBTZWUgWzU1NF1TZWN0aW9uIDggb2YgdGhlCisgICAgICAgWzU1NV1JbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zLgorICAgIDcuIFJlYWQgcGFnZXMgNTAtNjcgb2YgWzU1Nl1Vc2luZyBDLUtlcm1pdC4KKyAgICA4LiBBcyBhIGxhc3QgcmVzb3J0LCBkb24ndCB1c2UgdGhlIERJQUwgY29tbWFuZCBhdCBhbGw7IFNFVCBDQVJSSUVSCisgICAgICAgT0ZGIGFuZCBDT05ORUNUIHRvIHRoZSBtb2RlbSBhbmQgZGlhbCBpbnRlcmFjdGl2ZWx5LCBvciB3cml0ZSBhCisgICAgICAgc2NyaXB0IHByb2dyYW0gdG8gZGlhbCB0aGUgbW9kZW0uCisKKyAgIE1ha2Ugc3VyZSB5b3VyIGRpYWxvdXQgbGluZSBpcyBjb3JyZWN0bHkgY29uZmlndXJlZCBmb3IgZGlhbGluZyBvdXQKKyAgIChhcyBvcHBvc2VkIHRvIGxvZ2luKS4gVGhlIG1ldGhvZCBmb3IgZG9pbmcgdGhpcyBpcyBkaWZmZXJlbnQgZm9yIGVhY2gKKyAgIGtpbmQgb2YgVW5peCBzeXN0ZW0uIENvbnN1bHQgeW91ciBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBmb3IgY29uZmlndXJpbmcKKyAgIGxpbmVzIGZvciBkaWFsaW5nIG91dCAoZm9yIGV4YW1wbGUsIFN1biBTcGFyY1N0YXRpb24gSVBDIHVzZXJzIHNob3VsZAorICAgcmVhZCB0aGUgc2VjdGlvbiAiU2V0dGluZyB1cCBNb2RlbSBTb2Z0d2FyZSIgaW4gdGhlIERlc2t0b3AgU1BBUkMgU3VuCisgICBTeXN0ZW0gJiBOZXR3b3JrIE1hbmFnZXIncyBHdWlkZTsgSFAtOTAwMCB3b3Jrc3RhdGlvbiB1c2VycyBzaG91bGQKKyAgIGNvbnN1bHQgdGhlIG1hbnVhbCBDb25maWd1cmluZyBIUC1VWCBmb3IgUGVyaXBoZXJhbHMsIGV0YykuCisKKyAgIFN5bXB0b206IERJQUwgd29ya3MsIGJ1dCBhIHN1YnNlcXVlbnQgQ09OTkVDVCBjb21tYW5kIGRvZXMgbm90LgorICAgRGlhZ25vc2lzOiB0aGUgbW9kZW0gaXMgbm90IGFzc2VydGluZyBDYXJyaWVyIERldGVjdCAoQ0QpIGFmdGVyIHRoZQorICAgY29ubmVjdGlvbiBpcyBtYWRlLCBvciB0aGUgY2FibGUgZG9lcyBub3QgY29udmV5IHRoZSBDRCBzaWduYWwuIEN1cmU6CisgICBSZWNvbmZpZ3VyZSB0aGUgbW9kZW0sIHJlcGxhY2UgdGhlIGNhYmxlLiBXb3JrYXJvdW5kOiBTRVQgQ0FSUklFUiBPRkYKKyAgIChhdCBsZWFzdCBpbiBTeXN0ZW0tViBiYXNlZCBVbml4IHZlcnNpb25zKS4KKworICAgRm9yIEJlcmtlbGV5LVVuaXgtYmFzZWQgc3lzdGVtcyAoNC4zQlNEIGFuZCBlYXJsaWVyKSwgS2VybWl0IGluY2x1ZGVzCisgICBjb2RlIHRvIHVzZSBMUEFTUzggbW9kZSB3aGVuIHBhcml0eSBpcyBub25lLCB3aGljaCBpcyBzdXBwb3NlZCB0bworICAgYWxsb3cgOC1iaXQgZGF0YSBhbmQgWG9uL1hvZmYgZmxvdyBjb250cm9sIGF0IHRoZSBzYW1lIHRpbWUuIEhvd2V2ZXIsCisgICBhcyBvZiBlZGl0IDE3NCwgdGhpcyBjb2RlIGlzIGVudGlyZWx5IGRpc2FibGVkIGJlY2F1c2UgaXQgaXMKKyAgIHVucmVsaWFibGU6IGV2ZW4gdGhvdWdoIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0gbWlnaHQgKG9yIG1pZ2h0IG5vdCkKKyAgIHN1cHBvcnQgTFBBU1M4IG1vZGUgY29ycmVjdGx5LCB0aGUgaG9zdCBhY2Nlc3MgcHJvdG9jb2xzICh0ZXJtaW5hbAorICAgc2VydmVycywgdGVsbmV0LCBybG9naW4sIGV0YykgZ2VuZXJhbGx5IGhhdmUgbm8gd2F5IG9mIGZpbmRpbmcgb3V0CisgICBhYm91dCBpdCBhbmQgdGhlcmVmb3JlIHJlbmRlciBpdCBpbmVmZmVjdGl2ZSwgY2F1c2luZyBmaWxlIHRyYW5zZmVyCisgICBmYWlsdXJlcy4gU28gYXMgb2YgZWRpdCAxNzQsIEtlcm1pdCBvbmNlIGFnYWluIHVzZXMgcmF3bW9kZSBmb3IgOC1iaXQKKyAgIGRhdGEsIGFuZCBzbyB0aGVyZSBpcyBubyBYb24vWG9mZiBmbG93IGNvbnRyb2wgZHVyaW5nIGZpbGUgdHJhbnNmZXIgb3IKKyAgIHRlcm1pbmFsIGVtdWxhdGlvbiBpbiB0aGUgQmVya2VsZXktYmFzZWQgdmVyc2lvbnMgKDQuMyBhbmQgZWFybGllciwKKyAgIG5vdCA0LjQpLgorCisgICBBbHNvIG9uIEJlcmtlbGV5LWJhc2VkIHN5c3RlbXMgKDQuMyBhbmQgZWFybGllciksIHRoZXJlIGlzIGFwcGFyZW50bHkKKyAgIG5vIHdheSB0byBjb25maWd1cmUgYSBkaWFsb3V0IGxpbmUgZm9yIHByb3BlciBjYXJyaWVyIGhhbmRsaW5nLCBpLmUuCisgICBpZ25vcmUgY2FycmllciBkdXJpbmcgZGlhbGluZywgcmVxdWlyZSBjYXJyaWVyIHRoZXJlYWZ0ZXIsIGdldCBhIGZhdGFsCisgICBlcnJvciBvbiBhbnkgYXR0ZW1wdCB0byByZWFkIGZyb20gdGhlIGRldmljZSBhZnRlciBjYXJyaWVyIGRyb3BzICh0aGlzCisgICBpcyBoYW5kbGVkIG5pY2VseSBpbiBTeXN0ZW0gViBieSBtYW5pcHVsYXRpb24gb2YgdGhlIENMT0NBTCBmbGFnKS4gVGhlCisgICBzeW1wdG9tIGlzIHRoYXQgY2FycmllciBsb3NzIGRvZXMgbm90IG1ha2UgQy1LZXJtaXQgcG9wIGJhY2sgdG8gdGhlCisgICBwcm9tcHQgYXV0b21hdGljYWxseS4gVGhpcyBpcyBldmlkZW50IG9uIHRoZSBOZVhULCBmb3IgZXhhbXBsZSwgYnV0CisgICBub3Qgb24gU3VuT1MsIHdoaWNoIHN1cHBvcnRzIHRoZSBDTE9DQUwgZmxhZy4gVGhpcyBpcyBub3QgYSBLZXJtaXQKKyAgIHByb2JsZW0sIGJ1dCBhIGxpbWl0YXRpb24gb2YgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbS4gRm9yCisgICBleGFtcGxlLCB0aGUgY3UgcHJvZ3JhbSBvbiB0aGUgTmVYVCBkb2Vzbid0IG5vdGljZSBjYXJyaWVyIGxvc3MKKyAgIGVpdGhlciwgd2hlcmVhcyBjdSBvbiB0aGUgU3VuIGRvZXMuCisKKyAgIE9uIGNlcnRhaW4gQVQmVCBVbml4IHN5c3RlbXMgZXF1aXBwZWQgd2l0aCBBVCZUIG1vZGVtcywgRElBTCBhbmQKKyAgIEhBTkdVUCBkb24ndCB3b3JrIHJpZ2h0LiBXb3JrYXJvdW5kczogKDEpIFNFVCBESUFMIEhBTkdVUCBPRkYgYmVmb3JlCisgICBhdHRlbXB0aW5nIHRvIGRpYWw7ICgyKSBJZiBIQU5HVVAgZG9lc24ndCB3b3JrLCBTRVQgTElORSwgYW5kIHRoZW4gU0VUCisgICBMSU5FIDxkZXZpY2U+IHRvIHRvdGFsbHkgY2xvc2UgYW5kIHJlb3BlbiB0aGUgZGV2aWNlLiBJZiBhbGwgZWxzZQorICAgZmFpbHMsIFNFVCBDQVJSSUVSIE9GRi4KKworICAgQy1LZXJtaXQgZG9lcyBub3QgY29udGFpbiBhbnkgcGFydGljdWxhciBzdXBwb3J0IGZvciBBVCZUIERhdGFLaXQKKyAgIGRldmljZXMuIFlvdSBjYW4gdXNlIEtlcm1pdCBzb2Z0d2FyZSB0byBkaWFsIGluIHRvIGEgRGF0YUtpdCBsaW5lLCBidXQKKyAgIEMtS2VybWl0IGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpYWxpemVkIGNvZGUgcmVxdWlyZWQgdG8gZGlhbCBvdXQKKyAgIGZyb20gYSBEYXRhS2l0IGxpbmUuIElmIHRoZSBVbml4IHN5c3RlbSBpcyBjb25uZWN0ZWQgdG8gRGF0YUtpdCB2aWEKKyAgIHNlcmlhbCBwb3J0cywgZGlhbG91dCBzaG91bGQgd29yayBub3JtYWxseSAoZS5nLiBzZXQgbGluZSAvZGV2L3R0eW0xLAorICAgc2V0IHNwZWVkIDE5MjAwLCBjb25uZWN0LCBhbmQgdGhlbiBzZWUgdGhlIERFU1RJTkFUSU9OOiBwcm9tcHQsIGZyb20KKyAgIHdoaWNoIHlvdSBjYW4gY29ubmVjdCB0byBhbm90aGVyIGNvbXB1dGVyIG9uIHRoZSBEYXRhS2l0IG5ldHdvcmsgb3IgdG8KKyAgIGFuIG91dGdvaW5nIG1vZGVtIHBvb2wsIGV0YykuIEJ1dCBpZiB0aGUgVW5peCBzeXN0ZW0gaXMgY29ubmVjdGVkIHRvCisgICB0aGUgRGF0YUtpdCBuZXR3b3JrIHRocm91Z2ggdGhlIHNwZWNpYWwgRGF0YUtpdCBpbnRlcmZhY2UgYm9hcmQsIHRoZW4KKyAgIFNFVCBMSU5FIHRvIGEgRGF0YUtpdCBwc2V1ZG9kZXZpY2UgKHN1Y2ggYXMgL2Rldi9kazAzMXQpIHdpbGwgbm90IHdvcmsKKyAgICh5b3UgbXVzdCB1c2UgdGhlIERhdGFLaXQgImRrIiBvciAiZGtjdSIgcHJvZ3JhbSBpbnN0ZWFkKS4gSW4gQy1LZXJtaXQKKyAgIDcuMCBhbmQgbGF0ZXIsIHlvdSBjYW4gbWFrZSBLZXJtaXQgY29ubmVjdGlvbnMgInRob3VnaCIgZGsgb3IgZGtjdQorICAgdXNpbmcgInNldCBsaW5lIC9wdHkiLgorCisgICBJbiBzb21lIEJTRC1iYXNlZCBVbml4IEMtS2VybWl0IHZlcnNpb25zLCBTRVQgTElORSB0byBhIHBvcnQgdGhhdCBoYXMKKyAgIG5vdGhpbmcgcGx1Z2dlZCBpbiB0byBpdCB3aXRoIFNFVCBDQVJSSUVSIE9OIHdpbGwgaGFuZyB0aGUgcHJvZ3JhbSAoYXMKKyAgIGl0IHNob3VsZCksIGJ1dCBpdCBjYW4ndCBiZSBpbnRlcnJ1cHRlZCB3aXRoIEN0cmwtQy4gVGhlIGludGVycnVwdAorICAgdHJhcCBpcyBjb3JyZWN0bHkgYXJtZWQsIGJ1dCBhcHBhcmVudGx5IHRoZSBVbml4IG9wZW4oKSBjYWxsIGNhbm5vdCBiZQorICAgaW50ZXJydXB0ZWQgaW4gdGhpcyBjYXNlLiBXaGVuIFNFVCBDQVJSSUVSIGlzIE9GRiBvciBBVVRPLCB0aGUgU0VUCisgICBMSU5FIHdpbGwgZXZlbnR1YWxseSByZXR1cm4sIGJ1dCB0aGVuIHRoZSBwcm9ncmFtIGhhbmdzCisgICAodW5pbnRlcnJ1cHRpYmx5KSB3aGVuIHRoZSBFWElUIG9yIFFVSVQgY29tbWFuZCAob3IsIHByZXN1bWFibHksCisgICBhbm90aGVyIFNFVCBMSU5FIGNvbW1hbmQpIGlzIGdpdmVuLiBUaGUgbGF0dGVyIGlzIHByb2JhYmx5IGJlY2F1c2Ugb2YKKyAgIHRoZSBhdHRlbXB0IHRvIGhhbmcgdXAgdGhlIG1vZGVtLiAoSW4gZWRpdCAxNjksIGEgdGltZW91dCBhbGFybSB3YXMKKyAgIHBsYWNlZCBhcm91bmQgdGhpcyBvcGVyYXRpb24uKQorCisgICBXaXRoIFNFVCBESUFMIEhBTkdVUCBPRkYgaW4gZWZmZWN0LCB0aGUgRElBTCBjb21tYW5kIG1pZ2h0IHdvcmsgb25seQorICAgb25jZSwgYnV0IG5vdCBhZ2FpbiBvbiB0aGUgc2FtZSBkZXZpY2UuIEluIHRoYXQgY2FzZSwgZ2l2ZSBhIENMT1NFCisgICBjb21tYW5kIHRvIGNsb3NlIHRoZSBkZXZpY2UsIGFuZCB0aGVuIGFub3RoZXIgU0VUIExJTkUgY29tbWFuZCB0bworICAgcmUtb3BlbiB0aGUgc2FtZSBkZXZpY2UuIE9yIHJlYnVpbGQgeW91ciB2ZXJzaW9uIG9mIEtlcm1pdCB3aXRoIHRoZQorICAgLURDTFNPUE4gY29tcGlsZS10aW1lIHN3aXRjaC4KKworICAgVGhlIERJQUwgY29tbWFuZCBzYXlzICJUbyBjYW5jZWw6IFR5cGUgeW91ciBpbnRlcnJ1cHQgY2hhcmFjdGVyCisgICAobm9ybWFsbHkgQ3RybC1DKS4iIFRoaXMgaXMganVzdCBvbmUgZXhhbXBsZSBvZiB3aGVyZSBwcm9ncmFtIG1lc3NhZ2VzCisgICBhbmQgZG9jdW1lbnRhdGlvbiBhc3N1bWUgeW91ciBpbnRlcnJ1cHQgY2hhcmFjdGVyIGlzIEN0cmwtQy4gQnV0IGl0CisgICBtaWdodCBiZSBzb21ldGhpbmcgZWxzZS4gSW4gbW9zdCAoYnV0IG5vdCBuZWNlc3NhcmlseSBhbGwpIGNhc2VzLCB0aGUKKyAgIGNoYXJhY3RlciByZWZlcnJlZCB0byBpcyB0aGUgb25lIHRoYXQgZ2VuZXJhdGVzIHRoZSBTSUdJTlQgc2lnbmFsLiBJZgorICAgQ3RybC1DIGRvZXNuJ3QgYWN0IGFzIGFuIGludGVycnVwdCBjaGFyYWN0ZXIgZm9yIHlvdSwgdHlwZSB0aGUgVW5peAorICAgY29tbWFuZCAic3R0eSAtYSIgb3IgInN0dHkgYWxsIiBvciAic3R0eSBldmVyeXRoaW5nIiB0byBzZWUgd2hhdCB5b3VyCisgICBpbnRlcnJ1cHQgY2hhcmFjdGVyIGlzLiAoS2VybWl0IGNvdWxkIGJlIG1hZGUgdG8gZmluZCBvdXQgd2hhdCB0aGUKKyAgIGludGVycnVwdCBjaGFyYWN0ZXIgaXMsIGJ1dCB0aGlzIHdvdWxkIHJlcXVpcmUgYSBsb3Qgb2YKKyAgIHBsYXRmb3JtLWRlcGVuZGVudCBjb2RpbmcgYW5kICNpZmRlZnMsIGFuZCBhIG5ldyByb3V0aW5lIGFuZCBpbnRlcmZhY2UKKyAgIGJldHdlZW4gdGhlIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgcGxhdGZvcm0taW5kZXBlbmRlbnQgcGFydHMgb2YgdGhlCisgICBwcm9ncmFtLikKKworICAgSW4gZ2VuZXJhbCwgdGhlIGhhbmd1cCBvcGVyYXRpb24gb24gYSBzZXJpYWwgY29tbXVuaWNhdGlvbiBkZXZpY2UgaXMKKyAgIHByb25lIHRvIGZhaWx1cmUuIEMtS2VybWl0IHRyaWVzIHRvIHN1cHBvcnQgbWFueSwgbWFueSBkaWZmZXJlbnQga2luZHMKKyAgIG9mIGNvbXB1dGVycywgYW5kIHRoZXJlIHNlZW1zIHRvIGJlIG5vIHBvcnRhYmxlIG1ldGhvZCBmb3IgaGFuZ2luZyB1cAorICAgYSBtb2RlbSBjb25uZWN0aW9uIChpLmUuIHR1cm5pbmcgb2ZmIHRoZSBSUy0yMzIgRFRSIHNpZ25hbCBhbmQgdGhlbgorICAgdHVybmluZyBpdCBiYWNrIG9uIGFnYWluKS4gSWYgSEFOR1VQLCBESUFMLCBhbmQvb3IgQ3RybC1cSCBkbyBub3Qgd29yaworICAgZm9yIHlvdSwgYW5kIHlvdSBhcmUgYSBwcm9ncmFtbWVyLCBsb29rIGF0IHRoZSB0dGhhbmcoKSBmdW5jdGlvbiBpbgorICAgY2t1dGlvLmMgYW5kIHNlZSBpZiB5b3UgY2FuIGFkZCBjb2RlIHRvIG1ha2UgaXQgd29yayBjb3JyZWN0bHkgZm9yCisgICB5b3VyIHN5c3RlbSwgYW5kIHNlbmQgdGhlIGNvZGUgdG8gdGhlIGFkZHJlc3MgYWJvdmUuIChOT1RFOiBUaGlzCisgICBwcm9ibGVtIGhhcyBiZWVuIGxhcmdlbHkgc2lkZXN0ZXBwZWQgYXMgb2YgZWRpdCAxODgsIGluIHdoaWNoIEtlcm1pdAorICAgZmlyc3QgYXR0ZW1wdHMgdG8gaGFuZyB1cCB0aGUgbW9kZW0gYnkgImVzY2FwaW5nIGJhY2siIHZpYSArKysgYW5kCisgICB0aGVuIGdpdmluZyB0aGUgbW9kZW0ncyBoYW5ndXAgY29tbWFuZCwgZS5nLiBBVEgwLCB3aGVuIERJQUwKKyAgIE1PREVNLUhBTkdVUCBpcyBPTiwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgc2V0dGluZy4pCisKKyAgIEV2ZW4gd2hlbiBLZXJtaXQncyBtb2RlbS1jb250cm9sIHNvZnR3YXJlIGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5IGZvcgorICAgeW91ciBjb21wdXRlciwgaXQgY2FuIG9ubHkgd29yayByaWdodCBpZiB5b3VyIG1vZGVtIGlzIGFsc28gY29uZmlndXJlZAorICAgdG8gYXNzZXJ0IHRoZSBDRCBzaWduYWwgd2hlbiBpdCBpcyBjb25uZWN0ZWQgdG8gdGhlIHJlbW90ZSBtb2RlbSBhbmQKKyAgIHRvIGhhbmcgdXAgdGhlIGNvbm5lY3Rpb24gd2hlbiB5b3VyIGNvbXB1dGVyIGRyb3BzIHRoZSBEVFIgc2lnbmFsLiBTbworICAgYmVmb3JlIGRlY2lkaW5nIEtlcm1pdCBkb2Vzbid0IHdvcmsgd2l0aCB5b3VyIG1vZGVtLCBjaGVjayB5b3VyIG1vZGVtCisgICBjb25maWd1cmF0aW9uIEFORCB0aGUgY2FibGUgKGlmIGFueSkgY29ubmVjdGluZyB5b3VyIG1vZGVtIHRvIHRoZQorICAgY29tcHV0ZXIgLS0gaXQgc2hvdWxkIGJlIGEgc3RyYWlnaHQtdGhyb3VnaCBtb2RlbSBjYWJsZSBjb25kdWN0aW5nIHRoZQorICAgc2lnbmFscyBGRywgU0csIFRELCBSRCwgUlRTLCBDVFMsIERTUiwgRFRSLCBDRCwgYW5kIFJJLgorCisgICBNYW55IFVuaXggc3lzdGVtcyBrZWVwIGFsaWFzZXMgZm9yIGRpYWxvdXQgZGV2aWNlczsgZm9yIGV4YW1wbGUsCisgICAvZGV2L2FjdSBtaWdodCBiZSBhbiBhbGlhcyBmb3IgL2Rldi90dHkwMC4gQnV0IG1vc3Qgb2YgdGhlc2UgVW5peAorICAgc3lzdGVtcyBhbHNvIHVzZSBVVUNQIGxvY2tmaWxlIGNvbnZlbnRpb25zIHRoYXQgZG8gbm90IHRha2UgdGhpcworICAgYWxpYXNpbmcgaW50byBhY2NvdW50LCBzbyBpZiBvbmUgdXNlciBhc3NpZ25zIChlLmcuKSAvZGV2L2FjdSwgdGhlbgorICAgYW5vdGhlciB1c2VyIGNhbiBzdGlsbCBhc3NpZ24gdGhlIHNhbWUgZGV2aWNlIGJ5IHJlZmVycmluZyB0byBpdHMKKyAgIG90aGVyIG5hbWUuIFRoaXMgaXMgbm90IGEgS2VybWl0IHByb2JsZW0gLS0gS2VybWl0IG11c3QgZm9sbG93IHRoZQorICAgbG9ja2ZpbGUgY29udmVudGlvbnMgdXNlZCBieSB0aGUgdmVuZG9yLXN1cHBsaWVkIHNvZnR3YXJlIChjdSwgdGlwLAorICAgdXVjcCkuCisKKyAgIFRoZSBTRVQgRkxPVy1DT05UUk9MIEtFRVAgb3B0aW9uIHNob3VsZCBiZSBnaXZlbiAqYmVmb3JlKiBhbnkKKyAgIGNvbW11bmljYXRpb24gKGRpYWxpbmcsIHRlcm1pbmFsIGVtdWxhdGlvbiwgZmlsZSB0cmFuc2ZlciwKKyAgIElOUFVUL09VVFBVVC9UUkFOU01JVCwgZXRjKSBpcyBhdHRlbXB0ZWQsIGlmIHlvdSB3YW50IEMtS2VybWl0IHRvIHVzZQorICAgYWxsIG9mIHRoZSBkZXZpY2UncyBwcmVleGlzdGluZyBmbG93LWNvbnRyb2wgcmVsYXRlZCBzZXR0aW5ncy4gVGhlCisgICBkZWZhdWx0IGZsb3ctY29udHJvbCBzZXR0aW5nIGlzIFhPTi9YT0ZGLCBhbmQgaXQgd2lsbCB0YWtlIGVmZmVjdCB3aGVuCisgICB0aGUgZmlyc3QgY29tbXVuaWNhdGlvbi1yZWxhdGVkIGNvbW1hbmQgaXMgZ2l2ZW4sIGFuZCBhIHN1YnNlcXVlbnQgU0VUCisgICBGTE9XIEtFRVAgY29tbWFuZCB3aWxsIG5vdCBuZWNlc3NhcmlseSBrbm93IGhvdyB0byByZXN0b3JlICphbGwqIG9mCisgICB0aGUgZGV2aWNlJ3Mgb3JpZ2luYWwgZmxvdy1jb250cm9sIHNldHRpbmdzLgorCisgIDcuMi4gTmV0d29yayBDb25uZWN0aW9ucworCisgICBDLUtlcm1pdCB0cmllcyB0byB1c2UgdGhlIDh0aCBiaXQgZm9yIGRhdGEgd2hlbiBwYXJpdHkgaXMgTk9ORSwgYW5kCisgICB0aGlzIGdlbmVyYWxseSB3b3JrcyBvbiByZWFsIFVuaXggdGVybWluYWwgKHR0eSkgZGV2aWNlcywgYnV0IGl0IG9mdGVuCisgICBkb2VzIG5vdCB3b3JrIHdoZW4gdGhlIFVuaXggc3lzdGVtIGlzIGFjY2Vzc2VkIG92ZXIgYSBuZXR3b3JrIHZpYQorICAgdGVsbmV0IG9yIHJsb2dpbiBwcm90b2NvbHMsIGluY2x1ZGluZyAoaW4gbWFueSBjYXNlcykgdGhyb3VnaCB0ZXJtaW5hbAorICAgc2VydmVycy4gRm9yIGV4YW1wbGUsIGFuIEVuY29yZSBjb21wdXRlciB3aXRoIEFubmV4IHRlcm1pbmFsIHNlcnZlcnMKKyAgIG9ubHkgZ2l2ZXMgYSA3LWJpdCBwYXRoIGlmIHRoZSBybG9naW4gcHJvdG9jb2wgaXMgc2VsZWN0ZWQgaW4gdGhlCisgICB0ZXJtaW5hbCBzZXJ2ZXIgYnV0IGl0IGdpdmVzIHRoZSBmdWxsIDggYml0cyBpZiB0aGUgcHJvcHJpZXRhcnkgUkRQCisgICBwcm90b2NvbCBpcyB1c2VkLgorCisgICBJZiBmaWxlIHRyYW5zZmVyIGRvZXMgbm90IHdvcmsgdGhyb3VnaCBhIGhvc3QgdG8gd2hpY2ggeW91IGhhdmUKKyAgIHJsb2dpbidkLCB1c2UgInJsb2dpbiAtOCIgcmF0aGVyIHRoYW4gInJsb2dpbiIuIElmIHRoYXQgZG9lc24ndCB3b3JrLAorICAgdGVsbCBib3RoIEtlcm1pdCBwcm9ncmFtcyB0byAic2V0IHBhcml0eSBzcGFjZSIuCisKKyAgIFRoZSBFbmNvcmUgVEVMTkVUIHNlcnZlciBkb2VzIG5vdCBhbGxvdyBsb25nIGJ1cnN0cyBvZiBpbnB1dC4gV2hlbiB5b3UKKyAgIGhhdmUgYSBURUxORVQgY29ubmVjdGlvbiB0byBhbiBFbmNvcmUsIHRlbGwgQy1LZXJtaXQgb24gdGhlIEVuY29yZSB0bworICAgU0VUIFJFQ0VJVkUgUEFDS0VULUxFTkdUSCAyMDAgb3IgdGhlcmVhYm91dHMuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOC4gSEFSRFdBUkUgRkxPVyBDT05UUk9MCisKKyAgIFsgWzU1N11Ub3AgXSBbIFs1NThdQ29udGVudHMgXSBbIFs1NTldTmV4dCBdIFsgWzU2MF1QcmV2aW91cyBdCisKKyAgIFNFVCBGTE9XIFJUUy9DVFMgaXMgYXZhaWxhYmxlIGluIFVuaXggQy1LZXJtaXQgb25seSB3aGVuIHRoZQorICAgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtIHByb3ZpZGVzIGFuIEFwcGxpY2F0aW9uIFByb2dyYW0gSW50ZXJmYWNlCisgICAoQVBJKSBmb3IgdHVybmluZyB0aGlzIGZlYXR1cmUgb24gYW5kIG9mZiB1bmRlciBwcm9ncmFtIGNvbnRyb2wsIHdoaWNoCisgICB0dXJucyBvdXQgdG8gYmUgYSByYXRoZXIgcmFyZSBmZWF0dXJlIGFtb25nIFVuaXggc3lzdGVtcy4gVG8gc2VlIGlmCisgICB5b3VyIFVuaXggQy1LZXJtaXQgdmVyc2lvbiBzdXBwb3J0cyBoYXJkd2FyZSBmbG93IGNvbnRyb2wsIHR5cGUgInNldAorICAgZmxvdyA/IiBhdCB0aGUgQy1LZXJtaXQgcHJvbXB0LCBhbmQgbG9vayBmb3IgInJ0cy9jdHMiIGFtb25nIHRoZQorICAgb3B0aW9ucy4gT3RoZXIgY29tbW9uIHNpdHVhdGlvbnMgaW5jbHVkZToKKworICAgIDEuIFRoZSBBUEkgaXMgYXZhaWxhYmxlLCBzbyAic2V0IGZsb3cgcnRzL2N0cyIgYXBwZWFycyBhcyBhIHZhbGlkCisgICAgICAgQy1LZXJtaXQgY29tbWFuZCwgYnV0IGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcgYmVjYXVzZSB0aGUgZGV2aWNlCisgICAgICAgZHJpdmVyIChwYXJ0IG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtKSB3YXMgbmV2ZXIgY29kZWQgdG8gZG8KKyAgICAgICBoYXJkd2FyZSBmbG93IGNvbnRyb2wuIFRoaXMgaXMgY29tbW9uIGFtb25nIFN5c3RlbSBWIFI0CisgICAgICAgaW1wbGVtZW50YXRpb25zIChkZXRhaWxzIGJlbG93KS4KKyAgICAyLiBUaGUgQVBJIGlzIG5vdCBhdmFpbGFibGUsIHNvICJzZXQgZmxvdyBydHMvY3RzIiBkb2VzIE5PVCBhcHBlYXIgYXMKKyAgICAgICBhIHZhbGlkIEMtS2VybWl0IGNvbW1hbmQsIGJ1dCB5b3UgY2FuIHN0aWxsIGdldCBSVFMvQ1RTIGZsb3cKKyAgICAgICBjb250cm9sIGJ5IHNlbGVjdGluZyBhIHNwZWNpYWxseSBuYW1lZCBkZXZpY2UgaW4geW91ciBTRVQgTElORQorICAgICAgIGNvbW1hbmQuIEV4YW1wbGVzOgorICAgICAgICAgICsgTmVYVFNURVA6IC9kZXYvY3VmYSBpbnN0ZWFkIG9mIC9kZXYvY3VhLCAvZGV2L2N1ZmIgaW5zdGVhZCBvZgorICAgICAgICAgICAgL2Rldi9jdWIgKDY4MDQwIG9ubHk7ICJtYW4genMiIGZvciBmdXJ0aGVyIGluZm8pLgorICAgICAgICAgICsgSVJJWDogL2Rldi90dHlmMiBpbnN0ZWFkIG9mIC9kZXYvdHR5ZDIgb3IgL2Rldi90dHltMiAoIm1hbiA3CisgICAgICAgICAgICBzZXJpYWwiKS4KKyAgICAzLiBUaGUgQVBJIGlzIGF2YWlsYWJsZSwgZG9lc24ndCB3b3JrLCBidXQgYSB3b3JrYXJvdW5kIGFzIGluICgyKSBjYW4KKyAgICAgICBiZSB1c2VkLgorICAgIDQuIFRoZSBBUEkgaXMgYXZhaWxhYmxlLCBidXQgS2VybWl0IGRvZXNuJ3Qga25vdyBhYm91dCBpdC4gSW4gdGhlc2UKKyAgICAgICBjYXNlcywgeW91IGNhbiB1c3VhbGx5IHVzZSBhbiBzdHR5IGNvbW1hbmQgdG8gZW5hYmxlIFJUUy9DVFMgb24KKyAgICAgICB0aGUgZGV2aWNlLCBlLmcuICJzdHR5IGNydHNjdHMiIG9yICJzdHR5IGN0c2Zsb3ciLCAic3R0eSBydHNmbG93IiwKKyAgICAgICBiZWZvcmUgc3RhcnRpbmcgS2VybWl0LCBhbmQgdGhlbiB0ZWxsIEtlcm1pdCB0byBTRVQgRkxPVyBLRUVQLgorICAgIDUuIE5vIEFQSSBhbmQgbm8gc3BlY2lhbCBkZXZpY2UgZHJpdmVycy4gSGFyZHdhcmUgZmxvdyBjb250cm9sIGlzCisgICAgICAgY29tcGxldGVseSB1bmF2YWlsYWJsZS4KKworICAgU3lzdGVtIFYgUjQgYmFzZWQgVW5peGVzIGFyZSBzdXBwb3NlZCB0byBzdXBwbHkgYSA8dGVybWlveC5oPiBmaWxlLAorICAgd2hpY2ggZ2l2ZXMgS2VybWl0IHRoZSBuZWNlc3NhcnkgaW50ZXJmYWNlIHRvIGNvbW1hbmQgdGhlIHRlcm1pbmFsCisgICBkcml2ZXIgdG8gZW5hYmxlL2Rpc2FibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sLiBVbmZvcnR1bmF0ZWx5LCBidXQKKyAgIHByZWRpY3RhYmx5LCBtYW55IGltcGxlbWVudGF0aW9ucyBvZiBTVlI0IHdoaW1zaWNhbGx5IHBsYWNlIHRoaXMgZmlsZQorICAgaW4gL3Vzci9pbmNsdWRlL3N5cyByYXRoZXIgdGhhbiAvdXNyL2luY2x1ZGUgKHdoZXJlIFNWSUQgY2xlYXJseQorICAgc3BlY2lmaWVzIGl0IHNob3VsZCBiZTsgc2VlIFNWSUQsIFRoaXJkIEVkaXRpb24sIFYxLCB0ZXJtaW94KEJBX0RFVikuCisgICBUaHVzIGlmIHlvdSBidWlsZCBDLUtlcm1pdCB3aXRoIGFueSBvZiB0aGUgbWFrZWZpbGUgZW50cmllcyB0aGF0CisgICBjb250YWluIC1EVEVSTUlPWCBvciAtRFNURVJNSU9YICh0aGUgbGF0dGVyIHRvIHNlbGVjdAorICAgPHN5cy90ZXJtaW94Lmg+KSwgQy1LZXJtaXQgd2lsbCBoYXZlICJzZXQgZmxvdyBydHMvY3RzIiBhbmQgcG9zc2libHkKKyAgIG90aGVyIGhhcmR3YXJlIGZsb3ctY29udHJvbCByZWxhdGVkIGNvbW1hbmRzLiBCVVQuLi4gVGhhdCBkb2VzIG5vdAorICAgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IHRoZXkgd2lsbCB3b3JrLiBJbiBzb21lIGNhc2VzLCB0aGUgdW5kZXJseWluZworICAgZnVuY3Rpb25zIGFyZSBzaW1wbHkgbm90IGNvZGVkIGludG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uCisKKyAgIFdBUk5JTkc6IFdoZW4gaGFyZHdhcmUgZmxvdyBjb250cm9sIGlzIGF2YWlsYWJsZSwgYW5kIHlvdSBlbmFibGUgaW4KKyAgIEtlcm1pdCBvbiBhIGRldmljZSB0aGF0IGlzIG5vdCByZWNlaXZpbmcgdGhlIENUUyBzaWduYWwsIEtlcm1pdCBjYW4KKyAgIGhhbmcgd2FpdGluZyBmb3IgQ1RTIHRvIGNvbWUgdXAuIFRoaXMgaXMgbW9zdCBlYXNpbHkgc2VlbiB3aGVuIHRoZQorICAgbG9jYWwgc2VyaWFsIHBvcnQgaGFzIG5vdGhpbmcgcGx1Z2dlZCBpbiB0byBpdCwgb3IgaXMgY29ubmVjdGVkIHRvIGFuCisgICBleHRlcm5hbCBtb2RlbSB0aGF0IGlzIHBvd2VyZWQgb2ZmLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDkuIFRFUk1JTkFMIENPTk5FQ1RJT04gQU5EIEtFWSBNQVBQSU5HCisKKyAgIFsgWzU2MV1Ub3AgXSBbIFs1NjJdQ29udGVudHMgXSBbIFs1NjNdTmV4dCBdIFsgWzU2NF1QcmV2aW91cyBdCisKKyAgIEMtS2VybWl0IGlzIG5vdCBhIHRlcm1pbmFsIGVtdWxhdG9yLiBSZWZlciB0byBwYWdlIDE0NyBvZiBbNTY1XVVzaW5nCisgICBDLUtlcm1pdCwgMm5kIEVkaXRpb246ICJNb3N0IHZlcnNpb25zIG9mIEMtS2VybWl0IC0tIFVuaXgsIFZNUywKKyAgIEFPUy9WUywgVk9TLCBldGMgLS0gcHJvdmlkZSB0ZXJtaW5hbCBjb25uZWN0aW9uIHdpdGhvdXQgZW11bGF0aW9uLgorICAgVGhlc2UgdmVyc2lvbnMgYWN0IGFzIGEgJ3NlbWl0cmFuc3BhcmVudCBwaXBlJyBiZXR3ZWVuIHRoZSByZW1vdGUKKyAgIGNvbXB1dGVyIGFuZCB5b3VyIHRlcm1pbmFsLCB0ZXJtaW5hbCBlbXVsYXRvciwgY29uc29sZSBkcml2ZXIsIG9yCisgICB3aW5kb3csIHdoaWNoIGluIHR1cm4gZW11bGF0ZXMgKG9yIGlzKSBhIHNwZWNpZmljIGtpbmQgb2YgdGVybWluYWwuIgorICAgVGhlIGVudmlyb25tZW50IGluIHdoaWNoIHlvdSBydW4gQy1LZXJtaXQgaXMgdXAgdG8geW91LgorCisgICBJZiB5b3UgYXJlIGFuIFggV2luZG93cyB1c2VyLCB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mIGFuIGFsdGVybmF0aXZlIHRvCisgICB4dGVybSB0aGF0IHN1cHBvcnRzIFZUMjIwIGVtdWxhdGlvbiwgZnJvbSBUaG9tYXMgRS4gRGlja2V5OgorCisgIFs1NjZdaHR0cDovL2RpY2tleS5oaXMuY29tL3h0ZXJtL3h0ZXJtLmh0bWwKKworICAgVW5peCBDLUtlcm1pdCdzIFNFVCBLRVkgY29tbWFuZCBjdXJyZW50bHkgY2FuIG5vdCBiZSB1c2VkIHdpdGgga2V5cworICAgdGhhdCBnZW5lcmF0ZSAid2lkZSIgc2NhbiBjb2RlcyBvciBtdWx0aWJ5dGUgc2VxdWVuY2VzLCBzdWNoIGFzCisgICB3b3Jrc3RhdGlvbiBmdW5jdGlvbiBvciBhcnJvdyBrZXlzLCBiZWNhdXNlIFVuaXggQy1LZXJtaXQgZG9lcyBub3QKKyAgIGhhdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUga2V5Ym9hcmQuCisKKyAgIEhvd2V2ZXIsIG1hbnkgVW5peCB3b3Jrc3RhdGlvbnMgYW5kL29yIGNvbnNvbGUgZHJpdmVycyBwcm92aWRlIHRoZWlyCisgICBvd24ga2V5IG1hcHBpbmcgZmVhdHVyZS4gV2l0aCB4dGVybSwgZm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlCisgICAneG1vZG1hcCcgKCJtYW4geG1vZG1hcCIgZm9yIGRldGFpbHMpOyBoZXJlIGlzIGFuIHh0ZXJtIG1hcHBpbmcgdG8gbWFwCisgICB0aGUgU3VuIGtleWJvYXJkIHRvIERFQyBWVDIwMCB2YWx1ZXMgZm9yIHVzZSB3aXRoIFZULXRlcm1pbmFsIG9yaWVudGVkCisgICBhcHBsaWNhdGlvbnMgbGlrZSBWTVMgRVZFOgorCisgIGtleWNvZGUgMTAxPUtQXzAKKyAga2V5Y29kZSAxMTk9S1BfMQorICBrZXljb2RlIDEyMD1LUF8yCisgIGtleWNvZGUgMTIxPUtQXzMKKyAga2V5Y29kZSA5OD1LUF80CisgIGtleWNvZGUgOTk9S1BfNQorICBrZXljb2RlIDEwMD1LUF82CisgIGtleWNvZGUgNzU9S1BfNworICBrZXljb2RlIDc2PUtQXzgKKyAga2V5Y29kZSA3Nz1LUF85CisgIGtleWNvZGUgNTI9S1BfRjEKKyAga2V5Y29kZSA1Mz1LUF9GMgorICBrZXljb2RlIDU0PUtQX0YzCisgIGtleWNvZGUgNTc9S1BfRGVjaW1hbAorICBrZXljb2RlIDI4PUxlZnQKKyAga2V5Y29kZSAyOT1SaWdodAorICBrZXljb2RlIDMwPUtQX1NlcGFyYXRvcgorICBrZXljb2RlIDEwNT1LUF9GNAorICBrZXljb2RlIDc4PUtQX1N1YnRyYWN0CisgIGtleWNvZGUgOD1MZWZ0CisgIGtleWNvZGUgMTA9UmlnaHQKKyAga2V5Y29kZSAzMj1VcAorICBrZXljb2RlIDMzPURvd24KKyAga2V5Y29kZSA5Nz1LUF9FbnRlcgorCisgICBVc2VycyBvZiBMaW51eCBjb25zb2xlcyBjYW4gdXNlIGxvYWRrZXlzICgibWFuIGR1bXBrZXlzIGxvYWRrZXlzCisgICBrZXl0YWJsZXMiIGZvciBkZXRhaWxzLiBUaGUgZm9ybWF0IHVzZWQgYnkgbG9hZGtleXMgaXMgY29tcGF0aWJsZSB3aXRoCisgICB0aGF0IHVzZWQgYnkgWG1vZG1hcCwgYWx0aG91Z2ggaXQgaXMgbm90IGRlZmluaXRlbHkgY2VydGFpbiB0aGF0IHRoZQorICAga2V5Y29kZXMgYXJlIGNvbXBhdGlibGUgZm9yIGRpZmZlcmVudCBrZXlib2FyZCB0eXBlcyAoZS5nLiBTdW4gdnMgSFAKKyAgIHZzIFBDLCBldGMpLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEwLiBGSUxFIFRSQU5TRkVSCisKKyAgIFsgWzU2N11Ub3AgXSBbIFs1NjhdQ29udGVudHMgXSBbIFs1NjldTmV4dCBdIFsgWzU3MF1QcmV2aW91cyBdCisKKyAgIElmIHVwbG9hZHMgKG9yIGRvd25sb2FkcykgZmFpbCBpbW1lZGlhdGVseSwgZ2l2ZSB0aGUgQ0FVVElPVVMgY29tbWFuZAorICAgdG8gS2VybWl0IGFuZCB0cnkgYWdhaW4uIElmIHRoZXkgc3RpbGwgZmFpbCwgdGhlbiB0cnkgU0VUIFBSRUZJWElORworICAgQUxMLiBJZiB0aGV5IHN0aWxsIGZhaWwsIHRyeSBTRVQgUEFSSVRZIFNQQUNFLiBJZiB0aGV5IHN0aWxsIGZhaWwsIHRyeQorICAgUk9CVVNULgorCisgICBJZiByZWNlcHRpb24gKHBhcnRpY3VsYXJseSBvZiBsYXJnZSBmaWxlcyBhbmQvb3IgYmluYXJ5IGZpbGVzKSBiZWdpbnMKKyAgIHN1Y2Nlc3NmdWxseSBidXQgdGhlbiBmYWlsIGNvbnN0ZW50bHkgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZiBieXRlcworICAgaGF2ZSBiZWVuIHNlbnQsIGNoZWNrOgorCisgICAgICogWW91ciB1bGltaXQgKCJ1bGltaXQgLWEiKQorICAgICAqIFRoZSBhbW91bnQgb2YgYXZhaWxhYmxlIHNwYWNlIG9uIHRoZSB0YXJnZXQgZGlzayAoImRmIC4iIG9yICJkZiAtaworICAgICAgIC4iKQorICAgICAqIFlvdXIgcGVyc29uYWwgZGlzayBxdW90YSAocGxhdGZvcm0tIGFuZCBzaXRlLWRlcGVuZGVudCkKKyAgICAgKiBUaGUgbWF4aW11bSBmaWxlIHNpemUgb24gdGhlIHJlY2VpdmVyJ3MgZmlsZSBzeXN0ZW0gKGUuZy4gMkdCIGluCisgICAgICAgb2xkIHZlcmlvbnMgdGhlIExpbnV4IFZGUyBmaWxlIHN5c3RlbSwgYW5kL29yIGluIGFwcGxpY2F0aW9ucyB0aGF0CisgICAgICAgaGF2ZSBub3QgYmVlbiByZWNvZGVkIHRvIHVzZSBuZXcgImxhcmdlIGZpbGUiIEFQSXMpLgorICAgICAqIElmIGl0J3MgYW4gTkZTLW1vdW50ZWQgZGlzayAoaWYgc28sIHRyeSB1cGxvYWRpbmcgdG8gYSBsb2NhbCBkaXNrKQorICAgICAqIElzIHRoZXJlIGFuICJpZGxlIGxpbWl0IiBvbiB0aGUgcmVjZWl2aW5nIGVuZD8KKworICAgSWYgbm9uZSBvZiB0aGVzZSBzZWVtIHRvIGV4cGxhaW4gaXQsIHRoZW4gdGhlIHByb2JsZW0gaXMgbm90IHNpemUKKyAgIHJlbGF0ZWQsIGJ1dCByZWZsZWN0cyBzb21lIGNsYXNoIGJldHdlZW4gdGhlIGZpbGUgY29udGVudHMgYW5kIHRoZQorICAgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBjb25uZWN0aW9uLCBpbiB3aGljaCBjYXNlIGZvbGxvdyB0aGUKKyAgIGluc3RydWN0aW9ucyBpbiB0aGUgZmlyc3QgcGFyYWdyYXBoIG9mIHRoaXMgc2VjdGlvbi4KKworICAgU3VwcG9zZSB0d28gY29waWVzIG9mIEtlcm1pdCBhcmUgcmVjZWl2aW5nIGZpbGVzIGludG8gdGhlIHNhbWUKKyAgIGRpcmVjdG9yeSwgYW5kIHRoZSBmaWxlcyBoYXZlIHRoZSBzYW1lIG5hbWUsIGUuZy4gImZvby5iYXIiLiBXaGljaGV2ZXIKKyAgIG9uZSBzdGFydHMgZmlyc3Qgb3BlbnMgYW4gb3V0cHV0IGZpbGUgY2FsbGVkICJmb28uYmFyIi4gVGhlIHNlY29uZCBvbmUKKyAgIHNlZXMgdGhlcmUgaXMgYWxyZWFkeSBhIGZvby5iYXIgZmlsZSwgYW5kIHNvIHJlbmFtZXMgdGhlIGV4aXN0aW5nCisgICBmb28uYmFyIHRvIGZvby5iYXIufjF+IChvciB3aGF0ZXZlcikuIFdoZW4gdGhlIGZpcnN0IGZpbGUgaGFzIGJlZW4KKyAgIHJlY2VpdmVkIGNvbXBsZXRlbHksIEtlcm1pdCBnb2VzIHRvIGNoYW5nZSBpdHMgbW9kaWZpY2F0aW9uIHRpbWUgYW5kCisgICBwZXJtaXNzaW9ucyB0byB0aG9zZSBnaXZlbiBieSB0aGUgZmlsZSBzZW5kZXIgaW4gdGhlIEF0dHJpYnV0ZSBwYWNrZXQuCisgICBCdXQgaW4gVW5peCwgdGhlIEFQSXMgZm9yIGRvaW5nIHRoaXMgdGFrZSBhIGZpbGVuYW1lLCBub3QgYSBmaWxlCisgICBkZXNjcmlwdG9yLiBTaW5jZSB0aGUgZmlyc3QgS2VybWl0J3MgZmlsZSBoYXMgYmVlbiByZW5hbWVkLCBhbmQgdGhlCisgICBzZWNvbmQgS2VybWl0IGlzIHVzaW5nIHRoZSBvcmlnaW5hbCBuYW1lLCB0aGUgZmlyc3QgS2VybWl0IGNoYW5nZXMgdGhlCisgICBtb2R0aW1lIGFuZCBwZXJtaXNzaW9ucyBvZiB0aGUgc2Vjb25kIEtlcm1pdCdzIGZpbGUsIG5vdCBpdHMgb3duLgorICAgQWx0aG91Z2ggdGhlcmUgbWlnaHQgYmUgYSB3YXkgdG8gd29yayBhcm91bmQgdGhpcyBpbiB0aGUgY29kZSwgZS5nLgorICAgdXNpbmcgaW5vZGUgbnVtYmVycyB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGZpbGUgaXMgd2hpY2gsIHRoaXMgd291bGQKKyAgIGJlIHRyaWNreSBhbmQgbW9zdCBsaWtlbHkgbm90IHZlcnkgcG9ydGFibGUuIEl0J3MgYmV0dGVyIHRvIHNldCB1cAorICAgeW91ciBhcHBsaWNhdGlvbiB0byBwcmV2ZW50IHN1Y2ggdGhpbmdzIGZyb20gaGFwcGVuaW5nLCB3aGljaCBpcyBlYXN5CisgICBlbm91Z2ggdXNpbmcgdGhlIHNjcmlwdCBsYW5ndWFnZSwgZmlsZW5hbWUgdGVtcGxhdGVzLCBldGMuCisKKyAgIFN1cHBvc2UgeW91IHN0YXJ0IEMtS2VybWl0IHdpdGggYSBjb21tYW5kLWxpbmUgYXJndW1lbnQgdG8gc2VuZCBvcgorICAgcmVjZWl2ZSBhIGZpbGUgKGUuZy4gImtlcm1pdCAtciIpIGFuZCB0aGVuIHR5cGUgQ3RybC1cYyBpbW1lZGlhdGVseQorICAgYWZ0ZXJ3YXJkcyB0byBlc2NhcGUgYmFjayBhbmQgaW5pdGlhdGUgdGhlIG90aGVyIGVuZCBvZiB0aGUgdHJhbnNmZXIsCisgICBCVVQgeW91ciBsb2NhbCBLZXJtaXQncyBlc2NhcGUgY2hhcmFjdGVyIGlzIG5vdCBDdHJsLVwuIEluIHRoaXMgY2FzZSwKKyAgIHRoZSBsb2NhbCBLZXJtaXQgcGFzc2VzIHRoZSBDdHJsLVwgdG8gdGhlIHJlbW90ZSBzeXN0ZW0sIGFuZCBpZiB0aGlzCisgICBpcyBVbml4LCBDdHJsLVwgaXMgbGlrZWx5IHRvIGJlIGl0cyBTSUdRVUlUIGNoYXJhY3Rlciwgd2hpY2ggY2F1c2VzCisgICB0aGUgY3VycmVudCBwcm9ncmFtIHRvIGhhbHQgYW5kIGR1bXAgY29yZS4gV2VsbCwganVzdCBhYm91dCB0aGUgZmlyc3QKKyAgIHRoaW5nIEMtS2VybWl0IGRvZXMgd2hlbiBpdCBzdGFydHMgaXMgdG8gZGlzYWJsZSB0aGUgU0lHUVVJVCBzaWduYWwuCisgICBIb3dldmVyLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSBmb3IgU0lHUVVJVCB0byBjYXVzZSBLZXJtaXQgdG8gcXVpdCBhbmQKKyAgIGR1bXAgY29yZSBpZiBpdCBpcyBkZWxpdmVyZWQgd2hpbGUgS2VybWl0IGlzIGJlaW5nIGxvYWRlZCBvciBzdGFydGVkLAorICAgYmVmb3JlIHRoZSBzaWduYWwgY2FuIGJlIGRpc2FibGVkLiBUaGVyZSdzIG5vdGhpbmcgS2VybWl0IGl0c2VsZiBjYW4KKyAgIGRvIGFib3V0IHRoaXMsIGJ1dCB5b3UgY2FuIHByZXZlbnQgaXQgZnJvbSBoYXBwZW5pbmcgYnkgZGlzYWJsaW5nCisgICBTSUdRVUlUIGluIHlvdXIgVW5peCBzZXNzaW9uLiBUaGUgY29tbWFuZCBpcyB1c3VhbGx5IHNvbWV0aGluZyBsaWtlOgorCisgIHN0dHkgcXVpdCB1bmRlZgorCisgICBVbml4IEMtS2VybWl0IGRvZXMgbm90IHJlamVjdCBpbmNvbWluZyBmaWxlcyBvbiB0aGUgYmFzaXMgb2Ygc2l6ZS4KKyAgIFRoZXJlIGFwcGVhcnMgdG8gYmUgbm8gZ29vZCAocmVsaWFibGUsIHBvcnRhYmxlKSB3YXkgdG8gZGV0ZXJtaW5lIGluCisgICBhZHZhbmNlIGhvdyBtdWNoIGRpc2sgc3BhY2UgaXMgYXZhaWxhYmxlLCBlaXRoZXIgb24gdGhlIGRldmljZSwgb3IKKyAgICh3aGVuIHF1b3RhcyBvciBvdGhlciBsaW1pdHMgYXJlIGludm9sdmVkKSB0byB0aGUgdXNlci4KKworICAgVW5peCBDLUtlcm1pdCBkaXNjYXJkcyBhbGwgY2FycmlhZ2UgcmV0dXJucyBmcm9tIGluY29taW5nIGZpbGVzIHdoZW4KKyAgIGluIHRleHQgbW9kZS4KKworICAgSWYgQy1LZXJtaXQgaGFzIHByb2JsZW1zIGNyZWF0aW5nIGZpbGVzIGluIHdyaXRhYmxlIGRpcmVjdG9yaWVzIHdoZW4KKyAgIGl0IGlzIGluc3RhbGxlZCBzZXR1aWQgb3Igc2V0Z2lkIG9uIEJTRC1iYXNlZCB2ZXJzaW9ucyBvZiBVbml4IHN1Y2ggYXMKKyAgIE5lWFRTVEVQIDMuMCwgaXQgcHJvYmFibHkgbmVlZHMgdG8gYmUgcmVidWlsdCB3aXRoIHRoZSAtRFNXX0FDQ19JRAorICAgY29tcGlsYXRpb24gc3dpdGNoLgorCisgICBJZiB5b3UgU0VUIEZJTEUgRElTUExBWSBGVUxMU0NSRUVOLCBhbmQgQy1LZXJtaXQgY29tcGxhaW5zICJTb3JyeSwKKyAgIHRlcm1pbmFsIHR5cGUgbm90IHN1cHBvcnRlZCIsIGl0IG1lYW5zIHRoYXQgdGhlIHRlcm1pbmFsIGxpYnJhcnkKKyAgICh0ZXJtY2FwIG9yIHRlcm1saWIpIHRoYXQgQy1LZXJtaXQgd2FzIGJ1aWx0IHdpdGggZG9lcyBub3Qga25vdyBhYm91dAorICAgYSB0ZXJtaW5hbCB3aG9zZSBuYW1lIGlzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHlvdXIgVEVSTSBlbnZpcm9ubWVudAorICAgdmFyaWFibGUuIElmIHRoaXMgaGFwcGVucywgYnV0IHlvdSB3YW50IHRvIGhhdmUgdGhlIGZ1bGxzY3JlZW4gZmlsZQorICAgdHJhbnNmZXIgZGlzcGxheSwgRVhJVCBmcm9tIEMtS2VybWl0IGFuZCBzZXQgYSBVbml4IHRlcm1pbmFsIHR5cGUgZnJvbQorICAgYW1vbmcgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdGhhdCBpcyBhbHNvIHN1cHBvcnRlZCBieSB5b3VyIHRlcm1pbmFsCisgICBlbXVsYXRvciwgb3IgZWxzZSBoYXZlIGFuIGVudHJ5IGZvciB5b3VyIHRlcm1pbmFsIHR5cGUgYWRkZWQgdG8gdGhlCisgICBzeXN0ZW0gdGVybWNhcCBhbmQvb3IgdGVybWluZm8gZGF0YWJhc2UuCisKKyAgIElmIHlvdSBhdHRlbXB0IHRvIHN1c3BlbmQgQy1LZXJtaXQgZHVyaW5nIGxvY2FsLW1vZGUgZmlsZSB0cmFuc2ZlciBhbmQKKyAgIHRoZW4gY29udGludWUgaXQgaW4gdGhlIGJhY2tncm91bmQgKHZpYSBiZyksIGl0IHdpbGwgYmxvY2sgZm9yICJ0dHkKKyAgIG91dHB1dCIgaWYgeW91IGFyZSB1c2luZyB0aGUgRlVMTFNDUkVFTiBmaWxlIHRyYW5zZmVyIGRpc3BsYXkuIFRoaXMgaXMKKyAgIGFwcGFyZW50bHkgYSBwcm9ibGVtIHdpdGggY3Vyc2VzLiBNb3ZpbmcgYSBsb2NhbC1tb2RlIGZpbGUgdHJhbnNmZXIKKyAgIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCB3b3JrcyBjb3JyZWN0bHksCisgICBob3dldmVyLCB3aXRoIHRoZSBTRVJJQUwsIENSVCwgQlJJRUYsIG9yIE5PTkUgZmlsZSB0cmFuc2ZlciBkaXNwbGF5cy4KKworICAgSWYgQy1LZXJtaXQncyBjb21tYW5kIHBhcnNlciBubyBsb25nZXIgZWNob2VzLCBvciBvdGhlcndpc2UgYWN0cworICAgc3RyYW5nZWx5LCBhZnRlciByZXR1cm5pbmcgZnJvbSBhIGZpbGUgdHJhbnNmZXIgd2l0aCB0aGUgZnVsbHNjcmVlbgorICAgKGN1cnNlcykgZGlzcGxheSwgYW5kIHRoZSBjdXJzZXMgbGlicmFyeSBmb3IgeW91ciB2ZXJzaW9uIG9mIFVuaXgKKyAgIGluY2x1ZGVzIHRoZSBuZXd0ZXJtKCkgZnVuY3Rpb24sIHRoZW4gdHJ5IHJlYnVpbGRpbmcgeW91ciB2ZXJzaW9uIG9mCisgICBDLUtlcm1pdCB3aXRoIC1EQ0tfTkVXVEVSTS4gU2ltaWxhcmx5IGlmIGl0IGVjaG9lcyBkb3VibHksIHdoaWNoIG1pZ2h0CisgICBldmVuIGhhcHBlbiBkdXJpbmcgYSBzdWJzZXF1ZW50IENPTk5FQ1Qgc2Vzc2lvbi4gSWYgcmVidWlsZGluZyB3aXRoCisgICAtRENLX05FV1RFUk0gZG9lc24ndCBmaXggaXQsIHRoZW4gdGhlcmUgaXMgc29tZXRoaW5nIHZlcnkgc3RyYW5nZQorICAgYWJvdXQgeW91ciBzeXN0ZW0ncyBjdXJzZXMgbGlicmFyeSwgYW5kIHlvdSBzaG91bGQgcHJvYmFibHkgbm90IHVzZQorICAgaXQuIFRlbGwgQy1LZXJtaXQgdG8gU0VUIEZJTEUgRElTUExBWSBDUlQsIEJSSUVGLCBvciBhbnl0aGluZyBlbHNlCisgICBvdGhlciB0aGFuIEZVTExTQ1JFRU4sIGFuZC9vciByZWJ1aWxkIHdpdGhvdXQgLURDS19DVVJTRVMsIGFuZCB3aXRob3V0CisgICBsaW5raW5nIHdpdGggKHRlcm1saWIgYW5kKSBjdXJzZXMuIE5vdGU6IFRoaXMgcHJvYmxlbSBzZWVtZWQgdG8gaGF2ZQorICAgZXNjYWxhdGVkIGluIEMtS2VybWl0IDcuMCwgYW5kIC1EQ0tfTkVXVEVSTSBoYWQgdG8gYmUgYWRkZWQgdG8gbWFueQorICAgYnVpbGRzIHRoYXQgcHJldmlvdXNseSB3b3JrZWQgd2l0aG91dCBpdDogTGludXgsIEFJWCA0LjEsIERHL1VYLCBldGMuCisgICBJbiB0aGUgTGludXggY2FzZSwgaXQgaXMgb2J2aW91c2x5IGJlY2F1c2Ugb2YgY2hhbmdlcyBpbiB0aGUgKG4pY3Vyc2VzCisgICBsaWJyYXJ5OyB0aGUgY2F1c2UgaW4gdGhlIG90aGVyIGNhc2VzIGlzIG5vdCBrbm93bi4KKworICAgQy1LZXJtaXQgY3JlYXRlcyBiYWNrdXAtZmlsZSBuYW1lcyAoc3VjaCBhcyAib29mYS50eHQufjF+IikgYmFzZWQgb24KKyAgIGl0cyBrbm93bGVkZ2Ugb2YgdGhlIG1heGltdW0gZmlsZW5hbWUgbGVuZ3RoIG9uIHRoZSBwbGF0Zm9ybSB3aGVyZSBpdAorICAgaXMgcnVubmluZywgd2hpY2ggaXMgbGVhcm5lZCBhdCBjb21waWxlIHRpbWUsIGJhc2VkIG9uIE1BWE5BTUxFTiBvcgorICAgZXF1aXZhbGVudCBzeW1ib2xzIGZyb20gdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMuIEJ1dCBzdXBwb3NlIEMtS2VybWl0CisgICBpcyByZWNlaXZpbmcgZmlsZXMgb24gYSBVbml4IHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMgbG9uZyBmaWxlbmFtZXMsCisgICBidXQgdGhlIGluY29taW5nIGZpbGVzIGFyZSBiZWluZyBzdG9yZWQgb24gYW4gTkZTLW1vdW50ZWQgZmlsZSBzeXN0ZW0KKyAgIHRoYXQgc3VwcG9ydHMgb25seSBzaG9ydCBuYW1lcy4gTkZTIG1hcHMgdGhlIGV4dGVybmFsIHN5c3RlbSB0byB0aGUKKyAgIGxvY2FsIEFQSXMsIHNvIEMtS2VybWl0IGhhcyBubyB3YXkgb2Yga25vd2luZyB0aGF0IGxvbmcgbmFtZXMgd2lsbCBiZQorICAgdHJ1bmNhdGVkLiBPciB0aGF0IEMtS2VybWl0IGlzIHJ1bm5pbmcgb24gYSB2ZXJzaW9uIG9mIFVuaXggdGhhdAorICAgc3VwcG9ydHMgYm90aCBsb25nLW5hbWUgYW5kIHNob3J0LW5hbWUgZmlsZSBzeXN0ZW1zIHNpbXVsdGFuZW91c2x5CisgICAoc3VjaCBhcyBIUC1VWCA3LjAwKS4gVGhpcyBjYW4gY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvciB3aGVuIGNyZWF0aW5nCisgICBiYWNrdXAgZmlsZXMsIG9yIHdvcnNlLiBGb3IgZXhhbXBsZSwgeW91IGFyZSBzZW5kaW5nIGEgZ3JvdXAgb2YgZmlsZXMKKyAgIHdob3NlIG5hbWVzIGFyZSBkaWZmZXJlbnRpYXRlZCBvbmx5IGJ5IGNoYXJhY3RlcnMgcGFzdCB0aGUgcG9pbnQgYXQKKyAgIHdoaWNoIHRoZXkgd291bGQgYmUgdHJ1bmNhdGVkLCBlYWNoIGZpbGUgd2lsbCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzCisgICBvbmUgdXBvbiBhcnJpdmFsLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDExLiBFWFRFUk5BTCBGSUxFIFRSQU5TRkVSIFBST1RPQ09MUworCisgICBbIFs1NzFdVG9wIF0gWyBbNTcyXUNvbnRlbnRzIF0gWyBbNTczXU5leHQgXSBbIFs1NzRdUHJldmlvdXMgXQorCisgICBTRUNUSU9OIENPTlRFTlRTCisKKyAgMTEuMS4gWzU3NV1DLUtlcm1pdCBhcyBhbiBFeHRlcm5hbCBQcm90b2NvbAorICAxMS4yLiBbNTc2XUludm9raW5nIEV4dGVybmFsIFByb3RvY29scyBmcm9tIEMtS2VybWl0CisKKyAgIFVuaXggQy1LZXJtaXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBvdGhlciBjb21tdW5pY2F0aW9ucworICAgc29mdHdhcmUgaW4gdmFyaW91cyB3YXlzLiBDLUtlcm1pdCBjYW4gYmUgaW52b2tlZCBmcm9tIGFub3RoZXIKKyAgIGNvbW11bmljYXRpb25zIHByb2dyYW0gYXMgYW4gImV4dGVybmFsIHByb3RvY29sIiwgYW5kIEMtS2VybWl0IGNhbgorICAgYWxzbyBpbnZva2Ugb3RoZXIgY29tbXVuaWNhdGlvbiBzb2Z0d2FyZSB0byBwZXJmb3JtIGV4dGVybmFsCisgICBwcm90b2NvbHMuCisKKyAgIFRoaXMgc29ydCBvZiBvcGVyYXRpb24gbWFrZXMgc2Vuc2Ugb25seSB3aGVuIHlvdSBhcmUgZGlhbGluZyBvdXQgZnJvbQorICAgeW91ciBVbml4IHN5c3RlbSAob3IgbWFraW5nIGEgbmV0d29yayBjb25uZWN0aW9uIGZyb20gaXQpLiBJZiB0aGUgVW5peAorICAgc3lzdGVtIGlzIHRoZSBvbmUgeW91IGhhdmUgZGlhbGVkIGluIHRvLCB5b3UgZG9uJ3QgbmVlZCBhbnkgb2YgdGhlc2UKKyAgIHRyaWNrcy4gSnVzdCBydW4gdGhlIGRlc2lyZWQgc29mdHdhcmUgb24geW91ciBVbml4IHN5c3RlbSBpbnN0ZWFkIG9mCisgICBLZXJtaXQuIFdoZW4gZGlhbGluZyBvdXQgZnJvbSBhIFVuaXggc3lzdGVtLCB0aGUgZGlmZmljdWx0eSBpcyBnZXR0aW5nCisgICB0d28gcHJvZ3JhbXMgdG8gc2hhcmUgdGhlIHNhbWUgY29tbXVuaWNhdGlvbiBkZXZpY2UgaW4gc3BpdGUgb2YgdGhlCisgICBVbml4IFVVQ1AgbG9ja2ZpbGUgbWVjaGFuaXNtLCB3aGljaCB3b3VsZCBub3JtYWxseSBwcmV2ZW50IGFueQorICAgc2hhcmluZywgYW5kIHByZXZlbnRpbmcgdGhlIGV4dGVybmFsIHByb3RvY29sIGZyb20gY2xvc2luZyAoYW5kCisgICB0aGVyZWZvcmUgaGFuZ2luZyB1cCkgdGhlIGRldmljZSB3aGVuIGl0IGV4aXRzIGJhY2sgdG8gdGhlIHByb2dyYW0KKyAgIHRoYXQgaW52b2tlZCBpdC4KKworICAxMS4xLiBDLUtFUk1JVCBBUyBBTiBFWFRFUk5BTCBQUk9UT0NPTAorCisgICBbIFs1NzddVG9wIF0gWyBbNTc4XUNvbnRlbnRzIF0gWyBbNTc5XVNlY3Rpb24gQ29udGVudHMgXSBbIFs1ODBdTmV4dCBdCisKKyAgIChUaGlzIHNlY3Rpb24gZGVsZXRlZDsgc2VlIFs1ODFdVXNpbmcgQy1LZXJtaXQsIDJuZCBFZCwgQ2hhcHRlciAxNC4pCisKKyAgICJwY29tbSIgaXMgYSBnZW5lcmFsLXB1cnBvc2UgdGVybWluYWwgcHJvZ3JhbSB0aGF0IHByb3ZpZGVzIGZpbGUKKyAgIHRyYW5zZmVyIGNhcGFiaWxpdGllcyBpdHNlbGYgKFgtIGFuZCBZTU9ERU0gdmFyaWF0aW9ucykgYW5kIHRoZQorICAgYWJpbGl0eSB0byBjYWxsIG9uIGV4dGVybmFsIHByb2dyYW1zIHRvIGRvIGZpbGUgdHJhbnNmZXJzIChaTU9ERU0gYW5kCisgICBLZXJtaXQsIGZvciBleGFtcGxlKS4gWW91IGNhbiB0ZWxsIHBjb21tIHRoZSBjb21tYW5kIHRvIHNlbmQgb3IKKyAgIHJlY2VpdmUgYSBmaWxlIHdpdGggYW4gZXh0ZXJuYWwgcHJvdG9jb2w6CisgICAgICAgICAgICAgICAgICAgICAgICBTZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY2VpdmUgIAorICAgICAgICBaTU9ERU0gICAgICAgICAgc3ogZmlsZW5hbWUgICAgICAgICAgICAgICAgICAgICByegorICAgICAgICBLZXJtaXQgICAgICAgICAga2VybWl0IC1zIGZpbGVuYW1lICAgICAgICAgICAgICBrZXJtaXQgLXIKKworICAgcGNvbW0gcnVucyBleHRlcm5hbCBwcm9ncmFtcyBmb3IgZmlsZSB0cmFuc2ZlciBieSBtYWtpbmcgc3RkaW4gYW5kCisgICBzdGRvdXQgcG9pbnQgdG8gdGhlIG1vZGVtIHBvcnQsIGFuZCB0aGVuIGV4ZWMtaW5nICIvYmluL3NoIC1jIHh4eCIKKyAgICh3aGVyZSB4eHggaXMgdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQpLiBIb3dldmVyLCBDLUtlcm1pdCBkb2VzIG5vdAorICAgdHJlYXQgc3RkaW4gYW5kIHN0ZG91dCBhcyB0aGUgY29tbXVuaWNhdGlvbiBkZXZpY2UgdW5sZXNzIHlvdSBpbnN0cnVjdAorICAgaXQ6CisKKworICAgICAgICAgICAgICAgICAgICAgICAgU2VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNlaXZlICAKKyAgICAgICAgS2VybWl0ICAgICAgICAgIGtlcm1pdCAtbCAwIC1zIGZpbGVuYW1lICAgICAgICAga2VybWl0IC1sIDAgLXIKKworICAgVGhlICItbCAwIiBvcHRpb24gbWVhbnMgdG8gdXNlIGZpbGUgZGVzY3JpcHRvciAwIGZvciB0aGUgY29tbXVuaWNhdGlvbgorICAgZGV2aWNlLgorCisgICBJbiBnZW5lcmFsLCBhbnkgcHJvZ3JhbSBjYW4gcGFzcyBhbnkgb3BlbiBmaWxlIGRlc2NyaXB0b3IgdG8gQy1LZXJtaXQKKyAgIGZvciB0aGUgY29tbXVuaWNhdGlvbiBkZXZpY2UgaW4gdGhlICItbCIgY29tbWFuZC1saW5lIG9wdGlvbi4gV2hlbgorICAgS2VybWl0IGlzIGdpdmVuIGEgbnVtYmVyIGFzIHRoZSBhcmd1bWVudCB0byB0aGUgIi1sIiBvcHRpb24sIGl0IHNpbXBseQorICAgdXNlcyBpdCBhcyBhIGZpbGUgZGVzY3JpcHRvciwgYW5kIGl0IGRvZXMgbm90IGF0dGVtcHQgdG8gY2xvc2UgaXQgdXBvbgorICAgZXhpdC4KKworICAgSGVyZSdzIGFub3RoZXIgZXhhbXBsZSwgZm9yIFNleW9uIChhIExpbnV4IGNvbW11bmljYXRpb24gcHJvZ3JhbSkuCisgICBGaXJzdCB0cnkgdGhlIHRlY2huaXF1ZSBhYm92ZS4gSWYgdGhhdCB3b3JrcywgZmluZTsgb3RoZXJ3aXNlLi4uIElmCisgICBTZXlvbiBkb2VzIG5vdCBnaXZlIHlvdSBhIHdheSB0byBhY2Nlc3MgYW5kIHBhc3MgYWxvbmcgdGhlIGZpbGUKKyAgIGRlc2NyaXB0b3IsIGJ1dCBpdCBzdGFydHMgdXAgdGhlIEtlcm1pdCBwcm9ncmFtIHdpdGggaXRzIHN0YW5kYXJkIGkvbworICAgcmVkaXJlY3RlZCB0byBpdHMgKFNleW9uJ3MpIGNvbW11bmljYXRpb25zIGZpbGUgZGVzY3JpcHRvciwgeW91IGNhbgorICAgYWxzbyBleHBlcmltZW50IHdpdGggdGhlIGZvbGxvd2luZyBtZXRob2QsIHdoaWNoIHdvcmtlZCBoZXJlIGluIGJyaWVmCisgICB0ZXN0cyBvbiBTdW5PUy4gSW5zdGVhZCBvZiBoYXZpbmcgU2V5b24gdXNlICJrZXJtaXQgLXIiIG9yICJrZXJtaXQgLXMKKyAgIGZpbGVuYW1lIiBhcyBpdHMgS2VybWl0IHByb3RvY29sIGNvbW1hbmRzLCB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcworICAgKGV4YW1wbGVzIGFzc3VtZSBDLUtlcm1pdCA2LjApOgorCisgICBGb3Igc2VyaWFsIGNvbm5lY3Rpb25zOgorCisgIGtlcm1pdCAtWXFRbCAwIC1yICAgICAgICAgICAgICAgICAgICAgPC0tIHRvIHJlY2VpdmUKKyAga2VybWl0IC1ZcVFsIDAgLXMgZmlsZW5hbWUocykgICAgICAgICA8LS0gdG8gc2VuZCBvbmUgb3IgbW9yZSBmaWxlcworCisgICBGb3IgVGVsbmV0IGNvbm5lY3Rpb25zOgorCisgIGtlcm1pdCAtWXFRRiAwIC1yICAgICAgICAgICAgICAgICAgICAgPC0tIHRvIHJlY2VpdmUKKyAga2VybWl0IC1ZcVFGIDAgLXMgZmlsZW5hbWUocykgICAgICAgICA8LS0gdG8gc2VuZCBvbmUgb3IgbW9yZSBmaWxlcworCisgICBDb21tYW5kIGxpbmUgb3B0aW9uczoKKworICBZICAgIC0gc2tpcCBleGVjdXRpbmcgdGhlIGluaXQgZmlsZQorICBRICAgIC0gdXNlIGZhc3QgZmlsZSB0cmFuc2ZlciBzZXR0aW5ncyAoZGVmYXVsdCBpbiA4LjApCisgIGwgMCAgLSB0cmFuc2ZlciBmaWxlcyB1c2luZyBmaWxlIGRlc2NyaXB0b3IgMCBmb3IgYSBzZXJpYWwgY29ubmVjdGlvbgorICBGIDAgIC0gdHJhbnNmZXIgZmlsZXMgdXNpbmcgZmlsZSBkZXNjcmlwdG9yIDAgZm9yIGEgVGVsbmV0IGNvbm5lY3Rpb24KKyAgcSAgICAtIHF1aWV0IC0gbm8gbWVzc2FnZXMKKyAgciAgICAtIHJlY2VpdmUKKyAgcyAgICAtIHNlbmQKKworICAxMS4yLiBJTlZPS0lORyBFWFRFUk5BTCBQUk9UT0NPTFMgRlJPTSBDLUtFUk1JVAorCisgICBbIFs1ODJdVG9wIF0gWyBbNTgzXUNvbnRlbnRzIF0gWyBbNTg0XVNlY3Rpb24gQ29udGVudHMgXSBbCisgICBbNTg1XVByZXZpb3VzIF0KKworICAgICAoVGhpcyBzZWN0aW9uIGlzIG9ic29sZXRlLCBidXQgbm90IHRvdGFsbHkgdXNlbGVzcy4gU2VlIENoYXB0ZXIgMTQKKyAgICAgb2YgWzU4Nl1Vc2luZyBDLUtlcm1pdCwgMm5kIEVkaXRpb24pLiAKKworICAgQWZ0ZXIgeW91IGhhdmUgb3BlbmVkIGEgY29tbXVuaWNhdGlvbiBsaW5rIHdpdGggQy1LZXJtaXQncyBTRVQgTElORQorICAgKFNFVCBQT1JUKSBvciBTRVQgSE9TVCAoVEVMTkVUKSBjb21tYW5kLCBDLUtlcm1pdCBtYWtlcyBpdHMgZmlsZQorICAgZGVzY3JpcHRvciBhdmFpbGFibGUgdG8geW91IGluIHRoZSBcdih0dHlmZCkgdmFyaWFibGUgc28geW91IGNhbiBwYXNzCisgICBpdCBhbG9uZyB0byBvdGhlciBwcm9ncmFtcyB0aGF0IHlvdSBSVU4gZnJvbSBDLUtlcm1pdC4gSGVyZSwgZm9yCisgICBleGFtcGxlLCBDLUtlcm1pdCBydW5zIGl0c2VsZiBhcyBhbiBleHRlcm5hbCBwcm90b2NvbDoKKworICBDLUtlcm1pdD5zZXQgbW9kZW0gdHlwZSBoYXllcworICBDLUtlcm1pdD5zZXQgbGluZSAvZGV2L2FjdQorICBDLUtlcm1pdD5zZXQgc3BlZWQgMjQwMAorICBDLUtlcm1pdD5kaWFsIDc2NTQzMjEKKyAgIENhbGwgY29tcGxldGUuCisgIEMtS2VybWl0PmVjaG8gXHYodHR5ZmQpCisgICAzCisgIEMtS2VybWl0PnJ1biBrZXJtaXQgLWwgXHYodHR5ZmQpCisKKyAgIE90aGVyIHByb2dyYW1zIHRoYXQgYWNjZXB0IG9wZW4gZmlsZSBkZXNjcmlwdG9ycyBvbiB0aGUgY29tbWFuZCBsaW5lCisgICBjYW4gYmUgc3RhcnRlZCBpbiB0aGUgc2FtZSB3YXkuCisKKyAgIFlvdSBjYW4gYWxzbyB1c2UgeW91ciBzaGVsbCdzIGkvbyByZWRpcmVjdGlvbiBmYWNpbGl0aWVzIHRvIGFzc2lnbgorICAgQy1LZXJtaXQncyBvcGVuIGZpbGUgZGVzY3JpcHRvciAodHR5ZmQpIHRvIHN0ZGluIG9yIHN0ZG91dC4gRm9yCisgICBleGFtcGxlLCBvbGQgdmVyc2lvbnMgb2YgdGhlIFVuaXggWk1PREVNIHByb2dyYW1zLCBzeiBhbmQgcnosIHdoZW4KKyAgIGludm9rZWQgYXMgZXh0ZXJuYWwgcHJvdG9jb2xzLCBleHBlY3QgdG8gZmluZCB0aGUgY29tbXVuaWNhdGlvbiBkZXZpY2UKKyAgIGFzc2lnbmVkIHRvIHN0ZGluIGFuZCBzdGRvdXQgd2l0aCBubyBvcHRpb24gZm9yIHNwZWNpZnlpbmcgYW55IG90aGVyCisgICBmaWxlIGRlc2NyaXB0b3Igb24gdGhlIHN6IG9yIHJ6IGNvbW1hbmQgbGluZS4gSG93ZXZlciwgeW91IGNhbiBzdGlsbAorICAgaW52b2tlIHN6IGFuZCByeiBhcyBleHRlcmlvciBwcm90b2NvbHMgZnJvbSBDLUtlcm1pdCBpZiB5b3VyIGN1cnJlbnQKKyAgIHNoZWxsICgkU0hFTEwgdmFyaWFibGUpIGlzIGtzaCAodGhlIEtvcm4gc2hlbGwpIG9yIGJhc2ggKHRoZQorICAgQm91cm5lLUFnYWluIHNoZWxsKSwgd2hpY2ggYWxsb3dzIGFzc2lnbm1lbnQgb2YgYXJiaXRyYXJ5IGZpbGUKKyAgIGRlc2NyaXB0b3JzIHRvIHN0ZGluIGFuZCBzdGRvdXQ6CisKKyAgQy1LZXJtaXQ+IHJ1biByeiA8Jlx2KHR0eWZkKSA+Jlx2KHR0eWZkKQorCisgICBvcjoKKworICBDLUtlcm1pdD4gcnVuIHN6IG9vZmEuemlwIDwmXHYodHR5ZmQpID4mXHYodHR5ZmQpCisKKyAgIEluIHZlcnNpb24gNUEoMTkwKSBhbmQgbGF0ZXIsIHlvdSBjYW4gdXNlIEMtS2VybWl0J3MgUkVESVJFQ1QgY29tbWFuZCwKKyAgIGlmIGl0IGlzIGF2YWlsYWJsZSBpbiB5b3VyIHZlcnNpb24gb2YgQy1LZXJtaXQsIHRvIGFjY29tcGxpc2ggdGhlIHNhbWUKKyAgIHRoaW5nIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgc2hlbGw6CisKKyAgQy1LZXJtaXQ+IHJlZGlyZWN0IHJ6CisKKyAgIG9yOgorCisgIEMtS2VybWl0PiByZWRpcmVjdCBzeiBvb2ZhLnppcAorCisgICBBIGNvbXBsZXRlIHNldCBvZiByeixzeixyYixzYixyeCxzeCBtYWNyb3MgZm9yIFVuaXggQy1LZXJtaXQgaXMKKyAgIGRlZmluZWQgaW4gdGhlIGZpbGUgY2t1cnpzei5pbmkuIEl0IGF1dG9tYXRpY2FsbHkgY2hvb3NlcyB0aGUgYmVzdAorICAgcmVkaXJlY3Rpb24gbWV0aG9kIChidXQgaXMgcmVkdW5kYW50IHNpbmNlIEMtS2VybWl0IDYuMCwgd2hpY2ggbm93IGhhcworICAgYnVpbHQtaW4gc3VwcG9ydCBmb3IgZXh0ZXJuYWwgcHJvdG9jb2xzIHZpYSBpdHMgU0VUIFBST1RPQ09MIGNvbW1hbmQpLgorCisgICBOb3RlIHRoYXQgZXh0ZXJuYWwgcHJvdG9jb2xzIGNhbiBiZSB1c2VkIG9uIEMtS2VybWl0IFNFVCBMSU5FIG9yIFNFVAorICAgSE9TVCBjb25uZWN0aW9ucyBvbmx5IGlmIHRoZXkgb3BlcmF0ZSB0aHJvdWdoIHN0YW5kYXJkIGlucHV0IGFuZAorICAgc3RhbmRhcmQgb3V0cHV0LiBJZiB0aGV5IG9wZW4gdGhlaXIgb3duIGNvbm5lY3Rpb25zLCBLZXJtaXQgY2FuJ3QKKyAgIHJlZGlyZWN0IHRoZW0gb3ZlciBpdHMgb3duIGNvbm5lY3Rpb24uCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgMTIuIFNFQ1VSSVRZCisKKyAgIFsgWzU4N11Ub3AgXSBbIFs1ODhdQ29udGVudHMgXSBbIFs1ODldTmV4dCBdIFsgWzU5MF1QcmV2aW91cyBdCisKKyAgIEFzIG9mIHZlcnNpb24gNy4wLCBDLUtlcm1pdCBzdXBwb3J0cyBhIHdpZGUgcmFuZ2Ugb2Ygc2VjdXJpdHkgb3B0aW9ucworICAgZm9yIGF1dGhlbnRpY2F0aW9uIGFuZCBlbmNyeXB0aW9uOiBLZXJiZXJvcyA0LCBLZXJiZXJvcyA1IC8gR1NTQVBJLAorICAgU1NML1RMUywgYW5kIFNSUC4gU2VlIHRoZSBzZXBhcmF0ZSBbNTkxXXNlY3VyaXR5IGRvY3VtZW50IGZvciBkZXRhaWxzLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEzLiBNSVNDRUxMQU5FT1VTIFVTRVIgUkVQT1JUUworCisgICBbIFs1OTJdVG9wIF0gWyBbNTkzXUNvbnRlbnRzIF0gWyBbNTk0XU5leHQgXSBbIFs1OTVdUHJldmlvdXMgXQorCitEYXRlOiBUaHUsIDEyIE1hciA5MiAxOjU5OjI1IE1FWgorRnJvbTogV2FsdGVyIE1lY2t5IDx3YWx0ZXJAcmVudC1hLWd1cnUuZGU+CitTdWJqZWN0OiBIZWxwLlVuaXguc3cKK1RvOiBzdnI0QHBjc2JzdC5wY3MuY29tLCBzb3VyY2VAdXNsLmNvbQorCitQUk9EVUNUOiAgICAgICAgVW5peAorUkVMRUFTRTogICAgICAgIERlbGwgU1ZSNCBWMi4xIChpcyBVU0wgVjMuMCkKK01BQ0hJTkU6ICAgICAgICBBVC0zODYKK1BBVEhOQU1FOiAgICAgICAvdXNyL2xpYi9saWJjLnNvLjEKKyAgICAgICAgICAgICAgICAvdXNyL2Njcy9saWIvbGliYy5hCitBQlNUUkFDVDogICAgICAgRnVuY3Rpb24gdHR5bmFtZSgpIGRvZXMgbm90IGNsb3NlIGl0cyBmaWxlIGRlc2NyaXB0b3IKK0RFU0NSSVBUSU9OOgorICAgICAgICB0dHluYW1lKDNDKSBvcGVucyAvZGV2IGJ1dCBuZXZlciBjbG9zZXMgaXQuIFNvIGlmIGl0IGlzIGNhbGxlZAorICAgICAgICBvZnRlbiBlbm91Z2ggdGhlIG9wZW4oMikgaW4gdHR5bmFtZSgpIGZhaWxzLiBCZWNhdXNlIHRoZSBicm9rZW4KKyAgICAgICAgdHR5bmFtZSgpIGlzIGluIHRoZSBzaGFyZWQgbGliIHRvbyBhbGwgcHJvZ3JhbXMgdXNpbmcgaXQgY2FuCisgICAgICAgIGZhaWwgaWYgdGhleSBjYWxsIGl0IG9mdGVuIGVub3VnaC4gT25lIGltcG9ydGFudCBwcm9ncmFtIGlzCisgICAgICAgIHV1Y2ljbyB3aGljaCBjYWxscyB0dHluYW1lIGZvciBldmVyeSBmaWxlIGl0IHRyYW5zZmVycy4KKworICAgSGVyZSBpcyBhIGxpdHRsZSB0ZXN0IHByb2dyYW0gaWYgeW91ciBzeXN0ZW0gaGFzIHRoZSBidWc6CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorbWFpbigpIHsKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUgKHR0eW5hbWUoMCkgIT0gTlVMTCkKKyAgICAgIGkrKzsKKyAgICBwZXJyb3IoInR0eW5hbWUiKTsKKyAgICBwcmludGYoImk9JWRcbiIsIGkpOworfQorCisgICBJZiB0aGlzIHByb2dyYW0gcnVucyBsb25nZXIgdGhhbiBzb21lIHNlY29uZHMgeW91IGRvbid0IGhhdmUgdGhlIGJ1Zy4KKworICAgV09SS0FST1VORDogTm9uZSBGSVg6IFZlcnkgZWFzeSBpZiB5b3UgaGF2ZSBzb3VyY2UgY29kZS4KKworICAgQW5vdGhlciB1c2VyIHJlcG9ydHMgc29tZSBtb3JlIGV4cGxpY2l0IHN5bXB0b21zIGFuZCByZWNvdmVyaWVzOgorCis+IFdoYXQgaGFwcGVucyBpcyB3aGVuIGludm9raW5nIGNrZXJtaXQgd2UgZ2V0IG9uZSBvZiB0aGUgZm9sbG93aW5nCis+IGVycm9yIG1lc3NhZ2VzOgorPiAgIFlvdSBtdXN0IHNldCBsaW5lCis+ICAgTm90IGEgdHR5Cis+ICAgTm8gbW9yZSBwcm9jZXNzZXMuCis+IE9uZSBvZiB0aGUgZm9sbG93aW5nIHRocmVlIGFjdGlvbnMgY2xlYXJzIHRoZSBwZW9ibGVtOgorPiAgIHNodXRkb3duIC15IC1nMCAtaTYKKz4gICBraWxsIC05IHRoZSB0dHltb24gd2l0aCB0aGUgaGlnaGVzdCBQSUQKKz4gICBJbnZva2Ugc3lzYWRtIGFuZCBkaXNhYmxlIHRoZW4gZW5hYmxlIHRoZSBsaW5lIHlvdSB3YW50IHRvIHVzZS4KKz4gVHVybmluZyBvZmYgcmVzcGF3biBvZiBzYWMgLXQgMzAwIGFuZCBnb2luZyB0byBnZXR0eSdzIGFuZCB1dWdldHR5J3MKKz4gZG9lcyBub3QgaGVscC4KKz4KKz4gQWxzbyBDLUtlcm1pdCByZXBvcnRzICI/dGltZWQgb3V0IGNsb3NpbmcgL2Rldi90dHl4eCIuCis+IElmIHRoaXMgaGFwcGVucyBhbGwgaXMgd2VsbC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIChOb3RlOiB0aGUgZm9sbG93aW5nIHByb2JsZW0gYWxzbyBvY2N1cnMgb24gU0dJIGFuZCBwcm9iYWJseSBtYW55CisgICBvdGhlciBVbml4IHN5c3RlbXMpOgorCisgICBGcm9tOiBKYW1lcyBTcGF0aCA8c3BhdGhAamh1bml4LmhjZi5qaHUuZWR1PgorICAgVG86IEluZm8tS2VybWl0LVJlcXVlc3RAY3VuaXhmLmNjLmNvbHVtYmlhLmVkdQorICAgRGF0ZTogV2VkLCA5IFNlcCAxOTkyIDIwOjIwOjI4IC0wNDAwCisgICBTdWJqZWN0OiBDLUtlcm1pdCB2cyB1dWdldHR5IChvciBpbml0KSBvbiBTcGVycnkgNTAwMAorCisgICBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBjb21waWxlZCB0aGUgYWJvdmUgcmVsZWFzZSBvbiBhIFVuaXN5cy9TcGVycnkKKyAgIDUwMDAvOTUuIFdlIHVzZWQgdGhlIHN5czVyMyBvcHRpb24sIHJhdGhlciB0aGFuIHN5czVyMiBzaW5jZSB3ZSBoYXZlCisgICBWUjMgcnVubmluZyBvbiBvdXIgc3lzdGVtLiBJbiBvcmRlciB0byBhbGxvdyBkaWFsb3V0IGFjY2VzcyB0bworICAgbm9uLXN1cGVydXNlcnMsIHdlIGhhZCB0byBkbyAiY2htb2QgNjY2IC9kZXYvdHR5IyMjLCB3aGVyZSBpdCBoYWQgYmVlbgorICAgLXJ3LS13LS13LSAob3duZWQgYnkgdXVjcCksIGFuZCB0byBkbyAiY2htb2QgK3cgL3Vzci9zcG9vbC9sb2NrcyIuIFdlCisgICBoYXZlIGRvbmUgdGV4dCBhbmQgYmluYXJ5IGZpbGUgdHJhbnNmZXJzIHRocm91Z2ggbG9jYWwgYW5kIHJlbW90ZQorICAgY29ubmVjdGlvbnMuCisKKyAgIFRoZSBwcm9ibGVtIGNvbmNlcm5pbmcgdXVjcCBvd25lcnNoaXAgYW5kIHBlcm1pc3Npb25zIGlzIHdvcnNlIHRoYW4gSQorICAgdGhvdWdodCBhdCBmaXJzdC4gQXBwYXJlbnRseSBpbml0IG9yIHV1Z2V0dHkgY2hhbmdlcyB0aGUgZmlsZQorICAgcGVybWlzc2lvbnMgYWZ0ZXIgZWFjaCBzZXNzaW9uLiBTbyBJIHdyb3RlIHRoZSBmb2xsb3dpbmcgQyBwcm9ncmFtIHRvCisgICBvcGVuIGEgc2V0IG9mIHJlcXVlc3RlZCB0dHkgbGluZXMuIEkgcnVuIHRoaXMgZm9yIGFueSByZXF1aXJlZAorICAgb3V0Z29pbmcgbGluZSBwcmlvciB0byBhIEtlcm1pdCBzZXNzaW9uLgorCisgICAtLS0tLS0gY3V0IGhlcmUgLS0tLS0tLQorLyogb3BlbnR0eS5jIC0tIGZvcmNlIGFsbG93IHJlYWQgb24gdHR5IGxpbmVzIGZvciBtb2RlbSBpL28gKi8KKy8qIGlkZWEgZnJvbTogcmVzdHJpY3QuYyAtLSBTeXN0ZW0gNSBBZG1pbiBib29rIFRob21hcy9GYXJyb3cgcC4gNjA1ICovCisvKiAvamVzIGppbSBzcGF0aCB7c3BhdGhAamh1bml4Lmhjai5qaHUuZWR1IH0gKi8KKy8qIDA4LVNlcC05MiBOTyBDT1BZUklHSFQuICovCisvKiB0aGlzIG11c3QgYmUgc3VpZCB0byBvcGVuIG90aGVyIHR0eSBsaW5lcyAqLworCisvKiAjZGVmaW5lIERFQlVHICovCisjZGVmaW5lIFRUWSAiL2Rldi90dHkiCisjZGVmaW5lIExPSyAiL3Vzci9zcG9vbC9sb2Nrcy9MQ0suLnR0eSIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBhbGxvd2FibGUgbGluZXM6ICovCisjZGVmaW5lIFRPVEFMX0xJTkVTIDMKK3N0YXRpYyBjaGFyIGFsbG93YWJsZVtUT1RBTF9MSU5FU11bNF0gPSB7ICIyMDAiLCAiMjAxIiwgIjMwMCIgfTsKK3N0YXRpYyBpbnQgdG90YWw9VE9UQUxfTElORVM7CitpbnQgYWxsb3c7CisKKy8qIHN0YXRlczogKi8KKyNkZWZpbmUgVFRZX1VOREVGIDAKKyNkZWZpbmUgVFRZX0xPQ0sgIDEKKyNkZWZpbmUgVFRZX09LQVkgIDIKKworbWFpbihhcmdjLCBhcmd2KQoraW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgeworICAgIGNoYXIgZGV2aWNlWzUxMl07CisgICAgY2hhciBsb2NrZGV2WzUxMl07CisgICAgaW50IGk7CisgICAgaWYgKGFyZ2MgPT0gMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBvcGVuIDIwMCBbLi4uXVxuIik7CisgICAgfQorICAgIHdoaWxlICgtLWFyZ2MgPiAwICYmICgqKythcmd2KSAhPSBOVUxMICkgeworI2lmZGVmIERFQlVHCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVFJZSU5HOiAlcyVzXG4iLCBUVFksICphcmd2KTsKKyNlbmRpZgorICAgICAgICBzcHJpbnRmKGRldmljZSwgIiVzJXMiLCBUVFksICphcmd2KTsKKyAgICAgICAgc3ByaW50Zihsb2NrZGV2LCAiJXMlcyIsIExPSywgKmFyZ3YpOworICAgICAgICBhbGxvdyA9IFRUWV9VTkRFRjsgaSA9IDA7CisgICAgICAgIHdoaWxlIChpIDw9IHRvdGFsKSB7IC8qIGxvb2sgYXQgYWxsIGRlZmluZWQgbGluZXMgKi8KKyNpZmRlZiBERUJVRworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJMT0NLRklMRT8gJXM/XG4iLCBsb2NrZGV2KTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGFjY2Vzcyhsb2NrZGV2LCAwMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGFsbG93PVRUWV9MT0NLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorI2lmZGVmIERFQlVHCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRPRVM6JXM9PSVzP1xuIiwgYWxsb3dhYmxlW2ldLCAqYXJndik7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChzdHJjbXAoYWxsb3dhYmxlW2ldLCAqYXJndikgPT0gMCkKKyAgICAgICAgICAgICAgYWxsb3c9VFRZX09LQVk7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyNpZmRlZiBERUJVRworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFsbG93PSVkXG4iLCBhbGxvdyk7CisjZW5kaWYKKyAgICAgICAgc3dpdGNoIChhbGxvdykgeworICAgICAgICAgIGNhc2UgVFRZX1VOREVGOgorICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAib3Blbjogbm90IGFsbG93ZWQgb24gJXNcbiIsICphcmd2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVFRZX0xPQ0s6CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJvcGVuOiBkZXZpY2UgbG9ja2VkOiAlc1xuIiwgbG9ja2Rldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFRUWV9PS0FZOgorICAgICAgICAgICAgLyogYXR0ZW1wdCB0byBjaGFuZ2UgbW9kZSBvbiBkZXZpY2UgKi8KKyAgICAgICAgICAgIGlmIChjaG1vZCAoZGV2aWNlLCAwMDY2NikgPCAwKQorICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJvcGVuOiBjYW5ub3QgY2htb2Qgb24gJXNcbiIsIGRldmljZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAib3BlbjogRkFVTFRcbiIpOworICAgICAgICB9CisgICAgfQorICAgIGV4aXQgKDApOworfQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDE0LiBUSElSRC1QQVJUWSBEUklWRVJTCisKKyAgIFsgWzU5Nl1Ub3AgXSBbIFs1OTddQ29udGVudHMgXSBbIFs1OThdTmV4dCBdIFsgWzU5OV1QcmV2aW91cyBdCisKKyAgIFVuaXggdmVyc2lvbnMsIGVzcGVjaWFsbHkgdGhvc2UgZm9yIFBDcyAoU0NPLCBVbml4d2FyZSwgZXRjKSBtaWdodCBiZQorICAgYXVnbWVudGVkIGJ5IHRoaXJkLXBhcnR5IGNvbW11bmljYXRpb24tYm9hcmQgZHJpdmVycyBmcm9tIERpZ2lib2FyZCwKKyAgIFN0YWxsaW9uLCBldGMuIFRoZXNlIGNhbiBzb21ldGltZXMgY29tcGxpY2F0ZSBtYXR0ZXJzIGZvciBLZXJtaXQKKyAgIGNvbnNpZGVyYWJseSBzaW5jZSBLZXJtaXQgaGFzIG5vIHdheSBvZiBrbm93aW5nIHRoYXQgaXQgaXMgZ29pbmcKKyAgIHRocm91Z2ggYSBwb3NzaWJseSBub25zdGFuZGFyZCBkcml2ZXIuIFZhcmlvdXMgZXhhbXBsZXMgYXJlIGxpc3RlZCBpbgorICAgdGhlIGVhcmxpZXIgc2VjdGlvbnMgb2YgdGhpcyBkb2N1bWVudDsgc2VhcmNoIGZvciBTdGFsbGlvbiwgRGlnaWJvYXJkLAorICAgZXRjLiBBZGRpdGlvbmFsbHk6CisKKyAgICAgKiBUaGUgU3RhbGxpb24gVGVjaG5vbG9naWVzIEVhc3lDb25uZWN0aW9uIHNlcmlhbCBib2FyZCBkcml2ZXIgZG9lcworICAgICAgIG5vdCBhbHdheXMgcmVwb3J0IHRoZSBzdGF0ZSBvZiBEU1IgYXMgbG93LiBGcm9tIFN0YWxsaW9uIChPY3RvYmVyCisgICAgICAgMTk5Nyk6ICJVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIGEgYnVnIGluIG91ciBkcml2ZXIuIFdlIGhhdmUKKyAgICAgICBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIG90aGVyIFRJT01DIGZ1bmN0aW9ucywgZWcgRFRSLCBEQ0QsIFJUUyBhbmQKKyAgICAgICBDVFMsIGJ1dCBub3QgRFNSLiBPdXIgZHJpdmVyIHNob3VsZCByZXBvcnQgdGhlIGFjdHVhbCBzdGF0ZSBvZiBEU1IKKyAgICAgICBvbiB0aG9zZSBvZiBvdXIgY2FyZHMgdGhhdCBoYXZlIGEgRFNSIHNpZ25hbC4gVGhhdCB0aGUgZHJpdmVyCisgICAgICAgYWx3YXlzIHJlcG9ydHMgRFNSIGFzIG5vdCBhc3NlcnRlZCAoMCksIGlzIGEgYnVnIGluIHRoZSBkcml2ZXIuCisgICAgICAgVGhlIGRyaXZlciBzaG91bGQgYmUgZWl0aGVyIHJlcG9ydGluZyB0aGUgc3RhdGUgb2YgRFNSIGNvcnJlY3RseQorICAgICAgIG9uIHRob3NlIGNhcmRzIHRoYXQgc3VwcG9ydCBEU1Igb3IgYXMgYWx3YXlzIGFzc2VydGVkICgxKSBvbiB0aG9zZQorICAgICAgIGNhcmRzIHRoYXQgZG8gbm90IGhhdmUgYSBEU1Igc2lnbmFsLiBUaGlzIHdpbGwgYmUgZml4ZWQgaW4gYQorICAgICAgIGZ1dHVyZSB2ZXJzaW9uIG9mIG91ciBkcml2ZXJzOyBhdCB0aGlzIHRpbWUgSSBjYW5ub3Qgc2F5IHdoZW4gdGhpcworICAgICAgIHdpbGwgYmUuIiBBbmQgbGF0ZXIsICJBcyBmYXIgYXMgSSBjYW4gdGVsbCwgd2UgZG9uJ3Qgc3VwcG9ydCB0aGUKKyAgICAgICB0ZXJtaW9zL3Rlcm1pb3ggaW9jdGxzIHRoYXQgcmVsYXRlIHNwZWNpZmljYWxseSB0byBEU1IgYW5kIFJJOyBhbGwKKyAgICAgICB0aGUgcmVzdCBhcmUgc3VwcG9ydGVkLiBUaGlzIHdpbGwsIGFzIEkgbWVudGlvbmVkIGVhcmxpZXIsIGJlCisgICAgICAgZml4ZWQgaW4gdGhlIG5leHQgcmVsZWFzZSBvZiBvdXIgQVRBIHNvZnR3YXJlLiIKKyAgICAgICAtIFdvcmxkIFdpZGUgRXNjYWxhdGlvbiBTdXBwb3J0LCBTdGFsbGlvbiBUZWNobm9sb2dpZXMsIFRvb3dvbmcKKyAgICAgICBRTEQsIFs2MDBdc3VwcG9ydEBzdGFsbGlvbi5vei5hdS4KKworICAgTGF0ZXIgKERlY2VtYmVyIDE5OTcsIGZyb20gdGhlIHNhbWUgc291cmNlKToKKworICAgICAqIFdlIGhhdmUgbm93IHJlbGVhc2VkIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFUQSBzb2Z0d2FyZSwgdmVyc2lvbgorICAgICAgIDUuNC4wLiBUaGlzIHZlcnNpb24gZml4ZXMgdGhlIHByb2JsZW0gd2l0aCB0aGUgc3RhdGVzIG9mIHRoZSBEU1IKKyAgICAgICBhbmQgUkkgc2lnbmFscyBhbmQgaG93IHRoZXkgd2VyZSBiZWluZyByZXBvcnRlZCBieSB0aGUgZHJpdmVyLgorICAgICAgIFRoaXMgaXMgdGhlIHByb2JsZW0gdGhhdCB5b3UgcmVwb3J0ZWQgaW4gT2N0b2Jlci4gVGhlIERTUiBzaWduYWwKKyAgICAgICBpcyByZXBvcnRlZCBjb3JyZWN0bHkgb24gdGhvc2UgY2FyZHMgdGhhdCBzdXBwb3J0IHRoZSBEU1Igc2lnbmFsLAorICAgICAgIHN1Y2ggYXMgdGhlIGVhcmx5IHJldmlzaW9uIG9mIHRoZSBFYXN5SU8gY2FyZCBhbmQgdGhlCisgICAgICAgRWFzeUNvbm5lY3Rpb24gOEQ0IHBhbmVsLCBhbmQgYXMgYWx3YXlzIGFzc2VydGVkIG9uIHRob3NlIGNhcmRzCisgICAgICAgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgRFNSIHNpZ25hbCBpbiB0aGUgaGFyZHdhcmUuIFRoZSBuZXcgZHJpdmVyCisgICAgICAgaXMgYXZhaWxhYmxlIGZyb20gb3VyIFdlYiBzaXRlLCBbNjAxXXd3dy5zdGFsbGlvbi5jb20sIGluIHRoZQorICAgICAgIC9kcml2ZXJzL2F0YTUvVW5peFdhcmUgZGlyZWN0b3J5LgorCisgICBbIFs2MDJdVG9wIF0gWyBbNjAzXUNvbnRlbnRzIF0gWyBbNjA0XUMtS2VybWl0IEhvbWUgXSBbIFs2MDVdQy1LZXJtaXQKKyAgIDguMCBPdmVydmlldyBdIFsgWzYwNl1LZXJtaXQgSG9tZSBdCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgIEMtS2VybWl0IDguMCBVbml4IEhpbnRzIGFuZCBUaXBzIC8gWzYwN11UaGUgS2VybWl0IFByb2plY3QgLworICAgWzYwOF1Db2x1bWJpYSBVbml2ZXJzaXR5IC8gWzYwOV1rZXJtaXRAY29sdW1iaWEuZWR1CisKK1JlZmVyZW5jZXMKKworICAgMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworICAgMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUvCisgICAzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwKKyAgIDQuIG1haWx0bzprZXJtaXQtc3VwcG9ydEBjb2x1bWJpYS5lZHUKKyAgIDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgIDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbAorICAgNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwKKyAgIDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MQorICAgOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gyCisgIDEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMKKyAgMTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4NAorICAxMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3g1CisgIDEzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDYKKyAgMTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4NworICAxNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3g4CisgIDE2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDkKKyAgMTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MTAKKyAgMTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MTEKKyAgMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MTIKKyAgMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MTMKKyAgMjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MTQKKyAgMjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4zCisgIDIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMTgKKyAgMjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xOQorICAyNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjEKKyAgMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yCisgIDI3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuNworICAyOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjYKKyAgMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xMworICAzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorICAzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgIDMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDIKKyAgMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MS4xCisgIDM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDEuMgorICAzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gxLjMKKyAgMzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MS40CisgIDM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMworICAzOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjEKKyAgMzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yCisgIDQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuNworICA0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sCisgIDQyLiBtYWlsdG86a2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1CisgIDQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgIDQ0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAgNDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MS4yCisgIDQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2s2MG1hbnVhbC5odG1sCisgIDQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwKKyAgNDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbAorICA0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorICA1MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgIDUxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDEKKyAgNTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MS4zCisgIDUzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDEuMQorICA1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3N1cHBvcnQuaHRtbAorICA1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorICA1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgIDU3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDEKKyAgNTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MS40CisgIDU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDEuMgorICA2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorICA2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgIDYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDEKKyAgNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MS4zCisgIDY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgIDY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAgNjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworICA2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gxCisgIDY4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgIDY5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAgNzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4NAorICA3MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gyCisgIDcyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMAorICA3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjEKKyAgNzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yCisgIDc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMworICA3Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjQKKyAgNzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My41CisgIDc4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuNgorICA3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjcKKyAgODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My44CisgIDgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuOQorICA4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjEwCisgIDgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMTEKKyAgODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xMgorICA4NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjEzCisgIDg2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMTQKKyAgODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xNQorICA4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjE2CisgIDg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMTcKKyAgOTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xOAorICA5MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjE5CisgIDkyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMjAKKyAgOTMuIGh0dHA6Ly93d3cuZmFxcy5vcmcvCisgIDk0LiBodHRwOi8vYXBsYXdyZW5jZS5jb20vVW5peGFydC9uZXd0b3VuaXguaHRtbAorICA5NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3gzCisgIDk2LiBtYWlsdG86a2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1CisgIDk3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc3VwcG9ydC5odG1sCisgIDk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgIDk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAxMDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDEwMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjEKKyAxMDIuIGh0dHA6Ly93d3cucGN1bml4LmNvbS8KKyAxMDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjEKKyAxMDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjIKKyAxMDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjMKKyAxMDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjQKKyAxMDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjUKKyAxMDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjYKKyAxMDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAxMTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDExMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjAKKyAxMTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjIKKyAxMTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAxMTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDExNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjAKKyAxMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjMKKyAxMTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjEKKyAxMTguIGh0dHA6Ly93d3cubGlubW9kZW1zLm9yZy8KKyAxMTkuIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9od2Rldi9wbGF0Zm9ybS9QQ2Rlc2lnbi9MUi9kZWZhdWx0LmFzcAorIDEyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDEyMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgMTIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMAorIDEyMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjAuNAorIDEyNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjAuMgorIDEyNS4gaHR0cDovL3d3dy5pZGlyLm5ldC9+Z3JvbWl0a2Mvd2lubW9kZW0uaHRtbAorIDEyNi4gaHR0cDovL3d3dy5kaWdpLmNvbS8KKyAxMjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAxMjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDEyOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjAKKyAxMzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjUKKyAxMzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjMKKyAxMzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAxMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDEzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjAKKyAxMzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjYKKyAxMzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjQKKyAxMzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAxMzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDEzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjAKKyAxNDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjUKKyAxNDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAxNDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDE0My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzCisgMTQ0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMgorIDE0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjAKKyAxNDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xLjEKKyAxNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xLjIKKyAxNDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xLjMKKyAxNDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xLjQKKyAxNTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xLjUKKyAxNTEuIGh0dHA6Ly93d3cuZW1lcnNvbi5lbW9yeS5lZHUvc2VydmljZXMvYWl4LWZhcS8KKyAxNTIuIGh0dHA6Ly93d3cuZmFxcy5vcmcvZmFxcy9ieS1uZXdzZ3JvdXAvY29tcC9jb21wLnVuaXguYWl4Lmh0bWwKKyAxNTMuIGh0dHA6Ly93d3cuY2lzLm9oaW8tc3RhdGUuZWR1L2h5cGVydGV4dC9mYXEvdXNlbmV0L2FpeC1mYXEvdG9wLmh0bWwKKyAxNTQuIGh0dHA6Ly9haXhwZHNsaWIuc2Vhcy51Y2xhLmVkdS8KKyAxNTUuIGh0dHA6Ly93d3cucm9vdHZnLm5ldCAoQUlYIGhpc3RvcnkpLworIDE1Ni4gZnRwOi8vcnRmbS5taXQuZWR1L3B1Yi91c2VuZXQvbmV3cy5hbnN3ZXJzL2FpeC1mYXEvcGFydDEKKyAxNTcuIGZ0cDovL21pcnJvcnMuYW9sLmNvbS9wdWIvcnRmbS91c2VuZXQtYnktaGllcmFyY2h5L2NvbXAvdW5peC9haXgKKyAxNTguIG5ld3M6Y29tcC51bml4LmFpeAorIDE1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDE2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgMTYxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMQorIDE2Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjEuMgorIDE2My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDE2NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgMTY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMQorIDE2Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjEuMworIDE2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjEuMQorIDE2OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NlY3VyaXR5Lmh0bWwjc2VydmVycworIDE2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDE3MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgMTcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMQorIDE3Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjEuNAorIDE3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjEuMgorIDE3NC4gaHR0cDovL3NlcnZpY2Uuc29mdHdhcmUuaWJtLmNvbS9yczYwMDAvCisgMTc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMTc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAxNzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xCisgMTc4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMS41CisgMTc5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMS4zCisgMTgwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMTgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAxODIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xCisgMTgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMS40CisgMTg0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMTg1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAxODYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDE4Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjMKKyAxODguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xCisgMTg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMi4wCisgMTkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMi4xCisgMTkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMi4yCisgMTkyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMi4zCisgMTkzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMi40CisgMTk0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMi41CisgMTk1LiBuZXdzOmNvbXAuc3lzLmhwLmhwdXgKKyAxOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAxOTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDE5OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIKKyAxOTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yLjEKKyAyMDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAyMDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDIwMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIKKyAyMDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yLjIKKyAyMDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yLjAKKyAyMDUuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvbWFrZWZpbGUKKyAyMDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAyMDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDIwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIKKyAyMDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yLjMKKyAyMTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yLjEKKyAyMTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAyMTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDIxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIKKyAyMTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yLjQKKyAyMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yLjIKKyAyMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yLjQuMQorIDIxNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIuNC4yCisgMjE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMi40LjMKKyAyMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yLjQuNAorIDIyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIuNC41CisgMjIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMjIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAyMjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yCisgMjI0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMi40LjIKKyAyMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yLjIKKyAyMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAyMjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDIyOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIuNAorIDIyOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIuNC4zCisgMjMwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMi40LjEKKyAyMzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAyMzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDIzMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIuNAorIDIzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIuNC40CisgMjM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMi40LjIKKyAyMzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAyMzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDIzOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIuNAorIDIzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIuNC41CisgMjQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMi40LjMKKyAyNDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAyNDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDI0My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIuNAorIDI0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIuNC40CisgMjQ1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMjQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAyNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yCisgMjQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMi40CisgMjQ5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMjUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAyNTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDI1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjQKKyAyNTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4yCisgMjU0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMy4xCisgMjU1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMy4yCisgMjU2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMy4zCisgMjU3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMy40CisgMjU4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMy41CisgMjU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMy42CisgMjYwLiBuZXdzOmNvbXAub3MubGludXgubWlzYworIDI2MS4gbmV3czpjb21wLm9zLmxpbnV4LmFuc3dlcnMKKyAyNjIuIGh0dHA6Ly93d3cudGxkcC5vcmcvCisgMjYzLiBodHRwOi8vd3d3LnRsZHAub3JnL0ZBUS9MaW51eC1GQVEuaHRtbAorIDI2NC4gaHR0cDovL3d3dy50bGRwLm9yZy9IT1dUTy9TZXJpYWwtSE9XVE8uaHRtbAorIDI2NS4gaHR0cDovL3RsZHAub3JnL0hPV1RPL01vZGVtLUhPV1RPLmh0bWwKKyAyNjYuIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvZG9jcy9IT1dUTworIDI2Ny4gZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L2RvY3MvSE9XVE8KKyAyNjguIGh0dHA6Ly93d3cudGxkcC5vcmcvSE9XVE8vCisgMjY5LiBodHRwOi8vd3d3LnRsZHAub3JnL2htaXJyb3JzLmh0bWwKKyAyNzAuIGh0dHA6Ly93d3cucmVkaGF0LmNvbS9hcHBzL3N1cHBvcnQvCisgMjcxLiBodHRwOi8vd3d3LmRlYmlhbi5vcmcvc3VwcG9ydAorIDI3Mi4gaHR0cDovL3d3dy5zbGFja3dhcmUuY29tL3N1cHBvcnQvCisgMjczLiBodHRwOi8vd3d3LmNhbGRlcmEuY29tL3N1cHBvcnQvCisgMjc0LiBodHRwOi8vd3d3LnN1c2UuY29tL3N1cHBvcnQvCisgMjc1LiBodHRwOi8vd3d3Lm1hbmRyYWtlLmNvbS9zdXBwb3J0LworIDI3Ni4gaHR0cDovL3d3dy50dXJib2xpbnV4LmNvbS9zdXBwb3J0LworIDI3Ny4gaHR0cDovL3d3dy5saW5tb2RlbXMub3JnLworIDI3OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjAKKyAyNzkuIGh0dHA6Ly9saW51eC5kcmVhbXRpbWUub3JnL2RlY25ldC8KKyAyODAuIG1haWx0bzprZXJtaXQtc3VwcG9ydEBjb2x1bWJpYS5lZHUKKyAyODEuIGh0dHA6Ly93d3cubGlubW9kZW1zLm9yZy8KKyAyODIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wLjIKKyAyODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zZWN1cml0eS5odG1sI3NlcnZlcnMKKyAyODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zc2hjbGllbnQuaHRtbAorIDI4NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDI4Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgMjg3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMKKyAyODguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4zLjIKKyAyODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAyOTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDI5MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjMKKyAyOTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4zLjMKKyAyOTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4zLjEKKyAyOTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wCisgMjk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDYKKyAyOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4NworIDI5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3g4CisgMjk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDEwCisgMjk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDExCisgMzAwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwKKyAzMDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wCisgMzAyLiBodHRwOi8vbGludXh3d3cuZGIuZXJhdS5lZHUvbWFpbF9hcmNoaXZlcy9saW51eC1rZXJuZWwvTWFyXzk4LzE0NDEuaHRtbAorIDMwMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDMwNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgMzA1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMworIDMwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjMuNAorIDMwNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjMuMgorIDMwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjAuNQorIDMwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZmFxLmh0bWwjdGVybQorIDMxMC4gaHR0cDovL2RpY2tleS5oaXMuY29tL3h0ZXJtL3h0ZXJtLmh0bWwKKyAzMTEuIGh0dHA6Ly9kaWNrZXkuaGlzLmNvbS94dGVybS94dGVybS5odG1sCisgMzEyLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL3htb2RtYXAudHh0CisgMzEzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMzE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAzMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4zCisgMzE2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMy41CisgMzE3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMy4zCisgMzE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMzE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAzMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4zCisgMzIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMy42CisgMzIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMy40CisgMzIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMzI0LiBtYWlsdG86a2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1CisgMzI1LiBodHRwOi8vd3d3LnJlZGhhdC5jb20vc3VwcG9ydC9lcnJhdGEvUkhCQS0yMDAxLTE1My5odG1sCisgMzI2LiBuZXdzOmNvbXAucHJvdG9jb2xzLmtlcm1pdC5taXNjCisgMzI3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMzI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAzMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4zCisgMzMwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMy41CisgMzMxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMzMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAzMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDMzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjUKKyAzMzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4zCisgMzM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMzM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAzMzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDMzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjYKKyAzNDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My40CisgMzQxLiBuZXdzOmNvbXAub3MucW54CisgMzQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvZ2tlcm1pdC5odG1sCisgMzQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDEwCisgMzQ0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwKKyAzNDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAzNDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDM0Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzCisgMzQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuNworIDM0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjUKKyAzNTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My42LjEKKyAzNTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My42LjIKKyAzNTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My42LjMKKyAzNTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My42LjQKKyAzNTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xMAorIDM1NS4gaHR0cDovL2FwbGF3cmVuY2UuY29tL1NDT0ZBUS8KKyAzNTYuIGh0dHA6Ly93d3cuemVuZXouY29tL2NnaS1iaW4vc2NvcHJvZ2ZhcS9mYXEucGwKKyAzNTcuIGh0dHA6Ly93d3cuemVuZXouY29tL2NnaS1iaW4vc2NvdXc3ZmFxL2ZhcS5wbAorIDM1OC4gaHR0cDovL3plbmV6LnBjdW5peC5jb20vY2dpLWJpbi9zY291dzdmYXEvZmFxLnBsCisgMzU5LiBodHRwOi8vcGN1bml4LmNvbS9Vbml4YXJ0L21vZGVtcy5odG1sCisgMzYwLiBodHRwOi8vd3d3LmZyZWViaXJkLm9yZy9mYXEvCisgMzYxLiBodHRwOi8vd3d3LmZyZWViaXJkLm9yZy9mYXEvZGV2ZWxvcGVyLmh0bWwKKyAzNjIuIGh0dHA6Ly9zdXBwb3J0LmNhbGRlcmEuY29tL2NhbGRlcmEKKyAzNjMuIGh0dHA6Ly9zdGFnZS5jYWxkZXJhLmNvbS90YS8KKyAzNjQuIGh0dHA6Ly9hcGxhd3JlbmNlLmNvbS9uZXd0b3Njby5odG1sCisgMzY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMC41CisgMzY2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tmYXEuaHRtbCN0ZXJtCisgMzY3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMAorIDM2OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDM2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgMzcwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuNgorIDM3MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjYuMQorIDM3Mi4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1dGlvLmMKKyAzNzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyAzNzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDM3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjYKKyAzNzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My42LjMKKyAzNzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My42LjEKKyAzNzguIGh0dHA6Ly93d3cuZGlnaS5jb20vCisgMzc5LiBmdHA6Ly9mdHAuZnUtYmVybGluLmRlL3B1Yi91bml4L2RyaXZlci9mYXMKKyAzODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MTQKKyAzODEuIGh0dHA6Ly93d3cuc2NvLmNvbS8KKyAzODIuIGZ0cDovL2Z0cC5zY28uY29tLworIDM4My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDM4NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgMzg1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuNgorIDM4Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjYuNAorIDM4Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjYuMgorIDM4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjEwCisgMzg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMzkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAzOTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My42CisgMzkyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuNi4zCisgMzkzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgMzk0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyAzOTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDM5Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjgKKyAzOTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My42CisgMzk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuNy4xCisgMzk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuNy4yCisgNDAwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuNy4zCisgNDAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuNy40CisgNDAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuNy41CisgNDAzLiBuZXdzOmNvbXAudW5peC5zb2xhcmlzCisgNDA0LiBodHRwOi8vYWNjZXNzMS5zdW4uY29tLworIDQwNS4gaHR0cDovL2RvY3Muc3VuLmNvbS8KKyA0MDYuIGh0dHA6Ly93d3cuc3VuaGVscC5jb20vCisgNDA3LiBodHRwOi8vd3d3LndpbnMudXZhLm5sL3B1Yi9zb2xhcmlzL3NvbGFyaXMyLworIDQwOC4gaHR0cDovL3d3dy53aW5zLnV2YS5ubC9jZ2ktYmluL3NmYXEuY2dpCisgNDA5LiBmdHA6Ly9mdHAud2lucy51dmEubmwvcHViL3NvbGFyaXMKKyA0MTAuIGh0dHA6Ly93d3cuc2NpZW5jZS51dmEubmwvcHViL3NvbGFyaXMvc29sYXJpczIuaHRtbAorIDQxMS4gaHR0cDovL3d3dy5zdG9rZWx5LmNvbS8KKyA0MTIuIGh0dHA6Ly93d3cuc3Rva2VseS5jb20vdW5peC5zeXNhZG0ucmVzb3VyY2VzL2ZhcXMuc3VuLmh0bWwKKyA0MTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4wCisgNDE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgNDE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyA0MTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDQxNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjcKKyA0MTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My43LjIKKyA0MTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA0MjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDQyMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjcKKyA0MjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My43LjMKKyA0MjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My43LjEKKyA0MjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA0MjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDQyNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjcKKyA0MjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My43LjQKKyA0MjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My43LjIKKyA0MjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA0MzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDQzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjcKKyA0MzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My43LjUKKyA0MzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My43LjMKKyA0MzQuIG5ld3M6Y29tcC5vcy52bXMKKyA0MzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA0MzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDQzNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjcKKyA0MzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My43LjYKKyA0MzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My43LjQKKyA0NDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA0NDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDQ0Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjcKKyA0NDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My43LjUKKyA0NDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA0NDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDQ0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzCisgNDQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuOQorIDQ0OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjcKKyA0NDkuIGh0dHA6Ly93d3cuc3Rva2VseS5jb20vCisgNDUwLiBodHRwOi8vYWNjZXNzMS5zdW4uY29tLworIDQ1MS4gaHR0cDovL3d3dy5sdWRkLmx1dGguc2UvfmJlYXIvcHJvamVjdC9zdW4vc3VuLmhhcmR3YXJlLnR4dAorIDQ1Mi4gZnRwOi8vZnRwLm5ldGNvbS5jb20vcHViL3J1L3J1Ymljb24vc3VuLmhkd3IucmVmCisgNDUzLiBmdHA6Ly9mdHAuaW50bmV0Lm5ldC9wdWIvU1VOL1N1bi1IYXJkd2FyZS1SZWYKKyA0NTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA0NTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDQ1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzCisgNDU3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMTAKKyA0NTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My44CisgNDU5LiBuZXdzOmNvbXAudW5peC51bHRyaXgKKyA0NjAuIG5ld3M6Y29tcC5zeXMuZGVjCisgNDYxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgNDYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyA0NjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDQ2NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjExCisgNDY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuOQorIDQ2Ni4gaHR0cDovL3d3dy5mcmVlYmlyZC5vcmcvCisgNDY3LiBodHRwOi8vd3d3LmZyZWViaXJkLm9yZy9mYXEvCisgNDY4LiBuZXdzOmNvbXAudW5peC51bml4d2FyZS5taXNjCisgNDY5LiBuZXdzOmNvbXAudW5peC5zY28ubWlzYworIDQ3MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjAKKyA0NzEuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2t1dGlvLmMKKyA0NzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA0NzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDQ3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzCisgNDc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMTIKKyA0NzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xMAorIDQ3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDQ3OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgNDc5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMKKyA0ODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xMworIDQ4MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjExCisgNDgyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgNDgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyA0ODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDQ4NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjE0CisgNDg2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMTIKKyA0ODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA0ODguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDQ4OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzCisgNDkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMTUKKyA0OTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xMworIDQ5Mi4gbmV3czpjb21wLnN5cy5zZ2kubWlzYworIDQ5My4gbmV3czpjb21wLnN5cy5zZ2kuYWRtaW4KKyA0OTQuIGh0dHA6Ly93d3cuc2dpLmNvbS8KKyA0OTUuIGh0dHA6Ly93d3ctdml6LnRhbXUuZWR1L35zZ2ktZmFxLworIDQ5Ni4gZnRwOi8vdml6LnRhbXUuZWR1L3B1Yi9zZ2kvZmFxLworIDQ5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sCisgNDk4LiBodHRwOi8vZnJlZXdhcmUuc2dpLmNvbS9JbnN0YWxsYWJsZS9nY2MtMi45NS4yLmh0bWwKKyA0OTkuIGh0dHA6Ly9mcmVld2FyZS5zZ2kuY29tL0luc3RhbGxhYmxlL2djYy0yLjk1LjIuaHRtbAorIDUwMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDUwMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgNTAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMKKyA1MDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xNgorIDUwNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjE0CisgNTA1LiBuZXdzOmNvbXAuc3lzLmJlCisgNTA2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgNTA3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyA1MDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDUwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjE3CisgNTEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMTUKKyA1MTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA1MTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDUxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzCisgNTE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMTgKKyA1MTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xNgorIDUxNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDUxNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgNTE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMKKyA1MTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4My4xOQorIDUyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjE3CisgNTIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgNTIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyA1MjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDUyNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjIwCisgNTI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDMuMTgKKyA1MjYuIGh0dHA6Ly93d3cua2V5c3Bhbi5jb20vcHJvZHVjdHMvdXNiL2FkYXB0ZXIvCisgNTI3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwKKyA1MjguIGh0dHA6Ly9jZXJlYnVzLnNhbmRpZWdvLmVkdS9+amVycnkvVW5peFRpcHMvCisgNTI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgNTMwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyA1MzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDUzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gzLjE5CisgNTMzLiBodHRwOi8vd3d3LnVuaS1naWVzc2VuLmRlL2ZhcS9hcmNoaXYvY29oZXJlbnQtZmFxLmdlbmVyYWwvbXNnMDAwMDAuaHRtbAorIDUzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDUzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgNTM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDUKKyA1MzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDUzOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sCisgNTM5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgNTQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyA1NDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4NgorIDU0Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3g0CisgNTQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwKKyA1NDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA1NDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDU0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3g3CisgNTQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDUKKyA1NDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCM5LjUKKyA1NDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MworIDU1MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDU1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgNTUyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDgKKyA1NTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4NgorIDU1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g4CisgNTU1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwKKyA1NTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9jazYwbWFudWFsLmh0bWwKKyA1NTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA1NTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDU1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3g5CisgNTYwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDcKKyA1NjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA1NjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDU2My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gxMAorIDU2NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3g4CisgNTY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2s2MG1hbnVhbC5odG1sCisgNTY2LiBodHRwOi8vZGlja2V5Lmhpcy5jb20veHRlcm0veHRlcm0uaHRtbAorIDU2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDU2OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgNTY5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDExCisgNTcwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDkKKyA1NzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA1NzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDU3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gxMgorIDU3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gxMAorIDU3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gxMS4xCisgNTc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDExLjIKKyA1NzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA1NzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDU3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gxMQorIDU4MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3gxMS4yCisgNTgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2s2MG1hbnVhbC5odG1sCisgNTgyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgNTgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyA1ODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MTEKKyA1ODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MTEuMQorIDU4Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrNjBtYW51YWwuaHRtbAorIDU4Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDU4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgNTg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDEzCisgNTkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDExCisgNTkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtbAorIDU5Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI3RvcAorIDU5My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sI2NvbnRlbnRzCisgNTk0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDE0CisgNTk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjeDEyCisgNTk2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjdG9wCisgNTk3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwjY29udGVudHMKKyA1OTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MTUKKyA1OTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN4MTQKKyA2MDAuIG1haWx0bzpzdXBwb3J0QHN0YWxsaW9uLm96LmF1CisgNjAxLiBodHRwOi8vd3d3LnN0YWxsaW9uLmNvbS8KKyA2MDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCN0b3AKKyA2MDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbCNjb250ZW50cworIDYwNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDYwNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrODAuaHRtbAorIDYwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyA2MDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCisgNjA4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS8KKyA2MDkuIG1haWx0bzprZXJtaXRAY29sdW1iaWEuZWR1CmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2t1Y21kLmMgYi9ja2VybWl0LTguMC4yMTEvY2t1Y21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiY2EzNAotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja3VjbWQuYwpAQCAtMCwwICsxLDc2MzkgQEAKKyNpbmNsdWRlICJja2NzeW0uaCIKKworY2hhciAqY21kdiA9ICJDb21tYW5kIHBhY2thZ2UgOC4wLjE1NywgMTEgTWF5IDIwMDMiOworCisvKiAgQyBLIFUgQyBNIEQgIC0tICBJbnRlcmFjdGl2ZSBjb21tYW5kIHBhY2thZ2UgZm9yIFVuaXggICovCisKKy8qCisgIEF1dGhvcjogRnJhbmsgZGEgQ3J1eiAoZmRjQGNvbHVtYmlhLmVkdSksCisgIENvbHVtYmlhIFVuaXZlcnNpdHkgQWNhZGVtaWMgSW5mb3JtYXRpb24gU3lzdGVtcywgTmV3IFlvcmsgQ2l0eS4KKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorKi8KKworI2RlZmluZSBUT0tQUkVDSEVDSworCisjZGVmaW5lIERPQ0hLVkFSCisKKy8qIENvbW1hbmQtdGVybWluYWwtdG8tQy1LZXJtaXQgY2hhcmFjdGVyIG1hc2sgKi8KKworI2lmZGVmIE9TMgkJCQkvKiBLOTUgKi8KK2ludCBjbWRtc2sgPSAyNTU7CQkJLyogKGFsd2F5cyB3YXMgMjU1KSAqLworI2Vsc2UJCQkJCS8qIEFsbCBvdGhlcnMuLi4gKi8KK2ludCBjbWRtc2sgPSAyNTU7CQkJLyogMzEgRGVjIDIwMDAgKHdhcyAxMjcpICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBCU19ESVJTRVAJCQkvKiBEaXJlY3Rvcnkgc2VwYXJhdG9yIGlzIGJhY2tzbGFzaCAqLworI3VuZGVmIEJTX0RJUlNFUAorI2VuZGlmIC8qIEJTX0RJUlNFUCAqLworCisjaWZkZWYgT1MyCisjZGVmaW5lIEJTX0RJUlNFUAorI2VuZGlmIC8qIEJTX0RJUlNFUCAqLworCisjZGVmaW5lIENLVUNNRF9DCisKKyNpbmNsdWRlICJja2NkZWIuaCIgICAgICAgICAgICAgICAgICAgICAvKiBGb3JtYXRzIGZvciBkZWJ1ZygpLCBldGMuICovCisjaW5jbHVkZSAiY2tja2VyLmgiCQkJLyogTmVlZGVkIGZvciBCSUdCVUZPSyBkZWZpbml0aW9uICovCisjaW5jbHVkZSAiY2tjbmV0LmgiCQkJLyogTmVlZGVkIGZvciBzZXJ2ZXItc2lkZSBUZWxuZXQgKi8KKyNpbmNsdWRlICJja3VjbWQuaCIJCQkvKiBOZWVkZWQgZm9yIGV2ZXJ5dGhpbmcgKi8KKyNpbmNsdWRlICJja3V1c3IuaCIgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkZWQgZm9yIHByb21wdCBsZW5ndGggKi8KKworI2lmbmRlZiBOT0FSUk9XS0VZUworI2lmbmRlZiBOT0VTQ1NFUQorI2lmZGVmIFZNU09SVU5JWAorI2RlZmluZSBVU0VfQVJST1dLRVlTCQkJLyogVXNlIGFycm93IGtleXMgZm9yIGNvbW1hbmQgcmVjYWxsICovCisjZW5kaWYgLyogVk1TT1JVTklYICovCisjZW5kaWYgLyogTk9FU0NTRVEgKi8KKyNlbmRpZiAvKiBOT0FSUk9XS0VZUyAqLworCisjdW5kZWYgQ0tVQ01EX0MKKworX1BST1RPVFlQKCBpbnQgdW5oZXgsIChjaGFyKSApOworX1BST1RPVFlQKCBzdGF0aWMgVk9JRCBjbWRjbHJzY24sICh2b2lkKSApOworCisjaWZkZWYgQ0tMRUFSTgorX1BST1RPVFlQKCBWT0lEIGxlYXJuY21kLCAoY2hhciAqKSApOworI2VuZGlmIC8qIENLTEVBUk4gKi8KKworc3RhdGljIGNoYXIgKm1vbmFtZVtdID0geworICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgorfTsKKworc3RydWN0IGtleXRhYiBjbW9udGhzW10gPSB7CisgIHsgImFwcmlsIiwgICAgIDQsIDAgfSwKKyAgeyAiYXVndXN0IiwgICAgOCwgMCB9LAorICB7ICJkZWNlbWJlciIsIDEyLCAwIH0sCisgIHsgImZlYnJ1YXJ5IiwgIDIsIDAgfSwKKyAgeyAiamFudWFyeSIsICAgMSwgMCB9LAorICB7ICJqdWx5IiwgICAgICA3LCAwIH0sCisgIHsgImp1bmUiLCAgICAgIDYsIDAgfSwKKyAgeyAibWFyY2giLCAgICAgMywgMCB9LAorICB7ICJtYXkiLCAgICAgICA1LCAwIH0sCisgIHsgIm5vdmVtYmVyIiwgMTEsIDAgfSwKKyAgeyAib2N0b2JlciIsICAxMCwgMCB9LAorICB7ICJzZXB0ZW1iZXIiLCA5LCAwIH0KK307CisKKyNpZm5kZWYgTk9JQ1AgICAgIC8qIFRoZSByZXN0IG9ubHkgaWYgaW50ZXJhY3RpdmUgY29tbWFuZCBwYXJzaW5nIHNlbGVjdGVkICovCisKKyNpZm5kZWYgTk9TUEwKK19QUk9UT1RZUCggaW50IGNoa3ZhciwgKGNoYXIgKikgKTsKK2V4dGVybiBpbnQgYXNrZmxhZzsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZkZWYgQ0tST09UCitleHRlcm4gaW50IGNrcm9vdGVycjsKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworI2lmZGVmIElLU0QKK2V4dGVybiBpbnQgaW5zZXJ2ZXI7CisjZW5kaWYgLyogSUtTRCAqLworCitpbnQgY21mbGRmbGdzID0gMDsJCQkvKiBGbGFncyBmb3IgY21mbGQoKSAqLworaW50IGNta3dmbGdzID0gMDsJCQkvKiBGbGFncyBmcm9tIGxhc3Qga2V5d29yZCBwYXJzZSAqLworc3RhdGljIGludCBibG9ja2x2bCA9IDA7CQkvKiBCbG9jayBuZXN0aW5nIGxldmVsICovCitzdGF0aWMgaW50IGxpbmViZWdpbiA9IDA7CQkvKiBGbGFnIGZvciBhdCBzdGFydCBvZiBhIGxpbmUgKi8KK3N0YXRpYyBpbnQgcXVvdGluZyA9IDE7CQkJLyogUXVvdGluZyBpcyBhbGxvd2VkICovCitzdGF0aWMgaW50IHN3YXJnID0gMDsJCQkvKiBQYXJzaW5nIGEgc3dpdGNoIGFyZ3VtZW50ICovCitzdGF0aWMgaW50IHhjbWZkYiA9IDA7CQkJLyogRmxhZyBmb3IgcGFyc2luZyBjaGFpbmVkIGZkYnMuLi4gKi8KK3N0YXRpYyBpbnQgY2hzcmMgPSAwOwkJCS8qIFNvdXJjZSBvZiBjaGFyYWN0ZXIsIDEgPSB0dHkgKi8KK3N0YXRpYyBpbnQgbmV3Y21kID0gMDsJCQkvKiBTZWUgYWRkY21kKCkgKi8KKworI2lmZGVmIEJTX0RJUlNFUAorc3RhdGljIGludCBkaXJuYW1mbGcgPSAwOworI2VuZGlmIC8qIEJTX0RJUlNFUCAqLworCisvKgorTW9kZWxlZCBhZnRlciB0aGUgREVDU1lTVEVNLTIwIGNvbW1hbmQgcGFyc2VyICh0aGUgQ09NTkQgSlNZUyksIFJJUC4gRmVhdHVyZXM6CisKKyAuIHBhcnNlcyBhbmQgdmVyaWZpZXMga2V5d29yZHMsIGZpbGVuYW1lcywgdGV4dCBzdHJpbmdzLCBudW1iZXJzLCBvdGhlciBkYXRhCisgLiBkaXNwbGF5cyBhcHByb3ByaWF0ZSBtZW51IG9yIGhlbHAgbWVzc2FnZSB3aGVuIHVzZXIgdHlwZXMgIj8iCisgLiBkb2VzIGtleXdvcmQgYW5kIGZpbGVuYW1lIGNvbXBsZXRpb24gd2hlbiB1c2VyIHR5cGVzIEVTQyBvciBUQUIKKyAuIGRvZXMgcGFydGlhbCBrZXl3b3JkIGFuZCBmaWxlbmFtZSBjb21wbGV0aW9uCisgLiBhY2NlcHRzIGFueSB1bmlxdWUgYWJicmV2aWF0aW9uIGZvciBhIGtleXdvcmQKKyAuIGFsbG93cyBrZXl3b3JkcyB0byBoYXZlIGF0dHJpYnV0ZXMsIGxpa2UgImludmlzaWJsZSIgYW5kICJhYmJyZXZpYXRpb24iCisgLiBjYW4gc3VwcGx5IGRlZmF1bHRzIGZvciBmaWVsZHMgb21pdHRlZCBieSB1c2VyCisgLiBwcm92aWRlcyBjb21tYW5kIHJldHJ5IGFuZCByZWNhbGwKKyAuIHByb3ZpZGVzIGNoYXJhY3Rlciwgd29yZCwgYW5kIGxpbmUgZGVsZXRpb24gKGJ1dCBvbmx5IGZyb20gdGhlIGVuZCkKKyAuIGFjY2VwdHMgaW5wdXQgZnJvbSBrZXlib2FyZCwgY29tbWFuZCBmaWxlcywgbWFjcm9zLCBvciByZWRpcmVjdGVkIHN0ZGluCisgLiBhbGxvd3MgZm9yIGZ1bGwgb3IgaGFsZiBkdXBsZXggb3BlcmF0aW9uLCBjaGFyYWN0ZXIgb3IgbGluZSBpbnB1dAorIC4gYWxsb3dzIFwtZXNjYXBlcyBmb3Igc3BlY2lhbCBjaGFyYWN0ZXJzCisgLiBhbGxvd3Mgc3BlY2lmaWNhdGlvbiBvZiBhIHVzZXIgZXhpdCB0byBleHBhbmQgdmFyaWFibGVzLCBldGMuCisgLiBzZXR0YWJsZSBwcm9tcHQsIHByb3RlY3RlZCBmcm9tIGRlbGV0aW9uLCBkeW5hbWljYWxseSByZS1ldmFsdWF0ZWQgZWFjaCB0aW1lCisgLiBhbGxvd3MgY2hhaW5lZCBwYXJzZSBmdW5jdGlvbnMuCisKK0Z1bmN0aW9uczoKKyBjbXNldHAgLSBTZXQgcHJvbXB0IChjbXByb20gaXMgcHJvbXB0IHN0cmluZykKKyBjbXNhdnAgLSBTYXZlIGN1cnJlbnQgcHJvbXB0CisgY21nZXRwID0gR2V0IGN1cnJlbnQgcHJvbXB0CisgcHJvbXB0IC0gSXNzdWUgcHJvbXB0CisgY21pbmkgIC0gQ2xlYXIgdGhlIGNvbW1hbmQgYnVmZmVyIChiZWZvcmUgcGFyc2luZyBhIG5ldyBjb21tYW5kKQorIGNtcmVzICAtIFJlc2V0IGNvbW1hbmQgYnVmZmVyIHBvaW50ZXJzIChiZWZvcmUgcmVwYXJzaW5nKQorIGNta2V5ICAtIFBhcnNlIGEga2V5d29yZCBvciB0b2tlbiAoYWxzbyBjbWtleTIpCisgY21zd2kgIC0gUGFyc2UgYSBzd2l0Y2gKKyBjbW51bSAgLSBQYXJzZSBhIG51bWJlcgorIGNtaWZpICAtIFBhcnNlIGFuIGlucHV0IGZpbGUgbmFtZQorIGNtb2ZpICAtIFBhcnNlIGFuIG91dHB1dCBmaWxlIG5hbWUgKGFsc28gY21pZmlwLCBjbWlmaTIsIC4uLikKKyBjbWRpciAgLSBQYXJzZSBhIGRpcmVjdG9yeSBuYW1lIChhbHNvIGNtZGlycCkKKyBjbWZsZCAgLSBQYXJzZSBhbiBhcmJpdHJhcnkgZmllbGQKKyBjbXR4dCAgLSBQYXJzZSBhIHRleHQgc3RyaW5nCisgY21kYXRlIC0gUGFyc2UgYSBkYXRlLXRpbWUgc3RyaW5nCisgY21jZm0gIC0gUGFyc2UgY29tbWFuZCBjb25maXJtYXRpb24gKGVuZCBvZiBsaW5lKQorIGNtZmRiICAtIFBhcnNlIGFueSBvZiBhIGxpc3Qgb2YgdGhlIGZvcmVnb2luZyAoY2hhaW5lZCBwYXJzZSBmdW5jdGlvbnMpCisKK1JldHVybiBjb2RlczoKKyAtOTogbGlrZSAtMiBleGNlcHQgdGhpcyBtb2R1bGUgYWxyZWFkeSBwcmludGVkIHRoZSBlcnJvciBtZXNzYWdlCisgLTM6IG5vIGlucHV0IHByb3ZpZGVkIHdoZW4gcmVxdWlyZWQKKyAtMjogaW5wdXQgd2FzIGludmFsaWQgKGUuZy4gbm90IGEgbnVtYmVyIHdoZW4gYSBudW1iZXIgd2FzIHJlcXVpcmVkKQorIC0xOiByZXBhcnNlIHJlcXVpcmVkICh1c2VyIGRlbGV0ZWQgaW50byBhIHByZWNlZGluZyBmaWVsZCkKKyAgMCBvciBncmVhdGVyOiBzdWNjZXNzCitTZWUgaW5kaXZpZHVhbCBmdW5jdGlvbnMgZm9yIGdyZWF0ZXIgZGV0YWlsLgorCitCZWZvcmUgdXNpbmcgdGhlc2Ugcm91dGluZXMsIHRoZSBjYWxsZXIgc2hvdWxkICNpbmNsdWRlICJja3VjbWQuaCIgYW5kIHNldCB0aGUKK3Byb2dyYW0ncyBwcm9tcHQgYnkgY2FsbGluZyBjbXNldHAoKS4gIElmIHRoZSBmaWxlIHBhcnNpbmcgZnVuY3Rpb25zIGNtaWZpLAorY21vZmksIG9yIGNtZGlyIGFyZSB0byBiZSB1c2VkLCB0aGlzIG1vZHVsZSBtdXN0IGJlIGxpbmtlZCB3aXRoIGEgY2s/ZmlvIGZpbGUKK3N5c3RlbSBzdXBwb3J0IG1vZHVsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIHN5c3RlbSwgZS5nLiBja3VmaW8gZm9yIFVuaXguICBJZgordGhlIGNhbGxlciBwdXRzIHRoZSB0ZXJtaW5hbCBpbiBjaGFyYWN0ZXIgd2FrZXVwICgiY2JyZWFrIikgbW9kZSB3aXRoIG5vIGVjaG8sCit0aGVuIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIHByb3ZpZGUgbGluZSBlZGl0aW5nIC0tIGNoYXJhY3Rlciwgd29yZCwgYW5kIGxpbmUKK2RlbGV0aW9uLCBhcyB3ZWxsIGFzIGtleXdvcmQgYW5kIGZpbGVuYW1lIGNvbXBsZXRpb24gdXBvbiBFU0MgYW5kIGhlbHAKK3N0cmluZ3MsIGtleXdvcmQsIG9yIGZpbGUgbWVudXMgdXBvbiAnPycuICBJZiB0aGUgY2FsbGVyIHB1dHMgdGhlIHRlcm1pbmFsCitpbnRvIGNoYXJhY3RlciB3YWtldXAvbm9lY2hvIG1vZGUsIGNhcmUgc2hvdWxkIGJlIHRha2VuIHRvIHJlc3RvcmUgaXQgYmVmb3JlCitleGl0IGZyb20gb3IgaW50ZXJydXB0aW9uIG9mIHRoZSBwcm9ncmFtLiAgSWYgdGhlIGNoYXJhY3RlciB3YWtldXAgbW9kZSBpcyBub3QKK3NldCwgdGhlIHN5c3RlbSdzIG93biBsaW5lIGVkaXRvciBtYXkgYmUgdXNlZC4KKworTk9URTogQ29udHJhcnkgdG8gZXhwZWN0YXRpb25zLCBtYW55ICNpZmRlZidzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGlzIG1vZHVsZS4KK0FueSBvcGVyYXRpb24gcmVxdWlyaW5nIGFuICNpZmRlZiAobGlrZSBjbGVhciBzY3JlZW4sIGdldCBjaGFyYWN0ZXIgZnJvbQora2V5Ym9hcmQsIGVyYXNlIGNoYXJhY3RlciBmcm9tIHNjcmVlbiwgZXRjKSBzaG91bGQgZXZlbnR1YWxseSBiZSB0dXJuZWQgaW50byBhCitjYWxsIHRvIGEgZnVuY3Rpb24gdGhhdCBpcyBkZWZpbmVkIGluIGNrP3Rpby5jLCBidXQgdGhlbiBhbGwgdGhlIGNrP3Rpby5jCittb2R1bGVzIHdvdWxkIGhhdmUgdG8gYmUgY2hhbmdlZC4uLgorKi8KKworLyogSW5jbHVkZXMgKi8KKworI2luY2x1ZGUgImNrY2tlci5oIgorI2luY2x1ZGUgImNrY2FzYy5oIgkJCS8qIEFTQ0lJIGNoYXJhY3RlciBzeW1ib2xzICovCisjaW5jbHVkZSAiY2t1Y21kLmgiICAgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBwYXJzaW5nIGRlZmluaXRpb25zICovCisKKyNpZmRlZiBPU0YxMworI2lmZGVmIENLX0FOU0lDCisjaWZkZWYgX05PX1BST1RPCisjdW5kZWYgX05PX1BST1RPCisjZW5kaWYgLyogX05PX1BST1RPICovCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyNlbmRpZiAvKiBPU0YxMyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4JCQkvKiBFcnJvciBudW1iZXIgc3ltYm9scyAqLworCisjaWZkZWYgT1MyCisjaWZuZGVmIE5UCisjZGVmaW5lIElOQ0xfTk9QTQorI2RlZmluZSBJTkNMX1ZJTwkJCS8qIE5lZWRlZCBmb3IgY2tvY29uLmggKi8KKyNpbmNsdWRlIDxvczIuaD4KKyN1bmRlZiBDT01NRU5UCisjZWxzZQorI2RlZmluZSBBUElSRVQgVUxPTkcKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYgLyogTlQgKi8KKyNpbmNsdWRlICJja29jb24uaCIKKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgTlQKKyNkZWZpbmUgc3RyaWNtcCBfc3RyaWNtcAorI2VuZGlmIC8qIE5UICovCisKKyNpZmRlZiBPU0sKKyNkZWZpbmUgY2MgY2NvdW50CQkJLyogT1MtOS82OEsgY29tcGlsZXIgYnVnICovCisjZW5kaWYgLyogT1NLICovCisKKyNpZmRlZiBHRU1ET1MJCQkJLyogQXRhcmkgU1QgKi8KKyNpZmRlZiBwdXRjaGFyCisjdW5kZWYgcHV0Y2hhcgorI2VuZGlmIC8qIHB1dGNoYXIgKi8KKyNkZWZpbmUgcHV0Y2hhcih4KSBjb25vYyh4KQorI2VuZGlmIC8qIEdFTURPUyAqLworCisjaWZkZWYgQ0tfQVVUT0RMCitleHRlcm4gaW50IGNtZGFkbCwganVzdG9uZTsKKyNlbmRpZiAvKiBDS19BVVRPREwgKi8KKworZXh0ZXJuIGludCB0aW1lbGltaXQsIG56eG9wdHMsIG5vcHVzaCwgbm9sb2NhbCwgeGNtZHNyYywga2VlcGFsbGNoYXJzOworCisjaWZkZWYgQ0tTWVNMT0cKKyNpZmRlZiBVTklYCisjaWZkZWYgQ0tYUFJJTlRGCQkJLyogT3VyIHByaW50ZiBtYWNybyBjb25mbGljdHMgd2l0aCAqLworI3VuZGVmIHByaW50ZgkJCQkvKiB1c2Ugb2YgInByaW50ZiIgaW4gc3lzbG9nLmggKi8KKyNlbmRpZiAvKiBDS1hQUklOVEYgKi8KKyNpZmRlZiBSVEFJWAorI2luY2x1ZGUgPHN5cy9zeXNsb2cuaD4KKyNlbHNlICAvKiBSVEFJWCAqLworI2luY2x1ZGUgPHN5c2xvZy5oPgorI2VuZGlmIC8qIFJUQUlYICovCisjaWZkZWYgQ0tYUFJJTlRGCisjZGVmaW5lIHByaW50ZiBja3hwcmludGYKKyNlbmRpZiAvKiBDS1hQUklOVEYgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKworLyogTG9jYWwgdmFyaWFibGVzICovCisKK3N0YXRpYworaW50IHBzZXRmID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgdGhhdCBwcm9tcHQgaGFzIGJlZW4gc2V0ICovCisgICAgY2MgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIGNvdW50ICovCisgICAgZHB4ID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRHVwbGV4ICgwID0gZnVsbCkgKi8KKyAgICBpbndvcmQgPSAwOwkJCQkvKiBJbiB0aGUgbWlkZGxlIG9mIGdldHRpbmcgYSB3b3JkICovCisKK2NoYXIgKmRmcHJvbSA9ICJDb21tYW5kPyAiOyAgICAgICAgICAgICAvKiBEZWZhdWx0IHByb21wdCAqLworCitpbnQgY21mbGdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBmbGFncyAqLworaW50IGNtZnNhdjsJCQkJLyogQSBzYXZlZCB2ZXJzaW9uIG9mIHRoZW0gKi8KKworc3RhdGljIGNoYXIgcHVzaGMgPSBOVUw7CitzdGF0aWMgY2hhciBicmtjaGFyID0gTlVMOworCisjZGVmaW5lIENNREVGQVVMVCAxMDIzCitzdGF0aWMgY2hhciBjbWRlZmF1bHRbQ01ERUZBVUxUKzFdOworCisjaWZkZWYgRENNREJVRgorY2hhciAqY21kYnVmID0gTlVMTDsJCQkvKiBDb21tYW5kIGJ1ZmZlciAqLworY2hhciAqc2F2YnVmID0gTlVMTDsJCQkvKiBCdWZmZXIgdG8gc2F2ZSBjb3B5IG9mIGNvbW1hbmQgKi8KK2NoYXIgKmF0bWJ1ZiA9IE5VTEw7CQkJLyogQXRvbSBidWZmZXIgLSBmb3IgY3VycmVudCBmaWVsZCAqLworY2hhciAqYXR4YnVmID0gTlVMTDsJCQkvKiBGb3IgZXhwYW5kaW5nIHRoZSBhdG9tIGJ1ZmZlciAqLworc3RhdGljIGNoYXIgKmF0eWJ1ZiA9IE5VTEw7CQkvKiBGb3IgY29weWluZyBhdG9tIGJ1ZmZlciAqLworc3RhdGljIGNoYXIgKmZpbGJ1ZiA9IE5VTEw7CQkvKiBGaWxlIG5hbWUgYnVmZmVyICovCitzdGF0aWMgY2hhciAqY21wcm9tID0gTlVMTDsJCS8qIFByb2dyYW0ncyBwcm9tcHQgKi8KK3N0YXRpYyBjaGFyICpjbXByeHggPSBOVUxMOwkJLyogUHJvZ3JhbSdzIHByb21wdCwgdW5ldmFsdWF0ZWQgKi8KKworI2lmZGVmIENLX1JFQ0FMTAorLyoKKyAgQ29tbWFuZCByZWNhbGwgaXMgYXZhaWxhYmxlIG9ubHkgaWYgd2UgY2FuIG1ha2UgcHJvZmxpZ2F0ZSB1c2Ugb2YgbWFsbG9jKCkuCisqLworI2RlZmluZSBSX01BWCAxMAkJCS8qIEhvdyBtYW55IGNvbW1hbmRzIHRvIHNhdmUgKi8KK2ludCBjbV9yZWNhbGwgPSBSX01BWDsJCQkvKiBTaXplIG9mIGNvbW1hbmQgcmVjYWxsIGJ1ZmZlciAqLworaW50IG9uX3JlY2FsbCA9IDE7CQkJLyogUmVjYWxsIGZlYXR1cmUgaXMgT04gKi8KK3N0YXRpYyBpbnQgbm9fcmVjYWxsID0gMDsJCS8qIFJlY2FsbCBPRkYgZm9yIHRoaXMgY21kIG9ubHkgKi8KK3N0YXRpYyBpbnQgZm9yY2VfYWRkID0gMDsJCS8qIEZvcmNlIGNtZCBpbnRvIHJlY2FsbCBidWZmZXIgKi8KK3N0YXRpYyBpbnQgbGFzdF9yZWNhbGwgPSAtMTsJCS8qIExhc3QgcmVjYWxsLXJlbGF0ZWQgYWN0aW9uICovCisvKgorICAtMSA9IG5vbmUKKyAgIDAgPSBDUiAoYSBjb21tYW5kIHdhcyBlbnRlcmVkKQorICAgMSA9IFVwCisgICAyID0gRG93bgorKi8KK2ludCBpbl9yZWNhbGwgPSAwOwkJCS8qIFJlY2FsbCBidWZmZXJzIGFyZSBpbml0J2QgKi8KK3N0YXRpYyBpbnQKKyAgY3VycmVudCA9IC0xLAkJCQkvKiBQb2ludGVyIHRvIGN1cnJlbnQgY29tbWFuZCAqLworICBybGFzdCA9IC0xOwkJCQkvKiBJbmRleCBvZiBsYXN0IGNvbW1hbmQgaW4gYnVmZmVyICovCitzdGF0aWMgY2hhciAqKnJlY2FsbCA9IE5VTEw7CQkvKiBBcnJheSBvZiByZWNhbGwgYnVmZmVyIHBvaW50ZXJzICovCisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisjZWxzZSAgLyogIURDTURCVUYgKi8KK2NoYXIgY21kYnVmW0NNREJMKzRdOyAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kIGJ1ZmZlciAqLworY2hhciBzYXZidWZbQ01EQkwrNF07ICAgICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciB0byBzYXZlIGNvcHkgb2YgY29tbWFuZCAqLworY2hhciBhdG1idWZbQVRNQkwrNF07ICAgICAgICAgICAgICAgICAgIC8qIEF0b20gYnVmZmVyICovCitjaGFyIGF0eGJ1ZltDTURCTCs0XTsgICAgICAgICAgICAgICAgICAgLyogRm9yIGV4cGFuZGluZyB0aGUgYXRvbSBidWZmZXIgKi8KK3N0YXRpYyBjaGFyIGF0eWJ1ZltBVE1CTCs0XTsJCS8qIEZvciBjb3B5aW5nIGF0b20gYnVmZmVyICovCitzdGF0aWMgY2hhciBmaWxidWZbQVRNQkwrNF07CQkvKiBGaWxlIG5hbWUgYnVmZmVyICovCitzdGF0aWMgY2hhciBjbXByb21bUFJPTVBUTCsxXTsJCS8qIFByb2dyYW0ncyBwcm9tcHQgKi8KK3N0YXRpYyBjaGFyIGNtcHJ4eFtQUk9NUFRMKzFdOwkJLyogUHJvZ3JhbSdzIHByb21wdCwgdW5ldmFsdWF0ZWQgKi8KKyNlbmRpZiAvKiBEQ01EQlVGICovCisKKy8qIENvbW1hbmQgYnVmZmVyIHBvaW50ZXJzICovCisKKyNkZWZpbmUgUFBWTEVOIDI0CitjaGFyIHBwdm5hbWJ1ZltQUFZMRU4rMV0gPSB7IE5VTCwgTlVMIH07CisKK2NoYXIgKiBjbWJwdHIgPSBOVUxMOwkJCS8qIEN1cnJlbnQgcG9zaXRpb24gKGZvciBleHBvcnQpICovCisKK3N0YXRpYyBjaGFyICpicCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbW1hbmQgYnVmZmVyIHBvc2l0aW9uICovCisgICAgKnBwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhcnQgb2YgY3VycmVudCBmaWVsZCAqLworICAgICpucDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIG5leHQgZmllbGQgKi8KKworc3RhdGljIGludCB1bmd3LAkJCS8qIEZvciB1bmdldHRpbmcgd29yZHMgKi8KKyAgICBhdHhuOwkJCQkvKiBFeHBhbnNpb24gYnVmZmVyIChhdHhidWYpIGxlbmd0aCAqLworCisjaWZkZWYgT1MyCitleHRlcm4gaW50IHdpZGVyZXN1bHQ7CisjZW5kaWYgLyogT1MyICovCisKK2V4dGVybiBpbnQgY21kX2NvbHMsIGNtZF9yb3dzLCBsb2NhbCwgcXVpZXQ7CisKKyNpZmRlZiBUTkNPREUKKyNpZmRlZiBJQUMKKyN1bmRlZiBJQUMKKyNlbmRpZiAvKiBJQUMgKi8KKyNkZWZpbmUgSUFDIDI1NQorI2VuZGlmIC8qIFROQ09ERSAqLworCitfUFJPVE9UWVAoIHN0YXRpYyBpbnQgZ3R3b3JkLCAoaW50KSApOworX1BST1RPVFlQKCBzdGF0aWMgaW50IGFkZGJ1ZiwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggc3RhdGljIGludCBzZXRhdG0sIChjaGFyICosIGludCkgKTsKK19QUk9UT1RZUCggc3RhdGljIFZPSUQgY21kbmV3bCwgKGNoYXIpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBWT0lEIGNtZGNoYXJkZWwsICh2b2lkKSApOworX1BST1RPVFlQKCBzdGF0aWMgVk9JRCBjbWRlY2hvLCAoY2hhciwgaW50KSApOworX1BST1RPVFlQKCBzdGF0aWMgaW50IHRlc3QsIChpbnQsIGludCkgKTsKKyNpZmRlZiBHRU1ET1MKK19QUk9UT1RZUCggZXh0ZXJuIGNoYXIgKnN0cmNociwgKGNoYXIgKiwgaW50KSApOworI2VuZGlmIC8qIEdFTURPUyAqLworCitleHRlcm4gY2hhciAqIGRmdHR5OworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBmb3IgdXNlIHdpdGggY2hhaW5lZCBGREIncyAqLworCitzdGF0aWMgaW50IGNyZmxhZyA9IDA7CQkJLyogQ2FycmlhZ2UgcmV0dXJuIHdhcyB0eXBlZCAqLworc3RhdGljIGludCBxbWZsYWcgPSAwOwkJCS8qIFF1ZXN0aW9uIG1hcmsgd2FzIHR5cGVkICovCitzdGF0aWMgaW50IGVzZmxhZyA9IDA7CQkJLyogRXNjYXBlIHdhcyB0eXBlZCAqLworCisvKiBEaXJlY3Rvcnkgc2VwYXJhdG9yICovCisKKyNpZmRlZiBHRU1ET1MKK3N0YXRpYyBjaGFyIGRpcnNlcCA9ICdcXCc7CisjZWxzZQorI2lmZGVmIGRhdGFnZW5lcmFsCitzdGF0aWMgY2hhciBkaXJzZXAgPSAnOic7CisjZWxzZQorI2lmZGVmIE1BQworc3RhdGljIGNoYXIgZGlyc2VwID0gJzonOworI2Vsc2UKKyNpZmRlZiBWTVMKK3N0YXRpYyBjaGFyIGRpcnNlcCA9ICcuJzsKKyNlbHNlCisjaWZkZWYgU1RSQVRVUworc3RhdGljIGNoYXIgZGlyc2VwID0gJz4nOworI2Vsc2UKK3N0YXRpYyBjaGFyIGRpcnNlcCA9ICcvJzsJCS8qIFVOSVgsIE9TLzIsIE9TLTksIEFtaWdhLCBldGMuICovCisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogR0VNRE9TICovCisKKy8qICBIIEEgUyBOIE8gUCBBIFQgSCAgKi8KKworLyogIFJldHVybnMgMCBpZiBmaWxlc3BlYyBzIGluY2x1ZGVzIGFueSBwYXRoIHNlZ21lbnRzOyAxIGlmIGl0IGRvZXNuJ3QuICovCisKK2ludAoraGFzbm9wYXRoKHMpIGNoYXIgKiBzOyB7CisgICAgY2hhciAqIHAgPSBOVUxMOworICAgIGlmICghcykgcmV0dXJuKDApOworICAgIGlmICghKnMpIHJldHVybigwKTsKKyAgICB6c3RyaXAocywmcCk7CisgICAgcmV0dXJuKGNrc3RyY21wKHMscCxDS01BWFBBVEgsZmlsZWNhc2UpID09IDAgPyAxIDogMCk7Cit9CisKKy8qICBDIEsgUyBQIFIgRSBBIEQgIC0tICBQcmludCBzdHJpbmcgZG91YmxlLXNwYWNlZCAgKi8KKworc3RhdGljIGNoYXIgKiBzcHJwdHIgPSBOVUxMOworCitzdGF0aWMgY2hhciAqCitja3NwcmVhZChzKSBjaGFyICogczsgeworICAgIGludCBuID0gMDsKKyAgICBjaGFyICogcDsKKyAgICBuID0gc3RybGVuKHMpOworICAgIGlmIChzcHJwdHIpCisgICAgICBmcmVlKHNwcnB0cik7CisgICAgc3BycHRyID0gbWFsbG9jKG4gKyBuICsgMyk7CisgICAgaWYgKHNwcnB0cikgeworCXAgPSBzcHJwdHI7CisJd2hpbGUgKCpzKSB7CisJICAgICpwKysgPSAqcysrOworCSAgICAqcCsrID0gU1A7CisJfQorCSpwID0gTlVMOworICAgIH0KKyAgICByZXR1cm4oc3BycHRyID8gc3BycHRyIDogIiIpOworfQorCisvKiAgVCBFIFMgVCAgLS0gIEJpdCB0ZXN0ICAqLworCitzdGF0aWMgaW50Cit0ZXN0KHgsbSkgaW50IHgsIG07IHsgLyogIFJldHVybnMgMSBpZiBhbnkgYml0cyBmcm9tIG0gYXJlIG9uIGluIHgsIGVsc2UgMCAgKi8KKyAgICByZXR1cm4oKHggJiBtKSA/IDEgOiAwKTsKK30KKworLyogIEsgVyBEIEggRSBMIFAgIC0tICBHaXZlbiBhIGtleXdvcmQgdGFibGUsIHByaW50IGtleXdvcmRzIGluIGNvbHVtbnMuICAqLworLyoKKyAgQ2FsbCB3aXRoOgorICAgIHMgICAgIC0ga2V5d29yZCB0YWJsZQorICAgIG4gICAgIC0gbnVtYmVyIG9mIGVudHJpZXMKKyAgICBwYXQgICAtIHBhdHRlcm4gKGxlZnQgc3Vic3RyaW5nKSB0aGF0IG11c3QgbWF0Y2ggZm9yIGVhY2gga2V5d29yZAorICAgIHByZSAgIC0gcHJlZml4IHRvIGFkZCB0byBlYWNoIGtleXdvcmQKKyAgICBwb3N0ICAtIHN1ZmZpeCB0byBhZGQgdG8gZWFjaCBrZXl3b3JkCisgICAgb2ZmICAgLSBvZmZzZXQgb24gZmlyc3Qgc2NyZWVuZnVsLCBhbGxvd2luZyByb29tIGZvciBpbnRyb2R1Y3RvcnkgdGV4dAorICAgIHhobHAgIC0gMSB0byBwcmludCBhbnkgQ01fSU5WIGtleXdvcmRzIHRoYXQgYXJlIG5vdCBhbHNvIGFiYnJldmlhdGlvbnMuCisgICAgICAgICAgICAyIHRvIHByaW50IENNX0lOViBrZXl3b3JkcyBpZiBDTV9ITFAgYWxzbyBzZXQKKyAgICAgICAgICAgIDQgaWYgaXQncyBhIHN3aXRjaCB0YWJsZSAodG8gc2hvdyAnOicgaWYgQ01fQVJHKQorCisgIEFycmFuZ2VzIGtleXdvcmRzIGluIGNvbHVtbnMgd2l0aCB3aWR0aCBiYXNlZCBvbiBsb25nZXN0IGtleXdvcmQuCisgIERvZXMgIm1vcmU/IiBwcm9tcHRpbmcgYXQgZW5kIG9mIHNjcmVlbi4KKyAgVXNlcyBnbG9iYWwgY21kX3Jvd3MgYW5kIGNtZF9jb2xzIGZvciBzY3JlZW4gc2l6ZS4KKyovCitWT0lECitrd2RoZWxwKHMsbixwYXQscHJlLHBvc3Qsb2ZmLHhobHApCisgICAgc3RydWN0IGtleXRhYiBzW107IGludCBuLCBvZmYsIHhobHA7IGNoYXIgKnBhdCwgKnByZSwgKnBvc3Q7CisvKiBrd2RoZWxwICovIHsKKworICAgIGludCB3aWR0aCA9IDA7CisgICAgaW50IGNjOworICAgIGludCBjb2xzLCBoZWlnaHQsIGksIGosIGssIGxjLCBuMiA9IDA7CisgICAgY2hhciAqYiA9IE5VTEwsICpwLCAqcTsKKyAgICBjaGFyICpwYSwgKnB4OworICAgIGNoYXIgKipzMiA9IE5VTEw7CisgICAgY2hhciAqdG1wYnVmID0gTlVMTDsKKworICAgIGNjID0gc3RybGVuKHBhdCk7CisKKyAgICBpZiAoIXMpIHJldHVybjsJCQkvKiBOb3RoaW5nIHRvIGRvICovCisgICAgaWYgKG4gPCAxKSByZXR1cm47CQkJLyogRGl0dG8gKi8KKyAgICBpZiAob2ZmIDwgMCkgb2ZmID0gMDsJCS8qIE9mZnNldCBmb3IgZmlyc3QgcGFnZSAqLworICAgIGlmICghcHJlKSBwcmUgPSAiIjsJCQkvKiBIYW5kbGUgbnVsbCBzdHJpbmcgcG9pbnRlcnMgKi8KKyAgICBpZiAoIXBvc3QpIHBvc3QgPSAiIjsKKyAgICBsYyA9IG9mZjsJCQkJLyogU2NyZWVuLWxpbmUgY291bnRlciAqLworCisgICAgaWYgKHhobHAgJiA0KQkJCS8qIEZvciBzd2l0Y2hlcyAqLworICAgICAgdG1wYnVmID0gKGNoYXIgKiltYWxsb2MoVE1QQlVGU0laKzEpOworCisgICAgaWYgKChzMiA9IChjaGFyICoqKSBtYWxsb2MobiAqIHNpemVvZihjaGFyICopKSkpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CS8qIEZpbmQgbG9uZ2VzdCBrZXl3b3JkICovCisJICAgIHMyW2ldID0gTlVMTDsKKwkgICAgaWYgKGNrc3RyY21wKHNbaV0ua3dkLHBhdCxjYywwKSkKKwkgICAgICBjb250aW51ZTsKKworCSAgICBpZiAoc1tpXS5mbGdzICYgQ01fUFNICS8qIE5PUFVTSCBvciBub3B1c2ggc2NyZWVuaW5nICovCisjaWZuZGVmIE5PUFVTSAorCQkmJiBub3B1c2gKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKwkJKQorCSAgICAgIGNvbnRpbnVlOworCSAgICBpZiAoc1tpXS5mbGdzICYgQ01fTE9DCS8qIE5PTE9DQUwgb3Igbm9sb2NhbCBzY3JlZW5pbmcgKi8KKyNpZm5kZWYgTk9MT0NBTAorCQkmJiBub2xvY2FsCisjZW5kaWYgLyogTk9MT0NBTCAqLworCQkpCisJICAgICAgY29udGludWU7CisKKwkgICAgaWYgKHNbaV0uZmxncyAmIENNX0lOVikgeworI2lmZGVmIENPTU1FTlQKKy8qIFRoaXMgY29kZSBkb2VzIG5vdCBzaG93IGludmlzaWJsZSBrZXl3b3JkcyBhdCBhbGwgZXhjZXB0IGZvciAiaGVscCA/IiAqLworLyogYW5kIHRoZW4gb25seSBoZWxwIHRvcGljcyAoQ01fSExQKSBpbiB0aGUgdG9wLWxldmVsIGtleXdvcmQgbGlzdC4gKi8KKworCQlpZiAoKHhobHAgJiAyKSA9PSAwKQorCQkgIGNvbnRpbnVlOworCQllbHNlIGlmICgoc1tpXS5mbGdzICYgQ01fSExQKSA9PSAwKQorCQkgIGNvbnRpbnVlOworI2Vsc2UKKy8qIFRoaXMgY29kZSBzaG93cyBpbnZpc2libGUga2V5d29yZHMgdGhhdCBhcmUgbm90IGFsc28gYWJicmV2aWF0aW9ucyB3aGVuICovCisvKiA/IHdhcyB0eXBlZCBBRlRFUiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWVsZCBzbyB0aGUgdXNlciBjYW4gZmluZCBvdXQgKi8KKy8qIHdoYXQgdGhleSBhcmUgYW5kIChmb3IgZXhhbXBsZSkgd2h5IGNvbXBsZXRpb24gZG9lc24ndCB3b3JrIGF0IHRoaXMgcG9pbnQgKi8KKworCQlpZiAoc1tpXS5mbGdzICYgQ01fQUJSKQorCQkgIGNvbnRpbnVlOworCQllbHNlIGlmICgoeGhscCAmIDMpID09IDApCisJCSAgY29udGludWU7CisJCWVsc2UgaWYgKCh4aGxwICYgMikgJiYgKChzW2ldLmZsZ3MgJiBDTV9ITFApID09IDApKQorCQkgIGNvbnRpbnVlOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgICAgfQorCSAgICBqID0gc3RybGVuKHNbaV0ua3dkKTsKKwkgICAgaWYgKCEoeGhscCAmIDQpIHx8ICF0bXBidWYpIHsgLyogUmVndWxhciBrZXl3b3JkIHRhYmxlICovCisJCXMyW24yKytdID0gc1tpXS5rd2Q7CS8qIENvcHkgcG9pbnRlcnMgdG8gdmlzaWJsZSBvbmVzICovCisJICAgIH0gZWxzZSB7CQkJLyogU3dpdGNoZXMgKi8KKwkJY2ttYWttc2codG1wYnVmLAkvKiBNYWtlIGEgY29weSB0aGF0IHNob3dzICI6IiBpZiAqLworCQkJIFRNUEJVRlNJWiwJLyogdGhlIHN3aXRjaCB0YWtlcyBhbiBhcmd1bWVudC4gKi8KKwkJCSBzW2ldLmt3ZCwKKwkJCSAoc1tpXS5mbGdzICYgQ01fQVJHKSA/ICI6IiA6ICIiLAorCQkJIE5VTEwsCisJCQkgTlVMTAorCQkJICk7CisJCW1ha2VzdHIoJihzMltuMl0pLHRtcGJ1Zik7CisJCWlmIChzW2ldLmZsZ3MgJiBDTV9BUkcpIGorKzsKKwkJbjIrKzsKKwkgICAgfQorCSAgICBpZiAoaiA+IHdpZHRoKQorCSAgICAgIHdpZHRoID0gajsKKwl9CisJLyogQ29sdW1uIHdpZHRoICovCisJbiA9IG4yOworICAgIH0KKyAgICBpZiAoczIgJiYgKGIgPSAoY2hhciAqKSBtYWxsb2MoY21kX2NvbHMgKyAxKSkpIHsgLyogTWFrZSBhIGxpbmUgYnVmZmVyICAgKi8KKwljaGFyICogYng7CisJYnggPSBiICsgY21kX2NvbHM7CisJd2lkdGggKz0gKGludClzdHJsZW4ocHJlKSArIChpbnQpc3RybGVuKHBvc3QpICsgMjsKKwljb2xzID0gY21kX2NvbHMgLyB3aWR0aDsJLyogSG93IG1hbnkgY29sdW1ucz8gKi8KKwlpZiAoY29scyA8IDEpIGNvbHMgPSAxOworCWhlaWdodCA9IG4gLyBjb2xzOwkJLyogSG93IGxvbmcgaXMgZWFjaCBjb2x1bW4/ICovCisJaWYgKG4gJSBjb2xzKSBoZWlnaHQrKzsJCS8qIEFkZCBvbmUgZm9yIHJlbWFpbmRlciwgaWYgYW55ICovCisKKwlmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsJICAgIC8qIExvb3AgZm9yIGVhY2ggcm93ICovCisJICAgIGZvciAoaiA9IDA7IGogPCBjbWRfY29sczsgaisrKSAgLyogRmlyc3QgZmlsbCByb3cgd2l0aCBibGFua3MgKi8KKwkgICAgICBiW2pdID0gU1A7CisJICAgIGZvciAoaiA9IDA7IGogPCBjb2xzOyBqKyspIHsgICAgLyogTG9vcCBmb3IgZWFjaCBjb2x1bW4gaW4gcm93ICovCisJCWsgPSBpICsgKGogKiBoZWlnaHQpOyAgICAgICAvKiBJbmRleCBvZiBuZXh0IGtleXdvcmQgKi8KKwkJaWYgKGsgPCBuKSB7CQkgICAgLyogSW4gcmFuZ2U/ICovCisJCSAgICBwYSA9IHByZTsKKwkJICAgIHB4ID0gcG9zdDsKKwkJICAgIHAgPSBzMltrXTsJCSAgICAvKiBQb2ludCB0byB2ZXJiIG5hbWUgKi8KKwkJICAgIHEgPSBiICsgKGogKiB3aWR0aCkgKyAxOyAvKiBXaGVyZSB0byBjb3B5IGl0IHRvICovCisJCSAgICB3aGlsZSAoKHEgPCBieCkgJiYgKCpxKysgPSAqcGErKykpIDsgLyogQ29weSBwcmVmaXggKi8KKwkJICAgIHEtLTsJCSAgICAgICAgICAgICAgICAgLyogQmFjayB1cCBvdmVyIE5VTCAqLworCQkgICAgd2hpbGUgKChxIDwgYngpICYmICgqcSsrID0gKnArKykpIDsJIC8qIENvcHkgZmlsZW5hbWUgKi8KKwkJICAgIHEtLTsJCSAgICAgICAgICAgICAgICAgLyogQmFjayB1cCBvdmVyIE5VTCAqLworCQkgICAgd2hpbGUgKChxIDwgYngpICYmICgqcSsrID0gKnB4KyspKSA7IC8qIENvcHkgc3VmZml4ICovCisJCSAgICBpZiAoaiA8IGNvbHMgLSAxKSB7CisJCQlxLS07CisJCQkqcSA9IFNQOwkvKiBSZXBsYWNlIHRoZSBzcGFjZSAqLworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgcCA9IGIgKyBjbWRfY29scyAtIDE7CS8qIExhc3QgY2hhciBpbiBsaW5lICovCisJICAgIHdoaWxlICgqcC0tID09IFNQKSA7CS8qIFRyaW0gKi8KKwkgICAgKihwKzIpID0gTlVMOworCSAgICBwcmludGYoIiVzXG4iLGIpOwkJLyogUHJpbnQgdGhlIGxpbmUgKi8KKwkgICAgaWYgKCsrbGMgPiAoY21kX3Jvd3MgLSAyKSkgeyAvKiBTY3JlZW4gZnVsbD8gKi8KKwkJaWYgKCFhc2ttb3JlKCkpCQkvKiBEbyBtb3JlLXByb21wdGluZy4uLiAqLworCQkgIGdvdG8geGt3ZGhlbHA7CisJCWVsc2UKKwkJICBsYyA9IDA7CisJICAgIH0KKwl9CisJLyogcHJpbnRmKCJcbiIpOyAqLwkJLyogQmxhbmsgbGluZSBhdCBlbmQgb2YgcmVwb3J0ICovCisgICAgfSBlbHNlIHsJCQkJLyogTWFsbG9jIGZhaWx1cmUsIG5vIGNvbHVtbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJICAgIGlmIChzW2ldLmZsZ3MgJiBDTV9JTlYpCS8qIFVzZSBvcmlnaW5hbCBrZXl3b3JkIHRhYmxlICovCisJICAgICAgY29udGludWU7CQkJLyogc2tpcHBpbmcgaW52aXNpYmxlIGVudHJpZXMgKi8KKwkgICAgcHJpbnRmKCIlcyVzJXNcbiIscHJlLHNbaV0ua3dkLHBvc3QpOworCSAgICBpZiAoKytsYyA+IChjbWRfcm93cyAtIDIpKSB7IC8qIFNjcmVlbiBmdWxsPyAqLworCQlpZiAoIWFza21vcmUoKSkJCS8qIERvIG1vcmUtcHJvbXB0aW5nLi4uICovCisJCSAgZ290byB4a3dkaGVscDsKKwkJZWxzZQorCQkgIGxjID0gMDsKKwkgICAgfQorCX0KKyAgICB9CisgIHhrd2RoZWxwOgorICAgIGlmICh4aGxwICYgNCkgeworCWlmICh0bXBidWYpIGZyZWUoKGNoYXIgKil0bXBidWYpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJICBpZiAoczJbaV0pIGZyZWUoczJbaV0pOworICAgIH0KKyAgICBpZiAoczIpIGZyZWUoczIpOwkJCS8qIEZyZWUgYXJyYXkgY29weSAqLworICAgIGlmIChiKSBmcmVlKGIpOwkJCS8qIEZyZWUgbGluZSBidWZmZXIgKi8KKyAgICByZXR1cm47Cit9CisKKy8qICBGIEkgTCBIIEUgTCBQICAtLSAgR2l2ZW4gYSBmaWxlIGxpc3QsIHByaW50IG5hbWVzIGluIGNvbHVtbnMuICAqLworLyoKKyAgQ2FsbCB3aXRoOgorICAgIG4gICAgIC0gbnVtYmVyIG9mIGVudHJpZXMKKyAgICBwcmUgICAtIHByZWZpeCB0byBhZGQgdG8gZWFjaCBmaWxlbmFtZQorICAgIHBvc3QgIC0gc3VmZml4IHRvIGFkZCB0byBlYWNoIGZpbGVuYW1lCisgICAgb2ZmICAgLSBvZmZzZXQgb24gZmlyc3Qgc2NyZWVuZnVsLCBhbGxvd2luZyByb29tIGZvciBpbnRyb2R1Y3RvcnkgdGV4dAorICAgIGNtZGlyZmxnIC0gMSBpZiBvbmx5IGRpcmVjdG9yeSBuYW1lcyBzaG91bGQgYmUgbGlzdGVkLCAwIHRvIGxpc3QgYWxsIGZpbGVzCisKKyAgQXJyYW5nZXMgZmlsZW5hbWVzIGluIGNvbHVtbnMgd2l0aCB3aWR0aCBiYXNlZCBvbiBsb25nZXN0IGZpbGVuYW1lLgorICBEb2VzICJtb3JlPyIgcHJvbXB0aW5nIGF0IGVuZCBvZiBzY3JlZW4uCisgIFVzZXMgZ2xvYmFsIGNtZF9yb3dzIGFuZCBjbWRfY29scyBmb3Igc2NyZWVuIHNpemUuCisqLworCitpbnQKK2ZpbGhlbHAobixwcmUscG9zdCxvZmYsY21kaXJmbGcpIGludCBuLCBvZmY7IGNoYXIgKnByZSwgKnBvc3Q7IGludCBjbWRpcmZsZzsgeworICAgIGNoYXIgZmlsYnVmW0NLTUFYUEFUSCArIDFdOwkJLyogVGVtcCBidWZmZXIgZm9yIG9uZSBmaWxlbmFtZSAqLworICAgIGludCB3aWR0aCA9IDA7CisgICAgaW50IGNvbHMsIGhlaWdodCwgaSwgaiwgaywgbGMsIG4yID0gMCwgcmMgPSAwLCBpdHNhZGlyID0gMDsKKyAgICBjaGFyICpiID0gTlVMTCwgKnAsICpxOworICAgIGNoYXIgKnBhLCAqcHg7CisgICAgY2hhciAqKnMyID0gTlVMTDsKKyNpZmRlZiBWTVMKKyAgICBjaGFyICogY2RwID0gemd0ZGlyKCk7CisjZW5kaWYgLyogVk1TICovCisKKyAgICBpZiAobiA8IDEpIHJldHVybigwKTsKKyAgICBpZiAob2ZmIDwgMCkgb2ZmID0gMDsJCS8qIE9mZnNldCBmb3IgZmlyc3QgcGFnZSAqLworICAgIGlmICghcHJlKSBwcmUgPSAiIjsJCQkvKiBIYW5kbGUgbnVsbCBzdHJpbmcgcG9pbnRlcnMgKi8KKyAgICBpZiAoIXBvc3QpIHBvc3QgPSAiIjsKKworICAgIGxjID0gb2ZmOwkJCQkvKiBTY3JlZW4tbGluZSBjb3VudGVyICovCisKKyAgICBpZiAoKHMyID0gKGNoYXIgKiopIG1hbGxvYyhuICogc2l6ZW9mKGNoYXIgKikpKSkgeworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsJLyogTG9vcCB0aHJvdWdoIGZpbGVuYW1lcyAqLworCSAgICBpdHNhZGlyID0gMDsKKwkgICAgczJbaV0gPSBOVUxMOwkJLyogSW5pdGlhbGl6ZSBlYWNoIHBvaW50ZXIgdG8gTlVMTCAqLworCSAgICB6bmV4dChmaWxidWYpOwkJLyogR2V0IG5leHQgZmlsZW5hbWUgKi8KKwkgICAgaWYgKCFmaWxidWZbMF0pCQkvKiBTaG91bGRuJ3QgaGFwcGVuICovCisJICAgICAgYnJlYWs7CisjaWZkZWYgQ09NTUVOVAorCSAgICBpdHNhZGlyID0gaXNkaXIoZmlsYnVmKTsJLyogSXMgaXQgYSBkaXJlY3Rvcnk/ICovCisJICAgIGlmIChjbWRpcmZsZyAmJiAhaXRzYWRpcikJLyogTm8sIGxpc3RpbmcgZGlyZWN0b3JpZXMgb25seT8gKi8KKwkgICAgICBjb250aW51ZTsJCQkvKiBTbyBza2lwIHRoaXMgb25lLiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBWTVMKKwkgICAgY2tzdHJuY3B5KGZpbGJ1Zix6cmVsbmFtZShmaWxidWYsY2RwKSxDS01BWFBBVEgpOworI2VuZGlmIC8qIFZNUyAqLworCSAgICBqID0gc3RybGVuKGZpbGJ1Zik7CisjaWZuZGVmIFZNUworCSAgICBpZiAoaXRzYWRpciAmJiBqIDwgQ0tNQVhQQVRIIC0gMSAmJiBqID4gMCkgeworCQlpZiAoZmlsYnVmW2otMV0gIT0gZGlyc2VwKSB7CisJCSAgICBmaWxidWZbaisrXSA9IGRpcnNlcDsKKwkJICAgIGZpbGJ1ZltqXSA9IE5VTDsKKwkJfQorCSAgICB9CisjZW5kaWYgLyogVk1TICovCisJICAgIGlmICghKHMyW24yXSA9IG1hbGxvYyhqKzEpKSkgeworCQlwcmludGYoIj9NZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJcmMgPSAtOTsKKwkJZ290byB4ZmlsaGVscDsKKwkgICAgfQorCSAgICBpZiAoaiA8PSBDS01BWFBBVEgpIHsKKwkJc3RyY3B5KHMyW24yXSxmaWxidWYpOworCQluMisrOworCSAgICB9IGVsc2UgeworCQlwcmludGYoIj9OYW1lIHRvbyBsb25nIC0gJXNcbiIsIGZpbGJ1Zik7CisJCXJjID0gLTk7CisJCWdvdG8geGZpbGhlbHA7CisJICAgIH0KKwkgICAgaWYgKGogPiB3aWR0aCkJCS8qIEdldCB3aWR0aCBvZiB3aWRlc3Qgb25lICovCisJICAgICAgd2lkdGggPSBqOworCX0KKwluID0gbjI7CQkJCS8qIEhvdyBtYW55IHdlIGFjdHVhbGx5IGdvdCAqLworICAgIH0KKyAgICBzaF9zb3J0KHMyLE5VTEwsbiwwLDAsZmlsZWNhc2UpOwkvKiBBbHBoYWJldGl6ZSB0aGUgbGlzdCAqLworCisgICAgcmMgPSAxOworICAgIGlmIChzMiAmJiAoYiA9IChjaGFyICopIG1hbGxvYyhjbWRfY29scyArIDEpKSkgeyAvKiBNYWtlIGEgbGluZSBidWZmZXIgKi8KKwljaGFyICogYng7CisJYnggPSBiICsgY21kX2NvbHM7CisJd2lkdGggKz0gKGludClzdHJsZW4ocHJlKSArIChpbnQpc3RybGVuKHBvc3QpICsgMjsKKwljb2xzID0gY21kX2NvbHMgLyB3aWR0aDsJLyogSG93IG1hbnkgY29sdW1ucz8gKi8KKwlpZiAoY29scyA8IDEpIGNvbHMgPSAxOworCWhlaWdodCA9IG4gLyBjb2xzOwkJLyogSG93IGxvbmcgaXMgZWFjaCBjb2x1bW4/ICovCisJaWYgKG4gJSBjb2xzKSBoZWlnaHQrKzsJCS8qIEFkZCBvbmUgZm9yIHJlbWFpbmRlciwgaWYgYW55ICovCisKKwlmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsJICAgIC8qIExvb3AgZm9yIGVhY2ggcm93ICovCisJICAgIGZvciAoaiA9IDA7IGogPCBjbWRfY29sczsgaisrKSAgLyogRmlyc3QgZmlsbCByb3cgd2l0aCBibGFua3MgKi8KKwkgICAgICBiW2pdID0gU1A7CisJICAgIGZvciAoaiA9IDA7IGogPCBjb2xzOyBqKyspIHsgICAgLyogTG9vcCBmb3IgZWFjaCBjb2x1bW4gaW4gcm93ICovCisJCWsgPSBpICsgKGogKiBoZWlnaHQpOyAgICAgICAvKiBJbmRleCBvZiBuZXh0IGZpbGVuYW1lICovCisJCWlmIChrIDwgbikgewkJICAgIC8qIEluIHJhbmdlPyAqLworCQkgICAgcGEgPSBwcmU7CisJCSAgICBweCA9IHBvc3Q7CisJCSAgICBwID0gczJba107CQkgICAgICAgICAgICAgICAvKiBQb2ludCB0byBmaWxlbmFtZSAqLworCQkgICAgcSA9IGIgKyAoaiAqIHdpZHRoKSArIDE7ICAgICAgICAgICAgIC8qIGFuZCBkZXN0aW5hdGlvbiAqLworCQkgICAgd2hpbGUgKChxIDwgYngpICYmICgqcSsrID0gKnBhKyspKSA7IC8qIENvcHkgcHJlZml4ICovCisJCSAgICBxLS07CQkgICAgICAgICAgICAgICAgIC8qIEJhY2sgdXAgb3ZlciBOVUwgKi8KKwkJICAgIHdoaWxlICgocSA8IGJ4KSAmJiAoKnErKyA9ICpwKyspKSA7CSAvKiBDb3B5IGZpbGVuYW1lICovCisJCSAgICBxLS07CQkgICAgICAgICAgICAgICAgIC8qIEJhY2sgdXAgb3ZlciBOVUwgKi8KKwkJICAgIHdoaWxlICgocSA8IGJ4KSAmJiAoKnErKyA9ICpweCsrKSkgOyAvKiBDb3B5IHN1ZmZpeCAqLworCQkgICAgaWYgKGogPCBjb2xzIC0gMSkgeworCQkJcS0tOworCQkJKnEgPSBTUDsJLyogUmVwbGFjZSB0aGUgc3BhY2UgKi8KKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIHAgPSBiICsgY21kX2NvbHMgLSAxOwkvKiBMYXN0IGNoYXIgaW4gbGluZSAqLworCSAgICB3aGlsZSAoKnAtLSA9PSBTUCkgOwkvKiBUcmltICovCisJICAgICoocCsyKSA9IE5VTDsKKwkgICAgcHJpbnRmKCIlc1xuIixiKTsJCS8qIFByaW50IHRoZSBsaW5lICovCisJICAgIGlmICgrK2xjID4gKGNtZF9yb3dzIC0gMikpIHsgLyogU2NyZWVuIGZ1bGw/ICovCisJCWlmICghYXNrbW9yZSgpKSB7CS8qIERvIG1vcmUtcHJvbXB0aW5nLi4uICovCisJCSAgICByYyA9IDA7CisJCSAgICBnb3RvIHhmaWxoZWxwOworCQl9IGVsc2UKKwkJICBsYyA9IDA7CisJICAgIH0KKwl9CisJcHJpbnRmKCJcbiIpOwkJCS8qIEJsYW5rIGxpbmUgYXQgZW5kIG9mIHJlcG9ydCAqLworCWdvdG8geGZpbGhlbHA7CisgICAgfSBlbHNlIHsJCQkJLyogTWFsbG9jIGZhaWx1cmUsIG5vIGNvbHVtbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJICAgIHpuZXh0KGZpbGJ1Zik7CisJICAgIGlmICghZmlsYnVmWzBdKSBicmVhazsKKwkgICAgcHJpbnRmKCIlcyVzJXNcbiIscHJlLGZpbGJ1Zixwb3N0KTsKKwkgICAgaWYgKCsrbGMgPiAoY21kX3Jvd3MgLSAyKSkgeyAvKiBTY3JlZW4gZnVsbD8gKi8KKwkJaWYgKCFhc2ttb3JlKCkpIHsJIC8qIERvIG1vcmUtcHJvbXB0aW5nLi4uICovCisJCSAgICByYyA9IDA7CisJCSAgICBnb3RvIHhmaWxoZWxwOworCQl9IGVsc2UgbGMgPSAwOworCSAgICB9CisJfQoreGZpbGhlbHA6CisJaWYgKGIpIGZyZWUoYik7CisJZm9yIChpID0gMDsgaSA8IG4yOyBpKyspCisJICBpZiAoczJbaV0pIGZyZWUoczJbaV0pOworCWlmIChzMikgZnJlZSgoY2hhciAqKXMyKTsKKwlyZXR1cm4ocmMpOworICAgIH0KK30KKworLyogIEMgTSBTIEUgVCBVIFAgIC0tICBTZXQgdXAgY29tbWFuZCBidWZmZXJzICAqLworCisjaWZkZWYgRENNREJVRgoraW50CitjbXNldHVwKCkgeworICAgIGlmICghKGNtZGJ1ZiA9IG1hbGxvYyhDTURCTCArIDQpKSkgcmV0dXJuKC0xKTsKKyAgICBpZiAoIShzYXZidWYgPSBtYWxsb2MoQ01EQkwgKyA0KSkpIHJldHVybigtMSk7CisgICAgc2F2YnVmWzBdID0gJ1wwJzsKKyAgICBpZiAoIShhdG1idWYgPSBtYWxsb2MoQVRNQkwgKyA0KSkpIHJldHVybigtMSk7CisgICAgaWYgKCEoYXR4YnVmID0gbWFsbG9jKENNREJMICsgNCkpKSByZXR1cm4oLTEpOworICAgIGlmICghKGF0eWJ1ZiA9IG1hbGxvYyhBVE1CTCArIDQpKSkgcmV0dXJuKC0xKTsKKyAgICBpZiAoIShmaWxidWYgPSBtYWxsb2MoQVRNQkwgKyA0KSkpIHJldHVybigtMSk7CisgICAgaWYgKCEoY21wcm9tID0gbWFsbG9jKFBST01QVEwgKyA0KSkpIHJldHVybigtMSk7CisgICAgaWYgKCEoY21wcnh4ID0gbWFsbG9jKFBST01QVEwgKyA0KSkpIHJldHVybigtMSk7CisjaWZkZWYgQ0tfUkVDQUxMCisgICAgY21yaW5pKGNtX3JlY2FsbCk7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIERDTURCVUYgKi8KKworLyogIEMgTSBTIEUgVCBQICAtLSAgU2V0IHRoZSBwcm9ncmFtIHByb21wdC4gICovCisKK1ZPSUQKK2Ntc2V0cChzKSBjaGFyICpzOyB7CisgICAgaWYgKCFzKSBzID0gIiI7CisgICAgY2tzdHJuY3B5KGNtcHJ4eCxzLFBST01QVEwpOworICAgIHBzZXRmID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgdGhhdCBwcm9tcHQgaGFzIGJlZW4gc2V0LiAqLworfQorCisvKiAgQyBNIFMgQSBWIFAgIC0tICBTYXZlIGEgY29weSBvZiB0aGUgY3VycmVudCBwcm9tcHQuICAqLworCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2Ntc2F2cChjaGFyIHNbXSwgaW50IG4pCisjZWxzZQorY21zYXZwKHMsbikgY2hhciBzW107IGludCBuOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBjbXNhdnAgKi8geworICAgIGlmIChwc2V0ZikJCQkJLyogQnV0IG5vdCBpZiBubyBwcm9tcHQgaXMgc2V0LiAqLworICAgICAgY2tzdHJuY3B5KHMsY21wcnh4LG4pOworfQorCitjaGFyICoKK2NtZ2V0cCgpIHsKKyAgICByZXR1cm4oY21wcnh4KTsKK30KKworaW50CitjbWdicmsoKSB7CisgICAgcmV0dXJuKGJya2NoYXIpOworfQorCitpbnQKK2NtZ2t3ZmxncygpIHsKKyAgICByZXR1cm4oY21rd2ZsZ3MpOworfQorCisvKiAgUCBSIE8gTSBQIFQgIC0tICBJc3N1ZSB0aGUgcHJvZ3JhbSBwcm9tcHQuICAqLworCitWT0lECitwcm9tcHQoZikgeHhfc3RycCBmOyB7CisgICAgY2hhciAqc3gsICpzeTsgaW50IG47CisjaWZkZWYgQ0tfU1NMCisgICAgZXh0ZXJuIGludCBzc2xfYWN0aXZlX2ZsYWcsIHRsc19hY3RpdmVfZmxhZzsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IGRpc3BsYXlfZGVtbzsKKworICAgIC8qIElmIHRoZXJlIGlzIGEgZGVtbyBzY3JlZW4gdG8gYmUgZGlzcGxheWVkLCBkaXNwbGF5IGl0ICovCisgICAgaWYgKGRpc3BsYXlfZGVtbyAmJiB4Y21kc3JjID09IDApIHsKKyAgICAgICAgZGVtb3Njcm4oVkNNRCk7CisgICAgICAgIGRpc3BsYXlfZGVtbyA9IDA7CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworCisgICAgaWYgKHBzZXRmID09IDApCQkJLyogSWYgbm8gcHJvbXB0IHNldCwgc2V0IGRlZmF1bHQuICovCisgICAgICBjbXNldHAoZGZwcm9tKTsKKworICAgIHN4ID0gY21wcnh4OwkJCS8qIFVuZXZhbHVhdGVkIGNvcHkgKi8KKyAgICBpZiAoZikgewkJCQkvKiBJZiBjb252ZXJzaW9uIGZ1bmN0aW9uIGdpdmVuICovCisJc3kgPSBjbXByb207CQkJLyogRXZhbHVhdGUgaXQgKi8KKwlkZWJ1ZyhGMTAxLCJwcm9tcHQgc3giLCIiLHN4KTsKKwlkZWJ1ZyhGMTAxLCJwcm9tcHQgc3kiLCIiLHN5KTsKKwluID0gUFJPTVBUTDsKKwlpZiAoKCpmKShzeCwmc3ksJm4pIDwgMCkJLyogSWYgZXZhbHVhdGlvbiBmYWlsZWQgKi8KKwkgIHN4ID0gY21wcnh4OwkJCS8qIHJldmVydCB0byB1bmV2YWx1YXRlZCBjb3B5ICovCisJZWxzZSBpZiAoISpjbXByb20pCQkvKiBkaXR0byBpZiBpdCBjYW1lIHVwIGVtcHR5ICovCisJICBzeCA9IGNtcHJ4eDsKKwllbHNlCisJICBzeCA9IGNtcHJvbTsKKyAgICB9IGVsc2UKKyAgICAgIGNrc3RybmNweShjbXByb20sc3gsUFJPTVBUTCk7CisgICAgY21wcm9tW1BST01QVEwtMV0gPSBOVUw7CisgICAgaWYgKCEqc3gpCQkJCS8qIERvbid0IHByaW50IGlmIGVtcHR5ICovCisgICAgICByZXR1cm47CisKKyNpZmRlZiBPU0sKKyAgICBmcHV0cyhzeCwgc3Rkb3V0KTsKKyNlbHNlCisjaWZkZWYgTUFDCisgICAgcHJpbnRmKCIlcyIsIHN4KTsKKyNlbHNlCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlcikgewkJCS8qIFByaW50IHRoZSBwcm9tcHQuICovCisgICAgICAgIHR0b2MoQ1IpOwkJCS8qIElmIFRFTE5FVCBTZXJ2ZXIgKi8KKyAgICAgICAgdHRvYyhOVUwpOwkJCS8qIG11c3QgZm9sbG9XIENSIGJ5IE5VTCAqLworICAgICAgICBwcmludGYoIiVzIixzeCk7CisgICAgfSBlbHNlCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgcHJpbnRmKCJcciVzIixzeCk7CisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKCEoc3NsX2FjdGl2ZV9mbGFnIHx8IHRsc19hY3RpdmVfZmxhZykpCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICBmZmx1c2goc3Rkb3V0KTsJCQkvKiBOb3chICovCisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogT1NLICovCit9CisKKyNpZm5kZWYgTk9TUEwKK1ZPSUQKK3B1c2hjbWQocykgY2hhciAqIHM7IHsJCQkvKiBGb3IgdXNlIHdpdGggSUYgY29tbWFuZC4gKi8KKyAgICBpZiAoIXMpIHMgPSBucDsKKyAgICBja3N0cm5jcHkoc2F2YnVmLHMsQ01EQkwpOwkJLyogU2F2ZSB0aGUgZGVwZW5kZW50IGNsYXVzZSwgICovCisgICAgY21yZXMoKTsJCQkJLyogYW5kIGNsZWFyIHRoZSBjb21tYW5kIGJ1ZmZlci4gKi8KKyAgICBkZWJ1ZyhGMTEwLCAicHVzaGNtZCBzYXZidWYiLCBzYXZidWYsIDApOworfQorCitWT0lECitwdXNocWNtZChzKSBjaGFyICogczsgewkJCS8qIEZvciB1c2Ugd2l0aCBFTFNFIGNvbW1hbmQuICovCisgICAgY2hhciBjLCAqIHAgPSBzYXZidWY7CQkvKiBEZXN0ICovCisgICAgaWYgKCFzKSBzID0gbnA7CQkJLyogU291cmNlICovCisgICAgd2hpbGUgKCpzKSB7CQkJLyogR2V0IGZpcnN0IG5vbndoaXRlc3BhY2UgY2hhciAqLworCWlmICgqcyAhPSBTUCkKKwkgIGJyZWFrOworCWVsc2UKKwkgIHMrKzsKKyAgICB9CisgICAgaWYgKCpzICE9ICd7JykgewkJCS8qIElmIGl0J3Mgbm90ICJ7IiAqLworCXB1c2hjbWQocyk7CQkJLyogZG8gcmVndWxhciBwdXNoY21kICovCisJcmV0dXJuOworICAgIH0KKyAgICB3aGlsZSAoKGMgPSAqcysrKSkgewkJLyogT3RoZXJ3aXNlIGluc2VydCBxdW90ZXMgKi8KKwlpZiAoYyA9PSBDTURRKQorCSAgKnArKyA9IENNRFE7CisJKnArKyA9IGM7CisgICAgfQorICAgIGNtcmVzKCk7CQkJCS8qIGFuZCBjbGVhciB0aGUgY29tbWFuZCBidWZmZXIuICovCisgICAgZGVidWcoRjExMCwgInB1c2hxY21kIHNhdmJ1ZiIsIHNhdmJ1ZiwgMCk7Cit9CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIENPTU1FTlQKKy8qIG5vIGxvbmdlciB1c2VkLi4uICovCitWT0lECitwb3BjbWQoKSB7CisgICAgY2tzdHJuY3B5KGNtZGJ1ZixzYXZidWYsQ01EQkwpOwkvKiBQdXQgYmFjayB0aGUgc2F2ZWQgbWF0ZXJpYWwgKi8KKyAgICAqc2F2YnVmID0gJ1wwJzsJCQkvKiBhbmQgY2xlYXIgdGhlIHNhdmUgYnVmZmVyICovCisgICAgY21yZXMoKTsKK30KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qICBDIE0gUiBFIFMgIC0tICBSZXNldCBwb2ludGVycyB0byBiZWdpbm5pbmcgb2YgY29tbWFuZCBidWZmZXIuICAqLworCitWT0lECitjbXJlcygpIHsKKyAgICBpbndvcmQgPSAwOwkJCQkvKiBXZSdyZSBub3QgaW4gYSB3b3JkICovCisgICAgY2MgPSAwOwkJCQkvKiBDaGFyYWN0ZXIgY291bnQgaXMgemVybyAqLworCisvKiBJbml0aWFsaXplIHBvaW50ZXJzICovCisKKyAgICBwcCA9IGNtZGJ1ZjsJCQkvKiBCZWdpbm5pbmcgb2YgY3VycmVudCBmaWVsZCAqLworICAgIGJwID0gY21kYnVmOwkJCS8qIEN1cnJlbnQgcG9zaXRpb24gd2l0aGluIGJ1ZmZlciAqLworICAgIG5wID0gY21kYnVmOwkJCS8qIFdoZXJlIHRvIHN0YXJ0IG5leHQgZmllbGQgKi8KKworICAgIGNtZmxkZmxncyA9IDA7CisgICAgY21mbGdzID0gLTU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFyc2Ugbm90IHlldCBzdGFydGVkLiAqLworICAgIHVuZ3cgPSAwOwkJCQkvKiBEb24ndCBuZWVkIHRvIHVuZ2V0IGEgd29yZC4gKi8KK30KKworLyogIEMgTSBJIE4gSSAgLS0gIENsZWFyIHRoZSBjb21tYW5kIGFuZCBhdG9tIGJ1ZmZlcnMsIHJlc2V0IHBvaW50ZXJzLiAgKi8KKworLyoKK1RoZSBhcmd1bWVudCBzcGVjaWZpZXMgd2hvIGlzIHRvIGVjaG8gdGhlIHVzZXIncyB0eXBlaW4gLS0KKyAgMSBtZWFucyB0aGUgY21kIHBhY2thZ2UgZWNob2VzCisgIDAgc29tZWJvZHkgZWxzZSAoc3lzdGVtLCBmcm9udCBlbmQsIHRlcm1pbmFsKSBlY2hvZXMKKyovCitWT0lECitjbWluaShkKSBpbnQgZDsgeworI2lmZGVmIERDTURCVUYKKyAgICBpZiAoIWF0bWJ1ZikKKyAgICAgIGlmIChjbXNldHVwKCk8MCkKKwlmYXRhbCgiZmF0YWwgZXJyb3I6IHVuYWJsZSB0byBhbGxvY2F0ZSBjb21tYW5kIGJ1ZmZlcnMiKTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisjaWZkZWYgVVNFX01FTUNQWQorICAgIG1lbXNldChjbWRidWYsMCxDTURCTCk7CisgICAgbWVtc2V0KGF0bWJ1ZiwwLEFUTUJMKTsKKyNlbHNlCisgICAgZm9yIChicCA9IGNtZGJ1ZjsgYnAgPCBjbWRidWYrQ01EQkw7IGJwKyspICpicCA9IE5VTDsKKyAgICBmb3IgKGJwID0gYXRtYnVmOyBicCA8IGF0bWJ1ZitBVE1CTDsgYnArKykgKmJwID0gTlVMOworI2VuZGlmIC8qIFVTRV9NRU1DUFkgKi8KKworICAgICphdG1idWYgPSAqc2F2YnVmID0gKmF0eGJ1ZiA9ICphdHlidWYgPSAqZmlsYnVmID0gTlVMOworICAgIGJsb2NrbHZsID0gMDsJCQkvKiBCbG9jayBsZXZlbCBpcyAwICovCisgICAgbGluZWJlZ2luID0gMTsJCQkvKiBBdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSAqLworICAgIGRweCA9IGQ7CQkJCS8qIEdsb2JhbCBjb3B5IG9mIHRoZSBlY2hvIGZsYWcgKi8KKyAgICBkZWJ1ZyhGMTAxLCJjbWluaSBkcHgiLCIiLGRweCk7CisgICAgY3JmbGFnID0gMDsJCQkJLyogUmVzZXQgZmxhZ3MgKi8KKyAgICBxbWZsYWcgPSAwOworICAgIGVzZmxhZyA9IDA7CisjaWZkZWYgQ0tfUkVDQUxMCisgICAgbm9fcmVjYWxsID0gMDsJCQkvKiBTdGFydCBvdXQgd2l0aCByZWNhbGwgZW5hYmxlZCAqLworI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworICAgIGNtcmVzKCk7CQkJCS8qIFNldHMgYnAgZXRjICovCisgICAgbmV3Y21kID0gMTsJCQkJLyogU2VlIGFkZGNtZCgpICovCit9CisKKyNpZm5kZWYgTk9TUEwKKy8qCisgIFRoZSBmb2xsb3dpbmcgYml0cyBhcmUgdG8gYWxsb3cgdGhlIGNvbW1hbmQgcGFja2FnZSB0byBjYWxsIGl0c2VsZgorICBpbiB0aGUgbWlkZGxlIG9mIGEgcGFyc2UuICBUbyBkbyB0aGlzLCBiZWdpbiBieSBjYWxsaW5nIGNtcHVzaCwgYW5kCisgIGVuZCBieSBjYWxsaW5nIGNtcG9wLiAgQXMgeW91IGNhbiBzZWUsIHRoaXMgaXMgcmF0aGVyIGV4cGVuc2l2ZS4KKyovCisjaWZkZWYgRENNREJVRgorc3RydWN0IGNtcCB7CisgICAgaW50IGlbNV07CQkJCS8qIHN0YWNrIGZvciBpbnRlZ2VycyAqLworICAgIGNoYXIgKmNbM107CQkJCS8qIHN0YWNrIGZvciBwb2ludGVycyAqLworICAgIGNoYXIgKmJbOF07CQkJCS8qIHN0YWNrIGZvciBidWZmZXIgY29udGVudHMgKi8KK307CitzdHJ1Y3QgY21wICpjbXAgPSAwOworI2Vsc2UKK2ludCBjbXBfaVtDTURERVArMV1bNV07CQkJLyogU3RhY2sgZm9yIGludGVnZXJzICovCitjaGFyICpjbXBfY1tDTURERVArMV1bNV07CQkvKiBmb3IgbWlzYyBwb2ludGVycyAqLworY2hhciAqY21wX2JbQ01EREVQKzFdWzddOwkJLyogZm9yIGJ1ZmZlciBjb250ZW50cyBwb2ludGVycyAqLworI2VuZGlmIC8qIERDTURCVUYgKi8KKworaW50IGNtZGRlcCA9IC0xOwkJCS8qIEN1cnJlbnQgc3RhY2sgZGVwdGggKi8KKworaW50CitjbXB1c2goKSB7CQkJCS8qIFNhdmUgdGhlIGNvbW1hbmQgZW52aXJvbm1lbnQgKi8KKyAgICBjaGFyICpjcDsJCQkJLyogQ2hhcmFjdGVyIHBvaW50ZXIgKi8KKworICAgIGlmIChjbWRkZXAgPj0gQ01EREVQKQkJLyogRW50ZXIgYSBuZXcgY29tbWFuZCBkZXB0aCAqLworICAgICAgcmV0dXJuKC0xKTsKKyAgICBjbWRkZXArKzsKKyAgICBkZWJ1ZyhGMTAxLCImY21wdXNoIHRvIGRlcHRoIiwiIixjbWRkZXApOworCisjaWZkZWYgRENNREJVRgorICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgY21wIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KKyAgICBpZiAoIWNtcCAmJiAhKGNtcCA9IChzdHJ1Y3QgY21wICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGNtcCkqKENNRERFUCsxKSkpKQorICAgICAgZmF0YWwoImNtcHVzaDogbm8gbWVtb3J5IGZvciBjbXAiKTsKKyAgICBjbXBbY21kZGVwXS5pWzBdID0gY21mbGdzOwkJLyogRmlyc3QgZG8gdGhlIGdsb2JhbCBpbnRzICovCisgICAgY21wW2NtZGRlcF0uaVsxXSA9IGNtZnNhdjsKKyAgICBjbXBbY21kZGVwXS5pWzJdID0gYXR4bjsKKyAgICBjbXBbY21kZGVwXS5pWzNdID0gdW5ndzsKKworICAgIGNtcFtjbWRkZXBdLmNbMF0gPSBicDsJCS8qIFRoZW4gdGhlIGdsb2JhbCBwb2ludGVycyAqLworICAgIGNtcFtjbWRkZXBdLmNbMV0gPSBwcDsKKyAgICBjbXBbY21kZGVwXS5jWzJdID0gbnA7CisjZWxzZQorICAgIGNtcF9pW2NtZGRlcF1bMF0gPSBjbWZsZ3M7CQkvKiBGaXJzdCBkbyB0aGUgZ2xvYmFsIGludHMgKi8KKyAgICBjbXBfaVtjbWRkZXBdWzFdID0gY21mc2F2OworICAgIGNtcF9pW2NtZGRlcF1bMl0gPSBhdHhuOworICAgIGNtcF9pW2NtZGRlcF1bM10gPSB1bmd3OworCisgICAgY21wX2NbY21kZGVwXVswXSA9IGJwOwkJLyogVGhlbiB0aGUgZ2xvYmFsIHBvaW50ZXJzICovCisgICAgY21wX2NbY21kZGVwXVsxXSA9IHBwOworICAgIGNtcF9jW2NtZGRlcF1bMl0gPSBucDsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisKKyAgICAvKiBOb3cgdGhlIGJ1ZmZlcnMgdGhlbXNlbHZlcy4gIEEgbG90IG9mIHJlcGl0aXRpb3VzIGNvZGUuLi4gKi8KKworI2lmZGVmIERDTURCVUYKKyAgICBjcCA9IG1hbGxvYygoaW50KXN0cmxlbihjbWRidWYpKzEpOwkvKiAwOiBDb21tYW5kIGJ1ZmZlciAqLworICAgIGlmIChjcCkgc3RyY3B5KGNwLGNtZGJ1Zik7CisgICAgY21wW2NtZGRlcF0uYlswXSA9IGNwOworICAgIGlmIChjcCA9PSBOVUxMKSByZXR1cm4oLTEpOworCisgICAgY3AgPSBtYWxsb2MoKGludClzdHJsZW4oc2F2YnVmKSsxKTsJLyogMTogU2F2ZSBidWZmZXIgKi8KKyAgICBpZiAoY3ApIHN0cmNweShjcCxzYXZidWYpOworICAgIGNtcFtjbWRkZXBdLmJbMV0gPSBjcDsKKyAgICBpZiAoY3AgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKworICAgIGNtcFtjbWRkZXBdLmJbMl0gPSBOVUxMOworCisgICAgY3AgPSBtYWxsb2MoKGludClzdHJsZW4oYXRtYnVmKSsxKTsJLyogMzogQXRvbSBidWZmZXIgKi8KKyAgICBpZiAoY3ApIHN0cmNweShjcCxhdG1idWYpOworICAgIGNtcFtjbWRkZXBdLmJbM10gPSBjcDsKKyAgICBpZiAoY3AgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKworICAgIGNwID0gbWFsbG9jKChpbnQpc3RybGVuKGF0eGJ1ZikrMSk7CS8qIDQ6IEV4cGFuc2lvbiBidWZmZXIgKi8KKyAgICBpZiAoY3ApIHN0cmNweShjcCxhdHhidWYpOworICAgIGNtcFtjbWRkZXBdLmJbNF0gPSBjcDsKKyAgICBpZiAoY3AgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKworICAgIGNwID0gbWFsbG9jKChpbnQpc3RybGVuKGF0eWJ1ZikrMSk7CS8qIDU6IEF0b20gYnVmZmVyIGNvcHkgKi8KKyAgICBpZiAoY3ApIHN0cmNweShjcCxhdHlidWYpOworICAgIGNtcFtjbWRkZXBdLmJbNV0gPSBjcDsKKyAgICBpZiAoY3AgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKworICAgIGNwID0gbWFsbG9jKChpbnQpc3RybGVuKGZpbGJ1ZikrMSk7CS8qIDY6IEZpbGUgbmFtZSBidWZmZXIgKi8KKyAgICBpZiAoY3ApIHN0cmNweShjcCxmaWxidWYpOworICAgIGNtcFtjbWRkZXBdLmJbNl0gPSBjcDsKKyAgICBpZiAoY3AgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKyNlbHNlCisgICAgY3AgPSBtYWxsb2MoKGludClzdHJsZW4oY21kYnVmKSsxKTsJLyogMDogQ29tbWFuZCBidWZmZXIgKi8KKyAgICBpZiAoY3ApIHN0cmNweShjcCxjbWRidWYpOworICAgIGNtcF9iW2NtZGRlcF1bMF0gPSBjcDsKKyAgICBpZiAoY3AgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKworICAgIGNwID0gbWFsbG9jKChpbnQpc3RybGVuKHNhdmJ1ZikrMSk7CS8qIDE6IFNhdmUgYnVmZmVyICovCisgICAgaWYgKGNwKSBzdHJjcHkoY3Asc2F2YnVmKTsKKyAgICBjbXBfYltjbWRkZXBdWzFdID0gY3A7CisgICAgaWYgKGNwID09IE5VTEwpIHJldHVybigtMSk7CisKKyAgICBjbXBfYltjbWRkZXBdWzJdID0gTlVMTDsKKworICAgIGNwID0gbWFsbG9jKChpbnQpc3RybGVuKGF0bWJ1ZikrMSk7CS8qIDM6IEF0b20gYnVmZmVyICovCisgICAgaWYgKGNwKSBzdHJjcHkoY3AsYXRtYnVmKTsKKyAgICBjbXBfYltjbWRkZXBdWzNdID0gY3A7CisgICAgaWYgKGNwID09IE5VTEwpIHJldHVybigtMSk7CisKKyAgICBjcCA9IG1hbGxvYygoaW50KXN0cmxlbihhdHhidWYpKzEpOwkvKiA0OiBFeHBhbnNpb24gYnVmZmVyICovCisgICAgaWYgKGNwKSBzdHJjcHkoY3AsYXR4YnVmKTsKKyAgICBjbXBfYltjbWRkZXBdWzRdID0gY3A7CisgICAgaWYgKGNwID09IE5VTEwpIHJldHVybigtMSk7CisKKyAgICBjcCA9IG1hbGxvYygoaW50KXN0cmxlbihhdHlidWYpKzEpOwkvKiA1OiBBdG9tIGJ1ZmZlciBjb3B5ICovCisgICAgaWYgKGNwKSBzdHJjcHkoY3AsYXR5YnVmKTsKKyAgICBjbXBfYltjbWRkZXBdWzVdID0gY3A7CisgICAgaWYgKGNwID09IE5VTEwpIHJldHVybigtMSk7CisKKyAgICBjcCA9IG1hbGxvYygoaW50KXN0cmxlbihmaWxidWYpKzEpOwkvKiA2OiBGaWxlIG5hbWUgYnVmZmVyICovCisgICAgaWYgKGNwKSBzdHJjcHkoY3AsZmlsYnVmKTsKKyAgICBjbXBfYltjbWRkZXBdWzZdID0gY3A7CisgICAgaWYgKGNwID09IE5VTEwpIHJldHVybigtMSk7CisjZW5kaWYgLyogRENNREJVRiAqLworCisgICAgY21pbmkoZHB4KTsJCQkJLyogSW5pdGl6ZSB0aGUgY29tbWFuZCBwYXJzZXIgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorY21wb3AoKSB7CQkJCS8qIFJlc3RvcmUgdGhlIGNvbW1hbmQgZW52aXJvbm1lbnQgKi8KKyAgICBpZiAoY21kZGVwIDwgMCkgeworCWRlYnVnKEYxMDAsIiZjbXBvcCBjYWxsZWQgZnJvbSB0b3AgbGV2ZWwiLCIiLDApOworCXJldHVybigtMSk7CQkJLyogRG9uJ3QgcG9wIHRvbyBtdWNoISAqLworICAgIH0KKyNpZmRlZiBEQ01EQlVGCisgICAgY21mbGdzID0gY21wW2NtZGRlcF0uaVswXTsJCS8qIEZpcnN0IGRvIHRoZSBnbG9iYWwgaW50cyAqLworICAgIGNtZnNhdiA9IGNtcFtjbWRkZXBdLmlbMV07CisgICAgYXR4biA9IGNtcFtjbWRkZXBdLmlbMl07CisgICAgdW5ndyA9IGNtcFtjbWRkZXBdLmlbM107CisKKyAgICBicCA9IGNtcFtjbWRkZXBdLmNbMF07CQkvKiBUaGVuIHRoZSBnbG9iYWwgcG9pbnRlcnMgKi8KKyAgICBwcCA9IGNtcFtjbWRkZXBdLmNbMV07CisgICAgbnAgPSBjbXBbY21kZGVwXS5jWzJdOworI2Vsc2UKKyAgICBjbWZsZ3MgPSBjbXBfaVtjbWRkZXBdWzBdOwkJLyogRmlyc3QgZG8gdGhlIGdsb2JhbCBpbnRzICovCisgICAgY21mc2F2ID0gY21wX2lbY21kZGVwXVsxXTsKKyAgICBhdHhuID0gY21wX2lbY21kZGVwXVsyXTsKKyAgICB1bmd3ID0gY21wX2lbY21kZGVwXVszXTsKKworICAgIGJwID0gY21wX2NbY21kZGVwXVswXTsJCS8qIFRoZW4gdGhlIGdsb2JhbCBwb2ludGVycyAqLworICAgIHBwID0gY21wX2NbY21kZGVwXVsxXTsKKyAgICBucCA9IGNtcF9jW2NtZGRlcF1bMl07CisjZW5kaWYgLyogRENNREJVRiAqLworCisgICAgLyogTm93IHRoZSBidWZmZXJzIHRoZW1zZWx2ZXMuICovCisgICAgLyogTm90ZTogc3RybmNweSgpLCBub3QgY2tzdHJuY3B5KCkgLS0gSGVyZSB3ZSBXQU5UIHRoZSBOVUwgcGFkZGluZy4uLiAqLworCisjaWZkZWYgRENNREJVRgorICAgIGlmIChjbXBbY21kZGVwXS5iWzBdKSB7CisKKwlzdHJuY3B5KGNtZGJ1ZixjbXBbY21kZGVwXS5iWzBdLENNREJMKTsgLyogMDogQ29tbWFuZCBidWZmZXIgKi8KKwlmcmVlKGNtcFtjbWRkZXBdLmJbMF0pOworCWNtcFtjbWRkZXBdLmJbMF0gPSBOVUxMOworICAgIH0KKyAgICBpZiAoY21wW2NtZGRlcF0uYlsxXSkgeworCXN0cm5jcHkoc2F2YnVmLGNtcFtjbWRkZXBdLmJbMV0sQ01EQkwpOyAvKiAxOiBTYXZlIGJ1ZmZlciAqLworCWZyZWUoY21wW2NtZGRlcF0uYlsxXSk7CisJY21wW2NtZGRlcF0uYlsxXSA9IE5VTEw7CisgICAgfQorICAgIGlmIChjbXBbY21kZGVwXS5iWzNdKSB7CisJc3RybmNweShhdG1idWYsY21wW2NtZGRlcF0uYlszXSxBVE1CTCk7IC8qIDM6IEF0b21pYyBidWZmZXIhICovCisJZnJlZShjbXBbY21kZGVwXS5iWzNdKTsKKwljbXBbY21kZGVwXS5iWzNdID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGNtcFtjbWRkZXBdLmJbNF0pIHsKKwlzdHJuY3B5KGF0eGJ1ZixjbXBbY21kZGVwXS5iWzRdLEFUTUJMKTsgLyogNDogZVhwYW5zaW9uIGJ1ZmZlciAqLworCWZyZWUoY21wW2NtZGRlcF0uYls0XSk7CisJY21wW2NtZGRlcF0uYls0XSA9IE5VTEw7CisgICAgfQorICAgIGlmIChjbXBbY21kZGVwXS5iWzVdKSB7CisJc3RybmNweShhdHlidWYsY21wW2NtZGRlcF0uYls1XSxBVE1CTCk7IC8qIDU6IEF0b20gYnVmZmVyIGNvcFkgKi8KKwlmcmVlKGNtcFtjbWRkZXBdLmJbNV0pOworCWNtcFtjbWRkZXBdLmJbNV0gPSBOVUxMOworICAgIH0KKyAgICBpZiAoY21wW2NtZGRlcF0uYls2XSkgeworCXN0cm5jcHkoZmlsYnVmLGNtcFtjbWRkZXBdLmJbNl0sQVRNQkwpOyAvKiA2OiBGaWxlbmFtZSBidWZmZXIgKi8KKwlmcmVlKGNtcFtjbWRkZXBdLmJbNl0pOworCWNtcFtjbWRkZXBdLmJbNl0gPSBOVUxMOworICAgIH0KKyNlbHNlCisgICAgaWYgKGNtcF9iW2NtZGRlcF1bMF0pIHsKKwlzdHJuY3B5KGNtZGJ1ZixjbXBfYltjbWRkZXBdWzBdLENNREJMKTsgLyogMDogQ29tbWFuZCBidWZmZXIgKi8KKwlmcmVlKGNtcF9iW2NtZGRlcF1bMF0pOworCWNtcF9iW2NtZGRlcF1bMF0gPSBOVUxMOworICAgIH0KKyAgICBpZiAoY21wX2JbY21kZGVwXVsxXSkgeworCXN0cm5jcHkoc2F2YnVmLGNtcF9iW2NtZGRlcF1bMV0sQ01EQkwpOyAvKiAxOiBTYXZlIGJ1ZmZlciAqLworCWZyZWUoY21wX2JbY21kZGVwXVsxXSk7CisJY21wX2JbY21kZGVwXVsxXSA9IE5VTEw7CisgICAgfQorICAgIGlmIChjbXBfYltjbWRkZXBdWzNdKSB7CisJc3RybmNweShhdG1idWYsY21wX2JbY21kZGVwXVszXSxBVE1CTCk7IC8qIDM6IEF0b21pYyBidWZmZXIhICovCisJZnJlZShjbXBfYltjbWRkZXBdWzNdKTsKKwljbXBfYltjbWRkZXBdWzNdID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGNtcF9iW2NtZGRlcF1bNF0pIHsKKwlzdHJuY3B5KGF0eGJ1ZixjbXBfYltjbWRkZXBdWzRdLEFUTUJMKTsgLyogNDogZVhwYW5zaW9uIGJ1ZmZlciAqLworCWZyZWUoY21wX2JbY21kZGVwXVs0XSk7CisJY21wX2JbY21kZGVwXVs0XSA9IE5VTEw7CisgICAgfQorICAgIGlmIChjbXBfYltjbWRkZXBdWzVdKSB7CisJc3RybmNweShhdHlidWYsY21wX2JbY21kZGVwXVs1XSxBVE1CTCk7IC8qIDU6IEF0b20gYnVmZmVyIGNvcFkgKi8KKwlmcmVlKGNtcF9iW2NtZGRlcF1bNV0pOworCWNtcF9iW2NtZGRlcF1bNV0gPSBOVUxMOworICAgIH0KKyAgICBpZiAoY21wX2JbY21kZGVwXVs2XSkgeworCXN0cm5jcHkoZmlsYnVmLGNtcF9iW2NtZGRlcF1bNl0sQVRNQkwpOyAvKiA2OiBGaWxlbmFtZSBidWZmZXIgKi8KKwlmcmVlKGNtcF9iW2NtZGRlcF1bNl0pOworCWNtcF9iW2NtZGRlcF1bNl0gPSBOVUxMOworICAgIH0KKyNlbmRpZiAvKiBEQ01EQlVGICovCisKKyAgICBjbWRkZXAtLTsJCQkJLyogUmlzZSwgcmlzZSAqLworICAgIGRlYnVnKEYxMDEsIiZjbXBvcCB0byBkZXB0aCIsIiIsY21kZGVwKTsKKyAgICByZXR1cm4oY21kZGVwKTsKK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZkZWYgQ09NTUVOVAorVk9JRAkJCQkJLyogTm90IHVzZWQgKi8KK3N0cmlwcShzKSBjaGFyICpzOyB7ICAgICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiB0byBzdHJpcCAnXCcgcXVvdGVzICovCisgICAgY2hhciAqdDsKKyAgICB3aGlsZSAoKnMpIHsKKyAgICAgICAgaWYgKCpzID09IENNRFEpIHsKKyAgICAgICAgICAgIGZvciAodCA9IHM7ICp0ICE9ICdcMCc7IHQrKykgKnQgPSAqKHQrMSk7CisgICAgICAgIH0KKyAgICAgICAgcysrOworICAgIH0KK30KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qIENvbnZlcnQgdGFicyB0byBzcGFjZXMsIG9uZSBmb3Igb25lICovCitWT0lECit1bnRhYihzKSBjaGFyICpzOyB7CisgICAgd2hpbGUgKCpzKSB7CisJaWYgKCpzID09IEhUKSAqcyA9IFNQOworCXMrKzsKKyAgICB9Cit9CisKKy8qICBDIE0gTiBVIE0gIC0tICBQYXJzZSBhIG51bWJlciBpbiB0aGUgaW5kaWNhdGVkIHJhZGl4ICAqLworCisvKgorIFRoZSByYWRpeCBpcyBzcGVjaWZpZWQgaW4gdGhlIGFyZyBsaXN0LgorIFBhcnNlcyB1bnF1b3RlZCBudW1lcmljIHN0cmluZ3MgaW4gdGhlIGdpdmVuIHJhZGl4LgorIFBhcnNlcyBiYWNrc2xhc2gtcXVvdGVkIG51bWJlcnMgaW4gdGhlIHJhZGl4IGluZGljYXRlZCBieSB0aGUgcXVvdGU6CisgICBcbm5uID0gXGRubm4gPSBkZWNpbWFsLCBcb25ubiA9IG9jdGFsLCBceG5uID0gSGV4YWRlY2ltYWwuCisgSWYgdGhlc2UgZmFpbCwgdGhlbiBpZiBhIHByZXByb2Nlc3NpbmcgZnVuY3Rpb24gaXMgc3VwcGxpZWQsIHRoYXQgaXMgYXBwbGllZAorIGFuZCB0aGVuIGEgc2Vjb25kIGF0dGVtcHQgaXMgbWFkZSB0byBwYXJzZSBhbiB1bnF1b3RlZCBkZWNpbWFsIHN0cmluZy4KKyBBbmQgaWYgdGhhdCBmYWlscywgdGhlIHByZXByb2Nlc3NlZCBzdHJpbmcgaXMgcGFzc2VkIHRvIGFuIGFyaXRobWV0aWMKKyBleHByZXNzaW9uIGV2YWx1YXRvci4KKworIFJldHVybnM6CisgICAtMyBpZiBubyBpbnB1dCBwcmVzZW50IHdoZW4gcmVxdWlyZWQsCisgICAtMiBpZiB1c2VyIHR5cGVkIGFuIGlsbGVnYWwgbnVtYmVyLAorICAgLTEgaWYgcmVwYXJzZSBuZWVkZWQsCisgICAgMCBvdGhlcndpc2UsIHdpdGggYXJndW1lbnQgbiBzZXQgdG8gdGhlIG51bWJlciB0aGF0IHdhcyBwYXJzZWQKKyovCitpbnQKK2NtbnVtKHhobHAseGRlZixyYWRpeCxuLGYpIGNoYXIgKnhobHAsICp4ZGVmOyBpbnQgcmFkaXgsICpuOyB4eF9zdHJwIGY7IHsKKyAgICBpbnQgeDsgY2hhciAqcywgKnpwLCAqenE7CisjaWZkZWYgQ09NTUVOVAorICAgIGNoYXIgbGJyYWNlLCByYnJhY2U7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgaWYgKCF4aGxwKSB4aGxwID0gIiI7CisgICAgaWYgKCF4ZGVmKSB4ZGVmID0gIiI7CisKKyNpZmRlZiBDT01NRU5UCisgICAgaWYgKGNtZmxkZmxncyAmIDEpIHsKKwlsYnJhY2UgPSAnKCc7CisJcmJyYWNlID0gJyknOworICAgIH0gZWxzZSB7CisJbGJyYWNlID0gJ3snOworCXJicmFjZSA9ICd9JzsKKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgaWYgKHJhZGl4ICE9IDEwICYmIHJhZGl4ICE9IDgpIHsJLyogSnVzdCBkbyBiYXNlcyA4IGFuZCAxMCAqLworICAgICAgICBwcmludGYoImNtbnVtOiBpbGxlZ2FsIHJhZGl4IC0gJWRcbiIscmFkaXgpOworICAgICAgICByZXR1cm4oLTIpOworICAgIH0gLyogRWFzeSB0byBhZGQgb3RoZXJzIGJ1dCB0aGVyZSBoYXMgbmV2ZXIgYmVlbiBhIG5lZWQgZm9yIGl0LiAqLworICAgIHggPSBjbWZsZCh4aGxwLHhkZWYsJnMsKHh4X3N0cnApMCk7CisgICAgZGVidWcoRjEwMSwiY21udW06IGNtZmxkIiwiIix4KTsKKyAgICBpZiAoeCA8IDApIHJldHVybih4KTsJCS8qIFBhcnNlIGEgZmllbGQgKi8KKyAgICB6cCA9IGF0bWJ1ZjsKKy8qCisgIEVkaXQgMTkyIC0gQWxsb3cgYW55IG51bWJlciBmaWVsZCB0byBiZSBicmFjZWQuICBUaGlzIGxldHMgdXMgaW5jbHVkZQorICBzcGFjZXMgaW4gZXhwcmVzc2lvbnMsIGJ1dCBwZXJoYXBzIG1vcmUgaW1wb3J0YW50IGxldHMgdXMgaGF2ZSB1c2VyLWRlZmluZWQKKyAgZnVuY3Rpb25zIGluIG51bWVyaWMgZmllbGRzLgorKi8KKyAgICB6cCA9IGJyc3RyaXAoenApOwkJCS8qIFN0cmlwIGJyYWNlcyAqLworICAgIGlmIChjbWZsZGZsZ3MgJiAxICYmICp6cCA9PSAnKCcpIHsJLyogUGFyZW5zIHRvby4uICovCisJeCA9IChpbnQpIHN0cmxlbihhdG1idWYpOworCWlmICh4ID4gMCkgeworCSAgICBpZiAoKihhdG1idWYreC0xKSA9PSAnKScpIHsKKwkJKihhdG1idWYreC0xKSA9IE5VTDsKKwkJenArKzsKKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKGNoa251bSh6cCkpIHsJCQkvKiBDaGVjayBmb3IgbnVtYmVyICovCisJaWYgKHJhZGl4ID09IDgpIHsJCS8qIElmIGl0J3Mgc3VwcG9zZWQgdG8gYmUgb2N0YWwgKi8KKwkgICAgenAgPSBja3JhZGl4KHpwLDgsMTApOwkvKiBjb252ZXJ0IHRvIGRlY2ltYWwgKi8KKwkgICAgaWYgKCF6cCkgcmV0dXJuKC0yKTsKKwkgICAgaWYgKCFzdHJjbXAoenAsIi0xIikpIHJldHVybigtMik7CisJfQorCWVycm5vID0gMDsJCQkvKiBHb3Qgb25lLCB3ZSdyZSBkb25lLiAqLworICAgICAgICAqbiA9IGF0b2koenApOworCWlmIChlcnJubykgeworCSAgICBwZXJyb3IoenApOworCSAgICByZXR1cm4oLTkpOworCX0KKwlkZWJ1ZyhGMTAxLCJjbW51bSAxc3QgY2hrbnVtIG9rIiwiIiwqbik7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9IGVsc2UgaWYgKCh4ID0geHhlc2MoJnpwKSkgPiAtMSkgewkvKiBDaGVjayBmb3IgYmFja3NsYXNoIGVzY2FwZSAqLworCisjaWZuZGVmIE9TMgorCSpuID0geDsKKyNlbHNlCisJKm4gPSB3aWRlcmVzdWx0OworI2VuZGlmIC8qIE9TMiAqLworCisJZGVidWcoRjEwMSwiY21udW0geHhlc2Mgb2siLCIiLCpuKTsKKwlyZXR1cm4oKnpwID8gLTIgOiAwKTsKKyAgICB9IGVsc2UgaWYgKGYpIHsJCQkvKiBJZiBjb252ZXJzaW9uIGZ1bmN0aW9uIGdpdmVuICovCisJenEgPSBhdHhidWY7CQkJLyogVHJ5IHRoYXQgKi8KKwlhdHhuID0gQ01EQkw7CisJaWYgKCgqZikoenAsJnpxLCZhdHhuKSA8IDApCS8qIENvbnZlcnQgKi8KKwkgIHJldHVybigtMik7CisJenAgPSBhdHhidWY7CisgICAgfQorICAgIGRlYnVnKEYxMTAsImNtbnVtIHpwIDEiLHpwLDApOworICAgIGlmICghKnpwKSB6cCA9IHhkZWY7CQkvKiBSZXN1bHQgZW1wdHksIHN1YnN0aXR1dGUgZGVmYXVsdCAqLworICAgIGRlYnVnKEYxMTAsImNtbnVtIHpwIDIiLHpwLDApOworICAgIGlmIChjaGtudW0oenApKSB7CQkJLyogQ2hlY2sgYWdhaW4gZm9yIGRlY2ltYWwgbnVtYmVyICovCisJaWYgKHJhZGl4ID09IDgpIHsJCS8qIElmIGl0J3Mgc3VwcG9zZWQgdG8gYmUgb2N0YWwgKi8KKwkgICAgenAgPSBja3JhZGl4KHpwLDgsMTApOwkvKiBjb252ZXJ0IHRvIGRlY2ltYWwgKi8KKwkgICAgaWYgKCF6cCkgcmV0dXJuKC0yKTsKKwkgICAgaWYgKCFzdHJjbXAoenAsIi0xIikpIHJldHVybigtMik7CisJfQorCWVycm5vID0gMDsKKyAgICAgICAgKm4gPSBhdG9pKHpwKTsKKwlpZiAoZXJybm8pIHsKKwkgICAgcGVycm9yKHpwKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisJZGVidWcoRjEwMSwiY21udW0gMm5kIGNoa251bSBvayIsIiIsKm4pOworICAgICAgICByZXR1cm4oMCk7CisjaWZuZGVmIE5PU1BMCisgICAgfSAgZWxzZSBpZiAoKHggPSB4eGVzYygmenApKSA+IC0xKSB7IC8qIENoZWNrIGZvciBiYWNrc2xhc2ggZXNjYXBlICovCisjaWZuZGVmIE9TMgorCSpuID0geDsKKyNlbHNlCisJKm4gPSB3aWRlcmVzdWx0OworI2VuZGlmIC8qIE9TMiAqLworCWRlYnVnKEYxMDEsImNtbnVtIHh4ZXNjIDIgb2siLCIiLCpuKTsKKwlyZXR1cm4oKnpwID8gLTIgOiAwKTsKKyAgICB9IGVsc2UgaWYgKGYpIHsJCQkvKiBOb3QgbnVtZXJpYywgbWF5YmUgYW4gZXhwcmVzc2lvbiAqLworCWNoYXIgKiBwOworCXAgPSBldmFsYSh6cCk7CisJaWYgKGNoa251bShwKSkgeworCSAgICBpZiAocmFkaXggPT0gOCkgewkJLyogSWYgaXQncyBzdXBwb3NlZCB0byBiZSBvY3RhbCAqLworCQl6cCA9IGNrcmFkaXgoenAsOCwxMCk7CS8qIGNvbnZlcnQgdG8gZGVjaW1hbCAqLworCQlpZiAoIXpwKSByZXR1cm4oLTIpOworCQlpZiAoIXN0cmNtcCh6cCwiLTEiKSkgcmV0dXJuKC0yKTsKKwkgICAgfQorCSAgICBlcnJubyA9IDA7CisJICAgICpuID0gYXRvaShwKTsKKwkgICAgaWYgKGVycm5vKSB7CisJCXBlcnJvcihwKTsKKwkJcmV0dXJuKC05KTsKKwkgICAgfQorCSAgICBkZWJ1ZyhGMTAxLCJjbW51bSBleHAgZXZhbCBvayIsIiIsKm4pOworCSAgICByZXR1cm4oMCk7CisJfSBlbHNlIHJldHVybigtMik7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICB9IGVsc2UgewkJCQkvKiBOb3QgbnVtZXJpYyAqLworCXJldHVybigtMik7CisgICAgfQorfQorCisjaWZkZWYgQ0tDSEFOTkVMSU8KK2V4dGVybiBpbnQgel9lcnJvcjsKKyNlbmRpZiAvKiBDS0NIQU5ORUxJTyAqLworCisvKiAgQyBNIE8gRiBJICAtLSAgUGFyc2UgdGhlIG5hbWUgb2YgYW4gb3V0cHV0IGZpbGUgICovCisKKy8qCisgRGVwZW5kcyBvbiB0aGUgZXh0ZXJuYWwgZnVuY3Rpb24gemNoa28oKTsgaWYgemNoa28oKSBub3QgYXZhaWxhYmxlLCB1c2UKKyBjbWZsZCgpIHRvIHBhcnNlIG91dHB1dCBmaWxlIG5hbWVzLgorCisgUmV0dXJuczoKKyAgIC05IGxpa2UgLTIsIGV4Y2VwdCBtZXNzYWdlIGFscmVhZHkgcHJpbnRlZCwKKyAgIC0zIGlmIG5vIGlucHV0IHByZXNlbnQgd2hlbiByZXF1aXJlZCwKKyAgIC0yIGlmIHBlcm1pc3Npb24gd291bGQgYmUgZGVuaWVkIHRvIGNyZWF0ZSB0aGUgZmlsZSwKKyAgIC0xIGlmIHJlcGFyc2UgbmVlZGVkLAorICAgIDAgb3IgMSBpZiBmaWxlIGNhbiBiZSBjcmVhdGVkLCB3aXRoIHhwIHBvaW50aW5nIHRvIG5hbWUuCisgICAgMiBpZiBnaXZlbiB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBkaXJlY3RvcnkuCisqLworaW50CitjbW9maSh4aGxwLHhkZWYseHAsZikgY2hhciAqeGhscCwgKnhkZWYsICoqeHA7IHh4X3N0cnAgZjsgeworICAgIGludCB4OyBjaGFyICpzLCAqenE7CisjaWZkZWYgRE9DSEtWQVIKKyAgICBpbnQgdHJpZXM7CisjZW5kaWYgLyogRE9DSEtWQVIgKi8KKyNpZmRlZiBEVElMREUKKyAgICBjaGFyICpkaXJwOworI2VuZGlmIC8qIERUSUxERSAqLworCisgICAgY21mbGRmbGdzID0gMDsKKworICAgIGlmICgheGhscCkgeGhscCA9ICIiOworICAgIGlmICgheGRlZikgeGRlZiA9ICIiOworCisgICAgaWYgKCp4aGxwID09IE5VTCkgeGhscCA9ICJPdXRwdXQgZmlsZSI7CisgICAgKnhwID0gIiI7CisKKyAgICBkZWJ1ZyhGMTEwLCJjbW9maSB4ZGVmIix4ZGVmLDApOworICAgIHggPSBjbWZsZCh4aGxwLHhkZWYsJnMsKHh4X3N0cnApMCk7CisgICAgZGVidWcoRjExMSwiY21vZmkgY21mbGQgcmV0dXJucyIscyx4KTsKKyAgICBpZiAoeCA8IDApCisgICAgICByZXR1cm4oeCk7CisKKyAgICBzID0gYnJzdHJpcChzKTsJCQkvKiBTdHJpcCBlbmNsb3NpbmcgYnJhY2VzICovCisgICAgZGVidWcoRjExMCwiY21vZmkgMS41IixzLDApOworCisjaWZkZWYgRE9DSEtWQVIKKyAgICB0cmllcyA9IDA7CisgICAgeworCWNoYXIgKnAgPSBzOworICAgIC8qCisgICAgICBUaGlzIGlzIHJlYWxseSB1Z2x5LiAgSWYgd2Ugc2tpcCBjb252ZXJzaW9uIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gsCisgICAgICB0aGVuIHZhcmlhYmxlIG5hbWVzIGxpa2UgXCVhIHdpbGwgYmUgdXNlZCBhcyBmaWxlbmFtZXMgKGUuZy4gY3JlYXRpbmcKKyAgICAgIGEgZmlsZSBjYWxsZWQgJUEgaW4gdGhlIHJvb3QgZGlyZWN0b3J5KS4gIElmIHdlIERPTidUIHNraXAgY29udmVyc2lvbgorICAgICAgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCwgdGhlbiBzaW5nbGUgYmFja3NsYXNoZXMgdXNlZCBhcyBkaXJlY3RvcnkKKyAgICAgIHNlcGFyYXRvcnMgaW4gZmlsZW5hbWVzIHdpbGwgYmUgbWlzaW50ZXJwcmV0ZWQgYXMgdmFyaWFibGUgbGVhZC1pbnMuCisgICAgICBTbyB3ZSBwcmVzY2FuIHRvIHNlZSBpZiBpdCBoYXMgYW55IHZhcmlhYmxlIHJlZmVyZW5jZXMuICBCdXQgdGhpcworICAgICAgbW9kdWxlIGlzIG5vdCBzdXBwb3NlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHZhcmlhYmxlcywgZnVuY3Rpb25zLAorICAgICAgZXRjLCBzbyB0aGlzIGNvZGUgZG9lcyBub3QgcmVhbGx5IGJlbG9uZyBoZXJlLCBidXQgcmF0aGVyIGl0IHNob3VsZAorICAgICAgYmUgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgenpzdHJpbmcoKS4KKyAgICAqLworLyoKKyAgSG1tbSwgdGhpcyBsb29rcyBhIGxvdCBsaWtlIGNoa3ZhcigpIGV4Y2VwdCBpdCB0aGF0IGluY2x1ZGVzIFxubm4gbnVtYmVyCisgIGVzY2FwZXMuICBCdXQgd2h5PyAgVGhpcyBtYWtlcyBjb21tYW5kcyBsaWtlICJta2RpciBjOlwxMjMiIGltcG9zc2libGUuCisgIEFuZCBpbiBmYWN0LCAibWtkaXIgYzpcMTIzIiBjcmVhdGVzIGEgZGlyZWN0b3J5IGNhbGxlZCAiYzp7Ii4gIFdoYXQncyB3b3JzZSwKKyAgcm1kaXIoKSwgd2hpY2ggKmRvZXMqIGNhbGwgY2hrdmFyKCksIHdvbid0IGxldCB1cyByZW1vdmUgaXQuICBTbyBsZXQncyBhdAorICBsZWFzdCB0cnkgbWFraW5nIGNtb2ZpKCkgc3ltbWV0cmljYWwgd2l0aCBjbWlmaSgpLi4uCisqLworI2lmZGVmIENPTU1FTlQKKwljaGFyICogcTsKKwl3aGlsZSAoICh0cmllcyA9PSAwKSAmJiAocCA9IHN0cmNocihwLENNRFEpKSApIHsKKwkgICAgcSA9ICoocCsxKTsJCQkvKiBDaGFyIGFmdGVyIGJhY2tzbGFzaCAqLworCSAgICBpZiAoIXEpCQkJLyogTm9uZSwgcXVpdCAqLworCSAgICAgIGJyZWFrOworCSAgICBpZiAoaXN1cHBlcihxKSkJCS8qIElmIGxldHRlciwgY29udmVydCB0byBsb3dlcmNhc2UgKi8KKwkgICAgICBxID0gdG9sb3dlcihxKTsKKwkgICAgaWYgKGlzZGlnaXQocSkpIHsJCS8qIElmIGl0J3MgYSBkaWdpdCwgKi8KKwkJdHJpZXMgPSAxOwkJLyogYXNzdW1lIGl0J3MgYSBiYWNrc2xhc2ggY29kZSAgKi8KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgc3dpdGNoIChxKSB7CisJICAgICAgY2FzZSBDTURROgkJLyogRG91YmxlIGJhY2tzbGFzaCAqLworCQl0cmllcyA9IDE7CQkvKiBzbyBjYWxsIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9uICovCisJCWJyZWFrOworCSAgICAgIGNhc2UgJyUnOgkJCS8qIFZhcmlhYmxlIG9yIGFycmF5IHJlZmVyZW5jZSAqLworCSAgICAgIGNhc2UgJyYnOgkJCS8qIG11c3QgYmUgZm9sbG93ZWQgYnkgbGV0dGVyICovCisJCWlmIChpc2FscGhhKCoocCsyKSkgfHwgKCoocCsyKSA+PSAnMCcgJiYgKihwKzIpIDw9ICc5JykpCisJCSAgdHJpZXMgPSAxOworCQlicmVhazsKKwkgICAgICBjYXNlICdtJzogY2FzZSAndic6IGNhc2UgJyQnOiAvKiBcbSgpLCBcdigpLCBcJCgpICovCisJCWlmICgqKHArMikgPT0gJygnKQorCQkgIGlmIChzdHJjaHIocCsyLCcpJykpCisJCSAgICB0cmllcyA9IDE7CisJCWJyZWFrOworCSAgICAgIGNhc2UgJ2YnOgkJCS8qIFxGbmFtZSgpICovCisJCWlmIChzdHJjaHIocCsyLCcoJykpCisJCSAgaWYgKHN0cmNocihwKzIsJyknKSkKKwkJICAgICAgdHJpZXMgPSAxOworCQlicmVhazsKKwkgICAgICBjYXNlICd7JzoJCQkvKiBcey4uLn0gKi8KKwkJaWYgKHN0cmNocihwKzIsJ30nKSkKKwkJICB0cmllcyA9IDE7CisJCWJyZWFrOworCSAgICAgIGNhc2UgJ2QnOiBjYXNlICdvJzoJLyogRGVjaW1hbCBvciBPY3RhbCBudW1iZXIgKi8KKwkgICAgICAgIGlmIChpc2RpZ2l0KCoocCsyKSkpCisJCSAgdHJpZXMgPSAxOworCQlicmVhazsKKwkgICAgICBjYXNlICd4JzoJCQkvKiBIZXggbnVtYmVyICovCisJCWlmIChpc2RpZ2l0KCoocCsyKSkgfHwKKwkJICAgICgoKihwKzIpID49ICdhJyAmJiAqKHArMikgPD0gJ2YnKSB8fAorCQkgICAgICgoKihwKzIpID49ICdBJyAmJiAqKHArMikgPD0gJ0YnKSkpKQorCQkgIHRyaWVzID0gMTsKKwkgICAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgfQorCSAgICBwKys7CisJfQorI2Vsc2UKKyNpZm5kZWYgTk9TUEwKKwlpZiAoZikgewkJCS8qIElmIGEgY29udmVyc2lvbiBmdW5jdGlvbiBpcyBnaXZlbiAqLworCSAgICBjaGFyICpzID0gcDsJCS8qIFNlZSBpZiB0aGVyZSBhcmUgYW55IHZhcmlhYmxlcyBpbiAqLworCSAgICB3aGlsZSAoKnMpIHsJCS8qIHRoZSBzdHJpbmcgYW5kIGlmIHNvLCBleHBhbmQgdGhlbSAqLworCQlpZiAoY2hrdmFyKHMpKSB7CisJCSAgICB0cmllcyA9IDE7CisJCSAgICBicmVhazsKKwkJfQorCQlzKys7CisJICAgIH0KKwl9CisjZW5kaWYgLyogTk9TUEwgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfQorI2lmZGVmIE9TMgorb19hZ2FpbjoKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpZiAodHJpZXMgPT0gMSkKKyNlbmRpZiAvKiBET0NIS1ZBUiAqLworICAgIGlmIChmKSB7CQkJCS8qIElmIGEgY29udmVyc2lvbiBmdW5jdGlvbiBpcyBnaXZlbiAqLworCXpxID0gYXR4YnVmOwkJCS8qIGRvIHRoZSBjb252ZXJzaW9uLiAqLworCWF0eG4gPSBDTURCTDsKKwlpZiAoKHggPSAoKmYpKHMsJnpxLCZhdHhuKSkgPCAwKQorCSAgcmV0dXJuKC0yKTsKKwlzID0gYXR4YnVmOworCWlmICghKnMpCQkJLyogUmVzdWx0IGVtcHR5LCBzdWJzdGl0dXRlIGRlZmF1bHQgKi8KKwkgIHMgPSB4ZGVmOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJjbW9maSAyIixzLHgpOworCisjaWZkZWYgRFRJTERFCisgICAgZGlycCA9IHRpbGRlX2V4cGFuZChzKTsJCS8qIEV4cGFuZCB0aWxkZSwgaWYgYW55LCAqLworICAgIGlmICgqZGlycCAhPSAnXDAnKSB7CQkvKiByaWdodCBpbiB0aGUgYXRvbSBidWZmZXIuICovCisJaWYgKHNldGF0bShkaXJwLDEpIDwgMCkgeworCSAgICBwcmludGYoIj9OYW1lIHRvbyBsb25nXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisgICAgfQorICAgIHMgPSBhdG1idWY7CisgICAgZGVidWcoRjExMCwiY21vZmkgMyIscywwKTsKKyNlbmRpZiAvKiBEVElMREUgKi8KKworICAgIGlmIChpc3dpbGQocykpIHsKKyAgICAgICAgcHJpbnRmKCI/V2lsZGNhcmRzIG5vdCBhbGxvd2VkIC0gJXNcbiIscyk7CisgICAgICAgIHJldHVybigtMik7CisgICAgfQorICAgIGRlYnVnKEYxMTAsImNtb2ZpIDQiLHMsMCk7CisKKyNpZmRlZiBDS19UTVBESVIKKyAgICAvKiBpc2RpcigpIGZ1bmN0aW9uIHJlcXVpcmVkIGZvciB0aGlzISAqLworICAgIGlmIChpc2RpcihzKSkgeworCWRlYnVnKEYxMTAsImNtb2ZpIDU6IGlzIGRpcmVjdG9yeSIscywwKTsKKyAgICAgICAgKnhwID0gczsKKwlyZXR1cm4oMik7CisgICAgfQorI2VuZGlmIC8qIENLX1RNUERJUiAqLworCisgICAgaWYgKHN0cmNtcChzLENUVE5BTSkgJiYgKHpjaGtvKHMpIDwgMCkpIHsgLyogT0sgdG8gd3JpdGUgdG8gY29uc29sZSAqLworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBPUzIKKy8qCisgIFdlIGRvbid0IHRyeSBhZ2FpbiBiZWNhdXNlIHdlIGFscmVhZHkgcHJlc2Nhbm5lZCB0aGUgc3RyaW5nIHRvIHNlZSBpZgorICBpZiBpdCBjb250YWluZWQgYW55dGhpbmcgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5IHp6c3RyaW5nKCkuCisqLworCWlmICh0cmllcysrIDwgMSkKKwkgIGdvdG8gb19hZ2FpbjsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisvKgorICBOb3RlOiB0aGVyZSBhcmUgY2VydGFpbiBjaXJjdW1zdGFuY2VzIHdoZXJlIHpjaGtvKCkgY2FuIGdpdmUgYSBmYWxzZQorICBwb3NpdGl2ZSwgc28gZG9uJ3QgcmVseSBvbiBpdCB0byBjYXRjaCBldmVyeSBjb25jZWl2YWJsZSBzaXR1YXRpb24gaW4KKyAgd2hpY2ggdGhlIGdpdmVuIG91dHB1dCBmaWxlIGNhbid0IGJlIGNyZWF0ZWQuICBJbiBvdGhlciB3b3Jkcywgd2UgcHJpbnQKKyAgYSBtZXNzYWdlIGFuZCBmYWlsIGhlcmUgaWYgd2UgS05PVyB0aGUgZmlsZSBjYW4ndCBiZSBjcmVhdGVkLiAgSWYgd2UKKyAgc3VjY2VlZCBidXQgdGhlIGZpbGUgY2FuJ3QgYmUgb3BlbmVkLCB0aGUgY29kZSB0aGF0IHRyaWVzIHRvIG9wZW4gdGhlIGZpbGUKKyAgaGFzIHRvIHByaW50IGEgbWVzc2FnZS4KKyovCisJZGVidWcoRjExMCwiY21vZmkgNjogZmFpbHVyZSIscywwKTsKKyNpZmRlZiBDS1JPT1QKKwlpZiAoY2tyb290ZXJyKQorCSAgcHJpbnRmKCI/T2ZmIExpbWl0czogJXNcbiIscyk7CisJZWxzZQorI2VuZGlmIC8qIENLUk9PVCAqLworCSAgcHJpbnRmKCI/V3JpdGUgcGVybWlzc2lvbiBkZW5pZWQgLSAlc1xuIixzKTsKKyNpZmRlZiBDS0NIQU5ORUxJTworCXpfZXJyb3IgPSBGWF9BQ0M7CisjZW5kaWYgLyogQ0tDSEFOTkVMSU8gKi8KKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9IGVsc2UgeworCWRlYnVnKEYxMTAsImNtb2ZpIDc6IG9rIixzLDApOworICAgICAgICAqeHAgPSBzOworICAgICAgICByZXR1cm4oeCk7CisgICAgfQorfQorCisvKiAgQyBNIEkgRiBJICAtLSAgUGFyc2UgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgZmlsZSAgKi8KKworLyoKKyBUaGlzIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhlIGV4dGVybmFsIGZ1bmN0aW9uczoKKyAgIHpjaGtpKCkgIC0gQ2hlY2sgaWYgaW5wdXQgZmlsZSBleGlzdHMgYW5kIGlzIHJlYWRhYmxlLgorICAgenhwYW5kKCkgLSBFeHBhbmQgYSB3aWxkIGZpbGUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgbGlzdC4KKyAgIHpuZXh0KCkgIC0gUmV0dXJuIG5leHQgZmlsZSBuYW1lIGZyb20gbGlzdC4KKyBJZiB0aGVzZSBmdW5jdGlvbnMgYXJlbid0IGF2YWlsYWJsZSwgdGhlbiB1c2UgY21mbGQoKSB0byBwYXJzZSBmaWxlbmFtZXMuCisqLworLyoKKyBSZXR1cm5zCisgICAtNCBFT0YKKyAgIC0zIGlmIG5vIGlucHV0IHByZXNlbnQgd2hlbiByZXF1aXJlZCwKKyAgIC0yIGlmIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHJlYWRhYmxlLAorICAgLTEgaWYgcmVwYXJzZSBuZWVkZWQsCisgICAgMCBvciAxIG90aGVyd2lzZSwgd2l0aDoKKyAgICAgICAgeHAgcG9pbnRpbmcgdG8gbmFtZSwKKyAgICAgICAgd2lsZCA9IDEgaWYgbmFtZSBjb250YWlucyAnKicgb3IgJz8nLCAwIG90aGVyd2lzZS4KKyovCisKKy8qCisgICBDIE0gSSBPIEYgSSAgLS0gIFBhcnNlIGFuIGlucHV0IGZpbGUgT1IgdGhlIG5hbWUgb2YgYSBub25leGlzdGVudCBmaWxlLgorCisgICBVc2UgdGhpcyB3aGVuIGFuIGV4aXN0aW5nIGZpbGUgaXMgd2FudGVkIChzbyB3ZSBnZXQgaGVscCwgY29tcGxldGlvbiwgZXRjKSwKKyAgIGJ1dCBpZiBhIGZpbGUgb2YgdGhlIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3QsIHRoZSBuYW1lIG9mIGEgbmV3IGZpbGUgaXMKKyAgIGFjY2VwdGVkLiAgRm9yIGV4YW1wbGUsIHdpdGggdGhlIEVESVQgY29tbWFuZCAoZWRpdCBhbiBleGlzdGluZyBmaWxlLCBvcgorICAgY3JlYXRlIGEgbmV3IGZpbGUpLiAgUmV0dXJucyAtOSBpZiBmaWxlIGRvZXMgbm90IGV4aXN0LiAgSXQgaXMgdXAgdG8gdGhlCisgICBjYWxsZXIgdG8gY2hlY2sgY3JlYXRhYmlsaXR5LgorKi8KK3N0YXRpYyBpbnQgbm9tc2cgPSAwOworaW50CitjbWlvZmkoeGhscCx4ZGVmLHhwLHdpbGQsZikgY2hhciAqeGhscCwgKnhkZWYsICoqeHA7IGludCAqd2lsZDsgeHhfc3RycCBmOyB7CisgICAgaW50IG1zZ3NhdmUsIHg7CisgICAgbXNnc2F2ZSA9IG5vbXNnOworICAgIG5vbXNnID0gMTsKKyAgICB4ID0gY21pZmkyKHhobHAseGRlZix4cCx3aWxkLDAsTlVMTCxmLDApOworICAgIG5vbXNnID0gbXNnc2F2ZTsKKyAgICByZXR1cm4oeCk7Cit9CisKK2ludAorY21pZmkoeGhscCx4ZGVmLHhwLHdpbGQsZikgY2hhciAqeGhscCwgKnhkZWYsICoqeHA7IGludCAqd2lsZDsgeHhfc3RycCBmOyB7CisgICAgcmV0dXJuKGNtaWZpMih4aGxwLHhkZWYseHAsd2lsZCwwLE5VTEwsZiwwKSk7Cit9CisvKgorICBjbWlmaXAoKSBpcyBjYWxsZWQgd2hlbiB3ZSB3YW50IHRvIHN1cHBseSBhIHBhdGggb3IgcGF0aCBsaXN0IHRvIHNlYXJjaAorICBpbiBjYXNlIHRoZSBmaWxlbmFtZSB0aGF0IHRoZSB1c2VyIGdpdmVzIGlzIChhKSBub3QgYWJzb2x1dGUsIGFuZCAoYikgY2FuJ3QKKyAgYmUgZm91bmQgYXMgZ2l2ZW4uICBUaGUgcGF0aCBzdHJpbmcgY2FuIGJlIHRoZSBuYW1lIG9mIGEgc2luZ2xlIGRpcmVjdG9yeSwKKyAgb3IgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHNlcGFyYXRlZCBieSB0aGUgUEFUSFNFUCBjaGFyYWN0ZXIsIGRlZmluZWQgaW4KKyAgY2t1Y21kLmguICBMb29rIGluIGNrdXVzci5jIGFuZCBja3V1czMuYyBmb3IgZXhhbXBsZXMgb2YgdXNhZ2UuCisqLworaW50CitjbWlmaXAoeGhscCx4ZGVmLHhwLHdpbGQsZCxwYXRoLGYpCisgICAgY2hhciAqeGhscCwqeGRlZiwqKnhwOyBpbnQgKndpbGQsIGQ7IGNoYXIgKiBwYXRoOyB4eF9zdHJwIGY7IHsKKyAgICByZXR1cm4oY21pZmkyKHhobHAseGRlZix4cCx3aWxkLDAscGF0aCxmLDApKTsKK30KKworLyogIEMgTSBEIEkgUiAgLS0gIFBhcnNlIGEgZGlyZWN0b3J5IG5hbWUgICovCisKKy8qCisgVGhpcyBmdW5jdGlvbiBkZXBlbmRzIG9uIHRoZSBleHRlcm5hbCBmdW5jdGlvbnM6CisgICBpc2RpcihzKSAgLSBDaGVjayBpZiBzdHJpbmcgcyBpcyB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeQorICAgemNoa2kocykgIC0gQ2hlY2sgaWYgaW5wdXQgZmlsZSBzIGV4aXN0cyBhbmQgd2hhdCB0eXBlIGl0IGlzLgorIElmIHRoZXNlIGZ1bmN0aW9ucyBhcmVuJ3QgYXZhaWxhYmxlLCB0aGVuIHVzZSBjbWZsZCgpIHRvIHBhcnNlIGRpciBuYW1lcy4KKworIFJldHVybnMKKyAgIC05IEZvciBhbGwgc29ydHMgb2YgcmVhc29ucywgYWZ0ZXIgcHJpbnRpbmcgYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZS4KKyAgIC00IEVPRgorICAgLTMgaWYgbm8gaW5wdXQgcHJlc2VudCB3aGVuIHJlcXVpcmVkLAorICAgLTIgaWYgb3V0IG9mIHNwYWNlIG9yIG90aGVyIGludGVybmFsIGVycm9yLAorICAgLTEgaWYgcmVwYXJzZSBuZWVkZWQsCisgICAgMCBvciAxLCB3aXRoIHhwIHBvaW50aW5nIHRvIG5hbWUsIGlmIGRpcmVjdG9yeSBzcGVjaWZpZWQsCisqLworaW50CitjbWRpcih4aGxwLHhkZWYseHAsZikgY2hhciAqeGhscCwgKnhkZWYsICoqeHA7IHh4X3N0cnAgZjsgeworICAgIGludCB3aWxkOworICAgIHJldHVybihjbWlmaTIoeGhscCx4ZGVmLHhwLCZ3aWxkLDAsTlVMTCxmLDEpKTsKK30KKworLyogTGlrZSBDTURJUiBidXQgaW5jbHVkZXMgUEFUSCBzZWFyY2ggKi8KKworaW50CitjbWRpcnAoeGhscCx4ZGVmLHhwLHBhdGgsZikgY2hhciAqeGhscCwgKnhkZWYsICoqeHA7IGNoYXIgKiBwYXRoOyB4eF9zdHJwIGY7IHsKKyAgICBpbnQgd2lsZDsKKyAgICByZXR1cm4oY21pZmkyKHhobHAseGRlZix4cCwmd2lsZCwwLHBhdGgsZiwxKSk7Cit9CisKKy8qCisgIGNtaWZpMigpIGlzIHRoZSBiYXNlIGZpbGVuYW1lIHBhcnNlciBjYWxsZWQgYnkgY21pZmksIGNtaWZpcCwgY21kaXIsIGV0Yy4KKyAgVXNlIGl0IGRpcmVjdGx5IHdoZW4geW91IGFsc28gd2FudCB0byBwYXJzZSBhIGRpcmVjdG9yeSBvciBkZXZpY2UKKyAgbmFtZSBhcyBhbiBpbnB1dCBmaWxlLCBhcyBpbiB0aGUgRElSRUNUT1JZIGNvbW1hbmQuICBDYWxsIHdpdGg6CisgICAgeGhscCAgLS0gaGVscCBtZXNzYWdlIG9uID8KKyAgICB4ZGVmICAtLSBkZWZhdWx0IHJlc3BvbnNlCisgICAgeHAgICAgLS0gcG9pbnRlciB0byByZXN1bHQgKGluIG91ciBzcGFjZSwgbXVzdCBiZSBjb3BpZWQgZnJvbSBoZXJlKQorICAgIHdpbGQgIC0tIGZsYWcgc2V0IHVwb24gcmV0dXJuIHRvIGluZGljYXRlIGlmIGZpbGVzcGVjIHdhcyB3aWxkCisgICAgZCAgICAgLS0gMCB0byBwYXJzZSBmaWxlcywgMSB0byBwYXJzZSBmaWxlcyBvciBkaXJlY3RvcmllcworICAgICAgICAgICAgIEFkZCAyIHRvIGluaGliaXQgZm9sbG93aW5nIG9mIHN5bWxpbmtzLgorICAgIHBhdGggIC0tIHNlYXJjaCBwYXRoIGZvciBmaWxlcworICAgIGYgICAgIC0tIHBvaW50ZXIgdG8gc3RyaW5nIHByb2Nlc3NpbmcgZnVuY3Rpb24gKGUuZy4gdG8gZXZhbHVhdGUgdmFyaWFibGVzKQorICAgIGRpcmZsZyAtLSAxIHRvIHBhcnNlICpvbmx5KiBkaXJlY3RvcmllcywgMCBvdGhlcndpc2UKKyovCitpbnQKK2NtaWZpMih4aGxwLHhkZWYseHAsd2lsZCxkLHBhdGgsZixkaXJmbGcpCisgICAgY2hhciAqeGhscCwqeGRlZiwqKnhwOyBpbnQgKndpbGQsIGQ7IGNoYXIgKiBwYXRoOyB4eF9zdHJwIGY7IGludCBkaXJmbGc7IHsKKyAgICBleHRlcm4gaW50IHJlY3Vyc2l2ZSwgZGlyYWN0aXZlLCBjZGFjdGl2ZSwgZGJscXVvOworICAgIGludCBpLCB4LCBpdHNhZGlyLCB4YywgZXhwYW5kZWQgPSAwLCBuZmlsZXMgPSAwLCBjaGlsZHJlbiA9IC0xOworICAgIGludCBxZmxhZyA9IDA7CisgICAgbG9uZyB5OworICAgIGNoYXIgKnNwID0gTlVMTCwgKnpxLCAqbnAgPSBOVUxMOworICAgIGNoYXIgKnN2ID0gTlVMTCwgKnAgPSBOVUxMOworI2lmZGVmIERUSUxERQorICAgIGNoYXIgKmRpcnA7CisjZW5kaWYgLyogRFRJTERFICovCisKKyNpZm5kZWYgTk9QQVJUSUFMCisjaWZuZGVmIE9TMgorI2lmZGVmIE9TSworICAgIC8qIFRoaXMgbGFyZ2UgYXJyYXkgaXMgZHluYW1pYyBmb3IgT1MtOSAtLSBzaG91bGQgZG8gZm9yIG90aGVycyB0b28uLi4gKi8KKyAgICBleHRlcm4gY2hhciAqKm10Y2hzOworI2Vsc2UKKyNpZmRlZiBVTklYCisgICAgLyogT0ssIGZvciBVTklYIHRvbyAqLworICAgIGV4dGVybiBjaGFyICoqbXRjaHM7CisjZWxzZQorI2lmZGVmIFZNUworICAgIGV4dGVybiBjaGFyICoqbXRjaHM7CisjZWxzZQorICAgIGV4dGVybiBjaGFyICptdGNoc1tdOworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT1BBUlRJQUwgKi8KKworICAgIGlmICgheGhscCkgeGhscCA9ICIiOworICAgIGlmICgheGRlZikgeGRlZiA9ICIiOworCisgICAgbnp4b3B0cyA9IDA7CQkJLyogenhwYW5kKCkgb3B0aW9ucyAqLworICAgIGRlYnVnKEYxMDEsImNtaWZpIGQiLCIiLGQpOworICAgIGlmIChkICYgMikgewkJCS8qIGQgJiAyIG1lYW5zIGRvbid0IGZvbGxvdyBzeW1saW5rcyAqLworCWQgXj0gMjsKKwluenhvcHRzID0gWlhfTk9MSU5LUzsKKyAgICB9CisgICAgZGVidWcoRjEwMSwiY21pZmkgbnp4b3B0cyIsIiIsbnp4b3B0cyk7CisgICAgY21mbGRmbGdzID0gMDsKKyAgICBpZiAocGF0aCkKKyAgICAgIGlmICghKnBhdGgpCisJcGF0aCA9IE5VTEw7CisgICAgaWYgKHBhdGgpIHsJCQkJLyogTWFrZSBhIGNvcHkgd2UgY2FuIHBva2UgKi8KKwl4ID0gc3RybGVuKHBhdGgpOworCW5wID0gKGNoYXIgKikgbWFsbG9jKHggKyAxKTsKKwlpZiAobnApIHsKKwkgICAgc3RyY3B5KG5wLCBwYXRoKTsKKwkgICAgcGF0aCA9IHNwID0gbnA7CisJfQorICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJjbWlmaTIgcGF0aCIscGF0aCwwKTsKKworICAgIGNrc3RybmNweShjbWRlZmF1bHQseGRlZixDTURFRkFVTFQpOyAvKiBDb3B5IGRlZmF1bHQgKi8KKyAgICB4ZGVmID0gY21kZWZhdWx0OworCisgICAgaW53b3JkID0gMDsJCQkJLyogSW5pdGlhbGl6ZSBjb3VudHMgJiBwb2ludGVycyAqLworICAgIGNjID0gMDsKKyAgICB4YyA9IDA7CisgICAgKnhwID0gIiI7CQkJCS8qIFBvaW50ZXIgdG8gcmVzdWx0IHN0cmluZyAqLworICAgIGlmICgoeCA9IGNtZmxncykgIT0gMSkgeyAgICAgICAgICAgIC8qIEFscmVhZHkgY29uZmlybWVkPyAqLworI2lmZGVmIEJTX0RJUlNFUAorCWRpcm5hbWZsZyA9IDE7CisgICAgICAgIHggPSBndHdvcmQoMCk7CQkJLyogTm8sIGdldCBhIHdvcmQgKi8KKwlkaXJuYW1mbGcgPSAwOworI2Vsc2UKKyAgICAgICAgeCA9IGd0d29yZCgwKTsgICAgICAgICAgICAgICAgICAvKiBObywgZ2V0IGEgd29yZCAqLworI2VuZGlmIC8qIEJTX0RJUlNFUCAqLworICAgIH0gZWxzZSB7CQkJCS8qIElmIHNvLCB1c2UgZGVmYXVsdCwgaWYgYW55LiAqLworICAgICAgICBpZiAoc2V0YXRtKHhkZWYsMSkgPCAwKSB7CisJICAgIHByaW50ZigiP0RlZmF1bHQgbmFtZSB0b28gbG9uZ1xuIik7CisJICAgIGlmIChucCkgZnJlZShucCk7CisJICAgIHJldHVybigtOSk7CisJfQorICAgIH0KKyAgaV9wYXRoOgorICAgICp4cCA9IGF0bWJ1ZjsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIHJlc3VsdC4gKi8KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHhjICs9IGNjOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ291bnQgdGhpcyBjaGFyYWN0ZXIuICovCisgICAgICAgIGRlYnVnKEYxMTEsImNtaWZpIGd0d29yZCIsYXRtYnVmLHhjKTsKKwlkZWJ1ZyhGMTAxLCJjbWlmaSBzd2l0Y2ggeCIsIiIseCk7CisgICAgICAgIHN3aXRjaCAoeCkgewkJCS8qIHggPSBndHdvcmQoKSByZXR1cm4gY29kZSAqLworCSAgY2FzZSAtMTA6CisJICAgIGlmIChndGltZXIoKSA+IHRpbWVsaW1pdCkgeworI2lmZGVmIElLU0QKKyAgICAgICAgICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcclxuSUtTRCBJRExFIFRJTUVPVVQ6ICVkIHNlY1xyXG4iLCB0aW1lbGltaXQpOworICAgICAgICAgICAgICAgICAgICBkb2V4aXQoR09PRF9FWElULDApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisJCS8qIGlmICghcXVpZXQpIHByaW50ZigiP1RpbWVkIG91dFxuIik7ICovCisJCXJldHVybigtMTApOworCSAgICB9IGVsc2UgeworCQl4ID0gZ3R3b3JkKDApOworCQljb250aW51ZTsKKwkgICAgfQorCSAgY2FzZSAtOToKKwkgICAgcHJpbnRmKCJDb21tYW5kIG9yIGZpZWxkIHRvbyBsb25nXG4iKTsKKwkgIGNhc2UgLTQ6CQkJLyogRU9GICovCisJICBjYXNlIC0yOgkJCS8qIE91dCBvZiBzcGFjZS4gKi8KKwkgIGNhc2UgLTE6CQkJLyogUmVwYXJzZSBuZWVkZWQgKi8KKwkgICAgaWYgKG5wKSBmcmVlKG5wKTsKKwkgICAgcmV0dXJuKHgpOworCSAgY2FzZSAxOgkJCS8qIENSICovCisJICBjYXNlIDA6CQkJLyogU1AgKi8KKwkgICAgaWYgKHhjID09IDApCQkvKiBJZiBubyBpbnB1dC4uLiAqLworCSAgICAgICp4cCA9IHhkZWY7CQkvKiBzdWJzdGl0dXRlIHRoZSBkZWZhdWx0ICovCisJICAgICp4cCA9IGJyc3RyaXAoKnhwKTsJCS8qIFN0cmlwIGJyYWNlcyAqLworCSAgICBpZiAoKip4cCA9PSBOVUwpIHsJCS8qIDEyIG1hciAyMDAxICovCisJCWlmIChucCkgZnJlZShucCk7CisJCXJldHVybigtMyk7CisJICAgIH0KKwkgICAgZGVidWcoRjExMCwiY21pZmkgYnJzdHJpcCIsKnhwLDApOworI2lmbmRlZiBOT1NQTAorCSAgICBpZiAoZikgewkJCS8qIElmIGEgY29udmVyc2lvbiBmdW5jdGlvbiBpcyBnaXZlbiAqLworI2lmZGVmIERPQ0hLVkFSCisJCWNoYXIgKnMgPSAqeHA7CQkvKiBTZWUgaWYgdGhlcmUgYXJlIGFueSB2YXJpYWJsZXMgaW4gKi8KKwkJaW50IHg7CisJCXdoaWxlICgqcykgewkJLyogdGhlIHN0cmluZyBhbmQgaWYgc28sIGV4cGFuZCB0aGVtICovCisJCSAgICB4ID0gY2hrdmFyKHMpOworCQkgICAgLyogZGVidWcoRjExMSwiY21pZmkgY2hrdmFyIiwqeHAseCk7ICovCisJCSAgICBpZiAoeCkgeworI2VuZGlmIC8qIERPQ0hLVkFSICovCisJCQl6cSA9IGF0eGJ1ZjsKKwkJCWF0eG4gPSBDTURCTDsKKwkJCWlmICgoKmYpKCp4cCwmenEsJmF0eG4pIDwgMCkgeworCQkJICAgIGlmIChucCkgZnJlZShucCk7CisJCQkgICAgcmV0dXJuKC0yKTsKKwkJCX0KKwkJCSp4cCA9IGF0eGJ1ZjsKKwkJCWlmICghYXR4YnVmWzBdKQorCQkJICAqeHAgPSB4ZGVmOworI2lmZGVmIERPQ0hLVkFSCisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIHMrKzsKKwkJfQorI2VuZGlmIC8qIERPQ0hLVkFSICovCisJICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworCSAgICBpZiAoKip4cCA9PSBOVUwpIHsJCS8qIDEyIG1hciAyMDAxICovCisJCWlmIChucCkgZnJlZShucCk7CisJCXJldHVybigtMyk7CisJICAgIH0KKyNpZmRlZiBEVElMREUKKwkgICAgaWYgKGRpcmZsZykgeworCQlkaXJwID0gdGlsZGVfZXhwYW5kKCp4cCk7IC8qIEV4cGFuZCB0aWxkZSwgaWYgYW55LCAqLworCQlpZiAoKmRpcnAgIT0gJ1wwJykgewkvKiBpbiB0aGUgYXRvbSBidWZmZXIuICovCisJCSAgICBpZiAoc2V0YXRtKGRpcnAsMSkgPCAwKSB7CisJCQlwcmludGYoIkV4cGFuZGVkIG5hbWUgdG9vIGxvbmdcbiIpOworCQkJaWYgKG5wKSBmcmVlKG5wKTsKKwkJCXJldHVybigtOSk7CisJCSAgICB9CisJCX0KKwkJKnhwID0gYXRtYnVmOworCQlkZWJ1ZyhGMTEwLCJjbWlmaSB0aWxkZV9leHBhbmQiLCp4cCwwKTsKKwkgICAgfQorI2VuZGlmIC8qIERUSUxERSAqLworCSAgICBpZiAoIXN2KSB7CQkJLyogT25seSBkbyB0aGlzIG9uY2UgKi8KKwkJc3YgPSBtYWxsb2MoKGludClzdHJsZW4oKnhwKSsxKTsgLyogTWFrZSBhIHNhZmUgY29weSAqLworCQlpZiAoIXN2KSB7CisJCSAgICBwcmludGYoIj9jbWlmaTogbWFsbG9jIGVycm9yXG4iKTsKKwkJICAgIGlmIChucCkgZnJlZShucCk7CisJCSAgICByZXR1cm4oLTkpOworCQl9CisJCXN0cmNweShzdiwqeHApOworCQlkZWJ1ZyhGMTEwLCJjbWlmaSBzdiIsc3YsMCk7CisJICAgIH0KKworLyogVGhpcyBpcyB0byBnZXQgYXJvdW5kICJjZCAvIiBmYWlsaW5nIGJlY2F1c2UgInRvbyBtYW55IGRpcmVjdG9yaWVzIG1hdGNoIiAqLworCisJICAgIGV4cGFuZGVkID0gMDsJCS8qIERpZG4ndCBjYWxsIHp4cGFuZCAqLworI2lmZGVmIGRhdGFnZW5lcmFsCisJICAgIGRlYnVnKEYxMTAsImNtaWZpIGlzZGlyIDEiLCp4cCwwKTsKKwkgICAgeworCQlpbnQgeTsgY2hhciAqczsKKwkJcyA9ICp4cDsKKwkJeSA9IHN0cmxlbihzKTsKKwkJaWYgKHkgPiAxICYmCisJCSAgICAoc1t5LTFdID09ICc6JyB8fAorCQkgICAgIHNbeS0xXSA9PSAnXicgfHwKKwkJICAgICBzW3ktMV0gPT0gJz0nKQorCQkgICAgKQorCQkgIHNbeS0xXSA9IE5VTDsKKwkgICAgfQorCSAgICBkZWJ1ZyhGMTEwLCJjbWlmaSBpc2RpciAyIiwqeHAsMCk7CisjZW5kaWYgLyogIGRhdGFnZW5lcmFsICovCisKKyNpZmRlZiBWTVMKKwkgICAgaWYgKGRpcmZsZykgeworCQlpZiAoIXN0cmNtcCgqeHAsIi4uIikpIHsgLyogRm9yIFVOSVhlcnMuLi4gKi8KKwkJICAgIHNldGF0bSgiLSIsMCk7CisJCSAgICAqeHAgPSBhdG1idWY7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCgqeHAsIi4iKSkgeworCQkgICAgc2V0YXRtKCJbXSIsMCk7CisJCSAgICAqeHAgPSBhdG1idWY7CisJCX0KKwkgICAgfQorI2VuZGlmIC8qIFZNUyAqLworCSAgICBpdHNhZGlyID0gaXNkaXIoKnhwKTsJLyogSXMgaXQgYSBkaXJlY3Rvcnk/ICovCisJICAgIGRlYnVnKEYxMTEsImNtaWZpIGl0c2FkaXIiLCp4cCxpdHNhZGlyKTsKKyNpZmRlZiBWTVMKKwkgICAgLyogSWYgdGhleSBzYWlkICJibGFoIiB3aGVyZSAiYmxhaC5kaXIiIGlzIGEgZGlyZWN0b3J5Li4uICovCisJICAgIC8qIGNoYW5nZSBpdCB0byBbLmJsYWhdLiAqLworCSAgICBpZiAoIWl0c2FkaXIpIHsKKwkJY2hhciB0bXBidWZbNjAwXTsKKwkJaW50IGZsYWcgPSAwOyBjaGFyIGMsICogcDsKKwkJcCA9ICp4cDsKKwkJd2hpbGUgKChjID0gKnArKykgJiYgIWZsYWcpCisJCSAgaWYgKGNrc3RyY2hyKCIuW106Kj88PiIsYykpCisJCSAgICBmbGFnID0gMTsKKwkJZGVidWcoRjExMSwiY21pZmkgVk1TIGRpcm5hbWUgZmxhZyIsKnhwLGZsYWcpOworCQlpZiAoIWZsYWcpIHsKKwkJICAgIGNrbWFrbXNnKHRtcGJ1ZixUTVBCVUZTSVosIlsuIiwqeHAsIl0iLE5VTEwpOworCQkgICAgaXRzYWRpciA9IGlzZGlyKHRtcGJ1Zik7CisJCSAgICBpZiAoaXRzYWRpcikgeworCQkJc2V0YXRtKHRtcGJ1ZiwwKTsKKwkJCSp4cCA9IGF0bWJ1ZjsKKwkJICAgIH0KKwkJICAgIGRlYnVnKEYxMTEsImNtaWZpIFZNUyBkaXJuYW1lIGZsYWcgaXRzYWRpciIsKnhwLGl0c2FkaXIpOworCQl9CisJICAgIH0gZWxzZSBpZiAoaXRzYWRpciA9PSAxICYmICooeHBbMF0pID09ICcuJyAmJiAqKHhwWzFdKSkgeworCQljaGFyICpwOworCQlpZiAocCA9IG1hbGxvYyhjYyArIDQpKSB7CisJCSAgICBja21ha21zZyhwLGNjKzQsIlsiLCp4cCwiXSIsTlVMTCk7CisJCSAgICBzZXRhdG0ocCwwKTsKKwkJICAgICp4cCA9IGF0bWJ1ZjsKKwkJICAgIGRlYnVnKEYxMTAsImNtZGlyIC5mb28iLCp4cCwwKTsKKwkJICAgIGZyZWUocCk7CisJCX0KKwkgICAgfSBlbHNlIGlmIChpdHNhZGlyID09IDIgJiYgIWRpcmFjdGl2ZSkgeworCQlpbnQgeDsJCQkvKiBbRk9PXUJBUi5ESVIgaW5zdGVhZCBvZiBbRk9PLkJBUl0gKi8KKwkJY2hhciAqcDsKKwkJcCA9IG1hbGxvYyhjYyArIDQpOworCQlpZiAocCkgeworCQkgICAgeCA9IGN2dGRpcigqeHAscCxBVE1CTCk7IC8qIENvbnZlcnQgdG8gW0ZPTy5CQVJdICovCisJCSAgICBpZiAoeCA+IDApIHsKKwkJCXNldGF0bShwLDApOworCQkJKnhwID0gYXRtYnVmOworCQkJZGVidWcoRjExMCwiY21kaXIgY3Z0ZGlyIiwqeHAsMCk7CisJCSAgICB9CisJCSAgICBmcmVlKHApOworCQl9CisJICAgIH0KKyNlbmRpZiAvKiBWTVMgKi8KKworCSAgICBkZWJ1ZyhGMTAxLCJjbWlmaSBkaXJmbGciLCIiLGRpcmZsZyk7CisJICAgIGlmIChkaXJmbGcpIHsJCS8qIFBhcnNpbmcgYSBkaXJlY3RvcnkgbmFtZT8gKi8KKwkJLyogWWVzLCBkb2VzIGl0IGNvbnRhaW4gd2lsZGNhcmRzPyAqLworCQlpZiAoaXN3aWxkKCp4cCkgfHwKKwkJICAgIChkaXJhY3RpdmUgJiYgKCFzdHJjbXAoKnhwLCIuIikgIHx8ICFzdHJjbXAoKnhwLCIuLiIpKSkKKwkJICAgICkgeworCQkgICAgbnp4b3B0cyB8PSBaWF9ESVJPTkxZOyAvKiBNYXRjaCBvbmx5IGRpcmVjdG9yeSBuYW1lcyAqLworCQkgICAgaWYgKG1hdGNoZG90KSAgbnp4b3B0cyB8PSBaWF9NQVRDSERPVDsKKwkJICAgIGlmIChyZWN1cnNpdmUpIG56eG9wdHMgfD0gWlhfUkVDVVJTRTsKKwkJICAgIGRlYnVnKEYxMTEsImNtaWZpIG56eG9wdHMgMiIsKnhwLG56eG9wdHMpOworCQkgICAgeSA9IG56eHBhbmQoKnhwLG56eG9wdHMpOworCQkgICAgZGVidWcoRjExMSwiY21pZmkgbnp4cGFuZCAyIiwqeHAseSk7CisJCSAgICBuZmlsZXMgPSB5OworCQkgICAgZXhwYW5kZWQgPSAxOworCQl9IGVsc2UgeworI2lmZGVmIFZNUworLyoKKyAgVGhpcyBpcyB0byBhbGxvdyAoZS5nLikgImNkIGZvbyIsIHdoZXJlIEZPTy5ESVI7MSBpcyBpbiB0aGUKKyAgY3VycmVudCBkaXJlY3RvcnkuCisqLworCQkgICAgZGVidWcoRjExMSwiY21kaXIgaXRzYWRpciIsKnhwLGl0c2FkaXIpOworCQkgICAgaWYgKCFpdHNhZGlyKSB7CisJCQljaGFyICpzOworCQkJaW50IG47CisJCQlzID0gKnhwOworCQkJbiA9IHN0cmxlbihzKTsKKwkJCWlmIChuID4gMCAmJgorI2lmZGVmIENPTU1FTlQKKwkJCSAgICAqcyAhPSAnWycgJiYgc1tuLTFdICE9ICddJyAmJgorCQkJICAgICpzICE9ICc8JyAmJiBzW24tMV0gIT0gJz4nICYmCisjZWxzZQorCQkJICAgIGNraW5kZXgoIlsiLHMsMCwwLDEpID09IDAgJiYKKwkJCSAgICBja2luZGV4KCI8IixzLDAsMCwxKSA9PSAwICYmCisjZW5kaWYgLyogQ09NTUVOVCAqLworCQkJICAgIHNbbi0xXSAhPSAnOicpIHsKKwkJCSAgICBjaGFyICogZGlyYnVmID0gTlVMTDsKKwkJCSAgICBkaXJidWYgPSAoY2hhciAqKW1hbGxvYyhuKzQpOworCQkJICAgIGlmIChkaXJidWYpIHsKKwkJCQlpZiAoKnMgPT0gJy4nKQorCQkJCSAgY2ttYWttc2coZGlyYnVmLG4rNCwiWyIscywiXSIsTlVMTCk7CisJCQkJZWxzZQorCQkJCSAgY2ttYWttc2coZGlyYnVmLG4rNCwiWy4iLHMsIl0iLE5VTEwpOworCQkJCWl0c2FkaXIgPSBpc2RpcihkaXJidWYpOworCQkJCWRlYnVnKEYxMTEsImNtZGlyIGRpcmJ1ZiIsZGlyYnVmLGl0c2FkaXIpOworCQkJCWlmIChpdHNhZGlyKSB7CisJCQkJICAgIHNldGF0bShkaXJidWYsMCk7CisJCQkJICAgICp4cCA9IGF0bWJ1ZjsKKwkJCQkgICAgZGVidWcoRjExMCwiY21kaXIgbmV3ICp4cCIsKnhwLDApOworCQkJCX0KKwkJCQlmcmVlKGRpcmJ1Zik7CisJCQkgICAgfQorCisvKiBUaGlzIGlzIHRvIGFsbG93IENEUEFUSCB0byB3b3JrIGluIFZNUy4uLiAqLworCisJCQl9IGVsc2UgaWYgKG4gPiAwKSB7CisJCQkgICAgY2hhciAqIHA7IGludCBpLCBqLCBrLCBkOworCQkJICAgIGNoYXIgcmJbMl0gPSAiXSI7CisJCQkgICAgaWYgKHAgPSBtYWxsb2MoeCArIDgpKSB7CisJCQkJY2tzdHJuY3B5KHAsKnhwLHgrOCk7CisJCQkJaSA9IGNraW5kZXgoIi4iLHAsLTEsMSwxKTsKKwkJCQlkID0gY2tpbmRleCgiLmRpciIscCwwLDAsMCk7CisJCQkJaiA9IGNraW5kZXgoIl0iLHAsLTEsMSwxKTsKKwkJCQlpZiAoaiA9PSAwKSB7CisJCQkJICAgIGogPSBja2luZGV4KCI+IixwLC0xLDEsMSk7CisJCQkJICAgIHJiWzBdID0gJz4nOworCQkJCX0KKwkJCQlrID0gY2tpbmRleCgiOiIscCwtMSwxLDEpOworCQkJCWlmIChpIDwgaiB8fCBpIDwgaykgaSA9IDA7CisJCQkJaWYgKGQgPCBqIHx8IGQgPCBrKSBkID0gMDsKKwkJCQkvKiBDaGFuZ2UgW0ZPT11CQVIgb3IgW0ZPT11CQVIuRElSICovCisJCQkJLyogdG8gW0ZPTy5CQVJdICovCisJCQkJaWYgKGogPiAwICYmIGogPCBuKSB7CisJCQkJICAgIHBbai0xXSA9ICcuJzsKKwkJCQkgICAgaWYgKGQgPiAwKSBwW2QtMV0gPSBOVUw7CisJCQkJICAgIGNrc3RybmNhdChwLHJiLHgrOCk7CisJCQkJICAgIGRlYnVnKEYxMTAsImNtZGlyIHh4eCIscCwwKTsKKwkJCQl9CisJCQkJaXRzYWRpciA9IGlzZGlyKHApOworCQkJCWRlYnVnKEYxMTEsImNtZGlyIHAiLHAsaXRzYWRpcik7CisJCQkJaWYgKGl0c2FkaXIpIHsKKwkJCQkgICAgc2V0YXRtKHAsMCk7CisJCQkJICAgICp4cCA9IGF0bWJ1ZjsKKwkJCQkgICAgZGVidWcoRjExMCwiY21kaXIgbmV3ICp4cCIsKnhwLDApOworCQkJCX0KKwkJCQlmcmVlKHApOworCQkJICAgIH0KKwkJCX0KKwkJICAgIH0KKyNlbmRpZiAvKiBWTVMgKi8KKwkJICAgIHkgPSAoIWl0c2FkaXIpID8gMCA6IDE7CisJCSAgICBkZWJ1ZyhGMTExLCJjbWlmaSB5IGl0c2FkaXIiLCp4cCx5KTsKKwkJfQorCSAgICB9IGVsc2UgewkJCS8qIFBhcnNpbmcgYSBmaWxlbmFtZS4gKi8KKwkJZGVidWcoRjExMCwiY21pZmkgKnhwIHByZS16eHBhbmQiLCp4cCwwKTsKKyNpZm5kZWYgQ09NTUVOVAorCQluenhvcHRzIHw9IChkID09IDApID8gWlhfRklMT05MWSA6IDA7IC8qIFNvIGFsd2F5cyBleHBhbmQuICovCisJCWlmIChtYXRjaGRvdCkgIG56eG9wdHMgfD0gWlhfTUFUQ0hET1Q7CisJCWlmIChyZWN1cnNpdmUpIG56eG9wdHMgfD0gWlhfUkVDVVJTRTsKKwkJeSA9IG56eHBhbmQoKnhwLG56eG9wdHMpOworI2Vsc2UKKy8qIEhlcmUgd2UncmUgdHJ5aW5nIHRvIGZpeCBhIHByb2JsZW0gaW4gd2hpY2ggYSBkaXJlY3RvcnkgbmFtZSBpcyBhY2NlcHRlZCAqLworLyogYXMgYSBmaWxlbmFtZSwgYnV0IHRoaXMgYnJlYWtzIHRvbyBtYW55IG90aGVyIHRoaW5ncy4gKi8KKwkJLyogbnp4b3B0cyA9IDA7ICovCisJCWlmICghZCkgeworCQkgICAgaWYgKGl0c2FkaXIgJiAhaXN3aWxkKCp4cCkpIHsKKwkJCWRlYnVnKEYxMDAsImNtaWZpIGRpciB3aGVuIGZpbG9ubHkiLCIiLDApOworCQkJcHJpbnRmKCI/Tm90IGEgcmVndWxhciBmaWxlOiBcIiVzXCJcbiIsKnhwKTsKKwkJCWlmIChzdikgZnJlZShzdik7CisJCQlpZiAobnApIGZyZWUobnApOworCQkJcmV0dXJuKC05KTsKKwkJICAgIH0gZWxzZSB7CisJCQluenhvcHRzIHw9IFpYX0ZJTE9OTFk7CisJCQlpZiAobWF0Y2hkb3QpICBuenhvcHRzIHw9IFpYX01BVENIRE9UOworCQkJaWYgKHJlY3Vyc2l2ZSkgbnp4b3B0cyB8PSBaWF9SRUNVUlNFOworCQkJeSA9IG56eHBhbmQoKnhwLG56eG9wdHMpOworCQkgICAgfQorCQl9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCQluZmlsZXMgPSB5OworCQlkZWJ1ZyhGMTExLCJjbWlmaSB5IG56eHBhbmQiLCp4cCx5KTsKKwkJZGVidWcoRjExMSwiY21pZmkgeSBhdG1idWYiLGF0bWJ1ZixpdHNhZGlyKTsKKwkJZXhwYW5kZWQgPSAxOworCSAgICB9CisJICAgIC8qIGRvbXlkaXIoKSBjYWxscyB6eHJld2luZCgpIHNvIHdlIE1VU1QgY2FsbCBuenhwYW5kKCkgaGVyZSAqLworCSAgICBpZiAoIWV4cGFuZGVkICYmIGRpcmFjdGl2ZSkgeworCQlkZWJ1ZyhGMTEwLCJjbWlmaSBkaXJhY3RpdmUgY2F0Y2gtYWxsIHp4cGFuZCIsKnhwLDApOworCQluenhvcHRzIHw9IChkID09IDApID8gWlhfRklMT05MWSA6IChkaXJmbGcgPyBaWF9ESVJPTkxZIDogMCk7CisJCWlmIChtYXRjaGRvdCkgIG56eG9wdHMgfD0gWlhfTUFUQ0hET1Q7CisJCWlmIChyZWN1cnNpdmUpIG56eG9wdHMgfD0gWlhfUkVDVVJTRTsKKwkJeSA9IG56eHBhbmQoKnhwLG56eG9wdHMpOworCQlkZWJ1ZyhGMTExLCJjbWlmaSBkaXJhY3RpdmUgbnp4cGFuZCIsKnhwLHkpOworCQluZmlsZXMgPSB5OworCQlleHBhbmRlZCA9IDE7CisJICAgIH0KKwkgICAgKndpbGQgPSAoaXN3aWxkKHN2KSB8fCAoeSA+IDEpKSAmJiAoaXRzYWRpciA9PSAwKTsKKworI2lmZGVmIFJFQ1VSU0lWRQorCSAgICBpZiAoISp3aWxkKSAqd2lsZCA9IHJlY3Vyc2l2ZTsKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKworCSAgICBkZWJ1ZyhGMTExLCJjbWlmaSBzdiB3aWxkIixzdiwqd2lsZCk7CisJICAgIGRlYnVnKEYxMDEsImNtaWZpIHkiLCIiLHkpOworCSAgICBpZiAoZGlyZmxnICYmICp3aWxkICYmIGNkYWN0aXZlKSB7CisJCWlmICh5ID4gMSkgeworCQkgICAgcHJpbnRmKCI/V2lsZGNhcmQgbWF0Y2hlcyBtb3JlIHRoYW4gb25lIGRpcmVjdG9yeVxuIik7CisJCSAgICBpZiAoc3YpIGZyZWUoc3YpOworCQkgICAgaWYgKG5wKSBmcmVlKG5wKTsKKwkJICAgIHJldHVybigtOSk7CisJCX0gZWxzZSB7CisJCSAgICB6bmV4dCgqeHApOworCQl9CisJICAgIH0KKwkgICAgaWYgKGl0c2FkaXIgJiYgZCAmJiAhZGlyZmxnKSB7IC8qIEl0J3MgYSBkaXJlY3RvcnkgYW5kIG5vdCB3aWxkICovCisJCWlmIChzdikgZnJlZShzdik7CS8qIGFuZCBpdCdzIG9rIHRvIHBhcnNlIGRpcmVjdG9yaWVzICovCisJCWlmIChucCkgZnJlZShucCk7CisJCXJldHVybih4KTsKKwkgICAgfQorCSAgICBpZiAoeSA9PSAwKSB7CQkvKiBGaWxlIHdhcyBub3QgZm91bmQgKi8KKwkJaW50IGRvc2VhcmNoID0gMDsKKwkJZG9zZWFyY2ggPSAocGF0aCAhPSBOVUxMKTsgLyogQSBzZWFyY2ggcGF0aCB3YXMgZ2l2ZW4gKi8KKwkJaWYgKGRvc2VhcmNoKSB7CisJCSAgICBkb3NlYXJjaCA9IGhhc25vcGF0aChzdik7IC8qIEZpbGVuYW1lIGluY2x1ZGVzIG5vIHBhdGggKi8KKwkJICAgIGRlYnVnKEYxMTEsImNtaWZpcCBoYXNub3BhdGgiLHN2LGRvc2VhcmNoKTsKKwkJfQorCQlpZiAoZG9zZWFyY2gpIHsJCS8qIFNlYXJjaCB0aGUgcGF0aC4uLiAqLworCQkgICAgY2hhciAqIHB0ciA9IHBhdGg7CisJCSAgICBjaGFyIGM7CisJCSAgICB3aGlsZSAoMSkgeworCQkJYyA9ICpwdHI7CisJCQlpZiAoYyA9PSBQQVRIU0VQIHx8IGMgPT0gTlVMKSB7CisJCQkgICAgaWYgKCEqcGF0aCkgeworCQkJCXBhdGggPSBOVUxMOworCQkJCWJyZWFrOworCQkJICAgIH0KKwkJCSAgICAqcHRyID0gTlVMOworI2lmZGVmIFVOSVgKKy8qIEJ5IGRlZmluaXRpb24gb2YgQ0RQQVRILCBhbiBlbXB0eSBtZW1iZXIgZGVub3RlcyB0aGUgY3VycmVudCBkaXJlY3RvcnkgKi8KKwkJCSAgICBpZiAoISpwYXRoKQorCQkJICAgICAgY2tzdHJuY3B5KGF0bWJ1ZiwiLiIsQVRNQkwpOworCQkJICAgIGVsc2UKKyNlbmRpZiAvKiBVTklYICovCisJCQkgICAgICBja3N0cm5jcHkoYXRtYnVmLHBhdGgsQVRNQkwpOworI2lmZGVmIFZNUworCQkJICAgIGF0bWJ1ZltBVE1CTF0gPSBOVUw7CisvKiBJZiB3ZSBoYXZlIGEgbG9naWNhbCBuYW1lLCBldmFsdWF0ZSBpdCByZWN1cnNpdmVseSAqLworCQkJICAgIGlmICgqKHB0ci0xKSA9PSAnOicpIHsgLyogTG9naWNhbCBuYW1lIGVuZHMgaW4gOiAqLworCQkJCWNoYXIgKnA7IGludCBuOworCQkJCXdoaWxlICgoKG4gPSBzdHJsZW4oYXRtYnVmKSkgID4gMCkgJiYKKwkJCQkgICAgICAgYXRtYnVmW24tMV0gPT0gJzonKSB7CisJCQkJICAgIGF0bWJ1ZltuLTFdID0gTlVMOworCQkJCSAgICBmb3IgKHAgPSBhdG1idWY7ICpwOyBwKyspCisJCQkJICAgICAgaWYgKGlzbG93ZXIoKnApKSAqcCA9IHRvdXBwZXIoKnApOworCQkJCSAgICBkZWJ1ZyhGMTExLCJjbWRpciBDRFBBVEggTE4gMSIsYXRtYnVmLG4pOworCQkJCSAgICBwID0gZ2V0ZW52KGF0bWJ1Zik7CisJCQkJICAgIGRlYnVnKEYxMTAsImNtZGlyIENEUEFUSCBMTiAyIixwLDApOworCQkJCSAgICBpZiAoIXApCisJCQkJICAgICAgYnJlYWs7CisJCQkJICAgIHN0cm5jcHkoYXRtYnVmLHAsQVRNQkwpOworCQkJCSAgICBhdG1idWZbQVRNQkxdID0gTlVMOworCQkJCX0KKwkJCSAgICB9CisjZWxzZQorI2lmZGVmIE9TMgorCQkJICAgIGlmICgqKHB0ci0xKSAhPSAnXFwnICYmICoocHRyLTEpICE9ICcvJykKKwkJCSAgICAgIGNrc3RybmNhdChhdG1idWYsIlxcIixBVE1CTCk7CisjZWxzZQorI2lmZGVmIFVOSVgKKwkJCSAgICBpZiAoKihwdHItMSkgIT0gJy8nKQorCQkJICAgICAgY2tzdHJuY2F0KGF0bWJ1ZiwiLyIsQVRNQkwpOworI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorCQkJICAgIGlmICgqKHB0ci0xKSAhPSAnOicpCisJCQkgICAgICBja3N0cm5jYXQoYXRtYnVmLCI6IixBVE1CTCk7CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVk1TICovCisJCQkgICAgY2tzdHJuY2F0KGF0bWJ1ZixzdixBVE1CTCk7CisJCQkgICAgZGVidWcoRjExMCwiY21pZmlwIGFkZCBwYXRoIixhdG1idWYsMCk7CisJCQkgICAgaWYgKGMgPT0gUEFUSFNFUCkgcHRyKys7CisJCQkgICAgcGF0aCA9IHB0cjsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJCXB0cisrOworCQkgICAgfQorCQkgICAgeCA9IDE7CisJCSAgICBpbndvcmQgPSAwOworCQkgICAgY2MgPSAwOworCQkgICAgeGMgPSAoaW50KSBzdHJsZW4oYXRtYnVmKTsKKwkJICAgICp4cCA9ICIiOworCQkgICAgZ290byBpX3BhdGg7CisJCX0KKwkJaWYgKGQpIHsKKwkJICAgIGlmIChzdikgZnJlZShzdik7CisJCSAgICBpZiAobnApIGZyZWUobnApOworCQkgICAgcmV0dXJuKC0yKTsKKwkJfSBlbHNlIHsKKwkJICAgIGlmICghbm9tc2cpIHsKKyNpZmRlZiBDS1JPT1QKKwkJCWlmIChja3Jvb3RlcnIpCisJCQkgIHByaW50ZigiP09mZiBMaW1pdHM6ICVzXG4iLHN2KTsKKwkJCWVsc2UKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKwkJCSAgcHJpbnRmKCI/Tm8gJXMgbWF0Y2ggLSAlc1xuIiwKKwkJCQkgZGlyZmxnID8gImRpcmVjdG9yaWVzIiA6ICJmaWxlcyIsIHN2KTsKKwkJICAgIH0KKwkJICAgIGlmIChzdikgZnJlZShzdik7CisJCSAgICBpZiAobnApIGZyZWUobnApOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorCSAgICB9IGVsc2UgaWYgKHkgPCAwKSB7CisjaWZkZWYgQ0tST09UCisJCWlmIChja3Jvb3RlcnIpCisJCSAgcHJpbnRmKCI/T2ZmIExpbWl0czogJXNcbiIsc3YpOworCQllbHNlCisjZW5kaWYgLyogQ0tST09UICovCisJCSAgcHJpbnRmKCI/VG9vIG1hbnkgJXMgbWF0Y2ggLSAlc1xuIiwKKwkJCSBkaXJmbGcgPyAiZGlyZWN0b3JpZXMiIDogImZpbGVzIiwgc3YpOworCQlpZiAoc3YpIGZyZWUoc3YpOworCQlpZiAobnApIGZyZWUobnApOworCQlyZXR1cm4oLTkpOworCSAgICB9IGVsc2UgaWYgKCp3aWxkIHx8IHkgPiAxKSB7CisJCWlmIChzdikgZnJlZShzdik7CisJCWlmIChucCkgZnJlZShucCk7CisJCXJldHVybih4KTsKKwkgICAgfQorCisJICAgIC8qIElmIG5vdCB3aWxkLCBzZWUgaWYgaXQgZXhpc3RzIGFuZCBpcyByZWFkYWJsZS4gKi8KKworCSAgICBkZWJ1ZyhGMTExLCJjbWlmaSBzdiBub3Qgd2lsZCIsc3YsKndpbGQpOworCSAgICBpZiAoZXhwYW5kZWQpCisJICAgICAgem5leHQoKnhwKTsJCS8qIEdldCBmaXJzdCAob25seT8pIG1hdGNoaW5nIGZpbGUgKi8KKwkgICAgaWYgKGRpcmZsZykJCQkvKiBNYXliZSB3aWxkIGFuZCBleHBhbmRlZCAqLworCSAgICAgIGl0c2FkaXIgPSBpc2RpcigqeHApOwkvKiBzbyBkbyB0aGlzIGFnYWluLiAqLworCSAgICB5ID0gZGlyZmxnID8gaXRzYWRpciA6IHpjaGtpKCp4cCk7IC8qIE5vdyBjaGVjayBhY2Nlc3NpYmlsaXR5ICovCisJICAgIGlmIChleHBhbmRlZCkgeworI2lmZGVmIFpYUkVXSU5ECisJCW5maWxlcyA9IHp4cmV3aW5kKCk7CS8qIFJld2luZCBzbyBuZXh0IHpuZXh0KCkgZ2V0cyAxc3QgKi8KKyNlbHNlCisKKwkJbnp4b3B0cyB8PSBkaXJmbGcgPyBaWF9ESVJPTkxZIDogMDsKKwkJaWYgKG1hdGNoZG90KSAgbnp4b3B0cyB8PSBaWF9NQVRDSERPVDsKKwkJaWYgKHJlY3Vyc2l2ZSkgbnp4b3B0cyB8PSBaWF9SRUNVUlNFOworCQluZmlsZXMgPSBuenhwYW5kKCp4cCxuenhvcHRzKTsKKyNlbmRpZiAvKiBaWFJFV0lORCAqLworCSAgICB9CisJICAgIGRlYnVnKEYxMTEsImNtaWZpIG5maWxlcyIsKnhwLG5maWxlcyk7CisJICAgIGZyZWUoc3YpOwkJCS8qIGRvbmUgd2l0aCB0aGlzICovCisJICAgIHN2ID0gTlVMTDsKKwkgICAgaWYgKGRpcmZsZyAmJiB5ID09IDApIHsKKwkJcHJpbnRmKCI/Tm90IGEgZGlyZWN0b3J5IC0gJXNcbiIsKnhwKTsKKyNpZmRlZiBDS0NIQU5ORUxJTworCQl6X2Vycm9yID0gRlhfQUNDOworI2VuZGlmIC8qIENLQ0hBTk5FTElPICovCisJCXJldHVybigtOSk7CisJICAgIH0gZWxzZSBpZiAoeSA9PSAtMykgeworCQlpZiAoIXhjbWZkYikgeworCQkgICAgaWYgKGRpcmFjdGl2ZSkKKwkJICAgICAgLyogRG9uJ3Qgc2hvdyBmaWxlbmFtZSBpZiB3ZSdyZSBub3QgYWxsb3dlZCB0byBzZWUgaXQgKi8KKwkJICAgICAgcHJpbnRmKCI/UmVhZCBwZXJtaXNzaW9uIGRlbmllZFxuIik7CisJCSAgICBlbHNlCisJCSAgICAgIHByaW50ZigiP1JlYWQgcGVybWlzc2lvbiBkZW5pZWQgLSAlc1xuIiwqeHApOworCQl9CisJCWlmIChucCkgZnJlZShucCk7CisjaWZkZWYgQ0tDSEFOTkVMSU8KKwkJel9lcnJvciA9IEZYX0FDQzsKKyNlbmRpZiAvKiBDS0NIQU5ORUxJTyAqLworCQlyZXR1cm4oeGNtZmRiID8gLTYgOiAtOSk7CisJICAgIH0gZWxzZSBpZiAoeSA9PSAtMikgeworCQlpZiAoIXJlY3Vyc2l2ZSkgeworCQkgICAgaWYgKG5wKSBmcmVlKG5wKTsKKwkJICAgIGlmIChkKSByZXR1cm4oMCk7CisJCSAgICBpZiAoIXhjbWZkYikKKwkJICAgICAgcHJpbnRmKCI/RmlsZSBub3QgcmVhZGFibGUgLSAlc1xuIiwqeHApOworI2lmZGVmIENLQ0hBTk5FTElPCisJCSAgICB6X2Vycm9yID0gRlhfQUNDOworI2VuZGlmIC8qIENLQ0hBTk5FTElPICovCisJCSAgICByZXR1cm4oeGNtZmRiID8gLTYgOiAtOSk7CisJCX0KKwkgICAgfSBlbHNlIGlmICh5IDwgMCkgeworCQlpZiAobnApIGZyZWUobnApOworCQlpZiAoIW5vbXNnICYmICF4Y21mZGIpCisJCSAgcHJpbnRmKCI/RmlsZSBub3QgZm91bmQgLSAlc1xuIiwqeHApOworI2lmZGVmIENLQ0hBTk5FTElPCisJCXpfZXJyb3IgPSBGWF9GTkY7CisjZW5kaWYgLyogQ0tDSEFOTkVMSU8gKi8KKwkJcmV0dXJuKHhjbWZkYiA/IC02IDogLTkpOworCSAgICB9CisJICAgIGlmIChucCkgZnJlZShucCk7CisJICAgIHJldHVybih4KTsKKworI2lmbmRlZiBNQUMKKwkgIGNhc2UgMjoJCQkvKiBFU0MgKi8KKwkgICAgZGVidWcoRjEwMSwiY21pZmkgZXNjLCB4YyIsIiIseGMpOworCSAgICBpZiAoeGMgPT0gMCkgeworCQlpZiAoKnhkZWYpIHsKKwkJICAgIHByaW50ZigiJXMgIix4ZGVmKTsgLyogSWYgYXQgYmVnaW5uaW5nIG9mIGZpZWxkICovCisjaWZkZWYgR0VNRE9TCisJCSAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZiAvKiBHRU1ET1MgKi8KKwkJICAgIGlud29yZCA9IGNtZmxncyA9IDA7CisJCSAgICBhZGRidWYoeGRlZik7CS8qIFN1cHBseSBkZWZhdWx0LiAqLworCQkgICAgaWYgKHNldGF0bSh4ZGVmLDApIDwgMCkgeworCQkJcHJpbnRmKCJEZWZhdWx0IG5hbWUgdG9vIGxvbmdcbiIpOworCQkJaWYgKG5wKSBmcmVlKG5wKTsKKwkJCXJldHVybigtOSk7CisJCSAgICB9CisJCX0gZWxzZSB7CQkvKiBObyBkZWZhdWx0ICovCisJCSAgICBibGVlcChCUF9XQVJOKTsKKwkJfQorCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoKip4cCA9PSAneycpIHsJCS8qIERpZCB1c2VyIHR5cGUgb3BlbmluZyBicmFjZS4uLiAqLworCQkqeHAgPSAqeHAgKyAxOworCQl4Yy0tOworCQljYy0tOworCQlxZmxhZyA9ICd9JzsKKwkgICAgfSBlbHNlIGlmIChkYmxxdW8gJiYgKip4cCA9PSAnIicpIHsJLyogb3IgZG91YmxlcXVvdGU/ICovCisJCSp4cCA9ICp4cCArIDE7CQkvKiBJZiBzbyBpZ25vcmUgaXQgYW5kIHNwYWNlIHBhc3QgaXQgKi8KKwkJeGMtLTsKKwkJY2MtLTsKKwkJcWZsYWcgPSAnIic7CisJICAgIH0KKyNpZm5kZWYgTk9TUEwKKwkgICAgaWYgKGYpIHsJCQkvKiBJZiBhIGNvbnZlcnNpb24gZnVuY3Rpb24gaXMgZ2l2ZW4gKi8KKyNpZmRlZiBET0NIS1ZBUgorCQljaGFyICpzID0gKnhwOwkJLyogU2VlIGlmIHRoZXJlIGFyZSBhbnkgdmFyaWFibGVzIGluICovCisJCXdoaWxlICgqcykgewkJLyogdGhlIHN0cmluZyBhbmQgaWYgc28sIGV4cGFuZCBpdC4gICovCisJCSAgICBpZiAoY2hrdmFyKHMpKSB7CisjZW5kaWYgLyogRE9DSEtWQVIgKi8KKwkJCXpxID0gYXR4YnVmOworCQkJYXR4biA9IENNREJMOworCQkJaWYgKCh4ID0gKCpmKSgqeHAsJnpxLCZhdHhuKSkgPCAwKSB7CisJCQkgICAgaWYgKG5wKSBmcmVlKG5wKTsKKwkJCSAgICByZXR1cm4oLTIpOworCQkJfQorI2lmZGVmIERPQ0hLVkFSCisJCSAgICAvKiByZWR1Y2UgY2MgYnkgbnVtYmVyIG9mIFxcIGNvbnN1bWVkIGJ5IGNvbnZlcnNpb24gKi8KKwkJICAgIC8qIGZ1bmN0aW9uIChuZWVkZWQgZm9yIE9TLzIsIHdoZXJlIFwgaXMgcGF0aCBzZXBhcmF0b3IpICovCisJCQljYyAtPSAoc3RybGVuKCp4cCkgLSBzdHJsZW4oYXR4YnVmKSk7CisjZW5kaWYgLyogRE9DSEtWQVIgKi8KKwkJCSp4cCA9IGF0eGJ1ZjsKKwkJCWlmICghYXR4YnVmWzBdKSB7IC8qIFJlc3VsdCBlbXB0eSwgdXNlIGRlZmF1bHQgKi8KKwkJCSAgICAqeHAgPSB4ZGVmOworCQkJICAgIGNjID0gc3RybGVuKHhkZWYpOworCQkJfQorI2lmZGVmIERPQ0hLVkFSCisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIHMrKzsKKwkJfQorI2VuZGlmIC8qIERPQ0hLVkFSICovCisJICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZkZWYgRFRJTERFCisJICAgIGlmIChkaXJmbGcgJiYgKigqeHApID09ICd+JykgeworCQlkZWJ1ZyhGMTExLCJjbWlmaSB0aWxkZV9leHBhbmQgQSIsKnhwLGNjKTsKKwkJZGlycCA9IHRpbGRlX2V4cGFuZCgqeHApOyAvKiBFeHBhbmQgdGlsZGUsIGlmIGFueS4uLiAqLworCQlpZiAoIWRpcnApIGRpcnAgPSAiIjsKKwkJaWYgKCpkaXJwKSB7CisJCSAgICBpbnQgaSwgeHg7CisJCSAgICBjaGFyICogc3A7CisJCSAgICB4YyA9IGNjOwkJLyogTGVuZ3RoIG9mIH50aGluZyAqLworCQkgICAgeHggPSBzZXRhdG0oZGlycCwwKTsgLyogQ29weSBleHBhbnNpb24gdG8gYXRvbSBidWZmZXIgKi8KKwkJICAgIGRlYnVnKEYxMTEsImNtaWZpIHRpbGRlX2V4cGFuZCBCIixhdG1idWYsY2MpOworCQkgICAgaWYgKHh4IDwgMCkgeworCQkJcHJpbnRmKCJFeHBhbmRlZCBuYW1lIHRvbyBsb25nXG4iKTsKKwkJCWlmIChucCkgZnJlZShucCk7CisJCQlyZXR1cm4oLTkpOworCQkgICAgfQorCQkgICAgZGVidWcoRjExMSwiY21pZmkgdGlsZGVfZXhwYW5kIHhjIiwiIix4Yyk7CisJCSAgICBmb3IgKGkgPSAwOyBpIDwgeGM7IGkrKykgeworCQkJY21kY2hhcmRlbCgpOwkvKiBCYWNrIHVwIG92ZXIgfnRoaW5nICovCisJCQlicC0tOworCQkgICAgfQorCQkgICAgeGMgPSBjYzsJCS8qIEhvdyBtYW55IG5ldyBvbmVzIHdlIGp1c3QgZ290ICovCisJCSAgICBzcCA9IGF0bWJ1ZjsKKwkJICAgIHByaW50ZigiJXMiLHNwKTsJLyogUHJpbnQgdGhlbSAqLworCQkgICAgd2hpbGUgKCgqYnArKyA9ICpzcCsrKSkgOwkvKiBDb3B5IHRvIGNvbW1hbmQgYnVmZmVyICovCisJCSAgICBicC0tOwkgICAgCSAgICAgICAgLyogQmFjayB1cCBvdmVyIE5VTCAqLworCQl9CisJCSp4cCA9IGF0bWJ1ZjsKKwkgICAgfQorI2VuZGlmIC8qIERUSUxERSAqLworCisJICAgIHNwID0gKnhwICsgY2M7CisKKyNpZmRlZiBVTklYT1JPU0sKKwkgICAgaWYgKCFzdHJjbXAoYXRtYnVmLCIuLiIpKSB7CisJCXByaW50ZigiICIpOworCQlja3N0cm5jYXQoY21kYnVmLCIgIixDTURCTCk7CisJCWNjKys7CisJCWJwKys7CisJCSp3aWxkID0gMDsKKwkJKnhwID0gYXRtYnVmOworCQlicmVhazsKKwkgICAgfSBlbHNlIGlmICghc3RyY21wKGF0bWJ1ZiwiLiIpKSB7CisJCWJsZWVwKEJQX1dBUk4pOworCQlpZiAobnApIGZyZWUobnApOworCQlyZXR1cm4oLTEpOworCSAgICB9IGVsc2UgeworCQkvKiBUaGlzIHBhdGNoZXMgYSBnbGl0Y2ggd2hlbiB1c2VyIHR5cGVzICIuL2ZvbzxFU0M+IiAqLworCQkvKiBpbiB3aGljaCB0aGUgbmV4dCB0d28gY2hhcnMgYXJlIG9taXR0ZWQgZnJvbSB0aGUgKi8KKwkJLyogZXhwYW5zaW9uLiAgVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIGZpeCwgaG93ZXZlciwgKi8KKwkJLyogc2luY2UgdGhlcmUgaXMgbm8gcHJvYmxlbSB3aXRoICIuLi9mb288RVNDPiIuICovCisJCWNoYXIgKnAgPSAqeHA7CisJCWlmICgqcCA9PSAnLicgJiYgKihwKzEpID09ICcvJykKKwkJICBjYyAtPSAyOworCSAgICB9CisjZW5kaWYgLyogVU5JWE9ST1NLICovCisKKyNpZmRlZiBkYXRhZ2VuZXJhbAorCSAgICAqc3ArKyA9ICcrJzsJCS8qIERhdGEgR2VuZXJhbCBBT1Mgd2lsZGNhcmQgKi8KKyNlbHNlCisJICAgICpzcCsrID0gJyonOwkJLyogT3RoZXJzICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKwkgICAgKnNwLS0gPSAnXDAnOworI2lmZGVmIEdFTURPUworCSAgICBpZiAoIXN0cmNocigqeHAsICcuJykpCS8qIGFiZGUuZSAtPiBhYmNkZS5lKiAqLworCSAgICAgIHN0cmNhdCgqeHAsICIuKiIpOwkvKiBhYmMgLT4gYWJjKi4qICovCisjZW5kaWYgLyogR0VNRE9TICovCisJICAgIC8qIEFkZCB3aWxkY2FyZCBhbmQgZXhwYW5kIGxpc3QuICovCisjaWZkZWYgQ09NTUVOVAorCSAgICAvKiBUaGlzIGtpbGxzIHBhcnRpYWwgY29tcGxldGlvbiB3aGVuIEVTQyBnaXZlbiBpbiBwYXRoIHNlZ21lbnQgKi8KKwkgICAgbnp4b3B0cyB8PSBkaXJmbGcgPyBaWF9ESVJPTkxZIDogKGQgPyAwIDogWlhfRklMT05MWSk7CisjZWxzZQorCSAgICAvKiBuenhvcHRzID0gMDsgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisJICAgIGlmIChtYXRjaGRvdCkgIG56eG9wdHMgfD0gWlhfTUFUQ0hET1Q7CisJICAgIGlmIChyZWN1cnNpdmUpIG56eG9wdHMgfD0gWlhfUkVDVVJTRTsKKwkgICAgeSA9IG56eHBhbmQoKnhwLG56eG9wdHMpOworCSAgICBuZmlsZXMgPSB5OworCSAgICBkZWJ1ZyhGMTExLCJjbWlmaSBuenhwYW5kIiwqeHAseSk7CisJICAgIGlmICh5ID4gMCkgeworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgIHpuZXh0KGZpbGJ1Zik7CQkvKiBHZXQgZmlyc3QgKi8KKyNpZmRlZiBaWFJFV0lORAorCQl6eHJld2luZCgpOwkJLyogTXVzdCAicmV3aW5kIiAqLworI2Vsc2UKKwkJbnp4cGFuZCgqeHAsbnh6b3B0cyk7CisjZW5kaWYgLyogWlhSRVdJTkQgKi8KKyNlbHNlICAvKiBOb3QgT1MyICovCisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGZpbGJ1ZixtdGNoc1swXSxDS01BWFBBVEgpOworI2VuZGlmIC8qIE9TMiAqLworCSAgICB9IGVsc2UKKwkgICAgICAqZmlsYnVmID0gJ1wwJzsKKwkgICAgZmlsYnVmW0NLTUFYUEFUSF0gPSBOVUw7CisJICAgICpzcCA9ICdcMCc7CQkJLyogUmVtb3ZlIHdpbGRjYXJkLiAqLworCSAgICBkZWJ1ZyhGMTExLCJjbWlmaSBmaWxidWYiLGZpbGJ1Zix5KTsKKwkgICAgZGVidWcoRjExMSwiY21pZmkgKnhwIiwqeHAsY2MpOworCisJICAgICp3aWxkID0gKHkgPiAxKTsKKwkgICAgaWYgKHkgPT0gMCkgeworCQlpZiAoIW5vbXNnKSB7CisjaWZkZWYgQ0tST09UCisJCSAgICBpZiAoY2tyb290ZXJyKQorCQkgICAgICBwcmludGYoIj9PZmYgTGltaXRzOiAlc1xuIixhdG1idWYpOworCQkgICAgZWxzZQorI2VuZGlmIC8qIENLUk9PVCAqLworCQkgICAgICBwcmludGYoIj9ObyAlcyBtYXRjaCAtICVzXG4iLAorCQkJICAgZGlyZmxnID8gImRpcmVjdG9yaWVzIiA6ICJmaWxlcyIsIGF0bWJ1Zik7CisJCSAgICBpZiAobnApIGZyZWUobnApOworCQkgICAgcmV0dXJuKC05KTsKKwkJfSBlbHNlIHsKKwkJICAgIGJsZWVwKEJQX1dBUk4pOworCQkgICAgaWYgKG5wKSBmcmVlKG5wKTsKKwkJICAgIHJldHVybigtMSk7CisJCX0KKwkgICAgfSBlbHNlIGlmICh5IDwgMCkgeworI2lmZGVmIENLUk9PVAorCQlpZiAoY2tyb290ZXJyKQorCQkgIHByaW50ZigiP09mZiBMaW1pdHM6ICVzXG4iLGF0bWJ1Zik7CisJCWVsc2UKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKwkJICBwcmludGYoIj9Ub28gbWFueSAlcyBtYXRjaCAtICVzXG4iLAorCQkJIGRpcmZsZyA/ICJkaXJlY3RvcmllcyIgOiAiZmlsZXMiLCBhdG1idWYpOworCQlpZiAobnApIGZyZWUobnApOworCQlyZXR1cm4oLTkpOworCSAgICB9IGVsc2UgaWYgKHkgPiAxCQkvKiBOb3QgdW5pcXVlICovCisjaWZuZGVmIFZNUworCQkgICAgICAgfHwgKHkgPT0gMSAmJiBpc2RpcihmaWxidWYpKSAvKiBVbmlxdWUgZGlyZWN0b3J5ICovCisjZW5kaWYgLyogVk1TICovCisJCSAgICAgICApIHsKKyNpZm5kZWYgTk9QQVJUSUFMCisvKiBQYXJ0aWFsIGZpbGVuYW1lIGNvbXBsZXRpb24gKi8KKwkJaW50IGosIGs7IGNoYXIgYzsKKwkJayA9IDA7CisJCWRlYnVnKEYxMTEsImNtaWZpIHBhcnRpYWwiLGZpbGJ1ZixjYyk7CisjaWZkZWYgT1MyCisJCXsKKwkJICAgIGludCBjdXIgPSAwLAorCQkgICAgbGVuID0gMCwKKwkJICAgIGxlbjIgPSAwLAorCQkgICAgbWluID0gc3RybGVuKGZpbGJ1ZiksCisJCSAgICBmb3VuZCA9IDA7CisJCSAgICBjaGFyIGxvY2FsZm5bQ0tNQVhQQVRIKzFdOworCisJCSAgICBsZW4gPSBtaW47CisJCSAgICBmb3IgKGogPSAxOyBqIDw9IHk7IGorKykgeworCQkJem5leHQobG9jYWxmbik7CisJCQlpZiAoZGlyZmxnICYmICFpc2Rpcihsb2NhbGZuKSkKKwkJCSAgY29udGludWU7CisJCQlmb3VuZCA9IDE7CisJCQlsZW4yID0gc3RybGVuKGxvY2FsZm4pOworCQkJZm9yIChjdXIgPSBjYzsKKwkJCSAgICAgY3VyIDwgbGVuICYmIGN1ciA8IGxlbjIgJiYgY3VyIDw9IG1pbjsKKwkJCSAgICAgY3VyKysKKwkJCSAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT1MvMiBvciBXaW5kb3dzLCBjYXNlIGRvZXNuJ3QgbWF0dGVyICovCisJCQkgICAgaWYgKHRvbG93ZXIoZmlsYnVmW2N1cl0pICE9IHRvbG93ZXIobG9jYWxmbltjdXJdKSkKKwkJCSAgICAgIGJyZWFrOworCQkJfQorCQkJaWYgKGN1ciA8IG1pbikKKwkJCSAgbWluID0gY3VyOworCQkgICAgfQorCQkgICAgaWYgKCFmb3VuZCkKKwkJICAgICAgbWluID0gY2M7CisJCSAgICBmaWxidWZbbWluXSA9IE5VTDsKKwkJICAgIGlmIChtaW4gPiBjYykKKwkJICAgICAgaysrOworCQl9CisjZWxzZSAvKiBPUzIgKi8KKwkJZm9yIChpID0gY2M7IChjID0gZmlsYnVmW2ldKTsgaSsrKSB7CisJCSAgICBmb3IgKGogPSAxOyBqIDwgeTsgaisrKQorCQkgICAgICBpZiAobXRjaHNbal1baV0gIT0gYykgYnJlYWs7CisJCSAgICBpZiAoaiA9PSB5KSBrKys7CisJCSAgICBlbHNlIGZpbGJ1ZltpXSA9IGZpbGJ1ZltpKzFdID0gTlVMOworCQl9CisjZW5kaWYgLyogT1MyICovCisKKworI2lmbmRlZiBWTVMKKwkJLyogaXNkaXIoKSBmdW5jdGlvbiByZXF1aXJlZCBmb3IgdGhpcyEgKi8KKwkJaWYgKHkgPT0gMSAmJiBpc2RpcihmaWxidWYpKSB7IC8qIERvbnQgd2UgYWxyZWFkeSBrbm93IHRoaXM/ICovCisJCSAgICBpbnQgbGVuOworCQkgICAgbGVuID0gc3RybGVuKGZpbGJ1Zik7CisJCSAgICBpZiAobGVuID4gMCAmJiBsZW4gPCBBVE1CTCAtIDEpIHsKKwkJCWlmIChmaWxidWZbbGVuLTFdICE9IGRpcnNlcCkgeworCQkJICAgIGZpbGJ1ZltsZW5dID0gZGlyc2VwOworCQkJICAgIGZpbGJ1ZltsZW4rMV0gPSBOVUw7CisJCQl9CisJCSAgICB9CisvKgorICBBdCB0aGlzIHBvaW50LCBiZWZvcmUganVzdCBkb2luZyBwYXJ0aWFsIGNvbXBsZXRpb24sIHdlIHNob3VsZCBsb29rIGZpcnN0IHRvCisgIHNlZSBpZiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGRvZXMgaW5kZWVkIGhhdmUgYW55IHN1YmRpcmVjdG9yaWVzIChkaXJmbGcpIG9yCisgIGZpbGVzICghZGlyZmxnKTsgaWYgaXQgZG9lc24ndCB3ZSBzaG91bGQgZG8gZnVsbCBjb21wbGV0aW9uLiAgT3RoZXJ3aXNlLCB0aGUKKyAgcmVzdWx0IGxvb2tzIGZ1bm55IHRvIHRoZSB1c2VyIGFuZCAiPyIgYmxvd3MgdXAgdGhlIGNvbW1hbmQgZm9yIG5vIGdvb2QKKyAgcmVhc29uLgorKi8KKwkJICAgIHsKKwkJCWludCBmbGFncyA9IDA7CisJCQlmaWxidWZbbGVuKzFdID0gJyonOworCQkJZmlsYnVmW2xlbisyXSA9IE5VTDsKKwkJCWlmIChkaXJmbGcpIGZsYWdzID0gWlhfRElST05MWTsKKwkJCWNoaWxkcmVuID0gbnp4cGFuZChmaWxidWYsZmxhZ3MpOworCQkJZGVidWcoRjExMSwiY21pZmkgY2hpbGRyZW4iLGZpbGJ1ZixjaGlsZHJlbik7CisJCQlmaWxidWZbbGVuKzFdID0gTlVMOworCQkJbnp4cGFuZChmaWxidWYsZmxhZ3MpOyAvKiBSZXN0b3JlIHByZXZpb3VzIGxpc3QgKi8KKwkJCWlmIChjaGlsZHJlbiA9PSAwKQorCQkJICBnb3RvIE5PU1VCRElSUzsKKwkJICAgIH0KKwkJICAgIGlmIChsZW4gKyAxID4gY2MpCisJCSAgICAgIGsrKzsKKwkJfQorICAgICAgICAgICAgICAgIC8qIEFkZCBkb3VibGVxdW90ZXMgaWYgdGhlcmUgYXJlIHNwYWNlcyBpbiB0aGUgbmFtZSAqLworCQl7CisJCSAgICBpbnQgeDsKKwkJICAgIGlmIChxZmxhZykgeworCQkJeCA9IChxZmxhZyA9PSAnfScpOyAvKiAob3IgYnJhY2VzKSAqLworCQkgICAgfSBlbHNlIHsKKwkJCXggPSAhZGJscXVvOworCQkgICAgfQorCQkgICAgaWYgKGZpbGJ1ZlswXSAhPSAnIicgJiYgZmlsYnVmWzBdICE9ICd7JykKKwkJICAgICAgayA9IGRxdW90ZShmaWxidWYsQVRNQkwseCk7CisJCX0KKyNlbmRpZiAvKiBWTVMgKi8KKwkJZGVidWcoRjExMSwiY21pZmkgUkVQQUlOVCBmaWxidWYiLGZpbGJ1ZixrKTsKKwkJaWYgKGsgPiAwKSB7CQkvKiBHb3QgbW9yZSBjaGFyYWN0ZXJzICovCisJCSAgICBkZWJ1ZyhGMTAxLCJjbWlmaSBSRVBBSU5UIGNjIiwiIixjYyk7CisJCSAgICBkZWJ1ZyhGMTAxLCJjbWlmaSBSRVBBSU5UIHhjIiwiIix4Yyk7CisJCSAgICBkZWJ1ZyhGMTEwLCJjbWlmaSBSRVBBSU5UIGJwLWNjIixicC1jYywwKTsKKwkJICAgIGRlYnVnKEYxMTAsImNtaWZpIFJFUEFJTlQgYnAteGMiLGJwLXhjLDApOworCQkgICAgc3AgPSBmaWxidWYgKyBjYzsJLyogUG9pbnQgdG8gbmV3IG9uZXMgKi8KKwkJICAgIGlmIChxZmxhZyB8fCBzdHJuY21wKGZpbGJ1ZixicC1jYyxjYykpIHsgLyogUmVwYWludD8gKi8KKwkJCWludCB4OworCQkJeCA9IGNjOworCQkJaWYgKHFmbGFnKSB4Kys7CisJCQlmb3IgKGkgPSAwOyBpIDwgeDsgaSsrKSB7CisJCQkgICAgY21kY2hhcmRlbCgpOyAvKiBCYWNrIHVwIG92ZXIgb2xkIHBhcnRpYWwgc3BlYyAqLworCQkJICAgIGJwLS07CisJCQl9CisJCQlzcCA9IGZpbGJ1ZjsJLyogUG9pbnQgdG8gbmV3IHdvcmQgc3RhcnQgKi8KKwkJCWRlYnVnKEYxMTAsImNtaWZpIGVyYXNlIG9rIixzcCwwKTsKKwkJICAgIH0KKwkJICAgIGNjID0gazsJCS8qIEhvdyBtYW55IG5ldyBvbmVzIHdlIGp1c3QgZ290ICovCisJCSAgICBwcmludGYoIiVzIixzcCk7CS8qIFByaW50IHRoZW0gKi8KKwkJICAgIHdoaWxlICgoKmJwKysgPSAqc3ArKykpIDsJLyogQ29weSB0byBjb21tYW5kIGJ1ZmZlciAqLworCQkgICAgYnAtLTsJICAgIAkgICAgICAgIC8qIEJhY2sgdXAgb3ZlciBOVUwgKi8KKwkJICAgIGRlYnVnKEYxMTAsImNtaWZpIHBhcnRpYWwgY21kYnVmIixjbWRidWYsMCk7CisJCSAgICBpZiAoc2V0YXRtKGZpbGJ1ZiwwKSA8IDApIHsKKwkJCXByaW50ZigiP1BhcnRpYWwgbmFtZSB0b28gbG9uZ1xuIik7CisJCQlpZiAobnApIGZyZWUobnApOworCQkJcmV0dXJuKC05KTsKKwkJICAgIH0KKwkJICAgIGRlYnVnKEYxMTEsImNtaWZpIHBhcnRpYWwgYXRtYnVmIixhdG1idWYsY2MpOworCQkgICAgKnhwID0gYXRtYnVmOworCQl9CisjZW5kaWYgLyogTk9QQVJUSUFMICovCisJCWJsZWVwKEJQX1dBUk4pOworCSAgICB9IGVsc2UgewkJCS8qIFVuaXF1ZSwgY29tcGxldGUgaXQuICAqLworI2lmbmRlZiBWTVMKKyNpZmRlZiBDS19UTVBESVIKKwkJLyogaXNkaXIoKSBmdW5jdGlvbiByZXF1aXJlZCBmb3IgdGhpcyEgKi8KKwkgICAgICBOT1NVQkRJUlM6CisJCWRlYnVnKEYxMTEsImNtaWZpIHVuaXF1ZSIsZmlsYnVmLGNoaWxkcmVuKTsKKwkJaWYgKGlzZGlyKGZpbGJ1ZikgJiYgY2hpbGRyZW4gPiAwKSB7CisJCSAgICBpbnQgbGVuOworCQkgICAgbGVuID0gc3RybGVuKGZpbGJ1Zik7CisJCSAgICBpZiAobGVuID4gMCAmJiBsZW4gPCBBVE1CTCAtIDEpIHsKKwkJCWlmIChmaWxidWZbbGVuLTFdICE9IGRpcnNlcCkgeworCQkJICAgIGZpbGJ1ZltsZW5dID0gZGlyc2VwOworCQkJICAgIGZpbGJ1ZltsZW4rMV0gPSBOVUw7CisJCQl9CisJCSAgICB9CisJCSAgICBzcCA9IGZpbGJ1ZiArIGNjOworCQkgICAgYmxlZXAoQlBfV0FSTik7CisJCSAgICBwcmludGYoIiVzIixzcCk7CisJCSAgICBjYysrOworCQkgICAgd2hpbGUgKCgqYnArKyA9ICpzcCsrKSkgOworCQkgICAgYnAtLTsKKwkJICAgIGlmIChzZXRhdG0oZmlsYnVmLDApIDwgMCkgeworCQkJcHJpbnRmKCI/RGlyZWN0b3J5IG5hbWUgdG9vIGxvbmdcbiIpOworCQkJaWYgKG5wKSBmcmVlKG5wKTsKKwkJCXJldHVybigtOSk7CisJCSAgICB9CisJCSAgICBkZWJ1ZyhGMTExLCJjbWlmaSBkaXJlY3RvcnkgYXRtYnVmIixhdG1idWYsY2MpOworCQkgICAgKnhwID0gYXRtYnVmOworCQl9IGVsc2UgewkJLyogTm90IGEgZGlyZWN0b3J5IG9yIGRpcmZsZyAqLworI2VuZGlmIC8qIENLX1RNUERJUiAqLworI2VuZGlmIC8qIFZNUyAqLworI2lmbmRlZiBWTVMJCQkJLyogVk1TIGRpciBuYW1lcyBhcmUgc3BlY2lhbCAqLworI2lmbmRlZiBkYXRhZ2VuZXJhbAkJCS8qIFZTIGRpcm5hbWVzIG11c3Qgbm90IGVuZCBpbiAiOiIgKi8KKwkJICAgIGlmIChkaXJmbGcpIHsKKwkJCWludCBsZW47CisJCQlsZW4gPSBzdHJsZW4oZmlsYnVmKTsKKwkJCWlmIChsZW4gPiAwICYmIGxlbiA8IEFUTUJMIC0gMSkgeworCQkJICAgIGlmIChmaWxidWZbbGVuLTFdICE9IGRpcnNlcCkgeworCQkJCWZpbGJ1ZltsZW5dID0gZGlyc2VwOworCQkJCWZpbGJ1ZltsZW4rMV0gPSBOVUw7CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogVk1TICovCisJCSAgICBzcCA9IGZpbGJ1ZiArIGNjOwkvKiBQb2ludCBwYXN0IHdoYXQgdXNlciB0eXBlZC4gKi8KKwkJICAgIHsKKwkJCWludCB4OworCQkJaWYgKHFmbGFnKSB7CisJCQkgICAgeCA9IChxZmxhZyA9PSAnfScpOworCQkJfSBlbHNlIHsKKwkJCSAgICB4ID0gIWRibHF1bzsKKwkJCX0KKwkJCWlmIChmaWxidWZbMF0gIT0gJyInICYmIGZpbGJ1ZlswXSAhPSAneycpCisJCQkgIGRxdW90ZShmaWxidWYsQVRNQkwseCk7CisJCSAgICB9CisJCSAgICBpZiAocWZsYWcgfHwgc3RybmNtcChmaWxidWYsYnAtY2MsY2MpKSB7IC8qIFJlcGFpbnQ/ICovCisJCQlpbnQgeDsKKwkJCXggPSBjYzsKKwkJCWlmIChxZmxhZykgeCsrOworCQkJZm9yIChpID0gMDsgaSA8IHg7IGkrKykgeworCQkJICAgIGNtZGNoYXJkZWwoKTsgLyogQmFjayB1cCBvdmVyIG9sZCBwYXJ0aWFsIHNwZWMgKi8KKwkJCSAgICBicC0tOworCQkJfQorCQkJc3AgPSBmaWxidWY7CS8qIFBvaW50IHRvIG5ldyB3b3JkIHN0YXJ0ICovCisJCQlkZWJ1ZyhGMTExLCJjbWlmaSBhZnRlciBlcmFzZSBzcD0iLHNwLGNjKTsKKwkJICAgIH0KKwkJICAgIHByaW50ZigiJXMgIixzcCk7CS8qIFByaW50IHRoZSBjb21wbGV0ZWQgbmFtZS4gKi8KKyNpZmRlZiBHRU1ET1MKKwkJICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmIC8qIEdFTURPUyAqLworCQkgICAgYWRkYnVmKHNwKTsJCS8qIEFkZCB0aGUgY2hhcmFjdGVycyB0byBjbWRidWYuICovCisJCSAgICBpZiAoc2V0YXRtKGZpbGJ1ZiwwKSA8IDApIHsgLyogQW5kIHRvIGF0bWJ1Zi4gKi8KKwkJCXByaW50ZigiP0NvbXBsZXRlZCBuYW1lIHRvbyBsb25nXG4iKTsKKwkJCWlmIChucCkgZnJlZShucCk7CisJCQlyZXR1cm4oLTkpOworCQkgICAgfQorCQkgICAgaW53b3JkID0gY21mbGdzID0gMDsKKwkJICAgICp4cCA9IGJyc3RyaXAoYXRtYnVmKTsgLyogUmV0dXJuIHBvaW50ZXIgdG8gYXRtYnVmLiAqLworCQkgICAgaWYgKGRpcmZsZyAmJiAhaXNkaXIoKnhwKSkgeworCQkJcHJpbnRmKCI/Tm90IGEgZGlyZWN0b3J5IC0gJXNcbiIsIGZpbGJ1Zik7CisJCQlpZiAobnApIGZyZWUobnApOworCQkJcmV0dXJuKC05KTsKKwkJICAgIH0KKwkJICAgIGlmIChucCkgZnJlZShucCk7CisJCSAgICByZXR1cm4oMCk7CisjaWZuZGVmIFZNUworI2lmZGVmIENLX1RNUERJUgorCQl9CisjZW5kaWYgLyogQ0tfVE1QRElSICovCisjZW5kaWYgLyogVk1TICovCisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgMzoJCQkvKiBRdWVzdGlvbiBtYXJrIC0gZmlsZSBtZW51IHdhbnRlZCAqLworCSAgICBpZiAoKnhobHAgPT0gTlVMKQorCSAgICAgIHByaW50ZihkaXJmbGcgPyAiIERpcmVjdG9yeSBuYW1lIiA6ICIgSW5wdXQgZmlsZSBzcGVjaWZpY2F0aW9uIik7CisJICAgIGVsc2UKKwkgICAgICBwcmludGYoIiAlcyIseGhscCk7CisjaWZkZWYgR0VNRE9TCisJICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmIC8qIEdFTURPUyAqLworCSAgICAvKiBJZiB1c2VyIHR5cGVkIGFuIG9wZW5pbmcgcXVvdGUgb3IgYnJhY2UsIGp1c3Qgc2tpcCBwYXN0IGl0ICovCisKKwkgICAgaWYgKCoqeHAgPT0gJyInIHx8ICoqeHAgPT0gJ3snKSB7CisJCSp4cCA9ICp4cCArIDE7CisJCXhjLS07CisJCWNjLS07CisJICAgIH0KKyNpZm5kZWYgTk9TUEwKKwkgICAgaWYgKGYpIHsJCQkvKiBJZiBhIGNvbnZlcnNpb24gZnVuY3Rpb24gaXMgZ2l2ZW4gKi8KKyNpZmRlZiBET0NIS1ZBUgorCQljaGFyICpzID0gKnhwOwkJLyogU2VlIGlmIHRoZXJlIGFyZSBhbnkgdmFyaWFibGVzIGluICovCisJCXdoaWxlICgqcykgewkJLyogdGhlIHN0cmluZyBhbmQgaWYgc28sIGV4cGFuZCB0aGVtICovCisJCSAgICBpZiAoY2hrdmFyKHMpKSB7CisjZW5kaWYgLyogRE9DSEtWQVIgKi8KKwkJCXpxID0gYXR4YnVmOworCQkJYXR4biA9IENNREJMOworCQkJaWYgKCh4ID0gKCpmKSgqeHAsJnpxLCZhdHhuKSkgPCAwKSB7CisJCQkgICAgaWYgKG5wKSBmcmVlKG5wKTsKKwkJCSAgICByZXR1cm4oLTIpOworCQkJfQorI2lmZGVmIERPQ0hLVkFSCisJCSAgICAvKiByZWR1Y2UgY2MgYnkgbnVtYmVyIG9mIFxcIGNvbnN1bWVkIGJ5IGNvbnZlcnNpb24gKi8KKwkJICAgIC8qIGZ1bmN0aW9uIChuZWVkZWQgZm9yIE9TLzIsIHdoZXJlIFwgaXMgcGF0aCBzZXBhcmF0b3IpICovCisJCQljYyAtPSAoc3RybGVuKCp4cCkgLSBzdHJsZW4oYXR4YnVmKSk7CisjZW5kaWYgLyogRE9DSEtWQVIgKi8KKwkJCSp4cCA9IGF0eGJ1ZjsKKyNpZmRlZiBET0NIS1ZBUgorCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICBzKys7CisJCX0KKyNlbmRpZiAvKiBET0NIS1ZBUiAqLworCSAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKwkgICAgZGVidWcoRjExMSwiY21pZmkgPyAqeHAsIGNjIiwqeHAsY2MpOworCSAgICBzcCA9ICp4cCArIGNjOwkJLyogSW5zZXJ0ICIqIiBhdCBlbmQgKi8KKyNpZmRlZiBkYXRhZ2VuZXJhbAorCSAgICAqc3ArKyA9ICcrJzsJCS8qIEluc2VydCArLCB0aGUgREcgd2lsZCBjYXJkICovCisjZWxzZQorCSAgICAqc3ArKyA9ICcqJzsKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworCSAgICAqc3AtLSA9ICdcMCc7CisjaWZkZWYgR0VNRE9TCisJICAgIGlmICghIHN0cmNocigqeHAsICcuJykpCS8qIGFiZGUuZSAtPiBhYmNkZS5lKiAqLworCSAgICAgIHN0cmNhdCgqeHAsICIuKiIpOwkvKiBhYmMgLT4gYWJjKi4qICovCisjZW5kaWYgLyogR0VNRE9TICovCisJICAgIGRlYnVnKEYxMTAsImNtaWZpID8gd2lsZCIsKnhwLDApOworCisJICAgIG56eG9wdHMgfD0gZGlyZmxnID8gWlhfRElST05MWSA6IChkID8gMCA6IFpYX0ZJTE9OTFkpOworCisJICAgIGRlYnVnKEYxMDEsImNtaWZpIG1hdGNoZG90IiwiIixtYXRjaGRvdCk7CisJICAgIGlmIChtYXRjaGRvdCkgIG56eG9wdHMgfD0gWlhfTUFUQ0hET1Q7CisJICAgIGlmIChyZWN1cnNpdmUpIG56eG9wdHMgfD0gWlhfUkVDVVJTRTsKKwkgICAgeSA9IG56eHBhbmQoKnhwLG56eG9wdHMpOworCSAgICBuZmlsZXMgPSB5OworCSAgICAqc3AgPSAnXDAnOworCSAgICBpZiAoeSA9PSAwKSB7CisJCWlmIChub21zZykgeworCQkgICAgcHJpbnRmKCI6ICVzXG4iLGF0bWJ1Zik7CisJCSAgICBwcmludGYoIiVzJXMiLGNtcHJvbSxjbWRidWYpOworCQkgICAgZmZsdXNoKHN0ZG91dCk7CisJCSAgICBpZiAobnApIGZyZWUobnApOworCQkgICAgcmV0dXJuKC0xKTsKKwkJfSBlbHNlIHsKKyNpZmRlZiBDS1JPT1QKKwkJICAgIGlmIChja3Jvb3RlcnIpCisJCSAgICAgIHByaW50ZigiP09mZiBMaW1pdHM6ICVzXG4iLGF0bWJ1Zik7CisJCSAgICBlbHNlCisjZW5kaWYgLyogQ0tST09UICovCisJCSAgICAgIHByaW50ZigiP05vICVzIG1hdGNoIC0gJXNcbiIsCisJCQkgICAgIGRpcmZsZyA/ICJkaXJlY3RvcmllcyIgOiAiZmlsZXMiLCBhdG1idWYpOworCQkgICAgaWYgKG5wKSBmcmVlKG5wKTsKKwkJICAgIHJldHVybigtOSk7CisJCX0KKwkgICAgfSBlbHNlIGlmICh5IDwgMCkgeworI2lmZGVmIENLUk9PVAorCQlpZiAoY2tyb290ZXJyKQorCQkgIHByaW50ZigiP09mZiBMaW1pdHM6ICVzXG4iLGF0bWJ1Zik7CisJCWVsc2UKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKwkJICBwcmludGYoIj9Ub28gbWFueSAlcyBtYXRjaCAtICVzXG4iLAorCQkJIGRpcmZsZyA/ICJkaXJlY3RvcmllcyIgOiAiZmlsZXMiLCBhdG1idWYpOworCQlpZiAobnApIGZyZWUobnApOworCQlyZXR1cm4oLTkpOworCSAgICB9IGVsc2UgeworCQlwcmludGYoIiwgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4iKTsKKwkJaWYgKGZpbGhlbHAoKGludCl5LCIiLCIiLDEsZGlyZmxnKSA8IDApIHsKKwkJICAgIGlmIChucCkgZnJlZShucCk7CisJCSAgICByZXR1cm4oLTkpOworCQl9CisJICAgIH0KKwkgICAgcHJpbnRmKCIlcyVzIixjbXByb20sY21kYnVmKTsKKwkgICAgZmZsdXNoKHN0ZG91dCk7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIE1BQyAqLworICAgICAgICB9CisjaWZkZWYgQlNfRElSU0VQCisgICAgICAgIGRpcm5hbWZsZyA9IDE7CisgICAgICAgIHggPSBndHdvcmQoMCk7ICAgICAgICAgICAgICAgICAgLyogTm8sIGdldCBhIHdvcmQgKi8KKwlkaXJuYW1mbGcgPSAwOworI2Vsc2UKKyAgICAgICAgeCA9IGd0d29yZCgwKTsgICAgICAgICAgICAgICAgICAvKiBObywgZ2V0IGEgd29yZCAqLworI2VuZGlmIC8qIEJTX0RJUlNFUCAqLworICAgICp4cCA9IGF0bWJ1ZjsKKyAgICB9Cit9CisKKy8qICBDIE0gRiBMIEQgIC0tICBQYXJzZSBhbiBhcmJpdHJhcnkgZmllbGQgICovCisvKgorICBSZXR1cm5zOgorICAgIC0zIGlmIG5vIGlucHV0IHByZXNlbnQgd2hlbiByZXF1aXJlZCwKKyAgICAtMiBpZiBmaWVsZCB0b28gYmlnIGZvciBidWZmZXIsCisgICAgLTEgaWYgcmVwYXJzZSBuZWVkZWQsCisgICAgIDAgb3RoZXJ3aXNlLCB4cCBwb2ludGluZyB0byBzdHJpbmcgcmVzdWx0LgorCisgIE5PVEU6IEdsb2JhbCBmbGFnIGtlZXBhbGxjaGFycyBzYXlzIHdoZXRoZXIgdGhpcyByb3V0aW5lIHNob3VsZCBicmVhayBvbiBDUgorICBvciBMRjogbmVlZGVkIGZvciBNSU5QVVQgdGFyZ2V0cyBhbmQgREVDTEFSRSBpbml0aWFsaXplcnMsIHdoZXJlIHdlIHdhbnQgdG8KKyAga2VlcCBjb250cm9sIGNoYXJhY3RlcnMgaWYgdGhlIHVzZXIgc3BlY2lmaWVzIHRoZW0gKE1hcmNoIDIwMDMpLiAgSXQgbWlnaHQKKyAgaGF2ZSBiZWVuIGJldHRlciB0byBjaGFuZ2UgdGhlIGNhbGxpbmcgc2VxdWVuY2UgYnV0IHRoYXQgd2FzIG5vdCBwcmFjdGljYWwuCisqLworaW50CitjbWZsZCh4aGxwLHhkZWYseHAsZikgY2hhciAqeGhscCwgKnhkZWYsICoqeHA7IHh4X3N0cnAgZjsgeworICAgIGludCB4LCB4YzsKKyAgICBjaGFyICp6cTsKKworICAgIGlud29yZCA9IDA7CQkJCS8qIEluaXRpYWxpemUgY291bnRzICYgcG9pbnRlcnMgKi8KKyAgICBjYyA9IDA7CisgICAgeGMgPSAwOworICAgICp4cCA9ICIiOworCisgICAgZGVidWcoRjExMCwiY21mbGQgeGRlZiAxIix4ZGVmLDApOworCisgICAgaWYgKCF4aGxwKSB4aGxwID0gIiI7CisgICAgaWYgKCF4ZGVmKSB4ZGVmID0gIiI7CisgICAgY2tzdHJuY3B5KGNtZGVmYXVsdCx4ZGVmLENNREVGQVVMVCk7IC8qIENvcHkgZGVmYXVsdCAqLworICAgIHhkZWYgPSBjbWRlZmF1bHQ7CisKKyAgICBkZWJ1ZyhGMTExLCJjbWZsZCB4ZGVmIDIiLHhkZWYsY21mbGdzKTsKKyAgICBkZWJ1ZyhGMTExLCJjbWZsZCBhdG1idWYgMSIsYXRtYnVmLHhjKTsKKworICAgIGlmICgoeCA9IGNtZmxncykgIT0gMSkgeyAgICAgICAgICAgIC8qIEFscmVhZHkgY29uZmlybWVkPyAqLworICAgICAgICB4ID0gZ3R3b3JkKDApOyAgICAgICAgICAgICAgICAgIC8qIE5vLCBnZXQgYSB3b3JkICovCisgICAgfSBlbHNlIHsKKwlpZiAoc2V0YXRtKHhkZWYsMCkgPCAwKSB7CS8qIElmIHNvLCB1c2UgZGVmYXVsdCwgaWYgYW55LiAqLworCSAgICBwcmludGYoIj9EZWZhdWx0IHRvbyBsb25nXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisgICAgfQorICAgICp4cCA9IGF0bWJ1ZjsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIHJlc3VsdC4gKi8KKyAgICBkZWJ1ZyhGMTExLCJjbWZsZCBhdG1idWYgMiIsYXRtYnVmLGNtZmxncyk7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB4YyArPSBjYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IHRoZSBjaGFyYWN0ZXJzLiAqLworICAgICAgICBkZWJ1ZyhGMTExLCJjbWZsZCBndHdvcmQiLGF0bWJ1Zix4Yyk7CisgICAgICAgIGRlYnVnKEYxMDEsImNtZmxkIHgiLCIiLHgpOworICAgICAgICBzd2l0Y2ggKHgpIHsKKwkgIGNhc2UgLTk6CisJICAgIHByaW50ZigiQ29tbWFuZCBvciBmaWVsZCB0b28gbG9uZ1xuIik7CisJICBjYXNlIC00OgkJCS8qIEVPRiAqLworCSAgY2FzZSAtMzoJCQkvKiBFbXB0eS4gKi8KKwkgIGNhc2UgLTI6CQkJLyogT3V0IG9mIHNwYWNlLiAqLworCSAgY2FzZSAtMToJCQkvKiBSZXBhcnNlIG5lZWRlZCAqLworCSAgICByZXR1cm4oeCk7CisJICBjYXNlIDE6CQkJLyogQ1IgKi8KKwkgIGNhc2UgMDoJCQkvKiBTUCAqLworCSAgICBkZWJ1ZyhGMTExLCJjbWZsZCAxIixhdG1idWYseGMpOworCSAgICBpZiAoeGMgPT0gMCkgewkJLyogSWYgbm8gaW5wdXQsIHJldHVybiBkZWZhdWx0LiAqLworCQlpZiAoc2V0YXRtKHhkZWYsMCkgPCAwKSB7CisJCSAgICBwcmludGYoIj9EZWZhdWx0IHRvbyBsb25nXG4iKTsKKwkJICAgIHJldHVybigtOSk7CisJCX0KKwkgICAgfQorCSAgICAqeHAgPSBhdG1idWY7CQkvKiBQb2ludCB0byB3aGF0IHdlIGdvdC4gKi8KKwkgICAgZGVidWcoRjExMSwiY21mbGQgMiIsYXRtYnVmLChmKSA/IDEgOiAwKTsKKwkgICAgaWYgKGYpIHsJCQkvKiBJZiBhIGNvbnZlcnNpb24gZnVuY3Rpb24gaXMgZ2l2ZW4gKi8KKwkJenEgPSBhdHhidWY7CQkvKiBlbXBsb3kgaXQgbm93LiAqLworCQlhdHhuID0gQ01EQkw7CisJCWlmICgoKmYpKCp4cCwmenEsJmF0eG4pIDwgMCkKKwkJICByZXR1cm4oLTIpOworCQlkZWJ1ZyhGMTExLCJjbWZsZCAzIixhdHhidWYseGMpOworCQkvKiBSZXBsYWNlIGJ5IG5ldyB2YWx1ZSAtLSBmb3IgTUlOUFVUIG9ubHkga2VlcCBhbGwgY2hhcnMgKi8KKwkJaWYgKHNldGF0bShhdHhidWYsa2VlcGFsbGNoYXJzID8gMzoxKSA8IDApIHsgLyogMTYgTWFyIDIwMDMgKi8KKwkJICAgIHByaW50ZigiVmFsdWUgdG9vIGxvbmdcbiIpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorCQkqeHAgPSBhdG1idWY7CisJICAgIH0KKwkgICAgZGVidWcoRjExMSwiY21mbGQgNCIsYXRtYnVmLHhjKTsKKwkgICAgaWYgKCoqeHAgPT0gTlVMKSB7CQkvKiBJZiB2YXJpYWJsZSBldmFsdWF0ZXMgdG8gbnVsbCAqLworCQlpZiAoc2V0YXRtKHhkZWYsMCkgPCAwKSB7CisJCSAgICBwcmludGYoIj9EZWZhdWx0IHRvbyBsb25nXG4iKTsKKwkJICAgIHJldHVybigtOSk7CisJCX0KKwkJaWYgKCoqeHAgPT0gTlVMKSB4ID0gLTM7IC8qIElmIHN0aWxsIGVtcHR5LCByZXR1cm4gLTMuICovCisJICAgIH0KKwkgICAgZGVidWcoRjExMSwiY21mbGQgcmV0dXJucyIsKnhwLHgpOworCSAgICByZXR1cm4oeCk7CisJICBjYXNlIDI6CQkJLyogRVNDICovCisJICAgIGlmICh4YyA9PSAwICYmICp4ZGVmKSB7CisJCXByaW50ZigiJXMgIix4ZGVmKTsgLyogSWYgYXQgYmVnaW5uaW5nIG9mIGZpZWxkLCAqLworI2lmZGVmIEdFTURPUworCQlmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZiAvKiBHRU1ET1MgKi8KKwkJYWRkYnVmKHhkZWYpOwkJLyogU3VwcGx5IGRlZmF1bHQuICovCisJCWlud29yZCA9IGNtZmxncyA9IDA7CisJCWlmIChzZXRhdG0oeGRlZiwwKSA8IDApIHsKKwkJICAgIHByaW50ZigiP0RlZmF1bHQgdG9vIGxvbmdcbiIpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfSBlbHNlCQkJLyogUmV0dXJuIGFzIGlmIHdob2xlIGZpZWxkICovCisJCSAgcmV0dXJuKDApOwkJLyogdHlwZWQsIGZvbGxvd2VkIGJ5IHNwYWNlLiAqLworCSAgICB9IGVsc2UgeworCQlibGVlcChCUF9XQVJOKTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgMzoJCQkvKiBRdWVzdGlvbiBtYXJrICovCisJICAgIGRlYnVnKEYxMTAsImNtZmxkIFFVRVNUSU9OTUFSSyIsY21kYnVmLDApOworCSAgICBpZiAoKnhobHAgPT0gTlVMKQorCSAgICAgIHByaW50ZigiIFBsZWFzZSBjb21wbGV0ZSB0aGlzIGZpZWxkIik7CisJICAgIGVsc2UKKwkgICAgICBwcmludGYoIiAlcyIseGhscCk7CisJICAgIHByaW50ZigiXG4lcyVzIixjbXByb20sY21kYnVmKTsKKwkgICAgZmZsdXNoKHN0ZG91dCk7CisJICAgIGJyZWFrOworICAgICAgICB9CisJZGVidWcoRjExMSwiY21mbGQgZ3R3b3JkIEEgeCIsY21kYnVmLHgpOworCXggPSBndHdvcmQoMCk7CisJZGVidWcoRjExMSwiY21mbGQgZ3R3b3JkIEIgeCIsY21kYnVmLHgpOworICAgIH0KK30KKworCisvKiAgQyBNIFQgWCBUICAtLSAgR2V0IGEgdGV4dCBzdHJpbmcsIGluY2x1ZGluZyBjb25maXJtYXRpb24gICovCisKKy8qCisgIFByaW50IGhlbHAgbWVzc2FnZSAneGhscCcgaWYgPyB0eXBlZCwgc3VwcGx5IGRlZmF1bHQgJ3hkZWYnIGlmIG51bGwKKyAgc3RyaW5nIHR5cGVkLiAgUmV0dXJuczoKKworICAgLTEgaWYgcmVwYXJzZSBuZWVkZWQgb3IgYnVmZmVyIG92ZXJmbG93cy4KKyAgICAxIG90aGVyd2lzZS4KKworICB3aXRoIGNtZmxncyBzZXQgdG8gcmV0dXJuIGNvZGUsIGFuZCB4cCBwb2ludGluZyB0byByZXN1bHQgc3RyaW5nLgorKi8KK2ludAorY210eHQoeGhscCx4ZGVmLHhwLGYpIGNoYXIgKnhobHA7IGNoYXIgKnhkZWY7IGNoYXIgKip4cDsgeHhfc3RycCBmOyB7CisKKyAgICBpbnQgeCwgaTsKKyAgICBjaGFyICp4eCwgKnpxOworICAgIHN0YXRpYyBpbnQgeGM7CisKKyAgICBpZiAoIXhobHApIHhobHAgPSAiIjsKKyAgICBpZiAoIXhkZWYpIHhkZWYgPSAiIjsKKworICAgIGNtZmxkZmxncyA9IDA7CisKKyAgICBjbWRlZmF1bHRbMF0gPSBOVUw7CisgICAgaWYgKCp4ZGVmKQorICAgICAgY2tzdHJuY3B5KGNtZGVmYXVsdCx4ZGVmLENNREVGQVVMVCk7IC8qIENvcHkgZGVmYXVsdCAqLworICAgIHhkZWYgPSBjbWRlZmF1bHQ7CisKKyAgICBkZWJ1ZyhGMTAxLCJjbXR4dCBjbWZsZ3MiLCIiLGNtZmxncyk7CisgICAgaW53b3JkID0gMDsJCQkJLyogU3RhcnQgYXRtYnVmIGNvdW50ZXIgb2ZmIGF0IDAgKi8KKyAgICBjYyA9IDA7CisgICAgaWYgKGNtZmxncyA9PSAtMSkgeyAgICAgICAgICAgICAgICAgLyogSWYgcmVwYXJzaW5nLCAqLworCSp4cCA9IHBwOworICAgICAgICB4YyA9IChpbnQpc3RybGVuKCp4cCk7CQkvKiBnZXQgYmFjayB0aGUgdG90YWwgdGV4dCBsZW5ndGgsICovCisJYnAgPSAqeHA7CQkJLyogYW5kIGJhY2sgdXAgdGhlIHBvaW50ZXJzLiAqLworCW5wID0gKnhwOworCXBwID0gKnhwOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSwgKi8KKwkvKiBkZWJ1ZyhGMTAwLCJjbXR4dDogZnJlc2ggc3RhcnQiLCIiLDApOyAqLworICAgICAgICAqeHAgPSAiIjsgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGZyZXNoLiAqLworICAgICAgICB4YyA9IDA7CisgICAgfQorICAgICphdG1idWYgPSBOVUw7ICAgICAgICAgICAgICAgICAgICAgIC8qIEFuZCBlbXB0eSB0aGUgYXRvbSBidWZmZXIuICovCisgICAgcnRpbWVyKCk7CQkJCS8qIFJlc2V0IHRpbWVyICovCisgICAgaWYgKCh4ID0gY21mbGdzKSAhPSAxKSB7CisJaW50IGRvbmUgPSAwOworCXdoaWxlICghZG9uZSkgeworCSAgICB4ID0gZ3R3b3JkKDApOwkJLyogR2V0IGZpcnN0IHdvcmQuICovCisJICAgICp4cCA9IHBwOwkJCS8qIFNhdmUgcG9pbnRlciB0byBpdC4gKi8KKwkgICAgLyogZGVidWcoRjExMSwiY210eHQ6IiwqeHAsY2MpOyAqLworCSAgICBpZiAoeCA9PSAtMTApIHsKKwkJaWYgKGd0aW1lcigpID4gdGltZWxpbWl0KSB7CisJCSAgICAvKiBpZiAoIXF1aWV0KSBwcmludGYoIj9UaW1lZCBvdXRcbiIpOyAqLworCQkgICAgcmV0dXJuKHgpOworCQl9CisJICAgIH0gZWxzZQorCSAgICAgIGRvbmUgPSAxOworCX0KKyAgICB9CisgICAgd2hpbGUgKDEpIHsJCQkJLyogTG9vcCBmb3IgZWFjaCB3b3JkIGluIHRleHQuICovCisgICAgICAgIHhjICs9IGNjOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhciBjb3VudCBmb3IgYWxsIHdvcmRzLiAqLworICAgICAgICAvKiBkZWJ1ZyhGMTExLCJjbXR4dCBndHdvcmQiLGF0bWJ1Zix4Yyk7ICovCisgICAgICAgIC8qIGRlYnVnKEYxMDEsImNtdHh0IHgiLCIiLHgpOyAqLworICAgICAgICBzd2l0Y2ggKHgpIHsKKwkgIGNhc2UgLTEwOgorCSAgICBpZiAoZ3RpbWVyKCkgPiB0aW1lbGltaXQpIHsKKyNpZmRlZiBJS1NECisgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBpbnNlcnZlcjsKKyAgICAgICAgICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcclxuSUtTRCBJRExFIFRJTUVPVVQ6ICVkIHNlY1xyXG4iLCB0aW1lbGltaXQpOworICAgICAgICAgICAgICAgICAgICBkb2V4aXQoR09PRF9FWElULDApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisJCS8qIGlmICghcXVpZXQpIHByaW50ZigiP1RpbWVkIG91dFxuIik7ICovCisJCXJldHVybigtMTApOworCSAgICB9IGVsc2UgeworCQl4ID0gZ3R3b3JkKDApOworCQljb250aW51ZTsKKwkgICAgfQorCSAgY2FzZSAtOToJCQkvKiBCdWZmZXIgb3ZlcmZsb3cgKi8KKwkgICAgcHJpbnRmKCJDb21tYW5kIG9yIGZpZWxkIHRvbyBsb25nXG4iKTsKKwkgIGNhc2UgLTQ6CQkJLyogRU9GICovCisjaWZkZWYgTUFDCisJICBjYXNlIC0zOgkJCS8qIFF1aXQvVGltZW91dCAqLworI2VuZGlmIC8qIE1BQyAqLworCSAgY2FzZSAtMjoJCQkvKiBPdmVyZmxvdyAqLworCSAgY2FzZSAtMToJCQkvKiBEZWxldGlvbiAqLworCSAgICByZXR1cm4oeCk7CisJICBjYXNlIDA6CQkJLyogU3BhY2UgKi8KKwkgICAgeGMrKzsJCQkvKiBKdXN0IGNvdW50IGl0ICovCisJICAgIGJyZWFrOworCSAgY2FzZSAxOgkJCS8qIENSIG9yIExGICovCisJICAgIGlmICh4YyA9PSAwKSAqeHAgPSB4ZGVmOworCSAgICBpZiAoZikgewkJCS8qIElmIGEgY29udmVyc2lvbiBmdW5jdGlvbiBpcyBnaXZlbiAqLworCQljaGFyICogc3ggPSBhdHhidWY7CisJCXpxID0gYXR4YnVmOwkJLyogUG9pbnQgdG8gdGhlIGV4cGFuc2lvbiBidWZmZXIgKi8KKwkJYXR4biA9IENNREJMOwkJLyogc3BlY2lmeSBpdHMgbGVuZ3RoICovCisJCWRlYnVnKEYxMTEsImNtdHh0IGNhbGxpbmcgKCpmKSIsKnhwLGF0eGJ1Zik7CisJCWlmICgoeCA9ICgqZikoKnhwLCZ6cSwmYXR4bikpIDwgMCkgcmV0dXJuKC0yKTsKKwkJc3ggPSBhdHhidWY7CisjaWZuZGVmIENPTU1FTlQKKwkJY2MgPSAwOworCQl3aGlsZSAoKnN4KyspIGNjKys7CS8qIChmYXN0ZXIgdGhhbiBjYWxsaW5nIHN0cmxlbikgKi8KKyNlbHNlCisJCWNjID0gKGludClzdHJsZW4oYXR4YnVmKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJCS8qIFNob3VsZCBiZSBlcXVhbCB0byAoQ01EQkwgLSBhdHhuKSBidXQgaXNuJ3QgYWx3YXlzLiAqLworCQkvKiBXaHkgbm90PyAqLworCQlpZiAoY2MgPCAxKSB7CQkvKiBOb3RoaW5nIGluIGV4cGFuc2lvbiBidWZmZXI/ICovCisJCSAgICAqeHAgPSB4ZGVmOwkJLyogUG9pbnQgdG8gZGVmYXVsdCBzdHJpbmcgaW5zdGVhZC4gKi8KKyNpZm5kZWYgQ09NTUVOVAorCQkgICAgc3ggPSB4ZGVmOworCQkgICAgd2hpbGUgKCpzeCsrKSBjYysrOwkvKiAoZmFzdGVyIHRoYW4gY2FsbGluZyBzdHJsZW4pICovCisjZWxzZQorCQkgICAgY2MgPSBzdHJsZW4oeGRlZik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCQl9IGVsc2UgewkJLyogRXhwYW5zaW9uIGZ1bmN0aW9uIGdvdCBzb21ldGhpbmcgKi8KKwkJICAgICp4cCA9IGF0eGJ1ZjsJLyogcmV0dXJuIHBvaW50ZXIgdG8gaXQuICovCisJCX0KKwkJZGVidWcoRjExMSwiY210eHQgKCpmKSIsKnhwLGNjKTsKKwkgICAgfSBlbHNlIHsJCQkvKiBObyBleHBhbnNpb24gZnVuY3Rpb24gKi8KKyNpZm5kZWYgQ09NTUVOVAorCQkvKiBBdm9pZCBhIHN0cmxlbigpIGNhbGwgKi8KKwkJeHggPSAqeHA7CisJCWNjID0gMDsKKwkJd2hpbGUgKCp4eCsrKSBjYysrOworI2Vsc2UKKwkJLyogTk8hICB4YyBpcyBhcHBhcmVudGx5IG5vdCBhbHdheXMgc2V0IGFwcHJvcHJpYXRlbHkgKi8KKwkJY2MgPSB4YzsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJICAgIH0KKwkgICAgeHggPSAqeHA7CisjaWZkZWYgQ09NTUVOVAorCSAgICAvKiBzdHJsZW4oKSBubyBsb25nZXIgbmVlZGVkICovCisJICAgIGZvciAoaSA9IChpbnQpc3RybGVuKHh4KSAtIDE7IGkgPiAwOyBpLS0pCisjZWxzZQorCSAgICBmb3IgKGkgPSBjYyAtIDE7IGkgPiAwOyBpLS0pCisjZW5kaWYgLyogQ09NTUVOVCAqLworCSAgICAgIGlmICh4eFtpXSAhPSBTUCkJCS8qIFRyaW0gdHJhaWxpbmcgYmxhbmtzICovCisJCWJyZWFrOworCSAgICAgIGVsc2UKKwkJeHhbaV0gPSBOVUw7CisJICAgIHJldHVybih4KTsKKwkgIGNhc2UgMjoJCQkvKiBFU0MgKi8KKwkgICAgaWYgKHhjID09IDApIHsJCS8qIE5vdGhpbmcgdHlwZWQgeWV0ICovCisJCWlmICgqeGRlZikgewkJLyogSGF2ZSBhIGRlZmF1bHQgZm9yIHRoaXMgZmllbGQ/ICovCisJCSAgICBwcmludGYoIiVzICIseGRlZik7CS8qIFllcywgc3VwcGx5IGl0ICovCisJCSAgICBpbndvcmQgPSBjbWZsZ3MgPSAwOworI2lmZGVmIEdFTURPUworCQkgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogR0VNRE9TICovCisJCSAgICBjYyA9IGFkZGJ1Zih4ZGVmKTsKKwkJfSBlbHNlIGJsZWVwKEJQX1dBUk4pOwkvKiBObyBkZWZhdWx0ICovCisJICAgIH0gZWxzZSB7CQkJLyogQWxyZWFkeSBpbiBmaWVsZCAqLworCQlpbnQgeDsgY2hhciAqcDsKKwkJeCA9IHN0cmxlbihhdG1idWYpOworCQlpZiAoY2tzdHJjbXAoYXRtYnVmLHhkZWYseCwwKSkgeyAgICAvKiBNYXRjaGVzIGRlZmF1bHQ/ICovCisJCSAgICBibGVlcChCUF9XQVJOKTsJICAgICAgICAgICAgLyogTm8gKi8KKwkJfSBlbHNlIGlmICgoaW50KXN0cmxlbih4ZGVmKSA+IHgpIHsgLyogWWVzICovCisJCSAgICBwID0geGRlZiArIHg7CisJCSAgICBwcmludGYoIiVzICIsIHApOworI2lmZGVmIEdFTURPUworCQkgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogR0VNRE9TICovCisJCSAgICBhZGRidWYocCk7CisJCSAgICBpbndvcmQgPSBjbWZsZ3MgPSAwOworCQkgICAgZGVidWcoRjExMCwiY210eHQ6IGFkZGJ1ZiIsY21kYnVmLDApOworCQl9IGVsc2UgeworCQkgICAgYmxlZXAoQlBfV0FSTik7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgMzoJCQkvKiBRdWVzdGlvbiBNYXJrICovCisJICAgIGlmICgqeGhscCA9PSBOVUwpCisJICAgICAgcHJpbnRmKCIgVGV4dCBzdHJpbmciKTsKKwkgICAgZWxzZQorCSAgICAgIHByaW50ZigiICVzIix4aGxwKTsKKwkgICAgcHJpbnRmKCJcbiVzJXMiLGNtcHJvbSxjbWRidWYpOworCSAgICBmZmx1c2goc3Rkb3V0KTsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBwcmludGYoIj9VbmV4cGVjdGVkIHJldHVybiBjb2RlIGZyb20gZ3R3b3JkKCkgLSAlZFxuIix4KTsKKwkgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgICAgICB4ID0gZ3R3b3JkKDApOworICAgIH0KK30KKworLyogIEMgTSBLIEUgWSAgLS0gIFBhcnNlIGEga2V5d29yZCAgKi8KKworLyoKKyBDYWxsIHdpdGg6CisgICB0YWJsZSAgICAtLSAga2V5d29yZCB0YWJsZSwgaW4gJ3N0cnVjdCBrZXl0YWInIGZvcm1hdDsKKyAgIG4gICAgICAgIC0tICBudW1iZXIgb2YgZW50cmllcyBpbiB0YWJsZTsKKyAgIHhobHAgICAgIC0tICBwb2ludGVyIHRvIGhlbHAgc3RyaW5nOworICAgeGRlZiAgICAgLS0gIHBvaW50ZXIgdG8gZGVmYXVsdCBrZXl3b3JkOworICAgZiAgICAgICAgLS0gIHByb2Nlc3NpbmcgZnVuY3Rpb24gKGUuZy4gdG8gZXZhbHVhdGUgdmFyaWFibGVzKQorICAgcG1zZyAgICAgLS0gIDAgPSBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcworICAgICAgICAgICAgICAgIDEgPSBwcmludCBlcnJvciBtZXNzYWdlcworICAgICAgICAgICAgICAgIDIgPSBpbmNsdWRlIENNX0hMUCBrZXl3b3JkcyBldmVuIGlmIGludmlzaWJsZQorICAgICAgICAgICAgICAgIDMgPSAxKzIKKyAgICAgICAgICAgICAgICA0ID0gcGFyc2UgYSBzd2l0Y2ggKGtleXdvcmQgcG9zc2libHkgZW5kaW5nIGluIDogb3IgPSkKKyBSZXR1cm5zOgorICAgLTMgICAgICAgLS0gIG5vIGlucHV0IHN1cHBsaWVkIGFuZCBubyBkZWZhdWx0IGF2YWlsYWJsZQorICAgLTIgICAgICAgLS0gIGlucHV0IGRvZXNuJ3QgdW5pcXVlbHkgbWF0Y2ggYSBrZXl3b3JkIGluIHRoZSB0YWJsZQorICAgLTEgICAgICAgLS0gIHVzZXIgZGVsZXRlZCB0b28gbXVjaCwgY29tbWFuZCByZXBhcnNlIHJlcXVpcmVkCisgICAgbiA+PSAwICAtLSAgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGtleXdvcmQKKyovCitpbnQKK2Nta2V5KHRhYmxlLG4seGhscCx4ZGVmLGYpCisvKiBjbWtleSAqLyAgc3RydWN0IGtleXRhYiB0YWJsZVtdOyBpbnQgbjsgY2hhciAqeGhscCwgKnhkZWY7IHh4X3N0cnAgZjsgeworICAgIHJldHVybihjbWtleTIodGFibGUsbix4aGxwLHhkZWYsIiIsZiwxKSk7Cit9CitpbnQKK2Nta2V5eCh0YWJsZSxuLHhobHAseGRlZixmKQorLyogY21rZXl4ICovICBzdHJ1Y3Qga2V5dGFiIHRhYmxlW107IGludCBuOyBjaGFyICp4aGxwLCAqeGRlZjsgeHhfc3RycCBmOyB7CisgICAgcmV0dXJuKGNta2V5Mih0YWJsZSxuLHhobHAseGRlZiwiIixmLDApKTsKK30KK2ludAorY21zd2kodGFibGUsbix4aGxwLHhkZWYsZikKKy8qIGNtc3dpICovICBzdHJ1Y3Qga2V5dGFiIHRhYmxlW107IGludCBuOyBjaGFyICp4aGxwLCAqeGRlZjsgeHhfc3RycCBmOyB7CisgICAgcmV0dXJuKGNta2V5Mih0YWJsZSxuLHhobHAseGRlZiwiIixmLDQpKTsKK30KKworaW50CitjbWtleTIodGFibGUsbix4aGxwLHhkZWYsdG9rLGYscG1zZykKKyAgICBzdHJ1Y3Qga2V5dGFiIHRhYmxlW107CisgICAgaW50IG47CisgICAgY2hhciAqeGhscCwgKnhkZWY7CisgICAgY2hhciAqdG9rOworICAgIHh4X3N0cnAgZjsKKyAgICBpbnQgcG1zZzsKK3sgLyogY21rZXkyICovCisgICAgZXh0ZXJuIGludCBoYXZldG9rZW47CisgICAgaW50IGksIHRsLCB5LCB6ID0gMCwgenosIHhjLCB3b3JkbGVuID0gMCwgY21zd2l0Y2g7CisgICAgY2hhciAqeHAsICp6cTsKKworICAgIGlmICgheGhscCkgeGhscCA9ICIiOworICAgIGlmICgheGRlZikgeGRlZiA9ICIiOworCisgICAgY21mbGRmbGdzID0gMDsKKyAgICBpZiAoIXRhYmxlKSB7CisJcHJpbnRmKCI/S2V5d29yZCB0YWJsZSBtaXNzaW5nXG4iKTsKKwlyZXR1cm4oLTkpOworICAgIH0KKyAgICB0bCA9IChpbnQpc3RybGVuKHRvayk7CisKKyAgICBpbndvcmQgPSB4YyA9IGNjID0gMDsJCS8qIENsZWFyIGNoYXJhY3RlciBjb3VudGVycy4gKi8KKyAgICBjbXN3aXRjaCA9IHBtc2cgJiA0OwkJLyogRmxhZyBmb3IgcGFyc2luZyBhIHN3aXRjaCAqLworCisgICAgZGVidWcoRjEwMSwiY21rZXk6IHBtc2ciLCIiLHBtc2cpOworICAgIGRlYnVnKEYxMDEsImNta2V5OiBjbWZsZ3MiLCIiLGNtZmxncyk7CisgICAgZGVidWcoRjEwMSwiY21rZXk6IGNtc3dpdGNoIiwiIixjbXN3aXRjaCk7CisgICAgLyogZGVidWcoRjEwMSwiY21rZXk6IGNtZGJ1ZiIsIiIsY21kYnVmKTsqLworCisgICAgcHB2bmFtYnVmWzBdID0gTlVMOworCisgICAgaWYgKCh6eiA9IGNtZmxncykgPT0gMSkgewkJLyogQ29tbWFuZCBhbHJlYWR5IGVudGVyZWQ/ICovCisJaWYgKHNldGF0bSh4ZGVmLDApIDwgMCkgewkvKiBZZXMsIGNvcHkgZGVmYXVsdCBpbnRvIGF0b20gYnVmICovCisJICAgIHByaW50ZigiP0RlZmF1bHQgdG9vIGxvbmdcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKyAgICAgICAgcnRpbWVyKCk7CQkJIC8qIFJlc2V0IHRpbWVyICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgcnRpbWVyKCk7CQkJIC8qIFJlc2V0IHRpbWVyICovCisgICAgICAgIHp6ID0gZ3R3b3JkKChwbXNnID09IDQpID8gMSA6IDApOy8qIE90aGVyd2lzZSBnZXQgYSBjb21tYW5kIHdvcmQgKi8KKyAgICB9CisKKyAgICBkZWJ1ZyhGMTAxLCJjbWtleSB0YWJsZSBsZW5ndGgiLCIiLG4pOworICAgIGRlYnVnKEYxMDEsImNta2V5IGNtZmxncyIsIiIsY21mbGdzKTsKKyAgICBkZWJ1ZyhGMTAxLCJjbWtleSBjYyIsIiIsY2MpOworCisgICAgd2hpbGUgKDEpIHsKKwl4YyArPSBjYzsKKwlkZWJ1ZyhGMTExLCJjbWtleSBndHdvcmQgeGMiLGF0bWJ1Zix4Yyk7CisJZGVidWcoRjEwMSwiY21rZXkgZ3R3b3JkIHp6IiwiIix6eik7CisKKwlzd2l0Y2ggKHp6KSB7CisJICBjYXNlIC0xMDoJCQkvKiBUaW1lb3V0ICovCisJICAgIGlmIChndGltZXIoKSA8IHRpbWVsaW1pdCkgeworCQl6eiA9IGd0d29yZCgocG1zZyA9PSA0KSA/IDEgOiAwKTsKKwkJY29udGludWU7CisJICAgIH0gZWxzZSB7CisjaWZkZWYgSUtTRAorICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgaW5zZXJ2ZXI7CisgICAgICAgICAgICAgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXHJcbklLU0QgSURMRSBUSU1FT1VUOiAlZCBzZWNcclxuIiwgdGltZWxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgZG9leGl0KEdPT0RfRVhJVCwwKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCQlyZXR1cm4oLTEwKTsKKyAgICAgICAgICAgIH0KKwkgIGNhc2UgLTU6CisJICAgIHJldHVybihjbWZsZ3MgPSAwKTsKKwkgIGNhc2UgLTk6CisJICAgIHByaW50ZigiQ29tbWFuZCBvciBmaWVsZCB0b28gbG9uZ1xuIik7CisJICBjYXNlIC00OgkJCS8qIEVPRiAqLworCSAgY2FzZSAtMzoJCQkvKiBOdWxsIENvbW1hbmQvUXVpdC9UaW1lb3V0ICovCisJICBjYXNlIC0yOgkJCS8qIEJ1ZmZlciBvdmVyZmxvdyAqLworCSAgY2FzZSAtMToJCQkvKiBPciB1c2VyIGRpZCBzb21lIGRlbGV0aW5nLiAqLworCSAgICByZXR1cm4oY21mbGdzID0genopOworCisKKwkgIGNhc2UgMToJCQkvKiBDUiAqLworCSAgY2FzZSAwOgkJCS8qIFVzZXIgdGVybWluYXRlZCB3b3JkIHdpdGggc3BhY2UgKi8KKwkgIGNhc2UgNDoJCQkvKiBvciBzd2l0Y2ggZW5kaW5nIGluIDogb3IgPSAqLworCSAgICB3b3JkbGVuID0gY2M7CQkvKiBMZW5ndGggaWYgbm8gY29udmVyc2lvbiAqLworCSAgICBpZiAoY2MgPT0gMCkgewkJLyogU3VwcGx5IGRlZmF1bHQgaWYgd2UgZ290IG5vdGhpbmcgKi8KKwkJaWYgKCh3b3JkbGVuID0gc2V0YXRtKHhkZWYsKHp6ID09IDQpID8gMiA6IDApKSA8IDApIHsKKwkJICAgIHByaW50ZigiP0RlZmF1bHQgdG9vIGxvbmdcbiIpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorCSAgICB9CisJICAgIGlmICh6eiA9PSAxICYmIGNjID09IDApCS8qIFJlcXVpcmVkIGZpZWxkIG1pc3NpbmcgKi8KKwkgICAgICByZXR1cm4oLTMpOworCisJICAgIGlmIChmKSB7CQkJLyogSWYgYSBjb252ZXJzaW9uIGZ1bmN0aW9uIGlzIGdpdmVuICovCisJCWNoYXIgKiBwMjsKKwkJenEgPSBhdHhidWY7CQkvKiBhcHBseSBpdCAqLworCQlwMiA9IGF0eGJ1ZjsKKwkJYXR4biA9IENNREJMOworCQlpZiAoKCpmKShhdG1idWYsJnpxLCZhdHhuKSA8IDApIHJldHVybigtMik7CisJCWRlYnVnKEYxMTAsImNta2V5IGF0eGJ1ZiBhZnRlciAqZiIsYXR4YnVmLDApOworCQlpZiAoISpwMikJCS8qIFN1cHBseSBkZWZhdWx0IGlmIHdlIGdvdCBub3RoaW5nICovCisJCSAgcDIgPSB4ZGVmOworCQlja3N0cm5jcHkocHB2bmFtYnVmLGF0bWJ1ZixQUFZMRU4pOworCQlpZiAoKHdvcmRsZW4gPSBzZXRhdG0ocDIsKHp6ID09IDQpID8gMiA6IDApKSA8IDApIHsKKwkJICAgIHByaW50ZigiRXZhbHVhdGVkIGtleXdvcmQgdG9vIGxvbmdcbiIpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorI2lmZGVmIE1fVU5HVworCQkvKgorCQkgIFRoaXMgYml0IGxldHMgdXMgc2F2ZSBtb3JlIHRoYW4gb25lICJ3b3JkIi4KKwkJICBGb3IgZXhhbXBsZSwgImRlZmluZSBcJXggZWNobyBvbmUgdHdvIHRocmVlIiwgIlwleCIuCisJCSAgSXQgd29ya3MgdG9vLCBidXQgaXQgYnJlYWtzIGxhYmVscywgYW5kIHRoZXJlZm9yZQorCQkgIFdISUxFIGFuZCBGT1IgbG9vcHMsIGV0Yy4KKwkJKi8KKwkJaWYgKHAyW3dvcmRsZW5dID49IFNQKSB7CisJCSAgICBwMiArPSB3b3JkbGVuOworCQkgICAgd2hpbGUgKCpwMiA9PSBTUCkgcDIrKzsKKwkJICAgIGlmICgqcDIpIHsKKwkJCXVuZ3dvcmQoKTsKKwkJCXBwID0gcDI7CisJCSAgICB9CisJCX0KKyNlbmRpZiAvKiBNX1VOR1cgKi8KKwkgICAgfQorCSAgICBpZiAoY21zd2l0Y2ggJiYgKmF0bWJ1ZiAhPSAnLycpIHsKKwkJaWYgKHBtc2cgJiAxKSB7CisJCSAgICBibGVlcChCUF9GQUlMKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/Tm90IGEgc3dpdGNoIC0gJXNcbiIsYXRtYnVmKTsKKwkJfQorCQljbWZsZ3MgPSAtMjsKKwkJcmV0dXJuKC02KTsKKwkgICAgfQorCSAgICBpZiAoY21zd2l0Y2gpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCB3b3JkbGVuOyBpKyspIHsKKwkJICAgIGlmIChhdG1idWZbaV0gPT0gJzonIHx8IGF0bWJ1ZltpXSA9PSAnPScpIHsKKwkJCWJya2NoYXIgPSBhdG1idWZbaV07CisJCQlhdG1idWZbaV0gPSBOVUw7CisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKyNpZmRlZiBUT0tQUkVDSEVDSworLyogVGhpcyB3YXMgYW4gZWZmZWN0aXZlIG9wdGltaXphdGlvbiBidXQgaXQgYnJlYWtzIHNvbWV0aW1lcyBvbiBsYWJlbHMuICovCisJICAgIGlmICh0bCAmJiAhaXNhbHBoYShhdG1idWZbMF0pKSB7IC8qIFByZWNoZWNrIGZvciB0b2tlbiAqLworCQlmb3IgKGkgPSAwOyBpIDwgdGw7IGkrKykgeyAvKiBTYXZlIGZ1bmN0aW9uIGNhbGwgdG8gY2tzdHJjaHIgKi8KKwkJICAgIGlmICh0b2tbaV0gPT0gYXRtYnVmWzBdKSB7CisJCQlkZWJ1ZyhGMDAwLCJjbWtleSB0b2tlbjoiLGF0bWJ1ZiwqYXRtYnVmKTsKKwkJCXVuZ3dvcmQoKTsgIC8qIFB1dCBiYWNrIHRoZSBmb2xsb3dpbmcgd29yZCAqLworCQkJcmV0dXJuKC01KTsgLyogU3BlY2lhbCByZXR1cm4gY29kZSBmb3IgdG9rZW4gKi8KKwkJICAgIH0KKwkJfQorCSAgICB9CisjZW5kaWYgLyogVE9LUFJFQ0hFQ0sgKi8KKworCSAgICB5ID0gbG9va3VwKHRhYmxlLGF0bWJ1ZixuLCZ6KTsgLyogTG9vayB1cCB3b3JkIGluIHRoZSB0YWJsZSAqLworCSAgICBkZWJ1ZyhGMTExLCJjbWtleSBsb29rdXAiLGF0bWJ1Zix5KTsKKwkgICAgZGVidWcoRjEwMSwiY21rZXkgenoiLCIiLHp6KTsKKwkgICAgZGVidWcoRjEwMSwiY21rZXkgY21mbGdzIiwiIixjbWZsZ3MpOworCSAgICBkZWJ1ZyhGMTAxLCJjbWtleSBjcmZsYWciLCIiLGNyZmxhZyk7CisJICAgIHN3aXRjaCAoeSkgeworCSAgICAgIGNhc2UgLTM6CQkJLyogTm90aGluZyB0byBsb29rIHVwICovCisJCWJyZWFrOworCSAgICAgIGNhc2UgLTI6CQkJLyogQW1iaWd1b3VzICovCisJCWNtZmxncyA9IC0yOworCQlpZiAocG1zZyAmIDEpIHsKKwkJICAgIGJsZWVwKEJQX0ZBSUwpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9BbWJpZ3VvdXMgLSAlc1xuIixhdG1idWYpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorCQlyZXR1cm4oLTIpOworCSAgICAgIGNhc2UgLTE6CQkJLyogTm90IGZvdW5kIGF0IGFsbCAqLworI2lmbmRlZiBUT0tQUkVDSEVDSworCQlpZiAodGwpIHsKKwkJICAgIGZvciAoaSA9IDA7IGkgPCB0bDsgaSsrKSAvKiBDaGVjayBmb3IgdG9rZW4gKi8KKwkJICAgICAgaWYgKHRva1tpXSA9PSAqYXRtYnVmKSB7IC8qIEdvdCBvbmUgKi8KKwkJCSAgZGVidWcoRjAwMCwiY21rZXkgdG9rZW46IixhdG1idWYsKmF0bWJ1Zik7CisJCQkgIHVuZ3dvcmQoKTsgIC8qIFB1dCBiYWNrIHRoZSBmb2xsb3dpbmcgd29yZCAqLworCQkJICByZXR1cm4oLTUpOyAvKiBTcGVjaWFsIHJldHVybiBjb2RlIGZvciB0b2tlbiAqLworCQkgICAgICB9CisJCX0KKyNlbmRpZiAvKiBUT0tQUkVDSEVDSyAqLworCisJCWlmICh0bCA9PSAwKSB7CQkvKiBObyB0b2tlbnMgd2VyZSBpbmNsdWRlZCAqLworI2lmZGVmIE9TMgorCQkgICAgLyogSW4gT1MvMiBhbmQgV2luZG93cywgYWxsb3cgZm9yIGEgZGlzayBsZXR0ZXIgbGlrZSBET1MgKi8KKwkJICAgIGlmIChpc2FscGhhKCphdG1idWYpICYmICooYXRtYnVmKzEpID09ICc6JykKKwkJICAgICAgcmV0dXJuKC03KTsKKyNlbmRpZiAvKiBPUzIgKi8KKwkJICAgIGlmICgocG1zZyAmIDEpICYmICFxdWlldCkgeworCQkJYmxlZXAoQlBfRkFJTCk7CisJCQlwcmludGYoIj9ObyBrZXl3b3JkcyBtYXRjaCAtICVzXG4iLGF0bWJ1Zik7IC8qIGNta2V5ICovCisJCSAgICB9CisJCSAgICByZXR1cm4oY21mbGdzID0gLTkpOworCQl9IGVsc2UgeworCQkgICAgaWYgKGNtZmxncyA9PSAxIHx8IGNtc3dpdGNoKSAvKiBjbWtleTIgb3IgY21zd2kgKi8KKwkJICAgICAgcmV0dXJuKGNtZmxncyA9IC02KTsKKwkJICAgIGVsc2UKKwkJICAgICAgcmV0dXJuKGNtZmxncyA9IC0yKTsKKwkJICAgIC8qIFRoZSAtNiBjb2RlIGlzIHRvIGxldCBjYWxsZXIgdHJ5IGFub3RoZXIgdGFibGUgKi8KKwkJfQorCQlicmVhazsKKwkgICAgICBkZWZhdWx0OgorI2lmZGVmIENLX1JFQ0FMTAorCQlpZiAodGVzdCh0YWJsZVt6XS5mbGdzLENNX05PUikpIG5vX3JlY2FsbCA9IDE7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisJCWlmICh6eiA9PSA0KQorCQkgIHN3YXJnID0gMTsKKwkJY21rd2ZsZ3MgPSB0YWJsZVt6XS5mbGdzOworCQlicmVhazsKKwkgICAgfQorCSAgICByZXR1cm4oeSk7CisKKwkgIGNhc2UgMjoJCQkvKiBVc2VyIHRlcm1pbmF0ZWQgd29yZCB3aXRoIEVTQyAqLworCSAgICBkZWJ1ZyhGMTAxLCJjbWtleSBFc2MgY2MiLCIiLGNjKTsKKyAgICAgICAgICAgIGlmIChjYyA9PSAwKSB7CisJCWlmICgqeGRlZiAhPSBOVUwpIHsgICAgIC8qIE5vdGhpbmcgaW4gYXRtYnVmICovCisJCSAgICBwcmludGYoIiVzICIseGRlZik7IC8qIFN1cHBseSBkZWZhdWx0IGlmIGFueSAqLworI2lmZGVmIEdFTURPUworCQkgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogR0VNRE9TICovCisJCSAgICBhZGRidWYoeGRlZik7CisJCSAgICBpZiAoc2V0YXRtKHhkZWYsMCkgPCAwKSB7CisJCQlwcmludGYoIj9EZWZhdWx0IHRvbyBsb25nXG4iKTsKKwkJCXJldHVybigtOSk7CisJCSAgICB9CisJCSAgICBpbndvcmQgPSBjbWZsZ3MgPSAwOworCQkgICAgZGVidWcoRjExMSwiY21rZXk6IGRlZmF1bHQiLGF0bWJ1ZixjYyk7CisJCX0gZWxzZSB7CisJCSAgICBkZWJ1ZyhGMTAxLCJjbWtleSBFc2MgcG1zZyIsIiIsMCk7CisjaWZkZWYgQ09NTUVOVAorLyoKKyAgQ2hhaW5lZCBGREJzLi4uICBUaGUgaWRlYSBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gbWlnaHQgbm90IGhhdmUgYSBkZWZhdWx0LAorICBidXQgdGhlIG5leHQgb25lIG1pZ2h0LiAgQnV0IGlmIGl0IGRvZXNuJ3QsIHRoZXJlIGlzIG5vIHdheSB0byBjb21lIGJhY2sgdG8KKyAgdGhpcyBvbmUuICBUbyBiZSByZXZpc2l0ZWQgbGF0ZXIuLi4KKyovCisJCSAgICBpZiAoeGNtZmRiKQkJLyogQ2hhaW5lZCBmZGIgLS0gdHJ5IG5leHQgb25lICovCisJCSAgICAgIHJldHVybigtMyk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCQkgICAgaWYgKHBtc2cgJiAoMXw0KSkgewkvKiBTbyBmb3Igbm93IGp1c3QgYmVlcCAqLworCQkJYmxlZXAoQlBfV0FSTik7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJfQorICAgICAgICAgICAgfQorCSAgICBpZiAoZikgewkJCS8qIElmIGEgY29udmVyc2lvbiBmdW5jdGlvbiBpcyBnaXZlbiAqLworCQljaGFyICogcHA7CisJCXpxID0gYXR4YnVmOwkJLyogYXBwbHkgaXQgKi8KKwkJcHAgPSBhdHhidWY7CisJCWF0eG4gPSBDTURCTDsKKwkJaWYgKCgqZikoYXRtYnVmLCZ6cSwmYXR4bikgPCAwKQorCQkgIHJldHVybigtMik7CisJCWlmICghKnBwKQorCQkgIHBwID0geGRlZjsKKwkJaWYgKHNldGF0bShwcCwwKSA8IDApIHsKKwkJICAgIHByaW50ZigiRXZhbHVhdGVkIGtleXdvcmQgdG9vIGxvbmdcbiIpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorCSAgICB9CisJICAgIHkgPSBsb29rdXAodGFibGUsYXRtYnVmLG4sJnopOyAvKiBTb21ldGhpbmcgaW4gYXRtYnVmICovCisJICAgIGRlYnVnKEYxMTEsImNta2V5IGxvb2t1cCB5IixhdG1idWYseSk7CisJICAgIGRlYnVnKEYxMTEsImNta2V5IGxvb2t1cCB6IixhdG1idWYseik7CisJICAgIGlmICh5ID09IC0yICYmIHogPj0gMCAmJiB6IDwgbikgeyAvKiBBbWJpZ3VvdXMgKi8KKyNpZm5kZWYgTk9QQVJUSUFMCisJCWludCBqLCBrLCBsZW4gPSA5OTk5OwkvKiBEbyBwYXJ0aWFsIGNvbXBsZXRpb24gKi8KKwkJLyogU2tpcCBwYXN0IGFueSBhYmJyZXZpYXRpb25zIGluIHRoZSB0YWJsZSAqLworCQlmb3IgKCA7IHogPCBuOyB6KyspIHsKKwkJICAgIGlmICgodGFibGVbel0uZmxncyAmIENNX0FCUikgPT0gMCkKKwkJICAgICAgYnJlYWs7CisJCSAgICBpZiAoISh0YWJsZVt6XS5mbGdzICYgQ01fSExQKSB8fCAocG1zZyAmIDIpKQorCQkgICAgICBicmVhazsKKwkJfQorCQlkZWJ1ZyhGMTExLCJjbWtleSBwYXJ0aWFsIHoiLGF0bWJ1Zix6KTsKKwkJZGVidWcoRjExMSwiY21rZXkgcGFydGlhbCBuIixhdG1idWYsbik7CisJCWZvciAoaiA9IHorMTsgaiA8IG47IGorKykgeworCQkgICAgZGVidWcoRjExMSwiY21rZXkgcGFydGlhbCBqIix0YWJsZVtqXS5rd2Qsaik7CisJCSAgICBpZiAoY2tzdHJjbXAoYXRtYnVmLHRhYmxlW2pdLmt3ZCxjYywwKSkKKwkJICAgICAgYnJlYWs7CisJCSAgICBpZiAodGFibGVbal0uZmxncyAmIENNX0FCUikKKwkJICAgICAgY29udGludWU7CisJCSAgICBpZiAoKHRhYmxlW2pdLmZsZ3MgJiBDTV9ITFApICYmICEocG1zZyAmIDIpKQorCQkgICAgICBjb250aW51ZTsKKwkJICAgIGsgPSBja3N0cnByZSh0YWJsZVt6XS5rd2QsdGFibGVbal0ua3dkKTsKKwkJICAgIGRlYnVnKEYxMTEsImNta2V5IHBhcnRpYWwgayIsdGFibGVbel0ua3dkLGspOworCQkgICAgaWYgKGsgPCBsZW4pCisJCSAgICAgIGxlbiA9IGs7IC8qIExlbmd0aCBvZiBsb25nZXN0IGNvbW1vbiBwcmVmaXggKi8KKwkJfQorCQlkZWJ1ZyhGMTExLCJjbWtleSBwYXJ0aWFsIGxlbiIsdGFibGVbel0ua3dkLGxlbik7CisJCWlmIChsZW4gIT0gOTk5OSAmJiBsZW4gPiBjYykgeworCQkgICAgY2tzdHJuY2F0KGF0bWJ1Zix0YWJsZVt6XS5rd2QrY2MsQVRNQkwpOworCQkgICAgYXRtYnVmW2xlbl0gPSBOVUw7CisJCSAgICBwcmludGYoIiVzIixhdG1idWYrY2MpOworCQkgICAgY2tzdHJuY2F0KGNtZGJ1ZixhdG1idWYrY2MsQ01EQkwpOworCQkgICAgeGMgKz0gKGxlbiAtIGNjKTsKKwkJICAgIGNjID0gbGVuOworCQl9CisjZW5kaWYgLyogTk9QQVJUSUFMICovCisJCWJsZWVwKEJQX1dBUk4pOworCQlicmVhazsKKwkgICAgfSBlbHNlIGlmICh5ID09IC0zKSB7CisJCWJsZWVwKEJQX1dBUk4pOworCQlicmVhazsKKwkgICAgfSBlbHNlIGlmICh5ID09IC0xKSB7CS8qIE5vdCBmb3VuZCAqLworCQlpZiAoKHBtc2cgJiAxKSAmJiAhcXVpZXQpIHsKKwkJICAgIGJsZWVwKEJQX0ZBSUwpOworCQkgICAgcHJpbnRmKCI/Tm8ga2V5d29yZHMgbWF0Y2ggLSBcIiVzXCJcbiIsYXRtYnVmKTsKKwkJfQorCQljbWZsZ3MgPSAtMjsKKwkJcmV0dXJuKC05KTsKKwkgICAgfQorLyoKKyAgSWYgd2UgZm91bmQgaXQsIGJ1dCBpdCdzIGEgaGVscC1vbmx5IGtleXdvcmQgYW5kIHRoZSAiaGVscCIgYml0IGlzIG5vdAorICBzZXQgaW4gcG1zZywgdGhlbiBub3QgZm91bmQuCisqLworCSAgICBkZWJ1ZyhGMTAxLCJjbWtleSBmbGdzIiwiIix0YWJsZVt6XS5mbGdzKTsKKwkgICAgaWYgKHRlc3QodGFibGVbel0uZmxncyxDTV9ITFApICYmICgocG1zZyAmIDIpID09IDApKSB7CisJCWlmICgocG1zZyAmIDEpICYmICFxdWlldCkgeworCQkgICAgYmxlZXAoQlBfRkFJTCk7CisJCSAgICBwcmludGYoIj9ObyBrZXl3b3JkcyBtYXRjaCAtICVzXG4iLGF0bWJ1Zik7CisJCX0KKwkJY21mbGdzID0gLTI7CisJCXJldHVybigtOSk7CisJICAgIH0KKy8qCisgIFNlZSBpZiB0aGUga2V5d29yZCBqdXN0IGZvdW5kIGhhcyB0aGUgQ01fQUJSIGJpdCBzZXQgaW4gaXRzIGZsZ3MgZmllbGQsIGFuZAorICBpZiBzbywgc2VhcmNoIGZvcndhcmRzIGluIHRoZSB0YWJsZSBmb3IgYSBrZXl3b3JkIHRoYXQgaGFzIHRoZSBzYW1lIGt3dmFsCisgIGJ1dCBkb2VzIG5vdCBoYXZlIENNX0FCUiAob3IgQ01fSU5WPykgc2V0LCBhbmQgdGhlbiBleHBhbmQgdXNpbmcgdGhlIGZ1bGwKKyAga2V5d29yZC4gIFdBUk5JTkc6IFRoaXMgYXNzdW1lcyB0aGF0IChhKSBrZXl3b3JkcyBhcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLAorICBhbmQgKGIpIHRoZSBDTV9BQlIgYml0IGlzIHNldCBvbmx5IGlmIHRoZSB0aGUgYWJicmV2aWF0ZWQga2V5d29yZCBpcyBhIHRydWUKKyAgYWJicmV2aWF0aW9uIChsZWZ0IHN1YnN0cmluZykgb2YgdGhlIGZ1bGwga2V5d29yZC4KKyovCisJICAgIGlmICh0ZXN0KHRhYmxlW3pdLmZsZ3MsQ01fQUJSKSkgeworCQlpbnQgeno7CisJCWZvciAoenogPSB6KzE7IHp6IDwgbjsgenorKykKKwkJICBpZiAoKHRhYmxlW3p6XS5rd3ZhbCA9PSB0YWJsZVt6XS5rd3ZhbCkgJiYKKwkJICAgICAgKCF0ZXN0KHRhYmxlW3p6XS5mbGdzLENNX0FCUikpICYmCisJCSAgICAgICghdGVzdCh0YWJsZVt6el0uZmxncyxDTV9JTlYpKSkgeworCQkgICAgICB6ID0geno7CisJCSAgICAgIGJyZWFrOworCQkgIH0KKwkgICAgfQorCSAgICB4cCA9IHRhYmxlW3pdLmt3ZCArIGNjOworCSAgICBpZiAoY21zd2l0Y2ggJiYgdGVzdCh0YWJsZVt6XS5mbGdzLENNX0FSRykpIHsKKyNpZmRlZiBWTVMKKwkJcHJpbnRmKCIlcz0iLHhwKTsKKwkJYnJrY2hhciA9ICc9JzsKKyNlbHNlCisJCXByaW50ZigiJXM6Iix4cCk7CisJCWJya2NoYXIgPSAnOic7CisjZW5kaWYgLyogVk1TICovCisJICAgIH0gZWxzZSB7CisJCXByaW50ZigiJXMgIix4cCk7CisJCWJya2NoYXIgPSBTUDsKKwkgICAgfQorI2lmZGVmIENLX1JFQ0FMTAorCSAgICBpZiAodGVzdCh0YWJsZVt6XS5mbGdzLENNX05PUikpIG5vX3JlY2FsbCA9IDE7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisJICAgIGNta3dmbGdzID0gdGFibGVbel0uZmxnczsKKyNpZmRlZiBHRU1ET1MKKwkgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogR0VNRE9TICovCisJICAgIGFkZGJ1Zih4cCk7CisJICAgIGlmIChjbXN3aXRjaCAmJiB0ZXN0KHRhYmxlW3pdLmZsZ3MsQ01fQVJHKSkgeworCQlicC0tOwkJCS8qIFJlcGxhY2UgdHJhaWxpbmcgc3BhY2Ugd2l0aCA6ICovCisjaWZkZWYgVk1TCisJCSpicCsrID0gJz0nOworI2Vsc2UKKwkJKmJwKysgPSAnOic7CisjZW5kaWYgLyogVk1TICovCisJCSpicCA9IE5VTDsKKwkJbnAgPSBicDsKKwkJc3dhcmcgPSAxOworCSAgICB9CisJICAgIGlud29yZCA9IDA7CisJICAgIGNtZmxncyA9IDA7CisJICAgIGRlYnVnKEYxMTAsImNta2V5OiBhZGRidWYiLGNtZGJ1ZiwwKTsKKwkgICAgcmV0dXJuKHkpOworCisJICBjYXNlIDM6CQkJLyogVXNlciB0eXBlZCAiPyIgKi8KKwkgICAgaWYgKGYpIHsJCQkvKiBJZiBhIGNvbnZlcnNpb24gZnVuY3Rpb24gaXMgZ2l2ZW4gKi8KKwkJY2hhciAqIHBwOworCQl6cSA9IGF0eGJ1ZjsJCS8qIGRvIHRoZSBjb252ZXJzaW9uIG5vdy4gKi8KKwkJcHAgPSBhdHhidWY7CisJCWF0eG4gPSBDTURCTDsKKwkJaWYgKCgqZikoYXRtYnVmLCZ6cSwmYXR4bikgPCAwKSByZXR1cm4oLTIpOworCQlpZiAoc2V0YXRtKHBwLDApIDwgMCkgeworCQkgICAgcHJpbnRmKCI/RXZhbHVhdGVkIGtleXdvcmQgdG9vIGxvbmdcbiIpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorCSAgICB9CisJICAgIHkgPSBsb29rdXAodGFibGUsYXRtYnVmLG4sJnopOyAvKiBMb29rIHVwIHdoYXQgd2UgaGF2ZSBzbyBmYXIuICovCisJICAgIGlmICh5ID09IC0xKSB7CisJCS8qCisJCSAgU3RyaWN0bHkgc3BlYWtpbmcgaWYgdGhlIG1haW4ga2V5d29yZCB0YWJsZSBzZWFyY2ggZmFpbHMsCisJCSAgdGhlbiB3ZSBzaG91bGQgbG9vayBpbiB0aGUgdG9rZW4gdGFibGUgaWYgb25lIGlzIGdpdmVuLgorCQkgIEJ1dCBpbiBwcmFjdGljZSwgdG9rZW5zIGFyZSBhbHNvIGluY2x1ZGVkIGluIHRoZSBtYWluCisJCSAga2V5d29yZCB0YWJsZS4KKwkJKi8KKwkJY21mbGdzID0gLTI7CisJCWlmICgocG1zZyAmIDEpICYmICFxdWlldCkgeworCQkgICAgYmxlZXAoQlBfRkFJTCk7CisJCSAgICBwcmludGYoIiBObyBrZXl3b3JkcyBtYXRjaFxuIik7CisJCSAgICByZXR1cm4oLTkpOworCQl9CisJCXJldHVybigtMik7CisJICAgIH0KKyNpZm5kZWYgQ09NTUVOVAorCSAgICAvKiBUaGlzIGlzIHRvIGFsbG93ID8taGVscCB0byB3b3JrIGltbWVkaWF0ZWx5IGFmdGVyIGEgdG9rZW4gKi8KKwkgICAgLyogd2l0aG91dCBoYXZpbmcgdG8gdHlwZSBhbiBpbnRlcm1lZGlhdGUgc3BhY2UgKi8KKwkgICAgaWYgKHRsKSB7CisJCWZvciAoaSA9IDA7IGkgPCB0bDsgaSsrKSAvKiBDaGVjayBmb3IgdG9rZW4gKi8KKwkJICBpZiAodG9rW2ldID09ICphdG1idWYpIHsgLyogR290IG9uZSAqLworCQkgICAgICBkZWJ1ZyhGMDAwLCJjbWtleSB0b2tlbjoiLGF0bWJ1ZiwqYXRtYnVmKTsKKwkJICAgICAgdW5nd29yZCgpOwkvKiBQdXQgYmFjayB0aGUgZm9sbG93aW5nIHdvcmQgKi8KKwkJICAgICAgY21mbGdzID0gMzsJLyogRm9yY2UgaGVscCBuZXh0IHRpbWUgYXJvdW5kICovCisJCSAgICAgIHJldHVybigtNSk7CS8qIFNwZWNpYWwgcmV0dXJuIGNvZGUgZm9yIHRva2VuICovCisJCSAgfQorCSAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisJICAgIGlmICgqeGhscCA9PSBOVUwpCisJICAgICAgcHJpbnRmKCIgT25lIG9mIHRoZSBmb2xsb3dpbmc6XG4iKTsKKwkgICAgZWxzZQorCSAgICAgIHByaW50ZigiICVzLCBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiIseGhscCk7CisJICAgIHsKKwkJaW50IHg7CisJCXggPSBwbXNnICYgKDJ8NCk7CS8qIFNlZSBrd2RoZWxwKCkgY29tbWVudHMgKi8KKwkJaWYgKGF0bWJ1ZlswXSkJCS8qIElmIG5vdCBhdCBiZWdpbm5pbmcgb2YgZmllbGQgKi8KKwkJICB4IHw9IDE7CQkvKiBhbHNvIHNob3cgaW52aXNpYmxlcyAqLworCQlrd2RoZWxwKHRhYmxlLG4sYXRtYnVmLCIiLCIiLDEseCk7CisJICAgIH0KKyNpZm5kZWYgTk9TUEwKKwkgICAgaWYgKCFoYXZldG9rZW4pIHsKKwkJZXh0ZXJuIGludCB0b3BjbWQ7CisJCWlmICh0bCA+IDAgJiYgdG9wY21kICE9IFhYSExQKSAvKiBUaGlzIGlzIGJhZC4uLiAqLworCQkgIHByaW50Zigib3IgYSBtYWNybyBuYW1lIChcImRvID9cIiBmb3IgYSBsaXN0KSAiKTsKKwkgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisJICAgIGlmICgqYXRtYnVmID09IE5VTCAmJiAhaGF2ZXRva2VuKSB7CisJCWlmICh0bCA9PSAxKQorCQkgIHByaW50Zigib3IgdGhlIHRva2VuICVjXG4iLCp0b2spOworCQllbHNlIGlmICh0bCA+IDEpCisJCSAgcHJpbnRmKCJvciBvbmUgb2YgdGhlIHRva2VuczogJXNcbiIsY2tzcHJlYWQodG9rKSk7CisJICAgIH0KKwkgICAgcHJpbnRmKCIlcyVzIiwgY21wcm9tLCBjbWRidWYpOworCSAgICBmZmx1c2goc3Rkb3V0KTsKKwkgICAgYnJlYWs7CisKKwkgIGRlZmF1bHQ6CisJICAgIHByaW50ZigiXG4lZCAtIFVuZXhwZWN0ZWQgcmV0dXJuIGNvZGUgZnJvbSBndHdvcmRcbiIsenopOworCSAgICByZXR1cm4oY21mbGdzID0gLTIpOworCX0KKwl6eiA9IGd0d29yZCgocG1zZyA9PSA0KSA/IDEgOiAwKTsKKwlkZWJ1ZyhGMTExLCJjbWtleSBndHdvcmQgenoiLGF0bWJ1Zix6eik7CisgICAgfQorfQorCitpbnQKK2Noa3Rvayh0bGlzdCkgY2hhciAqdGxpc3Q7IHsKKyAgICBjaGFyICpwOworICAgIHAgPSB0bGlzdDsKKyAgICB3aGlsZSAoKnAgIT0gTlVMICYmICpwICE9ICphdG1idWYpIHArKzsKKyAgICByZXR1cm4oKCpwKSA/IChpbnQpICpwIDogMCk7Cit9CisKKy8qIFJvdXRpbmVzIGZvciBwYXJzaW5nIGFuZCBjb252ZXJ0aW5nIGRhdGVzIGFuZCB0aW1lcyAqLworCisjZGVmaW5lIGlzZGF0ZXNlcChjKSAoY2tzdHJjaHIoIiAtLy5fIixjKSkKKworI2RlZmluZSBDTURBVEVCVUYgMTAyNAorY2hhciBjbWRhdGVidWZbQ01EQVRFQlVGKzRdID0geyBOVUwsIE5VTCB9Oworc3RhdGljIGNoYXIgKiBjbWRhdGVicCA9IGNtZGF0ZWJ1ZjsKK2NoYXIgKiBjbWRhdGVtc2cgPSBOVUxMOworCitzdGF0aWMgc3RydWN0IGtleXRhYiB0aW1ldW5pdHNbXSA9IHsKKyAgICB7ICJkYXlzIiwgICBUVV9EQVlTLCAgIDAgfSwKKyAgICB7ICJtb250aHMiLCBUVV9NT05USFMsIDAgfSwKKyAgICB7ICJ3ZWVrcyIsICBUVV9XRUVLUywgIDAgfSwKKyAgICB7ICJ3a3MiLCAgICBUVV9XRUVLUywgIDAgfSwKKyAgICB7ICJ5ZWFycyIsICBUVV9ZRUFSUywgIDAgfSwKKyAgICB7ICJ5cnMiLCAgICBUVV9ZRUFSUywgIDAgfQorfTsKK3N0YXRpYyBpbnQgbnVuaXRzID0gKHNpemVvZih0aW1ldW5pdHMpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2RlZmluZSBTWU1fTk9XICAwCisjZGVmaW5lIFNZTV9UT0RBIDEKKyNkZWZpbmUgU1lNX1RPTU8gMgorI2RlZmluZSBTWU1fWUVTVCAzCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHN5bWRheXRhYltdID0geworICAgIHsgIm5vdyIsICAgICAgIFNZTV9OT1csICAwIH0sCisgICAgeyAidG9kYXkiLCAgICAgU1lNX1RPREEsIDAgfSwKKyAgICB7ICJ0b21vcnJvdyIsICBTWU1fVE9NTywgMCB9LAorICAgIHsgInllc3RlcmRheSIsIFNZTV9ZRVNULCAwIH0KK307CitzdGF0aWMgaW50IG5zeW1kYXlzID0gKHNpemVvZihzeW1kYXl0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgZGF5c29md2Vla1tdID0geworICAgIHsgIkZyaWRheSIsICAgIDUsIDAgfSwKKyAgICB7ICJNb25kYXkiLCAgICAxLCAwIH0sCisgICAgeyAiU2F0dXJkYXkiLCAgNiwgMCB9LAorICAgIHsgIlN1bmRheSIsICAgIDAsIDAgfSwKKyAgICB7ICJUaHVyc2RheSIsICA0LCAwIH0sCisgICAgeyAiVHVlc2RheSIsICAgMiwgMCB9LAorICAgIHsgIldlZG5lc2RheSIsIDMsIDAgfQorfTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgdXNhdHpbXSA9IHsJLyogUkZDIDgyMiB0aW1lem9uZXMgICovCisgICAgeyAiY2R0IiwgIDUsIDAgfSwJCQkvKiBWYWx1ZXMgYXJlIEdNVCBvZmZzZXRzICovCisgICAgeyAiY3N0IiwgIDYsIDAgfSwKKyAgICB7ICJlZHQiLCAgNCwgMCB9LAorICAgIHsgImVzdCIsICA1LCAwIH0sCisgICAgeyAiZ210IiwgIDAsIDAgfSwKKyAgICB7ICJtZHQiLCAgNiwgMCB9LAorICAgIHsgIm1zdCIsICA3LCAwIH0sCisgICAgeyAicGR0IiwgIDcsIDAgfSwKKyAgICB7ICJwc3QiLCAgOCwgMCB9LAorICAgIHsgInV0YyIsICAwLCAwIH0sCisgICAgeyAienVsdSIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbnVzYXR6ID0gKHNpemVvZih1c2F0eikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCisKKy8qICBDIE0gQyBWIFQgRCBBIFQgRSAgLS0gIENvbnZlcnRzIGZyZWUtZm9ybSBkYXRlIHRvIHN0YW5kYXJkIGZvcm0uICAqLworCisvKgorICAgQ2FsbCB3aXRoCisgICAgIHMgPSBwb2ludGVyIHRvIGZyZWUtZm9ybWF0IGRhdGUsIHRpbWUsIG9yIGRhdGUgYW5kIHRpbWUuCisgICAgIHQgPSAwOiByZXR1cm4gdGltZSBvbmx5IGlmIHRpbWUgd2FzIGdpdmVuIGluIHMuCisgICAgIHQgPSAxOiBhbHdheXMgcmV0dXJuIHRpbWUgKDAwOjAwOjAwIGlmIG5vIHRpbWUgZ2l2ZW4gaW4gcykuCisgICAgIHQgPSAyOiBhbGxvdyB0aW1lIHRvIGJlID4gMjQ6MDA6MDAuCisgICBSZXR1cm5zOgorICAgICBOVUxMIG9uIGZhaWx1cmU7CisgICAgIFBvaW50ZXIgdG8gInl5eXltbWRkIGhoOm1tOnNzIiAobG9jYWwgZGF0ZS10aW1lKSBvbiBzdWNjZXNzLgorKi8KKworLyoKKyAgQmVmb3JlIGZpbmFsIHJlbGVhc2UgdGhlIGZvbGxvd2luZyBsb25nIGxpbmVzIHNob3VsZCBiZSB3cmFwcGVkLgorICBVbnRpbCB0aGVuIHdlIGxlYXZlIHRoZW0gbG9uZyBzaW5jZSB3cmFwcGluZyB0aGVtIHdyZWNrcyBFTUFDUydzCisgIEMgaW5kZW50YXRpb24uCisqLworCisvKiBhc2N0aW1lIHBhdHRlcm4gKi8KK3N0YXRpYyBjaGFyICogYXRwMSA9ICJbQS1aXVthLXpdW2Etel0gW0EtWl1bYS16XVthLXpdIFsgMC05XVswLTldIFswLTldWzAtOV06WzAtOV1bMC05XTpbMC05XVswLTldIFswLTldWzAtOV1bMC05XVswLTldIjsKKworLyogYXNjdGltZSBwYXR0ZXJuIHdpdGggdGltZXpvbmUgKi8KK3N0YXRpYyBjaGFyICogYXRwMiA9ICJbQS1aXVthLXpdW2Etel0gW0EtWl1bYS16XVthLXpdIFsgMC05XVswLTldIFswLTldWzAtOV06WzAtOV1bMC05XTpbMC05XVswLTldIFtBLVpdW0EtWl1bQS1aXSBbMC05XVswLTldWzAtOV1bMC05XSI7CisKKyNkZWZpbmUgREFURUJVRkxFTiAxMjcKKyNkZWZpbmUgWVlZWU1NREQgMTIKKworI2RlZmluZSBpc2xlYXAoeSkgKCgoeSkgJSA0ID09IDAgJiYgKHkpICUgMTAwICE9IDApIHx8ICh5KSAlIDQwMCA9PSAwKQorc3RhdGljIGludCBtZGF5c1sxM10gPSB7IDAsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEgfTsKKworI2RlZmluZSBORUVEX0RBWVMgMQorI2RlZmluZSBORUVEX0hSUyAgMgorI2RlZmluZSBORUVEX01JTlMgMworI2RlZmluZSBORUVEX1NFQ1MgNAorI2RlZmluZSBORUVEX0ZSQUMgNQorCisjZGVmaW5lIERFTFRBQlVGIDI1Ngorc3RhdGljIGNoYXIgZGVsdGFidWZbREVMVEFCVUZdOworc3RhdGljIGNoYXIgKiBkZWx0YWJwID0gZGVsdGFidWY7CisKK2NoYXIgKgorY21kZWx0YSh5eSwgbW8sIGRkLCBoaCwgbW0sIHNzLCBzaWduLCBkeXksIGRtbywgZGRkLCBkaGgsIGRtbSwgZHNzKQorICAgIGludCB5eSwgbW8sIGRkLCBoaCwgbW0sIHNzLCBzaWduLCBkeXksIGRtbywgZGRkLCBkaGgsIGRtbSwgZHNzOworLyogY21kZWx0YSAqLyB7CisgICAgaW50IHp5eSwgem1vLCB6ZGQsIHpoaCwgem1tLCB6c3M7CisgICAgbG9uZyB0MSwgdDIsIHQzLCB0NDsKKyAgICBsb25nIGQxID0gMCwgZDIsIGQzOworICAgIGNoYXIgZGF0ZWJ1ZltEQVRFQlVGTEVOKzFdOworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisJZGVidWcoRjEwMSwiY21kZWx0YSB5eSIsIiIseXkpOworCWRlYnVnKEYxMDEsImNtZGVsdGEgbW8iLCIiLG1vKTsKKwlkZWJ1ZyhGMTAxLCJjbWRlbHRhIGRkIiwiIixkZCk7CisJZGVidWcoRjEwMSwiY21kZWx0YSBoaCIsIiIsaGgpOworCWRlYnVnKEYxMDEsImNtZGVsdGEgbW0iLCIiLG1tKTsKKwlkZWJ1ZyhGMTAxLCJjbWRlbHRhIHNzIiwiIixzcyk7CisJZGVidWcoRjEwMSwiY21kZWx0YSBzaW4iLCIiLHNpZ24pOworCWRlYnVnKEYxMDEsImNtZGVsdGEgZHl5IiwiIixkeXkpOworCWRlYnVnKEYxMDEsImNtZGVsdGEgZG1vIiwiIixkbW8pOworCWRlYnVnKEYxMDEsImNtZGVsdGEgZGRkIiwiIixkZGQpOworCWRlYnVnKEYxMDEsImNtZGVsdGEgZGhoIiwiIixkaGgpOworCWRlYnVnKEYxMDEsImNtZGVsdGEgZG1tIiwiIixkbW0pOworCWRlYnVnKEYxMDEsImNtZGVsdGEgZHNzIiwiIixkc3MpOworICAgIH0KKyNlbmRpZiAvKiBERUJMT0cgKi8KKworICAgIGlmICh5eSA8IDAgfHwgeXkgPiA5OTk5KSB7CisJbWFrZXN0cigmY21kYXRlbXNnLCJCYXNlIHllYXIgb3V0IG9mIHJhbmdlIik7CisJZGVidWcoRjExMSwiY21kZWx0YSIsY21kYXRlbXNnLC0xKTsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIGlmIChtbyA8IDEgfHwgbW8gPiAxMikgeworCW1ha2VzdHIoJmNtZGF0ZW1zZywiQmFzZSBtb250aCBvdXQgb2YgcmFuZ2UiKTsKKwlkZWJ1ZyhGMTExLCJjbWRlbHRhIixjbWRhdGVtc2csLTEpOworCXJldHVybihOVUxMKTsKKyAgICB9CisgICAgaWYgKGRkIDwgMSB8fCBkZCA+IG1kYXlzW21vXSkgeworCW1ha2VzdHIoJmNtZGF0ZW1zZywiQmFzZSBkYXkgb3V0IG9mIHJhbmdlIik7CisJZGVidWcoRjExMSwiY21kZWx0YSIsY21kYXRlbXNnLC0xKTsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIGlmIChoaCA8IDAgfHwgaGggPiAyMykgeworCW1ha2VzdHIoJmNtZGF0ZW1zZywiQmFzZSBob3VyIG91dCBvZiByYW5nZSIpOworCWRlYnVnKEYxMTEsImNtZGVsdGEiLGNtZGF0ZW1zZywtMSk7CisJcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBpZiAobW0gPCAwIHx8IG1tID4gNTkpIHsKKwltYWtlc3RyKCZjbWRhdGVtc2csIkJhc2UgbWludXRlIG91dCBvZiByYW5nZSIpOworCWRlYnVnKEYxMTEsImNtZGVsdGEiLGNtZGF0ZW1zZywtMSk7CisJcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBpZiAoc3MgPCAwIHx8IHNzID4gNjApIHsKKwltYWtlc3RyKCZjbWRhdGVtc2csIkJhc2Ugc2Vjb25kIG91dCBvZiByYW5nZSIpOworCWRlYnVnKEYxMTEsImNtZGVsdGEiLGNtZGF0ZW1zZywtMSk7CisJcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBzaWduID0gKHNpZ24gPCAwKSA/IC0xIDogMTsKKyAgICBpZiAoZG1vICE9IDApIHsKKwltbyArPSAoc2lnbiAqIGRtbyk7CisJaWYgKG1vID4gMTIgfHwgbW8gPCAwKSB7CisJICAgIHl5ICs9IG1vIC8gMTI7CisJICAgIG1vID0gbW8gJSAxMjsKKwl9CisgICAgfQorICAgIGlmIChkeXkgIT0gMCkgeworCXl5ICs9IChzaWduICogZHl5KTsKKwlpZiAoeXkgPiA5OTk5IHx8IHl5IDwgMCkgeworCSAgICBtYWtlc3RyKCZjbWRhdGVtc2csIlJlc3VsdCB5ZWFyIG91dCBvZiByYW5nZSIpOworCSAgICBkZWJ1ZyhGMTExLCJjbWRlbHRhIixjbWRhdGVtc2csLTEpOworCSAgICByZXR1cm4oTlVMTCk7CisJfQorICAgIH0KKyAgICBzcHJpbnRmKGRhdGVidWYsIiUwNGQlMDJkJTAyZCAlMDJkOiUwMmQ6JTAyZCIseXksbW8sZGQsaGgsbW0sc3MpOworICAgIGQxID0gbWpkKGRhdGVidWYpOworICAgIGRlYnVnKEYxMTEsImNtZGVsdGEgbWpkIixkYXRlYnVmLGQxKTsgICAgCisKKyAgICB0MSA9IGhoICogMzYwMCArIG1tICogNjAgKyBzczsJLyogQmFzZSB0aW1lIHRvIHNlY3Mgc2luY2UgbWlkbmlnaHQgKi8KKyAgICB0MiA9IGRoaCAqIDM2MDAgKyBkbW0gKiA2MCArIGRzczsJLyogRGVsdGEgdGltZSwgZGl0dG8gKi8KKyAgICB0MyA9IHQxICsgKHNpZ24gKiB0Mik7CQkvKiBHZXQgc3VtIChvciBkaWZmZXJlbmNlKSAqLworICAgIAorICAgIGQyID0gKHNpZ24gKiBkZGQpOwkJCS8qIERlbHRhIGRheXMgKi8KKyAgICBkMiArPSB0MyAvIDg2NDAwTDsKKworICAgIHQ0ID0gdDMgJSA4NjQwMEw7CQkJLyogRnJhY3Rpb25hbCBwYXJ0IG9mIGRheSAqLworICAgIGlmICh0NCA8IDApIHsJCQkvKiBJZiBuZWdhdGl2ZSAqLworCWQyLS07CQkJCS8qIG9uZSBsZXNzIGRlbHRhIGRheSAqLworCXQ0ICs9IDg2NDAwTDsJCQkvKiBnZXQgcG9zaXRpdmUgc2Vjb25kcyAqLworICAgIH0KKyAgICBoaCA9IChpbnQpICh0NCAvIDM2MDBMKTsKKyAgICBtbSA9IChpbnQpICh0NCAlIDM2MDBMKSAvIDYwOworICAgIHNzID0gKGludCkgKHQ0ICUgMzYwMEwpICUgNjA7CisKKyAgICBzcHJpbnRmKGRhdGVidWYsIiVzICUwMmQ6JTAyZDolMDJkIiwgbWpkMmRhdGUoZDErZDIpLGhoLG1tLHNzKTsKKyAgICB7CisJaW50IGxlbiwgaywgbjsKKwljaGFyICogcDsKKwlsZW4gPSBzdHJsZW4oZGF0ZWJ1Zik7CisJayA9IGRlbHRhYnAgLSAoY2hhciAqKWRlbHRhYnVmOwkvKiBTcGFjZSB1c2VkICovCisJbiA9IERFTFRBQlVGIC0gayAtIDE7CQkvKiBTcGFjZSBsZWZ0ICovCisJaWYgKG4gPCBsZW4pIHsJCQkvKiBOb3QgZW5vdWdoPyAqLworCSAgICBkZWx0YWJwID0gZGVsdGFidWY7CQkvKiBXcmFwIGFyb3VuZCAqLworCSAgICBuID0gREVMVEFCVUY7CisJfQorCWNrc3RybmNweShkZWx0YWJwLGRhdGVidWYsbik7CisJcCA9IGRlbHRhYnA7CisJZGVsdGFicCArPSBsZW4gKyAxOworCXJldHVybihwKTsKKyAgICB9Cit9CisKKworLyogQ29udmVydCBEZWx0YSBUaW1lIHRvIFNlY29uZHMgKi8KKworaW50CitkZWx0YTJzZWMocyxyZXN1bHQpIGNoYXIgKiBzOyBsb25nICogcmVzdWx0OyB7CisgICAgbG9uZyBkZGF5cyA9IDBMLCB6ejsKKyAgICBpbnQgZHNpZ24gPSAxLCBkaG91cnMgPSAwLCBkbWlucyA9IDAsIGRzZWNzID0gMCwgdW5pdHM7CisgICAgaW50IHN0YXRlID0gTkVFRF9EQVlTOworICAgIGNoYXIgKnAsICpwMiwgKnAzLCBjID0gMDsKKyAgICBjaGFyIGJ1Zls2NF07CisKKyAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICBpZiAoISpzKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAoKGludClzdHJsZW4ocykgPiA2MykKKyAgICAgIHJldHVybigtMSk7CisgICAgY2tzdHJuY3B5KGJ1ZixzLDY0KTsKKyAgICBwID0gYnVmOworCisgICAgaWYgKCpwICE9ICcrJyAmJiAqcCAhPSAnLScpCisgICAgICByZXR1cm4oLTEpOworCisgICAgaWYgKCpwKysgPT0gJy0nKQorICAgICAgZHNpZ24gPSAtMTsKKyAgICB3aGlsZSAoKnAgPT0gU1ApCQkJLyogU2tpcCBpbnRlcnZlbmluZyBzcGFjZXMgKi8KKyAgICAgIHArKzsKKworICAgIHdoaWxlIChzdGF0ZSkgewkJCS8qIEZTQSB0byBwYXJzZSBkZWx0YSB0aW1lICovCisJaWYgKHN0YXRlIDwgMCB8fCAhaXNkaWdpdCgqcCkpCisJICByZXR1cm4oLTEpOworCXAyID0gcDsJCQkJLyogR2V0IG5leHQgbnVtZXJpYyBmaWVsZCAqLworCXdoaWxlIChpc2RpZ2l0KCpwMikpCisJICBwMisrOworCWMgPSAqcDI7CQkJLyogQW5kIGJyZWFrIGNoYXJhY3RlciAqLworCSpwMiA9IE5VTDsJCQkvKiBUZXJtaW5hdGUgdGhlIG51bWJlciAqLworCXN3aXRjaCAoc3RhdGUpIHsJCS8qIEludGVycHJldCBhY2NvcmRpbmcgdG8gc3RhdGUgKi8KKwkgIGNhc2UgTkVFRF9EQVlTOgkJLyogSW5pdGlhbCAqLworCSAgICBpZiAoKGMgPT0gJy0nKSB8fAkJLyogVk1TIGZvcm1hdCAqLworCQkoKGMgPT0gJ2QnIHx8IGMgPT0gJ0QnKQorCQkgJiYgIWlzYWxwaGEoKihwMisxKSkpKSB7IC8qIERheXMgKi8KKwkJZGRheXMgPSBhdG9sKHApOworCQlpZiAoISoocDIrMSkpCQkJCisJCSAgc3RhdGUgPSAwOworCQllbHNlCQkJLyogaWYgYW55dGhpbmcgaXMgbGVmdCAqLworCQkgIHN0YXRlID0gTkVFRF9IUlM7CS8qIG5vdyB3ZSB3YW50IGhvdXJzLiAqLworCSAgICB9IGVsc2UgaWYgKGMgPT0gJzonKSB7CS8qIGRlbGltaXRlciBpcyBjb2xvbiAqLworCQlkaG91cnMgPSBhdG9pKHApOwkvKiBzbyBpdCdzIGhvdXJzICovCisJCXN0YXRlID0gTkVFRF9NSU5TOwkvKiBub3cgd2Ugd2FudCBtaW51dGVzICovCisJICAgIH0gZWxzZSBpZiAoIWMpIHsJCS8qIGVuZCBvZiBzdHJpbmcgKi8KKwkJZGhvdXJzID0gYXRvaShwKTsJLyogaXQncyBzdGlsbCBob3VycyAqLworCQlzdGF0ZSA9IDA7CQkvKiBhbmQgd2UncmUgZG9uZSAqLworCSAgICB9IGVsc2UgaWYgKGlzYWxwaGEoYykgfHwgYyA9PSBTUCkgeworCQlpZiAoYyA9PSBTUCkgewkJLyogSXQncyBhIGtleXdvcmQ/ICovCisJCSAgICBwMisrOwkJLyogU2tpcCBzcGFjZXMgKi8KKwkJICAgIHdoaWxlICgqcDIgPT0gU1ApCisJCSAgICAgIHAyKys7CisJCX0gZWxzZSB7CQkvKiBvciByZXBsYWNlIGZpcnN0IGxldHRlciAqLworCQkgICAgKnAyID0gYzsKKwkJfQorCQlwMyA9IHAyOwkJLyogcDIgcG9pbnRzIHRvIGJlZ2lubmluZyBvZiBrZXl3b3JkICovCisJCXdoaWxlIChpc2FscGhhKCpwMykpCS8qIEZpbmQgZW5kIG9mIGtleXdvcmQgKi8KKwkJICBwMysrOworCQljID0gKnAzOwkJLyogTlVMIGl0IG91dCBzbyB3ZSBjYW4gbG9vayBpdCB1cCAqLworCQlpZiAoKnAzKQkJLyogcDMgcG9pbnRzIHRvIGtleXdvcmQgdGVybWluYXRvciAqLworCQkgICpwMyA9IE5VTDsKKwkJaWYgKCh1bml0cyA9IGxvb2t1cCh0aW1ldW5pdHMscDIsbnVuaXRzLE5VTEwpKSA8IDApCisJCSAgcmV0dXJuKC0xKTsKKwkJKnAyID0gTlVMOwkJLyogUmUtdGVybWluYXRlIHRoZSBudW1iZXIgKi8KKwkJKnAzID0gYzsKKwkJd2hpbGUgKCpwMyA9PSBTUCkJLyogUG9pbnQgYXQgZmllbGQgYWZ0ZXIgdW5pdHMgKi8KKwkJICBwMysrOworCQlwMiA9IHAzOworCQlzd2l0Y2ggKHVuaXRzKSB7CisJCSAgY2FzZSBUVV9EQVlTOgorCQkgICAgZGRheXMgPSBhdG9sKHApOworCQkgICAgYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJICAgIHJldHVybigtMSk7CisJCX0KKwkJaWYgKCpwMikgeworCQkgICAgc3RhdGUgPSBORUVEX0hSUzsKKwkJICAgIHAyLS07CisJCX0gZWxzZQorCQkgIHN0YXRlID0gMDsKKwkgICAgfSBlbHNlIHsJCQkvKiBBbnl0aGluZyBlbHNlICovCisJCXN0YXRlID0gLTE7CQkvKiBpcyBhbiBlcnJvciAqLworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSBORUVEX0hSUzoJCS8qIExvb2tpbmcgZm9yIGhvdXJzICovCisJICAgIGlmIChjID09ICc6JykgeworCQlkaG91cnMgPSBhdG9pKHApOworCQlzdGF0ZSA9IE5FRURfTUlOUzsKKwkgICAgfSBlbHNlIGlmICghYykgeworCQlkaG91cnMgPSBhdG9pKHApOworCQlzdGF0ZSA9IDA7CisJICAgIH0gZWxzZSB7CisJCXN0YXRlID0gLTE7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlIE5FRURfTUlOUzoJCS8qIExvb2tpbmcgZm9yIG1pbnV0ZXMgKi8KKwkgICAgaWYgKGMgPT0gJzonKSB7CisJCWRtaW5zID0gYXRvaShwKTsKKwkJc3RhdGUgPSBORUVEX1NFQ1M7CisJICAgIH0gZWxzZSBpZiAoIWMpIHsKKwkJZG1pbnMgPSBhdG9pKHApOworCQlzdGF0ZSA9IDA7CisJICAgIH0gZWxzZSB7CisJCXN0YXRlID0gLTE7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlIE5FRURfU0VDUzoJCS8qIExvb2tpbmcgZm9yIHNlY29uZHMgKi8KKwkgICAgaWYgKGMgPT0gJy4nKSB7CisJCWRzZWNzID0gYXRvaShwKTsKKwkJc3RhdGUgPSBORUVEX0ZSQUM7CisJICAgIH0gZWxzZSBpZiAoIWMpIHsKKwkJZHNlY3MgPSBhdG9pKHApOworCQlzdGF0ZSA9IDA7CisJICAgIH0gZWxzZSB7CisJCXN0YXRlID0gLTE7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlIE5FRURfRlJBQzoJCS8qIEZyYWN0aW9uIG9mIHNlY29uZCAqLworCSAgICBpZiAoIWMgJiYgcmRpZ2l0cyhwKSkgeworCQlpZiAoKnAgPiAnNCcpCisJCSAgZHNlY3MrKzsKKwkJc3RhdGUgPSAwOworCSAgICB9IGVsc2UgeworCQlzdGF0ZSA9IC0xOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKwlpZiAoYykJCQkJLyogbmV4dCBmaWVsZCBpZiBhbnkgKi8KKwkgIHAgPSBwMiArIDE7CisgICAgfQorICAgIGlmIChzdGF0ZSA8IDApCisgICAgICByZXR1cm4oLTEpOworCisgICAgLyogaWYgZGF5cyA+IDI0ODU0IGFuZCBzaXplb2YobG9uZykgPT0gMzIgd2Ugb3ZlcmZsb3cgKi8KKworICAgIHp6ID0gZGRheXMgKiA4NjQwMEw7CisgICAgaWYgKHp6IDwgMEwpCQkJLyogVGhpcyBjYXRjaGVzIGl0ICovCisgICAgICByZXR1cm4oLTIpOworICAgIHp6ICs9IGRob3VycyAqIDM2MDBMICsgZG1pbnMgKiA2MEwgKyBkc2VjczsKKyAgICB6eiAqPSBkc2lnbjsKKyAgICAqcmVzdWx0ID0geno7CisgICAgcmV0dXJuKDApOworfQorCisKK2NoYXIgKgorY21jdnRkYXRlKHMsdCkgY2hhciAqIHM7IGludCB0OyB7CisgICAgaW50IHgsIGksIGosIGssIGhoLCBtbSwgc3MsIGZmLCBwbWZsYWcgPSAwLCBub2RhdGUgPSAwLCBsZW4sIGRvdzsKKyAgICBpbnQgdW5pdHMsIGlzZ210ID0gMCwgZ210c2lnbiA9IDAsIGQgPSAwLCBzdGF0ZSA9IDAsIG5kYXk7CisgICAgaW50IGtuID0gMCwgZnRbOF0sIGlzbGV0dGVyID0gMCwgZjJsZW4gPSAwOworCisgICAgaW50IHpoaCA9IDA7CQkJLyogVGltZXpvbmUgYWRqdXN0bWVudHMgKi8KKyAgICBpbnQgem1tID0gMDsKKyAgICBpbnQgemRkID0gMDsKKworICAgIGludCBkc2lnbiA9IDE7CQkJLyogRGVsdGEtdGltZSBhZGp1c3RtZW50cyAqLworICAgIGludCBkZGF5cyA9IDA7CisgICAgaW50IGRtb250aHMgPSAwOworICAgIGludCBkeWVhcnMgPSAwOworICAgIGludCBkaG91cnMgPSAwOworICAgIGludCBkbWlucyA9IDA7CisgICAgaW50IGRzZWNzID0gMDsKKyAgICBpbnQgaGF2ZWRlbHRhID0gMDsKKworICAgIGNoYXIgKiBmbGRbOF0sICogcCA9ICIiLCAqIHAyLCAqIHAzOyAvKiBBc3NvcnRlZCBidWZmZXJzIGFuZCBwb2ludGVycyAgKi8KKyAgICBjaGFyICogczIsICogczM7CisgICAgY2hhciAqIHllYXIgPSBOVUxMLCAqIG1vbnRoID0gTlVMTCwgKiBkYXkgPSBOVUxMOworICAgIGNoYXIgKiBob3VyID0gIjAwIiwgKiBtaW4gPSAiMDAiLCAqIHNlYyA9ICIwMCI7CisgICAgY2hhciBkYXRlc2VwID0gMDsKKyAgICBjaGFyIHRtcGJ1Zls4XTsKKyAgICBjaGFyIHhidWZbREFURUJVRkxFTisxXTsKKyAgICBjaGFyIHlidWZbREFURUJVRkxFTisxXTsKKyAgICBjaGFyIHpidWZbREFURUJVRkxFTisxXTsKKyAgICBjaGFyIHl5eXltbWRkW1lZWVlNTUREXTsKKyAgICBjaGFyIGRidWZbMjZdOworICAgIGNoYXIgZGF5YnVmWzNdOworICAgIGNoYXIgbW9uYnVmWzNdOworICAgIGNoYXIgeWVhcmJ1Zls1XTsKKyAgICBjaGFyIHRpbWJ1ZlsxNl0sICp0YiwgY2M7CisgICAgY2hhciAqIGRwID0gTlVMTDsJCQkvKiBSZXN1bHQgcG9pbnRlciAqLworCisgICAgaWYgKCFzKSBzID0gIiI7CisgICAgdG1wYnVmWzBdID0gTlVMOworCisgICAgd2hpbGUgKCpzID09IFNQKSBzKys7CQkvKiBHb2JibGUgYW55IGxlYWRpbmcgYmxhbmtzICovCisgICAgaWYgKGlzYWxwaGEoKnMpKQkJCS8qIFJlbWVtYmVyIGlmIDFzdCBjaGFyIGlzIGEgbGV0dGVyICovCisgICAgICBpc2xldHRlciA9IDE7CisKKyAgICBsZW4gPSBzdHJsZW4ocyk7CisgICAgZGVidWcoRjExMCwiY21jdnRkYXRlIixzLGxlbik7CisgICAgaWYgKGxlbiA9PSAwKSB7CQkJLyogTm8gYXJnIC0gcmV0dXJuIGN1cnJlbnQgZGF0ZS10aW1lICovCisJZHAgPSBja2RhdGUoKTsKKwlnb3RvIHhjdnRkYXRlOworICAgIH0KKyAgICBpZiAobGVuID4gREFURUJVRkxFTikgewkJLyogQ2hlY2sgbGVuZ3RoIG9mIGFyZyAqLworCW1ha2VzdHIoJmNtZGF0ZW1zZywiRGF0ZS10aW1lIHN0cmluZyB0b28gbG9uZyIpOworCWRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSIsY21kYXRlbXNnLC0xKTsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIGhoID0gMDsJCQkJLyogSW5pdCB0aW1lIHRvIDAwOjAwOjAwLjAgKi8KKyAgICBtbSA9IDA7CisgICAgc3MgPSAwOworICAgIGZmID0gMDsKKyAgICB6dGltZSgmcCk7CisgICAgaWYgKCFwKQorICAgICAgcCAgPSAiIjsKKyAgICBpZiAoKnApIHsJCQkJLyogSW5pdCB0aW1lIHRvIGN1cnJlbnQgdGltZSAqLworCXggPSBja3N0cm5jcHkoZGJ1ZixwLDI2KTsKKwlpZiAoeCA+IDE3KSB7CisJICAgIGhoID0gYXRvaSgmZGJ1ZlsxMV0pOworCSAgICBtbSA9IGF0b2koJmRidWZbMTRdKTsKKwkgICAgc3MgPSBhdG9pKCZkYnVmWzE3XSk7CisJfQorICAgIH0KKyAgICBja3N0cm5jcHkoeXl5eW1tZGQsenpuZGF0ZSgpLFlZWVlNTUREKTsgLyogSW5pdCBkYXRlIHRvIGN1cnJlbnQgZGF0ZSAqLworICAgIGNrc3RybmNweSh5ZWFyYnVmLHl5eXltbWRkLDUpOworICAgIGNrc3RybmNweShtb25idWYsJnl5eXltbWRkWzRdLDMpOworICAgIGNrc3RybmNweShkYXlidWYsJnl5eXltbWRkWzZdLDMpOworICAgIHllYXIgPSB5ZWFyYnVmOworICAgIG1vbnRoID0gbW9uYnVmOworICAgIGRheSA9IGRheWJ1ZjsKKyAgICBuZGF5ID0gYXRvaShkYXlidWYpOworICAgIGNrc3RybmNweSh4YnVmLHMsREFURUJVRkxFTik7CS8qIE1ha2UgYSBsb2NhbCBjb3B5IHdlIGNhbiBwb2tlICovCisgICAgcyA9IHhidWY7CQkJCS8qIFBvaW50IHRvIGl0ICovCisgICAgc1tsZW5dID0gTlVMOworICAgIGlmIChzWzBdID09ICc6JykgeworCXAgPSBzOworCWdvdG8gZG90aW1lOworICAgIH0KKyAgICAvKiBTcGVjaWFsIHByZXNldCBmb3JtYXRzLi4uICovCisKKyAgICBpZiAobGVuID49IDE0KSB7CQkJLyogRlRQIE1EVE0gYWxsLW51bWVyaWMgZGF0ZSAqLworCWNoYXIgYzsKKwljID0gc1sxNF07CQkJLyogZS5nLiAxOTk4MDYxNTEwMDA0NS4wMTQgKi8KKwlzWzE0XSA9IE5VTDsKKwl4ID0gcmRpZ2l0cyhzKTsKKwlzWzE0XSA9IGM7CisJaWYgKHgpIHsKKwkgICAgY2tzdHJuY3B5KHl5eXltbWRkLHMsOCsxKTsKKwkgICAgeWVhciA9IE5VTEw7CisJICAgIHAgPSAmc1s4XTsKKwkgICAgZ290byBkb3RpbWU7CisJfQorICAgIH0KKyAgICB4ID0gMDsJCQkJLyogQmVjb21lcyA+IDAgZm9yIGFzY3RpbWUgZm9ybWF0ICovCisgICAgaWYgKGlzYWxwaGEoc1swXSkpIHsKKwlpZiAobGVuID09IDI0KSB7CQkvKiBBc2N0aW1lIGZvcm1hdD8gKi8KKwkgICAgLyogU2F0IEp1bCAxNCAxNTo1NzozMiAyMDAxICovCisJICAgIHggPSBja21hdGNoKGF0cDEscywwLDApOworCSAgICBkZWJ1ZyhGMTExLCJjbWN2dGRhdGUgYXNjdGltZSIscyx4KTsKKwl9IGVsc2UgaWYgKGxlbiA9PSAyOCkgewkJLyogT3IgQXNjdGltZSBwbHVzIHRpbWV6b25lPyAqLworCSAgICAvKiBTYXQgSnVsIDE0IDE1OjE1OjM5IEVEVCAyMDAxICovCisJICAgIHggPSBja21hdGNoKGF0cDIscywwLDApOworCSAgICBkZWJ1ZyhGMTExLCJjbWN2dGRhdGUgYXNjdGltZSt0aW1lem9uZSIscyx4KTsKKwl9CisgICAgfQorICAgIGlmICh4ID4gMCkgewkJCS8qIEFzY3RpbWUgZm9ybWF0ICovCisgICAgICAgIGludCB4eDsKKyAgICAgICAgc3RybmNweSh5ZWFyYnVmLHMgKyBsZW4gLSA0LDQpOworICAgICAgICB5ZWFyYnVmWzRdID0gTlVMOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgIHRtcGJ1ZltpXSA9IHNbaSs0XTsKKyAgICAgICAgdG1wYnVmWzNdID0gTlVMOworCWlmICgoeHggPSBsb29rdXAoY21vbnRocyx0bXBidWYsMTIsTlVMTCkpIDwgMCkgeworCSAgICBtYWtlc3RyKCZjbWRhdGVtc2csIkludmFsaWQgbW9udGgiKTsKKwkgICAgZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOworCSAgICByZXR1cm4oTlVMTCk7CisJfQorICAgICAgICBkZWJ1ZyhGMTAxLCJjbWN2dGRhdGUgYXNjdGltZSBtb250aCIsIiIseHgpOworICAgICAgICBtb25idWZbMF0gPSAoeHggLyAxMCkgKyAnMCc7IAorICAgICAgICBtb25idWZbMV0gPSAoeHggJSAxMCkgKyAnMCc7IAorICAgICAgICBtb25idWZbMl0gPSBOVUw7CisgICAgICAgIGRheWJ1ZlswXSA9IChzWzhdID09ICcgJyA/ICcwJyA6IHNbOF0pOworICAgICAgICBkYXlidWZbMV0gPSBzWzldOworICAgICAgICBkYXlidWZbMl0gPSBOVUw7CisJeGJ1ZlswXSA9IFNQOworICAgICAgICBmb3IgKGkgPSAxMTsgaSA8IDE5OyBpKyspCisgICAgICAgICAgeGJ1ZltpLTEwXSA9IHNbaV07CisgICAgICAgIHhidWZbOV0gPSBOVUw7CisJY2ttYWttc2coemJ1ZiwxOCx5ZWFyYnVmLG1vbmJ1ZixkYXlidWYseGJ1Zik7CisJZGVidWcoRjExMCwiY21jdnRkYXRlIGFzY3RpbWUgb2siLHpidWYsMCk7CisJaWYgKGxlbiA9PSAyNCkgeworCSAgICBkcCA9IHpidWY7CisJICAgIGdvdG8geGN2dGRhdGU7CisJfSBlbHNlIHsKKwkgICAgaW50IG47CisJICAgIG4gPSBja21ha21zZyh5YnVmLERBVEVCVUZMRU4tNCx6YnVmLCIgIixOVUxMLE5VTEwpOworCSAgICB5YnVmW24rK10gPSBzWzIwXTsKKwkgICAgeWJ1ZltuKytdID0gc1syMV07CisJICAgIHlidWZbbisrXSA9IHNbMjJdOworCSAgICB5YnVmW24rK10gPSBOVUw7CisJICAgIGNrc3RybmNweSh4YnVmLHlidWYsREFURUJVRkxFTik7CisJICAgIHMgPSB4YnVmOworCSAgICBpc2xldHRlciA9IDA7CisJfQorICAgIH0KKworLyogQ2hlY2sgZm9yIGRheSBvZiB3ZWVrICovCisKKyAgICBwID0gczsKKyAgICB3aGlsZSAoKnAgPT0gU1ApIHArKzsKKyAgICBkb3cgPSAtMTsKKyAgICBpZiAoKnApIHsKKwlwMiA9IHA7CisJY2MgPSBOVUw7CisJd2hpbGUgKDEpIHsKKwkgICAgaWYgKCpwMiA9PSAnLCcgfHwgKnAyID09IFNQIHx8ICEqcDIpIHsKKwkJY2MgPSAqcDI7CQkvKiBTYXZlIGJyZWFrIGNoYXIgKi8KKwkJKnAyID0gTlVMOwkJLyogTlVMIGl0IG91dCAqLworCQlwMyA9IHAyOwkJLyogUmVtZW1iZXIgdGhpcyBzcG90ICovCisJCWlmICgoZG93ID0gbG9va3VwKGRheXNvZndlZWsscCw3LE5VTEwpKSA+IC0xKSB7CisJCSAgICBkZWJ1ZyhGMTExLCJjbWN2dGRhdGUgZG93IixwLGRvdyk7CisJCSAgICBzID0gcDI7CisJCSAgICBpZiAoY2MgPT0gJywnIHx8IGNjID09IFNQKSB7IC8qIFBvaW50IHRvIG5leHQgZmllbGQgKi8KKwkJCXMrKzsKKwkJCXdoaWxlICgqcyA9PSBTUCkgcysrOworCQkgICAgfQorCQkgICAgcCA9IHM7CisJCSAgICBkZWJ1ZyhGMTExLCJjbWN2dGRhdGUgZG93IG5ldyBwIixwLGRvdyk7CisJCSAgICBicmVhazsKKwkJfSBlbHNlIGlmIChpc2FscGhhKCpwKSAmJiBjYyA9PSAnLCcpIHsKKwkJICAgIG1ha2VzdHIoJmNtZGF0ZW1zZywiVW5yZWNvZ25pemVkIGRheSBvZiB3ZWVrIik7CisJCSAgICBkZWJ1ZyhGMTExLCJjbWN2dGRhdGUiLGNtZGF0ZW1zZywtMSk7CisJCSAgICByZXR1cm4oTlVMTCk7CisJCX0gZWxzZSB7CisJCSAgICAqcDMgPSBjYzsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwkgICAgcDIrKzsKKwl9CisgICAgfQorICAgIGxlbiA9IHN0cmxlbihzKTsJCS8qIFVwZGF0ZSBsZW5ndGggKi8KKyAgICBkZWJ1ZyhGMTExLCJjbWN2dGRhdGUgcyIscyxsZW4pOworCisgICAgZGVidWcoRjExMSwiY21jdnRkYXRlIGRvdyIscyxkb3cpOworICAgIGlmIChkb3cgPiAtMSkgewkJCS8qIEhhdmUgYSBkYXktb2Ytd2VlayBudW1iZXIgKi8KKwlsb25nIHp6OyBpbnQgbiwgajsKKwl6eiA9IG1qZCh6em5kYXRlKCkpOwkJLyogR2V0IHRvZGF5J3MgTUpEICovCisJZGVidWcoRjExMSwiY21jdnRkYXRlIHp6IiwiIix6eik7CisJaiA9ICgoKGludCkoenogJSA3TCkpICsgMykgJSA3OyAvKiBUb2RheSdzIGRheS1vZi13ZWVrIG51bWJlciAqLworCWRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSBqIiwiIixqKTsKKwloaCA9IDA7CQkJCS8qIEluaXQgdGltZSB0byBtaWRuaWdodCAqLworCW1tID0gMDsKKwlzcyA9IDA7CisJaWYgKGogPT0gZG93KSB7CisJICAgIGNrc3RybmNweSh5eXl5bW1kZCx6em5kYXRlKCksWVlZWU1NREQpOworCSAgICB5ZWFyID0gTlVMTDsKKwl9IGVsc2UgeworCSAgICBuID0gZG93IC0gajsJCS8qIERheXMgZnJvbSBub3cgKi8KKwkgICAgaWYgKGRvdyA8IGopCisJICAgICAgbiArPSA3OworCSAgICBpZiAobiA8IDApIG4gKz0gNzsJCS8qIEFkZCB0byBNSkQgKi8KKwkgICAgenogKz0gbjsKKwkgICAgY2tzdHJuY3B5KHl5eXltbWRkLG1qZDJkYXRlKHp6KSxZWVlZTU1ERCk7IC8qIE5ldyBkYXRlICovCisJICAgIHllYXIgPSBOVUxMOworCX0KKwlkZWJ1ZyhGMTExLCJjbWN2dGRhdGUgQSIseXl5eW1tZGQsbGVuKTsKKwlpZiAobGVuID09IDApIHsJCQkvKiBObyBtb3JlIGZpZWxkcyBhZnRlciB0aGlzICovCisJICAgIGNrbWFrbXNnKHpidWYsMTgseXl5eW1tZGQsIiAwMDowMDowMCIsTlVMTCxOVUxMKTsKKwkgICAgZHAgPSB6YnVmOworCSAgICBnb3RvIHhjdnRkYXRlOworCX0KKwlpc2xldHRlciA9IDA7CisJaWYgKHJkaWdpdHMocCkgJiYgbGVuIDwgOCkJLyogTmV4dCBmaWVsZCBpcyB0aW1lPyAqLworCSAgZ290byBkb3RpbWU7CQkJLyogSWYgc28gZ28gc3RyYWlnaHQgdG8gdGltZSBzZWN0aW9uICovCisJaWYgKGlzZGlnaXQoKnApKSB7CisJICAgIGlmICgqKHArMSkgPT0gJzonKQorCSAgICAgIGdvdG8gZG90aW1lOworCSAgICBlbHNlIGlmIChpc2RpZ2l0KCoocCsxKSkgJiYgKCoocCsyKSA9PSAnOicpKQorCSAgICAgIGdvdG8gZG90aW1lOworCX0KKyAgICB9CisgICAgZGVidWcoRjExMSwiY21jdnRkYXRlIEIgcyIscyxkb3cpOworICAgIGRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSBCIHAiLHAsZG93KTsKKworICAgIGlmICgqcyA9PSAnKycgfHwgKnMgPT0gJy0nKSB7CS8qIERlbHRhIHRpbWUgb25seSAtIHNraXAgYWhlYWQuICovCisJcCA9IHM7CisJZ290byBkZWx0YTsKKyAgICB9CisgICAgaWYgKGRvdyA+IC0xKSB7CisJLyogRGF5IG9mIHdlZWsgZ2l2ZW4gZm9sbG93ZWQgYnkgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgdGltZSAqLworCS8qIG9yIGEgZGVsdGEgc28gaXQgY2FuJ3QgYmUgdmFsaWQgKi8KKwltYWtlc3RyKCZjbWRhdGVtc2csIkludmFsaWQgdG9rZW5zIGFmdGVyIGRheSBvZiB3ZWVrIik7CisJZGVidWcoRjExMSwiY21jdnRkYXRlIGZhaWwiLGNtZGF0ZW1zZywtMSk7CisJcmV0dXJuKE5VTEwpOworICAgIH0KKworICAgIC8qIEhhbmRsZSAidG9kYXkiLCAieWVzdGVyZGF5IiwgInRvbW9ycm93IiwgYW5kICsvLSBuIHVuaXRzICovCisKKyAgICBpZiAoY2tzdHJjaHIoIlR0WXlObiIsc1swXSkpIHsKKwlpbnQgaSwgaywgbiwgbWludXMgPSAwOworCWNoYXIgYzsKKwlsb25nIGpkOworCWpkID0gbWpkKGNrZGF0ZSgpKTsKKwlkZWJ1ZyhGMTExLCJjbWN2dGRhdGUgbWpkIixzLGpkKTsKKworCS8qIFN5bWJvbGljIGRhdGU6IFRPREFZLCBUT01PUlJPVywgZXRjLi4uPyAqLworCisJczIgPSBzOwkJCQkvKiBGaW5kIGVuZCBvZiBrZXl3b3JkICovCisJaSA9IDA7CisJd2hpbGUgKGlzYWxwaGEoKnMyKSkgewkJLyogYW5kIGdldCBpdHMgbGVuZ3RoICovCisJICAgIGkrKzsKKwkgICAgczIrKzsKKwl9CisJYyA9ICpzMjsJCQkvKiBaYXAgYnV0IHNhdmUgZGVsaW1pdGVyICovCisJKnMyID0gTlVMOworCWsgPSBsb29rdXAoc3ltZGF5dGFiLHMsbnN5bWRheXMsTlVMTCk7IC8qIExvb2sgdXAga2V5d29yZCAqLworCSpzMiA9IGM7CQkJLyogUmVwbGFjZSBkZWxpbWl0ZXIgKi8KKwlpZiAoayA8IDApCQkJLyogS2V5d29yZCBub3QgZm91bmQgKi8KKwkgIGdvdG8gbm9ybWFsOworCXMzID0gJnNbaV07CisJd2hpbGUgKCpzMyA9PSBTUCkJCS8qIFNraXAgd2hpdGVzcGFjZSAqLworCSAgczMrKzsKKwlpZiAoKnMzID09ICdfJyB8fCAqczMgPT0gJzonKQorCSAgczMrKzsKKworCXN3aXRjaCAoaykgewkJCS8qIEhhdmUga2V5d29yZCAqLworCSAgY2FzZSBTWU1fTk9XOgkJCS8qIE5PVyAqLworCSAgICBja3N0cm5jcHkoeWJ1Zixja2RhdGUoKSxEQVRFQlVGTEVOKTsKKwkgICAgY2tzdHJuY3B5KHl5eXltbWRkLHlidWYsWVlZWU1NREQpOworCSAgICB5ZWFyID0gTlVMTDsKKwkgICAgaWYgKCpzMykgewkJCS8qIE5vIG92ZXJ3cml0aW5nIGN1cnJlbnQgdGltZS4gKi8KKwkJY2tzdHJuY2F0KHlidWYsIiAiLERBVEVCVUZMRU4pOworCQlja3N0cm5jYXQoeWJ1ZixzMyxEQVRFQlVGTEVOKTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CQkJLyogWWVzdGVyZGF5LCBUb2RheSwgYW5kIFRvbW9ycm93ICovCisJICAgIGlmIChrID09IFNZTV9UT01PKSB7CS8qIFRPTU9SUk9XICovCisJCXN0cm5jcHkoeWJ1ZixtamQyZGF0ZShqZCsxKSw4KTsKKwkgICAgfSBlbHNlIGlmIChrID09IFNZTV9ZRVNUKSB7CS8qIFlFU1RFUkRBWSAqLworCQlzdHJuY3B5KHlidWYsbWpkMmRhdGUoamQtMSksOCk7CisJICAgIH0gZWxzZSB7CQkJLyogVE9EQVkgKi8KKwkJc3RybmNweSh5YnVmLGNrZGF0ZSgpLDgpOworCSAgICB9CisJICAgIHN0cm5jcHkoeWJ1Zis4LCIgMDA6MDA6MDAiLERBVEVCVUZMRU4tOCk7IC8qIERlZmF1bHQgdGltZSBpcyAwICovCisJICAgIGNrc3RybmNweSh5eXl5bW1kZCx5YnVmLFlZWVlNTUREKTsKKwkgICAgeWVhciA9IE5VTEw7CisJICAgIGlmICgqczMpIHsJCQkvKiBJZiBzb21ldGhpbmcgZm9sbG93cyBrZXl3b3JkLi4uICovCisJCWlmIChpc2RpZ2l0KCpzMykpIHsJLyogVGltZSAtIG92ZXJ3cml0ZSBkZWZhdWx0IHRpbWUgKi8KKwkJICAgIHN0cm5jcHkoeWJ1Zis4LHMraSxEQVRFQlVGTEVOLTgpOworCQl9IGVsc2UgewkJLyogU29tZXRoaW5nIGVsc2UsIGtlZXAgZGVmYXVsdCB0aW1lICovCisJCSAgICBja3N0cm5jYXQoeWJ1ZiwiICIsREFURUJVRkxFTik7IC8qIGFuZCBhcHBlbmQgKi8KKwkJICAgIGNrc3RybmNhdCh5YnVmLHMzLERBVEVCVUZMRU4pOyAvKiB3aGF0ZXZlciB3ZSBoYXZlICovCisJCX0KKwkgICAgfQorCX0KKwlzID0geWJ1ZjsJCQkvKiBQb2ludCB0byByZXdyaXR0ZW4gZGF0ZS10aW1lICovCisJbGVuID0gc3RybGVuKHMpOwkJLyogVXBkYXRlIGxlbmd0aCAqLworCWlzbGV0dGVyID0gMDsJCQkvKiBDYW5jZWwgdGhpcyAqLworICAgIH0KKworLyogUmVndWxhciBmcmVlLWZvcm1hdCBub24tc3ltYm9saWMgZGF0ZSAqLworCisgIG5vcm1hbDoKKworICAgIGRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSBOT1JNQUwiLHMsbGVuKTsKKyAgICBkZWJ1ZyhGMTExLCJjbWN2dGRhdGUgZG93IixzLGRvdyk7CisgICAgaWYgKHl5eXltbWRkWzBdICYmICF5ZWFyKSB7CisJY2tzdHJuY3B5KHllYXJidWYseXl5eW1tZGQsNSk7CisJY2tzdHJuY3B5KG1vbmJ1ZiwmeXl5eW1tZGRbNF0sMyk7CisJY2tzdHJuY3B5KGRheWJ1ZiwmeXl5eW1tZGRbNl0sMyk7CisJeWVhciA9IHllYXJidWY7CisJbW9udGggPSBtb25idWY7CisJZGF5ID0gZGF5YnVmOworCW5kYXkgPSBhdG9pKGRheWJ1Zik7CisgICAgfQorICAgIGlmIChpc2RpZ2l0KHNbMF0pKSB7CQkvKiBUaW1lIHdpdGhvdXQgZGF0ZT8gKi8KKwlwID0gczsKKwlpZiAoc1sxXSA9PSAnOicpIHsKKwkgICAgZGVidWcoRjExMSwiY21jdnRkYXRlIE5PUk1BTCBYMSIscyxsZW4pOworCSAgICBnb3RvIGRvdGltZTsKKwl9IGVsc2UgaWYgKGxlbiA+IDEgJiYgaXNkaWdpdChzWzFdKSAmJiBzWzJdID09ICc6JykgeworCSAgICBkZWJ1ZyhGMTExLCJjbWN2dGRhdGUgTk9STUFMIFgyIixzLGxlbik7CisJICAgIGdvdG8gZG90aW1lOworCX0gZWxzZSBpZiAocmRpZ2l0cyhzKSAmJiBsZW4gPCA4KSB7CisJICAgIGRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSBOT1JNQUwgWDMiLHMsbGVuKTsKKwkgICAgZ290byBkb3RpbWU7CisJfQorICAgIH0KKyAgICBpZiAobGVuID49IDggJiYgaXNkaWdpdCgqcykpIHsJLyogQ2hlY2sgZmlyc3QgZm9yIHl5eXltbWRkKiAqLworCWRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSBOT1JNQUwgQSIscyxsZW4pOworCWNjID0gc1s4XTsKKwlzWzhdID0gTlVMOwkJCS8qIElzb2xhdGUgZmlyc3QgOCBjaGFyYWN0ZXJzICovCisJaWYgKHJkaWdpdHMocykpIHsKKwkgICAgLyogSGF2ZSB2YWxpZCB0aW1lIHNlcGFyYXRvcj8gKi8KKwkgICAgcDIgPSBjYyA/IGNrc3RyY2hyKCIgVHRfLToiLGNjKSA6IE5VTEw7CisJICAgIGlmICghY2MgfHwgcDIpIHsKKwkJY2tzdHJuY3B5KHl5eXltbWRkLHMsWVlZWU1NREQpOwkvKiBWYWxpZCBzZXBhcmF0b3IgKi8KKwkJeWVhciA9IE5VTEw7CisJCXMgKz0gODsJCQkgICAgICAgIC8qIG9yIHRpbWUgbm90IGdpdmVuICovCisJCWlmIChjYykgcysrOwkJICAgICAgICAvKiBLZWVwIGRhdGUgKi8KKwkJcCA9IHM7CQkJICAgICAgICAvKiBhbmQgZ28gaGFuZGxlIHRpbWUgKi8KKwkJZ290byBkb3RpbWU7CisJICAgIH0gZWxzZSBpZiAoIXAyKSB7CisJCWlmIChpc2RpZ2l0KGNjKSkKKwkJICBtYWtlc3RyKCZjbWRhdGVtc2csIk51bWVyaWMgZGF0ZSB0b28gbG9uZyIpOworCQllbHNlCisJCSAgbWFrZXN0cigmY21kYXRlbXNnLCJJbnZhbGlkIGRhdGUtdGltZSBzZXBhcmF0b3IiKTsKKwkJZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOworCQlyZXR1cm4oTlVMTCk7CisJICAgIH0KKwl9CisJc1s4XSA9IGNjOwkJCS8qIFB1dCB0aGlzIGJhY2shICovCisgICAgfQorICAgIGRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSBOT1JNQUwgbm9uLXl5eXltbWRkIixzLGxlbik7CisKKyAgICAvKiBGcmVlLWZvcm1hdCBkYXRlIC0tIGZpZ3VyZSBpdCBvdXQgKi8KKworI2lmZGVmIENPTU1FTlQKKyAgICBpZiAoKnMgJiYgIWlzZGlnaXQoKnMpKSB7CisJbWFrZXN0cigmY21kYXRlbXNnLCJVbnJlY29nbml6ZWQgd29yZCBpbiBkYXRlIik7CisJZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOworCXJldHVybihOVUxMKTsKKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCQkvKiBGaWVsZCB0eXBlcyAqLworICAgICAgZnRbaV0gPSAtMTsKKyAgICBmbGRbaSA9IDBdID0gKHAgPSBzKTsJCS8qIEZpcnN0IGZpZWxkICovCisgICAgd2hpbGUgKCpwKSB7CQkJLyogR2V0IG5leHQgdHdvIGZpZWxkcyAqLworCWlmIChpc2RhdGVzZXAoKnApKSB7CQkvKiBIYXZlIGEgZGF0ZSBzZXBhcmF0b3IgKi8KKwkgICAgaWYgKGkgPT0gMCkgeworCQlkYXRlc2VwID0gKnA7CisJICAgIH0gZWxzZSBpZiAoaSA9PSAxICYmICpwICE9IGRhdGVzZXApIHsKKwkJbWFrZXN0cigmY21kYXRlbXNnLCJJbmNvbnNpc3RlbnQgZGF0ZSBzZXBhcmF0b3JzIik7CisJCWRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSIsY21kYXRlbXNnLC0xKTsKKwkJcmV0dXJuKE5VTEwpOworCSAgICB9CisJICAgICpwKysgPSBOVUw7CQkJLyogUmVwbGFjZSBieSBOVUwgKi8KKwkgICAgaWYgKCpwKSB7CQkJLyogTm93IHdlJ3JlIGF0IHRoZSBuZXh0IGZpZWxkICovCisJCXdoaWxlICgqcCA9PSBTUCkgcCsrOwkvKiBTa2lwIGxlYWRpbmcgc3BhY2VzICovCisJCWlmICghKnApIGJyZWFrOwkJLyogTWFrZSBzdXJlIHdlIHN0aWxsIGhhdmUgc29tZXRoaW5nICovCisJCWlmIChpID09IDIpCQkvKiBMYXN0IG9uZT8gKi8KKwkJICBicmVhazsKKwkJZmxkWysraV0gPSBwOwkJLyogTm8sIHJlY29yZCBwb2ludGVyIHRvIHRoaXMgb25lICovCisJICAgIH0gZWxzZSB7CisJCWJyZWFrOworCSAgICB9CSAgICAKKwl9IGVsc2UgaWYgKCgqcCA9PSAnVCcgfHwgKnAgPT0gJ3QnKSAmJiBpc2RpZ2l0KCoocCsxKSkpIHsgLyogVGltZSAqLworCSAgICAqcCsrID0gTlVMOworCSAgICBicmVhazsKKwl9IGVsc2UgaWYgKCpwID09ICc6JykgeworCSAgICBpZiAoaSA9PSAwICYmIHAgPT0gcykgeworCQlub2RhdGUgPSAxOworCQlicmVhazsKKwkgICAgfSBlbHNlIGlmIChpICE9IDApIHsJLyogQWZ0ZXIgYSBkYXRlICovCisJCWlmIChpID09IDIpIHsJCS8qIE9LIGFzIGRhdGUtdGltZSBzZXBhcmF0b3IgKFZNUykgKi8KKwkJICAgICpwKysgPSBOVUw7CisJCSAgICBicmVhazsKKwkJfQorCQlpZiAoaSA8IDIpCisJCSAgbWFrZXN0cigmY21kYXRlbXNnLCJUb28gZmV3IGZpZWxkcyBpbiBkYXRlIik7CisJCWVsc2UKKwkJICBtYWtlc3RyKCZjbWRhdGVtc2csIk1pc3BsYWNlZCB0aW1lIHNlcGFyYXRvciIpOworCQlkZWJ1ZyhGMTExLCJjbWN2dGRhdGUiLGNtZGF0ZW1zZywtMSk7CisJCXJldHVybihOVUxMKTsKKwkgICAgfQorCSAgICBub2RhdGUgPSAxOwkJCS8qIE9yIHdpdGhvdXQgYSBkYXRlICovCisJICAgIGJyZWFrOworCX0KKwlwKys7CisgICAgfQorICAgIGlmIChwID4gcyAmJiBpID09IDApCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRhdGUgKi8KKyAgICAgIG5vZGF0ZSA9IDE7CQkJLyogTm8gZGF0ZS4gKi8KKworICAgIGlmIChub2RhdGUgJiYgZG93ID4gLTEpIHsJCS8qIEhhdmUgaW1wbGllZCBkYXRlIGZyb20gRE9XPyAqLworCWdvdG8gZG90aW1lOwkJCS8qIFVzZSwgdXNlIHRoYXQsIGdvIGRvIHRpbWUuICovCisKKyAgICB9IGVsc2UgaWYgKG5vZGF0ZSkgewkJLyogTm8gZGF0ZSBhbmQgbm8gaW1wbGllZCBkYXRlICovCisJY2hhciAqdG1wID0gTlVMTDsJCS8qIFN1YnN0aXR1dGUgdG9kYXkncyBkYXRlICovCisJenRpbWUoJnRtcCk7CisJaWYgKCF0bXApCisJICB0bXAgID0gIiI7CisJaWYgKCEqdG1wKSB7CisJICAgIG1ha2VzdHIoJmNtZGF0ZW1zZywiUHJvYmxlbSBzdXBwbHlpbmcgY3VycmVudCBkYXRlIik7CisJICAgIGRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSIsY21kYXRlbXNnLC0xKTsKKwkgICAgcmV0dXJuKE5VTEwpOworCX0KKwlja3N0cm5jcHkoZGJ1Zix0bXAsMjYpOwkJLyogUmVmb3JtYXQgKi8KKwlpZiAoZGJ1Zls4XSA9PSBTUCkgZGJ1Zls4XSA9ICcwJzsKKwlmbGRbMF0gPSBkYnVmKzg7CQkvKiBkZCAqLworCWRidWZbMTBdID0gTlVMOworCWZsZFsxXSA9IGRidWYrNDsJCS8qIG1tbSAqLworCWRidWZbN10gPSBOVUw7CisJZmxkWzJdID0gZGJ1ZisyMDsJCS8qIHl5eXkgKi8KKwlkYnVmWzI0XSA9IE5VTDsKKwloaCA9IGF0b2koJmRidWZbMTFdKTsKKwltbSA9IGF0b2koJmRidWZbMTRdKTsKKwlzcyA9IGF0b2koJmRidWZbMTddKTsKKwlwID0gczsJCQkJLyogQmFjayB1cCBzb3VyY2UgcG9pbnRlciB0byByZXBhcnNlICovCisgICAgfSBlbHNlIGlmIChpIDwgMikgeworCW1ha2VzdHIoJmNtZGF0ZW1zZywiVG9vIGZldyBmaWVsZHMgaW4gZGF0ZSIpOworCWRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSIsY21kYXRlbXNnLC0xKTsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIC8qIEhhdmUgdGhyZWUgZGF0ZSBmaWVsZHMgLSBzZWUgd2hhdCB0aGV5IGFyZSAqLworCisgICAgZm9yIChrID0gMCwgaiA9IDA7IGogPCAzOyBqKyspIHsJLyogR2V0IG51bWJlciBvZiBub24tbnVtZXJpYyBmaWVsZHMgKi8KKwlmdFtqXSA9IHJkaWdpdHMoZmxkW2pdKTsKKwlkZWJ1ZyhGMTExLCJjbWN2dGRhdGUgZmxkIixmbGRbal0saik7CisJaWYgKGZ0W2pdID09IDApCisJICBrKys7CisgICAgfQorICAgIGtuID0gazsJCQkJLyogSG93IG1hbnkgbnVtZXJpYyBmaWVsZHMgKi8KKyAgICBtb250aCA9IE5VTEw7CQkJLyogU3RyaWtlIG91dCBkZWZhdWx0IHZhbHVlcyAqLworICAgIHllYXIgPSBOVUxMOworICAgIGRheSA9IE5VTEw7CisKKyAgICBpZiAoayA9PSAyICYmIGZ0WzJdID4gMCkgewkJLyogSnVsIDIwLCAyMDAxICovCisJaW50IHh4OworCXh4ID0gc3RybGVuKGZsZFsxXSk7CisJcDMgPSBmbGRbMV07CisJaWYgKHh4ID4gMCkgaWYgKHAzW3h4LTFdID09ICcsJykgeworCSAgICBwM1t4eC0xXSA9IE5VTDsKKwkgICAgaWYgKHJkaWdpdHMocDMpKSB7CisJCWsgPSAxOwkKKwkJZnRbMV0gPSAxOworCSAgICB9IGVsc2UgcDNbeHgtMV0gPSAnLCc7CisJfQorICAgIH0KKyAgICBpZiAoayA+IDEpIHsJCQkvKiBXZSBjYW4gaGF2ZSBvbmx5IG9uZSBub24tbnVtZXJpYyAqLworCWlmIChub2RhdGUpCisJICBtYWtlc3RyKCZjbWRhdGVtc2csIlVucmVjb2duaXplZCB3b3JkIGluIGRhdGUiKTsgCisJZWxzZSBpZiAoIWZ0WzJdICYmIGlzZGlnaXQoKihmbGRbMl0pKSkKKwkgIG1ha2VzdHIoJmNtZGF0ZW1zZywiSW52YWxpZCBkYXRlLXRpbWUgc2VwYXJhdG9yIik7IAorCWVsc2UKKwkgIG1ha2VzdHIoJmNtZGF0ZW1zZywiVG9vIG1hbnkgbm9uLW51bWVyaWMgZmllbGRzIGluIGRhdGUiKTsKKwlkZWJ1ZyhGMTExLCJjbWN2dGRhdGUiLGNtZGF0ZW1zZywtMSk7CisJcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBpZiAoIWZ0WzBdKSB7CisJayA9IDA7CisgICAgfSBlbHNlIGlmICghZnRbMV0pIHsKKwlrID0gMTsKKyAgICB9IGVsc2UgaWYgKCFmdFsyXSkgeworCW1ha2VzdHIoJmNtZGF0ZW1zZywiTm9uLWRpZ2l0IGluIHRoaXJkIGRhdGUgZmllbGQiKTsKKwlkZWJ1ZyhGMTExLCJjbWN2dGRhdGUiLGNtZGF0ZW1zZywtMSk7CisJcmV0dXJuKE5VTEwpOworICAgIH0gZWxzZQorICAgICAgayA9IC0xOworCisgICAgaWYgKGsgPiAtMSkgeworCWlmICgoeCA9IGxvb2t1cChjbW9udGhzLGZsZFtrXSwxMixOVUxMKSkgPCAwKSB7CisJICAgIG1ha2VzdHIoJmNtZGF0ZW1zZywiVW5rbm93biBtb250aCIpOworCSAgICBkZWJ1ZyhGMTExLCJjbWN2dGRhdGUiLGNtZGF0ZW1zZywtMSk7CisJICAgIHJldHVybihOVUxMKTsKKwl9CisJc3ByaW50Zih0bXBidWYsIiUwMmQiLHgpOworCW1vbnRoID0gdG1wYnVmOworICAgIH0KKyAgICBmMmxlbiA9IHN0cmxlbihmbGRbMl0pOwkJLyogTGVuZ3RoIG9mIDNyZCBmaWVsZCAqLworCisgICAgaWYgKGsgPT0gMCkgewkJCS8qIG1vbnRobmFtZSBkZCwgeXl5eSAqLworCWRheSA9IGZsZFsxXTsKKwl5ZWFyID0gZmxkWzJdOworICAgIH0gZWxzZSBpZiAoKChpbnQpc3RybGVuKGZsZFswXSkgPT0gNCkpIHsgLyogeXl5eS14eC1kZCAqLworCXllYXIgPSBmbGRbMF07CisJZGF5ID0gZmxkWzJdOworCWlmICghbW9udGgpCisJICBtb250aCA9IGZsZFsxXTsJCS8qIHl5eXktbW0tZGQgKi8KKyAgICB9IGVsc2UgaWYgKGYybGVuID09IDQpIHsJCS8qIHh4LXh4LXl5eXkgKi8KKwl5ZWFyID0gZmxkWzJdOworCWlmIChtb250aCkgewkJCS8qIGRkLW5hbWUteXl5eSAqLworCSAgICBkYXkgPSBmbGRbMF07CisJfSBlbHNlIHsJCQkvKiB4eC14eC15eXl5ICovCisJICAgIGludCBmMCwgZjE7CisJICAgIGYwID0gYXRvaShmbGRbMF0pOworCSAgICBmMSA9IGF0b2koZmxkWzFdKTsKKwkgICAgaWYgKCgoZjAgPiAxMikgJiYgKGYxIDw9IDEyKSkgfHwgKGYxIDw9IDEyICYmIGYwID09IGYxKSkgeworCQlkYXkgPSBmbGRbMF07CQkvKiBtbS1kZC15eXl5ICovCisJCW1vbnRoID0gZmxkWzFdOworCSAgICB9IGVsc2UgaWYgKChmMCA8PSAxMikgJiYgKGYxID4gMTIpKSB7CisJCWlmICghcmRpZ2l0cyhmbGRbMV0pKSB7CisJCSAgICBtYWtlc3RyKCZjbWRhdGVtc2csIkRheSBub3QgbnVtZXJpYyIpOworCQkgICAgZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOworCQkgICAgcmV0dXJuKE5VTEwpOworCQl9IGVsc2UgeworCQkgICAgZGF5ID0gZmxkWzFdOwkvKiBkZC1tbS15eXl5ICovCisJCX0KKwkJbW9udGggPSBmbGRbMF07CisJICAgIH0gZWxzZSB7CisJCWlmICghZjAgfHwgIWYxKQorCQkgIG1ha2VzdHIoJmNtZGF0ZW1zZywiRGF5IG9yIG1vbnRoIG91dCBvZiByYW5nZSIpOworCQllbHNlCisJCSAgbWFrZXN0cigmY21kYXRlbXNnLCJEYXkgYW5kIG1vbnRoIGFyZSBhbWJpZ3VvdXMiKTsKKwkJZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOworCQlyZXR1cm4oTlVMTCk7CisJICAgIH0KKwl9CisgICAgfSBlbHNlIGlmICgoZjJsZW4gPCA0KSAmJgkJLyogZGQgbW1tIHl5IChSRkM4MjIpICovCisJICAgICAgICFyZGlnaXRzKGZsZFsxXSkgJiYJLyogbWlkZGxlIGZpZWxkIGlzIG1vbnRobmFtZSAqLworCSAgICAgICByZGlnaXRzKGZsZFsyXSkpIHsKKwlpbnQgdG1weWVhcjsKKwlkYXkgPSBmbGRbMF07CisJaWYgKCFmbGRbMl1bMV0pIHsKKwkgICAgbWFrZXN0cigmY21kYXRlbXNnLCJUb28gZmV3IGRpZ2l0cyBpbiB5ZWFyIik7CisJICAgIGRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSIsY21kYXRlbXNnLC0xKTsKKwkgICAgcmV0dXJuKE5VTEwpOworCX0KKwl0bXB5ZWFyID0gYXRvaShmbGRbMl0pOworCWlmICh0bXB5ZWFyIDwgNTApCQkvKiBSRkMgMjgyMiB3aW5kb3dpbmcgKi8KKwkgIHRtcHllYXIgKz0gMjAwMDsKKwllbHNlCQkJCS8qIFRoaXMgaW5jbHVkZXMgMy1kaWdpdCB5ZWFycy4gKi8KKwkgIHRtcHllYXIgKz0gMTkwMDsKKwl5ZWFyID0gY2tpdG9hKHRtcHllYXIpOworCisgICAgfSBlbHNlIGlmICgoZjJsZW4gPCA0KSAmJiAoayA8IDApICYmICgoaW50KXN0cmxlbihmbGRbMF0pIDwgNCkpIHsKKwltYWtlc3RyKCZjbWRhdGVtc2csIkFtYmlndW91cyBudW1lcmljIGRhdGUiKTsKKwlkZWJ1ZyhGMTExLCJjbWN2dGRhdGUiLGNtZGF0ZW1zZywtMSk7CisJcmV0dXJuKE5VTEwpOworICAgIH0gZWxzZSBpZiAoKGYybGVuID4gNCkgJiYgZnRbMl0pIHsKKwltYWtlc3RyKCZjbWRhdGVtc2csIlRvbyBtYW55IGRpZ2l0cyBpbiB5ZWFyIik7CisJZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOworCXJldHVybihOVUxMKTsKKyAgICB9IGVsc2UgeworCW1ha2VzdHIoJmNtZGF0ZW1zZywiVW5leHBlY3RlZCBkYXRlIGZvcm1hdCIpOworCWRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSIsY21kYXRlbXNnLC0xKTsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIHggPSBhdG9pKG1vbnRoKTsKKyAgICBzcHJpbnRmKHRtcGJ1ZiwiJTAyZCIseCk7CQkvKiAyLWRpZ2l0IG51bWVyaWMgbW9udGggKi8KKworLyoKKyAgIHN0YXRlID0gMSA9IGhvdXJzCisgICBzdGF0ZSA9IDIgPSBtaW51dGVzCisgICBzdGF0ZSA9IDMgPSBzZWNvbmRzCisgICBzdGF0ZSA9IDQgPSBmcmFjdGlvbnMgb2Ygc2Vjb25kcworKi8KKworICBkb3RpbWU6CisgICAgaWYgKGlzbGV0dGVyICYmIChzID09IHApKSB7CisJbWFrZXN0cigmY21kYXRlbXNnLCJVbmtub3duIGRhdGUtdGltZSB3b3JkIik7CisJZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOworCXJldHVybihOVUxMKTsKKyAgICB9CisgICAgaWYgKCF5ZWFyICYmIHl5eXltbWRkWzBdKSB7CisJZGVidWcoRjExMCwiY21jdnRkYXRlIGRvdGltZSB5eXl5bW1kZCIseXl5eW1tZGQsMCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkgIHllYXJidWZbaV0gPSB5eXl5bW1kZFtpXTsKKwl5ZWFyYnVmWzRdID0gTlVMOworCW1vbmJ1ZlswXSA9IHl5eXltbWRkWzRdOworCW1vbmJ1ZlsxXSA9IHl5eXltbWRkWzVdOworCW1vbmJ1ZlsyXSA9IE5VTDsKKwlkYXlidWZbMF0gPSB5eXl5bW1kZFs2XTsKKwlkYXlidWZbMV0gPSB5eXl5bW1kZFs3XTsKKwlkYXlidWZbMl0gPSBOVUw7CisJZGF5ID0gZGF5YnVmOworCW5kYXkgPSBhdG9pKGRheWJ1Zik7CisJbW9udGggPSBtb25idWY7CisJeWVhciA9IHllYXJidWY7CisgICAgfQorICAgIGlmICgheWVhcikgeworCW1ha2VzdHIoJmNtZGF0ZW1zZywiSW50ZXJuYWwgZXJyb3IgLSBkYXRlIG5vdCBkZWZhdWx0ZWQiKTsKKwlkZWJ1ZyhGMTExLCJjbWN2dGRhdGUiLGNtZGF0ZW1zZywtMSk7CisJcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICAvKiBHZXQgaGVyZSB3aXRoIGRheSwgbW9udGgsIGFuZCB5ZWFyIHNldCAqLworICAgIGRlYnVnKEYxMTAsImNtY3Z0ZGF0ZSBkb3RpbWUgZGF5IixkYXksMCk7CisgICAgZGVidWcoRjExMCwiY21jdnRkYXRlIGRvdGltZSBtb250aCIsbW9udGgsMCk7CisgICAgZGVidWcoRjExMCwiY21jdnRkYXRlIGRvdGltZSB5ZWFyIix5ZWFyLDApOworICAgIGRlYnVnKEYxMTAsImNtY3Z0ZGF0ZSBkb3RpbWUgcyIscywwKTsKKyAgICBkZWJ1ZyhGMTEwLCJjbWN2dGRhdGUgZG90aW1lIHAiLHAsMCk7CisgICAgeCA9IGF0b2kobW9udGgpOworICAgIGlmICh4ID4gMTIgfHwgeCA8IDEpIHsKKwltYWtlc3RyKCZjbWRhdGVtc2csIk1vbnRoIG91dCBvZiByYW5nZSIpOworCWRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSIsY21kYXRlbXNnLC0xKTsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIG5kYXkgID0gYXRvaShkYXkpOworICAgIGkgPSBtZGF5c1t4XTsKKyAgICBpZiAoeCA9PSAyKSBpZiAoaXNsZWFwKGF0b2koeWVhcikpKSBpKys7CisgICAgaWYgKG5kYXkgPiBpIHx8IG5kYXkgPCAxKSB7CisJbWFrZXN0cigmY21kYXRlbXNnLCJEYXkgb3V0IG9mIHJhbmdlIik7CisJZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOworCXJldHVybihOVUxMKTsKKyAgICB9CisgICAgaWYgKCEqcCAmJiB0ID09IDApIHsKKwlzcHJpbnRmKHpidWYsIiUwNGQlMDJkJTAyZCIsYXRvaSh5ZWFyKSxhdG9pKG1vbnRoKSxuZGF5KTsJCisJZHAgPSB6YnVmOworCWdvdG8geGN2dGRhdGU7CisgICAgfQorICAgIGlmICgqcCA9PSAnKycgfHwgKnAgPT0gJy0nKSB7CS8qIEdNVCBvZmZzZXQgd2l0aG91dCBhIHRpbWUgKi8KKwloaCA9IDA7CQkJCS8qIHNvIGRlZmF1bHQgdGltZSB0byAwMDowMDowMCAqLworCW1tID0gMDsKKwlzcyA9IDA7CisJZ290byBjbXRpbWV6b25lOwkJLyogYW5kIGdvIGRvIHRpbWV6b25lICovCisgICAgfQorICAgIGlmICgqcCAmJiAhaXNkaWdpdCgqcCkgJiYgKnAgIT0gJzonKSB7CisJbWFrZXN0cigmY21kYXRlbXNnLCJJbnZhbGlkIHRpbWUiKTsKKwlkZWJ1ZyhGMTExLCJjbWN2dGRhdGUiLGNtZGF0ZW1zZywtMSk7CisJcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBzcHJpbnRmKHl5eXltbWRkLCIlcyVzJTAyZCIseWVhcixtb250aCxuZGF5KTsgLyogZm9yIHR6IGNhbGN1bGF0aW9ucy4uLiAqLworCisgICAgc3RhdGUgPSAxOwkJCQkvKiBJbml0aWFsaXplIHRpbWUtcGFyc2luZyBGU0EgKi8KKyAgICBoaCA9IDA7CQkJCS8qIGhvdXJzICovCisgICAgbW0gPSAwOwkJCQkvKiBtaW51dGVzICovCisgICAgc3MgPSAwOwkJCQkvKiBzZWNvbmRzICovCisgICAgZmYgPSAtMTsJCQkJLyogZnJhY3Rpb24gKi8KKyAgICBkID0gMDsJCQkJLyogRGlnaXQgY291bnRlciAqLworICAgIHAyID0gcDsJCQkJLyogUHJlbGltaW5hcnkgZGlnaXQgY291bnQuLi4gKi8KKyAgICB3aGlsZSAoaXNkaWdpdCgqcDIpKSB7CisJZCsrOworCXAyKys7CisgICAgfQorICAgIGlmIChkID4gNikgeworCW1ha2VzdHIoJmNtZGF0ZW1zZywiVG9vIG1hbnkgdGltZSBkaWdpdHMiKTsKKwlkZWJ1ZyhGMTExLCJjbWN2dGRhdGUiLGNtZGF0ZW1zZywtMSk7CisJcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBkID0gKGQgJiAxICYmICpwMiAhPSAnOicpID8gMSA6IDA7CS8qIE9kZCBpbXBsaWVzIGxlYWRpbmcgJzAnICovCisKKyAgICB3aGlsZSAoKnApIHsJCQkvKiBHZXQgdGhlIHRpbWUsIGlmIGFueSAqLworCWlmIChpc2RpZ2l0KCpwKSkgewkJLyogZGlnaXQgKi8KKwkgICAgaWYgKGQrKyA+IDEpIHsKKwkJc3RhdGUrKzsKKwkJZCA9IDE7CisJICAgIH0KKwkgICAgc3dpdGNoIChzdGF0ZSkgeworCSAgICAgIGNhc2UgMToJCQkvKiBIb3VycyAqLworCQloaCA9IGhoICogMTAgKyAoKnAgLSAnMCcpOworCQlicmVhazsKKwkgICAgICBjYXNlIDI6CQkJLyogTWludXRlcyAqLworCQltbSA9IG1tICogMTAgKyAoKnAgLSAnMCcpOworCQlicmVhazsKKwkgICAgICBjYXNlIDM6CQkJLyogU2Vjb25kcyAqLworCQlzcyA9IHNzICogMTAgKyAoKnAgLSAnMCcpOworCQlicmVhazsKKwkgICAgICBjYXNlIDQ6CQkJLyogRnJhY3Rpb24gb2Ygc2Vjb25kICovCisJCWlmIChmZiA8IDApCisJCSAgZmYgPSAoKnAgPiAnNCcpID8gMSA6IDA7CisJCWJyZWFrOworCSAgICB9CisJfSBlbHNlIGlmICgqcCA9PSAnOicpIHsJCS8qIENvbG9uICovCisJICAgIHN0YXRlKys7CisJICAgIGQgPSAwOworCSAgICBpZiAoc3RhdGUgPiAzKSB7CisJCW1ha2VzdHIoJmNtZGF0ZW1zZywiVG9vIG1hbnkgdGltZSBmaWVsZHMiKTsKKwkJZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOworCQlyZXR1cm4oTlVMTCk7CisJICAgIH0KKwl9IGVsc2UgaWYgKCpwID09ICcuJykgeworCSAgICBpZiAoc3RhdGUgPT0gMykgeworCQlzdGF0ZSA9IDQ7CisJCWQgPSAwOworCSAgICB9IGVsc2UgeworCQltYWtlc3RyKCZjbWRhdGVtc2csIkltcHJvcGVyIGZyYWN0aW9uIik7CisJCWRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSIsY21kYXRlbXNnLC0xKTsKKwkJcmV0dXJuKE5VTEwpOworCSAgICB9CisJfSBlbHNlIGlmICgqcCA9PSBTUCkgewkJLyogU3BhY2UgKi8KKwkgICAgd2hpbGUgKCpwICYmICgqcCA9PSBTUCkpCS8qIHBvc2l0aW9uIHRvIGZpcnN0IG5vbnNwYWNlICovCisJICAgICAgcCsrOworCSAgICBicmVhazsKKwl9IGVsc2UgaWYgKGlzYWxwaGEoKnApKSB7CS8qIEFNL1BNL1ogb3IgdGltZXpvbmUgKi8KKwkgICAgYnJlYWs7CisJfSBlbHNlIGlmICgqcCA9PSAnKycgfHwgKnAgPT0gJy0nKSB7IC8qIEdNVCBvZmZzZXQgKi8KKwkgICAgYnJlYWs7CisJfSBlbHNlIHsKKwkgICAgbWFrZXN0cigmY21kYXRlbXNnLCJJbnZhbGlkIHRpbWUgY2hhcmFjdGVycyIpOworCSAgICBkZWJ1ZyhGMTExLCJjbWN2dGRhdGUiLGNtZGF0ZW1zZywtMSk7CisJICAgIHJldHVybihOVUxMKTsKKwl9CisJcCsrOworICAgIH0KKyAgICBpZiAoISpwKQkJCQkvKiBJZiBub3RoaW5nIGxlZnQgKi8KKyAgICAgIGdvdG8geGNtZGF0ZTsJCQkvKiBnbyBmaW5pc2ggdXAgKi8KKworICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBISCwgTU0sIFNTLCBhbmQgRkYgKi8KKyAgICAvKiBOb3cgaGFuZGxlIHRoZSByZXN0OiBBTSwgUE0sIGFuZC9vciB0aW1lem9uZSBpbmZvICovCisKKyAgICBpZiAoIWNrc3RyY21wKHAsImFtIiwyLDApKSB7CS8qIEFNL1BNLi4uICovCisJcG1mbGFnID0gMDsKKwlwICs9IDI7CisgICAgfSBlbHNlIGlmICghY2tzdHJjbXAocCwiYS5tLiIsNCwwKSkgeworCXBtZmxhZyA9IDA7CisJcCArPSA0OworICAgIH0gZWxzZSBpZiAoIWNrc3RyY21wKHAsInBtIiwyLDApKSB7CisJcG1mbGFnID0gMTsKKwlwICs9IDI7CisgICAgfSBlbHNlIGlmICghY2tzdHJjbXAocCwicC5tLiIsNCwwKSkgeworCXBtZmxhZyA9IDE7CisJcCArPSA0OworICAgIH0KKyAgICBpZiAocG1mbGFnICYmIGhoIDwgMTIpCQkvKiBJZiBQTSB3YXMgZ2l2ZW4gKi8KKyAgICAgIGhoICs9IDEyOwkJCQkvKiBhZGQgMTIgdG8gdGhlIGhvdXIgKi8KKworICAgIC8qIE5vdyBoYW5kbGUgdGltZXpvbmUgKi8KKworICBjbXRpbWV6b25lOgorICAgIGRlYnVnKEYxMTAsImNtY3Z0ZGF0ZSB0aW1lem9uZSIscCwwKTsKKworICAgIHpoaCA9IDA7CQkJCS8qIEdNVCBvZmZzZXQgSEggKi8KKyAgICB6bW0gPSAwOwkJCQkvKiBHTVQgb2Zmc2V0IE1NICovCisgICAgZ210c2lnbiA9IDA7CQkJLyogU2lnbiBvZiBHTVQgb2Zmc2V0ICovCisgICAgaXNnbXQgPSAwOwkJCQkvKiAxIGlmIHRpbWUgaXMgR01UICovCisKKyAgICB3aGlsZSAoKnAgJiYgKnAgPT0gU1ApCQkvKiBHb2JibGUgc3BhY2VzICovCisgICAgICBwKys7CisgICAgaWYgKCEqcCkJCQkJLyogSWYgbm90aGluZyBsZWZ0ICovCisgICAgICBnb3RvIHhjbWRhdGU7CQkJLyogd2UncmUgZG9uZSAqLworCisgICAgaWYgKGlzYWxwaGEoKnApKSB7CQkJLyogU29tZXRoaW5nIGxlZnQgKi8KKwlpbnQgem9uZSA9IDA7CQkJLyogQWxwaGFiZXRpYyBtdXN0IGJlIHRpbWV6b25lICovCisJcDIgPSBwOwkJCQkvKiBJc29sYXRlIHRpbWV6b25lICovCisJcCsrOworCXdoaWxlIChpc2FscGhhKCpwKSkKKwkgIHArKzsKKwlwMyA9IHA7CisJY2MgPSAqcDsKKwkqcCA9IE5VTDsKKwlwID0gcDI7CQkJCS8qIEhhdmUgdGltZXpvbmUsIGxvb2sgaXQgdXAgKi8KKwl6b25lID0gbG9va3VwKHVzYXR6LHAsbnVzYXR6LE5VTEwpOworCWRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSB0aW1lem9uZSBhbHBoYSIscCx6b25lKTsKKworCWlmICh6b25lIDwgMCkgewkJCS8qIE5vdCBmb3VuZCAqLworCSAgICBtYWtlc3RyKCZjbWRhdGVtc2csIlVua25vd24gdGltZXpvbmUiKTsKKwkgICAgZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOworCSAgICByZXR1cm4oTlVMTCk7CisJfQorCWlzZ210Kys7CQkJLyogQWxsIGRhdGVzIGFyZSBHTVQgZnJvbSBoZXJlIGRvd24gKi8KKwlpZiAoem9uZSAhPSAwKSB7CQkvKiBCdXQgbm90IHRoaXMgb25lIHNvIG1ha2UgaXQgR01UICovCisJICAgIGhoICs9IHpvbmU7CQkJLyogUkZDIDgyMiB0aW1lem9uZTogRVNUIGV0YyAqLworCSAgICBpZiAoaGggPiAyMykgewkJLyogT2Zmc2V0IGNyb3NzZXMgZGF0ZSBib3VuZGFyeSAqLworCQlsb25nIGpkOworCQlqZCA9IG1qZCh5eXl5bW1kZCk7CS8qIEdldCBNSkQgKi8KKwkJamQgKz0gaGggLyAyNDsJCS8qIEFkZCBuZXcgZGF5KHMpICovCisJCWhoID0gaGggJSAyNDsJCS8qIGFuZCBjb252ZXJ0IGJhY2sgdG8geXl5eW1tZGQgKi8KKwkJY2tzdHJuY3B5KHl5eXltbWRkLG1qZDJkYXRlKGpkKSxZWVlZTU1ERCk7CisJICAgIH0KKwl9CisJcCA9IHAzOwkJCQkvKiBQdXQgYmFjayB3aGF0ZXZlciB3ZSBwb2tlZCBhYm92ZSAqLworCSpwID0gY2M7CisKKyAgICB9IGVsc2UgaWYgKCpwID09ICcrJyB8fCAqcCA9PSAnLScpIHsgLyogR01UL1VUQyBvZmZzZXQgKi8KKwlwMyA9IHA7CisJZGVidWcoRjExMCwiY21jdnRkYXRlIHRpbWV6b25lIEdNVCBvZmZzZXQiLHAsMCk7CisJZ210c2lnbiA9ICgqcCA9PSAnKycpID8gLTEgOiAxOworCWlzZ210Kys7CisJcCsrOworCXdoaWxlICgqcCA9PSBTUCkgcCsrOworCWQgPSAwOworCXAyID0gcDsKKwl3aGlsZSAoaXNkaWdpdCgqcCkpIHsJCS8qIENvdW50IGRpZ2l0cyAqLworCSAgICBkKys7CisJICAgIHArKzsKKwl9CisJaWYgKGQgIT0gNCkgewkJCS8qIFN0cmljdCBSRkMgWzJdODIyICovCisJICAgIGlzZ210ID0gMDsJCQkvKiBJZiBub3QgZXhhY3RseSA0IGRpZ2l0cyAqLworCSAgICBwID0gcDM7CQkJLyogaXQncyBub3QgYSBHTVQgb2Zmc2V0LiAqLworCSAgICBnb3RvIGRlbHRhOwkJCS8qIFNvIHRyZWF0IGl0IGFzIGEgZGVsdGEgdGltZS4gKi8KKwl9CisJZCA9IChkICYgMSAmJiAqcCAhPSAnOicpID8gMSA6IDA7IC8qIE9kZCBpbXBsaWVzIGxlYWRpbmcgJzAnICovCisJcCA9IHAyOworCWRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSBHTVQgb2Zmc2V0IHNpZ24iLHAsZ210c2lnbik7CisJZGVidWcoRjEwMSwiY21jdnRkYXRlIEdNVCBvZmZzZXQgZCIsIiIsZCk7CisJc3RhdGUgPSAxOworCXdoaWxlICgqcCkgeworCSAgICBpZiAoaXNkaWdpdCgqcCkpIHsJCS8qIGRpZ2l0ICovCisJCWlmIChkKysgPiAxKSB7CisJCSAgICBzdGF0ZSsrOworCQkgICAgZCA9IDE7CisJCX0KKwkJc3dpdGNoIChzdGF0ZSkgeworCQkgIGNhc2UgMToKKwkJICAgIHpoaCA9IHpoaCAqIDEwICsgKCpwIC0gJzAnKTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgMjoKKwkJICAgIHptbSA9IHptbSAqIDEwICsgKCpwIC0gJzAnKTsKKwkJICAgIGJyZWFrOworCQkgIGRlZmF1bHQ6CQkvKiBJZ25vcmUgc2Vjb25kcyBvciBmcmFjdGlvbnMgKi8KKwkJICAgIGJyZWFrOworCQl9CQkJCisJICAgIH0gZWxzZSBpZiAoKnAgPT0gJzonKSB7CS8qIENvbG9uICovCisJCXN0YXRlKys7CisJCWQgPSAwOworCSAgICB9IGVsc2UgaWYgKCpwID09IFNQIHx8ICpwID09ICcoJykgeworCQlicmVhazsKKwkgICAgfSBlbHNlIHsKKwkJcCA9IHAzOwkJCS8qIE1heWJlIGl0J3Mgbm90IGEgR01UIG9mZnNldC4gKi8KKwkJZ290byBkZWx0YTsJCS8qIFNvIHRyZWF0IGl0IGFzIGEgZGVsdGEgdGltZS4gKi8KKwkgICAgfQorCSAgICBwKys7CisJfQorICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJjbWN2dGRhdGUgYWZ0ZXIgdGltZXpvbmUiLHAsMCk7CisKKyAgICBpZiAoKnApIHsJCQkJLyogQW55dGhpbmcgbGVmdD8gKi8KKwlwMiA9IHA7CisJd2hpbGUgKCpwMiA9PSBTUCkJCS8qIFNraXAgcGFzdCBzcGFjZXMgKi8KKwkgIHAyKys7CisJaWYgKCpwMiA9PSAnKCcpIHsJCS8qIFJGQy04MjIgY29tbWVudD8gKi8KKwkgICAgaW50IHBjID0gMTsJCQkvKiBwYXJlbiBjb3VudGVyICovCisJICAgIHAyKys7CisJICAgIHdoaWxlICgqcDIpIHsKKwkJaWYgKCpwMiA9PSAnKScpIHsKKwkJICAgIGlmICgtLXBjID09IDApIHsKKwkJCXAyKys7CisJCQlicmVhazsKKwkJICAgIH0KKwkJfSBlbHNlIGlmICgqcDIgPT0gJyknKSB7CisJCSAgICBwYysrOworCQl9CisJCXAyKys7CisJICAgIH0JCQorCSAgICB3aGlsZSAoKnAyID09IFNQKQkJLyogU2tpcCBwYXN0IHNwYWNlcyAqLworCSAgICAgIHAyKys7CisJICAgIGlmICghKnAyKQkJCS8qIEFueXRoaW5nIGxlZnQ/ICovCisJICAgICAgKnAgPSBOVUw7CQkJLyogTm8sIGVyYXNlIGNvbW1lbnQgKi8KKwl9CisJaWYgKCEqcDIpCQkJLyogQW55dGhpbmcgbGVmdD8gKi8KKwkgIGdvdG8geGNtZGF0ZTsJCQkvKiBObywgZG9uZS4gKi8KKwlwID0gcDI7CisKKyAgICAgIGRlbHRhOgorCWRlYnVnKEYxMTAsImNtY3Z0ZGF0ZSBkZWx0YSB5eXl5bW1kZCIseXl5eW1tZGQsMCk7CisJZGVidWcoRjExMCwiY21jdnRkYXRlIGRlbHRhIHllYXIiLHllYXIsMCk7CisJZGVidWcoRjExMCwiY21jdnRkYXRlIGRlbHRhIHAiLHAsMCk7CisKKwlpZiAoKnAgPT0gJysnIHx8ICpwID09ICctJykgewkvKiBEZWx0YSB0aW1lICovCisJICAgIGludCBzdGF0ZSA9IE5FRURfREFZUzsJLyogU3RhcnQgb2ZmIGxvb2tpbmcgZm9yIGRheXMgKi8KKwkgICAgY2hhciBjID0gMDsKKwkgICAgZHNpZ24gPSAxOwkJCS8qIEdldCBzaWduICovCisJICAgIGlmICgqcCsrID09ICctJykKKwkgICAgICBkc2lnbiA9IC0xOworCSAgICB3aGlsZSAoKnAgPT0gU1ApCQkvKiBTa2lwIGludGVydmVuaW5nIHNwYWNlcyAqLworCSAgICAgIHArKzsKKwkgICAgd2hpbGUgKHN0YXRlKSB7CQkvKiBGU0EgdG8gcGFyc2UgZGVsdGEgdGltZSAqLworCQlpZiAoc3RhdGUgPCAwIHx8ICFpc2RpZ2l0KCpwKSkgeworCQkgICAgbWFrZXN0cigmY21kYXRlbXNnLCJJbnZhbGlkIGRlbHRhIHRpbWUiKTsKKwkJICAgIGRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSIsY21kYXRlbXNnLC0xKTsKKwkJICAgIHJldHVybihOVUxMKTsKKwkJfQorCQlwMiA9IHA7CQkJLyogR2V0IG5leHQgbnVtZXJpYyBmaWVsZCAqLworCQl3aGlsZSAoaXNkaWdpdCgqcDIpKQorCQkgIHAyKys7CisJCWMgPSAqcDI7CQkvKiBBbmQgYnJlYWsgY2hhcmFjdGVyICovCisJCSpwMiA9IE5VTDsJCS8qIFRlcm1pbmF0ZSB0aGUgbnVtYmVyICovCisKKwkJc3dpdGNoIChzdGF0ZSkgewkvKiBJbnRlcnByZXQgYWNjb3JkaW5nIHRvIHN0YXRlICovCisJCSAgY2FzZSBORUVEX0RBWVM6CS8qIEluaXRpYWwgKi8KKwkJICAgIGlmICgoYyA9PSAnLScpIHx8CS8qIFZNUyBmb3JtYXQgKi8KKwkJCSgoYyA9PSAnZCcgfHwgYyA9PSAnRCcpCisJCQkgJiYgIWlzYWxwaGEoKihwMisxKSkpKSB7IC8qIERheXMgKi8KKwkJCWRkYXlzID0gYXRvaShwKTsKKwkJCWlmICghKihwMisxKSkJCQkKKwkJCSAgc3RhdGUgPSAwOworCQkJZWxzZQkJICAgICAgLyogaWYgYW55dGhpbmcgaXMgbGVmdCAqLworCQkJICBzdGF0ZSA9IE5FRURfSFJTOyAgIC8qIG5vdyB3ZSB3YW50IGhvdXJzLiAqLworCQkgICAgfSBlbHNlIGlmICgoYyA9PSAnVycgfHwgYyA9PSAndycpICYmICFpc2FscGhhKCoocDIrMSkpKSB7CisJCQlkZGF5cyA9IGF0b2kocCkgKiA3OyAgIC8qIHdlZWtzLi4uICovCisJCQlpZiAoISoocDIrMSkpCQkJCisJCQkgIHN0YXRlID0gMDsKKwkJCWVsc2UKKwkJCSAgc3RhdGUgPSBORUVEX0hSUzsKKwkJICAgIH0gZWxzZSBpZiAoKGMgPT0gJ00nIHx8IGMgPT0gJ20nKSAmJiAhaXNhbHBoYSgqKHAyKzEpKSkgeworCQkJZG1vbnRocyA9IGF0b2kocCk7IC8qIG1vbnRocy4uLiAqLworCQkJaWYgKCEqKHAyKzEpKQkJCQorCQkJICBzdGF0ZSA9IDA7CisJCQllbHNlCisJCQkgIHN0YXRlID0gTkVFRF9IUlM7CisJCSAgICB9IGVsc2UgaWYgKChjID09ICdZJyB8fCBjID09ICd5JykgJiYgIWlzYWxwaGEoKihwMisxKSkpIHsKKwkJCWR5ZWFycyA9IGF0b2kocCk7IC8qIHllYXJzLi4uICovCisJCQlpZiAoISoocDIrMSkpCQkJCisJCQkgIHN0YXRlID0gMDsKKwkJCWVsc2UKKwkJCSAgc3RhdGUgPSBORUVEX0hSUzsKKwkJICAgIH0gZWxzZSBpZiAoYyA9PSAnOicpIHsgLyogZGVsaW1pdGVyIGlzIGNvbG9uICovCisJCQlkaG91cnMgPSBhdG9pKHApOyAgLyogc28gaXQncyBob3VycyAqLworCQkJc3RhdGUgPSBORUVEX01JTlM7IC8qIG5vdyB3ZSB3YW50IG1pbnV0ZXMgKi8KKwkJICAgIH0gZWxzZSBpZiAoIWMpIHsgICAgICAgLyogZW5kIG9mIHN0cmluZyAqLworCQkJZGhvdXJzID0gYXRvaShwKTsgIC8qIGl0J3Mgc3RpbGwgaG91cnMgKi8KKwkJCXN0YXRlID0gMDsgICAgICAgICAvKiBhbmQgd2UncmUgZG9uZSAqLworCQkgICAgfSBlbHNlIGlmIChpc2FscGhhKGMpIHx8IGMgPT0gU1ApIHsKKwkJCWlmIChjID09IFNQKSB7CS8qIEl0J3MgYSBrZXl3b3JkPyAqLworCQkJICAgIHAyKys7CS8qIFNraXAgc3BhY2VzICovCisJCQkgICAgd2hpbGUgKCpwMiA9PSBTUCkKKwkJCSAgICAgIHAyKys7CisJCQl9IGVsc2UgewkvKiBvciByZXBsYWNlIGZpcnN0IGxldHRlciAqLworCQkJICAgICpwMiA9IGM7CisJCQl9CisJCQlwMyA9IHAyOwkvKiBwMiBwb2ludHMgdG8gYmVnaW5uaW5nIG9mIGtleXdvcmQgKi8KKwkJCXdoaWxlIChpc2FscGhhKCpwMykpIC8qIEZpbmQgZW5kIG9mIGtleXdvcmQgKi8KKwkJCSAgcDMrKzsKKwkJCWMgPSAqcDM7CS8qIE5VTCBpdCBvdXQgc28gd2UgY2FuIGxvb2sgaXQgdXAgKi8KKwkJCWlmICgqcDMpCS8qIHAzIHBvaW50cyB0byBrZXl3b3JkIHRlcm1pbmF0b3IgKi8KKwkJCSAgKnAzID0gTlVMOworCQkJdW5pdHMgPSBsb29rdXAodGltZXVuaXRzLHAyLG51bml0cyxOVUxMKTsKKwkJCWlmICh1bml0cyA8IDApIHsKKwkJCSAgICBtYWtlc3RyKCZjbWRhdGVtc2csIkludmFsaWQgdW5pdHMgaW4gZGVsdGEgdGltZSIpOworCQkJICAgIGRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSIsY21kYXRlbXNnLC0xKTsKKwkJCSAgICByZXR1cm4oTlVMTCk7CisJCQl9CisJCQkqcDIgPSBOVUw7CS8qIFJlLXRlcm1pbmF0ZSB0aGUgbnVtYmVyICovCisJCQkqcDMgPSBjOworCQkJd2hpbGUgKCpwMyA9PSBTUCkgLyogUG9pbnQgYXQgZmllbGQgYWZ0ZXIgdW5pdHMgKi8KKwkJCSAgcDMrKzsKKwkJCXAyID0gcDM7CisJCQlzd2l0Y2ggKHVuaXRzKSB7CisJCQkgIGNhc2UgVFVfREFZUzoKKwkJCSAgICBkZGF5cyA9IGF0b2kocCk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgVFVfV0VFS1M6CisJCQkgICAgZGRheXMgPSBhdG9pKHApICogNzsKKwkJCSAgICBicmVhazsKKwkJCSAgY2FzZSBUVV9NT05USFM6CisJCQkgICAgZG1vbnRocyA9IGF0b2kocCk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgVFVfWUVBUlM6CisJCQkgICAgZHllYXJzID0gYXRvaShwKTsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJCWlmICgqcDIpIHsKKwkJCSAgICBzdGF0ZSA9IE5FRURfSFJTOworCQkJICAgIHAyLS07CisJCQl9IGVsc2UKKwkJCSAgc3RhdGUgPSAwOworCisJCSAgICB9IGVsc2UgewkJLyogQW55dGhpbmcgZWxzZSAqLworCQkJc3RhdGUgPSAtMTsJLyogaXMgYW4gZXJyb3IgKi8KKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQkgIGNhc2UgTkVFRF9IUlM6CS8qIExvb2tpbmcgZm9yIGhvdXJzICovCisJCSAgICBkZWJ1ZyhGMDAwLCJjbWN2dGRhdGUgTkVFRF9IUlMiLHAsYyk7CisJCSAgICBpZiAoYyA9PSAnOicpIHsKKwkJCWRob3VycyA9IGF0b2kocCk7CisJCQlzdGF0ZSA9IE5FRURfTUlOUzsKKwkJICAgIH0gZWxzZSBpZiAoIWMpIHsKKwkJCWRob3VycyA9IGF0b2kocCk7CisJCQlzdGF0ZSA9IDA7CisJCSAgICB9IGVsc2UgeworCQkJc3RhdGUgPSAtMTsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQkgIGNhc2UgTkVFRF9NSU5TOgkvKiBMb29raW5nIGZvciBtaW51dGVzICovCisJCSAgICBpZiAoYyA9PSAnOicpIHsKKwkJCWRtaW5zID0gYXRvaShwKTsKKwkJCXN0YXRlID0gTkVFRF9TRUNTOworCQkgICAgfSBlbHNlIGlmICghYykgeworCQkJZG1pbnMgPSBhdG9pKHApOworCQkJc3RhdGUgPSAwOworCQkgICAgfSBlbHNlIHsKKwkJCXN0YXRlID0gLTE7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJICBjYXNlIE5FRURfU0VDUzoJLyogTG9va2luZyBmb3Igc2Vjb25kcyAqLworCQkgICAgaWYgKGMgPT0gJy4nKSB7CisJCQlkc2VjcyA9IGF0b2kocCk7CisJCQlzdGF0ZSA9IE5FRURfRlJBQzsKKwkJICAgIH0gZWxzZSBpZiAoIWMpIHsKKwkJCWRzZWNzID0gYXRvaShwKTsKKwkJCXN0YXRlID0gMDsKKwkJICAgIH0gZWxzZSB7CisJCQlzdGF0ZSA9IC0xOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCSAgY2FzZSBORUVEX0ZSQUM6CS8qIEZyYWN0aW9uIG9mIHNlY29uZCAqLworCQkgICAgaWYgKCFjICYmIHJkaWdpdHMocCkpIHsKKwkJCWlmICgqcCA+ICc0JykKKwkJCSAgZHNlY3MrKzsKKwkJCXN0YXRlID0gMDsKKwkJICAgIH0gZWxzZSB7CisJCQlzdGF0ZSA9IC0xOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCX0KKwkJaWYgKGMpCQkJLyogbmV4dCBmaWVsZCBpZiBhbnkgKi8KKwkJICBwID0gcDIgKyAxOworCSAgICB9CisJICAgIGhhdmVkZWx0YSA9IDE7CisKKwl9IGVsc2UgeworCSAgICBtYWtlc3RyKCZjbWRhdGVtc2csIkV4dHJhbmVvdXMgbWF0ZXJpYWwgYXQgZW5kIik7CisJICAgIGRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSIsY21kYXRlbXNnLC0xKTsKKwkgICAgcmV0dXJuKE5VTEwpOworCX0KKyAgICB9CisKKyB4Y21kYXRlOgorCisgICAgaWYgKCh0ICE9IDIgJiYgaGggPiAyNCkgfHwgaGggPCAwKSB7IC8qIEhvdXIgcmFuZ2UgY2hlY2sgKi8KKwltYWtlc3RyKCZjbWRhdGVtc2csIkludmFsaWQgaG91cnMiKTsKKwlkZWJ1ZyhGMTExLCJjbWN2dGRhdGUiLGNtZGF0ZW1zZywtMSk7CisJcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBpZiAobW0gPiA1OSkgewkJCS8qIE1pbnV0ZSByYW5nZSBjaGVjayAqLworCW1ha2VzdHIoJmNtZGF0ZW1zZywiSW52YWxpZCBtaW51dGVzIik7CisJZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOworCXJldHVybihOVUxMKTsKKyAgICB9CisgICAgaWYgKGZmID4gMCkgewkJCS8qIEZyYWN0aW9uIG9mIHNlY29uZD8gKi8KKwlpZiAoc3MgPCA1OSkgeworCSAgICBzcysrOworCSAgICBmZiA9IDA7CisJfSBlbHNlIGlmIChtbSA8IDU5KSB7CisJICAgIHNzID0gMDsKKwkgICAgbW0rKzsKKwkgICAgZmYgPSAwOworCX0gZWxzZSBpZiAoaGggPCAyNCkgeworCSAgICBzcyA9IDA7CisJICAgIG1tID0gMDsKKwkgICAgaGgrKzsKKwkgICAgZmYgPSAwOworCX0KKwkvKiBNdXN0IGFkZCBhIGRheSAtLSBsZWF2ZSBmZiBhdCAxLi4uICovCisJLyogKERPIFNPTUVUSElORyBBQk9VVCBUSElTIExBVEVSKSAqLworICAgIH0KKyAgICBpZiAoc3MgPiA2MCkgewkJCS8qIFNlY29uZHMgcmFuZ2UgY2hlY2sgKi8KKwltYWtlc3RyKCZjbWRhdGVtc2csIkludmFsaWQgc2Vjb25kcyIpOyAvKiA2MCBpcyBvayBiZWNhdXNlIG9mICovCisJZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOyAgLyogTGVhcCBTZWNvbmQuICovCisJcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBpZiAoKG1tIDwgMCB8fCBzcyA8IDApIHx8CisJKHQgIT0gMiAmJiAoc3MgPiAwIHx8IG1tID4gMCkgJiYgaGggPiAyMykpIHsKKwltYWtlc3RyKCZjbWRhdGVtc2csIkludmFsaWQgbWludXRlcyBvciBzZWNvbmRzIik7CisJZGVidWcoRjExMSwiY21jdnRkYXRlIixjbWRhdGVtc2csLTEpOworCXJldHVybihOVUxMKTsKKyAgICB9CisgICAgZGVidWcoRjExMCwiY21jdnRkYXRlIHllYXIiLHllYXIsMCk7CisgICAgZGVidWcoRjExMCwiY21jdnRkYXRlIG1vbnRoIixtb250aCwwKTsKKyAgICBkZWJ1ZyhGMTAxLCJjbWN2dGRhdGUgbmRheSIsIiIsbmRheSk7CisgICAgZGVidWcoRjEwMSwiY21jdnRkYXRlIGhoIiwiIixoaCk7CisgICAgZGVidWcoRjEwMSwiY21jdnRkYXRlIG1tIiwiIixtbSk7CisgICAgZGVidWcoRjEwMSwiY21jdnRkYXRlIHNzIiwiIixzcyk7CisgICAgZGVidWcoRjEwMSwiY21jdnRkYXRlIGdtdHNpZ24iLCIiLGdtdHNpZ24pOworICAgIGRlYnVnKEYxMDEsImNtY3Z0ZGF0ZSB6aGgiLCIiLHpoaCk7CisgICAgZGVidWcoRjEwMSwiY21jdnRkYXRlIHptbSIsIiIsem1tKTsKKyAgICBkZWJ1ZyhGMTAxLCJjbWN2dGRhdGUgaXNnbXQiLCIiLGlzZ210KTsKKworI2lmZGVmIFpMT0NBTFRJTUUKKy8qIEhhbmRsZSB0aW1lem9uZSAtLSBmaXJzdCBjb252ZXJ0IHRvIEdNVCAqLworCisgICAgemRkID0gMDsJCQkJLyogRGF5cyBjaGFuZ2VkICovCisgICAgaWYgKGlzZ210ICYmICh6bW0gfHwgemhoKSkgewkvKiBJZiBHTVQgb2Zmc2V0IGdpdmVuICovCisJbG9uZyBzZWMxLCBzZWMyLCB6ejsKKwlzZWMxID0gc3MgKyA2MCAqIG1tICsgMzYwMCAqIGhoOworCXNlYzIgPSBnbXRzaWduICogKDYwICogem1tICsgMzYwMCAqIHpoaCk7CisJc2VjMSArPSBzZWMyOworCWlmIChzZWMxIDwgMCkgeworCSAgICBzZWMxID0gMCAtIHNlYzE7CisJICAgIHpkZCA9IDBMIC0gKHNlYzEgLyA4NjQwMEwpOworCSAgICBzZWMxID0gc2VjMSAlIDg2NDAwTDsKKwl9IGVsc2UgaWYgKHNlYzEgPiA4NjQwMEwpIHsKKwkgICAgemRkID0gc2VjMSAvIDg2NDAwTDsKKwkgICAgc2VjMSA9IHNlYzEgJSA4NjQwMEw7CisJfQorCXNzID0gc2VjMSAlIDYwOworCXp6ID0gc2VjMSAvIDYwOworCW1tID0genogJSA2MDsKKwloaCA9IHp6IC8gNjA7CisJZGVidWcoRjEwMSwiY21jdnRkYXRlIE5FVyBoaCIsIiIsaGgpOworCWRlYnVnKEYxMDEsImNtY3Z0ZGF0ZSBORVcgbW0iLCIiLG1tKTsKKwlkZWJ1ZyhGMTAxLCJjbWN2dGRhdGUgTkVXIGRkIiwiIix6ZGQpOworCisvKiBBdCB0aGlzIHBvaW50IGhoOm1tOnNzIGlzIGluIEdNVCBhbmQgemRkIGlzIHRoZSBjYWxlbmRhciBhZGp1c3RtZW50ICovCisKKyAgICB9CisjZW5kaWYgLyogWkxPQ0FMVElNRSAqLworCisgICAgaWYgKHl5eXltbWRkWzBdICYmICF5ZWFyKSB7CisJY2tzdHJuY3B5KHllYXJidWYseXl5eW1tZGQsNSk7CisJY2tzdHJuY3B5KG1vbmJ1ZiwmeXl5eW1tZGRbNF0sMyk7CisJY2tzdHJuY3B5KGRheWJ1ZiwmeXl5eW1tZGRbNl0sMyk7CisJeWVhciA9IHllYXJidWY7CisJbW9udGggPSBtb25idWY7CisJZGF5ID0gZGF5YnVmOworCW5kYXkgPSBhdG9pKGRheWJ1Zik7CisgICAgfQorICAgIHNwcmludGYoemJ1ZiwiJTA0ZCUwMmQlMDJkICUwMmQ6JTAyZDolMDJkIiwgLyogU0FGRSAqLworCSAgICBhdG9pKHllYXIpLGF0b2kobW9udGgpLG5kYXksaGgsbW0sc3MKKwkgICAgKTsKKyAgICBkcCA9IHpidWY7CisKKyNpZmRlZiBaTE9DQUxUSU1FCisgICAgLyogTm93IGNvbnZlcnQgZnJvbSBHTVQgdG8gbG9jYWwgdGltZSAqLworCisgICAgaWYgKGlzZ210KSB7CQkJLyogSWYgR01UIGNvbnZlcnQgdG8gbG9jYWwgdGltZSAqLworCWRlYnVnKEYxMTAsImNtY3Z0ZGF0ZSBHTVQgMSIsZHAsMCk7CisJaWYgKHpkZCkgewkJCS8qIEFwcGx5IGFueSBjYWxlbmRhciBhZGp1c3RtZW50ICovCisJICAgIGxvbmcgeno7CisJICAgIHp6ID0gbWpkKGRwKSArIHpkZDsKKwkgICAgc3ByaW50Zih6YnVmLCIlcyAlMDJkOiUwMmQ6JTAyZCIsbWpkMmRhdGUoenopLGhoLG1tLHNzKTsKKwl9CisJZGVidWcoRjExMCwiY21jdnRkYXRlIEdNVCAyIixkcCwwKTsKKwlpZiAoKHAgPSB6bG9jYWx0aW1lKGRwKSkpIHsKKwkgICAgZGVidWcoRjExMCwiY21jdnRkYXRlIGFzY3RpbWUgemxvY2FsdGltZSIscCwwKTsKKwkgICAgaWYgKHApIGNrc3RybmNweSh6YnVmLHAsMTgpOworCX0KKwlkZWJ1ZyhGMTEwLCJjbWN2dGRhdGUgR01UIDMiLGRwLDApOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJICB5ZWFyYnVmW2ldID0gZHBbaV07CisJeWVhcmJ1Zls0XSA9IE5VTDsKKwltb25idWZbMF0gPSBkcFs0XTsKKwltb25idWZbMV0gPSBkcFs1XTsKKwltb25idWZbMl0gPSBOVUw7CisJZGF5YnVmWzBdID0gZHBbNl07CisJZGF5YnVmWzFdID0gZHBbN107CisJZGF5YnVmWzJdID0gTlVMOworCWRheSA9IGRheWJ1ZjsKKwluZGF5ID0gYXRvaShkYXlidWYpOworCW1vbnRoID0gbW9uYnVmOworCXllYXIgPSB5ZWFyYnVmOworCWhoID0gYXRvaSgmZHBbOV0pOworCW1tID0gYXRvaSgmZHBbMTJdKTsKKwlzcyA9IGF0b2koJmRwWzE1XSk7CisgICAgfQorI2VuZGlmIC8qIFpMT0NBTFRJTUUgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworCWRlYnVnKEYxMDEsImNtY3Z0ZGF0ZSBob3VyIiwiIixoaCk7CisJZGVidWcoRjEwMSwiY21jdnRkYXRlIG1pbnV0ZSIsIiIsbW0pOworCWRlYnVnKEYxMDEsImNtY3Z0ZGF0ZSBzZWNvbmQiLCIiLHNzKTsKKyAgICB9CisjZW5kaWYgLyogREVCTE9HICovCisKKyAgICBtYWtlc3RyKCZjbWRhdGVtc2csTlVMTCk7CisgICAgaWYgKGhhdmVkZWx0YSkgeworI2lmZGVmIERFQlVHCisJaWYgKGRlYmxvZykgeworCSAgICBkZWJ1ZyhGMTEwLCJjbWN2dGRhdGUgYmFzZSAiLGRwLDApOworCSAgICBkZWJ1ZyhGMTAxLCJjbWN2dGRhdGUgZGVsdGEgc2lnbiIsIiIsZHNpZ24pOworCSAgICBkZWJ1ZyhGMTAxLCJjbWN2dGRhdGUgZGVsdGEgeXJzICIsIiIsZHllYXJzKTsKKwkgICAgZGVidWcoRjEwMSwiY21jdnRkYXRlIGRlbHRhIG1vcyAiLCIiLGRtb250aHMpOworCSAgICBkZWJ1ZyhGMTAxLCJjbWN2dGRhdGUgZGVsdGEgZGF5cyIsIiIsZGRheXMpOworCSAgICBkZWJ1ZyhGMTAxLCJjbWN2dGRhdGUgZGVsdGEgaHJzICIsIiIsZGhvdXJzKTsKKwkgICAgZGVidWcoRjEwMSwiY21jdnRkYXRlIGRlbHRhIG1pbnMiLCIiLGRtaW5zKTsKKwkgICAgZGVidWcoRjEwMSwiY21jdnRkYXRlIGRlbHRhIHNlY3MiLCIiLGRzZWNzKTsKKwl9CisjZW5kaWYgLyogREVCTE9HICovCisJaWYgKCEoZHAgPSBjbWRlbHRhKGF0b2koeWVhciksCisJCSAgICBhdG9pKG1vbnRoKSwKKwkJICAgIG5kYXksIGhoLCBtbSwgc3MsCisJCSAgICBkc2lnbiwgZHllYXJzLCBkbW9udGhzLCBkZGF5cywgZGhvdXJzLCBkbWlucywgZHNlY3MpKSkgeworCSAgICBkZWJ1ZyhGMTExLCJjbWN2dGRhdGUiLGNtZGF0ZW1zZywtMSk7CisJICAgIHJldHVybihOVUxMKTsKKwl9CisgICAgfQorCisgIHhjdnRkYXRlOgkJCQkvKiBFeGl0IHBvaW50IGZvciBzdWNjZXNzICovCisgICAgeworCWludCBsZW4sIGssIG47CisJY2hhciAqIHA7CisJZGVidWcoRjExMCwiY21jdnRkYXRlIHhjdnRkYXRlIGRwIixkcCwwKTsKKwlpZiAoIWRwKSBkcCA9ICIiOwkJLyogU2hvdWxkbid0IGhhcHBlbiAqLworCWlmICghKmRwKSByZXR1cm4oTlVMTCk7CQkvKiAuLi4gKi8KKwlsZW4gPSBzdHJsZW4oZHApOworCWRlYnVnKEYxMTEsImNtY3Z0ZGF0ZSByZXN1bHQiLGRwLGxlbik7CisJayA9IGNtZGF0ZWJwIC0gKGNoYXIgKiljbWRhdGVidWY7IC8qIFNwYWNlIHVzZWQgKi8KKwluID0gQ01EQVRFQlVGIC0gayAtIDE7CQkvKiBTcGFjZSBsZWZ0ICovCisJaWYgKG4gPCBsZW4pIHsJCQkvKiBOb3QgZW5vdWdoPyAqLworCSAgICBjbWRhdGVicCA9IGNtZGF0ZWJ1ZjsJLyogV3JhcCBhcm91bmQgKi8KKwkgICAgbiA9IENNREFURUJVRjsKKwl9CisJY2tzdHJuY3B5KGNtZGF0ZWJwLGRwLG4pOworCXAgPSBjbWRhdGVicDsKKwljbWRhdGVicCArPSBsZW4gKyAxOworCXJldHVybihwKTsKKyAgICB9Cit9CisKK2ludAorY212ZGF0ZShkKSBjaGFyICogZDsgewkJCS8qIFZlcmlmeSBkYXRlLXRpbWUgKi8KKyAgICBpbnQgaTsKKyAgICBpZiAoIWQpIHJldHVybigwKTsKKyAgICBpZiAoKGludClzdHJsZW4oZCkgIT0gMTcpIHJldHVybigwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7IGlmICghaXNkaWdpdChkW2ldKSkgcmV0dXJuKDApOyB9CisgICAgaWYgKCFpc2RpZ2l0KGRbOV0pICB8fCAhaXNkaWdpdChkWzEwXSkgfHwKKwkhaXNkaWdpdChkWzEyXSkgfHwgIWlzZGlnaXQoZFsxM10pIHx8CisJIWlzZGlnaXQoZFsxNV0pIHx8ICFpc2RpZ2l0KGRbMTZdKSkKKyAgICAgIHJldHVybigwKTsKKyAgICBpZiAoIWNrc3RyY2hyKCIgVHRfLToiLGRbOF0pKSByZXR1cm4oMCk7CisgICAgaWYgKGRbMTFdICE9ICc6JyAmJiBkWzE0XSAhPSAnOicpIHJldHVybigwKTsKKyAgICByZXR1cm4oMSk7Cit9CisKKy8qIGMgbSBkIGkgZiBmIGQgYSB0IGUgIC0tICBHZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBkYXRlLXRpbWVzICovCisKK2NoYXIgKgorY21kaWZmZGF0ZShkMSxkMikgY2hhciAqIGQxLCAqIGQyOyB7CisgICAgY2hhciBkMWJ1Zls5XSwgZDJidWZbOV07CisgICAgY2hhciB4MWJ1ZlsxOF0sIHgyYnVmWzE4XTsKKyAgICBjaGFyICogcDsKKworICAgIGludCBoaDEgPSAwLCBtbTEgPSAwLCBzczEgPSAwOworICAgIGludCBoaDIgPSAwLCBtbTIgPSAwLCBzczIgPSAwOworICAgIGludCBoaCwgbW0sIHNzOworICAgIGludCBzaWduOworICAgIGxvbmcgamQxLCBqZDIsIGpkLCBmMSwgZjIsIGZ4OworICAgIHN0YXRpYyBjaGFyIHJlc3VsdFsyNF0sICpycDsKKworICAgIGRlYnVnKEYxMTAsImNtZGlmZmRhdGUgZDEgQSIsZDEsMCk7CisgICAgZGVidWcoRjExMCwiY21kaWZmZGF0ZSBkMiBBIixkMiwwKTsKKworICAgIGlmICghKHAgPSBjbWN2dGRhdGUoZDEsMSkpKQkJLyogQ29udmVydCBkYXRlcyB0byBzdGFuZGFyZCBmb3JtYXQgKi8KKyAgICAgIHJldHVybihOVUxMKTsKKyAgICBja3N0cm5jcHkoeDFidWYscCwxOCk7CisgICAgZDEgPSB4MWJ1ZjsKKworICAgIGlmICghKHAgPSBjbWN2dGRhdGUoZDIsMSkpKQorICAgICAgcmV0dXJuKE5VTEwpOworICAgIGNrc3RybmNweSh4MmJ1ZixwLDE4KTsKKyAgICBkMiA9IHgyYnVmOworCisgICAgZGVidWcoRjExMCwiY21kaWZmZGF0ZSBkMSBCIixkMSwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJjbWRpZmZkYXRlIGQyIEIiLGQyLDApOworICAgIGlmICghY212ZGF0ZShkMSkgfHwgIWNtdmRhdGUoZDIpKQorICAgICAgcmV0dXJuKE5VTEwpOworCisgICAgaGgxID0gYXRvaSgmZDFbOV0pOwkJCS8qIEdldCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMgKi8KKyAgICBtbTEgPSBhdG9pKCZkMVsxMl0pOwkJLyogZm9yIGZpcnN0IGRhdGUgKi8KKyAgICBzczEgPSBhdG9pKCZkMVsxNV0pOworICAgIGNrc3RybmNweShkMWJ1ZixkMSw5KTsKKworICAgIGhoMiA9IGF0b2koJmQyWzldKTsJCQkvKiBkaXR0byBmb3Igc2Vjb25kIGRhdGUgKi8KKyAgICBtbTIgPSBhdG9pKCZkMlsxMl0pOworICAgIHNzMiA9IGF0b2koJmQyWzE1XSk7CisgICAgY2tzdHJuY3B5KGQyYnVmLGQyLDkpOworICAgIAorICAgIGpkMSA9IG1qZChkMWJ1Zik7CQkJLyogR2V0IHRoZSB0d28gSnVsaWFuIGRhdGVzICovCisgICAgamQyID0gbWpkKGQyYnVmKTsKKyAgICBmMSA9IHNzMSArIDYwICogbW0xICsgMzYwMCAqIGhoMTsJLyogQ29udmVydCBmaXJzdCB0aW1lIHRvIHNlY29uZHMgKi8KKworICAgIGYyID0gc3MyICsgNjAgKiBtbTIgKyAzNjAwICogaGgyOwkvKiBEaXR0byBmb3Igc2Vjb25kIHRpbWUgKi8KKyAgICBkZWJ1ZyhGMTAxLCJjbWRpZmZkYXRlIGpkMSIsIiIsamQxKTsKKyAgICBkZWJ1ZyhGMTAxLCJjbWRpZmZkYXRlIGYxIiwiIixmMSk7CisgICAgZGVidWcoRjEwMSwiY21kaWZmZGF0ZSBqZDIiLCIiLGpkMik7CisgICAgZGVidWcoRjEwMSwiY21kaWZmZGF0ZSBmMiIsIiIsZjIpOworICAKKyAgICBpZiAoamQyID4gamQxIHx8IChqZDEgPT0gamQyICYmIGYyID4gZjEpKSB7CisgICAgICAgIHNpZ24gPSAtMTsgCisgICAgICAgIGlmIChmMSA+IGYyKSB7amQyLS07IGYyICs9IDg2NDAwTDt9CisgICAgICAgIGpkID0gamQyIC0gamQxOworICAgICAgICBmeCA9IGYyIC0gZjE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2lnbiA9IDE7CisgICAgICAgIGlmIChmMiA+IGYxKSB7amQxLS07IGYxICs9IDg2NDAwTDt9CisgICAgICAgIGpkID0gamQxIC0gamQyOworICAgICAgICBmeCA9IGYxIC0gZjI7CisgICAgfQorICAgIGRlYnVnKEYxMTEsImNtZGlmZmRhdGUgc2lnbiBqZCIsc2lnbjwwPyItIjoiKyIsamQpOworICAgIGRlYnVnKEYxMDEsImNtZGlmZmRhdGUgZngiLCIiLGZ4KTsKKyAgCisgICAgaGggPSAoaW50KSAoZnggLyAzNjAwTCk7CQkvKiBDb252ZXJ0IHNlY29uZHMgdG8gaGg6bW06c3MgKi8KKworICAgIG1tID0gKGludCkgKGZ4ICUgMzYwMEwpIC8gNjBMOworICAgIHNzID0gKGludCkgKGZ4ICUgMzYwMEwpICUgNjBMOworCisgICAgcnAgPSByZXN1bHQ7CQkJLyogRm9ybWF0IHRoZSByZXN1bHQgKi8KKyAgICAqcnArKyA9IChzaWduIDwgMCkgPyAnLScgOiAnKyc7CisgICAgaWYgKGpkICE9IDAgJiYgaGgrbW0rc3MgPT0gMCkgeworCXNwcmludGYocnAsIiVsZGQiLGpkKTsKKyAgICB9IGVsc2UgaWYgKGpkID09IDApIHsKKwlpZiAoc3MgPT0gMCkKKwkgIHNwcmludGYocnAsIiVkOiUwMmQiLGhoLG1tKTsKKwllbHNlCisJICBzcHJpbnRmKHJwLCIlZDolMDJkOiUwMmQiLGhoLG1tLHNzKTsKKyAgICB9IGVsc2UgeworCWlmIChzcyA9PSAwKQorCSAgc3ByaW50ZihycCwiJWxkZCVkOiUwMmQiLGpkLGhoLG1tKTsKKwllbHNlCisJICBzcHJpbnRmKHJwLCIlbGRkJWQ6JTAyZDolMDJkIixqZCxoaCxtbSxzcyk7CisgICAgfQorICAgIGRlYnVnKEYxMTAsImNtZGlmZmRhdGUgcmVzdWx0IixyZXN1bHQsMCk7CisgICAgcmV0dXJuKChjaGFyICopcmVzdWx0KTsKK30KKworLyogcyBoIHUgZiBmIGwgZSBkIGEgdCBlICAtLSAgUmVhcnJhbmdlIGRhdGUgc3RyaW5nICovCisKKy8qCisgIENhbGwgd2l0aDoKKyAgICBBIGRhdGUgc3RyaW5nIGluIHN0YW5kYXJkIGZvcm1hdDogeXl5eW1tZGQgaGg6bW06c3MgKHRpbWUgb3B0aW9uYWwpLgorICAgIE9wdGlvbnM6CisgICAgICAxOiBSZWZvcm1hdCBkYXRlIHRvIHl5eXktbW1tLWRkIChtbW0gPSBFbmdsaXNoIG1vbnRoIGFiYnJldmlhdGlvbikuCisgICAgICAyOiBSZWZvcm1hdCBkYXRlIHRvIGRkLW1tbS15eXl5IChtbW0gPSBFbmdsaXNoIG1vbnRoIGFiYnJldmlhdGlvbikuCisgICAgICAzOiBSZWZvcm1hdCBhcyBudW1lcmljIHl5eXltbWRkaGhtbXNzLgorICAgIFJldHVybnM6CisgICAgICBQb2ludGVyIHRvIHJlc3VsdCBpZiBhcmdzIHZhbGlkLCBvdGhlcndpc2Ugb3JpZ2luYWwgYXJnIHBvaW50ZXIuCisqLworY2hhciAqCitzaHVmZmxlZGF0ZShwLG9wdCkgY2hhciAqIHA7IGludCBvcHQ7IHsKKyAgICBpbnQgbGVuOworICAgIGNoYXIgaWJ1ZlszMl07CisgICAgc3RhdGljIGNoYXIgb2J1Zls0OF07CisgICAgY2hhciBjOworICAgIGludCB5eSwgZGQsIG1tOworCisgICAgaWYgKCFwKSBwID0gIiI7CisgICAgaWYgKCEqcCkgcCA9IGNrZGF0ZSgpOworICAgIGlmIChvcHQgPCAxIHx8IG9wdCA+IDMpCisgICAgICByZXR1cm4ocCk7CisgICAgbGVuID0gc3RybGVuKHApOworICAgIGlmIChsZW4gPCA4IHx8IGxlbiA+IDMxKSByZXR1cm4ocCk7CisgICAgaWYgKG9wdCA9PSAzKSB7CisJY2tzdHJuY3B5KG9idWYscCw0OCk7CisJLyogeXl5eW1tZGQgaGg6bW06c3MgKi8KKwkvKiAwMTIzNDU2Nzg5MDEyMzQ1NiAqLworCS8qIHl5eXltbWRkaGhtbXNzICAgICovCisJb2J1Zls4XSA9IG9idWZbOV07CisJb2J1Zls5XSA9IG9idWZbMTBdOworCW9idWZbMTBdID0gb2J1ZlsxMl07CisJb2J1ZlsxMV0gPSBvYnVmWzEzXTsKKwlvYnVmWzEyXSA9IG9idWZbMTVdOworCW9idWZbMTNdID0gb2J1ZlsxNl07CisJb2J1ZlsxNF0gPSBOVUw7CisJcmV0dXJuKChjaGFyICopb2J1Zik7CisgICAgfQorICAgIGNrc3RybmNweShpYnVmLHAsMzIpOworICAgIGMgPSBpYnVmWzRdOwkJCS8qIFdhcm5pbmc6IG5vdCBZMTBLIGNvbXBsaWFudCAqLworICAgIGlidWZbNF0gPSBOVUw7CisgICAgaWYgKCFyZGlnaXRzKGlidWYpKQorICAgICAgcmV0dXJuKHApOworICAgIHl5ID0gYXRvaShpYnVmKTsKKyAgICBpZiAoeXkgPCAxIHx8IHl5ID4gOTk5OSkKKyAgICAgIHJldHVybihwKTsKKyAgICBpYnVmWzRdID0gYzsKKyAgICBjID0gaWJ1Zls2XTsKKyAgICBpYnVmWzZdID0gTlVMOworICAgIGlmICghcmRpZ2l0cygmaWJ1Zls0XSkpCisgICAgICByZXR1cm4ocCk7CisgICAgbW0gPSBhdG9pKCZpYnVmWzRdKTsKKyAgICBpZiAobW0gPCAxIHx8IG1tID4gMTIpCisgICAgICByZXR1cm4ocCk7CisgICAgaWJ1Zls2XSA9IGM7CisgICAgYyA9IGlidWZbOF07CisgICAgaWJ1Zls4XSA9IE5VTDsKKyAgICBpZiAoIXJkaWdpdHMoJmlidWZbNl0pKQorICAgICAgcmV0dXJuKHApOworICAgIGRkID0gYXRvaSgmaWJ1Zls2XSk7CisgICAgaWJ1Zls4XSA9IGM7CisgICAgaWYgKGRkIDwgMSB8fCBtbSA+IDMxKQorICAgICAgcmV0dXJuKHApOworICAgIC8qIElHTk9SRSBXQVJOSU5HUyBBQk9VVCBtb25hbWVbXSBSRUZTIE9VVCBPRiBSQU5HRSAtIGl0J3MgcHJlY2hlY2tlZC4gKi8KKyAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgY2FzZSAxOgorCXNwcmludGYob2J1ZiwiJTA0ZC0lcy0lMDJkJXMiLHl5LG1vbmFtZVttbS0xXSxkZCwmaWJ1Zls4XSk7CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisJc3ByaW50ZihvYnVmLCIlMDJkLSVzLSUwNGQlcyIsZGQsbW9uYW1lW21tLTFdLHl5LCZpYnVmWzhdKTsKKyAgICB9CisgICAgcmV0dXJuKChjaGFyICopb2J1Zik7Cit9CisKKy8qICBDIEsgQyBWIFQgRCBBIFQgRSAgLS0gIExpa2UgY21jdnRkYXRlKCksIGJ1dCByZXR1cm5zIHN0cmluZy4gICovCisvKiAgRm9yIHVzZSBieSBkYXRlLXJlbGF0ZWQgZnVuY3Rpb25zICovCisvKiAgU2VlIGNhbGxpbmcgY29udmVudGlvbnMgZm9yIGNtY3Z0ZGF0ZSgpIGFib3ZlLiAqLworCitjaGFyICoKK2NrY3Z0ZGF0ZShwLHQpIGNoYXIgKiBwOyBpbnQgdDsgeworICAgIGNoYXIgKiBzOworICAgIGlmICghKHMgPSBjbWN2dGRhdGUocCx0KSkpCisgICAgICByZXR1cm4oIjxCQURfREFURV9PUl9USU1FPiIpOwkvKiBcZmJsYWgoKSBlcnJvciBtZXNzYWdlICovCisgICAgZWxzZQorICAgICAgcmV0dXJuKHMpOworfQorCisKKy8qICBDIE0gRCBBIFQgRSAgLS0gIFBhcnNlIGEgZGF0ZSBhbmQvb3IgdGltZSAgKi8KKworLyoKKyAgQWNjZXB0cyBkYXRlIGluIHZhcmlvdXMgZm9ybWF0cy4gIElmIHRoZSBkYXRlIGlzIHJlY29nbml6ZWQsCisgIHRoaXMgcm91dGluZSByZXR1cm5zIDAgb3IgZ3JlYXRlciB3aXRoIHRoZSByZXN1bHQgc3RyaW5nIHBvaW50ZXIKKyAgcG9pbnRpbmcgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0ZSBhcyAieXl5eW1tZGQgaGg6bW06c3MiLgorKi8KK2ludAorY21kYXRlKHhobHAseGRlZix4cCxxdWlldCxmKSBjaGFyICp4aGxwLCAqeGRlZiwgKip4cDsgaW50IHF1aWV0OyB4eF9zdHJwIGY7IHsKKyAgICBpbnQgeCwgcmM7CisgICAgY2hhciAqbywgKnMsICp6cSwgKmRwOworCisgICAgY21mbGRmbGdzID0gMDsKKyAgICBpZiAoIXhobHApIHhobHAgPSAiIjsKKyAgICBpZiAoIXhkZWYpIHhkZWYgPSAiIjsKKyAgICBpZiAoISp4aGxwKSB4aGxwID0gIkRhdGUgYW5kL29yIHRpbWUiOworICAgICp4cCA9ICIiOworCisgICAgcmMgPSBjbWZsZCh4aGxwLHhkZWYsJnMsKHh4X3N0cnApMCk7CisgICAgZGVidWcoRjEwMSwiY21kYXRlIGNtZmxkIHJjIiwiIixyYyk7CisgICAgaWYgKHJjIDwgMCkKKyAgICAgIHJldHVybihyYyk7CisgICAgZGVidWcoRjExMCwiY21kYXRlIDEiLHMsMCk7CisgICAgbyA9IHM7CQkJCS8qIFJlbWVtYmVyIHdoYXQgdGhleSB0eXBlZC4gKi8KKyAgICBzID0gYnJzdHJpcChzKTsKKyAgICBkZWJ1ZyhGMTEwLCJjbWRhdGUgMiIscywwKTsKKworICAgIHggPSAwOworICAgIGlmIChmKSB7CQkJCS8qIElmIGEgY29udmVyc2lvbiBmdW5jdGlvbiBpcyBnaXZlbiAqLworCWNoYXIgKiBwcDsKKwl6cSA9IGF0eGJ1ZjsJCQkvKiBkbyB0aGUgY29udmVyc2lvbi4gKi8KKwlwcCA9IGF0eGJ1ZjsKKwlhdHhuID0gQ01EQkw7CisJaWYgKCh4ID0gKCpmKShzLCZ6cSwmYXR4bikpIDwgMCkgcmV0dXJuKC0yKTsKKwlpZiAoISpwcCkKKwkgIHBwID0geGRlZjsKKwlpZiAoc2V0YXRtKHBwLDApIDwgMCkgeworCSAgICBpZiAoIXF1aWV0KSBwcmludGYoIj9FdmFsdWF0ZWQgZGF0ZSB0b28gbG9uZ1xuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCXMgPSBhdHhidWY7CisgICAgfQorICAgIGRwID0gY21jdnRkYXRlKHMsMSk7CisgICAgaWYgKCFkcCkgeworCWlmICghcXVpZXQpIHByaW50ZigiPyVzXG4iLGNtZGF0ZW1zZyk7CisJcmV0dXJuKC05KTsKKyAgICB9CisgICAgKnhwID0gZHA7CisgICAgcmV0dXJuKDApOworfQorCisjaWZkZWYgQ0tfUkVDQUxMCQkJLyogQ29tbWFuZC1yZWNhbGwgZnVuY3Rpb25zICovCisKKy8qICBDIE0gUiBJIE4gSSAgLS0gIEluaXRpYWxpemUgb3IgY2hhbmdlIHNpemUgb2YgY29tbWFuZCByZWNhbGwgYnVmZmVyICovCisKK2ludAorY21yaW5pKG4pIGludCBuOyB7CisgICAgaW50IGk7CisgICAgaWYgKHJlY2FsbCAmJiBpbl9yZWNhbGwpIHsJCS8qIEZyZWUgb2xkIHN0b3JhZ2UsIGlmIGFueSAqLworCWZvciAoaSA9IDA7IGkgPCBjbV9yZWNhbGw7IGkrKykgeworCSAgICBpZiAocmVjYWxsW2ldKSB7CisJCWZyZWUocmVjYWxsW2ldKTsKKwkJcmVjYWxsW2ldID0gTlVMTDsKKwkgICAgfQorCX0KKwlmcmVlKHJlY2FsbCk7CisJcmVjYWxsID0gTlVMTDsKKyAgICB9CisgICAgY21fcmVjYWxsID0gbjsJCQkvKiBTZXQgbmV3IHNpemUgKi8KKyAgICBybGFzdCA9IGN1cnJlbnQgPSAtMTsJCS8qIEluaXRpYWxpemUgcG9pbnRlcnMgKi8KKyAgICBpZiAobiA+IDApIHsKKwlyZWNhbGwgPSAoY2hhciAqKiltYWxsb2MoKGNtX3JlY2FsbCArIDEpICogc2l6ZW9mKGNoYXIgKikpOworCWlmICghcmVjYWxsKQorCSAgcmV0dXJuKDEpOworCWZvciAoaSA9IDA7IGkgPCBjbV9yZWNhbGw7IGkrKykgeworCSAgICByZWNhbGxbaV0gPSBOVUxMOworCX0KKwlpbl9yZWNhbGwgPSAxOwkJCS8qIFJlY2FsbCBidWZmZXJzIGluaXQnZCAqLworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qICBDIE0gQSBEIEQgTiBFIFggVCAgLS0gIEZvcmNlIGFkZGl0aW9uIG9mIG5leHQgY29tbWFuZCAqLworCitWT0lECitjbWFkZG5leHQoKSB7CisgICAgaWYgKG9uX3JlY2FsbCAmJiBpbl9yZWNhbGwpIHsJLyogRXZlbiBpZiBpdCBkb2Vzbid0IGNvbWUgKi8KKwlmb3JjZV9hZGQgPSAxOwkJCS8qIGZyb20gdGhlIGtleWJvYXJkICovCisJbmV3Y21kID0gMTsKKwlub19yZWNhbGwgPSAwOworICAgIH0KK30KKworLyogIEMgTSBHIEUgVCBDIE0gRCAgLS0gIEZpbmQgbW9zdCByZWNlbnQgbWF0Y2hpbmcgY29tbWFuZCAgKi8KKworY2hhciAqCitjbWdldGNtZChzKSBjaGFyICogczsgeworICAgIGludCBpOworICAgIGZvciAoaSA9IGN1cnJlbnQ7IGkgPj0gMDsgaS0tKSB7CS8qIFNlYXJjaCBiYWNrd2FyZCB0aHJ1IGhpc3RvcnkgbGlzdCAqLworCWlmICghcmVjYWxsW2ldKSBjb250aW51ZTsJLyogVGhpcyBvbmUncyBudWxsLCBza2lwIGl0ICovCisJaWYgKGNrbWF0Y2gocyxyZWNhbGxbaV0sMCwxKSkJLyogTWF0Y2g/ICovCisJICByZXR1cm4ocmVjYWxsW2ldKTsJCS8qIFllcywgcmV0dXJuIHBvaW50ZXIgKi8KKyAgICB9CisgICAgcmV0dXJuKE5VTEwpOwkJCS8qIE5vIG1hdGNoLCByZXR1cm4gTlVMTCBwb2ludGVyICovCit9CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisKKy8qICBBIEQgRCBDIE0gRCAgLS0gIEFkZCBhIGNvbW1hbmQgdG8gdGhlIHJlY2FsbCBidWZmZXIgICovCisKK1ZPSUQKK2FkZGNtZChzKSBjaGFyICogczsgeworICAgIGludCBsZW4gPSAwLCBucSA9IDA7CisgICAgY2hhciAqIHA7CisjaWZkZWYgQ0tMRUFSTgorICAgIGV4dGVybiBpbnQgbGVhcm5pbmc7CisjZW5kaWYgLyogQ0tMRUFSTiAqLworCisgICAgaWYgKHhjbWRzcmMpCQkJLyogT25seSBmb3IgaW50ZXJhY3RpdmUgY29tbWFuZHMgKi8KKyAgICAgIHJldHVybjsKKworICAgIGlmICghbmV3Y21kKQkJCS8qIFRoZSBjb21tYW5kIGhhcyBiZWVuIGhlcmUgYWxyZWFkeSAqLworICAgICAgcmV0dXJuOwkJCQkvKiBzbyBpZ25vcmUgaXQuICovCisgICAgbmV3Y21kID0gMDsJCQkJLyogSXQncyBuZXcgYnV0IGRvIHRoaXMgb25seSBvbmNlLiAqLworCisgICAgaWYgKCFzKSBzID0gY21kYnVmOworICAgIGlmIChzWzBdKQorICAgICAgbGVuID0gc3RybGVuKHMpOworCisgICAgaWYgKGxlbiA8IDEpCQkJLyogRG9uJ3Qgc2F2ZSBlbXB0eSBjb21tYW5kcyAqLworICAgICAgcmV0dXJuOworCisgICAgcCA9IHM7CisgICAgd2hpbGUgKCpwKSB7IGlmICgqcCsrID09ICc/JykgbnErKzsgfSAvKiBDb3VudCBxdWVzdGlvbiBtYXJrcyAqLworCisjaWZkZWYgQ0tMRUFSTgorICAgIGlmIChsZWFybmluZykJCQkvKiBJZiBhIGxlYXJuZWQgc2NyaXB0IGlzIGFjdGl2ZSAqLworICAgICAgbGVhcm5jbWQocyk7CQkJLyogcmVjb3JkIHRoaXMgY29tbWFuZC4gKi8KKyNlbmRpZiAvKiBDS0xFQVJOICovCisKKyAgICBkZWJ1ZyhGMDEwLCJDTUQoUCkiLHMsMCk7CQkvKiBNYXliZSByZWNvcmQgaXQgaW4gdGhlIGRlYnVnIGxvZyAqLworCisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpZiAoY2t4bG9nZ2luZykgewkJCS8qIE1heWJlIHJlY29yZCBpdCBpbiBzeXNsb2cgKi8KKwlpZiAoY2t4c3lzbG9nID49IFNZU0xHX0NYIHx8IGNreHN5c2xvZyA+PSBTWVNMR19DTSkKKwkgIGNrc3lzbG9nKFNZU0xHX0NYLCAxLCAiY29tbWFuZCIsIHMsIE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworCisjaWZkZWYgQ0tfUkVDQUxMCisgICAgbGFzdF9yZWNhbGwgPSAwOworCisgICAgaWYgKG9uX3JlY2FsbCAmJgkJCS8qIENvbW1hbmQgcmVjYWxsIGlzIG9uPyAqLworCWNtX3JlY2FsbCA+IDAgJiYJCS8qIFJlY2FsbCBidWZmZXIgc2l6ZSBpcyA+IDA/ICovCisJIW5vX3JlY2FsbCkgewkJCS8qIE5vdCBub3Qgc2F2aW5nIHRoaXMgY29tbWFuZD8gKi8KKworCWlmICghZm9yY2VfYWRkICYmIHJsYXN0ID4gLTEpCS8qIElmIHByZXZpb3VzIGNvbW1hbmQgd2FzIGlkZW50aWNhbCAqLworCSAgaWYgKCFzdHJjbXAocyxyZWNhbGxbcmxhc3RdKSkgLyogZG9uJ3QgYWRkIGFub3RoZXIgY29weSAqLworCSAgICByZXR1cm47CisKKwlmb3JjZV9hZGQgPSAwOwkJCS8qIFJlc2V0IG5vdyBpbiBjYXNlIGl0IHdhcyBzZXQgKi8KKworICAgICAgICBpZiAocmxhc3QgPj0gY21fcmVjYWxsIC0gMSkgewkvKiBSZWNhbGwgYnVmZmVyIGZ1bGw/ICovCisJICAgIGludCBpOworCSAgICBpZiAocmVjYWxsWzBdKSB7CQkvKiBEaXNjYXJkIG9sZGVzdCBjb21tYW5kICovCisJCWZyZWUocmVjYWxsWzBdKTsKKwkJcmVjYWxsWzBdID0gTlVMTDsKKwkgICAgfQorCSAgICBmb3IgKGkgPSAwOyBpIDwgcmxhc3Q7IGkrKykgeyAgLyogVGhlIHJlc3QgKi8KKwkJcmVjYWxsW2ldID0gcmVjYWxsW2krMV07ICAgLyogbW92ZSBiYWNrICovCisJICAgIH0KKwkgICAgcmxhc3QtLTsJCQkvKiBOb3cgd2UgaGF2ZSBvbmUgbGVzcyAqLworCX0KKyAgICAgICAgcmxhc3QrKzsJCQkvKiBJbmRleCBvZiBsYXN0IGNvbW1hbmQgaW4gYnVmZmVyICovCisJY3VycmVudCA9IHJsYXN0OwkJLyogQWxzbyBub3cgdGhlIGN1cnJlbnQgY29tbWFuZCAqLworCWlmIChjdXJyZW50ID49IGNtX3JlY2FsbCkgewkvKiBTaG91bGRuJ3QgaGFwcGVuICovCisJICAgIHByaW50ZigiP0NvbW1hbmQgaGlzdG9yeSBlcnJvclxuIik7CS8qIGJ1dCBpZiBpdCBkb2VzICovCisJICAgIG9uX3JlY2FsbCA9IDA7CQkgICAgICAgIC8qIHR1cm4gb2ZmIGNvbW1hbmQgc2F2aW5nICovCisjaWZkZWYgQ09NTUVOVAorCX0gZWxzZSBpZiAobnEgPiAwKSB7CQkvKiBIYXZlIGF0IGxlYXN0IG9uZSBxdWVzdGlvbiBtYXJrICovCisJICAgIHJlY2FsbFtjdXJyZW50XSA9IG1hbGxvYyhsZW4rbnErMSk7CisJICAgIGlmIChyZWNhbGxbY3VycmVudF0pIHsKKwkJcCA9IHJlY2FsbFtjdXJyZW50XTsKKwkJd2hpbGUgKCpzKSB7CisJCSAgICBpZiAoKnMgPT0gJz8nKQorCQkgICAgICAqcCsrID0gJ1xcJzsKKwkJICAgICpwKysgPSAqcysrOworCQl9CisJCSpwID0gTlVMOworCSAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCX0gZWxzZSB7CQkJLyogTm9ybWFsIGNhc2UsIGp1c3QgY29weSAqLworCSAgICByZWNhbGxbY3VycmVudF0gPSBtYWxsb2MobGVuKzEpOworCSAgICBpZiAocmVjYWxsW2N1cnJlbnRdKQorCSAgICAgIGNrc3RybmNweShyZWNhbGxbY3VycmVudF0scyxsZW4rMSk7CisJfQorICAgIH0KKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KK30KKworCisjaWZkZWYgQ0tfUkVDQUxMCisKKy8qIEMgTSBIIEkgUyBUIE8gUiBZICovCisKK1ZPSUQKK2NtaGlzdG9yeSgpIHsKKyAgICBpbnQgaSwgbGMgPSAxOworICAgIGZvciAoaSA9IDA7IGkgPD0gY3VycmVudDsgaSsrKSB7CisJcHJpbnRmKCIgJXNcbiIsIHJlY2FsbFtpXSk7CisJaWYgKCsrbGMgPiAoY21kX3Jvd3MgLSAyKSkgewkvKiBTY3JlZW4gZnVsbD8gKi8KKwkgICAgaWYgKCFhc2ttb3JlKCkpCQkvKiBEbyBtb3JlLXByb21wdGluZy4uLiAqLworCSAgICAgIGJyZWFrOworCSAgICBlbHNlCisJICAgICAgbGMgPSAwOworCX0KKyAgICB9Cit9CisKK2ludAorc2F2aGlzdG9yeShzLGRpc3ApIGNoYXIgKnM7IGludCBkaXNwOyB7CisgICAgRklMRSAqIGZwOworICAgIGludCBpOworCisgICAgZnAgPSBmb3BlbihzLCBkaXNwID8gImEiIDogInciKTsKKyAgICBpZiAoIWZwKSB7CisJcGVycm9yKHMpOworCXJldHVybigwKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8PSBjdXJyZW50OyBpKyspCisgICAgICBmcHJpbnRmKGZwLCIlc1xuIiwgcmVjYWxsW2ldKTsKKyAgICBmY2xvc2UoZnApOworICAgIHJldHVybigxKTsKK30KKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKworI2lmZGVmIENPTU1FTlQKKy8qIGFwcGFyZW50bHkgbm90IHVzZWQgKi8KK2ludAorY21nZXRsYyhzKSBjaGFyICogczsgewkJCS8qIEdldCBsZWFkaW5nIGNoYXIgKi8KKyAgICBjaGFyIGM7CisgICAgd2hpbGUgKChjID0gKnMrKykgPD0gU1ApIHsKKwlpZiAoIWMpCisJICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuKGMpOworfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworCisvKiAgQyBNIEMgRiBNICAtLSAgUGFyc2UgY29tbWFuZCBjb25maXJtYXRpb24gKGVuZCBvZiBsaW5lKSAgKi8KKworLyoKKyBSZXR1cm5zCisgICAtMjogVXNlciB0eXBlZCBhbnl0aGluZyBidXQgd2hpdGVzcGFjZSBvciBuZXdsaW5lCisgICAtMTogUmVwYXJzZSBuZWVkZWQKKyAgICAwOiBDb25maXJtYXRpb24gd2FzIHJlY2VpdmVkCisqLworaW50CitjbWNmbSgpIHsKKyAgICBpbnQgeCwgeGM7CisgICAgZGVidWcoRjEwMSwiY21jZm06IGNtZmxncyIsIiIsY21mbGdzKTsKKyAgICBkZWJ1ZyhGMTEwLCJjbWNmbTogYXRtYnVmIixhdG1idWYsMCk7CisgICAgaW53b3JkID0geGMgPSBjYyA9IDA7CisKKyAgICBzZXRhdG0oIiIsMCk7CQkJLyogKFByb2JhYmx5IHVubmVjZXNzYXJ5KSAqLworCisgICAgd2hpbGUgKGNtZmxncyAhPSAxKSB7CisgICAgICAgIHggPSBndHdvcmQoMCk7CisgICAgICAgIHhjICs9IGNjOworCisgICAgICAgIHN3aXRjaCAoeCkgeworCSAgY2FzZSAtOToKKwkgICAgcHJpbnRmKCJDb21tYW5kIG9yIGZpZWxkIHRvbyBsb25nXG4iKTsKKwkgIGNhc2UgLTQ6CQkJLyogRU9GICovCisJICBjYXNlIC0yOgorCSAgY2FzZSAtMToKKwkgICAgcmV0dXJuKHgpOworCSAgY2FzZSAxOgkJCS8qIEVuZCBvZiBsaW5lICovCisJICAgIGlmICh4YyA+IDApIHsKKwkJaWYgKHhjbWZkYikgeworCQkgICAgcmV0dXJuKC02KTsKKwkJfSBlbHNlIHsKKwkJICAgIHByaW50ZigiP05vdCBjb25maXJtZWQgLSAlc1xuIixhdG1idWYpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorCSAgICB9IGVsc2UKKwkgICAgICBicmVhazsJCQkvKiBGaW5pc2ggdXAgYmVsb3cgKi8KKwkgIGNhc2UgMjoJCQkvKiBFU0MgKi8KKwkgICAgaWYgKHhjID09IDApIHsKKwkJYmxlZXAoQlBfV0FSTik7CisJCWNvbnRpbnVlOwkJLyogb3IgZmFsbCB0aHJ1LiAqLworCSAgICB9CisJICBjYXNlIDA6CQkJLyogU3BhY2UgKi8KKwkgICAgaWYgKHhjID09IDApCQkvKiBJZiBubyBjaGFycyB0eXBlZCwgY29udGludWUsICovCisJICAgICAgY29udGludWU7CQkJLyogZWxzZSBmYWxsIHRocnUuICovCisJICAgIC8qIGVsc2UgZmFsbCB0aHJ1Li4uICovCisKKwkgIGNhc2UgMzoJCQkvKiBRdWVzdGlvbiBtYXJrICovCisJICAgIGlmICh4YyA+IDApIHsKKwkJaWYgKHhjbWZkYikgeworCQkgICAgcmV0dXJuKC02KTsKKwkJfSBlbHNlIHsKKwkJICAgIHByaW50ZigiP05vdCBjb25maXJtZWQgLSAlc1xuIixhdG1idWYpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorCSAgICB9CisJICAgIHByaW50ZigKKwkgICAgICAgIlxuIFByZXNzIHRoZSBSZXR1cm4gb3IgRW50ZXIga2V5IHRvIGNvbmZpcm0gdGhlIGNvbW1hbmRcbiIpOworCSAgICBwcmludGYoIiVzJXMiLGNtcHJvbSxjbWRidWYpOworCSAgICBmZmx1c2goc3Rkb3V0KTsKKwkgICAgY29udGludWU7CisJfQorICAgIH0KKyAgICBkZWJvayA9IDE7CisgICAgcmV0dXJuKDApOworfQorCisKKy8qIFRoZSBmb2xsb3dpbmcgbWF0ZXJpYWwgc3VwcG9ydHMgY2hhaW5lZCBwYXJzaW5nIGZ1bmN0aW9ucy4gKi8KKy8qIFNlZSBja3VjbWQuaCBmb3IgRkRCIGFuZCBPRkRCIGRlZmluaXRpb25zLiAqLworCitzdHJ1Y3QgT0ZEQiBjbXJlc3VsdCA9IHsJCS8qIFVuaXZlcnNhbCBjbWZkYiByZXN1bHQgaG9sZGVyICovCisgICAgTlVMTCwKKyAgICAwLAorICAgIE5VTEwsCisgICAgMAorfTsKKworVk9JRAorY21mZGJpKHAsZmMsczEsczIsczMsbjEsbjIsZixrLG54dCkJLyogSW5pdGlhbGl6ZSBhbiBGREIgKi8KKyAgICBzdHJ1Y3QgRkRCICogcDsKKyAgICBpbnQgZmM7CisgICAgY2hhciAqIHMxLCAqIHMyLCAqIHMzOworICAgIGludCBuMSwgbjI7CisgICAgeHhfc3RycCBmOworICAgIHN0cnVjdCBrZXl0YWIgKiBrOworICAgIHN0cnVjdCBGREIgKiBueHQ7IHsKKworICAgIHAtPmZjb2RlID0gZmM7CisgICAgcC0+aGxwbXNnID0gczE7CisgICAgcC0+ZGZsdCA9IHMyOworICAgIHAtPnNkYXRhID0gczM7CisgICAgcC0+bmRhdGExID0gbjE7CisgICAgcC0+bmRhdGEyID0gbjI7CisgICAgcC0+c3BmID0gZjsKKyAgICBwLT5rd2R0YmwgPSBrOworICAgIHAtPm54dGZkYiA9IG54dDsKK30KKworLyogIEMgTSBGIEQgQiAgLS0gIFBhcnNlIGEgZmllbGQgd2l0aCBzZXZlcmFsIHBvc3NpYmxlIGZ1bmN0aW9ucyAgKi8KKworaW50CitjbWZkYihmZGJpbikgc3RydWN0IEZEQiAqIGZkYmluOyB7CisjaWZuZGVmIE5PU1BMCisgICAgZXh0ZXJuIGludCB4X2lmbnVtOyAgICAgICAgICAgICAgICAgLyogSUYgTlVNRVJJQyAtIGRpc2FibGVzIHdhcm5pbmdzICovCisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICBzdHJ1Y3QgRkRCICogaW4gPSBmZGJpbjsKKyAgICBzdHJ1Y3QgT0ZEQiAqIG91dCA9ICZjbXJlc3VsdDsKKyAgICBpbnQgeCA9IDAsIG4sIHI7CisgICAgY2hhciAqcywgKnhwLCAqbSA9IE5VTEw7CisgICAgaW50IGVycmJpdHMgPSAwOworCisgICAgeHAgPSBicDsKKworICAgIG91dC0+ZmNvZGUgPSAtMTsJCQkvKiBJbml0aWFsaXplIG91dHB1dCBzdHJ1Y3QgKi8KKyAgICBvdXQtPmZkYmFkZHIgPSBOVUxMOworICAgIG91dC0+c3Jlc3VsdCA9IE5VTEw7CisgICAgb3V0LT5ucmVzdWx0ID0gMDsKKy8qCisgIEN1cnJlbnRseSB3ZSBtYWtlIG9uZSB0cmlwIHRocm91Z2ggdGhlIEZEQnMuICBTbyBpZiB0aGUgdXNlciB0eXBlcyBFc2Mgb3IKKyAgVGFiIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmaWVsZCwgb25seSB0aGUgZmlyc3QgRkRCIGlzIGV4YW1pbmVkIGZvciBhCisgIGRlZmF1bHQuICBJZiB0aGUgdXNlciB0eXBlcyA/LCBoZWxwIGlzIGdpdmVuIG9ubHkgZm9yIG9uZSBGREIuICBXZSBzaG91bGQKKyAgc2VhcmNoIHRocm91Z2ggdGhlIEZEQnMgZm9yIGFsbCBtYXRjaGluZyBwb3NzaWJpbGl0aWVzIC0tIGFuZCBpbiBwYXJ0aWN1bGFyCisgIGRpc3BsYXkgdGhlIHBlcnRpbmVudCBjb250ZXh0LXNlbnNpdGl2ZSBoZWxwIGZvciBlYWNoIGZ1bmN0aW9uLCByYXRoZXIgdGhhbgorICB0aGUgb25seSB0aGUgZmlyc3Qgb25lIHRoYXQgd29ya3MsIGFuZCB0aGVuIHJld2luZCB0aGUgRkRCIHBvaW50ZXIgc28gd2UKKyAgYXJlIG5vdCBsb2NrZWQgb3V0IG9mIHRoZSBlYXJsaWVyIG9uZXMuCisqLworICAgIGNtZmxkZmxncyA9IDA7CisgICAgd2hpbGUgKDEpIHsJCQkJLyogTG9vcCB0aHJvdWdoIHRoZSBjaGFpbiBvZiBGREJzICovCisJbm9tc2cgPSAxOworCXhjbWZkYiA9IDE7CisJcyA9IE5VTEw7CisJbiA9IDA7CisJZGVidWcoRjEwMSwiY21mZGIgaW4tPmZjb2RlIiwiIixpbi0+ZmNvZGUpOworCXN3aXRjaCAoaW4tPmZjb2RlKSB7CQkvKiBDdXJyZW50IHBhcnNpbmcgZnVuY3Rpb24gY29kZSAqLworCSAgY2FzZSBfQ01OVU06CisJICAgIHIgPSBpbi0+bmRhdGExOworCSAgICBpZiAociAhPSAxMCAmJiByICE9IDgpIHIgPSAxMDsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgIHhfaWZudW0gPSAxOyAgICAgICAgICAgICAgICAvKiBEaXNhYmxlcyB3YXJuaW5nIG1lc3NhZ2VzICovCisjZW5kaWYgLyogTk9TUEwgKi8KKwkgICAgeCA9IGNtbnVtKGluLT5obHBtc2csaW4tPmRmbHQsciwmbixpbi0+c3BmKTsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgIHhfaWZudW0gPSAwOworI2VuZGlmIC8qIE5PU1BMICovCisJICAgIGRlYnVnKEYxMDEsImNtZmRiIGNtbnVtIiwiIix4KTsKKwkgICAgaWYgKHggPCAwKSBlcnJiaXRzIHw9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSBfQ01PRkk6CisJICAgIHggPSBjbW9maShpbi0+aGxwbXNnLGluLT5kZmx0LCZzLGluLT5zcGYpOworCSAgICBkZWJ1ZyhGMTAxLCJjbWZkYiBjbW9maSIsIiIseCk7CisJICAgIGlmICh4IDwgMCkgZXJyYml0cyB8PSAyOworCSAgICBicmVhazsKKwkgIGNhc2UgX0NNSUZJOgorCSAgICB4ID0gY21pZmkyKGluLT5obHBtc2csCisJCSAgICAgICBpbi0+ZGZsdCwKKwkJICAgICAgICZzLAorCQkgICAgICAgJm4sCisJCSAgICAgICBpbi0+bmRhdGExLAorCQkgICAgICAgaW4tPnNkYXRhLAorCQkgICAgICAgaW4tPnNwZiwKKwkJICAgICAgIGluLT5uZGF0YTIKKwkJICAgICAgICk7CisJICAgIGRlYnVnKEYxMDEsImNtZmRiIGNtaWZpMiB4IiwiIix4KTsKKwkgICAgZGVidWcoRjEwMSwiY21mZGIgY21pZmkyIG4iLCIiLG4pOworCSAgICBpZiAoeCA8IDApIGVycmJpdHMgfD0gNDsKKwkgICAgYnJlYWs7CisJICBjYXNlIF9DTUZMRDoKKwkgICAgY21mbGRmbGdzID0gaW4tPm5kYXRhMTsKKwkgICAgeCA9IGNtZmxkKGluLT5obHBtc2csaW4tPmRmbHQsJnMsaW4tPnNwZik7CisJICAgIGRlYnVnKEYxMDEsImNtZmRiIGNtZmxkIiwiIix4KTsKKwkgICAgaWYgKHggPCAwKSBlcnJiaXRzIHw9IDg7CisJICAgIGJyZWFrOworCSAgY2FzZSBfQ01UWFQ6CisJICAgIHggPSBjbXR4dChpbi0+aGxwbXNnLGluLT5kZmx0LCZzLGluLT5zcGYpOworCSAgICBkZWJ1ZyhGMTAxLCJjbWZkYiBjbXR4dCIsIiIseCk7CisJICAgIGlmICh4IDwgMCkgZXJyYml0cyB8PSAxNjsKKwkgICAgYnJlYWs7CisJICBjYXNlIF9DTUtFWToKKwkgICAgeCA9IGNta2V5Mihpbi0+a3dkdGJsLAorCQkgICAgICAgaW4tPm5kYXRhMSwKKwkJICAgICAgIGluLT5obHBtc2csaW4tPmRmbHQsaW4tPnNkYXRhLGluLT5zcGYsaW4tPm5kYXRhMik7CisJICAgIGRlYnVnKEYxMDEsImNtZmRiIGNta2V5IiwiIix4KTsKKwkgICAgaWYgKHggPCAwKSBlcnJiaXRzIHw9ICgoaW4tPm5kYXRhMiAmIDQpID8gMzIgOiA2NCk7CisJICAgIGJyZWFrOworCSAgY2FzZSBfQ01DRk06CisJICAgIHggPSBjbWNmbSgpOworCSAgICBkZWJ1ZyhGMTAxLCJjbWZkYiBjbWNmbSIsIiIseCk7CisJICAgIGlmICh4IDwgMCkgZXJyYml0cyB8PSAxMjg7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgZGVidWcoRjEwMSwiY21mZGIgLSB1bmV4cGVjdGVkIGZ1bmN0aW9uIGNvZGUiLCIiLGluLT5mY29kZSk7CisJICAgIHByaW50ZigiP2NtZmRiIC0gdW5leHBlY3RlZCBmdW5jdGlvbiBjb2RlOiAlZFxuIixpbi0+ZmNvZGUpOworCX0KKwlkZWJ1ZyhGMTAxLCJjbWZkYiB4IiwiIix4KTsKKwlkZWJ1ZyhGMTAxLCJjbWZkYiBjbWZsZ3MiLCIiLGNtZmxncyk7CisJZGVidWcoRjEwMSwiY21mZGIgY3JmbGFnIiwiIixjcmZsYWcpOworCWRlYnVnKEYxMDEsImNtZmRiIHFtZmxhZyIsIiIscW1mbGFnKTsKKwlkZWJ1ZyhGMTAxLCJjbWZkYiBlc2ZsYWciLCIiLGVzZmxhZyk7CisKKwlpZiAoeCA+IC0xKSB7CQkJLyogU3VjY2VzcyAqLworCSAgICBvdXQtPmZjb2RlID0gaW4tPmZjb2RlOwkvKiBGaWxsIGluIG91dHB1dCBzdHJ1Y3QgKi8KKwkgICAgb3V0LT5mZGJhZGRyID0gaW47CisJICAgIG91dC0+c3Jlc3VsdCA9IHM7CisJICAgIG91dC0+bnJlc3VsdCA9IChpbi0+ZmNvZGUgPT0gX0NNS0VZKSA/IHggOiBuOworCSAgICBvdXQtPmtmbGFncyA9IChpbi0+ZmNvZGUgPT0gX0NNS0VZKSA/IGNta3dmbGdzIDogMDsKKwkgICAgZGVidWcoRjExMSwiY21mZGIgb3V0LT5ucmVzdWx0IixvdXQtPnNyZXN1bHQsb3V0LT5ucmVzdWx0KTsKKwkgICAgbm9tc2cgPSAwOworCSAgICB4Y21mZGIgPSAwOworCSAgICAvKiBkZWJ1ZyhGMTExLCJjbWZkYiBjbWRidWYgJiBjcmZsYWciLGNtZGJ1ZixjcmZsYWcpOyAqLworCSAgICBpZiAoY3JmbGFnKSB7CisJCWNtZmxncyA9IDE7CisJICAgIH0KKwkgICAgcmV0dXJuKHgpOwkJCS8qIGFuZCByZXR1cm4gKi8KKwl9CisJaW4gPSBpbi0+bnh0ZmRiOwkJLyogRmFpbGVkLCBnZXQgbmV4dCBwYXJzaW5nIGZ1bmN0aW9uICovCisJbm9tc2cgPSAwOworCXhjbWZkYiA9IDA7CisJaWYgKCFpbikgewkJCS8qIE5vIG1vcmUgKi8KKwkgICAgZGVidWcoRjEwMSwiY21mZGIgZmFpbHVyZSB4IiwiIix4KTsKKwkgICAgZGVidWcoRjEwMSwiY21mZGIgZmFpbHVyZSBlcnJiaXRzIiwiIixlcnJiaXRzKTsKKwkgICAgaWYgKHggPT0gLTYpCisJICAgICAgeCA9IC05OworCSAgICBpZiAoeCA9PSAtOSkgeworI2lmZGVmIENLUk9PVAorCQlpZiAoY2tyb290ZXJyKQorCQkgIG0gPSAiT2ZmIExpbWl0cyI7CisJCWVsc2UKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKwkJLyogTWFrZSBpbmZvcm1hdGl2ZSBtZXNzYWdlcyBmb3IgYSBmZXcgY29tbW9uIGNhc2VzICovCisJCXN3aXRjaCAoZXJyYml0cykgeworCQkgIGNhc2UgNCszMjogbSA9ICJEb2VzIG5vdCBtYXRjaCBmaWxlbmFtZSBvciBzd2l0Y2giOyBicmVhazsKKwkJICBjYXNlIDQrNjQ6IG0gPSAiRG9lcyBub3QgbWF0Y2ggZmlsZW5hbWUgb3Iga2V5d29yZCI7IGJyZWFrOworCQkgIGNhc2UgMSszMjogbSA9ICJOb3QgYSBudW1iZXIgb3IgdmFsaWQga2V5d29yZCI7IGJyZWFrOworCQkgIGNhc2UgMSs2NDogbSA9ICJOb3QgYSBudW1iZXIgb3IgdmFsaWQgc3dpdGNoIjsgYnJlYWs7CisJCSAgZGVmYXVsdDogbSA9ICJOb3QgdmFsaWQgaW4gdGhpcyBwb3NpdGlvbiI7CisJCX0KKwkJcHJpbnRmKCI/JXM6IFwiJXNcIlxuIixtLCBhdG1idWYpOworCSAgICB9CisJICAgIHJldHVybih4KTsKKwl9CisJaWYgKHggIT0gLTIgJiYgeCAhPSAtNiAmJiB4ICE9IC05ICYmIHggIT0gLTMpIC8qIEVkaXRpbmcgb3Igc29tZXN1Y2ggKi8KKwkgIHJldHVybih4KTsJCQkvKiBHbyBiYWNrIGFuZCByZXBhcnNlICovCisJcHAgPSBucCA9IGJwID0geHA7CQkvKiBCYWNrIHVwIHBvaW50ZXJzICovCisJY21mbGdzID0gLTE7CQkJLyogRm9yY2UgYSByZXBhcnNlICovCisKKworI2lmbmRlZiBOT1NQTAorCWlmICghYXNrZmxhZykgewkJCS8qIElmIG5vdCBleGVjdXRpbmcgQVNLLWNsYXNzIGNtZC4uLiAqLworI2VuZGlmIC8qIE5PU1BMICovCisJICAgIGlmIChjcmZsYWcpIHsJCS8qIElmIENSIHdhcyB0eXBlZCwgcHV0IGl0IGJhY2sgKi8KKwkJcHVzaGMgPSBMRjsJCS8qIEJ1dCBhcyBhIGxpbmVmZWVkICovCisJICAgIH0gZWxzZSBpZiAocW1mbGFnKSB7CS8qIERpdHRvIGZvciBRdWVzdGlvbiBtYXJrICovCisJCXB1c2hjID0gJz8nOworCSAgICB9IGVsc2UgaWYgKGVzZmxhZykgewkvKiBhbmQgRXNjYXBlIG9yIFRhYiAqLworCQlwdXNoYyA9IEVTQzsKKwkgICAgfQorI2lmbmRlZiBOT1NQTAorCX0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIH0KK30KKworCisvKiAgRyBUIFcgTyBSIEQgIC0tICBHZXRzIGEgIndvcmQiIGZyb20gdGhlIGNvbW1hbmQgaW5wdXQgc3RyZWFtICAqLworCisvKgorVXNhZ2U6IHJldGNvZGUgPSBndHdvcmQoYnJrKTsKKyAgYnJrID0gMCBmb3Igbm9ybWFsIHdvcmQgYnJlYWtzIChzcGFjZSwgQ1IsIEVzYywgPykKKyAgYnJrID0gMSB0byBhZGQgJzonIGFuZCAnPScgKGZvciBwYXJzaW5nIHN3aXRjaGVzKS4gIFRoZXNlIGNoYXJhY3RlcnMKKyAgICAgICAgYWN0IGFzIGJyZWFrIGNoYXJhY3RlcnMgb25seSBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBmaWVsZAorICAgICAgICBpcyBzbGFzaCAoJy8nKSwgaS5lLiBzd2l0Y2ggaW50cm9kdWNlci4KKworUmV0dXJuczoKKy0xMCBUaW1lbGltaXQgc2V0IGFuZCB0aW1lZCBvdXQKKyAtOSBpZiBpbnB1dCB3YXMgdG9vIGxvbmcKKyAtNCBpZiBlbmQgb2YgZmlsZSAoZS5nLiBwaXBlIGJyb2tlbikKKyAtMyBpZiBudWxsIGZpZWxkCisgLTIgaWYgY29tbWFuZCBidWZmZXIgb3ZlcmZsb3dzCisgLTEgaWYgdXNlciBkaWQgc29tZSBkZWxldGluZworICAwIGlmIHdvcmQgdGVybWluYXRlcyB3aXRoIFNQIG9yIHRhYgorICAxIGlmIC4uLiBDUgorICAyIGlmIC4uLiBFU0MKKyAgMyBpZiAuLi4gPyAocXVlc3Rpb24gbWFyaykKKyAgNCBpZiAuLi4gOiBvciA9IGFuZCBjYWxsZWQgd2l0aCBicmsgIT0gMAorCitXaXRoOgorICBwcCBwb2ludGluZyB0byBiZWdpbm5pbmcgb2Ygd29yZCBpbiBidWZmZXIKKyAgYnAgcG9pbnRpbmcgdG8gYWZ0ZXIgY3VycmVudCBwb3NpdGlvbgorICBhdG1idWYgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIHdvcmQKKyAgY2MgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHdvcmQgY29waWVkIHRvIGF0bWJ1ZgorKi8KKworaW50Cit1bmd3b3JkKCkgewkJCQkvKiBVbmdldCBhIHdvcmQgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ1bmd3b3JkIGNtZmxncyIsIiIsY21mbGdzKTsKKyAgICBpZiAodW5ndykgcmV0dXJuKDApOworICAgIGNtZnNhdiA9IGNtZmxnczsKKyAgICB1bmd3ID0gMTsKKyAgICBjbWZsZ3MgPSAwOworICAgIHJldHVybigwKTsKK30KKworLyogVW4tdW4tZ2V0IHdvcmQuICBVbmRvIHVuZ3dvcmQoKSBpZiBpdCBoYXMgYmVlbiBkb25lLiAqLworCitWT0lECit1bnVuZ3coKSB7CisgICAgZGVidWcoRjAxMCwidW51bmd3IGF0bWJ1ZiIsYXRtYnVmLDApOworICAgIGlmICh1bmd3KSB7CisJdW5ndyA9IDA7CisJY21mbGdzID0gY21mc2F2OworCWF0bWJ1ZlswXSA9IE5VTDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2d0d29yZChicmspIGludCBicms7IHsKKyAgICBpbnQgYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNoYXIgKi8KKyAgICBpbnQgcXVvdGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBxdW90ZSBjaGFyYWN0ZXIgKi8KKyAgICBpbnQgZWNob2YgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciB3aGV0aGVyIHRvIGVjaG8gKi8KKyAgICBpbnQgY29tbWVudCA9IDA7CQkJLyogRmxhZyBmb3IgaW4gY29tbWVudCAqLworICAgIGNoYXIgKmNwID0gTlVMTDsJCQkvKiBDb21tZW50IHBvaW50ZXIgKi8KKyAgICBpbnQgZWludHIgPSAwOwkJCS8qIEZsYWcgZm9yIHN5c2NhbGwgaW50ZXJydXB0ZWQgKi8KKyAgICBpbnQgYnJhY2VsdmwgPSAwOwkJCS8qIG5lc3RlZCBicmFjZSBjb3VudGVyIFtqcnNdICovCisgICAgaW50IGlzY29udGQgPSAwOwkJCS8qIEZsYWcgZm9yIGNvbnRpbnVhdGlvbiAqLworICAgIGludCByZWFsdHR5ID0gMDsJCQkvKiBTdGRpbiBpcyByZWFsbHkgYSB0dHkgKi8KKyAgICBjaGFyIGZpcnN0bmIgID0gTlVMOworICAgIGNoYXIgbGFzdGNoYXIgPSBOVUw7CisgICAgY2hhciBwcmV2Y2hhciA9IE5VTDsKKyAgICBjaGFyIGxicmFjZSwgcmJyYWNlOworICAgIGludCBkcSA9IDA7CQkJCS8qIERvdWJsZXF1b3RlIGZsYWcgKi8KKyAgICBpbnQgZHFuID0gMDsJCQkvKiBhbmQgY291bnQgKi8KKyAgICBpbnQgaXNlc2MgPSAwOworCisjaWZkZWYgUlRVCisgICAgZXh0ZXJuIGludCBydHVfYnVnOworI2VuZGlmIC8qIFJUVSAqLworCisjaWZkZWYgSUtTRAorICAgIGV4dGVybiBpbnQgaW5zZXJ2ZXI7CisjZW5kaWYgLyogSUtTRCAqLworICAgIGV4dGVybiBpbnQga3N0YXJ0YWN0aXZlOworCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICBleHRlcm4gaW50IHRlcm10eXBlOyAgICAgICAgICAgICAgICAvKiBERyB0ZXJtaW5hbCB0eXBlIGZsYWcgKi8KKyAgICBleHRlcm4gaW50IGNvbl9yZWFkc19tdDsgICAgICAgICAgICAvKiBDb25zb2xlIHJlYWQgYXN5bmNoIGlzIGFjdGl2ZSAqLworICAgIGlmIChjb25fcmVhZHNfbXQpIGNvbm5vaV9tdCgpOyAgICAgIC8qIFRhc2sgd291bGQgaW50ZXJmZXJlIHcvY29ucyByZWFkICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKworCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworCWRlYnVnKEYxMDEsImd0d29yZCBicmsiLCIiLGJyayk7CisJZGVidWcoRjEwMSwiZ3R3b3JkIGNtZmxkZmxncyIsIiIsY21mbGRmbGdzKTsKKwlkZWJ1ZyhGMTAxLCJndHdvcmQgc3dhcmciLCIiLHN3YXJnKTsKKwlkZWJ1ZyhGMTAxLCJndHdvcmQgZHB4IiwiIixkcHgpOworCWRlYnVnKEYxMDEsImd0d29yZCBlY2hvZiIsIiIsZWNob2YpOworI2lmbmRlZiBOT1NQTAorCWRlYnVnKEYxMDEsImd0d29yZCBhc2tmbGFnIiwiIixhc2tmbGFnKTsKKwlkZWJ1ZyhGMTAxLCJndHdvcmQgdGltZWxpbWl0IiwiIix0aW1lbGltaXQpOworI2lmbmRlZiBOT0xPQ0FMCisjaWZuZGVmIE5PWEZFUgorI2lmZGVmIENLX0FVVE9ETAorCWRlYnVnKEYxMDEsImd0d29yZCBjbWRhZGwiLCIiLGNtZGFkbCk7CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisjZW5kaWYgLyogTk9YRkVSICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworI2VuZGlmIC8qIE5PU1BMICovCisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgcmVhbHR0eSA9IGlzX2FfdHR5KDApOwkJLyogU3RkaW4gaXMgcmVhbGx5IGEgdHR5PyAqLworCisgICAgaWYgKGNtZmxkZmxncyAmIDEpIHsKKwlsYnJhY2UgPSAnKCc7CisJcmJyYWNlID0gJyknOworICAgIH0gZWxzZSB7CisJbGJyYWNlID0gJ3snOworCXJicmFjZSA9ICd9JzsKKyAgICB9CisgICAgY3JmbGFnID0gMDsKKyAgICBxbWZsYWcgPSAwOworICAgIGVzZmxhZyA9IDA7CisKKyAgICBpZiAoc3dhcmcpIHsJCQkvKiBObyBsZWFkaW5nIHNwYWNlIGZvciBzd2l0Y2ggYXJncyAqLworCWlud29yZCA9IDE7CisJc3dhcmcgPSAwOworICAgIH0KKyAgICBpZiAodW5ndykgewkJCQkvKiBIYXZlIGEgd29yZCBzYXZlZD8gKi8KKyNpZmRlZiBNX1VOR1cKKwkvKiBFeHBlcmltZW50YWwgY29kZSB0byBhbGxvdyB1bmdldHRpbmcgbXVsdGlwbGUgd29yZHMuICovCisJLyogU2VlIGNvbW1lbnRzIGluIGNrbWtleTIoKSBhYm92ZS4gKi8KKwlpbnQgeDsKKwlpZiAobnAgPiBwcCkgcHAgPSBucDsKKwl3aGlsZSAoKnBwID09IFNQKSBwcCsrOworCWlmICghKnBwKSB7CisJICAgIHVuZ3cgPSAwOworCSAgICBjbWZsZ3MgPSBjbWZzYXY7CisJfSBlbHNlIHsKKwkgICAgaWYgKCh4ID0gc2V0YXRtKHBwLDIpKSA8IDApIHsKKwkJcHJpbnRmKCI/U2F2ZWQgd29yZCB0b28gbG9uZ1xuIik7CisJCXJldHVybigtOSk7CisJICAgIH0KKwkgICAgaWYgKHBwW3hdID49IFNQKSB7CisJCWNoYXIgKnAyOworCQlwMiA9IHBwOworCQlwMiArPSB4OworCQl3aGlsZSAoKnAyID09IFNQKSBwMisrOworCQlpZiAoKnAyKSB7CisJCSAgICBucCA9IHAyOworCQkgICAgdW5nd29yZCgpOworCQl9CisJICAgIH0gZWxzZSB7CisJCXVuZ3cgPSAwOworCQljbWZsZ3MgPSBjbWZzYXY7CisJCWRlYnVnKEYwMTAsImd0d29yZCB1bmd3IHJldHVybiBhdG1idWYiLGF0bWJ1ZiwwKTsKKwkgICAgfQorCX0KKwlyZXR1cm4oY21mbGdzKTsKKyNlbHNlCisJLyoKKwkgICBZb3Ugd291bGQgdGhpbmsgdGhlIGZvbGxvd2luZyBzaG91bGQgYmU6CisgICAgICAgICAgICAgd2hpbGUgKCpwcCA9PSBTUCkgcHArKzsKKyAgICAgICAgICAgYnV0IHlvdSB3b3VsZCBiZSB3cm9uZyAtLSBtYWtpbmcgdGhpcyBjaGFuZ2UgYnJlYWtzIEdPVE8uCisgICAgICAgICovCisJd2hpbGUgKCpwcCsrID09IFNQKSA7CisJaWYgKHNldGF0bShwcCwyKSA8IDApIHsKKwkgICAgcHJpbnRmKCI/U2F2ZWQgd29yZCB0b28gbG9uZ1xuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCXVuZ3cgPSAwOworCWNtZmxncyA9IGNtZnNhdjsKKwlkZWJ1ZyhGMDEwLCJndHdvcmQgdW5ndyByZXR1cm4gYXRtYnVmIixhdG1idWYsMCk7CisJcmV0dXJuKGNtZmxncyk7CisjZW5kaWYgLyogTV9VTkdXICovCisgICAgfQorICAgIHBwID0gbnA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIGN1cnJlbnQgZmllbGQgKi8KKworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKwlkZWJ1ZyhGMTEwLCJndHdvcmQgY21kYnVmIixjbWRidWYsMCk7CisJZGVidWcoRjExMCwiZ3R3b3JkIGJwIixicCwwKTsKKwlkZWJ1ZyhGMTEwLCJndHdvcmQgcHAiLHBwLDApOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB7CisJLyogSWYgd2UgYXJlIHJlcGFyc2luZyB3ZSBoYXZlIHRvIHJlY291bnQgYW55IGJyYWNlcyBvciBkb3VibGVxdW90ZXMgKi8KKwljaGFyICogcCA9IHBwOworCWNoYXIgYzsKKwlpZiAoKnAgPT0gJyInKQorCSAgZHErKzsKKwl3aGlsZSAoKGMgPSAqcCsrKSkKKwkgIGlmIChjID09IGxicmFjZSkKKwkgICAgYnJhY2VsdmwrKzsKKwkgIGVsc2UgaWYgKGMgPT0gcmJyYWNlKQorCSAgICBicmFjZWx2bC0tOworCSAgZWxzZSBpZiAoZHEgJiYgYyA9PSAnIicpCisJICAgIGRxbisrOworICAgIH0KKyAgICB3aGlsZSAoYnAgPCBjbWRidWYrQ01EQkwpIHsgICAgICAgICAvKiBCaWcgZ2V0LWEtY2hhcmFjdGVyIGxvb3AgKi8KKwllY2hvZiA9IDA7CQkJLyogQXNzdW1lIHdlIGRvbid0IGVjaG8gYmVjYXVzZSAqLworCWNoc3JjID0gMDsJCQkvKiBjaGFyYWN0ZXIgY2FtZSBmcm9tIHJlcGFyc2UgYnVmLiAqLworI2lmZGVmIEJTX0RJUlNFUAorQ01ESVJQQVJTRToKKyNlbmRpZiAvKiBCU19ESVJTRVAgKi8KKworCWMgPSAqYnA7CisgICAgICAgIGlmICghYykgewkJCS8qIElmIG5vIGNoYXIgd2FpdGluZyBpbiByZXBhcnNlIGJ1ZiAqLworCSAgICBpZiAoZHB4ICYmICghcHVzaGMKKyNpZm5kZWYgTk9TUEwKKwkJCXx8IGFza2ZsYWcKKyNlbmRpZiAvKiBOT1NQTCAqLworCQkJKSkJCS8qIEdldCBmcm9tIHR0eSwgc2V0IGVjaG8gZmxhZyAqLworCSAgICAgIGVjaG9mID0gMTsKKwkgICAgYyA9IGNtZGdldGModGltZWxpbWl0KTsJLyogUmVhZCBhIGNvbW1hbmQgY2hhcmFjdGVyLiAqLworI2lmZGVmIERFQlVHCisJICAgIGRlYnVnKEYxMDEsImd0d29yZCBjIiwiIixjKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisJICAgIGlmICh0aW1lbGltaXQgJiYgYyA8IC0xKSB7CS8qIFRpbWVkIG91dCAqLworCQlyZXR1cm4oLTEwKTsKKwkgICAgfQorCisjaWZuZGVmIE5PWEZFUgorLyoKKyAgVGhlIGZvbGxvd2luZyBhbGxvd3MgcGFja2V0IHJlY29nbml0aW9uIGluIHRoZSBjb21tYW5kIHBhcnNlci4KKyAgUHJlc2VudGx5IGl0IHdvcmtzIG9ubHkgZm9yIEtlcm1pdCBwYWNrZXRzLCBhbmQgaWYgb3VyIGN1cnJlbnQgcHJvdG9jb2wKKyAgaGFwcGVucyB0byBiZSBhbnl0aGluZyBiZXNpZGVzIEtlcm1pdCwgd2Ugc2ltcGx5IGZvcmNlIGl0IHRvIEtlcm1pdC4KKyAgV2UgZG9uJ3QgdXNlIHRoZSBBUEMgbWVjaGFuaXNtIGhlcmUgZm9yIG1lY2hhbmljYWwgcmVhc29ucywgYW5kIGFsc28KKyAgYmVjYXVzZSB0aGlzIHdheSwgaXQgd29ya3MgZXZlbiB3aXRoIG1pbmltYWxseSBjb25maWd1cmVkIGludGVyYWN0aXZlCisgIHZlcnNpb25zLiAgQWRkIFptb2RlbSBsYXRlci4uLgorKi8KKyNpZmRlZiBDS19BVVRPREwKKwkgICAgaWYgKCghbG9jYWwgJiYgY21kYWRsKQkvKiBBdXRvZG93bmxvYWQgZW5hYmxlZD8gKi8KKyNpZmRlZiBJS1NfT1BUSU9OCisJCXx8IFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQKKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisJCSkgeworCQlpbnQgazsKKwkJayA9IGtzdGFydCgoQ0hBUiljKTsJLyogS2VybWl0IFMgb3IgSSBwYWNrZXQ/ICovCisJCWlmIChrKSB7CisJCSAgICBpbnQga3NpZ24gPSAwOworCQkgICAgaWYgKGsgPCAwKSB7CS8qIE1pbnVzLVByb3RvY29sPyAqLworI2lmZGVmIE5PU0VSVkVSCisJCQlnb3RvIG5vc2VydmVyOwkvKiBOZWVkIHNlcnZlciBtb2RlIGZvciB0aGlzICovCisjZWxzZQorCQkJa3NpZ24gPSAxOwkvKiBSZW1lbWJlciAqLworCQkJayA9IDAgLSBrOwkvKiBDb252ZXJ0IHRvIGFjdHVhbCBwcm90b2NvbCAqLworCQkJanVzdG9uZSA9IDE7CS8qIEZsYWcgZm9yIHByb3RvY29sIG1vZHVsZSAqLworI2VuZGlmIC8qIE5PU0VSVkVSICovCisJCSAgICB9IGVsc2UKKwkJICAgICAganVzdG9uZSA9IDA7CisJCSAgICBrLS07CQkvKiBBZGp1c3Qga3N0YXJ0J3MgcmV0dXJuIHZhbHVlICovCisJCSAgICBpZiAoayA9PSBQUk9UT19LKSB7CisJCQlleHRlcm4gaW50IHByb3RvY29sLCBnX3Byb3RvOworCQkJZXh0ZXJuIENIQVIgc3N0YXRlOworCQkJZ19wcm90byA9IHByb3RvY29sOworCQkJcHJvdG9jb2wgPSBQUk9UT19LOyAvKiBDcnVkZS4uLiAqLworCQkJc3N0YXRlID0ga3NpZ24gPyAneCcgOiAndic7CisJCQljbWRidWZbMF0gPSBOVUw7CisJCQlyZXR1cm4oLTMpOworCQkgICAgfQorCQl9CisJICAgIH0KKyNpZmRlZiBOT1NFUlZFUgorCSAgbm9zZXJ2ZXI6CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKyNlbmRpZiAvKiBDS19BVVRPREwgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworCSAgICBjaHNyYyA9IDE7CQkJLyogUmVtZW1iZXIgY2hhcmFjdGVyIHNvdXJjZSBpcyB0dHkuICovCisJICAgIGJya2NoYXIgPSBjOworCisjaWZkZWYgSUtTRAorICAgICAgICAgICAgaWYgKGluc2VydmVyICYmIGMgPCAwKSB7ICAgIC8qIEVuZCBvZiBzZXNzaW9uPyAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImd0d29yZCBjIDwgMCIsImV4aXRpbmciLGMpOworICAgICAgICAgICAgICAgIHJldHVybigtNCk7ICAgICAgICAgICAgIC8qIENsZWFudXAgYW5kIHRlcm1pbmF0ZSAqLworICAgICAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKworI2lmZGVmIE9TMgorICAgICAgICAgICBpZiAoYyA8IDApIHsJCQkvKiBFcnJvciAqLworCSAgICAgICBpZiAoYyA9PSAtMykgewkJLyogRW1wdHkgd29yZD8gKi8KKwkJICAgaWYgKGJsb2NrbHZsID4gMCkJLyogSW4gYSBibG9jayAqLworCQkgICAgIGNvbnRpbnVlOwkJLyogc28ga2VlcCBsb29raW5nIGZvciBibG9jayBlbmQgKi8KKwkJICAgZWxzZQorCQkgICAgIHJldHVybigtMyk7CS8qIE90aGVyd2lzZSBzYXkgd2UgZ290IG5vdGhpbmcgKi8KKwkgICAgICAgfSBlbHNlIHsJCQkvKiBOb3QgZW1wdHkgd29yZCAqLworCQkgICByZXR1cm4oLTQpOwkJLyogU28gc29tZSBraW5kIG9mIGkvbyBlcnJvciAqLworCSAgICAgICB9CisgICAgICAgICAgIH0KKyNlbHNlCisjaWZkZWYgTUFDCisJICAgaWYgKGMgPT0gLTMpCQkJLyogRW1wdHkgd29yZC4uLiAqLworCSAgICAgaWYgKGJsb2NrbHZsID4gMCkKKwkgICAgICAgY29udGludWU7CisJICAgICBlbHNlCisJICAgICAgIHJldHVybigtMyk7CisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogT1MyICovCisJICAgaWYgKGMgPT0gRU9GKSB7CQkvKiBUaGlzIGNhbiBoYXBwZW4gaWYgc3RkaW4gbm90IHR0eS4gKi8KKyNpZmRlZiBFSU5UUgorLyoKKyAgU29tZSBvcGVyYXRpbmcgYW5kL29yIEMgcnVudGltZSBzeXN0ZW1zIHJldHVybiBFSU5UUiBmb3Igbm8gZ29vZCByZWFzb24sCisgIHdoZW4gdGhlIGVuZCBvZiB0aGUgc3RhbmRhcmQgaW5wdXQgImZpbGUiIGlzIGVuY291bnRlcmVkLiAgSW4gY2FzZXMgbGlrZQorICB0aGlzLCB3ZSBnZXQgaW50byBhbiBpbmZpbml0ZSBsb29wOyBoZW5jZSB0aGUgZWludHIgY291bnRlciwgd2hpY2ggaXMgcmVzZXQKKyAgdG8gMCB1cG9uIGVhY2ggY2FsbCB0byB0aGlzIHJvdXRpbmUuCisqLworCQlkZWJ1ZyhGMTAxLCJndHdvcmQgRU9GIiwiIixlcnJubyk7CisJCWlmIChlcnJubyA9PSBFSU5UUiAmJiArK2VpbnRyIDwgNCkgLyogV2hlbiBiZydkIHByb2Nlc3MgaXMgKi8KKwkJICBjb250aW51ZTsJCS8qIGZnJ2QgYWdhaW4uICovCisjZW5kaWYgLyogRUlOVFIgKi8KKwkJcmV0dXJuKC00KTsKKwkgICAgfQorCSAgICBjICY9IGNtZG1zazsJCS8qIFN0cmlwIGFueSBwYXJpdHkgYml0ICovCisJfQkJCQkvKiBpZiBkZXNpcmVkLiAqLworCisvKiBOb3cgd2UgaGF2ZSB0aGUgbmV4dCBjaGFyYWN0ZXIgKi8KKworCWlzZXNjID0gKGMgPT0gRVNDKTsJCS8qIEEgcmVhbCBFU0M/ICovCisKKwlpZiAoIWZpcnN0bmIgJiYgYyA+IFNQKSB7CS8qIEZpcnN0IG5vbmJsYW5rICovCisJICAgIGZpcnN0bmIgPSBjOworCSAgICBpZiAoYyA9PSAnIicpCQkvKiBTdGFydHMgd2l0aCBkb3VibGVxdW90ZSAqLworCSAgICAgIGRxID0gMTsKKwl9CisJaWYgKGMgPT0gJyInKQkJCS8qIENvdW50IGRvdWJsZXF1b3RlcyAqLworCSAgZHFuKys7CisKKwlpZiAocXVvdGUgJiYgKGMgPT0gQ1IgfHwgYyA9PSBMRikpIHsgLyogRW50ZXIga2V5IGZvbGxvd2luZyBxdW90ZSAqLworCSAgICAqYnArKyA9IENNRFE7CQkvKiBEb3VibGUgaXQgKi8KKwkgICAgKmJwID0gTlVMOworCSAgICBxdW90ZSA9IDA7CisJfQorICAgICAgICBpZiAocXVvdGUgPT0gMCkgewkJLyogSWYgdGhpcyBpcyBub3QgYSBxdW90ZWQgY2hhcmFjdGVyICovCisJICAgIHN3aXRjaCAoYykgeworCSAgICAgIGNhc2UgQ01EUToJCS8qIEdvdCB0aGUgcXVvdGUgY2hhcmFjdGVyIGl0c2VsZiAqLworCQlpZiAoIWNvbW1lbnQgJiYgcXVvdGluZykKKwkJICBxdW90ZSA9IDE7CQkvKiBGbGFnIGl0IGlmIG5vdCBpbiBhIGNvbW1lbnQgKi8KKwkJYnJlYWs7CisJICAgICAgY2FzZSBGRjoJCQkvKiBGb3JtZmVlZC4gKi8KKyAgICAgICAgICAgICAgICBjID0gTkw7ICAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIHdpdGggbmV3bGluZSAqLworCQljbWRjbHJzY24oKTsJCS8qIENsZWFyIHRoZSBzY3JlZW4gKi8KKwkJYnJlYWs7CisJICAgICAgY2FzZSBIVDoJCQkvKiBIb3Jpem9udGFsIFRhYiAqLworCQlpZiAoY29tbWVudCkJCS8qIElmIGluIGNvbW1lbnQsICovCisJCSAgYyA9IFNQOwkJLyogc3Vic3RpdHV0ZSBzcGFjZSAqLworCQllbHNlCQkJLyogb3RoZXJ3aXNlICovCisJCSAgYyA9IEVTQzsJCS8qIHN1YnN0aXR1dGUgRVNDIChmb3IgY29tcGxldGlvbikgKi8KKwkJYnJlYWs7CisJICAgICAgY2FzZSAnOyc6CQkJLyogVHJhaWxpbmcgY29tbWVudCAqLworCSAgICAgIGNhc2UgJyMnOgorCQlpZiAoaW53b3JkID09IDAgJiYgcXVvdGluZykgeyAvKiBJZiBub3QgaW4gYSB3b3JkICovCisJCSAgICBjb21tZW50ID0gMTsJLyogc3RhcnQgYSBjb21tZW50LiAqLworCQkgICAgY3AgPSBicDsJCS8qIHJlbWVtYmVyIHdoZXJlIGl0IHN0YXJ0cy4gKi8KKwkJfQorCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoIWtzdGFydGFjdGl2ZSAmJgkvKiBOb3QgaW4gcG9zc2libGUgS2VybWl0IHBhY2tldCAqLworCQkhY29tbWVudCAmJiBjID09IFNQKSB7CS8qIFNwYWNlIG5vdCBpbiBjb21tZW50ICovCisgICAgICAgICAgICAgICAgKmJwKysgPSAoY2hhcikgYzsJLyogZGVwb3NpdCBpbiBidWZmZXIgaWYgbm90IGFscmVhZHkgKi8KKwkJLyogZGVidWcoRjEwMSwiZ3R3b3JkIGVjaG9mIDIiLCIiLGVjaG9mKTsgKi8KKyNpZmRlZiBCRUJPWAorICAgICAgICAgICAgICAgIGlmIChlY2hvZikgeworICAgICAgICAgICAgICAgICAgICBwdXRjaGFyKGMpOwkJLyogZWNobyBpdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgaWYgKGVjaG9mKSB7CQkvKiBlY2hvIGl0LiAqLworCQkgICAgcHV0Y2hhcigoQ0hBUiljKTsKKwkJICAgIGlmICh0aW1lbGltaXQpCisJCSAgICAgIGZmbHVzaChzdGRvdXQpOworCQl9CisjZW5kaWYgLyogQkVCT1ggKi8KKyAgICAgICAgICAgICAgICBpZiAoaW53b3JkID09IDApIHsgICAgICAvKiBJZiBsZWFkaW5nLCBnb2JibGUgaXQuICovCisgICAgICAgICAgICAgICAgICAgIHBwKys7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIElmIHRlcm1pbmF0aW5nLCByZXR1cm4uICovCisJCSAgICBpZiAoKCFkcSAmJiAoKCpwcCAhPSBsYnJhY2UpIHx8IChicmFjZWx2bCA9PSAwKSkpIHx8CisJCQkoZHEgJiYgZHFuID4gMSAmJiAqKGJwLTIpID09ICciJykpIHsKKwkJCW5wID0gYnA7CisJCQljbWJwdHIgPSBucDsKKwkJCWlmIChzZXRhdG0ocHAsMCkgPCAwKSB7CisJCQkgICAgcHJpbnRmKCI/RmllbGQgdG9vIGxvbmcgZXJyb3IgMVxuIik7CisJCQkgICAgZGVidWcoRjExMSwiZ3R3b3JkIHRvbyBsb25nICMxIixwcCxzdHJsZW4ocHApKTsKKwkJCSAgICByZXR1cm4oLTkpOworCQkJfQorCQkJYnJrY2hhciA9IGM7CisJCQlpbndvcmQgPSBjbWZsZ3MgPSAwOworCQkJcmV0dXJuKDApOworCQkgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyA9PSBsYnJhY2UpIHsKKwkJYnJhY2VsdmwrKzsKKwkJLyogZGVidWcoRjEwMSwiZ3R3b3JkIGJyYWNlbHZsKysiLCIiLGJyYWNlbHZsKTsgKi8KKwkgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gcmJyYWNlICYmIGJyYWNlbHZsID4gMCkgeworICAgICAgICAgICAgICAgIGJyYWNlbHZsLS07CisJCS8qIGRlYnVnKEYxMDEsImd0d29yZCBicmFjZWx2bC0tIiwiIixicmFjZWx2bCk7ICovCisgICAgICAgICAgICAgICAgaWYgKGxpbmViZWdpbikKKwkJICBibG9ja2x2bC0tOworICAgICAgICAgICAgfQorCSAgICBpZiAoKGMgPT0gJz0nIHx8IGMgPT0gJzonKSAmJgorCQkha3N0YXJ0YWN0aXZlICYmICFjb21tZW50ICYmIGJyayAmJiAoZmlyc3RuYiA9PSAnLycpCisJCSkgeworICAgICAgICAgICAgICAgICpicCsrID0gKGNoYXIpIGM7CS8qIFN3aXRjaCBhcmd1bWVudCBzZXBhcmF0b3IgKi8KKwkJLyogZGVidWcoRjExMSwiZ3R3b3JkIHN3aXRjaCBhcmdzZXAiLGNtZGJ1ZixicmspOyAqLworI2lmZGVmIEJFQk9YCisgICAgICAgICAgICAgICAgaWYgKGVjaG9mKSB7CisgICAgICAgICAgICAgICAgICAgIHB1dGNoYXIoYyk7CQkvKiBFY2hvIGl0LiAqLworICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKwkJaWYgKGVjaG9mKSB7CisJCSAgICBwdXRjaGFyKChDSEFSKWMpOworCQkgICAgaWYgKHRpbWVsaW1pdCkKKwkJICAgICAgZmZsdXNoKHN0ZG91dCk7CisJCX0KKyNlbmRpZiAvKiBCRUJPWCAqLworCQlpZiAoKCpwcCAhPSBsYnJhY2UpIHx8IChicmFjZWx2bCA9PSAwKSkgeworCQkgICAgbnAgPSBicDsKKwkJICAgIGNtYnB0ciA9IG5wOworCQkgICAgaWYgKHNldGF0bShwcCwwKSA8IDApIHsKKwkJCXByaW50ZigiP0ZpZWxkIHRvbyBsb25nIGVycm9yIDFcbiIpOworCQkJZGVidWcoRjExMSwiZ3R3b3JkIHRvbyBsb25nICMxIixwcCxzdHJsZW4ocHApKTsKKwkJCXJldHVybigtOSk7CisJCSAgICB9CisJCSAgICBpbndvcmQgPSBjbWZsZ3MgPSAwOworCQkgICAgYnJrY2hhciA9IGM7CisJCSAgICByZXR1cm4oNCk7CisJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09IExGIHx8IGMgPT0gQ1IpIHsJLyogQ1Igb3IgTEYuICovCisJCWlmIChlY2hvZikgeworICAgICAgICAgICAgICAgICAgICBjbWRuZXdsKChjaGFyKWMpOwkvKiBlY2hvIGl0LiAqLworI2lmZGVmIEJFQk9YCisgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKKyNlbmRpZiAvKiBCRUJPWCAqLworICAgICAgICAgICAgICAgIH0KKwkJeworCQkgICAgLyogVHJpbSB0cmFpbGluZyBjb21tZW50IGFuZCB3aGl0ZXNwYWNlICovCisJCSAgICBjaGFyICpxcTsKKwkJICAgIGlmIChjb21tZW50KSB7CS8qIEVyYXNlIGNvbW1lbnQgKi8KKwkJCXdoaWxlIChicCA+PSBjcCkgLyogQmFjayB0byBjb21tZW50IHBvaW50ZXIgKi8KKwkJCSAgKmJwLS0gPSBOVUw7CisJCQlicCsrOworCQkJcHAgPSBicDsJLyogQWRqdXN0IG90aGVyIHBvaW50ZXJzICovCisJCQlpbndvcmQgPSAwOwkvKiBhbmQgZmxhZ3MgKi8KKwkJCWNvbW1lbnQgPSAwOworCQkJY3AgPSBOVUxMOworCQkgICAgfQorCQkgICAgcXEgPSBpbndvcmQgPyBwcCA6IChjaGFyICopY21kYnVmOworCQkgICAgLyogRXJhc2UgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCQkgICAgd2hpbGUgKGJwID4gcXEgJiYgKCooYnAtMSkgPT0gU1AgfHwgKihicC0xKSA9PSBIVCkpIHsKKwkJCWJwLS07CisJCQkvKiBkZWJ1ZyhGMDAwLCJlcmFzaW5nIiwiIiwqYnApOyAqLworCQkJKmJwID0gTlVMOworCQkgICAgfQorCQkgICAgbGFzdGNoYXIgPSAoYnAgPiBxcSkgPyAqKGJwLTEpIDogTlVMOworCQkgICAgcHJldmNoYXIgPSAoYnAgPiBxcSsxKSA/ICooYnAtMikgOiBOVUw7CisJCX0KKwkJaWYgKGxpbmViZWdpbiAmJiBibG9ja2x2bCA+IDApIC8qIEJsYW5rIGxpbmUgaW4gey4uLn0gYmxvY2sgKi8KKwkJICBjb250aW51ZTsKKworCQlsaW5lYmVnaW4gPSAxOwkJLyogQXQgYmVnaW5uaW5nIG9mIG5leHQgbGluZSAqLworCQlpc2NvbnRkID0gcHJldmNoYXIgIT0gQ01EUSAmJgorCQkgIChsYXN0Y2hhciA9PSAnLScgfHwgbGFzdGNoYXIgPT0gbGJyYWNlKTsKKwkJZGVidWcoRjEwMSwiZ3R3b3JkIGlzY29udGQiLCIiLGlzY29udGQpOworCisgICAgICAgICAgICAgICAgaWYgKGlzY29udGQpIHsJCS8qIElmIGxpbmUgaXMgY29udGludWVkLi4uICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjaHNyYykgewkvKiBJZiByZWFkaW5nIGZyb20gdHR5LCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCooYnAtMSkgPT0gbGJyYWNlKSB7IC8qIENoZWNrIGZvciAiYmVnaW4gYmxvY2siICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJwKysgPSBTUDsJLyogSW5zZXJ0IGEgc3BhY2UgZm9yIG5lYXRuZXNzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tsdmwrKzsJLyogQ291bnQgYmxvY2sgbmVzdGluZyBsZXZlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsJLyogT3IgaHlwaGVuICovCisJCQkgICAgYnAtLTsJLyogT3ZlcndyaXRlIHRoZSBoeXBoZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICpicCA9IE5VTDsJLyogZXJhc2UgdGhlIGRhc2gsICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsJLyogYW5kIGdvIGJhY2sgZm9yIG5leHQgY2hhciBub3cuICovCisgICAgICAgICAgICAgICAgICAgIH0KKwkJfSBlbHNlIGlmIChibG9ja2x2bCA+IDApIHsgLyogTm8gY29udGludWF0aW9uIGNoYXJhY3RlciAqLworCQkgICAgaWYgKGNoc3JjKSB7CS8qIEJ1dCB3ZSdyZSBpbiBhICJibG9jayIgKi8KKwkJCSpicCsrID0gJywnOwkvKiBBZGQgY29tbWEgKi8KKwkJCSpicCA9IE5VTDsKKwkJCWNvbnRpbnVlOworCQkgICAgfQorCQl9IGVsc2UgewkJLyogTm8gY29udGludWF0aW9uLCBlbmQgb2YgY29tbWFuZC4gKi8KKwkJICAgICpicCA9IE5VTDsJCS8qIFRlcm1pbmF0ZSB0aGUgY29tbWFuZCBzdHJpbmcuICovCisJCSAgICBpZiAoY29tbWVudCkgewkvKiBJZiB3ZSdyZSBpbiBhIGNvbW1lbnQsICovCisJCQljb21tZW50ID0gMDsJLyogU2F5IHdlJ3JlIG5vdCBhbnkgbW9yZSwgKi8KKwkJCSpjcCA9IE5VTDsJLyogY3V0IGl0IG9mZi4gKi8KKwkJICAgIH0KKwkJICAgIG5wID0gYnA7CQkvKiBXaGVyZSB0byBzdGFydCBuZXh0IGZpZWxkLiAqLworCQkgICAgY21icHRyID0gbnA7CisJCSAgICBpZiAoc2V0YXRtKHBwLDApIDwgMCkgeyAvKiBDb3B5IGZpZWxkIHRvIGF0b20gYnVmZmVyICovCisJCQlkZWJ1ZyhGMTExLCJndHdvcmQgdG9vIGxvbmcgIzIiLHBwLHN0cmxlbihwcCkpOworCQkJcHJpbnRmKCI/RmllbGQgdG9vIGxvbmcgZXJyb3IgMlxuIik7CisJCQlyZXR1cm4oLTkpOworCQkgICAgfQorCQkgICAgaW53b3JkID0gMDsJCS8qIE5vdCBpbiBhIHdvcmQgYW55IG1vcmUuICovCisJCSAgICBjcmZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICAvKiBkZWJ1ZyhGMTEwLCJndHdvcmQiLCJjcmZsYWcgaXMgc2V0IiwwKTsgKi8KKyNpZmRlZiBDS19SRUNBTEwKKwkJICAgIGN1cnJlbnQgPSBybGFzdDsKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKwkJICAgIGNtZmxncyA9IDE7CisJCSAgICBpZiAoIXhjbWRzcmMKKyNpZmRlZiBDS19SRUNBTEwKKwkJCXx8IGZvcmNlX2FkZAorI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworCQkJKQorICAJCSAgICAgIGFkZGNtZChjbWRidWYpOworCQkgICAgcmV0dXJuKGNtZmxncyk7CisJCX0KKyAgICAgICAgICAgIH0KKy8qCisgIFRoaXMgc2VjdGlvbiBoYW5kbGVzIGludGVyYWN0aXZlIGhlbHAsIGNvbXBsZXRpb24sIGVkaXRpbmcsIGFuZCBoaXN0b3J5LgorICBSZWFycmFuZ2VkIGFzIGEgc3dpdGNoIHN0YXRlbWVudCBleGVjdXRlZCBvbmx5IGlmIHdlJ3JlIGF0IHRvcCBsZXZlbCBzaW5jZQorICB0aGVyZSBpcyBubyBuZWVkIGZvciBhbnkgb2YgdGhpcyB3aXRoaW4gY29tbWFuZCBmaWxlcyBhbmQgbWFjcm9zOiBBdWcgMjAwMC4KKyAgSnVuIDIwMDE6IEV2ZW4gaWYgYXQgdG9wIGxldmVsLCBza2lwIHRoaXMgaWYgdGhlIGNoYXJhY3RlciB3YXMgZmV0Y2hlZCBmcm9tCisgIHRoZSByZXBhcnNlIG9yIHJlY2FsbCBidWZmZXIsIG9yIGlmIHN0ZGluIGlzIHJlZGlyZWN0ZWQuCisqLworCSAgICBpZiAoKHhjbWRzcmMgPT0gMAkJLyogT25seSBhdCB0b3AgbGV2ZWwgKi8KKyNpZm5kZWYgTk9TUEwKKwkJfHwgYXNrZmxhZwkJLyogb3IgdXNlciBpcyB0eXBpbmcgQVNLIHJlc3BvbnNlICovCisjZW5kaWYgLyogTk9TUEwgKi8KKwkJICkgJiYgY2hzcmMgIT0gMCAmJiByZWFsdHR5KSB7IC8qIGZyb20gdGhlIHJlYWwga2V5Ym9hcmQgKi8KKworLyogVXNlIEFOU0kgLyBWVDEwMCB1cCBhbmQgZG93biBhcnJvdyBrZXlzIGZvciBjb21tYW5kIHJlY2FsbC4gICovCisKKwkJaWYgKGlzZXNjICYmICgKKyNpZmRlZiBJS1NECisJCSAgICBpbnNlcnZlcgorI2Vsc2UKKwkJICAgIDAKKyNlbmRpZiAvKiBJS1NEICovCisjaWZkZWYgVVNFX0FSUk9XS0VZUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgMQorI2VuZGlmIC8qIFVTRV9BUlJPV0tFWVMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgKSB7CQkvKiBBIHJlYWwgRVNDIHdhcyB0eXBlZCAqLworCQkgICAgaW50IHg7CisJCSAgICBtc2xlZXAoMjAwKTsJLyogV2FpdCAxLzUgc2VjICovCisJCSAgICB4ID0gY21kY29uY2hrKCk7CS8qIFdhcyBpdCBmb2xsb3dlZCBieSBhbnl0aGluZz8gKi8KKwkJICAgIGRlYnVnKEYxMDEsIkFycm93a2V5IEVTQyBjbWRjb25jaGsiLCIiLHgpOworCisJCSAgICBpZiAoeCA+IDEpIHsJLyogSWYgZm9sbG93ZWQgYnkgYXQgbGVhc3QgMiBjaGFycyAqLworCQkJaW50IGMyOworCQkJYzIgPSBjbWRnZXRjKDApOyAvKiBHZXQgdGhlIGZpcnN0IG9uZSAqLworCQkJZGVidWcoRjEwMSwiQXJyb3drZXkgRVNDIGMyIiwiIixjMik7CisKKwkJCWlmIChjMiAhPSAnWycgJiYgYzIgIT0gJ08nKSB7IC8qIElmIG5vdCBbIG9yIE8gKi8KKwkJCSAgICBwdXNoYyA9IGMyOwkvKiBQdXNoIGl0IGFuZCB0YWtlIHRoZSBFU0Mgc29sbyAqLworCQkJfSBlbHNlIHsKKwkJCSAgICBjMiA9IGNtZGdldGMoMCk7IC8qIEdldCB0aGUgc2Vjb25kIG9uZSAqLworCQkJICAgIGRlYnVnKEYxMDEsIkFycm93a2V5IEVTQyBjMyIsIiIsYzIpOworCQkJICAgIHN3aXRjaCAoYzIpIHsKKyNpZm5kZWYgTk9SRUNBTEwKKwkJCSAgICAgIGNhc2UgJ0EnOgkvKiBVcCAqLworCQkJCWMgPSBCRUw7CisJCQkJYyA9IENfVVA7CisJCQkJYnJlYWs7CisJCQkgICAgICBjYXNlICdCJzoJLyogRG93biAqLworCQkJCWMgPSBCRUw7CisJCQkJYyA9IENfRE47CisJCQkJYnJlYWs7CisJCQkgICAgICBjYXNlICdDJzoJLyogUmlnaHQgKi8KKwkJCSAgICAgIGNhc2UgJ0QnOgkvKiBMZWZ0ICovCisjZWxzZQorCQkJICAgICAgZGVmYXVsdDoKKyNlbmRpZiAvKiBOT1JFQ0FMTCAqLworCQkJCWMgPSBCRUw7IC8qIFdlIGRvbid0IHVzZSB0aGVzZSB5ZXQgKi8KKwkJCQlicmVhazsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCX0KKworCQlzd2l0Y2ggKGMpIHsKKwkJICBjYXNlICc/JzoJCS8qID8tSGVscCAqLworI2lmbmRlZiBOT1NQTAorCQkgICAgaWYgKGFza2ZsYWcpCS8qIE5vIGhlbHAgaW4gQVNLIHJlc3BvbnNlICovCisJCSAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PU1BMICovCisJCSAgICBpZiAocXVvdGluZworCQkJJiYgIWtzdGFydGFjdGl2ZQorCQkJJiYgIWNvbW1lbnQKKwkJCSkgeworCQkJcHV0Y2hhcigoQ0hBUiljKTsKKwkJCSpicCA9IE5VTDsKKwkJCWlmIChzZXRhdG0ocHAsMCkgPCAwKSB7CisJCQkgICAgZGVidWcoRjExMSwiZ3R3b3JkIHRvbyBsb25nID8iLHBwLHN0cmxlbihwcCkpOworCQkJICAgIHByaW50ZigiP1RvbyBsb25nXG4iKTsKKwkJCSAgICByZXR1cm4oLTkpOworCQkJfQorCQkJcW1mbGFnID0gMTsKKwkJCXJldHVybihjbWZsZ3MgPSAzKTsKKwkJICAgIH0KKworCQkgIGNhc2UgRVNDOgkJLyogRXNjIG9yIFRhYiBjb21wbGV0aW9uICovCisJCSAgICBpZiAoIWNvbW1lbnQpIHsKKwkJCSpicCA9IE5VTDsKKwkJCWlmIChzZXRhdG0ocHAsMCkgPCAwKSB7CisJCQkgICAgZGVidWcoRjExMSwiZ3R3b3JkIHRvbyBsb25nIEVzYyIscHAsc3RybGVuKHBwKSk7CisJCQkgICAgcHJpbnRmKCI/VG9vIGxvbmdcbiIpOworCQkJICAgIHJldHVybigtOSk7CisJCQl9CisJCQllc2ZsYWcgPSAxOworCQkJcmV0dXJuKGNtZmxncyA9IDIpOworCQkgICAgfSBlbHNlIHsKKwkJCWJsZWVwKEJQX1dBUk4pOworCQkJY29udGludWU7CisJCSAgICB9CisKKwkJICBjYXNlIEJTOgkJLyogQ2hhcmFjdGVyIGRlbGV0aW9uICovCisJCSAgY2FzZSBSVUI6CisJCSAgICBpZiAoYnAgPiBjbWRidWYpIHsJLyogSWYgc3RpbGwgaW4gYnVmZmVyLi4uICovCisJCQljbWRjaGFyZGVsKCk7CS8qIGVyYXNlIGl0LiAqLworCQkJYnAtLTsJCS8qIHBvaW50IGJlaGluZCBpdCwgKi8KKwkJCWlmICgqYnAgPT0gbGJyYWNlKSBicmFjZWx2bC0tOyAvKiBBZGp1c3QgYnJhY2UgY291bnQgKi8KKwkJCWlmICgqYnAgPT0gcmJyYWNlKSBicmFjZWx2bCsrOworCQkJaWYgKCgqYnAgPT0gU1ApICYmIC8qIEZsYWcgaWYgY3VycmVudCBmaWVsZCBnb25lICovCisJCQkgICAgKCpwcCAhPSBsYnJhY2UgfHwgYnJhY2VsdmwgPT0gMCkpCisJCQkgIGlud29yZCA9IDA7CisJCQkqYnAgPSBOVUw7CS8qIEVyYXNlIGNoYXJhY3RlciBmcm9tIGJ1ZmZlci4gKi8KKwkJICAgIH0gZWxzZSB7CQkvKiBPdGhlcndpc2UsICovCisJCQlibGVlcChCUF9XQVJOKTsKKwkJCWNtcmVzKCk7CS8qIGFuZCBzdGFydCBwYXJzaW5nIGEgbmV3IGNvbW1hbmQuICovCisJCQkqYnAgPSAqYXRtYnVmID0gTlVMOworCQkgICAgfQorCQkgICAgaWYgKHBwIDwgYnApCisJCSAgICAgIGNvbnRpbnVlOworCQkgICAgZWxzZQorCQkgICAgICByZXR1cm4oY21mbGdzID0gLTEpOworCisJCSAgY2FzZSBMREVMOgkJLyogXlUsIGxpbmUgZGVsZXRpb24gKi8KKwkJICAgIHdoaWxlICgoYnAtLSkgPiBjbWRidWYpIHsKKwkJCWNtZGNoYXJkZWwoKTsKKwkJCSpicCA9IE5VTDsKKwkJICAgIH0KKwkJICAgIGNtcmVzKCk7CQkvKiBSZXN0YXJ0IHRoZSBjb21tYW5kLiAqLworCQkgICAgKmJwID0gKmF0bWJ1ZiA9IE5VTDsKKwkJICAgIGlud29yZCA9IDA7CisJCSAgICByZXR1cm4oY21mbGdzID0gLTEpOworCisJCSAgY2FzZSBXREVMOgkJLyogXlcsIHdvcmQgZGVsZXRpb24gKi8KKwkJICAgIGlmIChicCA8PSBjbWRidWYpIHsJLyogQmVlcCBpZiBub3RoaW5nIHRvIGRlbGV0ZSAqLworCQkJYmxlZXAoQlBfV0FSTik7CisJCQljbXJlcygpOworCQkJKmJwID0gKmF0bWJ1ZiA9IE5VTDsKKwkJCXJldHVybihjbWZsZ3MgPSAtMSk7CisJCSAgICB9CisJCSAgICBicC0tOworCQkgICAgLyogQmFjayB1cCBvdmVyIGFueSB0cmFpbGluZyBub25hbHBoYW51bXMgKi8KKwkJICAgIC8qIFRoaXMgaXMgZGVwZW5kZW50IG9uIEFTQ0lJIGNvbGxhdGluZyBzZXF1ZW5jZSAqLworCQkgICAgLyogYnV0IGlzYWxwaGFudW0oKSBpcyBub3QgYXZhaWxhYmxlIGV2ZXJ5d2hlcmUuICovCisJCSAgICBmb3IgKCA7CisJCQkgKGJwID49IGNtZGJ1ZikgJiYKKwkJCSAoKCpicCA8ICcwJykgfHwKKwkJCSAoKCpicCA+ICc5JykgJiYgKCpicCA8ICdAJykpIHx8CisJCQkgKCgqYnAgPiAnWicpICYmICgqYnAgPCAnYScpKSB8fAorCQkJICgqYnAgPiAneicpKTsKKwkJCSBicC0tCisJCQkgKSB7CisJCQljbWRjaGFyZGVsKCk7CisJCQkqYnAgPSBOVUw7CisJCSAgICB9CisJCSAgICAvKiBOb3cgZGVsZXRlIGJhY2sgdG8gcmlnaHRtb3N0IHJlbWFpbmluZyBub25hbHBoYW51bSAqLworCQkgICAgZm9yICggOyAoYnAgPj0gY21kYnVmKSAmJiAoKmJwKSA7IGJwLS0pIHsKKwkJCWlmICgoKmJwIDwgJzAnKSB8fAorCQkJICAgICgqYnAgPiAnOScgJiYgKmJwIDwgJ0AnKSB8fAorCQkJICAgICgqYnAgPiAnWicgJiYgKmJwIDwgJ2EnKSB8fAorCQkJICAgICgqYnAgPiAneicpKQorCQkJICBicmVhazsKKwkJCWNtZGNoYXJkZWwoKTsKKwkJCSpicCA9IE5VTDsKKwkJICAgIH0KKwkJICAgIGJwKys7CisJCSAgICBpbndvcmQgPSAwOworCQkgICAgcmV0dXJuKGNtZmxncyA9IC0xKTsKKworCQkgIGNhc2UgUkRJUzogewkJLyogXlIsIHJlZGlzcGxheSAqLworCQkgICAgICBjaGFyICpjcHg7IGNoYXIgY3g7CisJCSAgICAgICpicCA9IE5VTDsKKwkJICAgICAgcHJpbnRmKCJcbiVzIixjbXByb20pOworCQkgICAgICBjcHggPSBjbWRidWY7CisJCSAgICAgIHdoaWxlICgoY3ggPSAqY3B4KyspKSB7CisjaWZkZWYgaXNwcmludAorCQkJICBwdXRjaGFyKChDSEFSKSAoaXNwcmludChjeCkgPyBjeCA6ICdeJykpOworI2Vsc2UKKwkJCSAgcHV0Y2hhcigoQ0hBUikgKChjeCA+PSBTUCAmJiBjeCA8IERFTCkgPyBjeCA6ICdeJykpOworI2VuZGlmIC8qIGlzcHJpbnQgKi8KKwkJICAgICAgfQorCQkgICAgICBmZmx1c2goc3Rkb3V0KTsKKwkJICAgICAgY29udGludWU7CisJCSAgfQorCQl9CisKKworI2lmZGVmIENLX1JFQ0FMTAorCQlpZiAob25fcmVjYWxsICYmCS8qIFJlYWRpbmcgY29tbWFuZHMgZnJvbSBrZXlib2FyZD8gKi8KKwkJICAgIChjbV9yZWNhbGwgPiAwKSAmJgkvKiBTYXZpbmcgY29tbWFuZHM/ICovCisJCSAgICAoYyA9PSBDX1VQIHx8IGMgPT0gQ19VUDIpKSB7IC8qIEdvIHVwIG9uZSAqLworCQkgICAgaWYgKGxhc3RfcmVjYWxsID09IDIgJiYgY3VycmVudCA+IDApCisJCSAgICAgIGN1cnJlbnQtLTsKKwkJICAgIGlmIChjdXJyZW50IDwgMCkgewkvKiBOb3doZXJlIHRvIGdvLCAqLworCQkJYmxlZXAoQlBfV0FSTik7CisJCQljb250aW51ZTsKKwkJICAgIH0KKwkJICAgIGlmIChyZWNhbGxbY3VycmVudF0pIHsgLyogV2UgaGF2ZSBhIHByZXZpb3VzIGNvbW1hbmQgKi8KKwkJCXdoaWxlICgoYnAtLSkgPiBjbWRidWYpIHsgLyogRXJhc2UgY3VycmVudCBsaW5lICovCisJCQkgICAgY21kY2hhcmRlbCgpOworCQkJICAgICpicCA9IE5VTDsKKwkJCX0KKwkJCWNrc3RybmNweShjbWRidWYscmVjYWxsW2N1cnJlbnRdLENNREJMKTsKKyNpZmRlZiBPU0sKKwkJCWZmbHVzaChzdGRvdXQpOworCQkJd3JpdGUoZmlsZW5vKHN0ZG91dCksICJcciIsIDEpOworCQkJcHJpbnRmKCIlcyVzIixjbXByb20sY21kYnVmKTsKKyNlbHNlCisJCQlwcmludGYoIlxyJXMlcyIsY21wcm9tLGNtZGJ1Zik7CisjZW5kaWYgLyogT1NLICovCisJCQljdXJyZW50LS07CisJCSAgICB9CisJCSAgICBsYXN0X3JlY2FsbCA9IDE7CisJCSAgICByZXR1cm4oY21mbGdzID0gLTEpOyAvKiBGb3JjZSBhIHJlcGFyc2UgKi8KKwkJfQorCQlpZiAob25fcmVjYWxsICYmCS8qIFJlYWRpbmcgY29tbWFuZHMgZnJvbSBrZXlib2FyZD8gKi8KKwkJICAgIChjbV9yZWNhbGwgPiAwKSAmJgkvKiBTYXZpbmcgY29tbWFuZHM/ICovCisJCSAgICAoYyA9PSBDX0ROKSkgewkvKiBEb3duIG9uZSAqLworCQkgICAgaW50IHggPSAxOworCQkgICAgaWYgKGxhc3RfcmVjYWxsID09IDEpCisJCSAgICAgIHgrKzsKKwkJICAgIGlmIChjdXJyZW50ICsgeCA+IHJsYXN0KSB7IC8qIEFscmVhZHkgYXQgYm90dG9tLCBiZWVwICovCisJCQlibGVlcChCUF9XQVJOKTsKKwkJCWNvbnRpbnVlOworCQkgICAgfQorCQkgICAgY3VycmVudCArPSB4OwkvKiBPSyB0byBnbyBkb3duICovCisJCSAgICBpZiAocmVjYWxsW2N1cnJlbnRdKSB7CisJCQl3aGlsZSAoKGJwLS0pID4gY21kYnVmKSB7IC8qIEVyYXNlIGN1cnJlbnQgbGluZSAqLworCQkJICAgIGNtZGNoYXJkZWwoKTsKKwkJCSAgICAqYnAgPSBOVUw7CisJCQl9CisJCQlja3N0cm5jcHkoY21kYnVmLHJlY2FsbFtjdXJyZW50XSxDTURCTCk7CisjaWZkZWYgT1NLCisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCXdyaXRlKGZpbGVubyhzdGRvdXQpLCAiXHIiLCAxKTsKKwkJCXByaW50ZigiJXMlcyIsY21wcm9tLGNtZGJ1Zik7CisjZWxzZQorCQkJcHJpbnRmKCJcciVzJXMiLGNtcHJvbSxjbWRidWYpOworI2VuZGlmIC8qIE9TSyAqLworCQkJbGFzdF9yZWNhbGwgPSAyOworCQkJcmV0dXJuKGNtZmxncyA9IC0xKTsgLyogRm9yY2UgcmVwYXJzZSAqLworCQkgICAgfQorCQl9CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisJICAgIH0KKworCSAgICBpZiAoYyA8IFNQICYmIHF1b3RlID09IDApIHsgLyogQW55IG90aGVyIHVucXVvdGVkIGNvbnRyb2wgY2hhciAqLworCQlpZiAoIWNoc3JjKSB7CQkvKiBJZiBjbWQgZmlsZSwgcG9pbnQgcGFzdCBpdCAqLworCQkgICAgYnArKzsKKwkJfSBlbHNlIHsKKwkJICAgIGJsZWVwKEJQX1dBUk4pOworCQl9CisJCWNvbnRpbnVlOwkJLyogY29udGludWUsIGRvbid0IHB1dCBpbiBidWZmZXIgKi8KKwkgICAgfQorCSAgICBsaW5lYmVnaW4gPSAwOwkJLyogTm90IGF0IGJlZ2lubmluZyBvZiBsaW5lICovCisjaWZkZWYgQkVCT1gKKwkgICAgaWYgKGVjaG9mKSB7CisgICAgICAgICAgICAgICAgY21kZWNobygoY2hhcikgYywgMCk7CS8qIEVjaG8gd2hhdCB3YXMgdHlwZWQuICovCisgICAgICAgICAgICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIGlmIChlY2hvZikgY21kZWNobygoY2hhcikgYywgMCk7IC8qIEVjaG8gd2hhdCB3YXMgdHlwZWQuICovCisjZW5kaWYgLyogQkVCT1ggKi8KKyAgICAgICAgfSBlbHNlIHsJCQkvKiBUaGlzIGNoYXJhY3RlciB3YXMgcXVvdGVkLiAqLworCSAgICBpbnQgcWYgPSAxOworCSAgICBxdW90ZSA9IDA7CQkJLyogVW5zZXQgdGhlIHF1b3RlIGZsYWcuICovCisJICAgIC8qIGRlYnVnKEYwMDAsImd0d29yZCBxdW90ZSAwIiwiIixjKTsgKi8KKwkgICAgLyogUXVvdGUgY2hhcmFjdGVyIGF0IHRoaXMgbGV2ZWwgaXMgb25seSBmb3IgU1AsID8sIGFuZCBjb250cm9scyAqLworICAgICAgICAgICAgLyogSWYgYW55dGhpbmcgZWxzZSB3YXMgcXVvdGVkLCBsZWF2ZSBxdW90ZSBpbiwgYW5kIGxldCAqLworCSAgICAvKiB0aGUgY29tbWFuZC1zcGVjaWZpYyBwYXJzaW5nIHJvdXRpbmVzIGhhbmRsZSBpdCwgZS5nLiBcMDA3ICovCisJICAgIGlmIChjID4gMzIgJiYgYyAhPSAnPycgJiYgYyAhPSBSVUIgJiYgY2hzcmMgIT0gMCkgeworCQkvKiBkZWJ1ZyhGMDAwLCJndHdvcmQgcXVvdGUgMSIsIiIsYyk7ICovCisJCSpicCsrID0gQ01EUTsJCS8qIERlcG9zaXQgXCBpZiBpdCBjYW1lIGZyb20gdHR5ICovCisJCXFmID0gMDsJCQkvKiBhbmQgZG9uJ3QgZXJhc2UgaXQgZnJvbSBzY3JlZW4gKi8KKwkJbGluZWJlZ2luID0gMDsJCS8qIE5vdCBhdCBiZWdpbm5pbmcgb2YgbGluZSAqLworI2lmZGVmIEJTX0RJUlNFUAorLyoKKyAgVGhpcyBpcyBhIGhhY2sgdG8gaGFuZGxlICJjZCBcIiBvciAiY2QgZm9vXCIgb24gT1MvMiBhbmQgc2ltaWxhciBzeXN0ZW1zLgorICBJZiB3ZSB3ZXJlIGNhbGxlZCBmcm9tIGNtZGlyKCkgYW5kIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgd2FzIHRoZSBxdW90ZQorICBjaGFyYWN0ZXIsIGkuZS4gYmFja3NsYXNoLCBhbmQgdGhpcyBjaGFyYWN0ZXIgaXMgdGhlIGNvbW1hbmQgdGVybWluYXRvciwKKyAgdGhlbiB3ZSBzdHVmZiBhbiBleHRyYSBiYWNrc2xhc2ggaW50byB0aGUgYnVmZmVyIHdpdGhvdXQgZWNob2luZywgdGhlbgorICB3ZSBzdHVmZiB0aGUgY2FycmlhZ2UgcmV0dXJuIGJhY2sgaW4gYWdhaW4sIGFuZCBnbyBiYWNrIGFuZCBwcm9jZXNzIGl0LAorICB0aGlzIHRpbWUgd2l0aCB0aGUgcXVvdGUgZmxhZyBvZmYuCisqLworCSAgICB9IGVsc2UgaWYgKGRpcm5hbWZsZyAmJiAoYyA9PSBDUiB8fCBjID09IExGIHx8IGMgPT0gU1ApKSB7CisJCS8qIGRlYnVnKEYwMDAsImd0d29yZCBxdW90ZSAyIiwiIixjKTsgKi8KKwkJKmJwKysgPSBDTURROworCQlsaW5lYmVnaW4gPSAwOwkJLyogTm90IGF0IGJlZ2lubmluZyBvZiBsaW5lICovCisJCSpicCA9IChjID09IFNQID8gU1AgOiBDUik7CisJCWdvdG8gQ01ESVJQQVJTRTsKKyNlbmRpZiAvKiBCU19ESVJTRVAgKi8KKwkgICAgfQorI2lmZGVmIEJFQk9YCisJICAgIGlmIChlY2hvZikgeworICAgICAgICAgICAgICAgIGNtZGVjaG8oKGNoYXIpIGMsIHFmKTsJLyogRWNobyB3aGF0IHdhcyB0eXBlZC4gKi8KKyAgICAgICAgICAgICAgICBmZmx1c2ggKHN0ZG91dCk7CisgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICAgICAgICB9CisjZWxzZQorCSAgICBpZiAoZWNob2YpIGNtZGVjaG8oKGNoYXIpIGMsIHFmKTsgLyogTm93IGVjaG8gcXVvdGVkIGNoYXJhY3RlciAqLworI2VuZGlmIC8qIEJFQk9YICovCisJICAgIC8qIGRlYnVnKEYxMTEsImd0d29yZCBxdW90ZSIsY21kYnVmLGMpOyAqLworCX0KKyNpZmRlZiBDT01NRU5UCisgICAgICAgIGlmIChlY2hvZikgY21kZWNobygoY2hhcikgYyxxdW90ZSk7IC8qIEVjaG8gd2hhdCB3YXMgdHlwZWQuICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBpZiAoIWNvbW1lbnQpIGlud29yZCA9IDE7CS8qIEZsYWcgd2UncmUgaW4gYSB3b3JkLiAqLworCWlmIChxdW90ZSkgY29udGludWU7CQkvKiBEb24ndCBkZXBvc2l0IHF1b3RlIGNoYXJhY3Rlci4gKi8KKyAgICAgICAgaWYgKGMgIT0gTkwpIHsJCQkvKiBEZXBvc2l0IGNvbW1hbmQgY2hhcmFjdGVyLiAqLworCSAgICAqYnArKyA9IChjaGFyKSBjOwkJLyogYW5kIG1ha2Ugc3VyZSB0aGVyZSBpcyBhIE5VTCAqLworI2lmZGVmIENPTU1FTlQKKwkgICAgKmJwID0gTlVMOwkJCS8qIGFmdGVyIGl0ICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCX0KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgYmlnIHdoaWxlICovCisgICAgYmxlZXAoQlBfV0FSTik7CisgICAgcHJpbnRmKCI/Q29tbWFuZCB0b28gbG9uZywgbWF4aW11bSBsZW5ndGg6ICVkLlxuIixDTURCTCk7CisgICAgY21mbGdzID0gLTI7CisgICAgcmV0dXJuKC05KTsKK30KKworLyogVXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyogQSBEIEQgQiBVIEYgIC0tIEFkZCB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgY3AgdG8gdGhlIGNvbW1hbmQgYnVmZmVyICAqLworCitzdGF0aWMgaW50CithZGRidWYoY3ApIGNoYXIgKmNwOyB7CisgICAgaW50IGxlbiA9IDA7CisgICAgd2hpbGUgKCgqY3AgIT0gTlVMKSAmJiAoYnAgPCBjbWRidWYrQ01EQkwpKSB7CisgICAgICAgICpicCsrID0gKmNwKys7ICAgICAgICAgICAgICAgICAgLyogQ29weSBhbmQgKi8KKyAgICAgICAgbGVuKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3VudCB0aGUgY2hhcmFjdGVycy4gKi8KKyAgICB9CisgICAgKmJwKysgPSBTUDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHV0IGEgc3BhY2UgYXQgdGhlIGVuZCAqLworICAgICpicCA9IE5VTDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSB3aXRoIGEgbnVsbCAqLworICAgIG5wID0gYnA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgbmV4dC1maWVsZCBwb2ludGVyICovCisgICAgY21icHRyID0gbnA7CisgICAgcmV0dXJuKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBsZW5ndGggKi8KK30KKworLyogIFMgRSBUIEEgVCBNICAtLSAgRGVwb3NpdCBhIHRva2VuIGluIHRoZSBhdG9tIGJ1ZmZlci4gICovCisvKgorICBCcmVhayBvbiBzcGFjZSwgbmV3bGluZSwgY2FycmlhZ2UgcmV0dXJuLCBvciBOVUwuCisgIENhbGwgd2l0aDoKKyAgICBjcCA9IFBvaW50ZXIgdG8gc3RyaW5nIHRvIGNvcHkgdG8gYXRvbSBidWZmZXIuCisgICAgZmNvZGUgPSAwIG1lYW5zIGJyZWFrIG9uIHdoaXRlc3BhY2Ugb3IgRU9MLgorICAgIGZjb2RlID0gMSBtZWFucyBkb24ndCBicmVhayBvbiBzcGFjZS4KKyAgICBmY29kZSA9IDIgbWVhbnMgYnJlYWsgb24gc3BhY2UsICc6Jywgb3IgJz0nLgorICAgIGZjb2RlID0gMyBtZWFucyBjb3B5IHRoZSB3aG9sZSBzdHJpbmcuCisgIE51bGwtdGVybWluYXRlIHRoZSByZXN1bHQuCisgIFJldHVybiBsZW5ndGggb2YgdG9rZW4sIGFuZCBhbHNvIHNldCBnbG9iYWwgImNjIiB0byB0aGlzIGxlbmd0aC4KKyAgUmV0dXJuIC0xIGlmIHRva2VuIHdhcyB0b28gbG9uZy4KKyovCitzdGF0aWMgaW50CitzZXRhdG0oY3AsZmNvZGUpIGNoYXIgKmNwOyBpbnQgZmNvZGU7IHsKKyAgICBjaGFyICphcCwgKnhwLCAqZHFwID0gTlVMTCwgbGJyYWNlLCByYnJhY2U7CisgICAgaW50IGJyYWNlbHZsID0gMCwgZHEgPSAwOworCisgICAgcmVnaXN0ZXIgY2hhciAqIHM7CisgICAgcmVnaXN0ZXIgaW50IG4gPSAwOworCisgICAgaWYgKGNtZmxkZmxncyAmIDEpIHsJCS8qIEhhbmRsZSBncm91cGluZyAqLworCWxicmFjZSA9ICcoJzsKKwlyYnJhY2UgPSAnKSc7CisgICAgfSBlbHNlIHsKKwlsYnJhY2UgPSAneyc7CisJcmJyYWNlID0gJ30nOworICAgIH0KKyAgICBjYyA9IDA7CQkJCS8qIENoYXJhY3RlciBjb3VudGVyICovCisgICAgYXAgPSBhdG1idWY7CQkJLyogQWRkcmVzcyBvZiBhdG9tIGJ1ZmZlciAqLworCisgICAgcyA9IGNwOworCisgICAgd2hpbGUgKCpzKyspIG4rKzsJCQkvKiBTYXZlIGEgY2FsbCB0byBzdHJsZW4gKi8KKworICAgIGlmIChuID4gQVRNQkwpIHsKKwlwcmludGYoIj9Db21tYW5kIGJ1ZmZlciBvdmVyZmxvd1xuIik7CisJcmV0dXJuKC0xKTsKKyAgICB9CisgICAgLyogZGVidWcoRjExMSwic2V0YXRtIixjcCxuKTsgKi8KKyAgICBpZiAoY3AgPT0gYXApIHsJCQkvKiBJbiBjYXNlIHNvdXJjZSBpcyBhdG9tIGJ1ZmZlciAqLworCXhwID0gYXR5YnVmOwkJCS8qIG1ha2UgYSBjb3B5ICovCisjaWZkZWYgQ09NTUVOVAorCXN0cm5jcHkoeHAsYXAsQVRNQkwpOwkJLyogc28gd2UgY2FuIGNvcHkgaXQgYmFjaywgZWRpdGVkLiAqLworCWNwID0geHA7CisjZWxzZQorCXMgPSBhcDsKKwl3aGlsZSAoKCp4cCsrID0gKnMrKykpIDsJLyogV2UgYWxyZWFkeSBrbm93IGl0J3MgYmlnIGVub3VnaCAqLworCWNwID0geHAgPSBhdHlidWY7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIH0KKyAgICAqYXAgPSBOVUw7CQkJCS8qIFplcm8gdGhlIGF0b20gYnVmZmVyICovCisgICAgaWYgKGZjb2RlID09IDEpIHsJCQkvKiBUcmltIHRyYWlsaW5nIGJsYW5rcyAqLworCXdoaWxlICgtLW4gPj0gMCAmJiBjcFtuXSA9PSBTUCkKKwkgIDsKKwljcFtuKzFdID0gTlVMOworICAgIH0KKyAgICB3aGlsZSAoKmNwID09IFNQKSB7CQkJLyogVHJpbSBsZWFkaW5nIHNwYWNlcyAqLworCWNwKys7CisJbi0tOworICAgIH0KKyAgICBpZiAoKmNwID09ICciJykgewkJCS8qIFN0YXJ0cyB3aXRoIGRvdWJsZXF1b3RlPyAqLworCWRxID0gMTsKKwlkcXAgPSBjcDsKKyAgICB9CisgICAgd2hpbGUgKCpjcCkgeworICAgICAgICBpZiAoKmNwID09IGxicmFjZSkKKwkgIGJyYWNlbHZsKys7CisgICAgICAgIGVsc2UgaWYgKCpjcCA9PSByYnJhY2UpCisJICBicmFjZWx2bC0tOworCWlmIChicmFjZWx2bCA8IDApCisJICBicmFjZWx2bCA9IDA7CisJaWYgKGJyYWNlbHZsID09IDApIHsKKwkgICAgaWYgKGRxKSB7CisJCWlmICgqY3AgPT0gU1AgfHwgKmNwID09IEhUKSB7CisJCSAgICBpZiAoY3AgPiBkcXArMSkgeworCQkJaWYgKCooY3AtMSkgPT0gJyInICYmICooY3AtMikgIT0gQ01EUSkgeworCQkJICAgIGJyZWFrOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0gZWxzZSBpZiAoKCpjcCA9PSBTUCB8fCAqY3AgPT0gSFQpICYmIGZjb2RlICE9IDEgJiYgZmNvZGUgIT0gMykKKwkgICAgICBicmVhazsKKwkgICAgaWYgKChmY29kZSA9PSAyKSAmJiAoKmNwID09ICc9JyB8fCAqY3AgPT0gJzonKSkgYnJlYWs7CisJICAgIGlmICgoZmNvZGUgIT0gMykgJiYgKCpjcCA9PSBMRiB8fCAqY3AgPT0gQ1IpKSBicmVhazsKKwl9CisgICAgICAgICphcCsrID0gKmNwKys7CisgICAgICAgIGNjKys7CisgICAgfQorICAgICphcCA9IE5VTDsJCQkJLyogVGVybWluYXRlIHRoZSBzdHJpbmcuICovCisgICAgLyogZGVidWcoRjExMSwic2V0YXRtIHJlc3VsdCIsYXRtYnVmLGNjKTsgKi8KKyAgICByZXR1cm4oY2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gbGVuZ3RoLiAqLworfQorCisvKgorICBUaGVzZSBmdW5jdGlvbnMgYXR0ZW1wdCB0byBoaWRlIHN5c3RlbSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgbWFpbmxpbmUKKyAgY29kZSBpbiBndHdvcmQoKS4gIER1bW15IGFyZyBmb3IgY21kZ2V0YygpIG5lZWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCisgIGNvbmluYygpLCB0dGluYygpLCBldGMsIHNpbmNlIGEgcG9pbnRlciB0byB0aGlzIHJvdXRpbmUgY2FuIGJlIHBhc3NlZCBpbgorICBwbGFjZSBvZiB0aG9zZSB0byB0bl9kb29wKCkuCisKKyAgTm8gbG9uZ2VyIHN0YXRpYy4gIFVzZWQgYnkgYXNrbW9yZSgpLiAgRnJpIEF1ZyAyMCAxNTowMzozNCAxOTk5LgorKi8KKyNkZWZpbmUgQ01EX0NPTklOQwkJCS8qIEhvdyB3ZSBnZXQga2V5Ym9hcmQgY2hhcnMgKi8KKworaW50CitjbWRnZXRjKHRpbWVsaW1pdCkgaW50IHRpbWVsaW1pdDsgewkvKiBHZXQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgdHR5LiAqLworICAgIGludCBjOworI2lmZGVmIElLU0QKKyAgICBleHRlcm4gaW50IGluc2VydmVyOworI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBDS19MT0dJTgorICAgIGV4dGVybiBpbnQgeF9sb2dnZWQ7CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyNpZmRlZiBUTkNPREUKKyAgICBzdGF0aWMgaW50IGdvdF9jciA9IDA7CisgICAgZXh0ZXJuIGludCBja3hlY2g7CisgICAgaW50IHR4ID0gMCwgaXNfdG4gPSAwOworI2VuZGlmIC8qIFROQ09ERSAqLworCisgICAgaWYgKHB1c2hjCisjaWZuZGVmIE5PU1BMCisJJiYgIWFza2ZsYWcKKyNlbmRpZiAvKiBOT1NQTCAqLworCSkgeworICAgICAgICBkZWJ1ZyhGMTExLCJjbWRnZXRjKCkiLCJwdXNoYyIscHVzaGMpOworCWMgPSBwdXNoYzsKKwlwdXNoYyA9IE5VTDsKKwlpZiAoeGNtZmRiICYmIGMgPT0gJz8nKQkJLyogRG9uJ3QgZWNobyA/IHR3aWNlIGlmIGNoYWluaW5nLiAqLworCSAgY21kY2hhcmRlbCgpOworCXJldHVybihjKTsKKyAgICB9CisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICB7CisJY2hhciBjaDsKKwljID0gZGduY2luYigwLCZjaCwxKTsJCS8qIC0xIGlzIEVPRiwgLTIgVE8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogLWMgaXMgQU9TL1ZTIGVycm9yICovCisJaWYgKGMgPT0gLTIpIHsJCQkvKiB0aW1lb3V0IHdhcyBlbmFibGVkPyAqLworCSAgICByZXN0byhjaGFubmVsKDApKTsJCS8qIHJlc2V0IHRpbWVvdXRzICovCisJICAgIGMgPSBkZ25jaW5iKDAsJmNoLDEpOwkvKiByZXRyeSB0aGlzIG5vdyEgKi8KKwl9CisJaWYgKGMgPCAwKSByZXR1cm4oLTQpOwkJLyogRU9GIG9yIHNvbWUgZXJyb3IgKi8KKwllbHNlIGMgPSAoaW50KSBjaCAmIDAxNzc7CS8qIEdldCBjaGFyIHdpdGhvdXQgcGFyaXR5ICovCisvKgllY2hvZiA9IDE7ICovCisgICAgfQorI2Vsc2UgLyogTm90IGRhdGFnZW5lcmFsICovCisjaWZuZGVmIE1JTklYMgorICAgIGlmICgKKyNpZmRlZiBJS1NECisJKCFsb2NhbCAmJiBpbnNlcnZlcikgfHwKKyNlbmRpZiAvKiBJS1NEICovCisJdGltZWxpbWl0ID4gMCkgeworI2lmZGVmIFROQ09ERQorICAgICAgICAgIEdFVE5FWFRDSDoKKyAgICAgICAgICAgIGlzX3RuID0gIXB1c2hjICYmICFsb2NhbCAmJiBzc3RlbG5ldDsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyNpZmRlZiBDT01NRU5UCisJICAgIGMgPSBjb25pbmModGltZWxpbWl0ID4gMCA/IDEgOiAwKTsKKyNlbHNlIC8qIENPTU1FTlQgKi8KKwkgICAgLyogVGhpcyBpcyBsaWtlbHkgdG8gYnJlYWsgdGhlIGFza3RpbWVvdXQuLi4gKi8KKwkgICAgYyA9IGNvbmluYyh0aW1lbGltaXQpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgICAgLyogZGVidWcoRjEwMSwiY21kZ2V0YyBjb25pbmMiLCIiLGMpOyAqLworI2lmZGVmIFROQ09ERQorICAgICAgICAgICAgaWYgKGMgPj0gMCAmJiBpc190bikgewkvKiBTZXJ2ZXItc2lkZSBUZWxuZXQgKi8KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKwkJICBjYXNlIElBQzoKKyAgICAgICAgICAgICAgICAgICAgLyogZGVidWcoRjExMSwiZ3R3b3JkIElBQyIsImMiLGMpOyAqLworICAgICAgICAgICAgICAgICAgICBnb3RfY3IgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoKHR4ID0gdG5fZG9vcCgoQ0hBUikoYyAmIDB4ZmYpLGNreGVjaCxjb25pbmMpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEdFVE5FWFRDSDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eCA8PSAtMSkgeyAvKiBJL08gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZXJlIHdhcyBhIGZhdGFsIEkvTyBlcnJvciB0aGVuIHR0Y2xvcygpICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBoYXMgYmVlbiBjYWxsZWQgYW5kIHRoZSBuZXh0IEdFVE5FWFRDSCBhdHRlbXB0ICAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogd2lsbCBiZSAhaXNfdG4gc2luY2UgdHRjbG9zKCkgc2V0cyBzc3RlbG5ldCA9IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRvZXhpdChCQURfRVhJVCwtMSk7IC8qIChvciByZXR1cm4oLTQpPyAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR4ID09IDEpIHsgLyogRUNITyBjaGFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNreGVjaCA9IGRweCA9IDE7IC8qIEdldCBuZXh0IGNoYXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gR0VUTkVYVENIOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR4ID09IDIpIHsgLyogRUNITyBjaGFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNreGVjaCA9IGRweCA9IDA7IC8qIEdldCBuZXh0IGNoYXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gR0VUTkVYVENIOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR4ID09IDMpIHsgLyogUXVvdGVkIElBQyAqLworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDI1NTsJLyogcHJvY2VlZWQgd2l0aCBpdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIElLU19PUFRJT04KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHggPT0gNCkgewkvKiBJS1MgU3RhdGUgQ2hhbmdlICovCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEdFVE5FWFRDSDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHggPT0gNikgewkvKiBSZW1vdGUgTG9nb3V0ICovCisJCQlkb2V4aXQoR09PRF9FWElULDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJZ290byBHRVRORVhUQ0g7CS8qIFVua25vd24sIGdldCBuZXh0IGNoYXIgKi8KKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgICAgY2FzZSBDUjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFURUxPUFRfVShURUxPUFRfQklOQVJZKSkgeworCQkJaWYgKGdvdF9jcikgeworCQkJICAgIC8qIFRoaXMgbWVhbnMgdGhlIHNlbmRlciBpcyB2aW9sYXRpbmcgVGVsbmV0ICAgKi8KKwkJCSAgICAvKiBwcm90b2NvbCBiZWNhdXNlIHdlIHJlY2VpdmVkIHR3byBDUnMgaW4gYSAgICovCisJCQkgICAgLyogcm93IHdpdGhvdXQgZ2V0dGluZyBlaXRoZXIgTEYgb3IgTlVMLiAgICAgICAqLworCQkJICAgIC8qIFRoaXMgd2lsbCBub3Qgc29sdmUgdGhlIHByb2JsZW0gYnV0IGl0ICAgICAgKi8KKwkJCSAgICAvKiB3aWxsIGF0IGxlYXN0IGFsbG93IHR3byBDUnMgdG8gZG8gc29tZXRoaW5nICovCisJCQkgICAgLyogd2hlcmVhcyBiZWZvcmUgdGhlIHVzZXIgd291bGQgaGF2ZSB0byBndWVzcyAqLworCQkJICAgIC8qIHRvIHNlbmQgTEYgb3IgTlVMIGFmdGVyIHRoZSBDUi4gICAgICAgICAgICAgKi8KKwkJCSAgICBkZWJ1ZyhGMTAwLCJndHdvcmQgQ1IgdGVsbmV0IGVycm9yIiwiIiwwKTsKKwkJCSAgICBjID0gTEY7CisJCQl9IGVsc2UgeworCQkJICAgIGRlYnVnKEYxMDAsImd0d29yZCBza2lwcGluZyBDUiIsIiIsMCk7CisJCQkgICAgZ290X2NyID0gMTsJLyogUmVtZW1iZXIgYSBDUiB3YXMgcmVjZWl2ZWQgKi8KKwkJCSAgICBnb3RvIEdFVE5FWFRDSDsKKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCWRlYnVnKEYxMDAsImd0d29yZCBDUiB0byBMRiIsIiIsMCk7CisJCQljID0gTEY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIExGOgorICAgICAgICAgICAgICAgICAgICBpZiAoIVRFTE9QVF9VKFRFTE9QVF9CSU5BUlkpKSB7CisJCQlnb3RfY3IgPSAwOworCQkJZGVidWcoRjEwMCwiZ3R3b3JkIExGIiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCWlmIChnb3RfY3IpIHsKKwkJCSAgICBnb3RfY3IgPSAwOworCQkJICAgIGRlYnVnKEYxMDAsImd0d29yZCBza2lwcGluZyBMRiIsIiIsMCk7CisJCQkgICAgZ290byBHRVRORVhUQ0g7CisJCQl9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIE5VTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFURUxPUFRfVShURUxPUFRfQklOQVJZKSAmJiBnb3RfY3IpIHsKKwkJCWMgPSBMRjsKKwkJCWRlYnVnKEYxMDAsImd0d29yZCBOVUwgdG8gTEYiLCIiLDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJZGVidWcoRjEwMCwiZ3R3b3JkIE5VTCIsIiIsMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZ290X2NyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZWxzZSAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICBjYXNlIENSOgorICAgICAgICAgICAgICAgICAgICBpZiAoICFURUxPUFRfVShURUxPUFRfQklOQVJZKSAmJiBnb3RfY3IgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIG1lYW5zIHRoZSBzZW5kZXIgaXMgdmlvbGF0aW5nIFRlbG5ldCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCBiZWNhdXNlIHdlIHJlY2VpdmVkIHR3byBDUnMgaW4gYSAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiByb3cgd2l0aG91dCBnZXR0aW5nIGVpdGhlciBMRiBvciBOVUwuICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIHdpbGwgbm90IHNvbHZlIHRoZSBwcm9ibGVtIGJ1dCBpdCAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aWxsIGF0IGxlYXN0IGFsbG93IHR3byBDUnMgdG8gZG8gc29tZXRoaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGVyZWFzIGJlZm9yZSB0aGUgdXNlciB3b3VsZCBoYXZlIHRvIGd1ZXNzICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0byBzZW5kIExGIG9yIE5VTCBhZnRlciB0aGUgQ1IuICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJndHdvcmQgQ1IgdGVsbmV0IGVycm9yIiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdF9jciA9IDE7CS8qIFJlbWVtYmVyIGEgQ1Igd2FzIHJlY2VpdmVkICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogZGVidWcoRjEwMCwiZ3R3b3JkIENSIHRvIExGIiwiIiwwKTsgKi8KKyAgICAgICAgICAgICAgICAgICAgYyA9IExGOworCQkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIExGOgorICAgICAgICAgICAgICAgICAgICBpZiAoZ290X2NyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RfY3IgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVidWcoRjEwMCwiZ3R3b3JkIHNraXBwaW5nIExGIiwiIiwwKTsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gR0VUTkVYVENIOworICAgICAgICAgICAgICAgICAgICB9CisJCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgTlVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoZ290X2NyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RfY3IgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVidWcoRjEwMCwiZ3R3b3JkIHNraXBwaW5nIE5VTCIsIiIsMCk7ICovCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEdFVE5FWFRDSDsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiZ3R3b3JkIE5VTCIsIiIsMCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBJS1NECisJCSAgY2FzZSBFVFg6CQkvKiBDdHJsLUMuLi4gKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgRU9UOgkJLyogRU9UID0gRU9GICovCisgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydmVyCisjaWZkZWYgQ0tfTE9HSU4KKwkJCSAgJiYgIXhfbG9nZ2VkCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKwkJCSAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTQpOworCQkgICAgYnJlYWs7CisjZW5kaWYgLyogSUtTRCAqLworCQkgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgZ290X2NyID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVE5DT0RFICovCisgICAgfSBlbHNlIHsKKyNpZmRlZiBPUzIKKwljID0gY29uaW5jKDApOworI2Vsc2UgLyogT1MyICovCisjaWZkZWYgQ01EX0NPTklOQworI3VuZGVmIENNRF9DT05JTkMKKyNlbmRpZiAvKiBDTURfQ09OSU5DICovCisJYyA9IGdldGNoYXIoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB9CisjZWxzZSAgLyogTUlOSVgyICovCisjdW5kZWYgZ2V0YworI2lmZGVmIENNRF9DT05JTkMKKyN1bmRlZiBDTURfQ09OSU5DCisjZW5kaWYgLyogQ01EX0NPTklOQyAqLworICAgIGMgPSBnZXRjKHN0ZGluKTsKKyAgICAvKiBkZWJ1ZyhGMTAxLCJjbWRnZXRjIGdldGMiLCIiLGMpOyAqLworI2VuZGlmIC8qIE1JTklYMiAqLworI2lmZGVmIFJUVQorICAgIGlmIChydHVfYnVnKSB7CisjaWZkZWYgQ01EX0NPTklOQworI3VuZGVmIENNRF9DT05JTkMKKyNlbmRpZiAvKiBDTURfQ09OSU5DICovCisJYyA9IGdldGNoYXIoKTsJCQkvKiBSVFUgZG9lc24ndCBkaXNjYXJkIHRoZSBeWiAqLworCXJ0dV9idWcgPSAwOworICAgIH0KKyNlbmRpZiAvKiBSVFUgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworICAgIHJldHVybihjKTsJCQkJLyogUmV0dXJuIHdoYXQgd2UgZ290ICovCit9CisKKy8qICNpZmRlZiBVU0VfQVJST1dLRVlTICovCisKKy8qIE1lY2hhbmlzbSB0byB1c2UgZm9yIHBlZWtpbmcgaW50byBzdGRpbiBidWZmZXIgKi8KKworI2lmbmRlZiBVU0VfRklMRV9DTlQJCQkvKiBzdGRpbi0+X19jbnQgKi8KKyNpZm5kZWYgVVNFX0ZJTEVfX0NOVAkJCS8qIE5vdGU6IHR3byB1bmRlcnNjb3JlcyAqLworI2lmZGVmIEhQVVgJCQkJLyogSFBVWCA3LTExICovCisjaWZuZGVmIEhQVVg1CisjaWZuZGVmIEhQVVg2CisjZGVmaW5lIFVTRV9GSUxFX19DTlQKKyNlbmRpZiAvKiBIUFVYNiAqLworI2VuZGlmIC8qIEhQVVg1ICovCisjZWxzZQorI2lmZGVmIEFOWVNDTwkJCQkvKiBTQ08gVU5JWCwgT1NSNSwgVW5peHdhcmUsIGV0YyAqLworI2lmbmRlZiBPTERfVU5JWFdBUkUJCQkvKiBCdXQgbm90IFVuaXh3YXJlIDEueCBvciAyLjAgKi8KKyNpZm5kZWYgVU5JWFdBUkUyCQkJLyogb3IgMi4xLjAgKi8KKyNkZWZpbmUgVVNFX0ZJTEVfX0NOVAorI2VuZGlmIC8qIFVOSVhXQVJFMiAqLworI2VuZGlmIC8qIE9MRF9VTklYV0FSRSAqLworI2VuZGlmIC8qIEFOWVNDTyAqLworI2VuZGlmIC8qIEhQVVggKi8KKyNlbmRpZiAvKiBVU0VfRklMRV9fQ05UICovCisjZW5kaWYgLyogVVNFX0ZJTEVfQ05UICovCisKKyNpZm5kZWYgVVNFX0ZJTEVfUgkJCS8qIHN0ZGluLT5fciAqLworI2lmbmRlZiBVU0VfRklMRV9DTlQKKyNpZm5kZWYgVVNFX0ZJTEVfX0NOVAorI2lmZGVmIEJTRDQ0CQkJCS8qIHtGcmVlLE9wZW4sTmV0fUJTRCwgQlNESSAqLworI2RlZmluZSBVU0VfRklMRV9SCisjZW5kaWYgLyogQlNENDQgKi8KKyNlbmRpZiAvKiBVU0VfRklMRV9fQ05UICovCisjZW5kaWYgLyogVVNFX0ZJTEVfQ05UICovCisjZW5kaWYgLyogVVNFX0ZJTEVfUiAqLworCisjaWZuZGVmIFVTRV9GSUxFX1IJCQkvKiBzdGRpbi0+X2NudCAqLworI2lmbmRlZiBVU0VfRklMRV9DTlQKKyNpZm5kZWYgVVNFX0ZJTEVfX0NOVAorI2RlZmluZSBVU0VfRklMRV9DTlQJCQkvKiBFdmVyeWJvZHkgZWxzZSAoYnV0IExpbnV4KSAqLworI2VuZGlmIC8qIFVTRV9GSUxFX19DTlQgKi8KKyNlbmRpZiAvKiBVU0VfRklMRV9DTlQgKi8KKyNlbmRpZiAvKiBVU0VfRklMRV9SICovCisKKworLyoKKyAgYyBtIGQgYyBvIG4gYyBoIGsKKworICBIb3cgbWFueSBjaGFyYWN0ZXJzIGFyZSB3YWl0aW5nIHRvIGJlIHJlYWQgYXQgdGhlIGNvbnNvbGU/ICBOb3JtYWxseQorICBjb25jaGsoKSB3b3VsZCB0ZWxsIHVzLCBidXQgaW4gVW5peCBhbmQgVk1TIGNtZGdldGMoKSB1c2VzIHN0ZGlvIGdldGNoYXIoKSwKKyAgdGh1cyBieXBhc3NpbmcgY29uaW5jKCkvY29uY2hrKCksIHNvIHdlIGhhdmUgdG8gcGVlayBpbnRvIHRoZSBzdGRpbiBidWZmZXIsCisgIHdoaWNoIGlzIHRvdGFsbHkgbm9ucG9ydGFibGUuICBXaGljaCBpcyB3aHkgdGhpcyByb3V0aW5lIGlzLCBhdCBsZWFzdCBmb3IKKyAgbm93LCB1c2VkIG9ubHkgZm9yIGNoZWNraW5nIGZvciBhcnJvdy1rZXkgc2VxdWVuY2VzIGZyb20gdGhlIGtleWJvYXJkIGFmdGVyCisgIGFuIEVTQyB3YXMgcmVhZC4gIFdvdWxkbid0IGl0IGJlIG5pY2UgaWYgdGhlIHN0ZGlvIHBhY2thZ2UgaGFkIGEgZnVuY3Rpb24KKyAgdGhhdCByZXR1cm5lZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdhaXRpbmcgdG8gYmUgcmVhZCBmcm9tIGl0cyBidWZmZXI/CisgIFJldHVybnMgMCBvciBncmVhdGVyIGFsd2F5cy4KKyovCitpbnQKK2NtZGNvbmNoaygpIHsKKyAgICBpbnQgeCA9IDAsIHk7CisgICAgeSA9IHB1c2hjID8gMSA6IDA7CQkJLyogSGF2ZSBjb21tYW5kIGNoYXJhY3RlciBwdXNoZWQ/ICovCisjaWZkZWYgT1MyCisgICAgeCA9IGNvbmNoaygpOwkJCS8qIENoZWNrIGRldmljZS1kcml2ZXIgYnVmZmVyICovCisgICAgaWYgKHggPCAwKSB4ID0gMDsKKyNlbHNlIC8qIE9TMiAqLworI2lmZGVmIENNRF9DT05JTkMJCQkvKiBTZWUgY21kZ2V0YygpICovCisgICAgeCA9IGNvbmNoaygpOwkJCS8qIENoZWNrIGRldmljZS1kcml2ZXIgYnVmZmVyICovCisgICAgaWYgKHggPCAwKSB4ID0gMDsKKyNlbHNlICAvKiBDTURfQ09OSU5DICovCisKKy8qIEhlcmUgd2UgbXVzdCBsb29rIGluc2lkZSB0aGUgc3RkaW4gYnVmZmVyIC0gaGlnaGx5IHBsYXRmb3JtIGRlcGVuZGVudCAqLworCisjaWZkZWYgX0lPX2ZpbGVfZmxhZ3MJCQkvKiBMaW51eCAqLworICAgIHggPSAoaW50KSAoKHN0ZGluLT5fSU9fcmVhZF9lbmQpIC0gKHN0ZGluLT5fSU9fcmVhZF9wdHIpKTsKKyAgICBkZWJ1ZyhGMTAxLCJjbWRjb25jaGsgX0lPX2ZpbGVfZmxhZ3MiLCIiLHgpOworI2Vsc2UgIC8qIF9JT19maWxlX2ZsYWdzICovCisjaWZkZWYgVVNFX0ZJTEVfQ05UCQkJLyogVHJhZGl0aW9uYWwgKi8KKyNpZmRlZiBWTVMKKyAgICBkZWJ1ZyhGMTAxLCJjbWRjb25jaGsgKCpzdGRpbiktPl9jbnQiLCIiLCgqc3RkaW4pLT5fY250KTsKKyAgICB4ID0gKCpzdGRpbiktPl9jbnQ7CisjZWxzZQorI2lmZGVmIE5PQVJST1dLRVlTCisgICAgZGVidWcoRjEwMSwiY21kY29uY2hrIE5PQVJST1dLRVlTIHgiLCIiLDApOworI2Vsc2UKKyAgICBkZWJ1ZyhGMTAxLCJjbWRjb25jaGsgc3RkaW4tPl9jbnQiLCIiLHN0ZGluLT5fY250KTsKKyAgICB4ID0gc3RkaW4tPl9jbnQ7CisjZW5kaWYgLyogTk9BUlJPV0tFWVMgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyAgICBpZiAoeCA9PSAwKSB4ID0gY29uY2hrKCk7CisgICAgaWYgKHggPCAwKSB4ID0gMDsKKyNlbHNlICAvKiBVU0VfRklMRV9DTlQgKi8KKyNpZmRlZiBVU0VfRklMRV9fQ05UCQkJLyogSFAtVVggKi8KKyAgICBkZWJ1ZyhGMTAxLCJjbWRjb25jaGsgc3RkaW4tPl9fY250IiwiIixzdGRpbi0+X19jbnQpOworICAgIHggPSBzdGRpbi0+X19jbnQ7CisgICAgaWYgKHggPT0gMCkgeCA9IGNvbmNoaygpOworICAgIGlmICh4IDwgMCkgeCA9IDA7CisjZWxzZSAgLyogVVNFX0ZJTEVfQ05UICovCisjaWZkZWYgVVNFX0ZJTEVfUgkJCS8qIEZyZWVCU0QsIE9wZW5CU0QsIGV0YyAqLworICAgIGRlYnVnKEYxMDEsImNtZGNvbmNoayBzdGRpbi0+X3IiLCIiLHN0ZGluLT5fcik7CisgICAgeCA9IHN0ZGluLT5fcjsKKyAgICBpZiAoeCA9PSAwKSB4ID0gY29uY2hrKCk7CisgICAgaWYgKHggPCAwKSB4ID0gMDsKKworICAgIC8qIEZpbGwgaW4gYW55IG90aGVycyBoZXJlLi4uICovCisKKyNlbmRpZiAvKiBVU0VfRklMRV9SICovCisjZW5kaWYgLyogVVNFX0ZJTEVfX0NOVCAqLworI2VuZGlmIC8qIFVTRV9GSUxFX0NOVCAqLworI2VuZGlmIC8qIF9JT19maWxlX2ZsYWdzICovCisjZW5kaWYgLyogQ01EX0NPTklOQyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIHJldHVybih4ICsgeSk7Cit9CisvKiAjZW5kaWYgKi8gLyogVVNFX0FSUk9XS0VZUyAqLworCisKK3N0YXRpYyBWT0lECitjbWRjbHJzY24oKSB7CQkJCS8qIENsZWFyIHRoZSBzY3JlZW4gKi8KKyAgICBja19jbHMoKTsKK30KKworc3RhdGljIFZPSUQJCQkJLyogV2hhdCB0byBlY2hvIGF0IGVuZCBvZiBjb21tYW5kICovCisjaWZkZWYgQ0tfQU5TSUMKK2NtZG5ld2woY2hhciBjKQorI2Vsc2UKK2NtZG5ld2woYykgY2hhciBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBjbWRuZXdsICovIHsKKyNpZmRlZiBPUzIKKyNpZmRlZiBJS1NECisgICAgZXh0ZXJuIGludCBpbnNlcnZlcjsKKyAgICBpZiAoaW5zZXJ2ZXIgJiYgYyA9PSBMRikKKyAgICAgIHB1dGNoYXIoQ1IpOworI2VuZGlmIC8qIElLU0QgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIHB1dGNoYXIoYyk7CQkJCS8qIGMgaXMgdGhlIHRlcm1pbmF0aW5nIGNoYXJhY3RlciAqLworCisjaWZkZWYgV0lOVENQCQkJCS8qIHdoYXQgaXMgdGhpcyBkb2luZyBoZXJlPyAqLworICAgIGlmIChjID09IENSKSBwdXRjaGFyKE5MKTsKKyNlbmRpZiAvKiBXSU5UQ1AgKi8KKworLyoKKyAgQS5BLiBDaGVybm92LCB3aG8gc2VudCBpbiBjaGFuZ2VzIGZvciBGcmVlQlNELCBzYWlkIHdlIGFsc28gbmVlZGVkIHRoaXMKKyAgZm9yIFNWT1JQT1NJWCBiZWNhdXNlICJzZXR1cCB0ZXJtaW5hbCBieSB0ZXJtaW9zIGFuZCBjdXJzZXMgZG9lcworICBub3QgY29udmVydCBcciB0byBcbiwgc28gYWRkaXRpb25hbCBcbiBuZWVkZWQgaW4gbmV3bGluZSBmdW5jdGlvbi4iICBCdXQKKyAgaXQgaXMgYWxzbyB2ZXJ5IGxpa2VseSB0byByZXN1bHQgaW4gdW53YW50ZWQgYmxhbmsgbGluZXMuCisqLworI2lmZGVmIEJTRDQ0CisgICAgaWYgKGMgPT0gQ1IpIHB1dGNoYXIoTkwpOworI2VuZGlmIC8qIEJTRDQ0ICovCisKKyNpZmRlZiBDT01NRU5UCisgICAgLyogT1MyIG5vIGxvbmdlciBuZWVkcyB0aGlzIGFzIGFsbCBDUiBhcmUgY29udmVydGVkIHRvIE5MIGluIGNvbmluYygpICovCisgICAgLyogVGhpcyBlbGltaW5hdGVzIHRoZSB1Z2x5IGV4dHJhIGJsYW5rIGxpbmVzIGRpc2N1c3NlZCBhYm92ZS4gICAgICAgICovCisjaWZkZWYgT1MyCisgICAgaWYgKGMgPT0gQ1IpIHB1dGNoYXIoTkwpOworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBhZWdpcworICAgIGlmIChjID09IENSKSBwdXRjaGFyKE5MKTsKKyNlbmRpZiAvKiBhZWdpcyAqLworI2lmZGVmIEFNSUdBCisgICAgaWYgKGMgPT0gQ1IpIHB1dGNoYXIoTkwpOworI2VuZGlmIC8qIEFNSUdBICovCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICBpZiAoYyA9PSBDUikgcHV0Y2hhcihOTCk7CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNpZmRlZiBHRU1ET1MKKyAgICBpZiAoYyA9PSBDUikgcHV0Y2hhcihOTCk7CisjZW5kaWYgLyogR0VNRE9TICovCisjaWZkZWYgU1RSQVRVUworICAgIGlmIChjID09IENSKSBwdXRjaGFyKE5MKTsKKyNlbmRpZiAvKiBTVFJBVFVTICovCit9CisKK3N0YXRpYyBWT0lECitjbWRjaGFyZGVsKCkgewkJCQkvKiBFcmFzZSBhIGNoYXJhY3RlciBmcm9tIHRoZSBzY3JlZW4gKi8KKyAgICBpZiAoIWRweCkgcmV0dXJuOworI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgLyogREcgJ1xiJyBpcyBFTSAoXnkgb3IgXDAzMSkgKi8KKyAgICBpZiAodGVybXR5cGUgPT0gMSkKKyAgICAgIC8qIEVyYXNlIGEgY2hhcmFjdGVyIGZyb20gbm9uLURHIHNjcmVlbiwgKi8KKyAgICAgIGRnbmNvdWIoMSwiXDAxMCBcMDEwIiwzKTsKKyAgICBlbHNlCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyAgICAgIHByaW50ZigiXGIgXGIiKTsKKyNpZmRlZiBHRU1ET1MKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbHNlCisjaWZkZWYgQkVCT1gKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZiAvKiBCRUJPWCAqLworI2VuZGlmIC8qIEdFTURPUyAqLworfQorCitzdGF0aWMgVk9JRAorI2lmZGVmIENLX0FOU0lDCitjbWRlY2hvKGNoYXIgYywgaW50IHF1b3RlKQorI2Vsc2UKK2NtZGVjaG8oYyxxdW90ZSkgY2hhciBjOyBpbnQgcXVvdGU7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogY21kZWNobyAqLworICAgIGlmICghZHB4KSByZXR1cm47CisgICAgLyogRWNobyB0dHkgaW5wdXQgY2hhcmFjdGVyIGMgKi8KKyAgICBpZiAocXVvdGUpIHsKKwlwdXRjaGFyKEJTKTsKKwlwdXRjaGFyKFNQKTsKKwlwdXRjaGFyKEJTKTsKKyNpZmRlZiBpc3ByaW50CisJcHV0Y2hhcigoQ0hBUikgKGlzcHJpbnQoYykgPyBjIDogJ14nICkpOworI2Vsc2UKKwlwdXRjaGFyKChDSEFSKSAoKGMgPj0gU1AgJiYgYyA8IERFTCkgPyBjIDogJ14nKSk7CisjZW5kaWYgLyogaXNwcmludCAqLworICAgIH0gZWxzZSBwdXRjaGFyKGMpOworI2lmZGVmIE9TMgorICAgIGlmIChxdW90ZT09MSAmJiBjPT1DUikgcHV0Y2hhcigoQ0hBUikgTkwpOworI2VuZGlmIC8qIE9TMiAqLworICAgIGlmICh0aW1lbGltaXQpCisgICAgICBmZmx1c2goc3Rkb3V0KTsKK30KKworLyogUmV0dXJuIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiBpbiBjb21tYW5kIGJ1ZmZlci4gKi8KKworY2hhciAqCitjbXBlZWsoKSB7CisgICAgcmV0dXJuKG5wKTsKK30KKyNlbmRpZiAvKiBOT0lDUCAqLworCisKKyNpZmRlZiBOT0lDUAorI2luY2x1ZGUgImNrY2RlYi5oIgorI2luY2x1ZGUgImNrdWNtZC5oIgorI2luY2x1ZGUgImNrY2FzYy5oIgorI2VuZGlmIC8qIE5PSUNQICovCisKKy8qICBYIFggRSBTIEMgIC0tICBJbnRlcnByZXRzIGJhY2tzbGFzaCBjb2RlcyAgKi8KKy8qICBSZXR1cm5zIHRoZSBpbnQgdmFsdWUgb2YgdGhlIGJhY2tzbGFzaCBjb2RlIGlmIGl0IGlzID4gLTEgYW5kIDwgMjU2ICovCisvKiAgYW5kIHVwZGF0ZXMgdGhlIHN0cmluZyBwb2ludGVyIHRvIGZpcnN0IGNoYXJhY3RlciBhZnRlciBiYWNrc2xhc2ggY29kZS4gKi8KKy8qICBJZiB0aGUgYXJndW1lbnQgaXMgaW52YWxpZCwgbGVhdmVzIHBvaW50ZXIgdW5jaGFuZ2VkIGFuZCByZXR1cm5zIC0xLiAqLworCitpbnQKK3h4ZXNjKHMpIGNoYXIgKipzOyB7CQkJLyogRXhwYW5kIGJhY2tzbGFzaCBlc2NhcGVzICovCisgICAgaW50IHgsIHksIGJyYWNlLCByYWRpeDsJCS8qIFJldHVybnMgdGhlIGludCB2YWx1ZSAqLworICAgIGNoYXIgaGQgPSAnOSc7CQkJLyogSGlnaGVzdCBkaWdpdCBpbiByYWRpeCAqLworICAgIGNoYXIgKnA7CisKKyAgICBwID0gKnM7CQkJCS8qIHBvaW50ZXIgdG8gYmVnaW5uaW5nICovCisgICAgaWYgKCFwKSByZXR1cm4oLTEpOwkJCS8qIHdhdGNoIG91dCBmb3IgbnVsbCBwb2ludGVyICovCisgICAgeCA9ICpwKys7CQkJCS8qIGNoYXJhY3RlciBhdCBiZWdpbm5pbmcgKi8KKyAgICBpZiAoeCAhPSBDTURRKSByZXR1cm4oLTEpOwkJLyogbWFrZSBzdXJlIGl0J3MgYSBiYWNrc2xhc2ggY29kZSAqLworCisgICAgeCA9ICpwOwkJCQkvKiBpdCBpcywgZ2V0IHRoZSBuZXh0IGNoYXJhY3RlciAqLworICAgIGlmICh4ID09ICd7JykgewkJCS8qIGJyYWNrZXRlZCBxdWFudGl0eT8gKi8KKwlwKys7CQkJCS8qIGJlZ2luIHBhc3QgYnJhY2tldCAqLworCXggPSAqcDsKKwlicmFjZSA9IDE7CisgICAgfSBlbHNlIGJyYWNlID0gMDsKKyAgICBzd2l0Y2ggKHgpIHsJCQkvKiBTdGFydCBpbnRlcnByZXRpbmcgKi8KKyAgICAgIGNhc2UgJ2QnOgkJCQkvKiBEZWNpbWFsIHJhZGl4IGluZGljYXRvciAqLworICAgICAgY2FzZSAnRCc6CisJcCsrOwkJCQkvKiBKdXN0IHBvaW50IHBhc3QgaXQgYW5kIGZhbGwgdGhydSAqLworICAgICAgY2FzZSAnMCc6CQkJCS8qIFN0YXJ0cyB3aXRoIGRpZ2l0ICovCisgICAgICBjYXNlICcxJzoKKyAgICAgIGNhc2UgJzInOiAgY2FzZSAnMyc6ICBjYXNlICc0JzogIGNhc2UgJzUnOgorICAgICAgY2FzZSAnNic6ICBjYXNlICc3JzogIGNhc2UgJzgnOiAgY2FzZSAnOSc6CisJcmFkaXggPSAxMDsJCQkvKiBEZWNpbWFsICovCisJaGQgPSAnOSc7CQkJLyogaGlnaGVzdCB2YWxpZCBkaWdpdCAqLworCWJyZWFrOworICAgICAgY2FzZSAnbyc6CQkJCS8qIFN0YXJ0cyB3aXRoIG8gb3IgTyAqLworICAgICAgY2FzZSAnTyc6CisJcmFkaXggPSA4OwkJCS8qIE9jdGFsICovCisJaGQgPSAnNyc7CQkJLyogaGlnaGVzdCB2YWxpZCBkaWdpdCAqLworCXArKzsJCQkJLyogcG9pbnQgcGFzdCByYWRpeCBpbmRpY2F0b3IgKi8KKwlicmVhazsKKyAgICAgIGNhc2UgJ3gnOgkJCQkvKiBTdGFydHMgd2l0aCB4IG9yIFggKi8KKyAgICAgIGNhc2UgJ1gnOgorCXJhZGl4ID0gMTY7CQkJLyogSGV4YWRlY2ltYWwgKi8KKwlwKys7CQkJCS8qIHBvaW50IHBhc3QgcmFkaXggaW5kaWNhdG9yICovCisJYnJlYWs7CisgICAgICBkZWZhdWx0OgkJCQkvKiBBbGwgb3RoZXJzICovCisjaWZkZWYgQ09NTUVOVAorCSpzID0gcCsxOwkJCS8qIFRyZWF0IGFzIHF1b3RlIG9mIG5leHQgY2hhciAqLworCXJldHVybigqcCk7CisjZWxzZQorCXJldHVybigtMSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIH0KKyAgICAvKiBGb3IgT1MvMiwgdGhlcmUgYXJlICJ3aWRlIiBjaGFyYWN0ZXJzIHJlcXVpcmVkIGZvciB0aGUga2V5Ym9hcmQKKyAgICAgKiBiaW5kaW5nLCBpLmUgXDY0NCBhbmQgc2ltaWxhciBjb2RlcyBsYXJnZXIgdGhhbiAyNTUgKGJ5dGUpLgorICAgICAqIEZvciB0aGlzIHB1cnBvc2UsIGdpdmUgdXAgY2hlY2tpbmcgZm9yIDwgMjU2LiBJZiBzb21lb25lIG1lYW5zCisgICAgICogXDI2NiBzaG91bGQgcmVzdWx0IGluIFwyNiBmb2xsb3dlZCBieSBhICI2IiBjaGFyYWN0ZXIsIGhlIHNob3VsZAorICAgICAqIGFsd2F5cyB3cml0ZSBcezI2fTYgYW55d2F5LiAgTm93LCByZXR1cm4gb25seSB0aGUgbG93ZXIgYnl0ZSBvZgorICAgICAqIHRoZSByZXN1bHQsIGkuZS4gMTAsIGJ1dCBlYXQgdXAgdGhlIHdob2xlIFwyNjYgc2VxdWVuY2UgYW5kCisgICAgICogcHV0IHRoZSB3aWRlIHJlc3VsdCAyNjYgaW50byBhIGdsb2JhbCB2YXJpYWJsZS4gIFllcywgdGhhdCdzIG5vdAorICAgICAqIHRoZSBtb3N0IGJlYXV0aWZ1bCBwcm9ncmFtbWluZyBzdHlsZSBidXQgcmVxdWlyZXMgdGhlIGxlYXN0CisgICAgICogYW1vdW50IG9mIGNoYW5nZXMgdG8gb3RoZXIgcm91dGluZXMuCisgICAgICovCisgICAgaWYgKCpwID09ICd7JykgewkJCS8qIFN1biBNYXkgMTEgMjA6MDA6NDAgMjAwMyAqLworCWJyYWNlID0gMTsJCQkvKiBBbGxvdyB7fSBhZnRlciByYWRpeCBpbmRpY2F0b3IgKi8KKwlwKys7CisgICAgfQorICAgIGlmIChyYWRpeCA8PSAxMCkgewkJCS8qIE51bWJlciBpbiByYWRpeCA4IG9yIDEwICovCisJZm9yICggeCA9IHkgPSAwOworIAkgICAgICAoKnApICYmICgqcCA+PSAnMCcpICYmICgqcCA8PSBoZCkKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAmJiAoeSA8IDUpICYmICh4KnJhZGl4IDwgS01TSVpFKTsKKyAgICAgICAgICAgICAgLyogdGhlIG1heGltdW0gbmVlZGVkIHZhbHVlIFw4MTk2IGlzIDQgZGlnaXRzIGxvbmcgKi8KKyAgICAgICAgICAgICAgLyogd2hpbGUgYXMgb2N0YWwgaXQgcmVxdWlyZXMgXDEzNzcsIGkuZS4gNSBkaWdpdHMgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgJiYgKHkgPCAzKSAmJiAoeCpyYWRpeCA8IDI1Nik7CisjZW5kaWYgLyogT1MyICovCisJICAgICAgcCsrLHkrKykgeworCSAgICB4ID0geCAqIHJhZGl4ICsgKGludCkgKnAgLSA0ODsKKwl9CisjaWZkZWYgT1MyCisgICAgICAgIHdpZGVyZXN1bHQgPSB4OwkJCS8qIFJlbWVtYmVyIHdpZGUgcmVzdWx0ICovCisgICAgICAgIHggJj0gMjU1OworI2VuZGlmIC8qIE9TMiAqLworCWlmICh5ID09IDAgfHwgeCA+IDI1NSkgewkvKiBObyB2YWxpZCBkaWdpdHM/ICovCisJICAgICpzID0gcDsJCQkvKiBwb2ludCBhZnRlciBpdCAqLworCSAgICByZXR1cm4oLTEpOwkJCS8qIHJldHVybiBmYWlsdXJlLiAqLworCX0KKyAgICB9IGVsc2UgaWYgKHJhZGl4ID09IDE2KSB7CQkvKiBTcGVjaWFsIGNhc2UgZm9yIGhleCAqLworCWlmICgoeCA9IHVuaGV4KCpwKyspKSA8IDApIHsgKnMgPSBwIC0gMTsgcmV0dXJuKC0xKTsgfQorCWlmICgoeSA9IHVuaGV4KCpwKyspKSA8IDApIHsgKnMgPSBwIC0gMjsgcmV0dXJuKC0xKTsgfQorCXggPSAoKHggPDwgNCkgJiAweEYwKSB8ICh5ICYgMHgwRik7CisjaWZkZWYgT1MyCisgICAgICAgIHdpZGVyZXN1bHQgPSB4OworICAgICAgICBpZiAoKHkgPSB1bmhleCgqcCkpID49IDApIHsKKyAgICAgICAgICAgcCsrOworCSAgIHdpZGVyZXN1bHQgPSAoKHggPDwgNCkgJiAweEZGMCkgfCAoeSAmIDB4MEYpOworICAgICAgICAgICB4ID0gd2lkZXJlc3VsdCAmIDI1NTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE9TMiAqLworICAgIH0gZWxzZSB4ID0gLTE7CisgICAgaWYgKGJyYWNlICYmICpwID09ICd9JyAmJiB4ID4gLTEpCS8qIFBvaW50IHBhc3QgY2xvc2luZyBicmFjZSwgaWYgYW55ICovCisgICAgICBwKys7CisgICAgKnMgPSBwOwkJCQkvKiBQb2ludCB0byBuZXh0IGNoYXIgYWZ0ZXIgc2VxdWVuY2UgKi8KKyAgICByZXR1cm4oeCk7CQkJCS8qIFJldHVybiB2YWx1ZSBvZiBzZXF1ZW5jZSAqLworfQorCitpbnQJCQkJCS8qIENvbnZlcnQgaGV4IHN0cmluZyB0byBpbnQgKi8KKyNpZmRlZiBDS19BTlNJQwordW5oZXgoY2hhciB4KQorI2Vsc2UKK3VuaGV4KHgpIGNoYXIgeDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdW5oZXggKi8geworCisgICAgaWYgKHggPj0gJzAnICYmIHggPD0gJzknKQkJLyogMC05IGlzIG9mZnNldCBieSBoZXggMzAgKi8KKyAgICAgIHJldHVybih4IC0gMHgzMCk7CisgICAgZWxzZSBpZiAoeCA+PSAnQScgJiYgeCA8PSAnRicpCS8qIEEtRiBvZmZzZXQgYnkgaGV4IDM3ICovCisgICAgICByZXR1cm4oeCAtIDB4MzcpOworICAgIGVsc2UgaWYgKHggPj0gJ2EnICYmIHggPD0gJ2YnKQkvKiBhLWYgb2Zmc2V0IGJ5IGhleCA1NyAqLworICAgICAgcmV0dXJuKHggLSAweDU3KTsJCQkvKiAob2J2aW91c2x5IEFTQ0lJIGRlcGVuZGVudCkgKi8KKyAgICBlbHNlIHJldHVybigtMSk7Cit9CisKKy8qICBMIE8gTyBLIFUgUCAgLS0gIExvb2t1cCB0aGUgc3RyaW5nIGluIHRoZSBnaXZlbiBhcnJheSBvZiBzdHJpbmdzICAqLworCisvKgorICBDYWxsIHRoaXMgd2F5OiAgdiA9IGxvb2t1cCh0YWJsZSx3b3JkLG4sJngpOworCisgICAgdGFibGUgLSBhICdzdHJ1Y3Qga2V5dGFiJyB0YWJsZS4KKyAgICB3b3JkICAtIHRoZSB0YXJnZXQgc3RyaW5nIHRvIGxvb2sgdXAgaW4gdGhlIHRhYmxlLgorICAgIG4gICAgIC0gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUuCisgICAgeCAgICAgLSBhZGRyZXNzIG9mIGFuIGludGVnZXIgZm9yIHJldHVybmluZyB0aGUgdGFibGUgYXJyYXkgaW5kZXgsCisJICAgIG9yIE5VTEwgaWYgeW91IGRvbid0IG5lZWQgYSB0YWJsZSBpbmRleC4KKworICBUaGUga2V5d29yZCB0YWJsZSBtdXN0IGJlIGFycmFuZ2VkIGluIGFzY2VuZGluZyBhbHBoYWJldGljYWwgb3JkZXI7CisgIGFscGhhYmV0aWMgY2FzZSBkb2Vzbid0IG1hdHRlciBidXQgbGV0dGVycyBhcmUgdHJlYXRlZCBhcyBsb3dlcmNhc2UKKyAgZm9yIHB1cnBvc2VzIG9mIG9yZGVyaW5nOyB0aHVzICJeIiBhbmQgIl8iIGNvbWUgKmJlZm9yZSogdGhlIGxldHRlcnMsCisgIG5vdCBhZnRlciB0aGVtLgorCisgIFJldHVybnMgdGhlIGtleXdvcmQncyBhc3NvY2lhdGVkIHZhbHVlICh6ZXJvIG9yIGdyZWF0ZXIpIGlmIGZvdW5kLAorICB3aXRoIHRoZSB2YXJpYWJsZSB4IHNldCB0byB0aGUga2V5d29yZC10YWJsZSBpbmRleC4gIElmIGlzIGxvb2t1cCgpCisgIGlzIG5vdCBzdWNjZXNzZnVsLCBpdCByZXR1cm5zOgorCisgICAtMyBpZiBub3RoaW5nIHRvIGxvb2sgdXAgKHRhcmdldCB3YXMgbnVsbCksCisgICAtMiBpZiBhbWJpZ3VvdXMsCisgICAtMSBpZiBub3QgZm91bmQuCisKKyAgQSBtYXRjaCBpcyBzdWNjZXNzZnVsIGlmIHRoZSB0YXJnZXQgbWF0Y2hlcyBhIGtleXdvcmQgZXhhY3RseSwgb3IgaWYKKyAgdGhlIHRhcmdldCBpcyBhIHByZWZpeCBvZiBleGFjdGx5IG9uZSBrZXl3b3JkLiAgSXQgaXMgYW1iaWd1b3VzIGlmIHRoZQorICB0YXJnZXQgbWF0Y2hlcyB0d28gb3IgbW9yZSBrZXl3b3JkcyBmcm9tIHRoZSB0YWJsZS4KKworICBMb29rdXAoKSBpcyB0aGUgY3JpdGljYWwgcm91dGluZSBpbiBzY3JpcHRzIGFuZCBzbyBpcyBvcHRpbWl6ZWQgd2l0aCBhCisgIHNpbXBsZSBzdGF0aWMgY2FjaGUgcGx1cyBzb21lIG90aGVyIHRyaWNrcy4gIE1heWJlIGl0IGNvdWxkIGJlIGltcHJvdmVkCisgIGZ1cnRoZXIgd2l0aCBiaW5hcnkgc2VhcmNoIG9yIGhhc2ggdGVjaG5pcXVlcyBidXQgSSBkb3VidCBpdCBzaW5jZSBtb3N0CisgIGtleXdvcmQgdGFibGVzIGFyZSBmYWlybHkgc2hvcnQuCisqLworCisjaWZkZWYgVVNFX0xVQ0FDSEUJCQkvKiBMb29rdXAgY2FjaGUgKi8KK2V4dGVybiBpbnQgbHVzaXplOwkJCS8qIChpbml0aWFsaXplZCBpbiBja3V1czUuYykgKi8KK2V4dGVybiBjaGFyICogbHVjbWRbXTsKK2V4dGVybiBpbnQgbHV2YWxbXTsKK2V4dGVybiBpbnQgbHVpZHhbXTsKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiICogbHV0YWJbXTsKK2xvbmcgbHVoaXRzID0gMEw7Citsb25nIGx1Y2FsbHMgPSAwTDsKK2xvbmcgeHhoaXRzID0gMEw7Citsb25nIGx1bG9vcCA9IDBMOworI2VuZGlmIC8qIFVTRV9MVUNBQ0hFICovCisKK2ludAorbG9va3VwKHRhYmxlLGNtZCxuLHgpIGNoYXIgKmNtZDsgc3RydWN0IGtleXRhYiB0YWJsZVtdOyBpbnQgbiwgKng7IHsKKworICAgIHJlZ2lzdGVyIGludCBpLCBtOworICAgIGludCB2LCBsZW4sIGNtZGxlbiA9IDA7CisgICAgY2hhciBjID0gTlVMLCBjMSwgKnM7CisKKy8qIEdldCAxc3QgY2hhciBvZiBzZWFyY2ggb2JqZWN0LCBpZiBpdCdzIG51bGwgcmV0dXJuIC0zLiAqLworCisgICAgaWYgKCFjbWQgfHwgbiA8IDEpCQkJLyogRGVmZW5zZSBkZSBudWxsYXJnICovCisgICAgICByZXR1cm4oLTMpOworICAgIGMxID0gKmNtZDsJCQkJLyogRmlyc3QgY2hhcmFjdGVyICovCisgICAgaWYgKCFjMSkJCQkJLyogTWFrZSBzdXJlIHRoZXJlIGlzIG9uZSAqLworICAgICAgcmV0dXJuKC0zKTsKKyAgICBpZiAoaXN1cHBlcihjMSkpCQkJLyogSWYgbGV0dGVyIG1ha2UgaXQgbG93ZXJjYXNlICovCisgICAgICBjMSA9IHRvbG93ZXIoYzEpOworCisjaWZkZWYgVVNFX0xVQ0FDSEUJCQkvKiBsb29rdXAoKSBjYWNoZSAqLworICAgIG0gPSBsdXNpemU7CisgICAgbHVjYWxscysrOwkJCQkvKiBDb3VudCB0aGlzIGxvb2t1cCgpIGNhbGwgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7CQkvKiBMb29wIHRocnUgY2FjaGUgKi8KKwlpZiAoKihsdWNtZFtpXSkgPT0gYzEpIHsJLyogU2FtZSBhcyAxc3QgY2hhciBvZiBzZWFyY2ggaXRlbT8gKi8KKwkgICAgaWYgKGx1dGFiW2ldID09IHRhYmxlKSB7CS8qIFllcyAtIHNhbWUgdGFibGUgdG9vPyAqLworCQlpZiAoIXN0cmNtcChjbWQsbHVjbWRbaV0pKSB7IC8qIFllcyAtIGNvbXBhcmUgKi8KKwkJICAgIGlmICh4KSAqeCA9IGx1aWR4W2ldOyAgICAvKiBNYXRjaCAtIHJldHVybiBpbmRleCAqLworCQkgICAgbHVoaXRzKys7ICAgICAgICAgICAgICAgIC8qIENvdW50IGNhY2hlIGhpdCAqLworCQkgICAgcmV0dXJuKGx1dmFsW2ldKTsgICAgICAgIC8qIFJldHVybiBhc3NvY2lhdGVkIHZhbHVlICovCisJCX0KKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYgLyogVVNFX0xVQ0FDSEUgKi8KKworLyogTm90IG51bGwsIG5vdCBpbiBjYWNoZSwgbG9vayBpdCB1cCAqLworCisgICAgcyA9IGNtZDsKKyAgICB3aGlsZSAoKnMrKykgY21kbGVuKys7CQkvKiBMZW5ndGggb2YgdGFyZ2V0ICovCisvKgorICBRdWljayBiaW5hcnkgc2VhcmNoIHRvIGZpbmQgbGFzdCB0YWJsZSBlbnRyeSB3aG9zZSBmaXJzdCBjaGFyYWN0ZXIgaXMKKyAgbGV4aWNhbGx5IGxlc3MgdGhhbiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzZWFyY2ggb2JqZWN0LiAgVGhpcyBpcworICB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIG5leHQgbG9vcCwgd2hpY2ggbXVzdCBnbyBpbiBzZXF1ZW5jZSBzaW5jZSBpdAorICBjb21wYXJlcyBhZGphY2VudCB0YWJsZSBlbnRyaWVzLgorKi8KKyAgICBpZiAobiA8IDUpIHsJCQkvKiBOb3Qgd29ydGggaXQgZm9yIHNtYWxsIHRhYmxlcyAqLworCWkgPSAwOworICAgIH0gZWxzZSB7CisJaW50IGxvID0gMDsKKwlpbnQgaGkgPSBuOworCWludCBjb3VudCA9IDA7CisJd2hpbGUgKGxvKzIgPCBoaSAmJiArK2NvdW50IDwgMTIpIHsKKwkgICAgaSA9IGxvICsgKChoaSAtIGxvKSAvIDIpOworCSAgICBjID0gKih0YWJsZVtpXS5rd2QpOworCSAgICBpZiAoaXN1cHBlcihjKSkgYyA9IHRvbG93ZXIoYyk7CisJICAgIGlmIChjIDwgYzEpIHsKKwkJbG8gPSBpOworCSAgICB9IGVsc2UgeworCQloaSA9IGk7CisJICAgIH0KKwl9CisJaSA9IChjIDwgYzEpID8gbG8rMSA6IGxvOworI2lmZGVmIFVTRV9MVUNBQ0hFCisJaWYgKGkgPiAwKSB4eGhpdHMrKzsKKyNlbmRpZiAvKiBVU0VfTFVDQUNIRSAqLworICAgIH0KKyAgICBmb3IgKCA7IGkgPCBuLTE7IGkrKykgeworI2lmZGVmIFVTRV9MVUNBQ0hFCisJbHVsb29wKys7CisjZW5kaWYgLyogVVNFX0xVQ0FDSEUgKi8KKwl2ID0gMDsKKwljID0gKih0YWJsZVtpXS5rd2QpOworCWlmIChjKSB7CisJICAgIGlmIChpc3VwcGVyKGMpKSBjID0gdG9sb3dlcihjKTsKKworCSAgICAvKiBUaGUgZm9sbG93aW5nIGlzIGEgYmlnIHBlcmZvcm1hbmNlIGJvb3N0ZXIgYnV0IG1ha2VzIGl0ICovCisJICAgIC8qIGFic29sdXRlbHkgZXNzZW50aWFsIHRoYXQgYWxsIGxvb2t1cCgpIHRhYmxlcyBhcmUgaW4gb3JkZXIuICovCisKKwkgICAgaWYgKGMgPiBjMSkJCQkvKiBMZWF2ZSBlYXJseSBpZiBwYXN0IG91ciBtYXJrICovCisJICAgICAgcmV0dXJuKC0xKTsKKworI2lmZGVmIERFQlVHCisJICAgIC8qIFVzZSBMT0cgREVCVUcgdG8gY2hlY2sgKi8KKworCSAgICBpZiAoZGVibG9nKSB7CisJCWlmIChja3N0cmNtcCh0YWJsZVtpXS5rd2QsdGFibGVbaSsxXS5rd2QsMCwwKSA+IDApIHsKKwkJICAgIHByaW50ZigiVEFCTEUgT1VUIE9GIE9SREVSIFslc10gWyVzXVxuIiwKKwkJCSAgIHRhYmxlW2ldLmt3ZCx0YWJsZVtpKzFdLmt3ZCk7CisKKwkJfQorCSAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKworCSAgICBpZiAoYyA9PSBjMSkgeworCQlsZW4gPSAwOworCQlzID0gdGFibGVbaV0ua3dkOworCQl3aGlsZSAoKnMrKykgbGVuKys7CisJCWlmICgobGVuID09IGNtZGxlbiAmJiAhY2tzdHJjbXAodGFibGVbaV0ua3dkLGNtZCxsZW4sMCkpIHx8CisJCSAgICAoKHYgPSAhY2tzdHJjbXAodGFibGVbaV0ua3dkLGNtZCxjbWRsZW4sMCkpICYmCisJCSAgICAgY2tzdHJjbXAodGFibGVbaSsxXS5rd2QsY21kLGNtZGxlbiwwKSkpIHsKKwkJICAgIGlmICh4KSAqeCA9IGk7CisJCSAgICByZXR1cm4odGFibGVbaV0ua3d2YWwpOworCQl9CisJICAgIH0gZWxzZSB2ID0gMDsKKwl9CisgICAgICAgIGlmICh2KSB7CQkJLyogQW1iaWd1b3VzICovCisJICAgIGlmICh4KSAqeCA9IGk7CQkvKiBTZXQgaW5kZXggb2YgZmlyc3QgbWF0Y2ggKi8KKwkgICAgcmV0dXJuKC0yKTsKKwl9CisgICAgfQorCisvKiBMYXN0IChvciBvbmx5KSBlbGVtZW50ICovCisKKyAgICBpZiAoIWNrc3RyY21wKHRhYmxlW24tMV0ua3dkLGNtZCxjbWRsZW4sMCkpIHsKKyAgICAgICAgaWYgKHgpICp4ID0gbi0xOworCWRlYnVnKEYxMTEsImxvb2t1cCIsdGFibGVbaV0ua3dkLHRhYmxlKTsKKyAgICAgICAgcmV0dXJuKHRhYmxlW24tMV0ua3d2YWwpOworICAgIH0gZWxzZSByZXR1cm4oLTEpOworfQorCisvKgorICB4IGwgbyBvIGsgdSBwCisKKyAgTGlrZSBsb29rdXAsIGJ1dCByZXF1aXJlcyBhIGZ1bGwgKGJ1dCBjYXNlLWluZGVwZW5kZW50KSBtYXRjaAorICBhbmQgZG9lcyBOT1QgcmVxdWlyZSB0aGUgdGFibGUgdG8gYmUgaW4gb3JkZXIuCisqLworaW50Cit4bG9va3VwKHRhYmxlLGNtZCxuLHgpIHN0cnVjdCBrZXl0YWIgdGFibGVbXTsgY2hhciAqY21kOyBpbnQgbiwgKng7IHsKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICBpbnQgbGVuLCBjbWRsZW4sIG9uZSA9IDA7CisgICAgcmVnaXN0ZXIgY2hhciBjLCBjMiwgKiBzLCAqIHMyOworCisgICAgaWYgKCFjbWQpIGNtZCA9ICIiOwkJCS8qIENoZWNrIGFyZ3MgKi8KKyAgICBpZiAoISpjbWQgfHwgbiA8IDEpIHJldHVybigtMyk7CisKKyAgICBjID0gKmNtZDsJCQkJLyogRmlyc3QgY2hhciBvZiBzdHJpbmcgdG8gbG9vayB1cCAqLworICAgIGlmICghKihjbWQrMSkpIHsJCQkvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciAxLWNoYXIgbmFtZXMgKi8KKwljbWRsZW4gPSAxOworCWlmIChpc3VwcGVyKGMpKQorCSAgYyA9IHRvbG93ZXIoYyk7CisJb25lID0gMTsKKyAgICB9IGVsc2UgeworCWNtZGxlbiA9IDA7CisJcyA9IGNtZDsKKwl3aGlsZSAoKnMrKykgY21kbGVuKys7CisJYyA9ICpjbWQ7CisJaWYgKGlzdXBwZXIoYykpCisJICBjID0gdG9sb3dlcihjKTsKKyAgICB9CisgICAgaWYgKGNtZGxlbiA8IDEpCisgICAgICByZXR1cm4oLTMpOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCXMgPSB0YWJsZVtpXS5rd2Q7CQkvKiBUaGlzIGVudHJ5ICovCisJaWYgKCFzKSBzID0gIiI7CisJaWYgKCEqcykgY29udGludWU7CQkvKiBFbXB0eSB0YWJsZSBlbnRyeSAqLworCWMyID0gKnM7CisJaWYgKGlzdXBwZXIoYzIpKSBjMiA9IHRvbG93ZXIoYzIpOworCWlmIChjICE9IGMyKSBjb250aW51ZTsJCS8qIEZpcnN0IGNoYXIgZG9lc24ndCBtYXRjaCAqLworCWlmIChvbmUpIHsJCQkvKiBOYW1lIGlzIG9uZSBjaGFyIGxvbmcgKi8KKwkgICAgaWYgKCEqKHMrMSkpIHsKKwkJaWYgKHgpICp4ID0gaTsKKyAgICAgICAgICAgICAgICAqY21kID0gYzsgCisJCXJldHVybih0YWJsZVtpXS5rd3ZhbCk7CS8qIFNvIGlzIHRhYmxlIGVudHJ5ICovCisJICAgIH0KKwl9IGVsc2UgewkJCS8qIE90aGVyd2lzZSBkbyBzdHJpbmcgY29tcGFyaXNvbiAqLworCSAgICBzMiA9IHM7CisJICAgIGxlbiA9IDA7CisJICAgIHdoaWxlICgqczIrKykgbGVuKys7CisJICAgIGlmIChsZW4gPT0gY21kbGVuICYmICFja3N0cmNtcChzLGNtZCwtMSwwKSkgeworCQlpZiAoeCkgKnggPSBpOworCQlyZXR1cm4odGFibGVbaV0ua3d2YWwpOworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4oLTEpOworfQorCisvKiBSZXZlcnNlIGxvb2t1cCAqLworCitjaGFyICoKK3Jsb29rdXAodGFibGUsbix4KSBzdHJ1Y3Qga2V5dGFiIHRhYmxlW107IGludCBuLCB4OyB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpZiAodGFibGVbaV0ua3d2YWwgPT0geCkKKwkgIHJldHVybih0YWJsZVtpXS5rd2QpOworICAgIH0KKyAgICByZXR1cm4oTlVMTCk7Cit9CisKKyNpZm5kZWYgTk9JQ1AKK2ludAorY21kc3F1byh4KSBpbnQgeDsgeworICAgIHF1b3RpbmcgPSB4OworICAgIHJldHVybigxKTsKK30KKworaW50CitjbWRncXVvKCkgeworICAgIHJldHVybihxdW90aW5nKTsKK30KKyNlbmRpZiAvKiBOT0lDUCAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdWNtZC5oIGIvY2tlcm1pdC04LjAuMjExL2NrdWNtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OTQ4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2t1Y21kLmgKQEAgLTAsMCArMSwzMDIgQEAKKy8qICBDIEsgVSBDIE0gRCAuIEggIC0tICBIZWFkZXIgZmlsZSBmb3IgVW5peCBjbWQgcGFja2FnZSAgKi8KKworLyoKKyAgQXV0aG9yOiBGcmFuayBkYSBDcnV6IDxmZGNAY29sdW1iaWEuZWR1PgorICBDb2x1bWJpYSBVbml2ZXJzaXR5IEtlcm1pdCBQcm9qZWN0LCBOZXcgWW9yayBDaXR5LgorCisgIENvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisqLworCisjaWZuZGVmIENLVUNNRF9ICisjZGVmaW5lIENLVUNNRF9ICisKKy8qIENvbW1hbmQgcmVjYWxsICovCisKKyNpZmRlZiBwZHAxMQkJCQkvKiBOb3QgZW5vdWdoIHJvb20gZm9yIHRoaXMgKi8KKyNpZm5kZWYgTk9SRUNBTEwKKyNkZWZpbmUgTk9SRUNBTEwKKyNlbmRpZiAvKiBOT1JFQ0FMTCAqLworI2VuZGlmIC8qIHBkcDExICovCisKKyNpZmRlZiBEWU5BTUlDCQkJCS8qIER5bmFtaWMgY29tbWFuZCBidWZmZXJzICovCisvKgorICBVc2UgbWFsbG9jKCkgdG8gYWxsb2NhdGUgdGhlIG1hbnkgY29tbWFuZC1yZWxhdGVkIGJ1ZmZlcnMgaW4gY2t1Y21kLmMuCisqLworI2lmbmRlZiBEQ01EQlVGCisjaWZuZGVmIE5PUkVDQUxMCisjZGVmaW5lIE5PUkVDQUxMCisjZW5kaWYgLyogTk9SRUNBTEwgKi8KKyNlbmRpZiAvKiBEQ01EQlVGICovCisKKyNpZm5kZWYgTk9SRUNBTEwKKyNkZWZpbmUgQ0tfUkVDQUxMCisjZWxzZQorI2lmZGVmIENLX1JFQ0FMTAorI3VuZGVmIENLX1JFQ0FMTAorI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworI2VuZGlmIC8qIE5PUkVDQUxMICovCisjZWxzZQorI2lmbmRlZiBOT1JFQ0FMTAorI2RlZmluZSBOT1JFQ0FMTAorI2VuZGlmIC8qICBOT1JFQ0FMTCAqLworI2VuZGlmIC8qIERZTkFNSUMgKi8KKworI2lmZGVmIE5PUkVDQUxMCisjaWZkZWYgQ0tfUkVDQUxMCisjdW5kZWYgQ0tfUkVDQUxMCisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisjZW5kaWYgLyogTk9SRUNBTEwgKi8KKworI2lmZGVmIE5PUkVDQUxMCisjaWZuZGVmIE5PQVJST1dLRVlTCisjZGVmaW5lIE5PQVJST1dLRVlTCisjZW5kaWYgLyogTk9BUlJPV0tFWVMgKi8KKyNlbmRpZiAvKiBOT1JFQ0FMTCAqLworCisvKiBTcGVjaWFsIGdldGNoYXJzICovCisKKyNpZmRlZiBWTVMKKyNpZmRlZiBnZXRjaGFyCQkJCS8qIFRoaXMgaXMgZm9yIFZNUyBHQ0MgKi8KKyN1bmRlZiBnZXRjaGFyCisjZW5kaWYgLyogZ2V0Y2hhciAqLworI2RlZmluZSBnZXRjaGFyKCkgICB2bXNfZ2V0Y2hhcigpCitpbnQgdm1zX2dldGNoYXIodm9pZCk7CisjZW5kaWYgLyogVk1TICovCisKKyNpZmRlZiBhZWdpcworI3VuZGVmIGdldGNoYXIKKyNkZWZpbmUgZ2V0Y2hhcigpICAgY29uaW5jKDApCisjZW5kaWYgLyogYWVnaXMgKi8KKworI2lmZGVmIEFNSUdBCisjdW5kZWYgZ2V0Y2hhcgorI2RlZmluZSBnZXRjaGFyKCkgY29uaW5jKDApCisjZW5kaWYgLyogQU1JR0EgKi8KKworI2lmZGVmIFBsYW45CisjdW5kZWYgZ2V0Y2hhcgorI2RlZmluZSBnZXRjaGFyKCkgY29uaW5jKDApCisjdW5kZWYgcHV0Y2hhcgorI2RlZmluZSBwdXRjaGFyKGMpIGNvbm9jKGMpCisjdW5kZWYgcHJpbnRmCisjZGVmaW5lIHByaW50ZiBjb25wcmludAorI2VuZGlmIC8qIFBsYW45ICovCisKKy8qIFNpemVzIG9mIHRoaW5ncyAqLworCisjaWZuZGVmIENNRERFUAorI2lmZGVmIEJJR0JVRk9LCisjZGVmaW5lIENNRERFUCAgNjQJCQkvKiBNYXhpbXVtIGNvbW1hbmQgcmVjdXJzaW9uIGRlcHRoICovCisjZWxzZQorI2RlZmluZSBDTURERVAgIDIwCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKyNlbmRpZiAvKiBDTURERVAgKi8KKyNkZWZpbmUgSExQTFcgICA3OAkJCS8qIFdpZHRoIG9mID8taGVscCBsaW5lICovCisjZGVmaW5lIEhMUENXICAgMTkJCQkvKiBXaWR0aCBvZiA/LWhlbHAgY29sdW1uICovCisjZGVmaW5lIEhMUEJMICAxMDAJCQkvKiBIZWxwIHN0cmluZyBidWZmZXIgbGVuZ3RoICovCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgQVRNQkwgMTAyMzgJCQkvKiBDb21tYW5kIGF0b20gYnVmZmVyIGxlbmd0aCovCisjZWxzZQorI2lmZGVmIE5PU1BMCisjZGVmaW5lIEFUTUJMICAyNTYKKyNlbHNlCisjZGVmaW5lIEFUTUJMICAxMDI0CisjZW5kaWYgLyogTk9TUEwgKi8KKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworCisjaWZuZGVmIENNREJMCisjaWZkZWYgTk9TUEwKKy8qIE5vIHNjcmlwdCBwcm9ncmFtbWluZyBsYW5ndWFnZSwgc2F2ZSBzb21lIHNwYWNlICovCisjZGVmaW5lIENNREJMIDYwOAkJCS8qIENvbW1hbmQgYnVmZmVyIGxlbmd0aCAqLworI2Vsc2UKKyNpZmRlZiBCSUdCVUZPSworI2RlZmluZSBDTURCTCAzMjc2MworI2Vsc2UKKyNkZWZpbmUgQ01EQkwgNDA5MgorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PU1BMICovCisjZW5kaWYgLyogQ01EQkwgKi8KKworLyogU3BlY2lhbCBjaGFyYWN0ZXJzICovCisKKyNkZWZpbmUgUkRJUyAwMDIyCQkJLyogUmVkaXNwbGF5ICAgKF5SKSAqLworI2RlZmluZSBMREVMIDAwMjUJCQkvKiBEZWxldGUgbGluZSAoXlUpICovCisjZGVmaW5lIFdERUwgMDAyNwkJCS8qIERlbGV0ZSB3b3JkICheVykgKi8KKyNpZmRlZiBDS19SRUNBTEwKKyNkZWZpbmUgQ19VUCAwMDIwCQkJLyogR28gVXAgaW4gcmVjYWxsIGJ1ZmZlciAoXlApICovCisjZGVmaW5lIENfVVAyIDAwMDIJCQkvKiBBbHRlcm5hdGUgR28gVXAgKF5CKSBmb3IgVk1TICovCisjZGVmaW5lIENfRE4gMDAxNgkJCS8qIEdvIERvd24gaW4gcmVjYWxsIGJ1ZmZlciAoXk4pICovCisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisKKy8qIEtleXdvcmQgZmxhZ3MgKGJpdHMsIHBvd2VycyBvZiAyKSAqLworCisjZGVmaW5lIENNX0lOViAxCQkJLyogSW52aXNpYmxlIGtleXdvcmQgKi8KKyNkZWZpbmUgQ01fQUJSIDIJCQkvKiBBYmJyZXZpYXRpb24gZm9yIGFub3RoZXIga2V5d29yZCAqLworI2RlZmluZSBDTV9ITFAgNAkJCS8qIEhlbHAtb25seSBrZXl3b3JkICovCisjZGVmaW5lIENNX0FSRyA4CQkJLyogQW4gYXJndW1lbnQgaXMgcmVxdWlyZWQgKi8KKyNkZWZpbmUgQ01fTk9SIDE2CQkJLyogTm8gcmVjYWxsIGZvciB0aGlzIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01fUFJFIDMyCQkJLyogTG9uZy1mb3JtIGNtZGxpbmUgYXJnIGZvciBwcmVzY2FuICovCisjZGVmaW5lIENNX1BTSCA2NAkJCS8qIENvbW1hbmQgZGlzYWJsZWQgaWYgbm9wdXNoICovCisjZGVmaW5lIENNX0xPQyAxMjgJCQkvKiBDb21tYW5kIGRpc2FibGVkIGlmIG5vbG9jYWwgKi8KKworLyoKKyAgQSBsb25nLWZvcm0gY29tbWFuZCBsaW5lIG9wdGlvbiBpcyBhIGtleXdvcmQgdXNpbmcgdGhlIHJlZ3VsYXIgc3RydWN0IGtleXRhYgorICBhbmQgbG9va3VwIG1lY2hhbmlzbXMuICBGbGFncyB0aGF0IG1ha2Ugc2Vuc2UgaW4gdGhpcyBjb250ZXh0IGFyZSBDTV9BUkcsCisgIGluZGljYXRpbmcgdGhpcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgKG9wZXJhbmQpLCBhbmQgQ01fUFJFLCB3aGljaAorICBtZWFucyB0aGlzIG9wdGlvbiBtdXN0IGJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUuICBUaGUKKyAgYWJzZW5jZSBvZiBDTV9QUkUgbWVhbnMgdGhlIG9wdGlvbiBpcyB0byBiZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlCisgIGluaXRpYWxpemF0aW9uIGZpbGUgaW4gdGhlIG5vcm1hbCBtYW5uZXIuCisqLworCisvKiBUb2tlbiBmbGFncyAobnVtYmVycykgKi8KKworI2RlZmluZSBDTVRfQ09NIDAJCQkvKiBDb21tZW50ICg7IG9yICMpICovCisjZGVmaW5lIENNVF9TSEUgMQkJCS8qIFNoZWxsIGVzY2FwZSAoISkgKi8KKyNkZWZpbmUgQ01UX0xCTCAyCQkJLyogTGFiZWwgKDopICovCisjZGVmaW5lIENNVF9GSUwgMwkJCS8qIEluZGlyZWN0IGZpbGVzcGVjIChAKSAobm90IHVzZWQpICovCisKKy8qIFBhdGggc2VwYXJhdG9yIGZvciBwYXRoIHNlYXJjaGVzICovCisKKyNpZmRlZiBPUzIKKyNkZWZpbmUgUEFUSFNFUCAnOycKKyNlbHNlCisjaWZkZWYgVU5JWAorI2RlZmluZSBQQVRIU0VQICc6JworI2Vsc2UKKyNkZWZpbmUgUEFUSFNFUCAnLCcKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgQ0tfS0VZVEFCCisjZGVmaW5lIENLX0tFWVRBQgorCisvKiBLZXl3b3JkIFRhYmxlIFRlbXBsYXRlIHBlcmhhcHMgYWxyZWFkeSBkZWZpbmVkIGluIGNrY2RlYi5oICovCisKK3N0cnVjdCBrZXl0YWIgewkJCQkvKiBLZXl3b3JkIHRhYmxlICovCisgICAgY2hhciAqa3dkOwkJCQkvKiBQb2ludGVyIHRvIGtleXdvcmQgc3RyaW5nICovCisgICAgaW50IGt3dmFsOwkJCQkvKiBBc3NvY2lhdGVkIHZhbHVlICovCisgICAgaW50IGZsZ3M7CQkJCS8qIEZsYWdzIChhcyBkZWZpbmVkIGFib3ZlKSAqLworfTsKKyNlbmRpZiAvKiBDS19LRVlUQUIgKi8KKworLyogU3RyaW5nIHByZXByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKworI2lmZGVmIENLX0FOU0lDCQkJCS8qIEFOU0kgQyAqLworI2lmZGVmIE1fU1lTVgkJCQkvKiBTQ08gTWljcm9zb2Z0IEMgd2FudHMgbm8gYXJncyAqLwordHlwZWRlZiBpbnQgKCp4eF9zdHJwKSgpOworI2Vsc2UKK3R5cGVkZWYgaW50ICgqeHhfc3RycCkoY2hhciAqLCBjaGFyICoqLCBpbnQgKik7CisjZW5kaWYgLyogTV9TWVNWICovCisjZWxzZQkJCQkJLyogTm90IEFOU0kgQyAqLwordHlwZWRlZiBpbnQgKCp4eF9zdHJwKSgpOworI2VuZGlmIC8qIENLX0FOU0lDICovCisKKy8qIEZMRERCIHN0cnVjdCAqLworCit0eXBlZGVmIHN0cnVjdCBGREIgeworICAgIGludCBmY29kZTsJCQkJLyogRnVuY3Rpb24gY29kZSAqLworICAgIGNoYXIgKiBobHBtc2c7CQkJLyogSGVscCBtZXNzYWdlICovCisgICAgY2hhciAqIGRmbHQ7CQkJLyogRGVmYXVsdCAqLworICAgIGNoYXIgKiBzZGF0YTsJCQkvKiBBZGRpdGlvbmFsIHN0cmluZyBkYXRhICovCisgICAgaW50IG5kYXRhMTsJCQkJLyogQWRkaXRpb25hbCBudW1lcmljIGRhdGEgMSAqLworICAgIGludCBuZGF0YTI7CQkJCS8qIEFkZGl0aW9uYWwgbnVtZXJpYyBkYXRhIDIgKi8KKyAgICB4eF9zdHJwIHNwZjsJCQkvKiBTdHJpbmcgcHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgIHN0cnVjdCBrZXl0YWIgKiBrd2R0Ymw7CQkvKiBLZXl3b3JkIHRhYmxlICovCisgICAgc3RydWN0IEZEQiAqIG54dGZkYjsJCS8qIFBvaW50ZXIgdG8gbmV4dCBhbHRlcm5hdGl2ZSAqLworfSBmZGI7CisKK3R5cGVkZWYgc3RydWN0IE9GREIgeworICAgIHN0cnVjdCBGREIgKiBmZGJhZGRyOwkJLyogQWRkcmVzcyBvZiBzdWNjZWVkaW5nIEZEQiBzdHJ1Y3QgKi8KKyAgICBpbnQgZmNvZGU7CQkJCS8qIEZ1bmN0aW9uIGNvZGUgKi8KKyAgICBjaGFyICogc3Jlc3VsdDsJCQkvKiBTdHJpbmcgcmVzdWx0ICovCisgICAgaW50IG5yZXN1bHQ7CQkJLyogTnVtZXJpYyByZXN1bHQgKi8KKyAgICBpbnQga2ZsYWdzOwkJCQkvKiBLZXl3b3JkIGZsYWdzIGlmIGFueSAqLworfSBvZmRiOworCisjaWZuZGVmIENLVUNNRF9DCitleHRlcm4gc3RydWN0IE9GREIgY21yZXN1bHQ7CisjZW5kaWYgLyogQ0tVQ01EX0MgKi8KKworLyogQ29kZXMgZm9yIHByaW1hcnkgcGFyc2luZyBmdW5jdGlvbiAgKi8KKworI2RlZmluZSBfQ01OVU0gMAkJCS8qIE51bWJlciAqLworI2RlZmluZSBfQ01PRkkgMQkJCS8qIE91dHB1dCBmaWxlICovCisjZGVmaW5lIF9DTUlGSSAyCQkJLyogSW5wdXQgZmlsZSAqLworI2RlZmluZSBfQ01GTEQgMwkJCS8qIEFyYml0cmFyeSBmaWVsZCAqLworI2RlZmluZSBfQ01UWFQgNAkJCS8qIFRleHQgc3RyaW5nICovCisjZGVmaW5lIF9DTUtFWSA1CQkJLyogS2V5d29yZCAqLworI2RlZmluZSBfQ01DRk0gNgkJCS8qIENvbmZpcm1hdGlvbiAqLworI2RlZmluZSBfQ01EQVQgNwkJCS8qIERhdGUvdGltZSAqLworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCisKK19QUk9UT1RZUCggaW50IHh4ZXNjLCAoY2hhciAqKikgKTsKK19QUk9UT1RZUCggaW50IGNtcmluaSwgKGludCkgKTsKK19QUk9UT1RZUCggVk9JRCBjbXNldHAsIChjaGFyICopICk7CitfUFJPVE9UWVAoIFZPSUQgY21zYXZwLCAoY2hhciBbXSwgaW50KSApOworX1BST1RPVFlQKCBjaGFyICogY21nZXRwLCAoKSApOworX1BST1RPVFlQKCBWT0lEIHByb21wdCwgKHh4X3N0cnApICk7CitfUFJPVE9UWVAoIFZPSUQgcHVzaGNtZCwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggVk9JRCBjbXJlcywgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgY21pbmksIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBjbWdicmssICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgY21na3dmbGdzLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGNtcHVzaCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBjbXBvcCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgdW50YWIsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBjbW51bSwgKGNoYXIgKiwgY2hhciAqLCBpbnQsIGludCAqLCB4eF9zdHJwICkgKTsKK19QUk9UT1RZUCggaW50IGNtb2ZpLCAoY2hhciAqLCBjaGFyICosIGNoYXIgKiosIHh4X3N0cnAgKSApOworX1BST1RPVFlQKCBpbnQgY21pZmksIChjaGFyICosIGNoYXIgKiwgY2hhciAqKiwgaW50ICosIHh4X3N0cnAgKSApOworX1BST1RPVFlQKCBpbnQgY21pb2ZpLCAoY2hhciAqLCBjaGFyICosIGNoYXIgKiosIGludCAqLCB4eF9zdHJwICkgKTsKK19QUk9UT1RZUCggaW50IGNtaWZpcCwoY2hhciAqLCBjaGFyICosIGNoYXIgKiosIGludCAqLCBpbnQsIGNoYXIgKiwgeHhfc3RycCApKTsKK19QUk9UT1RZUCggaW50IGNtaWZpMiwoY2hhciAqLGNoYXIgKixjaGFyICoqLGludCAqLGludCxjaGFyICoseHhfc3RycCxpbnQgKSk7CitfUFJPVE9UWVAoIGludCBjbWRpciwgKGNoYXIgKiwgY2hhciAqLCBjaGFyICoqLCB4eF9zdHJwICkgKTsKK19QUk9UT1RZUCggaW50IGNtZGlycCwgKGNoYXIgKiwgY2hhciAqLCBjaGFyICoqLCBjaGFyICosIHh4X3N0cnAgKSApOworX1BST1RPVFlQKCBpbnQgY21mbGQsIChjaGFyICosIGNoYXIgKiwgY2hhciAqKiwgeHhfc3RycCApICk7CitfUFJPVE9UWVAoIGludCBjbXR4dCwgKGNoYXIgKiwgY2hhciAqLCBjaGFyICoqLCB4eF9zdHJwICkgKTsKK19QUk9UT1RZUCggaW50IGNta2V5LCAgKHN0cnVjdCBrZXl0YWIgW10sIGludCwgY2hhciAqLCBjaGFyICosIHh4X3N0cnApICk7CitfUFJPVE9UWVAoIGludCBjbWtleXgsIChzdHJ1Y3Qga2V5dGFiIFtdLCBpbnQsIGNoYXIgKiwgY2hhciAqLCB4eF9zdHJwKSApOworX1BST1RPVFlQKCBpbnQgY21rZXkyLChzdHJ1Y3Qga2V5dGFiIFtdLGludCxjaGFyICosY2hhciAqLGNoYXIgKix4eF9zdHJwLGludCkpOworX1BST1RPVFlQKCBpbnQgY21zd2ksICAoc3RydWN0IGtleXRhYiBbXSwgaW50LCBjaGFyICosIGNoYXIgKiwgeHhfc3RycCkgKTsKK19QUk9UT1RZUCggaW50IGNtZGF0ZSwoY2hhciAqLCBjaGFyICosIGNoYXIgKiosIGludCwgeHhfc3RycCkgKTsKK19QUk9UT1RZUCggY2hhciAqIGNtcGVlaywgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBjbWZkYiwgKHN0cnVjdCBGREIgKikgKTsKK19QUk9UT1RZUCggVk9JRCBjbWZkYmksIChzdHJ1Y3QgRkRCICosCisJCQlpbnQsIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCwgaW50LCB4eF9zdHJwLAorCQkJc3RydWN0IGtleXRhYiAqLCBzdHJ1Y3QgRkRCICopICk7CitfUFJPVE9UWVAoIGludCBjaGt0b2ssIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBjbWNmbSwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBsb29rdXAsIChzdHJ1Y3Qga2V5dGFiIFtdLCBjaGFyICosIGludCwgaW50ICopICk7CitfUFJPVE9UWVAoIFZPSUQga3dkaGVscCwgKHN0cnVjdCBrZXl0YWJbXSxpbnQsY2hhciAqLGNoYXIgKixjaGFyICosaW50LGludCkgKTsKK19QUk9UT1RZUCggaW50IHVuZ3dvcmQsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIHVudW5ndywgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBjbWRzcXVvLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgY21kZ3F1bywgKHZvaWQpICk7CitfUFJPVE9UWVAoIGNoYXIgKiBja2N2dGRhdGUsIChjaGFyICosIGludCkgKTsKK19QUk9UT1RZUCggaW50IGNtZGdldGMsIChpbnQpKTsKKyNpZm5kZWYgTk9BUlJPV0tFWVMKK19QUk9UT1RZUCggaW50IGNtZGNvbmNoaywgKHZvaWQpICk7CisjZW5kaWYgLyogTk9BUlJPV0tFWVMgKi8KKworI2lmZGVmIENLX1JFQ0FMTAorX1BST1RPVFlQKCBjaGFyICogY21nZXRjbWQsIChjaGFyICopICk7CitfUFJPVE9UWVAoIFZPSUQgYWRkY21kLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBWT0lEIGNtYWRkbmV4dCwgKCkgKTsKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KK19QUk9UT1RZUCggY2hhciAqIGNtY3Z0ZGF0ZSwgKGNoYXIgKiwgaW50KSApOworX1BST1RPVFlQKCBjaGFyICogY21kaWZmZGF0ZSwgKGNoYXIgKiwgY2hhciAqKSApOworX1BST1RPVFlQKCBjaGFyICogY21kZWx0YSwgKGludCwKKwkJCSAgICBpbnQsaW50LGludCxpbnQsaW50LGludCxpbnQsaW50LGludCxpbnQsaW50LGludCApKTsKK19QUk9UT1RZUCggY2hhciAqIHNodWZmbGVkYXRlLCAoY2hhciAqLCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBmaWxoZWxwLCAoaW50LCBjaGFyICosIGNoYXIgKiwgaW50LCBpbnQpICk7CisKKyNpZmRlZiBEQ01EQlVGCitfUFJPVE9UWVAoIGludCBjbXNldHVwLCAodm9pZCkgKTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisKKyNlbmRpZiAvKiBDS1VDTURfSCAqLworCisvKiBFbmQgb2YgY2t1Y21kLmggKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja3VjbnMuYyBiL2NrZXJtaXQtOC4wLjIxMS9ja3VjbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTZiMTA2Ci0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrdWNucy5jCkBAIC0wLDAgKzEsMjY3OSBAQAorI2luY2x1ZGUgImNrY3N5bS5oIgorY2hhciAqY29ubnYgPSAiQ09OTkVDVCBDb21tYW5kIGZvciBVTklYOnNlbGVjdCgpLCA4LjAuMTM1LCAyOSBOb3YgMjAwMiI7CisKKy8qICBDIEsgVSBDIE4gUyAgLS0gIFRlcm1pbmFsIGNvbm5lY3Rpb24gdG8gcmVtb3RlIHN5c3RlbSwgZm9yIFVOSVggICovCisvKgorICBBdXRob3I6IEZyYW5rIGRhIENydXogPGZkY0Bjb2x1bWJpYS5lZHU+LAorICBDb2x1bWJpYSBVbml2ZXJzaXR5IEFjYWRlbWljIEluZm9ybWF0aW9uIFN5c3RlbXMsIE5ldyBZb3JrIENpdHkuCisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisKKy8qCisgIFRoaXMgdmVyc2lvbiBvZiB0aGUgVU5JWCBDT05ORUNUIG1vZHVsZSB1c2VzIHNlbGVjdCgpLCB3aGljaCBpcyByZXF1aXJlZCBmb3IKKyAgS2VyYmVyb3MgZW5jcnlwdGlvbi4gIFRodXMgaXQgY2FuIGJlIHVzZWQgb25seSBvbiBVTklYIHN5c3RlbXMgdGhhdCBzdXBwb3J0CisgIHNlbGVjdCgpIG9uIGJvdGggVENQL0lQIGFuZCBzZXJpYWwgY29ubmVjdGlvbnMuICBBIHNlcGFyYXRlIG1vZHVsZSB0aGF0IHVzZXMKKyAgYSBjb21wbGV0ZWx5IHBvcnRhYmxlIGZvcmsoKSBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgb24gc3lzdGVtcyB3aGVyZSBzZWxlY3QoKQorICBpcyBub3QgYXZhaWxhYmxlIG9yIGRvZXMgbm90IHdvcmsgYXMgcmVxdWlyZWQuCisqLworCisjaW5jbHVkZSAiY2tjZGViLmgiCQkJLyogQ29tbW9uIHRoaW5ncyBmaXJzdCAqLworCisjaWZuZGVmIE5PTE9DQUwKKworI2lmZGVmIE9TRjEzCisjaWZkZWYgQ0tfQU5TSUMKKyNpZmRlZiBfTk9fUFJPVE8KKyN1bmRlZiBfTk9fUFJPVE8KKyNlbmRpZiAvKiBfTk9fUFJPVE8gKi8KKyNlbmRpZiAvKiBDS19BTlNJQyAqLworI2VuZGlmIC8qIE9TRjEzICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgkJCS8qIEVycm9yIG51bWJlcnMgKi8KKworI2lmbmRlZiBOT1RJTUVICisjaW5jbHVkZSA8dGltZS5oPgkJCS8qIEZvciBGRF9ibGFoICovCisjaWZkZWYgU1lTVElNRUgJCQkJLyogKElSSVggNS4zKSAqLworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYgLyogU1lTVElNRUggKi8KKyNlbmRpZiAvKiBOT1RJTUVIICovCisKKyNpZmRlZiBCU0Q0MkhBQ0sJCQkvKiBXaHkgaXMgdGhpcyBuZWNlc3Nhcnk/ICovCisjaWZuZGVmIERDTFRJTUVWQUwKKyNkZWZpbmUgRENMVElNRVZBTAorI2VuZGlmIC8qIERDTFRJTUVWQUwgKi8KKyNlbmRpZiAvKiBCU0Q0MkhBQ0sgKi8KKworLyogS2VybWl0LXNwZWNpZmljIGluY2x1ZGVzICovCisKKyNpbmNsdWRlICJja2Nhc2MuaCIJCQkvKiBBU0NJSSBjaGFyYWN0ZXJzICovCisjaW5jbHVkZSAiY2tja2VyLmgiCQkJLyogS2VybWl0IHRoaW5ncyAqLworI2luY2x1ZGUgImNrdWNtZC5oIgkJCS8qIEZvciB4eGVzYygpIHByb3RvdHlwZSAqLworI2luY2x1ZGUgImNrY25ldC5oIgkJCS8qIE5ldHdvcmsgc3ltYm9scyAqLworI2lmbmRlZiBOT0NTRVRTCisjaW5jbHVkZSAiY2tjeGxhLmgiCQkJLyogQ2hhcmFjdGVyIHNldCB0cmFuc2xhdGlvbiAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmZGVmIEJFQk9YCisjaW5jbHVkZSA8a2VybmVsL09TLmg+CisjaW5jbHVkZSA8c29ja2V0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZiAvKiBCRUJPWCAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CQkJLyogU2lnbmFscyAqLworCisvKiBBbGwgdGhlIGZvbGxvd2luZyBpcyBmb3Igc2VsZWN0KCkuLi4gKi8KKworI2lmZGVmIENLVElETEUJCQkJLyogVGltZW91dHMgb25seSBmb3IgU0VUIFRFUk0gSURMRSAqLworCisjaWZuZGVmIERDTFRJTUVWQUwKKyNpZmRlZiBVTklYV0FSRQorI2lmbmRlZiBVVzcKKyNkZWZpbmUgRENMVElNRVZBTAorI2VuZGlmIC8qIFVXNyAqLworI2VuZGlmIC8qIFVOSVhXQVJFICovCisjZW5kaWYgLyogRENMVElNRVZBTCAqLworCisjaWZkZWYgRENMVElNRVZBTAkJCS8qIERlY2xhcmUgdGltZXZhbCBvdXJzZWx2ZXMgKi8KK3N0cnVjdCB0aW1ldmFsIHsKKyAgICBsb25nIHR2X3NlYzsKKyAgICBsb25nIHR2X3VzZWM7Cit9OworI2Vsc2UgIC8qICFEQ0xUSU1FVkFMICovCisjaWZuZGVmIE5PU1lTVElNRUJICisjaWZkZWYgU1lTVElNRUJICisjaW5jbHVkZSA8c3lzL3RpbWViLmg+CisjZW5kaWYgLyogU1lTVElNRUJIICovCisjZW5kaWYgLyogTk9TWVNUSU1FQkggKi8KKyNlbmRpZiAvKiBEQ0xUSU1FVkFMICovCisjZW5kaWYgLyogQ0tUSURMRSAqLworCisjaWZuZGVmIFNDT19PU1I1MDQKKyNpZmRlZiBTRUxFQ1RfSAorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNlbmRpZiAvKiBTRUxFQ1RfSCAqLworI2VuZGlmIC8qIFNDT19PU1I1MDQgKi8KKworI2lmbmRlZiBGRF9TRVRTSVpFCisjaWZkZWYgQ0tfRk9SV0FSRF9YCisjZGVmaW5lIEZEX1NFVFNJWkUgMjU2CisjZWxzZQorI2RlZmluZSBGRF9TRVRTSVpFIDMyCisjZW5kaWYgLyogQ0tfRk9SV0FSRF9YICovCisjZW5kaWYgLyogRkRfU0VUU0laRSAqLworCisjaWZkZWYgSFBVWAorI2lmbmRlZiBIUFVYMTAKKyNpZm5kZWYgSFBVWDExMDAKKy8qIFRoZSB0aHJlZSBpbnRlcmlvciBhcmdzIHRvIHNlbGVjdCgpIGFyZSAoaW50ICopIHJhdGhlciB0aGFuIChmZF9zZXQgKikgKi8KKyNpZm5kZWYgSU5UU0VMRUNUCisjZGVmaW5lIElOVFNFTEVDVAorI2VuZGlmIC8qIElOVFNFTEVDVCAqLworI2VuZGlmIC8qIEhQVVgxMTAwICovCisjZW5kaWYgLyogSFBVWDEwICovCisjZW5kaWYgLyogSFBVWCAqLworCisvKiBJbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisKKyNpZmRlZiBORVdGVFAKKyNlbmRpZiAvKiBORVdGVFAgKi8KK19QUk9UT1RZUCggVk9JRCB0dGZsdXgsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIGRvZXNjLCAoY2hhcikgKTsKK19QUk9UT1RZUCggaW50IGhjb25uZSwgKHZvaWQpICk7CisjaWZuZGVmIE5PU0hPVworX1BST1RPVFlQKCBWT0lEIHNob21kbSwgKHZvaWQpICk7CisjZW5kaWYgLyogTk9TSE9XICovCitfUFJPVE9UWVAoIHN0YXRpYyBpbnQga2JnZXQsICh2b2lkKSApOworX1BST1RPVFlQKCBzdGF0aWMgaW50IGNrY3B1dGYsICh2b2lkKSApOworCisvKiBFeHRlcm5hbCB2YXJpYWJsZXMgKi8KKworZXh0ZXJuIHN0cnVjdCBja19wIHB0YWJbXTsKKworZXh0ZXJuIGludCBsb2NhbCwgZXNjYXBlLCBkdXBsZXgsIHBhcml0eSwgZmxvdywgc2VzbG9nLCBzZXNzZnQsIGRlYnNlcywKKyBtZG10eXAsIHR0bnByb3RvLCBjbWFzaywgY21kbXNrLCBuZXR3b3JrLCBuZXR0eXBlLCBzb3NpLCB0bmxtLAorIHhpdHN0YSwgd2hhdCwgdHR5ZmQsIHR0cGlwZSwgcXVpZXQsIGJhY2tncmQsIHBmbGFnLCB0dF9jcmQsIHRuX25sbSwgdHRmZGZsZywKKyB0dF9lc2NhcGUsIGp1c3RvbmUsIGNhcnJpZXIsIHR0cHR5LCBod3Bhcml0eTsKKworI2lmbmRlZiBOT0RJQUwKK2V4dGVybiBpbnQgZGlhbG1odSwgZGlhbHN0YTsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworI2lmZGVmIENLTEVBUk4KK2V4dGVybiBGSUxFICogbGVhcm5mcDsKK2V4dGVybiBpbnQgbGVhcm5pbmc7CitzdGF0aWMgVUxPTkcgbGVhcm50MTsKK3N0YXRpYyBjaGFyIGxlYXJuYnVmW0xFQVJOQlVGU0laXSA9IHsgTlVMLCBOVUwgfTsKK3N0YXRpYyBpbnQgIGxlYXJuYmMgPSAwOworc3RhdGljIGludCAgbGVhcm5icCA9IDA7CitzdGF0aWMgaW50ICBsZWFybnN0ID0gMDsKKyNlbmRpZiAvKiBDS0xFQVJOICovCisKK2V4dGVybiBsb25nIHNwZWVkOworZXh0ZXJuIGNoYXIgdHRuYW1lW10sIHNlc2ZpbFtdLCBteWhvc3RbXSwgKmNjbnRhYltdOworI2lmZGVmIFROQ09ERQorZXh0ZXJuIGludCB0bl9iX25sbSwgdG5fcmVtX2VjaG87CisjZW5kaWYgLyogVE5DT0RFICovCisKKyNpZmRlZiBDS19UUklHR0VSCitleHRlcm4gY2hhciAqIHR0X3RyaWdnZXJbXSwgKiB0cmlnZ2VydmFsOworI2VuZGlmIC8qIENLX1RSSUdHRVIgKi8KKworI2lmZGVmIENLVElETEUKK2V4dGVybiBpbnQgdHRfaWRsZWxpbWl0LCB0dF9pZGxlYWN0OworZXh0ZXJuIGNoYXIgKiB0dF9pZGxlc3RyOworc3RhdGljIGludCBpZGxlbGltaXQgPSAwOworI2VuZGlmIC8qIENLVElETEUgKi8KK2V4dGVybiBpbnQgY3hfc3RhdHVzOwkJCS8qIENPTk5FQ1Qgc3RhdHVzIGNvZGUgKi8KKworZXh0ZXJuIGludCBub3B1c2g7CisKKyNpZmRlZiBDS19BUEMKK2V4dGVybiBpbnQgYXBjYWN0aXZlOwkJCS8qIEFwcGxpY2F0aW9uIFByb2dyYW0gQ29tbWFuZCAoQVBDKSAqLworZXh0ZXJuIGludCBhcGNzdGF0dXM7CQkJLyogaXRlbXMgLi4uICovCitzdGF0aWMgaW50IGFwY2xlbmd0aCA9IDA7CisjaWZkZWYgRENNREJVRgorZXh0ZXJuIGNoYXIgKmFwY2J1ZjsKKyNlbHNlCitleHRlcm4gY2hhciBhcGNidWZbXTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCitzdGF0aWMgaW50IGFwY2J1ZmxlbiA9IEFQQ0JVRkxFTiAtIDI7CitleHRlcm4gaW50IHByb3RvY29sOworI2VuZGlmIC8qIENLX0FQQyAqLworI2lmbmRlZiBOT1hGRVIKK2V4dGVybiBpbnQgYXV0b2RsOwkJCS8qIEF1dG8gZG93bmxvYWQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIENLX0FVVE9ETAorZXh0ZXJuIENIQVIga3NidWZbXTsKK2V4dGVybiBDSEFSIHN0Y2hyOworZXh0ZXJuIGludCBrc3RhcnRhY3RpdmU7CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCitleHRlcm4gaW50IG1lX2F1dGg7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworCisjaWZkZWYgQ0tfWFlaCisjaWZkZWYgWFlaX0lOVEVSTkFMCitzdGF0aWMgaW50IHptZGxvayA9IDE7CQkJLyogWm1vZGVtIGF1dG9kb3dubG9hZHMgYXZhaWxhYmxlICovCisjZWxzZQorc3RhdGljIGludCB6bWRsb2sgPSAwOwkJCS8qIERlcGVuZHMgb24gZXh0ZXJuYWwgcHJvdG9jb2wgZGVmICovCisjZW5kaWYgLyogWFlaX0lOVEVSTkFMICovCisjZWxzZQorc3RhdGljIGludCB6bWRsb2sgPSAwOwkJCS8qIE5vdCBhdmFpbGFibGUgYXQgYWxsICovCisjZW5kaWYgLyogQ0tfWFlaICovCisKKyNpZm5kZWYgTk9TRVRLRVkJCQkvKiBLZXlib2FyZCBtYXBwaW5nICovCitleHRlcm4gS0VZICprZXltYXA7CQkJLyogU2luZ2xlLWNoYXJhY3RlciBrZXkgbWFwICovCitleHRlcm4gTUFDUk8gKm1hY3JvdGFiOwkJCS8qIEtleSBtYWNybyBwb2ludGVyIHRhYmxlICovCitzdGF0aWMgTUFDUk8ga21wdHIgPSBOVUxMOwkJLyogUG9pbnRlciB0byBjdXJyZW50IGtleSBtYWNybyAqLworI2VuZGlmIC8qIE5PU0VUS0VZICovCisKKy8qIEdsb2JhbCB2YXJpYWJsZXMgbG9jYWwgdG8gdGhpcyBtb2R1bGUgKi8KKworc3RhdGljIGludAorICBhY3RpdmUgPSAwLAorICBxdWl0bm93ID0gMCwJCQkJLyogPGVzYy1jaGFyPlEgd2FzIHR5cGVkICovCisgIGRvaGFuZ3VwID0gMCwJCQkJLyogPGVzYy1jaGFyPkggd2FzIHR5cGVkICovCisgIGluc2hpZnQgPSAwLAkJCQkvKiBTTy9TSSBzaGlmdCBzdGF0ZXMgKi8KKyAgb3V0c2hpZnQgPSAwOworCitzdGF0aWMgY2hhciBlY2J1ZlsxMF0sICplY2JwOwkJLyogRXNjYXBlIGNoYXIgYnVmZmVyICYgcG9pbnRlciAqLworCisjaWZkZWYgQ0tfU01BTEwKKyNkZWZpbmUgSUJVRkwgMTUzNgkJCS8qIElucHV0IGJ1ZmZlciBsZW5ndGggKi8KKyNlbHNlCisjZGVmaW5lIElCVUZMIDQwOTYKKyNlbmRpZiAvKiBDS19TTUFMTCAqLworCitzdGF0aWMgaW50IG9iYyA9IDA7CQkJLyogT3V0cHV0IGJ1ZmZlciBjb3VudCAqLworCisjaWZuZGVmIE9YT1MKKyNkZWZpbmUgT0JVRkwgMTAyNAkJCS8qIE91dHB1dCBidWZmZXIgbGVuZ3RoICovCisjZWxzZQorI2RlZmluZSBPQlVGTCBJQlVGTAorI2VuZGlmIC8qIE9YT1MgKi8KKworI2lmZGVmIEJJR0JVRk9LCisjZGVmaW5lIFRNUExFTiA0MDk2CQkJLyogVGVtcG9yYXJ5IG1lc3NhZ2UgYnVmZmVyIGxlbmd0aCAqLworI2Vsc2UKKyNkZWZpbmUgVE1QTEVOIDIwMAorI2VuZGlmIC8qIEJJR0JVRk9LICovCisKKyNpZmRlZiBEWU5BTUlDCitzdGF0aWMgY2hhciAqaWJ1ZiA9IE5VTEwsICpvYnVmID0gTlVMTCwgKnRlbXAgPSBOVUxMOyAvKiBCdWZmZXJzICovCisjZWxzZQorc3RhdGljIGNoYXIgaWJ1ZltJQlVGTF0sIG9idWZbT0JVRkxdLCB0ZW1wW1RNUExFTl07CisjZW5kaWYgLyogRFlOQU1JQyAqLworCisjaWZkZWYgVE5DT0RFCitzdGF0aWMgY2hhciB0bm9wdFs0XTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKworI2lmZGVmIERZTkFNSUMKK3N0YXRpYyBjaGFyICppYnA7CQkJLyogSW5wdXQgYnVmZmVyIHBvaW50ZXIgKi8KKyNlbHNlCitzdGF0aWMgY2hhciAqaWJwID0gaWJ1ZjsJCS8qIElucHV0IGJ1ZmZlciBwb2ludGVyICovCisjZW5kaWYgLypEWU5BTUlDICovCitzdGF0aWMgaW50IGliYyA9IDA7CQkJLyogSW5wdXQgYnVmZmVyIGNvdW50ICovCisKKyNpZmRlZiBEWU5BTUlDCitzdGF0aWMgY2hhciAqb2JwOwkJCS8qIE91dHB1dCBidWZmZXIgcG9pbnRlciAqLworI2Vsc2UKK3N0YXRpYyBjaGFyICpvYnAgPSBvYnVmOwkJLyogT3V0cHV0IGJ1ZmZlciBwb2ludGVyICovCisjZW5kaWYgLyogRFlOQU1JQyAqLworCisvKiBDaGFyYWN0ZXItc2V0IGl0ZW1zICovCisKK3N0YXRpYyBpbnQgdW5pY29kZSA9IDA7CisKKyNpZm5kZWYgTk9DU0VUUworI2lmZGVmIENLX0FOU0lDIC8qIEFOU0kgQyBwcm90b3R5cGVzLi4uICovCitleHRlcm4gQ0hBUiAoKnhsc1tNQVhUQ1NFVFMrMV1bTUFYRkNTRVRTKzFdKShDSEFSKTsgLyogQ2hhcmFjdGVyIHNldCAqLworZXh0ZXJuIENIQVIgKCp4bHJbTUFYVENTRVRTKzFdW01BWEZDU0VUUysxXSkoQ0hBUik7IC8qIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyAqLworc3RhdGljIENIQVIgKCpzeG8pKENIQVIpOwkvKiBMb2NhbCB0cmFuc2xhdGlvbiBmdW5jdGlvbnMgKi8KK3N0YXRpYyBDSEFSICgqcnhvKShDSEFSKTsJLyogZm9yIG91dHB1dCAoc2VuZGluZykgdGVybWluYWwgY2hhcnMgKi8KK3N0YXRpYyBDSEFSICgqc3hpKShDSEFSKTsJLyogYW5kIGZvciBpbnB1dCAocmVjZWl2aW5nKSB0ZXJtaW5hbCBjaGFycy4gKi8KK3N0YXRpYyBDSEFSICgqcnhpKShDSEFSKTsKKyNlbHNlIC8qIE5vdCBBTlNJIEMuLi4gKi8KK2V4dGVybiBDSEFSICgqeGxzW01BWFRDU0VUUysxXVtNQVhGQ1NFVFMrMV0pKCk7CS8qIENoYXJhY3RlciBzZXQgKi8KK2V4dGVybiBDSEFSICgqeGxyW01BWFRDU0VUUysxXVtNQVhGQ1NFVFMrMV0pKCk7CS8qIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucy4gKi8KK3N0YXRpYyBDSEFSICgqc3hvKSgpOwkJLyogTG9jYWwgdHJhbnNsYXRpb24gZnVuY3Rpb25zICovCitzdGF0aWMgQ0hBUiAoKnJ4bykoKTsJCS8qIGZvciBvdXRwdXQgKHNlbmRpbmcpIHRlcm1pbmFsIGNoYXJzICovCitzdGF0aWMgQ0hBUiAoKnN4aSkoKTsJCS8qIGFuZCBmb3IgaW5wdXQgKHJlY2VpdmluZykgdGVybWluYWwgY2hhcnMuICovCitzdGF0aWMgQ0hBUiAoKnJ4aSkoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworZXh0ZXJuIGludCBsYW5ndWFnZTsJCS8qIEN1cnJlbnQgbGFuZ3VhZ2UuICovCitzdGF0aWMgaW50IGxhbmdzdjsJCS8qIEZvciByZW1lbWJlcmluZyBsYW5ndWFnZSBzZXR0aW5nLiAqLworZXh0ZXJuIHN0cnVjdCBjc2luZm8gZmNzaW5mb1tdOyAvKiBGaWxlIGNoYXJhY3RlciBzZXQgaW5mby4gKi8KK2V4dGVybiBpbnQgdGNzciwgdGNzbDsJCS8qIFRlcm1pbmFsIGNoYXJhY3RlciBzZXRzLCByZW1vdGUgJiBsb2NhbC4gKi8KK3N0YXRpYyBpbnQgdGNzOwkJCS8qIEludGVybWVkaWF0ZSAoInRyYW5zZmVyIikgY2hhcmFjdGVyIHNldC4gKi8KK3N0YXRpYyBpbnQgdGNzc2l6ZSA9IDA7CQkvKiBTaXplIG9mIHRjcyAqLworI2lmZGVmIFVOSUNPREUJCQkJLyogVVRGLTggc3VwcG9ydCAqLworI2lmZGVmIENLX0FOU0lDCitleHRlcm4gaW50ICgqeGxfdWZjW01BWEZDU0VUUysxXSkoVVNIT1JUKTsgIC8qIFVuaWNvZGUgdG8gRkNTICovCitleHRlcm4gVVNIT1JUICgqeGxfZmN1W01BWEZDU0VUUysxXSkoQ0hBUik7IC8qIEZDUyB0byBVbmljb2RlICovCitleHRlcm4gaW50ICgqeHVmKShVU0hPUlQpOwkJLyogVHJhbnNsYXRpb24gZnVuY3Rpb24gVUNTIHRvIEZDUyAqLworZXh0ZXJuIFVTSE9SVCAoKnhmdSkoQ0hBUik7CQkvKiBUcmFuc2xhdGlvbiBmdW5jdGlvbiBGQ1MgdG8gVUNTICovCisjZWxzZQorZXh0ZXJuIGludCAoKnhsX3VmY1tNQVhGQ1NFVFMrMV0pKCk7CitleHRlcm4gVVNIT1JUICgqeGxfZmN1W01BWEZDU0VUUysxXSkoKTsKK2V4dGVybiBpbnQgKCp4dWYpKCk7CitleHRlcm4gVVNIT1JUICgqeGZ1KSgpOworI2VuZGlmIC8qIENLX0FOU0lDICovCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworc3RhdGljIGludCBwcmludGluZyA9IDA7CisKKy8qCisgIFdlIGRvIG5vdCBuZWVkIHRvIHBhcnNlIGFuZCByZWNvZ25pemUgZXNjYXBlIHNlcXVlbmNlcyBpZiB3ZSBhcmUgYmVpbmcgYnVpbHQKKyAgd2l0aG91dCBjaGFyYWN0ZXItc2V0IHN1cHBvcnQgQU5EIHdpdGhvdXQgQVBDIHN1cHBvcnQuCisqLworI2lmZGVmIE5PRVNDU0VRCisjaWZkZWYgWFBSSU5UCisjdW5kZWYgWFBSSU5UCisjZW5kaWYgLyogWFBSSU5UICovCisKKyNlbHNlICAvKiBOT0VTQ1NFUSBub3QgZGVmaW5lZCBmcm9tIG91dHNpZGUgKi8KKworI2lmZGVmIE5PQ1NFVFMJCQkJLyogTm8gY2hhcmFjdGVyIHNldHMgKi8KKyNpZm5kZWYgQ0tfQVBDCQkJCS8qIE5vIEFQQyAqLworI2lmbmRlZiBYUFJJTlQJCQkJLyogTm8gdHJhbnNwYXJlbnQgcHJpbnRpbmcgKi8KKyNkZWZpbmUgTk9FU0NTRVEJCQkvKiBTbyBubyBlc2NhcGUgc2VxdWVuY2UgcmVjb2duaXplciAqLworI2VuZGlmIC8qIFhQUklOVCAqLworI2VuZGlmIC8qIENLX0FQQyAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyNlbmRpZiAvKiBOT0VTQ1NFUSAqLworCitzdGF0aWMgaW50IGVzY3NlcSA9IDA7CQkJLyogMSA9IFJlY29nbml6ZXIgaXMgYWN0aXZlICovCitzdGF0aWMgaW50IGluZXNjWzJdID0geyAwLCAwIH07CQkvKiBTdGF0ZSBvZiBzZXF1ZW5jZSByZWNvZ25pemVyICovCitzdGF0aWMgaW50IG9sZGVzY1syXSA9IHsgLTEsIC0xIH07CS8qIFByZXZpb3VzIHN0YXRlIG9mIHJlY29nbml6ZXIgKi8KKworI2lmZGVmIE5PRVNDU0VRCisjZGVmaW5lIGNoa2Flcyh4LHkpIDAKKyNlbHNlCisvKgorICBBcyBvZiBDLUtlcm1pdCA1QSgxNzgpLCB0aGUgQ09OTkVDVCBjb21tYW5kIHNraXBzIHBhc3QgQU5TSSBlc2NhcGUgc2VxdWVuY2VzCisgIHRvIGF2b2lkIHRyYW5zbGF0aW5nIHRoZSBjaGFyYWN0ZXJzIHdpdGhpbiB0aGVtLiAgVGhpcyBhbGxvd3MgdGhlIENPTk5FQ1QKKyAgY29tbWFuZCB0byB3b3JrIGNvcnJlY3RseSB3aXRoIGEgaG9zdCB0aGF0IHVzZXMgYSA3LWJpdCBJU08gNjQ2IG5hdGlvbmFsCisgIGNoYXJhY3RlciBzZXQsIGluIHdoaWNoIGNoYXJhY3RlcnMgbGlrZSAnWycgd291bGQgbm9ybWFsbHkgYmUgdHJhbnNsYXRlZAorICBpbnRvIGFjY2VudGVkIGNoYXJhY3RlcnMsIHJ1aW5pbmcgdGhlIHRlcm1pbmFsJ3MgaW50ZXJwcmV0YXRpb24gKGFuZAorICBnZW5lcmF0aW9uKSBvZiBlc2NhcGUgc2VxdWVuY2VzLgorCisgIEFzIG9mIDVBKDE5MCksIHRoZSBDT05ORUNUIGNvbW1hbmQgcmVzcG9uZHMgdG8gQVBDIGVzY2FwZSBzZXF1ZW5jZXMKKyAgKEVTQyBfIHRleHQgRVNDIFwpIGlmIHRoZSB1c2VyIFNFVHMgVEVSTUlOQUwgQVBDIE9OIG9yIFVOQ0hFQ0tFRCwgYW5kIHRoZQorICBwcm9ncmFtIHdhcyBidWlsdCB3aXRoIENLX0FQQyBkZWZpbmVkLgorCisgIE5vbi1BTlNJL0lTTy1jb21wbGlhbnQgZXNjYXBlIHNlcXVlbmNlcyBhcmUgbm90IGhhbmRsZWQuICovCisKKy8qIFN0YXRlcyBmb3IgdGhlIGVzY2FwZS1zZXF1ZW5jZSByZWNvZ25pemVyLiAqLworCisjZGVmaW5lIEVTX05PUk1BTCAwCQkJLyogTm9ybWFsLCBub3QgaW4gYW4gZXNjYXBlIHNlcXVlbmNlICovCisjZGVmaW5lIEVTX0dPVEVTQyAxCQkJLyogQ3VycmVudCBjaGFyYWN0ZXIgaXMgRVNDICovCisjZGVmaW5lIEVTX0VTQ1NFUSAyCQkJLyogSW5zaWRlIGFuIGVzY2FwZSBzZXF1ZW5jZSAqLworI2RlZmluZSBFU19HT1RDU0kgMwkJCS8qIEluc2lkZSBhIGNvbnRyb2wgc2VxdWVuY2UgKi8KKyNkZWZpbmUgRVNfU1RSSU5HIDQJCQkvKiBJbnNpZGUgRENTLE9TQyxQTSwgb3IgQVBDIHN0cmluZyAqLworI2RlZmluZSBFU19URVJNSU4gNQkJCS8qIDFzdCBjaGFyIG9mIHN0cmluZyB0ZXJtaW5hdG9yICovCisKKy8qCisgIEFOU0kgZXNjYXBlIHNlcXVlbmNlIGhhbmRsaW5nLiAgT25seSB0aGUgNy1iaXQgZm9ybSBpcyB0cmVhdGVkLCBiZWNhdXNlCisgIHRyYW5zbGF0aW9uIGlzIG5vdCBhIHByb2JsZW0gaW4gdGhlIDgtYml0IGVudmlyb25tZW50LCBpbiB3aGljaCBhbGwgR0wKKyAgY2hhcmFjdGVycyBhcmUgQVNDSUkgYW5kIG5vIHRyYW5zbGF0aW9uIHRha2VzIHBsYWNlLiAgU28gd2UgZG9uJ3QgY2hlY2sKKyAgZm9yIHRoZSA4LWJpdCBzaW5nbGUtY2hhcmFjdGVyIHZlcnNpb25zIG9mIENTSSwgRENTLCBPU0MsIEFQQywgb3IgU1QuCisgIEhlcmUgaXMgdGhlIEFOU0kgc2VxdWVuY2UgcmVjb2duaXplciBzdGF0ZSB0YWJsZSwgZm9sbG93ZWQgYnkgdGhlIGNvZGUKKyAgdGhhdCBpbXBsZW1lbnRzIGl0LgorCisgIERlZmluaXRpb25zOgorICAgIENBTiA9IENhbmNlbCAgICAgICAgICAgICAgICAgICAgICAgMDEvMDggICAgICAgICBDdHJsLVgKKyAgICBTVUIgPSBTdWJzdGl0dXRlICAgICAgICAgICAgICAgICAgIDAxLzEwICAgICAgICAgQ3RybC1aCisgICAgRENTID0gRGV2aWNlIENvbnRyb2wgU2VxdWVuY2UgICAgICAwMS8xMSAwNS8wMCAgIEVTQyBQCisgICAgQ1NJID0gQ29udHJvbCBTZXF1ZW5jZSBJbnRyb2R1Y2VyICAwMS8xMSAwNS8xMSAgIEVTQyBbCisgICAgU1QgID0gU3RyaW5nIFRlcm1pbmF0b3IgICAgICAgICAgICAwMS8xMSAwNS8xMiAgIEVTQyBcCisgICAgT1NDID0gT3BlcmF0aW5nIFN5c3RlbSBDb21tYW5kICAgICAwMS8xMSAwNS8xMyAgIEVTQyBdCisgICAgUE0gID0gUHJpdmFjeSBNZXNzYWdlICAgICAgICAgICAgICAwMS8xMSAwNS8xNCAgIEVTQyBeCisgICAgQVBDID0gQXBwbGljYXRpb24gUHJvZ3JhbSBDb21tYW5kICAwMS8xMSAwNS8xNSAgIEVTQyBfCisKKyAgQU5TSSBlc2NhcGUgc2VxdWVuY2UgcmVjb2duaXplcjoKKworICAgIFN0YXRlICAgIElucHV0ICBOZXcgU3RhdGUgIDsgQ29tbWVudGFyeQorCisgICAgTk9STUFMICAgKHN0YXJ0KSAgICAgICAgICAgOyBTdGFydCBpbiBOT1JNQUwgc3RhdGUKKworICAgIChhbnkpICAgIENBTiAgICBOT1JNQUwgICAgIDsgXlggY2FuY2VscworICAgIChhbnkpICAgIFNVQiAgICBOT1JNQUwgICAgIDsgXlogY2FuY2VscworCisgICAgTk9STUFMICAgRVNDICAgIEdPVEVTQyAgICAgOyBCZWdpbiBlc2NhcGUgc2VxdWVuY2UKKyAgICBOT1JNQUwgICBvdGhlciAgICAgICAgICAgICA7IE5PUk1BTCBjb250cm9sIG9yIGdyYXBoaWMgY2hhcmFjdGVyCisKKyAgICBHT1RFU0MgICBFU0MgICAgICAgICAgICAgICA7IFN0YXJ0IGFnYWluCisgICAgR09URVNDICAgWyAgICAgIEdPVENTSSAgICAgOyBDU0kKKyAgICBHT1RFU0MgICBQICAgICAgU1RSSU5HICAgICA7IERDUyBpbnRyb2R1Y2VyLCBjb25zdW1lIHRocm91Z2ggU1QKKyAgICBHT1RFU0MgICBdICAgICAgU1RSSU5HICAgICA7IE9TQyBpbnRyb2R1Y2VyLCBjb25zdW1lIHRocm91Z2ggU1QKKyAgICBHT1RFU0MgICBeICAgICAgU1RSSU5HICAgICA7IFBNICBpbnRyb2R1Y2VyLCBjb25zdW1lIHRocm91Z2ggU1QKKyAgICBHT1RFU0MgICBfICAgICAgU1RSSU5HICAgICA7IEFQQyBpbnRyb2R1Y2VyLCBjb25zdW1lIHRocm91Z2ggU1QKKyAgICBHT1RFU0MgICAwLi5+ICAgTk9STUFMICAgICA7IDAzLzAwIHRocm91Z2ggMTcvMTQgPSBGaW5hbCBjaGFyYWN0ZXIKKyAgICBHT1RFU0MgICBvdGhlciAgRVNDU0VRICAgICA7IEludGVybWVkaWF0ZSBvciBpZ25vcmVkIGNvbnRyb2wgY2hhcmFjdGVyCisKKyAgICBFU0NTRVEgICBFU0MgICAgR09URVNDICAgICA7IFN0YXJ0IGFnYWluCisgICAgRVNDU0VRICAgMC4ufiAgIE5PUk1BTCAgICAgOyAwMy8wMCB0aHJvdWdoIDE3LzE0ID0gRmluYWwgY2hhcmFjdGVyCisgICAgRVNDU0VRICAgb3RoZXIgICAgICAgICAgICAgOyBJbnRlcm1lZGlhdGUgb3IgaWdub3JlZCBjb250cm9sIGNoYXJhY3RlcgorCisgICAgR09UQ1NJICAgRVNDICAgIEdPVEVTQyAgICAgOyBTdGFydCBhZ2FpbgorICAgIEdPVENTSSAgIEAuLn4gICBOT1JNQUwgICAgIDsgMDQvMDAgdGhyb3VnaCAxNy8xNCA9IEZpbmFsIGNoYXJhY3RlcgorICAgIEdPVENTSSAgIG90aGVyICAgICAgICAgICAgIDsgSW50ZXJtZWRpYXRlIGNoYXIgb3IgaWdub3JlZCBjb250cm9sIGNoYXIKKworICAgIFNUUklORyAgIEVTQyAgICBURVJNSU4gICAgIDsgTWF5YmUgaGF2ZSBTVAorICAgIFNUUklORyAgIG90aGVyICAgICAgICAgICAgIDsgQ29uc3VtZSBhbGwgZWxzZQorCisgICAgVEVSTUlOICAgXCAgICAgIE5PUk1BTCAgICAgOyBFbmQgb2Ygc3RyaW5nCisgICAgVEVSTUlOICAgb3RoZXIgIFNUUklORyAgICAgOyBTdGlsbCBpbiBzdHJpbmcKKyovCisKKyNpZmRlZiBYUFJJTlQJCQkJLyogVHJhbnNwYXJlbnQgcHJpbnQgc3VwcG9ydCAqLworLyoKKyAgV2UgY2FuJ3QganVzdCBwcmludCBlYWNoIGJ5dGUgYXMgaXQgY29tZXMgaW4gYmVjYXVzZSB0aGVuIHRoZSBwcmludGVyLW9mZgorICBzZXF1ZW5jZSB3b3VsZCBiZSBzZW50IHRvIHRoZSBwcmludGVyLiAgVGh1cyB3ZSBoYXZlIHRvIGJ1ZmZlciB1cCBlc2NhcGUKKyAgc2VxdWVuY2VzIGFuZCBwcmludCB0aGVtIG9ubHkgd2hlbiB0aGV5IGFyZSBjb21wbGV0ZSBBTkQgd2Uga25vdyB0aGV5IGFyZQorICBub3QgdGhlIHByaW50ZXItb2ZmIHNlcXVlbmNlLiAgQWxsIHByaW50aW5nIGlzIGRvbmUgdmlhIHpzb3V0eChaTUZJTEUscyxuKS4KKyAgVGhpcyBhbGxvd3MgZm9yIHN0cmluZ3MgdGhhdCBjb250YWluIE5VTHMuICBEb24ndCBtaXggY2FsbHMgdG8genNvdXR4KCkgd2l0aAorICBjYWxscyB0byB6Y2hvdXQoKSwgb3IgdGhlIG91dHB1dCB3aWxsIGJlIHNjcmFtYmxlZC4gIEFsc28gbm90ZSB0aGF0IHdoZW4KKyAgcHJpbnRpbmcgYSBzYXZlZC11cCBlc2NhcGUgc2VxdWVuY2UsIHdlIG5ldmVyIHByaW50IGl0cyBmaW5hbCBjaGFyYWN0ZXIKKyAgYmVjYXVzZSB0aGF0IHdpbGwgYmUgcHJpbnRlZCBpbiB0aGUgbWFpbmxpbmUgY29kZSwgdXBvbiByZXR1cm4gZnJvbQorICBjaGthZXMoKS4gIE5vdGUgdGhhdCB0aGUgcHJpbnRlci1vbiBzZXF1ZW5jZSBpcyBwYXNzZWQgdG8gdGhlIHNjcmVlbjsgdGhpcworICBpcyB1bmF2b2lkYWJsZSwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGF0IGl0IGlzIHVudGlsIGFmdGVyIHdlIGdldCB0byB0aGUKKyAgZW5kLCBhbmQgZm9yIHNjcmVlbiBkaXNwbGF5IHB1cnBvc2VzIHdlIGNhbid0IGJ1ZmZlciB1cCBlc2NhcGUgc2VxdWVuY2VzCisgIGZvciBudW1lcm91cyByZWFzb25zLiAgVGhlcmVmb3JlIHdlIGFsc28gbXVzdCBvdXRwdXQgdGhlIHByaW50ZXItb2ZmCisgIHNlcXVlbmNlLCBvdGhlcndpc2UgYSByZWFsIHRlcm1pbmFsIG9yIGVtdWxhdG9yIHdpbGwgYmUgc3R1Y2sgaW4gcHJpbnQgbW9kZS4KKyovCitleHRlcm4gaW50IHR0X3ByaW50OworI2RlZmluZSBFU0NCVUZMRU4gNjMKK3N0YXRpYyBjaGFyIGVzY2J1ZltFU0NCVUZMRU4rMV0gPSB7IE5VTCwgTlVMIH07CitzdGF0aWMgaW50IGVzY2J1ZmMgPSAwOworc3RhdGljIGludCBkb250cHJpbnQgPSAwOworCitWT0lECitwcmludG9uKCkgewkJCQkvKiBUdXJuIHByaW50aW5nIG9uICovCisgICAgaW50IHgsIHBwOworICAgIGNoYXIgKiBwOworICAgIGV4dGVybiBpbnQgcHJpbnRwaXBlLCBub3ByaW50ZXI7CisgICAgZXh0ZXJuIGNoYXIgKiBwcmludGVybmFtZTsKKworICAgIGlmIChub3ByaW50ZXIpIHsKKwlkZWJ1ZyhGMTEwLCJQUklOVEVSIE9OIE5PUFJJTlRFUiIsIiIsMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBwID0gcHJpbnRlcm5hbWU7CisgICAgcHAgPSBwcmludHBpcGU7CisgICAgaWYgKCFwKSBwID0gIiI7CisgICAgaWYgKCEqcCkgeworI2lmZGVmIEFOWUJTRAorCXAgPSAibHByIjsKKyNlbHNlCisJcCA9ICJscCI7CisjZW5kaWYgLyogQU5ZQlNEICovCisJcHAgPSAxOworCWRlYnVnKEYxMTAsIlBSSU5URVIgREVGQVVMVCIscCwwKTsKKyAgICB9CisgICAgZGVidWcoRjExMSwiUFJJTlRFUiBPTiIscCxwcCk7CisgICAgaWYgKHBwKSB7CQkJCS8qIFByaW50aW5nIHRvIHBpcGUgKi8KKwl4ID0genhjbWQoWk1GSUxFLHApOworICAgIH0gZWxzZSB7CQkJCS8qIEFwcGVuZCB0byBmaWxlICovCisJc3RydWN0IGZpbGluZm8geHg7CisJeHguYnMgPSAwOyB4eC5jcyA9IDA7IHh4LnJsID0gMDsgeHgub3JnID0gMDsgeHguY2MgPSAwOworCXh4LnR5cCA9IDA7IHh4LmRzcCA9IFhZRlpfQTsgeHgub3Nfc3BlY2lmaWMgPSBOVUw7CisJeHgubGJsb3B0cyA9IDA7CisJeCA9IHpvcGVubyhaTUZJTEUscCxOVUxMLCZ4eCk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsIlBSSU5URVIgT1BFTiIsIiIseCk7CisgICAgcHJpbnRpbmcgPSAxOworfQorCitWT0lECitwcmludG9mZigpIHsJCQkJLyogVHVybiBwcmludGluZyBvZmYgKi8KKyAgICBpbnQgeDsKKyAgICBleHRlcm4gaW50IG5vcHJpbnRlcjsKKyAgICBpZiAobm9wcmludGVyKSB7CisJcHJpbnRpbmcgPSAwOworCWRlYnVnKEYxMDAsIlBSSU5URVIgT0ZGIE5PUFJJTlRFUiIsIiIsMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBkZWJ1ZyhGMTAwLCJQUklOVEVSIE9GRiIsIiIsMCk7CisgICAgaWYgKHByaW50aW5nKSB7CisJeCA9IHpjbG9zZShaTUZJTEUpOworCWRlYnVnKEYxMDEsIlBSSU5URVIgQ0xPU0UiLCIiLHgpOworCXByaW50aW5nID0gMDsKKyAgICB9Cit9CisjZW5kaWYgLyogWFBSSU5UICovCisKKy8qCisgIEMgSCBLIEEgRSBTICAtLSAgQ2hlY2sgQU5TSSBFc2NhcGUgU2VxdWVuY2UuCisKKyAgQ2FsbCB3aXRoIEVBQ0ggY2hhcmFjdGVyIGluIGlucHV0IHN0cmVhbS4KKyAgc3JjID0gMCBtZWFucyBjIGlzIGluY29taW5nIGZyb20gcmVtb3RlOyAxID0gY2hhciBmcm9tIGtleWJvYXJkLgorICBTZXRzIGdsb2JhbCBpbmVzY1tzcmNdIHZhcmlhYmxlIGFjY29yZGluZyB0byBlc2NhcGUgc2VxdWVuY2Ugc3RhdGUuCisgIFJldHVybnMgMCBub3JtYWxseSwgMSBpZiBhbiBBUEMgc2VxdWVuY2UgaXMgdG8gYmUgZXhlY3V0ZWQuCisgIEhhbmRsZXMgdHJhbnNwYXJlbnQgcHJpbnRpbmcgaW50ZXJuYWxseS4KKyovCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2hrYWVzKGNoYXIgYywgaW50IHNyYykKKyNlbHNlCitjaGthZXMoYyxzcmMpIGNoYXIgYzsgaW50IHNyYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogY2hrYWVzICovIHsKKworICAgIGRlYnVnKEYxMTEsImNoa2FlcyBlbnRyeSBpbmVzYyIsY2tpdG9hKHNyYyksaW5lc2Nbc3JjXSk7CisgICAgZGVidWcoRjEwMSwiY2hrYWVzIGMiLCIiLGMpOworCisgICAgaWYgKHNyYyA8IDAgfHwgc3JjID4gMSkJCS8qIERvbid0IGFsbG93IGJhZCBhcmdzLiAqLworICAgICAgcmV0dXJuKDApOworCisgICAgb2xkZXNjW3NyY10gPSBpbmVzY1tzcmNdOwkJLyogUmVtZW1iZXIgcHJldmlvdXMgc3RhdGUgKi8KKworI2lmZGVmIFhQUklOVAorICAgIGlmIChpbmVzY1tzcmNdICYmICFzcmMpIHsJCS8qIFNhdmUgdXAgZXNjYXBlIHNlcSBmb3IgcHJpbnRpbmcgICovCisJaWYgKCFjKSByZXR1cm4oMCk7CQkvKiBJZ25vcmUgTlVMcyAqLworCWlmIChlc2NidWZjIDwgRVNDQlVGTEVOKSB7CisJICAgIGVzY2J1Zltlc2NidWZjKytdID0gYzsKKwkgICAgZXNjYnVmW2VzY2J1ZmNdID0gTlVMOworCSAgICBkZWJ1ZyhGMTExLCJFU0NCVUYgMSIsZXNjYnVmLGVzY2J1ZmMpOworCX0gZWxzZSB7CQkJLyogQnVmZmVyIG92ZXJydW4gKi8KKwkgICAgaWYgKHByaW50aW5nICYmIGVzY2J1ZmMpCS8qIFByaW50IHdoYXQncyB0aGVyZSBzbyBmYXIgKi8KKwkgICAgICB6c291dHgoWk1GSUxFLGVzY2J1Zixlc2NidWZjKTsKKwkgICAgZXNjYnVmYyA9IDE7CQkvKiBjbGVhciBpdCBvdXQgKi8KKwkgICAgZXNjYnVmWzBdID0gYzsJCS8qIGFuZCBzdGFydCBvZmYgZnJlc2ggYnVmZmVyICovCisJICAgIGVzY2J1ZlsxXSA9IE5VTDsJCS8qIHdpdGggdGhpcyBjaGFyYWN0ZXIuICovCisJfQorICAgIH0KKyNlbmRpZiAvKiBYUFJJTlQgKi8KKworICAgIGlmIChjID09IENBTiB8fCBjID09IFNVQikgewkJLyogQ0FOIGFuZCBTVUIgY2FuY2VsIGFueSBzZXF1ZW5jZSAqLworI2lmZGVmIFhQUklOVAorCWlmICghc3JjKSB7CisJICAgIGlmIChwcmludGluZyAmJiBlc2NidWZjID4gMSkKKwkgICAgICB6c291dHgoWk1GSUxFLGVzY2J1Zixlc2NidWZjLTEpOworCSAgICBlc2NidWZjID0gMDsJCS8qIENsZWFyIGJ1ZmZlciAqLworCSAgICBlc2NidWZbMF0gPSBOVUw7CisJfQorI2VuZGlmIC8qIFhQUklOVCAqLworCWluZXNjW3NyY10gPSBFU19OT1JNQUw7CisgICAgfSBlbHNlCQkJCS8qIE90aGVyd2lzZSAqLworCisgICAgICBzd2l0Y2ggKGluZXNjW3NyY10pIHsJCS8qIGVudGVyIHN0YXRlIHN3aXRjaGVyICovCisJY2FzZSBFU19OT1JNQUw6CQkJLyogTk9STUFMIHN0YXRlICovCisJICBpZiAoYyA9PSBFU0MpIHsJCS8qIEdvdCBhbiBFU0MgKi8KKwkgICAgICBpbmVzY1tzcmNdID0gRVNfR09URVNDOwkvKiBDaGFuZ2Ugc3RhdGUgdG8gR09URVNDICovCisjaWZkZWYgWFBSSU5UCisJICAgICAgaWYgKCFzcmMpIHsKKwkJICBlc2NidWZjID0gMTsJCS8qIENsZWFyIGVzY2FwZSBzZXF1ZW5jZSBidWZmZXIgKi8KKwkJICBlc2NidWZbMF0gPSBjOwkvKiBhbmQgZGVwb3NpdCB0aGUgRVNDICovCisJCSAgZXNjYnVmWzFdID0gTlVMOworCQkgIGRlYnVnKEYxMTEsIkVTQ0JVRiAyIixlc2NidWYsZXNjYnVmYyk7CisJICAgICAgfQorI2VuZGlmIC8qIFhQUklOVCAqLworCSAgfQorCSAgYnJlYWs7CQkJLyogT3RoZXJ3aXNlIHN0YXkgaW4gTk9STUFMIHN0YXRlICovCisKKwljYXNlIEVTX0dPVEVTQzoJCQkvKiBHT1RFU0Mgc3RhdGUgLSBwcmV2IGNoYXIgd2FzIEVTQyovCisJICBpZiAoYyA9PSAnWycpIHsJCS8qIExlZnQgYnJhY2tldCBhZnRlciBFU0MgaXMgQ1NJICovCisJICAgICAgaW5lc2Nbc3JjXSA9IEVTX0dPVENTSTsJLyogQ2hhbmdlIHRvIEdPVENTSSBzdGF0ZSAqLworCSAgfSBlbHNlIGlmIChjID09ICdQJyB8fCAoYyA+IDAxMzQgJiYgYyA8IDAxNDApKSB7IC8qIFAsIF0sIF4sIG9yIF8gKi8KKwkgICAgICBpbmVzY1tzcmNdID0gRVNfU1RSSU5HOwkvKiBTd2l0Y2ggdG8gU1RSSU5HLWFic29ycHRpb24gc3RhdGUgKi8KKyNpZmRlZiBYUFJJTlQKKwkgICAgICBkZWJ1ZyhGMTExLCJFU0NCVUYgU1RSSU5HIixlc2NidWYsZXNjYnVmYyk7CisjZW5kaWYgLyogWFBSSU5UICovCisjaWZkZWYgQ0tfQVBDCisJICAgICAgLyogSWYgQVBDIG5vdCBkaXNhYmxlZCAqLworCSAgICAgIGlmICghc3JjICYmIGMgPT0gJ18nICYmIChhcGNzdGF0dXMgJiBBUENfT04pKSB7CisJCSAgZGVidWcoRjEwMCwiQ09OTkVDVCBBUEMgYmVnaW4iLCIiLDApOworCQkgIGFwY2FjdGl2ZSA9IEFQQ19SRU1PVEU7IC8qIFNldCBBUEMtQWN0aXZlIGZsYWcgKi8KKwkJICBhcGNsZW5ndGggPSAwOwkvKiBhbmQgcmVzZXQgQVBDIGJ1ZmZlciBwb2ludGVyICovCisJICAgICAgfQorI2VuZGlmIC8qIENLX0FQQyAqLworCSAgfSBlbHNlIGlmIChjID4gMDU3ICYmIGMgPCAwMTc3KSB7IC8qIEZpbmFsIGNoYXJhY3RlciAnMCcgdGhydSAnficgKi8KKwkgICAgICBpbmVzY1tzcmNdID0gRVNfTk9STUFMOwkvKiBCYWNrIHRvIG5vcm1hbCAqLworI2lmZGVmIFhQUklOVAorCSAgICAgIGlmICghc3JjKSB7CisJCSAgaWYgKHByaW50aW5nICYmIGVzY2J1ZmMgPiAxKSB7CisJCSAgICAgIC8qIER1bXAgZXNjIHNlcSBidWYgdG8gcHJpbnRlciAqLworCQkgICAgICB6c291dHgoWk1GSUxFLGVzY2J1Zixlc2NidWZjLTEpOworCQkgICAgICBkZWJ1ZyhGMTExLCJFU0NCVUYgUFJJTlQgMSIsZXNjYnVmLGVzY2J1ZmMpOworCQkgIH0KKworCQkgIGVzY2J1ZmMgPSAwOwkJLyogQ2xlYXIgcGFyYW1ldGVyIGJ1ZmZlciAqLworCQkgIGVzY2J1ZlswXSA9IE5VTDsKKwkgICAgICB9CisjZW5kaWYgLyogWFBSSU5UICovCisJICB9IGVsc2UgaWYgKGMgIT0gRVNDKSB7CS8qIEVTQyBpbiBhbiBlc2NhcGUgc2VxdWVuY2UuLi4gKi8KKwkgICAgICBpbmVzY1tzcmNdID0gRVNfRVNDU0VROwkvKiBzdGFydHMgYSBuZXcgZXNjYXBlIHNlcXVlbmNlICovCisJICB9CisJICBicmVhazsJCQkvKiBJbnRlcm1lZGlhdGUgb3IgaWdub3JlZCBjdHJsIGNoYXIgKi8KKworCWNhc2UgRVNfRVNDU0VROgkJCS8qIEVTQ1NFUSAtLSBpbiBhbiBlc2NhcGUgc2VxdWVuY2UgKi8KKwkgIGlmIChjID4gMDU3ICYmIGMgPCAwMTc3KSB7CS8qIEZpbmFsIGNoYXJhY3RlciAnMCcgdGhydSAnficgKi8KKwkgICAgICBpbmVzY1tzcmNdID0gRVNfTk9STUFMOwkvKiBSZXR1cm4gdG8gTk9STUFMIHN0YXRlLiAqLworI2lmZGVmIFhQUklOVAorCSAgICAgIGlmICghc3JjKSB7CisJCSAgaWYgKHByaW50aW5nICYmIGVzY2J1ZmMgPiAxKSB7CisJCSAgICAgIHpzb3V0eChaTUZJTEUsZXNjYnVmLGVzY2J1ZmMtMSk7CisJCSAgICAgIGRlYnVnKEYxMTEsIkVTQ0JVRiBQUklOVCAyIixlc2NidWYsZXNjYnVmYyk7CisJCSAgfQorCQkgIGVzY2J1ZmMgPSAwOwkJLyogQ2xlYXIgZXNjc2VxIGJ1ZmZlciAqLworCQkgIGVzY2J1ZlswXSA9IE5VTDsKKwkgICAgICB9CisjZW5kaWYgLyogWFBSSU5UICovCisJICB9IGVsc2UgaWYgKGMgPT0gRVNDKSB7CS8qIEVTQyAuLi4gKi8KKwkgICAgICBpbmVzY1tzcmNdID0gRVNfR09URVNDOwkvKiBzdGFydHMgYSBuZXcgZXNjYXBlIHNlcXVlbmNlICovCisJICB9CisJICBicmVhazsJCQkvKiBJbnRlcm1lZGlhdGUgb3IgaWdub3JlZCBjdHJsIGNoYXIgKi8KKworCWNhc2UgRVNfR09UQ1NJOgkJCS8qIEdPVENTSSAtLSBJbiBhIGNvbnRyb2wgc2VxdWVuY2UgKi8KKwkgIGlmIChjID4gMDc3ICYmIGMgPCAwMTc3KSB7CS8qIEZpbmFsIGNoYXJhY3RlciAnQCcgdGhydSAnficgKi8KKyNpZmRlZiBYUFJJTlQKKwkgICAgICBpZiAoIXNyYyAmJiB0dF9wcmludCkgewkvKiBQcmludGVyIGVuYWJsZWQ/ICovCisJCSAgaWYgKGMgPT0gJ2knKSB7CS8qIEZpbmFsIGNoYXIgaXMgImkiPyAqLworCQkgICAgICBjaGFyICogcCA9IChjaGFyICopIChlc2NidWYgKyBlc2NidWZjIC0gNCk7CisJCSAgICAgIGlmICghc3RybmNtcChwLCAiXDAzM1s1aSIsIDQpKSB7IC8qIFR1cm4gcHJpbnRlciBvbiAqLworCQkJICBwcmludG9uKCk7CisJCSAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAocCwgIlwwMzNbNGkiLCA0KSkgeyAvKiBPciBvZmYuLi4gKi8KKwkJCSAgaW50IGk7CisJCQkgIHByaW50b2ZmKCk7CQkJLyogVHVybiBvZmYgcHJpbnRlci4gKi8KKwkJCSAgZG9udHByaW50ID0gMTsKKwkJCSAgZm9yIChpID0gMDsgaSA8IGVzY2J1ZmM7IGkrKykJLyogQW5kIG91dHB1dCB0aGUgKi8KKwkJCSAgICBja2NwdXRjKGVzY2J1ZltpXSk7ICAgICAgICAgLyogc2VxdWVuY2UuICovCisJCSAgICAgIH0gZWxzZSBpZiAocHJpbnRpbmcgJiYgZXNjYnVmYyA+IDEpIHsKKwkJCSAgenNvdXR4KFpNRklMRSxlc2NidWYsZXNjYnVmYy0xKTsKKwkJCSAgZGVidWcoRjAxMSwiRVNDQlVGIFBSSU5UIDMiLGVzY2J1Zixlc2NidWZjKTsKKwkJICAgICAgfQorCQkgIH0gZWxzZSBpZiAocHJpbnRpbmcgJiYgZXNjYnVmYyA+IDEpIHsKKwkJICAgICAgenNvdXR4KFpNRklMRSxlc2NidWYsZXNjYnVmYy0xKTsKKwkJICAgICAgZGVidWcoRjExMSwiRVNDQlVGIFBSSU5UIDQiLGVzY2J1Zixlc2NidWZjKTsKKwkJICB9CisJICAgICAgfQorCSAgICAgIGlmICghc3JjKSB7CisJCSAgZXNjYnVmYyA9IDA7CQkvKiBDbGVhciBlc2Mgc2VxdWVuY2UgYnVmZmVyICovCisJCSAgZXNjYnVmWzBdID0gTlVMOworCSAgICAgIH0KKyNlbmRpZiAvKiBYUFJJTlQgKi8KKwkgICAgICBpbmVzY1tzcmNdID0gRVNfTk9STUFMOwkvKiBSZXR1cm4gdG8gTk9STUFMLiAqLworCSAgfSBlbHNlIGlmIChjID09IEVTQykgewkvKiBFU0MgLi4uICovCisJICAgICAgaW5lc2Nbc3JjXSA9IEVTX0dPVEVTQzsJLyogc3RhcnRzIG92ZXIuICovCisJICB9CisJICBicmVhazsKKworCWNhc2UgRVNfU1RSSU5HOgkJCS8qIEluc2lkZSBhIHN0cmluZyAqLworCSAgaWYgKGMgPT0gRVNDKQkJCS8qIEVTQyBtYXkgYmUgMXN0IGNoYXIgb2YgdGVybWluYXRvciAqLworCSAgICBpbmVzY1tzcmNdID0gRVNfVEVSTUlOOwkvKiBHbyBzZWUuICovCisjaWZkZWYgQ0tfQVBDCisJICBlbHNlIGlmIChhcGNhY3RpdmUpIHsJCS8qIElmIGluIEFQQyAqLworCSAgICAgIGlmIChhcGNsZW5ndGggPCBhcGNidWZsZW4pIHsgLyogYW5kIHRoZXJlIGlzIHJvb20uLi4gKi8KKwkJICBhcGNidWZbYXBjbGVuZ3RoKytdID0gYzsgLyogZGVwb3NpdCB0aGlzIGNoYXJhY3Rlci4gKi8KKwkgICAgICB9IGVsc2UgewkJCS8qIEJ1ZmZlciBvdmVycnVuICovCisJCSAgYXBjYWN0aXZlID0gMDsJLyogRGlzY2FyZCB3aGF0IHdlIGdvdCAqLworCQkgIGFwY2xlbmd0aCA9IDA7CS8qIGFuZCBnbyBiYWNrIHRvIG5vcm1hbCAqLworCQkgIGFwY2J1ZlswXSA9IDA7CS8qIE5vdCBwcmV0dHksIGJ1dCB3aGF0IGVsc2UgKi8KKwkJICBpbmVzY1tzcmNdID0gRVNfTk9STUFMOyAvKiBjYW4gd2UgZG8/ICAoU1QgbWlnaHQgbm90IGNvbWUpICovCisJICAgICAgfQorCSAgfQorI2VuZGlmIC8qIENLX0FQQyAqLworCSAgYnJlYWs7CQkJLyogQWJzb3JiIGFsbCBvdGhlciBjaGFyYWN0ZXJzLiAqLworCisJY2FzZSBFU19URVJNSU46CQkJLyogTWF5YmUgYSBzdHJpbmcgdGVybWluYXRvciAqLworCSAgaWYgKGMgPT0gJ1xcJykgewkJLyogd2hpY2ggbXVzdCBiZSBiYWNrc2xhc2ggKi8KKwkgICAgICBpbmVzY1tzcmNdID0gRVNfTk9STUFMOwkvKiBJZiBzbywgYmFjayB0byBOT1JNQUwgKi8KKyNpZmRlZiBYUFJJTlQKKwkgICAgICBpZiAoIXNyYykgeworCQkgIGlmIChwcmludGluZyAmJiBlc2NidWZjID4gMSkgeyAvKiBJZiBwcmludGluZy4uLiAqLworCQkgICAgICAvKiBQcmludCBlc2Mgc2VxIGJ1ZmZlciAqLworCQkgICAgICB6c291dHgoWk1GSUxFLGVzY2J1Zixlc2NidWZjLTEpOworCQkgICAgICBkZWJ1ZyhGMTExLCJFU0NCVUYgUFJJTlQgNSIsZXNjYnVmLGVzY2J1ZmMpOworCQkgIH0KKwkJICBlc2NidWZjID0gMDsJCS8qIENsZWFyIGVzY3NlcSBidWZmZXIgKi8KKwkJICBlc2NidWZbMF0gPSBOVUw7CisJICAgICAgfQorI2VuZGlmIC8qIFhQUklOVCAqLworI2lmZGVmIENLX0FQQworCSAgICAgIGlmICghc3JjICYmIGFwY2FjdGl2ZSkgewkvKiBJZiBpdCB3YXMgYW4gQVBDIHN0cmluZywgKi8KKwkJICBkZWJ1ZyhGMTAxLCJDT05ORUNUIEFQQyB0ZXJtaW5hdGVkIiwiIixjKTsKKwkJICBhcGNidWZbYXBjbGVuZ3RoXSA9IE5VTDsgLyogdGVybWluYXRlIGl0IGFuZCB0aGVuIC4uLiAqLworCQkgIHJldHVybigxKTsKKwkgICAgICB9CisjZW5kaWYgLyogQ0tfQVBDICovCisJICB9IGVsc2UgewkJCS8qIEl0J3Mgbm90IGEgYmFja3NsYXNoIHNvLi4uICovCisJICAgICAgaW5lc2Nbc3JjXSA9IEVTX1NUUklORzsJLyogYmFjayB0byBzdHJpbmcgYWJzb3JwdGlvbi4gKi8KKyNpZmRlZiBDS19BUEMKKwkgICAgICBpZiAoYXBjYWN0aXZlKSB7CQkvKiBJbiBBUEMgc3RyaW5nICovCisJCSAgaWYgKGFwY2xlbmd0aCsxIDwgYXBjYnVmbGVuKSB7IC8qIElmIGVub3VnaCByb29tICovCisJCSAgICAgIGFwY2J1ZlthcGNsZW5ndGgrK10gPSBFU0M7IC8qIGRlcG9zaXQgdGhlIEVzYyAqLworCQkgICAgICBhcGNidWZbYXBjbGVuZ3RoKytdID0gYzsgICAvKiBhbmQgdGhpcyBjaGFyYWN0ZXIgdG9vLiAqLworCQkgIH0gZWxzZSB7CQkvKiBCdWZmZXIgb3ZlcnJ1biAqLworCQkgICAgICBhcGNhY3RpdmUgPSAwOworCQkgICAgICBhcGNsZW5ndGggPSAwOworCQkgICAgICBhcGNidWZbMF0gPSAwOworCQkgICAgICBpbmVzY1tzcmNdID0gRVNfTk9STUFMOworCQkgIH0KKwkgICAgICB9CisjZW5kaWYgLyogQ0tfQVBDICovCisJICB9CisgICAgICB9CS8qIHN3aXRjaCgpICovCisgICAgZGVidWcoRjExMSwiY2hrYWVzIGV4aXQgaW5lc2MiLGNraXRvYShzcmMpLGluZXNjW3NyY10pOworICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBOT0VTQ1NFUSAqLworCisvKiAgQyBLIEMgUCBVIFQgQyAgLS0gIEMtS2VybWl0IENPTk5FQ1QgUHV0IENoYXJhY3RlciB0byBTY3JlZW4gICovCisvKgorICBPdXRwdXQgaXMgYnVmZmVyZWQgdG8gYXZvaWQgc2xvdyBzY3JlZW4gd3JpdGVzIG9uIGZhc3QgY29ubmVjdGlvbnMuCisqLworc3RhdGljIGludAorY2tjcHV0ZigpIHsJCQkJLyogRHVtcCB0aGUgY29uc29sZSBvdXRwdXQgYnVmZmVyICovCisgICAgaW50IHggPSAwOworICAgIGlmIChvYmMgPiAwKQkJCS8qIElmIHdlIGhhdmUgYW55IGNoYXJhY3RlcnMsICovCisgICAgICB4ID0gY29ueG8ob2JjLG9idWYpOwkJLyogZHVtcCB0aGVtLCAqLworICAgIG9icCA9IG9idWY7CQkJCS8qIHJlc2V0IHRoZSBwb2ludGVyICovCisgICAgb2JjID0gMDsJCQkJLyogYW5kIHRoZSBjb3VudGVyLiAqLworICAgIHJldHVybih4KTsJCQkJLyogUmV0dXJuIGNvbnhvJ3MgcmV0dXJuIGNvZGUgKi8KK30KKworLyoKKyAgTk9URTogVGhpcyBpcyBwcm9iYWJseSB0aGUgcmlnaHQgcGxhY2UgZm9yIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24sCisgIHJhdGhlciB0aGFuIGRvd24gYmVsb3cgaW4gdGhlIG1haW5saW5lIGNvZGUuICBja2NwdXRjKCkgd291bGQgYWN0IGxpa2UKKyAgeHBuYnl0ZSgpIGluIGNrY2Zucy5jLCBhbmQgY2tjZ2V0YygpIHdvdWxkIGFjdCBsaWtlIHhnbmJ5dGUoKS4gIFRoaXMKKyAgd291bGQgc2hpZWxkIHRoZSByZXN0IG9mIHRoZSBjb2RlIGZyb20gYWxsIHRoZSBjb21wbGV4aXRpZXMgb2YgbWFueS10by1vbmUKKyAgYW5kIG9uZS10by1tYW55IGNvbnZlcnNpb25zLCBhbmQgd291bGQgYWxsb3cgaGFuZGxpbmcgb2YgS2FuamkgYW5kIG90aGVyCisgIENKSyBzZXRzIGFsb25nIHdpdGggVVRGLTggYW5kIHRoZSByZXN0LgorKi8KK2ludAorY2tjcHV0YyhjKSBpbnQgYzsgeworICAgIGludCB4OworCisgICAgKm9icCsrID0gYyAmIDB4ZmY7CQkJLyogRGVwb3NpdCB0aGUgY2hhcmFjdGVyICovCisgICAgb2JjKys7CQkJCS8qIENvdW50IGl0ICovCisgICAgaWYgKGliYyA9PSAwIHx8CQkJLyogSWYgaW5wdXQgYnVmZmVyIGFib3V0IGVtcHR5ICovCisJb2JjID09IE9CVUZMKSB7CQkJLyogb3Igb3V0cHV0IGJ1ZmZlciBmdWxsICovCisJZGVidWcoRjEwMSwiQ09OTkVDVCBDS0NQVVRDIG9iYyIsIiIsb2JjKTsKKwl4ID0gY29ueG8ob2JjLG9idWYpOwkJLyogZHVtcCB0aGUgYnVmZmVyLCAqLworCW9icCA9IG9idWY7CQkJLyogcmVzZXQgdGhlIHBvaW50ZXIgKi8KKwlvYmMgPSAwOwkJCS8qIGFuZCB0aGUgY291bnRlci4gKi8KKwlyZXR1cm4oeCk7CQkJLyogUmV0dXJuIGNvbnhvJ3MgcmV0dXJuIGNvZGUgKi8KKyAgICB9IGVsc2UgcmV0dXJuKDApOworfQorCisvKiAgQyBLIEMgRyBFIFQgQyAgLS0gIEMtS2VybWl0IENPTk5FQ1QgR2V0IENoYXJhY3RlciAgKi8KKy8qCisgIEJ1ZmZlcmVkIHJlYWQgZnJvbSBjb21tdW5pY2F0aW9uIGRldmljZS4KKyAgUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIsIHJlZmlsbGluZyB0aGUgYnVmZmVyIGlmIG5lY2Vzc2FyeS4KKyAgT24gZXJyb3IsIHJldHVybnMgdHRpbmMncyByZXR1cm4gY29kZSAoc2VlIHR0aW5jKCkgZGVzY3JpcHRpb24pLgorICBEdW1teSBhcmd1bWVudCBmb3IgY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb25zIHdpdGggdHRpbmMoKQorICBzbyBhIHBvaW50ZXIgdG8gdGhpcyBmdW5jdGlvbiBjYW4gYmUgcGFzc2VkIHRvIHRuX2Rvb3AoKS4KKyovCitpbnQKK2NrY2dldGMoZHVtbXkpIGludCBkdW1teTsgeworICAgIGludCBjLCBuOworI2lmZGVmIENLX1NTTAorICAgIGV4dGVybiBpbnQgc3NsX2FjdGl2ZV9mbGFnLCB0bHNfYWN0aXZlX2ZsYWc7CisjZW5kaWYgLyogQ0tfU1NMICovCisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgLyogTm8gYnVmZmVyaW5nIGZvciBwb3NzaWJseSBlbmNyeXB0ZWQgY29ubmVjdGlvbnMgKi8KKyAgICBpZiAobmV0d29yayAmJiBJU19URUxORVQoKSAmJiBURUxPUFRfTUUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSkKKyAgICAgIHJldHVybih0dGluYygwKSk7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmIENLX1NTTAorICAgIGlmIChzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnKQorICAgICAgICByZXR1cm4odHRpbmMoMCkpOworI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgaWYgKGliYyA8IDEpIHsJCQkvKiBOZWVkIHRvIHJlZmlsbCBidWZmZXI/ICovCisJaWJjID0gMDsJCQkvKiBZZXMsIHJlc2V0IGNvdW50ICovCisJaWJwID0gaWJ1ZjsJCQkvKiBhbmQgYnVmZmVyIHBvaW50ZXIgKi8KKwljID0gdHRpbmMoMCk7CQkJLyogUmVhZCBvbmUgY2hhcmFjdGVyLCBibG9ja2luZyAqLworCWlmIChjIDwgMCkgewkJCS8qIElmIGVycm9yLCByZXR1cm4gZXJyb3IgY29kZSAqLworCSAgICByZXR1cm4oYyk7CisJfSBlbHNlIHsJCQkvKiBPdGhlcndpc2UsIGdvdCBvbmUgY2hhcmFjdGVyICovCisJICAgICppYnArKyA9IGM7CQkJLyogQWR2YW5jZSBidWZmZXIgcG9pbnRlciAqLworCSAgICBpYmMrKzsJCQkvKiBhbmQgY291bnQuICovCisJfQorCWlmICgobiA9IHR0Y2hrKCkpID4gMCkgewkvKiBBbnkgbW9yZSB3YWl0aW5nPyAqLworCSAgICBpZiAobiA+IChJQlVGTCAtIGliYykpCS8qIEdldCB0aGVtIGFsbCBhdCBvbmNlLiAqLworCSAgICAgIG4gPSBJQlVGTCAtIGliYzsJCS8qIERvbid0IG92ZXJmbG93IGJ1ZmZlciAqLworCSAgICAgIGlmICgobiA9IHR0eGluKG4sKENIQVIgKilpYnApKSA+IDApIHsKKwkJICBpYmMgKz0gbjsJCS8qIEFkdmFuY2UgY291bnRlciAqLworICAgICAgICAgICAgICB9CisJfSBlbHNlIGlmIChuIDwgMCkgewkJLyogRXJyb3I/ICovCisJICAgIHJldHVybihuKTsJCQkvKiBSZXR1cm4gdGhlIGVycm9yIGNvZGUgKi8KKwl9CisJaWJwID0gaWJ1ZjsJCQkvKiBQb2ludCB0byBiZWdpbm5pbmcgb2YgYnVmZmVyICovCisgICAgfQorICAgIGMgPSAqaWJwKysgJiAweGZmOwkJCS8qIEdldCBuZXh0IGNoYXJhY3RlciBmcm9tIGJ1ZmZlciAqLworICAgIGliYy0tOwkJCQkvKiBSZWR1Y2UgYnVmZmVyIGNvdW50ICovCisgICAgLyogZGVidWcoRjAwMCwiQ0tDR0VUQyIsIiIsYyk7ICovCisgICAgcmV0dXJuKGMpOwkJCQkvKiBSZXR1cm4gdGhlIGNoYXJhY3RlciAqLworfQorCisvKgorICAgS2V5Ym9hcmQgaGFuZGxpbmcsIGJ1ZmZlcmVkIGZvciBzcGVlZCwgd2hpY2ggaXMgbmVlZGVkIHdoZW4gQy1LZXJtaXQgaXMKKyAgIGluIENPTk5FQ1QgbW9kZSBiZXR3ZWVuIHR3byBvdGhlciBjb21wdXRlcnMgdGhhdCBhcmUgdHJhbnNmZXJyaW5nIGRhdGEuCisqLworc3RhdGljIGNoYXIgKmticDsJCQkvKiBLZXlib2FyZCBpbnB1dCBidWZmZXIgcG9pbnRlciAqLworc3RhdGljIGludCBrYmM7CQkJCS8qIEtleWJvYXJkIGlucHV0IGJ1ZmZlciBjb3VudCAqLworCisjaWZkZWYgQ0tfU01BTEwJCQkJLyogS2V5Ym9hcmQgaW5wdXQgYnVmZmVyIGxlbmd0aCAqLworI2RlZmluZSBLQlVGTCAzMgkJCS8qIFNtYWxsIGZvciBQRFAtMTEgVU5JWCAqLworI2Vsc2UKKyNkZWZpbmUgS0JVRkwgMjU3CQkJLyogUmVndWxhciBrZXJuZWwgc2l6ZSBmb3Igb3RoZXJzICovCisjZW5kaWYgLyogQ0tfU01BTEwgKi8KKworI2lmZGVmIERZTkFNSUMKK3N0YXRpYyBjaGFyICprYnVmID0gTlVMTDsKKyNlbHNlCitzdGF0aWMgY2hhciBrYnVmW0tCVUZMXTsKKyNlbmRpZiAvKiBEWU5BTUlDICovCisKKy8qIE1hY3JvIGZvciByZWFkaW5nIGtleXN0cm9rZXMuICovCisKKyNkZWZpbmUgQ09OR0tTKCkgKCgoLS1rYmMpPj0wKSA/ICgoaW50KSgqa2JwKyspICYgMDM3NykgOiBrYmdldCgpKQorCisvKgorICBOb3RlIHRoYXQgd2UgY2FsbCByZWFkKCkgZGlyZWN0bHkgaGVyZSwgbm9ybWFsbHkgYSBuby1ubywgYnV0IGluIHRoaXMgY2FzZQorICB3ZSBrbm93IGl0J3MgVU5JWCBhbmQgd2UncmUgb25seSBkb2luZyB3aGF0IGNvbmluYygwKSB3b3VsZCBoYXZlIGRvbmUsCisgIGV4Y2VwdCB3ZSdyZSByZWFkaW5nIGEgYmxvY2sgb2YgY2hhcmFjdGVycyByYXRoZXIgdGhhbiBqdXN0IG9uZS4gIFRoZXJlIGlzLAorICBhdCBwcmVzZW50LCBubyBjb254aW4oKSBhbmFsb2cgdG8gdHR4aW4oKSBmb3IgY2h1bmsgcmVhZHMsIGFuZCBpbnN0aXR1dGluZworICBvbmUgd291bGQgb25seSBhZGQgZnVuY3Rpb24tY2FsbCBvdmVyaGVhZCBhcyBpdCB3b3VsZCBvbmx5IGJlIGEgd3JhcHBlciBmb3IKKyAgYSByZWFkKCkgY2FsbCBhbnl3YXkuCisKKyAgQW5vdGhlciBub3RlOiBXZSBzdGljayBpbiB0aGlzIHJlYWQoKSB0aWxsIHRoZSB1c2VyIHR5cGVzIHNvbWV0aGluZy4KKyAgQnV0IHdlIGtub3cgdGhleSBhbHJlYWR5IGRpZCwgc2luY2Ugc2VsZWN0KCkgc2FpZCBzby4gIFRoZXJlZm9yZSBzb21ldGhpbmcKKyAgd291bGQgbmVlZCB0byBiZSBtaWdodHkgd3JvbmcgYmVmb3JlIHdlIGdldCBzdHVjayBoZXJlLgorKi8KK3N0YXRpYyBpbnQJCQkJLyogS2V5Ym9hcmQgYnVmZmVyIGZpbGxlciAqLwora2JnZXQoKSB7CisjaWZkZWYgRUlOVFIKKyAgICBpbnQgdHJpZXMgPSAxMDsJCQkvKiBJZiByZWFkKCkgaXMgaW50ZXJydXB0ZWQsICovCisgICAgaW50IG9rID0gMDsKKyAgICB3aGlsZSAodHJpZXMtLSA+IDApIHsJCS8qIHRyeSBhIGZldyB0aW1lcy4uLiAqLworI2VuZGlmIC8qIEVJTlRSICovCisJa2JjID0gY29uY2hrKCk7CQkJLyogSG93IG1hbnkgY2hhcnMgd2FpdGluZz8gKi8KKwlkZWJ1ZyhGMTAxLCJrYmdldCBrYmMiLCIiLGtiYyk7CisJaWYgKGtiYyA8IDEpCisJICBrYmMgPSAxOwkJCS8qIElmIG5vbmUgb3IgZHVubm8sIHdhaXQgZm9yIG9uZS4gKi8KKwllbHNlIGlmIChrYmMgPiBLQlVGTCkJCS8qIElmIHRvbyBtYW55LCAqLworCSAga2JjID0gS0JVRkw7CQkJLyogb25seSByZWFkIHRoaXMgbWFueS4gKi8KKwlpZiAoKGtiYyA9IHJlYWQoMCwga2J1Ziwga2JjKSkgPCAxKSB7IC8qIE5vdyByZWFkIGl0L3RoZW0uICovCisJICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1Qga2JnZXQgZXJybm8iLCIiLGVycm5vKTsJLyogR290IGFuIGVycm9yLiAqLworI2lmZGVmIEVJTlRSCisJICAgIGlmIChlcnJubyA9PSBFSU5UUikJCS8qIEludGVycnVwdGVkIHN5c3RlbSBjYWxsLiAqLworCSAgICAgIGNvbnRpbnVlOwkJCS8qIFRyeSBhZ2FpbiwgdXAgdG8gbGltaXQuICovCisJICAgIGVsc2UJCQkvKiBTb21ldGhpbmcgZWxzZS4gKi8KKyNlbmRpZiAvKiBFSU5UUiAqLworCSAgICAgIHJldHVybigtMSk7CQkvKiBQYXNzIGFsb25nIHJlYWQoKSBlcnJvci4gKi8KKwl9CisjaWZkZWYgRUlOVFIKKwllbHNlIHsgb2sgPSAxOyBicmVhazsgfQorICAgIH0KKyAgICBpZiAoIW9rKSByZXR1cm4oLTEpOworI2VuZGlmIC8qIEVJTlRSICovCisgICAga2JwID0ga2J1ZjsJCQkJLyogQWRqdXN0IGJ1ZmZlciBwb2ludGVyLCAqLworICAgIGtiYy0tOwkJCQkvKiBjb3VudCwgKi8KKyAgICByZXR1cm4oKGludCkoKmticCsrKSAmIDAzNzcpOwkvKiBhbmQgcmV0dXJuIGZpcnN0IGNoYXJhY3Rlci4gKi8KK30KKworI2lmZGVmIEJFQk9YCisvKgorICogQ3JlYXRlU29ja2V0UGFpciAtLQorICoKKyAqCVRoaXMgcHJvY2VkdXJlIGNyZWF0ZXMgYSBjb25uZWN0ZWQgc29ja2V0IHBhaXIKKyAqCisgKiBSZXN1bHRzOgorICoJMCBpZiBPSywgdGhlIGVycm9yIGlmIG5vdCBPSy4KKyAqCisgKiBTaWRlIGVmZmVjdHM6CisgKglOb25lCisgKi8KK2ludAorc29ja2V0cGFpcihpbnQgKnBhaXIpIHsKKyAgICBpbnQgc2VydnNvY2s7CisgICAgaW50IHZhbDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2Vydl9hZGRyLCBjbGlfYWRkcjsKKyAgICBleHRlcm4gY2hhciBteWlwYWRkcltdOworCisgICAgZGVidWcoRjExMCwic29ja2V0cGFpciIsbXlpcGFkZHIsMCk7CisKKyAgICBpZiAobXlpcGFkZHJbMF0gPT0gMCkKKyAgICAgIGdldGxvY2FsaXBhZGRyKCk7CisKKyAgICBzZXJ2c29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgICAgaWYgKHNlcnZzb2NrID09IDApIHsKKwlyZXR1cm4gaF9lcnJubzsKKyAgICB9CisgICAgZGVidWcoRjExMSwic29ja2V0cGFpciIsInNvY2tldCIsc2VydnNvY2spOworCisgICAgbWVtc2V0KCZzZXJ2X2FkZHIsIDAsIHNpemVvZihzZXJ2X2FkZHIpKTsKKyAgICBzZXJ2X2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgc2Vydl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworICAgIHNlcnZfYWRkci5zaW5fcG9ydCA9IGh0b25zKDApOworCisgICAgdmFsID0gc2l6ZW9mKHNlcnZfYWRkcik7CisgICAgaWYgKGJpbmQoc2VydnNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZfYWRkciwgdmFsKSA8IDApIHsKKwljbG9zZXNvY2tldChzZXJ2c29jayk7CisJcmV0dXJuIGhfZXJybm87CisgICAgfQorICAgIGRlYnVnKEYxMTEsInNvY2tldHBhaXIiLCJiaW5kIiwwKTsKKworICAgIGxpc3RlbihzZXJ2c29jaywgMSk7CisgICAgZGVidWcoRjExMSwic29ja2V0cGFpciIsImxpc3RlbiIsMCk7CisKKyAgICBpZiAoZ2V0c29ja25hbWUoc2VydnNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZfYWRkciwgJnZhbCkgPCAwKSB7CisJY2xvc2Vzb2NrZXQoc2VydnNvY2spOworCXJldHVybiBoX2Vycm5vOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJzb2NrZXRwYWlyIiwiZ2V0c29ja25hbWUiLDApOworCisgICAgcGFpclswXSA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgICAgaWYgKHBhaXJbMF0gPT0gMCkgeworCWNsb3Nlc29ja2V0KHNlcnZzb2NrKTsKKwlyZXR1cm4gaF9lcnJubzsKKyAgICB9CisgICAgZGVidWcoRjExMSwic29ja2V0cGFpciIsInNvY2tldCIscGFpclswXSk7CisKKyAgICBtZW1zZXQoJmNsaV9hZGRyLCAwLCBzaXplb2YoY2xpX2FkZHIpKTsKKyAgICBjbGlfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBjbGlfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIobXlpcGFkZHJbMF0/bXlpcGFkZHI6IjEyNy4wLjAuMSIpOworICAgIGNsaV9hZGRyLnNpbl9wb3J0ID0gc2Vydl9hZGRyLnNpbl9wb3J0OworCisgICAgaWYgKGNvbm5lY3QocGFpclswXSwoc3RydWN0IHNvY2thZGRyICopICZjbGlfYWRkciwgc2l6ZW9mKGNsaV9hZGRyKSkgPCAwKSB7CisJY2xvc2Vzb2NrZXQocGFpclswXSk7CisJY2xvc2Vzb2NrZXQoc2VydnNvY2spOworCXJldHVybiBoX2Vycm5vOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJzb2NrZXRwYWlyIiwiY29ubmVjdCIsMCk7CisKKyAgICBwYWlyWzFdID0gYWNjZXB0KHNlcnZzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZzZXJ2X2FkZHIsICZ2YWwpOworICAgIGlmIChwYWlyWzFdID09IDApIHsKKwljbG9zZXNvY2tldChwYWlyWzBdKTsKKwljbG9zZXNvY2tldChzZXJ2c29jayk7CisJcmV0dXJuIGhfZXJybm87CisgICAgfQorICAgIGRlYnVnKEYxMTEsInNvY2tldHBhaXIiLCJhY2NlcHQiLHBhaXJbMV0pOworCisgICAgY2xvc2Vzb2NrZXQoc2VydnNvY2spOworICAgIGRlYnVnKEYxMTEsInNvY2tldHBhaXIiLCJjbG9zZXNvY2tldCIsMCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2xvbmcKK2tiZHJlYWQodm9pZCAqIHBhcmFtKSB7CisgICAgaW50IHNvY2sgPSAoaW50KSBwYXJhbTsKKyAgICBjaGFyIGNoOworICAgIGludCByYyA9IDA7CisKKyAgICBkZWJ1ZyhGMTExLCJrYmRyZWFkIiwic29jayIsc29jayk7CisKKyAgICB3aGlsZSAocmMgPj0gMCkgeworCXJjID0gcmVhZChmaWxlbm8oc3RkaW4pLCAmY2gsIDEpOyAvKiBSZWFkIGEgY2hhcmFjdGVyLiAqLworCWlmIChyYyA+IDApIHsKKwkgICAgcmMgPSBzZW5kKHNvY2ssJmNoLDEsMCk7CisJICAgIC8qIGRlYnVnKEYwMDAsImtiZHJlYWQiLCJzZW5kKCkiLGNoKTsgKi8KKwkgICAgcHJpbnRmKCJcclxuZ290OiAlYyByYyA9ICVkXHJcbiIsY2gscmMpOworCX0gZWxzZQorCSAgbXNsZWVwKDEwMCk7CisgICAgfQorICAgIGRlYnVnKEYxMTAsImtiZHJlYWQiLCJ0ZXJtaW5hdGluZyIsMCk7CisgICAgcmV0dXJuKHJjKTsKK30KKyNlbmRpZiAvKiBCRUJPWCAqLworCisjaWZkZWYgQ0tMRUFSTgorc3RhdGljIFZPSUQKK2xlYXJuY2hhcihjKSBpbnQgYzsgewkJCS8qIExlYXJuZWQgc2NyaXB0IGtleWJvYXJkIGNoYXJhY3RlciAqLworICAgIGludCBjYzsKKyAgICBjaGFyIHhidWZbOF07CisKKyAgICBpZiAoIWxlYXJuaW5nIHx8ICFsZWFybmZwKQorICAgICAgcmV0dXJuOworCisgICAgc3dpdGNoIChsZWFybnN0KSB7CQkJLyogTGVhcm4gc3RhdGUuLi4gKi8KKyAgICAgIGNhc2UgMDoJCQkJLyogTmV1dHJhbCAqLworICAgICAgY2FzZSAxOgkJCQkvKiBOZXQgKi8KKwlpZiAobGVhcm5iYyA+IDApIHsJCS8qIEhhdmUgbmV0IGNoYXJhY3RlcnM/ICovCisJICAgIGNoYXIgYnVmW0xFQVJOQlVGU0laXTsKKwkgICAgaW50IGksIGosIG47CisJICAgIFVMT05HIHQ7CisKKwkgICAgdCA9IChVTE9ORykgdGltZSgwKTsJLyogQ2FsY3VsYXRlIElOUFVUIHRpbWVvdXQgKi8KKwkgICAgaiA9IHQgLSBsZWFybnQxOworCSAgICBqICs9IChqIC8gNCkgPiAwID8gKGogLyA0KSA6IDE7IC8qIEFkZCBzb21lIHNsb3AgKi8KKwkgICAgaWYgKGogPCAyKSBqID0gMjsJCSAgICAvKiAyIHNlY29uZHMgbWluaW11bSAqLworCisJICAgIGZwdXRzKCJcbklOUFVUICIsbGVhcm5mcCk7CS8qIEdpdmUgSU5QVVQgY29tbWFuZCBmb3IgdGhlbSAqLworCSAgICBmcHV0cyhja2l0b2EoaiksbGVhcm5mcCk7CisJICAgIGZwdXRzKCIgeyIsbGVhcm5mcCk7CisJICAgIGxlYXJudDEgPSB0OworCisJICAgIG4gPSBMRUFSTkJVRlNJWjsKKwkgICAgaWYgKGxlYXJuYmMgPCBMRUFSTkJVRlNJWikgeyAgLyogQ2lyY3VsYXIgYnVmZmVyICovCisJCW4gPSBsZWFybmJjOwkJICAvKiAgaGFzbid0IHdyYXBwZWQgeWV0LiAqLworCQlsZWFybmJwID0gMDsKKwkgICAgfQorCSAgICBqID0gMDsJCQkvKiBDb3B5IHRvIGxpbmVhciBidWZmZXIgKi8KKwkgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewkvKiBOdW1iZXIgb2YgY2hhcnMgaW4gY2lyY3VsYXIgYnVmICovCisKKwkJY2MgPSBsZWFybmJ1ZlsobGVhcm5icCArIGkpICUgTEVBUk5CVUZTSVpdOworCisJCS8qIExhdGVyIGFjY291bnQgZm9yIHByb21wdHMgdGhhdCBlbmQgd2l0aCBhIG5ld2xpbmU/ICovCisKKwkJaWYgKGNjID09IENSICYmIGogPiAwKSB7CisJCSAgICBpZiAoYnVmW2otMV0gIT0gTEYpCisJCSAgICAgIGogPSAwOworCQl9CisJCWJ1ZltqKytdID0gY2M7CisJICAgIH0KKwkgICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewkvKiBOb3cgY29weSBvdXQgdGhlIGJ1ZmZlciAqLworCQljYyA9IGJ1ZltpXTsJCS8qIGludGVycHJldGluZyBjb250cm9sIGNoYXJzICovCisJCWlmIChjYyA9PSAwKSB7CQkvKiBXZSBkb24ndCBJTlBVVCBOVUxzICovCisJCSAgICBjb250aW51ZTsKKwkJfSBlbHNlIGlmIChjYyA8IFNQIHx8CS8qIENvbnRyb2xzIG5lZWQgcXVvdGluZyAqLworCQkJICAgKGNjID4gMTI2ICYmIGNjIDwgMTYwKSkgeworCQkgICAgY2ttYWttc2coeGJ1Ziw4LCJcXHsiLGNraXRvYSgoaW50KWNjKSwifSIsTlVMTCk7CisJCSAgICBmcHV0cyh4YnVmLGxlYXJuZnApOworCQl9IGVsc2UgewkJLyogUGxhaW4gY2hhcmFjdGVyICovCisJCSAgICBwdXRjKGNjLGxlYXJuZnApOworCQl9CisJICAgIH0KKwkgICAgZnB1dHMoIn1cbklGIEZBSUwgU1RPUCAxIElOUFVUIHRpbWVvdXQiLGxlYXJuZnApOworCSAgICBsZWFybmJjID0gMDsKKwl9CisJbGVhcm5icCA9IDA7CisJZnB1dHMoIlxuUEFVU0UgMVxuT1VUUFVUICIsbGVhcm5mcCk7IC8qIEVtaXQgT1VUUFVUIGFuZCBmYWxsIHRocnUgKi8KKworICAgICAgY2FzZSAyOgkJCQkvKiBBbHJlYWR5IGluIEtleWJvYXJkIHN0YXRlICovCisJaWYgKGMgPT0gMCkgeworCSAgICBmcHV0cygiXFxOIixsZWFybmZwKTsKKwl9IGVsc2UgaWYgKGMgPT0gLTcpIHsKKwkgICAgZnB1dHMoIlxcQiIsbGVhcm5mcCk7CisJfSBlbHNlIGlmIChjID09IC04KSB7CisJICAgIGZwdXRzKCJcXEwiLGxlYXJuZnApOworCX0gZWxzZSBpZiAoYyA8IFNQIHx8IChjID4gMTI2ICYmIGMgPCAxNjApKSB7CisJICAgIGNrbWFrbXNnKHhidWYsOCwiXFx7Iixja2l0b2EoKGludCljKSwifSIsTlVMTCk7CisJICAgIGZwdXRzKHhidWYsbGVhcm5mcCk7CisJfSBlbHNlIHsKKwkgICAgcHV0YyhjLGxlYXJuZnApOworCX0KKyAgICB9Cit9CisjZW5kaWYgLyogQ0tMRUFSTiAqLworCitzdGF0aWMgaW50IHByaW50YmFyID0gMDsKKworI2RlZmluZSBPVVRYQlVGU0laIDE1CitzdGF0aWMgQ0hBUiBpbnhidWZbT1VUWEJVRlNJWisxXTsJLyogSG9zdC10by1zY3JlZW4gZXhwYW5zaW9uIGJ1ZmZlciAqLworc3RhdGljIGludCBpbnhjb3VudCA9IDA7CQkvKiBhbmQgY291bnQgKi8KK3N0YXRpYyBDSEFSIG91dHhidWZbT1VUWEJVRlNJWisxXTsJLyogS2V5Ym9hcmQtdG8taG9zdCBleHBhbnNpb24gYnVmICovCitzdGF0aWMgaW50IG91dHhjb3VudCA9IDA7CQkvKiBhbmQgY291bnQgKi8KKworaW50Citjb25lY3QoKSB7CisgICAgaW50IHJjID0gMDsJCQkJLyogUmV0dXJuIGNvZGU6IDAgPSBmYWlsLCAxID0gT0sgKi8KKyAgICBpbnQgaSwgeCA9IDAsIHByZXYgPSAtMTsJCS8qIFJlYXNvbiBjb2RlIGluIGN4X3N0YXR1cyAqLworI2lmZGVmIENLTEVBUk4KKyAgICBpbnQgY3JmbGFnID0gMDsKKyNlbmRpZiAvKiBDS0xFQVJOICovCisgICAgcmVnaXN0ZXIgaW50IGMgPSAtMSwgYzIsIGNzYXZlOwkvKiBDaGFyYWN0ZXJzICovCisjaWZkZWYgVE5DT0RFCisgICAgaW50IHR4OwkJCQkvKiBGb3IgVGVsbmV0IG5lZ290aWF0aW9ucyAqLworI2VuZGlmIC8qIFROQ09ERSAqLworICAgIGludCBhcGNyYyA9IDA7CQkJLyogRm9yIEFQQyBhbmQgdHJhbnNwYXJlbnQgcHJpbnQgKi8KKyAgICBpbnQgbiwga2Jpbiwgc2Nybm91dDsJCS8qIHNlbGVjdCgpIGl0ZW1zLi4uICovCisgICAgZmRfc2V0IGluLCBvdXQsIGVycjsJCS8qIEZpbGUgZGVzY3JpcHRvciBzZXRzICovCisgICAgaW50IGdvdG5ldCA9IDA7CQkJLyogRmxhZyBmb3IgbmV0IHJlYWR5IHRvIHJlYWQgKi8KKyAgICBpbnQgZ290a2JkID0gMDsJCQkvKiBGbGFnIGZvciBrZXlib2FyZCByZWFkeSB0byByZWFkICovCisgICAgaW50IG9sZHBydCA9IDA7CQkJLyogVXNlZCB3aXRoIHByaW50aW5nICovCisgICAgaW50IG1zZ2ZsZyA9IDA7CisgICAgY2hhciBjYnVmWzJdOwkJCS8qIERpdHRvICovCisKKyNpZmRlZiBCRUJPWAorICAgIGludCB0aWQgPSAwOwkJCS8qIFRocmVhZCBJRCAqLworICAgIGludCBwYWlyWzJdOwkJCS8qIFNvY2tldCBQYWlyICovCisgICAgQ0hBUiBjaDsKKyAgICBDSEFSIGJ1Zls2NF07CisjZW5kaWYgLyogQkVCT1ggKi8KKworICAgIGN4X3N0YXR1cyA9IENTWF9JTlRFUk5BTDsKKyAgICBkZWJvayA9IDE7CisKKyNpZmRlZiBCRUJPWAorICAgIHsKKwkvKiBDcmVhdGUgYSBzb2NrZXQgcGFpciB0byBiZSB1c2VkIGZvciB0aGUga2V5Ym9hcmQgaW5wdXQgKi8KKwlpZiAoc29ja2V0cGFpcihwYWlyKSkgeworCSAgICBkZWJ1ZyhGMTEwLCJjb25lY3QiLCJ1bmFibGUgdG8gY3JlYXRlIHNvY2tldCBwYWlyIiwwKTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisJZGVidWcoRjExMSwiY29ubmVjdCIsInNvY2tldCBwYWlyWzBdIixwYWlyWzBdKTsKKwlkZWJ1ZyhGMTExLCJjb25uZWN0Iiwic29ja2V0IHBhaXJbMV0iLHBhaXJbMV0pOworCisJLyogQXNzaWduIG9uZSBlbmQgb2YgdGhlIHNvY2tldCB0byBrYmluICovCisJa2JpbiA9IHBhaXJbMF07CisgICAgICAgIHRpZCA9IHNwYXduX3RocmVhZChrYmRyZWFkLAorCQkJICAgIktiZCB0byBTb2NrZXQgUGFpciIsCisJCQkgICAgQl9OT1JNQUxfUFJJT1JJVFksCisJCQkgICAodm9pZCAqKXBhaXJbMV0KKwkJCSAgICk7CisgICAgICAgIHJlc3VtZV90aHJlYWQodGlkKTsKKwlkZWJ1ZyhGMTEwLCJjb25uZWN0IiwidGlkIix0aWQpOworICAgIH0KKyNlbHNlIC8qIEJFQk9YICovCisgICAga2JpbiA9IGZpbGVubyhzdGRpbik7CQkvKiBzdGRpbiBmaWxlIGRlc2NyaXB0b3IgKi8KKyNlbmRpZiAvKiBCRUJPWCAqLworCisgICAgc2Nybm91dCA9IGZpbGVubyhzdGRvdXQpOwkJLyogc3Rkb3V0IGZpbGUgZGVzY3JpcHRvciAqLworCisjaWZkZWYgQ0tfVFJJR0dFUgorICAgIG1ha2VzdHIoJnRyaWdnZXJ2YWwsTlVMTCk7CQkvKiBSZXNldCB0cmlnZ2VyICovCisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworCisjaWZkZWYgWFBSSU5UCisgICAgZXNjYnVmYyA9IDA7CQkJLyogUmVzZXQgZXNjLXNlcXVlbmNlIGJ1ZmZlciAqLworICAgIGVzY2J1ZlswXSA9IE5VTDsKKyNlbmRpZiAvKiBYUFJJTlQgKi8KKyAgICBjYnVmWzFdID0gTlVMOworCisgICAgdHRpbW9mZigpOwkJCQkvKiBUdXJuIG9mZiBhbnkgdGltZXIgaW50ZXJydXB0cyAqLworICAgIGlmICghbG9jYWwpIHsJCQkvKiBCZSBzdXJlIHdlJ3JlIG5vdCBpbiByZW1vdGUgbW9kZSAqLworI2lmZGVmIE5FVENPTk4KKyNpZmRlZiBORVdGVFAKKwlpZiAoZnRwaXNjb25uZWN0ZWQoKSkKKwkgIHByaW50ZigiU29ycnksIHlvdSBjYW4ndCBDT05ORUNUIHRvIGFuIEZUUCBzZXJ2ZXJcbiIpOworCWVsc2UKKyNlbmRpZiAvKiBORVdGVFAgKi8KKwkgIHByaW50ZigiU29ycnksIHlvdSBtdXN0IFNFVCBMSU5FIG9yIFNFVCBIT1NUIGZpcnN0XG4iKTsKKyNlbHNlCisJcHJpbnRmKCJTb3JyeSwgeW91IG11c3QgU0VUIExJTkUgZmlyc3RcbiIpOworI2VuZGlmIC8qIE5FVENPTk4gKi8KKwlyZXR1cm4oMCk7CisgICAgfQorICAgIGlmIChzcGVlZCA8IDBMICYmIG5ldHdvcmsgPT0gMCAmJiB0dGZkZmxnID09IDApIHsKKwlwcmludGYoIlNvcnJ5LCB5b3UgbXVzdCBTRVQgU1BFRUQgZmlyc3RcbiIpOworCXJldHVybigwKTsKKyAgICB9CisjaWZkZWYgVENQU09DS0VUCisgICAgaWYgKG5ldHdvcmsgJiYgIXR0cGlwZSAmJiAobmV0dHlwZSAhPSBORVRfVENQQiAmJiBuZXR0eXBlICE9IE5FVF9QVFkpKSB7CisJcHJpbnRmKCJTb3JyeSwgbmV0d29yayB0eXBlIG5vdCBzdXBwb3J0ZWRcbiIpOworCXJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZmRlZiBEWU5BTUlDCisgICAgaWYgKCFpYnVmKSB7CisJaWYgKCEoaWJ1ZiA9IG1hbGxvYyhJQlVGTCsxKSkpIHsgLyogQWxsb2NhdGUgaW5wdXQgbGluZSBidWZmZXIgKi8KKwkgICAgcHJpbnRmKCJTb3JyeSwgQ09OTkVDVCBpbnB1dCBidWZmZXIgY2FuJ3QgYmUgYWxsb2NhdGVkXG4iKTsKKwkgICAgcmV0dXJuKDApOworCX0gZWxzZSB7CisJICAgIGlicCA9IGlidWY7CisJICAgIGliYyA9IDA7CisJfQorICAgIH0KKyAgICBpZiAoIW9idWYpIHsKKwlpZiAoIShvYnVmID0gbWFsbG9jKE9CVUZMKzEpKSkgeyAvKiBBbGxvY2F0ZSBvdXRwdXQgbGluZSBidWZmZXIgKi8KKwkgICAgcHJpbnRmKCJTb3JyeSwgQ09OTkVDVCBvdXRwdXQgYnVmZmVyIGNhbid0IGJlIGFsbG9jYXRlZFxuIik7CisJICAgIHJldHVybigwKTsKKwl9IGVsc2UgeworCSAgICBvYnAgPSBvYnVmOworCSAgICBvYmMgPSAwOworCX0KKyAgICB9CisgICAgaWYgKCFrYnVmKSB7CisJaWYgKCEoa2J1ZiA9IG1hbGxvYyhLQlVGTCsxKSkpIHsgLyogQWxsb2NhdGUga2V5Ym9hcmQgaW5wdXQgYnVmZmVyICovCisJICAgIHByaW50ZigiU29ycnksIENPTk5FQ1Qga2V5Ym9hcmQgYnVmZmVyIGNhbid0IGJlIGFsbG9jYXRlZFxuIik7CisJICAgIHJldHVybigwKTsKKwl9CisgICAgfQorICAgIGlmICghdGVtcCkgeworCWlmICghKHRlbXAgPSBtYWxsb2MoVE1QTEVOKzEpKSkgeyAvKiBBbGxvY2F0ZSB0ZW1wb3JhcnkgYnVmZmVyICovCisJICAgIHByaW50ZigiU29ycnksIENPTk5FQ1QgdGVtcG9yYXJ5IGJ1ZmZlciBjYW4ndCBiZSBhbGxvY2F0ZWRcbiIpOworCSAgICByZXR1cm4oMCk7CisJfQorICAgIH0KKyNlbHNlCisgICAgb2JwID0gb2J1ZjsKKyAgICBvYmMgPSAwOworI2VuZGlmIC8qIERZTkFNSUMgKi8KKworICAgIGticCA9IGtidWY7CQkJCS8qIEFsd2F5cyBjbGVhciB0aGVzZS4gKi8KKyAgICAqa2JwID0gTlVMOwkJCQkvKiBObyBuZWVkIHRvIHByZXNlcnZlIHRoZW0gYmV0d2VlbiAqLworICAgIGtiYyA9IDA7CQkJCS8qIENPTk5FQ1Qgc2Vzc2lvbnMuICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIGNvbmVjdCBlbnRyeSB0dHlmZCIsIiIsdHR5ZmQpOworCWRlYnVnKEYxMDEsIkNPTk5FQ1QgY29uZWN0IGVudHJ5IGliYyIsIiIsaWJjKTsKKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIGNvbmVjdCBlbnRyeSBvYmMiLCIiLG9iYyk7CisJZGVidWcoRjEwMSwiQ09OTkVDVCBjb25lY3QgZW50cnkga2JjIiwiIixrYmMpOworI2lmZGVmIENLX1RSSUdHRVIKKwlkZWJ1ZyhGMTEwLCJDT05ORUNUIGNvbmVjdCB0cmlnZ2VyIix0dF90cmlnZ2VyWzBdLDApOworI2VuZGlmIC8qIENLX1RSSUdHRVIgKi8KKwlpZiAodHR5ZmQgPiAtMSkgeworCSAgICBuID0gdHRjaGsoKTsKKwkgICAgZGVidWcoRjEwMSwiQ09OTkVDVCBjb25lY3QgZW50cnkgdHRjaGsiLCIiLG4pOworCX0KKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKworICAgIGlmICh0dHlmZCA8IDApIHsJCQkvKiBJZiBjb21tdW5pY2F0aW9uIGRldmljZSBub3Qgb3BlbiAqLworI2lmZGVmIFRUTEVCVUYKKyAgICAgICAgaW50IG4gPSBsZV9pbmJ1ZigpOworICAgICAgICBkZWJ1ZyhGMTExLCJDT05ORUNUIGxlX2luYnVmKCkiLCJ0dHlmZCA8IDAiLG4pOworICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICAgIHdoaWxlIChuLS0pIHsKKyAgICAgICAgICAgICAgICBDSEFSIGNoOworICAgICAgICAgICAgICAgIGxlX2dldGNoYXIoJmNoKTsKKyAgICAgICAgICAgICAgICBjb25vYyhjaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBUVExFQlVGICovCisKKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIHR0bnByb3RvIiwiIix0dG5wcm90byk7CisJZGVidWcoRjExMSwiQ09OTkVDVCBvcGVuaW5nIix0dG5hbWUsMCk7IC8qIE9wZW4gaXQgbm93ICovCisJaWYgKHR0b3Blbih0dG5hbWUsCisJCSAgICZsb2NhbCwKKwkJICAgbmV0d29yayA/IC1uZXR0eXBlIDogbWRtdHlwLAorCQkgICAwCisJCSAgICkgPCAwKSB7CisJICAgIGNrbWFrbXNnKHRlbXAsVE1QTEVOLCJTb3JyeSwgY2FuJ3Qgb3BlbiAiLHR0bmFtZSxOVUxMLE5VTEwpOworCSAgICBwZXJyb3IodGVtcCk7CisJICAgIGRlYnVnKEYxMTAsIkNPTk5FQ1Qgb3BlbiBmYWlsdXJlIix0dG5hbWUsMCk7CisJICAgIHJldHVybigwKTsKKwl9CisKKyNpZmRlZiBJS1NfT1BUSU9OCisJLyogSWYgcGVlciBpcyBpbiBLZXJtaXQgc2VydmVyIG1vZGUsIHJldHVybiBub3cuICovCisJaWYgKFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQudV9zdGFydCkgeworCSAgICBjeF9zdGF0dXMgPSBDU1hfSUtTRDsKKwkgICAgcmV0dXJuKDApOworCX0KKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisgICAgfQorICAgIGRvaGFuZ3VwID0gMDsJCQkvKiBIYW5ndXAgbm90IHJlcXVlc3RlZCB5ZXQgKi8KKworICAgIG1zZ2ZsZyA9ICFxdWlldAorI2lmZGVmIENLX0FQQworICAgICAgJiYgIWFwY2FjdGl2ZQorI2VuZGlmIC8qIENLX0FQQyAqLworCTsKKworICAgIGlmIChtc2dmbGcpIHsKKyNpZmRlZiBORVRDT05OCisJaWYgKG5ldHdvcmspIHsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisJICAgIGV4dGVybiBpbnQgbWVfZW5jcnlwdCwgdV9lbmNyeXB0OworCSAgICBpZiAoY2tfdG5fZW5jcnlwdGluZygpICYmIGNrX3RuX2RlY3J5cHRpbmcoKSkKKwkgICAgICBwcmludGYoIlNFQ1VSRSBjb25uZWN0aW9uIHRvIGhvc3QgJXMiLHR0bmFtZSk7CisJICAgIGVsc2UKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisJICAgICAgaWYgKHR0cGlwZSB8fCB0dHB0eSkKKwkJcHJpbnRmKCJDb25uZWN0aW5nIHZpYSBjb21tYW5kIFwiJXNcIiIsdHRuYW1lKTsKKwkgICAgICBlbHNlCisJCXByaW50ZigiQ29ubmVjdGluZyB0byBob3N0ICVzIix0dG5hbWUpOworCX0gZWxzZSB7CisjZW5kaWYgLyogTkVUQ09OTiAqLworCSAgICBwcmludGYoIkNvbm5lY3RpbmcgdG8gJXMiLHR0bmFtZSk7CisJICAgIGlmIChzcGVlZCA+IC0xTCkgcHJpbnRmKCIsIHNwZWVkICVsZCIsc3BlZWQpOworI2lmZGVmIE5FVENPTk4KKwl9CisjZW5kaWYgLyogTkVUQ09OTiAqLworCWlmICh0dF9lc2NhcGUpIHsKKwkgICAgcHJpbnRmKCJcclxuIik7CisJICAgIHNob2VzYyhlc2NhcGUpOworCSAgICBwcmludGYoIlR5cGUgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgQyB0byBnZXQgYmFjayxcclxuIik7CisJICAgIHByaW50Zigib3IgZm9sbG93ZWQgYnkgPyB0byBzZWUgb3RoZXIgb3B0aW9ucy5cclxuIik7CisJfSBlbHNlIHsKKwkgICAgcHJpbnRmKCIuXHJcblxuRVNDQVBFIENIQVJBQ1RFUiBJUyBESVNBQkxFRFxyXG5cbiIpOworCX0KKwlpZiAoc2VzbG9nKSB7CisJICAgIGV4dGVybiBpbnQgc2xvZ3RzOworCSAgICBjaGFyICogcyA9ICIiOworCSAgICBzd2l0Y2ggKHNlc3NmdCkgeworCSAgICAgIGNhc2UgWFlGVF9EOgorCQlzID0gImRlYnVnIjsgYnJlYWs7CisJICAgICAgY2FzZSBYWUZUX1Q6CisJCXMgPSBzbG9ndHMgPyAidGltZXN0YW1wZWQtdGV4dCIgOiAidGV4dCI7IGJyZWFrOworCSAgICAgIGRlZmF1bHQ6CisJCXMgPSAiYmluYXJ5IjsKKwkgICAgfQorCSAgICBwcmludGYoIlNlc3Npb24gTG9nOiAlcywgJXNcclxuIixzZXNmaWwscyk7CisJfQorCWlmIChkZWJzZXMpIHByaW50ZigiRGVidWdnaW5nIERpc3BsYXkuLi4pXHJcbiIpOworICAgIH0KKworLyogQ29uZGl0aW9uIGNvbnNvbGUgdGVybWluYWwgYW5kIGNvbW11bmljYXRpb24gbGluZSAqLworCisgICAgaWYgKGNvbmJpbigoY2hhcillc2NhcGUpIDwgMCkgeworCXByaW50ZigiU29ycnksIGNhbid0IGNvbmRpdGlvbiBjb25zb2xlIHRlcm1pbmFsXG4iKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlyZXR1cm4oMCk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgY21hc2siLCIiLGNtYXNrKTsKKyAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGNtZG1zayIsIiIsY21kbXNrKTsKKyAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIHNwZWVkIGJlZm9yZSB0dHZ0IiwiIixzcGVlZCk7CisgICAgaWYgKChuID0gdHR2dChzcGVlZCxmbG93KSkgPCAwKSB7CS8qIEVudGVyICJ2aXJ0dWFsIHRlcm1pbmFsIiBtb2RlICovCisJaWYgKCFuZXR3b3JrKSB7CisJICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgdHR2dCIsIiIsbik7CisJICAgIHR0aGFuZygpOwkJCS8qIEhhbmcgdXAgYW5kIGNsb3NlIHRoZSBkZXZpY2UuICovCisJICAgIHR0Y2xvcygwKTsKKwkgICAgZG9sb2dlbmQoKTsKKwkgICAgaWYgKHR0b3Blbih0dG5hbWUsCQkvKiBPcGVuIGl0IGFnYWluLi4uICovCisJCSAgICAgICAmbG9jYWwsCisJCSAgICAgICBuZXR3b3JrID8gLW5ldHR5cGUgOiBtZG10eXAsCisJCSAgICAgICAwCisJCSAgICAgICApIDwgMCkgeworCQljeF9zdGF0dXMgPSBDU1hfSU5URVJOQUw7CisJCWNrbWFrbXNnKHRlbXAsVE1QTEVOLCJTb3JyeSwgY2FuJ3QgcmVvcGVuICIsdHRuYW1lLE5VTEwsTlVMTCk7CisJCXBlcnJvcih0ZW1wKTsKKwkJcmV0dXJuKDApOworCSAgICB9CisjaWZkZWYgSUtTX09QVElPTgorCSAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC51X3N0YXJ0KSB7CisJCWN4X3N0YXR1cyA9IENTWF9JS1NEOworCQlyZXR1cm4oMCk7CisJICAgIH0KKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisKKwkgICAgaWYgKHR0dnQoc3BlZWQsZmxvdykgPCAwKSB7CS8qIFRyeSB2aXJ0dWFsIHRlcm1pbmFsIG1vZGUgYWdhaW4uICovCisJCWNvbnJlcygpOwkJLyogRmFpbHVyZSB0aGlzIHRpbWUgaXMgZmF0YWwuICovCisJCXByaW50ZigiU29ycnksIENhbid0IGNvbmRpdGlvbiBjb21tdW5pY2F0aW9uIGxpbmVcbiIpOworCQljeF9zdGF0dXMgPSBDU1hfSU5URVJOQUw7CisJCXJldHVybigwKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgZGVidWcoRjEwMSwiQ09OTkVDVCB0dHZ0IG9rLCBlc2NhcGUiLCIiLGVzY2FwZSk7CisKKyAgICAvKiBEZXNwaXRlIHR0dnQoKSB0aGlzIGlzIHN0aWxsIG5lZWRlZCBpbiBIUC1VWCAqLworICAgIC8qIGJlY2F1c2Ugb2YgdGhlIEhQLTkwMDAgPFJFU0VUPiBrZXkuKi8KKworICAgIHNpZ25hbChTSUdJTlQsIFNJR19JR04pOworICAgIHNpZ25hbChTSUdRVUlULCBTSUdfSUdOKTsKKworICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgY2Fycmllci13YXRjaCIsIiIsY2Fycmllcik7CisgICAgaWYgKCghbmV0d29yayAKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgIHx8IGlzdG5jb21wb3J0KCkKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisJKSAmJiAoY2FycmllciAhPSBDQVJfT0ZGKSkgeworCWludCB4OworCXggPSB0dGdtZG0oKTsKKwlkZWJ1ZyhGMTAwLCJDT05ORUNUIHR0Z21kbSIsIiIseCk7CisJaWYgKCh4ID4gLTEpICYmICEoeCAmIEJNX0RDRCkpIHsKKyNpZm5kZWYgTk9ISU5UUworCSAgICBleHRlcm4gaW50IGhpbnRzOworI2VuZGlmIC8qIE5PSElOVFMgKi8KKwkgICAgZGVidWcoRjEwMCwiQ09OTkVDVCB0dGdtZG0gQ0QgdGVzdCBmYWlscyIsIiIseCk7CisJICAgIGNvbnJlcygpOworCSAgICBwcmludGYoIj9DYXJyaWVyIHJlcXVpcmVkIGJ1dCBub3QgZGV0ZWN0ZWQuXG4iKTsKKyNpZm5kZWYgTk9ISU5UUworCSAgICBjeF9zdGF0dXMgPSBDU1hfQ0FSUklFUjsKKwkgICAgaWYgKCFoaW50cykKKwkgICAgICByZXR1cm4oMCk7CisJICAgIHByaW50ZigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCSAgICBwcmludGYoIiBIaW50OiBUbyBDT05ORUNUIHRvIGEgc2VyaWFsIGRldmljZSB0aGF0XG4iKTsKKwkgICAgcHJpbnRmKCIgaXMgbm90IHByZXNlbnRpbmcgdGhlIENhcnJpZXIgRGV0ZWN0IHNpZ25hbCxcbiIpOworCSAgICBwcmludGYoIiBmaXJzdCB0ZWxsIEMtS2VybWl0IHRvOlxuXG4iKTsKKwkgICAgcHJpbnRmKCIgICBTRVQgQ0FSUklFUi1XQVRDSCBPRkZcblxuIik7CisJICAgIHByaW50ZigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7CisjZW5kaWYgLyogTk9ISU5UUyAqLworCSAgICByZXR1cm4oMCk7CisJfQorCWRlYnVnKEYxMDAsIkNPTk5FQ1QgdHRnbWRtIG9rIiwiIiwwKTsKKyAgICB9CisKKyAgICAvKiBOb3cgd2UgYXJlIGNvbm5lY3RlZC4gKi8KKworICAgIGlmIChtc2dmbGcgfHwgcHJpbnRiYXIpCisgICAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisKKyNpZm5kZWYgTk9DU0VUUworLyogU2V0IHVwIGNoYXJhY3RlciBzZXQgdHJhbnNsYXRpb25zICovCisKKyAgICB1bmljb2RlID0gMDsJCQkvKiBBc3N1bWUgVW5pY29kZSB3b24ndCBiZSBpbnZvbHZlZCAqLworICAgIHRjcyA9IDA7CQkJCS8qICJUcmFuc2ZlciIgb3IgIk90aGVyIiBjaGFyc2V0ICovCisgICAgc3hvID0gcnhvID0gTlVMTDsJCQkvKiBJbml0aWFsaXplIGJ5dGUtdG8tYnl0ZSBmdW5jdGlvbnMgKi8KKyAgICBzeGkgPSByeGkgPSBOVUxMOworCisgICAgaWYgKHRjc3IgIT0gdGNzbCkgewkJCS8qIFJlbW90ZSBhbmQgbG9jYWwgc2V0cyBkaWZmZXIuLi4gKi8KKyNpZmRlZiBVTklDT0RFCisJaWYgKHRjc3IgPT0gRkNfVVRGOCB8fAkJLyogUmVtb3RlIGNoYXJzZXQgaXMgVVRGLTggKi8KKwkgICAgdGNzbCA9PSBGQ19VVEY4KSB7CQkvKiBvciBsb2NhbCBvbmUgaXMuICovCisJICAgIHh1ZiA9IHhsX3VmY1t0Y3NsXTsJCS8qIEluY29taW5nIFVuaWNvZGUgdG8gbG9jYWwgKi8KKwkgICAgaWYgKHh1ZiB8fCB0Y3NsID09IEZDX1VURjgpIHsKKwkJdGNzID0gKHRjc3IgPT0gRkNfVVRGOCkgPyB0Y3NsIDogdGNzcjsgLyogVGhlICJvdGhlciIgc2V0ICovCisJCXhmdSA9IHhsX2ZjdVt0Y3NdOwkvKiBMb2NhbCBieXRlIHRvIHJlbW90ZSBVbmljb2RlICovCisJCWlmICh4ZnUpCisJCSAgdW5pY29kZSA9ICh0Y3NyID09IEZDX1VURjgpID8gMSA6IDI7CisJICAgIH0KKwkgICAgdGNzc2l6ZSA9IGZjc2luZm9bdGNzXS5zaXplOyAvKiBTaXplIG9mIG90aGVyIGNoYXJhY3RlciBzZXQuICovCisJfSBlbHNlIHsKKyNlbmRpZiAvKiBVTklDT0RFICovCisJICAgIHRjcyA9IGdldHRjcyh0Y3NyLHRjc2wpOwkvKiBHZXQgaW50ZXJtZWRpYXRlIHNldC4gKi8KKwkgICAgc3hvID0geGxzW3Rjc11bdGNzbF07CS8qIHRyYW5zbGF0aW9uIGZ1bmN0aW9uICovCisJICAgIHJ4byA9IHhsclt0Y3NdW3Rjc3JdOwkvKiBwb2ludGVycyBmb3Igb3V0cHV0IGZ1bmN0aW9ucyAqLworCSAgICBzeGkgPSB4bHNbdGNzXVt0Y3NyXTsJLyogYW5kIGZvciBpbnB1dCBmdW5jdGlvbnMuICovCisJICAgIHJ4aSA9IHhsclt0Y3NdW3Rjc2xdOworI2lmZGVmIFVOSUNPREUKKwl9CisjZW5kaWYgLyogVU5JQ09ERSAqLworICAgIH0KKy8qCisgIFRoaXMgaXMgdG8gcHJldmVudCB1c2Ugb2Ygem1zdHVmZigpIGFuZCB6ZHN0dWZmKCkgYnkgdHJhbnNsYXRpb24gZnVuY3Rpb25zLgorICBUaGV5IG9ubHkgd29yayB3aXRoIGRpc2sgaS9vLCBub3Qgd2l0aCBjb21tdW5pY2F0aW9uIGkvby4gIEx1Y2tpbHkgUnVzc2lhbgorICB0cmFuc2xhdGlvbiBmdW5jdGlvbnMgZG9uJ3QgZG8gYW55IHN0dWZmaW5nLi4uCisqLworICAgIGxhbmdzdiA9IGxhbmd1YWdlOworI2lmbmRlZiBOT0NZUklMCisgICAgaWYgKGxhbmd1YWdlICE9IExfUlVTU0lBTikKKyNlbmRpZiAvKiBOT0NZUklMICovCisgICAgICBsYW5ndWFnZSA9IExfVVNBU0NJSTsKKworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIHRjcyIsIiIsdGNzKTsKKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIHRjc2wiLCIiLHRjc2wpOworCWRlYnVnKEYxMDEsIkNPTk5FQ1QgdGNzciIsIiIsdGNzcik7CisJZGVidWcoRjEwMSwiQ09OTkVDVCBmY3NpbmZvW3Rjc2xdLnNpemUiLCIiLGZjc2luZm9bdGNzbF0uc2l6ZSk7CisJZGVidWcoRjEwMSwiQ09OTkVDVCBmY3NpbmZvW3Rjc3JdLnNpemUiLCIiLGZjc2luZm9bdGNzcl0uc2l6ZSk7CisJZGVidWcoRjEwMSwiQ09OTkVDVCB1bmljb2RlIiwiIix1bmljb2RlKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBDS19YWVoKKyNpZm5kZWYgWFlaX0lOVEVSTkFMCisgICAgeworCWV4dGVybiBpbnQgYmluYXJ5OwkJLyogU2VlIGFib3V0IFpNT0RFTSBhdXRvZG93bmxvYWRzICovCisJY2hhciAqIHM7CisJcyA9IGJpbmFyeSA/IHB0YWJbUFJPVE9fWl0ucF9iX3JjbWQgOiBwdGFiW1BST1RPX1pdLnBfdF9yY21kOworCWlmICghcykgcyA9ICIiOworCXptZGxvayA9ICgqcyAhPSBOVUwpOwkJLyogT0sgaWYgd2UgaGF2ZSBleHRlcm5hbCBjb21tYW5kcyAqLworICAgIH0KKyNlbmRpZiAvKiBYWVpfSU5URVJOQUwgKi8KKyNlbmRpZiAvKiBDS19YWVogKi8KKworI2lmbmRlZiBOT0VTQ1NFUQorLyoKKyAgV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgZXNjYXBlLXNlcXVlbmNlIHJlY29nbml0aW9uIGZlYXR1cmUgd2hlbjoKKyAgIChhKSB0cmFuc2xhdGlvbiBpcyBlbGVjdGVkLCBBTkQKKyAgIChiKSB0aGUgbG9jYWwgYW5kL29yIHJlbW90ZSBzZXQgaXMgYSA3LWJpdCBzZXQgb3RoZXIgdGhhbiBVUyBBU0NJSS4KKyAgT3I6CisgICBTRVQgVEVSTUlOQUwgQVBDIGlzIG5vdCBPRkYgKGhhbmRsZWQgaW4gdGhlIG5leHQgc3RhdGVtZW50KS4KKyovCisgICAgZXNjc2VxID0gKHRjcyAhPSBUQ19UUkFOU1ApICYmCS8qIE5vdCB0cmFuc3BhcmVudCAqLworICAgICAgKGZjc2luZm9bdGNzbF0uc2l6ZSA9PSAxMjggfHwgZmNzaW5mb1t0Y3NyXS5zaXplID09IDEyOCkgJiYgLyogNyBiaXRzICovCisJKGZjc2luZm9bdGNzbF0uY29kZSAhPSBGQ19VU0FTQ0lJKTsgLyogQnV0IG5vdCBBU0NJSSAqLworI2VuZGlmIC8qIE5PRVNDU0VRICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCisjaWZuZGVmIE5PRVNDU0VRCisjaWZkZWYgQ0tfQVBDCisgICAgZXNjc2VxID0gZXNjc2VxIHx8IChhcGNzdGF0dXMgJiBBUENfT04pOworICAgIGFwY2FjdGl2ZSA9IDA7CQkJLyogQW4gQVBDIGNvbW1hbmQgaXMgbm90IGFjdGl2ZSAqLworICAgIGFwY2xlbmd0aCA9IDA7CQkJLyogLi4uICovCisjZW5kaWYgLyogQ0tfQVBDICovCisjaWZkZWYgWFBSSU5UCisgICAgZXNjc2VxIHw9IHR0X3ByaW50OworI2VuZGlmIC8qIFhQUklOVCAqLworICAgIGluZXNjWzBdID0gRVNfTk9STUFMOwkJLyogSW5pdGlhbCBzdGF0ZSBvZiByZWNvZ25pemVyICovCisgICAgaW5lc2NbMV0gPSBFU19OT1JNQUw7CisgICAgZGVidWcoRjEwMSwiQ09OTkVDVCBlc2NzZXEiLCIiLGVzY3NlcSk7CisjZW5kaWYgLyogTk9FU0NTRVEgKi8KKworICAgIGlmICh0dHlmZCA+IC0xKSB7CQkJLyogKGp1c3QgaW4gY2FzZS4uLikgKi8KKwl3aGF0ID0gV19DT05ORUNUOwkJLyogS2VlcCB0cmFjayBvZiB3aGF0IHdlJ3JlIGRvaW5nICovCisJYWN0aXZlID0gMTsKKyAgICB9CisjaWZkZWYgQ0tMRUFSTgorICAgIGlmIChsZWFybmluZykgewkJCS8qIExlYXJuZWQgc2NyaXB0IGFjdGl2ZS4uLiAqLworCWxlYXJuYnAgPSAwOwkJCS8qIElOUFVUIGJ1ZmZlciBwb2ludGVyICovCisJbGVhcm5iYyA9IDA7CQkJLyogSU5QVVQgYnVmZmVyIGNvdW50ICovCisJbGVhcm5zdCA9IDA7CQkJLyogU3RhdGUgKDAgPSBuZXV0cmFsLCBub25lKSAqLworCWxlYXJudDEgPSAoVUxPTkcpIHRpbWUoMCk7CisgICAgfQorI2VuZGlmIC8qIENLTEVBUk4gKi8KKworI2lmZGVmIENLVElETEUKKyAgICBpZGxlbGltaXQgPSB0dF9pZGxlbGltaXQ7CisjZW5kaWYgLyogQ0tUSURMRSAqLworCisgICAgd2hpbGUgKGFjdGl2ZSkgewkJCS8qIEJpZyBsb29wLi4uICovCisJZGVidWcoRjEwMCwiQ09OTkVDVCB0b3Agb2YgbG9vcCIsIiIsMCk7CisJRkRfWkVSTygmaW4pOwkJCS8qIENsZWFyIHNlbGVjdCgpIHN0cnVjdHMgKi8KKwlGRF9aRVJPKCZvdXQpOworCUZEX1pFUk8oJmVycik7CisJZ290a2JkID0gMDsKKwlnb3RuZXQgPSB0dHBlZWsoKTsJCS8qIFNvbWV0aGluZyBzaXR0aW5nIGluIGNrdXRpbyBidWYgKi8KKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIHR0cGVlayIsIiIsZ290bmV0KTsKKworCWlmICgKKyNpZm5kZWYgTk9TRVRLRVkKKwkgICAgIWttcHRyCQkJLyogQ2hlY2sgZm9yIGtleSBtYWNybyBhY3RpdmUgKi8KKyNlbHNlCisJICAgIDEKKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworCSAgICApIHsKKwkgICAgaWYgKG9iYykgewkJCS8qIE5vIGtleSBtYWNybyAtIHNldCB1cCBmb3Igc2VsZWN0ICovCisJCUZEX1NFVCh0dHlmZCwgJm91dCk7CS8qIEhhdmUgc3R1ZmYgdG8gc2VuZCB0byBuZXQgKi8KKwkgICAgfSBlbHNlIHsKKwkJRkRfU0VUKGtiaW4sICZpbik7CS8qIE5lZWQgdG8gcmVhZCBzdHVmZiBmcm9tIGtleWJvYXJkICovCisJICAgIH0KKyNpZmRlZiBCRUJPWAorCSAgICBpZiAoIShpYmMgfHwgZ290bmV0ID4gMCkpCisJCUZEX1NFVCh0dHlmZCwgJmluKTsJLyogTmVlZCB0byByZWFkIHN0dWZmIGZyb20gbmV0ICovCisjZWxzZSAvKiBCRUJPWCAqLworCSAgICBpZiAoaWJjIHx8IGdvdG5ldCA+IDApIHsKKwkJRkRfU0VUKHNjcm5vdXQsICZvdXQpOwkvKiBIYXZlIHN0dWZmIHRvIHB1dCBvbiBzY3JlZW4gKi8KKwkgICAgfSBlbHNlIHsKKwkJRkRfU0VUKHR0eWZkLCAmaW4pOwkvKiBOZWVkIHRvIHJlYWQgc3R1ZmYgZnJvbSBuZXQgKi8KKwkgICAgfQorI2VuZGlmIC8qIEJFQk9YICovCisgICAgICAgICAgICBGRF9TRVQodHR5ZmQsICZlcnIpOworI2lmZGVmIENLX0ZPUldBUkRfWAorICAgICAgICAgICAgZndkeF9pbml0X2ZkX3NldCgmaW4pOworI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworCisJICAgIC8qIFdhaXQgdGlsbCB0aGUgZmlyc3Qgb25lIG9mIHRoZSBhYm92ZSBpcyByZWFkeSBmb3IgaS9vICovCisJICAgIC8qIG9yIFRFUk0gSURMRS1TRU5EIGlzIGFjdGl2ZSBhbmQgd2UgdGltZSBvdXQuICovCisKKwkgICAgZXJybm8gPSAwOworI2lmZGVmIENLVElETEUKKwkgICAgLyogVGhpcyByZWFsbHkgY291bGQgYmUgbW92ZWQgb3V0IG9mIHRoZSBsb29wLi4uICovCisJICAgIGlmIChpZGxlbGltaXQpIHsJCS8qIElkbGUgdGltZW91dCBzZXQgKi8KKwkJc3RydWN0IHRpbWV2YWwgdHY7CisJCWlmIChpZGxlbGltaXQgPiAwKSB7CS8qIFBvc2l0aXZlID0gc2VjICovCisJCSAgICB0di50dl9zZWMgPSAobG9uZykgaWRsZWxpbWl0OworCQkgICAgdHYudHZfdXNlYyA9IDBMOworCQl9IGVsc2UgewkJLyogTmVnYXRpdmUgPSBtaWxsaXNlYyAqLworCQkgICAgbG9uZyB1ID0gKDAgLSBpZGxlbGltaXQpOworCQkgICAgdHYudHZfc2VjID0gdSAvIDEwMDBMOworCQkgICAgdHYudHZfdXNlYyA9ICgodSAlIDEwMDBMKSAqIDEwMDBMKTsKKwkJfQorI2lmZGVmIElOVFNFTEVDVAorCQljID0gc2VsZWN0KEZEX1NFVFNJWkUsKGludCAqKSZpbiwoaW50ICopJm91dCwoaW50ICopJmVyciwgJnR2KTsKKyNlbHNlCisJCWMgPSBzZWxlY3QoRkRfU0VUU0laRSwgJmluLCAmb3V0LCAmZXJyLCAmdHYpOworI2VuZGlmIC8qIElOVFNFTEVDVCAqLworCSAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS1RJRExFICovCisjaWZkZWYgSU5UU0VMRUNUCisJICAgICAgYyA9IHNlbGVjdChGRF9TRVRTSVpFLCAoaW50ICopJmluLCAoaW50ICopJm91dCwgKGludCAqKSZlcnIsIDApOworI2Vsc2UKKwkgICAgICBjID0gc2VsZWN0KEZEX1NFVFNJWkUsICZpbiwgJm91dCwgJmVyciwgMCk7CisjZW5kaWYgLyogSU5UU0VMRUNUICovCisJICAgIGlmIChjIDwgMSkgeworI2lmZGVmIENLVElETEUKKwkJaWYgKGMgPT0gMCkgewkJLyogVGltZW91dCAqLworCQkgICAgZGVidWcoRjEwMSwiQ09OTkVDVCBzZWxlY3QoKSB0aW1lb3V0IiwiIix0dF9pZGxlYWN0KTsKKwkJICAgIHN3aXRjaCAodHRfaWRsZWFjdCkgeworCQkgICAgICBjYXNlIElETEVfSEFORzogewkvKiBIYW5nIHVwICovCisJCQkgIGludCB4ID0gMDsKKyNpZm5kZWYgTk9ESUFMCisJCQkgIGlmIChkaWFsbWh1KQorCQkJICAgIHggPSBtZG1odXAoKTsKKwkJCSAgaWYgKHggPCAxKQorI2VuZGlmIC8qIE5PRElBTCAqLworCQkJICAgIHR0aGFuZygpOwkvKiBmYWxsIHRocnUgZGVsaWJlcmF0ZWx5Li4uICovCisJCSAgICAgIH0KKwkJICAgICAgY2FzZSBJRExFX1JFVDoJLyogUmV0dXJuIHRvIGNvbW1hbmQgbW9kZSAqLworCQkJY3hfc3RhdHVzID0gQ1NYX0lETEU7CisJCQlhY3RpdmUgPSAwOworCQkJY29udGludWU7CisJCSAgICAgIGNhc2UgSURMRV9PVVQ6CS8qIE9VVFBVVCBhIHN0cmluZyAqLworCQkJaWYgKHR0X2lkbGVzdHIpIHsKKwkJCSAgICBpbnQgbGVuID0gc3RybGVuKHR0X2lkbGVzdHIpOworCQkJICAgIGlmIChsZW4gPiAwKQorCQkJICAgICAgdHRvbCgoQ0hBUiAqKXR0X2lkbGVzdHIsbGVuKTsKKwkJCSAgICBlbHNlCisJCQkgICAgICB0dG9jKE5VTCk7IC8qIE5vIHN0cmluZywgc2VuZCBhIE5VTCAqLworCQkJfSBlbHNlCisJCQkgIHR0b2MoTlVMKTsJLyogTm8gc3RyaW5nLCBzZW5kIGEgTlVMICovCisJCQljb250aW51ZTsKKwkJICAgICAgY2FzZSBJRExFX0VYSVQ6CS8qIEV4aXQgZnJvbSBLZXJtaXQgKi8KKwkJCWRvZXhpdChHT09EX0VYSVQseGl0c3RhKTsKKyNpZmRlZiBUTkNPREUKKwkJICAgICAgY2FzZSBJRExFX1RBWVQ6CS8qIFNlbmQgVGVsbmV0IEFyZSBZb3UgVGhlcmU/ICovCisJCQlpZiAobmV0d29yayAmJiBJU19URUxORVQoKSkgeworCQkJICAgIHRub3B0WzBdID0gKENIQVIpIElBQzsKKwkJCSAgICB0bm9wdFsxXSA9IChDSEFSKSBUTl9BWVQ7CisJCQkgICAgdG5vcHRbMl0gPSBOVUw7CisJCQkgICAgaWYgKHR0b2woKENIQVIgKil0bm9wdCwyKSA8IDApCisJCQkgICAgICBhY3RpdmUgPSAwOworCQkJfQorCQkJY29udGludWU7CisKKwkJICAgICAgY2FzZSBJRExFX1ROT1A6CS8qIFNlbmQgVGVsbmV0IE5PUCAqLworCQkJaWYgKG5ldHdvcmsgJiYgSVNfVEVMTkVUKCkpIHsKKwkJCSAgICB0bm9wdFswXSA9IChDSEFSKSBJQUM7CisJCQkgICAgdG5vcHRbMV0gPSAoQ0hBUikgVE5fTk9QOworCQkJICAgIHRub3B0WzJdID0gTlVMOworCQkJICAgIGlmICh0dG9sKChDSEFSICopdG5vcHQsMikgPCAwKQorCQkJICAgICAgYWN0aXZlID0gMDsKKwkJCX0KKwkJCWNvbnRpbnVlOworI2VuZGlmIC8qIFROQ09ERSAqLworCQkgICAgfQorCQl9CisjZW5kaWYgLyogQ0tUSURMRSAqLworCisJCWRlYnVnKEYxMDEsIkNPTk5FQ1Qgc2VsZWN0KCkgZXJybm8iLCIiLGVycm5vKTsKKwkJLyogQSB0b28tYmlnIGZpcnN0IGFyZyB0byBzZWxlY3QoKSBnZXRzIEVCQURGICovCisjaWZkZWYgRUlOVFIKKwkJaWYgKGMgPT0gLTEpIHsKKwkJICAgIGlmIChlcnJubyA9PSBFSU5UUikgeworCQkJY29udGludWU7CisJCSAgICB9CisJCX0KKyNlbmRpZiAvKiBFSU5UUiAqLworCQlzbGVlcCgxKTsKKwkJY29udGludWU7CisJICAgIH0KKyNpZm5kZWYgQkVCT1gKKyNpZmRlZiBERUJVRworCSAgICBpZiAoRkRfSVNTRVQoc2Nybm91dCwgJm91dCkpIHsKKwkJZGVidWcoRjEwMCwiQ09OTkVDVCBTRUxFQ1Qgc2Nybm91dCIsIiIsMCk7CisJICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2VuZGlmIC8qIEJFQk9YICovCisKKyNpZmRlZiBDS19GT1JXQVJEX1gKKyAgICAgICAgICAgIGZ3ZHhfY2hlY2tfc29ja2V0cygmaW4pOworI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworCisJICAgIGlmIChGRF9JU1NFVCh0dHlmZCwgJmluKSkgewkvKiBSZWFkIGZyb20gbmV0PyAqLworCQlkZWJ1ZyhGMTEwLCJDT05ORUNUIFNFTEVDVCB0dHlmZCIsImluIiwwKTsKKwkJRkRfQ0xSKHR0eWZkLCAmaW4pOworCQlnb3RuZXQgPSAxOwkJLyogTmV0IGlzIHJlYWR5ICovCisJICAgIH0KKwkgICAgaWYgKEZEX0lTU0VUKGtiaW4sICZpbikpIHsJLyogUmVhZCBmcm9tIGtleWJvYXJkPyAqLworCQlkZWJ1ZyhGMTAwLCJDT05ORUNUIFNFTEVDVCBrYmluIiwiIiwwKTsKKwkJRkRfQ0xSKGtiaW4sICZpbik7CisJCWdvdGtiZCA9IDE7CQkvKiBLZXlib2FyZCBpcyByZWFkeSAqLworCSAgICB9CisgICAgICAgICAgICBpZiAoRkRfSVNTRVQodHR5ZmQsICZlcnIpKSB7CisJCWRlYnVnKEYxMTAsIkNPTk5FQ1QgU0VMRUNUIHR0eWZkIiwiZXJyIiwwKTsKKwkJRkRfQ0xSKHR0eWZkLCAmZXJyKTsKKyNpZmRlZiBORVRQVFkKKyNpZmRlZiBIQVZFX1BUWVRSQVAKKwkJLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgSFAtVVggcHR5IGkvbyAqLworICAgICAgICAgICAgICAgIGlmICh0dHB0eSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHR5X3RyYXBfaGFuZGxlcih0dHlmZCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0dGNsb3MoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNvbnJldDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIEhBVkVfUFRZVFJBUCAqLworI2VuZGlmIC8qIE5FVFBUWSAqLworCQlnb3RuZXQgPSAxOwkJLyogTmV0IGlzIHJlYWR5IChkb24ndCBzZXQgaWYgcHR5KSAqLworICAgICAgICAgICAgfQorCX0KKyNpZmRlZiBERUJVRworCWlmIChkZWJsb2cpIHsKKwkgICAgZGVidWcoRjEwMSwiQ09OTkVDVCBnb3RrYmQiLCIiLGdvdGtiZCk7CisJICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1Qga2JjIiwiIixrYmMpOworI2lmbmRlZiBOT1NFVEtFWQorCSAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGttcHRyIiwiIixrbXB0cik7CisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKwl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCXdoaWxlIChnb3RrYmQgfHwga2JjID4gMAkvKiBJZiB3ZSBoYXZlIGtleWJvYXJkIGNoYXJzICovCisjaWZuZGVmIE5PU0VUS0VZCisJICAgICAgIHx8IGttcHRyCisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKwkgICAgICAgKSB7CisjaWZuZGVmIE5PU0VUS0VZCisJICAgIGlmIChrbXB0cikgewkJLyogSGF2ZSBjdXJyZW50IG1hY3JvPyAqLworCQlkZWJ1ZyhGMTAwLCJDT05ORUNUIGttcHRyIG5vbiBOVUxMIiwiIiwwKTsKKwkJaWYgKChjID0gKENIQVIpICprbXB0cisrKSA9PSBOVUwpIHsgLyogR2V0IGNoYXIgZnJvbSBpdCAqLworCQkgICAgZGVidWcoRjEwMCwiQ09OTkVDVCBtYWNybyBlbXB0eSwgY29udGludWluZyIsIiIsMCk7CisJCSAgICBrbXB0ciA9IE5VTEw7CS8qIElmIG5vIG1vcmUgY2hhcnMsICAqLworCQkgICAgY29udGludWU7CQkvKiBSZXNldCBwb2ludGVyIGFuZCBjb250aW51ZSAqLworCQl9CisJCWRlYnVnKEYwMDAsIkNPTk5FQ1QgY2hhciBmcm9tIG1hY3JvIiwiIixjKTsKKwkgICAgfSBlbHNlIHsJCQkvKiBObyBtYWNyby4uLiAqLworI2VuZGlmIC8qIE5PU0VUS0VZICovCisjaWZkZWYgQkVCT1gKKwkJeworCQkgICAgaW50IHJjID0gMDsKKwkJICAgIGlmICgocmMgPSByZWN2KGtiaW4sYnVmLDEsMCkpID4gMCkKKwkJICAgICAgYyA9IGJ1ZlswXTsKKwkJICAgIGVsc2UKKwkJICAgICAgYyA9IC0xOworCQkgICAgZGVidWcoRjExMSwicmVjdiIsInJjIixyYyk7CisJCSAgICBwcmludGYoIlxyXG5yZWN2OiAlYyByYz0lZFxyXG4iLGJ1ZlswXSxyYyk7CisJCX0KKyNlbHNlIC8qIEJFQk9YICovCisJCWMgPSBDT05HS1MoKTsJCS8qIFllcywgcmVhZCBmcm9tIGtleWJvYXJkICovCisjZW5kaWYgLyogQkVCT1ggKi8KKwkJZ290a2JkID0gMDsJCS8qIFR1cm4gb2ZmIHNlbGVjdCgpIHJlc3VsdCBmbGFnICovCisjaWZuZGVmIE5PU0VUS0VZCisJICAgIH0KKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworCSAgICBpZiAoYyA9PSAtMSkgeworI2lmZGVmIEVJTlRSCisJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJICBjb250aW51ZTsKKyNlbmRpZiAvKiBFSU5UUiAqLworCQljeF9zdGF0dXMgPSBDU1hfSU9FUlJPUjsKKwkJY29ub2MoQkVMKTsKKwkJZ290byBjb25yZXQwOworCSAgICB9CisJICAgIGMgJj0gY21kbXNrOwkJLyogRG8gYW55IHJlcXVlc3RlZCBtYXNraW5nICovCisKKyNpZm5kZWYgTk9TRVRLRVkKKy8qCisgIE5vdGU6IGttcHRyIGlzIE5VTEwgaWYgd2UgZ290IGNoYXJhY3RlciBjIGZyb20gdGhlIGtleWJvYXJkLCBhbmQgaXQgaXMKKyAgbm90IE5VTEwgaWYgaXQgY2FtZSBmcm9tIGEgbWFjcm8uICBJbiB0aGUgbGF0dGVyIGNhc2UsIHdlIG11c3QgYXZvaWQKKyAgZXhwYW5kaW5nIGl0IGFnYWluLgorKi8KKwkgICAgaWYgKCFrbXB0ciAmJiBtYWNyb3RhYltjXSkgeyAvKiBNYWNybyBkZWZpbml0aW9uIGZvciBjPyAqLworCQlkZWJ1ZyhGMDAwLCJDT05ORUNUIG1hY3JvIGtleSIsbWFjcm90YWJbY10sYyk7CisJCWttcHRyID0gbWFjcm90YWJbY107CS8qIFllcywgc2V0IHVwIG1hY3JvIHBvaW50ZXIgKi8KKwkJY29udGludWU7CQkvKiBhbmQgcmVzdGFydCB0aGUgbG9vcCwgKi8KKwkgICAgfSBlbHNlIGMgPSBrZXltYXBbY107CS8qIGVsc2UgdXNlIHNpbmdsZS1jaGFyIGtleW1hcCAqLworI2VuZGlmIC8qIE5PU0VUS0VZICovCisJICAgIGlmICgKKyNpZm5kZWYgTk9TRVRLRVkKKwkJIWttcHRyICYmCisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKwkJKHR0X2VzY2FwZSAmJiAoKGMgJiAweGZmKSA9PSBlc2NhcGUpKSkgeyAvKiBFc2NhcGUgY2hhcj8gKi8KKwkJZGVidWcoRjAwMCwiQ09OTkVDVCBnb3QgZXNjYXBlIiwiIixjKTsKKyNpZmRlZiBCRUJPWAorCQlpZiAocmVjdihrYmluLGJ1ZiwxLDApPj0wKQorCQkgIGMgPSBidWZbMF07CisJCWVsc2UKKwkJICBjID0gLTE7CisjZWxzZSAvKiBCRUJPWCAqLworCQljID0gQ09OR0tTKCkgJiAweDdmOwkvKiBSZWFkIGFyZ3VtZW50ICovCisjZW5kaWYgLyogQkVCT1ggKi8KKwkJZG9lc2MoKGNoYXIpIGMpOwkvKiBIYW5kbGUgaXQgKi8KKwkJY29udGludWU7CQkvKiBCYWNrIHRvIGxvb3AgKi8KKwkgICAgfQorCSAgICBjc2F2ZSA9IGM7CQkJLyogU2F2ZSBpdCBiZWZvcmUgdHJhbnNsYXRpb24gKi8KKwkgICAgCQkJCS8qIGZvciBsb2NhbCBlY2hvaW5nLiAqLworI2lmZGVmIENLTEVBUk4KKwkgICAgY3JmbGFnID0gKGMgPT0gQ1IpOwkJLyogUmVtZW1iZXIgaWYgaXQgd2FzIENSLiAqLworI2VuZGlmIC8qIENLTEVBUk4gKi8KKworI2lmbmRlZiBOT0NTRVRTCisJICAgIGlmIChpbmVzY1sxXSA9PSBFU19OT1JNQUwpIHsgLyogSWYgbm90IGluc2lkZSBlc2NhcGUgc2VxLi4gKi8KKwkJLyogVHJhbnNsYXRlIGNoYXJhY3RlciBzZXRzICovCisjaWZkZWYgVU5JQ09ERQorCQlpbnQgeDsKKwkJaWYgKHVuaWNvZGUgPT0gMSkgewkvKiBSZW1vdGUgaXMgVVRGLTggKi8KKwkJICAgIG91dHhjb3VudCA9IGJfdG9fdSgoQ0hBUiljLG91dHhidWYsT1VUWEJVRlNJWix0Y3NzaXplKTsKKwkJICAgIG91dHhidWZbb3V0eGNvdW50XSA9IE5VTDsKKwkJfSBlbHNlIGlmICh1bmljb2RlID09IDIpIHsgLyogTG9jYWwgaXMgVVRGLTggKi8KKwkJICAgIAorCQkgICAgeCA9IHVfdG9fYigoQ0hBUiljKTsKKwkJICAgIGlmICh4IDwgMCkKKwkJICAgICAgY29udGludWU7CisJCSAgICBvdXR4YnVmWzBdID0gKHVuc2lnbmVkKSh4ICYgMHhmZik7CisJCSAgICBvdXR4Y291bnQgPSAxOworCQkgICAgb3V0eGJ1ZltvdXR4Y291bnRdID0gTlVMOworCQl9IGVsc2UgeworI2VuZGlmIC8qIFVOSUNPREUgKi8KKwkJICAgIGlmIChzeG8pIGMgPSAoKnN4bykoKGNoYXIpYyk7IC8qIExvY2FsLWludGVybWVkaWF0ZSAqLworCQkgICAgaWYgKHJ4bykgYyA9ICgqcnhvKSgoY2hhciljKTsgLyogSW50ZXJtZWRpYXRlLXJlbW90ZSAqLworCQkgICAgb3V0eGJ1ZlswXSA9IGM7CisJCSAgICBvdXR4Y291bnQgPSAxOworCQkgICAgb3V0eGJ1ZltvdXR4Y291bnRdID0gTlVMOworI2lmZGVmIFVOSUNPREUKKwkJfQorI2VuZGlmIC8qIFVOSUNPREUgKi8KKwkgICAgfSBlbHNlIHsKKwkJb3V0eGJ1ZlswXSA9IGM7CisJCW91dHhjb3VudCA9IDE7CisJCW91dHhidWZbb3V0eGNvdW50XSA9IE5VTDsKKwkgICAgfQorCSAgICBpZiAoZXNjc2VxKQorCSAgICAgIGFwY3JjID0gY2hrYWVzKChjaGFyKWMsMSk7CisjZWxzZQorCSAgICBvdXR4YnVmWzBdID0gYzsKKwkgICAgb3V0eGNvdW50ID0gMTsKKwkgICAgb3V0eGJ1ZltvdXR4Y291bnRdID0gTlVMOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworCSAgICBkZWJ1ZyhGMTExLCJPVVRYQlVGIixvdXR4YnVmLG91dHhjb3VudCk7CisKKwkgICAgZm9yIChpID0gMDsgaSA8IG91dHhjb3VudDsgaSsrKSB7CisJCWMgPSBvdXR4YnVmW2ldOworLyoKKyBJZiBTaGlmdC1Jbi9TaGlmdC1PdXQgaXMgc2VsZWN0ZWQgYW5kIHdlIGhhdmUgYSA3LWJpdCBjb25uZWN0aW9uLAorIGhhbmRsZSBzaGlmdGluZyBoZXJlLgorKi8KKwkJaWYgKHNvc2kpIHsJCQkgLyogU2hpZnQtSW4vT3V0IHNlbGVjdGVkPyAqLworCQkgICAgaWYgKGNtYXNrID09IDAxNzcpIHsJIC8qIEluIDctYml0IGVudmlyb25tZW50PyAqLworCQkJaWYgKGMgJiAwMjAwKSB7CQkgLyogOC1iaXQgY2hhcmFjdGVyPyAqLworCQkJICAgIGlmIChvdXRzaGlmdCA9PSAwKSB7IC8qIElmIG5vdCBzaGlmdGVkLCAqLworCQkJCXR0b2MoZG9wYXIoU08pKTsgLyogc2hpZnQuICovCisJCQkJb3V0c2hpZnQgPSAxOworCQkJICAgIH0KKwkJCX0gZWxzZSB7CisJCQkgICAgaWYgKG91dHNoaWZ0ID09IDEpIHsgLyogNy1iaXQgY2hhcmFjdGVyICovCisJCQkJdHRvYyhkb3BhcihTSSkpOyAvKiBJZiBzaGlmdGVkLCAqLworCQkJCW91dHNoaWZ0ID0gMDsgICAgLyogdW5zaGlmdC4gKi8KKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCSAgICBpZiAoYyA9PSBTTykgb3V0c2hpZnQgPSAxOyAvKiBVc2VyIHR5cGVkIFNPICovCisJCSAgICBpZiAoYyA9PSBTSSkgb3V0c2hpZnQgPSAwOyAvKiBVc2VyIHR5cGVkIFNJICovCisJCX0KKwkJYyAmPSBjbWFzazsJCS8qIEFwcGx5IEtlcm1pdC10by1ob3N0IG1hc2sgbm93LiAqLworCQlpZiAoYyA9PSAnXDAxNScpIHsJLyogQ2FycmlhZ2UgUmV0dXJuICovCisJCSAgICBpbnQgc3R1ZmYgPSAtMTsKKwkJICAgIGlmICh0bmxtKSB7CQkvKiBURVJNSU5BTCBORVdMSU5FIE9OICovCisJCQlzdHVmZiA9IExGOyAJLyogU3R1ZmYgTEYgKi8KKyNpZmRlZiBUTkNPREUKKwkJICAgIH0gZWxzZSBpZiAobmV0d29yayAmJiAvKiBURUxORVQgTkVXTElORSBPTi9PRkYvUkFXICovCisJCQkgICAgICAgSVNfVEVMTkVUKCkpIHsKKwkJCXN3aXRjaCAoIVRFTE9QVF9NRShURUxPUFRfQklOQVJZKSA/IHRuX25sbSA6IHRuX2JfbmxtKXsKKwkJCSAgY2FzZSBUTkxfQ1JMRjoKKwkJCSAgICBzdHVmZiA9IExGOworCQkJICAgIGJyZWFrOworCQkJICBjYXNlIFROTF9DUk5VTDoKKwkJCSAgICBzdHVmZiA9IE5VTDsKKwkJCSAgICBicmVhazsKKwkJCX0KKyNlbmRpZiAvKiBUTkNPREUgKi8KKwkJICAgIH0KKwkJICAgIGlmIChzdHVmZiA+IC0xKSB7CisJCQl0dG9jKGRvcGFyKCdcMDE1JykpOwkvKiBTZW5kIENSICovCisJCQlpZiAoZHVwbGV4KSBjb25vYygnXDAxNScpOyAvKiBNYXliZSBlY2hvIENSICovCisJCQljID0gc3R1ZmY7CS8qIENoYXIgdG8gc3R1ZmYgKi8KKwkJCWNzYXZlID0gYzsKKwkJICAgIH0KKwkJfQorI2lmZGVmIFROQ09ERQorLyogSWYgdXNlciB0eXBlcyB0aGUgMHhmZiBjaGFyYWN0ZXIgKFRFTE5FVCBJQUMpLCBpdCBtdXN0IGJlIGRvdWJsZWQuICovCisJCWVsc2UJCS8qIE5vdCBDUiAqLworCQkgIGlmICgoZG9wYXIoKENIQVIpIGMpID09IElBQykgJiYgLyogSUFDICgweGZmKSAqLworCQkgICAgICBuZXR3b3JrICYmIElTX1RFTE5FVCgpKSB7IC8qIFNlbmQgb25lIG5vdyAqLworCQkgICAgICB0dG9jKChjaGFyKUlBQyk7IC8qIGFuZCB0aGUgb3RoZXIgb25lIGp1c3QgYmVsb3cuICovCisJCSAgfQorI2VuZGlmIC8qIFROQ09ERSAqLworCQkvKiBTZW5kIHRoZSBjaGFyYWN0ZXIgKi8KKworCQl4ID0gdHRvYygoY2hhcilkb3BhcigoQ0hBUikgYykpOworCQlpZiAoeCA+IC0xKSB7CisjaWZkZWYgQ0tMRUFSTgorCQkgICAgaWYgKGxlYXJuaW5nKSB7CS8qIExlYXJuZWQgc2NyaXB0IGFjdGl2ZSAqLworCQkJaWYgKGNyZmxhZykgewkvKiBVc2VyIHR5cGVkIENSICovCisJCQkgICAgbGVhcm5jaGFyKENSKTsgLyogSGFuZGxlIENSICovCisJCQkgICAgbGVhcm5zdCA9IDA7ICAgLyogU2hpZnQgdG8gTmV1dHJhbCAqLworCQkJfSBlbHNlIHsKKwkJCSAgICBsZWFybmNoYXIoYyk7ICAvKiBOb3QgQ1IgKi8KKwkJCSAgICBsZWFybnN0ID0gMjsgICAvKiBDaGFuZ2Ugc3RhdGUgdG8gS2V5Ym9hcmQgKi8KKwkJCX0KKwkJICAgIH0KKyNlbmRpZiAvKiBDS0xFQVJOICovCisJCSAgICBpZiAoZHVwbGV4KSB7CS8qIElmIGhhbGYgZHVwbGV4LCBtdXN0IGVjaG8gKi8KKwkJCWlmIChkZWJzZXMpCisJCQkgIGNvbm9sKGRiY2hyKGNzYXZlKSk7IC8qIHRoZSBvcmlnaW5hbCBjaGFyICovCisJCQllbHNlCQkvKiBub3QgdGhlIHRyYW5zbGF0ZWQgb25lICovCisJCQkgIGNvbm9jKChjaGFyKWNzYXZlKTsKKwkJCWlmIChzZXNsb2cpIHsJLyogQW5kIG1heWJlIGxvZyBpdCB0b28gKi8KKwkJCSAgICBjMiA9IGNzYXZlOworCQkJICAgIGlmIChzZXNzZnQgPT0gMCAmJiBjc2F2ZSA9PSAnXHInKQorCQkJICAgICAgYzIgPSAnXG4nOworCQkJICAgIGxvZ2NoYXIoKGNoYXIpYzIpOworCQkJfQorCQkgICAgfQorCQl9IGVsc2UgeworCQkgICAgcGVycm9yKCJcclxuQ2FuJ3Qgc2VuZCBjaGFyYWN0ZXIiKTsKKwkJICAgIGN4X3N0YXR1cyA9IENTWF9JT0VSUk9SOworCQkgICAgYWN0aXZlID0gMDsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisJaWYgKEZEX0lTU0VUKHR0eWZkLCAmb3V0KSkgeworCSAgICBGRF9DTFIodHR5ZmQsICZvdXQpOworCX0KKwl3aGlsZSAoZ290bmV0ID4gMCB8fCBpYmMgPiAwKSB7CisJICAgIGdvdG5ldCA9IDA7CisJICAgIHByZXYgPSBjOworCSAgICBjID0gY2tjZ2V0YygwKTsJCS8qIEdldCBuZXh0IGNoYXJhY3RlciAqLworCSAgICAvKiBkZWJ1ZyhGMTAxLCJDT05ORUNUIGMiLCIiLGMpOyAqLworCSAgICBpZiAoYyA8IDApIHsJCS8qIEZhaWxlZC4uLiAqLworCQlja2NwdXRmKCk7CQkvKiBGbHVzaCBDT05ORUNUIG91dHB1dCBidWZmZXIgKi8KKwkJaWYgKG1zZ2ZsZykgeworCQkgICAgcHJpbnRmKCJcclxuQ29tbXVuaWNhdGlvbnMgZGlzY29ubmVjdCAiKTsKKyNpZmRlZiBDT01NRU5UCisJCSAgICBpZiAoYyA9PSAtMworI2lmZGVmIHVsdHJpeAorLyogVGhpcyBoYXBwZW5zIG9uIFVsdHJpeCBpZiB0aGVyZSdzIG5vIGNhcnJpZXIgKi8KKwkJCSYmIGVycm5vICE9IEVJTworI2VuZGlmIC8qIHVsdHJpeCAqLworI2lmZGVmIFVURUsKKy8qIFRoaXMgaGFwcGVucyBvbiBVVEVLIGlmIHRoZXJlJ3Mgbm8gY2FycmllciAqLworCQkJJiYgZXJybm8gIT0gRVdPVUxEQkxPQ0sKKyNlbmRpZiAvKiBVVEVLICovCisJCQkpCisJCSAgICAgIHBlcnJvcigiXHJcbkNhbid0IHJlYWQgY2hhcmFjdGVyIik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCQl9CisjaWZkZWYgTk9TRVRCVUYKKwkJZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogTk9TRVRCVUYgKi8KKwkJZG9sb2dlbmQoKTsKKwkJdHRoYW5nKCk7CQkvKiBIYW5nIHVwIHRoZSBjb25uZWN0aW9uICovCisJCWRlYnVnKEYxMTEsIkNPTk5FQ1QgaS9vIGVycm9yIDEiLGNrX2VycnN0cigpLGVycm5vKTsKKwkJY3hfc3RhdHVzID0gQ1NYX0hPU1RESVNDOworCQlnb3RvIGNvbnJldDA7CisJICAgIH0KKyNpZmRlZiBUTkNPREUKKwkgICAgdHggPSAwOworCSAgICBpZiAoKGMgPT0gTlVMKSAmJiBuZXR3b3JrICYmIElTX1RFTE5FVCgpKSB7CisJCWlmIChwcmV2ID09IENSKSB7ICAgIC8qIERpc2NhcmQgPE5VTD4gb2YgPENSPjxOVUw+IGlmIHBlZXIgKi8KKwkJICAgIGlmICghVEVMT1BUX1UoVEVMT1BUX0JJTkFSWSkpIHsgIC8qIG5vdCBpbiBiaW5hcnkgbW9kZSAqLworCQkJZGVidWcoRjExMSwiQ09OTkVDVCBOVUwiLGNraXRvYShwcmV2KSxjKTsKKwkJCWNrY3B1dGYoKTsJLyogRmx1c2ggc2NyZWVuIG91dHB1dCBidWZmZXIgKi8KKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgZGVidWcoRjExMSwiQ09OTkVDVCIsImMiLGMpOworCSAgICBkZWJ1ZyhGMTExLCJDT05ORUNUIiwibmV0d29yayIsbmV0d29yayk7CisJICAgIGRlYnVnKEYxMTEsIkNPTk5FQ1QiLCJJU19URUxORVQiLElTX1RFTE5FVCgpKTsKKwkgICAgaWYgKChjID09IElBQykgJiYgbmV0d29yayAmJiBJU19URUxORVQoKSkgeworI2lmZGVmIENLX0VOQ1JZUFRJT04KKwkJaW50IHhfYXV0aCA9IFRFTE9QVF9NRShURUxPUFRfQVVUSEVOVElDQVRJT04pOworI2Vsc2UKKwkJaW50IHhfYXV0aCA9IDA7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworCQlpbnQgbWVfYmluID0gVEVMT1BUX01FKFRFTE9QVF9CSU5BUlkpOworCQlpbnQgdV9iaW4gPSBURUxPUFRfVShURUxPUFRfQklOQVJZKTsKKwkJZGVidWcoRjEwMCwiQ09OTkVDVCBnb3QgSUFDIiwiIiwwKTsKKwkJY2tjcHV0ZigpOwkJLyogRHVtcCBzY3JlZW4tb3V0cHV0IGJ1ZmZlciAqLworCQlpZiAoKHR4ID0gdG5fZG9vcCgoQ0hBUikoYyAmIDB4ZmYpLGR1cGxleCxja2NnZXRjKSkgPT0gMCkgeworCQkgICAgaWYgKG1lX2JpbiAhPSBURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkpIHsKKwkJCW1lX2JpbiA9IFRFTE9QVF9NRShURUxPUFRfQklOQVJZKTsKKwkJICAgIH0gZWxzZSBpZiAodV9iaW4gIT0gVEVMT1BUX1UoVEVMT1BUX0JJTkFSWSkpIHsKKwkJCXVfYmluID0gVEVMT1BUX1UoVEVMT1BUX0JJTkFSWSk7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorLyoKKyAgSGVyZSB3ZSBoYXZlIHRvIHB1c2ggYmFjayBhbnkgYnl0ZXMgd2UgaGF2ZSByZWFkIHVzaW5nIGJsb2NrIHJlYWRzLCBzbyB3ZQorICBjYW4gcmVhZCB0aGVtIGFnYWluIHVzaW5nIHNpbmdsZS1jaGFyYWN0ZXIgcmVhZHMsIHNvIHRoZXkgY2FuIGJlIGRlY3J5cHRlZAorICBpbiBjYXNlIHRoZXJlIHdhcyBhIHN3aXRjaCB0byBlbmNyeXB0aW9uIGluIHRoZSBibG9jay4gIE5vdGUgdGhhdCB3ZSBjYW4ndAorICBoYW5kbGUgc3dpdGNoZXMgaW4gdGhlIGVuY3J5cHRpb24gc3RhdGUgaXRzZWxmIHRoaXMgd2F5IC0tIHdoaWNoIHdvdWxkIGJlCisgIG5pY2UsIHNpbmNlIGl0IHdvdWxkIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc2luZ2xlLWNoYXJhY3RlciByZWFkcy4gIFdoeT8KKyAgQmVjYXVzZSBpZiBhIHNlcmllcyBvZiBjaGFyYWN0ZXJzIGhhcyBhbHJlYWR5IGJlZW4gZGVjcnlwdGVkIHRoYXQgc2hvdWxkbid0CisgIGhhdmUgYmVlbiwgdGhlbiAoYSkgaXQncyBydWluZWQsIGFuZCAoYikgc28gaXMgdGhlIHN0YXRlIG9mIHRoZSBkZWNyeXB0aW9uCisgIG1hY2hpbmUuICBUb28gYmFkLgorKi8KKwkJICAgIH0gZWxzZSBpZiAoVEVMT1BUX01FKFRFTE9QVF9BVVRIRU5USUNBVElPTikgIT0gMCAmJgorCQkJICAgICAgIFRFTE9QVF9NRShURUxPUFRfQVVUSEVOVElDQVRJT04pICE9IHhfYXV0aAorCQkJICAgICAgICkgeworCQkJaWYgKHR0cHVzaGJhY2soKENIQVIgKilpYnAsaWJjKSA+IC0xKSB7CisJCQkgICAgaWJjID0gMDsKKwkJCSAgICBpYnAgPSBpYnVmOworCQkJfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKwkJICAgIH0KKwkJICAgIGNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHR4ID09IC0xKSB7CS8qIEkvTyBlcnJvciAqLworCQkgICAgaWYgKG1zZ2ZsZykKKwkJICAgICAgcHJpbnRmKCJcclxuQ29tbXVuaWNhdGlvbnMgZGlzY29ubmVjdCAiKTsKKyNpZmRlZiBOT1NFVEJVRgorCQkgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogTk9TRVRCVUYgKi8KKwkJICAgIGRvbG9nZW5kKCk7CisJCSAgICBkZWJ1ZyhGMTExLCJDT05ORUNUIGkvbyBlcnJvciAyIixja19lcnJzdHIoKSxlcnJubyk7CisJCSAgICBjeF9zdGF0dXMgPSBDU1hfSU9FUlJPUjsKKwkJICAgIGdvdG8gY29ucmV0MDsKKwkJfSBlbHNlIGlmICh0eCA9PSAtMikgewkvKiBJL08gZXJyb3IgKi8KKwkJICAgIGlmIChtc2dmbGcpCisJCSAgICAgIHByaW50ZigiXHJcbkNvbm5lY3Rpb24gY2xvc2VkIGJ5IHBlZXIiKTsKKyNpZmRlZiBOT1NFVEJVRgorCQkgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogTk9TRVRCVUYgKi8KKwkJICAgIGRvbG9nZW5kKCk7CisJCSAgICBkZWJ1ZyhGMTExLCJDT05ORUNUIGkvbyBlcnJvciAzIixja19lcnJzdHIoKSxlcnJubyk7CisJCSAgICBjeF9zdGF0dXMgPSBDU1hfSU9FUlJPUjsKKwkJICAgIGdvdG8gY29ucmV0MDsKKwkJfSBlbHNlIGlmICh0eCA9PSAtMykgewkvKiBJL08gZXJyb3IgKi8KKwkJICAgIGlmIChtc2dmbGcpCisJCSAgICAgIHByaW50ZigiXHJcbkNvbm5lY3Rpb24gY2xvc2VkIGR1ZSB0byB0ZWxuZXQgcG9saWN5Iik7CisjaWZkZWYgTk9TRVRCVUYKKwkJICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmIC8qIE5PU0VUQlVGICovCisJCSAgICBkb2xvZ2VuZCgpOworCQkgICAgZGVidWcoRjExMSwiQ09OTkVDVCBpL28gZXJyb3IgNCIsY2tfZXJyc3RyKCksZXJybm8pOworCQkgICAgY3hfc3RhdHVzID0gQ1NYX0lPRVJST1I7CisJCSAgICBnb3RvIGNvbnJldDA7CisJCX0gZWxzZSBpZiAoKHR4ID09IDEpICYmICghZHVwbGV4KSkgeyAvKiBFQ0hPIGNoYW5nZSAqLworCQkgICAgZHVwbGV4ID0gMTsJCS8qIFR1cm4gb24gbG9jYWwgZWNobyAqLworCQkgICAgY29udGludWU7CisJCX0gZWxzZSBpZiAoKHR4ID09IDIpICYmIChkdXBsZXgpKSB7IC8qIEVDSE8gY2hhbmdlICovCisJCSAgICBkdXBsZXggPSAwOworCQkgICAgY29udGludWU7CisJCX0gZWxzZSBpZiAodHggPT0gMykgewkvKiBRdW90ZWQgSUFDICovCisJCSAgICBjID0gcGFyaXR5ID8gMTI3IDogMjU1OworCQl9CisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR4ID09IDQpIHsgICAvKiBJS1MgU3RhdGUgQ2hhbmdlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQgJiYKKwkJCSF0Y3BfaW5jb21pbmcKKwkJCSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogaGVyZSB3ZSBuZWVkIHRvIHByaW50IGEgbXNnIHRoYXQgdGhlIG90aGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaWRlIGlzIGluIFNFUlZFUiBtb2RlIGFuZCB0aGF0IFJFTU9URSAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmRzIHNob3VsZCBiZSB1c2VkLiAgQW5kIENPTk5FQ1QgbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hvdWxkIGJlIGVuZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCQljeF9zdGF0dXMgPSBDU1hfSUtTRDsKKwkJCWFjdGl2ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR4ID09IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRE8gTE9HT1VUIHdhcyByZWNlaXZlZCAqLworCQkgICAgaWYgKG1zZ2ZsZykKKwkJICAgICAgcHJpbnRmKCJcclxuUmVtb3RlIExvZ291dCAiKTsKKyNpZmRlZiBOT1NFVEJVRgorCQkgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogTk9TRVRCVUYgKi8KKwkJICAgIGRlYnVnKEYxMDAsIkNPTk5FQ1QgUmVtb3RlIExvZ291dCIsIiIsMCk7CisJCSAgICBjeF9zdGF0dXMgPSBDU1hfVFJJR0dFUjsKKwkJICAgIGdvdG8gY29ucmV0MDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKwkJICBjb250aW51ZTsJCS8qIE5lZ290aWF0aW9uIE9LLCBnZXQgbmV4dCBjaGFyLiAqLworCSAgICB9IGVsc2UgaWYgKHBhcml0eSkKKwkgICAgICBjICY9IDB4N2Y7CisKKwkgICAgLyogSSdtIGVjaG9pbmcgZm9yIHRoZSByZW1vdGUgKi8KKyAgICAgICAgICAgIGlmIChURUxPUFRfTUUoVEVMT1BUX0VDSE8pICYmIHRuX3JlbV9lY2hvKQorCSAgICAgIHR0b2MoKGNoYXIpYyk7CisjZW5kaWYgLyogVE5DT0RFICovCisKKyNpZmRlZiBDS0xFQVJOCisJIC8qIExlYXJuZWQgc2NyaXB0OiBSZWNvcmQgaW5jb21pbmcgY2hhcnMgaWYgbm90IGluIEtleWJvYXJkIHN0YXRlICovCisKKwkgICAgaWYgKGxlYXJuaW5nICYmIGxlYXJuc3QgIT0gMikgeyAvKiBMZWFybmVkIHNjcmlwdCBhY3RpdmUgKi8KKwkJbGVhcm5idWZbbGVhcm5icCsrXSA9IGM7ICAgIC8qIFNhdmUgZm9yIElOUFVUIGNvbW1hbmQgKi8KKwkJaWYgKGxlYXJuYnAgPj0gTEVBUk5CVUZTSVopIC8qIGluIGNpcmN1bGFyIGJ1ZmZlciAqLworCQkgIGxlYXJuYnAgPSAwOyAgICAgICAgICAgICAgLyogd3JhcHBpbmcgaWYgYXQgZW5kLiAqLworCQlsZWFybmJjKys7ICAgICAgICAgICAgICAgICAgLyogQ291bnQgdGhpcyBieXRlLiAqLworCQlsZWFybnN0ID0gMTsgICAgICAgICAgICAgICAgLyogU3RhdGUgaXMgTmV0LiAqLworCSAgICB9CisjZW5kaWYgLyogQ0tMRUFSTiAqLworCisJICAgIGlmIChkZWJzZXMpIHsJCS8qIE91dHB1dCBjaGFyYWN0ZXIgdG8gc2NyZWVuICovCisJCWNoYXIgKnM7CQkvKiBEZWJ1Z2dpbmcgZGlzcGxheS4uLiAqLworCQlzID0gZGJjaHIoYyk7CisJCXdoaWxlICgqcykKKwkJICBja2NwdXRjKCpzKyspOworCSAgICB9IGVsc2UgewkJCS8qIFJlZ3VsYXIgZGlzcGxheSAuLi4gKi8KKwkJYyAmPSBjbWFzazsJCS8qIEFwcGx5IEtlcm1pdC10by1yZW1vdGUgbWFzayAqLworCQlpZiAoc2VzbG9nICYmIHNlc3NmdCkJLyogSWYgYmluYXJ5IHNlc3Npb24gbG9nICovCisJCSAgbG9nY2hhcigoY2hhciljKTsJLyogbG9nIHRoZSBjaGFyYWN0ZXIgbm93LiAqLworI2lmbmRlZiBOT1hGRVIKKyNpZmRlZiBDS19BVVRPREwKKy8qCisgIEF1dG9kb3dubG9hZC4gIENoZWNrIGZvciBLZXJtaXQgUyBwYWNrZXQgcHJpb3IgdG8gdHJhbnNsYXRpb24sIHNpbmNlIHRoYXQKKyAgY2FuIGNoYW5nZSB0aGUgcGFja2V0IGFuZCBtYWtlIGl0IHVucmVjb2duaXphYmxlIChhcyB3aGVuIHRoZSB0ZXJtaW5hbAorICBjaGFyYWN0ZXIgc2V0IGlzIGFuIElTTyA2NDYgb25lKS4uLiAgRGl0dG8gZm9yIFptb2RlbSBzdGFydCBwYWNrZXQuCisqLworCQlpZiAoYXV0b2RsCQkvKiBBdXRvZG93bmxvYWQgZW5hYmxlZD8gKi8KKyNpZmRlZiBJS1NfT1BUSU9OCisJCSAgICB8fCBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCQkgICAgKSB7CisJCSAgICBpbnQgayA9IDA7CisKKwkJICAgIGlmIChrc3RhcnRhY3RpdmUgfHwgYyA9PSBzdGNociAvKiBLZXJtaXQgUyBvciBJIHBhY2tldD8gKi8KKyNpZmRlZiBDT01NRU5UCisJCQl8fCBhZGxfa21vZGUgPT0gQURMU1RSIC8qIE5vdCB1c2VkIGluIEMtS2VybWl0ICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCQkJKQorCQkgICAgICBrID0ga3N0YXJ0KChDSEFSKWMpOworI2lmZGVmIENLX1hZWgorCQkgICAgaWYgKCFrICYmIHptZGxvaykJLyogT3IgYW4gInN6IiBzdGFydD8gKi8KKwkJICAgICAgayA9IHpzdGFydCgoQ0hBUiljKTsKKyNlbmRpZiAvKiBDS19YWVogKi8KKwkJICAgIGlmIChrKSB7CisJCQlpbnQga3NpZ24gPSAwOworCQkJZGVidWcoRjEwMSwiQ09OTkVDVCBhdXRvZG93bmxvYWQgayIsIiIsayk7CisJCQlpZiAoayA8IDApIHsgLyogTWludXMtUHJvdG9jb2w/ICovCisjaWZkZWYgTk9TRVJWRVIKKwkJCSAgICBnb3RvIG5vc2VydmVyOyAvKiBOZWVkIHNlcnZlciBtb2RlIGZvciB0aGlzICovCisjZWxzZQorCQkJICAgIGtzaWduID0gMTsgLyogUmVtZW1iZXIgKi8KKwkJCSAgICBrID0gMCAtIGs7IC8qIENvbnZlcnQgdG8gYWN0dWFsIHByb3RvY29sICovCisJCQkgICAganVzdG9uZSA9IDE7IC8qIEZsYWcgZm9yIHByb3RvY29sIG1vZHVsZSAqLworI2VuZGlmIC8qIE5PU0VSVkVSICovCisJCQl9IGVsc2UKKwkJCSAganVzdG9uZSA9IDA7CisJCQlrLS07CQkvKiBBZGp1c3QgW2t6XXN0YXJ0J3MgcmV0dXJuIHZhbHVlICovCisJCQlpZiAoayA9PSBQUk9UT19LCisjaWZkZWYgQ0tfWFlaCisJCQkgICAgfHwgayA9PSBQUk9UT19aCisjZW5kaWYgLyogQ0tfWFlaICovCisJCQkgICAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGFtYWdlIHRoZSBwYWNrZXQgc28gdGhhdCBpdCBkb2Vzbid0IHRyaWdnZXIgKi8KKwkJCSAgICAvKiBhdXRvZG93bmxvYWQgZGV0ZWN0aW9uIGRvd25zdHJlYW0uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsgPT0gUFJPVE9fSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgbGVuID0gc3RybGVuKChjaGFyICopa3NidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJICBja2NwdXRjKEJTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ0tfWFlaCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJCSAgY2tjcHV0YyhDQU4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19YWVogKi8KKworI2lmbmRlZiBOT0lDUAorCQkJICAgIC8qIHNwcmludGYgaXMgc2FmZSBoZXJlIChidWlsdGluIGtleXdvcmRzKSAqLworCQkJICAgIHNwcmludGYoYXBjYnVmLAorCQkJCSAgICAic2V0IHByb3RvICVzLCAlcywgc2V0IHByb3RvICVzIiwKKwkJCQkgICAgcHRhYltrXS5wX25hbWUsCisJCQkJICAgIGtzaWduID8gInNlcnZlciIgOiAicmVjZWl2ZSIsCisJCQkJICAgIHB0YWJbcHJvdG9jb2xdLnBfbmFtZQorCQkJCSAgICApOworCQkJICAgIGFwY2xlbmd0aCA9IHN0cmxlbihhcGNidWYpOworCQkJICAgIGRlYnVnKEYxMTEsIkNPTk5FQ1Qga3NidWYiLGtzYnVmLGspOworCQkJICAgIGRlYnVnKEYxMTAsIkNPTk5FQ1QgYXV0b2Rvd25sb2FkIixhcGNidWYsMCk7CisJCQkgICAgYXBjYWN0aXZlID0gQVBDX0xPQ0FMOworCQkJICAgIGNrY3B1dGYoKTsJLyogRm9yY2Ugc2NyZWVuIHVwZGF0ZSAqLworCQkJICAgIGN4X3N0YXR1cyA9IENTWF9BUEM7CisJCQkgICAgZ290byBjb25yZXQxOworI2Vsc2UKKy8qCisgIEhlcmUncyBhbm90aGVyIHdheSB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBBUEMsIGJ1dCB0aGVuIHdlJ2xsIGhhdmUgdG8gY2hhbmdlCisgIGFsbCB0aGUgb3RoZXIgQ09OTkVDVCBtb2R1bGVzLCBhbmQgdGhlbiB0aGUgbWFpbmxpbmUgY29kZSB0aGF0IGNhbGxzIHRoZW0uCisqLworCQkJICAgIHsKKwkJCQlleHRlcm4gY2hhciBzc3RhdGU7CisJCQkJc3N0YXRlID0ga3NpZ24gPyAneCcgOiAndic7CisJCQkJcHJvdG8oKTsKKwkJCSAgICB9CisjZW5kaWYgLyogTk9JQ1AgKi8KKwkJCX0KKwkJICAgIH0KKwkJfQorI2lmZGVmIE5PU0VSVkVSCisJICAgICAgbm9zZXJ2ZXI6CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKworI2VuZGlmIC8qIENLX0FVVE9ETCAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCQlpZiAoc29zaSkgewkJLyogSGFuZGxlIFNJL1NPICovCisJCSAgICBpZiAoYyA9PSBTTykgewkvKiBTaGlmdCBPdXQgKi8KKwkJCWluc2hpZnQgPSAxOworCQkJY29udGludWU7CisJCSAgICB9IGVsc2UgaWYgKGMgPT0gU0kpIHsgLyogU2hpZnQgSW4gKi8KKwkJCWluc2hpZnQgPSAwOworCQkJY29udGludWU7CisJCSAgICB9CisJCSAgICBpZiAoaW5zaGlmdCkgYyB8PSAwMjAwOworCQl9CisJCWlueGJ1ZlswXSA9IGM7CQkvKiBJbiBjYXNlIHRoZXJlIGlzIG5vIHRyYW5zbGF0aW9uICovCisJCWlueGNvdW50ID0gMTsJCS8qIC4uLiAqLworI2lmbmRlZiBOT0NTRVRTCisJCWlmIChpbmVzY1swXSA9PSBFU19OT1JNQUwgLyogSWYgbm90IGluIGFuIGVzY2FwZSBzZXF1ZW5jZSAqLworCQkgICAgJiYgIXByaW50aW5nCS8qIGFuZCBub3QgaW4gdHJhbnNwYXJlbnQgcHJpbnQgKi8KKwkJICAgICkgewkJCS8qIFRyYW5zbGF0ZSBjaGFyYWN0ZXIgc2V0cyAqLworI2lmZGVmIFVOSUNPREUKKwkJICAgIGludCB4OworCQkgICAgaWYgKHVuaWNvZGUgPT0gMSkgewkvKiBSZW1vdGUgaXMgVVRGLTggKi8KKwkJCXggPSB1X3RvX2IoKENIQVIpYyk7CisJCQlpZiAoeCA9PSAtMSkKKwkJCSAgY29udGludWU7CisJCQllbHNlIGlmICh4ID09IC0yKSB7IC8qIExTIG9yIFBTICovCisJCQkgICAgaW54YnVmWzBdID0gQ1I7CisJCQkgICAgaW54YnVmWzFdID0gTEY7CisJCQkgICAgaW54Y291bnQgPSAyOworCQkJfSBlbHNlIGlmICh4ID09IC05KSB7IC8qIFVURi04IGVycm9yICovCisJCQkgICAgaW54YnVmWzBdID0gJz8nOworCQkJICAgIGlueGJ1ZlsxXSA9IHVfdG9fYjIoKTsKKwkJCSAgICBpbnhjb3VudCA9IDI7CisJCQl9IGVsc2UgeworCQkJICAgIGlueGJ1ZlswXSA9ICh1bnNpZ25lZCkoeCAmIDB4ZmYpOworCQkJfQorCQkJYyA9IGlueGJ1ZlswXTsKKwkJICAgIH0gZWxzZSBpZiAodW5pY29kZSA9PSAyKSB7IC8qIExvY2FsIGlzIFVURi04ICovCisJCQlpbnhjb3VudCA9IGJfdG9fdSgoQ0hBUiljLGlueGJ1ZixPVVRYQlVGU0laLHRjc3NpemUpOworCQkJYyA9IGlueGJ1ZlswXTsKKwkJICAgIH0gZWxzZSB7CisjZW5kaWYgLyogVU5JQ09ERSAqLworCQkJaWYgKHN4aSkgYyA9ICgqc3hpKSgoQ0hBUiljKTsKKwkJCWlmIChyeGkpIGMgPSAoKnJ4aSkoKENIQVIpYyk7CisJCQlpbnhidWZbMF0gPSBjOworI2lmZGVmIFVOSUNPREUKKwkJICAgIH0KKyNlbmRpZiAvKiBVTklDT0RFICovCisJCX0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyNpZm5kZWYgTk9FU0NTRVEKKwkJaWYgKGVzY3NlcSkgewkJLyogSWYgaGFuZGxpbmcgZXNjYXBlIHNlcXVlbmNlcyAqLworCQkgICAgb2xkcHJ0ID0gcHJpbnRpbmc7CSAgICAgLyogcmVtZW1iZXIgcHJpbnRlciBzdGF0ZSAqLworCQkgICAgYXBjcmMgPSBjaGthZXMoKGNoYXIpYywwKTsgLyogYW5kIHVwZGF0ZSBlc2NzZXEgc3RhdGUuICovCisJCSAgICBpZiAocHJpbnRpbmcgJiYgIW9sZHBydCkgLyogSWYgcHJpbnRlciB3YXMgdHVybmVkIG9uICovCisJCSAgICAgIGNvbnRpbnVlOwkJLyogZG9uJ3QgcHJpbnQgZmluYWwgY2hhciBvZiBlc2NzZXEgKi8KKwkJfQorI2lmZGVmIENLX0FQQworLyoKKyAgSWYgd2UgYXJlIGhhbmRsaW5nIEFQQ3MsIHdlIGhhdmUgc2V2ZXJhbCBwb3NzaWJpbGl0aWVzIGF0IHRoaXMgcG9pbnQ6CisgICAxLiBPcmRpbmFyeSBjaGFyYWN0ZXIgdG8gYmUgd3JpdHRlbiB0byB0aGUgc2NyZWVuLgorICAgMi4gQW4gRXNjOyB3ZSBjYW4ndCB3cml0ZSBpdCBiZWNhdXNlIGl0IG1pZ2h0IGJlIHRoZSBiZWdpbm5pbmcgb2YgYW4gQVBDLgorICAgMy4gVGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgYW4gRXNjLCBpbiB3aGljaCBjYXNlIHdlIHdyaXRlIEVzYywgdGhlbiBjaGFyLAorICAgICAgYnV0IG9ubHkgaWYgd2UgaGF2ZSBub3QganVzdCBlbnRlcmVkIGFuIEFQQyBzZXF1ZW5jZS4KKyovCisJCWlmIChlc2NzZXEgJiYgKGFwY3N0YXR1cyAmIEFQQ19PTikpIHsKKwkJICAgIGlmIChpbmVzY1swXSA9PSBFU19HT1RFU0MpIC8qIERvbid0IHdyaXRlIEVTQyB5ZXQgKi8KKwkJICAgICAgY29udGludWU7CisJCSAgICBlbHNlIGlmIChvbGRlc2NbMF0gPT0gRVNfR09URVNDICYmICFhcGNhY3RpdmUpIHsKKwkJCWNrY3B1dGMoRVNDKTsJLyogV3JpdGUgc2F2ZWQgRVNDICovCisJCQlpZiAoc2VzbG9nICYmICFzZXNzZnQpIGxvZ2NoYXIoKGNoYXIpRVNDKTsKKwkJICAgIH0gZWxzZSBpZiAoYXBjcmMpIHsJLyogV2UgaGF2ZSBhbiBBUEMgKi8KKwkJCWRlYnVnKEYxMTEsIkNPTk5FQ1QgQVBDIGNvbXBsZXRlIixhcGNidWYsYXBjbGVuZ3RoKTsKKwkJCWNrY3B1dGYoKTsJLyogRm9yY2Ugc2NyZWVuIHVwZGF0ZSAqLworCQkJY3hfc3RhdHVzID0gQ1NYX0FQQzsKKwkJCWdvdG8gY29ucmV0MTsKKwkJICAgIH0KKwkJfQorI2VuZGlmIC8qIENLX0FQQyAqLworI2VuZGlmIC8qIE5PRVNDU0VRICovCisKKwkJZGVidWcoRjExMSwiSU5YQlVGIixpbnhidWYsaW54Y291bnQpOworCQlmb3IgKGkgPSAwOyBpIDwgaW54Y291bnQ7IGkrKykgeyAvKiBMb29wIHRocnUgKi8KKwkJICAgIGMgPSBpbnhidWZbaV07CS8qIGlucHV0IGV4cGFuc2lvbiBidWZmZXIuLi4gKi8KKwkJICAgIGlmICgKKyNpZmRlZiBDS19BUEMKKwkJCSFhcGNhY3RpdmUgJiYJLyogRG9uJ3QgZGlzcGxheSBBUEMgc2VxdWVuY2VzICovCisjZW5kaWYgLyogQ0tfQVBDICovCisJCQkhcHJpbnRpbmcJLyogb3IgdHJhbnNwYXJlbnQgcHJpbnQgbWF0ZXJpYWwgKi8KKworCQkJKSB7CisJCQljICY9IGNtZG1zazsJLyogQXBwbHkgY29tbWFuZCBtYXNrLiAqLworCQkJaWYgKGMgPT0gQ1IgJiYgdHRfY3JkKSB7IC8qIFNFVCBURVJNIENSLURJU1BMQSBDUkxGPyAqLworCQkJICAgIGNrY3B1dGMoYyk7CS8qIFllcywgb3V0cHV0IENSICovCisJCQkgICAgaWYgKHNlc2xvZyAmJiAhc2Vzc2Z0KSBsb2djaGFyKChjaGFyKWMpOworCQkJICAgIGMgPSBMRjsJLyogYW5kIGluc2VydCBhIGxpbmVmZWVkICovCisJCQl9CisJCQlpZiAoZG9udHByaW50KQl7IC8qIERvIHRyYW5zcGFyZW50IHByaW50aW5nLiAqLworCQkJICAgIGRvbnRwcmludCA9IDA7CisJCQkgICAgY29udGludWU7CisJCQl9IGVsc2UKKworCQkJY2tjcHV0YyhjKTsJLyogV3JpdGUgY2hhcmFjdGVyIHRvIHNjcmVlbiAqLworCQkgICAgfQorCQkgICAgaWYgKHNlc2xvZyAmJiAhc2Vzc2Z0KSAvKiBIYW5kbGUgc2Vzc2lvbiBsb2cuICovCisJCSAgICAgIGxvZ2NoYXIoKGNoYXIpYyk7CisjaWZkZWYgWFBSSU5UCisJCSAgICBpZiAocHJpbnRpbmcgJiYgIWluZXNjWzBdKSB7CisJCQkvKiB6Y2hvdXQoKSBjYW4ndCBiZSB1c2VkIGJlY2F1c2UgKi8KKwkJCS8qIGl0J3MgYnVmZmVyZWQgZGlmZmVyZW50bHkuICovCisJCQljYnVmWzBdID0gYzsKKwkJCXpzb3V0eChaTUZJTEUsKGNoYXIgKiljYnVmLDEpOworCQkgICAgfQorI2VuZGlmIC8qIFhQUklOVCAqLworCisjaWZkZWYgQ0tfVFJJR0dFUgorCQkgICAgLyogQ2hlY2sgZm9yIHRyaWdnZXIgc3RyaW5nICovCisJCSAgICBpZiAodHRfdHJpZ2dlclswXSkgeworCQkJaW50IGk7CisJCQlpZiAoKGkgPSBhdXRvZXhpdGNoaygoQ0hBUiljKSkgPiAtMSkgeworCQkJICAgIG1ha2VzdHIoJnRyaWdnZXJ2YWwsdHRfdHJpZ2dlcltpXSk7CisJCQkgICAgY2tjcHV0ZigpOwkvKiBGb3JjZSBzY3JlZW4gdXBkYXRlICovCisjaWZkZWYgTk9TRVRCVUYKKwkJCSAgICBmZmx1c2goc3Rkb3V0KTsgLyogSSBtZWFuIHJlYWxseSBmb3JjZSBpdCAqLworI2VuZGlmIC8qIE5PU0VUQlVGICovCisJCQkgICAgY3hfc3RhdHVzID0gQ1NYX1RSSUdHRVI7CisJCQkgICAgZ290byBjb25yZXQxOworCQkJfQorCQkgICAgfQorI2VuZGlmIC8qIENLX1RSSUdHRVIgKi8KKwkJfQorCSAgICB9CisJfQorI2lmbmRlZiBCRUJPWAorCWlmIChGRF9JU1NFVChzY3Jub3V0LCAmb3V0KSkgeworCSAgICBGRF9DTFIoc2Nybm91dCwgJm91dCk7CisJfQorI2VuZGlmIC8qIEJFQk9YICovCisgICAgfSAvKiBFbmQgb2YgYmlnIGxvb3AgKi8KKyAgY29ucmV0MToJCQkJLyogQ29tZSBoZXJlIHRvIHN1Y2NlZWQgKi8KKyAgICByYyA9IDE7CisgIGNvbnJldDA6CQkJCS8qIENvbW1vbiBleGl0IHBvaW50ICovCisjaWZkZWYgQkVCT1gKKyAgICB7CisJbG9uZyByZXRfdmFsOworCWNsb3Nlc29ja2V0KHBhaXJbMF0pOworCWNsb3Nlc29ja2V0KHBhaXJbMV0pOworCXggPSBraWxsKHRpZCxTSUdLSUxMVEhSKTsJLyogS2lsbCB0aHJlYWQgKi8KKwl3YWl0X2Zvcl90aHJlYWQgKHRpZCwgJnJldF92YWwpOworICAgIH0KKyNlbmRpZiAvKiBCRUJPWCAqLworCisjaWZkZWYgQ0tMRUFSTgorICAgIGlmIChsZWFybmluZyAmJiBsZWFybmZwKQorICAgICAgZnB1dHMoIlxuIixsZWFybmZwKTsKKyNlbmRpZiAvKiBDS0xFQVJOICovCisKKyAgICBjb25yZXMoKTsKKyAgICBpZiAoZG9oYW5ndXAgPiAwKSB7CisjaWZkZWYgTkVUQ09OTgorCWlmIChuZXR3b3JrCisjaWZkZWYgVE5DT0RFCisJICAgICYmICFURUxPUFRfTUUoVEVMT1BUX0NPTVBPUlQpCisjZW5kaWYgLyogVE5DT0RFICovCisJICAgICkKKwkgIHR0Y2xvcygwKTsKKyNlbmRpZiAvKiBORVRDT05OICovCisKKyNpZm5kZWYgQ09NTUVOVAorLyoKKyAgVGhpcyBpcyBiYWQgYmVjYXVzZSBpZiB0aGV5IHNhaWQgU0VUIE1PREVNIEhBTkdVUC1NRVRIT0QgTU9ERU0tQ09NTUFORCwKKyAgdGhleSBtZWFuIGl0IC0tIHdlIHNob3VsZG4ndCBmYWxsIGJhY2sgb24gdHRoYW5nKCkgaWYgbWRtaHVwKCkgZmFpbHMsCisgIGJlY2F1c2UgbWF5YmUgdGhleSBoYXZlIHNvbWUgc3BlY2lhbCBraW5kIG9mIGNvbm5lY3Rpb24uICBPbiB0aGUgb3RoZXIKKyAgaGFuZCwgbWFraW5nIHRoaXMgY2hhbmdlIHByZXZlbnRzIGRpYWxpbmcgZnJvbSB3b3JraW5nIGF0IGFsbCBpbiBzb21lCisgIGNhc2VzLiAgRnVydGhlciBzdHVkeSBuZWVkZWQuCisqLworI2lmbmRlZiBOT0RJQUwKKwlpZiAoZG9oYW5ndXAgPiAxKQkJLyogVXNlciBhc2tlZCBmb3IgaXQgKi8KKwkgIGlmIChtZG1odXAoKSA8IDEpCQkvKiBNYXliZSBoYW5nIHVwIHZpYSBtb2RlbSAqLworI2VuZGlmIC8qIE5PRElBTCAqLworCSAgICB0dGhhbmcoKTsJCQkvKiBBbmQgbWFrZSBzdXJlIHdlIGRvbid0IGhhbmcgdXAgKi8KKyNlbHNlCisJaWYgKCFuZXR3b3JrKSB7CQkJLyogU2VyaWFsIGNvbm5lY3Rpb24uICovCisjaWZuZGVmIE5PRElBTAorCSAgICBpZiAoZGlhbG1odSkJCS8qIEhhbmcgdXAgdGhlIHdheSB0aGV5IHNhaWQgdG8uICovCisJICAgICAgbWRtaHVwKCk7CisJICAgIGVsc2UKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKwkgICAgICB0dGhhbmcoKTsKKwl9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCWRvbG9nZW5kKCk7CisJZG9oYW5ndXAgPSAwOwkJCS8qIGFnYWluIHVubGVzcyByZXF1ZXN0ZWQgYWdhaW4uICovCisgICAgfQorICAgIGlmIChxdWl0bm93KQkJCS8qIEV4aXQgbm93IGlmIHJlcXVlc3RlZC4gKi8KKyAgICAgIGRvZXhpdChHT09EX0VYSVQseGl0c3RhKTsKKyAgICBpZiAobXNnZmxnCisjaWZkZWYgQ0tfQVBDCisJJiYgIWFwY2FjdGl2ZQorI2VuZGlmIC8qIENLX0FQQyAqLworCSkKKyAgICAgIHByaW50ZigiKEJhY2sgYXQgJXMpIiwgKm15aG9zdCA/IG15aG9zdCA6ICJsb2NhbCBVTklYIHN5c3RlbSIpOworI2lmZGVmIENLX0FQQworICAgIGlmICghYXBjYWN0aXZlKQorI2VuZGlmIC8qIENLX0FQQyAqLworICAgICAgcHJpbnRmKCJcbiIpOworICAgIHdoYXQgPSBXX05PVEhJTkc7CQkJLyogU28gY29uc29sZSBtb2RlcyBzZXQgcmlnaHQuICovCisjaWZuZGVmIE5PQ1NFVFMKKyAgICBsYW5ndWFnZSA9IGxhbmdzdjsJCQkvKiBSZXN0b3JlIGxhbmd1YWdlICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworI2lmZGVmIENLX0FQQworICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgZXhpdCBhcGNhY3RpdmUiLCIiLGFwY2FjdGl2ZSk7CisgICAgZGVidWcoRjEwMSwiQ09OTkVDVCBleGl0IGp1c3RvbmUiLCIiLGp1c3RvbmUpOworI2VuZGlmIC8qIENLX0FQQyAqLworICAgIGlmIChtc2dmbGcpIHsKKyNpZmRlZiBDS19BUEMKKwlpZiAoYXBjYWN0aXZlID09IEFQQ19MT0NBTCkKKwkgIHByaW50ZigiXG4iKTsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKwlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXByaW50YmFyID0gMTsKKyAgICB9IGVsc2UKKwlwcmludGJhciA9IDA7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgcmV0dXJuKHJjKTsKK30KKworLyogIEggQyBPIE4gTiBFICAtLSAgR2l2ZSBoZWxwIG1lc3NhZ2UgZm9yIGNvbm5lY3QuICAqLworCisjZGVmaW5lIENYTV9TRVIgMQkJCS8qIFNlcmlhbCBjb25uZWN0aW9ucyBvbmx5ICovCisjZGVmaW5lIENYTV9ORVQgMgkJCS8qIE5ldHdvcmsgb25seSAoYnV0IG5vdCBUZWxuZXQpICovCisjZGVmaW5lIENYTV9URUwgNAkJCS8qIFRlbG5ldCBvbmx5ICovCisKK3N0YXRpYyBzdHJ1Y3QgaG1zZ3RhYiB7CisgICAgY2hhciAqIGhtc2c7CisgICAgaW50IGhmbGFnczsKK30gaGxwbXNnW10gPSB7CisgICAgeyIgID8gb3IgSCBmb3IgdGhpcyBtZXNzYWdlIiwgICAgICAgICAgICAgICAgMH0sCisgICAgeyIgIDAgKHplcm8pIHRvIHNlbmQgdGhlIE5VTCAoMCkgY2hhcmFjdGVyIiwgMH0sCisgICAgeyIgIEIgdG8gc2VuZCBhIEJSRUFLIHNpZ25hbCAoMC4yNzVzZWMpIiwgIENYTV9TRVJ9LAorI2lmZGVmIE5FVENPTk4KKyAgICB7IiAgQiB0byBzZW5kIGEgbmV0d29yayBCUkVBSyIsICAgICAgICAgICAgQ1hNX05FVH0sCisgICAgeyIgIEIgdG8gc2VuZCBhIFRlbG5ldCBCUkVBSyIsICAgICAgICAgICAgIENYTV9URUx9LAorI2VuZGlmIC8qIE5FVENPTk4gKi8KKyNpZmRlZiBDS19MQlJLCisgICAgeyIgIEwgdG8gc2VuZCBhIExvbmcgQlJFQUsgKDEuNXNlYykiLCAgICAgIENYTV9TRVJ9LAorI2VuZGlmIC8qIENLX0xCUksgKi8KKyNpZmRlZiBORVRDT05OCisgICAgeyIgIEkgdG8gc2VuZCBhIG5ldHdvcmsgaW50ZXJydXB0IHBhY2tldCIsIENYTV9ORVR9LAorICAgIHsiICBJIHRvIHNlbmQgYSBUZWxuZXQgSW50ZXJydXB0IHJlcXVlc3QiLCBDWE1fVEVMfSwKKyNpZmRlZiBUTkNPREUKKyAgICB7IiAgQSB0byBzZW5kIFRlbG5ldCBBcmUtWW91LVRoZXJlPyIsICAgICAgQ1hNX1RFTH0sCisjZW5kaWYgLyogVE5DT0RFICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworICAgIHsiICBVIHRvIGhhbmd1cCBhbmQgY2xvc2UgdGhlIGNvbm5lY3Rpb24iLCAwfSwKKyAgICB7IiAgUSB0byBoYW5ndXAgYW5kIHF1aXQgS2VybWl0IiwgICAgICAgICAgMH0sCisgICAgeyIgIFMgZm9yIHN0YXR1cyIsICAgICAgICAgICAgICAgICAgICAgICAgIDB9LAorI2lmZGVmIE5PUFVTSAorICAgIHsiICAhIHRvIHB1c2ggdG8gbG9jYWwgc2hlbGwgKGRpc2FibGVkKSIsICAwfSwKKyAgICB7IiAgWiB0byBzdXNwZW5kIChkaXNhYmxlZCkiLCAgICAgICAgICAgICAgMH0sCisjZWxzZQorICAgIHsiICAhIHRvIHB1c2ggdG8gbG9jYWwgc2hlbGwiLCAgICAgICAgICAgICAwfSwKKyNpZmRlZiBOT0pDCisgICAgeyIgIFogdG8gc3VzcGVuZCAoZGlzYWJsZWQpIiwgICAgICAgICAgICAgIDB9LAorI2Vsc2UKKyAgICB7IiAgWiB0byBzdXNwZW5kIiwgICAgICAgICAgICAgICAgICAgICAgICAgMH0sCisjZW5kaWYgLyogTk9KQyAqLworI2VuZGlmIC8qIE5PUFVTSCAqLworICAgIHsiICBcXCBiYWNrc2xhc2ggY29kZToiLCAgICAgICAgICAgICAgICAgICAwfSwKKyAgICB7IiAgICBcXG5ubiAgZGVjaW1hbCBjaGFyYWN0ZXIgY29kZSIsICAgICAgMH0sCisgICAgeyIgICAgXFxPbm5uIG9jdGFsIGNoYXJhY3RlciBjb2RlIiwgICAgICAgIDB9LAorICAgIHsiICAgIFxcWGhoICBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIgY29kZTsiLCAwfSwKKyAgICB7IiAgICB0ZXJtaW5hdGUgd2l0aCBDYXJyaWFnZSBSZXR1cm4uIiwgICAgMH0sCisgICAgeyIgIFR5cGUgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgYWdhaW4gdG8gc2VuZCB0aGUgZXNjYXBlIGNoYXJhY3RlciBpdHNlbGYsIiwKKyAgICAgICAwfSwKKyAgICB7IiAgb3IgcHJlc3MgdGhlIHNwYWNlLWJhciB0byByZXN1bWUgdGhlIENPTk5FQ1Qgc2Vzc2lvbi4iLCAwfSwKKyAgICB7TlVMTCwgMH0KK307CisKK2ludAoraGNvbm5lKCkgeworICAgIGludCBjLCBpLCBjeHR5cGU7CisgICAgaWYgKG5ldHdvcmspCisgICAgICBjeHR5cGUgPSBJU19URUxORVQoKSA/IENYTV9URUwgOiBDWE1fTkVUOworICAgIGVsc2UKKyAgICAgIGN4dHlwZSA9IENYTV9TRVI7CisKKyAgICBjb25vbCgiXHJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIik7CisgICAgY29ub2xsKCJQcmVzczoiKTsKKyAgICBjb25vbCgiICBDIHRvIHJldHVybiB0byAiKTsKKyAgICBjb25vbGwoKm15aG9zdCA/IG15aG9zdCA6ICJ0aGUgQy1LZXJtaXQgcHJvbXB0Iik7CisgICAgZm9yIChpID0gMDsgaGxwbXNnW2ldLmhtc2c7IGkrKykgeworCWlmICghKGhscG1zZ1tpXS5oZmxhZ3MpIHx8IChobHBtc2dbaV0uaGZsYWdzID09IGN4dHlwZSkpCisJICBjb25vbGwoaGxwbXNnW2ldLmhtc2cpOworICAgIH0KKyAgICBjb25vbCgiUHJlc3MgYSBrZXk+Iik7CQkvKiBQcm9tcHQgZm9yIGNvbW1hbmQuICovCisgICAgYyA9IENPTkdLUygpICYgMDE3NzsJCS8qIEdldCBjaGFyYWN0ZXIsIHN0cmlwIGFueSBwYXJpdHkuICovCisgICAgLyogTm8ga2V5IG1hcHBpbmcgb3IgdHJhbnNsYXRpb24gaGVyZSAqLworICAgIGlmIChjICE9IENNRFEpCisgICAgICBjb25vbGwoIiIpOworICAgIGNvbm9sbCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgIHJldHVybihjKTsJCQkJLyogUmV0dXJuIGl0LiAqLworfQorCisKKy8qICBEIE8gRSBTIEMgIC0tICBQcm9jZXNzIGFuIGVzY2FwZSBjaGFyYWN0ZXIgYXJndW1lbnQgICovCisKK1ZPSUQKKyNpZmRlZiBDS19BTlNJQworZG9lc2MoY2hhciBjKQorI2Vsc2UKK2RvZXNjKGMpIGNoYXIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogZG9lc2MgKi8geworICAgIENIQVIgZDsKKworICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgZG9lc2MiLCIiLGMpOworICAgIHdoaWxlICgxKSB7CisJaWYgKGMgPT0gZXNjYXBlKSB7CQkvKiBTZW5kIGVzY2FwZSBjaGFyYWN0ZXIgKi8KKwkgICAgZCA9IGRvcGFyKChDSEFSKSBjKTsgdHRvYygoY2hhcikgZCk7IHJldHVybjsKKyAgICAJfSBlbHNlCQkJCS8qIE9yIGVsc2UgbG9vayBpdCB1cCBiZWxvdy4gKi8KKwkgICAgaWYgKGlzdXBwZXIoYykpIGMgPSB0b2xvd2VyKGMpOworCisJc3dpdGNoKGMpIHsKKworCSAgY2FzZSAnYyc6CQkJLyogRXNjYXBlIGJhY2sgdG8gcHJvbXB0ICovCisJICBjYXNlICdcMDMnOgorCSAgICBjeF9zdGF0dXMgPSBDU1hfRVNDQVBFOworI2lmZGVmIE5PSUNQCisJICAgIGNvbm9sbCgiIik7CisJICAgIGNvbm9sbCgiIik7CisJICAgIGNvbm9sbCgKKyIgIFdBUk5JTkc6IFRoaXMgdmVyc2lvbiBvZiBDLUtlcm1pdCBoYXMgbm8gY29tbWFuZCBwcm9jZXNzb3IgdG8gZXNjYXBlIgorCQkgICApOworCSAgICBjb25vbGwoCisiICBiYWNrIHRvLiAgVG8gcmV0dXJuIHRvIHlvdXIgbG9jYWwgc3lzdGVtLCBsb2cgb3V0IGZyb20gdGhlIHJlbW90ZSBhbmQvb3IiCisJCSAgICk7CisJICAgIGNvbm9sbCgKKyIgIHVzZSB0aGUgZXNjYXBlIGNoYXJhY3RlciBmb2xsb3dlZCBieSB0aGUgbGV0dGVyIFUgdG8gY2xvc2UgKGhhbmcgVXApIHRoZSIKKwkJICAgKTsKKwkgICAgY29ub2xsKAorIiAgY29ubmVjdGlvbi4gIFJlc3VtaW5nIHlvdXIgc2Vzc2lvbi4uLiIKKwkJICAgKTsKKwkgICAgY29ub2xsKCIiKTsKKwkgICAgcmV0dXJuOworI2Vsc2UKKwkgICAgYWN0aXZlID0gMDsgY29ub2woIlxyXG4iKTsgcmV0dXJuOworI2VuZGlmIC8qIE5PSUNQICovCisKKwkgIGNhc2UgJ2InOgkJCS8qIFNlbmQgYSBCUkVBSyBzaWduYWwgKi8KKwkgIGNhc2UgJ1wwMic6CisjaWZkZWYgQ0tMRUFSTgorCSAgICBsZWFybmNoYXIoLTcpOworI2VuZGlmIC8qIENLTEVBUk4gKi8KKwkgICAgdHRzbmRiKCk7IHJldHVybjsKKworI2lmZGVmIE5FVENPTk4KKwkgIGNhc2UgJ2knOgkJCS8qIFNlbmQgSW50ZXJydXB0ICovCisJICBjYXNlICdcMDExJzoKKyNpZmRlZiBUQ1BTT0NLRVQKKwkgICAgaWYgKG5ldHdvcmsgJiYgSVNfVEVMTkVUKCkpIHsgLyogVEVMTkVUICovCisJCXRlbXBbMF0gPSAoQ0hBUikgSUFDOwkvKiBJIEFtIGEgQ29tbWFuZCAqLworCQl0ZW1wWzFdID0gKENIQVIpIFROX0lQOwkvKiBJbnRlcnJ1cHQgUHJvY2VzcyAqLworCQl0ZW1wWzJdID0gTlVMOworCQl0dG9sKChDSEFSICopdGVtcCwyKTsKKwkgICAgfSBlbHNlCisjZW5kaWYgLyogVENQU09DS0VUICovCisJICAgICAgY29ub2MoQkVMKTsKKwkgICAgcmV0dXJuOworCisjaWZkZWYgVENQU09DS0VUCisJICBjYXNlICdhJzoJCQkvKiAiQXJlIFlvdSBUaGVyZT8iICovCisJICBjYXNlICdcMDEnOgorCSAgICBpZiAobmV0d29yayAmJiBJU19URUxORVQoKSkgeworCQl0ZW1wWzBdID0gKENIQVIpIElBQzsJLyogSSBBbSBhIENvbW1hbmQgKi8KKwkJdGVtcFsxXSA9IChDSEFSKSBUTl9BWVQ7IC8qIEFyZSBZb3UgVGhlcmU/ICovCisJCXRlbXBbMl0gPSBOVUw7CisJCXR0b2woKENIQVIgKil0ZW1wLDIpOworCSAgICB9IGVsc2UgY29ub2MoQkVMKTsKKwkgICAgcmV0dXJuOworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmZGVmIENLX0xCUksKKwkgIGNhc2UgJ2wnOgkJCS8qIFNlbmQgYSBMb25nIEJSRUFLIHNpZ25hbCAqLworI2lmZGVmIENLTEVBUk4KKwkgICAgbGVhcm5jaGFyKC04KTsKKyNlbmRpZiAvKiBDS0xFQVJOICovCisJICAgIHR0c25kbGIoKTsgcmV0dXJuOworI2VuZGlmIC8qIENLX0xCUksgKi8KKworCSAgY2FzZSAndSc6CQkJLyogSGFuZ3VwICovCisgICAgICAgLyogY2FzZSAnXDAxMCc6ICovCQkvKiBObywgdG9vIGRhbmdlcm91cyAqLworCSAgICBjeF9zdGF0dXMgPSBDU1hfVVNFUkRJU0M7CisJICAgIGRvaGFuZ3VwID0gMjsgYWN0aXZlID0gMDsgY29ub2woIlxyXG5IYW5naW5nIHVwICIpOyByZXR1cm47CisKKwkgIGNhc2UgJ3EnOgkJCS8qIFF1aXQgKi8KKwkgICAgY3hfc3RhdHVzID0gQ1NYX1VTRVJESVNDOworCSAgICBkb2hhbmd1cCA9IDI7IHF1aXRub3cgPSAxOyBhY3RpdmUgPSAwOyBjb25vbCgiXHJcbiIpOyByZXR1cm47CisKKwkgIGNhc2UgJ3MnOgkJCS8qIFN0YXR1cyAqLworCSAgICBjb25vbGwoIiIpOworCSAgICBjb25vbGwoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyNpZmRlZiBQVFlPUlBJUEUKKwkgICAgaWYgKHR0cGlwZSkKKwkgICAgICBja21ha21zZyh0ZW1wLFRNUExFTiwiIFBpcGU6IFwiIix0dG5hbWUsIlwiIixOVUxMKTsKKwkgICAgZWxzZSBpZiAodHRwdHkpCisJICAgICAgY2ttYWttc2codGVtcCxUTVBMRU4sIiBQdHk6IFwiIix0dG5hbWUsIlwiIixOVUxMKTsKKwkgICAgZWxzZQorI2VuZGlmIC8qIFBUWU9SUElQRSAqLworCSAgICAgIGNrbWFrbXNnKHRlbXAsCisJCSAgICAgICBUTVBMRU4sCisJCSAgICAgICAiICIsCisJCSAgICAgICAobmV0d29yayA/ICJIb3N0IiA6ICJEZXZpY2UiKSwKKwkJICAgICAgICI6ICIsCisJCSAgICAgICB0dG5hbWUKKwkJICAgICAgICk7CisJICAgIGNvbm9sbCh0ZW1wKTsKKworCSAgICAvKiBUaGUgZm9sbG93aW5nIHNwcmludGYncyBhcmUgc2FmZSwgdGVtcFtdIHNpemUgaXMgYXQgbGVhc3QgMjAwICovCisKKwkgICAgaWYgKCFuZXR3b3JrICYmIHNwZWVkID49IDBMKSB7CisJCXNwcmludGYodGVtcCwiU3BlZWQgJWxkIiwgc3BlZWQpOworCQljb25vbGwodGVtcCk7CisJICAgIH0KKwkgICAgc3ByaW50Zih0ZW1wLCIgVGVybWluYWwgZWNobzogJXMiLCBkdXBsZXggPyAibG9jYWwiIDogInJlbW90ZSIpOworCSAgICBjb25vbGwodGVtcCk7CisJICAgIHNwcmludGYodGVtcCwiIFRlcm1pbmFsIGJ5dGVzaXplOiAlZCIsIChjbWFzayA9PSAwMTc3KSA/IDcgOiA4KTsKKwkgICAgY29ub2xsKHRlbXApOworCSAgICBzcHJpbnRmKHRlbXAsIiBDb21tYW5kIGJ5dGVzaXplOiAlZCIsIChjbWRtc2sgPT0gMDE3NykgPyA3IDogOCk7CisJICAgIGNvbm9sbCh0ZW1wKTsKKyAgICAgICAgICAgIGlmIChod3Bhcml0eSkKKyAgICAgICAgICAgICAgc3ByaW50Zih0ZW1wLCIgUGFyaXR5W2hhcmR3YXJlXTogJXMiLHBhcm5hbShod3Bhcml0eSkpOworICAgICAgICAgICAgZWxzZQkgICAgCisgICAgICAgICAgICAgIHNwcmludGYodGVtcCwiIFBhcml0eTogJXMiLCBwYXJuYW0ocGFyaXR5KSk7CisJICAgIGNvbm9sbCh0ZW1wKTsKKyNpZm5kZWYgTk9YRkVSCisJICAgIHNwcmludGYodGVtcCwiIEF1dG9kb3dubG9hZDogJXMiLCBhdXRvZGwgPyAib24iIDogIm9mZiIpOworCSAgICBjb25vbGwodGVtcCk7CisjZW5kaWYgLyogTk9YRkVSICovCisJICAgIGNrbWFrbXNnKHRlbXAsCQkvKiAod291bGQgbm90IGJlIHNhZmUgZm9yIHNwcmludGYpICovCisJCSAgICAgVE1QTEVOLAorCQkgICAgICIgU2Vzc2lvbiBsb2c6ICIsCisJCSAgICAgKnNlc2ZpbCA/IHNlc2ZpbCA6ICIobm9uZSkiLAorCQkgICAgIE5VTEwsCisJCSAgICAgTlVMTAorCQkgICAgICk7CisJICAgIGNvbm9sbCh0ZW1wKTsKKyNpZm5kZWYgTk9TSE9XCisJICAgIGlmICghbmV0d29yaykgc2hvbWRtKCk7CisjZW5kaWYgLyogTk9TSE9XICovCisjaWZkZWYgQ0tMT0dESUFMCisJICAgIHsKKwkJbG9uZyB6OworCQl6ID0gZG9sb2dzaG93KDApOworCQlpZiAoeiA+IC0xTCkgeworCQkgICAgc3ByaW50Zih0ZW1wLCIgRWxhcHNlZCB0aW1lOiAlcyIsaGhtbXNzKHopKTsKKwkJICAgIGNvbm9sbCh0ZW1wKTsKKwkJfQorCSAgICB9CisjZW5kaWYgLyogQ0tMT0dESUFMICovCisJICAgIGNvbm9sbCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCSAgICByZXR1cm47CisKKwkgIGNhc2UgJ2gnOgkJCS8qIEhlbHAgKi8KKwkgIGNhc2UgJz8nOgkJCS8qIEhlbHAgKi8KKwkgICAgYyA9IGhjb25uZSgpOyBjb250aW51ZTsKKworCSAgY2FzZSAnMCc6CQkJLyogU2VuZCBhIG51bGwgKi8KKwkgICAgYyA9ICdcMCc7IGQgPSBkb3BhcigoQ0hBUikgYyk7IHR0b2MoKGNoYXIpIGQpOyByZXR1cm47CisKKwkgIGNhc2UgJ3onOiBjYXNlICdcMDMyJzoJLyogU3VzcGVuZCAqLworI2lmbmRlZiBOT1BVU0gKKwkgICAgaWYgKCFub3B1c2gpCisJICAgICAgc3RwdHJhcCgwKTsKKwkgICAgZWxzZQorCSAgICAgIGNvbm9jKEJFTCk7CisjZWxzZQorCSAgICBjb25vYyhCRUwpOworI2VuZGlmIC8qIE5PUFVTSCAqLworCSAgICByZXR1cm47CisKKwkgIGNhc2UgJ0AnOgkJCS8qIFN0YXJ0IGluZmVyaW9yIGNvbW1hbmQgcHJvY2Vzc29yICovCisJICBjYXNlICchJzoKKyNpZm5kZWYgTk9QVVNICisJICAgIGlmICghbm9wdXNoKSB7CisJCWNvbnJlcygpOwkJICAgICAgLyogUHV0IGNvbnNvbGUgYmFjayB0byBub3JtYWwgKi8KKwkJenNoY21kKCIiKTsJCSAgICAgIC8qIEZvcmsgYSBzaGVsbC4gKi8KKwkJaWYgKGNvbmJpbigoY2hhcillc2NhcGUpIDwgMCkgeworCQkgICAgY3hfc3RhdHVzID0gQ1NYX0lOVEVSTkFMOworCQkgICAgcHJpbnRmKCJFcnJvciByZXN1bWluZyBDT05ORUNUIHNlc3Npb25cbiIpOworCQkgICAgYWN0aXZlID0gMDsKKwkJfQorCSAgICB9IGVsc2UgY29ub2MoQkVMKTsKKyNlbHNlCisJICAgIGNvbm9jKEJFTCk7CisjZW5kaWYgLyogTk9QVVNIICovCisJICAgIHJldHVybjsKKworCSAgY2FzZSBTUDoJCQkvKiBTcGFjZSwgaWdub3JlICovCisJICAgIHJldHVybjsKKworCSAgZGVmYXVsdDoJCQkvKiBPdGhlciAqLworCSAgICBpZiAoYyA9PSBDTURRKSB7CQkvKiBCYWNrc2xhc2ggZXNjYXBlICovCisJCWludCB4OworCQllY2JwID0gZWNidWY7CisJCSplY2JwKysgPSBjOworCQl3aGlsZSAoKChjID0gKENPTkdLUygpICYgY21kbXNrKSkgIT0gJ1xyJykgJiYgKGMgIT0gJ1xuJykpCisJCSAgKmVjYnArKyA9IGM7CisJCSplY2JwID0gTlVMOyBlY2JwID0gZWNidWY7CisJCXggPSB4eGVzYygmZWNicCk7CS8qIEludGVycHJldCBpdCAqLworCQlpZiAoeCA+PSAwKSB7CQkvKiBObyBrZXkgbWFwcGluZyBoZXJlICovCisJCSAgICBjID0gZG9wYXIoKENIQVIpIHgpOworCQkgICAgdHRvYygoY2hhcikgYyk7CisJCSAgICByZXR1cm47CisJCX0gZWxzZSB7CQkvKiBJbnZhbGlkIGJhY2tzbGFzaCBjb2RlLiAqLworCQkgICAgY29ub2MoQkVMKTsKKwkJICAgIHJldHVybjsKKwkJfQorCSAgICB9CisJICAgIGNvbm9jKEJFTCk7IHJldHVybjsgCS8qIEludmFsaWQgZXNjIGFyZywgYmVlcCAqLworICAgIAl9CisgICAgfQorfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja3Vjb24uYyBiL2NrZXJtaXQtOC4wLjIxMS9ja3Vjb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDg2NmZlCi0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrdWNvbi5jCkBAIC0wLDAgKzEsMjY3OSBAQAorI2luY2x1ZGUgImNrY3N5bS5oIgorCitjaGFyICpjb25udiA9ICJDT05ORUNUIENvbW1hbmQgZm9yIFVOSVg6Zm9yaygpLCA4LjAuMTE0LCAyOSBOb3YgMjAwMiI7CisKKy8qICBDIEsgVSBDIE8gTiAgLS0gIFRlcm1pbmFsIGNvbm5lY3Rpb24gdG8gcmVtb3RlIHN5c3RlbSwgZm9yIFVOSVggICovCisvKgorICBBdXRob3I6IEZyYW5rIGRhIENydXogPGZkY0Bjb2x1bWJpYS5lZHU+LAorICBDb2x1bWJpYSBVbml2ZXJzaXR5IEFjYWRlbWljIEluZm9ybWF0aW9uIFN5c3RlbXMsIE5ldyBZb3JrIENpdHkuCisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKworICBOT1RFOiBUaGlzIG1vZHVsZSBoYXMgYmVlbiBzdXBlcnNlZGVkIG9uIG1vc3QgcGxhdGZvcm1zIGJ5IGNrdWNucy5jLCB3aGljaAorICB1c2VzIHNlbGVjdCgpIHJhdGhlciB0aGFuIGZvcmsoKSBmb3IgbXVsdGlwbGV4aW5nIGl0cyBpL28uICBUaGlzIG1vZHVsZQorICBpcyBzdGlsbCBuZWVkZWQgZm9yIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHNlbGVjdCgpLCBhbmQgYWxzbyBmb3IKKyAgaXRzIFguMjUgc3VwcG9ydC4gIEFsdGhvdWdoIHRoZSB0d28gbW9kdWxlcyBzaGFyZSBsYXJnZSBhbW91bnRzIG9mIGNvZGUsCisgIHRoZWlyIHN0cnVjdHVyZSBpcyByYWRpY2FsbHkgZGlmZmVyZW50IGFuZCB0aGVyZWZvcmUgYXR0ZW1wdHMgYXQgbWVyZ2luZworICB0aGVtIGhhdmUgc28gZmFyIGJlZW4gdW5zdWNjZXNzZnVsLiAgKE5vdmVtYmVyIDE5OTguKQorCisgIFNwZWNpYWwgdGhhbmtzIHRvIEVkdWFyZCBWb3BpY2thLCBQcmFndWUgVW5pdmVyc2l0eSBvZiBFY29ub21pY3MsCisgIEN6ZWNoIFJlcHVibGljLCBmb3IgdmFsdWFibGUgY29udHJpYnV0aW9ucyB0byB0aGlzIG1vZHVsZSBpbiBKdWx5IDE5OTQsCisgIGFuZCB0byBOZWFsIFAuIE11cnBoeSBvZiB0aGUgTW90b3JvbGEgQ2VsbHVsYXIgSW5mcmFzdHJ1Y3R1cmUgR3JvdXAgaW4gMTk5NgorICBmb3IgcmVhcnJhbmdpbmcgdGhlIGNvZGUgdG8gYWxsb3cgb3BlcmF0aW9uIG9uIHRoZSBCZUJveCwgeWV0IHN0aWxsIHdvcmsKKyAgaW4gcmVndWxhciBVTklYLgorKi8KKyNpbmNsdWRlICJja2NkZWIuaCIJCQkvKiBDb21tb24gdGhpbmdzIGZpcnN0ICovCisKKyNpZm5kZWYgTk9MT0NBTAorCisjaWZkZWYgQkVPU09SQkVCT1gKK3N0YXRpYyBkb3VibGUgdGltZV9zdGFydGVkID0gMC4wOworI2luY2x1ZGUgPGtlcm5lbC9PUy5oPgorX1BST1RPVFlQKCBzdGF0aWMgbG9uZyBjb25jbGQsICh2b2lkICopICk7CisjZWxzZQorX1BST1RPVFlQKCBzdGF0aWMgVk9JRCBjb25jbGQsICh2b2lkKSApOworI2VuZGlmIC8qIEJFT1NPUkJFQk9YICovCisKKyNpZmRlZiBORVhUCisjdW5kZWYgTlNJRworI2luY2x1ZGUgPHN5cy93YWl0Lmg+CQkJLyogRm9yIHdhaXQoKSAqLworI2VuZGlmIC8qIE5FWFQgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgkJCS8qIFNpZ25hbHMgKi8KKyNpbmNsdWRlIDxlcnJuby5oPgkJCS8qIEVycm9yIG51bWJlcnMgKi8KKworI2lmZGVmIFpJTE9HCQkJCS8qIExvbmdqdW1wcyAqLworI2luY2x1ZGUgPHNldHJldC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNlbmRpZiAvKiBaSUxPRyAqLworI2luY2x1ZGUgImNrY3NpZy5oIgorCisvKiBLZXJtaXQtc3BlY2lmaWMgaW5jbHVkZXMgKi8KKworI2luY2x1ZGUgImNrY2FzYy5oIgkJCS8qIEFTQ0lJIGNoYXJhY3RlcnMgKi8KKyNpbmNsdWRlICJja2NrZXIuaCIJCQkvKiBLZXJtaXQgdGhpbmdzICovCisjaW5jbHVkZSAiY2t1Y21kLmgiCQkJLyogRm9yIHh4ZXNjKCkgcHJvdG90eXBlICovCisjaW5jbHVkZSAiY2tjbmV0LmgiCQkJLyogTmV0d29yayBzeW1ib2xzICovCisjaWZuZGVmIE5PQ1NFVFMKKyNpbmNsdWRlICJja2N4bGEuaCIJCQkvKiBDaGFyYWN0ZXIgc2V0IHRyYW5zbGF0aW9uICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCisvKiBJbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisKK19QUk9UT1RZUCggVk9JRCB0dGZsdXgsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIGRvZXNjLCAoY2hhcikgKTsKK19QUk9UT1RZUCggVk9JRCBsb2djaGFyLCAoY2hhcikgKTsKK19QUk9UT1RZUCggaW50IGhjb25uZSwgKHZvaWQpICk7CisjaWZuZGVmIE5PU0hPVworX1BST1RPVFlQKCBWT0lEIHNob21kbSwgKHZvaWQpICk7CisjZW5kaWYgLyogTk9TSE9XICovCitfUFJPVE9UWVAoIHN0YXRpYyBpbnQga2JnZXQsICh2b2lkKSApOworX1BST1RPVFlQKCBzdGF0aWMgaW50IHBpcGVtc2csIChpbnQpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBpbnQgY2tjcHV0ZiwgKHZvaWQpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBWT0lEIGNrX3NuZG1zZywgKHZvaWQpICk7CisvKgorICBGb3IgaW50ZXItZm9yayBzaWduYWxpbmcuICBOb3JtYWxseSB3ZSB1c2UgU0lHVVNSMSwgZXhjZXB0IG9uIFNDTywgd2hlcmUKKyAgd2UgdXNlIFNJR1VTUjIgYmVjYXVzZSBTSUdVU1IxIGlzIHVzZWQgYnkgdGhlIHN5c3RlbS4gIFlvdSBjYW4gZGVmaW5lCisgIENLX0ZPUktfU0lHIHRvIGJlIHdoYXRldmVyIG90aGVyIHNpZ25hbCB5b3UgbWlnaHQgd2FudCB0byB1c2UgYXQgY29tcGlsZQorICB0aW1lLiAgV2UgZG9uJ3QgdXNlIFNJR1VTUjIgZXZlcnl3aGVyZSBiZWNhdXNlIGluIHNvbWUgc3lzdGVtcywgbGlrZQorICBVbml4V2FyZSwgdGhlIGRlZmF1bHQgYWN0aW9uIGZvciBTSUdVU1IyIGlzIHRvIGtpbGwgdGhlIHByb2Nlc3MgdGhhdCBnZXRzIGl0LgorKi8KKyNpZm5kZWYgQ0tfRk9SS19TSUcKKworI2lmbmRlZiBTSUdVU1IxCQkJCS8qIFVzZXItZGVmaW5lZCBzaWduYWxzICovCisjZGVmaW5lIFNJR1VTUjEgMzAKKyNlbmRpZiAvKiBTSUdVU1IxICovCisKKyNpZm5kZWYgU0lHVVNSMgorI2RlZmluZSBTSUdVU1IyIDMxCisjZW5kaWYgLyogU0lHVVNSMiAqLworCisjaWZkZWYgTV9VTklYCisjZGVmaW5lIENLX0ZPUktfU0lHIFNJR1VTUjIJCS8qIFNDTyAtIHVzZSBTSUdVU1IyICovCisjZWxzZQorI2RlZmluZSBDS19GT1JLX1NJRyBTSUdVU1IxCQkvKiBPdGhlcnMgLSB1c2UgU0lHVVNSMSAqLworI2VuZGlmIC8qIE1fVU5JWCAqLworCisjZW5kaWYgLyogQ0tfRk9SS19TSUcgKi8KKworLyogRXh0ZXJuYWwgdmFyaWFibGVzICovCisKK2V4dGVybiBzdHJ1Y3QgY2tfcCBwdGFiW107CisKK2V4dGVybiBpbnQgbG9jYWwsIGVzY2FwZSwgZHVwbGV4LCBwYXJpdHksIGZsb3csIHNlc2xvZywgc2Vzc2Z0LCBkZWJzZXMsCisgbWRtdHlwLCB0dG5wcm90bywgY21hc2ssIGNtZG1zaywgbmV0d29yaywgbmV0dHlwZSwgZGVibG9nLCBzb3NpLCB0bmxtLAorIHhpdHN0YSwgd2hhdCwgdHR5ZmQsIHR0cGlwZSwgcXVpZXQsIGJhY2tncmQsIHBmbGFnLCB0dF9jcmQsIHRuX25sbSwgdHRmZGZsZywKKyB0dF9lc2NhcGUsIGp1c3RvbmUsIGNhcnJpZXIsIGh3cGFyaXR5OworCitleHRlcm4gbG9uZyBzcGVlZDsKK2V4dGVybiBjaGFyIHR0bmFtZVtdLCBzZXNmaWxbXSwgbXlob3N0W10sICpjY250YWJbXTsKKyNpZmRlZiBUTkNPREUKK2V4dGVybiBpbnQgdG5fYl9ubG0sIHRuX3JlbV9lY2hvOworI2VuZGlmIC8qIFROQ09ERSAqLworCisjaWZkZWYgQ0tfVFJJR0dFUgorZXh0ZXJuIGNoYXIgKiB0dF90cmlnZ2VyW10sICogdHJpZ2dlcnZhbDsKKyNlbmRpZiAvKiBDS19UUklHR0VSICovCisKK2V4dGVybiBpbnQgbm9wdXNoOworCisjaWZkZWYgQ0tfQVBDCitleHRlcm4gaW50IGFwY2FjdGl2ZTsJCQkvKiBBcHBsaWNhdGlvbiBQcm9ncmFtIENvbW1hbmQgKEFQQykgKi8KK2V4dGVybiBpbnQgYXBjc3RhdHVzOwkJCS8qIGl0ZW1zIC4uLiAqLworc3RhdGljIGludCBhcGNsZW5ndGggPSAwOworI2lmZGVmIERDTURCVUYKK2V4dGVybiBjaGFyICphcGNidWY7CisjZWxzZQorZXh0ZXJuIGNoYXIgYXBjYnVmW107CisjZW5kaWYgLyogRENNREJVRiAqLworc3RhdGljIGludCBhcGNidWZsZW4gPSBBUENCVUZMRU4gLSAyOworZXh0ZXJuIGludCBwcm90b2NvbDsJCQkvKiBBdXRvIGRvd25sb2FkICovCisjZW5kaWYgLyogQ0tfQVBDICovCisKK2V4dGVybiBpbnQgYXV0b2RsOworI2lmZGVmIENLX0FVVE9ETAorZXh0ZXJuIENIQVIga3NidWZbXTsKKyNlbmRpZiAvKiBDS19BVVRPREwgKi8KKworI2lmZGVmIENLX1hZWgorI2lmZGVmIFhZWl9JTlRFUk5BTAorc3RhdGljIGludCB6bWRsb2sgPSAxOwkJCS8qIFptb2RlbSBhdXRvZG93bmxvYWRzIGF2YWlsYWJsZSAqLworI2Vsc2UKK3N0YXRpYyBpbnQgem1kbG9rID0gMDsJCQkvKiBEZXBlbmRzIG9uIGV4dGVybmFsIHByb3RvY29sIGRlZiAqLworI2VuZGlmIC8qIFhZWl9JTlRFUk5BTCAqLworI2Vsc2UKK3N0YXRpYyBpbnQgem1kbG9rID0gMDsJCQkvKiBOb3QgYXZhaWxhYmxlIGF0IGFsbCAqLworI2VuZGlmIC8qIENLX1hZWiAqLworCisjaWZuZGVmIE5PU0VUS0VZCQkJLyogS2V5Ym9hcmQgbWFwcGluZyAqLworZXh0ZXJuIEtFWSAqa2V5bWFwOwkJCS8qIFNpbmdsZS1jaGFyYWN0ZXIga2V5IG1hcCAqLworZXh0ZXJuIE1BQ1JPICptYWNyb3RhYjsJCQkvKiBLZXkgbWFjcm8gcG9pbnRlciB0YWJsZSAqLworc3RhdGljIE1BQ1JPIGttcHRyID0gTlVMTDsJCS8qIFBvaW50ZXIgdG8gY3VycmVudCBrZXkgbWFjcm8gKi8KKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworCisvKiBHbG9iYWwgdmFyaWFibGVzIGxvY2FsIHRvIHRoaXMgbW9kdWxlICovCisKK3N0YXRpYyBpbnQKKyAgcXVpdG5vdyA9IDAsCQkJCS8qIDxlc2MtY2hhcj5RIHdhcyB0eXBlZCAqLworICBqYnNldCA9IDAsCQkJCS8qIEZsYWcgd2hldGhlciBqbXAgYnVmIGlzIHNldC4gKi8KKyAgZG9oYW5ndXAgPSAwLAkJCQkvKiA8ZXNjLWNoYXI+SCB3YXMgdHlwZWQgKi8KKyAgc2p2YWwsCQkJCS8qIFNldGp1bXAgcmV0dXJuIHZhbHVlICovCisgIGdvdGVyciA9IDAsCQkJCS8qIEZvcmsvcGlwZSBjcmVhdGlvbiBlcnJvciBmbGFnICovCisgIGluc2hpZnQgPSAwLAkJCQkvKiBTTy9TSSBzaGlmdCBzdGF0ZXMgKi8KKyAgb3V0c2hpZnQgPSAwOworCitpbnQgYWN0aXZlID0gMDsJCQkJLyogTG93ZXIgZm9yayBhY3RpdmUgZmxhZyAqLworCitzdGF0aWMgUElEX1QgcGFyZW50X2lkID0gKFBJRF9UKTA7CS8qIFByb2Nlc3MgSUQgb2Yga2V5Ym9hcmQgZm9yayAqLworCitzdGF0aWMgY2hhciBlY2J1ZlsxMF0sICplY2JwOwkJLyogRXNjYXBlIGNoYXIgYnVmZmVyICYgcG9pbnRlciAqLworCisjaWZkZWYgQ0tfU01BTEwKKyNkZWZpbmUgSUJVRkwgMTUzNgkJCS8qIElucHV0IGJ1ZmZlciBsZW5ndGggKi8KKyNlbHNlCisjZGVmaW5lIElCVUZMIDQwOTYKKyNlbmRpZiAvKiBDS19TTUFMTCAqLworCitzdGF0aWMgaW50IG9iYyA9IDA7CQkJLyogT3V0cHV0IGJ1ZmZlciBjb3VudCAqLworCisjaWZuZGVmIE9YT1MKKyNkZWZpbmUgT0JVRkwgMTAyNAkJCS8qIE91dHB1dCBidWZmZXIgbGVuZ3RoICovCisjZWxzZQorI2RlZmluZSBPQlVGTCBJQlVGTAorI2VuZGlmIC8qIE9YT1MgKi8KKworI2lmZGVmIEJJR0JVRk9LCisjZGVmaW5lIFRNUExFTiA0MDk2CQkJLyogVGVtcG9yYXJ5IG1lc3NhZ2UgYnVmZmVyIGxlbmd0aCAqLworI2Vsc2UKKyNkZWZpbmUgVE1QTEVOIDIwMAorI2VuZGlmIC8qIEJJR0JVRk9LICovCisKKyNpZmRlZiBEWU5BTUlDCitzdGF0aWMgY2hhciAqaWJ1ZiA9IE5VTEwsICpvYnVmID0gTlVMTCwgKnRlbXAgPSBOVUxMOyAvKiBCdWZmZXJzICovCisjZWxzZQorc3RhdGljIGNoYXIgaWJ1ZltJQlVGTF0sIG9idWZbT0JVRkxdLCB0ZW1wW1RNUExFTl07CisjZW5kaWYgLyogRFlOQU1JQyAqLworCisjaWZkZWYgRFlOQU1JQworc3RhdGljIGNoYXIgKmlicDsJCQkvKiBJbnB1dCBidWZmZXIgcG9pbnRlciAqLworI2Vsc2UKK3N0YXRpYyBjaGFyICppYnAgPSBpYnVmOwkJLyogSW5wdXQgYnVmZmVyIHBvaW50ZXIgKi8KKyNlbmRpZiAvKkRZTkFNSUMgKi8KK3N0YXRpYyBpbnQgaWJjID0gMDsJCQkvKiBJbnB1dCBidWZmZXIgY291bnQgKi8KKworI2lmZGVmIERZTkFNSUMKK3N0YXRpYyBjaGFyICpvYnA7CQkJLyogT3V0cHV0IGJ1ZmZlciBwb2ludGVyICovCisjZWxzZQorc3RhdGljIGNoYXIgKm9icCA9IG9idWY7CQkvKiBPdXRwdXQgYnVmZmVyIHBvaW50ZXIgKi8KKyNlbmRpZiAvKiBEWU5BTUlDICovCisKKy8qIFguMjUgaXRlbXMgKi8KKworI2lmZGVmIEFOWVgyNQorc3RhdGljIGNoYXIgKnA7CQkJCS8qIEdlbmVyYWwgcHVycG9zZSBwb2ludGVyICovCitjaGFyIHgyNWlidWZbTUFYSVgyNV07CQkJLyogSW5wdXQgYnVmZmVyICovCitjaGFyIHgyNW9idWZbTUFYT1gyNV07CQkJLyogT3V0cHV0IGJ1ZmZlciAqLworaW50IGlidWZsOwkJCQkvKiBMZW5ndGggb2YgaW5wdXQgYnVmZmVyICovCitpbnQgb2J1Zmw7CQkJCS8qIExlbmd0aCBvZiBvdXRwdXQgYnVmZmVyICovCit1bnNpZ25lZCBjaGFyIHRvc2VuZCA9IDA7CitpbnQgbGlua2lkLCBsY247CitzdGF0aWMgaW50IGRveDI1Y2xyID0gMDsKKyNpZm5kZWYgSUJNWDI1CitleHRlcm4gQ0hBUiBwYWRwYXJtc1tdOworI2VuZGlmIC8qIElCTVgyNSAqLworI2VuZGlmIC8qIEFOWVgyNSAqLworCitzdGF0aWMgaW50IHhwaXBlWzJdID0gey0xLCAtMX07CS8qIFBpcGUgZGVzY3JpcHRvciBmb3IgY2hpbGQtcGFyZW50IG1lc3NhZ2VzICovCitzdGF0aWMgUElEX1QgcGlkID0gKFBJRF9UKSAwOwkvKiBQcm9jZXNzIElEIG9mIGNoaWxkICovCisKKy8qIENoYXJhY3Rlci1zZXQgaXRlbXMgKi8KKworc3RhdGljIGludCB1bmljb2RlID0gMDsKKworc3RhdGljIGludAorICBlc2NzZXEgPSAwLAkJCQkvKiAxID0gUmVjb2duaXplciBpcyBhY3RpdmUgKi8KKyAgaW5lc2MgPSAwLAkJCQkvKiBTdGF0ZSBvZiBzZXF1ZW5jZSByZWNvZ25pemVyICovCisgIG9sZGVzYyA9IC0xOwkJCQkvKiBQcmV2aW91cyBzdGF0ZSBvZiByZWNvZ25pemVyICovCisKKyNkZWZpbmUgT1VUWEJVRlNJWiAxNQorc3RhdGljIENIQVIgaW54YnVmW09VVFhCVUZTSVorMV07CS8qIEhvc3QtdG8tc2NyZWVuIGV4cGFuc2lvbiBidWZmZXIgKi8KK3N0YXRpYyBpbnQgaW54Y291bnQgPSAwOwkJLyogYW5kIGNvdW50ICovCitzdGF0aWMgQ0hBUiBvdXR4YnVmW09VVFhCVUZTSVorMV07CS8qIEtleWJvYXJkLXRvLWhvc3QgZXhwYW5zaW9uIGJ1ZiAqLworc3RhdGljIGludCBvdXR4Y291bnQgPSAwOwkJLyogYW5kIGNvdW50ICovCisKKyNpZm5kZWYgTk9DU0VUUworI2lmZGVmIENLX0FOU0lDIC8qIEFOU0kgQyBwcm90b3R5cGVzLi4uICovCitleHRlcm4gQ0hBUiAoKnhsc1tNQVhUQ1NFVFMrMV1bTUFYRkNTRVRTKzFdKShDSEFSKTsgLyogQ2hhcmFjdGVyIHNldCAqLworZXh0ZXJuIENIQVIgKCp4bHJbTUFYVENTRVRTKzFdW01BWEZDU0VUUysxXSkoQ0hBUik7IC8qIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyAqLworc3RhdGljIENIQVIgKCpzeG8pKENIQVIpOwkvKiBMb2NhbCB0cmFuc2xhdGlvbiBmdW5jdGlvbnMgKi8KK3N0YXRpYyBDSEFSICgqcnhvKShDSEFSKTsJLyogZm9yIG91dHB1dCAoc2VuZGluZykgdGVybWluYWwgY2hhcnMgKi8KK3N0YXRpYyBDSEFSICgqc3hpKShDSEFSKTsJLyogYW5kIGZvciBpbnB1dCAocmVjZWl2aW5nKSB0ZXJtaW5hbCBjaGFycy4gKi8KK3N0YXRpYyBDSEFSICgqcnhpKShDSEFSKTsKKyNlbHNlIC8qIE5vdCBBTlNJIEMuLi4gKi8KK2V4dGVybiBDSEFSICgqeGxzW01BWFRDU0VUUysxXVtNQVhGQ1NFVFMrMV0pKCk7CS8qIENoYXJhY3RlciBzZXQgKi8KK2V4dGVybiBDSEFSICgqeGxyW01BWFRDU0VUUysxXVtNQVhGQ1NFVFMrMV0pKCk7CS8qIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucy4gKi8KK3N0YXRpYyBDSEFSICgqc3hvKSgpOwkJLyogTG9jYWwgdHJhbnNsYXRpb24gZnVuY3Rpb25zICovCitzdGF0aWMgQ0hBUiAoKnJ4bykoKTsJCS8qIGZvciBvdXRwdXQgKHNlbmRpbmcpIHRlcm1pbmFsIGNoYXJzICovCitzdGF0aWMgQ0hBUiAoKnN4aSkoKTsJCS8qIGFuZCBmb3IgaW5wdXQgKHJlY2VpdmluZykgdGVybWluYWwgY2hhcnMuICovCitzdGF0aWMgQ0hBUiAoKnJ4aSkoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworZXh0ZXJuIGludCBsYW5ndWFnZTsJCS8qIEN1cnJlbnQgbGFuZ3VhZ2UuICovCitzdGF0aWMgaW50IGxhbmdzdjsJCS8qIEZvciByZW1lbWJlcmluZyBsYW5ndWFnZSBzZXR0aW5nLiAqLworZXh0ZXJuIHN0cnVjdCBjc2luZm8gZmNzaW5mb1tdOyAvKiBGaWxlIGNoYXJhY3RlciBzZXQgaW5mby4gKi8KK2V4dGVybiBpbnQgdGNzciwgdGNzbDsJCS8qIFRlcm1pbmFsIGNoYXJhY3RlciBzZXRzLCByZW1vdGUgJiBsb2NhbC4gKi8KK3N0YXRpYyBpbnQgdGNzOwkJCS8qIEludGVybWVkaWF0ZSAoInRyYW5zZmVyIikgY2hhcmFjdGVyIHNldC4gKi8KK3N0YXRpYyBpbnQgdGNzc2l6ZSA9IDA7CQkvKiBTaXplIG9mIHRjcyAqLworI2lmZGVmIFVOSUNPREUJCQkJLyogVVRGLTggc3VwcG9ydCAqLworI2lmZGVmIENLX0FOU0lDCitleHRlcm4gaW50ICgqeGxfdWZjW01BWEZDU0VUUysxXSkoVVNIT1JUKTsgIC8qIFVuaWNvZGUgdG8gRkNTICovCitleHRlcm4gVVNIT1JUICgqeGxfZmN1W01BWEZDU0VUUysxXSkoQ0hBUik7IC8qIEZDUyB0byBVbmljb2RlICovCitleHRlcm4gaW50ICgqeHVmKShVU0hPUlQpOwkJLyogVHJhbnNsYXRpb24gZnVuY3Rpb24gVUNTIHRvIEZDUyAqLworZXh0ZXJuIFVTSE9SVCAoKnhmdSkoQ0hBUik7CQkvKiBUcmFuc2xhdGlvbiBmdW5jdGlvbiBGQ1MgdG8gVUNTICovCisjZWxzZQorZXh0ZXJuIGludCAoKnhsX3VmY1tNQVhGQ1NFVFMrMV0pKCk7CitleHRlcm4gVVNIT1JUICgqeGxfZmN1W01BWEZDU0VUUysxXSkoKTsKK2V4dGVybiBpbnQgKCp4dWYpKCk7CitleHRlcm4gVVNIT1JUICgqeGZ1KSgpOworI2VuZGlmIC8qIENLX0FOU0lDICovCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworLyoKKyAgV2UgZG8gbm90IG5lZWQgdG8gcGFyc2UgYW5kIHJlY29nbml6ZSBlc2NhcGUgc2VxdWVuY2VzIGlmIHdlIGFyZSBiZWluZyBidWlsdAorICB3aXRob3V0IGNoYXJhY3Rlci1zZXQgc3VwcG9ydCBBTkQgd2l0aG91dCBBUEMgc3VwcG9ydC4KKyovCisjaWZkZWYgTk9DU0VUUwkJCQkvKiBObyBjaGFyYWN0ZXIgc2V0cyAqLworI2lmbmRlZiBDS19BUEMJCQkJLyogTm8gQVBDICovCisjaWZuZGVmIE5PRVNDU0VRCisjZGVmaW5lIE5PRVNDU0VRCQkJLyogU28gbm8gZXNjYXBlIHNlcXVlbmNlIHJlY29nbml6ZXIgKi8KKyNlbmRpZiAvKiBOT0VTQ1NFUSAqLworI2VuZGlmIC8qIENLX0FQQyAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworLyogQ2hpbGQgcHJvY2VzcyBldmVudHMgYW5kIG1lc3NhZ2VzICovCisKKyNkZWZpbmUgQ0VWX05PICAwCQkJLyogTm8gZXZlbnQgKi8KKyNkZWZpbmUgQ0VWX0hVUCAxCQkJLyogQ29tbXVuaWNhdGlvbnMgaGFuZ3VwICovCisjZGVmaW5lIENFVl9QQUQgMgkJCS8qIFguMjUgLSBjaGFuZ2UgUEFEIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgQ0VWX0RVUCAzCQkJLyogVG9nZ2xlIGR1cGxleCAqLworI2RlZmluZSBDRVZfQVBDIDQJCQkvKiBFeGVjdXRlIEFQQyAqLworI2lmZGVmIFROQ09ERQorI2RlZmluZSBDRVZfTUVCSU4gNQkJCS8qIENoYW5nZSBvZiBtZV9iaW5hcnkgKi8KKyNkZWZpbmUgQ0VWX1VCSU4gNgkJCS8qIENoYW5nZSBvZiB1X2JpbmFyeSAqLworI2VuZGlmIC8qIFROQ09ERSAqLworI2RlZmluZSBDRVZfQURMIDcJCQkvKiBBdXRvZG93bmxvYWQgKi8KKyNkZWZpbmUgQ0VWX0FVTCA4CQkJLyogQXV0b3VwbG9hZCAqLworI2RlZmluZSBDRVZfVFJJIDkJCQkvKiBUcmlnZ2VyIHN0cmluZyAqLworCisjaWZkZWYgTk9FU0NTRVEKKyNkZWZpbmUgY2hrYWVzKHgpIDAKKyNlbHNlCisvKgorICBBcyBvZiBlZGl0IDE3OCwgdGhlIENPTk5FQ1QgY29tbWFuZCBza2lwcyBwYXN0IEFOU0kgZXNjYXBlIHNlcXVlbmNlcyB0bworICBhdm9pZCB0cmFuc2xhdGluZyB0aGUgY2hhcmFjdGVycyB3aXRoaW4gdGhlbS4gIFRoaXMgYWxsb3dzIHRoZSBDT05ORUNUCisgIGNvbW1hbmQgdG8gd29yayBjb3JyZWN0bHkgd2l0aCBhIGhvc3QgdGhhdCB1c2VzIGEgNy1iaXQgSVNPIDY0NiBuYXRpb25hbAorICBjaGFyYWN0ZXIgc2V0LCBpbiB3aGljaCBjaGFyYWN0ZXJzIGxpa2UgJ1snIHdvdWxkIG5vcm1hbGx5IGJlIHRyYW5zbGF0ZWQKKyAgaW50byBhY2NlbnRlZCBjaGFyYWN0ZXJzLCBydWluaW5nIHRoZSB0ZXJtaW5hbCdzIGludGVycHJldGF0aW9uIChhbmQKKyAgZ2VuZXJhdGlvbikgb2YgZXNjYXBlIHNlcXVlbmNlcy4KKworICBBcyBvZiBlZGl0IDE5MCwgdGhlIENPTk5FQ1QgY29tbWFuZCByZXNwb25kcyB0byBBUEMgZXNjYXBlIHNlcXVlbmNlcworICAoRVNDIF8gdGV4dCBFU0MgXCkgaWYgdGhlIHVzZXIgU0VUcyBURVJNSU5BTCBBUEMgT04gb3IgVU5DSEVDS0VELCBhbmQgdGhlCisgIHByb2dyYW0gd2FzIGJ1aWx0IHdpdGggQ0tfQVBDIGRlZmluZWQuCisKKyAgTm9uLUFOU0kvSVNPLWNvbXBsaWFudCBlc2NhcGUgc2VxdWVuY2VzIGFyZSBub3QgaGFuZGxlZC4KKyovCisKKy8qIFN0YXRlcyBmb3IgdGhlIGVzY2FwZS1zZXF1ZW5jZSByZWNvZ25pemVyLiAqLworCisjZGVmaW5lIEVTX05PUk1BTCAwCQkJLyogTm9ybWFsLCBub3QgaW4gYW4gZXNjYXBlIHNlcXVlbmNlICovCisjZGVmaW5lIEVTX0dPVEVTQyAxCQkJLyogQ3VycmVudCBjaGFyYWN0ZXIgaXMgRVNDICovCisjZGVmaW5lIEVTX0VTQ1NFUSAyCQkJLyogSW5zaWRlIGFuIGVzY2FwZSBzZXF1ZW5jZSAqLworI2RlZmluZSBFU19HT1RDU0kgMwkJCS8qIEluc2lkZSBhIGNvbnRyb2wgc2VxdWVuY2UgKi8KKyNkZWZpbmUgRVNfU1RSSU5HIDQJCQkvKiBJbnNpZGUgRENTLE9TQyxQTSwgb3IgQVBDIHN0cmluZyAqLworI2RlZmluZSBFU19URVJNSU4gNQkJCS8qIDFzdCBjaGFyIG9mIHN0cmluZyB0ZXJtaW5hdG9yICovCisKKy8qCisgIEFOU0kgZXNjYXBlIHNlcXVlbmNlIGhhbmRsaW5nLiAgT25seSB0aGUgNy1iaXQgZm9ybSBpcyB0cmVhdGVkLCBiZWNhdXNlCisgIHRyYW5zbGF0aW9uIGlzIG5vdCBhIHByb2JsZW0gaW4gdGhlIDgtYml0IGVudmlyb25tZW50LCBpbiB3aGljaCBhbGwgR0wKKyAgY2hhcmFjdGVycyBhcmUgQVNDSUkgYW5kIG5vIHRyYW5zbGF0aW9uIHRha2VzIHBsYWNlLiAgU28gd2UgZG9uJ3QgY2hlY2sKKyAgZm9yIHRoZSA4LWJpdCBzaW5nbGUtY2hhcmFjdGVyIHZlcnNpb25zIG9mIENTSSwgRENTLCBPU0MsIEFQQywgb3IgU1QuCisgIEhlcmUgaXMgdGhlIEFOU0kgc2VxdWVuY2UgcmVjb2duaXplciBzdGF0ZSB0YWJsZSwgZm9sbG93ZWQgYnkgdGhlIGNvZGUKKyAgdGhhdCBpbXBsZW1lbnRzIGl0LgorCisgIERlZmluaXRpb25zOgorICAgIENBTiA9IENhbmNlbCAgICAgICAgICAgICAgICAgICAgICAgMDEvMDggICAgICAgICBDdHJsLVgKKyAgICBTVUIgPSBTdWJzdGl0dXRlICAgICAgICAgICAgICAgICAgIDAxLzEwICAgICAgICAgQ3RybC1aCisgICAgRENTID0gRGV2aWNlIENvbnRyb2wgU2VxdWVuY2UgICAgICAwMS8xMSAwNS8wMCAgIEVTQyBQCisgICAgQ1NJID0gQ29udHJvbCBTZXF1ZW5jZSBJbnRyb2R1Y2VyICAwMS8xMSAwNS8xMSAgIEVTQyBbCisgICAgU1QgID0gU3RyaW5nIFRlcm1pbmF0b3IgICAgICAgICAgICAwMS8xMSAwNS8xMiAgIEVTQyBcCisgICAgT1NDID0gT3BlcmF0aW5nIFN5c3RlbSBDb21tYW5kICAgICAwMS8xMSAwNS8xMyAgIEVTQyBdCisgICAgUE0gID0gUHJpdmFjeSBNZXNzYWdlICAgICAgICAgICAgICAwMS8xMSAwNS8xNCAgIEVTQyBeCisgICAgQVBDID0gQXBwbGljYXRpb24gUHJvZ3JhbSBDb21tYW5kICAwMS8xMSAwNS8xNSAgIEVTQyBfCisKKyAgQU5TSSBlc2NhcGUgc2VxdWVuY2UgcmVjb2duaXplcjoKKworICAgIFN0YXRlICAgIElucHV0ICBOZXcgU3RhdGUgIDsgQ29tbWVudGFyeQorCisgICAgTk9STUFMICAgKHN0YXJ0KSAgICAgICAgICAgOyBTdGFydCBpbiBOT1JNQUwgc3RhdGUKKworICAgIChhbnkpICAgIENBTiAgICBOT1JNQUwgICAgIDsgXlggY2FuY2VscworICAgIChhbnkpICAgIFNVQiAgICBOT1JNQUwgICAgIDsgXlogY2FuY2VscworCisgICAgTk9STUFMICAgRVNDICAgIEdPVEVTQyAgICAgOyBCZWdpbiBlc2NhcGUgc2VxdWVuY2UKKyAgICBOT1JNQUwgICBvdGhlciAgICAgICAgICAgICA7IE5PUk1BTCBjb250cm9sIG9yIGdyYXBoaWMgY2hhcmFjdGVyCisKKyAgICBHT1RFU0MgICBFU0MgICAgICAgICAgICAgICA7IFN0YXJ0IGFnYWluCisgICAgR09URVNDICAgWyAgICAgIEdPVENTSSAgICAgOyBDU0kKKyAgICBHT1RFU0MgICBQICAgICAgU1RSSU5HICAgICA7IERDUyBpbnRyb2R1Y2VyLCBjb25zdW1lIHRocm91Z2ggU1QKKyAgICBHT1RFU0MgICBdICAgICAgU1RSSU5HICAgICA7IE9TQyBpbnRyb2R1Y2VyLCBjb25zdW1lIHRocm91Z2ggU1QKKyAgICBHT1RFU0MgICBeICAgICAgU1RSSU5HICAgICA7IFBNICBpbnRyb2R1Y2VyLCBjb25zdW1lIHRocm91Z2ggU1QKKyAgICBHT1RFU0MgICBfICAgICAgU1RSSU5HICAgICA7IEFQQyBpbnRyb2R1Y2VyLCBjb25zdW1lIHRocm91Z2ggU1QKKyAgICBHT1RFU0MgICAwLi5+ICAgTk9STUFMICAgICA7IDAzLzAwIHRocm91Z2ggMTcvMTQgPSBGaW5hbCBjaGFyYWN0ZXIKKyAgICBHT1RFU0MgICBvdGhlciAgRVNDU0VRICAgICA7IEludGVybWVkaWF0ZSBvciBpZ25vcmVkIGNvbnRyb2wgY2hhcmFjdGVyCisKKyAgICBFU0NTRVEgICBFU0MgICAgR09URVNDICAgICA7IFN0YXJ0IGFnYWluCisgICAgRVNDU0VRICAgMC4ufiAgIE5PUk1BTCAgICAgOyAwMy8wMCB0aHJvdWdoIDE3LzE0ID0gRmluYWwgY2hhcmFjdGVyCisgICAgRVNDU0VRICAgb3RoZXIgICAgICAgICAgICAgOyBJbnRlcm1lZGlhdGUgb3IgaWdub3JlZCBjb250cm9sIGNoYXJhY3RlcgorCisgICAgR09UQ1NJICAgRVNDICAgIEdPVEVTQyAgICAgOyBTdGFydCBhZ2FpbgorICAgIEdPVENTSSAgIEAuLn4gICBOT1JNQUwgICAgIDsgMDQvMDAgdGhyb3VnaCAxNy8xNCA9IEZpbmFsIGNoYXJhY3RlcgorICAgIEdPVENTSSAgIG90aGVyICAgICAgICAgICAgIDsgSW50ZXJtZWRpYXRlIGNoYXIgb3IgaWdub3JlZCBjb250cm9sIGNoYXIKKworICAgIFNUUklORyAgIEVTQyAgICBURVJNSU4gICAgIDsgTWF5YmUgaGF2ZSBTVAorICAgIFNUUklORyAgIG90aGVyICAgICAgICAgICAgIDsgQ29uc3VtZSBhbGwgZWxzZQorCisgICAgVEVSTUlOICAgXCAgICAgIE5PUk1BTCAgICAgOyBFbmQgb2Ygc3RyaW5nCisgICAgVEVSTUlOICAgb3RoZXIgIFNUUklORyAgICAgOyBTdGlsbCBpbiBzdHJpbmcKKyovCisvKgorICBjaGthZXMoKSAtLSBDaGVjayBBTlNJIEVzY2FwZSBTZXF1ZW5jZS4KKyAgQ2FsbCB3aXRoIEVBQ0ggY2hhcmFjdGVyIGluIGlucHV0IHN0cmVhbS4KKyAgU2V0cyBnbG9iYWwgaW5lc2MgdmFyaWFibGUgYWNjb3JkaW5nIHRvIGVzY2FwZSBzZXF1ZW5jZSBzdGF0ZS4KKyAgUmV0dXJucyAwIG5vcm1hbGx5LCAxIGlmIGFuIEFQQyBzZXF1ZW5jZSBpcyB0byBiZSBleGVjdXRlZC4KKyovCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2hrYWVzKGNoYXIgYykKKyNlbHNlCitjaGthZXMoYykgY2hhciBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBjaGthZXMgKi8geworCisgICAgb2xkZXNjID0gaW5lc2M7CQkJLyogUmVtZW1iZXIgcHJldmlvdXMgc3RhdGUgKi8KKyAgICBpZiAoYyA9PSBDQU4gfHwgYyA9PSBTVUIpCQkvKiBDQU4gYW5kIFNVQiBjYW5jZWwgYW55IHNlcXVlbmNlICovCisgICAgICBpbmVzYyA9IEVTX05PUk1BTDsKKyAgICBlbHNlCQkJCS8qIE90aGVyd2lzZSAqLworICAgICAgc3dpdGNoIChpbmVzYykgewkJCS8qIGVudGVyIHN0YXRlIHN3aXRjaGVyICovCisKKwljYXNlIEVTX05PUk1BTDoJCQkvKiBOT1JNQUwgc3RhdGUgKi8KKwkgIGlmIChjID09IEVTQykJCQkvKiBHb3QgYW4gRVNDICovCisJICAgIGluZXNjID0gRVNfR09URVNDOwkJLyogQ2hhbmdlIHN0YXRlIHRvIEdPVEVTQyAqLworCSAgYnJlYWs7CQkJLyogT3RoZXJ3aXNlIHN0YXkgaW4gTk9STUFMIHN0YXRlICovCisKKwljYXNlIEVTX0dPVEVTQzoJCQkvKiBHT1RFU0Mgc3RhdGUgKi8KKwkgIGlmIChjID09ICdbJykJCQkvKiBMZWZ0IGJyYWNrZXQgYWZ0ZXIgRVNDIGlzIENTSSAqLworCSAgICBpbmVzYyA9IEVTX0dPVENTSTsJCS8qIENoYW5nZSB0byBHT1RDU0kgc3RhdGUgKi8KKwkgIGVsc2UgaWYgKGMgPT0gJ1AnIHx8IChjID4gMDEzNCAmJiBjIDwgMDE0MCkpIHsgLyogUCwgWywgXiwgb3IgXyAqLworCSAgICAgIGluZXNjID0gRVNfU1RSSU5HOwkvKiBTd2l0Y2ggdG8gU1RSSU5HLWFic29ycHRpb24gc3RhdGUgKi8KKyNpZmRlZiBDS19BUEMKKwkgICAgICBpZiAoYyA9PSAnXycgJiYgcGlkID09IDAgJiYgLyogQVBDIGhhbmRsZWQgaW4gY2hpbGQgb25seSAqLworCQkgIChhcGNzdGF0dXMgJiBBUENfT04pKSB7IC8qIGFuZCBvbmx5IGlmIG5vdCBkaXNhYmxlZC4gKi8KKwkJICBkZWJ1ZyhGMTAwLCJDT05ORUNUIEFQQyBiZWdpbiIsIiIsMCk7CisJCSAgYXBjYWN0aXZlID0gQVBDX1JFTU9URTsgLyogU2V0IEFQQy1BY3RpdmUgZmxhZyAqLworCQkgIGFwY2xlbmd0aCA9IDA7CS8qIGFuZCByZXNldCBBUEMgYnVmZmVyIHBvaW50ZXIgKi8KKwkgICAgICB9CisjZW5kaWYgLyogQ0tfQVBDICovCisJICB9IGVsc2UgaWYgKGMgPiAwNTcgJiYgYyA8IDAxNzcpIC8qIEZpbmFsIGNoYXJhY3RlciAnMCcgdGhydSAnficgKi8KKwkgICAgaW5lc2MgPSBFU19OT1JNQUw7CQkvKiBCYWNrIHRvIG5vcm1hbCAqLworCSAgZWxzZSBpZiAoYyAhPSBFU0MpCQkvKiBFU0MgaW4gYW4gZXNjYXBlIHNlcXVlbmNlLi4uICovCisJICAgIGluZXNjID0gRVNfRVNDU0VROwkJLyogc3RhcnRzIGEgbmV3IGVzY2FwZSBzZXF1ZW5jZSAqLworCSAgYnJlYWs7CQkJLyogSW50ZXJtZWRpYXRlIG9yIGlnbm9yZWQgY3RybCBjaGFyICovCisKKwljYXNlIEVTX0VTQ1NFUToJCQkvKiBFU0NTRVEgLS0gaW4gYW4gZXNjYXBlIHNlcXVlbmNlICovCisJICBpZiAoYyA+IDA1NyAmJiBjIDwgMDE3NykJLyogRmluYWwgY2hhcmFjdGVyICcwJyB0aHJ1ICd+JyAqLworCSAgICBpbmVzYyA9IEVTX05PUk1BTDsJCS8qIFJldHVybiB0byBOT1JNQUwgc3RhdGUuICovCisJICBlbHNlIGlmIChjID09IEVTQykJCS8qIEVTQyAuLi4gKi8KKwkgICAgaW5lc2MgPSBFU19HT1RFU0M7CQkvKiBzdGFydHMgYSBuZXcgZXNjYXBlIHNlcXVlbmNlICovCisJICBicmVhazsJCQkvKiBJbnRlcm1lZGlhdGUgb3IgaWdub3JlZCBjdHJsIGNoYXIgKi8KKworCWNhc2UgRVNfR09UQ1NJOgkJCS8qIEdPVENTSSAtLSBJbiBhIGNvbnRyb2wgc2VxdWVuY2UgKi8KKwkgIGlmIChjID4gMDc3ICYmIGMgPCAwMTc3KQkvKiBGaW5hbCBjaGFyYWN0ZXIgJ0AnIHRocnUgJ34nICovCisJICAgIGluZXNjID0gRVNfTk9STUFMOwkJLyogUmV0dXJuIHRvIE5PUk1BTC4gKi8KKwkgIGVsc2UgaWYgKGMgPT0gRVNDKQkJLyogRVNDIC4uLiAqLworCSAgICBpbmVzYyA9IEVTX0dPVEVTQzsJCS8qIHN0YXJ0cyBvdmVyLiAqLworCSAgYnJlYWs7CQkJLyogSW50ZXJtZWRpYXRlIG9yIGlnbm9yZWQgY3RybCBjaGFyICovCisKKwljYXNlIEVTX1NUUklORzoJCQkvKiBJbnNpZGUgYSBzdHJpbmcgKi8KKwkgIGlmIChjID09IEVTQykJCQkvKiBFU0MgbWF5IGJlIDFzdCBjaGFyIG9mIHRlcm1pbmF0b3IgKi8KKwkgICAgaW5lc2MgPSBFU19URVJNSU47CQkvKiBHbyBzZWUuICovCisjaWZkZWYgQ0tfQVBDCisJICBlbHNlIGlmIChhcGNhY3RpdmUgJiYgKGFwY2xlbmd0aCA8IGFwY2J1ZmxlbikpIC8qIElmIGluIEFQQywgKi8KKwkgICAgYXBjYnVmW2FwY2xlbmd0aCsrXSA9IGM7CS8qIGRlcG9zaXQgdGhpcyBjaGFyYWN0ZXIuICovCisJICBlbHNlIHsJCQkvKiBCdWZmZXIgb3ZlcnJ1biAqLworCSAgICAgIGFwY2FjdGl2ZSA9IDA7CQkvKiBEaXNjYXJkIHdoYXQgd2UgZ290ICovCisJICAgICAgYXBjbGVuZ3RoID0gMDsJCS8qIGFuZCBnbyBiYWNrIHRvIG5vcm1hbCAqLworCSAgICAgIGFwY2J1ZlswXSA9IDA7CQkvKiBOb3QgcHJldHR5LCBidXQgd2hhdCBlbHNlICovCisJICAgICAgaW5lc2MgPSBFU19OT1JNQUw7CS8qIGNhbiB3ZSBkbz8gIChTVCBtaWdodCBub3QgY29tZSkgKi8KKwkgIH0KKyNlbmRpZiAvKiBDS19BUEMgKi8KKwkgIGJyZWFrOwkJCS8qIEFic29yYiBhbGwgb3RoZXIgY2hhcmFjdGVycy4gKi8KKworCWNhc2UgRVNfVEVSTUlOOgkJCS8qIE1heSBoYXZlIGEgc3RyaW5nIHRlcm1pbmF0b3IgKi8KKwkgIGlmIChjID09ICdcXCcpIHsJCS8qIHdoaWNoIG11c3QgYmUgYmFja3NsYXNoICovCisJICAgICAgaW5lc2MgPSBFU19OT1JNQUw7CS8qIElmIHNvLCBiYWNrIHRvIE5PUk1BTCAqLworI2lmZGVmIENLX0FQQworCSAgICAgIGlmIChhcGNhY3RpdmUpIHsJCS8qIElmIGl0IHdhcyBhbiBBUEMgc3RyaW5nLCAqLworCQkgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgQVBDIHRlcm1pbmF0ZWQiLCIiLGMpOworCQkgIGFwY2J1ZlthcGNsZW5ndGhdID0gTlVMOyAvKiB0ZXJtaW5hdGUgaXQgYW5kIHRoZW4gLi4uICovCisJCSAgcmV0dXJuKDEpOworCSAgICAgIH0KKyNlbmRpZiAvKiBDS19BUEMgKi8KKwkgIH0gZWxzZSB7CQkJLyogT3RoZXJ3aXNlICovCisJICAgICAgaW5lc2MgPSBFU19TVFJJTkc7CS8qIEJhY2sgdG8gc3RyaW5nIGFic29ycHRpb24uICovCisjaWZkZWYgQ0tfQVBDCisJICAgICAgaWYgKGFwY2FjdGl2ZSAmJiAoYXBjbGVuZ3RoKzEgPCBhcGNidWZsZW4pKSB7IC8qIEluIEFQQyBzdHJpbmcgKi8KKwkJICBhcGNidWZbYXBjbGVuZ3RoKytdID0gRVNDOyAvKiBkZXBvc2l0IHRoZSBFc2MgY2hhcmFjdGVyICovCisJCSAgYXBjYnVmW2FwY2xlbmd0aCsrXSA9IGM7ICAgLyogYW5kIHRoaXMgY2hhcmFjdGVyIHRvbyAqLworCSAgICAgIH0KKyNlbmRpZiAvKiBDS19BUEMgKi8KKwkgIH0KKyAgICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogTk9FU0NTRVEgKi8KKworLyogQ29ubmVjdCBzdGF0ZSBwYXJlbnQvY2hpbGQgY29tbXVuaWNhdGlvbiBzaWduYWwgaGFuZGxlcnMgKi8KKworLyogUm91dGluZXMgdXNlZCBieSB0aGUgY2hpbGQgcHJvY2VzcyAqLworCitzdGF0aWMgaW50CitwaXBlbXNnKG4pIGludCBuOyB7CQkJLyogU2VuZCBtZXNzYWdlIElEIHRvIHBhcmVudCAqLworICAgIGludCBjb2RlID0gbiAmIDI1NTsKKyAgICByZXR1cm4od3JpdGUoeHBpcGVbMV0sICZjb2RlLCBzaXplb2YoY29kZSkpKTsKK30KKworLyogRW52aXJvbm1lbnQgcG9pbnRlciBmb3IgQ0tfRk9SS19TSUcgc2lnbmFsIGhhbmRsaW5nIGluIGNoaWxkLi4uICovCisKKyNpZmRlZiBDS19QT1NJWF9TSUcKK3N0YXRpYyBzaWdqbXBfYnVmIHNpZ19lbnY7CisjZWxzZQorc3RhdGljIGptcF9idWYgc2lnX2VudjsKKyNlbmRpZiAvKiBDS19QT1NJWF9TSUcgKi8KKworc3RhdGljIFNJR1RZUAkJCQkvKiBDS19GT1JLX1NJRyBoYW5kbGluZyBpbiBjaGlsZCAuLi4gKi8KK2ZvcmtpbnQoZm9vKSBpbnQgZm9vOyB7CisgICAgLyogSXQgaXMgaW1wb3J0YW50IHRvIGRpc2FibGUgQ0tfRk9SS19TSUcgYmVmb3JlIGxvbmdqbXAgKi8KKyAgICBzaWduYWwoQ0tfRk9SS19TSUcsIFNJR19JR04pOwkvKiBTZXQgdG8gaWdub3JlIENLX0ZPUktfU0lHICovCisgICAgZGVidWcoRjEwMCwiQ09OTkVDVCBmb3JraW50IC0gQ0tfRk9SS19TSUciLCAiIiwgMCk7CisgICAgLyogRm9yY2UgcmV0dXJuIGZyb20gY2tfc25kbXNnKCkgKi8KKyAgICBja2xvbmdqbXAoc2lnX2VudiwgMSk7CisgICAgLyogTk9UUkVBQ0hFRCAqLworfQorCitzdGF0aWMgVk9JRAorY2tfc25kbXNnKCkgewkJCQkvKiBFeGVjdXRlZCBieSBjaGlsZCBvbmx5IC4uLiAqLworICAgIGRlYnVnKEYxMDAsIkNPTk5FQ1QgY2tfc25kbXNnLCBhY3RpdmUiLCAiIiwgYWN0aXZlKTsKKyAgICBpZiAoCisjaWZkZWYgQ0tfUE9TSVhfU0lHCisJc2lnc2V0am1wKHNpZ19lbnYsMSkKKyNlbHNlCisJc2V0am1wKHNpZ19lbnYpCisjZW5kaWYgLyogQ0tfUE9TSVhfU0lHICovCisJPT0gMCkgeworCWRlYnVnKEYxMDAsIkNPTk5FQ1QgY2tfc25kbXNnIHNpZ25hbGluZyBwYXJlbnQiLCIiLDApOworICAgICAgICBzaWduYWwoQ0tfRk9SS19TSUcsIGZvcmtpbnQpOwkvKiBTZXQgdXAgc2lnbmFsIGhhbmRsZXIgKi8KKyAgICAgICAga2lsbChwYXJlbnRfaWQsIENLX0ZPUktfU0lHKTsJLyogS2ljayB0aGUgcGFyZW50ICovCisJZGVidWcoRjEwMCwiY2tfc25kbXNnIHBhdXNpbmciLCIiLDApOworICAgICAgICBmb3IgKDs7KSBwYXVzZSgpOwkJLyogV2FpdCBmb3IgQ0tfRk9SS19TSUcgb3IgU0lHS0lMTCAqLworCS8qIE5PVFJFQUNIRUQgKi8KKyAgICB9CisgICAgLyogV2UgY29tZSBoZXJlIGZyb20gZm9ya2ludCgpIHZpYSBbc2lnXWNrbG9uZ2ptcChzaWdfZW52LDEpICovCisgICAgZGVidWcoRjEwMCwiQ09OTkVDVCBja19zbmRtc2cgaXMgcGFyZW50IC0gcmV0dXJuaW5nIiwgIiIsIDApOworfQorCisvKiBSb3V0aW5lcyB1c2VkIGJ5IHRoZSBwYXJlbnQgcHJvY2VzcyAqLworCisjaWZkZWYgQ0tfUE9TSVhfU0lHCQkgLyogRW52aXJvbm1lbnQgcG9pbnRlciBmb3IgQ09OTkVDVCBlcnJvcnMgKi8KK3N0YXRpYyBzaWdqbXBfYnVmIGNvbl9lbnY7CisjZWxzZQorc3RhdGljIGptcF9idWYgY29uX2VudjsKKyNlbmRpZiAvKiBDS19QT1NJWF9TSUcgKi8KKy8qCisgIHBpcGVpbnQoKSBoYW5kbGVzIENLX0ZPUktfU0lHIHNpZ25hbHMgZnJvbSB0aGUgbG93ZXIgKHBvcnQpIGZvcmsuCisgIEl0IHJlYWRzIGEgZnVuY3Rpb24gY29kZSBmcm9tIHRoZSBwaXBlIHRoYXQgY29ubmVjdHMgdGhlIHR3byBmb3JrcywKKyAgdGhlbiByZWFkcyBhZGRpdGlvbmFsIGRhdGEgZnJvbSB0aGUgcGlwZSwgdGhlbiBoYW5kbGVzIGl0LgorKi8KK3N0YXRpYyBTSUdUWVAKK3BpcGVpbnQoYXJnKSBpbnQgYXJnOyB7CQkJLyogRHVtbXkgYXJndW1lbnQgKi8KKyAgICBpbnQgY29kZSwgY3gsIHgsIGkgLyogLCBuICovIDsKKworI2lmbmRlZiBOT0NDVFJBUAorICAgIGV4dGVybiBja2ptcGJ1ZiBjbWpidWY7CisjZW5kaWYgLyogTk9DQ1RSQVAgKi8KKyAgICAvKgorICAgICAgSU1QT1JUQU5UOiBBdCB0aGlzIHBvaW50LCB0aGUgY2hpbGQgZm9yayBpcyB3YWl0aW5nIGZvciBDS19GT1JLX1NJRworICAgICAgKGV2ZW50dWFsbHkgZm9yIFNJR0tJTEwpIGluc2lkZSBvZiBja19zbmRtc2coKS4gIFNvIHdlIGNhbid0IGdldCBhbnkKKyAgICAgIHN1YnNlcXVlbnQgQ0tfRk9SS19TSUcgZnJvbSBjaGlsZCBiZWZvcmUgd2Ugc2VuZCBpdCBDS19GT1JLX1NJRy4KKyAgICAqLworICAgIHNpZ25hbChDS19GT1JLX1NJRywgU0lHX0lHTik7CS8qIElnbm9yZSBDS19GT1JLX1NJRyBub3cgKi8KKyAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIHBpcGVpbnQgYXJnIiwiIixhcmcpOworCisgICAgcmVhZCh4cGlwZVswXSwgJmNvZGUsIHNpemVvZihjb2RlKSk7IC8qIEdldCBmdW5jdGlvbiBjb2RlIGZyb20gcGlwZSAqLworICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgcGlwZWludCBjb2RlIiwiIixjb2RlKTsKKyAgICBjeCA9IGNvZGUgJiAyNTU7CQkJLyogOC1iaXQgdmVyc2lvbiBvZiBmdW5jdGlvbiBjb2RlICovCisKKyNpZm5kZWYgTk9DQ1RSQVAKKyNpZm5kZWYgTk9JQ1AKKyNkZWZpbmUgVVNFQ0NKTVBCVUYKKyNlbmRpZiAvKiBOT0lDUCAqLworI2VuZGlmIC8qIE5PQ0NUUkFQICovCisvKgorICBSZWFkIGluZm8gcGFzc2VkIGJhY2sgdXAgdG8gdXMgYnkgdGhlIGxvd2VyIGZvcmssIGRlcGVuZGluZyBvbiB0aGUgZnVuY3Rpb24KKyAgcmVxdWVzdGVkLiAgVGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zIG11c3QgYmUgcmVhZCBmcm9tIHRoZSBwaXBlIGluIHRoZSBzYW1lCisgIG9yZGVyIGFzIHRoZSBsb3dlciBmb3JrIHB1dCB0aGVtIHRoZXJlLiAgVHJ5aW5nIHRvIHJlYWQgc29tZXRoaW5nIHRoYXQncyBub3QKKyAgdGhlcmUgbWFrZXMgdGhlIHByb2dyYW0gaGFuZyB1bmludGVycnVwdGlibHkuICBQYXkgY2xvc2UgYXR0ZW50aW9uIC0tIG5vdGljZQorICBob3cgd2UgZmFsbCB0aHJvdWdoIHNvbWUgb2YgdGhlIGNhc2VzIHJhdGhlciB0aGFuIGJyZWFrOyB0aGF0J3MgZGVsaWJlcmF0ZS4KKyovCisgICAgc3dpdGNoIChjeCkgeworI2lmZGVmIENLX1RSSUdHRVIKKyAgICAgIGNhc2UgQ0VWX1RSSToJCQkvKiBUcmlnZ2VyIHN0cmluZyAqLworCWRlYnVnKEYxMDAsIkNPTk5FQ1QgdHJpZ2dlciIsIiIsMCk7CisJcmVhZCh4cGlwZVswXSwgKGNoYXIgKikmaSwgc2l6ZW9mKGkpKTsgLyogVHJpZ2dlciBpbmRleCAqLworCWRlYnVnKEYxMDEsIkNPTk5FQ1QgdHJpZ2dlciBpbmRleCIsIiIsaSk7CisJbWFrZXN0cigmdHJpZ2dlcnZhbCx0dF90cmlnZ2VyW2ldKTsgLyogTWFrZSBhIGNvcHkgb2YgdGhlIHRyaWdnZXIgKi8KKwlkZWJ1ZyhGMTEwLCJDT05ORUNUIHRyaWdnZXJ2YWwiLHRyaWdnZXJ2YWwsMCk7CisJcmVhZCh4cGlwZVswXSwgKGNoYXIgKikmaWJjLCBzaXplb2YoaWJjKSk7IC8qIENvcHkgY2hpbGQncyAqLworCWRlYnVnKEYxMDEsIkNPTk5FQ1QgdHJpZ2dlciBpYmMgKHVwcGVyKSIsIiIsaWJjKTsgLyogaW5wdXQgYnVmZmVyLiAqLworCWlmIChpYmMgPiAwKSB7CisJICAgIHJlYWQoeHBpcGVbMF0sIChjaGFyICopJmlicCwgc2l6ZW9mKGlicCkpOworCSAgICByZWFkKHhwaXBlWzBdLCBpYnAsIGliYyk7CisJfQorCS8qIEZhbGwgdGhydS4uLiAqLworCisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworCisgICAgICBjYXNlIENFVl9IVVA6CisvKgorICBUaGUgQ0VWX0hVUCBjYXNlIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIG90aGVyIHNpZGUgaGFzIGh1bmcgdXAgb24gdXMuCisgIEluIHNvbWUgY2FzZXMsIHRoaXMgaGFwcGVucyBiZWZvcmUgd2UgaGF2ZSBoYWQgYSBjaGFuY2UgdG8gZXhlY3V0ZSB0aGUKKyAgc2V0am1wKGNvbl9lbnYsMSkgY2FsbCwgYW5kIGluIHRoYXQgY2FzZSB3ZSdkIGJldHRlciBub3QgdGFrZSB0aGUgbG9uZ2ptcCEKKyAgQSBnb29kIGV4YW1wbGUgaXMgd2hlbiB5b3UgVEVMTkVUIHRvIHBvcnQgMTMgb24gdGhlIGxvY2FsIGhvc3Q7IGl0IHByaW50cworICBpdHMgYXNjdGltZSgpIHN0cmluZyAoMjYgY2hhcnMpIGFuZCB0aGVuIGNsb3NlcyB0aGUgY29ubmVjdGlvbi4KKyovCisjaWZkZWYgQ0tfVFJJR0dFUgorCWlmIChjeCA9PSBDRVZfVFJJKQorCSAgc2p2YWwgPSBDRVZfVFJJOwkJLyogU2V0IGdsb2JhbCB2YXJpYWJsZS4gKi8KKwllbHNlCisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworCSAgc2p2YWwgPSBDRVZfSFVQOworCWlmIChqYnNldCkgewkJCS8qIGptcF9idWYgaXMgaW5pdGlhbGl6ZWQgKi8KKwkgICAgY2tsb25nam1wKGNvbl9lbnYsc2p2YWwpOwkvKiBzbyBkbyB0aGUgcmlnaHQgdGhpbmcuICovCisJfSBlbHNlIHsKKwkgICAgaW50IHggPSAwOworI2lmZGVmIFVTRUNDSk1QQlVGCisJICAgIC8qIGptcF9idWYgbm90IGluaXQnZCB5ZXQgYSBjbG9zZSBhcHByb3hpbWF0aW9uLi4uICovCisjaWZkZWYgQ0tfVFJJR0dFUgorCSAgICBpZiAoY3ggPT0gQ0VWX0hVUCkKKyNlbmRpZiAvKiBDS19UUklHR0VSICovCisJICAgICAgdHRjbG9zKDApOwkJLyogQ2xvc2Ugb3VyIGVuZCBvZiB0aGUgY29ubmVjdGlvbiAqLworCSAgICBpZiAocGlkKSB7CisJCWRlYnVnKEYxMDEsIkNPTk5FQ1QgdHJpZ2dlciBraWxsaW5nIHBpZCIsIiIscGlkKTsKKyNpZmRlZiBCRU9TT1JCRUJPWAorCQl7CisJCSAgICBsb25nIHJldF92YWw7CisJCSAgICB4ID0ga2lsbChwaWQsU0lHS0lMTFRIUik7CS8qIEtpbGwgbG93ZXIgZm9yayAqLworCQkgICAgd2FpdF9mb3JfdGhyZWFkIChwaWQsICZyZXRfdmFsKTsKKwkJfQorI2Vsc2UKKyNpZmRlZiBQbGFuOQorCQl4ID0ga2lsbChwaWQsIFNJR0tJTEwpOyAvKiAoc2hvdWxkIGFsd2F5cyB1c2UgdGhpcyByZWFsbHkpICovCisjZWxzZQorCQl4ID0ga2lsbChwaWQsOSk7CS8qIEtpbGwgbG93ZXIgZm9yayAoaGlzdG9yeSkgKi8KKyNlbmRpZiAvKiBQbGFuOSAqLworCQl3YWl0KChXQUlUX1QgKikwKTsJLyogV2FpdCB0aWxsIGdvbmUuICovCisJCWlmICh4IDwgMCkgeworCQkgICAgcHJpbnRmKCJFUlJPUjogRmFpbHVyZSB0byBraWxsIHBpZCAlbGQ6ICVzLCBlcnJubz0lZFxuIiwKKwkJCSAgIChsb25nKSBwaWQsIGNrX2VycnN0cigpLCBlcnJubyk7CisJCSAgICBkZWJ1ZyhGMTExLCJDT05ORUNUIGVycm9yIGtpbGxpbmcgc3RhbGUgcGlkIiwKKwkJCSAgY2tfZXJyc3RyKCksZXJybm8pOworCQl9CisJCXBpZCA9IChQSURfVCkgMDsKKyNlbmRpZiAvKiBCRU9TT1JCRUJPWCAqLworCSAgICB9CisJICAgIGNvbnJlcygpOwkJCS8qIFJlc2V0IHRoZSBjb25zb2xlLiAqLworCSAgICBpZiAoIXF1aWV0KSB7CisJCXByaW50ZigiXHJcbihCYWNrIGF0ICVzKVxyXG4iLAorCQkgICAgICAgKm15aG9zdCA/IG15aG9zdCA6CisjaWZkZWYgVU5JWAorCQkgICAgICAgImxvY2FsIFVOSVggc3lzdGVtIgorI2Vsc2UKKwkJICAgICAgICJsb2NhbCBzeXN0ZW0iCisjZW5kaWYgLyogVU5JWCAqLworCQkgICAgICAgKTsKKwkgICAgfQorCSAgICB3aGF0ID0gV19OT1RISU5HOwkJLyogU28gY29uc29sZSBtb2RlcyBhcmUgc2V0IHJpZ2h0LiAqLworCSAgICBwcmludGYoIlxyXG4iKTsJCS8qIHByZXZlbnQgcHJvbXB0LXN0b21waW5nICovCisJICAgIGNrbG9uZ2ptcChjbWpidWYsMCk7CS8qIERvIHdoYXQgdGhlIEN0cmwtQyBoYW5kbGVyIGRvZXMgKi8KKyNlbHNlCisJICAgIHByaW50ZigiXHJcbkxvbmdqdW1wIGZhaWx1cmUgLSBmYXRhbFxyXG4iKTsKKwkgICAgZG9leGl0KEdPT0RfRVhJVCwtMSk7CS8qIEJldHRlciB0aGFuIGR1bXBpbmcgY29yZS4uLiAqLworI2VuZGlmIC8qIFVTRUNDSk1QQlVGICovCisJfQorI2lmZGVmIFVTRUNDSk1QQlVGCisjdW5kZWYgVVNFQ0NKTVBCVUYKKyNlbmRpZiAvKiBVU0VDQ0pNUEJVRiAqLworCisgICAgICBjYXNlIENFVl9EVVA6CQkJLyogQ2hpbGQgc2VuZHMgZHVwbGV4IGNoYW5nZSAqLworCXJlYWQoeHBpcGVbMF0sIChjaGFyICopJmR1cGxleCwgc2l6ZW9mKGR1cGxleCkpOworCWRlYnVnKEYxMDEsIkNPTk5FQ1QgcGlwZWludCBkdXBsZXgiLCIiLGR1cGxleCk7CisJYnJlYWs7CisjaWZkZWYgVE5DT0RFCisgICAgICBjYXNlIENFVl9NRUJJTjoJCQkvKiBDaGlsZCBzZW5kcyBtZV9iaW5hcnkgY2hhbmdlICovCisJcmVhZCh4cGlwZVswXSwKKwkgICAgIChjaGFyICopJlRFTE9QVF9NRShURUxPUFRfQklOQVJZKSwKKwkgICAgIHNpemVvZihURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkpCisJICAgICApOworCWRlYnVnKEYxMDEsIkNPTk5FQ1QgcGlwZWludCBtZV9iaW5hcnkiLCIiLFRFTE9QVF9NRShURUxPUFRfQklOQVJZKSk7CisJYnJlYWs7CisgICAgICBjYXNlIENFVl9VQklOOgkJCS8qIENoaWxkIHNlbmRzIHVfYmluYXJ5IGNoYW5nZSAqLworCXJlYWQoeHBpcGVbMF0sCisJICAgICAoY2hhciAqKSZURUxPUFRfVShURUxPUFRfQklOQVJZKSwKKwkgICAgIHNpemVvZihURUxPUFRfVShURUxPUFRfQklOQVJZKSkKKwkgICAgICk7CisJZGVidWcoRjEwMSwiQ09OTkVDVCBwaXBlaW50IHVfYmluYXJ5IiwiIixURUxPUFRfVShURUxPUFRfQklOQVJZKSk7CisJYnJlYWs7CisjZW5kaWYgLyogVE5DT0RFICovCisKKyNpZmRlZiBDS19BUEMKKyAgICAgIGNhc2UgQ0VWX0FVTDoJCQkvKiBBdXRvdXBsb2FkICovCisJanVzdG9uZSA9IDE7CisJZGVidWcoRjEwMCwiQ09OTkVDVCBhdXRvdXBsb2FkIGF0IHBhcmVudCIsIiIsMCk7CisjaWZkZWYgQ0tfQVVUT0RMCisgICAgICBjYXNlIENFVl9BREw6CQkJLyogQXV0b2Rvd25sb2FkICovCisJYXBjYWN0aXZlID0gQVBDX0xPQ0FMOworCWlmICghanVzdG9uZSkgZGVidWcoRjEwMCwiQ09OTkVDVCBhdXRvZG93bmxvYWQgYXQgcGFyZW50IiwiIiwwKTsKKwkvKiBDb3B5IGNoaWxkJ3MgS2VybWl0IHBhY2tldCBpZiBhbnkgKi8KKwlyZWFkKHhwaXBlWzBdLCAoY2hhciAqKSZ4LCBzaXplb2YoeCkpOworCWRlYnVnKEYxMDEsIkNPTk5FQ1QgdHJpZ2dlciBpYmMgKHVwcGVyKSIsIiIsaWJjKTsKKwlpZiAoeCA+IDApCisJICByZWFkKHhwaXBlWzBdLCAoY2hhciAqKWtzYnVmLCB4KzEpOworI2VuZGlmIC8qIENLX0FVVE9ETCAqLworICAgICAgY2FzZSBDRVZfQVBDOgkJCS8qIEFwcGxpY2F0aW9uIFByb2dyYW0gQ29tbWFuZCAqLworCXJlYWQoeHBpcGVbMF0sIChjaGFyICopJmFwY2xlbmd0aCwgc2l6ZW9mKGFwY2xlbmd0aCkpOworCXJlYWQoeHBpcGVbMF0sIGFwY2J1ZiwgYXBjbGVuZ3RoKzEpOyAvKiBJbmNsdWRlIHRyYWlsaW5nIHplcm8gYnl0ZSAqLworCWRlYnVnKEYxMTEsIkNPTk5FQ1QgQVBDIGF0IHBhcmVudCIsYXBjYnVmLGFwY2xlbmd0aCk7CisJcmVhZCh4cGlwZVswXSwgKGNoYXIgKikmaWJjLCBzaXplb2YoaWJjKSk7IC8qIENvcHkgY2hpbGQncyAqLworCWlmIChpYmMgPiAwKSB7CQkJCSAgIC8qIGlucHV0IGJ1ZmZlci4gKi8KKwkgICAgcmVhZCh4cGlwZVswXSwgKGNoYXIgKikmaWJwLCBzaXplb2YoaWJwKSk7CisJICAgIHJlYWQoeHBpcGVbMF0sIGlicCwgaWJjKTsKKwl9CisJb2JjID0gMDsgb2JwID0gb2J1ZjsgKm9idWYgPSBOVUw7IC8qIEJlY2F1c2UgcG9ydCBmb3JrIGZsdXNoZWQgKi8KKwlzanZhbCA9IENFVl9BUEM7CisJY2tsb25nam1wKGNvbl9lbnYsc2p2YWwpOworCS8qIE5PVFJFQUNIRUQgKi8KKyNlbmRpZiAvKiBDS19BUEMgKi8KKworI2lmZGVmIFNVTlgyNQorICAgICAgY2FzZSBDRVZfUEFEOgkJCS8qIFguMjUgUEFEIHBhcmFtZXRlciBjaGFuZ2UgKi8KKwlkZWJ1ZyhGMTAwLCJDT05ORUNUIHBpcGVpbnQgUEFEIGNoYW5nZSIsIiIsMCk7CisJcmVhZCh4cGlwZVswXSxwYWRwYXJtcyxNQVhQQURQQVJNUyk7CisJc2p2YWwgPSBDRVZfUEFEOwkJLyogU2V0IGdsb2JhbCB2YXJpYWJsZS4gKi8KKyNpZmRlZiBDT01NRU5UCQkJCS8qIFdlIG1pZ2h0IG5vdCBuZWVkIHRvIGRvIHRoaXMuLi4gKi8KKwlja2xvbmdqbXAoY29uX2VudixzanZhbCk7CisJLyogTk9UUkVBQ0hFRCAqLworI2Vsc2UgIC8qIENPTU1FTlQgKi8KKwlicmVhazsKKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogU1VOWDI1ICovCisgICAgfQorICAgIHNpZ25hbChDS19GT1JLX1NJRywgcGlwZWludCk7CS8qIFNldCB1cCBzaWduYWwgaGFuZGxlciAqLworICAgIGtpbGwocGlkLCBDS19GT1JLX1NJRyk7CQkvKiBTaWduYWwgdGhlIHBvcnQgZm9yayAuLi4gKi8KK30KKworLyogIEMgSyBDIFAgVSBUIEMgIC0tICBDLUtlcm1pdCBDT05ORUNUIFB1dCBDaGFyYWN0ZXIgdG8gU2NyZWVuICAqLworLyoKKyAgT3V0cHV0IGlzIGJ1ZmZlcmVkIHRvIGF2b2lkIHNsb3cgc2NyZWVuIHdyaXRlcyBvbiBmYXN0IGNvbm5lY3Rpb25zLgorICBOT1RFOiBUaGVzZSBjb3VsZCAoZWFzaWx5PykgYmVjb21lIG1hY3JvcyAuLi4KKyovCitzdGF0aWMgaW50Citja2NwdXRmKCkgewkJCQkvKiBEdW1wIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgaW50IHggPSAwOworICAgIGlmIChvYmMgPiAwKQkJCS8qIElmIHdlIGhhdmUgYW55IGNoYXJhY3RlcnMsICovCisgICAgICB4ID0gY29ueG8ob2JjLG9idWYpOwkJLyogZHVtcCB0aGVtLCAqLworICAgIG9icCA9IG9idWY7CQkJCS8qIHJlc2V0IHRoZSBwb2ludGVyICovCisgICAgb2JjID0gMDsJCQkJLyogYW5kIHRoZSBjb3VudGVyLiAqLworICAgIHJldHVybih4KTsJCQkJLyogUmV0dXJuIGNvbnhvJ3MgcmV0dXJuIGNvZGUgKi8KK30KKworaW50Citja2NwdXRjKGMpIGludCBjOyB7CisgICAgaW50IHg7CisKKyAgICAqb2JwKysgPSBjICYgMHhmZjsJCQkvKiBEZXBvc2l0IHRoZSBjaGFyYWN0ZXIgKi8KKyAgICBvYmMrKzsJCQkJLyogQ291bnQgaXQgKi8KKyAgICBpZiAoaWJjID09IDAgfHwJCQkvKiBJZiBpbnB1dCBidWZmZXIgYWJvdXQgZW1wdHkgKi8KKwlvYmMgPT0gT0JVRkwpIHsJCQkvKiBvciBvdXRwdXQgYnVmZmVyIGZ1bGwgKi8KKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIENLQ1BVVEMgb2JjIiwiIixvYmMpOworCXggPSBjb254byhvYmMsb2J1Zik7CQkvKiBkdW1wIHRoZSBidWZmZXIsICovCisJb2JwID0gb2J1ZjsJCQkvKiByZXNldCB0aGUgcG9pbnRlciAqLworCW9iYyA9IDA7CQkJLyogYW5kIHRoZSBjb3VudGVyLiAqLworCXJldHVybih4KTsJCQkvKiBSZXR1cm4gY29ueG8ncyByZXR1cm4gY29kZSAqLworICAgIH0gZWxzZSByZXR1cm4oMCk7Cit9CisKKy8qICBDIEsgQyBHIEUgVCBDICAtLSAgQy1LZXJtaXQgQ09OTkVDVCBHZXQgQ2hhcmFjdGVyICAqLworLyoKKyAgQnVmZmVyZWQgcmVhZCBmcm9tIGNvbW11bmljYXRpb24gZGV2aWNlLgorICBSZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3RlciwgcmVmaWxsaW5nIHRoZSBidWZmZXIgaWYgbmVjZXNzYXJ5LgorICBPbiBlcnJvciwgcmV0dXJucyB0dGluYydzIHJldHVybiBjb2RlIChzZWUgdHRpbmMoKSBkZXNjcmlwdGlvbikuCisgIER1bW15IGFyZ3VtZW50IGZvciBjb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbnMgd2l0aCB0dGluYygpLgorICBOT1RFOiBXZSBkb24ndCBoYXZlIGEgbWFjcm8gZm9yIHRoaXMgYmVjYXVzZSB3ZSBoYXZlIHRvIHBhc3MKKyAgYSBwb2ludGVyIHRvIHRoaXMgZnVuY3Rpb24gYXMgYW4gYXJndW1lbnQgdG8gdG5fZG9vcCgpLgorKi8KK2ludAorY2tjZ2V0YyhkdW1teSkgaW50IGR1bW15OyB7CisgICAgaW50IGMsIG47CisjaWZkZWYgQ0tfU1NMCisgICAgZXh0ZXJuIGludCBzc2xfYWN0aXZlX2ZsYWcsIHRsc19hY3RpdmVfZmxhZzsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAvKiBObyBidWZmZXJpbmcgZm9yIHBvc3NpYmx5IGVuY3J5cHRlZCBjb25uZWN0aW9ucyAqLworICAgIGlmIChuZXR3b3JrICYmIElTX1RFTE5FVCgpICYmIFRFTE9QVF9NRShURUxPUFRfQVVUSEVOVElDQVRJT04pKQorICAgICAgcmV0dXJuKHR0aW5jKDApKTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKHNzbF9hY3RpdmVfZmxhZyB8fCB0bHNfYWN0aXZlX2ZsYWcpCisgICAgICAgIHJldHVybih0dGluYygwKSk7CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgQ09NTUVOVAorLyogdG9vIG11Y2ggKi8KKyAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIENLQ0dFVEMgMSBpYmMiLCIiLGliYyk7IC8qIExvZyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBpZiAoaWJjIDwgMSkgewkJCS8qIE5lZWQgdG8gcmVmaWxsIGJ1ZmZlcj8gKi8KKwlpYmMgPSAwOwkJCS8qIFllcywgcmVzZXQgY291bnQgKi8KKwlpYnAgPSBpYnVmOwkJCS8qIGFuZCBidWZmZXIgcG9pbnRlciAqLworCS8qIGRlYnVnKEYxMDAsIkNPTk5FQ1QgQ0tDR0VUQyAxIGNhbGxpbmcgdHRpbmMoMCkiLCIiLDApOyAqLworI2lmZGVmIENPTU1FTlQKKy8qCisgIFRoaXMgY2hlY2sgaXMgbm90IHdvcnRoIHRoZSBvdmVyaGVhZC4gIFNjZW5hcmlvOiB0dGNoaygpIHJldHVybnMgMCwgc28gd2UKKyAgZmFsbCB0aHJvdWdoIHRvIHRoZSBibG9ja2luZyB0dGluYygpLiAgV2hpbGUgaW4gdHRpbmMoKSwgdGhlIGNvbm5lY3Rpb24gaXMKKyAgbG9zdC4gIEJ1dCB0aGUgcmVhZCgpIHRoYXQgdHRpbmMoKSBjYWxscyBkb2VzIG5vdCBub3RpY2UsIGFuZCBuZXZlciByZXR1cm5zLgorICBUaGlzIGhhcHBlbnMgYXQgbGVhc3QgaW4gSFAtVVgsIGFuZCBjYW4gYmUgc2VlbiB3aGVuIHdlIHR1cm4gb2ZmIHRoZSBtb2RlbS4KKyovCisJaWYgKCFuZXR3b3JrICYmIChjYXJyaWVyICE9IENBUl9PRkYpKQorCSAgaWYgKChuID0gdHRjaGsoKSkgPCAwKQkvKiBNYWtlIHN1cmUgY29ubmVjdGlvbiBpcyBub3QgbG9zdCAqLworCSAgICByZXR1cm4obik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCWMgPSB0dGluYygwKTsJCQkvKiBSZWFkIG9uZSBjaGFyYWN0ZXIsIGJsb2NraW5nICovCisJLyogZGVidWcoRjEwMSwiQ09OTkVDVCBDS0NHRVRDIDEgdHRpbmMoMCkiLCIiLGMpOyAqLworCWlmIChjIDwgMCkgewkJCS8qIElmIGVycm9yLCByZXR1cm4gZXJyb3IgY29kZSAqLworCSAgICByZXR1cm4oYyk7CisJfSBlbHNlIHsJCQkvKiBPdGhlcndpc2UsIGdvdCBvbmUgY2hhcmFjdGVyICovCisJICAgICppYnArKyA9IGM7CQkJLyogQWR2YW5jZSBidWZmZXIgcG9pbnRlciAqLworCSAgICBpYmMrKzsJCQkvKiBhbmQgY291bnQuICovCisJfQorCWlmICgobiA9IHR0Y2hrKCkpID4gMCkgewkvKiBBbnkgbW9yZSB3YWl0aW5nPyAqLworCSAgICBpZiAobiA+IChJQlVGTCAtIGliYykpCS8qIEdldCB0aGVtIGFsbCBhdCBvbmNlLiAqLworCSAgICAgIG4gPSBJQlVGTCAtIGliYzsJCS8qIERvbid0IG92ZXJmbG93IGJ1ZmZlciAqLworCSAgICBpZiAoKG4gPSB0dHhpbihuLChDSEFSICopaWJwKSkgPiAwKSB7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorCQlpZiAoVEVMT1BUX1UoVEVMT1BUX0VOQ1JZUFRJT04pKQorCQkgIGNrX3RuX2RlY3J5cHQoaWJwLG4pOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKwkJaWJjICs9IG47CQkJLyogQWR2YW5jZSBjb3VudGVyICovCisJICAgIH0KKwl9IGVsc2UgaWYgKG4gPCAwKSB7CQkvKiBFcnJvcj8gKi8KKwkgICAgcmV0dXJuKG4pOwkJCS8qIFJldHVybiB0aGUgZXJyb3IgY29kZSAqLworCX0KKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIENLQ0dFVEMgMiBpYmMiLCIiLGliYyk7IC8qIExvZyBob3cgbWFueSAqLworCWlicCA9IGlidWY7CQkJLyogUG9pbnQgdG8gYmVnaW5uaW5nIG9mIGJ1ZmZlciAqLworICAgIH0KKyAgICBjID0gKmlicCsrICYgMHhmZjsJCQkvKiBHZXQgbmV4dCBjaGFyYWN0ZXIgZnJvbSBidWZmZXIgKi8KKyAgICBpYmMtLTsJCQkJLyogUmVkdWNlIGJ1ZmZlciBjb3VudCAqLworICAgIHJldHVybihjKTsJCQkJLyogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgKi8KK30KKworLyoKKyAgIEtleWJvYXJkIGhhbmRsaW5nLCBidWZmZXJlZCBmb3Igc3BlZWQsIHdoaWNoIGlzIG5lZWRlZCB3aGVuIEMtS2VybWl0IGlzCisgICBpbiBDT05ORUNUIG1vZGUgYmV0d2VlbiB0d28gb3RoZXIgY29tcHV0ZXJzIHRoYXQgYXJlIHRyYW5zZmVycmluZyBkYXRhLgorKi8KK3N0YXRpYyBjaGFyICprYnA7CQkJLyogS2V5Ym9hcmQgaW5wdXQgYnVmZmVyIHBvaW50ZXIgKi8KK3N0YXRpYyBpbnQga2JjOwkJCQkvKiBLZXlib2FyZCBpbnB1dCBidWZmZXIgY291bnQgKi8KKworI2lmZGVmIENLX1NNQUxMCQkJCS8qIEtleWJvYXJkIGlucHV0IGJ1ZmZlciBsZW5ndGggKi8KKyNkZWZpbmUgS0JVRkwgMzIJCQkvKiBTbWFsbCBmb3IgUERQLTExIFVOSVggKi8KKyNlbHNlCisjZGVmaW5lIEtCVUZMIDI1NwkJCS8qIFJlZ3VsYXIga2VybmVsIHNpemUgZm9yIG90aGVycyAqLworI2VuZGlmIC8qIENLX1NNQUxMICovCisKKyNpZmRlZiBEWU5BTUlDCitzdGF0aWMgY2hhciAqa2J1ZiA9IE5VTEw7CisjZWxzZQorc3RhdGljIGNoYXIga2J1ZltLQlVGTF07CisjZW5kaWYgLyogRFlOQU1JQyAqLworCisvKiBNYWNybyBmb3IgcmVhZGluZyBrZXlzdHJva2VzLiAqLworCisjZGVmaW5lIENPTkdLUygpICgoKC0ta2JjKT49MCkgPyAoKGludCkoKmticCsrKSAmIDAzNzcpIDoga2JnZXQoKSkKKworLyoKKyAgTm90ZSB0aGF0IHdlIGNhbGwgcmVhZCgpIGRpcmVjdGx5IGhlcmUsIG5vcm1hbGx5IGEgbm8tbm8sIGJ1dCBpbiB0aGlzIGNhc2UKKyAgd2Uga25vdyBpdCdzIFVOSVggYW5kIHdlJ3JlIG9ubHkgZG9pbmcgd2hhdCBjb25pbmMoMCkgd291bGQgaGF2ZSBkb25lLAorICBleGNlcHQgd2UncmUgcmVhZGluZyBhIGJsb2NrIG9mIGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4ganVzdCBvbmUuICBUaGVyZSBpcywKKyAgYXQgcHJlc2VudCwgbm8gY29ueGluKCkgYW5hbG9nIHRvIHR0eGluKCkgZm9yIGNodW5rIHJlYWRzLCBhbmQgaW5zdGl0dXRpbmcKKyAgb25lIHdvdWxkIG9ubHkgYWRkIGZ1bmN0aW9uLWNhbGwgb3ZlcmhlYWQgYXMgaXQgd291bGQgb25seSBiZSBhIHdyYXBwZXIgZm9yCisgIGEgcmVhZCgpIGNhbGwgYW55d2F5LgorKi8KKy8qCisgIEFub3RoZXIgbm90ZTogV2Ugc3RpY2sgaW4gdGhpcyByZWFkKCkgdGlsbCB0aGUgdXNlciB0eXBlcyBzb21ldGhpbmcuCisgIEJ1dCB0aGUgb3RoZXIgKGxvd2VyKSBmb3JrIGlzIHJ1bm5pbmcgdG9vLCBhbmQgb24gVEVMTkVUIGNvbm5lY3Rpb25zLAorICBpdCB3aWxsIHNpZ25hbCB1cyB0byBpbmRpY2F0ZSBlY2hvLWNoYW5nZSBuZWdvdGlhdGlvbnMsIGFuZCB0aGlzIGNhbgorICBpbnRlcnJ1cHQgdGhlIHJlYWQoKS4gIFNvbWUgVU5JWGVzIGF1dG9tYXRpY2FsbHkgcmVzdGFydCB0aGUgaW50ZXJydXB0ZWQKKyAgc3lzdGVtIGNhbGwsIG90aGVycyByZXR1cm4gZnJvbSBpdCB3aXRoIGVycm5vID09IEVJTlRSLgorKi8KK3N0YXRpYyBpbnQJCQkJLyogS2V5Ym9hcmQgYnVmZmVyIGZpbGxlciAqLwora2JnZXQoKSB7CisjaWZkZWYgRUlOVFIKKyAgICBpbnQgdHJpZXMgPSAxMDsJCQkvKiBJZiByZWFkKCkgaXMgaW50ZXJydXB0ZWQsICovCisgICAgaW50IG9rID0gMDsKKyAgICB3aGlsZSAodHJpZXMtLSA+IDApIHsJCS8qIHRyeSBhIGZldyB0aW1lcy4uLiAqLworI2VuZGlmIC8qIEVJTlRSICovCisJaWYgKChrYmMgPSBjb25jaGsoKSkgPCAxKQkvKiBIb3cgbWFueSBjaGFycyB3YWl0aW5nPyAqLworCSAga2JjID0gMTsJCQkvKiBJZiBub25lIG9yIGR1bm5vLCB3YWl0IGZvciBvbmUuICovCisJZWxzZSBpZiAoa2JjID4gS0JVRkwpCQkvKiBJZiB0b28gbWFueSwgKi8KKwkgIGtiYyA9IEtCVUZMOwkJCS8qIG9ubHkgcmVhZCB0aGlzIG1hbnkuICovCisJaWYgKChrYmMgPSByZWFkKDAsIGtidWYsIGtiYykpIDwgMSkgeyAvKiBOb3cgcmVhZCBpdC90aGVtLiAqLworCSAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGtiZ2V0IGVycm5vIiwiIixlcnJubyk7CS8qIEdvdCBhbiBlcnJvci4gKi8KKyNpZmRlZiBFSU5UUgorCSAgICBpZiAoZXJybm8gPT0gRUlOVFIpCQkvKiBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbC4gKi8KKwkgICAgICBjb250aW51ZTsJCQkvKiBUcnkgYWdhaW4sIHVwIHRvIGxpbWl0LiAqLworCSAgICBlbHNlCQkJLyogU29tZXRoaW5nIGVsc2UuICovCisjZW5kaWYgLyogRUlOVFIgKi8KKwkgICAgICByZXR1cm4oLTEpOwkJLyogUGFzcyBhbG9uZyByZWFkKCkgZXJyb3IuICovCisJfQorI2lmZGVmIEVJTlRSCisJZWxzZSB7IG9rID0gMTsgYnJlYWs7IH0KKyAgICB9CisgICAgaWYgKCFvaykgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBFSU5UUiAqLworICAgIGticCA9IGtidWY7CQkJCS8qIEFkanVzdCBidWZmZXIgcG9pbnRlciwgKi8KKyAgICBrYmMtLTsJCQkJLyogY291bnQsICovCisgICAgcmV0dXJuKChpbnQpKCprYnArKykgJiAwMzc3KTsJLyogYW5kIHJldHVybiBmaXJzdCBjaGFyYWN0ZXIuICovCit9CisKKy8qICBDIE8gTiBDIEwgRCAtLSAgSW50ZXJhY3RpdmUgdGVybWluYWwgY29ubmVjdGlvbiBjaGlsZCBmdW5jdGlvbiAqLworCitzdGF0aWMKKyNpZmRlZiBCRU9TT1JCRUJPWAorbG9uZworI2Vsc2UKK1ZPSUQKKyNlbmRpZiAvKiBCRU9TT1JCRUJPWCAqLworY29uY2xkICgKKyNpZmRlZiBCRU9TT1JCRUJPWAorICAgICAgIHZvaWQgKmJldm9pZAorI2VuZGlmIC8qIEJFT1NPUkJFQk9YICovCisgICAgICAgKSB7CisgICAgaW50CW47CQkJLyogR2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIgKi8KKyAgICBpbnQgaTsJCQkvKiBGb3IgbG9vcHMuLi4gKi8KKyAgICBpbnQgYyA9IC0xOwkJCS8qIGMgaXMgYSBjaGFyYWN0ZXIsIGJ1dCBtdXN0IGJlIHNpZ25lZAorCQkJCSAgIGludGVnZXIgdG8gcGFzcyB0aHJ1IC0xLCB3aGljaCBpcyB0aGUKKwkJCQkgICBtb2RlbSBkaXNjb25uZWN0aW9uIHNpZ25hbCwgYW5kIGlzCisJCQkJICAgZGlmZmVyZW50IGZyb20gdGhlIGNoYXJhY3RlciAwMzc3ICovCisgICAgaW50IHByZXY7CisjaWZkZWYgVE5DT0RFCisgICAgaW50IHR4OwkJCS8qIHRuX2Rvb3AoKSByZXR1cm4gY29kZSAqLworI2VuZGlmIC8qIFROQ09ERSAqLworI2lmZGVmIENLX1RSSUdHRVIKKyAgICBpbnQgaXg7CQkJCS8qIFRyaWdnZXIgaW5kZXggKi8KKyNlbmRpZiAvKiBDS19UUklHR0VSICovCisjaWZuZGVmIE5PRVNDU0VRCisgICAgaW50IGFwY3JjOworI2VuZGlmIC8qIE5PRVNDU0VRICovCisKKyNpZmRlZiBDT01NRU5UCisgICAgaW50IGNvbnJldCA9IDA7CQkJLyogUmV0dXJuIHZhbHVlIGZyb20gY29uZWN0KCkgKi8KKyAgICBqYmNoa3N1bSA9IC0xTDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgamJzZXQgPSAwOwkJCQkvKiBqbXBfYnVmIG5vdCBzZXQgeWV0LCBkb24ndCB1c2UgaXQgKi8KKyAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGNvbmNsZCBlbnRyeSIsIiIsQ0tfRk9SS19TSUcpOworIAkvKiAqKiogKi8JCS8qIEluZmVyaW9yIHJlYWRzLCBwcmludHMgcG9ydCBpbnB1dCAqLworCisgICAgaWYgKHByaXZfY2FuKCkpIHsJCQkvKiBDYW5jZWwgYWxsIHByaXZzICovCisJcHJpbnRmKCI/c2V0dWlkIGVycm9yIC0gZmF0YWxcbiIpOworCWRvZXhpdChCQURfRVhJVCwtMSk7CisgICAgfQorICAgIHNpZ25hbChTSUdJTlQsIFNJR19JR04pOwkJLyogSW4gY2FzZSB0aGVzZSBoYXZlbid0IGJlZW4gKi8KKyAgICBzaWduYWwoU0lHUVVJVCwgU0lHX0lHTik7CQkvKiBpbmhlcml0ZWQgZnJvbSBhYm92ZS4uLiAqLworICAgIHNpZ25hbChDS19GT1JLX1NJRywgU0lHX0lHTik7CS8qIENLX0ZPUktfU0lHIG5vdCBleHBlY3RlZCB5ZXQgKi8KKworICAgIGluc2hpZnQgPSBvdXRzaGlmdCA9IDA7CQkvKiBJbml0aWFsIFNPL1NJIHNoaWZ0IHN0YXRlLiAqLworICAgIHsJCQkJCS8qIFdhaXQgZm9yIHBhcmVudCdzIHNldHVwICovCisJaW50IGk7CisJd2hpbGUgKChpID0gcmVhZCh4cGlwZVswXSwgJmMsIDEpKSA8PSAwKSB7CisJICAgIGlmIChpIDwgMCkgeworCQlkZWJ1ZyhGMTAxLCJDT05ORUNUIGNvbmNsZCBzZXR1cCBlcnJvciIsIiIsaSk7CisJCWRlYnVnKEYxMTEsIkNPTk5FQ1QgY29uY2xkIHNldHVwIGVycm9yIixja19lcnJzdHIoKSxlcnJubyk7CisJCXBpcGVtc2coQ0VWX0hVUCk7CS8qIFJlYWQgZXJyb3IgLSBoYW5ndXAgKi8KKwkJY2tfc25kbXNnKCk7CQkvKiBTZW5kIGFuZCB3YWl0IHRvIGJlIGtpbGxlZCAqLworCQkvKiBOT1RSRUFDSEVEICovCisJICAgIH0gLyogUmVzdGFydCBpbnRlcnJ1cHRlZCByZWFkKCkgKi8KKwl9CisgICAgfQorICAgIGNsb3NlKHhwaXBlWzBdKTsgeHBpcGVbMF0gPSAtMTsJLyogQ2hpbGQgLSBwcmV2ZW50IGZ1dHVyZSByZWFkcyAqLworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworCWRlYnVnKEYxMDAsIkNPTk5FQ1Qgc3RhcnRpbmcgcG9ydCBmb3JrIiwiIiwwKTsKKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIHBvcnQgZm9yayBpYmMiLCIiLGliYyk7CisJZGVidWcoRjEwMSwiQ09OTkVDVCBwb3J0IGZvcmsgb2JjIiwiIixvYmMpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHdoYXQgPSBXX0NPTk5FQ1Q7CisKKyAgICB3aGlsZSAoMSkgewkJCQkvKiBGcmVzaCByZWFkLCB3YWl0IGZvciBhIGNoYXJhY3Rlci4gKi8KKyNpZmRlZiBBTllYMjUKKwlpZiAobmV0d29yayAmJiAobmV0dHlwZSA9PSBORVRfU1gyNSkpIHsKKwkgICAgYnplcm8oeDI1aWJ1ZixzaXplb2YoeDI1aWJ1ZikpIDsKKwkgICAgaWYgKChpYnVmbCA9IHR0eGluKE1BWElYMjUsKENIQVIgKil4MjVpYnVmKSkgPCAwKSB7CisjaWZuZGVmIElCTVgyNQorCQlpZiAoaWJ1ZmwgPT0gLTIpIHsgIC8qIFBBRCBwYXJtcyBjaGFuZ2VzICovCisJCSAgICBwaXBlbXNnKENFVl9QQUQpOworCQkgICAgd3JpdGUoeHBpcGVbMV0scGFkcGFybXMsTUFYUEFEUEFSTVMpOworCQkgICAgY2tfc25kbXNnKCk7CisJCX0gZWxzZSB7CisjZW5kaWYgLyogSUJNWDI1ICovCisJCSAgICBpZiAoIXF1aWV0KQorCQkgICAgICBwcmludGYoIlxyXG5Db21tdW5pY2F0aW9ucyBkaXNjb25uZWN0ICIpOworCQkgICAgZG9sb2dlbmQoKTsKKwkJICAgIHBpcGVtc2coQ0VWX0hVUCk7CisJCSAgICBja19zbmRtc2coKTsJCS8qIFdhaXQgdG8gYmUga2lsbGVkICovCisJCSAgICAvKiBOT1RSRUFDSEVEICovCisjaWZuZGVmIElCTVgyNQorICAJCX0KKyNlbmRpZiAvKiBJQk1YMjUgKi8KKwkJLyogcGF1c2UoKTsgPC0tLSBTSE9VTEQgQkUgT0JTT0xFVEUgTk9XISAqLworCQkvKiBCRUNBVVNFIHBhdXNlKCkgaXMgZG9uZSBpbnNpZGUgb2YgY2tfc25kbXNnKCkgKi8KKwkgICAgfQorCSAgICBpZiAoZGVic2VzKSB7CQkvKiBEZWJ1Z2dpbmcgb3V0cHV0ICovCisJCXAgPSB4MjVpYnVmIDsKKwkJd2hpbGUgKGlidWZsLS0pIHsgYyA9ICpwKys7IGNvbm9sKGRiY2hyKGMpKTsgfQorCSAgICB9IGVsc2UgeworCQlpZiAoc2VzbG9nICYmIHNlc3NmdCkJLyogQmluYXJ5IHNlc3Npb24gbG9nICovCisJCSAgbG9nY2hhcigoY2hhciljKTsJLyogTG9nIGNoYXIgYmVmb3JlIHRyYW5zbGF0aW9uICovCisKKwkJaWYgKHNvc2kKKyNpZm5kZWYgTk9DU0VUUworCQkgICAgfHwgdGNzbCAhPSB0Y3NyCisjZW5kaWYgLyogTk9DU0VUUyAqLworCQkgICAgKSB7IC8qIENoYXJhY3RlciBhdCBhIHRpbWUgKi8KKwkJICAgIGZvciAoaSA9IDE7IGkgPCBpYnVmbDsgaSsrKSB7CisJCQljID0geDI1aWJ1ZltpXSAmIGNtYXNrOworCQkJaWYgKHNvc2kpIHsgLyogSGFuZGxlIFNJL1NPICovCisJCQkgICAgaWYgKGMgPT0gU08pIHsKKwkJCQlpbnNoaWZ0ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCSAgICB9IGVsc2UgaWYgKGMgPT0gU0kpIHsKKwkJCQlpbnNoaWZ0ID0gMDsKKwkJCQljb250aW51ZTsKKwkJCSAgICB9CisJCQkgICAgaWYgKGluc2hpZnQpCisJCQkgICAgICBjIHw9IDAyMDA7CisJCQl9CisjaWZuZGVmIE5PQ1NFVFMKKwkJCWlmIChpbmVzYyA9PSBFU19OT1JNQUwpIHsKKyNpZmRlZiBVTklDT0RFCisJCQkgICAgaW50IHg7CisJCQkgICAgaWYgKHVuaWNvZGUgPT0gMSkgewkvKiBSZW1vdGUgaXMgVVRGLTggKi8KKwkJCQl4ID0gdV90b19iKChDSEFSKWMpOworCQkJICAgICAgICBpZiAoeCA9PSAtMSkKKwkJCQkgIGNvbnRpbnVlOworCQkJCWVsc2UgaWYgKHggPT0gLTIpIHsgLyogTFMgb3IgUFMgKi8KKwkJCQkgICAgaW54YnVmWzBdID0gQ1I7CisJCQkJICAgIGlueGJ1ZlsxXSA9IExGOworCQkJCSAgICBpbnhjb3VudCA9IDI7CisJCQkJfSBlbHNlIHsKKwkJCQkgICAgaW54YnVmWzBdID0gKHVuc2lnbmVkKSh4ICYgMHhmZik7CisJCQkJfQorCQkJCWMgPSBpbnhidWZbMF07CisJCQkgICAgfSBlbHNlIGlmICh1bmljb2RlID09IDIpIHsgLyogTG9jYWwgaXMgVVRGLTggKi8KKwkJCQlpbnhjb3VudCA9CisJCQkJICBiX3RvX3UoKENIQVIpYyxpbnhidWYsT1VUWEJVRlNJWix0Y3NzaXplKTsKKwkJCQljID0gaW54YnVmWzBdOworCQkJICAgIH0gZWxzZSB7CisjZW5kaWYgLyogVU5JQ09ERSAqLworCQkJCWlmIChzeGkpIGMgPSAoKnN4aSkoKENIQVIpYyk7CisJCQkJaWYgKHJ4aSkgYyA9ICgqcnhpKSgoQ0hBUiljKTsKKwkJCQlpbnhidWZbMF0gPSBjOworI2lmZGVmIFVOSUNPREUKKwkJCSAgICB9CisjZW5kaWYgLyogVU5JQ09ERSAqLworCQkJfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKwkJCWMgJj0gY21kbXNrOyAvKiBBcHBseSBjb21tYW5kIG1hc2suICovCisJCQljb25vYyhjKTsgICAgLyogT3V0cHV0IHRvIHNjcmVlbiAqLworCQkJaWYgKHNlc2xvZyAmJiAhc2Vzc2Z0KSAvKiBhbmQgc2Vzc2lvbiBsb2cgKi8KKwkJCSAgbG9nY2hhcihjKTsKKwkJICAgIH0KKwkJfSBlbHNlIHsJCS8qIEFsbCBhdCBvbmNlICovCisJCSAgICBmb3IgKGkgPSAxOyBpIDwgaWJ1Zmw7IGkrKykKKwkJICAgICAgeDI1aWJ1ZltpXSAmPSAoY21hc2sgJiBjbWRtc2spOworCQkgICAgY29ueG8oaWJ1ZmwseDI1aWJ1Zik7CisJCSAgICBpZiAoc2VzbG9nKSB6c291dHgoWlNGSUxFLHgyNWlidWYsaWJ1ZmwpOworCQl9CisJICAgIH0KKwkgICAgY29udGludWU7CisKKwl9IGVsc2UgewkJCS8qIE5vdCBYLjI1Li4uICovCisjZW5kaWYgLyogQU5ZWDI1ICovCisvKgorICBHZXQgdGhlIG5leHQgY29tbXVuaWNhdGlvbiBsaW5lIGNoYXJhY3RlciBmcm9tIG91ciBpbnRlcm5hbCBidWZmZXIuCisgIElmIHRoZSBidWZmZXIgaXMgZW1wdHksIHJlZmlsbCBpdC4KKyovCisJICAgIHByZXYgPSBjOwkJCS8qIFJlbWVtYmVyIHByZXZpb3VzIGNoYXJhY3RlciAqLworCSAgICBjID0gY2tjZ2V0YygwKTsJCS8qIEdldCBuZXh0IGNoYXJhY3RlciAqLworCSAgICAvKiBkZWJ1ZyhGMTAxLCJDT05ORUNUIGMiLCIiLGMpOyAqLworCSAgICBpZiAoYyA8IDApIHsJCS8qIEZhaWxlZC4uLiAqLworCQlkZWJ1ZyhGMTAxLCJDT05ORUNUIGRpc2Nvbm5lY3QgaWJjIiwiIixpYmMpOworCQlkZWJ1ZyhGMTAxLCJDT05ORUNUIGRpc2Nvbm5lY3Qgb2JjIiwiIixvYmMpOworCQlja2NwdXRmKCk7CQkvKiBGbHVzaCBDT05ORUNUIG91dHB1dCBidWZmZXIgKi8KKwkJaWYgKCFxdWlldCkgeworCQkgICAgcHJpbnRmKCJcclxuQ29tbXVuaWNhdGlvbnMgZGlzY29ubmVjdCAiKTsKKyNpZmRlZiBDT01NRU5UCisJCSAgICBpZiAoIGMgPT0gLTMKKyNpZmRlZiB1bHRyaXgKKy8qIFRoaXMgaGFwcGVucyBvbiBVbHRyaXggaWYgdGhlcmUncyBubyBjYXJyaWVyICovCisJCQkmJiBlcnJubyAhPSBFSU8KKyNlbmRpZiAvKiB1bHRyaXggKi8KKyNpZmRlZiBVVEVLCisvKiBUaGlzIGhhcHBlbnMgb24gVVRFSyBpZiB0aGVyZSdzIG5vIGNhcnJpZXIgKi8KKwkJCSYmIGVycm5vICE9IEVXT1VMREJMT0NLCisjZW5kaWYgLyogVVRFSyAqLworCQkJKQorCQkgICAgICBwZXJyb3IoIlxyXG5DYW4ndCByZWFkIGNoYXJhY3RlciIpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkJfQorI2lmZGVmIE5PU0VUQlVGCisJCWZmbHVzaChzdGRvdXQpOworI2VuZGlmIC8qIE5PU0VUQlVGICovCisJCXR0aGFuZygpOwkJLyogSGFuZyB1cCB0aGUgY29ubmVjdGlvbiAqLworCQlkZWJ1ZyhGMTExLCJDT05ORUNUIGNvbmNsZCBpL28gZXJyb3IiLGNrX2VycnN0cigpLGVycm5vKTsKKwkJcGlwZW1zZyhDRVZfSFVQKTsKKwkJY2tfc25kbXNnKCk7CQkvKiBXYWl0IHRvIGJlIGtpbGxlZCAqLworCSAgICB9CisjaWZkZWYgQ09NTUVOVAorLyogdG9vIG11Y2guLi4gKi8KKwkgICAgZGVidWcoRjEwMSwiQ09OTkVDVCAqKiBQT1JUIiwiIixjKTsgLyogR290IGNoYXJhY3RlciBjIE9LLiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBUTkNPREUKKwkgICAgLyogSGFuZGxlIFRFTE5FVCBuZWdvdGlhdGlvbnMuLi4gKi8KKworCSAgICBpZiAoKGMgPT0gTlVMKSAmJiBuZXR3b3JrICYmIElTX1RFTE5FVCgpKSB7CisJCWlmIChwcmV2ID09IENSKQkJLyogRGlzY2FyZCA8TlVMPiBvZiA8Q1I+PE5VTD4gKi8KKwkJICBpZiAoIVRFTE9QVF9VKFRFTE9QVF9CSU5BUlkpKQorCQkgICAgY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKChjID09IElBQykgJiYgbmV0d29yayAmJiBJU19URUxORVQoKSkgeworCQlpbnQgbWVfYmluID0gVEVMT1BUX01FKFRFTE9QVF9CSU5BUlkpOworCQlpbnQgdV9iaW4gPSBURUxPUFRfVShURUxPUFRfQklOQVJZKTsKKwkJZGVidWcoRjEwMCwiQ09OTkVDVCBnb3QgSUFDIiwiIiwwKTsKKwkJY2tjcHV0ZigpOwkJLyogRHVtcCBzY3JlZW4tb3V0cHV0IGJ1ZmZlciAqLworCQlpZiAoKHR4ID0gdG5fZG9vcCgoQ0hBUikoYyAmIDB4ZmYpLGR1cGxleCxja2NnZXRjKSkgPT0gMCkgeworCQkgICAgaWYgKG1lX2JpbiAhPSBURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkpIHsKKwkJCWRlYnVnKEYxMDEsCisJCQkgICAgICAiQ09OTkVDVCBURUxORVQgbWVfYmluIiwKKwkJCSAgICAgICIiLAorCQkJICAgICAgVEVMT1BUX01FKFRFTE9QVF9CSU5BUlkpCisJCQkgICAgICApOworCQkJcGlwZW1zZyhDRVZfTUVCSU4pOyAvKiBUZWxsIHBhcmVudCAqLworCQkJd3JpdGUoeHBpcGVbMV0sCisJCQkgICAgICAmVEVMT1BUX01FKFRFTE9QVF9CSU5BUlkpLAorCQkJICAgICAgc2l6ZW9mKFRFTE9QVF9NRShURUxPUFRfQklOQVJZKSkKKwkJCSAgICAgICk7CisJCQlja19zbmRtc2coKTsJLyogVGVsbCB0aGUgcGFyZW50IGZvcmsgKi8KKwkJICAgIH0gZWxzZSBpZiAodV9iaW4gIT0gVEVMT1BUX1UoVEVMT1BUX0JJTkFSWSkpIHsKKwkJCWRlYnVnKEYxMDEsCisJCQkgICAgICAiQ09OTkVDVCBURUxORVQgdV9iaW4iLAorCQkJICAgICAgIiIsCisJCQkgICAgICBURUxPUFRfVShURUxPUFRfQklOQVJZKQorCQkJICAgICAgKTsKKwkJCXBpcGVtc2coQ0VWX1VCSU4pOyAvKiBUZWxsIHBhcmVudCAqLworCQkJd3JpdGUoeHBpcGVbMV0sCisJCQkgICAgICAmVEVMT1BUX1UoVEVMT1BUX0JJTkFSWSksCisJCQkgICAgICBzaXplb2YoVEVMT1BUX1UoVEVMT1BUX0JJTkFSWSkpCisJCQkgICAgICApOworCQkJY2tfc25kbXNnKCk7CS8qIFRlbGwgdGhlIHBhcmVudCBmb3JrICovCisJCSAgICB9CisJCSAgICBjb250aW51ZTsKKwkJfSBlbHNlIGlmICh0eCA9PSAtMSkgewkvKiBJL08gZXJyb3IgKi8KKwkJICAgIGlmICghcXVpZXQpCisJCSAgICAgIHByaW50ZigiXHJcbkNvbW11bmljYXRpb25zIGRpc2Nvbm5lY3QgIik7CisjaWZkZWYgTk9TRVRCVUYKKwkJICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmIC8qIE5PU0VUQlVGICovCisJCSAgICBkb2xvZ2VuZCgpOworCQkgICAgZGVidWcoRjExMSwiQ09OTkVDVCBjb25jbGQgaS9vIGVycm9yIDIiLGNrX2VycnN0cigpLGVycm5vKTsKKwkJICAgIHBpcGVtc2coQ0VWX0hVUCk7CisJCSAgICBja19zbmRtc2coKTsJLyogV2FpdCB0byBiZSBraWxsZWQgKi8KKwkJICAgIC8qIE5PVFJFQUNIRUQgKi8KKwkJfSBlbHNlIGlmICh0eCA9PSAtMykgewkvKiBJL08gZXJyb3IgKi8KKwkJICAgIGlmICghcXVpZXQpCisJCSAgICAgIHByaW50ZigiXHJcbkNvbm5lY3Rpb24gY2xvc2VkIGR1ZSB0byB0ZWxuZXQgcG9saWN5ICIpOworI2lmZGVmIE5PU0VUQlVGCisJCSAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZiAvKiBOT1NFVEJVRiAqLworCQkgICAgZG9sb2dlbmQoKTsKKwkJICAgIGRlYnVnKEYxMTEsIkNPTk5FQ1QgY29uY2xkIGkvbyBlcnJvciAyIixja19lcnJzdHIoKSxlcnJubyk7CisJCSAgICBwaXBlbXNnKENFVl9IVVApOworCQkgICAgY2tfc25kbXNnKCk7CS8qIFdhaXQgdG8gYmUga2lsbGVkICovCisJCSAgICAvKiBOT1RSRUFDSEVEICovCisJCX0gZWxzZSBpZiAodHggPT0gLTIpIHsJLyogSS9PIGVycm9yICovCisJCSAgICBpZiAoIXF1aWV0KQorCQkgICAgICBwcmludGYoIlxyXG5Db25uZWN0aW9uIGNsb3NlZCBieSBwZWVyICIpOworI2lmZGVmIE5PU0VUQlVGCisJCSAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZiAvKiBOT1NFVEJVRiAqLworCQkgICAgZG9sb2dlbmQoKTsKKwkJICAgIGRlYnVnKEYxMTEsIkNPTk5FQ1QgY29uY2xkIGkvbyBlcnJvciAyIixja19lcnJzdHIoKSxlcnJubyk7CisJCSAgICBwaXBlbXNnKENFVl9IVVApOworCQkgICAgY2tfc25kbXNnKCk7CS8qIFdhaXQgdG8gYmUga2lsbGVkICovCisJCSAgICAvKiBOT1RSRUFDSEVEICovCisJCX0gZWxzZSBpZiAoKHR4ID09IDEpICYmICghZHVwbGV4KSkgeyAvKiBFQ0hPIGNoYW5nZSAqLworCQkgICAgZHVwbGV4ID0gMTsJCS8qIFR1cm4gb24gbG9jYWwgZWNobyAqLworCQkgICAgZGVidWcoRjEwMSwiQ09OTkVDVCBURUxORVQgZHVwbGV4IGNoYW5nZSIsIiIsZHVwbGV4KTsKKwkJICAgIHBpcGVtc2coQ0VWX0RVUCk7CS8qIFRlbGwgcGFyZW50ICovCisJCSAgICB3cml0ZSh4cGlwZVsxXSwgJmR1cGxleCwgc2l6ZW9mKGR1cGxleCkpOworCQkgICAgY2tfc25kbXNnKCk7CS8qIFRlbGwgdGhlIHBhcmVudCBmb3JrICovCisJCSAgICBjb250aW51ZTsKKwkJfSBlbHNlIGlmICgodHggPT0gMikgJiYgKGR1cGxleCkpIHsgLyogRUNITyBjaGFuZ2UgKi8KKwkJICAgIGR1cGxleCA9IDA7CisJCSAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIFRFTE5FVCBkdXBsZXggY2hhbmdlIiwiIixkdXBsZXgpOworCQkgICAgcGlwZW1zZyhDRVZfRFVQKTsKKwkJICAgIHdyaXRlKHhwaXBlWzFdLCAmZHVwbGV4LCBzaXplb2YoZHVwbGV4KSk7CisJCSAgICBja19zbmRtc2coKTsKKwkJICAgIGNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHR4ID09IDMpIHsgLyogUXVvdGVkIElBQyAqLworCQkgICAgYyA9IHBhcml0eSA/IDEyNyA6IDI1NTsKKwkJfQorI2lmZGVmIElLU19PUFRJT04KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0eCA9PSA0KSB7ICAgLyogSUtTIFN0YXRlIENoYW5nZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC51X3N0YXJ0ICYmCisJCQkhdGNwX2luY29taW5nCisJCQkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhlcmUgd2UgbmVlZCB0byBwcmludCBhIG1zZyB0aGF0IHRoZSBvdGhlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogc2lkZSBpcyBpbiBTRVJWRVIgbW9kZSBhbmQgdGhhdCBSRU1PVEUgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kcyBzaG91bGQgYmUgdXNlZC4gIEFuZCBDT05ORUNUIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNob3VsZCBiZSBlbmRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJYWN0aXZlID0gMDsKKwkJICAgIH0KKwkJfQorI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0eCA9PSA2KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERPIExPR09VVCByZWNlaXZlZCAqLworCQkgICAgaWYgKCFxdWlldCkKKwkJICAgICAgcHJpbnRmKCJcclxuUmVtb3RlIExvZ291dCAiKTsKKyNpZmRlZiBOT1NFVEJVRgorCQkgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogTk9TRVRCVUYgKi8KKwkJICAgIGRlYnVnKEYxMDAsIkNPTk5FQ1QgUmVtb3RlIExvZ291dCIsIiIsMCk7CisJCSAgICBwaXBlbXNnKENFVl9IVVApOworCQkgICAgY2tfc25kbXNnKCk7CS8qIFdhaXQgdG8gYmUga2lsbGVkICovCisJCSAgICAvKiBOT1RSRUFDSEVEICovCisgICAgICAgICAgICAgICAgfSBlbHNlCisJCSAgY29udGludWU7CQkvKiBOZWdvdGlhdGlvbiBPSywgZ2V0IG5leHQgY2hhci4gKi8KKworCSAgICB9IGVsc2UgaWYgKHBhcml0eSkKKwkgICAgICBjICY9IDB4N2Y7CisKKyAgICAgICAgICAgIGlmIChURUxPUFRfTUUoVEVMT1BUX0VDSE8pICYmIHRuX3JlbV9lY2hvKQorICAgICAgICAgICAgICAgIHR0b2MoYyk7ICAgICAgICAgICAgICAgIC8qIEknbSBlY2hvaW5nIGZvciB0aGUgcmVtb3RlICovCisjZW5kaWYgLyogVE5DT0RFICovCisKKwkgICAgaWYgKGRlYnNlcykgewkJLyogT3V0cHV0IGNoYXJhY3RlciB0byBzY3JlZW4gKi8KKwkJY2hhciAqczsJCS8qIERlYnVnZ2luZyBkaXNwbGF5Li4uICovCisJCXMgPSBkYmNocihjKTsKKwkJd2hpbGUgKCpzKQorCQkgIGNrY3B1dGMoKnMrKyk7CisJICAgIH0gZWxzZSB7CQkJLyogUmVndWxhciBkaXNwbGF5IC4uLiAqLworCQljICY9IGNtYXNrOwkJLyogQXBwbHkgS2VybWl0LXRvLXJlbW90ZSBtYXNrICovCisjaWZkZWYgQ0tfQVVUT0RMCisvKgorICBBdXRvZG93bmxvYWQuICBDaGVjayBmb3IgS2VybWl0IFMgcGFja2V0IHByaW9yIHRvIHRyYW5zbGF0aW9uLCBzaW5jZSB0aGF0CisgIGNhbiBjaGFuZ2UgdGhlIHBhY2tldCBhbmQgbWFrZSBpdCB1bnJlY29nbml6YWJsZSAoYXMgd2hlbiB0aGUgdGVybWluYWwKKyAgY2hhcmFjdGVyIHNldCBpcyBhbiBJU08gNjQ2IG9uZSkuLi4gIERpdHRvIGZvciBabW9kZW0gc3RhcnQgcGFja2V0LgorKi8KKwkJaWYgKGF1dG9kbAkJLyogQXV0b2Rvd25sb2FkIGVuYWJsZWQ/ICovCisjaWZkZWYgSUtTX09QVElPTgorCQkgICAgfHwgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9zdGFydAorI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKwkJICAgICkgeworCQkgICAgaW50IGs7CisJCSAgICBrID0ga3N0YXJ0KChDSEFSKWMpOyAvKiBLZXJtaXQgUyBvciBJIHBhY2tldD8gKi8KKyNpZmRlZiBDS19YWVoKKwkJICAgIGlmICghayAmJiB6bWRsb2spCS8qIE9yIGFuICJzeiIgc3RhcnQ/ICovCisJCSAgICAgIGsgPSB6c3RhcnQoKENIQVIpYyk7CisjZW5kaWYgLyogQ0tfWFlaICovCisJCSAgICBpZiAoaykgeworCQkJaW50IGtzaWduID0gMDsKKwkJCWRlYnVnKEYxMDEsIkNPTk5FQ1QgYXV0b2Rvd25sb2FkIGsiLCIiLGspOworCQkJaWYgKGsgPCAwKSB7IC8qIE1pbnVzLVByb3RvY29sPyAqLworI2lmZGVmIE5PU0VSVkVSCisJCQkgICAgZ290byBub3NlcnZlcjsgLyogTmVlZCBzZXJ2ZXIgbW9kZSBmb3IgdGhpcyAqLworI2Vsc2UKKwkJCSAgICBrc2lnbiA9IDE7IC8qIFJlbWVtYmVyICovCisJCQkgICAgayA9IDAgLSBrOyAvKiBDb252ZXJ0IHRvIGFjdHVhbCBwcm90b2NvbCAqLworCQkJICAgIGp1c3RvbmUgPSAxOyAvKiBGbGFnIGZvciBwcm90b2NvbCBtb2R1bGUgKi8KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworCQkJfSBlbHNlCisJCQkgIGp1c3RvbmUgPSAwOworCQkJay0tOwkJLyogQWRqdXN0IFtrel1zdGFydCdzIHJldHVybiB2YWx1ZSAqLworCQkJaWYgKGsgPT0gUFJPVE9fSworI2lmZGVmIENLX1hZWgorCQkJICAgIHx8IGsgPT0gUFJPVE9fWgorI2VuZGlmIC8qIENLX1hZWiAqLworCQkJICAgICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm93IGRhbWFnZSB0aGUgcGFja2V0IHNvIHRoYXQgaXQgZG9lcyBub3QgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRyaWdnZXIgYXV0b2Rvd25sb2FkIGRldGVjdGlvbiBvbiBzdWJzcXVlbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW5rcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9PSBQUk9UT19LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBsZW4gPSBzdHJsZW4oKGNoYXIqKWtzYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJCSAgY2tjcHV0YyhCUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIENLX1hZWgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCQkgIGNrY3B1dGMoQ0FOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfWFlaICovCisJCQkgICAgLyogTm90aWZ5IHBhcmVudCAqLworCQkJICAgIHBpcGVtc2coanVzdG9uZSA/IENFVl9BVUwgOiBDRVZfQURMKTsKKy8qCisgIFNlbmQgb3VyIG1lbW9yeSBiYWNrIHVwIHRvIHRoZSB0b3AgZm9yayB0aHJ1IHRoZSBwaXBlLgorICBDQVJFRlVMIC0tIFdyaXRlIHRoaXMgc3R1ZmYgaW4gdGhlIHNhbWUgb3JkZXIgaXQgaXMgdG8gYmUgcmVhZCEKKyovCisJCQkgICAgLyogQ29weSBvdXIgS2VybWl0IHBhY2tldCB0byB0aGUgcGFyZW50IGZvcmsgKi8KKwkJCSAgICBuID0gKGludCkgc3RybGVuKChjaGFyICopa3NidWYpOworCQkJICAgIHdyaXRlKHhwaXBlWzFdLCAoY2hhciAqKSZuLCBzaXplb2YobikpOworCQkJICAgIGlmIChuID4gMCkKKwkJCSAgICAgIHdyaXRlKHhwaXBlWzFdLCAoY2hhciAqKWtzYnVmLCBuKzEpOworCQkJICAgIGRlYnVnKEYxMTEsIkNPTk5FQ1QgYXV0b2Rvd25sb2FkIGtzYnVmIixrc2J1ZixuKTsKKwkJCSAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGF1dG9kb3dubG9hZCBqdXN0b25lIiwiIiwKKwkJCQkgIGp1c3RvbmUpOworCQkJICAgIC8qIENvbnN0cnVjdCB0aGUgQVBDIGNvbW1hbmQgKi8KKwkJCSAgICBzcHJpbnRmKGFwY2J1ZiwKKwkJCQkgICAgInNldCBwcm90byAlcywgJXMsIHNldCBwcm90byAlcyIsCisJCQkJICAgIHB0YWJba10ucF9uYW1lLAorCQkJCSAgICBrc2lnbiA/ICJzZXJ2ZXIiIDogInJlY2VpdmUiLAorCQkJCSAgICBwdGFiW3Byb3RvY29sXS5wX25hbWUKKwkJCQkgICAgKTsKKwkJCSAgICBhcGNsZW5ndGggPSBzdHJsZW4oYXBjYnVmKTsKKwkJCSAgICBkZWJ1ZyhGMTExLCJDT05ORUNUIGtzYnVmIixrc2J1ZixrKTsKKwkJCSAgICBkZWJ1ZyhGMTEwLCJDT05ORUNUIGF1dG9kb3dubG9hZCIsYXBjYnVmLDApOworCQkJICAgIGFwY2FjdGl2ZSA9IEFQQ19MT0NBTDsKKwkJCSAgICBja2NwdXRmKCk7CS8qIEZvcmNlIHNjcmVlbiB1cGRhdGUgKi8KKworCQkJICAgIC8qIFdyaXRlIGJ1ZmZlciBpbmNsdWRpbmcgdHJhaWxpbmcgTlVMIGJ5dGUgKi8KKwkJCSAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIHdyaXRlIHhwaXBlIGFwY2xlbmd0aCIsIiIsCisJCQkJICBhcGNsZW5ndGgpOworCQkJICAgIHdyaXRlKHhwaXBlWzFdLAorCQkJCSAgKGNoYXIgKikmYXBjbGVuZ3RoLAorCQkJCSAgc2l6ZW9mKGFwY2xlbmd0aCkKKwkJCQkgICk7CisJCQkgICAgZGVidWcoRjExMCwiQ09OTkVDVCB3cml0ZSB4cGlwZSBhcGNidWYiLGFwY2J1ZiwwKTsKKwkJCSAgICB3cml0ZSh4cGlwZVsxXSwgYXBjYnVmLCBhcGNsZW5ndGgrMSk7CisKKwkJCSAgICAvKiBDb3B5IG91ciBpbnB1dCBidWZmZXIgdG8gdGhlIHBhcmVudCBmb3JrICovCisKKwkJCSAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGF1dG9kb3dubG9hZCBjb21wbGV0ZSBpYmMiLAorCQkJCSAgIiIsaWJjKTsKKwkJCSAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGF1dG9kb3dubG9hZCBjb21wbGV0ZSBvYmMiLAorCQkJCSAgIiIsb2JjKTsKKwkJCSAgICB3cml0ZSh4cGlwZVsxXSwgKGNoYXIgKikmaWJjLCBzaXplb2YoaWJjKSk7CisJCQkgICAgaWYgKGliYyA+IDApIHsKKwkJCQl3cml0ZSh4cGlwZVsxXSwgKGNoYXIgKikmaWJwLCBzaXplb2YoaWJwKSk7CisJCQkJd3JpdGUoeHBpcGVbMV0sIGlicCwgaWJjKTsKKwkJCSAgICB9CisJCQkgICAgY2tfc25kbXNnKCk7IC8qIFdhaXQgdG8gYmUga2lsbGVkICovCisJCQkgICAgLyogTk9UUkVBQ0hFRCAqLworCQkJfQorCQkgICAgfQorCQl9CisjaWZkZWYgTk9TRVJWRVIKKwkgICAgICBub3NlcnZlcjoKKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworI2VuZGlmIC8qIENLX0FVVE9ETCAqLworCQlpZiAoc29zaSkgewkJLyogSGFuZGxlIFNJL1NPICovCisJCSAgICBpZiAoYyA9PSBTTykgewkvKiBTaGlmdCBPdXQgKi8KKwkJCWluc2hpZnQgPSAxOworCQkJY29udGludWU7CisJCSAgICB9IGVsc2UgaWYgKGMgPT0gU0kpIHsgLyogU2hpZnQgSW4gKi8KKwkJCWluc2hpZnQgPSAwOworCQkJY29udGludWU7CisJCSAgICB9CisJCSAgICBpZiAoaW5zaGlmdCkgYyB8PSAwMjAwOworCQl9CisJCWlueGJ1ZlswXSA9IGM7CQkvKiBJbiBjYXNlIHRoZXJlIGlzIG5vIHRyYW5zbGF0aW9uICovCisJCWlueGNvdW50ID0gMTsJCS8qIC4uLiAqLworI2lmbmRlZiBOT0NTRVRTCisJCWlmIChpbmVzYyA9PSBFU19OT1JNQUwpCXsgLyogSWYgbm90IGluIGFuIGVzY2FwZSBzZXF1ZW5jZSAqLworI2lmZGVmIFVOSUNPREUKKwkJICAgIGludCB4OwkJLyogVHJhbnNsYXRlIGNoYXJhY3RlciBzZXRzICovCisJCSAgICBDSEFSIGNoOworCQkgICAgY2ggPSBjOworCQkgICAgaWYgKHVuaWNvZGUgPT0gMSkgewkvKiBSZW1vdGUgaXMgVVRGLTggKi8KKwkJCXggPSB1X3RvX2IoY2gpOworCQkJaWYgKHggPCAwKQorCQkJICBjb250aW51ZTsKKwkJCWlueGJ1ZlswXSA9ICh1bnNpZ25lZCkoeCAmIDB4ZmYpOworCQkJYyA9IGlueGJ1ZlswXTsKKwkJICAgIH0gZWxzZSBpZiAodW5pY29kZSA9PSAyKSB7IC8qIExvY2FsIGlzIFVURi04ICovCisJCQlpbnhjb3VudCA9IGJfdG9fdShjaCxpbnhidWYsT1VUWEJVRlNJWix0Y3NzaXplKTsKKwkJCWMgPSBpbnhidWZbMF07CisJCSAgICB9IGVsc2UgeworI2VuZGlmIC8qIFVOSUNPREUgKi8KKwkJCWlmIChzeGkpIGMgPSAoKnN4aSkoKENIQVIpYyk7CisJCQlpZiAocnhpKSBjID0gKCpyeGkpKChDSEFSKWMpOworCQkJaW54YnVmWzBdID0gYzsKKyNpZmRlZiBVTklDT0RFCisJCSAgICB9CisjZW5kaWYgLyogVU5JQ09ERSAqLworCQl9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisjaWZuZGVmIE5PRVNDU0VRCisJCWlmIChlc2NzZXEpCQkvKiBJZiBoYW5kbGluZyBlc2NhcGUgc2VxdWVuY2VzICovCisJCSAgYXBjcmMgPSBjaGthZXMoKGNoYXIpYyk7IC8qIHVwZGF0ZSBvdXIgc3RhdGUgKi8KKyNpZmRlZiBDS19BUEMKKy8qCisgIElmIHdlIGFyZSBoYW5kbGluZyBBUENzLCB3ZSBoYXZlIHNldmVyYWwgcG9zc2liaWxpdGllcyBhdCB0aGlzIHBvaW50OgorICAgMS4gT3JkaW5hcnkgY2hhcmFjdGVyIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNjcmVlbi4KKyAgIDIuIEFuIEVzYzsgd2UgY2FuJ3Qgd3JpdGUgaXQgYmVjYXVzZSBpdCBtaWdodCBiZSB0aGUgYmVnaW5uaW5nIG9mIGFuIEFQQy4KKyAgIDMuIFRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nIGFuIEVzYywgaW4gd2hpY2ggY2FzZSB3ZSB3cml0ZSBFc2MsIHRoZW4gY2hhciwKKyAgICAgIGJ1dCBvbmx5IGlmIHdlIGhhdmUgbm90IGp1c3QgZW50ZXJlZCBhbiBBUEMgc2VxdWVuY2UuCisqLworCQlpZiAoZXNjc2VxICYmIChhcGNzdGF0dXMgJiBBUENfT04pKSB7CisJCSAgICBpZiAoaW5lc2MgPT0gRVNfR09URVNDKQkvKiBEb24ndCB3cml0ZSBFU0MgeWV0ICovCisJCSAgICAgIGNvbnRpbnVlOworCQkgICAgZWxzZSBpZiAob2xkZXNjID09IEVTX0dPVEVTQyAmJiAhYXBjYWN0aXZlKSB7CisJCQlja2NwdXRjKEVTQyk7CS8qIFdyaXRlIHNhdmVkIEVTQyAqLworCQkJaWYgKHNlc2xvZyAmJiAhc2Vzc2Z0KQorCQkJICBsb2djaGFyKChjaGFyKUVTQyk7CisJCSAgICB9IGVsc2UgaWYgKGFwY3JjKSB7CS8qIFdlIGhhdmUgYW4gQVBDICovCisJCQlkZWJ1ZyhGMTExLCJDT05ORUNUIEFQQyBjb21wbGV0ZSIsYXBjYnVmLGFwY2xlbmd0aCk7CisJCQlja2NwdXRmKCk7CQkvKiBGb3JjZSBzY3JlZW4gdXBkYXRlICovCisJCQlwaXBlbXNnKENFVl9BUEMpOwkvKiBOb3RpZnkgcGFyZW50ICovCisJCQl3cml0ZSh4cGlwZVsxXSwKKwkJCSAgICAgIChjaGFyICopJmFwY2xlbmd0aCwKKwkJCSAgICAgIHNpemVvZihhcGNsZW5ndGgpCisJCQkgICAgICApOworCQkJLyogV3JpdGUgYnVmZmVyIGluY2x1ZGluZyB0cmFpbGluZyBOVUwgYnl0ZSAqLworCisJCQl3cml0ZSh4cGlwZVsxXSwgYXBjYnVmLCBhcGNsZW5ndGgrMSk7CisKKwkJCS8qIENvcHkgb3VyIGlucHV0IGJ1ZmZlciB0byB0aGUgcGFyZW50IGZvcmsgKi8KKworCQkJZGVidWcoRjEwMSwiQ09OTkVDVCBBUEMgY29tcGxldGUgaWJjIiwiIixpYmMpOworCQkJZGVidWcoRjEwMSwiQ09OTkVDVCBBUEMgY29tcGxldGUgb2JjIiwiIixvYmMpOworCQkJd3JpdGUoeHBpcGVbMV0sIChjaGFyICopJmliYywgc2l6ZW9mKGliYykpOworCQkJaWYgKGliYyA+IDApIHsKKwkJCSAgICB3cml0ZSh4cGlwZVsxXSwgKGNoYXIgKikmaWJwLCBzaXplb2YoaWJwKSk7CisJCQkgICAgd3JpdGUoeHBpcGVbMV0sIGlicCwgaWJjKTsKKwkJCX0KKwkJCWNrX3NuZG1zZygpOwkvKiBXYWl0IHRvIGJlIGtpbGxlZCAqLworCQkJLyogTk9UUkVBQ0hFRCAqLworCQkgICAgfQorCQl9CisjZW5kaWYgLyogQ0tfQVBDICovCisjZW5kaWYgLyogTk9FU0NTRVEgKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgaW54Y291bnQ7IGkrKykgeyAvKiBMb29wIHRocnUgKi8KKwkJICAgIGMgPSBpbnhidWZbaV07CS8qIGlucHV0IGV4cGFuc2lvbiBidWZmZXIuLi4gKi8KKwkJICAgIGlmICgKKyNpZmRlZiBDS19BUEMKKwkJCSFhcGNhY3RpdmUJLyogSWdub3JlIEFQQyBzZXF1ZW5jZXMgKi8KKyNlbHNlCisJCQkxCisjZW5kaWYgLyogQ0tfQVBDICovCisJCQkpIHsKKwkJCWMgJj0gY21kbXNrOwkvKiBBcHBseSBjb21tYW5kIG1hc2suICovCisJCQlpZiAoYyA9PSBDUiAmJiB0dF9jcmQpIHsgLyogU0VUIFRFUk0gQ1ItRElTUExBIENSTEY/ICovCisJCQkgICAgY2tjcHV0YyhjKTsJLyogWWVzLCBvdXRwdXQgQ1IgKi8KKwkJCSAgICBpZiAoc2VzbG9nICYmICFzZXNzZnQpCisJCQkgICAgICBsb2djaGFyKChjaGFyKWMpOworCQkJICAgIGMgPSBMRjsJLyogYW5kIGluc2VydCBhIGxpbmVmZWVkICovCisJCQl9CisJCQlja2NwdXRjKGMpOwkvKiBXcml0ZSBjaGFyYWN0ZXIgdG8gc2NyZWVuICovCisJCSAgICB9CisJCSAgICBpZiAoc2VzbG9nICYmICFzZXNzZnQpIC8qIEhhbmRsZSBzZXNzaW9uIGxvZyAqLworCQkgICAgICBsb2djaGFyKChjaGFyKWMpOworI2lmZGVmIENLX1RSSUdHRVIKKwkJICAgIC8qIENoZWNrIGZvciB0cmlnZ2VyIHN0cmluZyAqLworCQkgICAgaWYgKHR0X3RyaWdnZXJbMF0pIGlmICgoaXggPSBhdXRvZXhpdGNoaygoQ0hBUiljKSkgPiAtMSkgeworCQkJY2tjcHV0ZigpOwkvKiBGb3JjZSBzY3JlZW4gdXBkYXRlICovCisjaWZkZWYgTk9TRVRCVUYKKwkJCWZmbHVzaChzdGRvdXQpOwkvKiBJIG1lYW4gcmVhbGx5IGZvcmNlIGl0ICovCisjZW5kaWYgLyogTk9TRVRCVUYgKi8KKwkJCXBpcGVtc2coQ0VWX1RSSSk7IC8qIFNlbmQgdXAgdHJpZ2dlciBpbmRpY2F0aW9uICovCisJCQl3cml0ZSh4cGlwZVsxXSwgKGNoYXIgKikmaXgsIHNpemVvZihpeCkpOyAvKiBpbmRleCAqLworCQkJd3JpdGUoeHBpcGVbMV0sIChjaGFyICopJmliYywgc2l6ZW9mKGliYykpOworCQkJaWYgKGliYyA+IDApIHsKKwkJCSAgICB3cml0ZSh4cGlwZVsxXSwgKGNoYXIgKikmaWJwLCBzaXplb2YoaWJwKSk7CisJCQkgICAgd3JpdGUoeHBpcGVbMV0sIGlicCwgaWJjKTsKKwkJCX0KKwkJCWRlYnVnKEYxMDAsIkNPTk5FQ1QgY29uY2xkIHRyaWdnZXIiLCIiLDApOworCQkJY2tfc25kbXNnKCk7CS8qIFdhaXQgdG8gYmUga2lsbGVkICovCisJCQlhY3RpdmUgPSAwOwkvKiBTaG91bGRuJ3QgYmUgbmVjZXNzYXJ5Li4uICovCisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIC8qIE5PVFJFQUNIRUQgKi8KKyNlbmRpZiAvKiBDS19UUklHR0VSICovCisJCX0KKwkgICAgfQorI2lmZGVmIEFOWVgyNQorCX0KKyNlbmRpZiAvKiBBTllYMjUgKi8KKyAgICB9Cit9CisKKworLyogIEMgTyBOIEUgQyBUICAtLSAgSW50ZXJhY3RpdmUgdGVybWluYWwgY29ubmVjdGlvbiAgKi8KKworaW50Citjb25lY3QoKSB7CisgICAgaW50CW47CQkJLyogR2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIgKi8KKyAgICBpbnQgaTsJCQkvKiBGb3IgbG9vcHMuLi4gKi8KKyAgICBpbnQgYzsJCQkvKiBjIGlzIGEgY2hhcmFjdGVyLCBidXQgbXVzdCBiZSBzaWduZWQKKwkJCQkgICBpbnRlZ2VyIHRvIHBhc3MgdGhydSAtMSwgd2hpY2ggaXMgdGhlCisJCQkJICAgbW9kZW0gZGlzY29ubmVjdGlvbiBzaWduYWwsIGFuZCBpcworCQkJCSAgIGRpZmZlcmVudCBmcm9tIHRoZSBjaGFyYWN0ZXIgMDM3NyAqLworICAgIGludCBjMjsJCQkvKiBBIGNvcHkgb2YgYyAqLworICAgIGludCBjc2F2ZTsJCQkvKiBBbm90aGVyIGNvcHkgb2YgYyAqLworI2lmbmRlZiBOT0VTQ1NFUQorICAgIGludCBhcGNyYzsKKyNlbmRpZiAvKiBOT0VTQ1NFUSAqLworCisgICAgaW50IGNvbnJldCA9IDA7CQkJLyogUmV0dXJuIHZhbHVlIGZyb20gY29uZWN0KCkgKi8KKyAgICBpbnQgbXNnZmxnID0gMDsKKyAgICAvKiBqYmNoa3N1bSA9IC0xTDsgKi8KKyAgICBqYnNldCA9IDA7CQkJCS8qIGptcF9idWYgbm90IHNldCB5ZXQsIGRvbid0IHVzZSBpdCAqLworICAgIGRlYm9rID0gMTsKKworICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgZm9yayBzaWduYWwiLCIiLENLX0ZPUktfU0lHKTsKKyAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGVudHJ5IHBpZCIsIiIscGlkKTsKKworICAgIG1zZ2ZsZyA9ICFxdWlldAorI2lmZGVmIENLX0FQQworICAgICAgJiYgIWFwY2FjdGl2ZQorI2VuZGlmIC8qIENLX0FQQyAqLworCTsKKy8qCisgIFRoZSBmb2xsb3dpbmcgaXMgdG8gaGFuZGxlIGEgZm9yayBsZWZ0IGJlaGluZCBpZiB3ZSBleGl0IENPTk5FQ1QgbW9kZQorICB3aXRob3V0IGtpbGxpbmcgaXQsIGFuZCB0aGVuIHJldHVybiB0byBDT05ORUNUIG1vZGUuICBUaGlzIGhhcHBlbmVkIGluCisgIEhQLVVYLCB3aGVyZSB0aGUgUmVzZXQga2V5IHdvdWxkIHJhaXNlIFNJR0lOVCBldmVuIHRob3VnaCBTSUdJTlQgd2FzIHNldCB0bworICBTSUdfSUdOLiAgVGhlIGNvZGUgYmVsb3cgZml4ZXMgdGhlIHN5bXB0b207IHRoZSByZWFsIGZpeCBpcyBpbiB0aGUgbWFpbgorICBTSUdJTlQgaGFuZGxlciAoaWYgU0lHSU5UIHNob3dzIHVwIGR1cmluZyBDT05ORUNULCBqdXN0IHJldHVybiByYXRoZXIgdGhhbgorICB0YWtpbmcgdGhlIGxvbmdqbXApLgorKi8KKyAgICBpZiAocGlkKSB7CQkJCS8qIFRoaXMgc2hvdWxkIGJlIDAgKi8KKwlpbnQgeCA9IDA7CisJZGVidWcoRjEwMSwiQ09OTkVDVCBlbnRyeSBraWxsaW5nIHN0YWxlIHBpZCIsIiIscGlkKTsKKwlwcmludGYoIldBUk5JTkc6IE9sZCBDT05ORUNUIGZvcmsgc2VlbXMgdG8gYmUgYWN0aXZlLlxuIik7CisJcHJpbnRmKCJBdHRlbXB0aW5nIHRvIHJlbW92ZSBpdC4uLiIpOworI2lmZGVmIEJFT1NPUkJFQk9YCisJeworCSAgICBsb25nIHJldF92YWw7CisJICAgIHggPSBraWxsKHBpZCxTSUdLSUxMVEhSKTsgLyogS2lsbCBsb3dlciBmb3JrICovCisJICAgIHdhaXRfZm9yX3RocmVhZCAocGlkLCAmcmV0X3ZhbCk7CisJfQorI2Vsc2UKKyNpZmRlZiBQbGFuOQorCXggPSBraWxsKHBpZCxTSUdLSUxMKTsJCS8qIEtpbGwgbG93ZXIgZm9yayAqLworI2Vsc2UKKwl4ID0ga2lsbChwaWQsOSk7CisjZW5kaWYgLyogUGxhbjkgKi8KKyNlbmRpZiAvKiBCRU9TT1JCRUJPWCAqLworCXdhaXQoKFdBSVRfVCAqKTApOwkJLyogV2FpdCB0aWxsIGdvbmUuICovCisJaWYgKHggPCAwKSB7CisJICAgIHByaW50ZigiRVJST1I6IEZhaWx1cmUgdG8ga2lsbCBwaWQgJWQ6ICVzLCBlcnJubz0lZFxuIiwKKwkJICAgKGludCkgcGlkLCBja19lcnJzdHIoKSwgZXJybm8pOworCSAgICBkZWJ1ZyhGMTExLCJDT05ORUNUIGVycm9yIGtpbGxpbmcgc3RhbGUgcGlkIixja19lcnJzdHIoKSxwaWQpOworCX0KKwlwaWQgPSAoUElEX1QpIDA7CisJcHJpbnRmKCJcbiIpOworICAgIH0KKyAgICBzaWduYWwoQ0tfRk9SS19TSUcsIFNJR19JR04pOwkvKiBJbml0aWFsIENLX0ZPUktfU0lHIGhhbmRsaW5nLCAqLworLyoKKyAgVGhlIGZvbGxvd2luZyB0dGltb2ZmKCkgY2FsbCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSwgYnV0IGV2aWRlbnRseSB0aGVyZQorICBhcmUgY2FzZXMgd2hlcmUgYSB0aW1lciBpcyBsZWZ0IGFjdGl2ZSBhbmQgdGhlbiBnb2VzIG9mZiwgdGFraW5nIGEgbG9uZ2ptcAorICB0byBub3doZXJlIGFmdGVyIHRoZSBwcm9ncmFtJ3Mgc3RhY2sgaGFzIGNoYW5nZWQuICBJbiBhbnkgY2FzZSwgdGhpcyBpcworICBzYWZlIGJlY2F1c2UgdGhlIENPTk5FQ1QgbW9kdWxlIHVzZXMgbm8gdGltZXIgb2YgYW55IGtpbmQsIGFuZCBubyBvdGhlciB0aW1lcgorICBzaG91bGQgYmUgYXJtZWQgd2hpbGUgS2VybWl0IGlzIGluIENPTk5FQ1QgbW9kZS4KKyovCisgICAgdHRpbW9mZigpOwkJCQkvKiBUdXJuIG9mZiBhbnkgdGltZXIgaW50ZXJydXB0cyAqLworCisjaWZkZWYgQ0tfVFJJR0dFUgorICAgIG1ha2VzdHIoJnRyaWdnZXJ2YWwsTlVMTCk7CQkvKiBSZXNldCB0cmlnZ2VyICovCisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworCisgICAgaWYgKCFsb2NhbCkgeworI2lmZGVmIE5FVENPTk4KKwlwcmludGYoIlNvcnJ5LCB5b3UgbXVzdCBTRVQgTElORSBvciBTRVQgSE9TVCBmaXJzdFxuIik7CisjZWxzZQorCXByaW50ZigiU29ycnksIHlvdSBtdXN0IFNFVCBMSU5FIGZpcnN0XG4iKTsKKyNlbmRpZiAvKiBORVRDT05OICovCisJZ290byBjb25yZXQwOworICAgIH0KKyAgICBpZiAoc3BlZWQgPCAwTCAmJiBuZXR3b3JrID09IDAgJiYgdHRmZGZsZyA9PSAwKSB7CisJcHJpbnRmKCJTb3JyeSwgeW91IG11c3QgU0VUIFNQRUVEIGZpcnN0XG4iKTsKKwlnb3RvIGNvbnJldDA7CisgICAgfQorI2lmZGVmIFRDUFNPQ0tFVAorICAgIGlmIChuZXR3b3JrICYmIChuZXR0eXBlICE9IE5FVF9UQ1BCKQorI2lmZGVmIFNVTlgyNQorICAgICAgICAmJiAobmV0dHlwZSAhPSBORVRfU1gyNSkKKyNlbmRpZiAvKiBTVU5YMjUgKi8KKyNpZmRlZiBJQk1YMjUKKwkmJiAobmV0dHlwZSAhPSBORVRfSVgyNSkKKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNpZmRlZiBORVRDTUQKKyAgICAgICAgJiYgKG5ldHR5cGUgIT0gTkVUX0NNRCkKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICAgICAmJiAobmV0dHlwZSAhPSBORVRfUFRZKQorI2VuZGlmIC8qIE5FVFBUWSAqLworICAgICkgeworCXByaW50ZigiU29ycnksIG5ldHdvcmsgdHlwZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwlnb3RvIGNvbnJldDA7CisgICAgfQorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCisjaWZkZWYgRFlOQU1JQworICAgIGlmICghaWJ1ZikgeworCWlmICghKGlidWYgPSBtYWxsb2MoSUJVRkwrMSkpKSB7IC8qIEFsbG9jYXRlIGlucHV0IGxpbmUgYnVmZmVyICovCisJICAgIHByaW50ZigiU29ycnksIENPTk5FQ1QgaW5wdXQgYnVmZmVyIGNhbid0IGJlIGFsbG9jYXRlZFxuIik7CisJICAgIGdvdG8gY29ucmV0MDsKKwl9IGVsc2UgeworCSAgICBpYnAgPSBpYnVmOworCSAgICBpYmMgPSAwOworCX0KKyAgICB9CisgICAgaWYgKCFvYnVmKSB7CisJaWYgKCEob2J1ZiA9IG1hbGxvYyhPQlVGTCsxKSkpIHsgICAgLyogQWxsb2NhdGUgb3V0cHV0IGxpbmUgYnVmZmVyICovCisJICAgIHByaW50ZigiU29ycnksIENPTk5FQ1Qgb3V0cHV0IGJ1ZmZlciBjYW4ndCBiZSBhbGxvY2F0ZWRcbiIpOworCSAgICBnb3RvIGNvbnJldDA7CisJfSBlbHNlIHsKKwkgICAgb2JwID0gb2J1ZjsKKwkgICAgb2JjID0gMDsKKwl9CisgICAgfQorICAgIGlmICgha2J1ZikgeworCWlmICghKGtidWYgPSBtYWxsb2MoS0JVRkwrMSkpKSB7IC8qIEFsbG9jYXRlIGtleWJvYXJkIGlucHV0IGJ1ZmZlciAqLworCSAgICBwcmludGYoIlNvcnJ5LCBDT05ORUNUIGtleWJvYXJkIGJ1ZmZlciBjYW4ndCBiZSBhbGxvY2F0ZWRcbiIpOworCSAgICBnb3RvIGNvbnJldDA7CisJfQorICAgIH0KKyAgICBpZiAoIXRlbXApIHsKKwlpZiAoISh0ZW1wID0gbWFsbG9jKFRNUExFTisxKSkpIHsgLyogQWxsb2NhdGUgdGVtcG9yYXJ5IGJ1ZmZlciAqLworCSAgICBwcmludGYoIlNvcnJ5LCBDT05ORUNUIHRlbXBvcmFyeSBidWZmZXIgY2FuJ3QgYmUgYWxsb2NhdGVkXG4iKTsKKwkgICAgZ290byBjb25yZXQwOworCX0KKyAgICB9CisjZWxzZQorI2lmZGVmIENPTU1FTlQKKyAgICBpYnAgPSBpYnVmOworICAgIGliYyA9IDA7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIG9icCA9IG9idWY7CisgICAgb2JjID0gMDsKKyNlbmRpZiAvKiBEWU5BTUlDICovCisKKyAgICBrYnAgPSBrYnVmOwkJCQkvKiBBbHdheXMgY2xlYXIgdGhlc2UuICovCisgICAgKmticCA9IE5VTDsJCQkJLyogTm8gbmVlZCB0byBwcmVzZXJ2ZSB0aGVtIGJldHdlZW4gKi8KKyAgICBrYmMgPSAwOwkJCQkvKiBDT05ORUNUIHNlc3Npb25zLiAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisJZGVidWcoRjEwMSwiQ09OTkVDVCBjb25lY3QgZW50cnkgdHR5ZmQiLCIiLHR0eWZkKTsKKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIGNvbmVjdCBlbnRyeSBpYmMiLCIiLGliYyk7CisJZGVidWcoRjEwMSwiQ09OTkVDVCBjb25lY3QgZW50cnkgb2JjIiwiIixvYmMpOworCWRlYnVnKEYxMDEsIkNPTk5FQ1QgY29uZWN0IGVudHJ5IGtiYyIsIiIsa2JjKTsKKyNpZmRlZiBDS19UUklHR0VSCisJZGVidWcoRjExMCwiQ09OTkVDVCBjb25lY3QgdHJpZ2dlciIsdHRfdHJpZ2dlclswXSwwKTsKKyNlbmRpZiAvKiBDS19UUklHR0VSICovCisJaWYgKHR0eWZkID4gLTEpIHsKKwkgICAgbiA9IHR0Y2hrKCk7CisJICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgY29uZWN0IGVudHJ5IHR0Y2hrIiwiIixuKTsKKwl9CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyAgICBpZiAodHR5ZmQgPCAwKSB7CQkJLyogSWYgY29tbXVuaWNhdGlvbiBkZXZpY2Ugbm90IG9wZW4gKi8KKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIHR0bnByb3RvIiwiIix0dG5wcm90byk7CisJZGVidWcoRjExMSwiQ09OTkVDVCBvcGVuaW5nIix0dG5hbWUsMCk7IC8qIE9wZW4gaXQgbm93ICovCisJaWYgKHR0b3Blbih0dG5hbWUsCisJCSAgICZsb2NhbCwKKwkJICAgbmV0d29yayA/IC1uZXR0eXBlIDogbWRtdHlwLAorCQkgICAwCisJCSAgICkgPCAwKSB7CisJICAgIGNrbWFrbXNnKHRlbXAsVE1QTEVOLCJTb3JyeSwgY2FuJ3Qgb3BlbiAiLHR0bmFtZSxOVUxMLE5VTEwpOworCSAgICBwZXJyb3IodGVtcCk7CisJICAgIGRlYnVnKEYxMTAsIkNPTk5FQ1Qgb3BlbiBmYWlsdXJlIix0dG5hbWUsMCk7CisJICAgIGdvdG8gY29ucmV0MDsKKwl9CisjaWZkZWYgSUtTX09QVElPTgorCS8qIElmIHBlZXIgaXMgaW4gS2VybWl0IHNlcnZlciBtb2RlLCByZXR1cm4gbm93LiAqLworCWlmIChURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQpCisJICByZXR1cm4oMCk7CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworICAgIH0KKyAgICBkb2hhbmd1cCA9IDA7CQkJLyogSGFuZ3VwIG5vdCByZXF1ZXN0ZWQgeWV0ICovCisjaWZkZWYgQU5ZWDI1CisgICAgZG94MjVjbHIgPSAwOwkJCS8qIFguMjUgY2xlYXIgbm90IHJlcXVlc3RlZCB5ZXQgKi8KKyNlbmRpZiAvKiBBTllYMjUgKi8KKworICAgIGlmIChtc2dmbGcpIHsKKyNpZmRlZiBORVRDT05OCisJaWYgKG5ldHdvcmspIHsKKwkgICAgaWYgKHR0cGlwZSkKKwkgICAgICBwcmludGYoIkNvbm5lY3RpbmcgdmlhIGNvbW1hbmQgXCIlc1wiIix0dG5hbWUpOworCSAgICBlbHNlCisJICAgICAgcHJpbnRmKCJDb25uZWN0aW5nIHRvIGhvc3QgJXMiLHR0bmFtZSk7CisjaWZkZWYgQU5ZWDI1CisJICAgIGlmIChuZXR0eXBlID09IE5FVF9TWDI1IHx8IG5ldHR5cGUgPT0gTkVUX0lYMjUpCisJICAgICAgcHJpbnRmKCIsIExpbmsgSUQgJWQsIExDTiAlZCIsbGlua2lkLGxjbik7CisjZW5kaWYgLyogQU5ZWDI1ICovCisJfSBlbHNlIHsKKyNlbmRpZiAvKiBORVRDT05OICovCisJICAgIHByaW50ZigiQ29ubmVjdGluZyB0byAlcyIsdHRuYW1lKTsKKwkgICAgaWYgKHNwZWVkID4gLTFMKSBwcmludGYoIiwgc3BlZWQgJWxkIixzcGVlZCk7CisjaWZkZWYgTkVUQ09OTgorCX0KKyNlbmRpZiAvKiBORVRDT05OICovCisJaWYgKHR0X2VzY2FwZSkgeworCSAgICBwcmludGYoIlxyXG4iKTsKKwkgICAgc2hvZXNjKGVzY2FwZSk7CisJICAgIHByaW50ZigiVHlwZSB0aGUgZXNjYXBlIGNoYXJhY3RlciBmb2xsb3dlZCBieSBDIHRvIGdldCBiYWNrLFxyXG4iKTsKKwkgICAgcHJpbnRmKCJvciBmb2xsb3dlZCBieSA/IHRvIHNlZSBvdGhlciBvcHRpb25zLlxyXG4iKTsKKwl9IGVsc2UgeworCSAgICBwcmludGYoIi5cclxuXG5FU0NBUEUgQ0hBUkFDVEVSIElTIERJU0FCTEVEXHJcblxuIik7CisJfQorCWlmIChzZXNsb2cpIHsKKwkgICAgZXh0ZXJuIGludCBzbG9ndHM7CisJICAgIGNoYXIgKiBzID0gIiI7CisJICAgIHN3aXRjaCAoc2Vzc2Z0KSB7CisJICAgICAgY2FzZSBYWUZUX0Q6CisJCXMgPSAiZGVidWciOyBicmVhazsKKwkgICAgICBjYXNlIFhZRlRfVDoKKwkJcyA9IHNsb2d0cyA/ICJ0aW1lc3RhbXBlZC10ZXh0IiA6ICJ0ZXh0IjsgYnJlYWs7CisJICAgICAgZGVmYXVsdDoKKwkJcyA9ICJiaW5hcnkiOworCSAgICB9CisJICAgIHByaW50ZigiU2Vzc2lvbiBMb2c6ICVzLCAlc1xyXG4iLHNlc2ZpbCxzKTsKKwl9CisJaWYgKGRlYnNlcykgcHJpbnRmKCJEZWJ1Z2dpbmcgRGlzcGxheS4uLilcclxuIik7CisgICAgICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4iKTsKKwlmZmx1c2goc3Rkb3V0KTsKKyAgICB9CisKKy8qIENvbmRpdGlvbiBjb25zb2xlIHRlcm1pbmFsIGFuZCBjb21tdW5pY2F0aW9uIGxpbmUgKi8KKworICAgIGlmIChjb25iaW4oKGNoYXIpZXNjYXBlKSA8IDApIHsKKwlwcmludGYoIlNvcnJ5LCBjYW4ndCBjb25kaXRpb24gY29uc29sZSB0ZXJtaW5hbFxuIik7CisJZ290byBjb25yZXQwOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGNtYXNrIiwiIixjbWFzayk7CisgICAgZGVidWcoRjEwMSwiQ09OTkVDVCBjbWRtc2siLCIiLGNtZG1zayk7CisgICAgZGVidWcoRjEwMSwiQ09OTkVDVCBzcGVlZCBiZWZvcmUgdHR2dCIsIiIsc3BlZWQpOworICAgIGlmICgobiA9IHR0dnQoc3BlZWQsZmxvdykpIDwgMCkgewkvKiBFbnRlciAidmlydHVhbCB0ZXJtaW5hbCIgbW9kZSAqLworCWlmICghbmV0d29yaykgeworCSAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIHR0dnQiLCIiLG4pOworCSAgICB0dGhhbmcoKTsJCQkvKiBIYW5nIHVwIGFuZCBjbG9zZSB0aGUgZGV2aWNlLiAqLworCSAgICB0dGNsb3MoMCk7CisJICAgIGRvbG9nZW5kKCk7CisJICAgIGlmICh0dG9wZW4odHRuYW1lLAkJLyogT3BlbiBpdCBhZ2Fpbi4uLiAqLworCQkgICAgICAgJmxvY2FsLAorCQkgICAgICAgbmV0d29yayA/IC1uZXR0eXBlIDogbWRtdHlwLAorCQkgICAgICAgMAorCQkgICAgICAgKSA8IDApIHsKKwkJY2ttYWttc2codGVtcCxUTVBMRU4sIlNvcnJ5LCBjYW4ndCByZW9wZW4gIix0dG5hbWUsTlVMTCxOVUxMKTsKKwkJcGVycm9yKHRlbXApOworCQlnb3RvIGNvbnJldDA7CisJICAgIH0KKyNpZmRlZiBJS1NfT1BUSU9OCisJICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQpCisJICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKwkgICAgaWYgKHR0dnQoc3BlZWQsZmxvdykgPCAwKSB7CS8qIFRyeSB2aXJ0dWFsIHRlcm1pbmFsIG1vZGUgYWdhaW4uICovCisJCWNvbnJlcygpOwkJLyogRmFpbHVyZSB0aGlzIHRpbWUgaXMgZmF0YWwuICovCisJCXByaW50ZigiU29ycnksIENhbid0IGNvbmRpdGlvbiBjb21tdW5pY2F0aW9uIGxpbmVcbiIpOworCQlnb3RvIGNvbnJldDA7CisJICAgIH0KKwl9CisgICAgfQorICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgdHR2dCBvaywgZXNjYXBlIiwiIixlc2NhcGUpOworCisgICAgZGVidWcoRjEwMSwiQ09OTkVDVCBjYXJyaWVyLXdhdGNoIiwiIixjYXJyaWVyKTsKKyAgICBpZiAoKCFuZXR3b3JrIAorI2lmZGVmIFROX0NPTVBPUlQKKwkgIHx8IGlzdG5jb21wb3J0KCkKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisJICkgJiYgKGNhcnJpZXIgIT0gQ0FSX09GRikpIHsKKwlpbnQgeDsKKwl4ID0gdHRnbWRtKCk7CisJZGVidWcoRjEwMCwiQ09OTkVDVCB0dGdtZG0iLCIiLHgpOworCWlmICgoeCA+IC0xKSAmJiAhKHggJiBCTV9EQ0QpKSB7CisjaWZuZGVmIE5PSElOVFMKKwkgICAgZXh0ZXJuIGludCBoaW50czsKKyNlbmRpZiAvKiBOT0hJTlRTICovCisJICAgIGRlYnVnKEYxMDAsIkNPTk5FQ1QgdHRnbWRtIENEIHRlc3QgZmFpbHMiLCIiLHgpOworCSAgICBjb25yZXMoKTsKKwkgICAgcHJpbnRmKCI/Q2FycmllciByZXF1aXJlZCBidXQgbm90IGRldGVjdGVkLlxuIik7CisjaWZuZGVmIE5PSElOVFMKKwkgICAgaWYgKCFoaW50cykKKwkgICAgICByZXR1cm4oMCk7CisJICAgIHByaW50ZigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCSAgICBwcmludGYoIiBIaW50OiBUbyBDT05ORUNUIHRvIGEgc2VyaWFsIGRldmljZSB0aGF0XG4iKTsKKwkgICAgcHJpbnRmKCIgaXMgbm90IHByZXNlbnRpbmcgdGhlIENhcnJpZXIgRGV0ZWN0IHNpZ25hbCxcbiIpOworCSAgICBwcmludGYoIiBmaXJzdCB0ZWxsIEMtS2VybWl0IHRvOlxuXG4iKTsKKwkgICAgcHJpbnRmKCIgICBTRVQgQ0FSUklFUi1XQVRDSCBPRkZcblxuIik7CisJICAgIHByaW50ZigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7CisjZW5kaWYgLyogTk9ISU5UUyAqLworCSAgICBnb3RvIGNvbnJldDA7CisJfQorCWRlYnVnKEYxMDAsIkNPTk5FQ1QgdHRnbWRtIG9rIiwiIiwwKTsKKyAgICB9CisjaWZuZGVmIE5PQ1NFVFMKKy8qIFNldCB1cCBjaGFyYWN0ZXIgc2V0IHRyYW5zbGF0aW9ucyAqLworCisgICAgdW5pY29kZSA9IDA7CQkJLyogQXNzdW1lIFVuaWNvZGUgd29uJ3QgYmUgaW52b2x2ZWQgKi8KKyAgICB0Y3MgPSAwOwkJCQkvKiAiVHJhbnNmZXIiIG9yICJPdGhlciIgY2hhcnNldCAqLworICAgIHN4byA9IHJ4byA9IE5VTEw7CQkJLyogSW5pdGlhbGl6ZSBieXRlLXRvLWJ5dGUgZnVuY3Rpb25zICovCisgICAgc3hpID0gcnhpID0gTlVMTDsKKyAgICBpZiAodGNzciAhPSB0Y3NsKSB7CQkJLyogUmVtb3RlIGFuZCBsb2NhbCBzZXRzIGRpZmZlci4uLiAqLworI2lmZGVmIFVOSUNPREUKKwlpZiAodGNzciA9PSBGQ19VVEY4IHx8CQkvKiBSZW1vdGUgY2hhcnNldCBpcyBVVEYtOCAqLworCSAgICB0Y3NsID09IEZDX1VURjgpIHsJCS8qIG9yIGxvY2FsIG9uZSBpcy4gKi8KKwkgICAgeHVmID0geGxfdWZjW3Rjc2xdOwkJLyogSW5jb21pbmcgVW5pY29kZSB0byBsb2NhbCAqLworCSAgICBpZiAoeHVmIHx8IHRjc2wgPT0gRkNfVVRGOCkgeworCQl0Y3MgPSAodGNzciA9PSBGQ19VVEY4KSA/IHRjc2wgOiB0Y3NyOyAvKiBUaGUgIm90aGVyIiBzZXQgKi8KKwkJeGZ1ID0geGxfZmN1W3Rjc107CS8qIExvY2FsIGJ5dGUgdG8gcmVtb3RlIFVuaWNvZGUgKi8KKwkJaWYgKHhmdSkKKwkJICB1bmljb2RlID0gKHRjc3IgPT0gRkNfVVRGOCkgPyAxIDogMjsKKwkgICAgfQorCSAgICB0Y3NzaXplID0gZmNzaW5mb1t0Y3NdLnNpemU7IC8qIFNpemUgb2Ygb3RoZXIgY2hhcmFjdGVyIHNldC4gKi8KKwl9IGVsc2UgeworI2VuZGlmIC8qIFVOSUNPREUgKi8KKwkgICAgdGNzID0gZ2V0dGNzKHRjc3IsdGNzbCk7CS8qIEdldCBpbnRlcm1lZGlhdGUgc2V0LiAqLworCSAgICBzeG8gPSB4bHNbdGNzXVt0Y3NsXTsJLyogdHJhbnNsYXRpb24gZnVuY3Rpb24gKi8KKwkgICAgcnhvID0geGxyW3Rjc11bdGNzcl07CS8qIHBvaW50ZXJzIGZvciBvdXRwdXQgZnVuY3Rpb25zICovCisJICAgIHN4aSA9IHhsc1t0Y3NdW3Rjc3JdOwkvKiBhbmQgZm9yIGlucHV0IGZ1bmN0aW9ucy4gKi8KKwkgICAgcnhpID0geGxyW3Rjc11bdGNzbF07CisjaWZkZWYgVU5JQ09ERQorCX0KKyNlbmRpZiAvKiBVTklDT0RFICovCisgICAgfQorLyoKKyAgVGhpcyBpcyB0byBwcmV2ZW50IHVzZSBvZiB6bXN0dWZmKCkgYW5kIHpkc3R1ZmYoKSBieSB0cmFuc2xhdGlvbiBmdW5jdGlvbnMuCisgIFRoZXkgb25seSB3b3JrIHdpdGggZGlzayBpL28sIG5vdCB3aXRoIGNvbW11bmljYXRpb24gaS9vLiAgTHVja2lseSBSdXNzaWFuCisgIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyBkb24ndCBkbyBhbnkgc3R1ZmZpbmcuLi4KKyovCisgICAgbGFuZ3N2ID0gbGFuZ3VhZ2U7CisjaWZuZGVmIE5PQ1lSSUwKKyAgICBpZiAobGFuZ3VhZ2UgIT0gTF9SVVNTSUFOKQorI2VuZGlmIC8qIE5PQ1lSSUwgKi8KKyAgICAgIGxhbmd1YWdlID0gTF9VU0FTQ0lJOworCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworCWRlYnVnKEYxMDEsIkNPTk5FQ1QgdGNzIiwiIix0Y3MpOworCWRlYnVnKEYxMDEsIkNPTk5FQ1QgdGNzbCIsIiIsdGNzbCk7CisJZGVidWcoRjEwMSwiQ09OTkVDVCB0Y3NyIiwiIix0Y3NyKTsKKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIGZjc2luZm9bdGNzbF0uc2l6ZSIsIiIsZmNzaW5mb1t0Y3NsXS5zaXplKTsKKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIGZjc2luZm9bdGNzcl0uc2l6ZSIsIiIsZmNzaW5mb1t0Y3NyXS5zaXplKTsKKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIHVuaWNvZGUiLCIiLHVuaWNvZGUpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIENLX1hZWgorI2lmbmRlZiBYWVpfSU5URVJOQUwKKyAgICB7CisJZXh0ZXJuIGludCBiaW5hcnk7CQkvKiBTZWUgYWJvdXQgWk1PREVNIGF1dG9kb3dubG9hZHMgKi8KKwljaGFyICogczsKKwlzID0gYmluYXJ5ID8gcHRhYltQUk9UT19aXS5wX2JfcmNtZCA6IHB0YWJbUFJPVE9fWl0ucF90X3JjbWQ7CisJaWYgKCFzKSBzID0gIiI7CisJem1kbG9rID0gKCpzICE9IE5VTCk7CQkvKiBPSyBpZiB3ZSBoYXZlIGV4dGVybmFsIGNvbW1hbmRzICovCisgICAgfQorI2VuZGlmIC8qIFhZWl9JTlRFUk5BTCAqLworI2VuZGlmIC8qIENLX1hZWiAqLworCisjaWZuZGVmIE5PRVNDU0VRCisvKgorICBXZSBuZWVkIHRvIGFjdGl2YXRlIHRoZSBlc2NhcGUtc2VxdWVuY2UgcmVjb2duaXRpb24gZmVhdHVyZSB3aGVuOgorICAgKGEpIHRyYW5zbGF0aW9uIGlzIGVsZWN0ZWQsIEFORAorICAgKGIpIHRoZSBsb2NhbCBhbmQvb3IgcmVtb3RlIHNldCBpcyBhIDctYml0IHNldCBvdGhlciB0aGFuIFVTIEFTQ0lJLgorICBPcjoKKyAgIFNFVCBURVJNSU5BTCBBUEMgaXMgbm90IE9GRiAoaGFuZGxlZCBpbiB0aGUgbmV4dCBzdGF0ZW1lbnQpLgorKi8KKyAgICBlc2NzZXEgPSAodGNzICE9IFRDX1RSQU5TUCkgJiYJLyogTm90IHRyYW5zcGFyZW50ICovCisgICAgICAoZmNzaW5mb1t0Y3NsXS5zaXplID09IDEyOCB8fCBmY3NpbmZvW3Rjc3JdLnNpemUgPT0gMTI4KSAmJiAvKiA3IGJpdHMgKi8KKwkoZmNzaW5mb1t0Y3NsXS5jb2RlICE9IEZDX1VTQVNDSUkpOyAvKiBCdXQgbm90IEFTQ0lJICovCisjZW5kaWYgLyogTk9FU0NTRVEgKi8KKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyNpZm5kZWYgTk9FU0NTRVEKKyNpZmRlZiBDS19BUEMKKyAgICBlc2NzZXEgPSBlc2NzZXEgfHwgKGFwY3N0YXR1cyAmIEFQQ19PTik7CisgICAgYXBjYWN0aXZlID0gMDsJCQkvKiBBbiBBUEMgY29tbWFuZCBpcyBub3QgYWN0aXZlICovCisgICAgYXBjbGVuZ3RoID0gMDsJCQkvKiAuLi4gKi8KKyNlbmRpZiAvKiBDS19BUEMgKi8KKyAgICBpbmVzYyA9IEVTX05PUk1BTDsJCQkvKiBJbml0aWFsIHN0YXRlIG9mIHJlY29nbml6ZXIgKi8KKyAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGVzY3NlcSIsIiIsZXNjc2VxKTsKKyNlbmRpZiAvKiBOT0VTQ1NFUSAqLworCisgICAgcGFyZW50X2lkID0gZ2V0cGlkKCk7CQkvKiBHZXQgcGFyZW50J3MgcGlkIGZvciBzaWduYWxsaW5nICovCisgICAgZGVidWcoRjEwMSwiQ09OTkVDVCBwYXJlbnQgcGlkIiwiIixwYXJlbnRfaWQpOworCisgICAgaWYgKHhwaXBlWzBdID4gLTEpCQkJLyogSWYgb2xkIHBpcGUgaGFuZ2luZyBhcm91bmQsIGNsb3NlICovCisgICAgICBjbG9zZSh4cGlwZVswXSk7CisgICAgeHBpcGVbMF0gPSAtMTsKKyAgICBpZiAoeHBpcGVbMV0gPiAtMSkKKyAgICAgIGNsb3NlKHhwaXBlWzFdKTsKKyAgICB4cGlwZVsxXSA9IC0xOworICAgIGdvdGVyciA9IDA7CQkJCS8qIEVycm9yIGZsYWcgZm9yIHBpcGUgJiBmb3JrICovCisgICAgaWYgKHBpcGUoeHBpcGUpICE9IDApIHsJCS8qIENyZWF0ZSBuZXcgcGlwZSB0byBwYXNzIGluZm8gKi8KKwlwZXJyb3IoIkNhbid0IG1ha2UgcGlwZSIpOwkvKiBiZXR3ZWVuIGZvcmtzLiAqLworCWRlYnVnKEYxMDEsIkNPTk5FQ1QgcGlwZSBlcnJvciIsIiIsZXJybm8pOworCWdvdGVyciA9IDE7CisgICAgfSBlbHNlCisjaWZkZWYgQkVPU09SQkVCT1gKKyAgICB7CisgICAgICAgIHBpZCA9IHNwYXduX3RocmVhZChjb25jbGQsICJMb3dlciBGb3JrIiwgQl9OT1JNQUxfUFJJT1JJVFksIE5VTEwpOworICAgICAgICByZXN1bWVfdGhyZWFkKHBpZCk7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoKHBpZCA9IGZvcmsoKSkgPT0gKFBJRF9UKSAtMSkgeyAvKiBQaXBlIE9LLCBtYWtlIHBvcnQgZm9yay4gKi8KKwlwZXJyb3IoIkNhbid0IG1ha2UgcG9ydCBmb3JrIik7CisJZGVidWcoRjEwMSwiQ09OTkVDVCBmb3JrIGVycm9yIiwiIixlcnJubyk7CisJZ290ZXJyID0gMTsKKyAgICB9CisjZW5kaWYgLyogQkVPU09SQkVCT1ggKi8KKyAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGNyZWF0ZWQgZm9yaywgcGlkIiwiIixwaWQpOworICAgIGlmIChnb3RlcnIpIHsJCQkvKiBGYWlsZWQgdG8gbWFrZSBwaXBlIG9yIGZvcmsgKi8KKwljb25yZXMoKTsJCQkvKiBSZXNldCB0aGUgY29uc29sZS4gKi8KKwlpZiAobXNnZmxnKSB7CisJICAgIHByaW50ZigiXHJcbkNvbW11bmljYXRpb25zIGRpc2Nvbm5lY3QgKEJhY2sgYXQgJXMpXHJcbiIsCisJCSAgICpteWhvc3QgPworCQkgICBteWhvc3QgOgorI2lmZGVmIFVOSVgKKwkJICAgImxvY2FsIFVOSVggc3lzdGVtIgorI2Vsc2UKKwkJICAgImxvY2FsIHN5c3RlbSIKKyNlbmRpZiAvKiBVTklYICovCisJCSAgICk7CisJfQorCXByaW50ZigiXG4iKTsKKwl3aGF0ID0gV19OT1RISU5HOwkJLyogU28gY29uc29sZSBtb2RlcyBhcmUgc2V0IHJpZ2h0LiAqLworI2lmbmRlZiBOT0NTRVRTCisJbGFuZ3VhZ2UgPSBsYW5nc3Y7CQkvKiBSZXN0b3JlIGxhbmd1YWdlICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCXBhcmVudF9pZCA9IChQSURfVCkgMDsJCS8qIENsZWFuIHVwICovCisJZ290byBjb25yZXQxOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGZvcmsgcGlkIiwiIixwaWQpOworCisvKiBVcHBlciBmb3JrIChLRVlCIGZvcmspIHJlYWRzIGtleXN0cm9rZXMgYW5kIHNlbmRzIHRoZW0gb3V0LiAqLworCisgICAgaWYgKHBpZCkgewkJCQkvKiBwaWQgIT0gMCwgc28gSSBhbSB0aGUgdXBwZXIgZm9yay4gKi8KKy8qCisgIEJlZm9yZSBkb2luZyBhbnl0aGluZyBzaWduaWZpY2FudCwgdGhlIGNoaWxkIGZvcmsgbXVzdCB3YWl0IGZvciBhIGdvLWFoZWFkCisgIGNoYXJhY3RlciBmcm9tIHhwaXBlWzBdLiAgQmVmb3JlIHN0YXJ0aW5nIHRvIHdhaXQsIHdlIGhhdmUgZW5vdWdoIHRpbWUgdG8KKyAgY2xlYXIgYnVmZmVycyBhbmQgc2V0IHVwIHRoZSBzaWduYWwgaGFuZGxlci4gIFdoZW4gZG9uZSB3aXRoIHRoaXMsIHdlIHdpbGwKKyAgYWxsb3cgdGhlIGNoaWxkIHRvIGNvbnRpbnVlIGJ5IHNhdGlzZnlpbmcgaXRzIHBlbmRpbmcgcmVhZC4KKworICBSZW1lbWJlciB0aGUgY2hpbGQgYW5kIHBhcmVudCBoYXZlIHNlcGFyYXRlIGFkZHJlc3Mgc3BhY2UuICBUaGUgY2hpbGQgaGFzCisgIGl0cyBvd24gY29weSBvZiBpbnB1dCBidWZmZXJzLCBzbyB3ZSBtdXN0IGNsZWFyIHRoZSBpbnB1dCBidWZmZXJzIGluIHRoZQorICBwYXJlbnQuICBPdGhlcndpc2Ugc3RyYW5nZSBlZmZlY3RzIG1heSBvY2N1ciwgbGlrZSBjaHVua3Mgb2YgY2hhcmFjdGVycworICByZXBlYXRlZGx5IGVjaG9lZCBvbiB0ZXJtaW5hbCBzY3JlZW4uICBUaGUgY2hpbGQgcHJvY2VzcyBpcyBkZXNpZ25lZCB0bworICBlbXB0eSBpdHMgaW5wdXQgYnVmZmVycyBieSByZWFkaW5nIGFsbCBhdmFpbGFibGUgY2hhcmFjdGVycyBhbmQgZWl0aGVyCisgIGVjaG9pbmcgdGhlbSBvbiB0aGUgdGVybWluYWwgc2NyZWVuIG9yIHNhdmluZyB0aGVtIGZvciBmdXR1cmUgdXNlIGluIHRoZQorICBwYXJlbnQuICBUaGUgbGF0dGVyIGNhc2UgaGFwcGVucyBkdXJpbmcgQVBDIHByb2Nlc3NpbmcgLSBzZWUgdGhlIGNvZGUgYXJvdW5kCisgIENFVl9BUEMgb2NjdXJyZW5jZXMgdG8gc2VlIGhvdyB0aGUgY2hpbGQgcGFzc2VzIGl0cyBpYnVmIGV0YyB0byBwYXJlbnQgdmlhCisgIHhwaXBlLCBmb3IgcHJlc2VydmF0aW9uIHVudGlsIHRoZSBuZXh0IGVudHJ5IHRvIHRoaXMgbW9kdWxlLCB0byBlbnN1cmUgdGhhdAorICBubyBjaGFyYWN0ZXJzIGFyZSBsb3N0IGJldHdlZW4gQ09OTkVDVCBzZXNzaW9ucy4KKyovCisKKy8qCisgIFRoaXMgb25lIG5lZWRzIGEgYml0IG9mIGV4dHJhIGV4cGxhbmF0aW9uLi4uICBJbiBhZGRpdGlvbiB0byB0aGUgQ09OTkVDVAorICBtb2R1bGUncyBvd24gYnVmZmVycywgd2hpY2ggYXJlIGNvbW11bmljYXRlZCBhbmQgc3luY2hyb25pemVkIHZpYSB4cGlwZSwKKyAgdGhlIGxvdy1sZXZlbCBVTklYIGNvbW11bmljYXRpb24gcm91dGluZXMgKHR0aW5jLCB0dHhpbiwgZXRjKSBhcmUgYWxzbworICBidWZmZXJlZCwgc3RhdGljYWxseSwgaW4gdGhlIGNrdXRpby5jIG1vZHVsZS4gIEJ1dCB3aGVuIHRoZSB0d28gQ09OTkVDVAorICBmb3JrcyBzcGxpdCBvZmYsIHRoZSBsb3dlciBmb3JrIGlzIHVwZGF0aW5nIHRoaXMgYnVmZmVyJ3MgcG9pbnRlcnMgYW5kCisgIGNvdW50cywgYnV0IHRoZSB1cHBlciBmb3JrIG5ldmVyIGZpbmRzIG91dCBhYm91dCBpdCBhbmQgc3RpbGwgaGFzIHRoZSBvbGQKKyAgb25lcy4gIFRoZSBmb2xsb3dpbmcgVU5JWC1zcGVjaWZpYyBjYWxsIHRvIHRoZSBja3V0aW8uYyBtb2R1bGUgdGFrZXMgY2FyZQorICBvZiB0aGlzLi4uICBXaXRob3V0IGl0LCB3ZSBnZXQgZHVhbCBlY2hvaW5nIG9mIGluY29taW5nIGNoYXJhY3RlcnMuCisqLworCXR0Zmx1eCgpOworLyoKKyAgQXQgdGhpcyBwb2ludCwgcGVyaGFwcyB5b3UgYXJlIHdvbmRlcmluZyB3aHkgd2UgdXNlIGZvcmtzIGF0IGFsbC4gIEl0IGlzCisgIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIG90aGVyIG1ldGhvZCBwb3J0YWJsZSBhbW9uZyBhbGwgVU5JWCB2YXJpYXRpb25zLgorICBOb3QgdGhyZWFkcywgbm90IHNlbGVjdCgpLCAuLi4gIChZZXMsIHNlbGVjdCgpIGlzIG1vcmUgY29tbW9uIG5vdzsgaXQgbWlnaHQKKyAgYWN0dWFsbHkgYmUgd29ydGggd3JpdGluZyBhIHZhcmlhdGlvbiBvZiB0aGlzIG1vZHVsZSB0aGF0IHdvcmtzIGxpa2UgQlNECisgIFRlbG5ldCwgb25lIGZvcmssIGRyaXZlbiBieSBzZWxlY3QoKSkuCisqLworCWlicCA9IGlidWY7CQkJLyogQ2xlYXIgaWJ1ZltdLiAqLworCWliYyA9IDA7CQkJLyogQ2hpbGQgbm93IGhhcyBpdHMgb3duIGNvcHkgKi8KKwlzaWduYWwoQ0tfRk9SS19TSUcsIHBpcGVpbnQpOwkvKiBIYW5kbGVyIGZvciBtZXNzYWdlcyBmcm9tIGNoaWxkLiAqLworCXdyaXRlKHhwaXBlWzFdLCBpYnVmLCAxKTsJLyogQWxsb3cgY2hpbGQgdG8gcHJvY2VlZCAqLworCWNsb3NlKHhwaXBlWzFdKTsgeHBpcGVbMV0gPSAtMTsgLyogUGFyZW50IC0gcHJldmVudCBmdXR1cmUgd3JpdGVzICovCisKKwl3aGF0ID0gV19DT05ORUNUOwkJLyogS2VlcCB0cmFjayBvZiB3aGF0IHdlJ3JlIGRvaW5nICovCisJYWN0aXZlID0gMTsKKwlkZWJ1ZyhGMTAxLCJDT05ORUNUIGtleWJvYXJkIGZvcmsgZHVwbGV4IiwiIixkdXBsZXgpOworLyoKKyAgQ2F0Y2ggY29tbXVuaWNhdGlvbiBlcnJvcnMgb3IgbW9kZSBjaGFuZ2VzIGluIGxvd2VyIGZvcmsuCisKKyAgTm90ZTogU29tZSBDIGNvbXBpbGVycyAoZS5nLiBDcmF5IFVOSUNPUykgaW50ZXJwcmV0IHRoZSBBTlNJIEMgc3RhbmRhcmQKKyAgYWJvdXQgc2V0am1wKCkgaW4gYSB3YXkgdGhhdCBkaXNhbGxvd3MgY29uc3RydWN0aW9ucyBsaWtlOgorCisgICAgICAgIGlmICgodmFyID0gW3NpZ11zZXRqbXAoZW52KSkgPT0gMCkgLi4uCisKKyAgd2hpY2ggcHJldmVudHMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGNrbG9uZ2ptcCgpIGZyb20gYmVpbmcgdXNlZCBhdCBhbGwuCisgIFNvIHRoZSBzaWduYWwgaGFuZGxlcnMgc2V0IGEgZ2xvYmFsIHZhcmlhYmxlLCBzanZhbCwgaW5zdGVhZC4KKyovCisJaWYgKAorI2lmZGVmIENLX1BPU0lYX1NJRworCSAgICBzaWdzZXRqbXAoY29uX2VudiwxKQorI2Vsc2UKKwkgICAgc2V0am1wKGNvbl9lbnYpCisjZW5kaWYgLyogQ0tfUE9TSVhfU0lHICovCisJICAgID09IDApIHsJCQkvKiBOb3JtYWwgZW50cnkuLi4gKi8KKwkgICAgamJzZXQgPSAxOwkJCS8qIE5vdyB3ZSBoYXZlIGEgbG9uZ2ptcCBidWZmZXIgKi8KKwkgICAgc2p2YWwgPSBDRVZfTk87CQkvKiBJbml0aWFsaXplIHNldGptcCByZXR1cm4gY29kZS4gKi8KKworCSAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIHNldGptcCBub3JtYWwgZW50cnkiLCIiLHNqdmFsKTsKKworI2lmZGVmIEFOWVgyNQorCSAgICBpZiAobmV0d29yayAmJiAobmV0dHlwZSA9PSBORVRfU1gyNSB8fCBuZXR0eXBlID09IE5FVF9JWDI1KSkgeworCQlvYnVmbCA9IDA7CisJCWJ6ZXJvICh4MjVvYnVmLHNpemVvZih4MjVvYnVmKSk7CisJICAgIH0KKyNlbmRpZiAvKiBBTllYMjUgKi8KKy8qCisgIEhlcmUgaXMgdGhlIGJpZyBsb29wIHRoYXQgZ2V0cyBjaGFyYWN0ZXJzIGZyb20gdGhlIGtleWJvYXJkIGFuZCBzZW5kcyB0aGVtCisgIG91dCB0aGUgY29tbXVuaWNhdGlvbiBkZXZpY2UuICBUaGVyZSBhcmUgdHdvIGNvbXBvbmVudHMgdG8gdGhlIGNvbW11bmljYXRpb24KKyAgcGF0aDogdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUga2V5Ym9hcmQgdG8gQy1LZXJtaXQsIGFuZCBmcm9tIEMtS2VybWl0IHRvCisgIHRoZSByZW1vdGUgY29tcHV0ZXIuICBUaGUgdHJlYXRtZW50IG9mIHRoZSA4dGggYml0IG9mIGtleWJvYXJkIGNoYXJhY3RlcnMKKyAgaXMgZ292ZXJuZWQgYnkgU0VUIENPTU1BTkQgQllURVNJWkUgKGNtZG1zaykuICBUaGUgdHJlYXRtZW50IG9mIHRoZSA4dGggYml0CisgIG9mIGNoYXJhY3RlcnMgc2VudCB0byB0aGUgcmVtb3RlIGlzIGdvdmVybmVkIGJ5IFNFVCBURVJNSU5BTCBCWVRFU0laRQorICAoY21hc2spLiAgIFRoaXMgZGlzdGluY3Rpb24gd2FzIGludHJvZHVjZWQgaW4gZWRpdCA1QSgxNjQpLgorKi8KKwkgICAgd2hpbGUgKGFjdGl2ZSkgeworI2lmbmRlZiBOT1NFVEtFWQorCQlpZiAoa21wdHIpIHsJCS8qIEhhdmUgY3VycmVudCBtYWNybz8gKi8KKwkJICAgIGRlYnVnKEYxMDAsIkNPTk5FQ1Qga21wdHIgbm9uIE5VTEwiLCIiLDApOworCQkgICAgaWYgKChjID0gKENIQVIpICprbXB0cisrKSA9PSBOVUwpIHsgLyogR2V0IGNoYXIgZnJvbSBpdCAqLworCQkJa21wdHIgPSBOVUxMOwkvKiBJZiBubyBtb3JlIGNoYXJzLCAgKi8KKwkJCWRlYnVnKEYxMDAsIkNPTk5FQ1QgbWFjcm8gZW1wdHksIGNvbnRpbnVpbmciLCIiLDApOworCQkJY29udGludWU7CS8qIHJlc2V0IHBvaW50ZXIgYW5kIGNvbnRpbnVlICovCisJCSAgICB9CisJCSAgICBkZWJ1ZyhGMDAwLCJDT05ORUNUIGNoYXIgZnJvbSBtYWNybyIsIiIsYyk7CisJCX0gZWxzZQkJCS8qIE5vIG1hY3JvLi4uICovCisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKwkJICBjID0gQ09OR0tTKCk7CQkvKiBSZWFkIGZyb20ga2V5Ym9hcmQgKi8KKworI2lmZGVmIENPTU1FTlQKKy8qIHRvbyBtdWNoLi4uICovCisJCWRlYnVnKEYxMDEsIkNPTk5FQ1QgKiogS0VZQiIsIiIsYyk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgIGlmIChjID09IC0xKSB7CQkvKiBJZiByZWFkKCkgZ290IGFuIGVycm9yLi4uICovCisJCSAgICBkZWJ1ZyhGMTAxLCJDT05ORUNUIGtleWJvYXJkIHJlYWQgZXJybm8iLCIiLGVycm5vKTsKKyNpZmRlZiBDT01NRU5UCisvKgorIFRoaXMgc2VlbXMgdG8gY2F1c2UgcHJvYmxlbXMuICBJZiByZWFkKCkgcmV0dXJucyAtMSwgdGhlIHNpZ25hbCBoYXMgYWxyZWFkeQorIGJlZW4gZGVsaXZlcmVkLCBhbmQgbm90aGluZyB3aWxsIHdha2UgdXAgdGhlIHBhdXNlKCkuCisqLworCQkgICAgcGF1c2UoKTsJCS8qIFdhaXQgZm9yIHRyYW5zbWl0dGVyIHRvIGZpbmlzaC4gKi8KKyNlbHNlCisjaWZkZWYgQTk4NgorLyoKKyAgT24gQWx0b3MgbWFjaGluZXMgd2l0aCBYZW5peCAzLjAsIHByZXNzaW5nIERFTCBpbiBjb25uZWN0IG1vZGUgYnJpbmdzIHVzCisgIGhlcmUgKHJlYXNvbiB1bmtub3duKS4gIFRoZSBjb25zb2xlIGxpbmUgZGlzY2lwbGluZSBhdCB0aGlzIHBvaW50IGhhcworICBpbnRyID0gXkMuICBUaGUgY29tbXVuaWNhdGlvbnMgdHR5IGhhcyBpbnRyID0gREVMIGJ1dCB3ZSBnZXQgaGVyZSBhZnRlcgorICBwcmVzc2luZyBERUwgb24gdGhlIGtleWJvYXJkLCBldmVuIHdoZW4gdGhlIHJlbW90ZSBzeXN0ZW0gaGFzIGJlZW4gc2V0IG5vdAorICB0byBlY2hvLiAgV2l0aCBBOTg2IGRlZmluZWQsIHdlIHN0YXkgaW4gdGhlIHJlYWQgbG9vcCBhbmQgYmVlcCBvbmx5IGlmIHRoZQorICBvZmZlbmRpbmcgY2hhcmFjdGVyIGlzIG5vdCBERUwuCisqLworCQkgICAgaWYgKChjICYgMTI3KSAhPSAxMjcpIGNvbm9jKEJFTCk7CisjZWxzZQorI2lmZGVmIEVJTlRSCisvKgorICAgVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IHRoZSBvdGhlciBmb3JrIHNpZ25hbGxpbmcgdGhpcyBvbmUgYWJvdXQKKyAgIGFuIGVjaG9pbmcgY2hhbmdlIGR1cmluZyBURUxORVQgbmVnb3RpYXRpb25zLgorKi8KKwkJICAgIGlmIChlcnJubyA9PSBFSU5UUikKKwkJICAgICAgY29udGludWU7CisjZW5kaWYgLyogRUlOVFIgKi8KKwkJICAgIGNvbm9jKEJFTCk7CQkvKiBPdGhlcndpc2UsIGJlZXAgKi8KKwkJICAgIGFjdGl2ZSA9IDA7CQkvKiBhbmQgdGVybWluYXRlIHRoZSByZWFkIGxvb3AgKi8KKwkJICAgIGNvbnRpbnVlOworI2VuZGlmIC8qIEE5ODYgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisJCX0KKwkJYyAmPSBjbWRtc2s7CQkvKiBEbyBhbnkgcmVxdWVzdGVkIG1hc2tpbmcgKi8KKyNpZm5kZWYgTk9TRVRLRVkKKy8qCisgIE5vdGU6IGttcHRyIGlzIE5VTEwgaWYgd2UgZ290IGNoYXJhY3RlciBjIGZyb20gdGhlIGtleWJvYXJkLCBhbmQgaXQgaXMKKyAgbm90IE5VTEwgaWYgaXQgY2FtZSBmcm9tIGEgbWFjcm8uICBJbiB0aGUgbGF0dGVyIGNhc2UsIHdlIG11c3QgYXZvaWQKKyAgZXhwYW5kaW5nIGl0IGFnYWluLgorKi8KKwkJaWYgKCFrbXB0ciAmJiBtYWNyb3RhYltjXSkgeyAvKiBNYWNybyBkZWZpbml0aW9uIGZvciBjPyAqLworCQkgICAga21wdHIgPSBtYWNyb3RhYltjXTsgICAgIC8qIFllcywgc2V0IHVwIG1hY3JvIHBvaW50ZXIgKi8KKwkJICAgIGNvbnRpbnVlOwkJICAgICAvKiBhbmQgcmVzdGFydCB0aGUgbG9vcCwgKi8KKwkJfSBlbHNlIGMgPSBrZXltYXBbY107CSAgICAgLyogZWxzZSB1c2Ugc2luZ2xlLWNoYXIga2V5bWFwICovCisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKwkJaWYgKAorI2lmbmRlZiBOT1NFVEtFWQorCQkgICAgIWttcHRyICYmCisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKwkJICAgICh0dF9lc2NhcGUgJiYgKGMgJiAweGZmKSA9PSBlc2NhcGUpKSB7IC8qIEVzY2FwZSBjaGFyPyAqLworCQkgICAgZGVidWcoRjAwMCwiQ09OTkVDVCBnb3QgZXNjYXBlIiwiIixjKTsKKwkJICAgIGMgPSBDT05HS1MoKSAmIDAxNzc7IC8qIEdvdCBlc2MsIGdldCBpdHMgYXJnICovCisJCSAgICAvKiBObyBrZXkgbWFwcGluZyBoZXJlICovCisJCSAgICBkb2VzYygoY2hhcikgYyk7CS8qIE5vdyBwcm9jZXNzIGl0ICovCisKKwkJfSBlbHNlIHsJCS8qIEl0J3Mgbm90IHRoZSBlc2NhcGUgY2hhcmFjdGVyICovCisJCSAgICBjc2F2ZSA9IGM7CQkvKiBTYXZlIGl0IGJlZm9yZSB0cmFuc2xhdGlvbiAqLworCQkJCQkvKiBmb3IgbG9jYWwgZWNob2luZy4gKi8KKyNpZm5kZWYgTk9DU0VUUworCQkgICAgaWYgKGluZXNjID09IEVTX05PUk1BTCkgeyAvKiBJZiBub3QgaW5zaWRlIGVzY2FwZSBzZXEuLiAqLworCQkJLyogVHJhbnNsYXRlIGNoYXJhY3RlciBzZXRzICovCisjaWZkZWYgVU5JQ09ERQorCQkJaW50IHg7CisJCQlDSEFSIGNoOworCQkJY2ggPSBjOworCQkJaWYgKHVuaWNvZGUgPT0gMSkgeyAvKiBSZW1vdGUgaXMgVVRGLTggKi8KKwkJCSAgICBvdXR4Y291bnQgPSBiX3RvX3UoY2gsb3V0eGJ1ZixPVVRYQlVGU0laLHRjc3NpemUpOworCQkJICAgIG91dHhidWZbb3V0eGNvdW50XSA9IE5VTDsKKwkJCX0gZWxzZSBpZiAodW5pY29kZSA9PSAyKSB7IC8qIExvY2FsIGlzIFVURi04ICovCisJCQkgICAgeCA9IHVfdG9fYihjaCk7IC8qIFNvIHRyYW5zbGF0ZSB0byByZW1vdGUgYnl0ZSAqLworCQkJICAgIGlmICh4IDwgMCkKKwkJCSAgICAgIGNvbnRpbnVlOworCQkJICAgIG91dHhidWZbMF0gPSAodW5zaWduZWQpKHggJiAweGZmKTsKKwkJCSAgICBvdXR4Y291bnQgPSAxOworCQkJICAgIG91dHhidWZbb3V0eGNvdW50XSA9IE5VTDsKKwkJCX0gZWxzZSB7CisjZW5kaWYgLyogVU5JQ09ERSAqLworCQkJICAgIC8qIExvY2FsLXRvLWludGVybWVkaWF0ZSAqLworCQkJICAgIGlmIChzeG8pIGMgPSAoKnN4bykoKGNoYXIpYyk7CisJCQkgICAgLyogSW50ZXJtZWRpYXRlLXRvLXJlbW90ZSAqLworCQkJICAgIGlmIChyeG8pIGMgPSAoKnJ4bykoKGNoYXIpYyk7CisJCQkgICAgb3V0eGJ1ZlswXSA9IGM7CisJCQkgICAgb3V0eGNvdW50ID0gMTsKKwkJCSAgICBvdXR4YnVmW291dHhjb3VudF0gPSBOVUw7CisjaWZkZWYgVU5JQ09ERQorCQkJfQorI2VuZGlmIC8qIFVOSUNPREUgKi8KKwkJICAgIH0KKwkJICAgIGlmIChlc2NzZXEpCisJCSAgICAgIGFwY3JjID0gY2hrYWVzKChjaGFyKWMpOworI2Vsc2UKKwkJICAgIG91dHhidWZbMF0gPSBjOworCQkgICAgb3V0eGNvdW50ID0gMTsKKwkJICAgIG91dHhidWZbb3V0eGNvdW50XSA9IE5VTDsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisJCSAgICBmb3IgKGkgPSAwOyBpIDwgb3V0eGNvdW50OyBpKyspIHsKKwkJCWMgPSBvdXR4YnVmW2ldOworLyoKKyBJZiBTaGlmdC1Jbi9TaGlmdC1PdXQgaXMgc2VsZWN0ZWQgYW5kIHdlIGhhdmUgYSA3LWJpdCBjb25uZWN0aW9uLAorIGhhbmRsZSBzaGlmdGluZyBoZXJlLgorKi8KKwkJCWlmIChzb3NpKSB7CS8qIFNoaWZ0LUluL091dCBzZWxlY3RlZD8gKi8KKwkJCSAgICBpZiAoY21hc2sgPT0gMDE3NykgeyAvKiBJbiA3LWJpdCBlbnZpcm9ubWVudD8gKi8KKwkJCQlpZiAoYyAmIDAyMDApIHsJLyogOC1iaXQgY2hhcmFjdGVyPyAqLworCQkJCSAgICBpZiAob3V0c2hpZnQgPT0gMCkgeyAvKiBJZiBub3Qgc2hpZnRlZCwgKi8KKwkJCQkJdHRvYyhkb3BhcihTTykpOyAvKiBzaGlmdC4gKi8KKwkJCQkJb3V0c2hpZnQgPSAxOworCQkJCSAgICB9CisJCQkJfSBlbHNlIHsKKwkJCQkgICAgaWYgKG91dHNoaWZ0ID09IDEpIHsgLyogNy1iaXQgY2hhcmFjdGVyICovCisJCQkJCXR0b2MoZG9wYXIoU0kpKTsgLyogSWYgc2hpZnRlZCwgKi8KKwkJCQkJb3V0c2hpZnQgPSAwOyAgICAvKiB1bnNoaWZ0LiAqLworCQkJCSAgICB9CisJCQkJfQorCQkJICAgIH0KKwkJCSAgICBpZiAoYyA9PSBTTykgb3V0c2hpZnQgPSAxOyAgIC8qIFVzZXIgdHlwZWQgU08gKi8KKwkJCSAgICBpZiAoYyA9PSBTSSkgb3V0c2hpZnQgPSAwOyAgIC8qIFVzZXIgdHlwZWQgU0kgKi8KKwkJCX0KKwkJCWMgJj0gY21hc2s7CS8qIEFwcGx5IEtlcm1pdC10by1ob3N0IG1hc2sgbm93LiAqLworI2lmZGVmIFNVTlgyNQorCQkJaWYgKG5ldHdvcmsgJiYgbmV0dHlwZSA9PSBORVRfU1gyNSkgeworCQkJICAgIGlmIChwYWRwYXJtc1tQQURfRUNIT10pIHsKKwkJCQlpZiAoZGVic2VzKQorCQkJCSAgY29ub2woZGJjaHIoYykpIDsKKwkJCQllbHNlCisJCQkJICBpZiAoKGMgIT0gcGFkcGFybXNbUEFEX0NIQVJfREVMRVRFX0NIQVJdKSAmJgorCQkJCSAgICAoYyAhPSBwYWRwYXJtc1tQQURfQlVGRkVSX0RFTEVURV9DSEFSXSkgJiYKKwkJCQkgICAgKGMgIT0gcGFkcGFybXNbUEFEX0JVRkZFUl9ESVNQTEFZX0NIQVJdKSkKKwkJCQkgICAgY29ub2MoYykgOworCQkJCWlmIChzZXNsb2cgJiYgIXNlc3NmdCkKKwkJCQkgIGxvZ2NoYXIoYyk7CisJCQkgICAgfQorCQkJICAgIGlmIChjID09IENSICYmIChwYWRwYXJtc1tQQURfTEZfQUZURVJfQ1JdID09IDQgfHwKKwkJCQkJICAgIHBhZHBhcm1zW1BBRF9MRl9BRlRFUl9DUl0gPT0gNSkpIHsKKwkJCQlpZiAoZGVic2VzKQorCQkJCSAgY29ub2woZGJjaHIoTEYpKSA7CisJCQkJZWxzZQorCQkJCSAgY29ub2MoTEYpIDsKKwkJCQlpZiAoc2VzbG9nICYmICFzZXNzZnQpCisJCQkJICBsb2djaGFyKExGKTsKKwkJCSAgICB9CisJCQkgICAgaWYgKGMgPT0gcGFkcGFybXNbUEFEX0JSRUFLX0NIQVJBQ1RFUl0pIHsKKwkJCQlicmVha2FjdCgpOworCQkJICAgIH0gZWxzZSBpZiAocGFkcGFybXNbUEFEX0RBVEFfRk9SV0FSRF9USU1FT1VUXSkgeworCQkJCXRvc2VuZCA9IDE7CisJCQkJeDI1b2J1ZiBbb2J1ZmwrK10gPSBjOworCQkJICAgIH0gZWxzZSBpZiAoKChjID09IHBhZHBhcm1zW1BBRF9DSEFSX0RFTEVURV9DSEFSXSl8fAorCQkJCSAgICAgKGMgPT0gcGFkcGFybXNbUEFEX0JVRkZFUl9ERUxFVEVfQ0hBUl0pIHx8CisJCQkJICAgICAoYyA9PSBwYWRwYXJtc1tQQURfQlVGRkVSX0RJU1BMQVlfQ0hBUl0pKQorCQkJCSAgICAgICAmJiAocGFkcGFybXNbUEFEX0VESVRJTkddKSkgeworCQkJCWlmIChjID09IHBhZHBhcm1zW1BBRF9DSEFSX0RFTEVURV9DSEFSXSkgeworCQkJCSAgICBpZiAob2J1ZmwgPiAwKSB7CisJCQkJCWNvbm9sKCJcYiBcYiIpOyBvYnVmbC0tOworCQkJCSAgICB9IGVsc2Uge30KKwkJCQl9IGVsc2UgaWYKKwkJCQkgIChjID09IHBhZHBhcm1zW1BBRF9CVUZGRVJfREVMRVRFX0NIQVJdKSB7CisJCQkJICAgICAgY29ub2wgKCJcclxuUEFEIEJ1ZmZlciBEZWxldGVkXHJcbiIpOworCQkJCSAgICAgIG9idWZsID0gMDsKKwkJCQl9IGVsc2UgaWYKKwkJCQkgIChjPT1wYWRwYXJtc1tQQURfQlVGRkVSX0RJU1BMQVlfQ0hBUl0pIHsKKwkJCQkgICAgICBjb25vbCgiXHJcbiIpOworCQkJCSAgICAgIGNvbm9sKHgyNW9idWYpOworCQkJCSAgICAgIGNvbm9sKCJcclxuIik7CisJCQkJfSBlbHNlIHt9CisJCQkgICAgfSBlbHNlIHsKKwkJCQl4MjVvYnVmIFtvYnVmbCsrXSA9IGM7CisJCQkJaWYgKG9idWZsID09IE1BWE9YMjUpIHRvc2VuZCA9IDE7CisJCQkJZWxzZSBpZiAoYyA9PSBDUikgdG9zZW5kID0gMTsKKwkJCSAgICB9CisJCQkgICAgaWYgKHRvc2VuZCkgeworCQkJCWlmICh0dG9sKChDSEFSICopeDI1b2J1ZixvYnVmbCkgPCAwKSB7CisJCQkJICAgIHBlcnJvciAoIlxyXG5DYW4ndCBzZW5kIGNoYXJhY3RlcnMiKTsKKwkJCQkgICAgYWN0aXZlID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCSAgICBiemVybyAoeDI1b2J1ZixzaXplb2YoeDI1b2J1ZikpOworCQkJCSAgICBvYnVmbCA9IDA7CisJCQkJICAgIHRvc2VuZCA9IDA7CisJCQkJfQorCQkJICAgIH0gZWxzZSB7fTsKKwkJCX0gZWxzZSB7CisjZW5kaWYgLyogU1VOWDI1ICovCisJCQkgICAgaWYgKGMgPT0gJ1wwMTUnKSB7IC8qIENhcnJpYWdlIFJldHVybiAqLworCQkJCWludCBzdHVmZiA9IC0xOworCQkJCWlmICh0bmxtKSB7IC8qIFRFUk1JTkFMIE5FV0xJTkUgT04gKi8KKwkJCQkgICAgc3R1ZmYgPSBMRjsJLyogU3R1ZmYgTEYgKi8KKyNpZmRlZiBUTkNPREUKKwkJCQl9IGVsc2UgaWYgKG5ldHdvcmsgJiYgLyogVEVMTkVUIE5FV0xJTkUgKi8KKwkJCQkJICAgSVNfVEVMTkVUKCkpIHsKKwkJCQkgICAgc3dpdGNoICghVEVMT1BUX01FKFRFTE9QVF9CSU5BUlkpID8KKwkJCQkJICAgIHRuX25sbSA6CisJCQkJCSAgICB0bl9iX25sbQorCQkJCQkgICAgKSB7CisJCQkJICAgICAgY2FzZSBUTkxfQ1JMRjoKKwkJCQkJc3R1ZmYgPSBMRjsKKwkJCQkJYnJlYWs7CisJCQkJICAgICAgY2FzZSBUTkxfQ1JOVUw6CisJCQkJCXN0dWZmID0gTlVMOworCQkJCQlicmVhazsKKwkJCQkgICAgfQorI2VuZGlmIC8qIFROQ09ERSAqLworCQkJCX0KKwkJCQlpZiAoc3R1ZmYgPiAtMSkgeworCQkJCSAgICB0dG9jKGRvcGFyKCdcMDE1JykpOyAvKiBTZW5kIENSICovCisJCQkJICAgIGlmIChkdXBsZXgpIGNvbm9jKCdcMDE1Jyk7IC8qIEVjaG8gQ1IgKi8KKwkJCQkgICAgYyA9IHN0dWZmOyAvKiBDaGFyIHRvIHN0dWZmICovCisJCQkJICAgIGNzYXZlID0gYzsKKwkJCQl9CisJCQkgICAgfQorI2lmZGVmIFROQ09ERQorLyogSWYgdXNlciB0eXBlcyB0aGUgMHhmZiBjaGFyYWN0ZXIgKFRFTE5FVCBJQUMpLCBpdCBtdXN0IGJlIGRvdWJsZWQuICovCisJCQkgICAgZWxzZQkvKiBOb3QgQ1IgKi8KKwkJCSAgICAgIGlmICgoZG9wYXIoKENIQVIpIGMpID09IElBQykgJiYgLyogSUFDICgweGZmKSAqLworCQkJCSAgbmV0d29yayAmJiBJU19URUxORVQoKSkgeworCQkJCSAgLyogU2VuZCBvbmUgY29weSBub3cgKi8KKwkJCQkgIC8qIGFuZCB0aGUgb3RoZXIgb25lIGp1c3QgYmVsb3cuICovCisJCQkJICB0dG9jKChjaGFyKUlBQyk7CisJCQkgICAgICB9CisjZW5kaWYgLyogVE5DT0RFICovCisJCQkgICAgLyogU2VuZCB0aGUgY2hhcmFjdGVyICovCisKKwkJCSAgICBpZiAodHRvYygoY2hhcilkb3BhcigoQ0hBUikgYykpID4gLTEpIHsKKwkJCQlpZiAoZHVwbGV4KSB7CS8qIElmIGhhbGYgZHVwbGV4LCBtdXN0IGVjaG8gKi8KKwkJCQkgICAgaWYgKGRlYnNlcykKKwkJCQkgICAgICBjb25vbChkYmNocihjc2F2ZSkpOyAvKiBvcmlnaW5hbCBjaGFyICovCisJCQkJICAgIGVsc2UgLyogbm90IHRoZSB0cmFuc2xhdGVkIG9uZSAqLworCQkJCSAgICAgIGNvbm9jKChjaGFyKWNzYXZlKTsKKwkJCQkgICAgaWYgKHNlc2xvZykgeyAvKiBBbmQgbWF5YmUgbG9nIGl0IHRvbyAqLworCQkJCQljMiA9IGNzYXZlOworCQkJCQlpZiAoc2Vzc2Z0ID09IDAgJiYgY3NhdmUgPT0gJ1xyJykKKwkJCQkJICBjMiA9ICdcbic7CisJCQkJCWxvZ2NoYXIoKGNoYXIpYzIpOworCQkJCSAgICB9CisJCQkJfQorCQkJICAgIH0gZWxzZSB7CisJCQkJcGVycm9yKCJcclxuQ2FuJ3Qgc2VuZCBjaGFyYWN0ZXIiKTsKKwkJCQlhY3RpdmUgPSAwOworCQkJICAgIH0KKyNpZmRlZiBTVU5YMjUKKwkJCX0KKyNlbmRpZiAvKiBTVU5YMjUgKi8KKwkJICAgIH0gLyogZm9yLi4uICovCisJCX0KKwkgICAgfQorCisJICAgIC8qIG5vdyBhY3RpdmUgPT0gMCAqLworICAgICAgICAgICAgc2lnbmFsKENLX0ZPUktfU0lHLCBTSUdfSUdOKTsgLyogVHVybiBvZmYgQ0tfRk9SS19TSUcgKi8KKwkgICAgc2p2YWwgPSBDRVZfTk87CQkvKiBTZXQgdG8gaGFuZ3VwICovCisJfQkJCQkvKiBDb21lIGhlcmUgb24gdGVybWluYXRpb24gb2YgY2hpbGQgKi8KKworLyogY2tsb25nam1wKCkgZXhlY3V0ZWQgaW4gcGlwZWludCgpIChwYXJlbnQgb25seSEpIGNvbWVzIGhlcmUgKi8KKworLyoKKyAgTm93IHRoZSBjaGlsZCBmb3JrIGlzIGdvbmUgb3IgaXMgd2FpdGluZyBmb3IgQ0tfRk9SS19TSUcgaW4gY2tfc25kbXNnKCkuCisgIFNvIHdlIGNhbid0IGdldCAoaW4gdGhlIHBhcmVudCkgYW55IHN1YnNlcXVlbnQgQ0tfRk9SS19TSUcgc2lnbmFscyB1bnRpbAorICB3ZSBzaWduYWwgdGhlIGNoaWxkIHdpdGggQ0tfRk9SS19TSUcuCisqLworCWRlYnVnKEYxMDAsIkNPTk5FQ1Qgc2lnbmFsaW5nIHBvcnQgZm9yayIsIiIsMCk7CisJc2lnbmFsKENLX0ZPUktfU0lHLCBTSUdfSUdOKTsJLyogVHVybiB0aGlzIG9mZiAqLworCWRlYnVnKEYxMDEsIkNPTk5FQ1Qga2lsbGluZyBwb3J0IGZvcmsiLCIiLHBpZCk7CisJaWYgKHBpZCkgeworCSAgICBpbnQgeCA9IDA7CisjaWZkZWYgQkVPU09SQkVCT1gKKwkgICAgeworCQlsb25nIHJldF92YWw7CisJCXggPSBraWxsKHBpZCxTSUdLSUxMVEhSKTsgLyogS2lsbCBsb3dlciBmb3JrICovCisJCXdhaXRfZm9yX3RocmVhZChwaWQsICZyZXRfdmFsKTsKKwkgICAgfQorI2Vsc2UKKyNpZmRlZiBQbGFuOQorCSAgICB4ID0ga2lsbChwaWQsU0lHS0lMTCk7CS8qIEtpbGwgbG93ZXIgZm9yayAqLworI2Vsc2UKKwkgICAgeCA9IGtpbGwocGlkLDkpOworI2VuZGlmIC8qIFBsYW45ICovCisjZW5kaWYgLyogQkVPU09SQkVCT1ggKi8KKwkgICAgd2FpdCgoV0FJVF9UICopMCk7CQkvKiBXYWl0IHRpbGwgZ29uZS4gKi8KKwkgICAgaWYgKHggPCAwKSB7CisJCXByaW50ZigiV0FSTklORzogRmFpbHVyZSB0byBraWxsIGZvcmssIHBpZCAlZDogJXMsIGVycm5vPSVkXG4iLAorCQkgICAgICAgKGludCkgcGlkLCBja19lcnJzdHIoKSwgZXJybm8pOworCQlkZWJ1ZyhGMTExLCJDT05ORUNUIGVycm9yIGtpbGxpbmcgcGlkIixja19lcnJzdHIoKSxlcnJubyk7CisJICAgIH0KKwkgICAgZGVidWcoRjEwMSwiQ09OTkVDVCBraWxsZWQgcG9ydCBmb3JrIiwiIixwaWQpOworCSAgICBwaWQgPSAoUElEX1QpIDA7CisJfQorCWlmIChzanZhbCA9PSBDRVZfSFVQKSB7CQkvKiBSZWFkIGVycm9yIG9uIGNvbW0gZGV2aWNlICovCisJICAgIGRvaGFuZ3VwID0gMTsJCS8qIHNvIHdlIHdhbnQgdG8gaGFuZyB1cCBvdXIgc2lkZSAqLworI2lmZGVmIE5FVENPTk4KKwkgICAgaWYgKG5ldHdvcmspIHsJCS8qIGFuZC9vciBjbG9zZSBuZXR3b3JrIGNvbm5lY3Rpb24gKi8KKwkJdHRjbG9zKDApOworCQlkb2xvZ2VuZCgpOworI2lmZGVmIFNVTlgyNQorCQlpZiAobmV0dHlwZSA9PSBORVRfU1gyNSkgLyogSWYgWC4yNSwgcmVzdG9yZSB0aGUgUEFEIHBhcmFtcyAqLworCQkgIGluaXRwYWQoKTsKKyNlbmRpZiAvKiBTVU5YMjUgKi8KKwkgICAgfQorI2VuZGlmIC8qIE5FVENPTk4gKi8KKwl9CisjaWZkZWYgQ0tfQVBDCisJaWYgKHNqdmFsID09IENFVl9BUEMpIHsJCS8qIEFwcGxpY2F0aW9uIFByb2dyYW0gQ29tbWFuZCByZWMnZCAqLworCSAgICBhcGNhY3RpdmUgPSBBUENfUkVNT1RFOwkvKiBGbGFnIEFQQyBhcyBhY3RpdmUgKi8KKwkgICAgYWN0aXZlID0gMDsJCQkvKiBGbGFnIENPTk5FQ1QgYXMgaW5hY3RpdmUgKi8KKwl9CisjZW5kaWYgLyogQ0tfQVBDICovCisJY29ucmVzKCk7CQkJLyogUmVzZXQgdGhlIGNvbnNvbGUuICovCisJaWYgKGRvaGFuZ3VwID4gMCkgewkJLyogSWYgaGFuZ3VwIHJlcXVlc3RlZCwgZG8gdGhhdC4gKi8KKyNpZm5kZWYgTk9ESUFMCisJICAgIGlmIChkb2hhbmd1cCA+IDEpCQkvKiBVc2VyIGFza2VkIGZvciBpdCAqLworCSAgICAgIGlmIChtZG1odXAoKSA8IDEpCQkvKiBNYXliZSBoYW5nIHVwIHZpYSBtb2RlbSAqLworI2VuZGlmIC8qIE5PRElBTCAqLworCQl0dGhhbmcoKTsJCS8qIEFuZCBtYWtlIHN1cmUgd2UgZG9uJ3QgaGFuZyB1cCAqLworCSAgICBkb2hhbmd1cCA9IDA7CQkvKiBhZ2FpbiB1bmxlc3MgcmVxdWVzdGVkIGFnYWluLiAqLworCX0KKworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBORVRDT05OCisjaWZkZWYgU0lHUElQRQorCWlmIChuZXR3b3JrICYmIHNpZ3BpcGgpCQkvKiBSZXN0b3JlIHByZXZpb3VzIFNJR1BJUEUgaGFuZGxlciAqLworCSAgKFZPSUQpIHNpZ25hbChTSUdQSVBFLCBzaWdwaXBoKTsKKyNlbmRpZiAvKiBTSUdQSVBFICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIEFOWVgyNQorCWlmIChkb3gyNWNscikgewkJCS8qIElmIFguMjUgQ2xlYXIgcmVxdWVzdGVkICovCisJICAgIHgyNWNsZWFyKCk7CQkJLyogZG8gdGhhdC4gKi8KKyNpZm5kZWYgSUJNWDI1CisJICAgIGluaXRwYWQoKTsKKyNlbmRpZiAvKiBJQk1YMjUgKi8KKwkgICAgZG94MjVjbHIgPSAwOwkJLyogQnV0IG9ubHkgb25jZS4gKi8KKwl9CisjZW5kaWYgLyogQU5ZWDI1ICovCisKKwlpZiAocXVpdG5vdykgZG9leGl0KEdPT0RfRVhJVCx4aXRzdGEpOyAvKiBFeGl0IG5vdyBpZiByZXF1ZXN0ZWQuICovCisgIAlpZiAobXNnZmxnKQorCSAgcHJpbnRmKCIoQmFjayBhdCAlcykiLCAqbXlob3N0ID8gbXlob3N0IDogImxvY2FsIFVOSVggc3lzdGVtIik7CisjaWZkZWYgQ0tfQVBDCisgICAgICAgIGlmICghYXBjYWN0aXZlKQorI2VuZGlmIC8qIENLX0FQQyAqLworCSAgcHJpbnRmKCJcbiIpOworCXdoYXQgPSBXX05PVEhJTkc7CQkvKiBTbyBjb25zb2xlIG1vZGVzIHNldCByaWdodC4gKi8KKyNpZm5kZWYgTk9DU0VUUworCWxhbmd1YWdlID0gbGFuZ3N2OwkJLyogUmVzdG9yZSBsYW5ndWFnZSAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKwlwYXJlbnRfaWQgPSAoUElEX1QpIDA7CisJZ290byBjb25yZXQxOworCisgICAgfQorI2lmbmRlZiBCRU9TT1JCRUJPWAorICAgIGVsc2UgewkvKiAqKiogKi8JCS8qIEluZmVyaW9yIHJlYWRzLCBwcmludHMgcG9ydCBpbnB1dCAqLworICAgICAgICBjb25jbGQoLyogKHZvaWQgKikmcGlkICovKTsKKyAgICB9CisjZW5kaWYgLyogQkVPU09SQkVCT1ggKi8KKworY29ucmV0MToKKyAgICBjb25yZXQgPSAxOworY29ucmV0MDoKKyAgICBzaWduYWwoQ0tfRk9SS19TSUcsIFNJR19JR04pOwkvKiBJbiBjYXNlIHRoaXMgd2Fzbid0IGRvbmUgYWxyZWFkeSAqLworICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgY29uZWN0IGV4aXQgaWJjIiwiIixpYmMpOworICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgY29uZWN0IGV4aXQgb2JjIiwiIixvYmMpOworICAgIGNsb3NlKHhwaXBlWzBdKTsgeHBpcGVbMF0gPSAtMTsJLyogQ2xvc2UgdGhlIHBpcGUgKi8KKyAgICBjbG9zZSh4cGlwZVsxXSk7IHhwaXBlWzFdID0gLTE7CisgICAgaWYgKG1zZ2ZsZykgeworI2lmZGVmIENLX0FQQworCWlmIChhcGNhY3RpdmUgPT0gQVBDX0xPQ0FMKQorCSAgcHJpbnRmKCJcbiIpOworI2VuZGlmIC8qIENLX0FQQyAqLworCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4iKTsKKyAgICB9CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgcmV0dXJuKGNvbnJldCk7Cit9CisKKworLyogIEggQyBPIE4gTiBFICAtLSAgR2l2ZSBoZWxwIG1lc3NhZ2UgZm9yIGNvbm5lY3QuICAqLworCitpbnQKK2hjb25uZSgpIHsKKyAgICBpbnQgYzsKKyAgICBzdGF0aWMgY2hhciAqaGxwbXNnW10gPSB7CisiXHJcbiAgPyBmb3IgdGhpcyBtZXNzYWdlIiwKKyJcclxuICAwICh6ZXJvKSB0byBzZW5kIGEgbnVsbCIsCisiXHJcbiAgQiB0byBzZW5kIGEgQlJFQUsiLAorI2lmZGVmIENLX0xCUksKKyJcclxuICBMIHRvIHNlbmQgYSBMb25nIEJSRUFLIiwKKyNlbmRpZiAvKiBDS19MQlJLICovCisjaWZkZWYgTkVUQ09OTgorIlxyXG4gIEkgdG8gc2VuZCBhIG5ldHdvcmsgaW50ZXJydXB0IHBhY2tldCIsCisjaWZkZWYgVENQU09DS0VUCisiXHJcbiAgQSB0byBzZW5kIEFyZSBZb3UgVGhlcmU/IiwKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNpZmRlZiBBTllYMjUKKyJcclxuICBSIHRvIHJlc2V0IFguMjUgdmlydHVhbCBjaXJjdWl0IiwKKyNlbmRpZiAvKiBBTllYMjUgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisiXHJcbiAgVSB0byBoYW5ndXAgYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uIiwKKyJcclxuICBRIHRvIGhhbmd1cCBhbmQgcXVpdCBLZXJtaXQiLAorIlxyXG4gIFMgZm9yIHN0YXR1cyIsCisjaWZkZWYgTk9QVVNICisiXHJcbiAgISB0byBwdXNoIHRvIGxvY2FsIHNoZWxsIChkaXNhYmxlZCkiLAorIlxyXG4gIFogdG8gc3VzcGVuZCAoZGlzYWJsZWQpIiwKKyNlbHNlCisiXHJcbiAgISB0byBwdXNoIHRvIGxvY2FsIHNoZWxsIiwKKyNpZmRlZiBOT0pDCisiXHJcbiAgWiB0byBzdXNwZW5kIChkaXNhYmxlZCkiLAorI2Vsc2UKKyJcclxuICBaIHRvIHN1c3BlbmQiLAorI2VuZGlmIC8qIE5PSkMgKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyJcclxuICBcXCBiYWNrc2xhc2ggY29kZToiLAorIlxyXG4gICAgXFxubm4gIGRlY2ltYWwgY2hhcmFjdGVyIGNvZGUiLAorIlxyXG4gICAgXFxPbm5uIG9jdGFsIGNoYXJhY3RlciBjb2RlIiwKKyJcclxuICAgIFxcWGhoICBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIgY29kZSIsCisiXHJcbiAgICB0ZXJtaW5hdGUgd2l0aCBjYXJyaWFnZSByZXR1cm4uIiwKKyJcclxuIFR5cGUgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgYWdhaW4gdG8gc2VuZCB0aGUgZXNjYXBlIGNoYXJhY3Rlciwgb3IiLAorIlxyXG4gcHJlc3MgdGhlIHNwYWNlLWJhciB0byByZXN1bWUgdGhlIENPTk5FQ1QgY29tbWFuZC5cclxuIiwKKyIiIH07CisKKyAgICBjb25vbCgiXHJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICBjb25vbCgiXHJcblByZXNzIEMgdG8gcmV0dXJuIHRvICIpOworICAgIGNvbm9sKCpteWhvc3QgPyBteWhvc3QgOiAidGhlIEMtS2VybWl0IHByb21wdCIpOworICAgIGNvbm9sKCIsIG9yOiIpOworICAgIGNvbm9sYShobHBtc2cpOwkJCS8qIFByaW50IHRoZSBoZWxwIG1lc3NhZ2UuICovCisgICAgY29ub2woIkNvbW1hbmQ+Iik7CQkJLyogUHJvbXB0IGZvciBjb21tYW5kLiAqLworICAgIGMgPSBDT05HS1MoKSAmIDAxNzc7CQkvKiBHZXQgY2hhcmFjdGVyLCBzdHJpcCBhbnkgcGFyaXR5LiAqLworICAgIC8qIE5vIGtleSBtYXBwaW5nIG9yIHRyYW5zbGF0aW9uIGhlcmUgKi8KKyAgICBpZiAoYyAhPSBDTURRKQorICAgICAgY29ub2xsKCIiKTsKKyAgICBjb25vbGwoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgIHJldHVybihjKTsJCQkJLyogUmV0dXJuIGl0LiAqLworfQorCisKKy8qICBEIE8gRSBTIEMgIC0tICBQcm9jZXNzIGFuIGVzY2FwZSBjaGFyYWN0ZXIgYXJndW1lbnQgICovCisKK1ZPSUQKKyNpZmRlZiBDS19BTlNJQworZG9lc2MoY2hhciBjKQorI2Vsc2UKK2RvZXNjKGMpIGNoYXIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogZG9lc2MgKi8geworICAgIENIQVIgZDsKKworICAgIGRlYnVnKEYxMDEsIkNPTk5FQ1QgZG9lc2MiLCIiLGMpOworICAgIHdoaWxlICgxKSB7CisJaWYgKGMgPT0gZXNjYXBlKSB7CQkvKiBTZW5kIGVzY2FwZSBjaGFyYWN0ZXIgKi8KKwkgICAgZCA9IGRvcGFyKChDSEFSKSBjKTsgdHRvYygoY2hhcikgZCk7IHJldHVybjsKKyAgICAJfSBlbHNlCQkJCS8qIE9yIGVsc2UgbG9vayBpdCB1cCBiZWxvdy4gKi8KKwkgICAgaWYgKGlzdXBwZXIoYykpIGMgPSB0b2xvd2VyKGMpOworCisJc3dpdGNoKGMpIHsKKworCWNhc2UgJ2MnOgkJCS8qIEVzY2FwZSBiYWNrIHRvIHByb21wdCAqLworCWNhc2UgJ1wwMyc6CisJICAgIGFjdGl2ZSA9IDA7IGNvbm9sKCJcclxuIik7IHJldHVybjsKKworCWNhc2UgJ2InOgkJCS8qIFNlbmQgYSBCUkVBSyBzaWduYWwgKi8KKwljYXNlICdcMDInOgorCSAgICB0dHNuZGIoKTsgcmV0dXJuOworCisjaWZkZWYgTkVUQ09OTgorCWNhc2UgJ2knOgkJCS8qIFNlbmQgSW50ZXJydXB0ICovCisJY2FzZSAnXDAxMSc6CisjaWZkZWYgVENQU09DS0VUCisjaWZuZGVmIElQCisjZGVmaW5lIElQIDI0NAorI2VuZGlmIC8qIElQICovCisJICAgIGlmIChuZXR3b3JrICYmIElTX1RFTE5FVCgpKSB7IC8qIFRFTE5FVCAqLworCQl0ZW1wWzBdID0gKENIQVIpIElBQzsJLyogSSBBbSBhIENvbW1hbmQgKi8KKwkJdGVtcFsxXSA9IChDSEFSKSBJUDsJLyogSW50ZXJydXB0IFByb2Nlc3MgKi8KKwkJdGVtcFsyXSA9IE5VTDsKKwkJdHRvbCgoQ0hBUiAqKXRlbXAsMik7CisJICAgIH0gZWxzZQorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2lmZGVmIFNVTlgyNQorCSAgICBpZiAobmV0d29yayAmJiAobmV0dHlwZSA9PSBORVRfU1gyNSkpIHsKKwkJKFZPSUQpIHgyNWludHIoMCk7CSAgICAgICAgICAgIC8qIFguMjUgaW50ZXJydXB0IHBhY2tldCAqLworCQljb25vbCgiXHJcbiIpOworCSAgICB9IGVsc2UKKyNlbmRpZiAvKiBTVU5YMjUgKi8KKwkgICAgICBjb25vYyhCRUwpOworCSAgICByZXR1cm47CisKKyNpZmRlZiBUQ1BTT0NLRVQKKwljYXNlICdhJzoJCQkvKiAiQXJlIFlvdSBUaGVyZT8iICovCisJY2FzZSAnXDAxJzoKKyNpZm5kZWYgQVlUCisjZGVmaW5lIEFZVCAyNDYKKyNlbmRpZiAvKiBBWVQgKi8KKwkgICAgaWYgKG5ldHdvcmsgJiYgSVNfVEVMTkVUKCkpIHsKKwkJdGVtcFswXSA9IChDSEFSKSBJQUM7CS8qIEkgQW0gYSBDb21tYW5kICovCisJCXRlbXBbMV0gPSAoQ0hBUikgQVlUOwkvKiBBcmUgWW91IFRoZXJlPyAqLworCQl0ZW1wWzJdID0gTlVMOworCQl0dG9sKChDSEFSICopdGVtcCwyKTsKKwkgICAgfSBlbHNlIGNvbm9jKEJFTCk7CisJICAgIHJldHVybjsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisKKyNpZmRlZiBDS19MQlJLCisJY2FzZSAnbCc6CQkJLyogU2VuZCBhIExvbmcgQlJFQUsgc2lnbmFsICovCisJICAgIHR0c25kbGIoKTsgcmV0dXJuOworI2VuZGlmIC8qIENLX0xCUksgKi8KKworCWNhc2UgJ3UnOgkJCS8qIEhhbmd1cCAqLworICAgICAvKgljYXNlICdcMDEwJzogKi8JCQkvKiBObywgdG9vIGRhbmdlcm91cyAqLworI2lmZGVmIEFOWVgyNQorICAgICAgICAgICAgaWYgKG5ldHdvcmsgJiYgKG5ldHR5cGUgPT0gTkVUX1NYMjUgfHwgbmV0dHlwZSA9PSBORVRfSVgyNSkpCisJICAgICAgZG94MjVjbHIgPSAxOworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8qIEFOWVgyNSAqLworCSAgICBkb2hhbmd1cCA9IDI7IGFjdGl2ZSA9IDA7IGNvbm9sKCJcclxuSGFuZ2luZyB1cCAiKTsgcmV0dXJuOworCisjaWZkZWYgQU5ZWDI1CisgICAgICAgIGNhc2UgJ3InOiAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgdGhlIFguMjUgdmlydHVhbCBjaXJjdWl0ICovCisgICAgICAgIGNhc2UgJ1wwMjInOgorICAgICAgICAgICAgaWYgKG5ldHdvcmsgJiYgKG5ldHR5cGUgPT0gTkVUX1NYMjUgfHwgbmV0dHlwZSA9PSBORVRfSVgyNSkpCisJCShWT0lEKSB4MjVyZXNldCgwLDApOworICAgICAgICAgICAgY29ub2woIlxyXG4iKTsKKwkgICAgcmV0dXJuOworI2VuZGlmIC8qIEFOWVgyNSAqLworCisJY2FzZSAncSc6CQkJLyogUXVpdCAqLworCSAgICBkb2hhbmd1cCA9IDI7IHF1aXRub3cgPSAxOyBhY3RpdmUgPSAwOyBjb25vbCgiXHJcbiIpOyByZXR1cm47CisKKwljYXNlICdzJzoJCQkvKiBTdGF0dXMgKi8KKwkgICAgY29ub2xsKCIiKTsKKwkgICAgY29ub2xsKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisjaWZkZWYgTkVUQ01ECisJICAgIGlmICh0dHBpcGUpCisJICAgICAgY2ttYWttc2codGVtcCxUTVBMRU4sIiBQaXBlOiBcIiIsdHRuYW1lLCJcIiIsTlVMTCk7CisJICAgIGVsc2UKKyNlbmRpZiAvKiBORVRDTUQgKi8KKwkgICAgICBja21ha21zZyh0ZW1wLAorCQkgICAgICAgVE1QTEVOLAorCQkgICAgICAgIiAiLAorCQkgICAgICAgKG5ldHdvcmsgPyAiSG9zdCIgOiAiRGV2aWNlIiksCisJCSAgICAgICAiOiAiLAorCQkgICAgICAgdHRuYW1lCisJCSAgICAgICApOworCSAgICBjb25vbGwodGVtcCk7CisJICAgIGlmICghbmV0d29yayAmJiBzcGVlZCA+PSAwTCkgeworCQlzcHJpbnRmKHRlbXAsIlNwZWVkICVsZCIsIHNwZWVkKTsKKwkJY29ub2xsKHRlbXApOworCSAgICB9CisJICAgIHNwcmludGYodGVtcCwiIFRlcm1pbmFsIGVjaG86ICVzIiwgZHVwbGV4ID8gImxvY2FsIiA6ICJyZW1vdGUiKTsKKwkgICAgY29ub2xsKHRlbXApOworCSAgICBzcHJpbnRmKHRlbXAsIiBUZXJtaW5hbCBieXRlc2l6ZTogJWQiLCAoY21hc2sgID09IDAxNzcpID8gNyA6IDgpOworCSAgICBjb25vbGwodGVtcCk7CisJICAgIHNwcmludGYodGVtcCwiIENvbW1hbmQgYnl0ZXNpemU6ICVkIiwgKGNtZG1zayA9PSAwMTc3KSA/IDcgOiA4ICk7CisJICAgIGNvbm9sbCh0ZW1wKTsKKyAgICAgICAgICAgIGlmIChod3Bhcml0eSkKKyAgICAgICAgICAgICAgc3ByaW50Zih0ZW1wLCIgUGFyaXR5W2hhcmR3YXJlXTogJXMiLHBhcm5hbSgoY2hhcilod3Bhcml0eSkpOworICAgICAgICAgICAgZWxzZQkgICAgCisgIAkgICAgICBzcHJpbnRmKHRlbXAsIiBQYXJpdHk6ICVzIiwgcGFybmFtKChjaGFyKXBhcml0eSkpOworCSAgICBjb25vbGwodGVtcCk7CisJICAgIHNwcmludGYodGVtcCwiIEF1dG9kb3dubG9hZDogJXMiLCBhdXRvZGwgPyAib24iIDogIm9mZiIpOworCSAgICBjb25vbGwodGVtcCk7CisJICAgIGNrbWFrbXNnKHRlbXAsCQkvKiAod291bGQgbm90IGJlIHNhZmUgZm9yIHNwcmludGYpICovCisJCSAgICAgVE1QTEVOLAorCQkgICAgICIgU2Vzc2lvbiBsb2c6ICIsCisJCSAgICAgKnNlc2ZpbCA/IHNlc2ZpbCA6ICIobm9uZSkiLAorCQkgICAgIE5VTEwsCisJCSAgICAgTlVMTAorCQkgICAgICk7CisJICAgIGNvbm9sbCh0ZW1wKTsKKyNpZm5kZWYgTk9TSE9XCisJICAgIGlmICghbmV0d29yaykgc2hvbWRtKCk7CisjZW5kaWYgLyogTk9TSE9XICovCisjaWZkZWYgQ0tMT0dESUFMCisJICAgIHsKKwkJbG9uZyB6OworCQl6ID0gZG9sb2dzaG93KDApOworCQlpZiAoeiA+IC0xTCkgeworCQkgICAgc3ByaW50Zih0ZW1wLCIgRWxhcHNlZCB0aW1lOiAlcyIsaGhtbXNzKHopKTsKKwkJICAgIGNvbm9sbCh0ZW1wKTsKKwkJfQorCSAgICB9CisjZW5kaWYgLyogQ0tMT0dESUFMICovCisJICAgIGNvbm9sbCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCSAgICByZXR1cm47CisKKwljYXNlICdoJzoJCQkvKiBIZWxwICovCisJY2FzZSAnPyc6CQkJLyogSGVscCAqLworCSAgICBjID0gaGNvbm5lKCk7IGNvbnRpbnVlOworCisJY2FzZSAnMCc6CQkJLyogU2VuZCBhIG51bGwgKi8KKwkgICAgYyA9ICdcMCc7IGQgPSBkb3BhcigoQ0hBUikgYyk7IHR0b2MoKGNoYXIpIGQpOyByZXR1cm47CisKKwljYXNlICd6JzogY2FzZSAnXDAzMic6CQkvKiBTdXNwZW5kICovCisjaWZuZGVmIE5PUFVTSAorCSAgICBpZiAoIW5vcHVzaCkKKwkgICAgICBzdHB0cmFwKDApOworCSAgICBlbHNlCisJICAgICAgY29ub2MoQkVMKTsKKyNlbHNlCisJICAgIGNvbm9jKEJFTCk7CisjZW5kaWYgLyogTk9QVVNIICovCisJICAgIHJldHVybjsKKworCWNhc2UgJ0AnOgkJCS8qIFN0YXJ0IGluZmVyaW9yIGNvbW1hbmQgcHJvY2Vzc29yICovCisJY2FzZSAnISc6CisjaWZuZGVmIE5PUFVTSAorCSAgICBpZiAoIW5vcHVzaCkgeworCQljb25yZXMoKTsJCSAgICAgIC8qIFB1dCBjb25zb2xlIGJhY2sgdG8gbm9ybWFsICovCisJCXpzaGNtZCgiIik7CQkgICAgICAvKiBGb3JrIGEgc2hlbGwuICovCisJCWlmIChjb25iaW4oKGNoYXIpZXNjYXBlKSA8IDApIHsKKwkJICAgIHByaW50ZigiRXJyb3IgcmVzdW1pbmcgQ09OTkVDVCBzZXNzaW9uXG4iKTsKKwkJICAgIGFjdGl2ZSA9IDA7CisJCX0KKwkgICAgfSBlbHNlIGNvbm9jKEJFTCk7CisjZWxzZQorCSAgICBjb25vYyhCRUwpOworI2VuZGlmIC8qIE5PUFVTSCAqLworCSAgICByZXR1cm47CisKKwljYXNlIFNQOgkJCS8qIFNwYWNlLCBpZ25vcmUgKi8KKwkgICAgcmV0dXJuOworCisJZGVmYXVsdDoJCQkvKiBPdGhlciAqLworCSAgICBpZiAoYyA9PSBDTURRKSB7CQkvKiBCYWNrc2xhc2ggZXNjYXBlICovCisJCWludCB4OworCQllY2JwID0gZWNidWY7CisJCSplY2JwKysgPSBjOworCQl3aGlsZSAoKChjID0gKENPTkdLUygpICYgY21kbXNrKSkgIT0gJ1xyJykgJiYgKGMgIT0gJ1xuJykpCisJCSAgKmVjYnArKyA9IGM7CisJCSplY2JwID0gTlVMOyBlY2JwID0gZWNidWY7CisJCXggPSB4eGVzYygmZWNicCk7CS8qIEludGVycHJldCBpdCAqLworCQlpZiAoeCA+PSAwKSB7CQkvKiBObyBrZXkgbWFwcGluZyBoZXJlICovCisJCSAgICBjID0gZG9wYXIoKENIQVIpIHgpOworCQkgICAgdHRvYygoY2hhcikgYyk7CisJCSAgICByZXR1cm47CisJCX0gZWxzZSB7CQkvKiBJbnZhbGlkIGJhY2tzbGFzaCBjb2RlLiAqLworCQkgICAgY29ub2MoQkVMKTsKKwkJICAgIHJldHVybjsKKwkJfQorCSAgICB9CisJICAgIGNvbm9jKEJFTCk7IHJldHVybjsgCS8qIEludmFsaWQgZXNjIGFyZywgYmVlcCAqLworICAgIAl9CisgICAgfQorfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja3VkaWEuYyBiL2NrZXJtaXQtOC4wLjIxMS9ja3VkaWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjBmYmZlCi0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrdWRpYS5jCkBAIC0wLDAgKzEsODI0OSBAQAorI2luY2x1ZGUgImNrY3N5bS5oIgorY2hhciAqZGlhbHYgPSAiRGlhbCBDb21tYW5kLCA4LjAuMTYwLCAyOSBBcHIgMjAwMiI7CisKKy8qICBDIEsgVSBEIEkgQQkgLS0gIE1vZHVsZSBmb3IgYXV0b21hdGljIG1vZGVtIGRpYWxpbmcuICovCisKKy8qCisgIENvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisqLworCisvKgorICBBdXRob3JzOgorCisgIE9yaWdpbmFsICh2ZXJzaW9uIDEsIDE5ODUpIGF1dGhvcjogSGVybSBGaXNjaGVyLCBFbmNpbm8sIENBLgorICBDb250cmlidXRlZCB0byBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIDE5ODUgZm9yIGluY2x1c2lvbiBpbiBDLUtlcm1pdCA0LjAuCisgIEF1dGhvciBhbmQgbWFpbnRhaW5lciBzaW5jZSAxOTg1OiBGcmFuayBkYSBDcnV6LCBDb2x1bWJpYSBVbml2ZXJzaXR5LAorICBmZGNAY29sdW1iaWEuZWR1LgorCisgIENvbnRyaWJ1dGlvbnMgYnkgbWFueSBvdGhlcnMgdGhyb3VnaG91dCB0aGUgeWVhcnMsIGluY2x1ZGluZzogSmVmZnJleQorICBBbHRtYW4sIE1hcmsgQmVycnltYW4sIEZlcm5hbmRvIENhYnJhbCwgSm9obiBDaG1pZWxld3NraSwgSm9lIERvdXBuaWssCisgIFJpY2hhcmQgSGlsbCwgTGFycnkgSmFjb2JzLCBFcmljIEpvbmVzLCBUb20gS2xvb3MsIEJvYiBMYXJzb24sIFBldGVyIE1hdXpleSwKKyAgSm9lIE9yb3N0LCBLZXZpbiBPJ0dvcm1hbiwgS2FpIFV3ZSBSb21tZWwsIERhbiBTY2h1bGxtYW4sIFdhcnJlbiBUdWNrZXIsIGFuZAorICBtYW55IG90aGVycy4KKyovCisKKy8qCisgIEVudHJ5IHBvaW50czoKKyAgICBja2RpYWwoY2hhciAqIG51bWJlcikgICBEaWFsIGEgbnVtYmVyIG9yIGFuc3dlciBhIGNhbGwKKyAgICBkaWFsaHVwKCkgICAgICAgICAgICAgICBIYW5nIHVwIGEgZGlhbGVkIGNvbm5lY3Rpb24KKyAgICBtZG1odXAoKSAgICAgICAgICAgICAgICBVc2UgbW9kZW0gY29tbWFuZHMgdG8gaGFuZyB1cAorCisgIEFsbCBvdGhlciByb3V0aW5lcyBhcmUgc3RhdGljLgorICBEb24ndCBjYWxsIGRpYWxodXAoKSBvciBtZG1odXAoKSB3aXRob3V0IGZpcnN0IGNhbGxpbmcgY2tkaWFsKCkuCisqLworCisvKgorICBUaGlzIG1vZHVsZSBjYWxscyBleHRlcm5hbGx5IGRlZmluZWQgc3lzdGVtLWRlcGVuZGVudCBmdW5jdGlvbnMgZm9yCisgIGNvbW11bmljYXRpb25zIGkvbywgYXMgZGVzY3JpYmVkIGluIENLQ1BMTS5ET0MsIHRoZSBDLUtlcm1pdCBQcm9ncmFtIExvZ2ljCisgIE1hbnVhbCwgYW5kIHRodXMgc2hvdWxkIGJlIHBvcnRhYmxlIHRvIGFsbCBzeXN0ZW1zIHRoYXQgaW1wbGVtZW50IHRob3NlCisgIGZ1bmN0aW9ucywgYW5kIHdoZXJlIGFsYXJtKCkgYW5kIHNpZ25hbCgpIHdvcmsuCisKKyAgSE9XIFRPIEFERCBTVVBQT1JUIEZPUiBBTk9USEVSIE1PREVNOgorCisgIDEuIEluIGNrdXVzci5oLCBkZWZpbmUgYSBtb2RlbS10eXBlIG51bWJlciBzeW1ib2wgKG5fWFhYKSBmb3IgdGhlIG5ldyBtb2RlbSwKKyAgICAgdGhlIG5leHQgaGlnaGVzdCBvbmUuCisKKyAgMi4gSW4gY2t1dXNyLmgsIGFkanVzdCBNQVhfTURNIHRvIHRoZSBuZXcgbnVtYmVyIG9mIG1vZGVtIHR5cGVzLgorCitUaGUgcmVtYWluaW5nIHN0ZXBzIGFyZSBpbiB0aGlzIG1vZHVsZToKKworICAzLiBDcmVhdGUgYSBNRE1JTkYgc3RydWN0dXJlIGZvciBpdC4gIE5PVEU6IFRoZSB3YWtlX3N0ciBzaG91bGQgaW5jbHVkZQorICAgICBhbGwgaW52YXJpYW50IHNldHVwIGluZm8sIGUuZy4gZW5hYmxlIHJlc3VsdCBjb2RlcywgQlJFQUsgdHJhbnNwYXJlbmN5LAorICAgICBtb2R1bGF0aW9uIG5lZ290aWF0aW9uLCBldGMuICBTZWUgY2tja2VyLmggZm9yIE1ETUlORiBzdHJ1Y3QgZGVmaW5pdGlvbi4KKworICA0LiBBZGQgdGhlIGFkZHJlc3Mgb2YgdGhlIE1ETUlORiBzdHJ1Y3R1cmUgdG8gdGhlIG1vZGVtcFtdIGFycmF5LAorICAgICBhY2NvcmRpbmcgdG8gdGhlIG51bWVyaWNhbCB2YWx1ZSBvZiB0aGUgbW9kZW0tdHlwZSBudW1iZXIuCisKKyAgNS4gQWRkIHRoZSB1c2VyLXZpc2libGUgKFNFVCBNT0RFTSkgbmFtZSBhbmQgY29ycmVzcG9uZGluZyBtb2RlbSBudW1iZXIKKyAgICAgdG8gdGhlIG1kbXRhYltdIGFycmF5LCBpbiBhbHBoYWJldGljYWwgb3JkZXIgYnkgbW9kZW0tbmFtZSBzdHJpbmcuCisKKyAgNi4gSWYgdGhpcyBmYWxscyBpbnRvIGEgY2xhc3MgbGlrZSBpc19yb2Nrd2VsbCwgaXNfc3VwcmEsIGV0YywgYWRkIHRoZSBuZXcKKyAgICAgb25lIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjbGFzcy4KKworICA3LiBBZGp1c3QgdGhlIGdldGhybigpIHJvdXRpbmUgdG8gYWNjb3VudCBmb3IgYW55IHNwZWNpYWwgbnVtZXJpYyByZXN1bHQKKyAgICAgY29kZXMgKGlmIGl0J3MgYSBIYXllcyBjb21wYXRpYmxlIG1vZGVtKS4KKworICA4LiBSZWFkIHRocm91Z2ggdGhlIGNvZGUgYW5kIGFkZCBhbnkgbW9kZW0tc3BlY2lmaWMgc2VjdGlvbnMgYXMgbmVjZXNzYXJ5LgorICAgICBGb3IgbW9zdCBtb2Rlcm4gSGF5ZXMtY29tcGF0aWJsZSBtb2RlbXMsIG5vIHNwZWNpZmljIGNvZGUgd2lsbCBiZQorICAgICBuZWVkZWQuCisKKyAgTk9URTogVGhlIE1JTklESUFMIHN5bWJvbCBpcyB1c2VkIHRvIGJ1aWxkIHRoaXMgbW9kdWxlIHRvIGluY2x1ZGUgc3VwcG9ydAorICBmb3Igb25seSBhIG1pbmltdW0gbnVtYmVyIG9mIHN0YW5kYXJkIGFuZC9vciBnZW5lcmFsbHkgdXNlZnVsIG1vZGVtIHR5cGVzLAorICBuYW1lbHkgSGF5ZXMgMTIwMCBhbmQgMjQwMCwgSVRVLVQgKENDSVRUKSBWLjI1YmlzIGFuZCBWLjI1dGVyIChWLjI1MCksCisgIEdlbmVyaWMtSGlnaC1TcGVlZCwgIlVua25vd24iLCBhbmQgTm9uZS4gIFdoZW4gYWRkaW5nIHN1cHBvcnQgZm9yIGEgbmV3CisgIG1vZGVtIHR5cGUsIGtlZXAgaXQgb3V0c2lkZSBvZiB0aGUgTUlOSURJQUwgc2VjdGlvbnMgdW5sZXNzIGl0IGRlc2VydmVzIHRvCisgIGJlIGluIGl0LgorKi8KKworI2luY2x1ZGUgImNrY2RlYi5oIgorI2lmbmRlZiBOT0xPQ0FMCisjaWZuZGVmIE5PRElBTAorI2lmbmRlZiBOT0lDUAorCisjaWZuZGVmIENLX0FURFQKKyNkZWZpbmUgQ0tfQVREVAorI2VuZGlmIC8qIENLX0FURFQgKi8KKworI2lmbmRlZiBOT09MRE1PREVNUyAgICAgICAgLyogVW5sZXNzIGluc3RydWN0ZWQgb3RoZXJ3aXNlLCAqLworI2RlZmluZSBPTERNT0RFTVMgICAgICAgICAgLyoga2VlcCBzdXBwb3J0IGZvciBvbGQgbW9kZW1zLiAqLworI2VuZGlmIC8qIE5PT0xETU9ERU1TICovCisKKyNpZm5kZWYgTV9PTEQJCSAgIC8qIEhpZGUgb2xkIG1vZGVtIGtleXdvcmRzIGluIFNFVCBNT0RFTSB0YWJsZS4gKi8KKyNkZWZpbmUgTV9PTEQgMAkJICAgLyogRGVmaW5lIGFzIENNX0lOViB0byBtYWtlIHRoZW0gaW52aXNpYmxlLiAqLworI2VuZGlmIC8qIE1fT0xEICovCisKKyNpZm5kZWYgTV9BTElBUworI2RlZmluZSBNX0FMSUFTIDY0CisjZW5kaWYgLyogTV9BTElBUyAqLworCisjaWZuZGVmIE1BQworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmIC8qIE1BQyAqLworI2luY2x1ZGUgImNrY2FzYy5oIgorI2luY2x1ZGUgImNrY2tlci5oIgorI2luY2x1ZGUgImNrdWNtZC5oIgorI2luY2x1ZGUgImNrY25ldC5oIgorI2luY2x1ZGUgImNrdXVzci5oIgorCisjaWZkZWYgT1MyT05MWQorI2RlZmluZSBJTkNMX1ZJTwkJCS8qIE5lZWRlZCBmb3IgY2tvY29uLmggKi8KKyNpbmNsdWRlIDxvczIuaD4KKyN1bmRlZiBDT01NRU5UCisjaW5jbHVkZSAiY2tvY29uLmgiCisjZW5kaWYgLyogT1MyT05MWSAqLworCisjaWZkZWYgTlQKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8dGFwaS5oPgorI2luY2x1ZGUgImNrbndpbi5oIgorI2luY2x1ZGUgImNrbnRhcC5oIgorI2VuZGlmIC8qIE5UICovCisjaWZkZWYgT1MyCisjaW5jbHVkZSAiY2tvd2luLmgiCisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgWklMT0cKKyNpZmRlZiBOVAorI2luY2x1ZGUgPHNldGptcGV4Lmg+CisjZWxzZSAvKiBOVCAqLworI2luY2x1ZGUgPHNldGptcC5oPgorI2VuZGlmIC8qIE5UICovCisjZWxzZQorI2luY2x1ZGUgPHNldHJldC5oPgorI2VuZGlmIC8qIFpJTE9HICovCisKKyNpbmNsdWRlICJja2NzaWcuaCIgICAgICAgIC8qIEMtS2VybWl0IHNpZ25hbCBwcm9jZXNzaW5nICovCisKKyNpZmRlZiBNQUMKKyNkZWZpbmUgc2lnbmFsIG1zaWduYWwKKyNkZWZpbmUgU0lHVFlQIGxvbmcKKyNkZWZpbmUgYWxhcm0gbWFsYXJtCisjZGVmaW5lIFNJR19JR04gMAorI2RlZmluZSBTSUdBTFJNIDEKKyNkZWZpbmUgU0lHSU5UICAyCitTSUdUWVAgKCptc2lnbmFsKGludCB0eXBlLCBTSUdUWVAgKCpmdW5jKShpbnQpKSkoaW50KTsKKyNlbmRpZiAvKiBNQUMgKi8KKworI2lmZGVmIEFNSUdBCisjZGVmaW5lIHNpZ25hbCBhc2lnbmFsCisjZGVmaW5lIGFsYXJtIGFhbGFybQorI2RlZmluZSBTSUdBTFJNIChfTlVNU0lHKzEpCisjZGVmaW5lIFNJR1RZUCB2b2lkCitTSUdUWVAgKCphc2lnbmFsKGludCB0eXBlLCBTSUdUWVAgKCpmdW5jKShpbnQpKSkoaW50KTsKK3Vuc2lnbmVkIGFhbGFybSh1bnNpZ25lZCk7CisjZW5kaWYgLyogQU1JR0EgKi8KKworI2lmZGVmIFNUUkFUVVMKKy8qCisgIFZPUyBkb2Vzbid0IGhhdmUgYWxhcm0oKSwgYnV0IGl0IGRvZXMgaGF2ZSBzb21lIHRoaW5ncyB3ZSBjYW4gd29yayB3aXRoLgorICBIb3dldmVyLCB3ZSBoYXZlIHRvIGNhdGNoIGFsbCB0aGUgc2lnbmFscyBpbiBvbmUgcGxhY2UgdG8gZG8gdGhpcywgc28KKyAgd2UgaW50ZXJjZXB0IHRoZSBzaWduYWwoKSByb3V0aW5lIGFuZCBjYWxsIGl0IGZyb20gb3VyIG93biByZXBsYWNlbWVudC4KKyovCisjZGVmaW5lIHNpZ25hbCB2c2lnbmFsCisjZGVmaW5lIGFsYXJtIHZhbGFybQorU0lHVFlQICgqdnNpZ25hbChpbnQgdHlwZSwgU0lHVFlQICgqZnVuYykoaW50KSkpKGludCk7CitpbnQgdmFsYXJtKGludCBpbnRlcnZhbCk7CisjaWZkZWYgcHV0Y2hhcgorI3VuZGVmIHB1dGNoYXIKKyNlbmRpZiAvKiBwdXRjaGFyICovCisjZGVmaW5lIHB1dGNoYXIoeCkgY29ub2MoeCkKKyNpZmRlZiBnZXRjaGFyCisjdW5kZWYgZ2V0Y2hhcgorI2VuZGlmIC8qIGdldGNoYXIgKi8KKyNkZWZpbmUgZ2V0Y2hhcih4KSBjb25pbmMoMCkKKyNlbmRpZiAvKiBTVFJBVFVTICovCisKKyNpZmRlZiBPUzIKKyNpZmRlZiBwdXRjaGFyCisjdW5kZWYgcHV0Y2hhcgorI2VuZGlmIC8qIHB1dGNoYXIgKi8KKyNkZWZpbmUgcHV0Y2hhcih4KSBjb25vYyh4KQorI2VuZGlmIC8qIE9TMiAqLworCisjaWZuZGVmIE5PSElOVFMKK2V4dGVybiBpbnQgaGludHM7CisjZW5kaWYgLyogTk9ISU5UUyAqLworCisjaWZkZWYgQ0tfVEFQSQorZXh0ZXJuIGludCB0dHRhcGk7CitleHRlcm4gaW50IHRhcGlwYXNzOworI2VuZGlmIC8qIENLX1RBUEkgKi8KKworI2lmZGVmIENLTE9HRElBTAorZXh0ZXJuIGludCBkaWFsb2c7CisjZW5kaWYgLyogQ0tMT0dESUFMICovCisKK2NoYXIgKiBkaWFsbXNnW10gPSB7CQkJLyogRElBTCBzdGF0dXMgc3RyaW5ncyAqLworCisgICAgLyogS2V5ZWQgdG8gbnVtYmVycyBkZWZpbmVkIGluIGNrY2tlci5oIC0tIGtlZXAgaW4gc3luYyEgKi8KKworICAgICJESUFMIHN1Y2NlZWRlZCIsCQkJICAgIC8qICAwIERJQV9PSyAqLworICAgICJNb2RlbSB0eXBlIG5vdCBzcGVjaWZpZWQiLAkJICAgIC8qICAxIERJQV9OT01PICovCisgICAgIkNvbW11bmljYXRpb24gZGV2aWNlIG5vdCBzcGVjaWZpZWQiLCAgIC8qICAyIERJQV9OT0xJICovCisgICAgIkNvbW11bmljYXRpb24gZGV2aWNlIGNhbid0IGJlIG9wZW5lZCIsIC8qICAzIERJQV9PUEVOICovCisgICAgIlNwZWVkIG5vdCBzcGVjaWZpZWQiLAkJICAgIC8qICA0IERJQV9OT1NQICovCisgICAgIlByZS1ESUFMIGhhbmd1cCBmYWlsZWQiLAkJICAgIC8qICA1IERJQV9IQU5HICovCisgICAgIkludGVybmFsIGVycm9yIiwJCQkgICAgLyogIDYgRElBX0lFICAgKi8KKyAgICAiRGV2aWNlIGlucHV0L291dHB1dCBlcnJvciIsCSAgICAvKiAgNyBESUFfSU8gICAqLworICAgICJESUFMIFRJTUVPVVQgZXhwaXJlZCIsCQkgICAgLyogIDggRElBX1RJTU8gKi8KKyAgICAiSW50ZXJydXB0ZWQgYnkgdXNlciIsCQkgICAgLyogIDkgRElBX0lOVFIgKi8KKyAgICAiTW9kZW0gbm90IHJlYWR5IiwJCQkgICAgLyogMTAgRElBX05SRFkgKi8KKyAgICAiUGFydGlhbCBkaWFsIE9LIiwJCQkgICAgLyogMTEgRElBX1BBUlQgKi8KKyAgICAiRGlhbCBkaXJlY3RvcnkgbG9va3VwIGVycm9yIiwJICAgIC8qIDEyIERJQV9ESVIgICovCisgICAgIkhhbmd1cCBPSyIsCQkJICAgIC8qIDEzIERJQV9IVVAgICovCisgICAgTlVMTCwJCQkJICAgIC8qIDE0ICh1bmRlZikgICovCisgICAgTlVMTCwJCQkJICAgIC8qIDE1ICh1bmRlZikgICovCisgICAgTlVMTCwJCQkJICAgIC8qIDE2ICh1bmRlZikgICovCisgICAgTlVMTCwJCQkJICAgIC8qIDE3ICh1bmRlZikgICovCisgICAgTlVMTCwJCQkJICAgIC8qIDE4ICh1bmRlZikgICovCisgICAgIk5vIHJlc3BvbnNlIGZyb20gbW9kZW0iLAkJICAgIC8qIDE5IERJQV9OUlNQICovCisgICAgIk1vZGVtIGNvbW1hbmQgZXJyb3IiLAkJICAgIC8qIDIwIERJQV9FUlIgICovCisgICAgIkZhaWx1cmUgdG8gaW5pdGlhbGl6ZSBtb2RlbSIsCSAgICAvKiAyMSBESUFfTk9JTiAqLworICAgICJQaG9uZSBidXN5IiwJCQkgICAgLyogMjIgRElBX0JVU1kgKi8KKyAgICAiTm8gY2FycmllciIsCQkJICAgIC8qIDIzIERJQV9OT0NBICovCisgICAgIk5vIGRpYWx0b25lIiwJCQkgICAgLyogMjQgRElBX05PRFQgKi8KKyAgICAiSW5jb21pbmcgY2FsbCIsCQkJICAgIC8qIDI1IERJQV9SSU5HICovCisgICAgIk5vIGFuc3dlciIsCQkJICAgIC8qIDI2IERJQV9OT0FOICovCisgICAgIkRpc2Nvbm5lY3RlZCIsCQkJICAgIC8qIDI3IERJQV9ESVNDICovCisgICAgIkFuc3dlcmVkIGJ5IHZvaWNlIiwJCSAgICAvKiAyOCBESUFfVk9JQyAqLworICAgICJBY2Nlc3MgZGVuaWVkIC8gZm9yYmlkZGVuIGNhbGwiLAkgICAgLyogMjkgRElBX05PQUMgKi8KKyAgICAiQmxhY2tsaXN0ZWQiLAkJCSAgICAvKiAzMCBESUFfQkxDSyAqLworICAgICJEZWxheWVkIiwgICAgCQkJICAgIC8qIDMxIERJQV9ERUxBICovCisgICAgIkZheCBjb25uZWN0aW9uIiwJCQkgICAgLyogMzIgRElBX0ZBWCAgKi8KKyAgICAiRGlnaXRhbCBsaW5lIiwJCQkgICAgLyogMzMgRElBX0RJR0kgKi8KKyAgICAiVEFQSSBkaWFsaW5nIGZhaWx1cmUiLAkgICAgICAgICAgICAvKiAzNCBESUFfVEFQSSAqLworICAgIE5VTEwJCQkJICAgIC8qIDM0ICovCit9OworCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIE5PU1BMCitzdGF0aWMKKyNlbmRpZiAvKiBOT1NQTCAqLworY2hhciBtb2RlbW1zZ1sxMjhdID0geyBOVUwsIE5VTCB9OwkvKiBESUFMIHJlc3BvbnNlIGZyb20gbW9kZW0gKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBOVFNJRworZXh0ZXJuIGludCBUbHNJbmRleDsKKyNlbmRpZiAvKiBOVFNJRyAqLworCitpbnQgbWRtdHlwID0gbl9HRU5FUklDOwkJCS8qIERlZmF1bHQgbW9kZW0gdHlwZSAqLworaW50IG1kbXNldCA9IDA7CQkJCS8qIFVzZXIgZXhwbGljaXRseSBzZXQgYSBtb2RlbSB0eXBlICovCisKK2ludAkJCQkJLyogU0VUIERJQUwgcGFyYW1ldGVycyAqLworICBkaWFsaG5nID0gMSwJCQkJLyogRElBTCBIQU5HVVAsIGRlZmF1bHQgaXMgT04gKi8KKyAgZGlhbGRweSA9IDAsCQkJCS8qIERJQUwgRElTUExBWSwgZGVmYXVsdCBpcyBPRkYgKi8KKyAgbWRtc3BkICA9IDAsCQkJCS8qIERJQUwgU1BFRUQtTUFUQ0hJTkcgKDAgPSBPRkYpICovCisgIG1kbXNwayAgPSAxLAkJCQkvKiBNT0RFTSBTUEVBS0VSICovCisgIG1kbXZvbCAgPSAyLAkJCQkvKiBNT0RFTSBWT0xVTUUgKi8KKyAgZGlhbHRtbyA9IDAsCQkJCS8qIERJQUwgVElNRU9VVCAqLworICBkaWFsYXRtbyA9IC0xLAkJCS8qIEFOU1dFUiBUSU1FT1VUICovCisgIGRpYWxrc3AgPSAwLAkJCQkvKiBESUFMIEtFUk1JVC1TUE9PRiwgMCA9IE9GRiAqLworICBkaWFsaWR0ID0gMCwJCQkJLyogRElBTCBJR05PUkUtRElBTFRPTkUgKi8KKyNpZm5kZWYgQ0tfUlRTQ1RTCisgIC8qIElmIHdlIGNhbid0IGRvIFJUUy9DVFMgdGhlbiB0aGVyZSdzIG5vIGZsb3cgY29udHJvbCBhdCBmaXJzdC4gICovCisgIC8qIFNvIHdlIG1pZ2h0IGVhc2lseSBsb3NlIHRoZSBlY2hvIHRvIHRoZSBpbml0IHN0cmluZyBhbmQgdGhlIE9LICovCisgIC8qIGFuZCB0aGVuIGdpdmUgIk5vIHJlc3BvbnNlIGZyb20gbW9kZW0iIGVycm9ycy4gKi8KKyAgZGlhbHBhY2UgPSAxNTAsCQkJLyogRElBTCBQQUNJTkcgKi8KKyNlbHNlCisgIGRpYWxwYWNlID0gLTEsCisjZW5kaWYgLyogQ0tfUlRTQ1RTICovCisKKyAgLyogMCA9IFJTMjMyIChkcm9wIERUUik7IDEgPSBNT0RFTS1DT01NQU5EIChlLmcuIDxzZWM+KysrPHNlYz5BVEgwKSAqLworICBkaWFsbWh1ID0gREVGTURNSFVQOwkJCS8qIE1PREVNIEhBTkdVUC1NRVRIT0QgKi8KKworaW50CisgIGRpYWxlYyA9IDEsCQkJCS8qIERJQUwgRVJST1ItQ09SUkVDVElPTiAqLworICBkaWFsZGMgPSAxLAkJCQkvKiBESUFMIENPTVBSRVNTSU9OICAqLworI2lmZGVmIFZNUworICAvKiBWTVMgY2FuIG9ubHkgdXNlIFhvbi9Yb2ZmICovCisgIGRpYWxmYyA9IEZMT19YT05YLAkJCS8qIERJQUwgRkxPVy1DT05UUk9MICovCisjZWxzZQorICBkaWFsZmMgPSBGTE9fQVVUTywKKyNlbmRpZiAvKiBWTVMgKi8KKyAgZGlhbG10aCA9IFhZRE1fRCwJCQkvKiBESUFMIE1FVEhPRCAoVG9uZSwgUHVsc2UsIERlZmFsdCkgKi8KKyAgZGlhbG1hdXRvID0gMSwJCQkvKiBESUFMIE1FVEhPRCBpcyBBVVRPICovCisgIGRpYWxlc2MgPSAwOwkJCQkvKiBESUFMIEVTQ0FQRSAqLworCitpbnQgdGVsZXBob255ID0gMDsJCQkvKiBDb21tYW5kLWxpbmUgJy1UJyBvcHRpb24gKi8KKworbG9uZyBkaWFsbWF4ID0gMEwsCQkJLyogTW9kZW0ncyBtYXggaW50ZXJmYWNlIHNwZWVkICovCisgIGRpYWxjYXBhcyAgPSAwTDsJCQkvKiBNb2RlbSdzIGNhcGFiaWxpdGllcyAqLworCitpbnQgZGlhbHN0YSA9IERJQV9VTks7CQkJLyogRGV0YWlsZWQgcmV0dXJuIGNvZGUgKGNrdXVzci5oKSAqLworCisjaWZkZWYgQ09NTUVOVAoraW50IGFuc19jaWQgPSAwOwkJCS8qIFNFVCBBTlNXRVIgcGFyYW1ldGVycyAqLworaW50IGFuc19yaW5ncyA9IDA7CQkJLyogKG5vdCB1c2VkIHlldC4uLikgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKK2ludCBpc19yb2Nrd2VsbCA9IDA7CitpbnQgaXNfbW90b3JvbGEgPSAwOworaW50IGlzX3N1cHJhID0gMDsKK2ludCBpc19oYXllc2hpc3BkID0gMDsKKworLyogRGlhbGluZyBkaXJlY3RvcnkgbGlzdCAqLworCitjaGFyICpkaWFsZGlyW01BWERESVJdOwkJCS8qIERJQUwgRElSRUNUT1JZIGZpbGVuYW1lIGFycmF5ICovCitpbnQgICBuZGlhbGRpciA9IDA7CQkJLyogSG93IG1hbnkgZGlhbCBkaXJlY3RvcmllcyAqLworCisvKiBVc2VyIG92ZXJyaWRlcyBmb3IgYnVpbHQtaW4gbW9kZW0gY29tbWFuZHMgKi8KKworY2hhciAqZGlhbGluaSA9IE5VTEw7CQkJLyogTU9ERU0gSU5JVC1TVFJJTkcgbm9uZSAqLworY2hhciAqZGlhbG1zdHIgPSBOVUxMOwkJCS8qIE1PREVNIERJQUxNT0RFLVNUUklORyAqLworY2hhciAqZGlhbG1wcm10ID0gTlVMTDsJCQkvKiBNT0RFTSBESUFMTU9ERS1QUk9NUFQgKi8KK2NoYXIgKmRpYWxjbWQgPSBOVUxMOwkJCS8qIE1PREVNIERJQUwtQ09NTUFORCwgZGVmYXVsdCBub25lICovCitjaGFyICpkaWFsbmFtZSAgPSBOVUxMOwkJCS8qIERlc2NyaXB0aXZlIG5hbWUgZm9yIG1vZGVtICovCitjaGFyICpkaWFsZGNvbiAgPSBOVUxMOwkJCS8qIERDIE9OIGNvbW1hbmQgKi8KK2NoYXIgKmRpYWxkY29mZiA9IE5VTEw7CQkJLyogREMgT0ZGIGNvbW1hbmQgKi8KK2NoYXIgKmRpYWxlY29uICA9IE5VTEw7CQkJLyogRUMgT04gY29tbWFuZCAqLworY2hhciAqZGlhbGVjb2ZmID0gTlVMTDsJCQkvKiBFQyBPRkYgY29tbWFuZCAqLworY2hhciAqZGlhbGFhb24gID0gTlVMTDsJCQkvKiBBdXRvYW5zd2VyIE9OIGNvbW1hbmQgKi8KK2NoYXIgKmRpYWxhYW9mZiA9IE5VTEw7CQkJLyogQXV0b2Fuc3dlciBPRkYgY29tbWFuZCAqLworY2hhciAqZGlhbGhjbWQgID0gTlVMTDsJCQkvKiBIYW5ndXAgY29tbWFuZCAqLworY2hhciAqZGlhbGh3ZmMgID0gTlVMTDsJCQkvKiBIYXJkd2FyZSBmbG93IGNvbnRyb2wgY29tbWFuZCAqLworY2hhciAqZGlhbHN3ZmMgID0gTlVMTDsJCQkvKiAoTG9jYWwpIHNvZnR3YXJlIGYuYy4gY29tbWFuZCAqLworY2hhciAqZGlhbG5vZmMgID0gTlVMTDsJCQkvKiBObyAoTG9jYWwpIGZsb3cgY29udHJvbCBjb21tYW5kICovCitjaGFyICpkaWFsdG9uZSAgPSBOVUxMOwkJCS8qIENvbW1hbmQgdG8gZm9yY2UgdG9uZSBkaWFsaW5nICovCitjaGFyICpkaWFscHVsc2UgPSBOVUxMOwkJCS8qICAuLnRvIGZvcmNlIHB1bHNlIGRpYWxpbmcgKi8KK2NoYXIgKmRpYWx4MyAgICA9IE5VTEw7CQkJLyogSWdub3JlIGRpYWx0b25lICovCitjaGFyICptZG1uYW1lICAgPSBOVUxMOworY2hhciAqZGlhbHNwb24gID0gTlVMTDsJCQkvKiBTcGVha2VyIE9uIGNvbW1hbmQgKi8KK2NoYXIgKmRpYWxzcG9mZiA9IE5VTEw7CQkJLyogU3BlYWtlciBPZmYgY29tbWFuZCAqLworY2hhciAqZGlhbHZvbDEgID0gTlVMTDsJCQkvKiBWb2x1bWUgTG93IGNvbW1hbmQgKi8KK2NoYXIgKmRpYWx2b2wyICA9IE5VTEw7CQkJLyogVm9sdW1lIE1lZGl1bSBjb21tYW5kICovCitjaGFyICpkaWFsdm9sMyAgPSBOVUxMOwkJCS8qIFZvbHVtZSBIaWdoIGNvbW1hbmQgKi8KK2NoYXIgKmRpYWxpbmkyICA9IE5VTEw7CQkJLyogU2Vjb25kIGluaXQgc3RyaW5nICovCisKKy8qIFBob25lIG51bWJlciBvcHRpb25zICovCisKK2NoYXIgKmRpYWxucHIgPSBOVUxMOwkJCS8qIERJQUwgUFJFRklYLCBkaXR0byAqLworY2hhciAqZGlhbGxhYyA9IE5VTEw7CQkJLyogRElBTCBMT0NBTC1BUkVBLUNPREUsIGRpdHRvICovCitjaGFyICpkaWFsbGNjID0gTlVMTDsJCQkvKiBESUFMIExPQ0FMLUNPVU5UUlktQ09ERSwgZGl0dG8gKi8KK2NoYXIgKmRpYWxpeHAgPSBOVUxMOwkJCS8qIERJQUwgSU5UTC1QUkVGSVggKi8KK2NoYXIgKmRpYWxpeHMgPSBOVUxMOwkJCS8qIERJQUwgSU5UTC1TVUZGSVggKi8KK2NoYXIgKmRpYWxsZHAgPSBOVUxMOwkJCS8qIERJQUwgTEQtUFJFRklYICovCitjaGFyICpkaWFsbGRzID0gTlVMTDsJCQkvKiBESUFMIExELVNVRkZJWCAqLworY2hhciAqZGlhbGxjcCA9IE5VTEw7CQkJLyogRElBTCBMT0NBTC1QUkVGSVggKi8KK2NoYXIgKmRpYWxsY3MgPSBOVUxMOwkJCS8qIERJQUwgTE9DQUwtU1VGRklYICovCitjaGFyICpkaWFscHhpID0gTlVMTDsJCQkvKiBESUFMIFBCWC1JTlRFUk5BTC1QUkVGSVggKi8KK2NoYXIgKmRpYWxweG8gPSBOVUxMOwkJCS8qIERJQUwgUEJYLU9VVFNJREUtUFJFRklYICovCitjaGFyICpkaWFsc2Z4ID0gTlVMTDsJCQkvKiBESUFMIFNVRkZJWCAqLworY2hhciAqZGlhbHRmcCA9IE5VTEw7CQkJLyogRElBTCBUT0xMLUZSRUUtUFJFRklYICovCisKK2NoYXIgKmNhbGxpZF9kYXRlID0gTlVMTDsJCS8qIENhbGxlciBJRCBzdHJpbmdzICovCitjaGFyICpjYWxsaWRfdGltZSA9IE5VTEw7CitjaGFyICpjYWxsaWRfbmFtZSA9IE5VTEw7CitjaGFyICpjYWxsaWRfbm1iciA9IE5VTEw7CitjaGFyICpjYWxsaWRfbWVzZyA9IE5VTEw7CisKK2V4dGVybiBjaGFyICogZF9uYW1lOworZXh0ZXJuIGNoYXIgKiBkaWFsdGZjW107CQkvKiBESUFMIFRPTEwtRlJFRS1BUkVBLUNPREUgKi8KK2V4dGVybiBjaGFyICogZGlhbHB4eFtdOwkJLyogRElBTCBQQlgtRVhDSEFOR0UgKi8KK2V4dGVybiBpbnQgbnRvbGxmcmVlOworZXh0ZXJuIGludCBuZGlhbHB4eDsKKworZXh0ZXJuIGNoYXIgKiBkaWFscHVjY1tdOwkJLyogRElBTCBQdWxzZSBjb3VudHJpZXMgKi8KK2V4dGVybiBpbnQgbmRpYWxwdWNjOworZXh0ZXJuIGNoYXIgKiBkaWFsdG9jY1tdOwkJLyogRElBTCBUb25lIGNvdW50cmllcyAqLworZXh0ZXJuIGludCBuZGlhbHRvY2M7CisKK2NoYXIgKmRpYWxtYWMgICA9IE5VTEw7CQkJLyogRElBTCBtYWNybyAqLworCisvKiBDb3VudHJpZXMgd2hlcmUgcHVsc2UgZGlhbGluZyBtdXN0IGJlIHVzZWQgKHRvbmUgaXMgbm90IGF2YWlsYWJsZSkgKi8KK3N0YXRpYyBjaGFyICogcHVsc2VjY1tdID0geyBOVUxMIH07CS8qIChVbmtub3duIGF0IHByZXNlbnQpICovCisKKy8qIENvdW50cmllcyB3aGVyZSB0b25lIGRpYWxpbmcgbWF5IHNhZmVseSBiZSB0aGUgZGVmYXVsdC4gKi8KKy8qICIrIiBtYXJrcyBjb3VudHJpZXMgd2hlcmUgcHVsc2UgaXMgYWxzbyBhbGxvd2VkLiAqLworLyogQm90aCBQdWxzZSBhbmQgVG9uZSBhcmUgYWxsb3dlZCBpbiBBdXN0cmlhICYgU3dpdHplcmxhbmQgYnV0IGl0IGlzIG5vdCAqLworLyogeWV0IGtub3duIGlmIFRvbmUgaXMgdW5pdmVyc2FsbHkgaW4gdGhvc2UgY291bnRyaWVzLiAqLworc3RhdGljIGNoYXIgKiB0b25lY2NbXSA9IHsKKyAgICAiMSIsCQkJCS8qICsgTm9ydGggQW1lcmljYW4gTnVtYmVyaW5nIFBsYW4gKi8KKyAgICAiMzEiLAkJCQkvKiAgIE5ldGhlcmxhbmRzICovCisgICAgIjMyIiwJCQkJLyogICBCZWxnaXVtICovCisgICAgIjMzIiwJCQkJLyogICBGcmFuY2UgKi8KKyAgICAiMzUyIiwJCQkJLyogICBMdXhlbWJvdXJnICovCisgICAgIjM1MyIsCQkJCS8qICAgSXJlbGFuZCAqLworICAgICIzNTQiLAkJCQkvKiAgIEljZWxhbmQgKi8KKyAgICAiMzU4IiwJCQkJLyogICBGaW5sYW5kICovCisgICAgIjM5IiwJCQkJLyogICBJdGFseSAqLworICAgICI0NCIsCQkJCS8qICsgVUsgKi8KKyAgICAiNDUiLAkJCQkvKiAgIERlbm1hcmsgKi8KKyAgICAiNDYiLAkJCQkvKiAgIFN3ZWRlbiAqLworICAgICI0NyIsCQkJCS8qICAgTm9yd2F5ICovCisgICAgIjQ5IiwJCQkJLyogKyBHZXJtYW55ICovCisgICAgTlVMTAorfTsKKworI2lmbmRlZiBNSU5JRElBTAorLyoKKyAgVGVsZWJpdCBtb2RlbCBjb2RlczoKKworICBBVEkgIE1vZGVsIE51bWJlcnMgICAgICAgICAgIEV4YW1wbGVzCisgIC0tLSAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgLS0tLS0tLS0KKyAgMTIzICAgICAgICAgICAgICAgICAgICAgICAgICBUZWxlYml0IGluICJ0b3RhbCBIYXllcy0xMjAwIiBlbXVsYXRpb24gbW9kZQorICA5NjAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbGViaXQgaW4gQ29udmVudGlvbmFsIENvbW1hbmQgKEhheWVzKSBtb2RlCisgIDk2MSAgUkExMkMgICAgICAgICAgICAgICAgICAgSUJNIFBDIGludGVybmFsIG9yaWdpbmFsIFRyYWlsYmxhemVyCisgIDk2MiAgUkExMkUgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgb3JpZ2luYWwgVHJhaWxibGF6ZXIKKyAgOTYzICBSTTEyQyAgICAgICAgICAgICAgICAgICBSYWNrbW91bnQgb3JpZ2luYWwgVHJhaWxibGF6ZXIKKyAgOTY0ICBUMThQQyAgICAgICAgICAgICAgICAgICBJQk0gUEMgaW50ZXJuYWwgVHJhaWxibGF6ZXItUGx1cyAoVEIrKQorICA5NjUgIFQxOFNBLCBUMlNBQSwgVDJTQVMgICAgIEV4dGVybmFsIFRCKywgVDE2MDAsIFQyMDAwLCBUMzAwMCwgV0IsIGFuZCBsYXRlcgorICA5NjYgIFQxOFJNTSAgICAgICAgICAgICAgICAgIFJhY2ttb3VudCBUQisKKyAgOTY3ICBUMk1DICAgICAgICAgICAgICAgICAgICBJQk0gUFMvMiBpbnRlcm5hbCBUQisKKyAgOTY4ICBUMTAwMCAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBUMTAwMAorICA5NjkgID8gICAgICAgICAgICAgICAgICAgICAgIFFibGF6ZXIKKyAgOTcwICAgICAgICAgICAgICAgICAgICAgICAgICBRYmxhemVyIFBsdXMKKyAgOTcxICBUMjUwMCAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBUMjUwMAorICA5NzIgIFQyNTAwICAgICAgICAgICAgICAgICAgIFJhY2ttb3VudCBUMjUwMAorKi8KKworLyogVGVsZWJpdCBtb2RlbCBjb2RlcyAqLworCisjZGVmaW5lIFRCX1VOSyAgMAkJCS8qIFVua25vd24gVGVsZWJpdCBtb2RlbCAqLworI2RlZmluZSBUQl9CTEFaIDEJCQkvKiBPcmlnaW5hbCBUcmFpbEJsYXplciAqLworI2RlZmluZSBUQl9QTFVTCTIJCQkvKiBUcmFpbEJsYXplciBQbHVzICovCisjZGVmaW5lIFRCXzEwMDAgMwkJCS8qIFQxMDAwICovCisjZGVmaW5lIFRCXzE1MDAgNAkJCS8qIFQxNTAwICovCisjZGVmaW5lIFRCXzE2MDAgNQkJCS8qIFQxNjAwICovCisjZGVmaW5lIFRCXzIwMDAgNgkJCS8qIFQyMDAwICovCisjZGVmaW5lIFRCXzI1MDAgNwkJCS8qIFQyNTAwICovCisjZGVmaW5lIFRCXzMwMDAgOAkJCS8qIFQzMDAwICovCisjZGVmaW5lIFRCX1FCTEEgOQkJCS8qIFFibGF6ZXIgKi8KKyNkZWZpbmUgVEJfV0JMQSAxMAkJCS8qIFdvcmxkQmxhemVyICovCisjZGVmaW5lIFRCX19NQVggMTAJCQkvKiBIaWdoZXN0IG51bWJlciAqLworCitjaGFyICp0Yl9uYW1lW10gPSB7CQkJLyogQXJyYXkgb2YgbW9kZWwgbmFtZXMgKi8KKyAgICAiVW5rbm93biIsCQkJCS8qIFRCX1VOSyAgKi8KKyAgICAiVHJhaWxCbGF6ZXIiLAkJCS8qIFRCX0JMQVogKi8KKyAgICAiVHJhaWxCbGF6ZXItUGx1cyIsCQkJLyogVEJfUExVUyAqLworICAgICJUMTAwMCIsCQkJCS8qIFRCXzEwMDAgKi8KKyAgICAiVDE1MDAiLAkJCQkvKiBUQl8xNTAwICovCisgICAgIlQxNjAwIiwJCQkJLyogVEJfMTYwMCAqLworICAgICJUMjAwMCIsCQkJCS8qIFRCXzIwMDAgKi8KKyAgICAiVDI1MDAiLAkJCQkvKiBUQl8yNTAwICovCisgICAgIlQzMDAwIiwJCQkJLyogVEJfMzAwMCAqLworICAgICJRYmxhemVyIiwJCQkJLyogVEJfUUJMQSAqLworICAgICJXb3JsZEJsYXplciIsCQkJLyogVEJfV0JMQSAqLworICAgICIiCit9OworI2VuZGlmIC8qIE1JTklESUFMICovCisKK2V4dGVybiBpbnQgZmxvdywgbG9jYWwsIG1kbXR5cCwgcXVpZXQsIGJhY2tncmQsIHBhcml0eSwgc2VzbG9nLCBuZXR3b3JrOworZXh0ZXJuIGludCBjYXJyaWVyLCBkdXBsZXgsIG1kbXNhdiwgcmVsaWFibGUsIHNldHJlbGlhYmxlOworZXh0ZXJuIGludCB0dG5wcm90bywgbmV0dHlwZTsKK2V4dGVybiBsb25nIHNwZWVkOworZXh0ZXJuIGNoYXIgdHRuYW1lW10sIHNlc2ZpbFtdOworI2lmbmRlZiBOT1hGRVIKK2V4dGVybiBDSEFSIHN0Y2hyOworZXh0ZXJuIGludCBpbnRlcnJ1cHRlZDsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworLyogIEZhaWx1cmUgY29kZXMgICovCisKKyNkZWZpbmUgRl9USU1FCQkxCQkvKiB0aW1lb3V0ICovCisjZGVmaW5lIEZfSU5UCQkyCQkvKiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRl9NT0RFTQkJMwkJLyogbW9kZW0tZGV0ZWN0ZWQgZmFpbHVyZSAqLworI2RlZmluZSBGX01JTklUCQk0CQkvKiBjYW5ub3QgaW5pdGlhbGl6ZSBtb2RlbSAqLworCisjaWZuZGVmIENLX1RBUEkKK3N0YXRpYworI2VuZGlmIC8qIENLX1RBUEkgKi8KKyNpZmRlZiBPUzIKKyB2b2xhdGlsZQorI2VuZGlmIC8qIE9TMiAqLworIGludCBmYWlsX2NvZGUgPSAgMDsJCQkvKiBEZWZhdWx0IGZhaWx1cmUgcmVhc29uLiAqLworCitzdGF0aWMgaW50IHhyZWRpYWwgPSAwOworc3RhdGljIGludCBmdW5jX2NvZGU7CQkJLyogMCA9IGRpYWxpbmcsIG5vbnplcm8gPSBhbnN3ZXJpbmcgKi8KK3N0YXRpYyBpbnQgcGFydGlhbDsKK3N0YXRpYyBpbnQgbXltZG10eXAgPSAwOworCisjZGVmaW5lIERXX05PVEhJTkcgICAgICAwCQkvKiBXaGF0IHdlIGFyZSBkb2luZyAqLworI2RlZmluZSBEV19JTklUICAgICAgICAgMQorI2RlZmluZSBEV19ESUFMICAgICAgICAgMgorCitzdGF0aWMgaW50IGRpYWxfd2hhdCA9IERXX05PVEhJTkc7CS8qIE5vdGhpbmcgYXQgZmlyc3QuICovCitzdGF0aWMgaW50IG5vbnZlcmJhbCA9IDA7CQkvKiBIYXllcyBpbiBudW1lcmljIHJlc3BvbnNlIG1vZGUgKi8KK3N0YXRpYyBNRE1JTkYgKiBtcDsKK3N0YXRpYyBDSEFSIGVzY2J1Zls2XTsKK3N0YXRpYyBsb25nIG1kbWNhcGFzOworCitfUFJPVE9UWVAgKHN0YXRpYyBWT0lEIGRyZXNldCwgKHZvaWQpICk7CitfUFJPVE9UWVAgKHN0YXRpYyBpbnQgKCp4eF9vayksIChpbnQsaW50KSApOworX1BST1RPVFlQIChzdGF0aWMgaW50IGRkaW5jLCAoaW50KSApOworX1BST1RPVFlQIChpbnQgZGlhbGh1cCwgKHZvaWQpICk7CitfUFJPVE9UWVAgKGludCBnZXRvaywgKGludCxpbnQpICk7CitfUFJPVE9UWVAgKGNoYXIgKiBja190aW1lLCAodm9pZCkgKTsKK19QUk9UT1RZUCAoc3RhdGljIFZPSUQgdHRzbG93LCAoY2hhciAqLCBpbnQpICk7CisjaWZkZWYgQ09NTUVOVAorX1BST1RPVFlQIChzdGF0aWMgVk9JRCB4Y3B5LCAoY2hhciAqLCBjaGFyICosIHVuc2lnbmVkIGludCkgKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCitfUFJPVE9UWVAgKHN0YXRpYyBWT0lEIHdhaXRmb3IsIChjaGFyICopICk7CitfUFJPVE9UWVAgKHN0YXRpYyBWT0lEIGRpYWxvYywgKGNoYXIpICk7CitfUFJPVE9UWVAgKHN0YXRpYyBpbnQgZGlkd2VnZXQsIChjaGFyICosIGNoYXIgKikgKTsKK19QUk9UT1RZUCAoc3RhdGljIFZPSUQgc3BkY2hnLCAobG9uZykgKTsKK19QUk9UT1RZUCAoc3RhdGljIGludCBkaWFsZmFpbCwgKGludCkgKTsKK19QUk9UT1RZUCAoc3RhdGljIFZPSUQgZ2V0aHJ3LCAodm9pZCkgKTsKK19QUk9UT1RZUCAoc3RhdGljIFZPSUQgZ2V0aHJuLCAodm9pZCkgKTsKKworaW50IGRpYWx1ZHQgPSBuX1VERUY7CQkJLyogTnVtYmVyIG9mIHVzZXItZGVmaW5lZCB0eXBlICovCisKKy8qIEJFR0lOIE1ETUlORiBTVFJVQ1QgREVGSU5JVElPTlMgKi8KKworLyoKKyAgRGVjbGFyZSBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgbW9kZW0tc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgIFJFTUVNQkVSIHRoYXQgb25seSB0aGUgZmlyc3QgU0VWRU4gY2hhcmFjdGVycyBvZiB0aGVzZSBuYW1lcyBhcmUKKyAgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUuCisKKyAgRmlyc3QgZGVjbGFyZSB0aGUgdGhyZWUgdHlwZXMgdGhhdCBhcmUgYWxsb3dlZCBmb3IgTUlOSURJQUwgdmVyc2lvbnMuCisqLworc3RhdGljCitNRE1JTkYgQ0NJVFQgPQkJCQkvKiBDQ0lUVCAvIElUVS1UIFYuMjViaXMgYXV0b2RpYWxlciAqLworLyoKKyAgQWNjb3JkaW5nIHRvIFYuMjViaXM6CisgIC4gRXZlbiBwYXJpdHkgaXMgcmVxdWlyZWQgZm9yIGdpdmluZyBjb21tYW5kcyB0byB0aGUgbW9kZW0uCisgIC4gQ29tbWFuZHMgbWlnaHQgb3IgbWlnaHQgbm90IGVjaG8uCisgIC4gUmVzcG9uc2VzICgiSW5kaWNhdGlvbnMiKSBmcm9tIHRoZSBtb2RlbSBhcmUgdGVybWluYXRlZCBieSBDUiBhbmQgTEYuCisgIC4gQ2FsbCBzZXR1cCBpcyBhY2NvbXBsaXNoZWQgYnk6CisgICAgLSBEVEUgcmFpc2VzIERUUiAoVi4yNCBjaXJjdWl0IDEwOCkgICAgICAgICAgICAgIFt0dG9wZW4oKSBkb2VzIHRoaXNdCisgICAgLSBNb2RlbSByYWlzZXMgQ1RTIChWLjI0IGNpcmN1aXQgMTA2KSAgICAgICAgICAgIFtDLUtlcm1pdCBpZ25vcmVzIHRoaXNdCisgICAgLSBEVEUgaXNzdWVzIGEgY2FsbCByZXF1ZXN0IGNvbW1hbmQgKCJDUk4iKQorICAgIC0gTW9kZW0gcmVzcG9uZHMgd2l0aCAiVkFMIiAoImNvbW1hbmQgYWNjZXB0ZWQiKQorICAgIC0gSWYgdGhlIGNhbGwgaXMgY29tcGxldGVkOgorICAgICAgICBtb2RlbSByZXNwb25kcyB3aXRoICJDTlgiICgiY2FsbCBjb25uZWN0ZWQiKTsKKyAgICAgICAgbW9kZW0gdHVybnMgQ1RTICgxMDYpIE9GRjsKKyAgICAgICAgbW9kZW0gdHVybnMgRFNSICgxMDcpIE9OOworICAgICAgZWxzZToKKyAgICAgICAgbW9kZW0gcmVzcG9uZHMgd2l0aCAiQ0ZJIDxwYXJhbWV0ZXI+IiAoImNhbGwgZmFpbHVyZSBpbmRpY2F0aW9uIikuCisgIC4gVG8gY2xlYXIgYSBjYWxsLCB0aGUgRFRFIHR1cm5zIERUUiAoMTA4KSBPRkYuCisgIC4gVGhlcmUgaXMgbm8gbWVudGlvbiBvZiB0aGUgQ2FycmllciBEZXRlY3QgY2lyY3VpdCAoMTA5KSBpbiB0aGUgc3RhbmRhcmQuCisgIC4gVGhlcmUgaXMgbm8gcHJvdmlzaW9uIGZvciAiZXNjYXBpbmcgYmFjayIgdG8gdGhlIG1vZGVtJ3MgY29tbWFuZCBtb2RlLgorCisgIEl0IGlzIG5vdCBrbm93biB3aGV0aGVyIHRoZXJlIGV4aXN0cyBpbiByZWFsIGxpZmUgYSBwdXJlIFYuMjViaXMgbW9kZW0uCisgIElmIHRoZXJlIGlzLCB0aGlzIGNvZGUgaGFzIG5ldmVyIGJlZW4gdGVzdGVkIG9uIGl0LiAgU2VlIHRoZSBEaWdpdGVsIGVudHJ5LgorKi8KKyAgICB7CisgICAgIkFueSBDQ0lUVCAvIElUVS1UIFYuMjViaXMgY29uZm9ybWFudCBtb2RlbSIsCisgICAgIiIsCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICIiLAkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDQwLAkJCS8qIGRpYWxfdGltZSAtLSBwcm9ncmFtbWFibGUgLS0gKi8KKyAgICAiLDoiLAkJLyogcGF1c2VfY2hhcnMgLS0gIiwiIHdhaXRzIGZvciBwcm9ncmFtbWFibGUgdGltZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogIjoiIHdhaXRzIGZvciBkaWFsIHRvbmUgKi8KKyAgICAxMCwJCQkvKiBwYXVzZV90aW1lIChzZWNvbmRzLCBqdXN0IGEgZ3Vlc3MpICovCisgICAgIiIsCQkJLyogd2FrZV9zdHIgKG5vbmUpICovCisgICAgMjAwLAkJLyogd2FrZV9yYXRlIChtc2VjKSAqLworICAgICJWQUwiLAkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkvKiBkbW9kZV9zdHIgKG5vbmUpICovCisgICAgIiIsCQkJLyogZG1vZGVfcHJvbXB0IChub25lKSAqLworICAgICJDUk4lc1wwMTUiLCAgICAgICAgLyogZGlhbF9zdHIgKi8KKyAgICAyMDAsCQkvKiBkaWFsX3JhdGUgKG1zZWMpICovCisgICAgMCwJCQkvKiBObyBlc2NfdGltZSAqLworICAgIDAsCQkJLyogTm8gZXNjX2NoYXIgICovCisgICAgIiIsCQkJLyogTm8gaHVwX3N0ciAgKi8KKyAgICAiIiwJCQkvKiBod2ZjX3N0ciAqLworICAgICIiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIiIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiIiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiIiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIiIsCQkJLyogZGNfb25fc3RyICovCisgICAgIiIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJDSUNcMDE1IiwJCS8qIGFhX29uX3N0ciAqLworICAgICJESUNcMDE1IiwJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIiIsCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICIiLAkJCS8qIHNwX29uX3N0ciAqLworICAgICIiLAkJCS8qIHZvbDFfc3RyICovCisgICAgIiIsCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiIiwJCQkvKiB2b2wzX3N0ciAqLworICAgICIiLAkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJLyogaW5pMiAqLworICAgIDBMLAkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9WMjUsCQkvKiBjYXBhcyAqLworICAgIE5VTEwJCS8qIE5vIG9rX2ZuICAgICovCit9OworCitzdGF0aWMKK01ETUlORiBIQVlFUyA9CQkJCS8qIEhheWVzIDI0MDAgYW5kIGNvbXBhdGlibGUgbW9kZW1zICovCisgICAgeworICAgICJIYXllcyBTbWFydG1vZGVtIDI0MDAgYW5kIGNvbXBhdGlibGVzIiwKKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFURTFRMFYxJlMwJkMxJkQyXDAxNSIsCQkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMCZTMVwwMTUiLAkJCS8qIHdha2Vfc3RyICovCisjZWxzZQorICAgICJBVFEwXDAxNSIsCQkJCS8qIHdha2Vfc3RyICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICJPS1wwMTUiLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiQVREJXNcMDE1IiwJCQkvKiBkaWFsX3N0ciwgdXNlciBzdXBwbGllcyBEIG9yIFQgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGh3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBzd2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogbm9mY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAyNDAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FULAkJCQkvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCisvKgorICBUaGUgaW50ZW50IG9mIHRoZSAidW5rbm93biIgbW9kZW0gaXMgdG8gYWxsb3cgS0VSTUlUIHRvIHN1cHBvcnQKKyAgdW5rbm93biBtb2RlbXMgYnkgaGF2aW5nIHRoZSB1c2VyIHR5cGUgdGhlIGVudGlyZSBhdXRvZGlhbCBzZXF1ZW5jZQorICAocG9zc2libHkgaW5jbHVkaW5nIGNvbnRyb2wgY2hhcmFjdGVycywgZXRjLikgYXMgdGhlICJwaG9uZSBudW1iZXIiLgorICBUaGUgcHJvdG9jb2wgYW5kIG90aGVyIGNoYXJhY3RlcmlzdGljcyBvZiB0aGlzIG1vZGVtIGFyZSB1bmtub3duLCB3aXRoCisgIHNvbWUgInJlYXNvbmFibGUiIHZhbHVlcyBiZWluZyBjaG9zZW4gZm9yIHNvbWUgb2YgdGhlbS4gIFRoZSBvbmx5IHdheSB0bworICBkZXRlY3QgaWYgYSBjb25uZWN0aW9uIGlzIG1hZGUgaXMgdG8gbG9vayBmb3IgY2Fycmllci4KKyovCitzdGF0aWMKK01ETUlORiBVTktOT1dOID0JCQkvKiBJbmZvcm1hdGlvbiBmb3IgIlVua25vd24iIG1vZGVtICovCisgICAgeworICAgICJVbmtub3duIiwJCQkJLyogbmFtZSAqLworICAgICIiLAkJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICIiLAkJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzAsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiIiwJCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMCwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyAgICAiIiwJCQkJCS8qIHdha2Vfc3RyICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICIiLAkJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgIE5VTEwsCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICIlc1wwMTUiLAkJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAwLAkJCQkJLyogZXNjX3RpbWUgKi8KKyAgICAwLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiIiwJCQkJCS8qIGh1cF9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGh3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBzd2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogbm9mY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wxX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDNfc3RyICovCisgICAgIiIsCQkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDBMLAkJCQkJLyogbWF4X3NwZWVkICovCisgICAgMCwJCQkJCS8qIGNhcGFzICovCisgICAgTlVMTAkJCQkvKiBva19mbiAqLworfTsKKworI2lmbmRlZiBNSU5JRElBTAorc3RhdGljCitNRE1JTkYgQVRUSVNOID0JCQkJLyogQVQmVCBJU04gTmV0d29yayAqLworICAgIHsKKyAgICAiIiwJCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiIiwJCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgICJBVCZUIElTTiBOZXR3b3JrIiwKKyAgICAzMCwJCQkJCS8qIERpYWwgdGltZSAqLworICAgICIiLAkJCQkJLyogUGF1c2UgY2hhcmFjdGVycyAqLworICAgIDAsCQkJCQkvKiBQYXVzZSB0aW1lICovCisgICAgIlwwMTVcMDE1XDAxNVwwMTUiLAkJCS8qIFdha2Ugc3RyaW5nICovCisgICAgOTAwLAkJCQkvKiBXYWtlIHJhdGUgKi8KKyAgICAiRElBTCIsCQkJCS8qIFdha2UgcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICIlc1wwMTUiLAkJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAwLAkJCQkJLyogZXNjX3RpbWUgKi8KKyAgICAwLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiIiwJCQkJCS8qIGh1cF9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGh3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBzd2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogbm9mY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wxX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDNfc3RyICovCisgICAgIiIsCQkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDBMLAkJCQkJLyogbWF4X3NwZWVkICovCisgICAgMCwJCQkJCS8qIGNhcGFzICovCisgICAgTlVMTAkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgQVRUTU9ERU0gPQkvKiBpbmZvcm1hdGlvbiBmb3IgQVQmVCBzd2l0Y2hlZC1uZXR3b3JrIG1vZGVtcyAqLworCQkJLyogIk51bWJlciIgZm9sbG93aW5nICJkaWFsIiBjYW4gaW5jbHVkZTogcCdzIGFuZAorCQkJICogdCdzIHRvIGluZGljYXRlIHB1bHNlIG9yIHRvbmUgKGRlZmF1bHQpIGRpYWxpbmcsCisJCQkgKiArIGZvciB3YWl0IGZvciBkaWFsIHRvbmUsICwgZm9yIHBhdXNlLCByIGZvcgorCQkJICogbGFzdCBudW1iZXIgZGlhbGVkLCBhbmQsIGV4Y2VwdCBmb3IgMjIyNEIsIHNvbWUKKwkJCSAqIGNvbW1hLWRlbGltaXRlZCBvcHRpb25zIGxpa2UgbzEyPXksIGJlZm9yZSBudW1iZXIuCisKKyAqICJJbXBvcnRhbnQiIG9wdGlvbnMgZm9yIHRoZSBtb2RlbXM6CisgKgorICoJQWxsOgkJRXhjZXB0IGZvciAyMjI0QiwgZW5hYmxlIG9wdGlvbiAxMiBmb3IgInRyYW5zcGFyZW50CisgKgkJCWRhdGEsIiBvMTI9eS4gIElmIGEgY29tcHV0ZXIgcG9ydCB1c2VkIGZvciBib3RoCisgKgkJCWluY29taW5nIGFuZCBvdXRnb2luZyBjYWxscyBpcyBjb25uZWN0ZWQgdG8gdGhlCisgKgkJCW1vZGVtLCBkaXNhYmxlICJlbnRlciBpbnRlcmFjdGl2ZSBtb2RlIG9uIGNhcnJpYWdlCisgKgkJCXJldHVybiwiIEVJQ1IuICBUaGUgS2VybWl0ICJkaWFsIiBjb21tYW5kIGNhbgorICoJCQlmdW5jdGlvbiB3aXRoIEVJQSBsZWFkcyBzdGFuZGFyZCwgRUlBUy4KKyAqCisgKgkyMjEyQzoJCUludGVybmFsIGhhcmR3YXJlIHN3aXRjaGVzIGF0IHRoZWlyIGRlZmF1bHQKKyAqCQkJcG9zaXRpb25zIChmb3VyIHJvY2tlcnMgZG93biBhd2F5IGZyb20gbnVtYmVycykKKyAqCQkJdW5sZXNzIEVJQ1IgaXMgbm90IHdhbnRlZCAocm9ja2VyIGRvd24gYXQgdGhlIDQpLgorICoJCQlGb3IgRUlBUywgcm9ja2VyIGRvd24gYXQgdGhlIDEuCisgKgorICoJMjIyNEI6CQlGcm9udC1wYW5lbCBzd2l0Y2ggcG9zaXRpb24gMSBtdXN0IGJlIHVwIChhdCB0aGUgMSwKKyAqCQkJY2xvc2VkKS4gIERpc2FibGUgRUlDUiB3aXRoIHBvc2l0aW9uIDIgZG93bi4KKyAqCQkJRm9yIEVJQVMsIHBvc2l0aW9uIDQgZG93bi4KKyAqCQkJQWxsIHN3aXRjaGVzIG9uIHRoZSBiYWNrIHBhbmVsIGRvd24uCisgKgorICoJMjIyNENFTzoJQWxsIGZyb250LXBhbmVsIHN3aXRjaGVzIGRvd24gZXhjZXB0IGVpdGhlciA1IG9yIDYuCisgKgkJCUVuYWJsZSBpbnRlcmFjdGl2ZSBmbG93IGNvbnRyb2wgd2l0aCBvMTY9eS4KKyAqCQkJU2VsZWN0IG5vcm1hbCBhc3luY2hyb25vdXMgbW9kZSB3aXRoIG8zND0wICh6ZXJvKS4KKyAqCQkJRGlzYWJsZSBFSUNSIHdpdGggcG9zaXRpb24gMyB1cC4gIEZvciBFSUFTLCAxIHVwLgorICoJCQlSZXNldCB0aGUgbW9kZW0gYWZ0ZXIgY2hhbmdpbmcgc3dpdGNoZXMuCisgKgorICoJMjI5NkE6CQlJZiBvcHRpb24gMDAgKHplcm9zKSBpcyBwcmVzZW50LCB1c2UgbzAwPTAuCisgKgkJCUVuYWJsZSBpbnRlcmFjdGl2ZSBmbG93IGNvbnRyb2wgd2l0aCBvMTY9eS4KKyAqCQkJU2VsZWN0IG5vcm1hbCBhc3luY2hyb25vdXMgbW9kZSB3aXRoIG8zND0wICh6ZXJvKS4KKyAqICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGUgaW4gTWljcm9jb20gTmV0d29ya2luZyB2ZXJzaW9uLCBidXQKKyAqICAgICAgICAgICAgICAgICAgICAgIG5vdCBuZWNlc3NhcmlseSBvdGhlciBtb2RlbHMgb2YgdGhlIDIyOTZBKS4KKyAqCQkJRW5hYmxlIG1vZGVtLXBvcnQgZmxvdyBjb250cm9sIChpZiBhdmFpbGFibGUpIHdpdGgKKyAqIAkJCW80Mj15LiAgRW5hYmxlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2l0aCBvNTA9eS4KKyAqIAkJCURpc2FibGUgRUlDUiB3aXRoIG82OT1uLiAgRm9yIEVJQVMsIG82Nj1uLCB1c2luZworICogCQkJZnJvbnQgcGFuZWwuCisgKi8KKyAgICB7CisgICAiQVQmVCBzd2l0Y2hlZC1uZXR3b3JrIG1vZGVtcyIsCisgICAgIiIsCQkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIiIsCQkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAyMCwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworICAgICIrIiwJCQkJLyogd2FrZV9zdHIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIiIsCQkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiYXQlc1wwMTUiLAkJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAwLAkJCQkJLyogZXNjX3RpbWUgKi8KKyAgICAwLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiIiwJCQkJCS8qIGh1cF9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGh3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBzd2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogbm9mY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wxX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDNfc3RyICovCisgICAgIiIsCQkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDBMLAkJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FULAkJCQkvKiBjYXBhcyAqLworICAgIE5VTEwJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIEFUVERURE0gPSAvKiBBVCZUIERpZ2l0YWwgVGVybWluYWwgRGF0YSBNb2R1bGUgICovCisJCSAvKiBGb3IgZGlhbGluZzogS1lCRCBzd2l0Y2ggZG93biwgb3RoZXJzIHVzdWFsbHkgdXAuICovCisgICAgeworICAgICJBVCZUIERpZ2l0YWwgVGVybWluYWwgRGF0YSBNb2R1bGUiLAorICAgICIiLAkJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICIiLAkJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMjAsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiIiwJCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMCwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyAgICAiIiwJCQkJCS8qIHdha2Vfc3RyICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICIiLAkJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIiVzXDAxNSIsCQkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDAsCQkJCQkvKiBlc2NfdGltZSAqLworICAgIDAsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICIiLAkJCQkJLyogaHVwX3N0ciAqLworICAgICIiLAkJCQkJLyogaHdmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHN3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBub2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGFhX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDFfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wyX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgMEwsCQkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICAwLAkJCQkJLyogY2FwYXMgKi8KKyAgICBOVUxMCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBESUdJVEVMID0gICAgICAgIC8qIERpZ2l0ZWwgRFQtMjIgQ0NJVFQgdmFyaWFudCB1c2VkIGluIEJyYXppbCAqLworLyoKKyAgQXR0ZW1wdHMgdG8gYWRoZXJlIHN0cmljdGx5IHRvIHRoZSBWLjI1YmlzIHNwZWNpZmljYXRpb24gZG8gbm90IHByb2R1Y2UgZ29vZAorICByZXN1bHRzIGluIHJlYWwgbGlmZS4gIFRoZSBtb2RlbSBmb3Igd2hpY2ggdGhpcyBjb2RlIHdhcyBkZXZlbG9wZWQ6IChhKQorICBpZ25vcmVzIHBhcml0eTsgKGIpIHNvbWV0aW1lcyB0ZXJtaW5hdGVzIHJlc3BvbnNlcyB3aXRoIExGIENSIGluc3RlYWQgb2YgQ1IKKyAgTEY7IChjKSBoYXMgYSBIYXllcy1saWtlIGVzY2FwZSBzZXF1ZW5jZTsgKGQpIHN1cHBvcnRzIGEgaGFuZ3VwICgiSFVQIikKKyAgY29tbWFuZC4gIEluZm9ybWF0aW9uIGZyb20gRmVybmFuZG8gQ2FicmFsIGluIEJyYXNpbGlhLgorKi8KKyAgICB7CisgICAgIkRpZ2l0ZWwgRFQtMjIgQ0NJVFQgZGlhbGVyIiwKKyAgICAiIiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICIiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICA0MCwJCQkJLyogZGlhbF90aW1lIC0tIHByb2dyYW1tYWJsZSAtLSAqLworICAgICIsOiIsCQkvKiBwYXVzZV9jaGFycyAtLSAiLCIgd2FpdHMgZm9yIHByb2dyYW1tYWJsZSB0aW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAiOiIgd2FpdHMgZm9yIGRpYWwgdG9uZSAqLworICAgIDEwLAkJCS8qIHBhdXNlX3RpbWUgKHNlY29uZHMsIGp1c3QgYSBndWVzcykgKi8KKyAgICAiSFVQXDAxNSIsICAgICAgICAgIC8qIHdha2Vfc3RyIChOb3QgU3RhbmRhcmQgQ0NJVFQpICovCisgICAgMjAwLAkJLyogd2FrZV9yYXRlIChtc2VjKSAqLworICAgICJWQUwiLAkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkvKiBkbW9kZV9zdHIgKG5vbmUpICovCisgICAgIiIsCQkJLyogZG1vZGVfcHJvbXB0IChub25lKSAqLworICAgICJDUk4lc1wwMTUiLCAgICAgICAgLyogZGlhbF9zdHIgKi8KKyAgICAyMDAsCQkvKiBkaWFsX3JhdGUgKG1zZWMpICovCisgICAgMTEwMCwJCS8qIGVzY190aW1lIChOb3QgU3RhbmRhcmQgQ0NJVFQpICovCisgICAgNDMsCQkJLyogZXNjX2NoYXIgIChOb3QgU3RhbmRhcmQgQ0NJVFQpICovCisgICAgIkhVUFwwMTUiLAkJLyogaHVwX3N0ciAgKE5vdCBTdGFuZGFyZCBDQ0lUVCkgKi8KKyAgICAiIiwJCQkJCS8qIGh3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBzd2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogbm9mY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkNJQ1wwMTUiLAkJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiRElDXDAxNSIsCQkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wxX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDNfc3RyICovCisgICAgIiIsCQkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDBMLAkJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX1YyNSwJCQkJLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgSF8xMjAwID0JCS8qIEhheWVzIDEyMDAgYW5kIGNvbXBhdGlibGUgbW9kZW1zICovCisgICAgeworICAgICJIYXllcyBTbWFydG1vZGVtIDEyMDAgYW5kIGNvbXBhdGlibGVzIiwKKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFURTFRMFYxXDAxNSIsCQkJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBcMDE1IiwJCQkJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIiIsCQkJCQkvKiBod2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogc3dmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIG5vZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIkFUTTFcMDE1IiwJCQkJLyogc3Bfb25fc3RyICovCisgICAgIkFUTTBcMDE1IiwJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICJBVEwxXDAxNSIsCQkJCS8qIHZvbDFfc3RyICovCisgICAgIkFUTDJcMDE1IiwJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiQVRMM1wwMTUiLAkJCQkvKiB2b2wzX3N0ciAqLworICAgICIiLAkJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAxMjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FULAkJCQkvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBIX1VMVFJBID0JCQkvKiBIYXllcyBoaWdoLXNwZWVkICovCisgICAgeworICAgICJIYXllcyBVbHRyYS9PcHRpbWEvQWNjdXJhIDk2LzE0NC8yODgiLCAvKiBVLE8sQSAqLworICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRFMVEwVjFYNE4xWTAmUzAmQzEmRDJTMzc9MFM4Mj0xMjhcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBYNE4xWTAmUzFTMzc9MFM4Mj0xMjhcMDE1IiwJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBYNE4xWTBTMzc9MFM4Mj0xMjhcMDE1IiwJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkszXDAxNSIsCQkJLyogaHdmY19zdHIgKi8gICAvKiBPSyBmb3IgVSxPICovCisgICAgIkFUJks0XDAxNSIsCQkJLyogc3dmY19zdHIgKi8gICAvKiBPSyBmb3IgVSxPICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8gICAvKiBPSyBmb3IgVSxPICovCisgICAgIkFUJlE1UzM2PTdTNDg9N1wwMTUiLAkJLyogZWNfb25fc3RyICovICAvKiBPSyBmb3IgVSxPICovCisgICAgIkFUJlEwXDAxNSIsCQkJLyogZWNfb2ZmX3N0ciAqLyAvKiBPSyBmb3IgVSxPICovCisgICAgIkFUUzQ2PTJcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVRTNDY9MFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLyAgLyogKHZhcmllcykgKi8KKyAgICBDS0RfQVR8Q0tEX1NCfENLRF9FQ3xDS0RfREN8Q0tEX0hXfENLRF9TVywgLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgSF9BQ0NVUkEgPQkJCS8qIEhheWVzIEFjY3VyYSAqLworICAgIHsJCQkJCS8qIEdVRVNTSU5HIElUJ1MgTElLRSBVTFRSQSAmIE9QVElNQSAqLworICAgICJIYXllcyBBY2N1cmEiLAorICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRFMVEwVjFYNE4xWTAmUzAmQzEmRDJTMzc9MFwwMTUiLAkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMFg0TjFZMCZTMVMzNz0wXDAxNSIsCQkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMFg0TjFZMFMzNz0wXDAxNSIsCQkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmSzNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCZLNFwwMTUiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmUTVTMzY9N1M0OD03XDAxNSIsCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQmUTBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUUzQ2PTJcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVRTNDY9MFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLyAgLyogKHZhcmllcykgKi8KKyAgICBDS0RfQVR8Q0tEX1NCfENLRF9FQ3xDS0RfREN8Q0tEX0hXfENLRF9TVywgLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgUFBJID0JCQkJLyogUHJhY3RpY2FsIFBlcmlwaGVyYWxzICAqLworICAgIHsKKyAgICAiUHJhY3RpY2FsIFBlcmlwaGVyYWxzIFYuMjJiaXMgb3IgaGlnaGVyIHdpdGggVi40MiBhbmQgVi40MmJpcyIsCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworI2lmZGVmIENPTU1FTlQKKy8qIEluIG5ld2VyIG1vZGVscyBTODIgKEJSRUFLIGhhbmRsaW5nKSB3YXMgZWxpbWluYXRlZCwgY2F1c2luZyBhbiBlcnJvci4gKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMFg0TjEmUzAmQzEmRDJTMzc9MFM4Mj0xMjhcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBYNE4xUzM3PTBTODI9MTI4XDAxNSIsCQkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIE9TMiAqLworI2Vsc2UgLyogU28gbm93IHdlIHVzZSBZMCBpbnN0ZWFkICovCisjaWZkZWYgT1MyCisgICAgIkFURTFRMFYxWDROMSZTMCZDMSZEMlkwUzM3PTBcMDE1IiwJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBYNE4xWTAmUzFTMzc9MFwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBYNE4xWTBTMzc9MFwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICJPS1wwMTUiLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiQVREJXNcMDE1IiwJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAxMTAwLAkJCQkvKiBlc2NfdGltZSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEgwXDAxNSIsCQkJLyogaHVwX3N0ciAqLworICAgICJBVCZLM1wwMTUiLAkJCS8qIGh3ZmNfc3RyICovCisgICAgIkFUJks0XDAxNSIsCQkJLyogc3dmY19zdHIgKi8KKyAgICAiQVQmSzBcMDE1IiwJCQkvKiBub2ZjX3N0ciAqLworICAgICJBVCZRNVMzNj03UzQ4PTdcMDE1IiwJCS8qIGVjX29uX3N0ciAqLworICAgICJBVCZRMFMzNj0wUzQ4PTEyOFwwMTUiLAkJLyogZWNfb2ZmX3N0ciAqLworICAgICJBVFM0Nj0yXDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUUzQ2PTBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgICovCisgICAgIiIsCQkJCQkvKiBzYl9vZmZfc3RyICAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBEQVRBUE9SVCA9CQkJLyogQVQmVCBEYXRhcG9ydCAgKi8KKyAgICB7CisgICAgIkFUJlQgLyBQYXJhZHluZSBEYXRhUG9ydCBWLjMyIG9yIGhpZ2hlciIsCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworICAgIC8qCisgICAgICAgTm90ZTogUzQxPTAgKHVzZSBoaWdoZXN0IG1vZHVsYXRpb24pIG9taXR0ZWQsIHNpbmNlIGl0IGlzIG5vdAorICAgICAgIHN1cHBvcnRlZCBvbiB0aGUgVi4zMiBhbmQgbG93ZXIgbW9kZWxzLiAgU28gbGV0J3Mgbm90IHRvdWNoIGl0LgorICAgICovCisjaWZkZWYgT1MyCisgICAgIkFUUTBFMVYxWDYmUzAmQzEmRDImUTBZMFxcSzVTNzg9MFwwMTUiLCAvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMEUxWDYmUzEmUTBZMFxcSzVTNzg9MFwwMTUiLAkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMEUxWDYmUTBZMFxcSzVTNzg9MFwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUXFxRM1wwMTUiLAkJCS8qIGh3ZmNfc3RyICovCisgICAgIkFUXFxRMVxcWDBcMDE1IiwJCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVFxcUTBcMDE1IiwJCQkvKiBub2ZjX3N0ciAqLworICAgICJBVFxcTjdcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVRcXE4wXDAxNSIsCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICJBVCVDMVwwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVCVDMFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDU3NjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIFVDT01fQVQgPQkJCS8qIE1pY3JvY29tIERlc2tQb3J0ZSBGQVNUIEVTIDI4LjggKi8KKyAgICB7CisgICAgIk1pY3JvY29tIERlc2tQb3J0ZSBGQVNUIDI4LjgiLAorICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRFMVEwVjFYNFxcTjBGMCZTMCZDMSZEMlxcSzVcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBYNEYwJlMxXFxLNVwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBYNEYwXFxLNVwwMTUiLAkJCS8qIHdha2Vfc3RyICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICJPS1wwMTUiLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiQVREJXNcMDE1IiwJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAxMTAwLAkJCQkvKiBlc2NfdGltZSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEgwXDAxNSIsCQkJLyogaHVwX3N0ciAqLworICAgICJBVFxcUTNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVFxcUTFcMDE1IiwJCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVFxcSDBcXFEwXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVRcXE4zXDAxNSIsCQkJLyogZWNfb25fc3RyICovCisgICAgIkFUXFxOMFwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQlQzNcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVQlQzBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIkFULUowXDAxNSIsCQkJLyogc2Jfb25fc3RyICovCisgICAgIkFULUoxXDAxNSIsCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBaT09NID0JCQkJLyogWm9vbSBUZWxlcGhvbmljcyBWLjMyYmlzICAqLworICAgIHsKKyAgICAiWm9vbSBUZWxlcGhvbmljcyBWLjMyYmlzIiwKKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFURTFRMFYxTjFXMVg0JlMwJkMxJkQyUzgyPTEyOFM5NT00N1wwMTUiLCAvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMEUxTjFXMVg0JlMxUzgyPTEyOFM5NT00N1wwMTUiLAkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMEUxTjFXMVg0UzgyPTEyOFM5NT00N1wwMTUiLAkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmSzNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCZLNFwwMTUiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmUTVTMzY9N1M0OD03XDAxNSIsCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQmUTBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUUzQ2PTEzOFwwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVFM0Nj0xMzZcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICA1NzYwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBaWVhFTCA9CQkJCS8qIFp5WEVMIFUtU2VyaWVzICovCisgICAgeworICAgICJaeVhFTCBVLVNlcmllcyBWLjMyYmlzIG9yIGhpZ2hlciIsCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworI2lmZGVmIE9TMgorICAgICJBVEUxUTBWMSZTMCZDMSZEMiZOMFg1JlkxXDAxNSIsCS8qIHdha2Vfc3RyICovCisjZWxzZQorI2lmZGVmIFZNUworICAgICJBVFEwRTEmUzEmTjBYNSZZMVwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBFMSZOMFg1JlkxXDAxNSIsCQkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmSDNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCZINFwwMTUiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkgwXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmSzNcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQmSzBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJks0XDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUJkszXDAxNSIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIkFUTTFcMDE1IiwJCQkJLyogc3Bfb25fc3RyICovCisgICAgIkFUTTBcMDE1IiwJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICJBVEwxXDAxNSIsCQkJCS8qIHZvbDFfc3RyICovCisgICAgIkFUTDJcMDE1IiwJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiQVRMM1wwMTUiLAkJCQkvKiB2b2wzX3N0ciAqLworICAgICJBVFgzXDAxNSIsCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgNTc2MDBMLAkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICBDS0RfQVR8Q0tEX1NCfENLRF9FQ3xDS0RfREN8Q0tEX0hXfENLRF9TVywgLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgWk9MVFJJWCA9CQkJLyogWm9sdHJpeCAqLworICAgIHsKKyAgICAiWm9sdHJpeCBWLjMyYmlzIGFuZCBWLjM0IG1vZGVtcyB3aXRoIFJvY2t3ZWxsIEFDSSBjaGlwc2V0IiwKKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAiQVRFMVEwVjFGMFcxWDRZMCZTMCZDMSZEMlxcSzVTODI9MTI4Uzk1PTQxXDAxNSIsIC8qIHdha2Vfc3RyICovCisjZWxzZQorI2lmZGVmIFZNUworICAgIkFUUTBFMUYwVzFYNFkwJlMxXFxLNVM4Mj0xMjhTOTU9NDFcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAiQVRRMEUxRjBXMVg0WTBcXEs1UzgyPTEyOFM5NT00MVwwMTUiLCAvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmSzNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCZLNFMzMj0xN1MzMz0xOVwwMTUiLAkJLyogc3dmY19zdHIgKi8KKyAgICAiQVQmSzBcMDE1IiwJCQkvKiBub2ZjX3N0ciAqLworICAgICJBVFxcTjNcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVRcXE4xXDAxNSIsCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICJBVFM0Nj0xMzglQzNcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVRTNDY9MTM2JUMwXDAxNSIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICJBVFxcTjBcMDE1IiwJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiQVQmUTBcMDE1IiwJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIkFUTTFcMDE1IiwJCQkJLyogc3Bfb25fc3RyICovCisgICAgIkFUTTBcMDE1IiwJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICJBVEwxXDAxNSIsCQkJCS8qIHZvbDFfc3RyICovCisgICAgIkFUTDJcMDE1IiwJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiQVRMM1wwMTUiLAkJCQkvKiB2b2wzX3N0ciAqLworICAgICJBVFgzXDAxNSIsCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgNTc2MDBMLAkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICBDS0RfQVR8Q0tEX1NCfENLRF9FQ3xDS0RfREN8Q0tEX0hXfENLRF9TVywgLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgTU9UT1JPTEEgPSB7CQkJLyogTW90b3JvbGEgRmFzVGFsayBJSSBvciBMaWZlc3R5bGUgKi8KKy8qCisgICJcRSIgYW5kICJcWCIgY29tbWFuZHMgcmVtb3ZlZCAtIE1vdG9yb2xhIExpZmVzdHlsZSBkb2Vzbid0IGhhdmUgdGhlbS4KKyAgICAgXEUwID0gRG9uJ3QgZWNobyB3aGlsZSBvbmxpbmUKKyAgICAgXFgwID0gUHJvY2VzcyBYb24vWG9mZiBidXQgZG9uJ3QgcGFzcyB0aHJvdWdoCisqLworICAgICJNb3Rvcm9sYSBGYXNUYWxrIElJIG9yIExpZmVzdHlsZSIsCS8qIE5hbWUgKi8KKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFURTFRMFYxWDQmUzAmQzEmRDJcXEs1XFxWMVwwMTUiLAkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMEUxWDQmUzFcXEs1XFxWMVwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBFMVg0XFxLNVxcVjFcMDE1IiwJCS8qIHdha2Vfc3RyICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICJPS1wwMTUiLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiQVREJXNcMDE1IiwJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAxMTAwLAkJCQkvKiBlc2NfdGltZSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEgwXDAxNSIsCQkJLyogaHVwX3N0ciAqLworICAgICJBVFxcUTNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVFxcUTFcMDE1IiwJCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVFxcUTBcMDE1IiwJCQkvKiBub2ZjX3N0ciAqLworICAgICJBVFxcTjZcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVRcXE4xXDAxNSIsCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICJBVCVDMVwwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVCVDMFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiQVRcXEowXDAxNSIsCQkJLyogc2Jfb25fc3RyICovCisgICAgIkFUXFxKMVwwMTUiLAkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICA1NzYwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBCT0NBID0JCQkJLyogQm9jYSAqLworICAgIHsKKyAgICAiQk9DQSAxNC40IEZheG1vZGVtIiwKKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFURTFRMFYxRjFOMVcxJlMwJkMxJkQyXFxLNVMzNz0xMVM4Mj0xMjhTOTU9NDdYNFwwMTUiLCAvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMEUxRjFOMVcxJlMxXFxLNVMzNz0xMVM4Mj0xMjhTOTU9NDdYNFwwMTUiLCAvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMEUxRjFOMVcxXFxLNVMzNz0xMVM4Mj0xMjhTOTU9NDdYNFwwMTUiLCAvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmSzNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCZLNFwwMTUiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVRcXE4zUzM2PTdTNDg9N1wwMTUiLAkJLyogZWNfb25fc3RyICovCisgICAgIkFUXFxOMVwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVRTNDY9MTM4XDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUUzQ2PTEzNlwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDU3NjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIElOVEVMID0JCQkJLyogSW50ZWwgKi8KKyAgICB7CisgICAgIkludGVsIEhpZ2gtU3BlZWQgRmF4bW9kZW0iLAorICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRFMVEwVjFZMFg0JlMwJkMxJkQyXFxLMVxcVjJTMjU9NTBcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBFMVkwWDQmUzFcXEsxXFxWMlMyNT01MFwwMTUiLAkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMEUxWTBYNFxcSzFcXFYyUzI1PTUwXDAxNSIsCS8qIHdha2Vfc3RyICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICJPS1wwMTUiLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICJBVEIxK0ZDTEFTUz0wXDAxNSIsCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVRcXEcxXFxRM1wwMTUiLAkJCS8qIGh3ZmNfc3RyICovCisgICAgIkFUXFxHMVxcUTFcXFgwXDAxNSIsCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVFxcRzBcMDE1IiwJCQkvKiBub2ZjX3N0ciAqLworICAgICJBVFxcSjBcXE4zXCJIM1wwMTUiLAkJLyogZWNfb25fc3RyICovCisgICAgIkFUXFxOMVwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQlQzFcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVQlQzBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICA1NzYwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBNVUxUSVRFQ0ggPQkJCS8qIE11bHRpdGVjaCAqLworICAgIHsKKyAgICAiTXVsdGl0ZWNoIE1UMTQzMiBvciBNVDI4MzQgU2VyaWVzIiwKKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisvKiAjUDAgKD0gbm8gcGFyaXR5KSBpcyBub3QgbGlzdGVkIGluIHRoZSBtYW51YWwgZm9yIG5ld2VyIG1vZGVscyAqLworLyogc28gaXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGFsbCB0aHJlZSBjb3BpZXMgb2YgdGhlIE11bHRpdGVjaCB3YWtlX3N0ciAqLworI2lmZGVmIE9TMgorICAgICJBVEUxUTBWMVg0JlMwJkMxJkQyJkU4JlEwXDAxNSIsCS8qIHdha2Vfc3RyICovCisjZWxzZQorI2lmZGVmIFZNUworICAgICJBVFEwRTFYNCZTMSZFOCZRMFwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBFMVg0JkU4JlEwXDAxNSIsCQkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmRTQmRTcmRTgmRTExJkUxM1wwMTUiLAkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmRTUmRTYmRTgmRTExJkUxM1wwMTUiLAkJLyogc3dmY19zdHIgKi8KKyAgICAiQVQmRTMmRTcmRTgmRTEwJkUxMlwwMTUiLAkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmRTFcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQmRTBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJkUxNVwwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVCZFMTRcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIkFUJEJBMFwwMTUiLAkJCS8qIHNiX29uX3N0ciAoPSAiYmF1ZCBhZGp1c3Qgb2ZmIikgKi8KKyAgICAiQVQkQkExXDAxNSIsCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDU3NjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIFNVUFJBID0JCQkJLyogU3VwcmEgKi8KKyAgICB7CisgICAgIlN1cHJhRkFYTW9kZW0gMTQ0IG9yIDI4OCIsCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworI2lmZGVmIE9TMgorICAgICJBVFEwRTFWMU4xVzBYNFkwJlMwJkMxJkQyXFxLNVM4Mj0xMjhcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBFMU4xVzBYNFkwJlMxXFxLNVM4Mj0xMjhcMDE1IiwJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBFMU4xVzBYNFkwXFxLNVM4Mj0xMjhcMDE1IiwJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkszXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmSzRcMDE1IiwJCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVCZLMFwwMTUiLAkJCS8qIG5vZmNfc3RyICovCisgICAgIkFUJlE1XFxOM1M0OD03XDAxNSIsCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQmUTBcXE4xXDAxNSIsCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICJBVCVDMVM0Nj0xMzhcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVQlQzBTNDY9MTM2XDAxNSIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIkFUTTFcMDE1IiwJCQkJLyogc3Bfb25fc3RyICovCisgICAgIkFUTVwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTFwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDU3NjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIFNVUFJBWCA9CQkJCS8qIFN1cHJhIEV4cHJlc3MgKi8KKyAgICB7CisgICAgIkRpYW1vbmQgU3VwcmEgRXhwcmVzcyBWLjkwIiwKKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFUUTBFMVYxVzBYNCZDMSZEMiZTMFxcSzVcMDE1IiwJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBFMVcwWDQmUzFcXEs1XDAxNSIsCQkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMEUxVzBYNFxcSzVcMDE1IiwJCS8qIHdha2Vfc3RyICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICJPS1wwMTUiLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiQVREJXNcMDE1IiwJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAxMTAwLAkJCQkvKiBlc2NfdGltZSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEgwXDAxNSIsCQkJLyogaHVwX3N0ciAqLworICAgICJBVCZLM1wwMTUiLAkJCS8qIGh3ZmNfc3RyICovCisgICAgIkFUJks0XDAxNSIsCQkJLyogc3dmY19zdHIgKi8KKyAgICAiQVQmSzBcMDE1IiwJCQkvKiBub2ZjX3N0ciAqLworICAgICJBVFxcTjNcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVRcXE4xXDAxNSIsCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICJBVCVDMlwwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVCVDMFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE1cMDE1IiwJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICJBVExcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAyMzA0MDBMLAkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICBDS0RfQVR8Q0tEX1NCfENLRF9FQ3xDS0RfREN8Q0tEX0hXfENLRF9TVywgLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgTUFYVEVDSCA9CQkJLyogTWF4VGVjaCAqLworICAgIHsKKyAgICAiTWF4VGVjaCBYTTI4OEVBIG9yIEdWQyBGQVhNb2RlbSIsCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworI2lmZGVmIE9TMgorICAgICJBVFEwRTFWMVg0WTAmUzAmQzEmRDImTDAmTTBcXEs1XDAxNSIsIC8qIHdha2Vfc3RyICovCisjZWxzZQorI2lmZGVmIFZNUworICAgICJBVFEwRTFYNFkwJkwwJk0wJlMxXFxLNVwwMTUiLAkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMEUxWDRZMCZMMCZNMFxcSzVcMDE1IiwJCS8qIHdha2Vfc3RyICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICJPS1wwMTUiLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiQVREJXNcMDE1IiwJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAxMTAwLAkJCQkvKiBlc2NfdGltZSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEgwXDAxNSIsCQkJLyogaHVwX3N0ciAqLworICAgICJBVFxcUTNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVFxcUTFcXFgwXDAxNSIsCQkJLyogc3dmY19zdHIgKi8KKyAgICAiQVRcXFEwXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVRcXE42XDAxNSIsCQkJLyogZWNfb25fc3RyICovCisgICAgIkFUXFxOMFwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVRcXE42JUMxXDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUXFxONiVDMFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBST0xNID0JCS8qIElCTSAvIFNpZW1lbnMgLyBSb2xtIDgwMDAsIDkwMDAsIDk3NTEgQ0JYIERDTSAqLworICAgIHsKKyAgICAiSUJNL1NpZW1lbnMvUm9sbSBDQlggRGF0YSBDb21tdW5pY2F0aW9ucyBNb2R1bGUiLAorICAgICIiLAkJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICIiLAkJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgNjAsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiIiwJCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMCwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyAgICAiXDAxNVwwMTUiLAkJCQkvKiB3YWtlX3N0ciAqLworICAgIDUwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk1PRElGWT8iLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiQ0FMTCAlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDAsCQkJCQkvKiBlc2NfdGltZSAqLworICAgIDAsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICIiLAkJCQkJLyogaHVwX3N0ciAqLworICAgICIiLAkJCQkJLyogaHdmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHN3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBub2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGFhX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDFfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wyX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgMTkyMDBMLAkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICAwLAkJCQkJLyogY2FwYXMgKi8KKyAgICBOVUxMCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBVU1IgPQkJCQkvKiBVU1IgQ291cmllciBhbmQgU3BvcnRzdGVyIG1vZGVtcyAqLworICAgIHsKKyAgICAiVVMgUm9ib3RpY3MgQ291cmllciwgU3BvcnRzdGVyLCBvciBjb21wYXRpYmxlIiwKKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFUUTBFMVYxWDQmQTMmUzAmQzEmRDImTjAmWTNTMTQ9MFwwMTUiLCAvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyNpZmRlZiBTVU5PUzQKKyAgICAiQVRRMFg0JkEzJlMwJk4wJlkzUzE0PTBcMDE1IiwJLyogd2FrZV9zdHIgLS0gbmVlZHMgJlMwIGluIFN1bk9TICovCisjZWxzZQorI2lmZGVmIFZNUworICAgICJBVFEwWDQmQTMmUzEmTjAmWTNTMTQ9MFwwMTUiLAkvKiB3YWtlX3N0ciAtLSBuZWVkcyAmUzEgaW4gVk1TICovCisjZWxzZQorICAgICJBVFEwWDQmQTMmTjAmWTNTMTQ9MFwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBTVU5PUzQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkgxJlIyJkkwXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmSDImUjEmSTJcMDE1IiwJCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVCZIMCZSMSZJMFwwMTUiLAkJCS8qIG5vZmNfc3RyICovCisgICAgIkFUJk00JkIxXDAxNSIsCQkJLyogZWNfb25fc3RyICovCisgICAgIkFUJk0wXDAxNSIsCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICJBVCZLMVwwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVCZLMFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCisKK3N0YXRpYworTURNSU5GIFVTUlgyID0JCQkJLyogVVNSIFhKLUNDMTU2MCBYMiA1NksgKi8KKyAgICB7CisgICAgIlVTIFJvYm90aWNzIC8gTWVnYWhlcnR6IENDL1hKLUNDMTU2MCBYMiIsCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworI2lmZGVmIE9TMgorICAgICJBVFEwRTFWMVg0JkEzJlMwJkIyJkMxJkQyJk4wXDAxNSIsCS8qIHdha2Vfc3RyICovCisjZWxzZQorI2lmZGVmIFZNUworICAgICJBVFEwWDQmQTMmQjImTjAmUzFcMDE1IiwJCS8qIHdha2Vfc3RyICovCisjZWxzZQorICAgICJBVFEwWDQmQTMmQjImTjBcMDE1IiwJCS8qIHdha2Vfc3RyICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICJPS1wwMTUiLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiQVREJXNcMDE1IiwJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAxMTAwLAkJCQkvKiBlc2NfdGltZSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEgwXDAxNSIsCQkJLyogaHVwX3N0ciAqLworICAgICJBVCZIMSZJMFwwMTUiLAkJCS8qIGh3ZmNfc3RyICovCisgICAgIkFUJkgyJkkyXDAxNSIsCQkJLyogc3dmY19zdHIgKi8KKyAgICAiQVQmSDAmSTBcMDE1IiwJCQkvKiBub2ZjX3N0ciAqLworICAgICJBVCZNNFwwMTUiLAkJCS8qIGVjX29uX3N0ciAqLworICAgICJBVCZNMFwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQmSzFcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVQmSzBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIkFUJkIxXDAxNSIsCQkJLyogc2Jfb25fc3RyICovCisgICAgIkFUJkIwXDAxNSIsCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBPTERUQiA9CQkJCS8qIE9sZCBUZWxlYml0cyAqLworICAgIHsKKyAgICAiVGVsZWJpdCBUcmFpbEJsYXplciwgVDEwMDAsIFQxNTAwLCBUMjAwMCwgVDI1MDAiLAorICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgNjAsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiXDAyMUFBQUFBVFEwRTFWMVgxJlMwJkMxJkQyUzEyPTUwUzUwPTBTNTQ9M1wwMTUiLCAvKiB3YWtlX3N0ci4gKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIlwwMjFBQUFBQVRRMFgxUzEyPTUwUzUwPTBTNTQ9M1wwMTUiLCAvKiB3YWtlX3N0ci4gKi8KKyNlbHNlCisgICAgIlwwMjFBQUFBQVRRMFgxJlMxUzEyPTUwUzUwPTBTNTQ9M1wwMTUiLCAvKiB3YWtlX3N0ci4gKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAxMDAsCQkJCS8qIHdha2VfcmF0ZSA9IDEwMCBtc2VjICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyLCBOb3RlOiBubyBUIG9yIFAgKi8KKyAgICA4MCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lIChndWFyZCB0aW1lKSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEgwXDAxNSIsCQkJLyogaHVwX3N0ciAqLworICAgICJBVFM1OD0yUzY4PTJcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVFM1OD0zUzY4PTNTNjk9MFwwMTUiLAkJLyogc3dmY19zdHIgKi8KKyAgICAiQVRTNTg9MFM2OD0wXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVRTNjY9MVM5NT0yXDAxNSIsCQkJLyogZWNfb25fc3RyICovCisgICAgIkFUUzk1PTBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUUzExMD0xUzk2PTFcMDE1IiwJCS8qIGRjX29uX3N0ciAqLworICAgICJBVFMxMTA9MFM5Nj0wXDAxNSIsCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAxOTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXfENLRF9UQnxDS0RfS1MsIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIE5FV1RCID0JCQkJLyogTmV3IFRlbGViaXRzICovCisgICAgeworICAgICJUZWxlYml0IFQxNjAwLCBUMzAwMCwgUUJsYXplciwgV29ybGRCbGF6ZXIsIGV0Yy4iLAorICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgNjAsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiXDAyMUFBQUFBVFEwRTFWMVgyJlMwJkMxJkQyUzEyPTUwUzUwPTBTNjE9MFM2Mz0wXDAxNSIsIC8qIHdha2Vfc3RyLiAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiXDAyMUFBQUFBVFEwWDImUzFTMTI9NTBTNTA9MFM2MT0wUzYzPTBcMDE1IiwgLyogd2FrZV9zdHIuICovCisjZWxzZQorICAgICJcMDIxQUFBQUFUUTBYMlMxMj01MFM1MD0wUzYxPTBTNjM9MFwwMTUiLCAvKiB3YWtlX3N0ci4gKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAxMDAsCQkJCS8qIHdha2VfcmF0ZSA9IDEwMCBtc2VjICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyLCBOb3RlOiBubyBUIG9yIFAgKi8KKyAgICA4MCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lIChndWFyZCB0aW1lKSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEgwXDAxNSIsCQkJLyogaHVwX3N0ciAqLworICAgICJBVFM1OD0yUzY4PTJcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVFM1OD0zUzY4PTNcMDE1IiwJCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVFM1OD0wUzY4PTBcMDE1IiwJCQkvKiBub2ZjX3N0ciAqLworICAgICJBVFMxODA9M1wwMTUiLAkJCS8qIGVjX29uX3N0ciAqLworICAgICJBVFMxODA9MFwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVRTMTkwPTFcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVRTMTkwPTBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAzODQwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXfENLRF9UQnxDS0RfS1MsIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisjZW5kaWYgLyogTUlOSURJQUwgKi8KKworc3RhdGljCitNRE1JTkYgRFVNTVkgPSAvKiBkdW1teSBpbmZvcm1hdGlvbiBmb3IgbW9kZW1zIHRoYXQgYXJlIGhhbmRsZWQgZWxzZXdoZXJlICovCisgICAgeworICAgICIoZHVtbXkpIiwKKyAgICAiIiwJCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiIiwJCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDMwLAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiIsCQkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDAsCQkJCQkvKiBwYXVzZV90aW1lICovCisgICAgIiIsCQkJCQkvKiB3YWtlX3N0ciAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiIiwJCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICBOVUxMLAkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiJXNcMDE1IiwJCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMCwJCQkJCS8qIGVzY190aW1lICovCisgICAgMCwJCQkJCS8qIGVzY19jaGFyICovCisgICAgIiIsCQkJCQkvKiBodXBfc3RyICovCisgICAgIiIsCQkJCQkvKiBod2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogc3dmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIG5vZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogYWFfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDJfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wzX3N0ciAqLworICAgICIiLAkJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAwTCwJCQkJCS8qIG1heF9zcGVlZCAqLworICAgIDAsCQkJCQkvKiBjYXBhcyAqLworICAgIE5VTEwJCQkJLyogb2tfZm4gKi8KK307CisKKyNpZm5kZWYgTUlOSURJQUwKK3N0YXRpYworTURNSU5GIFJXVjMyID0JCQkJLyogR2VuZXJpYyBSb2Nrd2VsbCBWLjMyICovCisgICAgeworICAgICJHZW5lcmljIFJvY2t3ZWxsIFYuMzIgbW9kZW0iLAkvKiBBVEkzLCBBVEk0LCBhbmQgQVRJNiBmb3IgZGV0YWlscyAqLworICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMEUxVjFYNFkwJlMwJkMxJkQyJUUyXFxLNStGQ0xBU1M9ME4xUzM3PTBcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBYNFkwJlMxJUUyXFxLNStGQ0xBU1M9ME4xUzM3PTBcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBYNFkwJUUyXFxLNStGQ0xBU1M9ME4xUzM3PTBcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkszXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmSzRTMzI9MTdTMzM9MTlcMDE1IiwJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmUTZcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQmUTBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJUMxXDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUJUMwXDAxNSIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIkFUTTFcMDE1IiwJCQkJLyogc3Bfb25fc3RyICovCisgICAgIkFUTTBcMDE1IiwJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICJBVEwxXDAxNSIsCQkJCS8qIHZvbDFfc3RyICovCisgICAgIkFUTDJcMDE1IiwJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiQVRMM1wwMTUiLAkJCQkvKiB2b2wzX3N0ciAqLworICAgICJBVFgzXDAxNSIsCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgNTc2MDBMLAkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICBDS0RfQVR8Q0tEX1NCfENLRF9FQ3xDS0RfREN8Q0tEX0hXfENLRF9TVywgLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgUldWMzJCID0JCQkJLyogR2VuZXJpYyBSb2Nrd2VsbCBWLjMyYmlzICovCisgICAgeworICAgICJHZW5lcmljIFJvY2t3ZWxsIFYuMzJiaXMgbW9kZW0iLAkvKiBBVEkzLCBBVEk0LCBhbmQgQVRJNiBmb3IgZGV0YWlscyAqLworICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMEUxVjFYNFkwJlMwJkMxJkQyJUUyXFxLNStGQ0xBU1M9ME4xUzM3PTBcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBYNFkwJlMxJUUyXFxLNStGQ0xBU1M9ME4xUzM3PTBcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBYNFkwJUUyXFxLNStGQ0xBU1M9ME4xUzM3PTBcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkszXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmSzRTMzI9MTdTMzM9MTlcMDE1IiwJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmUTVcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQmUTBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUUyVDMVwwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVFMlQzBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICA1NzYwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBSV1YzNCA9CQkJCS8qIEdlbmVyaWMgUm9ja3dlbGwgVi4zNCBEYXRhL0ZheCAqLworICAgIHsKKyAgICAiR2VuZXJpYyBSb2Nrd2VsbCBWLjM0IG1vZGVtIiwJLyogQVRJMywgQVRJNCwgYW5kIEFUSTYgZm9yIGRldGFpbHMgKi8KKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFUUTBWMVg0WTAmQzEmRDImUzAlRTJcXEs1K0ZDTEFTUz0wXDAxNSIsIC8qIHdha2Vfc3RyICovCisjZWxzZQorI2lmZGVmIFZNUworICAgICJBVFEwVjFYNFkwJkMxJkQyJlMxJUUyXFxLNStGQ0xBU1M9MFwwMTUiLCAvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMFYxWDRZMCZDMSZEMiVFMlxcSzUrRkNMQVNTPTBcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkszXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmSzRTMzI9MTdTMzM9MTlcMDE1IiwJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmUTVcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQmUTBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUUyVDM1wwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVFMlQzBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAxMTUyMDBMLAkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICBDS0RfQVR8Q0tEX1NCfENLRF9FQ3xDS0RfREN8Q0tEX0hXfENLRF9TVywgLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgUldWOTAgPQkJCQkvKiBHZW5lcmljIFJvY2t3ZWxsIFYuOTAgRGF0YS9GYXggKi8KKyAgICB7CisgICAgIkdlbmVyaWMgUm9ja3dlbGwgVi45MCA1NksgbW9kZW0iLAkvKiBBVEkzLCBBVEk0LCBhbmQgQVRJNiBmb3IgZGV0YWlscyAqLworICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMFYxTjFYNFkwJkMxJkQyJlMwJUUyXFxLNStGQ0xBU1M9MFMzNz0wXDAxNSIsIC8qIEs5NSAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMFYxTjFYNFkwJkMxJkQyJlMxJUUyXFxLNStGQ0xBU1M9MFMzNz0wXDAxNSIsIC8qIHdha2Vfc3RyICovCisjZWxzZQorICAgICJBVFEwVjFOMVg0WTAmQzEmRDIlRTJcXEs1K0ZDTEFTUz0wUzM3PTBcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkszXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmSzRTMzI9MTdTMzM9MTlcMDE1IiwJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmUTVcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQmUTBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJUMzXDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUJUMwXDAxNSIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIkFUTTFcMDE1IiwJCQkJLyogc3Bfb25fc3RyICovCisgICAgIkFUTTBcMDE1IiwJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICJBVEwxXDAxNSIsCQkJCS8qIHZvbDFfc3RyICovCisgICAgIkFUTDJcMDE1IiwJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiQVRMM1wwMTUiLAkJCQkvKiB2b2wzX3N0ciAqLworICAgICJBVFgzXDAxNSIsCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgMTE1MjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIE1XQVZFID0JCQkJLyogSUJNIE13YXZlICovCisgICAgeworICAgICJJQk0gTXdhdmUgQWRhcHRlciIsCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworI2lmZGVmIE9TMgorICAgICJBVFEwRTFWMVg0WTAmUzAmQzEmRDImTTAmUTAmTjFcXEszXFxUMCVFMlMyOD0wXDAxNSIsIC8qIHdha2Vfc3RyICovCisjZWxzZQorI2lmZGVmIFZNUworICAgICJBVFEwWDRZMCZNMCZTMSZRMCZOMSZTMFxcSzNcXFQwJUUyUzI4PTBcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBYNFkwJk0wJlEwJk4xJlMwXFxLM1xcVDAlRTJTMjg9MFwwMTUiLCAvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVRcXFEzXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHN3ZmNfc3RyIChpdCBkb2Vzbid0ISkgKi8KKyAgICAiQVRcXFEwXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVRcXE43XDAxNSIsCQkJLyogZWNfb25fc3RyICovCisgICAgIkFUXFxOMFwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQlQzFcIkgzXDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUJUMwXCJIMFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDU3NjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IVywgLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgVEVMRVBBVEggPQkJCS8qIEdhdGV3YXkgMjAwMCBUZWxlcGF0aCAqLworICAgIHsKKyAgICAiR2F0ZXdheSAyMDAwIFRlbGVwYXRoIElJIDI4LjgiLAorICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMEUxVjFYNCZTMCZDMSZEMiZOMCZZMiNDTFM9MFMxMz0wUzE1PTBTMTk9MFwwMTUiLCAvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMFg0Jk4wJlMxJlkxI0NMUz0wUzEzPTBTMTU9MFMxOT0wXDAxNSIsIC8qIHdha2Vfc3RyICovCisjZWxzZQorICAgICJBVFEwWDQmTjAmWTEjQ0xTPTBTMTM9MFMxNT0wUzE5PTBcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkgxJlIyXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmSDImSTJTMjI9MTdTMjM9MTlcMDE1IiwJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkgwJkkwJlIxXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmTTQmQjFcMDE1IiwJCQkvKiBlY19vbl9zdHIgLS0gYWxzbyBmaXhlcyBzcGVlZCAqLworICAgICJBVCZNMFwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQmSzFcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVQmSzBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICA1NzYwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBDQVJESU5BTCA9CQkJLyogQ2FyZGluYWwgLSBiYXNlZCBvbiBSb2Nrd2VsbCBWLjM0ICovCisgICAgeworICAgICJDYXJkaW5hbCBNVlAyODhYIFNlcmllcyIsCQkvKiBBVEkzLCBBVEk0LCBhbmQgQVRJNiBmb3IgZGV0YWlscyAqLworICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMEUxVjFYNFcxWTAlRTImUzAmQzEmRDJcXEs1K0ZDTEFTUz0wK01TPTExLDFcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBYNFcxWTAmUzElRTJcXEs1K0ZDTEFTUz0wK01TPTExLDFcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBYNFcxWTAlRTJcXEs1K0ZDTEFTUz0wK01TPTExLDFcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkszXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmSzRTMzI9MTdTMzM9MTlcMDE1IiwJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmUTVTMzY9N1M0OD03XFxOM1wwMTUiLAkJLyogZWNfb25fc3RyICovCisgICAgIkFUJlEwUzQ4PTEyOFxcTjFcMDE1IiwJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVRTNDY9MTM4JUMxXDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUUzQ2PTEzNiVDMFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBMVUNFTlQgPQkJCQkvKiBMdWNlbnQgVmVudXMgb3IgRGF0YS9GYXggbW9kZW0gKi8KKyAgICB7CisgICAgIkx1Y2VudCBWZW51cyBjaGlwc2V0IiwKKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFUUTBWMU4xWDRZMCZDMSZEMiZTMCVFMlxcSzUrRkNMQVNTPTBTMzc9MFwwMTUiLCAvKiBLOTUgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBWMU4xWDRZMCZDMSZEMiZTMSVFMlxcSzUrRkNMQVNTPTBTMzc9MFwwMTUiLCAvKiBWTVMgKi8KKyNlbHNlCisgICAgIkFUUTBWMU4xWDRZMCZDMSZEMiVFMlxcSzUrRkNMQVNTPTBTMzc9MFwwMTUiLCAvKiBBbGwgb3RoZXJzICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICJPS1wwMTUiLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiQVREJXNcMDE1IiwJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAxMTAwLAkJCQkvKiBlc2NfdGltZSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEgwXDAxNSIsCQkJLyogaHVwX3N0ciAqLworICAgICJBVCZLM1wwMTUiLAkJCS8qIGh3ZmNfc3RyICovCisgICAgIkFUJks0UzMyPTE3UzMzPTE5XDAxNSIsCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVCZLMFwwMTUiLAkJCS8qIG5vZmNfc3RyICovCisgICAgIkFUJlE1XDAxNSIsCQkJLyogZWNfb25fc3RyICovCisgICAgIkFUJlEwXDAxNSIsCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICJBVCVDMVwwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVCVDMFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBDT05FWEFOVCA9CQkJLyogQ29uZXhhbnQgZmFtaWx5ICovCisgICAgeworICAgICJDb25leGFudCBmYW1pbHkgb2YgbW9kZW1zIiwKKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFUUTBWMVg0JkMxJkQyJlMwJUUxK0ZDTEFTUz0wXDAxNSIsIC8qIEs5NSAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMFYxWDQmQzEmRDImUzElRTErRkNMQVNTPTBcMDE1IiwgLyogVk1TICovCisjZWxzZQorICAgICJBVFEwVjFYNCZDMSZEMiVFMStGQ0xBU1M9MFwwMTUiLCAvKiBVTklYIGV0YyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmSzNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCZLNFMzMj0xN1MzMz0xOVwwMTUiLAkJLyogc3dmY19zdHIgKi8KKyAgICAiQVQmSzBcMDE1IiwJCQkvKiBub2ZjX3N0ciAqLworICAgICJBVCZRNVwwMTUiLAkJCS8qIGVjX29uX3N0ciAqLworICAgICJBVCZRMFwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQlQzNcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVQlQzBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAxMTUyMDBMLAkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICBDS0RfQVR8Q0tEX1NCfENLRF9FQ3xDS0RfREN8Q0tEX0hXfENLRF9TVywgLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgUENURUwgPQkJCQkvKiBQQ1RlbCBjaGlwc2V0ICovCisgICAgeworICAgICJQQ1RlbCBjaGlwc2V0IiwKKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFUUTBWMU4xWDRZMCZDMSZEMiZTMCVFMlxcSzVTMzc9MFwwMTUiLCAvKiBLOTUgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBWMU4xWDRZMCZDMSZEMiZTMSVFMlxcSzVTMzc9MFwwMTUiLCAvKiBWTVMgKi8KKyNlbHNlCisgICAgIkFUUTBWMU4xWDRZMCZDMSZEMiVFMlxcSzVTMzc9MFwwMTUiLCAvKiBVTklYIGV0YyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmSzNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCZLNFMzMj0xN1MzMz0xOVwwMTUiLAkJLyogc3dmY19zdHIgKi8KKyAgICAiQVQmSzBcMDE1IiwJCQkvKiBub2ZjX3N0ciAqLworICAgICJBVFxcTjNcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVRcXE4wXDAxNSIsCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICJBVCVDMVwwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVCVDMFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBaT09NVjM0ID0JCQkvKiBab29tIFRlbGVwaG9uaWNzIFYuMzQgICovCisgICAgeworICAgICJab29tIFRlbGVwaG9uaWNzIFYuMzQiLAorICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMFYxTjFXMVg0JlMwJkMxJkQyUzgyPTEyOFwwMTUiLCAvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMFYxTjFXMVg0JlMxUzgyPTEyOFwwMTUiLAkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMFYxTjFXMVg0UzgyPTEyOFMwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkszXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmSzRcMDE1UzMyPTE3UzMzPTE5IiwJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmUTVcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQmUTBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUUyVDM1wwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVFMlQzBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICA1NzYwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBaT09NVjkwID0JCQkvKiBaT09NIFYuOTAgKi8KKyAgICB7CisgICAgIlpvb20gVi45MCA1NksiLAorICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMFYxTjFYNFkwJkMxJkQyJlMwJUUyXFxLNStGQ0xBU1M9MFMzNz0wXDAxNSIsIC8qIEs5NSAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMFYxTjFYNFkwJkMxJkQyJlMxJUUyXFxLNStGQ0xBU1M9MFMzNz0wXDAxNSIsIC8qIFZNUyAqLworI2Vsc2UKKyAgICAiQVRRMFYxTjFYNFkwJkMxJkQyJUUyXFxLNStGQ0xBU1M9MFMzNz0wXDAxNSIsIC8qIEFsbCBvdGhlcnMgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkszXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmSzRTMzI9MTdTMzM9MTlcMDE1IiwJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmUTVcMDE1IiwJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQmUTBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJUMxXDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUJUMwXDAxNSIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIkFUTTFcMDE1IiwJCQkJLyogc3Bfb25fc3RyICovCisgICAgIkFUTTBcMDE1IiwJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICJBVEwxXDAxNSIsCQkJCS8qIHZvbDFfc3RyICovCisgICAgIkFUTDJcMDE1IiwJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiQVRMM1wwMTUiLAkJCQkvKiB2b2wzX3N0ciAqLworICAgICJBVFgzXDAxNSIsCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgMTE1MjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIFpPT01WOTIgPQkJCS8qIFpPT00gVi45MiAqLworICAgIHsKKyAgICAiWm9vbSBWLjkyIHdpdGggVi40NCBjb21wcmVzc2lvbiIsCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworI2lmZGVmIE9TMgorICAgICJBVFEwVjFOMVg0WTAmQzEmRDImUzAlRTJcXEs1K0ZDTEFTUz0wUzM3PTArTVM9VjkyXDAxNSIsIC8qIEs5NSAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMFYxTjFYNFkwJkMxJkQyJlMxJUUyXFxLNStGQ0xBU1M9MFMzNz0wK01TPVY5MlwwMTUiLCAvKiBWTVMgKi8KKyNlbHNlCisgICAgIkFUUTBWMU4xWDRZMCZDMSZEMiVFMlxcSzUrRkNMQVNTPTBTMzc9MCtNUz1WOTJcMDE1IiwgLyogQWxsIG90aGVycyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmSzNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCZLNFMzMj0xN1MzMz0xOVwwMTUiLAkJLyogc3dmY19zdHIgKi8KKyAgICAiQVQmSzBcMDE1IiwJCQkvKiBub2ZjX3N0ciAqLworICAgICJBVCZRNVwwMTUiLAkJCS8qIGVjX29uX3N0ciAqLworICAgICJBVCZRMFwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQlQzErRENTPTEsMVwwMTUiLAkJLyogZGNfb25fc3RyICovCisgICAgIkFUJUMwXDAxNSIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIkFUTTFcMDE1IiwJCQkJLyogc3Bfb25fc3RyICovCisgICAgIkFUTTBcMDE1IiwJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICJBVEwxXDAxNSIsCQkJCS8qIHZvbDFfc3RyICovCisgICAgIkFUTDJcMDE1IiwJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiQVRMM1wwMTUiLAkJCQkvKiB2b2wzX3N0ciAqLworICAgICJBVFgzXDAxNSIsCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgMTE1MjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKKworLyoKKyAgTm93IHRoZSAib2xkIiBtb2RlbXMsIGFsbCBncm91cGVkIHRvZ2V0aGVyLCBhbmQgYWxzbyB3aXRoaW4KKyAgImlmIG5vdCBkZWZpbmVkIE1JTklESUFMIi4uLgorKi8KKyNpZmRlZiBPTERNT0RFTVMKKworc3RhdGljCitNRE1JTkYgQ0VSTUVURUsgPQkvKiBJbmZvcm1hdGlvbiBmb3IgIkNlcm1ldGVrIEluZm8tTWF0ZSAyMTIgQSIgbW9kZW0gKi8KKyAgICB7CisgICAgIkNlcm1ldGVrIEluZm8tTWF0ZSAyMTIgQSIsCisgICAgIiIsCQkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIiIsCQkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAyMCwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICJCYlBwVHQiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDAsCQkJCQkvKiBwYXVzZV90aW1lICovCisgICAgIiAgWFlcMDE2UlwwMTUiLAkJCS8qIHdha2Vfc3RyICovCisgICAgMjAwLAkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiIiwJCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICBOVUxMLAkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiXDAxNkQgJyVzJ1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMjAwLAkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAwLAkJCQkJLyogZXNjX3RpbWUgKi8KKyAgICAwLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiIiwJCQkJCS8qIGh1cF9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGh3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBzd2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogbm9mY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wxX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDNfc3RyICovCisgICAgIiIsCQkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDEyMDBMLAkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICAwLAkJCQkJLyogY2FwYXMgKi8KKyAgICBOVUxMCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBERjAzID0JCS8qIGluZm9ybWF0aW9uIGZvciAiREVDIERGMDMtQUMiIG1vZGVtICovCisgICAgeworICAgICJEaWdpdGFsIERGMDMtQUMiLAorICAgICIiLAkJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICIiLAkJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMjcsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiPSIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMTUsCQkJCQkvKiBwYXVzZV90aW1lICovCisgICAgIlwwMDFcMDAyIiwJCQkJLyogd2FrZV9zdHIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIiIsCQkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgTlVMTCwJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIiVzIiwJCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMCwJCQkJCS8qIGVzY190aW1lICovCisgICAgMCwJCQkJCS8qIGVzY19jaGFyICovCisgICAgIiIsCQkJCQkvKiBodXBfc3RyICovCisgICAgIiIsCQkJCQkvKiBod2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogc3dmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIG5vZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogYWFfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDJfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wzX3N0ciAqLworICAgICIiLAkJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAwTCwJCQkJCS8qIG1heF9zcGVlZCAqLworICAgIDAsCQkJCQkvKiBjYXBhcyAqLworICAgIE5VTEwJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIERGMTAwID0JCS8qIGluZm9ybWF0aW9uIGZvciAiREVDIERGMTAwLXNlcmllcyIgbW9kZW0gKi8KKwkJCS8qCisJCQkgKiBUaGUgdGVsZXBob25lICJudW1iZXIiIGNhbiBpbmNsdWRlICJQInMgYW5kL29yICJUInMKKwkJCSAqIHdpdGhpbiBpdCB0byBpbmRpY2F0ZSB0aGF0IHN1YnNlcXVlbnQgZGlnaXRzIGFyZQorCQkJICogdG8gYmUgZGlhbGVkIHVzaW5nIHB1bHNlIG9yIHRvbmUgZGlhbGluZy4gIFRoZQorCQkJICogbW9kZW0gZGVmYXVsdHMgdG8gcHVsc2UgZGlhbGluZy4gIFlvdSBtYXkgbW9kaWZ5CisJCQkgKiB0aGUgZGlhbCBzdHJpbmcgYmVsb3cgdG8gZXhwbGljaXRseSBkZWZhdWx0IGFsbAorCQkJICogZGlhbGluZyB0byBwdWxzZSBvciB0b25lLCBidXQgZG9pbmcgc28gcHJldmVudHMKKwkJCSAqIHRoZSB1c2Ugb2YgcGhvbmUgbnVtYmVycyB0aGF0IHlvdSBtYXkgaGF2ZSBzdG9yZWQKKwkJCSAqIGluIHRoZSBtb2RlbSdzIG1lbW9yeS4KKwkJCSAqLworICAgIHsKKyAgICAiRGlnaXRhbCBERi0xMDAiLAorICAgICIiLAkJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICIiLAkJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzAsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiPSIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMTUsCQkJCQkvKiBwYXVzZV90aW1lICovCisgICAgIlwwMDEiLAkJCQkvKiB3YWtlX3N0ciAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiIiwJCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICBOVUxMLAkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiJXMjIiwJCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMCwJCQkJCS8qIGVzY190aW1lICovCisgICAgMCwJCQkJCS8qIGVzY19jaGFyICovCisgICAgIiIsCQkJCQkvKiBodXBfc3RyICovCisgICAgIiIsCQkJCQkvKiBod2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogc3dmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIG5vZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogYWFfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDJfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wzX3N0ciAqLworICAgICIiLAkJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAwTCwJCQkJCS8qIG1heF9zcGVlZCAqLworICAgIDAsCQkJCQkvKiBjYXBhcyAqLworICAgIE5VTEwJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIERGMjAwID0JCS8qIGluZm9ybWF0aW9uIGZvciAiREVDIERGMjAwLXNlcmllcyIgbW9kZW0gKi8KKwkJCS8qCisJCQkgKiBUaGUgdGVsZXBob25lICJudW1iZXIiIGNhbiBpbmNsdWRlICJQInMgYW5kL29yICJUInMKKwkJCSAqIHdpdGhpbiBpdCB0byBpbmRpY2F0ZSB0aGF0IHN1YnNlcXVlbnQgZGlnaXRzIGFyZQorCQkJICogdG8gYmUgZGlhbGVkIHVzaW5nIHB1bHNlIG9yIHRvbmUgZGlhbGluZy4gIFRoZQorCQkJICogbW9kZW0gZGVmYXVsdHMgdG8gcHVsc2UgZGlhbGluZy4gIFlvdSBtYXkgbW9kaWZ5CisJCQkgKiB0aGUgZGlhbCBzdHJpbmcgYmVsb3cgdG8gZXhwbGljaXRseSBkZWZhdWx0IGFsbAorCQkJICogZGlhbGluZyB0byBwdWxzZSBvciB0b25lLCBidXQgZG9pbmcgc28gcHJldmVudHMKKwkJCSAqIHRoZSB1c2Ugb2YgcGhvbmUgbnVtYmVycyB0aGF0IHlvdSBtYXkgaGF2ZSBzdG9yZWQKKwkJCSAqIGluIHRoZSBtb2RlbSdzIG1lbW9yeS4KKwkJCSAqLworICAgIHsKKyAgICAiRGlnaXRhbCBERi0yMDAiLAorICAgICIiLAkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiIiwJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzMCwJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiPVciLAkJLyogcGF1c2VfY2hhcnMgKi8JLyogPTogc2Vjb25kIHRvbmU7IFc6IDUgc2VjcyAqLworICAgIDE1LAkJCS8qIHBhdXNlX3RpbWUgKi8JLyogd29yc3QgY2FzZSAqLworICAgICJcMDAyIiwJCS8qIHdha2Vfc3RyICovCQkvKiBhbGxvdyBzdG9yZWQgbnVtYmVyIHVzYWdlICovCisgICAgMCwJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiIiwJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCS8qIGRtb2RlX3N0ciAqLworICAgIE5VTEwsCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgIiVzISIsCQkvKiBkaWFsX3N0ciAqLworI2Vsc2UKKyAgICAiICAgZCAlc1wwMTUiLAorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMCwJCQkJCS8qIGVzY190aW1lICovCisgICAgMCwJCQkJCS8qIGVzY19jaGFyICovCisgICAgIiIsCQkJCQkvKiBodXBfc3RyICovCisgICAgIiIsCQkJCQkvKiBod2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogc3dmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIG5vZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogYWFfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDJfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wzX3N0ciAqLworICAgICIiLAkJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAwTCwJCQkJCS8qIG1heF9zcGVlZCAqLworICAgIDAsCQkJCQkvKiBjYXBhcyAqLworICAgIE5VTEwJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIEdEQyA9CQkvKiBpbmZvcm1hdGlvbiBmb3IgIkdlbmVyYWxEYXRhQ29tbSAyMTJBL0VEIiBtb2RlbSAqLworICAgIHsKKyAgICAiR2VuZXJhbERhdGFDb21tIDIxMkEvRUQiLAorICAgICIiLAkJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICIiLAkJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzIsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiJSIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMywJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyAgICAiXDAxNVwwMTUiLAkJCQkvKiB3YWtlX3N0ciAqLworICAgIDUwMCwJCQkJLyogd2FrZV9yYXRlICovCisgICAgIiQiLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICJEXDAxNSIsCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICI6IiwJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIlQlc1wwMTUiLAkJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAwLAkJCQkJLyogZXNjX3RpbWUgKi8KKyAgICAwLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiIiwJCQkJCS8qIGh1cF9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGh3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBzd2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogbm9mY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wxX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDNfc3RyICovCisgICAgIiIsCQkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDEyMDBMLAkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICAwLAkJCQkJLyogY2FwYXMgKi8KKyAgICBOVUxMCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBQRU5SSUwgPQkJLyogaW5mb3JtYXRpb24gZm9yICJQZW5yaWwiIG1vZGVtICovCisgICAgeworICAgICJQZW5yaWwgbW9kZW0iLAorICAgICIiLAkJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICIiLAkJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgNTAsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiIiwJCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMCwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyAgICAiXDAxNVwwMTUiLAkJCQkvKiB3YWtlX3N0ciAqLworICAgIDMwMCwJCQkJLyogd2FrZV9yYXRlICovCisgICAgIj4iLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICJrXDAxNSIsCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICI6IiwJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIiVzXDAxNSIsCQkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDAsCQkJCQkvKiBlc2NfdGltZSAqLworICAgIDAsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICIiLAkJCQkJLyogaHVwX3N0ciAqLworICAgICIiLAkJCQkJLyogaHdmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHN3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBub2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGFhX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDFfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wyX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgMEwsCQkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICAwLAkJCQkJLyogY2FwYXMgKi8KKyAgICBOVUxMCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBSQUNBTCA9CQkJCS8qIFJhY2FsIFZhZGljIFZBNDQ5MkUgKi8KKyAgICB7CisgICAgIlJhY2FsIFZhZGljIFZBNDQ5MkUiLAorICAgICIiLAkJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICIiLAkJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJLyogZGlhbF90aW1lIChtYW51YWwgc2F5cyBtb2RlbSBpcyBoYXJkd2lyZWQgdG8gNjApICovCisgICAgIktrIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICA1LAkJCQkJLyogcGF1c2VfdGltZSAqLworICAgICJcMDA1XDAxNSIsCQkJCS8qIHdha2Vfc3RyLCBeRV5NICovCisgICAgNTAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiKiIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIkRcMDE1IiwJCQkJLyogZG1vZGVfc3RyICovCisgICAgIj8iLAkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiJXNcMDE1IiwJCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA1LAkJCQkJLyogZXNjX2NoYXIsIF5FICovCisgICAgIlwwMDNcMDA0IiwJCQkJLyogaHVwX3N0ciwgXkNeRCAqLworICAgIDAsCQkJCQkvKiBod2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogc3dmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIG5vZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogYWFfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDJfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wzX3N0ciAqLworICAgICIiLAkJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAwTCwJCQkJCS8qIG1heF9zcGVlZCAqLworICAgIDAsCQkJCQkvKiBjYXBhcyAqLworICAgIE5VTEwJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIFZFTlRFTCA9CQkJCS8qIEluZm9ybWF0aW9uIGZvciBWZW4tVGVsIG1vZGVtICovCisgICAgeworICAgICJWZW4tVGVsIiwKKyAgICAiIiwJCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiIiwJCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDIwLAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiUiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDUsCQkJCQkvKiBwYXVzZV90aW1lICovCisgICAgIlwwMTVcMDE1XDAxNSIsCQkJLyogd2FrZV9zdHIgKi8KKyAgICAzMDAsCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICIkIiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiS1wwMTUiLAkJCQkvKiBkbW9kZV9zdHIgKHdhcyAiIikgKi8KKyAgICAiTnVtYmVyIHRvIGNhbGw6ICIsCQkJLyogZG1vZGVfcHJvbXB0ICh3YXMgTlVMTCkgKi8KKyAgICAiJXNcMDE1IiwJCQkJLyogZGlhbF9zdHIgKHdhcyAiPEslc1xyPiIpICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDAsCQkJCQkvKiBlc2NfdGltZSAqLworICAgIDAsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICIiLAkJCQkJLyogaHVwX3N0ciAqLworICAgICIiLAkJCQkJLyogaHdmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHN3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBub2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGFhX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDFfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wyX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgMEwsCQkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICAwLAkJCQkJLyogY2FwYXMgKi8KKyAgICBOVUxMCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBDT05DT1JEID0JLyogSW5mbyBmb3IgQ29uZG9yIENEUyAyMjAgMjQwMGIgbW9kZW0gKi8KKyAgICB7CisgICAgIkNvbmNvcmQgQ29uZG9yIENEUyAyMjAgMjQwMGIiLAorICAgICIiLAkJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICIiLAkJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyAgICAiXDAxNVwwMTUiLAkJCQkvKiB3YWtlX3N0ciAqLworICAgIDIwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIkNEUyA+IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgIE5VTEwsCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICI8RCBNJXNcMDE1PiIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMCwJCQkJCS8qIGVzY190aW1lICovCisgICAgMCwJCQkJCS8qIGVzY19jaGFyICovCisgICAgIiIsCQkJCQkvKiBodXBfc3RyICovCisgICAgIiIsCQkJCQkvKiBod2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogc3dmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIG5vZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogYWFfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDJfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wzX3N0ciAqLworICAgICIiLAkJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAyNDAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgMCwJCQkJCS8qIGNhcGFzICovCisgICAgTlVMTAkJCQkvKiBva19mbiAqLworfTsKKyNlbmRpZiAvKiBPTERNT0RFTVMgKi8KKworc3RhdGljCitNRE1JTkYgTUlDUk9DT00gPQkvKiBNaWNyb2NvbSBtb2RlbXMgaW4gbmF0aXZlIFNYIG1vZGUgKi8KKwkJCS8qIChsb25nIGFuc3dlciBvbmx5KSAqLworeworICAgICJNaWNyb2NvbSBNTlAgbW9kZW1zIGluIFNYIGNvbW1hbmQgbW9kZSIsCisgICAgIkRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiRFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCFAIiwJCS8qIHBhdXNlX2NoYXJzICghIGFuZCBAIGFyZW4ndCBwdXJlIHBhdXNlcykgKi8KKyAgICAzLAkJCQkJLyogcGF1c2VfdGltZSAqLworLyoKKyAgVGhlIGZvbGxvd2luZyBzZXRzIDggYml0cywgbm8gcGFyaXR5LCBCUkVBSyBwYXNzdGhydSwgYW5kIFNFMCBkaXNhYmxlcyB0aGUKKyAgZXNjYXBlIGNoYXJhY3Rlciwgd2hpY2ggaXMgYSBzaW5nbGUgY2hhcmFjdGVyIHdpdGggbm8gZ3VhcmQgdGltZSwgdG90YWxseQorICB1bnNhZmUsIHNvIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBkaXNhYmxlIGl0LiAgRXNwZWNpYWxseSBzaW5jZSwgYnkKKyAgZGVmYXVsdCwgaXQgaXMgQ3RybC1BLCB3aGljaCBpcyBLZXJtaXQncyBwYWNrZXQtc3RhcnQgY2hhcmFjdGVyLiAgV2Ugd291bGQKKyAgY2hhbmdlIGl0IHRvIHNvbWV0aGluZyBlbHNlLCB3aGljaCB3b3VsZCBlbmFibGUgIm1kbWh1cCgpIiwgYnV0IHRoZSB1c2VyCisgIHdvdWxkbid0IGtub3cgYWJvdXQgaXQuICBWZXJ5IGJhZC4gIE5vdGU6IFNFMSBzZXRzIGl0IHRvIEN0cmwtQSwgU0UyCisgIHNldHMgaXQgdG8gQ3RybC1CLCBldGMgKDEuLjMxIGFsbG93ZWQpLiAgQWxzbyBTRS9RIHNldHMgaXQgdG8gIlEiLgorKi8KKyAgICAiU0UwO1MxUDQ7U0JSSzVcMDE1IiwJCS8qIHdha2Vfc3RyICovCisgICAgMTAwLAkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiISIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICBOVUxMLAkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiRCVzXDAxNSIsCQkJCS8qIGRpYWxfc3RyIC0gbnVtYmVyIHVwIHRvIDM5IGNoYXJzICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDAsCQkJCQkvKiBlc2NfdGltZSAqLworICAgIDAsCQkJCQkvKiBlc2NfY2hhciAtIHdlIGNhbid0IHVzZSB0aGlzICovCisgICAgIiIsCQkJCQkvKiBodXBfc3RyIC0gaXQncyAiSCIgYnV0IGNhbid0IHVzZSAqLworICAgICJTRjEzXDAxNSIsCQkJCS8qIGh3ZmNfc3RyICovCisgICAgIlNGMTFcMDE1IiwJCQkJLyogc3dmY19zdHIgKi8KKyAgICAiU0YxMFwwMTUiLAkJCQkvKiBub2ZjX3N0ciAqLworICAgICJCQU9GRjtTTUFVVFwwMTUiLAkJCS8qIGVjX29uX3N0ciAqLworICAgICJCQU9OO1NNRElSXDAxNSIsCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICJDT01QMVwwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJDT01QMFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQUEiLAkJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJTQTIiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIlNBMCIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDJfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wzX3N0ciAqLworICAgICIiLAkJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAwTCwJCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1d8Q0tEX0tTLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBNSUNST0xJTksgPQkJCS8qIE1pY3JvTGluayAuLi4gKi8KKyAgICB7CQkJCQkvKiAxNC40VFEsVEwsUEM7MjguOFRRLFRRVjsyNDQwVC9UUiAqLworICAgICJFTFNBIE1pY3JvTGluayAxNC40LCAyOC44LCAzMy42IG9yIDU2SyIsIC8qIEVMU0EgR21iSCwgQWFjaGVuICovCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworI2lmZGVmIE9TMgorICAgICJBVFEwRTFWMVg0JlMwXFxEMCZDMSZEMlxcSzVcMDE1IiwJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBYNCZTMVxcSzVcMDE1IiwJCS8qIHdha2Vfc3RyICovCisjZWxzZQorICAgICJBVFEwWDRcXEs1XDAxNSIsCQkJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVRcXFEzXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVRcXFExXFxYMFwwMTUiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUXFxRMFwwMTUiLAkJCS8qIG5vZmNfc3RyICovCisgICAgIkFUXFxOM1wwMTUiLAkJCS8qIGVjX29uX3N0ciAqLworICAgICJBVFxcTjBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJUMzXDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUJUMwXDAxNSIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICJcXEowIiwJCQkJLyogc2Jfb25fc3RyICg/KSAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDU3NjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIFVMSU5LVjI1MCA9CQkJLyogTWljcm9MaW5rIFYuMjUwICovCisgICAgewkJCQkJLyogNTZLZmxleCwgVi45MDsgVi4yNTAgY29tbWFuZCBzZXQgKi8KKyAgICAiRUxTQSBNaWNyb0xpbmsgNTZLIFYuMjUwIiwJCS8qIEVMU0EgR21iSCwgQWFjaGVuICovCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworI2lmZGVmIE9TMgorICAgIC8qIFxEMCA9IERTUiAmIENUUyBhbHdheXMgb24gYnV0IGh3ZmMgb3ZlcnJpZGVzIG9uIENUUy4gKi8KKyAgICAiQVRRMEUxVjFYNCZTMFxcRDAmQzEmRDJcMDE1IiwJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBYNCZTMVwwMTUiLAkJCS8qIHdha2Vfc3RyICovCisjZWxzZQorICAgICJBVFEwWDRcMDE1IiwJCQkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQrSUZDPTIsMlwwMTUiLAkJCS8qIGh3ZmNfc3RyICovCisgICAgIkFUK0lGQz0xLDFcMDE1IiwJCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVCtJRkM9MCwwXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQrRVM9MywwXDAxNSIsCQkJLyogZWNfb25fc3RyICovCisgICAgIkFUK0VTPTEsMFwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQrRFM9MywwLDIwNDgsMzJcMDE1IiwJCS8qIGRjX29uX3N0ciAqLworICAgICJBVCtEUz0wLDBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisKKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAoPykgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICA1NzYwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworI2VuZGlmIC8qIE1JTklESUFMICovCisKK3N0YXRpYworTURNSU5GIElUVVRWMjUwID0JCQkvKiBJVFUtVCBWLjI1MCBjb25mb3JtaW5nIG1vZGVtICovCit7CisgICAgIkFueSBJVFUtVCBWLjI1dGVyL1YuMjUwIGNvbmZvcm1hbnQgbW9kZW0iLAorICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyAgICAiQVRRMEUxVjFYNCZDMSZEMlwwMTUiLAkJLyogd2FrZV9zdHIgKG5vICZTbiBpbiBWLjI1KSAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQrSUZDPTIsMlwwMTUiLAkJCS8qIGh3ZmNfc3RyICovCisgICAgIkFUK0lGQz0xLDFcMDE1IiwJCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVCtJRkM9MCwwXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQrRVM9MywwLDI7K0VCPTEsMCwzMFwwMTUiLAkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQrRVM9MFwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQrRFM9MywwXDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUK0RTPTAsMFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDU3NjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKKyNpZm5kZWYgQ0tfVEFQSQorc3RhdGljCisjZW5kaWYgLyogQ0tfVEFQSSAqLworTURNSU5GIEdFTkVSSUMgPQkJCS8qIEdlbmVyaWMgaGlnaCBzcGVlZCAuLi4gKi8KKyAgICB7CisgICAgIkdlbmVyaWMgaGlnaC1zcGVlZCBBVCBjb21tYW5kIHNldCIsCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworICAgICIiLAkJCQkJLyogd2FrZV9zdHIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIiIsCQkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiQVREJXNcMDE1IiwJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAxMTAwLAkJCQkvKiBlc2NfdGltZSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEgwXDAxNSIsCQkJLyogaHVwX3N0ciAqLworICAgICIiLAkJCQkJLyogaHdmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHN3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBub2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wxX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAxMTUyMDAsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFcsIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKKyNpZm5kZWYgTUlOSURJQUwKK3N0YXRpYworTURNSU5GIFhKQUNLID0JCQkJLyogTWVnYWhlcnR6IFgtSmFjayAqLworICAgIHsKKyAgICAiTWVnYWhlcnR6IFgtSmFjayBYSjMxNDQgLyBDQzYxNDQiLAorICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMEUxVjFYNE4xJkMxJkQyXFxLNVwwMTUiLAkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMFg0TjFcXEs1XDAxNSIsCQkJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmSzNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCZLNFwwMTUiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVRcXE4zJlE1XDAxNSIsCQkJLyogZWNfb25fc3RyICovCisgICAgIkFUXFxOMSZRMFwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQlQzNcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVQlQzBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICA1NzYwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBTUElSSVRJSSA9CQkJLyogUXVpY2tDb21tIFNwaXJpdCBJSSAqLworICAgIHsKKyAgICAiUXVpY2tDb21tIFNwaXJpdCBJSSIsCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworICAgICJBVCZGXDAxNSIsCQkJCS8qIHdha2Vfc3RyICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICJPS1wwMTUiLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiQVREJXNcMDE1IiwJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAxMTAwLAkJCQkvKiBlc2NfdGltZSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEhcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUKkYzXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQqRjJcMDE1IiwJCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVCpGMFwwMTUiLAkJCS8qIG5vZmNfc3RyICovCisgICAgIkFUKkU2XDAxNSIsCQkJLyogZWNfb25fc3RyICovCisgICAgIkFUKkUwXDAxNSIsCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICJBVCpFOVwwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVCpFMFwwMTUiLAkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0yXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDU3NjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIE1PTlRBTkEgPSB7CQkJLyogTW90b3JvbGEgTW9udGFuYSAqLworICAgICJNb3Rvcm9sYSBNb250YW5hIiwJCQkvKiBOYW1lICovCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworI2lmZGVmIE9TMgorICAgICJBVFEwRTFWMVg0JlMwJkMxJkQyXFxLNVxcVjFcMDE1IiwJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBFMVg0JlMxXFxLNVxcVjFcMDE1IiwJCS8qIHdha2Vfc3RyICovCisjZWxzZQorICAgICJBVFEwRTFYNFxcSzVcXFYxXDAxNSIsCQkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVRcXFEzXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVRcXFExXDAxNSIsCQkJLyogc3dmY19zdHIgKi8KKyAgICAiQVRcXFEwXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVRcXE40XDAxNSIsCQkJLyogZWNfb25fc3RyICovCisgICAgIkFUXFxOMVwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQlQzFcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVQlQzBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIkFUXFxKMFwwMTUiLAkJCS8qIHNiX29uX3N0ciAqLworICAgICJBVFxcSjFcMDE1IiwJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIkFUTTFcMDE1IiwJCQkJLyogc3Bfb25fc3RyICovCisgICAgIkFUTTBcMDE1IiwJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICJBVEwxXDAxNSIsCQkJCS8qIHZvbDFfc3RyICovCisgICAgIkFUTDJcMDE1IiwJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiQVRMM1wwMTUiLAkJCQkvKiB2b2wzX3N0ciAqLworICAgICJBVFgzXDAxNSIsCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgNTc2MDBMLAkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICBDS0RfQVR8Q0tEX1NCfENLRF9FQ3xDS0RfREN8Q0tEX0hXfENLRF9TVywgLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgQ09NUEFRID0gewkJCS8qIENvbXBhcSBEYXRhK0ZheCBNb2RlbSAqLworICAgICJDb21wYXEgRGF0YStGYXggTW9kZW0iLAkJLyogTmFtZSAqLworICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMEUxVjFYNCZTMCZDMSZEMlwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBFMVg0JlMxXDAxNSIsCQkJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBFMVg0XDAxNSIsCQkJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUXFxRM1wwMTUiLAkJCS8qIGh3ZmNfc3RyIChzYW1lIGFzICZLMykgKi8KKyAgICAiQVRcXFExXDAxNSIsCQkJLyogc3dmY19zdHIgKHNhbWUgYXMgJks0KSAqLworICAgICJBVFxcUTBcMDE1IiwJCQkvKiBub2ZjX3N0ciAoc2FtZSBhcyAmSzApICovCisgICAgIkFUXFxOM1wwMTUiLAkJCS8qIGVjX29uX3N0ciAqLworICAgICJBVFxcTjBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJUMxXDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUJUMwXDAxNSIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICJBVFxcTjNcMDE1IiwJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiQVRcXE4xXDAxNSIsCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMFwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCisKK3N0YXRpYworTURNSU5GIEZVSklUU1UgPSB7CQkJLyogRnVqaXRzdSAqLworICAgICJGdWppdHN1IEZheC9Nb2RlbSBBZGFwdGVyIiwJLyogTmFtZSAqLworICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMEUxVjFYNCZTMCZDMSZEMlxcSzVcXE4zXDAxNSIsCS8qIHdha2Vfc3RyICovCisjZWxzZQorI2lmZGVmIFZNUworICAgICJBVFEwRTFYNCZTMVxcSzVcXE4zXDAxNSIsCQkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMEUxWDRcXEs1XFxOM1wwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkszXFxRM1wwMTUiLAkJCS8qIGh3ZmNfc3RyICovCisgICAgIkFUJks0XFxRMVwwMTUiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXFxRMFwwMTUiLAkJCS8qIG5vZmNfc3RyICovCisgICAgIkFUXFxOM1wwMTUiLAkJCS8qIGVjX29uX3N0ciAqLworICAgICJBVFxcTjBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJUMxIiwJCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUJUMwIiwJCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICJBVFxcSjBcMDE1IiwJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiQVRcXEoxXDAxNSIsCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBNSFpBVFQgPQkJCQkvKiBNZWdhaGVydHogQVQmVCBWLjM0ICovCisgICAgeworICAgICJNZWdhaGVydHogQVQmVCBWLjM0IiwKKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFUUTBFMVYxWDROMSZDMSZEMlxcSzVcMDE1IiwJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBYNE4xXFxLNVwwMTUiLAkJCS8qIHdha2Vfc3RyICovCisjZW5kaWYgLyogT1MyICovCisgICAgMCwJCQkJCS8qIHdha2VfcmF0ZSAqLworICAgICJPS1wwMTUiLAkJCQkvKiB3YWtlX3Byb21wdCAqLworICAgICIiLAkJCQkJLyogZG1vZGVfc3RyICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9wcm9tcHQgKi8KKyAgICAiQVREJXNcMDE1IiwJCQkvKiBkaWFsX3N0ciAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAxMTAwLAkJCQkvKiBlc2NfdGltZSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEhcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkszXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmSzRcMDE1IiwJCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVCZLMFwwMTUiLAkJCS8qIG5vZmNfc3RyICovCisgICAgIkFUXFxOM1wwMTUiLAkJCS8qIGVjX29uX3N0ciAqLworICAgICJBVFxcTjBcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJUMxXCJIM1wwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVCVDMFwiSDBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIkFUXFxKMFwwMTUiLAkJCS8qIHNiX29uX3N0ciAqLworICAgICJBVFxcSjFcMDE1IiwJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIkFUTTFcMDE1IiwJCQkJLyogc3Bfb25fc3RyICovCisgICAgIkFUTTBcMDE1IiwJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICJBVEwxXDAxNSIsCQkJCS8qIHZvbDFfc3RyICovCisgICAgIkFUTDJcMDE1IiwJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiQVRMM1wwMTUiLAkJCQkvKiB2b2wzX3N0ciAqLworICAgICJBVFgzXDAxNSIsCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgMTE1MjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIFNVUFJBU09OID0JCQkvKiBTdXByYVNvbmljICovCisgICAgeworICAgICJEaWFtb25kIFN1cHJhU29uaWMgMjg4VisiLAkJLyogRGlhbW9uZCBNdWx0aW1lZGlhIFN5c3RlbXMgSW5jICovCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworI2lmZGVmIE9TMgorICAgICJBVFEwRTFWMU4xVzBYNFkwJlMwJkMxJkQyXDAxNSIsCS8qIHdha2Vfc3RyICovCisjZWxzZQorI2lmZGVmIFZNUworICAgICJBVFEwRTFOMVcwWDRZMCZTMVwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBFMU4xVzBYNFkwXDAxNSIsCQkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmSzNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCZLNFwwMTUiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJktcMDE1IiwJCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVQmUTVcXE4zUzQ4PTdcMDE1IiwJCS8qIGVjX29uX3N0ciAqLworICAgICJBVCZRMFxcTjFcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJUMzUzQ2PTEzOFwwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVCVDMFM0Nj0xMzZcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMXDAxNSIsCQkJCS8qIHZvbDFfc3RyICovCisgICAgIkFUTDJcMDE1IiwJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiQVRMM1wwMTUiLAkJCQkvKiB2b2wzX3N0ciAqLworICAgICJBVFgzXDAxNSIsCQkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgMTE1MjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIEJFU1REQVRBID0JCQkvKiBCZXN0IERhdGEgKi8KKyAgICB7CisgICAgIkJlc3QgRGF0YSBGYXggTW9kZW0iLAkJLyogQmVzdCBEYXRhIEZheCBNb2RlbSAqLworICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMEUxVjFOMVcwWDRZMCZTMCZDMSZEMlwwMTUiLAkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMEUxTjFXMFg0WTAmUzFcMDE1IiwJCS8qIHdha2Vfc3RyICovCisjZWxzZQorICAgICJBVFEwRTFOMVcwWDRZMFwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUJkszXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVQmSzRcMDE1IiwJCQkvKiBzd2ZjX3N0ciAqLworICAgICJBVCZLXDAxNSIsCQkJCS8qIG5vZmNfc3RyICovCisgICAgIkFUJlE2XFxOM1wwMTUiLAkJCS8qIGVjX29uX3N0ciAqLworICAgICJBVCZRMFxcTjFcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJUMzXDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUJUMwXDAxNSIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICJBVFxcTjNcMDE1IiwJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiQVRcXE4wXDAxNSIsCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDU3NjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIEFUVDE5MDAgPQkJCS8qIEFUJlQgU2VjdXJlIERhdGEgU1RVIElJSSAxOTAwICovCisgICAgeworICAgICJBVCZUIFNlY3VyZSBEYXRhIFNUVSBJSUkgTW9kZWwgMTkwMCIsIC8qIG5hbWUgKi8KKyAgICAiIiwJCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiIiwJCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFUUTBFMVYxWDRcMDE1IiwJCQkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMEUxWDRcMDE1IiwJCQkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGh3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBzd2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogbm9mY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGVjX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogZGNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDJfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wzX3N0ciAqLworICAgICIiLAkJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICA5NjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfSFcsCQkvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCisvKgorICBFeHBlcmltZW50YXRpb24gc2hvd2VkIHRoYXQgaGFyZGx5IGFueSBvZiB0aGUgZG9jdW1lbnRlZCBjb21tYW5kcyBkaWQKKyAgYW55dGhpbmcgb3RoZXIgdGhhdCBwcmludCBFUlJPUi4gIEF0IGZpcnN0IHRoZXJlIHdhcyBubyBjb21tdW5pY2F0aW9uIGF0CisgIGFsbCBhdCA5NjAwIGJwcyAtLSB0dXJucyBvdXQgdGhlIGludGVyZmFjZSBzcGVlZCB3YXMgc3R1Y2sgYXQgMjQwMC4KKyAgQVRTMjg9MTMwIChnaXZlbiBhdCAyNDAwIGJwcykgYWxsb3dlZCBpdCB0byB3b3JrIGF0IDk2MDAuCisqLworc3RhdGljCitNRE1JTkYgQVRUMTkxMCA9CQkJLyogQVQmVCBTZWN1cmUgRGF0YSBTVFUgSUlJIDE5MTAgKi8KKyAgICB7CQkJCQkvKiBBZGRzIFYuMzJiaXMsIFYuNDIsIFYuNDJiaXMgKi8KKyAgICAiQVQmVCBTZWN1cmUgRGF0YSBTVFUgSUlJIE1vZGVsIDE5MTAiLCAvKiBuYW1lICovCisKKy8qIEJlbGlldmUgaXQgb3Igbm90LCAiQVRUIiBhbmQgIkFUUCIgcmVzdWx0IGluIEVSUk9SICovCisKKyAgICAiIiwJCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiIiwJCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFUUTBFMVYxWDRcMDE1IiwJCQkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMEUxWDRcMDE1IiwJCQkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGh3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBzd2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogbm9mY19zdHIgKi8KKyNpZmRlZiBDT01NRU5UCisvKiBUaGVzZSBhcmUgZXZpZGVudGx5IHJlYWQtb25seSByZWdpc3RlcnMgKi8KKyAgICAiQVRTNDY9MTM4UzQ3PTBcMDE1IiwJCS8qIGVjX29uX3N0ciAqLworICAgICJBVFM0Nj0xMzhTNDc9MTI4XDAxNSIsCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUUzQ2PTEzOFM0Nz0wXDAxNSIsCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVRTNDY9MTM4UzQ3PTEyOFwwMTUiLAkJLyogZGNfb2ZmX3N0ciAqLworI2Vsc2UKKyAgICAiIiwKKyAgICAiIiwKKyAgICAiIiwKKyAgICAiIiwKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNwX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDJfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wzX3N0ciAqLworICAgICIiLAkJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICA5NjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IVywJLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKworc3RhdGljCitNRE1JTkYgS0VFUElOVE9VQ0ggPQkJCS8qIEFUJlQgS2VlcGluVG91Y2ggQ2FyZCBNb2RlbSAqLworICAgIHsKKyAgICAiQVQmVCBLZWVwaW5Ub3VjaCBWLjMyYmlzIENhcmQgTW9kZW0iLCAvKiBOYW1lICovCisgICAgIkFUUFwwMTUiLAkJCQkvKiBwdWxzZSBjb21tYW5kICovCisgICAgIkFUVFwwMTUiLAkJCQkvKiB0b25lIGNvbW1hbmQgKi8KKyAgICAzNSwJCQkJCS8qIGRpYWxfdGltZSAqLworICAgICIsIiwJCQkJLyogcGF1c2VfY2hhcnMgKi8KKyAgICAyLAkJCQkJLyogcGF1c2VfdGltZSAqLworI2lmZGVmIE9TMgorLyogVGhpcyB1c2VkIHRvIGluY2x1ZGUgJkMxJlMwJkQyK1EwIGJ1dCB0aGF0IGdpdmVzIEVSUk9SICovCisgICAgIkFUUTBFMVYxWDQmUzAmQzEmRDJcXEs1XDAxNSIsCS8qIHdha2Vfc3RyICovCisjZWxzZQorI2lmZGVmIFZNUworICAgICJBVFEwRTFYNCZTMVxcSzVcMDE1IiwJCS8qIHdha2Vfc3RyICovCisjZWxzZQorICAgICJBVFEwRTFYNFxcSzVcMDE1IiwJCQkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVRcXFEzXDAxNSIsCQkJLyogaHdmY19zdHIgKi8KKyAgICAiQVRcXFExXFxYMFwwMTUiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUXFxRMFwwMTUiLAkJCS8qIG5vZmNfc3RyICovCisgICAgIkFUXFxOMy1KMVwwMTUiLAkJCS8qIGVjX29uX3N0ciAqLworICAgICJBVFxcTjFcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJUMzXCJIM1wwMTUiLAkJCS8qIGRjX29uX3N0ciAqLworICAgICJBVCVDMFwiSDBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIkFUTjBcXEowXDAxNSIsCQkJLyogc2Jfb25fc3RyICovCisgICAgIkFUTjFcXEoxXDAxNSIsCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDFfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wyX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDU3NjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIFJPTE1fQVQgPQkJLyogUm9sbSBkYXRhIHBob25lIHdpdGggQVQgY29tbWFuZCBzZXQgKi8KKyAgICB7CisgICAgIlJvbG0gMjQ0UEMgb3IgNjAwIFNlcmllcyB3aXRoIEFUIENvbW1hbmQgU2V0IiwKKyAgICAiIiwJCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiIiwJCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFURTFRMFYxXDAxNSIsCQkJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUUTBcMDE1IiwJCQkJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVERUJXNcMDE1IiwJCQkvKiBkaWFsX3N0ciAtLSBhbHdheXMgVG9uZSAqLworICAgIDAsCQkJCQkvKiBkaWFsX3JhdGUgKi8KKyAgICAxMTAwLAkJCQkvKiBlc2NfdGltZSAqLworICAgIDQzLAkJCQkJLyogZXNjX2NoYXIgKi8KKyAgICAiQVRRMEgwXDAxNSIsCQkJLyogaHVwX3N0ciAqLworICAgICIiLAkJCQkJLyogaHdmY19zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHN3ZmNfc3RyICovCisgICAgIiIsCQkJCQkvKiBub2ZjX3N0ciAqLworICAgICIiLAkJCQkJLyogZWNfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBlY19vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRjX29mZl9zdHIgKi8KKyAgICAiQVRTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUUzA9MFwwMTUiLAkJCS8qIGFhX29mZl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHNiX29uX3N0ciAqLworICAgICIiLAkJCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICIiLAkJCQkJLyogc3Bfb25fc3RyICovCisgICAgIiIsCQkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIiIsCQkJCQkvKiB2b2wxX3N0ciAqLworICAgICIiLAkJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIHZvbDNfc3RyICovCisgICAgIiIsCQkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDE5MjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FULAkJCQkvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBBVExBUyA9CQkJCS8qIEF0bGFzIC8gTmV3Y29tIGl4ZkMgMzMuNiAqLworICAgIHsKKyAgICAiQXRsYXMgLyBOZXdjb20gMzM2MDBpeGZDIERhdGEvRmF4IE1vZGVtIiwgLyogTmFtZSAqLworICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRaMCZGUTBWMSZDMSZEMlwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUWjAmRlEwVjFcMDE1IiwJCQkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmSzNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCZLNFwwMTUiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVRcIkgzXDAxNSIsCQkJLyogZWNfb25fc3RyICovCisgICAgIkFUXCJIMFwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQlQzFcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVQlQzBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIkFUTjBcXEowXDAxNSIsCQkJLyogc2Jfb25fc3RyICovCisgICAgIkFUTjFcXEoxXDAxNSIsCQkJLyogc2Jfb2ZmX3N0ciAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBDT0RFWCA9IHsJCQkvKiBNb3Rvcm9sYSBDb2RleCAqLworICAgICJNb3Rvcm9sYSBDb2RleCAzMjZYIFNlcmllcyIsCS8qIE5hbWUgLSBBVCZWIHRvIHNlZSBzZXR0aW5ncyAqLworICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAvKiAmTTA9QXN5bmMgKG5vdCBzeW5jKSAqLworICAgIC8qICpNTTA9QXV0b21hdGljIG1vZHVsYXRpb24gbmVnb3RpYXRpb24gKi8KKyAgICAvKiAqREUyMj1BdXRvbWF0aWMgZGF0YSByYXRlICovCisgICAgIkFUWlEwRTFWMVg0WTAqREUyMipNTTAmQzEmTTAmUzAmRDJcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUWlEwRTFWMVg0WTAqREUyMipNTTAmQzEmTTAmUzFcMDE1IiwgLyogd2FrZV9zdHIgKi8KKyNlbHNlCisgICAgIkFUWlEwRTFWMVg0WTAqREUyMipNTTAmQzEmTTBcMDE1IiwJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUKk1GMSpGTDNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCpNRjEqRkwxXDAxNSIsCQkJLyogc3dmY19zdHIgKi8KKyAgICAiQVQqTUYwKkZMMFwwMTUiLAkJCS8qIG5vZmNfc3RyICovCisgICAgIkFUKkVDMCpTTTMqU0MwXDAxNSIsCQkvKiBlY19vbl9zdHIgKi8KKyAgICAiQVQqU00wXDAxNSIsCQkJLyogZWNfb2ZmX3N0ciAqLworICAgICJBVCpEQzFcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVQqREMwXDAxNSIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVCpBQTVTMD0xXDAxNSIsCQkJLyogYWFfb25fc3RyICovCisgICAgIkFUKkFBNVMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIkFUKlNDMVwwMTUiLAkJCS8qIHNiX29uX3N0ciAqLworICAgICJBVCpTQzBcMDE1IiwJCQkvKiBzYl9vZmZfc3RyICovCisgICAgIkFUTTFcMDE1IiwJCQkJLyogc3Bfb25fc3RyICovCisgICAgIkFUTTBcMDE1IiwJCQkJLyogc3Bfb2ZmX3N0ciAqLworICAgICJBVEwxXDAxNSIsCQkJCS8qIHZvbDFfc3RyICovCisgICAgIkFUTDJcMDE1IiwJCQkJLyogdm9sMl9zdHIgKi8KKyAgICAiQVRMM1wwMTUiLAkJCQkvKiB2b2wzX3N0ciAqLworICAgICJBVFgzKkJEMlwwMTUiLAkJCS8qIGlnbm9yZWR0ICovCisgICAgIiIsCQkJCQkvKiBpbmkyICovCisgICAgMTE1MjAwTCwJCQkJLyogbWF4X3NwZWVkICovCisgICAgQ0tEX0FUfENLRF9TQnxDS0RfRUN8Q0tEX0RDfENLRF9IV3xDS0RfU1csIC8qIGNhcGFzICovCisgICAgZ2V0b2sJCQkJLyogb2tfZm4gKi8KK307CisKK3N0YXRpYworTURNSU5GIE1UNTYzNFpQWCA9CQkJLyogTXVsdGl0ZWNoICovCisgICAgeworICAgICJNdWx0aXRlY2ggTVQ1NjM0WlBYIiwJCS8qIG5hbWUgKi8KKyAgICAiQVRQXDAxNSIsCQkJCS8qIHB1bHNlIGNvbW1hbmQgKi8KKyAgICAiQVRUXDAxNSIsCQkJCS8qIHRvbmUgY29tbWFuZCAqLworICAgIDM1LAkJCQkJLyogZGlhbF90aW1lICovCisgICAgIiwiLAkJCQkvKiBwYXVzZV9jaGFycyAqLworICAgIDIsCQkJCQkvKiBwYXVzZV90aW1lICovCisjaWZkZWYgT1MyCisgICAgIkFURTFRMFYxWDQmUzAmQzEmRDImUTBcMDE1IiwJLyogd2FrZV9zdHIgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgIkFUUTBFMVg0JlMxJlEwXDAxNSIsCQkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMEUxWDQmUTBcMDE1IiwJCQkvKiB3YWtlX3N0ciAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIDAsCQkJCQkvKiB3YWtlX3JhdGUgKi8KKyAgICAiT0tcMDE1IiwJCQkJLyogd2FrZV9wcm9tcHQgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3N0ciAqLworICAgICIiLAkJCQkJLyogZG1vZGVfcHJvbXB0ICovCisgICAgIkFURCVzXDAxNSIsCQkJLyogZGlhbF9zdHIgKi8KKyAgICAwLAkJCQkJLyogZGlhbF9yYXRlICovCisgICAgMTEwMCwJCQkJLyogZXNjX3RpbWUgKi8KKyAgICA0MywJCQkJCS8qIGVzY19jaGFyICovCisgICAgIkFUUTBIMFwwMTUiLAkJCS8qIGh1cF9zdHIgKi8KKyAgICAiQVQmSzNcMDE1IiwJCQkvKiBod2ZjX3N0ciAqLworICAgICJBVCZLNFwwMTUiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUJkswXDAxNSIsCQkJLyogbm9mY19zdHIgKi8KKyAgICAiQVRcXE4zXDAxNSIsCQkJLyogZWNfb25fc3RyICovCisgICAgIkFUXFxOMVwwMTUiLAkJCS8qIGVjX29mZl9zdHIgKi8KKyAgICAiQVQlQzFcMDE1IiwJCQkvKiBkY19vbl9zdHIgKi8KKyAgICAiQVQlQzBcMDE1IiwJCQkvKiBkY19vZmZfc3RyICovCisgICAgIkFUUzA9MVwwMTUiLAkJCS8qIGFhX29uX3N0ciAqLworICAgICJBVFMwPTBcMDE1IiwJCQkvKiBhYV9vZmZfc3RyICovCisgICAgIkFUXFxKMFwwMTUiLAkJCS8qIHNiX29uX3N0ciAqLworICAgICJBVFxcSjFcMDE1IiwJCQkvKiBzYl9vZmZfc3RyIChOT1QgU1VQUE9SVEVEKSAqLworICAgICJBVE0xXDAxNSIsCQkJCS8qIHNwX29uX3N0ciAqLworICAgICJBVE0wXDAxNSIsCQkJCS8qIHNwX29mZl9zdHIgKi8KKyAgICAiQVRMMVwwMTUiLAkJCQkvKiB2b2wxX3N0ciAqLworICAgICJBVEwyXDAxNSIsCQkJCS8qIHZvbDJfc3RyICovCisgICAgIkFUTDNcMDE1IiwJCQkJLyogdm9sM19zdHIgKi8KKyAgICAiQVRYM1wwMTUiLAkJCQkvKiBpZ25vcmVkdCAqLworICAgICIiLAkJCQkJLyogaW5pMiAqLworICAgIDExNTIwMEwsCQkJCS8qIG1heF9zcGVlZCAqLworICAgIENLRF9BVHxDS0RfU0J8Q0tEX0VDfENLRF9EQ3xDS0RfSFd8Q0tEX1NXLCAvKiBjYXBhcyAqLworICAgIGdldG9rCQkJCS8qIG9rX2ZuICovCit9OworCitzdGF0aWMKK01ETUlORiBNT1RTTTU2ID0JCQkvKiBNb3Rvcm9sYSBTTTU2IENoaXBzZXQgKi8KKyAgICB7CisgICAgIk1vdG9yb2xhIFNNNTYgVi45MCBjaGlwc2V0IiwJLyogbmFtZSAqLworICAgICJBVFBcMDE1IiwJCQkJLyogcHVsc2UgY29tbWFuZCAqLworICAgICJBVFRcMDE1IiwJCQkJLyogdG9uZSBjb21tYW5kICovCisgICAgMzUsCQkJCQkvKiBkaWFsX3RpbWUgKi8KKyAgICAiLCIsCQkJCS8qIHBhdXNlX2NoYXJzICovCisgICAgMiwJCQkJCS8qIHBhdXNlX3RpbWUgKi8KKyNpZmRlZiBPUzIKKyAgICAiQVRRMFYxWDQmUzAmQzEmRDIqTU0xNlwwMTUiLAkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAiQVRRMFYxWDQmUzEmQzEmRDIqTU0xNlwwMTUiLAkvKiB3YWtlX3N0ciAqLworI2Vsc2UKKyAgICAiQVRRMFYxWDQmQzEmRDIqTU0xNlwwMTUiLAkJLyogd2FrZV9zdHIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAwLAkJCQkJLyogd2FrZV9yYXRlICovCisgICAgIk9LXDAxNSIsCQkJCS8qIHdha2VfcHJvbXB0ICovCisgICAgIiIsCQkJCQkvKiBkbW9kZV9zdHIgKi8KKyAgICAiIiwJCQkJCS8qIGRtb2RlX3Byb21wdCAqLworICAgICJBVEQlc1wwMTUiLAkJCS8qIGRpYWxfc3RyICovCisgICAgMCwJCQkJCS8qIGRpYWxfcmF0ZSAqLworICAgIDExMDAsCQkJCS8qIGVzY190aW1lICovCisgICAgNDMsCQkJCQkvKiBlc2NfY2hhciAqLworICAgICJBVFEwSDBcMDE1IiwJCQkvKiBodXBfc3RyICovCisgICAgIkFUXFxRM1wwMTUiLAkJCS8qIGh3ZmNfc3RyICovCisgICAgIkFUXFxRMVwwMTUiLAkJCS8qIHN3ZmNfc3RyICovCisgICAgIkFUXFxRMFwwMTUiLAkJCS8qIG5vZmNfc3RyICovCisgICAgIkFUXFxON1wwMTUiLAkJCS8qIGVjX29uX3N0ciAqLworICAgICJBVFxcTjFcMDE1IiwJCQkvKiBlY19vZmZfc3RyICovCisgICAgIkFUJUMxXDAxNSIsCQkJLyogZGNfb25fc3RyICovCisgICAgIkFUJUMwXDAxNSIsCQkJLyogZGNfb2ZmX3N0ciAqLworICAgICJBVFMwPTFcMDE1IiwJCQkvKiBhYV9vbl9zdHIgKi8KKyAgICAiQVRTMD0wXDAxNSIsCQkJLyogYWFfb2ZmX3N0ciAqLworICAgICJBVFxcSjBcMDE1IiwJCQkvKiBzYl9vbl9zdHIgKi8KKyAgICAiQVRcXEoxXDAxNSIsCQkJLyogc2Jfb2ZmX3N0ciAoTk9UIFNVUFBPUlRFRCkgKi8KKyAgICAiQVRNMVwwMTUiLAkJCQkvKiBzcF9vbl9zdHIgKi8KKyAgICAiQVRNMFwwMTUiLAkJCQkvKiBzcF9vZmZfc3RyICovCisgICAgIkFUTDFcMDE1IiwJCQkJLyogdm9sMV9zdHIgKi8KKyAgICAiQVRMMlwwMTUiLAkJCQkvKiB2b2wyX3N0ciAqLworICAgICJBVEwzXDAxNSIsCQkJCS8qIHZvbDNfc3RyICovCisgICAgIkFUWDNcMDE1IiwJCQkJLyogaWdub3JlZHQgKi8KKyAgICAiIiwJCQkJCS8qIGluaTIgKi8KKyAgICAxMTUyMDBMLAkJCQkvKiBtYXhfc3BlZWQgKi8KKyAgICBDS0RfQVR8Q0tEX1NCfENLRF9FQ3xDS0RfREN8Q0tEX0hXfENLRF9TVywgLyogY2FwYXMgKi8KKyAgICBnZXRvawkJCQkvKiBva19mbiAqLworfTsKKyNlbmRpZiAvKiBNSU5JRElBTCAqLworCisvKiBFTkQgTURNSU5GIFNUUlVDVCBERUZJTklUSU9OUyAqLworCisvKgorICBUYWJsZSB0byBjb252ZXJ0IG1vZGVtIG51bWJlcnMgdG8gTURNSU5GIHN0cnVjdCBwb2ludGVycy4KKyAgVGhlIGVudHJpZXMgTVVTVCBiZSBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgbW9kZW0gbnVtYmVyLCB3aXRob3V0IGFueQorICAiZ2FwcyIgaW4gdGhlIG51bWJlcnMsIGFuZCBzdGFydGluZyBmcm9tIG9uZSAoMSkuCisqLworCitNRE1JTkYgKm1vZGVtcFtdID0geworI2lmZGVmIE1JTklESUFMCisgICAgTlVMTCwJCQkJLyogIDAgKi8KKyAgICAmQ0NJVFQsCQkJCS8qICAxICovCisgICAgJkhBWUVTLAkJCQkvKiAgMiAqLworICAgICZVTktOT1dOLAkJCQkvKiAgMyAqLworICAgICZEVU1NWSwJCQkJLyogIDQgKi8KKyAgICAmR0VORVJJQywJCQkJLyogIDUgKi8KKyAgICAmSVRVVFYyNTAJCQkJLyogIDYgKi8KKyNlbHNlICAvKiBOb3QgTUlOSURJQUwgKi8KKyAgICBOVUxMLAkJCQkvKiAgMCAqLworICAgICZBVFREVERNLAkJCQkvKiAgMSAqLworICAgICZBVFRJU04sCQkJCS8qICAyICovCisgICAgJkFUVE1PREVNLAkJCQkvKiAgMyAqLworICAgICZDQ0lUVCwJCQkJLyogIDQgKi8KKyNpZmRlZiBPTERNT0RFTVMKKyAgICAmQ0VSTUVURUssCQkJCS8qICA1ICovCisgICAgJkRGMDMsCQkJCS8qICA2ICovCisgICAgJkRGMTAwLAkJCQkvKiAgNyAqLworICAgICZERjIwMCwJCQkJLyogIDggKi8KKyAgICAmR0RDLAkJCQkvKiAgOSAqLworI2Vsc2UKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisjZW5kaWYgLyogT0xETU9ERU1TICovCisgICAgJkhBWUVTLAkJCQkvKiAxMCAqLworI2lmZGVmIE9MRE1PREVNUworICAgICZQRU5SSUwsCQkJCS8qIDExICovCisgICAgJlJBQ0FMLAkJCQkvKiAxMiAqLworI2Vsc2UKKyAgICBOVUxMLAorICAgIE5VTEwsCisjZW5kaWYgLyogT0xETU9ERU1TICovCisgICAgJlVOS05PV04sCQkJCS8qIDEzICovCisjaWZkZWYgT0xETU9ERU1TCisgICAgJlZFTlRFTCwJCQkJLyogMTQgKi8KKyAgICAmQ09OQ09SRCwJCQkJLyogMTUgKi8KKyNlbHNlCisgICAgTlVMTCwKKyAgICBOVUxMLAorI2VuZGlmIC8qIE9MRE1PREVNUyAqLworICAgICZEVU1NWSwJCQkJLyogMTYgKi8KKyAgICAmUk9MTSwJCQkJLyogMTcgKi8KKyNpZmRlZiBPTERNT0RFTVMKKyAgICAmTUlDUk9DT00sCQkJCS8qIDE4ICovCisjZWxzZQorICAgIE5VTEwsCisjZW5kaWYgLyogT0xETU9ERU1TICovCisgICAgJlVTUiwJCQkJLyogMTkgVVNSIENvdXJpZXIgYW5kIFNwb3J0c3RlciAqLworICAgICZPTERUQiwJCQkJLyogMjAgT2xkIFRlbGViaXRzICovCisgICAgJkRJR0lURUwsCQkJCS8qIDIxIERpZ2l0ZWwgQ0NJVFQgKi8KKyAgICAmSF8xMjAwLAkJCQkvKiAyMiBIYXllcyAxMjAwICovCisgICAgJkhfVUxUUkEsCQkJCS8qIDIzIEhheWVzIFVsdHJhICovCisgICAgJkhfQUNDVVJBLAkJCQkvKiAyNCBIYXllcyBPcHRpbWEgKi8KKyAgICAmUFBJLAkJCQkvKiAyNSBQUEkgKi8KKyAgICAmREFUQVBPUlQsCQkJCS8qIDI2IERhdGFwb3J0ICovCisgICAgJkJPQ0EsCQkJCS8qIDI3IEJvY2EgKi8KKyAgICAmTU9UT1JPTEEsCQkJCS8qIDI4IE1vdG9yb2xhIFVEUyBNT1RPUk9MQSAqLworICAgIE5VTEwsCQkJCS8qIDI5IERpZ2ljb21tICovCisgICAgTlVMTCwJCQkJLyogMzAgRHluYWxpbmsgKi8KKyAgICAmSU5URUwsCQkJCS8qIDMxIEludGVsICovCisgICAgJlVDT01fQVQsCQkJCS8qIDMyIE1pY3JvY29tIGluIEFUIG1vZGUgKi8KKyAgICAmTVVMVElURUNILAkJCQkvKiAzMyBNdWx0aXRlY2ggKi8KKyAgICAmU1VQUkEsCQkJCS8qIDM0IFN1cHJhICovCisgICAgJlpPTFRSSVgsCQkJCS8qIDM1IFpvbHRyaXggKi8KKyAgICAmWk9PTSwJCQkJLyogMzYgWm9vbSAqLworICAgICZaWVhFTCwJCQkJLyogMzcgWnlYRUwgKi8KKyAgICAmRFVNTVksCQkJCS8qIDM4IFRBUEkgKi8KKyAgICAmTkVXVEIsCQkJCS8qIDM5IE5ldy1UZWxlYml0ICovCisgICAgJk1BWFRFQ0gsCQkJCS8qIDQwIE1heFRlY2ggKi8KKyAgICAmRFVNTVksCQkJCS8qIDQxIFVzZXItZGVmaW5lZCAqLworICAgICZSV1YzMiwJCQkJLyogNDIgUm9ja3dlbGwgVi4zMiAqLworICAgICZSV1YzMkIsCQkJCS8qIDQzIFJvY2t3ZWxsIFYuMzJiaXMgKi8KKyAgICAmUldWMzQsCQkJCS8qIDQ0IFJvY2t3ZWxsIFYuMzQgKi8KKyAgICAmTVdBVkUsCQkJCS8qIDQ1IElCTSBNd2F2ZSAqLworICAgICZURUxFUEFUSCwJCQkJLyogNDYgR2F0ZXdheSAyMDAwIFRlbGVwYXRoIElJIDI4LjggKi8KKyAgICAmTUlDUk9MSU5LLAkJCQkvKiA0NyBNaWNyb0xpbmsgbW9kZW1zICovCisgICAgJkNBUkRJTkFMLAkJCQkvKiA0OCBDYXJkaW5hbCAqLworICAgICZHRU5FUklDLAkJCQkvKiA0OSBHZW5lcmljIGhpZ2gtc3BlZWQgKi8KKyAgICAmWEpBQ0ssCQkJCS8qIDUwIE1lZ2FoZXJ0ei1YamFjayAqLworICAgICZTUElSSVRJSSwJCQkJLyogNTEgUXVpY2tDb21tIFNwaXJpdCBJSSAqLworICAgICZNT05UQU5BLAkJCQkvKiA1MiBNb3Rvcm9sYSBNb250YW5hICovCisgICAgJkNPTVBBUSwJCQkJLyogNTMgQ29tcGFxIERhdGErRmF4ICovCisgICAgJkZVSklUU1UsCQkJCS8qIDU0IEZ1aml0c3UgKi8KKyAgICAmTUhaQVRULAkJCQkvKiA1NSBNZWdhaGVydHogQVQmVCBWLjM0ICovCisgICAgJlNVUFJBU09OLAkJCQkvKiA1NiBTdXByYXNvbmljICovCisgICAgJkJFU1REQVRBLAkJCQkvKiA1NyBCZXN0IERhdGEgKi8KKyAgICAmQVRUMTkwMCwJCQkJLyogNTggQVQmVCBTZWN1cmUgRGF0YSBTVFUgSUlJIDE5MDAgKi8KKyAgICAmQVRUMTkxMCwJCQkJLyogNTkgQVQmVCBTZWN1cmUgRGF0YSBTVFUgSUlJIDE5MTAgKi8KKyAgICAmS0VFUElOVE9VQ0gsCQkJLyogNjAgQVQmVCBLZWVwaW5Ub3VjaCAqLworICAgICZVU1JYMiwJCQkJLyogNjEgVVNSIFhKLTE1NjAgWDIgKi8KKyAgICAmUk9MTV9BVCwJCQkJLyogNjIgUm9sbSB3aXRoIEFUIGNvbW1hbmQgc2V0ICovCisgICAgJkFUTEFTLAkJCQkvKiA2MyBBdGxhcyAvIE5ld2NvbSAqLworICAgICZDT0RFWCwJCQkJLyogNjQgTW90b3JvbGEgQ29kZXggKi8KKyAgICAmTVQ1NjM0WlBYLAkJCQkvKiA2NSBNdWx0aXRlY2ggTVQ1NjM0WlBYICovCisgICAgJlVMSU5LVjI1MCwJCQkJLyogNjYgTWljcm9saW5rIFYuMjUwIDU2SyAqLworICAgICZJVFVUVjI1MCwJCQkJLyogNjcgR2VuZXJpYyBJVFUtVCBWLjI1MCAqLworICAgICZSV1Y5MCwJCQkJLyogNjggUm9ja3dlbGwgVi45MCA1NksgKi8KKyAgICAmU1VQUkFYLAkJCQkvKiA2OSBEaWFtb25kIFN1cHJhIEV4cHJlc3MgVi45MCAqLworICAgICZMVUNFTlQsCQkJCS8qIDcwIEx1Y2VudCBWZW51cyBjaGlwc2V0ICovCisgICAgJlBDVEVMLAkJCQkvKiA3MSBQQ1RlbCAqLworICAgICZDT05FWEFOVCwJCQkJLyogNzIgQ29uZXhhbnQgKi8KKyAgICAmWk9PTVYzNCwJCQkJLyogNzMgWm9vbSBWLjM0ICovCisgICAgJlpPT01WOTAsCQkJCS8qIDc0IFpvb20gVi45MCAqLworICAgICZaT09NVjkyLAkJCQkvKiA3NSBab29tIFYuOTIgKi8KKyAgICAmTU9UU001NgkJCQkvKiA3NiBNb3Rvcm9sYSBTTTU2IGNoaXBzZXQgKi8KKyNlbmRpZiAvKiBNSU5JRElBTCAqLworfTsKKy8qCisgKiBEZWNsYXJlIG1vZGVtIG5hbWVzIGFuZCBhc3NvY2lhdGVkIG51bWJlcnMgZm9yIGNvbW1hbmQgcGFyc2luZywKKyAqIGFuZCBhbHNvIGZvciBkb2luZyBudW1iZXItdG8tbmFtZSB0cmFuc2xhdGlvbi4KKyAqCisgKiBUaGUgZW50cmllcyBtdXN0IGJlIGluIGFscGhhYmV0aWNhbCBvcmRlciBieSBtb2RlbSBuYW1lLgorICovCitzdHJ1Y3Qga2V5dGFiIG1kbXRhYltdID0geworI2lmbmRlZiBNSU5JRElBTAorICAgICIzY29tLXVzci1tZWdhaGVydHotNTZrIiwgbl9VU1JYMiwgIENNX0lOViwKKyAgICAiYWNlci12OTAiLCAgICAgICAgIG5fUldWOTAsICAgICAgICBNX0FMSUFTLAorICAgICJhdGxhcy1uZXdjb20tMzM2MDBpZnhDIiwgbl9BVExBUywgIDAsCisgICAgImF0dC0xOTAwLXN0dS1paWkiLCBuX0FUVDE5MDAsICAgICAgMCwKKyAgICAiYXR0LTE5MTAtc3R1LWlpaSIsIG5fQVRUMTkxMCwgICAgICAwLAorICAgICJhdHQtNzMwMCIsCQluX0FUVFVQQywJMCwKKyAgICAiYXR0LWRhdGFwb3J0IiwJbl9EQVRBUE9SVCwJMCwKKyAgICAiYXR0LWR0ZG0iLAkJbl9BVFREVERNLAkwLAorICAgICJhdHQtaXNuIiwgICAgICAgICAgbl9BVFRJU04sICAgICAgIDAsCisgICAgImF0dC1rZWVwaW50b3VjaCIsICBuX0tFRVBJTlRPVUNILCAgMCwKKyAgICAiYXR0LXN3aXRjaGVkLW5ldCIsIG5fQVRUTU9ERU0sCTAsCisKKyAgICAiYXR0NzMwMCIsCQluX0FUVFVQQywJQ01fSU5WLAkvKiBvbGQgbmFtZSAqLworICAgICJhdHRkdGRtIiwJCW5fQVRURFRETSwJQ01fSU5WLAkvKiBvbGQgbmFtZSAqLworICAgICJhdHRpc24iLCAgICAgICAgICAgbl9BVFRJU04sICAgICAgIENNX0lOViwJLyogb2xkIG5hbWUgKi8KKyAgICAiYXR0bW9kZW0iLAkJbl9BVFRNT0RFTSwJQ01fSU5WLAkvKiBvbGQgbmFtZSAqLworCisgICAgImJlc3RkYXRhIiwgICAgICAgICBuX0JFU1REQVRBLCAgICAgMCwKKyAgICAiYm9jYSIsCQluX0JPQ0EsCQkwLAorICAgICJjYXJkaW5hbCIsICAgICAgICAgbl9DQVJESU5BTCwgICAgIDAsCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKyAgICAiY2NpdHQtdjI1YmlzIiwJbl9DQ0lUVCwJQ01fSU5WLCAvKiBOYW1lIGNoYW5nZWQgdG8gSVRVLVQgKi8KKyNpZm5kZWYgTUlOSURJQUwKKyNpZmRlZiBPTERNT0RFTVMKKyAgICAiY2VybWV0ZWsiLAkJbl9DRVJNRVRFSywJTV9PTEQsCisjZW5kaWYgLyogT0xETU9ERU1TICovCisgICAgImNvbXBhcSIsICAgICAgICAgICBuX0NPTVBBUSwgICAgICAgMCwKKyNpZmRlZiBPTERNT0RFTVMKKyAgICAiY29uY29yZCIsCQluX0NPTkNPUkQsCU1fT0xELAorI2VuZGlmIC8qIE9MRE1PREVNUyAqLworICAgICJjb25leGFudCIsICAgICAgICAgbl9DT05FWEFOVCwgICAgIDAsCisgICAgImNvdXJpZXIiLCAgICAgICAgICBuX1VTUiwgICAgICAgICAgQ01fSU5WLAorICAgICJkYXRhcG9ydCIsCQluX0RBVEFQT1JULAlDTV9JTlYsCS8qID09IGF0dC1kYXRhcG9ydCAqLworI2lmZGVmIE9MRE1PREVNUworICAgICJkZjAzLWFjIiwJCW5fREYwMywJCU1fT0xELAorICAgICJkZjEwMC1zZXJpZXMiLAluX0RGMTAwLAlNX09MRCwKKyAgICAiZGYyMDAtc2VyaWVzIiwJbl9ERjIwMCwJTV9PTEQsCisjZW5kaWYgLyogT0xETU9ERU1TICovCisgICAgImRpZ2l0ZWwtZHQyMiIsCW5fRElHSVRFTCwJMCwKKyNlbmRpZiAvKiBNSU5JRElBTCAqLworICAgICJkaXJlY3QiLAkJMCwJCUNNX0lOViwJLyogU3lub255bSBmb3IgTk9ORSAqLworI2lmbmRlZiBNSU5JRElBTAorICAgICJmdWppdHN1IiwgICAgICAgICAgbl9GVUpJVFNVLCAgICAgIDAsCisgICAgImdhdGV3YXktdGVsZXBhdGgiLCBuX1RFTEVQQVRILCAgICAgMCwKKyNpZmRlZiBPTERNT0RFTVMKKyAgICAiZ2RjLTIxMmEvZWQiLAluX0dEQywJCU1fT0xELAorICAgICJnZSIsICAgICAgICAgICAgICAgbl9HRU5FUklDLAlDTV9JTlZ8Q01fQUJSLAorICAgICJnZW4iLCAgICAgICAgICAgICAgbl9HRU5FUklDLAlDTV9JTlZ8Q01fQUJSLAorICAgICJnZW5kYXRhY29tbSIsCW5fR0RDLAkJQ01fSU5WLAkvKiBTeW5vbnltIGZvciBHREMgKi8KKyNlbmRpZiAvKiBPTERNT0RFTVMgKi8KKyNlbmRpZiAvKiBNSU5JRElBTCAqLworICAgICJnZW5lIiwgICAgICAgICAgICAgbl9HRU5FUklDLCAgICAgIENNX0lOVnxDTV9BQlIsCisgICAgImdlbmVyaWMiLCAgICAgICAgICBuX0dFTkVSSUMsICAgICAgMCwKKyAgICAiZ2VuZXJpYy1oaWdoLXNwZWVkIixuX0dFTkVSSUMsICAgICBDTV9JTlYsCisgICAgImgiLCAJICAgCW5fSEFZRVMsCUNNX0lOVnxDTV9BQlIsCisgICAgImhhIiwgCSAgIAluX0hBWUVTLAlDTV9JTlZ8Q01fQUJSLAorICAgICJoYXkiLCAgICAJCW5fSEFZRVMsCUNNX0lOVnxDTV9BQlIsCisgICAgImhheWUiLCAJICAgCW5fSEFZRVMsCUNNX0lOVnxDTV9BQlIsCisgICAgImhheWVzIiwgICAgCW5fSEFZRVMsCUNNX0lOVnxDTV9BQlIsIC8qIEhheWVzIDI0MDAgKi8KKyNpZm5kZWYgTUlOSURJQUwKKyAgICAiaGF5ZXMtMTIwMCIsCW5fSF8xMjAwLAkwLAorI2VuZGlmIC8qIE1JTklESUFMICovCisgICAgImhheWVzLTI0MDAiLAluX0hBWUVTLAkwLAorI2lmbmRlZiBNSU5JRElBTAorICAgICJoYXllcy1oaWdoLXNwZWVkIiwgbl9IX0FDQ1VSQSwgICAgIDAsCisgICAgImhheWVzLWFjY3VyYSIsICAgICBuX0hfQUNDVVJBLCAgICAgQ01fSU5WLAorICAgICJoYXllcy1vcHRpbWEiLCAgICAgbl9IX0FDQ1VSQSwgICAgIENNX0lOViwKKyAgICAiaGF5ZXMtdWx0cmEiLAluX0hfVUxUUkEsCUNNX0lOViwKKyAgICAiaHN0LWNvdXJpZXIiLCAgICAgIG5fVVNSLCAgICAgICAgICBDTV9JTlYsCS8qIFN5bm9ueW0gZm9yIENPVVJJRVIgKi8KKyAgICAiaW50ZWwiLAkJbl9JTlRFTCwgICAgICAgIDAsCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKworICAgICJpdHUtdC12MjUwIiwgICAgICAgbl9JVFVUVjI1MCwgICAgIDAsCisgICAgIml0dS10LXYyNWJpcyIsCW5fQ0NJVFQsCTAsCS8qIE5ldyBuYW1lIGZvciBDQ0lUVCAqLworICAgICJpdHUtdC12MjV0ZXIvdjI1MCIsbl9JVFVUVjI1MCwgICAgIENNX0lOViwKKworI2lmbmRlZiBNSU5JRElBTAorICAgICJsdWNlbnQiLCAgICAgICAgICAgbl9MVUNFTlQsICAgICAgMCwKKyAgICAibWF4dGVjaCIsCQluX01BWFRFQ0gsICAgICAwLAorCisgICAgIm1lZ2FoZXJ0ei1hdHQtdjM0IiwgICAgbl9NSFpBVFQsICAwLCAvKiBNZWdhaGVydHplcyAqLworICAgICJtZWdhaGVydHoteGphY2siLCAgICAgIG5fWEpBQ0ssICAgQ01fSU5WfENNX0FCUiwKKyAgICAibWVnYWhlcnR6LXhqYWNrLTMzLjYiLCBuX1hKQUNLLCAgIDAsCisgICAgIm1lZ2FoZXJ0ei14amFjay01NmsiLCAgbl9VU1JYMiwgICAwLCAvKiAzQ09NL1VTUi9NZWdhaGVydHogMzMuNiBQQyBDYXJkICovCisKKyAgICAibWkiLAkJbl9NSUNST0NPTSwJQ01fSU5WfENNX0FCUiwKKyAgICAibWljIiwJCW5fTUlDUk9DT00sCUNNX0lOVnxDTV9BQlIsCisgICAgIm1pY3IiLAkJbl9NSUNST0NPTSwJQ01fSU5WfENNX0FCUiwKKyAgICAibWljcm8iLAkJbl9NSUNST0NPTSwJQ01fSU5WfENNX0FCUiwKKyAgICAibWljcm9jIiwJCW5fTUlDUk9DT00sCUNNX0lOVnxDTV9BQlIsCisgICAgIm1pY3JvY28iLAkJbl9NSUNST0NPTSwJQ01fSU5WfENNX0FCUiwKKyAgICAibWljcm9jb20iLAkJbl9NSUNST0NPTSwJQ01fSU5WfENNX0FCUiwKKyAgICAibWljcm9jb20tYXQtbW9kZSIsCW5fVUNPTV9BVCwJMCwgLyogTWljcm9jb20gRGVza1BvcnRlLCBldGMgKi8KKyAgICAibWljcm9jb20tc3gtbW9kZSIsCW5fTUlDUk9DT00sCTAsIC8qIE1pY3JvY29tIEFYLFFYLFNYLCBuYXRpdmUgbW9kZSAqLworICAgICJtaWNyb2xpbmsiLCAgICAgICAgbl9NSUNST0xJTkssICAgIDAsCisgICAgIm1pY3JvbGluay12MjUwIiwgICBuX1VMSU5LVjI1MCwgICAgMCwKKyAgICAibW90b3JvbGEtY29kZXgiLCAgIG5fQ09ERVgsICAgICAgICAwLAorICAgICJtb3Rvcm9sYS1mYXN0YWxrIiwgbl9NT1RPUk9MQSwJMCwKKyAgICAibW90b3JvbGEtbGlmZXN0eWxlIixuX01PVE9ST0xBLAkwLAorICAgICJtb3Rvcm9sYS1tb250YW5hIiwgbl9NT05UQU5BLAkwLAorICAgICJtb3Rvcm9sYS1zbTU2LXY5MCIsbl9NT1RTTTU2LAkwLAorICAgICJtdDU2MzR6cHgiLCAgICAgICAgbl9NVDU2MzRaUFgsICAgIDAsCisgICAgIm11bHRpdGVjaCIsCW5fTVVMVEksCTAsCisgICAgIm13YXZlIiwJCW5fTVdBVkUsCTAsCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKyAgICAibm9uZSIsICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAwLAorI2lmbmRlZiBNSU5JRElBTAorI2lmbmRlZiBPTERUQkNPREUKKyAgICAib2xkLXRlbGViaXQiLCAgICAgIG5fVEVMRUJJVCwgICAgICAwLAorI2VuZGlmIC8qIE9MRFRCQ09ERSAqLworICAgICJwY3RlbCIsICAgICAgICAgICAgbl9QQ1RFTCwgICAgICAgIDAsCisjaWZkZWYgT0xETU9ERU1TCisgICAgInBlbnJpbCIsCQluX1BFTlJJTCwJTV9PTEQsCisjZW5kaWYgLyogT0xETU9ERU1TICovCisgICAgInBwaSIsICAgICAgICAgICAgICBuX1BQSSwJCTAsCisjaWZkZWYgT0xETU9ERU1TCisgICAgInJhY2FsdmFkaWMiLAluX1JBQ0FMLAlNX09MRCwKKyNlbmRpZiAvKiBPTERNT0RFTVMgKi8KKyAgICAicm9ja3dlbGwtdjMyIiwJbl9SV1YzMiwJMCwKKyAgICAicm9ja3dlbGwtdjMyYmlzIiwJbl9SV1YzMkIsCTAsCisgICAgInJvY2t3ZWxsLXYzNCIsCW5fUldWMzQsCTAsCisgICAgInJvY2t3ZWxsLXY5MCIsCW5fUldWOTAsCTAsCisgICAgInJvbG0iLCAgICAgICAgICAgICBuX1JPTE0sCQlDTV9JTlZ8Q01fQUJSLAorICAgICJyb2xtLTI0NHBjIiwgICAgICAgbl9ST0xNQVQsICAgICAgIDAsCisgICAgInJvbG0tNjAwLXNlcmllcyIsICBuX1JPTE1BVCwgICAgICAgMCwKKyAgICAicm9sbS1kY20iLAkJbl9ST0xNLAkJMCwKKyAgICAic21hcnRsaW5rLXY5MCIsICAgIG5fVVNSLCAgICAgICAgICBNX0FMSUFTLAorICAgICJzcGlyaXQtaWkiLCAgICAgICAgbl9TUElSSVRJSSwgICAgIDAsCisgICAgInNwb3J0c3RlciIsICAgICAgICBuX1VTUiwgICAgICAgICAgTV9BTElBUywKKyAgICAic3VwIiwJICAgICAgICBuX1NVUFJBLAlDTV9JTlZ8Q01fQUJSLAorICAgICJzdXByIiwJICAgICAgICBuX1NVUFJBLAlDTV9JTlZ8Q01fQUJSLAorICAgICJzdXByYSIsCSAgICAgICAgbl9TVVBSQSwJQ01fSU5WfENNX0FCUiwKKyAgICAic3VwcmEtZXhwcmVzcy12OTAiLG5fU1VQUkFYLCAgICAgICAwLAorICAgICJzdXByYWZheG1vZGVtIiwJbl9TVVBSQSwJMCwKKyAgICAic3VwcmFzb25pYyIsCW5fU1VQUkFTT04sCTAsCisjaWZkZWYgQ0tfVEFQSQorICAgICJ0YXBpIiwJCW5fVEFQSSwJCTAsCisjZW5kaWYgLyogQ0tfVEFQSSAqLworICAgICJ0ZSIsICAgICAgICAgICAgICAgbl9UQk5FVywgICAgICAgIENNX0lOVnxDTV9BQlIsCisgICAgInRlbCIsICAgICAgICAgICAgICBuX1RCTkVXLCAgICAgICAgQ01fSU5WfENNX0FCUiwKKyAgICAidGVsZWJpdCIsICAgICAgICAgIG5fVEJORVcsICAgICAgICAwLAorICAgICJ0ZWxlcGF0aCIsICAgICAgICAgbl9URUxFUEFUSCwgICAgIENNX0lOViwKKyNlbmRpZiAvKiBNSU5JRElBTCAqLworICAgICJ1bmtub3duIiwJCW5fVU5LTk9XTiwJMCwKKyAgICAidXNlci1kZWZpbmVkIiwgICAgIG5fVURFRiwJCTAsCisjaWZuZGVmIE1JTklESUFMCisKKyAgICAidXNyIiwgICAgICAgICAgICAgICBuX1VTUiwgICAgICAgICBDTV9JTlZ8Q01fQUJSLAorICAgICJ1c3ItMjEyYSIsCQkgbl9IQVlFUywJQ01fSU5WfE1fQUxJQVMsCisgICAgInVzci1jb3VyaWVyIiwgICAgICAgbl9VU1IsICAgICAgICAgQ01fSU5WLAorICAgICJ1c3ItbWVnYWhlcnR6LTU2ayIsIG5fVVNSWDIsICAgICAgIDAsCisgICAgInVzci1zcG9ydHN0ZXIiLCAgICAgbl9VU1IsICAgICAgICAgQ01fSU5WLAorICAgICJ1c3IteGoxNTYwLXgyIiwgICAgIG5fVVNSWDIsICAgICAgIENNX0lOViwKKyAgICAidXNyb2JvdGljcyIsICAgICAgICBuX1VTUiwgICAgICAgICAwLAorCisgICAgInYyNWJpcyIsCQluX0NDSVRULAlDTV9JTlYsIC8qIE5hbWUgY2hhbmdlZCB0byBJVFUtVCAqLworI2lmZGVmIE9MRE1PREVNUworICAgICJ2ZW50ZWwiLAkJbl9WRU5URUwsCU1fT0xELAorI2VuZGlmIC8qIE9MRE1PREVNUyAqLworICAgICJ6b2x0cml4LXYzNCIsCW5fWk9MVFJJWCwJMCwKKyAgICAiem9sdHJpeC1oc3AtdjkwIiwgIG5fUENURUwsICAgICAgICBNX0FMSUFTLAorICAgICJ6b2x0cml4LWhjZi12OTAiLCAgbl9JVFVUVjI1MCwgICAgIDAsCisgICAgInpvbyIsCQluX1pPT00sCQlDTV9JTlZ8Q01fQUJSLAorICAgICJ6b29tIiwJCW5fWk9PTSwJCUNNX0lOVnxDTV9BQlIsCisgICAgInpvb20tdjMyYmlzIiwJbl9aT09NLAkJMCwKKyAgICAiem9vbS12MzQiLAkJbl9aT09NVjM0LAkwLAorICAgICJ6b29tLXY5MCIsCQluX1pPT01WOTAsCTAsCisgICAgInpvb20tdjkyIiwJCW5fWk9PTVY5MiwJMCwKKyAgICAienl4ZWwiLAkJbl9aWVhFTCwJMCwKKyNlbmRpZiAvKiBNSU5JRElBTCAqLworICAgICIiLCAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIDAKK307CitpbnQgbm1kbSA9IChzaXplb2YobWRtdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOyAvKiBOdW1iZXIgb2YgbW9kZW1zICovCisKKyNkZWZpbmUgQ09OTkVDVEVEIDEJCQkvKiBGb3IgY29tcGxldGlvbiBzdGF0dXMgKi8KKyNkZWZpbmUgRF9GQUlMRUQgIDIKKyNkZWZpbmUgRF9QQVJUSUFMIDMKKworc3RhdGljIGludCB0cmllcyA9IDA7CitzdGF0aWMgaW50IG1kbWVjaG8gPSAwOwkJCS8qIEFzc3VtZSBtb2RlbSBkb2VzIG5vdCBlY2hvICovCisKK3N0YXRpYyBjaGFyICpwOwkJCQkvKiBGb3IgY29tbWFuZCBzdHJpbmdzICYgbWVzc2FnZXMgKi8KKworI2RlZmluZSBMQlVGTCAyMDAKK3N0YXRpYyBjaGFyIGxidWZbTEJVRkwrNF07CitjaGFyIG1vZGVtbXNnW0xCVUZMKzRdID0geyBOVUwsIE5VTCB9OwkvKiBESUFMIHJlc3BvbnNlIGZyb20gbW9kZW0gKi8KKworI2lmZGVmIERZTkFNSUMKKyNkZWZpbmUgUkJVRkwgMjU2CitzdGF0aWMgY2hhciAqcmJ1ZiA9IE5VTEw7CisjZWxzZQorI2RlZmluZSBSQlVGTCA2Mworc3RhdGljIGNoYXIgcmJ1ZltSQlVGTCsxXTsKKyNlbmRpZiAvKiBEWU5BTUlDICovCisKKyNpZmRlZiBEWU5BTUlDCisjZGVmaW5lIEZVTExOVU1MIDI1NgorY2hhciAqZmJ1ZiA9IE5VTEw7CQkJLyogRm9yIGZ1bGwgKHByZWZpeGVkKSBwaG9uZSBudW1iZXIgKi8KKyNlbHNlCisjZGVmaW5lIEZVTExOVU1MIDEwMAorY2hhciBmYnVmW0ZVTExOVU1MXTsKKyNlbmRpZiAvKiBEWU5BTUlDICovCisKK3N0YXRpYyBja2ptcGJ1ZiBzamJ1ZjsKKworI2lmZGVmIENLX0FOU0lDCitzdGF0aWMgU0lHVFlQICgqc2F2YWxybSkoaW50KTsJLyogRm9yIHNhdmluZyBhbGFybSBoYW5kbGVyICovCitzdGF0aWMgU0lHVFlQICgqc2F2aW50KShpbnQpOwkvKiBGb3Igc2F2aW5nIGludGVycnVwdCBoYW5kbGVyICovCisjZWxzZQorc3RhdGljIFNJR1RZUCAoKnNhdmFscm0pKCk7CS8qIEZvciBzYXZpbmcgYWxhcm0gaGFuZGxlciAqLworc3RhdGljIFNJR1RZUCAoKnNhdmludCkoKTsJLyogRm9yIHNhdmluZyBpbnRlcnJ1cHQgaGFuZGxlciAqLworI2VuZGlmIC8qIENLX0FOU0lDICovCisKKyNpZmRlZiBDS0xPR0RJQUwKK3N0YXRpYyBWT0lECitkb2xvZ2RpYWwocykgY2hhciAqczsgeworICAgIGNoYXIgYnVmMlsxNl07CisgICAgY2hhciAqIHIgPSBOVUxMOworICAgIGludCB4LCBtLCBuOworICAgIGV4dGVybiBjaGFyIGN4bG9nYnVmW10sIHVpZGJ1ZltdLCBteWhvc3RbXTsKKworICAgIGlmICghcykgcyA9ICIiOworICAgIGlmICgoeCA9IHN0cmxlbihzKSkgPiAwKSB7CQkvKiBSZXBsYWNlIHNwYWNlcyBieSB1bmRlcnNjb3JlcyAqLworCXIgPSAoY2hhciAqKW1hbGxvYyh4KzEpOworCWlmIChyKSB7CisJICAgIGludCBpOworCSAgICBmb3IgKGkgPSAwOyBpIDw9IHg7IGkrKykgeworCQlpZiAoc1tpXSAhPSAwICYmIHNbaV0gPD0gU1ApCisJCSAgcltpXSA9ICdfJzsKKwkJZWxzZQorCQkgIHJbaV0gPSBzW2ldOworCSAgICB9CisJICAgIHMgPSByOworCX0KKyAgICB9CisgICAgcCA9IGNrZGF0ZSgpOworICAgIG4gPSBja3N0cm5jcHkoY3hsb2didWYscCxDWExPR0JVRkwpOworICAgIGlmICghdWlkYnVmWzBdKSB7CisJZGVidWcoRjEwMCwiZG9sb2dkaWFsIHVpZGJ1ZiBlbXB0eSIsIiIsMCk7CisJY2tzdHJuY3B5KHVpZGJ1ZiwoY2hhciAqKXdob2FtaSgpLFVJREJVRkxFTik7CisgICAgfQorICAgIG0gPSBzdHJsZW4odWlkYnVmKStzdHJsZW4obXlob3N0KStzdHJsZW4odHRuYW1lKStzdHJsZW4ocykrc3RybGVuKGJ1ZjIpKzMyOworICAgIGlmIChuK20gPCBDWExPR0JVRkwtMSkgeworCXAgPSBjeGxvZ2J1ZituOworCWlmIChkaWFsbGNjICYmIGRpYWxsYWMpIHsKKwkgICAgYnVmMlswXSA9ICcrJzsKKwkgICAgY2ttYWttc2coJmJ1ZjJbMV0sMTUsZGlhbGxjYywiKCIsZGlhbGxhYywiKSIpOworCX0gZWxzZSB7CisJICAgIGNrc3RybmNweShidWYyLCJVbmtub3duIiwxNik7CisJfQorCXNwcmludGYocCwiICVzICVzIFQ9RElBTCBIPSVzIEQ9JXMgTj0lcyBPPSVzICIsCS8qIHNhZmUgKHByZWNoZWNrZWQpICovCisJCXVpZGJ1ZiwKKwkJY2tnZXRwaWQoKSwKKwkJbXlob3N0LAorCQl0dG5hbWUsCisJCXMsCisJCWJ1ZjIKKwkJKTsKKwlkZWJ1ZyhGMTEwLCJkb2xvZ2RpYWwgY3hsb2didWYiLGN4bG9nYnVmLDApOworICAgIH0gZWxzZQorICAgICAgc3ByaW50ZihwLCJMT0dESUFMIEJVRkZFUiBPVkVSRkxPVyIpOworICAgIGlmIChyKSBmcmVlKHIpOworfQorI2VuZGlmIC8qIENLTE9HRElBTCAqLworCisjaWZuZGVmIE1JTklESUFMCisKKyNpZmRlZiBDT01NRU5UCitzdGF0aWMgVk9JRAoreGNweSh0byxmcm9tLGxlbikJCS8qIENvcHkgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyAqLworICAgIHJlZ2lzdGVyIGNoYXIgKnRvLCAqZnJvbTsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGVuOyB7CisJd2hpbGUgKGxlbi0tKSAqdG8rKyA9ICpmcm9tKys7Cit9CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIE1JTklESUFMICovCisKK3N0YXRpYyBTSUdUWVAKKyNpZmRlZiBDS19BTlNJQworZGlhbHRpbWUoaW50IGZvbykJCQkvKiBUaW1lciBpbnRlcnJ1cHQgaGFuZGxlciAqLworI2Vsc2UKK2RpYWx0aW1lKGZvbykgaW50IGZvbzsJCQkvKiBUaW1lciBpbnRlcnJ1cHQgaGFuZGxlciAqLworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBkaWFsdGltZSAqLyB7CisKKyAgICBmYWlsX2NvZGUgPSBGX1RJTUU7CQkJLyogRmFpbHVyZSByZWFzb24gPSB0aW1lb3V0ICovCisgICAgZGVidWcoRjEwMCwiZGlhbHRpbWUgY2F1Z2h0IFNJR0FMUk0iLCIiLDApOworI2lmZGVmIEJFQk9YCisjaWZkZWYgQkVfRFJfNworICAgIGFsYXJtX2V4cGlyZWQoKTsKKyNlbmRpZiAvKiBCRV9EUl83ICovCisjZW5kaWYgLyogQkVCT1ggKi8KKyNpZmRlZiBPUzIKKyAgICBzaWduYWwoU0lHQUxSTSwgZGlhbHRpbWUpOworI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIF9fRU1YX18KKyAgICBzaWduYWwoU0lHQUxSTSwgU0lHX0FDSyk7CQkvKiBOZWVkZWQgZm9yIE9TLzIgKi8KKyNlbmRpZiAvKiBfX0VNWF9fICovCisKKyNpZmRlZiBPU0sJCQkJLyogT1MtOSAqLworLyoKKyAgV2UgYXJlIGluIGFuIGludGVyY2VwdCByb3V0aW5lIGJ1dCBkbyBub3QgcGVyZm9ybSBhIEYkUlRFIChkb25lIGltcGxpY2l0bHkKKyAgYnkgUlRTKSwgc28gd2UgaGF2ZSB0byBkZWNyZW1lbnQgdGhlIHNpZ21hc2sgYXMgRiRSVEUgZG9lcy4gIFdhcm5pbmc6CisgIGxvbmdqdW1wIG9ubHkgcmVzdG9yZXMgdGhlIENQVSByZWdpc3RlcnMsIE5PVCB0aGUgRlBVIHJlZ2lzdGVycy4gIFNvLCBkb24ndAorICB1c2UgRlBVIGF0IGFsbCBvciBhdCBsZWFzdCBkb24ndCB1c2UgY29tbW9uIEZQVSAoZG91YmxlIG9yIGZsb2F0KSByZWdpc3RlcgorICB2YXJpYWJsZXMuCisqLworICAgIHNpZ21hc2soLTEpOworI2VuZGlmIC8qIE9TSyAqLworCisjaWZkZWYgTlRTSUcKKyAgICBpZiAoZm9vID09IFNJR0FMUk0pCisgICAgICBQb3N0QWxhcm1TaWdTZW0oKTsKKyAgICBlbHNlCisgICAgICBQb3N0Q3RybENTZW0oKTsKKyNlbHNlIC8qIE5UU0lHICovCisjaWZkZWYgTlQKKyAgICBja2xvbmdqbXAoY2tqYWRkcihzamJ1ZiksMSk7CisjZWxzZSAvKiBOVCAqLworICAgIGNrbG9uZ2ptcChzamJ1ZiwxKTsKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIE5UU0lHICovCisgICAgLyogTk9UUkVBQ0hFRCAqLworICAgIFNJR1JFVFVSTjsKK30KKworc3RhdGljIFNJR1RZUAorI2lmZGVmIENLX0FOU0lDCitkaWFsaW50KGludCBmb28pCQkJLyogS2V5Ym9hcmQgaW50ZXJydXB0IGhhbmRsZXIgKi8KKyNlbHNlCitkaWFsaW50KGZvbykgaW50IGZvbzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogZGlhbGludCAqLyB7CisgICAgZmFpbF9jb2RlID0gRl9JTlQ7CisgICAgZGVidWcoRjEwMCwiZGlhbGludCBjYXVnaHQgU0lHSU5UIiwiIiwwKTsKKyNpZmRlZiBPUzIKKyAgICBzaWduYWwoU0lHSU5ULCBkaWFsaW50KTsKKyAgICBkZWJ1ZyhGMTAwLCJkaWFsaW50KCkgU0lHSU5UIGNhdWdodCAtLSBkaWFsaW50IHJlc3RvcmVkIiwiIiwwKSA7CisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgX19FTVhfXworICAgIHNpZ25hbChTSUdJTlQsIFNJR19BQ0spOwkJLyogTmVlZGVkIGZvciBPUy8yICovCisjZW5kaWYgLyogX19FTVhfXyAqLworI2lmZGVmIE9TSwkJCQkvKiBPUy05LCBzZWUgY29tbWVudCBpbiBkaWFsdGltZSgpICovCisgICAgc2lnbWFzaygtMSk7CisjZW5kaWYgLyogT1NLICovCisjaWZkZWYgTlRTSUcKKyAgICBQb3N0Q3RybENTZW0oKSA7CisjaWZkZWYgQ0tfVEFQSQorICAgIFBvc3RUQVBJQ29ubmVjdFNlbSgpOworICAgIFBvc3RUQVBJQW5zd2VyU2VtKCk7CisjZW5kaWYgLyogQ0tfVEFQSSAqLworI2Vsc2UgLyogTlRTSUcgKi8KKyNpZmRlZiBOVAorICAgIGNrbG9uZ2ptcChja2phZGRyKHNqYnVmKSwxKTsKKyNlbHNlIC8qIE5UICovCisgICAgY2tsb25nam1wKHNqYnVmLDEpOworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogTlQgKi8KKyAgICBTSUdSRVRVUk47Cit9CisKKy8qCisgIFJvdXRpbmUgdG8gcmVhZCBhIGNoYXJhY3RlciBmcm9tIGNvbW11bmljYXRpb24gZGV2aWNlLCBoYW5kbGluZyBURUxORVQKKyAgcHJvdG9jb2wgbmVnb3RpYXRpb25zIGluIGNhc2Ugd2UncmUgY29ubmVjdGVkIHRvIHRoZSBtb2RlbSB0aHJvdWdoIGEKKyAgVENQL0lQIFRFTE5FVCBtb2RlbSBzZXJ2ZXIuCisqLworc3RhdGljIGludAorZGRpbmMobikgaW50IG47IHsKKyNpZmRlZiBUTkNPREUKKyAgICBpbnQgYyA9IDA7CisgICAgaW50IGRvbmUgPSAwOworICAgIGRlYnVnKEYxMDEsImRkaW5jIGVudHJ5IG4iLCIiLG4pOworICAgIHdoaWxlICghZG9uZSkgeworCWMgPSB0dGluYyhuKTsKKwkvKiBkZWJ1ZyhGMDAwLCJkZGluYyIsIiIsYyk7ICovCisJaWYgKGMgPCAwKSByZXR1cm4oYyk7CisjaWZuZGVmIE9TMgorCWlmICgoYyA9PSBJQUMpICYmIG5ldHdvcmsgJiYgSVNfVEVMTkVUKCkpIHsKKwkgICAgc3dpdGNoICh0bl9kb29wKChDSEFSKShjICYgMHhmZiksZHVwbGV4LHR0aW5jKSkgeworCSAgICAgIGNhc2UgMjogZHVwbGV4ID0gMDsgY29udGludWU7CisJICAgICAgY2FzZSAxOiBkdXBsZXggPSAxOworCSAgICAgIGRlZmF1bHQ6IGNvbnRpbnVlOworCSAgICB9CisJfSBlbHNlIGRvbmUgPSAxOworI2Vsc2UgLyogT1MyICovCisJZG9uZSA9ICEoYyA9PSBJQUMgJiYgbmV0d29yayAmJiBJU19URUxORVQoKSk7CisJc2NyaXB0d3J0YnVmKGMpOwkvKiBURUxORVQgbmVnb3RpYXRpb25zIGhhbmRsZWQgYnkgZW11bGF0b3IgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB9CisgICAgcmV0dXJuKGMgJiAweGZmKTsKKyNlbHNlICAvKiBUTkNPREUgKi8KKyAgICByZXR1cm4odHRpbmMobikpOworI2VuZGlmIC8qIFROQ09ERSAqLworfQorCitzdGF0aWMgVk9JRAordHRzbG93KHMsbWlsbGlzZWMpIGNoYXIgKnM7IGludCBtaWxsaXNlYzsgeyAvKiBPdXRwdXQgcy1sLW8tdy1sLXkgKi8KKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICBleHRlcm4gaW50IHRuX25sbSwgdG5fYl9ubG07CisjZW5kaWYgLyogVENQU09DS0VUICovCisgICAgZGVidWcoRjExMSwidHRzbG93IixzLG1pbGxpc2VjKTsKKyAgICBpZiAoZGlhbGRweSAmJiAoZHVwbGV4IHx8ICFtZG1lY2hvKSkgeyAvKiBFY2hvIHRoZSBjb21tYW5kIGluIGNhc2UgbW9kZW0gKi8KKwlwcmludGYoIiVzXG4iLHMpOwkJLyogaXNuJ3QgZWNob2luZyBjb21tYW5kcy4gKi8KKyNpZmRlZiBPUzIKKwl7CisJICAgIGNoYXIgKnMyID0gczsJCS8qIEVjaG8gdG8gZW11bGF0b3IgKi8KKwkgICAgd2hpbGUgKCpzMikgeworCQlzY3JpcHR3cnRidWYoKFVTSE9SVCkqczIrKyk7CisJICAgIH0KKwkgICAgc2NyaXB0d3J0YnVmKChVU0hPUlQpQ1IpOworCSAgICBzY3JpcHR3cnRidWYoKFVTSE9SVClMRik7CisJfQorI2VuZGlmIC8qIE9TMiAqLworICAgIH0KKyAgICBmb3IgKDsgKnM7IHMrKykgeworCXR0b2MoKnMpOworI2lmZGVmIFRDUFNPQ0tFVAorCWlmICgqcyA9PSBDUiAmJiBuZXR3b3JrICYmIElTX1RFTE5FVCgpKSB7CisJICAgIGlmICghVEVMT1BUX01FKFRFTE9QVF9CSU5BUlkpICYmIHRuX25sbSAhPSBUTkxfQ1IpCisJICAgICAgdHRvYygoY2hhcikoKHRuX25sbSA9PSBUTkxfQ1JMRikgPyBMRiA6IE5VTCkpOworCSAgICBlbHNlIGlmIChURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkgJiYKKwkJICAgICAodG5fYl9ubG0gPT0gVE5MX0NSTEYgfHwgdG5fYl9ubG0gPT0gVE5MX0NSTlVMKSkKKwkgICAgICB0dG9jKChjaGFyKSgodG5fYl9ubG0gPT0gVE5MX0NSTEYpID8gTEYgOiBOVUwpKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCWlmIChtaWxsaXNlYyA+IDApCisJICBtc2xlZXAobWlsbGlzZWMpOworICAgIH0KK30KKworLyoKKyAqIFdhaXQgZm9yIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMuCisgKgorICogVGhlIGNoYXJhY3RlcnMgYXJlIHdhaXRlZCBmb3IgaW5kaXZpZHVhbGx5LCBhbmQgb3RoZXIgY2hhcmFjdGVycyBtYXkKKyAqIGJlIHJlY2VpdmVkICJpbiBiZXR3ZWVuIi4gIFRoaXMgbWVyZWx5IGd1YXJhbnRlZXMgdGhhdCB0aGUgY2hhcmFjdGVycworICogQVJFIHJlY2VpdmVkLCBhbmQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4KKyAqLworc3RhdGljIFZPSUQKK3dhaXRmb3IocykgY2hhciAqczsgeworICAgIENIQVIgYywgeDsKKyAgICB3aGlsZSAoKGMgPSAqcysrKSkgewkJLyogd2hpbGUgbW9yZSBjaGFyYWN0ZXJzIHJlbWFpbi4uLiAqLworCWRvIHsJCQkJLyogd2FpdCBmb3IgdGhlIGNoYXJhY3RlciAqLworCSAgICB4ID0gKENIQVIpIChkZGluYygwKSAmIDAxNzcpOworCSAgICBkZWJ1ZyhGMDAwLCJkaWFsIHdhaXRmb3IgZ290IiwiIix4KTsKKwkgICAgaWYgKGRpYWxkcHkpIHsKKwkJaWYgKHggIT0gTEYpIGNvbm9jKHgpOworCQlpZiAoeCA9PSBDUikgY29ub2MoTEYpOworCSAgICB9CisJfSB3aGlsZSAoeCAhPSBjKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2RpZHdlZ2V0KHMscikgY2hhciAqcywgKnI7IHsJLyogTG9va3MgaW4gc3RyaW5nIHMgZm9yIHJlc3BvbnNlIHIgKi8KKyAgICBpbnQgbHIgPSAoaW50KXN0cmxlbihyKTsJLyogIDAgbWVhbnMgbm90IGZvdW5kLCAxIG1lYW5zIGZvdW5kIGl0ICovCisgICAgaW50IGk7CisgICAgZGVidWcoRjExMCwiZGlkd2VnZXQiLHIsMCk7CisgICAgZGVidWcoRjExMCwiIGluIixzLDApOworICAgIGZvciAoaSA9IChpbnQpc3RybGVuKHMpLWxyOyBpID49IDA7IGktLSkKKwlpZiAoIHNbaV0gPT0gclswXSApIGlmICggIXN0cm5jbXAocytpLHIsbHIpICkgcmV0dXJuKCAxICk7CisgICAgcmV0dXJuKCAwICk7Cit9CisKKworLyogUiBFIFMgRSBUIC0tIFJlc2V0IGFsYXJtcywgZXRjLiBvbiBleGl0LiAqLworCitzdGF0aWMgVk9JRAorZHJlc2V0KCkgeworICAgIGRlYnVnKEYxMDAsImRyZXNldCByZXNldHRpbmcgYWxhcm0gYW5kIHNpZ25hbCBoYW5kbGVycyIsIiIsMCk7CisgICAgYWxhcm0oMCk7CisgICAgc2lnbmFsKFNJR0FMUk0sc2F2YWxybSk7CQkvKiByZXN0b3JlIGFsYXJtIGhhbmRsZXIgKi8KKyAgICBzaWduYWwoU0lHSU5ULHNhdmludCk7CQkvKiByZXN0b3JlIGludGVycnVwdCBoYW5kbGVyICovCisgICAgZGVidWcoRjEwMCwiZHJlc2V0IGFsYXJtIGFuZCBzaWduYWwgaGFuZGxlcnMgcmVzZXQiLCIiLDApOworfQorCisvKgorICBDYWxsIHRoaXMgcm91dGluZSB3aGVuIHRoZSBtb2RlbSByZXBvcnRzIHRoYXQgaXQgaGFzIGNvbm5lY3RlZCBhdCBhIGNlcnRhaW4KKyAgc3BlZWQsIGdpdmluZyB0aGF0IHNwZWVkIGFzIHRoZSBhcmd1bWVudC4gIElmIHRoZSBjb25uZWN0aW9uIHNwZWVkIGlzIG5vdAorICB0aGUgc2FtZSBhcyBLZXJtaXQncyBjdXJyZW50IGNvbW11bmljYXRpb24gc3BlZWQsIEFORCB0aGUgbW9kZW0gaW50ZXJmYWNlCisgIHNwZWVkIGlzIG5vdCBsb2NrZWQgKGkuZS4gRElBTCBTUEVFRC1NQVRDSElORyBpcyBub3QgT04pLCB0aGVuIGNoYW5nZSB0aGUKKyAgZGV2aWNlIHNwZWVkIHRvIHRoZSBvbmUgZ2l2ZW4uCisqLworc3RhdGljIFZPSUQKKyNpZmRlZiBDS19BTlNJQworc3BkY2hnKGxvbmcgcykKKyNlbHNlCitzcGRjaGcocykgbG9uZyBzOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBzcGRjaGcgKi8geworICAgIGludCBzMjsKKyAgICBpZiAoIW1kbXNwZCkJCQkvKiBJZiBtb2RlbSBpbnRlcmZhY2Ugc3BlZWQgbG9ja2VkLCAqLworICAgICAgcmV0dXJuOwkJCQkvKiAgZG9uJ3QgZG8gdGhpcy4gKi8KKyAgICBpZiAoc3BlZWQgIT0gcykgewkJCS8qIFNwZWVkcyBkaWZmZXI/ICovCisJczIgPSBzIC8gMTBMOwkJCS8qIENvbnZlcnQgdG8gY3BzIGV4cHJlc3NlZCBhcyBpbnQgKi8KKwlpZiAodHRzc3BkKHMyKSA8IDApIHsJCS8qIENoYW5nZSBzcGVlZC4gKi8KKwkgICAgcHJpbnRmKCIgV0FSTklORyAtIHNwZWVkIGNoYW5nZSB0byAlbGQgZmFpbGVkLlxyXG4iLHMpOworCX0gZWxzZSB7CisJICAgIHByaW50ZigiIFNwZWVkIGNoYW5nZWQgdG8gJWxkLlxyXG4iLHMpOworCSAgICBzcGVlZCA9IHM7CQkJLyogVXBkYXRlIGdsb2JhbCBzcGVlZCB2YXJpYWJsZSAqLworCX0KKyAgICB9Cit9CisKKy8qCisgIERpc3BsYXkgYWxsIGNoYXJhY3RlcnMgcmVjZWl2ZWQgZnJvbSBtb2RlbSBkaWFsZXIgdGhyb3VnaCB0aGlzIHJvdXRpbmUsCisgIGZvciBjb25zaXN0ZW50IGhhbmRsaW5nIG9mIGNhcnJpYWdlIHJldHVybnMgYW5kIGxpbmVmZWVkcy4KKyovCitzdGF0aWMgVk9JRAorI2lmZGVmIENLX0FOU0lDCitkaWFsb2MoY2hhciBjKQorI2Vsc2UKK2RpYWxvYyhjKSBjaGFyIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogZGlhbG9jICovCQkJCS8qIERpYWwgT3V0cHV0IENoYXJhY3RlciAqLworICAgIGlmIChkaWFsZHB5KSB7CisJaWYgKGMgIT0gTEYpIGNvbm9jKGMpOwkJLyogRG9uJ3QgZWNobyBMRiAqLworCWlmIChjID09IENSKSBjb25vYyhMRik7CQkvKiBFY2hvIENSIGFzIENSTEYgKi8KKyAgICB9Cit9CisKKyNpZm5kZWYgTk9TUEwKK2NoYXIgKgorZ2V0ZG0oeCkgaW50IHg7IHsJCQkvKiBSZXR1cm4gZGlhbCBtb2RpZmllciAqLworICAgIE1ETUlORiAqIG1wOworICAgIGludCBtOworICAgIGludCBpc2hheWVzID0gMDsKKyAgICBtID0gbWRtdHlwOworICAgIGlmIChtIDwgMSkKKyAgICAgIGlmIChtZG1zYXYgPiAtMSkKKwltID0gbWRtc2F2OworICAgIGlmIChtIDwgMSkKKyAgICAgIHJldHVybigiIik7CisjaWZuZGVmIE1JTklESUFMCisgICAgaWYgKG0gPT0gbl9UQVBJKQorICAgICAgbSA9IG5fSEFZRVM7CisjZW5kaWYgLyogTUlOSURJQUwgKi8KKyAgICBtcCA9IG1vZGVtcFttXTsKKyAgICBpc2hheWVzID0gKGRpYWxjYXBhcyA/IGRpYWxjYXBhcyA6IG1wLT5jYXBhcykgJiBDS0RfQVQ7CisgICAgc3dpdGNoICh4KSB7CisgICAgICBjYXNlIFZOX0RNX0xQOgorCXJldHVybihpc2hheWVzID8gIiwiIDogIiIpOworICAgICAgY2FzZSBWTl9ETV9TUDoKKyNpZmRlZiBNSU5JRElBTAorCXJldHVybigiIik7CisjZWxzZQorCXJldHVybihtID09IG5fVVNSID8gIi8iIDogIiIpOworI2VuZGlmIC8qIE1JTklESUFMICovCisgICAgICBjYXNlIFZOX0RNX1BEOgorCXJldHVybihpc2hheWVzID8gIlAiIDogIiIpOworICAgICAgY2FzZSBWTl9ETV9URDoKKwlyZXR1cm4oaXNoYXllcyA/ICJUIiA6ICIiKTsKKyAgICAgIGNhc2UgVk5fRE1fV0E6CisJcmV0dXJuKGlzaGF5ZXMgPyAiQCIgOiAiIik7CisgICAgICBjYXNlIFZOX0RNX1dEOgorCXJldHVybihpc2hheWVzID8gIlciIDogIiIpOworICAgICAgY2FzZSBWTl9ETV9SQzoKKwlyZXR1cm4oaXNoYXllcyA/ICI7IiA6ICIiKTsKKyAgICAgIGNhc2UgVk5fRE1fSEY6CisJcmV0dXJuKGlzaGF5ZXMgPyAiISIgOiAiIik7CisgICAgICBjYXNlIFZOX0RNX1dCOgorCXJldHVybihpc2hheWVzID8gIiQiIDogIiIpOworICAgIH0KKyAgICByZXR1cm4oIiIpOworfQorI2VuZGlmIC8qIE5PU1BMICovCisKK3N0YXRpYyBWT0lECitnZXRkaWFsbXRoKCkgeworICAgIGlmIChkaWFsbWF1dG8gJiYgZGlhbGxjYykgewkJLyogSWYgRElBTCBNRVRIT0QgQVVUTy4uLiAqLworCWludCBpOwkJCQkvKiBhbmQgd2Uga25vdyBvdXIgYXJlYSBjb2RlLi4uICovCisJZm9yIChpID0gMDsgaSA8IG5kaWFsdG9jYzsgaSsrKSB7IC8qIEZpcnN0IGNoZWNrIFRvbmUgY291bnRyaWVzIGxpc3QgKi8KKwkgICAgaWYgKCFzdHJjbXAoZGlhbHRvY2NbaV0sZGlhbGxjYykpIHsKKwkJZGlhbG10aCA9IFhZRE1fVDsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJZm9yIChpID0gMDsgaSA8IG5kaWFscHVjYzsgaSsrKSB7IC8qIFRoZW4gUHVsc2UgY291bnRyaWVzIGxpc3QgKi8KKwkgICAgaWYgKCFzdHJjbXAoZGlhbHB1Y2NbaV0sZGlhbGxjYykpIHsKKwkJZGlhbG10aCA9IFhZRE1fUDsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorfQorCitWT0lECQkJCS8qIEdldCBkaWFsaW5nIGRlZmF1bHRzIGZyb20gZW52aXJvbm1lbnQgKi8KK2dldGRpYWxlbnYoKSB7CisgICAgY2hhciAqcCA9IE5VTEw7CisgICAgaW50IGksIHg7CisKKyAgICBtYWtlc3RyKCZwLGdldGVudigiS19ESUFMX0RJUkVDVE9SWSIpKTsKKyAgICBpZiAocCkgeworCWludCBpOworCXh3b3JkcyhwLChNQVhERElSIC0gMiksZGlhbGRpciwwKTsKKwlmb3IgKGkgPSAwOyBpIDwgKE1BWERESVIgLSAxKTsgaSsrKSB7CisJICAgIGlmICghZGlhbGRpcltpKzFdKQorCSAgICAgIGJyZWFrOworCSAgICBlbHNlCisJICAgICAgZGlhbGRpcltpXSA9IGRpYWxkaXJbaSsxXTsKKwl9CisJbmRpYWxkaXIgPSBpOworICAgIH0KKyAgICB4bWFrZXN0cigmZGlhbGxjYyxnZXRlbnYoIktfQ09VTlRSWUNPREUiKSk7IC8qIE15IGNvdW50cnkgY29kZSAqLworICAgIHhtYWtlc3RyKCZkaWFsaXhwLGdldGVudigiS19MRF9QUkVGSVgiKSk7ICAgLyogTXkgbG9uZy1kaXN0YW5jZSBwcmVmaXggKi8KKyAgICB4bWFrZXN0cigmZGlhbGxkcCxnZXRlbnYoIktfSU5UTF9QUkVGSVgiKSk7IC8qIE15IGludGVybmF0aW9uYWwgcHJlZml4ICovCisgICAgeG1ha2VzdHIoJmRpYWxsZHAsZ2V0ZW52KCJLX1RGX1BSRUZJWCIpKTsgICAvKiBOeSBUb2xsLWZyZWUgcHJlZml4ICovCisKKyNpZm5kZWYgTk9JQ1AKKyAgICBwID0gZ2V0ZW52KCJLX0RJQUxfTUVUSE9EIik7CS8qIExvY2FsIGRpYWwgbWV0aG9kICovCisgICAgaWYgKHApIGlmICgqcCkgeworCWV4dGVybiBzdHJ1Y3Qga2V5dGFiIGRpYWxfbVtdOworCWV4dGVybiBpbnQgbmRpYWxfbTsKKwlpID0gbG9va3VwKGRpYWxfbSxwLG5kaWFsX20sJngpOworCWlmIChpID4gLTEpIHsKKwkgICAgaWYgKGkgPT0gWFlETV9BKSB7CisJCWRpYWxtYXV0byA9IDE7CisJCWRpYWxtdGggPSBYWURNX0Q7CisJICAgIH0gZWxzZSB7CisJCWRpYWxtYXV0byA9IDA7CisJCWRpYWxtdGggPSBpOworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZiAvKiBOT0lDUCAqLworCisgICAgcCA9IE5VTEw7CisgICAgeG1ha2VzdHIoJnAsZ2V0ZW52KCJLX1RGX0FSRUFDT0RFIikpOyAvKiBUb2xsLWZyZWUgYXJlYWNvZGVzICovCisgICAgaWYgKHApIHsKKwlpbnQgaTsKKwl4d29yZHMocCw3LGRpYWx0ZmMsMCk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCSAgICBpZiAoIWRpYWx0ZmNbaSsxXSkKKwkgICAgICBicmVhazsKKwkgICAgZWxzZQorCSAgICAgIGRpYWx0ZmNbaV0gPSBkaWFsdGZjW2krMV07CisJfQorCW50b2xsZnJlZSA9IGk7CisJZnJlZShwKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IE1BWFRQQ0M7IGkrKykgewkvKiBDbGVhciBUb25lL1B1bHNlIGNvdW50cnkgbGlzdHMgKi8KKwlkaWFsdG9jY1tpXSA9IE5VTEw7CisJZGlhbHB1Y2NbaV0gPSBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYVFBDQzsgaSsrKSB7CS8qIEluaXQgVG9uZSBjb3VudHJ5IGxpc3QgKi8KKwlpZiAodG9uZWNjW2ldKQorCSAgbWFrZXN0cigmKGRpYWx0b2NjW2ldKSx0b25lY2NbaV0pOworCWVsc2UKKwkgIGJyZWFrOworICAgIH0KKyAgICBuZGlhbHRvY2MgPSBpOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhUUENDOyBpKyspIHsJLyogSW5pdCBQdWxzZSBjb3VudHJ5IGxpc3QgKi8KKwlpZiAocHVsc2VjY1tpXSkKKwkgIG1ha2VzdHIoJihkaWFscHVjY1tpXSkscHVsc2VjY1tpXSk7CisJZWxzZQorCSAgYnJlYWs7CisgICAgfQorICAgIG5kaWFscHVjYyA9IGk7CisKKyAgICBpZiAoZGlhbGxjYykgewkJCS8qIEhhdmUgY291bnRyeSBjb2RlICovCisJaWYgKCFzdHJjbXAoZGlhbGxjYywiMSIpKSB7CS8qIElmIGl0J3MgMSAqLworCSAgICBpZiAoIWRpYWxsZHApCQkvKiBTZXQgdGhlc2UgcHJlZml4ZXMuLi4gKi8KKwkgICAgICBtYWtlc3RyKCZkaWFsbGRwLCIxIik7CisJICAgIGlmICghZGlhbHRmcCkKKwkgICAgICBtYWtlc3RyKCZkaWFsdGZwLCIxIik7CisJICAgIGlmICghZGlhbGl4cCkKKwkgICAgICBtYWtlc3RyKCZkaWFsaXhwLCIwMTEiKTsKKwkgICAgaWYgKG50b2xsZnJlZSA9PSAwKSB7CS8qIFRvbGwtZnJlZSBhcmVhIGNvZGVzICovCisJCWlmICgoZGlhbHRmY1swXSA9IG1hbGxvYyg0KSkpIHsKKwkJICAgIGNrc3RybmNweShkaWFsdGZjWzBdLCI4MDAiLDQpOyAvKiAxOTcwLXNvbWV0aGluZyAqLworCQkgICAgbnRvbGxmcmVlKys7CisJCSAgICBpZiAoKGRpYWx0ZmNbMV0gPSBtYWxsb2MoNCkpKSB7CisJCQlja3N0cm5jcHkoZGlhbHRmY1sxXSwiODg4Iiw0KTsgLyogMTk5NiAqLworCQkJbnRvbGxmcmVlKys7CisJCQlpZiAoKGRpYWx0ZmNbMl0gPSBtYWxsb2MoNCkpKSB7CisJCQkgICAgY2tzdHJuY3B5KGRpYWx0ZmNbMl0sIjg3NyIsNCk7IC8qIDUgQXByaWwgMTk5OCAqLworCQkJICAgIG50b2xsZnJlZSsrOworCQkJICAgIGlmICgoZGlhbHRmY1szXSA9IG1hbGxvYyg0KSkpIHsKKwkJCQlja3N0cm5jcHkoZGlhbHRmY1szXSwiODY2Iiw0KTsgLyogMjAwMD8gKi8KKwkJCQludG9sbGZyZWUrKzsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoIXN0cmNtcChkaWFsbGNjLCIzNTgiKSAmJgorCQkgICAoKGludCkgc3RyY21wKHp6bmRhdGUoKSwiMTk5NjEwMTEiKSA+IDApCisJCSAgICkgewkJCS8qIEZpbmxhbmQgKi8KKwkgICAgaWYgKCFkaWFsbGRwKQkJLyogTG9uZy1kaXN0YW5jZSBwcmVmaXggKi8KKwkgICAgICBtYWtlc3RyKCZkaWFsbGRwLCI5Iik7CisJICAgIGlmICghZGlhbGl4cCkgCQkvKiBJbnRlcm5hdGlvbmFsIGRpYWxpbmcgcHJlZml4ICovCisJICAgICAgbWFrZXN0cigmZGlhbGl4cCwiOTkwIik7CisJfSBlbHNlIHsJCQkvKiBOb3QgTkFOUCBvciBGaW5sYW5kICovCisJICAgIGlmICghZGlhbGxkcCkKKwkgICAgICBtYWtlc3RyKCZkaWFsbGRwLCIwIik7CisJICAgIGlmICghZGlhbGl4cCkKKwkgICAgICBtYWtlc3RyKCZkaWFsaXhwLCIwMCIpOworCX0KKyAgICB9CisgICAgeG1ha2VzdHIoJmRpYWxsYWMsZ2V0ZW52KCJLX0FSRUFDT0RFIikpOworICAgIHhtYWtlc3RyKCZkaWFscHhvLGdldGVudigiS19QQlhfT0NQIikpOworICAgIHhtYWtlc3RyKCZkaWFscHhpLGdldGVudigiS19QQlhfSUNQIikpOworICAgIHAgPSBnZXRlbnYoIktfUEJYX1hDSCIpOworI2lmZGVmIENPTU1FTlQKKyAgICB4bWFrZXN0cigmZGlhbHB4eCxwKTsKKyNlbHNlCisgICAgaWYgKHApIGlmICgqcCkgeworCWNoYXIgKiBzID0gTlVMTDsKKwljaGFyICogcHBbTUFYUEJYRVhDSCsyXTsKKwltYWtlc3RyKCZzLHApOwkJCS8qIE1ha2UgYSBjb3B5IGZvciBwb2tpbmcgKi8KKwlpZiAocykgeworCSAgICB4d29yZHMocyxNQVhQQlhFWENIKzEscHAsMCk7IC8qIE5vdGU6IHBwW10gaXMgMS1iYXNlZC4gKi8KKwkgICAgZm9yIChpID0gMDsgaSA8PSBNQVhQQlhFWENIOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBwW2krMV0pIGJyZWFrOworCQltYWtlc3RyKCYoZGlhbHB4eFtpXSkscHBbaSsxXSk7CisJCW5kaWFscHh4Kys7CisJICAgIH0KKwkgICAgbWFrZXN0cigmcyxOVUxMKTsJCS8qIEZyZWUgcG9rZWQgY29weSAqLworCX0KKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworfQorCitzdGF0aWMgaW50CitkaWFsZmFpbCh4KSBpbnQgeDsgeworICAgIGNoYXIgKiBzOworCisgICAgZmFpbF9jb2RlID0geDsKKyAgICBkZWJ1ZyhGMTAxLCJja3VkaWFsIGRpYWxmYWlsIiwiIix4KTsKKyAgICBkcmVzZXQoKTsJCQkJLyogUmVzZXQgYWxhcm0gYW5kIHNpZ25hbCBoYW5kbGVycyAqLworCisgICAgcHJpbnRmKCIlcyBGYWlsdXJlOiAiLCBmdW5jX2NvZGUgPT0gMCA/ICJESUFMIiA6ICJBTlNXRVIiKTsKKyAgICBpZiAoZGlhbGRweSkgewkJCS8qIElmIHNob3dpbmcgcHJvZ3Jlc3MgKi8KKyAgICAgICBkZWJ1ZyhGMTAwLCJkaWFsIGRpc3BsYXkgaXMgb24iLCIiLDApOworCXAgPSBja190aW1lKCk7CQkJLyogZ2V0IGN1cnJlbnQgdGltZTsgKi8KKwlpZiAoKnApIHByaW50ZigiJXM6ICIscCk7CisgICAgfQorICAgIHN3aXRjaCAoZmFpbF9jb2RlKSB7CQkvKiBUeXBlIG9mIGZhaWx1cmUgKi8KKyAgICAgIGNhc2UgRl9USU1FOiAJCQkvKiBUaW1lb3V0ICovCisJaWYgKGRpYWxfd2hhdCA9PSBEV19JTklUKQorCSAgcHJpbnRmICgiVGltZWQgb3V0IHdoaWxlIHRyeWluZyB0byBpbml0aWFsaXplIG1vZGVtLlxuIik7CisJZWxzZSBpZiAoZGlhbF93aGF0ID09IERXX0RJQUwpCisJICBwcmludGYgKCIlcyBpbnRlcnZhbCBleHBpcmVkLlxuIiwKKwkJICBmdW5jX2NvZGUgPT0gMCA/ICJESUFMIFRJTUVPVVQiIDogIkFOU1dFUiB0aW1lb3V0Iik7CisJZWxzZQorCSAgcHJpbnRmKCJUaW1lb3V0LlxuIik7CisJZmZsdXNoKHN0ZG91dCk7CisJaWYgKG1kbWNhcGFzICYgQ0tEX0FUKQorCSAgdHRvYygnXDAxNScpOwkJCS8qIFNlbmQgQ1IgdG8gaW50ZXJydXB0IGRpYWxpbmcgKi8KKwkvKiBTb21lIEhheWVzIG1vZGVtcyBkb24ndCBmYWlsIHdpdGggQlVTWSBvbiBidXN5IGxpbmVzICovCisJZGlhbHN0YSA9IERJQV9USU1POworCWRlYnVnKEYxMTAsImRpYWwiLCJ0aW1lb3V0IiwwKTsKKwlicmVhazsKKworICAgICAgY2FzZSBGX0lOVDoJCQkvKiBEaWFsaW5nIGludGVycnVwdGVkICovCisJcHJpbnRmICgiSW50ZXJydXB0ZWQuXG4iKTsKKwlmZmx1c2goc3Rkb3V0KTsKKyNpZm5kZWYgTk9YRkVSCisJaW50ZXJydXB0ZWQgPSAxOworI2VuZGlmIC8qIE5PWEZFUiAqLworCWRlYnVnKEYxMTEsImRpYWwiLCJpbnRlcnJ1cHRlZCIsbWRtY2FwYXMgJiBDS0RfQVQpOworCWlmIChtZG1jYXBhcyAmIENLRF9BVCkKKwkgIHR0b2MoJ1wwMTUnKTsJCQkvKiBTZW5kIENSIHRvIGludGVycnVwdCBkaWFsaW5nICovCisJZGlhbHN0YSA9IERJQV9JTlRSOworCWJyZWFrOworCisgICAgY2FzZSBGX01PREVNOgkJCS8qIE1vZGVtIGRldGVjdGVkIGEgZmFpbHVyZSAqLworICAgICAgICAgZGVidWcoRjExMSwiZGlhbGZhaWwoKSIsImxidWYiLGxidWYpOworICAgICAgICAgaWYgKGxidWYgJiYgKmxidWYpIHsKKyAgICAgICAgICAgIHByaW50ZigiIFwiIik7CisgICAgICAgICAgICBmb3IgKHMgPSBsYnVmOyAqczsgcysrKQorICAgICAgICAgICAgICAgaWYgKGlzcHJpbnQoKnMpKQorICAgICAgICAgICAgICAgICAgcHV0Y2hhcigqcyk7CQkvKiBEaXNwbGF5IHByaW50YWJsZSByZWFzb24gKi8KKyAgICAgICAgICAgIHByaW50ZiAoIlwiIik7CisgICAgICAgICB9IGVsc2UgcHJpbnRmKGZ1bmNfY29kZSA9PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICIgQ2FsbCBub3QgY29tcGxldGVkLiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgIiBDYWxsIGRpZCBub3QgY29tZSBpbi4iCisgICAgICAgICAgICAgICAgICAgICAgICApOworCXByaW50ZigiXG4iKTsKKwlkZWJ1ZyhGMTEwLCJkaWFsIixsYnVmLDApOworCWlmIChkaWFsc3RhIDwgMCkgZGlhbHN0YSA9IERJQV9VTlNQOworCWJyZWFrOworCisgICAgICBjYXNlIEZfTUlOSVQ6CQkJLyogRmFpbHVyZSB0byBpbml0aWFsaXplIG1vZGVtICovCisJcHJpbnRmICgiRXJyb3IgaW5pdGlhbGl6aW5nIG1vZGVtLlxuIik7CisJZGVidWcoRjExMCwiZGlhbCIsIm1vZGVtIGluaXQiLDApOworCWRpYWxzdGEgPSBESUFfTk9JTjsKKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJcHJpbnRmKCJ1bmtub3duXG4iKTsKKwlkZWJ1ZyhGMTEwLCJkaWFsIiwidW5rbm93biIsMCk7CisJZmZsdXNoKHN0ZG91dCk7CisJaWYgKG1kbWNhcGFzICYgQ0tEX0FUKQorCSAgdHRvYygnXDAxNScpOwkJCS8qIFNlbmQgQ1IgdG8gaW50ZXJydXB0IGRpYWxpbmcgKi8KKwlkaWFsc3RhID0gRElBX0lOVFI7CisgICAgfQorCisjaWZkZWYgRFlOQU1JQworICAgIGlmIChyYnVmKSBmcmVlKHJidWYpOyByYnVmID0gTlVMTDsKKyAgICBpZiAoZmJ1ZikgZnJlZShmYnVmKTsgZmJ1ZiA9IE5VTEw7CisjZW5kaWYgLyogRFlOQU1JQyAqLworCisgICAgaWYgKGRpYWxzdGEgPCAwKSBkaWFsc3RhID0gRElBX1VFUlI7IC8qIFNldCBmYWlsdXJlIGNvZGUgKi8KKyAgICByZXR1cm4oMCk7CQkJCS8qIFJldHVybiB6ZXJvIChpbXBvcnRhbnQpICovCit9CisKKy8qICBDIEsgRCBJIEEgTAkgLS0gIERpYWwgdXAgdGhlIHJlbW90ZSBzeXN0ZW0gKi8KKworLyogUmV0dXJucyAxIGlmIGNhbGwgY29tcGxldGVkLCAwIG90aGVyd2lzZSAqLworCitzdGF0aWMgaW50IG1kbXdhaXQsIG1kbXN0YXQgPSAwOworI2lmbmRlZiBDS19UQVBJCitzdGF0aWMKKyNlbmRpZiAvKiBDS19UQVBJICovCitpbnQgd2FpdGN0OworaW50IG1kbXdhaXRkID0gMTAgOwkJCS8qIGRpYWx0bW8gLyBtZG13YWl0IGRpZmZlcmVuY2UgKi8KK3N0YXRpYyBjaGFyIGM7CitzdGF0aWMgY2hhciAqdGVsbmJyOworCitzdGF0aWMgaW50IHdyID0gMDsJCQkvKiB3ciA9IHdha2UgcmF0ZSAqLworc3RhdGljIGNoYXIgKiB3czsJCQkvKiB3cyA9IHdha2Ugc3RyaW5nICovCitzdGF0aWMgY2hhciAqIHhudW0gPSBOVUxMOworc3RhdGljIGludCBpbml0ZWQgPSAwOworCitzdGF0aWMgU0lHVFlQCisjaWZkZWYgQ0tfQU5TSUMKK19kb2RpYWwodm9pZCAqIHRocmVhZGluZm8pCisjZWxzZSAvKiBDS19BTlNJQyAqLworX2RvZGlhbCh0aHJlYWRpbmZvKSBWT0lEICogdGhyZWFkaW5mbzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogX2RvZGlhbCAqLyB7CisgICAgY2hhciBjMjsKKyAgICBjaGFyICpkY21kLCAqcywgKmZsb2NtZCA9IE5VTEw7CisgICAgaW50IHggPSAwLCBuID0gRl9USU1FOworCisjaWZkZWYgTlRTSUcKKyAgICBzaWduYWwoIFNJR0lOVCwgZGlhbGludCApOworICAgIGlmICh0aHJlYWRpbmZvKSB7CQkJLyogVGhyZWFkIGxvY2FsIHN0b3JhZ2UuLi4gKi8KKwlUbHNTZXRWYWx1ZShUbHNJbmRleCx0aHJlYWRpbmZvKTsKKyAgICB9CisjZW5kaWYgLyogTlRTSUcgKi8KKworICAgIGRjbWQgPSBkaWFsY21kID8gZGlhbGNtZCA6IG1wLT5kaWFsX3N0cjsKKyAgICBpZiAoKGludClzdHJsZW4oZGNtZCkgKyAoaW50KXN0cmxlbih0ZWxuYnIpID4gKExCVUZMIC0gMikpIHsKKwlwcmludGYoIkRJQUwgY29tbWFuZCArIHBob25lIG51bWJlciB0b28gbG9uZyFcbiIpOworCWRyZXNldCgpOworI2lmZGVmIERZTkFNSUMKKwlpZiAocmJ1ZikgZnJlZShyYnVmKTsgcmJ1ZiA9IE5VTEw7CisJaWYgKGZidWYpIGZyZWUoZmJ1Zik7IGZidWYgPSBOVUxMOworI2VuZGlmIC8qIERZTkFNSUMgKi8KKyNpZmRlZiBOVFNJRworCWNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisJU0lHUkVUVVJOOwkgLyogTm8gY29udmVyc2F0aW9uIHdpdGggbW9kZW0gdG8gY29tcGxldGUgZGlhbGluZyAqLworICAgIH0KKyAgICBtYWtlc3RyKCZ4bnVtLHRlbG5icik7CisKKyAgICBnZXRkaWFsbXRoKCk7CQkJLyogR2V0IGRpYWwgbWV0aG9kICovCisKKyNpZmRlZiBDS19BVERUCisgICAgLyogQ29tYmluZSB0aGUgU0VUIERJQUwgTUVUSE9EIGNvbW1hbmQgd2l0aCB0aGUgRElBTCBjb21tYW5kIHN0cmluZyAqLworICAgIGlmICghZGlhbGNtZCAmJgkJCS8qIFVzaW5nIGRlZmF1bHQgRElBTCBjb21tYW5kICovCisJKG1kbWNhcGFzICYgQ0tEX0FUKSAmJgkJLyogQVQgY29tbWFuZCBzZXQgb25seSAqLworCSgoZGlhbG10aCA9PSBYWURNX1QgJiYgIWRpYWx0b25lKSB8fCAvKiBhbmQgdXNpbmcgZGVmYXVsdCAqLworCSAoZGlhbG10aCA9PSBYWURNX1AgJiYgIWRpYWxwdWxzZSkpKSB7IC8qIG1vZGVtIGNvbW1hbmRzLi4uICovCisJY2hhciBjOworCWRlYnVnKEYxMTAsImRpYWwgYXRkdCB4bnVtIDEiLHhudW0sMCk7CisJcyA9IGRjbWQ7CisJZGVidWcoRjExMCwiZGlhbCBhdGR0IHMiLHMsMCk7CisJaWYgKCp0ZWxuYnIgIT0gJ1QnICYmCisJICAgICp0ZWxuYnIgIT0gJ1AnICYmCisJICAgICp0ZWxuYnIgIT0gJ3QnICYmCisJICAgICp0ZWxuYnIgIT0gJ3AnICYmCisJICAgICFja3N0cmNtcChzLCJhdGQiLDMsMCkgJiYKKwkgICAgc1szXSAhPSAnVCcgJiYKKwkgICAgc1szXSAhPSAnUCcgJiYKKwkgICAgc1szXSAhPSAndCcgJiYKKwkgICAgc1szXSAhPSAncCcpIHsKKwkgICAgY2hhciB4YnVmWzIwMF07CisJICAgIGMgPSAoZGlhbG10aCA9PSBYWURNX1QpID8gJ1QnIDogJ1AnOworCSAgICBpZiAoaXNsb3dlcihzWzBdKSkKKwkgICAgICBjID0gdG9sb3dlcihjKTsKKwkgICAgaWYgKChpbnQpc3RybGVuKHRlbG5icikgPCAxOTkpIHsKKwkJc3ByaW50Zih4YnVmLCIlYyVzIixjLHRlbG5icik7CisJCW1ha2VzdHIoJnhudW0seGJ1Zik7CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmIC8qIENLX0FURFQgKi8KKyAgICBkZWJ1ZyhGMTExLCJfZG9kaWFsIix4bnVtLHhyZWRpYWwpOworCisgICAgLyogSGFuZyB1cCB0aGUgbW9kZW0gKGluIGNhc2UgaXQgd2Fzbid0ICJvbiBob29rIikgKi8KKyAgICAvKiBCdXQgb25seSBpZiBTRVQgRElBTCBIQU5HVVAgT04uLi4gKi8KKworICAgIGlmICgheHJlZGlhbCkgewkJCS8qIE1vZGVtIG5vdCBpbml0YWxpemVkIHlldC4gKi8KKwlpbml0ZWQgPSAwOworICAgIH0KKyAgICBpZiAoIXhyZWRpYWwgfHwgIWluaXRlZCkgeworCWlmIChkaWFsaHVwKCkgPCAwKSB7CQkvKiBIYW5ndXAgZmlyc3QgKi8KKwkgICAgZGVidWcoRjEwMCwiX2RvZGlhbCBkaWFsaHVwIGZhaWxlZCIsIiIsMCk7CisjaWZuZGVmIE1JTklESUFMCisJICAgIGlmIChtZG1jYXBhcyAmIENLRF9UQikJLyogVGVsZWJpdHMgbWlnaHQgbmVlZCBhIEJSRUFLICovCisJICAgICAgdHRzbmRiKCk7CQkJLyogIGZpcnN0LiAqLworI2VuZGlmIC8qIE1JTklESUFMICovCisJICAgIGlmIChkaWFsaG5nICYmIGRpYWxzdGEgIT0gRElBX1BBUlQpIHsgLyogSWYgaGFuZ3VwIGZhaWxlZCwgKi8KKwkJdHRjbG9zKDApOwkJLyogY2xvc2UgYW5kIHJlb3BlbiB0aGUgZGV2aWNlLiAqLworCQlpZiAodHRvcGVuKHR0bmFtZSwmbG9jYWwsbXltZG10eXAsMCkgPCAwKSB7CisJCSAgICBwcmludGYoIlNvcnJ5LCBDYW4ndCBoYW5nIHVwIGNvbW11bmljYXRpb24gZGV2aWNlLlxuIik7CisJCSAgICBwcmludGYoIlRyeSAnc2V0IGxpbmUgJXMnIGFnYWluLlxuIix0dG5hbWUpOworCQkgICAgZGlhbHN0YSA9IERJQV9IQU5HOworI2lmZGVmIERZTkFNSUMKKwkJICAgIGlmIChyYnVmKSBmcmVlKHJidWYpOyByYnVmID0gTlVMTDsKKwkJICAgIGlmIChmYnVmKSBmcmVlKGZidWYpOyBmYnVmID0gTlVMTDsKKyNlbmRpZiAvKiBEWU5BTUlDICovCisJCSAgICBkcmVzZXQoKTsKKyNpZmRlZiBOVFNJRworCQkgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKwkJICAgIFNJR1JFVFVSTjsKKwkJfQorCSAgICB9CisJfQorCWluaXRlZCA9IDA7CQkJLyogV2UgaHVuZyB1cCBzbyBtdXN0IHJlaW5pdCAqLworICAgIH0KKyNpZm5kZWYgTUlOSURJQUwKKyAgICAvKiBEb24ndCBzdGFydCB0YWxraW5nIHRvIFJvbG0gdG9vIHNvb24gKi8KKyAgICBpZiAobXltZG10eXAgPT0gbl9ST0xNICYmIGRpYWxzdGEgIT0gRElBX1BBUlQpCisgICAgICBtc2xlZXAoNTAwKTsKKyNlbmRpZiAvKiBNSU5JRElBTCAqLworCisgICAgaWYgKGRpYWxzdGEgIT0gRElBX1BBUlQJCS8qIFNvbWUgaW5pdGlhbCBzZXR1cHMuICovCisjaWZuZGVmIE1JTklESUFMCisJJiYgbXltZG10eXAgIT0gbl9BVFRVUEMKKyNlbmRpZiAvKiBNSU5JRElBTCAqLworCSkgeworCWZhaWxfY29kZSA9IEZfTUlOSVQ7CQkvKiBEZWZhdWx0IGZhaWx1cmUgY29kZSAqLworCWRpYWxfd2hhdCA9IERXX0lOSVQ7CQkvKiBXaGF0IEknbSBEb2luZyBOb3cgICAqLworCWlmIChkaWFsZHB5KSB7CQkJLyogSWYgc2hvd2luZyBwcm9ncmVzcywgKi8KKwkgICAgcCA9IGNrX3RpbWUoKTsJCS8qIGdldCB0aW1lc3RhbXAuICAgKi8KKwkgICAgaWYgKCFpbml0ZWQpCisJICAgICAgaWYgKCpwKQorCQlwcmludGYoIiBJbml0aWFsaXppbmc6ICVzLi4uXG4iLHApOworCX0KKyAgICB9CisjaWZuZGVmIE1JTklESUFMCisjaWZkZWYgQVRUNzMwMAorICAgIGlmIChteW1kbXR5cCA9PSBuX0FUVFVQQykgeworLyoKKyAgRm9yIEFUVDczMDAvVW5peCBQQydzIHdpdGggdGhlaXIgc3BlY2lhbCBpbnRlcm5hbCBtb2RlbS4gIFdob2xlIGRpYWxpbmcKKyAgcHJvY2VzcyBpcyBoYW5kbGVkIHJpZ2h0IGhlcmUsIGFuIGV4Y2VwdGlvbiB0byB0aGUgbm9ybWFsIHN0cnVjdHVyZS4KKyAgVGltZW91dCBhbmQgdXNlciBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGR1cmluZyBkaWFsaW5nLiAgYXR0ZGlhbCgpIGlzIGluCisgIGZpbGUgY2t1dGlvLmMuICAtIGpyZAorKi8KKyAgICAgICAgX1BST1RPVFlQKCBpbnQgYXR0ZGlhbCwgKGNoYXIgKiwgbG9uZywgY2hhciAqKSApOworCWZhaWxfY29kZSA9IEZfTU9ERU07CQkvKiBEZWZhdWx0IGZhaWx1cmUgY29kZSAqLworCWRpYWxfd2hhdCA9IERXX0RJQUw7CisJaWYgKGRpYWxkcHkpIHsJCQkvKiBJZiBzaG93aW5nIHByb2dyZXNzICovCisJICAgIHAgPSBja190aW1lKCk7CQkvKiBnZXQgY3VycmVudCB0aW1lOyAqLworCSAgICBpZiAoKnApCisJICAgICAgcHJpbnRmKCIgRGlhbGluZzogJXMuLi5cbiIscCk7CisJfQorCWFsYXJtKHdhaXRjdCk7CQkJLyogU2V0IGFsYXJtICovCisJaWYgKGF0dGRpYWwodHRuYW1lLHNwZWVkLHRlbG5icikpIHsgLyogZGlhbCBpbnRlcm5hbCBtb2RlbSAqLworCSAgICBkcmVzZXQoKTsJCQkvKiByZXNldCBhbGFybXMsIGV0Yy4gKi8KKwkgICAgcHJpbnRmKCIgQ2FsbCBmYWlsZWQuXHJcbiIpOworCSAgICBkaWFsaHVwKCk7CSAgICAgICAgCS8qIEhhbmd1cCB0aGUgY2FsbCAqLworI2lmZGVmIERZTkFNSUMKKwkgICAgaWYgKHJidWYpIGZyZWUocmJ1Zik7IHJidWYgPSBOVUxMOworCSAgICBpZiAoZmJ1ZikgZnJlZShmYnVmKTsgZmJ1ZiA9IE5VTEw7CisjZW5kaWYgLyogRFlOQU1JQyAqLworCSAgICBkaWFsc3RhID0gRElBX1VFUlI7CisjaWZkZWYgTlRTSUcKKwkgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKwkgICAgU0lHUkVUVVJOOwkJCS8qIHJldHVybiBmYWlsdXJlICovCisJfQorCWRyZXNldCgpOwkJCS8qIHJlc2V0IGFsYXJtcywgZXRjLiAqLworCXR0cGt0KHNwZWVkLEZMT19ESUFYLHBhcml0eSk7CS8qIGNhbmNlbCBkaWFsaW5nIGlvY3RsICovCisJaWYgKCFxdWlldCAmJiAhYmFja2dyZCkgeworCSAgICBpZiAoZGlhbGRweSkgeworCQlwcmludGYoIlxuIik7CisJCXByaW50ZigiIENhbGwgY29tcGxldGUuXHJcbiIpOworCSAgICB9IGVsc2UgaWYgKG1vZGVtbXNnWzBdKQorCQlwcmludGYoIiBDYWxsIGNvbXBsZXRlOiBcIiVzXCIuXHJcbiIsKGNoYXIgKiltb2RlbW1zZyk7CisJICAgIGVsc2UKKwkgICAgICBwcmludGYoIiBDYWxsIGNvbXBsZXRlLlxyXG4iKTsKKwl9CisjaWZkZWYgQ0tMT0dESUFMCisJZG9sb2dkaWFsKHRlbG5icik7CisjZW5kaWYgLyogQ0tMT0dESUFMICovCisKKwlkaWFsc3RhID0gRElBX09LOworI2lmZGVmIERZTkFNSUMKKwlpZiAocmJ1ZikgZnJlZShyYnVmKTsgcmJ1ZiA9IE5VTEw7CisJaWYgKGZidWYpIGZyZWUoZmJ1Zik7IGZidWYgPSBOVUxMOworI2VuZGlmIC8qIERZTkFNSUMgKi8KKyNpZmRlZiBOVFNJRworCWNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisJU0lHUkVUVVJOOwkvKiBObyBjb252ZXJzYXRpb24gd2l0aCBtb2RlbSB0byBjb21wbGV0ZSBkaWFsaW5nICovCisgICAgfSBlbHNlCisjZW5kaWYgLyogQVRUNzMwMCAqLworI2lmZGVmIENLX1RBUEkKKyAgICAgIGlmICh0dHRhcGkgJiYgIXRhcGlwYXNzKSB7CS8qIFRBUEkgRGlhbGluZyAqLworCSAgc3dpdGNoIChmdW5jX2NvZGUpIHsKKwkgICAgY2FzZSAwOgkJCS8qIERpYWwgKi8KKwkgICAgICBpZiAoY2t0YXBpZGlhbCh0ZWxuYnIpKSB7CisJCSAgZmFpbF9jb2RlID0gMDsKKwkJICBpZiAocGFydGlhbCkgeworCQkgICAgICBkaWFsc3RhID0gRElBX1BBUlQ7CisJCSAgfSBlbHNlIHsKKwkJICAgICAgZGlhbHN0YSA9IERJQV9PSzsKKwkJICAgICAgc3BlZWQgPSB0dGdzcGQoKTsKKwkJICB9CisJICAgICAgfSBlbHNlIHsKKwkJICBpZiAoZGlhbHN0YSA9PSBESUFfUEFSVCkKKwkJICAgIGNrdGFwaWhhbmd1cCgpOworCQkgIGlmICghZmFpbF9jb2RlKQorCQkgICAgZmFpbF9jb2RlID0gRl9NT0RFTTsKKwkJICBkaWFsc3RhID0gRElBX1RBUEk7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDE6IHsJCQkvKiBBbnN3ZXIgKi8KKwkJbG9uZyBzdHJ0dGltZSA9IHRpbWUoKGxvbmcgKilOVUxMKTsKKwkJbG9uZyBkaWZmID0gMDsKKwkJZG8geworCQkgICAgaWYgKGRpYWxhdG1vID4gMCkgeworCQkJc3RydHRpbWUgKz0gZGlmZjsKKwkJCXdhaXRjdCAgIC09IGRpZmY7CisJCSAgICB9CisJCSAgICBmYWlsX2NvZGUgPSAwOworCQkgICAgaWYgKGNrdGFwaWFuc3dlcigpKSB7IC8qIFNVQ0NFU1MgKi8KKwkJCWRpYWxzdGEgPSBESUFfT0s7CisJCQlzcGVlZCA9IHR0Z3NwZCgpOworCQkJYnJlYWs7CisJCSAgICB9IGVsc2UgewkJLyogRkFJTFVSRSAqLworCQkJaWYgKGZhaWxfY29kZSkgeworCQkJICAgIGRpYWxzdGEgPSBESUFfVEFQSTsKKwkJCSAgICBicmVhazsKKwkJCX0gZWxzZSB7CisJCQkgICAgZmFpbF9jb2RlID0gRl9NT0RFTTsKKwkJCSAgICBkaWFsc3RhID0gRElBX1RBUEk7CisJCQl9CisJCSAgICB9CisJCSAgICBpZiAoZGlhbGF0bW8gPiAwKSB7CisJCQlkaWZmID0gdGltZSgobG9uZyAqKU5VTEwpIC0gc3RydHRpbWU7CisJCSAgICB9CisJCX0gd2hpbGUgKChkaWFsYXRtbyA+IDApID8gKGRpZmYgPCB3YWl0Y3QpIDogMSk7CisJCWJyZWFrOworCSAgICB9CisJICB9CisjaWZkZWYgTlRTSUcKKwkgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisJICBTSUdSRVRVUk47CisgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19UQVBJICovCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKworLyogTW9kZW1zIHdpdGggQVQgY29tbWFuZCBzZXQuLi4gKi8KKworICAgICAgaWYgKChtZG1jYXBhcyAmIENLRF9BVCkgJiYgZGlhbHN0YSAhPSBESUFfUEFSVCkgeworCisJICBpZiAoZGlhbHBhY2UgPiAtMSkJCS8qIFNldCBpbnRlcmNoYXJhY3RlciBwYWNpbmcgKi8KKwkgICAgd3IgPSBkaWFscGFjZTsKKwkgIGVsc2UKKwkgICAgd3IgPSBtcC0+d2FrZV9yYXRlOworCisJICBpZiAoZGlhbGluaSkJCQkvKiBHZXQgd2FrZXVwL2luaXQgc3RyaW5nICovCisJICAgIHdzID0gZGlhbGluaTsKKwkgIGVsc2UKKwkgICAgd3MgPSBtcC0+d2FrZV9zdHI7CisjaWZkZWYgQ09NTUVOVAorCSAgaWYgKCF3cykgd3MgPSAiXDAxNSI7CQkvKiBJZiBub25lLCB1c2UgQ1IgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKwkgIC8qIEZpcnN0IGdldCB0aGUgbW9kZW0ncyBhdHRlbnRpb24gYW5kIGVuYWJsZSByZXN1bHQgY29kZXMgKi8KKworCSAgZm9yICh0cmllcyA9IDA7IHRyaWVzIDwgNTsgdHJpZXMrKykgeyAvKiBTZW5kIHNob3J0IGNvbW1hbmQgKi8KKwkgICAgICBpZiAodHJpZXMgPiAwKSB7CisJCSAgdHRvYygnXDAxNScpOwkJLyogQVQgbXVzdCBnbyBmaXJzdCBmb3Igc3BlZWQgKi8KKwkJICBtc2xlZXAod3IpOwkJLyogZGV0ZWN0aW9uLiAqLworCSAgICAgIH0KKwkgICAgICBpZiAobXltZG10eXAgPT0gbl9HRU5FUklDKSAvKiBGb3JjZSB3b3JkIHJlc3VsdCBjb2RlcyAqLworCQl0dHNsb3coIkFUUTBWMVwwMTUiLHdyKTsgLyogZm9yIGdlbmVyaWMgbW9kZW0gdHlwZSAqLworCSAgICAgIGVsc2UKKwkJdHRzbG93KCJBVFEwXDAxNSIsd3IpOworCSAgICAgIG1kbXN0YXQgPSBnZXRvayh0cmllcyA8IDIgPyAyIDogdHJpZXMsIDEpOyAvKiBHZXQgcmVzcG9uc2UgKi8KKwkgICAgICBpZiAobWRtc3RhdCA+IDApIGJyZWFrOwkvKiBPSyAtIGRvbmUgKi8KKwkgICAgICBpZiAoZGlhbGRweSAmJiB0cmllcyA+IDApIHsKKwkJICBwcmludGYoIlxyXG4gTm8gcmVzcG9uc2UgZnJvbSBtb2RlbSIpOworCQkgIGlmICh0cmllcyA9PSA0KSB7CisJCSAgICAgIHByaW50ZigiLlxyXG4iKTsKKwkJICAgICAgZGlhbHN0YSA9IERJQV9OUlNQOworI2lmZGVmIERZTkFNSUMKKwkJICAgICAgaWYgKHJidWYpIGZyZWUocmJ1Zik7IHJidWYgPSBOVUxMOworCQkgICAgICBpZiAoZmJ1ZikgZnJlZShmYnVmKTsgZmJ1ZiA9IE5VTEw7CisjZW5kaWYgLyogRFlOQU1JQyAqLworI2lmZGVmIE5UU0lHCisJCSAgICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisJCSAgICAgIFNJR1JFVFVSTjsJLyogcmV0dXJuIGZhaWx1cmUgKi8KKwkJICB9CisJCSAgcHJpbnRmKCIsIHJldHJ5aW5nJXMuLi5cclxuIiwKKwkJCSAodHJpZXMgPiAxKSA/ICIgYWdhaW4iIDogIiIpOworCQkgIGZmbHVzaChzdGRvdXQpOworCSAgICAgIH0KKwkgICAgICB0dGZsdWkoKTsKKwkgICAgICBzd2l0Y2ggKHRyaWVzKSB7CisJCWNhc2UgMDogbXNsZWVwKDEwMCk7IGJyZWFrOworCQljYXNlIDE6IHR0c25kYigpOyBicmVhazsKKwkJZGVmYXVsdDoKKwkJICBpZiAobmV0d29yaykgeworCQkgICAgICB0dHNuZGIoKTsKKwkJICB9IGVsc2UgeworCQkgICAgICBpZiAodHJpZXMgPT0gMikgeworCQkJICB0dGhhbmcoKTsKKwkJCSAgdHRmbHVpKCk7CisJCSAgICAgIH0gZWxzZSB7CisJCQkgIG1kbWh1cCgpOworCQkgICAgICB9CisJCSAgICAgIGluaXRlZCA9IDA7CisJCSAgfQorCSAgICAgIH0KKwkgICAgICBmZmx1c2goc3Rkb3V0KTsKKwkgIH0KKwkgIGRlYnVnKEYxMDEsIl9kb2RpYWwgQVRRMCBtZG1zdGF0IiwiIixtZG1zdGF0KTsKKworCSAgaWYgKHhyZWRpYWwgJiYgaW5pdGVkKSB7CS8qIFJlZGlhbGluZy4uLiAqLworCSAgICAgIHR0b2MoJ1wwMTUnKTsJCS8qIENhbmNlbCBwcmV2aW91cyAqLworCSAgICAgIG1zbGVlcCgyNTApOwkJLyogV2FpdCBhIGJpdCAqLworI2lmZGVmIENPTU1FTlQKKy8qIFRoaXMgd2Fzbid0IHRoZSBwcm9ibGVtLi4uICovCisJICAgICAgdHRmbHVpKCk7CQkJLyogQ2xlYXIgb3V0IHN0dWZmIGZyb20gbW9kZW0gc2V0dXAgKi8KKwkgICAgICB0dHNsb3coIkFUUzc9NjBcMDE1Iix3cik7CS8qIFJlZG8gY2FycmllciB3YWl0ICovCisJICAgICAgZ2V0b2soNCwxKTsJCS8qIEdldCByZXNwb25zZSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgICAgICBhbGFybSgwKTsJCQkvKiBKdXN0IGluIGNhc2UuLi4gKi8KKwkgICAgICB0dGZsdWkoKTsJCQkvKiBDbGVhciBvdXQgc3R1ZmYgZnJvbSBtb2RlbSBzZXR1cCAqLworCSAgICAgIGdvdG8gUkVESUFMOwkJLyogU2tpcCBzZXR1cCAtIHdlIGFscmVhZHkgZGlkIGl0ICovCisJICB9CisvKgorICBEbyBmbG93IGNvbnRyb2wgbmV4dCBiZWNhdXNlIGEgbG9uZyBpbml0IHN0cmluZyBlY2hvaW5nIGJhY2sgY291bGQKKyAgY2F1c2UgZGF0YSBvdmVycnVucywgY2F1c2luZyB1cyB0byBtaXNzIHRoZSBPSywgb3IgKHdvcnNlKSB0byBnZXQgb3V0CisgIG9mIHN5bmMgZW50aXJlbHkuCisqLworCSAgeCA9IDA7CQkJLyogVXNlciBzYWlkIFNFVCBESUFMIEZMT1cgUlRTL0NUUyAqLworCSAgaWYgKGRpYWxmYyA9PSBGTE9fUlRTQyB8fAkvKiBFdmVuIGlmIEtlcm1pdCdzIEZMT1cgaXNuJ3QuLi4gICovCisJICAgICAgKGRpYWxmYyA9PSBGTE9fQVVUTyAmJiBmbG93ID09IEZMT19SVFNDKSkgeworCSAgICAgIGlmIChkaWFsaHdmYykgewkJLyogVXNlci1kZWZpbmVkIEhXRkMgc3RyaW5nICovCisJCSAgaWYgKCpkaWFsaHdmYykgeworCQkgICAgICB4ID0gMTsKKwkJICAgICAgZmxvY21kID0gZGlhbGh3ZmM7CisJCSAgfQorCSAgICAgIH0gZWxzZSBpZiAoKG1kbWNhcGFzICYgQ0tEX0hXKSAmJiAqKG1wLT5od2ZjX3N0cikpIHsKKwkJICB4ID0gMTsKKwkJICBmbG9jbWQgPSBtcC0+aHdmY19zdHI7CisJICAgICAgfQorCSAgfSBlbHNlIGlmIChkaWFsZmMgPT0gRkxPX1hPTlggfHwgLyogVXNlciBzYWlkIFNFVCBESUFMIEZMT1cgU09GVCAqLworCQkgICAgIChkaWFsZmMgPT0gRkxPX0FVVE8gJiYgZmxvdyA9PSBGTE9fWE9OWCkpIHsKKwkgICAgICBpZiAoZGlhbHN3ZmMpIHsKKwkJICBpZiAoKmRpYWxzd2ZjKSB7CisJCSAgICAgIHggPSAxOworCQkgICAgICBmbG9jbWQgPSBkaWFsc3dmYzsKKwkJICB9CisJICAgICAgfSBlbHNlIGlmICgobWRtY2FwYXMgJiBDS0RfU1cpICYmICoobXAtPnN3ZmNfc3RyKSkgeworCQkgIHggPSAxOworCQkgIGZsb2NtZCA9IG1wLT5zd2ZjX3N0cjsKKwkgICAgICB9CisJICB9IGVsc2UgaWYgKGRpYWxmYyA9PSBGTE9fTk9ORSkgeyAvKiBVc2VyIHNhaWQgU0VUIERJQUwgRkxPVyBOT05FICovCisJICAgICAgaWYgKGRpYWxub2ZjKSB7CisJCSAgaWYgKCpkaWFsbm9mYykgeworCQkgICAgICB4ID0gMTsKKwkJICAgICAgZmxvY21kID0gZGlhbG5vZmM7CisJCSAgfQorCSAgICAgIH0gZWxzZSBpZiAobXAtPm5vZmNfc3RyICYmICoobXAtPm5vZmNfc3RyKSkgeworCQkgIHggPSAxOworCQkgIGZsb2NtZCA9IG1wLT5ub2ZjX3N0cjsKKwkgICAgICB9CisJICB9CisJICBpZiAoeCkgewkJCS8qIFNlbmQgdGhlIGZsb3cgY29udHJvbCBjb21tYW5kICovCisJICAgICAgZGVidWcoRjExMCwiX2RvZGlhbCBmbG9jbWQiLGZsb2NtZCwwKTsKKwkgICAgICBmb3IgKHRyaWVzID0gNDsgdHJpZXMgPiAwOyB0cmllcy0tKSB7IC8qIFNlbmQgdGhlIGNvbW1hbmQgKi8KKwkJICB0dHNsb3coZmxvY21kLHdyKTsKKwkJICBtZG1zdGF0ID0gZ2V0b2soNSwxKTsKKwkJICBpZiAobWRtc3RhdCA+IDApIGJyZWFrOworCQkgIGlmIChkaWFsZHB5ICYmIHRyaWVzID4gMSkKKwkJICAgIHByaW50ZigiIE5vIHJlc3BvbnNlIGZyb20gbW9kZW0sIHJldHJ5aW5nJXMuLi5cbiIsCisJCQkgICAodHJpZXMgPCA0KSA/ICIgYWdhaW4iIDogIiIpOworCSAgICAgIH0KKworI2lmZGVmIENLX1RUU0VURkxPVworI2lmZGVmIENLX1JUU0NUUworLyoKKyAgU28gZmFyIG9ubHkgY2t1dGlvLmMgaGFzIHR0c2V0ZmxvdygpLgorICBXZSBoYXZlIGp1c3QgdG9sZCB0aGUgbW9kZW0gdG8gdHVybiBvbiBSVFMvQ1RTIGZsb3cgY29udHJvbCBhbmQgdGhlIG1vZGVtCisgIGhhcyBzYWlkIE9LLiAgQnV0IHdlIG91cnNlbHZlcyBoYXZlIG5vdCB0dXJuZWQgaXQgb24geWV0IGJlY2F1c2Ugb2YgdGhlCisgIGRpc2d1c3RpbmcgdHRwa3QoLi4uRkxPX0RJQUwuLi4pIGhhY2suICBTbyBub3csIGlmIHRoZSBjb21wdXRlciBkb2VzIG5vdAorICBoYXBwZW4gdG8gYmUgYXNzZXJ0aW5nIFJUUywgdGhlIG1vZGVtIHdpbGwgbm8gbG9uZ2VyIHNlbmQgY2hhcmFjdGVycyB0byBpdC4KKyAgU28gYXQgRVhBQ1RMWSBUSElTIFBPSU5ULCB3ZSBtdXN0IGVuYWJsZSBSVFMvQ1RTIGluIHRoZSBkZXZpY2UgZHJpdmVyLgorKi8KKwkgICAgICBpZiAoZGlhbGZjID09IEZMT19SVFNDIHx8CisJCSAgKGRpYWxmYyA9PSBGTE9fQVVUTyAmJiBmbG93ID09IEZMT19SVFNDKSkgeworCQkgIHR0c2V0ZmxvdyhGTE9fUlRTQyk7CisJICAgICAgfQorI2VuZGlmIC8qIENLX1JUU0NUUyAqLworI2VuZGlmIC8qIENLX1RUU0VURkxPVyAqLworCSAgfQorCSAgdHRmbHVpKCk7CQkJLyogQ2xlYXIgb3V0IHN0dWZmIGZyb20gbW9kZW0gc2V0dXAgKi8KKwkgIG1zbGVlcCgyNTApOworCisJICBpZiAoIXdzKSBnb3RvIHhkaWFsZWM7CS8qIE5vIGluaXQgc3RyaW5nICovCisJICBpZiAoISp3cykgZ290byB4ZGlhbGVjOworCisJICBmb3IgKHRyaWVzID0gNDsgdHJpZXMgPiAwOyB0cmllcy0tKSB7IC8qIFNlbmQgaW5pdCBzdHJpbmcgKi8KKwkgICAgICB0dHNsb3cod3Msd3IpOworCSAgICAgIG1kbXN0YXQgPSBnZXRvayg0LDEpOwkvKiBHZXQgcmVzcG9uc2UgKi8KKwkgICAgICBpZiAobWRtc3RhdCA+IDApIGJyZWFrOworCSAgICAgIGlmIChkaWFsZHB5ICYmIHRyaWVzID4gMSkKKwkJcHJpbnRmKCIgTm8gcmVzcG9uc2UgZnJvbSBtb2RlbSwgcmV0cnlpbmclcy4uLlxuIiwKKwkJICAgICAgICh0cmllcyA8IDQpID8gIiBhZ2FpbiIgOiAiIik7CisJICB9CisJICBkZWJ1ZyhGMTAxLCJfZG9kaWFsIHdha2Vfc3RyIG1kbXN0YXQiLCIiLG1kbXN0YXQpOworCisJICBpZiAobWRtc3RhdCA8IDEpIHsJCS8qIEluaXRpYWxpemVkIE9LPyAqLworCSAgICAgIGRpYWxmYWlsKEZfTUlOSVQpOwkvKiBObywgZmFpbC4gKi8KKyNpZmRlZiBOVFNJRworCSAgICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisJICAgICAgU0lHUkVUVVJOOworCSAgfQorCisjaWZuZGVmIE1JTklESUFMCisgICAgfSBlbHNlIGlmIChteW1kbXR5cCA9PSBuX0FUVERURE0gJiYgZGlhbHN0YSAhPSBESUFfUEFSVCkgeyAvKiBBVCZUIC4uLiAqLworCXR0c25kYigpOwkJCS8qIFNlbmQgQlJFQUsgKi8KKyNlbmRpZiAvKiBNSU5JRElBTCAqLworCisgICAgfSBlbHNlIGlmIChkaWFsc3RhICE9IERJQV9QQVJUKSB7IC8qIEFsbCBvdGhlcnMgKi8KKworCS8qIFBsYWNlIG1vZGVtIGludG8gY29tbWFuZCBtb2RlICovCisKKwl3cyA9IGRpYWxpbmkgPyBkaWFsaW5pIDogbXAtPndha2Vfc3RyOworCWlmICh3cyAmJiAoaW50KXN0cmxlbih3cykgPiAwKSB7CisJICAgIGRlYnVnKEYxMTEsIl9kb2RpYWwgZGVmYXVsdCwgd2FrZSBzdHJpbmciLCB3cywgd3IpOworCSAgICB0dHNsb3cod3MsIHdyKTsKKwl9IGVsc2UgZGVidWcoRjEwMCwiX2RvZGlhbCBubyB3YWtlX3N0ciIsIiIsMCk7CisJaWYgKG1wLT53YWtlX3Byb21wdCAmJiAoaW50KXN0cmxlbihtcC0+d2FrZV9wcm9tcHQpID4gMCkgeworCSAgICBkZWJ1ZyhGMTEwLCJfZG9kaWFsIGRlZmF1bHQsIHdhaXRpbmcgZm9yIHdha2VfcHJvbXB0IiwKKwkJICBtcC0+d2FrZV9wcm9tcHQsMCk7CisJICAgIGFsYXJtKDEwKTsKKwkgICAgd2FpdGZvcihtcC0+d2FrZV9wcm9tcHQpOworCSAgICBhbGFybSgwKTsKKwl9IGVsc2UgZGVidWcoRjEwMCwiX2RvZGlhbCBubyB3YWtlX3Byb21wdCIsIiIsMCk7CisgICAgfQorCisvKiBIYW5kbGUgZXJyb3IgY29ycmVjdGlvbiwgZGF0YSBjb21wcmVzc2lvbiwgYW5kIGZsb3cgY29udHJvbC4uLiAqLworCisgIHhkaWFsZWM6CisKKyAgICBpZiAoZGlhbHN0YSAhPSBESUFfUEFSVCkgeworCWFsYXJtKDApOwkJCS8qIFR1cm4gb2ZmIGFsYXJtICovCisJZGVidWcoRjEwMCwiX2RvZGlhbCBnb3Qgd2FrZSBwcm9tcHQiLCIiLDApOworCW1zbGVlcCg1MDApOwkJCS8qIEFsbG93IHNldHRsaW5nIHRpbWUgKi8KKworCS8qIEVuYWJsZS9kaXNhYmxlIGVycm9yLWNvcnJlY3Rpb24gKi8KKworCXggPSAwOworCWlmIChkaWFsZWMpIHsJCQkvKiBESUFMIEVSUk9SLUNPUlJFQ1RJT04gaXMgT04gKi8KKwkgICAgaWYgKGRpYWxlY29uKSB7CQkvKiBTRVQgRElBTCBTVFJJTkcgRVJST1ItQ09SUkVDVElPTiAqLworCQlpZiAoKmRpYWxlY29uKSB7CisJCSAgICB4ID0gMTsKKwkJICAgIHR0c2xvdyhkaWFsZWNvbiwgd3IpOworCQl9CisJICAgIH0gZWxzZSBpZiAoKG1kbWNhcGFzICYgQ0tEX0VDKSAmJiAqKG1wLT5lY19vbl9zdHIpKSB7CisJCXggPSAxOworCQl0dHNsb3cobXAtPmVjX29uX3N0ciwgd3IpOworCSAgICB9CisjaWZkZWYgQ09NTUVOVAorCSAgICBlbHNlIHByaW50ZigKKwkJICAiV0FSTklORyAtIEkgZG9uJ3Qga25vdyBob3cgdG8gdHVybiBvbiBFQyBmb3IgdGhpcyBtb2RlbVxuIgorCQkgICAgICk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCX0gZWxzZSB7CisJICAgIGlmIChkaWFsZWNvZmYpIHsJCS8qIERJQUwgRVJST1ItQ09SUkVDVElPTiBPRkYgKi8KKwkJaWYgKCpkaWFsZWNvZmYpIHsKKwkJICAgIHggPSAxOworCQkgICAgdHRzbG93KGRpYWxlY29mZiwgd3IpOworCQl9CisJICAgIH0gZWxzZSBpZiAoKG1kbWNhcGFzICYgQ0tEX0VDKSAmJiAqKG1wLT5lY19vZmZfc3RyKSkgeworCQl4ID0gMTsKKwkJdHRzbG93KG1wLT5lY19vZmZfc3RyLCB3cik7CisJICAgIH0KKyNpZmRlZiBDT01NRU5UCisJICAgIGVsc2UgcHJpbnRmKAorCQkgICJXQVJOSU5HIC0gSSBkb24ndCBrbm93IGhvdyB0byB0dXJuIG9mZiBFQyBmb3IgdGhpcyBtb2RlbVxuIgorCQkgICAgICk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCX0KKwlkZWJ1ZyhGMTAxLCJja3VkaWEgeHhfb2siLCIiLHh4X29rKTsKKwlpZiAoeCAmJiB4eF9vaykgewkJCS8qIExvb2sgZm9yIE9LIHJlc3BvbnNlICovCisJICAgIGRlYnVnKEYxMDAsImNrdWRpYSBjYWxsaW5nIHh4X29rIGZvciBFQyIsIiIsMCk7CisJICAgIHggPSAoKnh4X29rKSg1LDEpOworCSAgICBkZWJ1ZyhGMTAxLCJja3VkaWEgeHhfb2siLCIiLHgpOworCSAgICBpZiAoeCA8IDApIHsKKwkJcHJpbnRmKCJXQVJOSU5HIC0gVHJvdWJsZSBlbmFibGluZyBlcnJvci1jb3JyZWN0aW9uLlxuIik7CisJCXByaW50ZigKKyIgTGlrZWx5IGNhdXNlOiBZb3VyIG1vZGVtIGlzIGFuIFJQSSBtb2RlbCwgd2hpY2ggZG9lcyBub3QgaGF2ZSBidWlsdC1pblxuIik7CisJCXByaW50ZigiIGVycm9yIGNvcnJlY3Rpb24gYW5kIGRhdGEgY29tcHJlc3Npb24uIik7CisJICAgIH0KKwl9CisKKwkvKiBFbmFibGUvZGlzYWJsZSBkYXRhIGNvbXByZXNzaW9uICovCisKKwlpZiAoeCA+IDApIHggPSAwOworCWlmIChkaWFsZGMpIHsKKwkgICAgaWYgKHggPCAwIHx8ICFkaWFsZWMpIHsKKwkJcHJpbnRmKAorIldBUk5JTkcgLSBZb3UgY2FuJ3QgaGF2ZSBjb21wcmVzc2lvbiB3aXRob3V0IGVycm9yIGNvcnJlY3Rpb24uXG4iKTsKKwkgICAgfSBlbHNlIGlmIChkaWFsZGNvbikgewkvKiBTRVQgRElBTCBTVFJJTkcgLi4uICovCisJCWlmICgqZGlhbGRjb24pIHsKKwkJICAgIHggPSAxOworCQkgICAgdHRzbG93KGRpYWxkY29uLCB3cik7CisJCX0KKwkgICAgfSBlbHNlIGlmICgobWRtY2FwYXMgJiBDS0RfREMpICYmICoobXAtPmRjX29uX3N0cikpIHsKKwkJeCA9IDE7CisJCXR0c2xvdyhtcC0+ZGNfb25fc3RyLCB3cik7CisJICAgIH0KKyNpZmRlZiBDT01NRU5UCisJICAgIGVsc2UgcHJpbnRmKAorCQkgICJXQVJOSU5HIC0gSSBkb24ndCBrbm93IGhvdyB0byB0dXJuIG9uIERDIGZvciB0aGlzIG1vZGVtXG4iCisJCQkgICk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCX0gZWxzZSB7CisJICAgIGlmIChkaWFsZGNvZmYpIHsKKwkJaWYgKCpkaWFsZGNvZmYpIHsKKwkJICAgIHggPSAxOworCQkgICAgdHRzbG93KGRpYWxkY29mZiwgd3IpOworCQl9CisJICAgIH0gZWxzZSBpZiAoKG1kbWNhcGFzICYgQ0tEX0RDKSAmJiAqKG1wLT5kY19vZmZfc3RyKSkgeworCQl4ID0gMTsKKwkJdHRzbG93KG1wLT5kY19vZmZfc3RyLCB3cik7CisJICAgIH0KKyNpZmRlZiBDT01NRU5UCisJICAgIGVsc2UgcHJpbnRmKAorIldBUk5JTkcgLSBJIGRvbid0IGtub3cgaG93IHRvIHR1cm4gb2ZmIGNvbXByZXNzaW9uIGZvciB0aGlzIG1vZGVtXG4iCisJCQkgICk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCX0KKwlpZiAoeCAmJiB4eF9vaykgewkJCS8qIExvb2sgZm9yIE9LIHJlc3BvbnNlICovCisJICAgIHggPSAoKnh4X29rKSg1LDEpOworCSAgICBpZiAoeCA8IDApIHByaW50ZigiV0FSTklORyAtIFRyb3VibGUgZW5hYmxpbmcgY29tcHJlc3Npb25cbiIpOworCX0KKyAgICB9CisKKyNpZm5kZWYgTk9YRkVSCisjaWZuZGVmIE1JTklESUFMCisgICAgaWYgKG1kbWNhcGFzICYgQ0tEX0tTICYmIGRpYWxzdGEgIT0gRElBX1BBUlQpIHsgLyogS2VybWl0IHNwb29mICovCisJaW50IHI7CQkJCS8qIFJlZ2lzdGVyICovCisJY2hhciB0YmNtZGJ1Zls2NF07CQkvKiBDb21tYW5kIGJ1ZmZlciAqLworCXN3aXRjaCAobXltZG10eXApIHsKKworCSAgY2FzZSBuX01JQ1JPQ09NOgkJLyogTWljcm9jb21zIGluIFNYIG1vZGUgKi8KKyAgCSAgICBpZiAoZGlhbGtzcCkKKwkgICAgICBzcHJpbnRmKHRiY21kYnVmLCJBUE0xO0tNQyVkXDAxNSIsc3RjaHIpOwkvKiBzYWZlICovCisJICAgIGVsc2UKKwkgICAgICBzcHJpbnRmKHRiY21kYnVmLCJBUE0wXDAxNSIpOyAvKiBzYWZlICovCisgIAkgICAgdHRzbG93KHRiY21kYnVmLCBNSUNST0NPTS53YWtlX3JhdGUpOworICAJICAgIGFsYXJtKDMpOworCSAgICB3YWl0Zm9yKG1wLT53YWtlX3Byb21wdCk7CisJICAgIGFsYXJtKDApOworCSAgICBicmVhazsKKworCSAgY2FzZSBuX1RFTEVCSVQ6CQkvKiBPbGQgYW5kIG5ldyBUZWxlYml0cyAqLworCSAgY2FzZSBuX1RCTkVXOgorCSAgICBpZiAoIWRpYWxrc3ApIHsKKwkJc3ByaW50Zih0YmNtZGJ1ZiwiQVRTMTExPTBcMDE1Iik7IC8qIHNhZmUgKi8KKwkgICAgfSBlbHNlIHsKKwkJc3dpdGNoIChwYXJpdHkpIHsJLyogUzExMSB2YWx1ZSBkZXBlbmRzIG9uIHBhcml0eSAqLworCQkgIGNhc2UgJ2UnOiByID0gMTI7IGJyZWFrOworCQkgIGNhc2UgJ20nOiByID0gMTM7IGJyZWFrOworCQkgIGNhc2UgJ28nOiByID0gMTE7IGJyZWFrOworCQkgIGNhc2UgJ3MnOiByID0gMTQ7IGJyZWFrOworCQkgIGNhc2UgMDoKKwkJICBkZWZhdWx0OiAgciA9IDEwOyBicmVhazsKKwkJfQorCQlzcHJpbnRmKHRiY21kYnVmLCJBVFMxMTE9JWQgUzExMj0lZFwwMTUiLHIsc3RjaHIpOyAvKiBzYWZlICovCisJICAgIH0KKwkgICAgdHRzbG93KHRiY21kYnVmLCB3cik7CisKKy8qIE5vdCBhbGwgVGVsZWJpdCBtb2RlbHMgaGF2ZSB0aGUgS2VybWl0IHNwb29mLCBzbyBpZ25vcmUgcmVzcG9uc2UuICovCisKKwkgICAgaWYgKHh4X29rKSB7CQkvKiBHZXQgbW9kZW0ncyByZXNwb25zZSAqLworCQl4ID0gKCp4eF9vaykoNSwxKTsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYgLyogTUlOSURJQUwgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworICAgIC8qIFNwZWFrZXIgKi8KKworICAgIGlmIChteW1kbXR5cCAhPSBuX0dFTkVSSUMgJiYKKwkobWRtY2FwYXMgJiBDS0RfQVQpICYmIChkaWFsc3RhICE9IERJQV9QQVJUKSAmJgorCSFkaWFsc3BvbiAmJiAhZGlhbHNwb2ZmICYmCisJIWRpYWx2b2wxICYmICFkaWFsdm9sMiAmJiFkaWFsdm9sMykgeworCS8qIEFUIGNvbW1hbmQgc2V0IGFuZCBjb21tYW5kcyBoYXZlIG5vdCBiZWVuIGN1c3RvbWl6ZWQgKi8KKwkvKiBzbyBjb21iaW5lIHNwZWFrZXIgYW5kIHZvbHVtZSBjb21tYW5kcy4gKi8KKwlpZiAobWRtc3BrKQorCSAgc3ByaW50ZihsYnVmLCJBVE0xTCVkJWMiLG1kbXZvbCwxMyk7IC8qIHNhZmUgKi8KKwllbHNlCisJICBzcHJpbnRmKGxidWYsIkFUTTAlYyIsMTMpOwkvKiBzYWZlICovCisJdHRzbG93KGxidWYsd3IpOwkJLyogU2VuZCBjb21tYW5kICovCisJZ2V0b2soNSwxKTsJCQkvKiBHZXQgYnV0IGlnbm9yZSByZXNwb25zZSAqLworICAgIH0gZWxzZSBpZiAoZGlhbHN0YSAhPSBESUFfUEFSVCkgewkvKiBDdXN0b21pemVkIG9yIG5vdCBBVCBjb21tYW5kcyAqLworCXggPSAwOwkJCQkvKiBEbyBpdCB0aGUgaGFyZCB3YXkgKi8KKwlpZiAobWRtc3BrKSB7CisJICAgIGlmIChkaWFsc3BvbikgeworCQlpZiAoKmRpYWxzcG9uKSB7CisJCSAgICB4ID0gMTsKKwkJICAgIHR0c2xvdyhkaWFsc3Bvbix3cik7CisJCX0KKwkgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobXAtPnNwX29uX3N0clswXSkgeworCQkgICAgeCA9IDE7CisJCSAgICB0dHNsb3cobXAtPnNwX29uX3N0cix3cik7CisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIC8qIHMgPSBkaWFsc3BvZmYgPyBkaWFsc3BvZmYgOiBtcC0+c3Bfb2ZmX3N0cjsgKi8KKwkgICAgaWYgKGRpYWxzcG9mZikgeworCQlpZiAoKmRpYWxzcG9mZikgeworCQkgICAgeCA9IDE7CisJCSAgICB0dHNsb3coZGlhbHNwb2ZmLHdyKTsKKwkJfQorCSAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtcC0+c3Bfb2ZmX3N0clswXSkgeworCQkgICAgeCA9IDE7CisJCSAgICB0dHNsb3cobXAtPnNwX29mZl9zdHIsd3IpOworCQl9CisJICAgIH0KKwl9CisJaWYgKHgpIHsKKwkgICAgaWYgKHh4X29rKQkJCS8qIEdldCByZXNwb25zZSAqLworCSAgICAgIHggPSAoKnh4X29rKSg1LDEpOworCSAgICBpZiAoeCAmJiBtZG1zcGspIHsJCS8qIEdvb2QgcmVzcG9uc2UgYW5kIHNwZWFrZXIgb24/ICovCisJCXN3aXRjaCAobWRtdm9sKSB7CS8qIFllcywgc2VuZCB2b2x1bWUgY29tbWFuZC4gKi8KKwkJICBjYXNlIDA6CisJCSAgY2FzZSAxOgorCQkgICAgcyA9IGRpYWx2b2wxID8gZGlhbHZvbDEgOiBtcC0+dm9sMV9zdHI7IGJyZWFrOworCQkgIGNhc2UgMjoKKwkJICAgIHMgPSBkaWFsdm9sMiA/IGRpYWx2b2wyIDogbXAtPnZvbDJfc3RyOyBicmVhazsKKwkJICBjYXNlIDM6CisJCSAgICBzID0gZGlhbHZvbDMgPyBkaWFsdm9sMyA6IG1wLT52b2wzX3N0cjsgYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJICAgIHMgPSBOVUxMOworCQl9CisJCWlmIChzKSBpZiAoKnMpIHsJLyogU2VuZCB2b2x1bWUgY29tbWFuZC4gKi8KKwkJICAgIHR0c2xvdyhzLCB3cik7CisJCSAgICBpZiAoeHhfb2spCQkvKiBHZXQgcmVzcG9uc2UgYnV0IGlnbm9yZSBpdCAqLworCQkgICAgICAoKnh4X29rKSg1LDEpOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisjaWZuZGVmIENLX0FURFQKKyAgICAvKiBEaWFsaW5nIE1ldGhvZCAqLworCisgICAgaWYgKGRpYWxtdGggJiYgZGlhbHN0YSAhPSBESUFfUEFSVCkgeyAvKiBJZiBkaWFsaW5nIG1ldGhvZCBzcGVjaWZpZWQuLi4gKi8KKwljaGFyICpzID0gIiI7CQkJLyogRG8gaXQgaGVyZS4uLiAqLworCisJaWYgKGRpYWxtdGggPT0gWFlETV9UICYmIGRpYWx0b25lKSAvKiBUb25lICovCisJICBzID0gZGlhbHRvbmU7CisJZWxzZSBpZiAoZGlhbG10aCA9PSBYWURNX1AgJiYgZGlhbHB1bHNlKSAvKiBQdWxzZSAqLworCSAgcyA9IGRpYWxwdWxzZTsKKwlpZiAocykgaWYgKCpzKSB7CisJICAgIHR0c2xvdyhzLCB3cik7CisJICAgIGlmICh4eF9vaykJCQkvKiBHZXQgbW9kZW0ncyByZXNwb25zZSAqLworCSAgICAgICgqeHhfb2spKDUsMSk7CQkvKiAoYnV0IGlnbm9yZSBpdC4uLikgKi8KKwl9CisgICAgfQorI2VuZGlmIC8qIENLX0FURFQgKi8KKworICAgIGlmIChkaWFsaWR0KSB7CQkJLyogSWdub3JlIGRpYWx0b25lPyAqLworCWNoYXIgKnMgPSAiIjsKKwlzID0gZGlhbHgzID8gZGlhbHgzIDogbXAtPmlnbm9yZWR0OworCWlmIChzKSBpZiAoKnMpIHsKKwkgICAgdHRzbG93KHMsIHdyKTsKKwkgICAgaWYgKHh4X29rKQkJCS8qIEdldCBtb2RlbSdzIHJlc3BvbnNlICovCisJICAgICAgKCp4eF9vaykoNSwxKTsJCS8qIChidXQgaWdub3JlIGl0Li4uKSAqLworCX0KKyAgICB9CisgICAgeworCWNoYXIgKnMgPSAiIjsJCQkvKiBMYXN0LW1pbnV0ZSBpbml0IHN0cmluZz8gKi8KKwlzID0gZGlhbGluaTIgPyBkaWFsaW5pMiA6IG1wLT5pbmkyOworCWlmIChzKSBpZiAoKnMpIHsKKwkgICAgdHRzbG93KHMsIHdyKTsKKwkgICAgaWYgKHh4X29rKQkJCS8qIEdldCBtb2RlbSdzIHJlc3BvbnNlICovCisJICAgICAgKCp4eF9vaykoNSwxKTsJCS8qIChidXQgaWdub3JlIGl0Li4uKSAqLworCX0KKyAgICB9CisgICAgaWYgKGZ1bmNfY29kZSA9PSAxKSB7CQkvKiBBTlNXRVIgKG5vdCBESUFMKSAqLworCWNoYXIgKnM7CisJcyA9IGRpYWxhYW9uID8gZGlhbGFhb24gOiBtcC0+YWFfb25fc3RyOworCWlmICghcykgcyA9ICIiOworCWlmICgqcykgeworCSAgICAvKiBIZXJlIHdlIHdvdWxkIGhhbmRsZSBjYWxsZXIgSUQgKi8KKwkgICAgdHRzbG93KHMsIChkaWFscGFjZSA+IC0xKSA/IHdyIDogbXAtPmRpYWxfcmF0ZSk7CisJICAgIGlmICh4eF9vaykJCQkvKiBHZXQgbW9kZW0ncyByZXNwb25zZSAqLworCSAgICAgICgqeHhfb2spKDUsMSk7CQkvKiAoYnV0IGlnbm9yZSBpdC4uLikgKi8KKwl9IGVsc2UgeworCSAgICBwcmludGYoCisiV0FSTklORyAtIEkgZG9uJ3Qga25vdyBob3cgdG8gZW5hYmxlIGF1dG9hbnN3ZXIgZm9yIHRoaXMgbW9kZW0uXG4iCisJCSAgICk7CisJfSAvKiBBbmQgc2tpcCBhbGwgdGhlIHBob25lLW51bWJlciAmIGRpYWxpbmcgc3R1ZmYuLi4gKi8KKwlhbGFybSh3YWl0Y3QpOwkJCS8qIFRoaXMgbXVjaCB0aW1lIGFsbG93ZWQuICovCisJZGVidWcoRjEwMSwiX2RvZGlhbCBBTlNXRVIgd2FpdGN0IiwiIix3YWl0Y3QpOworCisgICAgfSBlbHNlIHsJCQkJLyogRElBTCAobm90IEFOU1dFUikgKi8KKworCWlmIChkaWFsc3RhICE9IERJQV9QQVJUKSB7CS8qIExhc3QgZGlhbCB3YXMgbm90IHBhcnRpYWwgKi8KKworCSAgICBjaGFyICpzID0gIiI7CisjaWZkZWYgQ09NTUVOVAorCSAgICBzID0gZGlhbGFhb2ZmID8gZGlhbGFhb2ZmIDogbXAtPmFhX29mZl9zdHI7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCSAgICBpZiAocykgaWYgKCpzKSB7CisJCXR0c2xvdyhzLCAoZGlhbHBhY2UgPiAtMSkgPyB3ciA6IG1wLT5kaWFsX3JhdGUpOworCQlpZiAoeHhfb2spCQkvKiBHZXQgbW9kZW0ncyByZXNwb25zZSAqLworCQkgICgqeHhfb2spKDUsMSk7CS8qIChidXQgaWdub3JlIGl0Li4uKSAqLworCSAgICB9CisKKwkgICAgLyogUHV0IG1vZGVtIGludG8gZGlhbGluZyBtb2RlLCBpZiB0aGUgbW9kZW0gcmVxdWlyZXMgaXQuICovCisKKwkgICAgaWYgKG1wLT5kbW9kZV9zdHIgJiYgKihtcC0+ZG1vZGVfc3RyKSkgeworCQl0dHNsb3cobXAtPmRtb2RlX3N0ciwgKGRpYWxwYWNlID4gLTEpID8gd3IgOiBtcC0+ZGlhbF9yYXRlKTsKKwkJc2F2YWxybSA9IHNpZ25hbChTSUdBTFJNLGRpYWx0aW1lKTsKKwkJYWxhcm0oMTApOworCQkvKiBXYWl0IGZvciBwcm9tcHQsIGlmIGFueSBleHBlY3RlZCAqLworCQlpZiAobXAtPmRtb2RlX3Byb21wdCAmJiAqKG1wLT5kbW9kZV9wcm9tcHQpKSB7CisJCSAgICB3YWl0Zm9yKG1wLT5kbW9kZV9wcm9tcHQpOworCQkgICAgbXNsZWVwKDMwMCk7CisJCX0KKwkJYWxhcm0oMCk7CQkvKiBUdXJuIG9mZiBhbGFybSBvbiBkaWFsaW5nIHByb21wdHMgKi8KKwkJc2lnbmFsKFNJR0FMUk0sc2F2YWxybSk7IC8qIFJlc3RvcmUgYWxhcm0gKi8KKwkgICAgfQorCX0KKwkvKiBBVC1Db21tYW5kLVNldCBub24tR2VuZXJpYyBtb2RlbSAqLworCWlmIChtZG1jYXBhcyAmIENLRF9BVCAmJiBteW1kbXR5cCAhPSBuX0dFTkVSSUMgJiYKKwkgICAgZGlhbHN0YSAhPSBESUFfUEFSVCkgeworCSAgICBpZiAobWRtd2FpdCA+IDI1NSkJCS8qIElmIGxhcmdlciB0aGFuIG1heGltdW0sICovCisJICAgICAgbWRtd2FpdCA9IDI1NTsJCS8qIG1ha2UgaXQgbWF4aW11bS4gKi8KKwkgICAgaWYgKGRpYWxlc2MgPiAwICYmCQkvKiBNb2RlbSBlc2NhcGUgY2hhcmFjdGVyIGlzIHNldCAqLworCQlkaWFsbWh1ID4gMCkgewkJLyogSGFuZ3VwIG1ldGhvZCBpcyBtb2RlbSBjb21tYW5kICovCisJCWludCB4ID0gZGlhbGVzYzsKKwkJaWYgKGRpYWxlc2MgPCAwIHx8IGRpYWxlc2MgPiAxMjcpCisJCSAgeCA9IDEyODsKKwkJc3ByaW50ZihsYnVmLAorCQkJIkFUUzI9JWRTNz0lZFwwMTUiLAorCQkJZGlhbGVzYyA/IHggOiBtcC0+ZXNjX2NoYXIsIG1kbXdhaXQpOyAvKiBzYWZlICovCisJICAgIH0gZWxzZQorCSAgICAgIHNwcmludGYobGJ1ZiwiQVRTNz0lZCVjIixtZG13YWl0LDEzKTsgLyogc2FmZSAqLworCSAgICB0dHNsb3cobGJ1Zix3cik7CQkvKiBTZXQgaXQuICovCisJICAgIG1kbXN0YXQgPSBnZXRvayg1LDEpOwkvKiBHZXQgcmVzcG9uc2UgZnJvbSBtb2RlbSAqLworCSAgICAvKiBJZiBpdCBnZXRzIGFuIGVycm9yLCBnbyBhaGVhZCBhbnl3YXkgKi8KKwkgICAgZGVidWcoRjEwMSwiX2RvZGlhbCBTNyBtZG1zdGF0IiwiIixtZG1zdGF0KTsKKwl9CisJdHRmbHVpKCk7CQkJLyogQ2xlYXIgb3V0IHN0dWZmIGZyb20gbW9kZW0gc2V0dXAgKi8KKwlpbml0ZWQgPSAxOwkJCS8qIFJlbWVtYmVyIG1vZGVtIGlzIGluaXRpYWxpemVkICovCisKKyAgICAgIFJFRElBTDoKKwlpZiAoKGludClzdHJsZW4oZGNtZCkgKyAoaW50KXN0cmxlbih4bnVtKSA+IExCVUZMKQorCSAgY2tzdHJuY3B5KGxidWYsIk5VTUJFUiBUT08gTE9ORyEiLExCVUZMKTsKKwllbHNlCisJICBzcHJpbnRmKGxidWYsIGRjbWQsIHhudW0pOwkvKiBzYWZlIChwcmVjaGVja2VkKSAqLworCWRlYnVnKEYxMTAsImRpYWxpbmciLGxidWYsMCk7CisJLyogU2VuZCB0aGUgZGlhbGluZyBzdHJpbmcgKi8KKwl0dHNsb3cobGJ1ZixkaWFscGFjZSA+IC0xID8gd3IgOiBtcC0+ZGlhbF9yYXRlKTsKKworCWZhaWxfY29kZSA9IEZfTU9ERU07CQkvKiBOZXcgZGVmYXVsdCBmYWlsdXJlIGNvZGUgY2hhbmdlcyAqLworCWRpYWxfd2hhdCA9IERXX0RJQUw7CQkvKiBhbmQgb3VyIHN0YXRlLCB0b28uICovCisJaWYgKGRpYWxkcHkpIHsJCQkvKiBJZiBzaG93aW5nIHByb2dyZXNzICovCisJICAgIHAgPSBja190aW1lKCk7CQkvKiBnZXQgY3VycmVudCB0aW1lOyAqLworCSAgICBpZiAoKnApIHByaW50ZigiIERpYWxpbmc6ICVzLi4uXG4iLHApOworI2lmZGVmIFZNUworCSAgICBwcmludGYoIiBcbiIpOworCSAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZiAvKiBWTVMgKi8KKwl9CisJYWxhcm0od2FpdGN0KTsJCQkvKiBUaGlzIG11Y2ggdGltZSBhbGxvd2VkLiAqLworCWRlYnVnKEYxMDEsIl9kb2RpYWwgd2FpdGN0IiwiIix3YWl0Y3QpOworCisjaWZuZGVmIE1JTklESUFMCisjaWZkZWYgT0xETU9ERU1TCisJc3dpdGNoIChteW1kbXR5cCkgeworCSAgY2FzZSBuX1JBQ0FMOgkJCS8qIEFja25vd2xlZGdlIGRpYWxpbmcgc3RyaW5nICovCisJICAgIHNsZWVwKDMpOworCSAgICB0dGZsdWkoKTsKKwkgICAgdHRvYygnXDAxNScpOworCSAgICBicmVhazsKKwkgIGNhc2Ugbl9WRU5URUw6CisJICAgIHdhaXRmb3IoIlwwMTJcMDEyIik7CS8qIElnbm9yZSB0aGUgZmlyc3QgdHdvIHN0cmluZ3MgKi8KKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBicmVhazsKKwl9CisjZW5kaWYgLyogT0xETU9ERU1TICovCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKyAgICB9CisKKy8qIENoZWNrIGZvciBjb25uZWN0aW9uICovCisKKyAgICBtZG1zdGF0ID0gMDsJCQkvKiBObyBzdGF0dXMgeWV0ICovCisgICAgbGJ1ZlswXSA9IE5VTDsJCQkvKiBEZWZhdWx0IHJlYXNvbiBmb3IgZmFpbHVyZSAqLworICAgIGRlYnVnKEYxMDEsImRpYWwgYXdhaXRpbmcgcmVzcG9uc2UsIG15bWRtdHlwIiwiIixteW1kbXR5cCk7CisKKyNpZm5kZWYgTk9TUEwKKyAgICBtb2RlbW1zZ1swXSA9IE5VTDsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHdoaWxlIChtZG1zdGF0ID09IDApIHsJCS8qIFRpbGwgd2UgZ2V0IGEgcmVzdWx0IG9yIHRpbWUgb3V0ICovCisKKwlpZiAoKG1kbWNhcGFzICYgQ0tEX0FUKSAmJiBub252ZXJiYWwpIHsgLyogQVQgY29tbWFuZCBzZXQgKi8KKwkgICAgZ2V0aHJuKCk7CQkJLyogSW4gZGlnaXQgcmVzdWx0IG1vZGUgKi8KKwkgICAgaWYgKHBhcnRpYWwgJiYgZGlhbHN0YSA9PSBESUFfRVJSKSB7CisJCS8qCisJCSAgIElmIHdlIGdldCBhbiBlcnJvciBoZXJlLCB0aGUgcGhvbmUgaXMgc3RpbGwKKwkJICAgb2ZmIGhvb2sgc28gd2UgaGF2ZSB0byBoYW5nIGl0IHVwLgorCQkqLworCQlkaWFsaHVwKCk7CisJCWRpYWxzdGEgPSBESUFfRVJSOwkvKiAoYmVjYXVzZSBkaWFsaHVwKCkgY2hhbmdlcyBpdCkgKi8KKwkgICAgfQorCSAgICBjb250aW51ZTsKKworCX0gZWxzZSBpZiAobXltZG10eXAgPT0gbl9VTktOT1dOKSB7IC8qIFVua25vd24gbW9kZW0gdHlwZSAqLworCSAgICBpbnQgeCwgeSA9IHdhaXRjdDsKKwkgICAgbWRtc3RhdCA9IERfRkFJTEVEOwkJLyogQXNzdW1lIGZhaWx1cmUuICovCisJICAgIHdoaWxlICh5LS0gPiAtMSkgeworCQl4ID0gdHRjaGsoKTsKKwkJaWYgKHggPiAwKSB7CisJCSAgICBpZiAoeCA+IExCVUZMKSB4ID0gTEJVRkw7CisJCSAgICB4ID0gdHR4aW4oeCwoQ0hBUiAqKWxidWYpOworCQkgICAgaWYgKCh4ID4gMCkgJiYgZGlhbGRweSkgY29ub2wobGJ1Zik7CisJCX0gZWxzZSBpZiAobmV0d29yayAKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXN0bmNvbXBvcnQoKQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHggPCAwKSB7IC8qIENvbm5lY3Rpb24gZHJvcHBlZCAqLworCQkgICAgaW5pdGVkID0gMDsKKyNpZmRlZiBOVFNJRworCQkgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKwkJICAgIGRpYWxzdGEgPSBESUFfSU87CS8qIENhbGwgaXQgYW4gSS9PIGVycm9yICovCisjaWZkZWYgRFlOQU1JQworCQkgICAgaWYgKHJidWYpIGZyZWUocmJ1Zik7IHJidWYgPSBOVUxMOworCQkgICAgaWYgKGZidWYpIGZyZWUoZmJ1Zik7IGZidWYgPSBOVUxMOworI2VuZGlmIC8qIERZTkFNSUMgKi8KKwkJICAgIFNJR1JFVFVSTjsKKwkJfQorCQl4ID0gdHRnbWRtKCk7CQkvKiBUcnkgdG8gcmVhZCBtb2RlbSBzaWduYWxzICovCisJCWlmICh4IDwgMCkgYnJlYWs7CS8qIENhbid0LCBmYWlsLiAqLworCQlpZiAoeCAmIEJNX0RDRCkgewkvKiBHb3Qgc2lnbmFscyBPSy4gIENhcnJpZXIgcHJlc2VudD8gKi8KKwkJICAgIG1kbXN0YXQgPSBDT05ORUNURUQ7IC8qIFllcywgZG9uZS4gKi8KKwkJICAgIGJyZWFrOworCQl9CQkJLyogTm8sIGtlZXAgd2FpdGluZy4gKi8KKwkJc2xlZXAoMSk7CisJICAgIH0KKwkgICAgY29udGludWU7CisJfQorCisJZm9yIChuID0gLTE7IG4gPCBMQlVGTC0xOyApIHsJLyogQWNjdW11bGF0ZSBtb2RlbSByZXNwb25zZSAqLworCSAgICBpbnQgeHg7CisJICAgIGMyID0gKGNoYXIpICh4eCA9IGRkaW5jKDApKTsgLyogUmVhZCBhIGNoYXJhY3RlciwgYmxvY2tpbmcgKi8KKwkgICAgaWYgKHh4IDwgMSkJCQkvKiBJZ25vcmUgTlVMcyBhbmQgZXJyb3JzICovCisJICAgICAgY29udGludWU7CQkJLyogKFRpbWVvdXQgd2lsbCBoYW5kbGUgZXJyb3JzKSAqLworCSAgICBlbHNlCQkJLyogUmVhbCBjaGFyYWN0ZXIsIGtlZXAgaXQgKi8KKwkgICAgICBsYnVmWysrbl0gPSAoY2hhcikgKGMyICYgMDE3Nyk7CisJICAgIGRpYWxvYyhsYnVmW25dKTsJCS8qIE1heWJlIGVjaG8gaXQgICovCisJICAgIGlmIChtZG1jYXBhcyAmIENLRF9WMjUpIHsJLyogVi4yNWJpcyBkaWFsaW5nLi4uICovCisvKgorICBUaGlzIGFzc3VtZXMgdGhhdCBWLjI1YmlzIGluZGljYXRpb25zIGFyZSBhbGwgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzIGxvbmcKKyAgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGVpdGhlciBDUkxGIG9yIExGQ1IuCisqLworCQlpZiAobXltZG10eXAgPT0gbl9DQ0lUVCkgeworCQkgICAgaWYgKG4gPCAzKSBjb250aW51ZTsKKwkJICAgIGlmICgobGJ1ZltuXSA9PSBDUikgJiYgKGxidWZbbi0xXSA9PSBMRikpIGJyZWFrOworCQkgICAgaWYgKChsYnVmW25dID09IExGKSAmJiAobGJ1ZltuLTFdID09IENSKSkgYnJlYWs7CisJCX0KKyNpZm5kZWYgTUlOSURJQUwKKwkJZWxzZSBpZiAobXltZG10eXAgPT0gbl9ESUdJVEVMKSB7CisJCSAgICBpZiAoKChsYnVmW25dID09IENSKSAmJiAobGJ1ZltuLTFdID09IExGKSkgfHwKKwkJCSgobGJ1ZltuXSA9PSBMRikgJiYgKGxidWZbbi0xXSA9PSBDUikpKQorCQkgICAgICBicmVhazsKKwkJICAgIGVsc2UKKwkJICAgICAgY29udGludWU7CisJCX0KKyNlbmRpZiAvKiBNSU5JRElBTCAqLworCSAgICB9IGVsc2UgewkJCS8qIEFsbCBvdGhlcnMsIGJyZWFrIG9uIENSIG9yIExGICovCisJCWlmICggbGJ1ZltuXSA9PSBDUiB8fCBsYnVmW25dID09IExGICkgYnJlYWs7CisJICAgIH0KKwl9CisJbGJ1ZlsrK25dID0gJ1wwJzsJCS8qIFRlcm1pbmF0ZSByZXNwb25zZSBmcm9tIG1vZGVtICovCisJZGVidWcoRjExMSwiX2RvZGlhbCBtb2RlbSByZXNwb25zZSIsbGJ1ZixuKTsKKyNpZm5kZWYgTk9TUEwKKwlja3N0cm5jcHkobW9kZW1tc2csbGJ1ZixMQlVGTCk7CS8qIENhbGwgcmVzdWx0IG1lc3NhZ2UgKi8KKwlsYnVmWzc5XSA9IE5VTDsKKwl7CisJICAgIGludCB4OwkJCS8qIFN0cmlwIGp1bmsgZnJvbSBlbmQgKi8KKwkgICAgeCA9IChpbnQpc3RybGVuKG1vZGVtbXNnKSAtIDE7CisJICAgIHdoaWxlICh4ID4gLTEpIHsKKwkJaWYgKG1vZGVtbXNnW3hdIDwgKGNoYXIpIDMzKQorCQkgIG1vZGVtbXNnW3hdID0gTlVMOworCQllbHNlCisJCSAgYnJlYWs7CisJCXgtLTsKKwkgICAgfQorCX0KKyNlbmRpZiAvKiBOT1NQTCAqLworCWlmIChtZG1jYXBhcyAmIENLRF9BVCkgewkvKiBIYXllcyBBVCBjb21tYW5kIHNldCAqLworCSAgICBnZXRocncoKTsJCQkvKiBpbiB3b3JkIHJlc3VsdCBtb2RlICovCisJICAgIGlmIChwYXJ0aWFsICYmIGRpYWxzdGEgPT0gRElBX0VSUikgeworCQlkaWFsaHVwKCk7CisJCWRpYWxzdGEgPSBESUFfRVJSOwkvKiAoYmVjYXVzZSBkaWFsaHVwKCkgY2hhbmdlcyBpdCkgKi8KKwkgICAgfQorCSAgICBjb250aW51ZTsKKwl9IGVsc2UgaWYgKG1kbWNhcGFzICYgQ0tEX1YyNSkgeyAvKiBDQ0lUVCBjb21tYW5kIHNldCAqLworCSAgICBpZiAoZGlkd2VnZXQobGJ1ZiwiVkFMIikpIHsgLyogRGlhbCBjb21tYW5kIGNvbmZpcm1hdGlvbiAqLworI2lmbmRlZiBNSU5JRElBTAorCQlpZiAobXltZG10eXAgPT0gbl9DQ0lUVCkKKyNlbmRpZiAvKiBNSU5JRElBTCAqLworCQkgIGNvbnRpbnVlOwkJLyogR28gYmFjayBhbmQgcmVhZCBtb3JlICovCisjaWZuZGVmIE1JTklESUFMCisvKiBEaWdpdGVsIGRvZXNuJ3QgZ2l2ZSBhbiBleHBsaWNpdCBjb25uZWN0IGNvbmZpcm1hdGlvbiBtZXNzYWdlICovCisJCWVsc2UgeworCQkgICAgaW50IG47CisJCSAgICBmb3IgKG4gPSAtMTsgbiA8IExCVUZMLTE7ICkgeworCQkJbGJ1ZlsrK25dID0gYzIgPSAoY2hhcikgKGRkaW5jKDApICYgMDE3Nyk7CisJCQlkaWFsb2MobGJ1ZltuXSk7CisJCQlpZiAoKChsYnVmW25dID09IENSKSAmJiAobGJ1ZltuLTFdID09IExGKSkgfHwKKwkJCSAgICAoKGxidWZbbl0gPT0gTEYpICYmIChsYnVmW24tMV0gPT0gQ1IpKSkKKwkJCSAgYnJlYWs7CisJCSAgICB9CisJCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOyAvKiBBc3N1bWUgd2UncmUgY29ubmVjdGVkICovCisJCSAgICBpZiAoZGlhbGRweSAmJiBjYXJyaWVyICE9IENBUl9PRkYpIHsKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXN0bmNvbXBvcnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiVE4gQ29tIFBvcnQgRENEIHdhaXQuLi4iLCIiLDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG4gPSB0dGdtZG0oKSkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuICYgQk1fRENEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zbGVlcCg1MDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5jX3dhaXQoCisJCQkJCShDSEFSICopIl9kb2RpYWwgd2FpdGluZyBmb3IgRENEIiwxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKwkJCSAgc2xlZXAoMSk7IAkvKiBXYWl0IGEgc2Vjb25kICovCisJCQluID0gdHRnbWRtKCk7CS8qIFRyeSB0byByZWFkIG1vZGVtIHNpZ25hbHMgKi8KKwkJCWlmICgobiA+IC0xKSAmJiAoKG4gJiBCTV9EQ0QpID09IDApKQorCQkJICBwcmludGYoIldBUk5JTkcgLSBubyBjYXJyaWVyXG4iKTsKKwkJICAgIH0KKwkJfQorI2VuZGlmIC8qIE1JTklESUFMICovCisKKwkJLyogU3RhbmRhcmQgVi4yNWJpcyBzdHVmZiAqLworCisJICAgIH0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiQ05YIikpIHsgLyogQ29ubmVjdGVkICovCisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwgIklOViIpKSB7CisJCW1kbXN0YXQgPSBEX0ZBSUxFRDsJLyogQ29tbWFuZCBlcnJvciAqLworCQlkaWFsc3RhID0gRElBX0VSUjsKKwkJY2tzdHJuY3B5KGxidWYsIklOViIsTEJVRkwpOworCisJICAgIH0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiQ0ZJIikpIHsgLyogQ2FsbCBGYWlsdXJlICovCisKKwkJaWYgKGRpZHdlZ2V0KGxidWYsIkFCIikpIHsgLyogSW50ZXJwcmV0IHJlYXNvbiBjb2RlICovCisJCSAgICBja3N0cm5jcHkobGJ1ZiwiQUI6IFRpbWVkIG91dCIsTEJVRkwpOworCQkgICAgZGlhbHN0YSA9IERJQV9USU1POworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkNCIikpIHsKKwkJICAgIGNrc3RybmNweShsYnVmLCJDQjogTG9jYWwgRENFIEJ1c3kiLExCVUZMKTsKKwkJICAgIGRpYWxzdGEgPSBESUFfTlJEWTsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJFVCIpKSB7CisJCSAgICBja3N0cm5jcHkobGJ1ZiwiRVQ6IEJ1c3kiLExCVUZMKTsKKwkJICAgIGRpYWxzdGEgPSBESUFfQlVTWTsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCAiTlMiKSkgeworCQkgICAgY2tzdHJuY3B5KGxidWYsIk5TOiBOdW1iZXIgbm90IHN0b3JlZCIsTEJVRkwpOworCQkgICAgZGlhbHN0YSA9IERJQV9FUlI7CisJCX0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiTlQiKSkgeworCQkgICAgY2tzdHJuY3B5KGxidWYsIk5UOiBObyBhbnN3ZXIiLExCVUZMKTsKKwkJICAgIGRpYWxzdGEgPSBESUFfTk9BTjsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJSVCIpKSB7CisJCSAgICBja3N0cm5jcHkobGJ1ZiwiUlQ6IFJpbmcgdG9uZSIsTEJVRkwpOworCQkgICAgZGlhbHN0YSA9IERJQV9SSU5HOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIlBWIikpIHsKKwkJICAgIGNrc3RybmNweShsYnVmLCJQVjogUGFyYW1ldGVyIHZhbHVlIGVycm9yIixMQlVGTCk7CisJCSAgICBkaWFsc3RhID0gRElBX0VSUjsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJQUyIpKSB7CisJCSAgICBja3N0cm5jcHkobGJ1ZiwiUFM6IFBhcmFtZXRlciBzeW50YXggZXJyb3IiLExCVUZMKTsKKwkJICAgIGRpYWxzdGEgPSBESUFfRVJSOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIk1TIikpIHsKKwkJICAgIGNrc3RybmNweShsYnVmLCJNUzogTWVzc2FnZSBzeW50YXggZXJyb3IiLExCVUZMKTsKKwkJICAgIGRpYWxzdGEgPSBESUFfRVJSOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkNVIikpIHsKKwkJICAgIGNrc3RybmNweShsYnVmLCJDVTogQ29tbWFuZCB1bmtub3duIixMQlVGTCk7CisJCSAgICBkaWFsc3RhID0gRElBX0VSUjsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJGQyIpKSB7CisJCSAgICBja3N0cm5jcHkobGJ1ZiwiRkM6IEZvcmJpZGRlbiBjYWxsIixMQlVGTCk7CisJCSAgICBkaWFsc3RhID0gRElBX05PQUM7CisJCX0KKwkJbWRtc3RhdCA9IERfRkFJTEVEOworCSAgICB9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIklOQyIpKSB7IC8qIEluY29taW5nIENhbGwgKi8KKwkJY2tzdHJuY3B5KGxidWYsIklOQzogSW5jb21pbmcgY2FsbCIsTEJVRkwpOworCQlkaWFsc3RhID0gRElBX1JJTkc7CisJCW1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJETEMiKSkgeyAvKiBEZWxheWVkIENhbGwgKi8KKwkJY2tzdHJuY3B5KGxidWYsIkRMQzogRGVsYXllZCBjYWxsIixMQlVGTCk7CisJCWRpYWxzdGEgPSBESUFfTk9BTjsKKwkJbWRtc3RhdCA9IERfRkFJTEVEOworCSAgICB9IGVsc2UJCQkvKiBSZXNwb25zZSB3YXMgcHJvYmFibHkgYW4gZWNoby4gKi8KKyNpZm5kZWYgTUlOSURJQUwKKwkgICAgICBpZiAobXltZG10eXAgPT0gbl9DQ0lUVCkKKyNlbmRpZiAvKiBNSU5JRElBTCAqLworCQljb250aW51ZTsKKyNpZm5kZWYgTUlOSURJQUwKKwkgICAgICBlbHNlCQkJLyogRGlnaXRlbDogSWYgbm8gZXJyb3IsIGNvbm5lY3QuICovCisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisjZW5kaWYgLyogTUlOSURJQUwgKi8KKwkgICAgYnJlYWs7CisKKwl9IGVsc2UgaWYgKG4pIHsJCQkvKiBOb24tSGF5ZXMtY29tcGF0aWJsZXMuLi4gKi8KKwkgICAgc3dpdGNoIChteW1kbXR5cCkgeworI2lmbmRlZiBNSU5JRElBTAorCSAgICAgIGNhc2Ugbl9BVFRNT0RFTToKKwkJLyogQ2FyZWZ1bCAtICJDb25uZWN0ZWQiIC8gIk5vdCBDb25uZWN0ZWQiICovCisJCWlmIChkaWR3ZWdldChsYnVmLCJCdXN5IikpIHsKKwkJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJICAgIGRpYWxzdGEgPSBESUFfQlVTWTsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJOb3QgY29ubmVjdGVkIikgfHwKKwkJCSAgIGRpZHdlZ2V0KGxidWYsIk5vdCBDb25uZWN0ZWQiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9OT0NBOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIk5vIGRpYWwgdG9uZSIpIHx8CisJCQkgICBkaWR3ZWdldChsYnVmLCJObyBEaWFsIFRvbmUiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9OT0RUOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIk5vIGFuc3dlciIpIHx8CisJCQkgICBkaWR3ZWdldChsYnVmLCJObyBBbnN3ZXIiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9OT0FOOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkFuc3dlcmVkIikgfHwKKwkJCSAgIGRpZHdlZ2V0KGxidWYsIkNvbm5lY3RlZCIpKSB7CisJCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9PSzsKKwkJfQorCQlicmVhazsKKworCSAgICAgIGNhc2Ugbl9BVFRJU046CisJCWlmIChkaWR3ZWdldChsYnVmLCJBTlNXRVJFRCIpKSB7CisJCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9PSzsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJCVVNZIikpIHsKKwkJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJICAgIGRpYWxzdGEgPSBESUFfQlVTWTsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJESVNDT05ORUNUIikpIHsKKwkJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJICAgIGRpYWxzdGEgPSBESUFfRElTQzsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJOTyBBTlNXRVIiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9OT0FOOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIldST05HIEFERFJFU1MiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9OT0FDOworCQl9CisJCWJyZWFrOworCisJICAgICAgY2FzZSBuX0FUVERURE06CisJCWlmIChkaWR3ZWdldChsYnVmLCJBTlNXRVJFRCIpKSB7CisJCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkJVU1kiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9CVVNZOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkNIRUNLIE9QVElPTlMiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9FUlI7CisJCX0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiRElTQ09OTkVDVEVEIikpIHsKKwkJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJICAgIGRpYWxzdGEgPSBESUFfRElTQzsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJERU5JRUQiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9OT0FDOworCQl9CisjaWZkZWYgREVCVUcKKyNpZmRlZiBBVFQ2MzAwCisJCS8qIEhvcnJpYmxlIGhhY2sgbG9zdCBpbiBoaXN0b3J5LiAqLworCQllbHNlIGlmIChkZWJsb2cgJiYgZGlkd2VnZXQobGJ1Ziwifn4iKSkKKwkJICBtZG1zdGF0ID0gQ09OTkVDVEVEOworI2VuZGlmIC8qIEFUVDYzMDAgKi8KKyNlbmRpZiAvKiBERUJVRyAqLworCQlicmVhazsKKworI2lmZGVmIE9MRE1PREVNUworCSAgICAgIGNhc2Ugbl9DRVJNRVRFSzoKKwkJaWYgKGRpZHdlZ2V0KGxidWYsIlwwMTZBIikpIHsKKwkJICAgIG1kbXN0YXQgPSBDT05ORUNURUQ7CisJCSAgICB0dHNsb3coIlwwMTZVIDFcMDE1IiwyMDApOyAvKiBNYWtlIHRyYW5zcGFyZW50Ki8KKwkJfQorCQlicmVhazsKKworCSAgICAgIGNhc2Ugbl9ERjAzOgorCQkvKiBCZWNhdXNlIHJlc3BvbnNlIGxhY2tzIENSIG9yIE5MIC4gLiAuICovCisJCWMgPSAoY2hhcikgKGRkaW5jKDApICYgMDE3Nyk7CisJCWRpYWxvYyhjKTsKKwkJZGVidWcoRjAwMCwiZGlhbCBkZjAzIGdvdCIsIiIsYyk7CisJCWlmICggYyA9PSAnQScgKSBtZG1zdGF0ID0gQ09OTkVDVEVEOworCQlpZiAoIGMgPT0gJ0InICkgbWRtc3RhdCA9IERfRkFJTEVEOworCQlicmVhazsKKworCSAgICAgIGNhc2Ugbl9ERjEwMDoJICAgICAvKiBERjEwMCBoYXMgc2hvcnQgcmVzcG9uc2UgY29kZXMgKi8KKwkJaWYgKHN0cmNtcChsYnVmLCJBIikgPT0gMCkgeworCQkgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsgLyogQXR0YWNoZWQgKi8KKwkJICAgIGRpYWxzdGEgPSBESUFfT0s7CisJCX0gZWxzZSBpZiAoc3RyY21wKGxidWYsIk4iKSA9PSAwKSB7CisJCSAgICBtZG1zdGF0ID0gRF9GQUlMRUQ7CisJCSAgICBkaWFsc3RhID0gRElBX05PQU47IC8qIE5vIGFuc3dlciBvciBubyBkaWFsdG9uZSAqLworCQl9IGVsc2UgaWYgKHN0cmNtcChsYnVmLCJFIikgPT0gMCB8fCAvKiBFcnJvciAqLworCQkJICAgc3RyY21wKGxidWYsIlIiKSA9PSAwKSB7IC8qICJSZWFkeSIgKD8pICovCisJCSAgICBtZG1zdGF0ID0gRF9GQUlMRUQ7CisJCSAgICBkaWFsc3RhID0gRElBX0VSUjsJLyogQ29tbWFuZCBlcnJvciAqLworCQl9CisJCS8qIG90aGVyd2lzZSBmYWxsIHRocnUuLi4gKi8KKworCSAgICAgIGNhc2Ugbl9ERjIwMDoKKwkJaWYgKGRpZHdlZ2V0KGxidWYsIkF0dGFjaGVkIikpIHsKKwkJICAgIG1kbXN0YXQgPSBDT05ORUNURUQ7CisJCSAgICBkaWFsc3RhID0gRElBX09LOworCQkgICAgLyoKKwkJICAgICAqIFRoZSBERjEwMCB3aWxsIHJlc3BvbmQgd2l0aCAiQXR0YWNoZWQiIGV2ZW4gaWYgRFRSCisJCSAgICAgKiBhbmQvb3IgY2FycmllciBhcmUgbm90IHByZXNlbnQuCUFub3RoZXIgcmVhc29uIHRvCisJCSAgICAgKiAoYWxzbykgd2FpdCBmb3IgY2Fycmllcj8KKwkJICAgICAqLworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkJ1c3kiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9CVVNZOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkRpc2Nvbm5lY3RlZCIpKSB7CisJCSAgICBtZG1zdGF0ID0gRF9GQUlMRUQ7CisJCSAgICBkaWFsc3RhID0gRElBX0RJU0M7CisJCX0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiRXJyb3IiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9FUlI7CisJCX0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiTm8gYW5zd2VyIikpIHsKKwkJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJICAgIGRpYWxzdGEgPSBESUFfTk9BTjsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJObyBkaWFsIHRvbmUiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9OT0RUOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIlNwZWVkOikiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9FUlI7CisJCX0KKwkJLyoKKwkJICogSXQgYXBwZWFycyB0aGF0IHRoZSAiU3BlZWQ6Li4uIiByZXNwb25zZSBjb21lcyBhZnRlciBhbgorCQkgKiAiQXR0YWNoZWQiIHJlc3BvbnNlLCBzbyB0aGlzIGlzIG5ldmVyIHNlZW4uICBIT1dFVkVSLAorCQkgKiBpdCB3b3VsZCBiZSB2ZXJ5IGhhbmR5IHRvIGRldGVjdCB0aGlzIGFuZCB0ZW1wb3JhcmlseQorCQkgKiByZXNldCB0aGUgc3BlZWQsIHNpbmNlIGl0J3MgYSBudWlzYW5jZSBvdGhlcndpc2UuCisJCSAqIElmIHdlIHdhaXQgZm9yIHNvbWUgbW9yZSBpbnB1dCBmcm9tIHRoZSBtb2RlbSwgaG93IGRvCisJCSAqIHdlIGtub3cgaWYgaXQncyBmcm9tIHRoZSByZW1vdGUgaG9zdCBvciB0aGUgbW9kZW0/CisJCSAqIENhcnJpZXIgcmVwb3J0ZWRseSBkb2Vzbid0IGdldCBzZXQgdW50aWwgYWZ0ZXIgdGhlCisJCSAqICJTcGVlZDouLi4iIHJlc3BvbnNlIChpZiBhbnkpIGlzIHNlbnQuICBBbm90aGVyIHJlYXNvbgorCQkgKiB0byAoYWxzbykgd2FpdCBmb3IgY2Fycmllci4KKwkJICovCisJCWJyZWFrOworCisJICAgICAgY2FzZSBuX0dEQzoKKwkJaWYgKGRpZHdlZ2V0KGxidWYsIk9OIExJTkUiKSkKKwkJICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCQllbHNlIGlmIChkaWR3ZWdldChsYnVmLCJOTyBDT05ORUNUIikpCisJCSAgbWRtc3RhdCA9IERfRkFJTEVEOworCQlicmVhazsKKworCSAgICAgIGNhc2Ugbl9QRU5SSUw6CisJCWlmIChkaWR3ZWdldChsYnVmLCJPSyIpKSB7CisJCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkJVU1kiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9CVVNZOworCQkgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJOTyBSSU5HIikpIHsKKwkJCW1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJCWRpYWxzdGEgPSBESUFfTk9DQTsKKwkJICAgIH0KKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIG5fUkFDQUw6CisJCWlmIChkaWR3ZWdldChsYnVmLCJPTiBMSU5FIikpCisJCSAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkJZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiRkFJTEVEIENBTEwiKSkKKwkJICBtZG1zdGF0ID0gRF9GQUlMRUQ7CisJCWJyZWFrOworI2VuZGlmIC8qIE9MRE1PREVNUyAqLworCisJICAgICAgY2FzZSBuX1JPTE06CisJCWlmIChkaWR3ZWdldChsYnVmLCJDQUxMSU5HIikpCisJCSAgbWRtc3RhdCA9IDA7CisJCWVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkNPTVBMRVRFIikpCisJCSAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkJZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiRkFJTEVEIikgfHwKKwkJCSBkaWR3ZWdldChsYnVmLCJBQkFORE9OREVEIikpIHsKKwkJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJICAgIGRpYWxzdGEgPSBESUFfTk9DQTsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJOT1QgQVZBSUxBQkxFIikgfHwKKwkJCSAgIGRpZHdlZ2V0KGxidWYsIkxBQ0tTIFBFUk1JU1NJT04iKSB8fAorCQkJICAgZGlkd2VnZXQobGJ1ZiwiTk9UIEEgREFUQUxJTkUiKSB8fAorCQkJICAgZGlkd2VnZXQobGJ1ZiwiSU5WQUxJRCBEQVRBIExJTkUgTlVNQkVSIikgfHwKKwkJCSAgIGRpZHdlZ2V0KGxidWYsIklOVkFMSUQgR1JPVVAgTkFNRSIpKSB7CisJCSAgICBtZG1zdGF0ID0gRF9GQUlMRUQ7CisJCSAgICBkaWFsc3RhID0gRElBX05PQUM7CisJCX0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiQlVTWSIpKSB7CisJCSAgICBtZG1zdGF0ID0gRF9GQUlMRUQ7CisJCSAgICBkaWFsc3RhID0gRElBX0JVU1k7CisJCX0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiRE9FUyBOT1QgQU5TV0VSIikpIHsKKwkJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJICAgIGRpYWxzdGEgPSBESUFfTk9BTjsKKwkJfQorCQlicmVhazsKKworI2lmZGVmIE9MRE1PREVNUworCSAgICAgIGNhc2Ugbl9WRU5URUw6CisJCWlmIChkaWR3ZWdldChsYnVmLCJPTkxJTkUhIikgfHwKKwkJICAgIGRpZHdlZ2V0KGxidWYsIk9ubGluZSEiKSkgeworCQkgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJCVVNZIikgfHwKKwkJCSAgIGRpZHdlZ2V0KGxidWYsIkJ1c3kiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9CVVNZOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkRFQUQgUEhPTkUiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9ESVNDOworCQl9CisJCWJyZWFrOworCisJICAgICAgY2FzZSBuX0NPTkNPUkQ6CisJCWlmIChkaWR3ZWdldChsYnVmLCJJTklUSUFUSU5HIikpCisJCSAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkJZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiQlVTWSIpKSB7CisJCSAgICBtZG1zdGF0ID0gRF9GQUlMRUQ7CisJCSAgICBkaWFsc3RhID0gRElBX0JVU1k7CisJCX0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiQ0FMTCBGQUlMRUQiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9OT0NBOworCQl9CisJCWJyZWFrOworI2VuZGlmIC8qIE9MRE1PREVNUyAqLworCisJICAgICAgY2FzZSBuX01JQ1JPQ09NOgorCQkvKiAiUklOR0JBQ0siIG1lYW5zIHBob25lIGxpbmUgcmluZ2luZywgY29udGludWUgKi8KKwkJaWYgKGRpZHdlZ2V0KGxidWYsIk5PIENPTk5FQ1QiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9OT0NBOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkJVU1kiKSkgeworCQkgICAgbWRtc3RhdCA9IERfRkFJTEVEOworCQkgICAgZGlhbHN0YSA9IERJQV9CVVNZOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIk5PIERJQUxUT05FIikpIHsKKwkJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJICAgIGRpYWxzdGEgPSBESUFfTk9EVDsKKwkJfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJDT01NQU5EIEVSUk9SIikpIHsKKwkJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJICAgIGRpYWxzdGEgPSBESUFfRVJSOworCQl9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIklOIFVTRSIpKSB7CisJCSAgICBtZG1zdGF0ID0gRF9GQUlMRUQ7CisJCSAgICBkaWFsc3RhID0gRElBX05PQUM7CisJCX0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiQ09OTkVDVCIpKSB7CisJCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCQkgICAgLyogdHJhaWxpbmcgc3BlZWQgaWdub3JlZCAqLworCQl9CisJCWJyZWFrOworCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKwkgICAgICBkZWZhdWx0OgorCQlwcmludGYoCisJCSAgICAiUFJPR1JBTSBFUlJPUiAtIE5vIHJlc3BvbnNlIGhhbmRsZXIgZm9yIG1vZGVtIHR5cGUgJWRcbiIsCisJCSAgICAgICBteW1kbXR5cCk7CisJCW1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJZGlhbHN0YSA9IERJQV9FUlI7CisJICAgIH0KKwl9CisgICAgfSAvKiB3aGlsZSAobWRtc3RhdCA9PSAwKSAqLworCisgICAgZGVidWcoRjEwMSwiX2RvZGlhbCBhbGFybSBvZmYiLCIiLHgpOworICAgIGFsYXJtKDApOworICAgIGlmIChtZG1zdGF0ID09IERfRkFJTEVEKSB7CQkvKiBGYWlsdXJlIGRldGVjdGVkIGJ5IG1vZGVtICAqLworICAgICAgICBkaWFsZmFpbChGX01PREVNKTsKKyNpZmRlZiBOVFNJRworCWNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisgICAgICAgIFNJR1JFVFVSTjsKKyAgICB9IGVsc2UgaWYgKG1kbXN0YXQgPT0gRF9QQVJUSUFMICkJeyAvKiBQYXJ0aWFsIGRpYWwgY29tbWFuZCBPSyAqLworCW1zbGVlcCg1MDApOworCWRlYnVnKEYxMDAsImRpYWwgcGFydGlhbCIsIiIsMCk7CisgICAgfSBlbHNlIHsJCQkJLyogQ2FsbCB3YXMgY29tcGxldGVkICovCisJaW50IHg7CisJbXNsZWVwKDcwMCk7CQkJLyogSW4gY2FzZSBtb2RlbSBzaWduYWxzIGJsaW5rICAqLworCWRlYnVnKEYxMDAsImRpYWwgc3VjY2VlZGVkIiwiIiwwKTsKKwlpZiAoCisjaWZuZGVmIE1JTklESUFMCisJICAgIG15bWRtdHlwICE9IG5fUk9MTQkJLyogUm9sbSBoYXMgd2VpcmQgbW9kZW0gc2lnbmFsaW5nICovCisjZWxzZQorCSAgICAxCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKwkgICAgKSB7CisJICAgIGFsYXJtKDMpOwkJCS8qIEluIGNhc2UgdHRwa3QoKSBnZXRzIHN0dWNrLi4uICovCisJICAgIHR0cGt0KHNwZWVkLEZMT19ESUFYLHBhcml0eSk7IC8qIENhbmNlbCBkaWFsaW5nIHN0YXRlIGlvY3RsICovCisgICAgICAgICAgICBhbGFybSgwKTsKKwl9CisvKgorICBJbiBjYXNlIENEIHdlbnQgb2ZmIGluIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIGNhbGwgY29tcGxldGlvbiBhbmQgcmV0dXJuCisgIGZyb20gdHRwa3QoKS4uLgorKi8KKwlpZiAoY2FycmllciAhPSBDQVJfT0ZGKSB7CisgICAgICAgICAgICBpZiAoKHggPSB0dGdtZG0oKSkgPj0gMCkgeworI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgICAgICAgICBpZiAoaXN0bmNvbXBvcnQoKSAmJiAhKHggJiBCTV9EQ0QpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2xlZXAoNTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRuY193YWl0KChDSEFSICopIl9kb2RpYWwgd2FpdGluZyBmb3IgRENEIiwxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9IHR0Z21kbSgpKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh4ICYgQk1fRENEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworICAgICAgICAgICAgICAgIGlmICghKHggJiBCTV9EQ0QpKQorCQkgIHByaW50ZigiV0FSTklORzogQ2FycmllciBzZWVtcyB0byBoYXZlIGRyb3BwZWQuLi5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRyZXNldCgpOwkJCQkvKiBSZXNldCBhbGFybXMgYW5kIHNpZ25hbHMuICovCisgICAgaWYgKCFxdWlldCAmJiAhYmFja2dyZCkgeworCWlmIChkaWFsZHB5ICYmIChwID0gY2tfdGltZSgpKSkgeyAvKiBJZiBESUFMIERJU1BMQVkgT04sICovCisJICAgIHByaW50ZigiICVzYWxsIGNvbXBsZXRlOiAlcy5cbiIsIC8qIGluY2x1ZGUgdGltZXN0YW1wLiAgKi8KKwkJICAgKG1kbXN0YXQgPT0gRF9QQVJUSUFMKSA/CisJCSAgICJQYXJ0aWFsIGMiIDoKKwkJICAgIkMiLAorCQkgICBwICk7CisJfSBlbHNlIGlmIChtb2RlbW1zZ1swXSkgeworCSAgICBwcmludGYgKCIgJXNhbGwgY29tcGxldGU6IFwiJXNcIi5cbiIsCisJCSAgICAobWRtc3RhdCA9PSBEX1BBUlRJQUwpID8gIlBhcnRpYWwgYyIgOiAiQyIsCisJCSAgICAoY2hhciAqKW1vZGVtbXNnCisJCSAgICApOworCX0gZWxzZSB7CisJICAgIHByaW50ZiAoIiAlc2FsbCBjb21wbGV0ZS5cbiIsCisJCSAgICAobWRtc3RhdCA9PSBEX1BBUlRJQUwpID8KKwkJICAgICJQYXJ0aWFsIGMiIDoKKwkJICAgICJDIgorCQkgICAgKTsKKwl9CisgICAgfQorI2lmZGVmIENLTE9HRElBTAorICAgIGRvbG9nZGlhbCh0ZWxuYnIpOworI2VuZGlmIC8qIENLTE9HRElBTCAqLworCisjaWZkZWYgRFlOQU1JQworICAgIGlmIChyYnVmKSBmcmVlKHJidWYpOyByYnVmID0gTlVMTDsKKyAgICBpZiAoZmJ1ZikgZnJlZShmYnVmKTsgZmJ1ZiA9IE5VTEw7CisjZW5kaWYgLyogRFlOQU1JQyAqLworICAgIGRpYWxzdGEgPSAobWRtc3RhdCA9PSBEX1BBUlRJQUwpID8gRElBX1BBUlQgOiBESUFfT0s7CisjaWZkZWYgTlRTSUcKKyAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgIFNJR1JFVFVSTjsKK30KKworc3RhdGljIFNJR1RZUAorI2lmZGVmIENLX0FOU0lDCitmYWlsZGlhbCh2b2lkICogdGhyZWFkaW5mbykKKyNlbHNlIC8qIE5vdCBDS19BTlNJQyAqLworZmFpbGRpYWwodGhyZWFkaW5mbykgVk9JRCAqIHRocmVhZGluZm87CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGZhaWxkaWFsICovIHsKKyAgICBkZWJ1ZyhGMTAwLCJsb25nam1wIHJldHVybnMgdG8gZGlhbCByb3V0aW5lIiwiIiwwKTsKKyAgICBkaWFsZmFpbChmYWlsX2NvZGUpOworICAgIFNJR1JFVFVSTjsKK30KKworLyoKKyAgbmJyID0gbnVtYmVyIHRvIGRpYWwgKHN0cmluZykKKyAgeDEgID0gUmV0cnkgY291bnRlcgorICB4MiAgPSBOdW1iZXIgY291bnRlcgorICBmYyAgPSBGdW5jdGlvbiBjb2RlOgorICAgICAgICAwID09IERJQUwKKyAgICAgICAgMSA9PSBBTlNXRVIKKyAgICAgICAgMiA9PSBJTklUL0NPTkZJRworICAgICAgICAzID09IFBBUlRJQUwgRElBTAorKi8KKworaW50CisjaWZkZWYgT0xEX0RJQUwKK2NrZGlhbChuYnIpIGNoYXIgKm5icjsKKyNlbHNlCitja2RpYWwobmJyLCB4MSwgeDIsIGZjLCByZWRpYWwpIGNoYXIgKm5icjsgaW50IHgxLCB4MiwgZmMsIHJlZGlhbDsKKyNlbmRpZiAvKiBPTERfRElBTCAqLworLyogY2tkaWFsICovIHsKKyNkZWZpbmUgRVJNU0dMIDUwCisgICAgY2hhciBlcnJtc2dbRVJNU0dMXSwgKmVycDsJCS8qIEZvciBlcnJvciBtZXNzYWdlcyAqLworICAgIGludCBuID0gRl9USU1FOworICAgIGNoYXIgKnM7CisgICAgbG9uZyBzcGRtYXg7CisjaWZkZWYgT1MyCisgICAgZXh0ZXJuIGludCB0ZXJtX2lvOworICAgIGludCB0ZXJtX2lvX3NhdiA9IHRlcm1faW87CisjZW5kaWYgLyogT1MyICovCisKKyAgICBjaGFyICptbXNnID0gIlNvcnJ5LCBESUFMIG1lbW9yeSBidWZmZXIgY2FuJ3QgYmUgYWxsb2NhdGVkXG4iOworICAgIC8qCisgICAgICBBIERJQUwgY29tbWFuZCBpbXBsaWVzIGEgU0VUIE1PREVNIFRZUEUgY29tbWFuZCBhbmQgdGhlcmVmb3JlIGVuYWJsZXMKKyAgICAgIGhhbmdpbmcgdXAgYnkgbW9kZW0gY29tbWFuZHMgcmF0aGVyIHRoYW4gZHJvcHBpbmcgRFRSLgorICAgICovCisgICAgbWRtc2V0ID0gMTsJCQkJLyogU2VlIG1kbWh1cCgpICovCisKKyAgICBwYXJ0aWFsID0gMDsKKyAgICBpZiAoZmMgPT0gMykgewkJCS8qIFBhcnRpYWwgZGlhbCByZXF1ZXN0ZWQgKi8KKwlwYXJ0aWFsID0gMTsJCQkvKiBTZXQgZmxhZyAqLworCWZjID0gMDsJCQkJLyogVHJlYXQgbGlrZSByZWd1bGFyIGRpYWxpbmcgKi8KKyAgICB9CisgICAgZnVuY19jb2RlID0gZmM7CQkJLyogTWFrZSBnbG9iYWwgdG8gdGhpcyBtb2R1bGUgKi8KKyAgICB0ZWxuYnIgPSBuYnI7CisgICAgeHJlZGlhbCA9IHJlZGlhbDsKKyAgICBkZWJ1ZyhGMTExLCJja2RpYWwgZW50cnkgcGFydGlhbCIsY2tpdG9hKGZjKSxwYXJ0aWFsKTsKKyAgICBkZWJ1ZyhGMTExLCJja2RpYWwgZW50cnkgbnVtYmVyIixuYnIscmVkaWFsKTsKKworICAgIGlmIChmYyA9PSAxKSB7CQkJLyogQU5TV0VSIGNvbW1hbmQ/ICovCisJLyogUmVzZXQgY2FsbGVyIElEIHN0cmluZ3MgKi8KKwlpZiAoY2FsbGlkX2RhdGUpIG1ha2VzdHIoJmNhbGxpZF9kYXRlLE5VTEwpOworCWlmIChjYWxsaWRfdGltZSkgbWFrZXN0cigmY2FsbGlkX3RpbWUsTlVMTCk7CisJaWYgKGNhbGxpZF9uYW1lKSBtYWtlc3RyKCZjYWxsaWRfbmFtZSxOVUxMKTsKKwlpZiAoY2FsbGlkX25tYnIpIG1ha2VzdHIoJmNhbGxpZF9ubWJyLE5VTEwpOworCWlmIChjYWxsaWRfbWVzZykgbWFrZXN0cigmY2FsbGlkX21lc2csTlVMTCk7CisgICAgfQorCisjaWZkZWYgQ0tfVEFQSV9YCisgICAgaWYgKHR0dGFwaSAmJiB0YXBpcGFzcykgeworCWlmIChtb2RlbXBbbl9UQVBJXSA9IGNrdGFwaUdldE1vZGVtSW5mKCkpIHsKKwkgICAgbXltZG10eXAgPSBuX1RBUEk7CisJfSBlbHNlIHsKKwkgICAgbXltZG10eXAgPSBtZG10eXA7CisJICAgIG1vZGVtcFtuX1RBUEldID0gJkdFTkVSSUM7CisJfQorICAgIH0gZWxzZQorI2VuZGlmIC8qIENLX1RBUEkgKi8KKyAgICBteW1kbXR5cCA9IG1kbXR5cDsKKyAgICBpZiAobXltZG10eXAgPCAwKSB7CQkJLyogV2hvYSwgbmV0d29yayBkaWFsaW5nLi4uICovCisJaWYgKG1kbXNhdiA+IC0xKQorCSAgbXltZG10eXAgPSBtZG1zYXY7CisgICAgfQorICAgIGlmIChteW1kbXR5cCA8IDApIHsKKwlwcmludGYoIkludmFsaWQgbW9kZW0gdHlwZSAlZCAtIGludGVybmFsIGVycm9yLlxuIixteW1kbXR5cCk7CisJZGlhbHN0YSA9IERJQV9OT01POworCXJldHVybigwKTsKKyAgICB9CisgICAgZGlhbF93aGF0ID0gRFdfTk9USElORzsJCS8qIERvaW5nIG5vdGhpbmcgYXQgZmlyc3QuICovCisgICAgbm9udmVyYmFsID0gMDsKKworLyogVGhlc2UgYXJlIE9OTFkgZm9yIHRoZSBwdXJwb3NlIG9mIGludGVycHJldGluZyBudW1lcmljIHJlc3VsdCBjb2Rlcy4gKi8KKworICAgIGlzX21vdG9yb2xhID0KKyNpZmRlZiBNSU5JRElBTAorICAgICAgMAorI2Vsc2UKKyAgICAgIG15bWRtdHlwID09IG5fU1VQUkEgfHwgbXltZG10eXAgPT0gbl9TVVBSQVNPTjsKKyNlbmRpZiAvKiBNSU5JRElBTCAqLworCTsKKworICAgIGlzX21vdG9yb2xhID0KKyNpZmRlZiBNSU5JRElBTAorICAgICAgMAorI2Vsc2UKKyAgICAgIG15bWRtdHlwID09IG5fTU9UT1JPTEEgfHwgbXltZG10eXAgPT0gbl9NT05UQU5BOworI2VuZGlmIC8qIE1JTklESUFMICovCisJOworCisgICAgaXNfcm9ja3dlbGwgPQorI2lmZGVmIE1JTklESUFMCisgICAgICAwCisjZWxzZQorICAgICAgbXltZG10eXAgPT0gbl9SV1YzMiB8fCBteW1kbXR5cCA9PSBuX1JXVjMyQiB8fAorCW15bWRtdHlwID09IG5fUldWMzQgfHwgbXltZG10eXAgPT0gbl9SV1Y5MCB8fAorCSAgbXltZG10eXAgPT0gbl9CT0NBIHx8IG15bWRtdHlwID09IG5fVEVMRVBBVEggfHwKKwkgICAgbXltZG10eXAgPT0gbl9DQVJESU5BTCB8fCBteW1kbXR5cCA9PSBuX0JFU1REQVRBIHx8CisJICAgICAgbXltZG10eXAgPT0gbl9DT05FWEFOVCB8fCBteW1kbXR5cCA9PSBuX1BDVEVMCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKwk7CisKKyAgICBpc19oYXllc2hpc3BkID0KKyNpZmRlZiBNSU5JRElBTAorICAgICAgMAorI2Vsc2UKKyAgICAgIG15bWRtdHlwID09IG5fSF9VTFRSQSB8fCBteW1kbXR5cCA9PSBuX0hfQUNDVVJBIHx8IG5fUFBJCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKwk7CisKKyAgICBpc19zdXByYSA9CisjaWZkZWYgTUlOSURJQUwKKyAgICAgIDAKKyNlbHNlCisgICAgICBteW1kbXR5cCA9PSBuX1NVUFJBIHx8IG15bWRtdHlwID09IG5fU1VQUkFYIHx8IG5fU1VQUkFTT04KKyNlbmRpZiAvKiBNSU5JRElBTCAqLworCTsKKworICAgIG1wID0gbW9kZW1wW215bWRtdHlwXTsJCS8qIFNldCBwb2ludGVyIHRvIG1vZGVtIGluZm8gKi8KKyAgICBpZiAoIW1wKSB7CisJcHJpbnRmKCJTb3JyeSwgaGFuZGxlciBmb3IgdGhpcyBtb2RlbSB0eXBlIG5vdCB5ZXQgZmlsbGVkIGluLlxuIik7CisJZGlhbHN0YSA9IERJQV9OT01POworCXJldHVybiAwOworICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJkaWFsIG51bWJlciIsdGVsbmJyLDApOworI2lmZGVmIENPTU1FTlQKKyAgICBkZWJ1ZyhGMTEwLCJkaWFsIHByZWZpeCIsKGRpYWxucHIgPyBkaWFsbnByIDogIiIpLCAwKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBEWU5BTUlDCisgICAgKmxidWYgPSBOVUw7CisgICAgZGVidWcoRjEwMSwiRElBTCBsYnVmIG1hbGxvYyBvayIsIiIsTEJVRkwrMSk7CisKKyAgICBpZiAoIXJidWYpIHsgICAgLyogVGhpcyBvbmUgbWlnaHQgYWxyZWFkeSBoYXZlIGJlZW4gYWxsb2NhdGVkIGJ5IGdldG9rKCkgKi8KKwlpZiAoIShyYnVmID0gbWFsbG9jKFJCVUZMKzEpKSkgeyAgICAvKiBBbGxvY2F0ZSBpbnB1dCBsaW5lIGJ1ZmZlciAqLworCSAgICBwcmludGYoIiVzIiwgbW1zZyk7CisJICAgIGRpYWxzdGEgPSBESUFfSUU7CisJICAgIHJldHVybiAwOworCX0gZWxzZQorCSAgZGVidWcoRjEwMSwiRElBTCByYnVmIG1hbGxvYyBvayIsIiIsUkJVRkwrMSk7CisgICAgfQorICAgIGlmICghKGZidWYgPSBtYWxsb2MoRlVMTE5VTUwrMSkpKSB7ICAgIC8qIEFsbG9jYXRlIGlucHV0IGxpbmUgYnVmZmVyICovCisJcHJpbnRmKCIlcyIsIG1tc2cpOworCWRpYWxzdGEgPSBESUFfSUU7CisJaWYgKHJidWYpIGZyZWUocmJ1Zik7IHJidWYgPSBOVUxMOworCXJldHVybiAwOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJESUFMIGZidWYgbWFsbG9jIG9rIiwiIixGVUxMTlVNTCsxKTsKKyNlbmRpZiAvKiBEWU5BTUlDICovCisKKyAgICAvKiBOT1RFOiBtZG10eXAsIG5vdCBteW1kbXR5cCAqLworCisgICAgaWYgKHR0b3Blbih0dG5hbWUsJmxvY2FsLG1kbXR5cCwwKSA8IDApIHsgLyogT3Blbiwgbm8gY2FycmllciB3YWl0ICovCisJZXJwID0gZXJybXNnOworCWlmICgoaW50KXN0cmxlbih0dG5hbWUpIDwgKEVSTVNHTCAtIDE4KSkgLyogc2FmZSwgY2hlY2tlZCAqLworCSAgc3ByaW50ZihlcnAsIlNvcnJ5LCBjYW4ndCBvcGVuICVzIix0dG5hbWUpOworCWVsc2UKKwkgIHNwcmludGYoZXJwLCJTb3JyeSwgY2FuJ3Qgb3BlbiBkZXZpY2UiKTsKKwlwZXJyb3IoZXJybXNnKTsKKwlkaWFsc3RhID0gRElBX09QRU47CisjaWZkZWYgRFlOQU1JQworCWlmIChyYnVmKSBmcmVlKHJidWYpOyByYnVmID0gTlVMTDsKKwlpZiAoZmJ1ZikgZnJlZShmYnVmKTsgZmJ1ZiA9IE5VTEw7CisjZW5kaWYgLyogRFlOQU1JQyAqLworCXJldHVybiAwOworICAgIH0KKworI2lmZGVmIENLX1RBUEkKKyAgICBpZiAoIXR0dGFwaSkgeworI2VuZGlmIC8qIENLX1RBUEkgKi8KKworLyogQ29uZGl0aW9uIGNvbnNvbGUgdGVybWluYWwgYW5kIGNvbW11bmljYXRpb24gbGluZSAqLworCisgICAgLyogUGxhY2UgbGluZSBpbnRvICJjbG9jYWwiIGRpYWxpbmcgc3RhdGUsICovCisgICAgLyogaW1wb3J0YW50IG1haW5seSBmb3IgU3lzdGVtIFYgVU5JWC4gICAgICovCisKKyAgICBpZiAodHRwa3Qoc3BlZWQsRkxPX0RJQUwscGFyaXR5KSA8IDApIHsKKwl0dGNsb3MoMCk7CQkJLyogSWYgdHRwa3QgZmFpbHMgZG8gYWxsIHRoaXMuLi4gKi8KKwlpZiAodHRvcGVuKHR0bmFtZSwmbG9jYWwsbXltZG10eXAsMCkgPCAwKSB7CisJICAgIGVycCA9IGVycm1zZzsKKwkgICAgaWYgKChpbnQpc3RybGVuKHR0bmFtZSkgPCAoRVJNU0dMIC0gMTgpKSAvKiBzYWZlLCBjaGVja2VkICovCisJICAgICAgc3ByaW50ZihlcnAsIlNvcnJ5LCBjYW4ndCByZW9wZW4gJXMiLHR0bmFtZSk7CisJICAgIGVsc2UKKwkgICAgICBzcHJpbnRmKGVycCwiU29ycnksIGNhbid0IHJlb3BlbiBkZXZpY2UiKTsKKwkgICAgcGVycm9yKGVycm1zZyk7CisJICAgIGRpYWxzdGEgPSBESUFfT1BFTjsKKyNpZmRlZiBEWU5BTUlDCisJICAgIGlmIChyYnVmKSBmcmVlKHJidWYpOyByYnVmID0gTlVMTDsKKwkgICAgaWYgKGZidWYpIGZyZWUoZmJ1Zik7IGZidWYgPSBOVUxMOworI2VuZGlmIC8qIERZTkFNSUMgKi8KKwkgICAgcmV0dXJuIDA7CisJfQkJCQkvKiBBbmQgdHJ5IGFnYWluLiAqLworCWlmICgodHRwa3Qoc3BlZWQsRkxPX0RJQUwscGFyaXR5KSA8IDApCisjaWZkZWYgVU5JWAorCSYmIChzdHJjbXAodHRuYW1lLCIvZGV2L251bGwiKSkKKyNlbHNlCisjaWZkZWYgT1NLCisJJiYgKHN0cmNtcCh0dG5hbWUsIi9uaWwiKSkKKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBVTklYICovCisjaWZkZWYgQ0tfVEFQSQorCSAgICAgJiYgIXR0dGFwaQorI2VuZGlmIC8qIENLX1RBUEkgKi8KKwkgICAgKSB7CisJICAgIHByaW50ZigiU29ycnksIENhbid0IGNvbmRpdGlvbiBjb21tdW5pY2F0aW9uIGxpbmVcbiIpOworCSAgICBwcmludGYoIlRyeSAnc2V0IGxpbmUgJXMnIGFnYWluXG4iLHR0bmFtZSk7CisJICAgIGRpYWxzdGEgPSBESUFfT1BFTjsKKyNpZmRlZiBEWU5BTUlDCisJICAgIGlmIChyYnVmKSBmcmVlKHJidWYpOyByYnVmID0gTlVMTDsKKwkgICAgaWYgKGZidWYpIGZyZWUoZmJ1Zik7IGZidWYgPSBOVUxMOworI2VuZGlmIC8qIERZTkFNSUMgKi8KKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKyNpZmRlZiBDS19UQVBJCisgICAgfQorI2VuZGlmIC8qIENLX1RBUEkgKi8KKworICAgIC8qIE1vZGVtJ3MgZXNjYXBlIHNlcXVlbmNlLi4uICovCisKKyAgICBpZiAoZGlhbGVzYyA8IDAgfHwgZGlhbGVzYyA+IDEyNykKKyAgICAgIGMgPSBOVUw7CisgICAgZWxzZQorICAgICAgYyA9IChjaGFyKSAoZGlhbGVzYyA/IGRpYWxlc2MgOiBtcC0+ZXNjX2NoYXIpOworICAgIG1kbWNhcGFzID0gZGlhbGNhcGFzID8gZGlhbGNhcGFzIDogbXAtPmNhcGFzOworCisgICAgeHhfb2sgPSBtcC0+b2tfZm47CQkJLyogUG9pbnRlciB0byByZXNwb25zZSByZWFkZXIgKi8KKworICAgIGlmIChtZG1jYXBhcyAmIENLRF9BVCkgewkJLyogSGF5ZXMgY29tcGF0aWJsZSAqLworCWVzY2J1ZlswXSA9IGM7CisJZXNjYnVmWzFdID0gYzsKKwllc2NidWZbMl0gPSBjOworCWVzY2J1ZlszXSA9IE5VTDsKKwkvKiBJbiBjYXNlIHRoaXMgbW9kZW0gdHlwZSBpcyB1c2VyLWRlZmluZWQgKi8KKwlpZiAoIXh4X29rKSB4eF9vayA9IGdldG9rOworICAgIH0gZWxzZSB7CQkJCS8qIE90aGVyICovCisJZXNjYnVmWzBdID0gYzsKKwllc2NidWZbMV0gPSBOVUw7CisJLyogSW4gY2FzZSB1c2VyLWRlZmluZWQgKi8KKwlpZiAobWRtY2FwYXMgJiBDS0RfVjI1KSBpZiAoIXh4X29rKSB4eF9vayA9IGdldG9rOworICAgIH0KKworICAgIC8qIFBhcnRpYWwgZGlhbGluZyAqLworCisgICAgaWYgKG1kbWNhcGFzICYgQ0tEX0FUCisjaWZuZGVmIE1JTklESUFMCisJfHwgbXltZG10eXAgPT0gbl9NSUNST0NPTQorI2VuZGlmIC8qIE1JTklESUFMICovCisJKSB7CisJaW50IHg7CisJeCA9IChpbnQpIHN0cmxlbih0ZWxuYnIpOworCWlmICh4ID4gMCkgeworCSAgICBpZiAodGVsbmJyW3gtMV0gPT0gJzsnKSB7CisJCXBhcnRpYWwgPSAxOworCQlkZWJ1ZyhGMTEwLCJja2RpYWwgc2V0cyBwYXJ0aWFsPTE6Iix0ZWxuYnIsMCk7CisJICAgIH0gZWxzZSBpZiAocGFydGlhbCkgeworCQlja21ha21zZyhmYnVmLEZVTExOVU1MLHRlbG5iciwiOyIsTlVMTCxOVUxMKTsgLyogYWRkIG9uZSAqLworCQl0ZWxuYnIgPSBmYnVmOworCSAgICB9CisJfQorICAgIH0KKyAgICBtc2xlZXAoNTAwKTsKKworICAgIGRlYnVnKEYxMDEsImNrZGlhbCBkaWFsdG1vIiwiIixkaWFsdG1vKTsgLyogVGltZW91dCAqLworCisgICAgaWYgKGZjID09IDEpIHsJCQkvKiBBTlNXRVIgKi8KKwl3YWl0Y3QgPSAoZGlhbGF0bW8gPiAtMSkgPyBkaWFsYXRtbyA6IDA7CisgICAgfSBlbHNlIHsJCQkJLyogRElBTCAqLworCWlmIChkaWFsdG1vIDwgMSkgewkJLyogQXV0b21hdGljIGNvbXB1dGF0aW9uLiAqLworI2lmZGVmIENLX1RBUEkKKwkgICAgaWYgKHR0dGFwaSAmJiAhdGFwaXBhc3MpIHsKKwkJd2FpdGN0ID0gMSAqIChpbnQpc3RybGVuKHRlbG5icikgOyAvKiBXb3JzdCBjYXNlIGRpYWwgdGltZSAqLworCQl3YWl0Y3QgKz0gNjA7CQkvKiBkaWFsdG9uZSArIGNvbXBsZXRpb24gd2FpdCB0aW1lcyAqLworCQlmb3IgKHMgPSB0ZWxuYnI7ICpzOyBzKyspIHsgLyogYWRkIGluIHBhdXNlIGNoYXJhY3RlcnMgdGltZSAqLworCQkgICAgaWYgKCpzID09ICcsJykgeworCQkJd2FpdGN0ICs9IDI7IC8qIHVubGVzcyBpdCB3YXMgY2hhbmdlZCBpbiB0aGUgbW9kZW0gKi8KKwkJICAgIH0gZWxzZSBpZiAoKnMgPT0gJ1cnIHx8CisJCQkgICAgICAgKnMgPT0gJ3cnIHx8CisJCQkgICAgICAgKnMgPT0gJyQnIHx8CisJCQkgICAgICAgKnMgPT0gJ0AnCisJCQkgICAgICAgKSB7CisJCQl3YWl0Y3QgKz0gODsKKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2UgeworI2VuZGlmIC8qIENLX1RBUEkgKi8KKwkJd2FpdGN0ID0gMSAqIChpbnQpc3RybGVuKHRlbG5icikgOworCQkvKiBkaWFsdG9uZSArIGNvbXBsZXRpb24gd2FpdCB0aW1lcyAqLworCQl3YWl0Y3QgKz0gbXAtPmRpYWxfdGltZTsKKwkJZm9yIChzID0gdGVsbmJyOyAqczsgcysrKSB7CisJCSAgICBmb3IgKHAgPSBtcC0+cGF1c2VfY2hhcnM7ICpwOyBwKyspCisJCSAgICAgIGlmICgqcyA9PSAqcCkgeworCQkJICB3YWl0Y3QgKz0gbXAtPnBhdXNlX3RpbWU7CisJCQkgIGJyZWFrOworCQkgICAgICB9CisJCX0KKyNpZmRlZiBDS19UQVBJCisJICAgIH0KKyNlbmRpZiAvKiBDS19UQVBJICovCisJfSBlbHNlIHsKKwkgICAgd2FpdGN0ID0gZGlhbHRtbzsJCS8qIFVzZXItc3BlY2lmaWVkIHRpbWVvdXQgKi8KKwl9CisJZGVidWcoRjEwMSwiY2tkaWFsIHdhaXRjdCBBIiwiIix3YWl0Y3QpOworICAgIH0KKworLyoKKyAgd2FpdGN0IGlzIG91ciBhbGFybSgpIHRpbWVyLgorICBtZG13YWl0IGlzIGhvdyBsb25nIHdlIHRlbGwgdGhlIG1vZGVtIHRvIHdhaXQgZm9yIGNhcnJpZXIuCisgIFdlIHNldCBtZG13YWl0IHRvIGJlIDUgc2Vjb25kcyBsZXNzIHRoYW4gd2FpdGN0LCB0byBpbmNyZWFzZSB0aGUKKyAgY2hhbmNlIHRoYXQgd2UgZ2V0IGEgcmVzcG9uc2UgZnJvbSB0aGUgbW9kZW0gYmVmb3JlIHRpbWluZyBvdXQuCisqLworICAgIGlmICh3YWl0Y3QgPD0gMCkgewkJCS8qIDAgb3IgbmVnYXRpdmUgbWVhbnMgd2FpdCBmb3JldmVyICAqLworI2lmZGVmIENPTU1FTlQKKwl3YWl0Y3QgPSAyNTQ7CQkJLyogVGhlc2Ugd2VyZSBiYWNrd2FyZHMgaW4gNy4wLjE5NiAqLworCW1kbXdhaXQgPSAwOworI2Vsc2UKKwl3YWl0Y3QgPSAwOwkJCS8qIEZpeGVkIGluIDcuMC4xOTguICovCisJbWRtd2FpdCA9IDI1NDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfSBlbHNlIHsKKwlpZiAoZGlhbHRtbyA8IDEpIHsJCS8qIEF1dG9tYXRpYyBjb21wdXRhdGlvbi4gKi8KKyNpZmRlZiBYV0FJVENUCisJICAgIC8qIEFkZHRsIHdhaXQgc2xvcCBjYW4gYmUgZGVmaW5lZCBhdCBjb21waWxlIHRpbWUgKi8KKwkgICAgd2FpdGN0ICs9IFhXQUlUQ1Q7CisjZW5kaWYgLyogWFdBSVRDVCAqLworCSAgICBpZiAod2FpdGN0IDwgNjAgKyBtZG13YWl0ZCkKKwkgICAgICB3YWl0Y3QgPSA2MCArIG1kbXdhaXRkOworCX0KKwlpZiAobWRtY2FwYXMgJiBDS0RfQVQpIHsJLyogQVQgY29tbWFuZC1zZXQgbW9kZW1zICovCisJICAgIG1kbXdhaXQgPSB3YWl0Y3Q7CQkvKiBTNyB0aW1lb3V0ID0gd2hhdCB1c2VyIGFza2VkIGZvciAqLworCSAgICB3YWl0Y3QgKz0gbWRtd2FpdGQ7CQkvKiBLZXJtaXQgdGltZW91dCBhIGJpdCBsYXRlciAqLworCX0gZWxzZSB7CQkJLyogTm9uLUFUICovCisJICAgIG1kbXdhaXQgPSB3YWl0Y3Q7CQkvKiBubyBkaWZmZXJlbmNlICovCisJfQorICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJja2RpYWwgd2FpdGN0IEIiLCIiLHdhaXRjdCk7CisgICAgaWYgKGZjID09IDEpIHsJCQkvKiBBTlNXRVIgKi8KKyNpZmRlZiBDT01NRU5UCisvKgorICBUaGlzIGlzIHdyb25nLiAgbWRtd2FpdCBpcyB0aGUgdmFsdWUgZ2l2ZW4gdG8gUzcgaW4gSGF5ZXNsaWtlIG1vZGVtcy4KKyAgV2hlbiBpbiBhdXRvYW5zd2VyIG1vZGUsIHRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoZSBtb2RlbSB3YWl0cyBmb3IKKyAgY2FycmllciBvbmNlIHJpbmdpbmcgc3RhcnRzLiAgV2hlcmVhcyB3YWl0Y3QgaXMgdGhlIHRpbWVvdXQgZ2l2ZW4gdG8gdGhlCisgIEFOU1dFUiBjb21tYW5kLCB3aGljaCBpcyBhbiBlbnRpcmVseSBkaWZmZXJlbnQgdGhpbmcuICBTaW5jZSB0aGUgZGVmYXVsdAorICBBTlNXRVIgdGltZW91dCBpcyAwIChtZWFuaW5nICJ3YWl0IGZvcmV2ZXIiKSwgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgc2V0cworICBTNyB0byAwLCB3aGljaCwgb24gc29tZSBtb2RlbXMgKGxpa2UgdGhlIFVTUiBTcG9ydHN0ZXIpIG1ha2VzIGl0IGhhbmcgdXAKKyAgYW5kIHJlcG9ydCBOTyBDQVJSSUVSIHRoZSBpbnN0YW50IHRoZSBwaG9uZSByaW5ncy4KKyovCisJbWRtd2FpdCA9IHdhaXRjdDsKKyNlbHNlCisJaWYgKG1kbXdhaXQgPD0gMCkKKwkgIG1kbXdhaXQgPSA2MDsJCQkvKiBBbHdheXMgd2FpdCA2MCBzZWNvbmRzLiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIH0KKyAgICBpZiAoIXF1aWV0ICYmICFiYWNrZ3JkKSB7CQkvKiBQcmludCBpbmZvcm1hdGlvbiBtZXNzYWdlcy4gKi8KKyNpZmRlZiBWTVMKKwlwcmludGYoIiBcbiIpOworCWZmbHVzaChzdGRvdXQpOworI2VuZGlmIC8qIFZNUyAqLworCWlmIChmYyA9PSAxKQorCSAgcHJpbnRmKCIgV2FpdGluZyBmb3IgcGhvbmUgY2FsbC4uLlxuIik7CisJZWxzZQorCSAgcHJpbnRmKCIgJXNyeWluZzogJXMuLi5cbiIsIHgxID4gMCA/ICJSZXQiIDogIlQiLCB0ZWxuYnIpOworCWlmICh4MSA9PSAwICYmIHgyID09IDAgJiYgZGlhbHN0YSAhPSBESUFfUEFSVCkgeworCSAgICBpZiAobmV0d29yaykgeworCQlwcmludGYoIiBWaWEgbW9kZW0gc2VydmVyOiAlcywgbW9kZW06ICVzXG4iLAorCQkgICAgICAgdHRuYW1lLCBnbWRtdHlwKCkgKTsKKwkgICAgfSBlbHNlIHsKKyNpZmRlZiBDS19UQVBJCisJCWlmICh0dHRhcGkgJiYgIXRhcGlwYXNzKQorCQkgIHByaW50ZigiIERldmljZTogJXMsIG1vZGVtOiAlcyIsIHR0bmFtZSwgIlRBUEkiICk7CisJCWVsc2UKKyNlbmRpZiAvKiBDS19UQVBJICovCisJCXByaW50ZigiIERldmljZTogJXMsIG1vZGVtOiAlcyIsCisJCSAgICAgICB0dG5hbWUsIGdtZG10eXAoKSApOworCQlpZiAoc3BlZWQgPiAtMUwpCisJCSAgcHJpbnRmKCIsIHNwZWVkOiAlbGRcbiIsIHNwZWVkKTsKKwkJZWxzZQorCQkgIHByaW50ZigiLCBzcGVlZDogKHVua25vd24pXG4iKTsKKwkgICAgfQorCSAgICBzcGRtYXggPSBkaWFsbWF4ID4gMEwgPyBkaWFsbWF4IDogbXAtPm1heF9zcGVlZDsKKworI2lmbmRlZiBOT0hJTlRTCisJICAgIGlmIChoaW50cyAmJiAhcXVpZXQgJiYKKwkJIW5ldHdvcmsgJiYgc3BkbWF4ID4gMEwgJiYgc3BlZWQgPiBzcGRtYXgKKyNpZmRlZiBDS19UQVBJCisJCSYmICghdHR0YXBpIHx8IHRhcGlwYXNzKQorI2VuZGlmIC8qIENLX1RBUEkgKi8KKwkJKSB7CisJCXByaW50ZigiXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKwkJcHJpbnRmKAorICAgICJJbnRlcmZhY2Ugc3BlZWQgJWxkIG1pZ2h0IGJlIHRvbyBoaWdoIGZvciB0aGlzIG1vZGVtIHR5cGUuXG4iLAorCQkgICAgICAgc3BlZWQKKwkJICAgICAgICk7CisJCXByaW50ZigKKyAgICAiSWYgZGlhbGluZyBmYWlscywgU0VUIFNQRUVEIHRvICVsZCBvciBsZXNzIGFuZCB0cnkgYWdhaW4uXG4iLAorCQkgICAgICAgc3BkbWF4CisJCSAgICAgICApOworCQlwcmludGYoIihVc2UgU0VUIEhJTlRTIE9GRiB0byBzdXBwcmVzcyBmdXR1cmUgaGludHMuKVxuIik7CisJCXByaW50ZigiKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJCXByaW50ZigiXG4iKTsKKwkgICAgfQorI2VuZGlmIC8qIE5PSElOVFMgKi8KKwkgICAgcHJpbnRmKCIgJXMgdGltZW91dDogIiwgZmMgPT0gMCA/ICJEaWFsIiA6ICJBbnN3ZXIiKTsKKwkgICAgaWYgKHdhaXRjdCA+IDApCisJICAgICAgcHJpbnRmKCIlZCBzZWNvbmRzXG4iLG1kbXdhaXQpOworCSAgICBlbHNlCisJICAgICAgcHJpbnRmKCIgKG5vbmUpXG4iKTsKKwkgICAgcHJpbnRmKAorI2lmZGVmIE1BQworCSAgICAgICAiIFR5cGUgQ29tbWFuZC0uIHRvIGNhbmNlbC5cbiIKKyNlbHNlCisjaWZkZWYgVU5JWAorCSAgICAgICAiIFRvIGNhbmNlbDogdHlwZSB5b3VyIGludGVycnVwdCBjaGFyYWN0ZXIgKG5vcm1hbGx5IEN0cmwtQykuXG4iCisjZWxzZQorCSAgICAgICAiIFRvIGNhbmNlbDogdHlwZSBDdHJsLUMgKGhvbGQgZG93biBDdHJsLCBwcmVzcyBDKS5cbiIKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogTUFDICovCisJICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVidWcoRjExMSwiY2tkaWFsIix0dG5hbWUsKGludCkgKHNwZWVkIC8gMTBMKSk7CisgICAgZGVidWcoRjEwMSwiY2tkaWFsIHRpbWVvdXQiLCIiLHdhaXRjdCk7CisjaWZkZWYgT1MyCisgICAgdGVybV9pbyA9IDA7CisjZW5kaWYgLyogT1MyICovCisKKy8qIFNldCB0aW1lciBhbmQgaW50ZXJydXB0IGhhbmRsZXJzLiAqLworICAgIHNhdmludCA9IHNpZ25hbCggU0lHSU5ULCBkaWFsaW50ICkgOyAvKiBBbmQgdGVybWluYWwgaW50ZXJydXB0IGhhbmRsZXIuICovCisgICAgY2NfYWxybV9leGVjdXRlKGNramFkZHIoc2pidWYpLCAwLCBkaWFsdGltZSwgX2RvZGlhbCwgZmFpbGRpYWwpOworCisgICAgc2lnbmFsKFNJR0lOVCwgc2F2aW50KTsKKyNpZmRlZiBPUzIKKyAgICBpZiAoZGlhbHN0YSA9PSBESUFfT0spCQkvKiBEaWFsaW5nIGlzIGNvbXBsZXRlZCAqLworICAgICAgRGlhbGVyU2VuZChPUFRfS0VSTUlUX0NPTk5FQ1QsIDApOworICAgIHRlcm1faW8gPSB0ZXJtX2lvX3NhdjsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpZiAoZGlhbHN0YSA9PSBESUFfUEFSVCB8fCBkaWFsc3RhID09IERJQV9PSykgeworCS8qIFRoaXMgaXMgbmVlZGVkLCBlLmcuLCBmb3IgVGVsbmV0IG1vZGVtIHNlcnZlcnMgKi8KKwlpZiAocmVsaWFibGUgIT0gU0VUX09GRiB8fCAhc2V0cmVsaWFibGUpIHsKKwkgICAgcmVsaWFibGUgPSBTRVRfT0ZGOwkJLyogVHJhbnNwb3J0IGlzIG5vdCByZWxpYWJsZSAqLworCSAgICBkZWJ1ZyhGMTAxLCJja2RpYWwgcmVsaWFibGUiLCIiLHJlbGlhYmxlKTsKKwl9CisJcmV0dXJuKDEpOwkJCS8qIERpYWwgYXR0ZW1wdCBzdWNjZWVkZWQgKi8KKyAgICB9IGVsc2UgeworCXJldHVybigwKTsJCQkvKiBEaWFsIGF0dGVtcHQgZmFpbGVkICovCisgICAgfQorfSAvKiBja2RpYWwgKi8KKworLyoKKyAgZ2V0b2soKSAtIHdhaXQgdXAgdG8gbiBzZWNvbmRzIGZvciBPSyAoMCkgb3IgRVJST1IgKDQpIHJlc3BvbnNlIGZyb20gbW9kZW0uCisgIFVzZSB3aXRoIEhheWVzbGlrZSBvciBDQ0lUVCBtb2RlbXMgZm9yIHJlYWRpbmcgdGhlIHJlcGx5IHRvIGEgbm9uZGlhbGluZworICBjb21tYW5kLgorCisgIFNlY29uZCBhcmd1bWVudCBzYXlzIHdoZXRoZXIgdG8gYmUgc3RyaWN0IGFib3V0IG51bWVyaWMgcmVzdWx0IGNvZGVzLCBpLmUuCisgIHRvIHJlcXVpcmUgdGhleSBiZSBwcmVjZWRlZCBieSBDUiBvciBlbHNlIGJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlCisgIHJlc3BvbnNlLCBlLmcuIHRvIHByZXZlbnQgdGhlIEFUSDA8Q1I+IGVjaG8gZnJvbSBsb29raW5nIGxpa2UgYSB2YWxpZAorICByZXNwb25zZS4gIFN0cmljdCA9PSAwIGlzIG5lZWRlZCBmb3IgQVRJIG9uIFRlbGViaXQsIHdoaWNoIGNhbiByZXR1cm4gdGhlCisgIG1vZGVsIG51bWJlciBjb25jYXRlbmF0ZWQgd2l0aCB0aGUgbnVtZXJpYyByZXNwb25zZSBjb2RlLCBlLmcuICI5NjIwIgorICAoIjk2MiIgaXMgdGhlIG1vZGVsIG51bWJlciwgIjAiIGlzIHRoZSByZXNwb25zZSBjb2RlKS4gIGdldG9rKCkgUmV0dXJuczoKKworICAgMCBpZiBpdCB0aW1lZCBvdXQsCisgICAxIGlmIGl0IHN1Y2NlZWRlZCwKKyAgLTEgb24gbW9kZW0gY29tbWFuZCwgaS9vLCBvciBvdGhlciBlcnJvci4KKyovCitzdGF0aWMgY2tqbXBidWYgb2tidWY7CisKK3N0YXRpYyBTSUdUWVAKKyNpZmRlZiBDS19BTlNJQworb2t0aW1vKGludCBmb28pCQkJCS8qIEFsYXJtIGhhbmRsZXIgZm9yIGdldG9rKCkuICovCisjZWxzZQorb2t0aW1vKGZvbykgaW50IGZvbzsJCQkvKiBBbGFybSBoYW5kbGVyIGZvciBnZXRvaygpLiAqLworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBva3RpbW8gKi8geworCisjaWZkZWYgT1MyCisgICAgYWxhcm0oMCk7CisgICAgLyogc2lnbmFsKFNJR0FMUk0sU0lHX0lHTik7ICovCisgICAgZGVidWcoRjEwMCwib2t0aW1vKCkgU0lHQUxSTSBjYXVnaHQgLS0gU0lHX0lHTiBzZXQiLCIiLDApIDsKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIE9TSwkJCQkvKiBPUy05LCBzZWUgY29tbWVudCBpbiBkaWFsdGltZSgpLiAqLworICAgIHNpZ21hc2soLTEpOworI2VuZGlmIC8qIE9TSyAqLworI2lmZGVmIE5UU0lHCisgICAgaWYgKCBmb28gPT0gU0lHQUxSTSApCisgICAgICBQb3N0QWxhcm1TaWdTZW0oKTsKKyAgICBlbHNlCisgICAgICBQb3N0Q3RybENTZW0oKTsKKyNlbHNlIC8qIE5UU0lHICovCisjaWZkZWYgTlQKKyAgICBja2xvbmdqbXAoY2tqYWRkcihva2J1ZiksMSk7CisjZWxzZSAvKiBOVCAqLworICAgIGNrbG9uZ2ptcChva2J1ZiwxKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworI2VuZGlmIC8qIE5UICovCisgICAgLyogTk9UUkVBQ0hFRCAqLworICAgIFNJR1JFVFVSTjsKK30KKworc3RhdGljIGludCBva3N0YXR1cywgb2tuLCBva3N0cmljdDsKKworc3RhdGljIFNJR1RZUAorI2lmZGVmIENLX0FOU0lDCitkb29rKHZvaWQgKiB0aHJlYWRpbmZvKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2Rvb2sodGhyZWFkaW5mbykgVk9JRCAqIHRocmVhZGluZm8gOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBkb29rICovIHsKKyAgICBDSEFSIGM7CisjaWZkZWYgREVCVUcKKyAgICBjaGFyICogbWRtbXNnID0gIiI7CisjZW5kaWYgLyogREVCVUcgKi8KKworICAgIGludCBpLCB4OworI2lmZGVmIElLU0QKKyAgICBleHRlcm4gaW50IGluc2VydmVyOworI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBOVFNJRworICAgIHNpZ25hbChTSUdJTlQsb2t0aW1vKTsKKyAgICBpZiAodGhyZWFkaW5mbykgewkJCS8qIFRocmVhZCBsb2NhbCBzdG9yYWdlLi4uICovCisJVGxzU2V0VmFsdWUoVGxzSW5kZXgsdGhyZWFkaW5mbyk7CisgICAgfQorI2VuZGlmIC8qIE5UU0lHICovCisjaWZkZWYgQ0tfTE9HSU4KKyNpZmRlZiBOVAorI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpCisgICAgICBzZXRudGNyZWRzKCk7CisjZW5kaWYgLyogSUtTRCAqLworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKworICAgIGlmIChtZG1jYXBhcyAmIENLRF9WMjUpIHsJCS8qIENDSVRULCBlYXN5Li4uICovCisgICAgICAgIHdhaXRmb3IoIlZBTCIpOworICAgICAgICBva3N0YXR1cyA9IDE7CisJZGVidWcoRjExMSwiTW9kZW1fUmVzcG9uc2UoVjI1KSIsIlZBTCIsb2tzdGF0dXMpOworI2lmZGVmIE5UU0lHCisJY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKwlTSUdSRVRVUk47CisjaWZuZGVmIE1JTklESUFMCisgICAgfSBlbHNlIGlmIChteW1kbXR5cCA9PSBuX01JQ1JPQ09NKSB7IC8qIE1pY3JvY29tIGluIFNYIG1vZGUsIGFsc28gZWFzeSAqLworICAgICAgICB3YWl0Zm9yKE1JQ1JPQ09NLndha2VfcHJvbXB0KTsJLyogKEkgdGhpbmsuLi4pICovCisJZGVidWcoRjExMSwiTW9kZW1fUmVzcG9uc2UoTWljcm9jb20pIixNSUNST0NPTS53YWtlX3Byb21wdCxva3N0YXR1cyk7CisgICAgICAgIG9rc3RhdHVzID0gMTsKKyNpZmRlZiBOVFNJRworCWNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisJU0lHUkVUVVJOOworI2VuZGlmIC8qIE1JTklESUFMICovCisgICAgfSBlbHNlIHsJCQkJLyogSGF5ZXMgJiBmcmllbmRzLCBzdGFydCBoZXJlLi4uICovCisJb2tzdGF0dXMgPSAwOwkJCS8qIE5vIHN0YXR1cyB5ZXQuICovCisJZm9yICh4ID0gMDsgeCA8IFJCVUZMOyB4KyspCS8qIEluaXRpYWxpemUgcmVzcG9uc2UgYnVmZmVyICovCisJICByYnVmW3hdID0gU1A7CQkJLyogIHRvIGFsbCBzcGFjZXMgKi8KKwlyYnVmW1JCVUZMXSA9IE5VTDsJCS8qIGFuZCB0ZXJtaW5hdGUgd2l0aCBOVUwuICovCisJd2hpbGUgKG9rc3RhdHVzID09IDApIHsJCS8qIFdoaWxlIG5vIHN0YXR1cy4uLiAqLworCSAgICB4ID0gZGRpbmMob2tuKTsJCS8qIFJlYWQgYSBjaGFyYWN0ZXIgKi8KKwkgICAgaWYgKHggPCAwKSB7CQkvKiBJL08gZXJyb3IgKi8KKwkJb2tzdGF0dXMgPSAtMTsKKyNpZmRlZiBOVFNJRworCQlja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworCQlTSUdSRVRVUk47CisJICAgIH0KKyNpZmRlZiBDT01NRU5UCisJICAgIC8qIHRvbyBtdWNoICovCisJICAgIGRlYnVnKEYxMDEsImdldG9rIGRkaW5jIiwiIix4KTsgLyogR290IGEgY2hhcmFjdGVyLiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgICAgYyA9IChjaGFyKSAoeCAmIDB4N2YpOwkvKiBHZXQgbG93IG9yZGVyIDcgYml0cyAqLworCSAgICBpZiAoIWMpCQkJLyogRG9uJ3QgZGVwb3NpdCBOVUxzICovCisJICAgICAgY29udGludWU7CQkJLyogb3IgZWxzZSBkaWR3ZWdldCgpIHdvbid0IHdvcmsgKi8KKwkgICAgaWYgKGRpYWxkcHkpIGNvbm9jKChjaGFyKWMpOyAvKiBFY2hvIGl0IGlmIHJlcXVlc3RlZCAqLworCSAgICBmb3IgKGkgPSAwOyBpIDwgUkJVRkwtMTsgaSsrKSAvKiBSb3RhdGUgYnVmZmVyICovCisJICAgICAgcmJ1ZltpXSA9IHJidWZbaSsxXTsKKwkgICAgcmJ1ZltSQlVGTC0xXSA9IGM7CQkvKiBEZXBvc2l0IGNoYXJhY3RlciBhdCBlbmQgKi8KKyNpZmRlZiBDT01NRU5UCisJICAgIC8qIHRvbyBtdWNoICovCisJICAgIGRlYnVnKEYwMDAsImdldG9rOiIscmJ1ZiwoaW50KSBjKTsgLyogTG9nIGl0ICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCSAgICBzd2l0Y2ggKGMpIHsJCS8qIEludGVycHJldCBpdC4gKi8KKwkgICAgICBjYXNlIENSOgkJCS8qIEdvdCBhIGNhcnJpYWdlIHJldHVybi4gKi8KKwkJc3dpdGNoKHJidWZbUkJVRkwtMl0pIHsJLyogTG9vayBhdCBjaGFyYWN0ZXIgYmVmb3JlIGl0LiAqLworCQkgIGNhc2UgJzAnOgkJLyogMCA9IE9LIG51bWVyaWMgcmVzcG9uc2UgKi8KKwkJICAgIGlmICghb2tzdHJpY3QgfHwKKwkJCXJidWZbUkJVRkwtM10gPT0gQ1IgfHwgcmJ1ZltSQlVGTC0zXSA9PSBTUCkgeworCQkJbm9udmVyYmFsID0gMTsKKwkJCW9rc3RhdHVzID0gMTsJLyogR29vZCByZXNwb25zZSAqLworCQkgICAgfQorCQkgICAgZGVidWcoRjExMSwiTW9kZW1fUmVzcG9uc2UoSGF5ZXMpIiwiMCIsb2tzdGF0dXMpOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSAnNCc6CQkvKiA0ID0gRVJST1IgbnVtZXJpYyByZXNwb25zZSAqLworI2lmbmRlZiBNSU5JRElBTAorCQkgICAgLyogT3IgVGVsZWJpdCBtb2RlbCBudW1iZXIgOTY0ISAqLworCQkgICAgaWYgKG15bWRtdHlwID09IG5fVEVMRUJJVCAmJgorCQkJaXNkaWdpdChyYnVmW1JCVUZMLTNdKSAmJgorCQkJaXNkaWdpdChyYnVmW1JCVUZMLTRdKSkKKwkJICAgICAgYnJlYWs7CisJCSAgICBlbHNlCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKwkJICAgICAgaWYgKCFva3N0cmljdCB8fAorCQkJcmJ1ZltSQlVGTC0zXSA9PSBDUiB8fCByYnVmW1JCVUZMLTNdID09IFNQKSB7CisJCQlub252ZXJiYWwgPSAxOworCQkJb2tzdGF0dXMgPSAtMTsJLyogQmFkIGNvbW1hbmQgKi8KKwkJICAgIH0KKwkJICAgIGRlYnVnKEYxMTEsIk1vZGVtX1Jlc3BvbnNlKEhheWVzKSIsIjQiLG9rc3RhdHVzKTsKKwkJICAgIGJyZWFrOworCQl9CisJCWlmIChkaWFsZHB5ICYmIG5vbnZlcmJhbCkgLyogSWYgbnVtZXJpYyByZXN1bHRzLCAqLworCQkgIGNvbm9jKExGKTsJCSAgLyogZWNobyBhIGxpbmVmZWVkIHRvby4gKi8KKwkJYnJlYWs7CisJICAgICAgY2FzZSBMRjoJCQkvKiBHb3QgYSBsaW5lZmVlZC4gKi8KKwkJLyoKKwkJICBOb3RlIHVzZSBvZiBleHBsaWNpdCBvY3RhbCBjb2RlcyBpbiB0aGUgc3RyaW5nIGZvcgorCQkgIENSIGFuZCBMRi4gIFdlIHdhbnQgcmVhbCBDUiBhbmQgTEYgaGVyZSwgbm90IHdoYXRldmVyCisJCSAgdGhlIGNvbXBpbGVyIGhhcHBlbnMgdG8gcmVwbGFjZSBcciBhbmQgXG4gd2l0aC4uLgorCQkqLworCQlpZiAoIXN0cmNtcChyYnVmK1JCVUZMLTQsIk9LXDAxNVwwMTIiKSkgeyAvKiBHb29kIHJlc3BvbnNlICovCisJCSAgICBva3N0YXR1cyA9IDE7CisJCSAgICBkZWJ1ZyhGMTExLCJNb2RlbV9SZXNwb25zZShIYXllcykiLCJPSyIsb2tzdGF0dXMpOworCQl9CisJCWlmICghc3RyY21wKHJidWYrUkJVRkwtMywiT0tcMDEyIikpIHsgLyogR29vZCByZXNwb25zZSAqLworCQkgICAgb2tzdGF0dXMgPSAxOworCQkgICAgZGVidWcoRjExMSwiTW9kZW1fUmVzcG9uc2UoSGF5ZXMpIiwiT0siLG9rc3RhdHVzKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHJidWYrUkJVRkwtNywiRVJST1JcMDE1XDAxMiIpKSB7IC8qIEVycm9yICovCisJCSAgICBva3N0YXR1cyA9IC0xOworCQkgICAgZGVidWcoRjExMSwiTW9kZW1fUmVzcG9uc2UoSGF5ZXMpIiwiRVJST1IiLG9rc3RhdHVzKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHJidWYrUkJVRkwtNiwiRVJST1JcMDEyIikpIHsgLyogRXJyb3IgKi8KKwkJICAgIG9rc3RhdHVzID0gLTE7CisJCSAgICBkZWJ1ZyhGMTExLCJNb2RlbV9SZXNwb25zZShIYXllcykiLCJFUlJPUiIsb2tzdGF0dXMpOworCQl9CisJCWJyZWFrOworCSAgICAgIC8qIENoZWNrIHdoZXRoZXIgbW9kZW0gZWNob2VzIGl0cyBjb21tYW5kcy4uLiAqLworCSAgICAgIGNhc2UgJ3QnOgkJCS8qIEdvdCBsaXR0bGUgdCAqLworCQlpZiAoIXN0cmNtcChyYnVmK1JCVUZMLTMsIlwwMTVhdCIpIHx8IC8qIFNlZSBpZiBpdCdzICJhdCIgKi8KKwkJICAgICFzdHJjbXAocmJ1ZitSQlVGTC0zLCIgYXQiKSkKKwkJICAgIG1kbWVjaG8gPSAxOworCQkvKiBkZWJ1ZyhGMTExLCJNRE1FQ0hPLXQiLHJidWYrUkJVRkwtMixtZG1lY2hvKTsgKi8KKwkJYnJlYWs7CisJICAgICAgY2FzZSAnVCc6CQkJLyogR290IEJpZyBUICovCisJCWlmICghc3RyY21wKHJidWYrUkJVRkwtMywiXDAxNUFUIikgfHwJLyogU2VlIGlmIGl0J3MgIkFUIiAqLworCQkgICAgIXN0cmNtcChyYnVmK1JCVUZMLTMsIiBBVCIpKQorCQkgICAgbWRtZWNobyA9IDE7CisJCS8qIGRlYnVnKEYxMTEsIk1ETUVDSE8tVCIscmJ1ZitSQlVGTC0zLG1kbWVjaG8pOyAqLworCQlicmVhazsKKwkgICAgICBkZWZhdWx0OgkJCS8qIE90aGVyIGNoYXJhY3RlcnMsIGFjY3VtdWxhdGUuICovCisJCW9rc3RhdHVzID0gMDsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorICAgIGRlYnVnKEYxMDEsImdldG9rIiwiIixva3N0YXR1cyk7CS8qIDwtLSBJdCdzIGEgbGllICh3aHk/KSAqLworI2lmZGVmIE5UU0lHCisgICAgY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKyAgICBTSUdSRVRVUk47Cit9CisKK3N0YXRpYyBTSUdUWVAKKyNpZmRlZiBDS19BTlNJQworZmFpbG9rKHZvaWQgKiB0aHJlYWRpbmZvKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2ZhaWxvayh0aHJlYWRpbmZvKSBWT0lEICogdGhyZWFkaW5mbzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogZmFpbG9rICovIHsKKyAgICBkZWJ1ZyhGMTAwLCJsb25nam1wIHJldHVybmVkIHRvIGdldG9rKCkiLCIiLDApOworICAgIGRlYnVnKEYxMDAsImdldG9rIHRpbWVvdXQiLCIiLDApOworICAgIFNJR1JFVFVSTjsKK30KKworaW50CitnZXRvayhuLCBzdHJpY3QpIGludCBuLCBzdHJpY3Q7IHsKKyAgICBkZWJ1ZyhGMTAxLCJnZXRvayBlbnRyeSBuIiwiIixuKTsKKyAgICBva3N0YXR1cyA9IDA7CisgICAgb2tuID0gbjsKKyAgICBva3N0cmljdCA9IHN0cmljdDsKKworI2lmZGVmIERZTkFNSUMKKyAgICBpZiAoIXJidWYpIHsKKwlpZiAoIShyYnVmID0gbWFsbG9jKFJCVUZMKzEpKSkgeyAvKiBBbGxvY2F0ZSBpbnB1dCBsaW5lIGJ1ZmZlciAqLworCSAgICBkaWFsc3RhID0gRElBX0lFOworCSAgICByZXR1cm4oLTEpOworCX0KKwlkZWJ1ZyhGMTAxLCJHRVRPSyByYnVmIG1hbGxvYyBvayIsIiIsUkJVRkwrMSk7CisgICAgfQorI2VuZGlmIC8qIERZTkFNSUMgKi8KKworICAgIG1kbWVjaG8gPSAwOwkJCS8qIEFzc3VtZSBubyBlY2hvaW5nIG9mIGNvbW1hbmRzICovCisKKyAgICBkZWJ1ZyhGMTAwLCJhYm91dCB0byBhbHJtX2V4ZWN1dGUgZG9vaygpIiwiIiwwKTsKKyAgICBhbHJtX2V4ZWN1dGUoIGNramFkZHIob2tidWYpLCBuLCBva3RpbW8sIGRvb2ssIGZhaWxvayApIDsKKyAgICBkZWJ1ZyhGMTAwLCJyZXR1cm5pbmcgZnJvbSBhbHJtX2V4ZWN1dGUgZG9vaygpIiwiIiwwKTsKKworICAgIHR0Zmx1aSgpOwkJCQkvKiBGbHVzaCBpbnB1dCBidWZmZXIgKi8KKyAgICByZXR1cm4ob2tzdGF0dXMpOwkJCS8qIFJldHVybiBzdGF0dXMgKi8KK30KKworLyogIEcgRSBUIEggUiBOICAtLSAgR2V0IEhheWVzIFJlc3VsdCBOdW1lcmljICAqLworCitzdGF0aWMgVk9JRAorZ2V0aHJuKCkgeworICAgIGNoYXIgYzsKKyAgICBpbnQgeDsKKy8qCisgIEhheWVzIG51bWVyaWMgcmVzdWx0IGNvZGVzIChIYXllcyAxMjAwIGFuZCBoaWdoZXIpOgorICAgICAwID0gT0sKKyAgICAgMSA9IENPTk5FQ1QgYXQgMzAwIGJwcyAob3IgMTIwMCBicHMgb24gSGF5ZXMgMTIwMCB3aXRoIGJhc2ljIGNvZGUgc2V0KQorICAgICAyID0gUklORworICAgICAzID0gTk8gQ0FSUklFUgorICAgICA0ID0gRVJST1IgKGluIGNvbW1hbmQgbGluZSkKKyAgICAgNSA9IENPTk5FQ1QgMTIwMCAoZXh0ZW5kZWQgY29kZSBzZXQpCisgIEhheWVzIDI0MDAgYW5kIGhpZ2hlcjoKKyAgICAgNiA9IE5PIERJQUxUT05FCisgICAgIDcgPSBCVVNZCisgICAgIDggPSBOTyBBTlNXRVIKKyAgICAgOSA9ICh0aGVyZSBpcyBubyA5KQorICAgIDEwID0gQ09OTkVDVCAyNDAwCisgIFJlcG9ydGVkbHksIHRoZSBjb2RlcyBmb3IgSGF5ZXMgVi4zMiBtb2RlbXMgYXJlOgorICAgIDF4ID0gQ09OTkVDVCA8c3VmZml4PgorICAgIDV4ID0gQ09OTkVDVCAxMjAwIDxzdWZmaXg+CisgICAgOXggPSBDT05ORUNUIDI0MDAgPHN1ZmZpeD4KKyAgIDExeCA9IENPTk5FQ1QgNDgwMCA8c3VmZml4PgorICAgMTJ4ID0gQ09OTkVDVCA5NjAwIDxzdWZmaXg+CisgIFdoZXJlOgorICAgIHg6ICAgc3VmZml4OgorICAgIFIgID0gUkVMSUFCTEUKKyAgICBSQyA9IFJFTElBQkxFIENPTVBSRVNTRUQKKyAgICBMICA9IExBUE0KKyAgICBMQyA9IExBUE0gQ09NUFJFU1NFRAorICBBbmQgZm9yIFRlbGViaXRzLCBhbGwgdGhlIGFib3ZlLCBleGNlcHQgbm8gc3VmZml4IGluIG51bWVyaWMgbW9kZSwgcGx1czoKKyAgICAxMSA9IENPTk5FQ1QgNDgwMAorICAgIDEyID0gQ09OTkVDVCA5NjAwCisgICAgMTMgPSBDT05ORUNUIDE0NDAwCisgICAgMTQgPSBDT05ORUNUIDE5MjAwCisgICAgMTUgPSBDT05ORUNUIDM4NDAwCisgICAgMTYgPSBDT05ORUNUIDU3NjAwCisgICAgMjAgPSBDT05ORUNUIDMwMC9SRUwgICg9IE1OUCkKKyAgICAyMiA9IENPTk5FQ1QgMTIwMC9SRUwgKD0gTU5QKQorICAgIDIzID0gQ09OTkVDVCAyNDAwL1JFTCAoPSBNTlApCisgICAgNDYgPSBDT05ORUNUIDc1MTIgIChpLmUuIDc1LzEyMDApCisgICAgNDcgPSBDT05ORUNUIDEyNzUgIChpLmUuIDEyMDAvNzUpCisgICAgNDggPSBDT05ORUNUIDcyMDAKKyAgICA0OSA9IENPTk5FQ1QgMTIwMDAKKyAgICA1MCA9IENPTk5FQ1QgRkFTVCAobm90IG9uIFQxNjAwLzMwMDApCisgICAgNTIgPSBSUklORworICAgIDUzID0gRElBTElORworICAgIDU0ID0gTk8gUFJPTVBUVE9ORQorICAgIDYxID0gQ09OTkVDVCBGQVNUL0tFUk0gKEtlcm1pdCBzcG9vZikKKyAgICA3MCA9IENPTk5FQ1QgRkFTVC9DT01QIChQRVAgKyBjb21wcmVzc2lvbikKKyAgICA3MSA9IENPTk5FQ1QgRkFTVC9LRVJNL0NPTVAgKFBFUCArIGNvbXByZXNzaW9uICsgS2VybWl0IHNwb29mKQorCisgIEFuZCBmb3Igb3RoZXJzLCBsb3RzIG9mIHNwZWNpYWwgY2FzZXMgYmVsb3cuLi4KKyovCisjZGVmaW5lIE5CVUZMIDgKKyAgICBjaGFyIG5idWZbTkJVRkwrMV07CQkJLyogUmVzcG9uc2UgYnVmZmVyICovCisgICAgaW50IGkgPSAwLCBqID0gMDsJCQkvKiBCdWZmZXIgcG9pbnRlcnMgKi8KKworICAgIGRlYnVnKEYxMDEsIlJFU1BPTlNFIG1kbWVjaG8iLCIiLG1kbWVjaG8pOworICAgIGlmIChtZG1lY2hvKSB7CQkJLyogU3BvbmdlIHVwIGRpYWxpbmcgc3RyaW5nIGVjaG8uICovCisJd2hpbGUgKDEpIHsKKwkgICAgYyA9IChjaGFyKSAoZGRpbmMoMCkgJiAweDdmKTsKKwkgICAgZGVidWcoRjAwMCwiU1BPTkdFIiwiIixjKTsKKwkgICAgZGlhbG9jKGMpOworCSAgICBpZiAoYyA9PSBDUikgYnJlYWs7CisJfQorICAgIH0KKyAgICB3aGlsZSAobWRtc3RhdCA9PSAwKSB7CQkvKiBSZWFkIHJlc3BvbnNlICovCisJZm9yIChpID0gMDsgaSA8IE5CVUZMOyBpKyspCS8qIENsZWFyIHRoZSBidWZmZXIgKi8KKwkgIG5idWZbaV0gPSAnXDAnOworCWkgPSAwOwkJCQkvKiBSZXNldCB0aGUgYnVmZmVyIHBvaW50ZXIuICovCisJYyA9IChjaGFyKSAoZGRpbmMoMCkgJiAwMTc3KTsJLyogR2V0IGZpcnN0IGRpZ2l0IG9mIHJlc3BvbnNlLiAqLworCQkJCQkvKiB1c2luZyBhbiB1bnRpbWVkLCBibG9ja2luZyByZWFkLiAqLworCWRlYnVnKEYwMDAsIlJFU1BPTlNFLUEiLCIiLGMpOworCWRpYWxvYyhjKTsJCQkvKiBFY2hvIGl0IGlmIHJlcXVlc3RlZC4gKi8KKwlpZiAoIWlzZGlnaXQoYykpCQkvKiBJZiBub3QgYSBkaWdpdCwga2VlcCBsb29raW5nLiAqLworCSAgY29udGludWU7CisJbmJ1ZltpKytdID0gYzsJCQkvKiBHb3QgZmlyc3QgZGlnaXQsIHNhdmUgaXQuICovCisJd2hpbGUgKGMgIT0gQ1IgJiYgaSA8IDgpIHsJLyogUmVhZCBjaGFycyB1cCB0byBDUiAqLworCSAgICB4ID0gZGRpbmMoMCkgJiAwMTc3OwkvKiBHZXQgYSBjaGFyYWN0ZXIuICovCisJICAgIGMgPSAoY2hhcikgeDsJCS8qIEdvdCBpdCBPSy4gKi8KKwkgICAgZGVidWcoRjAwMCwiUkVTUE9OU0UtQyIsIiIsYyk7CisJICAgIGlmIChjICE9IENSKQkJLyogSWYgaXQncyBub3QgYSBjYXJyaWFnZSByZXR1cm4sICovCisJICAgICAgbmJ1ZltpKytdID0gYzsJCS8qICBzYXZlIGl0LiAqLworCSAgICBkaWFsb2MoYyk7CQkJLyogRWNobyBpdC4gKi8KKwl9CisJbmJ1ZltpXSA9ICdcMCc7CQkJLyogRG9uZSwgdGVybWluYXRlIHRoZSBidWZmZXIuICovCisJZGVidWcoRjExMCwiZGlhbCBoYXllc252IGxidWYiLGxidWYsMCk7CisJZGVidWcoRjExMSwiZGlhbCBoYXllc252IGdvdCIsbmJ1ZixpKTsKKwkvKgorCSAgIFNlcGFyYXRlIGFueSBub24tbnVtZXJpYyBzdWZmaXggZnJvbSB0aGUgbnVtZXJpYworCSAgIHJlc3VsdCBjb2RlIHdpdGggYSBudWxsLgorCSovCisJZm9yIChqID0gaS0xOyAoaiA+IC0xKSAmJiAhaXNkaWdpdChuYnVmW2pdKTsgai0tKQorCSAgbmJ1ZltqKzFdID0gbmJ1ZltqXTsKKwlqKys7CisJbmJ1ZltqKytdID0gJ1wwJzsKKwlkZWJ1ZyhGMTEwLCJkaWFsIGhheWVzbnYgbnVtZXJpYyIsbmJ1ZiwwKTsKKwlkZWJ1ZyhGMTExLCJkaWFsIGhheWVzbnYgc3VmZml4ICIsbmJ1ZitqLGopOworCS8qIFByb2JhYmx5IHBob25lIG51bWJlciBlY2hvaW5nLiAqLworCWlmICgoaW50KXN0cmxlbihuYnVmKSA+IDMpCisJICBjb250aW51ZTsKKworCS8qIE5vdyByZWFkIGFuZCBpbnRlcnByZXQgdGhlIHJlc3VsdHMuLi4gKi8KKworCWkgPSBhdG9pKG5idWYpOwkvKiBDb252ZXJ0IHRvIGludGVnZXIgKi8KKwlzd2l0Y2ggKGkpIHsKKwkgIGNhc2UgMDoKKwkgICAgbWRtc3RhdCA9IERfUEFSVElBTDsJLyogT0sgcmVzcG9uc2UgKi8KKwkgICAgYnJlYWs7CisJICBjYXNlIDE6CQkJLyogQ09OTkVDVCAqLworCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOwkvKiBDb3VsZCBiZSBhbnkgc3BlZWQgKi8KKwkgICAgYnJlYWs7CisJICBjYXNlIDI6CQkJLyogUklORyAqLworCSAgICBpZiAoZGlhbGRweSkKKwkgICAgICBwcmludGYoIlxyXG4gTG9jYWwgcGhvbmUgaXMgcmluZ2luZyFcclxuIik7CisJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkgICAgZGlhbHN0YSA9IERJQV9SSU5HOworCSAgICBicmVhazsKKwkgIGNhc2UgMzoJCQkvKiBOTyBDQVJSSUVSICovCisJICAgIGlmIChkaWFsZHB5KSBwcmludGYoIlxyXG4gTm8gQ2Fycmllci5cclxuIik7CisJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkgICAgZGlhbHN0YSA9IERJQV9OT0NBOworCSAgICBicmVhazsKKwkgIGNhc2UgNDoJCQkvKiBFUlJPUiAqLworCSAgICBpZiAoZGlhbGRweSkKKwkgICAgICBwcmludGYoIlxyXG4gTW9kZW0gQ29tbWFuZCBFcnJvci5cclxuIik7CisJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkgICAgZGlhbHN0YSA9IERJQV9FUlI7CisJICAgIGJyZWFrOworCSAgY2FzZSA1OgkJCS8qIENPTk5FQ1QgMTIwMCAqLworCSAgICBzcGRjaGcoMTIwMEwpOyAvKiBDaGFuZ2Ugc3BlZWQgaWYgbmVjZXNzYXJ5LiAqLworCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICBicmVhazsKKwkgIGNhc2UgNjoJCQkvKiBOTyBESUFMVE9ORSAqLworI2lmbmRlZiBNSU5JRElBTAorCSAgICBpZiAobXltZG10eXAgPT0gbl9NSUNST0xJTksgJiYgYXRvaShkaWFsbGNjKSA9PSA0OSAmJiBkaWFsZHB5KQorCSAgICAgIHByaW50ZigiXHJcbiBEaWFsIExvY2tlZC5cclxuIik7IC8qIEdlcm1hbnkgKi8KKwkgICAgZWxzZQorI2VuZGlmIC8qIE1JTklESUFMICovCisJICAgICAgaWYgKGRpYWxkcHkpCisJCXByaW50ZigiXHJcbiBObyBEaWFsdG9uZS5cclxuIik7CisJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkgICAgZGlhbHN0YSA9IERJQV9OT0RUOworCSAgICBicmVhazsKKwkgIGNhc2UgNzoJCQkvKiBCVVNZICovCisJICAgIGlmIChkaWFsZHB5KSBwcmludGYoIlxyXG4gQnVzeS5cclxuIik7CisJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkgICAgZGlhbHN0YSA9IERJQV9CVVNZOworCSAgICBicmVhazsKKwkgIGNhc2UgODoJCQkvKiBOTyBBTlNXRVIgKi8KKyNpZm5kZWYgTUlOSURJQUwKKwkgICAgaWYgKG15bWRtdHlwID09IG5fTUlDUk9MSU5LICYmIGF0b2koZGlhbGxjYykgPT0gNDEgJiYgZGlhbGRweSkKKwkgICAgICBwcmludGYoIlxyXG4gRGlhbCBMb2NrZWQuXHJcbiIpOyAvKiBTd2l0emVybGFuZCAqLworCSAgICBlbHNlCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKwkgICAgICBpZiAoZGlhbGRweSkKKwkJcHJpbnRmKCJcclxuIE5vIEFuc3dlci5cclxuIik7CisJICAgIG1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkgICAgZGlhbHN0YSA9IERJQV9OT0FOOworCSAgICBicmVhazsKKworCSAgY2FzZSA5OgorI2lmbmRlZiBNSU5JRElBTAorCSAgICBpZiAobXltZG10eXAgPT0gbl9YSkFDSyB8fCBteW1kbXR5cCA9PSBuX1NVUFJBWCkgeworCQlzcGRjaGcoNjAwKTsKKwkJYnJlYWs7CisJICAgIH0gLyogZmFsbCB0aHJ1ICovCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKwkgIGNhc2UgMTA6CQkJLyogQ09OTkVDVCAyNDAwICovCisJICAgIHNwZGNoZygyNDAwTCk7CQkvKiBDaGFuZ2Ugc3BlZWQgaWYgbmVjZXNzYXJ5LiAqLworCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICBicmVhazsKKworI2lmbmRlZiBNSU5JRElBTAorCisvKiBTdGFydGluZyBoZXJlLCB3ZSBnZXQgZGlmZmVyZW50IG1lYW5pbmdzIGZyb20gZGlmZmVyZW50IG1hbnVmYWN0dXJlcnMgKi8KKworCSAgY2FzZSAxMToKKwkgICAgaWYgKG15bWRtdHlwID09IG5fVVNSKSB7CisJCWlmIChkaWFsZHB5KSBwcmludGYoIiBSaW5naW5nLi4uXHJcbiIpOworCSAgICB9IGVsc2UgeworCQlzcGRjaGcoNDgwMEwpOwkJLyogQ09OTkVDVCA0ODAwICovCisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlIDEyOgorCSAgICBpZiAobXltZG10eXAgPT0gbl9VU1IpIHsKKwkJaWYgKGRpYWxkcHkpCisJCSAgcHJpbnRmKCJcclxuIEFuc3dlcmVkIGJ5IHZvaWNlLlxyXG4iKTsKKwkJbWRtc3RhdCA9IERfRkFJTEVEOworCQlkaWFsc3RhID0gRElBX1ZPSUM7CisJICAgIH0gZWxzZSBpZiAobXltZG10eXAgPT0gbl9LRUVQSU5UT1VDSCkgeworCQlzcGRjaGcoNzIwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9IGVsc2UgeworCQlzcGRjaGcoOTYwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSAxMzoKKwkgICAgaWYgKG15bWRtdHlwID09IG5fQVRUMTkwMCB8fCBteW1kbXR5cCA9PSBuX0FUVDE5MTApIHsKKwkJaWYgKGRpYWxkcHkpIHByaW50ZigiIFdhaXQuLi5cclxuIik7CisJCWJyZWFrOworCSAgICB9IGVsc2UgaWYgKG15bWRtdHlwID09IG5fVVNSIHx8IG15bWRtdHlwID09IG5fVVNSWDIpCisJICAgICAgc3BkY2hnKDk2MDBMKTsKKwkgICAgZWxzZSBpZiAoaXNfcm9ja3dlbGwgfHwgaXNfc3VwcmEgfHwKKwkJbXltZG10eXAgPT0gbl9aT0xUUklYIHx8IG15bWRtdHlwID09IG5fWEpBQ0spCisJICAgICAgc3BkY2hnKDcyMDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgIT0gbl9NSUNST0xJTkspCisJICAgICAgc3BkY2hnKDE0NDAwTCk7CisJICAgIG1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAxNDoKKwkgICAgaWYgKGlzX3JvY2t3ZWxsIHx8IGlzX3N1cHJhIHx8IG15bWRtdHlwID09IG5fWEpBQ0spCisJICAgICAgc3BkY2hnKDEyMDAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fREFUQVBPUlQgfHwgbXltZG10eXAgPT0gbl9NSUNST0xJTkspCisJICAgICAgc3BkY2hnKDE0NDAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fS0VFUElOVE9VQ0gpCisJICAgICAgc3BkY2hnKDk2MDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgIT0gbl9VU1IgJiYgbXltZG10eXAgIT0gbl9aT0xUUklYKQorCSAgICAgIHNwZGNoZygxOTIwMEwpOworCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICBicmVhazsKKwkgIGNhc2UgMTU6CisJICAgIGlmIChpc19yb2Nrd2VsbCB8fCBpc19zdXByYSB8fAorCQlteW1kbXR5cCA9PSBuX1pPTFRSSVggfHwgbXltZG10eXAgPT0gbl9YSkFDSykKKwkgICAgICBzcGRjaGcoMTQ0MDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgPT0gbl9VU1IpCisJICAgICAgc3BkY2hnKDEyMDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgPT0gbl9aWVhFTCB8fCBteW1kbXR5cCA9PSBuX0lOVEVMKQorCSAgICAgIHNwZGNoZyg3MjAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fREFUQVBPUlQpCisJICAgICAgc3BkY2hnKDE5MjAwTCk7CisJICAgIGVsc2UKKwkgICAgICBzcGRjaGcoMzg0MDBMKTsKKwkgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDE2OgorCSAgICBpZiAoaXNfcm9ja3dlbGwgfHwgaXNfc3VwcmEgfHwKKwkJbXltZG10eXAgPT0gbl9aT0xUUklYIHx8IG15bWRtdHlwID09IG5fWEpBQ0spCisJICAgICAgc3BkY2hnKDE5MjAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fVVNSKQorCSAgICAgIHNwZGNoZygyNDAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fREFUQVBPUlQpCisJICAgICAgc3BkY2hnKDcyMDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgIT0gbl9aWVhFTCAmJiBteW1kbXR5cCAhPSBuX0lOVEVMKSAvKiAxMjAwMCAqLworCSAgICAgIHNwZGNoZyg1NzYwMEwpOworCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICBicmVhazsKKwkgIGNhc2UgMTc6CisJICAgIGlmIChteW1kbXR5cCAhPSBuX0RBVEFQT1JUIHx8IG15bWRtdHlwID09IG5fWEpBQ0spCS8qIDE2ODAwICovCisJICAgICAgc3BkY2hnKDM4NDAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fWllYRUwgfHwgbXltZG10eXAgPT0gbl9JTlRFTCkKKwkgICAgICBzcGRjaGcoMTQ0MDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgPT0gbl9LRUVQSU5UT1VDSCkKKwkgICAgICBzcGRjaGcoMTQ0MDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgPT0gbl9VU1IpCisJICAgICAgc3BkY2hnKDk2MDBMKTsKKwkgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDE4OgorCSAgICBpZiAoaXNfcm9ja3dlbGwgfHwgaXNfc3VwcmEgfHwKKwkJbXltZG10eXAgPT0gbl9aT0xUUklYIHx8IG15bWRtdHlwID09IG5fWEpBQ0sgfHwKKwkJbXltZG10eXAgPT0gbl9NSFpBVFQgfHwgbXltZG10eXAgPT0gbl9MVUNFTlQpCisJICAgICAgc3BkY2hnKDU3NjAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fSU5URUwpCisJICAgICAgc3BkY2hnKDE5MjAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fVVNSIHx8IG15bWRtdHlwID09IG5fVVNSWDIpCisJICAgICAgc3BkY2hnKDQ4MDBMKTsKKwkgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDE5OgorCSAgICBpZiAobXltZG10eXAgPT0gbl9EQVRBUE9SVCkKKwkgICAgICBzcGRjaGcoMzAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fWllYRUwgfHwgbXltZG10eXAgPT0gbl9JTlRFTCkKKwkgICAgICBzcGRjaGcoMzg0MDBMKTsKKwkgICAgZWxzZQorCSAgICAgIHNwZGNoZygxMTUyMDBMKTsKKwkgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDIwOgorCSAgICBpZiAobXltZG10eXAgPT0gbl9VU1IgfHwgbXltZG10eXAgPT0gbl9VU1JYMikKKwkgICAgICBzcGRjaGcoNzIwMEwpOworCSAgICBlbHNlIGlmIChteW1kbXR5cCA9PSBuX0RBVEFQT1JUKQorCSAgICAgIHNwZGNoZygyNDAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fWllYRUwgfHwgbXltZG10eXAgPT0gbl9JTlRFTCkKKwkgICAgICBzcGRjaGcoNTc2MDBMKTsKKwkgICAgZWxzZQorCSAgICAgIHNwZGNoZygzMDBMKTsKKwkgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDIxOgorCSAgICBpZiAobXltZG10eXAgPT0gbl9EQVRBUE9SVCkKKwkgICAgICBzcGRjaGcoNDgwMEwpOworCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICBicmVhazsKKwkgIGNhc2UgMjI6CisJICAgIGlmIChpc19yb2Nrd2VsbCB8fCBpc19zdXByYSB8fCBteW1kbXR5cCA9PSBuX1hKQUNLKQorCSAgICAgIHNwZGNoZyg4ODgwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fREFUQVBPUlQpCisJICAgICAgc3BkY2hnKDk2MDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgPT0gbl9LRUVQSU5UT1VDSCkKKwkgICAgICBzcGRjaGcoMzAwTCk7CisJICAgIGVsc2UgaWYgKCFpc19oYXllc2hpc3BkKQorCSAgICAgIHNwZGNoZygxMjAwTCk7CisJICAgIG1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAyMzoKKwkgICAgaWYgKGlzX2hheWVzaGlzcGQgfHwgaXNfc3VwcmEgfHwKKwkJbXltZG10eXAgPT0gbl9NVUxUSSB8fCBteW1kbXR5cCA9PSBuX1hKQUNLKQorCSAgICAgIHNwZGNoZyg4ODgwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwICE9IG5fREFUQVBPUlQgJiYgIWlzX3JvY2t3ZWxsKSAvKiAxMjAwMCAqLworCSAgICAgIHNwZGNoZygyNDAwTCk7CisJICAgIG1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAyNDoKKwkgICAgaWYgKGlzX3JvY2t3ZWxsIHx8ICBpc19zdXByYSB8fCBteW1kbXR5cCA9PSBuX1hKQUNLKSB7CisJCW1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJZGlhbHN0YSA9IERJQV9ERUxBOwkvKiBEZWxheWVkICovCisJCWJyZWFrOworCSAgICB9IGVsc2UgaWYgKGlzX2hheWVzaGlzcGQgfHwgbXltZG10eXAgPT0gbl9MVUNFTlQpCisJICAgICAgc3BkY2hnKDcyMDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgPT0gbl9EQVRBUE9SVCkKKwkgICAgICBzcGRjaGcoMTQ0MDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKQorCSAgICAgIHNwZGNoZygxMjAwTCk7CisJICAgIG1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAyNToKKwkgICAgaWYgKG15bWRtdHlwID09IG5fVVNSIHx8IG15bWRtdHlwID09IG5fVVNSWDIpCisJICAgICAgc3BkY2hnKDE0NDAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fTFVDRU5UKQorCSAgICAgIHNwZGNoZygxMjAwMEwpOworCSAgICBlbHNlIGlmIChpc19tb3Rvcm9sYSkKKwkgICAgICBzcGRjaGcoOTYwMEwpOworCSAgICBlbHNlIGlmIChteW1kbXR5cCA9PSBuX0lOVEVMIHx8IG15bWRtdHlwID09IG5fS0VFUElOVE9VQ0gpCisJICAgICAgc3BkY2hnKDI0MDBMKTsKKwkgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDI2OgorCSAgICBpZiAobXltZG10eXAgPT0gbl9EQVRBUE9SVCkKKwkgICAgICBzcGRjaGcoMTkyMDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKQorCSAgICAgIHNwZGNoZyg0ODAwTCk7CisJICAgIG1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAyNzoKKwkgICAgaWYgKG15bWRtdHlwID09IG5fREFUQVBPUlQpCisJICAgICAgc3BkY2hnKDM4NDAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fSU5URUwgfHwgbXltZG10eXAgPT0gbl9LRUVQSU5UT1VDSCkKKwkgICAgICBzcGRjaGcoNzIwMEwpOworCSAgICBlbHNlIGlmIChteW1kbXR5cCA9PSBuX01IWkFUVCkKKwkgICAgICBzcGRjaGcoODg4MEwpOworCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICBicmVhazsKKwkgIGNhc2UgMjg6CisJICAgIGlmIChteW1kbXR5cCA9PSBuX0RBVEFQT1JUKQorCSAgICAgIHNwZGNoZyg3MjAwTCk7CisJICAgIGVsc2UgaWYgKG15bWRtdHlwID09IG5fSU5URUwgfHwgbXltZG10eXAgPT0gbl9LRUVQSU5UT1VDSCkKKwkgICAgICBzcGRjaGcoOTYwMEwpOworCSAgICBlbHNlIGlmIChteW1kbXR5cCA9PSBuX01IWkFUVCB8fCBteW1kbXR5cCA9PSBuX0xVQ0VOVCkKKwkgICAgICBzcGRjaGcoMzg0MDBMKTsKKwkgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDI5OgorCSAgICBpZiAoaXNfbW90b3JvbGEpCisJICAgICAgc3BkY2hnKDQ4MDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgPT0gbl9EQVRBUE9SVCkKKwkgICAgICBzcGRjaGcoMTkyMDBMKTsKKwkgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDMwOgorCSAgICBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKSB7CisJCXNwZGNoZygxNDQwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9IC8qIGZhbGwgdGhydSBvbiBwdXJwb3NlLi4uICovCisJICBjYXNlIDMxOgorCSAgICBpZiAobXltZG10eXAgPT0gbl9VQ09NX0FUIHx8IG15bWRtdHlwID09IG5fTUlDUk9MSU5LKSB7CisJCXNwZGNoZyg0ODAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAoaXNfbW90b3JvbGEpIHsKKwkJc3BkY2hnKDU3NjAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlIDMyOgorCSAgICBpZiAoaXNfcm9ja3dlbGwgfHwgaXNfc3VwcmEgfHwgbXltZG10eXAgPT0gbl9YSkFDSykgeworCQltZG1zdGF0ID0gRF9GQUlMRUQ7CisJCWRpYWxzdGEgPSBESUFfQkxDSzsJLyogQmxhY2tsaXN0ZWQgKi8KKwkgICAgfSBlbHNlIGlmIChteW1kbXR5cCA9PSBuX1VDT01fQVQgfHwgbXltZG10eXAgPT0gbl9NSUNST0xJTkspIHsKKwkJc3BkY2hnKDk2MDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfSBlbHNlIGlmIChteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKSB7CisJCXNwZGNoZygzMDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfSBlbHNlIGlmIChteW1kbXR5cCA9PSBuX0lOVEVMKSB7CisJCXNwZGNoZygyNDAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlIDMzOgkJCS8qIEZBWCBjb25uZWN0aW9uICovCisJICAgIGlmIChpc19yb2Nrd2VsbCB8fCBpc19zdXByYSB8fAorCQlteW1kbXR5cCA9PSBuX1pPTFRSSVggfHwgbXltZG10eXAgPT0gbl9YSkFDSykgeworCQltZG1zdGF0ID0gRF9GQUlMRUQ7CisJCWRpYWxzdGEgPSBESUFfRkFYOworCSAgICB9IGVsc2UgaWYgKG15bWRtdHlwID09IG5fVUNPTV9BVCB8fAorCQkgICAgICAgaXNfbW90b3JvbGEgfHwKKwkJICAgICAgIG15bWRtdHlwID09IG5fTUlDUk9MSU5LCisJCSAgICAgICApIHsKKwkJc3BkY2hnKDk2MDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfSBlbHNlIGlmIChteW1kbXR5cCA9PSBuX01IWkFUVCkgeworCQlzcGRjaGcoMTE1MjAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlIDM0OgorCSAgICBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKSB7CisJCXNwZGNoZygxMjAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAobXltZG10eXAgPT0gbl9NSUNST0xJTkspIHsKKwkJc3BkY2hnKDcyMDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgMzU6CisJICAgIGlmIChpc19yb2Nrd2VsbCkgeworCQlzcGRjaGcoMzAwTCk7CisJCWRpYWxzdGEgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAoaXNfbW90b3JvbGEpIHsKKwkJc3BkY2hnKDE0NDAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKSB7CisJCXNwZGNoZygyNDAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAobXltZG10eXAgPT0gbl9NSUNST0xJTkspIHsKKwkJc3BkY2hnKDcyMDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfSBlbHNlIGlmIChteW1kbXR5cCA9PSBuX1pPTFRSSVggfHwgbXltZG10eXAgPT0gbl9YSkFDSykgLyogREFUQSAqLworCSAgICAgIG1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAzNjoKKwkgICAgaWYgKG15bWRtdHlwID09IG5fVUNPTV9BVCkgeworCQlzcGRjaGcoMTkyMDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfSBlbHNlIGlmIChpc19tb3Rvcm9sYSkgeworCQlzcGRjaGcoMTIwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9IGVsc2UgaWYgKG15bWRtdHlwID09IG5fSU5URUwgfHwgbXltZG10eXAgPT0gbl9LRUVQSU5UT1VDSCkgeworCQlzcGRjaGcoNDgwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSAzNzoKKwkgICAgaWYgKG15bWRtdHlwID09IG5fVUNPTV9BVCkgeworCQlzcGRjaGcoMTkyMDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfSBlbHNlIGlmIChpc19tb3Rvcm9sYSkgeworCQlzcGRjaGcoMjQwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9IGVsc2UgaWYgKG15bWRtdHlwID09IG5fSU5URUwgfHwgbXltZG10eXAgPT0gbl9LRUVQSU5UT1VDSCkgeworCQlzcGRjaGcoNzIwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSAzODoKKwkgICAgaWYgKGlzX21vdG9yb2xhKSB7CisJCXNwZGNoZyg0ODAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKSB7CisJCXNwZGNoZyg5NjAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gLyogZmFsbCB0aHJ1IG9uIHB1cnBvc2UuLi4gKi8KKwkgIGNhc2UgMzk6CisJICAgIGlmIChteW1kbXR5cCA9PSBuX1VDT01fQVQpIHsKKwkJc3BkY2hnKDM4NDAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAoaXNfbW90b3JvbGEpIHsKKwkJc3BkY2hnKDk2MDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfSBlbHNlIGlmIChteW1kbXR5cCA9PSBuX01JQ1JPTElOSykgeworCQlzcGRjaGcoMTQ0MDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgNDA6CisJICAgIGlmIChteW1kbXR5cCA9PSBuX1VDT01fQVQpIHsKKwkJbWRtc3RhdCA9IERfRkFJTEVEOworCQlkaWFsc3RhID0gRElBX05PQ0E7CisJICAgIH0gZWxzZSBpZiAoaXNfbW90b3JvbGEgfHwgbXltZG10eXAgPT0gbl9JTlRFTCB8fAorCQkgICAgICAgbXltZG10eXAgPT0gbl9LRUVQSU5UT1VDSCkgeworCQlzcGRjaGcoMTQ0MDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgNDE6CisJICAgIGlmIChpc19tb3Rvcm9sYSkgeworCQlzcGRjaGcoMTkyMDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgNDI6CisJICAgIGlmIChteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKSB7CisJCXNwZGNoZygzMDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfSBlbHNlIGlmIChpc19tb3Rvcm9sYSkgeworCQlzcGRjaGcoMzg0MDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfSAvKiBmYWxsIHRocnUgb24gcHVycG9zZS4uLiAqLworCSAgY2FzZSA0MzoKKwkgICAgaWYgKG15bWRtdHlwID09IG5fVUNPTV9BVCkgeworCQlzcGRjaGcoNTc2MDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfSBlbHNlIGlmIChteW1kbXR5cCA9PSBuX1VTUlgyKQorCSAgICAgIG1kbXN0YXQgPSBDT05ORUNURUQ7CS8qIDE2ODAwMCAqLworCSAgICBicmVhazsKKwkgIGNhc2UgNDQ6CisJICAgIGlmIChpc19yb2Nrd2VsbCkgeworCQlzcGRjaGcoODgwMEwpOworCQlkaWFsc3RhID0gQ09OTkVDVEVEOworCSAgICB9IGVsc2UgaWYgKGlzX21vdG9yb2xhKSB7CisJCXNwZGNoZyg3MjAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKSB7CisJCXNwZGNoZygxMjAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlIDQ1OgorCSAgICBpZiAoaXNfbW90b3JvbGEpIHsKKwkJc3BkY2hnKDU3NjAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKSB7CisJCXNwZGNoZygyNDAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAobl9VU1IpIHsKKwkJc3BkY2hnKDE0NDAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlIDQ2OgorCSAgICBpZiAoaXNfcm9ja3dlbGwpCisJICAgICAgc3BkY2hnKDEyMDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKQorCSAgICAgIHNwZGNoZyg0ODAwTCk7CisJICAgIGVsc2UKKwkgICAgICBzcGRjaGcoODg4MEwpOwkJLyogNzUvMTIwMCBzcGxpdCBzcGVlZCAqLworCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICBicmVhazsKKwkgIGNhc2UgNDc6CisJICAgIGlmIChpc19yb2Nrd2VsbCkKKwkgICAgICBzcGRjaGcoMjQwMEwpOworCSAgICBlbHNlIGlmIChteW1kbXR5cCA9PSBuX0lOVEVMIHx8IG15bWRtdHlwID09IG5fS0VFUElOVE9VQ0gpCisJICAgICAgc3BkY2hnKDcyMDBMKTsKKwkgICAgZWxzZQorCSAgICAgIHByaW50ZigiQ09OTkVDVCAxMjAwLzc1IC0gTm90IHN1cHBvcnRlZCBieSBDLUtlcm1pdFxyXG4iKTsKKwkgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDQ4OgorCSAgICBpZiAoaXNfcm9ja3dlbGwpCisJICAgICAgc3BkY2hnKDQ4MDBMKTsKKwkgICAgZWxzZSBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKQorCSAgICAgIHNwZGNoZyg5NjAwTCk7CisJICAgIGVsc2UKKwkgICAgICBzcGRjaGcoNzIwMEwpOworCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICBicmVhazsKKwkgIGNhc2UgNDk6CisJICAgIGlmIChpc19yb2Nrd2VsbCkKKwkgICAgICBzcGRjaGcoNzIwMEwpOworCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICBicmVhazsKKwkgIGNhc2UgNTA6CQkJLyogQ09OTkVDVCBGQVNUICovCisJICAgIGlmIChpc19yb2Nrd2VsbCkKKwkgICAgICBzcGRjaGcoOTYwMEwpOworCSAgICBlbHNlIGlmIChteW1kbXR5cCA9PSBuX0lOVEVMIHx8IG15bWRtdHlwID09IG5fS0VFUElOVE9VQ0gpCisJICAgICAgc3BkY2hnKDE0NDAwTCk7CisJICAgIG1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIGJyZWFrOworCSAgY2FzZSA1MToKKwkgICAgaWYgKG15bWRtdHlwID09IG5fVUNPTV9BVCkgeworCQltZG1zdGF0ID0gRF9GQUlMRUQ7CisJCWRpYWxzdGEgPSBESUFfTk9EVDsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgNTI6CQkJLyogUlJJTkcgKi8KKwkgICAgaWYgKG15bWRtdHlwID09IG5fVEVMRUJJVCkKKwkgICAgICBpZiAoZGlhbGRweSkgcHJpbnRmKCIgUmluZ2luZy4uLlxyXG4iKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIDUzOgkJCS8qIERJQUxJTkcgKi8KKwkgICAgaWYgKG15bWRtdHlwID09IG5fVEVMRUJJVCkKKwkgICAgICBpZiAoZGlhbGRweSkgcHJpbnRmKCIgRGlhbGluZy4uLlxyXG4iKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIDU0OgorCSAgICBpZiAoaXNfcm9ja3dlbGwpIHsKKwkJc3BkY2hnKDE5MjAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKSB7CisJCXNwZGNoZygxMjAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIH0gZWxzZSBpZiAobXltZG10eXAgPT0gbl9URUxFQklUKSB7CisJCWlmIChkaWFsZHB5KSBwcmludGYoIlxyXG4gTm8gUHJvbXB0dG9uZS5cclxuIik7CisJCW1kbXN0YXQgPSBEX0ZBSUxFRDsKKwkJZGlhbHN0YSA9IERJQV9OT0RUOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSA1NToKKwkgICAgaWYgKG15bWRtdHlwID09IG5fSU5URUwgfHwgbXltZG10eXAgPT0gbl9LRUVQSU5UT1VDSCkgeworCQlzcGRjaGcoMjQwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSA1NjoKKwkgICAgaWYgKG15bWRtdHlwID09IG5fSU5URUwgfHwgbXltZG10eXAgPT0gbl9LRUVQSU5UT1VDSCkgeworCQlzcGRjaGcoNDgwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSA1NzoKKwkgICAgaWYgKG15bWRtdHlwID09IG5fSU5URUwgfHwgbXltZG10eXAgPT0gbl9LRUVQSU5UT1VDSCkgeworCQlzcGRjaGcoNzIwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSA1ODoKKwkgICAgaWYgKG15bWRtdHlwID09IG5fSU5URUwgfHwgbXltZG10eXAgPT0gbl9LRUVQSU5UT1VDSCkgeworCQlzcGRjaGcoOTYwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSA1OToKKwkgICAgaWYgKG15bWRtdHlwID09IG5fSU5URUwpCS8qIDEyMDAwICovCisJICAgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDYwOgorCSAgICBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKSB7CisJCXNwZGNoZygxNDQwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSA2NDoKKwkgICAgaWYgKG15bWRtdHlwID09IG5fSU5URUwpIHsKKwkJc3BkY2hnKDEyMDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfSBlbHNlIGlmIChpc19zdXByYSkgeworCQlzcGRjaGcoMjg4MDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgNjU6CisJICAgIGlmIChteW1kbXR5cCA9PSBuX0lOVEVMIHx8IG15bWRtdHlwID09IG5fS0VFUElOVE9VQ0gpIHsKKwkJc3BkY2hnKDI0MDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgNjY6CisJICAgIGlmIChteW1kbXR5cCA9PSBuX0lOVEVMIHx8IG15bWRtdHlwID09IG5fS0VFUElOVE9VQ0gpIHsKKwkJc3BkY2hnKDQ4MDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgNjc6CisJICAgIGlmIChteW1kbXR5cCA9PSBuX0lOVEVMIHx8IG15bWRtdHlwID09IG5fS0VFUElOVE9VQ0gpIHsKKwkJc3BkY2hnKDcyMDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgNjg6CisJICAgIGlmIChteW1kbXR5cCA9PSBuX0lOVEVMIHx8IG15bWRtdHlwID09IG5fS0VFUElOVE9VQ0gpIHsKKwkJc3BkY2hnKDk2MDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgNjk6CisJICAgIGlmIChteW1kbXR5cCA9PSBuX0lOVEVMIHx8IG15bWRtdHlwID09IG5fS0VFUElOVE9VQ0gpIC8qIDEyMDAwICovCisJICAgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDcwOgorCSAgICBpZiAobXltZG10eXAgPT0gbl9JTlRFTCB8fCBteW1kbXR5cCA9PSBuX0tFRVBJTlRPVUNIKSB7CisJCXNwZGNoZygxNDQwMEwpOworCQltZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSA3MzoKKwkgICAgaWYgKG15bWRtdHlwID09IG5fVUNPTV9BVCkgeworCQlzcGRjaGcoMTE1MjAwTCk7CisJCW1kbXN0YXQgPSBDT05ORUNURUQ7CisJCWJyZWFrOworCSAgICB9IC8qIGVsc2UgZmFsbCB0aHJ1ICovCisJICAgIGlmIChteW1kbXR5cCA9PSBuX1RFTEVCSVQpCS8qIEVhcmx5IG1vZGVscyBvbmx5ICovCisJICAgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDg1OgorCSAgICBpZiAobXltZG10eXAgPT0gbl9VU1IgfHwgbXltZG10eXAgPT0gbl9VU1JYMikKKwkgICAgICBzcGRjaGcoMTkyMDBMKTsKKwkgICAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDkxOgkJCS8qIDIxNjAwICovCisJICBjYXNlIDk5OgkJCS8qIDI0MDAwICovCisJICBjYXNlIDEwMzoJCQkvKiAyNjQwMCAqLworCSAgICBpZiAobXltZG10eXAgPT0gbl9VU1JYMikKKwkgICAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICBicmVhazsKKwkgIGNhc2UgMTA3OgorCSAgICBpZiAobXltZG10eXAgPT0gbl9VU1IgfHwgbXltZG10eXAgPT0gbl9VU1JYMikgeworCQlzcGRjaGcoMjg4MDBMKTsKKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgMTUxOgkJCS8qIDMxMjAwMCAqLworCSAgY2FzZSAxNTU6CQkJLyogMzM2MDAwICovCisJICAgIGlmIChteW1kbXR5cCA9PSBuX1VTUlgyKQorCSAgICAgIG1kbXN0YXQgPSBDT05ORUNURUQ7CisJICAgIGJyZWFrOworCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKwkgIGRlZmF1bHQ6CisjaWZuZGVmIE1JTklESUFMCisJICAgIGlmIChteW1kbXR5cCA9PSBuX1VTUiB8fCBteW1kbXR5cCA9PSBuX1VTUlgyIHx8CisJCWlzX2hheWVzaGlzcGQgfHwgaXNfcm9ja3dlbGwpCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKwkgICAgICBpZiAoaSA+IDEyKQkJLyogVGhlcmUgYXJlIGh1bmRyZWRzIG9mIHRoZW0uLi4gKi8KKwkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAobWRtc3RhdCA9PSBDT05ORUNURUQgJiYgbmJ1ZltqXSAhPSAnXDAnKSB7CisJaWYgKGRpYWxkcHkpIHsKKwkgICAgcHJpbnRmKCJcclxuIik7CisJICAgIGlmIChuYnVmW2pdID09ICdSJykgcHJpbnRmKCIgUkVMSUFCTEUiKTsKKwkgICAgaWYgKG5idWZbal0gPT0gJ0wnKSBwcmludGYoIiBMQVBNIik7CisJICAgIGlmIChuYnVmW2orMV0gPT0gJ0MnKSBwcmludGYoIiBDT01QUkVTU0VEIik7CisJICAgIHByaW50ZigiXHJcbiIpOworCX0KKwlja3N0cm5jcHkobGJ1ZixuYnVmLExCVUZMKTsJCS8qIChmb3IgbWVzc2FnZXMuLi4pICovCisgICAgfQorfQorCitzdGF0aWMgVk9JRAkJCQkvKiBHZXQgSGF5ZXMgUmVzdWx0IGluIFdvcmQgbW9kZSAqLworZ2V0aHJ3KCkgeworICAgIGNoYXIgKmNwdHIsICpzOworICAgIGxvbmcgY29uc3BkOworCisgICAgaWYgKG1kbXNwZCAmJiAhbmV0d29yaykgeworCXMgPSBsYnVmOworCXdoaWxlICgqcyAhPSAnXDAnICYmICpzICE9ICdDJykgcysrOworCWNwdHIgPSAoKnMgPT0gJ0MnKSA/IHMgOiBOVUxMOworCWNvbnNwZCA9IDBMOworCWlmICgoY3B0ciAhPSBOVUxMKSAmJiAhc3RybmNtcChjcHRyLCJDT05ORUNUICIsOCkpIHsKKwkgICAgaWYgKChpbnQpc3RybGVuKGNwdHIpIDwgOSkgICAvKiBKdXN0IENPTk5FQ1QsICovCisJICAgICAgY29uc3BkID0gMzAwTDsJCSAvKiB1c2UgMzAwIGJwcyAqLworCSAgICBlbHNlIGlmIChpc2RpZ2l0KCooY3B0cis4KSkpIC8qIG5vdCBDT05ORUNUIEZBU1QgKi8KKwkgICAgICBjb25zcGQgPSBhdG9sKGNwdHIgKyA4KTsgICAvKiBDT05ORUNUIG5ubm4gKi8KKwkgICAgaWYgKGNvbnNwZCAhPSBzcGVlZCkgeworCQlpZiAoKGNvbnNwZCAvIDEwTCkgPiAwKSB7CisJCSAgICBpZiAodHRzc3BkKChpbnQpIChjb25zcGQgLyAxMEwpKSA8IDApIHsKKwkJCXByaW50ZigiIENhbid0IGNoYW5nZSBzcGVlZCB0byAlbGRcclxuIiwKKwkJCSAgICAgICBjb25zcGQpOworCQkgICAgfSBlbHNlIHsKKwkJCXNwZWVkID0gY29uc3BkOworCQkJbWRtc3RhdCA9IENPTk5FQ1RFRDsKKwkJCWlmICggIXF1aWV0ICYmICFiYWNrZ3JkICkKKwkJCSAgcHJpbnRmKCIgU3BlZWQgY2hhbmdlZCB0byAlbGRcclxuIiwKKwkJCQkgY29uc3BkKTsKKwkJICAgIH0KKwkJfQorCSAgICB9IC8qIEV4cGFuZGVkIHRvIGhhbmRsZSBhbnkgY29uY2VpdmFibGUgc3BlZWQgKi8KKwl9CisgICAgfQorI2lmbmRlZiBNSU5JRElBTAorICAgIGlmIChteW1kbXR5cCA9PSBuX1RFTEVCSVQpIHsKKwlpZiAoZGlkd2VnZXQobGJ1ZiwiQ09OTkVDVCBGQVNUL0tFUk0iKSkgeworCSAgICBtZG1zdGF0ID0gQ09OTkVDVEVEOworCSAgICBpZiAoZGlhbGRweSkgcHJpbnRmKCJGQVNUL0tFUk0gIik7CisJICAgIHJldHVybjsKKwl9CisgICAgfQorI2VuZGlmIC8qIE1JTklESUFMICovCisgICAgaWYgKGRpZHdlZ2V0KGxidWYsIlJSSU5HIikgfHwKKwlkaWR3ZWdldChsYnVmLCJSSU5HSU5HIikgfHwKKwlkaWR3ZWdldChsYnVmLCJESUFMSU5HIikpIHsKKwltZG1zdGF0ID0gMDsKKyAgICB9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkNPTk5FQ1QiKSkgeworCW1kbXN0YXQgPSBDT05ORUNURUQ7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJPSyIpKSB7CisJaWYgKHBhcnRpYWwpIHsKKwkgICAgbWRtc3RhdCA9IERfUEFSVElBTDsKKwl9IGVsc2UgeworCSAgICBtZG1zdGF0ID0gRF9GQUlMRUQ7CisJICAgIGRpYWxzdGEgPSBESUFfRVJSOworCX0KKyAgICB9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIk5PIENBUlJJRVIiKSkgeworCW1kbXN0YXQgPSBEX0ZBSUxFRDsKKwlkaWFsc3RhID0gRElBX05PQ0E7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJOTyBESUFMVE9ORSIpKSB7CisJbWRtc3RhdCA9IERfRkFJTEVEOworCWRpYWxzdGEgPSBESUFfTk9EVDsKKyAgICB9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIk5PIERJQUwgVE9ORSIpKSB7CisJbWRtc3RhdCA9IERfRkFJTEVEOworCWRpYWxzdGEgPSBESUFfTk9EVDsKKyAgICB9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIkJVU1kiKSkgeworCW1kbXN0YXQgPSBEX0ZBSUxFRDsKKwlkaWFsc3RhID0gRElBX0JVU1k7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJOTyBBTlNXRVIiKSkgeworCW1kbXN0YXQgPSBEX0ZBSUxFRDsKKwlkaWFsc3RhID0gRElBX05PQU47CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJWT0lDRSIpKSB7CisJbWRtc3RhdCA9IERfRkFJTEVEOworCWRpYWxzdGEgPSBESUFfVk9JQzsKKyAgICB9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIlZDT04iKSkgeworCW1kbXN0YXQgPSBEX0ZBSUxFRDsKKwlkaWFsc3RhID0gRElBX1ZPSUM7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJOTyBQUk9NUFQgVE9ORSIpKSB7CisJbWRtc3RhdCA9IERfRkFJTEVEOworCWRpYWxzdGEgPSBESUFfTk9EVDsKKyAgICB9IGVsc2UgaWYgKGRpZHdlZ2V0KGxidWYsIlJFTU9URSBBQ0NFU1MgRkFJTEVEIikpIHsKKwltZG1zdGF0ID0gRF9GQUlMRUQ7CisJZGlhbHN0YSA9IERJQV9OT0NBOworICAgIH0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiRkFYIikpIHsKKwltZG1zdGF0ID0gRF9GQUlMRUQ7CisJZGlhbHN0YSA9IERJQV9GQVg7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJXQUlUIC0gQ09OTkVDVElORyIpIHx8CisJICAgICAgIGRpZHdlZ2V0KGxidWYsIldBSVQtQ09OTkVDVElORyIpKSB7IC8qIEFUJlQgU1RVLUlJSSAxOXh4ICovCisJbWRtc3RhdCA9IDA7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJERUxBWUVEIikpIHsKKwltZG1zdGF0ID0gRF9GQUlMRUQ7CisJZGlhbHN0YSA9IERJQV9ERUxBOworICAgIH0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiQkxBQ0tMSVNURUQiKSkgeworCW1kbXN0YXQgPSBEX0ZBSUxFRDsKKwlkaWFsc3RhID0gRElBX0JMQ0s7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJDT01QUkVTU0lPTiIpKSB7CisJbWRtc3RhdCA9IDA7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJQUk9UT0NPTCIpKSB7CisJbWRtc3RhdCA9IDA7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJESUFMIExPQ0tFRCIpKSB7IC8qIEdlcm1hbnksIEF1c3RyaWEsIFNjaHdlaXogKi8KKwltZG1zdGF0ID0gRF9GQUlMRUQ7CisJZGlhbHN0YSA9IERJQV9CTENLOworICAgIH0gZWxzZSBpZiAoIGRpZHdlZ2V0KGxidWYsIlJJTkciKSB8fAorCSAgICAgICAgZGlkd2VnZXQobGJ1ZiwiUklORzEiKSB8fCAvKiBEaXN0aW5jdGl2ZSBSaW5nIDEgKi8KKwkJZGlkd2VnZXQobGJ1ZiwiUklORzIiKSB8fCAvKiBEaXN0aW5jdGl2ZSBSaW5nIDIgKi8KKwkJZGlkd2VnZXQobGJ1ZiwiUklORzMiKSApIHsKKwltZG1zdGF0ID0gKGZ1bmNfY29kZSA9PSAwKSA/IERfRkFJTEVEIDogMDsKKwlkaWFsc3RhID0gRElBX1JJTkc7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJFUlJPUiIpKSB7CisJbWRtc3RhdCA9IERfRkFJTEVEOworCWRpYWxzdGEgPSBESUFfRVJSOworICAgIH0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiQ0FSUklFUiIpKSB7IC8qIEJvY2EgLyBSb2Nrd2VsbCBmYW1pbHkgKi8KKyNpZmRlZiBDT01NRU5UCisJaWYgKGlzX3JvY2t3ZWxsKQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgIG1kbXN0YXQgPSAwOworI2lmZGVmIENPTU1FTlQKKwkvKiBEb2VzIENBUlJJRVIgZXZlciBtZWFuIHRoZSBzYW1lIGFzIENPTk5FQ1Q/ICovCisJZWxzZQorCSAgbWRtc3RhdCA9IENPTk5FQ1RFRDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJEQVRBIikpIHsJLyogQm9jYSAvIFJvY2t3ZWxsIGZhbWlseSAqLworCS8qIFRoaXMgbWVzc2FnZSBpcyBzZW50IHdoZW4gdGhlIG1vZGVtIGlzIGluIEZBWCBtb2RlICAqLworCS8qIFNvIHNldHRpbmcgdGhpcyB0byBDT05ORUNURUQgbWF5IG5vdCBiZSBhcHByb3ByaWF0ZSAqLworCS8qIFdlIG11c3Qgc2VuZCBBVE9cMDE1IHRvIHRoZSBtb2RlbSBpbiByZXNwb25zZSAgICAgICAqLworCS8qIFRoZW4gd2Ugd2lsbCBnZXQgYSBDT05ORUNURUQgbWVzc2FnZSAgICAgICAgICAgICAgICAqLworCW1kbXN0YXQgPSBDT05ORUNURUQ7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJESUdJVEFMIExJTkUiKSkgeworCW1kbXN0YXQgPSBEX0ZBSUxFRDsKKwlkaWFsc3RhID0gRElBX0RJR0k7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJEQVRFIikpIHsgLyogQ2FsbGVyIElEIERhdGUgKi8KKwlkZWJ1ZyhGMTEwLCJDQUxMSUQgREFURSIsbGJ1ZiwwKTsKKwkvKiBGb3JtYXQgaXMgIkRBVEUgICAgID0gICBNTUREIiAgICovCisJbWFrZXN0cigmY2FsbGlkX2RhdGUsbGJ1Zik7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJUSU1FIikpIHsgLyogQ2FsbGVyIElEIFRpbWUgKi8KKwkvKiBGb3JtYXQgaXMgIlRJTUUgICAgID0gICBISE1NIiAgICovCisJZGVidWcoRjExMCwiQ0FMTElEIFRJTUUiLGxidWYsMCk7CisJbWFrZXN0cigmY2FsbGlkX3RpbWUsbGJ1Zik7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJOQU1FIikpIHsgLyogQ2FsbGVyIElEIE5hbWUgKi8KKwkvKiBGb3JtYXQgaXMgIk5BTUUgICAgID0gICA8bGlzdGluZyBuYW1lPiIgICAqLworCWRlYnVnKEYxMTAsIkNBTExJRCBOQU1FIixsYnVmLDApOworCW1ha2VzdHIoJmNhbGxpZF9uYW1lLGxidWYpOworICAgIH0gZWxzZSBpZiAoZGlkd2VnZXQobGJ1ZiwiTk1CUiIpKSB7IC8qIENhbGxlciBJRCBOdW1iZXIgKi8KKwkvKiBGb3JtYXQgaXMgIk5NQlIgICAgID0gICA8bnVtYmVyPiwgJ1AnIG9yICdPJyIgICAqLworCS8qIAknUCcgbWVhbnMgUHJpdmFjeSBSZXF1ZXN0ZWQgCQkgICAqLworCS8qICAgICAgJ08nIG1lYW5zIE91dCBvZiBTZXJ2aWNlIG9yIE5vdCBhdmFpbGFibGUgICovCisJZGVidWcoRjExMCwiQ0FMTElEIE5NQlIiLGxidWYsMCk7CisJbWFrZXN0cigmY2FsbGlkX25tYnIsbGJ1Zik7CisgICAgfSBlbHNlIGlmIChkaWR3ZWdldChsYnVmLCJNRVNHIikpIHsgLyogQ2FsbGVyIElEIFVucmVjb2duaXplZCBNZXNzYWdlICovCisJLyogRm9ybWF0IGlzICJNRVNHICAgICA9ICAgPHRhZz48bGVuZ3RoPjxkYXRhPjxjaGVja3N1bT4iICAgKi8KKwlkZWJ1ZyhGMTEwLCJDQUxMSUQgTUVTRyIsbGJ1ZiwwKTsKKwltYWtlc3RyKCZjYWxsaWRfbWVzZyxsYnVmKTsKKyAgICB9Cit9CisKKy8qIE1heWJlIGhhbmcgdXAgdGhlIHBob25lLCBkZXBlbmRpbmcgb24gdmFyaW91cyBTRVQgRElBTCBwYXJhbWV0ZXJzLiAqLworCitpbnQKK2RpYWxodXAoKSB7CisgICAgaW50IHggPSAwOworICAgIGlmIChkaWFsaG5nICYmIGRpYWxzdGEgIT0gRElBX1BBUlQpIHsgLyogRElBTCBIQU5HVVAgT04/ICovCisJeCA9IG1kbWh1cCgpOwkJCS8qIFRyeSBtb2RlbS1zcGVjaWZpYyBtZXRob2QgZmlyc3QgKi8KKwlkZWJ1ZyhGMTAxLCJkaWFsaHVwIG1kbWh1cCIsIiIseCk7CisJaWYgKHggPiAwKSB7CQkJLyogSWYgaXQgd29ya2VkLCAqLworCSAgICBkaWFsc3RhID0gRElBX0hVUDsKKwkgICAgaWYgKGRpYWxkcHkpCisJICAgICAgcHJpbnRmKCIgTW9kZW0gaGFuZ3VwIE9LXHJcbiIpOyAvKiBmaW5lLiAqLworCX0gZWxzZSBpZiAobmV0d29yawkJLyogSWYgd2UncmUgdGVsbmV0dGVkIHRvICovCisjaWZkZWYgVE5fQ09NUE9SVAorICAgICAgICAgICAgICAgICAgICYmICFpc3RuY29tcG9ydCgpICAgIC8qICh3aXRob3V0IFJGQyAyMjE3KSAgICAqLworI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyAgICAgICAgICAgICAgICAgICApIHsJCQorCSAgICBkaWFsc3RhID0gRElBX0hBTkc7CisJICAgIGlmIChkaWFsZHB5KQkJLyogYSBtb2RlbSBzZXJ2ZXIsIGp1c3QgcHJpbnQgYSBtc2cgKi8KKwkgICAgICBwcmludGYoIiBXQVJOSU5HIC0gbW9kZW0gaGFuZ3VwIGZhaWxlZFxyXG4iKTsgLyogZG9uJ3QgaGFuZ3VwISAqLworCSAgICByZXR1cm4oMCk7CisJfSBlbHNlIHsJCQkvKiBPdGhlcndpc2UgKi8KKwkgICAgeCA9IHR0aGFuZygpOwkJLyogVGVsbCB0aGUgT1MgdG8gdHVybiBvZmYgRFRSLiAqLworCSAgICBpZiAoeCA+IDApIHsJCS8qIFllcywgdGVsbCByZXN1bHRzIGZyb20gdHRoYW5nKCkgKi8KKwkJZGlhbHN0YSA9IERJQV9IVVA7CisJCWlmIChkaWFsZHB5KSBwcmludGYoIiBIYW5ndXAgT0tcclxuIik7CisJICAgIH0gZWxzZSBpZiAoeCA9PSAwKSB7CisJCWlmIChkaWFsZHB5KSBwcmludGYoIiBIYW5ndXAgc2tpcHBlZFxyXG4iKTsKKwkgICAgfSBlbHNlIHsKKwkJZGlhbHN0YSA9IERJQV9IQU5HOworCQlpZiAoZGlhbGRweSkgcGVycm9yKCIgSGFuZ3VwIGVycm9yIik7CisJICAgIH0KKwkgICAgdHRmbHVpKCk7CisJfQorICAgIH0gZWxzZSBpZiAoZGlhbGRweSkgcHJpbnRmKCIgSGFuZ3VwIHNraXBwZWRcclxuIik7IC8qIERJQUwgSEFOR1VQIE9GRiAqLworICAgIHJldHVybih4KTsKK30KKworLyoKKyAgTSBEIE0gSCBVIFAgIC0tCisKKyAgU2VuZHMgZXNjYXBlIHNlcXVlbmNlIHRvIG1vZGVtLCB0aGVuIHNlbmRzIGl0cyBoYW5ndXAgY29tbWFuZC4gIFJldHVybnM6CisgICAwOiBJZiBtb2RlbSB0eXBlIGlzIDAgKGRpcmVjdCBzZXJpYWwgY29ubmVjdGlvbiksCisgICAgICBvciBpZiBtb2RlbSB0eXBlIGlzIDwgMCAobmV0d29yayBjb25uZWN0aW9uKSwKKyAgICAgIG9yIGlmIG5vIGFjdGlvbiB0YWtlbiBiZWNhdXNlIERJQUwgTU9ERU0tSEFOR1VQIGlzIE9GRikKKyAgICAgICAgb3IgYmVjYXVzZSBubyBoYW5ndXAgc3RyaW5nIGZvciBjdXJyZW50IG1vZGVtIHR5cGUsCisgICAgICBvciBDLUtlcm1pdCBpcyBpbiByZW1vdGUgbW9kZSwKKyAgICAgIG9yIGlmIGFjdGlvbiB0YWtlbiBidXQgdGhlcmUgd2FzIG5vIHBvc2l0aXZlIHJlc3BvbnNlIGZyb20gbW9kZW07CisgICAxOiBTdWNjZXNzOiBtb2RlbSBpcyBpbiBjb21tYW5kIHN0YXRlIGFuZCBhY2tub3dsZWRnZWQgdGhlIGhhbmd1cCBjb21tYW5kOworICAtMTogT24gbW9kZW0gY29tbWFuZCBlcnJvci4KKyovCitpbnQKK21kbWh1cCgpIHsKKyNpZmRlZiBNRE1IVVAKKyAgICBpbnQgbSwgeCA9IDA7CisgICAgaW50IHhwYXJpdHk7CisgICAgaW50IHNhdmNhcnI7CisgICAgZXh0ZXJuIGludCB0dGNhcnI7CisgICAgY2hhciAqcywgKnAsIGM7CisgICAgTURNSU5GICogbXAgPSBOVUxMOworCisgICAgZGVidWcoRjEwMSwibWRtaHVwIGRpYWxtaHUiLCIiLGRpYWxtaHUpOyAvKiBNT0RFTS1IQU5HVVAgTUVUSE9EICovCisgICAgZGVidWcoRjEwMSwibWRtaHVwIGxvY2FsIiwiIixsb2NhbCk7CisKKyAgICBpZiAoZGlhbG1odSA9PSAwIHx8IGxvY2FsID09IDApCS8qIElmIERJQUwgTU9ERU0tSEFOR1VQIGlzIE9GRiwgKi8KKyAgICAgIHJldHVybigwKTsJCQkvKiAgb3Igbm90IGluIGxvY2FsIG1vZGUsIGZhaWwuICovCisKKyAgICBkZWJ1ZyhGMTAxLCJtZG1odXAgZGlhbHN0YSIsIiIsZGlhbHN0YSk7CisgICAgZGVidWcoRjEwMSwibWRtaHVwIG1kbXNldCIsIiIsbWRtc2V0KTsKKworICAgIGlmIChkaWFsc3RhICE9IERJQV9PSyAmJiAhbWRtc2V0KQkvKiBJdCdzIG5vdCBhIGRpYWxlZCBjb25uZWN0aW9uICovCisgICAgICByZXR1cm4oMCk7CisKKyNpZmRlZiBDS19UQVBJCisgICAgaWYgKHR0dGFwaSAmJiAhdGFwaXBhc3MpCQkvKiBEb24ndCBoYW5ndXAgaWYgdXNpbmcgVEFQSSAqLworICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIENLX1RBUEkgKi8KKworI2lmZGVmIENPTU1FTlQKKyAgICAvKiBObywgd2Ugc3RpbGwgbmVlZCB0aGlzIGZvciBtb2RlbXMgdGhhdCBpZ25vcmUgRFRSICovCisgICAgaWYgKG15bWRtdHlwID09IG5fR0VORVJJQyAmJiAhbmV0d29yaykKKyAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICBkZWJ1ZyhGMTAxLCJtZG1odXAgZGlhbGVzYyIsIiIsZGlhbGVzYyk7CisgICAgaWYgKGRpYWxlc2MgPCAwKQorICAgICAgcmV0dXJuKDApOwkJCS8qIE5vIG1vZGVtIGVzY2FwZS1jaGFyYWN0ZXIsIGZhaWwuICovCisKKyAgICBzYXZjYXJyID0gdHRjYXJyOworICAgIHR0Y2FyciA9IENBUl9PRkY7CisgICAgeCA9IHR0Y2hrKCk7CisgICAgdHRjYXJyID0gc2F2Y2FycjsKKyAgICBkZWJ1ZyhGMTAxLCJtZG1odXAgdHRjaGsiLCIiLHgpOworICAgIGlmICh4IDwgMCkJCQkJLyogVGhlcmUgYXBwZWFycyB0byBiZSBubyBjb25uZWN0aW9uICovCisgICAgICByZXR1cm4oMCk7CisgICAgeCA9IDA7CisKKyNpZmRlZiBPUzIKKy8qCisgIEluIE9TLzIsIGlmIENBUlJJRVIgaXMgT0ZGLCBhbmQgdGhlcmUgaXMgaW5kZWVkIG5vIGNhcnJpZXIgc2lnbmFsLCBhbnkKKyAgYXR0ZW1wdCB0byBkbyBpL28gYXQgdGhpcyBwb2ludCBjYW4gaGFuZyB0aGUgcHJvZ3JhbS4gIFRoaXMgbWlnaHQgYmUgdHJ1ZQorICBmb3Igb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMgdG9vLgorKi8KKyAgICBpZiAoIW5ldHdvcmsJCQkvKiBOb3QgYSBuZXR3b3JrIGNvbm5lY3Rpb24gKi8KKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgIHx8IGlzdG5jb21wb3J0KCkKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisJKSB7CisJbSA9IHR0Z21kbSgpOwkJCS8qIEdldCBtb2RlbSBzaWduYWxzICovCisJaWYgKChtID4gLTEpICYmIChtICYgQk1fRENEID09IDApKSAvKiBDaGVjayBmb3IgY2FycmllciAqLworCSAgcmV0dXJuKDApOwkJCS8qIE5vIGNhcnJpZXIsIHNraXAgdGhlIHJlc3QgKi8KKyAgICB9CisjZW5kaWYgLyogT1MyICovCisKKyAgICBkZWJ1ZyhGMTExLCJtZG1odXAgbmV0d29yayIsdHRuYW1lLG5ldHdvcmspOworICAgIGRlYnVnKEYxMDEsIm1kbWh1cCBteW1kbXR5cCIsIiIsbXltZG10eXApOworICAgIGRlYnVnKEYxMDEsIm1kbWh1cCBtZG10eXAiLCIiLG1kbXR5cCk7CisgICAgLyogSW4gY2FzZSBvZiBIQU5HVVAgYmVmb3JlIERJQUwgKi8KKyAgICBpZiAobmV0d29yayAmJiBtZG10eXAgPCAxKQkJLyogU0VUIEhPU1QgYnV0IG5vIHN1YnNlcXVlbnQgKi8KKyAgICAgIHJldHVybigwKTsJCQkvKiBTRVQgTU9ERU0gVFlQRS4uLiAqLworICAgIGlmIChteW1kbXR5cCA9PSAwICYmIG1kbXR5cCA+IDApCisgICAgICBteW1kbXR5cCA9IG1kbXR5cDsKKyAgICBpZiAobXltZG10eXAgPCAxKQkJCS8qIE5vdCB1c2luZyBhIG1vZGVtICovCisgICAgICByZXR1cm4oMCk7CisgICAgaWYgKG15bWRtdHlwID4gMCkJCQkvKiBBbiBhY3R1YWwgbW9kZW0uLi4gKi8KKyAgICAgIG1wID0gbW9kZW1wW215bWRtdHlwXTsKKyAgICBpZiAoIW1wKSB7CQkJCS8qIEdldCBwb2ludGVyIHRvIGl0cyBNRE1JTkYgc3RydWN0ICovCisJZGVidWcoRjEwMCwibWRtaHVwIG5vIE1ETUlORiIsIiIsMCk7CisJcmV0dXJuKDApOworICAgIH0KKyAgICBtZG1jYXBhcyA9IGRpYWxjYXBhcyA/IGRpYWxjYXBhcyA6IG1wLT5jYXBhczsKKyAgICB4eF9vayA9IG1wLT5va19mbjsJCQkvKiBQb2ludGVyIHRvIHJlc3BvbnNlIHJlYWRlciAqLworCisgICAgcyA9IGRpYWxoY21kID8gZGlhbGhjbWQgOiBtcC0+aHVwX3N0cjsgLyogR2V0IGhhbmd1cCBjb21tYW5kICovCisgICAgaWYgKCFzKSBzID0gIiI7CisgICAgZGVidWcoRjExMCwibWRtaHVwIGh1cF9zdHIiLHMsMCk7CisgICAgaWYgKCEqcykgcmV0dXJuKDApOwkJCS8qIElmIG5vbmUsIGZhaWwuICovCisKKyAgICBpZiAodHRwa3Qoc3BlZWQsRkxPX0RJQUwscGFyaXR5KSA8IDApIC8qIENvbmRpdGlvbiBsaW5lIGZvciBkaWFsaW5nICovCisgICAgICByZXR1cm4oLTEpOworCisgICAgeHBhcml0eSA9IHBhcml0eTsJCQkvKiBTZXQgUEFSSVRZIHRvIE5PTkUgdGVtcG9yYXJpbHkgKi8KKyAgICBwYXJpdHkgPSAwOworCisgICAgLyogSW4gY2FzZSB0aGV5IGdhdmUgYSBTRVQgTU9ERU0gRVNDQVBFIGNvbW1hbmQgcmVjZW50bHkuLi4gKi8KKworICAgIGlmIChkaWFsZXNjIDwgMCB8fCBkaWFsZXNjID4gMTI3KQorICAgICAgYyA9IE5VTDsKKyAgICBlbHNlCisgICAgICBjID0gKGNoYXIpIChkaWFsZXNjID8gZGlhbGVzYyA6IG1wLT5lc2NfY2hhcik7CisKKyAgICBpZiAobWRtY2FwYXMgJiBDS0RfQVQpIHsJCS8qIEhheWVzIGNvbXBhdGlibGUgKi8KKwllc2NidWZbMF0gPSBjOworCWVzY2J1ZlsxXSA9IGM7CisJZXNjYnVmWzJdID0gYzsKKwllc2NidWZbM10gPSBOVUw7CisgICAgfSBlbHNlIHsJCQkJLyogT3RoZXIgKi8KKwllc2NidWZbMF0gPSBjOworCWVzY2J1ZlsxXSA9IE5VTDsKKyAgICB9CisgICAgZGVidWcoRjExMCwibWRtaHVwIGVzY2J1ZiIsZXNjYnVmLDApOworICAgIGlmIChlc2NidWZbMF0pIHsJCQkvKiBIYXZlIGVzY2FwZSBzZXF1ZW5jZT8gKi8KKwlkZWJ1ZyhGMTAxLCJtZG1odXAgZXNjX3RpbWUiLDAsbXAtPmVzY190aW1lKTsKKwlpZiAobXAtPmVzY190aW1lKQkJLyogSWYgd2UgaGF2ZSBhIGd1YXJkIHRpbWUgKi8KKwkgIG1zbGVlcChtcC0+ZXNjX3RpbWUpOwkJLyogUGF1c2UgZm9yIGd1YXJkIHRpbWUgKi8KKwlkZWJ1ZyhGMTAwLCJtZG1odXAgcGF1c2UgMSBPSyIsIiIsMCk7CisKKyNpZmRlZiBORVRDT05OCQkJCS8qIFNlbmQgbW9kZW0ncyBlc2NhcGUgc2VxdWVuY2UgKi8KKwlpZiAobmV0d29yaykgewkJCS8qIE11c3QgY2F0Y2ggZXJyb3JzIGhlcmUuICovCisJICAgIGlmICh0dG9sKChDSEFSICopZXNjYnVmLChpbnQpc3RybGVuKChjaGFyICopZXNjYnVmKSkgPCAwKSB7CisJCXBhcml0eSA9IHhwYXJpdHk7CisJCXJldHVybigtMSk7CisJICAgIH0KKwkgICAgZGVidWcoRjExMCwibWRtaHVwIHR0c2xvdyBuZXQgb2siLGVzY2J1ZiwwKTsKKwl9IGVsc2UgeworI2VuZGlmIC8qIE5FVENPTk4gKi8KKwkgICAgdHRzbG93KChjaGFyICopZXNjYnVmLHdyKTsgLyogU2VuZCBlc2NhcGUgc2VxdWVuY2UgKi8KKwkgICAgZGVidWcoRjExMCwibWRtaHVwIHR0c2xvdyBvayIsZXNjYnVmLDApOworI2lmZGVmIE5FVENPTk4KKwl9CisjZW5kaWYgLyogTkVUQ09OTiAqLworCisJaWYgKG1wLT5lc2NfdGltZSkJCS8qIFBhdXNlIGZvciBndWFyZCB0aW1lIGFnYWluICovCisJICBtc2xlZXAobXAtPmVzY190aW1lKTsKKwllbHNlCisJICBtc2xlZXAoNTAwKTsJCQkvKiBXYWl0IGhhbGYgYSBzZWMgZm9yIGVjaG9lcy4gKi8KKwlkZWJ1ZyhGMTAwLCJtZG1odXAgcGF1c2UgMSBPSyIsIiIsMCk7CisjaWZkZWYgQ09NTUVOVAorCXR0Zmx1aSgpOwkJCS8qIEZsdXNoIHJlc3BvbnNlIG9yIGVjaG8sIGlmIGFueSAqLworCWRlYnVnKEYxMDAsIm1kbWh1cCB0dGZsdWkgT0siLCIiLDApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB9CisgICAgdHRzbG93KHMsd3IpOwkJCS8qIE5vdyBTZW5kIGhhbmd1cCBzdHJpbmcgKi8KKyAgICBkZWJ1ZyhGMTEwLCJtZG1odXAgdHRzbG93IG9rIixzLDApOworLyoKKyAgVGhpcyBpcyBub3QgZXhhY3RseSByaWdodCwgYnV0IGl0IHdvcmtzLgorICBJZiB3ZSBhcmUgb25saW5lOgorICAgIHRoZSBtb2RlbSBzYXlzIE9LIHdoZW4gaXQgZ2V0cyB0aGUgZXNjYXBlIHNlcXVlbmNlLAorICAgIGFuZCBpdCBzYXlzIE5PIENBUlJJRVIgd2hlbiBpdCBnZXRzIHRoZSBoYW5ndXAgY29tbWFuZC4KKyAgSWYgd2UgYXJlIG9mZmxpbmU6CisgICAgdGhlIG1vZGVtIGRvZXMgTk9UIHNheSBPSyAob3IgYW55dGhpbmcgZWxzZSkgd2hlbiBpdCBnZXRzIHRoZSBlc2Mgc2VxdWVuY2UsCisgICAgYnV0IGl0IERPRVMgc2F5IE9LIChhbmQgbm90IE5PIENBUlJJRVIpIHdoZW4gaXQgZ2V0cyB0aGUgaGFuZ3VwIGNvbW1hbmQuCisgIFNvIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gc2hvdWxkIHJlYWQgdGhlIE9LIGluIGJvdGggY2FzZXMuCisgIE9mIGNvdXJzZSwgdGhpcyBpcyBzb21ld2hhdCBIYXllcy1zcGVjaWZpYy4uLgorKi8KKyAgICBpZiAoeHhfb2spIHsJCQkvKiBMb29rIGZvciBPSyByZXNwb25zZSAqLworCWRlYnVnKEYxMDAsIm1kbWh1cCBjYWxsaW5nIHJlc3BvbnNlIGZ1bmN0aW9uIiwiIiwwKTsKKwl4ID0gKCp4eF9vaykoMywxKTsJCS8qIEdpdmUgaXQgMyBzZWNvbmRzLCBiZSBzdHJpY3QuICovCisJZGVidWcoRjEwMSwibWRtaHVwIGhhbmd1cCByZXNwb25zZSIsIiIseCk7CisJbXNsZWVwKDUwMCk7CQkJLyogV2FpdCBoYWxmIGEgc2VjICovCisJdHRmbHVpKCk7CQkJLyogR2V0IHJpZCBvZiBOTyBDQVJSSUVSLCBpZiBhbnkgKi8KKyAgICB9IGVsc2UgewkJCQkvKiBObyBPSyBmdW5jdGlvbiwgKi8KKwl4ID0gMTsJCQkJLyogc28gYXNzdW1lIGl0IHdvcmtlZCAqLworCWRlYnVnKEYxMDEsIm1kbWh1cCBubyBva19mbiIsIiIseCk7CisgICAgfQorICAgIHBhcml0eSA9IHhwYXJpdHk7CQkJLyogUmVzdG9yZSBwcmV2YWlsaW5nIHBhcml0eSAqLworICAgIHJldHVybih4KTsJCQkJLyogUmV0dXJuIE9LIGZ1bmN0aW9uJ3MgcmV0dXJuIGNvZGUuICovCisKKyNlbHNlICAvKiBNRE1IVVAgbm90IGRlZmluZWQuICovCisKKyAgICBkZWJ1ZyhGMTAwLCJtZG1odXAgTURNSFVQIG5vdCBkZWZpbmVkIiwiIiwwKTsKKyAgICByZXR1cm4oMCk7CQkJCS8qIEFsd2F5cyBmYWlsLiAqLworCisjZW5kaWYgLyogTURNSFVQICovCit9CisKKyNlbmRpZiAvKiBOT0lDUCAqLworI2Vsc2UgLyogTk9ESUFMICovCisKK2ludCBtZG10eXAgPSAwOwkJCQkvKiBEZWZhdWx0IG1vZGVtIHR5cGUgKi8KKworaW50CQkJCQkvKiBUbyBhbGxvdyBOT0RJQUwgdmVyc2lvbnMgdG8gKi8KK21kbWh1cCgpIHsJCQkJLyogY2FsbCBtZG1odXAoKSwgc28gY2FsbHMgdG8gICovCisgICAgcmV0dXJuKDApOwkJCQkvKiBtZG1odXAoKSBuZWVkIG5vdCBiZSB3aXRoaW4gKi8KK30JCQkJCS8qICNpZm5kZWYgTk9ESUFMIGNvbmRpdGlvbmFscyAqLworI2VuZGlmIC8qIE5PRElBTCAqLworI2Vsc2UKK2ludCBtZG10eXAgPSAwOwkJCQkvKiBEZWZhdWx0IG1vZGVtIHR5cGUgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2t1ZmlvLmMgYi9ja2VybWl0LTguMC4yMTEvY2t1ZmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4YzQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja3VmaW8uYwpAQCAtMCwwICsxLDgzMTAgQEAKKy8qIEMgSyBVIEYgSSBPICAtLSAgS2VybWl0IGZpbGUgc3lzdGVtIHN1cHBvcnQgZm9yIFVOSVgsIEFlZ2lzLCBhbmQgUGxhbiA5ICovCisKKyNkZWZpbmUgQ0tfTk9OQkxPQ0sgICAgICAgICAgICAgICAgICAgICAvKiBTZWUgem91dGR1bXAoKSAqLworCisjaWZkZWYgYWVnaXMKK2NoYXIgKmNrenYgPSAiQWVnaXMgRmlsZSBzdXBwb3J0LCA4LjAuMjAwLCA0IE1hciAyMDA0IjsKKyNlbHNlCisjaWZkZWYgUGxhbjkKK2NoYXIgKmNrenYgPSAiUGxhbiA5IEZpbGUgc3VwcG9ydCwgOC4wLjIwMCwgNCBNYXIgMjAwNCI7CisjZWxzZQorY2hhciAqY2t6diA9ICJVTklYIEZpbGUgc3VwcG9ydCwgOC4wLjIwMCwgNCBNYXIgMjAwNCI7CisjZW5kaWYgLyogUGxhbjkgKi8KKyNlbmRpZiAvKiBhZWdpcyAqLworLyoKKyAgQXV0aG9yOiBGcmFuayBkYSBDcnV6IDxmZGNAY29sdW1iaWEuZWR1PiwKKyAgQ29sdW1iaWEgVW5pdmVyc2l0eSBBY2FkZW1pYyBJbmZvcm1hdGlvbiBTeXN0ZW1zLCBOZXcgWW9yayBDaXR5LAorICBhbmQgb3RoZXJzIG5vdGVkIGluIHRoZSBjb21tZW50cyBiZWxvdy4gIE5vdGU6IENVQ0NBID0gUHJldmlvdXMgbmFtZSBvZgorICBDb2x1bWJpYSBVbml2ZXJzaXR5IEFjYWRlbWljIEluZm9ybWF0aW9uIFN5c3RlbXMuCisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisKKy8qCisgIE5PVEUgVE8gQ09OVFJJQlVUT1JTOiBUaGlzIGZpbGUsIGFuZCBhbGwgdGhlIG90aGVyIEMtS2VybWl0IGZpbGVzLCBtdXN0IGJlCisgIGNvbXBhdGlibGUgd2l0aCBDIHByZXByb2Nlc3NvcnMgdGhhdCBzdXBwb3J0IG9ubHkgI2lmZGVmLCAjZWxzZSwgI2VuZGlmLAorICAjZGVmaW5lLCBhbmQgI3VuZGVmLiAgUGxlYXNlIGRvIG5vdCB1c2UgI2lmLCBsb2dpY2FsIG9wZXJhdG9ycywgb3Igb3RoZXIKKyAgcHJlcHJvY2Vzc29yIGZlYXR1cmVzIGluIGFueSBvZiB0aGUgcG9ydGFibGUgQy1LZXJtaXQgbW9kdWxlcy4gIFlvdSBjYW4sCisgIG9mIGNvdXJzZSwgdXNlIHRoZXNlIGNvbnN0cnVjdGlvbnMgaW4gcGxhdGZvcm0tc3BlY2lmaWMgbW9kdWxlcyB3aGVyZSB5b3UKKyAga25vdyB0aGV5IGFyZSBzdXBwb3J0ZWQuCisqLworLyogSW5jbHVkZSBGaWxlcyAqLworCisjaWZkZWYgTUlOSVgyCisjZGVmaW5lIF9NSU5JWAorI2VuZGlmIC8qIE1JTklYMiAqLworCisjaW5jbHVkZSAiY2tjc3ltLmgiCisjaW5jbHVkZSAiY2tjZGViLmgiCisjaW5jbHVkZSAiY2tjYXNjLmgiCisKKyNpZm5kZWYgTk9DU0VUUworI2luY2x1ZGUgImNrY3hsYS5oIgorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmZGVmIENPTU1FTlQKKy8qIFRoaXMgY2F1c2VzIHRyb3VibGUgaW4gQy1LZXJtaXQgOC4wLiAgSSBkb24ndCByZW1lbWJlciB0aGUgb3JpZ2luYWwgKi8KKy8qIHJlYXNvbiBmb3IgdGhpcyBiZWluZyBoZXJlIGJ1dCBpdCBtdXN0IGhhdmUgYmVlbiBuZWVkZWQgYXQgdGhlIHRpbWUuLi4gKi8KKyNpZmRlZiBPU0YxMworI2lmZGVmIENLX0FOU0lDCisjaWZkZWYgX05PX1BST1RPCisjdW5kZWYgX05PX1BST1RPCisjZW5kaWYgLyogX05PX1BST1RPICovCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyNlbmRpZiAvKiBPU0YxMyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZmRlZiBNSU5JWDIKKyN1bmRlZiBNSU5JWAorI3VuZGVmIENLU1lTTE9HCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2RlZmluZSBOT0ZJTEVICisjZW5kaWYgLyogTUlOSVgyICovCisKKyNpZmRlZiBNSU5JWAorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbHNlCisjaWZkZWYgUE9TSVgKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjaWZkZWYgU1ZSMworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2VuZGlmIC8qIFNWUjMgKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworI2VuZGlmIC8qIE1JTklYICovCisvKgorICBEaXJlY3RvcnkgU2VwYXJhdG9yIG1hY3JvcywgdG8gYWxsb3cgdGhpcyBtb2R1bGUgdG8gd29yayB3aXRoIGJvdGggVU5JWCBhbmQKKyAgT1MvMjogQmVjYXVzZSBvZiBhbWJpZ3VpdHkgd2l0aCB0aGUgY29tbWFuZCBsaW5lIGVkaXRvciBlc2NhcGUgXCBjaGFyYWN0ZXIsCisgIHRoZSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGlzIGN1cnJlbnRseSBsZWZ0IGFzIC8gZm9yIE9TLzIgdG9vLCBiZWNhdXNlIHRoZQorICBPUy8yIGtlcm5lbCBhbHNvIGFjY2VwdHMgLyBhcyBkaXJlY3Rvcnkgc2VwYXJhdG9yLiAgQnV0IHRoaXMgaXMgc3ViamVjdCB0bworICBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zIHRvIGNvbmZvcm0gdG8gdGhlIG5vcm1hbCBPUy8yIHN0eWxlLgorKi8KKyNpZm5kZWYgRElSU0VQCisjZGVmaW5lIERJUlNFUCAgICAgICAnLycKKyNlbmRpZiAvKiBESVJTRVAgKi8KKyNpZm5kZWYgSVNESVJTRVAKKyNkZWZpbmUgSVNESVJTRVAoYykgICgoYyk9PScvJykKKyNlbmRpZiAvKiBJU0RJUlNFUCAqLworCisjaWZkZWYgU0RJUkVOVAorI2RlZmluZSBESVJFTlQKKyNlbmRpZiAvKiBTRElSRU5UICovCisKKyNpZmRlZiBYTkRJUgorI2luY2x1ZGUgPHN5cy9uZGlyLmg+CisjZWxzZSAvKiAhWE5ESVIgKi8KKyNpZmRlZiBORElSCisjaW5jbHVkZSA8bmRpci5oPgorI2Vsc2UgLyogIU5ESVIsICFYTkRJUiAqLworI2lmZGVmIFJUVQorI2luY2x1ZGUgIi91c3IvbGliL25kaXIuaCIKKyNlbHNlIC8qICFSVFUsICFORElSLCAhWE5ESVIgKi8KKyNpZmRlZiBESVJFTlQKKyNpZmRlZiBTRElSRU5UCisjaW5jbHVkZSA8c3lzL2RpcmVudC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNlbmRpZiAvKiBTRElSRU5UICovCisjZWxzZQorI2luY2x1ZGUgPHN5cy9kaXIuaD4KKyNlbmRpZiAvKiBESVJFTlQgKi8KKyNlbmRpZiAvKiBSVFUgKi8KKyNlbmRpZiAvKiBORElSICovCisjZW5kaWYgLyogWE5ESVIgKi8KKworI2lmZGVmIFVOSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgYXJnIHRvIHdhaXQoKSBhbGxvd2VkICovCisjZGVmaW5lIENLX0NISUxEICAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIHRoaXMgaXMgc2FmZSBpbiBhbGwgVU5JWCAqLworI2VuZGlmIC8qIFVOSVggKi8KKworZXh0ZXJuIGludCBiaW5hcnksIHJlY3Vyc2l2ZSwgc3RhdGhhY2s7CisjaWZkZWYgQ0tfQ1RSTFoKK2V4dGVybiBpbnQgZW9mbWV0aG9kOworI2VuZGlmIC8qIENLX0NUUkxaICovCisKKyNpbmNsdWRlIDxwd2QuaD4gICAgICAgICAgICAgICAgICAgICAgICAvKiBQYXNzd29yZCBmaWxlIGZvciBzaGVsbCBuYW1lICovCisjaWZkZWYgQ0tfU1JQCisjaW5jbHVkZSA8dF9wd2QuaD4gICAgICAgICAgICAgICAgICAgICAgLyogU1JQIFBhc3N3b3JkIGZpbGUgKi8KKyNlbmRpZiAvKiBDS19TUlAgKi8KKworI2lmZGVmIEhQVVgxMF9UUlVTVEVECisjaW5jbHVkZSA8aHBzZWN1cml0eS5oPgorI2luY2x1ZGUgPHByb3QuaD4KKyNlbmRpZiAvKiBIUFVYMTBfVFJVU1RFRCAqLworCisjaWZkZWYgQ09NTUVOVAorLyogTW92ZWQgdG8gY2tjZGViLmggKi8KKyNpZmRlZiBQT1NJWAorI2RlZmluZSBVVElNRUgKKyNlbHNlCisjaWZkZWYgSFBVWDkKKyNkZWZpbmUgVVRJTUVICisjZW5kaWYgLyogSFBVWDkgKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIFNZU1VUSU1FSCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDxzeXMvdXRpbWUuaD4gaWYgcmVxdWVzdGVkLCAgKi8KKyNpbmNsdWRlIDxzeXMvdXRpbWUuaD4gICAgICAgICAgICAgICAgICAvKiBmb3IgZXh0cmEgZmllbGRzIHJlcXVpcmVkIGJ5ICovCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogODhPcGVuIHNwZWMuICovCisjaWZkZWYgVVRJTUVIICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3IgPHV0aW1lLmg+IGlmIHJlcXVlc3RlZCAqLworI2luY2x1ZGUgPHV0aW1lLmg+ICAgICAgICAgICAgICAgICAgICAgIC8qIChTVlI0LCBQT1NJWCkgKi8KKyNpZm5kZWYgQlNENDQKKyNpZm5kZWYgVjcKKy8qIE5vdCBzdXJlIHdoeSB0aGlzIGlzIGhlcmUuICBXaGF0IGl0IGltcGxpZXMgaXMgdGhhdCB0aGUgY29kZSBicmFja2V0ZWQKKyAgIGJ5IFNZU1VUSU1FSCBpcyB2YWxpZCBvbiBhbGwgcGxhdGZvcm1zIG9uIHdoaWNoIHdlIHN1cHBvcnQgdGltZSAKKyAgIGZ1bmN0aW9uYWxpdHkuICBCdXQgd2Uga25vdyB0aGF0IGlzIG5vdCB0cnVlIGJlY2F1c2UgdGhlIEJTRDQ0IGFuZCBWNworICAgcGxhdGZvcm1zIGRvIG5vdCBzdXBwb3J0IHN5cy91dGltZS5oIGFuZCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHdoaWNoCisgICBhcmUgZGVmaW5lZCBpbiB0aGVtLiAgTm93IHRoaXMgd29ya2VkIGJlZm9yZSBiZWNhdXNlIHByaW9yIHRvIHRvZGF5J3MKKyAgIGNoYW5nZXMgdGhlIFVUSU1FSCBkZWZpbml0aW9uIGZvciBCU0Q0NCBhbmQgVjcgZGlkIG5vdCB0YWtlIHBsYWNlCisgICB1bnRpbCBhZnRlciBTWVNVVElNRUggd2FzIGRlZmluZWQuICBJdCBhbHNvIHdvdWxkIG5vdCBoYXZlIGJlZW4gYSAKKyAgIHByb2JsZW0gaWYgdGhlIG9yZGVyaW5nIG9mIGFsbCB0aGUgdGltZSBibG9ja3Mgd2FzIGNvbnNpc3RlbnQuICBBbGwgYnV0CisgICBvbmUgb2YgdGhlIGJsb2NrcyB3ZXJlIEJTRDQ0LCBWNywgU1lTVVRJTUVILCA8T1RIRVI+LiAgVGhhdCBvbmUgY2FzZQorICAgaXMgd2hlcmUgdGhpcyBwcm9ibGVtIHdhcyB0cmlnZ2VyZWQuCisqLworI2RlZmluZSBTWVNVVElNRUggICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSB0aGlzIGZvciBib3RoIGNhc2VzLiAqLworI2VuZGlmIC8qIFY3ICovCisjZW5kaWYgLyogQlNENDQgKi8KKyNlbmRpZiAvKiBVVElNRUggKi8KKyNlbmRpZiAvKiBTWVNVVElNRUggKi8KKworI2lmbmRlZiBOT1RJTUVTVEFNUAorI2lmZGVmIFBPU0lYCisjaWZuZGVmIEFTNDAwCisjZGVmaW5lIFRJTUVTVEFNUAorI2VuZGlmIC8qIEFTNDAwICovCisjZW5kaWYgLyogUE9TSVggKi8KKworI2lmZGVmIEJTRDQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJTRCA0LjQgKi8KKyNpZm5kZWYgVElNRVNUQU1QCisjZGVmaW5lIFRJTUVTVEFNUCAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FuIGRvIGZpbGUgZGF0ZXMgKi8KKyNlbmRpZiAvKiBUSU1FU1RBTVAgKi8KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lYi5oPgorCisjZWxzZSAgLyogTm90IEJTRDQ0ICovCisKKyNpZmRlZiBCU0Q0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCU0QgNC4zIGFuZCBiZWxvdyAqLworI2RlZmluZSBUSU1FU1RBTVAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbiBkbyBmaWxlIGRhdGVzICovCisjaW5jbHVkZSA8dGltZS5oPiAgICAgICAgICAgICAgICAgICAgICAgLyogTmVlZCB0aGlzICovCisjaW5jbHVkZSA8c3lzL3RpbWViLmg+ICAgICAgICAgICAgICAgICAgLyogTmVlZCB0aGlzIGlmIHJlYWxseSBCU0QgKi8KKworI2Vsc2UgIC8qIE5vdCBCU0QgNC4zIGFuZCBiZWxvdyAqLworCisjaWZkZWYgU1ZPUlBPU0lYICAgICAgICAgICAgICAgICAgICAgICAgLyogU3lzdGVtIFYgb3IgUE9TSVggKi8KKyNpZm5kZWYgVElNRVNUQU1QCisjZGVmaW5lIFRJTUVTVEFNUAorI2VuZGlmIC8qIFRJTUVTVEFNUCAqLworI2luY2x1ZGUgPHRpbWUuaD4KKworLyogdm9pZCB0enNldCgpOyAodGhlICJ2b2lkIiB0eXBlIHVwc2V0cyBzb21lIGNvbXBpbGVycykgKi8KKyNpZm5kZWYgSVJJWDYwCisjaWZuZGVmIHVsdHJpeAorI2lmbmRlZiBDT05WRVg5CisvKiBDb252ZXhPUyA5LjAsIHN1cHBvc2VkbHkgUE9TSVgsIGhhcyBleHRlcm4gY2hhciAqdGltZXpvbmUoaW50LGludCkgKi8KKyNpZm5kZWYgUGxhbjkKK2V4dGVybiBsb25nIHRpbWV6b25lOworI2VuZGlmIC8qIFBsYW45ICovCisjZW5kaWYgLyogQ09OVkVYOSAqLworI2VuZGlmIC8qIHVsdHJpeCAqLworI2VuZGlmIC8qIElSSVg2MCAqLworI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworI2VuZGlmIC8qIEJTRDQgKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworCisjaWZkZWYgQ09IRVJFTlQKKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKworLyogSXMgYHknIGEgbGVhcCB5ZWFyPyAqLworI2RlZmluZSBsZWFwKHkpICgoKHkpICUgNCA9PSAwICYmICh5KSAlIDEwMCAhPSAwKSB8fCAoeSkgJSA0MDAgPT0gMCkKKworLyogTnVtYmVyIG9mIGxlYXAgeWVhcnMgZnJvbSAxOTcwIHRvIGB5JyAobm90IGluY2x1ZGluZyBgeScgaXRzZWxmKS4gKi8KKyNkZWZpbmUgbmxlYXAoeSkgKCgoeSkgLSAxOTY5KSAvIDQgLSAoKHkpIC0gMTkwMSkgLyAxMDAgKyAoKHkpIC0gMTYwMSkgLyA0MDApCisKKyNlbmRpZiAvKiBOT1RJTUVTVEFNUCAqLworCisjaWZkZWYgQ0lFCisjaW5jbHVkZSA8c3RhdC5oPiAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSBzdGF0dXMgKi8KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZiAvKiBDSUUgKi8KKworLyogTWFjcm8gdG8gYWxsZXZpYXRlIGlzZGlyKCkgY2FsbHMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUgKi8KKworc3RhdGljIHN0cnVjdCBzdGF0IFNUQVRCVUY7CisjZGVmaW5lIHhpc2RpcihhKSAoKHN0YXQoYSwmU1RBVEJVRik9PS0xKT8wOihTX0lTRElSKFNUQVRCVUYuc3RfbW9kZSk/MTowKSkKKworZXh0ZXJuIGNoYXIgdWlkYnVmW107CitleHRlcm4gaW50IHhmZXJsb2c7CitleHRlcm4gY2hhciAqIHhmZXJmaWxlOworaW50IGlrbG9nb3BlbiA9IDA7CitzdGF0aWMgdGltZV90IHRpbWVub3c7CisKKyNkZWZpbmUgSUtTRE1TR0xFTiBDS01BWFBBVEgrNTEyCisKK3N0YXRpYyBjaGFyIGlrc2Rtc2dbSUtTRE1TR0xFTl07CisKK2V4dGVybiBpbnQgbG9jYWw7CisKK2V4dGVybiBpbnQgc2VydmVyLCBlbl9ta2QsIGVuX2N3ZCwgZW5fZGVsOworCisvKgorICBGdW5jdGlvbnMgKG4gaXMgb25lIG9mIHRoZSBwcmVkZWZpbmVkIGZpbGUgbnVtYmVycyBmcm9tIGNrY2tlci5oKToKKworICAgem9wZW5pKG4sbmFtZSkgICAtLSBPcGVucyBhbiBleGlzdGluZyBmaWxlIGZvciBpbnB1dC4KKyAgIHpvcGVubyhuLG5hbWUsYXR0cixmY2IpIC0tIE9wZW5zIGEgbmV3IGZpbGUgZm9yIG91dHB1dC4KKyAgIHpjbG9zZShuKSAgICAgICAgLS0gQ2xvc2VzIGEgZmlsZS4KKyAgIHpjaGluKG4sJmMpICAgICAgLS0gR2V0cyB0aGUgbmV4dCBjaGFyYWN0ZXIgZnJvbSBhbiBpbnB1dCBmaWxlLgorICAgenNpbmwobiwmcyx4KSAgICAtLSBSZWFkIGEgbGluZSBmcm9tIGZpbGUgbiwgbWF4IGxlbiB4LCBpbnRvIGFkZHJlc3Mgcy4KKyAgIHpzb3V0KG4scykgICAgICAgLS0gV3JpdGUgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIG91dHB1dCBmaWxlLCBidWZmZXJlZC4KKyAgIHpzb3V0bChuLHMpICAgICAgLS0gTGlrZSB6c291dCwgYnV0IGFwcGVuZHMgYSBsaW5lIHRlcm1pbmF0b3IuCisgICB6c291dHgobixzLHgpICAgIC0tIFdyaXRlIHggY2hhcmFjdGVycyB0byBvdXRwdXQgZmlsZSwgdW5idWZmZXJlZC4KKyAgIHpjaG91dChuLGMpICAgICAgLS0gQWRkIGEgY2hhcmFjdGVyIHRvIGFuIG91dHB1dCBmaWxlLCB1bmJ1ZmZlcmVkLgorICAgemNoa2kobmFtZSkgICAgICAtLSBDaGVjayBpZiBuYW1lZCBmaWxlIGV4aXN0cyBhbmQgaXMgcmVhZGFibGUsIHJldHVybiBzaXplLgorICAgemNoa28obmFtZSkgICAgICAtLSBDaGVjayBpZiBuYW1lZCBmaWxlIGNhbiBiZSBjcmVhdGVkLgorICAgemNoa3NwYShuYW1lLG4pICAtLSBDaGVjayBpZiBuIGJ5dGVzIGF2YWlsYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUsIG5hbWUuCisgICB6bmV3bihuYW1lLHMpICAgIC0tIE1ha2UgYSBuZXcgdW5pcXVlIGZpbGUgbmFtZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gbmFtZS4KKyAgIHpkZWxldChuYW1lKSAgICAgLS0gRGVsZXRlIHRoZSBuYW1lZCBmaWxlLgorICAgenhwYW5kKHN0cmluZykgICAtLSBFeHBhbmRzIHRoZSBnaXZlbiB3aWxkY2FyZCBzdHJpbmcgaW50byBhIGxpc3Qgb2YgZmlsZXMuCisgICB6bmV4dChzdHJpbmcpICAgIC0tIFJldHVybnMgdGhlIG5leHQgZmlsZSBmcm9tIHRoZSBsaXN0IGluICJzdHJpbmciLgorICAgenhyZXdpbmQoKSAgICAgICAtLSBSZXdpbmQgenhwYW5kIGxpc3QuCisgICB6eGNtZChuLGNtZCkgICAgIC0tIEV4ZWN1dGUgdGhlIGNvbW1hbmQgaW4gYSBsb3dlciBmb3JrIG9uIGZpbGUgbnVtYmVyIG4uCisgICB6Y2xvc2YoKSAgICAgICAgIC0tIENsb3NlIGlucHV0IGZpbGUgYXNzb2NpYXRlZCB3aXRoIHp4Y21kKCkncyBsb3dlciBmb3JrLgorICAgenJ0b2wobjEsbjIpICAgICAtLSBDb252ZXJ0IHJlbW90ZSBmaWxlbmFtZSBpbnRvIGxvY2FsIGZvcm0uCisgICB6bHRvcihuMSxuMikgICAgIC0tIENvbnZlcnQgbG9jYWwgZmlsZW5hbWUgaW50byByZW1vdGUgZm9ybS4KKyAgIHpjaGRpcihkaXJuYW0pICAgLS0gQ2hhbmdlIHdvcmtpbmcgZGlyZWN0b3J5LgorICAgemhvbWUoKSAgICAgICAgICAtLSBSZXR1cm4gcG9pbnRlciB0byBob21lIGRpcmVjdG9yeSBuYW1lIHN0cmluZy4KKyAgIHprc2VsZigpICAgICAgICAgLS0gS2lsbCBzZWxmLCBsb2cgb3V0IG93biBqb2IuCisgICB6c2F0dHIoc3RydWN0IHphdHRyICopIC0tIFJldHVybiBhdHRyaWJ1dGVzIGZvciBmaWxlIHdoaWNoIGlzIGJlaW5nIHNlbnQuCisgICB6c3RpbWUoZiwgc3RydWN0IHphdHRyICosIHgpIC0gU2V0IGZpbGUgY3JlYXRpb24gZGF0ZSBmcm9tIGF0dHJpYnV0ZSBwYWNrZXQuCisgICB6cmVuYW1lKG9sZCwgbmV3KSAtLSBSZW5hbWUgYSBmaWxlLgorICAgemNvcHkoc291cmNlLGRlc3RpbmF0aW9uKSAtLSBDb3B5IGEgZmlsZS4KKyAgIHpta2RpcihwYXRoKSAgICAgICAtLSBDcmVhdGUgdGhlIGRpcmVjdG9yeSBwYXRoIGlmIHBvc3NpYmxlCisgICB6Zm5xZnAoZm5hbWUsbGVuLGZ1bGxwYXRoKSAtIERldGVybWluZSBmdWxsIHBhdGggZm9yIGZpbGUgbmFtZS4KKyAgIHpnZXRmcyhuYW1lKSAgICAgLS0gcmV0dXJuIGZpbGUgc2l6ZSByZWdhcmRsZXNzIG9mIGFjY2Vzc2liaWxpdHkKKyAgIHpjaGtwaWQocGlkKSAgICAgLS0gdGVsbCBpZiBQSUQgaXMgdmFsaWQgYW5kIGFjdGl2ZQorKi8KKworLyogS2VybWl0LXNwZWNpZmljIGluY2x1ZGVzICovCisvKgorICBEZWZpbml0aW9ucyBoZXJlIHN1cGVyc2VkZSB0aG9zZSBmcm9tIHN5c3RlbSBpbmNsdWRlIGZpbGVzLgorICBja2NkZWIuaCBpcyBpbmNsdWRlZCBhYm92ZS4KKyovCisjaW5jbHVkZSAiY2tja2VyLmgiICAgICAgICAgICAgICAgICAgICAgLyogS2VybWl0IGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiY2t1Y21kLmgiICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGtleXdvcmQgdGFibGVzICovCisjaW5jbHVkZSAiY2t1dmVyLmgiICAgICAgICAgICAgICAgICAgICAgLyogVmVyc2lvbiBoZXJhbGQgKi8KKworY2hhciAqY2t6c3lzID0gSEVSQUxEOworCisvKgorICBGaWxlIGFjY2VzcyBjaGVja2luZyAuLi4gIFRoZXJlIGFyZSB0d28gY2FsbHMgdG8gYWNjZXNzKCkgaW4gdGhpcyBtb2R1bGUuCisgIElmIHRoaXMgcHJvZ3JhbSBpcyBpbnN0YWxsZWQgc2V0dWlkIG9yIHNldGdpZCBvbiBhIEJlcmtlbGV5LWJhc2VkIFVOSVgKKyAgc3lzdGVtIHRoYXQgZG9lcyBOT1QgaW5jb3Jwb3JhdGUgdGhlIHNhdmVkLW9yaWdpbmFsLWVmZmVjdGl2ZS11aWQvZ2lkCisgIGZlYXR1cmUsIHRoZW4sIHdoZW4gd2UgaGF2ZSBzd2FwcGVkIHRoZSBlZmZlY3RpdmUgYW5kIG9yaWdpbmFsIHVpZC9naWQsCisgIGFjY2VzcygpIGZhaWxzIGJlY2F1c2UgaXQgdXNlcyB3aGF0IGl0IHRoaW5rcyBhcmUgdGhlIFJFQUwgaWRzLCBidXQgd2UgaGF2ZQorICBzd2FwcGVkIHRoZW0uICBUaGlzIG9jY3VycyBvbiBzeXN0ZW1zIHdoZXJlIEFOWUJTRCBpcyBkZWZpbmVkLCBOT1NFVFJFVQorICBpcyBOT1QgZGVmaW5lZCwgYW5kIFNBVkVEVUlEIGlzIE5PVCBkZWZpbmVkLiAgU28sIGluIHRoZW9yeSwgd2Ugc2hvdWxkIHRha2UKKyAgY2FyZSBvZiB0aGlzIHNpdHVhdGlvbiBsaWtlIHNvOgorCisgICAgaWZkZWYgQU5ZQlNECisgICAgaWZuZGVmIE5PU0VUUkVVCisgICAgaWZuZGVmIFNBVkVEVUlECisgICAgZGVmaW5lIFNXX0FDQ19JRAorICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICBlbmRpZgorCisgIEJ1dCB3ZSBjYW4ndCB0ZXN0IHN1Y2ggYSBnZW5lcmFsIHNjaGVtZSBldmVyeXdoZXJlLCBzbyBsZXQncyBvbmx5IGRvIHRoaXMKKyAgd2hlbiB3ZSBrbm93IHdlIGhhdmUgdG8uLi4KKyovCisjaWZkZWYgTkVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVYVFNURVAgMS4wLTMuMCAqLworI2RlZmluZSBTV19BQ0NfSUQKKyNlbmRpZiAvKiBORVhUICovCisKKy8qIFN1cHBvcnQgZm9yIHRpbGRlLWV4cGFuc2lvbiBpbiBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMgKi8KKworI2lmZGVmIFBPU0lYCisjZGVmaW5lIE5BTUVFTlYgIkxPR05BTUUiCisjZWxzZQorI2lmZGVmIEJTRDQKKyNkZWZpbmUgTkFNRUVOViAiVVNFUiIKKyNlbHNlCisjaWZkZWYgQVRUU1YKKyNkZWZpbmUgTkFNRUVOViAiTE9HTkFNRSIKKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIEJTRDQgKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworCisvKiBCZXJrZWxleSBVbml4IFZlcnNpb24gNC54ICovCisvKiA0LjFic2Qgc3VwcG9ydCBmcm9tIENoYXJsZXMgRSBCcm9va3MsIEVETi1WQVggKi8KKworI2lmZGVmIEJTRDQKKyNpZmRlZiBNQVhOQU1MRU4KKyNkZWZpbmUgQlNENDIKKyNlbmRpZiAvKiBNQVhOQU1MRU4gKi8KKyNlbmRpZiAvKiBCU0Q0ICovCisKKy8qIERlZmluaXRpb25zIG9mIHNvbWUgc3lzdGVtIGNvbW1hbmRzICovCisKK2NoYXIgKkRFTENNRCA9ICJybSAtZiAiOyAgICAgICAgICAgICAgICAvKiBGb3IgZmlsZSBkZWxldGlvbiAqLworY2hhciAqQ1BZQ01EID0gImNwICI7ICAgICAgICAgICAgICAgICAgIC8qIEZvciBmaWxlIGNvcHkgKi8KK2NoYXIgKlJFTkNNRCA9ICJtdiAiOyAgICAgICAgICAgICAgICAgICAvKiBGb3IgZmlsZSByZW5hbWUgKi8KK2NoYXIgKlBXRENNRCA9ICJwd2QgIjsgICAgICAgICAgICAgICAgICAvKiBGb3Igc2F5aW5nIHdoZXJlIEkgYW0gKi8KKworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBIUFVYMTAKK2NoYXIgKkRJUkNNRCA9ICIvdXNyL2Jpbi9scyAtbCAiOyAgICAgICAvKiBGb3IgZGlyZWN0b3J5IGxpc3RpbmcgKi8KK2NoYXIgKkRJUkNNMiA9ICIvdXNyL2Jpbi9scyAtbCAiOyAgICAgICAvKiBGb3IgZGlyZWN0b3J5IGxpc3RpbmcsIG5vIGFyZ3MgKi8KKyNlbHNlCitjaGFyICpESVJDTUQgPSAiL2Jpbi9scyAtbCAiOyAgICAgICAgICAgLyogRm9yIGRpcmVjdG9yeSBsaXN0aW5nICovCitjaGFyICpESVJDTTIgPSAiL2Jpbi9scyAtbCAiOyAgICAgICAgICAgLyogRm9yIGRpcmVjdG9yeSBsaXN0aW5nLCBubyBhcmdzICovCisjZW5kaWYgLyogSFBVWDEwICovCisjZWxzZQorY2hhciAqRElSQ01EID0gImxzIC1sICI7ICAgICAgICAgICAgICAgIC8qIEZvciBkaXJlY3RvcnkgbGlzdGluZyAqLworY2hhciAqRElSQ00yID0gImxzIC1sICI7ICAgICAgICAgICAgICAgIC8qIEZvciBkaXJlY3RvcnkgbGlzdGluZywgbm8gYXJncyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworY2hhciAqVFlQQ01EID0gImNhdCAiOyAgICAgICAgICAgICAgICAgIC8qIEZvciB0eXBpbmcgYSBmaWxlICovCisKKyNpZmRlZiBIUFVYCitjaGFyICpNQUlMQ01EID0gIm1haWx4IjsgICAgICAgICAgICAgICAgLyogRm9yIHNlbmRpbmcgbWFpbCAqLworI2Vsc2UKKyNpZmRlZiBER1VYNTQwCitjaGFyICpNQUlMQ01EID0gIm1haWx4IjsKKyNlbHNlCisjaWZkZWYgVU5JWAorI2lmZGVmIENLX01BSUxDTUQKK2NoYXIgKk1BSUxDTUQgPSBDS19NQUlMQ01EOwkJLyogQ0ZMQUdTIG92ZXJyaWRlICovCisjZWxzZQorY2hhciAqTUFJTENNRCA9ICJNYWlsIjsJCQkvKiBEZWZhdWx0ICovCisjZW5kaWYgLyogQ0tfTUFJTENNRCAqLworI2Vsc2UKK2NoYXIgKk1BSUxDTUQgPSAiIjsKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogSFBVWCAqLworI2VuZGlmIC8qIERHVVg0MCAqLworCisjaWZkZWYgVU5JWAorI2lmZGVmIEFOWUJTRCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJTRCB1c2VzIGxwciB0byBzcG9vbCAqLworI2lmZGVmIERHVVg1NDAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFuZCBERy9VWCAqLworY2hhciAqIFBSSU5UQ01EID0gImxwIjsKKyNlbHNlCitjaGFyICogUFJJTlRDTUQgPSAibHByIjsKKyNlbmRpZiAvKiBER1VYNTQwICovCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3lzIFYgdXNlcyBscCAqLworI2lmZGVmIFRSUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4Y2VwdCBmb3IgVGFuZHktMTYvNjAwMC4uLiAqLworY2hhciAqIFBSSU5UQ01EID0gImxwciI7CisjZWxzZQorY2hhciAqIFBSSU5UQ01EID0gImxwIjsKKyNlbmRpZiAvKiBUUlMxNiAqLworI2VuZGlmIC8qIEFOWUJTRCAqLworI2Vsc2UgIC8qIE5vdCBVTklYICovCisjZGVmaW5lIFBSSU5UQ01EICIiCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZkZWYgRlQxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9ydHVuZSBGb3I6UHJvIDEuOCAqLworI3VuZGVmIEJTRDQKKyNlbmRpZiAvKiBGVDE4ICovCisKKyNpZmRlZiBCU0Q0CitjaGFyICpTUEFDTUQgPSAicHdkIDsgZGYgLiI7ICAgICAgICAgICAgLyogU3BhY2UgaW4gY3VycmVudCBkaXJlY3RvcnkgKi8KKyNlbHNlCisjaWZkZWYgRlQxOAorY2hhciAqU1BBQ01EID0gInB3ZCA7IGR1IDsgZGYgLiI7CisjZWxzZQorY2hhciAqU1BBQ01EID0gImRmICI7CisjZW5kaWYgLyogRlQxOCAqLworI2VuZGlmIC8qIEJTRDQgKi8KKworY2hhciAqU1BBQ00yID0gImRmICI7ICAgICAgICAgICAgICAgICAgIC8qIEZvciBzcGFjZSBpbiBzcGVjaWZpZWQgZGlyZWN0b3J5ICovCisKKyNpZmRlZiBGVDE4CisjZGVmaW5lIEJTRDQKKyNlbmRpZiAvKiBGVDE4ICovCisKKyNpZmRlZiBCU0Q0CitjaGFyICpXSE9DTUQgPSAiZmluZ2VyICI7CisjZWxzZQorY2hhciAqV0hPQ01EID0gIndobyAiOworI2VuZGlmIC8qIEJTRDQgKi8KKworLyogTW9yZSBzeXN0ZW0tZGVwZW5kZW50IGluY2x1ZGVzLCB3aGljaCBkZXBlbmQgb24gc3ltYm9scyBkZWZpbmVkICovCisvKiBpbiB0aGUgS2VybWl0LXNwZWNpZmljIGluY2x1ZGVzLiAgT2ggd2hhdCBhIHRhbmdsZWQgd2ViIHdlIHdlYXZlLi4uICovCisKKyNpZmRlZiBDT0hFUkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAvKiA8c3lzL2ZpbGUuaD4gKi8KKyNkZWZpbmUgTk9GSUxFSAorI2VuZGlmIC8qIENPSEVSRU5UICovCisKKyNpZmRlZiBNSU5JWAorI2RlZmluZSBOT0ZJTEVICisjZW5kaWYgLyogTUlOSVggKi8KKworI2lmZGVmIGFlZ2lzCisjZGVmaW5lIE5PRklMRUgKKyNlbmRpZiAvKiBhZWdpcyAqLworCisjaWZkZWYgdW5vcworI2RlZmluZSBOT0ZJTEVICisjZW5kaWYgLyogdW5vcyAqLworCisjaWZuZGVmIE5PRklMRUgKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2VuZGlmIC8qIE5PRklMRUggKi8KKworI2lmbmRlZiBpczY4ayAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdoZXRoZXIgdG8gaW5jbHVkZSA8ZmNudGwuaD4gKi8KKyNpZm5kZWYgQlNENDEgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGwgYnV0IGEgY291cGxlIFVOSVhlcyBoYXZlIGl0LiAqLworI2lmbmRlZiBGVDE4CisjaWZuZGVmIENPSEVSRU5UCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworI2VuZGlmIC8qIEZUMTggICovCisjZW5kaWYgLyogQlNENDEgKi8KKyNlbmRpZiAvKiBpczY4ayAqLworCisjaWZkZWYgQ09IRVJFTlQKKyNpZmRlZiBfSTM4NgorI2luY2x1ZGUgPGZjbnRsLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2VuZGlmIC8qIF9JMzg2ICovCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKworZXh0ZXJuIGludCBpbnNlcnZlcjsJCQkvKiBJIGFtIElLU0QgKi8KK2ludCBndWVzdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbm9ueW1vdXMgdXNlciAqLworCisjaWZkZWYgSUtTRAorZXh0ZXJuIGludCBpc2d1ZXN0OworZXh0ZXJuIGNoYXIgKiBhbm9ucm9vdDsKKyNlbmRpZiAvKiBJS1NEICovCisKKyNpZmRlZiBDS19MT0dJTgorI2RlZmluZSBHVUVTVFBBU1MgMjU2CitzdGF0aWMgY2hhciBndWVzdHBhc3NbR1VFU1RQQVNTXSA9IHsgTlVMLCBOVUwgfTsgLyogQW5vbnltb3VzICJwYXNzd29yZCIgKi8KK3N0YXRpYyBpbnQgbG9nZ2VkX2luID0gMDsgICAgICAgICAgICAgICAvKiBTZXQgd2hlbiB1c2VyIGlzIGxvZ2dlZCBpbiAqLworc3RhdGljIGludCBhc2twYXNzd2QgPSAwOyAgICAgICAgICAgICAgIC8qIEhhdmUgT0sgdXNlciwgbXVzdCBhc2sgZm9yIHBhc3N3ZCAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisKKyNpZmRlZiBDS1JPT1QKK3N0YXRpYyBjaGFyIGNrcm9vdFtDS01BWFBBVEgrMV0gPSB7IE5VTCwgTlVMIH07CitzdGF0aWMgaW50IGNrcm9vdHNldCA9IDA7CitpbnQgY2tyb290ZXJyID0gMDsKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworX1BST1RPVFlQKCBWT0lEIGlnbm9yc2lncywgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgcmVzdG9yc2lncywgKHZvaWQpICk7CisKKy8qCisgIENoYW5nZSBhcmd1bWVudCB0byAiKGNvbnN0IGNoYXIgKikiIGlmIHRoaXMgY2F1c2VzIHRyb3VibGUuCisgIE9yLi4uIGlmIGl0IGNhdXNlcyB0cm91YmxlLCB0aGVuIG1heWJlIGl0IHdhcyBhbHJlYWR5IGRlY2xhcmVkCisgIGluIGEgaGVhZGVyIGZpbGUgYWZ0ZXIgYWxsLCBzbyB5b3UgY2FuIHJlbW92ZSB0aGlzIHByb3RvdHlwZS4KKyovCisjaWZuZGVmIE5ER1BXTkFNIC8qIElmIG5vdCBkZWZpbmVkIE5vIERlY2xhcmUgZ2V0cHduYW0uLi4gKi8KKyNpZm5kZWYgX1BPU0lYX1NPVVJDRQorI2lmbmRlZiBORVhUCisjaWZuZGVmIFNWUjQKKy8qIFBPU0lYIDxwd2QuaD4gYWxyZWFkeSBnYXZlIHByb3RvdHlwZXMgZm9yIHRoZXNlLiAqLworI2lmZGVmIElSSVg0MAorX1BST1RPVFlQKCBzdHJ1Y3QgcGFzc3dkICogZ2V0cHduYW0sIChjb25zdCBjaGFyICopICk7CisjZWxzZQorI2lmZGVmIElSSVg1MQorX1BST1RPVFlQKCBzdHJ1Y3QgcGFzc3dkICogZ2V0cHduYW0sIChjb25zdCBjaGFyICopICk7CisjZWxzZQorI2lmZGVmIE1fVU5JWAorX1BST1RPVFlQKCBzdHJ1Y3QgcGFzc3dkICogZ2V0cHduYW0sIChjb25zdCBjaGFyICopICk7CisjZWxzZQorI2lmZGVmIEhQVVg5CitfUFJPVE9UWVAoIHN0cnVjdCBwYXNzd2QgKiBnZXRwd25hbSwgKGNvbnN0IGNoYXIgKikgKTsKKyNlbHNlCisjaWZkZWYgSFBVWDEwCitfUFJPVE9UWVAoIHN0cnVjdCBwYXNzd2QgKiBnZXRwd25hbSwgKGNvbnN0IGNoYXIgKikgKTsKKyNlbHNlCisjaWZkZWYgRENHUFdOQU0KK19QUk9UT1RZUCggc3RydWN0IHBhc3N3ZCAqIGdldHB3bmFtLCAoY29uc3QgY2hhciAqKSApOworI2Vsc2UKK19QUk9UT1RZUCggc3RydWN0IHBhc3N3ZCAqIGdldHB3bmFtLCAoY2hhciAqKSApOworI2VuZGlmIC8qIERDR1BXTkFNICovCisjZW5kaWYgLyogSFBVWDEwICovCisjZW5kaWYgLyogSFBVWDkgKi8KKyNlbmRpZiAvKiBNX1VOSVggKi8KKyNlbmRpZiAvKiBJUklYNTEgKi8KKyNlbmRpZiAvKiBJUklYNDAgKi8KKyNpZm5kZWYgU1VOT1M0CisjaWZuZGVmIEhQVVg5CisjaWZuZGVmIEhQVVgxMAorI2lmbmRlZiBfU0NPX0RTCitfUFJPVE9UWVAoIHN0cnVjdCBwYXNzd2QgKiBnZXRwd3VpZCwgKFBXSURfVCkgKTsKKyNlbmRpZiAvKiBfU0NPX0RTICovCisjZW5kaWYgLyogSFBVWDEwICovCisjZW5kaWYgLyogSFBVWDkgKi8KKyNlbmRpZiAvKiBTVU5PUzQgKi8KK19QUk9UT1RZUCggc3RydWN0IHBhc3N3ZCAqIGdldHB3ZW50LCAodm9pZCkgKTsKKyNlbmRpZiAvKiBTVlI0ICovCisjZW5kaWYgLyogTkVYVCAqLworI2VuZGlmIC8qIF9QT1NJWF9TT1VSQ0UgKi8KKyNlbmRpZiAvKiBOREdQV05BTSAqLworCisjaWZkZWYgQ0tfU0hBRE9XICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hhZG93IFBhc3N3b3Jkcy4uLiAqLworI2luY2x1ZGUgPHNoYWRvdy5oPgorI2VuZGlmIC8qIENLX1NIQURPVyAqLworI2lmZGVmIENLX1BBTSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBBTS4uLiAqLworI2luY2x1ZGUgPHNlY3VyaXR5L3BhbV9hcHBsLmg+CisjaWZuZGVmIFBBTV9TRVJWSUNFX1RZUEUgICAgICAgICAgICAgICAgLyogRGVmaW5lcyB3aGljaCBQQU0gc2VydmljZSB3ZSBhcmUgKi8KKyNkZWZpbmUgUEFNX1NFUlZJQ0VfVFlQRSAia2VybWl0IgorI2VuZGlmIC8qIFBBTV9TRVJWSUNFX1RZUEUgKi8KKworI2lmZGVmIFNPTEFSSVMKKyNkZWZpbmUgUEFNX0NPTlNUIAorI2Vsc2UgLyogU09MQVJJUyAqLworI2RlZmluZSBQQU1fQ09OU1QgQ09OU1QKKyNlbmRpZiAKKworc3RhdGljIGNoYXIgKiBwYW1fcHcgPSBOVUxMOworCitpbnQKKyNpZmRlZiBDS19BTlNJQworcGFtX2NiKGludCBudW1fbXNnLAorICAgICAgIFBBTV9DT05TVCBzdHJ1Y3QgcGFtX21lc3NhZ2UgKiptc2csCisgICAgICAgc3RydWN0IHBhbV9yZXNwb25zZSAqKnJlc3AsCisgICAgICAgdm9pZCAqYXBwZGF0YV9wdHIKKyAgICAgICApCisjZWxzZSAvKiBDS19BTlNJQyAqLworcGFtX2NiKG51bV9tc2csIG1zZywgcmVzcCwgYXBwZGF0YV9wdHIpCisgICAgaW50IG51bV9tc2c7CisgICAgUEFNX0NPTlNUIHN0cnVjdCBwYW1fbWVzc2FnZSAqKm1zZzsKKyAgICBzdHJ1Y3QgcGFtX3Jlc3BvbnNlICoqcmVzcDsKKyAgICB2b2lkICphcHBkYXRhX3B0cjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIGludCBpOworCisgICAgZGVidWcoRjExMSwicGFtX2NiIiwibnVtX21zZyIsbnVtX21zZyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX21zZzsgaSsrKSB7CisgICAgICAgIGNoYXIgbWVzc2FnZVtQQU1fTUFYX01TR19TSVpFXTsKKworICAgICAgICAvKiBJc3N1ZSBwcm9tcHQgYW5kIGdldCByZXNwb25zZSAqLworICAgICAgICBkZWJ1ZyhGMTExLCJwYW1fY2IiLCJNZXNzYWdlIixpKTsKKyAgICAgICAgZGVidWcoRjExMSwicGFtX2NiIixtc2dbaV0tPm1zZyxtc2dbaV0tPm1zZ19zdHlsZSk7CisgICAgICAgIGlmIChtc2dbaV0tPm1zZ19zdHlsZSA9PSBQQU1fRVJST1JfTVNHKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJwYW1fY2IiLCJQQU0gRVJST1IiLDApOworICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsIiVzXG4iLCBtc2dbaV0tPm1zZyk7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0gZWxzZSBpZiAobXNnW2ldLT5tc2dfc3R5bGUgPT0gUEFNX1RFWFRfSU5GTykgeworICAgICAgICAgICAgZGVidWcoRjExMSwicGFtX2NiIiwiUEFNIFRFWFQgSU5GTyIsMCk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwiJXNcbiIsIG1zZ1tpXS0+bXNnKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2dbaV0tPm1zZ19zdHlsZSA9PSBQQU1fUFJPTVBUX0VDSE9fT0ZGKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJwYW1fY2IiLCJSZWFkaW5nIHJlc3BvbnNlLCBubyBlY2hvIiwwKTsKKyAgICAgICAgICAgIC8qIFVnbHkgaGFjay4gIFdlIGNoZWNrIHRvIHNlZSBpZiBhIHBhc3N3b3JkIGhhcyBiZWVuIHB1c2hlZCAqLworICAgICAgICAgICAgLyogaW50byB6dnBhc3N3ZCgpLiAgVGhpcyB3b3VsZCBiZSB0cnVlIGlmIHRoZSBwYXNzd29yZCB3YXMgICovCisgICAgICAgICAgICAvKiByZWNlaXZlZCBieSBSRU1PVEUgTE9HSU4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwYW1fcHcpIHsKKyAgICAgICAgICAgICAgICBja3N0cm5jcHkobWVzc2FnZSxwYW1fcHcsUEFNX01BWF9NU0dfU0laRSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZWFkcGFzcygoY2hhciAqKW1zZ1tpXS0+bXNnLG1lc3NhZ2UsUEFNX01BWF9NU0dfU0laRSk7CisgICAgICAgIH0gZWxzZSBpZiAobXNnW2ldLT5tc2dfc3R5bGUgPT0gUEFNX1BST01QVF9FQ0hPX09OKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJwYW1fY2IiLCJSZWFkaW5nIHJlc3BvbnNlLCB3aXRoIGVjaG8iLDApOworICAgICAgICAgICAgcmVhZHRleHQoKGNoYXIgKiltc2dbaV0tPm1zZyxtZXNzYWdlLFBBTV9NQVhfTVNHX1NJWkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWcoRjExMSwicGFtX2NiIiwidW5rbm93biBzdHlsZSIsMCk7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBtZXNzYWdlJ3MgcmVzcG9uc2Ugc3RydWN0dXJlICovCisgICAgICAgIHJlc3BbaV0gPSAoc3RydWN0IHBhbV9yZXNwb25zZSAqKSBtYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgcGFtX3Jlc3BvbnNlKSk7CisgICAgICAgIGlmICghcmVzcFtpXSkgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJwYW1fY2IiLCJtYWxsb2MgZmFpbHVyZSIsMCk7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgICAgZnJlZShyZXNwW2pdLT5yZXNwKTsKKyAgICAgICAgICAgICAgICBmcmVlKHJlc3Bbal0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisKKyAgICAgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSByZXNwb25zZSAqLworICAgICAgICByZXNwW2ldLT5yZXNwID0gKGNoYXIgKikgbWFsbG9jKChpbnQpc3RybGVuKG1lc3NhZ2UpICsgMSk7CisgICAgICAgIGlmICghcmVzcFtpXS0+cmVzcCkgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJwYW1fY2IiLCJtYWxsb2MgZmFpbHVyZSIsMCk7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgICAgZnJlZShyZXNwW2pdLT5yZXNwKTsKKyAgICAgICAgICAgICAgICBmcmVlKHJlc3Bbal0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShyZXNwW2ldKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgICAgICAvKiBSZXR1cm4gdGhlIHJlc3VsdHMgYmFjayB0byBQQU0gKi8KKyAgICAgICAgc3RyY3B5KHJlc3BbaV0tPnJlc3AsIG1lc3NhZ2UpOwkvKiBzYWZlIChwcmVjaGVja2VkKSAqLworICAgICAgICByZXNwW2ldLT5yZXNwX3JldGNvZGUgPSAwOworICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJwYW1fY2IiLCJFeGl0aW5nIiwwKTsKKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogQ0tfUEFNICovCisKKy8qIERlZmluZSBtYWNyb3MgZm9yIGdldHRpbmcgZmlsZSB0eXBlICovCisKKyNpZmRlZiBPWE9TCisvKgorICBPbGl2ZXR0aSBYL09TIDIuMyBoYXMgU19JU1JFRyBhbmQgU19JU0RJUiBkZWZpbmVkCisgIGluY29ycmVjdGx5LCBzbyB3ZSBmb3JjZSB0aGVpciByZWRlZmluaXRpb24uCisqLworI3VuZGVmIFNfSVNSRUcKKyN1bmRlZiBTX0lTRElSCisjZW5kaWYgLyogT1hPUyAqLworCisjaWZkZWYgVVRTViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtZSBkZWFsIGZvciBBbWRhaGwgVVRTViAqLworI3VuZGVmIFNfSVNSRUcKKyN1bmRlZiBTX0lTRElSCisjZW5kaWYgLyogVVRTViAqLworCisjaWZkZWYgVU5JU1lTNTIgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW5kIGZvciBVTklTWVMgVVRTIFYgNS4yICovCisjdW5kZWYgU19JU1JFRworI3VuZGVmIFNfSVNESVIKKyNlbmRpZiAvKiBVTklTWVM1MiAqLworCisjaWZkZWYgSUNMU1ZSMyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW5kIGZvciBvbGQgSUNMIHZlcnNpb25zICovCisjdW5kZWYgU19JU1JFRworI3VuZGVmIFNfSVNESVIKKyNlbmRpZiAvKiBJQ0xTVlIzICovCisKKyNpZmRlZiBJU0RJUkJVRyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbHNvIGFsbG93IHRoaXMgZnJvbSBjb21tYW5kIGxpbmUgKi8KKyNpZmRlZiBTX0lTUkVHCisjdW5kZWYgU19JU1JFRworI2VuZGlmIC8qIFNfSVNSRUcgKi8KKyNpZmRlZiBTX0lTRElSCisjdW5kZWYgU19JU0RJUgorI2VuZGlmIC8qICBTX0lTRElSICovCisjZW5kaWYgLyogSVNESVJCVUcgKi8KKworI2lmbmRlZiBfSUZNVAorI2lmZGVmIFNfSUZNVAorI2RlZmluZSBfSUZNVCBTX0lGTVQKKyNlbHNlCisjZGVmaW5lIF9JRk1UIDAxNzAwMDAKKyNlbmRpZiAvKiBTX0lGTVQgKi8KKyNlbmRpZiAvKiBfSUZNVCAqLworCisjaWZuZGVmIFNfSVNSRUcKKyNkZWZpbmUgU19JU1JFRyhtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRlJFRykKKyNlbmRpZiAvKiBTX0lTUkVHICovCisjaWZuZGVmIFNfSVNESVIKKyNkZWZpbmUgU19JU0RJUihtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkRJUikKKyNlbmRpZiAvKiBTX0lTRElSICovCisKKy8qIFRoZSBmb2xsb3dpbmcgbWFpbmx5IGZvciBOZVhUU1RFUC4uLiAqLworCisjaWZuZGVmIFNfSVdVU1IKKyNkZWZpbmUgU19JV1VTUiAwMDAwMjAwCisjZW5kaWYgLyogU19JV1VTUiAqLworCisjaWZuZGVmIFNfSVJHUlAKKyNkZWZpbmUgU19JUkdSUCAwMDAwMDQwCisjZW5kaWYgLyogU19JUkdSUCAqLworCisjaWZuZGVmIFNfSVdHUlAKKyNkZWZpbmUgU19JV0dSUCAwMDAwMDIwCisjZW5kaWYgLyogU19JV0dSUCAqLworCisjaWZuZGVmIFNfSVhHUlAKKyNkZWZpbmUgU19JWEdSUCAwMDAwMDEwCisjZW5kaWYgLyogU19JWEdSUCAqLworCisjaWZuZGVmIFNfSVJPVEgKKyNkZWZpbmUgU19JUk9USCAwMDAwMDA0CisjZW5kaWYgLyogU19JUk9USCAqLworCisjaWZuZGVmIFNfSVdPVEgKKyNkZWZpbmUgU19JV09USCAwMDAwMDAyCisjZW5kaWYgLyogU19JV09USCAqLworCisjaWZuZGVmIFNfSVhPVEgKKyNkZWZpbmUgU19JWE9USCAwMDAwMDAxCisjZW5kaWYgLyogU19JWE9USCAqLworLyoKKyAgRGVmaW5lIG1heGltdW0gbGVuZ3RoIGZvciBhIGZpbGUgbmFtZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgorICBOT1RFOiBUaGlzIGFwcGxpZXMgdG8gYSBwYXRoIHNlZ21lbnQgKGRpcmVjdG9yeSBvciBmaWxlIG5hbWUpLAorICBub3QgdGhlIGVudGlyZSBwYXRoIHN0cmluZywgd2hpY2ggY2FuIGJlIENLTUFYUEFUSCBieXRlcyBsb25nLgorKi8KKyNpZmRlZiBRTlgKKyNpZmRlZiBfTUFYX0ZOQU1FCisjZGVmaW5lIE1BWE5BTUxFTiBfTUFYX0ZOQU1FCisjZWxzZQorI2RlZmluZSBNQVhOQU1MRU4gNDgKKyNlbmRpZiAvKiBfTUFYX0ZOQU1FICovCisjZWxzZQorI2lmbmRlZiBNQVhOQU1MRU4KKyNpZmRlZiBzdW4KKyNkZWZpbmUgTUFYTkFNTEVOIDI1NQorI2Vsc2UKKyNpZmRlZiBGSUxFTkFNRV9NQVgKKyNkZWZpbmUgTUFYTkFNTEVOIEZJTEVOQU1FX01BWAorI2Vsc2UKKyNpZmRlZiBOQU1FX01BWAorI2RlZmluZSBNQVhOQU1MRU4gTkFNRV9NQVgKKyNlbHNlCisjaWZkZWYgX1BPU0lYX05BTUVfTUFYCisjZGVmaW5lIE1BWE5BTUxFTiBfUE9TSVhfTkFNRV9NQVgKKyNlbHNlCisjaWZkZWYgX0RfTkFNRV9NQVgKKyNkZWZpbmUgTUFYTkFNTEVOIF9EX05BTUVfTUFYCisjZWxzZQorI2lmZGVmIERJUlNJWgorI2RlZmluZSBNQVhOQU1MRU4gRElSU0laCisjZWxzZQorI2RlZmluZSBNQVhOQU1MRU4gMTQKKyNlbmRpZiAvKiBESVJTSVogKi8KKyNlbmRpZiAvKiBfRF9OQU1FX01BWCAqLworI2VuZGlmIC8qIF9QT1NJWF9OQU1FX01BWCAqLworI2VuZGlmIC8qIE5BTUVfTUFYICovCisjZW5kaWYgLyogRklMRU5BTUVfTUFYICovCisjZW5kaWYgLyogc3VuICovCisjZW5kaWYgLyogTUFYTkFNTEVOICovCisjZW5kaWYgLyogUU5YICovCisKKyNpZmRlZiBDT01NRU5UCisvKiBBcyBvZiAyMDAxLTExLTAzIHRoaXMgaXMgaGFuZGxlZCBpbiBja2NkZWIuaCAqLworLyogTG9uZ2VzdCBwYXRobmFtZSAuLi4gKi8KKy8qCisgIEJld2FyZTogTUFYUEFUSExFTiBpcyBvbmUgb2YgVU5JWCdzIGRpcnR5IGxpdHRsZSBzZWNyZXRzLiAgV2hlcmUgaXMgaXQKKyAgZGVmaW5lZD8gIFdobyBrbm93cy4uLiAgPHBhcmFtLmg+LCA8bW9kLmg+LCA8dW5pc3RkLmg+LCA8bGltaXRzLmg+LCAuLi4KKyAgVGhlcmUgaXMgbm90IG5lY2Vzc2FyaWx5IGV2ZW4gYSBkZWZpbml0aW9uIGZvciBpdCBhbnl3aGVyZSwgb3IgaXQgbWlnaHQgaGF2ZQorICBhbm90aGVyIG5hbWUuICBJZiB5b3UgZ2V0IGl0IHdyb25nLCBiYWQgdGhpbmdzIGhhcHBlbiB3aXRoIGdldGN3ZCgpIGFuZC9vcgorICBnZXR3ZCgpLiAgSWYgeW91IGFsbG9jYXRlIGEgYnVmZmVyIHRoYXQgaXMgdG9vIHNob3J0LCBnZXR3ZCgpIG1pZ2h0IHdyaXRlCisgIG92ZXIgbWVtb3J5IGFuZCBnZXRjd2QoKSB3aWxsIGZhaWwgd2l0aCBFUkFOR0UuICBUaGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UKKyAgZnVuY3Rpb25zIChlLmcuIGluIFNWSUQgb3IgUE9TSVguMSkgZG8gbm90IHRlbGwgeW91IGhvdyB0byBkZXRlcm1pbmUgdGhlCisgIG1heGltdW0gcGF0aCBsZW5ndGggaW4gb3JkZXIgdG8gYWxsb2NhdGUgYSBidWZmZXIgdGhhdCBpcyB0aGUgcmlnaHQgc2l6ZS4KKyovCisjaWZkZWYgQlNENDQKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4gICAgICAgICAgICAgICAgICAvKiBGb3IgTUFYUEFUSExFTiAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisjaWZkZWYgQ09IRVJFTlQKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4gIC8qIGZvciBNQVhQQVRITEVOLCBuZWVkZWQgZm9yIC1ERElSRU5UICovCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBNQVhQQVRITEVOCisjaWZkZWYgTUFYUEFUSAorI3VuZGVmIE1BWFBBVEgKKyNlbmRpZiAvKiBNQVhQQVRIICovCisjZGVmaW5lIE1BWFBBVEggTUFYUEFUSExFTgorI2Vsc2UKKyNpZmRlZiBQQVRIX01BWAorI2RlZmluZSBNQVhQQVRIIFBBVEhfTUFYCisjZWxzZQorI2lmZGVmIF9QT1NJWF9QQVRIX01BWAorI2RlZmluZSBNQVhQQVRIIF9QT1NJWF9QQVRIX01BWAorI2Vsc2UKKyNpZmRlZiBCU0Q0MgorI2RlZmluZSBNQVhQQVRIIDEwMjQKKyNlbHNlCisjaWZkZWYgU1ZSNAorI2RlZmluZSBNQVhQQVRIIDEwMjQKKyNlbHNlCisjZGVmaW5lIE1BWFBBVEggMjU1CisjZW5kaWYgLyogU1ZSNCAqLworI2VuZGlmIC8qIEJTRDQyICovCisjZW5kaWYgLyogX1BPU0lYX1BBVEhfTUFYICovCisjZW5kaWYgLyogUEFUSF9NQVggKi8KKyNlbmRpZiAvKiBNQVhQQVRITEVOICovCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGZpbGVuYW1lcyBmb3Igd2lsZGNhcmQgZXhwYW5zaW9uICovCisKKyNpZm5kZWYgTUFYV0xECisvKiBBbHJlYWR5IGRlZmluZWQgaW4gY2tjZGViLmggc28gdGhlIGZvbGxvd2luZyBpcyBzdXBlcmZsdW91cy4gKi8KKy8qIERvbid0IGV4cGVjdCBjaGFuZ2luZyB0aGVtIHRvIGhhdmUgYW55IGVmZmVjdC4gKi8KKyNpZmRlZiBDS19TTUFMTAorI2RlZmluZSBNQVhXTEQgNTAKKyNlbHNlCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgTUFYV0xEIDEwMjQwMAorI2Vsc2UKKyNkZWZpbmUgTUFYV0xEIDgxOTIKKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworI2VuZGlmIC8qIENLX1NNQUxMICovCisjZW5kaWYgLyogTUFYV0xEICovCisKK3N0YXRpYyBpbnQgbWF4bmFtZXMgPSBNQVhXTEQ7CisKKy8qIERlZmluZSB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHNwYWNlIGZvciBmaWxlbmFtZSBleHBhbnNpb24uICovCisKKyNpZm5kZWYgRFlOQU1JQworI2lmZGVmIFBST1ZYMQorI2RlZmluZSBTU1BBQ0UgNTAwCisjZWxzZQorI2lmZGVmIEJTRDI5CisjZGVmaW5lIFNTUEFDRSA1MDAKKyNlbHNlCisjaWZkZWYgcGRwMTEKKyNkZWZpbmUgU1NQQUNFIDUwMAorI2Vsc2UKKyNpZmRlZiBhZWdpcworI2RlZmluZSBTU1BBQ0UgMTAwMDAgICAgICAgICAgICAgICAgICAgIC8qIFNpemUgb2Ygc3RyaW5nLWdlbmVyYXRpbmcgYnVmZmVyICovCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBzdGF0aWMgYnVmZmVyIHNpemUgKi8KKyNpZmRlZiBCSUdCVUZPSworI2RlZmluZSBTU1BBQ0UgNjUwMDAgICAgICAgICAgICAgICAgICAgIC8qIFNpemUgb2Ygc3RyaW5nLWdlbmVyYXRpbmcgYnVmZmVyICovCisjZWxzZQorI2RlZmluZSBTU1BBQ0UgMjAwMCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nLWdlbmVyYXRpbmcgYnVmZmVyICovCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKyNlbmRpZiAvKiBhZWdpcyAqLworI2VuZGlmIC8qIHBkcDExICovCisjZW5kaWYgLyogQlNEMjkgKi8KKyNlbmRpZiAvKiBQUk9WWDEgKi8KK3N0YXRpYyBjaGFyIHNzcGFjZVtTU1BBQ0VdOyAgICAgICAgICAgICAvKiBCdWZmZXIgZm9yIGdlbmVyYXRpbmcgZmlsZW5hbWVzICovCisjZWxzZSAvKiBpcyBEWU5BTUlDICovCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgU1NQQUNFIDUwMDAwMAorI2Vsc2UKKyNkZWZpbmUgU1NQQUNFIDEwMDAwCisjZW5kaWYgLyogQklHQlVGT0sgKi8KK2NoYXIgKnNzcGFjZSA9IChjaGFyICopMDsKKyNlbmRpZiAvKiBEWU5BTUlDICovCitzdGF0aWMgaW50IHNzcGxlbiA9IFNTUEFDRTsJCS8qIExlbmd0aCBvZiBzdHJpbmcgc3BhY2UgYnVmZmVyICovCisKKyNpZmRlZiBEQ0xGRE9QRU4KKy8qIGZkb3BlbigpIG5lZWRzIGRlY2xhcmluZyBiZWNhdXNlIGl0J3Mgbm90IGRlY2xhcmVkIGluIDxzdGRpby5oPiAqLworX1BST1RPVFlQKCBGSUxFICogZmRvcGVuLCAoaW50LCBjaGFyICopICk7CisjZW5kaWYgLyogRENMRkRPUEVOICovCisKKyNpZmRlZiBEQ0xQT1BFTgorLyogcG9wZW4oKSBuZWVkcyBkZWNsYXJpbmcgYmVjYXVzZSBpdCdzIG5vdCBkZWNsYXJlZCBpbiA8c3RkaW8uaD4gKi8KK19QUk9UT1RZUCggRklMRSAqIHBvcGVuLCAoY2hhciAqLCBjaGFyICopICk7CisjZW5kaWYgLyogRENMUE9QRU4gKi8KKworZXh0ZXJuIGludCBub3B1c2g7CisKKy8qIE1vcmUgaW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworLyoKKyAqIFRoZSBwYXRoIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgbmFtZSB0byBtYXRjaC4KKyAqIEVhY2ggc2xhc2gtc2VwYXJhdGVkIHNlZ21lbnQgb2YgdGhlIG5hbWUgaXMga2VwdCBpbiBvbmUKKyAqIHN1Y2ggc3RydWN0dXJlLCBhbmQgdGhleSBhcmUgbGlua2VkIHRvZ2V0aGVyLCB0byBtYWtlCisgKiB0cmF2ZXJzaW5nIHRoZSBuYW1lIGVhc2llci4KKyAqLworc3RydWN0IHBhdGggeworICAgIGNoYXIgbnBhcnRbTUFYTkFNTEVOKzRdOyAgICAgICAgICAgIC8qIG5hbWUgcGFydCBvZiBwYXRoIHNlZ21lbnQgKi8KKyAgICBzdHJ1Y3QgcGF0aCAqZndkOyAgICAgICAgICAgICAgICAgICAvKiBmb3J3YXJkIHB0ciAqLworfTsKKyNpZm5kZWYgTk9QVVNICitfUFJPVE9UWVAoIGludCBzaHhwYW5kLCAoY2hhciAqLCBjaGFyICpbXSwgaW50ICkgKTsKKyNlbmRpZiAvKiBOT1BVU0ggKi8KK19QUk9UT1RZUCggc3RhdGljIGludCBmZ2VuLCAoY2hhciAqLCBjaGFyICpbXSwgaW50ICkgKTsKK19QUk9UT1RZUCggc3RhdGljIFZPSUQgdHJhdmVyc2UsIChzdHJ1Y3QgcGF0aCAqLCBjaGFyICosIGNoYXIgKikgKTsKK19QUk9UT1RZUCggc3RhdGljIFZPSUQgYWRkcmVzdWx0LCAoY2hhciAqLCBpbnQpICk7CisjaWZkZWYgQ09NTUVOVAorLyogUmVwbGFjZWQgYnkgY2ttYXRjaCgpICovCitfUFJPVE9UWVAoIHN0YXRpYyBpbnQgbWF0Y2gsIChjaGFyICosIGNoYXIgKikgKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCitfUFJPVE9UWVAoIGNoYXIgKiB3aG9hbWksICh2b2lkKSApOworX1BST1RPVFlQKCBVSURfVCByZWFsX3VpZCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBzdHJ1Y3QgcGF0aCAqc3BsaXRwYXRoLCAoY2hhciAqcCkgKTsKK19QUk9UT1RZUCggY2hhciAqIHpkdHN0ciwgKHRpbWVfdCkgKTsKK19QUk9UT1RZUCggdGltZV90IHpzdHJkdCwgKGNoYXIgKiwgaW50KSApOworCisvKiBTb21lIHN5c3RlbXMgZGVmaW5lIHRoZXNlIHN5bWJvbHMgaW4gaW5jbHVkZSBmaWxlcywgb3RoZXJzIGRvbid0Li4uICovCisKKyNpZm5kZWYgUl9PSworI2RlZmluZSBSX09LIDQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBhY2Nlc3MgKi8KKyNlbmRpZiAvKiBSX09LICovCisKKyNpZm5kZWYgV19PSworI2RlZmluZSBXX09LIDIKKyNlbmRpZiAvKiBXX09LICovCisKKyNpZm5kZWYgWF9PSworI2RlZmluZSBYX09LIDEKKyNlbmRpZiAvKiBYX09LICovCisKKyNpZm5kZWYgT19SRE9OTFkKKyNkZWZpbmUgT19SRE9OTFkgMDAwCisjZW5kaWYgLyogT19SRE9OTFkgKi8KKworLyogc3lzbG9nIGFuZCB3dG1wIGl0ZW1zIGZvciBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSAqLworCitleHRlcm4gY2hhciAqIGNsaWVudGhvc3Q7ICAgICAgICAgICAgICAgLyogRnJvbSBja2NtYWkuYy4gKi8KKworc3RhdGljIGNoYXIgZnVsbG5hbWVbQ0tNQVhQQVRIKzFdOworc3RhdGljIGNoYXIgdG1wMltDS01BWFBBVEgrMV07CisKK2V4dGVybiBpbnQgY2t4bG9nZ2luZzsKKworI2lmZGVmIENLWFBSSU5URiAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91ciBwcmludGYgbWFjcm8gY29uZmxpY3RzIHdpdGggKi8KKyN1bmRlZiBwcmludGYgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2Ugb2YgInByaW50ZiIgaW4gc3lzbG9nLmggKi8KKyNlbmRpZiAvKiBDS1hQUklOVEYgKi8KKyNpZmRlZiBDS1NZU0xPRworI2lmZGVmIFJUQUlYCisjaW5jbHVkZSA8c3lzL3N5c2xvZy5oPgorI2Vsc2UgIC8qIFJUQUlYICovCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjZW5kaWYgLyogUlRBSVggKi8KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworI2lmZGVmIENLWFBSSU5URgorI2RlZmluZSBwcmludGYgY2t4cHJpbnRmCisjZW5kaWYgLyogQ0tYUFJJTlRGICovCisKK2ludCBja3hhbm9uID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbm9ueW1vdXMgbG9naW4gb2sgKi8KK2ludCBja3hwZXJtcyA9IDAwNDA7ICAgICAgICAgICAgICAgICAgICAvKiBBbm9ueW1vdXMgZmlsZSBwZXJtaXNzaW9ucyAqLworaW50IGNreHByaXYgPSAxOwkJCS8qIFByaXYnZCBsb2dpbiBvayAqLworCisjaWZuZGVmIFhGRVJGSUxFCisjZGVmaW5lIFhGRVJGSUxFICIvdmFyL2xvZy9pa3NkLmxvZyIKKyNlbmRpZiAvKiBYRkVSRklMRSAqLworCisvKiB3dG1wIGxvZ2dpbmcgZm9yIElLU0QuLi4gKi8KKworI2lmbmRlZiBDS1dUTVAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHd0bXAgbG9nZ2luZyBub3Qgc2VsZWN0ZWQgKi8KK2ludCBja3h3dG1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBLbm93IHRoaXMgYXQgcnVudGltZSAqLworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHd0bXAgZmlsZSBkZXRhaWxzICovCitpbnQgY2t4d3RtcCA9IDE7CisjaWZkZWYgVVRNUEJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5mb3J0dW5hdGVseS4uLiAqLworLyoKKyAgU29tZSB2ZXJzaW9ucyBvZiBMaW51eCBoYXZlIGEgPHV0bXAuaD4gZmlsZSB0aGF0IGNvbnRhaW5zCisgICJlbnVtIHV0bG9naW4geyBsb2NhbCwgdGVsbmV0LCBybG9naW4sIHNjcmVlbiwgLi4uIH07IiAgVGhpcyBjbG9iYmVycworICBhbnkgcHJvZ3JhbSB0aGF0IHVzZXMgYW55IG9mIHRoZXNlIHdvcmRzIGFzIHZhcmlhYmxlIG5hbWVzLCBmdW5jdGlvbgorICBuYW1lcywgbWFjcm8gbmFtZXMsIGV0Yy4gIChPdGhlciB2ZXJzaW9ucyBvZiBMaW51eCBoYXZlIHRoaXMgZGVjbGFyYXRpb24KKyAgd2l0aGluICNpZiAwIC4uLiAjZW5kaWYuKSAgVGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhpcyBvdGhlcgorICB0aGFuIHRvIG5vdCBpbmNsdWRlIHRoZSBzdHVwaWQgZmlsZS4gIEJ1dCB3ZSBuZWVkIHN0dWZmIGZyb20gaXQsIHNvLi4uCisqLworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZGVmaW5lIFVUX0xJTkVTSVpFICAgICAzMgorI2RlZmluZSBVVF9OQU1FU0laRSAgICAgMzIKKyNkZWZpbmUgVVRfSE9TVFNJWkUgICAgIDI1NgorCitzdHJ1Y3QgdGltZXZhbCB7CisgIHRpbWVfdCB0dl9zZWM7CisgIHRpbWVfdCB0dl91c2VjOworfTsKKworc3RydWN0IGV4aXRfc3RhdHVzIHsKKyAgc2hvcnQgaW50IGVfdGVybWluYXRpb247ICAgICAgLyogUHJvY2VzcyB0ZXJtaW5hdGlvbiBzdGF0dXMuICAqLworICBzaG9ydCBpbnQgZV9leGl0OyAgICAgICAgICAgICAvKiBQcm9jZXNzIGV4aXQgc3RhdHVzLiAgKi8KK307CisKK3N0cnVjdCB1dG1wIHsKKyAgc2hvcnQgaW50IHV0X3R5cGU7ICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIG9mIGxvZ2luICovCisgIHBpZF90IHV0X3BpZDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGlkIG9mIGxvZ2luIHByb2Nlc3MgKi8KKyAgY2hhciB1dF9saW5lW1VUX0xJTkVTSVpFXTsgICAgICAgICAgICAvKiBOVUwtdGVybWluYXRlZCBkZXZpY2VuYW1lIG9mIHR0eSAqLworICBjaGFyIHV0X2lkWzRdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXR0YWIgaWQgKi8KKyAgY2hhciB1dF91c2VyW1VUX05BTUVTSVpFXTsgICAgICAgICAgICAvKiBVc2VybmFtZSAobm90IE5VTCB0ZXJtaW5hdGVkKSAqLworCisgIGNoYXIgdXRfaG9zdFtVVF9IT1NUU0laRV07ICAgICAgICAgICAgLyogSG9zdG5hbWUgZm9yIHJlbW90ZSBsb2dpbiAqLworICBzdHJ1Y3QgZXhpdF9zdGF0dXMgdXRfZXhpdDsgICAgICAgICAgIC8qIEV4aXQgc3RhdHVzICovCisgIGxvbmcgdXRfc2Vzc2lvbjsgICAgICAgICAgICAgICAgICAgICAgLyogU2Vzc2lvbiBJRCwgdXNlZCBmb3Igd2luZG93aW5nICovCisgIHN0cnVjdCB0aW1ldmFsIHV0X3R2OyAgICAgICAgICAgICAgICAgLyogVGltZSBlbnRyeSB3YXMgbWFkZSAqLworICBpbnQzMl90IHV0X2FkZHJfdjZbNF07ICAgICAgICAgICAgICAgIC8qIEludGVybmV0IGFkZHJlc3Mgb2YgcmVtb3RlIGhvc3QgKi8KKyAgY2hhciBwYWRbMjBdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLworfTsKKworI2RlZmluZSB1dF90aW1lIHV0X3R2LnR2X3NlYyAgICAvKiBXaHkgc2hvdWxkIExpbnV4IGJlIGxpa2UgYW55dGhpbmcgZWxzZT8gKi8KKyNkZWZpbmUgdXRfbmFtZSB1dF91c2VyICAgICAgICAgLyogLi4uICovCisKK2V4dGVybiB2b2lkCitsb2d3dG1wIF9fUCAoKF9fY29uc3QgY2hhciAqX191dF9saW5lLCBfX2NvbnN0IGNoYXIgKl9fdXRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb25zdCBjaGFyICpfX3V0X2hvc3QpKTsKKworI2Vsc2UgIC8qIE5vdCBVVE1QQlVHICovCisKKyNpZm5kZWYgSEFWRVVUTVBYICAgICAgICAgICAgICAgICAgICAgICAvKiBXaG8gaGFzIDx1dG1weC5oPiAqLworI2lmZGVmIFNPTEFSSVMKKyNkZWZpbmUgSEFWRVVUTVBYCisjZWxzZQorI2lmZGVmIElSSVg2MAorI2RlZmluZSBIQVZFVVRNUFgKKyNlbHNlCisjaWZkZWYgQ0tfU0NPVjUKKyNkZWZpbmUgSEFWRVVUTVBYCisjZWxzZQorI2lmZGVmIEhQVVgxMDAKKyNkZWZpbmUgSEFWRVVUTVBYCisjZWxzZQorI2lmZGVmIFVOSVhXQVJFCisjZGVmaW5lIEhBVkVVVE1QWAorI2VuZGlmIC8qIFVOSVhXQVJFICovCisjZW5kaWYgLyogSFBVWDEwMCAqLworI2VuZGlmIC8qIENLX1NDT1Y1ICovCisjZW5kaWYgLyogSVJJWDYwICovCisjZW5kaWYgLyogU09MQVJJUyAqLworI2VuZGlmIC8qIEhBVkVVVE1QWCAqLworI2lmZGVmIEhBVkVVVE1QWAorI2luY2x1ZGUgPHV0bXB4Lmg+CisjZWxzZQorI2lmZGVmIE9TRjUwCisvKiBCZWNhdXNlIHRoZSB0aW1lX3QgaW4gdGhlIHV0bXAgc3RydWN0IGlzIDY0IGJpdHMgYnV0IHRpbWUoKSB3YW50cyAzMiAqLworI2RlZmluZSBfX1Y0MF9PQkpfQ09NUEFUIDEKKyNlbmRpZiAvKiBPU0Y1MCAqLworI2luY2x1ZGUgPHV0bXAuaD4KKyNpZmRlZiBPU0Y1MAorI3VuZGVmIF9fVjQwX09CSl9DT01QQVQKKyNlbmRpZiAvKiBPU0Y1MCAqLworI2VuZGlmIC8qIEhBVkVVVE1QWCAqLworI2VuZGlmIC8qIFVUTVBCVUcgKi8KKworI2lmbmRlZiBXVE1QRklMRQorI2lmZGVmIFFOWAorI2RlZmluZSBXVE1QRklMRSAiL3Vzci9hZG0vd3RtcC4xIgorI2Vsc2UKKyNpZmRlZiBMSU5VWAorI2RlZmluZSBXVE1QRklMRSAiL3Zhci9sb2cvd3RtcCIKKyNlbHNlCisjZGVmaW5lIFdUTVBGSUxFICIvdXNyL2FkbS93dG1wIgorI2VuZGlmIC8qIFFOWCAqLworI2VuZGlmIC8qIExJTlVYICovCisjZW5kaWYgLyogV1RNUEZJTEUgKi8KK2NoYXIgKiB3dG1wZmlsZSA9IE5VTEw7CisKK3N0YXRpYyBpbnQgd3RtcGZkID0gMDsKK3N0YXRpYyBjaGFyIGNrc3lzbGluZVszMl0gPSB7IE5VTCwgTlVMIH07CisKKyNpZm5kZWYgSEFWRVVUSE9TVCAgICAgICAgICAgICAgICAgICAgICAvKiBEb2VzIHV0bXAgaW5jbHVkZSB1dF9ob3N0W10/ICovCisjaWZkZWYgSEFWRVVUTVBYICAgICAgICAgICAgICAgICAgICAgICAgLyogdXRtcHggYWx3YXlzIGRvZXMgKi8KKyNkZWZpbmUgSEFWRVVUSE9TVAorI2Vsc2UKKyNpZmRlZiBMSU5VWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaW51eCBkb2VzICovCisjZGVmaW5lIEhBVkVVVEhPU1QKKyNlbHNlCisjaWZkZWYgU1VOT1M0ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VuT1MgZG9lcyAqLworI2RlZmluZSBIQVZFVVRIT1NUCisjZWxzZQorI2lmZGVmIEFJWDQxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFJWCA0LjEgYW5kIGxhdGVyIGRvICovCisjZGVmaW5lIEhBVkVVVEhPU1QKKyNlbmRpZiAvKiBBSVg0MSAqLworI2VuZGlmIC8qIFNVTk9TNCAqLworI2VuZGlmIC8qIExJTlVYICovCisjZW5kaWYgLyogSEFWRVVUTVBYICovCisjZW5kaWYgLyogSEFWRVVUSE9TVCAqLworCisjaWZkZWYgVVcyMDAKK1BJRF9UIF92Zm9yaygpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUbyBzYXRpc2Z5IGEgbGlicmFyeSBmb3VsdXAgKi8KKyAgICByZXR1cm4oZm9yaygpKTsgICAgICAgICAgICAgICAgICAgICAvKiBpbiBVbml4d2FyZSAyLjAueCAqLworfQorI2VuZGlmIC8qIFVXMjAwICovCisKK1ZPSUQKKyNpZmRlZiBDS19BTlNJQworbG9nd3RtcChjb25zdCBjaGFyICogbGluZSwgY29uc3QgY2hhciAqIG5hbWUsIGNvbnN0IGNoYXIgKiBob3N0KQorI2Vsc2UKK2xvZ3d0bXAobGluZSwgbmFtZSwgaG9zdCkgY2hhciAqbGluZSwgKm5hbWUsICpob3N0OworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBsb2d3dG1wICovIHsKKyNpZmRlZiBIQVZFVVRNUFgKKyAgICBzdHJ1Y3QgdXRtcHggdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBOZWVkZWQgZm9yIHV0X2hvc3RbXSAqLworI2Vsc2UKKyAgICBzdHJ1Y3QgdXRtcCB1dDsKKyNlbmRpZiAvKiBIQVZFVVRNUFggKi8KKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgLyogdGltZV90IHRpbWUoKTsgKi8KKworICAgIGlmICghY2t4d3RtcCkKKyAgICAgIHJldHVybjsKKworICAgIGlmICghd3RtcGZpbGUpCisgICAgICBtYWtlc3RyKCZ3dG1wZmlsZSxXVE1QRklMRSk7CisKKyAgICBpZiAoIWxpbmUpIGxpbmUgPSAiIjsKKyAgICBpZiAoIW5hbWUpIG5hbWUgPSAiIjsKKyAgICBpZiAoIWhvc3QpIGhvc3QgPSAiIjsKKworICAgIGlmICghd3RtcGZkICYmICh3dG1wZmQgPSBvcGVuKHd0bXBmaWxlLCBPX1dST05MWXxPX0FQUEVORCwgMCkpIDwgMCkgeworICAgICAgICBja3h3dG1wID0gMDsKKyAgICAgICAgZGVidWcoRjExMCwiV1RNUCBvcGVuIGZhaWxlZCIsbGluZSwwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWZzdGF0KHd0bXBmZCwgJmJ1ZikpIHsKKyAgICAgICAgY2tzdHJuY3B5KHV0LnV0X2xpbmUsIGxpbmUsIHNpemVvZih1dC51dF9saW5lKSk7CisgICAgICAgIGNrc3RybmNweSh1dC51dF9uYW1lLCBuYW1lLCBzaXplb2YodXQudXRfbmFtZSkpOworI2lmZGVmIEhBVkVVVEhPU1QKKyAgICAgICAgLyogTm90IHBvcnRhYmxlICovCisgICAgICAgIGNrc3RybmNweSh1dC51dF9ob3N0LCBob3N0LCBzaXplb2YodXQudXRfaG9zdCkpOworI2VuZGlmIC8qIEhBVkVVVEhPU1QgKi8KKyNpZmRlZiBIQVZFVVRNUFgKKyAgICAgICAgdGltZSgmdXQudXRfdHYudHZfc2VjKTsKKyNlbHNlCisjaWZkZWYgTElOVVgKKy8qIEluIGxpZ2h0IG9mIHRoZSBmb2xsb3dpbmcgY29tbWVudCBwZXJoYXBzIHRoZSBwcmV2aW91cyBsaW5lIHNob3VsZCAqLworLyogYmUgIiNpZm5kZWYgQ09NTUVOVCIuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBPbiA2NC1iaXQgcGxhdGZvcm1zIHNpemVvZih0aW1lX3QpIGFuZCBzaXplb2YodXQudXRfdGltZSkKKyAgICAgICAgICAgICAqIGFyZSBub3QgdGhlIHNhbWUgYW5kIGF0dGVtcHQgdG8gdXNlIGFuIGFkZHJlc3Mgb2YKKyAgICAgICAgICAgICAqIHV0LnV0X3RpbWUgYXMgYW4gYXJndW1lbnQgdG8gdGltZSgpIGNhbGwgbWF5IGNhdXNlCisgICAgICAgICAgICAgKiAidW5hbGlnbmVkIGFjY2VzcyIgdHJhcC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdGltZV90IHp6OworICAgICAgICAgICAgdGltZSgmenopOworICAgICAgICAgICAgdXQudXRfdGltZSA9IHp6OworICAgICAgICB9CisjZWxzZQorICAgICAgICB0aW1lKCZ1dC51dF90aW1lKTsKKyNlbmRpZiAvKiBMSU5VWCAqLworI2VuZGlmIC8qIEhBVkVVVE1QWCAqLworICAgICAgICBpZiAod3JpdGUod3RtcGZkLCAoY2hhciAqKSZ1dCwgc2l6ZW9mKHN0cnVjdCB1dG1wKSkgIT0KKyAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgdXRtcCkpIHsKKyNpZm5kZWYgTk9GVFJVTkNBVEUKKyNpZm5kZWYgQ09IRVJFTlQKKyAgICAgICAgICAgIGZ0cnVuY2F0ZSh3dG1wZmQsIGJ1Zi5zdF9zaXplKTsgLyogRXJyb3IsIHVuZG8gYW55IHBhcnRpYWwgd3JpdGUgKi8KKyNlbHNlCisgICAgICAgICAgICBjaHNpemUod3RtcGZkLCBidWYuc3Rfc2l6ZSk7IC8qIEVycm9yLCB1bmRvIGFueSBwYXJ0aWFsIHdyaXRlICovCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBOT0ZUUlVOQ0FURSAqLworICAgICAgICAgICAgZGVidWcoRjExMCwiV1RNUCB3cml0ZSBlcnJvciIsbGluZSwwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsIldUTVAgcmVjb3JkIE9LIixsaW5lLDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmIC8qIENLV1RNUCAqLworCisjaWZkZWYgQ0tTWVNMT0cKKy8qCisgIEMgSyBTIFkgUyBMIE8gRyAgLS0gIEMtS2VybWl0IHN5c3RlbSBsb2dnaW5nIGZ1bmN0aW9uLAorCisgIEZvciB1c2UgYnkgb3RoZXIgbW9kdWxlcy4KKyAgVGhpcyBtb2R1bGUgY2FuLCBidXQgZG9lc24ndCBoYXZlIHRvLCB1c2UgaXQuCisgIENhbGwgd2l0aDoKKyAgICBuID0gU1lTTEdfeHggdmFsdWVzIGRlZmluZWQgaW4gY2tjZGViLmgKKyAgICBzMSwgczIsIHMzOiBzdHJpbmdzLgorKi8KK1ZPSUQKK2Nrc3lzbG9nKG4sIG0sIHMxLCBzMiwgczMpIGludCBuLCBtOyBjaGFyICogczEsICogczIsICogczM7IHsKKyAgICBpbnQgbGV2ZWw7CisKKyAgICBpZiAoIWNreGxvZ2dpbmcpICAgICAgICAgICAgICAgICAgICAvKiBzeXNsb2dnaW5nICovCisgICAgICByZXR1cm47CisgICAgaWYgKCFzMSkgczEgPSAiIjsgICAgICAgICAgICAgICAgICAgLyogRml4IG51bGwgYXJncyAqLworICAgIGlmICghczIpIHMyID0gIiI7CisgICAgaWYgKCFzMykgczMgPSAiIjsKKyAgICBzd2l0Y2ggKG4pIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2xhdGUgS2VybWl0IGxldmVsICovCisgICAgICBjYXNlIFNZU0xHX0RCOiAgICAgICAgICAgICAgICAgICAgLyogdG8gc3lzbG9nIGxldmVsICovCisgICAgICAgIGxldmVsID0gTE9HX0RFQlVHOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxldmVsID0gbSA/IExPR19JTkZPIDogTE9HX0VSUjsKKyAgICB9CisgICAgZGVidWcoRjExMCwiY2tzeXNsb2cgczEiLHMxLDApOworICAgIGRlYnVnKEYxMTAsImNrc3lzbG9nIHMyIixzMiwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJja3N5c2xvZyBzMyIsczMsMCk7CisgICAgZXJybm8gPSAwOworICAgIHN5c2xvZyhsZXZlbCwgIiVzOiAlcyAlcyIsIHMxLCBzMiwgczMpOyAvKiBXcml0ZSBzeXNsb2cgcmVjb3JkICovCisgICAgZGVidWcoRjEwMSwiY2tzeXNsb2cgZXJybm8iLCIiLGVycm5vKTsKK30KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworCisKKy8qIERlY2xhcmF0aW9ucyAqLworCitpbnQgbWF4bmFtID0gTUFYTkFNTEVOOyAgICAgICAgICAgICAgICAgLyogQXZhaWxhYmxlIHRvIHRoZSBvdXRzaWRlICovCitpbnQgbWF4cGF0aCA9IE1BWFBBVEg7CitpbnQgY2tfem5ld24gPSAtMTsKKworI2lmZGVmIFVOSVgKK2NoYXIgc3RhcnR1cGRpcltNQVhQQVRIKzFdOworI2VuZGlmIC8qIFVOSVggKi8KKworaW50IHBleGl0c3RhdCA9IC0yOyAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3MgZXhpdCBzdGF0dXMgKi8KKworRklMRSAqZnBbWk5GSUxTXSA9IHsgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgcG9pbnRlcnMgKi8KKyAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKK307CisKKy8qIEZsYWdzIGZvciBlYWNoIGZpbGUgaW5kaWNhdGluZyB3aGV0aGVyIGl0IHdhcyBvcGVuZWQgd2l0aCBwb3BlbigpICovCitpbnQgaXNwaXBlW1pORklMU10gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKworLyogQnVmZmVycyBhbmQgcG9pbnRlcnMgdXNlZCBpbiBidWZmZXJlZCBmaWxlIGlucHV0IGFuZCBvdXRwdXQuICovCisjaWZkZWYgRFlOQU1JQworZXh0ZXJuIGNoYXIgKnppbmJ1ZmZlciwgKnpvdXRidWZmZXI7CisjZWxzZQorZXh0ZXJuIGNoYXIgemluYnVmZmVyW10sIHpvdXRidWZmZXJbXTsKKyNlbmRpZiAvKiBEWU5BTUlDICovCitleHRlcm4gY2hhciAqemlucHRyLCAqem91dHB0cjsKK2V4dGVybiBpbnQgemluY250LCB6b3V0Y250OworZXh0ZXJuIGludCB3aWxkeHBhbmQ7CisKK3N0YXRpYyBsb25nIGlmbGVuID0gLTFMOyAgICAgICAgICAgICAgICAvKiBJbnB1dCBmaWxlIGxlbmd0aCAqLworCitzdGF0aWMgUElEX1QgcGlkID0gMDsgICAgICAgICAgICAgICAgICAgLyogcGlkIG9mIGNoaWxkIGZvcmsgKi8KK3N0YXRpYyBpbnQgZmNvdW50ID0gMDsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZmlsZXMgaW4gd2lsZCBncm91cCAqLworc3RhdGljIGludCBueHBhbmQgPSAwOyAgICAgICAgICAgICAgICAgIC8qIENvcHkgb2YgZmNvdW50ICovCitzdGF0aWMgY2hhciBuYW1idWZbQ0tNQVhQQVRIKzRdOyAgICAgICAgLyogQnVmZmVyIGZvciBhIHBhdGhuYW1lICovCisKKyNpZm5kZWYgTk9GUklMTFMKKyNkZWZpbmUgWk1CVUZMRU4gMjAwCitzdGF0aWMgY2hhciB6bWJ1ZltaTUJVRkxFTl07CQkvKiBGb3IgbWFpbCwgcmVtb3RlIHByaW50IHN0cmluZ3MgKi8KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCitjaGFyICoqbXRjaHMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgLyogTWF0Y2hlcyBmb3VuZCBmb3IgZmlsZW5hbWUgKi8KK2NoYXIgKiptdGNocHRyID0gTlVMTDsgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgbWF0Y2ggKi8KKworLyogIFogSyBTIEUgTCBGICAtLSAgS2lsbCBTZWxmOiBsb2cgb3V0IG93biBqb2IsIGlmIHBvc3NpYmxlLiAgKi8KKworLyogTm90ZSwgc2hvdWxkIGdldCBjdXJyZW50IHBpZCwgYnV0IGlmIHlvdXIgc3lzdGVtIGRvZXNuJ3QgaGF2ZSAqLworLyogZ2V0cHBpZCgpLCB0aGVuIGp1c3Qga2lsbCgwLDkpLi4uICAqLworCisjaWZuZGVmIFNWUjMKKyNpZm5kZWYgUE9TSVgKKyNpZm5kZWYgT1NGUEMKKy8qIEFscmVhZHkgZGVjbGFyZWQgaW4gdW5pc3RkLmggZm9yIFNWUjMgYW5kIFBPU0lYICovCisjaWZkZWYgQ0tfQU5TSUMKK2V4dGVybiBQSURfVCBnZXRwcGlkKHZvaWQpOworI2Vsc2UKKyNpZm5kZWYgUFMyQUlYMTAKKyNpZm5kZWYgQ09IRVJFTlQKK2V4dGVybiBQSURfVCBnZXRwcGlkKCk7CisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBQUzJBSVgxMCAqLworI2VuZGlmIC8qIENLX0FOU0lDICovCisjZW5kaWYgLyogT1NGUEMgKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworI2VuZGlmIC8qIFNWUjMgKi8KKworaW50Cit6a3NlbGYoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yICJieWUiLCBidXQgbm8gZ3VhcmFudGVlISAqLworI2lmZGVmIFBST1ZYMQorICAgIHJldHVybihraWxsKDAsOSkpOworI2Vsc2UKKyNpZmRlZiBWNworICAgIHJldHVybihraWxsKDAsOSkpOworI2Vsc2UKKyNpZmRlZiBUT1dFUjEKKyAgICByZXR1cm4oa2lsbCgwLDkpKTsKKyNlbHNlCisjaWZkZWYgRlQxOAorICAgIHJldHVybihraWxsKDAsOSkpOworI2Vsc2UKKyNpZmRlZiBhZWdpcworICAgIHJldHVybihraWxsKDAsOSkpOworI2Vsc2UKKyNpZmRlZiBDT0hFUkVOVAorICAgIHJldHVybihraWxsKChQSURfVClnZXRwaWQoKSwxKSk7CisjZWxzZQorI2lmZGVmIFBJRF9UCisgICAgZXhpdChraWxsKChQSURfVClnZXRwcGlkKCksMSkpOworICAgIHJldHVybigwKTsKKyNlbHNlCisgICAgZXhpdChraWxsKGdldHBwaWQoKSwxKSk7CisgICAgcmV0dXJuKDApOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCit9CisKK3N0YXRpYyBWT0lECitnZXRmdWxsbmFtZShuYW1lKSBjaGFyICogbmFtZTsgeworICAgIGNoYXIgKnAgPSAoY2hhciAqKWZ1bGxuYW1lOworICAgIGludCBsZW4gPSAwOworICAgIGZ1bGxuYW1lWzBdID0gJ1wwJzsKKyAgICAvKiBJZiBuZWNlc3Nhcnkgd2UgY291bGQgYWxzbyBjaGFzZSBkb3duIHN5bWxpbmtzIGhlcmUuLi4gKi8KKyNpZmRlZiBDT01NRU5UCisgICAgLyogVGhpcyB3b3JrcyBidXQgaXMgaW5jb21wYXRpYmxlIHdpdGggd3VmdHBkICovCisgICAgaWYgKGlzZ3Vlc3QgJiYgYW5vbnJvb3QpIHsKKyAgICAgICAgY2tzdHJuY3B5KGZ1bGxuYW1lLGFub25yb290LENLTUFYUEFUSCk7CisgICAgICAgIGxlbiA9IHN0cmxlbihmdWxsbmFtZSk7CisgICAgICAgIGlmIChsZW4gPiAwKQorICAgICAgICAgIGlmIChmdWxsbmFtZVtsZW4tMV0gPT0gJy8nKQorICAgICAgICAgICAgbGVuLS07CisgICAgfQorICAgIHAgKz0gbGVuOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB6Zm5xZnAobmFtZSwgQ0tNQVhQQVRIIC0gbGVuLCBwKTsKKyAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgaWYgKCpwIDwgJyEnKSAqcCA9ICdfJzsKKyAgICAgICAgcCsrOworICAgIH0KK30KKworLyogIEQgTyBJIEsgTCBPIEcgIC0tICBPcGVuIEtlcm1pdC1zcGVjaWZpYyBmdHAtbGlrZSB0cmFuc2ZlciBsb2cuICovCisKK1ZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsZWQgaW4gY2tjbWFpLmMgKi8KK2RvaWtsb2coKSB7CisgICAgaWYgKGlrbG9nb3BlbikgICAgICAgICAgICAgICAgICAgICAgLyogQWxyZWFkeSBvcGVuPyAqLworICAgICAgcmV0dXJuOworICAgIGlmICh4ZmVybG9nKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIE9wZW4gaWtzZCBsb2cgaWYgcmVxdWVzdGVkICovCisgICAgICAgIGlmICgheGZlcmZpbGUpICAgICAgICAgICAgICAgICAgLyogSWYgbm8gcGF0aG5hbWUgZ2l2ZW4gKi8KKyAgICAgICAgICBtYWtlc3RyKCZ4ZmVyZmlsZSxYRkVSRklMRSk7CS8qIHVzZSB0aGlzIGRlZmF1bHQgKi8KKyAgICAgICAgaWYgKCp4ZmVyZmlsZSkgeworICAgICAgICAgICAgeGZlcmxvZyA9IG9wZW4oeGZlcmZpbGUsIE9fV1JPTkxZIHwgT19BUFBFTkQgfCBPX0NSRUFULCAwNjYwKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImRvaWtsb2cgb3BlbiIsIiIseGZlcmxvZyk7CisgICAgICAgICAgICBpZiAoeGZlcmxvZyA8IDApIHsKKyNpZmRlZiBDS1NZU0xPRworICAgICAgICAgICAgICAgIHN5c2xvZyhMT0dfRVJSLCAieGZlcmxvZyBvcGVuIGZhaWx1cmUgJXM6ICVtIiwgeGZlcmZpbGUpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiZG9pa2xvZyBvcGVuIGVycm5vIiwiIixlcnJubyk7CisgICAgICAgICAgICAgICAgeGZlcmxvZyA9IDA7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgaWtsb2dvcGVuID0gMTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgeGZlcmxvZyA9IDA7CisjaWZkZWYgQ0tTWVNMT0cKKyAgICAgICAgaWYgKHhmZXJsb2cgJiYgY2t4bG9nZ2luZykKKyAgICAgICAgICBzeXNsb2coTE9HX0lORk8sICJ4ZmVybG9nOiAlcyBvcGVuIG9rIiwgeGZlcmZpbGUpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgfQorfQorCisvKiAgWiBPIFAgRSBOIEkgIC0tICBPcGVuIGFuIGV4aXN0aW5nIGZpbGUgZm9yIGlucHV0LiAqLworCisvKiBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlICovCisKK2ludAorem9wZW5pKG4sbmFtZSkgaW50IG47IGNoYXIgKm5hbWU7IHsKKyAgICBpbnQgeDsKKworICAgIGRlYnVnKEYxMTEsInpvcGVuaSIsbmFtZSxuKTsKKyAgICBpZiAoKHggPSBjaGtmbihuKSkgIT0gMCkgeworCWRlYnVnKEYxMTEsInpvcGVuaSBjaGtmbiIsY2tpdG9hKG4pLHgpOworCXJldHVybigwKTsKKyAgICB9CisgICAgemluY250ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgaW5wdXQgYnVmZmVyICovCisgICAgaWYgKG4gPT0gWlNZU0ZOKSB7ICAgICAgICAgICAgICAgICAgLyogSW5wdXQgZnJvbSBhIHN5c3RlbSBmdW5jdGlvbj8gKi8KKyNpZmRlZiBDT01NRU5UCisvKioqIE5vdGUsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aCBaU1lTRk4gKioqLworLyoqKiBBbHdheXMgY2FsbCB6eGNtZCgpIGRpcmVjdGx5LCBhbmQgZ2l2ZSBpdCB0aGUgcmVhbCBmaWxlIG51bWJlciAqKiovCisvKioqIHlvdSB3YW50IHRvIHVzZS4gICoqKi8KKyAgICAgICAgcmV0dXJuKHp4Y21kKG4sbmFtZSkpOyAgICAgICAgICAvKiBUcnkgdG8gZm9yayB0aGUgY29tbWFuZCAqLworI2Vsc2UKKyAgICAgICAgZGVidWcoRjExMCwiem9wZW5pIGNhbGxlZCB3aXRoIFpTWVNGTiwgZmFpbGluZyEiLG5hbWUsMCk7CisgICAgICAgICpuYW1idWYgPSAnXDAnOyAgICAgICAgICAgICAgICAgLyogTm8gZmlsZW5hbWUuICovCisgICAgICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAgICAgLyogZmFpbC4gKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfQorICAgIGlmIChuID09IFpTVERJTykgeyAgICAgICAgICAgICAgICAgIC8qIFN0YW5kYXJkIGlucHV0PyAqLworICAgICAgICBpZiAoaXNfYV90dHkoMCkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJUZXJtaW5hbCBpbnB1dCBub3QgYWxsb3dlZCIpOworICAgICAgICAgICAgZGVidWcoRjExMCwiem9wZW5pOiBhdHRlbXB0cyBpbnB1dCBmcm9tIHVucmVkaXJlY3RlZCBzdGRpbiIsIiIsMCk7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgZnBbWklGSUxFXSA9IHN0ZGluOworICAgICAgICBpc3BpcGVbWklGSUxFXSA9IDA7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisjaWZkZWYgQ0tST09UCisgICAgZGVidWcoRjExMSwiem9wZW5pIHNldHJvb3QiLGNrcm9vdCxja3Jvb3RzZXQpOworICAgIGlmIChja3Jvb3RzZXQpIGlmICghemlucm9vdChuYW1lKSkgeworCWRlYnVnKEYxMTAsInpvcGVuaSBzZXRyb290IHZpb2xhdGlvbiIsbmFtZSwwKTsKKwlyZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLUk9PVCAqLworICAgIGZwW25dID0gZm9wZW4obmFtZSwiciIpOyAgICAgICAgICAgIC8qIFJlYWwgZmlsZSwgb3BlbiBpdC4gKi8KKyAgICBkZWJ1ZyhGMTExLCJ6b3BlbmkgZm9wZW4iLCBuYW1lLCBmcFtuXSk7CisjaWZkZWYgWkRFQlVHCisgICAgcHJpbnRmKCJaT1BFTkkgZnBbJWRdPSVsZFxuIixuLGZwW25dKTsKKyNlbmRpZiAvKiBaREVCVUcgKi8KKyAgICBpc3BpcGVbbl0gPSAwOworCisgICAgaWYgKHhmZXJsb2cKKyNpZmRlZiBDS1NZU0xPRworICAgICAgICB8fCAoKGNreHN5c2xvZyA+PSBTWVNMR19GQSkgJiYgY2t4bG9nZ2luZykKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgICAgICApIHsKKyAgICAgICAgZ2V0ZnVsbG5hbWUobmFtZSk7CisgICAgICAgIGRlYnVnKEYxMTAsInpvcGVuaSBmdWxsbmFtZSIsZnVsbG5hbWUsMCk7CisgICAgfQorICAgIGlmIChmcFtuXSA9PSBOVUxMKSB7CisjaWZkZWYgQ0tTWVNMT0cKKyAgICAgICAgaWYgKGNreHN5c2xvZyA+PSBTWVNMR19GQSAmJiBja3hsb2dnaW5nKSB7CisJICAgIHN5c2xvZyhMT0dfSU5GTywgImZpbGVbJWRdICVzOiBvcGVuIGZhaWxlZCAoJW0pIiwgbiwgZnVsbG5hbWUpOworCSAgICBwZXJyb3IoZnVsbG5hbWUpOworCX0gZWxzZQorI2VuZGlmIC8qIENLU1lTTE9HICovCisJICBwZXJyb3IobmFtZSk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9IGVsc2UgeworI2lmZGVmIENLU1lTTE9HCisgICAgICAgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfRkEgJiYgY2t4bG9nZ2luZykKKyAgICAgICAgICBzeXNsb2coTE9HX0lORk8sICJmaWxlWyVkXSAlczogb3BlbiByZWFkIG9rIiwgbiwgZnVsbG5hbWUpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgIGNsZWFyZXJyKGZwW25dKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KK30KKworI2lmZGVmIFFOWAorI2RlZmluZSBET05ERUxBWQorI2Vsc2UKKyNpZmRlZiBPX05ERUxBWQorI2RlZmluZSBET05ERUxBWQorI2VuZGlmIC8qIE9fTkRFTEFZICovCisjZW5kaWYgLyogUU5YICovCisKKy8qICBaIE8gUCBFIE4gTyAgLS0gIE9wZW4gYSBuZXcgZmlsZSBmb3Igb3V0cHV0LiAgKi8KKworLypBUkdTVVNFRCovCS8qIHp6IG5vdCB1c2VkICovCitpbnQKK3pvcGVubyhuLG5hbWUsenosZmNiKQorLyogem9wZW5vICovICBpbnQgbjsgY2hhciAqbmFtZTsgc3RydWN0IHphdHRyICp6ejsgc3RydWN0IGZpbGluZm8gKmZjYjsgeworCisgICAgY2hhciBwWzhdOworICAgIGludCBhcHBlbmQgPSAwOworCisvKiBBcyBvZiBWZXJzaW9uIDVBLCB0aGUgYXR0cmlidXRlIHN0cnVjdHVyZSBhbmQgdGhlIGZpbGUgaW5mb3JtYXRpb24gKi8KKy8qIHN0cnVjdHVyZSBhcmUgaW5jbHVkZWQgaW4gdGhlIGFyZ2xpc3QuICovCisKKyNpZmRlZiBERUJVRworICAgIGRlYnVnKEYxMTEsInpvcGVubyIsbmFtZSxuKTsKKyAgICBpZiAoZmNiKSB7CisgICAgICAgIGRlYnVnKEYxMDEsInpvcGVubyBmY2IgZGlzcCIsIiIsZmNiLT5kc3ApOworICAgICAgICBkZWJ1ZyhGMTAxLCJ6b3Blbm8gZmNiIHR5cGUiLCIiLGZjYi0+dHlwKTsKKyAgICAgICAgZGVidWcoRjEwMSwiem9wZW5vIGZjYiBjaGFyIiwiIixmY2ItPmNzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWJ1ZyhGMTAwLCJ6b3Blbm8gZmNiIGlzIE5VTEwiLCIiLDApOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgaWYgKGNoa2ZuKG4pICE9IDApICAgICAgICAgICAgICAgICAgLyogQWxyZWFkeSBvcGVuPyAqLworICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8uICovCisKKyAgICBpZiAoKG4gPT0gWkNURVJNKSB8fCAobiA9PSBaU1RESU8pKSB7IC8qIFRlcm1pbmFsIG9yIHN0YW5kYXJkIG91dHB1dCAqLworICAgICAgICBmcFtaT0ZJTEVdID0gc3Rkb3V0OworICAgICAgICBpc3BpcGVbWk9GSUxFXSA9IDA7CisjaWZkZWYgQ09NTUVOVAorCS8qIFRoaXMgc2VlbXMgcmlnaHQgYnV0IGl0IGJyZWFrcyBjbGllbnQgc2VydmVyIG9wcyAqLworCWZwW25dID0gc3Rkb3V0OworICAgICAgICBpc3BpcGVbbl0gPSAwOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBERUJVRworICAgICAgICBpZiAobiAhPSBaREZJTEUpCisgICAgICAgICAgZGVidWcoRjEwMSwiem9wZW5vIGZwW25dPXN0ZG91dCIsIiIsZnBbbl0pOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgIHpvdXRjbnQgPSAwOworICAgICAgICB6b3V0cHRyID0gem91dGJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworLyogQSByZWFsIGZpbGUuICBPcGVuIGl0IGluIGRlc2lyZWQgbW9kZSAoY3JlYXRlIG9yIGFwcGVuZCkuICovCisKKyNpZmRlZiBDS1JPT1QKKyAgICBkZWJ1ZyhGMTExLCJ6b3Blbm8gc2V0cm9vdCIsY2tyb290LGNrcm9vdHNldCk7CisgICAgaWYgKGNrcm9vdHNldCkgaWYgKCF6aW5yb290KG5hbWUpKSB7CisJZGVidWcoRjExMCwiem9wZW5vIHNldHJvb3QgdmlvbGF0aW9uIixuYW1lLDApOworCXJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tST09UICovCisKKyAgICBja3N0cm5jcHkocCwidyIsOCk7CQkJLyogQXNzdW1lIHdyaXRlL2NyZWF0ZSBtb2RlICovCisgICAgaWYgKGZjYikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgY2FsbGVkIHdpdGggYW4gRkNCLi4uICovCisgICAgICAgIGlmIChmY2ItPmRzcCA9PSBYWUZaX0EpIHsgICAgICAgLyogRG9lcyBpdCBzYXkgQXBwZW5kPyAqLworICAgICAgICAgICAgY2tzdHJuY3B5KHAsImEiLDgpOwkJLyogWWVzLiAqLworICAgICAgICAgICAgZGVidWcoRjEwMCwiem9wZW5vIGFwcGVuZCIsIiIsMCk7CisgICAgICAgICAgICBhcHBlbmQgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHhmZXJsb2cKKyNpZmRlZiBDS1NZU0xPRworICAgICAgICB8fCAoKGNreHN5c2xvZyA+PSBTWVNMR19GQykgJiYgY2t4bG9nZ2luZykKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgICAgICApIHsKKyAgICAgICAgZ2V0ZnVsbG5hbWUobmFtZSk7CisgICAgICAgIGRlYnVnKEYxMTAsInpvcGVubyBmdWxsbmFtZSIsZnVsbG5hbWUsMCk7CisgICAgfQorICAgIGRlYnVnKEYxMTAsInpvcGVubyBmb3BlbiBhcmciLHAsMCk7CisgICAgZnBbbl0gPSBmb3BlbihuYW1lLHApOyAgICAgICAgICAgICAgLyogVHJ5IHRvIG9wZW4gdGhlIGZpbGUgKi8KKyAgICBpc3BpcGVbWklGSUxFXSA9IDA7CisKKyNpZmRlZiBaREVCVUcKKyAgICBwcmludGYoIlpPUEVOTyBmcFslZF09JWxkXG4iLG4sZnBbbl0pOworI2VuZGlmIC8qIFpERUJVRyAqLworCisgICAgaWYgKGZwW25dID09IE5VTEwpIHsgICAgICAgICAgICAgICAgLyogRmFpbGVkICovCisgICAgICAgIGRlYnVnKEYxMDEsInpvcGVubyBmYWlsZWQgZXJybm8iLCIiLGVycm5vKTsKKyNpZmRlZiBDS1NZU0xPRworICAgICAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX0ZDICYmIGNreGxvZ2dpbmcpCisgICAgICAgICAgc3lzbG9nKExPR19JTkZPLCAiZmlsZVslZF0gJXM6ICVzIGZhaWxlZCAoJW0pIiwKKyAgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAgZnVsbG5hbWUsCisgICAgICAgICAgICAgICAgIGFwcGVuZCA/ICJhcHBlbmQiIDogImNyZWF0ZSIKKyAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworI2lmZGVmIENPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExldCB1cHBlciBsZXZlbHMgcHJpbnQgbWVzc2FnZS4gKi8KKyAgICAgICAgcGVycm9yKCJDYW4ndCBvcGVuIG91dHB1dCBmaWxlIik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2NlZWRlZCAqLworICAgICAgICBleHRlcm4gaW50IHpvZmJ1ZmZlciwgem9mYmxvY2ssIHpvYnVmc2l6ZTsKKyAgICAgICAgZGVidWcoRjEwMSwgInpvcGVubyB6b2J1ZnNpemUiLCAiIiwgem9idWZzaXplKTsKKyAgICAgICAgaWYgKG4gPT0gWkRGSUxFIHx8IG4gPT0gWlRGSUxFKSB7IC8qIElmIGRlYnVnIG9yIHRyYW5zYWN0aW9uIGxvZyAqLworICAgICAgICAgICAgc2V0YnVmKGZwW25dLE5VTEwpOyAgICAgICAgICAgLyogbWFrZSBpdCB1bmJ1ZmZlcmVkLiAqLworI2lmZGVmIERPTkRFTEFZCisgICAgICAgIH0gZWxzZSBpZiAobiA9PSBaT0ZJTEUgJiYgIXpvZmJsb2NrKSB7IC8qIGJsb2NraW5nIG9yIG5vbmJsb2NraW5nICovCisgICAgICAgICAgICBpbnQgZmxhZ3M7CisgICAgICAgICAgICBpZiAoKGZsYWdzID0gZmNudGwoZmlsZW5vKGZwW25dKSxGX0dFVEZMLDApKSA+IC0xKQorICAgICAgICAgICAgICBmY250bChmaWxlbm8oZnBbbl0pLEZfU0VURkwsIGZsYWdzIHwKKyNpZmRlZiBRTlgKKyAgICAgICAgICAgICAgICAgICAgT19OT05CTE9DSworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgT19OREVMQVkKKyNlbmRpZiAvKiBRTlggKi8KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsInpvcGVubyBaT0ZJTEUgbm9uYmxvY2tpbmciLCIiLDApOworI2VuZGlmIC8qIERPTkRFTEFZICovCisgICAgICAgIH0gZWxzZSBpZiAobiA9PSBaT0ZJTEUgJiYgIXpvZmJ1ZmZlcikgeyAvKiBidWZmZXJlZCBvciB1bmJ1ZmZlcmVkICovCisgICAgICAgICAgICBzZXRidWYoZnBbbl0sTlVMTCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ6b3Blbm8gWk9GSUxFIHVuYnVmZmVyZWQiLCIiLDApOworICAgICAgICB9CisKKyNpZmRlZiBDS19MT0dJTgorICAgICAgICAvKiBFbmZvcmNlIGFub255bW91cyBmaWxlLWNyZWF0aW9uIHBlcm1pc3Npb24gKi8KKyAgICAgICAgaWYgKGlzZ3Vlc3QpCisgICAgICAgICAgaWYgKG4gPT0gWldGSUxFIHx8IG4gPT0gWk1GSUxFIHx8CisgICAgICAgICAgICAgIG4gPT0gWk9GSUxFIHx8IG4gPT0gWkRGSUxFIHx8CisgICAgICAgICAgICAgIG4gPT0gWlRGSUxFIHx8IG4gPT0gWlBGSUxFIHx8CisgICAgICAgICAgICAgIG4gPT0gWlNGSUxFKQorICAgICAgICAgICAgY2htb2QobmFtZSxja3hwZXJtcyk7CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyNpZmRlZiBDS1NZU0xPRworICAgICAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX0ZDICYmIGNreGxvZ2dpbmcpCisgICAgICAgICAgc3lzbG9nKExPR19JTkZPLCAiZmlsZVslZF0gJXM6ICVzIG9rIiwKKyAgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAgZnVsbG5hbWUsCisgICAgICAgICAgICAgICAgIGFwcGVuZCA/ICJhcHBlbmQiIDogImNyZWF0ZSIKKyAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgICAgICBkZWJ1ZyhGMTAwLCAiem9wZW5vIG9rIiwgIiIsIDApOworICAgIH0KKyAgICB6b3V0Y250ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiAoUFdQKSByZXNldCBvdXRwdXQgYnVmZmVyICovCisgICAgem91dHB0ciA9IHpvdXRidWZmZXI7CisgICAgcmV0dXJuKChmcFtuXSAhPSBOVUxMKSA/IDEgOiAwKTsKK30KKworLyogIFogQyBMIE8gUyBFICAtLSAgQ2xvc2UgdGhlIGdpdmVuIGZpbGUuICAqLworCisvKiAgUmV0dXJucyAwIGlmIGFyZyBvdXQgb2YgcmFuZ2UsIDEgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgY2xvc2UgZmFpbGVkLiAgKi8KKworaW50Cit6Y2xvc2UobikgaW50IG47IHsKKyAgICBpbnQgeCA9IDAsIHgyID0gMDsKKyAgICBleHRlcm4gbG9uZyBmZmM7CisKKyAgICBkZWJ1ZyhGMTAxLCJ6Y2xvc2UgZmlsZSBudW1iZXIiLCIiLG4pOworICAgIGlmIChjaGtmbihuKSA8IDEpIHJldHVybigwKTsgICAgICAgIC8qIENoZWNrIHJhbmdlIG9mIG4gKi8KKyAgICBpZiAoKG4gPT0gWk9GSUxFKSAmJiAoem91dGNudCA+IDApKSAvKiAoUFdQKSBvdXRwdXQgbGVmdG92ZXJzICovCisgICAgICB4MiA9IHpvdXRkdW1wKCk7CisKKyAgICBpZiAoZnBbWlNZU0ZOXSB8fCBpc3BpcGVbbl0pIHsgICAgICAvKiBJZiBmaWxlIGlzIHJlYWxseSBwaXBlICovCisjaWZuZGVmIE5PUFVTSAorICAgICAgICB4ID0gemNsb3NmKG4pOyAgICAgICAgICAgICAgICAgIC8qIGRvIGl0IHNwZWNpYWxseSAqLworI2Vsc2UKKyAgICAgICAgeCA9IEVPRjsKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyAgICAgICAgZGVidWcoRjEwMSwiemNsb3NlIHpjbG9zZiIsIiIseCk7CisgICAgICAgIGRlYnVnKEYxMDEsInpjbG9zZSB6Y2xvc2YgZnBbbl0iLCIiLGZwW25dKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGZwW25dICE9IHN0ZG91dCkgJiYgKGZwW25dICE9IHN0ZGluKSkKKyAgICAgICAgICB4ID0gZmNsb3NlKGZwW25dKTsKKyAgICAgICAgZnBbbl0gPSBOVUxMOworI2lmZGVmIENPTU1FTlQKKwlpZiAobiA9PSBaQ1RFUk0gfHwgbiA9PSBaU1RESU8pCS8qIFNlZSB6b3Blbm8oKSAqLworCSAgaWYgKGZwW1pPRklMRV0gPT0gc3Rkb3V0KQorCSAgICBmcFtaT0ZJTEVdID0gTlVMTDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfQorICAgIGlmbGVuID0gLTFMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludmFsaWRhdGUgZmlsZSBsZW5ndGggKi8KKyAgICBpZiAoeCA9PSBFT0YpIHsgICAgICAgICAgICAgICAgICAgICAvKiBpZiB3ZSBnb3QgYSBjbG9zZSBlcnJvciAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJ6Y2xvc2UgZmNsb3NlIGZhaWxzIiwiIix4KTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9IGVsc2UgaWYgKHgyIDwgMCkgeyAgICAgICAgICAgICAgICAvKiBvciBlcnJvciBmbHVzaGluZyBsYXN0IGJ1ZmZlciAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJ6Y2xvc2UgZXJyb3IgZmx1c2hpbmcgbGFzdCBidWZmZXIiLCIiLHgyKTsKKyAgICAgICAgcmV0dXJuKC0xKTsgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHJldHVybiBhbiBlcnJvciAqLworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFByaW50IGxvZyByZWNvcmQgY29tcGF0aWJsZSB3aXRoIHd1LWZ0cGQgKi8KKyAgICAgICAgaWYgKHhmZXJsb2cgJiYgKG4gPT0gWklGSUxFIHx8IG4gPT0gWk9GSUxFKSkgeworICAgICAgICAgICAgY2hhciAqIHMsICpwOworICAgICAgICAgICAgZXh0ZXJuIGNoYXIgdHRuYW1lW107CisgICAgICAgICAgICBpZiAoIWlrbG9nb3BlbikgKFZPSUQpIGRvaWtsb2coKTsgLyogT3BlbiBsb2cgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6Y2xvc2UgaWtsb2dvcGVuIiwiIixpa2xvZ29wZW4pOworICAgICAgICAgICAgaWYgKGlrbG9nb3BlbikgeworCQlpbnQgbGVuOworCQljaGFyICogZm5hbTsKKworICAgICAgICAgICAgICAgIHRpbWVub3cgPSB0aW1lKE5VTEwpOworI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgICAgICAgaWYgKGxvZ2dlZF9pbikKKyAgICAgICAgICAgICAgICAgIHMgPSBjbGllbnRob3N0OworICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgICAgICAgICAgICAgICAgcyA9IChjaGFyICopdHRuYW1lOworICAgICAgICAgICAgICAgIGlmICghcykgcyA9ICIiOworICAgICAgICAgICAgICAgIGlmICghKnMpIHMgPSAiKiI7CisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgICAgICAgICAgICBpZiAobG9nZ2VkX2luKSB7CisgICAgICAgICAgICAgICAgICAgIHAgPSBndWVzdHBhc3M7CisgICAgICAgICAgICAgICAgICAgIGlmICghKnApIHAgPSAiKiI7CisgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICAgICAgICAgICAgICAgIHAgPSB3aG9hbWkoKTsKKworCQlsZW4gPSAyNCArIDEyICsgKGludClzdHJsZW4ocykgKyAxNgorCQkgICsgKGludClzdHJsZW4oZnVsbG5hbWUpICsgMSArIDEgKyAxICsgMQorCQkgICAgKyAoaW50KXN0cmxlbihwKSArIDYgKyAyICsgMTI7CisJCWZuYW0gPSBmdWxsbmFtZTsKKwkJaWYgKCEqZm5hbSkgZm5hbSA9ICIocGlwZSkiOworCisJCWlmIChsZW4gPiBJS1NETVNHTEVOKQorCQkgIHNwcmludGYoaWtzZG1zZywJLyogU0FGRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjRzIFtCVUZGRVIgV09VTEQgT1ZFUkZMT1ddXG4iLGN0aW1lKCZ0aW1lbm93KSk7CisJCWVsc2UKKwkJICBzcHJpbnRmKGlrc2Rtc2csCS8qIFNBRkUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICIlLjI0cyAlZCAlcyAlbGQgJXMgJWMgJXMgJWMgJWMgJXMgJXMgJWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSgmdGltZW5vdyksICAgICAgICAvKiBkYXRlL3RpbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aW1lcigpLCAgICAgICAgICAgICAgIC8qIGVsYXBzZWQgc2VjcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcywgICAgICAgICAgICAgICAgICAgICAgLyogcGVlciBuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICBmZmMsICAgICAgICAgICAgICAgICAgICAvKiBieXRlIGNvdW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmbmFtLAkJCS8qIGZ1bGwgcGF0aG5hbWUgb2YgZmlsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKGJpbmFyeSA/ICdiJyA6ICdhJyksICAgLyogYmluYXJ5IG9yIGFzY2lpICovCisgICAgICAgICAgICAgICAgICAgICAgICAiXyIsICAgICAgICAgICAgICAgICAgICAvKiBvcHRpb25zID0gbm9uZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgbiA9PSBaSUZJTEUgPyAnbycgOiAnaScsIC8qIGluL291dCAqLworI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgICAgICAgICAgICAgICAoaXNndWVzdCA/ICdhJyA6ICdyJyksICAvKiBVc2VyIHR5cGUgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAncicsCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHAsICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZXJuYW1lIG9yIGd1ZXN0IHBhc3N3ZCAqLworI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZWRfaW4gPyAiaWtzIiA6ICJrZXJtaXQiLCAvKiBSZWNvcmQgSUQgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAia2VybWl0IiwKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIC8qIFVzZXIgSUQgb24gY2xpZW50IHN5c3RlbSB1bmtub3duICovCisgICAgICAgICAgICAgICAgICAgICAgICAiKiIgICAgICAgICAgICAgLyogRGl0dG8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiemNsb3NlIGlrc2Rtc2ciLGlrc2Rtc2csMCk7CisgICAgICAgICAgICAgICAgd3JpdGUoeGZlcmxvZywgaWtzZG1zZywgKGludClzdHJsZW4oaWtzZG1zZykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMDEsInpjbG9zZSByZXR1cm5zIiwiIiwxKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KK30KKworLyogIFogQyBIIEkgTiAgLS0gIEdldCBhIGNoYXJhY3RlciBmcm9tIHRoZSBpbnB1dCBmaWxlLiAgKi8KKworLyogIFJldHVybnMgLTEgaWYgRU9GLCAwIG90aGVyd2lzZSB3aXRoIGNoYXJhY3RlciByZXR1cm5lZCBpbiBhcmd1bWVudCAgKi8KKworaW50Cit6Y2hpbihuLGMpIGludCBuOyBpbnQgKmM7IHsKKyAgICBpbnQgYTsKKworI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIgJiYgIWxvY2FsICYmIChuID09IFpDVEVSTSB8fCBuID09IFpTVERJTykpIHsKKyAgICAgICAgYSA9IGNvbmluYygwKTsKKyAgICAgICAgaWYgKCpjIDwgMCkKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgIH0gZWxzZQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAvKiAoUFdQKSBKdXN0IGluIGNhc2UgdGhpcyBnZXRzIGNhbGxlZCB3aGVuIGl0IHNob3VsZG4ndC4gKi8KKyAgICBpZiAobiA9PSBaSUZJTEUpIHsKKyAgICAgICAgYSA9IHptaW5jaGFyKCk7CQkJLyogTm90ZTogdGhpcyBjYXRjaGVzIEN0cmwtWiAqLworICAgICAgICBpZiAoYSA8IDApCQkJLyogKFNlZSB6aW5maWxsKCkuLi4pICovCisJICByZXR1cm4oLTEpOworICAgIH0gZWxzZSB7CisJYSA9IGdldGMoZnBbbl0pOworCWlmIChhID09IEVPRikgcmV0dXJuKC0xKTsKKyNpZmRlZiBDS19DVFJMWgorCS8qIElmIFNFVCBGSUxFIEVPRiBDVFJMLVosIGZpcnN0IEN0cmwtWiBtYXJrcyBFT0YgKi8KKwlpZiAoIWJpbmFyeSAmJiBhID09IDB4MUEgJiYgZW9mbWV0aG9kID09IFhZRU9GX1opCisJICByZXR1cm4oLTEpOworI2VuZGlmIC8qIENLX0NUUkxaICovCisgICAgfQorICAgICpjID0gKENIQVIpIGEgJiAwMzc3OworICAgIHJldHVybigwKTsKK30KKworLyogIFogUyBJIE4gTCAgLS0gIFJlYWQgYSBsaW5lIGZyb20gYSBmaWxlICAqLworCisvKgorICBXcml0ZXMgdGhlIGxpbmUgaW50byB0aGUgYWRkcmVzcyBwcm92aWRlZCBieSB0aGUgY2FsbGVyLgorICBuIGlzIHRoZSBLZXJtaXQgImNoYW5uZWwgbnVtYmVyIi4KKyAgV3JpdGluZyB0ZXJtaW5hdGVzIHdoZW4gbmV3bGluZSBpcyBlbmNvdW50ZXJlZCwgbmV3bGluZSBpcyBub3QgY29waWVkLgorICBXcml0aW5nIGFsc28gdGVybWluYXRlcyB1cG9uIEVPRiBvciBpZiBsZW5ndGggeCBpcyBleGhhdXN0ZWQuCisgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBFT0Ygb3IgZXJyb3IuCisqLworaW50Cit6c2lubChuLHMseCkgaW50IG4sIHg7IGNoYXIgKnM7IHsKKyAgICBpbnQgYSwgeiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiB6IGlzIHJldHVybiBjb2RlLiAqLworICAgIGludCBjb3VudCA9IDA7CisgICAgaW50IGxlbiA9IDA7CisgICAgY2hhciAqYnVmOworICAgIGV4dGVybiBDSEFSIGZlb2w7ICAgICAgICAgICAgICAgICAgIC8qIExpbmUgdGVybWluYXRvciAqLworCisgICAgaWYgKCFzIHx8IGNoa2ZuKG4pIDwgMSkgICAgICAgICAgICAgLyogTWFrZSBzdXJlIGZpbGUgaXMgb3BlbiwgZXRjICovCisgICAgICByZXR1cm4oLTEpOworICAgIGJ1ZiA9IHM7CisgICAgc1swXSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgcmV0dXJuIGp1bmsgKi8KKworICAgIGEgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY2hhcmFjdGVyLCBub25lIHlldC4gKi8KKyAgICB3aGlsZSAoeC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVcCB0byBnaXZlbiBsZW5ndGggKi8KKyAgICAgICAgaW50IG9sZCA9IDA7CisgICAgICAgIGlmIChmZW9sKSAgICAgICAgICAgICAgICAgICAgICAgLyogUHJldmlvdXMgY2hhcmFjdGVyICovCisgICAgICAgICAgb2xkID0gYTsKKyAgICAgICAgaWYgKHpjaGluKG4sJmEpIDwgMCkgeyAgICAgICAgICAvKiBSZWFkIGEgY2hhcmFjdGVyIGZyb20gdGhlIGZpbGUgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInpzaW5sIHpjaGluIGZhaWwiLCIiLGNvdW50KTsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICAgICAgICB6ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIEVPRiBvciBvdGhlciBlcnJvciAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIGlmIChmZW9sKSB7ICAgICAgICAgICAgICAgICAgICAgLyogU2luZ2xlLWNoYXJhY3RlciBsaW5lIHRlcm1pbmF0b3IgKi8KKyAgICAgICAgICAgIGlmIChhID09IGZlb2wpCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENSTEYgbGluZSB0ZXJtaW5hdG9yICovCisgICAgICAgICAgICBpZiAoYSA9PSAnXDAxNScpICAgICAgICAgICAgLyogQ1IsIGdldCBuZXh0IGNoYXJhY3RlciAqLworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChvbGQgPT0gJ1wwMTUnKSB7ICAgICAgICAvKiBQcmV2aW91cyBjaGFyYWN0ZXIgd2FzIENSICovCisgICAgICAgICAgICAgICAgaWYgKGEgPT0gJ1wwMTInKSB7ICAgICAgLyogVGhpcyBvbmUgaXMgTEYsIHNvIHdlIGhhdmUgYSBsaW5lICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIE5vdCBMRiwgZGVwb3NpdCBDUiAqLworICAgICAgICAgICAgICAgICAgICAqcysrID0gJ1wwMTUnOworICAgICAgICAgICAgICAgICAgICB4LS07CisgICAgICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqcyA9IGE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlcG9zaXQgY2hhcmFjdGVyICovCisgICAgICAgIHMrKzsKKyAgICAgICAgbGVuKys7CisgICAgfQorICAgICpzID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisgICAgZGVidWcoRjAxMSwienNpbmwiLGJ1ZixsZW4pOworICAgIHJldHVybih6KTsKK30KKworLyogIFogWCBJIE4gIC0tICBSZWFkIHggYnl0ZXMgZnJvbSBhIGZpbGUgICovCisKKy8qCisgIFJlYWRzIHggYnl0ZXMgKG9yIGxlc3MpIGZyb20gY2hhbm5lbCBuIGFuZCB3cml0ZXMgdGhlbQorICB0byB0aGUgYWRkcmVzcyBwcm92aWRlZCBieSB0aGUgY2FsbGVyLgorICBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIG9uIHN1Y2Nlc3MsIDAgb24gRU9GIG9yIGVycm9yLgorKi8KK2ludAorenhpbihuLHMseCkgaW50IG4sIHg7IGNoYXIgKnM7IHsKKyNpZmRlZiBJS1NECisgICAgaWYgKGluc2VydmVyICYmICFsb2NhbCAmJiAobiA9PSBaQ1RFUk0gfHwgbiA9PSBaU1RESU8pKSB7CisgICAgICAgIGludCBhLCBpOworICAgICAgICBhID0gdHRjaGsoKTsKKyAgICAgICAgaWYgKGEgPCAxKSByZXR1cm4oMCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhICYmIGkgPCB4OyBpKyspCisgICAgICAgICAgc1tpXSA9IGNvbmluYygwKTsKKyAgICAgICAgcmV0dXJuKGkpOworICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisKKyAgICByZXR1cm4oZnJlYWQocywgc2l6ZW9mIChjaGFyKSwgeCwgZnBbbl0pKTsKK30KKworLyoKKyAgWiBJIE4gRiBJIEwgTCAgLS0gIEJ1ZmZlcmVkIGZpbGUgaW5wdXQuCisKKyAgKHJlKWZpbGwgdGhlIGZpbGUgaW5wdXQgYnVmZmVyIHdpdGggZGF0YS4gIEFsbCBmaWxlIGlucHV0CisgIHNob3VsZCBnbyB0aHJvdWdoIHRoaXMgcm91dGluZSwgdXN1YWxseSBieSBjYWxsaW5nIHRoZSB6bWluY2hhcigpCisgIG1hY3JvIGRlZmluZWQgaW4gY2tja2VyLmguICBSZXR1cm5zOgorCisgIFZhbHVlIDAuLjI1NSBvbiBzdWNjZXNzLCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHJlYWQuCisgIC0xIG9uIGVuZCBvZiBmaWxlLgorICAtMiBvbiBhbnkga2luZCBvZiBlcnJvciBvdGhlciB0aGFuIGVuZCBvZiBmaWxlLgorICAtMyB0aW1lb3V0IHdoZW4gcmVhZGluZyBmcm9tIHBpcGUgKEtlcm1pdCBwYWNrZXQgbW9kZSBvbmx5KS4KKyovCitpbnQKK3ppbmZpbGwoKSB7CisgICAgZXh0ZXJuIGludCBrYWN0aXZlLCBzcnZwaW5nOworICAgIGVycm5vID0gMDsKKworI2lmZGVmIFpERUJVRworICAgIHByaW50ZigiWklORklMTCBmcFslZF09JWxkXG4iLFpJRklMRSxmcFtaSUZJTEVdKTsKKyNlbmRpZiAvKiBaREVCVUcgKi8KKworI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIgJiYgIWxvY2FsICYmIGZwW1pJRklMRV0gPT0gc3RkaW4pIHsKKyAgICAgICAgaW50IGEsIGk7CisgICAgICAgIGEgPSB0dGNoaygpOworICAgICAgICBpZiAoYSA8IDApIHJldHVybigtMik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhICYmIGkgPCBJTkJVRlNJWkU7IGkrKykgeworICAgICAgICAgICAgemluYnVmZmVyW2ldID0gY29uaW5jKDApOworICAgICAgICB9CisgICAgICAgIHppbmNudCA9IGk7CisgICAgICAgIC8qIHNldCBwb2ludGVyIHRvIGJlZ2lubmluZywgKD09ICZ6aW5idWZmZXJbMF0pICovCisgICAgICAgIHppbnB0ciA9IHppbmJ1ZmZlcjsKKyAgICAgICAgaWYgKHppbmNudCA9PSAwKSByZXR1cm4oLTEpOworICAgICAgICB6aW5jbnQtLTsgICAgICAgICAgICAgICAgICAgICAgIC8qIE9uZSBsZXNzIGNoYXIgaW4gYnVmZmVyICovCisgICAgICAgIHJldHVybigoaW50KSgqemlucHRyKyspICYgMDM3Nyk7IC8qIGJlY2F1c2Ugd2UgcmV0dXJuIHRoZSBmaXJzdCAqLworICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisKKyAgICBkZWJ1ZyhGMTAxLCJ6aW5maWxsIGthY3RpdmUiLCIiLGthY3RpdmUpOworCisgICAgaWYgKCEoa2FjdGl2ZSAmJiBpc3BpcGVbWklGSUxFXSkpIHsKKyAgICAgICAgaWYgKGZlb2YoZnBbWklGSUxFXSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsIlpJTkZJTEwgZmVvZiIsIiIsMCk7CisjaWZkZWYgWkRFQlVHCisgICAgICAgICAgICBwcmludGYoIlpJTkZJTEwgRU9GXG4iKTsKKyNlbmRpZiAvKiBaREVCVUcgKi8KKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xlYXJlcnIoZnBbWklGSUxFXSk7CisKKyNpZmRlZiBTRUxFQ1QKKyAgICAvKiBIZXJlIHdlIGNhbiBjYWxsIHNlbGVjdCgpIHRvIGdldCBhIHRpbWVvdXQuLi4gKi8KKyAgICBpZiAoa2FjdGl2ZSAmJiBpc3BpcGVbWklGSUxFXSkgeworICAgICAgICBpbnQgc2VjcywgeiA9IDA7CisjaWZuZGVmIE5PWEZFUgorICAgICAgICBpZiAoc3J2cGluZykgeworICAgICAgICAgICAgc2VjcyA9IDE7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6aW5maWxsIGNhbGxpbmcgdHR3YWl0IiwiIixzZWNzKTsKKyAgICAgICAgICAgIHogPSB0dHdhaXQoZmlsZW5vKGZwW1pJRklMRV0pLHNlY3MpOworICAgICAgICAgICAgZGVidWcoRjEwMSwiemluZmlsbCB0dHdhaXQiLCIiLHopOworICAgICAgICB9CisjZW5kaWYgLyogTk9YRkVSICovCisgICAgICAgIGlmICh6ID09IDApCisgICAgICAgICAgcmV0dXJuKC0zKTsKKyAgICB9CisjZW5kaWYgLyogU0VMRUNUICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGRlYnVnKEYxMDEsIlpJTkZJTEwgSU5CVUZTSVpFIiwiIixJTkJVRlNJWkUpOworI2lmZGVmIFVTRV9NRU1DUFkKKyAgICAgICAgbWVtc2V0KHppbmJ1ZmZlciwgMHhGRiwgSU5CVUZTSVpFKTsKKyNlbHNlCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBJTkJVRlNJWkU7IGkrKykgeworICAgICAgICAgICAgemluYnVmZmVyW2ldID0gMHhGRjsKKyNpZmRlZiBDT01NRU5UCQkJCS8qIFRvbyBtdWNoISAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwiWklORklMTCB6aW5idWZmZXJbaV0iLCIiLGkpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9NRU1DUFkgKi8KKwlja3N0cm5jcHkoemluYnVmZmVyLCJ6aW5idWZmZXIgaXMgYSB2YWxpZCBidWZmZXIiLElOQlVGU0laRSk7CisJZGVidWcoRjExMSwiWklORklMTCBhYm91dCB0byBjYWxsIGZyZWFkIix6aW5idWZmZXIsemluYnVmZmVyKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKworLyoKKyAgTm90ZTogVGhlIGZvbGxvd2luZyByZWFkIE1VU1QgYmUgbm9uYmxvY2tpbmcgd2hlbiByZWFkaW5nIGZyb20gYSBwaXBlCisgIGFuZCB3ZSB3YW50IHRpbWVvdXRzIHRvIHdvcmsuICBTZWUgenhjbWQoKS4KKyovCisgICAgemluY250ID0gZnJlYWQoemluYnVmZmVyLCBzaXplb2YgKGNoYXIpLCBJTkJVRlNJWkUsIGZwW1pJRklMRV0pOworICAgIGRlYnVnKEYxMDEsIlpJTkZJTEwgZnJlYWQiLCIiLHppbmNudCk7IC8qIEp1c3QgdGhlIHNpemUgKi8KKyNpZmRlZiBaREVCVUcKKyAgICBwcmludGYoIkZSRUFEPSVkXG4iLHppbmNudCk7CisjZW5kaWYgLyogWkRFQlVHICovCisjaWZkZWYgQ0tfQ1RSTFoKKyAgICAvKiBJZiBTRVQgRklMRSBFT0YgQ1RSTC1aLCBmaXJzdCBDdHJsLVogbWFya3MgRU9GICovCisgICAgaWYgKHppbmNudCA+IDAgJiYgIWJpbmFyeSAmJiBlb2ZtZXRob2QgPT0gWFlFT0ZfWikgeworCXJlZ2lzdGVyIGludCBpOworCWZvciAoaSA9IDA7IGkgPCB6aW5jbnQ7IGkrKykgeworCSAgICBpZiAoemluYnVmZmVyW2ldID09IFNVQikgeworCQl6aW5jbnQgPSBpOwkJLyogU3RvcCBhdCBmaXJzdCBDdHJsLVogKi8KKwkJaWYgKGkgPT0gMCkKKwkJICByZXR1cm4oLTEpOworCQlicmVhazsKKwkgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENLX0NUUkxaICovCisKKyAgICBpZiAoemluY250ID09IDApIHsgICAgICAgICAgICAgICAgICAvKiBHb3Qgbm90aGluZz8gKi8KKyAgICAgICAgaWYgKGZlcnJvcihmcFtaSUZJTEVdKSkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwiWklORklMTCBmZXJyb3IiLCIiLDApOworICAgICAgICAgICAgZGVidWcoRjEwMSwiWklORklMTCBlcnJubyIsIiIsZXJybm8pOworI2lmZGVmIFpERUJVRworICAgICAgICAgICAgcHJpbnRmKCJaSU5GSUxMIGVycm5vPSVkXG4iLGVycm5vKTsKKyNlbmRpZiAvKiBaREVCVUcgKi8KKyNpZmRlZiBFV09VTERCTE9DSworICAgICAgICAgICAgcmV0dXJuKChlcnJubyA9PSBFV09VTERCTE9DSykgPyAtMyA6IC0yKTsKKyNlbHNlCisgICAgICAgICAgICByZXR1cm4oLTIpOworI2VuZGlmIC8qIEVXT1VMREJMT0NLICovCisgICAgICAgIH0KKworICAgIC8qIEluIGNhc2UgZmVvZigpIGRpZG4ndCB3b3JrIGp1c3QgYWJvdmUgLS0gc29tZXRpbWVzIGl0IGRvZXNuJ3QuLi4gKi8KKworICAgICAgICBpZiAoZmVvZihmcFtaSUZJTEVdKSApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsIlpJTkZJTEwgY291bnQgMCBFT0YgcmV0dXJuIC0xIiwiIiwwKTsKKyAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWcoRjEwMCwiWklORklMTCBjb3VudCAwIG5vdCBFT0YgcmV0dXJuIC0yIiwiIiwwKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICB9CisgICAgemlucHRyID0gemluYnVmZmVyOyAgICAvKiBzZXQgcG9pbnRlciB0byBiZWdpbm5pbmcsICg9PSAmemluYnVmZmVyWzBdKSAqLworICAgIHppbmNudC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9uZSBsZXNzIGNoYXIgaW4gYnVmZmVyICovCisgICAgcmV0dXJuKChpbnQpKCp6aW5wdHIrKykgJiAwMzc3KTsgICAgLyogYmVjYXVzZSB3ZSByZXR1cm4gdGhlIGZpcnN0ICovCit9CisKKy8qICBaIFMgTyBVIFQgIC0tICBXcml0ZSBhIHN0cmluZyBvdXQgdG8gdGhlIGdpdmVuIGZpbGUsIGJ1ZmZlcmVkLiAgKi8KKworaW50Cit6c291dChuLHMpIGludCBuOyBjaGFyICpzOyB7CisgICAgaW50IHJjID0gMDsKKyAgICByYyA9IGNoa2ZuKG4pOworICAgIGlmIChyYyA8IDEpIHJldHVybigtMSk7ICAgICAgICAgICAgIC8qIEtlZXAgdGhpcywgcHJldmVudHMgbWVtb3J5IGZhdWx0cyAqLworICAgIGlmICghcykgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgIC8qIE51bGwgcG9pbnRlciwgZG8gbm90aGluZywgc3VjY2VlZCAqLworICAgIGlmICghKnMpIHJldHVybigwKTsgICAgICAgICAgICAgICAgIC8qIGVtcHR5IHN0cmluZywgZGl0dG8gKi8KKworI2lmZGVmIElLU0QKKyAgICAvKgorICAgICAgVGhpcyBoYXBwZW5zIHdpdGggY2xpZW50LXNpZGUgS2VybWl0IHNlcnZlciB3aGVuIGEgUkVNT1RFIGNvbW1hbmQKKyAgICAgIHdhcyBzZW50IGZyb20gdGhlIHNlcnZlciB0byB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyIGlzIHN1cHBvc2VkIHRvCisgICAgICBkaXNwbGF5IHRoZSB0ZXh0LCBidXQgb2YgY291cnNlIHRoZXJlIGlzIG5vIHBsYWNlIHRvIGRpc3BsYXkgaXQKKyAgICAgIHNpbmNlIGl0IGlzIGluIHJlbW90ZSBtb2RlIGV4ZWN1dGluZyBLZXJtaXQgcHJvdG9jb2wuCisgICAgKi8KKyAgICBpZiAoaW5zZXJ2ZXIgJiYgIWxvY2FsICYmIChuID09IFpDVEVSTSB8fCBuID09IFpTVERJTykpIHsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIHJldHVybih0dG9sKHMsKChpbnQpc3RybGVuKHMpKSA8IDApID8gLTEgOiAwKTsKKyNlbHNlCisgICAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKworICAgIGlmIChuID09IFpTRklMRSkKKyAgICAgIHJldHVybih3cml0ZShmaWxlbm8oZnBbbl0pLHMsKGludClzdHJsZW4ocykpKTsKKyAgICByYyA9IGZwdXRzKHMsZnBbbl0pID09IEVPRiA/IC0xIDogMDsKKyAgICBpZiAobiA9PSBaV0ZJTEUpCisgICAgICBmZmx1c2goZnBbbl0pOworICAgIHJldHVybihyYyk7Cit9CisKKy8qICBaIFMgTyBVIFQgTCAgLS0gIFdyaXRlIHN0cmluZyB0byBmaWxlLCB3aXRoIGxpbmUgdGVybWluYXRvciwgYnVmZmVyZWQgICovCisKK2ludAorenNvdXRsKG4scykgaW50IG47IGNoYXIgKnM7IHsKKyAgICBpZiAoenNvdXQobixzKSA8IDApCisgICAgICAgIHJldHVybigtMSk7CisKKyNpZmRlZiBJS1NECisgICAgaWYgKGluc2VydmVyICYmICFsb2NhbCAmJiAobiA9PSBaQ1RFUk0gfHwgbiA9PSBaU1RESU8pKSB7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICByZXR1cm4odHRvYyhMRikpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgICAvKiBTZWUgY29tbWVudHMgaW4genNvdXQoKSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgaWYgKG4gPT0gWlNGSUxFKSAgICAgICAgICAgICAgICAgICAgLyogU2Vzc2lvbiBsb2cgaXMgdW5idWZmZXJlZCAqLworICAgICAgcmV0dXJuKHdyaXRlKGZpbGVubyhmcFtuXSksIlxuIiwxKSk7CisgICAgZWxzZSBpZiAoZnB1dHMoIlxuIixmcFtuXSkgPT0gRU9GKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAobiA9PSBaRElGSUwgfHwgbiA9PSBaV0ZJTEUpICAgICAvKiBGbHVzaCBjb25uZWN0aW9uIGxvZyByZWNvcmRzICovCisgICAgICBmZmx1c2goZnBbbl0pOworICAgIHJldHVybigwKTsKK30KKworLyogIFogUyBPIFUgVCBYICAtLSAgV3JpdGUgeCBjaGFyYWN0ZXJzIHRvIGZpbGUsIHVuYnVmZmVyZWQuICAqLworCitpbnQKK3pzb3V0eChuLHMseCkgaW50IG4sIHg7IGNoYXIgKnM7IHsKKyNpZmRlZiBJS1NECisgICAgaWYgKGluc2VydmVyICYmICFsb2NhbCAmJiAobiA9PSBaQ1RFUk0gfHwgbiA9PSBaU1RESU8pKSB7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICByZXR1cm4odHRvbChzLHgpKTsgICAgICAgICAgICAgIC8qIFNlZSBjb21tZW50cyBpbiB6c291dCgpICovCisjZWxzZQorICAgICAgICByZXR1cm4oeCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisKKyNpZmRlZiBDT01NRU5UCisgICAgaWYgKGNoa2ZuKG4pIDwgMSkgcmV0dXJuKC0xKTsKKyAgICByZXR1cm4od3JpdGUoZnBbbl0tPl9maWxlLHMseCkpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICByZXR1cm4od3JpdGUoZmlsZW5vKGZwW25dKSxzLHgpID09IHggPyB4IDogLTEpOworfQorCisvKiAgWiBDIEggTyBVIFQgIC0tICBBZGQgYSBjaGFyYWN0ZXIgdG8gdGhlIGdpdmVuIGZpbGUuICAqLworCisvKiAgU2hvdWxkIHJldHVybiAwIG9yIGdyZWF0ZXIgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZSAoZS5nLiBkaXNrIGZ1bGwpICAqLworCitpbnQKKyNpZmRlZiBDS19BTlNJQworemNob3V0KHJlZ2lzdGVyIGludCBuLCBjaGFyIGMpCisjZWxzZQoremNob3V0KG4sYykgcmVnaXN0ZXIgaW50IG47IGNoYXIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogemNob3V0KCkgKi8geworICAgIC8qIGlmIChjaGtmbihuKSA8IDEpIHJldHVybigtMSk7ICovCisKKyNpZmRlZiBJS1NECisgICAgaWYgKGluc2VydmVyICYmICFsb2NhbCAmJiAobiA9PSBaQ1RFUk0gfHwgbiA9PSBaU1RESU8pKSB7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICByZXR1cm4odHRvYyhjKSk7CisjZWxzZQorICAgICAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZSBjb21tZW50cyBpbiB6c291dCgpICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisKKyAgICBpZiAobiA9PSBaU0ZJTEUpICAgICAgICAgICAgICAgICAgICAvKiBVc2UgdW5idWZmZXJlZCBmb3Igc2Vzc2lvbiBsb2cgKi8KKyAgICAgIHJldHVybih3cml0ZShmaWxlbm8oZnBbbl0pLCZjLDEpID09IDEgPyAwIDogLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXJlZCBmb3IgZXZlcnl0aGluZyBlbHNlICovCisgICAgaWYgKHB1dGMoYyxmcFtuXSkgPT0gRU9GKSAgIC8qIElmIHRydWUsIG1heWJlIHRoZXJlIHdhcyBhbiBlcnJvciAqLworICAgICAgcmV0dXJuKGZlcnJvcihmcFtuXSk/LTE6MCk7ICAgICAgIC8qIENoZWNrIHRvIG1ha2Ugc3VyZSAqLworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZS4uLiAqLworICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZXJlIHdhcyBubyBlcnJvci4gKi8KK30KKworLyogKFBXUCkgYnVmZmVyZWQgY2hhcmFjdGVyIG91dHB1dCByb3V0aW5lIHRvIHNwZWVkIHVwIGZpbGUgSU8gKi8KKworaW50Cit6b3V0ZHVtcCgpIHsKKyAgICBpbnQgeDsKKyAgICBjaGFyICogenA7CisgICAgem91dHB0ciA9IHpvdXRidWZmZXI7ICAgICAgICAgICAgICAgLyogUmVzZXQgYnVmZmVyIHBvaW50ZXIgaW4gYWxsIGNhc2VzICovCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKQorICAgICAgZGVidWcoRjEwMSwiem91dGR1bXAgem91dGNudCIsIiIsem91dGNudCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICBpZiAoem91dGNudCA9PSAwKSB7ICAgICAgICAgICAgICAgICAvKiBOb3RoaW5nIHRvIG91dHB1dCAqLworICAgICAgICByZXR1cm4oMCk7CisgICAgfSBlbHNlIGlmICh6b3V0Y250IDwgMCkgeyAgICAgICAgICAgLyogVW5leHBlY3RlZCBuZWdhdGl2ZSBhcmd1bWVudCAqLworICAgICAgICB6b3V0Y250ID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IG91dHB1dCBidWZmZXIgY291bnQgKi8KKyAgICAgICAgcmV0dXJuKC0xKTsgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgZmFpbC4gKi8KKyAgICB9CisKKyNpZmRlZiBJS1NECisgICAgaWYgKGluc2VydmVyICYmICFsb2NhbCAmJiBmcFtaT0ZJTEVdID09IHN0ZG91dCkgeworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgeCA9IHR0b2woem91dGJ1ZmZlcix6b3V0Y250KTsKKyNlbHNlCisgICAgICAgIHggPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlIGNvbW1lbnRzIGluIHpzb3V0KCkgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIHpvdXRjbnQgPSAwOworICAgICAgICByZXR1cm4oeCA+IDAgPyAwIDogLTEpOworICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisKKy8qCisgIEZyYW5rIFByaW5kbGUgc3VnZ2VzdGVkIHRoYXQgcmVwbGFjaW5nIHRoaXMgZndyaXRlKCkgYnkgYW4gZmZsdXNoKCkKKyAgZm9sbG93ZWQgYnkgYSB3cml0ZSgpIHdvdWxkIGltcHJvdmUgdGhlIGVmZmljaWVuY3ksIGVzcGVjaWFsbHkgd2hlbgorICB3cml0aW5nIHRvIHN0ZG91dC4gIFN1YnNlcXVlbnQgdGVzdHMgc2hvd2VkIGEgNS1mb2xkIGltcHJvdmVtZW50LgorKi8KKyNpZmRlZiBDT01NRU5UCisgICAgaWYgKHggPSBmd3JpdGUoem91dGJ1ZmZlciwgMSwgem91dGNudCwgZnBbWk9GSUxFXSkpIC4uLgorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmbmRlZiBDS19OT05CTE9DSworICAgIGZmbHVzaChmcFtaT0ZJTEVdKTsKKyNlbmRpZiAvKiBDS19OT05CTE9DSyAqLworICAgIHpwID0gem91dGJ1ZmZlcjsKKyAgICB3aGlsZSAoem91dGNudCA+IDApIHsKKyAgICAgICAgaWYgKCh4ID0gd3JpdGUoZmlsZW5vKGZwW1pPRklMRV0pLHpwLHpvdXRjbnQpKSA+IC0xKSB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGlmIChkZWJsb2cpICAgICAgICAgICAgICAgICAvKiBTYXZlIGEgZnVuY3Rpb24gY2FsbC4uLiAqLworICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6b3V0ZHVtcCB3cm90ZSIsIiIseCk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgICAgIHpvdXRjbnQgLT0geDsgICAgICAgICAgICAgICAvKiBBZGp1c3Qgb3V0cHV0IGJ1ZmZlciBjb3VudCAqLworICAgICAgICAgICAgenAgKz0geDsgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBwb2ludGVyICovCisgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGlmIChkZWJsb2cpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6b3V0ZHVtcCB3cml0ZSBlcnJvciIsIiIsZXJybm8pOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsInpvdXRkdW1wIHdyaXRlIHJldHVybnMiLCIiLHgpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICB6b3V0Y250ID0gMDsgICAgICAgICAgICAgICAgLyogUmVzZXQgb3V0cHV0IGJ1ZmZlciBjb3VudCAqLworICAgICAgICAgICAgcmV0dXJuKC0xKTsgICAgICAgICAgICAgICAgIC8qIHdyaXRlKCkgZmFpbGVkICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisvKiAgQyBIIEsgRiBOICAtLSAgSW50ZXJuYWwgZnVuY3Rpb24gdG8gdmVyaWZ5IGZpbGUgbnVtYmVyIGlzIG9rICAqLworCisvKgorIFJldHVybnM6CisgIC0xOiBGaWxlIG51bWJlciBuIGlzIG91dCBvZiByYW5nZQorICAgMDogbiBpcyBpbiByYW5nZSwgYnV0IGZpbGUgaXMgbm90IG9wZW4KKyAgIDE6IG4gaW4gcmFuZ2UgYW5kIGZpbGUgaXMgb3BlbgorKi8KK2ludAorY2hrZm4obikgaW50IG47IHsKKyAgICAvKiBpZiAobiAhPSBaREZJTEUpIGRlYnVnKEYxMDEsImNoa2ZuIiwiIixuKTsgKi8KKyAgICBpZiAobiA8IDAgfHwgbiA+PSBaTkZJTFMpIHsKKyAgICAgICAgaWYgKG4gIT0gWkRGSUxFKSBkZWJ1ZyhGMTAxLCJjaGtmbiBvdXQgb2YgcmFuZ2UiLCIiLG4pOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGlmIChuICE9IFpERklMRSkgZGVidWcoRjEwMSwiY2hrZm4gZnBbbl0iLCIiLGZwW25dKTsgKi8KKyAgICAgICAgcmV0dXJuKChmcFtuXSA9PSBOVUxMKSA/IDAgOiAxKTsKKyAgICB9Cit9CisKKy8qICBaIEcgRSBUIEYgUyAtLSBSZXR1cm4gZmlsZSBzaXplIHJlZ2FyZGxlc3Mgb2YgYWNjZXNzaWJpbGl0eSAqLworLyoKKyAgVXNlZCBmb3IgZGlyZWN0b3J5IGxpc3RpbmdzLCBldGMuCisgIFJldHVybnM6CisgICAgVGhlIHNpemUgb2YgdGhlIGZpbGUgaW4gYnl0ZXMsIDAgb3IgZ3JlYXRlciwgaWYgdGhlIHNpemUgY2FuIGJlIGxlYXJuZWQuCisgICAgLTEgaWYgdGhlIGZpbGUgc2l6ZSBjYW4gbm90IGJlIG9idGFpbmVkLgorICBBbHNvIChhbmQgdGhpcyBpcyBhIGhhY2sganVzdCBmb3IgVU5JWCk6CisgICAgSWYgdGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIGEgc3ltYm9saWMgbGluaywKKyAgICB0aGUgZ2xvYmFsIHZhcmlhYmxlIGlzc3ltbGluayBpcyBzZXQgdG8gMSwKKyAgICBhbmQgdGhlIGdsb2JhbCBidWZmZXIgbGlua25hbWVbXSBnZXRzIHRoZSBsaW5rIHZhbHVlLgorICAgIEFuZCBpdCBzZXRzIHpnZnNfZGlyIHRvIDEgaWYgaXQncyBhIGRpcmVjdG9yeSwgb3RoZXJ3aXNlIDAuCisgIFRoaXMgbGV0cyB1cyBhdm9pZCBudW1lcm91cyByZWR1bmRhbnQgY2FsbHMgdG8gc3RhdCgpLgorKi8KK2ludCB6Z2ZzX2xpbmsgPSAwOworaW50IHpnZnNfZGlyID0gMDsKK3RpbWVfdCB6Z2ZzX210aW1lID0gMDsKK3Vuc2lnbmVkIGludCB6Z2ZzX21vZGUgPSAwOworCisjaWZkZWYgQ0tTWU1MSU5LCitjaGFyIGxpbmtuYW1lW0NLTUFYUEFUSCsxXTsKKyNpZm5kZWYgX0lGTE5LCisjZGVmaW5lIF9JRkxOSyAwMTIwMDAwCisjZW5kaWYgLyogX0lGTE5LICovCisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisKK2xvbmcKK3pnZXRmcyhuYW1lKSBjaGFyICpuYW1lOyB7CisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGNoYXIgZm5hbVtDS01BWFBBVEgrNF07CisgICAgbG9uZyBzaXplID0gLTFMOworICAgIGludCB4OworICAgIGludCBuZWVkcmxpbmsgPSAwOworICAgIGNoYXIgKiBzOworCisgICAgaWYgKCFuYW1lKSBuYW1lID0gIiI7CisgICAgaWYgKCEqbmFtZSkgcmV0dXJuKC0xKTsKKworI2lmZGVmIFVOSVgKKyAgICB4ID0gc3RybGVuKG5hbWUpOworICAgIGlmICh4ID09IDkgJiYgIXN0cmNtcChuYW1lLCIvZGV2L251bGwiKSkKKyAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBVTklYICovCisKKyAgICBzID0gbmFtZTsKKyNpZmRlZiBEVElMREUKKyAgICBpZiAoKnMgPT0gJ34nKSB7CisgICAgICAgIHMgPSB0aWxkZV9leHBhbmQocyk7CisgICAgICAgIGlmICghcykgcyA9ICIiOworICAgICAgICBpZiAoISpzKSBzID0gbmFtZTsKKyAgICB9CisjZW5kaWYgLyogRFRJTERFICovCisgICAgeCA9IGNrc3RybmNweShmbmFtLHMsQ0tNQVhQQVRIKTsKKyAgICBzID0gZm5hbTsKKyAgICBkZWJ1ZyhGMTExLCJ6Z2V0ZnMgZm5hbSIscyx4KTsKKyAgICBpZiAoeCA+IDAgJiYgc1t4LTFdID09ICcvJykKKyAgICAgIHNbeC0xXSA9ICdcMCc7CisKKyAgICB6Z2ZzX2RpciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBc3N1bWUgaXQncyBub3QgYSBkaXJlY3RvcnkgKi8KKyAgICB6Z2ZzX2xpbmsgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBBc3N1bWUgaXQncyBub3QgYSBzeW1saW5rICovCisgICAgemdmc19tdGltZSA9IDA7CQkJLyogTm8gdGltZSB5ZXQgKi8KKyAgICB6Z2ZzX21vZGUgPSAwOwkJCS8qIE5vIHBlcm1pc3Npb24gYml0cyB5ZXQgKi8KKworI2lmZGVmIENLU1lNTElOSyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlJ3JlIGRvaW5nIHN5bWxpbmtzPyAqLworI2lmZGVmIFVTRV9MU1RBVCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9LIHRvIHVzZSBsc3RhdCgpPyAqLworICAgIHggPSBsc3RhdChzLCZidWYpOworICAgIGRlYnVnKEYxMDEsIlNUQVQiLCIiLDEpOworICAgIGlmICh4IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXQoKSBmYWlsZWQgKi8KKyAgICAgIHJldHVybigtMSk7CisgICAgaWYgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm93IHNlZSBpZiBpdCdzIGEgc3ltbGluayAqLworI2lmZGVmIFNfSVNMTksKKyAgICAgICAgU19JU0xOSyhidWYuc3RfbW9kZSkKKyNlbHNlCisjaWZkZWYgX0lGTE5LCisgICAgICAgICgoX0lGTVQgJiBidWYuc3RfbW9kZSkgPT0gX0lGTE5LKQorI2VuZGlmIC8qIF9JRkxOSyAqLworI2VuZGlmIC8qIFNfSVNMTksgKi8KKyAgICAgICAgKSB7CisgICAgICAgIHpnZnNfbGluayA9IDE7ICAgICAgICAgICAgICAgICAgLyogSXQncyBhIHN5bWxpbmsgKi8KKyAgICAgICAgbGlua25hbWVbMF0gPSAnXDAnOyAgICAgICAgICAgICAvKiBHZXQgdGhlIG5hbWUgKi8KKyAgICAgICAgeCA9IHJlYWRsaW5rKHMsbGlua25hbWUsQ0tNQVhQQVRIKTsKKyAgICAgICAgZGVidWcoRjEwMSwiemdldGZzIHJlYWRsaW5rIixzLHgpOworICAgICAgICBpZiAoeCA+IC0xICYmIHggPCBDS01BWFBBVEgpIHsgIC8qIEl0J3MgYSBsaW5rICovCisgICAgICAgICAgICBsaW5rbmFtZVt4XSA9ICdcMCc7CisgICAgICAgICAgICBzaXplID0gYnVmLnN0X3NpemU7ICAgICAgICAgLyogUmVtZW1iZXIgc2l6ZSBvZiBsaW5rICovCisgICAgICAgICAgICB4ID0gc3RhdChzLCZidWYpOyAgICAgICAgICAgLyogTm93IHN0YXQgdGhlIGxpbmtlZC10byBmaWxlICovCisJICAgIGRlYnVnKEYxMDEsIlNUQVQiLCIiLDIpOworICAgICAgICAgICAgaWYgKHggPCAwKSAgICAgICAgICAgICAgICAgIC8qIHNvIHdlIGNhbiBzZWUgaWYgaXQncyBhIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmtuYW1lLCIobG9va3VwIGZhaWxlZCkiLENLTUFYUEFUSCk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZSAgLyogIVVTRV9MU1RBVCAqLworICAgIHggPSBzdGF0KHMsJmJ1Zik7ICAgICAgICAgICAgICAgICAgIC8qIE5vIGxzdGF0KCksIHVzZSBzdGF0KCkgaW5zdGVhZCAqLworICAgIGRlYnVnKEYxMDEsIlNUQVQiLCIiLDMpOworICAgIGlmICh4IDwgMCkKKyAgICAgIHJldHVybigtMSk7CisjZW5kaWYgLyogVVNFX0xTVEFUICovCisKKyAgICAvKiBEbyB3ZSBuZWVkIHRvIGNhbGwgcmVhZGxpbmsoKT8gKi8KKworI2lmZGVmIE5PTElOS0JJVFMKKy8qCisgIGxzdGF0KCkgZG9lcyBub3Qgd29yayBpbiBTQ08gb3BlcmF0aW5nIHN5c3RlbXMuICBGcm9tICJtYW4gTlMgbHN0YXQiOgorCisgIGxzdGF0IG9idGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGUgbmFtZWQgYnkgcGF0aC4gSW4gdGhlIGNhc2Ugb2YgYQorICBzeW1ib2xpYyBsaW5rLCBsc3RhdCByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsaW5rLCBhbmQgbm90IHRoZSBmaWxlCisgIG5hbWVkIGJ5IHRoZSBsaW5rLiBJdCBpcyBvbmx5IHVzZWQgYnkgdGhlIE5GUyBhdXRvbW91bnQgZGFlbW9uIGFuZCBzaG91bGQKKyAgbm90IGJlIHV0aWxpemVkIGJ5IHVzZXJzLgorKi8KKyAgICBuZWVkcmxpbmsgPSAxOworICAgIGRlYnVnKEYxMDEsInpnZXRmcyBmb3JjZWQgbmVlZHJsaW5rIiwiIixuZWVkcmxpbmspOworI2Vsc2UKKyNpZmRlZiBTX0lTTE5LCisgICAgbmVlZHJsaW5rID0gU19JU0xOSyhidWYuc3RfbW9kZSk7CisgICAgZGVidWcoRjEwMSwiemdldGZzIFNfSVNMTksgbmVlZHJsaW5rIiwiIixuZWVkcmxpbmspOworI2Vsc2UKKyNpZmRlZiBfSUZMTksKKyAgICBuZWVkcmxpbmsgPSAoX0lGTVQgJiBidWYuc3RfbW9kZSkgPT0gX0lGTE5LOworICAgIGRlYnVnKEYxMDEsInpnZXRmcyBfSUZMTksgbmVlZHJsaW5rIiwiIixuZWVkcmxpbmspOworI2Vsc2UKKyAgICBuZWVkcmxpbmsgPSAxOworICAgIGRlYnVnKEYxMDEsInpnZXRmcyBkZWZhdWx0IG5lZWRybGluayIsIiIsbmVlZHJsaW5rKTsKKyNlbmRpZiAvKiBfSUZMTksgKi8KKyNlbmRpZiAvKiBTX0lTTE5LICovCisjZW5kaWYgLyogTk9MSU5LQklUUyAqLworCisgICAgaWYgKG5lZWRybGluaykgeworICAgICAgICBsaW5rbmFtZVswXSA9ICdcMCc7CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgeCA9IHJlYWRsaW5rKHMsbGlua25hbWUsQ0tNQVhQQVRIKTsKKyNpZmRlZiBERUJVRworICAgICAgICBkZWJ1ZyhGMTExLCJ6Z2V0ZnMgcmVhZGxpbmsiLHMseCk7CisgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6Z2V0ZnMgcmVhZGxpbmsgZXJybm8iLCIiLGVycm5vKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGRlYnVnKEYxMTAsInpnZXRmcyByZWFkbGluayByZXN1bHQiLGxpbmtuYW1lLDApOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgIGlmICh4ID4gLTEgJiYgeCA8IENLTUFYUEFUSCkgeworICAgICAgICAgICAgemdmc19saW5rID0gMTsKKyAgICAgICAgICAgIGxpbmtuYW1lW3hdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlICAvKiAhQ0tTWU1MSU5LICovCisgICAgeCA9IHN0YXQocywmYnVmKTsgICAgICAgICAgICAgICAgICAgLyogSnVzdCBzdGF0IHRoZSBmaWxlICovCisgICAgZGVidWcoRjExMSwiemdldGZzIHN0YXQiLHMseCk7CisgICAgaWYgKHggPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIGdldCB0aGUgc2l6ZSAqLworICAgICAgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKworICAgIHpnZnNfbXRpbWUgPSBidWYuc3RfbXRpbWU7CisgICAgemdmc19tb2RlID0gYnVmLnN0X21vZGU7CisgICAgemdmc19kaXIgPSAoU19JU0RJUihidWYuc3RfbW9kZSkpID8gMSA6IDA7IC8qIFNldCAiaXMgZGlyZWN0b3J5IiBmbGFnICovCisgICAgZGVidWcoRjExMSwiemdldGZzIHNpemUiLHMsc2l6ZSk7CisgICAgZGVidWcoRjExMSwiemdldGZzIHN0X3NpemUiLHMsYnVmLnN0X3NpemUpOworICAgIHJldHVybigoc2l6ZSA8IDBMKSA/IGJ1Zi5zdF9zaXplIDogc2l6ZSk7IC8qIFJldHVybiB0aGUgc2l6ZSAqLworfQorCisKKy8qICBaIEMgSCBLIEkgIC0tICBDaGVjayBpZiBpbnB1dCBmaWxlIGV4aXN0cyBhbmQgaXMgcmVhZGFibGUgICovCisKKy8qCisgIFJldHVybnM6CisgICA+PSAwIGlmIHRoZSBmaWxlIGNhbiBiZSByZWFkIChyZXR1cm5zIHRoZSBzaXplKS4KKyAgICAgLTEgaWYgZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIGFjY2Vzc2VkLAorICAgICAtMiBpZiBmaWxlIGV4aXN0cyBidXQgaXMgbm90IHJlYWRhYmxlIChlLmcuIGEgZGlyZWN0b3J5IGZpbGUpLgorICAgICAtMyBpZiBmaWxlIGV4aXN0cyBidXQgcHJvdGVjdGVkIGFnYWluc3QgcmVhZCBhY2Nlc3MuCisKKyAgRm9yIEJlcmtlbGV5IFVuaXgsIGEgZmlsZSBtdXN0IGJlIG9mIHR5cGUgInJlZ3VsYXIiIHRvIGJlIHJlYWRhYmxlLgorICBEaXJlY3RvcnkgZmlsZXMsIHNwZWNpYWwgZmlsZXMsIGFuZCBzeW1ib2xpYyBsaW5rcyBhcmUgbm90IHJlYWRhYmxlLgorKi8KK2xvbmcKK3pjaGtpKG5hbWUpIGNoYXIgKm5hbWU7IHsKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgY2hhciAqIHM7CisgICAgaW50IHgsIGl0c2FkaXIgPSAwOworICAgIGV4dGVybiBpbnQgemNoa2lkLCBkaXJhY3RpdmUsIG1hdGNoZmlmbzsKKworICAgIGlmICghbmFtZSkKKyAgICAgIHJldHVybigtMSk7CisgICAgeCA9IHN0cmxlbihuYW1lKTsKKyAgICBpZiAoeCA8IDEpCisgICAgICByZXR1cm4oLTEpOworICAgIHMgPSBuYW1lOworCisjaWZkZWYgVU5JWAorICAgIGlmICh4ID09IDkgJiYgIXN0cmNtcChzLCIvZGV2L251bGwiKSkKKyAgICAgIHJldHVybigwKTsKKyAgICBpZiAoeCA9PSA4ICYmICFzdHJjbXAocywiL2Rldi90dHkiKSkKKyAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBVTklYICovCisKKyNpZmRlZiBEVElMREUKKyAgICBpZiAoKnMgPT0gJ34nKSB7CisgICAgICAgIHMgPSB0aWxkZV9leHBhbmQocyk7CisgICAgICAgIGlmICghcykgcyA9ICIiOworICAgICAgICBpZiAoISpzKSBzID0gbmFtZTsKKyAgICB9CisjZW5kaWYgLyogRFRJTERFICovCisKKyNpZmRlZiBDS1JPT1QKKyAgICBkZWJ1ZyhGMTExLCJ6Y2hraSBzZXRyb290Iixja3Jvb3QsY2tyb290c2V0KTsKKyAgICBpZiAoY2tyb290c2V0KSBpZiAoIXppbnJvb3QobmFtZSkpIHsKKwlkZWJ1ZyhGMTEwLCJ6Y2hraSBzZXRyb290IHZpb2xhdGlvbiIsbmFtZSwwKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworICAgIHggPSBzdGF0KHMsJmJ1Zik7CisgICAgZGVidWcoRjEwMSwiU1RBVCIsIiIsNSk7CisgICAgaWYgKHggPCAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsInpjaGtpIHN0YXQgZmFpbHMiLHMsZXJybm8pOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBpZiAoU19JU0RJUiAoYnVmLnN0X21vZGUpKQorICAgICAgaXRzYWRpciA9IDE7CisKKyAgICBpZiAoIShpdHNhZGlyICYmIHpjaGtpZCkpIHsgICAgICAgICAvKiBVbmxlc3MgdGhpcy4uLiAqLworICAgICAgICBpZiAoIVNfSVNSRUcgKGJ1Zi5zdF9tb2RlKSAgICAgIC8qIE11c3QgYmUgcmVndWxhciBmaWxlICovCisjaWZkZWYgU19JU0ZJRk8KKyAgICAgICAgICAgICYmICghbWF0Y2hmaWZvIHx8ICFTX0lTRklGTyAoYnVmLnN0X21vZGUpKSAgLyogb3IgRklGTyAqLworI2VuZGlmIC8qIFNfSVNGSUZPICovCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsInpjaGtpIG5vdCByZWd1bGFyIGZpbGUgKG9yIGZpZm8pIixzLG1hdGNoZmlmbyk7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgfQorICAgIGRlYnVnKEYxMTEsInpjaGtpIHN0YXQgb2s6IixzLHgpOworCisgICAgaWYgKGRpcmFjdGl2ZSkgewkJCS8qIElmIGxpc3RpbmcgZG9uJ3QgY2hlY2sgYWNjZXNzICovCisJeCA9IDE7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBTV19BQ0NfSUQKKwlkZWJ1ZyhGMTAwLCJ6Y2hraSBzd2FwcGluZyBpZHMgZm9yIGFjY2VzcygpIiwiIiwwKTsKKwlwcml2X29uKCk7CisjZW5kaWYgLyogU1dfQUNDX0lEICovCisJaWYgKCh4ID0gYWNjZXNzKHMsUl9PSykpIDwgMCkKKwkgIHggPSBhY2Nlc3MocyxYX09LKTsJCS8qIEZvciBSVU4tY2xhc3MgY29tbWFuZHMgKi8KKyNpZmRlZiBTV19BQ0NfSUQKKwlwcml2X29mZigpOworCWRlYnVnKEYxMDAsInpjaGtpIHN3YXBwZWQgaWRzIHJlc3RvcmVkIiwiIiwwKTsKKyNlbmRpZiAvKiBTV19BQ0NfSUQgKi8KKyAgICB9CisgICAgaWYgKHggPCAwKSB7CQkJLyogSXMgdGhlIGZpbGUgYWNjZXNzaWJsZT8gKi8KKyAgICAgICAgZGVidWcoRjExMSwiemNoa2kgYWNjZXNzIGZhaWxlZDoiLHMseCk7IC8qIE5vICovCisgICAgICAgIHJldHVybigtMyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWZsZW4gPSBidWYuc3Rfc2l6ZTsgICAgICAgICAgICAvKiBZZXMsIHJlbWVtYmVyIHNpemUgKi8KKyAgICAgICAgY2tzdHJuY3B5KG5hbWJ1ZixzLENLTUFYUEFUSCk7ICAvKiBhbmQgbmFtZSBnbG9iYWxseS4gKi8KKyAgICAgICAgZGVidWcoRjExMSwiemNoa2kgYWNjZXNzIG9rOiIscyxpZmxlbik7CisgICAgICAgIHJldHVybigoaWZsZW4gPiAtMUwpID8gaWZsZW4gOiAwTCk7CisgICAgfQorfQorCisvKiAgWiBDIEggSyBPICAtLSAgQ2hlY2sgaWYgb3V0cHV0IGZpbGUgY2FuIGJlIGNyZWF0ZWQgICovCisKKy8qCisgIFJldHVybnMgLTEgaWYgd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGZpbGUgd291bGQgYmUgZGVuaWVkLCAwIG90aGVyd2lzZS4KKworICBOT1RFOiBUaGUgZGVzaWduIGlzIGZsYXdlZC4gIFRoZXJlIGlzIG5vIGRpc3RpbmN0aW9uIGFtb25nOgorICAgLiBDYW4gSSBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZT8KKyAgIC4gQ2FuIEkgY3JlYXRlIGEgZmlsZSAob3IgZGlyZWN0b3J5KSBpbiBhbiBleGlzdGluZyBkaXJlY3Rvcnk/CisgICAuIENhbiBJIGNyZWF0ZSBhIGZpbGUgKG9yIGRpcmVjdG9yeSkgYW5kIGl0cyBwYXJlbnQocyk/CisqLworaW50Cit6Y2hrbyhuYW1lKSBjaGFyICpuYW1lOyB7CisgICAgaW50IGksIHgsIGl0c2FkaXIgPSAwOworICAgIGNoYXIgKnM7CisgICAgY2hhciAqIG9uYW1lOworICAgIGV4dGVybiBpbnQgemNoa29kOyAgICAgICAgICAgICAgICAgIC8qIFVzZWQgYnkgSUYgV1JJVEVBQkxFICovCisKKyAgICBkZWJ1ZyhGMTEwLCJ6Y2hrbyBlbnRyeSIsbmFtZSwwKTsKKworICAgIGlmICghbmFtZSkgcmV0dXJuKC0xKTsgICAgICAgICAgICAgIC8qIFdhdGNoIG91dCBmb3IgbnVsbCBwb2ludGVyLiAqLworCisgICAgb25hbWUgPSBuYW1lOworCisjaWZkZWYgQ0tST09UCisgICAgZGVidWcoRjExMSwiemNoa28gc2V0cm9vdCIsY2tyb290LGNrcm9vdHNldCk7CisgICAgaWYgKGNrcm9vdHNldCkgaWYgKCF6aW5yb290KG5hbWUpKSB7CisJZGVidWcoRjExMCwiemNoa28gc2V0cm9vdCB2aW9sYXRpb24iLG5hbWUsMCk7CisJZXJybm8gPSBFQUNDRVM7CisJcmV0dXJuKC0xKTsKKyAgICB9CisjZW5kaWYgLyogQ0tST09UICovCisKKyAgICB4ID0gKGludClzdHJsZW4obmFtZSk7ICAgICAgICAgICAgICAvKiBHZXQgbGVuZ3RoIG9mIGZpbGVuYW1lICovCisgICAgZGVidWcoRjExMSwiemNoa28gbGVuIixuYW1lLHgpOworICAgIGRlYnVnKEYxMTEsInpjaGtvIHpjaGtvZCIsbmFtZSx6Y2hrb2QpOworCisjaWZkZWYgVU5JWAorLyoKKyAgV3JpdGluZyB0byBudWxsIGRldmljZSBpcyBPSy4KKyovCisgICAgaWYgKHggPT0gOSAmJiAhc3RyY21wKG5hbWUsIi9kZXYvbnVsbCIpKQorICAgICAgcmV0dXJuKDApOworICAgIGlmICh4ID09IDggJiYgIXN0cmNtcChuYW1lLCIvZGV2L3R0eSIpKQorICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIFVOSVggKi8KKworICAgIHMgPSBuYW1lOworI2lmZGVmIERUSUxERQorICAgIGlmICgqcyA9PSAnficpIHsKKyAgICAgICAgcyA9IHRpbGRlX2V4cGFuZChzKTsKKyAgICAgICAgaWYgKCFzKSBzID0gIiI7CisgICAgICAgIGlmICghKnMpIHMgPSBuYW1lOworCXggPSBzdHJsZW4ocyk7CisgICAgfQorI2VuZGlmIC8qIERUSUxERSAqLworICAgIG5hbWUgPSBzOworICAgIHMgPSBOVUxMOworLyoKKyAgemNoa29kIGlzIGEgZ2xvYmFsIGZsYWcgbWVhbmluZyB3ZSdyZSBjaGVja2luZyBub3QgdG8gc2VlIGlmIHRoZSBkaXJlY3RvcnkKKyAgZmlsZSBpcyB3cml0ZWFibGUsIGJ1dCBpZiBpdCdzIE9LIHRvIGNyZWF0ZSBmaWxlcyBJTiB0aGUgZGlyZWN0b3J5LgorKi8KKyAgICBpZiAoIXpjaGtvZCAmJiBpc2RpcihuYW1lKSkgICAgICAgICAvKiBEaXJlY3RvcmllcyBhcmUgbm90IHdyaXRlYWJsZSAqLworICAgICAgcmV0dXJuKC0xKTsKKworICAgIHMgPSBtYWxsb2MoeCszKTsgICAgICAgICAgICAgICAgICAgIC8qIE11c3QgY29weSBiZWNhdXNlIHdlIGNhbid0ICovCisgICAgaWYgKCFzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgaW50byBvdXIgYXJndW1lbnQuICovCisgICAgICAgIGZwcmludGYoc3RkZXJyLCJ6Y2hrbzogTWFsbG9jIGVycm9yIDQ2XG4iKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgY2tzdHJuY3B5KHMsbmFtZSx4KzMpOworCisgICAgZm9yIChpID0geDsgaSA+IDA7IGktLSkgeyAgICAgICAgICAgLyogU3RyaXAgZmlsZW5hbWUgZnJvbSByaWdodC4gKi8KKyAgICAgICAgaWYgKElTRElSU0VQKHNbaS0xXSkpIHsKKyAgICAgICAgICAgIGl0c2FkaXIgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVidWcoRjEwMSwiemNoa28gaSIsIiIsaSk7CisgICAgZGVidWcoRjEwMSwiemNoa28gaXRzYWRpciIsIiIsaXRzYWRpcik7CisKKyNpZmRlZiBDT01NRU5UCisvKiBYL09QRU4gWFBHMy1jb21wbGlhbnQgc3lzdGVtcyBmYWlsIGlmIGFyZ3VtZW50IGVuZHMgd2l0aCAiLyIuLi4gICovCisgICAgaWYgKGkgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgbm8gcGF0aCwgdXNlIGN1cnJlbnQgZGlyZWN0b3J5ICovCisgICAgICBzdHJjcHkocywiLi8iKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdGhlcndpc2UsIHVzZSBnaXZlbiBvbmUuICovCisgICAgICBzW2ldID0gJ1wwJzsKKyNlbHNlCisjaWZkZWYgQ09NTUVOVAorLyoKKyAgVGhlIGZvbGxvd2luZyBkb2VzIG5vdCB3b3JrIGZvciAiZm9vL2JhciIgd2hlcmUgdGhlIGZvbyBkaXJlY3RvcnkgZG9lcworICBub3QgZXhpc3QgZXZlbiB0aG91Z2ggd2UgY291bGQgY3JlYXRlIGl0OiBhY2Nlc3MoImZvby8uIikgZmFpbHMsIGJ1dAorICBhY2Nlc3MoImZvbyIpIHdvcmtzIE9LLgorKi8KKy8qIFNvIG5vdyB3ZSB1c2UgInBhdGgvLiIgaWYgcGF0aCBnaXZlbiwgb3IgIi4iIGlmIG5vIHBhdGggZ2l2ZW4uICovCisgICAgc1tpKytdID0gJy4nOyAgICAgICAgICAgICAgICAgICAgICAgLyogQXBwZW5kICIuIiB0byBwYXRoLiAqLworICAgIHNbaV0gPSAnXDAnOworI2Vsc2UKKy8qIFNvIE5PVyB3ZSBzdHJpcCBwYXRoIHNlZ21lbnRzIGZyb20gdGhlIHJpZ2h0IGFzIGxvbmcgYXMgdGhleSBkb24ndCAqLworLyogZXhpc3QgLS0gd2Ugb25seSBjYWxsIGFjY2VzcygpIGZvciBwYXRoIHNlZ21lbnRzIHRoYXQgKmRvKiBleGlzdC4uICovCisvKiAoQnV0IHRoaXMgaXNuJ3QgcXVpdGUgcmlnaHQgZWl0aGVyIHNpbmNlIG5vdyB6Y2hrbygvZm9vL2Jhci9iYXoveHh4KSAqLworLyogc3VjY2VlZHMgd2hlbiBJIGhhdmUgd3JpdGUgYWNjZXNzIHRvIGZvbyBhbmQgYmFyIGJ1dCBiYXogZG9lc24ndCBleGl0LikgKi8KKworICAgIGlmIChpdHNhZGlyICYmIGkgPiAwKSB7CisgICAgICAgIHNbaS0xXSA9ICdcMCc7CisgICAgICAgIHdoaWxlIChzWzBdICYmICFpc2RpcihzKSkgeworICAgICAgICAgICAgZm9yIChpID0gKGludClzdHJsZW4ocyk7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoSVNESVJTRVAoc1tpLTFdKSkgeworICAgICAgICAgICAgICAgICAgICBzW2ktMV0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICBzWzBdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNbaSsrXSA9ICcuJzsgICAgICAgICAgICAgICAgICAgLyogQXBwZW5kICIuIiB0byBwYXRoLiAqLworICAgICAgICBzW2ldID0gJ1wwJzsKKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIGlmICghc1swXSkKKyAgICAgIGNrc3RybmNweShzLCIuIix4KzMpOworCisjaWZkZWYgU1dfQUNDX0lECisgICAgZGVidWcoRjEwMCwiemNoa28gc3dhcHBpbmcgaWRzIGZvciBhY2Nlc3MoKSIsIiIsMCk7CisgICAgcHJpdl9vbigpOworI2VuZGlmIC8qIFNXX0FDQ19JRCAqLworCisgICAgeCA9IGFjY2VzcyhzLFdfT0spOyAgICAgICAgICAgICAgICAgLyogQ2hlY2sgYWNjZXNzIG9mIHBhdGguICovCisKKyNpZmRlZiBTV19BQ0NfSUQKKyAgICBwcml2X29mZigpOworICAgIGRlYnVnKEYxMDAsInpjaGtvIHN3YXBwZWQgaWRzIHJlc3RvcmVkIiwiIiwwKTsKKyNlbmRpZiAvKiBTV19BQ0NfSUQgKi8KKworICAgIGlmICh4IDwgMCkKKyAgICAgIGRlYnVnKEYxMTEsInpjaGtvIGFjY2VzcyBmYWlsZWQ6IixzLGVycm5vKTsKKyAgICBlbHNlCisgICAgICBkZWJ1ZyhGMTExLCJ6Y2hrbyBhY2Nlc3Mgb2s6IixzLHgpOworICAgIGZyZWUocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgdGVtcG9yYXJ5IHN0b3JhZ2UgKi8KKworICAgIHJldHVybigoeCA8IDApID8gLTEgOiAwKTsgICAgICAgICAgIC8qIGFuZCByZXR1cm4uICovCit9CisKKy8qICBaIEQgRSBMIEUgVCAgLS0gIERlbGV0ZSB0aGUgbmFtZWQgZmlsZS4gICovCisKKy8qIFJldHVybnM6IC0xIG9uIGVycm9yLCAwIG9uIHN1Y2Nlc3MgKi8KKworaW50Cit6ZGVsZXQobmFtZSkgY2hhciAqbmFtZTsgeworICAgIGludCB4OworI2lmZGVmIENLX0xPR0lOCisgICAgaWYgKGlzZ3Vlc3QpCisgICAgICByZXR1cm4oLTEpOworI2VuZGlmIC8qIENLX0xPR0lOICovCisKKyNpZmRlZiBDS1JPT1QKKyAgICBkZWJ1ZyhGMTExLCJ6ZGVsZXQgc2V0cm9vdCIsY2tyb290LGNrcm9vdHNldCk7CisgICAgaWYgKGNrcm9vdHNldCkgaWYgKCF6aW5yb290KG5hbWUpKSB7CisJZGVidWcoRjExMCwiemRlbGV0IHNldHJvb3QgdmlvbGF0aW9uIixuYW1lLDApOworCXJldHVybigtMSk7CisgICAgfQorI2VuZGlmIC8qIENLUk9PVCAqLworCisgICAgeCA9IHVubGluayhuYW1lKTsKKyAgICBkZWJ1ZyhGMTExLCJ6ZGVsZXQiLG5hbWUseCk7CisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX0ZDICYmIGNreGxvZ2dpbmcpIHsKKyAgICAgICAgZnVsbG5hbWVbMF0gPSAnXDAnOworICAgICAgICB6Zm5xZnAobmFtZSxDS01BWFBBVEgsZnVsbG5hbWUpOworICAgICAgICBkZWJ1ZyhGMTEwLCJ6ZGVsZXQgZnVsbG5hbWUiLGZ1bGxuYW1lLDApOworICAgICAgICBpZiAoeCA8IDApCisgICAgICAgICAgc3lzbG9nKExPR19JTkZPLCAiZmlsZVtdICVzOiBkZWxldGUgZmFpbGVkICglbSkiLCBmdWxsbmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzeXNsb2coTE9HX0lORk8sICJmaWxlW10gJXM6IGRlbGV0ZSBvayIsIGZ1bGxuYW1lKTsKKyAgICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyAgICByZXR1cm4oeCk7Cit9CisKKy8qICBaIFIgVCBPIEwgIC0tICBDb252ZXJ0IHJlbW90ZSBmaWxlbmFtZSBpbnRvIGxvY2FsIGZvcm0gICovCisKK1ZPSUQKK3pydG9sKG5hbWUsbmFtZTIpIGNoYXIgKm5hbWUsICpuYW1lMjsgeworICAgIG56cnRvbChuYW1lLG5hbWUyLDEsMCxDS01BWFBBVEgpOworfQorCitWT0lECituenJ0b2wobmFtZSxuYW1lMixmbmNudixmbnJwYXRoLG1heCkKKyAgICBjaGFyICpuYW1lLCAqbmFtZTI7IGludCBmbmNudiwgZm5ycGF0aCwgbWF4OworeyAvKiBuenJ0b2wgKi8KKyAgICBjaGFyICpzLCAqcDsKKyAgICBpbnQgZmxhZyA9IDAsIG4gPSAwOworICAgIGNoYXIgZnVsbG5hbWVbQ0tNQVhQQVRIKzFdOworICAgIGludCBkZXZudWxsID0gMDsKKyAgICBpbnQgYWNhc2UgPSAwOworICAgIGlmICghbmFtZTIpIHJldHVybjsKKyAgICBpZiAoIW5hbWUpIG5hbWUgPSAiIjsKKworICAgIGRlYnVnKEYxMTEsIm56cnRvbCBuYW1lIixuYW1lLGZuY252KTsKKworI2lmZGVmIERUSUxERQorICAgIHMgPSBuYW1lOworICAgIGlmICgqcyA9PSAnficpIHsKKyAgICAgICAgcyA9IHRpbGRlX2V4cGFuZChzKTsKKyAgICAgICAgaWYgKCFzKSBzID0gIiI7CisgICAgICAgIGlmICgqcykgbmFtZSA9IHM7CisgICAgfQorI2VuZGlmIC8qIERUSUxERSAqLworCisgICAgLyogSGFuZGxlIHRoZSBwYXRoIC0tIHdlIGRvbid0IGhhdmUgdG8gY29udmVydCBpdHMgZm9ybWF0LCBzaW5jZSAqLworICAgIC8qIHRoZSBzdGFuZGFyZCBwYXRoIGZvcm1hdCBhbmQgb3VyIChVTklYKSBmb3JtYXQgYXJlIHRoZSBzYW1lLiAqLworCisgICAgZnVsbG5hbWVbMF0gPSBOVUw7CisgICAgZGV2bnVsbCA9ICFzdHJjbXAobmFtZSwiL2Rldi9udWxsIik7CisKKyAgICBpZiAoIWRldm51bGwgJiYgZm5ycGF0aCA9PSBQQVRIX09GRikgeyAvKiBSRUNFSVZFIFBBVEhOQU1FUyBPRkYgKi8KKyAgICAgICAgenN0cmlwKG5hbWUsJnApOworICAgICAgICBzdHJuY3B5KGZ1bGxuYW1lLHAsQ0tNQVhQQVRIKTsKKyAgICB9IGVsc2UgaWYgKCFkZXZudWxsICYmIGZucnBhdGggPT0gUEFUSF9BQlMpIHsgLyogUkVDIFBBVEhOQU1FUyBBQlNPTFVURSAqLworICAgICAgICBzdHJuY3B5KGZ1bGxuYW1lLG5hbWUsQ0tNQVhQQVRIKTsKKyAgICB9IGVsc2UgaWYgKCFkZXZudWxsICYmIGlzYWJzb2x1dGUobmFtZSkpIHsgLyogUkVDRUlWRSBQQVRITkFNRVMgUkVMQVRJVkUgKi8KKwlja21ha21zZyhmdWxsbmFtZSxDS01BWFBBVEgsIi4iLG5hbWUsTlVMTCxOVUxMKTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXR0byAqLworICAgICAgICBja3N0cm5jcHkoZnVsbG5hbWUsbmFtZSxDS01BWFBBVEgpOworICAgIH0KKyAgICBmdWxsbmFtZVtDS01BWFBBVEhdID0gTlVMOworICAgIGRlYnVnKEYxMTAsIm56cnRvbCBmdWxsbmFtZSIsZnVsbG5hbWUsMCk7CisKKyNpZm5kZWYgTk9UUlVOQ0FURQorLyoKKyAgVGhlIG1heGltdW0gbGVuZ3RoIGZvciBhbnkgc2VnbWVudCBvZiBhIGZpbGVuYW1lIGlzIE1BWE5BTUxFTiwgZGVmaW5lZAorICBhYm92ZS4gIE9uIHNvbWUgcGxhdGZvcm1zIChhdCBsZWFzdCBRTlgpIGlmIGEgc2VnbWVudCBleGNlZWRzIHRoaXMgbGltaXQsCisgIHRoZSBvcGVuIGZhaWxzIHdpdGggRU5BTUVUT09MT05HLCBzbyB3ZSBtdXN0IHByZXZlbnQgaXQgYnkgdHJ1bmNhdGluZyBlYWNoCisgIG92ZXJsb25nIG5hbWUgc2VnbWVudCB0byB0aGUgbWF4aW11bSBzZWdtZW50IGxlbmd0aCBiZWZvcmUgcGFzc2luZyB0aGUKKyAgbmFtZSB0byBvcGVuKCkuICBUaGlzIG11c3QgYmUgZG9uZSBldmVuIHdoZW4gZmlsZSBuYW1lcyBhcmUgbGl0ZXJhbCwgc28gYXMKKyAgbm90IHRvIGhhbHQgYSBmaWxlIHRyYW5zZmVyIHVubmVjZXNzYXJpbHkuCisqLworICAgIHsKKyAgICAgICAgY2hhciBidWZbQ0tNQVhQQVRIKzFdOyAgICAgICAgICAvKiBOZXcgdGVtcG9yYXJ5IGJ1ZmZlciBvbiBzdGFjayAqLworICAgICAgICBjaGFyICpwID0gZnVsbG5hbWU7ICAgICAgICAgICAgIC8qIFNvdXJjZSBhbmQgICovCisgICAgICAgIGNoYXIgKnMgPSBidWY7ICAgICAgICAgICAgICAgICAgLyogZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KKyAgICAgICAgaW50IGkgPSAwLCBuID0gMDsKKyAgICAgICAgZGVidWcoRjEwMSwibnpydG9sIHNpemluZyBNQVhOQU1MRU4iLCIiLE1BWE5BTUxFTik7CisgICAgICAgIHdoaWxlICgqcCAmJiBuIDwgQ0tNQVhQQVRIKSB7ICAgLyogQ29weSBuYW1lIHRvIG5ldyBidWZmZXIgKi8KKyAgICAgICAgICAgIGlmICgrK2kgPiBNQVhOQU1MRU4pIHsgICAgICAvKiBJZiB0aGlzIHNlZ21lbnQgdG9vIGxvbmcgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoKnAgJiYgKnAgIT0gJy8nKSAvKiBza2lwIHBhc3QgdGhlIHJlc3QuLi4gKi8KKyAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICBpID0gMDsgICAgICAgICAgICAgICAgICAvKiBhbmQgcmVzZXQgY291bnRlci4gKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKnAgPT0gJy8nKSB7ICAgICAvKiBFbmQgb2YgdGhpcyBzZWdtZW50LiAqLworICAgICAgICAgICAgICAgIGkgPSAwOyAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGNvdW50ZXIuICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcysrID0gKnArKzsgICAgICAgICAgICAgICAgLyogQ29weSB0aGlzIGNoYXJhY3Rlci4gKi8KKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgICAgICAqcyA9IE5VTDsKKyAgICAgICAgY2tzdHJuY3B5KGZ1bGxuYW1lLGJ1ZixDS01BWFBBVEgpOyAvKiBDb3B5IGJhY2sgdG8gb3JpZ2luYWwgYnVmZmVyLiAqLworICAgICAgICBkZWJ1ZyhGMTExLCJuenJ0b2wgc2l6aW5nIixmdWxsbmFtZSxuKTsKKyAgICB9CisjZW5kaWYgLyogTk9UUlVOQ0FURSAqLworCisgICAgaWYgKCFmbmNudiB8fCBkZXZudWxsKSB7ICAgICAgICAgICAgLyogTm90IGNvbnZlcnRpbmcgKi8KKyAgICAgICAgY2tzdHJuY3B5KG5hbWUyLGZ1bGxuYW1lLG1heCk7ICAvKiBXZSdyZSBkb25lLiAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG5hbWUgPSBmdWxsbmFtZTsgICAgICAgICAgICAgICAgICAgIC8qIENvbnZlcnRpbmcgKi8KKworICAgIHAgPSBuYW1lMjsKKyAgICBmb3IgKDsgKm5hbWUgIT0gJ1wwJyAmJiBuIDwgbWF4bmFtOyBuYW1lKyspIHsKKyAgICAgICAgaWYgKCpuYW1lID4gU1ApIGZsYWcgPSAxOyAgICAgICAvKiBTdHJpcCBsZWFkaW5nIGJsYW5rcyBhbmQgY29udHJvbHMgKi8KKyAgICAgICAgaWYgKGZsYWcgPT0gMCAmJiAqbmFtZSA8ICchJykKKyAgICAgICAgICBjb250aW51ZTsKKwlpZiAoZm5jbnYgPiAwKSB7CisJICAgIGlmICgqbmFtZSA9PSBTUCkgeworCQkqcCsrID0gJ18nOworCQluKys7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGlmIChpc3VwcGVyKCpuYW1lKSkJCS8qIENoZWNrIGZvciBtaXhlZCBjYXNlICovCisJICAgICAgYWNhc2UgfD0gMTsKKwkgICAgZWxzZSBpZiAoaXNsb3dlcigqbmFtZSkpCisJICAgICAgYWNhc2UgfD0gMjsKKwl9CisgICAgICAgICpwKysgPSAqbmFtZTsKKyAgICAgICAgbisrOworICAgIH0KKyAgICAqcC0tID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hdGUgKi8KKyAgICB3aGlsZSAoKnAgPCAnIScgJiYgcCA+IG5hbWUyKSAgICAgICAvKiBTdHJpcCB0cmFpbGluZyBibGFua3MgJiBjb250cm9scyAqLworICAgICAgKnAtLSA9ICdcMCc7CisKKyAgICBpZiAoKm5hbWUyID09ICdcMCcpIHsgICAgICAgICAgICAgICAvKiBOb3RoaW5nIGxlZnQ/ICovCisgICAgICAgIGNrc3RybmNweShuYW1lMiwiTk9OQU1FIixtYXgpOwkvKiBkbyB0aGlzLi4uICovCisgICAgfSBlbHNlIGlmIChhY2FzZSA9PSAxKSB7ICAgICAgICAgICAgLyogQWxsIHVwcGVyY2FzZT8gKi8KKyAgICAgICAgcCA9IG5hbWUyOyAgICAgICAgICAgICAgICAgICAgICAvKiBTbyBjb252ZXJ0IGFsbCBsZXR0ZXJzIHRvIGxvd2VyICovCisgICAgICAgIHdoaWxlICgqcCkgeworICAgICAgICAgICAgaWYgKGlzdXBwZXIoKnApKQorICAgICAgICAgICAgICAqcCA9IHRvbG93ZXIoKnApOworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgfQorICAgIGRlYnVnKEYxMTAsIm56cnRvbCBuZXcgbmFtZSIsbmFtZTIsMCk7Cit9CisKKworLyogIFogUyBUIFIgSSBQICAtLSAgU3RyaXAgZGV2aWNlICYgZGlyZWN0b3J5IG5hbWUgZnJvbSBmaWxlIHNwZWNpZmljYXRpb24gKi8KKworLyogIFN0cmlwIHBhdGhuYW1lIGZyb20gZmlsZW5hbWUgIm5hbWUiLCByZXR1cm4gcG9pbnRlciB0byByZXN1bHQgaW4gbmFtZTIgKi8KKworc3RhdGljIGNoYXIgd29ya1tDS01BWFBBVEgrMV07CisKK1ZPSUQKK3pzdHJpcChuYW1lLG5hbWUyKSBjaGFyICpuYW1lLCAqKm5hbWUyOyB7CisgICAgY2hhciAqY3AsICpwcDsKKyAgICBpbnQgbiA9IDA7CisKKyAgICBkZWJ1ZyhGMTEwLCJ6c3RyaXAgYmVmb3JlIixuYW1lLDApOworICAgIGlmICghbmFtZSkgeyAqbmFtZTIgPSAiIjsgcmV0dXJuOyB9CisgICAgcHAgPSB3b3JrOworI2lmZGVmIERUSUxERQorICAgIC8qIFN0cmlwIGxlYWRpbmcgdGlsZGUgKi8KKyAgICBpZiAoKm5hbWUgPT0gJ34nKSBuYW1lKys7CisgICAgZGVidWcoRjExMCwienN0cmlwIGFmdGVyIHRpbGRlLXN0cmlwcGluZyIsbmFtZSwwKTsKKyNlbmRpZiAvKiBEVElMREUgKi8KKyAgICBmb3IgKGNwID0gbmFtZTsgKmNwOyBjcCsrKSB7CisgICAgICAgIGlmIChJU0RJUlNFUCgqY3ApKSB7CisgICAgICAgICAgICBwcCA9IHdvcms7CisgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwcCsrID0gKmNwOworICAgICAgICAgICAgaWYgKG4rKyA+PSBDS01BWFBBVEgpCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgICpwcCA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisgICAgKm5hbWUyID0gd29yazsKKyAgICBkZWJ1ZyhGMTEwLCJ6c3RyaXAgYWZ0ZXIiLCpuYW1lMiwwKTsKK30KKworLyogIFogTCBUIE8gUiAgLS0gIExvY2FsIFRPIFJlbW90ZSAqLworCitWT0lECit6bHRvcihuYW1lLG5hbWUyKSBjaGFyICpuYW1lLCAqbmFtZTI7IHsKKyAgICBuemx0b3IobmFtZSxuYW1lMiwxLDAsQ0tNQVhQQVRIKTsKK30KKworLyogIE4gWiBMIFQgTyBSICAtLSAgTmV3IExvY2FsIFRPIFJlbW90ZSAqLworCisvKgorICBmbmNudiA9IDAgZm9yIG5vIGNvbnZlcnNpb24sID4gMCBmb3IgcmVndWxhciBjb252ZXJzaW9uLCA8IDAgZm9yIG1pbmltYWwuCisqLworVk9JRAorbnpsdG9yKG5hbWUsbmFtZTIsZm5jbnYsZm5zcGF0aCxtYXgpCisgICAgY2hhciAqbmFtZSwgKm5hbWUyOyBpbnQgZm5jbnYsIGZuc3BhdGgsIG1heDsKK3sgLyogbnpsdG9yICovCisgICAgY2hhciAqY3AsICpwcDsKKyNpZmRlZiBDT01NRU5UCisgICAgaW50IGRjID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgaW50IG4gPSAwOworICAgIGNoYXIgKmRvdHAgPSBOVUxMOworICAgIGNoYXIgKmRpcnAgPSBOVUxMOworICAgIGNoYXIgZnVsbG5hbWVbQ0tNQVhQQVRIKzFdOworICAgIGNoYXIgKnA7CisgICAgQ0hBUiBjOworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICBleHRlcm4gaW50IGZjaGFyc2V0LCAvKiB0Y2hhcnNldCwgKi8gbGFuZ3VhZ2U7CisgICAgaW50IGxhbmdzdjsKKyAgICBfUFJPVE9UWVAgKCBDSEFSICgqc3hvKSwgKENIQVIpICkgPSBOVUxMOyAvKiBUcmFuc2xhdGlvbiBmdW5jdGlvbnMgKi8KKyNpZmRlZiBDS19BTlNJQworICAgIGV4dGVybiBDSEFSICgqeGxzW01BWFRDU0VUUysxXVtNQVhGQ1NFVFMrMV0pKENIQVIpOworI2Vsc2UKKyAgICBleHRlcm4gQ0hBUiAoKnhsc1tNQVhUQ1NFVFMrMV1bTUFYRkNTRVRTKzFdKSgpOworI2VuZGlmIC8qIENLX0FOU0lDICovCisgICAgbGFuZ3N2ID0gbGFuZ3VhZ2U7CisgICAgbGFuZ3VhZ2UgPSBMX1VTQVNDSUk7CisjaWZkZWYgQ09NTUVOVAorICAgIC8qIFByb3BlciB0cmFuc2xhdGlvbiBvZiBmaWxlbmFtZXMgbXVzdCBiZSBkb25lIGVsc2V3aGVyZSAqLworICAgIG4gPSB0Y2hhcnNldCA/IHRjaGFyc2V0IDogVENfVVNBU0NJSTsKKyAgICBzeG8gPSB4bHNbbl1bZmNoYXJzZXRdOworI2Vsc2UKKyAgICBzeG8gPSB4bHNbVENfVVNBU0NJSV1bZmNoYXJzZXRdOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyAgICBkZWJ1ZyhGMTEwLCJuemx0b3IgbmFtZSIsbmFtZSwwKTsKKworICAgIC8qIEhhbmRsZSBwYXRobmFtZSAqLworCisgICAgZnVsbG5hbWVbMF0gPSBOVUw7CisgICAgaWYgKGZuc3BhdGggPT0gUEFUSF9PRkYpIHsgICAgICAgICAgLyogUEFUSE5BTUVTIE9GRiAqLworICAgICAgICB6c3RyaXAobmFtZSwmcCk7CisgICAgICAgIGNrc3RybmNweShmdWxsbmFtZSxwLENLTUFYUEFUSCk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUEFUSE5BTUVTIFJFTEFUSVZFIG9yIEFCU09MVVRFICovCisgICAgICAgIGNoYXIgKiBwID0gbmFtZTsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGlmICghc3RybmNtcChwLCIuLi8iLDMpKQorICAgICAgICAgICAgICBwICs9IDM7CisgICAgICAgICAgICBlbHNlIGlmICghc3RybmNtcChwLCIuLyIsMikpCisgICAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZuc3BhdGggPT0gUEFUSF9BQlMpIHsgICAgICAvKiBBQlNPTFVURSAqLworICAgICAgICAgICAgemZucWZwKHAsQ0tNQVhQQVRILGZ1bGxuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRUxBVElWRSAqLworICAgICAgICAgICAgY2tzdHJuY3B5KGZ1bGxuYW1lLHAsQ0tNQVhQQVRIKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJuemx0b3IgZnVsbG5hbWUiLGZ1bGxuYW1lLDApOworCisgICAgaWYgKCFmbmNudikgeyAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGNvbnZlcnRpbmcgKi8KKyAgICAgICAgY2tzdHJuY3B5KG5hbWUyLGZ1bGxuYW1lLG1heCk7ICAvKiBXZSdyZSBkb25lLiAqLworI2lmbmRlZiBOT0NTRVRTCisgICAgICAgIGxhbmdzdiA9IGxhbmd1YWdlOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBuYW1lID0gZnVsbG5hbWU7ICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0aW5nICovCisKKyNpZmRlZiBhZWdpcworICAgIGNoYXIgKm5hbWVjaGFyczsKKyAgICBpbnQgdGlsZGUgPSAwLCBic2xhc2ggPSAwOworCisgICAgaWYgKChuYW1lY2hhcnMgPSBnZXRlbnYoIk5BTUVDSEFSUyIpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChja3N0cmNocihuYW1lY2hhcnMsICd+JyApICE9IE5VTEwpIHRpbGRlICA9ICd+JzsKKyAgICAgICAgaWYgKGNrc3RyY2hyKG5hbWVjaGFycywgJ1xcJykgIT0gTlVMTCkgYnNsYXNoID0gJ1xcJzsKKyAgICB9IGVsc2UgeworICAgICAgICB0aWxkZSA9ICd+JzsKKyAgICAgICAgYnNsYXNoID0gJ1xcJzsKKyAgICB9CisjZW5kaWYgLyogYWVnaXMgKi8KKworICAgIHBwID0gd29yazsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICBmb3IgKGNwID0gbmFtZSwgbiA9IDA7ICpjcCAmJiBuIDwgbWF4OyBjcCsrLG4rKykgeyAvKiBDb252ZXJ0IG5hbWUgY2hhcnMgKi8KKyAgICAgICAgYyA9ICpjcDsKKyNpZm5kZWYgTk9DU0VUUworICAgICAgICBpZiAoc3hvKSBjID0gKCpzeG8pKGMpOyAgICAgICAgIC8qIENvbnZlcnQgdG8gQVNDSUkgKi8KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgICAgIGlmIChmbmNudiA+IDAgJiYgaXNsb3dlcihjKSkJLyogVXBwZXJjYXNlIGxldHRlcnMgKi8KKyAgICAgICAgICAqcHArKyA9IHRvdXBwZXIoYyk7ICAgICAgICAgICAvKiBDaGFuZ2UgdGlsZGUgdG8gaHlwaGVuICovCisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ34nKQorICAgICAgICAgICpwcCsrID0gJy0nOworICAgICAgICBlbHNlIGlmIChmbmNudiA+IDAgJiYgYyA9PSAnIycpCS8qIENoYW5nZSBudW1iZXIgc2lnbiB0byAnWCcgKi8KKyAgICAgICAgICAqcHArKyA9ICdYJzsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnKicgfHwgYyA9PSAnPycpICAvKiBDaGFuZ2Ugd2lsZGNhcmQgY2hhcnMgdG8gJ1gnICovCisgICAgICAgICAgKnBwKysgPSAnWCc7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJyAnKSAgICAgICAgICAgICAgLyogQ2hhbmdlIHNwYWNlIHRvIHVuZGVyc2NvcmUgKi8KKyAgICAgICAgICAqcHArKyA9ICdfJzsKKyAgICAgICAgZWxzZSBpZiAoYyA8ICcgJykgICAgICAgICAgICAgICAvKiBDaGFuZ2UgY29udHJvbHMgdG8gJ1gnICovCisgICAgICAgICAgKnBwKysgPSAnWCc7CisgICAgICAgIGVsc2UgaWYgKGZuY252ID4gMCAmJiBjID09ICcuJykgeyAvKiBDaGFuZ2UgZG90IHRvIHVuZGVyc2NvcmUgKi8KKyAgICAgICAgICAgIGRvdHAgPSBwcDsgICAgICAgICAgICAgICAgICAvKiBSZW1lbWJlciB3aGVyZSB3ZSBsYXN0IGRpZCB0aGlzICovCisgICAgICAgICAgICAqcHArKyA9ICdfJzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjID09ICcvJykKKyAgICAgICAgICAgICAgZGlycCA9IHBwOworICAgICAgICAgICAgKnBwKysgPSBjOworICAgICAgICB9CisgICAgfQorICAgICpwcCA9IE5VTDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpZSBpdCBvZmYuICovCisjaWZkZWYgQ09NTUVOVAorICAgIGlmIChkb3RwKSAqZG90cCA9ICcuJzsgICAgICAgICAgICAgIC8qIFJlc3RvcmUgbGFzdCBkb3QgKGlmIGFueSkgKi8KKyNlbHNlCisgICAgaWYgKGRvdHAgPiBkaXJwKSAqZG90cCA9ICcuJzsgICAgICAgLyogUmVzdG9yZSBsYXN0IGRvdCBpbiBmaWxlIG5hbWUgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgY3AgPSBuYW1lMjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgbm90aGluZyBiZWZvcmUgZG90LCAqLworICAgIGlmICgqd29yayA9PSAnLicpICpjcCsrID0gJ1gnOyAgICAgIC8qIGluc2VydCAnWCcgKi8KKyAgICBja3N0cm5jcHkoY3Asd29yayxtYXgpOworI2lmbmRlZiBOT0NTRVRTCisgICAgbGFuZ3VhZ2UgPSBsYW5nc3Y7CisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgIGRlYnVnKEYxMTAsIm56bHRvciBuYW1lMiIsbmFtZTIsMCk7Cit9CisKKworLyogIFogQyBIIEQgSSBSICAtLSAgQ2hhbmdlIGRpcmVjdG9yeSAgKi8KKy8qCisgIENhbGwgd2l0aDoKKyAgICBkaXJuYW0gPSBwb2ludGVyIHRvIG5hbWUgb2YgZGlyZWN0b3J5IHRvIGNoYW5nZSB0bywKKyAgICAgIHdoaWNoIG1heSBiZSAiIiBvciBOVUxMIHRvIGluZGljYXRlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KKyAgUmV0dXJuczoKKyAgICAwIG9uIGZhaWx1cmUKKyAgICAxIG9uIHN1Y2Nlc3MKKyovCitpbnQKK3pjaGRpcihkaXJuYW0pIGNoYXIgKmRpcm5hbTsgeworICAgIGNoYXIgKmhkLCAqc3A7CisjaWZkZWYgSUtTREIKKyAgICBfUFJPVE9UWVAgKGludCBzbG90ZGlyLChjaGFyICosY2hhciAqKSk7CisjZW5kaWYgLyogSUtTREIgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICBleHRlcm4gc3RydWN0IG10YWIgKm1hY3RhYjsgICAgICAgICAgICAgLyogTWFpbiBtYWNybyB0YWJsZSAqLworICAgIGV4dGVybiBpbnQgbm1hYzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgbWFjcm9zICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworICAgIGRlYnVnKEYxMTAsInpjaGRpciIsZGlybmFtLDApOworICAgIGlmICghZGlybmFtKSBkaXJuYW0gPSAiIjsKKyAgICBpZiAoISpkaXJuYW0pICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBhcmd1bWVudCBpcyBudWxsIG9yIGVtcHR5LCAqLworICAgICAgZGlybmFtID0gemhvbWUoKTsgICAgICAgICAgICAgICAgIC8qIHVzZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuICovCisgICAgc3AgPSBkaXJuYW07CisgICAgZGVidWcoRjExMCwiemNoZGlyIDIiLGRpcm5hbSwwKTsKKworI2lmZGVmIERUSUxERQorICAgIGhkID0gdGlsZGVfZXhwYW5kKGRpcm5hbSk7ICAgICAgICAgIC8qIEF0dGVtcHQgdG8gZXhwYW5kIHRpbGRlICovCisgICAgaWYgKCFoZCkgaGQgPSAiIjsKKyAgICBpZiAoKmhkID09ICdcMCcpIGhkID0gZGlybmFtOyAgICAgICAvKiBpbiBkaXJlY3RvcnkgbmFtZS4gKi8KKyNlbHNlCisgICAgaGQgPSBkaXJuYW07CisjZW5kaWYgLyogRFRJTERFICovCisgICAgZGVidWcoRjExMCwiemNoZGlyIDMiLGhkLDApOworCisjaWZkZWYgQ0tST09UCisgICAgZGVidWcoRjExMSwiemNoZGlyIHNldHJvb3QiLGNrcm9vdCxja3Jvb3RzZXQpOworICAgIGlmIChja3Jvb3RzZXQpIGlmICghemlucm9vdChoZCkpIHsKKwlkZWJ1ZyhGMTEwLCJ6Y2hkaXIgc2V0cm9vdCB2aW9sYXRpb24iLGhkLDApOworCXJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tST09UICovCisKKyNpZmRlZiBwZHAxMQorICAgIC8qIEp1c3QgdG8gc2F2ZSBzb21lIHNwYWNlICovCisgICAgcmV0dXJuKChjaGRpcihoZCkgPT0gMCkgPyAxIDogMCk7CisjZWxzZQorICAgIGlmIChjaGRpcihoZCkgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgLyogVHJ5IHRvIGNkICovCisjaWZkZWYgSUtTREIKKyNpZmRlZiBDS19MT0dJTgorICAgICAgICBpZiAoaW5zZXJ2ZXIgJiYgaWtkYm9wZW4pCisgICAgICAgICAgc2xvdGRpcihpc2d1ZXN0ID8gYW5vbnJvb3QgOiAiIiwgemd0ZGlyKCkpOworI2VuZGlmIC8qIENLX0xPR0lOICovCisjZW5kaWYgLyogSUtTREIgKi8KKworI2lmbmRlZiBOT1NQTAorICAgICAgICBpZiAobm1hYykgewkJCS8qIEFueSBtYWNyb3MgZGVmaW5lZD8gKi8KKyAgICAgICAgICAgIGludCBrOwkJCS8qIFllcyAqLworICAgICAgICAgICAgc3RhdGljIGludCBvbl9jZCA9IDA7CisgICAgICAgICAgICBpZiAoIW9uX2NkKSB7CisgICAgICAgICAgICAgICAgb25fY2QgPSAxOworICAgICAgICAgICAgICAgIGsgPSBtbG9vayhtYWN0YWIsIm9uX2NkIixubWFjKTsgICAvKiBMb29rIHRoaXMgdXAgKi8KKyAgICAgICAgICAgICAgICBpZiAoayA+PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogSWYgZm91bmQsICovCisgICAgICAgICAgICAgICAgICAgIGlmIChkb2RvKGssemd0ZGlyKCksMCkgPiAtMSkgIC8qIHNldCBpdCB1cCwgKi8KKwkJICAgICAgcGFyc2VyKDEpOyAgICAgICAgICAgICAgICAgIC8qIGFuZCBleGVjdXRlIGl0ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9uX2NkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIHBkcDExICovCit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit6Y2hrcGlkKHVuc2lnbmVkIGxvbmcgeHBpZCkKKyNlbHNlCit6Y2hrcGlkKHhwaWQpIHVuc2lnbmVkIGxvbmcgeHBpZDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIHJldHVybigoa2lsbCgoUElEX1QpeHBpZCwwKSA8IDApID8gMCA6IDEpOworfQorCisKKy8qICBaIEggTyBNIEUgIC0tICBSZXR1cm4gcG9pbnRlciB0byB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgICovCisKK3N0YXRpYyBjaGFyICogemhvbWRpciA9IE5VTEw7CisKK2NoYXIgKgoremhvbWUoKSB7CisgICAgY2hhciAqIGhvbWU7CisKKyNpZmRlZiBDS1JPT1QKKyAgICBpZiAoY2tyb290c2V0KQorICAgICAgcmV0dXJuKChjaGFyICopY2tyb290KTsKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworI2lmZGVmIFBsYW45CisgICAgaG9tZSA9IGdldGVudigiaG9tZSIpOworI2Vsc2UKKyAgICBob21lID0gZ2V0ZW52KCJIT01FIik7CisjZW5kaWYgLyogUGxhbjkgKi8KKyAgICBtYWtlc3RyKCZ6aG9tZGlyLGhvbWUpOworICAgIHJldHVybihob21lID8gemhvbWRpciA6ICIuIik7Cit9CisKKy8qICBaIEcgVCBEIEkgUiAgLS0gIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAgKi8KKworLyoKKyAgVGhlICJwcmVmZXJyZWQiIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBkaXJlY3RvcnkgaW4gbW9kZXJuIFVOSVgKKyAgaXMgZ2V0Y3dkKCkgW1BPU0lYIDEwMDMuMSA1LjIuMl0uICBIb3dldmVyLCBvbiBjZXJ0YWluIHBsYXRmb3JtcyAoc3VjaCBhcworICBTdW5PUyksIGl0IGlzIGltcGxlbWVudGVkIGJ5IGZvcmtpbmcgYSBzaGVsbCwgZmVlZGluZyBpdCB0aGUgcHdkIGNvbW1hbmQsCisgIGFuZCByZXR1cm5pbmcgdGhlIHJlc3VsdCwgd2hpY2ggaXMgbm90IG9ubHkgaW5lZmZpY2llbnQgYnV0IGFsc28gY2FuIHJlc3VsdAorICBpbiBzdHJheSBtZXNzYWdlcyB0byB0aGUgdGVybWluYWwuICBJbiBzdWNoIGNhc2VzIC0tIGFzIHdlbGwgYXMgd2hlbgorICBnZXRjd2QoKSBpcyBub3QgYXZhaWxhYmxlIGF0IGFsbCAtLSBnZXR3ZCgpIGNhbiBiZSB1c2VkIGluc3RlYWQgYnkgZGVmaW5pbmcKKyAgVVNFX0dFVFdELiAgSG93ZXZlciwgbm90ZSB0aGF0IGdldHdkKCkgcHJvdmlkZXMgbm8gYnVmZmVyLWxlbmd0aCBhcmd1bWVudAorICBhbmQgdGhlcmVmb3JlIG5vIHNhZmVndWFyZCBhZ2FpbnN0IG1lbW9yeSBsZWFrcy4KKyovCisjaWZuZGVmIFVTRV9HRVRXRAorI2lmZGVmIEJTRDQyCisjZGVmaW5lIFVTRV9HRVRXRAorI2Vsc2UKKyNpZmRlZiBTVU5PUzQKKyNkZWZpbmUgVVNFX0dFVFdECisjZW5kaWYgLyogU1VOT1M0ICovCisjZW5kaWYgLyogQlNENDIgKi8KKyNlbmRpZiAvKiBVU0VfR0VUV0QgKi8KKworI2lmZGVmIHBkcDExCisjZGVmaW5lIENXREJMIDgwICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSBldmVyeSBieXRlIHdlIGNhbi4uLiAqLworI2Vsc2UKKyNkZWZpbmUgQ1dEQkwgQ0tNQVhQQVRICisjZW5kaWYgLyogcGRwMTEgKi8KK3N0YXRpYyBjaGFyIGN3ZGJ1ZltDV0RCTCsyXTsKKy8qCisgIE5PVEU6IFRoZSBnZXRjd2QoKSBwcm90b3R5cGVzIGFyZSBjb21tZW50ZWQgb3V0IG9uIHB1cnBvc2UuICBJZiB5b3UgZ2V0CisgIGNvbXBpbGUtdGltZSB3YXJuaW5ncywgc2VhcmNoIHRocm91Z2ggeW91ciBzeXN0ZW0ncyBoZWFkZXIgZmlsZXMgdG8gc2VlCisgIHdoaWNoIG9uZSBoYXMgdGhlIG5lZWRlZCBwcm90b3R5cGUsIGFuZCAjaW5jbHVkZSBpdC4gIFVzdWFsbHkgaXQgaXMKKyAgPHVuaXN0ZC5oPi4gIFNlZSB0aGUgc2VjdGlvbiBmb3IgaW5jbHVkaW5nIDx1bmlzdGQuaD4gaW4gY2tjZGViLmggYW5kCisgIG1ha2UgYW55IG5lZWRlZCBhZGp1c3RtZW50cyB0aGVyZSAoYW5kIHJlcG9ydCB0aGVtKS4KKyovCitjaGFyICoKK3pndGRpcigpIHsKKyAgICBjaGFyICogYnVmID0gY3dkYnVmOworICAgIGNoYXIgKiBzOworCisjaWZkZWYgVVNFX0dFVFdECisgICAgZXh0ZXJuIGNoYXIgKmdldHdkKCk7CisgICAgcyA9IGdldHdkKGJ1Zik7CisgICAgZGVidWcoRjExMCwiemd0ZGlyIEJTRDQgZ2V0d2QoKSIscywwKTsKKyAgICBpZiAoIXMpIHMgPSAiLi8iOworICAgIHJldHVybihzKTsKKyNlbHNlCisjaWZkZWYgQlNENDQKKyNpZmRlZiBEQ0xHRVRDV0QKK19QUk9UT1RZUCggY2hhciAqIGdldGN3ZCwgKGNoYXIgKiwgU0laRV9UKSApOworI2VuZGlmIC8qIERDTEdFVENXRCAqLworICAgIGRlYnVnKEYxMDEsInpndGRpciBCU0Q0NCBDV0RCTCIsIiIsQ1dEQkwpOworICAgIHMgPSBnZXRjd2QoYnVmLENXREJMKTsKKyAgICBpZiAoIXMpIHMgPSAiLi8iOworICAgIHJldHVybihzKTsKKyNlbHNlCisjaWZkZWYgTUlOSVgyCisjaWZkZWYgRENMR0VUQ1dECisgICAgX1BST1RPVFlQKCBjaGFyICogZ2V0Y3dkLCAoY2hhciAqLCBTSVpFX1QpICk7CisjZW5kaWYgLyogRENMR0VUQ1dEICovCisgICAgZGVidWcoRjEwMSwiemd0ZGlyIE1JTklYMiBDV0RCTCIsIiIsQ1dEQkwpOworICAgIHMgPSBnZXRjd2QoYnVmLENXREJMKTsKKyAgICBpZiAoIXMpIHMgPSAiLi8iOworICAgIHJldHVybihzKTsKKyNlbHNlCisjaWZkZWYgU1ZPUlBPU0lYCisjaWZkZWYgQ09NTUVOVAorLyogVGhpcyBub24tQU5TSSBwcm90b3R5cGUgY2FuIGJlIGZhdGFsIGF0IHJ1bnRpbWUhIChlLmcuIGluIFNDTzMuMnY1LjAuNSkuICovCisvKiBBbnl3YXkgaXQncyBhbHJlYWR5IHByb3RvdHlwZWQgaW4gc29tZSBoZWFkZXIgZmlsZSB0aGF0IHdlIGhhdmUgaW5jbHVkZWQuICovCisgICAgZXh0ZXJuIGNoYXIgKmdldGN3ZCgpOworI2Vsc2UKKyNpZmRlZiBEQ0xHRVRDV0QKKyAgICBfUFJPVE9UWVAoIGNoYXIgKiBnZXRjd2QsIChjaGFyICosIFNJWkVfVCkgKTsKKyNlbmRpZiAvKiBEQ0xHRVRDV0QgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgZGVidWcoRjEwMSwiemd0ZGlyIFNWT1JQT1NJWCBDV0RCTCIsIiIsQ1dEQkwpOworICAgIHMgPSBnZXRjd2QoYnVmLENXREJMKTsKKyAgICBpZiAoIXMpIHMgPSAiLi8iOworICAgIHJldHVybihzKTsKKyNlbHNlCisjaWZkZWYgQ09IRVJFTlQKKyNpZmRlZiBfSTM4NgorI2lmZGVmIERDTEdFVENXRAorICAgIGV4dGVybiBjaGFyICpnZXRjd2QoKTsKKyNlbmRpZiAvKiBEQ0xHRVRDV0QgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ6Z3RkaXIgQ09IRVJFTlQgX0kzODYgQ1dEQkwiLCIiLENXREJMKTsKKyAgICBzID0gZ2V0Y3dkKGJ1ZixDV0RCTCk7CisgICAgaWYgKCFzKSBzID0gIi4vIjsKKyAgICByZXR1cm4ocyk7CisjZWxzZQorICAgIGV4dGVybiBjaGFyICpnZXR3ZCgpOworICAgIGRlYnVnKEYxMDEsInpndGRpciBDT0hFUkVOVCBDV0RCTCIsIiIsQ1dEQkwpOworICAgIHMgPSBnZXR3ZChidWYpOworICAgIGlmICghcykgcyA9ICIuLyI7CisgICAgcmV0dXJuKHMpOworI2VuZGlmIC8qIF9JMzg2ICovCisjZWxzZQorI2lmZGVmIFNVTk9TNAorICAgIGRlYnVnKEYxMDEsInpndGRpciBTVU5PUyBDV0RCTCIsIiIsQ1dEQkwpOworICAgIHMgPSBnZXRjd2QoYnVmLENXREJMKTsKKyAgICBpZiAoIXMpIHMgPSAiLi8iOworICAgIHJldHVybihzKTsKKyNlbHNlCisgICAgcmV0dXJuKCIuLyIpOworI2VuZGlmIC8qIFNVTk9TNCAqLworI2VuZGlmIC8qIENPSEVSRU5UICovCisjZW5kaWYgLyogU1lTVk9SUE9TSVggKi8KKyNlbmRpZiAvKiBNSU5JWDIgKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworI2VuZGlmIC8qIFVTRV9HRVRXRCAqLworfQorCisvKiAgWiBYIEMgTSBEIC0tIFJ1biBhIHN5c3RlbSBjb21tYW5kIHNvIGl0cyBvdXRwdXQgY2FuIGJlIHJlYWQgbGlrZSBhIGZpbGUgKi8KKworI2lmbmRlZiBOT1BVU0gKK2ludAorenhjbWQoZmlsbnVtLGNvbWFuZCkgaW50IGZpbG51bTsgY2hhciAqY29tYW5kOyB7CisgICAgaW50IG91dDsKKyAgICBpbnQgcGlwZXNbMl07CisgICAgZXh0ZXJuIGludCBrYWN0aXZlOyAgICAgICAgICAgICAgICAgLyogRnJvbSBja2Nwcm8udyBhbmQgY2tjbWFpLmMgKi8KKworICAgIGlmIChub3B1c2gpIHsKKyAgICAgICAgZGVidWcoRjEwMCwienhjbWQgZmFpbHM6IG5vcHVzaCIsIiIsMCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsInp4Y21kIixjb21hbmQsZmlsbnVtKTsKKyAgICBpZiAoY2hrZm4oZmlsbnVtKSA8IDApIHJldHVybigtMSk7ICAvKiBOZWVkIGEgdmFsaWQgS2VybWl0IGZpbGUgbnVtYmVyLiAqLworICAgIGlmIChmaWxudW0gPT0gWlNURElPIHx8IGZpbG51bSA9PSBaQ1RFUk0pIC8qIEJ1dCBub3Qgb25lIG9mIHRoZXNlLiAqLworICAgICAgcmV0dXJuKDApOworCisgICAgb3V0ID0gKGZpbG51bSA9PSBaSUZJTEUgfHwgZmlsbnVtID09IFpSRklMRSkgPyAwIDogMSA7CisgICAgZGVidWcoRjEwMSwienhjbWQgb3V0Iixjb21hbmQsb3V0KTsKKworLyogT3V0cHV0IHRvIGEgY29tbWFuZCAqLworCisgICAgaWYgKG91dCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVlZCBwb3BlbigpIHRvIGRvIHRoaXMuICovCisJY2tzdHJuY3B5KGZ1bGxuYW1lLCIocGlwZSkiLENLTUFYUEFUSCk7CisjaWZkZWYgTk9QT1BFTgorICAgICAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHBvcGVuKCksIGZhaWwuICovCisjZWxzZQorLyogVXNlIHBvcGVuKCkgdG8gcnVuIHRoZSBjb21tYW5kLiAqLworCisjaWZkZWYgX1BPU0lYX1NPVVJDRQorLyogU3RyaWN0bHkgc3BlYWtpbmcsIHBvcGVuKCkgaXMgbm90IGF2YWlsYWJsZSBpbiBQT1NJWC4xICovCisjZGVmaW5lIERDTFBPUEVOCisjZW5kaWYgLyogX1BPU0lYX1NPVVJDRSAqLworCisJZGVidWcoRjExMCwienhjbWQgb3V0Iixjb21hbmQsMCk7CisKKyAgICAgICAgaWYgKHByaXZfY2hrKCkpIHsKKwkgICAgZGVidWcoRjEwMCwienhjbWQgcHJpdl9jaGsgZmFpbGVkIiwiIiwwKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKwl9CQorCWVycm5vID0gMDsKKyAgICAgICAgZnBbZmlsbnVtXSA9IHBvcGVuKGNvbWFuZCwidyIpOworCWRlYnVnKEYxMTEsInp4Y21kIHBvcGVuIixmcFtmaWxudW1dID8gIk9LIiA6ICJGYWlsZWQiLCBlcnJubyk7CisJaWYgKGZwW2ZpbG51bV0gPT0gTlVMTCkKKwkgIHJldHVybigwKTsKKyNpZmRlZiBDT01NRU5UCisvKiBJIHdvbmRlciB3aGF0IHRoaXMgaXMgYWxsIGFib3V0Li4uICovCisJY2xvc2UocGlwZXNbMF0pOwkJLyogRG9uJ3QgbmVlZCB0aGUgaW5wdXQgc2lkZSAqLworCWZwW2ZpbG51bV0gPSBmZG9wZW4ocGlwZXNbMV0sInciKTsgLyogT3BlbiBvdXRwdXQgc3RyZWFtLiAqLworCWZwW1pTWVNGTl0gPSBmcFtmaWxudW1dOyAgICAgICAgICAgLyogUmVtZW1iZXIuICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCWlzcGlwZVtmaWxudW1dID0gMTsKKwl6b3V0Y250ID0gMDsJCQkvKiAoUFdQKSByZXNldCBpbnB1dCBidWZmZXIgKi8KKwl6b3V0cHRyID0gem91dGJ1ZmZlcjsKKwlyZXR1cm4oMSk7CisjZW5kaWYgLyogTk9QT1BFTiAqLworICAgIH0KKworLyogSW5wdXQgZnJvbSBhIGNvbW1hbmQgKi8KKworI2lmZGVmIFNOSTU0MQorICAgIC8qIFNJTklYLUwgNS40MSBkb2VzIG5vdCBsaWtlIGZkb3BlbigpICovCisgICAgcmV0dXJuKDApOworI2Vsc2UKKyAgICBpZiAocGlwZShwaXBlcykgIT0gMCkgeworICAgICAgICBkZWJ1ZyhGMTAwLCJ6eGNtZCBwaXBlIGZhaWx1cmUiLCIiLDApOworICAgICAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbid0IG1ha2UgcGlwZSwgZmFpbCAqLworICAgIH0KKworLyogQ3JlYXRlIGEgZm9yayBpbiB3aGljaCB0byBydW4gdGhlIG5hbWVkIHByb2Nlc3MgKi8KKworICAgIGlmICgoCisjaWZkZWYgYWVnaXMKKyAgICAgICAgIHBpZCA9IHZmb3JrKCkgICAgICAgICAgICAgICAgICAvKiBjaGlsZCAqLworI2Vsc2UKKyAgICAgICAgIHBpZCA9IGZvcmsoKSAgICAgICAgICAgICAgICAgICAvKiBjaGlsZCAqLworI2VuZGlmIC8qIGFlZ2lzICovCisgICAgICAgICApID09IDApIHsKKworLyogV2UncmUgaW4gdGhlIGZvcmsuICovCisKKyAgICAgICAgY2hhciAqc2hwYXRoLCAqc2huYW1lLCAqc2hwdHI7ICAvKiBGaW5kIHVzZXIncyBwcmVmZXJyZWQgc2hlbGwgKi8KKyNpZm5kZWYgYWVnaXMKKyAgICAgICAgc3RydWN0IHBhc3N3ZCAqcDsKKyAgICAgICAgY2hhciAqZGVmc2hlbGw7CisjaWZkZWYgSFBVWDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBzaGVsbCAqLworICAgICAgICBkZWZzaGVsbCA9ICIvdXNyL2Jpbi9zaCI7CisjZWxzZQorI2lmZGVmIFBsYW45CisgICAgICAgIGRlZnNoZWxsID0gIi9iaW4vcmMiOworI2Vsc2UKKyAgICAgICAgZGVmc2hlbGwgPSAiL2Jpbi9zaCI7CisjZW5kaWYgLyogUGxhbjkgKi8KKyNlbmRpZiAvKiBIUFVYMTAgKi8KKyNlbmRpZiAvKiBhZWdpcyAqLworICAgICAgICBpZiAocHJpdl9jYW4oKSkgZXhpdCgxKTsgICAgICAgIC8qIFR1cm4gb2ZmIGFueSBwcml2aWxlZ2VzISAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJ6eGNtZCBwaWQiLCIiLHBpZCk7CisgICAgICAgIGNsb3NlKHBpcGVzWzBdKTsgICAgICAgICAgICAgICAgLyogY2xvc2UgaW5wdXQgc2lkZSBvZiBwaXBlICovCisgICAgICAgIGNsb3NlKDApOyAgICAgICAgICAgICAgICAgICAgICAgLyogY2xvc2Ugc3RkaW4gKi8KKyAgICAgICAgaWYgKG9wZW4oIi9kZXYvbnVsbCIsMCkgPCAwKSByZXR1cm4oMCk7IC8qIHJlcGxhY2UgaW5wdXQgYnkgbnVsbCAqLworI2lmbmRlZiBPWE9TCisjaWZuZGVmIFNWT1JQT1NJWAorICAgICAgICBkdXAyKHBpcGVzWzFdLDEpOyAgICAgICAgICAgICAgIC8qIEJTRDogcmVwbGFjZSBzdGRvdXQgJiBzdGRlcnIgKi8KKyAgICAgICAgZHVwMihwaXBlc1sxXSwyKTsgICAgICAgICAgICAgICAvKiBieSB0aGUgcGlwZSAqLworI2Vsc2UKKyAgICAgICAgY2xvc2UoMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBVCZUOiBjbG9zZSBzdGRvdXQgKi8KKyAgICAgICAgaWYgKGR1cChwaXBlc1sxXSkgIT0gMSkgICAgICAgICAvKiBTZW5kIHN0ZG91dCB0byB0aGUgcGlwZSAqLworICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgY2xvc2UoMik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTZW5kIHN0ZGVyciB0byB0aGUgcGlwZSAqLworICAgICAgICBpZiAoZHVwKHBpcGVzWzFdKSAhPSAyKQorICAgICAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBTVk9SUE9TSVggKi8KKyNlbHNlIC8qIE9YT1MgKi8KKyAgICAgICAgZHVwMihwaXBlc1sxXSwxKTsKKyAgICAgICAgZHVwMihwaXBlc1sxXSwyKTsKKyNlbmRpZiAvKiBPWE9TICovCisgICAgICAgIGNsb3NlKHBpcGVzWzFdKTsgICAgICAgICAgICAgICAgLyogRG9uJ3QgbmVlZCB0aGlzIGFueSBtb3JlLiAqLworCisjaWZkZWYgYWVnaXMKKyAgICAgICAgaWYgKChzaHBhdGggPSBnZXRlbnYoIlNFUlZFUlNIRUxMIikpID09IE5VTEwpCisgICAgICAgICAgc2hwYXRoID0gIi9iaW4vc2giOworI2Vsc2UKKyAgICAgICAgc2hwYXRoID0gZ2V0ZW52KCJTSEVMTCIpOyAgICAgICAvKiBXaGF0IHNoZWxsPyAqLworICAgICAgICBpZiAoc2hwYXRoID09IE5VTEwpIHsKKyAgICAgICAgICAgIHAgPSBnZXRwd3VpZCggcmVhbF91aWQoKSApOyAvKiBHZXQgbG9naW4gZGF0YSAqLworICAgICAgICAgICAgZGVidWcoRjExMSwienhjbWQgc2hwYXRoIiwiZ2V0cHd1aWQoKSIscCk7CisgICAgICAgICAgICBpZiAocCA9PSAoc3RydWN0IHBhc3N3ZCAqKU5VTEwgfHwgISoocC0+cHdfc2hlbGwpKQorICAgICAgICAgICAgICBzaHBhdGggPSBkZWZzaGVsbDsKKyAgICAgICAgICAgIGVsc2Ugc2hwYXRoID0gcC0+cHdfc2hlbGw7CisgICAgICAgIH0KKyNlbmRpZiAvKiBhZWdpcyAqLworICAgICAgICBzaHB0ciA9IHNobmFtZSA9IHNocGF0aDsKKyAgICAgICAgd2hpbGUgKCpzaHB0ciAhPSAnXDAnKQorICAgICAgICAgIGlmICgqc2hwdHIrKyA9PSAnLycpCisgICAgICAgICAgICBzaG5hbWUgPSBzaHB0cjsKKyAgICAgICAgZGVidWcoRjExMCxzaHBhdGgsc2huYW1lLDApOworCXJlc3RvcnNpZ3MoKTsJCQkvKiBSZXN0b3JlIGlnbm9yZWQgc2lnbmFscyAqLworICAgICAgICBleGVjbChzaHBhdGgsc2huYW1lLCItYyIsY29tYW5kLChjaGFyICopTlVMTCk7IC8qIEV4ZWN1dGUgdGhlIGNtZCAqLworICAgICAgICBleGl0KDApOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3QgcHVudCBpZiBpdCBmYWlsZWQuICovCisgICAgfSBlbHNlIGlmIChwaWQgPT0gKFBJRF9UKSAtMSkgeworICAgICAgICBkZWJ1ZyhGMTAwLCJ6eGNtZCBmb3JrIGZhaWx1cmUiLCIiLDApOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsInp4Y21kIHBpZCIsIiIscGlkKTsKKyAgICBjbG9zZShwaXBlc1sxXSk7ICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBuZWVkIHRoZSBvdXRwdXQgc2lkZSAqLworICAgIGlzcGlwZVtmaWxudW1dID0gMTsgICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIGl0J3MgYSBwaXBlICovCisgICAgZnBbZmlsbnVtXSA9IGZkb3BlbihwaXBlc1swXSwiciIpOwkvKiBPcGVuIGEgc3RyZWFtIGZvciBpbnB1dC4gKi8KKworI2lmZGVmIERPTkRFTEFZCisjaWZkZWYgU0VMRUNUCisgICAgaWYgKGZpbG51bSA9PSBaSUZJTEUgJiYga2FjdGl2ZSkgeyAgLyogTWFrZSBwaXBlIHJlYWRzIG5vbmJsb2NraW5nICovCisgICAgICAgIGludCBmbGFncywgeDsKKyAgICAgICAgaWYgKChmbGFncyA9IGZjbnRsKGZpbGVubyhmcFtmaWxudW1dKSxGX0dFVEZMLDApKSA+IC0xKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6eGNtZCBmY250bCAxIHBpcGUgZmxhZ3MiLCIiLGZsYWdzKTsKKyAgICAgICAgICAgIHggPSBmY250bChmaWxlbm8oZnBbZmlsbnVtXSksRl9TRVRGTCwgZmxhZ3MgfAorI2lmZGVmIFFOWAorICAgICAgICAgICAgICAgICAgT19OT05CTE9DSworI2Vsc2UKKyAgICAgICAgICAgICAgICAgIE9fTkRFTEFZCisjZW5kaWYgLyogUU5YICovCisgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgZGVidWcoRjEwMSwienhjbWQgZmNudGwgMiByZXN1bHQiLCIiLHgpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFNFTEVDVCAqLworI2VuZGlmIC8qIERPTkRFTEFZICovCisjZW5kaWYgLyogU05JNTQxICovCisgICAgZnBbWlNZU0ZOXSA9IGZwW2ZpbG51bV07ICAgICAgICAgICAgLyogUmVtZW1iZXIuICovCisgICAgemluY250ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogKFBXUCkgcmVzZXQgaW5wdXQgYnVmZmVyICovCisgICAgemlucHRyID0gemluYnVmZmVyOworICAgIGZ1bGxuYW1lWzBdID0gJ1wwJzsKKyAgICByZXR1cm4oMSk7Cit9IC8qIHp4Y21kICovCisKKy8qICBaIEMgTCBPIFMgRiAgLSB3YWl0IGZvciB0aGUgY2hpbGQgZm9yayB0byB0ZXJtaW5hdGUgYW5kIGNsb3NlIHRoZSBwaXBlLiAqLworCisvKiAgVXNlZCBpbnRlcm5hbGx5IGJ5IHpjbG9zZSAtIHJldHVybnMgLTEgb24gZmFpbHVyZSwgMSBvbiBzdWNjZXNzLiAqLworCitpbnQKK3pjbG9zZihmaWxudW0pIGludCBmaWxudW07IHsKKyAgICBpbnQgd3N0YXQsIG91dDsKKyAgICBpbnQgc3RhdHVzcDsKKworICAgIGRlYnVnKEYxMDEsInpjbG9zZiBmaWxudW0iLCIiLGZpbG51bSk7CisgICAgb3V0ID0gKGZpbG51bSA9PSBaSUZJTEUgfHwgZmlsbnVtID09IFpSRklMRSkgPyAwIDogMSA7CisgICAgZGVidWcoRjEwMSwiemNsb3NmIG91dCIsIiIsb3V0KTsKKworI2lmbmRlZiBOT1BPUEVOCisgICAgaWYgKGlzcGlwZVtmaWxudW1dCisgICAgICAgIC8qIEluIFVOSVggd2UgdXNlIHBvcGVuKCkgb25seSBmb3Igb3V0cHV0IGZpbGVzICovCisgICAgICAgICYmIG91dAorICAgICAgICApIHsKKyAgICAgICAgaW50IHg7CisgICAgICAgIHggPSBwY2xvc2UoZnBbZmlsbnVtXSk7CisgICAgICAgIHBleGl0c3RhdCA9IHggPj4gODsKKyAgICAgICAgZGVidWcoRjEwMSwiemNsb3NmIHBjbG9zZSIsIiIseCk7CisgICAgICAgIGRlYnVnKEYxMDEsInpjbG9zZiBwZXhpdHN0YXQiLCIiLHBleGl0c3RhdCk7CisgICAgICAgIGZwW2ZpbG51bV0gPSBmcFtaU1lTRk5dID0gTlVMTDsKKyAgICAgICAgaXNwaXBlW2ZpbG51bV0gPSAwOworICAgICAgICByZXR1cm4oKHggIT0gMCkgPyAtMSA6IDEpOworICAgIH0KKyNlbmRpZiAvKiBOT1BPUEVOICovCisgICAgZGVidWcoRjEwMSwiemNsb3NmIGZwW2ZpbG51bV0iLCIiLCBmcFtmaWxudW1dKTsKKyAgICBkZWJ1ZyhGMTAxLCJ6Y2xvc2YgZnBbWlNZU0ZOXSIsIiIsIGZwW1pTWVNGTl0pOworCisgICAgaWYgKHBpZCAhPSAoUElEX1QpIDApIHsKKyAgICAgICAgZGVidWcoRjEwMSwiemNsb3NmIGtpbGxpbmcgcGlkIiwiIixwaWQpOworI2lmZGVmIFBsYW45CisgICAgICAgIGtpbGwocGlkLCBTSUdLSUxMKTsKKyNlbHNlCisgICAgICAgIGtpbGwocGlkLDkpOworI2VuZGlmIC8qIFBsYW45ICovCisKKyNpZm5kZWYgQ0tfQ0hJTEQKKy8qCisgIFRoaXMgaXMgdGhlIG9yaWdpbmFsIGNvZGUgKGJlZm9yZSAyMCBBcHJpbCAxOTk3KSBhbmQgaGFzIHByb3ZlbiB0b3RhbGx5CisgIHBvcnRhYmxlLiAgQnV0IGl0IGRvZXMgbm90IGdpdmUgdXMgdGhlIHByb2Nlc3MncyByZXR1cm4gY29kZS4KKyovCisgICAgICAgIHdoaWxlICgod3N0YXQgPSB3YWl0KChXQUlUX1QgKikwKSkgIT0gcGlkICYmIHdzdGF0ICE9IC0xKSA7CisjZWxzZQorLyogSGVyZSB3ZSB0cnkgdG8gZ2V0IHRoZSByZXR1cm4gY29kZS4gIExldCdzIGhvcGUgdGhpcyBpcyBwb3J0YWJsZSB0b28uICovCisgICAgICAgIHdoaWxlICgod3N0YXQgPSB3YWl0KCZzdGF0dXNwKSkgIT0gcGlkICYmIHdzdGF0ICE9IC0xKSA7CisgICAgICAgIHBleGl0c3RhdCA9IChzdGF0dXNwICYgMHhmZikgPyBzdGF0dXNwIDogc3RhdHVzcCA+PiA4OworICAgICAgICBkZWJ1ZyhGMTAxLCJ6Y2xvc2Ygd2FpdCBzdGF0dXNwIiwiIixzdGF0dXNwKTsKKyAgICAgICAgZGVidWcoRjEwMSwiemNsb3NmIHdhaXQgcGV4aXRzdGF0IiwiIixwZXhpdHN0YXQpOworI2VuZGlmIC8qIENLX0NISUxEICovCisgICAgICAgIHBpZCA9IDA7CisgICAgfQorICAgIGZjbG9zZShmcFtmaWxudW1dKTsKKyAgICBmcFtmaWxudW1dID0gZnBbWlNZU0ZOXSA9IE5VTEw7CisKKyAgICBpc3BpcGVbZmlsbnVtXSA9IDA7CisgICAgZGVidWcoRjEwMSwiemNsb3NmIGZwW2ZpbG51bV0iLCIiLGZwW2ZpbG51bV0pOworI2lmZGVmIENLX0NISUxECisgICAgcmV0dXJuKHBleGl0c3RhdCA9PSAwID8gMSA6IC0xKTsKKyNlbHNlCisgICAgcmV0dXJuKDEpOworI2VuZGlmIC8qIENLX0NISUxEICovCit9CisKKyNlbHNlICAvKiBOT1BVU0ggKi8KKworaW50Cit6eGNtZChmaWxudW0sY29tYW5kKSBpbnQgZmlsbnVtOyBjaGFyICpjb21hbmQ7IHsKKyAgICByZXR1cm4oMCk7Cit9CitpbnQKK3pjbG9zZihmaWxudW0pIGludCBmaWxudW07IHsKKyAgICByZXR1cm4oRU9GKTsKK30KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworCisvKiAgWiBYIFAgQSBOIEQgIC0tICBFeHBhbmQgYSB3aWxkY2FyZCBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdHJpbmdzICAqLworLyoKKyAgQXMgb2YgQy1LZXJtaXQgNy4wLCB0aGlzIEFQSSBpcyBvYnNvbGV0ZSwgcmVwbGFjZWQgYnkgbnp4cGFuZCgpLCBhbmQgdGhpcworICBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgaW50ZXJuYWxseS4gIFNlZSBuenhwYW5kKCkgYmVsb3cuCisKKyAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgbWF0Y2ggZm5hcmcsIHdpdGggZGF0YSBzdHJ1Y3R1cmVzIHNldCB1cAorICBzbyB0aGF0IGZpcnN0IGZpbGUgKGlmIGFueSkgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgbmV4dCB6bmV4dCgpIGNhbGwuCisKKyAgRGVwZW5kcyBvbiBleHRlcm5hbCB2YXJpYWJsZSB3aWxkeHBhbmQ6IDAgbWVhbnMgd2UgZXhwYW5kIHdpbGRjYXJkcworICBpbnRlcm5hbGx5LCBub256ZXJvIG1lYW5zIHdlIGNhbGwgdGhlIHNoZWxsIHRvIGRvIGl0LgorKi8KK3N0YXRpYyBpbnQgeGRpcm9ubHkgPSAwOworc3RhdGljIGludCB4Zmlsb25seSA9IDA7CitzdGF0aWMgaW50IHhtYXRjaGRvdCA9IDA7CitzdGF0aWMgaW50IHhyZWN1cnNpdmUgPSAwOworc3RhdGljIGludCB4bm9iYWNrdXAgPSAwOworc3RhdGljIGludCB4bm9saW5rcyA9IDA7CisKK3N0YXRpYyBjaGFyICpmcmVlcHRyID0gTlVMTCwgKipyZXNwdHIgPSBOVUxMOyAvKiBDb3BpZXMgb2YgY2FsbGVyJ3MgYXJncyAqLworc3RhdGljIGludCByZW1sZW47ICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbWFpbmluZyBzcGFjZSBpbiBjYWxsZXIncyBhcnJheSAqLworc3RhdGljIGludCBudW1mbmQgPSAwOwkJCS8qIE51bWJlciBvZiBtYXRjaGVzIGZvdW5kICovCisKKyNkZWZpbmUgTUlOU1BBQ0UgMTAyNAorCitzdGF0aWMgaW50Citpbml0c3BhY2UocmVzYXJyeSxsZW4pIGNoYXIgKiByZXNhcnJ5W107IGludCBsZW47IHsKKyNpZmRlZiBEWU5BTUlDCisgICAgaWYgKGxlbiA8IE1JTlNQQUNFKSBsZW4gPSBNSU5TUEFDRTsKKyAgICBpZiAoIXNzcGFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkIHRvIGFsbG9jYXRlIHN0cmluZyBzcGFjZT8gKi8KKyAgICAgICAgd2hpbGUgKGxlbiA+PSBNSU5TUEFDRSkgeworICAgICAgICAgICAgaWYgKChzc3BhY2UgPSBtYWxsb2MobGVuKzIpKSkgeyAvKiBHb3QgaXQuICovCisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiZmdlbiBzdHJpbmcgc3BhY2UiLCIiLGxlbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW4gPSAobGVuIC8gMikgKyAobGVuIC8gNCk7IC8qIERpZG4ndCwgcmVkdWNlIGJ5IDMvNCAqLworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPD0gTUlOU1BBQ0UpIHsJCS8qIERpZCB3ZSBnZXQgaXQ/ICovCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiZmdlbiBjYW4ndCBtYWxsb2Mgc3RyaW5nIHNwYWNlXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKwlzc3BsZW4gPSBsZW47CisgICAgfQorI2VuZGlmIC8qIERZTkFNSUMgKi8KKworICAgIGZyZWVwdHIgPSBzc3BhY2U7ICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgd2hlcmUgbWF0Y2hlcyBhcmUgY29waWVkLiAqLworICAgIHJlc3B0ciA9IHJlc2Fycnk7CQkJLyogU3RhdGljIGNvcGllcyBvZiB0aGVzZSBzbyAqLworICAgIHJlbWxlbiA9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlY3Vyc2l2ZSBjYWxscyBjYW4gYWx0ZXIgdGhlbS4gKi8KKyAgICBkZWJ1ZyhGMTAxLCJpbml0c3BhY2Ugc3NwbGVuIiwiIixzc3BsZW4pOworICAgIHJldHVybigwKTsKK30KKworLyoKKyAgWiBTIEUgVCBGIEkgTCAgLS0gIFF1ZXJ5IG9yIGNoYW5nZSB0aGUgc2l6ZSBvZiBmaWxlIGxpc3QgYnVmZmVycy4KKworICBmYyA9IDE6IENoYW5nZSBjdXJyZW50IHN0cmluZyBzcGFjZSB0byBuLCByZXR1cm4gbmV3IHNpemUuCisgIGZjID0gMjogUmV0dXJuIGN1cnJlbnQgc3RyaW5nIHNwYWNlIHNpemUuCisgIGZjID0gMzogQ2hhbmdlIGN1cnJlbnQgbWF4bmFtZXMgdG8gbiwgcmV0dXJuIG5ldyBtYXhuYW1lcy4KKyAgZmMgPSA0OiBSZXR1cm4gY3VycmVudCBtYXhuYW1lcy4KKyAgUmV0dXJucyA8IDAgb24gZXJyb3IuCisqLworaW50Cit6c2V0ZmlsKG4sIGZjKSBpbnQgbiwgZmM7IHsKKyNpZmRlZiBEWU5BTUlDCisgICAgc3dpdGNoIChmYykgeworICAgICAgY2FzZSAxOgkJCQkvKiBTdHJpbmdzcGFjZSAqLworCWlmIChzc3BhY2UpIHsKKwkgICAgZnJlZShzc3BhY2UpOworCSAgICBzc3BhY2UgPSBOVUxMOworCX0KKwlpZiAoaW5pdHNwYWNlKG10Y2hzLG4pIDwgMCkKKwkgIHJldHVybigtMSk7CisgICAgICBjYXNlIDI6CQkJCS8qIEZhbGwgdGhydSBkZWxpYmVyYXRlbHkgKi8KKwlyZXR1cm4oc3NwbGVuKTsKKyAgICAgIGNhc2UgMzoJCQkJLyogTGlzdHNpemUgKi8KKwlpZiAobXRjaHMpIHsKKwkgICAgZnJlZSgoY2hhciAqKW10Y2hzKTsKKwkgICAgbXRjaHMgPSBOVUxMOworCX0KKwltdGNocyA9IChjaGFyICoqKW1hbGxvYyhuICogc2l6ZW9mKGNoYXIgKikpOworCWlmICghbXRjaHMpCisJICByZXR1cm4oLTEpOworCW1heG5hbWVzID0gbjsKKyAgICAgIGNhc2UgNDoJCQkJLyogRmFsbCB0aHJ1IGRlbGliZXJhdGVseSAqLworCXJldHVybihtYXhuYW1lcyk7CisgICAgfQorI2VuZGlmIC8qIERZTkFNSUMgKi8KKyAgICByZXR1cm4oLTEpOworfQorCisKKworI2lmbmRlZiBOT05aWFBBTkQKKyNpZm5kZWYgcGRwMTEKK3N0YXRpYworI2VuZGlmIC8qIHBkcDExICovCisjZW5kaWYgLyogTk9OWlhQQU5EICovCitpbnQKK3p4cGFuZChmbmFyZykgY2hhciAqZm5hcmc7IHsKKyAgICBleHRlcm4gaW50IGRpcmFjdGl2ZTsKKyAgICBjaGFyIGZuYnVmW0NLTUFYUEFUSCs4XSwgKiBmbiwgKiBwOworCisjaWZkZWYgRFRJTERFICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnVpbHQgd2l0aCB0aWxkZS1leHBhbnNpb24/ICovCisgICAgY2hhciAqdG5hbTsKKyNlbmRpZiAvKiBEVElMREUgKi8KKyAgICBpbnQgeDsKKyAgICBpbnQgaGF2ZW9uZWRpciA9IDA7CisKKyAgICBpZiAoIWZuYXJnKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBubyBhcmd1bWVudCBwcm92aWRlZCAqLworCW54cGFuZCA9IGZjb3VudCA9IDA7CisJcmV0dXJuKDApOwkJCS8qIFJldHVybiB6ZXJvIGZpbGVzIGZvdW5kICovCisgICAgfQorICAgIGRlYnVnKEYxMTAsInp4cGFuZCBlbnRyeSIsZm5hcmcsMCk7CisgICAgZGVidWcoRjEwMSwienhwYW5kIHhkaXJvbmx5IiwiIix4ZGlyb25seSk7CisgICAgZGVidWcoRjEwMSwienhwYW5kIHhmaWxvbmx5IiwiIix4Zmlsb25seSk7CisKKyAgICBpZiAoISpmbmFyZykgewkJCS8qIElmIG5vIGFyZ3VtZW50IHByb3ZpZGVkICovCisJbnhwYW5kID0gZmNvdW50ID0gMDsKKwlyZXR1cm4oMCk7CQkJLyogUmV0dXJuIHplcm8gZmlsZXMgZm91bmQgKi8KKyAgICB9CisKKyNpZmRlZiBDS1JPT1QKKyAgICBkZWJ1ZyhGMTExLCJ6eHBhbmQgc2V0cm9vdCIsY2tyb290LGNrcm9vdHNldCk7CisgICAgaWYgKGNrcm9vdHNldCkgaWYgKCF6aW5yb290KGZuYXJnKSkgeworCWRlYnVnKEYxMTAsInp4cGFuZCBzZXRyb290IHZpb2xhdGlvbiIsZm5hcmcsMCk7CisJbnhwYW5kID0gZmNvdW50ID0gMDsKKwlyZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIENLUk9PVCAqLworCisjaWZkZWYgQ09NTUVOVAorLyoKKyAgVGhpcyB3b3VsZCBoYXZlIGJlZW4gcGVyZmVjdCwgZXhjZXB0IGl0IG1ha2VzIHVzIHJldHVybiBmdWxseSBxdWFsaWZpZWQKKyAgcGF0aG5hbWVzIGZvciBhbGwgZmlsZXMuCisqLworICAgIHpmbnFmcChmbmFyZyxDS01BWFBBVEgsZm5idWYpOworICAgIGRlYnVnKEYxMTAsInp4cGFuZCB6Zm5xZnAiLGZuYnVmLDApOworICAgIHMgPSB6Z3RkaXIoKTsKKyAgICBkZWJ1ZyhGMTEwLCJ6eHBhbmQgemd0ZGlyIixzLDApOworICAgIHAgPSBmbmJ1ZjsKKyAgICB3aGlsZSAoKnAgJiYgKnMpICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIGl0IHJlbGF0aXZlICovCisgICAgICBpZiAoKnMrKyAhPSAqcCsrKQorICAgICAgICBicmVhazsKKyAgICBmbiA9ICgqcykgPyBmbmJ1ZiA6IHA7CisgICAgZGVidWcoRjExMCwienhwYW5kIGZuIDAiLGZuLDApOworICAgIGlmICghKmZuKSB7CisgICAgICAgIGZuID0gZm5idWY7CisgICAgICAgIGZuYnVmWzBdID0gJyonOworICAgICAgICBmbmJ1ZlsxXSA9ICdcMCc7CisgICAgfQorICAgIGRlYnVnKEYxMTAsInp4cGFuZCBmbiAwLjUiLGZuLDApOworI2Vsc2UKKyNpZmRlZiBEVElMREUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCdWlsdCB3aXRoIHRpbGRlLWV4cGFuc2lvbj8gKi8KKyAgICBpZiAoKmZuYXJnID09ICd+JykgeyAgICAgICAgICAgICAgICAvKiBTdGFydHMgd2l0aCB0aWxkZT8gKi8KKyAgICAgICAgdG5hbSA9IHRpbGRlX2V4cGFuZChmbmFyZyk7ICAgICAvKiBUcnkgdG8gZXhwYW5kIGl0LiAqLworICAgICAgICBja3N0cm5jcHkoZm5idWYsdG5hbSxDS01BWFBBVEgpOworICAgIH0gZWxzZQorI2VuZGlmIC8qIERUSUxERSAqLworICAgICAgY2tzdHJuY3B5KGZuYnVmLGZuYXJnLENLTUFYUEFUSCk7CisgICAgZm4gPSBmbmJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gd2hhdCB3ZSdsbCB3b3JrIHdpdGggKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgZGVidWcoRjExMCwienhwYW5kIGZuIDEiLGZuLDApOworCisgICAgaWYgKCEqZm4pICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnV0IG1ha2Ugc3VyZSBzb21ldGhpbmcgaXMgdGhlcmUgKi8KKyAgICAgIHJldHVybigwKTsKKworICAgIHAgPSBmbiArIChpbnQpc3RybGVuKGZuKSAtIDE7CisgICAgaWYgKCpwID09ICcvJykgeyAgICAgICAgICAgICAgICAgICAgLyogSWYgbGFzdCBjaGFyID0gLyBpdCBtdXN0IGJlIGEgZGlyICovCisJaWYgKCF4Zmlsb25seSAmJiAhaXN3aWxkKHApKSBoYXZlb25lZGlyKys7CisgICAgICAgIGNrc3RybmNhdChmbiwgIioiLCBDS01BWFBBVEgrOCk7IC8qIHNvIGFwcGVuZCAnKicgKi8KKyAgICB9IGVsc2UgaWYgKHAgPiBmbikgeyAgICAgICAgICAgICAgICAvKiBJZiBlbmRzIGluICIvLiIgKi8KKyAgICAgICAgaWYgKCoocC0xKSA9PSAnLycgJiYgKnAgPT0gJy4nKSAvKiBjaGFuZ2UgJy4nIHRvICcqJyAqLworICAgICAgICAgICpwID0gJyonOworICAgIH0gZWxzZSBpZiAocCA9PSBmbikgeyAgICAgICAgICAgICAgIC8qIElmIGl0J3MgJy4nIGFsb25lICovCisgICAgICAgIGlmICgqcCA9PSAnLicpICAgICAgICAgICAgICAgICAgLyogY2hhbmdlICcuJyB0byAnKicgKi8KKyAgICAgICAgICAqcCA9ICcqJzsKKyAgICB9CisgICAgZGVidWcoRjExMCwienhwYW5kIGZuIDIiLGZuLDApOworICAgIHggPSBpc2Rpcihmbik7ICAgICAgICAgICAgICAgICAgICAgIC8qIElzIGl0IGEgZGlyZWN0b3J5PyAqLworICAgIGRlYnVnKEYxMTEsInp4cGFuZCBpc2RpciAxIixmbix4KTsKKyAgICBpZiAoeCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBzbywgbWFrZSBpdCBpbnRvIGEgd2lsZGNhcmQgKi8KKwlpZiAoIXhmaWxvbmx5ICYmICFpc3dpbGQocCkpCisJICBoYXZlb25lZGlyKys7CisgICAgICAgIGlmICgoeCA9IHN0cmxlbihmbikpID4gMCkgeworICAgICAgICAgICAgaWYgKCFJU0RJUlNFUChmblt4LTFdKSkKKyAgICAgICAgICAgICAgZm5beCsrXSA9IERJUlNFUDsKKyAgICAgICAgICAgIGZuW3grK10gPSAnKic7CisgICAgICAgICAgICBmblt4XSA9ICdcMCc7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVidWcoRjExMSwienhwYW5kIGZuIDMiLGZuLGhhdmVvbmVkaXIpOworLyoKKyAgVGhlIGZvbGxvd2luZyBhbGxvd3MgdXMgdG8gcGFyc2UgYSBzaW5nbGUgZGlyZWN0b3J5IG5hbWUgd2l0aG91dCBvcGVuaW5nCisgIHRoZSBkaXJlY3RvcnkgYW5kIGxvb2tpbmcgYXQgaXRzIGNvbnRlbnRzLiAgVGhlIGRpcmFjdGl2ZSBmbGFnIGlzIGEgaG9ycmlibGUKKyAgaGFjayAoZXNwZWNpYWxseSBzaW5jZSBESVIgL05PUkVDVVJTSVZFIHR1cm5zIGl0IG9mZiksIGJ1dCBvdGhlcndpc2Ugd2UnZAorICBoYXZlIHRvIGNoYW5nZSB0aGUgQVBJLgorKi8KKyAgICBpZiAoIWRpcmFjdGl2ZSAmJiBoYXZlb25lZGlyKSB7CisjaWZkZWYgQ09NTUVOVAorCWZjb3VudCA9IChtdGNocyA9PSBOVUxMICYmCisJCSAgKG10Y2hzID0gKGNoYXIgKiopbWFsbG9jKG1heG5hbWVzICogc2l6ZW9mKCptdGNocykpKSA9PSBOVUxMKQorCSAgPyAwIDogMTsKKyNlbHNlCisJZmNvdW50ID0gMDsKKwlpZiAoIW10Y2hzKSB7CisJICAgIG10Y2hzID0gKGNoYXIgKiopbWFsbG9jKG1heG5hbWVzICogc2l6ZW9mKCptdGNocykpOworCSAgICBpZiAobXRjaHMpCisJICAgICAgZmNvdW50ID0gMTsKKwkgICAgaWYgKCFmY291bnQpCisJICAgICAgcmV0dXJuKG54cGFuZCA9IGZjb3VudCk7CisJfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKwlkZWJ1ZyhGMTEwLCJ6eHBhbmQgaGF2ZW9uZWRpciBBMSIsZm5hcmcsMCk7CisJaW5pdHNwYWNlKG10Y2hzLHNzcGxlbik7CisJYWRkcmVzdWx0KGZuYXJnLDEpOworCWlmIChudW1mbmQgPCAwKSByZXR1cm4oLTEpOworCW10Y2hwdHIgPSBtdGNoczsJCS8qIFNhdmUgcG9pbnRlciBmb3IgbmV4dC4gKi8KKwlkZWJ1ZyhGMTEwLCJ6eHBhbmQgaGF2ZW9uZWRpciBBMiIsKm10Y2hwdHIsMCk7CisJcmV0dXJuKG54cGFuZCA9IGZjb3VudCk7CisgICAgfQorCisjaWZuZGVmIE5PUFVTSAorICAgIGlmICghbm9wdXNoICYmIHdpbGR4cGFuZCkgICAgICAgICAgIC8qIFdobyBpcyBleHBhbmRpbmcgd2lsZGNhcmRzPyAqLworICAgICAgZmNvdW50ID0gKG10Y2hzID09IE5VTEwgJiYgICAgICAgIC8qIFNoZWxsICovCisgICAgICAgICAgICAgICAgKG10Y2hzID0gKGNoYXIgKiopbWFsbG9jKG1heG5hbWVzICogc2l6ZW9mKCptdGNocykpKSA9PSBOVUxMKQorICAgICAgICA/IDAKKyAgICAgICAgICA6ICBzaHhwYW5kKGZuLG10Y2hzLG1heG5hbWVzKTsKKyAgICBlbHNlCisjZW5kaWYgLyogTk9QVVNIICovCisgICAgICBmY291bnQgPSAobXRjaHMgPT0gTlVMTCAmJiAgICAgICAgLyogS2VybWl0ICovCisgICAgICAgICAgICAgICAgKG10Y2hzID0gKGNoYXIgKiopbWFsbG9jKG1heG5hbWVzICogc2l6ZW9mKCptdGNocykpKSA9PSBOVUxMKQorICAgICAgICA/IDAKKyAgICAgICAgICA6IGZnZW4oZm4sbXRjaHMsbWF4bmFtZXMpOyAgICAgIC8qIExvb2sgdXAgdGhlIGZpbGUuICovCisKKyAgICBpZiAoZmNvdW50ID09IDAgJiYgaGF2ZW9uZWRpcikgeworCWZjb3VudCA9IDE7CisJZGVidWcoRjExMCwienhwYW5kIGhhdmVvbmVkaXIgQiIsZm5hcmcsMCk7CisJYWRkcmVzdWx0KGZuYXJnLDEpOworCWlmIChudW1mbmQgPCAwKSByZXR1cm4oLTEpOworICAgIH0KKyAgICBtdGNocHRyID0gbXRjaHM7ICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHBvaW50ZXIgZm9yIG5leHQuICovCisgICAgbnhwYW5kID0gZmNvdW50OworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisgICAgICAgIGlmIChmY291bnQgPiAxKQorICAgICAgICAgIGRlYnVnKEYxMTEsInp4cGFuZCBvayIsbXRjaHNbMF0sZmNvdW50KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGRlYnVnKEYxMDEsInp4cGFuZCBmY291bnQiLCIiLGZjb3VudCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgcmV0dXJuKGZjb3VudCk7Cit9CisKKyNpZm5kZWYgTk9OWlhQQU5ECisvKiAgTiBaIFggUCBBIE4gRCAgLS0gIEV4cGFuZCBhIGZpbGUgbGlzdCwgd2l0aCBvcHRpb25zLiAgKi8KKy8qCisgIENhbGwgd2l0aDoKKyAgIHMgPSBwb2ludGVyIHRvIGZpbGVuYW1lIG9yIHBhdHRlcm4uCisgICBmbGFncyA9IG9wdGlvbiBiaXRzOgorCisgICAgIGZsYWdzICYgWlhfRklMT05MWSAgIE1hdGNoIHJlZ3VsYXIgZmlsZXMKKyAgICAgZmxhZ3MgJiBaWF9ESVJPTkxZICAgTWF0Y2ggZGlyZWN0b3JpZXMKKyAgICAgZmxhZ3MgJiBaWF9SRUNVUlNFICAgRGVzY2VuZCB0aHJvdWdoIGRpcmVjdG9yeSB0cmVlCisgICAgIGZsYWdzICYgWlhfTUFUQ0hET1QgIE1hdGNoICJkb3QgZmlsZXMiCisgICAgIGZsYWdzICYgWlhfTk9CQUNLVVAgIERvbid0IG1hdGNoICJiYWNrdXAgZmlsZXMiCisgICAgIGZsYWdzICYgWlhfTk9MSU5LUyAgIERvbid0IGZvbGxvdyBzeW1saW5rcy4KKworICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgbWF0Y2ggcywgd2l0aCBkYXRhIHN0cnVjdHVyZXMgc2V0IHVwCisgICBzbyB0aGF0IGZpcnN0IGZpbGUgKGlmIGFueSkgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgbmV4dCB6bmV4dCgpIGNhbGwuCisqLworaW50CituenhwYW5kKHMsZmxhZ3MpIGNoYXIgKiBzOyBpbnQgZmxhZ3M7IHsKKyAgICBjaGFyICogcDsKKyAgICBpbnQgeDsKKworICAgIGRlYnVnKEYxMTEsIm56eHBhbmQiLHMsZmxhZ3MpOworICAgIHggPSBmbGFncyAmIChaWF9ESVJPTkxZfFpYX0ZJTE9OTFkpOworICAgIHhkaXJvbmx5ID0gKHggPT0gWlhfRElST05MWSk7CisgICAgeGZpbG9ubHkgPSAoeCA9PSBaWF9GSUxPTkxZKTsKKyAgICBpZiAoeGRpcm9ubHkgJiYgeGZpbG9ubHkpIHsKKyAgICAgICAgeGRpcm9ubHkgPSAwOworICAgICAgICB4Zmlsb25seSA9IDA7CisgICAgfQorICAgIHhtYXRjaGRvdCAgPSAoZmxhZ3MgJiBaWF9NQVRDSERPVCk7CisgICAgZGVidWcoRjExMSwibnp4cGFuZCB4bWF0Y2hkb3QgMSIscyx4bWF0Y2hkb3QpOworICAgIC8qIElmIHhtYXRjaGRvdCBub3Qgc2V0IGJ5IGNhbGxlciBidXQgcGF0dGVybiBpbXBsaWVzIGl0LCBzZXQgaXQgYW55d2F5ICovCisgICAgaWYgKCF4bWF0Y2hkb3QgJiYgKChwID0gY2tzdHJjaHIocywnLicpKSkpIHsKKwlpZiAocCA9PSBzICYmIHBbMV0gIT0gJy8nKSB7CisJICAgIHhtYXRjaGRvdCA9IDE7CisJICAgIGRlYnVnKEYxMTEsIm56eHBhbmQgeG1hdGNoZG90IDIiLHMseG1hdGNoZG90KTsKKwl9IGVsc2UgaWYgKHAgPiBzKSB7CisJICAgIHhtYXRjaGRvdCA9ICgqKHAtMSkgPT0gJywnKSB8fCAoKihwLTEpID09ICd7JykgfHwgKCoocC0xKSA9PSAnLycpOworCSAgICBkZWJ1ZyhGMTExLCJuenhwYW5kIHhtYXRjaGRvdCAzIixzLHhtYXRjaGRvdCk7CisJfQorICAgIH0KKyAgICB4cmVjdXJzaXZlID0gKGZsYWdzICYgWlhfUkVDVVJTRSk7CisgICAgeG5vYmFja3VwICA9IChmbGFncyAmIFpYX05PQkFDS1VQKTsKKyAgICB4bm9saW5rcyAgID0gKGZsYWdzICYgWlhfTk9MSU5LUyk7CisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKwlkZWJ1ZyhGMTAxLCJuenhwYW5kIHhkaXJvbmx5IiwiIix4ZGlyb25seSk7CisJZGVidWcoRjEwMSwibnp4cGFuZCB4Zmlsb25seSIsIiIseGZpbG9ubHkpOworCWRlYnVnKEYxMDEsIm56eHBhbmQgeG1hdGNoZG90IiwiIix4bWF0Y2hkb3QpOworCWRlYnVnKEYxMDEsIm56eHBhbmQgeHJlY3Vyc2l2ZSIsIiIseHJlY3Vyc2l2ZSk7CisJZGVidWcoRjEwMSwibnp4cGFuZCB4bm9iYWNrdXAiLCIiLHhub2JhY2t1cCk7CisJZGVidWcoRjEwMSwibnp4cGFuZCB4bm9saW5rcyIsIiIseG5vbGlua3MpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgeCA9IHp4cGFuZChzKTsKKyAgICBpZiAoeCA+IDEpCisgICAgICBzaF9zb3J0KG10Y2hzLE5VTEwseCwwLDAsMSk7CS8qIEFscGhhYmV0aXplIHRoZSBsaXN0ICovCisgICAgeGRpcm9ubHkgPSAwOworICAgIHhmaWxvbmx5ID0gMDsKKyAgICB4bWF0Y2hkb3QgPSAwOworICAgIHhyZWN1cnNpdmUgPSAwOworICAgIHhub2JhY2t1cCA9IDA7CisgICAgeG5vbGlua3MgPSAwOworICAgIHJldHVybih4KTsKK30KKyNlbmRpZiAvKiBOT05aWFBBTkQgKi8KKworI2lmbmRlZiBOT1pYUkVXSU5ECisvKiAgWiBYIFIgRSBXIEkgTiBEICAtLSAgUmV3aW5kcyB0aGUgenhwYW5kKCkgbGlzdCAqLworCitpbnQKK3p4cmV3aW5kKCkgeworICAgIC8qIGlmICghbXRjaHMpIHJldHVybigtMSk7ICovCisgICAgZmNvdW50ID0gbnhwYW5kOworICAgIG10Y2hwdHIgPSBtdGNoczsKKyAgICByZXR1cm4obnhwYW5kKTsKK30KKyNlbmRpZiAvKiBOT1pYUkVXSU5EICovCisKKy8qICBaIE4gRSBYIFQgIC0tICBHZXQgbmFtZSBvZiBuZXh0IGZpbGUgZnJvbSBsaXN0IGNyZWF0ZWQgYnkgenhwYW5kKCkuICovCisvKgorICBSZXR1cm5zID4wIGlmIHRoZXJlJ3MgYW5vdGhlciBmaWxlLCB3aXRoIGl0cyBuYW1lIGNvcGllZCBpbnRvIHRoZSBhcmcgc3RyaW5nLAorICBvciAwIGlmIG5vIG1vcmUgZmlsZXMgaW4gbGlzdC4KKyovCitpbnQKK3puZXh0KGZuKSBjaGFyICpmbjsgeworICAgIGlmIChmY291bnQtLSA+IDApIHsKKyAgICAgICAgY2tzdHJuY3B5KGZuLCptdGNocHRyKyssQ0tNQVhQQVRIKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmblswXSA9ICdcMCc7CisgICAgfQorI2lmbmRlZiBDT01NRU5UCisgICAgZGVidWcoRjExMSwiem5leHQiLGZuLGZjb3VudCsxKTsKKyAgICByZXR1cm4oZmNvdW50KzEpOworI2Vsc2UKKyAgICBkZWJ1ZyhGMTExLCJ6bmV4dCIsZm4sZmNvdW50KTsgICAgICAvKiBSZXR1cm4gMCBpZiBubyBmaWxlbmFtZSB0byByZXR1cm4gKi8KKyAgICByZXR1cm4oZmNvdW50KTsKKyNlbmRpZiAvKiBDT01NRU5UICovCit9CisKKy8qICBaIEMgSCBLIFMgUCBBICAtLSAgQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIHRoZSBmaWxlICAqLworCisvKgorIENhbGwgd2l0aCBmaWxlIHNwZWNpZmljYXRpb24gZiwgc2l6ZSBuIGluIGJ5dGVzLgorIFJldHVybnMgLTEgb24gZXJyb3IsIDAgaWYgbm90IGVub3VnaCBzcGFjZSwgMSBpZiBlbm91Z2ggc3BhY2UuCisqLworLypBUkdTVVNFRCovCitpbnQKKyNpZmRlZiBDS19BTlNJQworemNoa3NwYShjaGFyICpmLCBsb25nIG4pCisjZWxzZQoremNoa3NwYShmLG4pIGNoYXIgKmY7IGxvbmcgbjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogemNoa3NwYSgpICovIHsKKyAgICAvKiBJbiBVTklYIHRoZXJlIGlzIG5vIGdvb2QgKGFuZCBwb3J0YWJsZSkgd2F5LiAqLworICAgIHJldHVybigxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsd2F5cyBzYXkgT0suICovCit9CisKKyNpZmRlZiBDT01NRU5UCQkJCS8qIChub3QgdXNlZCkgKi8KKworLyogIEkgUyBCIEEgQyBLIFUgUCAgLS0gIFRlbGxzIGlmIGdpdmVuIGZpbGUgaGFzIGEgYmFja3VwIHN1ZmZpeCAgKi8KKy8qCisgICBSZXR1cm5zOgorICAgLTE6IEludmFsaWQgYXJndW1lbnQKKyAgICAwOiBGaWxlIGRvZXMgbm90IGhhdmUgYSBiYWNrdXAgc3VmZml4CisgICA+MDogQmFja3VwIHN1ZmZpeCBudW1iZXIKKyovCitpbnQKK2lzYmFja3VwKGZuKSBjaGFyICogZm47IHsJCS8qIEdldCBiYWNrdXAgc3VmZml4IG51bWJlciAqLworICAgIGludCBpLCBqLCBrLCB4LCBzdGF0ZSwgZmxhZzsKKworICAgIGlmICghZm4pCQkJCS8qIFdhdGNoIG91dCBmb3IgbnVsbCBwb2ludGVycy4gKi8KKyAgICAgIHJldHVybigtMSk7CisgICAgaWYgKCEqZm4pCQkJCS8qIEFuZCBlbXB0eSBuYW1lcy4gKi8KKyAgICAgIHJldHVybigtMSk7CisKKyAgICBmbGFnID0gc3RhdGUgPSAwOworICAgIGZvciAoaSA9IChpbnQpc3RybGVuKGZuKSAtIDE7ICghZmxhZyAmJiAoaSA+IDApKTsgaS0tKSB7CisJc3dpdGNoIChzdGF0ZSkgeworCSAgY2FzZSAwOgkJCS8qIFN0YXRlIDAgLSBmaW5hbCBjaGFyICovCisJICAgIGlmIChmbltpXSA9PSAnficpCQkvKiBJcyB0aWxkZSAqLworCSAgICAgIHN0YXRlID0gMTsJCS8qIFN3aXRjaCB0byBuZXh0IHN0YXRlICovCisJICAgIGVsc2UJCQkvKiBPdGhlcndpc2UgKi8KKwkgICAgICBmbGFnID0gMTsJCQkvKiBRdWl0IC0gbm8gYmFja3VwIHN1ZmZpeC4gKi8KKwkgICAgYnJlYWs7CisJICBjYXNlIDE6CQkJLyogU3RhdGUgMSAtIGRpZ2l0cyAqLworCSAgICBpZiAoZm5baV0gPT0gJ34nICAmJiBmbltpLTFdID09ICcuJykgeyAvKiBIYXZlIHN1ZmZpeCAqLworCQlyZXR1cm4oYXRvaSgmZm5baSsxXSkpOworCSAgICB9IGVsc2UgaWYgKGZuW2ldID49ICcwJyAmJiBmbltpXSA8PSAnOScpIHsgLyogSW4gbnVtYmVyIHBhcnQgKi8KKwkJY29udGludWU7CQkvKiBLZWVwIGdvaW5nICovCisJICAgIH0gZWxzZSB7CQkJLyogU29tZXRoaW5nIGVsc2UgKi8KKwkJZmxhZyA9IDE7CQkvKiBOb3QgYSBiYWNrdXAgc3VmZml4IC0gcXVpdC4gKi8KKwkgICAgfQorCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKworLyogIFogTiBFIFcgTiAgLS0gIE1ha2UgYSBuZXcgbmFtZSBmb3IgdGhlIGdpdmVuIGZpbGUgICovCisKKy8qCisgIEdpdmVuIHRoZSBuYW1lLCBmbiwgb2YgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMsIHRoaXMgZnVuY3Rpb24gYnVpbGRzIGEKKyAgbmV3IG5hbWUgb2YgdGhlIGZvcm0gIjxvbGRuYW1lPi5+PG4+fiIsIHdoZXJlIDxvbGRuYW1lPiBpcyBhcmd1bWVudCBuYW1lCisgIChmbiksIGFuZCA8bj4gaXMgYSB2ZXJzaW9uIG51bWJlciwgb25lIGhpZ2hlciB0aGFuIGFueSBleGlzdGluZyB2ZXJzaW9uCisgIG51bWJlciBmb3IgdGhhdCBmaWxlLCB1cCB0byA5OTk5OS4gIFRoaXMgZm9ybWF0IGlzIGNvbnNpc3RlbnQgd2l0aCB0aGF0IHVzZWQKKyAgYnkgR05VIEVNQUNTLiAgSWYgdGhlIGNvbnN0cnVjdGVkIG5hbWUgaXMgdG9vIGxvbmcgZm9yIHRoZSBzeXN0ZW0ncyBtYXhpbXVtLAorICBlbm91Z2ggY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGZyb20gdGhlIGVuZCBvZiA8Zm4+IHRvIGFsbG93IHRoZSB2ZXJzaW9uCisgIG51bWJlciB0byBmaXQuICBJZiBubyBmcmVlIHZlcnNpb24gbnVtYmVycyBleGlzdCBiZXR3ZWVuIDEgYW5kIDk5OTk5LCBhCisgIHZlcnNpb24gbnVtYmVyIG9mICJ4eHh4IiBpcyB1c2VkLiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBuYW1lIGluCisgIGFyZ3VtZW50IHMuCisqLworI2lmZGVmIHBkcDExCisjZGVmaW5lIFpORVdOQkwgNjMgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSBidWZmZXIgbGVuZ3RoICovCisjZGVmaW5lIFpORVdOTUQgMyAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4IGRpZ2l0cyBmb3IgdmVyc2lvbiBudW1iZXIgKi8KKyNlbHNlCisjZGVmaW5lIFpORVdOQkwgQ0tNQVhQQVRICisjZGVmaW5lIFpORVdOTUQgNAorI2VuZGlmIC8qIHBkcDExICovCisKKyNkZWZpbmUgTUFYQlVESUdJVFMgNQorCitzdGF0aWMgY2hhciB6bmV3YnVmW1pORVdOQkwrMTJdOworCitWT0lECit6bmV3bihmbixzKSBjaGFyICpmbiwgKipzOyB7CisgICAgY2hhciAqIGJ1ZjsJCQkJLyogUG9pbnRlciB0byBidWZmZXIgZm9yIG5ldyBuYW1lICovCisgICAgY2hhciAqIHhwLCAqIG5hbWVwYXJ0ID0gTlVMTDsgICAgICAgLyogUG9pbnRlciB0byBmaWxlbmFtZSBwYXJ0ICovCisgICAgc3RydWN0IHpmbmZwICogZm5mcDsgICAgICAgICAgICAgICAgLyogem5mcWZwKCkgcmVzdWx0IHN0cnVjdCBwb2ludGVyICovCisgICAgaW50IGQgPSAwLCB0LCBmbmxlbiwgYnVmbGVuOworICAgIGludCBuLCBpLCBrLCBmbGFnLCBzdGF0ZTsKKyAgICBpbnQgbWF4ID0gTUFYTkFNTEVOOyAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIG5hbWUgbGVuZ3RoICovCisgICAgY2hhciAqIGRuYW1lID0gTlVMTDsKKworICAgIGJ1ZiA9IHpuZXdidWY7CisgICAgKnMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSByZXR1cm4gdmFsdWUgKi8KKyAgICBpZiAoIWZuKSBmbiA9ICIiOyAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmaWxlbmFtZSBhcmd1bWVudCAqLworICAgIGkgPSBzdHJsZW4oZm4pOworCisvKiBJZiBpbmNvbWluZyBmaWxlIGFscmVhZHkgaGFzIGEgYmFja3VwIHN1ZmZpeCwgcmVtb3ZlIGl0LiAqLworLyogVGhlbiB3ZSdsbCB0YWNrIGEgbmV3IG9uIGxhdGVyLCB3aGljaCB3aWxsIGJlIHRoZSBoaWdoZXN0IGZvciB0aGlzIGZpbGUuICovCisKKyAgICBpZiAoaSA8PSBtYXggJiYgaSA+IDAgJiYgZm5baS0xXSA9PSAnficpIHsKKwljaGFyICogcDsKKwlpLS07CisJZGVidWcoRjExMSwiem5ld24gc3VmZml4IHJlbW92YWwiLGZuLGkpOworCWlmICgoZG5hbWUgPSAoY2hhciAqKW1hbGxvYyhpKzEpKSkgeworCSAgICBja3N0cm5jcHkoZG5hbWUsZm4saSsxKTsKKwkgICAgcCA9IGRuYW1lOworCSAgICBmb3IgKGZsYWcgPSBzdGF0ZSA9IDA7ICghZmxhZyAmJiAoaSA+IDApKTsgaS0tKSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJICBjYXNlIDA6CQkvKiBTdGF0ZSAwIC0gZmluYWwgY2hhciAqLworCQkgICAgaWYgKHBbaV0gPT0gJ34nKQkvKiBJcyB0aWxkZSAqLworCQkgICAgICBzdGF0ZSA9IDE7CS8qIFN3aXRjaCB0byBuZXh0IHN0YXRlICovCisJCSAgICBlbHNlCQkvKiBPdGhlcndpc2UgKi8KKwkJICAgICAgZmxhZyA9IDE7CQkvKiBRdWl0IC0gbm8gYmFja3VwIHN1ZmZpeC4gKi8KKwkJICAgIGJyZWFrOworCQkgIGNhc2UgMToJCS8qIFN0YXRlIDEgLSBkaWdpdHMgKi8KKwkJICAgIGlmIChwW2ldID09ICd+JyAgJiYgcFtpLTFdID09ICcuJykgeyAvKiBIYXZlIHN1ZmZpeCAqLworCQkJcFtpLTFdID0gTlVMOwkvKiBUcmltIGl0ICovCisJCQlmbiA9IGRuYW1lOworCQkJZGVidWcoRjExMSwiem5ld24gc3VmZml4IHJlbW92YWwgMiIsZm4saSk7CisJCQlmbGFnID0gMTsJLyogZG9uZSAqLworCQkgICAgfSBlbHNlIGlmIChwW2ldID49ICcwJyAmJiBwW2ldIDw9ICc5JykgeyAvKiBOdW1iZXIgcGFydCAqLworCQkJY29udGludWU7CS8qIEtlZXAgZ29pbmcgKi8KKwkJICAgIH0gZWxzZSB7CQkvKiBTb21ldGhpbmcgZWxzZSAqLworCQkJZmxhZyA9IDE7CS8qIE5vdCBhIGJhY2t1cCBzdWZmaXggLSBxdWl0LiAqLworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKChmbmxlbiA9IHN0cmxlbihmbikpIDwgMSkgewkvKiBHZXQgbGVuZ3RoICovCisJaWYgKGRuYW1lKSBmcmVlKGRuYW1lKTsKKwlyZXR1cm47CisgICAgfQorICAgIGRlYnVnKEYxMTEsInpuZXduIixmbixmbmxlbik7CisKKyAgICBkZWJ1ZyhGMTAxLCJ6bmV3biBtYXggMSIsIiIsbWF4KTsKKyAgICBpZiAobWF4IDwgMTQpIG1heCA9IDE0OyAgICAgICAgICAgICAvKiBNYWtlIG1heCByZWFzb25hYmxlIGZvciBhbnkgVU5JWCAqLworICAgIGlmIChtYXggPiBaTkVXTkJMKSBtYXggPSBaTkVXTkJMOworICAgIGRlYnVnKEYxMDEsInpuZXduIG1heCAyIiwiIixtYXgpOworCisgICAgaWYgKChmbmZwID0gemZucWZwKGZuLCBaTkVXTkJMLCBidWYpKSkgeyAvKiBHZXQgZnVsbHkgcXVhbGlmaWVkIG5hbWUgKi8KKyAgICAgICAgbmFtZXBhcnQgPSBmbmZwLT5mbmFtZTsgICAgICAgICAvKiBJc29sYXRlIHRoZSBmaWxlbmFtZSAqLworICAgICAgICBrID0gc3RybGVuKGZuKTsgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBuYW1lIHBhcnQgKi8KKyAgICAgICAgZGVidWcoRjExMSwiem5ld24gbmFtZXBhcnQiLG5hbWVwYXJ0LGspOworICAgIH0gZWxzZSB7CisJaWYgKGRuYW1lKSBmcmVlKGRuYW1lKTsKKwlyZXR1cm47CisgICAgfQorICAgIGJ1ZmxlbiA9IGZuZnAtPmxlbjsgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBmdWxseSBxdWFsaWZpZWQgbmFtZSAqLworICAgIGRlYnVnKEYxMTEsInpuZXduIGxlbiIsYnVmLGJ1Zmxlbik7CisKKyAgICBpZiAoayArIE1BWEJVRElHSVRTICsgMyA8IG1heCkgeyAgICAvKiBCYWNrdXAgbmFtZSBmaXRzIC0gbm8gb3ZlcmZsb3cgKi8KKwkvKiBNYWtlIHBhdHRlcm4gZm9yIGJhY2t1cCBuYW1lcyAqLworICAgICAgICBja3N0cm5jcHkoYnVmK2J1ZmxlbiwiLn4qfiIsWk5FV05CTCsxMi1idWZsZW4pOworICAgICAgICBuID0gbnp4cGFuZChidWYsWlhfRklMT05MWSk7ICAgIC8qIEV4cGFuZCB0aGUgcGF0dGVybiAqLworICAgICAgICBkZWJ1ZyhGMTExLCJ6bmV3biBBIG1hdGNoZXMiLGJ1ZixuKTsKKyAgICAgICAgd2hpbGUgKG4tLSA+IDApIHsgICAgICAgICAgICAgICAvKiBGaW5kIGFueSBleGlzdGluZyBuYW1lLn5ufiBmaWxlcyAqLworICAgICAgICAgICAgeHAgPSAqbXRjaHB0cisrOyAgICAgICAgICAgIC8qIFBvaW50IGF0IG1hdGNoaW5nIG5hbWUgKi8KKyAgICAgICAgICAgIHQgPSBhdG9pKHhwK2J1ZmxlbisyKTsgICAgICAvKiBHZXQgbnVtYmVyICovCisgICAgICAgICAgICBpZiAodCA+IGQpIGQgPSB0OyAgICAgICAgICAgLyogU2F2ZSBkID0gaGlnaGVzdCB2ZXJzaW9uIG51bWJlciAqLworICAgICAgICB9CisgICAgICAgIHNwcmludGYoYnVmK2J1ZmxlbiwiLn4lZH4iLGQrMSk7IC8qIFllcywgbWFrZSAibmFtZS5+PGQrMT5+IiAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJ6bmV3biBBIG5ld25hbWUiLGJ1ZiwwKTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrdXAgbmFtZSB3b3VsZCBiZSB0b28gbG9uZyAqLworICAgICAgICBpbnQgeGxlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvIHdlIGhhdmUgdG8gZWF0IGJhY2sgaW50byBpdCAqLworICAgICAgICBpbnQgZGVsdGE7CisgICAgICAgIGNoYXIgYnVmMltaTkVXTkJMKzEyXTsKKworICAgICAgICBkZWx0YSA9IG1heCAtIGs7CisgICAgICAgIGRlYnVnKEYxMDEsInpuZXduIEIgZGVsdGEiLCIiLGRlbHRhKTsKKworICAgICAgICBmb3IgKGkgPSBNQVhCVURJR0lUUzsgaSA+IDA7IGktLSkgeyAvKiBJbiB0aGlzIGNhc2UgdGhlIGZvcm1hdCBvZiAqLworICAgICAgICAgICAgY2tzdHJuY3B5KGJ1ZjIsYnVmLFpORVdOQkwrMTIpOyAvKiB0aGUgYmFja3VwIG5hbWUgZGVwZW5kcyBvbiAqLworICAgICAgICAgICAgeGxlbiA9IGJ1ZmxlbiAtIGkgLSAzICsgZGVsdGE7ICAvKiBob3cgbWFueSBkaWdpdHMgYXJlIGluIHRoZSAqLworICAgICAgICAgICAgY2tzdHJuY3B5KGJ1ZjIreGxlbiwiLn4qfiIsWk5FV05CTCsxMi14bGVuKTsgLyogYmFja3VwIG51bWJlciAqLworICAgICAgICAgICAgbiA9IG56eHBhbmQoYnVmMixaWF9GSUxPTkxZKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsInpuZXduIEIgbWF0Y2hlcyIsYnVmMixuKTsKKyAgICAgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKG4tLSA+IDApIHsgICAgICAgICAgICAgICAvKiBGaW5kIGFueSBleGlzdGluZyBuYW1lLn5ufiBmaWxlcyAqLworICAgICAgICAgICAgeHAgPSAqbXRjaHB0cisrOyAgICAgICAgICAgIC8qIFBvaW50IGF0IG1hdGNoaW5nIG5hbWUgKi8KKyAgICAgICAgICAgIHQgPSBhdG9pKHhwK3hsZW4rMik7ICAgICAgICAvKiBHZXQgbnVtYmVyICovCisgICAgICAgICAgICBpZiAodCA+IGQpIGQgPSB0OyAgICAgICAgICAgLyogU2F2ZSBkID0gaGlnaGVzdCB2ZXJzaW9uIG51bWJlciAqLworICAgICAgICB9CisgICAgICAgIGlmIChkID4gMCkgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIG9kb21ldGVyIHR1cm5lZCBvdmVyLi4uICovCisgICAgICAgICAgaWYgKChkICUgMTApID09IDkpICAgICAgICAgICAgLyogYmFjayB1cCBvbmUgc3BhY2UuICovCisgICAgICAgICAgICB4bGVuLS07CisgICAgICAgIHNwcmludGYoYnVmMit4bGVuLCIufiVkfiIsZCsxKTsgLyogVGhpcyBqdXN0IGZpdHMgKi8KKyAgICAgICAgY2tzdHJuY3B5KGJ1ZixidWYyLFpORVdOQkwrMTIpOwkvKiAod2UgY291bGQgYmUgbW9yZSBjbGV2ZXIgaGVyZS4uLikgKi8KKyAgICAgICAgZGVidWcoRjExMCwiem5ld24gQiBuZXcgbmFtZSIsYnVmLDApOworICAgIH0KKyAgICAqcyA9IGJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBuZXcgbmFtZSAqLworICAgIGNrX3puZXduID0gZCsxOyAgICAgICAgICAgICAgICAgICAgIC8qIEFsc28gbWFrZSBpdCBhdmFpbGFibGUgZ2xvYmFsbHkgKi8KKyAgICBpZiAoZG5hbWUpIGZyZWUoZG5hbWUpOworICAgIHJldHVybjsKK30KKworLyogIFogUiBFIE4gQSBNIEUgIC0tICBSZW5hbWUgYSBmaWxlICAqLworLyoKKyAgIENhbGwgd2l0aCBvbGQgYW5kIG5ldyBuYW1lcy4KKyAgIElmIG5ldyBuYW1lIGlzIHRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5LCB0aGUgJ29sZCcgZmlsZSBpcyBtb3ZlZCB0bworICAgdGhhdCBkaXJlY3RvcnkuCisgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyovCitpbnQKK3pyZW5hbWUob2xkLG5ldykgY2hhciAqb2xkLCAqbmV3OyB7CisgICAgY2hhciAqcCwgKnM7CisgICAgaW50IHg7CisKKyAgICBpZiAoIW9sZCkgb2xkID0gIiI7CisgICAgaWYgKCFuZXcpIG5ldyA9ICIiOworICAgIGRlYnVnKEYxMTAsInpyZW5hbWUgb2xkIixvbGQsMCk7CisgICAgZGVidWcoRjExMCwienJlbmFtZSBuZXciLG5ldywwKTsKKyAgICBpZiAoISpvbGQpIHJldHVybigtMSk7CisgICAgaWYgKCEqbmV3KSByZXR1cm4oLTEpOworCisjaWZkZWYgSUtTRAorI2lmZGVmIENLX0xPR0lOCisgICAgaWYgKGluc2VydmVyICYmIGlzZ3Vlc3QpCisgICAgICByZXR1cm4oLTEpOworI2VuZGlmIC8qIENLX0xPR0lOICovCisjZW5kaWYgLyogSUtTRCAqLworCisjaWZkZWYgQ0tST09UCisgICAgZGVidWcoRjExMSwienJlbmFtZSBzZXRyb290Iixja3Jvb3QsY2tyb290c2V0KTsKKyAgICBpZiAoY2tyb290c2V0KSB7CisJaWYgKCF6aW5yb290KG9sZCkpIHsKKwkgICAgZGVidWcoRjExMCwienJlbmFtZSBvbGQ6IHNldHJvb3QgdmlvbGF0aW9uIixvbGQsMCk7CisJICAgIHJldHVybigtMSk7CisJfQorCWlmICghemlucm9vdChuZXcpKSB7CisJICAgIGRlYnVnKEYxMTAsInpyZW5hbWUgbmV3OiBzZXRyb290IHZpb2xhdGlvbiIsbmV3LDApOworCSAgICByZXR1cm4oLTEpOworCX0KKyAgICB9CisjZW5kaWYgLyogQ0tST09UICovCisKKyAgICBwID0gTlVMTDsKKyAgICBzID0gbmV3OworCisgICAgaWYgKGlzZGlyKG5ldykpIHsKKyAgICAgICAgY2hhciAqcSA9IE5VTEw7CisgICAgICAgIHggPSBzdHJsZW4obmV3KTsKKyAgICAgICAgaWYgKCEocCA9IG1hbGxvYyhzdHJsZW4obmV3KSArIHN0cmxlbihvbGQpICsgMikpKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIHN0cmNweShwLG5ldyk7ICAgICAgICAgICAgICAgICAgLyogKHNhZmUpIERpcmVjdG9yeSBwYXJ0ICovCisgICAgICAgIGlmICghSVNESVJTRVAoKihuZXcreC0xKSkpICAgICAgLyogU2VwYXJhdG9yLCBpZiBuZWVkZWQgKi8KKyAgICAgICAgICBzdHJjYXQocCwiLyIpOwkJLyogKHNhZmUpICovCisgICAgICAgIHpzdHJpcChvbGQsJnEpOyAgICAgICAgICAgICAgICAgLyogU3RyaXAgcGF0aCBwYXJ0IGZyb20gb2xkIG5hbWUgKi8KKyAgICAgICAgc3RyY2F0KHAscSk7ICAgICAgICAgICAgICAgICAgICAvKiBjYXQgdG8gbmV3IGRpcmVjdG9yeSAoc2FmZSkgKi8KKyAgICAgICAgcyA9IHA7CisgICAgICAgIGRlYnVnKEYxMTAsInpyZW5hbWUgZGlyIixzLDApOworICAgIH0KKyNpZmRlZiBERUJVRworICAgIGVsc2UgZGVidWcoRjExMCwienJlbmFtZSBubyBkaXIiLHMsMCk7CisjZW5kaWYgLyogREVCVUcgKi8KKworI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIgJiYgKCFFTkFCTEVEKGVuX2RlbCkpKSB7CisJaWYgKHpjaGtpKHMpID4gLTEpCQkvKiBEZXN0aW5hdGlvbiBmaWxlIGV4aXN0cz8gKi8KKwkgIHJldHVybigtMSk7CisgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKworICAgIHggPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBjb2RlLiAqLworI2lmZGVmIFJFTkFNRQorLyogQXRvbWljLCBwcmVmZXJyZWQsIHVzZXMgYSBzaW5nbGUgc3lzdGVtIGNhbGwsIHJlbmFtZSgpLCBpZiBhdmFpbGFibGUuICovCisgICAgeCA9IHJlbmFtZShvbGQscyk7CisgICAgZGVidWcoRjExMSwienJlbmFtZSByZW5hbWUoKSIsb2xkLHgpOworICAgIGlmICh4KSB4ID0gLTE7CisjZW5kaWYgLyogUkVOQU1FICovCisKKyAgICAvKiBJZiByZW5hbWUoKSBmYWlsZWQgb3Igbm90IGF2YWlsYWJsZSB0cnkgbGluaygpL3VubGluaygpICovCisKKyAgICBpZiAoeCA8IDApIHsKKwlpZiAoemNoa28ob2xkKSA+IC0xKSB7CQkvKiBSZXF1aXJlcyB3cml0ZSBhY2Nlc3MgdG8gb3JpZ25hbCAqLworCSAgICB4ID0gbGluayhvbGQscyk7CisJICAgIGRlYnVnKEYxMTEsInpyZW5hbWUgbGluaygpIixvbGQseCk7CisJICAgIGlmICh4ID4gLTEpIHsJCS8qIE1ha2UgYSBsaW5rIHdpdGggdGhlIG5ldyBuYW1lLiAqLworCQl4ID0gdW5saW5rKG9sZCk7CisJCWRlYnVnKEYxMTEsInpyZW5hbWUgdW5saW5rKCkiLG9sZCx4KTsKKwkgICAgfQorCSAgICAvKiBJZiBsaW5rL3VubGluayBmYWlsZWQgY29weSBhbmQgZGVsZXRlICovCisJICAgIGlmICh4IDwgMCkgeworCQl4ID0gemNvcHkob2xkLHMpOworCQlkZWJ1ZyhGMTExLCJ6cmVuYW1lIHpjb3B5KCkiLG9sZCx4KTsKKwkJaWYgKHggPiAtMSkgeworCQkgICAgeCA9IHpkZWxldChvbGQpOworCQkgICAgZGVidWcoRjExMSwienJlbmFtZSB6ZGVsZXQoKSIsb2xkLHgpOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICAgIGZ1bGxuYW1lWzBdID0gJ1wwJzsJCQkvKiBDbGVhciB0aGlzIG91dCBmb3IgbmV4dCB0aW1lLiAqLworCisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX0ZDICYmIGNreGxvZ2dpbmcpIHsKKyAgICAgICAgemZucWZwKG9sZCxDS01BWFBBVEgsZnVsbG5hbWUpOworICAgICAgICB0bXAyWzBdID0gJ1wwJzsKKyAgICAgICAgemZucWZwKHMsQ0tNQVhQQVRILHRtcDIpOworICAgICAgICBpZiAoeCA+IC0xKQorICAgICAgICAgIHN5c2xvZyhMT0dfSU5GTywiZmlsZVtdICVzOiByZW5hbWVkIHRvICVzIG9rIiwgZnVsbG5hbWUsIHRtcDIpOworICAgICAgICBlbHNlCisgICAgICAgICAgc3lzbG9nKExPR19JTkZPLCJmaWxlW10gJXM6IHJlbmFtZSB0byAlcyBmYWlsZWQgKCVtKSIsZnVsbG5hbWUsdG1wMik7CisgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisKKyAgICBpZiAocCkgZnJlZShwKTsKKyAgICByZXR1cm4oeCk7Cit9CisKKy8qICBaIEMgTyBQIFkgIC0tICBDb3B5IGEgc2luZ2xlIGZpbGUuICovCisvKgorICBDYWxsIHdpdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBuYW1lcy4KKyAgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIHRoZSBzb3VyY2UgZmlsZSBpcworICBjb3BpZWQgdG8gdGhhdCBkaXJlY3Rvcnkgd2l0aCBpdHMgb3JpZ2luYWwgbmFtZS4KKyAgUmV0dXJuczoKKyAgIDAgb24gc3VjY2Vzcy4KKyAgPDAgb24gZmFpbHVyZToKKyAgLTIgPSBzb3VyY2UgZmlsZSBpcyBub3QgYSByZWd1bGFyIGZpbGUuCisgIC0zID0gc291cmNlIGZpbGUgbm90IGZvdW5kLgorICAtNCA9IHBlcm1pc3Npb24gZGVuaWVkLgorICAtNSA9IHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIHRoZSBzYW1lIGZpbGUuCisgIC02ID0gaS9vIGVycm9yLgorICAtMSA9IG90aGVyIGVycm9yLgorKi8KK2ludAoremNvcHkoc291cmNlLGRlc3RpbmF0aW9uKSBjaGFyICpzb3VyY2UsICpkZXN0aW5hdGlvbjsgeworICAgIGNoYXIgKnNyYywgKmRzdDsJCQkvKiBMb2NhbCBwb2ludGVycyB0byBmaWxlbmFtZXMgKi8KKyAgICBpbnQgeCwgeSwgcmM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBXb3JrZXJzICovCisgICAgaW50IGluID0gLTEsIG91dCA9IC0xOyAgICAgICAgICAgICAgLyogaS9vIGZpbGUgZGVzY3JpcHRvcnMgKi8KKyAgICBzdHJ1Y3Qgc3RhdCBzcmNidWY7ICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgZmlsZSBpbmZvIGJ1ZmZlciAqLworICAgIGludCBwZXJtczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBmaWxlIHBlcm1pc3Npb25zICovCisgICAgY2hhciBidWZbMTAyNF07ICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSBjb3B5aW5nIGJ1ZmZlciAqLworCisgICAgaWYgKCFzb3VyY2UpIHNvdXJjZSA9ICIiOworICAgIGlmICghZGVzdGluYXRpb24pIGRlc3RpbmF0aW9uID0gIiI7CisKKyAgICBkZWJ1ZyhGMTEwLCJ6Y29weSBzcmMgYXJnIixzb3VyY2UsMCk7CisgICAgZGVidWcoRjExMCwiemNvcHkgZHN0IGFyZyIsZGVzdGluYXRpb24sMCk7CisKKyAgICBpZiAoISpzb3VyY2UpIHJldHVybigtMSk7CisgICAgaWYgKCEqZGVzdGluYXRpb24pIHJldHVybigtMSk7CisKKyNpZmRlZiBJS1NECisjaWZkZWYgQ0tfTE9HSU4KKyAgICBpZiAoaW5zZXJ2ZXIgJiYgaXNndWVzdCkKKyAgICAgIHJldHVybigtNCk7CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyNlbmRpZiAvKiBJS1NEICovCisKKyNpZmRlZiBDS1JPT1QKKyAgICBkZWJ1ZyhGMTExLCJ6Y29weSBzZXRyb290Iixja3Jvb3QsY2tyb290c2V0KTsKKyAgICBpZiAoY2tyb290c2V0KSB7CisJaWYgKCF6aW5yb290KHNvdXJjZSkpIHsKKwkgICAgZGVidWcoRjExMCwiemNvcHkgc291cmNlOiBzZXRyb290IHZpb2xhdGlvbiIsc291cmNlLDApOworCSAgICByZXR1cm4oLTEpOworCX0KKwlpZiAoIXppbnJvb3QoZGVzdGluYXRpb24pKSB7CisJICAgIGRlYnVnKEYxMTAsInpjb3B5IGRlc3RpbmF0aW9uOiBzZXRyb290IHZpb2xhdGlvbiIsZGVzdGluYXRpb24sMCk7CisJICAgIHJldHVybigtMSk7CisJfQorICAgIH0KKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworICAgIHNyYyA9IHNvdXJjZTsKKyAgICBkc3QgPSBkZXN0aW5hdGlvbjsKKworICAgIGlmIChzdGF0KHNyYywmc3JjYnVmKSA9PSAwKSB7ICAgICAgIC8qIEdldCBzb3VyY2UgZmlsZSBpbmZvICovCisgICAgICAgIHN0cnVjdCBzdGF0IGRzdGJ1ZjsgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gZmlsZSBpbmZvIGJ1ZmZlciAqLworCWRlYnVnKEYxMDEsIlNUQVQiLCIiLDYpOworICAgICAgICBpZiAoc3RhdChkc3QsJmRzdGJ1ZikgPT0gMCkgeworCSAgICBkZWJ1ZyhGMTAxLCJTVEFUIiwiIiw3KTsKKyAgICAgICAgICAgIGlmIChzcmNidWYuc3RfZGV2ID09IGRzdGJ1Zi5zdF9kZXYpCisgICAgICAgICAgICAgIGlmIChzcmNidWYuc3RfaW5vID09IGRzdGJ1Zi5zdF9pbm8pIHsKKyAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsInpjb3B5IGZpbGVzIGlkZW50aWNhbDogc3RhdCgpIiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybigtNSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXQoKSBmYWlsZWQuLi4gKi8KKwlkZWJ1ZyhGMTAxLCJTVEFUIiwiIiw4KTsKKyAgICAgICAgZGVidWcoRjExMSwic291cmNlIGZpbGUgbm90IGZvdW5kIixzcmMsZXJybm8pOworICAgICAgICByZXR1cm4oLTMpOworICAgIH0KKyAgICBmdWxsbmFtZVswXSA9ICdcMCc7ICAgICAgICAgICAgICAgICAvKiBHZXQgZnVsbCBwYXRobmFtZXMgKi8KKyAgICBpZiAoemZucWZwKHNvdXJjZSxDS01BWFBBVEgsZnVsbG5hbWUpKQorICAgICAgc3JjID0gZnVsbG5hbWU7CisgICAgZGVidWcoRjExMCwiemNvcHkgc3JjIixzcmMsMCk7CisgICAgdG1wMlswXSA9ICdcMCc7CisgICAgaWYgKHpmbnFmcChkZXN0aW5hdGlvbixDS01BWFBBVEgsdG1wMikpCisgICAgICBkc3QgPSB0bXAyOworICAgIGRlYnVnKEYxMTAsInpjb3B5IGRzdCAxIixkc3QsMCk7CisgICAgaWYgKCFzdHJjbXAoc3JjLGRzdCkpIHsgICAgICAgICAgICAgLyogU3JjIGFuZCBkc3QgYXJlIHNhbWUgZmlsZT8gKi8KKyAgICAgICAgZGVidWcoRjEwMCwiemNvcHkgZmlsZXMgaWRlbnRpY2FsOiBzdHJjbXAoKSIsIiIsMCk7IC8qIFRoaXMuLi4gKi8KKyAgICAgICAgcmV0dXJuKC01KTsgICAgICAgICAgICAgICAgICAgICAvKiBzaG91bGQgbm90IGhhcHBlbi4gKi8KKyAgICB9CisgICAgaWYgKGlzZGlyKHNyYykpIHsgICAgICAgICAgICAgICAgICAgLyogU291cmNlIGZpbGUgaXMgYSBkaXJlY3Rvcnk/ICovCisgICAgICAgIGRlYnVnKEYxMTAsInpjb3B5IHNvdXJjZSBpcyBkaXJlY3RvcnkiLHNyYywwKTsKKyAgICAgICAgcmV0dXJuKC0yKTsgICAgICAgICAgICAgICAgICAgICAvKiBGYWlsICovCisgICAgfQorICAgIGlmIChpc2Rpcihkc3QpKSB7ICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5PyAqLworICAgICAgICBjaGFyICpxID0gTlVMTDsgICAgICAgICAgICAgICAgIC8qIFllcywgYWRkIGZpbGVuYW1lIHRvIGl0LiAqLworICAgICAgICB4ID0gc3RybGVuKGRzdCk7CisJaWYgKHggPCAxKSByZXR1cm4oLTEpOworICAgICAgICBpZiAoIUlTRElSU0VQKCooZHN0K3gtMSkpKSB7ICAgIC8qIEFkZCBzZXBhcmF0b3IgaWYgbmVlZGVkICovCisgICAgICAgICAgICB0bXAyW3grK10gPSAnLyc7CisgICAgICAgICAgICB0bXAyW3hdID0gJ1wwJzsKKyAgICAgICAgfQorCWRlYnVnKEYxMTEsInpjb3B5IGRzdCAyIixkc3QseCk7CisgICAgICAgIHpzdHJpcChzcmMsJnEpOyAgICAgICAgICAgICAgICAgLyogU3RyaXAgcGF0aCBwYXJ0IGZyb20gb2xkIG5hbWUgKi8KKyAgICAgICAgY2tzdHJuY3B5KHRtcDIreCxxLENLTUFYUEFUSC14KTsgLyogQ29uY2F0ZW5hdGUgaXQgdG8gbmV3IG5hbWUgKi8KKyAgICB9CisgICAgZGVidWcoRjExMCwiemNvcHkgZHN0IDMiLGRzdCwwKTsKKworI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIgJiYgKCFFTkFCTEVEKGVuX2RlbCkpKSB7CisJaWYgKHpjaGtpKGRzdCkgPiAtMSkJCS8qIERlc3RpbmF0aW9uIGZpbGUgZXhpc3RzPyAqLworCSAgcmV0dXJuKC00KTsKKyAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgcGVybXMgPSB1bWFzaygwKTsgICAgICAgICAgICAgICAgICAgLyogR2V0IHVzZXIncyB1bWFzayAqLworICAgIHVtYXNrKHBlcm1zKTsJCQkvKiBQdXQgaXQgYmFjayEgKi8KKyAgICBwZXJtcyBePSAwNzc3OyAgICAgICAgICAgICAgICAgICAgICAvKiBGbGlwIHRoZSBiaXRzICovCisgICAgcGVybXMgJj0gMDY2NjsgICAgICAgICAgICAgICAgICAgICAgLyogWmVybyBleGVjdXRlIGJpdHMgZnJvbSB1bWFzayAqLworICAgIHBlcm1zIHw9IChzcmNidWYuc3RfbW9kZSAmIDAxMTEpOyAgIC8qIE9SIGluIHNvdXJjZSBmaWxlJ3MgZXhlY3V0ZSBiaXRzICovCisgICAgcmMgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCByZXR1cm4gY29kZSAqLworICAgIGVycm5vID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGVycm5vICovCisgICAgaW4gPSBvcGVuKHNyYywgT19SRE9OTFksIDApOyAgICAgICAgLyogT3BlbiBzb3VyY2UgZmlsZSAqLworICAgIGRlYnVnKEYxMTEsInpjb3B5IG9wZW4gc291cmNlIixzcmMsaW4pOworICAgIGlmIChpbiA+IC0xKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIElmIG9wZW4uLi4gKi8KKwkvKiBPcGVuIGRlc3RpbmF0aW9uIGZpbGUgKi8KKyNpZmRlZiBPX1RSVU5DCisgICAgICAgIG91dCA9IG9wZW4oZHN0LCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMsIHBlcm1zKTsKKyNlbHNlCisgICAgICAgIG91dCA9IG9wZW4oZHN0LCBPX1dST05MWXxPX0NSRUFULCBwZXJtcyk7CisjZW5kaWYgLyogT19UUlVOQyAqLworICAgICAgICBkZWJ1ZyhGMTExLCJ6Y29weSBvcGVuIGRlc3QiLGRzdCxvdXQpOworICAgICAgICBpZiAob3V0ID4gLTEpIHsgICAgICAgICAgICAgICAgIC8qIElmIG9wZW4uLi4gKi8KKyAgICAgICAgICAgIHdoaWxlICgoeCA9IHJlYWQoaW4sYnVmLDEwMjQpKSA+IDApIHsgLyogQ29weSBpbiAxSyBibG9ja3MgKi8KKyAgICAgICAgICAgICAgICB5ID0gd3JpdGUob3V0LGJ1Zix4KTsKKyAgICAgICAgICAgICAgICBpZiAoeSA8IDApIHsgICAgICAgICAgICAvKiBPbiB3cml0ZSBmYWlsdXJlICovCisgICAgICAgICAgICAgICAgICAgIHggPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSAtNjsgICAgICAgICAgICAvKiBJbmRpY2F0ZSBpL28gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjEwMSwiemNvcHkgZmluYWwgcmVhZCIsIiIseCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6Y29weSBlcnJubyIsIiIsZXJybm8pOworICAgICAgICAgICAgcmMgPSAoeCA9PSAwKSA/IDAgOiAtNjsgICAgIC8qIEluIGNhc2Ugb2YgcmVhZCBmYWlsdXJlICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluID4gLTEpIGNsb3NlKGluKTsgICAgICAgICAgICAgLyogQ2xvc2UgZmlsZXMgKi8KKyAgICBpZiAob3V0ID4gLTEpIGNsb3NlKG91dCk7CisgICAgaWYgKHJjID09IC0xKSB7ICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHJldHVybiBjb2RlICovCisgICAgICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgICAgICBjYXNlIEVOT0VOVDogcmMgPSAtMzsgYnJlYWs7CisgICAgICAgICAgY2FzZSBFQUNDRVM6IHJjID0gLTQ7IGJyZWFrOworICAgICAgICAgIGNhc2UgRUlPOiAgICByYyA9IC02OworICAgICAgICB9CisgICAgfQorCisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpZiAocmMgPiAtMSAmJiBja3hzeXNsb2cgPj0gU1lTTEdfRkMgJiYgY2t4bG9nZ2luZykgeworICAgICAgICBpZiAocmMpCisgICAgICAgICAgc3lzbG9nKExPR19JTkZPLCJmaWxlW10gJXM6IGNvcHkgdG8gJXMgZmFpbGVkICglbSkiLCBmdWxsbmFtZSwgdG1wMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzeXNsb2coTE9HX0lORk8sImZpbGVbXSAlczogY29weSB0byAlcyBvayIsIGZ1bGxuYW1lLCB0bXAyKTsKKyAgICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKworICAgIHJldHVybihyYyk7Cit9CisKKy8qICBaIFMgQSBUIFQgUiAqLworLyoKKyBGaWxscyBpbiBhIEtlcm1pdCBmaWxlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUgZm9yIHRoZSBmaWxlIHdoaWNoIGlzIHRvIGJlIHNlbnQuCisgUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgd2l0aCB0aGUgc3RydWN0dXJlIGZpbGxlZCBpbiwgb3IgLTEgb24gZmFpbHVyZS4KKyBJZiBhbnkgc3RyaW5nIG1lbWJlciBpcyBudWxsLCB0aGVuIGl0IHNob3VsZCBiZSBpZ25vcmVkLgorIElmIGFueSBudW1lcmljIG1lbWJlciBpcyAtMSwgdGhlbiBpdCBzaG91bGQgYmUgaWdub3JlZC4KKyovCisjaWZkZWYgQ0tfUEVSTVMKKworI2lmZGVmIENLX0dQRVJNUworI3VuZGVmIENLX0dQRVJNUworI2VuZGlmIC8qIENLX0dQRVJNUyAqLworCisjaWZkZWYgVU5JWAorI2lmbmRlZiBTX0lSVVNSCisjZGVmaW5lIFNfSVJVU1IgMDQwMAorI2VuZGlmIC8qIFNfSVJVU1IgKi8KKyNpZm5kZWYgU19JV1VTUgorI2RlZmluZSBTX0lYVVNSIDAyMDAKKyNlbmRpZiAvKiBTX0lXVVNSICovCisjaWZuZGVmIFNfSVhVU1IKKyNkZWZpbmUgU19JWFVTUiAwMTAwCisjZW5kaWYgLyogU19JWFVTUiAqLworI2VuZGlmIC8qIFVOSVggKi8KKworI2lmZGVmIFNfSVJVU1IKKyNpZmRlZiBTX0lXVVNSCisjaWZkZWYgU19JWFVTUgorI2RlZmluZSBDS19HUEVSTVMKKyNlbmRpZiAvKiBTX0lYVVNSICovCisjZW5kaWYgLyogU19JV1VTUiAqLworI2VuZGlmIC8qIFNfSVJVU1IgKi8KKworc3RhdGljIGNoYXIgZ3Blcm1zWzJdOworCisjZW5kaWYgLyogQ0tfR1BFUk1TICovCisKK3N0YXRpYyBjaGFyIGxwZXJtc1syNF07CisKKyNpZmRlZiBDS19QRVJNUworc3RhdGljIGNoYXIgeGxwZXJtc1syNF07CisKKy8qICBaIFMgRSBUIFAgRSBSIE0gIC0tICBTZXQgcGVybWlzc2lvbnMgb2YgYSBmaWxlICAqLworCitpbnQKK3pzZXRwZXJtKGYsY29kZSkgY2hhciAqIGY7IGludCBjb2RlOyB7CisgICAgaW50IHg7CisjaWZkZWYgQ0tfU0NPMzJWNAorICAgIG1vZGVfdCBtYXNrOworI2Vsc2UKKyAgICBpbnQgbWFzazsKKyNlbmRpZiAvKiBDS19TQ08zMlY0ICovCisgICAgbWFzayA9IGNvZGU7CisgICAgaWYgKGluc2VydmVyICYmIGd1ZXN0KSB7CisJZGVidWcoRjExMCwienNldHBlcm0gZ3Vlc3QiLGYsMCk7CisJcmV0dXJuKDApOworICAgIH0KKyAgICB4ID0gY2htb2QoZixtYXNrKTsKKyAgICBpZiAoeCA8IDApIHsKKwlkZWJ1ZyhGMTExLCJ6c2V0cGVybSBlcnJvciIsZixlcnJubyk7CisJcmV0dXJuKDApOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ6c2V0cGVybSBvayIsZixtYXNrKTsKKyAgICByZXR1cm4oMSk7Cit9CisKKy8qICBaIEcgUCBFIFIgTSAgLS0gIEdldCBwZXJtaXNzaW9ucyBvZiBhIGZpbGUgYXMgYW4gb2N0YWwgc3RyaW5nICAqLworCitjaGFyICoKK3pncGVybShmKSBjaGFyICpmOyB7CisgICAgZXh0ZXJuIGludCBkaXJhY3RpdmU7CisgICAgaW50IHg7IGNoYXIgKnMgPSAoY2hhciAqKXhscGVybXM7CisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGRlYnVnKEYxMTAsInpncGVybSIsZiwwKTsKKyAgICBpZiAoIWYpIHJldHVybigiLS0tLS0tLS0tLSIpOworICAgIGlmICghKmYpIHJldHVybigiLS0tLS0tLS0tLSIpOworCisjaWZkZWYgQ0tST09UCisgICAgZGVidWcoRjExMSwiemdwZXJtIHNldHJvb3QiLGNrcm9vdCxja3Jvb3RzZXQpOworICAgIGlmIChja3Jvb3RzZXQpIGlmICghemlucm9vdChmKSkgeworCWRlYnVnKEYxMTAsInpncGVybSBzZXRyb290IHZpb2xhdGlvbiIsZiwwKTsKKwlyZXR1cm4oIi0tLS0tLS0tLS0iKTsKKyAgICB9CisjZW5kaWYgLyogQ0tST09UICovCisKKyNpZmRlZiBVU0VfTFNUQVQKKyAgICBpZiAoZGlyYWN0aXZlKQorICAgICAgeCA9IGxzdGF0KGYsJmJ1Zik7CisgICAgZWxzZQorI2VuZGlmIC8qIFVTRV9MU1RBVCAqLworICAgICAgeCA9IHN0YXQoZiwmYnVmKTsKKyAgICBkZWJ1ZyhGMTAxLCJTVEFUIiwiIiw5KTsKKyAgICBpZiAoeCA8IDApCisgICAgICByZXR1cm4oIi0tLS0tLS0tLS0iKTsKKyAgICBzcHJpbnRmKHMsIiVvIixidWYuc3RfbW9kZSk7CisgICAgZGVidWcoRjExMCwiemdwZXJtIixzLDApOworICAgIHJldHVybihzKTsKK30KKworLyogTGlrZSB6Z3Blcm0oKSBidXQgcmV0dXJucyBwZXJtaXNzaW9ucyBpbiAibHMgLWwiIHN0cmluZyBmb3JtYXQgKi8KKworc3RhdGljIGNoYXIgeHNwZXJtc1syNF07CisKK2NoYXIgKgoremlwZXJtKGYpIGNoYXIgKiBmOyB7CisgICAgZXh0ZXJuIGludCBkaXJhY3RpdmU7CisgICAgaW50IHg7IGNoYXIgKnMgPSAoY2hhciAqKXhzcGVybXM7CisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIHVuc2lnbmVkIGludCBwZXJtcyA9IDA7CisKKyAgICBkZWJ1ZyhGMTEwLCJ6aXBlcm0iLGYsMCk7CisKKyAgICBpZiAoIWYpIHJldHVybihOVUxMKTsKKyAgICBpZiAoISpmKSByZXR1cm4oTlVMTCk7CisKKyAgICBpZiAoZGlyYWN0aXZlICYmIHpnZnNfbW9kZSAhPSAwKSB7CisJcGVybXMgPSB6Z2ZzX21vZGU7CQkvKiB6Z2V0ZnMoKSBhbHJlYWR5IGdvdCB0aGVtICovCisgICAgfSBlbHNlIHsKKyNpZmRlZiBVU0VfTFNUQVQKKwlpZiAoZGlyYWN0aXZlKQorCSAgeCA9IGxzdGF0KGYsJmJ1Zik7CisJZWxzZQorI2VuZGlmIC8qIFVTRV9MU1RBVCAqLworCSAgeCA9IHN0YXQoZiwmYnVmKTsKKwlkZWJ1ZyhGMTAxLCJTVEFUIiwiIiwxMCk7CisJaWYgKHggPCAwKQorCSAgcmV0dXJuKCItLS0tLS0tLS0tIik7CisJcGVybXMgPSBidWYuc3RfbW9kZTsKKyAgICB9CisgICAgc3dpdGNoIChwZXJtcyAmIFNfSUZNVCkgeworICAgICAgY2FzZSBTX0lGRElSOgorICAgICAgICAqcysrID0gJ2QnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU19JRkNIUjogICAgICAgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXIgc3BlY2lhbCAqLworICAgICAgICAqcysrID0gJ2MnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU19JRkJMSzogICAgICAgICAgICAgICAgICAgICAvKiBCbG9jayBzcGVjaWFsICovCisgICAgICAgICpzKysgPSAnYic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTX0lGUkVHOiAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ3VsYXIgKi8KKyAgICAgICAgKnMrKyA9ICctJzsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgU19JRkxOSworICAgICAgY2FzZSBTX0lGTE5LOiAgICAgICAgICAgICAgICAgICAgIC8qIFN5bWJvbGljIGxpbmsgKi8KKyAgICAgICAgKnMrKyA9ICdsJzsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogU19JRkxOSyAqLworI2lmZGVmIFNfSUZTT0NLCisgICAgICBjYXNlIFNfSUZTT0NLOiAgICAgICAgICAgICAgICAgICAgLyogU29ja2V0ICovCisgICAgICAgICpzKysgPSAncyc7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFNfSUZTT0NLICovCisjaWZkZWYgU19JRklGTworI2lmbmRlZiBQbGFuOQorI2lmbmRlZiBDT0hFUkVOVAorICAgICAgY2FzZSBTX0lGSUZPOiAgICAgICAgICAgICAgICAgICAgIC8qIEZJRk8gKi8KKyAgICAgICAgKnMrKyA9ICdwJzsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBQbGFuOSAqLworI2VuZGlmIC8qIFNfSUZJRk8gKi8KKyNpZmRlZiBTX0lGV0hUCisgICAgICBjYXNlIFNfSUZXSFQ6ICAgICAgICAgICAgICAgICAgICAgLyogV2hpdGVvdXQgKi8KKyAgICAgICAgKnMrKyA9ICd3JzsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogU19JRldIVCAqLworICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVua25vd24gKi8KKyAgICAgICAgKnMrKyA9ICc/JzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChwZXJtcyAmIFNfSVJVU1IpICAgICAgICAgIC8qIE93bmVyJ3MgcGVybWlzc2lvbnMgKi8KKyAgICAgICpzKysgPSAncic7CisgICAgZWxzZQorICAgICAgKnMrKyA9ICctJzsKKyAgICBpZiAocGVybXMgJiBTX0lXVVNSKQorICAgICAgKnMrKyA9ICd3JzsKKyAgICBlbHNlCisgICAgICAqcysrID0gJy0nOworICAgIHN3aXRjaCAocGVybXMgJiAoU19JWFVTUiB8IFNfSVNVSUQpKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgICpzKysgPSAnLSc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTX0lYVVNSOgorICAgICAgICAqcysrID0gJ3gnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU19JU1VJRDoKKyAgICAgICAgKnMrKyA9ICdTJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNfSVhVU1IgfCBTX0lTVUlEOgorICAgICAgICAqcysrID0gJ3MnOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHBlcm1zICYgU19JUkdSUCkgICAgICAgICAgLyogR3JvdXAgcGVybWlzc2lvbnMgKi8KKyAgICAgICpzKysgPSAncic7CisgICAgZWxzZQorICAgICAgKnMrKyA9ICctJzsKKyAgICBpZiAocGVybXMgJiBTX0lXR1JQKQorICAgICAgKnMrKyA9ICd3JzsKKyAgICBlbHNlCisgICAgICAqcysrID0gJy0nOworICAgIHN3aXRjaCAocGVybXMgJiAoU19JWEdSUCB8IFNfSVNHSUQpKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgICpzKysgPSAnLSc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTX0lYR1JQOgorICAgICAgICAqcysrID0gJ3gnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU19JU0dJRDoKKyAgICAgICAgKnMrKyA9ICdTJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNfSVhHUlAgfCBTX0lTR0lEOgorICAgICAgICAqcysrID0gJ3MnOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHBlcm1zICYgU19JUk9USCkgICAgICAgICAgLyogV29ybGQgcGVybWlzc2lvbnMgKi8KKyAgICAgICpzKysgPSAncic7CisgICAgZWxzZQorICAgICAgKnMrKyA9ICctJzsKKyAgICBpZiAocGVybXMgJiBTX0lXT1RIKQorICAgICAgKnMrKyA9ICd3JzsKKyAgICBlbHNlCisgICAgICAqcysrID0gJy0nOworICAgIHN3aXRjaCAoCisjaWZkZWYgUGxhbjkKKyAgICAgICAgICAgIHBlcm1zICYgKFNfSVhPVEgpCisjZWxzZQorICAgICAgICAgICAgcGVybXMgJiAoU19JWE9USCB8IFNfSVNWVFgpCisjZW5kaWYKKyAgICAgICAgICAgICkgeworICAgICAgY2FzZSAwOgorICAgICAgICAqcysrID0gJy0nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU19JWE9USDoKKyAgICAgICAgKnMrKyA9ICd4JzsKKyAgICAgICAgYnJlYWs7CisjaWZuZGVmIFBsYW45CisgICAgICBjYXNlIFNfSVNWVFg6CisgICAgICAgICpzKysgPSAnVCc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTX0lYT1RIIHwgU19JU1ZUWDoKKyAgICAgICAgKnMrKyA9ICd0JzsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogUGxhbjkgKi8KKyAgICB9CisgICAgKnMgPSAnXDAnOworICAgIGRlYnVnKEYxMTAsInppcGVybSIseHNwZXJtcywwKTsKKyAgICByZXR1cm4oKGNoYXIgKil4c3Blcm1zKTsKK30KKworI2Vsc2UKKworY2hhciAqCit6Z3Blcm0oZikgY2hhciAqZjsgeworICAgIHJldHVybigiLS0tLS0tLS0tLSIpOworfQorY2hhciAqCit6aXBlcm1zKGYpIGNoYXIgKmY7IHsKKyAgICByZXR1cm4oIi0tLS0tLS0tLS0iKTsKK30KKyNlbmRpZiAvKiBDS19QRVJNUyAqLworCitpbnQKK3pzYXR0cih4eCkgc3RydWN0IHphdHRyICp4eDsgeworICAgIGxvbmcgazsgaW50IHg7CisgICAgc3RydWN0IHN0YXQgYnVmOworCisgICAgayA9IGlmbGVuICUgMTAyNEw7ICAgICAgICAgICAgICAgICAgLyogRmlsZSBsZW5ndGggaW4gSyAqLworICAgIGlmIChrICE9IDBMKSBrID0gMUw7CisgICAgeHgtPmxlbmd0aGsgPSAoaWZsZW4gLyAxMDI0TCkgKyBrOworICAgIHh4LT50eXBlLmxlbiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgdHlwZSBjYW4ndCBiZSBmaWxsZWQgaW4gaGVyZSAqLworICAgIHh4LT50eXBlLnZhbCA9ICIiOworICAgIGlmICgqbmFtYnVmKSB7CisgICAgICAgIHh4LT5kYXRlLnZhbCA9IHpmY2RhdChuYW1idWYpOyAgLyogRmlsZSBjcmVhdGlvbiBkYXRlICovCisgICAgICAgIHh4LT5kYXRlLmxlbiA9IChpbnQpc3RybGVuKHh4LT5kYXRlLnZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgeHgtPmRhdGUubGVuID0gMDsKKyAgICAgICAgeHgtPmRhdGUudmFsID0gIiI7CisgICAgfQorICAgIHh4LT5jcmVhdG9yLmxlbiA9IDA7ICAgICAgICAgICAgICAgIC8qIEZpbGUgY3JlYXRvciAqLworICAgIHh4LT5jcmVhdG9yLnZhbCA9ICIiOworICAgIHh4LT5hY2NvdW50LmxlbiA9IDA7ICAgICAgICAgICAgICAgIC8qIEZpbGUgYWNjb3VudCAqLworICAgIHh4LT5hY2NvdW50LnZhbCA9ICIiOworICAgIHh4LT5hcmVhLmxlbiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgYXJlYSAqLworICAgIHh4LT5hcmVhLnZhbCA9ICIiOworICAgIHh4LT5wYXNzd29yZC5sZW4gPSAwOyAgICAgICAgICAgICAgIC8qIEFyZWEgcGFzc3dvcmQgKi8KKyAgICB4eC0+cGFzc3dvcmQudmFsID0gIiI7CisgICAgeHgtPmJsa3NpemUgPSAtMUw7ICAgICAgICAgICAgICAgICAgLyogRmlsZSBibG9ja3NpemUgKi8KKyAgICB4eC0+eGFjY2Vzcy5sZW4gPSAwOyAgICAgICAgICAgICAgICAvKiBGaWxlIGFjY2VzcyAqLworICAgIHh4LT54YWNjZXNzLnZhbCA9ICIiOworICAgIHh4LT5lbmNvZGluZy5sZW4gPSAwOyAgICAgICAgICAgICAgIC8qIFRyYW5zZmVyIHN5bnRheCAqLworICAgIHh4LT5lbmNvZGluZy52YWwgPSAwOworICAgIHh4LT5kaXNwLmxlbiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIERpc3Bvc2l0aW9uIHVwb24gYXJyaXZhbCAqLworICAgIHh4LT5kaXNwLnZhbCA9ICIiOworICAgIHh4LT5scHJvdGVjdC5sZW4gPSAwOyAgICAgICAgICAgICAgIC8qIExvY2FsIHByb3RlY3Rpb24gKi8KKyAgICB4eC0+bHByb3RlY3QudmFsID0gIiI7CisgICAgeHgtPmdwcm90ZWN0LmxlbiA9IDA7ICAgICAgICAgICAgICAgLyogR2VuZXJpYyBwcm90ZWN0aW9uICovCisgICAgeHgtPmdwcm90ZWN0LnZhbCA9ICIiOworICAgIHggPSAtMTsKKyAgICBpZiAoKm5hbWJ1ZikgeCA9IHN0YXQobmFtYnVmLCZidWYpOworICAgIGRlYnVnKEYxMDEsIlNUQVQiLCIiLDExKTsKKyAgICBpZiAoeCA+PSAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsInpzYXR0ciBidWYuc3RfbW9kZSAmIDA3NzciLG5hbWJ1ZixidWYuc3RfbW9kZSAmIDA3NzcpOworICAgICAgICAvKiBVTklYIGZpbGVtb2RlIGFzIGFuIG9jdGFsIHN0cmluZyB3aXRob3V0IGZpbGV0eXBlIGJpdHMgKi8KKyAgICAgICAgc3ByaW50ZihscGVybXMsIiVvIixidWYuc3RfbW9kZSAmIDA3NzcpOworICAgICAgICB4eC0+bHByb3RlY3QubGVuID0gKGludClzdHJsZW4obHBlcm1zKTsKKyAgICAgICAgeHgtPmxwcm90ZWN0LnZhbCA9IChjaGFyICopbHBlcm1zOworICAgICAgICB4ID0gMDsKKyNpZmRlZiBDS19HUEVSTVMKKyAgICAgICAgLyogR2VuZXJpYyBwZXJtaXNzaW9ucyBvbmx5IGlmIHdlIGhhdmUgc3RhdC5oIHN5bWJvbHMgZGVmaW5lZCAqLworICAgICAgICBpZiAoYnVmLnN0X21vZGUgJiBTX0lSVVNSKSB4IHw9IDE7ICAgICAgLyogUmVhZCAqLworICAgICAgICBpZiAoYnVmLnN0X21vZGUgJiBTX0lXVVNSKSB4IHw9ICgyKzE2KTsgLyogV3JpdGUgYW5kIERlbGV0ZSAqLworICAgICAgICBpZiAoYnVmLnN0X21vZGUgJiBTX0lYVVNSKSB4IHw9IDQ7ICAgICAgLyogRXhlY3V0ZSAqLworICAgICAgICBncGVybXNbMF0gPSB0b2NoYXIoeCk7CisgICAgICAgIGdwZXJtc1sxXSA9IE5VTDsKKyAgICAgICAgeHgtPmdwcm90ZWN0LmxlbiA9IDE7CisgICAgICAgIHh4LT5ncHJvdGVjdC52YWwgPSAoY2hhciAqKWdwZXJtczsKKyNlbmRpZiAvKiBDS19HUEVSTVMgKi8KKyAgICB9CisgICAgZGVidWcoRjExMSwienNhdHRyIGxwZXJtcyIseHgtPmxwcm90ZWN0LnZhbCx4eC0+bHByb3RlY3QubGVuKTsKKyAgICBkZWJ1ZyhGMTExLCJ6c2F0dHIgZ3Blcm1zIix4eC0+Z3Byb3RlY3QudmFsLHh4LT5ncHJvdGVjdC5sZW4pOworICAgIHh4LT5zeXN0ZW1pZC52YWwgPSAiVTEiOyAgICAgICAgICAgIC8qIFUxID0gVU5JWCAqLworICAgIHh4LT5zeXN0ZW1pZC5sZW4gPSAyOyAgICAgICAgICAgICAgIC8qIFN5c3RlbSBJRCAqLworICAgIHh4LT5yZWNmbS5sZW4gPSAwOyAgICAgICAgICAgICAgICAgIC8qIFJlY29yZCBmb3JtYXQgKi8KKyAgICB4eC0+cmVjZm0udmFsID0gIiI7CisgICAgeHgtPnN5c3BhcmFtLmxlbiA9IDA7ICAgICAgICAgICAgICAgLyogU3lzdGVtLWRlcGVuZGVudCBwYXJhbWV0ZXJzICovCisgICAgeHgtPnN5c3BhcmFtLnZhbCA9ICIiOworICAgIHh4LT5sZW5ndGggPSBpZmxlbjsgICAgICAgICAgICAgICAgIC8qIExlbmd0aCAqLworICAgIHJldHVybigwKTsKK30KKworLyogWiBGIEMgRCBBIFQgIC0tICBHZXQgZmlsZSBjcmVhdGlvbiBkYXRlICovCisvKgorICBDYWxsIHdpdGggcG9pbnRlciB0byBmaWxlbmFtZS4KKyAgT24gc3VjY2VzcywgcmV0dXJucyBwb2ludGVyIHRvIG1vZGlmaWNhdGlvbiBkYXRlIGluIHl5eXltbWRkIGhoOm1tOnNzIGZvcm1hdC4KKyAgT24gZmFpbHVyZSwgcmV0dXJucyBwb2ludGVyIHRvIG51bGwgc3RyaW5nLgorKi8KK3N0YXRpYyBjaGFyIGRhdGJ1Zls0MF07CisKK2NoYXIgKgorI2lmZGVmIENLX0FOU0lDCit6ZHRzdHIodGltZV90IHRpbWVhcmcpCisjZWxzZQoremR0c3RyKHRpbWVhcmcpIHRpbWVfdCB0aW1lYXJnOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB6ZHRzdHIgKi8geworI2lmbmRlZiBUSU1FU1RBTVAKKyAgICByZXR1cm4oIiIpOworI2Vsc2UKKyAgICBzdHJ1Y3QgdG0gKiB0aW1lX3N0YW1wOworICAgIHN0cnVjdCB0bSAqIGxvY2FsdGltZSgpOworICAgIGludCB5eSwgc3M7CisKKyAgICBkZWJ1ZyhGMTAxLCJ6ZHRzdHIgdGltZWFyZyIsIiIsdGltZWFyZyk7CisgICAgaWYgKHRpbWVhcmcgPCAwKQorICAgICAgcmV0dXJuKCIiKTsKKyAgICB0aW1lX3N0YW1wID0gbG9jYWx0aW1lKCYodGltZWFyZykpOworICAgIGlmICghdGltZV9zdGFtcCkgeworICAgICAgICBkZWJ1ZyhGMTAwLCJsb2NhbHRpbWUgcmV0dXJucyBudWxsIiwiIiwwKTsKKyAgICAgICAgcmV0dXJuKCIiKTsKKyAgICB9CisvKgorICBXZSBhc3N1bWUgdGhhdCB0bV95ZWFyIGlzIEFMV0FZUyB5ZWFycyBzaW5jZSAxOTAwLgorICBBbnkgcGxhdGZvcm0gd2hlcmUgdGhpcyBpcyBub3QgdGhlIGNhc2Ugd2lsbCBoYXZlIHByb2JsZW1zCisgIHN0YXJ0aW5nIGluIDIwMDAuCisqLworICAgIHl5ID0gdGltZV9zdGFtcC0+dG1feWVhcjsgICAgICAgICAgIC8qIFllYXIgLSAxOTAwICovCisgICAgZGVidWcoRjEwMSwiemR0c3RyIHRtX3llYXIiLCIiLHRpbWVfc3RhbXAtPnRtX3llYXIpOworICAgIGlmICh5eSA+IDEwMDApIHsKKyAgICAgICAgZGVidWcoRjEwMSwienN0cmR0IFlFQVItMjAwMCBBTEVSVCAxOiBsb2NhbHRpbWUgeWVhciIsIiIseXkpOworICAgIH0KKyAgICB5eSArPSAxOTAwOworICAgIGRlYnVnKEYxMDEsInpkYXRzdHIgeWVhciIsIiIseXkpOworCisgICAgaWYgKHRpbWVfc3RhbXAtPnRtX21vbiAgPCAwIHx8IHRpbWVfc3RhbXAtPnRtX21vbiAgPiAxMSkKKyAgICAgIHJldHVybigiIik7CisgICAgaWYgKHRpbWVfc3RhbXAtPnRtX21kYXkgPCAwIHx8IHRpbWVfc3RhbXAtPnRtX21kYXkgPiAzMSkKKyAgICAgIHJldHVybigiIik7CisgICAgaWYgKHRpbWVfc3RhbXAtPnRtX2hvdXIgPCAwIHx8IHRpbWVfc3RhbXAtPnRtX2hvdXIgPiAyMykKKyAgICAgIHJldHVybigiIik7CisgICAgaWYgKHRpbWVfc3RhbXAtPnRtX21pbiAgPCAwIHx8IHRpbWVfc3RhbXAtPnRtX21pbiAgPiA1OSkKKyAgICAgIHJldHVybigiIik7CisgICAgc3MgPSB0aW1lX3N0YW1wLT50bV9zZWM7ICAgICAgICAgICAgLyogU2Vjb25kcyAqLworICAgIGlmIChzcyA8IDAgfHwgc3MgID4gNTkpICAgICAgICAgICAgIC8qIFNvbWUgc3lzdGVtcyBnaXZlIGEgQklHIG51bWJlciAqLworICAgICAgc3MgPSAwOworICAgIHNwcmludGYoZGF0YnVmLAorI2lmZGVmIHBkcDExCisvKiBGb3Igc29tZSByZWFzb24sIDIuMXggQlNEIHNwcmludGYgZ2V0cyB0aGUgbGFzdCBmaWVsZCB3cm9uZy4gKi8KKyAgICAgICAgICAgICIlMDRkJTAyZCUwMmQgJTAyZDolMDJkOjAwIiwKKyNlbHNlCisgICAgICAgICAgICAiJTA0ZCUwMmQlMDJkICUwMmQ6JTAyZDolMDJkIiwKKyNlbmRpZiAvKiBwZHAxMSAqLworICAgICAgICAgICAgeXksCisgICAgICAgICAgICB0aW1lX3N0YW1wLT50bV9tb24gKyAxLAorICAgICAgICAgICAgdGltZV9zdGFtcC0+dG1fbWRheSwKKyAgICAgICAgICAgIHRpbWVfc3RhbXAtPnRtX2hvdXIsCisgICAgICAgICAgICB0aW1lX3N0YW1wLT50bV9taW4KKyNpZm5kZWYgcGRwMTEKKyAgICAgICAgICAgICwgc3MKKyNlbmRpZiAvKiBwZHAxMSAqLworICAgICAgICAgICAgKTsKKyAgICB5eSA9IChpbnQpc3RybGVuKGRhdGJ1Zik7CisgICAgZGVidWcoRjExMSwiemRhdHN0ciIsZGF0YnVmLHl5KTsKKyAgICBpZiAoeXkgPiAxNykgZGF0YnVmWzE3XSA9ICdcMCc7CisgICAgcmV0dXJuKGRhdGJ1Zik7CisjZW5kaWYgLyogVElNRVNUQU1QICovCit9CisKK2NoYXIgKgoremZjZGF0KG5hbWUpIGNoYXIgKm5hbWU7IHsKKyNpZmRlZiBUSU1FU1RBTVAKKyAgICBzdHJ1Y3Qgc3RhdCBidWZmZXI7CisgICAgZXh0ZXJuIGludCBkaXJhY3RpdmU7CisgICAgdW5zaWduZWQgaW50IG10aW1lOworICAgIGludCB4OworICAgIGNoYXIgKiBzOworCisgICAgaWYgKCFuYW1lKQorICAgICAgcmV0dXJuKCIiKTsKKyAgICBzID0gbmFtZTsKKyAgICBpZiAoISpzKQorICAgICAgcmV0dXJuKCIiKTsKKworI2lmZGVmIENLUk9PVAorICAgIGRlYnVnKEYxMTEsInpmY2RhdCBzZXRyb290Iixja3Jvb3QsY2tyb290c2V0KTsKKyAgICBpZiAoY2tyb290c2V0KSBpZiAoIXppbnJvb3QobmFtZSkpIHsKKwlkZWJ1ZyhGMTEwLCJ6ZmNkYXQgc2V0cm9vdCB2aW9sYXRpb24iLG5hbWUsMCk7CisJcmV0dXJuKCIiKTsKKyAgICB9CisjZW5kaWYgLyogQ0tST09UICovCisKKyNpZmRlZiBEVElMREUKKyAgICBpZiAoKnMgPT0gJ34nKSB7CisgICAgICAgIHMgPSB0aWxkZV9leHBhbmQocyk7CisgICAgICAgIGlmICghcykgcyA9ICIiOworICAgICAgICBpZiAoISpzKSBzID0gbmFtZTsKKyAgICB9CisjZW5kaWYgLyogRFRJTERFICovCisKKyAgICBkYXRidWZbMF0gPSAnXDAnOworICAgIHggPSAwOworICAgIGRlYnVnKEYxMTEsInpmY2RhdCIscyxkaXJhY3RpdmUpOworCisgICAgaWYgKGRpcmFjdGl2ZSAmJiB6Z2ZzX210aW1lKSB7CisJbXRpbWUgPSB6Z2ZzX210aW1lOworICAgIH0gZWxzZSB7CisjaWZkZWYgVVNFX0xTVEFUCisJaWYgKGRpcmFjdGl2ZSkgeworCSAgICB4ID0gbHN0YXQocywmYnVmZmVyKTsKKwkgICAgZGVidWcoRjEwMSwiU1RBVCIsIiIsMTIpOworCSAgICBkZWJ1ZyhGMTAxLCJ6ZmNkYXQgbHN0YXQiLCIiLHgpOworCX0gZWxzZSB7CisjZW5kaWYgLyogVVNFX0xTVEFUICovCisJICAgIHggPSBzdGF0KHMsJmJ1ZmZlcik7CisJICAgIGRlYnVnKEYxMDEsIlNUQVQiLCIiLDEzKTsKKwkgICAgZGVidWcoRjEwMSwiemZjZGF0IHN0YXQiLCIiLHgpOworI2lmZGVmIFVTRV9MU1RBVAorCX0KKyNlbmRpZiAvKiBVU0VfTFNUQVQgKi8KKwlpZiAoeCAhPSAwKSB7CisjaWZkZWYgVVNFX0xTVEFUCisJICAgIGRlYnVnKEYxMTEsInpmY2RhdCBzdGF0IGZhaWxlZCIscyxlcnJubyk7CisjZWxzZQorCSAgICBkZWJ1ZyhGMTExLCJ6ZmNkYXQgbHN0YXQgZmFpbGVkIixzLGVycm5vKTsKKyNlbmRpZiAvKiBVU0VfTFNUQVQgKi8KKwkgICAgcmV0dXJuKCIiKTsKKwl9CisJZGVidWcoRjEwMSwiemZjZGF0IGJ1ZmZlci5zdF9tdGltZSIsIiIsYnVmZmVyLnN0X210aW1lKTsKKwltdGltZSA9IGJ1ZmZlci5zdF9tdGltZTsKKyAgICB9CisgICAgcmV0dXJuKHpkdHN0cihtdGltZSkpOworI2Vsc2UKKyAgICByZXR1cm4oIiIpOworI2VuZGlmIC8qIFRJTUVTVEFNUCAqLworfQorCisjaWZuZGVmIE5PVElNRVNUQU1QCisKKy8qIFogUyBUIFIgRCBUICAtLSAgQ29udmVydHMgbG9jYWwgZGF0ZSBzdHJpbmcgdG8gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKi8KKy8qCisgIEluIG91ciBjYXNlIChVTklYKSB0aGlzIGlzIHNlY29uZHMgc2luY2UgbWlkbml0ZSAxIEphbiAxOTcwIFVUQywKKyAgc3VpdGFibGUgZm9yIGNvbXBhcmlzb24gd2l0aCBVTklYIGZpbGUgZGF0ZXMuICBBcyBmYXIgYXMgSSBrbm93LCB0aGVyZSBpcworICBubyBsaWJyYXJ5IG9yIHN5c3RlbSBjYWxsIC0tIGF0IGxlYXN0IG5vdGhpbmcgcmVhc29uYWJseSBwb3J0YWJsZSAtLSB0bworICBjb252ZXJ0IGxvY2FsIHRpbWUgdG8gVVRDLgorKi8KK3RpbWVfdAorenN0cmR0KGRhdGUsbGVuKSBjaGFyICogZGF0ZTsgaW50IGxlbjsgeworI2lmZGVmIE1fVU5JWAorLyoKKyAgU0NPIFVOSVggMy4ydjIuMCBhbmQgT0RUIDIuMCBsYWNrIHByb3RvdHlwZXMgZm9yIGZ0aW1lKCkuCisgIE9EVCAzLjAgKDMuMnY0LjIgT1MpIGhhcyBhIHByb3RvdHlwZSwgd2hpY2ggbWF5IHZhcnkgaW4KKyAgZGVwZW5kZW5jZSBvbiB0aGUgWFBHNCBzdXBwbGVtZW50IHByZXNlbmNlLiAgU28gYWx3YXlzIHVzZQorICB3aGF0IHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGUgc3VwcGxpZXMgaW4gT0RUIDMuMC4uLgorKi8KKyNpZm5kZWYgT0RUMzAKKyNpZm5kZWYgX1NDT19EUworICAgIGV4dGVybiB2b2lkIGZ0aW1lKCk7ICAvKiBleHRlcm4gdm9pZCBmdGltZShzdHJ1Y3QgdGltZWIgKikgKi8KKyNlbmRpZiAvKiBfU0NPX0RTICovCisjZW5kaWYgLyogT0RUMzAgKi8KKyNlbHNlCisjaWZuZGVmIE1fWEVOSVgKKyAgICBleHRlcm4gaW50IGZ0aW1lKCk7CisjZW5kaWYgLyogTV9YRU5JWCAqLworI2VuZGlmIC8qIE1fVU5JWCAqLworICAgIGV4dGVybiBzdHJ1Y3QgdG0gKiBsb2NhbHRpbWUoKTsKKworICAgIC8qIEFuZCB0aGlzIHNob3VsZCBoYXZlIGJlZW4gZGVjbGFyZWQgYWx3YXlzIHRocm91Z2ggYSBoZWFkZXIgZmlsZSAqLworI2lmZGVmIEhQVVgxMAorICAgIHRpbWVfdCB0bXg7CisgICAgbG9uZyBkYXlzOworI2Vsc2UKKyNpZmRlZiBCU0Q0NAorICAgIHRpbWVfdCB0bXg7CisgICAgbG9uZyBkYXlzOworI2Vsc2UKKyAgICBsb25nIHRteCwgZGF5czsKKyNlbmRpZiAvKiBCU0Q0NCAqLworI2VuZGlmIC8qIEhQVVgxMCAqLworICAgIGludCBpLCBuLCBpc2xlYXB5ZWFyOworICAgICAgICAgICAgICAgICAgIC8qICAgICAgIEogIEYgIE0gIEEgICBNICAgSiAgIEogICBBICAgUyAgIE8gICBOICAgRCAgICovCisgICAgICAgICAgICAgICAgICAgLyogICAgICAzMSAyOCAzMSAzMCAgMzEgIDMwICAzMSAgMzEgIDMwICAzMSAgMzAgIDMxICAgKi8KKyAgICBzdGF0aWMKKyAgICBpbnQgbW9udGhkYXlzIFsxM10gPSB7ICAwLDAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNCB9OworICAgIGNoYXIgc1s1XTsKKyAgICBzdHJ1Y3QgdG0gKnRpbWVfc3RhbXA7CisKKyNpZmRlZiBCU0Q0NAorICAgIHN0cnVjdCB0aW1ldmFsIHRwWzJdOworICAgIGxvbmcgeHRpbWV6b25lID0gMEw7CisjZWxzZQorI2lmZGVmIFY3CisgICAgc3RydWN0IHV0aW1idWYgeworICAgICAgdGltZV90IHRpbWVwWzJdOyAgICAgICAgICAvKiBOZXcgYWNjZXNzIGFuZCBtb2RpZmljYXRvbiB0aW1lICovCisgICAgfSB0cDsKKyAgICBjaGFyICp0ejsKKyAgICBsb25nIHRpbWV6b25lOyAgICAgICAgICAgICAgLyogSW4gY2FzZSB0aW1lem9uZSBub3QgZGVmaW5lZCBpbiAuaCBmaWxlICovCisjZWxzZQorI2lmZGVmIFNZU1VUSU1FSAorICAgIHN0cnVjdCB1dGltYnVmIHRwOworI2Vsc2UKKyAgICBzdHJ1Y3QgdXRpbWJ1ZiB7CisgICAgICAgIHRpbWVfdCBhdGltZTsKKyAgICAgICAgdGltZV90IG10aW1lOworICAgIH0gdHA7CisjZW5kaWYgLyogU1lTVVRJTUVIICovCisjZW5kaWYgLyogVjcgKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworCisjaWZkZWYgQU5ZQlNECisgICAgbG9uZyB0aW1lem9uZSA9IDBMOworICAgIHN0YXRpYyBzdHJ1Y3QgdGltZWIgdGJwOworI2VuZGlmIC8qIEFOWUJTRCAqLworCisjaWZkZWYgQkVCT1gKKyAgICBsb25nIHRpbWV6b25lID0gMEw7CisjZW5kaWYgLyogQkVCT1ggKi8KKworICAgIGRlYnVnKEYxMTEsInpzdHJkdCIsZGF0ZSxsZW4pOworCisgICAgaWYgKChsZW4gPT0gMCkKKyAgICAgICAgfHwgKGxlbiAhPSAxNykKKyAgICAgICAgfHwgKGRhdGVbOF0gIT0gJyAnKQorICAgICAgICB8fCAoZGF0ZVsxMV0gIT0gJzonKQorICAgICAgICB8fCAoZGF0ZVsxNF0gIT0gJzonKSApIHsKKyAgICAgICAgZGVidWcoRjExMSwiQmFkIGNyZWF0aW9uIGRhdGUgIixkYXRlLGxlbik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsInpzdHJkdCBkYXRlIGNoZWNrIDEiLGRhdGUsbGVuKTsKKyAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgaWYgKCFpc2RpZ2l0KGRhdGVbaV0pKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJCYWQgY3JlYXRpb24gZGF0ZSAiLGRhdGUsbGVuKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVidWcoRjExMSwienN0cmR0IGRhdGUgY2hlY2sgMiIsZGF0ZSxsZW4pOworICAgIGkrKzsKKworICAgIGZvciAoOyBpIDwgMTY7IGkgKz0gMykgeworICAgICAgICBpZiAoKCFpc2RpZ2l0KGRhdGVbaV0pKSB8fCAoIWlzZGlnaXQoZGF0ZVtpICsgMV0pKSkgeworICAgICAgICAgICAgZGVidWcoRjExMSwiQmFkIGNyZWF0aW9uIGRhdGUgIixkYXRlLGxlbik7CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9CisgICAgfQorICAgIGRlYnVnKEYxMTEsInpzdHJkdCBkYXRlIGNoZWNrIDMiLGRhdGUsbGVuKTsKKworCisjaWZkZWYgQ09NTUVOVCAvKiB3YXMgQlNENDQgKi8KKy8qCisgICBtYW4gZ2V0dGltZW9mZGF5IG9uIEJTREkgMy4xIHNheXM6CisgICAiVGhlIHRpbWV6b25lIGZpZWxkIGlzIG5vIGxvbmdlciB1c2VkOyB0aW1lem9uZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgb3V0LQorICAgICBzaWRlIHRoZSBrZXJuZWwuICBTZWUgY3RpbWUoMykgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAgU28gdGhpcyBjaHVuayBvZgorICAgY29kZSBpcyBlZmZlY3RpdmVseSBhIG5vLW9wLCBhdCBsZWFzdCBpbiBCU0RJIDMueC4KKyovCisgICAgeworICAgICAgICBpbnQgeDsKKyAgICAgICAgc3RydWN0IHRpbWV6b25lIHR6cDsKKyAgICAgICAgeCA9IGdldHRpbWVvZmRheShOVUxMLCAmdHpwKTsKKyAgICAgICAgZGVidWcoRjEwMSwienN0cmR0IEJTRDQ0IGdldHRpbWVvZmRheSIsIiIseCk7CisgICAgICAgIGlmICh4ID4gLTEpCisgICAgICAgICAgeHRpbWV6b25lID0gdHpwLnR6X21pbnV0ZXN3ZXN0ICogNjBMOworICAgICAgICBlbHNlCisgICAgICAgICAgeHRpbWV6b25lID0gMEw7CisgICAgICAgIGRlYnVnKEYxMDEsInpzdHJkdCBCU0Q0NCB0aW1lem9uZSIsIiIseHRpbWV6b25lKTsKKyAgICB9CisjZWxzZQorI2lmZGVmIEFOWUJTRAorICAgIGRlYnVnKEYxMDAsInpzdHJkdCBCU0QgY2FsbGluZyBmdGltZSIsIiIsMCk7CisgICAgZnRpbWUoJnRicCk7CisgICAgZGVidWcoRjEwMCwienN0cmR0IEJTRCBiYWNrIGZyb20gZnRpbWUiLCIiLDApOworICAgIHRpbWV6b25lID0gdGJwLnRpbWV6b25lICogNjBMOworICAgIGRlYnVnKEYxMDEsInpzdHJkdCBCU0QgdGltZXpvbmUiLCIiLHRpbWV6b25lKTsKKyNlbHNlCisjaWZkZWYgU1ZPUlBPU0lYCisgICAgdHpzZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRpbWV6b25lICovCisjZWxzZQorI2lmZGVmIFY3CisgICAgaWYgKCh0eiA9IGdldGVudigiVFoiKSkgPT0gTlVMTCkKKyAgICAgIHRpbWV6b25lID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBVVEMvR01UICovCisgICAgZWxzZQorICAgICAgdGltZXpvbmUgPSBhdG9pKCZ0elszXSk7ICAgICAgICAgIC8qIFNldCAndGltZXpvbmUnLiAqLworICAgIHRpbWV6b25lICo9IDYwTDsKKyNlbmRpZiAvKiBWNyAqLworI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworI2VuZGlmIC8qIEFOWUJTRCAqLworI2VuZGlmIC8qIENPTU1FTlQgKHdhcyBCU0Q0NCkgKi8KKworICAgIGRlYnVnKEYxMDAsInpzdHJkdCBzbyBmYXIgc28gZ29vZCIsIiIsMCk7CisKKyAgICBzWzRdID0gJ1wwJzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAgICAgICAgICAgICAvKiBGaXggdGhlIHllYXIgKi8KKyAgICAgIHNbaV0gPSBkYXRlW2ldOworCisgICAgbiA9IGF0b2kocyk7CisgICAgZGVidWcoRjExMSwienN0cmR0IHllYXIiLHMsbik7CisgICAgaWYgKG4gPCAxOTcwKSB7CisgICAgICAgIGRlYnVnKEYxMDAsInpzdHJkdCBmYWlscyAtIHllYXIiLCIiLG4pOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworLyogIFByZXZpb3VzIHllYXIncyBsZWFwIGRheXMuICBUaGlzIHdvbid0IHdvcmsgYWZ0ZXIgeWVhciAyMTAwLiAqLworCisgICAgaXNsZWFweWVhciA9ICgoIG4gJSA0ID09IDAgJiYgbiAlIDEwMCAhPTApIHx8IG4gJSA0MDAgPT0gMCk7CisgICAgZGF5cyA9IChsb25nKSAobiAtIDE5NzApICogMzY1OworICAgIGRheXMgKz0gKG4gLSAxOTY4IC0gMSkgLyA0IC0gKG4gLSAxOTAwIC0gMSkgLyAxMDAgKyAobiAtIDE2MDAgLSAxKSAvIDQwMDsKKworICAgIHNbMl0gPSAnXDAnOworCisgICAgZm9yIChpID0gNDsgaSA8IDE2OyBpICs9IDIpIHsKKyAgICAgICAgc1swXSA9IGRhdGVbaV07CisgICAgICAgIHNbMV0gPSBkYXRlW2kgKyAxXTsKKyAgICAgICAgbiA9IGF0b2kocyk7CisgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgIC8qIE1NOiBtb250aCAqLworICAgICAgICAgICAgaWYgKChuIDwgMSApIHx8ICggbiA+IDEyKSkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInpzdHJkdCA0IGJhZCBkYXRlICIsZGF0ZSxsZW4pOworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXlzICs9IG1vbnRoZGF5cyBbbl07CisgICAgICAgICAgICBpZiAoaXNsZWFweWVhciAmJiBuID4gMikKKyAgICAgICAgICAgICAgKytkYXlzOworICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBjYXNlIDY6ICAgICAgICAgICAgICAgICAgICAgICAvKiBERDogZGF5ICovCisgICAgICAgICAgICBpZiAoKG4gPCAxICkgfHwgKCBuID4gMzEpKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwienN0cmR0IDYgYmFkIGRhdGUgIixkYXRlLGxlbik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRteCA9IChkYXlzICsgbiAtIDEpICogMjRMICogNjBMICogNjBMOworICAgICAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgdGhlIHNwYWNlICovCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGNhc2UgOTogICAgICAgICAgICAgICAgICAgICAgIC8qIGhoOiBob3VyICovCisgICAgICAgICAgICBpZiAoKG4gPCAwICkgfHwgKCBuID4gMjMpKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwienN0cmR0IDkgYmFkIGRhdGUgIixkYXRlLGxlbik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRteCArPSBuICogNjBMICogNjBMOworICAgICAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgdGhlIGNvbG9uICovCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGNhc2UgMTI6ICAgICAgICAgICAgICAgICAgICAgIC8qIG1tOiBtaW51dGUgKi8KKyAgICAgICAgICAgIGlmICgobiA8IDAgKSB8fCAoIG4gPiA1OSkpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ6c3RyZHQgMTIgYmFkIGRhdGUgIixkYXRlLGxlbik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBDT01NRU5UIC8qICh3YXMgQlNENDQpICovICAgICAgICAvKiBDb3JyZWN0IGZvciB0aW1lIHpvbmUgKi8KKyAgICAgICAgICAgIHRteCArPSB4dGltZXpvbmU7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6c3RyZHQgQlNENDQgdG14IiwiIix0bXgpOworI2Vsc2UKKyNpZmRlZiBBTllCU0QKKyAgICAgICAgICAgIHRteCArPSB0aW1lem9uZTsKKyNlbHNlCisjaWZuZGVmIENPTlZFWDkgLyogRG9uJ3QgeWV0IGtub3cgaG93IHRvIGRvIHRoaXMgaGVyZSAqLworI2lmZGVmIHVsdHJpeAorICAgICAgICAgICAgdG14ICs9IChsb25nKSB0aW1lem9uZTsKKyNlbHNlCisjaWZkZWYgUGxhbjkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBleHRlcm4gdGltZV90IHR6b2Zmc2V0OworICAgICAgICAgICAgICAgIHRteCArPSB0em9mZnNldDsKKyAgICAgICAgICAgIH0KKyNlbHNlCisjaWZuZGVmIEJTRDQ0CisgICAgICAgICAgICB0bXggKz0gdGltZXpvbmU7CisjZW5kaWYgLyogQlNENDQgKi8KKyNlbmRpZiAvKiBQbGFuOSAqLworI2VuZGlmIC8qIHVsdHJpeCAqLworI2VuZGlmIC8qIENPTlZFWDkgKi8KKyNlbmRpZiAvKiBBTllCU0QgKi8KKyNlbmRpZiAvKiBDT01NRU5UICh3YXMgQlNENDQpICovCisgICAgICAgICAgICB0bXggKz0gbiAqIDYwTDsKKyAgICAgICAgICAgIGkrKzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTa2lwIHRoZSBjb2xvbiAqLworICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBjYXNlIDE1OiAgICAgICAgICAgICAgICAgICAgICAvKiBzczogc2Vjb25kICovCisgICAgICAgICAgICBpZiAoKG4gPCAwICkgfHwgKCBuID4gNTkpKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwienN0cmR0IDE1IGJhZCBkYXRlICIsZGF0ZSxsZW4pOworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXggKz0gbjsKKyAgICAgICAgfQorICAgICAgICB0aW1lX3N0YW1wID0gbG9jYWx0aW1lKCZ0bXgpOworICAgICAgICBkZWJ1ZyhGMTAxLCJ6c3RyZHQgdG14IDEiLCIiLHRteCk7CisgICAgICAgIGlmICghdGltZV9zdGFtcCkKKyAgICAgICAgICByZXR1cm4oLTEpOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgLyogV2h5IHdhcyB0aGlzIGhlcmU/ICovCisgICAgICAgIHRpbWVfc3RhbXAgPSBsb2NhbHRpbWUoJnRteCk7CisgICAgICAgIGRlYnVnKEYxMDEsInpzdHJkdCB0bXggMiIsIiIsdG14KTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisjaWZkZWYgQlNENDQKKyAgICAgICAgeyAgIC8qIE5ldyB0byA3LjAgLSBXb3JrcyBpbiBhdCBhdCBsZWFzdCBCU0RJIDMuMSBhbmQgRnJlZUJTRCAyLjIuNyAqLworICAgICAgICAgICAgbG9uZyB6ejsKKyAgICAgICAgICAgIHp6ID0gdGltZV9zdGFtcC0+dG1fZ210b2ZmOyAvKiBTZWNvbmRzIGF3YXkgZnJvbSBaZXJvIE1lcmlkaWFuICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6c3RyZHQgQlNENDQgdG1fZ210b2ZmIiwiIix6eik7CisgICAgICAgICAgICB0bXggLT0geno7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6c3RyZHQgQlNENDQgdG14IDMgKEdNVCkiLCIiLHRteCk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIC8qCisgICAgICAgICAgIERheWxpZ2h0IFNhdmluZ3MgVGltZSBhZGp1c3RtZW50LgorICAgICAgICAgICBEbyB0aGlzIGV2ZXJ5d2hlcmUgQlVUIGluIEJTRDQ0IGJlY2F1c2UgaW4gQlNENDQsCisgICAgICAgICAgIHRtX2dtdG9mZiBhbHNvIGluY2x1ZGVzIHRoZSBEU1QgYWRqdXN0bWVudC4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHRpbWVfc3RhbXAtPnRtX2lzZHN0KSB7CisgICAgICAgICAgICB0bXggLT0gNjBMICogNjBMOworICAgICAgICAgICAgZGVidWcoRjEwMSwienN0cmR0IHRteCAzIChEU1QpIiwiIix0bXgpOworICAgICAgICB9CisjZW5kaWYgLyogQlNENDQgKi8KKyAgICAgICAgbiA9IHRpbWVfc3RhbXAtPnRtX3llYXI7CisgICAgICAgIGlmIChuIDwgMzAwKSB7CisgICAgICAgICAgICBuICs9IDE5MDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKHRteCk7Cit9CisKKworI2lmZGVmIFpMT0NBTFRJTUUKKy8qIFogTCBPIEMgQSBMIFQgSSBNIEUgIC0tICBHTVQvVVRDIHRpbWUgc3RyaW5nIHRvIGxvY2FsIHRpbWUgc3RyaW5nICovCisKKy8qCisgICBDYWxsIHdpdGg6ICJ5eXl5bW1kZCBoaDptbTpzcyIgR01UL1VUQyBkYXRlLXRpbWUuCisgICBSZXR1cm5zOiAgICJ5eXl5bW1kZCBoaDptbTpzcyIgbG9jYWwgZGF0ZS10aW1lIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KKyovCitzdGF0aWMgY2hhciB6bHRpbWJ1Zls2NF07CisKK2NoYXIgKgoremxvY2FsdGltZShnbXRzdHJpbmcpIGNoYXIgKiBnbXRzdHJpbmc7IHsKKyNpZmRlZiBNX1VOSVgKKy8qCisgIFNDTyBVTklYIDMuMnYyLjAgYW5kIE9EVCAyLjAgbGFjayBwcm90b3R5cGVzIGZvciBmdGltZSgpLgorICBPRFQgMy4wICgzLjJ2NC4yIE9TKSBoYXMgYSBwcm90b3R5cGUsIHdoaWNoIG1heSB2YXJ5IGluCisgIGRlcGVuZGVuY2Ugb24gdGhlIFhQRzQgc3VwcGxlbWVudCBwcmVzZW5jZS4gIFNvIGFsd2F5cyB1c2UKKyAgd2hhdCB0aGUgc3lzdGVtIGhlYWRlciBmaWxlIHN1cHBsaWVzIGluIE9EVCAzLjAuLi4KKyovCisjaWZuZGVmIE9EVDMwCisjaWZuZGVmIF9TQ09fRFMKKyAgICBleHRlcm4gdm9pZCBmdGltZSgpOyAgLyogZXh0ZXJuIHZvaWQgZnRpbWUoc3RydWN0IHRpbWViICopICovCisjZW5kaWYgLyogX1NDT19EUyAqLworI2VuZGlmIC8qIE9EVDMwICovCisjZWxzZQorI2lmbmRlZiBNX1hFTklYCisgICAgZXh0ZXJuIGludCBmdGltZSgpOworI2VuZGlmIC8qIE1fWEVOSVggKi8KKyNlbmRpZiAvKiBNX1VOSVggKi8KKyAgICBleHRlcm4gc3RydWN0IHRtICogbG9jYWx0aW1lKCk7CisKKyAgICAvKiBBbmQgdGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRlY2xhcmVkIGFsd2F5cyB0aHJvdWdoIGEgaGVhZGVyIGZpbGUgKi8KKyNpZmRlZiBIUFVYMTAKKyAgICB0aW1lX3QgdG14OworICAgIGxvbmcgZGF5czsKKyNlbHNlCisjaWZkZWYgQlNENDQKKyAgICB0aW1lX3QgdG14OworICAgIGxvbmcgZGF5czsKKyNlbHNlCisgICAgbG9uZyB0bXgsIGRheXM7CisjZW5kaWYgLyogQlNENDQgKi8KKyNlbmRpZiAvKiBIUFVYMTAgKi8KKyAgICBpbnQgaSwgbiwgeCwgaXNsZWFweWVhcjsKKyAgICAgICAgICAgICAgICAgICAvKiAgICAgICBKICBGICBNICBBICAgTSAgIEogICBKICAgQSAgIFMgICBPICAgTiAgIEQgICAqLworICAgICAgICAgICAgICAgICAgIC8qICAgICAgMzEgMjggMzEgMzAgIDMxICAzMCAgMzEgIDMxICAzMCAgMzEgIDMwICAzMSAgICovCisgICAgc3RhdGljCisgICAgaW50IG1vbnRoZGF5cyBbMTNdID0geyAgMCwwLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzQgfTsKKyAgICBjaGFyIHNbNV07CisgICAgc3RydWN0IHRtICp0aW1lX3N0YW1wOworCisjaWZkZWYgQlNENDQKKyAgICBzdHJ1Y3QgdGltZXZhbCB0cFsyXTsKKyNlbHNlCisjaWZkZWYgVjcKKyAgICBzdHJ1Y3QgdXRpbWJ1ZiB7CisgICAgICB0aW1lX3QgdGltZXBbMl07ICAgICAgICAgIC8qIE5ldyBhY2Nlc3MgYW5kIG1vZGlmaWNhdG9uIHRpbWUgKi8KKyAgICB9IHRwOworI2Vsc2UKKyNpZmRlZiBTWVNVVElNRUgKKyAgICBzdHJ1Y3QgdXRpbWJ1ZiB0cDsKKyNlbHNlCisgICAgc3RydWN0IHV0aW1idWYgeworICAgICAgICB0aW1lX3QgYXRpbWU7CisgICAgICAgIHRpbWVfdCBtdGltZTsKKyAgICB9IHRwOworI2VuZGlmIC8qIFNZU1VUSU1FSCAqLworI2VuZGlmIC8qIFY3ICovCisjZW5kaWYgLyogQlNENDQgKi8KKworI2lmZGVmIEFOWUJTRAorICAgIHN0YXRpYyBzdHJ1Y3QgdGltZWIgdGJwOworI2VuZGlmIC8qIEFOWUJTRCAqLworCisgICAgY2hhciAqIGRhdGUgPSBnbXRzdHJpbmc7CisgICAgaW50IGxlbjsKKworICAgIGxlbiA9IHN0cmxlbihkYXRlKTsKKyAgICBkZWJ1ZyhGMTExLCJ6bG9jYWx0aW1lIixkYXRlLGxlbik7CisKKyAgICBpZiAoKGxlbiA9PSAwKQorICAgICAgICB8fCAobGVuICE9IDE3KQorICAgICAgICB8fCAoZGF0ZVs4XSAhPSAnICcpCisgICAgICAgIHx8IChkYXRlWzExXSAhPSAnOicpCisgICAgICAgIHx8IChkYXRlWzE0XSAhPSAnOicpICkgeworICAgICAgICBkZWJ1ZyhGMTExLCJCYWQgY3JlYXRpb24gZGF0ZSAiLGRhdGUsbGVuKTsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ6bG9jYWx0aW1lIGRhdGUgY2hlY2sgMSIsZGF0ZSxsZW4pOworICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBpZiAoIWlzZGlnaXQoZGF0ZVtpXSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIkJhZCBjcmVhdGlvbiBkYXRlICIsZGF0ZSxsZW4pOworICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworICAgICAgICB9CisgICAgfQorICAgIGRlYnVnKEYxMTEsInpsb2NhbHRpbWUgZGF0ZSBjaGVjayAyIixkYXRlLGxlbik7CisgICAgaSsrOworCisgICAgZm9yICg7IGkgPCAxNjsgaSArPSAzKSB7CisgICAgICAgIGlmICgoIWlzZGlnaXQoZGF0ZVtpXSkpIHx8ICghaXNkaWdpdChkYXRlW2kgKyAxXSkpKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJCYWQgY3JlYXRpb24gZGF0ZSAiLGRhdGUsbGVuKTsKKwkgICAgcmV0dXJuKE5VTEwpOworICAgICAgICB9CisgICAgfQorICAgIGRlYnVnKEYxMTEsInpsb2NhbHRpbWUgZGF0ZSBjaGVjayAzIixkYXRlLGxlbik7CisKKyAgICBkZWJ1ZyhGMTAwLCJ6bG9jYWx0aW1lIHNvIGZhciBzbyBnb29kIiwiIiwwKTsKKworICAgIHNbNF0gPSAnXDAnOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspICAgICAgICAgICAgIC8qIEZpeCB0aGUgeWVhciAqLworICAgICAgc1tpXSA9IGRhdGVbaV07CisKKyAgICBuID0gYXRvaShzKTsKKyAgICBkZWJ1ZyhGMTExLCJ6bG9jYWx0aW1lIHllYXIiLHMsbik7CisgICAgaWYgKG4gPCAxOTcwKSB7CisgICAgICAgIGRlYnVnKEYxMDAsInpsb2NhbHRpbWUgZmFpbHMgLSB5ZWFyIiwiIixuKTsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKworLyogIFByZXZpb3VzIHllYXIncyBsZWFwIGRheXMuICBUaGlzIHdvbid0IHdvcmsgYWZ0ZXIgeWVhciAyMTAwLiAqLworCisgICAgaXNsZWFweWVhciA9ICgoIG4gJSA0ID09IDAgJiYgbiAlIDEwMCAhPTApIHx8IG4gJSA0MDAgPT0gMCk7CisgICAgZGF5cyA9IChsb25nKSAobiAtIDE5NzApICogMzY1OworICAgIGRheXMgKz0gKG4gLSAxOTY4IC0gMSkgLyA0IC0gKG4gLSAxOTAwIC0gMSkgLyAxMDAgKyAobiAtIDE2MDAgLSAxKSAvIDQwMDsKKworICAgIHNbMl0gPSAnXDAnOworCisgICAgZm9yIChpID0gNDsgaSA8IDE2OyBpICs9IDIpIHsKKyAgICAgICAgc1swXSA9IGRhdGVbaV07CisgICAgICAgIHNbMV0gPSBkYXRlW2kgKyAxXTsKKyAgICAgICAgbiA9IGF0b2kocyk7CisgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgIC8qIE1NOiBtb250aCAqLworICAgICAgICAgICAgaWYgKChuIDwgMSApIHx8ICggbiA+IDEyKSkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInpsb2NhbHRpbWUgNCBiYWQgZGF0ZSAiLGRhdGUsbGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXlzICs9IG1vbnRoZGF5cyBbbl07CisgICAgICAgICAgICBpZiAoaXNsZWFweWVhciAmJiBuID4gMikKKyAgICAgICAgICAgICAgKytkYXlzOworICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBjYXNlIDY6ICAgICAgICAgICAgICAgICAgICAgICAvKiBERDogZGF5ICovCisgICAgICAgICAgICBpZiAoKG4gPCAxICkgfHwgKCBuID4gMzEpKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiemxvY2FsdGltZSA2IGJhZCBkYXRlICIsZGF0ZSxsZW4pOworICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRteCA9IChkYXlzICsgbiAtIDEpICogMjRMICogNjBMICogNjBMOworICAgICAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgdGhlIHNwYWNlICovCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGNhc2UgOTogICAgICAgICAgICAgICAgICAgICAgIC8qIGhoOiBob3VyICovCisgICAgICAgICAgICBpZiAoKG4gPCAwICkgfHwgKCBuID4gMjMpKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiemxvY2FsdGltZSA5IGJhZCBkYXRlICIsZGF0ZSxsZW4pOworICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRteCArPSBuICogNjBMICogNjBMOworICAgICAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgdGhlIGNvbG9uICovCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGNhc2UgMTI6ICAgICAgICAgICAgICAgICAgICAgIC8qIG1tOiBtaW51dGUgKi8KKyAgICAgICAgICAgIGlmICgobiA8IDAgKSB8fCAoIG4gPiA1OSkpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ6bG9jYWx0aW1lIDEyIGJhZCBkYXRlICIsZGF0ZSxsZW4pOworICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRteCArPSBuICogNjBMOworICAgICAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgdGhlIGNvbG9uICovCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGNhc2UgMTU6ICAgICAgICAgICAgICAgICAgICAgIC8qIHNzOiBzZWNvbmQgKi8KKyAgICAgICAgICAgIGlmICgobiA8IDAgKSB8fCAoIG4gPiA1OSkpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ6bG9jYWx0aW1lIDE1IGJhZCBkYXRlICIsZGF0ZSxsZW4pOworICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRteCArPSBuOworICAgICAgICB9CisKKy8qCisgIEF0IHRoaXMgcG9pbnQgdG14IGlzIHRoZSB0aW1lX3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZ3VtZW50IGRhdGUtdGltZQorICBzdHJpbmcgd2l0aG91dCBhbnkgdGltZXpvbmUgb3IgRFNUIGFkanVzdG1lbnRzLiAgVGhlcmVmb3JlIGl0IHNob3VsZCBiZQorICB0aGUgc2FtZSBhcyB0aGUgdGltZV90IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBHTVQvVVRDIHRpbWUuICBOb3cgd2Ugc2hvdWxkCisgIGJlIGFibGUgdG8gZmVlZCBpdCB0byBsb2NhbHRpbWUoKSBhbmQgaGF2ZSBpdCBjb252ZXJ0ZWQgdG8gYSBzdHJ1Y3QgdG0KKyAgcmVwcmVzZW50aW5nIHRoZSBsb2NhbCB0aW1lIGVxdWl2YWxlbnQgb2YgdGhlIGdpdmVuIFVUQyB0aW1lLgorKi8KKyAgICAgICAgdGltZV9zdGFtcCA9IGxvY2FsdGltZSgmdG14KTsKKyAgICAgICAgaWYgKCF0aW1lX3N0YW1wKQorICAgICAgICAgIHJldHVybihOVUxMKTsKKyAgICB9CisKKy8qIE5vdyB3ZSBzaW1wbHkgcmVmb3JtYXQgdGhlIHN0cnVjdCB0bSB0byBhIHN0cmluZyAqLworCisgICAgeCA9IHRpbWVfc3RhbXAtPnRtX3llYXI7CisgICAgaWYgKHRpbWVfc3RhbXAtPnRtX3llYXIgPCA3MCB8fCB0aW1lX3N0YW1wLT50bV95ZWFyID4gODA5OSkKKyAgICAgIHJldHVybihOVUxMKTsKKyAgICBpZiAodGltZV9zdGFtcC0+dG1fbW9uIDwgMCB8fCB0aW1lX3N0YW1wLT50bV9tb24gPiAxMSkKKyAgICAgIHJldHVybihOVUxMKTsKKyAgICBpZiAodGltZV9zdGFtcC0+dG1fbWRheSA8IDEgfHwgdGltZV9zdGFtcC0+dG1fbWRheSA+IDMxKQorICAgICAgcmV0dXJuKE5VTEwpOworICAgIGlmICh0aW1lX3N0YW1wLT50bV9ob3VyIDwgMCB8fCB0aW1lX3N0YW1wLT50bV9ob3VyID4gMjQpCisgICAgICByZXR1cm4oTlVMTCk7CisgICAgaWYgKHRpbWVfc3RhbXAtPnRtX21pbiA8IDAgfHwgdGltZV9zdGFtcC0+dG1fbWluID4gNjApCisgICAgICByZXR1cm4oTlVMTCk7CisgICAgaWYgKHRpbWVfc3RhbXAtPnRtX3NlYyA8IDAgfHwgdGltZV9zdGFtcC0+dG1fc2VjID4gNjApCisgICAgICByZXR1cm4oTlVMTCk7CisgICAgc3ByaW50Zih6bHRpbWJ1ZiwiJTA0ZCUwMmQlMDJkICUwMmQ6JTAyZDolMDJkIiwKKwkgICAgdGltZV9zdGFtcC0+dG1feWVhciArIDE5MDAsCisJICAgIHRpbWVfc3RhbXAtPnRtX21vbiArIDEsCisJICAgIHRpbWVfc3RhbXAtPnRtX21kYXksCisJICAgIHRpbWVfc3RhbXAtPnRtX2hvdXIsCisJICAgIHRpbWVfc3RhbXAtPnRtX21pbiwKKwkgICAgdGltZV9zdGFtcC0+dG1fc2VjCisJICAgICk7CisgICAgcmV0dXJuKChjaGFyICopemx0aW1idWYpOworfQorI2VuZGlmIC8qIFpMT0NBTFRJTUUgKi8KKyNlbmRpZiAvKiBOT1RJTUVTVEFNUCAqLworCisvKiBaIFMgVCBJIE0gRSAgLS0gIFNldCBtb2RpZmljYXRpb24gZGF0ZS90aW1lK3Blcm1pc3Npb25zIGZvciBpbmNvbWluZyBmaWxlICovCisvKgorIENhbGwgd2l0aDoKKyBmICA9IHBvaW50ZXIgdG8gbmFtZSBvZiBleGlzdGluZyBmaWxlLgorIHl5ID0gcG9pbnRlciB0byBhIEtlcm1pdCBmaWxlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUgaW4gd2hpY2ggeXktPmRhdGUudmFsCisgICAgICBpcyBhIGRhdGUgb2YgdGhlIGZvcm0geXl5eW1tZGQgaGg6bW06c3MsIGUuZy4gMTk5MDAyMDggMTM6MDA6MDAuCisgICAgICB5eS0+bHByb3RlY3QudmFsICYgeXktPmdwcm90ZWN0LnZhbCBhcmUgcGVybWlzc2lvbi9wcm90ZWN0aW9uIHZhbHVlcy4KKyB4ICA9IGlzIGEgZnVuY3Rpb24gY29kZTogMCBtZWFucyB0byBzZXQgdGhlIGZpbGUncyBhdHRyaWJ1dGVzIGFzIGdpdmVuLgorICAgICAgMSBtZWFucyBjb21wYXJlIHRoZSBkYXRlIGluIHN0cnVjdCB5eSB3aXRoIHRoZSBmaWxlIGNyZWF0aW9uIGRhdGUuCisgUmV0dXJuczoKKyAtMSBvbiBhbnkga2luZCBvZiBlcnJvci4KKyAgMCBpZiB4IGlzIDAgYW5kIHRoZSBhdHRyaWJ1dGVzIHdlcmUgc2V0IHN1Y2Nlc3NmdWxseS4KKyAgMCBpZiB4IGlzIDEgYW5kIGRhdGUgZnJvbSBhdHRyaWJ1dGUgc3RydWN0dXJlIDw9IGZpbGUgY3JlYXRpb24gZGF0ZS4KKyAgMSBpZiB4IGlzIDEgYW5kIGRhdGUgZnJvbSBhdHRyaWJ1dGUgc3RydWN0dXJlID4gZmlsZSBjcmVhdGlvbiBkYXRlLgorKi8KK2ludAorenN0aW1lKGYseXkseCkKKyAgICBjaGFyICpmOyBzdHJ1Y3QgemF0dHIgKnl5OyBpbnQgeDsKKy8qIHpzdGltZSAqLyB7CisgICAgaW50IHIgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGNvZGUgKi8KKyNpZmRlZiBDS19QRVJNUworICAgIGludCBzZXRwZXJtcyA9IDA7CisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKyAgICBpbnQgc2V0ZGF0ZSA9IDA7CisKKy8qIEl0IGlzIGlmZGVmJ2QgVElNRVNUQU1QIGJlY2F1c2UgaXQgbWlnaHQgbm90IHdvcmsgb24gVjcuIGJrQGt1bGxtYXIuc2UuICAqLworCisjaWZkZWYgVElNRVNUQU1QCisjaWZkZWYgQlNENDQKKyAgICBleHRlcm4gaW50IHV0aW1lcygpOworI2Vsc2UKKyAgICBleHRlcm4gaW50IHV0aW1lKCk7CisjZW5kaWYgLyogQlNENDQgKi8KKworICAgIHN0cnVjdCBzdGF0IHNiOworCisvKiBBdCBsZWFzdCwgdGhlIGRlY2xhcmF0aW9ucyBmb3IgaW50IGZ1bmN0aW9ucyBhcmUgbm90IG5lZWRlZCBhbnl3YXkgKi8KKworI2lmZGVmIEJTRDQ0CisgICAgc3RydWN0IHRpbWV2YWwgdHBbMl07CisgICAgbG9uZyB4dGltZXpvbmU7CisjZWxzZQorI2lmZGVmIFY3CisgICAgc3RydWN0IHV0aW1idWYgeworCXRpbWVfdCB0aW1lcFsyXTsJCS8qIE5ldyBhY2Nlc3MgYW5kIG1vZGlmaWNhdG9uIHRpbWUgKi8KKyAgICB9IHRwOworICAgIGNoYXIgKnR6OworICAgIGxvbmcgdGltZXpvbmU7ICAgICAgICAgICAgICAgICAgICAgIC8qIEluIGNhc2Ugbm90IGRlZmluZWQgaW4gLmggZmlsZSAqLworI2Vsc2UKKyNpZmRlZiBTWVNVVElNRUgKKyAgICBzdHJ1Y3QgdXRpbWJ1ZiB0cDsKKyNlbHNlCisgICAgc3RydWN0IHV0aW1idWYgeworICAgICAgICB0aW1lX3QgYXRpbWU7CisgICAgICAgIHRpbWVfdCBtdGltZTsKKyAgICB9IHRwOworI2VuZGlmIC8qIFNZU1VUSU1FSCAqLworI2VuZGlmIC8qIFY3ICovCisjZW5kaWYgLyogQlNENDQgKi8KKworICAgIGxvbmcgdG0gPSAwTDsKKworICAgIGlmICghZikgZiA9ICIiOworICAgIGlmICghKmYpIHJldHVybigtMSk7CisgICAgaWYgKCF5eSkgcmV0dXJuKC0xKTsKKworICAgIGRlYnVnKEYxMTAsInpzdGltZSIsZiwwKTsKKyAgICBkZWJ1ZyhGMTExLCJ6c3RpbWUgZGF0ZSIseXktPmRhdGUudmFsLHl5LT5kYXRlLmxlbik7CisKKyNpZmRlZiBDS1JPT1QKKyAgICBkZWJ1ZyhGMTExLCJ6c3RpbWUgc2V0cm9vdCIsY2tyb290LGNrcm9vdHNldCk7CisgICAgaWYgKGNrcm9vdHNldCkgaWYgKCF6aW5yb290KGYpKSB7CisJZGVidWcoRjExMCwienN0aW1lIHNldHJvb3QgdmlvbGF0aW9uIixmLDApOworCXJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tST09UICovCisKKyAgICBpZiAoeXktPmRhdGUubGVuID09IDApIHsgICAgICAgICAgICAvKiBObyBkYXRlIGluIHN0cnVjdCAqLworICAgICAgICBpZiAoeXktPmxwcm90ZWN0LmxlbiAhPSAwKSB7ICAgIC8qIFNvIGdvIGRvIHBlcm1pc3Npb25zICovCisgICAgICAgICAgICBnb3RvIHpzcGVybXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ6c3RpbWU6IG5vdGhpbmcgdG8gZG8iLCIiLDApOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgfQorICAgIGlmICgodG0gPSB6c3RyZHQoeXktPmRhdGUudmFsLHl5LT5kYXRlLmxlbikpIDwgMCkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJ6c3RpbWU6IHpzdHJkdCBmYWlscyIsIiIsMCk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsInpzdGltZTogdG0iLCIiLHRtKTsKKyAgICBkZWJ1ZyhGMTExLCJ6c3RpbWU6IEEtcGt0IGRhdGUgb2sgIix5eS0+ZGF0ZS52YWwseXktPmRhdGUubGVuKTsKKworICAgIGlmIChzdGF0KGYsJnNiKSkgeyAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgdGltZSBmb3IgdGhlIGZpbGUgKi8KKwlkZWJ1ZyhGMTAxLCJTVEFUIiwiIiwxNCk7CisgICAgICAgIGRlYnVnKEYxMTEsInpzdGltZTogQ2FuJ3Qgc3RhdCBmaWxlOiIsZixlcnJubyk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsIlNUQVQiLCIiLDE1KTsKKyAgICBzZXRkYXRlID0gMTsKKworICB6c3Blcm1zOgorI2lmZGVmIENLX1BFUk1TCisgICAgeworICAgICAgICBpbnQgaSwgeCA9IDAsIHh4LCBmbGFnID0gMDsKKyAgICAgICAgY2hhciAqIHM7CisjaWZkZWYgREVCVUcKKyAgICAgICAgY2hhciBvYnVmWzI0XTsKKyAgICAgICAgaWYgKGRlYmxvZykgeworICAgICAgICAgICAgZGVidWcoRjExMSwienN0aW1lIGxwZXJtcyIseXktPmxwcm90ZWN0LnZhbCx5eS0+bHByb3RlY3QubGVuKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsInpzdGltZSBncGVybXMiLHl5LT5ncHJvdGVjdC52YWwseXktPmdwcm90ZWN0Lmxlbik7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ6c3RpbWUgc3lzdGVtIGlkIix5eS0+c3lzdGVtaWQudmFsLDApOworICAgICAgICAgICAgc3ByaW50ZihvYnVmLCIlbyIsc2Iuc3RfbW9kZSk7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ6c3RpbWUgZmlsZSBwZXJtcyBiZWZvcmUiLG9idWYsMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgICAgZGVidWcoRjEwMSwienN0aW1lIGlzZ3Vlc3QiLCIiLGlzZ3Vlc3QpOworICAgICAgICBkZWJ1ZyhGMTAxLCJ6c3RpbWUgY2t4cGVybXMiLCIiLGNreHBlcm1zKTsKKyAgICAgICAgaWYgKGlzZ3Vlc3QpIHsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAvKiBDbGVhciBvd25lciBwZXJtaXNzaW9ucyAqLworICAgICAgICAgICAgc2Iuc3RfbW9kZSAmPSAodW5zaWduZWQpIDAxNzcwNzc7IC8qICgxNiBiaXRzKSAqLworI2Vsc2UKKyAgICAgICAgICAgIC8qIFNldCBwZXJtaXNzaW9ucyBmcm9tIGNreHBlcm1zIHZhcmlhYmxlICovCisgICAgICAgICAgICBzYi5zdF9tb2RlID0gY2t4cGVybXM7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwienN0aW1lIGlzZ3Vlc3Qgc2Iuc3RfbW9kZSIsIiIsc2Iuc3RfbW9kZSk7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgLyogV2UgYWxyZWFkeSBzZXQgdGhlbSBpbiB6b3Blbm8oKSAqLworICAgICAgICAgICAgc2V0cGVybXMgPSAxOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIGZsYWcgPSAwOworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgICAgICAgIGlmICgoeXktPmxwcm90ZWN0LmxlbiA+IDAgJiYgIC8qIEhhdmUgbG9jYWwtZm9ybWF0IHBlcm1pc3Npb25zICovCisgICAgICAgICAgICB5eS0+c3lzdGVtaWQubGVuID4gMCAmJiAgICAgLyogZnJvbSBBLXBhY2tldC4uLiAqLworI2lmZGVmIFVOSVgKKyAgICAgICAgICAgICFzdHJjbXAoeXktPnN5c3RlbWlkLnZhbCwiVTEiKSAvKiBBTkQgeW91IGFyZSBzYW1lIGFzIG1lICovCisjZWxzZQorICAgICAgICAgICAgMAorI2VuZGlmIC8qIFVOSVggKi8KKyAgICAgICAgICAgICApIHx8ICh5eS0+bHByb3RlY3QubGVuIDwgMCkgLyogT1IgYnkgaW5oZXJpdGFuY2UgZnJvbSBvbGQgZmlsZSAqLworICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgICAgIHMgPSB5eS0+bHByb3RlY3QudmFsOyAgICAgICAvKiBVTklYIGZpbGVtb2RlICovCisgICAgICAgICAgICB4eCA9IHl5LT5scHJvdGVjdC5sZW47CisgICAgICAgICAgICBpZiAoeHggPCAwKSAgICAgICAgICAgICAgICAgLyogbGVuIDwgMCBtZWFucyBpbmhlcml0YW5jZSAqLworICAgICAgICAgICAgICB4eCA9IDAgLSB4eDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB4eDsgaSsrKSB7ICAvKiBEZWNvZGUgb2N0YWwgc3RyaW5nICovCisgICAgICAgICAgICAgICAgaWYgKCpzIDw9ICc3JyAmJiAqcyA+PSAnMCcpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IDggKiB4ICsgKGludCkoKnMpIC0gJzAnOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZsYWcgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcysrOworICAgICAgICAgICAgfQorI2lmZGVmIERFQlVHCisgICAgICAgICAgICBzcHJpbnRmKG9idWYsIiVvIix4KTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInpzdGltZSBvY3RhbCBscGVybSIsb2J1ZiwwKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICB9IGVsc2UgaWYgKCFmbGFnICYmIHl5LT5ncHJvdGVjdC5sZW4gPiAwKSB7CisgICAgICAgICAgICBpbnQgZzsKKyNpZmRlZiBDS19TQ08zMlY0CisgICAgICAgICAgICBtb2RlX3QgbWFzazsKKyNlbHNlCisgICAgICAgICAgICBpbnQgbWFzazsKKyNlbmRpZiAvKiBDS19TQ08zMlY0ICovCisgICAgICAgICAgICBtYXNrID0gdW1hc2soMCk7ICAgICAgICAgICAgLyogR2V0IHVtYXNrICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6c3RpbWUgbWFzayAxIiwiIixtYXNrKTsKKyAgICAgICAgICAgIHVtYXNrKG1hc2spOyAgICAgICAgICAgICAgICAvKiBQdXQgaXQgYmFjayAqLworICAgICAgICAgICAgbWFzayBePSAwNzc3OyAgICAgICAgICAgICAgIC8qIEZsaXAgdGhlIGJpdHMgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInpzdGltZSBtYXNrIDIiLCIiLG1hc2spOworICAgICAgICAgICAgZyA9IHh1bmNoYXIoKih5eS0+Z3Byb3RlY3QudmFsKSk7IC8qIERlY29kZSBnZW5lcmljIHByb3RlY3Rpb24gKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInpzdGltZSBncHJvdGVjdCIsIiIsZyk7CisjaWZkZWYgU19JUlVTUgorICAgICAgICAgICAgZGVidWcoRjEwMCwienN0aW1lIFNfSVJVU1IiLCIiLDApOworICAgICAgICAgICAgaWYgKGcgJiAxKSB4IHw9IFNfSVJVU1I7ICAgIC8qIFJlYWQgcGVybWlzc2lvbiAqLworICAgICAgICAgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogU19JUlVTUiAqLworI2lmZGVmIFNfSVdVU1IKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsInpzdGltZSBTX0lXVVNSIiwiIiwwKTsKKyAgICAgICAgICAgIGlmIChnICYgMikgeCB8PSBTX0lXVVNSOyAgICAvKiBXcml0ZSBwZXJtaXNzaW9uICovCisgICAgICAgICAgICBpZiAoZyAmIDE2KSB4IHw9IFNfSVdVU1I7ICAgLyogRGVsZXRlIHBlcm1pc3Npb24gKi8KKyAgICAgICAgICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIFNfSVdVU1IgKi8KKyNpZmRlZiBTX0lYVVNSCisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ6c3RpbWUgU19JWFVTUiIsIiIsMCk7CisgICAgICAgICAgICBpZiAoZyAmIDQpICAgICAgICAgICAgICAgICAgLyogSGFzIGV4ZWN1dGUgcGVybWlzc2lvbiBiaXQgKi8KKyAgICAgICAgICAgICAgeCB8PSBTX0lYVVNSOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvZXNuJ3QgaGF2ZSBpdCAqLworICAgICAgICAgICAgICBtYXNrICY9IDA2NjY7ICAgICAgICAgICAgIC8qIHNvIGFsc28gY2xlYXIgaXQgb3V0IG9mIG1hc2sgKi8KKyAgICAgICAgICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIFNfSVhVU1IgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInpzdGltZSBtYXNrIHgiLCIiLHgpOworICAgICAgICAgICAgeCB8PSBtYXNrOworICAgICAgICAgICAgZGVidWcoRjEwMSwienN0aW1lIG1hc2sgeHxtYXNrIiwiIix4KTsKKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTAxLCJ6c3RpbWUgZmxhZyIsIiIsZmxhZyk7CisgICAgICAgIGlmIChmbGFnKSB7CisjaWZkZWYgU19JRk1UCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6c3RpbWUgU19JRk1UIHgiLCIiLHgpOworICAgICAgICAgICAgc2Iuc3RfbW9kZSA9IChzYi5zdF9tb2RlICYgU19JRk1UKSB8IHg7CisgICAgICAgICAgICBzZXRwZXJtcyA9IDE7CisjZWxzZQorI2lmZGVmIF9JRk1UCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6c3RpbWUgX0lGTVQgeCIsIiIseCk7CisgICAgICAgICAgICBzYi5zdF9tb2RlID0gKHNiLnN0X21vZGUgJiBfSUZNVCkgfCB4OworICAgICAgICAgICAgc2V0cGVybXMgPSAxOworI2VuZGlmIC8qIF9JRk1UICovCisjZW5kaWYgLyogU19JRk1UICovCisgICAgICAgIH0KKyNpZmRlZiBERUJVRworICAgICAgICBzcHJpbnRmKG9idWYsIiUwNG8iLHNiLnN0X21vZGUpOworICAgICAgICBkZWJ1ZyhGMTExLCJ6c3RpbWUgZmlsZSBwZXJtcyBhZnRlciIsb2J1ZixzZXRwZXJtcyk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICB9CisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKworICAgIGRlYnVnKEYxMDEsInpzdGltZTogc2Iuc3RfYXRpbWUiLCIiLHNiLnN0X2F0aW1lKTsKKworI2lmZGVmIEJTRDQ0CisgICAgdHBbMF0udHZfc2VjID0gc2Iuc3RfYXRpbWU7ICAgICAgICAgLyogQWNjZXNzIHRpbWUgZmlyc3QgKi8KKyAgICB0cFsxXS50dl9zZWMgPSB0bTsgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGltZSBzZWNvbmQgKi8KKyAgICBkZWJ1ZyhGMTAwLCJ6c3RpbWU6IEJTRDQ0IG1vZHRpbWUiLCIiLDApOworI2Vsc2UKKyNpZmRlZiBWNworICAgIHRwLnRpbWVwWzBdID0gdG07ICAgICAgICAgICAgICAgICAgIC8qIFNldCBtb2RpZi4gdGltZSB0byBjcmVhdGlvbiBkYXRlICovCisgICAgdHAudGltZXBbMV0gPSBzYi5zdF9hdGltZTsgICAgICAgICAgLyogRG9uJ3QgY2hhbmdlIHRoZSBhY2Nlc3MgdGltZSAqLworICAgIGRlYnVnKEYxMDAsInpzdGltZTogVjcgbW9kdGltZSIsIiIsMCk7CisjZWxzZQorI2lmZGVmIFNZU1VUSU1FSAorICAgIHRwLm1vZHRpbWUgPSB0bTsgICAgICAgICAgICAgICAgICAgIC8qIFNldCBtb2RpZi4gdGltZSB0byBjcmVhdGlvbiBkYXRlICovCisgICAgdHAuYWN0aW1lID0gc2Iuc3RfYXRpbWU7ICAgICAgICAgICAgLyogRG9uJ3QgY2hhbmdlIHRoZSBhY2Nlc3MgdGltZSAqLworICAgIGRlYnVnKEYxMDAsInpzdGltZTogU1lTVVRJTUVIIG1vZHRpbWUiLCIiLDApOworI2Vsc2UKKyAgICB0cC5tdGltZSA9IHRtOyAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgbW9kaWYuIHRpbWUgdG8gY3JlYXRpb24gZGF0ZSAqLworICAgIHRwLmF0aW1lID0gc2Iuc3RfYXRpbWU7ICAgICAgICAgICAgIC8qIERvbid0IGNoYW5nZSB0aGUgYWNjZXNzIHRpbWUgKi8KKyAgICBkZWJ1ZyhGMTAwLCJ6c3RpbWU6IGRlZmF1bHQgbW9kdGltZSIsIiIsMCk7CisjZW5kaWYgLyogU1lTVVRJTUVIICovCisjZW5kaWYgLyogVjcgKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworCisgICAgc3dpdGNoICh4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSBkZXNpcmVkIGZ1bmN0aW9uICovCisgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoZSBmaWxlICovCisjaWZkZWYgQ0tfUEVSTVMgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW5kIHBlcm1pc3Npb25zICovCisvKgorICBOT1RFOiBJZiB3ZSBhcmUgaW5oZXJpdGluZyBwZXJtaXNzaW9ucyBmcm9tIGEgcHJldmlvdXMgZmlsZSwgYW5kIHRoZQorICBwcmV2aW91cyBmaWxlIHdhcyBhIGRpcmVjdG9yeSwgdGhpcyB3b3VsZCB0dXJuIHRoZSBuZXcgZmlsZSBpbnRvIGEgZGlyZWN0b3J5CisgIHRvbywgYnV0IGl0J3Mgbm90LCBzbyB3ZSB0cnkgdG8gdW5zZXQgdGhlIHJpZ2h0IGJpdC4gIEx1Y2tpbHksIHRoaXMgY29kZQorICB3aWxsIHByb2JhYmx5IG5ldmVyIGJlIGV4ZWN1dGVkIHNpbmNlIHRoZSB1cHBlciBsZXZlbCBtb2R1bGVzIGRvIG5vdCBhbGxvdworICByZWNlcHRpb24gb2YgYSBmaWxlIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBkaXJlY3RvcnkuCisKKyAgTk9URSAyOiBXZSBjaGFuZ2UgdGhlIHBlcm1pc3Npb25zICpiZWZvcmUqIHdlIGNoYW5nZSB0aGUgbW9kaWZpY2F0aW9uIHRpbWUsCisgIG90aGVyd2lzZSBjaGFuZ2luZyB0aGUgcGVybWlzc2lvbnMgd291bGQgc2V0IHRoZSBtb2QgdGltZSB0byB0aGUgcHJlc2VudAorICB0aW1lLgorKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6c3RpbWUgc2V0cGVybXMiLCIiLHNldHBlcm1zKTsKKyAgICAgICAgICAgIGlmIChTX0lTRElSKHNiLnN0X21vZGUpKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwienN0aW1lIERJUkVDVE9SWSBiaXQgb24iLCIiLHNiLnN0X21vZGUpOworICAgICAgICAgICAgICAgIHNiLnN0X21vZGUgXj0gMDA0MDAwMDsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6c3RpbWUgRElSRUNUT1JZIGJpdCBvZmYiLCIiLHNiLnN0X21vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldHBlcm1zKSB7CisgICAgICAgICAgICAgICAgeCA9IGNobW9kKGYsc2Iuc3RfbW9kZSk7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwienN0aW1lIGNobW9kIiwiIix4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoeCA8IDApIHJldHVybigtMSk7CisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKworICAgICAgICBpZiAoIXNldGRhdGUpICAgICAgICAgICAgICAgICAgIC8qIFdlIGRvbid0IGhhdmUgYSBkYXRlICovCisgICAgICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgLyogc28gc2tpcCB0aGUgZm9sbG93aW5nLi4uICovCisKKyAgICAgICAgaWYgKAorI2lmZGVmIEJTRDQ0CisgICAgICAgICAgICB1dGltZXMoZix0cCkKKyNlbHNlCisgICAgICAgICAgICB1dGltZShmLCZ0cCkKKyNlbmRpZiAvKiBCU0Q0NCAqLworICAgICAgICAgICAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpeCBtb2RpZmljYXRpb24gdGltZSAqLworICAgICAgICAgICAgZGVidWcoRjExMSwienN0aW1lIDA6IGNhbid0IHNldCBtb2R0aW1lIGZvciBmaWxlIixmLGVycm5vKTsKKyAgICAgICAgICAgIHIgPSAtMTsKKyAgICAgICAgfSBlbHNlICB7CisJICAgIC8qIEluY2x1ZGluZyB0aGUgbW9kdGltZSBoZXJlIGlzIG5vdCBwb3J0YWJsZSAqLworICAgICAgICAgICAgZGVidWcoRjExMCwienN0aW1lIDA6IG1vZHRpbWUgc2V0IGZvciBmaWxlIixmLDApOworICAgICAgICAgICAgciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21wYXJlIHRoZSBkYXRlcyAqLworLyoKKyAgVGhpcyB3YXMgc3RfYXRpbWUsIHdoaWNoIHdhcyB3cm9uZy4gIFdlIHdhbnQgdGhlIGZpbGUtZGF0YSBtb2RpZmljYXRpb24KKyAgdGltZSwgc3RfbXRpbWUuCisqLworICAgICAgICBkZWJ1ZyhGMTExLCJ6c3RpbWUgMTogY29tcGFyZSIsZixzYi5zdF9tdGltZSk7CisgICAgICAgIGRlYnVnKEYxMTEsInpzdGltZSAxOiBjb21wYXJlIiwicGFja2V0Iix0bSk7CisKKyAgICAgICAgciA9IChzYi5zdF9tdGltZSA8IHRtKSA/IDAgOiAxOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgIHIgPSAtMTsKKyAgICB9CisjZW5kaWYgLyogVElNRVNUQU1QICovCisgICAgcmV0dXJuKHIpOworfQorCisvKiBGaW5kIGluaXRpYWxpemF0aW9uIGZpbGUuICovCisKKyNpZmRlZiBOT1RVU0VECitpbnQKK3prZXJtaW5pKCkgeworLyogIG5vdGhpbmcgaGVyZSBmb3IgVW5peC4gIFRoaXMgZnVuY3Rpb24gYWRkZWQgZm9yIGJlbmVmaXQgb2YgVk1TIEtlcm1pdC4gICovCisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIE5PVFVTRUQgKi8KKworI2lmbmRlZiBVTklYCisvKiBIaXN0b3JpY2FsIC0tIG5vdCB1c2VkIGluIFVuaXggYW55IG1vcmUgKDIwMDEtMTEtMDMpICovCisjaWZuZGVmIE5PRlJJTExTCitpbnQKK3ptYWlsKHAsZikgY2hhciAqcDsgY2hhciAqZjsgeyAgICAgICAgICAvKiBTZW5kIGZpbGUgZiBhcyBtYWlsIHRvIGFkZHJlc3MgcCAqLworLyoKKyAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgIDIgaWYgbWFpbCBkZWxpdmVyZWQgYnV0IHRlbXAgZmlsZSBjYW4ndCBiZSBkZWxldGVkCisgIC0yIGlmIG1haWwgY2FuJ3QgYmUgZGVsaXZlcmVkCisgIC0xIG9uIGZpbGUgYWNjZXNzIGVycm9yCisgIFRoZSBVTklYIHZlcnNpb24gYWx3YXlzIHJldHVybnMgMCBiZWNhdXNlIGl0IGNhbid0IGdldCBhIGdvb2QgcmV0dXJuCisgIGNvZGUgZnJvbSB6c3lzY21kLgorKi8KKyAgICBpbnQgbjsKKworI2lmZGVmIENLX0xPR0lOCisgICAgaWYgKGlzZ3Vlc3QpCisgICAgICByZXR1cm4oLTIpOworI2VuZGlmIC8qIENLX0xPR0lOICovCisKKyAgICBpZiAoIWYpIGYgPSAiIjsKKyAgICBpZiAoISpmKSByZXR1cm4oLTEpOworCisjaWZkZWYgQ0tST09UCisgICAgZGVidWcoRjExMSwiem1haWwgc2V0cm9vdCIsY2tyb290LGNrcm9vdHNldCk7CisgICAgaWYgKGNrcm9vdHNldCkgaWYgKCF6aW5yb290KGYpKSB7CisJZGVidWcoRjExMCwiem1haWwgc2V0cm9vdCB2aW9sYXRpb24iLGYsMCk7CisJcmV0dXJuKC0xKTsKKyAgICB9CisjZW5kaWYgLyogQ0tST09UICovCisKKyNpZmRlZiBCU0Q0CisvKiBUaGUgaWRlYSBpcyB0byB1c2UgL3Vzci91Y2IvbWFpbCwgcmF0aGVyIHRoYW4gcmVndWxhciBtYWlsLCBzbyB0aGF0ICAgKi8KKy8qIGEgc3ViamVjdCBsaW5lIGNhbiBiZSBpbmNsdWRlZCB3aXRoIC1zLiAgU2luY2Ugd2UgY2FuJ3QgZGVwZW5kIG9uIHRoZSAqLworLyogdXNlcidzIHBhdGgsIHdlIHVzZSB0aGUgY29udmVudGlvbiB0aGF0IC91c3IvdWNiL01haWwgPSAvdXNyL3VjYi9tYWlsICovCisvKiBhbmQgZXZlbiBpZiBNYWlsIGhhcyBiZWVuIG1vdmVkIHRvIHNvbWV3aGVyZSBlbHNlLCB0aGlzIHNob3VsZCBzdGlsbCAgKi8KKy8qIGZpbmQgaXQuLi4gIFRoZSBzZWFyY2ggY291bGQgYmUgbWFkZSBtb3JlIHJlbGlhYmxlIGJ5IGFjdHVhbGx5IHVzaW5nICAqLworLyogYWNjZXNzKCkgdG8gc2VlIGlmIC91c3IvdWNiL01haWwgZXhpc3RzLiAqLworCisgICAgbiA9IHN0cmxlbihmKTsKKyAgICBuID0gbiArIG4gKyAxNSArIChpbnQpc3RybGVuKHApOworCisgICAgaWYgKG4gPiBaTUJVRkxFTikKKyAgICAgIHJldHVybigtMik7CisKKyNpZmRlZiBER1VYNTQwCisgICAgc3ByaW50Zih6bWJ1ZiwibWFpbHggLXMgJWMlcyVjICVzIDwgJXMiLCAnIicsIGYsICciJywgcCwgZik7CisjZWxzZQorICAgIHNwcmludGYoem1idWYsIk1haWwgLXMgJWMlcyVjICVzIDwgJXMiLCAnIicsIGYsICciJywgcCwgZik7CisjZW5kaWYgLyogREdVWDU0MCAqLworICAgIHpzeXNjbWQoem1idWYpOworI2Vsc2UKKyNpZmRlZiBTVk9SUE9TSVgKKyNpZm5kZWYgT1hPUworICAgIHNwcmludGYoem1idWYsIm1haWwgJXMgPCAlcyIsIHAsIGYpOworI2Vsc2UgLyogT1hPUyAqLworICAgIHNwcmludGYoem1idWYsIm1haWx4IC1zICVjJXMlYyAlcyA8ICVzIiwgJyInLCBmLCAnIicsIHAsIGYpOworI2VuZGlmIC8qIE9YT1MgKi8KKyAgICB6c3lzY21kKHptYnVmKTsKKyNlbHNlCisgICAgKnptYnVmID0gJ1wwJzsKKyNlbmRpZgorI2VuZGlmCisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIE5PRlJJTExTICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZuZGVmIE5PRlJJTExTCitpbnQKK3pwcmludChwLGYpIGNoYXIgKnA7IGNoYXIgKmY7IHsgICAgICAgICAvKiBQcmludCBmaWxlIGYgd2l0aCBvcHRpb25zIHAgKi8KKyAgICBleHRlcm4gY2hhciAqIHByaW50ZXJuYW1lOyAgICAgICAgICAvKiBGcm9tIGNrdXVzMy5jICovCisgICAgZXh0ZXJuIGludCBwcmludHBpcGU7CisgICAgaW50IG47CisKKyNpZmRlZiBDS19MT0dJTgorICAgIGlmIChpc2d1ZXN0KQorICAgICAgcmV0dXJuKC0yKTsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCisgICAgaWYgKCFmKSBmID0gIiI7CisgICAgaWYgKCEqZikgcmV0dXJuKC0xKTsKKworI2lmZGVmIENLUk9PVAorICAgIGRlYnVnKEYxMTEsInpwcmludCBzZXRyb290Iixja3Jvb3QsY2tyb290c2V0KTsKKyAgICBpZiAoY2tyb290c2V0KSBpZiAoIXppbnJvb3QoZikpIHsKKwlkZWJ1ZyhGMTEwLCJ6cHJpbnQgc2V0cm9vdCB2aW9sYXRpb24iLGYsMCk7CisJcmV0dXJuKC0xKTsKKyAgICB9CisjZW5kaWYgLyogQ0tST09UICovCisKKyAgICBkZWJ1ZyhGMTEwLCJ6cHJpbnQgZmlsZSIsZiwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJ6cHJpbnQgZmxhZ3MiLHAsMCk7CisgICAgZGVidWcoRjExMCwienByaW50IHByaW50ZXJuYW1lIixwcmludGVybmFtZSwwKTsKKyAgICBkZWJ1ZyhGMTAxLCJ6cHJpbnQgcHJpbnRwaXBlIiwiIixwcmludHBpcGUpOworCisjaWZkZWYgVU5JWAorLyoKKyAgTm90ZSB1c2Ugb2Ygc3RhbmRhcmQgaW5wdXQgcmVkaXJlY3Rpb24uICBJbiBzb21lIHN5c3RlbXMsIGxwW3JdIHJ1bnMKKyAgc2V0dWlkIHRvIGxwIChvciAuLi4/KSwgc28gaWYgdXNlciBoYXMgc2VudCBhIGZpbGUgaW50byBhIGRpcmVjdG9yeQorICB0aGF0IGxwIGRvZXMgbm90IGhhdmUgcmVhZCBhY2Nlc3MgdG8sIGl0IGNhbid0IGJlIHByaW50ZWQgdW5sZXNzIGl0IGlzCisgIGZlZCB0byBscFtyXSBhcyBzdGFuZGFyZCBpbnB1dC4KKyovCisgICAgaWYgKHByaW50cGlwZSAmJiBwcmludGVybmFtZSkgeworCW4gPSA4ICsgKGludClzdHJsZW4oZikgKyAoaW50KXN0cmxlbihwcmludGVybmFtZSk7CisJaWYgKG4gPiBaTUJVRkxFTikKKwkgIHJldHVybigtMik7CisgICAgICAgIHNwcmludGYoem1idWYsImNhdCAlcyB8ICVzIiwgZiwgcHJpbnRlcm5hbWUpOworICAgIH0gZWxzZSBpZiAocHJpbnRlcm5hbWUpIHsKKwluID0gOCArIChpbnQpc3RybGVuKGYpICsgKGludClzdHJsZW4ocHJpbnRlcm5hbWUpOworCWlmIChuID4gWk1CVUZMRU4pCisJICByZXR1cm4oLTIpOworICAgICAgICBzcHJpbnRmKHptYnVmLCJjYXQgJXMgPj4gJXMiLCBmLCBwcmludGVybmFtZSk7CisgICAgfSBlbHNlIHsKKwluID0gNCArIChpbnQpc3RybGVuKFBSSU5UQ01EKSArIChpbnQpc3RybGVuKHApICsgKGludClzdHJsZW4oZik7CisJaWYgKG4gPiBaTUJVRkxFTikKKwkgIHJldHVybigtMik7CisgICAgICAgIHNwcmludGYoem1idWYsIiVzICVzIDwgJXMiLCBQUklOVENNRCwgcCwgZik7CisgICAgfQorICAgIGRlYnVnKEYxMTAsInpwcmludCBjb21tYW5kIix6bWJ1ZiwwKTsKKyAgICB6c3lzY21kKHptYnVmKTsKKyNlbHNlIC8qIE5vdCBVTklYICovCisgICAgKnptYnVmID0gJ1wwJzsKKyNlbmRpZiAvKiBVTklYICovCisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIE5PRlJJTExTICovCisKKy8qICBXaWxkY2FyZCBleHBhbnNpb24gZnVuY3Rpb25zLi4uICAqLworCitzdGF0aWMgY2hhciBzY3JhdGNoW01BWFBBVEgrNF07ICAgICAgICAgLyogVXNlZCBieSBib3RoIG1ldGhvZHMgKi8KKworc3RhdGljIGludCBvbGRtdGNocyA9IDA7ICAgICAgICAgICAgICAgIC8qIExldCBzaGVsbCAobHMpIGV4cGFuZCB0aGVtLiAqLworI2lmZGVmIENPTU1FTlQKK3N0YXRpYyBjaGFyICpsc2NtZCA9ICIvYmluL2xzIC1kIjsgICAgICAvKiBDb21tYW5kIHRvIHVzZS4gKi8KKyNlbHNlCitzdGF0aWMgY2hhciAqbHNjbWQgPSAiZWNobyI7ICAgICAgICAgICAgLyogQ29tbWFuZCB0byB1c2UuICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjaWZuZGVmIE5PUFVTSAoraW50CitzaHhwYW5kKHBhdCxuYW1sc3QsbGVuKSBjaGFyICpwYXQsICpuYW1sc3RbXTsgaW50IGxlbjsgeworICAgIGNoYXIgKmZnYnVmID0gTlVMTDsgICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBmb3IgZm9ybWluZyBscyBjb21tYW5kICovCisgICAgY2hhciAqcCwgKnE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogV29ya2VycyAqLworCisgICAgaW50IGksIHgsIHJldGNvZGUsIGl0c2FkaXI7CisgICAgY2hhciBjOworCisgICAgeCA9IChpbnQpc3RybGVuKHBhdCkgKyAoaW50KXN0cmxlbihsc2NtZCkgKyAzOyAvKiBMZW5ndGggb2YgbHMgY29tbWFuZCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBvbGRtdGNoczsgaSsrKSB7ICAgIC8qIEZyZWUgcHJldmlvdXMgZmlsZSBsaXN0ICovCisgICAgICAgIGlmIChuYW1sc3RbaV0gKSB7ICAgICAgICAgICAgICAgLyogSWYgbWVtb3J5IGlzIGFsbG9jYXRlZCAgKi8KKyAgICAgICAgICAgIGZyZWUobmFtbHN0W2ldKTsgICAgICAgICAgICAvKiBGcmVlIHRoZSBtZW1vcnkgICAgICAgICAqLworICAgICAgICAgICAgbmFtbHN0W2ldID0gTlVMTCA7ICAgICAgICAgIC8qIFJlbWVtYmVyIG5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBvbGRtdGNocyA9IDAgOyAgICAgICAgICAgICAgICAgICAgICAvKiBSZW1lbWJlciB0aGVyZSBhcmUgbm8gbWF0Y2hlcyAqLworICAgIGZnYnVmID0gbWFsbG9jKHgpOyAgICAgICAgICAgICAgICAgIC8qIEdldCBidWZmZXIgZm9yIGNvbW1hbmQgKi8KKyAgICBpZiAoIWZnYnVmKSByZXR1cm4oLTEpOyAgICAgICAgICAgICAvKiBGYWlsIGlmIGNhbm5vdCAqLworICAgIGNrbWFrbXNnKGZnYnVmLHgsbHNjbWQsIiAiLHBhdCxOVUxMKTsgLyogRm9ybSB0aGUgY29tbWFuZCAqLworICAgIHp4Y21kKFpJRklMRSxmZ2J1Zik7ICAgICAgICAgICAgICAgIC8qIFN0YXJ0IHRoZSBjb21tYW5kICovCisgICAgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSBjb3VudGVyICovCisgICAgcCA9IHNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gc2NyYXRjaCBhcmVhICovCisgICAgcmV0Y29kZSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIGZhaWx1cmUgKi8KKyAgICB3aGlsZSAoKHggPSB6bWluY2hhcigpKSAhPSAtMSkgeyAgICAvKiBSZWFkIGNoYXJhY3RlcnMgZnJvbSBjb21tYW5kICovCisgICAgICAgIGMgPSAoY2hhcikgeDsKKyAgICAgICAgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1xuJykgeyAgICAvKiBHb3QgbmV3bGluZSBvciBzcGFjZT8gKi8KKyAgICAgICAgICAgICpwID0gJ1wwJzsgICAgICAgICAgICAgICAgICAvKiBZZXMsIHRlcm1pbmF0ZSBzdHJpbmcgKi8KKyAgICAgICAgICAgIHAgPSBzY3JhdGNoOyAgICAgICAgICAgICAgICAvKiBQb2ludCBiYWNrIHRvIGJlZ2lubmluZyAqLworICAgICAgICAgICAgaWYgKHpjaGtpKHApID09IC0xKSAgICAgICAgIC8qIERvZXMgZmlsZSBleGlzdD8gKi8KKyAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAvKiBObywgY29udGludWUgKi8KKyAgICAgICAgICAgIGl0c2FkaXIgPSBpc2RpcihwKTsgICAgICAgICAvKiBZZXMsIGlzIGl0IGEgZGlyZWN0b3J5PyAqLworICAgICAgICAgICAgaWYgKHhkaXJvbmx5ICYmICFpdHNhZGlyKSAgIC8qIFdhbnQgb25seSBkaXJzIGJ1dCB0aGlzIGlzbid0ICovCisgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgLyogc28gc2tpcC4gKi8KKyAgICAgICAgICAgIGlmICh4Zmlsb25seSAmJiBpdHNhZGlyKSAgICAvKiBJdCdzIGEgZGlyIGJ1dCB3YW50IG9ubHkgZmlsZXMgKi8KKyAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAvKiBzbyBza2lwLiAqLworICAgICAgICAgICAgeCA9IChpbnQpc3RybGVuKHApOyAgICAgICAgIC8qIEtlZXAgLSBnZXQgbGVuZ3RoIG9mIG5hbWUgKi8KKyAgICAgICAgICAgIHEgPSBtYWxsb2MoeCsxKTsgICAgICAgICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgaXQgKi8KKyAgICAgICAgICAgIGlmICghcSkgZ290byBzaHhmaW47ICAgICAgICAvKiBGYWlsIGlmIHNwYWNlIGNhbid0IGJlIG9idGFpbmVkICovCisgICAgICAgICAgICBzdHJjcHkocSxzY3JhdGNoKTsgICAgICAgICAgLyogKHNhZmUpIENvcHkgbmFtZSB0byBzcGFjZSAqLworICAgICAgICAgICAgbmFtbHN0W2krK10gPSBxOyAgICAgICAgICAgIC8qIENvcHkgcG9pbnRlciB0byBuYW1lIGludG8gYXJyYXkgKi8KKyAgICAgICAgICAgIGlmIChpID49IGxlbikgZ290byBzaHhmaW47ICAvKiBGYWlsIGlmIHRvbyBtYW55ICovCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVndWxhciBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICpwKysgPSBjOyAgICAgICAgICAgICAgICAgICAvKiBDb3B5IGl0IGludG8gc2NyYXRjaCBhcmVhICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0Y29kZSA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIG51bWJlciBvZiBtYXRjaGluZyBmaWxlcyAqLworc2h4ZmluOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1vbiBleGl0IHBvaW50ICovCisgICAgZnJlZShmZ2J1Zik7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBjb21tYW5kIGJ1ZmZlciAqLworICAgIGZnYnVmID0gTlVMTDsKKyAgICB6Y2xvc2YoWklGSUxFKTsgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGhlIGNvbW1hbmQgZm9yay4gKi8KKyAgICBvbGRtdGNocyA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBSZW1lbWJlciBob3cgbWFueSBmaWxlcyAqLworICAgIHJldHVybihyZXRjb2RlKTsKK30KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworLyoKKyAgRGlyZWN0b3J5LXJlYWRpbmcgZnVuY3Rpb25zIGZvciBVTklYIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgQy1LZXJtaXQgNC4wCisgIGJ5IEplZmYgRGFtZW5zLCBDVUNDQSwgMTk4NC4KKyovCitzdGF0aWMgY2hhciAqIHhwYXQgPSBOVUxMOyAgICAgICAgICAgICAgLyogR2xvYmFsIGNvcHkgb2YgZmdlbigpIHBhdHRlcm4gKi8KK3N0YXRpYyBjaGFyICogeHBhdGxhc3QgPSBOVUxMOyAgICAgICAgICAvKiBSaWdodG1vc3Qgc2VnbWVudCBvZiBwYXR0ZXJuKi8KK3N0YXRpYyBpbnQgeHBhdHNsYXNoID0gMDsgICAgICAgICAgICAgICAvKiBTbGFzaCBjb3VudCBpbiBwYXR0ZXJuICovCitzdGF0aWMgaW50IHhwYXR3aWxkID0gMDsgICAgICAgICAgICAgICAgLyogT3JpZ2luYWwgcGF0dGVybiBpcyB3aWxkICovCitzdGF0aWMgaW50IHhsZWFmd2lsZCA9IDA7ICAgICAgICAgICAgICAgLyogTGFzdCBzZWdtZW50IG9mIHBhdHRlcm4gaXMgd2lsZCAqLworc3RhdGljIGludCB4cGF0YWJzb2x1dGUgPSAwOworCisjaWZkZWYgYWVnaXMKK3N0YXRpYyBjaGFyIGJzbGFzaDsKKyNlbmRpZiAvKiBhZWdpcyAqLworCisKKy8qICBTIFAgTCBJIFQgUCBBIFQgSCAgKi8KKworLyoKKyAgU3BsaXRzIHRoZSBzbGFzaC1zZXBhcmF0ZWQgcG9ydGlvbnMgb2YgdGhlIGFyZ3VtZW50IHN0cmluZyBpbnRvCisgIGEgbGlzdCBvZiBwYXRoIHN0cnVjdHVyZXMuICBSZXR1cm5zIHRoZSBoZWFkIG9mIHRoZSBsaXN0LiAgVGhlCisgIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBieSBtYWxsb2MsIHNvIHRoZXkgbXVzdCBiZSBmcmVlZC4KKyAgU3BsaXRwYXRoIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgZmlsZW5hbWUgZ2VuZXJhdG9yLgorCisgIElucHV0OgorICAgIEEgcGF0aCBzdHJpbmcuCisKKyAgUmV0dXJuczoKKyAgICBBIGxpbmtlZCBsaXN0IG9mIHRoZSBzbGFzaC1zZXBhcmF0ZWQgc2VnbWVudHMgb2YgdGhlIGlucHV0LgorKi8KK3N0YXRpYyBzdHJ1Y3QgcGF0aCAqCitzcGxpdHBhdGgocCkgY2hhciAqcDsgeworICAgIHN0cnVjdCBwYXRoICpoZWFkLCpjdXIsKnBydjsKKyAgICBpbnQgaTsKKworICAgIGRlYnVnKEYxMTEsInNwbGl0cGF0aCIscCx4cmVjdXJzaXZlKTsKKyAgICBoZWFkID0gcHJ2ID0gTlVMTDsKKworICAgIGlmICghcCkgcmV0dXJuKE5VTEwpOworICAgIGlmICghKnApIHJldHVybihOVUxMKTsKKworICAgIGlmICghc3RyY21wKHAsIioqIikpIHsgICAgICAgICAgICAgIC8qIEZpeCB0aGlzICovCisgICAgICAgIHAgPSAiKiI7CisgICAgfQorICAgIGlmIChJU0RJUlNFUCgqcCkpIHArKzsgICAgICAgICAgICAgIC8qIFNraXAgbGVhZGluZyBzbGFzaCBpZiBhbnkgKi8KKworICAgIC8qIE1ha2UgbGlua2VkIGxpc3Qgb2YgcGF0aCBzZWdtZW50cyBmcm9tIHBhdHRlcm4gKi8KKworICAgIHdoaWxlICgqcCkgeworICAgICAgICBjdXIgPSAoc3RydWN0IHBhdGggKikgbWFsbG9jKHNpemVvZiAoc3RydWN0IHBhdGgpKTsKKyAgICAgICAgZGVidWcoRjEwMSwic3BsaXRwYXRoIG1hbGxvYyIsIiIsY3VyKTsKKyAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJzcGxpdHBhdGggbWFsbG9jIGZhaWx1cmUiLCIiLDApOworICAgICAgICAgICAgcHJ2IC0+IGZ3ZCA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4oKHN0cnVjdCBwYXRoICopTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgY3VyIC0+IGZ3ZCA9IE5VTEw7CisgICAgICAgIGlmIChoZWFkID09IE5VTEwpICAgICAgICAgICAgICAgLyogRmlyc3QsIG1ha2UgbGlzdCBoZWFkICovCisgICAgICAgICAgaGVhZCA9IGN1cjsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgZmlyc3QsIGxpbmsgaW50byBjaGFpbiAqLworICAgICAgICAgIHBydiAtPiBmd2QgPSBjdXI7CisgICAgICAgIHBydiA9IGN1cjsgICAgICAgICAgICAgICAgICAgICAgLyogTGluayBmcm9tIHByZXZpb3VzIHRvIHRoaXMgb25lICovCisKKyNpZmRlZiBhZWdpcworICAgICAgICAvKiB0cmVhdCBiYWNrc2xhc2ggYXMgIi4uLyIgKi8KKyAgICAgICAgaWYgKGJzbGFzaCAmJiAqcCA9PSBic2xhc2gpIHsKKyAgICAgICAgICAgIHN0cmNweShjdXItPm5wYXJ0LCAiLi4iKTsJLyogc2FmZSAqLworICAgICAgICAgICAgKytwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBNQVhOQU1MRU4gJiYgKnAgJiYgKnAgIT0gJy8nICYmICpwICE9IGJzbGFzaDsgaSsrKQorICAgICAgICAgICAgICBjdXIgLT4gbnBhcnRbaV0gPSAqcCsrOworICAgICAgICAgICAgY3VyIC0+IG5wYXJ0W2ldID0gJ1wwJzsgICAgIC8qIGVuZCB0aGlzIHNlZ21lbnQgKi8KKyAgICAgICAgICAgIGlmIChpID49IE1BWE5BTUxFTikKKyAgICAgICAgICAgICAgd2hpbGUgKCpwICYmICpwICE9ICcvJyAmJiAqcCAhPSBic2xhc2gpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgIGlmICgqcCA9PSAnLycpIHArKzsKKyNlbHNlCisgICAgICAgIC8qIEdlbmVyYWwgY2FzZSAoVU5JWCkgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWE5BTUxFTiAmJiAhSVNESVJTRVAoKnApICYmICpwICE9ICdcMCc7IGkrKykgeworICAgICAgICAgICAgY3VyIC0+IG5wYXJ0W2ldID0gKnArKzsKKyAgICAgICAgfQorCisgICAgICAgIGN1ciAtPiBucGFydFtpXSA9ICdcMCc7ICAgICAgICAgLyogRW5kIHRoaXMgcGF0aCBzZWdtZW50ICovCisgICAgICAgIGlmIChpID49IE1BWE5BTUxFTikKKyAgICAgICAgICB3aGlsZSAoIUlTRElSU0VQKCpwKSAmJiAqcCAhPSAnXDAnKSBwKys7CisgICAgICAgIGlmIChJU0RJUlNFUCgqcCkpCisgICAgICAgICAgcCsrOworCisjZW5kaWYgLyogYWVnaXMgKi8KKyAgICB9CisgICAgaWYgKHBydikgeworICAgICAgICBtYWtlc3RyKCZ4cGF0bGFzdCxwcnYgLT4gbnBhcnQpOworICAgICAgICBkZWJ1ZyhGMTEwLCJzcGxpdHBhdGggeHBhdGxhc3QiLHhwYXRsYXN0LDApOworICAgIH0KKyNpZmRlZiBERUJVRworICAgIC8qIFNob3cgb3JpZ2luYWwgcGF0aCBsaXN0ICovCisgICAgaWYgKGRlYmxvZykgeworICAgICAgICBmb3IgKGkgPSAwLCBjdXIgPSBoZWFkOyBjdXI7IGkrKykgeworICAgICAgICAgICAgZGVidWcoRjExMSwiU1BMSVRQQVRIIixjdXIgLT4gbnBhcnQsIGkpOworICAgICAgICAgICAgY3VyID0gY3VyIC0+IGZ3ZDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJldHVybihoZWFkKTsKK30KKworLyogIEYgRyBFIE4gIC0tICBHZW5lcmF0ZSBGaWxlIExpc3QgICovCisKKy8qCisgIEZpbGUgbmFtZSBnZW5lcmF0b3IuICBJdCBpcyBwYXNzZWQgYSBzdHJpbmcsIHBvc3NpYmx5IGNvbnRhaW5pbmcgd2lsZGNhcmRzLAorICBhbmQgYW4gYXJyYXkgb2YgY2hhcmFjdGVyIHBvaW50ZXJzLiAgSXQgZmluZHMgYWxsIHRoZSBtYXRjaGluZyBmaWxlbmFtZXMgYW5kCisgIHN0b3JlcyBwb2ludGVycyB0byB0aGVtIGluIHRoZSBhcnJheS4gIFRoZSByZXR1cm5lZCBzdHJpbmdzIGFyZSBhbGxvY2F0ZWQKKyAgZnJvbSBhIHN0YXRpYyBidWZmZXIgbG9jYWwgdG8gdGhpcyBtb2R1bGUgKHNvIHRoZSBjYWxsZXIgZG9lc24ndCBoYXZlIHRvCisgIHdvcnJ5IGFib3V0IGRlYWxsb2NhdGluZyB0aGVtKTsgdGhpcyBtZWFucyB0aGF0IHN1Y2Nlc3NpdmUgY2FsbHMgdG8gZmdlbgorICB3aWxsIHdpcGUgb3V0IHRoZSByZXN1bHRzIG9mIHByZXZpb3VzIGNhbGxzLgorCisgIElucHV0OgorICAgIEEgd2lsZGNhcmQgc3RyaW5nLCBhbiBhcnJheSB0byB3cml0ZSBuYW1lcyB0bywgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgbnVtYmVyIG9mIG1hdGNoZXMuCisgICAgVGhlIGFycmF5IGlzIGZpbGxlZCB3aXRoIGZpbGVuYW1lcyB0aGF0IG1hdGNoZWQgdGhlIHBhdHRlcm4uCisgICAgSWYgdGhlcmUgd2Fzbid0IGVub3VnaCByb29tIGluIHRoZSBhcnJheSwgLTEgaXMgcmV0dXJuZWQuCisKKyAgT3JpZ2luYWxseSBieTogSmVmZiBEYW1lbnMsIENVQ0NBLCAxOTg0LiAgTWFueSBjaGFuZ2VzIHNpbmNlIHRoZW4uCisqLworc3RhdGljIGludAorZmdlbihwYXQscmVzYXJyeSxsZW4pIGNoYXIgKnBhdCwqcmVzYXJyeVtdOyBpbnQgbGVuOyB7CisgICAgc3RydWN0IHBhdGggKmhlYWQ7CisgICAgY2hhciAqc3B0ciwgKnM7CisgICAgaW50IG47CisKKyNpZmRlZiBhZWdpcworICAgIGNoYXIgKm5hbWVjaGFyczsKKyAgICBpbnQgdGlsZGUgPSAwLCBicXVvdGUgPSAwOworCisgICAgaWYgKChuYW1lY2hhcnMgPSBnZXRlbnYoIk5BTUVDSEFSUyIpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChja3N0cmNocihuYW1lY2hhcnMsICd+JyApICE9IE5VTEwpIHRpbGRlICA9ICd+JzsKKyAgICAgICAgaWYgKGNrc3RyY2hyKG5hbWVjaGFycywgJ1xcJykgIT0gTlVMTCkgYnNsYXNoID0gJ1xcJzsKKyAgICAgICAgaWYgKGNrc3RyY2hyKG5hbWVjaGFycywgJ2AnICkgIT0gTlVMTCkgYnF1b3RlID0gJ2AnOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpbGRlID0gJ34nOyBic2xhc2ggPSAnXFwnOyBicXVvdGUgPSAnYCc7CisgICAgfQorICAgIHNwdHIgPSBzY3JhdGNoOworCisgICAgLyogY29weSAiYG5vZGVfZGF0YSIsIGV0Yy4gYW5jaG9ycyAqLworICAgIGlmIChicXVvdGUgJiYgKnBhdCA9PSBicXVvdGUpCisgICAgICB3aGlsZSAoKnBhdCAmJiAqcGF0ICE9ICcvJyAmJiAqcGF0ICE9IGJzbGFzaCkKKyAgICAgICAgKnNwdHIrKyA9ICpwYXQrKzsKKyAgICBlbHNlIGlmICh0aWxkZSAmJiAqcGF0ID09IHRpbGRlKQorICAgICAgKnNwdHIrKyA9ICpwYXQrKzsKKyAgICB3aGlsZSAoKnBhdCA9PSAnLycpCisgICAgICAqc3B0cisrID0gKnBhdCsrOworICAgIGlmIChzcHRyID09IHNjcmF0Y2gpIHsKKyAgICAgICAgc3RyY3B5KHNjcmF0Y2gsIi4vIik7CQkvKiBzYWZlICovCisgICAgICAgIHNwdHIgPSBzY3JhdGNoKzI7CisgICAgfQorICAgIGlmICghKGhlYWQgPSBzcGxpdHBhdGgocGF0KSkpIHJldHVybigtMSk7CisKKyNlbHNlIC8qIG5vdCBhZWdpcyAqLworCisgICAgZGVidWcoRjExMSwiZmdlbiBwYXQiLHBhdCxsZW4pOworICAgIGRlYnVnKEYxMTAsImZnZW4gY3VycmVudCBkaXJlY3RvcnkiLHpndGRpcigpLDApOworICAgIGRlYnVnKEYxMDEsImZnZW4gc3RhdGhhY2siLCIiLHN0YXRoYWNrKTsKKworICAgIHNjcmF0Y2hbMF0gPSAnXDAnOworICAgIHhwYXR3aWxkID0gMDsKKyAgICB4bGVhZndpbGQgPSAwOworICAgIHhwYXRhYnNvbHV0ZSA9IDA7CisKKyAgICBpZiAoIShoZWFkID0gc3BsaXRwYXRoKHBhdCkpKSAgICAgICAvKiBNYWtlIHRoZSBwYXRoIHNlZ21lbnQgbGlzdCAqLworCXJldHVybigtMSk7CisKKyAgICBzcHRyID0gc2NyYXRjaDsKKworI2lmZGVmIENPTU1FTlQKKyAgICBpZiAoc3RybmNtcChwYXQsIi4vIiwyKSAmJiBzdHJuY21wKHBhdCwiLi4vIiwzKSkgeworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwlpZiAoIUlTRElSU0VQKCpwYXQpKQkJLyogSWYgbmFtZSBpcyBub3QgYWJzb2x1dGUgKi8KKwkgICpzcHRyKysgPSAnLic7CQkvKiBwdXQgIi4vIiBpbiBmcm9udC4gKi8KKwkqc3B0cisrID0gRElSU0VQOworI2lmZGVmIENPTU1FTlQKKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICpzcHRyID0gJ1wwJzsKKyNlbmRpZiAvKiBhZWdpcyAqLworCisgICAgbWFrZXN0cigmeHBhdCxwYXQpOyAgICAgICAgICAgICAgICAgLyogU2F2ZSBjb3B5IG9mIG9yaWdpbmFsIHBhdHRlcm4gKi8KKyAgICBkZWJ1ZyhGMTEwLCJmZ2VuIHNjcmF0Y2giLHNjcmF0Y2gsMCk7CisKKyAgICBmb3IgKG4gPSAwLCBzID0geHBhdDsgKnM7IHMrKykgICAgICAvKiBIb3cgbWFueSBzbGFzaGVzIGluIHRoZSBwYXR0ZXJuICovCisgICAgICBpZiAoKnMgPT0gRElSU0VQKSAgICAgICAgICAgICAgICAgLyogc2luY2UgdGhlc2UgYXJlIGZlbmNlcyBmb3IgKi8KKyAgICAgICAgbisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYXR0ZXJuIG1hdGNoaW5nICovCisgICAgeHBhdHNsYXNoID0gbjsKKyAgICBkZWJ1ZyhGMTAxLCJmZ2VuIHhwYXRzbGFzaCIsIiIseHBhdHNsYXNoKTsKKworICAgIG51bWZuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vbmUgZm91bmQgeWV0ICovCisKKyAgICBpZiAoaW5pdHNwYWNlKHJlc2Fycnksc3NwbGVuKSA8IDApCisgICAgICByZXR1cm4oLTEpOworCisgICAgeHBhdHdpbGQgPSBpc3dpbGQoeHBhdCk7CQkvKiBPcmlnaW5hbCBwYXR0ZXJuIGlzIHdpbGQ/ICovCisgICAgeHBhdGFic29sdXRlID0gaXNhYnNvbHV0ZSh4cGF0KTsKKyAgICB4bGVhZndpbGQgPSBpc3dpbGQoeHBhdGxhc3QpOworCisgICAgZGVidWcoRjExMSwiZmdlbiB4cGF0Iix4cGF0LHhwYXR3aWxkKTsKKyAgICBkZWJ1ZyhGMTExLCJmZ2VuIHhwYXRsYXN0Iix4cGF0bGFzdCx4bGVhZndpbGQpOworICAgIGRlYnVnKEYxMDEsImZnZW4geHBhdGFic29sdXRlIiwiIix4cGF0YWJzb2x1dGUpOworCisgICAgdHJhdmVyc2UoaGVhZCxzY3JhdGNoLHNwdHIpOyAgICAgICAgLyogR28gd2FsayB0aGUgZGlyZWN0b3J5IHRyZWUuICovCisgICAgd2hpbGUgKGhlYWQgIT0gTlVMTCkgeyAgICAgICAgICAgICAgLyogRG9uZSAtIGZyZWUgcGF0aCBzZWdtZW50IGxpc3QuICovCisgICAgICAgIHN0cnVjdCBwYXRoICpuZXh0ID0gaGVhZCAtPiBmd2Q7CisgICAgICAgIGZyZWUoKGNoYXIgKiloZWFkKTsKKyAgICAgICAgaGVhZCA9IG5leHQ7CisgICAgfQorICAgIGRlYnVnKEYxMDEsImZnZW4iLCIiLG51bWZuZCk7CisgICAgcmV0dXJuKG51bWZuZCk7ICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyAqLworfQorCisvKiBEZWZpbmUgTE9OR0ZOIChsb25nIGZpbGUgbmFtZXMpIGF1dG9tYXRpY2FsbHkgZm9yIEJTRCAyLjkgYW5kIDQuMiAqLworLyogTE9OR0ZOIGNhbiBhbHNvIGJlIGRlZmluZWQgb24gdGhlIGNjIGNvbW1hbmQgbGluZS4gKi8KKworI2lmZGVmIEJTRDI5CisjaWZuZGVmIExPTkdGTgorI2RlZmluZSBMT05HRk4KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBCU0Q0MgorI2lmbmRlZiBMT05HRk4KKyNkZWZpbmUgTE9OR0ZOCisjZW5kaWYKKyNlbmRpZgorCisvKgorICAgVCBSIEEgViBFIFIgUyBFICAtLSAgVHJhdmVyc2UgYSBkaXJlY3RvcnkgdHJlZS4KKworICAgV2Fsa3MgdGhlIGRpcmVjdG9yeSB0cmVlIGxvb2tpbmcgZm9yIG1hdGNoZXMgdG8gaXRzIGFyZ3VtZW50cy4KKyAgIFRoZSBhbGdvcml0aG0gaXMsIGJyaWVmbHk6CisKKyAgICBJZiB0aGUgY3VycmVudCBwYXR0ZXJuIHNlZ21lbnQgY29udGFpbnMgbm8gd2lsZGNhcmRzLCB0aGF0CisgICAgc2VnbWVudCBpcyBhZGRlZCB0byB3aGF0IHdlIGFscmVhZHkgaGF2ZS4gIElmIHRoZSBuYW1lIHNvIGZhcgorICAgIGV4aXN0cywgd2UgY2FsbCBvdXJzZWx2ZXMgcmVjdXJzaXZlbHkgd2l0aCB0aGUgbmV4dCBzZWdtZW50CisgICAgaW4gdGhlIHBhdHRlcm4gc3RyaW5nOyBvdGhlcndpc2UsIHdlIGp1c3QgcmV0dXJuLgorCisgICAgSWYgdGhlIGN1cnJlbnQgcGF0dGVybiBzZWdtZW50IGNvbnRhaW5zIHdpbGRjYXJkcywgd2Ugb3BlbiB0aGUgbmFtZQorICAgIHdlJ3ZlIGFjY3VtdWxhdGVkIHNvIGZhciAoYXNzdW1pbmcgaXQgaXMgcmVhbGx5IGEgZGlyZWN0b3J5KSwgdGhlbiByZWFkCisgICAgZWFjaCBmaWxlbmFtZSBpbiBpdCwgYW5kLCBpZiBpdCBtYXRjaGVzIHRoZSB3aWxkY2FyZCBwYXR0ZXJuIHNlZ21lbnQsIGFkZAorICAgIHRoYXQgZmlsZW5hbWUgdG8gd2hhdCB3ZSBoYXZlIHNvIGZhciBhbmQgY2FsbCBvdXJzZWx2ZXMgcmVjdXJzaXZlbHkgb24KKyAgICB0aGUgbmV4dCBzZWdtZW50LgorCisgICAgRmluYWxseSwgd2hlbiBubyBtb3JlIHBhdHRlcm4gc2VnbWVudHMgcmVtYWluLCB3ZSBhZGQgd2hhdCdzIGFjY3VtdWxhdGVkCisgICAgc28gZmFyIHRvIHRoZSByZXN1bHQgYXJyYXkgYW5kIGluY3JlbWVudCB0aGUgbnVtYmVyIG9mIG1hdGNoZXMuCisKKyAgSW5wdXRzOgorICAgIEEgcGF0dGVybiBwYXRoIGxpc3QgKGFzIGdlbmVyYXRlZCBieSBzcGxpdHBhdGgpLCBhIHN0cmluZyBwb2ludGVyIHRoYXQKKyAgICBwb2ludHMgdG8gd2hhdCB3ZSd2ZSB0cmF2ZXJzZWQgc28gZmFyICh0aGlzIGNhbiBiZSBpbml0aWFsaXplZCB0byAiLyIKKyAgICB0byBzdGFydCB0aGUgc2VhcmNoIGF0IHRoZSByb290IGRpcmVjdG9yeSwgb3IgdG8gIi4vIiB0byBzdGFydCB0aGUKKyAgICBzZWFyY2ggYXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5KSwgYW5kIGEgc3RyaW5nIHBvaW50ZXIgdG8gdGhlIGVuZCBvZgorICAgIHRoZSBzdHJpbmcgaW4gdGhlIHByZXZpb3VzIGFyZ3VtZW50LCBwbHVzIHRoZSBnbG9iYWwgInJlY3Vyc2l2ZSIsCisgICAgInhtYXRjaGRvdCIsIGFuZCAieGRpcm9ubHkiIGZsYWdzLgorCisgIFJldHVybnM6IHZvaWQsIHdpdGg6CisgICAgbXRjaHNbXSBjb250YWluaW5nIHRoZSBhcnJheSBvZiBmaWxlbmFtZSBzdHJpbmcgcG9pbnRlcnMsIGFuZDoKKyAgICBudW1mbmQgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGZpbGVuYW1lcy4KKworICBBbHRob3VnaCBpdCBtaWdodCBiZSBwb29yIHByYWN0aWNlLCB0aGUgbXRjaHNbXSBhcnJheSBpcyByZXZlYWxlZCB0byB0aGUKKyAgb3V0c2lkZSBpbiBjYXNlIGl0IG5lZWRzIGl0OyBmb3IgZXhhbXBsZSwgdG8gYmUgc29ydGVkIHByaW9yIHRvIHVzZS4KKyAgKEl0IGlzIHBvb3IgcHJhY3RpY2UgYmVjYXVzZSBub3QgYWxsIHBsYXRmb3JtcyBpbXBsZW1lbnQgZmlsZSBsaXN0cyB0aGUKKyAgc2FtZSB3YXk7IHNvbWUgZG9uJ3QgdXNlIGFuIGFycmF5IGF0IGFsbC4pCisKKyAgTm90ZSB0aGF0IGFkZHJlc3VsdCgpIGFjdHMgYXMgYSBzZWNvbmQtbGV2ZWwgZmlsdGVyOyBkdWUgdG8gc2VsZWN0aW9uCisgIGNyaXRlcmlhIG91dHNpZGUgb2YgdGhlIHBhdHRlcm4sIGl0IG1pZ2h0IGRlY2xpbmUgdG8gYWRkIGZpbGVzIHRoYXQKKyAgdGhpcyByb3V0aW5lIGFza3MgaXQgdG8sIGUuZy4gYmVjYXVzZSB3ZSBhcmUgY29sbGVjdGluZyBvbmx5IGRpcmVjdG9yeQorICBuYW1lcyBidXQgbm90IHRoZSBuYW1lcyBvZiByZWd1bGFyIGZpbGVzLgorCisgIFdBUk5JTkc6IEluIHRoZSBjb3Vyc2Ugb2YgQy1LZXJtaXQgNy4wIGRldmVsb3BtZW50LCB0aGlzIHJvdXRpbmUgYmVjYW1lCisgIHJpZGljdWxvdXNseSBjb21wbGV4LCBpbiBvcmRlciB0byBtZWV0IGFwcHJveGltYXRlbHkgc2l4dHkgc3BlY2lmaWMKKyAgcmVxdWlyZW1lbnRzLiAgRE9OJ1QgRVZFTiBUSElOSyBBQk9VVCBNT0RJRllJTkcgVEhJUyBST1VUSU5FISAgVHJ1c3QgbWU7CisgIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBmaXggYW55dGhpbmcgaW4gaXQgd2l0aG91dCBicmVha2luZyBzb21ldGhpbmcgZWxzZS4KKyAgVGhpcyByb3V0aW5lIGJhZGx5IG5lZWRzIGEgdG90YWwgcmVkZXNpZ24gYW5kIHJld3JpdGUuICBOb3RlOiBUaGVyZSBtYXkKKyAgYmUgc29tZSBnb29kIGFwcGxpY2F0aW9ucyBmb3IgcmVhbHBhdGgoKSBhbmQvb3Igc2NhbmRpcigpIGFuZC9vciBmdHNfYmxhaCgpCisgIGhlcmUsIG9uIHBsYXRmb3JtcyB3aGVyZSB0aGV5IGFyZSBhdmFpbGFibGUuCisqLworc3RhdGljIFZPSUQKK3RyYXZlcnNlKHBsLHNvZmFyLGVuZGN1cikgc3RydWN0IHBhdGggKnBsOyBjaGFyICpzb2ZhciwgKmVuZGN1cjsgeworCisvKiBBcHByb3ByaWF0ZSBkZWNsYXJhdGlvbnMgZm9yIGRpcmVjdG9yeSByb3V0aW5lcyBhbmQgc3RydWN0dXJlcyAqLworLyogI2RlZmluZSBPUEVORElSIG1lYW5zIHRvIHVzZSBvcGVuZGlyKCksIHJlYWRkaXIoKSwgY2xvc2VkaXIoKSAgKi8KKy8qIElmIE9QRU5ESVIgbm90IGRlZmluZWQsIHdlIHVzZSBvcGVuKCksIHJlYWQoKSwgY2xvc2UoKSAqLworCisjaWZkZWYgRElSRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHdheSwgPGRpcmVudC5oPiAqLworI2RlZmluZSBPUEVORElSCisgICAgRElSICpmZCwgKm9wZW5kaXIoKTsKKyAgICBzdHJ1Y3QgZGlyZW50ICpkaXJidWY7CisgICAgc3RydWN0IGRpcmVudCAqcmVhZGRpcigpOworI2Vsc2UgLyogIURJUkVOVCAqLworI2lmZGVmIExPTkdGTiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9sZCB3YXksIDxkaXIuaD4gd2l0aCBvcGVuZGlyKCkgKi8KKyNkZWZpbmUgT1BFTkRJUgorICAgIERJUiAqZmQsICpvcGVuZGlyKCk7CisgICAgc3RydWN0IGRpcmVjdCAqZGlyYnVmOworI2Vsc2UgLyogIUxPTkdGTiAqLworICAgIGludCBmZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9sZCB3YXksIDxkaXIuaD4gd2l0aCBvcGVuKCkgKi8KKyAgICBzdHJ1Y3QgZGlyZWN0IGRpcl9lbnRyeTsKKyAgICBzdHJ1Y3QgZGlyZWN0ICpkaXJidWYgPSAmZGlyX2VudHJ5OworI2VuZGlmIC8qIExPTkdGTiAqLworI2VuZGlmIC8qIERJUkVOVCAqLworICAgIGludCBtb3B0cyA9IDA7CQkJLyogY2ttYXRjaCgpIG9wdHMgKi8KKyAgICBpbnQgZGVwdGggPSAwOwkJCS8qIERpcmVjdG9yeSB0cmVlIGRlcHRoICovCisKKyAgICBjaGFyIG5hbWJ1ZltNQVhOQU1MRU4rNF07ICAgICAgICAgICAvKiBCdWZmZXIgZm9yIGEgZmlsZW5hbWUgKi8KKyAgICBpbnQgaXRzYWRpciA9IDAsIHNlZ2lzZGlyID0gMCwgaXRzd2lsZCA9IDAsIG1yZXN1bHQsIG4sIHggLyogLCB5ICovIDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOyAgICAgICAgICAgICAgICAvKiBGb3IgZmlsZSBpbmZvLiAqLworCisgICAgZGVidWcoRjEwMSwiU1RBVCIsIiIsMTYpOworICAgIGlmIChwbCA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBwYXRoLXNlZ21lbnQgbGlzdCAqLworICAgICAgICAqLS1lbmRjdXIgPSAnXDAnOyAvKiBUZXJtaW5hdGUgc3RyaW5nLCBvdmVyd3JpdGUgdHJhaWxpbmcgc2xhc2ggKi8KKyAgICAgICAgZGVidWcoRjExMCwidHJhdmVyc2UgYWRkOiBlbmQgb2YgcGF0aCBzZWdtZW50Iixzb2ZhciwwKTsKKyAgICAgICAgYWRkcmVzdWx0KHNvZmFyLC0xKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc3RhdGhhY2spIHsKKwkvKiBUaGlzIHNwZWVkcyB1cCB0aGUgc2VhcmNoIGEgbG90IGFuZCB3ZSBzdGlsbCBnZXQgZ29vZCByZXN1bHRzICovCisJLyogYnV0IGl0IGJyZWFrcyB0aGUgdGFnZ2luZyBvZiBkaXJlY3RvcnkgbmFtZXMgZG9uZSBpbiBhZGRyZXN1bHQgKi8KKwlpZiAoeHJlY3Vyc2l2ZSB8fCB4Zmlsb25seSB8fCB4ZGlyb25seSB8fCB4cGF0c2xhc2gpIHsKKwkgICAgaXRzYWRpciA9IHhpc2Rpcihzb2Zhcik7CisJICAgIGRlYnVnKEYxMDEsIlNUQVQiLCIiLDE3KTsKKwl9IGVsc2UKKwkgIGl0c2FkaXIgPSAoc3RybmNtcChzb2ZhciwiLi8iLDIpID09IDApOworICAgIH0gZWxzZSB7CisJaXRzYWRpciA9IHhpc2Rpcihzb2Zhcik7CisJZGVidWcoRjEwMSwiU1RBVCIsIiIsMTgpOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0cmF2ZXJzZSBlbnRyeSBzb2ZhciIsc29mYXIsaXRzYWRpcik7CisKKyNpZmRlZiBDS1NZTUxJTksgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSdyZSBkb2luZyBzeW1saW5rcz8gKi8KKyNpZmRlZiBVU0VfTFNUQVQgICAgICAgICAgICAgICAgICAgICAgICAvKiBPSyB0byB1c2UgbHN0YXQoKT8gKi8KKyAgICBpZiAoaXRzYWRpciAmJiB4bm9saW5rcykgewkJLyogSWYgbm90IGZvbGxvd2luZyBzeW1saW5rcyAqLworCWludCB4OworCXN0cnVjdCBzdGF0IGJ1ZjsKKwl4ID0gbHN0YXQoc29mYXIsJmJ1Zik7CisJZGVidWcoRjExMSwidHJhdmVyc2UgbHN0YXQgMSIsc29mYXIseCk7CisJaWYgKHggPiAtMSAmJgorI2lmZGVmIFNfSVNMTksKKwkgICAgU19JU0xOSyhidWYuc3RfbW9kZSkKKyNlbHNlCisjaWZkZWYgX0lGTE5LCisJICAgICgoX0lGTVQgJiBidWYuc3RfbW9kZSkgPT0gX0lGTE5LKQorI2VuZGlmIC8qIF9JRkxOSyAqLworI2VuZGlmIC8qIFNfSVNMTksgKi8KKwkgICAgKQorCSAgaXRzYWRpciA9IDA7CisgICAgfQorI2VuZGlmIC8qIFVTRV9MU1RBVCAqLworI2VuZGlmIC8qIENLU1lNTElOSyAqLworCisgICAgaWYgKCF4bWF0Y2hkb3QgJiYgeHBhdGxhc3RbMF0gPT0gJy4nKQorICAgICAgeG1hdGNoZG90ID0gMTsKKyAgICBpZiAoIXhtYXRjaGRvdCAmJiB4cGF0WzBdID09ICcuJyAmJiB4cGF0WzFdICE9ICcvJyAmJiB4cGF0WzFdICE9ICcuJykKKyAgICAgIHhtYXRjaGRvdCA9IDE7CisKKyAgICAvKiBja21hdGNoKCkgb3B0aW9ucyAqLworCisgICAgaWYgKHhtYXRjaGRvdCkgICBtb3B0cyB8PSAxOwkvKiBNYXRjaCBkb3QgKi8KKyAgICBpZiAoIXhyZWN1cnNpdmUpIG1vcHRzIHw9IDI7CS8qIERpcnNlcCBpcyBmZW5jZSAqLworCisgICAgZGVidWcoRjExMSwidHJhdmVyc2UgZW50cnkgeHBhdCIseHBhdCx4cGF0c2xhc2gpOworICAgIGRlYnVnKEYxMTEsInRyYXZlcnNlIGVudHJ5IHhwYXRsYXN0Iix4cGF0bGFzdCx4bWF0Y2hkb3QpOworICAgIGRlYnVnKEYxMTAsInRyYXZlcnNlIGVudHJ5IHBsIC0+IG5wYXJ0IixwbCAtPiBucGFydCwwKTsKKworI2lmZGVmIFJFQ1VSU0lWRQorICAgIGlmICh4cmVjdXJzaXZlID4gMCAmJiAhaXRzYWRpcikgeworICAgICAgICBjaGFyICogczsgICAgICAgICAvKiBSZWN1cnNpdmUgZGVzY2VudCBhbmQgdGhpcyBpcyBhIHJlZ3VsYXIgZmlsZSAqLworICAgICAgICAqLS1lbmRjdXIgPSAnXDAnOyAvKiBUZXJtaW5hdGUgc3RyaW5nLCBvdmVyd3JpdGUgdHJhaWxpbmcgc2xhc2ggKi8KKworICAgICAgICAvKiBGaW5kIHRoZSBudGggc2xhc2ggZnJvbSB0aGUgcmlnaHQgYW5kIG1hdGNoIGZyb20gdGhlcmUuLi4gKi8KKyAgICAgICAgLyogKG4gPT0gdGhlIG51bWJlciBvZiBzbGFzaGVzIGluIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIC0gc2VlIGZnZW4pICovCisgICAgICAgIGlmICgqc29mYXIgPT0gJy8nKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ0cmF2ZXJzZSB4cGF0c2xhc2ggYWJzb2x1dGUiLHNvZmFyLDApOworICAgICAgICAgICAgcyA9IHNvZmFyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWcoRjExMSwidHJhdmVyc2UgeHBhdHNsYXNoIHJlbGF0aXZlIixzb2Zhcix4cGF0c2xhc2gpOworICAgICAgICAgICAgZm9yIChzID0gZW5kY3VyIC0gMSwgbiA9IDA7IHMgPj0gc29mYXI7IHMtLSkgeworICAgICAgICAgICAgICAgIGlmICgqcyA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCsrbiA+PSB4cGF0c2xhc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjaWZuZGVmIE5PU0tJUE1BVENICisJLyogVGhpcyBzcGVlZHMgdGhpbmdzIHVwIGEgYml0LiAqLworCS8qIElmIGl0IGNhdXNlcyB0cm91YmxlIGRlZmluZSBOT1NLSVBNQVRDSCBhbmQgcmVidWlsZC4gKi8KKwlpZiAoeHBhdFswXSA9PSAnKicgJiYgIXhwYXRbMV0pCisJICB4ID0geG1hdGNoZG90ID8gMSA6IChzWzBdICE9ICcuJyk7CisJZWxzZQorI2VuZGlmIC8qIE5PU0tJUE1BVENIICovCisJICB4ID0gY2ttYXRjaCh4cGF0LCBzLCAxLCBtb3B0cyk7IC8qIE1hdGNoIHdpdGggb3JpZ2luYWwgcGF0dGVybiAqLworICAgICAgICBkZWJ1ZyhGMTExLCJ0cmF2ZXJzZSB4cGF0c2xhc2ggY2ttYXRjaCIscyx4KTsKKyAgICAgICAgaWYgKHggPiAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ0cmF2ZXJzZSBhZGQ6IHJlY3Vyc2l2ZSwgbWF0Y2gsICYmICFpc2RpciIsc29mYXIsMCk7CisgICAgICAgICAgICBhZGRyZXN1bHQoc29mYXIsaXRzYWRpcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKworICAgIGRlYnVnKEYxMTEsInRyYXZlcnNlIHNvZmFyIDIiLHNvZmFyLDApOworCisgICAgc2VnaXNkaXIgPSAoKHBsIC0+IGZ3ZCkgPT0gTlVMTCkgPyAwIDogMTsKKyAgICBpdHN3aWxkID0gaXN3aWxkKHBsIC0+IG5wYXJ0KTsKKworICAgIGRlYnVnKEYxMTEsInRyYXZlcnNlIHNlZ2lzZGlyIixzb2ZhcixzZWdpc2Rpcik7CisgICAgZGVidWcoRjExMSwidHJhdmVyc2UgaXRzd2lsZCAiLHBsIC0+IG5wYXJ0LGl0c3dpbGQpOworCisjaWZkZWYgUkVDVVJTSVZFCisgICAgaWYgKHhyZWN1cnNpdmUgPiAwKSB7ICAgICAgICAgICAgICAgLyogSWYgcmVjdXJzaW5nIGFuZC4uLiAqLworICAgICAgICBpZiAoc2VnaXNkaXIgJiYgaXRzd2lsZCkgICAgICAgIC8qIHRoaXMgaXMgYSBkaXIgYW5kIG5wYXJ0IGlzIHdpbGQgKi8KKyAgICAgICAgICBnb3RvIGJsYWg7ICAgICAgICAgICAgICAgICAgICAvKiBvci4uLiAqLworICAgICAgICBlbHNlIGlmICgheHBhdGFic29sdXRlICYmICF4cGF0d2lsZCkgLyogc2VhcmNoIG9iamVjdCBpcyBub253aWxkICovCisgICAgICAgICAgZ290byBibGFoOyAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBnbyByZWN1cnNlICovCisgICAgfQorI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworCisgICAgaWYgKCFpdHN3aWxkKSB7ICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBwYXRoIHNlZ21lbnQgbm90IHdpbGQ/ICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICBzdHJjcHkoZW5kY3VyLHBsIC0+IG5wYXJ0KTsgICAgIC8qIChzYWZlKSBBcHBlbmQgbmV4dCBwYXJ0LiAqLworICAgICAgICBlbmRjdXIgKz0gKGludClzdHJsZW4ocGwgLT4gbnBhcnQpOyAvKiBBZHZhbmNlIGVuZCBwb2ludGVyICovCisjZWxzZQorLyoKKyAgc3RyY3B5KCkgZG9lcyBub3QgYWNjb3VudCBmb3IgcXVvdGVkIG1ldGFjaGFyYWN0ZXJzLgorICBXZSBtdXN0IHJlbW92ZSB0aGUgcXVvdGVzIGJlZm9yZSBkb2luZyB0aGUgc3RhdCgpLgorKi8KKwl7CisJICAgIGludCBxdW90ZSA9IDA7CisJICAgIGNoYXIgYywgKiBzOworCSAgICBzID0gcGwgLT4gbnBhcnQ7CisJICAgIHdoaWxlICgoYyA9ICpzKyspKSB7CisJCWlmICghcXVvdGUpIHsKKwkJICAgIGlmIChjID09IENNRFEpIHsKKwkJCXF1b3RlID0gMTsKKwkJCWNvbnRpbnVlOworCQkgICAgfQorCQl9CisJCSplbmRjdXIrKyA9IGM7CisJCXF1b3RlID0gMDsKKwkgICAgfQorCX0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICplbmRjdXIgPSAnXDAnOyAgICAgICAgICAgICAgICAgLyogRW5kIG5ldyBjdXJyZW50IHN0cmluZy4gKi8KKworICAgICAgICBpZiAoc3RhdChzb2Zhciwmc3RhdGJ1ZikgPT0gMCkgeyAvKiBJZiB0aGlzIHBpZWNlIGV4aXN0cy4uLiAqLworICAgICAgICAgICAgZGVidWcoRjExMCwidHJhdmVyc2UgZXhpc3RzIixzb2ZhciwwKTsKKyAgICAgICAgICAgICplbmRjdXIrKyA9IERJUlNFUDsgICAgICAgICAvKiBhZGQgc2xhc2ggdG8gZW5kICovCisgICAgICAgICAgICAqZW5kY3VyID0gJ1wwJzsgICAgICAgICAgICAgLyogYW5kIGVuZCB0aGUgc3RyaW5nIGFnYWluLiAqLworICAgICAgICAgICAgdHJhdmVyc2UocGwgLT4gZndkLCBzb2ZhciwgZW5kY3VyKTsKKyAgICAgICAgfQorI2lmZGVmIERFQlVHCisgICAgICAgIGVsc2UgZGVidWcoRjExMCwidHJhdmVyc2Ugbm90IGZvdW5kIiwgc29mYXIsIDApOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAqZW5kY3VyID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgY3VycmVudCBzdHJpbmcgKi8KKyAgICBkZWJ1ZyhGMTExLCJ0cmF2ZXJzZSBzb2ZhciAzIixzb2ZhciwwKTsKKworICAgIGlmICghaXRzYWRpcikKKyAgICAgIHJldHVybjsKKworICAgIC8qIFNlYXJjaCBpcyByZWN1cnNpdmUgb3IgLi4uICovCisgICAgLyogcGF0aCBzZWdtZW50IGNvbnRhaW5zIHdpbGRjYXJkcywgaGF2ZSB0byBvcGVuIGFuZCBzZWFyY2ggZGlyZWN0b3J5LiAqLworCisgIGJsYWg6CisKKyAgICBkZWJ1ZyhGMTEwLCJ0cmF2ZXJzZSBvcGVuaW5nIGRpcmVjdG9yeSIsIHNvZmFyLCAwKTsKKworI2lmZGVmIE9QRU5ESVIKKyAgICBkZWJ1ZyhGMTEwLCJ0cmF2ZXJzZSBvcGVuZGlyKCkiLHNvZmFyLDApOworICAgIGlmICgoZmQgPSBvcGVuZGlyKHNvZmFyKSkgPT0gTlVMTCkgeyAgICAgICAgLyogQ2FuJ3Qgb3BlbiwgZmFpbC4gKi8KKyAgICAgICAgZGVidWcoRjEwMSwidHJhdmVyc2Ugb3BlbmRpcigpIGZhaWxlZCIsIiIsZXJybm8pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHdoaWxlICgoZGlyYnVmID0gcmVhZGRpcihmZCkpKQorI2Vsc2UgLyogIU9QRU5ESVIgKi8KKyAgICBkZWJ1ZyhGMTEwLCJ0cmF2ZXJzZSBkaXJlY3Rvcnkgb3BlbigpIixzb2ZhciwwKTsKKyAgICBpZiAoKGZkID0gb3Blbihzb2ZhcixPX1JET05MWSkpIDwgMCkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJ0cmF2ZXJzZSBkaXJlY3Rvcnkgb3BlbigpIGZhaWxlZCIsIiIsZXJybm8pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHdoaWxlIChyZWFkKGZkLCAoY2hhciAqKWRpcmJ1Ziwgc2l6ZW9mIGRpcl9lbnRyeSkpCisjZW5kaWYgLyogT1BFTkRJUiAqLworICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIGVhY2ggZW50cnkgaW4gdGhpcyBkaXJlY3RvcnkgKi8KKyAgICAgICAgICBpbnQgZXhpc3RzOworICAgICAgICAgIGNoYXIgKmVvcywgKnM7CisgICAgICAgICAgZXhpc3RzID0gMDsKKworICAgICAgICAgIC8qIE9uIHNvbWUgcGxhdGZvcm1zLCB0aGUgcmVhZFtkaXJdKCkgY2FuIHJldHVybiBkZWxldGVkIGZpbGVzLCAqLworICAgICAgICAgIC8qIGUuZy4gSFAtVVggNS4wMC4gIFRoZXJlIGlzIG5vIHBvaW50IGluIGdyaW5kaW5nIHRocm91Z2ggdGhpcyAqLworICAgICAgICAgIC8qIHJvdXRpbmUgd2hlbiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0Li4uICovCisKKyAgICAgICAgICBpZiAoICAgICAgICAgIC8qIFRoZXJlICBhY3R1YWxseSBpcyBhbiBpbm9kZS4uLiAqLworI2lmZGVmIEJTRDQyCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlyYnVmLT5kX2lubyAhPSAtMQorI2Vsc2UKKyNpZmRlZiB1bm9zCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlyYnVmLT5kX2lubyAhPSAtMQorI2Vsc2UKKyNpZmRlZiBRTlgKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXJidWYtPmRfc3RhdC5zdF9pbm8gIT0gMAorI2Vsc2UKKyNpZmRlZiBTT0xBUklTCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlyYnVmLT5kX2lubyAhPSAwCisjZWxzZQorI2lmZGVmIHN1bgorICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmJ1Zi0+ZF9maWxlbm8gIT0gMAorI2Vsc2UKKyNpZmRlZiBic2RpCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlyYnVmLT5kX2ZpbGVubyAhPSAwCisjZWxzZQorI2lmZGVmIF9fMzg2QlNEX18KKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXJidWYtPmRfZmlsZW5vICE9IDAKKyNlbHNlCisjaWZkZWYgX19GcmVlQlNEX18KKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXJidWYtPmRfZmlsZW5vICE9IDAKKyNlbHNlCisjaWZkZWYgdWx0cml4CisgICAgICAgICAgICAgICAgICAgICAgICAgZGlyYnVmLT5nZF9pbm8gIT0gMAorI2Vsc2UKKyNpZmRlZiBQbGFuOQorICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlyYnVmLT5kX2lubyAhPSAwCisjZW5kaWYgLyogUGxhbjkgKi8KKyNlbmRpZiAvKiB1bHRyaXggKi8KKyNlbmRpZiAvKiBfX0ZyZWVCU0RfXyAqLworI2VuZGlmIC8qIF9fMzg2QlNEX18gKi8KKyNlbmRpZiAvKiBic2RpICovCisjZW5kaWYgLyogc3VuICovCisjZW5kaWYgLyogU09MQVJJUyAqLworI2VuZGlmIC8qIFFOWCAqLworI2VuZGlmIC8qIHVub3MgKi8KKyNlbmRpZiAvKiBCU0Q0MiAqLworICAgICAgICAgICAgICApCisgICAgICAgICAgICBleGlzdHMgPSAxOworICAgICAgICAgIGlmICghZXhpc3RzKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBja3N0cm5jcHkobmFtYnVmLCAgICAgICAgICAgICAvKiBDb3B5IHRoZSBuYW1lICovCisgICAgICAgICAgICAgICAgICBkaXJidWYtPmRfbmFtZSwKKyAgICAgICAgICAgICAgICAgIE1BWE5BTUxFTgorICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICBpZiAobmFtYnVmWzBdID09ICcuJykgeworICAgICAgICAgICAgICBpZiAoIW5hbWJ1ZlsxXSB8fCAobmFtYnVmWzFdID09ICcuJyAmJiAhbmFtYnVmWzJdKSkgeworICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwidHJhdmVyc2Ugc2tpcHBpbmciLG5hbWJ1ZiwwKTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAvKiBza2lwICIuIiBhbmQgIi4uIiAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHMgPSBuYW1idWY7ICAgICAgICAgICAgICAgICAgIC8qIENvcHkgbmFtZSB0byBlbmQgb2Ygc29mYXIgKi8KKyAgICAgICAgICBlb3MgPSBlbmRjdXI7CisgICAgICAgICAgd2hpbGUgKCgqZW9zID0gKnMpKSB7CisgICAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgICAgZW9zKys7CisgICAgICAgICAgfQorLyoKKyAgTm93IHdlIGNoZWNrIHRoZSBmaWxlIGZvciAoYSkgd2hldGhlciBpdCBpcyBhIGRpcmVjdG9yeSwgYW5kIChiKSB3aGV0aGVyCisgIGl0cyBuYW1lIG1hdGNoZXMgb3VyIHBhdHRlcm4uICBJZiBpdCBpcyBhIGRpcmVjdG9yeSwgYW5kIGlmIHdlIGhhdmUgYmVlbgorICB0b2xkIHRvIGJ1aWxkIGEgcmVjdXJzaXZlIGxpc3QsIHRoZW4gd2UgbXVzdCBkZXNjZW5kIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorICBpdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLiAgSWYgaXQgaXMgbm90IGEgZGlyZWN0b3J5IGFuZCBpdCBkb2VzIG5vdCBtYXRjaAorICBvdXIgcGF0dGVybiwgd2Ugc2tpcCBpdC4gIE5vdGU6IHNvZmFyIGlzIHRoZSBmdWxsIHBhdGhuYW1lLCBuYW1idWYgaXMKKyAgdGhlIG5hbWUgb25seS4KKyovCisgICAgICAgICAgLyogRG8gdGhpcyBmaXJzdCB0byBzYXZlIHBvaW50bGVzcyBmdW5jdGlvbiBjYWxscyAqLworICAgICAgICAgIGlmIChuYW1idWZbMF0gPT0gJy4nICYmICF4bWF0Y2hkb3QpIC8qIERpciBuYW1lIHN0YXJ0cyB3aXRoICcuJyAqLworICAgICAgICAgICAgY29udGludWU7CisJICBpZiAoc3RhdGhhY2spIHsKKwkgICAgICBpZiAoeHJlY3Vyc2l2ZSB8fCB4Zmlsb25seSB8fCB4ZGlyb25seSB8fCB4cGF0c2xhc2gpIHsKKwkJICBpdHNhZGlyID0geGlzZGlyKHNvZmFyKTsgLyogU2VlIGlmIGl0J3MgYSBkaXJlY3RvcnkgKi8KKwkJICBkZWJ1ZyhGMTAxLCJTVEFUIiwiIiwxOSk7CisJICAgICAgfSBlbHNlIHsKKwkJICBpdHNhZGlyID0gMDsKKwkgICAgICB9CisJICB9IGVsc2UgeworCSAgICAgIGl0c2FkaXIgPSB4aXNkaXIoc29mYXIpOworCSAgICAgIGRlYnVnKEYxMDEsIlNUQVQiLCIiLDIwKTsKKwkgIH0KKworI2lmZGVmIENLU1lNTElOSworI2lmZGVmIFVTRV9MU1RBVAorCSAgaWYgKGl0c2FkaXIgJiYgeG5vbGlua3MpIHsJCS8qIElmIG5vdCBmb2xsb3dpbmcgc3ltbGlua3MgKi8KKwkgICAgICBpbnQgeDsKKwkgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisJICAgICAgeCA9IGxzdGF0KHNvZmFyLCZidWYpOworCSAgICAgIGRlYnVnKEYxMTEsInRyYXZlcnNlIGxzdGF0IDIiLHNvZmFyLHgpOworCSAgICAgIGlmICh4ID4gLTEgJiYKKyNpZmRlZiBTX0lTTE5LCisJCSAgU19JU0xOSyhidWYuc3RfbW9kZSkKKyNlbHNlCisjaWZkZWYgX0lGTE5LCisJCSAgKChfSUZNVCAmIGJ1Zi5zdF9tb2RlKSA9PSBfSUZMTkspCisjZW5kaWYgLyogX0lGTE5LICovCisjZW5kaWYgLyogU19JU0xOSyAqLworCQkgICkKKwkJaXRzYWRpciA9IDA7CisJICB9CisjZW5kaWYgLyogVVNFX0xTVEFUICovCisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisKKyNpZmRlZiBSRUNVUlNJVkUKKyAgICAgICAgICBpZiAoeHJlY3Vyc2l2ZSA+IDAgJiYgaXRzYWRpciAmJgorICAgICAgICAgICAgICAoeHBhdGxhc3RbMF0gPT0gJyonKSAmJiAheHBhdGxhc3RbMV0KKyAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgIGRlYnVnKEYxMTAsCisgICAgICAgICAgICAgICAgICAgICJ0cmF2ZXJzZSBhZGQ6IHJlY3Vyc2l2ZSAmJiBpc2RpciAmJiBzZWdpc2RpciBvciBtYXRjaCIsCisgICAgICAgICAgICAgICAgICAgIHNvZmFyLAorICAgICAgICAgICAgICAgICAgICBzZWdpc2RpcgorICAgICAgICAgICAgICAgICAgICApOworCSAgICAgIGFkZHJlc3VsdChzb2ZhcixpdHNhZGlyKTsKKwkgICAgICBpZiAobnVtZm5kIDwgMCkgcmV0dXJuOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKworICAgICAgICAgIGRlYnVnKEYxMTEsInRyYXZlcnNlIG1yZXN1bHQgeHBhdCIseHBhdCx4cmVjdXJzaXZlKTsKKyAgICAgICAgICBkZWJ1ZyhGMTExLCJ0cmF2ZXJzZSBtcmVzdWx0IHBsIC0+IG5wYXJ0IiwKKyAgICAgICAgICAgICAgICBwbCAtPiBucGFydCwKKyAgICAgICAgICAgICAgICAoKHBsIC0+IGZ3ZCkgPyA5OTk5IDogMCkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgIGRlYnVnKEYxMTEsInRyYXZlcnNlIG1yZXN1bHQgc29mYXIgc2VnaXNkaXIiLHNvZmFyLHNlZ2lzZGlyKTsKKyAgICAgICAgICBkZWJ1ZyhGMTExLCJ0cmF2ZXJzZSBtcmVzdWx0IHNvZmFyIGl0c2FkaXIiLHNvZmFyLGl0c2FkaXIpOworICAgICAgICAgIGRlYnVnKEYxMDEsInRyYXZlcnNlIG1yZXN1bHQgeG1hdGNoZG90IiwiIix4bWF0Y2hkb3QpOworLyoKKyAgTWF0Y2ggdGhlIHBhdGggc28gZmFyIHdpdGggdGhlIHBhdHRlcm4gYWZ0ZXIgc3RyaXBwaW5nIGFueSBsZWFkaW5nICIuLyIKKyAgZnJvbSBlaXRoZXIgb3IgYm90aC4gIFRoZSBwYXR0ZXJuIGNob3NlbiBpcyB0aGUgZnVsbCBvcmlnaW5hbCBwYXR0ZXJuIGlmCisgIHRoZSBtYXRjaCBjYW5kaWRhdGUgKHNvZmFyKSBpcyBub3QgYSBkaXJlY3RvcnksIG9yIGVsc2UganVzdCB0aGUgbmFtZSBwYXJ0CisgIChwbC0+bnBhcnQpIGlmIGl0IGlzLgorKi8KKwkgIHsKKwkgICAgICBjaGFyICogczE7CQkvKiBUaGUgcGF0dGVybiAqLworCSAgICAgIGNoYXIgKiBzMiA9IHNvZmFyOwkvKiBUaGUgcGF0aCBzbyBmYXIgKi8KKwkgICAgICBjaGFyICogczM7CQkvKiBXb3JrZXIgKi8KKwkgICAgICBpbnQgb3B0czsJCQkvKiBNYXRjaCBvcHRpb25zICovCisKKwkgICAgICBzMSA9IGl0c2FkaXIgPyBwbC0+bnBhcnQgOiB4cGF0OworCisjaWZuZGVmIENPTU1FTlQKKwkgICAgICAvKiBJIGNhbid0IGV4cGxhaW4gdGhpcyBidXQgaXQgdW5icmVha3MgImNkIGJsYWgvc3ViPEVzYz4iICovCisJICAgICAgaWYgKGl0c2FkaXIgJiYgIXhyZWN1cnNpdmUgJiYgeHBhdHNsYXNoID4gMCAmJgorCQkgIHNlZ2lzZGlyID09IDAgJiYgaXRzd2lsZCkgeworCQkgIHMxID0geHBhdDsKKwkJICBkZWJ1ZyhGMTEwLCJ0cmF2ZXJzZSBtcmVzdWx0IHMxIGtsdWRnZSIsczEsMCk7CisJICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworCSAgICAgIGlmICh4cmVjdXJzaXZlICYmIHhwYXRzbGFzaCA9PSAwKQorCQlzMiA9IG5hbWJ1ZjsKKwkgICAgICB3aGlsZSAoKHMxWzBdID09ICcuJykgJiYgKHMxWzFdID09ICcvJykpIC8qIFN0cmlwICIuLyIgKi8KKwkJczEgKz0gMjsKKwkgICAgICB3aGlsZSAoKHMyWzBdID09ICcuJykgJiYgKHMyWzFdID09ICcvJykpIC8qIERpdHRvICovCisJCXMyICs9IDI7CisJICAgICAgb3B0cyA9IG1vcHRzOwkJLyogTWF0Y2ggb3B0aW9ucyAqLworCSAgICAgIGlmIChpdHNhZGlyKSAJCS8qIEN1cnJlbnQgc2VnbWVudCBpcyBhIGRpcmVjdG9yeSAqLworCQlvcHRzID0gbW9wdHMgJiAxOwkvKiBObyBmZW5jZXMgKi8KKwkgICAgICBzMyA9IHMyOwkJCS8qIEdldCBzZWdtZW50IGRlcHRoICovCisJICAgICAgZGVwdGggPSAwOworCSAgICAgIHdoaWxlICgqczMpIHsgaWYgKCpzMysrID09ICcvJykgZGVwdGgrKzsgfQorI2lmbmRlZiBOT1NLSVBNQVRDSAorCSAgICAgIC8qIFRoaXMgc3BlZWRzIHRoaW5ncyB1cCBhIGJpdC4gKi8KKwkgICAgICAvKiBJZiBpdCBjYXVzZXMgdHJvdWJsZSBkZWZpbmUgTk9TS0lQTUFUQ0ggYW5kIHJlYnVpbGQuICovCisJICAgICAgaWYgKGRlcHRoID09IDAgJiYgKHMxWzBdID09ICcqJykgJiYgIXMxWzFdKQorCQltcmVzdWx0ID0geG1hdGNoZG90ID8gMSA6IChzMlswXSAhPSAnLicpOworCSAgICAgIGVsc2UKKyNlbmRpZiAvKiBOT1NLSVBNQVRDSCAqLworCQltcmVzdWx0ID0gY2ttYXRjaChzMSxzMiwxLG9wdHMpOyAvKiBNYXRjaCAqLworCSAgfQorI2lmZGVmIERFQlVHCisJICBpZiAoZGVibG9nKSB7CisJICAgICAgZGVidWcoRjExMSwidHJhdmVyc2UgbXJlc3VsdCBkZXB0aCIsc29mYXIsZGVwdGgpOworCSAgICAgIGRlYnVnKEYxMDEsInRyYXZlcnNlIG1yZXN1bHQgeHBhdHNsYXNoIiwiIix4cGF0c2xhc2gpOworCSAgICAgIGRlYnVnKEYxMTEsInRyYXZlcnNlIG1yZXN1bHQgbmFtYnVmIixuYW1idWYsbXJlc3VsdCk7CisJICAgICAgZGVidWcoRjExMSwidHJhdmVyc2UgbXJlc3VsdCBpdHN3aWxkIixwbCAtPiBucGFydCxpdHN3aWxkKTsKKwkgICAgICBkZWJ1ZyhGMTExLCJ0cmF2ZXJzZSBtcmVzdWx0IHNlZ2lzZGlyIixwbCAtPiBucGFydCxzZWdpc2Rpcik7CisJICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgICBpZiAobXJlc3VsdCB8fAkJLyogSWYgbWF0Y2ggc3VjY2VlZGVkICovCisJICAgICAgeHJlY3Vyc2l2ZSB8fAkJLyogT3Igc2VhcmNoIGlzIHJlY3Vyc2l2ZSAqLworCSAgICAgIGRlcHRoIDwgeHBhdHNsYXNoCQkvKiBPciBub3QgZGVlcCBlbm91Z2ggdG8gbWF0Y2guLi4gKi8KKwkgICAgICApIHsKKyAgICAgICAgICAgICAgaWYgKCAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBpdCdzIG5vdCBhIGRpcmVjdG9yeS4uLiAqLworLyoKKyAgVGhlIHByb2JsZW0gaGVyZSBpcyB0aGF0IHNlZ2lzZGlyIGlzIGFwcGFyZW50bHkgbm90IHNldCBhcHByb3ByaWF0ZWx5LgorICBJZiBJIGxlYXZlIGluIHRoZSAhc2VnaXNkaXIgdGVzdCwgdGhlbiAiZGlyIC9yZWN1cnNpdmUgYmxhaCIgKHdoZXJlIGJsYWggaXMKKyAgYSBkaXJlY3RvcnkgbmFtZSkgbWlzc2VzIHNvbWUgcmVndWxhciBmaWxlcyBiZWNhdXNlIHNvbWV0aW1lcyBzZWdpc2RpcgorICBpcyBzZXQgYW5kIHNvbWV0aW1lcyBpdCdzIG5vdC4gIEJ1dCBpZiBJIGNvbW1lbnQgaXQgb3V0LCB0aGVuCisgICJkaXIgPHN0YXI+LzxzdGFyPi50eHQgbGlzdHMgZXZlcnkgZmlsZSBpbiAqIGFuZCBkb2VzIG5vdCBldmVuIG9wZW4gdXAgdGhlCisgIHN1YmRpcmVjdG9yaWVzLiAgSG93ZXZlciwgImRpciAvcmVjIDxzdGFyPi88c3Rhcj4udHh0IiB3b3JrcyByaWdodC4KKyovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgICAgbXJlc3VsdCAmJiAoIWl0c2FkaXIgJiYgIXNlZ2lzZGlyKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgIG1yZXN1bHQgJiYJCS8qIE1hdGNoZWQgKi8KKyAgICAgICAgICAgICAgICAgICFpdHNhZGlyICYmCQkvKiBzb2ZhciBpcyBub3QgYSBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgICAgICAgICgoIXhyZWN1cnNpdmUgJiYgIXNlZ2lzZGlyKSB8fCB4cmVjdXJzaXZlKQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgICAgICAgICkgeworCQkgIGRlYnVnKEYxMTAsCisJCQkidHJhdmVyc2UgYWRkOiBtYXRjaCAmJiAhaXRzYWRpciIsc29mYXIsMCk7CisJCSAgYWRkcmVzdWx0KHNvZmFyLGl0c2FkaXIpOworCQkgIGlmIChudW1mbmQgPCAwKSByZXR1cm47CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRzYWRpciAmJiAoeHJlY3Vyc2l2ZSB8fCBtcmVzdWx0KSkgeworICAgICAgICAgICAgICAgICAgc3RydWN0IHBhdGggKiB4eCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAqZW9zKysgPSBESVJTRVA7ICAgICAgLyogQWRkIGRpcmVjdG9yeSBzZXBhcmF0b3IgKi8KKyAgICAgICAgICAgICAgICAgICplb3MgPSAnXDAnOyAgICAgICAgICAvKiB0byBlbmQgb2Ygc2VnbWVudCAqLworI2lmZGVmIFJFQ1VSU0lWRQorICAgICAgICAgICAgICAgICAgLyogQ29weSBwcmV2aW91cyBwYXR0ZXJuIHNlZ21lbnQgdG8gdGhpcyBuZXcgZGlyZWN0b3J5ICovCisKKyAgICAgICAgICAgICAgICAgIGlmICh4cmVjdXJzaXZlID4gMCAmJiAhKHBsIC0+IGZ3ZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICB4eCA9IChzdHJ1Y3QgcGF0aCAqKSBtYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgcGF0aCkpOworICAgICAgICAgICAgICAgICAgICAgIHBsIC0+IGZ3ZCA9IHh4OworICAgICAgICAgICAgICAgICAgICAgIGlmICh4eCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICB4eCAtPiBmd2QgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoeHggLT4gbnBhcnQsIHBsIC0+IG5wYXJ0KTsgLyogc2FmZSAqLworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICAgICAgICAgICAgICAgIHRyYXZlcnNlKHBsIC0+IGZ3ZCwgc29mYXIsIGVvcyk7IC8qIFRyYXZlcnNlIG5ldyBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKyNpZmRlZiBPUEVORElSCisgICAgY2xvc2VkaXIoZmQpOworI2Vsc2UgLyogIU9QRU5ESVIgKi8KKyAgICBjbG9zZShmZCk7CisjZW5kaWYgLyogT1BFTkRJUiAqLworfQorCisvKgorICogYWRkcmVzdWx0OgorICogIEFkZHMgYSByZXN1bHQgc3RyaW5nIHRvIHRoZSByZXN1bHQgYXJyYXkuICBJbmNyZW1lbnRzIHRoZSBudW1iZXIKKyAqICBvZiBtYXRjaGVzIGZvdW5kLCBjb3BpZXMgdGhlIGZvdW5kIHN0cmluZyBpbnRvIG91ciBzdHJpbmcKKyAqICBidWZmZXIsIGFuZCBwdXRzIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIGludG8gdGhlIGNhbGxlcidzIHJlc3VsdAorICogIGFycmF5LiAgT3VyIGZyZWUgYnVmZmVyIHBvaW50ZXIgaXMgdXBkYXRlZC4gIElmIHRoZXJlIGlzIG5vCisgKiAgbW9yZSByb29tIGluIHRoZSBjYWxsZXIncyBhcnJheSwgdGhlIG51bWJlciBvZiBtYXRjaGVzIGlzIHNldCB0byAtMS4KKyAqIElucHV0OiBhIHJlc3VsdCBzdHJpbmcuCisgKiBSZXR1cm5zOiBub3RoaW5nLgorICovCitzdGF0aWMgVk9JRAorYWRkcmVzdWx0KHN0cixpdHNhZGlyKSBjaGFyICpzdHI7IGludCBpdHNhZGlyOyB7CisgICAgaW50IGxlbjsKKworICAgIGlmICghZnJlZXB0cikgeworCWRlYnVnKEYxMDAsImFkZHJlc3VsdCBzdHJpbmcgc3BhY2Ugbm90IGluaXQnZCIsIiIsMCk7CisJaW5pdHNwYWNlKG10Y2hzLHNzcGxlbik7CisgICAgfQorICAgIGlmICghc3RyKSBzdHIgPSAiIjsKKyAgICBkZWJ1ZyhGMTExLCJhZGRyZXN1bHQiLHN0cixpdHNhZGlyKTsKKyAgICBpZiAoISpzdHIpCisgICAgICByZXR1cm47CisKKyAgICBpZiAoaXRzYWRpciA8IDApIHsKKwlpdHNhZGlyID0geGlzZGlyKHN0cik7CisgICAgfQorICAgIGlmICgoeGRpcm9ubHkgJiYgIWl0c2FkaXIpIHx8ICh4Zmlsb25seSAmJiBpdHNhZGlyKSkgeworICAgICAgICBkZWJ1ZyhGMTExLCJhZGRyZXN1bHQgc2tpcCIsc3RyLGl0c2FkaXIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHdoaWxlIChzdHJbMF0gPT0gJy4nICYmIElTRElSU0VQKHN0clsxXSkpIC8qIFN0cmlwIGFsbCAiLi8iIGZyb20gZnJvbnQgKi8KKyAgICAgIHN0ciArPSAyOworICAgIGlmICgtLXJlbWxlbiA8IDApIHsgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnRzIGxlZnQgaW4gYXJyYXkgb2YgbmFtZXMgKi8KKyAgICAgICAgZGVidWcoRjExMSwiYWRkcmVzdWx0IEFSUkFZIEZVTEwiLHN0cixudW1mbmQpOworICAgICAgICBudW1mbmQgPSAtMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsZW4gPSAoaW50KXN0cmxlbihzdHIpOwkJLyogU3BhY2UgdGhpcyB3aWxsIHVzZSAqLworICAgIGRlYnVnKEYxMTEsImFkZHJlc3VsdCBsZW4iLHN0cixsZW4pOworCisgICAgaWYgKGxlbiA8IDEpCisgICAgICByZXR1cm47CisKKyAgICBpZiAoKGZyZWVwdHIgKyBsZW4gKyBpdHNhZGlyICsgMSkgPiAoc3NwYWNlICsgc3NwbGVuKSkgeworICAgICAgICBkZWJ1ZyhGMTExLCJhZGRyZXN1bHQgT1VUIE9GIFNQQUNFIixzdHIsbnVtZm5kKTsKKyNpZmRlZiBEWU5BTUlDCisJcHJpbnRmKAorIj9TdHJpbmcgc3BhY2UgJWQgZXhoYXVzdGVkIC0gdXNlIFNFVCBGSUxFIFNUUklOR1NQQUNFIHRvIGluY3JlYXNlXG4iLHNzcGxlbik7CisjZWxzZQorCXByaW50ZigiP1N0cmluZyBzcGFjZSAlZCBleGhhdXN0ZWRcbiIsc3NwbGVuKTsKKyNlbmRpZiAvKiBEWU5BTUlDICovCisgICAgICAgIG51bWZuZCA9IC0xOyAgICAgICAgICAgICAgICAgICAgLyogRG8gbm90IHJlY29yZCBpZiBub3QgZW5vdWdoIHNwYWNlICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RyY3B5KGZyZWVwdHIsc3RyKTsJCS8qIHNhZmUgKi8KKworICAgIC8qIFRhZyBkaXJlY3RvcnkgbmFtZXMgYnkgcHV0dGluZyAnLycgYXQgdGhlIGVuZCAqLworCisgICAgaWYgKGl0c2FkaXIgJiYgKGZyZWVwdHJbbGVuLTFdID09ICcvJykpIHsKKyAgICAgICAgZnJlZXB0cltsZW4rK10gPSBESVJTRVA7CisgICAgICAgIGZyZWVwdHJbbGVuXSA9ICdcMCc7CisgICAgfQorICAgIGlmIChudW1mbmQgPj0gbWF4bmFtZXMpIHsKKyNpZmRlZiBEWU5BTUlDCisJcHJpbnRmKAorIj9Ub28gbWFueSBmaWxlcyAoJWQgbWF4KSAtIHVzZSBTRVQgRklMRSBMSVNUU0laRSB0byBpbmNyZWFzZVxuIixtYXhuYW1lcyk7CisjZWxzZQorCXByaW50ZigiP1RvbyBtYW55IGZpbGVzIC0gJWQgbWF4XG4iLG1heG5hbWVzKTsKKyNlbmRpZiAvKiBEWU5BTUlDICovCisgICAgICAgIG51bWZuZCA9IC0xOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ciA9IGZyZWVwdHI7CisgICAgKnJlc3B0cisrID0gZnJlZXB0cjsKKyAgICBmcmVlcHRyICs9IChsZW4gKyAxKTsKKyAgICBudW1mbmQrKzsKKyAgICBkZWJ1ZyhGMTExLCJhZGRyZXN1bHQgQUREIixzdHIsbnVtZm5kKTsKK30KKworI2lmZGVmIENPTU1FTlQKKy8qCisgKiBtYXRjaChwYXR0ZXJuLHN0cmluZyk6CisgKiAgcGF0dGVybiBtYXRjaGVyLiAgVGFrZXMgYSBzdHJpbmcgYW5kIGEgcGF0dGVybiBwb3NzaWJseSBjb250YWluaW5nCisgKiAgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMgJyonIGFuZCAnPycuICBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdHRlcm4KKyAqICBtYXRjaGVzIHRoZSBzdHJpbmcsIGZhbHNlIG90aGVyd2lzZS4KKyAqIE9yaWduYWxseSBieTogSmVmZiBEYW1lbnMsIENVQ0NBLCAxOTg0CisgKiBObyBsb25nZXIgdXNlZCBhcyBvZiBDLUtlcm1pdCA3LjAsIG5vdyB3ZSB1c2UgY2ttYXRjaCgpIGluc3RlYWQgKGNrY2xpYi5jKS4KKyAqCisgKiBJbnB1dDogYSBzdHJpbmcgYW5kIGEgd2lsZGNhcmQgcGF0dGVybi4KKyAqIFJldHVybnM6IDEgaWYgbWF0Y2gsIDAgaWYgbm8gbWF0Y2guCisgKi8KK3N0YXRpYyBpbnQKK21hdGNoKHBhdHRlcm4sIHN0cmluZykgY2hhciAqcGF0dGVybiwgKnN0cmluZzsgeworICAgIGNoYXIgKnBzYXZlID0gTlVMTCwgKnNzYXZlID0gTlVMTDsgIC8qIEJhY2t1cCBwb2ludGVycyBmb3IgZmFpbHVyZSAqLworICAgIGludCBxID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFF1b3RlIGZsYWcgKi8KKworICAgIGlmICgqc3RyaW5nID09ICcuJyAmJiAqcGF0dGVybiAhPSAnLicgJiYgIXhtYXRjaGRvdCkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJtYXRjaCBza2lwIixzdHJpbmcsMCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgZm9yICg7ICpwYXR0ZXJuID09ICpzdHJpbmc7IHBhdHRlcm4rKyxzdHJpbmcrKykgLyogU2tpcCBmaXJzdCAqLworICAgICAgICAgIGlmICgqc3RyaW5nID09ICdcMCcpIHJldHVybigxKTsgLyogRW5kIG9mIHN0cmluZ3MsIHN1Y2NlZWQgKi8KKworICAgICAgICBpZiAoKnBhdHRlcm4gPT0gJ1xcJyAmJiBxID09IDApIHsgLyogV2F0Y2ggb3V0IGZvciBxdW90ZWQgKi8KKyAgICAgICAgICAgIHEgPSAxOyAgICAgICAgICAgICAgICAgICAgICAvKiBtZXRhY2hhcmFjdGVycyAqLworICAgICAgICAgICAgcGF0dGVybisrOyAgICAgICAgICAgICAgICAgIC8qIGFkdmFuY2UgcGFzdCBxdW90ZSAqLworICAgICAgICAgICAgaWYgKCpwYXR0ZXJuICE9ICpzdHJpbmcpIHJldHVybigwKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgcSA9IDA7CisKKyAgICAgICAgaWYgKHEpIHsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgqc3RyaW5nICE9ICdcMCcgJiYgKnBhdHRlcm4gPT0gJz8nKSB7CisgICAgICAgICAgICAgICAgcGF0dGVybisrOyAgICAgICAgICAgICAgLyogJz8nLCBsZXQgaXQgbWF0Y2ggKi8KKyAgICAgICAgICAgICAgICBzdHJpbmcrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKnBhdHRlcm4gPT0gJyonKSB7IC8qICcqJyAuLi4gKi8KKyAgICAgICAgICAgICAgICBwc2F2ZSA9ICsrcGF0dGVybjsgICAgICAvKiByZW1lbWJlciB3aGVyZSB3ZSBzYXcgaXQgKi8KKyAgICAgICAgICAgICAgICBzc2F2ZSA9IHN0cmluZzsgICAgICAgICAvKiBsZXQgaXQgbWF0Y2ggMCBjaGFycyAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChzc2F2ZSAhPSBOVUxMICYmICpzc2F2ZSAhPSAnXDAnKSB7IC8qIGlmIG5vdCBhdCBlbmQgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLi4uaGF2ZSBzZWVuIGEgc3RhciAqLworICAgICAgICAgICAgICAgIHN0cmluZyA9ICsrc3NhdmU7ICAgICAgIC8qIHNraXAgMSBjaGFyIGZyb20gc3RyaW5nICovCisgICAgICAgICAgICAgICAgcGF0dGVybiA9IHBzYXZlOyAgICAgICAgLyogYW5kIGJhY2sgdXAgcGF0dGVybiAqLworICAgICAgICAgICAgfSBlbHNlIHJldHVybigwKTsgICAgICAgICAgIC8qIG90aGVyd2lzZSBqdXN0IGZhaWwgKi8KKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qCisgIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgZm9yIGV4cGFuZGluZyB0aWxkZSBpbiBmaWxlbmFtZXMKKyAgQ29udHJpYnV0ZWQgYnkgSG93aWUgS2F5ZSwgQ1VDQ0EsIGRldmVsb3BlZCBmb3IgQ0NNRCBwYWNrYWdlLgorKi8KKworLyogIFcgSCBPIEEgTSBJICAtLSAgR2V0IHVzZXIncyB1c2VybmFtZS4gICovCisKKy8qCisgIDEpIEdldCByZWFsIHVpZAorICAyKSBTZWUgaWYgdGhlICRVU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCAoJExPR05BTUUgb24gQVQmVCkKKyAgMykgSWYgJFVTRVIncyB1aWQgaXMgdGhlIHNhbWUgYXMgcnVpZCwgcmVhbG5hbWUgaXMgJFVTRVIKKyAgNCkgT3RoZXJ3aXNlIGdldCBsb2dnZWQgaW4gdXNlcidzIG5hbWUKKyAgNSkgSWYgdGhhdCBuYW1lIGhhcyB0aGUgc2FtZSB1aWQgYXMgdGhlIHJlYWwgdWlkIHJlYWxuYW1lIGlzIGxvZ2lubmFtZQorICA2KSBPdGhlcndpc2UsIGdldCBhIG5hbWUgZm9yIHJ1aWQgZnJvbSAvZXRjL3Bhc3N3ZAorKi8KK2NoYXIgKgord2hvYW1pKCkgeworI2lmZGVmIERUSUxERQorI2lmZGVmIHBkcDExCisjZGVmaW5lIFdIT0xFTiAxMDAKKyNlbHNlCisjZGVmaW5lIFdIT0xFTiAyNTcKKyNlbmRpZiAvKiBwZHAxMSAqLworICAgIHN0YXRpYyBjaGFyIHJlYWxuYW1lW1VJREJVRkxFTisxXTsgIC8qIHVzZXIncyBuYW1lICovCisgICAgc3RhdGljIGludCBydWlkID0gLTE7ICAgICAgICAgICAgICAgLyogdXNlcidzIHJlYWwgdWlkICovCisgICAgY2hhciBsb2dpbm5hbWVbVUlEQlVGTEVOKzFdLCBlbnZuYW1lWzI1Nl07IC8qIHRlbXAgc3RvcmFnZSAqLworICAgIGNoYXIgKmM7CisgICAgc3RydWN0IHBhc3N3ZCAqcDsKKyAgICBfUFJPVE9UWVAoZXh0ZXJuIGNoYXIgKiBnZXRsb2dpbiwgKHZvaWQpICk7CisKKyAgICBpZiAocnVpZCAhPSAtMSkKKyAgICAgIHJldHVybihyZWFsbmFtZSk7CisKKyAgICBydWlkID0gcmVhbF91aWQoKTsgICAgICAgICAgICAgICAgICAvKiBnZXQgb3VyIHVpZCAqLworCisgIC8qIGhvdyBhYm91dCAkVVNFUiBvciAkTE9HTkFNRT8gKi8KKyAgICBpZiAoKGMgPSBnZXRlbnYoTkFNRUVOVikpICE9IE5VTEwpIHsgLyogY2hlY2sgdGhlIGVudiB2YXJpYWJsZSAqLworICAgICAgICBja3N0cm5jcHkoZW52bmFtZSwgYywgMjU1KTsKKyAgICAgICAgaWYgKChwID0gZ2V0cHduYW0oZW52bmFtZSkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChwLT5wd191aWQgPT0gcnVpZCkgeyAgICAvKiBnZXQgcGFzc3dkIGVudHJ5IGZvciBlbnZuYW1lICovCisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHJlYWxuYW1lLCBlbnZuYW1lLCBVSURCVUZMRU4pOyAvKiB1aWQncyBhcmUgc2FtZSAqLworICAgICAgICAgICAgICAgIHJldHVybihyZWFsbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogY2FuIHdlIHVzZSBsb2dpbm5hbWUoKSA/ICovCisKKyAgICBpZiAoKGMgPSAgZ2V0bG9naW4oKSkgIT0gTlVMTCkgeyAgICAvKiBuYW1lIGZyb20gdXRtcCBmaWxlICovCisgICAgICAgIGNrc3RybmNweSAobG9naW5uYW1lLCBjLCBVSURCVUZMRU4pOworICAgICAgICBpZiAoKHAgPSBnZXRwd25hbShsb2dpbm5hbWUpKSAhPSBOVUxMKSAvKiBnZXQgcGFzc3dkIGVudHJ5ICovCisgICAgICAgICAgaWYgKHAtPnB3X3VpZCA9PSBydWlkKSAgICAgICAgLyogZm9yIGxvZ2lubmFtZSAqLworICAgICAgICAgICAgY2tzdHJuY3B5KHJlYWxuYW1lLCBlbnZuYW1lLCBVSURCVUZMRU4pOyAvKiBpZiB1aWQncyBhcmUgc2FtZSAqLworICAgIH0KKworICAvKiBVc2UgZmlyc3QgbmFtZSB3ZSBnZXQgZm9yIHJ1aWQgKi8KKworICAgIGlmICgocCA9IGdldHB3dWlkKHJ1aWQpKSA9PSBOVUxMKSB7IC8qIG5hbWUgZm9yIHVpZCAqLworICAgICAgICByZWFsbmFtZVswXSA9ICdcMCc7ICAgICAgICAgICAgIC8qIG5vIHVzZXIgbmFtZSAqLworICAgICAgICBydWlkID0gLTE7CisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICB9CisgICAgY2tzdHJuY3B5KHJlYWxuYW1lLCBwLT5wd19uYW1lLCBVSURCVUZMRU4pOworICAgIHJldHVybihyZWFsbmFtZSk7CisjZWxzZQorICAgIHJldHVybihOVUxMKTsKKyNlbmRpZiAvKiBEVElMREUgKi8KK30KKworLyogIFQgSSBMIEQgRSBfIEUgWCBQIEEgTiBEICAtLSAgZXhwYW5kIH51c2VyIHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuICovCisKK2NoYXIgKgordGlsZGVfZXhwYW5kKGRpcm5hbWUpIGNoYXIgKmRpcm5hbWU7IHsKKyNpZmRlZiBEVElMREUKKyNpZmRlZiBwZHAxMQorI2RlZmluZSBCVUZMRU4gMTAwCisjZWxzZQorI2RlZmluZSBCVUZMRU4gMjU3CisjZW5kaWYgLyogcGRwMTEgKi8KKyAgICBzdHJ1Y3QgcGFzc3dkICp1c2VyOworICAgIHN0YXRpYyBjaGFyIG9sZGRpcltCVUZMRU4rMV07CisgICAgc3RhdGljIGNoYXIgb2xkcmVhbGRpcltCVUZMRU4rMV07CisgICAgc3RhdGljIGNoYXIgdGVtcFtCVUZMRU4rMV07CisgICAgaW50IGksIGo7CisKKyAgICBkZWJ1ZyhGMTExLCJ0aWxkZV9leHBhbmQiLGRpcm5hbWUsZGlybmFtZVswXSk7CisKKyAgICBpZiAoZGlybmFtZVswXSAhPSAnficpICAgICAgICAgICAgICAvKiBOb3QgYSB0aWxkZS4uLnJldHVybiBwYXJhbSAqLworICAgICAgcmV0dXJuKGRpcm5hbWUpOworICAgIGlmICghc3RyY21wKG9sZGRpcixkaXJuYW1lKSkgeyAgICAgIC8qIFNhbWUgYXMgbGFzdCB0aW1lICovCisgICAgICByZXR1cm4ob2xkcmVhbGRpcik7ICAgICAgICAgICAgICAgLyogc28gcmV0dXJuIG9sZCBhbnN3ZXIuICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgaiA9IChpbnQpc3RybGVuKGRpcm5hbWUpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSAgICAgICAgIC8qIGZpbmQgdXNlcm5hbWUgcGFydCBvZiBzdHJpbmcgKi8KKyAgICAgICAgICBpZiAoIUlTRElSU0VQKGRpcm5hbWVbaV0pKQorICAgICAgICAgICAgdGVtcFtpXSA9IGRpcm5hbWVbaV07CisgICAgICAgICAgZWxzZSBicmVhazsKKyAgICAgICAgdGVtcFtpXSA9ICdcMCc7ICAgICAgICAgICAgICAgICAvKiB0aWUgb2ZmIHdpdGggYSBOVUxMICovCisgICAgICAgIGlmIChpID09IDEpIHsgICAgICAgICAgICAgICAgICAgLyogaWYganVzdCBhICJ+IiAqLworI2lmZGVmIElLU0QKKyAgICAgICAgICAgIGlmIChpbnNlcnZlcikKKyAgICAgICAgICAgICAgdXNlciA9IGdldHB3bmFtKHVpZGJ1Zik7ICAvKiBHZXQgaW5mbyBvbiBjdXJyZW50IHVzZXIgKi8KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciAqIHAgPSB3aG9hbWkoKTsKKyAgICAgICAgICAgICAgICBpZiAocCkKKwkJICB1c2VyID0gZ2V0cHduYW0ocCk7CisgICAgICAgICAgICAgICAgZWxzZQorCQkgIHVzZXIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXNlciA9IGdldHB3bmFtKCZ0ZW1wWzFdKTsgIC8qIG90aGVyd2lzZSBvbiB0aGUgc3BlY2lmaWVkIHVzZXIgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodXNlciAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAvKiB2YWxpZCB1c2VyPyAqLworICAgICAgICBja3N0cm5jcHkob2xkZGlyLCBkaXJuYW1lLCBCVUZMRU4pOyAvKiByZW1lbWJlciB0aGUgZGlyZWN0b3J5ICovCisgICAgICAgIGNrc3RybmNweShvbGRyZWFsZGlyLHVzZXItPnB3X2RpciwgQlVGTEVOKTsgLyogYW5kIGhvbWUgZGlyZWN0b3J5ICovCisgICAgICAgIGNrc3RybmNhdChvbGRyZWFsZGlyLCZkaXJuYW1lW2ldLCBCVUZMRU4pOworICAgICAgICBvbGRyZWFsZGlyW0JVRkxFTl0gPSAnXDAnOworICAgICAgICByZXR1cm4ob2xkcmVhbGRpcik7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW52YWxpZD8gKi8KKyAgICAgICAgY2tzdHJuY3B5KG9sZGRpciwgZGlybmFtZSwgQlVGTEVOKTsgLyogcmVtZW1iZXIgZm9yIG5leHQgdGltZSAqLworICAgICAgICBja3N0cm5jcHkob2xkcmVhbGRpciwgZGlybmFtZSwgQlVGTEVOKTsKKyAgICAgICAgcmV0dXJuKG9sZHJlYWxkaXIpOworICAgIH0KKyNlbHNlCisgICAgcmV0dXJuKE5VTEwpOworI2VuZGlmIC8qIERUSUxERSAqLworfQorCisvKgorICBGdW5jdGlvbnMgZm9yIGV4ZWN1dGluZyBzeXN0ZW0gY29tbWFuZHMuCisgIHpzeXNjbWQoKSBleGVjdXRlcyB0aGUgc3lzdGVtIGNvbW1hbmQgaW4gdGhlIG5vcm1hbCwgZGVmYXVsdCB3YXkgZm9yCisgIHRoZSBzeXN0ZW0uICBJbiBVTklYLCBpdCBkb2VzIHdoYXQgc3lzdGVtKCkgZG9lcy4gIFRodXMsIGl0cyByZXN1bHRzCisgIGFyZSBhbHdheXMgcHJlZGljdGFibGUuCisgIHpzaGNtZCgpIGV4ZWN1dGVzIHRoZSBjb21tYW5kIHVzaW5nIHRoZSB1c2VyJ3MgcHJlZmVycmVkIHNoZWxsLgorKi8KK2ludAorenN5c2NtZChzKSBjaGFyICpzOyB7CisjaWZkZWYgYWVnaXMKKyAgICBpZiAobm9wdXNoKSByZXR1cm4oLTEpOworICAgIGlmICghcHJpdl9jaGsoKSkgcmV0dXJuKHN5c3RlbShzKSk7CisjZWxzZQorICAgIFBJRF9UIHNocGlkOworI2lmZGVmIENPTU1FTlQKKy8qIFRoaXMgZG9lc24ndCB3b3JrLi4uICovCisgICAgV0FJVF9UIHN0YXR1czsKKyNlbHNlCisgICAgaW50IHN0YXR1czsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICBpZiAobm9wdXNoKSByZXR1cm4oLTEpOworICAgIGlmICgoc2hwaWQgPSBmb3JrKCkpKSB7CisgICAgICAgIGlmIChzaHBpZCA8IChQSURfVCkwKSByZXR1cm4oLTEpOyAvKiBQYXJlbnQgKi8KKyAgICAgICAgd2hpbGUgKHNocGlkICE9IChQSURfVCkgd2FpdCgmc3RhdHVzKSkKKyAgICAgICAgIDsKKyAgICAgICAgcmV0dXJuKHN0YXR1cyk7CisgICAgfQorICAgIGlmIChwcml2X2NhbigpKSB7ICAgICAgICAgICAgICAgICAgIC8qIENoaWxkOiBjYW5jZWwgYW55IHByaXYncyAqLworICAgICAgICBwcmludGYoIj9Qcml2aWxlZ2UgY2FuY2VsbGF0aW9uIGZhaWx1cmVcbiIpOworICAgICAgICBfZXhpdCgyNTUpOworICAgIH0KKyAgICByZXN0b3JzaWdzKCk7CQkJLyogUmVzdG9yZSBpZ25vcmVkIHNpZ25hbHMgKi8KKyNpZmRlZiBIUFVYMTAKKyAgICBleGVjbCgiL3Vzci9iaW4vc2giLCJzaCIsIi1jIixzLE5VTEwpOworICAgIHBlcnJvcigiL3Vzci9iaW4vc2giKTsKKyNlbHNlCisjaWZkZWYgUGxhbjkKKyAgICBleGVjbCgiL2Jpbi9yYyIsICJyYyIsICItYyIsIHMsIE5VTEwpOworICAgIHBlcnJvcigiL2Jpbi9yYyIpOworI2Vsc2UKKyAgICBleGVjbCgiL2Jpbi9zaCIsInNoIiwiLWMiLHMsTlVMTCk7CisgICAgcGVycm9yKCIvYmluL3NoIik7CisjZW5kaWYgLyogUGxhbjkgKi8KKyNlbmRpZiAvKiBIUFVYMTAgKi8KKyAgICBfZXhpdCgyNTUpOworICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNodXQgdXAgQU5TSSBjb21waWxlcnMuICovCisjZW5kaWYgLyogYWVnaXMgKi8KK30KKworCisvKiAgWiBfIEUgWCBFIEMgIC0tICBPdmVybGF5IG91cnNlbHZlcyB3aXRoIGFub3RoZXIgcHJvZ3JhbSAgKi8KKworI2lmbmRlZiBOT1pFWEVDCisjaWZkZWYgSFBVWDUKKyNkZWZpbmUgTk9aRVhFQworI2Vsc2UKKyNpZmRlZiBBVFQ3MzAwCisjZGVmaW5lIE5PWkVYRUMKKyNlbmRpZiAvKiBBVFQ3MzAwICovCisjZW5kaWYgLyogSFBVWDUgKi8KKyNlbmRpZiAvKiBOT1pFWEVDICovCisKK1ZPSUQKK3pfZXhlYyhwLHMsdCkgY2hhciAqIHAsICoqIHM7IGludCB0OyB7ICAvKiBPdmVybGF5IG91cnNlbHZlcyB3aXRoICJwIHMuLi4iICovCisjaWZkZWYgTk9aRVhFQworICAgIHByaW50ZigiRVhFQyAvUkVESVJFQ1QgTk9UIElNUExFTUVOVEVEIElOIFRISVMgVkVSU0lPTiBPRiBDLUtFUk1JVFxuIik7CisgICAgZGVidWcoRjExMCwiel9leGVjIE5PVCBJTVBMRU1FTlRFRCIscCwwKTsKKyNlbHNlCisgICAgaW50IHg7CisgICAgZXh0ZXJuIGludCB0dHlmZDsKKyAgICBkZWJ1ZyhGMTEwLCJ6X2V4ZWMgY29tbWFuZCIscCwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJ6X2V4ZWMgYXJnIDAiLHNbMF0sMCk7CisgICAgZGVidWcoRjExMCwiel9leGVjIGFyZyAxIixzWzFdLDApOworICAgIGRlYnVnKEYxMDEsInpfZXhlYyB0IiwiIix0KTsKKyAgICBlcnJubyA9IDA7CisgICAgaWYgKHQpIHsKKyAgICAgICAgaWYgKHR0eWZkID4gMikgeworICAgICAgICAgICAgZHVwMih0dHlmZCwgMCk7CisgICAgICAgICAgICBkdXAyKHR0eWZkLCAxKTsKKyAgICAgICAgICAgIC8qIGR1cDIodHR5ZmQsIDIpOyAqLworICAgICAgICAgICAgY2xvc2UodHR5ZmQpOworICAgICAgICB9CisgICAgfQorICAgIHJlc3RvcnNpZ3MoKTsJCQkvKiBSZXN0b3JlIGlnbm9yZWQgc2lnbmFscyAqLworICAgIHggPSBleGVjdnAocCxzKTsKKyAgICBpZiAoeCA8IDApIGRlYnVnKEYxMDEsInpfZXhlYyBlcnJubyIsIiIsZXJybm8pOworI2VuZGlmIC8qIE5PWkVYRUMgKi8KK30KKworLyoKKyAgWiBTIEggQyBNIEQgIC0tICBFeGVjdXRlIGEgc2hlbGwgY29tbWFuZCAob3IgcHJvZ3JhbSB0aHJ1IHRoZSBzaGVsbCkuCisKKyAgT3JpZ2luYWwgVU5JWCBjb2RlIGJ5IEguIEZpc2NoZXI7IGNvcHlyaWdodCByaWdodHMgYXNzaWduZWQgdG8gQ29sdW1iaWEgVS4KKyAgQWRhcHRlZCB0byB1c2UgZ2V0cHd1aWQgdG8gZmluZCBsb2dpbiBzaGVsbCBiZWNhdXNlIG1hbnkgc3lzdGVtcyBkbyBub3QKKyAgaGF2ZSBTSEVMTCBpbiBlbnZpcm9ubWVudCwgYW5kIHRvIHVzZSBkaXJlY3QgY2FsbGluZyBvZiBzaGVsbCByYXRoZXIKKyAgdGhhbiBpbnRlcm1lZGlhdGUgc3lzdGVtKCkgY2FsbC4gLS0gSC4gRmlzY2hlciAoMTk4NSk7IG1hbnkgY2hhbmdlcyBzaW5jZQorICB0aGVuLiAgQ2FsbCB3aXRoIHMgcG9pbnRpbmcgdG8gY29tbWFuZCB0byBleGVjdXRlLiAgUmV0dXJuczoKKyAgIC0xIG9uIGZhaWx1cmUgdG8gc3RhcnQgdGhlIGNvbW1hbmQgKGNhbid0IGZpbmQsIGNhbid0IGZvcmssIGNhbid0IHJ1bikuCisgICAgMSBpZiBjb21tYW5kIHJhbiBhbmQgZ2F2ZSBhbiBleGl0IHN0YXR1cyBvZiAwLgorICAgIDAgaWYgY29tbWFuZCByYW4gYW5kIGdhdmUgYSBub256ZXJvIGV4aXQgc3RhdHVzLgorICB3aXRoIHBleGl0c3RhdHVzIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQncyBleGl0IHN0YXR1cy4KKyovCitpbnQKK3pzaGNtZChzKSBjaGFyICpzOyB7CisgICAgUElEX1QgcGlkOworCisjaWZkZWYgTk9QVVNICisgICAgcmV0dXJuKDApOworI2Vsc2UKKyAgICBpZiAobm9wdXNoKSByZXR1cm4oLTEpOworICAgIGRlYnVnKEYxMTAsInpzaGNtZCBjb21tYW5kIixzLDApOworCisjaWZkZWYgYWVnaXMKKyAgICBpZiAoKHBpZCA9IHZmb3JrKCkpID09IDApIHsgICAgICAgICAvKiBNYWtlIGNoaWxkIHF1aWNrbHkgKi8KKyAgICAgICAgY2hhciAqc2hwYXRoLCAqc2huYW1lLCAqc2hwdHI7ICAvKiBGb3IgZmluZGluZyBkZXNpcmVkIHNoZWxsICovCisKKyAgICAgICAgaWYgKHByaXZfY2FuKCkpIGV4aXQoMSk7ICAgICAgICAvKiBUdXJuIG9mZiBwcml2cy4gKi8KKyAgICAgICAgaWYgKChzaHBhdGggPSBnZXRlbnYoIlNIRUxMIikpID09IE5VTEwpIHNocGF0aCA9ICIvY29tL3NoIjsKKworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBVbml4IHN5c3RlbXMgKi8KKyAgICBpZiAoKHBpZCA9IGZvcmsoKSkgPT0gMCkgeyAgICAgICAgICAvKiBNYWtlIGNoaWxkICovCisgICAgICAgIGNoYXIgKnNocGF0aCwgKnNobmFtZSwgKnNocHRyOyAgLyogRm9yIGZpbmRpbmcgZGVzaXJlZCBzaGVsbCAqLworICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwOworI2lmZGVmIEhQVVgxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgKi8KKyAgICAgICAgY2hhciAqZGVmc2hlbGwgPSAiL3Vzci9iaW4vc2giOworI2Vsc2UKKyNpZmRlZiBQbGFuOQorICAgICAgICBjaGFyICpkZWZzaGVsbCA9ICIvYmluL3JjIjsKKyNlbHNlCisgICAgICAgIGNoYXIgKmRlZnNoZWxsID0gIi9iaW4vc2giOworI2VuZGlmIC8qIFBsYW45ICovCisjZW5kaWYgLyogSFBVWDEwICovCisgICAgICAgIGlmIChwcml2X2NhbigpKSBleGl0KDEpOyAgICAgICAgLyogVHVybiBvZmYgcHJpdnMuICovCisjaWZkZWYgQ09NTUVOVAorLyogT2xkIHdheSBhbHdheXMgdXNlZCAvZXRjL3Bhc3N3ZCBzaGVsbCAqLworICAgICAgICBwID0gZ2V0cHd1aWQocmVhbF91aWQoKSk7ICAgICAgIC8qIEdldCBsb2dpbiBkYXRhICovCisgICAgICAgIGlmIChwID09IChzdHJ1Y3QgcGFzc3dkICopIE5VTEwgfHwgISoocC0+cHdfc2hlbGwpKQorICAgICAgICAgIHNocGF0aCA9IGRlZnNoZWxsOworICAgICAgICBlbHNlCisgICAgICAgICAgc2hwYXRoID0gcC0+cHdfc2hlbGw7CisjZWxzZQorLyogTmV3IHdheSBsZXRzIHVzZXIgb3ZlcnJpZGUgd2l0aCBTSEVMTCB2YXJpYWJsZSwgYnV0IGRvZXMgbm90IHJlbHkgb24gaXQuICovCisvKiBUaGlzIGFsbG93cyB1c2VyIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgc2hlbGwuICovCisgICAgICAgIHNocGF0aCA9IGdldGVudigiU0hFTEwiKTsgICAgICAgLyogV2hhdCBzaGVsbD8gKi8KKwlkZWJ1ZyhGMTEwLCJ6c2hjbWQgU0hFTEwiLHNocGF0aCwwKTsKKyAgICAgICAgaWYgKHNocGF0aCA9PSBOVUxMKSB7CisgICAgICAgICAgICBwID0gZ2V0cHd1aWQoIHJlYWxfdWlkKCkgKTsgLyogR2V0IGxvZ2luIGRhdGEgKi8KKyAgICAgICAgICAgIGlmIChwID09IChzdHJ1Y3QgcGFzc3dkICopTlVMTCB8fCAhKihwLT5wd19zaGVsbCkpCisgICAgICAgICAgICAgIHNocGF0aCA9IGRlZnNoZWxsOworICAgICAgICAgICAgZWxzZSBzaHBhdGggPSBwLT5wd19zaGVsbDsKKwkgICAgZGVidWcoRjExMCwienNoY21kIHNocGF0aCIsc2hwYXRoLDApOworICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIGFlZ2lzICovCisgICAgICAgIHNocHRyID0gc2huYW1lID0gc2hwYXRoOworICAgICAgICB3aGlsZSAoKnNocHRyICE9ICdcMCcpCisgICAgICAgICAgaWYgKCpzaHB0cisrID09IERJUlNFUCkKKyAgICAgICAgICAgIHNobmFtZSA9IHNocHRyOworCXJlc3RvcnNpZ3MoKTsJCQkvKiBSZXN0b3JlIGlnbm9yZWQgc2lnbmFscyAqLworCWRlYnVnKEYxMTAsInpzaGNtZCBzaG5hbWUiLHNobmFtZSwwKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCB8fCAqcyA9PSAnXDAnKSB7ICAvKiBJbnRlcmFjdGl2ZSBzaGVsbCByZXF1ZXN0ZWQ/ICovCisgICAgICAgICAgICBleGVjbChzaHBhdGgsc2huYW1lLCItaSIsTlVMTCk7IC8qIFllcywgZG8gdGhhdCAqLworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSwgKi8KKyAgICAgICAgICAgIGV4ZWNsKHNocGF0aCxzaG5hbWUsIi1jIixzLE5VTEwpOyAvKiBleGVjIHRoZSBnaXZlbiBjb21tYW5kICovCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgZXhlY2woKSBmYWlsZWQsICovCisgICAgICAgIGV4aXQoQkFEX0VYSVQpOyAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGJhZCByZXR1cm4gY29kZS4gKi8KKworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhcmVudCAqLworCisgICAgICAgIGludCB3c3RhdDsgICAgICAgICAgICAgICAgICAgICAgLyogLi4uIG11c3Qgd2FpdCBmb3IgY2hpbGQgKi8KKyNpZmRlZiBDS19DSElMRAorICAgICAgICBpbnQgY2hpbGQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIENoaWxkJ3MgZXhpdCBzdGF0dXMgKi8KKyNlbmRpZiAvKiBDS19DSElMRCAqLworICAgICAgICBTSUdUWVAgKCppc3RhdCkoKSwgKCpxc3RhdCkoKTsKKworICAgICAgICBpZiAocGlkID09IChQSURfVCkgLTEpIHJldHVybigtMSk7IC8qIGZvcmsoKSBmYWlsZWQ/ICovCisKKyAgICAgICAgaXN0YXQgPSBzaWduYWwoU0lHSU5ULFNJR19JR04pOyAvKiBMZXQgdGhlIGZvcmsgaGFuZGxlIGtleWJvYXJkICovCisgICAgICAgIHFzdGF0ID0gc2lnbmFsKFNJR1FVSVQsU0lHX0lHTik7IC8qIGludGVycnVwdHMgaXRzZWxmLi4uICovCisKKyNpZmRlZiBDS19DSElMRAorICAgICAgICB3aGlsZSAoKCh3c3RhdCA9IHdhaXQoJmNoaWxkKSkgIT0gcGlkKSAmJiAod3N0YXQgIT0gLTEpKQorI2Vsc2UKKyAgICAgICAgd2hpbGUgKCgod3N0YXQgPSB3YWl0KChXQUlUX1QgKikwKSkgIT0gcGlkKSAmJiAod3N0YXQgIT0gLTEpKQorI2VuZGlmIC8qIENLX0NISUxEICovCisgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2FpdCBmb3IgZm9yayAqLworICAgICAgICBzaWduYWwoU0lHSU5ULGlzdGF0KTsgICAgICAgICAgIC8qIFJlc3RvcmUgaW50ZXJydXB0cyAqLworICAgICAgICBzaWduYWwoU0lHUVVJVCxxc3RhdCk7CisjaWZkZWYgQ0tfQ0hJTEQKKyAgICAgICAgcGV4aXRzdGF0ID0gKGNoaWxkICYgMHhmZikgPyBjaGlsZCA6IGNoaWxkID4+IDg7CisJZGVidWcoRjEwMSwienNoY21kIGV4aXQgc3RhdHVzIiwiIixwZXhpdHN0YXQpOworICAgICAgICByZXR1cm4oY2hpbGQgPT0gMCA/IDEgOiAwKTsgICAgIC8qIFJldHVybiBjaGlsZCdzIHN0YXR1cyAqLworI2VuZGlmIC8qIENLX0NISUxEICovCisgICAgfQorICAgIHJldHVybigxKTsKKyNlbmRpZiAvKiBOT1BVU0ggKi8KK30KKworLyogIEkgUyBXIEkgTCBEICAtLSAgQ2hlY2sgaWYgZmlsZXNwZWMgaXMgIndpbGQiICAqLworCisvKgorICBSZXR1cm5zOgorICAgIDAgaWYgYXJndW1lbnQgaXMgZW1wdHkgb3IgaXMgdGhlIG5hbWUgb2YgYSBzaW5nbGUgZmlsZTsKKyAgICAxIGlmIGl0IGNvbnRhaW5zIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisgIE5vdGU6IG11c3QgbWF0Y2ggdGhlIGFsZ29yaXRobSB1c2VkIGJ5IG1hdGNoKCksIGhlbmNlIG5vIFthLXpdLCBldGMuCisqLworaW50Citpc3dpbGQoZmlsZXNwZWMpIGNoYXIgKmZpbGVzcGVjOyB7CisgICAgY2hhciBjLCAqcCwgKmY7IGludCB4OworICAgIGludCBxdW8gPSAwOworICAgIGlmICghZmlsZXNwZWMpCisgICAgICByZXR1cm4oMCk7CisgICAgZiA9IGZpbGVzcGVjOworICAgIGlmICh3aWxkeHBhbmQpIHsJCQkvKiBTaGVsbCBoYW5kbGVzIHdpbGRjYXJkaW5nICovCisgICAgICAgIGlmICgoeCA9IG56eHBhbmQoZmlsZXNwZWMsMCkpID4gMSkKKyAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIGlmICh4ID09IDApIHJldHVybigwKTsgICAgICAgICAgLyogRmlsZSBkb2VzIG5vdCBleGlzdCAqLworICAgICAgICBwID0gbWFsbG9jKE1BWE5BTUxFTiArIDIwKTsKKyAgICAgICAgem5leHQocCk7CisgICAgICAgIHggPSAoc3RyY21wKGZpbGVzcGVjLHApICE9IDApOworICAgICAgICBmcmVlKHApOworICAgICAgICBwID0gTlVMTDsKKyAgICAgICAgcmV0dXJuKHgpOworICAgIH0gZWxzZSB7CQkJCS8qIFdlIGRvIGl0IG91cnNlbHZlcyAqLworICAgICAgICB3aGlsZSAoKGMgPSAqZmlsZXNwZWMrKykgIT0gJ1wwJykgeworICAgICAgICAgICAgaWYgKGMgPT0gJ1xcJyAmJiBxdW8gPT0gMCkgeworICAgICAgICAgICAgICAgIHF1byA9IDE7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXF1byAmJiAoYyA9PSAnKicgfHwgYyA9PSAnPycKKyNpZmRlZiBDS1JFR0VYCisjaWZuZGVmIFZNUworICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJ1snCisjZW5kaWYgLyogVk1TICovCisJCQkgfHwgYyA9PSAneycKKyNlbmRpZiAvKiBDS1JFR0VYICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKSkgeworCQlkZWJ1ZyhGMTExLCJpc3dpbGQiLGYsMSk7CisJCXJldHVybigxKTsKKwkgICAgfQorICAgICAgICAgICAgcXVvID0gMDsKKyAgICAgICAgfQorCWRlYnVnKEYxMTEsImlzd2lsZCIsZiwwKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KK30KKworLyoKKyAgSSBTIEQgSSBSICAtLSAgSXMgYSBEaXJlY3RvcnkuCisKKyAgVGVsbCBpZiBzdHJpbmcgcG9pbnRlciBzIGlzIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4gIFJldHVybnMgMSBpZgorICBkaXJlY3RvcnksIDAgaWYgbm90IGEgZGlyZWN0b3J5LgorCisgIFRoZSBmb2xsb3dpbmcgbm8gbG9uZ2VyIGFwcGxpZXM6CisKKyAgSWYgdGhlIGZpbGUgaXMgYSBzeW1saW5rLCB3ZSByZXR1cm4gMSBpZgorICBpdCBpcyBhIGRpcmVjdG9yeSBPUiBpZiBpdCBpcyBhIGxpbmsgdG8gYSBkaXJlY3RvcnkgYW5kIHRoZSAieHJlY3Vyc2l2ZSIgZmxhZworICBpcyBOT1Qgc2V0LiAgVGhpcyBpcyB0byBhbGxvdyBwYXJzaW5nIGEgbGluayB0byBhIGRpcmVjdG9yeSBhcyBpZiBpdCB3ZXJlIGEKKyAgZGlyZWN0b3J5IChlLmcuIGluIHRoZSBDRCBvciBJRiBESVJFQ1RPUlkgY29tbWFuZCkgYnV0IHN0aWxsIHByZXZlbnQKKyAgcmVjdXJzaXZlIHRyYXZlcnNhbCBmcm9tIHZpc2l0aW5nIHRoZSBzYW1lIGRpcmVjdG9yeSB0d2ljZS4KKyovCisKKyNpZmRlZiBJU0RJUkNBQ0hFCisvKiBUaGlzIHR1cm5zIG91dCB0byBiZSB1bnNhZmUgYW5kIGdpdmVzIGxpdHRsZSBiZW5lZml0IGFueXdheS4gKi8KKy8qIFNlZSBub3RlcyAyOCBTZXAgMjAwMy4gIFRodXMgSVNESVJDQUNIRSBpcyBub3QgZGVmaW5lZC4gKi8KKworc3RhdGljIGNoYXIgcHJldnBhdGhbQ0tNQVhQQVRIKzRdID0geyAnXDAnLCAnXDAnIH07CitzdGF0aWMgaW50IHByZXZzdGF0ID0gLTE7CitpbnQKK2NscmRpcmNhY2hlKCkgeworICAgIGRlYnVnKEYxMDAsIkNMRUFSIElTRElSIENBQ0hFIiwiIiwwKTsKKyAgICBwcmV2c3RhdCA9IC0xOworICAgIHByZXZwYXRoWzBdID0gTlVMOworfQorI2VuZGlmIC8qIElTRElSQ0FDSEUgKi8KKworaW50Citpc2RpcihzKSBjaGFyICpzOyB7CisgICAgaW50IHgsIG5lZWRybGluayA9IDAsIGlzbGluayA9IDA7CisgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICBjaGFyIGZuYW1bQ0tNQVhQQVRIKzRdOworCisgICAgaWYgKCFzKSByZXR1cm4oMCk7CisgICAgaWYgKCEqcykgcmV0dXJuKDApOworCisjaWZkZWYgSVNESVJDQUNIRQorICAgIGlmIChwcmV2c3RhdCA+IC0xKSB7CisJaWYgKHNbMF0gPT0gcHJldnBhdGhbMF0pIHsKKwkgICAgaWYgKCFzdHJjbXAocyxwcmV2cGF0aCkpIHsKKwkJZGVidWcoRjExMSwiaXNkaXIgY2FjaGUgaGl0IixzLHByZXZzdGF0KTsKKwkJcmV0dXJuKHByZXZzdGF0KTsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYgLyogSVNESVJDQUNIRSAqLworCisjaWZkZWYgQ0tTWU1MSU5LCisjaWZkZWYgQ09NTUVOVAorLyoKKyAgVGhlIGZvbGxvd2luZyBvdmVyLWNsZXZlciBiaXQgaGFzIGJlZW4gY29tbWVudGVkIG91dCBiZWNhdXNlIGl0IHByZXN1bWVzCisgIHRvIGtub3cgd2hlbiBhIHN5bWxpbmsgbWlnaHQgYmUgcmVkdW5kYW50LCB3aGljaCBpdCBjYW4ndCBwb3NzaWJseSBrbm93LgorICBVc2luZyBwbGFpbiBvbGQgc3RhdCgpIGdpdmVzIEtlcm1pdCB0aGUgc2FtZSByZXN1bHRzIGFzIGxzIGFuZCBscyAtUiwgd2hpY2gKKyAgaXMganVzdCBmaW5lOiBubyBzdXJwcmlzZXMuCisqLworI2lmZGVmIFVTRV9MU1RBVAorICAgIGlmICh4cmVjdXJzaXZlKSB7CisgICAgICAgIHggPSBsc3RhdChzLCZzdGF0YnVmKTsKKyAgICAgICAgZGVidWcoRjExMSwiaXNkaXIgbHN0YXQiLHMseCk7CisgICAgfSBlbHNlIHsKKyNlbmRpZiAvKiBVU0VfTFNUQVQgKi8KKyAgICAgICAgeCA9IHN0YXQocywmc3RhdGJ1Zik7CisgICAgICAgIGRlYnVnKEYxMTEsImlzZGlyIHN0YXQiLHMseCk7CisjaWZkZWYgVVNFX0xTVEFUCisgICAgfQorI2VuZGlmIC8qIFVTRV9MU1RBVCAqLworI2Vsc2UKKyAgICB4ID0gc3RhdChzLCZzdGF0YnVmKTsKKyAgICBkZWJ1ZyhGMTExLCJpc2RpciBzdGF0IixzLHgpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBpZiAoeCA9PSAtMSkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJpc2RpciBlcnJubyIsIiIsZXJybm8pOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGlzbGluayA9IDA7CisgICAgaWYgKHhyZWN1cnNpdmUpIHsKKyNpZmRlZiBOT0xJTktCSVRTCisgICAgICAgIG5lZWRybGluayA9IDE7CisjZWxzZQorI2lmZGVmIFNfSVNMTksKKyAgICAgICAgaXNsaW5rID0gU19JU0xOSyhzdGF0YnVmLnN0X21vZGUpOworICAgICAgICBkZWJ1ZyhGMTAxLCJpc2RpciBTX0lTTE5LIGlzbGluayIsIiIsaXNsaW5rKTsKKyNlbHNlCisjaWZkZWYgX0lGTE5LCisgICAgICAgIGlzbGluayA9IChfSUZNVCAmIHN0YXRidWYuc3RfbW9kZSkgPT0gX0lGTE5LOworICAgICAgICBkZWJ1ZyhGMTAxLCJpc2RpciBfSUZMTksgaXNsaW5rIiwiIixpc2xpbmspOworI2VuZGlmIC8qIF9JRkxOSyAqLworI2VuZGlmIC8qIFNfSVNMTksgKi8KKyNlbmRpZiAvKiBOT0xJTktCSVRTICovCisgICAgICAgIGlmIChuZWVkcmxpbmspIHsKKyAgICAgICAgICAgIGlmIChyZWFkbGluayhzLGZuYW0sQ0tNQVhQQVRIKSA+IC0xKQorICAgICAgICAgICAgICBpc2xpbmsgPSAxOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICB4ID0gc3RhdChzLCZzdGF0YnVmKTsKKyAgICBpZiAoeCA9PSAtMSkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJpc2RpciBlcnJubyIsIiIsZXJybm8pOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsImlzZGlyIHN0YXQiLHMseCk7CisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisgICAgZGVidWcoRjEwMSwiaXNkaXIgaXNsaW5rIiwiIixpc2xpbmspOworICAgIGRlYnVnKEYxMDEsImlzZGlyIHN0YXRidWYuc3RfbW9kZSIsIiIsc3RhdGJ1Zi5zdF9tb2RlKTsKKyAgICB4ID0gaXNsaW5rID8gMCA6IChTX0lTRElSIChzdGF0YnVmLnN0X21vZGUpID8gMSA6IDApOworI2lmZGVmIElTRElSQ0FDSEUKKyAgICBwcmV2c3RhdCA9IHg7CisgICAgY2tzdHJuY3B5KHByZXZwYXRoLHMsQ0tNQVhQQVRIKzEpOworI2VuZGlmIC8qIElTRElSQ0FDSEUgKi8KKyAgICByZXR1cm4oeCk7Cit9CisKKyNpZmRlZiBDS19NS0RJUgorLyogU29tZSBzeXN0ZW1zIGRvbid0IGhhdmUgbWtkaXIoKSwgZS5nLiBUYW5keSBYZW5peCAzLjIuLiAqLworCisvKiBaIE0gSyBEIEkgUiAgLS0gIENyZWF0ZSBkaXJlY3RvcnkocykgaWYgbmVjZXNzYXJ5ICovCisvKgorICAgQ2FsbCB3aXRoOgorICAgIEEgcG9pbnRlciB0byBhIGZpbGUgc3BlY2lmaWNhdGlvbiB0aGF0IG1pZ2h0IGNvbnRhaW4gZGlyZWN0b3J5CisgICAgaW5mb3JtYXRpb24uICBUaGUgZmlsZW5hbWUgaXMgZXhwZWN0ZWQgdG8gYmUgaW5jbHVkZWQuCisgICAgSWYgdGhlIGZpbGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBpbmNsdWRlIGFueSBkaXJlY3Rvcnkgc2VwYXJhdG9ycywKKyAgICB0aGVuIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBwbGFpbiBmaWxlLgorICAgIElmIG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgZmlsZSBzcGVjaWZpY2F0aW9uLAorICAgIHRoaXMgcm91dGluZSB0cmllcyB0byBjcmVhdGUgdGhlbSBpZiB0aGV5IGRvbid0IGFscmVhZHkgZXhpc3QuCisgICBSZXR1cm5zOgorICAgIDAgb3IgZ3JlYXRlciBvbiBzdWNjZXNzLCBpLmUuIHRoZSBudW1iZXIgb2YgZGlyZWN0b3JpZXMgY3JlYXRlZC4KKyAgIC0xIG9uIGZhaWx1cmUgdG8gY3JlYXRlIHRoZSBkaXJlY3RvcnkKKyovCitpbnQKK3pta2RpcihwYXRoKSBjaGFyICpwYXRoOyB7CisgICAgY2hhciAqeHAsICp0cCwgYzsKKyAgICBpbnQgeCwgY291bnQgPSAwOworCisgICAgaWYgKCFwYXRoKSBwYXRoID0gIiI7CisgICAgaWYgKCEqcGF0aCkgcmV0dXJuKC0xKTsKKworI2lmZGVmIENLUk9PVAorICAgIGRlYnVnKEYxMTEsInpta2RpciBzZXRyb290Iixja3Jvb3QsY2tyb290c2V0KTsKKyAgICBpZiAoY2tyb290c2V0KSBpZiAoIXppbnJvb3QocGF0aCkpIHsKKwlkZWJ1ZyhGMTEwLCJ6bWtkaXIgc2V0cm9vdCB2aW9sYXRpb24iLHBhdGgsMCk7CisJcmV0dXJuKC0xKTsKKyAgICB9CisjZW5kaWYgLyogQ0tST09UICovCisKKyAgICB4ID0gc3RybGVuKHBhdGgpOworICAgIGRlYnVnKEYxMTEsInpta2RpciIscGF0aCx4KTsKKyAgICBpZiAoeCA8IDEgfHwgeCA+IE1BWFBBVEgpICAgICAgICAgICAvKiBDaGVjayBsZW5ndGggKi8KKyAgICAgIHJldHVybigtMSk7CisgICAgaWYgKCEodHAgPSBtYWxsb2MoeCsxKSkpICAgICAgICAgICAgLyogTWFrZSBhIHRlbXBvcmFyeSBjb3B5ICovCisgICAgICByZXR1cm4oLTEpOworICAgIHN0cmNweSh0cCxwYXRoKTsJCQkvKiBzYWZlIChwcmVjaGVja2VkKSAqLworI2lmZGVmIERUSUxERQorICAgIGlmICgqdHAgPT0gJ34nKSB7ICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0cyB3aXRoIHRpbGRlPyAqLworICAgICAgICB4cCA9IHRpbGRlX2V4cGFuZCh0cCk7ICAgICAgICAgIC8qIEF0dGVtcHQgdG8gZXhwYW5kIHRpbGRlICovCisgICAgICAgIGlmICgheHApIHhwID0gIiI7CisgICAgICAgIGlmICgqeHApIHsKKyAgICAgICAgICAgIGNoYXIgKnpwOworICAgICAgICAgICAgZGVidWcoRjExMCwiem1rZGlyIHRpbGRlX2V4cGFuZCIseHAsMCk7CisgICAgICAgICAgICBpZiAoISh6cCA9IG1hbGxvYyhzdHJsZW4oeHApICsgMSkpKSB7IC8qIE1ha2UgYSBwbGFjZSBmb3IgaXQgKi8KKyAgICAgICAgICAgICAgICBmcmVlKHRwKTsKKyAgICAgICAgICAgICAgICB0cCA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUodHApOyAgICAgICAgICAgICAgICAgICAvKiBGcmVlIHByZXZpb3VzIGJ1ZmZlciAqLworICAgICAgICAgICAgdHAgPSB6cDsgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIG5ldyBvbmUgKi8KKyAgICAgICAgICAgIHN0cmNweSh0cCx4cCk7ICAgICAgICAgICAgICAvKiBDb3B5IGV4cGFuZGVkIG5hbWUgdG8gbmV3IGJ1ZmZlciAqLworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIERUSUxERSAqLworICAgIGRlYnVnKEYxMTAsInpta2RpciB0cCBhZnRlciB0aWxkZV9leHBhbnNpb24iLHRwLDApOworICAgIHhwID0gdHA7CisgICAgaWYgKElTRElSU0VQKCp4cCkpICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgY3JlYXRlIHJvb3QgZGlyZWN0b3J5ISAqLworICAgICAgeHArKzsKKworICAgIC8qIEdvIHRocnUgZmlsZXNwZWMgZnJvbSBsZWZ0IHRvIHJpZ2h0Li4uICovCisKKyAgICBmb3IgKDsgKnhwOyB4cCsrKSB7ICAgICAgICAgICAgICAgICAvKiBDcmVhdGUgcGFydHMgdGhhdCBkb24ndCBleGlzdCAqLworICAgICAgICBpZiAoIUlTRElSU0VQKCp4cCkpICAgICAgICAgICAgIC8qIEZpbmQgbmV4dCBkaXJlY3Rvcnkgc2VwYXJhdG9yICovCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGMgPSAqeHA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogR290IG9uZS4gKi8KKyAgICAgICAgKnhwID0gTlVMOyAgICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIHRoaXMgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAqLworICAgICAgICBpZiAoIWlzZGlyKHRwKSkgeyAgICAgICAgICAgICAgIC8qIFRoaXMgZGlyZWN0b3J5IGV4aXN0cyBhbHJlYWR5PyAqLworI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgICBpZiAoaXNndWVzdCkgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBhbGxvd2VkIGZvciBndWVzdHMgKi8KKwkgICAgICByZXR1cm4oLTEpOworI2lmbmRlZiBOT1hGRVIKKyAgICAgICAgICAgIC8qIE5vciBpZiBNS0RJUiBhbmQvb3IgQ0QgYXJlIGRpc2FibGVkICovCisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKwkgICAgICBpZiAoKHNlcnZlcgorI2lmZGVmIElLU0QKKwkJICAgfHwgaW5zZXJ2ZXIKKyNlbmRpZiAvKiBJS1NEICovCisJCSAgICkgJiYgKCFFTkFCTEVEKGVuX21rZCkgfHwgIUVOQUJMRUQoZW5fY3dkKSkpCisJCXJldHVybigtMSk7CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ6bWtkaXIgbWFraW5nIix0cCwwKTsKKyAgICAgICAgICAgIHggPSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObywgdHJ5IHRvIGNyZWF0ZSBpdCAqLworI2lmZGVmIE5PTUtESVIKKyAgICAgICAgICAgICAgIC0xICAgICAgICAgICAgICAgICAgICAgICAvKiBTeXN0ZW1zIHdpdGhvdXQgbWtkaXIoKSAqLworI2Vsc2UKKyAgICAgICAgICAgICAgIG1rZGlyKHRwLDA3NzcpICAgICAgICAgICAvKiBVTklYICovCisjZW5kaWYgLyogTk9NS0RJUiAqLworICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6bWtkaXIgZmFpbGVkLCBlcnJubyIsIiIsZXJybm8pOworICAgICAgICAgICAgICAgIGZyZWUodHApOyAgICAgICAgICAgICAgIC8qIEZyZWUgdGVtcG9yYXJ5IGJ1ZmZlci4gKi8KKyAgICAgICAgICAgICAgICB0cCA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsgICAgICAgICAgICAgLyogUmV0dXJuIGZhaWx1cmUgY29kZS4gKi8KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgICAgICp4cCA9IGM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSB0aGUgc2VwYXJhdG9yLiAqLworICAgIH0KKyAgICBmcmVlKHRwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIHRlbXBvcmFyeSBidWZmZXIuICovCisgICAgcmV0dXJuKGNvdW50KTsgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIHN1Y2Nlc3MgY29kZS4gKi8KK30KKyNlbmRpZiAvKiBDS19NS0RJUiAqLworCitpbnQKK3pybWRpcihwYXRoKSBjaGFyICpwYXRoOyB7CisjaWZkZWYgQ0tfTE9HSU4KKyAgICBpZiAoaXNndWVzdCkKKyAgICAgIHJldHVybigtMSk7CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKworICAgIGlmICghcGF0aCkgcGF0aCA9ICIiOworICAgIGlmICghKnBhdGgpIHJldHVybigtMSk7CisKKyNpZmRlZiBDS1JPT1QKKyAgICBkZWJ1ZyhGMTExLCJ6cm1kaXIgc2V0cm9vdCIsY2tyb290LGNrcm9vdHNldCk7CisgICAgaWYgKGNrcm9vdHNldCkgaWYgKCF6aW5yb290KHBhdGgpKSB7CisJZGVidWcoRjExMCwienJtZGlyIHNldHJvb3QgdmlvbGF0aW9uIixwYXRoLDApOworCXJldHVybigtMSk7CisgICAgfQorI2VuZGlmIC8qIENLUk9PVCAqLworCisjaWZuZGVmIE5PTUtESVIKKyAgICByZXR1cm4ocm1kaXIocGF0aCkpOworI2Vsc2UKKyAgICByZXR1cm4oLTEpOworI2VuZGlmIC8qIE5PTUtESVIgKi8KK30KKworLyogWiBGIFMgRSBFIEsgIC0tICBQb3NpdGlvbiBpbnB1dCBmaWxlIHBvaW50ZXIgKi8KKy8qCisgICBDYWxsIHdpdGg6CisgICAgTG9uZyBpbnQsIDAtYmFzZWQsIGluZGljYXRpbmcgZGVzaXJlZCBwb3NpdGlvbi4KKyAgIFJldHVybnM6CisgICAgMCBvbiBzdWNjZXNzLgorICAgLTEgb24gZmFpbHVyZS4KKyovCisjaWZuZGVmIE5PUkVTRU5ECitpbnQKKyNpZmRlZiBDS19BTlNJQworemZzZWVrKGxvbmcgcG9zKQorI2Vsc2UKK3pmc2Vlayhwb3MpIGxvbmcgcG9zOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB6ZnNlZWsgKi8geworICAgIHppbmNudCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE11c3QgZW1wdHkgdGhlIGlucHV0IGJ1ZmZlciAqLworICAgIGRlYnVnKEYxMDEsInpmc2VlayIsIiIscG9zKTsKKyAgICByZXR1cm4oZnNlZWsoZnBbWklGSUxFXSwgcG9zLCAwKT8tMTowKTsKK30KKyNlbmRpZiAvKiBOT1JFU0VORCAqLworCisvKiAgWiBGIE4gUSBGIFAgIC0tICBDb252ZXJ0IGZpbGVuYW1lIHRvIGZ1bGx5IHF1YWxpZmllZCBhYnNvbHV0ZSBwYXRobmFtZSAqLworCitzdGF0aWMgc3RydWN0IHpmbmZwIGZuZnAgPSB7IDAsIE5VTEwsIE5VTEwgfTsKKworc3RydWN0IHpmbmZwICoKK3pmbnFmcChmbmFtZSwgYnVmbGVuLCBidWYpICBjaGFyICogZm5hbWU7IGludCBidWZsZW47IGNoYXIgKiBidWY7IHsKKyAgICBjaGFyICogczsKKyAgICBpbnQgbGVuOworI2lmZGVmIE1BWFBBVEhMRU4KKyAgICBjaGFyIHpmbnRtcFtNQVhQQVRITEVOKzRdOworI2Vsc2UKKyAgICBjaGFyIHpmbnRtcFtDS01BWFBBVEgrNF07CisjZW5kaWYgLyogTUFYUEFUSExFTiAqLworCisgICAgY2hhciBzYlszMl0sICogdG1wOworICAgIGludCBpID0gMCwgaiA9IDAsIGsgPSAwLCB4ID0gMCwgeSA9IDA7CisgICAgaW50IGl0c2FkaXIgPSAwOworCisgICAgcyA9IGZuYW1lOworICAgIGlmICghcykKKyAgICAgIHJldHVybihOVUxMKTsKKyAgICBpZiAoISpzKQorICAgICAgcmV0dXJuKE5VTEwpOworICAgIGlmICghYnVmKQorICAgICAgcmV0dXJuKE5VTEwpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgKi8KKworICAgIGZuZnAubGVuID0gY2tzdHJuY3B5KGJ1ZixmbmFtZSxidWZsZW4pOworICAgIGZuZnAuZnBhdGggPSBidWY7CisgICAgZm5mcC5mbmFtZSA9IE5VTEw7CisgICAgbGVuID0gYnVmbGVuOworICAgIGRlYnVnKEYxMTEsInpmbnFmcCBmbmFtZSIsZm5hbWUsbGVuKTsKKworI2lmZGVmIERUSUxERQorICAgIGlmICgqcyA9PSAnficpIHsgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0cyB3aXRoIHRpbGRlPyAqLworICAgICAgICBjaGFyICogeHA7CisgICAgICAgIHhwID0gdGlsZGVfZXhwYW5kKHMpOyAgICAgICAgICAgLyogQXR0ZW1wdCB0byBleHBhbmQgdGlsZGUgKi8KKyAgICAgICAgZGVidWcoRjExMCwiemZucWZwIHhwIix4cCwwKTsgICAvKiAocmVhbHBhdGgoKSBkb2Vzbid0IGRvIHRoaXMpICovCisgICAgICAgIGlmICgheHApIHhwID0gIiI7CisgICAgICAgIGlmICgqeHApCisgICAgICAgICAgcyA9IHhwOworICAgIH0KKyNlbmRpZiAvKiBEVElMREUgKi8KKworI2lmZGVmIENLUkVBTFBBVEgKKworLyogTi5CLjogVGhlIHJlYWxwYXRoKCkgcmVzdWx0IGJ1ZmZlciBNVVNUIGJlIE1BWFBBVEhMRU4gYnl0ZXMgbG9uZyAqLworLyogb3RoZXJ3aXNlIHdlIHdyaXRlIG92ZXIgbWVtb3J5LiAqLworCisgICAgaWYgKCFyZWFscGF0aChzLHpmbnRtcCkpIHsKKyAgICAgICAgZGVidWcoRjExMSwiemZucWZwIHJlYWxwYXRoIGZhaWxzIixzLGVycm5vKTsKKyNpZmRlZiBDT01NRU5UCisJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkgIHJldHVybihOVUxMKTsKKyNlbHNlCisJLyogSWYgcmVhbHBhdGgoKSBmYWlscyB1c2UgdGhlIGRvLWl0LXlvdXJzZWxmIG1ldGhvZCAqLworCS8qIDE2IEphbiAyMDAyICovCisJZ290byBub3JlYWxwYXRoOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB9CisgICAgbGVuID0gc3RybGVuKHpmbnRtcCk7CisgICAgaWYgKGxlbiA+IGJ1ZmxlbikgeworCWRlYnVnKEYxMTEsInpmbnFmcCByZXN1bHQgdG9vIGxvbmciLGNraXRvYShidWZsZW4pLGxlbik7CisJcmV0dXJuKE5VTEwpOworICAgIH0gZWxzZSB7CisJY2tzdHJuY3B5KGJ1Zix6Zm50bXAsYnVmbGVuKTsKKyAgICB9CisgICAgaWYgKGJ1ZltsZW4tMV0gIT0gJy8nKSB7CisJaWYgKChpdHNhZGlyID0gaXNkaXIoYnVmKSkgJiYgbGVuIDwgKGJ1ZmxlbiAtIDEpKSB7CisJICAgIGJ1ZltsZW4rK10gPSAnLyc7CisJICAgIGJ1ZltsZW5dID0gTlVMOworCX0KKyAgICB9CisgICAgZm5mcC5sZW4gPSBsZW47CisgICAgZm5mcC5mcGF0aCA9IGJ1ZjsKKyAgICBkZWJ1ZyhGMTEwLCJ6Zm5xZnAgcmVhbHBhdGggcGF0aCIsZm5mcC5mcGF0aCwwKTsKKyAgICB0bXAgPSBidWYgKyBmbmZwLmxlbiAtIDE7CisgICAgaWYgKCFpdHNhZGlyKSB7CisJd2hpbGUgKHRtcCA+PSBidWYpIHsKKwkgICAgaWYgKCp0bXAgPT0gJy8nKSB7CisJCWZuZnAuZm5hbWUgPSB0bXAgKyAxOworCQlkZWJ1ZyhGMTEwLCJ6Zm5xZnAgcmVhbHBhdGggbmFtZSIsZm5mcC5mbmFtZSwwKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgdG1wLS07CisJfQorICAgIH0KKyAgICByZXR1cm4oJmZuZnApOworCisjZW5kaWYgLyogQ0tSRUFMUEFUSCAqLworCisgIG5vcmVhbHBhdGg6CisKKyAgICB0bXAgPSB6Zm50bXA7CisgICAgd2hpbGUgKCpzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIGxlYWRpbmcgIi4vIiAoMCBvciBtb3JlKSAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJ6Zm5xZnAgd2hpbGUgKnMiLHMsMCk7CisgICAgICAgIGlmICgqcyA9PSAnLicgJiYgKihzKzEpID09ICcvJykgeworICAgICAgICAgICAgcyArPSAyOworICAgICAgICAgICAgd2hpbGUgKCpzID09ICcvJykgcysrOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCEqcykgcmV0dXJuKE5VTEwpOworICAgIGlmICgqcyA9PSAnLycpIHsgICAgICAgICAgICAgICAgICAgIC8qIFBhdGhuYW1lIGlzIGFic29sdXRlICovCisgICAgICAgIGNrc3RybmNweShidWYscyxsZW4pOworICAgICAgICB4ID0gc3RybGVuKGJ1Zik7CisgICAgICAgIHkgPSAwOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhdGhuYW1lIGlzIHJlbGF0aXZlICovCisgICAgICAgIGNoYXIgKiBwOworICAgICAgICBpZiAocCA9IHpndGRpcigpKSB7ICAgICAgICAgICAgIC8qIFNvIGdldCBjdXJyZW50IGRpcmVjdG9yeSAqLworICAgICAgICAgICAgZGVidWcoRjExMCwiemZucWZwIHpndGRpciIscCwwKTsKKyAgICAgICAgICAgIHggPSBja3N0cm5jcHkoYnVmLHAsbGVuKTsKKyAgICAgICAgICAgIGJ1Zlt4KytdID0gJy8nOworICAgICAgICAgICAgZGVidWcoRjExMCwiemZucWZwIGJ1ZiAxIixidWYsMCk7CisgICAgICAgICAgICBsZW4gLT0geDsgICAgICAgICAgICAgICAgICAgLyogSG93IG11Y2ggcm9vbSBsZWZ0IGluIGJ1ZmZlciAqLworICAgICAgICAgICAgaWYgKCh5ID0gKGludClzdHJsZW4ocykpID4gbGVuKSAvKiBJZiBlbm91Z2ggcm9vbS4uLiAqLworICAgICAgICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgICAgICAgICBja3N0cm5jcHkoYnVmK3gscyxsZW4pOyAgICAgLyogLi4uIGFwcGVuZCB0aGUgZmlsZW5hbWUgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInpmbnFmcCBidWYgMiIsYnVmLDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQnVmIG5vdyBob2xkcyBmdWxsIHBhdGggYnV0IG1heWJlIGNvbnRhaW5pbmcgc29tZSAuIG9yIC4uIHRyaWNrcyAqLworCisgICAgaiA9IHggKyB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHdoYXQncyBpbiBidWYgKi8KKyAgICBsZW4gPSBqOworICAgIGRlYnVnKEYxMDEsInpmbnFmcCBsZW4iLCIiLGxlbik7CisKKyAgICAvKiBDYXRjaCBkYW5nbGluZyAiLy4iIG9yICIvLi4iICovCisgICAgaWYgKChqID4gMSAmJiBidWZbai0xXSA9PSAnLicgJiYgYnVmW2otMl0gPT0gJy8nKSB8fAorICAgICAgICAoaiA+IDIgJiYgYnVmW2otMV0gPT0gJy4nICYmIGJ1ZltqLTJdID09ICcuJyAmJiBidWZbai0zXSA9PSAnLycpKSB7CisgICAgICAgIGlmIChqIDwgYnVmbGVuIC0gMikgeworICAgICAgICAgICAgYnVmW2pdID0gJy8nOworICAgICAgICAgICAgYnVmW2orMV0gPSBOVUw7CisgICAgICAgIH0KKyAgICB9CisgICAgaiA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaiA9IHBvc2l0aW9uIG9mIHJpZ2h0bW9zdCAiLyIgKi8KKyAgICBpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpID0gZGVzdGluYXRpb24gaW5kZXggKi8KKyAgICB0bXBbaV0gPSBOVUw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXN0aW5hdGlvbiBpcyB0ZW1wb3JhcnkgYnVmZmVyICAqLworCisgICAgZm9yICh4ID0gMDsgeCA8IGxlbjsgeCsrKSB7ICAgICAgICAgLyogeCA9IHNvdXJjZSBpbmRleCAqLworICAgICAgICBpZiAoYnVmW3hdID09ICcvJykgeworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgICAgIHNiW2tdID0gYnVmW3gra107CisgICAgICAgICAgICAgICAgc2JbaysxXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgaWYgKCFzYltrXSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXN0cm5jbXAoc2IsIi8uLyIsMykpIHsgLyogRWxpbWluYXRlICIuLyIgaW4gIi8uLyIgKi8KKyAgICAgICAgICAgICAgICB4ICs9IDE7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHNiLCIvLyIsMikpIHsgLyogQ2hhbmdlICIvLyIgdG8gIi8iICovCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHNiLCIvLi4vIiw0KSkgeyAvKiAiLi4iIGluIHBhdGggKi8KKyAgICAgICAgICAgICAgICBmb3IgKGsgPSBpIC0gMTsgayA+PSAwOyBrLS0pIHsgLyogQmFjayB1cCBvbmUgbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFtrXSA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wW2ldID0gTlVMOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeCArPSAyOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpID49IChidWZsZW4gLSAxKSkgeworICAgICAgICAgICAgZGVidWcoRjExMSwiemZucWZwIG92ZXJmbG93Iix0bXAsaSk7CisgICAgICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgdG1wW2krK10gPSBidWZbeF07ICAgICAgICAgICAgICAvKiBSZWd1bGFyIGNoYXJhY3RlciwgY29weSAqLworICAgICAgICB0bXBbaV0gPSBOVUw7CisgICAgICAgIGlmIChidWZbeF0gPT0gJy8nKSAgICAgICAgICAgICAgLyogUmVtZW1iZXIgcmlnaHRtb3N0ICIvIiAqLworICAgICAgICAgIGogPSBpOworICAgIH0KKyAgICBja3N0cm5jcHkoYnVmLHRtcCxidWZsZW4tMSk7ICAgICAgICAvKiBDb3B5IHRoZSByZXN1bHQgYmFjayAqLworCisgICAgYnVmW2J1Zmxlbi0xXSA9IE5VTDsKKyAgICBpZiAoIWJ1ZlswXSkgeyAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBlbXB0eSwgc2F5IHJvb3QgKi8KKyAgICAgICAgYnVmWzBdID0gJy8nOworICAgICAgICBidWZbMl0gPSBOVUw7CisgICAgICAgIGogPSAwOworICAgICAgICBpID0gMTsKKyAgICB9CisgICAgaWYgKChpdHNhZGlyID0gaXNkaXIoYnVmKSkpIHsKKwlpZiAoYnVmW2ktMV0gIT0gJy8nICYmIGkgPCAoYnVmbGVuIC0gMSkpIHsKKwkgICAgYnVmW2krK10gPSAnLyc7CisJICAgIGJ1ZltpXSA9IE5VTDsKKwl9CisgICAgfQorICAgIGlmICghaXRzYWRpciAmJiAoaiA+IC0xKSkgewkJLyogU2V0IHBvaW50ZXIgdG8gYmFzZW5hbWUgKi8KKyAgICAgICAgZm5mcC5mbmFtZSA9IChjaGFyICopKGJ1ZiArIGopOworICAgICAgICBmbmZwLmZwYXRoID0gKGNoYXIgKilidWY7CisgICAgICAgIGZuZnAubGVuID0gaTsKKyAgICAgICAgZGVidWcoRjExMSwiemZucWZwIHBhdGgiLGZuZnAuZnBhdGgsaSk7CisgICAgICAgIGRlYnVnKEYxMTAsInpmbnFmcCBuYW1lIixmbmZwLmZuYW1lLDApOworICAgICAgICByZXR1cm4oJmZuZnApOworICAgIH0KKyAgICByZXR1cm4oTlVMTCk7Cit9CisKKy8qICBaIEMgTSBQIEYgTiAgLS0gIENvbXBhcmUgdHdvIGZpbGVuYW1lcyAgKi8KKworLyogIFJldHVybnMgMSBpZiB0aGUgdHdvIG5hbWVzIHJlZmVyIHRvIHRoZSBzYW1lIGV4aXN0aW5nIGZpbGUsIDAgb3RoZXJ3aXNlLiAqLworCitpbnQKK3pjbXBmbihzMSxzMikgY2hhciAqIHMxLCAqIHMyOyB7CisgICAgY2hhciBidWYxW0NLTUFYUEFUSCsxXTsKKyAgICBjaGFyIGJ1ZjJbQ0tNQVhQQVRIKzFdOworCisjaWZkZWYgVVNFX0xTVEFUCisgICAgY2hhciBsaW5rbmFtZVtDS01BWFBBVEgrMV07CisgICAgc3RydWN0IHN0YXQgYnVmOworI2VuZGlmIC8qIFVTRV9MU1RBVCAqLworICAgIGludCB4LCByYyA9IDA7CisKKyAgICBpZiAoIXMxKSBzMSA9ICIiOworICAgIGlmICghczIpIHMyID0gIiI7CisgICAgaWYgKCEqczEgfHwgISpzMikgcmV0dXJuKDApOworCisjaWZkZWYgQ0tTWU1MSU5LICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UncmUgZG9pbmcgc3ltbGlua3M/ICovCisjaWZkZWYgVVNFX0xTVEFUICAgICAgICAgICAgICAgICAgICAgICAgLyogT0sgdG8gdXNlIGxzdGF0KCk/ICovCisgICAgeCA9IGxzdGF0KHMxLCZidWYpOworICAgIGlmICh4ID4gLTEgJiYJCQkvKiBOb3cgc2VlIGlmIGl0J3MgYSBzeW1saW5rICovCisjaWZkZWYgU19JU0xOSworICAgICAgICBTX0lTTE5LKGJ1Zi5zdF9tb2RlKQorI2Vsc2UKKyNpZmRlZiBfSUZMTksKKyAgICAgICAgKChfSUZNVCAmIGJ1Zi5zdF9tb2RlKSA9PSBfSUZMTkspCisjZW5kaWYgLyogX0lGTE5LICovCisjZW5kaWYgLyogU19JU0xOSyAqLworICAgICAgICApIHsKKyAgICAgICAgbGlua25hbWVbMF0gPSAnXDAnOyAgICAgICAgICAgICAvKiBHZXQgdGhlIG5hbWUgKi8KKyAgICAgICAgeCA9IHJlYWRsaW5rKHMxLGxpbmtuYW1lLENLTUFYUEFUSCk7CisgICAgICAgIGlmICh4ID4gLTEgJiYgeCA8IENLTUFYUEFUSCkgeyAgLyogSXQncyBhIGxpbmsgKi8KKyAgICAgICAgICAgIGxpbmtuYW1lW3hdID0gJ1wwJzsKKwkgICAgczEgPSBsaW5rbmFtZTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBVU0VfTFNUQVQgKi8KKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKworICAgIGlmICh6Zm5xZnAoczEsQ0tNQVhQQVRILGJ1ZjEpKSB7CS8qIENvbnZlcnQgdG8gZnVsbCBwYXRobmFtZSAqLworCisjaWZkZWYgQ0tTWU1MSU5LCQkJLyogU2FtZSBkZWFsIGZvciBzZWNvbmQgbmFtZS4uLiAqLworI2lmZGVmIFVTRV9MU1RBVAorCXggPSBsc3RhdChzMiwmYnVmKTsKKwlpZiAoeCA+IC0xICYmCisjaWZkZWYgU19JU0xOSworCSAgICBTX0lTTE5LKGJ1Zi5zdF9tb2RlKQorI2Vsc2UKKyNpZmRlZiBfSUZMTksKKwkgICAgKChfSUZNVCAmIGJ1Zi5zdF9tb2RlKSA9PSBfSUZMTkspCisjZW5kaWYgLyogX0lGTE5LICovCisjZW5kaWYgLyogU19JU0xOSyAqLworCSAgICApIHsKKwkgICAgbGlua25hbWVbMF0gPSAnXDAnOworCSAgICB4ID0gcmVhZGxpbmsoczIsbGlua25hbWUsQ0tNQVhQQVRIKTsKKwkgICAgaWYgKHggPiAtMSAmJiB4IDwgQ0tNQVhQQVRIKSB7CisJCWxpbmtuYW1lW3hdID0gJ1wwJzsKKwkJczIgPSBsaW5rbmFtZTsKKwkgICAgfQorCX0KKyNlbmRpZiAvKiBVU0VfTFNUQVQgKi8KKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKwlpZiAoemZucWZwKHMyLENLTUFYUEFUSCxidWYyKSkgeworCSAgICBkZWJ1ZyhGMTEwLCJ6Y21wZm4gczEiLGJ1ZjEsMCk7CisJICAgIGRlYnVnKEYxMTAsInpjbXBmbiBzMiIsYnVmMiwwKTsKKwkgICAgaWYgKCFzdHJuY21wKGJ1ZjEsYnVmMixDS01BWFBBVEgpKQorCSAgICAgIHJjID0gMTsKKwl9CisgICAgfQorICAgIGRlYnVnKEYxMDEsInpjbXBmbiByZXN1bHQiLCIiLHJjKTsKKyAgICByZXR1cm4ocmMpOworfQorCisjaWZkZWYgQ0tST09UCisKKy8qIFVzZXItbW9kZSBjaHJvb3QoKSBpbXBsZW1lbnRhdGlvbiAqLworCitpbnQKK3pzZXRyb290KHMpIGNoYXIgKiBzOyB7CQkJLyogU2V0cyB0aGUgcm9vdCAqLworICAgIGNoYXIgYnVmW0NLTUFYUEFUSCsxXTsKKyAgICBpZiAoIXMpIHJldHVybigtMSk7CisgICAgaWYgKCEqcykgcmV0dXJuKC0xKTsKKyAgICBkZWJ1ZyhGMTEwLCJ6c2V0cm9vdCIscywwKTsKKyAgICBpZiAoIWlzZGlyKHMpKSByZXR1cm4oLTIpOworICAgIGlmICghemZucWZwKHMsQ0tNQVhQQVRILGJ1ZikpCS8qIEdldCBmdWxsLCByZWFsIHBhdGggKi8KKyAgICAgIHJldHVybigtMyk7CisgICAgaWYgKGFjY2VzcyhidWYsUl9PSykgPCAwKSB7CQkvKiBDaGVjayBhY2Nlc3MgKi8KKwlkZWJ1ZyhGMTEwLCJ6c2V0cm9vdCBhY2Nlc3MgZGVuaWVkIixidWYsMCk7CisJcmV0dXJuKC00KTsKKyAgICB9CisgICAgcyA9IGJ1ZjsKKyAgICBpZiAoY2tyb290c2V0KSB7CQkJLyogSWYgcm9vdCBhbHJlYWR5IHNldCAqLworCWlmICghemlucm9vdChzKSkgewkJLyogbWFrZSBzdXJlIG5ldyByb290IGlzIGluIGl0ICovCisJICAgIGRlYnVnKEYxMTAsInpzZXRyb290IG5ldyByb290IG5vdCBpbiByb290Iixja3Jvb3QsMCk7CisJICAgIHJldHVybigtNSk7CisJfQorICAgIH0KKyAgICBpZiAoemNoZGlyKGJ1ZikgPCAxKSByZXR1cm4oLTQpOwkvKiBDaGFuZ2UgZGlyZWN0b3J5IHRvIG5ldyByb290ICovCisgICAgY2tyb290c2V0ID0gY2tzdHJuY3B5KGNrcm9vdCxidWYsQ0tNQVhQQVRIKTsgLyogTm93IHNldCB0aGUgbmV3IHJvb3QgKi8KKyAgICBpZiAoY2tyb290W2Nrcm9vdHNldC0xXSAhPSAnLycpIHsKKwlja3Jvb3RbY2tyb290c2V0KytdID0gJy8nOworCWNrcm9vdFtja3Jvb3RzZXRdID0gJ1wwJzsKKyAgICB9CisgICAgZGVidWcoRjExMSwienNldHJvb3Qgcm9vdHNldCIsY2tyb290LGNrcm9vdHNldCk7CisgICAgY2tyb290ZXJyID0gMDsJCQkvKiBSZXNldCBlcnJvciBmbGFnICovCisgICAgcmV0dXJuKDEpOworfQorCitjaGFyICoKK3pnZXRyb290KCkgewkJCQkvKiBSZXR1cm5zIHRoZSByb290ICovCisgICAgaWYgKCFja3Jvb3RzZXQpCisgICAgICByZXR1cm4oTlVMTCk7CisgICAgcmV0dXJuKChjaGFyICopY2tyb290KTsKK30KKworaW50Cit6aW5yb290KHMpIGNoYXIgKiBzOyB7CQkJLyogQ2hlY2tzIGlmIGZpbGUgcyBpcyBpbiB0aGUgcm9vdCAqLworICAgIGludCB4LCBuOworICAgIHN0cnVjdCB6Zm5mcCAqIGYgPSBOVUxMOworICAgIGNoYXIgYnVmW0NLTUFYUEFUSCsyXTsKKworICAgIGRlYnVnKEYxMTEsInppbnJvb3Qgc2V0cm9vdCIsY2tyb290LGNrcm9vdHNldCk7CisgICAgY2tyb290ZXJyID0gMDsJCQkvKiBSZXNldCBnbG9iYWwgZXJyb3IgZmxhZyAqLworICAgIGlmICghY2tyb290c2V0KQkJCS8qIFJvb3Qgbm90IHNldCAqLworICAgICAgcmV0dXJuKDEpOwkJCS8qIHNvIGl0J3Mgb2sgLSBubyBuZWVkIHRvIGNoZWNrICovCisgICAgaWYgKCEoZiA9IHpmbnFmcChzLENLTUFYUEFUSCxidWYpKSkJLyogR2V0IGZ1bGwgYW5kIHJlYWwgcGF0aG5hbWUgKi8KKyAgICAgIHJldHVybigwKTsJCQkvKiBGYWlsIGlmIHdlIGNhbid0ICAqLworICAgIG4gPSBmLT5sZW47CQkJCS8qIExlbmd0aCBvZiBmdWxsIHBhdGhuYW1lICovCisgICAgZGVidWcoRjExMSwiemlucm9vdCBuIixidWYsbik7CisgICAgaWYgKG4gPCAoY2tyb290c2V0IC0gMSkgfHwgbiA+IENLTUFYUEFUSCkgewkvKiBCYWQgbGVuZ3RoICovCisJY2tyb290ZXJyID0gMTsJCQkgICAgICAgIC8qIEZhaWwgKi8KKwlyZXR1cm4oMCk7CisgICAgfQorICAgIGlmIChpc2RpcihidWYpICYmIGJ1ZltuLTFdICE9ICcvJykgeyAgLyogSWYgaXQncyBhIGRpcmVjdG9yeSBuYW1lICovCisJYnVmW24rK10gPSAnLyc7CQkJICAvKiBtYWtlIHN1cmUgaXQgZW5kcyB3aXRoICcvJyAqLworCWJ1ZltuXSA9ICdcMCc7CisgICAgfQorICAgIHggPSBzdHJuY21wKGJ1Zixja3Jvb3QsY2tyb290c2V0KTsJLyogQ29tcGFyZSwgY2FzZS1zZW5zaXRpdmUgKi8KKyAgICBkZWJ1ZyhGMTExLCJ6aW5yb290IGNoZWNrZWQiLGJ1Zix4KTsKKyAgICBpZiAoeCA9PSAwKQkJCQkvKiBPSyAqLworICAgICAgcmV0dXJuKDEpOworICAgIGNrcm9vdGVyciA9IDE7CQkJLyogTm90IE9LICovCisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIENLUk9PVCAqLworCisjaWZkZWYgQ0tfTE9HSU4KKy8qCisgIFRoZSBmb2xsb3dpbmcgY29kZSBwcm92aWRlcyBzdXBwb3J0IGZvciB1c2VyIGxvZ2luIGFuZCBsb2dvdXQKKyAgaW5jbHVkaW5nIGFub255bW91cyBhY2NvdW50cy4gIElmIHRoaXMgZmVhdHVyZSBpcyB0byBiZSBzdXBwb3J0ZWQKKyAgb3V0c2lkZSBvZiBVTklYLCBpdCBzaG91bGQgYmUgc3ByZWFkIG91dCBhbW9uZyB0aGUgY2s/ZmlvLmMgbW9kdWxlcy4uLgorKi8KKyNpZm5kZWYgX1BBVEhfQlNIRUxMCisjZGVmaW5lIF9QQVRIX0JTSEVMTCAgICAiL3Vzci9iaW4vYmFzaCIKKyNlbmRpZiAvKiBfUEFUSF9CU0hFTEwgKi8KKyNpZm5kZWYgX1BBVEhfRlRQVVNFUlMKKyNkZWZpbmUgX1BBVEhfRlRQVVNFUlMgICIvZXRjL2Z0cHVzZXJzIgorI2VuZGlmIC8qIF9QQVRIX0ZUUFVTRVJTICovCisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHNnZXRwd25hbSgpLgorICovCitjaGFyICoKK3NnZXRzYXZlKHMpIGNoYXIgKnM7IHsKKyAgICBjaGFyICpuZXcgPSBtYWxsb2MoKHVuc2lnbmVkKSBzdHJsZW4ocykgKyAxKTsKKyAgICBpZiAobmV3ID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRmKCI/TG9jYWwgcmVzb3VyY2UgZmFpbHVyZTogbWFsbG9jXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgLyogTk9UUkVBQ0hFRCAqLworICAgIH0KKyAgICAodm9pZCkgc3RyY3B5KG5ldywgcyk7CQkvKiBzYWZlICovCisgICAgcmV0dXJuIChuZXcpOworfQorCisvKgorICogU2F2ZSB0aGUgcmVzdWx0IG9mIGdldHB3bmFtKCkuICBVc2VkIGZvciBVU0VSIGNvbW1hbmQsIHNpbmNlCisgKiB0aGUgZGF0YSByZXR1cm5lZCBtdXN0IG5vdCBiZSBjbG9iYmVyZWQgYnkgYW55IG90aGVyIGNvbW1hbmQKKyAqIChlLmcuLCBnbG9iYmluZykuCisgKi8KK3N0cnVjdCBwYXNzd2QgKgorc2dldHB3bmFtKG5hbWUpIGNoYXIgKm5hbWU7IHsKKyAgICBzdGF0aWMgc3RydWN0IHBhc3N3ZCBzYXZlOworICAgIHJlZ2lzdGVyIHN0cnVjdCBwYXNzd2QgKnA7CisjaWZkZWYgQ0tfU0hBRE9XCisgICAgcmVnaXN0ZXIgc3RydWN0IHNwd2QgKnNwOworI2VuZGlmIC8qIENLX1NIQURPVyAqLworICAgIGNoYXIgKnNnZXRzYXZlKCk7CisKKyNpZmRlZiBIUFVYMTBfVFJVU1RFRAorICAgIHN0cnVjdCBwcl9wYXNzd2QgKnByOworI2VuZGlmIC8qIEhQVVgxMF9UUlVTVEVEICovCisKKyNpZmRlZiBDS19TSEFET1cKKyAgICBzcCA9IGdldHNwbmFtKG5hbWUpOworICAgIGRlYnVnKEYxMTEsInNnZXRwd25hbSIsImdldHNwbmFtKCkiLHNwKTsKKyAgICBpZiAoc3AgPT0gTlVMTCkKKyAgICAgIHJldHVybiAoTlVMTCk7CisjZW5kaWYgLyogQ0tfU0hBRE9XICovCisKKyNpZmRlZiBIUFVYMTBfVFJVU1RFRAorICAgIGlmICgocHIgPSBnZXRwcnB3bmFtKG5hbWUpKSA9PSBOVUxMKQorICAgICAgcmV0dXJuKE5VTEwpOworI2VuZGlmIC8qIEhQVVgxMF9UUlVTVEVEICovCisKKyAgICBwID0gZ2V0cHduYW0obmFtZSk7CisgICAgZGVidWcoRjExMSwic2dldHB3bmFtIiwiZ2V0cHduYW0oKSIscCk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgIHJldHVybihOVUxMKTsKKyAgICBpZiAoc2F2ZS5wd19uYW1lKSB7CisgICAgICAgIGZyZWUoc2F2ZS5wd19uYW1lKTsKKyAgICAgICAgZnJlZShzYXZlLnB3X3Bhc3N3ZCk7CisgICAgICAgIGZyZWUoc2F2ZS5wd19nZWNvcyk7CisgICAgICAgIGZyZWUoc2F2ZS5wd19kaXIpOworICAgICAgICBmcmVlKHNhdmUucHdfc2hlbGwpOworICAgIH0KKyAgICBzYXZlID0gKnA7CisgICAgc2F2ZS5wd19uYW1lID0gc2dldHNhdmUocC0+cHdfbmFtZSk7CisjaWZkZWYgQ0tfU0hBRE9XCisgICAgc2F2ZS5wd19wYXNzd2QgPSBzZ2V0c2F2ZShzcC0+c3BfcHdkcCk7CisjZWxzZSAvKiBDS19TSEFET1cgKi8KKyNpZmRlZiBIUFVYMTBfVFJVU1RFRAorICAgIGlmIChwci0+dWZsZy5mZ19lbmNyeXB0ICYmIHByLT51ZmxkLmZkX2VuY3J5cHQgJiYgKnByLT51ZmxkLmZkX2VuY3J5cHQpCisgICAgICBzYXZlLnB3X3Bhc3N3ZCA9IHNnZXRzYXZlKHByLT51ZmxkLmZkX2VuY3J5cHQpOworICAgIGVsc2UKKyAgICAgIHNhdmUucHdfcGFzc3dkID0gc2dldHNhdmUoIiIpOworI2Vsc2UgLyogSFBVWDEwX1RSVVNURUQgKi8KKyAgICBzYXZlLnB3X3Bhc3N3ZCA9IHNnZXRzYXZlKHAtPnB3X3Bhc3N3ZCk7CisjZW5kaWYgLyogSFBVWDEwX1RSVVNURUQgKi8KKyNlbmRpZiAvKiBDS19TSEFET1cgKi8KKyAgICBzYXZlLnB3X2dlY29zID0gc2dldHNhdmUocC0+cHdfZ2Vjb3MpOworICAgIHNhdmUucHdfZGlyID0gc2dldHNhdmUocC0+cHdfZGlyKTsKKyAgICBzYXZlLnB3X3NoZWxsID0gc2dldHNhdmUocC0+cHdfc2hlbGwpOworICAgIHJldHVybigmc2F2ZSk7Cit9CisKKyNkZWZpbmUgQ0tYTE9HQlNJWiAyNTYKKworc3RydWN0IHBhc3N3ZCAqIHB3ID0gTlVMTDsKK2NoYXIgKiBob21lID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAvKiBIb21lIGRpcmVjdG9yeSBwb2ludGVyIGZvciBnbG9iICovCisjaWZkZWYgQ01BU0sKKyN1bmRlZiBDTUFTSworI2VuZGlmIC8qIENNQVNLICovCisKKyNkZWZpbmUgQ01BU0sgMDI3CisKK2ludCBkZWZ1bWFzayA9IENNQVNLOyAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IHVtYXNrIHZhbHVlICovCisKKy8qICBaIFYgVSBTIEUgUiAgLS0gIFZlcmlmeSB1c2VyLCBSZXR1cm5zIDEgaWYgdXNlciBPSywgMCBvdGhlcndpc2UuICAqLworCisvKiBTZXRzIGdsb2JhbCBwYXNzd2QgcG9pbnRlciBwdyBpZiBuYW1lZCBhY2NvdW50IGV4aXN0cyBhbmQgaXMgYWNjZXB0YWJsZTsKKyAqIHNldHMgYXNrcGFzc3dkIGlmIGEgUEFTUyBjb21tYW5kIGlzIGV4cGVjdGVkLiAgSWYgbG9nZ2VkIGluIHByZXZpb3VzbHksCisgKiBuZWVkIHRvIHJlc2V0IHN0YXRlLiAgSWYgbmFtZSBpcyAiZnRwIiBvciAiYW5vbnltb3VzIiwgdGhlIG5hbWUgaXMgbm90IGluCisgKiBfUEFUSF9GVFBVU0VSUywgYW5kIGZ0cCBhY2NvdW50IGV4aXN0cywgc2V0IGd1ZXN0IGFuZCBwdywgdGhlbiBqdXN0IHJldHVybi4KKyAqIElmIGFjY291bnQgZG9lc24ndCBleGlzdCwgYXNrIGZvciBwYXNzd2QgYW55d2F5LiAgT3RoZXJ3aXNlLCBjaGVjayB1c2VyCisgKiByZXF1ZXN0aW5nIGxvZ2luIHByaXZpbGVnZXMuICBEaXNhbGxvdyBhbnlvbmUgd2hvIGRvZXMgbm90IGhhdmUgYSBzdGFuZGFyZAorICogc2hlbGwgYXMgcmV0dXJuZWQgYnkgZ2V0dXNlcnNoZWxsKCkuICBEaXNhbGxvdyBhbnlvbmUgbWVudGlvbmVkIGluIHRoZSBmaWxlCisgKiBfUEFUSF9GVFBVU0VSUyB0byBhbGxvdyBwZW9wbGUgc3VjaCBhcyByb290IGFuZCB1dWNwIHRvIGJlIGF2b2lkZWQuCisgKi8KK19QUk9UT1RZUChzdGF0aWMgaW50IGNoZWNrdXNlciwgKGNoYXIgKikgKTsKKworY2hhciB6dnVuYW1lWzY0XSA9IHsgTlVMLCBOVUwgfTsKK2NoYXIgenZob21lW0NLTUFYUEFUSCsxXSA9IHsgTlVMLCBOVUwgfTsKKyNkZWZpbmUgWkVOVlVTRVIgNzAKKyNkZWZpbmUgWkVOVkhPTUUgQ0tNQVhQQVRIKzEyCisjZGVmaW5lIFpFTlZMT0dOQU1FIDc0CitzdGF0aWMgY2hhciB6ZW52dXNlcltaRU5WVVNFUl07CitzdGF0aWMgY2hhciB6ZW52aG9tZVtaRU5WSE9NRV07CitzdGF0aWMgY2hhciB6ZW52bG9nbmFtZVtaRU5WTE9HTkFNRV07CisKKyNpZmRlZiBDS19QQU0KK3N0YXRpYyBjaGFyIHBhbV9kYXRhWzUwMF07CitzdHJ1Y3QgcGFtX2NvbnYgcGFtX2NvbnYgPSB7cGFtX2NiLCBwYW1fZGF0YX07IC8qIFBBTSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBwYW1faGFuZGxlICogcGFtaCA9IE5VTEw7ICAgICAgICAgICAgICAgLyogUEFNIHJlZmVyZW5jZSBoYW5kbGUgKi8KKyNlbmRpZiAvKiBDS19QQU0gKi8KKworaW50Cit6dnVzZXIobmFtZSkgY2hhciAqbmFtZTsgeworICAgIHJlZ2lzdGVyIGNoYXIgKmNwID0gTlVMTDsKKyAgICBpbnQgeDsKKyAgICBjaGFyICpzaGVsbDsKKyNpZmRlZiBHRVRVU0VSU0hFTEwKKyAgICBjaGFyICpnZXR1c2Vyc2hlbGwoKTsKKyNlbmRpZiAvKiBHRVRVU0VSU0hFTEwgKi8KKworI2lmZGVmIENLX1BBTQorICAgIGludCBwYW1fc3RhdHVzOworICAgIGNvbnN0IGNoYXIgKiByZXBseSA9IE5VTEw7CisjZW5kaWYgLyogQ0tfUEFNICovCisKKyAgICBkZWJ1ZyhGMTExLCJ1c2VyIixuYW1lLGxvZ2dlZF9pbik7CisKKyAgICBpZiAoIW5hbWUpIG5hbWUgPSAiIjsKKyAgICB6dnVuYW1lWzBdID0gTlVMOworCisgICAgZGVidWcoRjEwMSwienZ1c2VyIGNreHN5c2xvZyIsIiIsY2t4c3lzbG9nKTsKKworI2lmZGVmIENLU1lTTE9HCisgICAgZGVidWcoRjEwMCwienZ1c2VyIENLU1lTTE9HIGRlZmluZWQiLCIiLDApOworI2VuZGlmIC8qIENLU1lTTE9HICovCisKKyAgICBpZiAobG9nZ2VkX2luKSAgICAgICAgICAgICAgICAgICAgICAvKiBTaG91bGQgbm90IGJlIGNhbGxlZCBpZiBsb2dnZWQgaW4gKi8KKyAgICAgIHJldHVybigwKTsKKworI2lmZGVmIENLU1lTTE9HCisgICAgaWYgKGNreHN5c2xvZyAmJiBja3hsb2dnaW5nKSB7CisgICAgICAgIHN5c2xvZyhMT0dfSU5GTywKKyAgICAgICAgICAgICAgICAibG9naW46IHVzZXIgJXMiLG5hbWUKKyAgICAgICAgICAgICAgICApOworICAgIH0KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworCisgICAgZ3Vlc3QgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIG5vdCBndWVzdCAqLworICAgIGFza3Bhc3N3ZCA9IDA7CisKKyAgICBpZiAoc3RyY21wKG5hbWUsICJmdHAiKSA9PSAwIHx8IHN0cmNtcChuYW1lLCAiYW5vbnltb3VzIikgPT0gMCkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJ6dnVzZXIgYW5vbnltb3VzIGNreGFub24iLCIiLGNreGFub24pOworICAgICAgICBpZiAoIWNreGFub24pIHsgICAgICAgICAgICAgICAgIC8qIEFub255bW91cyBsb2dpbiBub3QgYWxsb3dlZCAqLworI2lmZGVmIENLU1lTTE9HCisgICAgICAgICAgICBpZiAoY2t4c3lzbG9nICYmIGNreGxvZ2dpbmcpIHsKKyAgICAgICAgICAgICAgICBzeXNsb2coTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJsb2dpbjogYW5vbnltb3VzIGxvZ2luIG5vdCBhbGxvd2VkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudGhvc3QgPyBjbGllbnRob3N0IDogIih1bmtub3duIGhvc3QpIgorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoZWNrdXNlcigiZnRwIikgfHwgY2hlY2t1c2VyKCJhbm9ueW1vdXMiKSkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwienZ1c2VyIGFub24gZm9yYmlkZGVuIGJ5IGZ0cHVzZXJzIGZpbGUiLCIiLDApOworI2lmZGVmIENLU1lTTE9HCisgICAgICAgICAgICBpZiAoY2t4c3lzbG9nICYmIGNreGxvZ2dpbmcpIHsKKyAgICAgICAgICAgICAgICBzeXNsb2coTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJsb2dpbjogYW5vbnltb3VzIGxvZ2luIGZvcmJpZGRlbiBieSBmdHB1c2VycyBmaWxlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudGhvc3QgPyBjbGllbnRob3N0IDogIih1bmtub3duIGhvc3QpIgorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgICAgICByZXR1cm4oMCk7CisJfSBlbHNlIGlmICgocHcgPSBzZ2V0cHduYW0oImZ0cCIpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ6dnVzZXIgYW5vbiBzZ2V0cHduYW0oZnRwKSBPSyIsIiIsMCk7CisgICAgICAgICAgICBndWVzdCA9IDE7CisgICAgICAgICAgICBhc2twYXNzd2QgPSAxOworICAgICAgICAgICAgY2tzdHJuY3B5KHp2dW5hbWUsImFub255bW91cyIsNjQpOworICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWcoRjEwMCwienZ1c2VyIGFub24gc2dldHB3bmFtKGZ0cCkgRkFJTEVEIiwiIiwwKTsKKyNpZmRlZiBDS1NZU0xPRworICAgICAgICAgICAgaWYgKGNreHN5c2xvZyAmJiBja3hsb2dnaW5nKSB7CisgICAgICAgICAgICAgICAgc3lzbG9nKExPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAibG9naW46IGFub255bW91cyBnZXRwd25hbShmdHApIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRob3N0ID8gY2xpZW50aG9zdCA6ICIodW5rbm93biBob3N0KSIKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgfQorICAgIHB3ID0gc2dldHB3bmFtKG5hbWUpOworICAgIGlmIChwdykgeworLyoKKyAgT2YgY291cnNlIHNvbWUgVU5JWCBwbGF0Zm9ybXMgKGxpa2UgQUlYKSBkb24ndCBoYXZlIGdldHVzZXJzaGVsbCgpLgorICBJbiB0aGF0IGNhc2Ugd2UgY2FuJ3QgY2hlY2sgaWYgdGhlIHVzZXIncyBhY2NvdW50IGhhcyBiZWVuICJ0dXJuZWQgb2ZmIgorICBvciBzb21lc3VjaCwgZS5nLiBieSBzZXR0aW5nIHRoZWlyIHNoZWxsIHRvICIvZXRjL25vbG9naW4iIG9yIHNvbWVzdWNoLAorICB3aGljaCBydW5zICh1c3VhbGx5IGp1c3QgcHJpbnRpbmcgYSBtZXNzYWdlIGFuZCBleGl0aW5nKSwgYnV0IHdoaWNoIGlzCisgIG5vdCBsaXN0ZWQgaW4gL2V0Yy9zaGVsbHMuICBGb3IgdGhhdCBtYXR0ZXIsIGlmIGdldHVzZXJzaGVsbCgpIGlzIG5vdAorICBhdmFpbGFibGUsIHRoZW4gcHJvYmFibHkgbmVpdGhlciBpcyAvZXRjL3NoZWxscy4KKyovCisgICAgICAgIGRlYnVnKEYxMDAsInp2dXNlciBzZ2V0cHduYW0gb2siLCIiLDApOworICAgICAgICBzaGVsbCA9IHB3LT5wd19zaGVsbDsKKyAgICAgICAgaWYgKCFzaGVsbCkgc2hlbGwgPSAiIjsKKyAgICAgICAgaWYgKCEqc2hlbGwpCisgICAgICAgICAgc2hlbGwgPSBfUEFUSF9CU0hFTEw7CisgICAgICAgIGRlYnVnKEYxMTAsInp2dXNlciBzaGVsbCIsc2hlbGwsMCk7CisjaWZkZWYgR0VUVVNFUlNIRUxMCisgICAgICAgIHdoaWxlICgoY3AgPSBnZXR1c2Vyc2hlbGwoKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgZGVidWcoRjExMCwienZ1c2VyIGdldHVzZXJzaGVsbCIsY3AsMCk7CisgICAgICAgICAgICBpZiAoc3RyY21wKGNwLCBzaGVsbCkgPT0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjEwMCwienZ1c2VyIGVuZHVzZXJzaGVsbCAxIiwiIiwwKTsKKyAgICAgICAgZW5kdXNlcnNoZWxsKCk7CisgICAgICAgIGRlYnVnKEYxMDAsInp2dXNlciBlbmR1c2Vyc2hlbGwgMiIsIiIsMCk7CisjZWxzZSAvKiBHRVRVU0VSU0hFTEwgKi8KKyAgICAgICAgY3AgPSAiIjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBEbyBub3QgcmVmdXNlIGlmIHdlIGNhbm5vdCBjaGVjayAqLworI2VuZGlmIC8qIEdFVFVTRVJTSEVMTCAqLworICAgICAgICB4ID0gY2hlY2t1c2VyKG5hbWUpOworICAgICAgICBkZWJ1ZyhGMTAxLCJ6dnVzZXIgY2hlY2t1c2VyIiwiIix4KTsKKyAgICAgICAgaWYgKGNwID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsInp2dXNlciByZWZ1c2VkIDEiLCIiLDApOworICAgICAgICAgICAgcHcgPSAoc3RydWN0IHBhc3N3ZCAqKSBOVUxMOworI2lmZGVmIENLU1lTTE9HCisgICAgICAgICAgICBpZiAoY2t4c3lzbG9nICYmIGNreGxvZ2dpbmcpIHsKKyAgICAgICAgICAgICAgICBzeXNsb2coTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJsb2dpbjogaW52YWxpZCBzaGVsbCAlcyBmb3IgJXMgJXMiLHNoZWxsLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRob3N0ID8gY2xpZW50aG9zdCA6ICIodW5rbm93biBob3N0KSIKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9IGVsc2UgaWYgKHgpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsInp2dXNlciByZWZ1c2VkIDIiLCIiLDApOworICAgICAgICAgICAgcHcgPSAoc3RydWN0IHBhc3N3ZCAqKSBOVUxMOworI2lmZGVmIENLU1lTTE9HCisgICAgICAgICAgICBpZiAoY2t4c3lzbG9nICYmIGNreGxvZ2dpbmcpIHsKKyAgICAgICAgICAgICAgICBzeXNsb2coTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICJsb2dpbjogJXMgbG9naW4gZm9yYmlkZGVuIGJ5IGZ0cHVzZXJzIGZpbGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgY2xpZW50aG9zdCA/IGNsaWVudGhvc3QgOiAiKHVua25vd24gaG9zdCkiCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHggPSAwOworI2lmZGVmIENLX1BBTQorICAgICAgICAgICAgLyogR2V0IFBBTSBhdXRoZW50aWNhdGlvbiBkZXRhaWxzICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ6dnVzZXIiLCJjYWxsaW5nIHBhbV9zdGFydCIsMCk7CisgICAgICAgICAgICBpZiAoKHBhbV9zdGF0dXMgPQorICAgICAgICAgICAgICAgICBwYW1fc3RhcnQoUEFNX1NFUlZJQ0VfVFlQRSxuYW1lLCZwYW1fY29udiwmcGFtaCkpCisgICAgICAgICAgICAgICAgIT0gUEFNX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICByZXBseSA9IHBhbV9zdHJlcnJvcihOVUxMLCBwYW1fc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ6dnVzZXIgUEFNIGZhaWx1cmUiLHJlcGx5LDApOworICAgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIscmVwbHkpOworI2lmZGVmIENLU1lTTE9HCisgICAgICAgICAgICAgICAgaWYgKGNreHN5c2xvZyAmJiBja3hsb2dnaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHN5c2xvZyhMT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2dpbjogJXMgcmVmdXNlZCBieSBQQU0gXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50aG9zdCA/IGNsaWVudGhvc3QgOiAiKHVua25vd24gaG9zdCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19QQU0gKi8KKyAgICAgICAgICAgIGFza3Bhc3N3ZCA9IDE7CisgICAgICAgICAgICBja3N0cm5jcHkoenZ1bmFtZSxuYW1lLDY0KTsKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHggPSAwOworICAgICAgICBkZWJ1ZyhGMTAwLCJ6dnVzZXIgc2dldHB3bmFtIE5VTEwiLCIiLDApOworI2lmZGVmIENLU1lTTE9HCisgICAgICAgIGlmIChja3hzeXNsb2cgJiYgY2t4bG9nZ2luZykgeworICAgICAgICAgICAgc3lzbG9nKExPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICJsb2dpbjogZ2V0cHduYW0oJXMpIGZhaWxlZDogJXMiLG5hbWUsCisgICAgICAgICAgICAgICAgICAgY2xpZW50aG9zdCA/IGNsaWVudGhvc3QgOiAiKHVua25vd24gaG9zdCkiCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyNpZmRlZiBGVFBfS0VSQkVST1MKKyAgICBpZiAoYXV0aF90eXBlICYmIHN0cmNtcChhdXRoX3R5cGUsICJLRVJCRVJPU19WNCIpID09IDApIHsKKyNpZmRlZiBDT01NRU5UCisJLyogV2h5IHNwcmludGYgYW5kIHRoZW4gcHJpbnRmPyAqLworCS8qIEFsc28sIHdoYXQgaXMga2VyYl9vaz8gIEFuZCBpcyB0aGUgdGVzdCBvbiBpdCByaWdodD8gKi8KKyAgICAgICAgY2hhciBidWZbQ0tYTE9HQlNJWl07CisgICAgICAgIHNwcmludGYoYnVmLCAiS2VyYmVyb3MgdXNlciAlcyVzJXNAJXMgaXMlcyBhdXRob3JpemVkIGFzICVzJXMiLAorICAgICAgICAgICAgICAgICBrZGF0YS5wbmFtZSwgKmtkYXRhLnBpbnN0ID8gIi4iIDogIiIsCisgICAgICAgICAgICAgICAgIGtkYXRhLnBpbnN0LCBrZGF0YS5wcmVhbG0sCisgICAgICAgICAgICAgICAgIChrZXJiX29rID0ga3VzZXJvaygma2RhdGEsbmFtZSkgPT0gMCkgPyAiIiA6ICIgbm90IiwKKyAgICAgICAgICAgICAgICAgbmFtZSwga2VyYl9vayA/ICIiIDogIjsgUGFzc3dvcmQgcmVxdWlyZWQuIik7CisgICAgICAgIHByaW50ZigiJXMiLCBidWYpOworI2Vsc2UKKyAgICAgICAgcHJpbnRmKCJLZXJiZXJvcyB1c2VyICVzJXMlc0AlcyBpcyVzIGF1dGhvcml6ZWQgYXMgJXMlcyIsCisgICAgICAgICAgICAgICAgIGtkYXRhLnBuYW1lLCAqa2RhdGEucGluc3QgPyAiLiIgOiAiIiwKKyAgICAgICAgICAgICAgICAga2RhdGEucGluc3QsIGtkYXRhLnByZWFsbSwKKyAgICAgICAgICAgICAgICAgKGtlcmJfb2sgPSBrdXNlcm9rKCZrZGF0YSxuYW1lKSA9PSAwKSA/ICIiIDogIiBub3QiLAorICAgICAgICAgICAgICAgICBuYW1lLCBrZXJiX29rID8gIiIgOiAiOyBQYXNzd29yZCByZXF1aXJlZC4iKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIGlmIChrZXJiX29rKSByZXR1cm4oMSk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogRlRQX0tFUkJFUk9TICovCit9CisKKy8qIENoZWNrIGlmIHRoZSBnaXZlbiB1c2VyIGlzIGluIHRoZSBmb3JiaWRkZW4tdXNlciBmaWxlICovCisKK3N0YXRpYyBpbnQKK2NoZWNrdXNlcihuYW1lKSBjaGFyICpuYW1lOyB7CisgICAgZXh0ZXJuIGNoYXIgKiB1c2VyZmlsZTsKKyAgICBGSUxFICpmZDsKKyAgICBpbnQgaTsKKyAgICBjaGFyIGxpbmVbQ0tYTE9HQlNJWisxXTsKKworICAgIGlmICghbmFtZSkKKyAgICAgIG5hbWUgPSAiIjsKKyAgICBpID0gc3RybGVuKG5hbWUpOworICAgIGRlYnVnKEYxMTEsImNoZWNrdXNlciBuYW1lIixuYW1lLGkpOworICAgIGlmICghKm5hbWUpCisgICAgICByZXR1cm4oMSk7CisKKyAgICBmZCA9IGZvcGVuKHVzZXJmaWxlID8gdXNlcmZpbGUgOiBfUEFUSF9GVFBVU0VSUywgInIiKTsKKyAgICBkZWJ1ZyhGMTExLCJjaGVja3VzZXIgdXNlcmZpbGUiLHVzZXJmaWxlLGZkKTsKKyAgICBpZiAoZmQpIHsKKyAgICAgICAgbGluZVswXSA9ICdcMCc7CisgICAgICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZkKSkgeworICAgICAgICAgICAgZGVidWcoRjExMCwiY2hlY2t1c2VyIGxpbmUiLGxpbmUsMCk7CisgICAgICAgICAgICBpZiAobGluZVswXSA8PSAnIycpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHN0cm5jbXAobGluZSwgbmFtZSwgaSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNoZWNrdXNlciBSRUZVU0VEIixuYW1lLDApOworICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmVbMF0gPSAnXDAnOworICAgICAgICB9CisgICAgICAgIChWT0lEKSBmY2xvc2UoZmQpOworICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJjaGVja3VzZXIgT0siLG5hbWUsMCk7CisgICAgcmV0dXJuKDApOworfQorCisvKiAgWiBWIEwgTyBHIE8gVSBUICAtLSAgTG9nIG91dCBmcm9tIEludGVybmV0IEtlcm1pdCBTZXJ2aWNlICAqLworCitWT0lECit6dmxvZ291dCgpIHsKKyNpZmRlZiBDT01NRU5UCisgICAgLyogVGhpcyBjb3VsZCBiZSBkYW5nZXJvdXMgKi8KKyAgICBpZiAoc2V0dWlkKChVSURfVCkwKSA8IDApIHsKKyAgICAgICAgZGVidWcoRjEwMCwienZsb2dvdXQgc2V0dWlkIEZBSUxFRCIsIiIsMCk7CisgICAgICAgIGdvdG8gYmFkOworICAgIH0KKyAgICBkZWJ1ZyhGMTAwLCJ6dmxvZ291dCBzZXR1aWQgT0siLCIiLDApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBDS1NZU0xPRworICAgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfTEkgJiYgY2t4bG9nZ2luZykgeworICAgICAgICBja3N5c2xvZyhTWVNMR19MSSwgMSwgImxvZ291dCIsKGNoYXIgKikgdWlkYnVmLCBjbGllbnRob3N0KTsKKyAgICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyNpZmRlZiBDS1dUTVAKKyAgICBkZWJ1ZyhGMTEwLCJXVE1QIGxvZ291dCIsY2tzeXNsaW5lLGxvZ2dlZF9pbik7CisgICAgaWYgKGxvZ2dlZF9pbikKKyAgICAgIGxvZ3d0bXAoY2tzeXNsaW5lLCAiIiwgIiIpOworI2VuZGlmIC8qIENLV1RNUCAqLworICAgIHB3ID0gTlVMTDsKKyAgICBsb2dnZWRfaW4gPSAwOworICAgIGd1ZXN0ID0gMDsKKyAgICBpc2d1ZXN0ID0gMDsKK30KKworI2lmZGVmIEZUUF9LRVJCRVJPUwora3Bhc3MobmFtZSwgcCkgY2hhciAqbmFtZSwgKnA7IHsKKyAgICBjaGFyIGluc3RhbmNlW0lOU1RfU1pdOworICAgIGNoYXIgcmVhbG1bUkVBTE1fU1pdOworICAgIGNoYXIgdGt0X2ZpbGVbMjBdOworICAgIEtURVhUX1NUIHRpY2tldDsKKyAgICBBVVRIX0RBVCBhdXRoZGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGZhZGRyOworICAgIHN0cnVjdCBob3N0ZW50ICpocDsKKworICAgIGlmIChrcmJfZ2V0X2xyZWFsbShyZWFsbSwgMSkgIT0gS1NVQ0NFU1MpCisgICAgICByZXR1cm4oMCk7CisKKyAgICBja3N0cm5jcHkodGt0X2ZpbGUsIFRLVF9ST09ULCAyMCk7CisgICAgY2tzdHJuY2F0KHRrdF9maWxlLCAiX2Z0cGRYWFhYWFgiLCAyMCk7CisgICAga3JiX3NldF90a3Rfc3RyaW5nKG1rdGVtcCh0a3RfZmlsZSkpOworCisgICAgKFZPSUQpIGNrc3RybmNweShpbnN0YW5jZSwga3JiX2dldF9waG9zdChob3N0bmFtZSksIHNpemVvZihpbnN0YW5jZSkpOworCisgICAgaWYgKChocCA9IGdldGhvc3RieW5hbWUoaW5zdGFuY2UpKSA9PSBOVUxMKQorICAgICAgcmV0dXJuKDApOworCisjaWZkZWYgSEFERFJMSVNUCisgICAgaHAgPSBja19jb3B5aG9zdGVudChocCk7CQkvKiBzYWZlIGNvcHkgdGhhdCB3b24ndCBjaGFuZ2UgKi8KKyNlbmRpZiAvKiBIQUREUkxJU1QgKi8KKyAgICBiY29weSgoY2hhciAqKWhwLT5oX2FkZHIsIChjaGFyICopICZmYWRkciwgc2l6ZW9mKGZhZGRyKSk7CisKKyAgICBpZiAoa3JiX2dldF9wd19pbl90a3QobmFtZSwgIiIsIHJlYWxtLCAia3JidGd0IiwgcmVhbG0sIDEsIHApIHx8CisgICAgICAgIGtyYl9ta19yZXEoJnRpY2tldCwgInJjbWQiLCBpbnN0YW5jZSwgcmVhbG0sIDMzKSB8fAorICAgICAgICBrcmJfcmRfcmVxKCZ0aWNrZXQsICJyY21kIiwgaW5zdGFuY2UsIGZhZGRyLCAmYXV0aGRhdGEsICIiKSB8fAorICAgICAgICBrdXNlcm9rKCZhdXRoZGF0YSwgbmFtZSkpIHsKKyAgICAgICAgZGVzdF90a3QoKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBkZXN0X3RrdCgpOworICAgIHJldHVybigxKTsKK30KKyNlbmRpZiAvKiBGVFBfS0VSQkVST1MgKi8KKworVk9JRAorenN5c2xvZygpIHsKKyNpZmRlZiBDS1NZU0xPRworICAgIGlmIChja3hzeXNsb2cgJiYgIWNreGxvZ2dpbmcpIHsKKyNpZmRlZiBMT0dfREFFTU9OCisgICAgICAgIG9wZW5sb2coaW5zZXJ2ZXIgPyAiaWtzZCIgOiAiY2tlcm1pdCIsIExPR19QSUQsIExPR19EQUVNT04pOworI2Vsc2UKKyAgICAgICAgb3BlbmxvZyhpbnNlcnZlciA/ICJpa3NkIiA6ICJja2VybWl0IiwgTE9HX1BJRCk7CisjZW5kaWYgLyogTE9HX0RBRU1PTiAqLworICAgICAgICBja3hsb2dnaW5nID0gMTsKKyAgICAgICAgZGVidWcoRjEwMCwienN5c2xvZyBzeXNsb2cgb3BlbmVkIiwiIiwwKTsKKyAgICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KK30KKworLyogIFogViBQIEEgUyBTICAtLSAgVmVyaWZ5IHBhc3N3b3JkOyByZXR1cm5zIDEgaWYgT0ssIDAgb3RoZXJ3aXNlICAqLworCisjaWZuZGVmIEFVVEhfVVNFUgorI2RlZmluZSBBVVRIX1VTRVIgMworI2VuZGlmIC8qIEFVVEhfVVNFUiAqLworI2lmbmRlZiBBVVRIX1ZBTElECisjZGVmaW5lIEFVVEhfVkFMSUQgNAorI2VuZGlmIC8qIEFVVEhfVkFMSUQgKi8KKworaW50Cit6dnBhc3MocCkgY2hhciAqcDsgeworICAgIGNoYXIgKnhwYXNzd2QsICpzYWx0OworICAgIGNoYXIgKiBkaXIgPSBOVUxMOworI2lmZGVmIENLX1BBTQorICAgIGludCBwYW1fc3RhdHVzOworICAgIGNvbnN0IGNoYXIgKiByZXBseSA9IE5VTEw7CisjZW5kaWYgLyogQ0tfUEFNICovCisKKyAgICBpZiAobG9nZ2VkX2luIHx8IGFza3Bhc3N3ZCA9PSAwKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgZGVidWcoRjExMSwienZwYXNzIixwID8gKGd1ZXN0ID8gcCA6ICJ4eHh4eHgiKSA6ICIobnVsbCkiLGd1ZXN0KTsKKyAgICBpZiAoIXApIHAgPSAiIjsKKyAgICBhc2twYXNzd2QgPSAwOworICAgIGlmIChndWVzdCAmJiAhKnApIHsgICAgICAgICAgICAgICAgIC8qIEd1ZXN0cyBtdXN0IHNwZWNpZnkgYSBwYXNzd29yZCAqLworI2lmZGVmIENLU1lTTE9HCisgICAgICAgIGlmIChja3hzeXNsb2cgJiYgY2t4bG9nZ2luZykgeworICAgICAgICAgICAgc3lzbG9nKExPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICJsb2dpbjogYW5vbnltb3VzIGd1ZXN0cyBtdXN0IHNwZWNpZnkgYSBwYXNzd29yZCIKKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBpZiAoIWd1ZXN0CisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICAgICAgJiYgY2tfdG5fYXV0aF92YWxpZCgpICE9IEFVVEhfVkFMSUQKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworICAgICAgICApIHsgICAgICAgICAgICAgICAgICAgICAvKiAiZnRwIiBpcyBvbmx5IGFjY291bnQgYWxsb3dlZCBubyBwYXNzd29yZCAqLworI2lmZGVmIENLX1BBTQorICAgICAgICBkZWJ1ZyhGMTEwLCJ6dnBhc3MiLCJjYWxsaW5nIHBhbV9zZXRfaXRlbShBVVRIVE9LKSIsMCk7CisgICAgICAgIGlmICgocGFtX3N0YXR1cyA9IHBhbV9zZXRfaXRlbShwYW1oLFBBTV9BVVRIVE9LLHApKSAhPSBQQU1fU1VDQ0VTUykgeworICAgICAgICAgICAgcmVwbHkgPSBwYW1fc3RyZXJyb3IocGFtaCwgcGFtX3N0YXR1cyk7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ6dnBhc3MgUEFNIGZhaWx1cmUiLHJlcGx5LDApOworICAgICAgICAgICAgLyogaWYgbm8gcGFzc3dvcmQgZ2l2ZW4gdHJlYXQgYXMgbm9uLWZhdGFsIGVycm9yICovCisgICAgICAgICAgICAvKiBwYW0gd2lsbCBwcm9tcHQgZm9yIHBhc3N3b3JkIGluIHBhbV9hdXRoZW50aWNhdGUoKSAqLworICAgICAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlc1xuIixyZXBseSk7CisgICAgICAgICAgICAgICAgcGFtX2VuZChwYW1oLCAwKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ6dnBhc3MgZGVuaWVkIiwiIiwwKTsKKyAgICAgICAgICAgICAgICBwdyA9IE5VTEw7CisgICAgICAgICAgICAgICAgenZ1bmFtZVswXSA9IE5VTDsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjExMCwienZwYXNzIiwiY2FsbGluZyBwYW1fYXV0aGVudGljYXRlIiwwKTsKKyAgICAgICAgaWYgKCpwKQorCSAgcGFtX3B3ID0gcDsKKyAgICAgICAgaWYgKChwYW1fc3RhdHVzID0gcGFtX2F1dGhlbnRpY2F0ZShwYW1oLCAwKSkgIT0gUEFNX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJlcGx5ID0gcGFtX3N0cmVycm9yKHBhbWgsIHBhbV9zdGF0dXMpOworICAgICAgICAgICAgZGVidWcoRjExMCwienZwYXNzIFBBTSBmYWlsdXJlIixyZXBseSwwKTsKKyAgICAgICAgICAgIHByaW50ZigiJXNcbiIscmVwbHkpOworICAgICAgICAgICAgcGFtX2VuZChwYW1oLCAwKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsInp2cGFzcyBkZW5pZWQiLCIiLDApOworICAgICAgICAgICAgcGFtX3B3ID0gTlVMTDsKKyAgICAgICAgICAgIHB3ID0gTlVMTDsKKyAgICAgICAgICAgIHp2dW5hbWVbMF0gPSBOVUw7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgcGFtX3B3ID0gTlVMTDsKKyAgICAgICAgZGVidWcoRjExMCwienZwYXNzIiwiY2FsbGluZyBwYW1fYWNjdF9tZ210IiwwKTsKKyAgICAgICAgaWYgKChwYW1fc3RhdHVzID0gcGFtX2FjY3RfbWdtdChwYW1oLCAwKSkgIT0gUEFNX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJlcGx5ID0gcGFtX3N0cmVycm9yKHBhbWgsIHBhbV9zdGF0dXMpOworICAgICAgICAgICAgZGVidWcoRjExMCwienZwYXNzIFBBTSBmYWlsdXJlIixyZXBseSwwKTsKKyAgICAgICAgICAgIHByaW50ZigiJXNcbiIscmVwbHkpOworICAgICAgICAgICAgcGFtX2VuZChwYW1oLCAwKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsInp2cGFzcyBkZW5pZWQiLCIiLDApOworICAgICAgICAgICAgcHcgPSBOVUxMOworICAgICAgICAgICAgenZ1bmFtZVswXSA9IE5VTDsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTEwLCJ6dnBhc3MiLCJQQU0gdmFsaWRhdGVzIE9LIiwwKTsKKyAgICAgICAgcGFtX2VuZChwYW1oLDApOworI2Vsc2UgLyogQ0tfUEFNICovCisgICAgICAgIGlmIChwdyA9PSBOVUxMKQorICAgICAgICAgIHNhbHQgPSAieHgiOworICAgICAgICBlbHNlCisgICAgICAgICAgc2FsdCA9IHB3LT5wd19wYXNzd2Q7CisKKyNpZmRlZiBIUFVYMTBfVFJVU1RFRAorICAgICAgICB4cGFzc3dkID0gYmlnY3J5cHQocCwgc2FsdCk7CisjZWxzZQorLyoKKyAgT24gNjQtYml0IHBsYXRmb3JtcyB0aGlzIGNhbiBnaXZlICJjYXN0IHRvIHBvaW50ZXIgZnJvbSBpbnRlZ2VyIG9mCisgIGRpZmZlcmVudCBzaXplIiB3YXJuaW5nLCBidXQgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGVmZmVjdCBpcyBhdCBydW50aW1lLAorICBvciB3aGF0IHRvIGRvIGFib3V0IGl0LgorICovCisgICAgICAgIHhwYXNzd2QgPSAoY2hhciAqKWNyeXB0KHAsIHNhbHQpOworI2VuZGlmIC8qIEhQVVgxMF9UUlVTVEVEICovCisKKyAgICAgICAgaWYgKAorI2lmZGVmIEZUUF9LRVJCRVJPUworICAgICAgICAgICAgLyogbnVsbCBwd19wYXNzd2Qgb2sgaWYgS2VyYmVyb3MgcGFzc3dvcmQgb2sgKi8KKyAgICAgICAgICAgIHB3ID09IE5VTEwgfHwKKyAgICAgICAgICAgICgoKnB3LT5wd19wYXNzd2QgIT0gJ1wwJyB8fAorICAgICAgICAgICAgICBzdHJjbXAoeHBhc3N3ZCwgcHctPnB3X3Bhc3N3ZCkpCisgICAgICAgICAgICAgJiYgIWtwYXNzKHB3LT5wd19uYW1lLCBwKSkKKyNlbHNlCisjaWZkZWYgQ0tfU1JQCisgICAgICAgICAgICAvKiBjaGVjayB3aXRoIHRwYXNzd2QgZmlyc3QgaWYgdGhlcmUgKi8KKyAgICAgICAgICAgIHB3ID09IE5VTEwgfHwgKnB3LT5wd19wYXNzd2QgPT0gJ1wwJyB8fAorICAgICAgICAgICAgdF92ZXJpZnlwdyAocHctPnB3X25hbWUsIHApID09IDAgfHwKKyAgICAgICAgICAgICh0X3ZlcmlmeXB3IChwdy0+cHdfbmFtZSwgcCkgPCAwICYmCisgICAgICAgICAgICBzdHJjbXAgKHhwYXNzd2QsIHB3LT5wd19wYXNzd2QpKQorI2Vsc2UgLyogQ0tfU1JQICovCisgICAgICAgICAgICAvKiBUaGUgc3RyY21wIGRvZXMgbm90IGNhdGNoIG51bGwgcGFzc3dvcmRzISAqLworICAgICAgICAgICAgKHB3ID09IE5VTEwpIHx8ICgqcHctPnB3X3Bhc3N3ZCA9PSAnXDAnKSB8fAorICAgICAgICAgICAgc3RyY21wKHhwYXNzd2QsIHB3LT5wd19wYXNzd2QpCisjZW5kaWYgLyogQ0tfU1JQICovCisjZW5kaWYgLyogRlRQX0tFUkJFUk9TICovCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsInp2cGFzcyBkZW5pZWQiLCIiLDApOworICAgICAgICAgICAgcHcgPSBOVUxMOworICAgICAgICAgICAgenZ1bmFtZVswXSA9IE5VTDsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX1BBTSAqLworICAgIH0KKworICAgIChWT0lEKSBzZXRnaWQoKEdJRF9UKXB3LT5wd19naWQpOyAgIC8qIFNldCBncm91cCBJRCAqLworCisjaWZuZGVmIE5PSU5JVEdST1VQUworICAgIChWT0lEKSBpbml0Z3JvdXBzKHB3LT5wd19uYW1lLCBwdy0+cHdfZ2lkKTsKKyNlbmRpZiAvKiBOT0lOSVRHUk9VUFMgKi8KKworICAgIGxvZ2dlZF9pbiA9IDE7CisgICAgZGlyID0gcHctPnB3X2RpcjsKKworI2lmZGVmIENLV1RNUAorICAgIC8qIE9wZW4gd3RtcCBiZWZvcmUgY2hyb290ICovCisgICAgaWYgKGNreHd0bXApIHsKKyAgICAgICAgc3ByaW50Zihja3N5c2xpbmUsImlrc18lMDR4IiwgZ2V0cGlkKCkpOyAvKiBzYWZlICovCisgICAgICAgIGxvZ3d0bXAoY2tzeXNsaW5lLCBwdy0+cHdfbmFtZSwKKyAgICAgICAgICAgICAgICAgY2xpZW50aG9zdCA/IGNsaWVudGhvc3QgOiAiKHVua25vd24gaG9zdCkiCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgZGVidWcoRjExMCwiV1RNUCBsb2dpbiIsY2tzeXNsaW5lLGxvZ2dlZF9pbik7CisgICAgfQorI2VuZGlmIC8qIENLV1RNUCAqLworLyoKKyAgRm9yIGFub255bW91cyB1c2Vycywgd2UgY2hyb290IHRvIHVzZXIgZnRwJ3MgaG9tZSBkaXJlY3RvcnkgdW5sZXNzCisgIHN0YXJ0ZWQgd2l0aCAtLWFub25yb290Onh4eCwgaW4gd2hpY2ggY2FzZSB3ZSBjaHJvb3QgdG8geHh4LiAgV2UgbXVzdAorICBpbW1lZGlhdGVseSBjaGRpcigpIHRvIHRoZSBzYW1lIGRpcmVjdG9yeSB3ZSBjaHJvb3QoKSB0byBvciBlbHNlIHRoZQorICBvbGQgY3VycmVudCBkaXJlY3RvcnkgcmVtYWlucyBhY2Nlc3NpYmxlIGFzICIuIiBvdXRzaWRlIHRoZSBuZXcgcm9vdC4KKyovCisgICAgaWYgKGd1ZXN0KSB7CisgICAgICAgIGlmIChhbm9ucm9vdCkgICAgICAgICAgICAgICAgICAgLyogTm9uLWRlZmF1bHQgYW5vbnltb3VzIHJvb3QgKi8KKyAgICAgICAgICBkaXIgPSBhbm9ucm9vdDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1ha2VzdHIoJmFub25yb290LGRpcik7CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgZGVidWcoRjExMCwienZwYXNzIGFub24gY2hyb290IixkaXIsMCk7CisgICAgICAgIGlmIChjaHJvb3QoZGlyKSA8IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsInp2cGFzcyBhbm9uIGNocm9vdCBGQUlMRUQiLGRpcixlcnJubyk7CisgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGlmIChjaGRpcigiLyIpIDwgMCkgeworICAgICAgICAgICAgZGVidWcoRjExMSwienZwYXNzIGFub24gY2hkaXIgRkFJTEVEIixkaXIsZXJybm8pOworICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjExMCwienZwYXNzIGFub24gY2hyb290L2NoZGlyIE9LIixkaXIsMCk7CisgICAgfSBlbHNlIGlmIChjaGRpcihkaXIpIDwgMCkgeyAgICAgICAgLyogTm90IGd1ZXN0ICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICBpZiAoY2hkaXIoIi8iKSA8IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsIk5vbi1ndWVzdCBjaGRpciBGQUlMRUQiLGRpciwwKTsKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBwcmludGYoIj9ObyBkaXJlY3RvcnkhIExvZ2dpbmcgaW4gd2l0aCBob21lPS9cbiIpOworI2Vsc2UKKyAgICAgICAgZGVidWcoRjExMCwienZwYXNzIG5vbi1ndWVzdCBjaGRpciBGQUlMRUQiLGRpciwwKTsKKyAgICAgICAgZ290byBiYWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBCZSBjb25zZXJ2YXRpdmUgYXQgZmlyc3QgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfQorICAgIGRlYnVnKEYxMTAsInp2cGFzcyBub24tZ3Vlc3QgY2hkaXIgT0siLGRpciwwKTsKKyAgICBpZiAoc2V0dWlkKChVSURfVClwdy0+cHdfdWlkKSA8IDApIHsKKyAgICAgICAgZGVidWcoRjEwMSwienZwYXNzIHNldHVpZCBGQUlMRUQiLCIiLHB3LT5wd191aWQpOworICAgICAgICBnb3RvIGJhZDsKKyAgICB9CisgICAgZGVidWcoRjEwMSwienZwYXNzIHNldHVpZCBPSyIsIiIscHctPnB3X3VpZCk7CisKKyAgICBndWVzdHBhc3NbMF0gPSAnXDAnOworICAgIGlmIChndWVzdCkgeworICAgICAgICBleHRlcm4gaW50IGZuY2FjdDsKKyAgICAgICAgaXNndWVzdCA9IDE7CisgICAgICAgIGZuY2FjdCA9IFhZRlhfUjsgICAgICAgICAgICAgICAgLyogRklMRSBDT0xMSVNJT04gPSBSRU5BTUUgKi8KKyAgICAgICAgZGVidWcoRjExMCwiR1VFU1QgZm5jYWN0PVIiLHAsMCk7CisgICAgICAgIGxzZXQoZ3Vlc3RwYXNzLCJhbm9ueW1vdXM6IiwxMCwzMik7CisgICAgICAgIGNrc3RybmNweSgmZ3Vlc3RwYXNzWzEwXSxwLEdVRVNUUEFTUy0xMCk7CisgICAgICAgIGhvbWUgPSAiLyI7CisgICAgICAgIHByaW50ZigiQW5vbnltb3VzIGxvZ2luLlxyXG4iKTsKKworI2lmZGVmIFNFVFBST0NUSVRMRQorCS8qIHByb2N0aXRsZSBkZWNsYXJlZCB3aGVyZT8gIE9idmlvdXNseSB0aGlzIGNvZGUgaXMgbmV2ZXIgY29tcGlsZWQuICovCisgICAgICAgIHNwcmludGYocHJvY3RpdGxlLCAiJXM6IGFub255bW91cy8lLipzIiwKKyAgICAgICAgICAgICAgICBjbGllbnRob3N0ID8gY2xpZW50aG9zdCA6ICIodW5rKSIsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHByb2N0aXRsZSkgLSBzaXplb2YoY2xpZW50aG9zdCkgLQorICAgICAgICAgICAgICAgIHNpemVvZigiOiBhbm9ueW1vdXMvIiksIHApOworICAgICAgICBzZXRwcm9jdGl0bGUocHJvY3RpdGxlKTsKKyNlbmRpZiAvKiBTRVRQUk9DVElUTEUgKi8KKworI2lmZGVmIENLU1lTTE9HCisgICAgICAgIGlmIChja3hzeXNsb2cgJiYgY2t4bG9nZ2luZykgeworICAgICAgICAgICAgc3lzbG9nKExPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICJsb2dpbjogYW5vbnltb3VzICVzICVzIiwKKyAgICAgICAgICAgICAgICAgICBjbGllbnRob3N0ID8gY2xpZW50aG9zdCA6ICIodW5rbm93biBob3N0KSIsCisgICAgICAgICAgICAgICAgICAgcAorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhbCB1c2VyICovCisgICAgICAgIGlzZ3Vlc3QgPSAwOworICAgICAgICBob21lID0gZGlyOworICAgICAgICBja3N0cm5jcHkoZ3Vlc3RwYXNzLHp2dW5hbWUsR1VFU1RQQVNTKTsKKworICAgICAgICBwcmludGYoIlVzZXIgJXMgbG9nZ2VkIGluLlxyXG4iLCBwdy0+cHdfbmFtZSk7CisjaWZkZWYgU0VUUFJPQ1RJVExFCisJLyogbm90IHVzZWQgKi8KKyAgICAgICAgc3ByaW50Zihwcm9jdGl0bGUsICIlczogJXMiLAorICAgICAgICAgICAgICAgIGNsaWVudGhvc3QgPyBjbGllbnRob3N0IDogIih1bmspIiwKKyAgICAgICAgICAgICAgICBwdy0+cHdfbmFtZQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIHNldHByb2N0aXRsZShwcm9jdGl0bGUpOworI2VuZGlmIC8qIFNFVFBST0NUSVRMRSAqLworCisjaWZkZWYgQ0tTWVNMT0cKKyAgICAgICAgaWYgKGNreHN5c2xvZyAmJiBja3hsb2dnaW5nKQorICAgICAgICAgIHN5c2xvZyhMT0dfSU5GTywgImxvZ2luOiAlcyAlcyIsCisgICAgICAgICAgICAgICAgIHB3LT5wd19uYW1lLAorICAgICAgICAgICAgICAgICBjbGllbnRob3N0ID8gY2xpZW50aG9zdCA6ICIodW5rbm93biBob3N0KSIKKyAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgIH0KKyAgICBja3N0cm5jcHkoenZob21lLGhvbWUsQ0tNQVhQQVRIKTsgICAvKiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisjaWZuZGVmIE5PUFVURU5WCisKKyAgICBja21ha21zZyh6ZW52dXNlcixaRU5WVVNFUiwiVVNFUj0iLHp2dW5hbWUsTlVMTCxOVUxMKTsKKyAgICBwdXRlbnYoKGNoYXIgKil6ZW52dXNlcik7CisgICAgY2ttYWttc2coemVudmxvZ25hbWUsWkVOVkxPR05BTUUsIkxPR05BTUU9Iix6dnVuYW1lLE5VTEwsTlVMTCk7CisgICAgcHV0ZW52KChjaGFyICopemVudmxvZ25hbWUpOworICAgIGNrbWFrbXNnKHplbnZob21lLFpFTlZIT01FLCJIT01FPSIsenZob21lLE5VTEwsTlVMTCk7CisgICAgcHV0ZW52KChjaGFyICopemVudmhvbWUpOworI2VuZGlmIC8qIE5PUFVURU5WICovCisgICAgLyogaG9tZGlyID0gKGNoYXIgKil6dmhvbWU7ICovCisgICAgY2tzdHJuY3B5KChjaGFyICopdWlkYnVmLChjaGFyICopenZ1bmFtZSw2NCk7CisgICAgKFZPSUQpIHVtYXNrKGRlZnVtYXNrKTsKKyNpZmRlZiBJS1NEQgorICAgIGlmIChpa2Rib3BlbikgeworICAgICAgICBjaGFyICogcDI7CisgICAgICAgIGludCBrOworICAgICAgICBleHRlcm4gY2hhciBkYnJlY1tdOworICAgICAgICBleHRlcm4gdW5zaWduZWQgbG9uZyBteWZsYWdzOworICAgICAgICBleHRlcm4gdW5zaWduZWQgaW50IG15ZGJzbG90OworICAgICAgICBleHRlcm4gc3RydWN0IGlrc2RiZmxkIGRiZmxkW107CisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICAgICAgZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbXlhbW9kZSwgbXlhdHlwZTsKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworICAgICAgICBteWZsYWdzIHw9IERCRl9MT0dHRUQ7CisjaWZkZWYgREVCVUcKKwlpZiAoZGVibG9nKSB7CisJICAgIGRlYnVnKEYxMDEsInp2cGFzcyBndWVzdCIsIiIsZ3Vlc3QpOworCSAgICBkZWJ1ZyhGMTExLCJ6dnBhc3MgenZ1bmFtZSIsenZ1bmFtZSwwKTsKKwkgICAgZGVidWcoRjExMCwienZwYXNzIGd1ZXN0cGFzcyIsZ3Vlc3RwYXNzLDApOworCSAgICBkZWJ1ZyhGMTEwLCJ6dnBhc3MgZGlyIixkaXIsMCk7CisJICAgIGRlYnVnKEYxMTAsInp2cGFzcyBob21lIixob21lLDApOworCSAgICBkZWJ1ZyhGMTEwLCJ6dnBhc3MgYW5vbnJvb3QiLGFub25yb290LDApOworCX0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICBwMiA9IGd1ZXN0ID8gZ3Vlc3RwYXNzIDogenZ1bmFtZTsKKyAgICAgICAgaWYgKGd1ZXN0KSB7CisgICAgICAgICAgICBwMiA9IChjaGFyICopZ3Vlc3RwYXNzOworICAgICAgICAgICAgbXlmbGFncyAmPSB+REJGX1VTRVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwMiA9IChjaGFyICopenZ1bmFtZTsKKyAgICAgICAgICAgIG15ZmxhZ3MgfD0gREJGX1VTRVI7CisgICAgICAgIH0KKyAgICAgICAgayA9IHN0cmxlbihwMik7CisgICAgICAgIHN0cm5jcHkoJmRicmVjW0RCX1VMRU5dLHVsb25ndG9oZXgoKHVuc2lnbmVkIGxvbmcpayw0KSw0KTsKKyAgICAgICAgbHNldCgmZGJyZWNbZGJmbGRbZGJfVVNFUl0ub2ZmXSxwMiwxMDI0LDMyKTsKKyAgICAgICAgc3RybmNweSgmZGJyZWNbREJfRkxBR1NdLHVsb25ndG9oZXgobXlmbGFncyw0KSw0KTsKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgICAgICBteWFtb2RlID0gY2tfdG5fYXV0aF92YWxpZCgpOworICAgICAgICBzdHJuY3B5KCZkYnJlY1tEQl9BTU9ERV0sdWxvbmd0b2hleChteWFtb2RlLDQpLDQpOworICAgICAgICBteWF0eXBlID0gY2tfdG5fYXV0aGVudGljYXRlZCgpOworICAgICAgICBzdHJuY3B5KCZkYnJlY1tEQl9BVFlQRV0sdWxvbmd0b2hleChteWF0eXBlLDQpLDQpOworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisgICAgICAgIGlmIChndWVzdCkgeworICAgICAgICAgICAgcDIgPSBkaXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwMiA9IHpndGRpcigpOworICAgICAgICAgICAgaWYgKCFwMikgcDIgPSAiIjsKKyAgICAgICAgICAgIGlmICghKnAyKSBwMiA9IGhvbWU7CisgICAgICAgIH0KKyAgICAgICAgc3RybmNweSgmZGJyZWNbREJfRExFTl0sCisgICAgICAgICAgICAgICAgdWxvbmd0b2hleCgodW5zaWduZWQgbG9uZylzdHJsZW4ocDIpLDQpLAorICAgICAgICAgICAgICAgIDQKKyAgICAgICAgICAgICAgICApOworICAgICAgICBsc2V0KCZkYnJlY1tkYmZsZFtkYl9ESVJdLm9mZl0scDIsMTAyNCwzMik7CisgICAgICAgIHVwZHNsb3QobXlkYnNsb3QpOworICAgIH0KKyNlbmRpZiAvKiBJS1NEQiAqLworICAgIHJldHVybigxKTsKKworYmFkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1vbiBmYWlsdXJlIGV4aXQgKi8KKyAgICB6dnVuYW1lWzBdID0gTlVMOworICAgIHp2bG9nb3V0KCk7CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIENLX0xPR0lOICovCisKKy8qIEJ1Z2d5IFhlbml4IDIuMy40IGNjIG5lZWRzIHRoaXMgbGluZSBhZnRlciB0aGUgZW5kaWYgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja3VpbnMudHh0IGIvY2tlcm1pdC04LjAuMjExL2NrdWlucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0NDhhMwotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja3VpbnMudHh0CkBAIC0wLDAgKzEsMzUxOSBAQAorCitDLUtlcm1pdCA4LjAgVW5peCBJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zCisKKyAgIFsgWzFdQ29udGVudHMgXSBbIFsyXUMtS2VybWl0IF0gWyBbM11LZXJtaXQgSG9tZSBdCisKKyAgIEZyYW5rIGRhIENydXoKKyAgIFRoZSBLZXJtaXQgUHJvamVjdAorICAgQ29sdW1iaWEgVW5pdmVyc2l0eQorCisgICAgICBBcyBvZiBDLUtlcm1pdCB2ZXJzaW9uOiA4LjAuMjExLCAxMCBBcHJpbCAyMDA0CisgICAgICBUaGlzIGZpbGUgbGFzdCB1cGRhdGVkOiBUdWUgQXByIDEzIDEwOjE0OjMzIDIwMDQgKE5ldyBZb3JrIENpdHkKKyAgIHRpbWUpCisKKyAgIElGIFlPVSBBUkUgUkVBRElORyBBIFBMQUlOLVRFWFQgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50LCBub3RlIHRoYXQKKyAgIHRoaXMgZmlsZSBpcyBhIHBsYWluLXRleHQgZHVtcCBvZiBhIFdlYiBwYWdlLiBZb3UgY2FuIHZpc2l0IHRoZQorICAgb3JpZ2luYWwgKGFuZCBwb3NzaWJseSBtb3JlIHVwLXRvLWRhdGUpIFdlYiBwYWdlIGhlcmU6CisKK1s0XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbAorICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCitDT05URU5UUworCisgICAgIFs1XU9WRVJWSUVXCisKKyAgICAxLiBbNl1JTlRFUk5FVCBRVUlDSyBTVEFSVAorICAgIDIuIFs3XUlOU1RBTExJTkcgRlJPTSBQQUNLQUdFUworICAgIDMuIFs4XUlOU1RBTExJTkcgUFJFQlVJTFQgQklOQVJJRVMKKyAgICA0LiBbOV1CVUlMRElORyBGUk9NIFNPVVJDRSBDT0RFCisgICAgNS4gWzEwXUlOU1RBTExJTkcgVEhFIEtFUk1JVCBGSUxFUworICAgIDYuIFsxMV1JTlNUQUxMSU5HIFVOSVggQy1LRVJNSVQgRlJPTSBET1MtRk9STUFUIERJU0tFVFRFUworICAgIDcuIFsxMl1DSEVDS0lORyBUSEUgUkVTVUxUUworICAgIDguIFsxM11SRURVQ0lORyBUSEUgU0laRSBPRiBUSEUgRVhFQ1VUQUJMRSBQUk9HUkFNIElNQUdFCisgICAgOS4gWzE0XVVOSVggVkVSU0lPTlMKKyAgIDEwLiBbMTVdRElBTElORyBPVVQgQU5EIENPT1JESU5BVElORyBXSVRIIFVVQ1AKKyAgIDExLiBbMTZdUlVOTklORyBVTklYIEMtS0VSTUlUIFNFVFVJRCBPUiBTRVRHSUQKKyAgIDEyLiBbMTddQ09ORklHVVJJTkcgVU5JWCBXT1JLU1RBVElPTlMKKyAgIDEzLiBbMThdQklaQVJSRSBCRUhBVklPUiBBVCBSVU5USU1FCisgICAxNC4gWzE5XUNSQVNIRVMgQU5EIENPUkUgRFVNUFMKKyAgIDE1LiBbMjBdU1lTTE9HR0lORworICAgMTYuIFsyMV1CVUlMRElORyBTRUNVUkUgVkVSU0lPTlMgT0YgQy1LRVJNSVQgOC4wCisgICAxNy4gWzIyXUlOU1RBTExJTkcgQy1LRVJNSVQgQVMgQU4gU1NIIFNFUlZFUiBTVUJTWVNURU0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworT1ZFUlZJRVcKKworICAgWyBbMjNdVG9wIF0gWyBbMjRdQ29udGVudHMgXSBbIFsyNV1OZXh0IF0KKworICAgICBXQVJOSU5HOiBUaGlzIGRvY3VtZW50IGNvbnRhaW5zIG5vdGVzIHRoYXQgaGF2ZSBiZWVuIGFjY3VtdWxhdGluZworICAgICBzaW5jZSB0aGUgZWFybHkgMTk4MHMuIE1hbnkgb2YgdGhlIHByb2R1Y3RzIGFuZCBVbml4IHZlcnNpb25zCisgICAgIG1lbnRpb25lZCBoZXJlIGhhdmUgbm90IGJlZW4gaGVhcmQgb2YgaW4gYSBsb25nIHdoaWxlLCBidXQgdGhhdAorICAgICBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuIHRoZXkgYXJlIG5vdCBzdGlsbCBydW5uaW5nIGluIHNvbWUKKyAgICAgb2JzY3VyZSBub29rLiAKKworICAgVGhpcyBmaWxlIGNvbnRhaW5zIFVuaXgtc3BlY2lmaWMgaW5mb3JtYXRpb24uIEEgbG90IG9mIGl0LiBVbmxpa2UgbW9zdAorICAgb3RoZXIgcGFja2FnZXMsIEMtS2VybWl0IHRyaWVzIHZlcnkgaGFyZCB0byBiZSBwb3J0YWJsZSB0byBldmVyeSBVbml4CisgICB2YXJpZXR5IChhbmQgZXZlcnkgcmVsZWFzZSBvZiBlYWNoIG9uZSkga25vd24gdG8gZXhpc3QsIGluY2x1ZGluZyBtYW55CisgICB0aGF0IGFyZSBxdWl0ZSBvbGQsIGFzIHdlbGwgYXMgdG8gb3RoZXIgcGxhdGZvcm1zIGxpa2UgVk1TLCBBT1MvVlMsCisgICBWT1MsIE9TLTksIHRoZSBCZUJveCwgdGhlIEFtaWdhLCBldGMuCisKKyAgIFNpbmNlIEMtS2VybWl0IGdldHMgc28gZGVlcGx5IGludG8gdGhlIGZpbGUgc3lzdGVtLCBpL28gc3lzdGVtLCBhbmQKKyAgIG90aGVyIGFyZWFzIHRoYXQgZGlmZmVyIHJhZGljYWxseSBmcm9tIG9uZSBVbml4IHBsYXRmb3JtIHRvIHRoZSBuZXh0LAorICAgdGhpcyBtZWFucyB0aGF0IGEgbG90IGNhbiBnbyB3cm9uZyB3aGVuIHlvdSB0cnkgdG8gaW5zdGFsbCBDLUtlcm1pdCBvbgorICAgKGZvciBleGFtcGxlKSBhIG5ldyByZWxlYXNlIG9mIGEgcGFydGljdWxhciB2YXJpZXR5IG9mIFVuaXgsIGluIHdoaWNoCisgICBjZXJ0YWluIHRoaW5ncyBtaWdodCBoYXZlIGNoYW5nZWQgdGhhdCBDLUtlcm1pdCBkZXBlbmRlZCB1cG9uLgorCisgICBUaGlzIGZpbGUgY29uY2VudHJhdGVzIG9uIGluc3RhbGxhdGlvbi4gRm9yIGEgZGVzY3JpcHRpb24gb2YgZ2VuZXJhbAorICAgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBDLUtlcm1pdCwgcGxlYXNlIHJlYWQgdGhlIFsyNl1Db25maWd1cmF0aW9ucworICAgT3B0aW9ucyBkb2N1bWVudC4gRm9yIHRyb3VibGVzaG9vdGluZyBhZnRlciBpbnN0YWxsYXRpb24sIHNlZSB0aGUKKyAgIFsyN11HZW5lcmFsIEhpbnRzIGFuZCBUaXBzIGFuZCBbMjhdVW5peC1TcGVjaWZpYyBIaW50cyBhbmQgVGlwcworICAgZG9jdW1lbnRzLiBUaGUgbGF0dGVyLCBpbiBwYXJ0aWN1bGFyLCBjb250YWlucyBsb3RzIG9mIGluZm9ybWF0aW9uIG9uCisgICBsb3RzIG9mIHNwZWNpZmljIFVuaXggcGxhdGZvcm1zLiBJZiB5b3Ugd2FudCB0byB3b3JrIG9uIHRoZSBzb3VyY2UKKyAgIGNvZGUsIHNlZSB0aGUgWzI5XUMtS2VybWl0IFByb2dyYW0gTG9naWMgTWFudWFsCisKKyAgIFlvdSBtYXkgaW5zdGFsbCBDLUtlcm1pdDoKKworICAgICAqIEZyb20gYW4gIlszMF1pbnN0YWxsIHBhY2thZ2UiLCBpZiBvbmUgaXMgYXZhaWxhYmxlLgorICAgICAqIEFzIGEgWzMxXXByZWJ1aWx0IGJpbmFyeSwgaWYgYXZhaWxhYmxlLCBwbHVzIGFjY29tcGFueWluZyB0ZXh0CisgICAgICAgZmlsZXMuCisgICAgICogQnkgYnVpbGRpbmcgZnJvbSBbMzJdc291cmNlIGNvZGUuCisgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKzEuIElOVEVSTkVUIFFVSUNLIFNUQVJUCisKKyAgIFsgWzMzXVRvcCBdIFsgWzM0XUNvbnRlbnRzIF0gWyBbMzVdTmV4dCBdIFsgWzM2XVByZXZpb3VzIF0KKworICAgSWYgeW91ciBVbml4IGNvbXB1dGVyIGlzIG9uIHRoZSBJbnRlcm5ldCBhbmQgaXQgaGFzIGEgQyBjb21waWxlciwKKyAgIGhlcmUncyBob3cgdG8gZG93bmxvYWQsIGJ1aWxkLCBhbmQgaW5zdGFsbCBDLUtlcm1pdCBkaXJlY3RseSBmcm9tIHRoZQorICAgInRhcmJhbGxzIiBvciBaaXAgYXJjaGl2ZXM6CisKKyAgICAxLiBNYWtlIGEgZnJlc2ggZGlyZWN0b3J5IGFuZCBjZCB0byBpdC4KKyAgICAyLiBEb3dubG9hZCB0aGUgQy1LZXJtaXQgc291cmNlIGNvZGU6CisgICAgICAgWzM3XWZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2FyY2hpdmVzL2NrdTIxMS50YXIuWgorICAgICAgIChjb21wcmVzcyBmb3JtYXQpIG9yCisgICAgICAgWzM4XWZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2FyY2hpdmVzL2NrdTIxMS50YXIuZ3oKKyAgICAgICAoZ3VuemlwIGZvcm1hdCkuCisgICAgMy4gVW5jb21wcmVzcyB0aGUgY29tcHJlc3NlZCB0YXIgZmlsZSB3aXRoICJ1bmNvbXByZXNzIiBvciAiZ3VuemlwIiwKKyAgICAgICBhY2NvcmRpbmcgdG8gd2hpY2ggdHlwZSBvZiBjb21wcmVzc2VkIGZpbGUgeW91IGRvd25sb2FkZWQuIChJZiB5b3UKKyAgICAgICBkb24ndCB1bmRlcnN0YW5kIHRoaXMsIHlvdSBjb3VsZCBkb3dubG9hZCBhIChtdWNoIGxhcmdlcikKKyAgICAgICB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUgZGlyZWN0bHk6CisgICAgICAgWzM5XWZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2FyY2hpdmVzL2NrdTIxMS50YXIKKyAgICA0LiBOb3cgdHlwZSAidGFyIHh2ZiBja3UyMTEudGFyIiB0byB1bnBhY2sgdGhlIGluZGl2aWR1YWwgZmlsZXMgZnJvbQorICAgICAgIHRoZSB0YXIgYXJjaGl2ZS4KKyAgICA1LiBUeXBlICJybSBja3UyMTEudGFyIiB0byBnZXQgcmlkIG9mIHRoZSB0YXIgYXJjaGl2ZSwgd2hpY2ggaXMgbm8KKyAgICAgICBsb25nZXIgbmVlZGVkLgorICAgIDYuIFJlYWQgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhlIG1ha2VmaWxlIHRvIGZpbmQgb3V0IHdoaWNoCisgICAgICAgdGFyZ2V0IHRvIHVzZSBhbmQgdGhlbiB0eXBlIHRoZSBhcHByb3ByaWF0ZSAibWFrZSIgY29tbWFuZCwgc3VjaAorICAgICAgIGFzICJtYWtlIGxpbnV4IiwgIm1ha2Ugc29sYXJpczgiLCBldGMuCisgICAgNy4gVGhpcyBwcm9kdWNlcyBhIGJpbmFyeSBpbiB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5IGNhbGxlZCAid2VybWl0Ii4KKyAgICAgICBTdGFydCBpdCBieSB0eXBpbmcgIi4vd2VybWl0IiBhbmQgWzQwXXRyeSBpdCBvdXQgdG8gbWFrZSBzdXJlIGl0CisgICAgICAgd29ya3MuIFRoZW4gcmVhZCBbNDFdU2VjdGlvbiA1IGZvciBob3cgdG8gaW5zdGFsbCBpdCwgb3Igc2ltcGx5CisgICAgICAgY29weSB0aGUgd2VybWl0IGJpbmFyeSB0byB0aGUgZGVzaXJlZCBwdWJsaWMgZGlyZWN0b3J5LCByZW5hbWUgaXQKKyAgICAgICB0byBrZXJtaXQsIGFuZCBnaXZlIGl0IHRoZSBuZWVkZWQgcGVybWlzc2lvbnMgKGFuZCwgaWYgaXQgaXMgZ29pbmcKKyAgICAgICB0byBiZSB1c2VkIHRvIGRpYWwgb3V0LCBnaXZlIGl0IHRoZSBzYW1lIGdyb3VwIGFuZCBvd25lciBhbmQKKyAgICAgICBwZXJtaXNzaW9ucyBhcyB0aGUgY3UsIHRpcCwgb3IgbWluaWNvbSBwcm9ncmFtKS4KKworICAgRm9yIHNlY3VyZSBpbnN0YWxsYXRpb25zLCBzZWUgWzQyXVNlY3Rpb25zIDUgYW5kIFs0M10xNi4KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMi4gSU5TVEFMTElORyBGUk9NIFBBQ0tBR0VTCisKKyAgIFsgWzQ0XVRvcCBdIFsgWzQ1XUNvbnRlbnRzIF0gWyBbNDZdTmV4dCBdIFsgWzQ3XVByZXZpb3VzIF0KKworICAgVmFyaW91cyBVbml4IHZhcmlldGllcyAtLSBMaW51eCwgU29sYXJpcywgQUlYLCBldGMgLS0gbm93IGluY29ycG9yYXRlCisgICB0aGUgaWRlYSBvZiAiaW5zdGFsbCBwYWNrYWdlcyIsIGFuZCBtYW55IHVzZXJzIGV4cGVjdCB0byBmaW5kIGFsbCBuZXcKKyAgIGFwcGxpY2F0aW9ucyBpbiB0aGlzIGZvcm1hdC4gQSBzZWxlY3Rpb24gb2YgaW5zdGFsbCBwYWNrYWdlcyBtaWdodCBiZQorICAgYXZhaWxhYmxlIGZvciBhbnkgZ2l2ZW4gcmVsZWFzZSBvZiBDLUtlcm1pdCwgYnV0IHRoZXJlIGlzIGEgdHJhZGVvZmYKKyAgIGJldHdlZW4gY29udmVuaWVuY2UgYW5kIHNhZmV0eS4gVW5peCBwcmVzZW50cyBzZXZlcmFsIG5vdGFibGUgcHJvYmxlbXMKKyAgIHRvIHRoZSBidWlsZGVyIG9mIGluc3RhbGwgcGFja2FnZXM6CisKKyAgICBhLiBTaW5jZSBDLUtlcm1pdCBpcyBwb3J0YWJsZSB0byBtYW55IG5vbi1Vbml4IHBsYXRmb3JtcyAoVk1TLCBWT1MsCisgICAgICAgQU9TL1ZTLCBldGMpLCBzb21lIG9mIHRoZSBmaWxlcyBpbiB0aGUgQy1LZXJtaXQgZGlzdHJpYnV0aW9uIGRvCisgICAgICAgbm90IGZpdCBpbnRvIHRoZSBVbml4IGFwcGxpY2F0aW9uIG1vZGVsLiBJbiBwYXJ0aWN1bGFyLCBDLUtlcm1pdAorICAgICAgIGluY2x1ZGVzIHNvbWUgcGxhaW4gdGV4dCBmaWxlcyAoZGVzY3JpYmVkIGluIFs0OF1TZWN0aW9uIDUpIGFuZAorICAgICAgIFVuaXggaGFzIG5vIHN0YW5kYXJkIHBsYWNlIHRvIHB1dCBzdWNoIGZpbGVzLiBUeXBpY2FsIFVuaXggcGFja2FnZQorICAgICAgIG1hbmFnZXJzIGRvIG5vdCBhbGxvdyBmb3IgdGhlbS4gV2hlcmUgc2hvdWxkIHRoZXkgZ28sIGFuZCBob3cgd2lsbAorICAgICAgIHRoZSB1c2VyIGtub3cgd2hlcmUgdG8gZmluZCB0aGVtPworICAgIGIuIEluc3RhbGxhdGlvbiBvZiBhbnkgcHJvZ3JhbSB0aGF0IHdpbGwgYmUgdXNlZCB0byBtYWtlIG1vZGVtIGNhbGxzCisgICAgICAgcmVxdWlyZXMgc29tZSBpbXBvcnRhbnQgZGVjaXNpb25zIGZyb20gdGhlIGluc3RhbGxlciByZWdhcmRpbmcKKyAgICAgICBzZWN1cml0eSBhbmQgcHJpdmlsZWdlLgorCisgICBJdGVtIChiKSBpcyBkaXNjdXNzZWQgYXQgbGVuZ3RoIGluIFs0OV1TZWN0aW9ucyAxMCBhbmQgWzUwXTExIG9mIHRoaXMKKyAgIGRvY3VtZW50LCBidXQgdGhlIHBhY2thZ2UtcmVsYXRlZCBhc3BlY3RzIGFyZSBhbHNvIGdpdmVuIGhlcmUuIFRoZQorICAgYmFzaWMgcHJvYmxlbSBpcyB0aGF0IFVuaXggZGlhbG91dCBkZXZpY2VzIGFuZCB0aGUgVVVDUCAibG9jayBmaWxlcyIKKyAgIHRoYXQgcmVndWxhdGUgY29udGVudGlvbiBmb3IgdGhlbSAoZGVzY3JpYmVkIGluIFs1MV1TZWN0aW9uIDEwKSBhcmUKKyAgIHVzdWFsbHkgcHJvdGVjdGVkIGFnYWluc3QgIndvcmxkIi4gVGhlcmVmb3JlLCB0aGUgaW5zdGFsbCBwcm9jZWR1cmUKKyAgIG11c3QgZWl0aGVyIHJ1biBhcyByb290IGluIG9yZGVyIHRvIGdpdmUgdGhlIEtlcm1pdCBiaW5hcnkgdGhlCisgICByZXF1aXJlZCBwZXJtaXNzaW9ucywgZ3JvdXAsIGFuZC9vciBvd25lciwgb3IgZWxzZSB0aGUgZGlhbG91dCBkZXZpY2VzCisgICBhbmQgYXNzb2NpYXRlZCBkaXJlY3RvcmllcyBtdXN0IGJlIG9wZW4gZm9yIGdyb3VwIG9yIHdvcmxkIHJlYWRpbmcgYW5kCisgICB3cml0aW5nLiBPdGhlcndpc2UsIHRoZSBLZXJtaXQgcHJvZ3JhbSBqdXN0IGluc3RhbGxlZCBXSUxMIE5PVCBXT1JLCisgICBmb3IgZGlhbGluZyBvdXQuCisKKyAgIFRodXMsIGEgd2VsbC1jcmFmdGVkIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUgc2hvdWxkIHByZXNlbnQgdGhlIG9wdGlvbnMKKyAgIGFuZCBhbGxvdyB0aGUgaW5zdGFsbGVyIHRvIGNob29zZSB0aGUgbWV0aG9kLCBpZiBhbnksIGZvciByZWd1bGF0aW5nCisgICBhY2Nlc3MgdG8gdGhlIGRpYWxvdXQgZGV2aWNlczoKKworICAgIGEuIENoZWNrIHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgbG9ja2ZpbGUgZGlyZWN0b3J5IGFuZCB0aGUgZGlhbG91dAorICAgICAgIGRldmljZXMuIElmIHRoZXkgZG8gbm90IGFsbG93IGdyb3VwIG9yIHdvcmxkIFIvVyBhY2Nlc3MsIHRoZW46CisgICAgYi4gIllvdXIgVVVDUCBsb2NrZmlsZSBkaXJlY3RvcnkgYW5kL29yIGRpYWxvdXQgZGV2aWNlcyByZXF1aXJlCisgICAgICAgcHJpdmlsZWdlIHRvIGFjY2Vzcy4gWW91IG11c3QgZWl0aGVyIGNoYW5nZSB0aGVpciBwZXJtaXNzaW9ucyBvcgorICAgICAgIGluc3RhbGwgS2VybWl0IHdpdGggcHJpdmlsZWdlcy4iCisgICAgYy4gIklmIHlvdSB3aXNoIHRvIGluc3RhbGwgS2VybWl0IHdpdGggcHJpdmlsZWdlcywgaXQgd2lsbCBiZSBnaXZlbgorICAgICAgIHRoZSBzYW1lIG93bmVyLCBncm91cCwgYW5kIHBlcm1pc3Npb25zIGFzIHRoZSBjdSBwcm9ncmFtIHNvIGl0IGNhbgorICAgICAgIHVzZSB0aGUgZGlhbG91dCBkZXZpY2VzLiIKKyAgICBkLiBJZiB0aGV5IGNob29zZSAoYykgYnV0IHRoZSB1c2VyIGlzIG5vdCByb290LCBnaXZlIGEgbWVzc2FnZSB0aGF0CisgICAgICAgdGhlIGluc3RhbGwgcHJvY2VkdXJlIGNhbiBiZSBydW4gb25seSBieSByb290IGFuZCB0aGVuIHF1aXQuCisKKyAgIEl0IHNob3VsZCBnbyB3aXRob3V0IHNheWluZywgb2YgY291cnNlLCB0aGF0IGFueSBiaW5hcmllcyB0aGF0IGFyZSB0bworICAgYmUgaW5jbHVkZWQgaW4gYW4gaW5zdGFsbCBwYWNrYWdlIHNob3VsZCBiZSBidWlsdCBmcmVzaCBvbiB0aGUgZXhhY3QKKyAgIHBsYXRmb3JtIChlLmcuIFJlZCBIYXQgOC4wIG9uIEludGVsKSBmb3Igd2hpY2ggdGhlIHBhY2thZ2UgaXMKKyAgIHRhcmdldGVkOyBwcmVidWlsdCBiaW5hcmllcyAoWzUyXW5leHQgc2VjdGlvbikgZnJvbSBvdGhlciBzaXRlcyBhcmUKKyAgIGxpa2VseSB0byBoYXZlIGxpYnJhcnkgbWlzbWF0Y2hlcy4gWzUzXUNMSUNLIEhFUkUgZm9yIG1vcmUgYWJvdXQKKyAgIGJ1aWxkaW5nIEMtS2VybWl0IGluc3RhbGwgcGFja2FnZXMuCisKKyAgIFRoZSBLZXJtaXQgUHJvamVjdCBkb2VzIG5vdCBoYXZlIHRoZSByZXNvdXJjZXMgb3IgdGhlIGV4cGVydGlzZSB0bworICAgbWFrZSBpbnN0YWxsIHBhY2thZ2VzIGZvciBldmVyeSBwbGF0Zm9ybS4gTW9zdCBpbnN0YWxsIHBhY2thZ2VzLAorICAgdGhlcmVmb3JlLCBhcmUgY29udHJpYnV0ZWQgYnkgb3RoZXJzLCBhbmQgdGhleSBkbyBub3QgbmVjZXNzYXJpbHkKKyAgIGZvbGxvdyB0aGUgZ3VpZGVsaW5lcyBnaXZlbiBhYm92ZS4gUGF5IGF0dGVudGlvbiB0byB3aGF0IHRoZXkgZG8uCisKKyAgIElmIHlvdSBhcmUgYW4gZW5kIHVzZXIgd2hvIGhhcyBvYnRhaW5lZCBhIEMtS2VybWl0IGluc3RhbGwgcGFja2FnZSBmb3IKKyAgIGEgcGFydGljdWxhciBwbGF0Zm9ybSwgeW91IHNob3VsZCBiZSBhd2FyZSB0aGF0IHNvbWUgYWRkaXRpb25hbCBzdGVwcworICAgbWlnaHQgbmVlZGVkIGlmIHlvdSB3YW50IHRvIHVzZSBLZXJtaXQgdG8gZGlhbCBvdXQuIFJlYWQgWzU0XVNlY3Rpb24KKyAgIDEwIGZvciBkZXRhaWxzLgorICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCiszLiBJTlNUQUxMSU5HIFBSRUJVSUxUIEJJTkFSSUVTCisKKyAgIFsgWzU1XVRvcCBdIFsgWzU2XUNvbnRlbnRzIF0gWyBbNTddTmV4dCBdIFsgWzU4XVByZXZpb3VzIF0KKworICAgSHVuZHJlZHMgb2YgcHJlYnVpbHQgQy1LZXJtaXQgYmluYXJpZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgQ0RST00gaW4KKyAgIHRoZSBCSU5BUlkgdHJlZSBbTk9URTogVGhlIEMtS2VybWl0IENEUk9NIGlzIHN0aWxsIGZvciB2ZXJzaW9uIDcuMF0sCisgICBhbmQgYXQgb3VyIGZ0cCBzaXRlIGluIHRoZSBbNTlda2VybWl0L2JpbiBhcmVhICh3aXRoIG5hbWVzIHN0YXJ0aW5nCisgICB3aXRoICJjayIpLCBhbHNvIGFjY2Vzc2libGUgb24gdGhlIFs2MF1DLUtlcm1pdCB3ZWJzaXRlLiBUbyBpbnN0YWxsIGEKKyAgIHByZWJ1aWx0IGJpbmFyeToKKworICAgIGEuIFJlbmFtZSB0aGUgYmluYXJ5IHRvICJ3ZXJtaXQiLgorICAgIGIuIE1ha2Ugc3VyZSBpdCB3b3Jrczsgc29tZSB0ZXN0cyBhcmUgc3VnZ2VzdGVkIGluIFs2MV1TZWN0aW9uIDcuCisgICAgYy4gRm9sbG93IHN0ZXBzIChiKSB0aHJvdWdoIChlKSBpbiBbNjJdU2VjdGlvbiA0LgorICAgIGQuIEluc3RhbGwgcmVsYXRlZCBmaWxlcyBhcyBkZXNjcmliZWQgaW4gWzYzXVNlY3Rpb24gNS4KKworICAgQnV0IGZpcnN0Li4uIFBsZWFzZSBoZWVkIHRoZSBmb2xsb3dpbmcgY2F1dGlvbnM6CisKKyAgICBhLiBJZiB5b3UgcGljayB0aGUgd3JvbmcgYmluYXJ5LCBpdCB3b24ndCB3b3JrIChvciB3b3JzZSkuCisgICAgYi4gRXZlbiB3aGVuIHlvdSBwaWNrIHRoZSBhcHByb3ByaWF0ZSBiaW5hcnksIGl0IHN0aWxsIG1pZ2h0IG5vdCB3b3JrCisgICAgICAgZHVlIHRvIHNoYXJlZC1saWJyYXJ5IG1pc21hdGNoZXMsIGV0Yy4gKHNlZSBbNjRdU2VjdGlvbiA0LjApLgorICAgIGMuIERvbid0IGV4cGVjdCBhIGJpbmFyeSBidWlsdCBvbiBvciBmb3IgdmVyc2lvbiBuIG9mIHlvdXIgT1MgdG8gd29yaworICAgICAgIG9uIHZlcnNpb24gbiAtIHggKHdoZXJlIHggPiAwKS4gSG93ZXZlciwgaXQgaXMgdXN1YWxseSBzYWZlIHRvIHJ1bgorICAgICAgIGEgYmluYXJ5IGJ1aWx0IG9uIChvciBmb3IpIGFuIG9sZGVyIE9TIHJlbGVhc2Ugb24gYSBuZXdlciBvbmUuCisKKyAgIFRoZXJlZm9yZSwgaXQgaXMgYmV0dGVyIHRvIGJ1aWxkIHlvdXIgb3duIGJpbmFyeSBmcm9tIHNvdXJjZSBjb2RlCisgICAoWzY1XW5leHQgc2VjdGlvbikgaWYgeW91IGNhbi4gQnV0IHNpbmNlIGl0IGlzIGluY3JlYXNpbmdseSBmb3IgVW5peAorICAgc3lzdGVtcyAobm90IHRvIG1lbnRpb24gVk1TIGFuZCBvdGhlciBPUydzKSB0byBiZSBkZWxpdmVyZWQgd2l0aG91dCBDCisgICBjb21waWxlcnMsIGl0IGlzIG9mdGVuIGltcHJhY3RpY2FsLiBJbiBzdWNoIGNhc2VzLCB0cnkgdGhlIG1vc3QKKyAgIGFwcHJvcHJpYXRlIHByZWJ1aWx0IGJpbmFyeSBvciBiaW5hcmllcywgYW5kIGlmIG5vbmUgb2YgdGhlbSB3b3JrLAorICAgWzY2XWNvbnRhY3QgdXMgYW5kIHdlJ2xsIHNlZSB3aGF0IHdlIGNhbiBkbyB0byBoZWxwLgorICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCis0LiBCVUlMRElORyBGUk9NIFNPVVJDRSBDT0RFCisKKyAgIFsgWzY3XVRvcCBdIFsgWzY4XUNvbnRlbnRzIF0gWyBbNjldTmV4dCBdIFsgWzcwXVByZXZpb3VzIF0KKworICAgQWxzbyBzZWU6IFs3MV1TZWN0aW9uIDggYW5kIFs3Ml1TZWN0aW9uIDkuCisKKyAgIEMtS2VybWl0IGlzIGRlc2lnbmVkIHRvIGJlIGJ1aWx0IGFuZCB1c2VkIG9uIGFzIG1hbnkgcGxhdGZvcm1zIGFzCisgICBwb3NzaWJsZTogVW5peCBhbmQgbm9uLVVuaXgsIG9sZCBhbmQgbmV3IChhbmQgYW5jaWVudCksIEFOU0kgQyBhbmQKKyAgIEsmUi4gVGhlIFVuaXggdmVyc2lvbiBkb2VzIG5vdCB1c2Ugb3IgZGVwZW5kIG9uIGFueSBleHRlcm5hbCB0b29scyBmb3IKKyAgIGJ1aWxkaW5nIGV4Y2VwdCB0aGUgIm1ha2UiIHV0aWxpdHksIHRoZSBDIGNvbXBpbGVyLCBhbmQgdGhlIGxpbmtlci4gSXQKKyAgIGRvZXMgbm90IHVzZSBhbnkgYXV0b21hdGVkIGNvbmZpZ3VyYXRpb24gdG9vbHMgc3VjaCBhcyBjb25maWd1cmUsCisgICBhdXRvY29uZiwgYXV0b21ha2UsIGxpYnRvb2wsIGV0Yy4gRXZlcnl0aGluZyBpbiBDLUtlcm1pdCBoYXMgYmVlbgorICAgYnVpbHQgYnkgaGFuZCBiYXNlZCBvbiBkaXJlY3QgZXhwZXJpZW5jZSBvciByZXBvcnRzIG9yIGNvbnRyaWJ1dGlvbnMKKyAgIGZyb20gdXNlcnMgb2YgZWFjaCBwbGF0Zm9ybS4KKworICAgVGhlIFs3M11DLUtlcm1pdCBtYWtlZmlsZSBjb250YWlucyB0aGUgcnVsZXMgZm9yIGJ1aWxkaW5nIHRoZSBwcm9ncmFtCisgICBmb3IgZWFjaCBvZiB0aGUgaHVuZHJlZHMgb2YgZGlmZmVyZW50IGtpbmRzIG9mIFVuaXggc3lzdGVtcyB0aGF0CisgICBDLUtlcm1pdCBhdHRlbXB0cyB0byBzdXBwb3J0LiBJdCBjb3ZlcnMgYWxsIFVuaXggdmFyaWF0aW9ucyBzaW5jZQorICAgYWJvdXQgMTk4MCAtLSBwcmV0dHkgbXVjaCBldmVyeXRoaW5nIGFmdGVyIFVuaXggVjYuIFNlcGFyYXRlIG1ha2VmaWxlcworICAgYXJlIHVzZWQgZm9yIFs3NF1QbGFuIDkgYW5kIFs3NV0yLnggQlNELgorCisgICBQcmVyZXF1aXNpdGVzOgorCisgICAgICogVGhlIEMgY29tcGlsZXIsIGxpbmtlciwgYW5kIG1ha2UgcHJvZ3JhbSBtdXN0IGJlIGluc3RhbGxlZC4KKyAgICAgKiBUaGUgQyBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcyBtdXN0IGJlIGluc3RhbGxlZCAoKikuCisgICAgICogVGhlIEMtS2VybWl0IHNvdXJjZSBjb2RlIGFuZCBtYWtlZmlsZSBpbiB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5LgorICAgICAqIFRoZSBDLUtlcm1pdCB0ZXh0IGZpbGVzIChbNzZdU2VjdGlvbiA1KSBpbiB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5LgorCisgICAgICogVGhpcyBpcyBiZWNvbWluZyBwcm9ibGVtYXRpYyBpbiB0aGlzIG5ldyBhZ2Ugb2YgInNlbGVjdGl2ZQorICAgICAgIGluc3RhbGxzIiBlLmcuIG9mIExpbnV4IHBhY2thZ2VzLiBDLUtlcm1pdCBidWlsZHMgd2lsbCBvZnRlbiBmYWlsCisgICAgICAgYmVjYXVzZSByZXBseWluZyAibm8iIHRvIHNvbWUgb2JzY3VyZSBMaW51eCBpbnN0YWxsYXRpb24gb3B0aW9uCisgICAgICAgd2lsbCByZXN1bHQgaW4gbWlzc2luZyBsaWJyYXJpZXMgb3IgaGVhZGVyIGZpbGVzLiBEaXR0byBvbgorICAgICAgIHBsYXRmb3JtcyBsaWtlIEFJWCBhbmQgU29sYXJpcyB0aGF0IGRvbid0IGNvbWUgd2l0aCBDIGNvbXBpbGVycywKKyAgICAgICBhbmQgdGhlbiBsYXRlciBoYXZlIGdjYyBpbnN0YWxsZWQsIGJ1dCBhcmUgc3RpbGwgbWlzc2luZyBjcnVjaWFsCisgICAgICAgbGlicmFyaWVzLCBsaWtlIGxpYm0gKG1hdGgpLgorCisgICBQbHVzOgorCisgICAgICogRm9yIFRDUC9JUCBuZXR3b3JraW5nIHN1cHBvcnQsIHRoZSBzb2NrZXRzIGxpYnJhcnkgYW5kIHJlbGF0ZWQKKyAgICAgICBoZWFkZXIgZmlsZXMgbXVzdCBiZSBpbnN0YWxsZWQuCisgICAgICogVGhlIG1hdGggbGlicmFyeSBmb3IgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYyBzdXBwb3J0IChjYW4gYmUKKyAgICAgICBkZXNlbGVjdGVkIGJ5IGFkZGluZyAtRE5PRkxPQVQgdG8gQ0ZMQUdTIGFuZCByZW1vdmluZyAtbG0gZnJvbQorICAgICAgIExJQlMpLgorICAgICAqIE1hbnkgYW5kIHZhcmllZCBzZWN1cml0eSBsaWJyYXJpZXMgZm9yIGJ1aWxkaW5nIGEgc2VjdXJlIHZlcnNpb24KKyAgICAgICAoS2VyYmVyb3MsIFNTTC9UTFMsIFNSUCwgWmxpYiwuLi4pIFRoZXNlIGFyZSByZXF1aXJlZCBvbmx5IGlmIHlvdQorICAgICAgIHNlbGVjdCBhIHNlY3VyZSB0YXJnZXQuCisgICAgICogRm9yIHRoZSBjdXJzZXMtYmFzZWQgZnVsbHNjcmVlbiBmaWxlLXJhbnNmZXIgZGlzcGxheSwgdGhlIGN1cnNlcworICAgICAgIG9yIG5jdXJzZXMgaGVhZGVyIGZpbGUocykgYW5kIGxpYnJhcnksIGFuZCBwcm9iYWJseSBhbHNvIHRoZQorICAgICAgIHRlcm1jYXAgYW5kL29yIHRlcm1saWIgbGlicmFyeS4gTm90ZSB0aGF0IHRoZSBuYW1lcyBhbmQgbG9jYXRpb25zCisgICAgICAgb2YgdGhlc2UgZmlsZXMgYW5kIGxpYnJhcmllcyBhcmUgbGlrZWx5IHRvIGNoYW5nZSBjYXByaWNpb3VzbHkKKyAgICAgICB3aXRoIGV2ZXJ5IG5ldyByZWxlYXNlIG9mIHlvdXIgVW5peCBwcm9kdWN0LiBJZiB5b3UgZGlzY292ZXIgdGhhdAorICAgICAgIHRoZSBDLUtlcm1pdCBidWlsZCBwcm9jZWR1cmUgZmFpbHMgYmVjYXVzZSB5b3VyIGN1cnNlcyBhbmQvb3IKKyAgICAgICB0ZXJteHh4IGhlYWRlcnMgb3IgbGlicmFyaWVzIGFyZSBub3QgbmFtZWQgb3IgbG9jYXRlZCBhcyBleHBlY3RlZCwKKyAgICAgICBwbGVhc2UgWzc3XWxldCB1cyBrbm93LiBJbiB0aGUgbWVhbnRpbWUsIHdvcmsgYXJvdW5kIGJ5IGluc3RhbGxpbmcKKyAgICAgICBzeW1saW5rcy4KKyAgICAgKiBJTVBPUlRBTlQ6IE1vZGVybiBMaW51eCBkaXN0cmlidXRpb25zIG1pZ2h0IGdpdmUgeW91IHRoZSBjaG9pY2UKKyAgICAgICBkdXJpbmcgaW5zdGFsbGF0aW9uIG9mIHdoZXRoZXIgdG8gaW5zdGFsbCB0aGUgIm5jdXJzZXMgZGV2ZWxvcG1lbnQKKyAgICAgICBwYWNrYWdlIiAocGVyaGFwcyBjYWxsZWQgIm5jdXJzZXMtZGV2ZWwiKS4gSWYgeW91IGRpZCBub3QgaW5zdGFsbAorICAgICAgIGl0LCB5b3Ugd29uJ3QgYmUgYWJsZSB0byBidWlsZCBDLUtlcm1pdCB3aXRoIGN1cnNlcyBzdXBwb3J0CisgICAgICAgaW5jbHVkZWQuIEluIHRoaXMgY2FzZSwgZWl0aGVyIGdvIGJhY2sgYW5kIGluc3RhbGwgbmN1cnNlcywgb3IKKyAgICAgICBlbHNlIGNob29zZSAob3IgY3JlYXRlKSBhIG5vbi1jdXJzZXMgbWFrZWZpbGUgdGFyZ2V0IGZvciB5b3VyCisgICAgICAgcGxhdGZvcm0uIFRvIGluc3RhbGwgdGhlIG5jdXJzZXMgZGV2ZWxvcGVycyB0b29scyBpbiBSZWQgSGF0CisgICAgICAgTGludXgsIGRvOgorCittb3VudCByZWRoYXQgY2Ryb20KK2dvdG8gUmVkSGF0L1JQTVMKK3JwbSAtaXZoIG5jdXJzZXMtZGV2ZWwqLnJwbQorb3IgdG8gaGF2ZSB0aGUgZXhhY3QgbmFtZSBscyBuY3Vyc2UqIGFuZCBsb2FkIGFzCitycG0gLWl2aCBmaWxlbmFtZQordGhlbiBsZWF2ZSB0aGUgY2Ryb20gYW5kIHVubW91bnQgaXQuCisKKyAgICAgKiBJbiBBSVggeW91IG1pZ2h0IGhhdmUgdG8gZ28gYmFjayBhbmQgaW5zdGFsbCBhbnkgb3IgYWxsIG9mOgorCitib3MuYWR0LmJhc2UKK2Jvcy5hZHQuaW5jbHVkZQorYm9zLmFkdC5saWIKK2Jvcy5hZHQubGlibQorYm9zLmFkdC51dGlscworCisgICAgICAgZnJvbSB0aGUgZmlyc3QgaW5zdGFsbGF0aW9uIENELgorCisgICBUaGUgbWFrZWZpbGUgbWlnaHQgbmVlZCB0byBiZSByZW5hbWVkIGZyb20gY2t1a2VyLm1hayB0byBtYWtlZmlsZS4KKyAgIERpcmVjdGlvbnM6CisKKyAgICBhLiBUeXBlICJtYWtlIHh4eCIgd2hlcmUgeHh4IGlzIHRoZSBuYW1lIG9mIHRoZSBtYWtlZmlsZSB0YXJnZXQgbW9zdAorICAgICAgIGFwcHJvcHJpYXRlIHRvIHlvdXIgcGxhdGZvcm0sIGUuZy4gIm1ha2UgbGludXgiLCAibWFrZSBhaXg0MyIsCisgICAgICAgZXRjLiBSZWFkIHRoZSBbNzhdY29tbWVudHMgYXQgdGhlIHRvcCBvZiB0aGUgbWFrZWZpbGUgZm9yIGEKKyAgICAgICBjb21wbGV0ZSBsaXN0IG9mIGF2YWlsYWJsZSB0YXJnZXRzIChpdCdzIGEgbG9uZyBsaXN0KS4KKyAgICBiLiBUZXN0IHRoZSByZXN1bHRpbmcgJ3dlcm1pdCcgZmlsZSAoc2VlIFs3OV1TZWN0aW9uIDcgZm9yCisgICAgICAgc3VnZ2VzdGlvbnMpLiBJZiBpdCdzIE9LLCBwcm9jZWVkOyBvdGhlcndpc2UgWzgwXW5vdGlmeSB1cy4KKworICAgICBOT1RFOiBzdGVwcyAoYykgdGhyb3VnaCAoZSkgY2FuIGJlIGFjY29tcGxpc2hlZCB1c2luZyB0aGUKKyAgICAgWzgxXW1ha2VmaWxlICdpbnN0YWxsJyB0YXJnZXQgYXMgZGVzY3JpYmVkIGluIFs4Ml1TZWN0aW9uIDUuNC4gCisgICAgYy4gUmVuYW1lIHRoZSAnd2VybWl0JyBmaWxlIHRvICdrZXJtaXQnLCBjb3B5IGl0IHRvIHRoZSBkZXNpcmVkCisgICAgICAgYmluYXJ5IGRpcmVjdG9yeSAoc3VjaCBhcyAvdXNyL2xvY2FsL2JpbiBvciAvb3B0L3NvbWV0aGluZyksIGFuZAorICAgICAgIGlmIGl0IGlzIHRvIGJlIHVzZWQgZm9yIGRpYWxpbmcgb3V0LCBnaXZlIGl0IHRoZSBzYW1lIG93bmVyLAorICAgICAgIGdyb3VwLCBhbmQgcGVybWlzc2lvbnMgYXMgdGhlICdjdScgcHJvZ3JhbSAoSU1QT1JUQU5UOiByZWFkCisgICAgICAgWzgzXVNlY3Rpb25zIDEwIGFuZCBbODRdMTEgZm9yIGRldGFpbHMpLgorICAgIGQuIEluc3RhbGwgdGhlIG1hbiBwYWdlLCBja3VrZXIubnIsIHdpdGggeW91ciBvdGhlciBtYW4gcGFnZXMuCisgICAgZS4gSW5zdGFsbCB0aGUgYWNjb21wYW55aW5nIHRleHQgZmlsZXMgKHNlZSBbODVdU2VjdGlvbiA1KS4KKyAgICBmLiBJZiB5b3Ugd2FudCBDLUtlcm1pdCB0byBhbHNvIG9mZmVyIGEgVGVsbmV0IGNvbW1hbmQtbGluZQorICAgICAgIHBlcnNvbmFsaXR5LCBtYWtlIGEgc3ltYm9saWMgbGluayBhcyBmb2xsb3dzOgorCitjZCBkaXJlY3Rvcnktd2hlcmUta2VybWl0LWJpbmFyeS1pcworbG4gLXMga2VybWl0IHRlbG5ldAorCisgICAgICAgSWYgeW91IHdhbnQgQy1LZXJtaXQgdG8gYmUgdGhlIGRlZmF1bHQgVGVsbmV0IGNsaWVudCwgbWFrZSBzdXJlCisgICAgICAgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgY3JlYXRlZCB0aGUgc3ltbGluayBpcyBpbiB0aGUgUEFUSAorICAgICAgIGFoZWFkIG9mIHRoZSB3aGVyZSB0aGUgcmVndWxhciBUZWxuZXQgY2xpZW50IGlzLgorICAgIGcuIElmIHlvdSB3YW50IEMtS2VybWl0IHRvIGFsc28gb2ZmZXIgYW4gRlRQIGNvbW1hbmQtbGluZQorICAgICAgIHBlcnNvbmFsaXR5LCBtYWtlIGEgc3ltbGluayBjYWxsZWQgImZ0cCIgYXMgaW4gKGYpLgorICAgIGguIElmIHlvdSB3YW50IEMtS2VybWl0IHRvIGFsc28gb2ZmZXIgYW4gRlRUUCBjb21tYW5kLWxpbmUKKyAgICAgICBwZXJzb25hbGl0eSwgbWFrZSBhIHN5bWxpbmsgY2FsbGVkICJodHRwIiBhcyBpbiAoZikuCisgICAgaS4gSWYgeW91IHdhbnQgdG8gb2ZmZXIgYW4gSW50ZXJuZXQgS2VybWl0IFNlcnZpY2UsIGZvbGxvdyB0aGUKKyAgICAgICBkaXJlY3Rpb25zIGluIHRoZSBbODZdSUtTRCBBZG1pbmlzdHJhdG9yJ3MgR3VpZGUuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC4wLiBTcGVjaWFsIENvbnNpZGVyYXRpb25zIGZvciBDLUtlcm1pdCA4LjAKKworICAgWyBbODddVG9wIF0gWyBbODhdQ29udGVudHMgXSBbIFs4OV1OZXh0IF0KKworICAgQWxzbyBzZWU6IFs5MF1DLUtlcm1pdCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKworICAgU0VDVElPTiBDT05URU5UUworCis0LjEuIFs5MV1UaGUgVW5peCBNYWtlZmlsZQorNC4yLiBbOTJdVGhlIEMtS2VybWl0IEluaXRpYWxpemF0aW9uIEZpbGUKKzQuMy4gWzkzXVRoZSAyLnggQlNEIE1ha2VmaWxlCis0LjQuIFs5NF1UaGUgUGxhbiA5IE1ha2VmaWxlCis0LjUuIFs5NV1NYWtlZmlsZSBGYWlsdXJlcworCisgICAoQWxzbyBzZWUgdGhlIFs5Nl1Db25maWd1cmF0aW9ucyBPcHRpb25zIGRvY3VtZW50LCBbOTddU2VjdGlvbiA4KS4KKworICAgTG90cyBvZiBuZXcgZmVhdHVyZXMgaGF2ZSBiZWVuIGFkZGVkIGluIHZlcnNpb25zIDcuMCBhbmQgOC4wIHRoYXQKKyAgIHJlcXVpcmUgYWNjZXNzIHRvIG5ldyBzeW1ib2xzLCBBUElzLCBsaWJyYXJpZXMsIGV0YywgYW5kIHRoaXMgd2lsbCBubworICAgZG91YnQgY2F1c2UgcHJvYmxlbXMgaW4gY29tcGlsaW5nLCBsaW5raW5nLCBvciBleGVjdXRpb24gb24gcGxhdGZvcm1zCisgICB3aGVyZSA2LjAgYW5kIGVhcmxpZXIgYnVpbHQgd2l0aG91dCBpbmNpZGVudC4gVGhpcyBzZWN0aW9uIGNvbnRhaW5zCisgICB3aGF0IHdlIGtub3cgYXMgb2YgdGhlIGRhdGUgb2YgdGhpcyBmaWxlLgorCisgICBUaGUgZmlyc3QgY2F0ZWdvcnkgY29uY2VybnMgdGhlIG5ldyBLZXJtaXQgU2VydmljZSBEYWVtb24gKElLU0Q7IHNlZQorICAgdGhlIFs5OF1JS1NEIEFkbWluaXN0cmF0b3IncyBHdWlkZSBmb3IgZGV0YWlscyk6CisKKyAgIFRoZSB3dG1wIEZpbGUKKyAgICAgICAgICBXaGVuIEMtS2VybWl0IGlzIHN0YXJ0ZWQgYXMgYW4gSUtTRCAodW5kZXIgaW5ldGQpLCBpdCBtYWtlcworICAgICAgICAgIHN5c2xvZyBhbmQgd3RtcCBlbnRyaWVzLCBhbmQgYWxzbyBrZWVwcyBpdHMgb3duIGZ0cGQtbGlrZSBsb2cuCisgICAgICAgICAgVGhlIGNvZGUgYXNzdW1lcyB0aGUgd3RtcCBsb2cgaXMgL3Zhci9sb2cvd3RtcCBvbiBMaW51eCBhbmQKKyAgICAgICAgICAvdXNyL2FkbS93dG1wIGVsc2V3aGVyZS4gTm8gZG91YnQgdGhpcyBhc3N1bXB0aW9uIHdpbGwgbmVlZAorICAgICAgICAgIGFkanVzdG1lbnQuIFVzZSAtRFdUTVBGSUxFPXBhdGggdG8gb3ZlcnJpZGUgYXQgY29tcGlsZSB0aW1lCisgICAgICAgICAgKHRoZXJlIGlzIGFsc28gYSBydW50aW1lIG92ZXJyaWRlKS4gU2VlIFs5OV1pa3NkLmh0bWwgZm9yCisgICAgICAgICAgZGV0YWlscy4KKworICAgVVRNUCwgdXRzbmFtZSgpLCBldGMKKyAgICAgICAgICBDLUtlcm1pdCA3LjAgZ2V0cyBhcyBtdWNoIGluZm8gYXMgaXQgY2FuIGFib3V0IGl0cyBqb2IgLS0KKyAgICAgICAgICBtYWlubHkgZm9yIElLU0QgbG9nZ2luZyAtLSBmcm9tIHV0bXAuIEJ1dCBvZiBjb3Vyc2UgdXRtcAorICAgICAgICAgIGZvcm1hdHMgYW5kIGZpZWxkcyBkaWZmZXIsIGFuZCBmb3IgdGhhdCBtYXR0ZXIsIHRoZXJlIGNhbiBiZQorICAgICAgICAgIHR3byBkaWZmZXJlbnQgaGVhZGVyIGZpbGVzLCA8dXRtcC5oPiBhbmQgPHV0bXB4Lmg+LiBMb29rIGZvcgorICAgICAgICAgIEhBVkVVVE1QWCBhbmQgSEFWRVVUSE9TVCBpbiBbMTAwXWNrdWZpby5jIGFuZCBsZXQgbWUga25vdyBvZgorICAgICAgICAgIGFueSBuZWVkZWQgYWRqdXN0bWVudHMuCisKKyAgIFBhc3N3b3JkIGxvb2t1cAorICAgICAgICAgIElLU0QgbmVlZHMgdG8gYXV0aGVudGljYXRlIGluY29taW5nIHVzZXJzIGFnYWluc3QgdGhlIHBhc3N3b3JkCisgICAgICAgICAgbGlzdC4gSW4gc29tZSBjYXNlcywgdGhpcyByZXF1aXJlcyB0aGUgYWRkaXRpb24gb2YgLWxjcnlwdAorICAgICAgICAgIChlLmcuIGluIFVuaXh3YXJlIDIueCkuIEluIG1vc3Qgb3RoZXJzLCB0aGUgY3J5cHQgZnVuY3Rpb25zIGFyZQorICAgICAgICAgIGluIHRoZSByZWd1bGFyIEMgbGlicmFyeS4gSWYgeW91IGdldCAiY3J5cHQiIGFzIGFuIHVucmVzb2x2ZWQKKyAgICAgICAgICBzeW1ib2wgYXQgbGluayB0aW1lLCBhZGQgLWxjcnlwdCB0byBMSUJTLiBJZiB5b3VyIHNpdGUgaGFzCisgICAgICAgICAgbG9jYWwgcmVwbGFjZW1lbnQgbGlicmFyaWVzIGZvciBhdXRoZW50aWNhdGlvbiwgeW91IG1pZ2h0IG5lZWQKKyAgICAgICAgICBhIHNwZWNpYWwgTElCUyBjbGF1c2Ugc3VjaCBhcyAiTElCUz0tTC91c3IvbG9jYWwvbGliIC1scHdlbnQiLgorCisgICAgICAgICAgVGhlc2UgZGF5cyBtb3N0IFVuaXggc3lzdGVtcyB0YWtlIGFkdmFudGFnZSBvZiBzaGFkb3cgcGFzc3dvcmQKKyAgICAgICAgICBmaWxlcyBvciBQbHVnYWJsZSBBdXRoZW50aWNhdGlvbiBNb2R1bGVzIChQQU0pLiBJZiB5b3VyIHN5c3RlbQorICAgICAgICAgIHVzZXMgc2hhZG93IHBhc3N3b3JkcyB5b3UgbXVzdCBhZGQgLURDS19TSEFET1cgdG8gdGhlIENGTEFHUworICAgICAgICAgIGxpc3QuIElmIHlvdXIgc3lzdGVtIHJlcXVpcmVzIFBBTSB5b3UgbXVzdCBhZGQgLURDS19QQU0gdG8gdGhlCisgICAgICAgICAgQ0ZMQUdTIGFuZCAtbHBhbSAtbGRsIHRvIExJQlMuCisKKyAgIGdldHVzZXJzaGVsbCgpCisgICAgICAgICAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIElLU0QgYXQgbG9naW4gdGltZSB0byBzZWUgaWYgYSB1c2VyIGhhcworICAgICAgICAgIGJlZW4gInR1cm5lZCBvZmYiLiBCdXQgbWFueSBVbml4IHBsYXRmb3JtcyBsYWNrIHRoaXMgZnVuY3Rpb24uCisgICAgICAgICAgSW4gdGhhdCBjYXNlLCB5b3Ugd2lsbCBnZXQgdW5yZXNvbHZlZCBzeW1ib2wgcmVwb3J0cyBhdCBsaW5rCisgICAgICAgICAgdGltZSBmb3IgX2dldHVzZXJzaGVsbCwgX2VuZHVzZXJzaGVsbDsgdG8gd29yayBhcm91bmQsIGFkZAorICAgICAgICAgIC1ETk9HRVRVU0VSU0hFTEwuCisKKyAgIGluaXRncm91cHMoKQorICAgICAgICAgIFRoaXMgaXMgY2FsbGVkIGJ5IElLU0QgYWZ0ZXIgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbi4gQnV0CisgICAgICAgICAgc29tZSBwbGF0Zm9ybXMgZG8gbm90IGhhdmUgdGhpcyBmdW5jdGlvbiwgc28gb2J2aW91c2x5IGl0IGNhbid0CisgICAgICAgICAgYmUgY2FsbGVkIHRoZXJlLCBpbiB3aGljaCBjYXNlIGFkZCAtRE5PSU5JVEdST1VQUy4KKworICAgc2V0cmV1aWQoKSwgc2V0cmV1aWQoKSwgc2V0cmVnaWQoKSBub3QgZm91bmQgb3IgImRlcHJlY2F0ZWQiCisgICAgICAgICAgRmluZCBvdXQgd2hhdCB5b3VyIFVuaXggdmFyaWV0eSB3YW50cyB5b3UgdG8gdXNlIGluc3RlYWQsIGFuZAorICAgICAgICAgIG1ha2UgYXBwcm9wcmlhdGUgc3Vic3RpdHV0aW9ucyBpbiByb3V0aW5lIHp2cGFzcygpLCBtb2R1bGUKKyAgICAgICAgICBbMTAxXWNrdWZpby5jLCBhbmQgWzEwMl1sZXQgdXMga25vdy4KKworICAgcHJpbnRmKCkKKyAgICAgICAgICBJS1NEIGluc3RhbGxzIGEgcHJpbnRmKCkgc3Vic3RpdHV0ZSB0byBhbGxvdyByZWRpcmVjdGlvbiBvZgorICAgICAgICAgIHByaW50Zi1saWtlIG91dHB1dCB0byB0aGUgY29ubmVjdGlvbi4gSG93ZXZlciwgdGhpcyBjYW4KKyAgICAgICAgICBjb25mbGljdCB3aXRoIHNvbWUgY3Vyc2VzIGxpYnJhcmllcy4gSW4gdGhpcyBjYXNlLCBzZXBhcmF0ZQorICAgICAgICAgIGJpbmFyaWVzIG11c3QgYmUgYnVpbHQgZm9yIElLU0QgYW5kIG5vbi1JS1NEIHVzZS4KKworICAgSWYgeW91IGVuY291bnRlciBkaWZmaWN1bHRpZXMgd2l0aCBhbnkgb2YgdGhlIGFib3ZlLCBhbmQgeW91IGFyZSBub3QKKyAgIGludGVyZXN0ZWQgaW4gcnVubmluZyBDLUtlcm1pdCBhcyBhbiBJS1NELCB0aGVuIHNpbXBseSBhZGQgTk9JS1NEIHRvCisgICBDRkxBR1MgYW5kIHJlYnVpbGQuIEV4YW1wbGU6CisKK21ha2Ugc2NvMjg2CisoZ2V0IGxvdHMgb2YgZXJyb3JzKQorbWFrZSBjbGVhbgorbWFrZSBzY28yODYgIktGTEFHUz0tRE5PSUtTRCIKKworICAgU29tZSBub24tSUtTRCB0aGluZ3MgdG8gd2F0Y2ggb3V0IGZvcjoKKworICAgUmV0dXJuIHR5cGUgb2YgbWFpbigpCisgICAgICAgICAgVGhlIG1haW4oKSByb3V0aW5lIGlzIGluIFsxMDNdY2tjbWFpLmMuIElmIHlvdSBnZXQgY29tcGxhaW50cworICAgICAgICAgIGFib3V0ICJtYWluOiByZXR1cm4gdHlwZSBpcyBub3QgYmxhaCIsIGRlZmluZSBNQUlOVFlQRSBvbiB0aGUKKyAgICAgICAgICBDQyBjb21tYW5kIGxpbmUsIGUuZy46CisKK21ha2UgeHh4ICJLRkxBR1M9LURNQUlOVFlQRT1ibGFoCisKKyAgICAgICAgICAod2hlcmUgYmxhaCBpcyBpbnQsIGxvbmcsIG9yIHdoYXRldmVyKS4gSWYgdGhlIGNvbXBsYWludCBpcworICAgICAgICAgICJBdHRlbXB0IHRvIHJldHVybiBhIHZhbHVlIGZyb20gYSBmdW5jdGlvbiBvZiB0eXBlIHZvaWQiIHRoZW4KKyAgICAgICAgICBhZGQgLURNQUlOSVNWT0lEOgorCittYWtlIHh4eCAiS0ZMQUdTPS1ETUFJTklTVk9JRD1ibGFoCisKKyAgIEROUyBTZXJ2aWNlIFJlY29yZHMKKyAgICAgICAgICBUaGlzIGZlYXR1cmUgYWxsb3dzIGEgcmVtb3RlIGhvc3QgdG8gcmVkaXJlY3QgQy1LZXJtaXQgdG8gdGhlCisgICAgICAgICAgYXBwcm9wcmlhdGUgc29ja2V0IGZvciB0aGUgcmVxdWVzdGVkIHNlcnZpY2U7IGUuZy4gaWYgQy1LZXJtaXQKKyAgICAgICAgICByZXF1ZXN0cyBzZXJ2aWNlICJ0ZWxuZXQiIGFuZCB0aGUgaG9zdCBvZmZlcnMgVGVsbmV0IHNlcnZpY2Ugb24KKyAgICAgICAgICBwb3J0IDk5OSByYXRoZXIgdGhhbiB0aGUgY3VzdG9tYXJ5IHBvcnQgMjMuIElmIHlvdSBnZXQKKyAgICAgICAgICBjb21waWxlLXRpbWUgY29tcGxhaW50cyBhYm91dCBub3QgYmVpbmcgYWJsZSB0byBmaW5kCisgICAgICAgICAgPHJlc29sdi5oPiwgPG5ldGRiLmg+LCBvciA8YXJwYS9uYW1lc2VyLmg+LCBhZGQgLUROT19ETlNfU1JWIHRvCisgICAgICAgICAgQ0ZMQUdTLiBJZiB5b3UgZ2V0IGxpbmstdGltZSBjb21wbGFpbnRzIGFib3V0IHVucmVzb2x2ZWQKKyAgICAgICAgICBzeW1ib2xzIHJlc19zZWFyY2ggb3IgZG5fZXhwYW5kLCB0cnkgYWRkaW5nIC1scmVzb2x2ZSB0byBMSUJTLgorCisgICBcdihpcGFkZHJlc3MpCisgICAgICAgICAgSWYgImVjaG8gXHYoaXBhZGRyZXNzKSIgc2hvd3MgYW4gZW1wdHkgc3RyaW5nIHJhdGhlciB0aGFuIHlvdXIKKyAgICAgICAgICBsb2NhbCBJUCBhZGRyZXNzLCBhZGQgLURDS0dITkxIT1NUIHRvIENGTEFHUyBhbmQgcmVidWlsZC4KKworICAgPHN5cy93YWl0Lmg+CisgICAgICAgICAgSWYgdGhpcyBmaWxlIGNhbid0IGJlIGZvdW5kIGF0IGNvbXBpbGUgdGltZSwgYWRkIC1ETk9SRURJUkVDVAorICAgICAgICAgIHRvIENGTEFHUy4gVGhpcyBkaXNhYmxlcyB0aGUgUkVESVJFQ1QgYW5kIFBJUEUgY29tbWFuZHMgYW5kCisgICAgICAgICAgYW55dGhpbmcgZWxzZSB0aGF0IG5lZWRzIHRoZSB3YWl0KCkgc3lzdGVtIHNlcnZpY2UuCisKKyAgIHN5c2xvZygpCisgICAgICAgICAgQy1LZXJtaXQgY2FuIG5vdyB3cml0ZSBzeXNsb2cgcmVjb3Jkcy4gU29tZSBvbGRlciBwbGF0Zm9ybXMKKyAgICAgICAgICBtaWdodCBub3QgaGF2ZSB0aGUgc3lzbG9nIGZhY2lsaXR5LiBJbiB0aGF0IGNhc2UsIGFkZAorICAgICAgICAgIC1ETk9TWVNMT0cuIE90aGVycyBtaWdodCBoYXZlIGl0LCBidXQgcmVxdWlyZSBhZGRpdGlvbiBvZgorICAgICAgICAgIC1sc29ja2V0IHRvIExJQlMgKFNDTyBPU1I1IGlzIGFuIGV4YW1wbGUpLiBTZWUgWzEwNF1TZWN0aW9uIDE1LgorCisgICBwdXRlbnYoKQorICAgICAgICAgIElmICJfcHV0ZW52IiBjb21lcyB1cCBhcyBhbiB1bmRlZmluZWQgc3ltYm9sLCBhZGQgLUROT1BVVEVOViB0bworICAgICAgICAgIENGTEFHUyBhbmQgcmVidWlsZC4KKworICAgIlBhc3NpbmcgYXJnMSBvZiAndGltZScgZnJvbSBpbmNvbXBhdGlibGUgcG9pbnRlciIKKyAgICAgICAgICBUaGlzIGlzIGEgbWVzcy4gU2VlIHRoZSBtYXNzIG9mICNpZmRlZnMgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgbW9kdWxlLCBbMTA1XWNrdXRpby5jIG9yIFsxMDZdY2t1ZmlvLmMuCisKKyAgIGdldHRpbWVvZmRheSgpCisgICAgICAgICAgV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy4gT24gbW9zdCBwbGF0Zm9ybXMsIGdldHRpbWVvZmRheSgpCisgICAgICAgICAgdGFrZXMgdHdvIGFyZ3VtZW50cywgYnV0IG9uIGEgaGFuZGZ1bCBvZiBvdGhlcnMgKGUuZy4gTW90b3JvbGEKKyAgICAgICAgICBTeXN0ZW0gVi84OCBWNCwgU05JIFJlbGlhbnQgVU5JWCA1LjQzLCBldGMpIGl0IHRha2VzIG9uZS4gSWYKKyAgICAgICAgICB5b3VyIHZlcnNpb24gb2YgZ2V0dGltZW9mZGF5KCkgaXMgYmVpbmcgY2FsbGVkIHdpdGggdHdvIGFyZ3MKKyAgICAgICAgICBidXQgd2FudHMgb25lLCBhZGQgLURHVE9ET05FQVJHLgorCisgICAiQXNzaWdubWVudCBtYWtlcyBwb2ludGVyIGZyb20gaW50ZWdlciB3aXRob3V0IGEgY2FzdCIKKyAgICAgICAgICBUaGlzIHdhcm5pbmcgbWlnaHQgYXBwZWFyIGluIFsxMDddY2t1dGlvLmMgb3IgWzEwOF1ja3VmaW8uYy4KKyAgICAgICAgICAob3IgZWxzZXdoZXJlKSwgYW5kIHVzdWFsbHkgY2FuIGJlIHRyYWNlZCB0byB0aGUgdXNlIG9mIGEKKyAgICAgICAgICBzeXN0ZW0gb3IgbGlicmFyeSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwb2ludGVyIGJ1dCB0aGF0IGlzCisgICAgICAgICAgbm90IGRlY2xhcmVkIGluIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGV2ZW4gdGhvdWdoIGl0IHNob3VsZAorICAgICAgICAgIGJlLiBTZXZlcmFsIGZ1bmN0aW9ucyBhcmUgY29tbW9ubHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3I6CisKKyAgICAgICAgICArIGdldGN3ZCgpOiBBZGQgLUREQ0xHRVRDV0QgdG8gQ0ZMQUdTIGFuZCByZWJ1aWxkLgorICAgICAgICAgICsgcG9wZW4oKSA6IEFkZCAtRERDTFBPUEVOIHRvIENGTEFHUyBhbmQgcmVidWlsZC4KKyAgICAgICAgICArIGZkb3BlbigpOiBBZGQgLUREQ0xGRE9QRU4gdG8gQ0ZMQUdTIGFuZCByZWJ1aWxkLgorCisgICAiT3BlcmFuZHMgb2YgPSBoYXZlIGluY29tcGF0aWJsZSB0eXBlcyIKKyAgICJJbmNvbXBhdGlibGUgdHlwZXMgaW4gYXNzaWdubWVudCIKKyAgICAgICAgICBJZiB0aGlzIGNvbWVzIGZyb20gWzEwOV1ja2NuZXQuYyBhbmQgY29tZXMgZnJvbSBhIHN0YXRlbWVudAorICAgICAgICAgIGludm9sdmluZyBpbmV0X2FkZHIoKSwgdHJ5IGFkZGluZyAtRElOQUREUlggdG8gQ0ZMQUdTLiBJZiB0aGF0CisgICAgICAgICAgZG9lc24ndCBoZWxwLCB0aGVuIHRyeSBhZGRpbmcgLUROT01ISE9TVC4KKworICAgQ29tcGxhaW50cyBhYm91dCBhcmdzIHRvIGdldC9zZXRzb2Nrb3B0KCksIGdldHBlZXJuYW1lKCksCisgICAgICAgICAgZ2V0c29ja25hbWUoKQorICAgICAgICAgIFRoZXNlIGFyZSBhbGwgaW4gWzExMF1ja2NuZXQuYy4gRGlmZmVyZW50IHBsYXRmb3JtcyBhbmQgT1MncworICAgICAgICAgIGFuZCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBPUyBjaGFuZ2UgdGhpcyBhbGwgdGhlIHRpbWU6IGludCwKKyAgICAgICAgICBzaXplX3QsIHVuc2lnbmVkIGxvbmcsIGV0Yy4gQWxsIHRoZSBhZmZlY3RlZCB2YXJpYWJsZXMgYXJlCisgICAgICAgICAgZGVjbGFyZWQgYWNjb3JkaW5nIHRvICNpZmRlZnMgd2l0aGluIGNrY25ldC5jLCBzbyBmaW5kIHRoZQorICAgICAgICAgIGRlY2xhcmF0aW9ucyBhbmQgYWRqdXN0IHRoZSAjaWZkZWZzIGFjY29yZGluZ2x5LgorCisgICBzaXplX3QKKyAgICAgICAgICBJbiBjYXNlIG9mIGNvbXBsYWludHMgYWJvdXQgInVua25vd24gdHlwZSBzaXplX3QiLCBhZGQKKyAgICAgICAgICAtRFNJWkVfVD1pbnQgKG9yIG90aGVyIGFwcHJvcHJpYXRlIHR5cGUpIHRvIENGTEFHUy4KKworICAgJ3R6JyB1bmRlZmluZWQKKyAgIFVzZSBvZiB1bmRlZmluZWQgZW51bS9zdHJ1Y3QvdW5pb24gJ3RpbWV6b25lJworICAgICAgICAgIExlZnQgb2YgJ3R2X3NlYycgc3BlY2lmaWVzIHVuZGVmaW5lZCBzdHJ1Y3QvdW5pb24gJ3RpbWV2YWwnIEFuZAorICAgICAgICAgIHNpbWlsYXIgY29tcGxhaW50cyBpbiBbMTExXWNrdXRpby5jOiBBZGQgLUROT0dGVElNRVIgYW5kL29yCisgICAgICAgICAgLUROT1RJTUVWQUwuCisKKyAgIFN5bWxpbmtzCisgICAgICAgICAgVGhlIG5ldyBidWlsdC1pbiBESVJFQ1RPUlkgY29tbWFuZCBzaG91bGQgc2hvdyBzeW1saW5rcyBsaWtlCisgICAgICAgICAgImxzIC1sIiBkb2VzLiBJZiBpdCBkb2VzIG5vdCwgY2hlY2sgdG8gc2VlIGlmIHlvdXIgcGxhdGZvcm0gaGFzCisgICAgICAgICAgdGhlIGxzdGF0KCkgYW5kIHJlYWRsaW5rKCkgZnVuY3Rpb25zLiBJZiBzbywgYWRkIC1EVVNFX0xTVEFUCisgICAgICAgICAgYW5kIC1EQ0tTWU1MSU5LIHRvIENGTEFHUyBhbmQgcmVidWlsZC4gT24gdGhlIG90aGVyIGhhbmQsIGlmCisgICAgICAgICAgbHN0YXQoKSBpcyB1bnJlc29sdmVkIGF0IGxpbmsgdGltZSwgYWRkIC1ETk9MU1RBVCB0byBDRkxBR1MuIElmCisgICAgICAgICAgcmVhZGxpbmsoKSBpcyBhbHNvIHVucmVzb2x2ZWQsIGFkZCAtRE5PU1lNTElOSy4KKworICAgcmVhbHBhdGgoKQorICAgICAgICAgIExpbmstdGltZSBjb21wbGFpbnMgYWJvdXQgcmVhbHBhdGgoKSAtLSBmaW5kIHRoZSBsaWJyYXJ5IGluCisgICAgICAgICAgd2hpY2ggaXQgcmVzaWRlcyBhbmQgYWRkIGl0IHRvIExJQlMgKGV4YW1wbGUgZm9yIFVuaXh3YXJlIDcuMToKKyAgICAgICAgICAiLWxjdWRrNzAiKSBvciBhZGQgLUROT1JFQUxQQVRIIHRvIENGTEFHUyBhbmQgcmVidWlsZC4gSWYgYnVpbHQKKyAgICAgICAgICB3aXRoIHJlYWxwYXRoKCkgYnV0IGRlYnVnIGxvZyBmaWxlIGlzIHRydW5jYXRlZCBvciBtYW5nbGVkLAorICAgICAgICAgIGRpdHRvIChzb21lIHJlYWxwYXRoKCkgaW1wbGVtZW50YXRpb25zIGJlaGF2ZSBkaWZmZXJlbnRseSBmcm9tCisgICAgICAgICAgb3RoZXJzKS4gSWYgYnVpbHQgd2l0aCByZWFscGF0aCgpIGFuZCBzZWVtaW5nbHkgcmFuZG9tIGNvcmUKKyAgICAgICAgICBkdW1wcyBvY2N1ciBkdXJpbmcgZmlsZSBwYXRoIHJlc29sdXRpb24sIGRpdHRvLgorCisgICBGYWlsdXJlIHRvIGxvY2F0ZSBoZWFkZXIgZmlsZSA8dGVybS5oPgorICAgICAgICAgIFVzdWFsbHkgaGFwcGVucyBvbiBMaW51eCBzeXN0ZW1zIHRoYXQgaGF2ZSB0aGUgQyBjb21waWxlcgorICAgICAgICAgIGluc3RhbGxlZCwgYnV0IG5vdCB0aGUgbmN1cnNlcyBwYWNrYWdlIChzZWUgY29tbWVudHMgYWJvdXQKKyAgICAgICAgICBzZWxlY3RpdmUgaW5zdGFsbHMgYWJvdmUpLiBHbyBiYWNrIGFuZCBpbnN0YWxsIG5jdXJzZXMsIG9yIHVzZQorICAgICAgICAgICJtYWtlIGxpbnV4bmMiIChMaW51eCBObyBDdXJzZXMpLgorCisgICAiQ2FuJ3QgZmluZCBzaGFyZWQgbGlicmFyeSBsaWJjLnNvLjIuMSIKKyAgICJDYW4ndCBmaW5kIHNoYXJlZCBsaWJyYXJ5IGxpYm5jdXJzZXMuc28uMy4wIiwgZXRjLi4uCisgICAgICAgICAgWW91IGFyZSB0cnlpbmcgdG8gcnVuIGEgYmluYXJ5IHRoYXQgd2FzIGJ1aWx0IG9uIGEgY29tcHV0ZXIKKyAgICAgICAgICB0aGF0IGhhcyBkaWZmZXJlbnQgbGlicmFyeSB2ZXJzaW9ucyB0aGFuIHlvdXIgY29tcHV0ZXIsIGFuZAorICAgICAgICAgIHlvdXIgY29tcHV0ZXIncyBsb2FkZXIgaXMgcGlja3kgYWJvdXQgbGlicmFyeSB2ZXJzaW9uIG51bWJlcnMuCisgICAgICAgICAgUmVidWlsZCBmcm9tIHNvdXJjZSBvbiB5b3VyIGNvbXB1dGVyLgorCisgICBUaW1lIChzdHJ1Y3QgdG0pIHJlbGF0ZWQgZGlmZmljdWx0aWVzOgorICAgICAgICAgIEVycm9ycyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyJja3V0aW8uYyIsIGxpbmUgMTE5OTQ6IGluY29tcGxldGUgc3RydWN0L3VuaW9uL2VudW0gdG06IF90bQorImNrdXRpby5jIiwgbGluZSAxMTk5NTogZXJyb3I6IGNhbm5vdCBkZXJlZmVyZW5jZSBub24tcG9pbnRlciB0eXBlCisiY2t1dGlvLmMiLCBsaW5lIDExOTk1OiBlcnJvcjogYXNzaWdubWVudCB0eXBlIG1pc21hdGNoCisiY2t1dGlvLmMiLCBsaW5lIDExOTk3OiB3YXJuaW5nOiB1c2luZyBvdXQgb2Ygc2NvcGUgZGVjbGFyYXRpb246IGxvY2FsdGltZQorImNrdXRpby5jIiwgbGluZSAxMTk5NzogZXJyb3I6IHVua25vd24gb3BlcmFuZCBzaXplOiBvcCAiPSIKKyJja3V0aW8uYyIsIGxpbmUgMTE5OTc6IGVycm9yOiBhc3NpZ25tZW50IHR5cGUgbWlzbWF0Y2gKKyJja3V0aW8uYyIsIGxpbmUgMTE5OTg6IGVycm9yOiB1bmRlZmluZWQgc3RydWN0L3VuaW9uIG1lbWJlcjogdG1feWVhcgorImNrdXRpby5jIiwgbGluZSAxMjAwMDogZXJyb3I6IHVuZGVmaW5lZCBzdHJ1Y3QvdW5pb24gbWVtYmVyOiB0bV9tb24KKyJja3V0aW8uYyIsIGxpbmUgMTIwMDE6IGVycm9yOiB1bmRlZmluZWQgc3RydWN0L3VuaW9uIG1lbWJlcjogdG1fbWRheQorImNrdXRpby5jIiwgbGluZSAxMjAwMjogZXJyb3I6IHVuZGVmaW5lZCBzdHJ1Y3QvdW5pb24gbWVtYmVyOiB0bV9ob3VyCisiY2t1dGlvLmMiLCBsaW5lIDEyMDAzOiBlcnJvcjogdW5kZWZpbmVkIHN0cnVjdC91bmlvbiBtZW1iZXI6IHRtX21pbgorImNrdXRpby5jIiwgbGluZSAxMjAwNDogZXJyb3I6IHVuZGVmaW5lZCBzdHJ1Y3QvdW5pb24gbWVtYmVyOiB0bV9zZWMKKworICAgICAgICAgIGFyZSBkdWUgdG8gZmFpbHVyZSB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSB0aW1lLmggaGVhZGVyCisgICAgICAgICAgZmlsZXMuIFVuaXggcGxhdGZvcm1zIGdlbmVyYWxseSBoYXZlIG9uZSBvciBtb3JlIG9mIHRoZQorICAgICAgICAgIGZvbGxvd2luZzogPHRpbWUuaD4sIDxzeXMvdGltZS5oPiwgYW5kIDxzeXMvdGltZWIuaD4uIEFueQorICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIHRoZXNlIG1pZ2h0IGJlIHJlcXVpcmVkLiBEZWZhdWx0cyBhcmUgc2V0IHVwIGZvcgorICAgICAgICAgIGVhY2ggbWFrZWZpbGUgdGFyZ2V0LiBUaGUgZGVmYXVsdHMgY2FuIGJlIGNvcnJlY3RlZCBvbiB0aGUgQ0MKKyAgICAgICAgICBjb21tYW5kIGxpbmUgYnkgYWRkaW5nIHRoZSBhcHByb3ByaWF0ZSBkZWZpbml0aW9uIGZyb20gdGhlCisgICAgICAgICAgZm9sbG93aW5nIGxpc3QgdG8gQ0ZMQUdTOgorCistRFRJTUVIICAgICAgICAgSW5jbHVkZSA8dGltZS5oPgorLUROT1RJTUVIICAgICAgIERvbid0IGluY2x1ZGUgPHRpbWUuaD4KKy1EU1lTVElNRUggICAgICBJbmNsdWRlIDxzeXMvdGltZS5oPgorLUROT1NZU1RJTUVIICAgIERvbid0IGluY2x1ZGUgPHN5cy90aW1lLmg+CistRFNZU1RJTUVCSCAgICAgSW5jbHVkZSA8c3lzL3RpbWViLmg+CistRE5PU1lTVElNRUJIICAgRG9uJ3QgaW5jbHVkZSA8c3lzL3RpbWViLmg+CisKKyAgICAgICAgICBOb3RlIHRoYXQgPHN5cy90aW1lYi5oPiBpcyByZWxhdGl2ZWx5IHNjYXJjZSBpbiB0aGUgU3lzdGVtIFYKKyAgICAgICAgICBhbmQgUE9TSVggZW52aXJvbm1lbnRzOyB0aGUgb25seSBwbGF0Zm9ybSBvZiByZWNlbnQgdmludGFnZQorICAgICAgICAgIHdoZXJlIGl0IHdhcy9pcyB1c2VkIGlzIE9TRi8xIGFuZCBpdHMgZGVyaXZhdGl2ZXMgKERpZ2l0YWwgVW5peAorICAgICAgICAgIGFuZCBUcnU2NCBVbml4KS4KKworICAgU3RydWN0IHRpbWV2YWwgYW5kL29yIHRpbWV6b25lIG5vdCBkZWNsYXJlZDoKKyAgICAgICAgICBJbiBzb21lIGNhc2VzLCBtZXJlbHkgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSB0aW1lLmggaGVhZGVyCisgICAgICAgICAgZmlsZXMgaXMgc3RpbGwgbm90IGVub3VnaC4gUE9TSVguMSBkb2VzIG5vdCBkZWZpbmUgdGhlIHRpbWV2YWwKKyAgICAgICAgICBzdHJ1Y3QsIGFuZCBzbyB0aGUgaXRlbXMgd2UgbmVlZCBmcm9tIHRoZSBoZWFkZXIgYXJlIHByb3RlY3RlZAorICAgICAgICAgIGFnYWluc3QgdXMgYnkgI2lmbmRlZiBfUE9TSVhfU09VUkNFIG9yIHNvbWVzdWNoLiBJbiB0aGlzIGNhc2UsCisgICAgICAgICAgd2UgaGF2ZSB0byBkZWNsYXJlIHRoZSB0aW1ldmFsIChhbmQgdGltZXpvbmUpIHN0cnVjdHMKKyAgICAgICAgICBvdXJzZWx2ZXMuIFRvIGZvcmNlIHRoaXMsIGluY2x1ZGUgLUREQ0xUSU1FVkFMIGluIENGTEFHUy4KKworICAgV2FybmluZ3MgYWJvdXQgZG5fZXhwYW5kKCkgQXJndW1lbnQgIzQKKyAgICAgICAgICBXQVJOSU5HOiBhcmd1bWVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCBwcm90b3R5cC4gSXQncyB0aGUgb2xkCisgICAgICAgICAgY2hhciB2ZXJzdXMgdW5zaWduZWQgY2hhciBzdHVwaWRpdHkgYWdhaW4uIFRyeSB0byBmaW5kIGEKKyAgICAgICAgICBjb21waWxlciBzd2l0Y2ggbGlrZSBHQ0MncyAiLWZ1bnNpZ25lZC1jaGFyIi4gRmFpbGluZyB0aGF0LCBhZGQKKyAgICAgICAgICAtRENLUVVFUllUWVBFPXh4eCB0byBDRkxBR1MsIHdoZXJlIHh4eCBpcyB3aGF0ZXZlciAnbWFuCisgICAgICAgICAgZG5fZXhwYW5kJyB0ZWxscyB5b3UgdGhlIHR5cGUgb2YgdGhlIDR0aCBhcmd1bWVudCBzaG91bGQgYmUKKyAgICAgICAgICAocHJlc3VtYWJseSBlaXRoZXIgY2hhciBvciB1bnNpZ25lZCBjaGFyOyBpbiB0aGUgbGF0dGVyIGNhc2UKKyAgICAgICAgICB1c2UgQ0hBUiB0byBhdm9pZCBjb25mdXNpb24gY2F1c2VkIGJ5IG11bHRpcGxlIHdvcmRzLgorCisgICBTd2l0Y2ggVGFibGUgT3ZlcmZsb3cgKGluIFsxMTJdY2tjdW5pLmMpCisgICAgICAgICAgQWRkIC1ETk9VTklDT0RFIHRvIENGTEFHUy4KKworICAgQ29tcGlsZS10aW1lIHdhcm5pbmdzIGFib3V0IGNrX291dCgpIG9yIHRnZXRzdHIoKSBvciB0cHV0cygpOgorICAgICAgICAgIEVhc3kgc29sdXRpb246IEFkZCAtRE5PVEVSTUNBUCB0byBDRkxBR1MuIEJ1dCB0aGVuIHlvdSBsb3NlIHRoZQorICAgICAgICAgIFNDUkVFTiBmdW5jdGlvbi4gUmVhbCBzb2x1dGlvbjogVHJ5IGFsbCBkaWZmZXJlbnQgY29tYmluYXRpb25zCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBDRkxBR1M6CisKKy1EVFBVVFNBUkdUWVBFPWNoYXIgICAgLURUUFVUU0ZOVFlQRT1pbnQKKy1EVFBVVFNBUkdUWVBFPWludCAgICAgLURUUFVUU0ZOVFlQRT12b2lkCisKKyAgICAgICAgICBVbnRpbCB0aGUgd2FybmluZ3MgZ28gYXdheSwgZXhjZXB0IG1heWJlICJja19vdXRjOiByZXR1cm4gd2l0aAorICAgICAgICAgIGEgdmFsdWUgaW4gYSBmdW5jdGlvbiByZXR1cm5pbmcgdm9pZCIsIGFuZCBpbiB0aGF0IGNhc2UgYWxzbworICAgICAgICAgIGFkZCAtRFRQVVRTSVNWT0lELgorCisgICAiUGFzc2luZyBhcmcgMSBvZiB0byB0cHV0cygpIG1ha2VzIHBvaW50ZXIgZnJvbSBpbnRlZ2VyIHdpdGhvdXQgYQorICAgICAgICAgIGNhc3QiOgorICAgICAgICAgIEFkZCAtRFRQVVRTQVJHMUNPTlNUIHRvIENGTEFHUy4KKworICAgIlVuZGVmaW5lZCBzeW1ib2w6IGR1cDIiCisgICAgICAgICAgQWRkIC1ETk9aRVhFQyB0byBDRkxBR1MuCisKKyAgICJoZWFkZXIgZmlsZSAndGVybWNhcC5oJyBub3QgZm91bmQiCisgICAgICAgICAgQWRkIC1ETk9IVEVSTUNBUCB0byBDRkxBR1MuCisKKyAgIE90aGVyIGRpZmZpY3VsdGllcyBhcmUgZ2VuZXJhbGx5IG9mIHRoZSAid2hlcmUgaXMgY3Vyc2VzLmggYW5kIHdoYXQgaXMKKyAgIGl0IGNhbGxlZCB0aGlzIHdlZWs/IiB2YXJpZXR5IChtb3N0IGVhc2lseSBzb2x2ZWQgYnkgbWFraW5nIHN5bWxpbmtzCisgICBpbiB0aGUgaW5jbHVkZSBhbmQgbGliIGRpcmVjdG9yaWVzKSwgb3Igb3ZlcnplYWxvdXMgY29tcGxhaW50cworICAgcmVnYXJkaW5nIHR5cGUgbWlzbWF0Y2hlcyBpbiBmdW5jdGlvbiBjYWxscyBiZWNhdXNlIG9mIHRoZSB0b3RhbGx5CisgICBuZWVkbGVzcyBhbmQgc2lsbHkgc2lnbmVkIHZlcnN1cyB1bnNpZ25lZCBjaGFyIGNvbmZsaWN0ICgqKSwgZXRjLiBJbgorICAgYW55IGNhc2UsIHBsZWFzZSBzZW5kIGFueSBjb21waWxhdGlvbiBvciBsaW5raW5nIHdhcm5pbmdzIG9yIGVycm9ycyB0bworICAgdGhlIGF1dGhvciwgcHJlZmVyYWJseSBhbG9uZyB3aXRoIGZpeGVzLgorCisgICAgICogQy1LZXJtaXQgZG9lcyBub3QgdXNlIHRoZSBzaWduZWQgcHJvcGVydHkgb2YgY2hhcnMgYXQgYWxsCisgICAgICAgYW55d2hlcmUsIGV2ZXIuIFNvIGlmIGFsbCBjaGFycyBhbmQgY2hhciAqJ3MgY2FuIGJlIG1hZGUgdW5zaWduZWQKKyAgICAgICBhdCBjb21waWxlIHRpbWUsIGFzIHRoZXkgY2FuIGluIGdjYyB3aXRoICItZnVuc2lnbmVkLWNoYXIiLCB0aGV5CisgICAgICAgc2hvdWxkIGJlLgorCisgICBJTVBPUlRBTlQ6IElmIHlvdSBmaW5kIGFueSBvZiB0aGVzZSBoaW50cyBuZWNlc3NhcnkgZm9yIGEgcGFydGljdWxhcgorICAgbWFrZSB0YXJnZXQgKG9yIHlvdSBoaXQgdXBvbiBvdGhlcnMgbm90IGxpc3RlZCBoZXJlKSwgUExFQVNFIFNFTkQgQQorICAgUkVQT1JUIFRPOgorCitbMTEzXWtlcm1pdC1zdXBwb3J0QGNvbHVtYmlhLmVkdQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDQuMS4gVGhlIFVuaXggTWFrZWZpbGUKKworICAgWyBbMTE0XVRvcCBdIFsgWzExNV1Db250ZW50cyBdIFsgWzExNl1TZWN0aW9uIENvbnRlbnRzIF0gWyBbMTE3XU5leHQgXQorICAgWyBbMTE4XVByZXZpb3VzIF0KKworICAgSWYgeW91ciBkaXN0cmlidXRpb24gZG9lcyBub3QgY29udGFpbiBhIGZpbGUgd2l0aCB0aGUgbmFtZSAibWFrZWZpbGUiCisgICBvciAiTWFrZWZpbGUiLCB0aGVuIHJlbmFtZSB0aGUgZmlsZSBjYWxsZWQgY2t1a2VyLm1hayB0byBtYWtlZmlsZToKKworbXYgY2t1a2VyLm1hayBtYWtlZmlsZQorCisgICBUaGVuIHR5cGUgIm1ha2UgeHh4Iiwgd2hlcmUgeHh4IGlzIHRoZSBwbGF0Zm9ybSB5b3Ugd2FudCB0byBidWlsZAorICAgQy1LZXJtaXQgZm9yLiBUaGVzZSBhcmUgbGlzdGVkIGluIHRoZSBbMTE5XWNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhlCisgICBtYWtlZmlsZS4gRm9yIGV4YW1wbGUsIHRvIGJ1aWxkIEMtS2VybWl0IGZvciBMaW51eCwgdHlwZToKKworbWFrZSBsaW51eAorCisgICBIZXJlIGFyZSBzb21lIHR5cGljYWwgZXhhbXBsZXM6CisKKyAgICAgVGFyZ2V0ICAgIERlc2NyaXB0aW9uCisgICAgIGxpbnV4ICAgICBMaW51eCwgYW55IHZlcnNpb24gb24gYW55IGhhcmR3YXJlIHBsYXRmb3JtCisgICAgIG9wZW5ic2QgICBPcGVuQlNELCBhbnkgdmVyc2lvbiBvbiBhbnkgaGFyZHdhcmUgcGxhdGZvcm0KKyAgICAgYWl4NDMgICAgIEFJWCA0LjMKKyAgICAgYWl4NDNnICAgIEFJWCA0LjMsIGJ1aWx0IHdpdGggZ2NjCisgICAgIHNvbGFyaXM5ICBTb2xhcmlzIDkKKyAgICAgc29sYXJpczlnIFNvbGFyaXMgOSBidWlsdCB3aXRoIGdjYworICAgICBocHV4MTEwMCAgSFAtVVggMTEtcG9pbnQtYW55dGhpbmcKKworICAgVGhlIG1ha2VmaWxlIGlzIHF1aXRlIGxvbmcsIGFuZCBhdCBsZWFzdCB0d28gdmVyc2lvbnMgb2YgVW5peCwgU0NPCisgICBYZW5peC8yODYgYW5kIDIueCBCU0QsIGNhbm5vdCBjb3BlIHdpdGggaXRzIGxlbmd0aC4gQW4gYXR0ZW1wdCB0bworICAgIm1ha2Ugc2NvMjg2IiBnaXZlcyB0aGUgbWVzc2FnZSAiTWFrZTogQ2Fubm90IGFsbG9jIG1lbSBmb3IgZW52Li4KKyAgIFN0b3AiLiBTb2x1dGlvbjogZWRpdCBhd2F5IHNvbWUgb3IgYWxsIG9mIHRoZSBub25yZWxldmFudCBtYXRlcmlhbAorICAgZnJvbSB0aGUgbWFrZWZpbGUuIChBIHNlcGFyYXRlIHZlcnNpb24gb2YgdGhlIG1ha2VmaWxlIGlzIHByb3ZpZGVkIGZvcgorICAgQlNEIDIueDogY2t1YnMyLm1hayBidXQgQy1LZXJtaXQgOC4wIGNhbid0IGJlIGJ1aWx0IGZvciBCU0QgMi54IC0tIGl0CisgICBoYXMgc2ltcGx5IGdyb3duIHRvbyBsYXJnZS4pCisKKyAgIFNvbWUgbWFrZSBwcm9ncmFtcyByZXBvcnRlZGx5IGNhbm5vdCBoYW5kbGUgY29udGludWVkIGxpbmVzIChsaW5lcworICAgZW5kaW5nIGluIGJhY2tzbGFzaCAoXCkpLiBJZiB5b3UgaGF2ZSBhIHByb2JsZW0gd2l0aCB0aGUgbWFrZWZpbGUsIHRyeQorICAgZWRpdGluZyB0aGUgbWFrZWZpbGUgdG8gam9pbiB0aGUgY29udGludWVkIGxpbmVzIChyZW1vdmUgdGhlCisgICBiYWNrc2xhc2hlcyBhbmQgdGhlIGZvbGxvd2luZyBsaW5lZmVlZCkuCisKKyAgIE90aGVyIG1ha2VmaWxlIHRyb3VibGVzIG1heSBvY2N1ciBiZWNhdXNlIHRhYnMgaW4gdGhlIG1ha2VmaWxlIGhhdmUKKyAgIHNvbWVob3cgYmVlbiBjb252ZXJ0ZWQgdG8gc3BhY2VzLiBTcGFjZXMgYW5kIHRhYnMgYXJlIGRpc3RpbmN0IGluIFVuaXgKKyAgIG1ha2VmaWxlcy4KKworICAgU2ltaWxhcmx5LCBjYXJyaWFnZSByZXR1cm5zIG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgZW5kIG9mIGVhY2gKKyAgIGxpbmUsIHdoaWNoIGFsc28gcHJvdmVzIGNvbmZ1c2luZyB0byBtb3N0IFVuaXggdmVyc2lvbnMgb2YgbWFrZS4KKworICAgQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBjb21tZW50cyBhYm91dCB5b3VyIHBhcnRpY3VsYXIgdmVyc2lvbiBpbgorICAgaXRzIG1ha2VmaWxlIHRhcmdldCBpdHNlbGYuIEluIGEgdGV4dCBlZGl0b3Igc3VjaCBhcyBFTUFDUyBvciBWSSwKKyAgIHNlYXJjaCBmb3IgdGhlIG1ha2UgZW50cnkgbmFtZSBmb2xsb3dlZCBieSBhIGNvbG9uLCBlLmcuICJsaW51eDoiIChpZgorICAgeW91IHJlYWxseSBhcmUgYnVpbGRpbmcgQy1LZXJtaXQgZm9yIExpbnV4LCBkbyB0aGlzIG5vdykuCisKKyAgIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgY29tbWVudHMgYWJvdXQgeW91ciBwYXJ0aWN1bGFyIHZlcnNpb24gaW4KKyAgIHRoZSBbMTIwXWNrdWJ3ci50eHQgZmlsZSAoWzEyMV1DTElDSyBIRVJFIGZvciB0aGUgV2ViIHZlcnNpb24pLgorCisgICBJZiB5b3UgaGF2ZSB0cm91YmxlIHdpdGggYnVpbGRpbmcgWzEyMl1ja3dhcnQuYywgb3IgcnVubmluZyB0aGUKKyAgIHJlc3VsdGluZyB3YXJ0IHByZXByb2Nlc3NvciBwcm9ncmFtIG9uIFsxMjNdY2tjcHJvLnc6CisKKyAgICAxLiBKdXN0ICJ0b3VjaCIgdGhlIFsxMjRdY2tjcHJvLmMgZmlsZSB0aGF0IGNvbWVzIGluIHRoZSBkaXN0cmlidXRpb24KKyAgICAgICBhbmQgdGhlbiBnaXZlIHRoZSAibWFrZSIgY29tbWFuZCBhZ2Fpbiwgb3I6CisgICAgMi4gQ29tcGlsZSBja3dhcnQuYyAiYnkgaGFuZCI6IGNjIC1vIHdhcnQgY2t3YXJ0LmMsIG9yOgorICAgIDMuIFRyeSB2YXJpb3VzIG90aGVyIHRyaWNrcy4gRS5nLiBvbmUgTGludXggdXNlciByZXBvcnRlZCB0aGF0IHRoYXQKKyAgICAgICBhZGRpbmcgdGhlICJzdGF0aWMiIHN3aXRjaCB0byB0aGUgcnVsZSBmb3IgYnVpbGRpbmcgd2FydCBmaXhlZAorICAgICAgIGV2ZXJ5dGhpbmc6CisKK3dhcnQ6IGNrd2FydC4kKEVYVCkKKyAgICAgICAgJChDQykgLXN0YXRpYyAtbyB3YXJ0IGNrd2FydC4kKEVYVCkgJChMSUJTKQorCisgICBJZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIGEgY29tcGlsZS10aW1lIG9wdGlvbiB0byB0cmVhdCBBTEwgY2hhcnMKKyAgIChhbmQgY2hhciAqJ3MsIGV0YykgYXMgdW5zaWduZWQsIGJ5IGFsbCBtZWFucyB1c2UgaXQgLS0gYW5kIHNlbmQgbWUKKyAgIGVtYWlsIHRvIGxldCBtZSBrbm93IHdoYXQgaXQgaXMgKEkgYWxyZWFkeSBrbm93IGFib3V0IGdjYworICAgLWZ1bnNpZ25lZC1jaGFyKS4KKworICAgVG8gYWRkIGNvbXBpbGF0aW9uIG9wdGlvbnMgKHdoaWNoIGFyZSBleHBsYWluZWQgbGF0ZXIgaW4gdGhpcworICAgZG9jdW1lbnQpIHRvIHlvdXIgbWFrZWZpbGUgdGFyZ2V0IHdpdGhvdXQgZWRpdGluZyB0aGUgbWFrZWZpbGUsCisgICBpbmNsdWRlICJLRkxBR1M9Li4uIiBvbiB0aGUgbWFrZSBjb21tYW5kIGxpbmUsIGZvciBleGFtcGxlOgorCittYWtlIGxpbnV4IEtGTEFHUz0tRE5PREVCVUcKK21ha2UgYnNkICJLRkxBR1M9LURLQU5KSSAtRE5PREVCVUcgLUROT1RMT0cgLUREWU5BTUlDIC1VVENQU09DS0VUIgorCisgICBNdWx0aXBsZSBvcHRpb25zIG11c3QgYmUgc2VwYXJhdGVkIGJ5IHNwYWNlcy4gUXVvdGVzIGFyZSBuZWNlc3NhcnkgaWYKKyAgIHRoZSBLRkxBR1M9IGNsYXVzZSBpbmNsdWRlcyBzcGFjZXMuIFRoZSBLRkxBR1MgYXJlIGFkZGVkIHRvIHRoZSBlbmQgb2YKKyAgIHRoZSBDRkxBR1MgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgc2VsZWN0ZWQgbWFrZWZpbGUgdGFyZ2V0LiBGb3IKKyAgIGV4YW1wbGUsIHRoZSAiYnNkIiBlbnRyeSBpbmNsdWRlcyAtREJTRDQgLURUQ1BTT0NLRVQsIHNvIHRoZSBzZWNvbmQKKyAgIGV4YW1wbGUgYWJvdmUgY29tcGlsZXMgS2VybWl0IHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCistREJTRDQgLURUQ1BTT0NLRVQgLURLQU5KSSAtRE5PREVCVUcgLUROT1RMT0cgLUREWU5BTUlDIC1VVENQU09DS0VUCisKKyAgIChOb3RpY2UgaG93ICItVVRDUFNPQ0tFVCIgaXMgdXNlZCB0byBuZWdhdGUgdGhlIGVmZmVjdCBvZiB0aGUKKyAgICItRFRDUFNPQ0tFVCIgb3B0aW9uIHRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1ha2VmaWxlIHRhcmdldC4pCisKKyAgIFdBUk5JTkc6IEJlIGNhcmVmdWwgd2l0aCBLRkxBR1MuIElmIHlvdSBidWlsZCBDLUtlcm1pdCwgY2hhbmdlIHNvbWUKKyAgIGZpbGVzLCBhbmQgdGhlbiBydW4gbWFrZSBhZ2FpbiB1c2luZyB0aGUgc2FtZSBtYWtlIGVudHJ5IGJ1dAorICAgc3BlY2lmeWluZyBkaWZmZXJlbnQgS0ZMQUdTIHRoYW4gbGFzdCB0aW1lLCBtYWtlIHdvbid0IGRldGVjdCBpdCBhbmQKKyAgIHlvdSBjb3VsZCBlYXNpbHkgd2luZCB1cCB3aXRoIGluY29uc2lzdGVudCBvYmplY3QgbW9kdWxlcywgZS5nLiBzb21lCisgICBvZiB0aGVtIGJ1aWx0IHdpdGggYSBjZXJ0YWluIG9wdGlvbiwgb3RoZXJzIG5vdC4gV2hlbiBpbiBkb3VidCwgIm1ha2UKKyAgIGNsZWFuIiBmaXJzdCB0byBtYWtlIHN1cmUgYWxsIHlvdXIgb2JqZWN0IGZpbGVzIGFyZSBjb25zaXN0ZW50LgorICAgU2ltaWxhcmx5LCBpZiB5b3UgY2hhbmdlIENGTEFHUywgTElCUywgb3IgYW55IG90aGVyIGl0ZW1zIGluIHRoZQorICAgbWFrZWZpbGUsIG9yIHlvdSByZWJ1aWxkIHVzaW5nIGEgZGlmZmVyZW50IG1ha2VmaWxlIHRhcmdldCwgIm1ha2UKKyAgIGNsZWFuIiBmaXJzdC4KKworICAgSWYgeW91IGNyZWF0ZSBhIG5ldyBtYWtlZmlsZSB0YXJnZXQsIHVzZSBzdGF0aWMgbGlua2luZyBpZiBwb3NzaWJsZS4KKyAgIEV2ZW4gdGhvdWdoIHRoaXMgbWFrZXMgeW91ciBDLUtlcm1pdCBiaW5hcnkgYmlnZ2VyLCB0aGUgcmVzdWx0aW5nCisgICBiaW5hcnkgd2lsbCBiZSBtb3JlIHBvcnRhYmxlLiBEeW5hbWljYWxseSBsaW5rZWQgYmluYXJpZXMgdGVuZCB0byBydW4KKyAgIG9ubHkgb24gdGhlIGV4YWN0IGNvbmZpZ3VyYXRpb24gYW5kIHZlcnNpb24gd2hlcmUgdGhleSB3ZXJlIGJ1aWx0OyBvbgorICAgb3RoZXJzLCBpbnZvY2F0aW9uIHRlbmRzIHRvIGZhaWwgd2l0aCBhIG1lc3NhZ2UgbGlrZToKKworQ2FuJ3QgZmluZCBzaGFyZWQgbGlicmFyeSAibGliYy5zby4yLjEiCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC4yLiBUaGUgQy1LZXJtaXQgSW5pdGlhbGl6YXRpb24gRmlsZQorCisgICBbIFsxMjVdVG9wIF0gWyBbMTI2XUNvbnRlbnRzIF0gWyBbMTI3XVNlY3Rpb24gQ29udGVudHMgXSBbIFsxMjhdTmV4dCBdCisgICBbIFsxMjldUHJldmlvdXMgXQorCisgICAoVGhpcyBzZWN0aW9uIGlzIG9ic29sZXRlLikgUmVhZCBbMTMwXVNlY3Rpb24gNSBhYm91dCB0aGUKKyAgIGluaXRpYWxpemF0aW9uIGZpbGUuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC4zLiBUaGUgMi54IEJTRCBNYWtlZmlsZQorCisgICBbIFsxMzFdVG9wIF0gWyBbMTMyXUNvbnRlbnRzIF0gWyBbMTMzXVNlY3Rpb24gQ29udGVudHMgXSBbIFsxMzRdTmV4dCBdCisgICBbIFsxMzVdUHJldmlvdXMgXQorCisgICAgIFRoaXMgc2VjdGlvbiBpcyBvYnNvbGV0ZS4gQy1LZXJtaXQgNi4wIHdhcyB0aGUgbGFzdCByZWxlYXNlIHRoYXQKKyAgICAgY291bGQgYmUgYnVpbHQgb24gUERQLTExIGJhc2VkIEJTRCB2ZXJzaW9ucy4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA0LjQuIFRoZSBQbGFuIDkgTWFrZWZpbGUKKworICAgWyBbMTM2XVRvcCBdIFsgWzEzN11Db250ZW50cyBdIFsgWzEzOF1TZWN0aW9uIENvbnRlbnRzIF0gWyBbMTM5XU5leHQgXQorICAgWyBbMTQwXVByZXZpb3VzIF0KKworICAgVXNlIHRoZSBzZXBhcmF0ZSBtYWtlZmlsZSBbMTQxXWNrcGtlci5tay4gTk9URTogVGhlIFBsYW4gOSB2ZXJzaW9uIG9mCisgICBDLUtlcm1pdCA4LjAgaGFzIG5vdCB5ZXQgYmVlbiBidWlsdC4gVGhlcmUgc2hvdWxkIGJlIG5vIGltcGVkaW1lbnQgdG8KKyAgIGJ1aWxkaW5nIGl0LiBIb3dldmVyLCBldmVuIHdoZW4gYnVpbHQgc3VjY2Vzc2Z1bGx5LCBjZXJ0YWluIGtleQorICAgZmVhdHVyZXMgYXJlIG1pc3NpbmcsIG5vdGFibHkgVENQL0lQIG5ldHdvcmtpbmcuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgNC41LiBNYWtlZmlsZSBGYWlsdXJlcworCisgICBbIFsxNDJdVG9wIF0gWyBbMTQzXUNvbnRlbnRzIF0gWyBbMTQ0XVNlY3Rpb24gQ29udGVudHMgXSBbCisgICBbMTQ1XVByZXZpb3VzIF0KKworICAgRmlyc3QsIGJlIHN1cmUgdGhlIHNvdXJjZSBmaWxlcyBhcmUgc3RvcmVkIG9uIHlvdXIgY3VycmVudCBkaXNrIGFuZAorICAgZGlyZWN0b3J5IHdpdGggdGhlIHJpZ2h0IG5hbWVzIChpbiBsb3dlcmNhc2UpLiBTZWNvbmQsIG1ha2Ugc3VyZSB0aGF0CisgICB0aGUgbWFrZWZpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYW55IGxpbmVzIHdpdGggbGVhZGluZyBzcGFjZXM6CisgICBpbmRlbnRlZCBsaW5lcyBtdXN0IGFsbCBzdGFydCB3aXRoIGhvcml6b250YWwgVEFCLCBhbmQgbm8gc3BhY2VzLgorCisgICBUaGVuIG1ha2Ugc3VyZSB0aGF0IHlvdXIgVW5peCBQQVRIIGlzIGRlZmluZWQgdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUKKyAgIGNvbXBpbGVyIGZvciB5b3VyIG1ha2VmaWxlIHRhcmdldC4gRm9yIGV4YW1wbGUsIG9uIFN1bk9TIHN5c3RlbXMsCisgICAibWFrZSBzdW5vczQxIiBidWlsZHMgQy1LZXJtaXQgZm9yIHRoZSBCU0QgZW52aXJvbm1lbnQsIGFuZCBhc3N1bWVzCisgICB0aGF0IC91c3IvdWNiL2NjIHdpbGwgYmUgdXNlZCBmb3IgY29tcGlsYXRpb24gYW5kIGxpbmtpbmcuIElmIHlvdXIKKyAgIFBBVEggaGFzIC91c3IvNWJpbiBhaGVhZCBvZiAvdXNyL3VjYiwgeW91IGNhbiBoYXZlIHByb2JsZW1zIGF0IGNvbXBpbGUKKyAgIG9yIGxpbmsgdGltZSAoYSBjb21tb25seSByZXBvcnRlZCBzeW1wdG9tIGlzIHRoZSBpbmFiaWxpdHkgdG8gZmluZAorICAgImZ0aW1lIiBkdXJpbmcgbGlua2luZykuIEZpeCBzdWNoIHByb2JsZW1zIGJ5IHJlZGVmaW5pbmcgeW91ciBVbml4CisgICBQQVRILCBvciBieSBzcGVjaWZ5aW5nIHRoZSBhcHByb3ByaWF0ZSAiY2MiIGluIENDPSBhbmQgQ0MyPSBzdGF0ZW1lbnRzCisgICBpbiB5b3VyIG1ha2VmaWxlIHRhcmdldC4KKworICAgRHVyaW5nIGVkaXRzIDE2Ni0xNjcsIGNvbnNpZGVyYWJsZSBlZmZvcnQgd2VudCBpbnRvIG1ha2luZyBDLUtlcm1pdAorICAgY29tcGlsYWJsZSBieSBBTlNJIEMgY29tcGlsZXJzLiBUaGlzIGluY2x1ZGVzIHByb3RvdHlwaW5nIGFsbCBvZgorICAgQy1LZXJtaXQncyBmdW5jdGlvbnMsIGFuZCBpbmNsdWRpbmcgdGhlIEFOU0ktZGVmaW5lZCBzeXN0ZW0gaGVhZGVyCisgICBmaWxlcyBmb3Igc3lzdGVtIGFuZCBsaWJyYXJ5IGZ1bmN0aW9ucywgYXMgZGVmaW5lZCBpbiBLJlIsIHNlY29uZAorICAgZWRpdGlvbjogPHN0cmluZy5oPiwgPHN0ZGxpYi5oPiwgPHVuaXN0ZC5oPiAoZXhjZXB0IGluIE5lWFRTVEVQIHRoaXMKKyAgIGlzIDxsaWJjLmg+KSwgYW5kIDxzeXMvc3RkdHlwZXMuaD4uIElmIHlvdSBnZXQgd2FybmluZ3MgYWJvdXQgYW55IG9mCisgICB0aGVzZSBoZWFkZXIgZmlsZXMgbm90IGJlaW5nIGZvdW5kLCBvciBhYm91dCBhcmd1bWVudCBtaXNtYXRjaGVzCisgICBpbnZvbHZpbmcgcGlkX3QsIHVpZF90LCBvciBnaWRfdCwgbG9vayBpbiBja2NkZWIuaCBhbmQgbWFrZQorICAgYW1lbmRtZW50cy4gQy1LZXJtaXQgYXNzdW1lcyBpdCBpcyBiZWluZyBjb21waWxlZCBieSBhbiBBTlNJLWNvbXBsaWFudAorICAgQyBjb21waWxlciBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBub3JtYWxseSBkZWZpbmVkIGJ5IHRoZSBjb21waWxlcgorICAgaXRzZWxmLiBZb3UgY2FuIGZvcmNlIEFOU0kgY29tcGlsYXRpb24gd2l0aG91dCBkZWZpbmluZyBfX1NURENfXworICAgKHdoaWNoIHNvbWUgY29tcGlsZXJzIHdvbid0IGxldCB5b3UgZGVmaW5lKSBieSBpbmNsdWRpbmcgLURDS19BTlNJQyBvbgorICAgdGhlIGNjIGNvbW1hbmQgbGluZS4KKworICAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdXIgY29tcGlsZXIgZGVmaW5lcyBfX1NURENfXyBidXQgc3RpbGwKKyAgIGNvbXBsYWlucyBhYm91dCB0aGUgc3ludGF4IG9mIEtlcm1pdCdzIGZ1bmN0aW9uIHByb3RvdHlwZXMsIHlvdSBjYW4KKyAgIGRpc2FibGUgdGhlIEFOU0ktc3R5bGUgZnVuY3Rpb24gcHJvdG90eXBpbmcgYnkgaW5jbHVkaW5nIC1ETk9BTlNJIG9uCisgICB0aGUgY29tbWFuZCBsaW5lLgorCisgICBGb3IgU0NPIE9wZW5TZXJ2ZXIsIFVOSVgsIE9EVCwgYW5kIFhFTklYIGNvbXBpbGF0aW9ucywgYmUgc3VyZSB0byBwaWNrCisgICB0aGUgbW9zdCBhcHByb3ByaWF0ZSBbMTQ2XW1ha2VmaWxlIHRhcmdldCwgYW5kIGJlIHN1cmUgeW91IGhhdmUKKyAgIGluc3RhbGxlZCBhbiBTQ08gZGV2ZWxvcG1lbnQgc3lzdGVtIHRoYXQgaXMga2V5ZWQgdG8geW91ciBleGFjdCBTQ08KKyAgIG9wZXJhdGluZyBzeXN0ZW0gcmVsZWFzZSwgZG93biB0byB0aGUgbWlub3IgdmVyc2lvbiAobGlrZSAyLjMuMSkuCisKKyAgIEFsc28gbm90ZSB0aGF0IFNDTyBkaXN0cmlidXRlcyBzb21lIG9mIGl0cyBsaWJyYXJpZXMgaW4gZW5jcnlwdGVkCisgICBmb3JtLCBhbmQgdGhleSBtdXN0IGJlIGRlY3J5cHRlZCBiZWZvcmUgQy1LZXJtaXQgY2FuIGJlIGxpbmtlZCB3aXRoCisgICB0aGVtLiBJZiBub3QsIHlvdSBtaWdodCBzZWUgYSBtZXNzYWdlIGxpa2U6CisKK2xkOiBmaWxlIC91c3IvbGliL2xpYnNvY2tldC5hIGlzIG9mIHVua25vd24gdHlwZTogbWFnaWMgbnVtYmVyID0gNjM2NQorCisgICBUbyBkZWNyeXB0LCB5b3UgbXVzdCBzdXBwbHkgYSBrZXkgKHBhc3N3b3JkKSB0aGF0IGNhbWUgd2l0aCB5b3VyCisgICBsaWNlbnNlLiBDYWxsIFNDTyBmb3IgZnVydGhlciBpbmZvLgorCisgICBJZiB5b3VyIGNvbXBpbGVyIHVzZXMgc29tZXRoaW5nIG90aGVyIHRoYW4gaW50IGZvciB0aGUgcGlkIChwcm9jZXNzCisgICBpZCkgZGF0YSB0eXBlLCBwdXQgLURQSURfVD1waWRfdCBvciB3aGF0ZXZlciBpbiB5b3VyIENGTEFHUy4KKworICAgSWYgeW91IGdldCBjb21wbGFpbnRzIGFib3V0IHVua25vd24gZGF0YSB0eXBlcyB1aWRfdCBhbmQgZ2lkX3QsIHB1dAorICAgLURVSURfVD14eHggLURHSURfVD15eXkgaW4geW91ciBDRkxBR1MsIHdoZXJlIHh4eCBhbmQgeXl5IGFyZSB0aGUKKyAgIGFwcHJvcHJpYXRlIHR5cGVzLgorCisgICBJZiB5b3VyIGNvbXBpbGF0aW9uIGZhaWxzIGJlY2F1c2Ugb2YgY29uZmxpY3Rpbmcgb3IgZHVwbGljYXRlCisgICBkZWNsYXJhdGlvbnMgZm9yIHN5c19lcnJsaXN0LCBhZGQgLURVU0VfU1RSRVJST1Igb3IgLURORFNZU0VSUkxJU1QgdG8KKyAgIENGTEFHUy4KKworICAgSWYgeW91ciBjb21waWxhdGlvbiBkaWVzIGJlY2F1c2UgZ2V0cHduYW0oKSBpcyBiZWluZyByZWRlY2xhcmVkIChvcgorICAgYmVjYXVzZSBvZiAiY29uZmxpY3RpbmcgdHlwZXMgZm9yIGdldHdwbmFtIiksIGFkZCAtRE5ER1BXTkFNIHRvIHlvdXIKKyAgIENGTEFHUy4gSWYgdGhhdCBkb2Vzbid0IHdvcmssIHRoZW4gYWRkIC1ERENHUFdOQU0gdG8geW91ciBDRkxBR1MgKHNlZQorICAgY2t1ZmlvLmMgYXJvdW5kIGxpbmUgNDQwKS4KKworICAgSWYgdGhlIGNvbXBpbGVyIGNvbXBsYWlucyBhYm91dCB0aGUgZGVjbGFyYXRpb24gb2YgZ2V0cHduYW0oKSBkdXJpbmcKKyAgIGFuIEFOU0kgQyBjb21waWxhdGlvbiwgcmVtb3ZlIHRoZSBkZWNsYXJhdGlvbiBmcm9tIGNrdWZpby5jIG9yIGNoYW5nZQorICAgdGhlIGFyZ3VtZW50IGluIHRoZSBwcm90b3R5cGUgZnJvbSAoY2hhciAqKSB0byAoY29uc3QgY2hhciAqKS4KKworICAgSWYgeW91IGdldCBjb21wbGFpbnRzIHRoYXQgZ2V0cHd1aWQoKSBpcyBiZWluZyBjYWxsZWQgd2l0aCBhbiBpbXByb3BlcgorICAgdHlwZSwgcHV0IC1EUFdJRF9UPXh4IGluIHlvdXIgQ0ZMQUdTLgorCisgICBJZiB5b3UgZ2V0IGNvbXBpbGUtdGltZSB3YXJuaW5ncyB0aGF0IHRfYnJrYyBvciB0X2VvZmMgKHRjaGFycworICAgc3RydWN0dXJlIG1lbWJlcnMsIHVzZWQgaW4gQlNELWJhc2VkIHZlcnNpb25zKSBhcmUgdW5kZWZpbmVkLCBvcgorICAgc3RydWN0dXJlLW1lbWJlci0gcmVsYXRlZCB3YXJuaW5ncyB0aGF0IG1pZ2h0IGJlIHRyYWNlZCB0byB0aGlzIGZhY3QsCisgICBhZGQgLUROT0JSS0MgdG8gQ0ZMQUdTLgorCisgICBJZiB5b3UgZ2V0IGEgbGlua2VyIG1lc3NhZ2UgdG8gdGhlIGVmZmVjdCB0aGF0IF9zZXRyZXVpZCBvciBfc2V0cmVnaWQKKyAgIGlzIG5vdCBkZWZpbmVkLCBhZGQgLUROT1NFVFJFVSB0byBDRkxBR1MsIG9yIGFkZCAtRENLVFlQX0g9YmxhaCB0bworICAgQ0ZMQUdTIHRvIG1ha2UgQy1LZXJtaXQgcmVhZCB0aGUgcmlnaHQgPHR5cGVzLmg+LWtpbmQtb2YtZmlsZSB0byBwaWNrCisgICB1cCB0aGVzZSBkZWZpbml0aW9ucy4KKworICAgSWYgeW91IGdldCBhIG1lc3NhZ2UgdGhhdCBfcG9wZW4gaXMgdW5kZWZpbmVkLCBhZGQgLUROT1BPUEVOIHRvCisgICBDRkxBR1MuCisKKyAgIElmIHlvdSBnZXQgYSBjb21wbGFpbnQgYXQgY29tcGlsZSB0aW1lIGFib3V0IGFuIGlsbGVnYWwKKyAgIHBvaW50ZXItaW50ZWdlciBjb21iaW5hdGlvbiBpbiBja3VmaW8uYyBpbnZvbHZpbmcgcG9wZW4oKSwgb3IgYXQgbGluaworICAgdGltZSB0aGF0IF9wb3BlbiBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCBhZGQgdGhlIGRlY2xhcmF0aW9uICJGSUxFCisgICAqcG9wZW4oKTsiIHRvIHRoZSBmdW5jdGlvbiB6eGNtZCgpIGluIGNrdWZpby5jICh0aGlzIGRlY2xhcmF0aW9uIGlzCisgICBzdXBwb3NlZCB0byBiZSBpbiA8c3RkaW8uaD4pLiBJZiBtYWtpbmcgdGhpcyBjaGFuZ2UgZG9lcyBub3QgaGVscCwKKyAgIHRoZW4gYXBwYXJlbnRseSB5b3VyIFVuaXggZG9lcyBub3QgaGF2ZSB0aGUgcG9wZW4oKSBmdW5jdGlvbiwgc28geW91CisgICBzaG91bGQgYWRkIC1ETk9QT1BFTiB0byB5b3VyIG1ha2UgZW50cnksIGluIHdoaWNoIGNhc2UgY2VydGFpbgorICAgZnVuY3Rpb25zIGludm9sdmluZyAiZmlsZSIgaS9vIHRvIHRoZSBzdGFuZGFyZCBpbnB1dCBhbmQgb3V0cHV0IG9mCisgICBzdWJwcm9jZXNzZXMgd2lsbCBub3QgYmUgYXZhaWxhYmxlLgorCisgICBJZiB5b3VyIGxpbmtlciBjb21wbGFpbnMgdGhhdCBfZ2V0Y3dkIGlzIHVuZGVmaW5lZCwgeW91IGNhbiBhZGQgYQorICAgZ2V0Y3dkKCkgZnVuY3Rpb24gdG8gY2t1ZmlvLmMsIG9yIGFkZCBpdCB0byB5b3VyIGxpYmMuYSBsaWJyYXJ5IHVzaW5nCisgICBhcjoKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2NoYXIgKgorZ2V0Y3dkKGJ1ZixzaXplKSBjaGFyICpidWY7IGludCBzaXplOyB7CisjaWZuZGVmIE5PUE9QRU4KKyNpZmRlZiBEQ0xQT1BFTgorICAgIEZJTEUgKnBvcGVuKCk7CisjZW5kaWYKKyAgICBGSUxFICpwZnA7CisKKyAgICBpZiAoIWJ1ZikgcmV0dXJuKE5VTEwpOworICAgIGlmICghKHBmcCA9IHBvcGVuKCJwd2QiLCJyIikpKSByZXR1cm4oTlVMTCk7CisgICAgZmdldHMoYnVmLHNpemUtMixwZnApOworICAgIHBjbG9zZShwZnApOworICAgIGJ1ZltzdHJsZW4oYnVmKS0xXSA9ICdcMCc7CisgICAgcmV0dXJuKChjaGFyICopYnVmKTsKKyNlbHNlCisgICAgYnVmWzBdID0gJ1wwJzsKKyAgICByZXR1cm4oTlVMTCk7CisjZW5kaWYgLyogTk9QT1BFTiAqLworfQorCisjaWZkZWYgTk9QT1BFTgorRklMRSAqcG9wZW4ocyx0KSBjaGFyICpzLCp0OyB7CisgICAgcmV0dXJuKE5VTEwpOworfQorI2VuZGlmIC8qIE5PUE9QRU4gKi8KKworICAgSWYgeW91IGdldCBjb21wbGFpbnRzIGFib3V0IE5QUk9DIGhhdmluZyBhbiBpbnZhbGlkIHZhbHVlLCBhZGQgYSB2YWxpZAorICAgZGVmaW5pdGlvbiBmb3IgaXQgKGRlcGVuZHMgb24geW91ciBzeXN0ZW0pLCBhcyBpbiB0aGUgY3JheSBlbnRyeS4KKworICAgSWYgeW91IGdldCBzb21lIHN5bWJvbCB0aGF0J3MgbXVsdGlwbHkgZGVmaW5lZCwgaXQgcHJvYmFibHkgbWVhbnMgdGhhdAorICAgYSB2YXJpYWJsZSBuYW1lIHVzZWQgYnkgS2VybWl0IGlzIGFsc28gdXNlZCBpbiBvbmUgb2YgeW91ciBzeXN0ZW0KKyAgIGxpYnJhcmllcyB0aGF0IEtlcm1pdCBpcyBsaW5rZWQgd2l0aC4gRm9yIGV4YW1wbGUsIHVuZGVyIFBDL0lYIHNvbWUKKyAgIGxpYnJhcnkgaGFzIGEgdmFyaWFibGUgb3IgZnVuY3Rpb24gY2FsbGVkICJkYXRhIiwgYW5kIHRoZSB2YXJpYWJsZQorICAgImRhdGEiIGlzIGFsc28gdXNlZCBleHRlbnNpdmVseSBieSBLZXJtaXQuIFJhdGhlciB0aGFuIGVkaXQgdGhlIEtlcm1pdAorICAgc291cmNlIGZpbGVzLCBqdXN0IHB1dCBhIC1EIGluIHRoZSBtYWtlIGVudHJ5IENGTEFHUyB0byBjaGFuZ2UgdGhlCisgICBLZXJtaXQgc3ltYm9sIGF0IGNvbXBpbGUgdGltZS4gSW4gdGhpcyBleGFtcGxlLCBpdCBtaWdodCBiZQorICAgLURkYXRhPXhkYXRhLgorCisgICBTb21lIHN5bWJvbCBpcyBkZWZpbmVkIGluIHlvdXIgc3lzdGVtJ3MgaGVhZGVyIGZpbGVzLCBidXQgaXQgcHJvZHVjZXMKKyAgIGNvbmZsaWN0cyB3aXRoLCBvciB1bmRlc2lyZWQgcmVzdWx0cyBmcm9tLCBLZXJtaXQuIFRyeSB1bmRlZmluaW5nIHRoZQorICAgc3ltYm9sIGluIHRoZSBtYWtlZmlsZSB0YXJnZXQncyBDRkxBR1MsIGZvciBleGFtcGxlIC1VRklPTlJFQUQuCisKKyAgIFNvbWUgd2VsbC1rbm93biBzeW1ib2wgaXMgbWlzc2luZyBmcm9tIHlvdXIgc3lzdGVtIGhlYWRlciBmaWxlcy4gVHJ5CisgICBkZWZpbmluZyBpbiB0aGUgbWFrZWZpbGUgdGFyZ2V0J3MgQ0ZMQUdTLCBmb3IgZXhhbXBsZSAtREZSRUFEPTEuCisKKyAgIFlvdSBnZXQgbWFueSB3YXJuaW5ncyBhYm91dCBwb2ludGVyIG1pc21hdGNoZXMuIFRoaXMgcHJvYmFibHkgbWVhbnMKKyAgIHRoYXQgS2VybWl0IGlzIGFzc3VtaW5nIGFuIGludCB0eXBlIGZvciBzaWduYWwoKSB3aGVuIGl0IHNob3VsZCBiZQorICAgdm9pZCwgb3IgdmljZS12ZXJzYS4gVHJ5IGFkZGluZyAtRFNJR19JIChmb3IgaW50ZWdlciBzaWduYWwoKSkgb3IKKyAgIC1EU0lHX1YgKGZvciB2b2lkKSB0byBDRkxBR1MuIE9yIGp1c3QgaW5jbHVkZSBLRkxBR1M9LURTSUdfViAob3IKKyAgIHdoYXRldmVyKSBpbiB5b3VyICJtYWtlIiBjb21tYW5kLCBmb3IgZXhhbXBsZToKKworbWFrZSBic2QgS0ZMQUdTPS1EU0lHX1YKKworICAgWW91IGdldCBtYW55IG1lc3NhZ2VzIGFib3V0IHZhcmlhYmxlcyB0aGF0IGFyZSBkZWNsYXJlZCBhbmQvb3Igc2V0IGJ1dAorICAgbmV2ZXIgdXNlZC4gSXQgaXMgZGlmZmljdWx0IHRvIGF2b2lkIHRoZXNlIGJlY2F1c2Ugb2YgYWxsIHRoZQorICAgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gaW4gdGhlIHByb2dyYW0uIElnbm9yZSB0aGVzZSBtZXNzYWdlcy4KKworICAgU29tZSBvZiBDLUtlcm1pdCdzIG1vZHVsZXMgYXJlIHNvIGxhcmdlLCBvciBjb250YWluIHNvIG1hbnkgY2hhcmFjdGVyCisgICBzdHJpbmcgY29uc3RhbnRzLCBvciBhcmUgc28gb2ZmZW5zaXZlIGluIHNvbWUgb3RoZXIgd2F5LCB0aGF0IHNvbWUgQworICAgY29tcGlsZXJzIGdpdmUgdXAgYW5kIHJlZnVzZSB0byBjb21waWxlIHRoZW0uIFRoaXMgaXMgdXN1YWxseSBiZWNhdXNlCisgICB0aGUgLU8gKG9wdGltaXplKSBvcHRpb24gaXMgaW5jbHVkZWQgaW4gdGhlIG1ha2UgZW50cnkuIElmIHRoaXMKKyAgIGhhcHBlbnMgdG8geW91LCB5b3UgY2FuIChhKSByZW1vdmUgdGhlIC1PIG9wdGlvbiBmcm9tIHRoZSBtYWtlIGVudHJ5LAorICAgd2hpY2ggd2lsbCB0dXJuIG9mZiB0aGUgb3B0aW1pemVyIGZvciBBTEwgbW9kdWxlczsgb3IgKGIpIGNvbXBpbGUgdGhlCisgICBvZmZlbmRpbmcgbW9kdWxlKHMpIGJ5IGhhbmQsIGluY2x1ZGluZyBhbGwgdGhlIHN3aXRjaGVzIGZyb20gbWFrZQorICAgZW50cnkgZXhjZXB0IGZvciAtTywgYW5kIHRoZW4gZ2l2ZSB0aGUgYXBwcm9wcmlhdGUgIm1ha2UiIGNvbW1hbmQKKyAgIGFnYWluOyBvciAoYykgaW5jcmVhc2UgdGhlIHZhbHVlIG9mIHRoZSAtT2xpbWl0IG9wdGlvbiwgaWYgeW91cgorICAgY29tcGlsZXIgc3VwcG9ydHMgdGhpcyBvcHRpb247IG9yIChkKSBjaGFuZ2UgdGhlIFsxNDddbWFrZWZpbGUgdGFyZ2V0CisgICB0byBmaXJzdCBjb21waWxlIGVhY2ggb2ZmZW5kaW5nIG1vZHVsZSBleHBsaWNpdGx5IHdpdGhvdXQKKyAgIG9wdGltaXphdGlvbiwgdGhlbiBjb21waWxlIHRoZSBvdGhlcnMgbm9ybWFsbHkgKHdpdGggb3B0aW1pemF0aW9uKSwKKyAgIGZvciBleGFtcGxlOgorCisjRm9ydHVuZSAzMjoxNiwgRm9yOlBybyAyLjEgKG1vc3RseSBsaWtlIDQuMWJzZCkKK2Z0MjE6CisgICAgICAgIEBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEZvcnR1bmUgMzI6MTYgRm9yOlBybyAyLjEuLi4nCisgICAgICAgICQoTUFLRSkgY2t1dXN4LiQoRVhUKSAiQ0ZMQUdTPSAtRE5PREVCVUcgLURCU0Q0IC1ERlQyMSAtRE5PRklMRUggXAorICAgICAgICAtU1lNIDgwMCBcIC1ERFlOQU1JQyAtRE5PU0VUQlVGIC1EQ0tfQ1VSU0VTICQoS0ZMQUdTKSAtRFBJRF9UPXNob3J0IgorICAgICAgICAkKE1BS0UpIGNrdXhsYS4kKEVYVCkgIkNGTEFHUz0gLUROT0RFQlVHIC1EQlNENCAtREZUMjEgLUROT0ZJTEVIIFwKKyAgICAgICAgLVNZTSA4MDAgXCAtRERZTkFNSUMgLUROT1NFVEJVRiAtRENLX0NVUlNFUyAkKEtGTEFHUykgLURQSURfVD1zaG9ydCIKKyAgICAgICAgJChNQUtFKSBja3VkaWEuJChFWFQpICJDRkxBR1M9IC1ETk9ERUJVRyAtREJTRDQgLURGVDIxIC1ETk9GSUxFSCBcCisgICAgICAgIC1TWU0gODAwIFwgLUREWU5BTUlDIC1ETk9TRVRCVUYgLURDS19DVVJTRVMgJChLRkxBR1MpIC1EUElEX1Q9c2hvcnQiCisgICAgICAgICQoTUFLRSkgd2VybWl0ICJDRkxBR1M9IC1PIC1ETk9ERUJVRyAtREJTRDQgLURGVDIxIC1ETk9GSUxFSCAtU1lNIDgwMCBcCisgICAgICAgIC1ERFlOQU1JQyAtRE5PU0VUQlVGIC1EQ0tfQ1VSU0VTICQoS0ZMQUdTKSAtRFBJRF9UPXNob3J0IiBcCisgICAgICAgICJMTktGTEFHUz0gLW4gLXMiICJMSUJTPSAtbGN1cnNlcyAtbHRlcm1jYXAgLWx2IC1sbmV0IgorCisgICBBcyBhbiBleHRyZW1lIGV4YW1wbGUsIHNvbWUgY29tcGlsZXJzIChlLmcuIGdjYyBvbiB0aGUgREcgQVZpaU9OKSBoYXZlCisgICBiZWVuIGtub3duIHRvIGR1bXAgY29yZSB3aGVuIHRyeWluZyB0byBjb21waWxlIGNrd2FydC5jIHdpdGgKKyAgIG9wdGltaXphdGlvbi4gU28ganVzdCBkbyB0aGlzIG9uZSAiYnkgaGFuZCI6CisKK2NjIC1vIHdhcnQgY2t3YXJ0LmMKKworICAgb3I6CisKK3RvdWNoIGNrY3Byby5jCisKKyAgIGFuZCB0aGVuIGdpdmUgdGhlICJtYWtlIiBjb21tYW5kIGFnYWluLgorCisgICBTcGVha2luZyBvZiB3YXJ0LCBpdCBpcyB1bmF2b2lkYWJsZSB0aGF0IHNvbWUgcGlja3kgY29tcGlsZXJzIG1pZ2h0CisgICBnZW5lcmF0ZSAic3RhdGVtZW50IHVucmVhY2hhYmxlIiBtZXNzYWdlcyB3aGVuIGNvbXBpbGluZyBja2Nwcm8uYy4KKyAgIFVucmVhY2hhYmxlIHN0YXRlbWVudHMgY2FuIGJlIGdlbmVyYXRlZCBieSB0aGUgd2FydCBwcm9ncmFtLCB3aGljaAorICAgZ2VuZXJhdGVzIGNrY3Byby5jIGF1dG9tYXRpY2FsbHkgZnJvbSBbMTQ4XWNrY3Byby53LCB3aGljaCB0cmFuc2xhdGVzCisgICBsZXgtbGlrZSBzdGF0ZS9pbnB1dCBjb25zdHJ1Y3Rpb25zIGludG8gYSBiaWcgc3dpdGNoL2Nhc2UKKyAgIGNvbnN0cnVjdGlvbi4KKworICAgU29tZSBmdW5jdGlvbiBpbiBLZXJtaXQgd3JlYWtzIGhhdm9jIHdoZW4gaXQgaXMgY2FsbGVkLiBDaGFuZ2UgYWxsCisgICBpbnZvY2F0aW9ucyBvZiB0aGUgZnVuY3Rpb24gaW50byBhIG1hY3JvIHRoYXQgZXZhbHVhdGVzIHRvIHRoZQorICAgYXBwcm9wcmlhdGUgcmV0dXJuIGNvZGUgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uCisgICBoYWQgaXQgYmVlbiBjYWxsZWQgYW5kIGZhaWxlZCwgZm9yIGV4YW1wbGU6IC1EemtzZWxmKCk9MC4gT2J2aW91c2x5CisgICBub3QgYSBnb29kIGlkZWEgaWYgdGhlIGZ1bmN0aW9uIGlzIHJlYWxseSBuZWVkZWQuCisKKyAgIElmIHlvdSBoYXZlIGp1c3QgaW5zdGFsbGVkIFN1bk9TIDQuMS4yIG9yIDQuMS4zLCB5b3UgbWlnaHQgZmluZCB0aGF0CisgICBDLUtlcm1pdCAoYW5kIGFueSBvdGhlciBDIHByb2dyYW0pIGZhaWxzIHRvIGxpbmsgYmVjYXVzZSBvZiB1bnJlc29sdmVkCisgICByZWZlcmVuY2VzIGZyb20gd2l0aGluIGxpYmMuIFRoaXMgaXMgYmVjYXVzZSBvZiBhIG1pc3Rha2UgaW4gU3VuJ3MKKyAgIC91c3IvbGliL3NobGliLmV0YyBmaWxlcyBmb3IgYnVpbGRpbmcgdGhlIG5ldyBsaWJjLiBDaGFuZ2UgdGhlIGxpYmMKKyAgIE1ha2VmaWxlIHNvIHRoYXQgdGhlICJsZCIgbGluZXMgaGF2ZSAiLWxkbCIgYXQgdGhlIGVuZC4gQ2hhbmdlIHRoZQorICAgUkVBRE1FIGZpbGUgdG8gc2F5ICJtdiB4Y2NzLm11bHRpYnl0ZS4geGNjcy5tdWx0aWJ5dGUubyIgYW5kIGZvbGxvdworICAgdGhhdCBpbnN0cnVjdGlvbi4KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworNS4gSU5TVEFMTElORyBUSEUgS0VSTUlUIEZJTEVTCisKKyAgIFsgWzE0OV1Ub3AgXSBbIFsxNTBdQ29udGVudHMgXSBbIFsxNTFdTmV4dCBdIFsgWzE1Ml1QcmV2aW91cyBdCisKKyAgIFNFQ1RJT04gQ09OVEVOVFMKKworNS4xLiBbMTUzXVRoZSBDLUtlcm1pdCBJbml0aWFsaXphdGlvbiBGaWxlCis1LjIuIFsxNTRdVGV4dCBGaWxlcworNS4zLiBbMTU1XUluc3RhbGxpbmcgdGhlIEtlcm1pdCBGaWxlcworNS40LiBbMTU2XVRoZSBNYWtlZmlsZSBJbnN0YWxsIFRhcmdldAorCisgICBUaGUgQy1LZXJtaXQgZXhlY3V0YWJsZSBkb2VzIG5vdCBuZWVkIGFueSBleHRlcm5hbCBmaWxlcyB0byBydW4uCisgICBVbmxpa2UsIHNheSwgdGhlIGN1IHByb2dyYW0sIHdoaWNoIG9uIG1vc3QgcGxhdGZvcm1zIGlzIHVzZWxlc3MgdW5sZXNzCisgICB5b3UgKGFzIHJvb3QpIGVkaXQgdGhlIC91c3Ivc3Bvb2wvdXVjcC9TeXN0ZW1zIGFuZAorICAgL3Vzci9zcG9vbC91dWNwL0RldmljZXMgZmlsZXMgdG8gc3VwcGx5IHdoYXRldmVyIG9ic2N1cmUgYW5kCisgICB1bmRvY3VtZW50ZWQgc3ludGF4IGlzIHJlcXVpcmVkIHRvIG1hdGNoIHNvbWUgc3VwcG9zZWRseSB1c2VyLWZyaWVuZGx5CisgICBtbmVtb25pYyB0byB0aGUgcmVhbCBwYXRobmFtZSBvZiB3aGF0ZXZlciBkZXZpY2UgeW91IHdhbnQgdG8gdXNlLAorICAgS2VybWl0IHJ1bnMgb24gaXRzIG93biB3aXRob3V0IG5lZWRpbmcgYW55IGV4dGVybmFsIGNvbmZpZ3VyYXRpb24KKyAgIGZpbGVzLCBhbmQgbGV0cyB5b3UgcmVmZXIgdG8gZGV2aWNlIChhbmQgbmV0d29yayBob3N0cyBhbmQgc2VydmljZXMpCisgICBieSB0aGVpciBvd24gbmF0dXJhbCB1bmRpc2d1aXNlZCBuYW1lcy4KKworICAgTmV2ZXJ0aGVsZXNzLCBhIG51bWJlciBvZiBleHRlcm5hbCBmaWxlcyBjYW4gYmUgaW5zdGFsbGVkIGFsb25nIHdpdGgKKyAgIHRoZSBDLUtlcm1pdCBleGVjdXRhYmxlIGlmIHlvdSB3aXNoLiBUaGVzZSBpbmNsdWRlIGNvbmZpZ3VyYXRpb24gYW5kCisgICBjdXN0b21pemF0aW9uIGZpbGVzIHRoYXQgYXJlIHJlYWQgYnkgS2VybWl0IGFzIHdlbGwgYXMgZG9jdW1lbnRhdGlvbgorICAgZmlsZXMgdG8gYmUgcmVhZCBieSBwZW9wbGUuIEFsbCBvZiB0aGlzIG1hdGVyaWFsIGlzIChhKSBvcHRpb25hbCwgYW5kCisgICAoYikgYXZhaWxhYmxlIG9uIHRoZSBLZXJtaXQgd2Vic2l0ZToKKworWzE1N11odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvCisKKyAgIGFuZCB1c3VhbGx5IGluIGEgbW9yZSBwbGVhc2FudCBmb3JtLCBwZXJoYXBzIGFsc28gd2l0aCB1cGRhdGVkCisgICBjb250ZW50LiBTbyBpZiB5b3VyIGNvbXB1dGVyIGlzIG9uIHRoZSBJbnRlcm5ldCwgdGhlcmUgaXMgbm8gbmVlZCB0bworICAgaW5zdGFsbCBhbnl0aGluZyBidXQgdGhlIEtlcm1pdCBleGVjdXRhYmxlIGlmIHVzZXJzIGtub3cgaG93IHRvIGZpbmQKKyAgIHRoZSBLZXJtaXQgd2Vic2l0ZSAoYW5kIGlmIHRoZXkgZG9uJ3QsIEtlcm1pdCdzICJoZWxwIiBjb21tYW5kIHRlbGxzCisgICB0aGVtKS4KKworICA1LjEuIFRoZSBDLUtlcm1pdCBJbml0aWFsaXphdGlvbiBGaWxlCisKKyAgIEluIEMtS2VybWl0IDcuMCBhbmQgZWFybGllciwgdGhlIHN0YW5kYXJkIGluaXRpYWxpemF0aW9uIGZpbGUgd2FzIGEKKyAgIGtleSBDLUtlcm1pdCBjb21wb25lbnQgYmVjYXVzZToKKworICAgIGEuIEl0ICJsb2FkZWQiIHRoZSBkaWFsaW5nIGFuZCBuZXR3b3JrIGRpcmVjdG9yaWVzLgorICAgIGIuIEl0IGRlZmluZWQgYWxsIHRoZSBtYWNyb3MgYW5kIHZhcmlhYmxlcyBmb3IgdGhlIHNlcnZpY2VzCisgICAgICAgZGlyZWN0b3J5LgorICAgIGMuIEl0IGRlZmluZWQgbWFjcm9zIGZvciBxdWlja2x5IGNoYW5naW5nIEtlcm1pdCdzIGZpbGUtdHJhbnNmZXIKKyAgICAgICBwZXJmb3JtYW5jZSB0dW5pbmcuCisKKyAgIFRoZSBzdGFuZGFyZCBpbml0aWFsaXphdGlvbiBmaWxlIGlzIHF1aXRlIGxvbmcgKG1vcmUgdGhhbiA2MDAgbGluZXMpCisgICBhbmQgcmVxdWlyZXMgbm90aWNlYWJsZSBwcm9jZXNzaW5nIHRpbWUgKHRoZSBzbG93ZXIgdGhlIGNvbXB1dGVyLCB0aGUKKyAgIG1vcmUgbm90aWNlYWJsZSksIHlldCBmZXcgcGVvcGxlIGFjdHVhbGx5IHVzZSB0aGUgc2VydmljZXMgZGlyZWN0b3J5LAorICAgd2hvc2UgZGVmaW5pdGlvbiB0YWtlcyB1cCBtb3N0IG9mIGl0cyBidWxrLiBNZWFud2hpbGUsIGluIEMtS2VybWl0CisgICA4LjAsIG1hbnkgb2YgdGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgb2YgdGhlIHN0YW5kYXJkIGluaXRpYWxpemF0aW9uCisgICBmaWxlIGFyZSBub3cgYnVpbHQgaW47IGZvciBleGFtcGxlLCB0aGUgRkFTVCwgQ0FVVElPVVMsIGFuZCBST0JVU1QKKyAgIGNvbW1hbmRzLgorCisgICBNb3JlIHRvIHRoZSBwb2ludCwgbWFueSBvZiB0aGUgc2V0dGluZ3MgdGhhdCBjb3VsZCBiZSBtYWRlIG9ubHkgaW4gdGhlCisgICBpbml0aWFsaXphdGlvbiBhbmQgY3VzdG9taXphdGlvbiBmaWxlcyBjYW4gbm93IGJlIHBpY2tlZCB1cCBmcm9tCisgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFRoZSBmaXJzdCBncm91cCBpZGVudGlmaWVzIGluaXRpYWxpemF0aW9uIGFuZAorICAgZGlyZWN0b3J5IGZpbGVzOgorCisgICBDS0VSTUlUX0lOSQorICAgICAgICAgIFRoZSBwYXRoIG9mIHlvdXIgS2VybWl0IGluaXRpYWxpemF0aW9uIGZpbGUsIGlmIGFueS4gVGhpcworICAgICAgICAgIG92ZXJyaWRlcyB0aGUgYnVpbHQtaW4gc2VhcmNoIGZvciAkSE9NRS8ua2VybXJjLgorCisgICBLX0NIQVJTRVQKKyAgICAgICAgICBUaGUgY2hhcmFjdGVyIHNldCB1c2VkIGZvciBlbmNvZGluZyBsb2NhbCB0ZXh0IGZpbGVzLgorICAgICAgICAgIEVxdWl2YWxlbnQgdG8gU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVC4KKworICAgS19ESUFMX0RJUkVDVE9SWQorICAgICAgICAgIFRoZSBmdWxsIHBhdGhuYW1lIG9mIG9uZSBvciBtb3JlIEtlcm1pdCBkaWFsaW5nIGRpcmVjdG9yeQorICAgICAgICAgIGZpbGVzLiBFcXVpdmFsZW50IHRvIFNFVCBESUFMIERJUkVDVE9SWS4KKworICAgS19ORVRfRElSRUNUT1JZCisgICAgICAgICAgVGhlIGZ1bGwgcGF0aG5hbWUgb2Ygb25lIG9yIG1vcmUgS2VybWl0IG5ldHdvcmsgZGlyZWN0b3J5CisgICAgICAgICAgZmlsZXMuIEVxdWl2YWxlbnQgdG8gU0VUIE5FVFdPUksgRElSRUNUT1JZLgorCisgICBLX0lORk9fRElSRUNUT1JZCisgICBLX0lORk9fRElSCisgICAgICAgICAgVGhlIGZ1bGwgcGF0aG5hbWUgb2YgYSBkaXJlY3RvcnkgY29udGFpbmluZyBLZXJtaXQgKGlmIGFueSkKKyAgICAgICAgICBjb250YWluaW5nIGNrdWJ3ci50eHQgYW5kIG90aGVyIEtlcm1pdCB0ZXh0IGZpbGVzLiBPdmVycmlkZXMKKyAgICAgICAgICBLZXJtaXQncyBidWlsdC1pbiBzZWFyY2ggZm9yIHRoaXMgZGlyZWN0b3J5LgorCisgICBUaGUgbmV4dCBncm91cCBpcyByZWxhdGVkIHRvIGRpYWxpbmcgbW9kZW1zOgorCisgICBLX0NPVU5UUllDT0RFCisgICAgICAgICAgVGhlIHRlbGVwaG9uaWMgbnVtZXJpYyBjb3VudHJ5IGNvZGUgZm9yIHRoaXMgbG9jYXRpb24sIGUuZy4gMQorICAgICAgICAgIGZvciBOb3J0aCBBbWVyaWNhIG9yIDM5IGZvciBJdGFseS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGlzCisgICAgICAgICAgb25lIGJlIHNldCBmb3IgYWxsIHVzZXJzLCBzeXN0ZW0td2lkZS4gTm90IG9ubHkgaXMgaXQgdXNlZCB0bworICAgICAgICAgIHByb2Nlc3MgcG9ydGFibGUtZm9ybWF0IGRpYWxpbmcgZGlyZWN0b3J5IGVudHJpZXMsIGJ1dCBpdCBpcworICAgICAgICAgIGFsc28gY29tcGFyZWQgYWdhaW5zdCBLZXJtaXQncyBidWlsdC1pbiBsaXN0IG9mICJ0b25lCisgICAgICAgICAgY291bnRyaWVzIiB0byBzZWUgaWYgdG9uZSBkaWFsaW5nIGNhbiBiZSB1c2VkLiBFcXVpdmFsZW50IHRvCisgICAgICAgICAgS2VybWl0J3MgU0VUIERJQUwgQ09VTlRSWS1DT0RFIGNvbW1hbmQuCisKKyAgIEtfQVJFQUNPREUKKyAgICAgICAgICBUaGUgdGVsZXBob25pYyBudW1lcmljIGFyZWEgY29kZSBmb3IgdGhpcyBsb2NhdGlvbiwgZS5nLiAyMTIKKyAgICAgICAgICBmb3IgTWFuaGF0dGFuLCBOZXcgWW9yaywgVVNBLiBSZWNvbW1lbmQgdGhpcyBvbmUgYWxzbyBiZSBzZXQKKyAgICAgICAgICBzeXN0ZW0td2lkZSwgc28gc2hhcmVkIHBvcnRhYmxlLWZvcm1hdCBkaWFsaW5nIGRpcmVjdG9yaWVzIHdpbGwKKyAgICAgICAgICB3b3JrIGF1dG9tYXRpY2FsbHkgZm9yIGV2ZXJ5Ym9keS4gRXF1aXZhbGVudCB0byBLZXJtaXQncyBTRVQKKyAgICAgICAgICBESUFMIEFSRUEtQ09ERSBjb21tYW5kLgorCisgICBLX0RJQUxfTUVUSE9ECisgICAgICAgICAgVE9ORSBvciBQVUxTRS4gRXF1aXZhbGVudCB0byBLZXJtaXQncyBTRVQgRElBTCBNRVRIT0QgY29tbWFuZC4KKyAgICAgICAgICBJZiBhIGRpYWwgbWV0aG9kIGlzIG5vdCBzZXQgZXhwbGljaXRseSAob3IgaW1wbGljaXRseSBmcm9tIHRoZQorICAgICAgICAgIGNvdW50cnkgY29kZSksIEtlcm1pdCBkb2VzIG5vdCBzcGVjaWZ5IGEgZGlhbGluZyBtZXRob2QsIGFuZAorICAgICAgICAgIHVzZXMgdGhlIG1vZGVtJ3MgZGVmYXVsdCBtZXRob2QsIHdoaWNoIHRlbmRzIHRvIGJlIHB1bHNlLgorCisgICBLX0lOVExfUFJFRklYCisgICAgICAgICAgVGhlIHRlbGVwaG9uaWMgbnVtZXJpYyBpbnRlcm5hdGlvbmFsIGRpYWxpbmcgcHJlZml4IGZvciB0aGlzCisgICAgICAgICAgbG9jYXRpb24uIEVxdWl2YWxlbnQgdG8gS2VybWl0J3MgU0VUIERJQUwgSU5UTC1QUkVGSVggY29tbWFuZC4KKworICAgS19MRF9QUkVGSVgKKyAgICAgICAgICBUaGUgdGVsZXBob25pYyBudW1lcmljIGxvbmctZGlzdGFuY2UgZGlhbGluZyBwcmVmaXggZm9yIHRoaXMKKyAgICAgICAgICBsb2NhdGlvbi4gRXF1aXZhbGVudCB0byBLZXJtaXQncyBTRVQgRElBTCBMRC1QUkVGSVggY29tbWFuZC4KKworICAgS19QQlhfSUNQCisgICAgICAgICAgVGhlIHRlbGVwaG9uaWMgbnVtZXJpYyBQQlggaW50ZXJuYWwgY2FsbCBwcmVmaXggZm9yIHRoaXMKKyAgICAgICAgICBsb2NhdGlvbi4gRXF1aXZhbGVudCB0byBLZXJtaXQncyBTRVQgRElBTCBQQlgtSU5TSURFLVBSRUZJWAorICAgICAgICAgIGNvbW1hbmQuCisKKyAgIEtfUEJYX09DUAorICAgICAgICAgIFRoZSB0ZWxlcGhvbmljIG51bWVyaWMgUEJYIGV4dGVybmFsIGNhbGwgcHJlZml4IGZvciB0aGlzCisgICAgICAgICAgbG9jYXRpb24uIEVxdWl2YWxlbnQgdG8gS2VybWl0J3MgU0VUIERJQUwgUEJYLU9VVFNJREUtUFJFRklYCisgICAgICAgICAgY29tbWFuZC4KKworICAgS19QQlhfWENICisgICAgICAgICAgVGhlIHRlbGVwaG9uaWMgbnVtZXJpYyBQQlggZXhjaGFuZ2UgKGZpcnN0IHBhcnQgb2YgdGhlCisgICAgICAgICAgc3Vic2NyaWJlciBudW1iZXIpLiBFcXVpdmFsZW50IHRvIEtlcm1pdCdzIFNFVCBESUFMCisgICAgICAgICAgUEJYLUVYQ0hBTkdFIGNvbW1hbmQuCisKKyAgIEtfVEZfQVJFQUNPREUKKyAgICAgICAgICBBIGxpc3Qgb2Ygb25lIG9yIG1vcmUgdGVsZXBob25pYyBudW1lcmljIHRvbGwtZnJlZSBhcmVhIGNvZGVzLgorCisgICBLX1RGX1BSRUZJWAorICAgICAgICAgIFRoZSB0ZWxlcGhvbmljIG51bWVyaWMgdG9sbC1mcmVlIGRpYWxpbmcgcHJlZml4LCBpbiBjYXNlIGl0IGlzCisgICAgICAgICAgZGlmZmVyZW50IGZyb20gdGhlIGxvbmctZGlzdGFuY2UgcHJlZml4LiBFcXVpdmFsZW50IHRvIEtlcm1pdCdzCisgICAgICAgICAgU0VUIERJQUwgVEYtUFJFRklYIGNvbW1hbmQuCisKKyAgIFRoZSBmaW5hbCBncm91cCBpbmNsdWRlcyB3ZWxsLWtub3duIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGFyZQorICAgYWxzbyB1c2VkIGJ5IEtlcm1pdDoKKworICAgQ0RQQVRICisgICAgICAgICAgV2hlcmUgdGhlIENEIGNvbW1hbmQgc2hvdWxkIGxvb2sgZm9yIHJlbGF0aXZlIGRpcmVjdG9yeSBuYW1lcy4KKworICAgU0hFTEwKKyAgICAgICAgICBUaGUgcGF0aCBvZiB5b3VyIFVuaXggc2hlbGwuIFVzZWQgYnkgdGhlIFJVTiAoISkgY29tbWFuZCB0bworICAgICAgICAgIGNob29zZSB0aGUgc2hlbGwgdG8gZXhlY3V0ZSBpdHMgYXJndW1lbnRzLgorCisgICBVU0VSCisgICAgICAgICAgWW91ciBVbml4IHVzZXJuYW1lLgorCisgICBFRElUT1IKKyAgICAgICAgICBUaGUgbmFtZSBvciBwYXRoIG9mIHlvdXIgcHJlZmVycmVkIGVkaXRvciAodXNlZCBieSB0aGUgRURJVAorICAgICAgICAgIGNvbW1hbmQpLiBFcXVpdmFsZW50IHRvIFNFVCBFRElUT1IuCisKKyAgIEJST1dTRVIKKyAgICAgICAgICBUaGUgbmFtZSBvciBwYXRoIG9mIHlvdXIgcHJlZmVycmVkIHdlYiBicm93c2VyICh1c2VkIGJ5IHRoZQorICAgICAgICAgIEJST1dTRSBjb21tYW5kKS4gRXF1aXZhbGVudCB0byBLZXJtaXQncyBTRVQgQlJPV1NFUiBjb21tYW5kLgorCisgICBEb2VzIHRoaXMgbWVhbiB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZSBjYW4gYmUgYWJvbGlzaGVkPyBJIHRoaW5rIHNvLgorICAgSGVyZSdzIHdoeToKKworICAgICAqIEtlcm1pdCBhbHJlYWR5IGRvZXMgZXZlcnl0aGluZyBtb3N0IHBlb3BsZSB3YW50IGl0IHRvIGRvIHdpdGhvdXQKKyAgICAgICBvbmUuCisgICAgICogSW1wb3J0YW50IHNpdGUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgY2FuIGJlIGRvbmUgd2l0aCBnbG9iYWwKKyAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgICAgICogVGhlcmUgaXMgbm8gbG9uZ2VyIGFueSBuZWVkIGZvciBldmVyeWJvZHkgdG8gaGF2ZSB0byB1c2UgdGhlCisgICAgICAgc3RhbmRhcmQgaW5pdGlhbGl6YXRpb24gZmlsZS4KKyAgICAgKiBUaGlzIG1lYW5zIHRoYXQgeW91ciBpbml0aWFsaXphdGlvbiBmaWxlLCBpZiB5b3Ugd2FudCBvbmUsIGNhbgorICAgICAgIGNvbnRhaW4geW91ciBvd24gcGVyc29uYWwgc2V0dGluZ3MsIGRlZmluaXRpb25zLCBhbmQgcHJlZmVyZW5jZXMsCisgICAgICAgcmF0aGVyIHRoYW4gNjAwIGxpbmVzIG9mICJzdGFuZGFyZCIgc2V0dXBzLgorICAgICAqIElmIHlvdSBzdGlsbCB3YW50IHRoZSBzZXJ2aWNlcyBkaXJlY3RvcnksIHlvdSBjYW4gZWl0aGVyIFRBS0UgdGhlCisgICAgICAgc3RhbmRhcmQgaW5pdGlhbGl6YXRpb24gZmlsZSAod2hpY2ggbXVzdCBiZSBuYW1lZCBhbnl0aGluZyBvdGhlcgorICAgICAgIHRoYW4gJEhPTUUvLmtlcm1yYyB0byBhdm9pZCBiZWluZyBleGVjdXRlZCBhdXRvbWF0aWNhbGx5IGV2ZXJ5CisgICAgICAgdGltZSB5b3Ugc3RhcnQgS2VybWl0KSwgb3IgeW91IGNhbiBtYWtlIGl0IGEga2VyYmFuZyBzY3JpcHQgYW5kCisgICAgICAgZXhlY3V0ZSBpdCAiZGlyZWN0bHkiICh0aGUgWzE1OF1tYWtlZmlsZSBpbnN0YWxsIHRhcmdldCBkb2VzIHRoaXMKKyAgICAgICBmb3IgeW91IGJ5IHB1dHRpbmcgY2tlcm1pdC5pbmkgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBLZXJtaXQKKyAgICAgICBiaW5hcnksIGFkZGluZyB0aGUgYXBwcm9wcmlhdGUgS2VyYmFuZyBsaW5lIHRvIHRoZSB0b3AsIGFuZCBnaXZpbmcKKyAgICAgICBpdCBleGVjdXRlIHBlcm1pc3Npb24pLgorCisgICBJbiBmYWN0LCB5b3UgY2FuIHB1dCBhbnkgbnVtYmVyIG9mIGtlcmJhbmcgc2NyaXB0cyBpbiB5b3VyIFBBVEggdG8KKyAgIHN0YXJ0IHVwIEMtS2VybWl0IGluIGRpZmZlcmVudCB3YXlzLCB0byBoYXZlIGl0IGFkb3B0IGNlcnRhaW4KKyAgIHNldHRpbmdzLCBtYWtlIHBhcnRpY3VsYXIgY29ubmVjdGlvbnMsIGV4ZWN1dGUgY29tcGxpY2F0ZWQgc2NyaXB0cywKKyAgIHdoYXRldmVyIHlvdSB3YW50LgorCisgIDUuMi4gVGV4dCBGaWxlcworCisgICBUaGVzZSBhcmUgZW50aXJlbHkgb3B0aW9uYWwuIE1hbnkgb2YgdGhlbSBhcmUgdG8gYmUgZm91bmQgYXQgdGhlCisgICBLZXJtaXQgd2Vic2l0ZSBpbiBIVE1MIGZvcm0gKGkuZS4gYXMgV2ViIHBhZ2VzIHdpdGggY2xpY2thYmxlIGxpbmtzLAorICAgZXRjKSwgYW5kIHZlcnkgbGlrZWx5IGFsc28gbW9yZSB1cCB0byBkYXRlLiBQbGFpbi10ZXh0IGZpbGVzIHRoYXQKKyAgIGNvcnJlc3BvbmQgdG8gV2ViIHBhZ2VzIHdlcmUgc2ltcGx5ICJkdW1wZWQiIGJ5IEx5bnggZnJvbSB0aGUgd2Vic2l0ZQorICAgdG8gcGxhaW4gQVNDSUkgdGV4dC4gVGhlIGZvcm1hdCBpcyB3aGF0ZXZlciBMeW54IHVzZXMgZm9yIHRoaXMKKyAgIHB1cnBvc2UuIElmIHlvdSB3aXNoLCB5b3UgY2FuIGluc3RhbGwgdGhlbSBvbiB5b3VyIGNvbXB1dGVyIGFzCisgICBkZXNjcmliZWQgaW4gdGhlIFsxNTldbmV4dCBzZWN0aW9uLgorCisgICBbMTYwXUNPUFlJTkcuVFhUCisgICAgICAgICAgQ29weXJpZ2h0IG5vdGljZSwgcGVybWlzc2lvbnMsIGFuZCBkaXNjbGFpbWVyLgorCisgICBbMTYxXWNrZXJtaXQuaW5pCisgICAgICAgICAgVGhlIHN0YW5kYXJkIGluaXRpYWxpemF0aW9uIGZpbGUsIGludGVuZGVkIG1vcmUgZm9yIHJlZmVyZW5jZQorICAgICAgICAgIChpbiBtb3N0IGNhc2VzKSB0aGFuIGFjdHVhbCB1c2U7IHNlZSBbMTYyXVNlY3Rpb24gNS4xLgorCisgICBbMTYzXWNrZXJtb2QuaW5pCisgICAgICAgICAgQSBzYW1wbGUgY3VzdG9taXphdGlvbiBmaWxlLgorCisgICBbMTY0XWNrZXJtaXQ3MC50eHQKKyAgICAgICAgICBTdXBwbGVtZW50IHRvIFsxNjVdVXNpbmcgQy1LZXJtaXQgZm9yIHZlcnNpb24gNy4wLiBBdmFpbGFibGUgb24KKyAgICAgICAgICB0aGUgS2VybWl0IHdlYnNpdGUgYXM6CisgICAgICAgICAgWzE2Nl1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwKKworICAgWzE2N11ja2VybWl0ODAudHh0CisgICAgICAgICAgU3VwcGxlbWVudCB0byBbMTY4XVVzaW5nIEMtS2VybWl0IGZvciB2ZXJzaW9uIDguMC4gQXZhaWxhYmxlIG9uCisgICAgICAgICAgdGhlIEtlcm1pdCB3ZWJzaXRlIGFzOgorICAgICAgICAgIFsxNjldaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sCisKKyAgIFsxNzBdY2tjYndyLnR4dAorICAgICAgICAgIFRoZSBnZW5lcmFsIEMtS2VybWl0IGhpbnRzIGFuZCB0aXBzICgiYmV3YXJlIikgZmlsZS4gQXZhaWxhYmxlCisgICAgICAgICAgb24gdGhlIEtlcm1pdCB3ZWJzaXRlIGFzOgorICAgICAgICAgIFsxNzFdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sCisKKyAgIFsxNzJdY2t1YndyLnR4dAorICAgICAgICAgIFRoZSBVbml4LXNwZWNpZmljIEMtS2VybWl0IGhpbnRzIGFuZCB0aXBzIGZpbGUuIEF2YWlsYWJsZSBvbgorICAgICAgICAgIHRoZSBLZXJtaXQgd2Vic2l0ZSBhczoKKyAgICAgICAgICBbMTczXWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbAorCisgICBbMTc0XWNrdWlucy50eHQKKyAgICAgICAgICBVbml4IEMtS2VybWl0IEluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnMgKHRoaXMgZmlsZSkuIEF2YWlsYWJsZQorICAgICAgICAgIG9uIHRoZSBLZXJtaXQgd2Vic2l0ZSBhczoKKyAgICAgICAgICBbMTc1XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbAorCisgICBbMTc2XWNrY2NmZy50eHQKKyAgICAgICAgICBDLUtlcm1pdCBjb21waWxlLXRpbWUgY29uZmlndXJhdGlvbiBvcHRpb25zLiBBdmFpbGFibGUgb24gdGhlCisgICAgICAgICAgS2VybWl0IHdlYnNpdGUgYXM6CisgICAgICAgICAgWzE3N11odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwKKworICAgWzE3OF1ja2NwbG0udHh0CisgICAgICAgICAgVGhlIEMtS2VybWl0IHByb2dyYW0gbG9naWMgbWFudWFsLiBBdmFpbGFibGUgb24gdGhlIEtlcm1pdAorICAgICAgICAgIHdlYnNpdGUgYXM6CisgICAgICAgICAgWzE3OV1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjcGxtLmh0bWwKKworICAgWzE4MF1jYV9jZXJ0cy5wZW0KKyAgICAgICAgICBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgY2VydGlmaWNhdGVzIGZvciBzZWN1cmUgY29ubmVjdGlvbnMgKHNlZQorICAgICAgICAgIFsxODFdU2VjdGlvbiAxNikuCisKKyAgNS4zLiBJbnN0YWxsaW5nIHRoZSBLZXJtaXQgRmlsZXMKKworICAgVGhlcmUgaXMgYW4gImluc3RhbGwiIHRhcmdldCBpbiB0aGUgWzE4Ml1tYWtlZmlsZSB0aGF0IHlvdSBjYW4gdXNlIGlmCisgICB5b3Ugd2lzaC4gSG93ZXZlciwgc2luY2UgZXZlcnkgc2l0ZSBoYXMgaXRzIG93biBsYXlvdXQgYW5kCisgICByZXF1aXJlbWVudHMsIGl0IGlzIG9mdGVuIGJldHRlciB0byBpbnN0YWxsIHRoZSBLZXJtaXQgZmlsZXMgYnkgaGFuZC4KKyAgIFlvdSBkb24ndCBoYXZlIHRvIHVzZSB0aGUgbWFrZWZpbGUgaW5zdGFsbCB0YXJnZXQgdG8gaW5zdGFsbCBDLUtlcm1pdC4KKyAgIFRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIHNpbmNlIG5vdCBhbGwgc2l0ZXMgYnVpbGQgQy1LZXJtaXQgZnJvbQorICAgc291cmNlLCBhbmQgdGhlcmVmb3JlIG1pZ2h0IG5vdCBldmVuIGhhdmUgdGhlIG1ha2VmaWxlLiBCdXQgeW91IHNob3VsZAorICAgcmVhZCB0aGlzIHNlY3Rpb24gaW4gYW55IGNhc2UuCisKKyAgICAgSWYgeW91ciBjb21wdXRlciBhbHJlYWR5IGhhcyBhbiBvbGRlciB2ZXJzaW9uIG9mIEMtS2VybWl0CisgICAgIGluc3RhbGxlZCwgeW91IHNob3VsZCByZW5hbWUgaXQgKGUuZy4gdG8gImtlcm1pdDYiIG9yICJrZXJtaXQ3Iikgc28KKyAgICAgaW4gY2FzZSB5b3UgaGF2ZSBhbnkgdHJvdWJsZSB3aXRoIHRoZSBuZXcgdmVyc2lvbiwgdGhlIG9sZCBvbmUgaXMKKyAgICAgc3RpbGwgYXZhaWxhYmxlLgorCisgICBJbiBtb3N0IGNhc2VzLCB5b3UgbmVlZCB0byBiZSByb290IHRvIGluc3RhbGwgQy1LZXJtaXQsIGlmIG9ubHkgdG8KKyAgIGdhaW4gd3JpdGUgYWNjZXNzIHRvIGRpcmVjdG9yaWVzIGluIHdoaWNoIHRoZSBiaW5hcnkgYW5kIG1hbnVhbCBwYWdlCisgICBhcmUgdG8gYmUgY29waWVkLiBUaGUgQy1LZXJtaXQgYmluYXJ5IHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gYQorICAgZGlyZWN0b3J5IHRoYXQgaXMgaW4gdGhlIHVzZXJzJyBQQVRILCBidXQgdGhhdCBpcyBub3QgbGlrZWx5IHRvIGJlCisgICBvdmVyd3JpdHRlbiB3aGVuIHlvdSBpbnN0YWxsIGEgbmV3IHZlcnNpb24gb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0uIEEKKyAgIGdvb2QgY2FuZGlkYXRlIHdvdWxkIGJlIHRoZSAvdXNyL2xvY2FsL2Jpbi8gZGlyZWN0b3J5LCBidXQgdGhlCisgICBzcGVjaWZpYyBjaG9pY2UgaXMgc2l0ZSBkZXBlbmRlbnQuIEV4YW1wbGUgKGFzc3VtaW5nIHRoZSBhcHByb3ByaWF0ZQorICAgS2VybWl0IGJpbmFyeSBpcyBzdG9yZWQgaW4geW91ciBjdXJyZW50IGRpcmVjdG9yeSBhcyAid2VybWl0IiwgZS5nLgorICAgYmVjYXVzZSB5b3UganVzdCBidWlsdCBpdCBmcm9tIHNvdXJjZSBhbmQgdGhhdCdzIHRoZSBuYW1lIHRoZSBtYWtlZmlsZQorICAgZ2F2ZSBpdCk6CisKK212IHdlcm1pdCAvdXNyL2xvY2FsL2Jpbi9rZXJtaXQKK2NobW9kIDc1NSAvdXNyL2xvY2FsL2Jpbi9rZXJtaXQKKworICAgb3IgKG9ubHkgYWZ0ZXIgeW91IGZpbmlzaCByZWFkaW5nIHRoaXMgc2VjdGlvbiEpIHNpbXBseToKKworbWFrZSBpbnN0YWxsCisKKyAgIElNUE9SVEFOVDogSUYgQy1LRVJNSVQgSVMgVE8gQkUgVVNFRCBGT1IgRElBTElORyBPVVQsIHlvdSBtdXN0IGFsc28gZG8KKyAgIHNvbWV0aGluZyB0byBnaXZlIGl0IGFjY2VzcyB0byB0aGUgZGlhbG91dCBkZXZpY2VzIGFuZCBsb2NrZmlsZQorICAgZGlyZWN0b3JpZXMuIFRoZSAnaW5zdGFsbCcgdGFyZ2V0IGRvZXMgbm90IGF0dGVtcHQgdG8gc2V0IEtlcm1pdCdzCisgICBvd25lciwgZ3JvdXAsIGFuZCBwZXJtaXNzaW9ucyB0byBhbGxvdyBkaWFsaW5nIG91dC4gVGhpcyByZXF1aXJlcworICAgcHJpdmlsZWdlcywgb3BlbiBleWVzLCBhbmQgaHVtYW4gZGVjaXNpb24tbWFraW5nLiBQbGVhc2UgcmVhZAorICAgWzE4M11TZWN0aW9ucyAxMCBhbmQgWzE4NF0xMSBiZWxvdywgbWFrZSB0aGUgbmVjZXNzYXJ5IGRlY2lzaW9ucywgYW5kCisgICB0aGVuIGltcGxlbWVudCB0aGVtIGJ5IGhhbmQgYXMgZGVzY3JpYmVkIGluIHRob3NlIHNlY3Rpb25zLgorCisgICBZb3Ugc2hvdWxkIGFsc28gaW5zdGFsbCB0aGUgbWFuIHBhZ2UsIHdoaWNoIGlzIGNhbGxlZCBja3VrZXIubnIsIGluCisgICB0aGUgbWFuIHBhZ2UgZGlyZWN0b3J5IGZvciBsb2NhbCBjb21tYW5kcywgc3VjaCBhcyAvdXNyL21hbi9tYW4xLywKKyAgIHJlbmFtZWQgYXBwcm9wcmlhdGVseSwgZS5nLiB0byBrZXJtaXQuMS4gVGhpcyBpcyBhbHNvIHRha2VuIGNhcmUgb2YgYnkKKyAgICJtYWtlIGluc3RhbGwiLgorCisgICBPcHRpb25hbGx5LCB0aGUgdGV4dCBmaWxlcyBsaXN0ZWQgaW4gdGhlIFsxODVdcHJldmlvdXMgc2VjdGlvbiBjYW4gYmUKKyAgIHBsYWNlZCBpbiBhIHB1YmxpY2x5IHJlYWRhYmxlIGRpcmVjdG9yeS4gU3VnZ2VzdGVkIGRpcmVjdG9yeSBuYW1lcworICAgYXJlOgorCisvdXNyL2xvY2FsL2RvYy9rZXJtaXQvCisvdXNyL2xvY2FsL2xpYi9rZXJtaXQvCisvdXNyL3NoYXJlL2xpYi9rZXJtaXQvCisvb3B0L2tlcm1pdC9kb2MvCisKKyAgIChvciBhbnkgb2YgdGhlc2Ugd2l0aG91dCB0aGUgIi9rZXJtaXQiKS4gVXBvbiBzdGFydHVwLCBDLUtlcm1pdCBjaGVja3MKKyAgIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdob3NlIHB1cnBvc2UgaXMgdG8gc3BlY2lmeSB0aGUKKyAgIGRpcmVjdG9yeSB3aGVyZSB0aGUgQy1LZXJtaXQgdGV4dCBmaWxlcyBhcmUsIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisKK0tfSU5GT19ESVJFQ1RPUlkKK0tfSU5GT19ESVIKKworICAgSWYgZWl0aGVyIG9mIHRoZXNlIGlzIGRlZmluZWQsIEMtS2VybWl0IGNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZgorICAgdGhlIGNrdWJ3ci50eHQgZmlsZSAoVW5peCBDLUtlcm1pdCBIaW50cyBhbmQgVGlwcykuIElmIG5vdCBmb3VuZCwgaXQKKyAgIGNoZWNrcyB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGFib3ZlIChib3RoIHdpdGggYW5kIHdpdGhvdXQgdGhlCisgICAiL2tlcm1pdCIpIHBsdXMgc2V2ZXJhbCBvdGhlcnMgdG8gc2VlIGlmIHRoZXkgY29udGFpbiB0aGUgY2t1YndyLnR4dAorICAgZmlsZS4gSWYgZm91bmQsIHZhcmlvdXMgQy1LZXJtaXQgbWVzc2FnZXMgY2FuIHJlZmVyIHRoZSB1c2VyIHRvIHRoaXMKKyAgIGRpcmVjdG9yeS4KKworICAgRmluYWxseSwgaWYgeW91IHdhbnQgdG8gcHV0IHRoZSBzb3VyY2UgY29kZSBmaWxlcyBzb21ld2hlcmUgZm9yIHBlb3BsZQorICAgdG8gbG9vayBhdCwgeW91IGNhbiBkbyB0aGF0IHRvby4KKworICA1LjQuIFRoZSBNYWtlZmlsZSBJbnN0YWxsIFRhcmdldAorCisgICBUaGUgbWFrZWZpbGUgImluc3RhbGwiIHRhcmdldCBkb2VzIGFsbW9zdCBldmVyeXRoaW5nIGZvciB5b3UgaWYgeW91CisgICBnaXZlIGl0IHRoZSBpbmZvcm1hdGlvbiBpdCBuZWVkcyBieSBzZXR0aW5nIHRoZSB2YXJpYWJsZXMgZGVzY3JpYmVkCisgICBiZWxvdy4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgaWY6CisKKyAgICAgKiBZb3UgZG93bmxvYWRlZCB0aGUgWzE4Nl1jb21wbGV0ZSBDLUtlcm1pdCBhcmNoaXZlIGFuZCBidWlsdAorICAgICAgIEMtS2VybWl0IGZyb20gc291cmNlOyBvcjoKKyAgICAgKiBZb3UgZG93bmxvYWRlZCBhbiBbMTg3XWluZGl2aWR1YWwgQy1LZXJtaXQgYmluYXJ5IGFuZCB0aGUKKyAgICAgICBbMTg4XUMtS2VybWl0IHRleHQtZmlsZSBhcmNoaXZlLCBhbmQgeW91ciBjb21wdXRlciBoYXMgYSAibWFrZSIKKyAgICAgICBjb21tYW5kLgorCisgICBIZXJlIGFyZSB0aGUgcGFyYW1ldGVycyB5b3UgbmVlZCB0byBrbm93OgorCisgICBCSU5BUlkKKyAgICAgICAgICBOYW1lIG9mIHRoZSBiaW5hcnkgeW91IHdhbnQgdG8gaW5zdGFsbCBhcyAia2VybWl0Ii4gRGVmYXVsdDoKKyAgICAgICAgICAid2VybWl0Ii4KKworICAgcHJlZml4CisgICAgICAgICAgKGxvd2VyIGNhc2UpIElmIHlvdSBkZWZpbmUgdGhpcyB2YXJpYWJsZSwgaXRzIHZhbHVlIGlzCisgICAgICAgICAgcHJlcGVuZGVkIHRvIGFsbCB0aGUgZm9sbG93aW5nIHh4eERJUiB2YXJpYWJsZXMgKDguMC4yMTEgYW5kCisgICAgICAgICAgbGF0ZXIpLgorCisgICBERVNURElSCisgICAgICAgICAgSWYgeW91IHdhbnQgdG8gaW5zdGFsbCB0aGUgS2VybWl0IGZpbGVzIGluIGEgZGlyZWN0b3J5CisgICAgICAgICAgc3RydWN0dXJlIGxpa2UgL29wdC9rZXJtaXQvYmluLywgL29wdC9rZXJtaXQvZG9jLywKKyAgICAgICAgICAvb3B0L2tlcm1pdC9zcmMvLCB0aGVuIGRlZmluZSBERVNUSVIgYXMgdGhlIHJvb3Qgb2YgdGhpcworICAgICAgICAgIHN0cnVjdHVyZTsgZm9yIGV4YW1wbGUsIC9vcHQva2VybWl0LiBUaGUgREVTVERJUiBzdHJpbmcgc2hvdWxkCisgICAgICAgICAgbm90IGVuZCB3aXRoIGEgc2xhc2guIEJ5IGRlZmF1bHQsIERFU1RESVIgaXMgbm90IGRlZmluZWQuIElmIGl0CisgICAgICAgICAgaXMgZGVmaW5lZCwgYnV0IHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsIHRoZSBtYWtlZmlsZQorICAgICAgICAgIGF0dGVtcHRzIHRvIGNyZWF0ZSBpdCwgd2hpY2ggbWlnaHQgcmVxdWlyZSB5b3UgdG8gYmUgcm9vdC4gRXZlbgorICAgICAgICAgIHNvLCB0aGlzIGNhbiBmYWlsIGlmIGFueSBzZWdtZW50cyBpbiB0aGUgcGF0aCBleGNlcHQgdGhlIGxhc3QKKyAgICAgICAgICBvbmUgZG8gbm90IGFscmVhZHkgZXhpc3QuIFdBUk5JTkc6IElmIHRoZSBtYWtlZmlsZSBjcmVhdGVzIGFueQorICAgICAgICAgIGRpcmVjdG9yaWVzLCBpdCBnaXZlcyB0aGVtIGEgbW9kZSBvZiA3NTUsIGFuZCB0aGUgZGVmYXVsdCBvd25lcgorICAgICAgICAgIGFuZCBncm91cC4gTW9kaWZ5IHRoZXNlIGJ5IGhhbmQgaWYgbmVjZXNzYXJ5LgorCisgICBCSU5ESVIKKyAgICAgICAgICBEaXJlY3RvcnkgaW4gd2hpY2ggdG8gaW5zdGFsbCB0aGUgS2VybWl0IGJpbmFyeSAoYW5kIHRoZQorICAgICAgICAgIHN0YW5kYXJkIEMtS2VybWl0IGluaXRpYWxpemF0aW9uIGZpbGUsIGlmIGl0IGlzIGZvdW5kLCBhcyBhCisgICAgICAgICAgS2VyYmFuZyBzY3JpcHQpLiBJZiBERVNURElSIGlzIGRlZmluZWQsIEJJTkRJUiBtdXN0IHN0YXJ0IHdpdGgKKyAgICAgICAgICBhIHNsYXNoLiBCSU5ESVIgbXVzdCBub3QgZW5kIHdpdGggYSBzbGFzaC4gSWYgREVTVERJUiBpcworICAgICAgICAgIGRlZmluZWQsIEJJTkRJUiBpcyBhIHN1YmRpcmVjdG9yeSBvZiBERVNURElSLiBJZiBCSU5ESVIgZG9lcworICAgICAgICAgIG5vdCBleGlzdCwgdGhlIG1ha2VmaWxlIGF0dGVtcHRzIHRvIGNyZWF0ZSBpdCBhcyB3aXRoIERFU1RESVIuCisgICAgICAgICAgRGVmYXVsdDogL3Vzci9sb2NhbC9iaW4uCisKKyAgIE1BTkRJUgorICAgICAgICAgIERpcmVjdG9yeSBpbiB3aGljaCB0byBpbnN0YWxsIHRoZSBDLUtlcm1pdCBtYW51YWwgcGFnZSBhcworICAgICAgICAgICJrZXJtaXQiIGZvbGxvd2VkIGJ5IHRoZSBtYW51YWwtY2hhcHRlciBleHRlbnNpb24gKG5leHQgaXRlbSkuCisgICAgICAgICAgRGVmYXVsdDogL3Vzci9tYW4vbWFuMS4gSWYgTUFORElSIGlzIGRlZmluZWQsIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICBtdXN0IGFscmVhZHkgZXhpc3QuCisKKyAgIE1BTkVYVAorICAgICAgICAgIEV4dGVuc2lvbiBmb3IgdGhlIG1hbnVhbCBwYWdlLiBEZWZhdWx0OiAxIChkaWdpdCBvbmUpLgorCisgICBTUkNESVIKKyAgICAgICAgICBEaXJlY3RvcnkgaW4gd2hpY2ggdG8gaW5zdGFsbCB0aGUgQy1LZXJtaXQgc291cmNlIGNvZGUuIElmCisgICAgICAgICAgREVTVERJUiBpcyBkZWZpbmVkLCB0aGlzIGlzIGEgc3ViZGlyZWN0b3J5IG9mIERFU1RESVIuIERlZmF1bHQ6CisgICAgICAgICAgTm9uZS4KKworICAgQ0VSVERJUgorICAgICAgICAgIEZvciBzZWN1cmUgYnVpbGRzIG9ubHk6IERpcmVjdG9yeSBpbiB3aGljaCB0byBpbnN0YWxsIHRoZQorICAgICAgICAgIGNhX2NlcnRzLnBlbSBmaWxlLiBUaGlzIG11c3QgYmUgdGhlIHZlcmlmaWNhdGlvbiBkaXJlY3RvcnkgdXNlZAorICAgICAgICAgIGJ5IHByb2dyYW1zIHRoYXQgdXNlIHRoZSBTU0wgbGlicmFyaWVzIGF0IHlvdXIgc2l0ZS4gRGVmYXVsdDoKKyAgICAgICAgICBub25lLiBQb3NzaWJpbGl0aWVzIGluY2x1ZGU6IC91c3IvbG9jYWwvc3NsLCAvb3B0L3NzbCwKKyAgICAgICAgICAvdXNyL2xpYi9zc2wsIC4gLiAuICAgICBJZiBDRVJURElSIGlzIGRlZmluZWQsIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICBtdXN0IGFscmVhZHkgZXhpc3QuCisKKyAgIElORk9ESVIKKyAgICAgICAgICBEaXJlY3RvcnkgaW4gd2hpY2ggdG8gaW5zdGFsbCB0aGUgQy1LZXJtaXQgdGV4dCBmaWxlcy4gSWYKKyAgICAgICAgICBERVNURElSIGlzIGRlZmluZWQsIHRoaXMgaXMgYSBzdWJkaXJlY3Rvcnkgb2YgREVTVERJUi4gRGVmYXVsdDoKKyAgICAgICAgICBOb25lLiBJZiBJTkZPRElSIGlzIGRlZmluZWQgYnV0IGRvZXMgbm90IGV4aXN0LCB0aGUgbWFrZWZpbGUKKyAgICAgICAgICBhdHRlbXB0cyB0byBjcmVhdGUgaXQsIGFzIHdpdGggREVTVERJUi4KKworICAgRXhhbXBsZXM6CisKKyAgIG1ha2UgaW5zdGFsbAorICAgICAgICAgIEluc3RhbGxzICJ3ZXJtaXQiIGFzIC91c3IvbG9jYWwvYmluL2tlcm1pdCB3aXRoIHBlcm1pc3Npb25zCisgICAgICAgICAgNzU1LCB0aGUgZGVmYXVsdCBvd25lciBhbmQgZ3JvdXAsIGFuZCBubyBzcGVjaWFsIHByaXZpbGVnZXMuCisgICAgICAgICAgVGhlIG1hbnVhbCBwYWdlIGlzIGluc3RhbGxlZCBhcyAvdXNyL21hbi9tYW4xL2tlcm1pdC4xLiBUZXh0CisgICAgICAgICAgZmlsZXMgYXJlIG5vdCBjb3BpZWQgYW55d2hlcmUsIG5vciBhcmUgdGhlIHNvdXJjZXMuCisKKyAgIG1ha2UgTUFORElSPSBpbnN0YWxsCisgICAgICAgICAgSnVzdCBsaWtlICJtYWtlIGluc3RhbGwiIGJ1dCBkb2VzIG5vdCBhdHRlbXB0IHRvIGluc3RhbGwgdGhlCisgICAgICAgICAgbWFudWFsIHBhZ2UuCisKKyAgIG1ha2UgREVTVERJUj0vb3B0L2tlcm1pdCBCSU5ESVI9L2JpbiBTUkNESVI9L3NyYyBJTkZPRElSPS9kb2MgaW5zdGFsbAorICAgICAgICAgIEluc3RhbGxzIHRoZSBLZXJtaXQgYmluYXJ5ICJ3ZXJtaXQiIGFzIC9vcHQva2VybWl0L2Jpbi9rZXJtaXQsCisgICAgICAgICAgcHV0cyB0aGUgc291cmNlIGNvZGUgaW4gL29wdC9rZXJtaXQvc3JjLCBhbmQgcHV0cyB0aGUgdGV4dAorICAgICAgICAgIGZpbGVzIGluIC9vcHQva2VybWl0L2RvYywgY3JlYXRpbmcgdGhlIGRpcmVjdG9yaWVzIGlmIHRoZXkKKyAgICAgICAgICBkb24ndCBhbHJlYWR5IGV4aXN0LCBhbmQgcHV0cyB0aGUgbWFuIHBhZ2UgaW4gdGhlIGRlZmF1bHQKKyAgICAgICAgICBsb2NhdGlvbi4KKworICAgbWFrZSBCSU5ESVI9L3Vzci9sb2NhbC9iaW4gQ0VSVERJUj0vdXNyL2xvY2FsL3NzbCBpbnN0YWxsCisgICAgICAgICAgSW5zdGFsbHMgdGhlIEtlcmJlcml6ZWQgS2VybWl0IGJpbmFyeSAid2VybWl0IiBhcworICAgICAgICAgIC91c3IvbG9jYWwvYmluL2tlcm1pdCwgcHV0cyB0aGUgQ0EgQ2VydGlmaWNhdGVzIGZpbGUgaW4KKyAgICAgICAgICAvdXNyL2xvY2FsL3NzbC8sIGFuZCB0aGUgbWFuIHBhZ2UgaW4gdGhlIG5vcm1hbCBwbGFjZS4KKworICAgRm9yIGRlZmluaXRpdmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgbWFrZWZpbGUuIFRoZSBmb2xsb3dpbmcgaXMKKyAgIGV4Y2VycHRlZCBmcm9tIHRoZSA4LjAuMjExIG1ha2VmaWxlOgorCisjIFRoZSBmb2xsb3dpbmcgc3ltYm9scyBhcmUgdXNlZCB0byBzcGVjaWZ5IGxpYnJhcnkgYW5kIGhlYWRlciBmaWxlIGxvY2F0aW9ucworIyBSZWRlZmluZSB0aGVtIHRvIHRoZSB2YWx1ZXMgdXNlZCBvbiB5b3VyIHN5c3RlbSBieToKKyMgLiBlZGl0aW5nIHRoaXMgZmlsZQorIyAuIGRlZmluaW5nIHRoZSB2YWx1ZXMgb24gdGhlIGNvbW1hbmQgbGluZQorIyAuIGRlZmluaW5nIHRoZSB2YWx1ZXMgaW4gdGhlIGVudmlyb25tZW50IGFuZCB1c2UgdGhlIC1lIG9wdGlvbgorIworcHJlZml4ICA9IC91c3IvbG9jYWwKK3NycHJvb3QgPSAkKHByZWZpeCkKK3NzbHJvb3QgPSAkKHByZWZpeCkKK21hbnJvb3QgPSAkKHByZWZpeCkKKworSzRMSUI9LUwvdXNyL2tlcmJlcm9zL2xpYgorSzRJTkM9LUkvdXNyL2tlcmJlcm9zL2luY2x1ZGUKK0s1TElCPS1ML3Vzci9rZXJiZXJvcy9saWIKK0s1SU5DPS1JL3Vzci9rZXJiZXJvcy9pbmNsdWRlCitTUlBMSUI9LUwkKHNycHJvb3QpL2xpYgorU1JQSU5DPS1JJChzcnByb290KS9pbmNsdWRlCitTU0xMSUI9LUwkKHNzbHJvb3QpL3NzbC9saWIKK1NTTElOQz0tSSQoc3Nscm9vdCkvc3NsL2luY2x1ZGUKKy4uLgorV0VSTUlUID0gbWFrZXdoYXQKK0JJTkFSWSA9IHdlcm1pdAorREVTVERJUiA9CitCSU5ESVIgPSAkKHByZWZpeCkvYmluCitNQU5ESVIgPSAkKG1hbnJvb3QpL21hbi9tYW4xCitNQU5FWFQgPSAxCitTUkNESVIgPQorSU5GT0RJUiA9CitDRVJURElSID0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworNi4gSU5TVEFMTElORyBVTklYIEMtS0VSTUlUIEZST00gRE9TLUZPUk1BVCBESVNLRVRURVMKKworICAgWyBbMTg5XVRvcCBdIFsgWzE5MF1Db250ZW50cyBdIFsgWzE5MV1OZXh0IF0gWyBbMTkyXVByZXZpb3VzIF0KKworICAgICBUaGlzIHNlY3Rpb24gaXMgb2Jzb2xldGUuIFdlIGRvbid0IGRpc3RyaWJ1dGUgQy1LZXJtaXQgb24gZGlza2V0dGVzCisgICAgIGFueSBtb3JlIGJlY2F1c2UgKGEpdGhlcmUgaXMgbm8gZGVtYW5kLCBhbmQgKGIpIGl0IG5vIGxvbmdlciBmaXRzLiAKKworICAgSWYgeW91IHJlY2VpdmVkIGEgRE9TLWZvcm1hdCBkaXNrZXR0ZSBjb250YWluaW5nIGEgYmluYXJ5IGV4ZWN1dGFibGUKKyAgIEMtS2VybWl0IHByb2dyYW0gcGx1cyBzdXBwb3J0aW5nIHRleHQgZmlsZXMsIGJlIHN1cmUgdG8gY2htb2QgK3ggdGhlCisgICBleGVjdXRhYmxlIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJ1biBpdC4KKworICAgSW4gdmVyc2lvbiA1QSgxOTApIGFuZCBsYXRlciwgYWxsIHRoZSB0ZXh0IGZpbGVzIG9uIHRoZSBDLUtlcm1pdAorICAgRE9TLWZvcm1hdCBkaXNrZXR0ZXMgYXJlIGluIFVuaXggZm9ybWF0OiBMRiBhdCB0aGUgZW5kIG9mIGVhY2ggbGluZQorICAgcmF0aGVyIHRoYW4gQ1JMRi4gVGhpcyBtZWFucyB0aGF0IG5vIGNvbnZlcnNpb25zIGFyZSBuZWNlc3Nhcnkgd2hlbgorICAgY29weWluZyB0byB5b3VyIFVuaXggZmlsZSBzeXN0ZW0sIGFuZCB0aGF0IGFsbCB0aGUgZmlsZXMgb24gdGhlCisgICBkaXNrZXR0ZSwgdGV4dCBhbmQgYmluYXJ5LCBjYW4gYmUgY29waWVkIHRvZ2V0aGVyLiBUaGUgZm9sbG93aW5nCisgICBjb21tZW50cyBhcHBseSB0byB0aGUgRE9TLWZvcm1hdCBkaXNrZXR0ZXMgZnVybmlzaGVkIHdpdGggdmVyc2lvbgorICAgNUEoMTg5KSBhbmQgZWFybGllciBvciB0byBvdGhlciBET1MtZm9ybWF0IGRpc2tldHRlcyB5b3UgbWlnaHQgaGF2ZQorICAgb2J0YWluZWQgZnJvbSBvdGhlciBzb3VyY2VzLgorCisgICBJZiB5b3UgaGF2ZSByZWNlaXZlZCBDLUtlcm1pdCBvbiBNUy1ET1MgZm9ybWF0IGRpc2tldHRlcyAoc3VjaCBhcworICAgdGhvc2UgZGlzdHJpYnV0ZWQgYnkgQ29sdW1iaWEgVW5pdmVyc2l0eSksIHlvdSBzaG91bGQgbWFrZSBzdXJlIHRoYXQKKyAgIHlvdXIgRE9TLXRvLVVuaXggY29udmVyc2lvbiB1dGlsaXR5IChzdWNoIGFzICJkb3NyZWFkIikgYm90aDogKDEpCisgICBjaGFuZ2VzIGxpbmUgdGVybWluYXRvcnMgaW4gYWxsIGZpbGVzIGZyb20gY2FycmlhZ2UtcmV0dXJuIGxpbmVmZWVkCisgICAoQ1JMRikgdG8ganVzdCBsaW5lZmVlZCAoTEYpIChzdWNoIGFzICJkb3NyZWFkIC1hIikgYW5kIHJlbW92ZSBhbnkKKyAgIEN0cmwtWidzLCBhbmQgKDIpIHRoYXQgYWxsIGZpbGVuYW1lcyBhcmUgY29udmVydGVkIGZyb20gdXBwZXJjYXNlIHRvCisgICBsb3dlcmNhc2UuIElmIHRoZXNlIGNvbnZlcnNpb25zIHdlcmUgbm90IGRvbmUsIHlvdSBjYW4gdXNlIHRoZQorICAgZm9sbG93aW5nIHNoZWxsIHNjcmlwdCBvbiB5b3VyIFVuaXggc3lzdGVtIHRvIGRvIHRoZW06CisKKy0tLShjdXQgaGVyZSktLS0KKyMhL2Jpbi9zaAorIworIyBTaGVsbCBzY3JpcHQgdG8gY29udmVydCBDLUtlcm1pdCBET1MtZm9ybWF0IGZpbGVzIGludG8gVW5peCBmb3JtYXQuCisjIExvd2VyY2FzZXMgdGhlIGZpbGVuYW1lcywgc3RyaXBzIG91dCBjYXJyaWFnZSByZXR1cm5zIGFuZCBDdHJsLVoncy4KKyMKK3g9JDEgIyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGRpcmVjdG9yeQoreT0kMiAjIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGlmIFsgJCMgLWx0IDIgXTsgdGhlbgorICBlY2hvICJ1c2FnZTogJDAgc291cmNlLWRpcmVjdG9yeSB0YXJnZXQtZGlyZWN0b3J5IgorICBleGl0IDEKK2ZpCitpZiBjZCAkMSA7IHRoZW4KKyAgZWNobyAiQ29udmVydGluZyBmaWxlcyBmcm9tICQxIHRvICQyIgorZWxzZQorICBlY2hvICIkMDogY2Fubm90IGNkIHRvICQxIgorICBleGl0IDEKK2ZpCitmb3IgaSBpbiAqOyBkbworICBqPWBlY2hvICRpIHwgdHIgJ0EtWicgJ2EteidgCisgIGVjaG8gJHgvJGkgPVw+ICR5LyRqCisgIHRyIC1kICdcMDE1XDAzMicgPCAkaSA+ICR5LyRqCitkb25lCistLS0oY3V0IGhlcmUpLS0tCisKKyAgIEN1dCBvdXQgdGhpcyBzaGVsbCBzY3JpcHQsIHNhdmUgaXQgYXMgImNvbnZlcnQuc2giIChvciBhbnkgb3RoZXIgbmFtZQorICAgeW91IHByZWZlciksIHRoZW4gImNobW9kICt4IGNvbnZlcnQuc2giLiBUaGVuLCBjcmVhdGUgYSBuZXcsIGVtcHR5CisgICBkaXJlY3RvcnkgdG8gcHV0IHRoZSBjb252ZXJ0ZWQgZmlsZXMgaW4sIGFuZCB0aGVuICJjb252ZXJ0LnNoIC94eHgKKyAgIC95eXkiIHdoZXJlIC94eHggaXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgUEMtZm9ybWF0CisgICBmaWxlcyBhcmUsIGFuZCAveXl5IGlzIHRoZSBuYW1lIG9mIHRoZSBuZXcsIGVtcHR5IGRpcmVjdG9yeS4gVGhlCisgICBjb252ZXJ0ZWQgZmlsZXMgd2lsbCBhcHBlYXIgaW4gdGhlIG5ldyBkaXJlY3RvcnkuCisgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKzcuIENIRUNLSU5HIFRIRSBSRVNVTFRTCisKKyAgIFsgWzE5M11Ub3AgXSBbIFsxOTRdQ29udGVudHMgXSBbIFsxOTVdTmV4dCBdIFsgWzE5Nl1QcmV2aW91cyBdCisKKyAgIEZpcnN0IHNvbWUgcXVpY2sgY2hlY2tzIGZvciBwcm9ibGVtcyB0aGF0IGNhbiBiZSBlYXNpbHkgY29ycmVjdGVkIGJ5CisgICByZWNvbXBpbGluZyB3aXRoIGRpZmZlcmVudCBvcHRpb25zOgorCisgICBESVJFQ1RPUlkgbGlzdGluZyBpcyBnYXJiYWdlCisgICAgICAgICAgUGVybWlzc2lvbnMsIHNpemUsIGFuZCBkYXRlIGFyZSByYW5kb20gZ2FyYmFnZSAoYnV0IHRoZQorICAgICAgICAgIGZpbGVuYW1lcyBhcmUgY29ycmVjdCkgaW4gYSBDLUtlcm1pdCBESVJFQ1RPUlkgbGlzdGluZy4gT24gc29tZQorICAgICAgICAgIHBsYXRmb3JtcywgdGhlIGxzdGF0KCkgZnVuY3Rpb24gaXMgcHJlc2VudCBidXQgc2ltcGx5IGRvZXNuJ3QKKyAgICAgICAgICB3b3JrOyB0cnkgYWRkaW5nIC1ETk9MU1RBVCB0byBDRkxBR1MgYW5kIHJlYnVpbGQuIElmIHRoYXQKKyAgICAgICAgICBkb2Vzbid0IGZpeCBpdCwgYWxzbyBhZGQgLUROT0xJTktCSVRTLiBJZiBpdCdzIHN0aWxsIG5vdCBmaXhlZCwKKyAgICAgICAgICByZW1vdmUgLUROT0xTVEFUIGFuZCAtRE5PTElOS0JJVFMgYW5kIGFkZCAtRE5PU1lNTElOSy4KKworICAgY3Vyc2VzCisgICAgICAgICAgV2hlbiB5b3UgbWFrZSBhIGNvbm5lY3Rpb24gd2l0aCBDLUtlcm1pdCBhbmQgdHJhbnNmZXIgZmlsZXMKKyAgICAgICAgICB1c2luZyB0aGUgZnVsbHNjcmVlbiAoY3Vyc2VzKSBmaWxlLXRyYW5zZmVyIGRpc3BsYXksIGFuZCB0aGVuCisgICAgICAgICAgZ2V0IHRoZSBDLUtlcm1pdD4gcHJvbXB0IGJhY2sgYWZ0ZXJ3YXJkcywgZG8gY2hhcmFjdGVycyBlY2hvCisgICAgICAgICAgd2hlbiB5b3UgdHlwZSB0aGVtPyBJZiBub3QsIHRoZSBjdXJzZXMgbGlicmFyeSBoYXMgYWx0ZXJlZCB0aGUKKyAgICAgICAgICBidWZmZXJpbmcgb2YgL2Rldi90dHkuIFRyeSByZWJ1aWxkaW5nIHdpdGggS0ZMQUdTPS1EQ0tfTkVXVEVSTS4KKyAgICAgICAgICBJZiBpdCBhbHJlYWR5IGhhcyAtRENLX05FV1RFUk0gaW4gQ0ZMQUdTLCB0cnkgcmVtb3ZpbmcgaXQuIElmCisgICAgICAgICAgdGhhdCBkb2Vzbid0IGhlbHAsIHRoZW4gcmVidWlsZCB3aXRoIC1ETk9OT1NFVEJVRiAoeWVzLCB0d28KKyAgICAgICAgICBOTydzKS4gSWYgbm9uZSBvZiB0aGlzIHdvcmtzIChhbmQgeW91IGNhbid0IGZpeCB0aGUgY29kZSksIHRoZW4KKyAgICAgICAgICBlaXRoZXIgZG9uJ3QgdXNlIHRoZSBmdWxsc2NyZWVuIGRpc3BsYXksIG9yIHJlYnVpbGQgd2l0aAorICAgICAgICAgIC1ETk9DVVJTRVMuCisKKyAgIEN0cmwtTCBvciBhbnkgU0NSRUVOIGNvbW1hbmQgY3Jhc2hlcyBDLUtlcm1pdDoKKyAgICAgICAgICBSZWJ1aWxkIHdpdGggLUROT1RFUk1DQVAuCisKKyAgIE5vIHByb21wdCBhZnRlciBDT05ORUNUOgorICAgICAgICAgIEFmdGVyIGVzY2FwaW5nIGJhY2sgZnJvbSBDT05ORUNUIG1vZGUsIGRvZXMgeW91ciBDLUtlcm1pdD4KKyAgICAgICAgICBwcm9tcHQgZGlzYXBwZWFyPyAoWWV0LCB0eXBpbmcgIj8iIHN0aWxsIHByb2R1Y2VzIGEgY29tbWFuZAorICAgICAgICAgIGxpc3QsIGV0YykgSW4gdGhhdCBjYXNlLCBhZGQgLURDS0NPTklOVEI0Q0IgdG8gQ0ZMQUdTIGFuZAorICAgICAgICAgIHJlYnVpbGQuCisKKyAgIEhlcmUgaXMgYSBtb3JlIHRob3JvdWdoIGNoZWNrbGlzdCBjYW4gdXNlIHRvIHRlbGwgd2hldGhlciB5b3VyIHZlcnNpb24KKyAgIG9mIEMtS2VybWl0IHdhcyBidWlsdCBjb3JyZWN0bHkgZm9yIHlvdXIgVW5peCBzeXN0ZW0sIHdpdGggaGludHMgb24KKyAgIGhvdyB0byBmaXggb3Igd29yayBhcm91bmQgcHJvYmxlbXM6CisKKyAgICBhLiBTdGFydCBDLUtlcm1pdCAodXN1YWxseSBieSB0eXBpbmcgIi4vd2VybWl0IiBpbiB0aGUgZGlyZWN0b3J5CisgICAgICAgd2hlcmUgeW91IHJhbiB0aGUgbWFrZWZpbGUpLiBEbyB5b3Ugc2VlIHRoZSBDLUtlcm1pdD4gcHJvbXB0PyBJZgorICAgICAgIG5vdCwgQy1LZXJtaXQgaW5jb3JyZWN0bHkgZGVkdWNlZCB0aGF0IGl0IHdhcyBydW5uaW5nIGluIHRoZQorICAgICAgIGJhY2tncm91bmQuIFRoZSB0ZXN0IGlzIGluIGNvbmJndCgpIGluIFsxOTddY2t1dGlvLmMuIElmIHlvdSBjYW4KKyAgICAgICBmaXggaXQgZm9yIHlvdXIgc3lzdGVtLCBwbGVhc2Ugc2VuZCBpbiB0aGUgZml4IChIaW50OiByZWFkIGFib3V0CisgICAgICAgIlBJRF9UIiBiZWxvdykuIE90aGVyd2lzZSwgeW91IGNhbiBmb3JjZSBDLUtlcm1pdCB0byBmb3JlZ3JvdW5kCisgICAgICAgbW9kZSBieSBzdGFydGluZyBpdCB3aXRoIHRoZSAteiBjb21tYW5kIGxpbmUgb3B0aW9uLCBhcyBpbiAia2VybWl0CisgICAgICAgLXoiLCBvciBnaXZpbmcgdGhlIGludGVyYWN0aXZlIGNvbW1hbmQgU0VUIEJBQ0tHUk9VTkQgT0ZGLgorICAgIGIuIFdoZW4geW91IHR5cGUgY2hhcmFjdGVycyBhdCB0aGUgQy1LZXJtaXQgcHJvbXB0LCBkbyB0aGV5IGVjaG8KKyAgICAgICBpbW1lZGlhdGVseT8gSWYgbm90LCBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCBjb25jYigpIGFuZCBwcm9iYWJseQorICAgICAgIHRoZSBvdGhlciB0ZXJtaW5hbCBtb2RlIHNldHRpbmdzIHJvdXRpbmVzIGluIFsxOThdY2t1dGlvLmMuIEJlCisgICAgICAgc3VyZSB5b3UgaGF2ZSB1c2VkIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG1ha2UgZW50cnkuCisgICAgYy4gQXQgdGhlIEMtS2VybWl0PiBwcm9tcHQsIHR5cGUgInNlbmQgLi8/Ii4gQy1LZXJtaXQgc2hvdWxkIGxpc3QgYWxsCisgICAgICAgdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gSWYgbm90LCBpdCB3YXMgYnVpbHQgZm9yIHRoZQorICAgICAgIHdyb25nIHR5cGUgb2YgVW5peCBmaWxlIHN5c3RlbS4gRGV0YWlscyBiZWxvdy4gSW4gdGhlIG1lYW50aW1lLAorICAgICAgIHRyeSBTRVQgV0lMRENBUkQtRVhQQU5TSU9OIFNIRUxMIGFzIGEgd29ya2Fyb3VuZC4KKyAgICBkLiBDRCB0byBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGEgdmFyaWV0eSBvZiBmaWxlcywgc3ltbGlua3MsIGFuZAorICAgICAgIHN1YmRpcmVjdG9yaWVzIGFuZCBnaXZlIGEgRElSRUNUT1JZIGNvbW1hbmQgYXQgdGhlIEMtS2VybWl0PgorICAgICAgIHByb21wdC4gRG8gdGhlIHBlcm1pc3Npb25zLCBzaXplLCBhbmQgZGF0ZSBhcHBlYXIgY29ycmVjdD8gSWYgbm90CisgICAgICAgc2VlIFsxOTldU2VjdGlvbiA0LjAuCisgICAgZS4gQXNzdW1pbmcgeW91ciBwbGF0Zm9ybSBzdXBwb3J0cyBsb25nIGZpbGUgbmFtZXMsIGNyZWF0ZSBhIGZpbGUKKyAgICAgICB3aXRoIGEgbG9uZyBuYW1lIGluIHlvdXIgY3VycmVudCBkaXJlY3RvcnksIGUuZy46CisKKyQgdG91Y2ggdGhpc2lzYWZpbGV3aXRoYXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5bG9vb29vb29vb25nbmFtZQorCisgICAgICAgKHlvdSBtaWdodCBuZWVkIHRvIG1ha2UgaXQgbG9uZ2VyIHRoYW4gdGhpcywgcGVyaGFwcyBhcyBsb25nIGFzCisgICAgICAgMjU3IG9yIGV2ZW4gMTAyNSBjaGFyYWN0ZXJzKS4KKyAgICAgICBDaGVjayB3aXRoIGxzIHRvIHNlZSBpZiB5b3VyIHZlcnNpb24gb2YgVW5peCB0cnVuY2F0ZWQgdGhlIG5hbWUuCisgICAgICAgTm93IHN0YXJ0IEMtS2VybWl0IGFuZCB0eXBlICJzZW5kIHRoaXNpczxFU0M+Ii4gRG9lcyBLZXJtaXQKKyAgICAgICBjb21wbGV0ZSB0aGUgbmFtZSwgc2hvd2luZyB0aGUgc2FtZSBuYW1lIGFzIGxzIGRpZD8gSWYgbm90LCB3cm9uZworICAgICAgIGZpbGVzeXN0ZW0uIFJlYWQgb24uCisgICAgZi4gTWFrZSBzdXJlIHRoYXQgS2VybWl0IGhhcyB0aGUgbWF4aW11bSBwYXRoIGxlbmd0aCByaWdodC4gSnVzdCB0eXBlCisgICAgICAgU0hPVyBGSUxFIGFuZCBzZWUgd2hhdCBpdCBzYXlzIGFib3V0IHRoaXMuIElmIGl0IGlzIHRvbyBzaG9ydCwKKyAgICAgICB0aGVyZSBjb3VsZCBiZSBzb21lIHByb2JsZW1zIGF0IHJ1bnRpbWUuIFRvIGNvcnJlY3QsIGxvb2sgaW4KKyAgICAgICBbMjAwXWNrY2RlYi5oIHRvIHNlZSBob3cgdGhlIHN5bWJvbCBDS01BWFBBVEggaXMgc2V0IGFuZCBtYWtlIGFueQorICAgICAgIG5lZWRlZCBhZGp1c3RtZW50cy4KKyAgICBnLiBTZW5kIGEgZmlsZSB0byB5b3VyIG5ldyBLZXJtaXQgcHJvZ3JhbSBmcm9tIGEgZGlmZmVyZW50IEtlcm1pdAorICAgICAgIHByb2dyYW0gdGhhdCBpcyBrbm93biB0byB3b3JrLiBJcyB0aGUgZGF0ZS90aW1lc3RhbXAgb2YgdGhlIG5ldworICAgICAgIGZpbGUgaWRlbnRpY2FsIHRvIHRoZSBvcmlnaW5hbD8gSWYgbm90LCBhZGp1c3RtZW50cyBhcmUgbmVlZGVkIGluCisgICAgICAgenN0cmR0KCkgaW4gWzIwMV1ja3VmaW8uYy4KKyAgICBoLiBHbyB0byBhbm90aGVyIGNvbXB1dGVyIChDb21wdXRlciBCKSBmcm9tIHdoaWNoIHlvdSBjYW4gc2VuZCBmaWxlcworICAgICAgIHRvIEMtS2VybWl0LiBDb25uZWN0IENvbXB1dGVyIEIgdG8gdGhlIGNvbXB1dGVyIChBKSB3aGVyZSB5b3UgYXJlCisgICAgICAgdGVzdGluZyBDLUtlcm1pdC4gVGhlbjoKKyAgICBpLiBTZW5kIGEgZmlsZSBmcm9tIEIgdG8gQS4gTWFrZSBzdXJlIGl0IHRyYW5zZmVycmVkIE9LIGFuZCB3YXMKKyAgICAgICBjcmVhdGVkIHdpdGggdGhlIHRoZSByaWdodCBuYW1lLgorICAgIGouIFNlbmQgYSBmaWxlIGZyb20gQiB0byBBLCBzcGVjaWZ5aW5nIGFuICJhcy1uYW1lIiB0aGF0IGlzIHZlcnksCisgICAgICAgdmVyeSBsb25nIChsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aCBvbiBjb21wdXRlciBBKS4KKyAgICAgICBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZmlsZSB3YXMgcmVjZWl2ZWQgT0sgYW5kIHRoYXQgaXRzIG5hbWUKKyAgICAgICB3YXMgdHJ1bmNhdGVkIHRvIENvbXB1dGVyIEEncyBtYXhpbXVtIGxlbmd0aC4gSWYgbm90LCBjaGVjayB0aGUKKyAgICAgICBNQVhOQU1MRU4gZGVmaW5pdGlvbiBpbiBbMjAyXWNrdWZpby5jLgorICAgIGsuIFRlbGwgQy1LZXJtaXQgb24gQ29tcHV0ZXIgQSB0byAic2V0IHJlY2VpdmUgcGF0aG5hbWVzIHJlbGF0aXZlIgorICAgICAgIGFuZCB0aGVuIHNlbmQgaXQgYSBmaWxlIGZyb20gQ29tcHV0ZXIgQiBzcGVjaWZ5aW5nIGFuIGFzLW5hbWUgdGhhdAorICAgICAgIGNvbnRhaW5zIHNldmVyYWwgZGlyZWN0b3J5IHNlZ21lbnRzOgorCitzZW5kIGZvbyBkaXIxL2RpcjIvZGlyMy9mb28KKworICAgICAgIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IGRpcjEvZGlyMi9kaXIzL2ZvbyB3YXMgY3JlYXRlZCBpbiBDb21wdXRlcgorICAgICAgIEEncyBjdXJyZW50IGRpcmVjdG9yeSAoaS5lLiB0aGF0IHRocmVlIGxldmVscyBvZiBkaXJlY3RvcmllcyB3ZXJlCisgICAgICAgY3JlYXRlZCkuCisgICAgbC4gUmVwZWF0IHN0ZXAgaywgYnV0IG1ha2UgZWFjaCBwYXRoIHNlZ21lbnQgaW4gdGhlIHBhdGhuYW1lIGxvbmdlcgorICAgICAgIHRoYW4gQ29tcHV0ZXIgQSdzIG1heGltdW0gbmFtZSBsZW5ndGguIE1ha2Ugc3VyZSBlYWNoIGRpcmVjdG9yeQorICAgICAgIG5hbWUsIGFuZCB0aGUgZmluYWwgZmlsZW5hbWUsIHdlcmUgdHJ1bmNhdGVkIHByb3Blcmx5LgorICAgIG0uIFR5cGUgQ3RybC1DIChvciB3aGF0ZXZlciB5b3VyIFVuaXggaW50ZXJydXB0IGNoYXJhY3RlciBpcykgYXQgdGhlCisgICAgICAgcHJvbXB0LiBEbyB5b3UgZ2V0ICJeQy4uLiIgYW5kIGEgbmV3IHByb21wdD8gSWYgaW5zdGVhZCwgeW91IGdldCBhCisgICAgICAgY29yZSBkdW1wICh0aGlzIHNob3VsZG4ndCBoYXBwZW4gYW55IG1vcmUpICJybSBjb3JlIiBhbmQgdGhlbgorICAgICAgIHJlYnVpbGQgd2l0aCAtRE5PQ0NUUkFQIGFkZGVkIHRvIHlvdXIgQ0ZMQUdTLiBJZiBpdCBkaWQgd29yaywgdGhlbgorICAgICAgIHR5cGUgYW5vdGhlciBDdHJsLUMuIElmIHRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyB0aGUgZmlyc3Qgb25lLAorICAgICAgIHRoZW4gQ3RybC1DIGhhbmRsaW5nIGlzIE9LLiBPdGhlcndpc2UsIHRoZSBTSUdJTlQgc2lnbmFsIGlzIGVpdGhlcgorICAgICAgIG5vdCBnZXR0aW5nIHJlLWFybWVkIChzaG91bGRuJ3QgaGFwcGVuKSBvciBpcyBiZWluZyBtYXNrZWQgb2ZmCisgICAgICAgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUgaXQgaXMgY2F1Z2h0LCBpbiB3aGljaCBjYXNlLCBpZiB5b3VyIFVuaXggaXMKKyAgICAgICBQT1NJWC1iYXNlZCwgdHJ5IHJlYnVpbGRpbmcgQy1LZXJtaXQgd2l0aCAtRENLX1BPU0lYX1NJRy4KKyAgICBuLiBUeXBlIEN0cmwtWiAob3Igd2hhdGV2ZXIgeW91ciBVbml4IHN1c3BlbmQgY2hhcmFjdGVyIGlzKSB0byBwdXQKKyAgICAgICBDLUtlcm1pdCBpbiB0aGUgYmFja2dyb3VuZC4gRGlkIGl0IHdvcms/IElmIG5vdGhpbmcgaGFwcGVuZWQsIHRoZW4KKyAgICAgICAoYSl5b3VyIHZlcnNpb24gb2YgVW5peCBkb2VzIG5vdCBzdXBwb3J0IGpvYiBjb250cm9sLCBvciAoYikgeW91cgorICAgICAgIHZlcnNpb24gb2YgQy1LZXJtaXQgd2FzIHByb2JhYmx5IGJ1aWx0IHdpdGggLUROT0pDLiBJZiB5b3VyCisgICAgICAgc2Vzc2lvbiBiZWNhbWUgdG90YWxseSBmcm96ZW4sIHRoZW4geW91IGFyZSBwcm9iYWJseSBydW5uaW5nCisgICAgICAgQy1LZXJtaXQgb24gYSBVbml4IHZlcnNpb24gdGhhdCBzdXBwb3J0cyBqb2IgY29udHJvbCwgYnV0IHVuZGVyIGEKKyAgICAgICBzaGVsbCB0aGF0IGRvZXNuJ3QuIElmIHRoYXQncyBub3QgdGhlIGNhc2UsIGxvb2sgaW4gdGhlIGNvbmdtKCkKKyAgICAgICBhbmQgcHN1c3BlbmQoKSByb3V0aW5lcyBpbiBbMjAzXWNrdXRpby5jIGFuZCBzZWUgaWYgeW91IGNhbiBmaWd1cmUKKyAgICAgICBvdXQgd2hhdCdzIHdyb25nLiBJZiB5b3UgY2FuJ3QsIHJlYnVpbGQgd2l0aCAtRE5PSkMuCisgICAgby4gR2l2ZSBhIFNFVCBMSU5FIGNvbW1hbmQgZm9yIGEgZGlhbG91dCBkZXZpY2UsIGUuZy4gInNldCBsaW5lCisgICAgICAgL2Rldi90dHkwMCIuIElmIHlvdSBnb3Qgc29tZSBraW5kIG9mIHBlcm1pc3Npb24gb3IgYWNjZXNzIGRlbmllZAorICAgICAgIG1lc3NhZ2UsIGdvIHJlYWQgWzIwNF1TZWN0aW9uIDEwIGFuZCB0aGVuIGNvbWUgYmFjayBoZXJlLgorICAgIHAuIEFmdGVyIGdpdmluZyBhIHN1Y2Nlc3NmdWwgU0VUIExJTkUgY29tbWFuZCwgdHlwZSAic2hvdyBjb21tIiB0bworICAgICAgIHNlZSB0aGUgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzLiBEbyB0aGV5IG1ha2Ugc2Vuc2U/CisgICAgcS4gVHlwZSAic2V0IHNwZWVkID8iIGFuZCBvYnNlcnZlIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBzcGVlZHMuIElzIGl0CisgICAgICAgd2hhdCB5b3UgZXhwZWN0ZWQ/IElmIG5vdCwgc2VlIFsyMDVdU2VjdGlvbiAyKSBvZiB0aGUKKyAgICAgICBbMjA2XUNvbmZpZ3VyYXRpb25zIE9wdGlvbnMgZG9jdW1lbnQuCisgICAgci4gR2l2ZSBhIFNFVCBTUEVFRCBjb21tYW5kIHRvIGNoYW5nZSB0aGUgZGV2aWNlJ3Mgc3BlZWQuIERpZCBpdAorICAgICAgIHdvcms/IChUeXBlICJzaG93IGNvbW0iIGFnYWluIHRvIGNoZWNrLikKKyAgICBzLiBUcnkgZGlhbGluZyBvdXQ6IFNFVCBNT0RFTSBUWVBFICwgU0VUIExJTkUgLCBTRVQgU1BFRUQgLCBESUFMIC4gSWYKKyAgICAgICBpdCBkb2Vzbid0IHdvcmssIGtlZXAgcmVhZGluZy4gQWZ0ZXIgZGlhbGluZywgY2FuIHlvdSBSRURJQUw/CisgICAgdC4gSWYgeW91ciB2ZXJzaW9uIHdhcyBidWlsdCB3aXRoIFRDUC9JUCBuZXR3b3JrIHN1cHBvcnQsIHRyeSB0aGUKKyAgICAgICBURUxORVQgY29tbWFuZC4KKyAgICB1LiBUcmFuc2ZlciBzb21lIGZpbGVzIGluIHJlbW90ZSBtb2RlIG9uIGluY29taW5nIGFzeW5jaHJvbm91cyBzZXJpYWwKKyAgICAgICAoZGlyZWN0IG9yIG1vZGVtKSBjb25uZWN0aW9ucywgYW5kIG9uIGluY29taW5nIG5ldHdvcmsgKHRlbG5ldCwKKyAgICAgICBybG9naW4sIHRlcm1pbmFsIHNlcnZlcikgY29ubmVjdGlvbnMuIElmIHlvdSBnZXQgbG90cyBvZiBlcnJvcnMsCisgICAgICAgdHJ5IGRpZmZlcmVudCBTRVQgRkxPVyBzZXR0aW5ncyBvbiB0aGUgcmVtb3RlIEtlcm1pdCBwcm9ncmFtLgorICAgIHYuIEVzdGFibGlzaCBhIHNlcmlhbCBjb25uZWN0aW9uIGZyb20gQy1LZXJtaXQgdG8gYW5vdGhlciBjb21wdXRlcgorICAgICAgIChkaXJlY3Qgb3IgZGlhbGVkKSBhbmQgdHJhbnNmZXIgc29tZSBmaWxlcy4gSWYgeW91IGhhdmUgbmV0d29yaworICAgICAgIHN1cHBvcnQsIGRvIHRoZSBzYW1lIHdpdGggYSBuZXR3b3JrIGNvbm5lY3Rpb24uCisgICAgdy4gSWYgeW91ciB2ZXJzaW9uIHdhcyBidWlsdCB3aXRoIGZ1bGxzY3JlZW4gZmlsZSB0cmFuc2ZlciBkaXNwbGF5CisgICAgICAgc3VwcG9ydCwgY2hlY2sgdGhhdCBpdCB3b3JrcyBkdXJpbmcgbG9jYWwtbW9kZSBmaWxlIHRyYW5zZmVyLgorICAgICAgIEFsc28sIGNoZWNrIEMtS2VybWl0J3Mgb3BlcmF0aW9uIGFmdGVyd2FyZHM6IGlzIHRoZSBlY2hvaW5nIGZ1bm55PworICAgICAgIGV0YyBldGMuIElmIHRoZXJlIGFyZSBwcm9ibGVtcywgc2VlIFsyMDddU2VjdGlvbiA0LgorICAgIHguIElmIHlvdXIgdmVyc2lvbiB3YXMgYnVpbHQgd2l0aCBzY3JpcHQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UKKyAgICAgICBzdXBwb3J0LCBUQUtFIHRoZSBja2VkZW1vLmtzYyBmaWxlIHRvIGdpdmUgaXQgYSB3b3Jrb3V0LgorICAgIHkuIERvZXMgQy1LZXJtaXQgaW50ZXJsb2NrIGNvcnJlY3RseSB3aXRoIFVVQ1AtZmFtaWx5IHByb2dyYW1zIChjdSwKKyAgICAgICB0aXAsIHV1Y3AsIGV0Yyk/IElmIG5vdCwgcmVhZCB0aGUgc2VjdGlvbiBbMjA4XURJQUxJTkcgT1VUIEFORAorICAgICAgIENPT1JESU5BVElORyBXSVRIIFVVQ1AgYmVsb3cuCisgICAgei4gTW9kZW0gc2lnbmFscy4uLiBHaXZlIGEgU0VUIExJTkUgY29tbWFuZCB0byBhIHNlcmlhbCBkZXZpY2UgYW5kCisgICAgICAgdGhlbiB0eXBlIHRoZSBTSE9XIE1PREVNIGNvbW1hbmQuIElmIGl0IHNheXMgIk1vZGVtIHNpZ25hbHMKKyAgICAgICB1bmF2YWlsYWJsZSBpbiB0aGlzIHZlcnNpb24gb2YgS2VybWl0IiwgdGhlbiB5b3UgbWlnaHQgd2FudCB0bworICAgICAgIGxvb2sgYXQgdGhlIHR0Z21kbSgpIHJvdXRpbmUgaW4gWzIwOV1ja3V0aW8uYyBhbmQgYWRkIHRoZSBuZWVkZWQKKyAgICAgICBjb2RlIC0tIGlmIGluZGVlZCB5b3VyIHZlcnNpb24gb2YgVW5peCBwcm92aWRlcyBhIHdheSB0byBnZXQgbW9kZW0KKyAgICAgICBzaWduYWxzIChzb21lIGRvbid0OyBlLmcuIG1vZGVtIHNpZ25hbHMgYXJlIGEgZm9yZWlnbiBjb25jZXB0IHRvCisgICAgICAgUE9TSVgsIHJlcXVpcmluZyBwb2xpdGljYWxseSBpbmNvcnJlY3Qgd29ya2Fyb3VuZHMpLgorICAgYWEuIElmIGl0IHNheXMgIk1vZGVtIHNpZ25hbHMgdW5hdmFpbGFibGUiLCB0aGVuIGl0IGlzIGxpa2VseSB0aGF0IHRoZQorICAgICAgIEFQSSBmb3IgZ2V0dGluZyBtb2RlbSBzaWduYWxzIGlzIHByb3ZpZGVkLCBidXQgaXQgZG9lc24ndCBhY3R1YWxseQorICAgICAgIGRvIGFueXRoaW5nIChlLmcuIGlvY3RsKHR0eWZkLFRJT0NNR0VULCZ4KSByZXR1cm5zIEVJTlZBTCkuCisgICBhYi4gSW4gYW55IGNhc2UsIGl0IHN0aWxsIHNob3VsZCBiZSBhYmxlIHRvIG1hbmlwdWxhdGUgdGhlIERUUiBzaWduYWwuCisgICAgICAgVG8gdGVzdCwgU0VUIExJTkUgLCBTRVQgTU9ERU0gTk9ORSwgYW5kIEhBTkdVUC4gVGhlIERUUiBsaWdodAorICAgICAgIHNob3VsZCBnbyBvdXQgbW9tZW50YXJpbHkuIElmIGl0IGRvZXNuJ3QsIHNlZSBpZiB5b3UgY2FuIGFkZCB0aGUKKyAgICAgICBuZWVkZWQgY29kZSBmb3IgeW91ciBzeXN0ZW0gdG8gdGhlIHR0aGFuZygpIHJvdXRpbmUgaW4KKyAgICAgICBbMjEwXWNrdXRpby5jLgorICAgYWMuIElmIHlvdXIgdmVyc2lvbiBvZiBLZXJtaXQgaGFzIHRoZSBTRVQgRkxPVyBSVFMvQ1RTIGNvbW1hbmQsIGNoZWNrCisgICAgICAgdG8gc2VlIGlmIGl0IHdvcmtzOiBnaXZlIEtlcm1pdCB0aGlzIGNvbW1hbmQsIHNldCB5b3VyIG1vZGVtIGZvcgorICAgICAgIFJUUy9DVFMsIHRyYW5zZmVyIHNvbWUgZmlsZXMgKHVzaW5nIGJpZyBwYWNrZXQgYW5kIHdpbmRvdyBzaXplcykKKyAgICAgICBhbmQgd2F0Y2ggdGhlIFJUUyBhbmQgQ1RTIGxpZ2h0cyBvbiB0aGUgbW9kZW0uIElmIHRoZXkgZ28gb24gYW5kCisgICAgICAgb2ZmIChhbmQgS2VybWl0IGRvZXMgbm90IGdldCBwYWNrZXQgZXJyb3JzKSwgdGhlbiBpdCB3b3Jrcy4gSWYKKyAgICAgICB5b3VyIHZlcnNpb24gb2YgS2VybWl0IGRvZXMgbm90IGhhdmUgdGhpcyBjb21tYW5kLCBidXQgeW91cgorICAgICAgIHZlcnNpb24gb2YgVW5peCBkb2VzIHN1cHBvcnQgaGFyZHdhcmUgZmxvdyBjb250cm9sLCB0YWtlIGEgbG9vayBhdAorICAgICAgIHRoZSB0dGhmbG93KCkgY29tbWFuZCBpbiBbMjExXWNrdXRpby5jIGFuZCBzZWUgaWYgeW91IGNhbiBhZGQgdGhlCisgICAgICAgbmVlZGVkIGNvZGUgKHNlZSB0aGUgc2VjdGlvbiBvbiBbMjEyXUhBUkRXQVJFIEZMT1cgQ09OVFJPTCBiZWxvdykuCisgICAgICAgKEFuZCBwbGVhc2UgWzIxM11zZW5kIGJhY2sgYW55IGFkZGVkIGNvZGUsIHNvIHRoYXQgb3RoZXJzIGNhbgorICAgICAgIGJlbmVmaXQgZnJvbSBpdCBhbmQgaXQgY2FuIGJlIGNhcnJpZWQgZm9yd2FyZCBpbnRvIGZ1dHVyZQorICAgICAgIHJlbGVhc2VzLikKKyAgIGFkLiBJZiBDLUtlcm1pdCBzdGFydHMgbm9ybWFsbHkgYW5kIGlzc3VlcyBpdHMgcHJvbXB0LCBlY2hvaW5nIGlzCisgICAgICAgbm9ybWFsLCBldGMsIGJ1dCB0aGVuIGFmdGVyIHJldHVybmluZyBmcm9tIGEgQ09OTkVDVCBzZXNzaW9uLCB0aGUKKyAgICAgICBwcm9tcHQgbm8gbG9uZ2VyIGFwcGVhcnMsIHRyeSByZWJ1aWxkaW5nIHdpdGggLURDS0NPTklOVEI0Q0IuCisgICBhZS4gKDguMC4yMDYgb3IgbGF0ZXIpIFR5cGUgc29tZSBjb21tYW5kcyBhdCB0aGUgQy1LZXJtaXQgcHJvbXB0LiBDYW4KKyAgICAgICB5b3UgdXNlIHRoZSBVcC1hcnJvdyBhbmQgRG93bi1hcnJvdyBrZXlzIG9uIHlvdXIga2V5Ym9hcmQgdG8KKyAgICAgICBhY2Nlc3MgS2VybWl0J3MgY29tbWFuZCBoaXN0b3J5PyBJZiBub3QsIGFuZCB5b3UncmUgYSBwcm9ncmFtbWVyLAorICAgICAgIHRha2UgYSBsb29rIGF0IHRoZSBVU0VfQVJST1dLRVlTIHNlY3Rpb25zIG9mIGNrdWNtZC5jLgorICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCis4LiBSRURVQ0lORyBUSEUgU0laRSBPRiBUSEUgRVhFQ1VUQUJMRSBQUk9HUkFNIElNQUdFCisKKyAgIFsgWzIxNF1Ub3AgXSBbIFsyMTVdQ29udGVudHMgXSBbIFsyMTZdTmV4dCBdIFsgWzIxN11QcmV2aW91cyBdCisKKyAgIEFsc28gc2VlOiBbMjE4XUMtS2VybWl0IENvbmZpZ3VyYXRpb24gT3B0aW9ucworCisgICAgYS4gTWFueSBvZiBDLUtlcm1pdCdzIG9wdGlvbnMgYW5kIGZlYXR1cmVzIGNhbiBiZSBkZXNlbGVjdGVkIGF0CisgICAgICAgY29tcGlsZSB0aW1lLiBUaGUgZ3JlYXRlc3Qgc2F2aW5ncyBhdCB0aGUgbGVhc3Qgc2FjcmlmaWNlIGluCisgICAgICAgZnVuY3Rpb25hbGl0eSBpcyB0byBkaXNhYmxlIHRoZSBsb2dnaW5nIG9mIGRlYnVnIGluZm9ybWF0aW9uIGJ5CisgICAgICAgZGVmaW5pbmcgTk9ERUJVRyBkdXJpbmcgY29tcGlsYXRpb24uIFNlZSB0aGUgWzIxOV1Db25maWd1cmF0aW9ucworICAgICAgIE9wdGlvbnMgZG9jdW1lbnQgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgICAgYi4gVXNlIHNoYXJlZCBsaWJyYXJpZXMgcmF0aGVyIHRoYW4gc3RhdGljIGxpbmtpbmcuIFRoaXMgaXMgdGhlCisgICAgICAgZGVmYXVsdCBvbiBtYW55IFVuaXggc3lzdGVtcyBhbnl3YXkuIEhvd2V2ZXIsIGV4ZWN1dGFibGVzIGJ1aWx0CisgICAgICAgZm9yIGR5bmFtaWMgbGlua2luZyB3aXRoIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGdlbmVyYWxseSBub3QKKyAgICAgICBwb3J0YWJsZSBhd2F5IGZyb20gdGhlIG1hY2hpbmUgdGhleSB3ZXJlIGJ1aWx0IG9uLCBzbyB0aGlzIGlzCisgICAgICAgcmVjb21tZW5kZWQgaWYgdGhlIGJpbmFyeSBpcyBmb3IgeW91ciB1c2Ugb25seS4KKyAgICBjLiBNb3N0IFVuaXggc3lzdGVtcyBoYXZlIGEgInN0cmlwIiBjb21tYW5kIHRvIHJlbW92ZSBzeW1ib2wgdGFibGUKKyAgICAgICBpbmZvcm1hdGlvbiBmcm9tIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSBpbWFnZS4gIm1hbiBzdHJpcCIgZm9yCisgICAgICAgZnVydGhlciBpbmZvcm1hdGlvbi4gVGhlIHNhbWUgZWZmZWN0IGNhbiBiZSBhY2hpZXZlZCBieSBpbmNsdWRpbmcKKyAgICAgICAiLXMiIGFtb25nIHRoZSBsaW5rIGZsYWdzIHdoZW4gYnVpbGRpbmcgQy1LZXJtaXQuCisgICAgZC4gU0NPLCBJbnRlcmFjdGl2ZSwgYW5kIHNvbWUgb3RoZXIgVW5peCB2ZXJzaW9ucyBoYXZlIGFuICJtY3MiCisgICAgICAgY29tbWFuZC4gIm1jcyAtZCB3ZXJtaXQiIGNhbiBiZSB1c2VkIHRvIGRlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlCisgICAgICAgIi5jb21tZW50IiBzZWN0aW9uIGZyb20gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBpbWFnZS4KKyAgICBlLiBNYW55IG1vZGVybiBvcHRpbWl6ZXJzIGNhbiBiZSBpbnN0cnVjdGVkIHRvIG9wdGltaXplIGZvciBzcGFjZQorICAgICAgIHJhdGhlciB0aGFuIGV4ZWN1dGlvbiBlZmZpY2llbmN5LiBDaGVjayB0aGUgQ0ZMQUdTIGluIHRoZSBtYWtlZmlsZQorICAgICAgIHRhcmdldCwgYWRqdXN0IGFzIGRlc2lyZWQuCisgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKzkuIFVOSVggVkVSU0lPTlMKKworICAgWyBbMjIwXVRvcCBdIFsgWzIyMV1Db250ZW50cyBdIFsgWzIyMl1OZXh0IF0gWyBbMjIzXVByZXZpb3VzIF0KKworICAgU0VDVElPTiBDT05URU5UUworCis5LjEgWzIyNF1TdGFuZGFyZHMKKyAgICAgOS4xLjEuIFsyMjVdUE9TSVgKKyAgICAgOS4xLjIuIFsyMjZdQU5TSSBDCisgICAgIDkuMS4zLiBbMjI3XU90aGVyIFN0YW5kYXJkcworOS4yLiBbMjI4XUxpYnJhcnkgSXNzdWVzCis5LjMuIFsyMjldVW5peCBGaWxlIFN5c3RlbSBQZWN1bGlhcml0aWVzCis5LjQuIFsyMzBdSGFyZHdhcmUgRmxvdyBDb250cm9sCis5LjUuIFsyMzFdVGVybWluYWwgU3BlZWRzCis5LjYuIFsyMzJdTWlsbGlzZWNvbmQgU2xlZXBzCis5LjcuIFsyMzNdTm9uZGVzdHJ1Y3RpdmUgSW5wdXQgQnVmZmVyIFBlZWtpbmcKKzkuOC4gWzIzNF1PdGhlciBTeXN0ZW0tRGVwZW5kZW50IEZlYXR1cmVzCis5LjkuIFsyMzVdVGVybWluYWwgSW50ZXJydXB0aW9uCisKKyAgIFRoZXJlIGFyZSBzZXZlcmFsIG1ham9yIHZhcmlldGllcyBvZiBVbml4OiBCZWxsIExhYm9yYXRvcmllcyBTZXZlbnRoCisgICBFZGl0aW9uLCBBVCZUIFN5c3RlbSBWLCBCZXJrZWxleSBTdGFuZGFyZCBEaXN0cmlidXRpb24gKEJTRCksIGFuZAorICAgUE9TSVguIEVhY2ggaGFzIG1hbnksIG1hbnkgc3VidmFyaWV0aWVzIGFuZCBkZXNjZW5kZW50cywgYW5kIHRoZXJlIGFyZQorICAgYWxzbyBoeWJyaWRzIHRoYXQgZXhoaWJpdCBzeW1wdG9tcyBvZiB0d28gb3IgbW9yZSB2YXJpZXRpZXMsIHBsdXMKKyAgIHNwZWNpYWwgcXVpcmtzIG9mIHRoZWlyIG93bi4KKworICAgU2V2ZW50aCBlZGl0aW9uIHZlcnNpb25zIG9mIEMtS2VybWl0IGluY2x1ZGUgdGhlIGNvbXBpbGUtdGltZSBvcHRpb24KKyAgIC1EVjcgaW4gdGhlIENGTEFHUyBzdHJpbmcgaW4gdGhlIG1ha2VmaWxlIHRhcmdldC4gVmFyaW91cyBWNy1iYXNlZAorICAgaW1wbGVtZW50YXRpb25zIGFyZSBhbHNvIHN1cHBvcnRlZDogLURDT0hFUkVOVCwgLURNSU5JWCwgZXRjLgorCisgICBBVCZULWJhc2VkIHZlcnNpb25zIG9mIFVuaXggS2VybWl0IGluY2x1ZGUgdGhlIGNvbXBpbGUtdGltZSBvcHRpb24KKyAgIC1EQVRUU1YgKHN0YW5kaW5nIGZvciBBVCZtcDtUIFVuaXggU3lzdGVtIFYpLiBUaGlzIGFwcGxpZXMgdG8gU3lzdGVtCisgICBJSUkgYW5kIHRvIFN5c3RlbSBWIHVwIHRvIGFuZCBpbmNsdWRpbmcgUmVsZWFzZSAyLiBGb3IgU3lzdGVtIFYKKyAgIFJlbGVhc2UgMywgdGhlIGZsYWcgLURTVlIzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgKHdoaWNoIGFsc28gaW1wbGllcworICAgLURBVFRTVikuIFRoaXMgaXMgYmVjYXVzZSB0aGUgZGF0YSB0eXBlIG9mIHNpZ25hbCgpIGFuZCBzZXZlcmFsIG90aGVyCisgICBmdW5jdGlvbnMgd2FzIGNoYW5nZWQgYmV0d2VlbiBTVlIyIGFuZCBTVlIzLiBGb3IgU3lzdGVtIFYgUmVsZWFzZSA0LAorICAgaW5jbHVkZSAtRFNWUjQgYmVjYXVzZSBvZiBjaGFuZ2VzIGluIFVVQ1AgbG9ja2ZpbGUgY29udmVudGlvbnM7IHRoaXMKKyAgIGFsc28gaW1wbGllcyAtRFNWUjMgYW5kIC1EQVRUU1YuCisKKyAgIEZvciBCU0QsIHRoZSBmbGFnIC1CU0R4eCBtdXN0IGJlIGluY2x1ZGVkLCB3aGVyZSB4eCBpcyB0aGUgQlNEIHZlcnNpb24KKyAgIG51bWJlciwgZm9yIGV4YW1wbGUgQlNENCAoZm9yIHZlcnNpb24gNC4yIG9yIGxhdGVyLCB1c2luZyBvbmx5IDQuMgorICAgZmVhdHVyZXMpLCAtREJTRDQxIChmb3IgQlNEIDQuMSBvbmx5KSwgLURCU0Q0MyAoZm9yIDQuMyksIC1EQlNEMjkgKEJTRAorICAgMi45IGZvciBERUMgUERQLTExcykuIC1EQlNENDQgaXMgZm9yIDQuNEJTRCwgd2hpY2ggaXMgdGhlIGJhc2lzIG9mCisgICBGcmVlQlNELCBOZXRCU0QsIE9wZW5CU0QsIEJTREksIGFuZCBNYWMgT1MgWCwgYW5kIHdoaWNoIGNvbnRhaW5zIG1hbnkKKyAgIFBPU0lYIGZlYXR1cmVzLCBhbmQgaGFzIGxpdHRsZSByZWxhdGlvbiB0byA0LjNCU0QgYW5kIGVhcmxpZXIuCisKKyAgIEZvciBQT1NJWCwgaW5jbHVkZSB0aGUgZmxhZyAtRFBPU0lYLiBQT1NJWCBkZWZpbmVzIGEgd2hvbGUgbmV3IHNldCBvZgorICAgdGVybWluYWwgaS9vIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgZm91bmQgaW4gdHJhZGl0aW9uYWwgQVQmVCBvcgorICAgQmVya2VsZXkgaW1wbGVtZW50YXRpb25zLCBhbmQgYWxzbyBkZWZpbmVzIHRoZSBzeW1ib2wgX1BPU0lYX1NPVVJDRSwKKyAgIHdoaWNoIGlzIHVzZWQgaW4gbWFueSBzeXN0ZW0gYW5kIGxpYnJhcnkgaGVhZGVyIGZpbGVzLCBtYWlubHkgdG8KKyAgIGRpc2FibGUgbm9uLVBPU0lYIChpLmUuIHVzZWZ1bCkgZmVhdHVyZXMuCisKKyAgIE5vdGUgKGNpcmNhIDE5OTcpOiBJbiBvcmRlciB0byBlbmFibGUgc2VyaWFsIHNwZWVkcyBoaWdoZXIgdGhhbiAzODQwMAorICAgYnBzLCBpdCBpcyBnZW5lcmFsbHkgbmVjZXNzYXJ5IHRvIGFkZCAtRFBPU0lYIChhbW9uZyBvdGhlciB0aGluZ3MpLAorICAgc2luY2UgdGhlIG9sZGVyIHRlcm1pbmFsIEFQSXMgY2FuIG5vdCBhY2NvbW1vZGF0ZSB0aGUgbmV3IHNwZWVkcyAtLQorICAgb3V0IG8nIGJpdHMuIEJ1dCB0aGlzIG9mdGVuIGFsc28gbWVhbnMgd2hvbGVzYWxlIGNvbnZlcnNpb24gdG8gUE9TSVgKKyAgIEFQSXMuIEluIGdlbmVyYWwsIGp1c3QgdHJ5IGFkZGluZyAtRFBPU0lYIGFuZCB0aGVuIHNlZSB3aGF0IGdvZXMKKyAgIHdyb25nLiBCZSB3YXJ5IG9mIGZlYXR1cmVzIGRpc2FwcGVhcmluZzogd2hlbiBfUE9TSVhfU09VUkNFIGlzCisgICBkZWZpbmVkLCBhbGwgc29ydHMgb2YgdGhpbmdzIHRoYXQgd2VyZSBwZXJmZWN0bHkgT0sgYmVmb3JlIHN1ZGRlbmx5CisgICBiZWNvbWUgcG9saXRpY2FsbHkgaW5jb3JyZWN0IC0tIGxpa2UgcmVhZGluZyBtb2RlbSBzaWduYWxzLCBkb2luZworICAgaGFyZHdhcmUgZmxvdyBjb250cm9sLCBldGMuIFBPU0lYIHdhcyBldmlkZW50bHkgbm90IGRlc2lnbmVkIHdpdGgKKyAgIHNlcmlhbCBjb21tdW5pY2F0aW9uIGluIG1pbmQhCisKKyAgIENhc2UgaW4gcG9pbnQ6IEluIFVuaXhXYXJlIDcuMCwgI2RlZmluZSdpbmcgUE9TSVggY2F1c2VzIHN0cmljdG5lc3MKKyAgIGNsYXVzZXMgaW4gdGhlIGhlYWRlciBmaWxlcyB0byB0YWtlIGVmZmVjdC4gVGhlc2UgcHJldmVudCA8c3lzL3RpbWUuaD4KKyAgIGZyb20gZGVmaW5pbmcgdGhlIHRpbWV2YWwgYW5kIHRpbWV6b25lIHN0cnVjdHMsIHdoaWNoIGFyZSBuZWVkZWQgZm9yCisgICBhbGwgc29ydHMgb2YgdGhpbmdzIChsaWtlIHNlbGVjdCgpKS4gVGh1cywgaWYgd2Ugd2FudCB0aGUgaGlnaCBzZXJpYWwKKyAgIHNwZWVkcywgd2UgaGF2ZSB0byBjaXJjdW12ZW50IHRoZSBQT1NJWCBjbGF1c2VzLgorCisgICBTaW1pbGFybHkgaW4gU0NPIE9wZW5TZXJ2ZXIgUjUuMC40IHdoZXJlLCBhZ2Fpbiwgd2UgbXVzdCB1c2UgdGhlIFBPU0lYCisgICBBUElzIHRvIGdldCBhdCBzZXJpYWwgc3BlZWRzIGhpZ2hlciB0aGFuIDM4NDAwLCBidXQgdGhlbiBkb2luZyBzbworICAgcmVtb3ZlcyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgLS0ganVzdCB3aGVuIHdlIG5lZWQgaXQgbW9zdCEgSW4gY2FzZXMKKyAgIGxpa2UgdGhpcywgZGlydHkgdHJpY2tzIGFyZSB0aGUgb25seSByZWNvdXJzZSAoc2VhcmNoIGZvciBTQ09fT1NSNTA0CisgICBpbiBbMjM2XWNrdXRpby5jIGZvciBleGFtcGxlcykuCisKKyAgIEZvciByZWFzb25zIGxpa2UgdGhpcywgVW5peCBpbXBsZW1lbnRhdGlvbnMgdGVuZCB0byBiZSBuZWl0aGVyIHB1cmUKKyAgIEFUJlQgbm9yIHB1cmUgQlNEIG5vciBwdXJlIFBPU0lYLCBidXQgYSBtaXh0dXJlIG9mIHR3byBvciBtb3JlIG9mCisgICB0aGVzZSwgd2l0aCAiY29tcGF0aWJpbGl0eSBmZWF0dXJlcyIgYWxsb3dpbmcgZGlmZmVyZW50IHZhcmlldGllcyBvZgorICAgcHJvZ3JhbXMgdG8gYmUgYnVpbHQgb24gdGhlIHNhbWUgY29tcHV0ZXIuIEluIGdlbmVyYWwsIEtlcm1pdCB0cmllcworICAgbm90IHRvIG1peCBhbmQgbWF0Y2ggYnV0IHRvIGtlZXAgYSBjb25zaXN0ZW50IHJlcGVydG9pcmUgdGhyb3VnaG91dC4KKyAgIEhvd2V2ZXIsIHRoZXJlIGFyZSBjZXJ0YWluIFVuaXggaW1wbGVtZW50YXRpb25zIHRoYXQgb25seSB3b3JrIHdoZW4KKyAgIHlvdSBtaXggYW5kIG1hdGNoLiBGb3IgZXhhbXBsZSwgdGhlIFNpbGljb24gR3JhcGhpY3MgSVJJWCBvcGVyYXRpbmcKKyAgIHN5c3RlbSAocHJpb3IgdG8gdmVyc2lvbiAzLjMpIGlzIGFuIEFUJlQgVW5peCBidXQgd2l0aCBhIEJTRCBmaWxlCisgICBzeXN0ZW0uIFRoZSBvbmx5IHdheSB5b3UgY2FuIGJ1aWxkIEtlcm1pdCBzdWNjZXNzZnVsbHkgZm9yIHRoaXMKKyAgIGNvbmZpZ3VyYXRpb24gaXMgdG8gaW5jbHVkZSAtRFNWUjMgcGx1cyB0aGUgc3BlY2lhbCBvcHRpb24gLURMT05HRk4sCisgICBtZWFuaW5nICJwcmV0ZW5kIEkgd2FzIGJ1aWx0IHdpdGggLURCU0R4eCB3aGVuIGl0J3MgdGltZSB0byBjb21waWxlCisgICBmaWxlLXJlbGF0ZWQgY29kZSIuIFNlZSB0aGUgImlyaXMiIG1ha2VmaWxlIHRhcmdldC4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA5LjEuIFN0YW5kYXJkcworCisgICBbIFsyMzddVG9wIF0gWyBbMjM4XVNlY3Rpb24gQ29udGVudHMgXSBbIFsyMzldQ29udGVudHMgXSBbIFsyNDBdTmV4dCBdCisKKyAgIFNVQlNFQ1RJT04gQ09OVEVOVFMKKworOS4xLjEuIFsyNDFdUE9TSVgKKzkuMS4yLiBbMjQyXUFOU0kgQworOS4xLjMuIFsyNDNdT3RoZXIgU3RhbmRhcmRzCisKKyAgIEluIGVkaXRzIDE2Ni0xNjcgKDE5ODgtODkpLCBDLUtlcm1pdCB3YXMgaGVhdmlseSBtb2RpZmllZCB0byB0cnkgdG8KKyAgIGtlZXAgYWJyZWFzdCBvZiBuZXcgc3RhbmRhcmRzIHdoaWxlIHN0aWxsIHJlbWFpbmluZyBjb21wYXRpYmxlIHdpdGgKKyAgIG9sZCB2ZXJzaW9ucyBvZiBDIGFuZCBVbml4LiBUaGVyZSBhcmUgdHdvIG5ldyBzdGFuZGFyZHMgb2YgaW50ZXJlc3Q6CisgICBBTlNJIEMgKGFzIGRlc2NyaWJlZCBpbiBLZXJuaWdoYW4gYW5kIFJpdGNoaWUsICJUaGUgQyBQcm9ncmFtbWluZworICAgTGFuZ3VhZ2UiLCBTZWNvbmQgRWRpdGlvbiwgUHJlbnRpY2UgSGFsbCwgMTk4OCkgYW5kIFBPU0lYLjEgKElFRUUKKyAgIFN0YW5kYXJkIDEwMDMuMSBhbmQgSVNPL0lFQyA5OTQ1LTEsIDE5OTAsICJQb3J0YWJsZSBPcGVyYXRpbmcgU3lzdGVtCisgICBJbnRlcmZhY2UiKS4gVGhlc2UgdHdvIHN0YW5kYXJkcyBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCBlYWNoIG90aGVyOgorICAgeW91IGNhbiBidWlsZCBDLUtlcm1pdCB3aXRoIGEgbm9uLUFOU0kgY29tcGlsZXIgZm9yIGEgUE9TSVggc3lzdGVtLCBvcgorICAgZm9yIGEgbm9uLVBPU0lYIHN5c3RlbSB3aXRoIHdpdGggYW4gQU5TSSBjb21waWxlci4KKworICAgIDkuMS4xLiBQT1NJWAorCisgICBQT1NJWC4xIGRlZmluZXMgYSByZXBlcnRvaXJlIG9mIHN5c3RlbSBmdW5jdGlvbnMgYW5kIGhlYWRlciBmaWxlcyBmb3IKKyAgIHVzZSBieSBDIGxhbmd1YWdlIHByb2dyYW1zLiBNb3N0IG5vdGFibHksIHRoZSBpb2N0bCgpIGZ1bmN0aW9uIGlzIG5vdAorICAgYWxsb3dlZCBpbiBQT1NJWDsgYWxsIGlvY3RsKCkgZnVuY3Rpb25zIGhhdmUgYmVlbiByZXBsYWNlZCBieQorICAgZGV2aWNlLXNwZWNpZmljIGZ1bmN0aW9ucyBsaWtlIHRjc2V0YXR0cigpLCB0Y3NlbmRicmVhaygpLCBldGMuCisKKyAgIENvbXB1dGVyIHN5c3RlbXMgdGhhdCBjbGFpbSBzb21lIGRlZ3JlZSBvZiBQT1NJWCBjb21wbGlhbmNlIGhhdmUgbWFkZQorICAgc29tZSBhdHRlbXB0IHRvIHB1dCB0aGVpciBoZWFkZXIgZmlsZXMgaW4gdGhlIHJpZ2h0IHBsYWNlcyBhbmQgZ2l2ZQorICAgdGhlbSB0aGUgcmlnaHQgbmFtZXMsIGFuZCB0byBwcm92aWRlIHN5c3RlbSBsaWJyYXJ5IGZ1bmN0aW9ucyB3aXRoIHRoZQorICAgcmlnaHQgbmFtZXMgYW5kIGNhbGxpbmcgY29udmVudGlvbnMuIFdpdGhpbiB0aGUgaGVhZGVyIGZpbGVzLAorICAgUE9TSVgtY29tcGxpYW50IGZ1bmN0aW9ucyBhcmUgc3VwcG9zZWQgdG8gYmUgd2l0aGluICNpZmRlZgorICAgX1BPU0lYX1NPVVJDRS4uI2VuZGlmIGNvbmRpdGlvbmFscywgYW5kIG5vbi1QT1NJWCBpdGVtcyBhcmUgbm90IHdpdGhpbgorICAgdGhlc2UgY29uZGl0aW9uYWxzLgorCisgICBJZiBLZXJtaXQgaXMgYnVpbHQgd2l0aCBuZWl0aGVyIC1EX1BPU0lYX1NPVVJDRSBub3IgLURQT1NJWCwgdGhlCisgICBmdW5jdGlvbnMgYW5kIGhlYWRlciBmaWxlcyBvZiB0aGUgc2VsZWN0ZWQgdmVyc2lvbiBvZiBVbml4IChvciBWTVMsCisgICBldGMpIGFyZSB1c2VkIGFjY29yZGluZyB0byB0aGUgQ0ZMQUdTIEtlcm1pdCB3YXMgYnVpbHQgd2l0aC4KKworICAgSWYgS2VybWl0IGlzIGJ1aWx0IHdpdGggLURfUE9TSVhfU09VUkNFIGJ1dCBub3QgLURQT1NJWCwgdGhlbiBvbmUgb2YKKyAgIHRoZSAtREJTRCBvciAtREFUVFNWIGZsYWdzIChvciBvbmUgdGhhdCBpbXBsaWVzIHRoZW0pIG11c3QgYWxzbyBiZQorICAgZGVmaW5lZCwgYnV0IGl0IHN0aWxsIHVzZXMgb25seSB0aGUgUE9TSVggZmVhdHVyZXMgaW4gdGhlIHN5c3RlbQorICAgaGVhZGVyIGZpbGVzLiBUaGlzIGFsbG93cyBDLUtlcm1pdCB0byBiZSBidWlsdCBvbiBCU0Qgb3IgQVQmVCBzeXN0ZW1zCisgICB0aGF0IGhhdmUgc29tZSBkZWdyZWUgb2YgUE9TSVggY29tcGxpYW5jZSwgYnV0IHN0aWxsIHVzZSBCU0Qgb3IgQVQmVAorICAgc3BlY2lmaWMgZmVhdHVyZXMuCisKKyAgIFRoZSBkaWxpbW1hIGlzIHRoaXM6IGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byBkZWZpbmUgX1BPU0lYX1NPVVJDRSB0bworICAgZ2V0IGF0IG5ldyBvciBtb2Rlcm4gZmVhdHVyZXMsIHN1Y2ggYXMgaGlnaCBzZXJpYWwgc3BlZWRzIGFuZCB0aGUgQVBJcworICAgdG8gZGVhbCB3aXRoIHRoZW0uIEJ1dCBkZWZpbmluZyBfUE9TSVhfU09VUkNFIGFsc28gaGlkZXMgb3RoZXIgQVBJcworICAgdGhhdCBLZXJtaXQgbmVlZHMsIGZvciBleGFtcGxlIHRoZSBvbmVzIGRlYWxpbmcgd2l0aCBtb2RlbSBzaWduYWxzCisgICAob3RoZXJzIGFyZSBsaXN0ZWQganVzdCBiZWxvdykuIFRodXMgYWxsIHNvcnRzIG9mIGhpZGVvdXMgY29udG9ydGlvbnMKKyAgIGFyZSBvZnRlbiByZXF1aXJlZCB0byBnZXQgYSBmdWxsIHNldCBvZiBmZWF0dXJlcy4KKworICAgVGhlIFBPU0lYIHN0YW5kYXJkIGRvZXMgbm90IGRlZmluZSBhbnl0aGluZyBhYm91dCB1dWNwIGxvY2tmaWxlcy4KKyAgICJtYWtlIHBvc2l4IiB1c2VzIE5PIChyZXBlYXQsIE5PKSBsb2NrZmlsZSBjb252ZW50aW9ucy4gSWYgeW91cgorICAgUE9TSVgtY29tcGxpYW50IFVuaXggdmVyc2lvbiB1c2VzIGEgbG9ja2ZpbGUgY29udmVudGlvbiBzdWNoIGFzCisgICBIREJVVUNQIChzZWUgYmVsb3cpLCB1c2UgdGhlICJwb3NpeCIgZW50cnksIGJ1dCBpbmNsdWRlIHRoZQorICAgYXBwcm9wcmlhdGUgbG9ja2ZpbGUgb3B0aW9uIGluIHlvdXIgS0ZMQUdTIG9uIHRoZSAibWFrZSIgY29tbWFuZCBsaW5lLAorICAgZm9yIGV4YW1wbGU6CisKK21ha2UgcG9zaXggIktGTEFHUz0tREhEQlVVQ1AiCisKKyAgIFBPU0lYLjEgYWxzbyBsYWNrcyBjZXJ0YWluIG90aGVyIGZlYXR1cmVzIHRoYXQgS2VybWl0IG5lZWRzLiBGb3IKKyAgIGV4YW1wbGU6CisKKyAgICAgKiBUaGVyZSBpcyBubyBkZWZpbmVkIHdheSBmb3IgYW4gYXBwbGljYXRpb24gdG8gZG8gd2lsZGNhcmQgbWF0Y2hpbmcKKyAgICAgICBvZiBmaWxlbmFtZXMuIEtlcm1pdCB1c2VzIHRoZSBpbm9kZSBpbiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSwKKyAgICAgICBidXQgUE9TSVguMSBkb2VzIG5vdCBpbmNsdWRlIHRoaXMgY29uY2VwdC4gKExhdGVyIFBPU0lYIHJldmlzaW9ucworICAgICAgIGluY2x1ZGUgZnVuY3Rpb25zIG5hbWVkIChJIHRoaW5rKSBnbG9iKCkgYW5kIGZubWF0Y2goKSwgYnV0IHRoZXNlCisgICAgICAgZnVuY3Rpb25zIGFyZSBub3QgeWV0IGluIEtlcm1pdCwgYW5kIG1pZ2h0IG5vdCBiZSBhcHByb3ByaWF0ZSBpbgorICAgICAgIGFueSBjYXNlLikKKyAgICAgKiBUaGVyZSBpcyBubyBQT1NJWCBtZWNoYW5pc20gZm9yIHNlbnNpbmcgb3IgY29udHJvbGxpbmcgbW9kZW0KKyAgICAgICBzaWduYWxzLCBub3IgdG8gZW5hYmxlIFJUUy9DVFMgb3Igb3RoZXIgaGFyZHdhcmUgZmxvdyBjb250cm9sLgorICAgICAqIFRoZXJlIGlzIG5vIHNlbGVjdCgpIGZvciBtdWx0aXBsZXhpbmcgaS9vLCBhbmQgdGhlcmVmb3JlIG5vCisgICAgICAgVENQL0lQLgorICAgICAqIFRoZXJlIGlzIG5vIHdheSB0byBjaGVjayBpZiBjaGFyYWN0ZXJzIGFyZSB3YWl0aW5nIGluIGEKKyAgICAgICBjb21tdW5pY2F0aW9ucyBkZXZpY2UgKG9yIGNvbnNvbGUpIGlucHV0IGJ1ZmZlciwgc2hvcnQgb2YgdHJ5aW5nCisgICAgICAgdG8gcmVhZCB0aGVtIC0tIG5vIHNlbGVjdCgpLCBpb2N0bChmZCxGSU9OUkVBRCxibGFoKSwgcmRjaGsoKSwKKyAgICAgICBldGMuIFRoaXMgaXMgYmFkIGZvciBDT05ORUNUIG1vZGUgYW5kIGJhZCBmb3Igc2xpZGluZyB3aW5kb3dzLgorICAgICAqIE5vIHdheSB0byBkbyBhIG1pbGxpc2Vjb25kIHNsZWVwIChubyBuYXAoKSwgdXNsZWVwKCksIHNlbGVjdCgpLAorICAgICAgIGV0YykuCisgICAgICogVGhlcmUgaXMgbm8gcG9wZW4oKS4KKworICAgU28gYXQgdGhpcyBwb2ludCwgdGhlcmUgY2Fubm90IGJlIG9uZSBzaW5nbGUgZnVsbHkgZnVuY3Rpb25hbCBQT1NJWAorICAgZm9ybSBvZiBDLUtlcm1pdCB1bmxlc3MgaXQgYWxzbyBoYXMgImV4dGVuc2lvbnMiLCBhcyBkbyBMaW51eCwgUU5YLAorICAgZXRjLgorCisgICBNb3JlIG9uIFBPU0lYIChxdW90aW5nIGZyb20gYSBuZXdzZ3JvdXAgcG9zdGluZyBieSBEYXZlIEJ1dGVuaG9mKToKKworICAgICBTdGFuZGFyZHMgdGVuZCB0byBsb29rIGF0IHRoZW1zZWx2ZXMgYXMgImVuYWJsaW5nIi4gU28gUE9TSVgKKyAgICAgc3RhbmRhcmRzIHNheSB0aGF0LCBpbiBvcmRlciB0byB1c2UgUE9TSVggZnVuY3Rpb25zLCBhIHByb2dyYW0gbXVzdAorICAgICBkZWZpbmUgc29tZSBtYWNybyB0aGF0IHdpbGwgcHV0IHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBpbgorICAgICAiUE9TSVggbW9kZSIuIEZvciB0aGUgYW5jaWVudCBQT1NJWCAxMDAzLjEtMTk5MCwgdGhlIHN5bWJvbCBpcworICAgICBfUE9TSVhfU09VUkNFLiBGb3IgcmVjZW50IHJldmlzaW9ucywgaXQncyBfUE9TSVhfQ19TT1VSQ0Ugd2l0aCBhbgorICAgICBhcHByb3ByaWF0ZSB2YWx1ZS4gUE9TSVggMTAwMy4xLTE5OTYgc2F5cyB0aGF0LCB0byB1c2UgaXRzIGZlYXR1cmVzCisgICAgIGluIGEgcG9ydGFibGUgbWFubmVyLCB5b3UgbXVzdCBkZWZpbmUgX1BPU0lYX0NfU09VUkNFPTE5OTUwNkwKKyAgICAgYmVmb3JlIGluY2x1ZGluZyBhbnkgaGVhZGVyIGZpbGVzLgorCisgICAgIEJ1dCBmb3IgU29sYXJpcywgb3IgRGlnaXRhbCBVbml4LCB0aGUgcGljdHVyZSBpcyBkaWZmZXJlbnQuIFBPU0lYCisgICAgIGlzIG9uZSBpbXBvcnRhbnQgYnV0IHNtYWxsIHBhcnQgb2YgdGhlIHVuaXZlcnNlLiBZZXQgUE9TSVgKKyAgICAgdW5jb25kaXRpb25hbGx5IGFuZCB1bmFtYmlndW91c2x5IFJFUVVJUkVTIHRoYXQsIHdoZW4KKyAgICAgX1BPU0lYX0NfU09VUkNFPTE5OTUwNkwsIEFMTCBvZiB0aGUgZnVuY3Rpb25zIGFuZCBkZWZpbml0aW9ucworICAgICByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQsIGFuZCBOTyBvdGhlcnMgKGV4Y2VwdCBpbiBzcGVjaWZpYworICAgICByZXN0cmljdGVkIG5hbWVzcGFjZXMsIHNwZWNpZmljYWxseSAiXyIgZm9sbG93ZWQgYnkgYW4gdXBwZXJjYXNlCisgICAgIGxldHRlciBvciAiX18iIGZvbGxvd2VkIGJ5IGEgbG93ZXJjYXNlIGxldHRlcikgc2hhbGwgYmUgdmlzaWJsZS4KKyAgICAgVGhhdCBraW5kYSBwdXRzIGEgY3JhbXAgb24gQlNEIGFuZCBTVklEIHN1cHBvcnQsIGJlY2F1c2UgdGhvc2UKKyAgICAgcmVxdWlyZSBuYW1lcyB0aGF0IGFyZSBub3QgaW4gdGhlICJwcm90ZWN0ZWQiIFBPU0lYIG5hbWVzcGFjZXMuCisgICAgIEl0J3MgSUxMRUdBTCB0byBtYWtlIHRob3NlIHN5bWJvbHMgdmlzaWJsZSwgdW5sZXNzIHlvdSd2ZSBkb25lCisgICAgIHNvbWV0aGluZyBlbHNlIHRoYXQncyBiZXlvbmQgdGhlIHNjb3BlIG9mIFBPU0lYIHRvIGFsbG93IHRoZSBzeXN0ZW0KKyAgICAgdG8gaW5mZXIgdGhhdCB5b3UgZGlkbid0IHJlYWxseSBtZWFuIGl0LgorCisgICAgIEluIG1vc3QgY2FzZXMsIHlvdSBzaG91bGQganVzdCBjb21waWxlLCB3aXRoIG5vIHN0YW5kYXJkcy1yZWxhdGVkCisgICAgIG1hY3JvcyBkZWZpbmVkLiBUaGUgc3lzdGVtIHdpbGwgbWFrZSBhdmFpbGFibGUgZXZlcnkgaW50ZXJmYWNlIGFuZAorICAgICBkZWZpbml0aW9uIHRoYXQgaXNuJ3QgaW5jb21wYXRpYmxlIHdpdGggdGhlICJtYWluIHN0cmVhbSIuIFRoZXJlCisgICAgIG1heSBpbmRlZWQgYmUgY2FzZXMgd2hlcmUgdHdvIHN0YW5kYXJkcyBjcm9zcywgYW5kIHlvdSByZWFsbHkgY2FuJ3QKKyAgICAgdXNlIGJvdGggdG9nZXRoZXIuIEJ1dCwgaW4gZ2VuZXJhbCwgdGhleSBwbGF5IG5pY2VseSB0b2dldGhlciBhcworICAgICBsb25nIGFzIHlvdSBkb24ndCBkbyBhbnl0aGluZyByYXNoIC0tIGxpa2UgdGVsbGluZyB0aGUgc3lzdGVtIHRoYXQKKyAgICAgaXQncyBub3QgYWxsb3dlZCB0byBsZXQgdGhlbS4KKworICAgICBJbiB0aGUgYXJlYSBvZiB0aHJlYWRzLCBib3RoIFNvbGFyaXMgYW5kIERpZ2l0YWwgVW5peCBzdXBwb3J0CisgICAgIGluY29tcGF0aWJsZSB0aHJlYWQgQVBJcy4gV2UgaGF2ZSBQT1NJWCBhbmQgRENFLCB0aGV5IGhhdmUgUE9TSVgKKyAgICAgYW5kIFVJLiBUaGUgbmFzdHkgYXJlYXMgYXJlIGluIHRoZSBfciByb3V0aW5lcyBhbmQgaW4gc29tZSBhc3BlY3RzCisgICAgIG9mIHNpZ25hbCBiZWhhdmlvci4gWW91IGNhbm5vdCBjb21waWxlIGEgc2luZ2xlIHNvdXJjZSBmaWxlIHRoYXQKKyAgICAgdXNlcyBib3RoIHNlbWFudGljcy4gVGhhdCdzIGxpZmUuIEl0IHNvdW5kcyBhcyBpZiBTb2xhcmlzIGRlZmF1bHRzCisgICAgIHRvIHRoZSBVSSB2YXJpYW50cywgYnV0IGFsbG93cyB5b3UgdG8gZGVmaW5lIHRoaXMKKyAgICAgX1BPU0lYX1RIUkVBRF9TRU1BTlRJQ1MgdG8gZ2V0IGFyb3VuZCBpdC4gV2UgZGVmYXVsdCB0byBQT1NJWCwgYW5kCisgICAgIGFsbG93IHlvdSB0byBkZWZpbmUgX1BUSFJFQURfVVNFX0Q0IChhdXRvbWF0aWNhbGx5IGRlZmluZWQgYnkgdGhlCisgICAgIGNjICItdGhyZWFkcyIgc3dpdGNoKSB0byBzZWxlY3QgdGhlIERDRSB0aHJlYWQgdmFyaWFudHMuIFRoYXQKKyAgICAgZGVmYXVsdCwgYmVjYXVzZSB5b3UncmUgb3BlcmF0aW5nIG91dHNpZGUgb2YgYW55IGluZGl2aWR1YWwKKyAgICAgc3RhbmRhcmQsIGlzIHJlYWxseSBqdXN0IGEgbWFya2V0aW5nIGRlY2lzaW9uLgorICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgOS4xLjIuIEFOU0kgQworCisgICBbIFsyNDRdVG9wIF0gWyBbMjQ1XUNvbnRlbnRzIF0gWyBbMjQ2XVNlY3Rpb24gQ29udGVudHMgXSBbCisgICBbMjQ3XVN1YnNlY3Rpb24gQ29udGVudHMgXSBbIFsyNDhdTmV4dCBdIFsgWzI0OV1QcmV2aW91cyBdCisKKyAgIFRoZSBtYWpvciBkaWZmZXJlbmNlIGJldHdlZW4gQU5TSSBDIGFuZCBlYXJsaWVyIEMgY29tcGlsZXJzIGlzCisgICBmdW5jdGlvbiBwcm90b3R5cGluZy4gQU5TSSBDIGFsbG93cyBmdW5jdGlvbiBhcmd1bWVudHMgdG8gYmUgY2hlY2tlZAorICAgZm9yIHR5cGUgYWdyZWVtZW50LCBhbmQgKHdoZW4gcG9zc2libGUpIHR5cGUgY29lcmNpb24gaW4gdGhlIGV2ZW50IG9mCisgICBhIG1pc21hdGNoLiBGb3IgdGhpcyB0byB3b3JrLCBmdW5jdGlvbnMgYW5kIHRoZWlyIGFyZ3VtZW50cyBtdXN0IGJlCisgICBkZWNsYXJlZCBiZWZvcmUgdGhleSBhcmUgY2FsbGVkLiBUaGUgZm9ybSBmb3IgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGlzCisgICBkaWZmZXJlbnQgaW4gQU5TSSBDIGFuZCBub24tQU5TSSBDIChBTlNJIEMgYWxzbyBhY2NlcHRzIHRoZSBlYXJsaWVyCisgICBmb3JtLCBidXQgdGhlbiBkb2VzIG5vdCBkbyB0eXBlIGNoZWNraW5nKS4KKworICAgQXMgb2YgZWRpdCAxNjcsIEMtS2VybWl0IHRyaWVzIHRvIHRha2UgZnVsbCBhZHZhbnRhZ2Ugb2YgQU5TSSBDCisgICBmZWF0dXJlcywgZXNwZWNpYWxseSBmdW5jdGlvbiBwcm90b3R5cGluZy4gVGhpcyByZW1vdmVzIG1hbnkgYnVncworICAgaW50cm9kdWNlZCBieSBkaWZmZXJpbmcgZGF0YSB0eXBlcyB1c2VkIG9yIHJldHVybmVkIGJ5IHRoZSBzYW1lCisgICBmdW5jdGlvbnMgb24gZGlmZmVyZW50IGNvbXB1dGVycy4gQU5TSSBDIGZlYXR1cmVzIGFyZSBhdXRvbWF0aWNhbGx5CisgICBlbmFibGVkIHdoZW4gdGhlIHN5bWJvbCBfX1NURENfXyBpcyBkZWZpbmVkLiBNb3N0IEFOU0kgQyBjb21waWxlcnMsCisgICBzdWNoIGFzIEdOVSBDQyBhbmQgdGhlIG5ldyBERUMgQyBjb21waWxlciBkZWZpbmUgdGhpcyBzeW1ib2wKKyAgIGludGVybmFsbHkuCisKKyAgIE9uIHRoZSBkb3duc2lkZSwgQU5TSSBDIGNvbXBpbGF0aW9uIGluY3JlYXNlcyB0aGUKKyAgIGFkbWluaXN0cmF0aXZlL2J1cmVhY3JhdGljIGJ1cmRlbiwgc3Bld2luZyBvdXQgY291bnRsZXNzIHVubmVlZGVkCisgICB3YXJuaW5ncyBhYm91dCBtaXNtYXRjaGVkIHR5cGVzLCBlc3BlY2lhbGx5IHdoZW4gd2UgYXJlIGRlYWxpbmcgd2l0aAorICAgc2lnbmVkIGFuZCB1bnNpZ25lZCBjaGFyYWN0ZXJzLCByZXF1aXJpbmcgY2FzdHMgZXZlcnl3aGVyZSB0byBzaHV0IHVwCisgICB0aGUgbWluZGxlc3MgY29tcGxhaW50cyAtLSB0aGVyZSBpcyBubyB1c2UgZm9yIHNpZ25lZCBjaGFycyBpbiBLZXJtaXQKKyAgIChvciBwcm9iYWJseSBhbnl3aGVyZSBlbHNlKS4gU29tZSBjb21waWxlcnMsIG1lcmNpZnVsbHksIGluY2x1ZGUgYQorICAgInRyZWF0IGFsbCBjaGFycyBhcyB1bnNpZ25lZCIgb3B0aW9uLCBhbmQgd2hlbiBhdmFpbGFibGUgaXQgc2hvdWxkIGJlCisgICB1c2VkIC0tIG5vdCBvbmx5IHRvIHN0b3AgdGhlIHdhcm5pbmdzLCBidXQgYWxzbyB0byBhdm9pZCB1bmhlbHBmdWwKKyAgIHNpZ24gZXh0ZW5zaW9uIG9uIGhpZ2gtYml0IGNoYXJhY3RlcnMuCisKKyAgIFRvIGZvcmNlIHVzZSBvZiBBTlNJIEMgcHJvdG90eXBlcywgaW5jbHVkZSAtRENLX0FOU0lDIG9uIHRoZSBjYworICAgY29tbWFuZCBsaW5lLiBUbyBkaXNhYmxlIHRoZSB1c2Ugb2YgQU5TSSBwcm90b3R5cGVzLCBpbmNsdWRlIC1ETk9BTlNJLgorICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgOS4xLjMuIE90aGVyIFN0YW5kYXJkcworCisgICBbIFsyNTBdVG9wIF0gWyBbMjUxXUNvbnRlbnRzIF0gWyBbMjUyXVNlY3Rpb24gQ29udGVudHMgXSBbCisgICBbMjUzXVN1YnNlY3Rpb24gQ29udGVudHMgXSBbIFsyNTRdTmV4dCBdIFsgWzI1NV1QcmV2aW91cyBdCisKKyAgIEFzIHRoZSB5ZWFycyBnbyBieSwgc3RhbmRhcmRzIHdpdGgtd2hpY2gtYWxsLW11c3QtY29tcGx5IGNvbnRpbnVlIHRvCisgICBwaWxlIHVwOiBBRVMsIFhQRzIsIFhQRzMsIFhQRzQsIEZJUFMgMTUxLTIsIHN1Y2Nlc3NpdmUgZ2VuZXJhdGlvbnMgb2YKKyAgIFBPU0lYLCBPU0YvMSwgWC9PcGVuLCBTcGVjIDExNzAsIFVOSVg5NSwgT3BlbiBHcm91cCBVTklYOTgsIElTTy9JRUMKKyAgIDk5NDUgcGFydHMgMS00LCBJU08gOTg5OSwgODhPcGVuLCBPUyA5OSwgU2luZ2xlIFVuaXggU3BlY2lmaWNhdGlvbgorICAgKFNVUywgWzI1Nl1JRUVFIDEwMDMuMS0yMDAxLCBub3QgdG8gbWVudGlvbiAibWF0dXJlIHN0YW5kYXJkcyIgbGlrZQorICAgVjcsIDQuMi80LjNCU0QsIFN5c3RlbSBWIFIzIGFuZCBSNCAoU1ZJRDIgYW5kIFNWSUQzKSwgNC40QlNEICh0aGUKKyAgIGJhc2lzIGZvciBCU0RJLCBPcGVuQlNELCBOZXRCU0QsIEZyZWVCU0QsIE1hYyBPUyBYIGV0YyksIC91c3IvZ3JvdXAsCisgICBwbHVzIGFzc29ydGVkIHNlaXNtaWMgcHJvbm91bmNlbWVudHMgb2YgdGhlIG5ldmVyZW5kaW5nIHNlcmllcyBvZgorICAgZXBoZW1lcmFsIGNvcnBvcmF0ZSBjb25zb3J0aWEsIG5vdCB0byBtZW50aW9uIHRoZSBsaWJjLXZzLWdsaWJjCisgICB0dXJtb2lsIGluIHRoZSBMaW51eCBhcmVuYSBhbmQgd2hvIGtub3dzIHdoYXQgZWxzZS4KKworICAgTm9uZSBvZiB0aGVzZSBzdGFuZGFyZHMgc2ltcGxpZmllcyBsaWZlIGZvciBwb3J0YWJsZSBhcHBsaWNhdGlvbnMgbGlrZQorICAgQy1LZXJtaXQgLS0gZWFjaCBvbmUgaXMgc2ltcGx5IG9uZSBtb3JlIGVudmlyb25tZW50IHRvIHN1cHBvcnQgKG9yCisgICBjaXJjdW12ZW50LCBhcyBpbiBtYW55IGNhc2VzIHRoZXNlIHN0YW5kYXJkcyBkbyBtb3JlIGhhcm0gdGhhbiBnb29kIGJ5CisgICBkZW55aW5nIGFjY2VzcyB0byBmYWNpbGl0aWVzIHdlIG5lZWQsIGUuZy4gYXMgbm90ZWQgaW4gYWJvdmUgaW4KKyAgIFsyNTddOS4xLjEpLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDkuMi4gTGlicmFyeSBJc3N1ZXMKKworICAgWyBbMjU4XVRvcCBdIFsgWzI1OV1Db250ZW50cyBdIFsgWzI2MF1TZWN0aW9uIENvbnRlbnRzIF0gWworICAgWzI2MV1TdWJzZWN0aW9uIENvbnRlbnRzIF0gWyBbMjYyXU5leHQgXSBbIFsyNjNdUHJldmlvdXMgXQorCisgICBPbiBtb3N0IG1vZGVybiBwbGF0Zm9ybXMsIGFwcGxpY2F0aW9ucyBhcmUgLS0gYW5kIG9mdGVuIG11c3QgYmUgLS0KKyAgIGR5bmFtaWNhbGx5IGxpbmtlZC4gVGhpcyBoYXMgbnVtZXJvdXMgYWR2YW50YWdlcyAoc21hbGxlciBleGVjdXRhYmxlcywKKyAgIGFiaWxpdHkgdG8gcGF0Y2ggYSBsaWJyYXJ5IGFuZCB0aGVyZWJ5IHBhdGNoIGFsbCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UKKyAgIGl0LCBldGMpLCBidXQgYWxzbyBjYXVzZXMgc29tZSBoZWFkYWNoZXM6IG1vc3QgY29tbW9ubHksIHRoZSBsaWJyYXJ5CisgICBJRCBidWlsdCBpbnRvIHRoZSBleGVjdXRhYmxlIGF0IGxpbmsgdGltZSBkb2VzIG5vdCBtYXRjaCB0aGUgSUQgb2YgdGhlCisgICBjb3JyZXNwb25kaW5nIGxpYnJhcnkgb24gdGhlIHRhcmdldCBzeXN0ZW0sIGFuZCBzbyB0aGUgbG9hZGVyIHJlZnVzZXMKKyAgIHRvIGxldCB0aGUgYXBwbGljYXRpb24gcnVuLgorCisgICBUaGlzIHByb2JsZW0gb25seSBnZXRzIHdvcnNlIG92ZXIgdGltZS4gSW4gdGhlIExpbnV4IGFuZCAqQlNEIHdvcmxkLAorICAgd2UgYWxzbyBoYXZlIHRvdGFsbHkgZGlmZmVyZW50IGxpYnJhcmllcyAoZWFjaCB3aXRoIHRoZWlyIG93biBuYW1lcworICAgYW5kIG51bWJlcmluZyBzeXN0ZW1zKSB0aGF0IGNvdmVyIHRoZSBzYW1lIHRlcnJpdG9yeTsgZm9yIGV4YW1wbGUsCisgICBjdXJzZXMgdnMgbmN1cnNlcywgbGliYyB2ZXJzdXMgZ2xpYmMuIENvbWJpbmF0aW9ucyBwcm9saWZlcmF0ZSBhbmQgYW55CisgICBnaXZlbiBVbml4IGNvbXB1dGVyIG1pZ2h0IGhhdmUgYW55IGNvbWJpbmF0aW9uLiBGb3IgdGhpcyByZWFzb24gaXQgaXMKKyAgIGJlY29taW5nIGluY3JlYXNpbmdseSBkaWZmaWN1bHQgdG8gcHJvZHVjZSBhICJMaW51eCBiaW5hcnkiIGZvciBhCisgICBnaXZlbiBhcmNoaXRlY3R1cmUgKGUuZy4gUEMgb3IgQWxwaGEpLiBUaGVyZSBoYXMgdG8gYmUgYSBzZXBhcmF0ZQorICAgYmluYXJ5IGZvciAoYXQgbGVhc3QpIGV2ZXJ5IGNvbWJpbmF0aW9uIG9mIGN1cnNlcyB2cyBuY3Vyc2VzIGFuZCBsaWJjCisgICB2cyBnbGliYy4KKworICAgSW4gc3VjaCBjYXNlcywgdGhlIGJlc3QgYWR2aWNlIGlzIGZvciBldmVyeSB1c2VyIHRvIGJ1aWxkIEMtS2VybWl0CisgICBmcm9tIHNvdXJjZSBjb2RlIG9uIHRoZSBzeXN0ZW0gd2hlcmUgaXQgd2lsbCBydW4uIFRvbyBiYWQgbW9zdAorICAgY29tbWVyY2lhbCBVbml4IHZlbmRvcnMgaGF2ZSBzdG9wcGVkIGluY2x1ZGluZyBDIGNvbXBpbGVycyB3aXRoIHRoZQorICAgb3BlcmF0aW5nIHN5c3RlbSEKKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA5LjMuIFVuaXggRmlsZSBTeXN0ZW0gUGVjdWxpYXJpdGllcworCisgICBbIFsyNjRdVG9wIF0gWyBbMjY1XUNvbnRlbnRzIF0gWyBbMjY2XVNlY3Rpb24gQ29udGVudHMgXSBbIFsyNjddTmV4dCBdCisgICBbIFsyNjhdUHJldmlvdXMgXQorCisgICBOb3JtYWxseSwgaW5jbHVkaW5nIGEgQlNELCBTeXN0ZW0tViwgUE9TSVgsIG9yIERJUkVOVCBmbGFnIGluIHRoZSBtYWtlCisgICBlbnRyeSBzZWxlY3RzIHRoZSByaWdodCBmaWxlIHN5c3RlbSBjb2RlLiBCdXQgc29tZSB2ZXJzaW9ucyBvZiBVbml4CisgICBhcmUgaW5jb25zaXN0ZW50IGluIHRoaXMgcmVnYXJkLCBhbmQgYnVpbGRpbmcgaW4gdGhlIG5vcm1hbCB3YXkgZWl0aGVyCisgICBnaXZlcyBjb21waWxlciBvciBsaW5rZXIgZXJyb3JzLCBvciByZXN1bHRzIGluIHByb2JsZW1zIGF0IHJ1bnRpbWUsCisgICB0eXBpY2FsbHkgZmFpbHVyZSB0byBwcm9wZXJseSBleHBhbmQgd2lsZGNhcmQgZmlsZSBzcGVjaWZpY2F0aW9ucyB3aGVuCisgICB5b3UgZG8gc29tZXRoaW5nIGxpa2UgInNlbmQgKi4qIiwgb3IgZmFpbHVyZSB0byByZWNvZ25pemUgbG9uZworICAgZmlsZW5hbWVzLCBhcyBpbiAic2VuZCBmaWxld2l0aGF2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeWxvbmduYW1lIi4KKworICAgQy1LZXJtaXQgaXMgc3VwcG9zZWQgdG8ga25vdyBhYm91dCBhbGwgdGhlIHZhcmlvdXMgc3R5bGVzIG9mIFVuaXggZmlsZQorICAgc3lzdGVtcywgYnV0IGl0IGhhcyB0byBiZSB0b2xkIHdoaWNoIG9uZSB0byB1c2Ugd2hlbiB5b3UgYnVpbGQgaXQsCisgICB1c3VhbGx5IGluIHRoZSBtYWtlZmlsZSB0YXJnZXQgQ0ZMQUdTIGFzIHNob3duIGJlbG93LCBidXQgeW91IG1pZ2h0CisgICBhbHNvIGhhdmUgdG8gYWRkIHNvbWV0aGluZyBsaWtlIC1JL3Vzci9pbmNsdWRlL2JzZCB0byBDRkxBR1MsIG9yCisgICBzb21ldGhpbmcgbGlrZSAtbGJzZCB0byBMSUJTLgorCisgICBDLUtlcm1pdCBnaXZlcyB5b3UgdGhlIGZvbGxvd2luZyBDRkxBR1Mgc3dpdGNoZXMgdG8gYWRhcHQgdG8geW91ciBmaWxlCisgICBzeXN0ZW0ncyBwZWN1bGlhcml0aWVzOgorCistRERJUkVOVCAgIC0gI2luY2x1ZGUgPGRpcmVudC5oPgorLURTRElSRU5UICAtICNpbmNsdWRlIDxzeXMvZGlyZW50Lmg+CistRE5ESVIgICAgIC0gI2luY2x1ZGUgPG5kaXIuaD4KKy1EWE5ESVIgICAgLSAjaW5jbHVkZSA8c3lzL25kaXIuaD4KKy1EUlRVICAgICAgLSAjaW5jbHVkZSAiL3Vzci9saWIvbmRpci5oIiwgb25seSBpZiBORElSIGFuZCBYTkRJUiBub3QgZGVmaW5lZC4KKy1EU1lTVVRJTUggLSAjaW5jbHVkZSA8c3lzL3V0aW1lLmg+IGZvciBzZXR0aW5nIGZpbGUgY3JlYXRpb24gZGF0ZXMuCistRFVUSU1FSCAgIC0gI2luY2x1ZGUgPHV0aW1lLmg+IGZvciBzZXR0aW5nIGZpbGUgY3JlYXRpb24gZGF0ZXMuCisKKyAgIChOb3RlLCBSVFUgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgTWFzc2NvbXAgUlRVIHN5c3RlbXMsIGJlY2F1c2UgaXQKKyAgIGFsc28gc2VsZWN0cyBjZXJ0YWluIG90aGVyIFJUVS1zcGVjaWZpYyBmZWF0dXJlcy4pCisKKyAgIElmIG5vbmUgb2YgdGhlc2UgaXMgZGVmaW5lZCwgdGhlbiA8c3lzL2Rpci5oPiBpcyB1c2VkLiBJTVBPUlRBTlQ6IElmCisgICB5b3VyIHN5c3RlbSBoYXMgdGhlIGZpbGUgL3Vzci9pbmNsdWRlL2RpcmVudC5oIHRoZW4gYmUgc3VyZSB0byBhZGQKKyAgIC1ERElSRU5UIHRvIHlvdXIgbWFrZWZpbGUgdGFyZ2V0J3MgQ0ZMQUdTLiAiZGlyZW50IiBzaG91bGQgYmUgdXNlZCBpbgorICAgcHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIG90aGVycywgYmVjYXVzZSBpdCBzdXBwb3J0cyBhbGwgdGhlIGZlYXR1cmVzCisgICBvZiB5b3VyIGZpbGUgc3lzdGVtLCBhbmQgdGhlIG90aGVycyBwcm9iYWJseSBkb24ndC4KKworICAgSGF2aW5nIHNlbGVjdGVkIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgaGVhZGVyIGZpbGUsIHlvdSBtaWdodCBhbHNvCisgICBuZWVkIHRvIHRlbGwgS2VybWl0IGhvdyB0byBkZWNsYXJlIHRoZSByb3V0aW5lcyBhbmQgdmFyaWFibGVzIGl0IG5lZWRzCisgICB0byByZWFkIHRoZSBkaXJlY3RvcnkuIFRoaXMgaGFwcGVucyBtb3N0IGNvbW1vbmx5IG9uIEFUJlQgU3lzdGVtLVYKKyAgIGJhc2VkIFVOSVhlcywgcGFydGljdWxhcmx5IFN5c3RlbSBWIFIzIGFuZCBlYXJsaWVyLCB0aGF0IHByb3ZpZGUgbG9uZworICAgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIChsb25nZXIgdGhhbiAxNCBjaGFyYWN0ZXJzKS4gRXhhbXBsZXMgaW5jbHVkZQorICAgY2VydGFpbiByZWxlYXNlcyBvZiBIUC1VWCwgRElBQiBETklYLCBvbGRlciB2ZXJzaW9ucyBvZiBTaWxpY29uCisgICBHcmFwaGljcyBJUklYLCBhbmQgcGVyaGFwcyBhbHNvIE1JUFMuIEluIHRoaXMgY2FzZSwgdHJ5IGFkZGluZworICAgLURMT05HRk4gdG8geW91ciBtYWtlZmlsZSB0YXJnZXQuCisKKyAgIEFub3RoZXIgcHJvYmxlbSBjaGlsZCBpcyA8c3lzL2ZpbGUuaD4uIE1vc3QgVW5peCBDLUtlcm1pdCB2ZXJzaW9ucworICAgbmVlZCB0byAjaW5jbHVkZSB0aGlzIGZpbGUgZnJvbSB3aXRoaW4gWzI2OV1ja3VmaW8uYyBhbmQKKyAgIFsyNzBdY2t1dGlvLmMsIGJ1dCBzb21lIG5vdCBvbmx5IGRvIG5vdCBuZWVkIHRvIGluY2x1ZGUgaXQsIGJ1dCBNVVNUCisgICBub3QgaW5jbHVkZSBpdCBiZWNhdXNlIChhKSBpdCBkb2Vzbid0IGV4aXN0LCBvciAoYikgaXQgaGFzIGFscmVhZHkKKyAgIGJlZW4gaW5jbHVkZWQgYnkgc29tZSBvdGhlciBoZWFkZXIgZmlsZSBhbmQgaXQgZG9lc24ndCBwcm90ZWN0IGl0c2VsZgorICAgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24sIG9yIChjKSBzb21lIG90aGVyIHJlYXNvbiB0aGF0IHByZXZlbnRzCisgICBzdWNjZXNzZnVsIGNvbXBpbGF0aW9uLiBJZiB5b3UgaGF2ZSBjb21waWxhdGlvbiBwcm9ibGVtcyB0aGF0IHNlZW0gdG8KKyAgIHN0ZW0gZnJvbSBpbmNsdWRpbmcgdGhpcyBmaWxlLCB0aGVuIGFkZCB0aGUgZm9sbG93aW5nIHN3aXRjaCB0byBDRkxBR1MKKyAgIGluIHlvdXIgbWFrZWZpbGUgdGFyZ2V0OgorCistRE5PRklMRUgKKworICAgVGhlcmUgYXJlIGEgZmV3IG9kZCBjYXNlcyB3aGVyZSA8c3lzL2ZpbGUuaD4gbXVzdCBiZSBpbmNsdWRlZCBpbiBvbmUKKyAgIG9mIHRoZSBja3VbZnRdaW8uYyBmaWxlcywgYnV0IG5vdCB0aGUgb3RoZXIuIEluIHRoYXQgY2FzZSwgYWRkIHRoZQorICAgYWZvcmVtZW50aW9uZWQgc3dpdGNoLCBidXQgZ28gaW50byB0aGUgZmlsZSB0aGF0IG5lZWRzIDxzeXMvZmlsZS5oPgorICAgYW5kIGFkZCBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisjaWZkZWYgWFhYICAgICAgIC8qICh3aGVyZSBYWFggaXMgYSBzeW1ib2wgdW5pcXVlIHRvIHlvdXIgc3lzdGVtKSAqLworI3VuZGVmIE5PRklMRUgKKyNlbmRpZiAvKiBYWFggKi8KKworICAgYmVmb3JlIHRoZSBzZWN0aW9uIHRoYXQgaW5jbHVkZXMgPHN5cy9maWxlLmg+LgorCisgICBLZXJtaXQncyBTRU5EIGNvbW1hbmQgZXhwYW5kcyB3aWxkY2FyZCBjaGFyYWN0ZXJzICI/IiBhbmQgIioiIGl0c2VsZi4KKyAgIEJlZm9yZSB2ZXJzaW9uIDVBLCBjb21tYW5kcyBsaWtlICJzZW5kICoiIHdvdWxkIHNlbmQgYWxsIHJlZ3VsYXIKKyAgIChub24tZGlyZWN0b3J5KSBmaWxlcywgaW5jbHVkaW5nICJoaWRkZW4gZmlsZXMiICh3aG9zZSBuYW1lcyBzdGFydAorICAgd2l0aCAiLiIpLiBJbiB2ZXJzaW9uIDVBLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBtYXRjaCBsaWtlIHRoZQorICAgQm91cm5lIHNoZWxsIG9yIHRoZSBscyBjb21tYW5kLCBhbmQgbm90IGluY2x1ZGUgZmlsZXMgd2hvc2UgbmFtZXMKKyAgIHN0YXJ0IHdpdGggZG90LiBTdWNoIGZpbGVzIGNhbiBzdGlsbCBiZSBzZW50IGlmIHRoZSBkb3QgaXMgaW5jbHVkZWQKKyAgIGV4cGxpY2l0bHkgaW4gdGhlIFNFTkQgY29tbWFuZDogInNlbmQgLm9vZmEsIHNlbmQgLioiLiBUbyBjaGFuZ2UgYmFjaworICAgdG8gdGhlIG9sZCB3YXkgYW5kIGxldCBsZWFkaW5nIHdpbGRjYXJkIGNoYXJhY3RlcnMgbWF0Y2ggZG90IGZpbGVzLAorICAgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGluIHlvdXIgQ0ZMQUdTOgorCistRE1BVENIRE9UCisKKyAgIChJbiBDLUtlcm1pdCA2LjAsIHRoZXJlIGlzIGFsc28gYSBjb21tYW5kIHRvIGNvbnRyb2wgdGhpcyBhdCBydW50aW1lLikKKworICAgQ29tcGxhaW50cyBhYm91dCBkYXRhLXR5cGUgbWlzbWF0Y2hlczoKKworICAgICAqIElmIHlvdSBnZXQgY29tcGlsZS10aW1lIGNvbXBsYWludHMgYWJvdXQgZGF0YSB0eXBlIG1pc21hdGNoZXMgZm9yCisgICAgICAgcHJvY2Vzcy1JRCByZWxhdGVkIGZ1bmN0aW9ucyBsaWtlIGdldHBpZCgpLCBhZGQgLURQSURfVD1waWRfdC4KKyAgICAgKiBJZiB5b3UgZ2V0IGNvbXBpbGUtdGltZSBjb21wbGFpbnRzIGFib3V0IGRhdGEgdHlwZSBtaXNtYXRjaGVzIGZvcgorICAgICAgIHVzZXIgSUQgcmVsYXRlZCBmdW5jdGlvbnMgbGlrZSBnZXR1aWQoKSwgYWRkIC1EVUlEX1Q9dWlkX3QuCisgICAgICogSWYgeW91IGdldCBjb21waWxlLXRpbWUgY29tcGxhaW50cyBhYm91dCBkYXRhIHR5cGUgbWlzbWF0Y2hlcyBmb3IKKyAgICAgICB1c2VyLUlEIHJlbGF0ZWQgZnVuY3Rpb25zIGxpa2UgZ2V0Z2lkKCksIGFkZCAtREdJRF9UPWdpZF90LgorICAgICAqIElmIHlvdSBnZXQgY29tcGlsZS10aW1lIGNvbXBsYWludHMgYWJvdXQgZGF0YSB0eXBlIG1pc21hdGNoZXMgZm9yCisgICAgICAgZ2V0cHd1aWQoKSwgYWRkIC1EUFdJRF9UPXVpZF90IChvciB3aGF0ZXZlciBpdCBzaG91bGQgYmUpLgorCisgICBGaWxlIGNyZWF0aW9uIGRhdGVzOiBDLUtlcm1pdCBhdHRlbXB0cyB0byBzZXQgdGhlIGNyZWF0aW9uIGRhdGUvdGltZQorICAgb2YgYW4gaW5jb21pbmcgZmlsZSBhY2NvcmRpbmcgdG8gdGhlIGRhdGUvdGltZSBnaXZlbiBpbiB0aGUgZmlsZSdzCisgICBhdHRyaWJ1dGUgcGFja2V0LCBpZiBhbnkuIElmIHlvdSBmaW5kIHRoYXQgdGhlIGRhdGVzIGFyZSBzZXQKKyAgIGluY29ycmVjdGx5LCB5b3UgbWlnaHQgbmVlZCB0byBidWlsZCBLZXJtaXQgd2l0aCB0aGUgLURTWVNVVElNRUggZmxhZywKKyAgIHRvIHRlbGwgaXQgdG8gaW5jbHVkZSA8c3lzL3V0aW1lLmg+LiBJZiB0aGF0IGRvZXNuJ3QgaGVscCwgbG9vayBhdCB0aGUKKyAgIGNvZGUgaW4genN0cmR0KCkgaW4gWzI3MV1ja3VmaW8uYy4KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICA5LjQuIEhhcmR3YXJlIEZsb3cgQ29udHJvbAorCisgICBbIFsyNzJdVG9wIF0gWyBbMjczXUNvbnRlbnRzIF0gWyBbMjc0XVNlY3Rpb24gQ29udGVudHMgXSBbIFsyNzVdTmV4dCBdCisgICBbIFsyNzZdUHJldmlvdXMgXQorCisgICBIYXJkd2FyZSBmbG93IGNvbnRyb2wgaXMgYSBwcm9ibGVtYXRpYyBjb25jZXB0IGluIG1hbnkgcG9wdWxhciBVbml4CisgICBpbXBsZW1lbnRhdGlvbnMuIE9mdGVuIGl0IGlzIGxhY2tpbmcgYWx0b2dldGhlciwgYW5kIHdoZW4gYXZhaWxhYmxlLAorICAgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gaW50ZXJmYWNlIChBUEkpIHRvIGl0IGlzIGluY29uc2lzdGVudCBmcm9tCisgICBzeXN0ZW0gdG8gc3lzdGVtLiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgorCisgICAgYS4gUE9TSVggZG9lcyBub3Qgc3VwcG9ydCBoYXJkd2FyZSBmbG93IGNvbnRyb2wuCisgICAgYi4gUlRTL0NUUyBmbG93IGNvbnRyb2wgc3VwcG9ydCBNSUdIVCBiZSBhdmFpbGFibGUgZm9yIFN5c3RlbSBWIFIzCisgICAgICAgYW5kIGxhdGVyIGlmIC91c3IvaW5jbHVkZS90ZXJtaW94LmggZXhpc3RzIChpdHMgc3VjY2Vzc2Z1bAorICAgICAgIG9wZXJhdGlvbiBhbHNvIGRlcGVuZHMgb24gdGhlIGRldmljZSBkcml2ZXIsIGFuZCB0aGUgZGV2aWNlCisgICAgICAgaXRzZWxmLCBub3QgdG8gbWVudGlvbiB0aGUgY2FibGUsIGV0YywgYWN0dWFsbHkgc3VwcG9ydGluZyBpdCkuIElmCisgICAgICAgeW91ciBTVlIzLW9yLWxhdGVyIFVuaXggc3lzdGVtIGRvZXMgaGF2ZSB0aGlzIGZpbGUsIGFkZDoKKworLURURVJNSU9YCisKKyAgICAgICB0byB5b3VyIENGTEFHUy4gSWYgdGhlIGZpbGUgaXMgaW4gL3Vzci9pbmNsdWRlL3N5cyBpbnN0ZWFkLCBhZGQ6CisKKy1EU1RFUk1JT1gKKworICAgICAgIE5vdGUgdGhhdCB0aGUgcHJlc2VuY2Ugb2YgdGhpcyBmaWxlIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0CisgICAgICAgUlRTL0NUUyB3aWxsIGFjdHVhbGx5IHdvcmsgLS0gdGhhdCBkZXBlbmRzIG9uIHRoZSBkZXZpY2UtZHJpdmVyCisgICAgICAgaW1wbGVtZW50YXRpb24gKHJlcG9ydGVkbHksIG1hbnkgVW5peCB2ZXJzaW9ucyB0cmVhdAorICAgICAgIGhhcmR3YXJlLWZsb3ctY29udHJvbCByZWxhdGVkIGlvY3RsJ3MgYXMgbm8tb3BzKS4KKyAgICBjLiBTZWFyY2ggKCJncmVwIC1pIikgdGhyb3VnaCAvdXNyL2luY2x1ZGUvKi5oIGFuZAorICAgICAgIC91c3IvaW5jbHVkZS9zeXMvKi5oIGZvciBSVFMgb3IgQ1RTIGFuZCBzZWUgd2hhdCB0dXJucyB1cC4gRm9yCisgICAgICAgZXhhbXBsZSwgaW4gU3VuT1MgNC54IHdlIGZpbmQgIkNSVFNDVFMiLiBGaWd1cmluZyBvdXQgaG93IHRvIHVzZQorICAgICAgIGl0IGlzIGFub3RoZXIgcXVlc3Rpb24gZW50aXJlbHkhIEluIElCTSBBSVggUlMvNjAwMCAzLngsIHdlIGhhdmUKKyAgICAgICB0byAiYWRkIiBhIG5ldyAibGluZSBkaXNjaXBsaW5lIiAoYW5kIHlvdSB3b24ndCBmaW5kIHVwcGVyY2FzZSBSVFMKKyAgICAgICBvciBDVFMgc3ltYm9scyBpbiB0aGUgaGVhZGVyIGZpbGVzKS4KKyAgICBkLiBOZVhUU1RFUCBhbmQgSVJJWCwgYW5kIHBvc3NpYmx5IG90aGVycywgc3VwcG9ydCBoYXJkd2FyZSBmbG93CisgICAgICAgY29udHJvbCwgYnV0IGRvIG5vdCBmdXJuaXNoIGFuIEFQSSB0byBjb250cm9sIGl0LCBhbmQgdGh1cyBvbgorICAgICAgIHRoZXNlIHN5c3RlbXMgS2VybWl0IGhhcyBubyBjb21tYW5kIHRvIHNlbGVjdCBpdCAtLSBpbnN0ZWFkLCBhCisgICAgICAgc3BlY2lhbCBkZXZpY2UgbmFtZSBtdXN0IGJlIHVzZWQuIChOZVhUU1RFUDogL2Rldi9jdWZhIGluc3RlYWQgb2YKKyAgICAgICAvZGV2L2N1YTsgSVJJWDogL2Rldi90dHlmMDApCisKKyAgIFNlZSB0aGUgcm91dGluZSB0dGhmbG93KCkgaW4gWzI3N11ja3V0aW8uYyBmb3IgZGV0YWlscy4gSWYgeW91IGZpbmQKKyAgIHRoYXQgeW91ciBzeXN0ZW0gb2ZmZXJzIGhhcmR3YXJlIGZsb3cgY29udHJvbCBzZWxlY3Rpb24gdW5kZXIgcHJvZ3JhbQorICAgY29udHJvbCwgeW91IGNhbiBhZGQgdGhpcyBjYXBhYmlsaXR5IHRvIEMtS2VybWl0IGFzIGZvbGxvd3M6CisKKyAgICBhLiBTZWUgaWYgaXQgYWdyZWVzIHdpdGggb25lIG9mIHRoZSBtZXRob2RzIGFscmVhZHkgdXNlZCBpbgorICAgICAgIHR0aGZsb3coKS4gaWYgbm90LCBhZGQgbmV3IGNvZGUsIGFwcHJvcHJpYXRlbHkgI2lmZGVmJ2QuCisgICAgYi4gQWRkIC1EQ0tfUlRTQ1RTIHRvIHRoZSBjb21waWxlciBDRkxBR1MgaW4geW91ciBtYWtlZmlsZSB0YXJnZXQgb3IKKyAgICAgICBkZWZpbmUgdGhpcyBzeW1ib2wgd2l0aGluIHRoZSBhcHByb3ByaWF0ZSAjaWZkZWZzIGluCisgICAgICAgWzI3OF1ja2NkZWIuaC4KKworICAgVG8gaWxsdXN0cmF0ZSB0aGUgZGlmZmljdWx0aWVzIHdpdGggUlRTL0NUUywgaGVyZSBpcyBhIHRhbGUgZnJvbSBKYW1pZQorICAgV2F0c29uIDxqd0BhZGFzb2Z0LmNoPiwgd2hvIGFkZGVkIHRoZSBSVFMvQ1RTIGNvZGUgZm9yIHRoZSBSUy82MDAwLAorICAgYWJvdXQgaGlzIGF0dGVtcHRzIHRvIGRvIHRoZSBzYW1lIGZvciBERUMgVUxUUklYOgorCisgICAgICJUaGUgbnVtYmVyIGFuZCB0eXBlIG9mIGhhcmR3YXJlIHNpZ25hbHMgYXZhaWxhYmxlIHRvL2Zyb20gYSBzZXJpYWwKKyAgICAgcG9ydCB2YXJ5IGJldHdlZW4gZGlmZmVyZW50IG1hY2hpbmVzIGFuZCBkaWZmZXJlbnQgdHlwZXMgb2Ygc2VyaWFsCisgICAgIGludGVyZmFjZXMgb24gZWFjaCBtYWNoaW5lLiBUaGlzIG1lYW5zIHRoYXQsIGZvciBleGFtcGxlLCB0aGVyZSBhcmUKKyAgICAgdmlydHVhbGx5IG5vIGhhcmR3YXJlIHNpZ25hbHMgaW4gb3Igb3V0IGF2YWlsYWJsZSBvbiB0aGUgREVDc3lzdGVtCisgICAgIDMwMDAvMzEwMCBzZXJpZXM7IG9uIHRoZSBERUNzeXN0ZW0gNTAwMC8yeHggc2VyaWVzIGFsbCBtb2RlbQorICAgICBzaWduYWxzIGluL291dCBhcmUgcHJlc2VudCBvbiBib3RoIGJ1aWx0LWluIHNlcmlhbCBwb3J0czsgb24gdGhlCisgICAgIERFQ3N5c3RlbSA1MTAwIHNvbWUgcG9ydHMgaGF2ZSBhbGwgc2lnbmFscyBhbmQgc29tZSBvbmx5IGhhdmUgc29tZTsKKyAgICAgYW5kIHNvIG9uLi4uIEl0IGxvb2tzIHRvIG1lIGFzIGlmIHRoaXMgcHJldHR5IHdlbGwgcnVsZXMgb3V0IGFueQorICAgICBhdHRlbXB0IHRvIHVzZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgb24gdGhlc2UgcGxhdGZvcm1zLCBldmVuIGlmIHdlCisgICAgIGNvdWxkIGZpZ3VyZSBvdXQgaG93IHRvIGRvIGl0LiBUaGUgY29uZnVzaW9uIG9uIHRoZSB1c2VyIGxldmVsCisgICAgIGFib3V0IHdoZXRoZXIgb3Igbm90IGl0IHNob3VsZCB3b3JrIGZvciBhbnkgZ2l2ZW4gcGxhdGZvcm0gb3IgcG9ydAorICAgICB3b3VsZCBiZSB0cmVtZW5kb3VzLiBBbmQgdGhlbiBpdCBpc24ndCBjbGVhciBob3cgdG8gdXNlIHRoZQorICAgICBoYXJkd2FyZSBzaWduYWxzIGV2ZW4gaW4gdGhlIGNhc2VzIHdoZXJlIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlbS4iCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOS41LiBUZXJtaW5hbCBTcGVlZHMKKworICAgWyBbMjc5XVRvcCBdIFsgWzI4MF1Db250ZW50cyBdIFsgWzI4MV1TZWN0aW9uIENvbnRlbnRzIF0gWyBbMjgyXU5leHQgXQorICAgWyBbMjgzXVByZXZpb3VzIF0KKworICAgVGhlIGFsbG93YWJsZSBzcGVlZHMgZm9yIHRoZSBTRVQgU1BFRUQgY29tbWFuZCBhcmUgZGVmaW5lZCBpbgorICAgWzI4NF1ja2NkZWIuaC4gSWYgeW91ciBzeXN0ZW0gc3VwcG9ydHMgc3BlZWRzIHRoYXQgYXJlIG5vdCBsaXN0ZWQgaW4KKyAgICJzZXQgc3BlZWQgPyIsIHlvdSBjYW4gYWRkIGRlZmluaXRpb25zIGZvciB0aGVtIHRvIGNrY2RlYi5oLgorCisgICBUaGVuIGlmIHRoZSBzcGVlZCB5b3UgYXJlIGFkZGluZyBpcyBvbmUgdGhhdCB3YXMgbmV2ZXIgdXNlZCBiZWZvcmUgaW4KKyAgIEtlcm1pdCwgc3VjaCBhcyA5MjE2MDAsIHlvdSdsbCBhbHNvIG5lZWQgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZQorICAga2V5d29yZHMgdG8gc3BkdGFiW10gaW4gWzI4NV1ja3V1czMuYywgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNhc2UgdG8KKyAgIHR0c3NwZCgpIGluIFsyODZdY2t1dGlvLmMuCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOS42LiBNaWxsaXNlY29uZCBTbGVlcHMKKworICAgWyBbMjg3XVRvcCBdIFsgWzI4OF1Db250ZW50cyBdIFsgWzI4OV1TZWN0aW9uIENvbnRlbnRzIF0gWyBbMjkwXU5leHQgXQorICAgWyBbMjkxXVByZXZpb3VzIF0KKworICAgVGhlcmUgaXMgbm8gc3RhbmRhcmQgZm9yIG1pbGxpc2Vjb25kIHNsZWVwcywgYnV0IGF0IGxlYXN0IGZpdmUKKyAgIGRpZmZlcmVudCBmdW5jdGlvbnMgaGF2ZSBhcHBlYXJlZCBpbiB2YXJpb3VzIFVuaXggdmVyc2lvbnMgdGhhdCBjYW4gYmUKKyAgIHVzZWQgZm9yIHRoaXMgcHVycG9zZTogbmFwKCkgKG1vc3RseSBpbiBTeXN0ZW0gViksIHVzbGVlcCgpIChmb3VuZCBhdAorICAgbGVhc3QgaW4gU3VuT1MgYW5kIE5lWFQgT1MpLCBzZWxlY3QoKSAoZm91bmQgaW4gNC4yQlNEIGFuZCBsYXRlciwgYW5kCisgICBwYXJ0IG9mIGFueSBUQ1AvSVAgc29ja2V0cyBsaWJyYXJ5KSwgbmFub3NsZWVwKCksIGFuZCBzZ2luYXAoKS4gSWYgeW91CisgICBoYXZlIGFueSBvZiB0aGVzZSBhdmFpbGFibGUsIHBpY2sgb25lIChpbiB0aGlzIG9yZGVyIG9mIHByZWZlcmVuY2UsIGlmCisgICB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lKToKKworLURTRUxFQ1Q6IEluY2x1ZGUgdGhpcyBpbiBDRkxBR1MgaWYgeW91ciBzeXN0ZW0gaGFzIHRoZSBzZWxlY3QoKSBmdW5jdGlvbi4KKy1ETkFQOiAgICBJbmNsdWRlIHRoaXMgaW4gQ0ZMQUdTIGlmIHlvdXIgc3lzdGVtIGhhcyB0aGUgbmFwKCkgZnVuY3Rpb24uCistVVNMRUVQOiAgSW5jbHVkZSB0aGlzIGluIENGTEFHUyBpZiB5b3VyIHN5c3RlbSBoYXMgdGhlIHVzbGVlcCgpIGZ1bmN0aW9uLgorCisgICBOT1RFOiBUaGUgbmFwKCkgZnVuY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBhIGZ1bmN0aW9uIHRoYXQgcHV0cyB0aGUKKyAgIHByb2Nlc3MgdG8gc2xlZXAgZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBJZiB5b3VyCisgICBzeXN0ZW0ncyBuYXAoKSBmdW5jdGlvbiBkb2VzIHNvbWV0aGluZyBlbHNlIG9yIHVzZXMgc29tZSBvdGhlciB1bml0cworICAgb2YgdGltZSAobGlrZSB0aGUgTkNSIFRvd2VyIDMyLCB3aGljaCB1c2VzIGNsb2NrLXRpY2tzKSwgZG8gbm90CisgICBpbmNsdWRlIC1ETkFQLgorCisgICBSZXBvcnRlZGx5LCBhbGwgdmVyc2lvbnMgb2YgU3lzdGVtIFYgUjQgZm9yIEludGVsLWJhc2VkIGNvbXB1dGVycywgYW5kCisgICBwb3NzaWJseSBhbHNvIFNWUjMuMiwgaW5jbHVkZSBuYXAoKSBhcyBhIGtlcm5lbCBjYWxsLCBidXQgaXQncyBub3QgaW4KKyAgIHRoZSBsaWJyYXJ5LiBUbyBpbmNsdWRlIGNvZGUgdG8gdXNlIGl0IHZpYSBzeXNjYWxsKDMxMTIseCksIHdpdGhvdXQKKyAgIGhhdmluZyB0byBpbmNsdWRlIFhlbml4IGNvbXBhdGliaWxpdHkgZmVhdHVyZXMsIGluY2x1ZGUgdGhlIGZvbGxvd2luZworICAgY29tcGlsZS10aW1lIG9wdGlvbjoKKworLUROQVBIQUNLCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOS43LiBOb25kZXN0cnVjdGl2ZSBJbnB1dCBCdWZmZXIgUGVla2luZworCisgICBbIFsyOTJdVG9wIF0gWyBbMjkzXUNvbnRlbnRzIF0gWyBbMjk0XVNlY3Rpb24gQ29udGVudHMgXSBbIFsyOTVdTmV4dCBdCisgICBbIFsyOTZdUHJldmlvdXMgXQorCisgICBTb21lIEFUJlQgVW5peCB2ZXJzaW9ucyBoYXZlIG5vIHdheSB0byBjaGVjayBpZiBpbnB1dCBpcyB3YWl0aW5nIG9uIGEKKyAgIHR0eSBkZXZpY2UsIGJ1dCB0aGlzIGlzIGEgdmVyeSBpbXBvcnRhbnQgZmVhdHVyZSBmb3IgS2VybWl0LiBXaXRob3V0CisgICBpdCwgc2xpZGluZyB3aW5kb3dzIG1pZ2h0IG5vdCB3b3JrIHZlcnkgd2VsbCAob3IgYXQgYWxsKSwgYW5kIHlvdSBhbHNvCisgICBoYXZlIHRvIHR5cGUgeW91ciBlc2NhcGUgY2hhcmFjdGVyIHRvIGdldCBLZXJtaXQncyBhdHRlbnRpb24gaW4gb3JkZXIKKyAgIHRvIGludGVycnVwdCBhIGxvY2FsLW1vZGUgZmlsZSB0cmFuc2Zlci4gSWYgeW91ciBzeXN0ZW0gb2ZmZXJzIGFuCisgICBGSU9OUkVBRCBpb2N0bCwgdGhlIGJ1aWxkIHByb2NlZHVyZSBzaG91bGQgcGljayB0aGF0IHVwIGF1dG9tYXRpY2FsbHkKKyAgIGFuZCB1c2UgaXQsIHdoaWNoIGlzIGlkZWFsLgorCisgICBJZiB5b3VyIHN5c3RlbSBsYWNrcyBGSU9OUkVBRCBidXQgaGFzIGEgc2VsZWN0KCkgZnVuY3Rpb24sIHRoaXMgY2FuIGJlCisgICB1c2VkIGluc3RlYWQuIElmIHRoZSBidWlsZCBwcm9jZWR1cmUgZmFpbHMgdG8gaW5jbHVkZSBpdCAoU0hPVworICAgRkVBVFVSRVMgd2lsbCBsaXN0IFNFTEVDVCksIHRoZW4geW91IGNhbiBhZGQgaXQgdG8geW91ciBDRkxBR1M6CisKKy1EU0VMRUNUCisKKyAgIENvbnZlcnNlbHksIGlmIHRoZSBidWlsZCBwcm9jZWR1cmUgdHJpZXMgdG8gdXNlIHNlbGVjdCgpIHdoZW4gaXQKKyAgIHJlYWxseSBpcyBub3QgdGhlcmUsIGFkZDoKKworLUROT1NFTEVDVAorCisgICBOb3RlOiBzZWxlY3QoKSBpcyBub3QgcGFydCBvZiBTeXN0ZW0gViBub3Igb2YgUE9TSVgsIGJ1dCBpdCBoYXMgYmVlbgorICAgYWRkZWQgdG8gdmFyaW91cyBTeXN0ZW0tVi0gYW5kIFBPU0lYLWJhc2VkIHN5c3RlbXMgYXMgYW4gZXh0ZW5zaW9uLgorCisgICBTb21lIFN5c3RlbS1WIHZhcmlhdGlvbnMgKFNDTyBYZW5peC9VTklYL09EVCBhbmQgRElBQiBETklYKSBpbmNsdWRlIGEKKyAgIHJkY2hrKCkgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgYnVmZmVyIHBlZWtpbmcuIEl0IHJldHVybnMgMCBpZgorICAgbm8gY2hhcmFjdGVycyBhcmUgd2FpdGluZyBhbmQgMSBpZiBjaGFyYWN0ZXJzIGFyZSB3YWl0aW5nIChidXQgdW5saWtlCisgICBGSU9OUkVBRCwgaXQgZG9lcyBub3QgdGVsbCB0aGUgYWN0dWFsIG51bWJlcikuIElmIHlvdXIgc3lzdGVtIGhhcworICAgcmRjaGsoKSwgYWRkOgorCistRFJEQ0hLOiAgSW5jbHVkZSB0aGlzIGluIENGTEFHUyBpZiB5b3VyIHN5c3RlbSBoYXMgdGhlIHJkY2hrKCkgZnVuY3Rpb24uCisKKyAgIE90aGVyd2lzZSwgaWYgeW91ciB2ZXJzaW9uIG9mIFVuaXggaGFzIHRoZSBwb2xsKCkgZnVuY3Rpb24gKGFuZCB0aGUKKyAgIC91c3IvaW5jbHVkZS9wb2xsLmggZmlsZSkgLS0gd2hpY2ggYXBwZWFycyB0byBiZSBhIHN0YW5kYXJkIHBhcnQgb2YKKyAgIFN5c3RlbSBWIGdvaW5nIGJhY2sgdG8gYXQgbGVhc3QgU1ZSMywgaW5jbHVkZToKKworLURDS19QT0xMCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgOS44LiBPdGhlciBTeXN0ZW0tRGVwZW5kZW50IEZlYXR1cmVzCisKKyAgIFsgWzI5N11Ub3AgXSBbIFsyOThdQ29udGVudHMgXSBbIFsyOTldU2VjdGlvbiBDb250ZW50cyBdIFsgWzMwMF1OZXh0IF0KKyAgIFsgWzMwMV1QcmV2aW91cyBdCisKKyAgIFN5c3RlbXMgd2l0aCA8dGVybWlvcy5oPiBtaWdodCBoYXZlIHRoZSBzeW1ib2wgSUVYVEVOIGRlZmluZWQuIFRoaXMgaXMKKyAgIHVzZWQgdG8gdHVybiAiZXh0ZW5kZWQgZmVhdHVyZXMiIGluIHRoZSB0dHkgZGV2aWNlIGRyaXZlciBvbiBhbmQgb2ZmLAorICAgc3VjaCBhcyBDdHJsLU8gdG8gdG9nZ2xlIG91dHB1dCBmbHVzaGluZywgQ3RybC1WIHRvIHF1b3RlIGlucHV0CisgICBjaGFyYWN0ZXJzLCBldGMuCisKKyAgIEluIG1vc3QgVW5peCBpbXBsZW1lbnRhdGlvbnMsIGl0IHNob3VsZCBiZSB0dXJuZWQgb2ZmIGR1cmluZyBLZXJtaXQKKyAgIG9wZXJhdGlvbiwgc28gaWYgWzMwMl1ja3V0aW8uYyBmaW5kcyB0aGlzIHN5bWJvbCwgaXQgdXNlcyBpdC4gVGhpcyBpcworICAgbmVjZXNzYXJ5LCBhdCBsZWFzdCwgb24gQlNESS4gT24gc29tZSBzeXN0ZW1zLCBob3dldmVyLCBJRVhURU4gaXMKKyAgIGVpdGhlciBtaXNkZWZpbmVkIG9yIG1pc2ltcGxlbWVudGVkLiBUaGUgc3ltcHRvbSBpcyB0aGF0IENSLCB3aGVuCisgICB0eXBlZCB0byB0aGUgY29tbWFuZCBwcm9jZXNzb3IsIGlzIGVjaG9lZCBhcyBMRiwgcmF0aGVyIHRoYW4gQ1JMRi4KKyAgIFRoaXMgaGFwcGVucyAoYXQgbGVhc3QpIG9uIENvbnZleC9PUyA5LjEuIFRoZSBzb2x1dGlvbiBpcyB0byBhZGQgdGhlCisgICBmb2xsb3dpbmcgc3ltYm9sIHRvIHRoZSBtYWtlZmlsZSB0YXJnZXQncyBDRkxBQ1M6CisKKy1ETk9JRVhURU4KKworICAgSG93ZXZlciwgaW4gYXQgbGVhc3Qgb25lIFVuaXggaW1wbGVtZW50YXRpb24sIFFOWCA0LjIxLCBJRVhURU4gbXVzdCBiZQorICAgc2V0IGJlZm9yZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgY2FuIGJlIHVzZWQuCisKKyAgIEluIGVkaXRzIDE3NyBhbmQgZWFybGllciwgd29ya3N0YXRpb24gdXNlcnMgbm90aWNlZCBhICJzbG93IHNjcmVlbgorICAgd3JpdGluZyIgcGhlbm9tZW5vbiBkdXJpbmcgaW50ZXJhY3RpdmUgY29tbWFuZCBwYXJzaW5nLiBUaGlzIHdhcworICAgdHJhY2VkIHRvIGEgc2V0YnVmKCkgY2FsbCBpbiBbMzAzXWNrdXRpby5jIHRoYXQgbWFkZSBjb25zb2xlIChzdGRvdXQpCisgICB3cml0ZXMgdW5idWZmZXJlZC4gVGhpcyBzZXRidWYoKSBjYWxsIGhhcyBiZWVuIHRoZXJlIGZvcmV2ZXIsIGFuZAorICAgY291bGQgbm90IGJlIHJlbW92ZWQgd2l0aG91dCBzb21lIHJpc2suIEtlcm1pdCdzIG9wZXJhdGlvbiB3YXMgdGVzdGVkCisgICBvbiB0aGUgTmVYVCBpbiBlZGl0IDE3OCB3aXRoIHRoZSBzZXRidWYoKSBjYWxsIHJlbW92ZWQsIGFuZCB0aGUKKyAgIHNsb3ctd3JpdGluZyBzeW1wdG9tIHdhcyBjdXJlZCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSAoY29tbWFuZCBwYXJzaW5nLAorICAgcHJvcGVyIHdha2V1cCBvbiA/LCBFU0MsIEN0cmwtVSwgYW5kIG90aGVyIGVkaXRpbmcgY2hhcmFjdGVycywKKyAgIHRlcm1pbmFsIGVtdWxhdGlvbiwgcmVtb3RlLW1vZGUgYW5kIGxvY2FsLW1vZGUgZmlsZSB0cmFuc2ZlciwgZXRjKQorICAgc2VlbWVkIHRvIHdvcmsgYXMgd2VsbCBhcyBvciBiZXR0ZXIgdGhhbiBiZWZvcmUuIEluIHN1YnNlcXVlbnQgZWRpdHMsCisgICB0aGlzIGNoYW5nZSB3YXMgbWFkZSB0byBtYW55IG90aGVyIHZlcnNpb25zIHRvbywgd2l0aCBubyBhcHBhcmVudCBpbGwKKyAgIGVmZmVjdHMuIFRvIHJlbW92ZSB0aGUgc2V0YnVmKCkgY2FsbCBmb3IgeW91ciB2ZXJzaW9uIG9mIEtlcm1pdCwgYWRkOgorCistRE5PU0VUQlVGCisKKyAgIExhdGVyIHJlcG9ydHMgaW5kaWNhdGUgdGhhdCBhZGRpbmcgLUROT1NFVEJVRiBoYXMgb3RoZXIgYmVuZWZpY2lhbAorICAgZWZmZWN0cywgbGlrZSBjdXR0aW5nIGRvd24gb24gc3dhcHBpbmcgd2hlbiBLZXJtaXQgaXMgcnVuIG9uCisgICB3b3Jrc3RhdGlvbnMgd2l0aCBzbWFsbCBtZW1vcmllcy4gQnV0IEJFV0FSRTogb24gY2VydGFpbiBzbWFsbCBVbml4CisgICBzeXN0ZW1zLCBub3RhYmx5IHRoZSBBVCZUIDYzMDAgYW5kIDNCMSAodGhlIHZlcnkgc2FtZSBvbmVzIHRoYXQKKyAgIGJlbmVmaXQgZnJvbSBOT1NFVEJVRiksIE5PU0VUQlVGIHNlZW1zIHRvIGNvbmZsaWN0IHdpdGggQ0tfQ1VSU0VTLiBUaGUKKyAgIHByb2dyYW0gYnVpbGRzIGFuZCBydW5zIE9LLCBidXQgYWZ0ZXIgb25jZSB1c2luZyB0aGUgY3Vyc2VzIGRpc3BsYXksCisgICBlY2hvaW5nIGlzIG1lc3NlZCB1cC4gSW4gdGhpcyBjYXNlLCB3ZSB1c2UgYSBTeXN0ZW0tViBzcGVjaWZpYworICAgdmFyaWF0aW9uIGluIHRoZSBjdXJzZXMgY29kZSwgdXNpbmcgbmV3dGVybSgpIHRvIHByZXZlbnQgU3lzdGVtIFYgZnJvbQorICAgYWx0ZXJpbmcgdGhlIGJ1ZmZlcmluZy4gU2VlIG1ha2VmaWxlIGVudHJpZXMgZm9yIEFUJlQgNjMwMCBhbmQgM0IxLgorCisgICBUaGUgVW5peCB2ZXJzaW9uIG9mIEMtS2VybWl0IGluY2x1ZGVzIGNvZGUgdG8gc3dpdGNoIHRvIGZpbGUKKyAgIGRlc2NyaXB0b3IgemVybyAoc3RkaW4pIGZvciByZW1vdGUtbW9kZSBmaWxlIHRyYW5zZmVyLiBUaGlzIGNvZGUgaXMKKyAgIG5lY2Vzc2FyeSB0byBwcmV2ZW50IEtlcm1pdCBmcm9tIGdpdmluZyB0aGUgaW1wcmVzc2lvbiB0aGF0IGl0IGlzCisgICAiaWRsZSIgZHVyaW5nIGZpbGUgdHJhbnNmZXJzLCB3aGljaCwgYXQgc29tZSBzaXRlcywgY2FuIHJlc3VsdCBpbiB0aGUKKyAgIGpvYiBiZWluZyBsb2dnZWQgb3V0IGluIHRoZSBtaWRkbGUgb2YgYW4gYWN0aXZlIGZpbGUgdHJhbnNmZXIgYnkKKyAgIGlkbGUtam9iIG1vbml0b3JzLgorCisgICBIb3dldmVyLCB0aGlzIGZlYXR1cmUgY2FuIGludGVyZmVyZSB3aXRoIGNlcnRhaW4gc2V0dXBzOyBmb3IgZXhhbXBsZSwKKyAgIHRoZXJlIGlzIGEgcGFja2FnZSB3aGljaCBzdWJzdGl0dXRlcyBhIHB0eS90dHkgcGFpciBmb3IgL2Rldi90dHkgYW5kCisgICBzZXRzIGZpbGUgZGVzY3JpcHRvciAwIHRvIGJlIHJlYWQtb25seSwgcHJldmVudGluZyBLZXJtaXQgZnJvbSBzZW5kaW5nCisgICBwYWNrZXRzLiBPci4uLiBXaGVuIGEgVW5peCBzaGVsbCBpcyBpbnZva2VkIHVuZGVyIHRoZSBQSUNLCisgICBlbnZpcm9ubWVudCwgZmlsZSBkZXNjcmlwdG9yIDAgaXMgaW5vcGVyYXRpdmUuCisKKyAgIFRvIHJlbW92ZSB0aGlzIGZlYXR1cmUgYW5kIGFsbG93IEtlcm1pdCB0byB3b3JrIGluIHN1Y2ggZW52aXJvbm1lbnRzLAorICAgYWRkIHRoZSBjb21waWxlLXRpbWUgb3B0aW9uOgorCistRE5PRkRaRVJPCisKKyAgIE9uIHNvbWUgdmVyc2lvbnMgb2YgVW5peCwgZWFybGllciByZWxlYXNlcyBvZiBDLUtlcm1pdCB3ZXJlIHJlcG9ydGVkCisgICB0byByZW5kZXIgYSB0dHkgZGV2aWNlIHVudXNhYmxlIGFmdGVyIGEgaGFuZ3VwIG9wZXJhdGlvbi4gRXhhbXBsZXMKKyAgIGluY2x1ZGUgSUJNIEFJWCBvbiB0aGUgUlQgUEMgYW5kIFJTLzYwMDAuIEEgdHlwaWNhbCBzeW1wdG9tIG9mIHRoaXMKKyAgIHBoZW5vbWVub24gaXMgdGhhdCB0aGUgRElBTCBjb21tYW5kIGRvZXNuJ3Qgd29yaywgYnV0IENPTk5FQ1RpbmcgdG8KKyAgIHRoZSBkZXZpY2UgYW5kIGRpYWxpbmcgbWFudWFsbHkgZG8gd29yay4gQSBmdXJ0aGVyIHRlc3QgaXMgdG8gU0VUIERJQUwKKyAgIEhBTkdVUCBPRkYsIHdoaWNoIHNob3VsZCBtYWtlIGRpYWxpbmcgd29yayBvbmNlIGJ5IHNraXBwaW5nIHRoZQorICAgcHJlLWRpYWwgaGFuZ3VwLiBIb3dldmVyLCBhZnRlciB0aGUgY29ubmVjdGlvbiBpcyBicm9rZW4sIGl0IGNhbid0IGJlCisgICB1c2VkIGFueSBtb3JlOiBzdWJzZXF1ZW50IGF0dGVtcHRzIHRvIERJQUwgdGhlIHNhbWUgZGV2aWNlIGRvbid0IHdvcmsuCisgICBUaGUgY3VyZSBpcyB1c3VhbGx5IHRvIGNsb3NlIGFuZCByZW9wZW4gdGhlIGRldmljZSBhcyBwYXJ0IG9mIHRoZQorICAgaGFuZ3VwIG9wZXJhdGlvbi4gVG8gZG8gdGhpcywgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGNvbXBpbGUtdGltZQorICAgb3B0aW9uOgorCistRENMU09QTgorCisgICBTaW1pbGFybHksIHRoZXJlIGlzIGEgc2VjdGlvbiBvZiBjb2RlIGluIHR0b3BlbigpLCB3aGljaCBkb2VzIGFub3RoZXIKKyAgIGNsb3NlKG9wZW4oKSkgdG8gZm9yY2UgdGhlIE9fTkRFTEFZIG1vZGUgY2hhbmdlLiBPbiBzb21lIHN5c3RlbXMsIHRoZQorICAgY2xvc2Uob3BlbigpKSBpcyByZXF1aXJlZCB0byBtYWtlIHRoZSBtb2RlIGNoYW5nZSB0YWtlIGVmZmVjdCwgYW5kCisgICBhcHBhcmVudGx5IG9uIG1vc3Qgb3RoZXJzIGl0IGRvZXMgbm8gaGFybS4gQnV0IHJlcG9ydGVkbHkgb24gYXQgbGVhc3QKKyAgIG9uZSBTeXN0ZW0gViBSNCBpbXBsZW1lbnRhdGlvbiwgYW5kIG9uIFNDTyBYZW5peCAzLjIsIHRoZQorICAgY2xvc2Uob3BlbigpKSBvcGVyYXRpb24gaGFuZ3MgaWYgdGhlIGRldmljZSBsYWNrcyBjYXJyaWVyLCBFVkVOIFRIT1VHSAorICAgdGhlIENMT0NBTCBjaGFyYWN0ZXJpc3RpYyBoYXMganVzdCBiZWVuIHNldCB0byBhdm9pZCB0aGlzIHZlcnkKKyAgIHByb2JsZW0uIElmIHRoaXMgaGFwcGVucyB0byB5b3UsIGFkZCB0aGlzIHRvIHlvdXIgQ0ZMQUdTOgorCistRE5PQ09URk1DCisKKyAgIG9yLCBlcXVpdmFsZW50bHksIGluIHlvdXIgS0ZMQUdTIG9uIHRoZSBtYWtlIGNvbW1hbmQgbGluZS4gSXQgc3RhbmRzCisgICBmb3IgTk8gQ2xvc2UoT3BlbigpKSBUbyBGb3JjZSBNb2RlIENoYW5nZS4KKworICAgQy1LZXJtaXQgcmVuYW1lcyBmaWxlcyB3aGVuIHlvdSBnaXZlIGEgUkVOQU1FIGNvbW1hbmQgYW5kIGFsc28KKyAgIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBTRVQgRklMRSBDT0xMSVNJT04gb3B0aW9uIHdoZW4gcmVjZWl2aW5nCisgICBmaWxlcy4gVGhlIG5vcm1hbCBVbml4IHdheSB0byByZW5hbWUgYSBmaWxlIGlzIHZpYSB0d28gc3lzdGVtIGNhbGxzOgorICAgbGluaygpIGFuZCB1bmxpbmsoKS4gQnV0IHRoaXMgbGVhdmVzIG9wZW4gYSB3aW5kb3cgb2YgdnVsbmVyYWJpbGl0eS4KKyAgIFNvbWUgVW5peCBzeXN0ZW1zIGFsc28gb2ZmZXIgYW4gYXRvbWljIHJlbmFtZShvbGRuYW1lLG5ld25hbWUpCisgICBmdW5jdGlvbi4gSWYgeW91ciB2ZXJzaW9uIG9mIFVuaXggaGFzIHRoaXMgZnVuY3Rpb24sIGFkZCB0aGUgZm9sbG93aW5nCisgICB0byB5b3VyIENGTEFHUzoKKworLURSRU5BTUUKKworICAgQy1LZXJtaXQgcHJlZGVmaW5lcyB0aGUgUkVOQU1FIGZvciBzZXZlcmFsIFVuaXggdmVyc2lvbnMgaW4KKyAgIFszMDRdY2tjZGViLmggKFNWUjQsIFNVTk9TNDEsIEJTRDQ0LCBBSVhSUywgZXRjKS4gWW91IGNhbiB0ZWxsIGlmCisgICByZW5hbWUoKSBpcyBiZWluZyB1c2VkIGlmIHRoZSBTSE9XIEZFQVRVUkVTIGNvbW1hbmQgaW5jbHVkZXMgUkVOQU1FIGluCisgICB0aGUgY29tcGlsZXIgb3B0aW9ucyBsaXN0LiBJZiB0aGUgcHJlZGVmaW5lZCBSRU5BTUUgc3ltYm9sIGNhdXNlcworICAgdHJvdWJsZSwgdGhlbiBhZGQgTk9SRU5BTUUgdG8geW91ciBDRkxBR1MuIFRyb3VibGUgaW5jbHVkZXM6CisKKyAgICBhLiBMaW5rZXIgY29tcGxhaW5zIHRoYXQgX3JlbmFtZSBpcyBhbiB1bnJlc29sdmVkIHN5bWJvbC4KKyAgICBiLiBMaW5raW5nIHdvcmtzLCBidXQgS2VybWl0J3MgUkVOQU1FIGNvbW1hbmQgZG9lc24ndCB3b3JrICh3aGljaAorICAgICAgIGhhcHBlbnMgYmVjYXVzZSBvbGRlciB2ZXJzaW9ucyBvZiByZW5hbWUoKSBtaWdodCBoYXZlIHRoZWlyCisgICAgICAgYXJndW1lbnRzIHJldmVyc2VkKS4KKworICAgSWYgcmVuYW1lKCkgaXMgbm90IHVzZWQsIHRoZW4gS2VybWl0IHVzZXMgbGluaygpL3VubGluaygpLCB3aGljaCBpcworICAgZXF1aXZhbGVudCBleGNlcHQgaXQgaXMgbm90IGF0b21pYzogdGhlcmUgaXMgYSB0aW55IGludGVydmFsIGluIHdoaWNoCisgICBzb21lIG90aGVyIHByb2Nlc3MgbWlnaHQgImRvIHNvbWV0aGluZyIgdG8gb25lIG9mIHRoZSBmaWxlcyBvciBsaW5rcy4KKworICAgU29tZSBVbml4IHN5c3RlbXMgKE9saXZldHRpIFgvT1MsIEFtZGFobCBVVFMvViwgSUNMIFNWUjMsIGV0YykgZGVmaW5lCisgICB0aGUgU19JU1JFRyBhbmQgU19JU0RJUiBtYWNyb3MgaW5jb3JyZWN0bHkuIFRoaXMgaXMgY29tcGVuc2F0ZWQgZm9yCisgICBhdXRvbWF0aWNhbGx5IGluIFszMDVdY2t1ZmlvLmMuIE90aGVyIHN5c3RlbXMgbWlnaHQgaGF2ZSB0aGlzIHNhbWUKKyAgIHByb2JsZW0uIElmIHlvdSBnZXQgYSBjb21waWxlLXRpbWUgZXJyb3IgbWVzc2FnZSByZWdhcmRpbmcgU19JU1JFRworICAgYW5kL29yIFNfSVNESVIsIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgQ0ZMQUdTOgorCistRElTRElSQlVHCisKKyAgIEZpbmFsbHksIGhlcmUncyBhIHN5bWJvbCB5b3Ugc2hvdWxkIE5FVkVSIGRlZmluZToKKworLURDT01NRU5UCisKKyAgIEl0J3MgdXNlZCBmb3IgY29tbWVudGluZyBvdXQgYmxvY2tzIG9mIGNvZGUuIElmIGZvciBzb21lIHJlYXNvbiB5b3UKKyAgIGZpbmQgdGhhdCB5b3VyIGNvbXBpbGVyIGhhcyBDT01NRU5UIGRlZmluZWQsIHRoZW4gYWRkIC1VQ09NTUVOVCB0bworICAgQ0ZMQUdTIG9yIEtGTEFHUyEgU2ltaWxhcmx5LCBzb21lIGhlYWRlciBmaWxlcyBoYXZlIGJlZW4ga25vd24gdG8KKyAgIGRlZmluZSBDT01NRU5ULCBpbiB3aGljaCBjYXNlIHlvdSBtdXN0IGFkZCAiI3VuZGVmIENPTU1FTlQiIHRvIGVhY2gKKyAgIEMtS2VybWl0IHNvdXJjZSBtb2R1bGUsIGFmdGVyIGFsbCB0aGUgI2luY2x1ZGVzLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDkuOS4gVGVybWluYWwgSW50ZXJydXB0aW9uCisKKyAgIFsgWzMwNl1Ub3AgXSBbIFszMDddQ29udGVudHMgXSBbIFszMDhdU2VjdGlvbiBDb250ZW50cyBdIFsgWzMwOV1OZXh0IF0KKyAgIFsgWzMxMF1QcmV2aW91cyBdCisKKyAgIFdoZW4gQy1LZXJtaXQgZW50ZXJzIGludGVyYWN0aXZlIGNvbW1hbmQgbW9kZSwgaXQgc2V0cyBhIENvbnRyb2wtQworICAgKHRlcm1pbmFsIGtleWJvYXJkIGludGVycnVwdCA9IFNJR0lOVCkgdHJhcCB0byBhbGxvdyBpdCB0byByZXR1cm4gdG8KKyAgIHRoZSBjb21tYW5kIHByb21wdCB3aGVuZXZlciB0aGUgdXNlciB0eXBlcyBDb250cm9sLUMgKG9yIHdoYXRldmVyIGlzCisgICBhc3NpZ25lZCB0byBiZSB0aGUgaW50ZXJydXB0IGNoYXJhY3RlcikuIFRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcKKyAgIHNldGptcCgpIGFuZCBsb25nam1wKCkuIE9uIHNvbWUgc3lzdGVtcywgZGVwZW5kaW5nIG9uIHRoZSBtYWNoaW5lCisgICBhcmNoaXRlY3R1cmUgYW5kIEMgY29tcGlsZXIgYW5kIHdobyBrbm93cyB3aGF0IGVsc2UsIHlvdSBtaWdodCBnZXQKKyAgICJNZW1vcnkgZmF1bHQgKGNvcmVkdW1wKSIgb3IgImxvbmdqbXAgYm90Y2giIGluc3RlYWQgb2YgdGhlIGRlc2lyZWQKKyAgIGVmZmVjdCAodGhpcyBzaG91bGQgbm90IGhhcHBlbiBpbiA1QSgxOTApIGFuZCBsYXRlcikuIEluIHRoYXQgY2FzZSwKKyAgIGFkZCAtRE5PQ0NUUkFQIHRvIHlvdXIgQ0ZMQUdTIGFuZCByZWJ1aWxkIHRoZSBwcm9ncmFtLgorCisgICBKb2IgY29udHJvbCAtLSB0aGUgYWJpbGl0eSB0byAic3VzcGVuZCIgQy1LZXJtaXQgb24gYSBVbml4IHN5c3RlbSBieQorICAgdHlwaW5nIHRoZSAic3VzcCIgY2hhcmFjdGVyIChub3JtYWxseSBDdHJsLVopIGFuZCB0aGVuIHJlc3VtZQorICAgZXhlY3V0aW9uIGxhdGVyICh3aXRoIHRoZSAiZmciIGNvbW1hbmQpIC0tIGlzIGEgdHJpY2t5IGJ1c2luZXNzLgorICAgQy1LZXJtaXQgbXVzdCB0cmFwIHN1c3BlbmQgc2lnbmFscyBzbyBpdCBjYW4gcHV0IHRoZSB0ZXJtaW5hbCBiYWNrCisgICBpbnRvIG5vcm1hbCBtb2RlIHdoZW4geW91IHN1c3BlbmQgaXQgKEtlcm1pdCBwdXRzIHRoZSB0ZXJtaW5hbCBpbnRvCisgICB2YXJpb3VzIHN0cmFuZ2UgbW9kZXMgZHVyaW5nIGludGVyYWN0aXZlIGNvbW1hbmQgcGFyc2luZywgQ09OTkVDVCwgYW5kCisgICBmaWxlIHRyYW5zZmVyKS4gU3VwcG9ydGluZyBjb2RlIGlzIGNvbXBpbGVkIGludG8gQy1LZXJtaXQKKyAgIGF1dG9tYXRpY2FsbHkgaWYgPHNpZ25hbC5oPiBpbmNsdWRlcyBhIGRlZmluaXRpb24gZm9yIHRoZSBTSUdUU1RQCisgICBzaWduYWwuIEhPV0VWRVIuLi4gc29tZSBzeXN0ZW1zIGRlZmluZSB0aGlzIHNpZ25hbCB3aXRob3V0IHN1cHBvcnRpbmcKKyAgIGpvYiBjb250cm9sIGNvcnJlY3RseS4gWW91IGNhbiBidWlsZCBLZXJtaXQgdG8gaWdub3JlIFNJR1RTVFAgc2lnbmFscworICAgYnkgaW5jbHVkaW5nIHRoZSAtRE5PSkMgb3B0aW9uIGluIENGTEFHUy4gKFlvdSBjYW4gYWxzbyBkbyB0aGlzIGF0CisgICBydW50aW1lIGJ5IGdpdmluZyB0aGUgY29tbWFuZCBTRVQgU1VTUEVORCBPRkYuKQorCisgICAgIE5PVEU6IEFzIG9mIHZlcnNpb24gNUEoMTkwKSwgQy1LZXJtaXQgbWFrZXMgYW5vdGhlciBzYWZldHkgY2hlY2suCisgICAgIEV2ZW4gaWYgam9iIGNvbnRyb2wgaXMgYXZhaWxhYmxlIGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtIChhY2NvcmRpbmcKKyAgICAgdG8gdGhlIG51bWVyb3VzIGNoZWNrcyBtYWRlIGluIGNvbmdtKCkpLCBpdCB3aWxsIHN0aWxsIGRpc2FibGUgdGhlCisgICAgIGNhdGNoaW5nIG9mIFNJR1RTVFAgc2lnbmFscyBpZiBTSUdUU1RQIHdhcyBzZXQgdG8gU0lHX0lHTiBhdCB0aGUKKyAgICAgdGltZSBDLUtlcm1pdCB3YXMgc3RhcnRlZC4KKworICAgU3lzdGVtIFYgUjMgYW5kIGVhcmxpZXIgc3lzdGVtcyBub3JtYWxseSBkbyBub3Qgc3VwcG9ydCBqb2IgY29udHJvbC4KKyAgIElmIHlvdSBoYXZlIGFuIFNWUjMgc3lzdGVtIHRoYXQgZG9lcywgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9wdGlvbiBpbgorICAgeW91ciBDRkxBR1M6CisKKy1EU1ZSM0pDCisKKyAgIE9uIHN5c3RlbXMgdGhhdCBjb3JyZWN0bHkgaW1wbGVtZW50IFBPU0lYIHNpZ25hbCBoYW5kbGluZywgc2lnbmFscyBjYW4KKyAgIGJlIGhhbmRsZWQgbW9yZSByZWxpYWJseSB0aGFuIGluIEJlbGwsIEJlcmtlbGV5LCBvciBBVCZUIFVuaXhlcy4gT24KKyAgIHN5c3RlbXMgKHN1Y2ggYXMgUU5YKSB0aGF0IGFyZSAic3RyaWN0bHkgUE9TSVgiLCBQT1NJWCBzaWduYWwgaGFuZGxpbmcKKyAgICptdXN0KiBiZSB1c2VkLCBvdGhlcndpc2Ugbm8gc2lnbmFsIHdpbGwgd29yayBtb3JlIHRoYW4gb25jZS4gSWYgeW91CisgICBoYXZlIFBPU0lYLWJhc2VkIHN5c3RlbSBhbmQgeW91IGZpbmQgdGhhdCB5b3VyIHZlcnNpb24gb2YgS2VybWl0CisgICByZXNwb25kcyB0byBDdHJsLUMgKFNJR0lOVCkgb3IgQ3RybC1aIChTSUdUU1RQKSBvbmx5IG9uY2UsIHRoZW4geW91CisgICBzaG91bGQgYWRkIHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHlvdXIgQ0ZMQUdTOgorCistRENLX1BPU0lYX1NJRworCisgICBCdXQgYmUgY2FyZWZ1bDsgc29tZSBQT1NJWCBpbXBsZW1lbnRhdGlvbnMsIG5vdGFibHkgNC40QlNELCBpbmNsdWRlCisgICBQT1NJWCBzaWduYWwgaGFuZGxpbmcgc3ltYm9scyBhbmQgZnVuY3Rpb25zIGFzICJzdHVicyIgb25seSwgd2hpY2ggZG8KKyAgIG5vdGhpbmcuIExvb2sgaW4gPHNpZ25hbC5oPiBmb3Igc2lnc2V0am1wIGFuZCBzaWdsb25nam1wIGFuZCByZWFkIHRoZQorICAgY29tbWVudHMuCisgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKzEwLiBESUFMSU5HIE9VVCBBTkQgQ09PUkRJTkFUSU5HIFdJVEggVVVDUAorCisgICBbIFszMTFdVG9wIF0gWyBbMzEyXUNvbnRlbnRzIF0gWyBbMzEzXU5leHQgXSBbIFszMTRdUHJldmlvdXMgXQorCisgICAgIE5PVEU6IFJlZCBIYXQgTGludXggNy4yIGFuZCBsYXRlciBpbmNsdWRlIGEgbmV3IEFQSSB0aGF0IGFsbG93cworICAgICBzZXJpYWwtcG9ydCBhcmJpdHJhdGlvbiBieSBub24tc2V0dWlkL2dpZCBwcm9ncmFtcy4gVGhpcyBBUEkgaGFzCisgICAgIG5vdCB5ZXQgYmVlbiBhZGRlZCB0byBDLUtlcm1pdC4gSWYgQy1LZXJtaXQgaXMgdG8gYmUgdXNlZCBmb3IKKyAgICAgZGlhbGluZyBvdXQgb24gUmVkIEhhdCA3LjIgb3IgbGF0ZXIsIGl0IG11c3Qgc3RpbGwgYmUgaW5zdGFsbGVkIGFzCisgICAgIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24gYW5kIHRoZSBuZXh0LiAKKworICAgVGhlIHNob3J0IHZlcnNpb246CisKKyAgICAgSW4gb3JkZXIgZm9yIEMtS2VybWl0IHRvIGJlIGFibGUgdG8gZGlhbCBvdXQgZnJvbSB5b3VyIFVuaXgKKyAgICAgY29tcHV0ZXIsIHlvdSBuZWVkIHRvIGdpdmUgaXQgdGhlIHNhbWUgb3duZXIsIGdyb3VwLCBhbmQKKyAgICAgcGVybWlzc2lvbnMgYXMgeW91ciBvdGhlciBkaWFsb3V0IHByb2dyYW1zLCBzdWNoIGFzIGN1LCB0aXAsCisgICAgIG1pbmljb20sIHV1Y3AsIHNleW9uLCBldGMuCisKKyAgIFRoZSBsb25nIHZlcnNpb246CisKKyAgIE1ha2Ugc3VyZSB5b3VyIGRpYWxvdXQgbGluZSBpcyBjb3JyZWN0bHkgY29uZmlndXJlZCBmb3IgZGlhbGluZyBvdXQKKyAgIChhcyBvcHBvc2VkIHRvIGxvZ2luKS4gVGhlIG1ldGhvZCBmb3IgZG9pbmcgdGhpcyBpcyBkaWZmZXJlbnQgZm9yIGVhY2gKKyAgIGtpbmQgb2YgVW5peC4gQ29uc3VsdCB5b3VyIHN5c3RlbSBkb2N1bWVudGF0aW9uIGZvciBjb25maWd1cmluZyBsaW5lcworICAgZm9yIGRpYWxpbmcgb3V0IChmb3IgZXhhbXBsZSwgU3VuIFNQQVJDc3RhdGlvbiBJUEMgdXNlcnMgc2hvdWxkIHJlYWQKKyAgIHRoZSBzZWN0aW9uICJTZXR0aW5nIHVwIE1vZGVtIFNvZnR3YXJlIiBpbiB0aGUgRGVza3RvcCBTUEFSQyBTdW4KKyAgIFN5c3RlbSBhbmQgTmV0d29yayBNYW5hZ2VyJ3MgR3VpZGUsIG9yIHRoZSBUZXJtaW5hbHMgYW5kIE1vZGVtcworICAgc2VjdGlvbiBvZiB0aGUgSFAgbWFudWFsLCAiQ29uZmlndXJpbmcgSFAtVVggZm9yIFBlcmlwaGVyYWxzIiAoZS5nLgorICAgL3Vzci9zYmluL3NhbSA9PiBQZXJpcGhlcmFsIERldmljZXMgPT4gVGVybWluYWxzIGFuZCBNb2RlbXMgPT4gQWRkCisgICBNb2RlbSkuCisKKyAgIFVubGlrZSBtb3N0IG90aGVyIG11bHRpdXNlciwgbXVsdGl0YXNraW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBVbml4CisgICBhbGxvd3MgbXVsdGlwbGUgdXNlcnMgdG8gYWNjZXNzIHRoZSBzYW1lIHNlcmlhbCBkZXZpY2UgYXQgdGhlIHNhbWUKKyAgIHRpbWUsIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIG5vIGVhcnRobHkgcmVhc29uIHdoeSB0d28gdXNlcnMgc2hvdWxkIGRvCisgICB0aGlzLiBXaGVuIHRoZXkgZG8sIHVzZXIgQSB3aWxsIHJlYWQgc29tZSBvZiB0aGUgaW5jb21pbmcgY2hhcmFjdGVycywKKyAgIGFuZCB1c2VyIEIgd2lsbCByZWFkIHRoZSBvdGhlcnMuIEluIGFsbCBsaWtlbGlob29kLCBuZWl0aGVyIHVzZXIgd2lsbAorICAgc2VlIHRoZW0gYWxsLiBGdXJ0aGVybW9yZSwgVXNlciBCIGNhbiBoYW5nIHVwIFVzZXIgQSdzIGNhbGwsIGV0Yy4KKworICAgUmF0aGVyIHRoYW4gY2hhbmdlIFVuaXggdG8gZW5mb3JjZSBleGNsdXNpdmUgYWNjZXNzIHRvIHNlcmlhbCBkZXZpY2VzCisgICBzdWNoIGFzIHR0eXMsIFVuaXggZGV2ZWxvcGVycyBjaG9zZSBpbnN0ZWFkIHRvIHVzZSBhICJsb2NrIGZpbGUiLiBBbnkKKyAgIHByb2Nlc3MgdGhhdCB3YW50cyB0byBvcGVuIGEgdHR5IGRldmljZSBzaG91bGQgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIGEKKyAgIGZpbGUgb2YgYSBjZXJ0YWluIG5hbWUgZXhpc3RzLCBhbmQgaWYgc28sIG5vdCB0byBvcGVuIHRoZSBkZXZpY2UuIElmCisgICB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlIHByb2Nlc3MgY3JlYXRlcyB0aGUgZmlsZSBhbmQgdGhlbiBvcGVucworICAgdGhlIGRldmljZS4gV2hlbiB0aGUgcHJvY2VzcyBjbG9zZXMgdGhlIGRldmljZSwgaXQgZGVzdHJveXMgdGhlCisgICBsb2NrZmlsZS4gVGhpcyBwcm9jZWR1cmUgd2FzIG9yaWdpbmF0ZWQgZm9yIHVzZSB3aXRoIFVuaXgncyBVVUNQLCBDVSwKKyAgIGFuZCBUSVAgcHJvZ3JhbXMsIGFuZCBzbyB0aGVzZSBsb2NrZmlsZXMgYXJlIGNvbW1vbmx5IGNhbGxlZCAiVVVDUAorICAgbG9ja2ZpbGVzIiAoVVVDUCA9IFVuaXgtdG8tVW5peCBDb3B5IFByb2dyYW0pLgorCisgICBBcyB5b3UgY2FuIGltYWdpbmUsIHRoaXMgbWV0aG9kIGlzIHJpZGRsZWQgd2l0aCBwaXRmYWxsczoKKworICAgICAqIElmIGEgcHJvY2VzcyBkb2VzIG5vdCBvYnNlcnZlIHRoZSBwcmV2YWlsaW5nIGxvY2tmaWxlIGNvbnZlbnRpb24sCisgICAgICAgdGhlbiBpdCBjYW4gaW50ZXJmZXJlIHdpdGggb3RoZXIgInBvbGl0ZSIgcHJvY2Vzc2VzLiBBbmQgaW4gZmFjdCwKKyAgICAgICB2ZXJ5IGZldyBVbml4IGFwcGxpY2F0aW9ucyBvciBjb21tYW5kcyBoYW5kbGUgbG9ja2ZpbGVzIGF0IGFsbDsgYW4KKyAgICAgICBvcmlnaW5hbCBkZXNpZ24gZ29hbCBvZiBVbml4IHdhcyB0aGF0ICJldmVyeXRoaW5nIGlzIGEgZmlsZSIsIGFuZAorICAgICAgIGNvdW50bGVzcyB1dGlsaXRpZXMgb3BlcmF0ZSBvbiBmaWxlcyBkaXJlY3RseSAoYnkgb3BlbmluZyB0aGVtKSBvcgorICAgICAgIGluZGlyZWN0bHkgdGhyb3VnaCByZWRpcmVjdGlvbiBvZiBzdGFuZGFyZCBpL28sIHdpdGhvdXQgY3JlYXRpbmcKKyAgICAgICBvciBsb29raW5nIGZvciBsb2NrZmlsZXMuCisgICAgICogSWYgYSBwcm9jZXNzIGNyYXNoZXMgd2hpbGUgaXQgaGFzIHRoZSBkZXZpY2Ugb3BlbiwgdGhlIGxvY2tmaWxlIGlzCisgICAgICAgbGVmdCBiZWhpbmQsIHByZXZlbnRpbmcgZnVydGhlciBwcm9jZXNzZXMgZnJvbSB1c2luZyB0aGUgZGV2aWNlLgorICAgICAqIFZhcmlvdXMgdmVyc2lvbnMgb2YgVW5peCB1c2UgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgbG9ja2ZpbGVzLAorICAgICAgIHB1dCB0aGVtIGluIGRpZmZlcmVudCBkaXJlY3Rvcmllcywgd2l0aCBkaWZmZXJlbnQgb3duZXJzIGFuZAorICAgICAgIGdyb3VwcyBhbmQgcGVybWlzc2lvbnMsIGFuZCBzcGVjaWZ5IHRoZWlyIGNvbnRlbnRzIGRpZmZlcmVudGx5LgorICAgICAqIE9uIGEgZ2l2ZW4gcGxhdGZvcm0sIHRoZSBsb2NrZmlsZSBjb252ZW50aW9ucyBtYXkgY2hhbmdlIGZyb20gb25lCisgICAgICAgVW5peCByZWxlYXNlIHRvIHRoZSBuZXh0IChmb3IgZXhhbXBsZSwgU3VuT1MgNC4wIHRvIDQuMSkgb3IsIGluCisgICAgICAgdGhlIGNhc2Ugb2YgTGludXgsIGFjcm9zcyBkaWZmZXJlbnQgZGlzdHJpYnV0aW9ucy4KKyAgICAgKiBUaGUgc2FtZSB0dHkgZGV2aWNlIG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lLCBhbmQgbW9zdAorICAgICAgIGxvY2tmaWxlIGNvbnZlbnRpb25zIGRvbid0IGFsbG93IGZvciB0aGlzLiBTaW1pbGFybHkgZm9yIHN5bWJvbGljCisgICAgICAgbGlua3MuCisKKyAgIEluIGFuIGF0dGVtcHQgdG8gYWRkcmVzcyB0aGUgcHJvYmxlbSBvZiAic3RhbGUiIGxvY2tmaWxlcywgbW9zdCBVVUNQCisgICBpbXBsZW1lbnRhdGlvbnMgcHV0IHRoZSBQSUQgKFByb2Nlc3MgSUQpIG9mIHRoZSBjcmVhdGluZyBwcm9jZXNzIGluCisgICB0aGUgbG9ja2ZpbGUuIFRodXMsIGFub3RoZXIgcHJvY2VzcyB0aGF0IHdhbnRzIHRvIG9wZW4gdGhlCisgICBjb3JyZXNwb25kaW5nIGRldmljZSBjYW4gY2hlY2sgbm90IG9ubHkgZm9yIHRoZSBsb2NrZmlsZSBpdHNlbGYsIGJ1dAorICAgYWxzbyBjYW4gY2hlY2sgdGhlIFBJRCBmb3IgdmFsaWRpdHkuIEJ1dCB0aGlzIGRvZXNuJ3Qgd29yayB3ZWxsCisgICBlaXRoZXI6CisKKyAgICAgKiBQSURzIGFyZSBzdG9yZWQgaW4gZGl2ZXJzZSBmb3JtYXRzIHRoYXQgY2hhbmdlIHdpdGggZXZlcnkgbmV3CisgICAgICAgcmVsZWFzZSAoc2hvcnQsIGludGVnZXIsIGxvbmcsIG9yIHN0cmluZyBpbiBhbnkgb2YgdmFyaW91cworICAgICAgIGZvcm1hdHMpLiBJZiB0aGUgcmVhZGluZyBwcm9ncmFtIGRvZXMgbm90IGZvbGxvdyB0aGUgc2FtZQorICAgICAgIGNvbnZlbnRpb24gYXMgdGhlIHdyaXRpbmcgcHJvZ3JhbSwgaXQgY2FuIGRpYWdub3NlIGEgdmFsaWQgUElEIHRvCisgICAgICAgYmUgaW52YWxpZCwgYW5kIHRoZXJlZm9yZSBub3QgaG9ub3IgdGhlIGxvY2suCisgICAgICogUElEcyByZWN5Y2xlLiBJZiB0aGUgbG9ja2ZpbGUgd2FzIGNyZWF0ZWQgYnkgUElEIDEyMzQsIHdoaWNoIGxhdGVyCisgICAgICAgY3Jhc2hlZCB3aXRob3V0IHJlbW92aW5nIHRoZSBsb2NrZmlsZSwgYW5kIHRoZW4gYSBuZXcgcHJvY2VzcyAxMjM0CisgICAgICAgZXhpc3RzIGEgdGhlIHRpbWUgdGhlIGxvY2tmaWxlIGlzIGNoZWNrZWQsIHRoZSBsb2NrZmlsZSB3aWxsIGJlCisgICAgICAgaW1wcm9wZXJseSB0YWtlbiBhcyB2YWxpZCwgYW5kIGFjY2VzcyB0byB0aGUgZGV2aWNlIGRlbmllZAorICAgICAgIHVubmVjZXNzYXJpbHkuCisKKyAgIFNldmVyYWwgdGVjaG5pcXVlcyBhZGRyZXNzIHRoZSBwcm9ibGVtIG9mIG11bHRpcGxlIG5hbWVzIGZvciB0aGUgc2FtZQorICAgZGV2aWNlOgorCisgICAgICogTXVsdGlwbGUgbG9ja2ZpbGVzLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHVzZXIgb3BlbnMgYSBkZXZpY2UKKyAgICAgICB0aHJvdWdoIGEgc3ltbGluaywgYSBsb2NrZmlsZSBpcyBjcmVhdGVkIGZvciBib3RoIHRoZSBzeW1saW5rIG5hbWUKKyAgICAgICBhbmQgdGhlIHRydWUgbmFtZSAob2J0YWluZWQgZnJvbSByZWFkbGluaygpKS4gSG93ZXZlciwgd2hlbgorICAgICAgIG11bHRpcGxlIGRyaXZlcnMgYXJlIGluc3RhbGxlZCBmb3IgdGhlIHNhbWUgZGV2aWNlIChlLmcuIC9kZXYvY3VhLAorICAgICAgIC9kZXYvY3VmYSwgZXRjKSwgdGhpcyBhcHByb2FjaCB3b24ndCB3b3JrIHVubGVzcyBhbGwgYXBwbGljYXRpb25zCisgICAgICAgKmtub3cqIGFsbCB0aGUgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgc2FtZSBkZXZpY2UgYW5kIG1ha2UKKyAgICAgICBsb2NrZmlsZXMgZm9yIGFsbCBvZiB0aGVtLCB3aGljaCBpcyBvYnZpb3VzbHkgbm90IHByYWN0aWNhbC4KKyAgICAgKiBMb2NrZmlsZXMgd2hvc2UgbmFtZXMgYXJlIG5vdCBiYXNlZCBvbiB0aGUgZGV2aWNlIG5hbWUuIFRoZXNlCisgICAgICAgbG9ja2ZpbGVzIGdlbmVyYWxseSBoYXZlIG5hbWVzIGxpa2UgTEsuaW5vZGUvbWFqb3IvbWlub3IsIHdoZXJlCisgICAgICAgaW5vZGUsIG1ham9yLCBhbmQgbWlub3IgYXJlIG51bWJlcnMsIHdoaWNoIHdpbGwgYWx3YXlzIGJlIHRoZSBzYW1lCisgICAgICAgZm9yIGFueSBwaHlzaWNhbCBkZXZpY2UsIG5vIG1hdHRlciB3aGF0IGl0cyBuYW1lLiBUaGlzIGZvcm0gb2YKKyAgICAgICBsb2NrZmlsZSBpcyB1c2VkIGluIFN5c3RlbSBWIFI0IGFuZCBpdHMgZGVyaXZhdGl2ZXMsIHN1Y2ggYXMKKyAgICAgICBTb2xhcmlzLCBVbml4V2FyZSwgZXRjLiBJZiBsb2NrZmlsZXMgbXVzdCBiZSB1c2VkIChhcyBvcHBvc2VkIHRvLAorICAgICAgIHNheSwga2VybmVsLWJhc2VkIGxvY2tzKSwgdGhpcyB3b3VsZCBzZWVtIHRvIGJlIHRoZSBtb3N0IGVmZmVjdGl2ZQorICAgICAgIGZvcm0uCisKKyAgIE1vc3QgdmVyc2lvbnMgb2YgVW5peCB3ZXJlIG5vdCBkZXNpZ25lZCB0byBhY2NvbW1vZGF0ZSB0aGlyZC1wYXJ0eQorICAgY29tbXVuaWNhdGlvbnMgc29mdHdhcmU7IHRodXMgdmVuZG9ycyBvZiB0aGVzZSBVbml4IHByb2R1Y3RzIGZlZWwgbm8KKyAgIGNvbXB1bmN0aW9uIGFib3V0IGNoYW5naW5nIGxvY2tmaWxlIGNvbnZlbnRpb25zIGZyb20gcmVsZWFzZSB0bworICAgcmVsZWFzZSwgc2luY2UgdGhleSBhbHNvIGNoYW5nZSB0aGVpciB2ZXJzaW9ucyBvZiB0aGUgY3UsIHV1Y3AsIHRpcCwKKyAgIGV0YywgcHJvZ3JhbXMgYXQgdGhlIHNhbWUgdGltZSB0byBtYXRjaC4gQW5kIHNpbmNlIHRoZSBzb3VyY2UgY29kZSB0bworICAgdGhlc2UgcHJvZ3JhbXMgbWlnaHQgbm90IGJlIHB1Ymxpc2hlZCwgaXQgaXMgZGlmZmljdWx0IGZvciBtYWtlcnMgb2YKKyAgIHRoaXJkLXBhcnR5IHByb2R1Y3RzIGxpa2UgQy1LZXJtaXQgdG8gZmluZCBvdXQgd2hhdCB0aGUgbmV3CisgICBjb252ZW50aW9ucyBhcmUuIEl0IGFsc28gZm9yY2VzIHJlbGVhc2Ugb2YgbmV3IHZlcnNpb25zIG9mIEMtS2VybWl0CisgICB3aGVuZXZlciB0aGUgT1MgdmVuZG9yIG1ha2VzIGEgY2hhbmdlIGxpa2UgdGhpcy4KKworICAgU29tZSBVbml4IHZlbmRvcnMgaGF2ZSB0YWtlbiBhIHNtYWxsIHN0ZXAgdG8gc2ltcGxpZnkgY29tbXVuaWNhdGlvbnMKKyAgIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IGZvciB0aGVpciBwcm9kdWN0czogdGhlIGluY2x1c2lvbiBvZiBsb2NrZmlsZQorICAgcm91dGluZXMgaW4gdGhlIHN0YW5kYXJkIHN5c3RlbSBDIHJ1bnRpbWUgbGlicmFyaWVzIHRvIHNoaWVsZCB0aGUKKyAgIGFwcGxpY2F0aW9uIGZyb20gdGhlIGRldGFpbHMgb2YgbG9ja2ZpbGUgbWFuYWdlbWVudCAoSUJNIEFJWCBpcyBhbgorICAgZXhhbXBsZSkuIFdoZW4gc3VjaCByb3V0aW5lcyBhcmUgdXNlZCwgY29tbXVuaWNhdGlvbnMgYXBwbGljYXRpb25zIGRvCisgICBub3QgbmVlZCBtb2RpZmljYXRpb24gd2hlbiBsb2NrZmlsZSBjb252ZW50aW9ucyBjaGFuZ2UgKGFsdGhvdWdoIHRoZXkKKyAgIHdpbGwgbmVlZCByZWNvbXBpbGluZyBpZiB0aGUgcm91dGluZXMgYXJlIHN0YXRpY2FsbHkgbGlua2VkIGludG8gdGhlCisgICBhcHBsaWNhdGlvbikuIEluIHRoZSBBSVggZXhhbXBsZSwgdGhlIHNpbXBsZSBmdW5jdGlvbiBjYWxscyB0dHlsb2NrKCksCisgICB0dHl1bmxvY2soKSwgYW5kIHR0eWxvY2tlZCgpIHJlcGxhY2UgaHVuZHJlZHMgb2YgbGluZXMgb2YgdWdseSBjb2RlIGluCisgICBDLUtlcm1pdCB0aGF0IGF0dGVtcHRzIHRvIGtlZXAgcGFjZSB3aXRoIGV2ZXJ5IHJlbGVhc2Ugb2YgZXZlcnkgVW5peAorICAgcHJvZHVjdCBvdmVyIHRoZSBsYXN0IDIwIHllYXJzLiBJbmNsdXNpb24gb2YgdHR5bG9jaygpIGNvZGUgb2NjdXJzCisgICB3aGVuOgorCistRFVTRVRUWUxPQ0sKKworICAgaXMgaW5jbHVkZWQgaW4gdGhlIENGTEFHUy4KKworICAgSWYgc3VjaCByb3V0aW5lcyBhcmUgYXZhaWxhYmxlLCB0aGV5IHNob3VsZCBiZSB1c2VkLiBUaGUgcmVzdCBvZiB0aGlzCisgICBzZWN0aW9uIGFwcGxpZXMgd2hlbiB0aGV5IGFyZSBub3QuCisKKyAgIFRvIGZpdCBpbiB3aXRoIFVVQ1AgYW5kIG90aGVyIFVuaXgtYmFzZWQgY29tbXVuaWNhdGlvbiBzb2Z0d2FyZSwKKyAgIEMtS2VybWl0IG11c3QgaGF2ZSB0aGUgc2FtZSBpZGVhIGFzIHlvdXIgc3lzdGVtJ3MgdXVjcCwgY3UsIGFuZCB0aXAKKyAgIHByb2dyYW1zIGFib3V0IHdoYXQgdGhlIFVVQ1AgbG9jayBkaXJlY3RvcnkgaXMgY2FsbGVkLCB3aGF0IHRoZQorICAgbG9ja2ZpbGUgaXRzZWxmIGlzIGNhbGxlZCwgYW5kIHdoYXQgaXRzIGNvbnRlbnRzIHNob3VsZCBiZS4gSW4gbW9zdAorICAgY2FzZXMsIEMtS2VybWl0IHByZXByb2Nlc3NvciBmbGFncyBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlCisgICBjb25maWd1cmF0aW9uIGF0IGNvbXBpbGUgdGltZSBpZiB0aGUgYXBwcm9wcmlhdGUgbWFrZWZpbGUgdGFyZ2V0IHdhcworICAgdXNlZCAoc2VlIFszMTVdY2t1dGlvLmMpLiBUaGUgZm9sbG93aW5nIENGTEFHUyBvcHRpb25zIGNhbiBiZSB1c2VkIHRvCisgICBvdmVycmlkZSB0aGUgYnVpbHQtaW4gY29uZmlndXJhdGlvbjoKKworICAgLURMQ0tESVIKKyAgICAgICAgICBUZWxscyBLZXJtaXQgdGhhdCB0aGUgVVVDUCBsb2NrIGRpcmVjdG9yeSBpcworICAgICAgICAgIC91c3Ivc3Bvb2wvdXVjcC9MQ0suCisKKyAgIC1EQUNVQ05UUkwKKyAgICAgICAgICBUZWxscyBLZXJtaXQgdG8gdXNlIHRoZSBCU0QgNC4zIGFjdWNudHJsKCkgcHJvZ3JhbSB0byB0dXJuIG9mZgorICAgICAgICAgIGdldHR5IChsb2dpbikgb24gdGhlIGxpbmUgYmVmb3JlIHVzaW5nIGl0LCBhbmQgcmVzdG9yZSBnZXR0eQorICAgICAgICAgIHdoZW4gZG9uZS4KKworICAgLURIREJVVUNQCisgICAgICAgICAgSW5jbHVkZSB0aGlzIGlmIHlvdXIgc3lzdGVtIHVzZXMgSG9uZXkgRGFuQmVyIFVVQ1AsIGluIHdoaWNoCisgICAgICAgICAgdGhlIGxvY2tmaWxlIGRpcmVjdG9yeSBhbmQgZm9ybWF0IGFyZSByZWxhdGl2ZWx5IHN0YW5kYXJkaXplZC4KKworICAgLURMT0NLX0RJUj1cXFwiL3h4eC95eXlcXFwiCisgICAgICAgICAgR2l2ZXMgdGhlIGxvY2sgZGlyZWN0b3J5IG5hbWUgZXhwbGljaXRseS4gVGhlIHRyaXBsZSBxdW90aW5nIGlzCisgICAgICAgICAgbmVjZXNzYXJ5LiBGb3IgZXhhbXBsZToKKworQ0ZMQUdTPSAtREJTRDQgLURMT0NLX0RJUj1cXFwiL3Vzci9sb2NhbC9sb2Nrc1xcXCIgLUROT0RFQlVHCisKKyAgICAgICAgICAoTk9URTogVGhlIHRyaXBsZSBxdW90aW5nIGFzc3VtZXMgdGhpcyBpcyBhICJ0b3AtbGV2ZWwiIG1ha2UKKyAgICAgICAgICBlbnRyeSwgYW5kIG5vdCBhIG1ha2UgZW50cnkgdGhhdCBjYWxscyBhbm90aGVyIG9uZS4pCisKKyAgIC1ETEZERVZOTyBUaGUgbG9ja2ZpbGUgbmFtZSB1c2VzIHRoZSB0dHkgZGV2aWNlIGlub2RlIGFuZCBtYWpvciBhbmQKKyAgICAgICAgICBtaW5vcgorICAgICAgICAgIG51bWJlcnM6IExLLmRldi5tYWoubWluLCBhcyBpbiBTeXMgViBSNCwgZS5nLiBMSy4wMzUuMDQ0LjAwOC4KKworICAgV2hlbiB0aGUgTEsuaW5vZGUubWFqb3IubWlub3IgZm9ybSBpcyB1c2VkLCBhIHNpbmdsZSBsb2NrZmlsZSBpcworICAgZW5vdWdoLiBPdGhlcndpc2UsIGEgc2luZ2xlIGxvY2tmaWxlIHJhcmVseSBzdWZmaWNlcy4gRm9yIGV4YW1wbGUsIGluCisgICBMaW51eCwgaXQgaXMgY29tbW9uIHRvIGhhdmUgYSAvZGV2L21vZGVtIHN5bWJvbGljIGxpbmsgdG8gYW4gYWN0dWFsCisgICBkaWFsb3V0IGRldmljZSwgbGlrZSAvZGV2L2N1YTAgb3IgL2Rldi90dHlTMCwgd2hvc2UgcHVycG9zZSBpcyB0byBoaWRlCisgICB0aGUgZGV0YWlscyBvZiB0aGUgYWN0dWFsIGRyaXZlciBmcm9tIHRoZSB1c2VyLiBTbyBpZiBvbmUgdXNlciBvcGVucworICAgL2Rldi9tb2RlbSwgYSBsb2NrZmlsZSBjYWxsZWQgTENLLi5tb2RlbSBpcyBjcmVhdGVkLCB3aGljaCBkb2VzIG5vdAorICAgcHJldmVudCBhbm90aGVyIHVzZXIgZnJvbSBzaW11bGF0YW5lb3VzbHkgb3BlbmluZyB0aGUgc2FtZSBkZXZpY2UgYnkKKyAgIGl0cyByZWFsIG5hbWUuCisKKyAgIE9uIFNDTyBVbml4IHBsYXRmb3Jtcywgd2UgaGF2ZSBhIHNsaWdodGx5IGRpZmZlcmVudCBwcm9ibGVtOiB0aGUgc2FtZQorICAgZGV2aWNlIGlzLCBieSBjb252ZW50aW9uLCBrbm93biBieSAibG93ZXJjYXNlIiBhbmQgInVwcGVyY2FzZSIgbmFtZXMsCisgICBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBoYXMgbW9kZW0gY29udHJvbC4gU28gYnkgY29udmVudGlvbiwKKyAgIGNvbW11bmljYXRpb25zIHByb2dyYW1zIGFyZSBzdXBwb3NlZCB0byBjcmVhdGUgdGhlIGxvY2tmaWxlcyBiYXNlZCBvbgorICAgdGhlIGxvd2VyY2FzZSBuYW1lLiBCdXQgc29tZSBwcm9ncmFtcyBkb24ndCBmb2xsb3cgdGhpcyBjb252ZW50aW9uLiBJbgorICAgSFAtVVgsIHdlIGhhdmUgc2V2ZXJhbCBkaWZmZXJlbnQgbmFtZXMgZm9yIGVhY2ggc2VyaWFsIGRldmljZS4gQW5kIHNvCisgICBvbi4KKworICAgRm9yIHRoaXMgcmVhc29uLCBvbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIExLLmlub2RlLm1ham9yLm1pbm9yIGZvcm0gaXMKKyAgIG5vdCB1c2VkLCBDLUtlcm1pdCBhbHNvIGNyZWF0ZXMgYSBzZWNvbmRhcnkgbG9ja2ZpbGUgKHdoaWNoIGlzIHNpbXBseQorICAgYSBsaW5rIHRvIHRoZSBmaXJzdCkgaWY6CisKKyAgICBhLiBUaGUgZ2l2ZW4gZGV2aWNlIG5hbWUgaXMgYSBzeW1ib2xpYyBsaW5rLiBUaGUgc2Vjb25kYXJ5IGxpbmsgaXMKKyAgICAgICBiYXNlZCBvbiB0aGUgZGV2aWNlJ3MgcmVhbCBuYW1lLgorICAgIGIuIE9uIFNDTzogVGhlIGRldmljZSBuYW1lIGlzIG5vdCBhIHN5bWJvbGljIGxpbmssIGJ1dCBpdCBjb250YWlucworICAgICAgIHVwcGVyY2FzZSBsZXR0ZXJzLiBUaGUgcHJpbWFyeSBsaW5rIGlzIGJhc2VkIG9uIHRoZSBsb3dlcmNhc2UKKyAgICAgICBuYW1lOyB0aGUgc2Vjb25kYXJ5IGxpbmsgaXMgYmFzZWQgb24gdGhlIG5hbWUgdGhhdCB3YXMgZ2l2ZW4uCisgICAgYy4gT24gSFAtVVg6IFRoZSBkZXZpY2UgbmFtZSBzdGFydHMgd2l0aCAiY3UiLiBUaGUgcHJpbWFyeSBsaW5rIGlzCisgICAgICAgYmFzZWQgb24gdGhlIG5hbWUgdGhhdCB3YXMgZ2l2ZW47IHRoZSBzZWNvbmRhcnkgbGluayBpcyBiYXNlZCBvbgorICAgICAgIHRoZSBjb3JyZXNwb25kaW5nICJ0dHlkIiBkZXZpY2UsIGUuZy4gIkxDSy4uY3VhMHAwIiBhbmQKKyAgICAgICAiTENLLi50dHlkMHAwIi4KKworICAgTk9URTogc3ltbGlua3MgYXJlIG5vdCBoYW5kbGVkIGluIEhQLVVYLgorCisgICBIb25leSBEYW5CZXIgKEhEQikgVVVDUCwgd2hpY2ggaXMgYmVjb21pbmcgaW5jcmVhc2luZ2x5IHBvcHVsYXIsIGhhcworICAgdHdvIGNoYXJhY3RlcmlzdGljczoKKworICAgIGEuIExvY2tmaWxlcyBhcmUga2VwdCBpbiAvdXNyL3Nwb29sL2xvY2tzLyAodXN1YWxseSkuCisgICAgYi4gQSBsb2NrZmlsZSBjb250YWlucyB0aGUgcHJvY2VzcyBpZCAocGlkKSBpbiBBU0NJSSwgcmF0aGVyIHRoYW4gYXMKKyAgICAgICBhbiBpbnQuCisKKyAgIE5vbi1IREIgc2VsZWN0aW9ucyBhc3N1bWUgdGhlIGxvY2tmaWxlIGNvbnRhaW5zIHRoZSBwaWQgaW4gaW50IGZvcm0KKyAgIChvciwgbW9yZSBwcmVjaXNlbHksIGluIFBJRF9UIGZvcm0sIHdoZXJlIFBJRF9UIGlzIGVpdGhlciBpbnQgb3IKKyAgIHBpZF90LCBkZXBlbmRpbmcgb24geW91ciBzeXN0ZW0ncyBDIGxpYnJhcnkgYW5kIGhlYWRlciBmaWxlcykuIChiKSwgYnkKKyAgIHRoZSB3YXksIGlzIHN1YmplY3QgdG8gaW50ZXJwcmV0YXRpb246IHRoZSBudW1lcmljIEFTQ0lJIHN0cmluZyBtYXkgb3IKKyAgIG1heSBub3QgYmUgdGVybWluYXRlZCBieSBhIG5ld2xpbmUsIGl0IG1heSBvciBtYXkgbm90IGhhdmUgbGVhZGluZworICAgc3BhY2VzIChvciB6ZXJvcyksIGFuZCB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgc3BhY2VzIG9yIHplcm9zIGNhbgorICAgZGlmZmVyLCBhbmQgdGhlIGRpZmZlcmVuY2VzIGNhbiBiZSBzaWduaWZpY2FudC4KKworICAgRXZlbiBpZiB5b3UgYnVpbGQgdGhlIHByb2dyYW0gd2l0aCB0aGUgcmlnaHQgbG9ja2ZpbGUgb3B0aW9uLCB5b3UgY2FuCisgICBzdGlsbCBoYXZlIHByb2JsZW1zIHdoZW4geW91IHRyeSB0byBvcGVuIHRoZSBkZXZpY2UuIEhlcmUgYXJlIHRoZQorICAgZXJyb3IgbWVzc2FnZXMgeW91IGNhbiBnZXQgZnJvbSBTRVQgTElORSwgYW5kIHdoYXQgdGhleSBtZWFuOgorCisgICAgYS4gIlRpbWVkIG91dCwgbm8gY2Fycmllci4iIFRoaXMgb25lIGlzIG5vdCByZWxhdGVkIHRvIGxvY2tmaWxlcy4gSXQKKyAgICAgICBtZWFucyB0aGF0IHlvdSBoYXZlIFNFVCBDQVJSSUVSIE9OIHh4LCB3aGVyZSB4eCBpcyB0aGUgbnVtYmVyIG9mCisgICAgICAgc2Vjb25kcyB0byB3YWl0IGZvciBjYXJyaWVyLCBhbmQgY2FycmllciBkaWQgbm90IGFwcGVhciB3aXRoaW4geHgKKyAgICAgICBzZWNvbmRzLiBTb2x1dGlvbjogU0VUIENBUlJJRVIgQVVUTyBvciBPRkYuCisgICAgYi4gIlNvcnJ5LCBhY2Nlc3MgdG8gbG9jayBkZW5pZWQuIiBLZXJtaXQgaGFzIGJlZW4gY29uZmlndXJlZCB0byB1c2UKKyAgICAgICBsb2NrZmlsZXMsIGJ1dCAoYSl0aGUgbG9ja2ZpbGUgZGlyZWN0b3J5IGlzIHdyaXRlLXByb3RlY3RlZAorICAgICAgIGFnYWluc3QgeW91LCBvciAoYikgaXQgZG9lcyBub3QgZXhpc3QuIFRoZSAiYWNjZXNzIHRvIGxvY2sgZGVuaWVkIgorICAgICAgIG1lc3NhZ2Ugd2lsbCB0ZWxsIHlvdSB0aGUgcmVhc29uLiBJZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LAorICAgICAgIGNoZWNrIHRvIG1ha2Ugc3VyZSBLZXJtaXQgaXMgdXNpbmcgdGhlIHJpZ2h0IG5hbWUuIEp1c3QgYmVjYXVzZQorICAgICAgIHZlcnNpb24gbiBvZiB5b3VyIFVuaXggdXNlZCBhIGNlcnRhaW4gbG9ja2ZpbGUgZGlyZWN0b3J5IGlzIG5vCisgICAgICAgZ3VyYW50ZWUgdGhhdCB2ZXJzaW9uIG4uMSBkb2VzIG5vdCB1c2UgYSBkaWZmZXJlbnQgb25lLgorICAgICAgIFdvcmthcm91bmQ6IGFzayB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3IgdG8gaW5zdGFsbCBhIHN5bWJvbGljCisgICAgICAgbGluayBmcm9tIHRoZSBvbGQgbmFtZSB0byB0aGUgbmV3IG5hbWUuIE90aGVyIHNvbHV0aW9uczogKHNlZQorICAgICAgIGJlbG93KQorICAgIGMuICJTb3JyeSwgYWNjZXNzIHRvIHR0eSBkZXZpY2UgZGVuaWVkLiIgVGhlIHR0eSBkZXZpY2UgdGhhdCB5b3UKKyAgICAgICBzcGVjaWZpZWQgaW4geW91ciBTRVQgTElORSBjb21tYW5kIGlzIHJlYWQvd3JpdGUgcHJvdGVjdGVkIGFnYWluc3QKKyAgICAgICB5b3UuIFNvbHV0aW9uOiAoc2VlIGJlbG93KQorICAgIGQuICJTb3JyeSwgZGV2aWNlIGlzIGluIHVzZS4iIFRoZSB0dHkgZGV2aWNlIHlvdSBoYXZlIHNwZWNpZmllZCBpcworICAgICAgIGN1cnJlbnRseSBiZWluZyB1c2VkIGJ5IGFub3RoZXIgdXNlci4gQSBwcmVmYXRvcnkgbWVzc2FnZSBnaXZlcworICAgICAgIHlvdSBhbiAibHMgLWwiIGxpc3Rpbmcgb2YgdGhlIGxvY2tmaWxlLCB3aGljaCBzaG91bGQgc2hvdyB0aGUKKyAgICAgICB1c2VybmFtZSBvZiB0aGUgcGVyc29uIHdobyBjcmVhdGVkIGl0LCBwbHVzIGEgbWVzc2FnZSAicGlkID0gbm5uIgorICAgICAgIHRvIHNob3cgeW91IHRoZSBwcm9jZXNzIGlkIG9mIHRoZSB1c2VyJ3MgcHJvZ3JhbS4gU29sdXRpb25zOiB0cnkKKyAgICAgICBhbm90aGVyIGRldmljZSwgd2FpdCB1bnRpbCB0aGUgb3RoZXIgdXNlciBpcyBmaW5pc2hlZCwgYXNrIHRoZQorICAgICAgIG90aGVyIHVzZXIgdG8gaHVycnkgdXAsIG9yIGFzayB0aGUgc3lzdGVtIG1hbmFnZXIgZm9yIGhlbHAuCisgICAgZS4gIlNvcnJ5LCBjYW4ndCBvcGVuIGNvbm5lY3Rpb246IHJlYXNvbiIuIFRoZSBkZXZpY2UgY2Fubm90IGJlCisgICAgICAgb3BlbmVkIGZvciBzb21lIG90aGVyIHJlYXNvbiwgd2hpY2ggaXMgbGlzdGVkLgorICAgIGYuICJzaDogL3Vzci9saWIvdXVjcC9hY3VjbnRybDogbm90IGZvdW5kIi4gVGhpcyBtZWFucyB5b3VyIEtlcm1pdAorICAgICAgIHByb2dyYW0gd2FzIGJ1aWx0IHdpdGggdGhlIC1EQUNVQ05UUkwgc3dpdGNoLCBidXQgeW91ciBjb21wdXRlcgorICAgICAgIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZSBCU0QgNC4zIGFjdWNudHJsIHByb2dyYW0uIFNvbHV0aW9uOgorICAgICAgIGluc3RhbGwgdGhlIGFjdWNudHJsIHByb2dyYW0gaWYgeW91IGhhdmUgaXQsIG9yIHJlYnVpbGQgS2VybWl0CisgICAgICAgd2l0aG91dCB0aGUgLURBQ1VDTlRSTCBzd2l0Y2guCisKKyAgIFRoZXJlIGFyZSB0d28gc29sdXRpb25zIGZvciBwcm9ibGVtcyAoYikgYW5kIChjKSwgYm90aCBvZiB3aGljaAorICAgaW52b2x2ZSBpbnRlcnZlbnRpb24gYnkgeW91ciBVbml4IHN5c3RlbSBhZG1pbmlzdHJhdG9yIChzdXBlcnVzZXIpOgorCisgICAgYS4gSGF2ZSB0aGUgc3VwZXJ1c2VyIGNoYW5nZSB0aGUgcGVybWlzc2lvbiBvZiB0aGUgbG9ja2ZpbGUgZGlyZWN0b3J5CisgICAgICAgYW5kIHRvIHRoZSB0dHkgZGV2aWNlcyBzbyB0aGF0IGV2ZXJ5b25lIG9uIHRoZSBzeXN0ZW0gaGFzCisgICAgICAgcmVhZC93cml0ZSBwZXJtaXNzaW9uLgorCitzdSUgY2htb2QgNzc3IC91c3Ivc3Bvb2wvbG9ja3MgKG9yIHdoYXRldmVyIHRoZSBwYXRoIGlzKQorc3UlIGNobW9kIDY2NiAvZGV2L3R0eVhYCisKKyAgICAgICBPbmUgcmlzayBoZXJlIGlzIHRoYXQgcGVvcGxlIGNhbiB3cml0ZSBsb3RzIG9mIGp1bmsgaW50byB0aGUKKyAgICAgICBsb2NrZmlsZSBkaXJlY3RvcnksIGRlbGV0ZSBvdGhlciBwZW9wbGUncyBmaWxlcyBpbiB0aGUgbG9ja2ZpbGUKKyAgICAgICBkaXJlY3RvcnksIGFuZCBpbnRlcmNlcHQgb3RoZXIgcGVvcGxlJ3MgZGF0YSBhcyBpdCBnb2VzIGluIGFuZCBvdXQKKyAgICAgICBvZiB0aGUgdHR5IGRldmljZS4gVGhlIG1ham9yIGRhbmdlciBoZXJlIHdvdWxkIGJlIGludGVyY2VwdGluZyBhCisgICAgICAgcHJpdmlsZWdlZCBwYXNzd29yZC4gT2YgY291cnNlLCBhbnkgdXNlciBjb3VsZCB3cml0ZSBhIHNob3J0LAorICAgICAgIG9yZGluYXJ5LCB1bnByaXZpbGVnZWQgcHJvZ3JhbSB0byBkbyBleGFjdGx5IHRoZSBzYW1lIHRoaW5nIGlmIHRoZQorICAgICAgIHR0eSBkZXZpY2Ugd2FzIHdvcmxkIHJlYWQvd3JpdGVhYmxlLiBUaGUgb3RoZXIgcmlzayBhcyB0aGF0CisgICAgICAgdGVsZXBob25lIGNhbGxzIGFyZSBub3QgY29udHJvbGxlZCAtLSBhbnlib2R5IG9uIHlvdXIgc3lzdGVtIGNhbgorICAgICAgIG1ha2UgdGhlbSwgd2l0aG91dCBoYXZpbmcgdG8gYmVsb25nIHRvIGFueSBwYXJ0aWN1bGFyIGdyb3VwLCBhbmQKKyAgICAgICB0aGlzIGNvdWxkIHJ1biB1cCB5b3VyIHBob25lIGJpbGwuCisgICAgYi4gVXNlIGdyb3VwcyB0byByZWd1bGF0ZSBhY2Nlc3MuIE5vcm1hbGx5IHRoZSBsb2NrZmlsZSBkaXJlY3RvcnkgYW5kCisgICAgICAgYW5kIHRoZSBkaWFsb3V0IGRldmljZXMgd2lsbCBoYXZlIHRoZSBzYW1lIGdyb3VwIChzdWNoIGFzIHV1Y3ApLgorICAgICAgIElmIHNvLCB0aGVuIHB1dCBldmVyeWJvZHkgd2hvJ3MgYWxsb3dlZCB0byBkaWFsIG91dCBpbnRvIHRoYXQKKyAgICAgICBncm91cCwgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBsb2NrZmlsZSBkaXJlY3RvcnkgYW5kIHRoZSB0dHkKKyAgICAgICBkZXZpY2VzIGhhdmUgZ3JvdXAgcmVhZCBBTkQgd3JpdGUgcGVybWlzc2lvbi4gRXhhbXBsZToKKworc3UlIGNobW9kIDc3MCAvdXNyL3Nwb29sL2xvY2tzIChvciB3aGF0ZXZlciB0aGUgcGF0aCBpcykKK3N1JSBjaG1vZCA2NjAgL2Rldi90dHlYWAorCisgICAgICAgVXNlciB3aGF0ZXZlciB0b29sIGlzIGF2YWlsYWJsZSBvbiB5b3VyIHBsYXRmb3JtIHRvIGFkZCB1c2VycyB0bworICAgICAgIHRoZSBhcHByb3Byb3ByaWF0ZSBncm91cCAoZS5nLiBlZGl0IHRoZSAvZXRjL2dyb3VwIGZpbGUpLgorICAgIGMuIEhhdmUgdGhlIHN1cGVydXNlciBjaGFuZ2UgS2VybWl0IHRvIHJ1biBzZXR1aWQgYW5kL29yIHNldGdpZCB0bworICAgICAgIHRoZSBvd25lciBhbmQvb3IgZ3JvdXAgb2YgdGhlIGxvY2tmaWxlIGRpcmVjdG9yeSBhbmQgdGhlIHR0eQorICAgICAgIGRldmljZXMgaWYgbmVjZXNzYXJ5KSwgdHlwaWNhbGx5IHV1Y3AgKHNlZSBbMzE2XW5leHQgc2VjdGlvbiksIGJ1dAorICAgICAgIE5PVCByb290LiBFeGFtcGxlOgorCitzdSUgY2hvd24gdXVjcCBrZXJtaXQgICAgICAgICAgLSBvciAtICBjaGdycCB1dWNwIGtlcm1pdAorc3UlIGNobW9kIHUrcyBrZXJtaXQgKHNldHVpZCkgIC0gb3IgLSAgY2htb2QgZytzIGtlcm1pdCAoc2V0Z2lkKQorCisgICAgICAgYW5kIHRoZW4gbWFrZSBzdXJlIHRoZSBsb2NrZmlsZSBkaXJlY3RvcnksIGFuZCB0aGUgdHR5IGRldmljZXMsCisgICAgICAgaGF2ZSBvd25lciAoc2V0dWlkKSBhbmQvb3IgZ3JvdXAgKHNldGdpZCkgd3JpdGUgcGVybWlzc2lvbi4gRm9yCisgICAgICAgZXhhbXBsZToKKworc3UlIGNobW9kIG8rcnd4IC91c3Ivc3Bvb2wvdXVjcAorc3UlIGNob3duIHV1Y3AgL2Rldi90dHlYWCA7IGNobW9kIDYwMCAvZGV2L3R0eVhYCisKKyAgICAgICBJbiBzb21lIGNhc2VzLCB0aGUgb3duZXIgYW5kIGdyb3VwIG11c3QgYmUgZGlzdGluY3Q7IHRoZSBrZXkgcG9pbnQKKyAgICAgICBpcyB0aGF0IHJlYWQvd3JpdGUgYWNjZXNzIGlzIHJlcXVpcmVkIHRvIGJvdGggdGhlIFVVQ1AgbG9ja2ZpbGUKKyAgICAgICBkaXJlY3RvcnkgYW5kIHRoZSB0dHkgaXRzZWxmLgorCisgICBJZiB5b3UgbWFrZSBDLUtlcm1pdCBzZXR1aWQgb3Igc2V0Z2lkIHRvIHJvb3QsIGl0IHJlZnVzZXMgdG8gcnVuOgorCitGYXRhbDogQy1LZXJtaXQgc2V0dWlkIHRvIHJvb3QhCisKKyAgIEV4YW1wbGU6CisKK2Nydy1yLS0tLS0gICAxIHV1Y3AgICAgIHV1Y3AgICAgICAgNSwgIDY3IEZlYiAxMSAwNjoyMyAvZGV2L2N1YTMKK2Ryd3hyd3hyLXggICAzIHJvb3QgICAgIHV1Y3AgICAgICAgICAxMDI0IEZlYiAxMSAwNjoyMiAvdmFyL2xvY2sKKworICAgcmVxdWlyZXMgc3VpZCB1dWNwIHRvIGdldCByZWFkL3dyaXRlIGFjY2VzcyBvbiAvZGV2L2N1YTMgYW5kIHNnaWQgdG8KKyAgIGdldCByZWFkL3dyaXRlIGFjY2VzcyBvbiAvdmFyL2xvY2sgKHNpbmNlIHlvdSBjYW4ndCBzZXQgS2VybWl0J3MgdWlkCisgICBvciBnaWQgdG8gcm9vdCkuCisKKyAgICAgVGhlIHJlYXNvbiBLZXJtaXQgY2FuJ3QgYmUgc2V0dWlkIG9yIHNldGdpZCB0byByb290IGhhcyB0byBkbyB3aXRoCisgICAgIHRoZSBmYWN0IHRoYXQgc29tZSBVbml4IE9TJ3MgY2FuJ3Qgc3dpdGNoIHVzZXIgb3IgZ3JvdXAgSURzIGluIHRoYXQKKyAgICAgY2FzZS4gVW5mb3J0dW5hdGVseSwgdGhlIHByb2hpYml0aW9uIGFnYWluc3QgbWFraW5nIEtlcm1pdCBzZXR1aWQKKyAgICAgb3Igc2V0Z2lkIHRvIHJvb3QgbWVhbnMgdGhhdCBVbml4IEMtS2VybWl0IGNhbid0IGJlIHVzZWQgdG8gbWFrZQorICAgICBybG9naW4gY29ubmVjdGlvbnMgYnkgbm9uLXJvb3QgdXNlcnMuIChUaGUgcmxvZ2luIHBvcnQgaXMKKyAgICAgcHJpdmlsZWdlZCwgd2hpY2ggaXMgd2h5IHRoZSByZWd1bGFyIHJsb2dpbiBjb21tYW5kIGlzIHNldHVpZCByb290CisgICAgIC0tIHdoaWNoIGlzIHNhZmUgYmVjYXVzZSB0aGUgcmxvZ2luIHByb2dyYW0gbmV2ZXIgaGFzIHRvIGNyZWF0ZSBvcgorICAgICBhY2Nlc3MgZmlsZXMgbGlrZSBLZXJtaXQgZG9lcy4pCisKKyAgIEZvciB0aGUgbG9ja2ZpbGUgbWVjaGFuaXNtIHRvIGFjaGlldmUgaXRzIGRlc2lyZWQgcHVycG9zZSAtLQorICAgcHJldmVudGlvbiBvZiBhY2Nlc3MgdG8gdGhlIHNhbWUgdHR5IGRldmljZSBieSBtb3JlIHRoYW4gb25lIHByb2Nlc3MKKyAgIGF0IGEgdGltZSAtLSBBTEwgcHJvZ3JhbXMgb24gYSBnaXZlbiBjb21wdXRlciB0aGF0IG9wZW4sIHJlYWQgb3IKKyAgIHdyaXRlLCBhbmQgY2xvc2UgdHR5IGRldmljZXMgbXVzdCB1c2UgdGhlIFNBTUUgbG9ja2ZpbGUgY29udmVudGlvbnMuCisgICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIG9mdGVuIG5vdCB0aGUgY2FzZS4gSGVyZSBpcyBhIHR5cGljYWwgZXhhbXBsZQorICAgb2YgaG93IHRoaXMgY2FuIGdvIHdyb25nOiBJbiBTdW5PUyA0LjAgYW5kIGVhcmxlciwgdGhlIGxvY2tmaWxlCisgICBkaXJlY3Rvcnkgd2FzIC91c3Ivc3Bvb2wvdXVjcDsgaW4gNC4xIGl0IHdhcyBjaGFuZ2VkIHRvCisgICAvdmFyL3Nwb29sL2xvY2tzIGluIHRoZSBxdWVzdCBmb3IgcG9saXRpY2FsIGNvcnJlY3RuZXNzLiBDb25zZXF1ZW50bHksCisgICBhbnkgdGhpcmQtcGFydHkgcHJvZ3JhbXMgKHN1Y2ggYXMgQy1LZXJtaXQpIHRoYXQgd2VyZSBub3QgbW9kaWZpZWQgdG8KKyAgIGFjY291bnQgZm9yIHRoaXMgY2hhbmdlLCByZWNvbXBpbGVkLCBhbmQgcmVpbnN0YWxsZWQsIGRpZCBub3QgdXNlIHRoZQorICAgc2FtZSBsb2NrZmlsZXMgYXMgdXVjcCwgdGlwLCBldGMsIGFuZCBzbyB0aGUgZW50aXJlIHB1cnBvc2Ugb2YgdGhlCisgICBsb2NrZmlsZSBpcyBkZWZlYXRlZC4KKworICAgV2hhdCBpZiB5b3VyIFVuaXggc3lzdGVtIGRvZXMgbm90IGhhdmUgVVVDUCBpbnN0YWxsZWQ/IEZvciBleGFtcGxlLAorICAgeW91IGhhdmUgYSBVbml4IHdvcmtzdGF0aW9uLCBhbmQgeW91IGRvIG5vdCB1c2UgdXVjcCwgY3UsIG9yIHRpcCwgb3IKKyAgIFVVQ1Agd2FzIG5vdCBldmVuIHN1cHBsaWVkIHdpdGggeW91ciB2ZXJzaW9uIG9mIFVuaXggKFFOWCBpcyBhbgorICAgZXhhbXBsZSkuIEluIHRoaXMgY2FzZSwgeW91IGhhdmUgdHdvIGNob2ljZXM6CisKKyAgICBhLiBJZiB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBwZXJzb24gcnVubmluZyBLZXJtaXQgYXQgdGhlIHNhbWUKKyAgICAgICB0aW1lLCBjb21wZXRpbmcgZm9yIHRoZSBzYW1lIHR0eSBkZXZpY2UsIHRoZW4gY3JlYXRlIGEgc3BlY2lhbAorICAgICAgIGxvY2tmaWxlIGRpcmVjdG9yeSBqdXN0IGZvciBLZXJtaXQsIGZvciBleGFtcGxlLAorICAgICAgIC91c3Ivc3Bvb2wva2VybWl0LCBhbmQgbWFrZSBzdXJlIHlvdSBoYXZlIHJlYWQvd3JpdGUgYWNjZXNzIHRvIGl0LgorICAgICAgIFRoZW4gYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBtYWtlZmlsZSB0YXJnZXQgQ0ZMQUdTLCBhcyBzaG93bgorICAgICAgIGVhcmxpZXI6CisKKy1ETE9DS19ESVI9XFxcIi91c3Ivc3Bvb2wva2VybWl0XFxcIgorCisgICAgYi4gSWYgeW91IGFyZSB0aGUgb25seSB1c2VyIG9uIHlvdXIgd29ya3N0YXRpb24sIGFuZCBubyBvdGhlcgorICAgICAgIHByb2Nlc3NlcyB3aWxsIGV2ZXIgYmUgY29tcGV0aW5nIHdpdGggS2VybWl0IGZvciB0aGUgZGlhbG91dCB0dHkKKyAgICAgICBkZXZpY2UsIHRoZW4gYWRkIC1ETk9VVUNQIHRvIHlvdXIgbWFrZWZpbGUgdGFyZ2V0J3MgQ0ZMQUdTIGFuZAorICAgICAgIHJlYnVpbGQgS2VybWl0LgorICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisxMS4gUlVOTklORyBVTklYIEMtS0VSTUlUIFNFVFVJRCBPUiBTRVRHSUQKKworICAgWyBbMzE3XVRvcCBdIFsgWzMxOF1Db250ZW50cyBdIFsgWzMxOV1OZXh0IF0gWyBbMzIwXVByZXZpb3VzIF0KKworICAgRXZlbiBpZiB5b3UgZG9uJ3QgaW50ZW5kIHRvIHJ1biBDLUtlcm1pdCBzZXR1aWQsIHNvbWVib2R5IGVsc2UgbWlnaHQKKyAgIGNvbWUgYWxvbmcgYW5kIGNob3duIGFuZCBjaG1vZCBpdCBhZnRlciBpdCBoYXMgYmVlbiBidWlsdC4gWW91IHNob3VsZAorICAgYmUgc3VyZSB0aGF0IGl0IGlzIGJ1aWx0IGNvcnJlY3RseSB0byBydW4gc2V0dWlkIG9uIHlvdXIgc3lzdGVtLiBGb3IKKyAgIFBPU0lYIGFuZCBBVCZUIFVuaXggYmFzZWQgdmVyc2lvbnMsIHlvdSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nCisgICBzcGVjaWFsLgorCisgICBGb3IgNC4yIGFuZCA0LjMgQlNELWJhc2VkIFVuaXggdmVyc2lvbnMsIHlvdSBub3JtYWxseSBuZWVkIG5vdCBhZGQKKyAgIGFueXRoaW5nIHNwZWNpYWwgdG8gdGhlIG1ha2VmaWxlLiBUaGUgcHJvZ3JhbSBhc3N1bWVzIHRoYXQgdGhlCisgICBzZXRyZXVpZCgpIGFuZCBzZXRyZWdpZCgpIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLCB3aXRob3V0IHdoaWNoIHdlCisgICBjYW5ub3Qgc3dpdGNoIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gcmVhbCBhbmQgZWZmZWN0aXZlIHVpZHMuIElmCisgICAibWFrZSIgY29tcGxhaW5zIHRoYXQgX3NldHJldWlkIG9yIF9zZXRyZWdpZCBpcy9hcmUgbm90IGRlZmluZWQsIGFkZAorICAgLUROT1NFVFJFVSB0byBDRkxBR1MuIEluIHRoaXMgY2FzZSBpdCBpcyB2ZXJ5IGxpa2VseSAoYnV0IG5vdCBjZXJ0YWluKQorICAgdGhhdCB5b3UgY2Fubm90IHByb3RlY3QgdHR5cyBhbmQgbG9ja2ZpbGVzIGFnYWluc3QgcGVvcGxlIGFuZCBoYXZlCisgICB0aGVtIHJ1biBLZXJtaXQgc2V0dWlkLgorCisgICBJZiBtYWtlIGRvZXMgbm90IGNvbXBsYWluIGFib3V0IHRoaXMsIHlvdSBzaG91bGQgZmluZCBvdXQgd2hldGhlciB5b3VyCisgICBCU0QgdmVyc2lvbiAoNC4zIG9yIG90aGVyIHN5c3RlbXMgbGlrZSBTdW5PUyA0LnggdGhhdCBjbGFpbSB0byBpbmNsdWRlCisgICBCU0QgNC4zIGNvbXBhdGliaWxpdHkpIGluY2x1ZGVzIHRoZSBzYXZlZC1zZXR1aWQgZmVhdHVyZSAoc2VlIGxvbmcKKyAgIG5vdGVzIHVuZGVyIGVkaXQgMTQ2IGluIGNrYzE3OC51cGQpLiBJZiBpdCBkb2VzLCB0aGVuIGFkZCAtRFNBVkVEVUlECisgICB0byBDRkxBR1MuCisKKyAgICAgSU1QT1JUQU5UIE5PVEU6IE1vc3QgVW5peCBzeXN0ZW0gZG9jdW1lbnRhdGlvbiB3aWxsIG5vdCBnaXZlIHlvdQorICAgICB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24uIFRvIGRldGVybWluZSB3aGV0aGVyIHlvdXIgVW5peCBzeXN0ZW0KKyAgICAgc3VwcGxpZXMgdGhlIHRoZSBzYXZlZC1vcmlnaW5hbC1lZmZlY3RpdmUtdXNlci9ncm91cC1pZCBmZWF0dXJlLAorICAgICB1c2UgdGhlIGNrdXVpZC5jIHByb2dyYW0uIFJlYWQgYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZQorICAgICBjb21tZW50cyBhdCB0aGUgYmVnaW5uaW5nLgorCisgICBDLUtlcm1pdCBmb3IgNC40QlNELWJhc2VkIHN5c3RlbXMgYXV0b21hdGljYWxseSB1c2Ugc2V0ZVt1Z11pZCgpLiBTZWUKKyAgIFszMjFdY2t1dGlvLmMuCisKKyAgIElmIHlvdSBoYXZlIGEgdmVyc2lvbiBvZiBVbml4IHRoYXQgaXMgbm90IEJTRC1iYXNlZCwgYnV0IHdoaWNoCisgICBzdXBwbGllcyB0aGUgc2V0cmV1aWQoKSBhbmQgc2V0cmVnaWQoKSBmdW5jdGlvbnMsIGFuZCB0aGVzZSBhcmUgdGhlCisgICBvbmx5IHdheSB0byBzd2l0Y2ggYmV0d2VlbiByZWFsIGFuZCBlZmZlY3RpdmUgdWlkLCBhZGQgLURTRVRSRVVJRCB0bworICAgeW91ciBtYWtlZmlsZSB0YXJnZXQuCisKKyAgICAgV0FSTklORzogVGhlcmUgYXJlIHR3byBjYWxscyB0byBhY2Nlc3MoKSBpbiBbMzIyXWNrdWZpby5jLCBieSB3aGljaAorICAgICBLZXJtaXQgY2hlY2tzIHRvIHNlZSBpZiBpdCBjYW4gY3JlYXRlIGFuIG91dHB1dCBmaWxlLiBUaGVzZSBjYWxscworICAgICB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSB3aGVuIChhKXlvdSBoYXZlIGluc3RhbGxlZCBDLUtlcm1pdCBzZXR1aWQKKyAgICAgb3Igc2V0Z2lkIG9uIGEgQlNELWJhc2VkIFVuaXggc3lzdGVtLCBhbmQgKGIpIHRoZQorICAgICBzYXZlZC1vcmlnaW5hbC1lZmZlY3RpdmUtdWlkL2dpZCBmZWF0dXJlIGlzIG5vdCBwcmVzZW50LCBhbmQgKGMpCisgICAgIHRoZSBhY2Nlc3MoKSBmdW5jdGlvbiBhbHdheXMgY2hlY2tzIHdoYXQgaXQgYmVsaWV2ZXMgdG8gYmUgdGhlIHJlYWwKKyAgICAgSUQgcmF0aGVyIHRoYW4gdGhlIGVmZmVjdGl2ZSBJRC4gVGhpcyBpcyB0aGUgY2FzZSwgZm9yIGV4YW1wbGUsIGluCisgICAgIE9saXZldHRpIFgvT1MgYW5kIGluIE5lWFRTVEVQLiBJbiBzdWNoIGNhc2VzLCB5b3UgY2FuIGZvcmNlIGNvcnJlY3QKKyAgICAgb3BlcmF0aW9uIG9mIGFjY2VzcygpIGNhbGxzIGJ5IGRlZmluaW5nIHRoZSBzeW1ib2wgU1dfQUNDX0lEIGF0CisgICAgIGNvbXBpbGUgdGltZSBpbiBDRkxBR1MuCisKKyAgIElmIHlvdSBoYXZlIGEgdmVyc2lvbiBvZiBVbml4IHRoYXQgZG9lcyBub3QgYWxsb3cgYSBwcm9jZXNzIHRvIHN3aXRjaAorICAgYmFjayBhbmQgZm9ydGggYmV0d2VlbiBpdHMgZWZmZWN0aXZlIGFuZCByZWFsIHVzZXIgYW5kIGdyb3VwIGlkcworICAgbXVsdGlwbGUgdGltZXMsIHlvdSBwcm9iYWJseSBzaG91bGQgbm90IGF0dGVtcHQgdG8gcnVuIEtlcm1pdCBzZXR1aWQsCisgICBiZWNhdXNlIG9uY2UgaGF2aW5nIGdpdmVuIHVwIGl0cyBlZmZlY3RpdmUgdWlkIG9yIGdpZCAod2hpY2ggaXQgbXVzdAorICAgZG8gaW4gb3JkZXIgdG8gdHJhbnNmZXIgZmlsZXMsIGZvcmsgYSBzaGVsbCwgZXRjKSBpdCBjYW4gbmV2ZXIgZ2V0IGl0CisgICBiYWNrLCBhbmQgc28gaXQgY2FuIG5vdCB1c2UgdGhlIG9yaWdpbmFsIGVmZmVjdGl2ZSB1aWQgb3IgZ2lkIHRvCisgICBjcmVhdGUgb3IgZGVsZXRlIHV1Y3AgbG9ja2ZpbGVzLiBJbiB0aGlzIGNhc2UsIHlvdSdsbCBlaXRoZXIgaGF2ZSB0bworICAgc2V0IHRoZSBwZXJtaXNzaW9ucyBvbiB5b3VyIGxvY2tmaWxlIGRpcmVjdG9yeSB0byBtYWtlIHRoZW0gcHVibGljbHkKKyAgIHJlYWQvd3JpdGFibGUsIG9yIGRpc3BlbnNlIHdpdGggbG9ja2luZyBhbHRvZ2V0aGVyLgorCisgICBNT1JBTDogQXJlIHlvdSB0aG9yb3VnaGx5IHNpY2tlbmVkIGFuZC9vciBmcmlnaHRlbmVkIGJ5IGFsbCB0aGF0IHlvdQorICAgaGF2ZSBqdXN0IHJlYWQ/IFlvdSBzaG91bGQgYmUuIFdoYXQgaXMgdGhlIHJlYWwgYW5zd2VyPyBTaW1wbGUuIFNlcmlhbAorICAgZGV2aWNlcyAtLSBzdWNoIGFzIHR0eXMgYW5kIG1hZ25ldGljIHRhcGVzIC0tIGluIFVuaXggc2hvdWxkIGJlIG9wZW5lZAorICAgd2l0aCBleGNsdXNpdmUgYWNjZXNzIG9ubHksIGVuZm9yY2VkIGJ5IHRoZSBVbml4IGtlcm5lbC4gU2hhcmVkIGFjY2VzcworICAgaGFzIG5vIGNvbmNlaXZhYmxlIHB1cnBvc2UsIGxlZ2l0aW1hdGUgb3Igb3RoZXJ3aXNlLCBleGNlcHQgYnkKKyAgIHByaXZpbGVnZWQgc3lzdGVtIHByb2dyYW1zIHN1Y2ggYXMgZ2V0dHkuIFRoZSBvcmlnaW5hbCBkZXNpZ24gZGF0ZXMKKyAgIGZyb20gdGhlIGxhdGUgMTk2MHMsIHdoZW4gVW5peCB3YXMgZGV2ZWxvcGVkIGZvciBsYWJvcmF0b3J5IHVzZSB1bmRlcgorICAgYSBwaGlsb3NvcGh5IG9mIHRydXN0IGJ5IHBlb3BsZSB3aXRoaW4gc2hvdXRpbmcgZGlzdGFuY2Ugb2YgZWFjaCBvdGhlcgorICAgLS0gYnV0IGV2ZW4gdGhlbiwgbm8gdXNlZnVsIHB1cnBvc2Ugd2FzIHNlcnZlZCBieSB0aGlzIHBhcnRpY3VsYXIgZm9ybQorICAgb2Ygb3Blbm5lc3M7IGl0IHdhcyBwcm9iYWJseSBtb3JlIG9mIGEgcG9saXRpY2FsIHN0YXRlbWVudC4gU2luY2UgdGhlCisgICBlbWVyZ2VuY2Ugb2YgVW5peCBmcm9tIHRoZSBsYWJvcmF0b3J5IGludG8gdGhlIGNvbW1lcmNpYWwgbWFya2V0LCB3ZQorICAgaGF2ZSBzZWVuIGV2ZXJ5IHZlc3RpZ2Ugb2Ygb3Blbm5lc3MgLS0gYnV0IHRoaXMgb25lIC0tIHN0cmlwcGVkIGF3YXkuCisgICBJJ2QgbGlrZSB0byBzZWUgc29tZSBpbmZsdWVudGlhbCBVbml4IG1ha2VyIHRha2UgdGhlIGJvbGQgc3RlcCBvZgorICAgbWFraW5nIHRoZSBzaW1wbGUga2VybmVsIGNoYW5nZSByZXF1aXJlZCB0byBlbmZvcmNlIGV4Y2x1c2l2ZSBhY2Nlc3MKKyAgIHRvIHNlcmlhbCBkZXZpY2VzLiAoV2VsbCwgcGVyaGFwcyBub3Qgc28gc2ltcGxlIHdoZW4gYmlkaXJlY3Rpb25hbGl0eQorICAgbXVzdCBhbHNvIGJlIGEgZ29hbCAtLSBidXQgdGhlbiBvdGhlciBPUydzIGxpa2UgVk1TIHNvbHZlZCB0aGlzCisgICBwcm9ibGVtIGRlY2FkZXMgYWdvLikKKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMTIuIENPTkZJR1VSSU5HIFVOSVggV09SS1NUQVRJT05TCisKKyAgIFsgWzMyM11Ub3AgXSBbIFszMjRdQ29udGVudHMgXSBbIFszMjVdTmV4dCBdIFsgWzMyNl1QcmV2aW91cyBdCisKKyAgIE9uIGRlc2t0b3Agd29ya3N0YXRpb25zIHRoYXQgYXJlIHVzZWQgYnkgb25seSB0aGUgdXNlciBhdCB0aGUgY29uc29sZQorICAga2V5Ym9hcmQsIEMtS2VybWl0IGlzIGFsd2F5cyB1c2VkIGluIGxvY2FsIG1vZGUuIEJ1dCBhcyBkZWxpdmVyZWQsCisgICBDLUtlcm1pdCBydW5zIGluIHJlbW90ZSBtb2RlIGJ5IGRlZmF1bHQuIFRvIHB1dCBpdCBpbiBsb2NhbCBtb2RlIGF0CisgICBzdGFydHVwLCB5b3UgY2FuIHB1dCBhIFNFVCBMSU5FIGNvbW1hbmQgaW4geW91ciAubXlrZXJtcmMuCisKKyAgIFlvdSBjYW4gYWxzbyBidWlsZCBDLUtlcm1pdCB0byBzdGFydCB1cCBpbiBsb2NhbCBtb2RlIGJ5IGRlZmF1bHQuIFRvCisgICBkbyB0aGlzLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgaW4gdGhlIENGTEFHUyBpbiB5b3VyIG1ha2VmaWxlIHRhcmdldDoKKworLURERlRUWT1cXFwiL2Rldi90dHl4eFxcXCIKKworICAgd2hlcmUgdHR5eHggaXMgdGhlIG5hbWUgb2YgdGhlIGRldmljZSB5b3Ugd2lsbCBiZSB1c2luZyBmb3IKKyAgIGNvbW11bmljYXRpb25zLiBQcmVzZW50bHkgdGhlcmUgaXMgbm8gd2F5IG9mIHNldHRpbmcgdGhlIGRlZmF1bHQgbW9kZW0KKyAgIHR5cGUgYXQgY29tcGlsZSB0aW1lLCBzbyB1c2UgdGhpcyBvcHRpb24gb25seSBmb3IgZGlyZWN0IGxpbmVzLgorCisgICBDLUtlcm1pdCBkb2VzIG5vdCB3b3JrIHdlbGwgb24gY2VydGFpbiB3b3Jrc3RhdGlvbnMgaWYgaXQgaXMgbm90IHJ1bgorICAgZnJvbSB3aXRoaW4gYSB0ZXJtaW5hbCB3aW5kb3cuIEZvciBleGFtcGxlLCB5b3UgY2Fubm90IHN0YXJ0IEMtS2VybWl0CisgICBvbiBhIE5lWFQgYnkgbGF1bmNoaW5nIGl0IGRpcmVjdGx5IGZyb20gTmVYVHN0ZXAuIFNpbWlsYXJseSBmb3IgU3VuCisgICB3b3Jrc3RhdGlvbnMgaW4gdGhlIE9wZW4gV2luZG93cyBlbnZpcm9ubWVudC4gUnVuIEtlcm1pdCBpbiBhIHRlcm1pbmFsCisgICB3aW5kb3cuCisgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKzEzLiBCSVpBUlJFIEJFSEFWSU9SIEFUIFJVTlRJTUUKKworICAgWyBbMzI3XVRvcCBdIFsgWzMyOF1Db250ZW50cyBdIFsgWzMyOV1OZXh0IF0gWyBbMzMwXVByZXZpb3VzIF0KKworICAgU2VlIHRoZSAiYmV3YXJlIGZpbGUiLAorCisgICBbMzMxXWNrdWJ3ci50eHQsIGZvciBoaW50cyBhYm91dCBydW50aW1lIG1pc2JlaGF2aW9yLiBUaGlzIHNlY3Rpb24KKyAgIGxpc3RzIHNvbWUgcnVudGltZSBwcm9ibGVtcyB0aGF0IGNhbiBiZSBjdXJlZCBieSByZWJ1aWxkaW5nIEMtS2VybWl0LgorCisgICBUaGUgcHJvZ3JhbSBzdGFydHMsIGJ1dCB0aGVyZSBpcyBubyBwcm9tcHQsIGFuZCBjZXJ0YWluIG9wZXJhdGlvbnMKKyAgIGRvbid0IHdvcmsgKHlvdSBzZWUgZXJyb3IgbWVzc2FnZXMgbGlrZSAiS2VybWl0IGNvbW1hbmQgZXJyb3IgaW4KKyAgIGJhY2tncm91bmQgZXhlY3V0aW9uIikuIFRoaXMgaXMgYmVjYXVzZSBLZXJtaXQgdGhpbmtzIGl0IGlzIHJ1bm5pbmcgaW4KKyAgIHRoZSBiYWNrZ3JvdW5kLiBTZWUgY29uYmd0KCkgaW4gWzMzMl1ja3V0aW8uYy4gVHJ5IHJlYnVpbGRpbmcgS2VybWl0CisgICB3aXRoOgorCisgLURQSURfVD1waWRfdAorCisgICBhZGRlZCB0byB5b3VyIENGTEFHUy4gSWYgdGhhdCBkb2Vzbid0IGhlbHAsIGZpbmQgb3V0IHRoZSBhY3R1YWwgZGF0YQorICAgdHlwZSBmb3IgcGlkcyAobG9vayBpbiB0eXBlcy5oIG9yIHNpbWlsYXIgZmlsZSkgYW5kIHVzZSBpdCBpbiBwbGFjZSBvZgorICAgInBpZF90IiwgZm9yIGV4YW1wbGU6CisKKyAtRFBJRF9UPXNob3J0CisKKyAgIFVuZXhwbGFpbmFibGUgYW5kIGluYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZXMgKCJTb2NrZXRzIG5vdCBzdXBwb3J0ZWQKKyAgIG9uIHRoaXMgZGV2aWNlIiwgZXRjKSBoYXZlIGJlZW4gdHJhY2VkIGluIGF0IGxlYXN0IG9uZSBjYXNlIHRvIGEgbGFjaworICAgb2YgYWdyZWVtZW50IGJldHdlZW4gdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgYW5kIHRoZSBhY3R1YWwga2VybmVsLgorICAgVGhpcyBoYXBwZW5lZCBiZWNhdXNlIHRoZSBHTlUgQyBjb21waWxlciAoZ2NjKSB3YXMgYmVpbmcgdXNlZC4gZ2NjCisgICB3YW50cyB0byBoYXZlIEFOU0ktQy1jb21wbGlhbnQgaGVhZGVyIGZpbGVzLCBhbmQgc28gcGFydCBvZiB0aGUKKyAgIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUgZm9yIGdjYyBpcyAob3Igd2FzKSB0byBydW4gYSBzaGVsbCBzY3JpcHQKKyAgIGNhbGxlZCAiZml4aW5jbHVkZXMiLCB3aGljaCB0cmFuc2xhdGVzIHRoZSBzeXN0ZW0ncyBoZWFkZXIgZmlsZXMgaW50bworICAgYSBzZXBhcmF0ZSBzZXQgb2YgaGVhZGVycyB0aGF0IGdjYyBsaWtlcy4gU28gZmFyIHNvIGdvb2QuIExhdGVyLCBhIG5ldworICAgdmVyc2lvbiBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBpbnN0YWxsZWQgYW5kIG5vYm9keSByZW1lbWJlcnMgdG8KKyAgIHJ1biBmaXhpbmNsdWRlcyBhZ2Fpbi4gRnJvbSB0aGF0IHBvaW50LCBhbnkgcHJvZ3JhbSBjb21waWxlZCB3aXRoIGdjYworICAgdGhhdCBtYWtlcyB1c2Ugb2YgaGVhZGVyIGZpbGVzIChwYXJ0aWN1bGFybHkgaW9jdGwuaCkgaXMgdmVyeSBsaWtlbHkKKyAgIHRvIG1pc2JlaGF2ZS4gU29sdXRpb246IHJ1biBmaXhpbmNsdWRlcyBhZ2Fpbiwgb3IgdXNlIHlvdXIgc3lzdGVtJ3MKKyAgIHJlZ3VsYXIgQyBjb21waWxlciwgbGlicmFyaWVzLCBhbmQgaGVhZGVyIGZpbGVzIGluc3RlYWQgb2YgZ2NjLgorICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisxNC4gQ1JBU0hFUyBBTkQgQ09SRSBEVU1QUworCisgICBbIFszMzNdVG9wIF0gWyBbMzM0XUNvbnRlbnRzIF0gWyBbMzM1XU5leHQgXSBbIFszMzZdUHJldmlvdXMgXQorCisgICBJZiBDLUtlcm1pdCBjb25zdGl0ZW50bHkgZHVtcHMgY29yZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgZmlsZQorICAgdHJhbnNmZXIsIGxvb2sgaW4gU0hPVyBGRUFUVVJFUyBmb3IgQ0tSRUFMUEFUSC4gSWYgZm91bmQsIHJlYnVpbGQgd2l0aAorICAgLUROT1JFQUxQQVRIIGFuZCBzZWUgaWYgdGhhdCBmaXhlcyB0aGUgcHJvYmxlbSAoc29tZSBVTklYZXMgaGF2ZQorICAgcmVhbHBhdGgoKSBidXQgaXQgZG9lc24ndCB3b3JrKS4KKworICAgVG90YWwgZmFpbHVyZSBvZiB0aGUgS2VybWl0IHByb2dyYW0gY2FuIG9jY3VyIGJlY2F1c2Ugb2YgYmFkIG1lbW9yeQorICAgcmVmZXJlbmNlcywgYmFkIHN5c3RlbSBjYWxscywgb3IgcHJvYmxlbXMgd2l0aCBkeW5hbWljIG1lbW9yeQorICAgYWxsb2NhdGlvbi4gRmlyc3QsIHRyeSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0gd2l0aCBkZWJ1Z2dpbmcgdHVybmVkCisgICBvbjogcnVuIEtlcm1pdCB3aXRoIHRoZSAtZCBjb21tYW5kLWxpbmUgb3B0aW9uIChmb3IgZXhhbXBsZSwgIndlcm1pdAorICAgLWQiKSBhbmQgdGhlbiBleGFtaW5lIHRoZSByZXN1bHRpbmcgZGVidWcubG9nIGZpbGUuIFRoZSBsYXN0IGVudHJ5CisgICBzaG91bGQgYmUgaW4gdGhlIHZpY2luaXR5IG9mIHRoZSBjcmFzaC4gSW4gVk1TLCBhIGNyYXNoIGF1dG9tYXRpY2FsbHkKKyAgIHByb2R1Y2VzIGEgInN0YWNrIGR1bXAiIHdoaWNoIHNob3dzIHRoZSByb3V0aW5lIHdoZXJlIHRoZSBjcmFzaAorICAgb2NjdXJzLiBJbiBzb21lIHZlcnNpb25zIG9mIFVuaXgsIHlvdSBjYW4gZ2V0IGEgc3RhY2sgZHVtcCB3aXRoICJhZGIiCisgICAtLSBqdXN0IHR5cGUgImFkYiB3ZXJtaXQgY29yZSIgYW5kIHRoZW4gZ2l2ZSB0aGUgY29tbWFuZCAiJGMiLCB0aGVuCisgICBDdHJsLUQgdG8gcXVpdCAobm90ZTogcmVwbGFjZSAid2VybWl0IiBieSAia2VybWl0IiBvciBieSB0aGUgZnVsbAorICAgcGF0aG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgdGhhdCBjcmFzaGVkIGlmIGl0IGlzIG5vdCBpbiB0aGUgY3VycmVudAorICAgZGlyZWN0b3J5KS4gT3IgdXNlIGdkYiB0byBnZXQgYSBiYWNrdHJhY2UsIGV0Yy4KKworICAgSW4gZWRpdCAxODYsIG9uZSBpbXBsZW1lbnRhdGlvbiwgVU5JU1lTIDUwMDAvOTUgYnVpbHQgd2l0aCAibWFrZQorICAgc3lzNXIzIiwgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gcnVuIG91dCBvZiBtZW1vcnkgdmVyeSBxdWlja2x5IChlLmcuCisgICB3aGlsZSBleGVjdXRpbmcgYSBzaG9ydCBpbml0aWFsaXphdGlvbiBmaWxlIHRoYXQgY29udGFpbnMgYSBTRVQgRElBTAorICAgRElSRUNUT1JZIGNvbW1hbmQpLiBEZWJ1ZyBsb2dzIHNob3cgdGhhdCBtYWxsb2MgY2FsbHMgYXJlIGZhaWxpbmcsCisgICByZWFzb24gdW5rbm93bi4gRm9yIHRoaXMgYW5kIGFueSBvdGhlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGdpdmVzIGVycm9yCisgICBtZXNzYWdlcyBhYm91dCAibWFsbG9jIGZhaWx1cmUiIG9yICJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIiwKKyAgIHJlYnVpbGQgdGhlIHByb2dyYW0gKndpdGhvdXQqIHRoZSAtRERZTkFNSUMgQ0ZMQUdTIGRlZmluaXRpb24sIGZvcgorICAgZXhhbXBsZToKKworbWFrZSBzeXM1cjMgS0ZMQUdTPS1VRFlOQU1JQworCisgICBBcyBvZiBlZGl0IDE2OSwgQy1LZXJtaXQgaW5jbHVkZXMgYSBtYWxsb2MoKSBkZWJ1Z2dpbmcgcGFja2FnZSB3aGljaAorICAgeW91IG1heSBsaW5rIHdpdGggdGhlIEtlcm1pdCBwcm9ncmFtIHRvIGNhdGNoIHJ1bnRpbWUgbWFsbG9jIGVycm9ycy4KKyAgIFNlZSB0aGUgbWFrZWZpbGUgZW50cmllcyBmb3Igc3Vub3M0MW1kIGFuZCBuZXh0bWQgZm9yIGV4YW1wbGVzIG9mIGhvdworICAgdG8gc2VsZWN0IG1hbGxvYyBkZWJ1Z2dpbmcuIE9uY2UgeW91IGhhdmUgbGlua2VkIEtlcm1pdCB3aXRoIHRoZQorICAgbWFsbG9jIGRlYnVnZ2VyLCBpdCB3aWxsIGhhbHQgd2l0aCBhbiBpbmZvcm1hdGl2ZSBtZXNzYWdlIGlmIGEKKyAgIG1hbGxvYy1yZWxhdGVkIGVycm9yIG9jY3VycyBhbmQsIGlmIHBvc3NpYmxlLCBkdW1wIGNvcmUuIEZvciB0aGlzCisgICByZWFzb24sIG1hbGxvYy1kZWJ1Z2dpbmcgdmVyc2lvbnMgb2YgS2VybWl0IHNob3VsZCBiZSBidWlsdCB3aXRob3V0CisgICB0aGUgIi1zIiBsaW5rIG9wdGlvbiAod2hpY2ggcmVtb3ZlcyBzeW1ib2xzLCBwcmV2ZW50aW5nIGFuYWx5c2lzIG9mCisgICB0aGUgY29yZSBkdW1wKS4gWW91IGhhdmUgc2V2ZXJhbCB3YXlzIHRvIHRyYWNrIGRvd24gdGhlIG1hbGxvYyBlcnJvcjoKKyAgIEFuYWx5emUgdGhlIGNvcmUgZHVtcCB3aXRoIGFkYi4gT3IgcmVwcm9kdWNlIHRoZSBwcm9ibGVtIHdpdGggImxvZworICAgZGVidWciIGFuZCB0aGVuIGxvb2sgYXQgdGhlIGNvZGUgYXJvdW5kIHRoZSBsYXN0IGRlYnVnLmxvZyBlbnRyeS4gSWYKKyAgIHlvdSBoYXZlIGdjYywgYnVpbGQgdGhlIHByb2dyYW0gd2l0aCAiLWciIGFkZGVkIHRvIENGTEFHUyBhbmQgdGhlbgorICAgZGVidWcgaXQgd2l0aCBnZGIsIGUuZy4KKworZ2RiIHdlcm1pdAorYnJlYWsgbWFpbgorcnVuCisuLiBzZXQgb3RoZXIgYnJlYWtwb2ludHMgb3Igd2F0Y2hwb2ludHMKK2NvbnRpbnVlCisKKyAgIFdhdGNocG9pbnRzIGFyZSBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgZmluZGluZyBtZW1vcnkgbGVha3MsIGJ1dCB0aGV5CisgICBtYWtlIHRoZSBwcm9ncmFtIHJ1biBhYm91dCBhIHRob3VzYW5kIHRpbWVzIHNsb3dlciB0aGFuIHVzdWFsLCBzbworICAgZG9uJ3Qgc2V0IHRoZW0gdW50aWwgdGhlIGxhc3QgcG9zc2libGUgbW9tZW50LiBXaGVuIGEgd2F0Y2hwb2ludCBpcworICAgaGl0LCB5b3UgY2FuIHVzZSB0aGUgIndoZXJlIiBjb21tYW5kIHRvIGZpbmQgb3V0IHdoaWNoIEMtS2VybWl0IHNvdXJjZQorICAgc3RhdGVtZW50IHRyaWdnZXJlZCBpdC4KKworICAgSWYgeW91IGhhdmUgdGhlIFB1cmUgU29mdHdhcmUgSW5jICJQdXJpZnkiIHByb2R1Y3QsIHNlZSB0aGUgc3Vub3M0MWNwCisgICBtYWtlZmlsZSBlbnRyeSBmb3IgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIGl0IHRvIGRlYnVnIEMtS2VybWl0LgorICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisxNS4gU1lTTE9HR0lORworCisgICBbIFszMzddVG9wIF0gWyBbMzM4XUNvbnRlbnRzIF0gWyBbMzM5XU5leHQgXSBbIFszNDBdUHJldmlvdXMgXQorCisgICAiU3lzbG9nZ2luZyIgbWVhbnMgcmVjb3JkaW5nIHNlbGVjdGVkIGluIHRoZSBzeXN0ZW0gbG9nIHZpYSB0aGUgVW5peAorICAgc3lzbG9nKCkgZmFjaWxpdHksIHdoaWNoIGlzIGF2YWlsYWJsZSBpbiBtb3N0IFVuaXggdmVyc2lvbnMuCisgICBTeXNsb2dnaW5nIGlzIG5vdCBkb25lIHVubGVzcyBDLUtlcm1pdCBpcyBzdGFydGVkIHdpdGg6CisKKy0tc3lzbG9nOm4KKworICAgb24gdGhlIGNvbW1hbmQtbGluZSwgd2hlcmUgbiBpcyBhIG51bWJlciBncmVhdGVyIHRoYW4gMCB0byBpbmRpY2F0ZQorICAgdGhlIGxldmVsIG9mIHN5c2xvZ2dpbmcuIFNlZSBbMzQxXVNlY3Rpb24gNC4yIG9mIHRoZSBbMzQyXUlLU0QKKyAgIEFkbWluaXN0cmF0b3IncyBHdWlkZSBmb3IgZGV0YWlscy4KKworICAgT2J2aW91c2x5IHlvdSBjYW4ndCBkZXBlbmQgb24gdXNlcnMgdG8gaW5jbHVkZSAtLXN5c2xvZzozIChvcgorICAgd2hhdGV2ZXIpIG9uIHRoZSBjb21tYW5kIGxpbmUgZXZlcnkgdGltZSB0aGV5IHN0YXJ0IEMtS2VybWl0LCBzbyBpZgorICAgeW91IHdhbnQgY2VydGFpbiBraW5kcyBvZiByZWNvcmRzIHRvIGJlIHJlY29yZGVkIGluIHRoZSBzeXN0ZW0gbG9nLAorICAgeW91IGNhbiBidWlsZCBDLUtlcm1pdCB3aXRoIGZvcmNlZCBzeXNsb2dnaW5nIGF0IHRoZSBkZXNpcmVkIGxldmVsLAorICAgZS5nLjoKKworbWFrZSBsaW51eCBLRkxBR1M9LURTWVNMT0dMRVZFTD0yCisKKyAgIExldmVscyAyIGFuZCAzIGFyZSB0aGUgbW9zdCBsaWtlbHkgY2FuZGlkYXRlcyBmb3IgdGhpcyB0cmVhdG1lbnQuCisgICBMZXZlbCAyIGZvcmNlcyBsb2dnaW5nIG9mIGFsbCBzdWNjZXNzZnVsIGRpYWxvdXQgY2FsbHMgKGUuZy4gZm9yCisgICBjaGVja2luZyBhZ2FpbnN0IG9yIHBob25lIGJpbGxzKSwgYW5kIGxldmVsIDMgcmVjb3JkcyBhbGwgY29ubmVjdGlvbnMKKyAgIChTRVQgTElORSBvciBTRVQgSE9TVCAvIFRFTE5FVCAvIFJMT0dJTiwgZXRjKSBzbyB5b3UgY2FuIHNlZSB3aG8gaXMKKyAgIGNvbm5lY3Rpbmcgb3V0IGZyb20geW91ciBzeXN0ZW0sIGFuZCB0byB3aGVyZS4KKworICAgTGV2ZWwgMiBhbmQgMyByZWNvcmRzIGFyZSBlcXVpdmFsZW50IHRvIHRob3NlIGluIHRoZSBjb25uZWN0aW9uIGxvZzsKKyAgIHNlZSB0aGUgWzM0M11DLUtlcm1pdCA3LjAgU3VwcGxlbWVudCkgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YKKyAgIHRoZSBjb25uZWN0aW9uIGxvZy4KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMTYuIEJVSUxESU5HIFNFQ1VSRSBWRVJTSU9OUyBPRiBDLUtFUk1JVCA4LjAKKworICAgWyBbMzQ0XVRvcCBdIFsgWzM0NV1Db250ZW50cyBdIFsgWzM0Nl1OZXh0IF0gWyBbMzQ3XVByZXZpb3VzIF0KKworICAgQy1LZXJtaXQgNy4wIGFuZCBsYXRlciBtYXkgYmUgYnVpbHQgd2l0aCBLZXJiZXJvcyhUTSkgYW5kL29yIFNSUChUTSkKKyAgIChTZWN1cmUgUmVtb3RlIFBhc3N3b3JkKSBhbmQvb3IgU1NML1RMUyBzZWN1cml0eSBmb3Igc3Ryb25nCisgICBhdXRoZW50aWNhdGlvbiBhbmQgZW5jcnlwdGlvbiBvZiBJbnRlcm5ldCBjb25uZWN0aW9ucy4gVGhlc2Ugc2VjdXJpdHkKKyAgIG1ldGhvZHMgcmVxdWlyZSBleHRlcm5hbCBsaWJyYXJpZXMgdGhhdCwgaW4gdGhlaXIgYmluYXJ5IGZvcm1zLCBhcmUKKyAgIHJlc3RyaWN0ZWQgZnJvbSBleHBvcnQgYnkgVVNBIGxhdy4gU2VlIHRoZSBbMzQ4XUtlcm1pdCBTZWN1cml0eQorICAgUmVmZXJlbmNlKSBmb3IgZGV0YWlscy4gQy1LZXJtaXQgYmluYXJpZXMgdGhlbXNlbHZlcyBhcmUgbGlrZXdpc2UKKyAgIHJlc3RyaWN0ZWQ7IHRoZSBDLUtlcm1pdCBiaW5hcmllcyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHB1YmxpYworICAgZG93bmxvYWQgb24gdGhlIEludGVybmV0IGFyZSBub3QgYWxsb3dlZCB0byBjb250YWluIHRoZSBzZWN1cml0eQorICAgb3B0aW9ucy4KKworICAgU2FtcGxlIG1ha2VmaWxlIGVudHJpZXMgYXJlIHByb3ZpZGVkIGZvciBMaW51eCBhbmQgbWFueSBvdGhlcgorICAgb3BlcmF0aW5nIHN5c3RlbXMuIEEgbGlzdCBvZiBzZWN1cmUgbWFrZWZpbGUgZW50cmllcyBpcyBpbmNsdWRlZCBpbgorICAgdGhlIE1ha2VmaWxlLiBDb21wbGV0ZSBpbnN0cnVjdGlvbnMgb24gYnVpbGRpbmcgQy1LZXJtaXQgOC4wIHdpdGggTUlUCisgICBLZXJiZXJvczsgU2VjdXJlIFJlbW90ZSBQYXNzd29yZDsgYW5kL29yIE9wZW5TU0wgY2FuIGJlIGZvdW5kIGluIHRoZQorICAgWzM0OV1LZXJtaXQgU2VjdXJpdHkgUmVmZXJlbmNlLgorCisgICBDLUtlcm1pdCA4LjAgY29tZXMgd2l0aCBhIGN1cnJlbnQgbGlzdCBvZiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKKyAgIGNlcnRpZmljYXRlcywgaW5jbHVkaW5nIG9uZSBmb3IgdGhlIEtlcm1pdCBQcm9qZWN0IHRoYXQgY2FuIGJlIHVzZWQKKyAgIGZvciBhdXRoZW50aWNhdGlvbiB0byBDb2x1bWJpYSdzIFszNTBdSW50ZXJuZXQgS2VybWl0IFNlcnZpY2UgKElLU0QpLgorICAgWW91IGNhbiB1c2UgQy1LZXJtaXQgNy4wIG9yIGxhdGVyIHRvIGFjY2VzcyBDb2x1bWJpYSdzIElLU0Qgc2VjdXJlbHkKKyAgIGJ5IGluc3RhbGxpbmcgdGhlIEtlcm1pdCBQcm9qZWN0IGNlcnRpZmljYXRlIGluCisgICAvdXNyL2xvY2FsL3NzbC9jZXJ0LnBlbSAob3IgdGhlIGFwcHJvcHJpYXRlIGxvY2F0aW9uIGJhc2VkIHVwb24gdGhlCisgICBpbnN0YWxsYXRpb24gb2YgT3BlblNTTCBvbiB5b3VyIHN5c3RlbSkuIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlCisgICBjZXJ0aWZpY2F0ZXMgZmlsZSBhdDoKKworWzM1MV1mdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9jYV9jZXJ0cy5wZW0KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworMTcuIElOU1RBTExJTkcgQy1LRVJNSVQgQVMgQU4gU1NIIFNFUlZFUiBTVUJTWVNURU0KKworICAgWyBbMzUyXVRvcCBdIFsgWzM1M11Db250ZW50cyBdIFsgWzM1NF1QcmV2aW91cyBdCisKKyAgIFRoaXMgcmVxdWlyZXMgQy1LZXJtaXQgOC4wLjIwNiBvciBsYXRlciBhbmQgYW4gU1NIIHYyIHNlcnZlci4gSWYgeW91CisgICBsaXN0IEMtS2VybWl0IGFzIGEgU3Vic3lzdGVtIGluIHRoZSBTU0ggdjIgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgKGFzLCBmb3IgZXhhbXBsZSwgU0ZUUCBpcyBsaXN0ZWQpLCB1c2VycyBjYW4gbWFrZSBTU0ggY29ubmVjdGlvbnMKKyAgIGRpcmVjdCB0byBhIEtlcm1pdCBzZXJ2ZXIgYXMgZXhwbGFpbmVkIGhlcmU6CisKK1szNTVdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NrZXJtaXQuaHRtbAorCisgICBUaGUgbmFtZSBhbmQgbG9jYXRpb24gb2YgdGhlIFNTSCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlIGRlcGVuZHMgb24KKyAgIHlvdXIgcGxhdGZvcm0sIHdoaWNoIFNTSCBwcm9kdWN0KHMpIHlvdSBoYXZlLCBldGMuIEMtS2VybWl0IGl0c2VsZgorICAgbXVzdCBiZSByZWZlcnJlZCB0byBpbiB0aGlzIGZpbGUgYXMgImtlcm1pdC1zc2hzdWIiLiBPbiB0aGUgaG9zdCwKKyAgIGluc3RhbGwgdGhlIEMtS2VybWl0IDguMC4yMTEgYmluYXJ5IGluIHRoZSBub3JtYWwgd2F5LiBUaGVuLCBpbiB0aGUKKyAgIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBDLUtlcm1pdCBiaW5hcnksIG1ha2UgYSBzeW1ib2xpYyBsaW5rOgorCitsbiAtcyBrZXJtaXQga2VybWl0LXNzaHN1YgorCisgICAoTm90ZTogdGhlICJtYWtlIGluc3RhbGwiIG1ha2VmaWxlIHRhcmdldCBkb2VzIHRoaXMgZm9yIHlvdS4pIFRoZW4gaW4KKyAgIHRoZSBzc2hkIGNvbmZpZ3VyYXRpb24gZmlsZSwgYWRkIGEgbGluZToKKworU3Vic3lzdGVtICBrZXJtaXQgICAvc29tZS9wYXRoL2tlcm1pdC1zc2hzdWIKKworICAgKHdoZXJlIC9zb21lL3BhdGggaXMgdGhlIGZ1bGx5IHNwZWNpZmllZCBkaXJlY3Rvcnkgd2hlcmUgdGhlIHN5bWxpbmsKKyAgIGlzLikgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBsaW5lIHRoYXQgc2V0cyB1cCB0aGUgU0ZUUCBzdXNic3lzdGVtLgorICAgRXhhbXBsZToKKworU3Vic3lzdGVtICAgc2Z0cCAgICAvdXNyL2xvY2FsL2xpYmV4ZWMvc2Z0cC1zZXJ2ZXIKK1N1YnN5c3RlbSAgIGtlcm1pdCAgL3Vzci9sb2NhbC9iaW4va2VybWl0LXNzaHN1YgorCisgICBUaGUgbWVjaGFuaWNzIG1pZ2h0IHZhcnkgZm9yIG90aGVyIFNTSCBzZXJ2ZXJzOyAibWFuIHNzaGQiIGZvcgorICAgZGV0YWlscy4gVGhlIG1ldGhvZCBzaG93biBoZXJlIGlzIHVzZWQgYmVjYXVzZSB0aGUgT3BlblNTSCBzZXJ2ZXIgZG9lcworICAgbm90IHBlcm1pdCB0aGUgc3Vic3lzdGVtIGludm9jYXRpb24gdG8gaW5jbHVkZSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKyAgIEMtS2VybWl0IHdvdWxkIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgdGhhdCBpdCBzaG91bGQgZW50ZXIgU2VydmVyIG1vZGUKKyAgIGlmIGl0IHdlcmUgbm90IGNhbGxlZCBieSBhIHNwZWNpYWwgbmFtZS4KKworICAgWyBbMzU2XVRvcCBdIFsgWzM1N11Db250ZW50cyBdIFsgWzM1OF1DLUtlcm1pdCBIb21lIF0gWyBbMzU5XUMtS2VybWl0CisgICA4LjAgT3ZlcnZpZXcgXSBbIFszNjBdS2VybWl0IEhvbWUgXQorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisKKyAgICBDLUtlcm1pdCA4LjAgVW5peCBJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zIC8gVGhlIEtlcm1pdCBQcm9qZWN0IC8KKyAgICBDb2x1bWJpYSBVbml2ZXJzaXR5IC8gMTAgQXByaWwgMjAwNAorCitSZWZlcmVuY2VzCisKKyAgIDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworICAgMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorICAgMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwKKyAgIDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbAorICAgNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gwCisgICA2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDEKKyAgIDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MgorICAgOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gzCisgICA5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQKKyAgMTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NQorICAxMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g2CisgIDEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDcKKyAgMTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OAorICAxNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5CisgIDE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDEwCisgIDE2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDExCisgIDE3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDEyCisgIDE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDEzCisgIDE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDE0CisgIDIwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDE1CisgIDIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDE2CisgIDIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDE2CisgIDIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjdG9wCisgIDI0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjY29udGVudHMKKyAgMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MQorICAyNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sCisgIDI3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwKKyAgMjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbAorICAyOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY3BsbS5odG1sCisgIDMwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDIKKyAgMzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC94MworICAzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g0CisgIDMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjdG9wCisgIDM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjY29udGVudHMKKyAgMzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MgorICAzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gwCisgIDM3LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9hcmNoaXZlcy9ja3UyMTEudGFyLloKKyAgMzguIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2FyY2hpdmVzL2NrdTIxMS50YXIuZ3oKKyAgMzkuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2FyY2hpdmVzL2NrdTIxMS50YXIKKyAgNDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NworICA0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g1CisgIDQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDUKKyAgNDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MTYKKyAgNDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN0b3AKKyAgNDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworICA0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gzCisgIDQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDEKKyAgNDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NQorICA0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI1gxMAorICA1MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gxMQorICA1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gxMAorICA1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gzCisgIDUzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2s4MHBhY2thZ2VzLmh0bWwKKyAgNTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MTAKKyAgNTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN0b3AKKyAgNTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworICA1Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g0CisgIDU4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDIKKyAgNTkuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Jpbi8KKyAgNjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9jazgwYmluYXJpZXMuaHRtbAorICA2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g3CisgIDYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjYnVpbGQKKyAgNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NQorICA2NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g0CisgIDY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQKKyAgNjYuIG1haWx0bzprZXJtaXRAY29sdW1iaWEuZWR1CisgIDY3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjdG9wCisgIDY4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjY29udGVudHMKKyAgNjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NQorICA3MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gzCisgIDcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDgKKyAgNzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OQorICA3My4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvbWFrZWZpbGUKKyAgNzQuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrcGtlci5taworICA3NS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1YnNkLm1haworICA3Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g1CisgIDc3LiBtYWlsdG86a2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1CisgIDc4LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9tYWtlZmlsZQorICA3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g3CisgIDgwLiBtYWlsdG86a2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1CisgIDgxLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9tYWtlZmlsZQorICA4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g1LjQKKyAgODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MTAKKyAgODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MTEKKyAgODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NQorICA4Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2lrc2QuaHRtbAorICA4Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorICA4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgIDg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQuMQorICA5MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sCisgIDkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQuMQorICA5Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g0LjIKKyAgOTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NC4zCisgIDk0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQuNAorICA5NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g0LjUKKyAgOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbAorICA5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sI3g4CisgIDk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaWtzZC5odG1sCisgIDk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaWtzZC5odG1sCisgMTAwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3VmaW8uYworIDEwMS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1ZmlvLmMKKyAxMDIuIG1haWx0bzprZXJtaXQtc3VwcG9ydEBjb2x1bWJpYS5lZHUKKyAxMDMuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY21haS5jCisgMTA0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDE1CisgMTA1LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V0aW8uYworIDEwNi4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1ZmlvLmMKKyAxMDcuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXRpby5jCisgMTA4LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3VmaW8uYworIDEwOS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjbmV0LmMKKyAxMTAuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY25ldC5jCisgMTExLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V0aW8uYworIDExMi4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjdW5pLmMKKyAxMTMuIG1haWx0bzprZXJtaXQtc3VwcG9ydEBjb2x1bWJpYS5lZHUKKyAxMTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN0b3AKKyAxMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworIDExNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g0CisgMTE3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQuMgorIDExOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g0LjAKKyAxMTkuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L21ha2VmaWxlCisgMTIwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3Vid3IudHh0CisgMTIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwKKyAxMjIuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2Nrd2FydC5jCisgMTIzLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2Nwcm8udworIDEyNC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjcHJvLmMKKyAxMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN0b3AKKyAxMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworIDEyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g0CisgMTI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQuMworIDEyOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g0LjEKKyAxMzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NQorIDEzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDEzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMTMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQKKyAxMzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NC40CisgMTM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQuMgorIDEzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDEzNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMTM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQKKyAxMzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NC41CisgMTQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQuMworIDE0MS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2twa2VyLm1rCisgMTQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjdG9wCisgMTQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjY29udGVudHMKKyAxNDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NAorIDE0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g0LjQKKyAxNDYuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L21ha2VmaWxlCisgMTQ3LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9tYWtlZmlsZQorIDE0OC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjcHJvLncKKyAxNDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN0b3AKKyAxNTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworIDE1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g2CisgMTUyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQKKyAxNTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NS4xCisgMTU0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDUuMgorIDE1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g1LjMKKyAxNTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NS40CisgMTU3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvCisgMTU4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDUuNAorIDE1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g1LjMKKyAxNjAuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L0NPUFlJTkcuVFhUCisgMTYxLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2VybWl0LmluaQorIDE2Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g1LjEKKyAxNjMuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrZXJtb2QuaW5pCisgMTY0LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2VybWl0NzAudHh0CisgMTY1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2s2MG1hbnVhbAorIDE2Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sCisgMTY3LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2VybWl0ODAudHh0CisgMTY4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2s2MG1hbnVhbAorIDE2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ4MC5odG1sCisgMTcwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2Nid3IudHh0CisgMTcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwKKyAxNzIuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdWJ3ci50eHQKKyAxNzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbAorIDE3NC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1aW5zLnR4dAorIDE3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sCisgMTc2LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2NjZmcudHh0CisgMTc3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwKKyAxNzguIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrY3BsbS50eHQKKyAxNzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbAorIDE4MC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2FfY2VydHMucGVtCisgMTgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDE2IgorIDE4Mi4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvbWFrZWZpbGUKKyAxODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4PworIDE4NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gxMQorIDE4NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g1LjIKKyAxODYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwjZG93bmxvYWQKKyAxODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9jazgwYmluYXJpZXMuaHRtbAorIDE4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbCNkb3dubG9hZAorIDE4OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDE5MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMTkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDcKKyAxOTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NQorIDE5My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDE5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMTk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDgKKyAxOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4NgorIDE5Ny4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1dGlvLmMKKyAxOTguIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXRpby5jCisgMTk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQuMAorIDIwMC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjZGViLmgKKyAyMDEuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdWZpby5jCisgMjAyLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3VmaW8uYworIDIwMy4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1dGlvLmMKKyAyMDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MTAKKyAyMDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbCN4MgorIDIwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sCisgMjA3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDQKKyAyMDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MTAKKyAyMDkuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXRpby5jCisgMjEwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V0aW8uYworIDIxMS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1dGlvLmMKKyAyMTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS40CisgMjEzLiBtYWlsdG86a2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1CisgMjE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjdG9wCisgMjE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjY29udGVudHMKKyAyMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OQorIDIxNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g3CisgMjE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjY2ZnLmh0bWwKKyAyMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbAorIDIyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDIyMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMjIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDEwCisgMjIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDgKKyAyMjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS4xCisgMjI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuMS4xCisgMjI2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuMS4yCisgMjI3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuMS4zCisgMjI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuMgorIDIyOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5LjMKKyAyMzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS40CisgMjMxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuNQorIDIzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5LjYKKyAyMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS43CisgMjM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuOAorIDIzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5LjkKKyAyMzYuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXRpby5jCisgMjM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjdG9wCisgMjM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkKKyAyMzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworIDI0MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5LjIKKyAyNDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS4xLjEKKyAyNDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS4xLjIKKyAyNDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS4xLjMKKyAyNDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN0b3AKKyAyNDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworIDI0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5CisgMjQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuMQorIDI0OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5LjEuMworIDI0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5LjEuMQorIDI1MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDI1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMjUyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkKKyAyNTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS4xCisgMjU0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuMgorIDI1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5LjEuMgorIDI1Ni4gaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1LworIDI1Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5LjEuMQorIDI1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDI1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMjYwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkKKyAyNjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS4xCisgMjYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuMworIDI2My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5LjEKKyAyNjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN0b3AKKyAyNjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworIDI2Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5CisgMjY3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuNAorIDI2OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5LjIKKyAyNjkuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdWZpby5jCisgMjcwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V0aW8uYworIDI3MS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1ZmlvLmMKKyAyNzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN0b3AKKyAyNzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworIDI3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5CisgMjc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuNQorIDI3Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5LjMKKyAyNzcuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXRpby5jCisgMjc4LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2NkZWIuaAorIDI3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDI4MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMjgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkKKyAyODIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS42CisgMjgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuNAorIDI4NC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tjZGViLmgKKyAyODUuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXVzMy5jCisgMjg2LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3V0aW8uYworIDI4Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDI4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMjg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkKKyAyOTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS43CisgMjkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuNQorIDI5Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDI5My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMjk0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkKKyAyOTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS44CisgMjk2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuNgorIDI5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDI5OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMjk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkKKyAzMDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4OS45CisgMzAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuNworIDMwMi4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1dGlvLmMKKyAzMDMuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXRpby5jCisgMzA0LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2NkZWIuaAorIDMwNS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2t1ZmlvLmMKKyAzMDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN0b3AKKyAzMDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworIDMwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3g5CisgMzA5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDEwCisgMzEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkuOAorIDMxMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDMxMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMzEzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDExCisgMzE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDkKKyAzMTUuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXRpby5jCisgMzE2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDExCisgMzE3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjdG9wCisgMzE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjY29udGVudHMKKyAzMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MTIKKyAzMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MTAKKyAzMjEuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXRpby5jCisgMzIyLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja3VmaW8uYworIDMyMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDMyNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMzI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDEzCisgMzI2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDExCisgMzI3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjdG9wCisgMzI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjY29udGVudHMKKyAzMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MTQKKyAzMzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MTIKKyAzMzEuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdWJ3ci50eHQKKyAzMzIuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L2NrdXRpby5jCisgMzMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjdG9wCisgMzM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjY29udGVudHMKKyAzMzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MTUKKyAzMzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN4MTMKKyAzMzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN0b3AKKyAzMzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworIDMzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gxNgorIDM0MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gxNAorIDM0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2lrc2QuaHRtbCN4NC4yCisgMzQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaWtzZC5odG1sCisgMzQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDIuaHRtbAorIDM0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDM0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMzQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDE3CisgMzQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwjeDE1CisgMzQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtbAorIDM0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NlY3VyaXR5ODAuaHRtbAorIDM1MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2N1aWtzZC5odG1sCisgMzUxLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9jYV9jZXJ0cy5wZW0KKyAzNTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCN0b3AKKyAzNTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbCNjb250ZW50cworIDM1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3gxNgorIDM1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NrZXJtaXQuaHRtbAorIDM1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI3RvcAorIDM1Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sI2NvbnRlbnRzCisgMzU4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMzU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2s4MC5odG1sCisgMzYwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaW5kZXguaHRtbApkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdWtlci5uciBiL2NrZXJtaXQtOC4wLjIxMS9ja3VrZXIubnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2ODAxZAotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja3VrZXIubnIKQEAgLTAsMCArMSwxODI3IEBACisuXCIgQCgjKSBrZXJtaXQuMSA4LjAuMjExIDIwMDQvMDQvMTAgQ29sdW1iaWEgVW5pdmVyc2l0eQorLlRIIEtFUk1JVCAxICJBUFJJTCAyMDA0IiAiVXNlciBNYW51YWxzIgorLm5hCisuU0ggTkFNRQora2VybWl0IFwtCisuQiBDLUtlcm1pdCA4LjA6Cit0cmFuc3BvcnQtIGFuZCBwbGF0Zm9ybS1pbmRlcGVuZGVudAoraW50ZXJhY3RpdmUgYW5kIHNjcmlwdGFibGUgY29tbXVuaWNhdGlvbnMgc29mdHdhcmUuCisuSVAKKworVGhpcyBkb2N1bWVudCBpcyBpbnRlbmRlZCB0byBnaXZlIHRoZSBiZWdpbm5lciBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIG1ha2UKK2Jhc2ljIChpZiBub3QgYWR2YW5jZWQpIHVzZSBvZiBDLUtlcm1pdCA4LjAuICBBbHRob3VnaCBpdCBtaWdodCBiZSByYXRoZXIgbG9uZworZm9yIGEgVW5peCBtYW51YWwgcGFnZSwgaXQncyBzdGlsbCBmYXIgc2hvcnRlciB0aGFuIHRoZSBDLUtlcm1pdCBtYW51YWwsIHdoaWNoCitzaG91bGQgYmUgY29uc3VsdGVkIGZvciBhZHZhbmNlZCB0b3BpY3Mgc3VjaCBhcyBjdXN0b21pemF0aW9uLCBjaGFyYWN0ZXItc2V0cywKK3NjcmlwdGluZywgZXRjLiBXZSBhbHNvIGF0dGVtcHQgdG8gcHJvdmlkZSBhIGNsZWFyIHN0cnVjdHVyYWwgb3ZlcnZpZXcgb2YKK0MtS2VybWl0J3MgbWFueSBjYXBhYmlsaXRpZXMsIGZ1bmN0aW9uYWwgYXJlYXMsIHN0YXRlcywgYW5kIG1vZGVzIGFuZCB0aGVpcgoraW50ZXJyZWxhdGlvbiwgdGhhdCBzaG91bGQgYmUgaGVscGZ1bCB0byBiZWdpbm5lcnMgYW5kIHZldGVyYW5zIGFsaWtlLCBhcyB3ZWxsCithcyB0byB0aG9zZSB1cGdyYWRpbmcgdG8gdmVyc2lvbiA4LjAgZnJvbSBlYXJsaWVyIHJlbGVhc2VzLgorLlBQCitUaGlzIGRvY3VtZW50IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgV2ViIHBhZ2UgYXQ6CisuSVAKK2h0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sCisuU0ggREVTQ1JJUFRJT04KK0MtS2VybWl0IGlzIGFuIGFsbC1wdXJwb3NlIGNvbW11bmljYXRpb25zIHNvZnR3YXJlIHBhY2thZ2UgZnJvbSB0aGUgS2VybWl0CitQcm9qZWN0IGF0IENvbHVtYmlhIFVuaXZlcnNpdHkgdGhhdDoKKy5QUAorLm5mCitcKGJ1CUlzIHBvcnRhYmxlIHRvIG1hbnkgcGxhdGZvcm1zLCBVbml4IGFuZCBub24tVW5peCBhbGlrZS4KKy5icgorXChidQlDYW4gbWFrZSBib3RoIHNlcmlhbCBhbmQgbmV0d29yayBjb25uZWN0aW9ucy4KKy5icgorXChidQlDYW4gY29uZHVjdCBpbnRlcmFjdGl2ZSB0ZXJtaW5hbCBzZXNzaW9ucyBvdmVyIGl0cyBjb25uZWN0aW9uLgorLmJyCitcKGJ1CUNhbiB0cmFuc2ZlciB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBvdmVyIHRoZSBzYW1lIGNvbm5lY3Rpb24uCisuYnIKK1woYnUJQ2FuIGNvbnZlcnQgY2hhcmFjdGVyIHNldHMgaW4gdGhlIHRlcm1pbmFsIHNlc3Npb24uCisuYnIKK1woYnUJQ2FuIGNvbnZlcnQgY2hhcmFjdGVyIHNldHMgZHVyaW5nIHRleHQtZmlsZSBmaWxlIHRyYW5zZmVyLgorLmJyCitcKGJ1CUlzIGN1c3RvbWl6YWJsZSBpbiBldmVyeSBhc3BlY3Qgb2YgaXRzIG9wZXJhdGlvbi4KKy5maQorLlBQCitDLUtlcm1pdCBpcyBhIG1vZGVtIHByb2dyYW0sIGEgVGVsbmV0IGNsaWVudCwgYW4gUmxvZ2luIGNsaWVudCwgYW4gRlRQCitjbGllbnQsIGFuIEhUVFAgY2xpZW50LCBhbmQgb24gc2VsZWN0ZWQgcGxhdGZvcm1zLCBhbHNvIGFuIFguMjUgY2xpZW50LiBJdAorY2FuIG1ha2UgaXRzIG93biBzZWN1cmUgSW50ZXJuZXQgY29ubmVjdGlvbnMgdXNpbmcgSUVURi1hcHByb3ZlZCBzZWN1cml0eQorbWV0aG9kcyBpbmNsdWRpbmcgS2VyYmVyb3MgSVYsIEtlcmJlcm9zIFYsIFNTTC9UTFMsIGFuZCBTUlAgYW5kIGl0IGNhbiBhbHNvCittYWtlIFNTSCBjb25uZWN0aW9ucyB0aHJvdWdoIHlvdXIgZXh0ZXJuYWwgU1NIIGNsaWVudCBhcHBsaWNhdGlvbi4gSXQgY2FuCitiZSB0aGUgZmFyLWVuZCBmaWxlLXRyYW5zZmVyIG9yIGNsaWVudC9zZXJ2ZXIgcGFydG5lciBvZiB5b3VyIGRlc2t0b3AKK0tlcm1pdCBjbGllbnQuIEl0IGNhbiBhbHNvIGFjY2VwdCBpbmNvbWluZyBkaWFsZWQgYW5kIG5ldHdvcmsgY29ubmVjdGlvbnMuCitJdCBjYW4gZXZlbiBiZSBpbnN0YWxsZWQgYXMgYW4gSW50ZXJuZXQgc2VydmljZSBvbiBpdHMgb3duIHN0YW5kYXJkIFRDUAorc29ja2V0LCAxNjQ5IFtSRkMyODM5LCBSRkMyODQwXS4KKy5QUAorQW5kIHBlcmhhcHMgbW9zdCBpbXBvcnRhbnQsIGV2ZXJ5dGhpbmcgeW91IGNhbiBkbyAiYnkgaGFuZCIgKGludGVyYWN0aXZlbHkpCit3aXRoIEMtS2VybWl0LCBjYW4gYmUgInNjcmlwdGVkIiAoYXV0b21hdGVkKSB1c2luZyBpdHMgYnVpbHQtaW4KK2Nyb3NzLXBsYXRmb3JtIHRyYW5zcG9ydC1pbmRlcGVuZGVudCBzY3JpcHQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIHdoaWNoCitoYXBwZW5zIHRvIGJlIGlkZW50aWNhbCB0byBpdHMgaW50ZXJhY3RpdmUgY29tbWFuZCBsYW5ndWFnZS4KKy5QUAorVGhpcyBtYW51YWwgcGFnZSBvZmZlcnMgYW4gb3ZlcnZpZXcgb2YgQy1LZXJtaXQgOC4wIGZvciBVbml4ICgiVW5peCIgaXMgYW4KK29wZXJhdGluZyBzeXN0ZW0gZmFtaWx5IHRoYXQgaW5jbHVkZXMgQUlYLCBERy9VWCwgRnJlZUJTRCwgSFAtVVgsIElSSVgsCitMaW51eCwgTWFjIE9TIFgsIE5ldEJTRCwgT3BlbkJTRCwgT3BlbiBTZXJ2ZXIsIE9wZW4gVW5peCwgUU5YLCBTb2xhcmlzLAorU3VuT1MsIFN5c3RlbSBWIFIzLCBTeXN0ZW0gViBSNCwgVHJ1NjQgVW5peCwgVW5peHdhcmUsIFhlbml4LCBhbmQgbWFueQorb3RoZXJzKS4gRm9yIHRob3JvdWdoIGNvdmVyYWdlLCBwbGVhc2UgY29uc3VsdCB0aGUgcHVibGlzaGVkIEMtS2VybWl0CittYW51YWwgYW5kIHN1cHBsZW1lbnRzIChzZWUgRE9DVU1FTlRBVElPTiBiZWxvdykuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uCithYm91dCBDLUtlcm1pdCwgS2VybWl0IHNvZnR3YXJlIGZvciBvdGhlciBwbGF0Zm9ybXMsIGFuZCBLZXJtaXQgbWFudWFscywKK3Zpc2l0IHRoZSBLZXJtaXQgUHJvamVjdCB3ZWJzaXRlOgorLlBQCisgIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKy5QUAorVGhpcyBpcyBhIGxvbmdlci10aGFuLWF2ZXJhZ2UgbWFudWFsIHBhZ2UsIGFuZCB5ZXQgaXQgYmFyZWx5IHNjcmF0Y2hlcyB0aGUKK3N1cmZhY2UuIERvbid0IGJlIGRhdW50ZWQuIEMtS2VybWl0IGlzIGEgbGFyZ2UgYW5kIGNvbXBsZXggcGFja2FnZSwKK2V2b2x2aW5nIG92ZXIgZGVjYWRlcyBvZiBwcmFjdGljZSBhbmQgZXhwZXJpZW5jZSwgYnV0IHRoYXQgZG9lc24ndCBtZWFuCitpdCdzIGhhcmQgdG8gbGVhcm4gb3IgdXNlLiBJdHMgbW9zdCBjb21tb25seSB1c2VkIGZ1bmN0aW9ucyBhcmUgZXhwbGFpbmVkCitoZXJlIHdpdGggcG9pbnRlcnMgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBlbHNld2hlcmUuCisuU0ggU1lOT1BTSVMKKy5CIGtlcm1pdCBbCisuSSBmaWxlbmFtZQorLkIgXSBbCisuSSBvcHRpb25zCisuQiBdIFsgez0sLS0sK30KKy5JIHRleHQKKy5CIF0gXQorLlBQCitvcjoKKy5QUAorLkIga2VybWl0IAorLkkgVVJMCisuUFAKK0lmIHRoZSBmaXJzdCBjb21tYW5kLWxpbmUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgYSBmaWxlLCBpbnRlcmFjdGl2ZS1tb2RlCitjb21tYW5kcyBhcmUgZXhlY3V0ZWQgZnJvbSB0aGUgZmlsZS4gVGhlICc9JyAob3IgIi0tIikgYXJndW1lbnQgdGVsbHMKK0tlcm1pdCBub3QgdG8gcGFyc2UgdGhlIHJlbWFpbmRlciBvZiB0aGUgY29tbWFuZCBsaW5lLCBidXQgdG8gbWFrZSB0aGUKK3dvcmRzIGZvbGxvd2luZyAnPScgYXZhaWxhYmxlIGFzIFxlJTEsIFxlJTIsIC4uLiBcZSU5LiBUaGUgIisiIGFyZ3VtZW50IGlzCitsaWtlICI9IiBidXQgZm9yIHVzZSBpbiAia2VyYmFuZyBzY3JpcHRzIiAoZXhwbGFpbmVkIGJlbG93KS4gQSBzZWNvbmQKK2NvbW1hbmQtbGluZSBmb3JtYXQgYWxsb3dzIHRoZSBvbmUgYW5kIG9ubHkgYXJndW1lbnQgdG8gYmUgYSBUZWxuZXQsIEZUUCwKK0hUVFAsIG9yIElLU0QgVVJMLgorLlBQCitPcmRlciBvZiBleGVjdXRpb246CisuVFAKKyAxLgorVGhlIGNvbW1hbmQgZmlsZSAoaWYgYW55KS4KKy5UUAorLm5mCisgMi4KK1RoZSBpbml0aWFsaXphdGlvbiBmaWxlLCBpZiBhbnksIHVubGVzcyBzdXBwcmVzc2VkIHdpdGggLVkuCisuZmkKKy5UUAorIDMuCitUaGUgY3VzdG9taXphdGlvbiBmaWxlIChpZiBpdCBpcyBleGVjdXRlZCBieSB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZSkuCisuVFAKKyA0LgorVGhlIGNvbW1hbmQtbGluZSBVUkwgKGlmIGFueSwgYW5kIGlmIHNvLCBleGVjdXRpb24gc3RvcHMgaGVyZSkuCisuVFAKKyA1LgorQ29tbWFuZC1saW5lIG9wdGlvbnMgKGlmIGFueSkuCisuVFAKKyA2LgorSW50ZXJhY3RpdmUgY29tbWFuZHMuCisuUFAKK1NvbWUgY29tbWFuZC1saW5lIG9wdGlvbnMgY2FuIGNhdXNlIGFjdGlvbnMgKHN1Y2ggYXMgLXMgdG8gc2VuZCBhIGZpbGUpOworb3RoZXJzIGp1c3Qgc2V0IHBhcmFtZXRlcnMuIElmIGFueSBhY3Rpb24gb3B0aW9ucyBhcmUgaW5jbHVkZWQgb24gdGhlCitjb21tYW5kIGxpbmUsIEtlcm1pdCBleGl0cyB3aGVuIGZpbmlzaGVkIHVubGVzcyBhbHNvIGdpdmVuIHRoZSAtUyAoInN0YXkiKQorb3B0aW9uLiBJZiBubyBhY3Rpb24gb3B0aW9ucyBhcmUgZ2l2ZW4sIG5vIGluaXRpYWxpemF0aW9uIG9yIGNvbW1hbmQgZmlsZXMKK2NvbnRhaW5lZCBhbiBFWElUIG9yIFFVSVQgY29tbWFuZCwgYW5kIG5vIGZhdGFsIGVycm9ycyBvY2N1cnJlZCwgS2VybWl0Citpc3N1ZXMgaXRzIHByb21wdCBhbmQgd2FpdHMgZm9yIHlvdSB0byB0eXBlIGNvbW1hbmRzLgorLklQCitCZWFyIGluIG1pbmQgdGhhdCBDLUtlcm1pdCBjYW4gYmUgYnVpbHQgd2l0aCBzZWxlY3RlZCBmZWF0dXJlcworZGlzYWJsZWQsIGFuZCBhbHNvIHRoYXQgY2VydGFpbiBmZWF0dXJlcyBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwKK3BsYXRmb3Jtcy4gRm9yIGV4YW1wbGUsIEMtS2VybWl0IGNhbid0IGJlIGJ1aWx0IHdpdGggVENQL0lQCitzdXBwb3J0IG9uIGEgcGxhdGZvcm0gdGhhdCBkb2VzIG5vdCBoYXZlIFRDUC9JUCBoZWFkZXIgZmlsZXMgYW5kCitsaWJyYXJpZXMgKGFuZCBldmVuIGlmIEtlcm1pdCBkb2VzIGluY2x1ZGUgVENQL0lQIHN1cHBvcnQsIGl0CitjYW4ndCBiZSB1c2VkIHRvIG1ha2UgVENQL0lQIGNvbm5lY3Rpb25zIG9uIGEgY29tcHV0ZXIgdGhhdCBkb2VzCitub3QgaGF2ZSBhIFRDUC9JUCBzdGFjayBpbnN0YWxsZWQpLiBJZiB5b3VyIHZlcnNpb24gb2YgbGFja3MKK0MtS2VybWl0IGEgZmVhdHVyZSBtZW50aW9uZWQgaGVyZSwgdXNlIGl0cyBTSE9XIEZFQVRVUkVTIGNvbW1hbmQgdG8KK3NlZSB3aGF0IG1pZ2h0IGhhdmUgYmVlbiBleGNsdWRlZC4KKy5QUAorQy1LZXJtaXQgaGFzIHRocmVlIGtpbmRzIG9mIGNvbW1hbmRzOiByZWd1bGFyIHNpbmdsZS1sZXR0ZXIgY29tbWFuZC1saW5lCitvcHRpb25zLCBleHRlbmRlZC1mb3JtYXQgY29tbWFuZC1saW5lIG9wdGlvbnMsIGFuZCBpbnRlcmFjdGl2ZSBjb21tYW5kcy4KKy5QUAorTGlrZSBtb3N0IFVuaXggY29tbWFuZHMsIEMtS2VybWl0IGNhbiBiZSBiZSBnaXZlbiBvcHRpb25zIG9uIHRoZSBjb21tYW5kCitsaW5lLiBCdXQgQy1LZXJtaXQgYWxzbyBjYW4gYmUgdXNlZCBpbnRlcmFjdGl2ZWx5IGJ5IGdpdmluZyBpdCBjb21tYW5kcworY29tcG9zZWQgb2Ygd29yZHMsIHdoaWNoIGFyZSBtb3JlIGludHVpdGl2ZSB0aGFuIGNyeXB0aWMgY29tbWFuZC1saW5lCitvcHRpb25zLCBhbmQgbW9yZSBmbGV4aWJsZSB0b28uIEluIG90aGVyIHdvcmRzLCB5b3UgZG9uJ3QgaGF2ZSB0byB1c2UKK0MtS2VybWl0J3MgY29tbWFuZC1saW5lIG9wdGlvbnMsIGJ1dCB0aGV5IGFyZSBhdmFpbGFibGUgaWYgeW91IHdhbnQgdG8uIChCeQordGhlIHNhbWUgdG9rZW4sIHlvdSBkb24ndCBoYXZlIHRvIHVzZSBpdHMgaW50ZXJhY3RpdmUgY29tbWFuZHMgZWl0aGVyIC0tCit5b3UgY2FuIHVzZSBlaXRoZXIgb3IgYm90aCBpbiBhbnkgY29tYmluYXRpb24uKQorLlBQCitDLUtlcm1pdCBpcyBnZW5lcmFsbHkgaW5zdGFsbGVkIGluIHRoZSBQQVRIIGFzICJrZXJtaXQiLCBhbmQgdGhlcmVmb3JlIGlzCitpbnZva2VkIGJ5IHR5cGluZyB0aGUgd29yZCAia2VybWl0IiAobG93ZXJjYXNlKSBhdCB0aGUgc2hlbGwgcHJvbXB0LCBhbmQKK3RoZW4gcHJlc3NpbmcgdGhlIFJldHVybiBvciBFbnRlciBrZXkuIElmIHlvdSB3aXNoIHRvIGluY2x1ZGUgY29tbWFuZC1saW5lCitvcHRpb25zLCBwdXQgdGhlbSBhZnRlciB0aGUgd29yZCAia2VybWl0IiBidXQgYmVmb3JlIHByZXNzaW5nIFJldHVybiBvcgorRW50ZXIsIHNlcGFyYXRlZCBieSBzcGFjZXMsIGZvciBleGFtcGxlOgorLlBQCisgICQga2VybWl0IC1zIGNrZXJtaXQudGFyLmd6CisuUFAKKygnJCcgaXMgdGhlIHNoZWxsIHByb21wdDsgImtlcm1pdCAtcyBja2VybWl0LnRhci5neiIgaXMgd2hhdCB5b3UgdHlwZSwKK2ZvbGxvd2VkIGJ5IFJldHVybiBvciBFbnRlci4pCisuU0ggT1BUSU9OUworSGVyZSBpcyBhIGxpc3Qgb2YgQy1LZXJtaXQncyBzaW5nbGUtbGV0dGVyIGNvbW1hbmQtbGluZSBvcHRpb25zLCB3aGljaAorc3RhcnQgd2l0aCBhIHNpbmdsZSBkYXNoICgtKSwgaW4gQVNDSUkgKCJhbHBoYWJldGljYWwiKSBvcmRlci4gQWxwaGFiZXRpYworY2FzZSBpcyBzaWduaWZpY2FudCAoLUEgaXMgbm90IHRoZSBzYW1lIGFzIC1hKS4gIEFjdGlvbiBvcHRpb25zIGFyZSAKK3RhZ2dlZCAiQUNUSU9OIi4KKy5UUAorLTAKKyhkaWdpdCB6ZXJvKSAgMTAwJSB0cmFuc3BhcmVudCBDb25uZWN0IHN0YXRlIGZvcgorImluLXRoZS1taWRkbGUiIG9wZXJhdGlvbjogOCBiaXRzLCBubyBwYXJpdHksIG5vCitlc2NhcGUgY2hhcmFjdGVyLCBldmVyeXRoaW5nIHBhc3NlcyB0aHJvdWdoLgorLlRQCistOAorKGRpZ2l0IGVpZ2h0KSAgQ29ubmVjdGlvbiBpcyA4LWJpdCBjbGVhbiAodGhpcyBpcyB0aGUKK2RlZmF1bHQgaW4gQy1LZXJtaXQgOC4wKS4gRXF1aXZhbGVudCB0byB0aGUgRUlHSFRCSVQKK2NvbW1hbmQsIHdoaWNoIGluIHR1cm4gaXMgYSBzaG9ydGN1dCBmb3IgU0VUIFRFUk1JTkFMCitCWVRFU0laRSA4LCBTRVQgQ09NTUFORCBCWVRFU0laRSA4LCBTRVQgUEFSSVRZIE5PTkUuCisuVFAKKy05IGFyZworKGRpZ2l0IG5pbmUpICBNYWtlIGEgY29ubmVjdGlvbiB0byBhbiBGVFAgc2VydmVyLgorRXF1aXZhbGVudCB0byB0aGUgRlRQIE9QRU4gY29tbWFuZC4KK0FyZ3VtZW50OiBJUC1hZGRyZXNzLW9yLWhvc3RuYW1lWzpvcHRpb25hbC1UQ1AtcG9ydF0uCitOT1RFOiBDLUtlcm1pdCBhbHNvIGhhcyBhIHNlcGFyYXRlIEZUUCBjb21tYW5kLWxpbmUKK3BlcnNvbmFsaXR5LCB3aXRoIHJlZ3VsYXIgRlRQLWxpa2UgY29tbWFuZC1saW5lCitzeW50YXguIE1vcmUgYWJvdXQgdGhpcyBiZWxvdy4KKy5UUAorLUEKK0tlcm1pdCBpcyB0byBiZSBzdGFydGVkIGFzIGFuIEludGVybmV0IHNlcnZpY2UgKElLU0QpCisob25seSBmcm9tIGluZXRkLmNvbmYpLgorLlRQCistQgorS2VybWl0IGlzIHJ1bm5pbmcgaW4gQmF0Y2ggb3IgQmFja2dyb3VuZCAobm8KK2NvbnRyb2xsaW5nIHRlcm1pbmFsKS4gVG8gYmUgdXNlZCBpbiBjYXNlIEtlcm1pdAorZG9lc24ndCBhdXRvbWF0aWNhbGx5IHNlbnNlIGl0cyBiYWNrZ3JvdW5kIHN0YXR1cy4KK0VxdWl2YWxlbnQgdG8gdGhlIFNFVCBCQUNLR1JPVU5EIE9OIGNvbW1hbmQuCisuVFAKKy1DIGFyZworSW50ZXJhY3RpdmUtbW9kZSBDb21tYW5kcyB0byBiZSBleGVjdXRlZC4KK0FyZ3VtZW50OiBDb21tYW5kcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBsaXN0IGluCitkb3VibGVxdW90ZXMuCisuVFAKKy1EIGFyZworRGVsYXkgYmVmb3JlIHN0YXJ0aW5nIHRvIHNlbmQgaW4gUmVtb3RlIG1vZGUuCitFcXVpdmFsZW50IHRvIHRoZSBTRVQgREVMQVkgY29tbWFuZC4KK0FyZ3VtZW50OiBOdW1iZXIgb2Ygc2Vjb25kcy4KKy5UUAorLUUKK0V4aXQgYXV0b21hdGljYWxseSB3aGVuIGNvbm5lY3Rpb24gY2xvc2VzLiBFcXVpdmFsZW50Cit0byBTRVQgRVhJVCBPTi1ESVNDT05ORUNUIE9OLgorLlRQCistRiBhcmcKK1VzZSBhbiBvcGVuIFRDUCBjb25uZWN0aW9uLgorQXJndW1lbnQ6IE51bWVyaWMgZmlsZSBkZXNjcmlwdG9yIG9mIG9wZW4gVENQCitjb25uZWN0aW9uLgorQWxzbyBzZWU6IC1qLCAtSi4KKy5UUAorLUcgYXJnCisoQUNUSU9OKSBHZXQgZmlsZShzKSBmcm9tIHNlcnZlciwgc2VuZCBjb250ZW50cyB0byBzdGFuZGFyZAorb3V0cHV0LCB3aGljaCBub3JtYWxseSB3b3VsZCBiZSBwaXBlZCB0byBhbm90aGVyCitwcm9jZXNzLgorQXJndW1lbnQ6IFJlbW90ZSBmaWxlIHNwZWNpZmljYXRpb24sIGluIHF1b3RlcyBpZiBpdAorY29udGFpbnMgbWV0YWNoYXJhY3RlcnMuCitBbHNvIHNlZTogLWcsIC1rLgorLlRQCistSAorU3VwcHJlc3MgcHJvZ3JhbSBzdGFydHVwIEhlcmFsZCBhbmQgZ3JlZXRpbmcuCisuVFAKKy1JCitUZWxsIEtlcm1pdCBpdCBoYXMgYSByZWxpYWJsZSBjb25uZWN0aW9uLCB0byBmb3JjZSBzdHJlYW1pbmcgdG8gYmUgdXNlZCB3aGVyZQoraXQgbm9ybWFsbHkgd291bGQgbm90IGJlLiAgRXF1aXZhbGVudCB0byB0aGUgU0VUIFJFTElBQkxFIE9OIGNvbW1hbmQuCisuVFAKKy1KIGFyZworKEFDVElPTikgIkJlIGxpa2UgVGVsbmV0LiIgTGlrZSAtaiBidXQgaW1wbGllcyAtRS4gIEFyZ3VtZW50OiBJUAoraG9zdG5hbWUvYWRkcmVzcyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IHNlcnZpY2UuICBOT1RFOiBDLUtlcm1pdCBhbHNvIGhhcyBhCitzZXBhcmF0ZSBUZWxuZXQgY29tbWFuZC1saW5lIHBlcnNvbmFsaXR5LCB3aXRoIHJlZ3VsYXIgVGVsbmV0LWxpa2UKK2NvbW1hbmQtbGluZSBzeW50YXguIE1vcmUgYWJvdXQgdGhpcyBiZWxvdy4KKy5UUAorLUwKK1JlY3Vyc2l2ZSBkaXJlY3RvcnkgZGVzY2VudCBmb3IgZmlsZXMgaW4gLXMgb3B0aW9uLgorLlRQCistTSBhcmcKK015IHVzZXIgbmFtZSAoZm9yIHVzZSB3aXRoIFRlbG5ldCwgUmxvZ2luLCBGVFAsIGV0YykuCitFcXVpdmFsZW50IHRvIHRoZSBTRVQgTE9HSU4gVVNFUiBjb21tYW5kLgorQXJndW1lbnQ6IFVzZXJuYW1lIHN0cmluZy4KKy5UUAorLU8KKyhBQ1RJT04pIChVcHBlcmNhc2UgbGV0dGVyIE8pIEJlIGEgc2VydmVyIGZvciBPbmUgY29tbWFuZCBvbmx5LgorQWxzbyBzZWU6IC14LgorLlRQCistUAorRG9uJ3QgY29udmVydCBmaWxlIChQYXRoKSBuYW1lcyBvZiB0cmFuc2ZlcnJlZCBmaWxlcy4KK0VxdWl2YWxlbnQgdG8gU0VUIEZJTEUgTkFNRVMgTElURVJBTC4KKy5UUAorLVEKK1F1aWNrIEtlcm1pdCBwcm90b2NvbCBzZXR0aW5ncy4gRXF1aXZhbGVudCB0byB0aGUgRkFTVAorY29tbWFuZC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBpbiBDLUtlcm1pdCA3LjAgYW5kIGxhdGVyLgorLlRQCistUgorUmVtb3RlLW9ubHkgKHRoaXMganVzdCBtYWtlcyBJRiBSRU1PVEUgdHJ1ZSkuCisuVFAKKy1TCitTdGF5IChlbnRlciBjb21tYW5kIHBhcnNlciBhZnRlciBhY3Rpb24gb3B0aW9ucykuCisuVFAKKy1UCitGb3JjZSBUZXh0IG1vZGUgZm9yIGZpbGUgdHJhbnNmZXI7IGltcGxpZXMgLVYuCitFcXVpdmFsZW50IHRvIFNFVCBUUkFOU0ZFUiBNT0RFIE1BTlVBTCwgU0VUIEZJTEUgVFlQRSBURVhULgorLlRQCistVgorRGlzYWJsZSBhdXRvbWF0aWMgcGVyLWZpbGUgdGV4dC9iaW5hcnkgc3dpdGNoaW5nLgorRXF1aXZhbGVudCB0byBTRVQgVFJBTlNGRVIgTU9ERSBNQU5VQUwuCisuVFAKKy1ZCitTa2lwIChkb24ndCBleGVjdXRlKSB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZS4KKy5UUAorLWEgYXJnCitBcy1uYW1lIGZvciBmaWxlKHMpIGluIC1zLCAtciwgb3IgLWcuCitBcmd1bWVudDogQXMtbmFtZSBzdHJpbmcgKGFsdGVybmF0aXZlIGZpbGVuYW1lKS4gV2hlbgorcmVjZWl2aW5nIGZpbGVzLCB0aGlzIGNhbiBiZSBhIGRpcmVjdG9yeSBuYW1lLgorLlRQCistYiBhcmcKK1NwZWVkIGZvciBzZXJpYWwgZGV2aWNlLiBFcXVpdmFsZW50IHRvIFNFVCBTUEVFRC4KK0FyZ3VtZW50OiBOdW1lcmljIEJpdHMgcGVyIHNlY29uZCBmb3Igc2VyaWFsCitjb25uZWN0aW9ucy4KKy5UUAorLWMKKyhBQ1RJT04pIEVudGVyIENvbm5lY3Qgc3RhdGUgYmVmb3JlIHRyYW5zZmVycmluZyBmaWxlcy4KKy5UUAorLWQKK0NyZWF0ZSBhIGRlYnVnLmxvZyBmaWxlIHdpdGggZGV0YWlsZWQgZGVidWdnaW5nCitpbmZvcm1hdGlvbiAoYSBzZWNvbmQgLWQgYWRkcyB0aW1lc3RhbXBzKS4gRXF1aXZhbGVudAordG8gTE9HIERFQlVHIGJ1dCB0YWtlcyBlZmZlY3Qgc29vbmVyLgorLlRQCistZSBhcmcKK01heGltdW0gbGVuZ3RoIGZvciBpbmNvbWluZyBLZXJtaXQgZmlsZS10cmFuc2ZlcgorcGFja2V0cy4gRXF1aXZhbGVudCB0byBTRVQgUkVDRUlWRSBQQUNLRVQtTEVOR1RILgorQXJndW1lbnQ6IExlbmd0aCBpbiBieXRlcy4KKy5UUAorLWYKKyhBQ1RJT04pIFNlbmQgYSBGSU5JU0ggY29tbWFuZCB0byBhIEtlcm1pdCBzZXJ2ZXIuCisuVFAKKy1nIGFyZworR2V0IGZpbGUocykgZnJvbSBhIEtlcm1pdCBzZXJ2ZXIuCitBcmd1bWVudDogRmlsZSBzcGVjaWZpY2F0aW9uIG9uIG90aGVyIGNvbXB1dGVyLCBpbgorcXVvdGVzIGlmIGl0IGNvbnRhaW5zIG1ldGFjaGFyYWN0ZXJzLiBFcXVpdmFsZW50IHRvCitHRVQuIEFsc28gc2VlOiAtYSwgLUcsIC1yLgorLlRQCistaAorKEFDVElPTikgUHJpbnQgSGVscCB0ZXh0IGZvciBzaW5nbGUtbGV0dGVyIGNvbW1hbmQtbGluZSBvcHRpb25zCisocGlwZSB0aHJ1ICdtb3JlJyB0byBwcmV2ZW50IHNjcm9sbGluZykuCisuVFAKKy1pCitGb3JjZSBiaW5hcnkgKEltYWdlKSBtb2RlIGZvciBmaWxlIHRyYW5zZmVyOyBpbXBsaWVzCistVi4gRXF1aXZhbGVudCB0byBTRVQgVFJBTlNGRVIgTU9ERSBNQU5VQUwsIFNFVCBGSUxFCitUWVBFIEJJTkFSWS4KKy5UUAorLWogYXJnCitNYWtlIGEgVENQL0lQIGNvbm5lY3Rpb24uCitBcmd1bWVudDogSVAgaG9zdCBuYW1lL2FkZHJlc3MgYW5kIG9wdGlvbmFsIHNlcnZpY2UKK25hbWUgb3IgbnVtYmVyLiBFcXVpdmFsZW50IHRvIHRoZSBURUxORVQgY29tbWFuZC4KK0Fsc28gc2VlOiAtSiwgLUYuCisuVFAKKy1rCisoQUNUSU9OKSBSZWNlaXZlIGZpbGUocykgdG8gc3RhbmRhcmQgb3V0cHV0LCB3aGljaCBub3JtYWxseSAKK3dvdWxkIGJlIHBpcGVkIHRvIGFub3RoZXIgcHJvY2Vzcy4KK0Fsc28gc2VlOiAtciwgLUcuCisuVFAKKy1sIGFyZworKExvd2VyY2FzZSBsZXR0ZXIgTCkgTWFrZSBhIGNvbm5lY3Rpb24gb24gdGhlIGdpdmVuCitzZXJpYWwgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiBFcXVpdmFsZW50IHRvIHRoZSBTRVQKK0xJTkUgKFNFVCBQT1JUKSBjb21tYW5kLgorQXJndW1lbnQ6IFNlcmlhbCBkZXZpY2UgbmFtZSwgZS5nLiAvZGV2L3R0eVMwLgorLlRQCistbSBhcmcKK01vZGVtIHR5cGUgZm9yIHVzZSB3aXRoIHRoZSAtbCBkZXZpY2UuIEVxdWl2YWxlbnQgdG8KK3RoZSBTRVQgTU9ERU0gVFlQRSBjb21tYW5kLgorQXJndW1lbnQ6IE1vZGVtIG5hbWUgYXMgaW4gU0VUIE1PREVNIFRZUEUgY29tbWFuZCwKK2UuZy4gInVzcm9ib3RpY3MiLgorLlRQCistbgorKEFDVElPTikgRW50ZXIgQ29ubmVjdCBzdGF0ZSBhZnRlciB0cmFuc2ZlcnJpbmcgZmlsZXMgKGhpc3RvcmljYWwpLgorLlRQCistcCBhcmcKK1Bhcml0eS4gRXF1aXZhbGVudCB0byB0aGUgU0VUIFBBUklUWSBjb21tYW5kLgorQXJndW1lbnQ6IE9uZSBvZiB0aGUgZm9sbG93aW5nOiBlKHZlbiksIG8oZGQpLCBtKGFyayksCituKG9uZSksIHMocGFjZSkuCisuVFAKKy1xCitRdWlldCAoc3VwcHJlc3MgbW9zdCBtZXNzYWdlcykuIEVxdWl2YWxlbnQgdG8gU0VUIFFVSUVUIE9OLgorLlRQCistcgorKEFDVElPTikgUmVjZWl2ZSBmaWxlKHMpLiBFcXVpdmFsZW50IHRvIHRoZSBSRUNFSVZFIGNvbW1hbmQuCitBcmd1bWVudDogKG5vbmUsIGJ1dCBzZWUgLWEpCisuVFAKKy1zIGFyZworU2VuZCBmaWxlKHMpLgorQXJndW1lbnQ6IE9uZSBvciBtb3JlIGxvY2FsIGZpbGUgc3BlY2lmaWNhdGlvbnMuCitFcXVpdmFsZW50IHRvIHRoZSBTRU5EIGNvbW1hbmQuCitBbHNvIHNlZTogLWEuCisuVFAKKy10CisoSGlzdG9yaWNhbCkgWG9uIChDdHJsLVEpIFR1cm5hcm91bmQgY2hhcmFjdGVyIGZvcgoraGFsZi1kdXBsZXggY29ubmVjdGlvbnMgKHVzZWQgb24gc2VyaWFsIGxpbmVtb2RlCitjb25uZWN0aW9ucyB0byBvbGQgbWFpbmZyYW1lcykuIEVxdWl2YWxlbnQgdG8gU0VUCitEVVBMRVggSEFMRiwgU0VUIEhBTkRTSEFLRSBYT04uCisuVFAKKy12IGFyZworV2luZG93IHNpemUgZm9yIEtlcm1pdCBwcm90b2NvbCAoaWdub3JlZCB3aGVuCitzdHJlYW1pbmcpLiBFcXVpdmFsYW5ldCB0byBTRVQgV0lORE9XLVNJWkUuCitBcmd1bWVudDogTnVtYmVyLCAxIHRvIDMyLgorLlRQCistdworSW5jb21pbmcgZmlsZXMgV3JpdGUgb3ZlciBleGlzdGluZyBmaWxlcy4gRXF1aXZhbGVudAordG8gU0VUIEZJTEUgQ09MTElTSU9OIE9WRVJXUklURS4KKy5UUAorLXgKKyhBQ1RJT04pIEVudGVyIHNlcnZlciBtb2RlLiBFcXVpdmFsZW50IHRvIHRoZSBTRVJWRVIgY29tbWFuZC4KK0Fsc28gc2VlOiAtTy4KKy5UUAorLXkgYXJnCitBbHRlcm5hdGl2ZSBpbml0aWFsaXphdGlvbiBmaWxlLgorQXJndW1lbnQ6IEZpbGVuYW1lLgorLlRQCistegorRm9yY2UgZm9yZWdyb3VuZCBiZWhhdmlvci4gVG8gYmUgdXNlZCBpbiBjYXNlIEtlcm1pdAorZG9lc24ndCBhdXRvbWF0aWNhbGx5IHNlbnNlIGl0cyBmb3JlZ3JvdW5kIHN0YXR1cy4KK0VxdWl2YWxlbnQgdG8gdGhlIFNFVCBCQUNLR1JPVU5EIE9GRiBjb21tYW5kLgorLlBQCitFeHRlbmRlZCBjb21tYW5kLWxpbmUgb3B0aW9ucyAobmVjZXNzYXJ5IGJlY2F1c2Ugc2luZ2xlLWxldHRlciBvbmVzIGFyZQorYWJvdXQgdXNlZCB1cCkgc3RhcnQgd2l0aCB0d28gZGFzaGVzICgtLSksIHdpdGggd29yZHMgcmF0aGVyIHRoYW4gc2luZ2xlCitsZXR0ZXJzIGFzIG9wdGlvbiBuYW1lcy4gSWYgYW4gZXh0ZW5kZWQgb3B0aW9uIHRha2VzIGFuIGFyZ3VtZW50LCBpdCBpcworc2VwYXJhdGVkIGZyb20gdGhlIG9wdGlvbiB3b3JkIGJ5IGEgY29sb24gKDopLiBFeHRlbmRlZCBvcHRpb25zIGluY2x1ZGU6CisKKy5UUAorIC0tYmFubmVyZmlsZTpmaWxlbmFtZQorRmlsZSB0byBkaXNwbGF5IHVwb24gc3RhcnR1cCBvciBJS1NEIGxvZ2luLgorLlRQCisgLS1jZGZpbGU6ZmlsZW5hbWUKK0ZpbGUgdG8gYmUgc2VudCBmb3IgZGlzcGxheSB0byB0aGUgY2xpZW50IHdoZW4KK3NlcnZlciBjaGFuZ2VzIGRpcmVjdG9yeSAoZmlsZW5hbWUgaXMgcmVsYXRpdmUgdG8KK3RoZSBjaGFuZ2VkLXRvIGRpcmVjdG9yeSkuCisuVFAKKyAtLWNkbWVzc2FnZTp7b24sb2ZmfQorRW5hYmxlL2Rpc2FibGUgdGhlIHNlcnZlciBDRCBtZXNzYWdlIGZlYXR1cmUuCisuVFAKKyAtLWhlbHAKK1ByaW50cyB1c2FnZSBtZXNzYWdlIGZvciBleHRlbmRlZCBvcHRpb25zLgorLlRQCisgLS1oZWxwZmlsZTpmaWxlbmFtZQorRGVzaWduYXRlcyBhIGZpbGUgY29udGFpbmluZyBjdXN0b20gdGV4dCB0bworcmVwbGFjZSB0aGUgdG9wLWxldmVsIEhFTFAgY29tbWFuZC4KKy5UUAorIC0tbm9pbnRlcnJ1cHRzCitEaXNhYmxlcyBrZXlib2FyZCBpbnRlcnJ1cHRzLgorLlRQCisgLS1ub3Blcm1zCitEaXNhYmxlcyB0aGUgS2VybWl0IHByb3RvY29sIGZpbGUgUGVybWlzc2lvbnMKK2F0dHJpYnV0ZSwgdG8gcHJldmVudCB0cmFuc21pc3Npb24gb2YgZmlsZQorcGVybWlzc2lvbnMgKHByb3RlY3Rpb24pIGZyb20gc2VuZGVyIHRvIHJlY2VpdmVyLgorLlRQCisgLS12ZXJzaW9uCisoQUNUSU9OKSBDLUtlcm1pdCBwcmludHMgaXRzIHZlcnNpb24gbnVtYmVyLgorLlBQCitQbHVzIHNldmVyYWwgb3RoZXIgSUtTRC1Pbmx5IG9wdGlvbnMgZGVzY3JpYmVkIGF0OgorLlBQCisgIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pa3NkLmh0bWwKKy5QUAorU2VlIHRoZSBmaWxlLXRyYW5zZmVyIHNlY3Rpb24gZm9yIGV4YW1wbGVzIG9mIGNvbW1hbmQtbGluZSBpbnZvY2F0aW9uLgorLlNIIENPTU1BTkQgTEFOR1VBR0UKK0MtS2VybWl0J3MgaW50ZXJhY3RpdmUgY29tbWFuZCBsYW5ndWFnZSBpcyB0aGUgc3ViamVjdCBvZiBhIDYyMi1wYWdlIGJvb2sKK2FuZCBhbm90aGVyIHNldmVyYWwgaHVuZHJlZCBwYWdlcyBvZiB1cGRhdGVzLCBmYXIgdG9vIG11Y2ggZm9yIGEgbWFudWFsCitwYWdlLiBCdXQgaXQncyBub3QgaGFyZCB0byBnZXQgc3RhcnRlZC4gQXQgdGhlIHNoZWxsIHByb21wdCwganVzdCB0eXBlCisia2VybWl0IiB0byBnZXQgQy1LZXJtaXQncyBpbnRlcmFjdGl2ZSBjb21tYW5kIHByb21wdDoKKy5QUAorLm5mCisgICQga2VybWl0CisgICgvY3VycmVudC9kaXJlY3RvcnkpIEMtS2VybWl0PgorLmZpCisuUFAKK0JlZ2luIGJ5IHR5cGluZyAiaGVscCIgKGFuZCB0aGVuIHByZXNzIHRoZSBSZXR1cm4gb3IgRW50ZXIga2V5KSBmb3IgYQordG9wLWxldmVsIG92ZXJ2aWV3LCByZWFkIGl0LCBhbmQgZ28gZnJvbSB0aGVyZS4gWW91ciBzZWNvbmQgY29tbWFuZCBzaG91bGQKK3Byb2JhYmx5IGJlICJpbnRybyIgKGludHJvZHVjdGlvbikuIE5vdGUgdGhlIHByb21wdCBzaG93cyB5b3VyIGN1cnJlbnQKK2RpcmVjdG9yeSAodW5sZXNzIHlvdSB0ZWxsIEtlcm1pdCB0byBwcm9tcHQgeW91IHdpdGggc29tZXRoaW5nIGVsc2UpLgorLlBQCitJbnRlcmFjdGl2ZSBjb21tYW5kcyBhcmUgY29tcG9zZWQgbWFpbmx5IG9mIHJlZ3VsYXIgRW5nbGlzaCB3b3JkcywgdXN1YWxseQoraW4gdGhlIGZvcm0gb2YgaW1wZXJhdGl2ZSBzZW50ZW5jZXMsIHN1Y2ggYXM6CisuUFAKKyAgc2VuZCBvb2ZhLnR4dAorLlBQCit3aGljaCB0ZWxscyBLZXJtaXQgdG8gc2VuZCAodHJhbnNmZXIpIHRoZSBmaWxlIHdob3NlIG5hbWUgaXMgb29mYS50eHQsIG9yOgorLlBQCisgIHNldCB0cmFuc2ZlciBtb2RlIGF1dG9tYXRpYworLlBQCit3aGljaCBzZXRzIEtlcm1pdCdzICJ0cmFuc2ZlciBtb2RlIiB0byAiYXV0b21hdGljIiAod2hhdGV2ZXIgdGhhdCBtZWFucykuCisuUFAKK1doaWxlIHR5cGluZyBjb21tYW5kcywgeW91IGNhbiBhYmJyZXZpYXRlLCBhc2sgZm9yIGhlbHAgKGJ5IHByZXNzaW5nIHRoZQorIj8iIGtleSBhbnl3aGVyZSBpbiBhIGNvbW1hbmQpLCBjb21wbGV0ZSBrZXl3b3JkcyBvciBmaWxlbmFtZXMgKHdpdGggdGhlCitUYWIgb3IgRXNjIGtleSksIGFuZCBlZGl0IHlvdXIgdHlwaW5nIHdpdGggQmFja3NwYWNlIG9yIERlbGV0ZSwgQ3RybC1XLAorQ3RybC1VLCBldGMuIFlvdSBjYW4gYWxzbyByZWNhbGwgcHJldmlvdXMgY29tbWFuZHMsIHNhdmUgeW91ciBjb21tYW5kCitoaXN0b3J5LCBhbmQgd2hvIGtub3dzIHdoYXQgZWxzZS4gR2l2ZSB0aGUgSU5UUk8gY29tbWFuZCBmb3IgZGV0YWlscy4KKy5QUAorQy1LZXJtaXQgaGFzIGh1bmRyZWRzIG9mIGNvbW1hbmRzLCBhbmQgdGhleSBjYW4gYmUgaXNzdWVkIGluIGluZmluaXRlCit2YXJpZXR5IGFuZCBjb21iaW5hdGlvbnMsIGluY2x1ZGluZyBjb21tYW5kcyBmb3I6CisubmYKKy5QUAorXChidQlNYWtpbmcgY29ubmVjdGlvbnMgKFNFVCBMSU5FLCBESUFMLCBURUxORVQsIFNTSCwgRlRQLCAuLi4pCisuYnIKK1woYnUJQnJlYWtpbmcgY29ubmVjdGlvbnMgKEhBTkdVUCwgQ0xPU0UpCisuYnIKK1woYnUJVHJhbnNmZXJyaW5nIGZpbGVzIChTRU5ELCBHRVQsIFJFQ0VJVkUsIE1PVkUsIFJFU0VORCwgLi4uKQorLmJyCitcKGJ1CUVzdGFibGlzaGluZyBwcmVmZXJlbmNlcyAoU0VUKQorLmJyCitcKGJ1CURpc3BsYXlpbmcgcHJlZmVyZW5jZXMgKFNIT1cpCisuYnIKK1woYnUJTWFuYWdpbmcgbG9jYWwgZmlsZXMgKENELCBERUxFVEUsIE1LRElSLCBESVIsIFJFTkFNRSwgVFlQRSwgLi4uKQorLmJyCitcKGJ1CU1hbmFnaW5nIHJlbW90ZSBmaWxlcyAoUkNELCBSREVMLCBSTUtESVIsIFJESVIsIC4uLikKKy5icgorXChidQlVc2luZyBsb2NhbCBmaWxlcyAoRk9QRU4sIEZDTE9TRSwgRlJFQUQsIEZXUklURSkKKy5icgorXChidQlQcm9ncmFtbWluZyAoVEFLRSwgREVGSU5FLCBJRiwgRk9SLCBXSElMRSwgU1dJVENILCBERUNMQVJFLCAuLi4pCisuYnIKK1woYnUJSW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlciAoRUNITywgQVNLLCAuLi4pCisuYnIKK1woYnUJSW50ZXJhY3Rpbmcgd2l0aCBhIHJlbW90ZSBjb21wdXRlciAoSU5QVVQsIE9VVFBVVCwgLi4uKQorLmJyCitcKGJ1CUludGVyYWN0aW5nIHdpdGggbG9jYWwgcHJvZ3JhbXMgKFJVTiwgRVhFQywgUFRZLCAuLi4pCisuYnIKK1woYnUJTG9nZ2luZyB0aGluZ3MgKExPRyBTRVNTSU9OLCBMT0cgUEFDS0VUUywgTE9HIERFQlVHLCAuLi4pCisuUFAKKy5maQorQW5kIG9mIGNvdXJzZSBRVUlUIG9yIEVYSVQgdG8gZ2V0IG91dCBhbmQgSEVMUCB0byBnZXQgaGVscCwgYW5kIGZvcgorcHJvZ3JhbW1lcnM6IGxvb3BzLCBkZWNpc2lvbiBtYWtpbmcsIHZhcmlhYmxlcywgYXJyYXlzLCBhc3NvY2lhdGl2ZSBhcnJheXMsCitpbnRlZ2VyIGFuZCBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljLCBtYWNyb3MsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQKK2Z1bmN0aW9ucywgc3RyaW5nIG1hbmlwdWxhdGlvbiwgcGF0dGVybiBtYXRjaGluZywgYmxvY2sgc3RydWN0dXJlLCBzY29waW5nLAorcmVjdXJzaW9uLCBhbmQgYWxsIHRoZSByZXN0LiBUbyBnZXQgYSBsaXN0IG9mIGFsbCBDLUtlcm1pdCdzIGNvbW1hbmRzLCB0eXBlCithIHF1ZXN0aW9uIG1hcmsgKD8pIGF0IHRoZSBwcm9tcHQuIFRvIGdldCBhIGRlc2NyaXB0aW9uIG9mIGFueSBjb21tYW5kLAordHlwZSBIRUxQIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLCBmb3IgZXhhbXBsZToKKy5QUAorICBoZWxwIHNlbmQKKy5QUAorVGhlIGNvbW1hbmQgaW50ZXJydXB0aW9uIGNoYXJhY3RlciBpcyBDdHJsLUMgKGhvbGQgZG93biB0aGUgQ3RybCBrZXkgYW5kCitwcmVzcyB0aGUgQyBrZXkpLgorLlBQCitUaGUgY29tbWFuZCBsYW5ndWFnZSAiZXNjYXBlIGNoYXJhY3RlciIsIHVzZWQgdG8gaW50cm9kdWNlIHZhcmlhYmxlIG5hbWVzLAorZnVuY3Rpb24gaW52b2NhdGlvbnMsIGFuZCBzbyBvbiwgaXMgYmFja3NsYXNoIChcKS4gSWYgeW91IG5lZWQgdG8gaW5jbHVkZSBhCitsaXRlcmFsIGJhY2tzbGFzaCBpbiBhIGNvbW1hbmQsIHR5cGUgdHdvIG9mIHRoZW0sIGUuZy46CisuUFAKKyAgZ2V0IGM6XGVrOTVcZWs5NWN1c3RvbS5pbmkKKy5TUyBDb21tYW5kIEZpbGVzLCBNYWNyb3MsIGFuZCBTY3JpcHRzCitBIGZpbGUgY29udGFpbmluZyBLZXJtaXQgY29tbWFuZHMgaXMgY2FsbGVkIGEgS2VybWl0IGNvbW1hbmQgZmlsZSBvciBLZXJtaXQKK3NjcmlwdC4gSXQgY2FuIGJlIGV4ZWN1dGVkIHdpdGggS2VybWl0J3MgVEFLRSBjb21tYW5kOgorLlBQCisgICgvY3VycmVudC9kaXIpIEMtS2VybWl0PiB0YWtlIGNvbW1hbmRmaWxlCisuUFAKKyh3aGVyZSAiY29tbWFuZGZpbGUiIGlzIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIGZpbGUpLiBQbGVhc2UgZG9uJ3QgcGlwZSBhCitjb21tYW5kIGZpbGUgaW50byBLZXJtaXQncyBzdGFuZGFyZCBpbnB1dCAod2hpY2ggbWlnaHQgb3IgbWlnaHQgbm90IHdvcmspOworaWYgeW91IGhhdmUgS2VybWl0IGNvbW1hbmRzIGluIGEgZmlsZSwgdGVsbCBLZXJtaXQgdG8gVEFLRSB0aGUgZmlsZS4KKy5QUAorSW4gVW5peCBvbmx5LCBhIEtlcm1pdCBjb21tYW5kIGZpbGUgY2FuIGFsc28gYmUgZXhlY3V0ZWQgZGlyZWN0bHkgYnkKK2luY2x1ZGluZyBhICJrZXJiYW5nIiBsaW5lIGFzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmaWxlOgorLlBQCisgICMhL3Vzci9sb2NhbC9iaW4va2VybWl0ICsKKy5QUAorVGhhdCBpcywgYSB0b3AgbGluZSB0aGF0IHN0YXJ0cyB3aXRoICIjISIsIGZvbGxvd2VkIGltbWVkaWF0ZWx5IGJ5IHRoZSBmdWxsCitwYXRoIG9mIHRoZSBLZXJtaXQgZXhlY3V0YWJsZSwgYW5kIHRoZW4sIGlmIHRoZSBLZXJtaXQgc2NyaXB0IGlzIHRvIGJlCitnaXZlbiBhcmd1bWVudHMgb24gdGhlIGNvbW1hbmQgbGluZSwgYSBzcGFjZSBhbmQgYSBwbHVzIHNpZ24uIFRoZSBzY3JpcHQKK2ZpbGUgbXVzdCBhbHNvIGhhdmUgZXhlY3V0ZSBwZXJtaXNzaW9uOgorLlBQCisgIGNobW9kICt4IGNvbW1hbmRmaWxlCisuUFAKK0V4Y2VwdCBmb3IgdGhlICIgKyIgcGFydCwgdGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHlvdSB3b3VsZCBkbyBmb3IgYQorc2hlbGwgc2NyaXB0LCBhIFBlcmwgc2NyaXB0LCBldGMuIEhlcmUncyBhIHNpbXBsZSBidXQgdXNlbGVzcyBleGFtcGxlCitzY3JpcHQgdGhhdCByZWd1cmdpdGF0ZXMgaXRzIGFyZ3VtZW50cyAodXAgdG8gdGhyZWUgb2YgdGhlbSk6CisuUFAKKyAgIyEvdXNyL2xvY2FsL2Jpbi9rZXJtaXQgKworICBpZiBkZWZpbmVkIFxlJTEgZWNobyAiQXJndW1lbnQgMTogXGUlMSIKKyAgaWYgZGVmaW5lZCBcZSUyIGVjaG8gIkFyZ3VtZW50IDI6IFxlJTIiCisgIGlmIGRlZmluZWQgXGUlMyBlY2hvICJBcmd1bWVudCAzOiBcZSUzIgorICBpZiBkZWZpbmVkIFxlJTQgZWNobyAiZXRjLi4uIgorICBleGl0CisuUFAKK0lmIHRoaXMgZmlsZSBpcyBzdG9yZWQgaW4geW91ciBjdXJyZW50IGRpcmVjdG9yeSBhcyAiY29tbWFuZGZpbGUiLCB0aGVuOgorLlBQCisgIC4vY29tbWFuZGZpbGUgb25lIHR3byB0aHJlZSBmb3VyIGZpdmUKKy5QUAorcHJpbnRzOgorLlBQCisgIEFyZ3VtZW50IDE6IG9uZQorICBBcmd1bWVudCAyOiB0d28KKyAgQXJndW1lbnQgMzogdGhyZWUKKyAgZXRjLi4uCisuUFAKK1RoaXMgaWxsdXN0cmF0ZXMgdGhlIGJhc2ljIHN0cnVjdHVyZSBvZiBhIHN0YW5kYWxvbmUgS2VybWl0IHNjcmlwdDogdGhlCisia2VyYmFuZyBsaW5lIiwgdGhlbiBzb21lIGNvbW1hbmRzLiBJdCBzaG91bGQgZW5kIHdpdGggImV4aXQiIHVubGVzcyB5b3UKK3dhbnQgdGhlIEtlcm1pdCBwcm9tcHQgdG8gYXBwZWFyIHdoZW4gaXQgaXMgZmluaXNoZWQuIFxlJTEgaXMgdGhlIGZpcnN0Cithcmd1bWVudCwgXGUlMiB0aGUgc2Vjb25kLCBhbmQgc28gb24uCisuUFAKK1lvdSBjYW4gYWxzbyBjcmVhdGUgeW91ciBvd24gY29tbWFuZHMgYnkgZGVmaW5pbmcgbmFtZWQgbWFjcm9zIGNvbXBvc2VkIG9mCitvdGhlciBLZXJtaXQgY29tbWFuZHMgKG9yIG1hY3JvcykuIEZvciBleGFtcGxlOgorLlBQCisubmYKKyAgZGVmaW5lIG15ZGVsZXRlIHsKKyAgICAgIGxvY2FsIHRyYXNoCisgICAgICBhc3NpZ24gdHJhc2ggXGV2KGhvbWUpdHJhc2hjYW4vCisgICAgICBpZiBub3QgZGVmaW5lZCBcZSUxIGVuZCAxICJEZWxldGUgd2hhdD8iCisgICAgICBpZiB3aWxkIFxlJTEgeworICAgICAgICAgIGVuZCAxICJEZWxldGluZyBtdWx0aXBsZSBmaWxlcyBpcyB0b28gc2NhcnkiCisgICAgICB9CisgICAgICBpZiBub3QgZXhpc3QgXGUlMSBlbmQgMSAiSSBjYW4ndCBmaW5kIFxlJTEiCisgICAgICBpZiBub3QgZGlyZWN0b3J5IFxlbSh0cmFzaCkgeworICAgICAgICAgIG1rZGlyIFxlbSh0cmFzaCkKKyAgICAgICAgICBpZiBmYWlsIGVuZCAxICJObyB0cmFzaCBjYW4iCisgICAgICB9CisgICAgICByZW5hbWUgL2xpc3QgXGUlMSBcZW0odHJhc2gpCisgIH0KKyAgZGVmaW5lIG15dW5kZWxldGUgeworICAgICAgbG9jYWwgdHJhc2gKKyAgICAgIGFzc2lnbiB0cmFzaCBcZXYoaG9tZSl0cmFzaGNhbi8KKyAgICAgIGlmIG5vdCBkZWZpbmVkIFxlJTEgZW5kIDEgIlVuZGVsZXRlIHdoYXQ/IgorICAgICAgaWYgd2lsZCBcZSUxIHsKKyAgICAgICAgICBlbmQgMSAiVW5kZWxldGluZyBtdWx0aXBsZSBmaWxlcyBpcyB0b28gaGFyZCIKKyAgICAgIH0KKyAgICAgIGlmIG5vdCBkaXJlY3RvcnkgXGVtKHRyYXNoKSBlbmQgMSAiTm8gdHJhc2ggY2FuIgorICAgICAgaWYgbm90IGV4aXN0IFxlbSh0cmFzaClcZSUxIHsKKyAgICAgICAgICBlbmQgMSAiSSBjYW4ndCBmaW5kIFxlJTEgaW4gdHJhc2ggY2FuIgorICAgICAgfQorICAgICAgcmVuYW1lIC9saXN0IFxlbSh0cmFzaClcZSUxIC4KKyAgfQorLlBQCisuZmkKK1RoZXNlIHNhbXBsZSBtYWNyb3MgYXJlIG5vdCBleGFjdGx5IHByb2R1Y3Rpb24gcXVhbGl0eSAodGhleSBkb24ndCBoYW5kbGUKK2ZpbGVuYW1lcyB0aGF0IGluY2x1ZGUgcGF0aCBzZWdtZW50cywgdGhleSBkb24ndCBoYW5kbGUgbXVsdGlwbGUgZmlsZXMsCitldGMpLCBidXQgeW91IGdldCB0aGUgaWRlYTogeW91IGNhbiBwYXNzIGFyZ3VtZW50cyB0byBtYWNyb3MsIGFuZCB0aGV5IGNhbgorY2hlY2sgdGhlbSBhbmQgbWFrZSBvdGhlciBraW5kcyBvZiBkZWNpc2lvbnMuIElmIHlvdSBwdXQgdGhlIGFib3ZlIGxpbmVzCitpbnRvIHlvdXIgaW5pdGlhbGl6YXRpb24gb3IgY3VzdG9taXphdGlvbiBmaWxlIChleHBsYWluZWQgYmVsb3cpLCB5b3UnbGwKK2hhdmUgTVlERUxFVEUgYW5kIE1ZVU5ERUxFVEUgY29tbWFuZHMgYXZhaWxhYmxlIGV2ZXJ5IHRpbWUgeW91IHN0YXJ0CitLZXJtaXQsIGF0IGxlYXN0IGFzIGxvbmcgYXMgeW91IGRvbid0IHN1cHByZXNzIGV4ZWN1dGlvbiBvZiB0aGUKK2luaXRpYWxpemF0aW9uIGZpbGUuIChFeGVyY2lzZSBmb3IgdGhlIHJlYWRlcjogTWFrZSB0aGVzZSBtYWNyb3MgZ2VuZXJhbGx5Cit1c2VmdWw6IHJlbW92ZSBsaW1pdGF0aW9ucywgYWRkIHRyYXNoY2FuIGRpc3BsYXksIGJyb3dzaW5nLCBlbXB0eWluZywgZXRjLikKKy5QUAorS2VyYmFuZyBzY3JpcHRzIGV4ZWN1dGUgd2l0aG91dCB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZS4gVGhpcyB0byBrZWVwIHRoZW0KK3BvcnRhYmxlIGFuZCBhbHNvIHRvIG1ha2UgdGhlbSBzdGFydCBmYXN0ZXIuIElmIHlvdSB3YW50IHRvIHdyaXRlIEtlcmJhbmcKK3NjcmlwdHMgdGhhdCBkZXBlbmQgb24gdGhlIGluaXRpYWxpemF0aW9uIGZpbGUsIGluY2x1ZGUgdGhlIGNvbW1hbmQKKy5QUAorICB0YWtlIFxldihob21lKS5rZXJtcmMKKy5QUAorYXQgdGhlIGRlc2lyZWQgc3BvdCBpbiB0aGUgc2NyaXB0LiBCeSB0aGUgd2F5LCBcZXYoeHh4KSBpcyBhIGJ1aWx0LWluCit2YXJpYWJsZSAoeHh4IGlzIHRoZSB2YXJpYWJsZSBuYW1lLCAiaG9tZSIgaW4gdGhpcyBjYXNlKS4gVG8gc2VlIHdoYXQKK2J1aWx0LWluIHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlLCB0eXBlICJzaG93IHZhcmlhYmxlcyIgYXQgdGhlIEMtS2VybWl0Citwcm9tcHQuIFRvIHNlZSB3aGF0IGVsc2UgeW91IGNhbiBzaG93LCB0eXBlICJzaG93ID8iLiBcZW0oeHh4KSBpcyBhIHVzZXIKK2RlZmluZWQgdmFyaWFibGUgKHN0cmljdGx5IHNwZWFraW5nLCBpdCBpcyBhIG1hY3JvIHVzZWQgYXMgYSB2YXJpYWJsZSkuCisuU1MgQ29tbWFuZCBMaXN0CitDLUtlcm1pdCBoYXMgbW9yZSB0aGFuIDIwMCB0b3AtbGV2ZWwgY29tbWFuZHMsIGFuZCBzb21lIG9mIHRoZXNlLCBzdWNoIGFzCitTRVQsIGJyYW5jaCBvZmYgaW50byBodW5kcmVkcyBvZiBzdWJjb21tYW5kcyBvZiB0aGVpciBvd24sIHNvIGl0J3Mgbm90CitwcmFjdGljYWwgdG8gZGVzY3JpYmUgdGhlbSBhbGwgaGVyZS4gSW5zdGVhZCwgaGVyZSdzIGEgY29uY2lzZSBsaXN0IG9mIHRoZQorbW9zdCBjb21tb25seSB1c2VkIHRvcC1sZXZlbCBjb21tYW5kcywgZ3JvdXBlZCBieSBjYXRlZ29yeS4gVG8gbGVhcm4gYWJvdXQKK2VhY2ggY29tbWFuZCwgdHlwZSAiaGVscCIgZm9sbG93ZWQgYnkgdGhlIGNvbW1hbmQgbmFtZSwgZS5nLiAiaGVscCBzZXQiLgorVGVybXMgc3VjaCBhcyBDb21tYW5kIHN0YXRlIGFuZCBDb25uZWN0IHN0YXRlIGFyZSBleHBsYWluZWQgaW4gc3Vic2VxdWVudAorc2VjdGlvbnMuCisuUFAKK09wdGlvbmFsIGZpZWxkcyBhcmUgc2hvd24gaW4gWyBicmFja2V0cyBdLiAgImZpbGVuYW1lIiBtZWFucyB0aGUKK25hbWUgb2YgYSBzaW5nbGUgZmlsZS4gZmlsZXNwZWMgbWVhbnMgYSBmaWxlIHNwZWNpZmljYXRpb24gdGhhdCBpcyBhbGxvd2VkCit0byBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMgbGlrZSAnKicgdG8gbWF0Y2ggZ3JvdXBzIG9mIGZpbGVzLiBvcHRpb25zCithcmUgKG9wdGlvbmFsKSBzd2l0Y2hlcyBsaWtlIC9QQUdFLCAvTk9QQUdFLCAvUVVJRVQsIGV0YywgbGlzdGVkIGluIHRoZQorSEVMUCB0ZXh0IGZvciBlYWNoIGNvbW1hbmQuIEV4YW1wbGU6CisuUFAKKy5uZgorICBzZW5kIC9yZWN1cnNpdmUgL2xhcmdlcjoxMDAwMCAvYWZ0ZXI6LTF3ZWVrIC9leGNlcHQ6Ki50eHQgKgorLmZpCisuUFAKK3doaWNoIGNhbiBiZSByZWFkIGFzICJzZW5kIGFsbCB0aGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIGFsbCB0aGUgb25lcwordW5kZXJuZWF0aCBpdCB0aGF0IGFyZSBsYXJnZXIgdGhhbiAxMDAwMCBieXRlcywgbm8gbW9yZSB0aGFuIG9uZSB3ZWVrIG9sZCwKK2FuZCB3aG9zZSBuYW1lcyBkb24ndCBlbmQgd2l0aCAiLnR4dCIuCisuU1MKK0Jhc2ljIENvbW1hbmRzCisuUlMKKy5UUAorSEVMUAorUmVxdWVzdHMgdG9wLWxldmVsIGhlbHAuCisuVFAKK0hFTFAgY29tbWFuZAorUmVxdWVzdHMgaGVscCBhYm91dCB0aGUgZ2l2ZW4gY29tbWFuZC4KKy5UUAorSU5UUk9EVUNUSU9OCitSZXF1ZXN0cyBhIGJyaWVmIGludHJvZHVjdGlvbiB0byBDLUtlcm1pdC4KKy5UUAorTElDRU5TRQorRGlzcGxheXMgdGhlIEMtS2VybWl0IHNvZnR3YXJlIGNvcHlyaWdodCBhbmQgbGljZW5zZS4KKy5UUAorVkVSU0lPTgorRGlzcGxheXMgQy1LZXJtaXQncyB2ZXJzaW9uIG51bWJlci4KKy5UUAorRVhJVCBbIG51bWJlciBdCitFeGl0cyBmcm9tIEtlcm1pdCB3aXRoIHRoZSBnaXZlbgorc3RhdHVzIGNvZGUuIFN5bm9ueW1zOiBRVUlULCBFLCBRLgorLlRQCitUQUtFIGZpbGVuYW1lIFsgcGFyYW1ldGVycy4uLiBdCitFeGVjdXRlcyBjb21tYW5kcyBmcm9tIHRoZSBnaXZlbgorLlRQCitMT0cgaXRlbSBbIGZpbGVuYW1lIF0KK0tlZXBzIGEgbG9nIG9mIHRoZSBnaXZlbiBpdGVtIGluIHRoZSBnaXZlbiBmaWxlLgorLlRQCitbIERPIF0gbWFjcm8gWyBwYXJhbWV0ZXJzLi4uIF0KK0V4ZWN1dGVzIGNvbW1hbmRzIGZyb20gdGhlIGdpdmVuIG1hY3JvLgorLlRQCitTRVQgcGFyYW1ldGVyIHZhbHVlCitTZXRzIHRoZSBnaXZlbiBwYXJhbWV0ZXIgdG8gdGhlIGdpdmVuIHZhbHVlLgorLlRQCitTSE9XIGNhdGVnb3J5CitTaG93cyBzZXR0aW5ncyBpbiBhIGdpdmVuIGNhdGVnb3J5LgorLlRQCitTVEFUVVMKK1RlbGxzIHdoZXRoZXIgcHJldmlvdXMgY29tbWFuZCBzdWNjZWVkZWQgb3IgZmFpbGVkLgorLlRQCitEQVRFIFsgZGF0ZS1hbmQvb3ItdGltZSBdCitTaG93cyBjdXJyZW50IGRhdGUtdGltZSBvciBpbnRlcnByZXRzIGdpdmVuIGRhdGUtdGltZS4KKy5UUAorUlVOIFsgZXh0ZXJuLWNvbW1hbmQgWyBwYXJhbWV0ZXJzLi4uIF0gICAgICAgICAgICAgICAgIAorUnVucyB0aGUgZ2l2ZW4gZXh0ZXJuYWwgY29tbWFuZC4gU3lub255bTogIS4KKy5UUAorRVhFQyBbIGV4dGVybi1jb21tYW5kIFsgcGFyYW1zLi4uIF0KK0tlcm1pdCBvdmVybGF5cyBpdHNlbGYgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KKy5UUAorU1VTUEVORAorU3RvcHMgS2VybWl0IGFuZCBwdXRzIGl0IGluIHRoZSBiYWNrZ3JvdW5kLiBTeW5vbnltOiBaLgorLlJFCisuU1MKK0xvY2FsIEZpbGUgTWFuYWdlbWVudAorLlJTCisuVFAKK1RZUEUgWyBvcHRpb25zIF0gZmlsZW5hbWUKK0Rpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZmlsZS4KKy5UUAorTU9SRSBbIG9wdGlvbnMgXSBmaWxlbmFtZSAgICAgCitFcXVpdmFsZW50IHRvIFRZUEUgL1BBR0UgKHBhdXNlIGFmdGVyIGVhY2ggc2NyZWVuZnVsKS4KKy5UUAorQ0FUIFsgb3B0aW9ucyBdIGZpbGVuYW1lICAgICAgCitFcXVpdmFsZW50IHRvIFRZUEUgL05PUEFHRS4KKy5UUAorSEVBRCBbIG9wdGlvbnMgXSBmaWxlbmFtZSAgICAgCitEaXNwbGF5cyB0aGUgZmlyc3QgZmV3IGxpbmVzIG9mIGEgZ2l2ZW4gZmlsZS4KKy5UUAorVEFJTCBbIG9wdGlvbnMgXSBmaWxlbmFtZSAgICAgCitEaXNwbGF5cyB0aGUgbGFzdCBmZXcgbGluZXMgb2YgYSBnaXZlbiBmaWxlLgorLlRQCitHUkVQIFsgb3B0aW9ucyBdIHBhdHRlcm4gZmlsZXNwZWMKK0Rpc3BsYXlzIGxpbmVzIGZyb20gZmlsZXMgdGhhdCBtYXRjaAordGhlIHBhdHRlcm4uIFN5bm9ueW06IEZJTkQuCisuVFAKK0RJUkVDVE9SWSBbIG9wdGlvbnMgXSBbZmlsZXNwZWMgXQorTGlzdHMgZmlsZXMgKGJ1aWx0LWluLCBtYW55IG9wdGlvbnMpLgorLlRQCitMUyBbIG9wdGlvbnMgXSBbIGZpbGVzcGVjIF0gICAKK0xpc3RzIGZpbGVzIChydW5zIGV4dGVybmFsICJscyIgY29tbWFuZCkuCisuVFAKK0RFTEVURSBbIG9wdGlvbnMgXSBbIGZpbGVzcGVjIF0KK0RlbGV0ZXMgZmlsZXMuIFN5bm9ueW06IFJNLgorLlRQCitQVVJHRSBbIG9wdGlvbnMgXSBbIGZpbGVzcGVjIF0KK1JlbW92ZXMgYmFja3VwICgqLn5ufikgZmlsZXMuCisuVFAKK0NPUFkgWyBvcHRpb25zIF0gWyBmaWxlc3BlY3MuLi4gXQorQ29waWVzIGZpbGVzLiBTeW5vbnltOiBDUC4KKy5UUAorUkVOQU1FIFsgb3B0aW9ucyBdIFsgZmlsZXNwZWNzLi4uIF0KK1JlbmFtZXMgZmlsZXMuIFN5bm9ueW06IE1WLgorLlRQCitDSE1PRCBbIG9wdGlvbnMgXSBbIGZpbGVzcGVjcy4uLiBdCitDaGFuZ2VzIHBlcm1pc3Npb25zIG9mIGZpbGVzLgorLlRQCitUUkFOU0xBVEUgZmlsZW5hbWUgY2hhcnNldHMgWyBmaWxlbmFtZSBdCitDb252ZXJ0cyBmaWxlJ3MgY2hhcmFjdGVyIHNldC4gU3lub255bTogWExBVEUuCisuVFAKK0NECitDaGFuZ2VzIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdG8geW91ciBob21lIGRpcmVjdG9yeS4KKy5UUAorQ0QgZGlyZWN0b3J5CitDaGFuZ2VzIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIG9uZSBnaXZlbi4KKy5UUAorQ0RVUAorQ2hhbmdlcyB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IG9uZSBsZXZlbCB1cC4KKy5UUAorUFdECitEaXNwbGF5cyB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5LgorLlRQCitCQUNLCitSZXR1cm5zIHRvIHlvdXIgcHJldmlvdXMgd29ya2luZyBkaXJlY3RvcnkuCisuVFAKK01LRElSIFsgZGlyZWN0b3J5IF0KK0NyZWF0ZXMgYSBkaXJlY3RvcnkuCisuVFAKK1JNRElSIFsgZGlyZWN0b3J5IF0KK1JlbW92ZXMgYSBkaXJlY3RvcnkuCisuUkUKKy5TUworTWFraW5nIENvbm5lY3Rpb25zCisuUlMKKy5UUAorU0VUIExJTkUgWyBvcHRpb25zIF0gZGV2aWNlbmFtZSAgICAgICAgICAgICAgICAgICAgICAKK09wZW5zIHRoZSBuYW1lZCBzZXJpYWwgcG9ydC4gU3lub255bTogU0VUIFBPUlQuCisuVFAKK09QRU4gTElORSBbIG9wdGlvbnMgXSBkZXZpY2VuYW1lCitTYW1lIGFzIFNFVCBMSU5FLiBTeW5vbnltOiBPUEVOIFBPUlQuCisuVFAKK1NFVCBNT0RFTSBUWVBFIFsgbmFtZSBdCitUZWxscyBLZXJtaXQgd2hhdCBraW5kIG9mIG1vZGVtIGlzIG9uIHRoZSBwb3J0LgorLlRQCitESUFMIFsgbnVtYmVyIF0KK1RlbGxzIEtlcm1pdCB0byBkaWFsIHRoZSBnaXZlbiBwaG9uZSBudW1iZXIgd2l0aCB0aGUgbW9kZW0uCisuVFAKK1JFRElBTAorUmVkaWFscyB0aGUgbW9zdCByZWNlbnRseSBkaWFsZWQgcGhvbmUgbnVtYmVyLgorLlRQCitBTlNXRVIKK1dhaXRzIGZvciBhbmQgYW5zd2VycyBhbiBpbmNvbWluZyBjYWxsIG9uIHRoZSBtb2RlbS4KKy5UUAorQVVUSEVOVElDQVRFIFsgcGFyYW1ldGVycy4uLiBdCitQZXJmb3JtcyBzZWN1cmUgYXV0aGVudGljYXRpb24gb24gYSBUQ1AvSVAgY29ubmVjdGlvbi4KKy5UUAorU0VUIE5FVFdPUksgVFlQRSB7IFRDUC9JUCwgWC4yNSwgLi4uIH0KK1NlbGVjdHMgbmV0d29yayB0eXBlIGZvciBzdWJzZXF1ZW50IFNFVCBIT1NUIGNvbW1hbmRzLgorLlRQCitTRVQgSE9TVCBbIG9wdGlvbnMgXSBob3N0IFsgcG9ydCBdICAgICAgICAgICAgICAgICAgICAgICAgICAKK09wZW5zIGEgbmV0d29yayBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBob3N0IGFuZCBwb3J0LgorLlRQCitTRVQgSE9TVCAqIHBvcnQKK1dhaXRzIGZvciBhbiBpbmNvbWluZyBUQ1AvSVAgY29ubmVjdGlvbiBvbiB0aGUgZ2l2ZW4gcG9ydC4KKy5UUAorVEVMTkVUIFsgb3B0aW9ucyBdIGhvc3QKK09wZW5zIGEgVGVsbmV0IGNvbm5lY3Rpb24gdG8gdGhlIGhvc3QgYW5kIGVudGVycyBDb25uZWN0IHN0YXRlLgorLlRQCitSTE9HSU4gWyBvcHRpb25zIF0gaG9zdAorT3BlbnMgYW4gUmxvZ2luIGNvbm5lY3Rpb24gdG8gdGhlIGhvc3QgYW5kIGVudGVycyBDb25uZWN0IHN0YXRlLgorLlRQCitJS1NEIFsgb3B0aW9ucyBdIGhvc3QKK09wZW5zIGEgY29ubmVjdGlvbiB0byBhbiBJbnRlcm5ldCBLZXJtaXQgU2VydmljZS4KKy5UUAorU1NIIFsgb3B0aW9ucyBdIGhvc3QKK09wZW5zIGFuIFNTSCBjb25uZWN0aW9uIHRvIHRoZSBob3N0IGFuZCBlbnRlcnMgQ29ubmVjdCBzdGF0ZS4KKy5UUAorRlRQIE9QRU4gaG9zdCBbIG9wdGlvbnMgXQorT3BlbnMgYW4gRlRQIGNvbm5lY3Rpb24gdG8gdGhlIGhvc3QuCisuVFAKK0hUVFAgWyBvcHRpb25zIF0gT1BFTiBob3N0CitPcGVucyBhbiBIVFRQIGNvbm5lY3Rpb24gdG8gdGhlIGhvc3QuCisuVFAKK1BUWSBleHRlcm5hbC1jb21tYW5kCitSdW5zIHRoZSBjb21tYW5kIG9uIGEgcHNldWRvdGVybWluYWwgYXMgaWYgaXQgd2VyZSBhIGNvbm5lY3Rpb24uCisuVFAKK1BJUEUgZXh0ZXJuYWwtY29tbWFuZAorUnVucyB0aGUgY29tbWFuZCB0aHJvdWdoIGEgcGlwZSBhcyBpZiBpdCB3ZXJlIGEgY29ubmVjdGlvbi4KKy5SRQorLlNTCitVc2luZyBDb25uZWN0aW9ucworLlJTCisuVFAKK0NPTk5FQ1QgWyBvcHRpb25zIF0KK0VudGVycyBDb25uZWN0ICh0ZXJtaW5hbCkgc3RhdGUuICBTeW5vbnltOiBDLgorLlRQCitSRURJUkVDVCBjb21tYW5kCitSZWRpcmVjdHMgdGhlIGdpdmVuIGV4dGVybmFsIGNvbW1hbmQgb3ZlciB0aGUgY29ubmVjdGlvbi4KKy5UUAorVEVMT1BUIGNvbW1hbmQKK1NlbmRzIGEgVGVsbmV0IHByb3RvY29sIGNvbW1hbmQgKFRlbG5ldCBjb25uZWN0aW9ucyBvbmx5KS4KKy5UUAorQ3RybC1cZUMKKyJFc2NhcGVzIGJhY2siIGZyb20gQ29ubmVjdCBzdGF0ZSB0byBDb21tYW5kIHN0YXRlLgorLlRQCitDdHJsLVxlQgorKEluIENvbm5lY3Qgc3RhdGUpIFNlbmRzIGEgQlJFQUsgc2lnbmFsIChzZXJpYWwgb3IgVGVsbmV0KS4KKy5UUAorQ3RybC1cZSEKKyhJbiBDb25uZWN0IHN0YXRlKSBFbnRlcnMgaW5mZXJpb3Igc2hlbGw7ICJleGl0IiB0byByZXR1cm4uCisuVFAKK0N0cmwtXGU/CisoSW4gQ29ubmVjdCBzdGF0ZSkgU2hvd3MgYSBtZW51IG9mIG90aGVyIGVzY2FwZS1sZXZlbCBvcHRpb25zLgorLlRQCitDdHJsLVxlQ3RybC1cZQorKEluIENvbm5lY3Qgc3RhdGUpIFR5cGUgdHdvCitDdHJsLUJhY2tzbGFzaGVzIHRvIHNlbmQgb25lIG9mIHRoZW0uCisuVFAKK1NFVCBFU0NBUEUgWyBjaGFyYWN0ZXIgXQorQ2hhbmdlcyBLZXJtaXQncyBDb25uZWN0LXN0YXRlIGVzY2FwZSBjaGFyYWN0ZXIuCisuUkUKKy5TUworQ2xvc2luZyBDb25uZWN0aW9ucworLlJTCisuVFAKK0hBTkdVUAorSGFuZ3MgdXAgdGhlIGN1cnJlbnRseSBvcGVuCitzZXJpYWwtcG9ydCBvciBuZXR3b3JrIGNvbm5lY3Rpb24uCisuVFAKK0NMT1NFCitDbG9zZXMgdGhlIGN1cnJlbnRseSBvcGVuCitzZXJpYWwtcG9ydCBvciBuZXR3b3JrIGNvbm5lY3Rpb24uCisuVFAKK1NFVCBMSU5FICh3aXRoIG5vIGRldmljZW5hbWUpCitDbG9zZXMgdGhlIGN1cnJlbnRseSBvcGVuCitzZXJpYWwtcG9ydCBvciBuZXR3b3JrIGNvbm5lY3Rpb24uCisuVFAKK1NFVCBIT1NUICh3aXRoIG5vIGhvc3RuYW1lKQorQ2xvc2VzIHRoZSBjdXJyZW50bHkgb3BlbiBzZXJpYWwtcG9ydCBvciBuZXR3b3JrIGNvbm5lY3Rpb24uCisuVFAKK0ZUUCBDTE9TRQorQ2xvc2VzIHRoZSBjdXJyZW50bHkgb3BlbiBGVFAgY29ubmVjdGlvbi4KKy5UUAorSFRUUCBDTE9TRQorQ2xvc2VzIHRoZSBjdXJyZW50bHkgb3BlbiBIVFRQIGNvbm5lY3Rpb24uCisuVFAKK0VYSVQgCitBbHNvIGNsb3NlcyBhbGwgY29ubmVjdGlvbnMuIFN5bm9ueW06IFFVSVQuCisuVFAKK1NFVCBFWElUIFdBUk5JTkcgT0ZGCitTdXBwcmVzc2VzIHdhcm5pbmcgYWJvdXQgb3BlbiBjb25uZWN0aW9ucyBvbiBleGl0IG9yIGNsb3NlLgorLlJFCisuU1MKK0ZpbGUgVHJhbnNmZXIKKy5SUworLlRQCitTRU5EIFsgb3B0aW9ucyBdIGZpbGVuYW1lIFsgYXMtbmFtZSBdCitTZW5kcyB0aGUgZ2l2ZW4gZmlsZS4gU3lub255bTogUy4KKy5UUAorU0VORCBbIG9wdGlvbnMgXSBmaWxlc3BlYworU2VuZHMgYWxsIGZpbGVzIHRoYXQgbWF0Y2guCisuVFAKK1JFU0VORCBbIG9wdGlvbnMgXSBmaWxlc3BlYworUmVzdW1lcyBhbiBpbnRlcnVwdGVkIFNFTkQgZnJvbSB0aGUgcG9pbnQgb2YgZmFpbHVyZS4KKy5UUAorUkVDRUlWRSBbIG9wdGlvbnMgXSBbIGFzLW5hbWUgXSAgICAgICAgICAgICAgICAgICAgCitXYWl0cyBwYXNzaXZlbHkgZm9yIGZpbGVzIHRvIGFycml2ZS4gU3lub255bTogUi4KKy5UUAorTE9HIFRSQU5TQUNUSU9OUyBbIGZpbGVuYW1lIF0KK0tlZXBzIGEgcmVjb3JkIG9mIGZpbGUgdHJhbnNmZXJzLgorLlRQCitGQVNUCitVc2UgZmFzdCBmaWxlLXRyYW5zZmVyIHNldHRpbmdzIChkZWZhdWx0KS4KKy5UUAorQ0FVVElPVVMKK1VzZSBjYXV0aW91cyBhbmQgbGVzcyBmYXN0IGZpbGUtdHJhbnNmZXIgc2V0dGluZ3MuCisuVFAKK1JPQlVTVAorVXNlIHVsdHJhLWNvbnNlcnZhdGl2ZSBhbmQgc2xvdyBmaWxlLXRyYW5zZmVyIHNldHRpbmdzLgorLlRQCitTVEFUSVNUSUNTIFsgb3B0aW9ucyBdIAorR2l2ZXMgc3RhdGlzdGljcyBhYm91dCB0aGUgbW9zdCByZWNlbnQgZmlsZSB0cmFuc2Zlci4KKy5UUAorV0hFUkUKK0FmdGVyIHRyYW5zZmVyOiAiV2hlcmUgZGlkIG15IGZpbGVzIGdvPyIuCisuVFAKK1RSQU5TTUlUIFsgb3B0aW9ucyBdIFtvZmlsZW5hbWUgXQorU2VuZHMgZmlsZSB3aXRob3V0IHByb3RvY29sLiBTeW5vbnltOiBYTUlULgorLlRQCitMT0cgU0VTU0lPTiBbIGZpbGVuYW1lIF0KK0NhcHR1cmVzIHJlbW90ZSB0ZXh0IG9yIGZpbGVzIHdpdGhvdXQgcHJvdG9jb2wuCisuVFAKK1NFVCBQUk9UT0NPTCBbIG5hbWUuLi4gXQorVGVsbHMgS2VybWl0IHRvIHVzZSBhbiBleHRlcm5hbCBmaWxlLXRyYW5zZmVyIHByb3RvY29sLgorLlRQCitGVFAgeyBQVVQsIE1QVVQsIEdFVCwgTUdFVCwgLi4uIH0KK0ZUUCBjbGllbnQgY29tbWFuZHMuCisuVFAKK0hUVFAgeyBQVVQsIEdFVCwgSEVBRCwgUE9TVCwgLi4uIH0KK0hUVFAgY2xpZW50IGNvbW1hbmRzLgorLlJFCisuU1MKK0tlcm1pdCBTZXJ2ZXIKKy5SUworLlRQCitFTkFCTEUsIERJU0FCTEUKK0NvbnRyb2xzIHdoaWNoIHNlcnZlciBmZWF0dXJlcyBjYW4gYmUgdXNlZCBieSBjbGllbnRzLgorLlRQCitTRVQgU0VSVkVSCitTZXRzIHBhcmFtZXRlcnMgcHJpb3IgdG8gZW50ZXJpbmcgU2VydmVyIHN0YXRlLgorLlRQCitTRVJWRVIKK0VudGVycyBTZXJ2ZXIgc3RhdGUuCisuUkUKKy5TUworQ2xpZW50IG9mIEtlcm1pdCBvciBGVFAgU2VydmVyCisuUlMKKy5UUAorWyBSRU1PVEUgXSBMT0dJTiBbIHVzZXIgcGFzc3dvcmQgXSAgICAgICAgIAorTG9ncyBpbiB0byBhIEtlcm1pdCBzZXJ2ZXIgb3IgSUtTRCB0aGF0IHJlcXVpcmVzIGl0LgorLlRQCitbIFJFTU9URSBdIExPR09VVAorTG9ncyBvdXQgZnJvbSBhIEtlcm1pdCBzZXJ2ZXIgb3IgSUtTRC4KKy5UUAorU0VORCBbIG9wdGlvbnMgXSBmaWxlbmFtZSBbIGFzLW5hbWUgXSAgICAgICAgICAgICAgICAgICAKK1NlbmRzIHRoZSBnaXZlbiBmaWxlIHRvIHRoZSBzZXJ2ZXIuIFN5bm9ueW1zOiBTLCBQVVQuCisuVFAKK1NFTkQgWyBvcHRpb25zIF0gZmlsZXNwZWMKK1NlbmRzIGFsbCBmaWxlcyB0aGF0IG1hdGNoLgorLlRQCitSRVNFTkQgWyBvcHRpb25zIF0gZmlsZXNwZWMKK1Jlc3VtZXMgYW4gaW50ZXJ1cHRlZCBTRU5EIGZyb20gdGhlIHBvaW50IG9mIGZhaWx1cmUuCisuVFAKK0dFVCBbIG9wdGlvbnMgXSByZW1vdGUtZmlsZXNwZWMKK0Fza3MgdGhlIHNlcnZlciB0byBzZW5kIHRoZSBnaXZlbiBmaWxlcy4gU3lub255bTogRy4KKy5UUAorUkVHRVQgWyBvcHRpb25zIF0gcmVtb3RlLWZpbGVzcGVjCitSZXN1bWVzIGFuIGludGVycnVwdGVkIEdFVCBmcm9tIHRoZSBwb2ludCBvZiBmYWlsdXJlLgorLlRQCitSRU1PVEUgQ0QgWyBkaXJlY3RvcnkgXQorQXNrcyBzZXJ2ZXIgdG8gY2hhbmdlIGl0cyB3b3JraW5nCitkaXJlY3RvcnkuIFN5bm9ueW06IFJDRC4KKy5UUAorUkVNT1RFIFBXRCBbIGRpcmVjdG9yeSBdCitBc2tzIHNlcnZlciB0byBkaXNwbGF5IGl0cyB3b3JraW5nIGRpcmVjdG9yeS4gU3lub255bTogUlBXRC4KKy5UUAorUkVNT1RFIERJUkVDVE9SWSBbIGZpbGVzcGVjLi4uIF0KK0Fza3Mgc2VydmVyIHRvIHNlbmQgYSBkaXJlY3RvcnkgbGlzdGluZy4gU3lub255bTogUkRJUi4KKy5UUAorUkVNT1RFIERFTEVURSBbIGZpbGVzcGVjLi4uIF0KK0Fza3Mgc2VydmVyIHRvIGRlbGV0ZSBmaWxlcy4gU3lub255bTogUkRFTC4KKy5UUAorUkVNT1RFIFsgY29tbWFuZC4uLiBdCisoTWFueSBvdGhlciBjb21tYW5kczogInJlbW90ZSA/IiBmb3IgYSBsaXN0KS4KKy5UUAorTUFJTCBbIG9wdGlvbnMgXSBmaWxlc3BlYworU2VuZHMgZmlsZShzKSB0byBiZSBkZWxpdmVyZWQgYXMgZS1tYWlsIChLZXJtaXQgb25seSkuCisuVFAKK0ZJTklTSAorQXNrcyB0aGUgc2VydmVyIHRvIGV4aXQgc2VydmVyIHN0YXRlIChLZXJtaXQgb25seSkuCisuVFAKK0JZRQorQXNrcyB0aGUgc2VydmVyIHRvIGxvZyBvdXQgYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorLlJFCisuU1MKK1NjcmlwdCBQcm9ncmFtbWluZworLlBQCisuUlMKK0RFRklORSwgREVDTEFSRSwgVU5ERUZJTkUsIFVOREVDTEFSRSwgQVNTSUdOLCBFVkFMVUFURSwgU0VYUFJFU1NJT04sCitBUlJBWSwgU09SVCwgSU5QVVQsIE9VVFBVVCwgSUYsIEZPUiwgV0hJTEUsIFNXSVRDSCwgR09UTywgRUNITywgQVNLLAorR0VUQywgR0VUT0ssIEFTU0VSVCwgV0FJVCwgU0xFRVAsIEZPUEVOLCBGUkVBRCwgRldSSVRFLCBGQ0xPU0UsIFNUT1AsCitFTkQsIFJFVFVSTiwgTEVBUk4sIFNISUZULCBUUkFDRSwgVk9JRCwgSU5DUkVNRU5ULCBERUNSRU1FTlQsIC4uLiBGb3IKK3RoZXNlIGFuZCBtYW55IG1vcmUgeW91J2xsIG5lZWQgdG8gY29uc3VsdCB0aGUgbWFudWFsIGFuZCBzdXBwbGVtZW50cywKK2FuZC9vciB2aXNpdCB0aGUgS2VybWl0IFNjcmlwdCBMaWJyYXJ5LCB3aGljaCBhbHNvIGluY2x1ZGVzIGEgYnJpZWYKK3R1dG9yaWFsLiBIaW50OiBIRUxQIExFQVJOIHRvIGZpbmQgb3V0IGhvdyB0byBnZXQgS2VybWl0IHRvIHdyaXRlCitzaW1wbGUgc2NyaXB0cyBmb3IgeW91LgorLlJFCisuUFAKK01hbnkgb2YgS2VybWl0J3MgY29tbWFuZHMgaGF2ZSBzeW5vbnltcywgdmFyaWFudHMsIHJlbGF0aXZlcywgYW5kIHNvIG9uLgorRm9yIGV4YW1wbGUsIE1TRU5EIGlzIGEgdmVyc2lvbiBvZiBTRU5EIHRoYXQgYWNjZXB0cyBhIGxpc3Qgb2YgZmlsZQorc3BlY2lmaWNhdGlvbnMgdG8gYmUgc2VudCwgcmF0aGVyIHRoYW4ganVzdCBvbmUgZmlsZSBzcGVjaWZpY2F0aW9uLCBhbmQKK01QVVQgaXMgYSBzeW5vbnltIG9mIE1TRU5ELiBNT1ZFIG1lYW5zIHRvIFNFTkQgYW5kIHRoZW4gREVMRVRFIHRoZSBzb3VyY2UKK2ZpbGUgaWYgc3VjY2Vzc2Z1bC4gTU1PVkUgaXMgbGlrZSBNT1ZFLCBidXQgYWNjZXB0cyBhIGxpc3Qgb2YgZmlsZXNwZWNzLAorYW5kIHNvIG9uLiBUaGVzZSBhcmUgZGVzY3JpYmVkIGluIHRoZSBmdWxsIGRvY3VtZW50YXRpb24uCisuUFAKK1VzZSBxdWVzdGlvbiBtYXJrIHRvIGZlZWwgeW91ciB3YXkgdGhyb3VnaCBhbiB1bmZhbWlsaWFyIGNvbW1hbmQsIGFzIGluCit0aGlzIGV4YW1wbGU6CisuUFAKKy5uZgorICBDLUtlcm1pdD4gcmVtb3RlID8gT25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICBhc3NpZ24gICAgIGRpcmVjdG9yeSAga2VybWl0ICAgICBwcmludCAgICAgIHJtZGlyCisgICBjZCAgICAgICAgIGV4aXQgICAgICAgbG9naW4gICAgICBwd2QgICAgICAgIHNldAorICAgY29weSAgICAgICBoZWxwICAgICAgIGxvZ291dCAgICAgcXVlcnkgICAgICBzcGFjZQorICAgZGVsZXRlICAgICBob3N0ICAgICAgIG1rZGlyICAgICAgcmVuYW1lICAgICB0eXBlCisgIEMtS2VybWl0PiByZW1vdGUgc2V0ID8gT25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICBhdHRyaWJ1dGVzICAgZmlsZSAgICAgICAgIHJldHJ5ICAgICAgICB0cmFuc2ZlcgorICAgYmxvY2stY2hlY2sgIHJlY2VpdmUgICAgICBzZXJ2ZXIgICAgICAgd2luZG93CisgIEMtS2VybWl0PiByZW1vdGUgc2V0IGZpbGUgPyBPbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgIGNoYXJhY3Rlci1zZXQgIGluY29tcGxldGUgICAgIHJlY29yZC1sZW5ndGgKKyAgIGNvbGxpc2lvbiAgICAgIG5hbWVzICAgICAgICAgIHR5cGUKKyAgQy1LZXJtaXQ+IHJlbW90ZSBzZXQgZmlsZSBuYW1lcyA/IE9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgY29udmVydGVkICBsaXRlcmFsCisgIEMtS2VybWl0PiByZW1vdGUgc2V0IGZpbGUgbmFtZXMgbGl0ZXJhbAorICBDLUtlcm1pdD4KKy5QUAorLmZpCitUaGlzIGlzIGNhbGxlZCBtZW51IG9uIGRlbWFuZDogeW91IGdldCBhIG1lbnUgd2hlbiB5b3Ugd2FudCBvbmUsIGJ1dCBtZW51cworYXJlIG5vdCBmb3JjZWQgb24geW91IGV2ZW4gd2hlbiBrbm93IHdoYXQgeW91J3JlIGRvaW5nLiBOb3RlIHRoYXQgeW91IGNhbgorYWxzbyBhYmJyZXZpYXRlIG1vc3Qga2V5d29yZHMsIGFuZCB5b3UgY2FuIGNvbXBsZXRlIHRoZW0gd2l0aCB0aGUgVGFiIG9yCitFc2Mga2V5LiBBbHNvIG5vdGUgdGhhdCA/IHdvcmtzIGZvciBmaWxlbmFtZXMgdG9vLCBhbmQgdGhhdCB5b3UgY2FuIHVzZSBpdAoraW4gdGhlIG1pZGRsZSBvZiBhIGtleXdvcmQgb3IgZmlsZW5hbWUsIG5vdCBqdXN0IGF0IHRoZSBiZWdpbm5pbmcuIEZvcgorZXhhbXBsZSwgInNlbmQgeD8iIGxpc3RzIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdob3NlIG5hbWVzCitzdGFydCB3aXRoICd4Jy4KKy5TSCBJTklUSUFMSVpBVElPTiBGSUxFCitJbiBpdHMgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBDLUtlcm1pdCBleGVjdXRlcyBjb21tYW5kcyBmcm9tIGEgZmlsZSAKK2NhbGxlZCAua2VybXJjIGluIHlvdXIgaG9tZSBkaXJlY3Rvcnkgd2hlbiBpdCBzdGFydHMsIHVubGVzcyBpdCBpcyBnaXZlbiB0aGUKKy1ZIG9yIC15IGNvbW1hbmQtbGluZSBvcHRpb24uIEN1c3RvbSBjb25maWd1cmF0aW9ucyBtaWdodCBzdWJzdGl0dXRlIGEgc2hhcmVkCitzeXN0ZW0td2lkZSBpbml0aWFsaXphdGlvbiBmaWxlLiBUaGUgU0hPVyBGSUxFIGNvbW1hbmQgdGVsbHMgd2hhdAoraW5pdGlhbGl6YXRpb24gZmlsZSwgaWYgYW55LCB3YXMgdXNlZC4gVGhlIHN0YW5kYXJkIGluaXRpYWxpemF0aW9uIGZpbGUKKyJjaGFpbnMiIHRvIGFuIGluZGl2aWR1YWwgY3VzdG9taXphdGlvbiBmaWxlLCAubXlrZXJtYywgaW4gdGhlIGhvbWUgZGlyZWN0b3J5LAoraW4gd2hpY2ggZWFjaCB1c2VyIGNhbiBlc3RhYmxpc2ggaGVyL2hpcyBvd24gcHJlZmVyZW5jZXMsIGRlZmluZSBtYWNyb3MsIGFuZAorc28gb24uCisuUFAKK1NpbmNlIGV4ZWN1dGlvbiBvZiB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZSAoYXQgbGVhc3QgdGhlIHN0YW5kYXJkIG9uZSkKK21ha2VzIEMtS2VybWl0IHRha2UgbG9uZ2VyIHRvIHN0YXJ0LCBpdCBtaWdodCBiZSBiZXR0ZXIgbm90IHRvIGhhdmUgYW4KK2luaXRpYWxpemF0aW9uIGZpbGUsIGVzcGVjaWFsbHkgbm93IHRoYXQgS2VybWl0J3MgZGVmYXVsdCBzdGFydHVwCitjb25maWd1cmF0aW9uIGlzIHdlbGwgYXR0dW5lZCB0byBtb2Rlcm4gY29tcHV0aW5nIGFuZCBuZXR3b3JraW5nIC0tIGluCitvdGhlciB3b3JkcywgeW91IG5vIGxvbmdlciBoYXZlIGRvIGFueXRoaW5nIHNwZWNpYWwgdG8gbWFrZSBLZXJtaXQKK3RyYW5zZmVycyBnbyBmYXN0LiBTbyBpbnN0ZWFkIG9mIGhhdmluZyBhbiBpbml0aWFsaXphdGlvbiBmaWxlIHRoYXQgaXMKK2V4ZWN1dGVkIGV2ZXJ5IHRpbWUgS2VybWl0IHN0YXJ0cywgeW91IG1pZ2h0IGNvbnNpZGVyIG1ha2luZyBvbmUgb3IgbW9yZQora2VyYmFuZyBzY3JpcHRzICh3aXRoIG5hbWVzIG90aGVyIHRoYXQgLmtlcm1yYykgdGhhdCBkbyBOT1QgaW5jbHVkZSBhbgorImV4aXQiIGNvbW1hbmQsIGFuZCBpbnZva2UgdGhvc2Ugd2hlbiB5b3UgbmVlZCB0aGUgc2V0dGluZ3MsIG1hY3JvCitkZWZpbml0aW9ucywgYW5kL29yIHNjcmlwdGVkIGFjdGlvbnMgdGhleSBjb250YWluLCBhbmQgaW52b2tlIEMtS2VybWl0CitkaXJlY3RseSB3aGVuIHlvdSBkb24ndC4KKy5QUAorVG8gcHV0IGl0IGFub3RoZXIgd2F5Li4uIFdlIHN0aWxsIGRpc3RyaWJ1dGUgdGhlIHN0YW5kYXJkIGluaXRpYWxpemF0aW9uCitmaWxlIHNpbmNlIGl0J3MgZmVhdHVyZWQgaW4gdGhlIG1hbnVhbCBhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXMKK2ltcG9ydGFudCB0byB1cy4gQnV0IHRoZXJlJ3Mgbm8gaGFybSBpbiBub3QgdXNpbmcgaXQgaWYgeW91IGRvbid0IG5lZWQgdGhlCitzdHVmZiB0aGF0J3MgaW4gaXQgKHNlcnZpY2VzIGRpcmVjdG9yeSwgZGlhbGluZyBkaXJlY3RvcnksIG5ldHdvcmsKK2RpcmVjdG9yeSwgYW5kIGFzc29jaWF0ZWQgbWFjcm8gZGVmaW5pdGlvbnMpLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUKK2FyZSBzZXR0aW5ncyBvciBtYWNyb3MgeW91IHdhbnQgaW4gZWZmZWN0IEVWRVJZIHRpbWUgeW91IHVzZSBLZXJtaXQsIHRoZQoraW5pdGlhbGl6YXRpb24gZmlsZSAob3IgdGhlIGN1c3RvbWl6YXRpb24gZmlsZSBpdCBjaGFpbnMgdG8pIGlzIHRoZSBwbGFjZQordG8gcHV0IHRoZW0sIGJlY2F1c2UgdGhhdCdzIHRoZSBvbmx5IHBsYWNlIEtlcm1pdCBsb29rcyBmb3IgdGhlbQorYXV0b21hdGljYWxseSBlYWNoIHRpbWUgeW91IHN0YXJ0IGl0LgorLlNIIE1PREVTIE9GIE9QRVJBVElPTgorS2VybWl0IGlzIHNhaWQgdG8gYmUgaW4gTG9jYWwgbW9kZSBpZiBpdCBoYXMgbWFkZSBhIGNvbm5lY3Rpb24gdG8gYW5vdGhlcgorY29tcHV0ZXIsIGUuZy4gYnkgZGlhbGluZyBpdCBvciBlc3RhYmxpc2hpbmcgYSBUZWxuZXQgY29ubmVjdGlvbiB0byBpdC4gVGhlCitvdGhlciBjb21wdXRlciBpcyByZW1vdGUsIHNvIGlmIHlvdSBzdGFydCBhbm90aGVyIGNvcHkgb2YgS2VybWl0IG9uIHRoZQorcmVtb3RlIGNvbXB1dGVyLCBpdCBpcyBzYWlkIHRvIGJlIGluIFJlbW90ZSBtb2RlIChhcyBsb25nIGFzIGl0IGhhcyBub3QKK21hZGUgYW55IGNvbm5lY3Rpb25zIG9mIGl0cyBvd24pLiBUaGUgbG9jYWwgS2VybWl0IGNvbW11bmljYXRlcyBvdmVyIHRoZQorY29tbXVuaWNhdGlvbnMgZGV2aWNlIG9yIG5ldHdvcmsgY29ubmVjdGlvbiwgYWN0aW5nIGFzIGEgY29uZHVpdCBiZXR3ZWVuCit0aGUgdGhlIHJlbW90ZSBjb21wdXRlciBhbmQgeW91ciBrZXlib2FyZCBhbmQgc2NyZWVuLiBUaGUgcmVtb3RlIEtlcm1pdCBpcwordGhlIGZpbGUtdHJhbnNmZXIgcGFydG5lciB0byB0aGUgbG9jYWwgS2VybWl0IGFuZCBjb21tdW5pY2F0ZXMgb25seSB0aHJvdWdoCitpdHMgc3RhbmRhcmQgaW5wdXQgYW5kIG91dHB1dC4KKy5QUAorQXQgYW55IG1vbWVudCwgYSBLZXJtaXQgcHJvZ3JhbSBjYW4gYmUgaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgc3RhdGVzLiBJdCdzCitpbXBvcnRhbnQgdG8ga25vdyB3aGF0IHRoZXkgYXJlIGFuZCBob3cgdG8gY2hhbmdlIGZyb20gb25lIHRvIHRoZSBvdGhlci4KKy5UUAorQ29tbWFuZCBzdGF0ZQorSW4gdGhpcyBzdGF0ZSwgS2VybWl0IHJlYWRzIGNvbW1hbmRzIGZyb206Cisuc3AKK1woYnUJWW91ciBrZXlib2FyZDsgb3I6CisuYnIKK1woYnUJQSBmaWxlLCBvcjoKKy5icgorXChidQlBIG1hY3JvIGRlZmluaXRpb24uCisuc3AKK1lvdSBjYW4gZXhpdCBmcm9tIENvbW1hbmQgc3RhdGUgYmFjayB0byBVbml4IHdpdGggdGhlIEVYSVQgb3IgUVVJVAorY29tbWFuZCAoc2FtZSB0aGluZykuIFlvdSBjYW4gZW50ZXIgQ29ubmVjdCBzdGF0ZSB3aXRoIGFueSBvZiB2YXJpb3VzCitjb21tYW5kcyAoQ09OTkVDVCwgRElBTCwgVEVMTkVULCBldGMpLiBZb3UgY2FuIGVudGVyIGZpbGUgdHJhbnNmZXIKK3N0YXRlIHdpdGggY29tbWFuZHMgbGlrZSBTRU5ELCBSRUNFSVZFLCBhbmQgR0VULiBZb3UgY2FuIGVudGVyIFNlcnZlcgorc3RhdGUgd2l0aCB0aGUgU0VSVkVSIGNvbW1hbmQuIFRoZSBUQUtFIGNvbW1hbmQgdGVsbHMgS2VybWl0IHRvIHJlYWQKK2FuZCBleGVjdXRlIGNvbW1hbmRzIGZyb20gYSBmaWxlLiBUaGUgKHBlcmhhcHMgaW1wbGllZCkgRE8gY29tbWFuZAordGVsbHMgS2VybWl0IHRvIHJlYWQgYW5kIGV4ZWN1dGUgY29tbWFuZHMgZnJvbSBhIG1hY3JvIGRlZmluaXRpb24uCitXaGlsZSBpbiBDb21tYW5kIHN0YXRlLCB5b3UgY2FuIGludGVycnVwdCBhbnkgY29tbWFuZCwgbWFjcm8sIG9yCitjb21tYW5kIGZpbGUgYnkgdHlwaW5nIEN0cmwtQyAoaG9sZCBkb3duIHRoZSBDdHJsIGtleSBhbmQgcHJlc3MgdGhlIEMKK2tleSk7IHRoaXMgbm9ybWFsbHkgYnJpbmdzIHlvdSBiYWNrIHRvIHRoZSBwcm9tcHQuCisuVFAKK1NoZWxsIHN0YXRlCitZb3UgY2FuIGludm9rZSBhbiBpbmZlcmlvciBzaGVsbCBvciBleHRlcm5hbCBjb21tYW5kIGZyb20gdGhlIEtlcm1pdAorY29tbWFuZCBwcm9tcHQgYnkgdXNpbmcgdGhlIFBVU0gsIFJVTiAoISksIEVESVQsIG9yIEJST1dTRSBjb21tYW5kLgorV2hpbGUgdGhlIGluZmVyaW9yIHNoZWxsIG9yIGNvbW1hbmQgaXMgYWN0aXZlLCBLZXJtaXQgaXMgc3VzcGVuZGVkIGFuZAorZG9lcyBub3RoaW5nLiBSZXR1cm4gdG8gS2VybWl0IENvbW1hbmQgc3RhdGUgYnkgZXhpdGluZyBmcm9tIHRoZQoraW5mZXJpb3Igc2hlbGwgb3IgYXBwbGljYXRpb24uCisuVFAKK0Nvbm5lY3Qgc3RhdGUKK0luIHRoaXMgc3RhdGUsIHdoaWNoIGNhbiBiZSBlbnRlcmVkIG9ubHkgd2hlbiBpbiBMb2NhbCBtb2RlIChpLmUuIHdoZW4KK0tlcm1pdCBoYXMgbWFkZSBhIGNvbm5lY3Rpb24gdG8gYW5vdGhlciBjb21wdXRlciksIEtlcm1pdCBpcyBhY3RpbmcgYXMKK2EgdGVybWluYWwgdG8gdGhlIHJlbW90ZSBjb21wdXRlci4gWW91ciBrZXlzdHJva2VzIGFyZSBzZW50IHRvIHRoZQorcmVtb3RlIGNvbXB1dGVyIGFuZCBjaGFyYWN0ZXJzIHRoYXQgYXJyaXZlIG92ZXIgdGhlIGNvbW11bmljYXRpb24KK2Nvbm5lY3Rpb24gYXJlIGRpc3BsYXllZCBvbiB5b3VyIHNjcmVlbi4gVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIHdoZW4KK3lvdSBnaXZlIGEgQ09OTkVDVCwgRElBTCwgVEVMTkVULCBSTE9HSU4sIG9yIElLU0QgY29tbWFuZC4gWW91IGNhbgorcmV0dXJuIHRvIGNvbW1hbmQgc3RhdGUgYnkgbG9nZ2luZyBvdXQgb2YgdGhlIHJlbW90ZSBjb21wdXRlciwgb3IgYnkKK3R5cGluZzoKKy5zcAorICBDdHJsLVxlYworLnNwCitUaGF0IGlzOiBIb2xkIGRvd24gdGhlIEN0cmwga2V5IGFuZCBwcmVzcyB0aGUgYmFja3NsYXNoIGtleSwgdGhlbiBsZXQKK2dvIG9mIHRoZSBDdHJsIGtleSBhbmQgcHJlc3MgdGhlIEMga2V5LiBUaGlzIGlzIGNhbGxlZCBlc2NhcGluZyBiYWNrLgorQ2VydGFpbiBvdGhlciBlc2NhcGUtbGV2ZWwgY29tbWFuZHMgYXJlIGFsc28gcHJvdmlkZWQ7IHR5cGUgQ3RybC1cZT8KK2ZvciBhIGxpc3QuIEZvciBleGFtcGxlLCB5b3UgY2FuIGVudGVyIFNoZWxsIHN0YXRlIHdpdGg6Cisuc3AKKyAgQ3RybC1cZSEKKy5zcAorVG8gc2VuZCBhIEN0cmwtXGUgdG8gdGhlIGhvc3Qgd2hpbGUgaW4gQ29ubmVjdCBzdGF0ZSwgdHlwZSB0d28gb2YgdGhlbQoraW4gYSByb3cuIFNlZSBIRUxQIENPTk5FQ1QgYW5kIEhFTFAgU0VUIEVTQ0FQRSBmb3IgbW9yZSBpbmZvLgorLlRQCitMb2NhbCBmaWxlLXRyYW5zZmVyIHN0YXRlCitJbiB0aGlzIHN0YXRlLCBLZXJtaXQgaXMgc2VuZGluZyBwYWNrZXRzIGJhY2sgYW5kIGZvcnRoIHdpdGggdGhlIG90aGVyCitjb21wdXRlciBpbiBvcmRlciB0byB0cmFuc2ZlciBhIGZpbGUgb3IgYWNjb21wbGlzaCBzb21lIG90aGVyCitmaWxlLXJlbGF0ZWQgdGFzay4gQW5kIGF0IHRoZSBzYW1lIHRpbWUsIGl0IGlzIGRpc3BsYXlpbmcgaXRzIHByb2dyZXNzCitvbiB5b3VyIHNjcmVlbiBhbmQgd2F0Y2hpbmcgeW91ciBrZXlib2FyZCBmb3IgaW50ZXJydXB0aW9ucy4gSW4gdGhpcworc3RhdGUsIHRoZSBmb2xsb3dpbmcgc2luZ2xlLWtleXN0cm9rZSBjb21tYW5kcyBhcmUgYWNjZXB0ZWQ6Cisuc3AKKy5SUworLlRQCitYCitJbnRlcnJ1cHQgdGhlIGN1cnJlbnQgZmlsZSBhbmQgZ28gb24gdG8gdGhlIG5leHQgKGlmIGFueSkuCisuVFAKK1oKK0ludGVycnVwdCB0aGUgY3VycmVudCBmaWxlIGFuZCBza2lwIGFsbCB0aGUgcmVzdC4KKy5UUAorRQorTGlrZSBaIGJ1dCB1c2VzIGEgInN0cm9uZ2VyIiBwcm90b2NvbCAodXNlIGlmIFggb3IgWiBkb24ndCB3b3JrKS4KKy5UUAorQ3RybC1DCitJbnRlcnJ1cHQgZmlsZS10cmFuc2ZlciBtb2RlICh1c2UgaWYgWiBvciBFIGRvbid0IHdvcmspLgorLnNwCisuUkUKK0tlcm1pdCByZXR1cm5zIHRvIGl0cyBwcmV2aW91cyBzdGF0ZSAoQ29tbWFuZCBvciBDb25uZWN0KSB3aGVuIHRoZQordHJhbnNmZXIgaXMgY29tcGxldGUgb3Igd2hlbiBpbnRlcnJ1cHRlZCBzdWNjZXNzZnVsbHkgYnkgWCwgWiwgRSwgb3IKK0N0cmwtQyAoaG9sZCBkb3duIHRoZSBDdHJsIGtleSBhbmQgcHJlc3MgdGhlIEMga2V5KS4KKy5UUAorUmVtb3RlIGZpbGUtdHJhbnNmZXIgc3RhdGUKK0luIHRoaXMgc3RhdGUsIEtlcm1pdCBpcyBleGNoYW5naW5nIGZpbGUtdHJhbnNmZXIgcGFja2V0cyB3aXRoIGl0cworbG9jYWwgcGFydG5lciBvdmVyIGl0cyBzdGFuZGFyZCBpL28uIEl0IGxlYXZlcyB0aGlzIHN0YXRlCithdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLiBJbiBjYXNlIHlvdSBmaW5kIHlvdXIKK2xvY2FsIEtlcm1pdCBpbiBDb25uZWN0IHN0YXRlIGFuZCB0aGUgcmVtb3RlIG9uZSBpbiBGaWxlLXRyYW5zZmVyCitzdGF0ZSAoaW4gd2hpY2ggaXQgc2VlbXMgdG8gaWdub3JlIHlvdXIga2V5c3Ryb2tlcyksIHlvdSBjYW4gdXN1YWxseQorcmV0dXJuIGl0IHRvIGNvbW1hbmQgc3RhdGUgYnkgdHlwaW5nIHRocmVlIEN0cmwtQydzIGluIGEgcm93LiBJZiB0aGF0Citkb2Vzbid0IHdvcmssIHJldHVybiB5b3VyIGxvY2FsIEtlcm1pdCB0byBDb21tYW5kIHN0YXRlIChDdHJsLVxlIEMpIGFuZAordHlwZSAiZS1wYWNrZXQiIGFuZCB0aGVuIHByZXNzIHRoZSBSZXR1cm4gb3IgRW50ZXIga2V5OyB0aGlzIGZvcmNlcyBhCitmYXRhbCBLZXJtaXQgcHJvdG9jb2wgZXJyb3IuCisuVFAKK1JlbW90ZSBTZXJ2ZXIgc3RhdGUKK1RoaXMgaXMgbGlrZSBSZW1vdGUgRmlsZS10cmFuc2ZlciBzdGF0ZSwgZXhjZXB0IGl0IG5ldmVyIHJldHVybnMKK2F1dG9tYXRpY2FsbHkgdG8gQ29tbWFuZCBzdGF0ZS4gUmF0aGVyLCBpdCBhd2FpdHMgZnVydGhlciBpbnN0cnVjdGlvbnMKK2Zyb20gdGhlIGNsaWVudCBwcm9ncmFtOyB0aGF0IGlzLCBmcm9tIHlvdXIgTG9jYWwgS2VybWl0IHByb2dyYW0uIFlvdQorY2FuIHJldHVybiB0aGUgUmVtb3RlIFNlcnZlciB0byBpdHMgcHJldmlvdXMgc3RhdGUgYnkgaXNzdWluZyBhCisiZmluaXNoIiBjb21tYW5kIHRvIHRoZSBjbGllbnQsIG9yIGlmIHlvdSBhcmUgaW4gQ29ubmVjdCBzdGF0ZSwgYnkKK3R5cGluZyB0aHJlZSBDdHJsLUMncyBpbiBhIHJvdy4gWW91IGNhbiB0ZWxsIHRoZSBzZXJ2ZXIgam9iIHRvIGxvZyBvdXQKK2FuZCBicmVhayB0aGUgY29ubmVjdGlvbiBieSBpc3N1aW5nIGEgImJ5ZSIgY29tbWFuZCB0byB0aGUgY2xpZW50LgorLlRQCitMb2NhbCBTZXJ2ZXIgc3RhdGUKK0xpa2UgUmVtb3RlLVNlcnZlciBzdGF0ZSwgYnV0IGluIGxvY2FsIG1vZGUsIGFuZCB0aGVyZWZvcmUgd2l0aCBpdHMKK2ZpbGUtdHJhbnNmZXIgZGlzcGxheSBzaG93aW5nLCBhbmQgbGlzdGVuaW5nIGZvciBzaW5nbGUta2V5IGNvbW1hbmRzLAorYXMgaW4gTG9jYWwgRmlsZS10cmFuc2ZlciBzdGF0ZS4gVXN1YWxseSB0aGlzIHN0YXRlIGlzIGVudGVyZWQKK2F1dG9tYXRpY2FsbHkgd2hlbiBhIHJlbW90ZSBLZXJtaXQgcHJvZ3JhbSBnaXZlcyBhIEdFVCBjb21tYW5kLgorLnNwCitDLUtlcm1pdCwgS2VybWl0IDk1LCBhbmQgTVMtRE9TIEtlcm1pdCBhbGwgY2FuIHN3aXRjaCBhdXRvbWF0aWNhbGx5IGZyb20KK0Nvbm5lY3Qgc3RhdGUgdG8gTG9jYWwgRmlsZS10cmFuc2ZlciBzdGF0ZSB3aGVuIHlvdSBpbml0aWF0ZSBhIGZpbGUKK3RyYW5zZmVyIGZyb20gdGhlIHJlbW90ZSBjb21wdXRlciBieSBzdGFydGluZyBLZXJtaXQgYW5kIHRlbGxpbmcgaXQgdG8gc2VuZAorb3IgZ2V0IGEgZmlsZSwgaW4gd2hpY2ggY2FzZSwgQ29ubmVjdCBzdGF0ZSBpcyBhdXRvbWF0aWNhbGx5IHJlc3VtZWQgYWZ0ZXIKK3RoZSBmaWxlIHRyYW5zZmVyIGlzIGZpbmlzaGVkLgorLnNwCitOb3RlIHRoYXQgQy1LZXJtaXQgaXMgbm90IGEgdGVybWluYWwgZW11bGF0b3IuIEl0IGlzIGEgY29tbXVuaWNhdGlvbnMKK2FwcGxpY2F0aW9uIHRoYXQgeW91IHJ1biBpbiBhIHRlcm1pbmFsIHdpbmRvdyAoZS5nLiBjb25zb2xlIG9yIFh0ZXJtKS4gVGhlCitzcGVjaWZpYyBlbXVsYXRpb24sIHN1Y2ggYXMgVlQxMDAsIFZUMjIwLCBMaW51eCBDb25zb2xlLCBvciBYdGVybSwgaXMKK3Byb3ZpZGVkIGJ5IHRoZSB0ZXJtaW5hbCB3aW5kb3cgaW4gd2hpY2ggeW91IGFyZSBydW5uaW5nIEMtS2VybWl0LiBLZXJtaXQKKzk1IGFuZCBNUy1ET1MgS2VybWl0LCBvbiB0aGUgb3RoZXIgaGFuZCwgYXJlIHRydWUgdGVybWluYWwgZW11bGF0b3JzLiBXaHkKK2lzIEMtS2VybWl0IG5vdCBhIHRlcm1pbmFsIGVtdWxhdG9yPyBDTElDSyBIRVJFIHRvIHJlYWQgYWJvdXQgaXQuCisuU0ggTUFLSU5HIENPTk5FQ1RJT05TCitIZXJlIGlzIGhvdyB0byBtYWtlIGRpZmZlcmVudCBraW5kcyBvZiBjb25uZWN0aW9ucyB1c2luZyBpbnRlcmFjdGl2ZSBLZXJtaXQKK2NvbW1hbmRzIChhcyBub3RlZCBhYm92ZSwgeW91IGNhbiBhbHNvIG1ha2UgY29ubmVjdGlvbnMgd2l0aCBjb21tYW5kLWxpbmUKK29wdGlvbnMpLiBOb3RlIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gbWFrZSBjb25uZWN0aW9ucyB3aXRoIEtlcm1pdC4gSXQgY2FuCithbHNvIGJlIHVzZWQgb24gdGhlIGZhciBlbmQgb2YgYSBjb25uZWN0aW9uIGFzIHRoZSByZW1vdGUgZmlsZSB0cmFuc2ZlciBhbmQKK21hbmFnZW1lbnQgcGFydG5lciBvZiB5b3VyIGxvY2FsIGNvbW11bmljYXRpb25zIHNvZnR3YXJlLgorLlRQCitNYWtpbmcgYSBUZWxuZXQgQ29ubmVjdGlvbgorQXQgdGhlIEMtS2VybWl0IGNvbW1hbmQgcHJvbXB0LCBzaW1wbHkgdHlwZToKKy5zcAorLm5mCisgIHRlbG5ldCBmb28uYmFyLmNvbQorLmZpCisuc3AKKyhzdWJzdGl0dXRpbmcgZGVzaXJlZCBob3N0bmFtZSBvciBhZGRyZXNzKS4gIAorWW91IGNhbiBhbHNvIGluY2x1ZGUgYSBwb3J0IG51bWJlcjoKKy5zcAorLm5mCisgIHRlbG5ldCB4eXpjb3JwLmNvbSAzMDAwIDsgCisuZmkKKy5zcAorSWYgdGhlIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgS2VybWl0IGF1dG9taWNhbGx5IGVudGVycyBDb25uZWN0CitzdGF0ZS4gV2hlbiB5b3UgbG9nb3V0IGZyb20gdGhlIHJlbW90ZSBob3N0LCBLZXJtaXQgYXV0b21hdGljYWxseQorcmV0dXJucyB0byBpdHMgcHJvbXB0LiBNb3JlIGluZm86IEhFTFAgVEVMTkVULCBIRUxQIFNFVCBURUxORVQsIEhFTFAKK1NFVCBURUxPUFQuIEFsc28gc2VlIHRoZSBJS1NEIHNlY3Rpb24gYmVsb3cuCisuVFAKK01ha2luZyBhbiBSbG9naW4gY29ubmVjdGlvbgorVGhpcyBpcyBqdXN0IGxpa2UgVGVsbmV0LCBleGNlcHQgeW91IGhhdmUgdG8gYmUgcm9vdCB0byBkbyBpdCBiZWNhdXNlCitSbG9naW4gdXNlcyBhIHByaXZpbGVnZWQgVENQIHBvcnQ6Cisuc3AKKy5uZgorICBybG9naW4gZm9vLmJhci5jb20KKy5maQorLnNwCitNb3JlIGluZm86IEhFTFAgUkxPR0lOLgorLlRQCitNYWtpbmcgYW4gU1NIIENvbm5lY3Rpb24KK1VubGlrZSBUZWxuZXQgYW5kIFJsb2dpbiwgU1NIIGNvbm5lY3Rpb25zIGFyZSBub3QgYnVpbHQtaW4sIGJ1dAoraGFuZGxlZCBieSBydW5uaW5nIHlvdXIgZXh0ZXJuYWwgU1NIIGNsaWVudCB0aHJvdWdoIGEgcHNldWRvdGVybWluYWwuCitVc2luZyBDLUtlcm1pdCB0byBjb250cm9sIHRoZSBTU0ggY2xpZW50IGdpdmVzIHlvdSBhbGwgb2YgS2VybWl0J3MKK2ZlYXR1cmVzIChmaWxlIHRyYW5zZmVyLCBjaGFyYWN0ZXItc2V0IGNvbnZlcnNpb24sIHNjcmlwdGluZywgZXRjKQorb3ZlciBTU0guCisuc3AKKyAgc3NoIGZvby5iYXIuY29tCisuc3AKK01vcmUgaW5mbzogSEVMUCBTU0gsIEhFTFAgU0VUIFNTSC4KKy5UUAorRGlhbGluZyB3aXRoIGEgTW9kZW0KK0lmIGl0J3MgYW4gZXh0ZXJuYWwgbW9kZW0sIG1ha2Ugc3VyZSBpdCBpcyBjb25uZWN0ZWQgdG8gYSB1c2FibGUKK3NlcmlhbCBwb3J0IG9uIHlvdXIgY29tcHV0ZXIgd2l0aCBhIHJlZ3VsYXIgKHN0cmFpZ2h0LXRocm91Z2gpIG1vZGVtCitjYWJsZSwgYW5kIHRvIHRoZSB0ZWxlcGhvbmUgamFjayB3aXRoIGEgdGVsZXBob25lIGNhYmxlLCBhbmQgdGhhdCBpdCdzCit0dXJuZWQgb24uIFRoZW4gdXNlIHRoZXNlIGNvbW1hbmRzOgorLnNwCisubmYKKyAgc2V0IG1vZGVtIHR5cGUgdXNyb2JvdGljcyAgOyBPciBvdGhlciBzdXBwb3J0ZWQgdHlwZQorICBzZXQgbGluZSAvZGV2L3R0eVMwICAgICAgICA7IFNwZWNpZnkgZGV2aWNlIG5hbWUKKyAgc2V0IHNwZWVkIDU3NjAwICAgICAgICAgICAgOyBPciBvdGhlciBkZXNpcmVkIHNwZWVkCisgIHNldCBmbG93IHJ0cy9jdHMgICAgICAgICAgIDsgTW9zdCBtb2Rlcm4gbW9kZW1zIHN1cHBvcnQgdGhpcworICBzZXQgZGlhbCBtZXRob2QgdG9uZSAgICAgICA7IChvciBwdWxzZSkKKyAgZGlhbCA3NjU0MzIxICAgICAgICAgICAgICAgOyBEaWFsIHRoZSBkZXNpcmVkIG51bWJlcgorLmZpCisuc3AKK1R5cGUgInNldCBtb2RlbSB0eXBlID8iIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIG1vZGVtIHR5cGVzLiBJZiB5b3UKK29taXQgdGhlIFNFVCBNT0RFTSBUWVBFIGNvbW1hbmQsIHRoZSBkZWZhdWx0IHR5cGUgaXMKKyJnZW5lcmljLWhpZ2gtc3BlZWQiLCB3aGljaCBzaG91bGQgd29yayBmb3IgbW9zdCBtb2Rlcm4gQVQtY29tbWFuZC1zZXQKK21vZGVtcy4gSWYgdGhlIGxpbmUgaXMgYnVzeSwgS2VybWl0IHJlZGlhbHMgYXV0b21hdGljYWxseS4gSWYgdGhlIGNhbGwKK2RvZXMgbm90IHN1Y2NlZWQsIHVzZSAic2V0IGRpYWwgZGlzcGxheSBvbiIgYW5kIHRyeSBpdCBhZ2FpbiB0byB3YXRjaAord2hhdCBoYXBwZW5zLiBJZiB0aGUgY2FsbCBzdWNjZWVkcywgS2VybWl0IGVudGVycyBDb25uZWN0IHN0YXRlCithdXRvbWF0aWNhbGx5IGFuZCByZXR1cm5zIHRvIGl0cyBwcm9tcHQgYXV0b21hdGljYWxseSB3aGVuIHlvdSBsb2cgb3V0Citmcm9tIHRoZSByZW1vdGUgY29tcHV0ZXIgb3IgdGhlIGNvbm5lY3Rpb24gaXMgb3RoZXJ3aXNlIGxvc3QuCisuc3AKK1lvdSBjYW4gYWxzbyBkaWFsIGZyb20gYSBtb2RlbSB0aGF0IGlzIGFjY2Vzc2libGUgYnkgVGVsbmV0LCBlLmcuIHRvIGEKK3JldmVyc2UgdGVybWluYWwgc2VydmVyLiBJbiB0aGlzIGNhc2UgdGhlIGNvbW1hbmQgc2VxdWVuY2UgaXM6Cisuc3AKKy5uZgorICBzZXQgaG9zdCB0cy54eHguY29tIDIwMDAgICA7IFRlcm1pbmFsLXNlcnZlciBhbmQgcG9ydAorICBzZXQgbW9kZW0gdHlwZSB1c3JvYm90aWNzICA7IE9yIG90aGVyIHN1cHBvcnRlZCB0eXBlCisgIHNldCBkaWFsIG1ldGhvZCB0b25lICAgICAgIDsgKG9yIHB1bHNlKQorICBkaWFsIDc2NTQzMjEgICAgICAgICAgICAgICA7IERpYWwgdGhlIGRlc2lyZWQgbnVtYmVyCisuZmkKKy5zcAorSWYgdGhlIHRlcm1pbmFsIHNlcnZlciBzdXBwb3J0cyB0aGUgVGVsbmV0IENvbSBQb3J0IE9wdGlvbiwgUkZDIDIyMTcsCit5b3UgY2FuIGFsc28gZ2l2ZSBzZXJpYWwtcG9ydCByZWxhdGVkIGNvbW1hbmRzIHN1Y2ggYXMgU0VUIFNQRUVELCBTRVQKK1BBUklUWSwgYW5kIHNvIG9uLCBhbmQgS2VybWl0IHJlbGF5cyB0aGVtIHRvIHRoZSB0ZXJtaW5hbCBzZXJ2ZXIgdXNpbmcKK3RoZSBwcm90b2NvbCBzcGVjaWZpZWQgaW4gdGhlIFJGQy4KKy5zcAorTW9yZSBpbmZvOiBIRUxQIFNFVCBNT0RFTSwgSEVMUCBTRVQgTElORSwgSEVMUCBTRVQgU1BFRUQsIEhFTFAgU0VUCitGTE9XLCBIRUxQIERJQUwsIEhFTFAgU0VUIERJQUwsIEhFTFAgU0VUIE1PREVNLCBIRUxQIFNFVCAKK0NBUlJJRVItV0FUQ0gsIFNIT1cgQ09NTVVOSUNBVElPTlMsIFNIT1cgTU9ERU0sIFNIT1cgRElBTC4KKy5UUAorRGlyZWN0IFNlcmlhbCBQb3J0CitDb25uZWN0IHRoZSB0d28gY29tcHV0ZXJzLCBBIGFuZCBCLCB3aXRoIGEgbnVsbCBtb2RlbSBjYWJsZSAob3IgdHdvCittb2RlbSBjYWJsZXMgaW50ZXJjb25uZWN0ZWQgd2l0aCBhIG51bGwtbW9kZW0gYWRhcHRlciBvciBtb2RlbQorZWxpbWluYXRvcikuIEZyb20gQ29tcHV0ZXIgQToKKy5zcAorLm5mCisgIHNldCBtb2RlbSB0eXBlIG5vbmUgICA7IFRoZXJlIGlzIG5vIG1vZGVtCisgIHNldCBsaW5lIC9kZXYvdHR5UzAgICA7IFNwZWNpZnkgZGV2aWNlIG5hbWUKKyAgc2V0IGNhcnJpZXItd2F0Y2ggb2ZmIDsgSWYgRFRSIENEIGFyZSBub3QgY3Jvc3MtY29ubmVjdGVkCisgIHNldCBzcGVlZCA1NzYwMCAgICAgICA7IE9yIG90aGVyIGRlc2lyZWQgc3BlZWQKKyAgc2V0IGZsb3cgcnRzL2N0cyAgICAgIDsgSWYgUlRTIGFuZCBDVFMgYXJlIGNyb3NzLWNvbm5lY3RlZAorICBzZXQgcGFyaXR5IGV2ZW4gICAgICAgOyAob3IgIm1hcmsiIG9yICJzcGFjZSIsIGlmIG5lY2Vzc2FyeSkKKyAgc2V0IHN0b3AtYml0cyAyICAgICAgIDsgKHJhcmVseSBuZWNlc3NhcnkpCisgIHNldCBmbG93IHhvbi94b2ZmICAgICA7IElmIHlvdSBjYW4ndCB1c2UgUlRTL0NUUworICBjb25uZWN0ICAgICAgICAgICAgICAgOyBFbnRlciBDb25uZWN0ICh0ZXJtaW5hbCkgc3RhdGUKKy5maQorLnNwCitUaGlzIGFzc3VtZXMgQ29tcHV0ZXIgQiBpcyBzZXQgdXAgdG8gbGV0IHlvdSBsb2cgaW4uIElmIGl0IGlzbid0LCB5b3UgCitjYW4gcnVuIGEgY29weSBvZiBLZXJtaXQgb24gQ29tcHV0ZXIgQiBhbmQgZm9sbG93IGFwcHJveGltYXRlbHkgdGhlCitzYW1lIGRpcmVjdGlvbnMuIE1vcmUgaW5mbzogQXMgYWJvdmUgcGx1cyBIRUxQIENPTk5FQ1QuCisuUFAKK1dpdGggbW9kZW1zIG9yIGRpcmVjdCBzZXJpYWwgY29ubmVjdGlvbnMsIHlvdSBtaWdodCBhbHNvIGhhdmUgdG8gInNldAorcGFyaXR5IGV2ZW4iIChvciAibWFyayIgb3IgInNwYWNlIikgaWYgaXQncyBhIDctYml0IGNvbm5lY3Rpb24uCisuUFAKK09mIHRoZSBjb25uZWN0aW9uIHR5cGVzIGxpc3RlZCBhYm92ZSwgb25seSBvbmUgY2FuIGJlIG9wZW4gYXQgYSB0aW1lLgorSG93ZXZlciwgYW55IG9uZSBvZiB0aGVzZSBjYW4gYmUgb3BlbiBjb25jdXJyZW50bHkgd2l0aCBhbiBGVFAgb3IgSFRUUAorc2Vzc2lvbi4gRWFjaCBjb25uZWN0aW9uIHR5cGUgY2FuIGJlIGN1c3RvbWl6ZWQgdG8gYW55IGRlc2lyZWQgZGVncmVlLAorc2NyaXB0ZWQsIGxvZ2dlZCwgeW91IG5hbWUgaXQuIFNlZSB0aGUgbWFudWFsLgorLlBQCitOT1RFOiBPbiBzZWxlY3RlZCBwbGF0Zm9ybXMsIEMtS2VybWl0IGFsc28gY2FuIG1ha2UgWC4yNSBjb25uZWN0aW9ucy4gU2VlCit0aGUgbWFudWFsIGZvciBkZXRhaWxzLgorLlNIIFRSQU5TRkVSUklORyBGSUxFUyBXSVRIIEtFUk1JVAorVGhlcmUgaXMgYSB3aWRlc3ByZWFkIGFuZCBwZXJzaXN0ZW50IGJlbGllZiB0aGF0IEtlcm1pdCBpcyBhIHNsb3cgcHJvdG9jb2wuCitUaGlzIGlzIGJlY2F1c2UsIHVudGlsIHJlY2VudGx5LCBpdCB1c2VkIGNvbnNlcnZhdGl2ZSB0dW5pbmcgYnkgZGVmYXVsdCB0bworbWFrZSBzdXJlIGZpbGUgdHJhbnNmZXJzIHN1Y2NlZWRlZCwgcmF0aGVyIHRoYW4gZmFpbGluZyBiZWNhdXNlIHRoZXkKK292ZXJsb2FkZWQgdGhlIGNvbm5lY3Rpb24uIFNvbWUgZXh0cmEgY29tbWFuZHMgKG9yIGNvbW1hbmQtbGluZSBvcHRpb25zLAorbGlrZSAtUSkgd2VyZSBuZWVkZWQgdG8gbWFrZSBpdCBnbyBmYXN0LCBidXQgbm9ib2R5IGJvdGhlcmVkIHRvIGZpbmQgb3V0CithYm91dCB0aGVtLiBBbHNvLCBpdCB0YWtlcyB0d28gdG8gdGFuZ286IG1vc3Qgbm9uLUtlcm1pdC1Qcm9qZWN0IEtlcm1pdAorcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zIHJlYWxseSBBUkUgc2xvdy4gVGhlIGJlc3QgZmlsZS10cmFuc2ZlciBwYXJ0bmVycworZm9yIEMtS2VybWl0IGFyZTogYW5vdGhlciBjb3B5IG9mIEMtS2VybWl0ICg3LjAgb3IgbGF0ZXIpIGFuZCBLZXJtaXQgOTUuCitUaGVzZSBjb21iaW5hdGlvbnMgd29yayB3ZWxsIGFuZCB0aGV5IHdvcmsgZmFzdCBieSBkZWZhdWx0LiBNUy1ET1MgS2VybWl0CitpcyBnb29kIHRvbywgYnV0IHlvdSBoYXZlIHRvIHRlbGwgaXQgdG8gZ28gZmFzdCAoYnkgZ2l2aW5nIGl0IHRoZSBGQVNUCitjb21tYW5kKS4KKy5QUAorRnVydGhlcm1vcmUsIGFsbCB0aHJlZSBvZiB0aGVzZSBLZXJtaXQgcHJvZ3JhbXMgc3VwcG9ydCAiYXV0b2Rvd25sb2FkIiBhbmQKKyJhdXRvdXBsb2FkIiwgbWVhbmluZyB0aGF0IHdoZW4gdGhleSBhcmUgaW4gQ29ubmVjdCBzdGF0ZSBhbmQgYSBLZXJtaXQKK3BhY2tldCBjb21lcyBpbiBmcm9tIHRoZSByZW1vdGUsIHRoZXkgYXV0b21hdGljYWxseSBzd2l0Y2ggaW50byBmaWxlCit0cmFuc2ZlciBtb2RlLgorLlBQCitBbmQgcGx1cywgQy1LZXJtaXQgYW5kIEs5NSBhbHNvIHN3aXRjaCBhdXRvbWF0aWNhbGx5IGJldHdlZW4gdGV4dCBhbmQKK2JpbmFyeSBtb2RlIGZvciBlYWNoIGZpbGUsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gInNldCBmaWxlIHR5cGUgYmluYXJ5IiBvcgorInNldCBmaWxlIHR5cGUgdGV4dCIsIG9yIHRvIHdvcnJ5IGFib3V0IGZpbGVzIGJlaW5nIGNvcnJ1cHRlZCBiZWNhdXNlIHRoZXkKK3dlcmUgdHJhbnNmZXJyZWQgaW4gdGhlIHdyb25nIG1vZGUuCisuUFAKK1doYXQgYWxsIG9mIHRoZXNlIHdvcmRzIGFkZCB1cCB0byBpcyB0aGF0IG5vdywgd2hlbiB5b3UgdXNlIHVwLXRvLWRhdGUKK0tlcm1pdCBzb2Z0d2FyZSBmcm9tIHRoZSBLZXJtaXQgUHJvamVjdCwgZmlsZSB0cmFuc2ZlciBpcyBub3Qgb25seSBmYXN0LAoraXQncyByaWRpY3Vsb3VzbHkgZWFzeS4gWW91IGJhcmVseSBoYXZlIHRvIGdpdmUgYW55IGNvbW1hbmRzIGF0IGFsbC4KKy5UUAorRG93bmxvYWRpbmcgRmlsZXMKK0xldCdzIHNheSB5b3UgaGF2ZSBLZXJtaXQgOTUsIEMtS2VybWl0LCBvciBNUy1ET1MgS2VybWl0IG9uIHlvdXIKK2Rlc2t0b3AgY29tcHV0ZXIsIHdpdGggYSBjb25uZWN0aW9uIHRvIGEgVW5peCBjb21wdXRlciB0aGF0IGhhcworQy1LZXJtaXQgaW5zdGFsbGVkIGFzICJrZXJtaXQiLiBUbyBkb3dubG9hZCBhIGZpbGUgKHNlbmQgaXQgZnJvbSBVbml4Cit0byB5b3VyIGRlc2t0b3AgY29tcHV0ZXIpLCBqdXN0IHR5cGUgdGhlIGZvbGxvd2luZyBjb21tYW5kIGF0IHlvdXIKK1VuaXggc2hlbGwgcHJvbXB0OgorLnNwCisgIGtlcm1pdCAtcyBvb2ZhLnR4dAorLnNwCisod2hlcmUgb29mYS50eHQgaXMgdGhlIGZpbGVuYW1lKS4gSWYgeW91IHdhbnQgdG8gc2VuZCBtb3JlIHRoYW4gb25lCitmaWxlLCB5b3UgY2FuIHB1dCBhcyBtYW55IGZpbGVuYW1lcyBhcyB5b3Ugd2FudCBvbiB0aGUgY29tbWFuZCBsaW5lLAorYW5kIHRoZXkgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0ZXh0IGFuZCBiaW5hcnk6Cisuc3AKKyAga2VybWl0IC1zIG9vZmEudHh0IG9vZmEuemlwIG9vZmEuaHRtbCBvb2ZhLnRhci5negorLnNwCithbmQvb3IgeW91IGNhbiB1c2Ugd2lsZGNhcmRzIHRvIHNlbmQgZ3JvdXBzIG9mIGZpbGVzOgorLnNwCisgIGtlcm1pdCAtcyBvb2ZhLioKKy5zcAorSWYgeW91IHdhbnQgdG8gc2VuZCBhIGZpbGUgdW5kZXIgYW4gYXNzdW1lZCBuYW1lLCB1c2U6Cisuc3AKKyAga2VybWl0IC1zIGZyaWRheS50eHQgLWEgdG9kYXkudHh0Cisuc3AKK1RoaXMgc2VuZHMgdGhlIGZpbGUgZnJpZGF5LnR4dCBidXQgdGVsbHMgdGhlIHJlY2VpdmluZyBLZXJtaXQgdGhhdCBpdHMKK25hbWUgaXMgdG9kYXkudHh0LiBJbiBhbGwgY2FzZXMsIGFzIG5vdGVkLCB3aGVuIHRoZSBmaWxlIHRyYW5zZmVyIGlzCitmaW5pc2hlZCwgeW91ciBkZXNrdG9wIEtlcm1pdCByZXR1cm5zIGF1dG9tYXRpY2FsbHkgdG8gQ29ubmVjdCBzdGF0ZS4KK05vIHdvcnJpZXMgYWJvdXQgZXNjYXBpbmcgYmFjaywgcmUtY29ubmVjdGluZywgdGV4dC9iaW5hcnkgbW9kZQorc3dpdGNoaW5nLiBBbG1vc3QgdG9vIGVhc3ksIHJpZ2h0PworLlRQCitVcGxvYWRpbmcgRmlsZXMKK1RvIHVwbG9hZCBmaWxlcyAoc2VuZCB0aGVtIGZyb20geW91ciBkZXNrdG9wIGNvbXB1dGVyIHRvIHRoZSByZW1vdGUKK1VuaXggY29tcHV0ZXIpIGRvIHRoZSBzYW1lIHRoaW5nLCBidXQgdXNlIHRoZSAtZyAoR0VUKSBvcHRpb24gaW5zdGVhZAorb2YgLXM6Cisuc3AKKyAga2VybWl0IC1nIG9vZmEudHh0Cisuc3AKK1RoaXMgY2F1c2VzIHlvdXIgbG9jYWwgS2VybWl0IHRvIGVudGVyIHNlcnZlciBtb2RlOyB0aGVuIHRoZSByZW1vdGUKK0tlcm1pdCBwcm9ncmFtIHJlcXVlc3RzIHRoZSBuYW1lZCBmaWxlIGFuZCB0aGUgbG9jYWwgS2VybWl0IHNlbmRzIGl0CithbmQgcmV0dXJucyBhdXRvbWF0aWNhbGx5IHRvIENvbm5lY3Qgc3RhdGUgd2hlbiBkb25lLgorLnNwCitJZiB5b3Ugd2FudCB0byB1cGxvYWQgbXVsdGlwbGUgZmlsZXMsIHlvdSBoYXZlIGhhdmUgdXNlIHNoZWxsIHF1b3RpbmcKK3J1bGVzLCBzaW5jZSB0aGVzZSBhcmVuJ3QgbG9jYWwgZmlsZXM6Cisuc3AKKy5uZgorICBrZXJtaXQgLWcgIm9vZmEudHh0IG9vZmEuemlwIG9vZmEuaHRtbCBvb2ZhLnRhci5neiIKKyAga2VybWl0IC1nICJvb2ZhLioiCisuZmkKKy5zcAorSWYgeW91IHdhbnQgdG8gdXBsb2FkIGEgZmlsZSBidXQgc3RvcmUgaXQgdW5kZXIgYSBkaWZmZXJlbnQgbmFtZSwgdXNlOgorLnNwCisgIGtlcm1pdCAtZyBmcmlkYXkudHh0IC1hIHRvZGF5LnR4dAorLlRQCitLZXJtaXQgVHJhbnNmZXJzIHRoZSBPbGQtRmFzaGlvbmVkIFdheQorSWYgeW91ciBkZXNrdG9wIGNvbW11bmljYXRpb25zIHNvZnR3YXJlIGRvZXMgbm90IHN1cHBvcnQgYXV0b3VwbG9hZCBvcgorYXV0b2Rvd25sb2FkLCBvciBpdCBkb2VzIG5vdCBpbmNsdWRlIEtlcm1pdCBzZXJ2ZXIgbW9kZSwgdGhlIHByb2NlZHVyZQorcmVxdWlyZXMgbW9yZSBzdGVwcy4KKy5zcAorVG8gZG93bmxvYWQgYSBmaWxlLCB0eXBlOgorLnNwCisgIGtlcm1pdCAtcyBmaWxlbmFtZQorLnNwCitvbiB0aGUgaG9zdCBhcyBiZWZvcmUsIGJ1dCBpZiBub3RoaW5nIGhhcHBlbnMgYXV0b21hdGljYWxseSBpbgorcmVzcG9uc2UgdG8gdGhpcyBjb21tYW5kLCB5b3UgaGF2ZSB0byBzd2l0Y2ggeW91ciBkZXNrdG9wCitjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZSBpbnRvIEtlcm1pdCBSZWNlaXZlIHN0YXRlLiBUaGlzIG1pZ2h0IGJlIGRvbmUKK2J5IGVzY2FwaW5nIGJhY2sgdXNpbmcga2V5Ym9hcmQgY2hhcmFjdGVycyBvciBob3Qga2V5cyAoQWx0LXggaXMKK3R5cGljYWwpIGFuZC9vciB3aXRoIGEgY29tbWFuZCAobGlrZSBSRUNFSVZFKSBvciBhIG1lbnUuIFdoZW4gdGhlIGZpbGUKK3RyYW5zZmVyIGlzIGNvbXBsZXRlLCB5b3UgaGF2ZSB0byBnbyBiYWNrIHRvIENvbm5lY3Qgc3RhdGUsIFRlcm1pbmFsCitlbXVsYXRpb24sIG9yIHdoYXRldmVyIHRlcm1pbm9sb2d5IGFwcGxpZXMgdG8geW91ciBkZXNrdG9wCitjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZS4KKy5zcAorVG8gdXBsb2FkIGEgZmlsZSwgdHlwZToKKy5zcAorICBrZXJtaXQgLXIKKy5zcAorb24gdGhlIGhvc3QgKHJhdGhlciB0aGFuICJrZXJtaXQgLWciKS4gVGhpcyB0ZWxscyBDLUtlcm1pdCB0byB3YWl0CitwYXNzaXZlbHkgZm9yIGEgZmlsZSB0byBzdGFydCBhcnJpdmluZy4gVGhlbiByZWdhaW4gdGhlIGF0dGVudGlvbiBvZgoreW91ciBkZXNrdG9wIHNvZnR3YXJlIChBbHQteCBvciB3aGF0ZXZlcikgYW5kIGluc3RydWN0IGl0IHRvIHNlbmQgdGhlCitkZXNpcmVkIGZpbGUocykgd2l0aCBLZXJtaXQgcHJvdG9jb2wuIFdoZW4gdGhlIHRyYW5zZmVyIGlzIGZpbmlzaGVkLAorcmV0dXJuIHRvIHRoZSBDb25uZWN0IG9yIFRlcm1pbmFsIHNjcmVlbi4KKy5UUAorSWYgRmlsZSBUcmFuc2ZlciBGYWlscworQWx0aG91Z2ggZXZlcnkgYXNwZWN0IG9mIEtlcm1pdCdzIG9wZXJhdGlvbiBjYW4gYmUgZmluZWx5IHR1bmVkLCB0aGVyZQorYXJlIGFsc28gdGhyZWUgc2hvcnQgYW5kIHNpbXBsZSAib21uaWJ1cyB0dW5pbmciIGNvbW1hbmRzIHlvdSBjYW4gdXNlCitmb3IgdHJvdWJsZXNob290aW5nOgorLlJTCisuVFAKK0ZBU1QKK1VzZSBmYXN0IGZpbGUtdHJhbnNmZXIgc2V0dGluZ3MuIFRoaXMgaGFzIGJlZW4gdGhlIGRlZmF1bHQgc2luY2UKK0MtS2VybWl0IDcuMCBub3cgdGhhdCBtb3N0IG1vZGVybiBjb21wdXRlcnMgYW5kIGNvbm5lY3Rpb25zCitzdXBwb3J0IGl0LiBJZiB0cmFuc2ZlcnMgZmFpbCB3aXRoIGZhc3Qgc2V0dGluZ3MsIHRyeSAuIC4gLgorLlRQCitDQVVUSU9VUworVXNlIGNhdXRpb3VzIGJ1dCBub3QgcGFyYW5vaWQgc2V0dGluZ3MuIEZpbGUgdHJhbnNmZXJzLCBpZiB0aGV5Cit3b3JrLCB3aWxsIGdvIGF0IG1lZGl1bSBzcGVlZC4gSWYgbm90LCB0cnkgLiAuIC4KKy5UUAorUk9CVVNUCitVc2UgdGhlIG1vc3Qgcm9idXN0LCByZXNpbGllbnQsIGNvbnNlcnZhdGl2ZSwgc2FmZSwgYW5kIHJlbGlhYmxlCitzZXR0aW5ncy4gRmlsZSB0cmFuc2ZlcnMgd2lsbCBhbG1vc3QgY2VydGFpbmx5IHdvcmssIGJ1dCB0aGV5Cit3aWxsIGJlIHF1aXRlIHNsb3cgKG9mIGNvdXJzZSB0aGlzIGlzIGEgY2xhc3NpYyB0cmFkZW9mZjsgUk9CVVNUCit3YXMgQy1LZXJtaXQncyBkZWZhdWx0IHR1bmluZyBpbiB2ZXJzaW9ucyA2LjAgYW5kIGVhcmxpZXIsIHdoaWNoCittYWRlIGV2ZXJ5Ym9keSB0aGluayBLZXJtaXQgcHJvdG9jb2wgd2FzIHNsb3cpLiBJZiBST0JVU1QgZG9lc24ndAorZG8gdGhlIHRyaWNrLCB0cnkgYWdhaW4gd2l0aCBTRVQgUEFSSVRZIFNQQUNFIGZpcnN0IGluIGNhc2UgaXQncworbm90IGFuIDgtYml0IGNvbm5lY3Rpb24uCisuUkUKKy5zcAorT2J2aW91c2x5IHRoZSBzdWNjZXNzIGFuZCBwZXJmb3JtYW5jZSBvZiBhIGZpbGUgdHJhbnNmZXIgYWxzbyBkZXBlbmRzCitvbiBDLUtlcm1pdCdzIGZpbGUgdHJhbnNmZXIgcGFydG5lci4gVXAtdG8tZGF0ZSwgcmVhbCBLZXJtaXQgUHJvamVjdAorcGFydG5lcnMgYXJlIHJlY29tbWVuZGVkIGJlY2F1c2UgdGhleSBjb250YWluIHRoZSBiZXN0IEtlcm1pdCBwcm90b2NvbAoraW1wbGVtZW50YXRpb25zIGFuZCBiZWNhdXNlIHdlIGNhbiBzdXBwb3J0IHRoZW0gaW4gY2FzZSBvZiB0cm91YmxlLgorLnNwCitJZiB5b3Ugc3RpbGwgaGF2ZSB0cm91YmxlLCBjb25zdWx0IENoYXB0ZXIgMTAgb2YgVXNpbmcgQy1LZXJtaXQsIG9yCitzZW5kIGVtYWlsIHRvIGtlcm1pdC1zdXBwb3J0QGNvbHVtYmlhLmVkdS4KKy5UUAorQWR2YW5jZWQgS2VybWl0IEZpbGUtVHJhbnNmZXIgRmVhdHVyZXMKK09idmlvdXNseSB0aGVyZSBpcyBhIGxvdCBtb3JlIHRvIEtlcm1pdCBmaWxlIHRyYW5zZmVyLCBpbmNsdWRpbmcgYWxsCitzb3J0cyBvZiBpbnRlcmFjdGl2ZSBjb21tYW5kcywgcHJlZmVyZW5jZXMsIG9wdGlvbnMsIGxvZ2dpbmcsCitkZWJ1Z2dpbmcsIHRyb3VibGVzaG9vdGluZywgYW5kIGFueXRoaW5nIGVsc2UgeW91IGNhbiBpbWFnaW5lIGJ1dAordGhhdCdzIHdoYXQgdGhlIG1hbnVhbCBhbmQgdXBkYXRlcyBhcmUgZm9yLiBIZXJlIGFyZSBhIGZldyB0b3BpY3MgeW91CitjYW4gZXhwbG9yZSBpZiB5b3UncmUgaW50ZXJlc3RlZCBieSBUeXBpbmcgSEVMUCBmb3IgdGhlIGxpc3RlZAorY29tbWFuZHM6CisuUlMKKy5UUAorTG9nZ2luZyB0cmFuc2ZlcnM6CitMT0cgVFJBTlNBQ1RJT05TIChIRUxQIExPRykKKy5UUAorQXV0b21hdGljIHBlci1maWxlIHRleHQvYmluYXJ5IG1vZGUgc3dpdGNoaW5nOgorU0VUIFRSQU5TRkVSIE1PREUgeyBBVVRPTUFUSUMsIE1BTlVBTCB9IChIRUxQIFNFVCBUUkFOU0ZFUikuCisuVFAKK0Nyb3NzLXBsYXRmb3JtIHJlY3Vyc2l2ZSBkaXJlY3RvcnkgdHJlZSB0cmFuc2ZlcjoKK1NFTkQgL1JFQ1VSU0lWRSwgR0VUIC9SRUNVUlNJVkUgKEhFTFAgU0VORCwgSEVMUCBHRVQpLgorLlRQCitGaWxlIGNvbGxpc2lvbiBvcHRpb25zOgorU0VUIEZJTEUgQ09MTElTSU9OIHsgT1ZFUldSSVRFLCBCQUNLVVAsIERJU0NBUkQsIC4uLiB9IChIRUxQIFNFVCBGSUxFKS4KKy5UUAorVXBkYXRlOiBUcmFuc2ZlciBvbmx5IGZpbGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWU6CitTRVQgRklMRSBDT0xMSVNJT04gVVBEQVRFIChIRUxQIFNFVCBGSUxFKS4KKy5UUAorRmlsZW5hbWUgc2VsZWN0aW9uIHBhdHRlcm5zOgorKEhFTFAgV0lMRENBUkQpLgorLlRQCitGbGV4aWJsZSBmaWxlIHNlbGVjdGlvbjoKK1NFTkQgKG9yIEdFVCkgL0JFRk9SRSAvQUZURVIgL0xBUkdFUiAvU01BTExFUiAvVFlQRSAvRVhDRVBULCAuLi4KKy5UUAorQ2hhcmFjdGVyLXNldCBjb252ZXJzaW9uOgorU0VUIHsgRklMRSwgVFJBTlNGRVIgfSBDSEFSQUNURVItU0VULCBBU1NPQ0lBVEUsIC4uLgorLlRQCitGaWxlL1BhdGhuYW1lIGNvbnRyb2w6CitTRVQgeyBTRU5ELCBSRUNFSVZFIH0gUEFUSE5BTUVTLCBTRVQgRklMRSBOQU1FUy4KKy5UUAorQXRvbWljIGZpbGUgbW92ZW1lbnQ6CitTRU5EIChvciBHRVQpIC9ERUxFVEUgL1JFTkFNRSAvTU9WRS1UTworLlRQCitUcmFuc2ZlcnJpbmcgdG8vZnJvbSBzdGFuZGFyZCBpL28gb2Ygb3RoZXIgY29tbWFuZHM6CitTRU5EIChvciBHRVQpIC9DT01NQU5ECisuVFAKK1JlY292ZXJ5IG9mIGludGVycnVwdGVkIHRyYW5zZmVyIGZyb20gcG9pbnQgb2YgZmFpbHVyZToKK1JFU0VORCwgUkVHRVQgKEhFTFAgUkVTRU5ELCBIRUxQIFJFR0VUKS4KKy5SRQorLlRQCitOb24tS2VybWl0IEZpbGUgVHJhbnNmZXIKK1lvdSBjYW4gYWxzbyB1c2UgQy1LZXJtaXQgdG8gdHJhbnNmZXIgZmlsZXMgd2l0aCBGVFAgb3IgSFRUUCBJbnRlcm5ldAorcHJvdG9jb2xzOyBzZWUgYmVsb3cuCisuc3AKK09uIGEgcmVndWxhciBzZXJpYWwgb3IgVGVsbmV0IGNvbm5lY3Rpb24gd2hlcmUgdGhlIG90aGVyIGNvbXB1dGVyCitkb2Vzbid0IHN1cHBvcnQgS2VybWl0IHByb3RvY29sIGF0IGFsbCwgeW91IGhhdmUgc2V2ZXJhbCBvcHRpb25zLiBGb3IKK2V4YW1wbGUsIGlmIHlvdXIgZGVza3RvcCBjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZSBzdXBwb3J0cyBabW9kZW0sIHVzZQorInJ6IiBhbmQgInN6IiBvbiB0aGUgaG9zdCByYXRoZXIgdGhhbiBLZXJtaXQuIEJ1dCBpZiBLZXJtaXQgaXMgeW91cgorZGVza3RvcCBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgdXNpbmcgaXQgdG8gbWFrZSBjYWxscyBvciBuZXR3b3JrCitjb25uZWN0aW9ucyB0byBvdGhlciBjb21wdXRlcnMgdGhhdCBkb24ndCBzdXBwb3J0IEtlcm1pdCBwcm90b2NvbCAob3IKK3RoYXQgZG9uJ3QgaGF2ZSBhIGdvb2QgaW1wbGVtZW50YXRpb24gb2YgaXQpLCB0aGVuIGlmIHlvdXIgY29tcHV0ZXIKK2Fsc28gaGFzIGV4dGVybmFsIFgsIFksIG9yIFptb2RlbSBwcm9ncmFtcyB0aGF0IGFyZSByZWRpcmVjdGFibGUsCitLZXJtaXQgY2FuIHVzZSB0aGVtIGFzIGV4dGVybmFsIHByb3RvY29scy4gSEVMUCBTRVQgUFJPVE9DT0wgZm9yCitkZXRhaWxzLgorLnNwCitZb3UgY2FuIGFsc28gY2FwdHVyZSAicmF3IiBkYXRhIHN0cmVhbXMgZnJvbSB0aGUgb3RoZXIgY29tcHV0ZXIgd2l0aAorTE9HIFNFU1NJT04gKEhFTFAgTE9HIGFuZCBIRUxQIFNFVCBTRVNTSU9OLUxPRyBmb3IgZGV0YWlscyksIGFuZCB5b3UKK2NhbiB1cGxvYWQgZmlsZXMgd2l0aG91dCBhbnkgcHJvdG9jb2wgYXQgYWxsIHdpdGggVFJBTlNNSVQgKEhFTFAKK1RSQU5TTUlULCBIRUxQIFNFVCBUUkFOU01JVCkuCisuU0ggS0VSTUlUJ1MgQlVJTFQtSU4gRlRQIEFORCBIVFRQIENMSUVOVFMKK0tlcm1pdCdzIEZUUCBjbGllbnQgaXMgbGlrZSB0aGUgcmVndWxhciBVbml4IEZUUCBjbGllbnQgdGhhdCB5b3UncmUgdXNlZAordG8sIGJ1dCB3aXRoIHNvbWUgZGlmZmVyZW5jZXM6CisuVFAKK1woYnUKK0l0IGhhcyBsb3RzIG1vcmUgY29tbWFuZHMgYW5kIGZlYXR1cmVzLgorLlRQCitcKGJ1CitFYWNoIEZUUCBjb21tYW5kIG11c3QgYmUgcHJlZml4ZWQgd2l0aCAiZnRwIiwgZm9yIGV4YW1wbGUgImZ0cCBvcGVuIiwKKyJmdHAgZ2V0IiwgImZ0cCBieWUiLCBldGMgKHRoaXMgaXMgbm90IHN0cmljdGx5IHRydWUsIGJ1dCB1bnRpbCB5b3UncmUKK21vcmUgZmFtaWxpYXIgd2l0aCBpdCwgaXQncyBiZXN0IHRvIGZvbGxvdyB0aGlzIHJ1bGUpLgorLlRQCitcKGJ1CitDb21tYW5kcyBsaWtlICJjZCIsICJkaXJlY3RvcnkiLCBldGMsIGV4ZWN1dGUgbG9jYWxseSwgbm90IG9uIHRoZQorc2VydmVyLiBVc2UgImZ0cCBjZCIsICJmdHAgZGlyIiwgZXRjLCB0byBoYXZlIHRoZW0gYWN0IG9uIHRoZSBzZXJ2ZXIuCisuVFAKK1woYnUKK1lvdSBjYW4gaGF2ZSBhbiBGVFAgc2Vzc2lvbiBhbmQgYSByZWd1bGFyIEtlcm1pdCBzZXJpYWwgb3IgVGVsbmV0CitzZXNzaW9uIG9wZW4gYXQgdGhlIHNhbWUgdGltZS4KKy5UUAorXChidQorRlRQIHNlc3Npb25zIGNhbiBiZSBmdWxseSBhdXRvbWF0ZWQuCisuUFAKK1BlbmRpbmcgcHVibGljYXRpb24gb2YgdGhlIG5leHQgZWRpdGlvbiBvZiB0aGUgbWFudWFsLCB0aGUgS2VybWl0IEZUUAorY2xpZW50IGlzIHRob3JvdWdobHkgZG9jdW1lbnRlZCBhdCB0aGUgS2VybWl0IFByb2plY3Qgd2Vic2l0ZToKKy5zcAorICBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvZnRwY2xpZW50Lmh0bWwKKy5zcAorWW91IGFsc28gY2FuIHVzZSBIRUxQIEZUUCBhbmQgSEVMUCBTRVQgRlRQIHRvIGdldCBkZXNjcmlwdGlvbnMgb2YgS2VybWl0J3MKK0ZUUC1yZWxhdGVkIGNvbW1hbmRzLgorLlBQCitUaGUgSFRUUCBjbGllbnQgaXMgc2ltaWxhciB0byB0aGUgRlRQIG9uZSwgZXhjZXB0IHlvdSBwcmVmaXggZWFjaCBjb21tYW5kCit3aXRoIEhUVFAgaW5zdGVhZCBvZiBGVFA6IEhUVFAgT1BFTiwgSFRUUCBHRVQsIEhUVFAgUFVULCBIVFRQIENMT1NFLCBldGMuCitUeXBlIEhFTFAgSFRUUCBmb3IgZGV0YWlscywgb3IgdmlzaXQgdGhlIHRvIHZpZXcgdGhlIG1hbnVhbCBzdXBwbGVtZW50cy4KK0hUVFAgY29ubmVjdGlvbnMgY2FuIGJlIG9wZW4gYXQgdGhlIHNhbWUgdGltZSBhcyByZWd1bGFyIHNlcmlhbCBvciBUZWxuZXQKK2Nvbm5lY3Rpb25zIGFuZCBGVFAgY29ubmVjdGlvbnMuIFNvIEtlcm1pdCBjYW4gbWFuYWdlIHVwIHRvIHRocmVlIHR5cGVzCitjb25uZWN0aW9ucyBzaW11bHRhbmVvdXNseS4KKy5TSCBJTlRFUk5FVCBLRVJNSVQgU0VSVklDRQorQy1LZXJtaXQgY2FuIGJlIGNvbmZpZ3VyZWQgYW5kIHJ1biBhcyBhbiBJbnRlcm5ldCBzZXJ2aWNlIChjYWxsZWQgSUtTRCksCitzaW1pbGFyIHRvIGFuIEZUUCBzZXJ2ZXIgKEZUUEQpIGV4Y2VwdCB5b3UgY2FuIChidXQgbmVlZCBub3QpIGludGVyYWN0IHdpdGgKK2l0IGRpcmVjdGx5LCBwbHVzIGl0IGRvZXMgYSBsb3QgbW9yZSB0aGFuIGFuIEZUUCBzZXJ2ZXIgY2FuIGRvLiBUaGUgVENQCitwb3J0IGZvciBJS1NEIGlzIDE2NDkuIEl0IHVzZXMgVGVsbmV0IHByb3RvY29sLiBDLUtlcm1pdCBjYW4gYmUgYW4gSW50ZXJuZXQKK0tlcm1pdCBTZXJ2ZXIsIG9yIGl0IGNhbiBiZSBhIGNsaWVudCBvZiBhbiBJS1NELiBZb3UgY2FuIG1ha2UgY29ubmVjdGlvbnMKK2Zyb20gQy1LZXJtaXQgdG8gYW4gSUtTRCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorLnNwCisubmYKKyAgdGVsbmV0IGZvby5iYXIuZWR1IDE2NDkKKyAgdGVsbmV0IGZvby5iYXIuZWR1IGtlcm1pdCAgIDsgaWYgImtlcm1pdCIgaXMgbGlzdGVkIGluIC9ldGMvc2VydmljZXMKKyAgaWtzZCBmb28uYmFyLmVkdQorLmZpCisuc3AKK1RoZSBJS1NEIGNvbW1hbmQgaXMgZXF1aXZhbGVudCB0byBhIFRFTE5FVCBjb21tYW5kIHNwZWNpZnlpbmcgcG9ydCAxNjQ5LgorRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbWFraW5nIGFuZCB1c2luZyBjb25uZWN0aW9ucyB0byBhbiBJS1NELCBzZWU6Cisuc3AKKyAgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2N1aWtzZC5odG1sCisuc3AKK1lvdSBjYW4gcnVuIGFuIEludGVybmV0IEtlcm1pdCBTZXJ2aWNlIG9uIHlvdXIgb3duIGNvbXB1dGVyIHRvbyAoaWYgeW91IGFyZQordGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yKS4gRm9yIGluc3RydWN0aW9ucywgc2VlOgorLnNwCisgIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pa3NkLmh0bWwKKy5TSCBTRUNVUklUWQorQWxsIG9mIEMtS2VybWl0J3MgYnVpbHQtaW4gVENQL0lQIG5ldHdvcmtpbmcgbWV0aG9kcyAoVGVsbmV0LCBSbG9naW4sIElLU0QsCitGVFAsIGFuZCBIVFRQKSBjYW4gYmUgc2VjdXJlZCBieSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIElFVEYtYXBwcm92ZWQKK21ldGhvZHM6CisuUFAKK1woYnUJTUlUIEtlcmJlcm9zIElWCisuYnIKK1woYnUJTUlUIEtlcmJlcm9zIFYKKy5icgorXChidQlTU0wvVExTCisuYnIKK1woYnUJU3RhbmZvcmQgU1JQCisuUFAKK0ZvciBjb21wbGV0ZSBpbnN0cnVjdGlvbnMgc2VlOgorLlBQCisgIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zZWN1cml0eS5odG1sCisuUFAKK0FuZCBhcyBub3RlZCBwcmV2aW91c2x5LCB5b3UgY2FuIGFsc28gbWFrZSBTU0ggY29ubmVjdGlvbnMgd2l0aCBDLUtlcm1pdCBpZgoreW91IGFscmVhZHkgaGF2ZSBhbiBTU0ggY2xpZW50IGluc3RhbGxlZC4KKy5TSCBBTFRFUk5BVElWRSBDT01NQU5ELUxJTkUgUEVSU09OQUxJVElFUworV2hlbiBpbnZva2VkIGFzICJrZXJtaXQiIG9yIGFueSBvdGhlciBuYW1lIGJlc2lkZXMgImZ0cCIgb3IgInRlbG5ldCIsCitDLUtlcm1pdCBoYXMgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIGRlc2NyaWJlZCBhYm92ZSBpbiB0aGUgT1BUSU9OUworc2VjdGlvbi4gSG93ZXZlciwgaWYgeW91IGludm9rZSBDLUtlcm1pdCBhcyAidGVsbmV0IiBvciAiZnRwIiwgaXQgY2hhbmdlcworaXRzIGNvbW1hbmQtbGluZSBwZXJzb25hbGl0eSB0byBtYXRjaC4gVGhpcyBjYW4gYmUgZG9uZSAoYW1vbmcgb3RoZXIgd2F5cykKK3dpdGggc3ltYm9saWMgbGlua3MgKHN5bWxpbmtzKS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IEMtS2VybWl0IHRvIGJlCit5b3VyIHJlZ3VsYXIgVGVsbmV0IGNsaWVudCwgb3IgdGhlIFRlbG5ldCBoZWxwZXIgb2YgeW91ciBXZWIgYnJvd3NlciwgeW91CitjYW4gY3JlYXRlIGEgbGluayBsaWtlIHRoZSBmb2xsb3dpbmcgaW4gYSBkaXJlY3RvcnkgdGhhdCBsaWVzIGluIHlvdXIgUEFUSAorYWhlYWQgb2YgdGhlIHJlZ3VsYXIgdGVsbmV0IHByb2dyYW06Cisuc3AKKyAgbG4gLXMgL3Vzci9sb2NhbC9iaW4va2VybWl0IHRlbG5ldAorLnNwCitOb3cgd2hlbiB5b3UgZ2l2ZSBhICJ0ZWxuZXQiIGNvbW1hbmQsIHlvdSBhcmUgaW52b2tpbmcgS2VybWl0IGluc3RlYWQsIGJ1dAord2l0aCBpdHMgVGVsbmV0IGNvbW1hbmQtbGluZSBwZXJzb25hbGl0eSBzbywgZm9yIGV4YW1wbGU6Cisuc3AKKyAgdGVsbmV0IHh5emNvcnAuY29tCisuc3AKK01ha2VzIGEgVGVsbmV0IGNvbm5lY3Rpb24gdG8geHl6Y29ycC5jb20sIGFuZCBLZXJtaXQgZXhpdHMgYXV0b21hdGljYWxseQord2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgKGp1c3QgbGlrZSB0aGUgcmVndWxhciBUZWxuZXQgY2xpZW50KS4gVHlwZQorInRlbG5ldCAtaCIgdG8gZ2V0IGEgbGlzdCBvZiBLZXJtaXQncyBUZWxuZXQtcGVyc29uYWxpdHkgY29tbWFuZC1saW5lCitvcHRpb25zLCB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgYXMgY29tcGF0aWJsZSBhcyBwb3NzaWJsZSB3aXRoIHRoZQorcmVndWxhciBUZWxuZXQgY2xpZW50LgorLlBQCitTaW1pbGFybHkgZm9yIEZUUDoKKy5zcAorICBsbiAtcyAvdXNyL2xvY2FsL2Jpbi9rZXJtaXQgZnRwCisuc3AKK0FuZCBub3cgdHlwZSAiZnRwIC1oIiB0byBzZWUgaXRzIGNvbW1hbmQtbGluZSBvcHRpb25zLCBhbmQgY29tbWFuZCBsaW5lcworanVzdCBsaWtlIHlvdSB3b3VsZCBnaXZlIHlvdXIgcmVndWxhciBGVFAgY2xpZW50OgorLnNwCisgIGZ0cCB4eXpjb3JwLmNvbQorLnNwCitidXQgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnMgYWxsb3dpbmcgYW4gZW50aXJlIHNlc3Npb24gdG8gYmUgc3BlY2lmaWVkIG9uCit0aGUgY29tbWFuZCBsaW5lLiBGaW5hbGx5LCBpZiBLZXJtaXQncworZmlyc3QgY29tbWFuZC1saW5lIG9wdGlvbiBpcyBhIFRlbG5ldCwgRlRQLCBJS1NELCBvciBIVFRQIFVSTCwgS2VybWl0CithdXRvbWF0aWNhbGx5IG1ha2VzIHRoZSBhcHByb3ByaWF0ZSBraW5kIG9mIGNvbm5lY3Rpb24gYW5kLCBpZiBpbmRpY2F0ZWQgYnkKK3RoZSBVUkwsIHRha2VzIHRoZSBkZXNpcmVkIGFjdGlvbjoKKy5UUAora2VybWl0IHRlbG5ldDp4eXpjb3JwLmNvbQorT3BlbnMgYSBUZWxuZXQgc2Vzc2lvbgorLlRQCitrZXJtaXQgdGVsbmV0Oi8vb2xnYUB4eXpjb3JwLmNvbQorRGl0dG8gZm9yIHVzZXIgb2xnYQorLlRQCitrZXJtaXQgZnRwOi8vb2xnYUB4eXpjb3JwLmNvbS9wdWJsaWMvb29mYS56aXAKK0Rvd25sb2FkcyBhIGZpbGUKKy5UUAora2VybWl0IGtlcm1pdDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvUkVBRC5NRQorRGl0dG8gZm9yIElLU0QKKy5UUAora2VybWl0IGlrc2Q6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL1JFQUQuTUUKKyhUaGlzIHdvcmtzIHRvbykKKy5UUAora2VybWl0IGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG1sCitHcmFicyBhIHdlYiBwYWdlCisuZmkKKy5TSCBMSUNFTlNFCitDLUtlcm1pdCBoYXMgYW4gdW51c3VhbCBsaWNlbnNlLCBidXQgYSBmYWlyIGFuZCBzZW5zaWJsZSBvbmUgc2luY2UgdGhlCitLZXJtaXQgUHJvamVjdCBtdXN0IHN1cHBvcnQgaXRzZWxmIG91dCBvZiByZXZlbnVlOiBpdCdzIG5vdCBhIEJTRCBsaWNlbnNlLAorbm90IEdQTCwgbm90IEFydGlzdGljLCBub3QgY29tbWVyY2lhbCwgbm90IHNoYXJld2FyZSwgbm90IGZyZWV3YXJlLiBJdCBjYW4KK2JlIHN1bW1lZCB1cCBsaWtlIHRoaXM6IGlmIHlvdSB3YW50IEMtS2VybWl0IGZvciB5b3VyIG93biB1c2UsIHlvdSBjYW4KK2Rvd25sb2FkIGFuZCB1c2UgaXQgd2l0aG91dCBjb3N0IG9yIGxpY2Vuc2UgKGJ1dCB3ZSdkIGFwcHJlY2lhdGUgaXQgaWYgeW91Cit3b3VsZCBwdXJjaGFzZSB0aGUgbWFudWFsKS4gQnV0IGlmIHlvdSB3YW50IHRvIHNlbGwgQy1LZXJtaXQgb3IgYnVuZGxlIGl0Cit3aXRoIGEgcHJvZHVjdCBvciBvdGhlcndpc2UgZGlzdHJpYnV0ZSBpdCBpbiBhIGNvbW1lcmNpYWwgc2V0dGluZyBFWENFUFQKK1dJVEggQU4gT1BFTi1TT1VSQ0UgT1BFUkFUSU5HIFNZU1RFTSBESVNUUklCVVRJT04gc3VjaCBhcyBMaW51eCwgRnJlZUJTRCwKK05ldEJTRCwgb3IgT3BlbkJTRCwgeW91IG11c3QgbGljZW5zZSBpdC4gVG8gc2VlIHRoZSBjb21wbGV0ZSBsaWNlbnNlLCBnaXZlCit0aGUgTElDRU5TRSBjb21tYW5kIGF0IHRoZSBwcm9tcHQsIG9yIHNlZSB0aGUgQ09QWUlORy5UWFQgZmlsZSBkaXN0cmlidXRlZAord2l0aCBDLUtlcm1pdCA3LjAgb3IgbGF0ZXIsIG9yIGRvd25sb2FkIGl0IGZyb20KKy5zcAorICBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9DT1BZSU5HLlRYVAorLnNwCitTZW5kIGxpY2Vuc2luZyBpbnF1aXJpZXMgdG8ga2VybWl0QGNvbHVtYmlhLmVkdS4KKy5TSCBCVUdTCitTZWUgdGhlIGZvbGxvd2luZyBmaWxlcyBmb3IgbGlzdGluZ3Mgb2Yga25vd24gYnVncywgbGltaXRhdGlvbnMsCit3b3JrYXJvdW5kcywgaGludHMgYW5kIHRpcHM6CisuVFAKK2NrY2J3ci50eHQKK0dlbmVyYWwgQy1LZXJtaXQgYnVncywgaGludHMsIHRpcHMuCisuVFAKK2NrdWJ3ci50eHQKK1VuaXgtc3BlY2lmaWMgQy1LZXJtaXQgYnVncywgaGludHMsIHRpcHMuCisuUFAKK1JlcG9ydCBidWdzIGFuZCBwcm9ibGVtcyBieSBlbWFpbCB0bzoKKy5zcAorICAga2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1LgorLnNwCitCZWZvcmUgcmVxdWVzdGluZyB0ZWNobmljYWwgc3VwcG9ydCwgcGxlYXNlIHJlYWQgdGhlIGhpbnRzIGhlcmU6Cisuc3AKKyAgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3N1cHBvcnQuaHRtbAorLnNwCithbmQgYWxzbyByZWFkIHRoZSBDLUtlcm1pdCBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczoKKy5zcAorICBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tmYXEuaHRtbAorLlNIIE9USEVSIFRPUElDUworVGhlcmUncyB3YXkgbW9yZSB0byBDLUtlcm1pdCB0aGFuIHdlJ3ZlIHRvdWNoZWQgb24gaGVyZSAtLSB0cm91Ymxlc2hvb3RpbmcsCitjdXN0b21pemF0aW9uLCBjaGFyYWN0ZXIgc2V0cywgZGlhbGluZyBkaXJlY3Rvcmllcywgc2VuZGluZyBwYWdlcywgc2NyaXB0Cit3cml0aW5nLCBhbmQgb24gYW5kIG9uLCBhbGwgb2Ygd2hpY2ggYXJlIGNvdmVyZWQgaW4gdGhlIG1hbnVhbCBhbmQgdXBkYXRlcworYW5kIHN1cHBsZW1lbnRzLiBGb3IgdGhlIG1vc3QgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbiBvbiBkb2N1bWVudGF0aW9uIChvcgordXBkYXRlZCBkb2N1bWVudGF0aW9uIGl0c2VsZikgdmlzaXQgdGhlIEtlcm1pdCBQcm9qZWN0IHdlYnNpdGU6Cisuc3AKKyAgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworLlBQCitUaGVyZSB5b3Ugd2lsbCBhbHNvIGZpbmQgS2VybWl0IHNvZnR3YXJlIHBhY2thZ2VzIGZvciBvdGhlciBwbGF0Zm9ybXM6CitkaWZmZXJlbnQgVW5peCB2YXJpZXRpZXMsIFdpbmRvd3MsIERPUywgVk1TLCBJQk0gbWFpbmZyYW1lcywgYW5kIG1hbnkKK290aGVyczogMjArIHllYXJzJyB3b3J0aC4KKy5TSCBET0NVTUVOVEFUSU9OIEFORCBVUERBVEVTCitUaGUgbWFudWFsIGZvciBDLUtlcm1pdCBpczoKKy5UUAorLkkKK1VzaW5nIEMtS2VybWl0CitGcmFuayBkYSBDcnV6IGFuZCBDaHJpc3RpbmUgTS4gR2lhbm9uZSwKK1NlY29uZCBFZGl0aW9uLCBEaWdpdGFsIFByZXNzIC8gQnV0dGVyd29ydGgtSGVpbmVtYW5uLCBXb2J1cm4sIE1BLCAxOTk3LCA2MjIKK3BhZ2VzLCBJU0JOIDEtNTU1NTgtMTY0LTEuIFRoaXMgaXMgYSBwcmludGVkIGJvb2suIEl0IGNvdmVycyBDLUtlcm1pdCA2LjAuCisuVFAKK1RoZSBDLUtlcm1pdCA3LjAgU3VwcGxlbWVudAoraHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQyLmh0bWwKKy5UUAorVGhlIEMtS2VybWl0IDguMCBTdXBwbGVtZW50CitodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDMuaHRtbAorLlBQCitWaXNpdCBDLUtlcm1pdCBob21lIHBhZ2U6Cisuc3AKKyAgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorLnNwCit0byBsZWFybiBhYm91dCBuZXcgdmVyc2lvbnMsIEJldGEgdGVzdHMsIGFuZCBvdGhlciBuZXdzOyB0bworcmVhZCBjYXNlIHN0dWRpZXMgYW5kIHR1dG9yaWFsczsgdG8gZG93bmxvYWQgc291cmNlIGNvZGUsIGluc3RhbGwgcGFja2FnZXMsCithbmQgcHJlYnVpbHQgYmluYXJpZXMgZm9yIG1hbnkgcGxhdGZvcm1zLiBBbHNvIHZpc2l0OgorLlRQCitodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2NyaXB0bGliLmh0bWwKK1RoZSBLZXJtaXQgc2NyaXB0IGxpYnJhcnkgYW5kIHR1dG9yaWFsCisuVFAKK2h0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9uZXdmYXEuaHRtbAorVGhlIEtlcm1pdCBGQVEgKEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IEtlcm1pdCkKKy5UUAoraHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZmFxLmh0bWwKK1RoZSBDLUtlcm1pdCBGQVEgKEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IEMtS2VybWl0KQorLlRQCitodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvdGVsbmV0Lmh0bWwKK0MtS2VybWl0IFRlbG5ldCBjbGllbnQgZG9jdW1lbnRhdGlvbgorLlRQCitodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtbAorQy1LZXJtaXQgc2VjdXJpdHkgZG9jdW1lbnRhdGlvbiAoS2VyYmVyb3MsIFNTTC9UTFMsIGV0YykKKy5UUAoraHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2N1aWtzZC5odG1sCitJbnRlcm5ldCBLZXJtaXQgU2VydmljZSB1c2VyIGRvY3VtZW50YXRpb24KKy5UUAoraHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2lrc2QuaHRtbAorSW50ZXJuZXQgS2VybWl0IFNlcnZpY2UgYWRtaW5pc3RyYXRvciBkb2N1bWVudGF0aW9uCisuVFAKK2h0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zdHVkaWVzLmh0bWwKK0Nhc2Ugc3R1ZGllcy4KKy5UUAoraHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3N1cHBvcnQuaHRtbAorVGVjaG5pY2FsIHN1cHBvcnQuCisuVFAKK2h0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9rOTV0dXRvcmlhbC5odG1sCitLZXJtaXQgOTUgdHV0b3JpYWwuCisuVFAKK2NvbXAucHJvdG9jb2xzLmtlcm1pdC5taXNjCitUaGUgS2VybWl0IG5ld3Nncm91cCAodW5tb2RlcmF0ZWQpLgorLlNIIEZJTEVTCisuVFAKK0NPUFlJTkcuVFhUCitDLUtlcm1pdCBsaWNlbnNlLgorLlRQCit+Ly5rZXJtcmMKK0luaXRpYWxpemF0aW9uIGZpbGUuCisuVFAKK34vLm15a2VybXJjCitDdXN0b21pemF0aW9uIGZpbGUuCisuVFAKK34vLmtkZAorS2VybWl0IGRpYWxpbmcgZGlyZWN0b3J5IChzZWUgbWFudWFsKS4KKy5UUAorfi8ua25kCitLZXJtaXQgbmV0d29yayBkaXJlY3RvcnkgKHNlZSBtYW51YWwpLgorLlRQCit+Ly5rc2QKK0tlcm1pdCBzZXJ2aWNlcyBkaXJlY3RvcnkgKHNlZSBtYW51YWwpLgorLlRQCitjYV9jZXJ0cy5wZW0KK0NlcnRpZmljYXRlIEF1dGhvcml0eSBjZXJ0aWZjYXRlcyB1c2VkIGZvciBTU0wgY29ubmVjdGlvbnMuCisuVFAKK2NrdWlucy50eHQKK0luc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgZm9yIFVuaXguICBBbHNvIGF0CitodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwuCisuVFAKK2NrY2J3ci50eHQKK0dlbmVyYWwgQy1LZXJtaXQgYnVncywgaGludHMsIHRpcHMuCisuVFAKK2NrdWJ3ci50eHQKK1VuaXgtc3BlY2lmaWMgQy1LZXJtaXQgYnVncywgaGludHMsIHRpcHMuCisuVFAKK2NrY3BsbS50eHQKK0MtS2VybWl0IHByb2dyYW0gbG9naWMgbWFudWFsLgorLlRQCitja2NjZmcudHh0CitDLUtlcm1pdCBjb21waWxlLXRpbWUgY29uZmlndXJhdGlvbiBvcHRpb25zLgorLlRQCitzc2gKKyhpbiB5b3VyIFBBVEgpIFNTSCBjb25uZWN0aW9uIGhlbHBlci4KKy5UUAorcnosIHN6LCBldGMuCisoaW4geW91ciBQQVRIKSBleHRlcm5hbCBwcm90b2NvbHMgZm9yIFhZWm1vZGVtLgorLlRQCisvdmFyL3Nwb29sL2xvY2tzIChvciB3aGF0ZXZlcikKK1VVQ1AgbG9ja2ZpbGUgZm9yIGRpYWxpbmcgb3V0IChzZWUgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucykuCisuU0ggQVVUSE9SUworLlRQCitTb2Z0d2FyZQorRnJhbmsgZGEgQ3J1eiBhbmQgSmVmZnJleSBFIEFsdG1hbiwKKy5icgorMTk4NS1wcmVzZW50LCB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSBodW5kcmVkcyBvZiBvdGhlcnMgYWxsIG92ZXIgdGhlCit3b3JsZC4KKy5UUAorRG9jdW1lbnRhdGlvbgorRnJhbmsgZGEgQ3J1eiBhbmQgQ2hyaXN0aW5lIE0gR2lhbm9uZQorLlRQCitBZGRyZXNzCisubmYKK1RoZSBLZXJtaXQgUHJvamVjdCAtIENvbHVtYmlhIFVuaXZlcml0eQorNjEyIFdlc3QgMTE1dGggU3RyZWV0CitOZXcgWW9yayBOWSAxMDAyNS03Nzk5CitVU0EKKy5maQorLlRQCitFLU1haWwKK2tlcm1pdEBjb2x1bWJpYS5lZHUKKy5UUAorV2ViCitodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvCisuZmkKKy5icgpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdXB0eS5jIGIvY2tlcm1pdC04LjAuMjExL2NrdXB0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNTkxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2t1cHR5LmMKQEAgLTAsMCArMSwxNzIyIEBACisvKiAgQyBLIFUgUCBUIFkgIC0tICBDLUtlcm1pdCBwc2V1ZG90ZXJtaW5hbCBjb250cm9sIGZ1bmN0aW9ucyBmb3IgVU5JWCAgKi8KKworLyoKKyAgQ29weXJpZ2h0IDE5OTUgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kuCisKKyAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKKyAgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyAgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorICB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBGdXJ0aGVybW9yZSBpZiB5b3UgbW9kaWZ5IHRoaXMgc29mdHdhcmUgeW91IG11c3QKKyAgbGFiZWwgeW91ciBzb2Z0d2FyZSBhcyBtb2RpZmllZCBzb2Z0d2FyZSBhbmQgbm90IGRpc3RyaWJ1dGUgaXQgaW4gc3VjaCBhCisgIGZhc2hpb24gdGhhdCBpdCBtaWdodCBiZSBjb25mdXNlZCB3aXRoIHRoZSBvcmlnaW5hbCBNLkkuVC4gc29mdHdhcmUuCisgIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisgIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworICBNb2RpZmllZCBmb3IgdXNlIGluIEMtS2VybWl0LCBhbmQgbmV3IG1hdGVyaWFsIGFkZGVkLCBieToKKworICBKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBzZWN1cmUtZW5kcG9pbnRzLmNvbT4KKyAgU2VjdXJlIEVuZHBvaW50cyBJbmMuLCBOZXcgWW9yayBDaXR5CisgIE5vdmVtYmVyIDE5OTkKKyovCisKKy8qCisgIEJ1aWx0IGFuZCB0ZXN0ZWQgc3VjY2Vzc3VsbHkgb246CisgICAuIDQuNEJTRCwgaW5jbHVkaW5nIEJTREkvT1MsIE5ldEJTRCwgRnJlZUJTRCwgT3BlbkJTRCwgTWFjIE9TIFgKKyAgIC4gQUlYIDQuMSBhbmQgbGF0ZXIKKyAgIC4gREcvVVggNS40UjQuMTEKKyAgIC4gRGlnaXRhbCBVTklYIDMuMiBhbmQgNC4wCisgICAuIEhQLVVYIDkuMDAgYW5kIGxhdGVyCisgICAuIElSSVggNi4wIGFuZCBsYXRlcgorICAgLiBMaW51eAorICAgLiBOZVhUU1RFUCAzLngKKyAgIC4gUU5YIDQuMjUgKGV4Y2VwdCBQVFkgcHJvY2VzcyB0ZXJtaW5hdGlvbiBub3QgZGV0ZWN0ZWQpCisgICAuIFNDTyBPU1I1LjAuNQorICAgLiBTQ08gVW5peHdhcmUgNworICAgLiBTSU5JWCA1LjQyCisgICAuIFNvbGFyaXMgMi54IGFuZCA3CisgICAuIFN1bk9TIDQuMS4zCisKKyAgSW5jbHVkZWQgYnV0IG5vdCB0ZXN0ZWQgeWV0IGluOgorICAgLiBNYWNpbnRvc2ggT1NYLCBPcGVuQlNELCBhbmQgYW55IG90aGVyIEJTRDQ0LWJhc2VkIHN5c3RlbSBub3QgbGlzdGVkIGFib3ZlCisKKyAgRmFpbHVyZXMgaW5jbHVkZToKKyAgIC4gU0NPIFVOSVggMy4ydjQuMiAoY29tcGlsZSBmYWlscyB3aXRoIHN5bnRheCBlcnJvciBpbiA8bWVtb3J5Lmg+KQorICAgLiBIUC1VWCA4LjAwIGFuZCBlYXJsaWVyIChubyB2aGFuZ3VwIG9yIHB0c25hbWUgcm91dGluZXMpCisqLworCisjaW5jbHVkZSAiY2tjc3ltLmgiCisjaW5jbHVkZSAiY2tjZGViLmgiCQkJLyogVG8gcGljayB1cCBORVRQVFkgZGVmaW5pdGlvbiAqLworCisjaWZuZGVmIE5FVFBUWQkJCQkvKiBTZWxlY3RvciBmb3IgUFRZIHN1cHBvcnQgKi8KKworY2hhciAqIHB0eXZlciA9ICJObyBQVFkgc3VwcG9ydCI7CisKKyNlbHNlICAvKiAocmVzdCBvZiB0aGlzIG1vZHVsZS4uLikgKi8KKworY2hhciAqIHB0eXZlciA9ICJQVFkgc3VwcG9ydCA4LjAuMDE0LCAyMCBBdWcgMjAwMiI7CisKKy8qIFRoZXNlIHdpbGwgbm8gZG91YnQgbmVlZCBhZGp1c3RtZW50Li4uICovCisKKyNpZm5kZWYgTkVYVAorI2RlZmluZSBIQVZFX1NFVFNJRAorI2VuZGlmIC8qIE5FWFQgKi8KKyNkZWZpbmUgSEFWRV9LSUxMUEcKKyNkZWZpbmUgSEFWRV9UVFlOQU1FCisjZGVmaW5lIEhBVkVfV0FJVFBJRAorCisjaWZuZGVmIFVTRV9URVJNSU8KKyNpZmRlZiBMSU5VWAorI2RlZmluZSBVU0VfVEVSTUlPCisjZWxzZQorI2lmZGVmIEFUVFNWCisjZGVmaW5lIFVTRV9URVJNSU8KKyNlbHNlCisjaWZkZWYgSFBVWAorI2RlZmluZSBVU0VfVEVSTUlPCisjZWxzZQorI2lmZGVmIEFJWAorI2RlZmluZSBVU0VfVEVSTUlPCisjZWxzZQorI2lmZGVmIEJTRDQ0T1JQT1NJWAorI2RlZmluZSBVU0VfVEVSTUlPCisjZWxzZQorI2lmZGVmIElSSVg2MAorI2RlZmluZSBVU0VfVEVSTUlPCisjZWxzZQorI2lmZGVmIFFOWAorI2RlZmluZSBVU0VfVEVSTUlPCisjZW5kaWYgLyogUU5YICovCisjZW5kaWYgLyogSVJJWDYwICovCisjZW5kaWYgLyogQlNENDRPUlBPU0lYICovCisjZW5kaWYgLyogQUlYICovCisjZW5kaWYgLyogSFBVWCAqLworI2VuZGlmIC8qIEFUVFNWICovCisjZW5kaWYgLyogTElOVVggKi8KKyNlbmRpZiAvKiBVU0VfVEVSTUlPICovCisKKyNpZmRlZiBRTlgKKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmIC8qIFFOWCAqLworCisjaWZkZWYgVVNFX1RFUk1JTworI2RlZmluZSBQT1NJWF9URVJNSU9TCQkJLyogU2VlbXMgdG8gYmUgYSBtaXNub21lciAqLworI2VuZGlmIC8qIFVTRV9URVJNSU8gKi8KKworI2lmZGVmIE5FWFQKKyNpZm5kZWYgR0VUUEdSUF9PTkVBUkcKKyNkZWZpbmUgR0VUUEdSUF9PTkVBUkcKKyNlbmRpZiAvKiBHRVRQR1JQX09ORUFSRyAqLworI2VuZGlmIC8qIE5FWFQgKi8KKworI2lmZGVmIFdBTlRfVVRNUAkJCS8qIFNlZSBja3VwdHkuaCAqLworLyoKKyAgV0FOVF9VVE1QIGlzIG5vdCBkZWZpbmVkIGJlY2F1c2UgKGEpIHRoZSB1dG1wL3d0bXAganVuayBpcyB0aGUgbW9zdAorICBub25wb3J0YWJsZSBwYXJ0IG9mIHRoaXMgbW9kdWxlLCBhbmQgKGIpIHdlJ3JlIG5vdCBsb2dnaW5nIGFueWJvZHkKKyAgaW4sIHdlJ3JlIGp1c3QgcnVubmluZyBhIHByb2Nlc3MsIGFuZCBkb24ndCBuZWVkIHRvIHdyaXRlIHV0bXAvd3RtcCByZWNvcmRzLgorKi8KKyNpZm5kZWYgSEFWRV9TRVRVVFhFTlQJCQkvKiBXaG8gaGFzIDx1dG1weC5oPiAqLworI2lmZGVmIFNPTEFSSVMKKyNkZWZpbmUgSEFWRV9TRVRVVFhFTlQKKyNlbHNlCisjaWZkZWYgSVJJWDYwCisjZGVmaW5lIEhBVkVfU0VUVVRYRU5UCisjZWxzZQorI2lmZGVmIENLX1NDT1Y1CisjZGVmaW5lIEhBVkVfU0VUVVRYRU5UCisjZWxzZQorI2lmZGVmIEhQVVgxMAorI2RlZmluZSBIQVZFX1NFVFVUWEVOVAorI2Vsc2UKKyNpZmRlZiBVTklYV0FSRQorI2RlZmluZSBIQVZFX1NFVFVUWEVOVAorI2Vsc2UKKyNpZmRlZiBJUklYNjAKKyNkZWZpbmUgSEFWRV9TRVRVVFhFTlQKKyNlbmRpZiAvKiBJUklYNjAgKi8KKyNlbmRpZiAvKiBVTklYV0FSRSAqLworI2VuZGlmIC8qIEhQVVgxMCAqLworI2VuZGlmIC8qIENLX1NDT1Y1ICovCisjZW5kaWYgLyogSVJJWDYwICovCisjZW5kaWYgLyogU09MQVJJUyAqLworI2VuZGlmIC8qIEhBVkVfU0VUVVRYRU5UICovCisKKyNpZm5kZWYgSEFWRV9VVEhPU1QJCQkvKiBEb2VzIHV0bXAgaW5jbHVkZSB1dF9ob3N0W10/ICovCisjaWZkZWYgSEFWRV9TRVRVVFhFTlQJCQkvKiB1dG1weCBhbHdheXMgZG9lcyAqLworI2RlZmluZSBIQVZFX1VUSE9TVAorI2Vsc2UKKyNpZmRlZiBMSU5VWAkJCQkvKiBMaW51eCBkb2VzICovCisjZGVmaW5lIEhBVkVfVVRIT1NUCisjZWxzZQorI2lmZGVmIFNVTk9TNAkJCQkvKiBTdW5PUyBkb2VzICovCisjZGVmaW5lIEhBVkVfVVRIT1NUCisjZWxzZQorI2lmZGVmIEFJWDQxCQkJCS8qIEFJWCA0LjEgYW5kIGxhdGVyIGRvICovCisjZGVmaW5lIEhBVkVfVVRIT1NUCisjZW5kaWYgLyogQUlYNDEgKi8KKyNlbmRpZiAvKiBTVU5PUzQgKi8KKyNlbmRpZiAvKiBMSU5VWCAqLworI2VuZGlmIC8qIEhBVkVfU0VUVVRYRU5UICovCisjZW5kaWYgLyogSEFWRV9VVEhPU1QgKi8KKworI2lmbmRlZiBIQVZFX1VUX0hPU1QKKyNpZm5kZWYgTk9fVVRfSE9TVAorI2RlZmluZSBOT19VVF9IT1NUCisjZW5kaWYgLyogTk9fVVRfSE9TVCAqLworI2VuZGlmIC8qIEhBVkVfVVRfSE9TVCAqLworCisjZW5kaWYgLyogV0FOVF9VVE1QICovCisKKyNpZmRlZiBMSU5VWAorI2RlZmluZSBDS19WSEFOR1VQCisjZGVmaW5lIEhBVkVfU1lTX1NFTEVDVF9ICisjZGVmaW5lIEhBVkVfR0VUVVRFTlQKKyNkZWZpbmUgSEFWRV9TRVRVVEVOVAorI2RlZmluZSBIQVZFX1VQRFdUTVAKKyNlbmRpZiAvKiBMSU5VWCAqLworCisjaWZkZWYgSFBVWDEwCisjZGVmaW5lIENLX1ZIQU5HVVAKKyNkZWZpbmUgVkhBTkdfRklSU1QKKyNkZWZpbmUgSEFWRV9QVFNOQU1FCisjaWZuZGVmIEhBVkVfUFRZVFJBUAorI2RlZmluZSBIQVZFX1BUWVRSQVAKKyNlbmRpZiAvKiBIQVZFX1BUWVRSQVAgKi8KKyNlbHNlCisjaWZkZWYgSFBVWDkKKyNkZWZpbmUgQ0tfVkhBTkdVUAorI2RlZmluZSBWSEFOR19GSVJTVAorI2RlZmluZSBIQVZFX1BUU05BTUUKKyNpZm5kZWYgSEFWRV9QVFlUUkFQCisjZGVmaW5lIEhBVkVfUFRZVFJBUAorI2VuZGlmIC8qIEhBVkVfUFRZVFJBUCAqLworI2VuZGlmIC8qIEhQVVg5ICovCisjZW5kaWYgLyogSFBVWDEwICovCisKKyNpZmRlZiBTVU5PUzQKKyNkZWZpbmUgQ0tfVkhBTkdVUAorI2RlZmluZSBOT19VVF9QSUQKKyNkZWZpbmUgVkhBTkdfRklSU1QKKyNlbmRpZiAvKiBTVU5PUzQgKi8KKworI2lmZGVmIElSSVg2MAorI2RlZmluZSBDS19WSEFOR1VQCisjZGVmaW5lIEhBVkVfX0dFVFBUWQorI2VuZGlmIC8qIElSSVg2MCAqLworCisjaWZkZWYgU0lOSVgKKyNkZWZpbmUgSEFWRV9TVFJFQU1TCisjZGVmaW5lIEhBVkVfR1JBTlRQVAorI2RlZmluZSBIQVZFX1BUU05BTUUKKyNkZWZpbmUgUFVTSF9QVEVNCisjZGVmaW5lIFBVU0hfTERURVJNCisjZGVmaW5lIFBVU0hfVFRDT01QQVQKKyNlbmRpZiAvKiBTSU5JWCAqLworCisjaWZkZWYgdWx0cml4CisjZGVmaW5lIE1VU1RfU0VUUEdSUAorI2VuZGlmIC8qIHVsdHJpeCAqLworCisjaWZkZWYgUU5YCisjZGVmaW5lIE1VU1RfU0VUUEdSUAorI2RlZmluZSBOT19ERVZUVFkKKyNkZWZpbmUgSU5JVF9TUFRZCisjZW5kaWYgLyogUU5YICovCisKKyNpZmRlZiBMSU5VWAorI2lmZGVmIEhBVkVfUFRNWAorI2RlZmluZSBIQVZFX0dSQU5UUFQKKyNkZWZpbmUgSEFWRV9QVFNOQU1FCisjZW5kaWYgLyogSEFWRV9QVE1YICovCisjZWxzZQorI2lmZGVmIEhBVkVfU1RSRUFNUworI2RlZmluZSBIQVZFX1BUTVgKKyNlbmRpZiAvKiBIQVZFX1NUUkVBTVMgKi8KKyNlbmRpZiAvKiBMSU5VWCAqLworCisjaW5jbHVkZSAiY2t1cHR5LmgiCisKKyNpZmRlZiBQVFlOT0JMT0NLCisjaWZuZGVmIE9fTkRFTEFZCisjaWZkZWYgT19OT05CTE9DSworI2RlZmluZSBPX05ERUxBWSBPX05PTkJMT0NLCisjZW5kaWYgLyogT19OT05CTE9DSyAqLworI2VuZGlmIC8qIE9fTkRFTEFZICovCisjZWxzZSAvKiBQVFlOT0JMT0NLICovCisjaWZkZWYgT19OREVMQVkKKyN1bmRlZiBPX05ERUxBWQorI2VuZGlmIC8qIE9fTkRFTEFZICovCisjZGVmaW5lIE9fTkRFTEFZIDAKKyNlbmRpZiAvKiBQVFlOT0JMT0NLICovCisKKyNpZm5kZWYgT05MQ1IKKyNkZWZpbmUgT05MQ1IgMAorI2VuZGlmIC8qIE9OTENSICovCisKKyNpZmRlZiBDS19XQUlUX0gKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2VuZGlmIC8qIENLX1dBSVRfSCAqLworCisjaWZkZWYgU1RSRUFNU1BUWQorI2lmbmRlZiBJTklUX1NQVFkKKyNkZWZpbmUgSU5JVF9TUFRZCisjZW5kaWYgLyogSU5JVF9TUFRZICovCisKKyNpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CisjaW5jbHVkZSA8c3Ryb3B0cy5oPgorI2luY2x1ZGUgPHRlcm1pby5oPgorCisvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IHRoZSBCU0QgdmVyc2lvbiAqLworCisjaWZkZWYgSEFWRV9TWVNfVFRZX0gKKyNpbmNsdWRlICIvdXNyL2luY2x1ZGUvc3lzL3R0eS5oIgorI2VuZGlmIC8qIEhBVkVfU1lTX1RUWV9IICovCisKKyNpZmRlZiBIQVNfUFRZVkFSCQkJLyogV2hlcmUgaXMgdGhpcyBzZXQ/ICovCisKKyNpbmNsdWRlIDxzeXMvcHR5dmFyLmg+CisKKyNlbHNlIC8qIEhBU19QVFlWQVIgKi8KKworI2lmbmRlZiBUSU9DUEtUX0ZMVVNIV1JJVEUKKyNkZWZpbmUgVElPQ1BLVF9GTFVTSFdSSVRFIDB4MDIKKyNkZWZpbmUgVElPQ1BLVF9OT1NUT1AgICAgIDB4MTAKKyNkZWZpbmUgVElPQ1BLVF9ET1NUT1AgICAgIDB4MjAKKyNkZWZpbmUgVElPQ1BLVF9JT0NUTCAgICAgIDB4NDAKKyNlbmRpZiAvKiBUSU9DUEtUX0ZMVVNIV1JJVEUgKi8KKworI2VuZGlmIC8qIEhBU19QVFlWQVIgKi8KKworI2lmZGVmIEhBVkVfVFRZX0gKKyNpbmNsdWRlIDx0dHkuaD4KKyNlbmRpZiAvKiBIQVZFX1RUWV9IICovCisvKgorICBCZWNhdXNlIG9mIHRoZSB3YXkgcHR5aWJ1ZiBpcyB1c2VkIHdpdGggc3RyZWFtcyBtZXNzYWdlcywgd2UgbmVlZAorICBwdHlpYnVmKzEgdG8gYmUgb24gYSBmdWxsLXdvcmQgYm91bmRhcnkuICBUaGUgZm9sbG93aW5nIHdlaXJkbmVzcworICBpcyBzaW1wbHkgdG8gbWFrZSB0aGF0IGhhcHBlbi4KKyovCitsb25nIHB0eWlidWZidWZbQlVGU0laL3NpemVvZihsb25nKSsxXTsKK2NoYXIgKnB0eWlidWYgPSAoKGNoYXIgKikmcHR5aWJ1ZmJ1ZlsxXSktMTsKK2NoYXIgKnB0eWlwID0gKChjaGFyICopJnB0eWlidWZidWZbMV0pLTE7CitjaGFyIHB0eWlidWYyW0JVRlNJWl07Cit1bnNpZ25lZCBjaGFyIGN0bGJ1ZltCVUZTSVpdOworc3RydWN0IHN0cmJ1ZiBzdHJidWZjLCBzdHJidWZkOworCitpbnQgcmVhZHN0cmVhbSgpOworCisjZWxzZSAgLyogISBTVFJFQU1TUFRZICovCisKKy8qIEkvTyBkYXRhIGJ1ZmZlcnMsIHBvaW50ZXJzLCBhbmQgY291bnRlcnMuICovCisKK2NoYXIgcHR5aWJ1ZltCVUZTSVpdLCAqcHR5aXAgPSBwdHlpYnVmOworY2hhciBwdHlpYnVmMltCVUZTSVpdOworCisjZW5kaWYgLyogISBTVFJFQU1TUFRZICovCisKKyNpZm5kZWYgVVNFX1RFUk1JTworc3RydWN0IHRlcm1idWYgeworICAgIHN0cnVjdCBzZ3R0eWIgc2c7CisgICAgc3RydWN0IHRjaGFycyB0YzsKKyAgICBzdHJ1Y3QgbHRjaGFycyBsdGM7CisgICAgaW50IHN0YXRlOworICAgIGludCBsZmxhZ3M7Cit9IHRlcm1idWYsIHRlcm1idWYyOworCisjZGVmaW5lIGNmc2V0b3NwZWVkKHRwLHZhbCkgKHRwKS0+c2cuc2dfb3NwZWVkID0gKHZhbCkKKyNkZWZpbmUgY2ZzZXRpc3BlZWQodHAsdmFsKSAodHApLT5zZy5zZ19pc3BlZWQgPSAodmFsKQorI2RlZmluZSBjZmdldG9zcGVlZCh0cCkgICAgICh0cCktPnNnLnNnX29zcGVlZAorI2RlZmluZSBjZmdldGlzcGVlZCh0cCkgICAgICh0cCktPnNnLnNnX2lzcGVlZAorCisjZWxzZSAgLyogVVNFX1RFUk1JTyAqLworCisjaWZkZWYgU1lTVl9URVJNSU8KKyNkZWZpbmUgdGVybWlvcyB0ZXJtaW8KKyNlbmRpZiAvKiBTWVNWX1RFUk1JTyAqLworCisjaWZuZGVmIFRDU0FOT1cKKworI2lmZGVmIFRDU0VUUworCisjZGVmaW5lIFRDU0FOT1cgVENTRVRTCisjZGVmaW5lIFRDU0FEUkFJTiBUQ1NFVFNXCisjZGVmaW5lIHRjZ2V0YXR0cihmLCB0KSBpb2N0bChmLCBUQ0dFVFMsIChjaGFyICopdCkKKworI2Vsc2UgLyogVENTRVRTICovCisKKyNpZmRlZiBUQ1NFVEEKKyNkZWZpbmUgVENTQU5PVyBUQ1NFVEEKKyNkZWZpbmUgVENTQURSQUlOIFRDU0VUQVcKKyNkZWZpbmUgdGNnZXRhdHRyKGYsdCkgaW9jdGwoZixUQ0dFVEEsKGNoYXIgKil0KQorI2Vsc2UgLyogVENTRVRBICovCisjZGVmaW5lIFRDU0FOT1cgVElPQ1NFVEEKKyNkZWZpbmUgVENTQURSQUlOIFRJT0NTRVRBVworI2RlZmluZSB0Y2dldGF0dHIoZix0KSBpb2N0bChmLFRJT0NHRVRBLChjaGFyICopdCkKKyNlbmRpZiAvKiBUQ1NFVEEgKi8KKworI2VuZGlmIC8qIFRDU0VUUyAqLworCisjZGVmaW5lIHRjc2V0YXR0cihmLGEsdCkgaW9jdGwoZixhLHQpCisjZGVmaW5lIGNmc2V0b3NwZWVkKHRwLHZhbCkgKHRwKS0+Y19jZmxhZyAmPSB+Q0JBVUQ7KHRwKS0+Y19jZmxhZ3w9KHZhbCkKKyNkZWZpbmUgY2ZnZXRvc3BlZWQodHApICgodHApLT5jX2NmbGFnICYgQ0JBVUQpCisKKyNpZmRlZiBDSUJBVUQKKyNkZWZpbmUgY2ZzZXRpc3BlZWQodHAsdmFsKSBcCisgKHRwKS0+Y19jZmxhZyAmPSB+Q0lCQVVEOyAodHApLT5jX2NmbGFnIHw9ICgodmFsKTw8SUJTSElGVCkKKyNkZWZpbmUgY2ZnZXRpc3BlZWQodHApICgoKHRwKS0+Y19jZmxhZyAmIENJQkFVRCk+PklCU0hJRlQpCisjZWxzZSAvKiBDSUJBVUQgKi8KKyNkZWZpbmUgY2ZzZXRpc3BlZWQodHAsdmFsKSAodHApLT5jX2NmbGFnICY9IH5DQkFVRDsgKHRwKS0+Y19jZmxhZ3w9KHZhbCkKKyNkZWZpbmUgY2ZnZXRpc3BlZWQodHApICgodHApLT5jX2NmbGFnICYgQ0JBVUQpCisjZW5kaWYgLyogQ0lCQVVEICovCisKKyNlbmRpZiAvKiBUQ1NBTk9XICovCisKK3N0cnVjdCB0ZXJtaW9zIHRlcm1idWYsIHRlcm1idWYyOyAgICAgICAvKiBwdHkgY29udHJvbCBzdHJ1Y3R1cmUgKi8KKworI2lmZGVmIElOSVRfU1BUWQorc3RhdGljIGludCBzcHR5ID0gLTE7CisjZW5kaWYgLyogSU5JVF9TUFRZICovCisKKyNlbmRpZiAvKiBVU0VfVEVSTUlPICovCisKK2V4dGVybiBpbnQgdHR5ZmQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFuZGFyZCBLZXJtaXQgdXNhZ2UgKi8KK3N0YXRpYyBpbnQgbXNnID0gMDsKKworLyogdGVybWJ1ZiByb3V0aW5lcyAoYmVnaW4pICovCisvKgorICBpbml0X3Rlcm1idWYoKQorICBjb3B5X3Rlcm1idWYoY3ApCisgIHNldF90ZXJtYnVmKCkKKworICBUaGVzZSB0aHJlZSByb3V0aW5lcyBhcmUgdXNlZCB0byBnZXQgYW5kIHNldCB0aGUgInRlcm1idWYiIHN0cnVjdHVyZQorICB0byBhbmQgZnJvbSB0aGUga2VybmVsLiAgaW5pdF90ZXJtYnVmKCkgZ2V0cyB0aGUgY3VycmVudCBzZXR0aW5ncy4KKyAgY29weV90ZXJtYnVmKCkgaGFuZHMgaW4gYSBuZXcgInRlcm1idWYiIHRvIHdyaXRlIHRvIHRoZSBrZXJuZWwsIGFuZAorICBzZXRfdGVybWJ1ZigpIHdyaXRlcyB0aGUgc3RydWN0dXJlIGludG8gdGhlIGtlcm5lbC4KKyovCitWT0lECitpbml0X3Rlcm1idWYoKSB7CisgICAgaW50IHJjID0gMDsKKyAgICBtZW1zZXQoJnRlcm1idWYsMCxzaXplb2YodGVybWJ1ZikpOworICAgIG1lbXNldCgmdGVybWJ1ZjIsMCxzaXplb2YodGVybWJ1ZjIpKTsKKyNpZm5kZWYJVVNFX1RFUk1JTworICAgIHJjID0gaW9jdGwodHR5ZmQsIFRJT0NHRVRQLCAoY2hhciAqKSZ0ZXJtYnVmLnNnKTsKKyAgICByYyB8PSBpb2N0bCh0dHlmZCwgVElPQ0dFVEMsIChjaGFyICopJnRlcm1idWYudGMpOworICAgIHJjIHw9IGlvY3RsKHR0eWZkLCBUSU9DR0xUQywgKGNoYXIgKikmdGVybWJ1Zi5sdGMpOworI2lmZGVmIFRJT0NHU1RBVEUKKyAgICByYyB8PSBpb2N0bCh0dHlmZCwgVElPQ0dTVEFURSwgKGNoYXIgKikmdGVybWJ1Zi5zdGF0ZSk7CisjZW5kaWYgLyogVElPQ0dTVEFURSAqLworI2Vsc2UgLyogVVNFX1RFUk1JTyAqLworICAgIGVycm5vID0gMDsKKyNpZmRlZiBJTklUX1NQVFkKKyAgICByYyA9IHRjZ2V0YXR0cihzcHR5LCAmdGVybWJ1Zik7CisgICAgZGVidWcoRjExMSwiaW5pdF90ZXJtYnVmKCkgdGNnZXRhdHRyKHNwdHkpIixja2l0b2EocmMpLGVycm5vKTsKKyNlbHNlCisgICAgcmMgPSB0Y2dldGF0dHIodHR5ZmQsICZ0ZXJtYnVmKTsKKyAgICBkZWJ1ZyhGMTExLCJpbml0X3Rlcm1idWYoKSB0Y2dldGF0dHIodHR5ZmQpIixja2l0b2EocmMpLGVycm5vKTsKKyNlbmRpZiAvKiBJTklUX1NQVFkgKi8KKyNlbmRpZiAvKiBVU0VfVEVSTUlPICovCisgICAgaWYgKCFyYykKKyAgICAgIHRlcm1idWYyID0gdGVybWJ1ZjsKK30KKworI2lmZGVmIFRJT0NQS1RfSU9DVEwKK1ZPSUQKK2NvcHlfdGVybWJ1ZihjcCwgbGVuKSBjaGFyICpjcDsgaW50IGxlbjsgeworICAgIGlmIChsZW4gPiBzaXplb2YodGVybWJ1ZikpCisgICAgICBsZW4gPSBzaXplb2YodGVybWJ1Zik7CisgICAgbWVtY3B5KChjaGFyICopJnRlcm1idWYsIGNwLCBsZW4pOworICAgIHRlcm1idWYyID0gdGVybWJ1ZjsKK30KKyNlbmRpZiAvKiBUSU9DUEtUX0lPQ1RMICovCisKK1ZPSUQKK3NldF90ZXJtYnVmKCkgewkJCQkvKiBPbmx5IG1ha2UgdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzLiAqLworI2lmbmRlZglVU0VfVEVSTUlPCisgICAgaWYgKG1lbWNtcCgoY2hhciAqKSZ0ZXJtYnVmLnNnLCAoY2hhciAqKSZ0ZXJtYnVmMi5zZywgc2l6ZW9mKHRlcm1idWYuc2cpKSkKKyAgICAgIGlvY3RsKHR0eWZkLCBUSU9DU0VUTiwgKGNoYXIgKikmdGVybWJ1Zi5zZyk7CisgICAgaWYgKG1lbWNtcCgoY2hhciAqKSZ0ZXJtYnVmLnRjLCAoY2hhciAqKSZ0ZXJtYnVmMi50Yywgc2l6ZW9mKHRlcm1idWYudGMpKSkKKyAgICAgIGlvY3RsKHR0eWZkLCBUSU9DU0VUQywgKGNoYXIgKikmdGVybWJ1Zi50Yyk7CisgICAgaWYgKG1lbWNtcCgoY2hhciAqKSZ0ZXJtYnVmLmx0YywgKGNoYXIgKikmdGVybWJ1ZjIubHRjLAorCSAgICAgICBzaXplb2YodGVybWJ1Zi5sdGMpKSkKKyAgICAgIGlvY3RsKHR0eWZkLCBUSU9DU0xUQywgKGNoYXIgKikmdGVybWJ1Zi5sdGMpOworICAgIGlmICh0ZXJtYnVmLmxmbGFncyAhPSB0ZXJtYnVmMi5sZmxhZ3MpCisgICAgICBpb2N0bCh0dHlmZCwgVElPQ0xTRVQsIChjaGFyICopJnRlcm1idWYubGZsYWdzKTsKKyNlbHNlICAvKiBVU0VfVEVSTUlPICovCisgICAgaWYgKG1lbWNtcCgoY2hhciAqKSZ0ZXJtYnVmLCAoY2hhciAqKSZ0ZXJtYnVmMiwgc2l6ZW9mKHRlcm1idWYpKSkgeworCWludCB4OworCWVycm5vID0gMDsKKyNpZmRlZiBJTklUX1NQVFkKKwl4ID0gdGNzZXRhdHRyKHNwdHksIFRDU0FOT1csICZ0ZXJtYnVmKTsKKwlkZWJ1ZyhGMTExLCJzZXRfdGVybWJ1ZiB0Y3NldGF0dHIoc3B0eSkiLGNraXRvYSh4KSxlcnJubyk7CisjZWxzZQorCXggPSB0Y3NldGF0dHIodHR5ZmQsIFRDU0FOT1csICZ0ZXJtYnVmKTsKKwlkZWJ1ZyhGMTExLCJzZXRfdGVybWJ1ZiB0Y3NldGF0dHIodHR5ZmQpIixja2l0b2EoeCksZXJybm8pOworI2VuZGlmIC8qIElOSVRfU1BUWSAqLworICAgIH0KKyNlbmRpZiAvKiBVU0VfVEVSTUlPICovCit9CisvKiB0ZXJtYnVmIHJvdXRpbmVzIChlbmQpICovCisKK1ZPSUQKK3B0eWludF92aGFuZ3VwKCkgeworI2lmZGVmIENLX1ZIQU5HVVAKKyNpZmRlZiBDS19QT1NJWF9TSUcKKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworICAgIC8qIEluaXRpYWxpemUgInNhIiBzdHJ1Y3R1cmUuICovCisgICAgc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworICAgIHNhLnNhX2ZsYWdzID0gMDsKKyAgICBzYS5zYV9oYW5kbGVyID0gU0lHX0lHTjsKKyAgICBzaWdhY3Rpb24oU0lHSFVQLCAmc2EsIChzdHJ1Y3Qgc2lnYWN0aW9uICopMCk7CisgICAgdmhhbmd1cCgpOworICAgIHNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOworICAgIHNpZ2FjdGlvbihTSUdIVVAsICZzYSwgKHN0cnVjdCBzaWdhY3Rpb24gKikwKTsKKyNlbHNlIC8qIENLX1BPU0lYX1NJRyAqLworICAgIHNpZ25hbChTSUdIVVAsU0lHX0lHTik7CisgICAgdmhhbmd1cCgpOworICAgIHNpZ25hbChTSUdIVVAsU0lHX0RGTCk7CisjZW5kaWYgLyogQ0tfUE9TSVhfU0lHICovCisjZW5kaWYgLyogQ0tfVkhBTkdVUCAqLworfQorCisvKgorICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHR3aWNlLiAgSXQncyBub3QgcGFydGljdWxhcmx5IGltcG9ydGFudCB0aGF0IHRoZQorICBzZXRzaWQoKSBvciBUSU9DU1RUWSBpb2N0bHMgc3VjY2VlZCAodGhleSBtYXkgbm90IHRoZSBzZWNvbmQgdGltZSksIGJ1dAorICByYXRoZXIgdGhhdCB3ZSBoYXZlIGEgY29udHJvbGxpbmcgdGVybWluYWwgYXQgdGhlIGVuZC4gIEl0IGlzIGFzc3VtZWQgdGhhdAorICB2aGFuZ3VwIGRvZXNuJ3QgZXhpc3QgYW5kIGNvbmZ1c2UgdGhlIHByb2Nlc3MncyBub3Rpb24gb2YgY29udHJvbGxpbmcKKyAgdGVybWluYWwgb24gYW55IHN5c3RlbSB3aXRob3V0IFRJT0NOT1RUWS4gIFRoYXQgaXMsIGVpdGhlciB2aGFuZ3VwKCkgbGVhdmVzCisgIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCBpbiB0YWN0LCBicmVha3MgdGhlIGFzc29jaWF0aW9uIGNvbXBsZXRlbHksIG9yIHRoZQorICBzeXN0ZW0gcHJvdmlkZXMgVElPQ05PVFRZIHRvIGdldCB0aGluZ3MgYmFjayBpbnRvIGEgcmVhc29uYWJsZSBzdGF0ZS4gIEluCisgIHByYWN0aWNlLCB2aGFuZ3VwKCkgZWl0aGVyIGJyZWFrcyB0aGUgYXNzb2NpYXRpb24gY29tcGxldGVseSBvciBkb2Vzbid0CisgIGVmZmVjdCBjb250cm9sbGluZyB0ZXJtaW5hbHMsIHNvIHRoaXMgY29uZGl0aW9uIGlzIG1ldC4KKyovCitsb25nCitwdHlpbnRfdm9pZF9hc3NvY2lhdGlvbigpIHsKKyAgICBpbnQgY29uX2ZkOworI2lmZGVmIEhBVkVfU0VUU0lECisgICAgZGVidWcoRjExMCwKKwkgICJwdHlpbnRfdm9pZF9hc3NvY2lhdGlvbigpIiwKKwkgICJzZXRzaWQoKSIsCisJICAwCisJICApOworICAgIHNldHNpZCgpOworI2VuZGlmIC8qIEhBVkVfU0VUU0lEICovCisKKyNpZm5kZWYgTk9fREVWVFRZCisgICAgLyogVm9pZCB0dHkgYXNzb2NpYXRpb24gZmlyc3QgKi8KKyNpZmRlZiBUSU9DTk9UVFkKKyAgICBjb25fZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRXUik7CisgICAgZGVidWcoRjExMSwKKwkgICJwdHlpbnRfdm9pZF9hc3NvY2lhdGlvbigpIG9wZW4oL2Rldi90dHksT19SRFdSKSIsCisJICAiL2Rldi90dHkiLAorCSAgY29uX2ZkKTsKKyAgICBpZiAoY29uX2ZkID49IDApIHsKKyAgICAgICAgaW9jdGwoY29uX2ZkLCBUSU9DTk9UVFksIDApOworICAgICAgICBjbG9zZShjb25fZmQpOworICAgIH0KKyNpZmRlZiBERUJVRworICAgIGVsc2UgZGVidWcoRjEwMSwgInB0eWludF92b2lkX2Fzc29jaWF0aW9uKCkgb3BlbigpIGVycm5vIiwiIixlcnJubyk7CisjZW5kaWYgLyogREVCVUcgKi8KKyNlbmRpZiAvKiBUSU9DTk9UVFkgKi8KKyNlbmRpZiAvKiBOT19ERVZUVFkgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qIFBJRCBtYXkgYmUgemVybyBmb3IgdW5rbm93bi4qLworCitsb25nCitwdHlfY2xlYW51cChzbGF2ZSwgcGlkLCB1cGRhdGVfdXRtcCkgY2hhciAqc2xhdmU7IGludCBwaWQ7IGludCB1cGRhdGVfdXRtcDsgeworI2lmZGVmIFZIQU5HX0xBU1QKKyAgICBpbnQgcmV0dmFsLCBmZDsKKyNlbmRpZiAvKiBWSEFOR19MQVNUICovCisKKyAgICBkZWJ1ZyhGMTExLCJwdHlfY2xlYW51cCgpIixzbGF2ZSxwaWQpOworI2lmZGVmIFdBTlRfVVRNUAorICAgIGlmICh1cGRhdGVfdXRtcCkKKyAgICAgIHB0eV91cGRhdGVfdXRtcChQVFlfREVBRF9QUk9DRVNTLAorCQkgICAgICAwLAorCQkgICAgICAiIiwKKwkJICAgICAgc2xhdmUsCisJCSAgICAgIChjaGFyICopMCwKKwkJICAgICAgUFRZX1VUTVBfVVNFUk5BTUVfVkFMSUQKKwkJICAgICAgKTsKKyNlbmRpZiAvKiBXQU5UX1VUTVAgKi8KKworI2lmZGVmIFNFVFVJRAorICAgIGNobW9kKHNsYXZlLCAwNjY2KTsKKyAgICBjaG93bihzbGF2ZSwgMCwgMCk7CisjZW5kaWYgLyogU0VUVUlEICovCisKKyNpZmRlZiBIQVZFX1JFVk9LRQorICAgIHJldm9rZShzbGF2ZSk7CisgICAgLyoKKyAgICAgICBSZXZva2UgaXNuJ3QgZ3VhcmFudGVlZCB0byBzZW5kIGEgU0lHSFVQIHRvIHRoZSBwcm9jZXNzZXMgaXQKKyAgICAgICBkaXNzb2NpYXRlcyBmcm9tIHRoZSB0ZXJtaW5hbC4gIFRoZSBiZXN0IHNvbHV0aW9uIHdpdGhvdXQgYSBQb3NpeAorICAgICAgIG1lY2hhbmlzbSBmb3IgZm9yY2luZyBhIGhhbmd1cCBpcyB0byBraWxscGcoKSB0aGUgcHJvY2VzcyBncm91cCBvZiB0aGUKKyAgICAgICBwdHkuICBUaGlzIHdpbGwgYXQgbGVhc3Qga2lsbCB0aGUgc2hlbGwgYW5kIGhvcGVmdWxseSwgdGhlIGNoaWxkCisgICAgICAgcHJvY2Vzc2VzLiAgVGhpcyBpcyBub3QgYWx3YXlzIHRoZSBjYXNlLCBob3dldmVyLiAgSWYgdGhlIHNoZWxsIHB1dHMKKyAgICAgICBlYWNoIGpvYiBpbiBhIHByb2Nlc3MgZ3JvdXAgYW5kIGRvZXNuJ3QgcGFzcyBhbG9uZyBTSUdIVVAsIGFsbAorICAgICAgIHByb2Nlc3NlcyBtYXkgbm90IGRpZS4KKyAgICAqLworICAgIGlmIChwaWQgPiAwKSB7CisjaWZkZWYgSEFWRV9LSUxMUEcKKwlraWxscGcocGlkLCBTSUdIVVApOworI2Vsc2UKKwlraWxsKC0ocGlkKSwgU0lHSFVQKTsKKyNlbmRpZiAvKkhBVkVfS0lMTFBHKi8KKyAgICB9CisjZWxzZSAvKiBIQVZFX1JFVk9LRSovCisjaWZkZWYgVkhBTkdfTEFTVAorICAgIHsKKyAgICAgICAgaW50IHN0YXR1czsKKyNpZmRlZiBDS19QT1NJWF9TSUcKKyAgICAgICAgc2lnc2V0X3Qgb2xkLCBuZXc7CisgICAgICAgIHNpZ2VtcHR5c2V0KCZuZXcpOworICAgICAgICBzaWdhZGRzZXQoJm5ldywgU0lHQ0hMRCk7CisgICAgICAgIHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJm5ldywgJm9sZCk7CisjZWxzZSAvKkNLX1BPU0lYX1NJRyovCisgICAgICAgIGludCBtYXNrID0gc2lnYmxvY2soc2lnbWFzayhTSUdDSExEKSk7CisjZW5kaWYgLypDS19QT1NJWF9TSUcqLworICAgICAgICBzd2l0Y2ggKHJldHZhbCA9IGZvcmsoKSkgeworCSAgY2FzZSAtMToKKyNpZmRlZiBDS19QT1NJWF9TSUcKKyAgICAgICAgICAgIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkLCAwKTsKKyNlbHNlIC8qQ0tfUE9TSVhfU0lHKi8KKyAgICAgICAgICAgIHNpZ3NldG1hc2sobWFzayk7CisjZW5kaWYgLypDS19QT1NJWF9TSUcqLworICAgICAgICAgICAgcmV0dXJuIGVycm5vOworCSAgY2FzZSAwOgorICAgICAgICAgICAgcHR5aW50X3ZvaWRfYXNzb2NpYXRpb24oKTsKKyAgICAgICAgICAgIGlmIChyZXR2YWwgPSAocHR5X29wZW5fY3R0eShzbGF2ZSwgJmZkKSkpCisJICAgICAgZXhpdChyZXR2YWwpOworICAgICAgICAgICAgcHR5aW50X3ZoYW5ndXAoKTsKKyAgICAgICAgICAgIGV4aXQoMCk7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKyNpZmRlZiBIQVZFX1dBSVRQSUQKKyAgICAgICAgICAgIHdhaXRwaWQocmV0dmFsLCAmc3RhdHVzLCAwKTsKKyNlbHNlIC8qSEFWRV9XQUlUUElEKi8KKyAgICAgICAgICAgIHdhaXQoJnN0YXR1cyk7CisjZW5kaWYgLyogSEFWRV9XQUlUUElEICovCisjaWZkZWYgQ0tfUE9TSVhfU0lHCisgICAgICAgICAgICBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZCwgMCk7CisjZWxzZSAvKkNLX1BPU0lYX1NJRyovCisgICAgICAgICAgICBzaWdzZXRtYXNrKG1hc2spOworI2VuZGlmIC8qQ0tfUE9TSVhfU0lHKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qVkhBTkdfTEFTVCovCisjZW5kaWYgLyogSEFWRV9SRVZPS0UqLworI2lmbmRlZiBIQVZFX1NUUkVBTVMKKyAgICBzbGF2ZVtzdHJsZW4oIi9kZXYvIildID0gJ3AnOworI2lmZGVmIFNFVFVJRAorICAgIGNobW9kKHNsYXZlLCAwNjY2KTsKKyAgICBjaG93bihzbGF2ZSwgMCwgMCk7CisjZW5kaWYgLyogU0VUVUlEICovCisjZW5kaWYgLyogSEFWRV9TVFJFQU1TICovCisgICAgcmV0dXJuKDApOworfQorCitsb25nCitwdHlfZ2V0cHR5KGZkLCBzbGF2ZSwgc2xhdmVsZW5ndGgpIGludCBzbGF2ZWxlbmd0aDsgaW50ICpmZDsgY2hhciAqc2xhdmU7IHsKKyAgICBjaGFyICpjcDsKKyAgICBjaGFyICpwOworICAgIGludCBpLCBwdHludW07CisgICAgc3RydWN0IHN0YXQgc3RiOworI2lmbmRlZiBIQVZFX09QRU5QVFkKKyNpZm5kZWYgSEFWRV9fR0VUUFRZCisgICAgY2hhciBzbGF2ZWJ1ZlsxMDI0XTsKKyNlbmRpZiAvKiBIQVZFX19HRVRQVFkgKi8KKyNlbmRpZiAvKiBIQVZFX09QRU5QVFkgKi8KKyNpZmRlZiBIQVZFX19HRVRQVFkKKyAgICBjaGFyICpzbGF2ZXJldDsJCQkvKiBUZW1wIHRvIGhvbGQgcG9pbnRlciB0byBzbGF2ZSAqLworI2VuZGlmIC8qSEFWRV9fR0VUUFRZKi8KKworI2lmZGVmIEhBVkVfT1BFTlBUWQorICAgIGludCBzbGF2ZWZkOworCisgICAgZGVidWcoRjEwMCwiSEFWRV9PUEVOUFRZIiwiIiwwKTsKKyAgICBpZiAob3BlbnB0eShmZCwKKwkJJnNsYXZlZmQsCisJCXNsYXZlLAorCQkoc3RydWN0IHRlcm1pb3MgKikwLAorCQkoc3RydWN0IHdpbnNpemUgKikwCisJCSkKKwkpCisgICAgICByZXR1cm4oMSk7CisgICAgY2xvc2Uoc2xhdmVmZCk7CisgICAgcmV0dXJuKDApOworCisjZWxzZSAvKiBIQVZFX09QRU5QVFkgKi8KKworI2lmZGVmIEhBVkVfX0dFVFBUWQorLyoKKyAgVGhpcyBjb2RlIGlzIGluY2x1ZGVkIGZvciBJcml4OyBhcyBvZiB2ZXJzaW9uIDUuMywgSXJpeCBoYXMgL2Rldi9wdG14LCBidXQKKyAgaXQgZmFpbHMgdG8gd29yayBwcm9wZXJseTsgZXZlbiBhZnRlciBjYWxsaW5nIHVubG9ja3B0LCByb290IGdldHMgcGVybWlzc2lvbgorICBkZW5pZWQgb3BlbmluZyB0aGUgcHR5LiAgVGhlIGNvZGUgdG8gc3VwcG9ydCBfZ2V0cHR5IHNob3VsZCBiZSByZW1vdmVkIGlmCisgIElyaXggZ2V0cyB3b3JraW5nIHN0cmVhbXMgcHR5cyBpbiBmYXZvciBvZiBtYWludGFpbmluZyB0aGUgbGVhc3QgbmVlZGVkIGNvZGUKKyAgcGF0aHMuCisqLworICAgIGRlYnVnKEYxMDAsIkhBVkVfX0dFVFBUWSIsIiIsMCk7CisgICAgaWYgKChzbGF2ZXJldCA9IF9nZXRwdHkoZmQsIE9fUkRXUiB8IE9fTkRFTEFZLCAwNjAwLCAwKSkgPT0gMCkgeworCSpmZCA9IC0xOworCXJldHVybihQVFlfR0VUUFRZX05PUFRZKTsKKyAgICB9CisgICAgaWYgKHN0cmxlbihzbGF2ZXJldCkgPiBzbGF2ZWxlbmd0aCAtIDEpIHsKKwljbG9zZSgqZmQpOworCSpmZCA9IC0xOworCXJldHVybihQVFlfR0VUUFRZX1NMQVZFX1RPT0xPTkcpOworICAgIH0gZWxzZSB7CisJY2tzdHJuY3B5KHNsYXZlLCBzbGF2ZXJldCwgc2xhdmVsZW5ndGgpOworICAgIH0KKyAgICByZXR1cm4oMCk7CisKKyNlbHNlIC8qIEhBVkVfX0dFVFBUWSAqLworCisgICAgKmZkID0gb3BlbigiL2Rldi9wdHltL2Nsb25lIiwgT19SRFdSfE9fTkRFTEFZKTsgLyogSFBVWCAqLworICAgIGlmICgqZmQgPj0gMCkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJwdHlfZ2V0cHR5KCkiLCJvcGVuKC9kZXYvcHR5bS9jbG9uZSkgc3VjY2VzcyIsMCk7CisgICAgICAgIGdvdG8gaGF2ZV9mZDsKKyAgICB9CisKKyNpZmRlZiBIQVZFX1BUTVgKKyAgICBkZWJ1ZyhGMTAwLCJIQVZFX1BUTVgiLCIiLDApOworICAgICpmZCA9IG9wZW4oIi9kZXYvcHRteCIsT19SRFdSfE9fTkRFTEFZKTsKKyAgICBpZiAoKmZkID49IDApIHsKKyAgICAgICAgZGVidWcoRjExMCwicHR5X2dldHB0eSgpIiwib3BlbigvZGV2L3B0bXgpIHN1Y2Nlc3MiLDApOworICAgICAgICBnb3RvIGhhdmVfZmQ7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfUFRNWCAqLworCisgICAgKmZkID0gb3BlbigiL2Rldi9wdGMiLCBPX1JEV1J8T19OREVMQVkpOyAvKiBBSVggKi8KKyAgICBpZiAoKmZkID49IDApIHsKKyAgICAgICAgZGVidWcoRjExMCwicHR5X2dldHB0eSgpIiwib3BlbigvZGV2L3B0Yykgc3VjY2VzcyIsMCk7CisgICAgICAgIGdvdG8gaGF2ZV9mZDsKKyAgICB9CisgICAgKmZkID0gb3BlbigiL2Rldi9wdHkiLCBPX1JEV1J8T19OREVMQVkpOyAvKiBzeXN2aW1wICovCisgICAgaWYgKCpmZCA+PSAwKQorICAgICAgICBkZWJ1ZyhGMTEwLCJwdHlfZ2V0cHR5KCkiLCJvcGVuKC9kZXYvcHR5KSBzdWNjZXNzIiwwKTsKKworICBoYXZlX2ZkOgorICAgIGlmICgqZmQgPj0gMCkgeworI2lmZGVmIEhBVkVfR1JBTlRQVAorI2lmZGVmIEhBVkVfUFRNWAorICAgICAgICBkZWJ1ZyhGMTAwLCJIQVZFX0dSQU5UUFQiLCIiLDApOworCWlmIChncmFudHB0KCpmZCkgfHwgdW5sb2NrcHQoKmZkKSkKKwkgIHJldHVybihQVFlfR0VUUFRZX1NUUkVBTVMpOworI2VuZGlmIC8qIEhBVkVfUFRNWCAqLworI2VuZGlmIC8qIEhBVkVfR1JBTlRQVCAqLworCisjaWZkZWYgSEFWRV9QVFNOQU1FCisgICAgICAgIGRlYnVnKEYxMDAsIkhBVkVfUFRTTkFNRSIsIiIsMCk7CisJcCA9IChjaGFyICopcHRzbmFtZSgqZmQpOworICAgICAgICBkZWJ1ZyhGMTEwLCJwdHlfZ2V0cHR5KCkgcHRzbmFtZSgpIixwLDApOworI2Vsc2UKKyNpZmRlZiBIQVZFX1RUWU5BTUUKKyAgICAgICAgZGVidWcoRjEwMCwiSEFWRV9UVFlOQU1FIiwiIiwwKTsKKwlwID0gdHR5bmFtZSgqZmQpOworICAgICAgICBkZWJ1ZyhGMTEwLCJwdHlfZ2V0cHR5KCkgdHR5bmFtZSgpIixwLDApOworI2Vsc2UKKwkvKiBYWFggSWYgd2UgZG9uJ3QgaGF2ZSBlaXRoZXIgd2hhdCBkbyB3ZSBkbz8gKi8KKyAgCXJldHVybihQVFlfR0VUUFRZX05PUFRZKTsJLyogcHVudCAqLworI2VuZGlmIC8qIEhBVkVfVFRZTkFNRSAqLworI2VuZGlmIC8qIEhBVkVfUFRTTkFNRSAqLworCWlmIChwKSB7CisJICAgIGlmIChzdHJsZW4ocCkgPiBzbGF2ZWxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBjbG9zZSAoKmZkKTsKKyAgICAgICAgICAgICAgICAqZmQgPSAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4oUFRZX0dFVFBUWV9TTEFWRV9UT09MT05HKTsKKwkgICAgfQorCSAgICBja3N0cm5jcHkoc2xhdmUsIHAsIHNsYXZlbGVuZ3RoKTsKKwkgICAgcmV0dXJuKDApOworCX0KKwlpZiAoZnN0YXQoKmZkLCAmc3RiKSA8IDApIHsKKwkgICAgY2xvc2UoKmZkKTsKKwkgICAgcmV0dXJuKFBUWV9HRVRQVFlfRlNUQVQpOworCX0KKwlwdHludW0gPSAoaW50KShzdGIuc3RfcmRldiYweEZGKTsKKwlzcHJpbnRmKHNsYXZlYnVmLCAiL2Rldi90dHlwJXgiLCBwdHludW0pOyAvKiBzYWZlICovCisJaWYgKHN0cmxlbihzbGF2ZWJ1ZikgPiBzbGF2ZWxlbmd0aCAtIDEpIHsKKwkgICAgY2xvc2UoKmZkKTsKKwkgICAgKmZkID0gLTE7CisJICAgIHJldHVybihQVFlfR0VUUFRZX1NMQVZFX1RPT0xPTkcpOworCX0KKyAgICAgICAgZGVidWcoRjExMCwicHR5X2dldHB0eSgpIHNsYXZlYnVmIixzbGF2ZWJ1ZiwwKTsKKwlja3N0cm5jcHkoc2xhdmUsIHNsYXZlYnVmLCBzbGF2ZWxlbmd0aCk7CisJcmV0dXJuKDApOworICAgIH0gZWxzZSB7CisgICAgCWZvciAoY3AgPSAicHFyc3R1dnd4eXpQUVJTVCI7KmNwOyBjcCsrKSB7CisJICAgIHNwcmludGYoc2xhdmVidWYsIi9kZXYvcHR5WFgiKTsgLyogc2FmZSAqLworCSAgICBzbGF2ZWJ1ZltzaXplb2YoIi9kZXYvcHR5IikgLSAxXSA9ICpjcDsKKwkgICAgc2xhdmVidWZbc2l6ZW9mKCIvZGV2L3B0eXAiKSAtIDFdID0gJzAnOworCSAgICBpZiAoc3RhdChzbGF2ZWJ1ZiwgJnN0YikgPCAwKQorCSAgICAgIGJyZWFrOworCSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlzbGF2ZWJ1ZltzaXplb2YoIi9kZXYvcHR5cCIpIC0gMV0gPSAiMDEyMzQ1Njc4OWFiY2RlZiJbaV07CisJCSpmZCA9IG9wZW4oc2xhdmVidWYsIE9fUkRXUnxPX05ERUxBWSk7CisJCWlmICgqZmQgPCAwKQorCQkgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInB0eV9nZXRwdHkoKSBmb3VuZCBwdHkgbWFzdGVyIixzbGF2ZWJ1ZiwwKTsKKwkJc2xhdmVidWZbc2l6ZW9mKCIvZGV2LyIpIC0gMV0gPSAndCc7IC8qIGdvdCBwdHkgKi8KKwkJaWYgKHN0cmxlbihzbGF2ZWJ1ZikgPiBzbGF2ZWxlbmd0aCAtMSkgeworCQkgICAgY2xvc2UoKmZkKTsKKwkJICAgICpmZCA9IC0xOworCQkgICAgcmV0dXJuKFBUWV9HRVRQVFlfU0xBVkVfVE9PTE9ORyk7CisJCX0KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJwdHlfZ2V0cHR5KCkgc2xhdmVidWYgWzJdIixzbGF2ZWJ1ZiwwKTsKKwkJY2tzdHJuY3B5KHNsYXZlLCBzbGF2ZWJ1Ziwgc2xhdmVsZW5ndGgpOworCQlyZXR1cm4oMCk7CisJICAgIH0KKwl9CisJcmV0dXJuKFBUWV9HRVRQVFlfTk9QVFkpOworICAgIH0KKyNlbmRpZiAvKkhBVkVfX0dFVFBUWSovCisjZW5kaWYgLyogSEFWRV9PUEVOUFRZICovCit9CisKK2xvbmcKK3B0eV9pbml0KCkgeworI2lmZGVmIEhBVkVfUFRZTQorICAgIHN0YXRpYyBjaGFyIGR1bW15OworICAgIGRlYnVnKEYxMDAsIkhBVkVfUFRZTSIsIiIsMCk7CisgICAgdHR5X2JhbmsgPSAgJm1hc3Rlcl9uYW1lW3N0cmxlbigiL2Rldi9wdHltL3B0eSIpXTsKKyAgICB0dHlfbnVtICA9ICAmbWFzdGVyX25hbWVbc3RybGVuKCIvZGV2L3B0eW0vcHR5WCIpXTsKKyAgICBzbGF2ZV9iYW5rID0gJnNsYXZlX25hbWVbc3RybGVuKCIvZGV2L3B0eS90dHkiKV07CisgICAgc2xhdmVfbnVtICA9ICZzbGF2ZV9uYW1lW3N0cmxlbigiL2Rldi9wdHkvdHR5WCIpXTsKKyNlbmRpZgorICAgIHJldHVybigwTCk7Cit9CisKKy8qCisgIFRoZSBmb2xsb3dpbmcgaXMgYW4gYXJyYXkgb2YgbW9kdWxlcyB0aGF0IHNob3VsZCBiZSBwdXNoZWQgb24gdGhlIHN0cmVhbS4KKyAgU2VlIGNvbmZpZ3VyZS5pbiBmb3IgY2F2aWF0cyBhbmQgbm90ZXMgYWJvdXQgd2hlbiB0aGlzIGFycmF5IGlzIHVzZWQgYW5kIG5vdAorICB1c2VkLgorKi8KKyNpZmRlZiBIQVZFX1NUUkVBTVMKKyNpZm5kZWYgSEFWRV9MSU5FX1BVU0gKK3N0YXRpYyBjaGFyICpwdXNoX2xpc3RbXSA9IHsKKyNpZmRlZiBQVVNIX1BURU0KKyAgICAicHRlbSIsCisjZW5kaWYKKyNpZmRlZiBQVVNIX0xEVEVSTQorICAgICJsZHRlcm0iLAorI2VuZGlmCisjaWZkZWYgUFVTSF9UVENPTVBBVAorICAgICJ0dGNvbXBhdCIsCisjZW5kaWYKKyAgICAwCit9OworI2VuZGlmIC8qIEhBVkVfTElORV9QVVNIICovCisjZW5kaWYgLyogSEFWRV9TVFJFQU1TICovCisKK2xvbmcKK3B0eV9pbml0aWFsaXplX3NsYXZlIChmZCkgaW50IGZkOyB7CisjaWZkZWYgUE9TSVhfVEVSTUlPUworI2lmbmRlZiB1bHRyaXgKKyAgICBzdHJ1Y3QgdGVybWlvcyBuZXdfdGVybWlvOworI2Vsc2UKKyAgICBzdHJ1Y3Qgc2d0dHliIGI7CisjZW5kaWYgLyogdWx0cml4ICovCisjZWxzZQorICAgIHN0cnVjdCBzZ3R0eWIgYjsKKyNlbmRpZiAvKiBQT1NJWF9URVJNSU9TICovCisgICAgaW50IHBpZDsKKyNpZmRlZiBQT1NJWF9URVJNSU9TCisjaWZuZGVmIHVsdHJpeAorICAgIGludCByYzsKKyNlbmRpZiAvKiB1bHRyaXggKi8KKyNlbmRpZiAvKiBQT1NJWF9URVJNSU9TICovCisKKyAgICBkZWJ1ZyhGMTExLCJwdHlfaW5pdGlhbGl6ZV9zbGF2ZSgpIiwiZmQiLGZkKTsKKworI2lmZGVmIEhBVkVfU1RSRUFNUworI2lmZGVmIEhBVkVfTElORV9QVVNICisgICAgd2hpbGUgKGlvY3RsKGZkLElfUE9QLDApID09IDApIDsJLyogQ2xlYXIgb3V0IGFueSBvbGQgbGluZWQncyAqLworCisgICAgaWYgKGxpbmVfcHVzaChmZCkgPCAwKSB7CisgICAgICAgIGRlYnVnKEYxMTAsInB0eV9pbml0aWFsaXplX3NsYXZlKCkiLCJsaW5lX3B1c2goKSBmYWlsZWQiLDApOworCWNsb3NlKGZkKTsKKyAgICAgICAgZmQgPSAtMTsKKyAgICAgICAgcmV0dXJuKFBUWV9PUEVOX1NMQVZFX0xJTkVfUFVTSEZBSUwpOworICAgIH0KKyNlbHNlIC8qTm8gbGluZV9wdXNoICovCisgICAgeworICAgICAgICBjaGFyICoqbW9kdWxlID0gJnB1c2hfbGlzdFswXTsKKyAgICAgICAgd2hpbGUgKCptb2R1bGUpIHsKKwkgICAgaWYgKGlvY3RsKGZkLCBJX1BVU0gsICoobW9kdWxlKyspKSA8IDApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJwdHlfaW5pdGlhbGl6ZV9zbGF2ZSgpIiwiaW9jdGwoSV9QVVNIKSBmYWlsZWQiLDApOworCQlyZXR1cm4oUFRZX09QRU5fU0xBVkVfUFVTSF9GQUlMKTsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYgLypMSU5FX1BVU0gqLworI2VuZGlmIC8qSEFWRV9TVFJFQU1TKi8KKy8qCisgIFVuZGVyIFVsdHJpeCAzLjAsIHRoZSBwZ3JwIG9mIHRoZSBzbGF2ZSBwdHkgdGVybWluYWwgbmVlZHMgdG8gYmUgc2V0CisgIGV4cGxpY2l0bHkuICBXaHkgcmxvZ2luZCB3b3JrcyBhdCBhbGwgd2l0aG91dCB0aGlzIG9uIDQuM0JTRCBpcyBhIG15c3RlcnkuCisqLworI2lmZGVmIEdFVFBHUlBfT05FQVJHCisgICAgcGlkID0gZ2V0cGdycChnZXRwaWQoKSk7CisjZWxzZQorICAgIHBpZCA9IGdldHBncnAoKTsKKyNlbmRpZiAvKiBHRVRQR1JQX09ORUFSRyAqLworCisgICAgZGVidWcoRjExMSwicHR5X2luaXRpYWxpemVfc2xhdmUoKSIsInBpZCIscGlkKTsKKworI2lmZGVmIFRJT0NTUEdSUAorICAgIGlvY3RsKGZkLCBUSU9DU1BHUlAsICZwaWQpOworI2VuZGlmIC8qIFRJT0NTUEdSUCAqLworCisjaWZkZWYgUE9TSVhfVEVSTUlPUworI2lmbmRlZiB1bHRyaXgKKyAgICB0Y3NldHBncnAoZmQsIHBpZCk7CisgICAgZXJybm8gPSAwOworICAgIHJjID0gdGNnZXRhdHRyKGZkLCZuZXdfdGVybWlvKTsKKyAgICBkZWJ1ZyhGMTExLCJwdHlfaW5pdGlhbGl6ZV9zbGF2ZSB0Y2dldGF0dHIoZmQpIixja2l0b2EocmMpLGVycm5vKTsKKyAgICBpZiAocmMgPT0gMCkgeworCW5ld190ZXJtaW8uY19jY1tWTUlOXSA9IDE7CisJbmV3X3Rlcm1pby5jX2NjW1ZUSU1FXSA9IDA7CisJcmMgPSB0Y3NldGF0dHIoZmQsVENTQU5PVywmbmV3X3Rlcm1pbyk7CisJZGVidWcoRjExMSwicHR5X2luaXRpYWxpemVfc2xhdmUgdGNzZXRhdHRyKGZkKSIsY2tpdG9hKHJjKSxlcnJubyk7CisgICAgfQorI2VuZGlmIC8qIHVsdHJpeCAqLworI2VuZGlmIC8qIFBPU0lYX1RFUk1JT1MgKi8KKyAgICByZXR1cm4oMEwpOworfQorCisjaWZkZWYgV0FOVF9VVE1QCitsb25nCitwdHlfbG9nd3RtcCAodHR5LCB1c2VyLCBob3N0KSBjaGFyICp1c2VyLCAqdHR5LCAqaG9zdDsgeworI2lmZGVmIEhBVkVfTE9HV1RNUAorICAgIGxvZ3d0bXAodHR5LHVzZXIsaG9zdCk7CisgICAgcmV0dXJuKDApOworI2Vsc2UKKyAgICBzdHJ1Y3QgdXRtcCB1dDsKKyAgICBjaGFyICp0bXB4OworICAgIGNoYXIgdXRtcF9pZFs1XTsKKyAgICBpbnQgbG9nZ2luZ2luID0gdXNlclswXTsJCS8qIFdpbGwgYmUgZW1wdHkgZm9yIGxvZ291dCAqLworCisjaWZuZGVmIE5PX1VUX0hPU1QKKyAgICBzdHJuY3B5KHV0LnV0X2hvc3QsIGhvc3QsIHNpemVvZih1dC51dF9ob3N0KSk7CisjZW5kaWYgLyogTk9fVVRfSE9TVCAqLworCisgICAgc3RybmNweSh1dC51dF9saW5lLCB0dHksIHNpemVvZih1dC51dF9saW5lKSk7CisgICAgdXQudXRfdGltZSA9IHRpbWUoMCk7CisKKyNpZm5kZWYgTk9fVVRfUElECisgICAgdXQudXRfcGlkID0gZ2V0cGlkKCk7CisgICAgc3RybmNweSh1dC51dF91c2VyLCB1c2VyLCBzaXplb2YodXQudXRfdXNlcikpOworCisgICAgdG1weCA9IHR0eSArIHN0cmxlbih0dHkpIC0gMjsKKyAgICBja21ha21zZyh1dG1wX2lkLDUsImtyIix0bXB4LE5VTEwsTlVMTCk7CisgICAgc3RybmNweSh1dC51dF9pZCwgdXRtcF9pZCwgc2l6ZW9mKHV0LnV0X2lkKSk7CisgICAgdXQudXRfcGlkID0gKGxvZ2dpbmdpbiA/IGdldHBpZCgpIDogMCk7CisgICAgdXQudXRfdHlwZSA9IChsb2dnaW5naW4gPyBVU0VSX1BST0NFU1MgOiBERUFEX1BST0NFU1MpOworI2Vsc2UKKyAgICBzdHJuY3B5KHV0LnV0X25hbWUsIHVzZXIsIHNpemVvZih1dC51dF9uYW1lKSk7CisjZW5kaWYgLyogTk9fVVRfUElEICovCisKKyAgICByZXR1cm4ocHR5aW50X3VwZGF0ZV93dG1wKCZ1dCwgaG9zdCwgdXNlcikpOworCisjZW5kaWYgLyogSEFWRV9MT0dXVE1QICovCit9CisjZW5kaWYgLyogV0FOVF9VVE1QICovCisKKy8qCisgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdHdpY2UuICBJdCdzIG5vdCBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHRoYXQgdGhlCisgIHNldHNpZCgpIG9yIFRJT0NTVFRZIGlvY3RscyBzdWNjZWVkICh0aGV5IG1heSBub3QgdGhlIHNlY29uZCB0aW1lKSwgYnV0CisgIHJhdGhlciB0aGF0IHdlIGhhdmUgYSBjb250cm9sbGluZyB0ZXJtaW5hbCBhdCB0aGUgZW5kLiAgSXQgaXMgYXNzdW1lZCB0aGF0CisgIHZoYW5ndXAgZG9lc24ndCBleGlzdCBhbmQgY29uZnVzZSB0aGUgcHJvY2VzcydzIG5vdGlvbiBvZiBjb250cm9sbGluZworICB0ZXJtaW5hbCBvbiBhbnkgc3lzdGVtIHdpdGhvdXQgVElPQ05PVFRZLiAgVGhhdCBpcywgZWl0aGVyIHZoYW5ndXAoKSBsZWF2ZXMKKyAgdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIGluIHRhY3QsIGJyZWFrcyB0aGUgYXNzb2NpYXRpb24gY29tcGxldGVseSwgb3IgdGhlCisgIHN5c3RlbSBwcm92aWRlcyBUSU9DTk9UVFkgdG8gZ2V0IHRoaW5ncyBiYWNrIGludG8gYSByZWFzb25hYmxlIHN0YXRlLiAgSW4KKyAgcHJhY3RpY2UsIHZoYW5ndXAoKSBlaXRoZXIgYnJlYWtzIHRoZSBhc3NvY2lhdGlvbiBjb21wbGV0ZWx5IG9yIGRvZXNuJ3QKKyAgZWZmZWN0IGNvbnRyb2xsaW5nIHRlcm1pbmFscywgc28gdGhpcyBjb25kaXRpb24gaXMgbWV0LgorKi8KK2xvbmcKK3B0eV9vcGVuX2N0dHkoc2xhdmUsIGZkKSBjaGFyICogc2xhdmU7IGludCAqZmQ7IHsKKyAgICBpbnQgcmV0dmFsOworCisgICAgZGVidWcoRjExMCwicHR5X29wZW5fY3R0eSgpIHNsYXZlIixzbGF2ZSwwKTsKKworLyogRmlyc3QsIGRpc3NvY2lhdGUgZnJvbSBwcmV2aW91cyB0ZXJtaW5hbCAqLworCisgICAgaWYgKChyZXR2YWwgPSBwdHlpbnRfdm9pZF9hc3NvY2lhdGlvbigpKSAhPSAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsCisJICAgICAgInB0eV9vcGVuX2N0dHkoKSIsCisJICAgICAgInB0eWludF92b2lkX2Fzc29jaWF0aW9uKCkgZmFpbGVkIiwKKwkgICAgICByZXR2YWwKKwkgICAgICApOworCXJldHVybihyZXR2YWwpOworICAgIH0KKworI2lmZGVmIE1VU1RfU0VUUEdSUAorLyoKKyAgVGhlIFVsdHJpeCAoYW5kIG90aGVyIEJTRCB0dHkgZHJpdmVycykgcmVxdWlyZSB0aGUgcHJvY2VzcyBncm91cAorICB0byBiZSB6ZXJvIGluIG9yZGVyIHRvIGFjcXVpcmUgdGhlIG5ldyB0dHkgYXMgYSBjb250cm9sbGluZyB0dHkuCisqLworICAgIHNldHBncnAoMCwwKTsKKyNlbmRpZiAvKiBNVVNUX1NFVFBHUlAgKi8KKworICAgIGVycm5vID0gMDsKKyAgICAqZmQgPSBvcGVuKHNsYXZlLCBPX1JEV1IpOworICAgIGlmICgqZmQgPCAwKSB7CisJZGVidWcoRjExMSwicHR5X29wZW5fY3R0eSgpIG9wZW4gZmFpbHVyZSIsIHNsYXZlLCBlcnJubyk7CisJcmV0dXJuKFBUWV9PUEVOX1NMQVZFX09QRU5GQUlMKTsKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBlbHNlIGlmIChkZWJsb2cpIHsKKwlkZWJ1ZyhGMTEwLCAicHR5X29wZW5fY3R0eSgpIG9wZW4gb2siLCBzbGF2ZSwgMCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyNpZmRlZiBNVVNUX1NFVFBHUlAKKyAgICBzZXRwZ3JwKDAsIGdldHBpZCgpKTsKKyNlbmRpZiAvKiBNVVNUX1NFVFBHUlAgKi8KKworI2lmZGVmIFRJT0NTQ1RUWQorICAgIGVycm5vID0gMDsKKyAgICByZXR2YWwgPSBpb2N0bCgqZmQsIFRJT0NTQ1RUWSwgMCk7IC8qIERvbid0IGNoZWNrIHJldHVybi4qLworICAgIGRlYnVnKEYxMTEsInB0eV9vcGVuX2N0dHkoKSBpb2N0bCBUSU9DU0NUVFkiLGNraXRvYShyZXR2YWwpLGVycm5vKTsKKyNlbmRpZiAvKiBUSU9DU1RUWSAqLworICAgIHJldHVybigwTCk7Cit9CisKK2xvbmcKK3B0eV9vcGVuX3NsYXZlKHNsYXZlLCBmZCkgY2hhciAqc2xhdmU7IGludCAqZmQ7IHsKKyAgICBpbnQgdmZkLCB0ZXN0ZmQ7CisgICAgbG9uZyByZXR2YWw7CisjaWZkZWYgQ0tfUE9TSVhfU0lHCisgICAgc3RydWN0IHNpZ2FjdGlvbiBzYTsKKworICAgIHNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsJCS8qIEluaXRpYWxpemUgInNhIiBzdHJ1Y3R1cmUuICovCisgICAgc2Euc2FfZmxhZ3MgPSAwOworI2VuZGlmIC8qIENLX1BPU0lYX1NJRyAqLworCisvKgorICBGaXJzdCwgY2htb2QgYW5kIGNob3duIHRoZSBzbGF2ZS4gIElmIHdlIGhhdmUgdmhhbmd1cCB0aGVuIHdlIHJlYWxseSBuZWVkCisgIHB0eV9vcGVuX2N0dHkgdG8gbWFrZSBzdXJlIG91ciBjb250cm9sbGluZyB0ZXJtaW5hbCBpcyB0aGUgcHR5IHdlJ3JlCisgIG9wZW5pbmcuICBIb3dldmVyLCBpZiB3ZSBhcmUgdXNpbmcgcmV2b2tlIG9yIG5vdGhpbmcgdGhlbiB3ZSBqdXN0IG5lZWQgYQorICBmaWxlIGRlc2NyaWlwdG9yIGZvciB0aGUgcHR5LiAgQ29uc2lkZXJpbmcgc29tZSBPU2VzIGluIHRoaXMgY2F0ZWdvcnkgYnJlYWsKKyAgb24gdGhlIHNlY29uZCBjYWxsIHRvIG9wZW5fY3R0eSAoY3VycmVudGx5IE9TRiBidXQgb3RoZXJzIG1heSksIHdlIHNpbXBseQorICB1c2UgYSBkZXNjcmlwdG9yIGlmIHdlIGNhbi4KKyovCisjaWZkZWYgVkhBTkdfRklSU1QKKyAgICBpZiAoKHJldHZhbCA9IHB0eV9vcGVuX2N0dHkoc2xhdmUsICZ2ZmQpKSAhPSAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsCisJICAgICAgInB0eV9vcGVuX3NsYXZlKCkgVkhBTkdfRklSU1QiLAorCSAgICAgICJwdHlfb3Blbl9jdHR5KCkgZmFpbGVkIiwKKwkgICAgICByZXR2YWwKKwkgICAgICApOworICAgICAgICByZXR1cm4ocmV0dmFsKTsKKyAgICB9CisgICAgaWYgKHZmZCA8IDApIHsKKyAgICAgICAgZGVidWcoRjExMSwKKwkgICAgICAicHR5X29wZW5fc2xhdmUoKSBWSEFOR19GSVJTVCIsCisJICAgICAgIlBUWV9PUEVOX1NMQVZFX09QRU5GQUlMIiwKKwkgICAgICB2ZmQKKwkgICAgICApOworCXJldHVybihQVFlfT1BFTl9TTEFWRV9PUEVORkFJTCk7CisgICAgfQorI2VuZGlmIC8qIFZIQU5HX0ZJUlNUICovCisKKyAgICBpZiAoc2xhdmUgPT0gTlVMTCB8fCAqc2xhdmUgPT0gJ1wwJykgeworICAgICAgICBkZWJ1ZyhGMTEwLCJwdHlfb3Blbl9zbGF2ZSgpIiwiUFRZX09QRU5fU0xBVkVfVE9PU0hPUlQiLDApOworICAgICAgICByZXR1cm4oUFRZX09QRU5fU0xBVkVfVE9PU0hPUlQpOworICAgIH0KKworI2lmZGVmIFNFVFVJRAorICAgIGlmIChjaG1vZChzbGF2ZSwgMCkpIHsKKyAgICAgICAgZGVidWcoRjExMCwicHR5X29wZW5fc2xhdmUoKSIsIlBUWV9PUEVOX1NMQVZFX0NITU9ERkFJTCIsMCk7CisgICAgICAgIHJldHVybihQVFlfT1BFTl9TTEFWRV9DSE1PREZBSUwpOworICAgIH0KKyAgICBpZiAoY2hvd24oc2xhdmUsIDAsIDAgKSA9PSAtMSApIHsKKyAgICAgICAgZGVidWcoRjExMCwicHR5X29wZW5fc2xhdmUoKSIsIlBUWV9PUEVOX1NMQVZFX0NIT1dORkFJTCIsMCk7CisgICAgICAgIHJldHVybihQVFlfT1BFTl9TTEFWRV9DSE9XTkZBSUwpOworICAgIH0KKyNlbmRpZiAvKiBTRVRVSUQgKi8KKyNpZmRlZiBWSEFOR19GSVJTVAorICAgIHB0eWludF92aGFuZ3VwKCk7CisgICAgY2xvc2UodmZkKTsKKyNlbmRpZiAvKiBWSEFOR19GSVJTVCAqLworCisgICAgaWYgKChyZXR2YWwgPSBwdHlpbnRfdm9pZF9hc3NvY2lhdGlvbigpKSAhPSAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsCisJICAgICAgInB0eV9vcGVuX3NsYXZlKCkiLAorCSAgICAgICJwdHlpbnRfdm9pZF9hc3NvY2lhdGlvbigpIGZhaWxlZCIsCisJICAgICAgcmV0dmFsCisJICAgICAgKTsKKyAgICAgICAgcmV0dXJuKHJldHZhbCk7CisgICAgfQorCisjaWZkZWYgSEFWRV9SRVZPS0UKKyAgICBpZiAocmV2b2tlIChzbGF2ZSkgPCAwICkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJwdHlfb3Blbl9zbGF2ZSgpIiwiUFRZX09QRU5fU0xBVkVfUkVWT0tFRkFJTCIsMCk7CisJcmV0dXJuKFBUWV9PUEVOX1NMQVZFX1JFVk9LRUZBSUwpOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX1JFVk9LRSAqLworCisvKiBPcGVuIHRoZSBwdHkgZm9yIHJlYWwuICovCisKKyAgICByZXR2YWwgPSBwdHlfb3Blbl9jdHR5KHNsYXZlLCBmZCk7CisgICAgaWYgKHJldHZhbCAhPSAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsInB0eV9vcGVuX3NsYXZlKCkiLCJwdHlfb3Blbl9jdHR5KCkgZmFpbGVkIixyZXR2YWwpOworCXJldHVybihQVFlfT1BFTl9TTEFWRV9PUEVORkFJTCk7CisgICAgfQorICAgIHJldHZhbCA9IHB0eV9pbml0aWFsaXplX3NsYXZlKCpmZCk7CisgICAgaWYgKHJldHZhbCkgeworICAgICAgICBkZWJ1ZyhGMTExLCJwdHlfb3Blbl9zbGF2ZSgpIiwicHR5X2luaXRpYWxpemVfc2xhdmUoKSBmYWlsZWQiLHJldHZhbCk7CisgICAgICAgIHJldHVybihyZXR2YWwpOworICAgIH0KKyNpZm5kZWYgTk9fREVWVFRZCisgICAgZXJybm8gPSAwOworICAgIHRlc3RmZCA9IG9wZW4oIi9kZXYvdHR5IiwgT19SRFdSfE9fTkRFTEFZKTsKKyAgICBpZiAodGVzdGZkIDwgMCkgeworICAgICAgICBkZWJ1ZyhGMTExLCJwdHlfb3Blbl9zbGF2ZSgpIG9wZW4gZmFpbGVkIiwiL2Rldi90dHkiLGVycm5vKTsKKwljbG9zZSgqZmQpOworCSpmZCA9IC0xOworCXJldHVybihQVFlfT1BFTl9TTEFWRV9OT0NUVFkpOworICAgIH0KKyAgICBjbG9zZSh0ZXN0ZmQpOworI2VuZGlmIC8qIE5PX0RFVlRUWSAqLworICAgIGRlYnVnKEYxMTAsInB0eV9vcGVuX3NsYXZlKCkiLCJzdWNjZXNzIiwwKTsKKyAgICByZXR1cm4oMEwpOworfQorCisjaWZkZWYgV0FOVF9VVE1QCisKKyNpZm5kZWYgVVRNUF9GSUxFCisjaWZkZWYgX1BBVEhfVVRNUAorI2RlZmluZSBVVE1QX0ZJTEUgX1BBVEhfVVRNUAorI2VuZGlmIC8qIF9QQVRIX1VUTVAgKi8KKyNlbmRpZiAvKiAgVVRNUF9GSUxFICovCisKKy8qIElmIGl0IGlzICpzdGlsbCogbWlzc2luZywgYXNzdW1lIC9ldGMvdXRtcCAqLworCisjaWZuZGVmIFVUTVBfRklMRQorI2RlZmluZQlVVE1QX0ZJTEUgIi9ldGMvdXRtcCIKKyNlbmRpZiAvKiBVVE1QX0ZJTEUgKi8KKworI2lmbmRlZiBOT19VVF9QSUQKKyNkZWZpbmUgV1RNUF9SRVFVSVJFU19VU0VSTkFNRQorI2VuZGlmIC8qIE5PX1VUX1BJRCAqLworCitsb25nCitwdHlfdXBkYXRlX3V0bXAocHJvY2Vzc190eXBlLCBwaWQsIHVzZXJuYW1lLCBsaW5lLCBob3N0LCBmbGFncykKKyAgICBpbnQgcHJvY2Vzc190eXBlOworICAgIGludCBwaWQ7CisgICAgY2hhciAqdXNlcm5hbWUsICpsaW5lLCAqaG9zdDsKKyAgICBpbnQgZmxhZ3M7CisvKiBwdHlfdXBkYXRlX3V0bXAgKi8geworICAgIHN0cnVjdCB1dG1wIGVudCwgdXQ7CisjaWZuZGVmIEhBVkVfU0VUVVRFTlQKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YjsKKyAgICBpbnQgdHR5OworI2VuZGlmIC8qIEhBVkVfU0VUVVRFTlQgKi8KKyNpZmRlZiBIQVZFX1NFVFVUWEVOVAorICAgIHN0cnVjdCB1dG1weCB1dHg7CisjZW5kaWYgLyogSEFWRV9TRVRVVFhFTlQgKi8KKyNpZm5kZWYgTk9fVVRfUElECisgICAgY2hhciAqdG1weDsKKyAgICBjaGFyIHV0bXBfaWRbNV07CisjZW5kaWYgLyogTk9fVVRfUElEICovCisgICAgY2hhciB1c2VyYnVmWzMyXTsKKyAgICBpbnQgZmQ7CisKKyAgICBkZWJ1ZyhGMTAwLCJwdHlfdXBkYXRlX3V0bXAoKSIsIiIsMCk7CisgICAgc3RybmNweShlbnQudXRfbGluZSwgbGluZStzaXplb2YoIi9kZXYvIiktMSwgc2l6ZW9mKGVudC51dF9saW5lKSk7CisgICAgZW50LnV0X3RpbWUgPSB0aW1lKDApOworCisjaWZkZWYgTk9fVVRfUElECisgICAgaWYgKHByb2Nlc3NfdHlwZSA9PSBQVFlfTE9HSU5fUFJPQ0VTUykKKyAgICAgIHJldHVybigwTCk7CisjZWxzZSAvKiBOT19VVF9QSUQgKi8KKworICAgIGVudC51dF9waWQgPSBwaWQ7CisKKyAgICBzd2l0Y2ggKHByb2Nlc3NfdHlwZSkgeworICAgICAgY2FzZSBQVFlfTE9HSU5fUFJPQ0VTUzoKKwllbnQudXRfdHlwZSA9IExPR0lOX1BST0NFU1M7CisJYnJlYWs7CisgICAgICBjYXNlIFBUWV9VU0VSX1BST0NFU1M6CisJZW50LnV0X3R5cGUgPSBVU0VSX1BST0NFU1M7CisJYnJlYWs7CisgICAgICBjYXNlIFBUWV9ERUFEX1BST0NFU1M6CisJZW50LnV0X3R5cGUgPSBERUFEX1BST0NFU1M7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCXJldHVybihQVFlfVVBEQVRFX1VUTVBfUFJPQ1RZUEVfSU5WQUxJRCk7CisgICAgfQorI2VuZGlmIC8qTk9fVVRfUElEKi8KKworI2lmbmRlZiBOT19VVF9IT1NUCisgICAgaWYgKGhvc3QpCisgICAgICBzdHJuY3B5KGVudC51dF9ob3N0LCBob3N0LCBzaXplb2YoZW50LnV0X2hvc3QpKTsKKyAgICBlbHNlCisgICAgICBlbnQudXRfaG9zdFswXSA9ICdcMCc7CisjZW5kaWYgLyogTk9fVVRfSE9TVCAqLworCisjaWZuZGVmIE5PX1VUX1BJRAorICAgIGlmICghc3RyY21wIChsaW5lLCAiL2Rldi9jb25zb2xlIikpIHsKKwljaGFyICogcyA9IE5VTEw7CisKKyNpZmRlZiBzdW4KKyNpZmRlZiBfX1NWUjQKKwlzID0gImNvIjsKKyNlbHNlCisJcyA9ICJjb25zIjsKKyNlbmRpZiAvKiBfX1NWUjQgKi8KKyNlbHNlCisJcyA9ICJjb25zIjsKKyNlbmRpZiAvKiBzdW4gKi8KKworCXN0cm5jcHkoZW50LnV0X2lkLCBzLCA0KTsKKworICAgIH0gZWxzZSB7CisKKwl0bXB4ID0gbGluZSArIHN0cmxlbihsaW5lKS0xOworCWlmICgqKHRtcHgtMSkgIT0gJy8nKSB0bXB4LS07CS8qIGxhc3QgMiBjaGFycyB1bmxlc3MgaXQncyBhICcvJyAqLworI2lmZGVmIF9faHB1eAorCWNrc3RybmNweSh1dG1wX2lkLCB0bXB4LCA1KTsKKyNlbHNlCisJY2ttYWttc2codXRtcF9pZCw1LCJrbCIsdG1weCxOVUxMLE5VTEwpOworI2VuZGlmIC8qIF9faHB1eCAqLworCXN0cm5jcHkoZW50LnV0X2lkLCB1dG1wX2lkLCBzaXplb2YoZW50LnV0X2lkKSk7CisgICAgfQorICAgIHN0cm5jcHkoZW50LnV0X3VzZXIsIHVzZXJuYW1lLCBzaXplb2YoZW50LnV0X3VzZXIpKTsKKworI2Vsc2UKKworICAgIHN0cm5jcHkoZW50LnV0X25hbWUsIHVzZXJuYW1lLCBzaXplb2YoZW50LnV0X25hbWUpKTsKKworI2VuZGlmIC8qIE5PX1VUX1BJRCAqLworCisgICAgaWYgKHVzZXJuYW1lWzBdKQorICAgICAgc3RybmNweSh1c2VyYnVmLCB1c2VybmFtZSwgc2l6ZW9mKHVzZXJidWYpKTsKKyAgICBlbHNlCisgICAgICB1c2VyYnVmWzBdID0gJ1wwJzsKKworI2lmZGVmIEhBVkVfU0VUVVRFTlQKKworICAgIHV0bXBuYW1lKFVUTVBfRklMRSk7CisgICAgc2V0dXRlbnQoKTsKKy8qCisgIElmIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIHVzZXIgbmFtZSBpbiB0aGUgd3RtcCBzdHJ1Y3R1cmUgYW5kIE91ciBmbGFncworICB0ZWxsIHVzIHdlIGNhbiBvYnRhaW4gaXQgZnJvbSB0aGUgdXRtcCBhbmQgd2Ugc3VjY2VlZCBpbiBvYnRhaW5pbmcgaXQsIHdlCisgIHRoZW4gc2F2ZSB0aGUgdXRtcCBzdHJ1Y3R1cmUgd2Ugb2J0YWluLCB3cml0ZSBvdXQgdGhlIHV0bXAgc3RydWN0dXJlIGFuZAorICBjaGFuZ2UgdGhlIHVzZXJuYW1lIHBvaW50ZXIgc28gaXQgaXMgdXNlZCBieSB1cGRhdGVfd3RtcC4KKyovCisKKyNpZmRlZiBXVE1QX1JFUVVJUkVTX1VTRVJOQU1FCisgICAgaWYgKCghdXNlcm5hbWVbMF0pICYmIChmbGFncyZQVFlfVVRNUF9VU0VSTkFNRV9WQUxJRCkgJiZsaW5lKSB7CisJc3RydWN0IHV0bXAgKnV0cHRyOworCXN0cm5jcHkodXQudXRfbGluZSwgbGluZSwgc2l6ZW9mKHV0LnV0X2xpbmUpKTsKKwl1dHB0ciA9IGdldHV0bGluZSgmdXQpOworCWlmICh1dHB0cikKKwkgIHN0cm5jcHkodXNlcmJ1Zix1dHB0ci0+dXRfdXNlcixzaXplb2YodXQudXRfdXNlcikpOworICAgIH0KKyNlbmRpZiAvKiBXVE1QX1JFUVVJUkVTX1VTRVJOQU1FICovCisKKyAgICBwdXR1dGxpbmUoJmVudCk7CisgICAgZW5kdXRlbnQoKTsKKworI2lmZGVmIEhBVkVfU0VUVVRYRU5UCisgICAgc2V0dXR4ZW50KCk7CisjaWZkZWYgSEFWRV9HRVRVVE1QWAorICAgIGdldHV0bXB4KCZlbnQsICZ1dHgpOworI2Vsc2UgLyogSEFWRV9HRVRVVE1QWCAqLworICAgIC8qIEZvciBwbGF0Zm9ybXMgbGlrZSBIUFVYIGFuZCBEZWMgVW5peCB3aGljaCBkb24ndCBoYXZlIGdldHV0bXB4ICovCisgICAgc3RybmNweSh1dHgudXRfdXNlciwgZW50LnV0X3VzZXIsIHNpemVvZihlbnQudXRfdXNlcikpOworICAgIHN0cm5jcHkodXR4LnV0X2lkLCBlbnQudXRfaWQsIHNpemVvZihlbnQudXRfaWQpKTsKKyAgICBzdHJuY3B5KHV0eC51dF9saW5lLCBlbnQudXRfbGluZSwgc2l6ZW9mKGVudC51dF9saW5lKSk7CisgICAgdXR4LnV0X3BpZCA9IHBpZDsJCS8qIGtsdWRnZSBmb3IgSXJpeCwgZXRjLiB0byBhdm9pZCB0cnVuYy4gKi8KKyAgICB1dHgudXRfdHlwZSA9IGVudC51dF90eXBlOworI2lmZGVmIFVUX0VYSVRfU1RSVUNUVVJFX0RJRkZFUgorICAgIHV0eC51dF9leGl0LnV0X2V4aXQgPSBlbnQudXRfZXhpdC5lX2V4aXQ7CisjZWxzZSAvKiBVVF9FWElUX1NUUlVDVFVSRV9ESUZGRVIgKi8KKy8qIEtMVURHRSBmb3Igbm93OyBldmVudHVhbGx5IHRoaXMgd2lsbCBiZSBhIGZlYXR1cmUgdGVzdC4uLiBTZWUgUFIjWzQwXSAqLworI2lmZGVmIF9faHB1eAorICAgIHV0eC51dF9leGl0Ll9fZV90ZXJtaW5hdGlvbiA9IGVudC51dF9leGl0LmVfdGVybWluYXRpb247CisgICAgdXR4LnV0X2V4aXQuX19lX2V4aXQgPSBlbnQudXRfZXhpdC5lX2V4aXQ7CisjZWxzZSAvKiBfX2hwdXggKi8KKyAgICAvKiBYWFggZG8gbm90aGluZyBmb3Igbm93OyB3ZSBkb24ndCBldmVuIGtub3cgdGhlIHN0cnVjdCBtZW1iZXIgZXhpc3RzICovCisjZW5kaWYgLyogX19ocHV4ICovCisjZW5kaWYgLyogVVRfRVhJVF9TVFJVQ1RVUkVfRElGRkVSICovCisgICAgdXR4LnV0X3R2LnR2X3NlYyA9IGVudC51dF90aW1lOworICAgIHV0eC51dF90di50dl91c2VjID0gMDsKKyNlbmRpZiAvKiBIQVZFX0dFVFVUTVBYICovCisgICAgaWYgKGhvc3QpCisgICAgICBzdHJuY3B5KHV0eC51dF9ob3N0LCBob3N0LCBzaXplb2YodXR4LnV0X2hvc3QpKTsKKyAgICBlbHNlCisgICAgICB1dHgudXRfaG9zdFswXSA9IDA7CisgICAgcHV0dXR4bGluZSgmdXR4KTsKKyAgICBlbmR1dHhlbnQoKTsKKyNlbmRpZiAvKiBIQVZFX1NFVFVUWEVOVCAqLworCisjZWxzZSAvKiBIQVZFX1NFVFVURU5UICovCisgICAgaWYgKGZsYWdzJlBUWV9UVFlTTE9UX1VTQUJMRSkgeworCXR0eSA9IHR0eXNsb3QoKTsKKyAgICB9IGVsc2UgeworCWludCBsYzsKKwl0dHkgPSAtMTsKKwlpZiAoKGZkID0gb3BlbihVVE1QX0ZJTEUsIE9fUkRXUikpIDwgMCkKKwkgIHJldHVybihlcnJubyk7CisJZm9yIChsYyA9IDA7CisJICAgICBsc2VlayhmZCwgKG9mZl90KShsYyAqIHNpemVvZihzdHJ1Y3QgdXRtcCkpLCBTRUVLX1NFVCkgIT0gLTE7CisJICAgICBsYysrCisJICAgICApIHsKKwkgICAgaWYgKHJlYWQoZmQsCisJCSAgICAgKGNoYXIgKikmdXQsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCB1dG1wKQorCQkgICAgICkgIT0gc2l6ZW9mKHN0cnVjdCB1dG1wKQorCQkpCisJICAgICAgYnJlYWs7CisJICAgIGlmIChzdHJuY21wKHV0LnV0X2xpbmUsIGVudC51dF9saW5lLCBzaXplb2YodXQudXRfbGluZSkpID09IDApIHsKKwkJdHR5ID0gbGM7CisjaWZkZWYgV1RNUF9SRVFVSVJFU19VU0VSTkFNRQorCQlpZiAoIXVzZXJuYW1lJiYoZmxhZ3MmUFRZX1VUTVBfVVNFUk5BTUVfVkFMSUQpKQorCQkgIHN0cm5jcHkodXNlcmJ1ZiwgdXQudXRfdXNlciwgc2l6ZW9mKHV0LnV0X3VzZXIpKTsKKyNlbmRpZiAvKiBXVE1QX1JFUVVJUkVTX1VTRVJOQU1FICovCisJCWJyZWFrOworCSAgICB9CisJfQorCWNsb3NlKGZkKTsKKyAgICB9CisgICAgaWYgKHR0eSA+IDAgJiYgKGZkID0gb3BlbihVVE1QX0ZJTEUsIE9fV1JPTkxZLCAwKSkgPj0gMCkgeworCWxzZWVrKGZkLCAob2ZmX3QpKHR0eSAqIHNpemVvZihzdHJ1Y3QgdXRtcCkpLCBTRUVLX1NFVCk7CisJd3JpdGUoZmQsIChjaGFyICopJmVudCwgc2l6ZW9mKHN0cnVjdCB1dG1wKSk7CisJY2xvc2UoZmQpOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX1NFVFVURU5UICovCisKKyAgICAvKiBEb24ndCByZWNvcmQgTE9HSU5fUFJPQ0VTUyBlbnRyaWVzLiAqLworICAgIGlmIChwcm9jZXNzX3R5cGUgPT0gUFRZX0xPR0lOX1BST0NFU1MpCisgICAgICByZXR1cm4oMCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHB0eWludF91cGRhdGVfd3RtcCgmZW50LCBob3N0LCB1c2VyYnVmKSk7Cit9CisjaWZuZGVmIFdUTVBfRklMRQorI2lmZGVmIF9QQVRIX1dUTVAKKyNkZWZpbmUgV1RNUF9GSUxFIF9QQVRIX1dUTVAKKyNlbmRpZiAvKiBfUEFUSF9XVE1QICovCisjZW5kaWYgLyogV1RNUF9GSUxFICovCisKKyNpZm5kZWYgV1RNUFhfRklMRQorI2lmZGVmIF9QQVRIX1dUTVBYCisjaWZkZWYgSEFWRV9VUERXVE1QWAorI2RlZmluZSBXVE1QWF9GSUxFIF9QQVRIX1dUTVBYCisjZW5kaWYgLyogSEFWRV9VUERXVE1QWCAqLworI2VuZGlmIC8qIF9QQVRIX1dUTVBYICovCisjZW5kaWYgLyogV1RNUFhfRklMRSAqLworCisvKiBJZiBpdCBpcyAqc3RpbGwqIG1pc3NpbmcsIGFzc3VtZSAvdXNyL2FkbS93dG1wICovCisKKyNpZm5kZWYgV1RNUF9GSUxFCisjZGVmaW5lCVdUTVBfRklMRSAiL3Vzci9hZG0vd3RtcCIKKyNlbmRpZiAvKiBXVE1QX0ZJTEUgKi8KKworI2lmZGVmIENPTU1FTlQKKy8qIFRoZSBmb2xsb3dpbmcgdGVzdCBjYW4gbm90IGJlIG1hZGUgcG9ydGFibHkgKi8KKworLyogI2lmIGRlZmluZWQoX19HTElCQ19fKSAmJiAoX19HTElCQ19fID49IDIpICYmIChfX0dMSUJDX01JTk9SX18gPj0gMSkgKi8KKy8qCisgIFRoaXMgaXMgdWdseSwgYnV0IHRoZSBsYWNrIG9mIHN0YW5kYXJkaXphdGlvbiBpbiB0aGUgdXRtcC91dG1weCBzcGFjZSwgYW5kCisgIHdoYXQgZ2xpYmMgaW1wbGVtZW50cyBhbmQgZG9lc24ndCBtYWtlIGF2YWlsYWJsZSwgaXMgZXZlbiB3b3JzZS4KKyovCisvKiAjdW5kZWYgSEFWRV9VUERXVE1QWCAqLwkvKiBEb24ndCB1c2UgdXBkd3RtcHggZm9yIGdsaWJjIDIuMSAqLworLyogI2VuZGlmICovIC8qIF9fR0xJQkNfXyBldGMgKi8KKworI2Vsc2UgIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIF9fR0xJQkNfXworI3VuZGVmIEhBVkVfVVBEV1RNUFgJCS8qIERvbid0IHVzZSB1cGR3dG1weCBmb3IgZ2xpYmMgcGVyaW9kICovCisjZW5kaWYgLyogX19HTElCQ19fICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCitsb25nCitwdHlpbnRfdXBkYXRlX3d0bXAoZW50LGhvc3QsdXNlcikgc3RydWN0IHV0bXAgKmVudDsgY2hhciAqaG9zdDsgY2hhciAqdXNlcjsgeworICAgIHN0cnVjdCB1dG1wIHV0OworICAgIHN0cnVjdCBzdGF0IHN0YXRiOworICAgIGludCBmZDsKKyAgICB0aW1lX3QgdXR0aW1lOworI2lmZGVmIEhBVkVfVVBEV1RNUFgKKyAgICBzdHJ1Y3QgdXRtcHggdXR4OworCisgICAgZ2V0dXRtcHgoZW50LCAmdXR4KTsKKyAgICBpZiAoaG9zdCkKKyAgICAgIHN0cm5jcHkodXR4LnV0X2hvc3QsIGhvc3QsIHNpemVvZih1dHgudXRfaG9zdCkgKTsKKyAgICBlbHNlCisgICAgICB1dHgudXRfaG9zdFswXSA9IDA7CisgICAgaWYgKHVzZXIpCisgICAgICBzdHJuY3B5KHV0eC51dF91c2VyLCB1c2VyLCBzaXplb2YodXR4LnV0X3VzZXIpKTsKKyAgICB1cGR3dG1weChXVE1QWF9GSUxFLCAmdXR4KTsKKyNlbmRpZiAvKiBIQVZFX1VQRFdUTVBYICovCisKKyNpZmRlZiBIQVZFX1VQRFdUTVAKKyNpZm5kZWYgSEFWRV9VUERXVE1QWAorICAgIC8qIFRoaXMgaXMgYWxyZWFkeSBwZXJmb3JtZWQgYnl1cGR3dG1weCBpZiBwcmVzZW50LiovCisgICAgdXBkd3RtcChXVE1QX0ZJTEUsIGVudCk7CisjZW5kaWYgLyogSEFWRV9VUERXVE1QWCovCisjZWxzZSAvKiBIQVZFX1VQRFdUTVAgKi8KKworICAgIGlmICgoZmQgPSBvcGVuKFdUTVBfRklMRSwgT19XUk9OTFl8T19BUFBFTkQsIDApKSA+PSAwKSB7CisJaWYgKCFmc3RhdChmZCwgJnN0YXRiKSkgeworCSAgICBtZW1zZXQoKGNoYXIgKikmdXQsIDAsIHNpemVvZih1dCkpOworI2lmZGVmIF9faHB1eAorCSAgICBzdHJuY3B5KHV0LnV0X2lkLCBlbnQtPnV0X2lkLCBzaXplb2YgKHV0LnV0X2lkKSk7CisjZW5kaWYgLyogX19ocHV4ICovCisJICAgIHN0cm5jcHkodXQudXRfbGluZSwgZW50LT51dF9saW5lLCBzaXplb2YodXQudXRfbGluZSkpOworCSAgICBzdHJuY3B5KHV0LnV0X25hbWUsIGVudC0+dXRfbmFtZSwgc2l6ZW9mKHV0LnV0X25hbWUpKTsKKyNpZm5kZWYgTk9fVVRfSE9TVAorCSAgICBzdHJuY3B5KHV0LnV0X2hvc3QsIGVudC0+dXRfaG9zdCwgc2l6ZW9mKHV0LnV0X2hvc3QpKTsKKyNlbmRpZiAvKiBOT19VVF9IT1NUICovCisKKwkgICAgdGltZSgmdXR0aW1lKTsKKwkgICAgdXQudXRfdGltZSA9IHV0dGltZTsKKworI2lmZGVmIEhBVkVfR0VUVVRFTlQKKyNpZmRlZiBVU0VSX1BST0NFU1MKKwkgICAgaWYgKGVudC0+dXRfbmFtZSkgeworCQlpZiAoIXV0LnV0X3BpZCkKKwkJICB1dC51dF9waWQgPSBnZXRwaWQoKTsKKyNpZm5kZWYgX19ocHV4CisJCXV0LnV0X3R5cGUgPSBVU0VSX1BST0NFU1M7CisjZWxzZSAgLyogX19ocHV4ICovCisJCXV0LnV0X3R5cGUgPSBlbnQtPnV0X3R5cGU7CisjZW5kaWYgLyogX19ocHV4ICovCisKKwkgICAgfSBlbHNlIHsKKworI2lmZGVmIEVNUFRZCisJCXV0LnV0X3R5cGUgPSBFTVBUWTsKKyNlbHNlCisJCXV0LnV0X3R5cGUgPSBERUFEX1BST0NFU1M7IC8qIEZvciBMaW51eCBicm9rZW5uZXNzKi8KKyNlbmRpZiAvKiBFTVBUWSAqLworCisJICAgIH0KKyNlbmRpZiAvKiBVU0VSX1BST0NFU1MgKi8KKyNlbmRpZiAvKiBIQVZFX0dFVFVURU5UICovCisKKwkgICAgaWYgKHdyaXRlKGZkLCAoY2hhciAqKSZ1dCwgc2l6ZW9mKHN0cnVjdCB1dG1wKSkgIT0KKwkJc2l6ZW9mKHN0cnVjdCB1dG1wKSkKKyNpZm5kZWYgQ09IRVJFTlQKKwkgICAgICBmdHJ1bmNhdGUoZmQsIHN0YXRiLnN0X3NpemUpOworI2Vsc2UKKwkgICAgICBjaHNpemUoZmQsIHN0YXRiLnN0X3NpemUpOworI2VuZGlmIC8qIENPSEVSRU5UICovCisJfQorCWNsb3NlKGZkKTsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9VUERXVE1QICovCisgICAgcmV0dXJuKDApOyAvKiBubyBjdXJyZW50IGZhaWx1cmUgY2FzZXM7IGZpbGUgbm90IGZvdW5kIGlzIG5vdCBmYWlsdXJlISovCit9CisjZW5kaWYgLyogV0FOVF9VVE1QICovCisKK3N0YXRpYyBjaGFyIFhsaW5lWzE3XSA9IHsgMCwgMCB9OworaW50IHB0eV9mb3JrX3BpZCA9IC0xOworCisvKgorICBnZXRwdHlzbGF2ZSgpCisgIE9wZW4gdGhlIHNsYXZlIHNpZGUgb2YgdGhlIHB0eSwgYW5kIGRvIGFueSBpbml0aWFsaXphdGlvbiB0aGF0IGlzIG5lY2Vzc2FyeS4KKyAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIHNsYXZlIHNpZGUuCisqLworaW50CitnZXRwdHlzbGF2ZSgpIHsKKyAgICBpbnQgdCA9IC0xOworICAgIGxvbmcgcmV0dmFsOworI2lmZGVmIFRJT0NHV0lOU1oKKyAgICBzdHJ1Y3Qgd2luc2l6ZSB3czsKKyAgICBleHRlcm4gaW50IGNtZF9yb3dzLCBjbWRfY29sczsKKyNlbmRpZiAvKiBUSU9DR1dJTlNaICovCisKKyAgICBkZWJ1ZyhGMTAwLCJnZXRwdHlzbGF2ZSgpIiwiIiwwKTsKKworICAgIC8qCisgICAgICogT3BlbmluZyB0aGUgc2xhdmUgc2lkZSBtYXkgY2F1c2UgaW5pdGlsaXphdGlvbiBvZiB0aGUKKyAgICAgKiBrZXJuZWwgdHR5IHN0cnVjdHVyZS4gIFdlIG5lZWQgcmVtZW1iZXIgdGhlIHN0YXRlIG9mOgorICAgICAqICAgICAgaWYgbGluZW1vZGUgd2FzIHR1cm5lZCBvbgorICAgICAqICAgICAgdGVybWluYWwgd2luZG93IHNpemUKKyAgICAgKiAgICAgIHRlcm1pbmFsIHNwZWVkCisgICAgICogc28gdGhhdCB3ZSBjYW4gcmVzZXQgdGhlbSBpZiB3ZSBuZWVkIHRvLgorICAgICAqLworICAgIGlmICgocmV0dmFsID0gcHR5X29wZW5fc2xhdmUoWGxpbmUsICZ0KSkgIT0gMCkgeworCXBlcnJvcihYbGluZSk7CisJbXNnKys7CisgICAgICAgIGRlYnVnKEYxMTEsImdldHB0eXNsYXZlKCkiLCJVbmFibGUgdG8gb3BlbiBzbGF2ZSIscmV0dmFsKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgICBkZWJ1ZyhGMTExLCJnZXRwdHlzbGF2ZSIsInR0eWZkIix0dHlmZCk7CisgICAgZGVidWcoRjExMSwiZ2V0cHR5c2xhdmUiLCJ0Iix0KTsKKyNpZmRlZiBJTklUX1NQVFkKKyAgICBzcHR5ID0gdDsKKyNlbmRpZiAvKiBJTklUX1NQVFkgKi8KKyNpZmRlZiBTVFJFQU1TUFRZCisgICAgaWYgKGlvY3RsKHQsSV9QVVNILCJwY2t0IikgPCAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsImdldHB0eXNsYXZlKCkiLCJpb2N0bChJX1BVU0gpIGZhaWxlZCIsZXJybm8pOworI2lmbmRlZiBfQUlYCisgICAgICAgIGZhdGFsKCJJX1BVU0ggcGNrdCIpOworI2VuZGlmIC8qIF9BSVggKi8KKyAgICB9CisjZW5kaWYgLyogU1RSRUFNU1BUWSAqLworCisgICAgLyogU2V0IHVwIHRoZSB0dHkgbW9kZXMgYXMgd2UgbGlrZSB0aGVtIHRvIGJlLiAqLworICAgIGluaXRfdGVybWJ1ZigpOworI2lmZGVmIFRJT0NHV0lOU1oKKyAgICBpZiAoY21kX3Jvd3MgfHwgY21kX2NvbHMpIHsKKyAgICAgICAgbWVtc2V0KChjaGFyICopJndzLCAwLCBzaXplb2Yod3MpKTsKKyAgICAgICAgd3Mud3NfY29sID0gY21kX2NvbHM7CisgICAgICAgIHdzLndzX3JvdyA9IGNtZF9yb3dzOworICAgICAgICBpb2N0bCh0LCBUSU9DU1dJTlNaLCAoY2hhciAqKSZ3cyk7CisgICAgfQorI2VuZGlmIC8qIFRJT0NHV0lOU1ogKi8KKworICAgIC8qIFNldHRpbmdzIGZvciBzZ3R0eSBiYXNlZCBzeXN0ZW1zICovCisKKyNpZm5kZWYgVVNFX1RFUk1JTworICAgIHRlcm1idWYuc2cuc2dfZmxhZ3MgfD0gQ1JNT0R8QU5ZUHxFQ0hPfFhUQUJTOworI2VuZGlmIC8qIFVTRV9URVJNSU8gKi8KKworI2lmbmRlZiBPWFRBQlMKKyNkZWZpbmUgT1hUQUJTIDAKKyNlbmRpZiAvKiBPWFRBQlMgKi8KKworICAgIC8qIFNldHRpbmdzIGZvciBVTklDT1MgYW5kIEhQVVggKi8KKworI2lmZGVmIENSQVkKKyAgICB0ZXJtYnVmLmNfb2ZsYWcgPSBPUE9TVHxPTkxDUnxUQUIzOworICAgIHRlcm1idWYuY19pZmxhZyA9IElHTlBBUnxJU1RSSVB8SUNSTkx8SVhPTjsKKyAgICB0ZXJtYnVmLmNfbGZsYWcgPSBJU0lHfElDQU5PTnxFQ0hPfEVDSE9FfEVDSE9LOworICAgIHRlcm1idWYuY19jZmxhZyA9IEVYVEJ8SFVQQ0x8Q1M4OworI2Vsc2UgLyogQ1JBWSAqLworI2lmZGVmIEhQVVgKKyAgICB0ZXJtYnVmLmNfb2ZsYWcgPSBPUE9TVHxPTkxDUnxUQUIzOworICAgIHRlcm1idWYuY19pZmxhZyA9IElHTlBBUnxJU1RSSVB8SUNSTkx8SVhPTjsKKyAgICB0ZXJtYnVmLmNfbGZsYWcgPSBJU0lHfElDQU5PTnxFQ0hPfEVDSE9FfEVDSE9LOworICAgIHRlcm1idWYuY19jZmxhZyA9IEVYVEJ8SFVQQ0x8Q1M4OworI2Vsc2UgLyogSFBVWCAqLworI2lmZGVmIFVTRV9URVJNSU8KKyAgICAvKgorICAgIFNldHRpbmdzIGZvciBhbGwgb3RoZXIgdGVybWlvcy90ZXJtaW8gYmFzZWQgc3lzdGVtcywgb3RoZXIgdGhhbiA0LjRCU0QuCisgICAgSW4gNC40QlNEIHRoZSBrZXJuZWwgZG9lcyB0aGUgaW5pdGlhbCB0ZXJtaW5hbCBzZXR1cC4KKyAgICAqLworI2lmZGVmIEJTRDQyCisjaWZuZGVmIEJTRDQ0CisgICAgdGVybWJ1Zi5jX2xmbGFnIHw9IEVDSE98SUNBTk9OfElFWFRFTnxJU0lHOworICAgIHRlcm1idWYuY19vZmxhZyB8PSBPTkxDUnxPWFRBQlN8T1BPU1Q7CisgICAgdGVybWJ1Zi5jX2lmbGFnIHw9IElDUk5MfElHTlBBUjsKKyAgICB0ZXJtYnVmLmNfY2ZsYWcgfD0gSFVQQ0w7CisgICAgdGVybWJ1Zi5jX2lmbGFnICY9IH5JWE9GRjsKKyNlbmRpZiAvKiBCU0Q0NCAqLworI2Vsc2UgLyogQlNENDIgKi8KKyAgICB0ZXJtYnVmLmNfbGZsYWcgfD0gRUNIT3xJQ0FOT058SUVYVEVOfElTSUc7CisgICAgdGVybWJ1Zi5jX29mbGFnIHw9IE9OTENSfE9YVEFCU3xPUE9TVDsKKyAgICB0ZXJtYnVmLmNfaWZsYWcgfD0gSUNSTkx8SUdOUEFSOworICAgIHRlcm1idWYuY19jZmxhZyB8PSBIVVBDTDsKKyAgICB0ZXJtYnVmLmNfaWZsYWcgJj0gfklYT0ZGOworI2VuZGlmIC8qIEJTRDQyICovCisjZW5kaWYgLyogVVNFX1RFUk1JTyAqLworI2VuZGlmIC8qIEhQVVggKi8KKyNlbmRpZiAvKiBDUkFZICovCisKKyAgICBzZXRfdGVybWJ1ZigpOyAgLyogU2V0IHRoZSB0dHkgbW9kZXMsIGFuZCBtYWtlIHRoaXMgb3VyIGNvbnRyb2xsaW5nIHR0eS4gKi8KKworICAgIGlmICh0ICE9IDApCisgICAgICBkdXAyKHQsIDApOworICAgIGlmICh0ICE9IDEpCisgICAgICBkdXAyKHQsIDEpOworICAgIGlmICh0ICE9IDIpCisgICAgICBkdXAyKHQsIDIpOworICAgIGlmICh0ID4gMikKKyAgICAgIGNsb3NlKHQpOworCisgICAgaWYgKHR0eWZkID4gMikgeworCWNsb3NlKHR0eWZkKTsKKyAgICAgICAgdHR5ZmQgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisjaWZkZWYgSEFWRV9QVFlUUkFQCisvKgorICBUbyBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIGEgdHJhcCBpcyBwZW5kaW5nIG9uIGEgcHR5CisgIGlmIGFuZCBvbmx5IGlmIHNlbGVjdCgpIGNhbm5vdCBiZSB1c2VkLgorKi8KK2ludAorcHR5X3RyYXBfcGVuZGluZyhmZCkgaW50IGZkOyB7CisgICAgaW50IHBlbmRpbmc7CisgICAgaW50IHJjOworCisgICAgcmMgPSBpb2N0bChmZCwgVElPQ1RSQVBTVEFUVVMsIChjaGFyICopJnBlbmRpbmcsIHNpemVvZihwZW5kaW5nKSk7CisgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgZGVidWcoRjEwMSwicHR5X3RyYXBfcGVuZGluZygpIiwiIixwZW5kaW5nKTsKKyAgICAgICAgcmV0dXJuKHBlbmRpbmcpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlYnVnKEYxMTEsInB0eV90cmFwX3BlbmRpbmcoKSIsImlvY3RsKCkgZmFpbGVkIixyYyk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorfQorCisvKgorICBUbyBiZSBjYWxsZWQgYWZ0ZXIgc2VsZWN0KCkgaGFzIHJldHVybmVkIGluZGljYXRpbmcgdGhhdCBhbiBleGNlcHRpb24gaXMKKyAgd2FpdGluZyBvbiBhIHB0eS4gIEl0IHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBwdHkuCisgIFJldHVybnMgLTEgb24gZXJyb3I7IDAgaWYgcHR5IGlzIHN0aWxsIG9wZW47IDEgaWYgcHR5IGhhcyBjbG9zZWQuCisqLworaW50CitwdHlfdHJhcF9oYW5kbGVyKGZkKSBpbnQgZmQ7IHsKKyAgICBzdHJ1Y3QgcmVxdWVzdF9pbmZvIHJpOworCisgICAgbWVtc2V0KCZyaSwwLHNpemVvZihyaSkpOworICAgIGlmIChpb2N0bChmZCxUSU9DUkVRQ0hFQ0ssKGNoYXIgKikmcmksIHNpemVvZihyaSkpICE9IDApIHsKKyAgICAgICAgZGVidWcoRjExMSwicHR5X3RyYXBfaGFuZGxlcigpIiwiaW9jdGwoVElPQ1JFUUNIRUNLKSBmYWlsZWQiLGVycm5vKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgc3dpdGNoIChyaS5yZXF1ZXN0KSB7CisgICAgICBjYXNlIFRJT0NPUEVOOgorICAgICAgICBkZWJ1ZyhGMTEwLCJwdHlfdHJhcF9oYW5kbGVyKCkiLCJhbiBvcGVuKCkgY2FsbCIsMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUSU9DQ0xPU0U6CisgICAgICAgIGRlYnVnKEYxMTAsInB0eV90cmFwX2hhbmRsZXIoKSIsImEgY2xvc2UoKSBjYWxsIiwwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBkZWJ1ZyhGMTEwLCJwdHlfdHJhcF9oYW5kbGVyKCkiLCJhbiBpb2N0bCgpIGNhbGwiLDApOworICAgICAgICByaS5lcnJub19lcnJvciA9IEVJTlZBTDsKKyAgICB9CisgICAgaWYgKGlvY3RsKGZkLCBUSU9DUkVRU0VULCAoY2hhciAqKSZyaSxzaXplb2YocmkpKSAhPSAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsInB0eV90cmFwX2hhbmRsZXIoKSIsImlvY3RsKFRJT0NSRVFTRVQpIGZhaWxlZCIsZXJybm8pOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICBpZiAocmkucmVxdWVzdCA9PSBUSU9DQ0xPU0UpCisgICAgICByZXR1cm4oMSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIEhBVkVfUFRZVFJBUCAqLworCitWT0lECitleGVjX2NtZChzKSBjaGFyICogczsgeworICAgIHN0cnVjdCBzdHJpbmdhcnJheSAqIHE7CisgICAgY2hhciAqKiBhcmdzID0gTlVMTDsKKworICAgIGlmICghcykgcmV0dXJuOworICAgIGlmICghKnMpIHJldHVybjsKKworICAgIHEgPSBja3NwbGl0KDEsMCxzLE5VTEwsIlxcJVtdJiQrLS89Kl5fQCF7fS88PnwuI34nYDo7PyIsNywwLDApOworICAgIGlmICghcSkgcmV0dXJuOworCisgICAgYXJncyA9IHEtPmFfaGVhZCArIDE7CisgICAgZXhlY3ZwKGFyZ3NbMF0sYXJncyk7Cit9CisKKy8qIEdldCBhIHB0eSwgc2NhbiBpbnB1dCBsaW5lcy4gKi8KKworaW50Citkb19wdHkoY21kKSBjaGFyICogY21kOyB7CisgICAgbG9uZyByZXR2YWw7CisgICAgaW50IHN5bmNwaXBlWzJdOworICAgIGludCBpOworI2lmZGVmIEhBVkVfUFRZVFJBUAorICAgIGludCB4OworI2VuZGlmIC8qIEhBVkVfUFRZVFJBUCAqLworCisgICAgbXNnID0gMDsJCQkJLyogTWVzc2FnZSBjb3VudGVyICovCisgICAgcHR5X2luaXQoKTsJCQkJLyogRmluZCBhbiBhdmFpbGFibGUgcHR5IHRvIHVzZS4gKi8KKyAgICBlcnJubyA9IDA7CisKKyAgICBpZiAoKHJldHZhbCA9IHB0eV9nZXRwdHkoJnR0eWZkLCBYbGluZSwgMjApKSAhPSAwKSB7CisJaWYgKG1zZysrID09IDApCisJICBwZXJyb3IoWGxpbmUpOworICAgICAgICBkZWJ1ZyhGMTExLCJkb19wdHkoKSIsInB0eV9nZXRwdHkoKSBmYWlscyIscmV0dmFsKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgZGVidWcoRjExMCwiZG9fcHR5KCkgWGxpbmUiLFhsaW5lLDApOworCisjaWZkZWYgU0lHVFRPVQorLyoKKyAgSWdub3JpbmcgU0lHVFRPVSBrZWVwcyB0aGUga2VybmVsIGZyb20gYmxvY2tpbmcgdXMuICB3ZSB0d2VhayB0aGUgdHR5IHdpdGgKKyAgYW4gaW9jdGwoKSAoaW4gdHRpb2N0KCkgaW4gL3N5cy90dHkuYyBpbiBhIEJTRCBrZXJuZWwpCisqLworICAgICBzaWduYWwoU0lHVFRPVSwgU0lHX0lHTik7CisjZW5kaWYgLyogU0lHVFRPVSAqLworCisvKiBTdGFydCB1cCB0aGUgY29tbWFuZCBvbiB0aGUgc2xhdmUgc2lkZSBvZiB0aGUgdGVybWluYWwgKi8KKworICAgIGlmIChwaXBlKHN5bmNwaXBlKSA8IDApIHsKKyAgICAgICAgZGVidWcoRjExMCwiZG9fcHR5KCkiLCJwaXBlKCkgZmFpbHMiLDApOworCXBlcnJvcigicGlwZSgpIGZhaWxlZCIpOworCW1zZysrOworICAgICAgICBkZWJ1ZyhGMTExLCJkb19wdHkoKSIsInBpcGUgZmFpbHMiLGVycm5vKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgaWYgKChpID0gZm9yaygpKSA8IDApIHsKKyAgICAgICAgLyogWFhYIC0gbmVlZCB0byBjbGVhbiB1cCB0aGUgYWxsb2NhdGVkIHB0eSAqLworICAgICAgICBwZXJyb3IoImZvcmsoKSBmYWlsZWQiKTsKKwltc2crKzsKKyAgICAgICAgZGVidWcoRjExMSwiZG9fcHR5KCkiLCJmb3JrIGZhaWxzIixlcnJubyk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGlmIChpKSB7ICAvKiBXYWl0IGZvciBjaGlsZCBiZWZvcmUgd3JpdGluZyB0byBwYXJlbnQgc2lkZSBvZiBwdHkuICovCisgICAgICAgIGNoYXIgYzsKKyNpZmRlZiBIQVZFX1BUWVRSQVAKKyAgICAgICAgaW50IG9uID0gMTsKKyNlbmRpZiAvKiBIQVZFX1BUWVRSQVAgKi8KKwljbG9zZShzeW5jcGlwZVsxXSk7CisJZXJybm8gPSAwOworICAgICAgICBpZiAocmVhZChzeW5jcGlwZVswXSwgJmMsIDEpID09IDApIHsgLyogU2xhdmUgc2lkZSBkaWVkICovCisJICAgIHBlcnJvcigiUGlwZSByZWFkKCkgZmFpbGVkIik7CisJICAgIG1zZysrOworICAgICAgICAgICAgZGVidWcoRjExMCwiZG9fcHR5KCkiLCJTbGF2ZSBmYWlscyB0byBpbml0aWFsaXplIiwwKTsKKyAgICAgICAgICAgIGNsb3NlKHN5bmNwaXBlWzBdKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIH0KKyAgICAgICAgcHR5X2ZvcmtfcGlkID0gaTsJCS8qIFNvIHdlIGNhbiBjbGVhbiBpdCB1cCBsYXRlciAqLworCWRlYnVnKEYxMDEsImRvX3B0eSBwdHlfZm9ya19waWQiLCIiLHB0eV9mb3JrX3BpZCk7CisjaWZkZWYgSEFWRV9QVFlUUkFQCisgICAgICAgIC8qIEhQVVggZG9lcyBub3QgYWxsb3cgdGhlIG1hc3RlciB0byByZWFkIGVuZCBvZiBmaWxlLiAgKi8KKyAgICAgICAgLyogVGhlcmVmb3JlLCB3ZSBtdXN0IGRldGVybWluZSB0aGF0IHRoZSBzbGF2ZSBoYXMgYmVlbiAqLworICAgICAgICAvKiBjbG9zZWQgYnkgdHJhcHBpbmcgdGhlIGNhbGwgdG8gY2xvc2UoKS4gICAgICAgICAgICAgICovCisJZXJybm8gPSAwOworCXggPSBpb2N0bCh0dHlmZCwgVElPQ1RSQVAsIChjaGFyICopJm9uKTsKKwlkZWJ1ZyhGMTExLCJkb19wdHkgaW9jdGwoVElPQ1RSQVApIixja2l0b2EoeCksZXJybm8pOworI2VuZGlmIC8qIEhBVkVfUFRZVFJBUCAqLworICAgICAgICBkZWJ1ZyhGMTExLCJkb19wdHkoKSIsInN5bmNocm9uaXplZCAtIHB0eV9mb3JrX3BpZCIscHR5X2ZvcmtfcGlkKTsKKyAgICAgICAgY2xvc2Uoc3luY3BpcGVbMF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlYnVnKEYxMTAsImRvX3B0eSgpIiwiU2xhdmUgc3RhcnRzIiwwKTsKKyAgICAgICAgaWYgKGdldHB0eXNsYXZlKCkgPT0gMCkgeworI2lmZGVmIFdBTlRfVVRNUAorICAgICAgICAgICAgcHR5X3VwZGF0ZV91dG1wKFBUWV9VU0VSX1BST0NFU1MsCisJCQkgICAgZ2V0cGlkKCksCisJCQkgICAgIktFUk1JVCIsCisJCQkgICAgWGxpbmUsCisJCQkgICAgY21kLAorCQkJICAgIFBUWV9UVFlTTE9UX1VTQUJMRQorCQkJICAgICk7CisjZW5kaWYgLyogV0FOVF9VVE1QICovCisgICAgICAgICAgICAvKiBOb3RpZnkgb3VyIHBhcmVudCB3ZSdyZSByZWFkeSB0byBjb250aW51ZS4qLworICAgICAgICAgICAgZGVidWcoRjExMCwiZG9fcHR5KCkiLCJzbGF2ZSBzeW5jaHJvbml6aW5nIiwwKTsKKyAgICAgICAgICAgIHdyaXRlKHN5bmNwaXBlWzFdLCJ5IiwxKTsKKyAgICAgICAgICAgIGNsb3NlKHN5bmNwaXBlWzBdKTsKKyAgICAgICAgICAgIGNsb3NlKHN5bmNwaXBlWzFdKTsKKworICAgICAgICAgICAgZXhlY19jbWQoY21kKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImRvX3B0eSgpIiwiZXhlY19jbWQoKSByZXR1cm5zIC0gd2h5PyIsZXJybm8pOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTAsImRvX3B0eSgpIiwiZ2V0cHR5c2xhdmUoKSBmYWlscyAtIGV4aXRpbmciLDApOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9IC8qIGVuZCBvZiBkb19wdHkoKSAqLworCisKK1ZPSUQKK2VuZF9wdHkoKSB7CisgICAgbXNnID0gMDsJCQkJLyogTWVzc2FnZSBjb3VudGVyICovCisgICAgaWYgKFhsaW5lWzBdICYmIHB0eV9mb3JrX3BpZCA+PSAwKSB7CisgICAgICAgIHB0eV9jbGVhbnVwKFhsaW5lLHB0eV9mb3JrX3BpZCwxKTsKKyAgICAgICAgWGxpbmVbMF0gPSAnXDAnOworICAgICAgICBwdHlfZm9ya19waWQgPSAtMTsKKyAgICB9Cit9CisjZW5kaWYgLyogTkVUUFRZICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2t1cHR5LmggYi9ja2VybWl0LTguMC4yMTEvY2t1cHR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0OWJlYwotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja3VwdHkuaApAQCAtMCwwICsxLDE3NCBAQAorLyogQyBLIFUgUCBUIFkgLiBIICAtLSAgSW5jbHVkZXMgYW5kIGRlZmluaXRpb25zIGZvciBja3VwdHkuYyAgKi8KKworLyoKKyAgQ29weXJpZ2h0IDE5OTUgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kuCisKKyAgTW9kaWZpZWQgZm9yIHVzZSBpbiBDLUtlcm1pdCBieToKKworICBKZWZmcmV5IEUgQWx0bWFuIDxqYWx0bWFuQHNlY3VyZS1lbmRwb2ludHMuY29tPgorICAgIFNlY3VyZSBFbmRwb2ludHMgSW5jLiwgTmV3IFlvcmsgQ2l0eQorICBOb3ZlbWJlciAxOTk5CisqLworI2lmbmRlZiBfX1BUWV9JTlRfSF9fCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qICNkZWZpbmUgV0FOVF9VVE1QICovCisvKiBXZSBkb24ndCB3YW50IGFsbCB0aGUgdXRtcC93dG1wIHN0dWZmICovCisKKyNpZmRlZiBXQU5UX1VUTVAKKyNpZmRlZiBIQVZFX1VUTVBfSAorI2luY2x1ZGUgPHV0bXAuaD4KKyNlbmRpZiAvKiBIQVZFX1VUTVBfSCAqLworI2lmZGVmIEhBVkVfVVRNUFhfSAorI2luY2x1ZGUgPHV0bXB4Lmg+CisjZW5kaWYgLyogSEFWRV9VVE1QWF9IICovCisjZW5kaWYgLyogV0FOVF9VVE1QICovCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYgLyogSEFWRV9VTklTVERfSCAqLworI2lmZGVmIF9fU0NPX18KKyNpbmNsdWRlIDxzeXMvdW5pc3RkLmg+CisjZW5kaWYgLyogX19TQ09fXyAqLworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZiAvKiBIQVZFX1NURExJQl9IICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHB3ZC5oPgorCisjaWZkZWYgSEFWRV9TWVNfTEFCRUxfSAorLyogb25seSBTdW5PUyA0PyAqLworI2luY2x1ZGUgPHN5cy9sYWJlbC5oPgorI2luY2x1ZGUgPHN5cy9hdWRpdC5oPgorI2luY2x1ZGUgPHB3ZGFkai5oPgorI2VuZGlmIC8qIEhBVkVfU1lTX0xBQkVMX0ggKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaWZkZWYgSFBVWAorI2luY2x1ZGUgPHN5cy9wdHlpby5oPgorI2VuZGlmIC8qIEhQVVggKi8KKyNpZmRlZiBzeXN2aW1wCisjaW5jbHVkZSA8Y29tcGF0Lmg+CisjZW5kaWYgLyogc3lzdmltcCAqLworCisjaWZkZWYgQ09NTUVOVAorLyogSSBkb24ndCB0aGluayB3ZSBhY3R1YWxseSB1c2UgdGhpcyBmb3IgYW55dGhpbmcgKi8KKy8qIGFuZCBpdCBraWxscyBTbGFja3dhcmUgYnVpbGRzLCB3aGVyZSB0aGVyZSBpcyBubyBzZWxlY3QuaC4gKi8KKyNpZm5kZWYgTk9fU1lTX1NFTEVDVF9ICisjaWZkZWYgSEFWRV9TWVNfU0VMRUNUX0gKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYgLyogSEFWRV9TWVNfU0VMRUNUX0ggKi8KKyNlbmRpZiAvKiBOT19TWVNfU0VMRUNUX0ggKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBIQVZFX1NUUkVBTVMKKyNpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CisjaW5jbHVkZSA8c3lzL3N0cm9wdHMuaD4KKyNlbmRpZiAvKiBIQVZFX1NUUkVBTVMgKi8KKworI2lmZGVmIFBPU0lYX1RFUk1JT1MKKyNpZm5kZWYgdWx0cml4CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzZ3R0eS5oPgorI2VuZGlmIC8qIHVsdHJpeCAqLworI2Vsc2UgLyogUE9TSVhfVEVSTUlPUyAqLworI2luY2x1ZGUgPHNndHR5Lmg+CisjZW5kaWYgLyogUE9TSVhfVEVSTUlPUyAqLworCisjaW5jbHVkZSA8bmV0ZGIuaD4KKy8qICNpbmNsdWRlIDxzeXNsb2cuaD4gKi8KKyNpZm5kZWYgdWx0cml4CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYgLyogdWx0cml4ICovCisvKiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+ICovCQkvKiAobm93IGRvbmUgaW4gY2tjZGViLmgpICovCisKKyNpZmRlZiBIQVZFX1NUUkVBTVMKKy8qIGtybG9naW4gZG9lc24ndCB0ZXN0IHN5cy90dHkuLi4gKi8KKyNpZmRlZiBIQVZFX1NZU19UVFlfSAorI2luY2x1ZGUgPHN5cy90dHkuaD4KKyNlbmRpZiAvKiBIQVZFX1NZU19UVFlfSCAqLworCisjaWZkZWYgSEFWRV9TWVNfUFRZVkFSX0gKKy8qIFNvbGFyaXMgYWN0dWFsbHkgdXNlcyBwYWNrZXQgbW9kZSwgc28gdGhlIHJlYWwgbWFjcm9zIGFyZSBuZWVkZWQgdG9vICovCisjaW5jbHVkZSA8c3lzL3B0eXZhci5oPgorI2VuZGlmIC8qIEhBVkVfU1lTX1BUWVZBUl9IICovCisjZW5kaWYgLyogSEFWRV9TVFJFQU1TICovCisKKyNpZmRlZiBIQVZFX1ZIQU5HVVAKKyNpZm5kZWYgT1BFTl9DVFRZX09OTFlfT05DRQorLyoKKyAgQnJlYWtzIHVuZGVyIFVsdHJpeCBhbmQgb3RoZXJzIHdoZXJlIHlvdSBjYW5ub3QgZ2V0IGNvbnRyb2xsaW5nCisgIHRlcm1pbmFsIHR3aWNlLgorKi8KKyNkZWZpbmUgVkhBTkdfZmlyc3QKKyNkZWZpbmUgVkhBTkdfTEFTVAorI2VuZGlmIC8qIE9QRU5fQ1RUWV9PTkxZX09OQ0UgKi8KKyNlbmRpZiAvKiBIQVZFX1ZIQU5HVVAgKi8KKworLyogSW50ZXJuYWwgZnVuY3Rpb25zICovCitfUFJPVE9UWVAobG9uZyBwdHlpbnRfdm9pZF9hc3NvY2lhdGlvbiwodm9pZCkpOworX1BST1RPVFlQKGxvbmcgcHR5aW50X29wZW5fY3R0eSAsKGNoYXIgKiwgaW50ICopKTsKK19QUk9UT1RZUChWT0lEIHB0eWludF92aGFuZ3VwLCAodm9pZCkpOworCisjaWZkZWYgV0FOVF9VVE1QCitfUFJPVE9UWVAobG9uZyBwdHlpbnRfdXBkYXRlX3d0bXAsIChzdHJ1Y3QgdXRtcCAqLCBjaGFyICosIGNoYXIgKikpOworI2VuZGlmIC8qIFdBTlRfVVRNUCAqLworCisjZGVmaW5lIF9fUFRZX0lOVF9IX18KKyNlbmRpZiAvKiBfX1BUWV9JTlRfSF9fICovCisKKyNpZm5kZWYgX19MSUJQVFlfSF9fCisKKyNpZmRlZiBXQU5UX1VUTVAKKy8qIENvbnN0YW50cyBmb3IgcHR5X3VwZGF0ZV91dG1wICovCisjZGVmaW5lIFBUWV9MT0dJTl9QUk9DRVNTIDAKKyNkZWZpbmUgUFRZX1VTRVJfUFJPQ0VTUyAxCisjZGVmaW5lIFBUWV9ERUFEX1BST0NFU1MgMgorI2RlZmluZSBQVFlfVFRZU0xPVF9VU0FCTEUgKDB4MSkJLyogZmxhZ3MgdG8gdXBkYXRlX3V0bXAqLworI2RlZmluZSBQVFlfVVRNUF9VU0VSTkFNRV9WQUxJRCAoMHgyKQorI2VuZGlmIC8qIFdBTlRfVVRNUCAqLworCitfUFJPVE9UWVAobG9uZyBwdHlfaW5pdCwodm9pZCkpOworX1BST1RPVFlQKGxvbmcgcHR5X2dldHB0eSwgKCBpbnQgKiwgY2hhciAqLCBpbnQpKTsKK19QUk9UT1RZUChsb25nIHB0eV9vcGVuX3NsYXZlLCAoY2hhciAqLCBpbnQgKikpOworX1BST1RPVFlQKGxvbmcgcHR5X29wZW5fY3R0eSwgKGNoYXIgKiwgaW50ICopKTsKK19QUk9UT1RZUChsb25nIHB0eV9pbml0aWFsaXplX3NsYXZlLCAoaW50KSk7CisjaWZkZWYgV0FOVF9VVE1QCitfUFJPVE9UWVAobG9uZyBwdHlfdXBkYXRlX3V0bXAsIChpbnQsIGludCwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50KSk7CitfUFJPVE9UWVAobG9uZyBwdHlfbG9nd3RtcCwgKGNoYXIgKiwgY2hhciAqLCBjaGFyICopKTsKKyNlbmRpZiAvKiBXQU5UX1VUTVAgKi8KK19QUk9UT1RZUChsb25nIHB0eV9jbGVhbnVwLCAoY2hhciAqLCBpbnQsIGludCkpOworCisjZGVmaW5lIFBUWV9HRVRQVFlfU1RSRUFNUyAgICAgICAgICAgICAgICg0NDgwNjkxMkwpCisjZGVmaW5lIFBUWV9HRVRQVFlfRlNUQVQgICAgICAgICAgICAgICAgICg0NDgwNjkxM0wpCisjZGVmaW5lIFBUWV9HRVRQVFlfTk9QVFkgICAgICAgICAgICAgICAgICg0NDgwNjkxNEwpCisjZGVmaW5lIFBUWV9HRVRQVFlfU0xBVkVfVE9PTE9ORyAgICAgICAgICg0NDgwNjkxNUwpCisjZGVmaW5lIFBUWV9PUEVOX1NMQVZFX09QRU5GQUlMICAgICAgICAgICg0NDgwNjkxNkwpCisjZGVmaW5lIFBUWV9PUEVOX1NMQVZFX0NITU9ERkFJTCAgICAgICAgICg0NDgwNjkxN0wpCisjZGVmaW5lIFBUWV9PUEVOX1NMQVZFX05PQ1RUWSAgICAgICAgICAgICg0NDgwNjkxOEwpCisjZGVmaW5lIFBUWV9PUEVOX1NMQVZFX0NIT1dORkFJTCAgICAgICAgICg0NDgwNjkxOUwpCisjZGVmaW5lIFBUWV9PUEVOX1NMQVZFX0xJTkVfUFVTSEZBSUwgICAgICg0NDgwNjkyMEwpCisjZGVmaW5lIFBUWV9PUEVOX1NMQVZFX1BVU0hfRkFJTCAgICAgICAgICg0NDgwNjkyMUwpCisjZGVmaW5lIFBUWV9PUEVOX1NMQVZFX1JFVk9LRUZBSUwgICAgICAgICg0NDgwNjkyMkwpCisjaWZkZWYgV0FOVF9VVE1QCisjZGVmaW5lIFBUWV9VUERBVEVfVVRNUF9QUk9DVFlQRV9JTlZBTElEICg0NDgwNjkyM0wpCisjZW5kaWYgLyogV0FOVF9VVE1QICovCisjZGVmaW5lIFBUWV9PUEVOX1NMQVZFX1RPT1NIT1JUICAgICAgICAgICg0NDgwNjkyNEwpCisjZGVmaW5lIEVSUk9SX1RBQkxFX0JBU0VfcHR5ICAgICAgICAgICAgICg0NDgwNjkxMkwpCisKK2V4dGVybiBzdHJ1Y3QgZXJyb3JfdGFibGUgZXRfcHR5X2Vycm9yX3RhYmxlOworCisjZGVmaW5lIF9fTElCUFRZX0hfXworI2VuZGlmIC8qIF9fTElCUFRZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdXNjci5jIGIvY2tlcm1pdC04LjAuMjExL2NrdXNjci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZDJmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2t1c2NyLmMKQEAgLTAsMCArMSw2ODggQEAKKyNpbmNsdWRlICJja2NzeW0uaCIKKworI2lmbmRlZiBOT0lDUAorI2lmbmRlZiBOT1NDUklQVAorY2hhciAqbG9naW52ID0gIlNjcmlwdCBDb21tYW5kLCA4LjAuMDMyLCAyMCBEZWMgMjAwMSI7CisKKy8qICBDIEsgVSBTIEMgUiAgLS0gIGV4cGVjdC1zZW5kIHNjcmlwdCBpbXBsZW1lbnRhdGlvbiAgKi8KKworLyoKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKworICBPcmlnaW5hbCAodmVyc2lvbiAxLCAxOTg1KSBhdXRob3I6IEhlcm0gRmlzY2hlciwgRW5jaW5vLCBDQS4KKyAgQ29udHJpYnV0ZWQgdG8gQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiAxOTg1IGZvciBpbmNsdXNpb24gaW4gQy1LZXJtaXQgNC4wLgorICBNYWludGFpbmVkIHNpbmNlIDE5ODUgYnkgRnJhbmsgZGEgQ3J1eiwgQ29sdW1iaWEgVW5pdmVyc2l0eSwKKyAgZmRjQGNvbHVtYmlhLmVkdS4KKworICBUaGUgbW9kdWxlIHRha2VzIGEgVVVDUC1zdHlsZSBzY3JpcHQgb2YgdGhlICJleHBlY3Qgc2VuZCBbZXhwZWN0IHNlbmRdIC4uLiIKKyAgZm9ybWF0LiAgSXQgaXMgaW50ZW5kZWQgdG8gb3BlcmF0ZSBzaW1pbGFybHkgdG8gdGhlIHdheSB0aGUgY29tbW9uCisgIFVVQ1AgTC5zeXMgbG9naW4gZW50cmllcyB3b3JrLiAgQ29uZGl0aW9uYWwgcmVzcG9uc2VzIGFyZSBzdXBwb3J0ZWQ6CisgIGV4cGVjdFstc2VuZC1leHBlY3RbLi4uXV0sIGFzIHdpdGggVVVDUC4gIFRoZSBzZW5kIGtleXdvcmQgRU9UIHNlbmRzIGEKKyAgQ29udHJvbC1kLCBhbmQgdGhlIGtleXdvcmQgQlJFQUsgc2VuZHMgYSBicmVhay4gIExldHRlcnMgcHJlZml4ZWQKKyAgYnkgJ34nIGFyZSAnfmInIGJhY2tzcGFjZSwgJ35zJyBzcGFjZSwgJ35uJyBsaW5lZmVlZCwgJ35yJyByZXR1cm4sICd+eCcgeG9uLAorICAnfnQnIHRhYiwgJ35xJyA/IChub3QgYWxsb3dlZCBvbiBrZXJtaXQgY29tbWFuZCBsaW5lcyksICd+JyB+LCAnficnLAorICAnfiInLCAnfmMnIGRvbid0IGFwcGVuZCByZXR1cm4sICd+b1tvW29dXScgb2N0YWwgY2hhcmFjdGVyLiAgQXMgd2l0aAorICBzb21lIHV1Y3Agc3lzdGVtcywgc2VudCBzdHJpbmdzIGFyZSBmb2xsb3dlZCBieSB+ciAobm90IH5uKSB1bmxlc3MgdGhleQorICBlbmQgd2l0aCB+Yy4gTnVsbCBleHBlY3Qgc3RyaW5ncyAoZS5nLiwgfjAgb3IgLS0pIGNhdXNlIGEgc2hvcnQKKyAgZGVsYXksIGFuZCBhcmUgdXNlZnVsIGZvciBzZW5kaW5nIHNlcXVlbmNlcyByZXF1aXJpbmcgc2xpZ2h0IHBhdXNlcy4KKworICBUaGlzIG1vZHVsZSBjYWxscyBleHRlcm5hbGx5IGRlZmluZWQgc3lzdGVtLWRlcGVuZGVudCBmdW5jdGlvbnMgZm9yCisgIGNvbW11bmljYXRpb25zIGkvbywgYXMgZGVmaW5lZCBpbiBja2NwbG0udHh0LCB0aGUgQy1LZXJtaXQgUHJvZ3JhbSBMb2dpYworICBNYW51YWwsIGFuZCB0aHVzIHNob3VsZCBiZSBwb3J0YWJsZSB0byBhbGwgc3lzdGVtcyB0aGF0IGltcGxlbWVudCB0aG9zZQorICBmdW5jdGlvbnMsIGFuZCB3aGVyZSBhbGFybSgpIGFuZCBzaWduYWwoKSB3b3JrIGFzIHRoZXkgZG8gaW4gVU5JWC4KKyovCisjaW5jbHVkZSAiY2tjZGViLmgiCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgTlQKKyNpbmNsdWRlIDxzZXRqbXBleC5oPgorI2Vsc2UgLyogTlQgKi8KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNlbmRpZiAvKiBOVCAqLworI2luY2x1ZGUgImNrY2FzYy5oIgorI2luY2x1ZGUgImNrY2tlci5oIgorI2luY2x1ZGUgImNrdXVzci5oIgorI2luY2x1ZGUgImNrY25ldC5oIgorI2luY2x1ZGUgImNrY3NpZy5oIgorCitfUFJPVE9UWVAoIFZPSUQgZmx1c2hpLCAodm9pZCkgKTsKK19QUk9UT1RZUCggc3RhdGljIFZPSUQgbXlmbHNoLCAodm9pZCkgKTsKK19QUk9UT1RZUCggc3RhdGljIGludCBzZXF1ZW5jLCAodm9pZCkgKTsKK19QUk9UT1RZUCggc3RhdGljIFZPSUQgcmVjdnNlcSwgKHZvaWQpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBpbnQgb3V0c2VxLCAodm9pZCkgKTsKKworI2lmZGVmIE1BQworI2RlZmluZSBzaWduYWwgbXNpZ25hbAorI2RlZmluZSBTSUdUWVAgbG9uZworI2RlZmluZSBhbGFybSBtYWxhcm0KKyNkZWZpbmUgU0lHX0lHTiAwCisjZGVmaW5lIFNJR0FMUk0gMQorI2RlZmluZSBTSUdJTlQgIDIKK1NJR1RZUCAoKm1zaWduYWwoaW50IHR5cGUsIFNJR1RZUCAoKmZ1bmMpKGludCkpKShpbnQpOworI2VuZGlmIC8qIE1BQyAqLworCisjaWZkZWYgQU1JR0EKKyNkZWZpbmUgc2lnbmFsIGFzaWduYWwKKyNkZWZpbmUgYWxhcm0gYWFsYXJtCisjZGVmaW5lIFNJR0FMUk0gKF9OVU1TSUcrMSkKKyNkZWZpbmUgU0lHVFlQIHZvaWQKK1NJR1RZUCAoKmFzaWduYWwoaW50IHR5cGUsIFNJR1RZUCAoKmZ1bmMpKGludCkpKShpbnQpOwordW5zaWduZWQgYWFsYXJtKHVuc2lnbmVkKTsKKyNlbmRpZiAvKiBBTUlHQSAqLworCisjaWZkZWYgU1RSQVRVUworLyogVk9TIGRvZXNuJ3QgaGF2ZSBhbGFybSgpLCBidXQgaXQgZG9lcyBoYXZlIHNvbWUgdGhpbmdzIHdlIGNhbiB3b3JrIHdpdGguICovCisvKiBob3dldmVyLCB3ZSBoYXZlIHRvIGNhdGNoIGFsbCB0aGUgc2lnbmFscyBpbiBvbmUgcGxhY2UgdG8gZG8gdGhpcywgc28gICAgKi8KKy8qIHdlIGludGVyY2VwdCB0aGUgc2lnbmFsKCkgcm91dGluZSBhbmQgY2FsbCBpdCBmcm9tIG91ciBvd24gcmVwbGFjZW1lbnQuICAqLworI2RlZmluZSBzaWduYWwgdnNpZ25hbAorI2RlZmluZSBhbGFybSB2YWxhcm0KK1NJR1RZUCAoKnZzaWduYWwoaW50IHR5cGUsIFNJR1RZUCAoKmZ1bmMpKGludCkpKShpbnQpOworaW50IHZhbGFybShpbnQgaW50ZXJ2YWwpOworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKworZXh0ZXJuIGludCBzZXNzZnQ7CitleHRlcm4gaW50IGxvY2FsLCBmbG93LCBzZXNsb2csIG1kbXR5cCwgbXNnZmxnLCBkdXBsZXgsIGJhY2tncmQsIHNlY2hvLCBxdWlldDsKK2V4dGVybiBpbnQgbmV0d29yaywgbmV0dHlwZSwgdHRucHJvdG87CitleHRlcm4gbG9uZyBzcGVlZDsKK2V4dGVybiBjaGFyIHR0bmFtZVtdOworCisjaWZkZWYgTlRTSUcKK2V4dGVybiBpbnQgVGxzSW5kZXg7CisjZW5kaWYgLyogTlRTSUcgKi8KKyNpZmRlZiBJS1NECitleHRlcm4gaW50IGluc2VydmVyOworI2VuZGlmIC8qIElLU0QgKi8KKworc3RhdGljIGludCBpc190biA9IDA7CQkJLyogRG8gVGVsbmV0IG5lZ290aWF0aW9ucyAqLworCisjaWZuZGVmIE5PU1BMCisjaWZkZWYgRENNREJVRgorZXh0ZXJuIHN0cnVjdCBjbWRwdHIgKmNtZHN0azsKKyNlbHNlCitleHRlcm4gc3RydWN0IGNtZHB0ciBjbWRzdGtbXTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCitleHRlcm4gaW50IHRlY2hvLCBjbWRsdmw7CitleHRlcm4gaW50IG1lY2hvOworI2VuZGlmIC8qIE5PU1BMICovCisKK3N0YXRpYyBpbnQgc2NyX2VjaG87CQkJLyogV2hldGhlciB0byBlY2hvIHNjcmlwdCBjb21tYW5kcyAqLworCitzdGF0aWMgaW50IGV4cF9hbHJtID0gMTU7CQkvKiBUaW1lIHRvIHdhaXQgZm9yIGV4cGVjdCBzdHJpbmcgKi8KKyNkZWZpbmUgU05EX0FMUk0gMTUJCQkvKiBUaW1lIHRvIGFsbG93IGZvciBzZW5kaW5nIHN0cmluZyAqLworI2RlZmluZSBOVUxMX0VYUCAyCQkJLyogVGltZSB0byBwYXVzZSBvbiBudWxsIGV4cGVjdCBzdHJnKi8KKyNkZWZpbmUgREVMX01TRUMgMzAwCQkJLyogTWlsbGlzZWNvbmRzIHRvIHBhdXNlIG9uIH5kICovCisKKyNkZWZpbmUgU0JVRkwgNTEyCitzdGF0aWMgY2hhciBzZXFfYnVmW1NCVUZMKzJdLCAqczsJLyogZXhwZWN0LXNlbmQgc2VxdWVuY2UgYnVmZmVyICovCitzdGF0aWMgaW50IGdvdF9pdCwgbm9fY3I7CisKKy8qICBDb25uZWN0IHN0YXRlIHBhcmVudC9jaGlsZCBjb21tdW5pY2F0aW9uIHNpZ25hbCBoYW5kbGVycyAqLworCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIENLX1BPU0lYX1NJRworc3RhdGljIHNpZ2ptcF9idWYgYWxybXJuZzsKKyNlbHNlCitzdGF0aWMgam1wX2J1ZiBhbHJtcm5nOworI2VuZGlmIC8qIENLX1BPU0lYX1NJRyAqLworI2Vsc2UKK3N0YXRpYyBja2ptcGJ1ZiBhbHJtcm5nOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworc3RhdGljIFNJR1RZUAorI2lmZGVmIENLX0FOU0lDCitzY3J0aW1lKGludCBmb28pCQkJLyogbW9kZW0gcmVhZCBmYWlsdXJlIGhhbmRsZXIsICovCisjZWxzZQorc2NydGltZShmb28pIGludCBmb287CQkJLyogQWxhcm0gaGFuZGxlciAqLworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBzY3J0aW1lICovIHsKKworI2lmZGVmIEJFQk9YCisjaWZkZWYgQkVfRFJfNworICAgIGFsYXJtX2V4cGlyZWQoKTsKKyNlbmRpZiAvKiBCRV9EUl83ICovCisjZW5kaWYgLyogQkVCT1ggKi8KKyNpZmRlZiBOVFNJRworICAgIGlmIChmb28gPT0gU0lHQUxSTSkKKyAgICAgIFBvc3RBbGFybVNpZ1NlbSgpOworICAgIGVsc2UKKyAgICAgIFBvc3RDdHJsQ1NlbSgpOworI2Vsc2UgLyogTlRTSUcgKi8KKyNpZmRlZiBOVAorICAgIGNrbG9uZ2ptcChja2phZGRyKGFscm1ybmcpLDEpOworI2Vsc2UgLyogTlQgKi8KKyAgICBja2xvbmdqbXAoYWxybXJuZywxKTsKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIE5UU0lHICovCisgICAgU0lHUkVUVVJOOworfQorCisvKgorIFNlcXVlbmNlIGludGVycHJldGVyIC0tIHBpY2sgdXAgbmV4dCBzZXF1ZW5jZSBmcm9tIGNvbW1hbmQgc3RyaW5nLAorIGRlY29kZSBlc2NhcGVzIGFuZCBwbGFjZSBpbnRvIHNlcV9idWYuCisKKyBJZiBzdHJpbmcgY29udGFpbnMgYSB+ZCAoZGVsYXkpIHRoZW4gc2VxdWVuYygpIHJldHVybnMgYSAxIGV4cGVjdGluZworIHRvIGJlIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgfmQgZXhlY3V0ZXMuCisqLworc3RhdGljIGludAorc2VxdWVuYygpIHsKKyAgICBpbnQgaTsKKyAgICBjaGFyIGMsIG9jdF9jaGFyOworCisgICAgbm9fY3IgPSAwOwkJCQkvKiBvdXRwdXQgbmVlZHMgY3IgYXBwZW5kZWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgU0JVRkw7ICkgeworCWlmICgqcyA9PSAnXDAnIHx8ICpzID09ICctJyB8fCBpc3NwYWNlKCpzKSApIHsgLyogZG9uZSAqLworCSAgICBzZXFfYnVmW2ldID0gJ1wwJzsKKwkgICAgcmV0dXJuKDApIDsKKwl9CisJaWYgKCpzID09ICd+JykgewkJLyogZXNjYXBlIGNoYXJhY3RlciAqLworCSAgICBzKys7CisJICAgIHN3aXRjaCAoYyA9ICpzKSB7CisJCWNhc2UgJ24nOiAgc2VxX2J1ZltpKytdID0gTEY7IGJyZWFrOworCQljYXNlICdyJzogIHNlcV9idWZbaSsrXSA9IENSOyBicmVhazsKKwkJY2FzZSAndCc6ICBzZXFfYnVmW2krK10gPSAnXHQnOyBicmVhazsKKwkJY2FzZSAnYic6ICBzZXFfYnVmW2krK10gPSAnXGInOyBicmVhazsKKwkJY2FzZSAncSc6ICBzZXFfYnVmW2krK10gPSAnPyc7ICBicmVhazsKKyNpZmRlZiBDT01NRU5UCisvKiBUaGUgZGVmYXVsdCBjYXNlIHNob3VsZCBjYXRjaCB0aGVzZSBub3cuLi4gKi8KKwkJY2FzZSAnfic6ICBzZXFfYnVmW2krK10gPSAnfic7ICBicmVhazsKKwkJY2FzZSAnLSc6ICBzZXFfYnVmW2krK10gPSAnLSc7ICBicmVhazsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJCWNhc2UgJ1wnJzogc2VxX2J1ZltpKytdID0gJ1wnJzsgYnJlYWs7CisJCWNhc2UgJ1wiJzogc2VxX2J1ZltpKytdID0gJ1wiJzsgYnJlYWs7CisJCWNhc2UgJ3MnOiAgc2VxX2J1ZltpKytdID0gJyAnOyAgYnJlYWs7CisJCWNhc2UgJ3gnOiAgc2VxX2J1ZltpKytdID0gJ1wwMjEnOyBicmVhazsKKwkJY2FzZSAnYyc6ICBub19jciA9IDE7IGJyZWFrOworCQljYXNlICdkJzogewkJCS8qIHNlbmQgd2hhdCB3ZSBoYXZlICYgdGhlbiAqLworCQkgICAgc2VxX2J1ZltpXSA9ICdcMCc7CQkvKiBleHBlY3QgdG8gc2VuZCByZXN0IGFmdGVyICovCisJCSAgICBub19jciA9IDE7CQkJLyogc2VuZGVyIGRlbGF5cyBhIGxpdHRsZSAqLworCQkgICAgcysrOworCQkgICAgcmV0dXJuKDEpOworCQl9CisJCWNhc2UgJ3cnOiB7CQkJLyogd2FpdCBjb3VudCAqLworCQkgICAgZXhwX2Fscm0gPSAxNTsJCS8qIGRlZmF1bHQgdG8gMTUgc2VjICovCisJCSAgICBpZiAoaXNkaWdpdCgqKHMrMSkpKSB7CisJCQlzKys7CisJCQlleHBfYWxybSA9ICpzICYgMTU7CisJCQlpZiAoaXNkaWdpdCgqKHMrMSkpICkgeworCQkJICAgIHMrKzsKKwkJCSAgICBleHBfYWxybSA9IGV4cF9hbHJtICogMTAgKyAoKnMgJiAxNSk7CisJCQl9CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkgICAgaWYgKCBpc2RpZ2l0KGMpICkgewkgICAgCS8qIG9jdGFsIGNoYXJhY3RlciAqLworCQkgICAgCW9jdF9jaGFyID0gKGNoYXIpIChjICYgNyk7IC8qIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXQgKi8KKwkJCWlmIChpc2RpZ2l0KCAqKHMrMSkgKSApIHsKKwkJCSAgICBzKys7CisJCQkgICAgb2N0X2NoYXIgPSAoY2hhcikgKChvY3RfY2hhcjw8MykgfCAoICpzICYgNyApKTsKKwkJCSAgICBpZiAoaXNkaWdpdCggKihzKzEpICkgKSB7CisJCQkJcysrOworCQkJICAgIAlvY3RfY2hhciA9IChjaGFyKSAoKG9jdF9jaGFyPDwzKSB8ICggKnMgJiA3ICkpOworCQkJICAgIH0KKwkJCX0KKwkJCXNlcV9idWZbaSsrXSA9IG9jdF9jaGFyOworCQkJYnJlYWs7CisJCSAgICB9IGVsc2Ugc2VxX2J1ZltpKytdID0gKnM7IC8qIFRyZWF0IH4gYXMgcXVvdGUgKi8KKwkgICAgICB9CisJfSBlbHNlIHNlcV9idWZbaSsrXSA9ICpzOwkvKiBQbGFpbiBvbGQgY2hhcmFjdGVyICovCisJcysrOworICAgIH0KKyAgICBzZXFfYnVmW2ldID0gJ1wwJzsKKyAgICByZXR1cm4oMCk7CQkJCS8qIGVuZCBvZiBzcGFjZSwgcmV0dXJuIGFueXdheSAqLworfQorCisKKy8qIE91dHB1dCBidWZmZXJpbmcgZm9yICJyZWN2c2VxIiBhbmQgImZsdXNoaSIgKi8KKworI2RlZmluZQlNQVhCVVJTVCAyNTYJCS8qIG1heGltdW0gc2l6ZSBvZiBpbnB1dCBidXJzdCAqLworc3RhdGljIENIQVIgY29uYnVmW01BWEJVUlNUXTsJLyogYnVmZmVyIHRvIGhvbGQgb3V0cHV0IGZvciBjb25zb2xlICovCitzdGF0aWMgaW50IGNvbmNudCA9IDA7CQkvKiBudW1iZXIgb2YgY2hhcmFjdGVycyBidWZmZXJlZCAqLworc3RhdGljIENIQVIgc2VzYnVmW01BWEJVUlNUXTsJLyogYnVmZmVyIHRvIGhvbGQgb3V0cHV0IGZvciBzZXNzaW9uIGxvZyAqLworc3RhdGljIGludCBzZXNjbnQgPSAwOwkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgYnVmZmVyZWQgKi8KKworc3RhdGljIFZPSUQKK215ZmxzaCgpIHsKKyAgICBpZiAoY29uY250ID4gMCkgeworCWNvbnhvKGNvbmNudCwgKGNoYXIgKikgY29uYnVmKTsKKwljb25jbnQgPSAwOworICAgIH0KKyAgICBpZiAoc2VzY250ID4gMCkgeworICAgICAgICBsb2dzdHIoKGNoYXIgKikgc2VzYnVmLCBzZXNjbnQpOworCXNlc2NudCA9IDA7CisgICAgfQorfQorCisvKiB0aGVzZSB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gcGFzcyBkYXRhIGJldHdlZW4gdGhlIHJlY3ZzZXEoKSAqLworLyogYW5kIHRoZSBkb3JzZXEoKS4gIFRoZXkgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlIGluIHNvbWUgdmVyc2lvbnMgKi8KKy8qIGRvcnNlcSgpIGlzIGV4ZWN1dGVkIGluIGEgc2VwYXJhdGUgdGhyZWFkIGFuZCBkYXRhIGNhbm5vdCBiZSAqLworLyogcGFzc2VkIGJ5IHBhcmFtZXRlci4gKi8KKworc3RhdGljIGNoYXIgKnJzZXFlLCAqIHJzZXFnb3QsICogcnNlcXRyYWNlIDsKK3N0YXRpYyBpbnQgcnNlcWw7CisKK3N0YXRpYyBTSUdUWVAKKyNpZmRlZiBDS19BTlNJQworZG9yc2VxKHZvaWQgKiB0aHJlYWRpbmZvKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2RvcnNlcSh0aHJlYWRpbmZvKSBWT0lEICogdGhyZWFkaW5mbzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogZG9yc2VxICovIHsKKyAgICBpbnQgaSwgeDsKKyAgICBpbnQgYnVyc3QgPSAwOwkJCS8qIGNoYXJzIHJlbWFpbmluZyBpbiBpbnB1dCBidXJzdCAqLworCisjaWZkZWYgTlRTSUcKKyAgICBzZXRpbnQoKTsKKyAgICBpZiAodGhyZWFkaW5mbykgewkJCS8qIFRocmVhZCBsb2NhbCBzdG9yYWdlLi4uICovCisJVGxzU2V0VmFsdWUoVGxzSW5kZXgsdGhyZWFkaW5mbyk7CisgICAgfQorI2VuZGlmIC8qIE5UU0lHICovCisjaWZkZWYgQ0tfTE9HSU4KKyNpZmRlZiBOVAorI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpCisgICAgICBzZXRudGNyZWRzKCk7CisjZW5kaWYgLyogSUtTRCAqLworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKworICAgIHdoaWxlICghZ290X2l0KSB7CisJZm9yIChpID0gMDsgaSA8IHJzZXFsLTE7IGkrKykgcnNlcWdvdFtpXSA9IHJzZXFnb3RbaSsxXTsKKwl4ID0gdHRpbmMoMCk7CQkJLyogUmVhZCBhIGNoYXJhY3RlciAqLworCWRlYnVnKEYxMDEsInJlY3ZzZXEiLCIiLHgpOworCWlmICh4IDwgMCkgeworI2lmZGVmIE5UU0lHCisJICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisJICAgIFNJR1JFVFVSTjsJCQkvKiBDaGVjayBmb3IgZXJyb3IgKi8KKwl9CisjaWZkZWYgTkVUQ09OTgorI2lmZGVmIFROQ09ERQorLyogQ2hlY2sgZm9yIHRlbG5ldCBwcm90b2NvbCBuZWdvdGlhdGlvbiAqLworCWlmICgoKHggJiAweGZmKSA9PSBJQUMpICYmIGlzX3RuKSB7IC8qIFRlbG5ldCBuZWdvdGlhdGlvbiAqLworCSAgICBteWZsc2goKTsKKwkgICAgYnVyc3QgPSAwOworCSAgICBzd2l0Y2ggKHRuX2Rvb3AoKENIQVIpKHggJiAweGZmKSxkdXBsZXgsdHRpbmMpKSB7CisJICAgICAgY2FzZSAyOiBkdXBsZXggPSAwOyBjb250aW51ZTsKKwkgICAgICBjYXNlIDE6IGR1cGxleCA9IDE7CisJICAgICAgZGVmYXVsdDogY29udGludWU7CisJICAgIH0KKwl9CisjZW5kaWYgLyogVE5DT0RFICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworCXJzZXFnb3RbcnNlcWwtMV0gPSAoY2hhcikgKHggJiAweDdmKTsgLyogR290IGEgY2hhcmFjdGVyICovCisJYnVyc3QtLTsJCQkvKiBPbmUgbGVzcyB3YWl0aW5nICovCisJaWYgKHNjcl9lY2hvKSBjb25idWZbY29uY250KytdID0gcnNlcWdvdFtyc2VxbC0xXTsgLyogQnVmZmVyIGl0ICovCisJaWYgKHNlc2xvZykJCQkvKiBMb2cgaXQgaW4gc2Vzc2lvbiBsb2cgKi8KKyNpZmRlZiBVTklYCisJICBpZiAoc2Vzc2Z0ICE9IDAgfHwgcnNlcWdvdFtyc2VxbC0xXSAhPSAnXHInKQorI2Vsc2UKKyNpZmRlZiBPU0sKKwkgICAgaWYgKHNlc3NmdCAhPSAwIHx8IHJzZXFnb3RbcnNlcWwtMV0gIT0gJ1wwMTInKQorI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIFVOSVggKi8KKwkgICAgICBpZiAocnNlcWdvdFtyc2VxbC0xXSkJLyogRmlsdGVyIG91dCBOVUxzICovCisJCXNlc2J1ZltzZXNjbnQrK10gPSByc2VxZ290W3JzZXFsLTFdOworCWlmICgoaW50KXN0cmxlbihyc2VxdHJhY2UpIDwgU0JVRkwtMiApCisJICBzdHJjYXQocnNlcXRyYWNlLGRiY2hyKHJzZXFnb3RbcnNlcWwtMV0pKTsKKwlnb3RfaXQgPSAoIXN0cm5jbXAocnNlcWUsIHJzZXFnb3QsIHJzZXFsKSk7CisJaWYgKGJ1cnN0IDw9IDApIHsJCS8qIEZsdXNoIGJ1ZmZlcmVkIG91dHB1dCAqLworCSAgICBteWZsc2goKTsKKwkgICAgaWYgKChidXJzdCA9IHR0Y2hrKCkpIDwgMCkgeyAvKiBHZXQgc2l6ZSBvZiBuZXh0IGlucHV0IGJ1cnN0ICovCisjaWZkZWYgTlRTSUcKKwkJY2tUaHJlYWRFbmQodGhyZWFkaW5mbyk7CisjZW5kaWYgLyogTlRTSUcgKi8KKwkJU0lHUkVUVVJOOworCSAgICB9CisJICAgIC8qIHByZXZlbnQgb3ZlcmZsb3cgb2YgImNvbmJ1ZiIgYW5kICJzZXNidWYiICovCisJICAgIGlmIChidXJzdCA+IE1BWEJVUlNUKQorCSAgICAgIGJ1cnN0ID0gTUFYQlVSU1Q7CisJfQorICAgIH0KKyNpZmRlZiBOVFNJRworICAgIGNrVGhyZWFkRW5kKHRocmVhZGluZm8pOworI2VuZGlmIC8qIE5UU0lHICovCisgICAgU0lHUkVUVVJOOworfQorCitzdGF0aWMgU0lHVFlQCisjaWZkZWYgQ0tfQU5TSUMKK2ZhaWxyc2VxKHZvaWQgKiB0aHJlYWRpbmZvKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2ZhaWxyc2VxKHRocmVhZGluZm8pIFZPSUQgKiB0aHJlYWRpbmZvOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBmYWlscnNlcSAqLyB7CisgICAgIGdvdF9pdCA9IDA7CQkJLyogVGltZWQgb3V0IGhlcmUgKi8KKyAgICAgU0lHUkVUVVJOOworfQorCisvKgorICBSZWNlaXZlIHNlcXVlbmNlIC0tIHNlZSBpZiBleHBlY3RlZCByZXNwb25zZSBjb21lcywKKyAgcmV0dXJuIHN1Y2Nlc3MgKG9yIGZhaWx1cmUpIGluIGdvdF9pdC4KKyovCitzdGF0aWMgVk9JRAorcmVjdnNlcSgpIHsKKyAgICBjaGFyICplLCBnb3RbN10sIHRyYWNlW1NCVUZMXTsKKyAgICBpbnQgaSwgbDsKKworICAgIHNlcXVlbmMoKTsKKyAgICBsID0gKGludClzdHJsZW4oZT1zZXFfYnVmKTsJCS8qIG5vIG1vcmUgdGhhbiA3IGNoYXJzIGFsbG93ZWQgKi8KKyAgICBpZiAobCA+IDcpIHsKKwllICs9IGwtNzsKKwlsID0gNzsKKyAgICB9CisgICAgdGxvZyhGMTExLCJleHBlY3Rpbmcgc2VxdWVuY2UiLGUsKGxvbmcpIGwpOworICAgIGlmIChsID09IDApIHsJCQkvKiBudWxsIHNlcXVlbmNlLCBkZWxheSBhIGxpdHRsZSAqLworCXNsZWVwIChOVUxMX0VYUCk7CisJZ290X2l0ID0gMTsKKwl0bG9nKEYxMDAsImdvdCBpdCAobnVsbCBzZXF1ZW5jZSkiLCIiLDBMKTsKKwlyZXR1cm47CisgICAgfQorICAgICp0cmFjZSA9ICdcMCc7CisgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykgZ290W2ldPSdcMCc7CisKKyAgICByc2VxdHJhY2UgPSB0cmFjZTsKKyAgICByc2VxZSA9IGU7CisgICAgcnNlcWdvdCA9IGdvdDsKKyAgICByc2VxbCA9IGw7CisKKyAgICBhbHJtX2V4ZWN1dGUoY2tqYWRkcihhbHJtcm5nKSwgZXhwX2Fscm0sIHNjcnRpbWUsIGRvcnNlcSwgZmFpbHJzZXEpOworCisgICAgdGxvZyhGMTEwLCJyZWNlaXZlZCBzZXF1ZW5jZTogIix0cmFjZSwwTCk7CisgICAgdGxvZyhGMTAxLCJyZXR1cm5pbmcgd2l0aCBnb3QtaXQgY29kZSIsIiIsKGxvbmcpIGdvdF9pdCk7CisgICAgbXlmbHNoKCk7CQkJCS8qIEZsdXNoIGJ1ZmZlcmVkIG91dHB1dCAqLworICAgIHJldHVybjsKK30KKworLyoKKyBPdXRwdXQgQSBTZXF1ZW5jZSBzdGFydGluZyBhdCBwb2ludGVyIHMsCisgcmV0dXJuIDAgaWYgb2theSwKKyAxIGlmIGZhaWxlZCB0byByZWFkIChtb2RlbSBoYW5ndXAgb3Igd2hhdGV2ZXIpCisqLworc3RhdGljIGludCBvc2VxcmV0ID0gMDsJCQkvKiBSZXR1cm4gY29kZSBmb3Igb3V0c2VxICovCisJCQkJCS8qIE91dCBoZXJlIHRvIHByZXZlbnQgY2xvYmJlcmluZyAqLworCQkJCQkvKiBieSBsb25nam1wLiAqLworCitzdGF0aWMgU0lHVFlQCisjaWZkZWYgQ0tfQU5TSUMKK2Rvb3NlcSh2b2lkICogdGhyZWFkaW5mbykKKyNlbHNlIC8qIENLX0FOU0lDICovCitkb29zZXEodGhyZWFkaW5mbykgVk9JRCAqIHRocmVhZGluZm87CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpbnQgbDsKKyAgICBjaGFyICpzYjsKKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICBleHRlcm4gaW50IHRuX25sbSwgdG5fYl9ubG07CisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZmRlZiBOVFNJRworICAgIHNldGludCgpOworICAgIGlmICh0aHJlYWRpbmZvKSB7CQkJLyogVGhyZWFkIGxvY2FsIHN0b3JhZ2UuLi4gKi8KKwlUbHNTZXRWYWx1ZShUbHNJbmRleCx0aHJlYWRpbmZvKTsKKyAgICB9CisjZW5kaWYgLyogTlRTSUcgKi8KKyNpZmRlZiBDS19MT0dJTgorI2lmZGVmIE5UCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlcikKKyAgICAgIHNldG50Y3JlZHMoKTsKKyNlbmRpZiAvKiBJS1NEICovCisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCisgICAgbCA9IChpbnQpc3RybGVuKHNlcV9idWYpOworICAgIHRsb2coRjExMSwic2VuZGluZyBzZXF1ZW5jZSAiLHNlcV9idWYsKGxvbmcpIGwpOworCisgICAgaWYgKCFzdHJjbXAoc2VxX2J1ZiwiRU9UIikpIHsKKwl0dG9jKGRvcGFyKCdcMDA0JykpOworCWlmIChzY3JfZWNobykgY29ub2woIjxFT1Q+Iik7CisJaWYgKHNlc2xvZyAmJiBkdXBsZXgpCisgICAgICAgICAgICBsb2dzdHIoIjxFT1Q+Iiw1KTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoc2VxX2J1ZiwiQlJFQUsiKSB8fAorCSAgICAgICAhc3RyY21wKHNlcV9idWYsIlxcYiIpIHx8CisJICAgICAgICFzdHJjbXAoc2VxX2J1ZiwiXFxCIikpIHsKKwl0dHNuZGIoKTsKKwlpZiAoc2NyX2VjaG8pIGNvbm9sKCI8QlJFQUs+Iik7CisJaWYgKHNlc2xvZykKKwkgIGxvZ3N0cigie0JSRUFLfSIsNyk7CisgICAgfSBlbHNlIHsKKwlpZiAobCA+IDApIHsKKwkgICAgZm9yICggc2IgPSBzZXFfYnVmOyAqc2I7IHNiKyspCisJICAgICAgKnNiID0gZG9wYXIoKnNiKTsJLyogYWRkIHBhcml0eSAqLworCSAgICB0dG9sKChDSEFSICopc2VxX2J1ZixsKTsgLyogc2VuZCBpdCAqLworCSAgICBpZiAoc2NyX2VjaG8gJiYgZHVwbGV4KSB7CisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKwkJewkJCS8qIEVjaG8gdG8gZW11bGF0b3IgKi8KKwkJICAgIGNoYXIgKnMgPSBzZXFfYnVmOworCQkgICAgd2hpbGUgKCpzKSB7CisJCQlzY3JpcHR3cnRidWYoKFVTSE9SVCkqcyk7CisJCSAgICB9CisJCX0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisJCWNvbnhvKGwsc2VxX2J1Zik7CisJICAgIH0KKwkgICAgaWYgKHNlc2xvZyAmJiBkdXBsZXgpIC8qIGxvZyBpdCAqLworCSAgICAgIGxvZ3N0cihzZXFfYnVmLHN0cmxlbihzZXFfYnVmKSk7CisJfQorCWlmICghbm9fY3IpIHsKKwkgICAgdHRvYyggZG9wYXIoQ1IpICk7CisjaWZkZWYgVENQU09DS0VUCisJICAgIGlmIChpc190bikgeworCQlpZiAoIVRFTE9QVF9NRShURUxPUFRfQklOQVJZKSAmJiB0bl9ubG0gIT0gVE5MX0NSKQorCQkgIHR0b2MoKGNoYXIpKCh0bl9ubG0gPT0gVE5MX0NSTEYpID8KKwkJCSAgICAgIGRvcGFyKExGKSA6IGRvcGFyKE5VTCkpKTsKKwkJZWxzZSBpZiAoVEVMT1BUX01FKFRFTE9QVF9CSU5BUlkpICYmCisJCQkgKHRuX2JfbmxtID09IFROTF9DUkxGIHx8IHRuX2JfbmxtID09IFROTF9DUk5VTCkpCisJCSAgdHRvYygoY2hhcikoKHRuX2JfbmxtID09IFROTF9DUkxGKSA/CisJCQkgICAgICBkb3BhcihMRikgOiBkb3BhcihOVUwpKSk7CisJICAgIH0KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKwkgICAgaWYgKHNlc2xvZyAmJiBkdXBsZXgpCisJICAgICAgbG9nY2hhcihkb3BhcihDUikpOworCX0KKyAgICB9CisjaWZkZWYgTlRTSUcKKyAgICBja1RocmVhZEVuZCh0aHJlYWRpbmZvKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworICAgIFNJR1JFVFVSTjsKK30KKworU0lHVFlQCisjaWZkZWYgQ0tfQU5TSUMKK2ZhaWxvc2VxKHZvaWQgKiB0aHJlYWRpbmZvKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2ZhaWxvc2VxKHRocmVhZGluZm8pIFZPSUQgKiB0aHJlYWRpbmZvOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBmYWlsb3NlcSAqLyB7CisgICAgIG9zZXFyZXQgPSAtMTsJCS8qIGVsc2UgLS0gYWxhcm0gcmFuZyAqLworICAgICBTSUdSRVRVUk47Cit9CisKK3N0YXRpYyBpbnQKK291dHNlcSgpIHsKKyAgICBpbnQgZGVsYXk7CisKKyAgICBvc2VxcmV0ID0gMDsJCQkvKiBJbml0aWFsaXplIHJldHVybiBjb2RlICovCisgICAgd2hpbGUoMSkgeworCWRlbGF5ID0gc2VxdWVuYygpOworCWFscm1fZXhlY3V0ZSggY2tqYWRkcihhbHJtcm5nKSwgU05EX0FMUk0sIHNjcnRpbWUsIGRvb3NlcSwgZmFpbG9zZXEgKSA7CisKKwlpZiAoIWRlbGF5KQorCSAgcmV0dXJuKG9zZXFyZXQpOworI2lmbmRlZiBNQUMKKwltc2xlZXAoREVMX01TRUMpOwkJLyogZGVsYXksIGxvb3AgdG8gbmV4dCBzZW5kICovCisjZW5kaWYgLyogTUFDICovCisgICAgfQorfQorCisKKy8qICBMIE8gRyBJIE4gIC0tICAoaGlzdG9yaWNhbCBtaXNub21lcikgRXhlY3V0ZSB0aGUgU0NSSVBUIGNvbW1hbmQgKi8KKworaW50Citkb2xvZ2luKGNtZHN0cikgY2hhciAqY21kc3RyOyB7CisKKyNpZmRlZiBPUzIKKyNpZmRlZiBOVAorICAgIFNJR1RZUCAoKiBzYXZlYWxtKShpbnQpOwkJLyogU2F2ZSBpbmNvbWluZyBhbGFybSBmdW5jdGlvbiAqLworI2Vsc2UgLyogTlQgKi8KKyAgICBTSUdUWVAgKCogdm9sYXRpbGUgc2F2ZWFsbSkoaW50KTsJLyogU2F2ZSBpbmNvbWluZyBhbGFybSBmdW5jdGlvbiAqLworI2VuZGlmIC8qIE5UICovCisjZWxzZSAvKiBPUzIgKi8KKyAgICBTSUdUWVAgKCpzYXZlYWxtKSgpOwkJLyogU2F2ZSBpbmNvbWluZyBhbGFybSBmdW5jdGlvbiAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIGNoYXIgKmU7CisKKyAgICBzID0gY21kc3RyOwkJCQkvKiBNYWtlIGdsb2JhbCB0byB0aGlzIG1vZHVsZSAqLworCisgICAgdGxvZyhGMTAwLGxvZ2ludiwiIiwwTCk7CisKKyAgICBpZiAoc3BlZWQgPCAwTCkgc3BlZWQgPSB0dGdzcGQoKTsKKyAgICBpZiAodHRvcGVuKHR0bmFtZSwmbG9jYWwsbWRtdHlwLDApIDwgMCkgeworCWNrbWFrbXNnKHNlcV9idWYsU0JVRkwsIlNvcnJ5LCBjYW4ndCBvcGVuICIsdHRuYW1lLE5VTEwsTlVMTCk7CisJcGVycm9yKHNlcV9idWYpOworCXJldHVybigwKTsKKyAgICB9CisgICAgLyogV2hldGhlciB0byBlY2hvIHNjcmlwdCBjb21tYW5kcyAuLi4gKi8KKyAgICBzY3JfZWNobyA9ICghcXVpZXQgJiYgIWJhY2tncmQgJiYgc2VjaG8pOworI2lmbmRlZiBOT1NQTAorICAgIGlmIChzY3JfZWNobyAmJiBjbWRsdmwgPiAxKSB7CisJaWYgKGNtZHN0a1tjbWRsdmxdLnNyYyA9PSBDTURfVEYpCisJICBzY3JfZWNobyA9IHRlY2hvOworCWlmIChjbWRzdGtbY21kbHZsXS5zcmMgPT0gQ01EX01EKQorCSAgc2NyX2VjaG8gPSBtZWNobzsKKyAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICBpZiAoc2NyX2VjaG8pIHsKKyNpZmRlZiBORVRDT05OCisJaWYgKG5ldHdvcmspCisJICBwcmludGYoIkV4ZWN1dGluZyBTQ1JJUFQgdG8gaG9zdCAlcy5cbiIsdHRuYW1lKTsKKwllbHNlCisjZW5kaWYgLyogTkVUQ09OTiAqLworCSAgcHJpbnRmKCJFeGVjdXRpbmcgU0NSSVBUIHRocm91Z2ggJXMsIHNwZWVkICVsZC5cbiIsdHRuYW1lLHNwZWVkKTsKKyAgICB9CisjaWZkZWYgVE5DT0RFCisgICAgLyogVEVMTkVUIGlucHV0IG11c3QgYmUgc2Nhbm5lZCBmb3IgSUFDICovCisgICAgaXNfdG4gPSAobG9jYWwgJiYgbmV0d29yayAmJiBJU19URUxORVQoKSkgfHwKKwkgICAgKCFsb2NhbCAmJiBzc3RlbG5ldCk7CisjZW5kaWYgLyogVE5DT0RFICovCisKKyAgICAqc2VxX2J1ZiA9IDA7CisgICAgZm9yIChlID0gczsgKmU7IGUrKykgY2tzdHJuY2F0KHNlcV9idWYsZGJjaHIoKmUpLFNCVUZMKTsKKyNpZmRlZiBDT01NRU5UCisvKiBTa2lwIHRoaXMgYmVjYXVzZSBpdCB0ZW5kcyB0byBjb250YWluIGEgcGFzc3dvcmQuLi4gKi8KKyAgICBpZiAoc2NyX2VjaG8pIHByaW50ZigiU0NSSVBUIHN0cmluZzogJXNcbiIsc2VxX2J1Zik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHRsb2coRjExMCwiU0NSSVBUIHN0cmluZzogIixzZXFfYnVmLCAwTCk7CisKKy8qIENvbmRpdGlvbiBjb25zb2xlIHRlcm1pbmFsIGFuZCBjb21tdW5pY2F0aW9uIGxpbmUuLi4gKi8KKworICAgIGlmICh0dHZ0KHNwZWVkLGZsb3cpIDwgMCkgeworCXByaW50ZigiU29ycnksIENhbid0IGNvbmRpdGlvbiBjb21tdW5pY2F0aW9uIGxpbmVcbiIpOworCXJldHVybigwKTsKKyAgICB9CisgICAgLyogU2F2ZSBpbml0aWFsIHRpbWVyIGludGVycnVwdCB2YWx1ZSAqLworICAgIHNhdmVhbG0gPSBzaWduYWwoU0lHQUxSTSxTSUdfSUdOKTsKKworICAgIGZsdXNoaSgpOwkJCQkvKiBGbHVzaCBzdGFsZSBpbnB1dCAqLworCisvKiBzdGFydCBleHBlY3QgLSBzZW5kIHNlcXVlbmNlICovCisKKyAgICB3aGlsZSAoKnMpIHsJCQkvKiBXaGlsZSBub3QgZG9uZSB3aXRoIGJ1ZmZlciAqLworCisJd2hpbGUgKCpzICYmIGlzc3BhY2UoKnMpKSBzKys7CS8qIFNraXAgb3ZlciBzZXBhcmF0aW5nIHdoaXRlc3BhY2VzICovCisJCQkJCS8qIEdhdGhlciB1cCBleHBlY3Qgc2VxdWVuY2UgKi8KKwlnb3RfaXQgPSAwOworCXJlY3ZzZXEoKTsKKworCXdoaWxlICghZ290X2l0KSB7CQkvKiBIYXZlIGl0IHlldD8gKi8KKwkgICAgaWYgKCpzKysgIT0gJy0nKQkJLyogTm8sIGlzIHRoZXJlIGEgY29uZGl0aW9uYWwgc2VuZD8gKi8KKwkgICAgICBnb3RvIGZhaWxyZXQ7CQkvKiBObywgcmV0dXJuIGZhaWx1cmUgKi8KKwkgICAgZmx1c2hpKCk7CQkJLyogWWVzLCBmbHVzaCBvdXQgaW5wdXQgYnVmZmVyICovCisJICAgIGlmIChvdXRzZXEoKSkJCS8qIElmIHVuYWJsZSB0byBzZW5kLCAqLworCSAgICAgIGdvdG8gZmFpbHJldDsJCS8qIHJldHVybiBmYWlsdXJlLiAqLworCSAgICBpZiAoKnMrKyAhPSAnLScpCQkvKiBJZiBubyBjb25kaXRpb25hbCByZXNwb25zZSBoZXJlLCAqLworCSAgICAgIGdvdG8gZmFpbHJldDsJCS8qIHJldHVybiBmYWlsdXJlLiAqLworCSAgICByZWN2c2VxKCk7CQkJLyogQWxsIE9LLCByZWFkIHJlc3BvbnNlIGZyb20gaG9zdC4gKi8KKwl9CQkJCS8qIExvb3AgYmFjayBhbmQgY2hlY2sgZ290X2l0ICovCisKKwl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMrKykgKSA7CS8qIFNraXAgb3ZlciBjb25kaXRpb25hbHMgKi8KKwl3aGlsZSAoKnMgJiYgaXNzcGFjZSgqcykpIHMrKzsJLyogU2tpcCBvdmVyIHNlcGFyYXRpbmcgd2hpdGVzcGFjZXMgKi8KKwlmbHVzaGkoKTsJCQkvKiBGbHVzaCAqLworCWlmICgqcykgaWYgKG91dHNlcSgpKSBnb3RvIGZhaWxyZXQ7IC8qIElmIGFueSAqLworICAgIH0KKyAgICBzaWduYWwoU0lHQUxSTSxzYXZlYWxtKTsKKyAgICBpZiAoc2NyX2VjaG8pIHByaW50ZigiU2NyaXB0IHN1Y2Nlc3NmdWwuXG4iKTsKKyAgICB0bG9nKEYxMDAsIlNjcmlwdCBzdWNjZXNzZnVsLiIsIiIsMEwpOworICAgIHJldHVybigxKTsKKworZmFpbHJldDoKKyAgICBzaWduYWwoU0lHQUxSTSxzYXZlYWxtKTsKKyAgICBpZiAoc2NyX2VjaG8pIHByaW50ZigiU29ycnksIHNjcmlwdCBmYWlsZWRcbiIpOworICAgIHRsb2coRjEwMCwiU2NyaXB0IGZhaWxlZCIsIiIsMEwpOworICAgIHJldHVybigwKTsKK30KKworLyogIEYgTCBVIFMgSCBJICAtLSAgRmx1c2gsIGJ1dCBsb2csIFNDUklQVCBpbnB1dCBidWZmZXIgICovCisKK1ZPSUQKK2ZsdXNoaSgpIHsKKyAgICBpbnQgbiwgeDsKKyAgICBpZiAoCisJc2VzbG9nCQkJCS8qIExvZ2dpbmcgc2Vzc2lvbj8gKi8KKwl8fCBzY3JfZWNobwkJCS8qIE9yIGNvbnNvbGUgZWNob2luZz8gKi8KKyNpZmRlZiBORVRDT05OCisjaWZkZWYgVE5DT0RFCisJLyogVEVMTkVUIGlucHV0IG11c3QgYmUgc2Nhbm5lZCBmb3IgSUFDICovCisJfHwgaXNfdG4KKyNlbmRpZiAvKiBUTkNPREUgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisJKSB7CisgICAgICAgIGlmICgobiA9IHR0Y2hrKCkpIDwgMCkJCS8qIFllcywgYW55dGhpbmcgaW4gYnVmZmVyPyAqLworCSAgcmV0dXJuOworCWlmIChuID4gTUFYQlVSU1QpIG4gPSBNQVhCVVJTVDsJLyogTWFrZSBzdXJlIG5vdCB0b28gbXVjaCwgKi8KKwlteWZsc2goKTsJCQkvKiBhbmQgdGhhdCBidWZmZXJzIGFyZSBlbXB0eS4gKi8KKwl3aGlsZSAobi0tID4gMCkgeworICAJICAgIHggPSB0dGluYygwKTsJCS8qIENvbGxlY3QgYSBjaGFyYWN0ZXIgKi8KKyNpZmRlZiBORVRDT05OCisjaWZkZWYgVE5DT0RFCisvKiBDaGVjayBmb3IgdGVsbmV0IHByb3RvY29sIG5lZ290aWF0aW9uICovCisgIAkgICAgaWYgKGlzX3RuICYmICgoeCAmIDB4ZmYpID09IElBQykgKSB7CisJCW15ZmxzaCgpOwkJLyogU3luYyBvdXRwdXQgKi8KKyAgCQlzd2l0Y2ggKHRuX2Rvb3AoKENIQVIpKHggJiAweGZmKSxkdXBsZXgsdHRpbmMpKSB7CisgIAkJICBjYXNlIDI6IGR1cGxleCA9IDA7IGJyZWFrOworICAJCSAgY2FzZSAxOiBkdXBsZXggPSAxOworCQkgIGRlZmF1bHQ6IGJyZWFrOworCQl9CisKKwkJLyogUmVjYWxjdWxhdGUgZmx1c2ggY291bnQgKi8KKwkJaWYgKChuID0gdHRjaGsoKSkgPCAwKQorCQkgIHJldHVybjsKKwkJaWYgKG4gPiBNQVhCVVJTVCkgbiA9IE1BWEJVUlNUOworICAJCWNvbnRpbnVlOworICAJICAgIH0KKyNlbmRpZiAvKiBUTkNPREUgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisJICAgIGlmIChzY3JfZWNobykgY29uYnVmW2NvbmNudCsrXSA9IChDSEFSKSB4OyAvKiBidWZmZXIgZm9yIGNvbnNvbGUgKi8KKwkgICAgaWYgKHNlc2xvZykKKyNpZmRlZiBVTklYCisJICAgICAgaWYgKHNlc3NmdCAhPSAwIHx8IHggIT0gJ1xyJykKKyNlbHNlCisjaWZkZWYgT1NLCisJICAgICAgaWYgKHNlc3NmdCAhPSAwIHx8IHggIT0gJ1wwMTInKQorI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIFVOSVggKi8KKwkJc2VzYnVmW3Nlc2NudCsrXSA9IChDSEFSKSB4OyAvKiBidWZmZXIgZm9yIHNlc3Npb24gbG9nICovCisgIAl9CisJbXlmbHNoKCk7CisgICAgfSBlbHNlIHR0Zmx1aSgpOwkJCS8qIE90aGVyd2lzZSBqdXN0IGZsdXNoLiAqLworfQorCisjZWxzZSAvKiBOT1NDUklQVCAqLworY2hhciAqbG9naW52ID0gIlNjcmlwdCBDb21tYW5kIERpc2FibGVkIjsKKyNlbmRpZiAvKiBOT1NDUklQVCAqLworI2VuZGlmIC8qIE5PSUNQICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2t1c2lnLmMgYi9ja2VybWl0LTguMC4yMTEvY2t1c2lnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2MGI5NgotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja3VzaWcuYwpAQCAtMCwwICsxLDM1MiBAQAorLyogQyBLIFUgUyBJIEcgIC0tICBLZXJtaXQgc2lnbmFsIGhhbmRsaW5nIGZvciBVbml4IGFuZCBPUy8yIHN5c3RlbXMgKi8KKworLyoKKyAgQXV0aG9yOiBKZWZmcmV5IEFsdG1hbiAoamFsdG1hbkBzZWN1cmUtZW5kcG9pbnRzLmNvbSksCisgICAgICAgICAgICBTZWN1cmUgRW5kcG9pbnRzIEluYy4sIE5ldyBZb3JrIENpdHkuCisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisjaW5jbHVkZSAiY2tjc3ltLmgiCisjaW5jbHVkZSAiY2tjYXNjLmgiCQkJLyogQVNDSUkgY2hhcmFjdGVyIHN5bWJvbHMgKi8KKyNpbmNsdWRlICJja2NkZWIuaCIJCQkvKiBEZWJ1ZyAmIG90aGVyIHN5bWJvbHMgKi8KKyNpbmNsdWRlICJja2NrZXIuaCIJCQkvKiBLZXJtaXQgc3ltYm9scyAqLworI2luY2x1ZGUgImNrY25ldC5oIgkJCS8qIE5ldHdvcmsgc3ltYm9scyAqLworI2lmbmRlZiBOT1NQTAorI2luY2x1ZGUgImNrdXVzci5oIgorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBOVAorI2luY2x1ZGUgPHNldGptcGV4Lmg+CisjaW5jbHVkZSA8ZXhjcHQuaD4KKyNlbHNlIC8qIE5UICovCisjaW5jbHVkZSA8c2V0am1wLmg+CisjZW5kaWYgLyogTlQgKi8KKyNpbmNsdWRlICJja2NzaWcuaCIKKworI2lmZGVmIE5PQ0NUUkFQCitleHRlcm4gY2tqbXBidWYgY21qYnVmOworI2VuZGlmIC8qIE5PQ0NUUkFQICovCisKKyNpZmRlZiBNQUMKKyNkZWZpbmUgc2lnbmFsIG1zaWduYWwKKyNkZWZpbmUgU0lHVFlQIGxvbmcKKyNkZWZpbmUgYWxhcm0gbWFsYXJtCisjZGVmaW5lIFNJR19JR04gMAorI2RlZmluZSBTSUdBTFJNIDEKKyNkZWZpbmUgU0lHSU5UICAyCitTSUdUWVAgKCptc2lnbmFsKGludCB0eXBlLCBTSUdUWVAgKCpmdW5jKShpbnQpKSkoaW50KTsKKyNlbmRpZiAvKiBNQUMgKi8KKworI2lmZGVmIFNUUkFUVVMKKy8qIFdlIGtub3cgdGhlc2UgYXJlIHNldCBoZXJlLiAgTVVTVCB1bnNldCB0aGVtIGJlZm9yZSB0aGUgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIHNpZ25hbCB2c2lnbmFsCisjZGVmaW5lIGFsYXJtIHZhbGFybQorU0lHVFlQICgqdnNpZ25hbChpbnQgdHlwZSwgU0lHVFlQICgqZnVuYykoaW50KSkpKGludCk7CitpbnQgdmFsYXJtKGludCBpbnRlcnZhbCk7CisjZW5kaWYgLyogU1RSQVRVUyAqLworCisjaWZkZWYgQU1JR0EKKyNkZWZpbmUgc2lnbmFsIGFzaWduYWwKKyNkZWZpbmUgYWxhcm0gYWFsYXJtCisjZGVmaW5lIFNJR0FMUk0gKF9OVU1TSUcrMSkKKyNkZWZpbmUgU0lHVFlQIHZvaWQKK1NJR1RZUCAoKmFzaWduYWwoaW50IHR5cGUsIFNJR1RZUCAoKmZ1bmMpKGludCkpKShpbnQpOwordW5zaWduZWQgYWFsYXJtKHVuc2lnbmVkKTsKKyNlbmRpZiAvKiBBTUlHQSAqLworCisjaWZkZWYgTlRBU00KK0RXT1JECitja2dldElQKHZvaWQpCit7CisgICBfX2FzbQorICAgeworICAgICAgbW92IGVheCwgZHdvcmQgcHRyIFtlc3ArMHgxMF0KKyAgICAgIGptcCBja2dldElQICsgMHgxOAorICAgfQorICAgcmV0dXJuIDE7CisKK30KKyNlbmRpZiAvKiBOVEFTTSAqLworCisjaWZkZWYgTlQKK0RXT1JECitleGNlcHRpb25fZmlsdGVyKCB2b2lkICkKK3sKKyAgIEdldEV4Y2VwdGlvbkluZm9ybWF0aW9uIDsKKyAgIHJldHVybiggRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiApIDsKK30KK3ZvaWQKK2NyYXNoKCB2b2lkICkKK3sKKyAgIGludCB4ID0gMCwgeSA9IDAgOworICAgIHggLyB5IDsKK30KKyNlbmRpZiAvKiBOVCAqLworCisjaWZuZGVmIE5PQ0NUUkFQCitpbnQKKyNpZmRlZiBDS19BTlNJQworY2NfZXhlY3V0ZSggY2tqcHRyKHNqX2J1ZiksIGNrX3NpZ2Z1bmMgZG9mdW5jLCBja19zaWdmdW5jIGZhaWxmdW5jICkKKyNlbHNlCitjY19leGVjdXRlKCBzal9idWYsIGRvZnVuYywgZmFpbGZ1bmMpCisgICAgY2tqcHRyKHNqX2J1Zik7CisgICAgY2tfc2lnZnVuYyBkb2Z1bmM7CisgICAgY2tfc2lnZnVuYyBmYWlsZnVuYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogY2NfZXhlY3V0ZSAqLyB7CisgICAgaW50IHJjID0gMCA7CisjaWZkZWYgTlRBU00KKyAgIERXT1JEIEVpcCwgRXNwIDsKKyAgICBpc2ludGVycnVwdGVkID0gMDsKKyAgICBzal9idWYtPnJldGNvZGUgPSAwIDsKKyAgICBzal9idWYtPklkID0gR2V0Q3VycmVudFRocmVhZElkKCkgOworICAgIG1lbXNldCggJnNqX2J1Zi0+Y29udGV4dCwgMCwgc2l6ZW9mKENPTlRFWFQpICk7CisgICAgc2pfYnVmLT5jb250ZXh0LkNvbnRleHRGbGFncyA9IENPTlRFWFRfRlVMTCA7CisjaWZuZGVmIENPTU1FTlQKKyAgICBHZXRUaHJlYWRDb250ZXh0KEdldEN1cnJlbnRUaHJlYWQoKSwgJihzal9idWYtPmNvbnRleHQpICkgOworICAgIF9fYXNtCisgICAgeworICAgICAgICAgIG1vdiAgICAgICBlY3gsZHdvcmQgcHRyIFtzal9idWZdCisgICAgICAgICAgbW92ICAgICAgIGR3b3JkIHB0ciBbZWN4KzB4YzRdLGVzcAorICAgIH0KKyAgIHNqX2J1Zi0+Y29udGV4dC5FRmxhZ3MgPSA1MzAgOworICAgc2pfYnVmLT5jb250ZXh0LkVpcCA9IGNrZ2V0SVAoKSsweDBDIDsKKyNlbHNlIC8qIENPTU1FTlQgKi8KKyAgIF9fYXNtCisgICB7CisgICAgICBtb3YgZWF4LCBkd29yZCBwdHIgW3NqX2J1Zl0KKyAgICAgIHB1c2ggZWF4CisgICAgICBtb3YgZWF4LCAweGZmZmZmZmZlCisgICAgICBwdXNoIGVheAorICAgICAgbW92IGVheCwgMHgwMDAwMDAzOQorICAgICAgbW92IGVkeCxlc3AKKyAgICAgIGludCAweDJlCisgICAgICBwb3AgZWF4CisgICAgICBwb3AgZWF4CisgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIE5UQVNNICovCisgICAgaWYgKAorI2lmZGVmIE5UQVNNCisgICAgICAgICBpc2ludGVycnVwdGVkCisjZWxzZQorCQkgY2tzZXRqbXAoY2tqZHJlZihzal9idWYpKQorI2VuZGlmIC8qIE5UQVNNICovCisJCSApIHsKKyNpZmRlZiBOVEFTTQorICAgICAgICAgIF9fYXNtCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbW92IGVzcCwgRVNQVG9SZXN0b3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpc2ludGVycnVwdGVkID0gMCA7CisjZW5kaWYgLyogTlRBU00gKi8KKyAgICAgICAgICAgICgqZmFpbGZ1bmMpKE5VTEwpIDsKKyNpZmRlZiBOVEFTTQorICAgICAgICAgICAgIHJjID0gc2pfYnVmLT5yZXRjb2RlIDsKKyNlbHNlIC8qIE5UQVNNICovCisgICAgICAgICAgICAgcmMgPSAtMSA7CisjZW5kaWYgIC8qIE5UQVNNICovCisgICAgICAgICB9IGVsc2UgeworI2lmZGVmIE5UCisgICAgICAgICAgICBfX3RyeSB7CisgICAgICAgICAgICAgICAoKmRvZnVuYykoTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2V4Y2VwdChleGNlcHRpb25fZmlsdGVyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJjY19leGVjdXRlIF9fZXhjZXB0IiwiIiwwKTsKKyAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsCisJCSAgICAgImV4Y2VwdGlvbl9maWx0ZXIiLAorCQkgICAgICJfZXhjZXB0aW9uX2NvZGUiLAorCQkgICAgIGV0RXhjZXB0aW9uQ29kZSgpCisJCSAgICAgKTsKKyAgICAgICAgICAgICAgIGxvbmdqbXAoY2tqZHJlZihzal9idWYpLFNJR0lOVCk7CisgICAgICAgICAgICB9CisjZWxzZSAvKiBOVCAqLworICAgICAgICAgICAgKCpkb2Z1bmMpKE5VTEwpOworI2VuZGlmIC8qIE5UICovCisgICAgICAgICB9CisgICByZXR1cm4gcmMgOworfQorI2VuZGlmIC8qIE5PQ0NUUkFQICovCisKK2ludAorI2lmZGVmIENLX0FOU0lDCQkJCS8qIEFOU0lDIEMgZGVjbGFyYXRpb24uLi4gKi8KK2Fscm1fZXhlY3V0ZShja2pwdHIoc2pfYnVmKSwKKwkgICAgIGludCB0aW1vLAorCSAgICAgY2tfc2lnaGFuZCBoYW5kbGVyLAorCSAgICAgY2tfc2lnZnVuYyBkb2Z1bmMsCisJICAgICBja19zaWdmdW5jIGZhaWxmdW5jCisJICAgICApCisKKyNlbHNlIC8qIE5vdCBBTlNJQyBDIC4uLiAqLworCithbHJtX2V4ZWN1dGUoc2pfYnVmLAorCSAgICAgdGltbywKKwkgICAgIGhhbmRsZXIsCisJICAgICBkb2Z1bmMsCisJICAgICBmYWlsZnVuYworCSAgICAgKQorICAgIGNranB0cihzal9idWYpOworICAgIGludCB0aW1vOworICAgIGNrX3NpZ2hhbmQgaGFuZGxlcjsKKyAgICBja19zaWdmdW5jIGRvZnVuYzsKKyAgICBja19zaWdmdW5jIGZhaWxmdW5jOworI2VuZGlmIC8qIENLX0FOU0lDICovCisKKy8qIGFscm1fZXhlY3V0ZSAqLyB7CisKKyAgICBpbnQgcmMgPSAwOworICAgIGludCBzYXZhbHJtID0gMDsKK19QUk9UT1RZUChTSUdUWVAgKCpzYXZoYW5kbGVyKSwgKGludCkpOworCisgICAgc2F2YWxybSA9IGFsYXJtKHRpbW8pOworICAgIHNhdmhhbmRsZXIgPSBzaWduYWwoU0lHQUxSTSwgaGFuZGxlcik7CisKKyNpZmRlZiBOVEFTTQorICAgIHNqX2J1Zi0+cmV0Y29kZSA9IDAgOworICAgIHNqX2J1Zi0+SWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgICBtZW1zZXQoJnNqX2J1Zi0+Y29udGV4dCwgMCwgc2l6ZW9mKENPTlRFWFQpKTsKKyAgICBzal9idWYtPmNvbnRleHQuQ29udGV4dEZsYWdzID0gQ09OVEVYVF9GVUxMOworI2lmbmRlZiBDT01NRU5UCisgICAgR2V0VGhyZWFkQ29udGV4dChHZXRDdXJyZW50VGhyZWFkKCksICYoc2pfYnVmLT5jb250ZXh0KSk7CisjZWxzZQorICAgX19hc20KKyAgIHsKKyAgICAgIG1vdiBlYXgsIGR3b3JkIHB0ciBbc2pfYnVmXQorICAgICAgcHVzaCBlYXgKKyAgICAgIG1vdiBlYXgsIDB4ZmZmZmZmZmUKKyAgICAgIHB1c2ggZWF4CisgICAgICBtb3YgZWF4LCAweDAwMDAwMDM5CisgICAgICBtb3YgZWR4LGVzcAorICAgICAgaW50IDB4MmUKKyAgICAgIHBvcCBlYXgKKyAgICAgIHBvcCBlYXgKKyAgIH0KKyNlbmRpZgorICAgIGlzaW50ZXJydXB0ZWQgPSAwOworI2VuZGlmIC8qIE5UQVNNICovCisgICAgaWYgKAorI2lmZGVmIE5UQVNNCisJCSBzal9idWYtPnJldGNvZGUKKyNlbHNlCisJCSBja3NldGptcChja2pkcmVmKHNqX2J1ZikpCisjZW5kaWYgLyogTlRBU00gKi8KKwkJKSB7CisJKCpmYWlsZnVuYykoTlVMTCkgOworCXJjID0gLTEgOworICAgIH0gZWxzZSB7CisjaWZkZWYgTlQKKyAgICAgICBfX3RyeSB7CisgICAgICAgICAgKCpkb2Z1bmMpKE5VTEwpIDsKKyAgICAgICB9CisgICAgICAgX19leGNlcHQoIGV4Y2VwdGlvbl9maWx0ZXIoKSApCisgICAgICAgeworICAgICAgICAgIGRlYnVnKEYxMDAsImFscm1fZXhlY3V0ZSBfX2V4Y2VwdCIsIiIsMCk7CisgICAgICAgICAgZGVidWcoRjExMSwiZXhjZXB0aW9uX2ZpbHRlciIsCisJCSJfZXhjZXB0aW9uX2NvZGUiLAorCQlHZXRFeGNlcHRpb25Db2RlKCkKKwkJKTsKKyAgICAgICAgICBsb25nam1wKGNramRyZWYoc2pfYnVmKSxTSUdJTlQpOworICAgICAgIH0KKyNlbHNlIC8qIE5UICovCisgICAgICAgKCpkb2Z1bmMpKE5VTEwpIDsKKyNlbmRpZiAvKiBOVCAqLworICAgIH0KKyAgICBhbGFybShzYXZhbHJtKSA7CisgICAgaWYgKCBzYXZoYW5kbGVyICkKKyAgICAgICAgc2lnbmFsKCBTSUdBTFJNLCBzYXZoYW5kbGVyICkgOworICAgIHJldHVybiByYyA7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCQkJCS8qIEFOU0lDIEMgZGVjbGFyYXRpb24uLi4gKi8KK2NjX2Fscm1fZXhlY3V0ZShja2pwdHIoc2pfYnVmKSwKKwkJaW50IHRpbW8sCisJCWNrX3NpZ2hhbmQgaGFuZGxlciwKKwkJY2tfc2lnZnVuYyBkb2Z1bmMsCisJCWNrX3NpZ2Z1bmMgZmFpbGZ1bmMKKwkJKQorCisjZWxzZSAvKiBOb3QgQU5TSUMgQyAuLi4gKi8KKworY2NfYWxybV9leGVjdXRlKHNqX2J1ZiwKKwkgICAgIHRpbW8sCisJICAgICBoYW5kbGVyLAorCSAgICAgZG9mdW5jLAorCSAgICAgZmFpbGZ1bmMKKwkgICAgICkKKyAgICBja2pwdHIoc2pfYnVmKTsKKyAgICBpbnQgdGltbzsKKyAgICBja19zaWdoYW5kIGhhbmRsZXI7CisgICAgY2tfc2lnZnVuYyBkb2Z1bmM7CisgICAgY2tfc2lnZnVuYyBmYWlsZnVuYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworCisvKiBjY19hbHJtX2V4ZWN1dGUgKi8geworCisgICAgaW50IHJjID0gMDsKKyAgICBpbnQgc2F2YWxybSA9IDA7CitfUFJPVE9UWVAoU0lHVFlQICgqc2F2aGFuZGxlciksIChpbnQpKTsKKyAgICBzYXZhbHJtID0gYWxhcm0odGltbyk7CisgICAgc2F2aGFuZGxlciA9IHNpZ25hbCggU0lHQUxSTSwgaGFuZGxlciApOworCisjaWZkZWYgTlRBU00KKyAgICBzal9idWYtPnJldGNvZGUgPSAwIDsKKyAgICBzal9idWYtPklkID0gR2V0Q3VycmVudFRocmVhZElkKCkgOworICAgIG1lbXNldCggJnNqX2J1Zi0+Y29udGV4dCwgMCwgc2l6ZW9mKENPTlRFWFQpICk7CisgICAgc2pfYnVmLT5jb250ZXh0LkNvbnRleHRGbGFncyA9IENPTlRFWFRfRlVMTCA7CisjaWZuZGVmIENPTU1FTlQKKyAgICBHZXRUaHJlYWRDb250ZXh0KCBHZXRDdXJyZW50VGhyZWFkKCksICYoc2pfYnVmLT5jb250ZXh0KSApIDsKKyNlbHNlCisgICBfX2FzbQorICAgeworICAgICAgbW92IGVheCwgZHdvcmQgcHRyIFtzal9idWZdCisgICAgICBwdXNoIGVheAorICAgICAgbW92IGVheCwgMHhmZmZmZmZmZQorICAgICAgcHVzaCBlYXgKKyAgICAgIG1vdiBlYXgsIDB4MDAwMDAwMzkKKyAgICAgIG1vdiBlZHgsZXNwCisgICAgICBpbnQgMHgyZQorICAgICAgcG9wIGVheAorICAgICAgcG9wIGVheAorICAgfQorI2VuZGlmCisgICAgaXNpbnRlcnJ1cHRlZCA9IDA7CisjZW5kaWYgLyogTlRBU00gKi8KKyAgICBpZiAoCisjaWZkZWYgTlRBU00KKwkJIHNqX2J1Zi0+cmV0Y29kZQorI2Vsc2UKKwkJIGNrc2V0am1wKGNramRyZWYoc2pfYnVmKSkKKyNlbmRpZiAvKiBOVEFTTSAqLworCQkpIHsKKwkoKmZhaWxmdW5jKShOVUxMKSA7CisJcmMgPSAtMSA7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBOVAorICAgICAgIF9fdHJ5IHsKKyAgICAgICAgICAoKmRvZnVuYykoTlVMTCkgOworICAgICAgIH0KKyAgICAgICBfX2V4Y2VwdCggZXhjZXB0aW9uX2ZpbHRlcigpICkKKyAgICAgICB7CisJICAgZGVidWcoRjEwMCwiY2NfYWxybV9leGVjdXRlIF9fZXhjZXB0IiwiIiwwKTsKKwkgICBkZWJ1ZyhGMTExLAorCQkgImV4Y2VwdGlvbl9maWx0ZXIiLAorCQkgIl9leGNlcHRpb25fY29kZSIsCisJCSBHZXRFeGNlcHRpb25Db2RlKCkKKwkJICk7CisJICAgbG9uZ2ptcChja2pkcmVmKHNqX2J1ZiksU0lHSU5UKSA7CisgICAgICAgfQorI2Vsc2UgLyogTlQgKi8KKyAgICAgICAoKmRvZnVuYykoTlVMTCkgOworI2VuZGlmIC8qIE5UICovCisgICAgfQorICAgIGFsYXJtKHNhdmFscm0pOworICAgIGlmIChzYXZoYW5kbGVyKQorICAgICAgc2lnbmFsKFNJR0FMUk0sc2F2aGFuZGxlcik7CisgICAgcmV0dXJuKHJjKTsKK30KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja3VzaWcuaCBiL2NrZXJtaXQtOC4wLjIxMS9ja3VzaWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjYxZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrdXNpZy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qICBDIEsgVSBTIEkgRyAuIEggICovCisKKy8qICBEZWZpbml0aW9ucyBhbmQgcHJvdG90eXBlcyBmb3Igc2lnbmFsIGhhbmRsaW5nICAqLworCisvKgorICBBdXRob3I6IEplZmZyZXkgRSBBbHRtYW4gKGphbHRtYW5Ac2VjdXJlLWVuZHBvaW50cy5jb20pLAorICAgICAgICAgICAgU2VjdXJlIEVuZHBvaW50cyBJbmMuLCBOZXcgWW9yayBDaXR5LgorCisgIENvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisqLworCisjaWZkZWYgQ0tfQU5TSUMKK3R5cGVkZWYgdm9pZCAoKmNrX3NpZ2Z1bmMpKHZvaWQgKik7Cit0eXBlZGVmIHZvaWQgKCpja19zaWdoYW5kKShpbnQpOworI2Vsc2UKK3R5cGVkZWYgVk9JRCAoKmNrX3NpZ2Z1bmMpKCk7Cit0eXBlZGVmIFZPSUQgKCpja19zaWdoYW5kKSgpOworI2VuZGlmIC8qIENLX0FOU0lDICovCisKKy8qIE1hY3JvcyBmb3IgUE9TSVggdnMgb2xkLXN0eWxlIHNpZ25hbCBoYW5kbGluZy4gKi8KKworI2lmZGVmIENLX1BPU0lYX1NJRwordHlwZWRlZiBzaWdqbXBfYnVmIGNram1wYnVmOworI2Vsc2UKK3R5cGVkZWYgam1wX2J1ZiBja2ptcGJ1ZjsKKyNlbmRpZiAvKiBDS19QT1NJWF9TSUcgKi8KKy8qCisgIFN1cHBvc2UgeW91IHdhbnQgdG8gcGFzcyB0aGUgYWRkcmVzcyBvZiBhIGptcF9idWYgYmFyIHRvIGEgZnVuY3Rpb24gZm9vLgorICBTaW5jZSBqbXBfYnVmIGlzIG5vcm1hbGx5IGRlZmluZWQgKHR5cGVkZWYnZCkgYXMgYW4gYXJyYXksIHlvdSB3b3VsZCBkbworICBpdCBsaWtlIHRoaXM6ICBmb28oYmFyKSwgd2hlcmUgZm9vID0gZm9vKGptcF9idWYgYmFyKS4gIEJ1dCBzdXBwb3NlIGEKKyAgam1wX2J1ZiBpcyAoc2F5KSBhIHN0cnVjdCByYXRoZXIgdGhhbiBhbiBhcnJheS4gIFRoZW4geW91IG11c3QgZG8KKyAgZm9vKCZiYXIpIHdoZXJlIGZvbyBpcyBmb28oam1wX2J1ZiAqIGJhcikuICBUaGlzIGlzIGNvbnRyb2xsZWQgaGVyZSBpbgorICB0aGUgdHJhZGl0aW9uYWwgZmFzaGlvbiwgYnkgaWZkZWZzLiAgQnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoYXQgam1wX2J1ZgorICBpcyBhbiBhcnJheS4gIERlZmluZSB0aGUgc3ltYm9sIEpCTk9UQVJSQVkgaWYgam1wX2J1ZiBpcyBub3QgYW4gYXJyYXkuCisqLworI2lmbmRlZiBKQk5PVEFSUkFZCisjaWZkZWYgTlQKKyNkZWZpbmUgSkJOT1RBUlJBWQorI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogSkJOT1RBUlJBWSAqLworCisjaWZkZWYgSkJOT1RBUlJBWQordHlwZWRlZiBja2ptcGJ1ZiAqIGNranB0cjsKKyNkZWZpbmUgY2tqYWRkcih4KSAmIHgKKyNkZWZpbmUgY2tqZHJlZih4KSAqIHgKKyNpZmRlZiBDS19QT1NJWF9TSUcKKyNkZWZpbmUgY2tzZXRqbXAoeCkgc2lnc2V0am1wKHgsMSkKKyNlbHNlCisjZGVmaW5lIGNrc2V0am1wKHgpIHNldGptcCh4LDEpCisjZW5kaWYgLyogQ0tfUE9TSVhfU0lHICovCisjZWxzZSAgLyogam1wX2J1ZiBpcyBhbiBhcnJheSAqLwordHlwZWRlZiBja2ptcGJ1ZiBja2pwdHI7CisjZGVmaW5lIGNramFkZHIoeCkgeAorI2RlZmluZSBja2pkcmVmKHgpIHgKKyNpZmRlZiBDS19QT1NJWF9TSUcKKyNkZWZpbmUgY2tzZXRqbXAgc2lnc2V0am1wCisjZWxzZQorI2RlZmluZSBja3NldGptcCBzZXRqbXAKKyNlbmRpZiAvKiBDS19QT1NJWF9TSUcgKi8KKyNlbmRpZiAvKiBKQk5PVEFSUkFZICovCisKK19QUk9UT1RZUCggaW50IGNjX2V4ZWN1dGUsIChja2pwdHIsIGNrX3NpZ2Z1bmMsIGNrX3NpZ2Z1bmMpICk7CitfUFJPVE9UWVAoIGludCBhbHJtX2V4ZWN1dGUsCisJICAoY2tqcHRyLAorCSAgIGludCB0aW1vLAorCSAgIGNrX3NpZ2hhbmQgaGFuZGxlciwKKwkgICBja19zaWdmdW5jLCBja19zaWdmdW5jKSApOworX1BST1RPVFlQKCBpbnQgY2NfYWxybV9leGVjdXRlLAorCSAgKGNranB0ciwKKwkgICBpbnQgdGltbywKKwkgICBja19zaWdoYW5kIGhhbmRsZXIsCisJICAgY2tfc2lnZnVuYywKKwkgICBja19zaWdmdW5jKSApOworCisvKiBFbmQgb2YgY2t1c2lnLmggKi8KKwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdXRpby5jIGIvY2tlcm1pdC04LjAuMjExL2NrdXRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNTE3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2t1dGlvLmMKQEAgLTAsMCArMSwxNDQ5MiBAQAorI2lmZGVmIGFlZ2lzCitjaGFyICpja3h2ID0gIkFlZ2lzIENvbW11bmljYXRpb25zIHN1cHBvcnQsIDguMC4zMDMsIDE3IEFwciAyMDA0IjsKKyNlbHNlCisjaWZkZWYgUGxhbjkKK2NoYXIgKmNreHYgPSAiUGxhbiA5IENvbW11bmljYXRpb25zIHN1cHBvcnQsIDguMC4zMDMsIDE3IEFwciAyMDA0IjsKKyNlbHNlCitjaGFyICpja3h2ID0gIlVOSVggQ29tbXVuaWNhdGlvbnMgc3VwcG9ydCwgOC4wLjMwMywgMTcgQXByIDIwMDQiOworI2VuZGlmIC8qIFBsYW45ICovCisjZW5kaWYgLyogYWVnaXMgKi8KKworLyogIEMgSyBVIFQgSSBPICAqLworCisvKiBDLUtlcm1pdCBpbnRlcnJ1cHQsIGNvbW11bmljYXRpb25zIGNvbnRyb2wgYW5kIEkvTyBmdW5jdGlvbnMgZm9yIFVOSVggKi8KKworLyoKKyAgQXV0aG9yOiBGcmFuayBkYSBDcnV6IChmZGNAY29sdW1iaWEuZWR1KSwKKyAgQ29sdW1iaWEgVW5pdmVyc2l0eSBBY2FkZW1pYyBJbmZvcm1hdGlvbiBTeXN0ZW1zLCBOZXcgWW9yayBDaXR5LgorCisgIENvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisqLworCisvKgorICBOT1RFIFRPIENPTlRSSUJVVE9SUzogVGhpcyBmaWxlLCBhbmQgYWxsIHRoZSBvdGhlciBDLUtlcm1pdCBmaWxlcywgbXVzdCBiZQorICBjb21wYXRpYmxlIHdpdGggQyBwcmVwcm9jZXNzb3JzIHRoYXQgc3VwcG9ydCBvbmx5ICNpZmRlZiwgI2Vsc2UsICNlbmRpZiwKKyAgI2RlZmluZSwgYW5kICN1bmRlZi4gIFBsZWFzZSBkbyBub3QgdXNlICNpZiwgbG9naWNhbCBvcGVyYXRvcnMsIG9yIG90aGVyCisgIHByZXByb2Nlc3NvciBmZWF0dXJlcyBpbiBhbnkgb2YgdGhlIHBvcnRhYmxlIEMtS2VybWl0IG1vZHVsZXMuICBZb3UgY2FuLAorICBvZiBjb3Vyc2UsIHVzZSB0aGVzZSBjb25zdHJ1Y3Rpb25zIGluIHBsYXRmb3JtLXNwZWNpZmljIG1vZHVsZXMgd2hlbiB0aGV5CisgIGFyZSBzdXBwb3J0ZWQgYnkgYWxsIGNvbXBpbGVycy9wcmVwcm9jZXNzb3JzIHRoYXQgY291bGQgYmUgdXNlZCBvbiB0aGF0CisgIHBsYXRmb3JtLgorKi8KKworZXh0ZXJuIGludCBuZXR0eXBlOwkJCS8qIERlZmluZWQgaW4gY2tjbWFpLmMgKi8KKworLyogSW5jbHVkZXMgKi8KKworI2luY2x1ZGUgImNrY3N5bS5oIgkJCS8qIFRoaXMgbXVzdCBnbyBmaXJzdCAgICovCisjaW5jbHVkZSAiY2tjZGViLmgiCQkJLyogVGhpcyBtdXN0IGdvIHNlY29uZCAgKi8KKworI2lmZGVmIE9TRjEzCisjaWZkZWYgQ0tfQU5TSUMKKyNpZmRlZiBfTk9fUFJPVE8KKyN1bmRlZiBfTk9fUFJPVE8KKyNlbmRpZiAvKiBfTk9fUFJPVE8gKi8KKyNlbmRpZiAvKiBDS19BTlNJQyAqLworI2VuZGlmIC8qIE9TRjEzICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgkJCS8qIFN5c3RlbSBlcnJvciBudW1iZXJzICovCisKKyNpZmRlZiBfXzM4NkJTRF9fCisjZGVmaW5lIEVOT1RDT05OIDU3CisjZWxzZQorI2lmZGVmIF9fYnNkaV9fCisjZGVmaW5lIEVOT1RDT05OIDU3CisjZWxzZQorI2lmZGVmIF9fRnJlZUJTRF9fCisjZGVmaW5lIEVOT1RDT05OIDU3CisjZW5kaWYgLyogX19GcmVlQlNEX18gKi8KKyNlbmRpZiAvKiBfX2JzZGlfXyAqLworI2VuZGlmIC8qIF9fMzg2QlNEX18gKi8KKworI2lmZGVmIFNDT19PU1I1MDQKKyNkZWZpbmUgTkJCWSA4CisjZW5kaWYgLyogU0NPX09TUjUwNCAqLworCisjaWZkZWYgUGxhbjkKKyNkZWZpbmUgU0VMRUNUCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzZWxlY3QuaD4KKyNkZWZpbmUgRkRfU0VUU0laRSAoMyAqIHNpemVvZihsb25nKSAqIDgpCitzdGF0aWMgc3RydWN0IHRpbWV2YWwgdHY7CisjZW5kaWYgLyogUGxhbjkgKi8KKworI2lmZGVmIENMSVgKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmIC8qIENMSVggKi8KKworI2luY2x1ZGUgImNrY25ldC5oIgkJCS8qIFN5bWJvbHMgZm9yIG5ldHdvcmsgdHlwZXMuICovCisjaWZkZWYgQ0tfU1NMCisjaW5jbHVkZSAiY2tfc3NsLmgiCisjZW5kaWYgLyogQ0tfU1NMICovCisKKy8qCisgIFRoZSBkaXJlY3RvcnktcmVsYXRlZCBpbmNsdWRlcyBhcmUgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gdGVzdCBzb21lCisgIGZpbGUtc3lzdGVtLXJlbGF0ZWQgc3ltYm9scyB0byBmaW5kIG91dCB3aGljaCBzeXN0ZW0gd2UncmUgYmVpbmcgY29tcGlsZWQKKyAgdW5kZXIuICBGb3IgZXhhbXBsZSwgTUFYTkFNTEVOIGlzIGRlZmluZWQgaW4gQlNENC4yIGJ1dCBub3QgNC4xLgorKi8KKyNpZmRlZiBTRElSRU5UCQkJCS8qIERpcmVjdG9yeSBiaXRzLi4uICovCisjZGVmaW5lIERJUkVOVAorI2VuZGlmIC8qIFNESVJFTlQgKi8KKworI2lmZGVmIFhORElSCisjaW5jbHVkZSA8c3lzL25kaXIuaD4KKyNlbHNlIC8qICFYTkRJUiAqLworI2lmZGVmIE5ESVIKKyNpbmNsdWRlIDxuZGlyLmg+CisjZWxzZSAvKiAhTkRJUiwgIVhORElSICovCisjaWZkZWYgUlRVCisjaW5jbHVkZSAiL3Vzci9saWIvbmRpci5oIgorI2Vsc2UgLyogIVJUVSwgIU5ESVIsICFYTkRJUiAqLworI2lmZGVmIERJUkVOVAorI2lmZGVmIFNESVJFTlQKKyNpbmNsdWRlIDxzeXMvZGlyZW50Lmg+CisjZWxzZQorI2luY2x1ZGUgPGRpcmVudC5oPgorI2VuZGlmIC8qIFNESVJFTlQgKi8KKyNlbHNlIC8qICFSVFUsICFORElSLCAhWE5ESVIsICFESVJFTlQsIGkuZS4gYWxsIG90aGVycyAqLworI2luY2x1ZGUgPHN5cy9kaXIuaD4KKyNlbmRpZiAvKiBESVJFTlQgKi8KKyNlbmRpZiAvKiBSVFUgKi8KKyNlbmRpZiAvKiBORElSICovCisjZW5kaWYgLyogWE5ESVIgKi8KKworI2lmZGVmIFFOWAorI2luY2x1ZGUgPHN5cy9kZXYuaD4KKyNlbmRpZiAvKiBRTlggKi8KKworI2lmZGVmIEhQVVg1CisjaWZuZGVmIFRDUFNPQ0tFVAorLyogSSBkb24ndCBrbm93IHdoeSB0aGlzIGlzIG5lZWRlZCBoZXJlIHNpbmNlIHdlIG5ldmVyIHJlZmVyZW5jZSBiemVybygpLiAqLworLyogQnV0IHdpdGhvdXQgaXQgQy1LZXJtaXQgd29uJ3QgbGluayBpbiBhbiBIUC1VWCA1Lnh4IG5vbi1UQ1AgYnVpbGQuICovCit2b2lkCitiemVybyhzLG4pIGNoYXIgKnM7IGludCBuOyB7CisgICAgZXh0ZXJuIGNoYXIgKiBtZW1zZXQoKTsKKyAgICBtZW1zZXQocywwLG4pOworfQorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2VuZGlmIC8qIEhQVVg1ICovCisKKy8qIERlZmluaXRpb24gb2YgSFosIHVzZWQgaW4gbXNsZWVwKCkgKi8KKworI2lmZGVmIE1JUFMKKyNkZWZpbmUgSFogKCAxMDAwIC8gQ0xPQ0tfVElDSyApCisjZWxzZSAgLyogTUlQUyAqLworI2lmZGVmIEFUVFNWCisjaWZuZGVmIE5BUAorI2lmZGVmIFRSUzE2CisjZGVmaW5lIEhaICggMTAwMCAvIENMT0NLX1RJQ0sgKQorI2VuZGlmIC8qIFRSUzE2ICovCisjaWZkZWYgTkFQSEFDSworI2RlZmluZSBuYXAoeCkgKHZvaWQpc3lzY2FsbCgzMTEyLCAoeCkpCisjZGVmaW5lIE5BUAorI2VuZGlmIC8qIE5BUEhBQ0sgKi8KKyNlbmRpZiAvKiBOQVAgKi8KKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIE1JUFMgKi8KKworI2lmZGVmIE1fVU5JWAorI3VuZGVmIE5HUk9VUFNfTUFYCQkvKiBQcmV2ZW50IG11bHRpcGxlIGRlZmluaXRpb24gd2FybmluZ3MgKi8KKyNlbmRpZiAvKiBNX1VOSVggKi8KKworLyoKKyAgTk9URTogSFAtVVggOC4wIGhhcyBhIDxzeXMvcG9sbC5oPiwgYnV0IHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcKKyAgbGlicmFyeSByb3V0aW5lLCBzbyBfcG9sbCBjb21lcyB1cCB1bmRlZmluZWQgYXQgbGluayB0aW1lLgorKi8KKyNpZmRlZiBDS19QT0xMCisjaWZuZGVmIEFJWFJTCQkJLyogSUJNIEFJWCBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nICovCisjaW5jbHVkZSA8cG9sbC5oPgkJLyogInN0YW5kYXJkIiAoU1ZJRCkgaS9vIG11bHRpcGxleGluZywgZXRjICovCisjZWxzZSAvKiBBSVhSUyAqLworI2lmZGVmIFNWUjQJCQkvKiBBSVggMy4yIGlzIGxpa2UgU1ZJRC4uLiAqLworI2luY2x1ZGUgPHBvbGwuaD4KKyNlbHNlCQkJCS8qIEJ1dCBBSVggMy4xIGlzIG5vdCAuLi4gKi8KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgkJLyogVGhlIGluY2x1ZGUgZmlsZSBpcyBpbiBpbmNsdWRlL3N5cyAqLworI2RlZmluZSBldmVudHMgcmVxZXZlbnRzCS8qIEFuZCBpdCBkb2VzIG5vdCBtYXAgSUJNLXNwZWNpZmljIG1lbWJlciAqLworI2RlZmluZSByZXZlbnRzIHJ0bmV2ZW50cwkvKiBuYW1lcyB0byB0aGUgU3lzdGVtIFYgZXF1aXZhbGVudHMgKi8KKyNlbmRpZiAvKiBTVlI0ICovCisjZW5kaWYgLyogQUlYUlMgKi8KKyNlbmRpZiAvKiBDS19QT0xMICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4gICAgICAgICAgICAgICAgICAgICAvKiBTaWduYWxzICovCisKKy8qIEZvciBzZXRqbXAgYW5kIGxvbmdqbXAgKi8KKworI2lmbmRlZiBaSUxPRworI2luY2x1ZGUgPHNldGptcC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzZXRyZXQuaD4KKyNlbmRpZiAvKiBaSUxPRyAqLworCisvKgorICBUaGUgZm9sbG93aW5nIHRlc3QgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiA0LjEgQlNEIGFuZCA0LjIgJiBsYXRlci4KKyAgSWYgeW91IGhhdmUgYSA0LjFCU0Qgc3lzdGVtIHdpdGggdGhlIERJUkVOVCBsaWJyYXJ5LCB0aGlzIHRlc3QgY291bGQKKyAgbWlzdGFrZW5seSBkaWFnbm9zZSA0LjJCU0QgYW5kIHRoZW4gbGF0ZXIgZW5hYmxlIHRoZSB1c2Ugb2Ygc3lzdGVtIGNhbGxzCisgIHRoYXQgYXJlbid0IGRlZmluZWQuICBJZiBpbmRlZWQgdGhlcmUgYXJlIHN1Y2ggc3lzdGVtcywgd2UgY2FuIHVzZSBzb21lCisgIG90aGVyIHdheSBvZiB0ZXN0aW5nIGZvciA0LjFCU0QsIG9yIGFkZCB5ZXQgYW5vdGhlciBjb21waWxlLXRpbWUgc3dpdGNoLgorKi8KKyNpZmRlZiBCU0Q0CisjaWZkZWYgTUFYTkFNTEVOCisjaWZuZGVmIEZUMjEJCQkJLyogRXhjZXB0IGZvciBGb3J0dW5lLiAqLworI2lmbmRlZiBGVDE4CisjaWZuZGVmIEJFTExWMTAJCQkJLyogQW5kIEJlbGwgTGFicyBSZXNlYXJjaCBVTklYIFYxMCAqLworI2RlZmluZSBCU0Q0MgorI2VuZGlmIC8qIEJFTExWMTAgKi8KKyNlbmRpZiAvKiBGVDE4ICovCisjZW5kaWYgLyogRlQyMSAqLworI2VuZGlmIC8qIE1BWE5BTUxFTiAqLworI2VuZGlmIC8qIEJTRDQgKi8KKy8qCisgIE1pbml4IDIuMCBzdXBwb3J0IGFkZGVkIGJ5IFRlcnJ5IE1jQ29ubmVsbCwKKyAgU3lyYWN1c2UgVW5pdmVyc2l0eSA8dG1jQGJhcm55YXJkLnN5ci5lZHU+CisgIE5vIG1vcmUgc2d0dHkgaW50ZXJmYWNlLCBwb3NpeCBjb21wbGlhbnQuCisqLworI2lmZGVmIE1JTklYMgorI2RlZmluZSBfTUlOSVggICAvKiBOZWVkZWQgZm9yIHNvbWUgTWluaXggaGVhZGVyIGZpbGVzICovCisjdW5kZWYgTUlOSVggICAgIC8qIE9sZCBtaW5peCAxLjA6IHVzZWQgc2d0dHkgaW50ZXJmYWNlICovCisjZGVmaW5lIEJTRDQ0T1JQT1NJWAorI2RlZmluZSBTVk9SUE9TSVgKKyNkZWZpbmUgRENMVElNRVZBTAorI2RlZmluZSBOT0ZJTEVICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI3VuZGVmIFRJT0NHRVRDICAgIC8qIGRlZmluZWQgaW4gc3lzL2lvY3RsLmgsIGJ1dCBub3QgcmVhbGx5IHN1cHBvcnRlZCAqLworI2RlZmluZSBUQU5ERU0gMAorI2VuZGlmIC8qIE1JTklYMiAqLworCisvKgorIE1JTklYIDEuMCBzdXBwb3J0IGFkZGVkIGJ5IENoYXJsZXMgSGVkcmljaywKKyBSdXRnZXJzIFVuaXZlcnNpdHkgPGhlZHJpY2tAYXJhbWlzLnJ1dGdlcnMuZWR1Pi4KKyBNSU5JWCBhbHNvIGhhcyBWNyBlbmFibGVkLgorKi8KKyNpZmRlZiBNSU5JWAorI2RlZmluZSBUQU5ERU0gMAorI2RlZmluZSBNWVJFQUQKKyNkZWZpbmUgTk9TWVNJT0NUTEgKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbmRpZiAvKiBNSU5JWCAqLworCisjaWZkZWYgQ0tfUkVESVIJCS8qIDxzeXMvd2FpdC5oPiBuZWVkZWQgb25seSBmb3IgUkVESVJFQ1QgY29tbWFuZC4gKi8KKy8qCisgIElmIGFueWJvZHkgY2FuIGZpZ3VyZSBvdXQgaG93IHRvIG1ha2UgdGhpcyB3b3JrIHdpdGggTmVYVFNURVAsIGJlCisgIG15IGd1ZXN0ISAgKE5lWFRCbGFoL05lWFRCbGFoL2JzZC9zeXMvd2FpdC5oIGRvZXMgbm90IGRlZmluZSBXRVhJVFNUQVRVUykKKyovCisjaWZuZGVmIENLX1dBSVRfSAkJCS8qIElmIHdhaXQuaCBub3QgYWxyZWFkeSBpbmNsdWRlZC4uLiAqLworI2lmZGVmIE9TRgkJCQkvKiBmb3JjZSBPU0YgdG8gc2VsZWN0IFBPU0lYIHdhaXQgKi8KKyNpZmRlZiBfQlNECQkJCS8qIGluc3RlYWQgb2YgQlNEIChzZWUgY2tjZGViLmgpICovCisjZGVmaW5lIENLX09TRl9CU0QKKyN1bmRlZiBfQlNECisjZW5kaWYgLyogX0JTRCAqLworI2VuZGlmIC8qIE9TRiAqLworI2luY2x1ZGUgPHN5cy93YWl0Lmg+CQkJLyogSW5jbHVkZSBpdCAqLworI2lmZGVmIE9TRgorI2lmZGVmIENLX09TRl9CU0QKKyNkZWZpbmUgX0JTRAkJCQkvKiBSZXN0b3JlIGl0ICovCisjdW5kZWYgQ0tfT1NGX0JTRAorI2VuZGlmIC8qIENLX09TRl9CU0QgKi8KKyNlbmRpZiAvKiBPU0YgKi8KKyNlbmRpZiAvKiBDS19XQUlUX0ggKi8KKyNlbmRpZiAvKiBDS19SRURJUiAqLworCisjaW5jbHVkZSAiY2t1dmVyLmgiCQkJLyogVmVyc2lvbiBoZXJhbGQgKi8KK2NoYXIgKmNreHN5cyA9IEhFUkFMRDsKKworI2lmZGVmIENLX1VUU05BTUUKKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCisjaWZkZWYgVFJVNjQJCQkJLyogVHJ1NjQgVU5JWCA0LjAgYW5kIGxhdGVyICovCisvKiBWZXJpZmllZCBvbiBUcnU2NCA0LjBGIC0gbWlnaHQgYnJlYWsgb24gNC4wRSBvciBlYXJsaWVyICovCisjaW5jbHVkZSA8c3lzL3N5c2luZm8uaD4JCS8qIChkb24ndCBrbm93IGFib3V0IE9TRi8xIG9yIERVKSAqLworI2luY2x1ZGUgPG1hY2hpbmUvaGFsX3N5c2luZm8uaD4KKyNlbmRpZiAvKiBUUlU2NCAqLworCisjaWZkZWYgU09MQVJJUzI1CQkJLyogU29sYXJpcyAyLjUgYW5kIGxhdGVyICovCisjaW5jbHVkZSA8c3lzL3N5c3RlbWluZm8uaD4JCS8qIChkb24ndCBrbm93IGFib3V0IGVhcmxpZXIgb25lcykgKi8KKyNlbmRpZiAvKiBTT0xBUklTMjUgKi8KKworI2lmZGVmIFVXNworI2lmbmRlZiBTWVNfTk1MTgorI2RlZmluZSBTWVNfTk1MTiAyNTcKKyNlbmRpZiAvKiBOTUxOICovCisjZW5kaWYgLyogVVc3ICovCisjaWZkZWYgSFBVWDlQTFVTCitzdGF0aWMgaW50IGhwaXM4MDAgPSAwOworI2VuZGlmIC8qIEhQVVg5UExVUyAqLworI2lmZGVmIFNZU19OTUxOCisjZGVmaW5lIENLX1NZU05NTE4gU1lTX05NTE4KKyNlbHNlCisjaWZkZWYgX1NZU19OTUxOCisjZGVmaW5lIENLX1NZU05NTE4gX1NZU19OTUxOCisjZWxzZQorI2lmZGVmIFVUU0xFTgorI2RlZmluZSBDS19TWVNOTUxOIFVUU0xFTgorI2Vsc2UKKyNkZWZpbmUgQ0tfU1lTTk1MTiAzMQorI2VuZGlmIC8qIFVUU0xFTiAqLworI2VuZGlmIC8qIF9TWVNfTk1MTiAqLworI2VuZGlmIC8qIFNZU19OTUxOICovCitjaGFyIHVubV9tY2hbQ0tfU1lTTk1MTisxXSA9IHsgJ1wwJywgJ1wwJyB9OworY2hhciB1bm1fbW9kW0NLX1NZU05NTE4rMV0gPSB7ICdcMCcsICdcMCcgfTsKK2NoYXIgdW5tX25hbVtDS19TWVNOTUxOKzFdID0geyAnXDAnLCAnXDAnIH07CitjaGFyIHVubV9yZWxbQ0tfU1lTTk1MTisxXSA9IHsgJ1wwJywgJ1wwJyB9OworY2hhciB1bm1fdmVyW0NLX1NZU05NTE4rMV0gPSB7ICdcMCcsICdcMCcgfTsKKyNlbmRpZiAvKiBDS19VVFNOQU1FICovCisKKyNpZmRlZiBDSUUKKyNpbmNsdWRlIDxzdGF0Lmg+CQkJLyogRm9yIGNoYXNpbmcgc3ltbGlua3MsIGV0Yy4gKi8KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZiAvKiBDSUUgKi8KKworLyogVVVDUCBsb2NrZmlsZSBtYXRlcmlhbC4uLiAqLworCisjaWZuZGVmIE5PVVVDUAorI2lmZGVmIFVTRVRUWUxPQ0sKKyNpZmRlZiBIQVZFX0JBVURCT1kJCQkvKiBSZWQgSGF0IGJhdWRib3kvbG9ja2RldiAqLworI2luY2x1ZGUgPGJhdWRib3kuaD4KKyNlbHNlCisjaWZkZWYgVVNFX1VVX0xPQ0sKKyNpZmRlZiBfX0ZyZWVCU0RfXworI2luY2x1ZGUgPGxpYnV0aWwuaD4JCQkvKiBGcmVlQlNEICovCisjZWxzZQorI2luY2x1ZGUgPHV0aWwuaD4JCQkvKiBPcGVuQlNEICovCisjZW5kaWYgLyogSEFWRV9CQVVEQk9ZICovCisjZW5kaWYgLyogX19GcmVlQlNEICovCisjZW5kaWYgLyogVVNFX1VVX0xPQ0sgKi8KKyNlbHNlICAvKiBVU0VUVFlMT0NLICovCisKKy8qIE5hbWUgb2YgVVVDUCB0dHkgZGV2aWNlIGxvY2tmaWxlICovCisKKyNpZmRlZiBMSU5VWEZTU1RORAorI2lmbmRlZiBIREJVVUNQCisjZGVmaW5lIEhEQlVVQ1AKKyNlbmRpZiAvKiBIREJVVUNQICovCisjZW5kaWYgLyogTElOVVhGU1NUTkQgKi8KKworI2lmZGVmIEFDVUNOVFJMCisjZGVmaW5lIExDS0RJUgorI2VuZGlmIC8qIEFDVUNOVFJMICovCisKKy8qCisgIFBJRFNUUklORyBtZWFucyB1c2UgQVNDSUkgc3RyaW5nIHRvIHJlcHJlc2VudCBwaWQgaW4gbG9ja2ZpbGUuCisqLworI2lmbmRlZiBQSURTVFJJTkcKKyNpZmRlZiBIREJVVUNQCisjZGVmaW5lIFBJRFNUUklORworI2Vsc2UKKyNpZmRlZiBCU0Q0NAorI2RlZmluZSBQSURTVFJJTkcKKyNlbHNlCisjaWZkZWYgUlRBSVgKKyNkZWZpbmUgUElEU1RSSU5HCisjZWxzZQorI2lmZGVmIEFJWFJTCisjZGVmaW5lIFBJRFNUUklORworI2Vsc2UKKyNpZmRlZiBDT0hFUkVOVAorI2RlZmluZSBQSURTVFJJTkcKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworI2VuZGlmIC8qIEFJWFJTICovCisjZW5kaWYgLyogUlRBSVggKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworI2VuZGlmIC8qIEhEQlVVQ1AgKi8KKyNlbmRpZiAvKiBQSURTVFJJTkcgKi8KKworLyogTm93IHRoZSBQSURTVFJJTkcgZXhjZXB0aW9ucy4uLiAqLworCisjaWZkZWYgUElEU1RSSU5HCisjaWZkZWYgSFBVWAorI3VuZGVmIFBJRFNUUklORworI2VuZGlmIC8qIEhQVVggKi8KKyNlbmRpZiAvKiBQSURTVFJJTkcgKi8KKworI2lmZGVmIF9fYnNkaV9fCQkJCS8qIEJTREkgKGF0IGxlYXN0IHRocnUgMS4xKSAqLworI2lmZGVmIFBJRFNUUklORworI3VuZGVmIFBJRFNUUklORworI2VuZGlmIC8qIFBJRFNUUklORyAqLworI2VuZGlmIC8qIF9fYnNkaV9fICovCisKKyNpZmRlZiBPU0YzMgkJCQkvKiBEaWdpdGFsIFVOSVggKE9TRi8xKSAzLjIgKi8KKyNpZmRlZiBQSURTVFJJTkcKKyN1bmRlZiBQSURTVFJJTkcKKyNlbmRpZiAvKiBQSURTVFJJTkcgKi8KKyNlbmRpZiAvKiBPU0YzMiAqLworCisvKgorICBMT0NLX0RJUiBpcyB0aGUgbmFtZSBvZiB0aGUgbG9ja2ZpbGUgZGlyZWN0b3J5LgorICBJZiBMT0NLX0RJUiBpcyBhbHJlYWR5IGRlZmluZWQgKGUuZy4gb24gY29tbWFuZCBsaW5lKSwgd2UgZG9uJ3QgY2hhbmdlIGl0LgorKi8KKworI2lmbmRlZiBMT0NLX0RJUgorI2lmZGVmIE1BQ09TWAorI2RlZmluZSBMT0NLX0RJUiAiL3Zhci9zcG9vbC9sb2NrIgorI2VuZGlmIC8qIE1BQ09TWCAqLworI2VuZGlmLyogTE9DS19ESVIgKi8KKworI2lmbmRlZiBMT0NLX0RJUgorI2lmZGVmIEJTRDQ0CisjaWZkZWYgX18zODZCU0RfXworI2RlZmluZSBMT0NLX0RJUiAiL3Zhci9zcG9vbC9sb2NrIgorI2Vsc2UKKyNpZmRlZiBfX0ZyZWVCU0RfXworI2RlZmluZSBMT0NLX0RJUiAiL3Zhci9zcG9vbC9sb2NrIgorI2Vsc2UKKyNpZmRlZiBfX05ldEJTRF9fCisjZGVmaW5lIExPQ0tfRElSICIvdmFyL3Nwb29sL2xvY2siCisjZWxzZQorI2lmZGVmIF9fT3BlbkJTRF9fCisjZGVmaW5lIExPQ0tfRElSICIvdmFyL3Nwb29sL2xvY2siCisjZWxzZQorLyogU28gd2hpY2ggb25lcyBpcyB0aGlzIGZvcj8gKi8KKy8qIFByb2JhYmx5IG9yaWdpbmFsIDQuNEJTRCBvbiBWYW5nb2doICovCisvKiBQbHVzIHdobyBrbm93cyBhYm91dCBNYWMgT1MgWC4uLiBJdCBkb2Vzbid0IGV2ZW4gaGF2ZSBhIGN1IHByb2dyYW0gKi8KKyNkZWZpbmUgTE9DS19ESVIgIi92YXIvc3Bvb2wvdXVjcCIKKyNlbmRpZiAvKiBfX09wZW5CU0RfXyAqLworI2VuZGlmIC8qIF9fTmV0QlNEX18gKi8KKyNlbmRpZiAvKiBfX0ZyZWVCU0RfXyAqLworI2VuZGlmIC8qIF9fMzg2QlNEX18gKi8KKyNlbHNlCisjaWZkZWYgREdVWDQzMAorI2RlZmluZSBMT0NLX0RJUiAiL3Zhci9zcG9vbC9sb2NrcyIKKyNlbHNlCisjaWZkZWYgSFBVWDEwCisjZGVmaW5lIExPQ0tfRElSICIvdmFyL3Nwb29sL2xvY2tzIgorI2Vsc2UKKyNpZmRlZiBSVEFJWAkJCQkvKiBJQk0gUlQgUEMgQUlYIDIuMi4xICovCisjZGVmaW5lIExPQ0tfRElSICIvZXRjL2xvY2tzIgorI2Vsc2UKKyNpZmRlZiBBSVhSUworI2RlZmluZSBMT0NLX0RJUiAiL2V0Yy9sb2NrcyIKKyNlbHNlCisjaWZkZWYgSVNJSUkKKyNkZWZpbmUgTE9DS19ESVIgIi9ldGMvbG9ja3MiCisjZWxzZQorI2lmZGVmIEhEQlVVQ1AKKyNpZmRlZiBNX1NZUzUKKyNkZWZpbmUgTE9DS19ESVIgIi91c3Ivc3Bvb2wvdXVjcCIKKyNlbHNlCisjaWZkZWYgTV9VTklYCisjZGVmaW5lIExPQ0tfRElSICIvdXNyL3Nwb29sL3V1Y3AiCisjZWxzZQorI2lmZGVmIFNWUjQKKyNkZWZpbmUgTE9DS19ESVIgIi92YXIvc3Bvb2wvbG9ja3MiCisjZWxzZQorI2lmZGVmIFNVTk9TNAorI2RlZmluZSBMT0NLX0RJUiAiL3Zhci9zcG9vbC9sb2NrcyIKKyNlbHNlCisjaWZkZWYgTElOVVhGU1NUTkQKKyNkZWZpbmUgTE9DS19ESVIgIi92YXIvbG9jayI7CisjZWxzZQorI2RlZmluZSBMT0NLX0RJUiAiL3Vzci9zcG9vbC9sb2NrcyIKKyNlbmRpZiAvKiBMSU5VWEZTU1RORCAqLworI2VuZGlmIC8qIFNVTk9TNCAqLworI2VuZGlmIC8qIFNWUjQgKi8KKyNlbmRpZiAvKiBNX1VOSVggKi8KKyNlbmRpZiAvKiBNX1NZUzUgKi8KKyNlbHNlCisjaWZkZWYgTENLRElSCisjZGVmaW5lIExPQ0tfRElSICIvdXNyL3Nwb29sL3V1Y3AvTENLIgorI2Vsc2UKKyNpZmRlZiBDT0hFUkVOVAorI2RlZmluZSBMT0NLX0RJUiAiL3Vzci9zcG9vbC91dWNwIgorI2Vsc2UKKyNkZWZpbmUgTE9DS19ESVIgIi91c3Ivc3Bvb2wvdXVjcCIKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworI2VuZGlmIC8qIExDS0RJUiAqLworI2VuZGlmIC8qIEhEQlVVQ1AgKi8KKyNlbmRpZiAvKiBJU0lJSSAqLworI2VuZGlmIC8qIEFJWFJTICovCisjZW5kaWYgLyogUlRBSVggKi8KKyNlbmRpZiAvKiBIUFVYMTAgKi8KKyNlbmRpZiAvKiBER1VYNDMwICovCisjZW5kaWYgLyogQlNENDQgKi8KKyNlbmRpZiAvKiAhTE9DS19ESVIgKG91dHNpZGUgaWZuZGVmKSAqLworCisjaWZkZWYgT1NGMgkJCQkvKiBPU0YvMSAyLjAgb3IgbGF0ZXIgKi8KKyNpZmRlZiBMT0NLX0RJUgkJCQkvKiAobWF5YmUgMS54IHRvbywgd2hvIGtub3dzLi4uKSAqLworI3VuZGVmIExPQ0tfRElSCisjZGVmaW5lIExPQ0tfRElSICIvdmFyL3Nwb29sL2xvY2tzIgorI2VuZGlmIC8qIExPQ0tfRElSICovCisjZW5kaWYgLyogT1NGMiAqLworCisjaWZkZWYgQ09NTUVOVAorLyogU29ycnkgbm8gbW9yZSBsb2NrZigpIC0tIHdlIGxvY2sgZmlyc3QgYW5kIFRIRU4gb3BlbiB0aGUgZGV2aWNlLiAqLworI2lmZGVmIFNWUjQKKyNpZm5kZWYgQlNENDQKKyNpZm5kZWYgTE9DS0YKKyNkZWZpbmUgTE9DS0YJCQkJLyogVXNlIGxvY2tmKCkgb24gdHR5IGRldmljZSBpbiBTVlI0ICovCisjZW5kaWYgLyogTE9DS0YgKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworI2VuZGlmIC8qIFNWUjQgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBOT0xPQ0tGCQkJCS8qIEJ1dCBOT0xPQ0tGIGNhbmNlbHMgTE9DS0YgKi8KKyNpZmRlZiBMT0NLRgorI3VuZGVmIExPQ0tGCisjZW5kaWYgLyogTE9DS0YgKi8KKyNlbmRpZiAvKiBOT0xPQ0tGICovCisKKy8qIE1vcmUgYWJvdXQgdGhpcyBiZWxvdy4uLiAqLworCisjZW5kaWYgLyogVVNFVFRZTE9DSyAqLworI2VuZGlmIC8qIE5PVVVDUCAqLworCisvKgorICBNWVJFQUQgbWVhbnMgdXNlIG91ciBpbnRlcm5hbGx5IGRlZmluZWQgbm9uYmxvY2tpbmcgYnVmZmVyZWQgcmVhZCByb3V0aW5lLgorKi8KKyNpZmRlZiBBVFRTVgorI2RlZmluZSBNWVJFQUQKKyNlbmRpZiAvKiBBVFRTViAqLworCisjaWZkZWYgQVRUNzMwMAorI2lmbmRlZiBNWVJFQUQKKyNkZWZpbmUgTVlSRUFECisjZW5kaWYgLyogTVlSRUFEICovCisvKiBiaXRzIGZvciBhdHRtb2RlbTogaW50ZXJuYWwgbW9kZW0gaW4gdXNlLCByZXN0YXJ0IGdldHR5ICovCisjZGVmaW5lIElTTU9ERU0gMQorI2RlZmluZSBET0dFVFkgNTEyCisjZW5kaWYgIC8qIEFUVDczMDAgKi8KKworI2lmZGVmIEJTRDQyCisjZGVmaW5lIE1ZUkVBRAorI2VuZGlmIC8qIEJTRDQyICovCisKKyNpZmRlZiBQT1NJWAorI2RlZmluZSBNWVJFQUQKKyNlbmRpZiAvKiBQT1NJWCAqLworI2lmZGVmIF9fYnNkaV9fCisjaWZuZGVmIE9fTkRFTEFZCisjZGVmaW5lIE9fTkRFTEFZIE9fTk9OQkxPQ0sKKyNlbmRpZiAvKiBPX05ERUxBWSAqLworI2VuZGlmIC8qIF9fYnNkaV9fICovCisKKy8qCisgVmFyaWFibGVzIGF2YWlsYWJsZSB0byBvdXRzaWRlIHdvcmxkOgorCisgICBkZnR0eSAgLS0gUG9pbnRlciB0byBkZWZhdWx0IHR0eSBuYW1lIHN0cmluZywgbGlrZSAiL2Rldi90dHkiLgorICAgZGZsb2MgIC0tIDAgaWYgZGZ0dHkgaXMgY29uc29sZSwgMSBpZiBleHRlcm5hbCBsaW5lLgorICAgZGZwcnR5IC0tIERlZmF1bHQgcGFyaXR5CisgICBkZmZsb3cgLS0gRGVmYXVsdCBmbG93IGNvbnRyb2wKKyAgIGNreGVjaCAtLSBGbGFnIGZvciB3aG8gZWNob2VzIGNvbnNvbGUgdHlwZWluOgorICAgICAxIC0gVGhlIHByb2dyYW0gKHN5c3RlbSBlY2hvIGlzIHR1cm5lZCBvZmYpCisgICAgIDAgLSBUaGUgc3lzdGVtIChvciBmcm9udCBlbmQsIG9yIHRlcm1pbmFsKS4KKyAgIGZ1bmN0aW9ucyB0aGF0IHdhbnQgdG8gZG8gdGhlaXIgb3duIGVjaG9pbmcgc2hvdWxkIGNoZWNrIHRoaXMgZmxhZworICAgYmVmb3JlIGRvaW5nIHNvLgorCisgICBmbGZuYW0gIC0tIE5hbWUgb2YgbG9jayBmaWxlLCBpbmNsdWRpbmcgaXRzIHBhdGgsIGUuZy4sCisgICAgICAgICAgICAgICAgIi91c3Ivc3Bvb2wvdXVjcC9MQ0suLmN1bDAiIG9yICIvZXRjL2xvY2tzL3R0eTc3IgorICAgbGtmbGZuICAtLSBOYW1lIG9mIGxpbmsgdG8gbG9jayBmaWxlLCBpbmNsdWRpbmcgaXRzIHBhdGhzCisgICBoYXNsb2NrIC0tIEZsYWcgc2V0IGlmIHRoaXMga2VybWl0IGVzdGFibGlzaGVkIGEgdXVjcCBsb2NrLgorICAgbG9ja3BpZCAtLSBQSUQgb2Ygb3RoZXIgcHJvY2VzcyB0aGF0IGhhcyBkZXNpcmVkIGxpbmUgb3BlbiwgYXMgc3RyaW5nLgorICAgYmFja2dyZCAtLSBGbGFnIGluZGljYXRpbmcgcHJvZ3JhbSBleGVjdXRpbmcgaW4gYmFja2dyb3VuZCAoICYgb24KKyAgICAgICAgICAgICAgICBlbmQgb2Ygc2hlbGwgY29tbWFuZCkuIFVzZWQgdG8gaWdub3JlIElOVCBhbmQgUVVJVCBzaWduYWxzLgorICAgcnR1X2J1ZyAtLSBTZXQgYnkgc3RwdHJhcCgpLiAgUlRVIHRyZWF0cyBeWiBhcyBFT0YgKGJ1dCBvbmx5IHdoZW4gd2UgaGFuZGxlCisgICAgICAgICAgICAgICAgU0lHVFNUUCkKKworIEZ1bmN0aW9ucyBmb3IgYXNzaWduZWQgY29tbXVuaWNhdGlvbiBsaW5lIChlaXRoZXIgZXh0ZXJuYWwgb3IgY29uc29sZSB0dHkpOgorCisgICBzeXNpbml0KCkgICAgICAgICAgICAgICAtLSBTeXN0ZW0gZGVwZW5kZW50IHByb2dyYW0gaW5pdGlhbGl6YXRpb24KKyAgIHN5c2NsZWFudXAoKSAgICAgICAgICAgIC0tIFN5c3RlbSBkZXBlbmRlbnQgcHJvZ3JhbSBzaHV0ZG93bgorICAgdHRvcGVuKHR0bmFtZSxsb2NhbCxtZG10eXAsdGltbykgLS0gT3BlbiB0aGUgbmFtZWQgdHR5IGZvciBleGNsdXNpdmUgYWNjZXNzLgorICAgdHRjbG9zKCkgICAgICAgICAgICAgICAgLS0gQ2xvc2UgJiByZXNldCB0aGUgdHR5LCByZWxlYXNpbmcgYW55IGFjY2VzcyBsb2NrLgorICAgdHRzc3BkKGNwcykgICAgICAgICAgICAgLS0gU2V0IHRoZSB0cmFuc21pc3Npb24gc3BlZWQgb2YgdGhlIHR0eS4KKyAgIHR0Z3NwZCgpICAgICAgICAgICAgICAgIC0tIEdldCAocmVhZCkgdGhlIHRoZSB0cmFuc21pc3Npb24gc3BlZWQgb2YgdGhlIHR0eS4KKyAgIHR0cGt0KHNwZWVkLGZsb3cscGFyaXR5KSAtLSBQdXQgdGhlIHR0eSBpbiBwYWNrZXQgbW9kZSBhbmQgc2V0IHRoZSBzcGVlZC4KKyAgIHR0dnQoc3BlZWQsZmxvdykgICAgICAgIC0tIFB1dCB0aGUgdHR5IGluIHZpcnR1YWwgdGVybWluYWwgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW4gRElBTElORyBvciBDT05ORUNURUQgbW9kZW0gY29udHJvbCBzdGF0ZS4KKyAgIHR0cmVzKCkgICAgICAgICAgICAgICAgIC0tIFJlc3RvcmUgb3JpZ2luYWwgdHR5IG1vZGVzLgorICAgdHRzY2FycihjYXJyaWVyKSAgICAgICAgLS0gU2V0IGNhcnJpZXIgY29udHJvbCBtb2RlLCBvbi9vZmYvYXV0by4KKyAgIHR0aW5sKGRlc3QsbWF4LHRpbW8pICAgIC0tIFRpbWVkIHJlYWQgbGluZSBmcm9tIHRoZSB0dHkuCisgICB0dGluYyh0aW1vKSAgICAgICAgICAgICAtLSBUaW1lZCByZWFkIGNoYXJhY3RlciBmcm9tIHR0eS4KKyAgIG15cmVhZCgpICAgICAgICAgICAgICAgIC0tIFJhdyBtb2RlIGJ1bGsgYnVmZmVyIHJlYWQsIGdpdmVzIHN1YnNlcXVlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnMgb25lIGF0IGEgdGltZSBhbmQgc2ltdWxhdGVzIEZJT05SRUFELgorICAgbXl1bnJkKGMpICAgICAgICAgICAgICAgLS0gUGxhY2VzIGMgYmFjayBpbiBidWZmZXIgdG8gYmUgcmVhZCAob25lIG9ubHkpCisgICB0dGNoaygpICAgICAgICAgICAgICAgICAtLSBTZWUgaG93IG1hbnkgY2hhcmFjdGVycyBpbiB0dHkgaW5wdXQgYnVmZmVyLgorICAgdHR4aW4obixidWYpICAgICAgICAgICAgLS0gUmVhZCBuIGNoYXJhY3RlcnMgZnJvbSB0dHkgKHVudGltZWQpLgorICAgdHRvbChzdHJpbmcsbGVuZ3RoKSAgICAgLS0gV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHR0eS4KKyAgIHR0b2MoYykgICAgICAgICAgICAgICAgIC0tIFdyaXRlIGEgY2hhcmFjdGVyIHRvIHRoZSB0dHkuCisgICB0dGZsdWkoKSAgICAgICAgICAgICAgICAtLSBGbHVzaCB0dHkgaW5wdXQgYnVmZmVyLgorICAgdHRzbmRiKCkgICAgICAgICAgICAgICAgLS0gU2VuZCBCUkVBSyBzaWduYWwuCisgICB0dHNuZGxiKCkgICAgICAgICAgICAgICAtLSBTZW5kIExvbmcgQlJFQUsgc2lnbmFsLgorCisgICB0dGxvY2sodHRuYW1lKSAgICAgICAgICAtLSAiTG9jayIgdHR5IGRldmljZSBhZ2FpbnN0IHV1Y3AgY29sbGlzaW9ucy4KKyAgIHR0dW5sY2soKSAgICAgICAgICAgICAgIC0tIFVubG9jayB0dHkgZGV2aWNlLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQVRUNzMwMC9Vbml4IFBDLCBTeXN0ZW0gVjoKKyAgIGF0dGRpYWwodHRuYW1lLHNwZWVkLHRlbG5icikgLS0gZGlhbHMgQVRUNzMwMC9Vbml4IFBDIGludGVybmFsIG1vZGVtCisgICBvZmZnZXR0eSh0dG5hbWUpICAgICAgICAtLSBUdXJucyBvZmYgZ2V0dHkoMW0pIGZvciBjb21tcyBsaW5lCisgICBvbmdldHR5KHR0bmFtZSkgICAgICAgICAtLSBSZXN0b3JlcyBnZXR0eSgpIHRvIGNvbW1zIGxpbmUKKyovCisKKy8qCitGdW5jdGlvbnMgZm9yIGNvbnNvbGUgdGVybWluYWw6CisKKyAgIGNvbmdtKCkgICAtLSBHZXQgY29uc29sZSB0ZXJtaW5hbCBtb2Rlcy4KKyAgIGNvbmNiKGVzYykgLS0gUHV0IHRoZSBjb25zb2xlIGluIHNpbmdsZS1jaGFyYWN0ZXIgd2FrZXVwIG1vZGUgd2l0aCBubyBlY2hvLgorICAgY29uYmluKGVzYykgLS0gUHV0IHRoZSBjb25zb2xlIGluIGJpbmFyeSAocmF3KSBtb2RlLgorICAgY29ucmVzKCkgIC0tIFJlc3RvcmUgdGhlIGNvbnNvbGUgdG8gbW9kZSBvYnRhaW5lZCBieSBjb25nbSgpLgorICAgY29ub2MoYykgIC0tIFVuYnVmZmVyZWQgb3V0cHV0LCBvbmUgY2hhcmFjdGVyIHRvIGNvbnNvbGUuCisgICBjb25vbChzKSAgLS0gVW5idWZmZXJlZCBvdXRwdXQsIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGNvbnNvbGUuCisgICBjb25vbGEocykgLS0gVW5idWZmZXJlZCBvdXRwdXQsIGFycmF5IG9mIHN0cmluZ3MgdG8gdGhlIGNvbnNvbGUuCisgICBjb254byhuLHMpIC0tIFVuYnVmZmVyZWQgb3V0cHV0LCBuIGNoYXJhY3RlcnMgdG8gdGhlIGNvbnNvbGUuCisgICBjb25jaGsoKSAgLS0gQ2hlY2sgaWYgY2hhcmFjdGVycyBhdmFpbGFibGUgYXQgY29uc29sZSAoYnNkIDQuMikuCisgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXNjYXBlIGNoYXIgKF5cKSB0eXBlZCBhdCBjb25zb2xlIChTeXN0ZW0gSUlJL1YpLgorICAgY29uaW5jKHRpbW8pICAtLSBUaW1lZCBnZXQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgY29uc29sZS4KKyAgIGNvbmdrcyh0aW1vKSAgLS0gVGltZWQgZ2V0IGtleWJvYXJkIHNjYW4gY29kZS4KKyAgIGNvbmludCgpICAtLSBFbmFibGUgdGVybWluYWwgaW50ZXJydXB0cyBvbiB0aGUgY29uc29sZSBpZiBub3QgYmFja2dyb3VuZC4KKyAgIGNvbm5vaSgpICAtLSBEaXNhYmxlIHRlcm1pbmFsIGludGVycnVwdHMgb24gdGhlIGNvbnNvbGUgaWYgbm90IGJhY2tncm91bmQuCisKK1RpbWUgZnVuY3Rpb25zCisKKyAgIG1zbGVlcChtKSAtLSBNaWxsaXNlY29uZCBzbGVlcAorICAgenRpbWUoJnMpIC0tIFJldHVybiBwb2ludGVyIHRvIGRhdGUvdGltZSBzdHJpbmcKKyAgIHJ0aW1lcigpIC0tICBSZXNldCB0aW1lcgorICAgZ3RpbWVyKCkgIC0tIEdldCBlbGFwc2VkIHRpbWUgc2luY2UgbGFzdCBjYWxsIHRvIHJ0aW1lcigpCisqLworCisvKiBDb25kaXRpb25hbCBJbmNsdWRlcyAqLworCisvKiBXaGV0aGVyIHRvIGluY2x1ZGUgPHN5cy9maWxlLmg+ICovCisKKyNpZmRlZiBSVFUJCQkJLyogUlRVIGRvZXNuJ3QgKi8KKyNkZWZpbmUgTk9GSUxFSAorI2VuZGlmIC8qIFJUVSAqLworCisjaWZkZWYgQ0lFCQkJCS8qIENJRSBkb2VzLiAqLworI3VuZGVmIE5PRklMRUgKKyNlbmRpZiAvKiBDSUUgKi8KKworI2lmZGVmIEJTRDQxCQkJCS8qIDQuMSBCU0QgZG9lc24ndCAqLworI2RlZmluZSBOT0ZJTEVICisjZW5kaWYgLyogQlNENDEgKi8KKworI2lmZGVmIGlzNjhrCQkJCS8qIEludGVncmF0ZWQgU29sdXRpb25zIDY4MDAwIFVOSVggICovCisjZGVmaW5lIE5PRklMRUgJCQkJLyogZS5nLiBvbiBQbGV4dXggUDYwIGFuZCBTdW4tMSAqLworI2VuZGlmIC8qIGlzNjhrICovCisKKyNpZmRlZiBNSU5JWAkJCQkvKiBNSU5JWCAqLworI2RlZmluZSBOT0ZJTEVICisjZW5kaWYgLyogTUlOSVggKi8KKworI2lmZGVmIENPSEVSRU5UCQkJCS8qIENvaGVyZW50ICovCisjZGVmaW5lIE5PRklMRUgKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisjaWZuZGVmIE5PRklMRUgJCQkJLyogTm93IGluY2x1ZGUgaWYgc2VsZWN0ZWQuICovCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNlbmRpZiAvKiBOT0ZJTEVIICovCisKKy8qIFBPU0lYICovCisKKyNpZmRlZiBCU0Q0NE9SUE9TSVgJCQkvKiBQT1NJWCB1c2VzIHRlcm1pb3MuaCAqLworI2RlZmluZSBURVJNSU9TCisjaWZkZWYgX19ic2RpX18KKyNpZmRlZiBQT1NJWAorI3VuZGVmIF9QT1NJWF9TT1VSQ0UJCQkvKiBHZXQgZXh0cmEgc3R1ZmYgZnJvbSB0ZXJtaW9zLmggKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworI2VuZGlmIC8qIF9fYnNkaV9fICovCisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2lmZGVmIExJTlVYCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYgLyogTElOVVggKi8KKyNpZmRlZiBRTlgxNgorI2luY2x1ZGUgPGlvY3RsLmg+CisjZWxzZQorI2lmZGVmIFFOWDYKKyNpbmNsdWRlIDxpb2N0bC5oPgorI2VuZGlmIC8qIFFOWDYgKi8KKyNlbmRpZiAvKiBRTlgxNiAqLworI2lmZGVmIF9fYnNkaV9fCisjaWZkZWYgUE9TSVgKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRQorI2VuZGlmIC8qIFBPU0lYICovCisjZW5kaWYgLyogX19ic2RpX18gKi8KKyNpZm5kZWYgQlNENDQJCQkJLyogUmVhbGx5IFBPU0lYICovCisjaWZuZGVmIENLX1FOWDMyCQkJLyogd2FzIENLX1FOWDMyICovCisjZGVmaW5lIE5PU1lTSU9DVExICQkJLyogTm8gaW9jdGwncyBhbGxvd2VkLiAqLworI3VuZGVmIHVsdHJpeAkJCQkvKiBUdXJuIG9mZiBhbnkgdWx0cml4IGZlYXR1cmVzLiAqLworI2VuZGlmIC8qIENLX1FOWDMyICovCisjZW5kaWYgLyogQlNENDQgKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworCisvKiBTeXN0ZW0gSUlJLCBTeXN0ZW0gViAqLworCisjaWZkZWYgQVRUU1YKKyNpZm5kZWYgQlNENDQKKyNpZm5kZWYgUE9TSVgKKyNpbmNsdWRlIDx0ZXJtaW8uaD4KKyNlbmRpZiAvKiBQT1NJWCAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisjaWZkZWYgVEVSTUlPWAorLyogTmVlZCB0aGlzIGZvciB0ZXJtaW94IHN0cnVjdHVyZSwgUlRTL0NUUyBhbmQgRFRSL0NEIGZsb3cgY29udHJvbCAqLworI2luY2x1ZGUgPHRlcm1pb3guaD4KKyAgc3RydWN0IHRlcm1pb3ggcmN0c3g7CisjZWxzZQorI2lmZGVmIFNURVJNSU9YCisjaWZkZWYgU0NPX09TUjUwNAorLyogU29ycnksIHRoaXMgaXMgdHJ1bHkgZGlzZ3VzdGluZyBidXQgaXQncyBTQ08ncyBmYXVsdC4gKi8KKyNpZm5kZWYgX1NWSUQzCisjZGVmaW5lIF9DS19TVklEM19YCisjZGVmaW5lIF9TVklEMworI2VuZGlmIC8qIF9TVklEMyAqLworI2VuZGlmIC8qIFNDT19PU1I1MDQgKi8KKyNpbmNsdWRlIDxzeXMvdGVybWlveC5oPgorICBzdHJ1Y3QgdGVybWlveCByY3RzeDsKKyNpZmRlZiBDS19TVklEM19YCisjdW5kZWYgX1NWSUQzCisjdW5kZWYgQ0tfU1ZJRDNfWAorI2VuZGlmIC8qIENLX1NWSUQzX1ggKi8KKyNlbmRpZiAvKiBTVEVSTUlPWCAqLworI2VuZGlmIC8qIFRFUk1JT1ggKi8KKyNlbmRpZiAvKiBBVFRTViAqLworCisjaWZkZWYgQ09IRVJFTlQJCQkvKiBVc2UgdGVybWlvLmgsIG5vdCBzZ3R0eS5oIGZvciBDb2hlcmVudCAqLworI2luY2x1ZGUgPHRlcm1pby5oPgorI2VuZGlmIC8qIENPSEVSRU5UICovCisKKyNpZmRlZiBNSU5JWAkJCQkvKiBNSU5JWCB1c2VzIGlvY3RsJ3MgKi8KKyNkZWZpbmUgTk9TWVNJT0NUTEgJCQkvKiBidXQgaGFzIG5vIDxzeXMvaW9jdGwuaD4gKi8KKyNlbmRpZiAvKiBNSU5JWCAqLworCisvKiBPdGhlcnMgKi8KKworI2lmbmRlZiBOT1NZU0lPQ1RMSAkJCS8qIE90aGVycyB1c2UgaW9jdGwoKSAqLworI2lmZGVmIFNVTjRTNQorLyoKKyAgVGhpcyBpcyB0byBnZXQgcmlkIG9mIGNwcCB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgb2NjdXIgYmVjYXVzZSBhbGwgb2YKKyAgdGhlc2Ugc3ltYm9scyBhcmUgZGVmaW5lZCBieSBib3RoIHRlcm1pb3MuaCBhbmQgaW9jdGwuaCBvbiB0aGUgU1VOLgorKi8KKyN1bmRlZiBFQ0hPCisjdW5kZWYgTkwwCisjdW5kZWYgTkwxCisjdW5kZWYgVEFCMAorI3VuZGVmIFRBQjEKKyN1bmRlZiBUQUIyCisjdW5kZWYgWFRBQlMKKyN1bmRlZiBDUjAKKyN1bmRlZiBDUjEKKyN1bmRlZiBDUjIKKyN1bmRlZiBDUjMKKyN1bmRlZiBGRjAKKyN1bmRlZiBGRjEKKyN1bmRlZiBCUzAKKyN1bmRlZiBCUzEKKyN1bmRlZiBUT1NUT1AKKyN1bmRlZiBGTFVTSE8KKyN1bmRlZiBQRU5ESU4KKyN1bmRlZiBOT0ZMU0gKKyNlbmRpZiAvKiBTVU40UzUgKi8KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZiAvKiBOT1NZU0lPQ1RMSCAqLworLyoKKyAgV2UgcmVhbGx5LCByZWFsbHksIFJFQUxMWSB3YW50IEZJT05SRUFELCBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IHdheSB0byBmaW5kCisgIG91dCBub3QganVzdCAqaWYqIHN0dWZmIGlzIHdhaXRpbmcgdG8gYmUgcmVhZCwgYnV0IGhvdyBtdWNoLCB3aGljaCBpcworICBjcml0aWNhbCB0byBvdXIgc2xpZGluZy13aW5kb3cgYW5kIHN0cmVhbWluZyBwcm9jZWR1cmVzLCBub3QgdG8gbWVudGlvbgorICBlZmZpY2llbmN5IG9mIENPTk5FQ1QsIGV0Yy4KKyovCisjaWZkZWYgQkVMTFYxMAorI2luY2x1ZGUgPHN5cy9maWxpby5oPgkJCS8qIEZvciBGSU9OUkVBRCAqLworI2lmZGVmIEZJT05SRUFECisjZGVmaW5lIE1ZUkVBRAorI2VuZGlmIC8qIE1ZUkVBRCAqLworI2VuZGlmIC8qIEJFTExWMTAgKi8KKworI2lmbmRlZiBGSU9OUkVBRAorLyogSXQgd2Fzbid0IGZvdW5kIGluIGlvY3RsLmggb3IgdGVybSouaCAtIHRyeSB0aGVzZSBwbGFjZXM6ICovCisjaWZkZWYgVU5JWFdBUkUKKyNpbmNsdWRlIDxzeXMvZmlsaW8uaD4KKyNlbHNlCisjaWZkZWYgU09MQVJJUworI2luY2x1ZGUgPHN5cy9maWxpby5oPgorI2VuZGlmIC8qIFNPTEFSSVMgKi8KKyNlbmRpZiAvKiBVTklYV0FSRSAqLworI2VuZGlmIC8qIEZJT05SRUFEICovCisKKyNpZmRlZiBYRU5JWCAvKiBXYXMgTV9VTklYIGJ1dCBYRU5JWCBpbXBsaWVzIE1fVU5JWCBhbmQgYXBwbGllcyB0byBYRU5JWCB0b28gKi8KKy8qCisgIDxzeXMvc29ja2V0Lmg+IGluY2x1ZGVkIGFib3ZlIHZpYSAiY2tjbmV0LmgiIGRlZmluZXMgRklPTlJFQUQgYXMKKyAgc29tZXRoaW5nLiAgRHVlIHRvIHRoaXMsIGluX2NoaygpIHVzZXMgdGhlIEZJT05SRUFEIGluc3RlYWQgb2YgUkRDSEsKKyAgYW5kIHRoZSBob3Qga2V5cyBkdXJpbmcgZmlsZSB0cmFuc2ZlciAoWCB0byBjYW5jZWwgZmlsZSBldGMpIGRvIG5vdAorICB3b3JrIGJlY2F1c2UgRklPTlJFQUQgZG9lc24ndCB3b3JrIGV2ZW4gdGhvdWdoIGl0IGlzIGRlZmluZWQuCisKKyAgTk9URTogVGhpcyBtaWdodCBhbHNvIGJlIHRydWUgZWxzZXdoZXJlLgorKi8KKyNpZmRlZiBGSU9OUkVBRAorI3VuZGVmIEZJT05SRUFECisjZW5kaWYgLyogRklPTlJFQUQgKi8KKyNlbmRpZiAvKiBYRU5JWCAqLworCisjaWZkZWYgQ0tfU0NPVjUJCQkJLyogRGl0dG8gZm9yIFNDTyBPcGVuU2VydmVyIDUuMCAqLworI2lmZGVmIEZJT05SRUFECisjdW5kZWYgRklPTlJFQUQKKyNlbmRpZiAvKiBGSU9OUkVBRCAqLworI2VuZGlmIC8qIFhFTklYICovCisKKy8qIFdoZXRoZXIgdG8gaW5jbHVkZSA8ZmNudGwuaD4gKi8KKworI2lmbmRlZiBpczY4awkJCQkvKiBPbmx5IGEgZmV3IGRvbid0IGhhdmUgdGhpcyBvbmUuICovCisjaWZuZGVmIEJTRDQxCisjaWZuZGVmIEZUMjEKKyNpZm5kZWYgRlQxOAorI2lmbmRlZiBDT0hFUkVOVAorI2luY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBGVDE4ICovCisjZW5kaWYgLyogRlQyMSAqLworI2VuZGlmIC8qIEJTRDQxICovCisjZW5kaWYgLyogbm90IGlzNjhrICovCisKKyNpZmRlZiBDT0hFUkVOVAorI2lmZGVmIF9JMzg2CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjZW5kaWYgLyogX0kzODYgKi8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisjaWZkZWYgQVRUNzMwMAkJCQkvKiBVbml4IFBDLCBpbnRlcm5hbCBtb2RlbSBkaWFsZXIgKi8KKyNpbmNsdWRlIDxzeXMvcGhvbmUuaD4KKyNlbmRpZiAvKiBBVFQ3MzAwICovCisKKyNpZmRlZiBIUFVYCQkJCS8qIEhQLVVYIHZhcmlhdGlvbnMuICovCisjZGVmaW5lIEhQVVhKT0JDVEwKKyNpbmNsdWRlIDxzeXMvbW9kZW0uaD4JCQkvKiBIUC1VWCBtb2RlbSBzaWduYWxzICovCisjaWZkZWYgaHA5MDAwczUwMAkJCS8qIE1vZGVsIDUwMCAqLworI3VuZGVmIEhQVVhKT0JDVEwKKyNlbmRpZiAvKiBocDkwMDBzNTAwICovCisjaWZkZWYgSFBVWFBSRTY1CisjdW5kZWYgSFBVWEpPQkNUTAordHlwZWRlZiBsb25nIG1mbGFnOworI2VuZGlmIC8qIEhQVVhQUkU2NSAqLworI2lmZGVmIEhQVVhKT0JDVEwKKyNpbmNsdWRlIDxzeXMvYnNkdHR5Lmg+CQkJLyogSFAtVVggQmVya2VsZXkgdHR5IHN1cHBvcnQgKi8KKyNlbmRpZiAvKiBIUFVYSk9CQ1RMICovCisjZW5kaWYgLyogSFBVWCAqLworCisvKgorICBXaGljaCB0aW1lLmggZmlsZXMgdG8gaW5jbHVkZS4uLiBTZWUgY2tjZGViLmggZm9yIGRlZmF1bHRzLgorICBOb3RlIHRoYXQgMCwgMSwgMiwgb3IgYWxsIDMgb2YgdGhlc2UgY2FuIGJlIGluY2x1ZGVkIGFjY29yZGluZyB0bworICB0aGUgc3ltYm9sIGRlZmluaXRpb25zLgorKi8KKyNpZm5kZWYgTk9USU1FSAorI2lmZGVmIFRJTUVICisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmIC8qIFRJTUVIICovCisjZW5kaWYgLyogTk9USU1FSCAqLworCisjaWZuZGVmIE5PU1lTVElNRUgKKyNpZmRlZiBTWVNUSU1FSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYgLyogU1lTVElNRUggKi8KKyNlbmRpZiAvKiBOT1NZU1RJTUVIICovCisKKyNpZm5kZWYgTk9TWVNUSU1FQkgKKyNpZmRlZiBTWVNUSU1FQkgKKyNpbmNsdWRlIDxzeXMvdGltZWIuaD4KKyNlbmRpZiAvKiBTWVNUSU1FQkggKi8KKyNlbmRpZiAvKiBOT1NZU1RJTUVCSCAqLworCisjaWZuZGVmIE5PRENMVElNRVZBTAorI2lmZGVmIERDTFRJTUVWQUwKKy8qCisgIEluIGNlcnRhaW4gUE9TSVggYnVpbGRzIChsaWtlIFVuaXh3YXJlIDcpLCA8W3N5cy9ddGltZS5oPiByZWZ1c2VzIHRvCisgIGRlZmluZSB0aGUgc3RydWN0cyB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgaGlnaGVyIHNwZWVkcywgc28gd2UgaGF2ZSB0bworICBkbyBpdCBvdXJzZWx2ZXMuCisqLworc3RydWN0IHRpbWV2YWwgeworICAgIGxvbmcgdHZfc2VjOworICAgIGxvbmcgdHZfdXNlYzsKK307CitzdHJ1Y3QgdGltZXpvbmUgeworICAgIGludCB0el9taW51dGVzd2VzdDsKKyAgICBpbnQgdHpfZHN0dGltZTsKK307CisjZW5kaWYgLyogRENMVElNRVZBTCAqLworI2VuZGlmIC8qIE5PRENMVElNRVZBTCAqLworCisjaWZkZWYgX19saW51eF9fCisvKiBUSElTIElTIE9CU09MRVRFIHNpbmNlIGFib3V0IExpbnV4IDAuOTIgKi8KKyNpZmRlZiBPTElOVVhISVNQRUVECisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjZW5kaWYgLyogT0xJTlVYSElTUEVFRCAqLworI2lmZGVmIF9fYWxwaGFfXwkJCS8qIExpbnV4IG9uIERFQyBBbHBoYSAqLworI2lmbmRlZiBfX0dMSUJDX18JCQkvKiBCdXQgbm90IHdpdGggZ2xpYmMgKi8KKyNpbmNsdWRlIDxhc20vdGVybWlvcy5oPgorI2VuZGlmIC8qIF9fR0xJQkNfXyAqLworI2VuZGlmIC8qIF9fYWxwaGFfXyAqLworI2VuZGlmIC8qIF9fbGludXhfXyAqLworCisjaWZkZWYgTk9JRVhURU4JCQkJLyogVGhpcyBpcyBicm9rZW4gb24gc29tZSBzeXN0ZW1zICovCisjdW5kZWYgSUVYVEVOCQkJCS8qIGxpa2UgQ29udmV4L09TIDkuMSAqLworI2VuZGlmIC8qIE5PSUVYVEVOICovCisjaWZuZGVmIElFWFRFTgkJCQkvKiBUdXJuIG9mZiBeTy9eViBwcm9jZXNzaW5nLiAqLworI2RlZmluZSBJRVhURU4gMAkJCS8qIE5lZWRlZCwgYXQgbGVhc3QsIG9uIEJTREkuICovCisjZW5kaWYgLyogSUVYVEVOICovCisvKgorICBQaWNrIHVwIGRlZmluaXRpb25zIG5lZWRlZCBmb3Igc2VsZWN0KCkgaWYgd2UgZG9uJ3QgaGF2ZSB0aGVtIGFscmVhZHkuCisgIE5vcm1hbGx5IHRoZXkgY29tZSBmcm9tIDxzeXMvdHlwZXMuaD4gYnV0IHNvbWUgc3lzdGVtcyBnZXQgdGhlbSBmcm9tCisgIDxzeXMvc2VsZWN0Lmg+Li4uICBSYXRoZXIgdGhhbiBoYXJkd2lyZSBhbGwgb2YgdGhlbSBpbnRvIHRoZSBzb3VyY2UsIHdlCisgIGluY2x1ZGUgaXQgaWYgU0VMRUNUX0ggaXMgZGVmaW5lZCBpbiBjb21waWxlLXRpbWUgQ0ZMQUdTLgorKi8KKyNpZm5kZWYgU0NPX09TUjUwNAorI2lmZGVmIFNFTEVDVF9ICisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmIC8qIFNFTEVDVF9IICovCisjZW5kaWYgLyogU0NPX09TUjUwNCAqLworCisjaWZkZWYgYWVnaXMKKyNpbmNsdWRlICIvc3lzL2lucy9iYXNlLmlucy5jIgorI2luY2x1ZGUgIi9zeXMvaW5zL2Vycm9yLmlucy5jIgorI2luY2x1ZGUgIi9zeXMvaW5zL2lvcy5pbnMuYyIKKyNpbmNsdWRlICIvc3lzL2lucy9zaW8uaW5zLmMiCisjaW5jbHVkZSAiL3N5cy9pbnMvcGFkLmlucy5jIgorI2luY2x1ZGUgIi9zeXMvaW5zL3RpbWUuaW5zLmMiCisjaW5jbHVkZSAiL3N5cy9pbnMvcGZtLmlucy5jIgorI2luY2x1ZGUgIi9zeXMvaW5zL3BnbS5pbnMuYyIKKyNpbmNsdWRlICIvc3lzL2lucy9lYzIuaW5zLmMiCisjaW5jbHVkZSAiL3N5cy9pbnMvdHlwZV91aWRzLmlucy5jIgorI2luY2x1ZGUgPGRlZmF1bHRfYWNsLmg+CisjdW5kZWYgVElPQ0VYQ0wKKyN1bmRlZiBGSU9OUkVBRAorI2VuZGlmIC8qIGFlZ2lzICovCisKKyNpZmRlZiBzeGFFNTAJCQkJLyogUEZVIENvbXBhY3QgQSBTWC9BIFRJU1AgVjEwL0w1MCAqLworI3VuZGVmIEZJT05SRUFECisjZW5kaWYgLyogc3hhRTUwICovCisKKy8qIFRoZSBmb2xsb3dpbmcgI2RlZmluZXMgYXJlIGNhdGNoLWFsbHMgZm9yIHRob3NlIHN5c3RlbXMgKi8KKy8qIHRoYXQgZGlkbid0IGhhdmUgb3IgY291bGRuJ3QgZmluZCA8ZmlsZS5oPi4uLiAqLworCisjaWZuZGVmIEZSRUFECisjZGVmaW5lIEZSRUFEIDB4MDEKKyNlbmRpZiAvKiBGUkVBRCAqLworCisjaWZuZGVmIEZXUklURQorI2RlZmluZSBGV1JJVEUgMHgxMAorI2VuZGlmIC8qIEZXUklURSAqLworCisjaWZuZGVmIE9fUkRPTkxZCisjZGVmaW5lIE9fUkRPTkxZIDAwMAorI2VuZGlmIC8qIE9fUkRPTkxZICovCisKKyNpZmRlZiBTVk9SUE9TSVgKKy8qCisgIE1vZGVtIHNpZ25hbHMgYXJlIGFsc28gZm9yYmlkZGVuIGluIHRoZSBQT1NJWCB3b3JsZC4gIEJ1dCBzb21lIFBPU0lYLWJhc2VkCisgIHBsYXRmb3JtcyBsZXQgdXMgYXQgdGhlbSBhbnl3YXkgaWYgd2Uga25vdyB3aGVyZSB0byBsb29rLgorKi8KKyNpZm5kZWYgTkVFRE1ETURFRlMKKy8qIERvZXNuJ3Qgd29yayBmb3IgTGludXggKi8KKyNpZmRlZiBVTklYV0FSRTcKKyNkZWZpbmUgTkVFRE1ETURFRlMKKyNlbmRpZiAvKiBVTklYV0FSRTcgKi8KKyNlbmRpZiAvKiBORUVETURNREVGUyAqLworCisjaWZkZWYgTkVFRE1ETURFRlMKKyNpZm5kZWYgVElPQ01HRVQKKyNkZWZpbmUgVElPQ01HRVQgKCgndCc8PDgpfDI5KQorI2VuZGlmIC8qIFRJT0NNR0VUICovCisKKyNpZm5kZWYgVElPQ01fRFRSCisjZGVmaW5lIFRJT0NNX0RUUiAweDAwMDIKKyNlbmRpZiAvKiBUSU9DTV9EVFIgKi8KKyNpZm5kZWYgVElPQ01fUlRTCisjZGVmaW5lIFRJT0NNX1JUUyAweDAwMDQKKyNlbmRpZiAvKiBUSU9DTV9SVFMgKi8KKyNpZm5kZWYgVElPQ01fQ1RTCisjZGVmaW5lIFRJT0NNX0NUUyAweDAwMjAKKyNlbmRpZiAvKiBUSU9DTV9DVFMgKi8KKyNpZm5kZWYgVElPQ01fQ0FSCisjZGVmaW5lIFRJT0NNX0NBUiAweDAwNDAKKyNlbmRpZiAvKiBUSU9DTV9DQVIgKi8KKyNpZm5kZWYgVElPQ01fUk5HCisjZGVmaW5lIFRJT0NNX1JORyAweDAwODAKKyNlbmRpZiAvKiBUSU9DTV9STkcgKi8KKyNpZm5kZWYgVElPQ01fRFNSCisjZGVmaW5lIFRJT0NNX0RTUiAweDAxMDAKKyNlbmRpZiAvKiBUSU9DTV9EU1IgKi8KKyNlbmRpZiAvKiBORUVETURNREVGUyAqLworI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworCisvKiBEZWNsYXJhdGlvbnMgKi8KKworI2lmZGVmIE9YT1MKKyN1bmRlZiBUQ0dFVEEKKyN1bmRlZiBUQ1NFVEEKKyN1bmRlZiBUQ1NFVEFXCisjdW5kZWYgVENTRVRBRgorI2RlZmluZSBUQ0dFVEEgVENHRVRTCisjZGVmaW5lIFRDU0VUQSBUQ1NFVFMKKyNkZWZpbmUgVENTRVRBVyBUQ1NFVFNXCisjZGVmaW5lIFRDU0VUQUYgVENTRVRTRgorI2RlZmluZSB0ZXJtaW8gdGVybWlvcworI2VuZGlmIC8qIE9YT1MgKi8KKworI2lmZGVmIFNWT1JQT1NJWAkJCS8qIEFUJlQgU3lzIFYgb3IgUE9TSVggKi8KKyNpZmRlZiBVTklYV0FSRVBPU0lYCQkJLyogVW5peFdhcmUgNyBQT1NJWCBidWlsZCAqLworLyoKKyAgSW4gVW5peHdhcmUgUE9TSVggYnVpbGRzLCA8W3N5cy9ddGltZS5oPiByZWZ1c2VzIHRvIGRlZmluZSB0aGUKKyAgc3RydWN0cyB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgaGlnaGVyIHNwZWVkcywgc28gd2UgaGF2ZSB0byBkbyBpdAorICBvdXJzZWx2ZXMuCisqLworc3RydWN0IHRpbWV2YWwgeworICAgIGxvbmcgdHZfc2VjOworICAgIGxvbmcgdHZfdXNlYzsKK307CitzdHJ1Y3QgdGltZXpvbmUgeworICAgIGludCB0el9taW51dGVzd2VzdDsKKyAgICBpbnQgdHpfZHN0dGltZTsKK307CisjZW5kaWYgLyogVU5JWFdBUkVQT1NJWCAqLworI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworCisjaWZkZWYgX19HTlVDX18KKyNpZmRlZiBYRU5JWAorLyoKKyAgQmVjYXVzZSBYZW5peCA8dGltZS5oPiBkb2Vzbid0IGRlY2xhcmUgdGltZSgpIGlmIHdlJ3JlIHVzaW5nIGdjYy4KKyovCit0aW1lX3QgdGltZSgpOworI2VuZGlmIC8qIFhFTklYICovCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworLyogU3BlY2lhbCBzdHVmZiBmb3IgVjcgaW5wdXQgYnVmZmVyIHBlZWtpbmcgKi8KKworI2lmZGVmICBWNworaW50IGttZW1bMl0gPSB7IC0xLCAtMX07CitjaGFyICppbml0cmF3cSgpLCAqcWFkZHJbMl09ezAsMH07CisjZGVmaW5lIENPTiAwCisjZGVmaW5lIFRUWSAxCisjZW5kaWYgLyogVjcgKi8KKworLyogZGZ0dHkgaXMgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGRldmljZSBmb3IgZmlsZSB0cmFuc2ZlciAqLworLyogZGZsb2MgaXMgMCBpZiBkZnR0eSBpcyB0aGUgdXNlcidzIGNvbnNvbGUgdGVybWluYWwsIDEgaWYgYW4gZXh0ZXJuYWwgbGluZSAqLworCisjaWZkZWYgQkVPUworICAgIGNoYXIgKiBkZnR0eSA9IE5VTEw7CisgICAgY2hhciAqIGRmbWRtID0gIm5vbmUiOworICAgIGludCBkZmxvYyA9IDA7ICAgICAgICAgICAgICAgICAgLyogdGhhdCBnb2VzIGluIGxvY2FsIG1vZGUgYnkgZGVmYXVsdCAqLworI2Vsc2UKKyNpZm5kZWYgREZUVFkKKyNpZmRlZiBQUk9WWDEKKyAgICBjaGFyICpkZnR0eSA9ICIvZGV2L2NvbTEuZG91dCI7IC8qIE9ubHkgZXhhbXBsZSBzbyBmYXIgb2YgYSBzeXN0ZW0gKi8KKyAgICBjaGFyICpkZm1kbSA9ICJub25lIjsKKyAgICBpbnQgZGZsb2MgPSAxOyAgICAgICAgICAgICAgICAgIC8qIHRoYXQgZ29lcyBpbiBsb2NhbCBtb2RlIGJ5IGRlZmF1bHQgKi8KKyNlbHNlCisgICAgY2hhciAqZGZ0dHkgPSBDVFROQU07ICAgICAgICAgICAgICAgLyogUmVtb3RlIGJ5IGRlZmF1bHQsIHVzZSBub3JtYWwgKi8KKyAgICBjaGFyICpkZm1kbSA9ICJub25lIjsKKyAgICBpbnQgZGZsb2MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGluZyB0ZXJtaW5hbCBuYW1lLiAqLworI2VuZGlmIC8qIFBST1ZYMSAqLworI2Vsc2UKKyAgICBjaGFyICpkZnR0eSA9IERGVFRZOwkJLyogRGVmYXVsdCBsb2NhdGlvbiBzcGVjaWZpZWQgb24gKi8KKyAgICBjaGFyICpkZm1kbSA9ICJub25lIjsJCS8qIGNvbW1hbmQgbGluZS4gKi8KKyAgICBpbnQgZGZsb2MgPSAxOyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGluZyB0ZXJtaW5hbCBuYW1lLiAqLworI2VuZGlmIC8qIERGVFRZICovCisjZW5kaWYgLyogQkVPUyAqLworCisjZGVmaW5lIENPTl9SRVMgMAkJCS8qIENvbnNvbGUgc3RhdGUgaXMgInJlc2V0IiAqLworI2RlZmluZSBDT05fQ0IgIDEJCQkvKiBDb25zb2xlIHN0YXRlIGlzIENCUkVBSyAqLworI2RlZmluZSBDT05fQklOIDIJCQkvKiBDb25zb2xlIHN0YXRlIGlzIGJpbmFyeSAqLworICAgIHN0YXRpYyBpbnQgY29uc3RhdGUgPSBDT05fUkVTOworCisjZGVmaW5lIENPTklfUkVTIDAJCQkvKiBDb25zb2xlIGludGVycnVwdHMgYXJlICJyZXNldCIgKi8KKyNkZWZpbmUgQ09OSV9JTlQgMQkJCS8qIENvbnNvbGUgaW50dGVydXB0cyBhcmUgc2V0ICovCisjZGVmaW5lIENPTklfTk9JIDIJCQkvKiBDb25zb2xlIGludHRlcnVwdHMgYXJlIGRpc2FibGVkICovCisgICAgc3RhdGljIGludCBjb25pc3RhdGUgPSBDT05JX1JFUzsKKworI2lmZGVmIENLX1NNQUxMCisjZGVmaW5lIENPTkJVRlNJWiAxNQorI2Vsc2UKKyNkZWZpbmUgQ09OQlVGU0laIDI1NQorI2VuZGlmIC8qIENLX1NNQUxMICovCisgICAgc3RhdGljIGNoYXIgY29uYnVmW0NPTkJVRlNJWl07CS8qIENvbnNvbGUgcmVhZGFoZWFkIGJ1ZmZlciAqLworICAgIHN0YXRpYyBpbnQgIGNvbmJ1Zm4gPSAwOwkJLyogQ2hhcnMgaW4gcmVhZGFoZWFkIGJ1ZmZlciAqLworICAgIHN0YXRpYyBjaGFyICpjb25idWZwID0gY29uYnVmOwkvKiBOZXh0IGNoYXIgaW4gcmVhZGFoZWFkIGJ1ZmZlciAqLworCisgICAgY2hhciBjdHRuYW1bREVWTkFNTEVOKzFdID0geyAnXDAnLCAnXDAnIH07IC8qIERldGVybWluZWQgYXQgcnVudGltZSAqLworCisjaWZkZWYgUlRVCisgICAgaW50IHJ0dV9idWcgPSAwOwkJICAgIC8qIHNldCB0byAxIHdoZW4gcmV0dXJuaW5nIGZyb20gU0lHVFNUUCAqLworI2VuZGlmIC8qIFJUVSAqLworCisgICAgaW50IGRmcHJ0eSA9IERFRlBBUjsgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBwYXJpdHkgKDAgPSBub25lKSAqLworICAgIGludCB0dHBydHkgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBwYXJpdHkgdGhhdCBpcyBpbiB1c2UuICovCisgICAgc3RhdGljIGludCB0dHBtc2sgPSAweGZmOwkJLyogUGFyaXR5IHN0cmlwcGluZyBtYXNrLiAqLworICAgIGludCB0dG1kbSA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIE1vZGVtIGluIHVzZS4gKi8KKyAgICBpbnQgdHRjYXJyID0gQ0FSX0FVVDsJCS8qIENhcnJpZXIgaGFuZGxpbmcgbW9kZS4gKi8KKyAgICBpbnQgZGZmbG93ID0gRkxPX05PTkU7CQkvKiBEZWZhdWx0IGZsb3cgY29udHJvbCBpcyBOT05FICovCisgICAgaW50IGJhY2tncmQgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIGluIGZvcmVncm91bmQgKG5vICcmJyApICovCisjaWZkZWYgRl9TRVRGTAorICAgIGludCBpbmlmbGFncyA9IC0xOwkJCS8qIGZjbnRsIGZsYWdzIGZvciB0dHlmZCAqLworI2VuZGlmIC8qIEZfU0VURkwgKi8KKyAgICBpbnQgZmRmbGFnID0gMDsJCQkvKiBGbGFnIGZvciByZWRpcmVjdGVkIHN0ZGlvICovCisgICAgaW50IHR0ZmRmbGcgPSAwOwkJCS8qIE9wZW4gRmlsZSBkZXNjcmlwdG9yIHdhcyBnaXZlbiAqLworICAgIGludCB0dnRmbGcgPSAwOwkJCS8qIEZsYWcgdGhhdCB0dHZ0IGhhcyBiZWVuIGNhbGxlZCAqLworICAgIGxvbmcgdHRzcGVlZCA9IC0xTDsJCQkvKiBGb3Igc2F2aW5nIHNwZWVkICovCisgICAgaW50IHR0ZmxvdyA9IC05OwkJCS8qIEZvciBzYXZpbmcgZmxvdyAqLworICAgIGludCB0dGxkID0gLTE7CQkJLyogTGluZSBkaXNjaXBsaW5lICovCisKKyNpZmRlZiBzb255X25ld3MKKyAgICBzdGF0aWMgaW50IGttX2NvbiA9IC0xOwkJLyogS2FuamkgbW9kZSBmb3IgY29uc29sZSB0dHkgKi8KKyAgICBzdGF0aWMgaW50IGttX2V4dCA9IC0xOwkJLyogS2FuamkgbW9kZSBmb3IgZXh0ZXJuYWwgZGV2aWNlICovCisjZW5kaWYgLyogc29ueV9uZXdzICovCisKKyNpZmRlZiBQQVJTRU5TRQorICAgIHN0YXRpYyBpbnQgbmVlZHBjaGsgPSAxOwkJLyogTmVlZCBwYXJpdHkgY2hlY2sgKi8KKyNlbHNlCisgICAgc3RhdGljIGludCBuZWVkcGNoayA9IDA7CisjZW5kaWYgLyogUEFSU0VOU0UgKi8KKworICAgIGV4dGVybiBpbnQgc3RvcGJpdHM7CQkvKiBTdG9wIGJpdHMgKi8KKyNpZmRlZiBIV1BBUklUWQorLyoKKyAgVW5mb3J0dW5hdGVseSB3ZSBtdXN0IGRvIHRoaXMgd2l0aCBnbG9iYWwgdmFyaWFibGVzIHJhdGhlciB0aGFuIHRocm91Z2ggdGhlCisgIHR0Li4uKCkgQVBJcyB0byBhdm9pZCBjaGFuZ2luZyB0aGUgQVBJcyBhbmQgdGhlIG1hbnkgbW9kdWxlcyB0aGF0IHVzZSB0aGVtLgorICBJZiBod3Bhcml0eSAhPSAwLCB0aGlzIGluZGljYXRlcyA4IGRhdGEgYml0cyArIHBhcml0eSwgcmF0aGVyIHRoYW4gNyBkYXRhCisgIGJpdHMgKyBwYXJpdHkgb3IgOCBkYXRhIGJpdHMgYW5kIG5vIHBhcml0eSwgYW5kIG92ZXJyaWRlcyB0aGUgcmVndWxhciBwYXJpdHkKKyAgdmFyaWFibGUsIHdoaWNoIGlzIGNvbW11bmljYXRlZCB0byB0aGlzIG1vZHVsZSB0aHJ1IHR0cGt0KCksIGFuZCByZXByZXNlbnRlZAorICBsb2NhbGx5IGJ5IHRoZSB0dHBydHkgdmFyaWFibGUuCisqLworICAgIGV4dGVybiBpbnQgaHdwYXJpdHk7CQkvKiBIYXJkd2FyZSBwYXJpdHkgKi8KKyNlbmRpZiAvKiBIV1BBUklUWSAqLworCisjaWZkZWYgVENQU09DS0VUCisjaWZkZWYgVENQX05PREVMQVkKK3N0YXRpYyBpbnQgbm9kZWxheV9zYXYgPSAtMTsKKyNlbmRpZiAvKiBUQ1BfTk9ERUxBWSAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCitzdGF0aWMgaW50IHNpZ2ludF9pZ24gPSAwOwkJLyogU0lHSU5UIGlzIGlnbm9yZWQgKi8KKworLyoKKyAgSGF2aW5nIHRoaXMgbW9kdWxlIHJlbHkgb24gZXh0ZXJuYWwgZ2xvYmFscyBpcyBiYWQsIGJ1dCBmaXhpbmcgdGhpcworICByZXF1aXJlcyBvdmVyaGF1bCBvZiB0aGUgY2sqdGlvLmMgbW9kdWxlcyBmb3IgYWxsIHRoZSBkaWZmZXJlbnQgb3BlcmF0aW5nCisgIHN5c3RlbXMgc3VwcG9ydGVkIGJ5IEMtS2VybWl0LiAgTGVmdCBmb3IgYSBmdXR1cmUgcmVsZWFzZS4KKyovCitleHRlcm4gaW50IHR0bnByb3RvOwkJCS8qIERlZmluZWQgaW4gY2tjbmV0LmMgKi8KK2V4dGVybiBpbnQgdHRuZXQ7CQkJLyogRGVmaW5lZCBpbiBja2NuZXQuYyAqLworZXh0ZXJuIGludCBub3B1c2gsIHhmcmNhbiwgeGZyY2hyLCB4ZnJudW07IC8qIERlZmluZWQgaW4gY2tjbWFpLmMgKi8KK2V4dGVybiBpbnQgeHN1c3BlbmQsIHdhc2Nsb3NlZDsKK2V4dGVybiBpbnQgaW5zZXJ2ZXIsIGxvY2FsOworCitpbnQgY2t4ZWNoID0gMDsgLyogMCBpZiBzeXN0ZW0gbm9ybWFsbHkgZWNob2VzIGNvbnNvbGUgY2hhcmFjdGVycywgZWxzZSAxICovCisKK2ludCBja21heGZpbGVzID0gMDsJCQkvKiBNYXggbnVtYmVyIG9mIG9wZW4gZmlsZXMgKi8KKworI2lmZGVmIENLX0VOQ1JZUFRJT04JCQkvKiBLZXJiZXJvcyAqLworI2luY2x1ZGUgImNrdWF0aC5oIgorZXh0ZXJuIGludCBtZV9lbmNyeXB0LCB1X2VuY3J5cHQ7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworCisvKiBEZWNsYXJhdGlvbnMgb2YgdmFyaWFibGVzIGdsb2JhbCB3aXRoaW4gdGhpcyBtb2R1bGUgKi8KKworI2lmZGVmIFRUTEVCVUYJCQkJLyogU2VlIGNrY25ldC5oICovCitpbnQgdHRwdXNoID0gLTE7CisjZGVmaW5lIExFQlVGU0laIDQwOTYKK3N0YXRpYyBDSEFSIGxlX2J1ZltMRUJVRlNJWl07CitzdGF0aWMgaW50IGxlX3N0YXJ0ID0gMCwgbGVfZW5kID0gMCwgbGVfZGF0YSA9IDA7CisjZW5kaWYgLyogVFRMRUJVRiAqLworCitzdGF0aWMgaW50IGdvdHNpZ3MgPSAwOworCitzdGF0aWMgdGltZV90IHRjb3VudCA9ICh0aW1lX3QpMDsJLyogRWxhcHNlZCB0aW1lIGNvdW50ZXIgKi8KKworc3RhdGljIFNJR1RZUCAoKnNhdmFsKSgpICAgICA9IE5VTEw7CS8qIEZvciBzYXZpbmcgYWxhcm0oKSBoYW5kbGVyICovCitzdGF0aWMgU0lHVFlQICgqc2F2cXVpdCkoKSAgID0gTlVMTDsJLyogYW5kIG90aGVyIHNpZ25hbCBoYW5kbGVycyAqLworI2lmZGVmIFNJR1VTUjEKK3N0YXRpYyBTSUdUWVAgKCpzYXZ1c3IxKSgpICAgPSBOVUxMOworI2VuZGlmIC8qIFNJR1VTUjEgKi8KKyNpZmRlZiBTSUdVU1IyCitzdGF0aWMgU0lHVFlQICgqc2F2dXNyMikoKSAgID0gTlVMTDsKKyNlbmRpZiAvKiBTSUdVU1IyICovCisjaWZkZWYgU0lHUElQRQorc3RhdGljIFNJR1RZUCAoKnNhdnBpcGUpKCkgICA9IE5VTEw7CisjZW5kaWYgLyogU0lHUElQRSAqLworI2lmZGVmIFNJR0RBTkdFUgorc3RhdGljIFNJR1RZUCAoKnNhdmRhbmdlcikoKSA9IE5VTEw7CisjZW5kaWYgLyogU0lHREFOR0VSICovCisKKyNpZm5kZWYgTk9KQworc3RhdGljIFNJR1RZUCAoKmpjaGRscikoKSAgICA9IE5VTEw7CS8qIEZvciBjaGVja2luZyBzdXNwZW5kIGhhbmRsZXIgKi8KKyNlbmRpZiAvKiBOT0pDICovCitzdGF0aWMgaW50IGpjc2hlbGwgPSAtMTsJCS8qIEFuZCBmbGFnIGZvciByZXN1bHQgKi8KKworLyoKKyAgQlJFQUtOVUxTIGlzIGRlZmluZWQgZm9yIHN5c3RlbXMgdGhhdCBzaW11bGF0ZSBzZW5kaW5nIGEgQlJFQUsgc2lnbmFsCisgIGJ5IHNlbmRpbmcgYSBidW5jaCBvZiBOVUwgY2hhcmFjdGVycyBhdCBsb3cgc3BlZWQuCisqLworI2lmZGVmIFBST1ZYMQorI2lmbmRlZiBCUkVBS05VTFMKKyNkZWZpbmUgQlJFQUtOVUxTCisjZW5kaWYgLyogQlJFQUtOVUxTICovCisjZW5kaWYgLyogUFJPVlgxICovCisKKyNpZmRlZiBWNworI2lmbmRlZiBCUkVBS05VTFMKKyNkZWZpbmUgQlJFQUtOVUxTCisjZW5kaWYgLyogQlJFQUtOVUxTICovCisjZW5kaWYgLyogVjcgKi8KKworI2lmZGVmIEJSRUFLTlVMUworc3RhdGljIGNoYXIJCQkJLyogQSBzdHJpbmcgb2YgbnVsbHMgKi8KKypicm51bHMgPSAiXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCI7CisjZW5kaWYgLyogQlJFQUtOVUxTICovCisKKyNpZmRlZiBDS19QT1NJWF9TSUcJCQkvKiBMb25nanVtcCBidWZmZXJzICovCitzdGF0aWMgc2lnam1wX2J1ZiBzamJ1ZjsJCS8qIFBPU0lYIHNpZ25hbCBoYW5kbGluZyAqLworI2Vsc2UKK3N0YXRpYyBqbXBfYnVmIHNqYnVmOworI2VuZGlmIC8qIENLX1BPU0lYX1NJRyAqLworCisjaWZkZWYgVjcKK3N0YXRpYyBqbXBfYnVmIGpqYnVmOworI2VuZGlmIC8qIFY3ICovCisKKy8qIHN0YXRpYyAqLwkJCQkvKiAoTm90IHN0YXRpYyBhbnkgbW9yZSkgKi8KK2ludCB0dHlmZCA9IC0xOwkJCQkvKiBUVFkgZmlsZSBkZXNjcmlwdG9yICovCisKK2ludCB0dHBpcGUgPSAwOwkJCQkvKiBORVRDTUQ6IFVzZSBwaXBlIGluc3RlYWQgb2YgdHR5ZmQgKi8KK2ludCB0dHB0eSAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRQVFk6IFVzZSBwdHkgaW5zdGVhZCBvZiB0dGZ5ZCAqLworCisjaWZkZWYgTkVUQ01ECisjaWZkZWYgTkVUQ09OTgorc3RhdGljIGludCBwaXBlMFsyXSwgcGlwZTFbMl07CQkvKiBQaXBlcyBmb3IgbmV0IGkvbyAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KK3N0YXRpYyBQSURfVCB0dHBpZCA9IDA7CQkJLyogUHJvY2VzcyBJRCBmb3IgZm9yayAqLworc3RhdGljIGludCBmZGluLCBmZG91dDsJCQkvKiBGaWxlIGRlc2NyaXB0b3JzIGZvciBwaXBlICovCitzdGF0aWMgRklMRSAqIHR0b3V0ID0gTlVMTDsJCS8qIEZpbGUgcG9pbnRlciBmb3Igb3V0cHV0IHBpcGUgKi8KKyNpZmRlZiBEQ0xGRE9QRU4KKy8qIGZkb3BlbigpIG5lZWRzIGRlY2xhcmluZyBiZWNhdXNlIGl0J3Mgbm90IGRlY2xhcmVkIGluIDxzdGRpby5oPiAqLworX1BST1RPVFlQKCBGSUxFICogZmRvcGVuLCAoaW50LCBjaGFyICopICk7CisjZW5kaWYgLyogRENMRkRPUEVOICovCisjZW5kaWYgLyogTkVUQ01EICovCisKK2V4dGVybiBpbnQgcGV4aXRzdGF0LCBxdWlldDsKKworI2lmZGVmIFBsYW45CitpbnQgdHR5Y3RsZmQgID0gLTE7ICAgLyogVFRZIGNvbnRyb2wgY2hhbm5lbCAtIFdoYXQ/IFVOSVggZG9lc24ndCBoYXZlIG9uZT8gKi8KK2ludCBjb25zY3RsZmQgPSAtMTsJCQkvKiBDb25zb2xlIGNvbnRyb2wgY2hhbm5lbCAqLworaW50IG5vaXNlZmQgPSAtMTsJCQkvKiB0b25lIGNoYW5uZWwgKi8KK3N0YXRpYyBpbnQgdHR5bGFzdHNwZWVkID0gLTE7CQkvKiBTbyB3ZSBjYW4gbGllIGFib3V0IHRoZSBzcGVlZCAqLworI2VuZGlmIC8qIFBsYW45ICovCisKK2ludCB0ZWxuZXRmZCA9IDA7CQkJLyogRmlsZSBkZXNjcmlwdG9yIGlzIGZvciB0ZWxuZXQgKi8KKyNpZmRlZiBORVRDT05OCitpbnQgeDI1ZmQgPSAwOwkJCQkvKiBGaWxlIGRlc2NyaXB0b3IgaXMgZm9yIFguMjUgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisKK2NoYXIgbG9ja3BpZFsxNl0gPSB7ICdcMCcsICdcMCcgfTsJLyogUElEIHN0b3JlZCBpbiBsb2NrZmlsZSwgYXMgc3RyaW5nICovCisKK3N0YXRpYyBpbnQgbGtmID0gMCwgICAgICAgICAgICAgICAgICAgICAvKiBMaW5lIGxvY2sgZmxhZyAqLworICAgIGNnbWYgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgdGhhdCBjb25zb2xlIG1vZGVzIHNhdmVkICovCisgICAgeGxvY2FsID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgdHR5IGxvY2FsIG9yIHJlbW90ZSAqLworICAgIGN1cmNhcnIgPSAwOwkJCS8qIENhcnJpZXIgbW9kZTogcmVxdWlyZS9pZ25vcmUuICovCisKK3N0YXRpYyBpbnQgbmV0Y29ubiA9IDA7CQkJLyogMSBpZiBuZXR3b3JrIGNvbm5lY3Rpb24gYWN0aXZlICovCisKK3N0YXRpYyBjaGFyIGVzY2NocjsgICAgICAgICAgICAgICAgICAgICAvKiBFc2NhcGUgb3IgYXR0biBjaGFyYWN0ZXIgKi8KKworI2lmZGVmIENLX1NDTzMyVjQKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmIC8qIENLX1NDTzMyVjQgKi8KKworI2lmZGVmIEhBVkVfVFYKKyAgICBzdGF0aWMgc3RydWN0IHRpbWV2YWwgdHY7CQkvKiBGb3IgZ2V0dGluZyB0aW1lLCBmcm9tIHN5cy90aW1lLmggKi8KKyNlbmRpZiAvKiBIQVZFX1RWICovCisjaWZkZWYgSEFWRV9UWgorICAgIHN0YXRpYyBzdHJ1Y3QgdGltZXpvbmUgdHo7CisjZW5kaWYgLyogSEFWRV9UWiAqLworCisjaWZkZWYgT1NGCisgICAgc3RhdGljIHN0cnVjdCB0aW1lYiBmdHA7ICAgICAgICAgICAgLyogQW5kIGZyb20gc3lzL3RpbWViLmggKi8KKyNlbmRpZiAvKiBPU0YgKi8KKworI2lmZGVmIEJTRDI5CisgICAgc3RhdGljIGxvbmcgeGNsb2NrOwkJCS8qIEZvciBnZXR0aW5nIHRpbWUgZnJvbSBzeXMvdGltZS5oICovCisgICAgc3RhdGljIHN0cnVjdCB0aW1lYiBmdHA7ICAgICAgICAgICAgLyogQW5kIGZyb20gc3lzL3RpbWViLmggKi8KKyNlbmRpZiAvKiBCU0QyOSAqLworCisjaWZkZWYgQlNENDEKKyAgICBzdGF0aWMgbG9uZyB4Y2xvY2s7CQkJLyogRm9yIGdldHRpbmcgdGltZSBmcm9tIHN5cy90aW1lLmggKi8KKyAgICBzdGF0aWMgc3RydWN0IHRpbWViIGZ0cDsgICAgICAgICAgICAvKiBBbmQgZnJvbSBzeXMvdGltZWIuaCAqLworI2VuZGlmIC8qIEJTRDQxICovCisKKyNpZmRlZiBCRUxMVjEwCisgICAgc3RhdGljIGxvbmcgeGNsb2NrOwkJCS8qIEZvciBnZXR0aW5nIHRpbWUgZnJvbSBzeXMvdGltZS5oICovCisgICAgc3RhdGljIHN0cnVjdCB0aW1lYiBmdHA7ICAgICAgICAgICAgLyogQW5kIGZyb20gc3lzL3RpbWViLmggKi8KKyNlbmRpZiAvKiBCRUxMVjEwICovCisKKyNpZmRlZiBGVDIxCisgICAgc3RhdGljIGxvbmcgeGNsb2NrOwkJCS8qIEZvciBnZXR0aW5nIHRpbWUgZnJvbSBzeXMvdGltZS5oICovCisgICAgc3RhdGljIHN0cnVjdCB0aW1lYiBmdHA7ICAgICAgICAgICAgLyogQW5kIGZyb20gc3lzL3RpbWViLmggKi8KKyNlbmRpZiAvKiBGVDIxICovCisKKyNpZmRlZiBUT1dFUjEKKyAgICBzdGF0aWMgbG9uZyB4Y2xvY2s7CQkJLyogRm9yIGdldHRpbmcgdGltZSBmcm9tIHN5cy90aW1lLmggKi8KKyAgICBzdGF0aWMgc3RydWN0IHRpbWViIGZ0cDsJCS8qIEFuZCBmcm9tIHN5cy90aW1lYi5oICovCisjZW5kaWYgLyogVE9XRVIxICovCisKKyNpZmRlZiBDT0hFUkVOVAorICAgIHN0YXRpYyBsb25nIHhjbG9jazsJCQkvKiBGb3IgZ2V0dGluZyB0aW1lIGZyb20gc3lzL3RpbWUuaCAqLworICAgIHN0YXRpYyBzdHJ1Y3QgdGltZWIgZnRwOwkJLyogQW5kIGZyb20gc3lzL3RpbWViLmggKi8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisjaWZkZWYgVjcKKyAgICBzdGF0aWMgbG9uZyB4Y2xvY2s7CisjZW5kaWYgLyogVjcgKi8KKworLyogc2d0dHkvdGVybWlvIGluZm9ybWF0aW9uLi4uICovCisKKyNpZmRlZiBCU0Q0NE9SUE9TSVgJCQkvKiBQT1NJWCBvciBCU0Q0NCAqLworICBzdGF0aWMgc3RydWN0IHRlcm1pb3MKKyAgICB0dG9sZCwgdHRyYXcsIHR0dHZ0LCB0dGN1ciwKKyAgICBjY29sZCwgY2NyYXcsIGNjY2JyazsKKyNlbHNlCQkJCQkvKiBCU0QsIFY3LCBldGMgKi8KKworI2lmZGVmIENPSEVSRU5UCQkJCS8qIEhhY2sgYWxlcnQuLi4gKi8KKyNkZWZpbmUgQVRUU1YKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisjaWZkZWYgQVRUU1YKKyAgc3RhdGljIHN0cnVjdCB0ZXJtaW8gdHRvbGQgPSB7MH07CS8qIEluaXQnZCBmb3Igd29yZCBhbGlnbm1lbnQsICovCisgIHN0YXRpYyBzdHJ1Y3QgdGVybWlvIHR0cmF3ID0gezB9OwkvKiB3aGljaCBpcyBpbXBvcnRhbnQgZm9yIHNvbWUgKi8KKyAgc3RhdGljIHN0cnVjdCB0ZXJtaW8gdHR0dnQgPSB7MH07CS8qIHN5c3RlbXMsIGxpa2UgWmlsb2cuLi4gKi8KKyAgc3RhdGljIHN0cnVjdCB0ZXJtaW8gdHRjdXIgPSB7MH07CisgIHN0YXRpYyBzdHJ1Y3QgdGVybWlvIGNjb2xkID0gezB9OworICBzdGF0aWMgc3RydWN0IHRlcm1pbyBjY3JhdyA9IHswfTsKKyAgc3RhdGljIHN0cnVjdCB0ZXJtaW8gY2NjYnJrID0gezB9OworI2Vsc2UKKyAgc3RhdGljIHN0cnVjdCBzZ3R0eWIgICAgICAgICAgICAgICAgICAvKiBzZ3R0eSBpbmZvLi4uICovCisgICAgdHRvbGQsIHR0cmF3LCB0dHR2dCwgdHRjdXIsIAkvKiBmb3IgY29tbXVuaWNhdGlvbiBsaW5lICovCisgICAgY2NvbGQsIGNjcmF3LCBjY2Nicms7CQkvKiBhbmQgZm9yIGNvbnNvbGUgKi8KKyNpZmRlZiBCRUxMVjEwCisgIHN0YXRpYyBzdHJ1Y3QgdHR5ZGV2YgkJCS8qIERldmljZSBpbmZvLi4uICovCisgICAgdGRvbGQsIHRkY3VyOwkJCS8qIGZvciBjb21tdW5pY2F0aW9uIGRldmljZSAqLworI2VuZGlmIC8qIEJFTExWMTAgKi8KKyNpZmRlZiBUSU9DR0VUQworICBzdGF0aWMgc3RydWN0IHRjaGFycyB0Y2hvbGQsIHRjaG5vaTsKKworICBzdGF0aWMgaW50IHRjaGFyZjsKKyNlbmRpZiAvKiBUSU9DR0VUQyAqLworI2lmZGVmIFRJT0NHTFRDCisgIHN0YXRpYyBzdHJ1Y3QgbHRjaGFycyBsdGNob2xkLCBsdGNobm9pOworICBzdGF0aWMgaW50IGx0Y2hhcmY7CisjZW5kaWYgLyogVElPQ0dMVEMgKi8KKyAgaW50IGxtb2RlZiA9IDA7CQkJLyogTG9jYWwgbW9kZXMgKi8KKyAgaW50IGxtb2RlID0gMDsKKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIEJTRDQ0T1JQT1NJWCAqLworCisjaWZkZWYgQ09NTUVOVAorLyogSXQgcGlja3MgdXAgdGhlIHNwZWVkcyBidXQgdGhleSBkb24ndCB3b3JrICovCisjaWZkZWYgVU5JWFdBUkUJCQkJLyogRm9yIGhpZ2hlciBzZXJpYWwgc3BlZWRzICovCisjaWZkZWYgVVc3CQkJCS8qIGluIFVuaXh3YXJlIDcuMCAqLworI2luY2x1ZGUgPHN5cy9hc3ljLmg+CQkJLyogVGhpcyBwaWNrcyB1cCA1NzYwMCBhbmQgMTE1MjAwICovCisjZW5kaWYgLyogVVc3ICovCisjZW5kaWYgLyogVU5JWFdBUkUgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBQUk9WWDEKKyAgc3RhdGljIHN0cnVjdCBzZ3R0eWIgdHRidWY7CisjZW5kaWYgLyogUFJPVlgxICovCisKKyNpZmRlZiB1bHRyaXgKKy8qIGRvIHdlIHJlYWxseSBuZWVkIHRoaXM/ICovCisgIHN0YXRpYyBzdHJ1Y3Qgc2d0dHliIHZhbmlsbGE7CisjZW5kaWYgLyogdWx0cml4ICovCisKKyNpZmRlZiBBVFQ3MzAwCitzdGF0aWMgaW50IGF0dG1vZGVtID0gMDsgICAgICAgICAgICAgICAgLyogQVRUNzMwMCBpbnRlcm5hbC1tb2RlbSBzdGF0dXMgKi8KK3N0cnVjdCB1cGRhdGEgZGlhbGVyID0gezB9OwkJLyogQ29uZGl0aW9uIGRpYWxlciBmb3IgZGF0YSBjYWxsICovCisjZW5kaWYgLyogQVRUNzMwMCAqLworCisjaWZuZGVmIE5PVVVDUAorI2RlZmluZSBGTEZOQU1MIDEyOAorI2lmbmRlZiBVU0VUVFlMT0NLCisjaWZkZWYgUlRBSVgKK2NoYXIgbGtmbGZuW0ZMRk5BTUxdID0geyAnXDAnLCAnXDAnIH07CS8qIGFuZCBwb3NzaWJsZSBsaW5rIHRvIGl0ICovCisjZW5kaWYgLyogUlRBSVggKi8KK2NoYXIgbG9jazJbRkxGTkFNTF0gPSAgeyAnXDAnLCAnXDAnIH07CS8qIE5hbWUgb2Ygc2Vjb25kIGxvY2tmaWxlICovCisjZW5kaWYgLyogVVNFVFRZTE9DSyAqLworI2Vsc2UKKyNkZWZpbmUgRkxGTkFNTCA3CisjZW5kaWYgLyogTk9VVUNQICovCitjaGFyIGZsZm5hbVtGTEZOQU1MKzFdID0geyAnXDAnLCAnXDAnIH07IC8qIFVVQ1AgbG9jayBmaWxlIHBhdGggbmFtZSAqLworCitpbnQgaGFzbG9jayA9IDA7CQkJLyogPTEgaWYgdGhpcyBrZXJtaXQgbG9ja2VkIHV1Y3AgKi8KKworI2lmbmRlZiBPWE9TCisjaWZkZWYgU1ZPUlBPU0lYCitzdGF0aWMgaW50IGNvbmVzYyA9IDA7ICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgaWYgZXNjIGNoYXIgKF5cKSB0eXBlZCAqLworI2Vsc2UKKyNpZmRlZiBWNworc3RhdGljIGludCBjb25lc2MgPSAwOworI2Vsc2UKKyNpZmRlZiBDNzAKK3N0YXRpYyBpbnQgY29uZXNjID0gMDsKKyNlbmRpZiAvKiBDNzAgKi8KKyNlbmRpZiAvKiBWNyAqLworI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworI2VuZGlmIC8qIE9YT1MgKi8KKworLyogTG9jYWwgY29weSBvZiBjb21tIGRldmljZSBuYW1lIG9yIG5ldHdvcmsgaG9zdCAqLworc3RhdGljIGNoYXIgdHRubXN2W0RFVk5BTUxFTisxXSA9IHsgJ1wwJywgJ1wwJyB9OworI2lmZGVmIFVTRVRUWUxPQ0sKK3N0YXRpYyBjaGFyIGxvY2tuYW1lW0RFVk5BTUxFTisxXTsJLyogRGl0dG8sIHRoZSBwYXJ0IGFmdGVyICIvZGV2LyIuICovCisjZW5kaWYgLyogVVNFVFRZTE9DSyAqLworCisjaWZkZWYgYWVnaXMKK3N0YXRpYyBzdGF0dXNfJHQgc3Q7ICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciBzdGF0dXMgcmV0dXJuIHZhbHVlICovCitzdGF0aWMgc2hvcnQgY29uY3JwID0gMDsgICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBjb25zb2xlIGlzIENSUCBwYWQgKi8KK3N0YXRpYyB1aWRfJHQgdHR5dWlkOyAgICAgICAgICAgICAgICAgICAvKiB0dHkgdHlwZSB1aWQgKi8KK3N0YXRpYyB1aWRfJHQgY29udWlkOyAgICAgICAgICAgICAgICAgICAvKiBzdGRvdXQgdHlwZSB1aWQgKi8KKworLyogQVBPTExPIEFlZ2lzIG1haW4oKQorICogZXN0YWJsaXNoIGFjbCB1c2FnZSBhbmQgY2xlYW51cCBoYW5kbGluZworICogICAgdGhpcyBtYWtlcyBzdXJlIHRoYXQgQ1JQIHBhZHMKKyAqICAgIGdldCByZXN0b3JlZCB0byBhIHVzYWJsZSBtb2RlCisgKi8KK21haW4oYXJnYyxhcmd2KSBpbnQgYXJnYzsgY2hhciAqKmFyZ3Y7IHsKKyAgICAgICAgc3RhdHVzXyR0IHN0YXR1czsKKyAgICAgICAgcGZtXyRjbGVhbnVwX3JlYyBkaXJ0eTsKKworICAgICAgICBQSURfVCBwaWQgPSBnZXRwaWQoKTsKKworICAgICAgICAvKiBhY2wgdXNhZ2UgYWNjb3JkaW5nIHRvIGludm9raW5nIGVudmlyb25tZW50ICovCisgICAgICAgIGRlZmF1bHRfYWNsKFVTRV9ERUZFTlYpOworCisgICAgICAgIC8qIGVzdGFibGlzaCBhIGNsZWFudXAgY29udGludWF0aW9uICovCisgICAgICAgIHN0YXR1cyA9IHBmbV8kY2xlYW51cChkaXJ0eSk7CisgICAgICAgIGlmIChzdGF0dXMuYWxsICE9IHBmbV8kY2xlYW51cF9zZXQpIHsKKyAgICAgICAgICAgICAgICAvKiBvbmx5IGhhbmRsZSBmYXVsdHMgZm9yIHRoZSBvcmlnaW5hbCBwcm9jZXNzICovCisgICAgICAgICAgICAgICAgaWYgKHBpZCA9PSBnZXRwaWQoKSAmJiBzdGF0dXMuYWxsID4gcGdtXyRtYXhfc2V2ZXJpdHkpIHsKKwkJICAgIC8qIGJsZXcgdXAgaW4gbWFpbiBwcm9jZXNzICovCisJCSAgICBzdGF0dXNfJHQgcXVvOworCQkgICAgcGZtXyRjbGVhbnVwX3JlYyBjbGVhbjsKKworCQkgICAgLyogcmVzdG9yZSB0aGUgY29uc29sZSBpbiBhbnkgY2FzZSAqLworCQkgICAgY29ucmVzKCk7CisKKwkJICAgIC8qIGF0dGVtcHQgYSBjbGVhbiBleGl0ICovCisJCSAgICBkZWJ1ZyhGMTAxLCAiY2xlYW51cCBmYXVsdCBzdGF0dXMiLCAiIiwgc3RhdHVzLmFsbCk7CisKKwkJICAgIC8qIGRvZXhpdCgpLCB0aGVuIHNlbmQgc3RhdHVzIHRvIGNvbnRpbnVhdGlvbiAqLworCQkgICAgcXVvID0gcGZtXyRjbGVhbnVwKGNsZWFuKTsKKwkJICAgIGlmIChxdW8uYWxsID09IHBmbV8kY2xlYW51cF9zZXQpCisJCSAgICAgIGRvZXhpdChwZ21fJHByb2dyYW1fZmF1bHRlZCwtMSk7CisJCSAgICBlbHNlIGlmIChxdW8uYWxsID4gcGdtXyRtYXhfc2V2ZXJpdHkpCisJCSAgICAgIHBmbV8kc2lnbmFsKHF1byk7IC8qIGJsZXcgdXAgaW4gZG9leGl0KCkgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogc2VuZCB0byB0aGUgb3JpZ2luYWwgY29udGludWF0aW9uICovCisgICAgICAgICAgICAgICAgcGZtXyRzaWduYWwoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAvKk5PVFJFQUNIRUQqLworCSAgICB9CisgICAgICAgIHJldHVybihja2NtYWkoYXJnYywgYXJndikpOworfQorI2VuZGlmIC8qIGFlZ2lzICovCisKKy8qIEFOU0ktc3R5bGUgcHJvdG90eXBlcyBmb3IgaW50ZXJuYWwgZnVuY3Rpb25zLiAqLworLyogRnVuY3Rpb25zIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZSBhcmUgcHJvdG90eXBlZCBpbiBja2NrZXIuaC4gKi8KKworI2lmZGVmIGFwb2xsbworX1BST1RPVFlQKCBTSUdUWVAgdGltZXJoLCAoKSApOworX1BST1RPVFlQKCBTSUdUWVAgY2N0cmFwLCAoKSApOworX1BST1RPVFlQKCBTSUdUWVAgZXNjdHJwLCAoKSApOworX1BST1RPVFlQKCBTSUdUWVAgc2lnX2lnbiwgKCkgKTsKKyNlbHNlCitfUFJPVE9UWVAoIFNJR1RZUCB0aW1lcmgsIChpbnQpICk7CitfUFJPVE9UWVAoIFNJR1RZUCBjY3RyYXAsIChpbnQpICk7CitfUFJPVE9UWVAoIFNJR1RZUCBlc2N0cnAsIChpbnQpICk7CisjZW5kaWYgLyogYXBvbGxvICovCitfUFJPVE9UWVAoIGludCBkb19vcGVuLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBzdGF0aWMgaW50IGluX2NoaywgKGludCwgaW50KSApOworX1BST1RPVFlQKCBzdGF0aWMgaW50IHR0cnBpZCwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggc3RhdGljIGludCB0dGNoa3BpZCwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggc3RhdGljIGludCB0dGxvY2ssIChjaGFyICopICk7CitfUFJPVE9UWVAoIHN0YXRpYyBpbnQgdHR1bmxjaywgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBteWdldGJ1ZiwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBteWZpbGxidWYsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIGNvbmJndCwgKGludCkgKTsKKyNpZmRlZiBBQ1VDTlRSTAorX1BST1RPVFlQKCBWT0lEIGFjdWNudHJsLCAoY2hhciAqLCBjaGFyICopICk7CisjZW5kaWYgLyogQUNVQ05UUkwgKi8KKworI2lmZGVmIEJTRDQ0T1JQT1NJWAorX1BST1RPVFlQKCBpbnQgY2FycmN0bCwgKHN0cnVjdCB0ZXJtaW9zICosIGludCkgKTsKKyNlbHNlCisjaWZkZWYgQVRUU1YKK19QUk9UT1RZUCggaW50IGNhcnJjdGwsIChzdHJ1Y3QgdGVybWlvICosIGludCkgKTsKKyNlbHNlCitfUFJPVE9UWVAoIGludCBjYXJyY3RsLCAoc3RydWN0IHNndHR5YiAqLCBpbnQpICk7CisjZW5kaWYgLyogQVRUU1YgKi8KKyNlbmRpZiAvKiBCU0Q0NE9SUE9TSVggKi8KKworI2lmZGVmIEFUVDczMDAKK19QUk9UT1RZUCggaW50IGF0dGRpYWwsIChjaGFyICosIGxvbmcsIGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IG9mZmdldHR5LCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgb25nZXR0eSwgKGNoYXIgKikgKTsKKyNlbmRpZiAvKiBBVFQ3MzAwICovCisKKyNpZmRlZiBCRU9TT1JCRUJPWAorI2lmZGVmIFNFTEVDVAorICAgIC8qIEJlT1MgaXMgbm90IGNhcGFibGUgb2YgdXNpbmcgU0VMRUNUIG9uIGFueXRoaW5nIGJ1dCBzb2NrZXRzICovCisjdW5kZWYgU0VMRUNUCisjZW5kaWYgLyogU0VMRUNUICovCisjaW5jbHVkZSA8a2VybmVsL09TLmg+CisvKiAjaWZkZWYgQkVfRFJfNyAqLworc3RhdGljIGRvdWJsZSB0aW1lX3N0YXJ0ZWQgPSAwLjA7CitzdHJ1Y3QgQUxBUk1fU1RSVUNUIHsKKyAgICB0aHJlYWRfaWQgdGhyZWFkOworICAgIGludCB0aW1lOworfTsKK3N0YXRpYyB0aHJlYWRfaWQgYWxhcm1fdGhyZWFkID0gLTE7CitzdGF0aWMgc3RydWN0IEFMQVJNX1NUUlVDVCBhbGFybV9zdHJ1Y3Q7CitfUFJPVE9UWVAoIGxvbmcgZG9fYWxhcm0sICh2b2lkICopICk7CitfUFJPVE9UWVAoIHVuc2lnbmVkIGludCBhbGFybSwgKHVuc2lnbmVkIGludCkgKTsKK19QUk9UT1RZUCggdm9pZCBhbGFybV9leHBpcmVkLCAodm9pZCkgKTsKKy8qICNlbmRpZiAqLyAvKiBCRV9EUl83ICovCisjZW5kaWYgLyogQkVPU09SQkVCT1ggKi8KKworI2lmbmRlZiB4dW5jaGFyCisjZGVmaW5lIHh1bmNoYXIoY2gpICgoKGNoKSAtIDMyICkgJiAweEZGICkJLyogQ2hhcmFjdGVyIHRvIG51bWJlciAqLworI2VuZGlmIC8qIHh1bmNoYXIgKi8KKworI2lmZGVmIENLX0FOU0lDCitzdGF0aWMgY2hhciAqCit4eGxhc3QoY2hhciAqcywgY2hhciBjKQorI2Vsc2UKK3N0YXRpYyBjaGFyICoKK3h4bGFzdChzLGMpIGNoYXIgKnM7IGNoYXIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogeHhsYXN0ICovIHsJCS8qICBMYXN0IG9jY3VycmVuY2Ugb2YgY2hhcmFjdGVyIGMgaW4gc3RyaW5nIHMuICovCisgICAgaW50IGk7CisgICAgZm9yIChpID0gKGludClzdHJsZW4ocyk7IGkgPiAwOyBpLS0pCisgICAgICBpZiAoc1tpLTFdID09IGMgKSByZXR1cm4ocyArIChpIC0gMSkpOworICAgIHJldHVybihOVUxMKTsKK30KKworLyogVGltZW91dCBoYW5kbGVyIGZvciBjb21tdW5pY2F0aW9uIGxpbmUgaW5wdXQgZnVuY3Rpb25zICovCisKKy8qQVJHU1VTRUQqLworU0lHVFlQCit0aW1lcmgoZm9vKSBpbnQgZm9vOyB7CisgICAgdHRpbW9mZigpOworI2lmZGVmIEJFT1NPUkJFQk9YCisvKiAjaWZkZWYgQkVfRFJfNyAqLworICAgIGFsYXJtX2V4cGlyZWQoKTsKKy8qICNlbmRpZiAqLyAvKiBCRV9EUl83ICovCisjZW5kaWYgLyogQkVPU09SQkVCT1ggKi8KKyNpZmRlZiBDS19QT1NJWF9TSUcKKyAgICBzaWdsb25nam1wKHNqYnVmLDEpOworI2Vsc2UKKyAgICBsb25nam1wKHNqYnVmLDEpOworI2VuZGlmIC8qIENLX1BPU0lYX1NJRyAqLworfQorCisvKkFSR1NVU0VEKi8KK1NJR1RZUAoreHRpbWVyaChmb28pIGludCBmb287IHsJCQkvKiBMaWtlIHRpbWVyaCgpIGJ1dCBkb2VzICovCisjaWZkZWYgQkVPU09SQkVCT1gJCQkvKiBub3QgcmVzZXQgdGhlIHRpbWVyIGl0c2xlZiAqLworLyogI2lmZGVmIEJFX0RSXzcgKi8KKyAgICBhbGFybV9leHBpcmVkKCk7CisvKiAjZW5kaWYgKi8gLyogQkVfRFJfNyAqLworI2VuZGlmIC8qIEJFT1NPUkJFQk9YICovCisjaWZkZWYgQ0tfUE9TSVhfU0lHCisgICAgc2lnbG9uZ2ptcChzamJ1ZiwxKTsKKyNlbHNlCisgICAgbG9uZ2ptcChzamJ1ZiwxKTsKKyNlbmRpZiAvKiBDS19QT1NJWF9TSUcgKi8KK30KKworCisvKiBDb250cm9sLUMgdHJhcCBmb3IgY29tbXVuaWNhdGlvbiBsaW5lIGlucHV0IGZ1bmN0aW9ucyAqLworCitpbnQgY2NfaW50OwkJCQkvKiBGbGFnICovCitTSUdUWVAgKCogb2NjdCkoKTsJCQkvKiBGb3Igc2F2aW5nIG9sZCBTSUdJTlQgaGFuZGxlciAqLworCisvKkFSR1NVU0VEKi8KK1NJR1RZUAorY2N0cmFwKGZvbykgaW50IGZvbzsgewkJCS8qIE5lZWRzIGFyZyBmb3IgQU5TSSBDICovCisgIGNjX2ludCA9IDE7CQkJCS8qIHNpZ25hbCgpIHByb3RvdHlwZS4gKi8KKyAgcmV0dXJuOworfQorCisvKiAgUyBZIFMgSSBOIEkgVCAgLS0gIFN5c3RlbS1kZXBlbmRlbnQgcHJvZ3JhbSBpbml0aWFsaXphdGlvbi4gICovCisKKy8qCisgKiB0dGd3c2l6KCkgcmV0dXJuczoKKyAqCTEgICAgdHRfcm93cyBhbmQgdHRfY29scyBhcmUga25vd24sIGJvdGggYWx0ZXJlZCwgYm90aCA+IDAKKyAqCTAgICAgdHRfcm93cyBhbmQvb3IgdHRfY29scyBhcmUga25vd24sIGJvdGggYWx0ZXJlZCwgb25lIG9yIGJvdGggPD0gMAorICoJLTEgICB0dF9yb3dzIGFuZCB0dF9jb2xzIGFyZSB1bmtub3duIGFuZCB1bmFsdGVyZWQKKyAqLworCitleHRlcm4gaW50IHR0X3Jvd3MsIHR0X2NvbHM7CisKK3N0YXRpYyBpbnQKK3h0dGd3c2l6KCkgeworICAgIGNoYXIgKnA7CisgICAgaW50IHJvd3MgPSAwLCBjb2xzID0gMDsKKyAgICBwID0gZ2V0ZW52KCJMSU5FUyIpOworICAgIGRlYnVnKEYxMTAsInh0dGd3c2l6IExJTkVTIixwLDApOworICAgIGlmIChwKSB7CisJcm93cyA9IGF0b2wocCk7CisJaWYgKHJvd3MgPiAwKSB7CisJICAgIHAgPSBnZXRlbnYoIkNPTFVNTlMiKTsKKwkgICAgZGVidWcoRjExMCwieHR0Z3dzaXogQ09MVU1OUyIscCwwKTsKKwkgICAgaWYgKHApIHsKKwkJY29scyA9IGF0b2wocCk7CisJCWlmIChjb2xzID4gMCkgeworCQkgICAgdHRfcm93cyA9IHJvd3M7CisJCSAgICB0dF9jb2xzID0gY29sczsKKwkJICAgIHJldHVybigxKTsKKwkJfQorCQlyZXR1cm4oMCk7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybigtMSk7Cit9CisKKyNpZmRlZiBUVExFQlVGCitWT0lECitsZV9pbml0KCkgewkJCQkvKiBMb2NhbEVjaG9Jbml0KCkgKi8KKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTEVCVUZTSVo7IGkrKykKKyAgICAgIGxlX2J1ZltpXSA9ICdcMCc7CisgICAgbGVfc3RhcnQgPSAwOworICAgIGxlX2VuZCA9IDA7CisgICAgbGVfZGF0YSA9IDA7Cit9CisKK1ZPSUQKK2xlX2NsZWFuKCkgewkJCQkvKiBMb2NhbEVjaG9DbGVhbnVwKCkgKi8KKyAgICBsZV9pbml0KCk7CisgICAgcmV0dXJuOworfQorCitpbnQKK2xlX2luYnVmKCkgeworICAgIGludCByYyA9IDA7CisgICAgaWYgKGxlX3N0YXJ0ICE9IGxlX2VuZCkgeworCXJjID0gKGxlX2VuZCAtCisJICAgICAgbGVfc3RhcnQgKworCSAgICAgIExFQlVGU0laKSAlIExFQlVGU0laOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJsZV9pbmJ1ZiIsImNoYXJzIHdhaXRpbmciLHJjKTsKKyAgICByZXR1cm4ocmMpOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworbGVfcHV0Y2hhcihDSEFSIGNoKQorI2Vsc2UKK2xlX3B1dGNoYXIoY2gpIENIQVIgY2g7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGxlX3B1dGNoYXIgKi8geworI2lmZGVmIENPTU1FTlQKKyAgICAvKiBJbiBVTklYIHdlIGRvIG5vdCBoYXZlIGFub3RoZXIgdGhyZWFkIHRha2luZyBjaGFycyBvdXQgb2YgdGhlIGJ1ZmZlciAqLworICAgIHdoaWxlICgobGVfc3RhcnQgLSBsZV9lbmQgPT0gMSkgfHwKKyAgICAgICAgICAgIChsZV9zdGFydCA9PSAwICYmIGxlX2VuZCA9PSBMRUJVRlNJWiAtIDEpKSB7CisJLyogQnVmZmVyIGlzIGZ1bGwgKi8KKyAgICAgICAgZGVidWcoRjExMSwibGVfcHV0Y2hhciIsIkJ1ZmZlciBpcyBGdWxsIixjaCk7CisgICAgICAgIFJlbGVhc2VMb2NhbEVjaG9NdXRleCgpIDsKKyAgICAgICAgbXNsZWVwKDI1MCk7CisgICAgICAgIFJlcXVlc3RMb2NhbEVjaG9NdXRleCggU0VNX0lOREVGSU5JVEVfV0FJVCApIDsKKyAgICB9CisjZWxzZQorICAgIGlmICgobGVfc3RhcnQgLSBsZV9lbmQgKyBMRUJVRlNJWiklTEVCVUZTSVogPT0gMSkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJsZV9wdXRjaGFyIiwiYnVmZmVyIGlzIGZ1bGwiLDApOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgbGVfYnVmW2xlX2VuZCsrXSA9IGNoOworICAgIGlmIChsZV9lbmQgPT0gTEVCVUZTSVopCisgICAgICBsZV9lbmQgPSAwOworICAgIGxlX2RhdGEgPSAxOworICAgIHJldHVybigwKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2xlX3B1dHMoQ0hBUiAqIHMsIGludCBuKQorI2Vsc2UKK2xlX3B1dHMocyxuKSBDSEFSICogczsgaW50IG47CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGxlX3B1dHMgKi8geworICAgIGludCByYyA9IDA7CisgICAgaW50IGkgPSAwOworICAgIENIQVIgKiBwID0gKENIQVIgKikibGVfcHV0cyI7CisgICAgaGV4ZHVtcChwLHMsbik7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgIHJjID0gbGVfcHV0Y2hhcigoY2hhcilzW2ldKTsKKyAgICBkZWJ1ZyhGMTAxLCJsZV9wdXRzIiwiIixyYyk7CisgICAgcmV0dXJuKHJjKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2xlX3B1dHN0cihDSEFSICogcykKKyNlbHNlCitsZV9wdXRzdHIocykgQ0hBUiAqIHM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGxlX3B1dHMgKi8geworICAgIENIQVIgKiBwOworICAgIGludCByYyA9IDA7CisgICAgcCA9IChDSEFSICopImxlX3B1dHN0ciI7CisgICAgaGV4ZHVtcChwLHMsKGludClzdHJsZW4oKGNoYXIgKilzKSk7CisgICAgZm9yIChwID0gczsgKnAgJiYgIXJjOyBwKyspCisgICAgICByYyA9IGxlX3B1dGNoYXIoKnApOworICAgIHJldHVybihyYyk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCitsZV9nZXRjaGFyKENIQVIgKiBwY2gpCisjZWxzZSAvKiBDS19BTlNJQyAqLworbGVfZ2V0Y2hhcihwY2gpIENIQVIgKiBwY2g7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGxlX2dhdGNoYXIgKi8geworICAgIGludCByYyA9IDA7CisgICAgaWYgKGxlX3N0YXJ0ICE9IGxlX2VuZCkgeworICAgICAgICAqcGNoID0gbGVfYnVmW2xlX3N0YXJ0XTsKKyAgICAgICAgbGVfYnVmW2xlX3N0YXJ0XSA9IDA7CisgICAgICAgIGxlX3N0YXJ0Kys7CisKKyAgICAgICAgaWYgKGxlX3N0YXJ0ID09IExFQlVGU0laKQorICAgICAgICAgIGxlX3N0YXJ0ID0gMDsKKworICAgICAgICBpZiAobGVfc3RhcnQgPT0gbGVfZW5kKSB7CisgICAgICAgICAgICBsZV9kYXRhID0gMDsKKyAgICAgICAgfQorICAgICAgICByYysrOworICAgIH0gZWxzZSB7CisgICAgICAgICpwY2ggPSAwOworICAgIH0KKyAgICByZXR1cm4ocmMpOworfQorI2VuZGlmIC8qIFRUTEVCVUYgKi8KKworI2lmZGVmIENPTU1FTlQKKy8qCisgIFNvbWUgc3lzdGVtcyBsaWtlIE9TRi8xIHVzZSBUSU9DR1NJWkUgaW5zdGVhZCBvZiBUSU9DR1dJTlNaLgorICBCdXQgYXMgZmFyIGFzIEkga25vdywgd2hlbmV2ZXIgVElPQ0dTSVpFIGlzIGRlZmluZWQsIGl0IGlzCisgIGVxdWF0ZWQgdG8gVElPQ0dXSU5TWi4gIEZvciBjYXNlcyB3aGVyZSB0aGlzIGlzIG5vdCBkb25lLCB0cnkgdGhpczoKKyovCisjaWZuZGVmIFRJT0NHV0lOU1oKKyNpZmRlZiBUSU9DR1NJWkUKKyNkZWZpbmUgVElPQ0dXSU5TWiBUSU9DR1NJWkUKKyNlbmRpZiAvKiBUSU9DR1NJWkUgKi8KKyNlbmRpZiAvKiBUSU9DR1dJTlNaICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCitzdGF0aWMgaW50IHR0X3hwaXhlbCA9IDAsIHR0X3lwaXhlbCA9IDA7CisKK2ludAordHRnd3NpeigpIHsKKyAgICBpbnQgeCA9IDA7CisjaWZuZGVmIE5PTkFXUworI2lmZGVmIFFOWAorLyoKKyAgTk9URTogVElPQ0dXU0laIHdvcmtzIGhlcmUgdG9vLCBidXQgb25seSBpbiB0aGUgMzItYml0IHZlcnNpb24uCisgIFRoaXMgY29kZSB3b3JrcyBmb3IgYm90aCB0aGUgMTYtIGFuZCAzMi1iaXQgdmVyc2lvbnMuCisqLworICAgIGV4dGVybiBpbnQgZGV2X3NpemUoaW50LCBpbnQsIGludCwgaW50ICosIGludCAqKTsKKyAgICBpbnQgciwgYzsKKworICAgIGlmIChkZXZfc2l6ZSgwLCAtMSwgLTEsICZyLCAmYykgPT0gMCkgeworCWRlYnVnKEYxMDEsInR0Z3dzaXogUU5YIHIiLCIiLHIpOworCWRlYnVnKEYxMDEsInR0Z3dzaXogUU5YIGMiLCIiLGMpOworCXR0X3Jvd3MgPSByOworCXR0X2NvbHMgPSBjOworCXJldHVybiAoKHIgPiAwICYmIGMgPiAwKSA/IDEgOiAwKTsKKyAgICB9IGVsc2UgcmV0dXJuKHh0dGd3c2l6KCkpOworI2Vsc2UgLyogUU5YICovCisjaWZkZWYgVElPQ0dXSU5TWgorCisvKiBOb3RlLCB0aGlzIHdhcyBNX1VOSVgsIGNoYW5nZWQgdG8gWEVOSVggdG8gYWxsb3cgY3Jvc3MgY29tcGlsYXRpb24uLi4gKi8KKyNpZmRlZiBYRU5JWAkJCQkvKiBTQ08gVU5JWCAzLjJ2NC4wICovCisjaW5jbHVkZSA8c3lzL3N0cmVhbS5oPgkJCS8qIHR5cGVkZWYgbWJsa190IG5lZWRlZCBieSBwdGVtLmggKi8KKyNpbmNsdWRlIDxzeXMvcHRlbS5oPgkJCS8qIGZvciB0dGd3c2l6KCkgKi8KKyNlbmRpZiAvKiBYRU5JWCAqLworCisjaWZkZWYgSTM4NklYCQkJCS8qIERpdHRvIGZvciBJbnRlcmFjdGl2ZSAqLworI2luY2x1ZGUgPHN5cy9zdHJlYW0uaD4KKyNpbmNsdWRlIDxzeXMvcHRlbS5oPgorI2VuZGlmIC8qIEkzODZJWCAqLworCisvKiBOb3RlLCB0aGUgYWJvdmUgbWlnaHQgYmUgbmVlZGVkIGZvciBzb21lIG90aGVyIG9sZGVyIFNWUjMgSW50ZWwgbWFrZXMuLi4gKi8KKworICAgIHN0cnVjdCB3aW5zaXplIHc7CisgICAgdHRfeHBpeGVsID0gMDsKKyAgICB0dF95cGl4ZWwgPSAwOworCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlcikKKyAgICAgIHJldHVybih4dHRnd3NpeigpKTsKKyNlbmRpZiAvKiBJS1NEICovCisgICAgeCA9IGlvY3RsKDAsIChpbnQpVElPQ0dXSU5TWiwgKGNoYXIgKikmdyk7CisgICAgZGVidWcoRjEwMSwidHRnd3NpeiBUSU9DR1dJTlNaIiwiIix4KTsKKyAgICBpZiAoeCA8IDApIHsKKwlyZXR1cm4oeHR0Z3dzaXooKSk7CisgICAgfSBlbHNlIGlmICh3LndzX3JvdyA+IDAgJiYgdy53c19jb2wgPiAwKSB7CisJdHRfcm93cyA9IHcud3Nfcm93OworCXR0X2NvbHMgPSB3LndzX2NvbDsKKwl0dF94cGl4ZWwgPSB3LndzX3hwaXhlbDsKKwl0dF95cGl4ZWwgPSB3LndzX3lwaXhlbDsKKwlkZWJ1ZyhGMTAxLCJ0dGd3c2l6IHR0X3Jvd3MiLCIiLHR0X3Jvd3MpOworCWRlYnVnKEYxMDEsInR0Z3dzaXogdHRfY29scyIsIiIsdHRfY29scyk7CisJcmV0dXJuKDEpOworICAgIH0gZWxzZSB7CisJZGVidWcoRjEwMCwidHRnd3NpeiBUSU9DR1dJTlNaIDAwIiwiIiwwKTsKKwlyZXR1cm4oeHR0Z3dzaXooKSk7CisgICAgfQorI2Vsc2UKKyAgICByZXR1cm4oeHR0Z3dzaXooKSk7CisjZW5kaWYgLyogVElPQ0dXSU5TWiAqLworI2VuZGlmIC8qIFFOWCAqLworI2VuZGlmIC8qIE5PTkFXUyAqLworfQorCisKKyNpZm5kZWYgTk9TSUdXSU5DSAorI2lmZGVmIFNJR1dJTkNICitTSUdUWVAKK3dpbmNoaChmb28pIGludCBmb287IHsJCQkvKiBTSUdXSU5DSCBoYW5kbGVyICovCisgICAgaW50IHggPSAwOworI2lmZGVmIE5FVFBUWQorICAgIGV4dGVybiBpbnQgcHR5X2ZvcmtfcGlkOworI2VuZGlmIC8qIE5FVFBUWSAqLworI2lmZGVmIENLX1RUWUZECisjaWZuZGVmIFZNUworICAgIGV4dGVybiBpbnQgdHR5ZmQ7CisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogQ0tfVFRZRkQgKi8KKyAgICBleHRlcm4gaW50IHR0X3Jvd3MsIHR0X2NvbHMsIGNtZF9yb3dzLCBjbWRfY29sczsKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKwlkZWJ1ZyhGMTAwLCIqKioqKioqKioqKioqKioiLCIiLDApOworCWRlYnVnKEYxMDAsIlNJR1dJTkNIIGNhdWdodCIsIiIsMCk7CisJZGVidWcoRjEwMCwiKioqKioqKioqKioqKioqIiwiIiwwKTsKKyNpZmRlZiBORVRQVFkKKwlkZWJ1ZyhGMTAxLCJTSUdXSU5DSCBwdHlfZm9ya19waWQiLCIiLHB0eV9mb3JrX3BpZCk7CisjZW5kaWYgLyogTkVUUFRZICovCisgICAgfQorI2VuZGlmIC8qIERFVUIgKi8KKyAgICBzaWduYWwoU0lHV0lOQ0gsd2luY2hoKTsgICAgICAgICAgICAvKiBSZS1hcm0gdGhlIHNpZ25hbCAqLworICAgIHggPSB0dGd3c2l6KCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBuZXcgd2luZG93IHNpemUgKi8KKyAgICBjbWRfcm93cyA9IHR0X3Jvd3M7CQkJLyogQWRqdXN0IGNvbW1hbmQgc2NyZWVuIHRvbyAqLworICAgIGNtZF9jb2xzID0gdHRfY29sczsKKworI2lmZGVmIENLX1RUWUZECisgICAgaWYJCQkJCS8qIElmIHdlIGRvbid0IGhhdmUgYSBjb25uZWN0aW9uICovCisjaWZkZWYgVk1TCQkJCS8qIHdlJ3JlIGRvbmUuICovCisgICAgICAodm1zdHR5ZmQoKSA9PSAtMSkKKyNlbHNlCisgICAgICAodHR5ZmQgPT0gLTEpCisjZW5kaWYgLyogVk1TICovCisjZWxzZQorICAgICAgKCFsb2NhbCkKKyNlbmRpZiAvKiBDS19UVFlGRCAqLworICAgICAgICByZXR1cm47CisKKyNpZmRlZiBORVRQVFkKKyAgICBpZiAocHR5X2ZvcmtfcGlkID4gLTEpIHsJCS8qICJzZXQgaG9zdCIgdG8gYSBQVFk/ICovCisJaW50IHg7CisKKyNpZmRlZiBUSU9DU1dJTlNaCisJc3RydWN0IHdpbnNpemUgdzsJCS8qIFJlc2l6ZSB0aGUgUFRZICovCisJZXJybm8gPSAwOworCXcud3NfY29sID0gdHRfY29sczsKKwl3LndzX3JvdyA9IHR0X3Jvd3M7CisJdy53c194cGl4ZWwgPSB0dF94cGl4ZWw7CisJdy53c195cGl4ZWwgPSB0dF95cGl4ZWw7CisJeCA9IGlvY3RsKHR0eWZkLFRJT0NTV0lOU1osJncpOworCWRlYnVnKEYxMDEsIndpbmNoaCBUSU9DU1dJTlNaIiwiIix4KTsKKwlkZWJ1ZyhGMTAxLCJ3aW5jaGggVElPQ1NXSU5TWiBlcnJubyIsIiIsZXJybm8pOworI2VuZGlmIC8qIFRJT0NTV0lOU1ogKi8KKworCWVycm5vID0gMDsKKwl4ID0ga2lsbChwdHlfZm9ya19waWQsU0lHV0lOQ0gpOworCWRlYnVnKEYxMDEsIndpbmNoaCBraWxsIiwiIix4KTsKKwlkZWJ1ZyhGMTAxLCJ3aW5jaGgga2lsbCBlcnJubyIsIiIsZXJybm8pOworICAgIH0KKyNlbmRpZiAvKiBORVRQVFkgKi8KKworLyoKKyAgVGhpcyBzaG91bGQgYmUgT0suICBJdCBtaWdodCBzZWVtIHRoYXQgc2VuZGluZyB0aGlzIGZyb20KKyAgaW50ZXJydXB0IGxldmVsIGNvdWxkIGludGVyZmVyZSB3aXRoIGFub3RoZXIgVEVMTkVUIElBQyBzdHJpbmcKKyAgdGhhdCB3YXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgc2VudC4gIEJ1dCB3ZSBhbHdheXMgc2VuZAorICBURUxORVQgc3RyaW5ncyB3aXRoIGEgc2luZ2xlIHdyaXRlKCksIHdoaWNoIHNob3VsZCBwcmV2ZW50IG1peHVwcy4KKyAgYmxhaF9zbmF3cygpIHNob3VsZCBwcm90ZWN0IHRoZW1zZWx2ZXMgZnJvbSBiZWluZyBjYWxsZWQgb24gdGhlCisgIHdyb25nIGtpbmQgb2YgY29ubmVjdGlvbi4KKyovCisjaWZkZWYgVENQU09DS0VUCisjaWZuZGVmIE5PVFRHV1NJWgorICAgIGlmICh4ID4gMCAmJiB0dF9yb3dzID4gMCAmJiB0dF9jb2xzID4gMCkgeworICAgICAgICB0bl9zbmF3cygpOworI2lmZGVmIFJMT0dDT0RFCisgICAgICAgIHJsb2dfbmF3cygpOworI2VuZGlmIC8qIFJMT0dDT0RFICovCisgICAgfQorI2VuZGlmIC8qIE5PVFRHV1NJWiAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworICAgIFNJR1JFVFVSTjsKK30KKyNlbmRpZiAvKiBTSUdXSU5DSCAqLworI2VuZGlmIC8qIE5PU0lHV0lOQ0ggKi8KKworU0lHVFlQCitzaWdodXAoZm9vKSBpbnQgZm9vOyB7CQkJLyogU0lHSFVQIGhhbmRsZXIgKi8KKyAgICBiYWNrZ3JkID0gMTsKKyAgICBkZWJ1ZyhGMTAwLCIqKioqKioqKioqKioqKioiLCIiLDApOworICAgIGRlYnVnKEYxMDAsIlNJR0hVUCByZWNlaXZlZCIsIiIsMCk7CisgICAgZGVidWcoRjEwMCwiKioqKioqKioqKioqKioqIiwiIiwwKTsKKyAgICBkb2V4aXQoQkFEX0VYSVQsLTEpOworICAgIC8qTk9UUkVBQ0hFRCovCisgICAgU0lHUkVUVVJOOwkJCQkvKiBTaHV0IHBpY2t5IGNvbXBpbGVycyB1cC4uLiAqLworfQorCisjaWZkZWYgQ0tfU0NPMzJWNAorLyogRXhpc3RzIGJ1dCB0aGVyZSBpcyBubyBwcm90b3R5cGUgaW4gdGhlIGhlYWRlciBmaWxlcyAqLworX1BST1RPVFlQKCBjaGFyICogdHR5bmFtZSwgKGludCkgKTsKKyNlbHNlCisjaWZkZWYgU1Y2OFIzVjYKK19QUk9UT1RZUCggY2hhciAqIHR0eW5hbWUsIChpbnQpICk7CisjZWxzZQorI2lmZGVmIHVsdHJpeAorX1BST1RPVFlQKCBjaGFyICogdHR5bmFtZSwgKGludCkgKTsKKyNlbHNlCisjaWZkZWYgSFBVWDYKK19QUk9UT1RZUCggY2hhciAqIHR0eW5hbWUsIChpbnQpICk7CisjZWxzZQorI2lmZGVmIEhQVVg1CitfUFJPVE9UWVAoIGNoYXIgKiB0dHluYW1lLCAoaW50KSApOworI2Vsc2UKKyNpZmRlZiBQUzJBSVgxMAorX1BST1RPVFlQKCBjaGFyICogdHR5bmFtZSwgKGludCkgKTsKKyNlbHNlCisjaWZkZWYgQlNENDIKK19QUk9UT1RZUCggY2hhciAqIHR0eW5hbWUsIChpbnQpICk7CisjZW5kaWYgLyogQlNENDIgKi8KKyNlbmRpZiAvKiBQUzJBSVgxMCAqLworI2VuZGlmIC8qIEhQVVg1ICovCisjZW5kaWYgLyogSFBVWDYgKi8KKyNlbmRpZiAvKiB1bHRyaXggKi8KKyNlbmRpZiAvKiBTVjY4UjNWNiAqLworI2VuZGlmIC8qIENLX1NDTzMyVjQgKi8KKworI2lmbmRlZiBTSUdVU1IxCQkJCS8qIFVzZXItZGVmaW5lZCBzaWduYWxzICovCisjZGVmaW5lIFNJR1VTUjEgMzAKKyNlbmRpZiAvKiBTSUdVU1IxICovCisKKyNpZm5kZWYgU0lHVVNSMgorI2RlZmluZSBTSUdVU1IyIDMxCisjZW5kaWYgLyogU0lHVVNSMiAqLworCisvKgorICBpZ25vcnNpZ3MoKSBzZXRzIGNlcnRhaW4gc2lnbmFscyB0byBTSUdfSUdOLiAgQnV0IHdoZW4gYSBzaWduYWwgaXMKKyAgaWdub3JlZCwgaXQgcmVtYWlucyBpZ25vcmVkIGFjcm9zcyBleGVjKCksIHNvIHdlIGhhdmUgdG8gcmVzdG9yZSB0aGVzZQorICBzaWduYWxzIGJlZm9yZSBleGVjKCksIHdoaWNoIGlzIHRoZSBwdXJwb3NlIG9mIHJlc3RvcnNpZ3MoKS4KKyovCitzdGF0aWMgVk9JRAoraWdub3JzaWdzKCkgewkJCQkvKiBJZ25vcmUgdGhlc2Ugc2lnbmFscyAqLworICAgIHNhdnF1aXQgPSBzaWduYWwoU0lHUVVJVCxTSUdfSUdOKTsJLyogSWdub3JlIFF1aXQgc2lnbmFsICovCisKKyNpZmRlZiBTSUdEQU5HRVIJCQkvKiBJZ25vcmUgZGFuZ2VyIHNpZ25hbHMgKi8KKy8qCisgIFRoaXMgc2lnbmFsIGlzIHNlbnQgd2hlbiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBzd2FwIHNwYWNlLiAgUHJvY2Vzc2VzCisgIHRoYXQgZG9uJ3QgaGFuZGxlIGl0IGFyZSBjYW5kaWRhdGVzIGZvciB0ZXJtaW5hdGlvbi4gIElmIHN3YXAgc3BhY2UgZG9lc24ndAorICBjbGVhciBvdXQgZW5vdWdoLCB3ZSBzdGlsbCBtaWdodCBiZSB0ZXJtaW5hdGVkIHZpYSBraWxsKCkgLS0gbm90aGluZyB3ZSBjYW4KKyAgZG8gYWJvdXQgdGhhdCEgIENvbmNlaXZhYmx5LCB0aGlzIGNvdWxkIGJlIGltcHJvdmVkIGJ5IGluc3RhbGxpbmcgYSByZWFsCisgIHNpZ25hbCBoYW5kbGVyIHRoYXQgd2FybnMgdGhlIHVzZXIsIGJ1dCB0aGF0IHdvdWxkIGJlIHByZXR0eSBjb21wbGljYXRlZCwKKyAgc2luY2Ugd2UgYXJlIG5vdCBhbHdheXMgaW4gY29udHJvbCBvZiB0aGUgc2NyZWVuIC0tIGUuZy4gZHVyaW5nIHJlbW90ZS1tb2RlCisgIGZpbGUgdHJhbnNmZXIuCisqLworICAgIHNhdmRhbmdlciA9IHNpZ25hbChTSUdEQU5HRVIsU0lHX0lHTik7IC8qIGUuZy4gaW4gQUlYICovCisjZW5kaWYgLyogU0lHREFOR0VSICovCisjaWZkZWYgU0lHUElQRQorLyoKKyAgVGhpcyBvbmUgY29tZXMgd2hlbiBhIFRDUC9JUCBjb25uZWN0aW9uIGlzIGJyb2tlbiBieSB0aGUgcmVtb3RlLgorICBXZSBwcmVmZXIgdG8gY2F0Y2ggdGhpcyBzaXR1YXRpb24gYnkgZXhhbWluaW5nIGVycm9yIGNvZGVzIGZyb20gd3JpdGUoKS4KKyovCisgICAgc2F2cGlwZSA9IHNpZ25hbChTSUdQSVBFLFNJR19JR04pOworI2VuZGlmIC8qIFNJR1BJUEUgKi8KKyAgICBzYXZ1c3IxID0gc2lnbmFsKFNJR1VTUjEsU0lHX0lHTik7CS8qIElnbm9yZSB1c2VyLWRlZmluZWQgc2lnbmFscyAqLworICAgIHNhdnVzcjIgPSBzaWduYWwoU0lHVVNSMixTSUdfSUdOKTsKK30KKworVk9JRAorcmVzdG9yc2lncygpIHsJCQkJLyogUmVzdG9yZSB0aGVzZSBzaWduYWxzICovCisgICAgKFZPSUQpIHNpZ25hbChTSUdRVUlULHNhdnF1aXQpOwkvKiAodXNlZCBpbiBja3VmaW8uYykgKi8KKyNpZmRlZiBTSUdEQU5HRVIKKyAgICAoVk9JRCkgc2lnbmFsKFNJR0RBTkdFUixzYXZkYW5nZXIpOworI2VuZGlmIC8qIFNJR0RBTkdFUiAqLworI2lmZGVmIFNJR1BJUEUKKyAgICAoVk9JRCkgc2lnbmFsKFNJR1BJUEUsc2F2cGlwZSk7CisjZW5kaWYgLyogU0lHUElQRSAqLworICAgIChWT0lEKSBzaWduYWwoU0lHVVNSMSxzYXZ1c3IxKTsKKyAgICAoVk9JRCkgc2lnbmFsKFNJR1VTUjIsc2F2dXNyMik7Cit9CisKK2ludAorc3lzaW5pdCgpIHsKKyAgICBpbnQgeDsKKyAgICBjaGFyICogczsKKyNpZmRlZiBDS19VVFNOQU1FCisgICAgc3RydWN0IHV0c25hbWUgbmFtZTsKKyNlbmRpZiAvKiBDS19VVFNOQU1FICovCisKKyAgICBleHRlcm4gY2hhciBzdGFydHVwZGlyW107CisvKgorICBCRUZPUkUgQU5ZVEhJTkcgRUxTRTogSW5pdGlhbGl6ZSB0aGUgc2V0dWlkIHBhY2thZ2UuCisgIENoYW5nZSB0byB0aGUgdXNlcidzIHJlYWwgdXNlciBhbmQgZ3JvdXAgSUQuCisgIElmIHRoaXMgY2FuJ3QgYmUgZG9uZSwgZG9uJ3QgcnVuIGF0IGFsbC4KKyovCisgICAgeCA9IHByaXZfaW5pKCk7CisjaWZkZWYgU1VJRERFQlVHCisgICAgZnByaW50ZihzdGRlcnIsIlBSSVZfSU5JPSVkXG4iLHgpOworI2VuZGlmIC8qIFNVSURERUJVRyAqLworICAgIGlmICh4KSB7CisJaWYgKHggJiAxKSBmcHJpbnRmKHN0ZGVyciwiRmF0YWw6IHNldHVpZCBmYWlsdXJlLlxuIik7CisJaWYgKHggJiAyKSBmcHJpbnRmKHN0ZGVyciwiRmF0YWw6IHNldGdpZCBmYWlsdXJlLlxuIik7CisJaWYgKHggJiA0KSBmcHJpbnRmKHN0ZGVyciwiRmF0YWw6IEMtS2VybWl0IHNldHVpZCB0byByb290IVxuIik7CisJZXhpdCgxKTsKKyAgICB9CisgICAgc2lnbmFsKFNJR0lOVCxTSUdfSUdOKTsJCS8qIElnbm9yZSBpbnRlcnJ1cHRzIGF0IGZpcnN0ICovCisgICAgc2lnbmFsKFNJR0ZQRSxTSUdfSUdOKTsJCS8qIElnbm9yZSBmbG9hdGluZy1wb2ludCBleGNlcHRpb25zICovCisgICAgc2lnbmFsKFNJR0hVUCxzaWdodXApOwkJLyogQ2F0Y2ggU0lHSFVQICovCisjaWZuZGVmIE5PU0lHV0lOQ0gKKyNpZmRlZiBTSUdXSU5DSAorICAgIHNpZ25hbChTSUdXSU5DSCx3aW5jaGgpOwkJLyogQ2F0Y2ggd2luZG93LXNpemUgY2hhbmdlICovCisjZW5kaWYgLyogU0lHV0lOQ0ggKi8KKyNlbmRpZiAvKiBOT1NJR1dJTkNIICovCisKKyNpZm5kZWYgTk9KQworLyoKKyAgR2V0IHRoZSBpbml0aWFsIGpvYiBjb250cm9sIHN0YXRlLgorICBJZiBpdCBpcyBTSUdfSUdOLCB0aGF0IG1lYW5zIHRoZSBzaGVsbCBkb2VzIG5vdCBzdXBwb3J0IGpvYiBjb250cm9sLAorICBhbmQgc28gd2UnZCBiZXR0ZXIgbm90IHN1c3BlbmQgb3Vyc2VsdmVzLgorKi8KKyNpZmRlZiBTSUdUU1RQCisgICAgamNoZGxyID0gc2lnbmFsKFNJR1RTVFAsU0lHX0lHTik7CisgICAgaWYgKGpjaGRsciA9PSBTSUdfSUdOKSB7CisJamNzaGVsbCA9IDA7CisJZGVidWcoRjEwMCwic3lzaW5pdCBqY2hkbHI6IFNJR19JR04iLCIiLDApOworICAgIH0gZWxzZSBpZiAoamNoZGxyID09IFNJR19ERkwpIHsKKwlkZWJ1ZyhGMTAwLCJzeXNpbml0IGpjaGRscjogU0lHX0RGTCIsIiIsMCk7CisJamNzaGVsbCA9IDE7CisgICAgfSBlbHNlIHsKKwlkZWJ1ZyhGMTAwLCJzeXNpbml0IGpjaGRscjogb3RoZXIiLCIiLDApOworCWpjc2hlbGwgPSAzOworICAgIH0KKyAgICAoVk9JRCkgc2lnbmFsKFNJR1RTVFAsamNoZGxyKTsJLyogUHV0IGl0IGJhY2suLi4gKi8KKyNlbmRpZiAvKiBTSUdUU1RQICovCisjZW5kaWYgLyogTk9KQyAqLworCisgICAgY29uYmd0KDApOwkJCQkvKiBTZWUgaWYgd2UncmUgaW4gdGhlIGJhY2tncm91bmQgKi8KKyAgICBjb25nbSgpOwkJCQkvKiBHZXQgY29uc29sZSBtb2RlcyAqLworCisgICAgKFZPSUQpIHNpZ25hbChTSUdBTFJNLFNJR19JR04pOwkvKiBJZ25vcmUgYWxhcm1zICovCisKKyAgICBpZ25vcnNpZ3MoKTsJCQkvKiBJZ25vcmUgc29tZSBvdGhlciBzaWduYWxzICovCisKKyNpZmRlZiBGX1NFVEZMCisgICAgaW5pZmxhZ3MgPSBmY250bCgwLEZfR0VURkwsMCk7CS8qIEdldCBzdGRpbiBmbGFncyAqLworI2VuZGlmIC8qIEZfU0VURkwgKi8KKworI2lmZGVmIHVsdHJpeAorICAgIGd0dHkoMCwmdmFuaWxsYSk7CQkJLyogR2V0IHNndHR5IGluZm8gKi8KKyNlbHNlCisjaWZkZWYgQVVYCisgICAgc2V0NDJzaWcoKTsJCQkJLyogRG9uJ3QgYXNrISAoaGFrYW5zb25AY3Mub3JzdC5lZHUpICovCisjZW5kaWYgLyogQVVYICovCisjZW5kaWYgLyogdWx0cml4ICovCisvKgorICBXYXJuaW5nOiBvbiBzb21lIFVOSVggc3lzdGVtcyAoU1ZSND8pLCB0dHluYW1lKCkgcmVwb3J0ZWRseSBvcGVucyAvZGV2IGJ1dAorICBuZXZlciBjbG9zZXMgaXQuICBJZiBpdCBpcyBjYWxsZWQgb2Z0ZW4gZW5vdWdoLCB3ZSBydW4gb3V0IG9mIGZpbGUKKyAgZGVzY3JpcHRvcnMgYW5kIHN1YnNlcXVlbnQgb3BlbigpJ3Mgb2Ygb3RoZXIgZGV2aWNlcyBvciBmaWxlcyBjYW4gZmFpbC4KKyovCisgICAgcyA9IE5VTEw7CisjaWZuZGVmIE1JTklYCisgICAgaWYgKGlzYXR0eSgwKSkJCQkvKiBOYW1lIG9mIGNvbnRyb2xsaW5nIHRlcm1pbmFsICovCisgICAgICBzID0gdHR5bmFtZSgwKTsKKyAgICBlbHNlIGlmIChpc2F0dHkoMSkpCisgICAgICBzID0gdHR5bmFtZSgxKTsKKyAgICBlbHNlIGlmIChpc2F0dHkoMikpCisgICAgICBzID0gdHR5bmFtZSgyKTsKKyAgICBkZWJ1ZyhGMTEwLCJzeXNpbml0IHR0eW5hbWUoMCkiLHMsMCk7CisjZW5kaWYgLyogTUlOSVggKi8KKworI2lmZGVmIEJFT1MKKyAgICBpZiAoIWRmdHR5KQorICAgICAgbWFrZXN0cigmZGZ0dHkscyk7CisjZW5kaWYgLyogQkVPUyAqLworCisgICAgaWYgKHMpCisgICAgICBja3N0cm5jcHkoKGNoYXIgKiljdHRuYW0scyxERVZOQU1MRU4rMSk7CisjaWZkZWYgU1ZPUlBPU0lYCisgICAgaWYgKCFjdHRuYW1bMF0pCisgICAgICBjdGVybWlkKGN0dG5hbSk7CisjZW5kaWYgLyogU1ZPUlBPU0lYICovCisgICAgaWYgKCFjdHRuYW1bMF0pCisgICAgICBja3N0cm5jcHkoKGNoYXIgKiljdHRuYW0sZGZ0dHksREVWTkFNTEVOKzEpOworICAgIGRlYnVnKEYxMTAsInN5c2luaXQgQ1RUTkFNIixDVFROQU0sMCk7CisgICAgZGVidWcoRjExMCwic3lzaW5pdCBjdHRuYW0iLGN0dG5hbSwwKTsKKworICAgIHR0Z3dzaXooKTsJCQkJLyogR2V0IHdpbmRvdyAoc2NyZWVuKSBkaW1lbnNpb25zLiAqLworCisjaWZuZGVmIE5PU1lTQ09ORgorI2lmZGVmIF9TQ19PUEVOX01BWAorICAgIGNrbWF4ZmlsZXMgPSBzeXNjb25mKF9TQ19PUEVOX01BWCk7CisjZW5kaWYgLyogX1NDX09QRU5fTUFYICovCisjZW5kaWYgLyogTk9TWVNDT05GICovCisKKyNpZmRlZiBQbGFuOQorICAgIGlmICghYmFja2dyZCkgeworICAgIAljb25zY3RsZmQgPSBvcGVuKCIvZGV2L2NvbnNjdGwiLCBPX1dST05MWSk7CisgICAgCS8qbm9pc2VmZCA9IG9wZW4oIi9kZXYvbm9pc2UiLCBPX1dST05MWSkqLworICAgIH0KKyAgICBja3hlY2ggPSAxOworI2VuZGlmIC8qIFBsYW45ICovCisKKyNpZmRlZiBDS19VVFNOQU1FCisgICAgaWYgKHVuYW1lKCZuYW1lKSA+IC0xKSB7CisJY2tzdHJuY3B5KHVubV9tY2gsbmFtZS5tYWNoaW5lLENLX1NZU05NTE4pOworCWNrc3RybmNweSh1bm1fbmFtLG5hbWUuc3lzbmFtZSxDS19TWVNOTUxOKTsKKwlja3N0cm5jcHkodW5tX3JlbCxuYW1lLnJlbGVhc2UsQ0tfU1lTTk1MTik7CisJY2tzdHJuY3B5KHVubV92ZXIsbmFtZS52ZXJzaW9uLENLX1NZU05NTE4pOworI2lmZGVmIERFQlVHCisJaWYgKGRlYmxvZykgeworCSAgICBkZWJ1ZyhGMTEwLCJzeXNpbml0IHVuYW1lIG1hY2hpbmUiLHVubV9tY2gsMCk7CisJICAgIGRlYnVnKEYxMTAsInN5c2luaXQgdW5hbWUgc3lzbmFtZSIsdW5tX25hbSwwKTsKKwkgICAgZGVidWcoRjExMCwic3lzaW5pdCB1bmFtZSByZWxlYXNlIix1bm1fcmVsLDApOworCSAgICBkZWJ1ZyhGMTEwLCJzeXNpbml0IHVuYW1lIHZlcnNpb24iLHVubV92ZXIsMCk7CisJfQorI2VuZGlmIC8qIERFQlVHICovCisKKyNpZmRlZiBIUFVYOVBMVVMKKwlpZiAobmFtZS5tYWNoaW5lWzVdID09ICc4JykKKwkgIGhwaXM4MDAgPSAxOworCWVsc2UKKwkgIGhwaXM4MDAgPSAwOworCWRlYnVnKEYxMDEsInN5c2luaXQgaHBpczgwMCIsIiIsaHBpczgwMCk7CisjZW5kaWYgLyogSFBVWDlQTFVTICovCisjaWZkZWYgVFJVNjQKKyAgICAgICAgZ2V0c3lzaW5mbyhHU0lfUExBVEZPUk1fTkFNRSwgdW5tX21vZCwgQ0tfU1lTTk1MTiwgMCwgMCk7CisgICAgICAgIGRlYnVnKEYxMTAsInN5c2luaXQgZ2V0c3lzaW5mbyBtb2RlbCIsdW5tX21vZCwwKTsKKyNlbmRpZiAvKiBUUlU2NCAqLworI2lmZGVmIFNPTEFSSVMyNQorICAgICAgICBzeXNpbmZvKFNJX1BMQVRGT1JNLCB1bm1fbW9kLCBDS19TWVNOTUxOKTsKKyAgICAgICAgZGVidWcoRjExMCwic3lzaW5pdCBzeXNpbmZvIG1vZGVsIix1bm1fbW9kLDApOworI2VuZGlmIC8qIFNPTEFSSVMyNSAqLworICAgIH0KKyNlbmRpZiAvKiBDS19VVFNOQU1FICovCisKKyNpZmRlZiBDS19FTlZJUk9OTUVOVAorICAgIHsKKyNpZmRlZiBUTkNPREUKKwlleHRlcm4gY2hhciB0bl9lbnZfYWNjdFtdLCB0bl9lbnZfZGlzcFtdLCB0bl9lbnZfam9iW10sCisJdG5fZW52X3BybnRbXSwgdG5fZW52X3N5c1tdOworI2VuZGlmIC8qIFROQ09ERSAqLworCWV4dGVybiBjaGFyIHVpZGJ1ZltdOworICAgICAgICBleHRlcm4gY2hhciAqIHdob2FtaSgpOworCWNoYXIgKnA7CisjaWZkZWYgQ0tTRU5EVUlECisgICAgICAgIHVpZGJ1ZlswXSA9ICdcMCc7CisjaWZkZWYgSUtTRAorICAgICAgICBpZiAoIWluc2VydmVyKSB7CisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgICAgcCA9IGdldGVudigiVVNFUiIpOworICAgICAgICAgICAgZGVidWcoRjExMCwic3lzaW5pdCB1aWRidWYgZnJvbSBVU0VSIix1aWRidWYsMCk7CisJICAgIGlmICghcCkgcCA9ICIiOworICAgICAgICAgICAgaWYgKCEqcCkgeworICAgICAgICAgICAgICAgIHAgPSBnZXRlbnYoIkxPR05BTUUiKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzeXNpbml0IHVpZGJ1ZiBmcm9tIExPR05BTUUiLHVpZGJ1ZiwwKTsKKyAgICAgICAgICAgIH0KKwkgICAgaWYgKCFwKSBwID0gIiI7CisgICAgICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICAgICAgcCA9IHdob2FtaSgpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInN5c2luaXQgdWlkYnVmIGZyb20gd2hvYW1pKCkiLHVpZGJ1ZiwwKTsKKyAgICAgICAgICAgIH0KKwkgICAgaWYgKCFwKSBwID0gIiI7CisJICAgIGNrc3RybmNweSh1aWRidWYsICpwID8gcCA6ICJVTktOT1dOIiwgVUlEQlVGTEVOKTsKKyNpZmRlZiBJS1NECisgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisJZGVidWcoRjExMCwic3lzaW5pdCBmaW5hbCB1aWRidWYiLHVpZGJ1ZiwwKTsKKyNlbmRpZiAvKiBDS1NFTkRVSUQgKi8KKworI2lmZGVmIFROQ09ERQorCWlmICgocCA9IGdldGVudigiSk9CIikpKSBja3N0cm5jcHkodG5fZW52X2pvYixwLDYzKTsKKwlpZiAoKHAgPSBnZXRlbnYoIkFDQ1QiKSkpIGNrc3RybmNweSh0bl9lbnZfYWNjdCxwLDYzKTsKKwlpZiAoKHAgPSBnZXRlbnYoIlBSSU5URVIiKSkpIGNrc3RybmNweSh0bl9lbnZfcHJudCxwLDYzKTsKKwlpZiAoKHAgPSBnZXRlbnYoIkRJU1BMQVkiKSkpIGNrc3RybmNweSh0bl9lbnZfZGlzcCxwLDYzKTsKKyNpZmRlZiBhZWdpcworCWNrc3RybmNweSh0bl9lbnZfc3lzLCJBZWdpcyIsNjQpOworI2Vsc2UKKyNpZmRlZiBQbGFuOQorCWNrc3RybmNweSh0bl9lbnZfc3lzLCJQbGFuOSIsNjQpOworI2Vsc2UKKwlja3N0cm5jcHkodG5fZW52X3N5cywiVU5JWCIsNjQpOworI2VuZGlmIC8qIFBsYW45ICovCisjZW5kaWYgLyogYWVnaXMgKi8KKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICB9CisjZW5kaWYgLyogQ0tfRU5WSVJPTk1FTlQgKi8KKyNpZmRlZiBDS19TTkRMT0MKKyAgICB7CisJZXh0ZXJuIGNoYXIgKiB0bl9sb2M7CisJY2hhciAqcDsKKwlpZiAocCA9IGdldGVudigiTE9DQVRJT04iKSkKKwkgIGlmICh0bl9sb2MgPSAoY2hhciAqKW1hbGxvYygoaW50KXN0cmxlbihwKSsxKSkKKwkgICAgc3RyY3B5KHRuX2xvYyxwKTsJCS8qIHNhZmUgKi8KKyAgICB9CisjZW5kaWYgLyogQ0tfU05ETE9DICovCisKKyAgICBja3N0cm5jcHkoc3RhcnR1cGRpciwgemd0ZGlyKCksIENLTUFYUEFUSCk7CisgICAgc3RhcnR1cGRpcltDS01BWFBBVEhdID0gJ1wwJzsKKyAgICB4ID0gc3RybGVuKHN0YXJ0dXBkaXIpOworICAgIGlmICh4IDw9IDApIHsKKwlzdGFydHVwZGlyWzBdID0gJy8nOworCXN0YXJ0dXBkaXJbMV0gPSAnXDAnOworICAgIH0gZWxzZSBpZiAoc3RhcnR1cGRpclt4LTFdICE9ICcvJykgeworCXN0YXJ0dXBkaXJbeF0gPSAnLyc7CisJc3RhcnR1cGRpclt4KzFdID0gJ1wwJzsKKyAgICB9CisgICAgZGVidWcoRjExMCwic3lzaW5pdCBzdGFydHVwZGlyIixzdGFydHVwZGlyLDApOworI2lmZGVmIFRUTEVCVUYKKyAgICBsZV9pbml0KCk7CisjZW5kaWYgLyogVFRMRUJVRiAqLworI2lmZGVmIEJTRDQ0T1JQT1NJWAorICAgIC8qIFRoaXMgc2hvdWxkIGNhdGNoIHRoZSBuY3Vyc2VzIHBsYXRmb3JtcyAqLworICAgIC8qIFNvbWUgcGxhdGZvcm1zIGRvbid0IGhhdmUgcHV0ZW52KCksIGxpa2UgTmVYVFNURVAgKi8KKyAgICBwdXRlbnYoIk5DVVJTRVNfTk9fU0VUQlVGPTEiKTsKKyNlbmRpZiAvKiBCU0Q0NE9SUE9TSVggKi8KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qICBTIFkgUyBDIEwgRSBBIE4gVSBQICAtLSAgU3lzdGVtLWRlcGVuZGVudCBwcm9ncmFtIGNsZWFudXAuICAqLworCitpbnQKK3N5c2NsZWFudXAoKSB7CisjaWZkZWYgRl9TRVRGTAorICAgIGlmIChpbmlmbGFncyA+IC0xKQorICAgICAgZmNudGwoMCxGX1NFVEZMLGluaWZsYWdzKTsJLyogUmVzdG9yZSBzdGRpbiBmbGFncyAqLworI2VuZGlmIC8qIEZfU0VURkwgKi8KKyNpZmRlZiB1bHRyaXgKKyAgICBzdHR5KDAsJnZhbmlsbGEpOyAgICAgICAgICAgICAgICAgICAvKiBHZXQgc2d0dHkgaW5mbyAqLworI2VuZGlmIC8qIHVsdHJpeCAqLworI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpZCkga2lsbCh0dHBpZCw5KTsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qICBUIFQgTyBQIEUgTiAgLS0gIE9wZW4gYSB0dHkgZm9yIGV4Y2x1c2l2ZSBhY2Nlc3MuICAqLworCisvKgorICBDYWxsIHdpdGg6CisgICAgdHRuYW1lOiBjaGFyYWN0ZXIgc3RyaW5nIC0gZGV2aWNlIG5hbWUgb3IgbmV0d29yayBob3N0IG5hbWUuCisgICAgbGNsOgorICBJZiBjYWxsZWQgd2l0aCBsY2wgPCAwLCBzZXRzIHZhbHVlIG9mIGxjbCBhcyBmb2xsb3dzOgorICAwOiB0aGUgdGVybWluYWwgbmFtZWQgYnkgdHRuYW1lIGlzIHRoZSBqb2IncyBjb250cm9sbGluZyB0ZXJtaW5hbC4KKyAgMTogdGhlIHRlcm1pbmFsIG5hbWVkIGJ5IHR0bmFtZSBpcyBub3QgdGhlIGpvYidzIGNvbnRyb2xsaW5nIHRlcm1pbmFsLgorICBCdXQgd2F0Y2ggb3V0OiBpZiBhIGxpbmUgaXMgYWxyZWFkeSBvcGVuLCBvciBpZiByZXF1ZXN0ZWQgbGluZSBjYW4ndAorICBiZSBvcGVuZWQsIHRoZW4gbGNsIHJlbWFpbnMgKGFuZCBpcyByZXR1cm5lZCBhcykgLTEuCisgICAgbW9kZW06CisgIExlc3MgdGhhbiB6ZXJvOiB0dG5hbWUgaXMgYSBuZXR3b3JrIGhvc3QgbmFtZS4KKyAgWmVybyBvciBncmVhdGVyOiB0dG5hbWUgaXMgYSB0ZXJtaW5hbCBkZXZpY2UgbmFtZS4KKyAgWmVybyBtZWFucyBhIGxvY2FsIGNvbm5lY3Rpb24gKGRvbid0IHVzZSBtb2RlbSBzaWduYWxzKS4KKyAgUG9zaXRpdmUgbWVhbnMgdXNlIG1vZGVtIHNpZ25hbHMuCisgICB0aW1vOgorICAwID0gbm8gdGltZXIuCisgIG5vbnplcm8gPSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBvcGVuKCkgdG8gcmV0dXJuIGJlZm9yZSB0aW1pbmcgb3V0LgorCisgIFJldHVybnM6CisgICAgMCBvbiBzdWNjZXNzCisgICAtNSBpZiBkZXZpY2UgaXMgaW4gdXNlCisgICAtNCBpZiBhY2Nlc3MgdG8gZGV2aWNlIGlzIGRlbmllZAorICAgLTMgaWYgYWNjZXNzIHRvIGxvY2sgZGlyZWN0b3J5IGRlbmllZAorICAgLTIgdXBvbiB0aW1lb3V0IHdhaXRpbmcgZm9yIGRldmljZSB0byBvcGVuCisgICAtMSBvbiBvdGhlciBlcnJvcgorKi8KK3N0YXRpYyBpbnQgdHRvdG1vID0gMDsJCQkvKiBUaW1lb3V0IGZsYWcgKi8KKy8qIEZsYWcga2VwdCBoZXJlIHRvIGF2b2lkIGJlaW5nIGNsb2JiZXJlZCBieSBsb25nam1wLiAgKi8KKworaW50Cit0dG9wZW4odHRuYW1lLGxjbCxtb2RlbSx0aW1vKSBjaGFyICp0dG5hbWU7IGludCAqbGNsLCBtb2RlbSwgdGltbzsgeworCisjaWZkZWYgQlNENDQKKyNkZWZpbmUgY3Rlcm1pZCh4KSBzdHJjcHkoeCwiIikKKyNlbHNlCisjaWZkZWYgU1ZPUlBPU0lYCisjaWZuZGVmIENJRQorICAgIGV4dGVybiBjaGFyICpjdGVybWlkKCk7CQkvKiBXaXNoIHRoZXkgYWxsIGhhZCB0aGlzISAqLworI2Vsc2UJCQkJCS8qIENJRSBSZWd1bHVzICovCisjZGVmaW5lIGN0ZXJtaWQoeCkgc3RyY3B5KHgsIiIpCisjZW5kaWYgLyogQ0lFICovCisjZW5kaWYgLyogU1ZPUlBPU0lYICovCisjZW5kaWYgLyogQlNENDQgKi8KKworI2lmZGVmIHVsdHJpeAorICAgIGludCB0ZW1wID0gMDsKKyNlbmRpZiAvKiB1bHRyaXggKi8KKworI2lmbmRlZiBPUEVORklSU1QKKyAgICBjaGFyIGZ1bGxuYW1lW0RFVk5BTUxFTisxXTsKKyNlbmRpZiAvKiBPUEVORklSU1QgKi8KKworICAgIGNoYXIgKiBmbmFtOwkJCS8qIEZ1bGwgbmFtZSBhZnRlciBleHBhbnNpb24gKi8KKworICAgIGludCB5OworCisjaWZuZGVmIHBkcDExCisjZGVmaW5lIE5BTUVGRAkgLyogRmVhdHVyZSB0byBhbGxvdyBuYW1lIHRvIGJlIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yICovCisjZW5kaWYgLyogcGRwMTEgKi8KKworI2lmZGVmIE5BTUVGRAorICAgIGNoYXIgKnA7CisgICAgZGVidWcoRjEwMSwidHRvcGVuIHRlbG5ldGZkIiwiIix0ZWxuZXRmZCk7CisjZW5kaWYgLyogTkFNRUZEICovCisKKyAgICBkZWJ1ZyhGMTEwLCJ0dG9wZW4gdHRuYW1lIix0dG5hbWUsMCk7CisgICAgZGVidWcoRjExMCwidHRvcGVuIHR0bm1zdiIsdHRubXN2LDApOworICAgIGRlYnVnKEYxMDEsInR0b3BlbiBtb2RlbSIsIiIsbW9kZW0pOworICAgIGRlYnVnKEYxMDEsInR0b3BlbiBuZXRjb25uIiwiIixuZXRjb25uKTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dG9wZW4gdHR5ZmQiLCIiLHR0eWZkKTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dG9wZW4gKmxjbCIsIiIsKmxjbCk7CisgICAgZGVidWcoRjEwMSwidHRvcGVuIHR0bWRtIiwiIix0dG1kbSk7CisgICAgZGVidWcoRjEwMSwidHRvcGVuIHR0bmV0IiwiIix0dG5ldCk7CisKKyAgICB0dHBtc2sgPSAweGZmOworICAgIGxvY2twaWRbMF0gPSAnXDAnOworCisgICAgaWYgKHR0eWZkID4gLTEpIHsJCQkvKiBJZiBkZXZpY2UgYWxyZWFkeSBvcGVuZWQgKi8KKyAgICAgICAgaWYgKCFzdHJuY21wKHR0bmFtZSx0dG5tc3YsREVWTkFNTEVOKSkgLyogYXJlIG5ldyAmIG9sZCBuYW1lcyBlcXVhbD8gKi8KKwkgIHJldHVybigwKTsJCQkvKiBZZXMsIG5vdGhpbmcgdG8gZG8gLSBqdXN0IHJldHVybiAqLworCXR0bm1zdlswXSA9ICdcMCc7CQkvKiBObywgY2xlYXIgb3V0IG9sZCBuYW1lICovCisJdHRjbG9zKHR0eWZkKTsJCQkvKiBjbG9zZSBvbGQgY29ubmVjdGlvbi4gICovCisgICAgfQorICAgIHdhc2Nsb3NlZCA9IDA7CQkJLyogTmV3IGNvbm5lY3Rpb24sIG5vdCBjbG9zZWQgeWV0LiAqLworICAgIHR0cGlwZSA9IDA7CQkJCS8qIEFzc3VtZSBpdCdzIG5vdCBhIHBpcGUgKi8KKyAgICB0dHB0eSA9IDA7CQkJCS8qIG9yIGEgcHR5Li4uICovCisKKyNpZmRlZiBORVRDT05OCisvKgorICBUaGlzIGlzIGEgYml0IHRyaWNreS4uLiAgU3VwcG9zZSB0aGF0IHByZXZpb3VzbHkgS2VybWl0IGhhZCBkaWFsZWQgYSB0ZWxuZXQKKyAgbW9kZW0gc2VydmVyICgic2V0IGhvc3QgeHh4OjIwMDEsIHNldCBtb2RlbSB0eXBlIHVzciwgZGlhbCAuLi4iKS4gIFRoZW4gdGhlCisgIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCAodHR5ZmQgPSAtMSksIGFuZCB0aGVuIGEgUkVESUFMIGNvbW1hbmQgd2FzIGdpdmVuLiAgQXQKKyAgdGhpcyBwb2ludCB3ZSd2ZSBvYmxpdGVyYXRlZCB0aGUgbmVnYXRpdmUgbW9kZW0gdHlwZSBoYWNrLCBhbmQgc28gd291bGQKKyAgdHJlYXQgdGhlIElQIGhvc3RuYW1lIGFzIGEgZGV2aWNlIG5hbWUsIGFuZCB3b3VsZCB0aGVuIGZhaWwgYmVjYXVzZSBvZiAiTm8KKyAgc3VjaCBkZXZpY2Ugb3IgZGlyZWN0b3J5Ii4gIEJ1dCB0aGUgcHJldmlvdXMgY29ubmVjdGlvbiBoYXMgbGVmdCBiZWhpbmQgc29tZQorICBjbHVlcywgc28gbGV0J3MgdXNlIHRoZW0uLi4KKyovCisgICAgaWYgKHR0eWZkIDwgMCkgewkJCS8qIENvbm5lY3Rpb24gaXMgbm90IG9wZW4gKi8KKwlpZiAoIXN0cmNtcCh0dG5hbWUsdHRubXN2KSkgewkvKiBPbGQgYW5kIG5ldyBuYW1lcyB0aGUgc2FtZT8gKi8KKwkgICAgaWYgKCgobmV0Y29ubiA+IDApICYmICh0dG1kbSA8IDApKSB8fAorCQkoKHR0bmV0ID4gMCkgJiYKKwkJICghY2tzdHJjaHIodHRuYW1lLCcvJykpICYmIChja3N0cmNocih0dG5hbWUsJzonKSkpCisJCSkgeworCQlpbnQgeCwgcmM7CisJCXggPSAodHRtZG0gPCAwKSA/IC10dG1kbSA6IHR0bmV0OworCQlyYyA9IG5ldG9wZW4odHRuYW1lLCBsY2wsIHgpOworCQlkZWJ1ZyhGMTExLCJ0dG9wZW4gUkVPUEVOIG5ldG9wZW4iLHR0bmFtZSxyYyk7CisJCWlmIChyYyA+IC0xKSB7CisJCSAgICBuZXRjb25uID0gMTsKKwkJICAgIHhsb2NhbCA9ICpsY2wgPSAxOworCQl9IGVsc2UgeworCQkgICAgbmV0Y29ubiA9IDA7CisJCX0KKwkJZ290c2lncyA9IDA7CisJCXJldHVybihyYyk7CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmZGVmIE1BWE5BTUxFTgorICAgIGRlYnVnKEYxMDAsInR0b3BlbiBNQVhOQU1MRU4gZGVmaW5lZCIsIiIsMCk7CisjZWxzZQorICAgIGRlYnVnKEYxMDAsInR0b3BlbiBNQVhOQU1MRU4gKk5PVCogZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYKKworI2lmZGVmIEJTRDQKKyAgICBkZWJ1ZyhGMTAwLCJ0dG9wZW4gQlNENCBkZWZpbmVkIiwiIiwwKTsKKyNlbHNlCisgICAgZGVidWcoRjEwMCwidHRvcGVuIEJTRDQgKk5PVCogZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYgLyogQlNENCAqLworCisjaWZkZWYgQlNENDIKKyAgICBkZWJ1ZyhGMTAwLCJ0dG9wZW4gQlNENDIgZGVmaW5lZCIsIiIsMCk7CisjZWxzZQorICAgIGRlYnVnKEYxMDAsInR0b3BlbiBCU0Q0MiAqTk9UKiBkZWZpbmVkIiwiIiwwKTsKKyNlbmRpZiAvKiBCU0Q0MiAqLworCisjaWZkZWYgTVlSRUFECisgICAgZGVidWcoRjEwMCwidHRvcGVuIE1ZUkVBRCBkZWZpbmVkIiwiIiwwKTsKKyNlbHNlCisgICAgZGVidWcoRjEwMCwidHRvcGVuIE1ZUkVBRCAqTk9UKiBkZWZpbmVkIiwiIiwwKTsKKyNlbmRpZiAvKiBNWVJFQUQgKi8KKworI2lmZGVmCU5FVENPTk4KKyAgICBpZiAobW9kZW0gPCAwKSB7CQkJLyogbW9kZW0gPCAwID0gY29kZSBmb3IgbmV0d29yayAqLworCWludCB4OworCXR0bWRtID0gbW9kZW07CisJbW9kZW0gPSAtbW9kZW07CQkJLyogUG9zaXRpdmUgbmV0d29yayB0eXBlIG51bWJlciAqLworCWZkZmxhZyA9IDA7CQkJLyogU3RkaW8gbm90IHJlZGlyZWN0ZWQuICovCisJbmV0Y29ubiA9IDE7CQkJLyogQW5kIGl0J3MgYSBuZXR3b3JrIGNvbm5lY3Rpb24gKi8KKwlkZWJ1ZyhGMTExLCJ0dG9wZW4gbmV0Iix0dG5hbWUsbW9kZW0pOworI2lmZGVmIE5BTUVGRAorCWZvciAocCA9IHR0bmFtZTsgaXNkaWdpdCgqcCk7IHArKykgOyAvKiBDaGVjayBmb3IgYWxsIGRpZ2l0cyAqLworIAlpZiAoKnAgPT0gJ1wwJyAmJiAodGVsbmV0ZmQgfHwgeDI1ZmQpKSB7IC8qIEF2b2lkIFguMTIxIGFkZHJlc3NlcyAqLworCSAgICB0dHlmZCA9IGF0b2kodHRuYW1lKTsJLyogSXMgdGhlcmUgYSB3YXkgdG8gdGVzdCBpdCdzIG9wZW4/ICovCisJICAgIHR0ZmRmbGcgPSAxOwkJLyogV2UgZ290IGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yICovCisJICAgIGRlYnVnKEYxMTEsInR0b3BlbiBuZXQgdHRmZGZsZyIsdHRuYW1lLHR0ZmRmbGcpOworCSAgICBkZWJ1ZyhGMTAxLCJ0dG9wZW4gbmV0IHR0eWZkIiwiIix0dHlmZCk7CisJICAgIGNrc3RybmNweSh0dG5tc3YsdHRuYW1lLERFVk5BTUxFTik7IC8qIFJlbWVtYmVyIHRoZSAibmFtZSIuICovCisJICAgIHggPSAxOwkJCS8qIFJldHVybiBjb2RlIGlzICJnb29kIi4gKi8KKwkgICAgaWYgKHRlbG5ldGZkKSB7CisJCXR0bmV0ID0gTkVUX1RDUEI7CisJCWlmICh0dG5wcm90byAhPSBOUF9UQ1BSQVcpCisJCSAgdHRucHJvdG8gPSBOUF9URUxORVQ7CisjaWZkZWYgU1VOWDI1CisJICAgIH0gZWxzZSBpZiAoeDI1ZmQpIHsKKwkJdHRuZXQgPSBORVRfU1gyNTsKKwkJdHRucHJvdG8gPSBOUF9OT05FOworI2VuZGlmIC8qIFNVTlgyNSAqLworCSAgICB9CisJfSBlbHNlIHsJCQkvKiBIb3N0IG5hbWUgb3IgYWRkcmVzcyBnaXZlbiAqLworI2lmZGVmIE5FVFBUWQorCSAgICBpZiAobW9kZW0gPT0gTkVUX1BUWSkgeworCQlpbnQgeDsKKwkJaWYgKG5vcHVzaCkgeworCQkgICAgZGVidWcoRjEwMCwidHRvcGVuIFBUWTogbm9wdXNoIiwiIiwwKTsKKwkJICAgIHJldHVybigtMSk7CisJCX0KKyAgICAgICAgICAgICAgICB0dG5ldCA9IE5FVF9QVFk7CisJCXR0bnByb3RvID0gTlBfTk9ORTsKKyAgICAgICAgICAgICAgICBuZXRjb25uID0gMTsgICAgICAgICAgICAvKiBidXQgd2UgZG9uJ3QgdXNlIG5ldHdvcmsgaS9vICovCisgICAgICAgICAgICAgICAgdHRwdHkgPSAxOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInR0b3BlbiBQVFkiLHR0bmFtZSwwKTsKKwkJeCA9IGRvX3B0eSh0dG5hbWUpOworCQlpZiAoeCA+IC0xKSB7CisJCSAgICBja3N0cm5jcHkodHRubXN2LHR0bmFtZSxERVZOQU1MRU4pOworCQkgICAgeGxvY2FsID0gKmxjbCA9IDE7CS8qIEl0J3MgbG9jYWwgKi8KKwkJfSBlbHNlIHsKKwkJICAgIHR0cHR5ID0gMDsKKwkJICAgIG5ldGNvbm4gPSAwOworCQl9CisJCWdvdHNpZ3MgPSAwOworCQlyZXR1cm4oeCk7CisJICAgIH0KKyNlbmRpZiAvKiBORVRQVFkgKi8KKyNpZmRlZiBORVRDTUQKKy8qCisgIGR1cDIoKSBpcyBub3QgYXZhaWxhYmxlIG9uIG9sZGVyIFN5c3RlbSBWIHBsYXRmb3JtcyBsaWtlIEFUJlQgM0J4LiAgRm9yCisgIHRob3NlIHN5c3RlbXMgd2UgcHVudCBieSBub3QgZGVmaW5pbmcgTkVUQ01ELCBidXQgd2UgbWlnaHQgYmUgYWJsZSB0byBkbworICBiZXR0ZXIgLS0gc2VlIHdvcmthcm91bmRzIGZvciB0aGlzIHByb2JsZW0gaW4gY2t1ZmlvLmMgKHNlYXJjaCBmb3IgZHVwMikuCisqLworCSAgICBpZiAobW9kZW0gPT0gTkVUX0NNRCkgeworCQlpZiAobm9wdXNoKSB7CisJCSAgICBkZWJ1ZyhGMTAwLCJ0dG9wZW4gcGlwZTogbm9wdXNoIiwiIiwwKTsKKwkJICAgIHJldHVybigtMSk7CisJCX0KKwkJaWYgKHBpcGUocGlwZTApIHx8IHBpcGUocGlwZTEpKSB7CisJCSAgICBwZXJyb3IoIlBpcGUgZXJyb3IiKTsKKwkJICAgIHJldHVybigtMSk7CisJCX0KKwkJdHRwaWQgPSBmb3JrKCk7CQkvKiBNYWtlIGEgZm9yayAqLworCisJCXN3aXRjaCAodHRwaWQpIHsKKwkJICBjYXNlIC0xOgkJLyogRXJyb3IgbWFraW5nIGZvcmsgKi8KKwkJICAgIGNsb3NlKHBpcGUwWzBdKTsKKwkJICAgIGNsb3NlKHBpcGUwWzFdKTsKKwkJICAgIGNsb3NlKHBpcGUxWzBdKTsKKwkJICAgIGNsb3NlKHBpcGUxWzFdKTsKKwkJICAgIHBlcnJvcigiRm9yayBlcnJvciIpOworCQkgICAgcmV0dXJuKC0xKTsKKwkJICBjYXNlIDA6CQkvKiBDaGlsZC4gKi8KKwkJICAgIGNsb3NlKHBpcGUwWzBdKTsKKwkJICAgIGNsb3NlKHBpcGUxWzFdKTsKKwkJICAgIGR1cDIocGlwZTBbMV0sIDEpOworCQkgICAgY2xvc2UocGlwZTBbMV0pOworCQkgICAgZHVwMihwaXBlMVswXSwgMCk7CisJCSAgICBjbG9zZShwaXBlMVswXSk7CisJCSAgICBzeXN0ZW0odHRuYW1lKTsKKwkJICAgIF9leGl0KDApOworCQkgIGRlZmF1bHQ6CQkvKiBQYXJlbnQgKi8KKwkJICAgIGNsb3NlKHBpcGUwWzFdKTsKKwkJICAgIGNsb3NlKHBpcGUxWzBdKTsKKwkJICAgIGZkaW4gPSBwaXBlMFswXTsJLyogUmVhZCBmcm9tIHBpcGUgKi8KKwkJICAgIGZkb3V0ID0gcGlwZTFbMV07CS8qIFdyaXRlIHRvIHBpcGUgKi8KKwkJICAgIHR0b3V0ID0gZmRvcGVuKGZkb3V0LCJ3Iik7IC8qIEdldCBzdHJlYW0gc28gd2UgY2FuICovCisJCSAgICBpZiAoIXR0b3V0KSB7CS8qIG1ha2UgaXQgdW5idWZmZXJlZC4gKi8KKwkJCXBlcnJvcigiZmRvcGVuIGZhaWx1cmUiKTsKKwkJCXJldHVybigtMSk7CisJCSAgICB9CisJCSAgICBzZXRidWYodHRvdXQsTlVMTCk7CisJCSAgICBja3N0cm5jcHkodHRubXN2LHR0bmFtZSxERVZOQU1MRU4pOworCQkgICAgeGxvY2FsID0gKmxjbCA9IDE7CS8qIEl0J3MgbG9jYWwgKi8KKwkJICAgIG5ldGNvbm4gPSAxOwkvKiBDYWxsIGl0IGEgbmV0d29yayBjb25uZWN0aW9uICovCisJCSAgICB0dG1kbSA9IG1vZGVtOwkvKiBSZW1lbWJlciBuZXR3b3JrIHR5cGUgKi8KKwkJICAgIHR0eWZkID0gZmRpbjsKKwkJICAgIHR0cGlwZSA9IDE7CisJCSAgICBnb3RzaWdzID0gMDsKKwkJICAgIHJldHVybigwKTsKKwkJfQorCSAgICB9CisjZW5kaWYgLyogTkVUQ01EICovCisjZW5kaWYgLyogTkFNRUZEICovCisJICAgIHggPSBuZXRvcGVuKHR0bmFtZSwgbGNsLCBtb2RlbSk7IC8qIChzZWUgY2tjbmV0LmgpICovCisJICAgIGlmICh4ID4gLTEpIHsKKwkJY2tzdHJuY3B5KHR0bm1zdix0dG5hbWUsREVWTkFNTEVOKTsKKwkgICAgfSBlbHNlIG5ldGNvbm4gPSAwOworI2lmZGVmIE5BTUVGRAorCX0KKyNlbmRpZiAvKiBOQU1FRkQgKi8KKworI2lmZGVmIHNvbnlfbmV3cwkJCS8qIFNvbnkgTkVXUyAqLworCWlmIChpb2N0bCh0dHlmZCxUSU9DS0dFVCwma21fZXh0KSA8IDApIHsgLyogR2V0IEthbmppIG1vZGUgKi8KKwkgICAgcGVycm9yKCJ0dG9wZW4gZXJyb3IgZ2V0dGluZyBLYW5qaSBtb2RlIChuZXR3b3JrKSIpOworCSAgICBkZWJ1ZyhGMTExLCJ0dG9wZW4gZXJyb3IgZ2V0dGluZyBLYW5qaSBtb2RlIiwibmV0d29yayIsMCk7CisJICAgIGttX2V4dCA9IC0xOwkJLyogTWFrZSBzdXJlIHRoaXMgc3RheXMgdW5kZWZpbmVkLiAqLworCX0KKyNlbmRpZiAvKiBzb255X25ld3MgKi8KKworCXhsb2NhbCA9ICpsY2wgPSAxOwkJLyogTmV0d29yayBjb25uZWN0aW9ucyBhcmUgbG9jYWwuICovCisJZGVidWcoRjEwMSwidHRvcGVuIG5ldCB4IiwiIix4KTsKKyNpZmRlZiBDT01NRU5UCisvKiBMZXQgbmV0b3BlbigpIGRvIHRoaXMgKi8KKwlpZiAoeCA+IC0xICYmICF4MjVmZCkKKwkgIHggPSB0bl9pbmkoKTsJCQkvKiBJbml0aWFsaXplIFRFTE5FVCBwcm90b2NvbCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwlnb3RzaWdzID0gMDsKKwlyZXR1cm4oeCk7CisgICAgfSBlbHNlIHsJCQkJLyogVGVybWluYWwgZGV2aWNlICovCisjZW5kaWYJLyogTkVUQ09OTiAqLworCisjaWZkZWYgTkFNRUZECisvKgorICBUaGlzIGNvZGUgbGV0cyB5b3UgZ2l2ZSBLZXJtaXQgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgc2VyaWFsCisgIGNvbW11bmljYXRpb24gZGV2aWNlLCByYXRoZXIgdGhhbiBhIGRldmljZSBuYW1lLiAgS2VybWl0IGFzc3VtZXMgdGhhdCB0aGUKKyAgbGluZSBpcyBhbHJlYWR5IG9wZW4sIGxvY2tlZCwgY29uZGl0aW9uZWQgd2l0aCB0aGUgcmlnaHQgcGFyYW1ldGVycywgZXRjLgorKi8KKwlmb3IgKHAgPSB0dG5hbWU7IGlzZGlnaXQoKnApOyBwKyspIDsgLyogQ2hlY2sgZm9yIGFsbC1kaWdpdHMgKi8KKwlpZiAoKnAgPT0gJ1wwJykgeworCSAgICB0dHlmZCA9IGF0b2kodHRuYW1lKTsJLyogSXMgdGhlcmUgYSB3YXkgdG8gdGVzdCBpdCdzIG9wZW4/ICovCisJICAgIGRlYnVnKEYxMTEsInR0b3BlbiBnb3Qgb3BlbiBmZCIsdHRuYW1lLHR0eWZkKTsKKwkgICAgY2tzdHJuY3B5KHR0bm1zdix0dG5hbWUsREVWTkFNTEVOKTsgLyogUmVtZW1iZXIgdGhlICJuYW1lIi4gKi8KKwkgICAgaWYgKHR0eWZkID49IDAgJiYgdHR5ZmQgPCAzKSAvKiBJZiBpdCdzIHN0ZGlvLi4uICovCisJICAgICAgeGxvY2FsID0gKmxjbCA9IDA7CS8qIHdlJ3JlIGluIHJlbW90ZSBtb2RlICovCisJICAgIGVsc2UJCQkvKiBvdGhlcndpc2UgKi8KKwkgICAgICB4bG9jYWwgPSAqbGNsID0gMTsJLyogbG9jYWwgbW9kZS4gKi8KKwkgICAgbmV0Y29ubiA9IDA7CQkvKiBBc3N1bWUgaXQncyBub3QgYSBuZXR3b3JrLiAqLworCSAgICB0dnRmbGcgPSAwOwkJCS8qIE1pZ2h0IG5lZWQgdG8gaW5pdGlhbGl6ZSBtb2Rlcy4gKi8KKwkgICAgdHRtZG0gPSBtb2RlbTsJCS8qIFJlbWVtYmVyIG1vZGVtIHR5cGUuICovCisJICAgIGZkZmxhZyA9IDA7CQkJLyogU3RkaW8gbm90IHJlZGlyZWN0ZWQuICovCisJICAgIHR0ZmRmbGcgPSAxOwkJLyogRmxhZyB3ZSB3ZXJlIG9wZW5lZCB0aGlzIHdheS4gKi8KKwkgICAgZGVidWcoRjExMSwidHRvcGVuIG5vbi1uZXQgdHRmZGZsZyIsdHRuYW1lLHR0ZmRmbGcpOworCSAgICBkZWJ1ZyhGMTAxLCJ0dG9wZW4gbm9uLW5ldCB0dHlmZCIsIiIsdHR5ZmQpOworCisjaWZkZWYgc29ueV9uZXdzCQkJLyogU29ueSBORVdTICovCisJICAgIC8qIEdldCBkZXZpY2UgS2FuamkgbW9kZSAqLworCSAgICBpZiAoaW9jdGwodHR5ZmQsVElPQ0tHRVQsJmttX2V4dCkgPCAwKSB7CisJCXBlcnJvcigidHRvcGVuIGVycm9yIGdldHRpbmcgS2FuamkgbW9kZSIpOworCQlkZWJ1ZyhGMTAxLCJ0dG9wZW4gZXJyb3IgZ2V0dGluZyBLYW5qaSBtb2RlIiwiIiwwKTsKKwkJa21fZXh0ID0gLTE7CQkvKiBNYWtlIHN1cmUgdGhpcyBzdGF5cyB1bmRlZmluZWQuICovCisJICAgIH0KKyNlbmRpZiAvKiBzb255X25ld3MgKi8KKwkgICAgZ290c2lncyA9IDA7CisJICAgIHJldHVybigwKTsJCQkvKiBSZXR1cm4gc3VjY2VzcyAqLworCX0KKyNlbmRpZiAvKiBOQU1FRkQgKi8KKyNpZmRlZiBORVRDT05OCisgICAgfQorI2VuZGlmIC8qIE5FVENPTk4gKi8KKworLyogSGVyZSB3ZSBoYXZlIHRvIG9wZW4gYSBzZXJpYWwgZGV2aWNlIG9mIHRoZSBnaXZlbiBuYW1lLiAqLworCisgICAgbmV0Y29ubiA9IDA7CQkJLyogU28gaXQncyBub3QgYSBuZXR3b3JrIGNvbm5lY3Rpb24gKi8KKyAgICBvY2N0ID0gc2lnbmFsKFNJR0lOVCwgY2N0cmFwKTsJLyogU2V0IENvbnRyb2wtQyB0cmFwLCBzYXZlIG9sZCBvbmUgKi8KKyAgICBzaWdpbnRfaWduID0gMDsKKworICAgIHR2dGZsZyA9IDA7CQkJLyogRmxhZyBmb3IgdXNlIGJ5IHR0dnQoKS4gKi8KKwkJCQkvKiAwID0gdHR2dCBub3QgY2FsbGVkIHlldCBmb3IgdGhpcyBkZXZpY2UgKi8KKworICAgIGZkZmxhZyA9ICghaXNhdHR5KDApIHx8ICFpc2F0dHkoMSkpOyAvKiBGbGFnIGZvciBzdGRpbyByZWRpcmVjdGVkICovCisgICAgZGVidWcoRjEwMSwidHRvcGVuIGZkZmxhZyIsIiIsZmRmbGFnKTsKKworICAgIHR0bWRtID0gbW9kZW07ICAgICAgICAgICAgICAgICAgICAgIC8qIE1ha2UgdGhpcyBhdmFpbGFibGUgdG8gb3RoZXIgZm5zICovCisgICAgeGxvY2FsID0gKmxjbDsgICAgICAgICAgICAgICAgICAgICAgLyogTWFrZSB0aGlzIGF2YWlsYWJsZSB0byBvdGhlciBmbnMgKi8KKworLyogQ29kZSBmb3IgaGFuZGxpbmcgYmlkaXJlY3Rpb25hbCB0dHkgbGluZXMgZ29lcyBoZXJlLiAqLworLyogVXNlIHNwZWNpZmllZCBtZXRob2QgZm9yIHR1cm5pbmcgb2ZmIGxvZ2lucyBhbmQgc3VwcHJlc3NpbmcgZ2V0dHkuICovCisKKyNpZmRlZiBBQ1VDTlRSTAorICAgIC8qIFNob3VsZCBwdXQgY2FsbCB0byBwcml2X29uKCkgaGVyZSwgYnV0IHRoYXQgd291bGQgYmUgdmVyeSByaXNreSEgKi8KKyAgICBhY3VjbnRybCgiZGlzYWJsZSIsdHRuYW1lKTsgICAgICAgICAvKiBhY3VjbnRybCgpIHByb2dyYW0uICovCisgICAgLyogYW5kIHByaXZfb2ZmKCkgaGVyZS4uLiAqLworI2Vsc2UKKyNpZmRlZiBBVFQ3MzAwCisgICAgaWYgKChhdHRtb2RlbSAmIERPR0VUWSkgPT0gMCkgICAgICAgLyogb2ZmZ2V0dHkoKSBwcm9ncmFtLiAqLworICAgICAgYXR0bW9kZW0gfD0gb2ZmZ2V0dHkodHRuYW1lKTsJLyogUmVtZW1iZXIgcmVzcG9uc2UuICAqLworI2VuZGlmIC8qIEFUVDczMDAgKi8KKyNlbmRpZiAvKiBBQ1VDTlRSTCAqLworCisjaWZkZWYgT1BFTkZJUlNUCisvKgorIDE5ODUtMjAwMTogb3BlbnMgZGV2aWNlIGZpcnN0IHRoZW4gZ2V0cyBsb2NrOyByZWFzb246CisgS2VybWl0IHVzdWFsbHkgaGFzIHRvIHJ1biBzZXR1aWQgb3Igc2V0Z2lkIGluIG9yZGVyIHRvIGNyZWF0ZSBhIGxvY2tmaWxlLgorIElmIHlvdSBnaXZlIGEgU0VUIExJTkUgY29tbWFuZCBmb3IgYSBkZXZpY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHlvdXIgam9iJ3MKKyBjb250cm9sbGluZyB0ZXJtaW5hbCwgS2VybWl0IGRvZXNuJ3QgaGF2ZSB0byBjcmVhdGUgYSBsb2NrZmlsZSwgYW5kIGluIGZhY3QKKyBzaG91bGQgbm90IGNyZWF0ZSBvbmUsIGFuZCB3b3VsZCBmYWlsIGlmIGl0IHRyaWVkIHRvIGlmIGl0IGRpZCBub3QgaGF2ZSB0aGUKKyByZXF1aXJlZCBwcml2aWxlZ2VzLiAgQnV0IHlvdSBjYW4ndCBmaW5kIG91dCBpZiB0d28gdHR5IGRldmljZSBuYW1lcyBhcmUKKyBlcXVpdmFsZW50IHVudGlsIHlvdSBoYXZlIGEgZmlsZSBkZXNjcmlwdG9yIHRoYXQgeW91IGNhbiBnaXZlIHRvIHR0eW5hbWUoKS4KKyBCdXQgdGhpcyBjYW4gY2F1c2UgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIEtlcm1pdCBhbmQgW21dZ2V0dHkuICBTbyBzZWUKKyB0aGUgWyNdZWxzZSBwYXJ0Li4uCisqLyAKKworLyoKKyBJbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24sIHdlIG9wZW4gdGhlIHR0eSBkZXZpY2UgZm9yIHJlYWQvd3JpdGUuCisgSWYgYSBtb2RlbSBoYXMgYmVlbiBzcGVjaWZpZWQgdmlhICJzZXQgbW9kZW0iIHByaW9yIHRvICJzZXQgbGluZSIKKyB0aGVuIHRoZSBPX05ERUxBWSBwYXJhbWV0ZXIgaXMgdXNlZCBpbiB0aGUgb3BlbiwgcHJvdmlkZWQgdGhpcyBzeW1ib2wKKyBpcyBkZWZpbmVkIChlLmcuIGluIGZjbnRsLmgpLCBzbyB0aGF0IHRoZSBwcm9ncmFtIGRvZXMgbm90IGhhbmcgd2FpdGluZworIGZvciBjYXJyaWVyICh3aGljaCBpbiBtb3N0IGNhc2VzIHdvbid0IGJlIHByZXNlbnQgYmVjYXVzZSBhIGNvbm5lY3Rpb24KKyBoYXMgbm90IGJlZW4gZGlhbGVkIHlldCkuICBPX05ERUxBWSBpcyByZW1vdmVkIGxhdGVyIG9uIGluIHR0b3BlbigpLiAgSXQKKyB3b3VsZCBtYWtlIG1vcmUgc2Vuc2UgdG8gZmlyc3QgZGV0ZXJtaW5lIGlmIHRoZSBsaW5lIGlzIGxvY2FsIGJlZm9yZQorIGRvaW5nIHRoaXMsIGJ1dCBiZWNhdXNlIHR0eW5hbWUoKSByZXF1aXJlcyBhIGZpbGUgZGVzY3JpcHRvciwgd2UgaGF2ZQorIHRvIG9wZW4gaXQgZmlyc3QuICBTZWUgZG9fb3BlbigpLgorCisgTm93IG9wZW4gdGhlIGRldmljZSB1c2luZyB0aGUgZGVzaXJlZCB0cmVhdG1lbnQgb2YgY2Fycmllci4KKyBJZiBjYXJyaWVyIGlzIFJFUVVJUkVELCB0aGVuIG9wZW4gY291bGQgaGFuZyBmb3JldmVyLCBzbyBhbiBvcHRpb25hbAorIHRpbWVyIGlzIHByb3ZpZGVkLiAgSWYgY2FycmllciBpcyBub3QgcmVxdWlyZWQsIHRoZSB0aW1lciBzaG91bGQgbmV2ZXIKKyBnbyBvZmYsIGFuZCBzaG91bGQgZG8gbm8gaGFybS4uLgorKi8KKyAgICB0dG90bW8gPSAwOwkJCQkvKiBGbGFnIG5vIHRpbWVvdXQgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dG9wZW4gdGltbyIsIiIsdGltbyk7CisgICAgZGVidWcoRjEwMSwidHRvcGVuIHhsb2NhbCIsIiIseGxvY2FsKTsKKyAgICBpZiAodGltbyA+IDApIHsKKwlpbnQgeHg7CisJc2F2YWwgPSBzaWduYWwoU0lHQUxSTSx0aW1lcmgpOwkvKiBUaW1lZCwgc2V0IHVwIHRpbWVyLiAqLworCXh4ID0gYWxhcm0odGltbyk7CQkvKiBUaW1lZCBvcGVuKCkgKi8KKwlkZWJ1ZyhGMTAxLCJ0dG9wZW4gYWxhcm0iLCIiLHh4KTsKKwlpZiAoCisjaWZkZWYgQ0tfUE9TSVhfU0lHCisJICAgIHNpZ3NldGptcChzamJ1ZiwxKQorI2Vsc2UKKwkgICAgc2V0am1wKHNqYnVmKQorI2VuZGlmIC8qIENLX1BPU0lYX1NJRyAqLworCSAgICApIHsKKwkgICAgdHRvdG1vID0gMTsJCQkvKiBGbGFnIHRpbWVvdXQuICovCisJfSBlbHNlIHR0eWZkID0gZG9fb3Blbih0dG5hbWUpOworCXR0aW1vZmYoKTsKKwlkZWJ1ZyhGMTExLCJ0dG9wZW4iLCJtb2RlbSIsbW9kZW0pOworCWRlYnVnKEYxMDEsInR0b3BlbiB0dHlmZCIsIiIsdHR5ZmQpOworCWRlYnVnKEYxMDEsInR0b3BlbiBhbGFybSByZXR1cm4iLCIiLHR0b3Rtbyk7CisgICAgfSBlbHNlIHsKKwllcnJubyA9IDA7CisJdHR5ZmQgPSBkb19vcGVuKHR0bmFtZSk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsInR0b3BlbiB0dHlmZCIsdHRuYW1lLHR0eWZkKTsKKyAgICBpZiAodHR5ZmQgPCAwKSB7CQkJLyogSWYgY291bGRuJ3Qgb3BlbiwgZmFpbC4gKi8KKwlkZWJ1ZyhGMTAxLCJ0dG9wZW4gZXJybm8iLCIiLGVycm5vKTsKKwlpZiAoZXJybm8gPiAwICYmICFxdWlldCkKKwkgIHBlcnJvcih0dG5hbWUpOwkJLyogUHJpbnQgbWVzc2FnZSAqLworCisjaWZkZWYgQVRUNzMwMAorCWlmIChhdHRtb2RlbSAmIERPR0VUWSkJCS8qIHdhcyBnZXR0eSgxbSkgcnVubmluZyBiZWZvcmUgdXM/ICovCisJICBvbmdldHR5KHR0bm1zdik7CQkvKiB5ZXMsIHJlc3RhcnQgb24gdHR5IGxpbmUgKi8KKwlhdHRtb2RlbSAmPSB+RE9HRVRZOwkJLyogbm8gcGhvbmUgaW4gdXNlLCBnZXR0eSByZXN0b3JlZCAqLworI2Vsc2UKKyNpZmRlZiBBQ1VDTlRSTAorICAgICAgICAvKiBTaG91bGQgcHV0IGNhbGwgdG8gcHJpdl9vbigpIGhlcmUsIGJ1dCB0aGF0IHdvdWxkIGJlIHJpc2t5ISAqLworCWFjdWNudHJsKCJlbmFibGUiLHR0bmFtZSk7CS8qIGFjdWNudHJsKCkgcHJvZ3JhbS4gKi8KKwkvKiBhbmQgcHJpdl9vZmYoKSBoZXJlLi4uICovCisjZW5kaWYgLyogQUNVTlRSTCAqLworI2VuZGlmIC8qIEFUVDczMDAgKi8KKworCXNpZ25hbChTSUdJTlQsb2NjdCk7CQkvKiBQdXQgb2xkIEN0cmwtQyB0cmFwIGJhY2suICovCisJaWYgKGVycm5vID09IEVBQ0NFUykgewkJLyogRGV2aWNlIGlzIHByb3RlY3RlZCBhZ2FpbnN0IHVzZXIgKi8KKwkgICAgZGVidWcoRjExMCwidHRvcGVuIEVBQ0NFU1MiLHR0bmFtZSwwKTsgLyogUmV0dXJuIC00ICovCisJICAgIHJldHVybigtNCk7CisJfSBlbHNlIHJldHVybih0dG90bW8gPyAtMiA6IC0xKTsgLyogT3RoZXJ3aXNlIC0yIGlmIHRpbWVvdXQsIG9yIC0xICovCisgICAgfQorCisjaWZkZWYgUU5YCisgICAgeworCWV4dGVybiBpbnQgcW54cG9ydGxvY2s7CisJeCA9IHFueG9wZW5jb3VudCgpOworCWRlYnVnKEYxMDEsInR0b3BlbiBxbnhvcGVuY291bnQiLCIiLHgpOworCWRlYnVnKEYxMDEsInR0b3BlbiBxbnhwb3J0bG9jayIsIiIscW54cG9ydGxvY2spOworCWlmICh4IDwgMCAmJiBxbnhwb3J0bG9jaykgeworCSAgICB0dGNsb3MoMCk7CisJICAgIHByaW50ZigiP0Nhbid0IGdldCBwb3J0IG9wZW4gY291bnRcbiIpOworCSAgICBwcmludGYoIihUcnkgYWdhaW4gd2l0aCBTRVQgUU5YLVBPUlQtTE9DSyBPRkYpXG4iKTsKKwkgICAgcmV0dXJuKC0xKTsJCQkvKiBJbmRpY2F0ZSBkZXZpY2UgaXMgaW4gdXNlICovCisJfQorCWlmICh4ID4gMSkgewkJCS8qIDEgPT0gbWUgKi8KKwkgICAgaWYgKHFueHBvcnRsb2NrKQorCSAgICAgIHR0Y2xvcygwKTsKKwkgICAgICByZXR1cm4oLTIpOwkJLyogSW5kaWNhdGUgZGV2aWNlIGlzIGluIHVzZSAqLworCSAgICBlbHNlIGlmICghcXVpZXQpCisJICAgICAgcHJpbnRmKCJXQVJOSU5HOiBcIiVzXCIgbG9va3MgYnVzeS4uLlxuIix0dGRldik7CisJfQorICAgIH0KKyNlbmRpZiAvKiBRTlggKi8KKworI2lmZGVmIFBsYW45CisgICAgLyogdGFrZSB0aGlzIG9wcG9ydHVuaXR5IHRvIG9wZW4gdGhlIGNvbnRyb2wgY2hhbm5lbCAqLworICAgIGlmIChwOW9wZW50dHljdGwodHRuYW1lKSA8IDApCisjZWxzZQorICAgIC8qIE1ha2Ugc3VyZSBpdCdzIGEgcmVhbCB0dHkuICovCisgICAgaWYgKCF0dGZkZmxnICYmICFpc2F0dHkodHR5ZmQpICYmIHN0cmNtcCh0dG5hbWUsIi9kZXYvbnVsbCIpKQorI2VuZGlmIC8qIFBsYW45ICovCisgICAgICB7CisJZnByaW50ZihzdGRlcnIsIiVzIGlzIG5vdCBhIHRlcm1pbmFsIGRldmljZVxuIix0dG5hbWUpOworCWRlYnVnKEYxMTEsInR0b3BlbiBub3QgYSB0dHkiLHR0bmFtZSxlcnJubyk7CisJY2xvc2UodHR5ZmQpOworCXR0eWZkID0gLTE7CisJd2FzY2xvc2VkID0gMTsKKwlzaWduYWwoU0lHSU5ULG9jY3QpOworCXJldHVybigtMSk7CisgICAgfQorCisjaWZkZWYgYWVnaXMKKwkvKiBBcG9sbG8gQyBydW50aW1lIGNsYWltcyB0aGF0IGNvbnNvbGUgcGFkcyBhcmUgdHR5IGRldmljZXMsIHdoaWNoCisJICogaXMgcmVhc29uYWJsZSwgYnV0IHRoZXkgYXJlbid0IGFueSBnb29kIGZvciBwYWNrZXQgdHJhbnNmZXIuICovCisJaW9zXyRpbnFfdHlwZV91aWQoKHNob3J0KXR0eWZkLCB0dHl1aWQsIHN0KTsKKwlpZiAoc3QuYWxsICE9IHN0YXR1c18kb2spIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJwcm9ibGVtIGdldHRpbmcgdHR5IG9iamVjdCB0eXBlOiAiKTsKKwkgICAgZXJyb3JfJHByaW50KHN0KTsKKwl9IGVsc2UgaWYgKHR0eXVpZCAhPSBzaW9fJHVpZCkgeyAvKiByZWplY3Qgbm9uLVNJTyBsaW5lcyAqLworCSAgICBjbG9zZSh0dHlmZCk7IHR0eWZkID0gLTE7CisJICAgIHdhc2Nsb3NlZCA9IDE7CisJICAgIGVycm5vID0gRU5PVFRZOyBwZXJyb3IodHRuYW1lKTsKKwkgICAgc2lnbmFsKFNJR0lOVCxvY2N0KTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisjZW5kaWYgLyogYWVnaXMgKi8KKworICAgIHNpZ2ludF9pZ24gPSAob2NjdCA9PSBTSUdfSUdOKSA/IDEgOiAwOworCisgICAgY2tzdHJuY3B5KHR0bm1zdix0dG5hbWUsREVWTkFNTEVOKTsJLyogS2VlcCBjb3B5IG9mIG5hbWUgbG9jYWxseS4gKi8KKworLyogQ2FsbGVyIHdhbnRzIHVzIHRvIGZpZ3VyZSBvdXQgaWYgbGluZSBpcyBjb250cm9sbGluZyB0dHkgKi8KKworICAgIGlmICgqbGNsIDwgMCkgeworICAgICAgICBpZiAoc3RyY21wKHR0bmFtZSxDVFROQU0pID09IDApIHsgLyogIi9kZXYvdHR5IiBhbHdheXMgcmVtb3RlICovCisgICAgICAgICAgICB4bG9jYWwgPSAwOworCSAgICBkZWJ1ZyhGMTExLCJ0dG9wZW4gdHRuYW1lPUNUVE5BTSIsdHRuYW1lLHhsb2NhbCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHR0bmFtZSxjdHRuYW0pID09IDApIHsKKyAgICAgICAgICAgIHhsb2NhbCA9IDA7CisJICAgIGRlYnVnKEYxMTEsInR0b3BlbiB0dG5hbWU9Y3R0bmFtIix0dG5hbWUseGxvY2FsKTsKKwl9IGVsc2UgaWYgKGN0dG5hbVswXSkgeworI2lmZGVmIEJFQk9YX0RSNworICAgICAgICAgICAgeCA9IHR0bm1zdjsJCQkvKiB0dHluYW1lKCkgaXMgYnJva2VuICovCisjZWxzZQorICAgICAgICAgICAgeCA9IHR0eW5hbWUodHR5ZmQpOyAgICAgICAgIC8qIEdldCByZWFsIG5hbWUgb2YgdHRuYW1lLiAqLworI2VuZGlmIC8qIEJFQk9YX0RSNyAqLworCSAgICBpZiAoIXgpIHggPSAiIjsKKwkgICAgaWYgKCp4KQorCSAgICAgIHhsb2NhbCA9ICgoc3RybmNtcCh4LGN0dG5hbSxERVZOQU1MRU4pID09IDApID8gMCA6IDEpOworCSAgICBlbHNlCisJICAgICAgeGxvY2FsID0gMTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsInR0b3BlbiB0dHluYW1lKHR0eWZkKSB4bG9jYWwiLHgseGxvY2FsKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmbmRlZiBOT0ZEWkVSTworLyogTm90ZSwgdGhlIGZvbGxvd2luZyBjb2RlIHdhcyBhZGRlZCBzbyB0aGF0IFVuaXggImlkbGUtbGluZSIgc25vb3BlcnMgKi8KKy8qIHdvdWxkIG5vdCB0aGluayBLZXJtaXQgd2FzIGlkbGUgd2hlbiBpdCB3YXMgdHJhbnNmZXJyaW5nIGZpbGVzLCBhbmQgKi8KKy8qIG1heWJlIGxvZyBwZW9wbGUgb3V0LiAqLworICAgIGlmICh4bG9jYWwgPT0gMCkgewkJCS8qIFJlbW90ZSBtb2RlICovCisJaWYgKGZkZmxhZyA9PSAwKSB7CQkvKiBTdGFuZGFyZCBpL28gaXMgbm90IHJlZGlyZWN0ZWQgKi8KKwkgICAgZGVidWcoRjEwMCwidHRvcGVuIHNldHRpbmcgdHR5ZmQgPSAwIiwiIiwwKTsKKyNpZmRlZiBMWU5YT1MKKwkgICAgLyogT24gTHlueCBPUywgZmQgMCBpcyBvcGVuIGZvciByZWFkIG9ubHkuICovCisJICAgIGR1cDIodHR5ZmQsMCk7CisjZW5kaWYgLyogTFlOWE9TICovCisJICAgIGNsb3NlKHR0eWZkKTsJCS8qIFVzZSBmaWxlIGRlc2NyaXB0b3IgMCAqLworCSAgICB0dHlmZCA9IDA7CisJfSBlbHNlIHsJCQkvKiBTdGFuZGFyZCBpL28gaXMgcmVkaXJlY3RlZCAqLworCSAgICBkZWJ1ZyhGMTAxLCJ0dG9wZW4gc3RkaW8gcmVkaXJlY3RlZCIsIiIsdHR5ZmQpOworCX0KKyAgICB9CisjZW5kaWYgLyogTk9GRFpFUk8gKi8KKworLyogTm93IGNoZWNrIGlmIGxpbmUgaXMgbG9ja2VkIC0tIGlmIHNvIGZhaWwsIGVsc2UgbG9jayBmb3Igb3Vyc2VsdmVzICovCisvKiBOb3RlOiBBZnRlciBoYXZpbmcgZG9uZSB0aGlzLCBkb24ndCBmb3JnZXQgdG8gZGVsZXRlIHRoZSBsb2NrIGlmIHlvdSAqLworLyogbGVhdmUgdHRvcGVuKCkgd2l0aCBhbiBlcnJvciBjb25kaXRpb24uICovCisKKyAgICBsa2YgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBsb2NrICovCisgICAgaWYgKHhsb2NhbCA+IDApIHsKKwlpbnQgeHg7IGludCB4cGlkOworICAgICAgICBpZiAoKHh4ID0gdHRsb2NrKHR0bmFtZSkpIDwgMCkgeyAvKiBDYW4ndCBsb2NrIGl0LiAqLworICAgICAgICAgICAgZGVidWcoRjExMSwidHRvcGVuIHR0bG9jayBmYWlscyIsdHRuYW1lLHh4KTsKKwkgICAgLyogV0FSTklORyAtIFRoaXMgY2xvc2UoKSBjYW4gaGFuZyBpZiB0dHkgaXMgYW4gZW1wdHkgc29ja2V0Li4uICovCisgICAgICAgICAgICBjbG9zZSh0dHlmZCk7CQkvKiBDbG9zZSB0aGUgZGV2aWNlLiAqLworCSAgICB0dHlmZCA9IC0xOwkJCS8qIEVyYXNlIGl0cyBmaWxlIGRlc2NyaXB0b3IuICovCisJICAgIHdhc2Nsb3NlZCA9IDE7CisJICAgIHNpZ25hbChTSUdJTlQsb2NjdCk7CS8qIFB1dCBvbGQgU0lHSU5UIGJhY2suICovCisJICAgIHNpZ2ludF9pZ24gPSAob2NjdCA9PSBTSUdfSUdOKSA/IDEgOiAwOworCSAgICBpZiAoeHggPT0gLTIpIHsJCS8qIElmIGxvY2tmaWxlIHNheXMgZGV2aWNlIGluIHVzZSwgKi8KKyNpZm5kZWYgTk9VVUNQCisJCWRlYnVnKEYxMTEsInR0b3BlbiByZWFkaW5nIGxvY2tmaWxlIHBpZCIsZmxmbmFtLHh4KTsKKwkJeHBpZCA9IHR0cnBpZChmbGZuYW0pOwkvKiBUcnkgdG8gcmVhZCBwaWQgZnJvbSBsb2NrZmlsZSAqLworCQlpZiAoeHBpZCA+IC0xKSB7CS8qIElmIHdlIGdvdCBhIHBpZCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KQorCQkgICAgICBwcmludGYoIkxvY2tlZCBieSBwcm9jZXNzICVkXG4iLHhwaWQpOyAvKiB0ZWxsIHRoZW0uICovCisJCSAgICBzcHJpbnRmKGxvY2twaWQsIiVkIix4cGlkKTsJLyogUmVjb3JkIGl0IHRvbyAqLworCQkgICAgZGVidWcoRjExMCwidHRvcGVuIGxvY2twaWQiLGxvY2twaWQsMCk7CisJCX0gZWxzZSBpZiAoKmZsZm5hbSkgeworCQkgICAgZXh0ZXJuIGNoYXIgKkRJUkNNRDsKKwkJICAgIGNoYXIgKnAgPSBOVUxMOworCQkgICAgaW50IHg7CisJCSAgICB4ID0gKGludClzdHJsZW4oZmxmbmFtKSArIChpbnQpc3RybGVuKERJUkNNRCkgKyAyOworCQkgICAgcCA9IG1hbGxvYyh4KTsJLyogUHJpbnQgYSBkaXJlY3RvcnkgbGlzdGluZy4gKi8KKy8qCisgIE5vdGU6IHByaXZfb24oKSB3b24ndCBoZWxwIGhlcmUsIGJlY2F1c2Ugd2UgZG8gbm90IHBhc3MgcHJpdnMgYWxvbmcgdG8KKyAgdG8gaW5mZXJpb3IgcHJvY2Vzc2VzLCBpbiB0aGlzIGNhc2UgbHMuICBTbyBpZiB0aGUgcmVhbCB1c2VyIGRvZXMgbm90IGhhdmUKKyAgZGlyZWN0b3J5LWxpc3RpbmcgYWNjZXNzIHRvIHRoZSBsb2NrZmlsZSBkaXJlY3RvcnksIHRoaXMgd2lsbCByZXN1bHQgaW4KKyAgc29tZXRoaW5nIGxpa2UgIm5vdCBmb3VuZCIuICBUaGF0J3Mgd2h5IHdlIHRyeSB0aGlzIG9ubHkgYXMgYSBsYXN0IHJlc29ydC4KKyovCisJCSAgICBpZiAocCkgewkJLyogSWYgd2UgZ290IHRoZSBzcGFjZS4uLiAqLworCQkJY2ttYWttc2cocCx4LERJUkNNRCwiICIsZmxmbmFtLE5VTEwpOworCQkJenN5c2NtZChwKTsJLyogR2V0IGxpc3RpbmcuICovCisJCQlpZiAocCkgewkvKiBmcmVlIHRoZSBzcGFjZSAqLworCQkJICAgIGZyZWUocCk7CisJCQkgICAgcCA9IE5VTEw7CisJCQl9CisJCSAgICB9CisJCX0KKyNlbmRpZiAvKiBOT1VVQ1AgKi8KKwkJcmV0dXJuKC01KTsJCS8qIENvZGUgZm9yIGRldmljZSBpbiB1c2UgKi8KKwkgICAgfSBlbHNlIHJldHVybigtMyk7CQkvKiBBY2Nlc3MgZGVuaWVkICovCisgICAgICAgIH0gZWxzZSBsa2YgPSAxOworICAgIH0KKyNlbHNlICAvKiBPUEVORklSU1QgKi8KKworLyoKKyAgMjcgT2N0IDIwMDE6IE5ldyBzaW1wbGVyIGNvZGUgdGhhdCBnZXRzIHRoZSBsb2NrIGZpcnN0IGFuZCB0aGVuIG9wZW5zIHRoZQorICBkZXZpY2UsIHdoaWNoIGVsaW1pbmF0ZXMgdGhlIHJhY2UgY29uZGl0aW9uLiAgVGhlIGRvd25zaWRlIGlzIHlvdSBjYW4gbm8KKyAgbG9uZ2VyIHNheSAic2V0IGxpbmUgL2Rldi90dHlwMCIgb3Igd2hhdGV2ZXIsIHdoZXJlIC9kZXYvdHR5cDAgaXMgeW91ciBsb2dpbgorICB0ZXJtaW5hbCwgd2l0aG91dCB0cnlpbmcgdG8gY3JlYXRlIGEgbG9ja2ZpbGUsIHdoaWNoIGZhaWxzIGlmIEMtS2VybWl0IGxhY2tzCisgIHByaXZzLCBhbmQgaWYgaXQgc3VjY2VlZHMsIGl0IGhhcyBjcmVhdGVkIGEgbG9ja2ZpbGUgd2hlcmUgaXQgZGlkbid0IGNyZWF0ZQorICBvbmUgYmVmb3JlLgorKi8KKyAgICB4bG9jYWwgPSAqbGNsOwkJCS8qIElzIHRoZSBkZXZpY2UgbXkgbG9naW4gdGVybWluYWw/ICovCisgICAgZGVidWcoRjExMSwidHRvcGVuIHhsb2NhbCIsIkEiLHhsb2NhbCk7CisgICAgZm5hbSA9IHR0bmFtZTsKKyAgICBpZiAoc3RyY21wKHR0bmFtZSxDVFROQU0pICYmIG5ldGNvbm4gPT0gMCkgeworCWlmICh6Zm5xZnAodHRuYW1lLERFVk5BTUxFTisxLGZ1bGxuYW1lKSkgeworCSAgICBpZiAoKGludClzdHJsZW4oZnVsbG5hbWUpID4gMCkKKwkgICAgICBmbmFtID0gZnVsbG5hbWU7CisJfQorICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJ0dG9wZW4gZm5hbSIsZm5hbSwwKTsKKyAgICBpZiAoeGxvY2FsIDwgMCkgeworCXhsb2NhbCA9IChzdHJjbXAoZm5hbSxDVFROQU0pICE9IDApOworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ0dG9wZW4geGxvY2FsIiwiQiIseGxvY2FsKTsKKworICAgIGxrZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGxvY2sgeWV0ICovCisgICAgaWYgKHhsb2NhbCA+IDApIHsJCQkvKiBJZiBub3QuLi4gKi8KKwlpbnQgeHg7IGludCB4cGlkOworCXh4ID0gdHRsb2NrKGZuYW0pOwkJLyogVHJ5IHRvIGxvY2sgaXQuICovCisJZGVidWcoRjEwMSwidHRvcGVuIHR0bG9jayIsIiIseHgpOworICAgICAgICBpZiAoeHggPCAwKSB7CQkJLyogQ2FuJ3QgbG9jayBpdC4gKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTEsInR0b3BlbiB0dGxvY2sgZmFpbHMiLGZuYW0seHgpOworCSAgICBpZiAoeHggPT0gLTIpIHsJCS8qIElmIGxvY2tmaWxlIHNheXMgZGV2aWNlIGluIHVzZSwgKi8KKyNpZm5kZWYgTk9VVUNQCisJCWRlYnVnKEYxMTEsInR0b3BlbiByZWFkaW5nIGxvY2tmaWxlIHBpZCIsZmxmbmFtLHh4KTsKKwkJeHBpZCA9IHR0cnBpZChmbGZuYW0pOwkvKiBUcnkgdG8gcmVhZCBwaWQgZnJvbSBsb2NrZmlsZSAqLworCQlpZiAoeHBpZCA+IC0xKSB7CS8qIElmIHdlIGdvdCBhIHBpZCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KQorCQkgICAgICBwcmludGYoIkxvY2tlZCBieSBwcm9jZXNzICVkXG4iLHhwaWQpOyAvKiB0ZWxsIHRoZW0uICovCisJCSAgICBja3N0cm5jcHkobG9ja3BpZCxja2l0b2EoeHBpZCksMTYpOworCQkgICAgZGVidWcoRjExMCwidHRvcGVuIGxvY2twaWQiLGxvY2twaWQsMCk7CisjaWZuZGVmIE5PUFVTSAorCQl9IGVsc2UgaWYgKGZsZm5hbVswXSAmJiAhbm9wdXNoKSB7CisJCSAgICBleHRlcm4gY2hhciAqRElSQ01EOworCQkgICAgY2hhciAqcCA9IE5VTEw7CisJCSAgICBpbnQgeDsKKwkJICAgIHggPSAoaW50KXN0cmxlbihmbGZuYW0pICsgKGludClzdHJsZW4oRElSQ01EKSArIDI7CisJCSAgICBwID0gbWFsbG9jKHgpOwkvKiBQcmludCBhIGRpcmVjdG9yeSBsaXN0aW5nLiAqLworLyoKKyAgTm90ZTogcHJpdl9vbigpIHdvbid0IGhlbHAgaGVyZSwgYmVjYXVzZSB3ZSBkbyBub3QgcGFzcyBwcml2cyBhbG9uZyB0bworICB0byBpbmZlcmlvciBwcm9jZXNzZXMsIGluIHRoaXMgY2FzZSBscy4gIFNvIGlmIHRoZSByZWFsIHVzZXIgZG9lcyBub3QgaGF2ZQorICBkaXJlY3RvcnktbGlzdGluZyBhY2Nlc3MgdG8gdGhlIGxvY2tmaWxlIGRpcmVjdG9yeSwgdGhpcyB3aWxsIHJlc3VsdCBpbgorICBzb21ldGhpbmcgbGlrZSAibm90IGZvdW5kIi4gIFRoYXQncyB3aHkgd2UgdHJ5IHRoaXMgb25seSBhcyBhIGxhc3QgcmVzb3J0LgorKi8KKwkJICAgIGlmIChwKSB7CQkvKiBJZiB3ZSBnb3QgdGhlIHNwYWNlLi4uICovCisJCQlja21ha21zZyhwLHgsRElSQ01ELCIgIixmbGZuYW0sTlVMTCk7CisJCQl6c3lzY21kKHApOwkvKiBHZXQgbGlzdGluZy4gKi8KKwkJCWlmIChwKSB7CS8qIGZyZWUgdGhlIHNwYWNlICovCisJCQkgICAgZnJlZShwKTsKKwkJCSAgICBwID0gTlVMTDsKKwkJCX0KKwkJICAgIH0KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKwkJfQorI2VuZGlmIC8qIE5PVVVDUCAqLworCQlyZXR1cm4oLTUpOwkJLyogQ29kZSBmb3IgZGV2aWNlIGluIHVzZSAqLworCSAgICB9IGVsc2UgcmV0dXJuKC0zKTsJCS8qIEFjY2VzcyBkZW5pZWQgKi8KKyAgICAgICAgfSBlbHNlIGxrZiA9IDE7CisgICAgfQorICAgIC8qIEhhdmUgbG9jayAtLSBub3cgaXQncyBzYWZlIHRvIG9wZW4gdGhlIGRldmljZSAqLworCisgICAgZGVidWcoRjEwMSwidHRvcGVuIGxrZiIsIiIsbGtmKTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dG9wZW4gdGltbyIsIiIsdGltbyk7CisKKyAgICB0dG90bW8gPSAwOwkJCQkvKiBGbGFnIG5vIHRpbWVvdXQgKi8KKyAgICBpZiAodGltbyA+IDApIHsKKwlpbnQgeHg7CisJc2F2YWwgPSBzaWduYWwoU0lHQUxSTSx0aW1lcmgpOwkvKiBUaW1lZCwgc2V0IHVwIHRpbWVyLiAqLworCXh4ID0gYWxhcm0odGltbyk7CQkvKiBUaW1lZCBvcGVuKCkgKi8KKwlkZWJ1ZyhGMTAxLCJ0dG9wZW4gYWxhcm0iLCIiLHh4KTsKKwlpZiAoCisjaWZkZWYgQ0tfUE9TSVhfU0lHCisJICAgIHNpZ3NldGptcChzamJ1ZiwxKQorI2Vsc2UKKwkgICAgc2V0am1wKHNqYnVmKQorI2VuZGlmIC8qIENLX1BPU0lYX1NJRyAqLworCSAgICApIHsKKwkgICAgdHRvdG1vID0gMTsJCQkvKiBGbGFnIHRpbWVvdXQuICovCisJfSBlbHNlIHsKKwkgICAgdHR5ZmQgPSBkb19vcGVuKGZuYW0pOworCX0KKwl0dGltb2ZmKCk7CisJZGVidWcoRjExMSwidHRvcGVuIHRpbWVkIHR0eWZkIixmbmFtLHR0eWZkKTsKKyAgICB9IGVsc2UgeworCWVycm5vID0gMDsKKwl0dHlmZCA9IGRvX29wZW4oZm5hbSk7CisJZGVidWcoRjExMSwidHRvcGVuIHVudGltZWQgdHR5ZmQiLGZuYW0sdHR5ZmQpOworICAgIH0KKyAgICBpZiAodHR5ZmQgPCAwKSB7CQkJLyogSWYgY291bGRuJ3Qgb3BlbiwgZmFpbC4gKi8KKwlkZWJ1ZyhGMTExLCJ0dG9wZW4gZXJybm8iLGZuYW0sZXJybm8pOworCWRlYnVnKEYxMTEsInR0b3BlbiB4bG9jYWwiLCJDIix4bG9jYWwpOworCWlmICh4bG9jYWwgPT0gMCkgeworCSAgICBkZWJ1ZyhGMTAwLCJ0dG9wZW4gc3Vic3RpdHV0aW5nIDAiLCIiLDApOworCSAgICB0dHlmZCA9IDA7CisJfSBlbHNlIHsKKwkgICAgaWYgKGVycm5vID4gMCAmJiAhcXVpZXQpIHsKKwkgICAgICAgIGRlYnVnKEYxMTEsInR0b3BlbiBwZXJyb3IiLGZuYW0sZXJybm8pOworCQlwZXJyb3IoZm5hbSk7CQkvKiBQcmludCBtZXNzYWdlICovCisJICAgIH0KKwkgICAgaWYgKHR0dW5sY2soKSkgICAgICAgICAgICAgICAgICAvKiBSZWxlYXNlIHRoZSBsb2NrIGZpbGUgKi8KKwkgICAgICBmcHJpbnRmKHN0ZGVyciwiV2FybmluZywgcHJvYmxlbSByZWxlYXNpbmcgbG9ja1xyXG4iKTsKKwl9CisgICAgfQorCisgICAgaWYgKHR0eWZkIDwgMCkgewkJCS8qIHR0eWZkIGlzIHN0aWxsIDwgMD8gKi8KKyNpZmRlZiBBVFQ3MzAwCisJaWYgKGF0dG1vZGVtICYgRE9HRVRZKQkJLyogd2FzIGdldHR5KDFtKSBydW5uaW5nIGJlZm9yZSB1cz8gKi8KKwkgIG9uZ2V0dHkodHRubXN2KTsJCS8qIHllcywgcmVzdGFydCBvbiB0dHkgbGluZSAqLworCWF0dG1vZGVtICY9IH5ET0dFVFk7CQkvKiBubyBwaG9uZSBpbiB1c2UsIGdldHR5IHJlc3RvcmVkICovCisjZWxzZQorI2lmZGVmIEFDVUNOVFJMCisgICAgICAgIC8qIFNob3VsZCBwdXQgY2FsbCB0byBwcml2X29uKCkgaGVyZSwgYnV0IHRoYXQgd291bGQgYmUgcmlza3khICovCisJYWN1Y250cmwoImVuYWJsZSIsZm5hbSk7CS8qIGFjdWNudHJsKCkgcHJvZ3JhbS4gKi8KKwkvKiBhbmQgcHJpdl9vZmYoKSBoZXJlLi4uICovCisjZW5kaWYgLyogQUNVTlRSTCAqLworI2VuZGlmIC8qIEFUVDczMDAgKi8KKworCXNpZ25hbChTSUdJTlQsb2NjdCk7CQkvKiBQdXQgb2xkIEN0cmwtQyB0cmFwIGJhY2suICovCisJaWYgKGVycm5vID09IEVBQ0NFUykgewkJLyogRGV2aWNlIGlzIHByb3RlY3RlZCBhZ2FpbnN0IHVzZXIgKi8KKwkgICAgZGVidWcoRjExMCwidHRvcGVuIEVBQ0NFU1MiLGZuYW0sMCk7IC8qIFJldHVybiAtNCAqLworCSAgICByZXR1cm4oLTQpOworCX0gZWxzZSByZXR1cm4odHRvdG1vID8gLTIgOiAtMSk7IC8qIE90aGVyd2lzZSAtMiBpZiB0aW1lb3V0LCBvciAtMSAqLworICAgIH0KKworLyogTWFrZSBzdXJlIGl0J3MgYSByZWFsIHR0eS4gKi8KKworI2lmZGVmIFBsYW45CisgICAgLyogdGFrZSB0aGlzIG9wcG9ydHVuaXR5IHRvIG9wZW4gdGhlIGNvbnRyb2wgY2hhbm5lbCAqLworICAgIGlmIChwOW9wZW50dHljdGwoZm5hbSkgPCAwKSAgICAgICAKKyNlbHNlCisgICAgICBpZiAoIXR0ZmRmbGcgJiYgIWlzYXR0eSh0dHlmZCkgJiYgc3RyY21wKGZuYW0sIi9kZXYvbnVsbCIpKQorI2VuZGlmIC8qIFBsYW45ICovCisJeworCSAgICBmcHJpbnRmKHN0ZGVyciwiJXMgaXMgbm90IGEgdGVybWluYWwgZGV2aWNlXG4iLGZuYW0pOworCSAgICBkZWJ1ZyhGMTExLCJ0dG9wZW4gbm90IGEgdHR5IixmbmFtLGVycm5vKTsKKwkgICAgaWYgKHR0dW5sY2soKSkJCS8qIFJlbGVhc2UgdGhlIGxvY2sgZmlsZSAqLworCSAgICAgIGZwcmludGYoc3RkZXJyLCJXYXJuaW5nLCBwcm9ibGVtIHJlbGVhc2luZyBsb2NrXHJcbiIpOworCSAgICBjbG9zZSh0dHlmZCk7CisJICAgIHR0eWZkID0gLTE7CisJICAgIHdhc2Nsb3NlZCA9IDE7CisJICAgIHNpZ25hbChTSUdJTlQsb2NjdCk7CisJICAgIHJldHVybigtMSk7CisJfQorCisjaWZkZWYgYWVnaXMKKyAgICAvKgorICAgICAgQXBvbGxvIEMgcnVudGltZSBjbGFpbXMgdGhhdCBjb25zb2xlIHBhZHMgYXJlIHR0eSBkZXZpY2VzLCB3aGljaAorICAgICAgaXMgcmVhc29uYWJsZSwgYnV0IHRoZXkgYXJlbid0IGFueSBnb29kIGZvciBwYWNrZXQgdHJhbnNmZXIuCisgICAgKi8KKyAgICBpb3NfJGlucV90eXBlX3VpZCgoc2hvcnQpdHR5ZmQsIHR0eXVpZCwgc3QpOworICAgIGlmIChzdC5hbGwgIT0gc3RhdHVzXyRvaykgeworCWZwcmludGYoc3RkZXJyLCAicHJvYmxlbSBnZXR0aW5nIHR0eSBvYmplY3QgdHlwZTogIik7CisJZXJyb3JfJHByaW50KHN0KTsKKyAgICB9IGVsc2UgaWYgKHR0eXVpZCAhPSBzaW9fJHVpZCkgewkvKiBSZWplY3Qgbm9uLVNJTyBsaW5lcyAqLworCWNsb3NlKHR0eWZkKTsgdHR5ZmQgPSAtMTsKKwl3YXNjbG9zZWQgPSAxOworCWVycm5vID0gRU5PVFRZOyBwZXJyb3IoZm5hbSk7CisJc2lnbmFsKFNJR0lOVCxvY2N0KTsKKwlyZXR1cm4oLTEpOworICAgIH0KKyNlbmRpZiAvKiBhZWdpcyAqLworCisgICAgc2lnaW50X2lnbiA9IChvY2N0ID09IFNJR19JR04pID8gMSA6IDA7CisKKyAgICBja3N0cm5jcHkodHRubXN2LHR0bmFtZSxERVZOQU1MRU4pOwkvKiBLZWVwIGNvcHkgb2YgbmFtZSBsb2NhbGx5LiAqLworCisvKiBDYWxsZXIgd2FudHMgdXMgdG8gZmlndXJlIG91dCBpZiBsaW5lIGlzIGNvbnRyb2xsaW5nIHR0eSAqLworCisgICAgaWYgKCpsY2wgPCAwKSB7CisJY2hhciAqIHM7CisgICAgICAgIGlmIChzdHJjbXAoZm5hbSxDVFROQU0pID09IDApIHsgLyogIi9kZXYvdHR5IiBhbHdheXMgcmVtb3RlICovCisgICAgICAgICAgICB4bG9jYWwgPSAwOworCSAgICBkZWJ1ZyhGMTExLCJ0dG9wZW4gZm5hbT1DVFROQU0iLGZuYW0seGxvY2FsKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoZm5hbSxjdHRuYW0pID09IDApIHsKKyAgICAgICAgICAgIHhsb2NhbCA9IDA7CisJICAgIGRlYnVnKEYxMTEsInR0b3BlbiBmbmFtPWN0dG5hbSIsZm5hbSx4bG9jYWwpOworCX0gZWxzZSBpZiAoY3R0bmFtWzBdKSB7CisjaWZkZWYgQkVCT1hfRFI3CisgICAgICAgICAgICBzID0gdHRubXN2OwkJCS8qIHR0eW5hbWUoKSBpcyBicm9rZW4gKi8KKyNlbHNlCisgICAgICAgICAgICBzID0gdHR5bmFtZSh0dHlmZCk7ICAgICAgICAgLyogR2V0IHJlYWwgbmFtZSBvZiB0dG5hbWUuICovCisjZW5kaWYgLyogQkVCT1hfRFI3ICovCisJICAgIGlmICghcykgcyA9ICIiOworCSAgICBpZiAoKnMpCisJICAgICAgeGxvY2FsID0gKChzdHJuY21wKHMsY3R0bmFtLERFVk5BTUxFTikgPT0gMCkgPyAwIDogMSk7CisJICAgIGVsc2UKKwkgICAgICB4bG9jYWwgPSAxOworICAgICAgICAgICAgZGVidWcoRjExMSwidHRvcGVuIHR0eW5hbWUodHR5ZmQpIHhsb2NhbCIscyx4bG9jYWwpOworICAgICAgICB9CisgICAgfQorCisjaWZuZGVmIE5PRkRaRVJPCisvKiBOb3RlLCB0aGUgZm9sbG93aW5nIGNvZGUgd2FzIGFkZGVkIHNvIHRoYXQgVW5peCAiaWRsZS1saW5lIiBzbm9vcGVycyAqLworLyogd291bGQgbm90IHRoaW5rIEtlcm1pdCB3YXMgaWRsZSB3aGVuIGl0IHdhcyB0cmFuc2ZlcnJpbmcgZmlsZXMsIGFuZCAqLworLyogbWF5YmUgbG9nIHBlb3BsZSBvdXQuICovCisgICAgaWYgKHhsb2NhbCA9PSAwKSB7CQkJLyogUmVtb3RlIG1vZGUgKi8KKwlpZiAoZmRmbGFnID09IDApIHsJCS8qIFN0YW5kYXJkIGkvbyBpcyBub3QgcmVkaXJlY3RlZCAqLworCSAgICBkZWJ1ZyhGMTAwLCJ0dG9wZW4gc2V0dGluZyB0dHlmZCA9IDAiLCIiLDApOworI2lmZGVmIExZTlhPUworCSAgICAvKiBPbiBMeW54IE9TLCBmZCAwIGlzIG9wZW4gZm9yIHJlYWQgb25seS4gKi8KKwkgICAgZHVwMih0dHlmZCwwKTsKKyNlbmRpZiAvKiBMWU5YT1MgKi8KKwkgICAgY2xvc2UodHR5ZmQpOwkJLyogVXNlIGZpbGUgZGVzY3JpcHRvciAwICovCisJICAgIHR0eWZkID0gMDsKKwl9IGVsc2UgewkJCS8qIFN0YW5kYXJkIGkvbyBpcyByZWRpcmVjdGVkICovCisJICAgIGRlYnVnKEYxMDEsInR0b3BlbiBzdGRpbyByZWRpcmVjdGVkIiwiIix0dHlmZCk7CisJfQorICAgIH0KKyNlbmRpZiAvKiBOT0ZEWkVSTyAqLworI2VuZGlmIC8qIE9QRU5GSVJTVCAqLworCisvKiBHb3QgdGhlIGxpbmUsIG5vdyBzZXQgdGhlIGRlc2lyZWQgdmFsdWUgZm9yIGxvY2FsLiAqLworCisgICAgaWYgKCpsY2wgIT0gMCkgKmxjbCA9IHhsb2NhbDsKKworLyogU29tZSBzcGVjaWFsIHN0dWZmIGZvciB2Ny4uLiAqLworCisjaWZkZWYgIFY3CisjaWZuZGVmIE1JTklYCisgICAgaWYgKGttZW1bVFRZXSA8IDApIHsJCS8qICBJZiBvcGVuLCB0aGVuIHNraXAgdGhpcy4gICovCisJcWFkZHJbVFRZXSA9IGluaXRyYXdxKHR0eWZkKTsgICAvKiBJbml0IHRoZSBxdWV1ZS4gKi8KKwlpZiAoKGttZW1bVFRZXSA9IG9wZW4oIi9kZXYva21lbSIsIDApKSA8IDApIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCByZWFkIC9kZXYva21lbSBpbiB0dG9wZW4uXG4iKTsKKwkgICAgcGVycm9yKCIvZGV2L2ttZW0iKTsKKwkgICAgZXhpdCgxKTsKKwl9CisgICAgfQorI2VuZGlmIC8qICFNSU5JWCAqLworI2VuZGlmIC8qIFY3ICovCisKKy8qIE5vIGZhaWx1cmUgcmV0dXJucyBhZnRlciB0aGlzIHBvaW50ICovCisKKyNpZmRlZiB1bHRyaXgKKyAgICBpb2N0bCh0dHlmZCwgVElPQ01PREVNLCAmdGVtcCk7CisjaWZkZWYgVElPQ1NJTlVTRQorICAgIGlmICh4bG9jYWwgJiYgaW9jdGwodHR5ZmQsIFRJT0NTSU5VU0UsIE5VTEwpIDwgMCkgeworCWlmICghcXVpZXQpCisJICBwZXJyb3IoZm5hbSk7CisgICAgfQorI2VuZGlmIC8qIFRJT0NTSU5VU0UgKi8KKyNlbmRpZiAvKiB1bHRyaXggKi8KKworLyogR2V0IHR0eSBkZXZpY2Ugc2V0dGluZ3MgICovCisKKyNpZmRlZiBCU0Q0NE9SUE9TSVgJCQkvKiBQT1NJWCAqLworICAgIHRjZ2V0YXR0cih0dHlmZCwmdHRvbGQpOworICAgIGRlYnVnKEYxMDEsInR0b3BlbiB0Y2dldGF0dHIgdHRvbGQuY19sZmxhZyIsIiIsdHRvbGQuY19sZmxhZyk7CisgICAgdGNnZXRhdHRyKHR0eWZkLCZ0dHJhdyk7CisgICAgZGVidWcoRjEwMSwidHRvcGVuIHRjZ2V0YXR0ciB0dHJhdy5jX2xmbGFnIiwiIix0dHJhdy5jX2xmbGFnKTsKKyAgICB0Y2dldGF0dHIodHR5ZmQsJnR0dHZ0KTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dG9wZW4gdGNnZXRhdHRyIHR0dHZ0LmNfbGZsYWciLCIiLHR0dHZ0LmNfbGZsYWcpOworI2Vsc2UJCQkJCS8qIEJTRCwgVjcsIGFuZCBhbGwgb3RoZXJzICovCisjaWZkZWYgQVRUU1YJCQkJLyogQVQmVCBVTklYICovCisgICAgaW9jdGwodHR5ZmQsVENHRVRBLCZ0dG9sZCk7CisgICAgZGVidWcoRjEwMSwidHRvcGVuIGlvY3RsIFRDR0VUQSB0dG9sZC5jX2xmbGFnIiwiIix0dG9sZC5jX2xmbGFnKTsKKyAgICBpb2N0bCh0dHlmZCxUQ0dFVEEsJnR0cmF3KTsKKyAgICBpb2N0bCh0dHlmZCxUQ0dFVEEsJnR0dHZ0KTsKKyNlbHNlCisjaWZkZWYgQkVMTFYxMAorICAgIGlvY3RsKHR0eWZkLFRJT0NHRVRQLCZ0dG9sZCk7CisgICAgZGVidWcoRjEwMSwidHRvcGVuIEJFTExWMTAgdHRvbGQuc2dfZmxhZ3MiLCIiLHR0b2xkLnNnX2ZsYWdzKTsKKyAgICBpb2N0bCh0dHlmZCxUSU9DR0RFViwmdGRvbGQpOworICAgIGRlYnVnKEYxMDEsInR0b3BlbiBCRUxMVjEwIHRkb2xkLmZsYWdzIiwiIix0ZG9sZC5mbGFncyk7CisjZWxzZQorICAgIGd0dHkodHR5ZmQsJnR0b2xkKTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dG9wZW4gZ3R0eSB0dG9sZC5zZ19mbGFncyIsIiIsdHRvbGQuc2dfZmxhZ3MpOworI2VuZGlmIC8qIEJFTExWMTAgKi8KKworI2lmZGVmIHNvbnlfbmV3cwkJCS8qIFNvbnkgTkVXUyAqLworICAgIGlmIChpb2N0bCh0dHlmZCxUSU9DS0dFVCwma21fZXh0KSA8IDApIHsgLyogR2V0IGNvbnNvbGUgS2FuamkgbW9kZSAqLworCXBlcnJvcigidHRvcGVuIGVycm9yIGdldHRpbmcgS2FuamkgbW9kZSIpOworCWRlYnVnKEYxMDEsInR0b3BlbiBlcnJvciBnZXR0aW5nIEthbmppIG1vZGUiLCIiLDApOworCWttX2V4dCA9IC0xOwkJCS8qIE1ha2Ugc3VyZSB0aGlzIHN0YXlzIHVuZGVmaW5lZC4gKi8KKyAgICB9CisjZW5kaWYgLyogc29ueV9uZXdzICovCisKKyNpZmRlZiBUSU9DR0VUQworICAgIGRlYnVnKEYxMDAsInR0b3BlbiBUSU9DR0VUQyIsIiIsMCk7CisgICAgdGNoYXJmID0gMDsJCQkJLyogSW4gcmVtb3RlIG1vZGUsIGFsc28gZ2V0ICovCisgICAgaWYgKHhsb2NhbCA9PSAwKSB7CQkJLyogc3BlY2lhbCBjaGFyYWN0ZXJzICovCisJaWYgKGlvY3RsKHR0eWZkLFRJT0NHRVRDLCZ0Y2hvbGQpIDwgMCkgeworCSAgICBkZWJ1ZyhGMTAwLCJ0dG9wZW4gVElPQ0dFVEMgZmFpbGVkIiwiIiwwKTsKKwl9IGVsc2UgeworCSAgICB0Y2hhcmYgPSAxOwkJCS8qIEl0IHdvcmtlZC4gKi8KKwkgICAgaW9jdGwodHR5ZmQsVElPQ0dFVEMsJnRjaG5vaSk7IC8qIEdldCBhbm90aGVyIGNvcHkgKi8KKwkgICAgZGVidWcoRjEwMCwidHRvcGVuIFRJT0NHRVRDIG9rIiwiIiwwKTsKKwl9CisgICAgfQorI2Vsc2UKKyAgICBkZWJ1ZyhGMTAwLCJ0dG9wZW4gVElPQ0dFVEMgbm90IGRlZmluZWQiLCIiLDApOworI2VuZGlmIC8qIFRJT0NHRVRDICovCisKKyNpZmRlZiBUSU9DR0xUQworICAgIGRlYnVnKEYxMDAsInR0b3BlbiBUSU9DR0xUQyIsIiIsMCk7CisgICAgbHRjaGFyZiA9IDA7CQkJLyogSW4gcmVtb3RlIG1vZGUsIGFsc28gZ2V0ICovCisgICAgaWYgKHhsb2NhbCA9PSAwKSB7CQkJLyogbG9jYWwgc3BlY2lhbCBjaGFyYWN0ZXJzICovCisJaWYgKGlvY3RsKHR0eWZkLFRJT0NHTFRDLCZsdGNob2xkKSA8IDApIHsKKwkgICAgZGVidWcoRjEwMCwidHRvcGVuIFRJT0NHTFRDIGZhaWxlZCIsIiIsMCk7CisJfSBlbHNlIHsKKwkgICAgbHRjaGFyZiA9IDE7CQkvKiBJdCB3b3JrZWQuICovCisJICAgIGlvY3RsKHR0eWZkLFRJT0NHTFRDLCZsdGNobm9pKTsgLyogR2V0IGFub3RoZXIgY29weSAqLworCSAgICBkZWJ1ZyhGMTAwLCJ0dG9wZW4gVElPQ0dMVEMgb2siLCIiLDApOworCX0KKyAgICB9CisjZWxzZQorICAgIGRlYnVnKEYxMDAsInR0b3BlbiBUSU9DR0xUQyBub3QgZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYgLyogVElPQ0dMVEMgKi8KKworI2lmZGVmIFRJT0NMR0VUCisgICAgZGVidWcoRjEwMCwidHRvcGVuIFRJT0NMR0VUIiwiIiwwKTsKKyAgICBsbW9kZWYgPSAwOworICAgIGlmIChpb2N0bCh0dHlmZCxUSU9DTEdFVCwmbG1vZGUpIDwgMCkgeworCWRlYnVnKEYxMDAsInR0b3BlbiBUSU9DTEdFVCBmYWlsZWQiLCIiLDApOworICAgIH0gZWxzZSB7CisJbG1vZGVmID0gMTsKKwlkZWJ1ZyhGMTAwLCJ0dG9wZW4gVElPQ0xHRVQgb2siLCIiLDApOworICAgIH0KKyNlbmRpZiAvKiBUSU9DTEdFVCAqLworCisjaWZkZWYgQkVMTFYxMAorICAgIGlvY3RsKHR0eWZkLFRJT0NHRVRQLCZ0dHJhdyk7CisgICAgaW9jdGwodHR5ZmQsVElPQ0dFVFAsJnR0dHZ0KTsKKyNlbHNlCisgICAgZ3R0eSh0dHlmZCwmdHRyYXcpOyAgICAgICAgICAgICAgICAgLyogQW5kIGEgY29weSBvZiBpdCBmb3IgcGFja2V0cyovCisgICAgZ3R0eSh0dHlmZCwmdHR0dnQpOyAgICAgICAgICAgICAgICAgLyogQW5kIG9uZSBmb3IgdmlydHVhbCB0dHkgc2VydmljZSAqLworI2VuZGlmIC8qIEJFTExWMTAgKi8KKworI2VuZGlmIC8qIEFUVFNWICovCisjZW5kaWYgLyogQlNENDRPUlBPU0lYICovCisKKy8qIFNlY3Rpb24gZm9yIGNoYW5naW5nIGxpbmUgZGlzY2lwbGluZS4gIEl0J3MgcmVzdG9yZWQgaW4gdHRyZXMoKS4gKi8KKworI2lmZGVmIEFJWFJTCisjaWZuZGVmIEFJWDQxCisgICAgeyB1bmlvbiB0eG5hbWUgbGRfbmFtZTsgaW50IGxkX2lkeCA9IDA7CisgICAgICB0dGxkID0gMDsKKyAgICAgICAgZG8geworICAJICBsZF9uYW1lLnR4X3doaWNoID0gbGRfaWR4Kys7CisgIAkgIGlvY3RsKHR0eWZkLCBUWEdFVENELCAmbGRfbmFtZSk7CisJICBpZiAoIXN0cm5jbXAobGRfbmFtZS50eF9uYW1lLCAicnRzIiwgMykpCisgIAkgICAgdHRsZCB8PSAxOworICAgICAgICB9IHdoaWxlICgqbGRfbmFtZS50eF9uYW1lKTsKKyAgICAgICAgZGVidWcoRjEwMSwiQUlYIGxpbmUgZGlzY2lwbGluZSIsIiIsdHRsZCk7CisgICAgICB9CisjZW5kaWYgLyogQUlYNDEgKi8KKyNlbmRpZiAvKiBBSVhSUyAqLworCisjaWZkZWYgQlNENDEKKy8qIEZvciA0LjFCU0Qgb25seSwgZm9yY2UgIm9sZCIgdHR5IGRyaXZlciwgbmV3IG9uZSBib3RjaGVzIFRBTkRFTS4gKi8KKyAgICB7IGludCBrOworICAgICAgaW9jdGwodHR5ZmQsIFRJT0NHRVRELCAmdHRsZCk7CS8qIEdldCBhbmQgc2F2ZSBsaW5lIGRpc2NpcGxpbmUgKi8KKyAgICAgIGRlYnVnKEYxMDEsIjQuMWJzZCBsaW5lIGRpc2NpcGxpbmUiLCIiLHR0bGQpOworICAgICAgayA9IE9UVFlESVNDOwkJCS8qIFN3aXRjaCB0byAib2xkIiBkaXNjaXBsaW5lICovCisgICAgICBrID0gaW9jdGwodHR5ZmQsIFRJT0NTRVRELCAmayk7CisgICAgICBkZWJ1ZyhGMTAxLCI0LjFic2QgdGlvY3NldGQiLCIiLGspOworICAgIH0KKyNlbmRpZiAvKiBCU0Q0MSAqLworCisjaWZkZWYgYWVnaXMKKyAgICAvKiBUaGlzIHdhcyBwcmV2aW91c2x5IGRvbmUgYmVmb3JlIHRoZSBsYXN0IHR3byBUQ0dFVEEgb3IgZ3R0eSBhYm92ZSwKKyAgICAgKiBpbiBib3RoIHRoZSBBVFRTViBhbmQgbm90LUFUVFNWIGNhc2UuICBJZiBpdCBpcyBub3Qgb2theSB0byBoYXZlIG9ubHkKKyAgICAgKiBvbmUgY29weSBpZiBpdCBoZXJlIGluc3RlYWQsIGdpdmUgdXMgYSBzaG91dCEKKyAgICAgKi8KKyAgICBzaW9fJGNvbnRyb2woKHNob3J0KXR0eWZkLCBzaW9fJHJhd19ubCwgZmFsc2UsIHN0KTsKKyAgICBpZiAoeGxvY2FsKSB7ICAgICAgIC8qIGlnbm9yZSBicmVha3MgZnJvbSBsb2NhbCBsaW5lICovCisgICAgICAgIHNpb18kY29udHJvbCgoc2hvcnQpdHR5ZmQsIHNpb18kaW50X2VuYWJsZSwgZmFsc2UsIHN0KTsKKyAgICAgICAgc2lvXyRjb250cm9sKChzaG9ydCl0dHlmZCwgc2lvXyRxdWl0X2VuYWJsZSwgZmFsc2UsIHN0KTsKKyAgICB9CisjZW5kaWYgLyogYWVnaXMgKi8KKworI2lmZGVmIFZYVkUKKyAgICB0dHJhdy5jX2xpbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBTVFRZIGxpbmUgMCBmb3IgVlgvVkUgKi8KKyAgICB0dHR2dC5jX2xpbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBTVFRZIGxpbmUgMCBmb3IgVlgvVkUgKi8KKyAgICBpb2N0bCh0dHlmZCxUQ1NFVEEsJnR0cmF3KTsKKyNlbmRpZiAvKiB2eHZlICovCisKKy8qIElmIE9fTkRFTEFZIHdhcyB1c2VkIGR1cmluZyBvcGVuKCksIHRoZW4gcmVtb3ZlIGl0IG5vdy4gKi8KKworI2lmZGVmIE9fTkRFTEFZCisgICAgZGVidWcoRjEwMCwidHRvcGVuIE9fTkRFTEFZIiwiIiwwKTsKKyAgICBpZiAoeGxvY2FsID4gMCkgeworICAgICAgaWYgKGZjbnRsKHR0eWZkLCBGX0dFVEZMLCAwKSAmIE9fTkRFTEFZKSB7CisJZGVidWcoRjEwMCwidHRvcGVuIGZjbnRsIE9fTkRFTEFZIiwiIiwwKTsKKyNpZm5kZWYgYWVnaXMKKwlpZiAoZmNudGwodHR5ZmQsRl9TRVRGTCwgZmNudGwodHR5ZmQsIEZfR0VURkwsIDApICYgfk9fTkRFTEFZKSA8IDApIHsKKwkgICAgZGVidWcoRjEwMCwidHRvcGVuIGZjbnRsIGZhaWx1cmUgdG8gdW5zZXQgT19OREVMQVkiLCIiLDApOworCSAgICBwZXJyb3IoIkNhbid0IHVuc2V0IE9fTkRFTEFZIik7CisJfQorI2VuZGlmIC8qIGFlZ2lzICovCisJLyogU29tZSBzeXN0ZW1zLCBub3RhYmx5IFhlbml4IChkb24ndCBrbm93IGhvdyBjb21tb24gdGhpcyBpcyBpbgorCSAqIG90aGVyIHN5c3RlbXMpLCBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IHRvIGdldCByaWQgb2YgdGhlIE9fTkRFTEFZCisJICogYmVoYXZpb3VyIG9uIHJlYWQoKSB3aXRoIHJlc3BlY3QgdG8gY2FycmllciBwcmVzZW5jZSAoaS5lLiByZWFkKCkKKwkgKiByZXR1cm5pbmcgMCB3aGVuIGNhcnJpZXIgYWJzZW50KSwgZXZlbiB0aG91Z2ggdGhlIGFib3ZlIGZjbnRsKCkKKwkgKiBpcyBlbm91Z2ggdG8gbWFrZSByZWFkKCkgd2FpdCBmb3IgaW5wdXQgd2hlbiBjYXJyaWVyIGlzIHByZXNlbnQuCisJICogVGhpcyBtYWdpYywgaW4gdHVybiwgcmVxdWlyZXMgQ0xPQ0FMIGZvciB3b3JraW5nIHdoZW4gdGhlIGNhcnJpZXIKKwkgKiBpcyBhYnNlbnQuIEJ1dCBpZiB4bG9jYWwgPT0gMCwgcHJlc3VtYWJseSB5b3UgYWxyZWFkeSBoYXZlIENMT0NBTAorCSAqIG9yIHlvdSBoYXZlIGEgY2Fycmllciwgb3RoZXJ3aXNlIHlvdSB3b3VsZG4ndCBiZSBydW5uaW5nIHRoaXMuCisJICovCisJZGVidWcoRjEwMSwidHRvcGVuIHhsb2NhbCIsIiIseGxvY2FsKTsKKyNpZmRlZiBBVFRTVgorI2lmZGVmIEJTRDQ0T1JQT1NJWAorI2lmZGVmIENPTU1FTlQJCQkJLyogMTIgQXVnIDE5OTcgKi8KKyNpZmRlZiBfX2JzZGlfXworCWlmICh4bG9jYWwpCisJICB0dHJhdy5jX2NmbGFnIHw9IENMT0NBTDsKKyNlbHNlCisjaWZkZWYgX19GcmVlQlNEX18KKwlpZiAoeGxvY2FsKQorCSAgdHRyYXcuY19jZmxhZyB8PSBDTE9DQUw7CisjZW5kaWYgLyogX19GcmVlQlNEX18gKi8KKyNlbmRpZiAvKiBfX2JzZGlfXyAqLworI2Vsc2UgLyogTm90IENPTU1FTlQgKi8KKyNpZmRlZiBDTE9DQUwKKwlpZiAoeGxvY2FsKQkJCS8qIFVuc2V0IHRoaXMgaWYgaXQncyBkZWZpbmVkLiAqLworCSAgdHRyYXcuY19jZmxhZyB8PSBDTE9DQUw7CisjZW5kaWYgLyogQ0xPQ0FMICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCWRlYnVnKEYxMDEsInR0b3BlbiBCU0Q0NE9SUE9TSVggY2FsbGluZyB0Y3NldGF0dHIiLCIiLFRDU0FEUkFJTik7CisJaWYgKHRjc2V0YXR0cih0dHlmZCwgVENTQURSQUlOLCAmdHRyYXcpIDwgMCkgeworCSAgICBkZWJ1ZyhGMTAwLCJ0dG9wZW4gUE9TSVggdGNzZWF0dHIgZmFpbHMiLCIiLDApOworCSAgICBwZXJyb3IoInRjc2V0YXR0ciIpOworCX0KKyNlbHNlIC8qICFCU0Q0NE9SUE9TSVggKi8KKwlpZiAoeGxvY2FsKSB7CisJICAgIHR0cmF3LmNfY2ZsYWcgfD0gQ0xPQ0FMOworCSAgICBkZWJ1ZyhGMTAwLCJ0dG9wZW4gY2FsbGluZyBpb2N0bChUQ1NFVEEpIiwiIiwwKTsKKwkgICAgZXJybm8gPSAwOworCSAgICBpZiAoaW9jdGwodHR5ZmQsIFRDU0VUQSwgJnR0cmF3KSA8IDApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ0dG9wZW4gaW9jdGwoVENTRVRBKSBmYWlscyIsIiIsZXJybm8pOworICAgICAgICAgICAgICAgIHBlcnJvcigiaW9jdGwoVENTRVRBKSIpOworICAgICAgICAgICAgfQorCX0KKyNlbmRpZiAvKiBCU0Q0NE9SUE9TSVggKi8KKyNlbmRpZiAvKiBBVFRTViAqLworI2lmbmRlZiBOT0NPVEZNQyAvKiA9IE5PIENsb3NlKE9wZW4oKSkgVG8gRm9yY2UgTW9kZSBDaGFuZ2UgKi8KKy8qIFJlcG9ydGVkbHkgbGV0cyB1dWdldHR5IGdyYWIgdGhlIGRldmljZSBpbiBTQ08gVU5JWCAzLjIgLyBYRU5JWCAyLjMgKi8KKwlkZWJ1ZyhGMTAwLCJ0dG9wZW4gZXhlY3V0aW5nIGNsb3NlL29wZW4iLCIiLDApOworCWNsb3NlKCBwcml2X29wbihmbmFtLCBPX1JEV1IpICk7IC8qIE1hZ2ljIHRvIGZvcmNlIGNoYW5nZS4gKi8KKyNlbmRpZiAvKiBOT0NPVEZNQyAqLworICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBPX05ERUxBWSAqLworCisvKiBJbnN0cnVjdCB0aGUgc3lzdGVtIGhvdyB0byB0cmVhdCB0aGUgY2FycmllciwgYW5kIHNldCBhIGZldyBvdGhlciB0dHkKKyAqIHBhcmFtZXRlcnMuCisgKgorICogVGhpcyBhbHNvIHVuZG9lcyB0aGUgdGVtcG9yYXJ5IHNldHRpbmcgb2YgQ0xPQ0FMIHRoYXQgbWF5IGhhdmUgYmVlbiBkb25lCisgKiBmb3IgdGhlIGNsb3NlKG9wZW4oKSkgYWJvdmUgKGV4Y2VwdCBpbiBYZW5peCkuICBBbHNvIHRocm93IGluIH5FQ0hPLCB0bworICogcHJldmVudCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBsaW5lIGZyb20gc2l0dGluZyB0aGVyZSB0YWxraW5nIHRvIGl0c2VsZiwKKyAqIHByb2R1Y2luZyBnYXJiYWdlIHdoZW4gdGhlIHVzZXIgcGVyZm9ybXMgYSBjb25uZWN0LgorICoKKyAqIFNDTyBYZW5peCB1bmZvcnR1bmF0ZWx5IHNlZW1zIHRvIGlnbm9yZSB0aGUgYWN0dWFsIHN0YXRlIG9mIENMT0NBTC4KKyAqIE5vdyBpdCB0aGlua3MgQ0xPQ0FMIGlzIGFsd2F5cyBvbi4gSXQgc2VlbXMgdGhlIG9ubHkgcmVhbCBzb2x1dGlvbiBmb3IKKyAqIFhlbml4IGlzIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSBsb3dlciBhbmQgdXBwZXIgY2FzZSBkZXZpY2UgbmFtZXMuCisgKgorICogVGhpcyBzZWN0aW9uIG1heSBhdCBzb21lIGZ1dHVyZSB0aW1lIGV4cGFuZCBpbnRvIHNldHRpbmcgYSBjb21wbGV0ZQorICogY29sbGVjdGlvbiBvZiB0dHkgcGFyYW1ldGVycywgb3IgY2FsbCBhIGZ1bmN0aW9uIHNoYXJlZCB3aXRoIHR0cGt0KCkvCisgKiB0dHZ0KCkgdGhhdCBkb2VzIHNvLiAgT24gdGhlIG90aGVyIGhhbmQsIHRoZSBpbml0aWFsIHBhcmFtZXRlcnMgYXJlIG5vdAorICogdGhhdCBpbXBvcnRhbnQsIHNpbmNlIHR0cGt0KCkgb3IgdHR2dCgpIHNob3VsZCBhbHdheXMgZml4IHRoYXQgYmVmb3JlCisgKiBhbnkgY29tbXVuaWNhdGlvbiBpcyBkb25lLiAgV2VsbCwgd2UnbGwgc2VlLi4uCisgKi8KKyAgICBpZiAoeGxvY2FsKSB7CisgICAgCWN1cmNhcnIgPSAtMjsKKwlkZWJ1ZyhGMTAwLCJ0dG9wZW4gY2FsbGluZyBjYXJyY3RsIiwiIiwwKTsKKwljYXJyY3RsKCZ0dHJhdywgdHRjYXJyID09IENBUl9PTik7CisJZGVidWcoRjEwMCwidHRvcGVuIGNhcnJjdGwgb2siLCIiLDApOworCisjaWZkZWYgQ09IRVJFTlQKKyNkZWZpbmUgU1ZPUlBPU0lYCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKworI2lmZGVmIFNWT1JQT1NJWAorCXR0cmF3LmNfbGZsYWcgJj0gfkVDSE87CisJdHRvbGQuY19sZmxhZyAmPSB+RUNITzsKKyNpZmRlZiBCU0Q0NE9SUE9TSVgKKwl5ID0gdGNzZXRhdHRyKHR0eWZkLCBUQ1NBRFJBSU4sICZ0dHJhdyk7CisJZGVidWcoRjEwMSwidHRvcGVuIHRjc2V0YXR0ciIsIiIseSk7CisjZWxzZQorCXkgPSBpb2N0bCh0dHlmZCwgVENTRVRBLCAmdHRyYXcpOworCWRlYnVnKEYxMDAsInR0b3BlbiBpb2N0bCIsIiIseSk7CisjZW5kaWYgLyogQlNENDRPUlBPU0lYICovCisKKyNlbHNlIC8qIEJTRCwgZXRjICovCisJdHRyYXcuc2dfZmxhZ3MgJj0gfkVDSE87CisJdHRvbGQuc2dfZmxhZ3MgJj0gfkVDSE87CisjaWZkZWYgQkVMTFYxMAorCXkgPSBpb2N0bCh0dHlmZCxUSU9DU0VUUCwmdHRyYXcpOworCWRlYnVnKEYxMDAsInR0b3BlbiBpb2N0bCIsIiIseSk7CisjZWxzZQorCXkgPSBzdHR5KHR0eWZkLCZ0dHJhdyk7CisJZGVidWcoRjEwMCwidHRvcGVuIHN0dHkiLCIiLHkpOworI2VuZGlmIC8qIEJFTExWMTAgKi8KKyNlbmRpZiAvKiBTVk9SUE9TSVggKi8KKworI2lmZGVmIENPSEVSRU5UCisjdW5kZWYgU1ZPUlBPU0lYCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKworCS8qIHR0Zmx1aSgpOyAqLyAgLyogIFRoaXMgZmFpbHMgZm9yIHNvbWUgcmVhc29uLiAgKi8KKyAgICB9CisKKyAgICAvKiBHZXQgY3VycmVudCBzcGVlZCAqLworCisjaWZuZGVmIEJFQk9YCisgICAgdHRzcGVlZCA9IHR0Z3NwZCgpOworI2Vsc2UKKyAgICB0dHNwZWVkID0gMTkyMDA7CisjZW5kaWYgLyogIUJFQk9YICovCisgICAgZGVidWcoRjEwMSwidHRvcGVuIHR0c3BlZWQiLCIiLHR0c3BlZWQpOworCisgICAgLyogRG9uZSwgbWFrZSBlbnRyaWVzIGluIGRlYnVnIGxvZywgcmVzdG9yZSBDdHJsLUMgdHJhcCwgYW5kIHJldHVybi4gKi8KKworICAgIGRlYnVnKEYxMDEsInR0b3BlbiB0dHlmZCIsIiIsdHR5ZmQpOworICAgIGRlYnVnKEYxMDEsInR0b3BlbiAqbGNsIiwiIiwqbGNsKTsKKyAgICBkZWJ1ZyhGMTExLCJ0dG9wZW4gbG9jayBmaWxlIixmbGZuYW0sbGtmKTsKKyAgICBzaWduYWwoU0lHSU5ULG9jY3QpOworICAgIHNpZ2ludF9pZ24gPSAob2NjdCA9PSBTSUdfSUdOKSA/IDEgOiAwOworICAgIGdvdHNpZ3MgPSAwOworICAgIHJldHVybigwKTsKK30KKworCisvKiAgRCBPIF8gTyBQIEUgTiAgLS0gIERvIHRoZSByaWdodCBraW5kIG9mIG9wZW4oKSBjYWxsIGZvciB0aGUgdHR5LiAqLworCitpbnQKK2RvX29wZW4odHRuYW1lKSBjaGFyICp0dG5hbWU7IHsKKyAgICBpbnQgZmxhZ3M7CisKKyNpZmRlZiBRTlg2CisgICAgLyogT19OT05CTE9DSyBvbiAvZGV2L3R0eSBtYWtlcyBvcGVuKCkgZmFpbCAqLworICAgIHJldHVybihwcml2X29wbih0dG5hbWUsIE9fUkRXUiB8CisJCSAgICAoCisJCSAgICAgKChpbnQpc3RyY21wKHR0bmFtZSwiL2Rldi90dHkiKSA9PSAwKSA/CisJCSAgICAgMCA6CisJCSAgICAgKHR0Y2FyciAhPSBDQVJfT04pID8gT19OT05CTE9DSyA6IDApCisJCSAgICApCisJICAgKTsgCisjZWxzZSAgLyogIVFOWDYgKi8KKworI2lmbmRlZglPX05ERUxBWQkJCS8qIE9fTkRFTEFZIG5vdCBkZWZpbmVkICovCisgICAgcmV0dXJuKHByaXZfb3BuKHR0bmFtZSwyKSk7CisjZWxzZQkJCQkJLyogT19OREVMQVkgZGVmaW5lZCAqLworCisjaWZkZWYgQVRUNzMwMAorLyoKKyBPcGVuIGNvbW1zIGxpbmUgd2l0aG91dCB3YWl0aW5nIGZvciBjYXJyaWVyIHNvIGluaXRpYWwgY2FsbCBkb2VzIG5vdCBoYW5nCisgYmVjYXVzZSBzdGF0ZSBvZiAibW9kZW0iIGlzIGxpa2VseSB1bmtub3duIGF0IHRoZSBpbml0aWFsIGNhbGwgIC1qcmQuCisgSWYgdGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBnZXR0eSBzdHVmZiB0byB3b3JrLCBhbmQgdGhlIG9wZW4gd291bGQgbm90IHdvcmsKKyB3aXRob3V0IE9fTkRFTEFZIHdoZW4gZ2V0dHkgaXMgc3RpbGwgb24sIHRoZW4gdGhpcyBzcGVjaWFsIGNhc2UgaXMgb2suCisgT3RoZXJ3aXNlLCBnZXQgcmlkIG9mIGl0LiAtc2tlCisqLworICAgIHJldHVybihwcml2X29wbih0dG5hbWUsIE9fUkRXUiB8IE9fTkRFTEFZKSk7CisKKyNlbHNlCS8qICFBVFQ3MzAwICovCisKKyAgICAvKiBOb3JtYWwgY2FzZS4gVXNlIE9fTkRFTEFZIGFjY29yZGluZyB0byBTRVQgQ0FSUklFUi4gU2VlIHR0c2NhcnIoKS4gKi8KKyAgICBmbGFncyA9IE9fUkRXUjsKKyAgICBkZWJ1ZyhGMTAxLCJkb19vcGVuIHhsb2NhbCIsIiIseGxvY2FsKTsKKyAgICBkZWJ1ZyhGMTExLCJkb19vcGVuIGZsYWdzIEEiLHR0bmFtZSxmbGFncyk7CisgICAgaWYgKHhsb2NhbCAmJiAodHRjYXJyICE9IENBUl9PTikpCisgICAgICBmbGFncyB8PSBPX05ERUxBWTsKKyAgICBkZWJ1ZyhGMTExLCJkb19vcGVuIGZsYWdzIEIiLHR0bmFtZSxmbGFncyk7CisgICAgcmV0dXJuKHByaXZfb3BuKHR0bmFtZSwgZmxhZ3MpKTsKKyNlbmRpZiAvKiAhQVRUNzMwMCAqLworI2VuZGlmIC8qIE9fTkRFTEFZICovCisjZW5kaWYgLyogUU5YNiAqLworfQorCisvKiAgVCBUIEMgTCBPIFMgIC0tICBDbG9zZSB0aGUgVFRZLCByZWxlYXNpbmcgYW55IGxvY2suICAqLworCitzdGF0aWMgaW50IHR0Y19zdGF0ZSA9IDA7CQkvKiB0dGNsb3NlKCkgc3RhdGUgKi8KK3N0YXRpYyBjaGFyICogdHRjX25hbVtdID0geyAic2V0dXAiLCAiaGFuZ3VwIiwgInJlc2V0IiwgImNsb3NlIiB9OworCitpbnQKK3R0Y2xvcyhmb28pIGludCBmb287IHsJCQkvKiBBcmcgcmVxJ2QgZm9yIHNpZ25hbCgpIHByb3RvdHlwZSAqLworICAgIGludCB4eCwgeCA9IDA7CisgICAgZXh0ZXJuIGludCBleGl0aGFuZ3VwOworCisgICAgZGVidWcoRjEwMSwidHRjbG9zIHR0eWZkIiwiIix0dHlmZCk7CisgICAgZGVidWcoRjEwMSwidHRjbG9zIG5ldGNvbm4iLCIiLG5ldGNvbm4pOworICAgIGRlYnVnKEYxMDEsInR0Y2xvcyB4bG9jYWwiLCIiLHhsb2NhbCk7CisjaWZkZWYgTk9GRFpFUk8KKyAgICBkZWJ1ZyhGMTAwLCJ0dGNsb3MgTk9GRFpFUk8iLCIiLDApOworI2VuZGlmIC8qIE5PRkRaRVJPICovCisKKyNpZmRlZiBDT01NRU5UCisjaWZkZWYgVFRMRUJVRgorICAgIGxlX2luaXQoKTsJCQkJLyogTm8gbmVlZCBmb3IgYW55IG9mIHRoaXMgKi8KKyNlbmRpZiAvKiBUVExFQlVGICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgaWYgKHR0eWZkIDwgMCkJCQkvKiBXYXNuJ3Qgb3Blbi4gKi8KKyAgICAgIHJldHVybigwKTsKKworICAgIGlmICh0dGZkZmxnKQkJCS8qIElmIHdlIGluaGVyaXRlZCB0dHlmZCBmcm9tICovCisgICAgICByZXR1cm4oMCk7CQkJLyogYW5vdGhlciBwcm9jZXNzLCBkb24ndCBjbG9zZSBpdC4gKi8KKworICAgIHR2dGZsZyA9IDA7CQkJCS8qIChzb21lIGRheSBnZXQgcmlkIG9mIHRoaXMuLi4pICovCisgICAgZ290c2lncyA9IDA7CisKKyNpZmRlZiBJS1NECisgICAgaWYgKGluc2VydmVyKSB7CisjaWZkZWYgVE5DT0RFCisgICAgICAgICAgdG5fcHVzaCgpOyAgICAgICAgICAgICAgICAgICAgLyogUGxhY2UgYW55IHdhaXRpbmcgZGF0YSBpbnRvIGlucHV0Ki8KKyAgICAgICAgICB0bl9zb3B0KERPLFRFTE9QVF9MT0dPVVQpOyAgICAvKiBTZW5kIExPR09VVCBvcHRpb24gYmVmb3JlIGNsb3NlICovCisgICAgICAgICAgVEVMT1BUX1VOQU5TV0VSRURfRE8oVEVMT1BUX0xPR09VVCkgPSAxOworICAgICAgICAgIHRuX3Jlc2V0KCk7ICAgICAgICAgICAgICAgICAgIC8qIFRoZSBSZXNldCBUZWxuZXQgT3B0aW9uIHRhYmxlLiAgKi8KKyNlbmRpZiAvKiBUTkNPREUgKi8KKyNpZmRlZiBDS19TU0wKKwkgIGlmIChzc2xfYWN0aXZlX2ZsYWcpIHsKKwkgICAgICBpZiAoc3NsX2RlYnVnX2ZsYWcpCisJCUJJT19wcmludGYoYmlvX2VyciwiY2FsbGluZyBTU0xfc2h1dGRvd24oc3NsKVxuIik7CisJICAgICAgU1NMX3NodXRkb3duKHNzbF9jb24pOworCSAgICAgIFNTTF9mcmVlKHNzbF9jb24pOworCSAgICAgIHNzbF9jb24gPSBOVUxMOworCSAgICAgIHNzbF9hY3RpdmVfZmxhZyA9IDA7CisJICB9CisJICBpZiAodGxzX2FjdGl2ZV9mbGFnKSB7CisJICAgICAgaWYgKHNzbF9kZWJ1Z19mbGFnKQorCQlCSU9fcHJpbnRmKGJpb19lcnIsImNhbGxpbmcgU1NMX3NodXRkb3duKHRscylcbiIpOworCSAgICAgIFNTTF9zaHV0ZG93bih0bHNfY29uKTsKKwkgICAgICBTU0xfZnJlZSh0bHNfY29uKTsKKwkgICAgICB0bHNfY29uID0gTlVMTDsKKwkgICAgICB0bHNfYWN0aXZlX2ZsYWcgPSAwOworCSAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisjaWZkZWYgTkVUQ01ECisgICAgaWYgKHR0cGlwZSkgewkJCS8qIFdlJ3ZlIGJlZW4gdXNpbmcgYSBwaXBlICovCisJLyogdHRwaXBlID0gMDsgKi8KKwlpZiAodHRwaWQgPiAwKSB7CisJICAgIGludCB3c3RhdDsKKwkgICAgaW50IHN0YXR1c3A7CisJICAgIGNsb3NlKGZkaW4pOwkJLyogQ2xvc2UgdGhlc2UuICovCisJICAgIGNsb3NlKGZkb3V0KTsKKwkgICAgZmRpbiA9IGZkb3V0ID0gLTE7CisJICAgIGtpbGwodHRwaWQsMSk7CQkvKiBLaWxsIGZvcmsgd2l0aCBTSUdIVVAgKi8KKwkgICAgd2hpbGUgKDEpIHsKKwkJd3N0YXQgPSB3YWl0KCZzdGF0dXNwKTsKKwkJaWYgKHdzdGF0ID09IHR0cGlkIHx8IHdzdGF0ID09IC0xKQorCQkgIGJyZWFrOworCQlwZXhpdHN0YXQgPSAoc3RhdHVzcCAmIDB4ZmYpID8gc3RhdHVzcCA6IHN0YXR1c3AgPj4gODsKKwkgICAgfQorCSAgICB0dHBpZCA9IDA7CisJfQorCW5ldGNvbm4gPSAwOworCXdhc2Nsb3NlZCA9IDE7CisJdHR5ZmQgPSAtMTsKKwlyZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorICAgIGlmICh0dHB0eSkgeworI2lmbmRlZiBOT0RPUFRZCisgICAgICAgIGVuZF9wdHkoKTsKKyNlbmRpZiAvKiBOT0RPUFRZICovCisgICAgICAgIGNsb3NlKHR0eWZkKTsKKwluZXRjb25uID0gMDsKKwl3YXNjbG9zZWQgPSAxOworICAgICAgICB0dHB0eSA9IDA7CisgICAgICAgIHR0eWZkID0gLTE7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogTkVUUFRZICovCisKKyNpZmRlZglORVRDT05OCisgICAgaWYgKG5ldGNvbm4pIHsJCQkvKiBJZiBpdCdzIGEgbmV0d29yayBjb25uZWN0aW9uLiAqLworCWRlYnVnKEYxMDAsInR0Y2xvcyBjbG9zaW5nIG5ldCIsIiIsMCk7CisJbmV0Y2xvcygpOwkJCS8qIExldCB0aGUgbmV0d29yayBtb2R1bGUgY2xvc2UgaXQuICovCisJbmV0Y29ubiA9IDA7CQkJLyogTm8gbW9yZSBuZXR3b3JrIGNvbm5lY3Rpb24uICovCisJZGVidWcoRjEwMSwidHRjbG9zIHR0eWZkIGFmdGVyIG5ldGNsb3MiLCIiLHR0eWZkKTsgLyogU2hvdWxkIGJlIC0xICovCisJcmV0dXJuKDApOworICAgIH0KKyNlbmRpZgkvKiBORVRDT05OICovCisKKyAgICBpZiAoeGxvY2FsKSB7CQkJLyogV2UncmUgY2xvc2luZyBhIFNFVCBMSU5FIGRldmljZSAqLworI2lmZGVmIEZUMjEJCQkJLyogRm9ydHVuZSAyLjEtc3BlY2lmaWMgaXRlbXMgLi4uICovCisJaW9jdGwodHR5ZmQsVElPQ0hQQ0wsIE5VTEwpOworI2VuZGlmIC8qIEZUMjEgKi8KKyNpZmRlZiB1bHRyaXgJCQkJLyogVWx0cml4LXNwZWNpZmljIGl0ZW1zIC4uLiAqLworI2lmZGVmIFRJT0NTSU5VU0UKKwkvKiBVbnNldCB0aGUgSU5VU0UgZmxhZyB0aGF0IHdlIHNldCBpbiB0dG9wZW4oKSAqLworCWlvY3RsKHR0eWZkLCBUSU9DU0lOVVNFLCBOVUxMKTsKKyNlbmRpZiAvKiBUSU9DU0lOVVNFICovCisJaW9jdGwodHR5ZmQsIFRJT0NOTU9ERU0sICZ4KTsKKyNpZmRlZiBDT01NRU5UCisJLyogV2hhdCB3YXMgdGhpcz8gKi8KKwlpb2N0bCh0dHlmZCwgVElPQ05DQVIsIE5VTEwpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiB1bHRyaXggKi8KKyAgICB9CisKKyAgICAvKiBUaGlzIGlzIHRvIHByZXZlbnQgdXMgZnJvbSBzdGlja2luZyBpbiB0dGhhbmcoKSBvciBjbG9zZSgpLiAqLworCisjaWZkZWYgT19OREVMQVkKKyNpZm5kZWYgYWVnaXMKKyAgICBpZiAodHR5ZmQgPiAwKSB7CQkJLyogQnV0IHNraXAgaXQgb24gc3RkaW4uICovCisJZGVidWcoRjEwMCwidHRjbG9zIHNldHRpbmcgT19OREVMQVkiLCIiLDApOworCXggPSBmY250bCh0dHlmZCxGX1NFVEZMLGZjbnRsKHR0eWZkLEZfR0VURkwsIDApfE9fTkRFTEFZKTsKKyNpZmRlZiBERUJVRworCWlmIChkZWJsb2cgJiYgeCA9PSAtMSkgeworCSAgICBwZXJyb3IoIldhcm5pbmcgLSBDYW4ndCBzZXQgT19OREVMQVkiKTsKKwkgICAgZGVidWcoRjEwMSwidHRjbG9zIGZjbnRsIGZhaWx1cmUgdG8gc2V0IE9fTkRFTEFZIiwiIix4KTsKKwl9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICB9CisjZW5kaWYgLyogYWVnaXMgKi8KKyNlbmRpZiAvKiBPX05ERUxBWSAqLworCisgICAgeCA9IDA7CisgICAgdHRjX3N0YXRlID0gMDsKKyAgICBpZiAoeGxvY2FsCisjaWZkZWYgTk9GRFpFUk8KKwl8fCB0dHlmZCA+IDAKKyNlbmRpZiAvKiBOT0ZEWkVSTyAqLworCSkgeworCXNhdmFsID0gc2lnbmFsKFNJR0FMUk0seHRpbWVyaCk7IC8qIEVuYWJsZSB0aW1lciBpbnRlcnJ1cHQuICovCisJeHggPSBhbGFybSg4KTsJCQkvKiBBbGxvdyA4IHNlY29uZHMuICovCisJZGVidWcoRjEwMSwidHRjbG9zIGFsYXJtIiwiIix4eCk7CisJaWYgKAorI2lmZGVmIENLX1BPU0lYX1NJRworCSAgICBzaWdzZXRqbXAoc2pidWYsMSkKKyNlbHNlCisJICAgIHNldGptcChzamJ1ZikKKyNlbmRpZiAvKiBDS19QT1NJWF9TSUcgKi8KKwkgICAgKSB7CQkJCS8qIFRpbWVyIHdlbnQgb2ZmPyAqLworCSAgICB4ID0gLTE7CisjaWZkZWYgREVCVUcKKwkgICAgZGVidWcoRjExMSwidHRjbG9zIEFMQVJNIFRSQVAgZXJybm8iLGNraXRvYSh0dGNfc3RhdGUpLGVycm5vKTsKKwkgICAgcHJpbnRmKCJ0dGNsb3MoKSB0aW1lb3V0OiAlc1xuIiwgdHRjX25hbVt0dGNfc3RhdGVdKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCX0KKwkvKiBIYW5nIHVwIHRoZSBkZXZpY2UgKGRyb3AgRFRSKSAqLworCisJZXJybm8gPSAwOworCWRlYnVnKEYxMTEsInR0Y2xvcyBBIixja2l0b2EoeCksdHRjX3N0YXRlKTsKKwlpZiAodHRjX3N0YXRlIDwgMSkgeworCSAgICB0dGNfc3RhdGUgPSAxOworCSAgICBkZWJ1ZyhGMTAxLCJ0dGNsb3MgZXhpdGhhbmd1cCIsIiIsZXhpdGhhbmd1cCk7CisJICAgIGlmIChleGl0aGFuZ3VwKSB7CisJCWFsYXJtKDgpOwkJLyogUmUtYXJtIHRoZSB0aW1lciAqLworCQlkZWJ1ZyhGMTAxLCJ0dGNsb3MgY2FsbGluZyB0dGhhbmcoKSIsIiIseCk7CisJCXggPSB0dGhhbmcoKTsJCS8qIEhhbmcgdXAgZmlyc3QsIHRoZW4uLi4gKi8KKwkJZGVidWcoRjEwMSwidHRjbG9zIHR0aGFuZygpIiwiIix4KTsKKwkgICAgfQorCX0KKwkvKiBQdXQgYmFjayBkZXZpY2UgbW9kZXMgYXMgd2UgZm91bmQgdGhlbSAqLworCisJZXJybm8gPSAwOworCWRlYnVnKEYxMTEsInR0Y2xvcyBCIixja2l0b2EoeCksdHRjX3N0YXRlKTsKKwlpZiAodHRjX3N0YXRlIDwgMikgeworCSAgICB0dGNfc3RhdGUgPSAyOworCSAgICAvKiBEb24ndCB0cnkgdG8gbWVzcyB3aXRoIHR0eSBtb2RlcyBpZiB0dGhhbmcgZmFpbGVkKCkgKi8KKwkgICAgLyogc2luY2UgaXQgcHJvYmFibHkgd29uJ3Qgd29yay4gKi8KKwkgICAgaWYgKHggPiAtMSkgeworCQlkZWJ1ZyhGMTAxLCJ0dGNsb3MgY2FsbGluZyB0dHJlcygpIiwiIix4KTsKKwkJc2lnbmFsKFNJR0FMUk0seHRpbWVyaCk7IC8qIFJlLWVuYWJsZSB0aGUgYWxhcm0uICovCisJCWFsYXJtKDgpOwkJLyogUmUtYXJtIHRoZSB0aW1lciAqLworCQl4ID0gdHRyZXMoKTsJCS8qIFJlc2V0IGRldmljZSBtb2Rlcy4gKi8KKwkJZGVidWcoRjEwMSwidHRjbG9zIHR0cmVzKCkiLCIiLHgpOworCQlhbGFybSgwKTsKKwkgICAgfQorCX0KKwkvKiBDbG9zZSB0aGUgZGV2aWNlICovCisKKwllcnJubyA9IDA7CisJZGVidWcoRjEwMSwidHRjbG9zIEMiLCIiLHR0Y19zdGF0ZSk7CisJaWYgKHR0Y19zdGF0ZSA8IDMpIHsKKwkgICAgdHRjX3N0YXRlID0gMzsKKwkgICAgZXJybm8gPSAwOworCSAgICBkZWJ1ZyhGMTAxLCJ0dGNsb3MgY2FsbGluZyBjbG9zZSIsIiIseCk7CisJICAgIHNpZ25hbChTSUdBTFJNLHh0aW1lcmgpOwkvKiBSZS1lbmFibGUgYWxhcm0uICovCisJICAgIGFsYXJtKDgpOwkJCS8qIFJlLWFybSB0aGUgdGltZXIgKi8KKwkgICAgeCA9IGNsb3NlKHR0eWZkKTsJCS8qIENsb3NlIHRoZSBkZXZpY2UuICovCisJICAgIGRlYnVnKEYxMDEsInR0Y2xvcyBjbG9zZSgpIiwiIix4KTsKKwkgICAgaWYgKHggPiAtMSkKKwkgICAgICB0dGNfc3RhdGUgPSAzOworCX0KKwlkZWJ1ZyhGMTAxLCJ0dGNsb3MgRCIsIiIsdHRjX3N0YXRlKTsKKwl0dGltb2ZmKCk7CQkJLyogVHVybiBvZmYgdGltZXIuICovCisJaWYgKHggPCAwKSB7CisJICAgIHByaW50ZigiP1dBUk5JTkcgLSBjbG9zZSBmYWlsZWQ6ICVzXG4iLHR0bm1zdik7CisjaWZkZWYgREVCVUcKKwkgICAgaWYgKGRlYmxvZykgeworCQlwcmludGYoImVycm5vID0gJWRcbiIsIGVycm5vKTsKKwkJZGVidWcoRjEwMSwidHRjbG9zIGZhaWxlZCIsIiIsZXJybm8pOworCSAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKwl9CisJLyogVW5sb2NrIGFmdGVyIGNsb3NpbmcgYnV0IGJlZm9yZSBhbnkgZ2V0dHkgbXVtYm8ganVtYm8gKi8KKworCWRlYnVnKEYxMDAsInR0Y2xvcyBhYm91dCB0byBjYWxsIHR0dW5sY2siLCIiLDApOworICAgICAgICBpZiAodHR1bmxjaygpKSAgICAgICAgICAgICAgICAgIC8qIFJlbGVhc2UgdXVjcC1zdHlsZSBsb2NrICovCisJICBmcHJpbnRmKHN0ZGVyciwiV2FybmluZywgcHJvYmxlbSByZWxlYXNpbmcgbG9ja1xyXG4iKTsKKyAgICB9CisKKy8qIEZvciBiaWRpcmVjdGlvbmFsIGxpbmVzLCByZXN0b3JlIGdldHR5IGlmIGl0IHdhcyB0aGVyZSBiZWZvcmUuICovCisKKyNpZmRlZiBBQ1VDTlRSTAkJCQkvKiA0LjNCU0QgYWN1Y250cmwoKSBtZXRob2QuICovCisgICAgaWYgKHhsb2NhbCkgeworCWRlYnVnKEYxMDAsInR0Y2xvcyBBQ1VDTlRSTCIsIiIsMCk7CisJYWN1Y250cmwoImVuYWJsZSIsdHRubXN2KTsJLyogRW5hYmxlIGdldHR5IG9uIHRoZSBkZXZpY2UuICovCisgICAgfQorI2Vsc2UKKyNpZmRlZiBBVFQ3MzAwCQkJCS8qIEFUVCBVTklYIFBDICgzQjEsIDczMDApIG1ldGhvZC4gKi8KKyAgICBpZiAoeGxvY2FsKSB7CisJZGVidWcoRjEwMCwidHRjbG9zIEFUVDczMDAgb25nZXR0eSIsIiIsMCk7CisJaWYgKGF0dG1vZGVtICYgRE9HRVRZKQkJLyogV2FzIGdldHR5KDFtKSBydW5uaW5nIGJlZm9yZSB1cz8gKi8KKwkgIG9uZ2V0dHkodHRubXN2KTsJCS8qIFllcywgcmVzdGFydCBnZXR0eSBvbiB0dHkgbGluZSAqLworCWF0dG1vZGVtICY9IH5ET0dFVFk7CQkvKiBObyBwaG9uZSBpbiB1c2UsIGdldHR5IHJlc3RvcmVkICovCisgICAgfQorI2VuZGlmIC8qIEFUVDczMDAgKi8KKyNlbmRpZiAvKiBTeXN0ZW0tZGVwZW5kZW50IGdldHR5LXJlc3RvcmluZyBtZXRob2RzICovCisKKyNpZmRlZiBzb255X25ld3MKKyAgICBrbV9leHQgPSAtMTsJCQkvKiBJbnZhbGlkYXRlIGRldmljZSdzIEthbmppLW1vZGUgKi8KKyNlbmRpZiAvKiBzb255X25ld3MgKi8KKworICAgIHR0eWZkID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludmFsaWRhdGUgdGhlIGZpbGUgZGVzY3JpcHRvci4gKi8KKyAgICB3YXNjbG9zZWQgPSAxOworICAgIGRlYnVnKEYxMDAsInR0Y2xvcyBkb25lIiwiIiwwKTsKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qICBUIFQgSCBBIE4gRyAgLS0gIEhhbmd1cCBwaG9uZSBsaW5lIG9yIG5ldHdvcmsgY29ubmVjdGlvbi4gICovCisvKgorICBSZXR1cm5zOgorICAwIGlmIGl0IGRvZXMgbm90aGluZy4KKyAgMSBpZiBpdCBiZWxpZXZlcyB0aGF0IGl0IGh1bmcgdXAgc3VjY2Vzc2Z1bGx5LgorIC0xIGlmIGl0IGJlbGlldmVzIHRoYXQgdGhlIGhhbmd1cCBhdHRlbXB0IGZhaWxlZC4KKyovCisKKyNkZWZpbmUgSFVQVElNRSA1MDAJCQkvKiBNaWxsaXNlY29uZHMgZm9yIGhhbmd1cCAqLworCisjaWZkZWYgQ09NTUVOVAorLyogVGhlIGZvbGxvd2luZyBkaWRuJ3Qgd29yayBidXQgVElPQ1NEVFIgZG9lcyB3b3JrICovCisjaWZkZWYgVU5JWFdBUkUKKy8qIERlZmluZSBIVVBfUE9TSVggdG8gZm9yY2Ugbm9uLVBPU0lYIGJ1aWxkcyB0byB1c2UgdGhlIFBPU0lYIGhhbmd1cCBtZXRob2QgKi8KKyNpZm5kZWYgUE9TSVgJCQkJLyogU3VjaCBhcyBVbml4d2FyZSAxLngsIDIueCAqLworI2lmbmRlZiBIVVBfUE9TSVgKKyNkZWZpbmUgSFVQX1BPU0lYCisjZW5kaWYgLyogSFVQX1BPU0lYICovCisjZW5kaWYgLyogUE9TSVggKi8KKyNlbmRpZiAvKiBVTklYV0FSRSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmbmRlZiBVU0VfVElPQ1NEVFIKKyNpZmRlZiBfX05ldEJTRF9fCisvKiBCZWNhdXNlIHRoZSBQT1NJWCBtZXRob2QgKHNldCBvdXRwdXQgc3BlZWQgdG8gMCkgZG9lc24ndCB3b3JrIGluIE5ldEJTRCAqLworI2lmZGVmIFRJT0NTRFRSCisjaWZkZWYgVElPQ0NEVFIKKyNkZWZpbmUgVVNFX1RJT0NTRFRSCisjZW5kaWYgLyogVElPQ0NEVFIgKi8KKyNlbmRpZiAvKiBUSU9DU0RUUiAqLworI2VuZGlmIC8qIF9fTmV0QlNEX18gKi8KKyNlbmRpZiAvKiBVU0VfVElPQ1NEVFIgKi8KKworI2lmbmRlZiBIVVBfQ0xPU0VfUE9TSVgKKyNpZmRlZiBPVTgKKyNkZWZpbmUgSFVQX0NMT1NFX1BPU0lYCisjZWxzZQorI2lmZGVmIENLX1NDT1Y1CisjZGVmaW5lIEhVUF9DTE9TRV9QT1NJWAorI2VuZGlmIC8qIENLX1NDT1Y1ICovCisjZW5kaWYgLyogT1U4ICovCisjZW5kaWYgLyogSFVQX0NMT1NFX1BPU0lYICovCisKKyNpZmRlZiBOT19IVVBfQ0xPU0VfUE9TSVgKKyNpZmRlZiBIVVBfQ0xPU0VfUE9TSVgKKyN1bmRlZiBIVVBfQ0xPU0VfUE9TSVgKKyNlbmRpZiAvKiBIVVBfQ0xPU0VfUE9TSVggKi8KKyNlbmRpZiAvKiBOT19IVVBfQ0xPU0VfUE9TSVggKi8KKworaW50Cit0dGhhbmcoKSB7CisjaWZkZWYgTk9MT0NBTAorICAgIHJldHVybigwKTsKKyNlbHNlCisgICAgaW50IHggPSAwOwkJCQkvKiBTb21ldGltZXMgdXNlZCBhcyByZXR1cm4gY29kZS4gKi8KKyNpZm5kZWYgUE9TSVgKKyAgICBpbnQgejsJCQkJLyogd29ya2VyICovCisjZW5kaWYgLyogUE9TSVggKi8KKworI2lmZGVmIENPSEVSRU5UCisjZGVmaW5lIFNWT1JQT1NJWAorI2VuZGlmIC8qIENPSEVSRU5UICovCisKKyNpZmRlZiBTVk9SUE9TSVgJCQkvKiBBVCZULCBQT1NJWCwgSFBVWCBkZWNsYXJhdGlvbnMuICovCisgICAgaW50IHNwZHNhdjsJCQkJLyogZm9yIHNhdmluZyBzcGVlZCAqLworI2lmZGVmIEhVUF9QT1NJWAorICAgIGludCBzcGRzYXZpOworI2Vsc2UKKyNpZmRlZiBCU0Q0NE9SUE9TSVgKKyAgICBpbnQgc3Bkc2F2aTsKKyNlbmRpZiAvKiBCU0Q0NE9SUE9TSVggKi8KKyNlbmRpZiAvKiBIVVBfUE9TSVggKi8KKyNpZmRlZiBIUFVYCisvKgorICBFYXJseSB2ZXJzaW9ucyBvZiBIUC1VWCBvbWl0dGVkIHRoZSBtZmxhZyB0eXBlZGVmLiAgSWYgeW91IGdldCBjb21wbGFpbnRzCisgIGFib3V0IGl0LCBqdXN0IGNoYW5nZSBpdCB0byBsb25nIChvciBiZXR0ZXIgc3RpbGwsIHVuc2lnbmVkIGxvbmcpLgorKi8KKyAgICBtZmxhZworICAgICAgZHRyX2Rvd24gPSAwMDAwMDAwMDAwMCwKKyAgICAgIG1vZGVtX3J0biwKKyAgICAgIG1vZGVtX3NhdjsKKyAgICBjaGFyIG1vZGVtX3N0YXRlWzY0XTsKKyNlbmRpZiAvKiBIUFVYICovCisgICAgaW50IGZsYWdzOwkJCQkvKiBmY250bCBmbGFncyAqLworICAgIHVuc2lnbmVkIHNob3J0IHR0Y19zYXZlOworI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworCisgICAgaWYgKHR0eWZkIDwgMCkgcmV0dXJuKDApOyAgICAgICAgICAgLyogRG9uJ3QgZG8gdGhpcyBpZiBub3Qgb3BlbiAgKi8KKyAgICBpZiAoeGxvY2FsIDwgMSkgcmV0dXJuKDApOwkJLyogRG9uJ3QgZG8gdGhpcyBpZiBub3QgbG9jYWwgKi8KKworI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpcGUpCisgICAgICByZXR1cm4oKHR0Y2xvcygwKSA8IDApID8gLTEgOiAxKTsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICBpZiAodHRwdHkpCisgICAgICByZXR1cm4oKHR0Y2xvcygwKSA8IDApID8gLTEgOiAxKTsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKyNpZmRlZiBORVRDT05OCisgICAgaWYgKG5ldGNvbm4pIHsJCQkvKiBOZXR3b3JrIGNvbm5lY3Rpb24uICovCisjaWZkZWYgVE5fQ09NUE9SVAorICAgICAgICBpZiAoaXN0bmNvbXBvcnQoKSkgeworICAgICAgICAgICAgaW50IHJjID0gdG5jX3NldF9kdHJfc3RhdGUoMCk7CisgICAgICAgICAgICBpZiAocmMgPj0gMCkgeworICAgICAgICAgICAgICAgIG1zbGVlcChIVVBUSU1FKTsKKyAgICAgICAgICAgICAgICByYyA9IHRuY19zZXRfZHRyX3N0YXRlKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuKHJjID49IDAgPyAxIDogLTEpOworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisJICByZXR1cm4oKG5ldGNsb3MoKSA8IDApID8gLTEgOiAxKTsgLyogSnVzdCBjbG9zZSBpdC4gKi8KKyAgfQorI2VuZGlmIC8qIE5FVENPTk4gKi8KKworLyogRnJvbSBoZXJlIGRvd24sIHdlIGhhbmRsZSByZWFsIHR0eSBkZXZpY2VzLiAqLworI2lmZGVmIEhVUF9QT1NJWAorLyoKKyAgZS5nLiBmb3IgVW5peHdhcmUgMiwgd2hlcmUgd2UgZG9uJ3QgaGF2ZSBhIGZ1bGwgUE9TSVggYnVpbGQsIHdlCisgIHN0aWxsIGhhdmUgdG8gdXNlIFBPU0lYLXN0eWxlIGhhbmd1cC4gIFRodXMgdGhlIGR1cGxpY2F0aW9uIG9mIHRoaXMKKyAgYW5kIHRoZSBuZXh0IGNhc2UsIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmVpbmcgd2UgdXNlIGEgbG9jYWwgdGVybWlvcworICBzdHJ1Y3QgaGVyZSwgc2luY2UgYSBkaWZmZXJlbnQgbW9kZWwgaXMgdXNlZCBlbHNld2hlcmUuCisKKyAgTk8gTE9OR0VSIFVTRUQgYXMgb2YgQy1LZXJtaXQgOC4wIC0tIGl0IHR1cm5zIG91dCB0aGF0IHRoaXMgbWV0aG9kLAorICBldmVuIHRob3VnaCBpdCBjb21waWxlcyBhbmQgZXhlY3V0ZXMgd2l0aG91dCBlcnJvciwgZG9lc24ndCBhY3R1YWxseQorICB3b3JrIChpLmUuIERUUiBkb2VzIG5vdCBkcm9wKSwgd2hlcmVhcyB0aGUgVElPQ1NEVFIgbWV0aG9kIHdvcmtzIGp1c3QgZmluZSwKKyovCisgICAgeworCXN0cnVjdCB0ZXJtaW9zIHR0Y3VyOworCWludCB4OworCWRlYnVnKEYxMDAsInR0aGFuZyBIVVBfUE9TSVggc3R5bGUiLCIiLDApOworCXggPSB0Y2dldGF0dHIodHR5ZmQsICZ0dGN1cik7CS8qIEdldCBjdXJyZW50IGF0dHJpYnV0ZXMgKi8KKwlkZWJ1ZyhGMTExLCJ0dGhhbmcgdGNnZXRhdHRyIixja2l0b2EoZXJybm8pLHgpOworCWlmICh4IDwgMCkgcmV0dXJuKC0xKTsKKwlzcGRzYXYgPSBjZmdldG9zcGVlZCgmdHRjdXIpOwkvKiBHZXQgY3VycmVudCBzcGVlZCAqLworCWRlYnVnKEYxMTEsInR0aGFuZyBjZmdldG9zcGVlZCIsY2tpdG9hKGVycm5vKSxzcGRzYXYpOworCXNwZHNhdmkgPSBjZmdldGlzcGVlZCgmdHRjdXIpOwkvKiBHZXQgY3VycmVudCBzcGVlZCAqLworCWRlYnVnKEYxMTEsInR0aGFuZyBjZmdldGlzcGVlZCIsY2tpdG9hKGVycm5vKSxzcGRzYXZpKTsKKwl4ID0gY2ZzZXRvc3BlZWQoJnR0Y3VyLEIwKTsJLyogUmVwbGFjZSBieSAwICovCisJZGVidWcoRjExMSwidHRoYW5nIGNmc2V0b3NwZWVkIixja2l0b2EoZXJybm8pLHgpOworCWlmICh4IDwgMCkgcmV0dXJuKC0xKTsKKwl4ID0gY2ZzZXRpc3BlZWQoJnR0Y3VyLEIwKTsKKwlkZWJ1ZyhGMTExLCJ0dGhhbmcgY2ZzZXRpc3BlZWQiLGNraXRvYShlcnJubykseCk7CisJaWYgKHggPCAwKSByZXR1cm4oLTEpOworCXggPSB0Y3NldGF0dHIodHR5ZmQsVENTQURSQUlOLCZ0dGN1cik7CisJZGVidWcoRjExMSwidHRoYW5nIHRjc2V0YXR0ciBCMCIsY2tpdG9hKGVycm5vKSx4KTsKKwlpZiAoeCA8IDApIHJldHVybigtMSk7CisJbXNsZWVwKEhVUFRJTUUpOwkJLyogU2xlZXAgMC41IHNlYyAqLworCXggPSBjZnNldG9zcGVlZCgmdHRjdXIsc3Bkc2F2KTsgLyogUmVzdG9yZSBwcmV2IHNwZWVkICovCisJaWYgKHggPCAwKSByZXR1cm4oLTEpOworCWRlYnVnKEYxMTEsInR0aGFuZyBjZnNldG9zcGVlZCBwcmV2Iixja2l0b2EoZXJybm8pLHgpOworCXggPSBjZnNldGlzcGVlZCgmdHRjdXIsc3Bkc2F2aSk7CisJZGVidWcoRjExMSwidHRoYW5nIGNmc2V0aXNwZWVkIHByZXYiLGNraXRvYShlcnJubykseCk7CisJaWYgKHggPCAwKSByZXR1cm4oLTEpOworCXggPSB0Y3NldGF0dHIodHR5ZmQsVENTQURSQUlOLCZ0dGN1cik7CisJZGVidWcoRjExMSwidHRoYW5nIHRjc2V0YXR0ciByZXN0b3JlIixja2l0b2EoZXJybm8pLHgpOworCWlmICh4IDwgMCkgcmV0dXJuKC0xKTsKKwlyZXR1cm4oMSk7CisgICAgfQorI2Vsc2UKKyNpZmRlZiBCU0Q0NE9SUE9TSVgKKyNpZmRlZiBRTlgKKyAgICB7CisJaW50IHg7CisJeCA9IHRjZHJvcGxpbmUodHR5ZmQsNTAwKTsKKwlkZWJ1ZyhGMTAxLCJ0dGhhbmcgUU5YIHRjZHJvcGxpbmUiLCIiLHgpOworCXR0Y3VyLmNfY2ZsYWcgfD0gQ0xPQ0FMOworCXggPSB0Y3NldGF0dHIodHR5ZmQsVENTQURSQUlOLCZ0dGN1cik7CisJZGVidWcoRjEwMSwidHRoYW5nIFFOWCB0Y3NldGF0dHIgcmVzdG9yZSIsIiIseCk7CisJaWYgKHggPCAwKSB7CisJICAgIGRlYnVnKEYxMDEsInR0aGFuZyBRTlggdGNzZXRhdHRyIHJlc3RvcmUgZXJybm8iLCIiLGVycm5vKTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisJLyogRml4IGZsYWdzIC0gZW5zdXJlIE9fTk9OQkxPQ0sgaXMgb2ZmICovCisKKwllcnJubyA9IDA7CisJZGVidWcoRjEwMSwidHRoYW5nIFFOWCBpbmlmbGFncyIsIiIsaW5pZmxhZ3MpOworCWlmIChmY250bCh0dHlmZCwgRl9TRVRGTCwgaW5pZmxhZ3MpID09IC0xKSB7CisJICAgIGRlYnVnKEYxMDEsInR0aGFuZyBRTlggRl9TRVRGTCBlcnJubyIsIiIsZXJybm8pOworCSAgICByZXR1cm4oLTEpOworCX0KKwlyZXR1cm4oeCk7CisgICAgfQorI2Vsc2UgIC8qIFFOWCAqLworICAgIHsKKwlpbnQgeDsKKyNpZmRlZiBVU0VfVElPQ1NEVFIKKwlkZWJ1ZyhGMTAwLCJ0dGhhbmcgQlNENDRPUlBPU0lYIFVTRV9USU9DU0RUUiIsIiIsMCk7CisJZXJybm8gPSAwOworCXggPSBpb2N0bCh0dHlmZCwgVElPQ0NEVFIsIE5VTEwpOworCWRlYnVnKEYxMTEsInR0aGFuZyBCU0Q0NE9SUE9TSVggaW9jdGwgVElPQ0NEVFIiLGNraXRvYShlcnJubykseCk7CisJaWYgKHggPCAwKSByZXR1cm4oLTEpOworCW1zbGVlcChIVVBUSU1FKTsJCS8qIFNsZWVwIDAuNSBzZWMgKi8KKwllcnJubyA9IDA7CisJeCA9IGlvY3RsKHR0eWZkLCBUSU9DU0RUUiwgTlVMTCk7CisJZGVidWcoRjExMSwidHRoYW5nIEJTRDQ0T1JQT1NJWCBpb2N0bCBUSU9DU0RUUiIsY2tpdG9hKGVycm5vKSx4KTsKKwlpZiAoeCA8IDApIHJldHVybigtMSk7CisjZWxzZSAgLyogVVNFX1RJT0NTRFRSICovCisKKyNpZmRlZiBIVVBfQ0xPU0VfUE9TSVgKKy8qCisgIEluIE9TUjUgdmVyc2lvbnMgd2hlcmUgVElPQ1NEVFIgaXMgbm90IGRlZmluZWQgKHVwIHRvIGFuZCBpbmNsdWRpbmcgYXQKKyAgbGVhc3QgNS4wLjZhKSB0aGUgUE9TSVggQVBJcyBpbiB0aGUgIiNlbHNlIiBwYXJ0IGJlbG93IGFyZSBhdmFpbGFibGUgYnV0CisgIGRvbid0IHdvcmssIGFuZCBubyBvdGhlciBBUElzIGFyZSBhdmFpbGFibGUgdGhhdCBkbyB3b3JrLiAgSW4gdGhpcyBjYXNlCisgIHdlIGhhdmUgdG8gZHJvcCBEVFIgYnkgYnJ1dGUgZm9yY2U6IGNsb3NlIGFuZCByZW9wZW4gdGhlIHBvcnQuICBUaGlzCisgIGNvZGUgYWN0dWFsbHkgd29ya3MsIGJ1dCBhbGwgdGhlIHN0ZXBzIGFyZSBjcnVjaWFsOiBzZXR0aW5nIENMT0NBTCwgdGhlCisgIE9fTkRFTEFZIG1hbmlwdWxhdGlvbnMsIGV0Yy4KKyovCisJZGVidWcoRjEwMCwidHRoYW5nIEhVUF9DTE9TRV9QT1NJWCBjbG9zZS9vcGVuIiwiIiwwKTsKKwlkZWJ1ZyhGMTAxLCJ0dGhhbmcgSFVQX0NMT1NFX1BPU0lYIE9fTk9OQkxPQ0siLCIiLE9fTk9OQkxPQ0spOworCWRlYnVnKEYxMDEsInR0aGFuZyBIVVBfQ0xPU0VfUE9TSVggT19OREVMQVkiLCIiLE9fTkRFTEFZKTsKKwllcnJubyA9IDA7CisJeCA9IHRjZ2V0YXR0cih0dHlmZCwgJnR0Y3VyKTsJLyogR2V0IGN1cnJlbnQgYXR0cmlidXRlcyAqLworCWRlYnVnKEYxMDEsInR0aGFuZyBIVVBfQ0xPU0VfUE9TSVggdGNnZXRhdHRyIiwiIix4KTsKKwlpZiAoeCA8IDApIHsKKwkgICAgZGVidWcoRjEwMSwidHRoYW5nIEhVUF9DTE9TRV9QT1NJWCB0Y2dldGF0dHIgZXJybm8iLCIiLGVycm5vKTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisJZXJybm8gPSAwOworCisJeCA9IGNsb3NlKHR0eWZkKTsJCS8qIENsb3NlIHdpdGhvdXQgcmVsZWFzaW5nIGxvY2sgKi8KKwlpZiAoeCA8IDApIHsKKwkgICAgZGVidWcoRjEwMSwidHRoYW5nIEhVUF9DTE9TRV9QT1NJWCBjbG9zZSBlcnJubyIsIiIsZXJybm8pOworCSAgICByZXR1cm4oLTEpOworCX0KKwllcnJubyA9IDA7CisJeCA9IG1zbGVlcCg1MDApOwkJLyogUGF1c2UgaGFsZiBhIHNlY29uZCAqLworCWlmICh4IDwgMCkgewkJCS8qIE9yIGlmIHRoYXQgZG9lc24ndCB3b3JrLCAxIHNlYyAqLworCSAgICBkZWJ1ZyhGMTAxLCJ0dGhhbmcgSFVQX0NMT1NFX1BPU0lYIG1zbGVlcCBlcnJubyIsIiIsZXJybm8pOworCSAgICBzbGVlcCgxKTsKKwl9CisJZXJybm8gPSAwOworCXR0eWZkID0gcHJpdl9vcG4odHRubXN2LCAoT19SRFdSfE9fTkRFTEFZKSk7IC8qIFJlb3BlbiB0aGUgZGV2aWNlICovCisJZGVidWcoRjExMSwidHRoYW5nIEhVUF9DTE9TRV9QT1NJWCByZW9wZW4iLHR0bm1zdix0dHlmZCk7CisJaWYgKHR0eWZkIDwgMCkgeworCSAgICBkZWJ1ZyhGMTAxLCJ0dGhhbmcgSFVQX0NMT1NFX1BPU0lYIHJlb3BlbiBlcnJubyIsIiIsZXJybm8pOworCSAgICByZXR1cm4oLTEpOworCX0KKwlkZWJ1ZyhGMTAxLCJ0dGhhbmcgSFVQX0NMT1NFX1BPU0lYIHJlLXR0b3BlbiB0dHlmZCIsIiIsdHR5ZmQpOworCisJLyogUmVzdG9yZSBwcmV2aW91cyBhdHRyaWJ1dGVzICovCisKKwllcnJubyA9IDA7CisJdHZ0ZmxnID0gMDsKKwl0dGN1ci5jX2NmbGFnIHw9IENMT0NBTDsKKwl4ID0gdGNzZXRhdHRyKHR0eWZkLFRDU0FEUkFJTiwmdHRjdXIpOworCWRlYnVnKEYxMDEsInR0aGFuZyBIVVBfQ0xPU0VfUE9TSVggdGNzZXRhdHRyIHJlc3RvcmUiLCIiLHgpOworCWlmICh4IDwgMCkgeworCSAgICBkZWJ1ZyhGMTAxLCJ0dGhhbmcgSFVQX0NMT1NFX1BPU0lYIHRjc2V0YXR0ciByZXN0b3JlIGVycm5vIiwKKwkJICAiIixlcnJubyk7CisJICAgIHJldHVybigtMSk7CisJfQorCS8qIEZpeCBmbGFncyAtIGVuc3VyZSBPX05ERUxBWSBhbmQgT19OT05CTE9DSyBhcmUgb2ZmICovCisKKwllcnJubyA9IDA7CisgICAgICAgIGlmICgoeCA9IGZjbnRsKHR0eWZkLCBGX0dFVEZMLCAwKSkgPT0gLTEpIHsKKwkgICAgZGVidWcoRjEwMSwidHRoYW5nIEhVUF9DTE9TRV9QT1NJWCBGX0dFVEZMIGVycm5vIiwiIixlcnJubyk7CisJICAgIHJldHVybigtMSk7CisJfQorCWRlYnVnKEYxMDEsInR0aGFuZyBIVVBfQ0xPU0VfUE9TSVggZmxhZ3MiLCIiLHgpOworCWVycm5vID0gMDsKKyAgICAgICAgeCAmPSB+KE9fTk9OQkxPQ0t8T19OREVMQVkpOworCWRlYnVnKEYxMDEsInR0aGFuZyBIVVBfQ0xPU0VfUE9TSVggZmxhZ3MgdG8gc2V0IiwiIix4KTsKKwlkZWJ1ZyhGMTAxLCJ0dGhhbmcgSFVQX0NMT1NFX1BPU0lYIGluaWZsYWdzIiwiIixpbmlmbGFncyk7CisJaWYgKGZjbnRsKHR0eWZkLCBGX1NFVEZMLCB4KSA9PSAtMSkgeworCSAgICBkZWJ1ZyhGMTAxLCJ0dGhhbmcgSFVQX0NMT1NFX1BPU0lYIEZfU0VURkwgZXJybm8iLCIiLGVycm5vKTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisjaWZkZWYgREVCVUcKKwlpZiAoZGVibG9nKSB7CisJICAgIGlmICgoeCA9IGZjbnRsKHR0eWZkLCBGX0dFVEZMLCAwKSkgPiAtMSkgeworCQlkZWJ1ZyhGMTAxLCJ0dGhhbmcgSFVQX0NMT1NFX1BPU0lYIGZsYWdzIiwiIix4KTsKKwkJZGVidWcoRjEwMSwidHRoYW5nIEhVUF9DTE9TRV9QT1NJWCBmbGFncyAmIE9fTk9OQkxPQ0siLAorCQkgICAgICAiIix4Jk9fTk9OQkxPQ0spOworCQlkZWJ1ZyhGMTAxLCJ0dGhhbmcgSFVQX0NMT1NFX1BPU0lYIGZsYWdzICYgT19OREVMQVkiLAorCQkgICAgICAiIix4Jk9fTkRFTEFZKTsKKwkgICAgfQorCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisjZWxzZSAgLyogSFVQX0NMT1NFX1BPU0lYICovCisJCisJLyogR2VuZXJhbCBCU0Q0NE9SUE9TSVggY2FzZSAoTGludXgsIEJTREksIEZyZWVCU0QsIGV0YykgKi8KKworCWRlYnVnKEYxMDAsInR0aGFuZyBCU0Q0NE9SUE9TSVggQjAiLCIiLDApOworCXggPSB0Y2dldGF0dHIodHR5ZmQsICZ0dGN1cik7CS8qIEdldCBjdXJyZW50IGF0dHJpYnV0ZXMgKi8KKwlkZWJ1ZyhGMTExLCJ0dGhhbmcgQlNENDRPUlBPU0lYIHRjZ2V0YXR0ciIsY2tpdG9hKGVycm5vKSx4KTsKKwlpZiAoeCA8IDApIHJldHVybigtMSk7CisJc3Bkc2F2ID0gY2ZnZXRvc3BlZWQoJnR0Y3VyKTsJLyogR2V0IGN1cnJlbnQgc3BlZWQgKi8KKwlkZWJ1ZyhGMTExLCJ0dGhhbmcgQlNENDRPUlBPU0lYIGNmZ2V0b3NwZWVkIixja2l0b2EoZXJybm8pLHNwZHNhdik7CisJc3Bkc2F2aSA9IGNmZ2V0aXNwZWVkKCZ0dGN1cik7CS8qIEdldCBjdXJyZW50IHNwZWVkICovCisJZGVidWcoRjExMSwidHRoYW5nIEJTRDQ0T1JQT1NJWCBjZmdldGlzcGVlZCIsY2tpdG9hKGVycm5vKSxzcGRzYXZpKTsKKwl4ID0gY2ZzZXRvc3BlZWQoJnR0Y3VyLEIwKTsJLyogUmVwbGFjZSBieSAwICovCisJZGVidWcoRjExMSwidHRoYW5nIEJTRDQ0T1JQT1NJWCBjZnNldG9zcGVlZCIsY2tpdG9hKGVycm5vKSx4KTsKKwlpZiAoeCA8IDApIHJldHVybigtMSk7CisJeCA9IGNmc2V0aXNwZWVkKCZ0dGN1cixCMCk7CisJZGVidWcoRjExMSwidHRoYW5nIEJTRDQ0T1JQT1NJWCBjZnNldGlzcGVlZCIsY2tpdG9hKGVycm5vKSx4KTsKKwlpZiAoeCA8IDApIHJldHVybigtMSk7CisJLyogVGhpcyBnZXRzIEVJTlZBTCBvbiBOZXRCU0QgMS40LjEgYmVjYXVzZSBvZiBCMC4uLiAqLworCXggPSB0Y3NldGF0dHIodHR5ZmQsVENTQURSQUlOLCZ0dGN1cik7CisJZGVidWcoRjExMSwidHRoYW5nIEJTRDQ0T1JQT1NJWCB0Y3NldGF0dHIgQjAiLGNraXRvYShlcnJubykseCk7CisJaWYgKHggPCAwKSByZXR1cm4oLTEpOworCW1zbGVlcChIVVBUSU1FKTsJCS8qIFNsZWVwIDAuNSBzZWMgKi8KKwlkZWJ1ZyhGMTAxLCJ0dGhhbmcgQlNENDRPUlBPU0lYIHJlc3RvcmUgb3V0cHV0IHNwZWVkIiwiIixzcGRzYXYpOworCXggPSBjZnNldG9zcGVlZCgmdHRjdXIsc3Bkc2F2KTsgLyogUmVzdG9yZSBwcmV2IHNwZWVkICovCisJZGVidWcoRjExMSwidHRoYW5nIEJTRDQ0T1JQT1NJWCBjZnNldG9zcGVlZCBwcmV2Iixja2l0b2EoZXJybm8pLHgpOworCWlmICh4IDwgMCkgcmV0dXJuKC0xKTsKKwlkZWJ1ZyhGMTAxLCJ0dGhhbmcgQlNENDRPUlBPU0lYIHJlc3RvcmUgaW5wdXQgc3BlZWQiLCIiLHNwZHNhdmkpOworCXggPSBjZnNldGlzcGVlZCgmdHRjdXIsc3Bkc2F2aSk7CisJZGVidWcoRjExMSwidHRoYW5nIEJTRDQ0T1JQT1NJWCBjZnNldGlzcGVlZCBwcmV2Iixja2l0b2EoZXJybm8pLHgpOworCWlmICh4IDwgMCkgcmV0dXJuKC0xKTsKKwl0dGN1ci5jX2NmbGFnIHw9IENMT0NBTDsJLyogRG9uJ3QgZXhwZWN0IENEIGFmdGVyIGhhbmd1cCAqLworCXggPSB0Y3NldGF0dHIodHR5ZmQsVENTQURSQUlOLCZ0dGN1cik7CisJZGVidWcoRjExMSwidHRoYW5nIEJTRDQ0T1JQT1NJWCB0Y3NldGF0dHIgcmVzdG9yZSIsY2tpdG9hKGVycm5vKSx4KTsKKwlpZiAoeCA8IDApIHJldHVybigtMSk7CisKKyNlbmRpZiAvKiBIVVBfQ0xPU0VfUE9TSVggKi8KKyNlbmRpZiAvKiBVU0VfVElPQ1NEVFIgKi8KKworCXJldHVybigxKTsKKyAgICB9CisKKyNlbmRpZiAvKiBRTlggKi8KKyNlbHNlIC8qIEJTRDQ0T1JQT1NJWCAqLworCisjaWZkZWYgYWVnaXMJCQkJLyogQXBvbGxvIEFlZ2lzICovCisgICAgc2lvXyRjb250cm9sKChzaG9ydCl0dHlmZCwgc2lvXyRkdHIsIGZhbHNlLCBzdCk7ICAgIC8qIERUUiBkb3duICovCisgICAgbXNsZWVwKEhVUFRJTUUpOwkJCQkJLyogcGF1c2UgKi8KKyAgICBzaW9fJGNvbnRyb2woKHNob3J0KXR0eWZkLCBzaW9fJGR0ciwgdHJ1ZSwgIHN0KTsgICAgLyogRFRSIHVwICovCisgICAgcmV0dXJuKDEpOworI2VuZGlmIC8qIGFlZ2lzICovCisKKyNpZmRlZiBBTllCU0QJCQkJLyogQW55IEJTRCB2ZXJzaW9uLiAqLworI2lmZGVmIFRJT0NDRFRSCQkJCS8qIEV4Y2VwdCB0aG9zZSB0aGF0IGRvbid0IGhhdmUgdGhpcyAqLworICAgIGRlYnVnKEYxMDAsInR0aGFuZyBCU0Qgc3R5bGUiLCIiLDApOworICAgIGlmIChpb2N0bCh0dHlmZCxUSU9DQ0RUUiwwKSA8IDApIHsJLyogQ2xlYXIgRFRSLiAqLworCWRlYnVnKEYxMDEsInR0aGFuZyBUSU9DQ0RUUiBmYWlscyIsIiIsZXJybm8pOworCXJldHVybigtMSk7CisgICAgfQorICAgIG1zbGVlcChIVVBUSU1FKTsJCQkvKiBGb3IgYWJvdXQgMS8yIHNlYyAqLworICAgIGVycm5vID0gMDsKKyAgICB4ID0gaW9jdGwodHR5ZmQsVElPQ1NEVFIsMCk7CS8qIFJlc3RvcmUgRFRSICovCisgICAgaWYgKHggPCAwKSB7CisJLyoKKwkgIEZvciBzb21lIHJlYXNvbiwgdGhpcyB0ZW5kcyB0byBmYWlsIHdpdGggIm5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MiCisJICBidXQgdGhlIG9wZXJhdGlvbiBzdGlsbCB3b3JrcywgcHJvYmFibHkgYmVjYXVzZSBvZiB0aGUgY2xvc2Uvb3BlbgorCSAgbGF0ZXIgb24uICBTbyBsZXQncyBub3Qgc2NhcmUgdGhlIHVzZXIgdW5uZWNlc3NhcmlseSBoZXJlLgorCSovCisJZGVidWcoRjEwMSwidHRoYW5nIFRJT0NTRFRSIGVycm5vIiwiIixlcnJubyk7IC8qIExvZyB0aGUgZXJyb3IgKi8KKwl4ID0gMTsJCQkJLyogUHJldGVuZCB3ZSBzdWNjZWVkZWQgKi8KKyAgICB9IGVsc2UgaWYgKHggPT0gMCkgeCA9IDE7CQkvKiBTdWNjZXNzICovCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIEZUMjEKKyAgICBpb2N0bCh0dHlmZCwgVElPQ1NBVkVNT0RFUywgMCk7CisgICAgaW9jdGwodHR5ZmQsIFRJT0NIUENMLCAwKTsKKyAgICBjbG9zZSh0dHlmZCk7CQkJLyogWWVzLCBtdXN0IGRvIHRoaXMgdHdpY2UgKi8KKyAgICBpZiAoKHR0eWZkID0gb3Blbih0dG5tc3YsMikpIDwgMCkJLyogb24gRm9ydHVuZSBjb21wdXRlcnMuLi4gKi8KKyAgICAgIHJldHVybigtMSk7CQkJLyogKGJ1dCB3aHk/KSAqLworICAgIGVsc2UgeCA9IDE7CisjZW5kaWYgLyogRlQyMSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBUSU9DQ0RUUiAqLworICAgIGNsb3NlKGRvX29wZW4odHRubXN2KSk7CQkvKiBDbGVhciBpL28gZXJyb3IgY29uZGl0aW9uICovCisgICAgZXJybm8gPSAwOworI2lmZGVmIENPTU1FTlQKKy8qIFRoaXMgaXMgZGVmaW5pdGVseSBkYW5nZXJvdXMuICBXaHkgd2FzIGl0IGhlcmU/ICovCisgICAgeiA9IHR0dnQodHRzcGVlZCx0dGZsb3cpOwkJLyogUmVzdG9yZSBtb2Rlcy4gKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dGhhbmcgdHR2dCByZXR1cm5zIiwiIix6KTsKKyAgICByZXR1cm4oeiA8IDAgPyAtMSA6IDEpOworI2Vsc2UKKyAgICByZXR1cm4oeCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIEFOWUJTRCAqLworCisjaWZkZWYgQVRUU1YKKy8qIEFUJlQgVU5JWCBzZWN0aW9uLCBpbmNsdWRlcyBIUC1VWCBhbmQgZ2VuZXJpYyBBVCZUIFN5c3RlbSBJSUkvVi4uLiAqLworCisjaWZkZWYgSFBVWAorLyogSGV3bGV0dCBQYWNrYXJkIGFsbG93cyBleHBsaWNpdCBtYW5pcHVsYXRpb24gb2YgbW9kZW0gc2lnbmFscy4gKi8KKworI2lmZGVmIENPTU1FTlQKKy8qIE9sZCB3YXkuLi4gKi8KKyAgICBkZWJ1ZyhGMTAwLCJ0dGhhbmcgSFAtVVggc3R5bGUiLCIiLDApOworICAgIGlmIChpb2N0bCh0dHlmZCxNQ1NFVEFGLCZkdHJfZG93bikgPCAwKSAgICAgICAgLyogbG93ZXIgRFRSICovCisgICAgICByZXR1cm4oLTEpOwkJICAgIAkgICAgICAgICAgIC8qIG9vcHMsIGNhbid0LiAqLworICAgIG1zbGVlcChIVVBUSU1FKTsJCQkgICAgICAgICAgIC8qIFBhdXNlIGhhbGYgYSBzZWNvbmQuICovCisgICAgeCA9IDE7CQkJCSAgICAgICAgICAgLyogU2V0IHJldHVybiBjb2RlICovCisgICAgaWYgKGlvY3RsKHR0eWZkLE1DR0VUQSwmbW9kZW1fcnRuKSA+IC0xKSB7ICAgICAvKiBHZXQgbGluZSBzdGF0dXMuICovCisJaWYgKChtb2RlbV9ydG4gJiBNRENEKSAhPSAwKSAgICAgIAkgICAvKiBDaGVjayBpZiBDRCBpcyBsb3cuICovCisJICB4ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENEIGRpZG4ndCBkcm9wLCBmYWlsLiAqLworICAgIH0gZWxzZSB4ID0gLTE7CisKKyAgICAvKiBFdmVuIGlmIGFib3ZlIGNhbGxzIGZhaWwsIFJUUyAmIERUUiBzaG91bGQgYmUgdHVybmVkIGJhY2sgb24uICovCisgICAgbW9kZW1fcnRuID0gTVJUUyB8IE1EVFI7CisgICAgaWYgKGlvY3RsKHR0eWZkLE1DU0VUQUYsJm1vZGVtX3J0bikgPCAwKSB4ID0gLTE7CisgICAgcmV0dXJuKHgpOworI2Vsc2UKKy8qIE5ldyB3YXksIGZyb20gSGVsbG11dGggTWljaGFlbGlzICovCisgICAgZGVidWcoRjEwMCwidHRoYW5nIEhQLVVYIHN0eWxlLCBIUFVYREVCVUciLCIiLDApOworICAgIGlmIChpb2N0bCh0dHlmZCxNQ0dFVEEsJm1vZGVtX3J0bikgPT0gLTEpIHsgLyogR2V0IGN1cnJlbnQgc3RhdHVzLiAqLworCWRlYnVnKEYxMDAsInR0aGFuZyBIUC1VWDogY2FuJ3QgZ2V0IG1vZGVtIGxpbmVzLCBOTyBIQU5HVVAhIiwiIiwwKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICBzcHJpbnRmKG1vZGVtX3N0YXRlLCIlI2x4Iixtb2RlbV9ydG4pOworICAgIGRlYnVnKEYxMTAsInR0aGFuZyBIUC1VWDogbW9kZW0gbGluZXMgPSAiLG1vZGVtX3N0YXRlLDApOworICAgIG1vZGVtX3NhdiA9IG1vZGVtX3J0bjsJCS8qIFNhdmUgY3VycmVudCBtb2RlbSBzaWduYWxzICovCisgICAgbW9kZW1fcnRuICY9IH5NRFRSOwkJCS8qIFR1cm4gRFRSIGJpdCBvZmYgKi8KKyAgICBzcHJpbnRmKG1vZGVtX3N0YXRlLCIlI2x4Iixtb2RlbV9ydG4pOworICAgIGRlYnVnKEYxMTAsInR0aGFuZyBIUC1VWDogRFRSIGRvd24gPSAiLG1vZGVtX3N0YXRlLDApOworICAgIGlmIChpb2N0bCh0dHlmZCxNQ1NFVEFGLCZtb2RlbV9ydG4pIDwgMCkgeyAvKiBsb3dlciBEVFIgKi8KKwlkZWJ1ZyhGMTAwLCJ0dGhhbmcgSFAtVVg6IGNhbid0IGxvd2VyIERUUiEiLCIiLDApOworCXJldHVybigtMSk7CQkJLyogb29wcywgY2FuJ3QuICovCisgICAgfQorICAgIG1zbGVlcChIVVBUSU1FKTsJCQkvKiBQYXVzZSBoYWxmIGEgc2Vjb25kLiAqLworICAgIHggPSAxOwkJCQkvKiBTZXQgcmV0dXJuIGNvZGUgKi8KKyAgICBpZiAoaW9jdGwodHR5ZmQsTUNHRVRBLCZtb2RlbV9ydG4pID4gLTEpIHsgLyogR2V0IGxpbmUgc3RhdHVzLiAqLworCXNwcmludGYobW9kZW1fc3RhdGUsIiUjbHgiLG1vZGVtX3J0bik7CisJZGVidWcoRjExMCwidHRoYW5nIEhQLVVYOiBtb2RlbSBsaW5lcyBnb3QgPSAiLG1vZGVtX3N0YXRlLDApOworCWlmICgobW9kZW1fcnRuICYgTURDRCkgIT0gMCkgewkvKiBDaGVjayBpZiBDRCBpcyBsb3cuICovCisJICAgIGRlYnVnKEYxMDAsInR0aGFuZyBIUC1VWDogRENEIG5vdCBkb3duIiwiIiwwKTsKKwkgICAgeCA9IC0xOwkJCS8qIENEIGRpZG4ndCBkcm9wLCBmYWlsLiAqLworCX0gZWxzZSB7CisJICAgIGRlYnVnKEYxMDAsInR0aGFuZyBIUC1VWDogRENEIGRvd24iLCIiLDApOworCX0KKyAgICB9IGVsc2UgeworCXggPSAtMTsKKwlkZWJ1ZyhGMTAwLCJ0dGhhbmcgSFAtVVg6IGNhbid0IGdldCBEQ0Qgc3RhdHVzICEiLCIiLDApOworICAgIH0KKworICAgIC8qIEV2ZW4gaWYgYWJvdmUgY2FsbHMgZmFpbCwgRFRSIHNob3VsZCBiZSB0dXJuZWQgYmFjayBvbi4gKi8KKworICAgIG1vZGVtX3NhdiB8PSBNRFRSOworICAgIGlmIChpb2N0bCh0dHlmZCxNQ1NFVEFGLCZtb2RlbV9zYXYpIDwgMCkgeworCXggPSAtMTsKKwlkZWJ1ZyhGMTAwLCJ0dGhhbmcgSFAtVVg6IGNhbid0IHNldCBzYXZlZCBzdGF0ZSIsIiIsMCk7CisgICAgfSBlbHNlIHsKKwlzcHJpbnRmKG1vZGVtX3N0YXRlLCIlI2x4Iixtb2RlbV9zYXYpOworCWRlYnVnKEYxMTAsInR0aGFuZyBIUC1VWDogZmluYWwgbW9kZW0gbGluZXMgPSAiLG1vZGVtX3N0YXRlLDApOworICAgIH0KKyAgICByZXR1cm4oeCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjZWxzZSAvKiBBVCZUIGJ1dCBub3QgSFAtVVggKi8KKworLyogU1ZJRCBmb3IgQVQmVCBTeXN0ZW0gViBSMyBkZWZpbmVzIGlvY3RsJ3MgZm9yIGhhbmRsaW5nIG1vZGVtIHNpZ25hbHMuICovCisvKiBJdCBpcyBub3Qga25vd24gaG93IG1hbnksIGlmIGFueSwgc3lzdGVtcyBhY3R1YWxseSBpbXBsZW1lbnQgdGhlbSwgKi8KKy8qIHNvIHdlIGluY2x1ZGUgdGhlbSBoZXJlIGluIGlmZGVmJ3MuICovCisKKy8qCisgIFVuaXh3YXJlIGhhcyB0aGUgVElPQ014eHggc3ltYm9scyBkZWZpbmVkLCBidXQgY2FsbGluZyBpb2N0bCgpIHdpdGggdGhlbQorICBnaXZlcyBlcnJvciAyMiAoaW52YWxpZCBhcmd1bWVudCkuCisqLworI2lmbmRlZiBfSUJNUjIKKy8qCisgIE5vIG1vZGVtLXNpZ25hbCB0d2lkZGxpbmcgZm9yIElCTSBSVCBQQyBvciBSUy82MDAwLgorICBJbiBBSVggMy4xIGFuZCBlYXJsaWVyLCB0aGUgaW9jdGwoKSBjYWxsIGlzIGJyb2tlbi4KKyAgVGhpcyBjb2RlIGNvdWxkIGJlIGFjdGl2YXRlZCBmb3IgQUlYIDMuMSB3aXRoIFBURiAyMDA2IG9yIGxhdGVyCisgIChlLmcuIEFJWCAzLjIpLCBidXQgY2xvc2Uvb3BlbiBkb2VzIHRoZSBqb2IgdG9vLCBzbyB3aHkgYm90aGVyLgorKi8KKyNpZmRlZiBUSU9DTUJJUwkJCQkvKiBCaXQgU2V0ICovCisjaWZkZWYgVElPQ01CSUMJCQkJLyogQml0IENsZWFyICovCisjaWZkZWYgVElPQ01fRFRSCQkJLyogRFRSICovCisKKy8qIENsZWFyIERUUiwgc2xlZXAgMzAwIG1zZWMsIHR1cm4gaXQgYmFjayBvbi4gKi8KKy8qIElmIGFueSBvZiB0aGUgaW9jdGwncyByZXR1cm4gZmFpbHVyZSwgZ28gb24gdG8gdGhlIG5leHQgc2VjdGlvbi4gKi8KKworICAgIHogPSBUSU9DTV9EVFI7CQkJLyogQ29kZSBmb3IgRFRSLiAqLworI2lmZGVmIENPTU1FTlQKKy8qCisgIFRoaXMgd2FzIHRoZSBjYXVzZSBvZiB0aGUgdHJvdWJsZXMgd2l0aCB0aGUgU29sYXJpcyBQb3J0IE1vbml0b3IuCisgIFRoZSBwcm9ibGVtIGlzOiBSVFMgbmV2ZXIgY29tZXMgYmFjayBvbi4gIE1vcmFsOiBEb24ndCBkbyBpdCEKKyAgKEJ1dCB3aHkgZG9lc24ndCBpdCBjb21lIGJhY2sgb24/ICBTZWUgdGhlIFRJT0NNQklTIGNhbGwuLi4pCisqLworI2lmZGVmIFRJT0NNX1JUUwkJCS8qIExvd2VyIFJUUyB0b28gaWYgc3ltYm9sIGlzIGtub3duLiAqLworICAgIHogfD0gVElPQ01fUlRTOworI2VuZGlmIC8qIFRJT0NNX1JUUyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIGRlYnVnKEYxMDEsInR0aGFuZyBUSU9DTSBzaWduYWwgbWFzayIsIiIseik7CisgICAgaWYgKGlvY3RsKHR0eWZkLFRJT0NNQklDLCZ6KSA+IC0xKSB7ICAgLyogVHJ5IHRvIGxvd2VyIERUUi4gKi8KKwlkZWJ1ZyhGMTAwLCJ0dGhhbmcgVElPQ01CSUMgb2siLCIiLDApOworCW1zbGVlcChIVVBUSU1FKTsJCSAgIC8qIFBhdXNlIGhhbGYgYSBzZWNvbmQuICovCisJaWYgKGlvY3RsKHR0eWZkLFRJT0NNQklTLCZ6KSA+IC0xKSB7IC8qIFRyeSB0byB0dXJuIGl0IGJhY2sgb24uICovCisJICAgIGRlYnVnKEYxMDAsInR0aGFuZyBUSU9DTUJJUyBvayIsIiIsMCk7CisjaWZuZGVmIENMU09QTgorCSAgICByZXR1cm4oMSk7CQkJLyogU3VjY2VzcywgZG9uZS4gKi8KKyNlbmRpZiAvKiBDTFNPUE4gKi8KKwl9IGVsc2UgewkJCS8qIENvdWxkbid0IHJhaXNlLCBjb250aW51ZS4gKi8KKwkgICAgZGVidWcoRjEwMSwidHRoYW5nIFRJT0NNQklTIGVycm5vIiwiIixlcnJubyk7CisJfQorICAgIH0gZWxzZSB7CQkJCS8qIENvdWxkbid0IGxvd2VyLCBjb250aW51ZS4gKi8KKyAJZGVidWcoRjEwMSwidHRoYW5nIFRJT0NNQklDIGVycm5vIiwiIixlcnJubyk7CisgICAgfQorI2VuZGlmIC8qIFRJT0NNX0RUUiAqLworI2VuZGlmIC8qIFRJT0NNQklDICovCisjZW5kaWYgLyogVElPQ01CSVMgKi8KKyNlbmRpZiAvKiBfSUJNUjIgKi8KKworLyoKKyAgR2VuZXJhbCBBVCZUIFVOSVggY2FzZSwgbm90IEhQVVguICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgaGlnaGx5IHN1c3BlY3QuICBObworICB0d28gQVQmVC1iYXNlZCBzeXN0ZW1zIHNlZW0gdG8gZG8gdGhpcyB0aGUgc2FtZSB3YXkuICBUaGUgb2JqZWN0IGlzIHNpbXBseQorICB0byB0dXJuIG9mZiBEVFIgYW5kIHRoZW4gdHVybiBpdCBiYWNrIG9uLiAgU1ZJRCBzYXlzIHRoZSB1bml2ZXJzYWwgbWV0aG9kCisgIGZvciB0dXJuaW5nIG9mZiBEVFIgaXMgdG8gc2V0IHRoZSBzcGVlZCB0byB6ZXJvLCBhbmQgdGhpcyBkb2VzIHNlZW0gdG8gZG8KKyAgdGhlIHRyaWNrIGluIGFsbCBjYXNlcy4gIEJ1dCBuZWl0aGVyIFNWSUQgbm9yIGFueSBrbm93biBtYW4gcGFnZXMgc2F5IGhvdyB0bworICB0dXJuIERUUiBiYWNrIG9uIGFnYWluLiAgU29tZSB2YXJpYW50cywgbGlrZSBtb3N0IFhlbml4IGltcGxlbWVudGF0aW9ucywKKyAgcmFpc2UgRFRSIGFnYWluIHdoZW4gdGhlIHNwZWVkIGlzIHJlc3RvcmVkIHRvIGEgbm9uemVybyB2YWx1ZS4gIE90aGVycworICByZXF1aXJlIHRoZSBkZXZpY2UgdG8gYmUgY2xvc2VkIGFuZCBvcGVuZWQgYWdhaW4sIGJ1dCB0aGlzIGlzIHJpc2t5IGJlY2F1c2UKKyAgZ2V0dHkgY291bGQgc2VpemUgdGhlIGRldmljZSBkdXJpbmcgdGhlIGluc3RhbnQgaXQgaXMgY2xvc2VkLgorKi8KKworLyogUmV0dXJuIGNvZGUgZm9yIGlvY3RsIGZhaWx1cmVzLi4uICovCisjaWZkZWYgQVRUNjMwMAorICAgIHggPSAxOwkJCQkvKiBBVFQ2MzAwIGRvZXNuJ3Qgd2FudCB0byBmYWlsLi4uICovCisjZWxzZQorICAgIHggPSAtMTsKKyNlbmRpZiAvKiBBVFQ2MzAwICovCisKKyAgICBkZWJ1ZyhGMTAwLCJ0dGhhbmcgZ2V0IHNldHRpbmdzIiwiIiwwKTsKKyAgICBpZiAoaW9jdGwodHR5ZmQsVENHRVRBLCZ0dGN1cikgPCAwKSAvKiBHZXQgY3VycmVudCBzZXR0aW5ncy4gKi8KKyAgICAgIHJldHVybih4KTsJCQkvKiBGYWlsIGlmIHRoaXMgZG9lc24ndCB3b3JrLiAqLworICAgIGlmICgoZmxhZ3MgPSBmY250bCh0dHlmZCxGX0dFVEZMLDApKSA8IDApIC8qIEdldCBkZXZpY2UgZmxhZ3MuICovCisgICAgICByZXR1cm4oeCk7CisgICAgdHRjX3NhdmUgPSB0dGN1ci5jX2NmbGFnOwkJLyogUmVtZW1iZXIgY3VycmVudCBzcGVlZC4gKi8KKyAgICBzcGRzYXYgPSB0dGNfc2F2ZSAmIENCQVVEOworICAgIGRlYnVnKEYxMDEsInR0aGFuZyBzcGVlZCIsIiIsc3Bkc2F2KTsKKworI2lmZGVmIE9fTkRFTEFZCisgICAgZGVidWcoRjEwMCwidHRoYW5nIHR1cm5pbmcgT19OREVMQVkgb24iLCIiLDApOworICAgIGZjbnRsKHR0eWZkLCBGX1NFVEZMLCBmbGFncyB8IE9fTkRFTEFZKTsgLyogQWN0aXZhdGUgT19OREVMQVkgKi8KKyNlbmRpZiAvKiBPX05ERUxBWSAqLworCisjaWZkZWYgQVRUNzMwMCAvKiBUaGlzIGlzIHRoZSB3YXkgaXQgaXMgU1VQUE9TRUQgdG8gd29yayAqLworICAgIHR0Y3VyLmNfY2ZsYWcgJj0gfkNCQVVEOwkJLyogQ2hhbmdlIHRoZSBzcGVlZCB0byB6ZXJvLiAgKi8KKyNlbHNlCisjaWZkZWYgUlRBSVgKKyAgICB0dGN1ci5jX2NmbGFnICY9IH5DQkFVRDsJCS8qIENoYW5nZSB0aGUgc3BlZWQgdG8gemVyby4gICovCisjZWxzZSAgICAgICAgICAvKiBUaGlzIHdheSByZWFsbHkgd29ya3MgYnV0IG1heSBiZSBkYW5nZXJvdXMgKi8KKyNpZmRlZiB1M2IyCisgICAgdHRjdXIuY19jZmxhZyA9IH4oQ0JBVUR8Q0xPQ0FMKTsJLyogU3BlY2lhbCBmb3IgQVQmVCAzQjJzICovCisJCQkJCS8qIChDTE9DQUwgbXVzdCBiZSBPRkYpICovCisjZWxzZQorI2lmZGVmIFNDTzNSMgkJCQkvKiBTQ08gVU5JWCAzLjIgKi8KKy8qCisgIFRoaXMgaXMgY29tcGxldGUgbm9uc2Vuc2UsIGJ1dCBhbiBTQ08gdXNlciBjbGFpbWVkIHRoaXMgY2hhbmdlIG1hZGUKKyAgaGFuZ2luZyB1cCB3b3JrLiAgQ29tbWVudHMgZnJvbSBvdGhlciBTQ08gVU5JWCAzLjIgdXNlcnMgd291bGQgYmUKKyAgYXBwcmVjaWF0ZWQuCisqLworICAgIHR0Y3VyLmNfY2ZsYWcgPSBDQkFVRHxCMDsKKyNlbHNlCisjaWZkZWYgQUlYUlMJCQkJLyogQUlYIG9uIFJTLzYwMDAgKi8KKy8qCisgIENhbid0IHNldCBzcGVlZCB0byB6ZXJvIG9uIEFJWCAzLjEgb24gUlMvNjAwMCA2NC1wb3J0IGFkYXB0ZXIsCisgIGV2ZW4gdGhvdWdoIHlvdSBjYW4gZG8gaXQgb24gdGhlIGJ1aWx0LWluIHBvcnQgYW5kIHRoZSA4LSBhbmQgMTYtcG9ydAorICBhZGFwdGVycy4gIChVbnRlc3RlZCBvbiAxMjgtcG9ydCBhZGFwdGVyLikKKyovCisgICAgdHRjdXIuY19jZmxhZyA9IENMT0NBTHxIVVBDTHxzcGRzYXY7IC8qIFNwZWVkIDAgY2F1c2VzIEVJTlZBTCAqLworI2Vsc2UJCQkJCS8qIE5vbmUgb2YgdGhlIGFib3ZlICovCisvKgorICBTZXQgZXZlcnl0aGluZywgaW5jbHVkaW5nIHRoZSBzcGVlZCwgdG8gemVybywgZXhjZXB0IGZvciB0aGUgQ0xPQ0FMCisgIGFuZCBIVVBDTCBiaXRzLgorKi8KKyAgICB0dGN1ci5jX2NmbGFnID0gQ0xPQ0FMfEhVUENMOworI2VuZGlmIC8qIEFJWFJTICovCisjZW5kaWYgLyogU0NPM1IyICovCisjZW5kaWYgLyogdTNiMiAqLworI2VuZGlmIC8qIFJUQUlYICovCisjZW5kaWYgLyogQVRUNzMwMCAqLworCisjaWZkZWYgQ09NTUVOVAorICAgIC8qIGFuZCBpZiBub25lIG9mIHRob3NlIHdvcmssIHRyeSBvbmUgb2YgdGhlc2UuLi4gKi8KKyAgICB0dGN1ci5jX2NmbGFnID0gMDsKKyAgICB0dGN1ci5jX2NmbGFnID0gQ0xPQ0FMOworICAgIHR0Y3VyLmNfY2ZsYWcgJj0gfihDQkFVRHxIVVBDTCk7CisgICAgdHRjdXIuY19jZmxhZyAmPSB+KENCQVVEfENSRUFEKTsKKyAgICB0dGN1ci5jX2NmbGFnICY9IH4oQ0JBVUR8Q1JFQUR8SFVQQ0wpOworICAgIC8qIG9yIG90aGVyIGNvbWJpbmF0aW9ucyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIFRDWE9OQworICAgIGRlYnVnKEYxMDAsInR0aGFuZyBUQ1hPTkMiLCIiLDApOworICAgIGlmIChpb2N0bCh0dHlmZCwgVENYT05DLCAxKSA8IDApIHsKKwlkZWJ1ZyhGMTAxLCJ0dGhhbmcgVENYT05DIGZhaWxlZCIsIiIsZXJybm8pOworICAgIH0KKyNlbmRpZiAvKiBUQ1hPTkMgKi8KKworI2lmZGVmIFRJT0NTVEFSVAorICAgIGRlYnVnKEYxMDAsInR0aGFuZyBUSU9DU1RBUlQiLCIiLDApOworICAgIGlmIChpb2N0bCh0dHlmZCwgVElPQ1NUQVJULCAwKSA8IDApIHsKKwlkZWJ1ZyhGMTAxLCJ0dGhhbmcgVElPQ1NUQVJUIGZhaWxlZCIsIiIsZXJybm8pOworICAgIH0KKyNlbmRpZiAvKiBUSU9DU1RBUlQgKi8KKworICAgIGlmIChpb2N0bCh0dHlmZCxUQ1NFVEFGLCZ0dGN1cikgPCAwKSB7IC8qIEZhaWwgaWYgd2UgY2FuJ3QuICovCisJZGVidWcoRjEwMSwidHRoYW5nIFRDU0VUQUYgZmFpbGVkIiwiIixlcnJubyk7CisJZmNudGwodHR5ZmQsIEZfU0VURkwsIGZsYWdzKTsJLyogUmVzdG9yZSBmbGFncyAqLworCXJldHVybigtMSk7CQkJLyogYmVmb3JlIHJldHVybmluZy4gKi8KKyAgICB9CisgICAgbXNsZWVwKDMwMCk7CQkJLyogR2l2ZSBtb2RlbSB0aW1lIHRvIG5vdGljZS4gKi8KKworI2lmbmRlZiBOT0NPVEZNQworCisvKiBOb3csIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3Qgc2F5IHRoaXMgaW4gU1ZJRCBvciBhbnkgbWFuIHBhZ2UsIHdlIGhhdmUgKi8KKy8qIHRvIGNsb3NlIGFuZCByZW9wZW4gdGhlIGRldmljZS4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgYWxsIHN5c3RlbXMsICovCisvKiBidXQgaXQncyBpbXBvc3NpYmxlIHRvIHByZWRpY3Qgd2hpY2ggb25lcyBuZWVkIGl0IGFuZCB3aGljaCBvbmVzIGRvbid0LiAqLworCisjaWZkZWYgQVRUNzMwMAorLyoKKyAgU3BlY2lhbCBoYW5kbGluZyBmb3IgQVRUIDczMDAgVU5JWCBQQyBhbmQgM0IxLCB3aGljaCBoYXZlICJwaG9uZSIKKyAgcmVsYXRlZCBpb2N0bCdzIGZvciB0aGVpciBpbnRlcm5hbCBtb2RlbXMuICBhdHRtb2RlbSBoYXMgZ2V0dHkgc3RhdHVzIGFuZAorICBtb2RlbS1pbi11c2UgYml0LiAgUmVwb3J0ZWRseSB0aGUgQVRUNzMwMC8zQjEgUElPQ0RJU0MgY2FsbCBpcyBuZWNlc3NhcnksCisgIGJ1dCBhbHNvIHJ1aW5zIHRoZSBmaWxlIGRlc2NyaXB0b3IsIGFuZCBubyBvdGhlciBwaG9uZSg3KSBpb2N0bCBjYWxsIGNhbiBmaXgKKyAgaXQuICBXaGF0ZXZlciBpdCBkb2VzLCBpdCBzZWVtcyB0byBlc2NhcGUgZGV0ZWN0aW9uIHdpdGggUElPQ0dFVEEgYW5kIFRDR0VUQS4KKyAgVGhlIG9ubHkgd2F5IHRvIHVuZG8gdGhlIGRhbWFnZSBpcyB0byBjbG9zZSB0aGUgZmQgYW5kIHRoZW4gcmVvcGVuIGl0LgorKi8KKyAgICBpZiAoYXR0bW9kZW0gJiBJU01PREVNKSB7CisJZGVidWcoRjEwMCwidHRoYW5nIGF0dG1vZGVtIGNsb3NlL29wZW4iLCIiLDApOworCWlvY3RsKHR0eWZkLFBJT0NVTkhPTEQsJmRpYWxlcik7IC8qIFJldHVybiBjYWxsIHRvIGhhbmRzZXQuICovCisJaW9jdGwodHR5ZmQsUElPQ0RJU0MsJmRpYWxlcik7CS8qIERpc2Nvbm5lY3QgcGhvbmUuICovCisJY2xvc2UodHR5ZmQpOwkJCS8qIENsb3NlIGFuZCByZW9wZW4gdGhlIGZkLiAqLworCXR0eWZkID0gcHJpdl9vcG4odHRubXN2LCBPX1JEV1IgfCBPX05ERUxBWSk7CisJYXR0bW9kZW0gJj0gfklTTU9ERU07CQkvKiBQaG9uZSBubyBsb25nZXIgaW4gdXNlLiAqLworICAgIH0KKyNlbHNlIC8qICFBVFQ3MzAwICovCisvKiBJdCBzZWVtcyB3ZSBoYXZlIHRvIGNsb3NlIGFuZCBvcGVuIHRoZSBkZXZpY2UgZm9yIG90aGVyIEFUJlQgc3lzdGVtcyAqLworLyogdG9vLCBhbmQgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuICBUaGUgZm9sbG93aW5nIGNvZGUgZG9lcyB0aGUgKi8KKy8qIGZhbW91cyBjbG9zZShvcGVuKC4uLikpIG1hZ2ljIGJ5IGRlZmF1bHQuICBJZiB0aGF0IGRvZXNuJ3Qgd29yayBmb3IgeW91LCAqLworLyogdGhlbiB0cnkgdW5jb21tZW50aW5nIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IG9yIHB1dHRpbmcgLURDTFNPUE4gaW4gKi8KKy8qIHRoZSBtYWtlZmlsZSBDRkxBR1MuICovCisKKy8qICNkZWZpbmUgQ0xTT1BOICovCisKKyNpZm5kZWYgU0NPMzIgLyogTm90IG5lZWRlZCBieSwgYW5kIGhhcm1mdWwgdG8sIFNDTyBVTklYIDMuMiAvIFhlbml4IDIuMyAqLworCisjaWZkZWYgT19OREVMQVkKKyNkZWZpbmUgT1BFTkZMR1MgT19SRFdSIHwgT19OREVMQVkKKyNlbHNlCisjZGVmaW5lIE9QRU5GTEdTIE9fUkRXUgorI2VuZGlmCisKKyNpZm5kZWYgQ0xTT1BOCisvKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGRlZmF1bHQsIGkuZS4gdW5sZXNzIENMU09QTiBpcyBkZWZpbmVkLiAqLworLyogSXQgaXMgdGhvdWdodCB0byBiZSBzYWZlciBiZWNhdXNlIHRoZXJlIGlzIG5vIHdpbmRvdyB3aGVyZSBnZXR0eSAqLworLyogY2FuIHNlaXplIGNvbnRyb2wgb2YgdGhlIGRldmljZS4gIFRoZSBkcmF3YmFjayBpcyB0aGF0IGl0IG1pZ2h0IG5vdCB3b3JrLiAqLworCisgICAgZGVidWcoRjEwMSwidHRoYW5nIGNsb3NlKG9wZW4oKSksIE9QRU5GTEdTIiwiIixPUEVORkxHUyk7CisgICAgY2xvc2UocHJpdl9vcG4odHRubXN2LCBPUEVORkxHUykpOworCisjZWxzZQorLyogVGhpcyBtZXRob2QgaXMgdXNlZCBpZiB5b3UgI2RlZmluZSBDTFNPUE4uICBJdCBpcyBtb3JlIGxpa2VseSB0byB3b3JrICovCisvKiB0aGFuIHRoZSBwcmV2aW91cyBtZXRob2QsIGJ1dCBpdCdzIGFsc28gbW9yZSBkYW5nZXJvdXMuICovCisKKyAgICBkZWJ1ZyhGMTAxLCJ0dGhhbmcgY2xvc2Uvb3BlbiwgT1BFTkZMR1MiLCIiLE9QRU5GTEdTKTsKKyAgICBjbG9zZSh0dHlmZCk7CisgICAgbXNsZWVwKDEwKTsKKyAgICB0dHlmZCA9IHByaXZfb3BuKHR0bm1zdiwgT1BFTkZMR1MpOwkvKiBPcGVuIGl0IGFnYWluICovCisjZW5kaWYgLyogQ0xTT1BOICovCisjdW5kZWYgT1BFTkZMR1MKKworI2VuZGlmIC8qIFNDTzMyICovCisjZW5kaWYgLyogQVRUNzMwMCAqLworCisjZW5kaWYgLyogTk9DT1RGTUMgKi8KKworLyogTm93IHB1dCBhbGwgZmxhZ3MgJiBtb2RlcyBiYWNrIHRoZSB3YXkgd2UgZm91bmQgdGhlbS4gKi8KKy8qIChEb2VzIHRoZSBvcmRlciBvZiBpb2N0bCAmIGZjbnRsIG1hdHRlciA/ICkgKi8KKworICAgIGRlYnVnKEYxMDAsInR0aGFuZyByZXN0b3JlIHNldHRpbmdzIiwiIiwwKTsKKyAgICB0dGN1ci5jX2NmbGFnID0gdHRjX3NhdmU7CQkvKiBHZXQgb2xkIHNwZWVkIGJhY2suICovCisgICAgaWYgKGlvY3RsKHR0eWZkLFRDU0VUQUYsJnR0Y3VyKSA8IDApIC8qIGlvY3RsIHBhcmFtZXRlcnMuICovCisgICAgICByZXR1cm4oLTEpOworI2lmZGVmIE9fTkRFTEFZCisvKgorICBUaGlzIGlzIHJlcXVpcmVkIGZvciBJQk0gUlQgYW5kIFJTLzYwMDAsIHByb2JhYmx5IGhlbHBzIGVsc2V3aGVyZSB0b28gKD8pLgorICBBZnRlciBjbG9zaW5nIGEgbW9kZW0gbGluZSwgdGhlIG1vZGVtIHdpbGwgcHJvYmFibHkgbm90IGJlIGFzc2VydGluZworICBjYXJyaWVyIGFueSBtb3JlLCBzbyB3ZSBzaG91bGQgbm90IHJlcXVpcmUgY2FycmllciBhbnkgbW9yZS4gIElmIHRoaXMKKyAgY2F1c2VzIHRyb3VibGUgb24gbm9uLUlCTSBVTklYZXMsIGNoYW5nZSB0aGUgI2lmZGVmIHRvIHVzZSBfSUJNUjIgcmF0aGVyCisgIHRoYW4gT19OREVMQVkuCisqLworICAgIGZsYWdzICY9IH5PX05ERUxBWTsJCQkvKiBEb24ndCByZXF1aXJlIGNhcnJpZXIgb24gcmVvcGVuICovCisjZW5kaWYgLyogT19OREVMQVkgKi8KKyAgICBpZiAoZmNudGwodHR5ZmQsRl9TRVRGTCxmbGFncykgPCAwKQkvKiBmY250bCBwYXJhbWV0ZXJzICovCisgICAgICByZXR1cm4oLTEpOworCisgICAgcmV0dXJuKDEpOworI2VuZGlmIC8qIG5vdCBIUFVYICovCisjZW5kaWYgLyogQVRUU1YgKi8KKyNlbmRpZiAvKiBCU0Q0NE9SUE9TSVggKi8KKyNlbmRpZiAvKiBIVVBfUE9TSVggKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCit9CisKKy8qCisgIE1ham9yIGNoYW5nZSBpbiA1QSgxNzQpLiAgV2UgdXNlZCB0byB1c2UgTFBBU1M4LCBpZiBpdCB3YXMgZGVmaW5lZCwgdG8KKyAgYWxsb3cgOC1iaXQgZGF0YSBhbmQgWG9uL1hvZmYgZmxvdyBjb250cm9sIGF0IHRoZSBzYW1lIHRpbWUuICBCdXQgdGhpcworICBMUEFTUzggYnVzaW5lc3Mgc2VlbXMgdG8gaGF2ZSBiZWVuIGNhdXNpbmcgdHJvdWJsZSBmb3IgZXZlcnlib2R5IGJ1dCBtZSEKKyAgRm9yIGV4YW1wbGUsIEFubmV4IHRlcm1pbmFsIHNlcnZlcnMsIGNvbW1vbmx5IHVzZWQgd2l0aCBFbmNvcmUgY29tcHV0ZXJzLAorICBkbyBub3Qgc3VwcG9ydCBMUEFTUzggZXZlbiB0aG91Z2ggdGhlIEVuY29yZSBpdHNlbGYgZG9lcy4gIERpdHRvIGZvciBtYW55CisgIG90aGVyIHRlcm1pbmFsIHNlcnZlcnMsIFRFTE5FVCBjb25uZWN0aW9ucywgcmxvZ2luIGNvbm5lY3Rpb25zLCBldGMgZXRjLgorICBOb3csIHJlcG9ydGVkbHksIGV2ZW4gdmFuaWxsYSA0LjMgQlNEIHN5c3RlbXMgY2FuJ3QgZG8gdGhpcyByaWdodCBvbiB0aGVpcgorICBzZXJpYWwgbGluZXMsIGV2ZW4gdGhvdWdoIExQQVNTOCBpcyBhIGZlYXR1cmUgb2YgNC4zQlNELiAgU28gbGV0J3MgdHVybiBpdAorICBvZmYgZm9yIGV2ZXJ5Ym9keS4gIFRoYXQgbWVhbnMgd2UgZ29lcyBiYWNrIHRvIHVzaW5nIHJhdyBtb2RlLCB3aXRoIG5vCisgIGZsb3cgY29udHJvbC4gIFBob29leS4KKworICBOT1RFOiBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIGZpcnN0IHJlZmVyZW5jZSB0byBMUEFTUzggaW4gdGhpcyBmaWxlLAorICBhbmQgYWZ0ZXIgdGhlIGxhc3QgI2luY2x1ZGUgc3RhdG1lbnQuCisqLworI2lmZGVmIExQQVNTOAorI3VuZGVmIExQQVNTOAorI2VuZGlmIC8qIExQQVNTOCAqLworCisvKiAgVCBUIFIgRSBTICAtLSAgUmVzdG9yZSB0ZXJtaW5hbCB0byAibm9ybWFsIiBtb2RlLiAgKi8KKworLyogc2tlQHBrbWFiLnNlOiBUaGVyZSBhcmUgdHdvIGNob2ljZXMgZm9yIHdoYXQgdGhpcyBmdW5jdGlvbiBzaG91bGQgZG8uCisgKiAoMSkgUmVzdG9yZSB0aGUgdHR5IHRvIGN1cnJlbnQgIm5vcm1hbCIgbW9kZSwgd2l0aCBjYXJyaWVyIHRyZWF0bWVudAorICogYWNjb3JkaW5nIHRvIHR0Y2FyciwgdG8gYmUgdXNlZCBhZnRlciBldmVyeSBrZXJtaXQgY29tbWFuZC4gKDIpIFJlc3RvcmUKKyAqIHRoZSB0dHkgdG8gdGhlIHN0YXRlIGl0IHdhcyBpbiBiZWZvcmUga2VybWl0IG9wZW5lZCBpdC4gVGhlc2UgY2hvaWNlcworICogY29uZmxpY3QsIHNpbmNlIHR0b2xkIGNhbid0IGhvbGQgYm90aCBjaG9pY2VzIG9mIHR0eSBwYXJhbWV0ZXJzLiAgdHRyZXMoKQorICogaXMgY3VycmVudGx5IGJlaW5nIGNhbGxlZCBhcyBpbiBjaG9pY2UgKDEpLCBidXQgdHRvbGQgYmFzaWNhbGx5IGhvbGRzCisgKiB0aGUgaW5pdGlhbCBwYXJhbWV0ZXJzLCBhcyBpbiAoMiksIGFuZCB0aGUgZGVzY3JpcHRpb24gYXQgdGhlIGJlZ2lubmluZworICogb2YgdGhpcyBmaWxlIHNheXMgKDIpLgorICoKKyAqIEkgZG9uJ3QgdGhpbmsgcmVzdG9yaW5nIHR0eSBwYXJhbWV0ZXJzIGFmdGVyIGFsbCBrZXJtaXQgY29tbWFuZHMgbWFrZXMKKyAqIG11Y2ggb2YgYSBkaWZmZXJlbmNlLiAgUmVzdG9yaW5nIHRoZW0gdXBvbiBleGl0IGZyb20ga2VybWl0IG1heSBiZSBvZgorICogc29tZSB1c2UgaW4gc29tZSBjYXNlcyAod2hlbiB0aGUgbGluZSBpcyBub3QgcmVzdG9yZWQgYXV0b21hdGljYWxseSBvbgorICogY2xvc2UsIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtKS4KKyAqCisgKiBJIGNhbid0IGNob29zZSB3aGljaCBvbmUgaXQgc2hvdWxkIGJlLCBzbyBJIGhhdmVuJ3QgY2hhbmdlZCBpdC4gSXQKKyAqIHByb2JhYmx5IHdvcmtzIGFzIGl0IGlzLCB0b28uIEl0IHdvdWxkIHByb2JhYmx5IGV2ZW4gd29yayBldmVuIHdpdGgKKyAqIHR0cmVzKCkgZW50aXJlbHkgZGVsZXRlZC4uLgorICoKKyAqIChmcm9tIGZkYzogQWN0dWFsbHksIHRoaXMgZnVuY3Rpb24gb3BlcmF0ZXMgaW4gcmVtb3RlIG1vZGUgdG9vLCBzbworICogaXQgcmVzdG9yZXMgdGhlIGNvbnNvbGUgKGNvbW1hbmQpIHRlcm1pbmFsIHRvIHdoYXRldmVyIG1vZGUgaXQgd2FzCisgKiBpbiBiZWZvcmUgcGFja2V0IG9wZXJhdGlvbnMgYmVnYW4sIHNvIHRoYXQgY29tbWFuZHMgd29yayByaWdodCBhZ2Fpbi4pCisgKi8KK2ludAordHRyZXMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgdGhlIHR0eSB0byBub3JtYWwuICovCisgICAgaW50IHg7CisKKyAgICBpZiAodHR5ZmQgPCAwKSByZXR1cm4oLTEpOyAgICAgICAgICAvKiBOb3Qgb3Blbi4gKi8KKworICAgIGlmICh0dGZkZmxnKSByZXR1cm4oMCk7CQkvKiBEb24ndCBtZXNzIHdpdGggdGVybWluYWwgbW9kZXMgaWYgKi8KKwkJCQkJLyogd2UgZ290IHR0eWZkIGZyb20gYW5vdGhlciBwcm9jZXNzICovCisjaWZkZWYJTkVUQ09OTgorICAgIGlmIChuZXRjb25uKSB7CQkJLyogTmV0d29yayBjb25uZWN0aW9uICovCisgICAgICAgIHR2dGZsZyA9IDA7CisjaWZkZWYgVENQU09DS0VUCisjaWZkZWYgVENQX05PREVMQVkKKyAgICAgICAgeworCSAgICBleHRlcm4gaW50IHRjcF9ub2RlbGF5OwkvKiBKdXN0IHB1dCB0aGlzIGJhY2sgaWYgbmVjZXNzYXJ5ICovCisJICAgIGlmICh0dG5ldCA9PSBORVRfVENQQikgeworCQlpZiAobm9kZWxheV9zYXYgPiAtMSkgeworCQkgICAgbm9fZGVsYXkodHR5ZmQsbm9kZWxheV9zYXYpOworCQkgICAgbm9kZWxheV9zYXYgPSAtMTsKKwkJfQorCSAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBUQ1BfTk9ERUxBWSAqLworI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgaWYgKGlzdG5jb21wb3J0KCkpIHsKKyAgICAgICAgICAgIGludCByYyA9IC0xOworICAgICAgICAgICAgaWYgKChyYyA9IHRuc2V0Zmxvdyh0dGZsb3cpKSA8IDApCisJICAgICAgcmV0dXJuKHJjKTsKKyAgICAgICAgICAgIGlmICh0dHNwZWVkIDw9IDApIAorCSAgICAgIHR0c3BlZWQgPSB0bmNfZ2V0X2JhdWQoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKChyYyA9IHRuY19zZXRfYmF1ZCh0dHNwZWVkKSkgPCAwKQorCSAgICAgIHJldHVybihyYyk7CisgICAgICAgICAgICB0bmNfc2V0X2RhdGFzaXplKDgpOworCSAgICB0bmNfc2V0X3N0b3BzaXplKHN0b3BiaXRzKTsKKworI2lmZGVmIEhXUEFSSVRZCisgICAgICAgICAgICBpZiAoaHdwYXJpdHkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGh3cGFyaXR5KSB7CisJCSAgY2FzZSAnZSc6CQkJLyogRXZlbiAqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ0dHJlcyA4IGJpdHMgKyBldmVuIHBhcml0eSIsIiIsMCk7CisgICAgICAgICAgICAgICAgICAgIHRuY19zZXRfcGFyaXR5KDMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJICBjYXNlICdvJzoJCQkvKiBPZGQgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwidHRyZXMgOCBiaXRzICsgb2RkIHBhcml0eSIsIiIsMCk7CisgICAgICAgICAgICAgICAgICAgIHRuY19zZXRfcGFyaXR5KDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJICBjYXNlICdtJzoJCQkvKiBNYXJrICovCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsInR0cmVzIDggYml0cyArIGludmFsaWQgcGFyaXR5OiBtYXJrIiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgdG5jX3NldF9wYXJpdHkoNCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkgIGNhc2UgJ3MnOgkJCS8qIFNwYWNlICovCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsInR0cmVzIDggYml0cyArIGludmFsaWQgcGFyaXR5OiBzcGFjZSIsIiIsMCk7CisgICAgICAgICAgICAgICAgICAgIHRuY19zZXRfcGFyaXR5KDUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBIV1BBUklUWSAqLworCSAgICB7CisgICAgICAgICAgICAgICAgdG5jX3NldF9wYXJpdHkoMSk7ICAgICAgICAgICAgICAvKiBOb25lICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0dnRmbGcgPSAwOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCXJldHVybigwKTsKKyAgICB9CisjZW5kaWYJLyogTkVUQ09OTiAqLworI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpcGUpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICBpZiAodHRwdHkpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKworLyogUmVhbCB0ZXJtaW5hbCBkZXZpY2UsIHNvIHJlc3RvcmUgaXRzIG9yaWdpbmFsIG1vZGVzICovCisKKyNpZmRlZiBCU0Q0NE9SUE9TSVgJCQkvKiBGb3IgUE9TSVggbGlrZSB0aGlzICovCisgICAgZGVidWcoRjEwMCwidHRyZXMgQlNENDRPUlBPU0lYIiwiIiwwKTsKKyAgICB4ID0gdGNzZXRhdHRyKHR0eWZkLFRDU0FEUkFJTiwmdHRvbGQpOworI2Vsc2UJCQkJCS8qIEZvciBhbGwgb3RoZXJzLi4uICovCisjaWZkZWYgQVRUU1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIEFUJlQgdmVyc2lvbnMuLi4gKi8KKyAgICBkZWJ1ZyhGMTAwLCJ0dHJlcyBBVFRTViIsIiIsMCk7CisgICAgeCA9IGlvY3RsKHR0eWZkLFRDU0VUQVcsJnR0b2xkKTsJLyogUmVzdG9yZSB0dHkgbW9kZXMgdGhpcyB3YXkuICovCisjZWxzZQorLyogSGVyZSB3ZSByZXN0b3JlIHRoZSBtb2RlcyBmb3IgQlNEICovCisKKyNpZmRlZiBMUEFTUzgJCQkJLyogVW5kbyAicGFzczgiIGlmIGl0IHdlcmUgZG9uZSAqLworICAgIGlmIChsbW9kZWYpIHsKKwlpZiAoaW9jdGwodHR5ZmQsVElPQ0xTRVQsJmxtb2RlKSA8IDApCisJICBkZWJ1ZyhGMTAwLCJ0dHJlcyBUSU9DTFNFVCBmYWlsZWQiLCIiLDApOworCWVsc2UKKwkgIGRlYnVnKEYxMDAsInR0cmVzIFRJT0NMU0VUIG9rIiwiIiwwKTsKKyAgICB9CisjZW5kaWYgLyogTFBBU1M4ICovCisKKyNpZmRlZiBDS19EVFJDVFMJCSAgIC8qIFVuZG8gaGFyZHdhcmUgZmxvdyBpZiBpdCB3ZXJlIGRvbmUgKi8KKyAgICBpZiAobG1vZGVmKSB7CisgCWlmIChpb2N0bCh0dHlmZCxUSU9DTFNFVCwmbG1vZGUpIDwgMCkKKyAJICBkZWJ1ZyhGMTAwLCJ0dHJlcyBUSU9DTFNFVCBmYWlsZWQiLCIiLDApOworIAllbHNlCisgCSAgZGVidWcoRjEwMCwidHRyZXMgVElPQ0xTRVQgb2siLCIiLDApOworICAgIH0KKyNlbmRpZiAvKiBDS19EVFJDVFMgKi8KKworI2lmZGVmIFRJT0NHRVRDCQkJCS8qIFB1dCBiYWNrIHNwZWNpYWwgY2hhcmFjdGVycyAqLworICAgIGlmICh0Y2hhcmYgJiYgKHhsb2NhbCA9PSAwKSkgeworCWlmIChpb2N0bCh0dHlmZCxUSU9DU0VUQywmdGNob2xkKSA8IDApCisJICBkZWJ1ZyhGMTAwLCJ0dHJlcyBUSU9DU0VUQyBmYWlsZWQiLCIiLDApOworCWVsc2UKKwkgIGRlYnVnKEYxMDAsInR0cmVzIFRJT0NTRVRDIG9rIiwiIiwwKTsKKyAgICB9CisjZW5kaWYgLyogVElPQ0dFVEMgKi8KKworI2lmZGVmIFRJT0NHTFRDCQkJCS8qIFB1dCBiYWNrIGxvY2FsIHNwZWNpYWwgY2hhcmFjdGVycyAqLworICAgIGlmIChsdGNoYXJmICYmICh4bG9jYWwgPT0gMCkpIHsKKwlpZiAoaW9jdGwodHR5ZmQsVElPQ1NMVEMsJmx0Y2hvbGQpIDwgMCkKKwkgIGRlYnVnKEYxMDAsInR0cmVzIFRJT0NTTFRDIGZhaWxlZCIsIiIsMCk7CisJZWxzZQorCSAgZGVidWcoRjEwMCwidHRyZXMgVElPQ1NMVEMgb2siLCIiLDApOworICAgIH0KKyNlbmRpZiAvKiBUSU9DR0xUQyAqLworCisjaWZkZWYgQkVMTFYxMAorICAgIGRlYnVnKEYxMDAsInR0cmVzIEJFTExWMTAiLCIiLDApOworICAgIHggPSBpb2N0bCh0dHlmZCxUSU9DU0VUUCwmdHRvbGQpOwkvKiBSZXN0b3JlIGJvdGggc3RydWN0cyAqLworICAgIHggPSBpb2N0bCh0dHlmZCxUSU9DU0RFViwmdGRvbGQpOworI2Vsc2UKKyAgICBkZWJ1ZyhGMTAwLCJ0dHJlcyBzdHR5IiwiIiwwKTsKKyAgICB4ID0gc3R0eSh0dHlmZCwmdHRvbGQpOyAgICAgICAgICAgICAvKiBSZXN0b3JlIHR0eSBtb2RlcyB0aGUgb2xkIHdheS4gKi8KKyNlbmRpZiAvKiBCRUxMVjEwICovCisKKyAgICBpZiAoIXhsb2NhbCkKKyAgICAgIG1zbGVlcCgxMDApOwkJCS8qIFRoaXMgcmVwbGFjZXMgc2xlZXAoMSkuLi4gKi8KKwkJCQkJLyogUHV0IGJhY2sgc2xlZXAoMSkgaWYgdHR5IGlzICovCisJCQkJCS8qIG1lc3NlZCB1cCBhZnRlciBjbG9zZS4gKi8KKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIEJTRDQ0T1JQT1NJWCAqLworCisgICAgZGVidWcoRjEwMSwidHRyZXMgcmVzdWx0IiwiIix4KTsKKyNpZm5kZWYgUU5YCisgICAgaWYgKHggPCAwKSBkZWJ1ZyhGMTAxLCJ0dHJlcyBlcnJubyIsIiIsZXJybm8pOworI2VuZGlmIC8qIFFOWCAqLworCisjaWZkZWYgQUlYUlMKKyNpZm5kZWYgQUlYNDEKKyAgICB4ID0gaW9jdGwodHR5ZmQsIHR0bGQgJiAxID8gVFhBRERDRCA6IFRYREVMQ0QsICJydHMiKTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dHJlcyBBSVggbGluZSBkaXNjaXBsaW5lIHJ0cyByZXN0b3JlIiwiIix4KTsKKyNlbmRpZiAvKiBBSVg0MSAqLworI2VuZGlmIC8qIEFJWFJTICovCisKKyNpZmRlZiBCU0Q0MQorICAgIGlmICh0dGxkID4gLTEpIHsJCQkvKiBQdXQgYmFjayBsaW5lIGRpc2NpcGxpbmUgKi8KKwl4ID0gaW9jdGwodHR5ZmQsIFRJT0NTRVRELCAmdHRsZCk7CisJZGVidWcoRjEwMSwidHRyZXMgQlNENDEgbGluZSBkaXNjaXBsaW5lIHJlc3RvcmUiLCIiLHgpOworCWlmICh4IDwgMCkgZGVidWcoRjEwMSwiLi4uaW9jdGwgZXJybm8iLCIiLGVycm5vKTsKKwl0dGxkID0gLTE7CisgICAgfQorI2VuZGlmIC8qIEJTRDQxICovCisKKyNpZmRlZiBzb255X25ld3MKKyAgICB4ID0geGxvY2FsID8ga21fZXh0IDoga21fY29uOwkvKiBSZXN0b3JlIEthbmppIG1vZGUuICovCisgICAgaWYgKHggIT0gLTEpIHsJCQkvKiBNYWtlIHN1cmUgd2Uga25vdyBvcmlnaW5hbCBtb2Rlcy4gKi8KKwlpZiAoaW9jdGwodHR5ZmQsVElPQ0tTRVQsICZ4KSA8IDApIHsKKwkgICAgcGVycm9yKCJ0dHJlcyBjYW4ndCBzZXQgS2FuamkgbW9kZSIpOworCSAgICBkZWJ1ZyhGMTAxLCJ0dHJlcyBlcnJvciBzZXR0aW5nIEthbmppIG1vZGUiLCIiLHgpOworCSAgICByZXR1cm4oLTEpOworCX0KKyAgICB9CisgICAgZGVidWcoRjEwMCwidHRyZXMgc2V0IEthbmppIG1vZGUgb2siLCIiLDApOworI2VuZGlmIC8qIHNvbnlfbmV3cyAqLworCisgICAgdHZ0ZmxnID0gMDsJCQkJLyogSW52YWxpZGF0ZSB0ZXJtaW5hbCBtb2RlIHNldHRpbmdzICovCisgICAgZGVidWcoRjEwMSwidHRyZXMgcmV0dXJuIGNvZGUiLCIiLHgpOworICAgIHJldHVybih4KTsKK30KKworI2lmbmRlZiBOT1VVQ1AKKworLyogIFQgVCBDIEggSyBQIEkgRCAgLS0gIENoZWNrIGxvY2tmaWxlIHBpZCAgKi8KKy8qCisgIFJlYWQgcGlkIGZyb20gbG9ja2ZpbGUgbmFtZWQgZiwgY2hlY2sgdGhhdCBpdCdzIHN0aWxsIHZhbGlkLgorICBJZiBzbywgcmV0dXJuIDEuCisgIE9uIGZhaWx1cmUgdG8gcmVhZCBwaWQsIHJldHVybiAxLgorICBPdGhlcndpc2UsIHRyeSB0byBkZWxldGUgbG9ja2ZpbGUgZiBhbmQgcmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgZWxzZSAxLgorKi8KK3N0YXRpYyBpbnQKK3R0Y2hrcGlkKGYpIGNoYXIgKmY7IHsKKyAgICBpbnQgcGlkLCBteXBpZCwgeDsKKyAgICBwaWQgPSB0dHJwaWQoZik7CQkJLyogUmVhZCBwaWQgZnJvbSBmaWxlLiAqLworICAgIGlmIChwaWQgPiAtMSkgewkJCS8qIElmIHdlIHdlcmUgYWJsZSB0byByZWFkIHRoZSBwaWQuLiAqLworCWRlYnVnKEYxMDEsInR0Y2hrcGlkIGxvY2sgcGlkIiwiIixwaWQpOworCWVycm5vID0gMDsJCQkvKiBTZWUgaWYgcHJvY2VzcyBzdGlsbCBleGlzdHMuICovCisJbXlwaWQgPSAoaW50KWdldHBpZCgpOwkJLyogR2V0IG15IG93biBwaWQuICovCisJZGVidWcoRjEwMSwidHRjaGtwaWQgbXkgcGlkIiwiIixteXBpZCk7CisJaWYgKHBpZCA9PSBteXBpZCkgewkJLyogSXQncyBtZSEgKi8KKwkgICAgeCA9IC0xOwkJCS8qIFNvIEkgY2FuIGRlbGV0ZSBpdCAqLworCSAgICBlcnJubyA9IEVTUkNIOwkJLyogcHJldGVuZCBpdCdzIGludmFsaWQgKi8KKwl9IGVsc2UgewkJCS8qIEl0J3Mgbm90IG1lICovCisJICAgIHggPSBraWxsKChQSURfVClwaWQsIDApOwkvKiBTZWUgaWYgaXQncyBhIGxpdmUgcHJvY2VzcyAqLworCSAgICBkZWJ1ZyhGMTAxLCJ0dGNoa3BpZCBraWxsIGVycm5vIiwiIixlcnJubyk7CisJfQorCWRlYnVnKEYxMDEsInR0Y2hrcGlkIHBpZCB0ZXN0IiwiIix4KTsKKwlpZiAoeCA8IDAgJiYgZXJybm8gPT0gRVNSQ0gpIHsgLyogcGlkIGlzIGludmFsaWQgKi8KKwkgICAgZGVidWcoRjExMSwicmVtb3Zpbmcgc3RhbGUgbG9jayIsZixwaWQpOworCSAgICBpZiAoIWJhY2tncmQpCisJICAgICAgcHJpbnRmKCJSZW1vdmluZyBzdGFsZSBsb2NrICVzIChwaWQgJWQgdGVybWluYXRlZClcbiIsIGYsIHBpZCk7CisJICAgIHByaXZfb24oKTsKKwkgICAgeCA9IHVubGluayhmKTsJCS8qIFJlbW92ZSB0aGUgbG9ja2ZpbGUuICovCisJICAgIHByaXZfb2ZmKCk7CisJICAgIGRlYnVnKEYxMTEsInR0Y2hrcGlkIHVubGluayIsZix4KTsKKwkgICAgaWYgKHggPiAtMSkKKwkgICAgICByZXR1cm4oMCk7CQkvKiBEZXZpY2UgaXMgbm90IGxvY2tlZCBhZnRlciBhbGwgKi8KKwkgICAgZWxzZSBpZiAoIWJhY2tncmQpCisJICAgICAgcGVycm9yKGYpOworCX0KKwlyZXR1cm4oMSk7CisgICAgfQorICAgIHJldHVybigxKTsJCQkJLyogRmFpbHVyZSB0byByZWFkIHBpZCAqLworfQorCisjaWZkZWYgSFBVWAorCisvKiBBbGlhc2VzIChkaWZmZXJlbnQgZHJpdmVycykgZm9yIEhQLVVYIGRpYWxvdXQgZGV2aWNlczogKi8KKworc3RhdGljIGNoYXIgKmRldnByZWZpeFtdID0geyAidHR5IiwgInR0eWQiLCAiY3VsIiwgImN1YSIsICJjdWFkIiwgImN1bGQiLCAiIiB9Oworc3RhdGljIGludCB0dHlkZXhpc3RzID0gMDsKKworI2VuZGlmIC8qIEhQVVggKi8KKworLyogIFQgVCBSIFAgSSBEICAtLSAgUmVhZCBwaWQgZnJvbSBsb2NrZmlsZSAibmFtZSIgKi8KKworc3RhdGljIGludAordHRycGlkKG5hbWUpIGNoYXIgKm5hbWU7IHsKKyAgICBsb25nIGxlbjsKKyAgICBpbnQgeCwgZmQsIHBpZDsKKyAgICBzaG9ydCBzcGlkOworICAgIGNoYXIgYnVmWzMyXTsKKworICAgIGRlYnVnKEYxMTAsInR0cnBpZCIsbmFtZSwwKTsKKyAgICBpZiAoIW5hbWUpIHJldHVybigtMSk7CisgICAgaWYgKCEqbmFtZSkgcmV0dXJuKC0xKTsKKyAgICBwcml2X29uKCk7CisgICAgbGVuID0gemNoa2kobmFtZSk7CQkJLyogR2V0IGZpbGUgbGVuZ3RoICovCisgICAgcHJpdl9vZmYoKTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dHJwaWQgemNoa2kiLCIiLGxlbik7CisgICAgaWYgKGxlbiA8IDApCisgICAgICByZXR1cm4oLTEpOworICAgIGlmIChsZW4gPiAzMSkKKyAgICAgIHJldHVybigtMSk7CisgICAgcHJpdl9vbigpOworICAgIGZkID0gb3BlbihuYW1lLE9fUkRPTkxZKTsJCS8qIFRyeSB0byBvcGVuIGxvY2tmaWxlLiAqLworICAgIHByaXZfb2ZmKCk7CisgICAgZGVidWcoRjEwMSwidHRycGlkIGZkIiwiIixmZCk7CisgICAgaWYgKGZkIDw9IDApCisgICAgICByZXR1cm4oLTEpOworLyoKKyAgSGVyZSB3ZSB0cnkgdG8gYmUgZmxleGlibGUgYW5kIGFsbG93IGZvciBhbGwgZGlmZmVyZW50IGJpbmFyeSBhbmQgc3RyaW5nCisgIGZvcm1hdHMgYXQgcnVudGltZSwgcmF0aGVyIHRoYW4gYSBzcGVjaWZpYyBmb3JtYXQgZm9yIGVhY2ggY29uZmlndXJhdGlvbgorICBoYXJkd2lyZWQgYXQgY29tcGlsZSB0aW1lLgorKi8KKyAgICBwaWQgPSAtMTsKKyNpZm5kZWYgQ09IRVJFTlQKKy8qCisgIENPSEVSRU5UIHVzZXMgYSBzdHJpbmcgUElEIGJ1dCB3aXRob3V0IGxlYWRpbmcgc3BhY2VzIG9yIDAncywgc28gdGhlcmUgaXMKKyAgbm8gd2F5IHRvIHRlbGwgZnJvbSB0aGUgZmlsZSdzIGxlbmd0aCB3aGV0aGVyIGl0IGNvbnRhaW5zIGEgc3RyaW5nIG9yIGJpbmFyeQorICBwaWQuICBTbyBmb3IgQ09IRVJFTlQgb25seSwgd2Ugb25seSBhbGxvdyBzdHJpbmcgcGlkcy4gIEZvciBhbGwgb3RoZXJzLCB3ZQorICBkZWNpZGUgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGxvY2tmaWxlLgorKi8KKyAgICBpZiAobGVuID4gNCkgewkJCS8qIElmIGZpbGUgPiA0IGJ5dGVzIGl0J3MgYSBzdHJpbmcgKi8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCXggPSByZWFkKGZkLGJ1ZiwoaW50KWxlbik7CisJZGVidWcoRjExMSwidHRycGlkIHN0cmluZyByZWFkIixidWYseCk7CisJaWYgKHggPCAwKSB7CisJICAgIHBpZCA9IC0xOworCX0gZWxzZSB7CisJICAgIGJ1ZlszMV0gPSAnXDAnOworCSAgICB4ID0gc3NjYW5mKGJ1ZiwiJWQiLCZwaWQpOwkvKiBHZXQgdGhlIGludGVnZXIgcGlkIGZyb20gaXQuICovCisJfQorI2lmbmRlZiBDT0hFUkVOVAorICAgIH0gZWxzZSBpZiAobGVuID09IDQpIHsJCS8qIDQgYnl0ZXMgc28gYmluYXJ5ICovCisJeCA9IHJlYWQoZmQsIChjaGFyICopJnBpZCwgNCk7CS8qIFJlYWQgdGhlIGJ5dGVzIGludG8gYW4gaW50ICovCisJZGVidWcoRjEwMSwidHRycGlkIGludGVnZXIgcmVhZCIsIiIseCk7CisJaWYgKHggPCA0KQorCSAgcGlkID0gLTE7CisgICAgfSBlbHNlIGlmIChsZW4gPT0gMikgewkJLyogMiBieXRlcyBiaW5hcnkgKi8KKwl4ID0gcmVhZChmZCwgKGNoYXIgKikmc3BpZCwgMik7CS8qIFJlYWQgdGhlIGJ5dGVzIGludG8gYSBzaG9ydCAqLworCWRlYnVnKEYxMDEsInR0cnBpZCBzaG9ydCByZWFkIiwiIix4KTsKKwlpZiAoeCA8IDIpCisJICBwaWQgPSAtMTsKKwllbHNlCisJICBwaWQgPSBzcGlkOworICAgIH0gZWxzZQorICAgICAgcGlkID0gLTE7CisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyAgICBjbG9zZShmZCk7CQkJCS8qIENsb3NlIHRoZSBsb2NrZmlsZSAqLworICAgIGRlYnVnKEYxMDEsInR0cnBpZCBwaWQiLCIiLHBpZCk7CisgICAgcmV0dXJuKHBpZCk7Cit9CisjZW5kaWYgLyogTk9VVUNQICovCisKKy8qICBUIFQgTCBPIEMgSyAgKi8KKworLyoKKyAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBjb29yZGluYXRlIHVzZSBvZiB0aGUgY29tbXVuaWNhdGlvbiBkZXZpY2Ugd2l0aAorICBvdGhlciBjb3BpZXMgb2YgS2VybWl0IGFuZCBhbnkgb3RoZXIgcHJvZ3JhbSB0aGF0IGZvbGxvd3MgdGhlIFVVQ1AKKyAgZGV2aWNlLWxvY2tpbmcgY29udmVudGlvbnMsIHdoaWNoLCB1bmZvcnR1bmF0ZWx5LCB2YXJ5IGFtb25nIGRpZmZlcmVudCBVTklYCisgIGltcGxlbWVudGF0aW9ucy4gIFRoZSBpZGVhIGlzIHRvIGxvb2sgZm9yIGEgZmlsZSBvZiBhIGNlcnRhaW4gbmFtZSwgdGhlCisgICJsb2NrZmlsZSIsIGluIGEgY2VydGFpbiBkaXJlY3RvcnkuICBJZiBzdWNoIGEgZmlsZSBpcyBmb3VuZCwgdGhlbiB0aGUgbGluZQorICBpcyBwcmVzdW1lZCB0byBiZSBpbiB1c2UsIGFuZCBLZXJtaXQgc2hvdWxkIG5vdCB1c2UgaXQuICBJZiBubyBzdWNoIGZpbGUgaXMKKyAgZm91bmQsIEtlcm1pdCBhdHRlbXB0cyB0byBjcmVhdGUgb25lIHNvIHRoYXQgb3RoZXIgcHJvZ3JhbXMgd2lsbCBub3QgdXNlIHRoZQorICBzYW1lIGxpbmUgYXQgdGhlIHNhbWUgdGltZS4gIEJlY2F1c2UgdGhlIGxvY2tmaWxlIGFuZC9vciB0aGUgZGlyZWN0b3J5IGl0J3MKKyAgaW4gbWlnaHQgbGFjayB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgcGVyc29uIHJ1bm5pbmcgS2VybWl0LCBLZXJtaXQgY291bGQKKyAgZmluZCBpdHNlbGYgcnVubmluZyBzZXR1aWQgdG8gdXVjcCBvciBvdGhlciB1c2VyIHRoYXQgZG9lcyBoYXZlIHRoZQorICBuZWNlc3NhcnkgcGVybWlzc2lvbnMuICBBdCBzdGFydHVwLCBLZXJtaXQgaGFzIGNoYW5nZWQgaXRzIGVmZmVjdGl2ZSB1aWQgdG8KKyAgdGhlIHVzZXIncyByZWFsIHVpZCwgYW5kIHNvIHR0bG9jaygpIG11c3Qgc3dpdGNoIGJhY2sgdG8gdGhlIG9yaWdpbmFsCisgIGVmZmVjdGl2ZSB1aWQgaW4gb3JkZXIgdG8gY3JlYXRlIHRoZSBsb2NrZmlsZSwgYW5kIHRoZW4gYmFjayBhZ2FpbiB0byB0aGUKKyAgcmVhbCB1aWQgdG8gcHJldmVudCB1bmF1dGhvcml6ZWQgYWNjZXNzIHRvIG90aGVyIGRpcmVjdG9yaWVzIG9yIGZpbGVzIG93bmVkCisgIGJ5IHRoZSB1c2VyIHRoZSBwcm9ncmFtIGlzIHNldHVpZCB0by4KKworICBUb3RhbGx5IHJld3JpdHRlbiBmb3IgQy1LZXJtaXQgNUEgdG8gZWxpbWluYXRlIHdpbmRvd3Mgb2YgdnVsbmVyYWJpbGl0eSwKKyAgYmFzZWQgb24gc3VnZ2VzdGlvbnMgZnJvbSBXYXJyZW4gVHVja2VyLiAgQ2FsbCB3aXRoIHBvaW50ZXIgdG8gbmFtZSBvZgorICB0dHkgZGV2aWNlLiAgUmV0dXJuczoKKworICAgMCBvbiBzdWNjZXNzCisgIC0xIG9uIGZhaWx1cmUKKworICBOb3RlOiBPbmNlIHByaXZpbGVnZXMgYXJlIHR1cm5lZCBvbiB1c2luZyBwcml2X29uKCksIGl0IGlzIGVzc2VudGlhbCB0aGF0CisgIHRoZXkgYXJlIHR1cm5lZCBvZmYgYWdhaW4gYmVmb3JlIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyovCisjaWZkZWYgU1ZSNAkJCQkvKiBMb2NrZmlsZSB1c2VzIGRldmljZSBudW1iZXJzLiAqLworLyoKKyAgQWx0aG91Z2ggSSBjYW4ndCBmaW5kIHRoaXMgaW4gd3JpdGluZyBhbnl3aGVyZSAoZS5nLiBpbiBTVklEIGZvciBTVlI0KSwKKyAgaXQgaXMgdGhlIGJlaGF2aW9yIG9mIHRoZSAicmVmZXJlbmNlIHZlcnNpb24iIG9mIFNWUjQsIGkuZS4gdGhlIEludGVsCisgIHBvcnQgZnJvbSBVTklYIFN5c3RlbXMgTGFib3JhdG9yaWVzLCB0aGVuIGNhbGxlZCBVbml2ZWwgVW5peFdhcmUsCisgIHRoZW4gY2FsbGVkIE5vdmVsbCBVbml4V2FyZSwgdGhlbiBjYWxsZWQgU0NPIFVuaXh3YXJlLCB0aGVuIGNhbGxlZCBDYWxkZXJhCisgIE9wZW4gVU5JWC4uLiAgSXQgYWxzbyBtYWtlcyBtdWNoIG1vcmUgc2Vuc2UgdGhhbiBkZXZpY2UtbmFtZS1iYXNlZCBsb2NrZmlsZXMKKyAgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlIG5hbWVzIGZvciB0aGUgc2FtZSBkZXZpY2UsIHN5bWxpbmtzLCBldGMuCisqLworI2lmbmRlZiBOT0xGREVWTk8KKyNpZm5kZWYgTEZERVZOTwkJCQkvKiBEZWZpbmUgdGhpcyBmb3IgU1ZSNCAqLworI2lmbmRlZiBBSVhSUwkJCQkvKiBCdXQgbm90IGZvciBSUy82MDAwIEFJWCAzLjIsIGV0Yy4gKi8KKyNpZm5kZWYgQlNENDQJCQkJLyogSWYgYW55Ym9keSBlbHNlIG5lZWRzIGl0Li4uICovCisjaWZuZGVmIF9fMzg2QlNEX18KKyNpZm5kZWYgX19GcmVlQlNEX18KKyNpZm5kZWYgSFBVWDEwCisjaWZuZGVmIElSSVg1MQkJCQkvKiBTR0kgSVJJWCA1LjEgb3IgbGF0ZXIgKi8KKyNpZm5kZWYgQ0tfU0NPVjUJCQkvKiBTQ08gT3BlbiBTZXJ2ZXIgNS4wICovCisjZGVmaW5lIExGREVWTk8KKyNlbmRpZiAvKiBDS19TQ09WNSAqLworI2VuZGlmIC8qIElSSVg1MSAqLworI2VuZGlmIC8qIEhQVVgxMCAqLworI2VuZGlmIC8qIF9fRnJlZUJTRF9fICovCisjZW5kaWYgLyogX18zODZCU0RfXyAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisjZW5kaWYgLyogQUlYUlMgKi8KKyNlbmRpZiAvKiBMRkRFVk5PICovCQkJLyogLi4uIGRlZmluZSBpdCBoZXJlIG9yIG9uIENDICovCisjZW5kaWYgLyogTk9MRkRFVk5PICovCisjZW5kaWYgLyogU1ZSNCAqLwkJCS8qIGNvbW1hbmQgbGluZS4gKi8KKworI2lmZGVmIENPSEVSRU5UCisjZGVmaW5lIExGREVWTk8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisvKgorICBGb3IgcGxhdGZvcm1zIHdoZXJlIHRoZSBsb2NrZmlsZSBuYW1lIGlzIG1hZGUgZnJvbSBkZXZpY2UvbWFqb3IvbWlub3IKKyAgZGV2aWNlIG51bWJlciwgYXMgaW4gU1ZSNC4gIFdoaWNoLCBpZiB3ZSBtdXN0IGhhdmUgbG9ja2ZpbGVzIGF0IGFsbCwgaXMKKyAgYnkgZmFyIHRoZSBiZXN0IGZvcm1hdCwgc2luY2UgaXQgZWxpbWluYXRlcyBhbGwgdGhlIGNvbmZ1c2lvbiB0aGF0IHN0ZW1zCisgIGZyb20gbXVsdGlwbGUgbmFtZXMgKG9yIGRyaXZlcnMpIGZvciB0aGUgc2FtZSBwb3J0LCBub3QgdG8gbWVudGlvbgorICBzeW1saW5rcy4gIEl0IG1pZ2h0IGV2ZW4gYmUgYSBnb29kIGlkZWEgdG8gc3RhcnQgdXNpbmcgdGhpcyBmb3JtIGV2ZW4KKyAgb24gcGxhdGZvcm1zIHdoZXJlIGl0J3Mgbm90IHN1cHBvcnRlZCwgYWxvbmdzaWRlIHRoZSBub3JtYWwgZm9ybXMgZm9yIHRob3NlCisgIHBsYXRmb3JtcywgaW4gb3JkZXIgdG8gZ2V0IHBlb3BsZSB1c2VkIHRvIGl0Li4uCisqLworI2lmZGVmIExGREVWTk8KKyNpZm5kZWYgbWFqb3IJCQkJLyogSWYgd2UgZGlkbid0IGZpbmQgaXQgKi8KKyNpZmRlZiBTVlI0CQkJCS8qIHRoZW4gZm9yIFN5cyBWIFI0ICovCisjaW5jbHVkZSA8c3lzL21rZGV2Lmg+CQkJLyogbG9vayBoZXJlICovCisjZWxzZQkJCQkJLyogb3IgZm9yIFN1bk9TIHZlcnNpb25zICovCisjaWZkZWYgU1VOT1M0CQkJCS8qIC4uLiAqLworI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4JCS8qIGxvb2sgaGVyZSAqLworI2Vsc2UJCQkJCS8qIE90aGVyd2lzZSB0YWtlIGEgY2hhbmNlOiAqLworI2RlZmluZQltYWpvcihkZXYpICggKGludCkgKCAoKHVuc2lnbmVkKShkZXYpID4+IDgpICYgMHhmZikpCisjZGVmaW5lCW1pbm9yKGRldikgKCAoaW50KSAoIChkZXYpICYgMHhmZikpCisjZW5kaWYgLyogU1VOT1M0ICovCisjZW5kaWYgLyogU1ZSNCAqLworI2VuZGlmIC8qIG1ham9yICovCisjZW5kaWYgLyogTEZERVZOTyAqLworCisvKiBObyBhZHZpc29yeSBsb2NrcyBpZiBGX1RMT0NLIGFuZCBGX1VMT0NLIGFyZSBub3QgZGVmaW5lZCBhdCB0aGlzIHBvaW50ICovCisKKyNpZmRlZiBMT0NLRgorI2lmbmRlZiBGX1RMT0NLCisjdW5kZWYgTE9DS0YKKyNpZm5kZWYgTk9MT0NLRgorI2RlZmluZSBOT0xPQ0tGCisjZW5kaWYgLyogTk9MT0NLRiAqLworI2VuZGlmIC8qIEZfVExPQ0sgKi8KKyNlbmRpZiAvKiBMT0NLRiAqLworCisjaWZkZWYgTE9DS0YKKyNpZm5kZWYgRl9VTE9DSworI3VuZGVmIExPQ0tGCisjaWZuZGVmIE5PTE9DS0YKKyNkZWZpbmUgTk9MT0NLRgorI2VuZGlmIC8qIE5PTE9DS0YgKi8KKyNlbmRpZiAvKiBGX1VMT0NLICovCisjZW5kaWYgLyogTE9DS0YgKi8KKworc3RhdGljIGNoYXIgbGlua3RvW0RFVk5BTUxFTisxXTsKK3N0YXRpYyBjaGFyICogbGlua2RldiA9IE5VTEw7CisKKyNpZm5kZWYgTk9VVUNQCisjaWZkZWYgVVNFVFRZTE9DSworI2lmZGVmIExPQ0tfRElSCitjaGFyICogdXVjcGxvY2tkaXIgPSBMT0NLX0RJUjsKKyNlbHNlCitjaGFyICogdXVjcGxvY2tkaXIgPSAiIjsKKyNlbmRpZiAvKiBMT0NLX0RJUiAqLworI2Vsc2UKKyNpZmRlZiBMT0NLX0RJUgorY2hhciAqIHV1Y3Bsb2NrZGlyID0gTE9DS19ESVI7CisjZWxzZQorY2hhciAqIHV1Y3Bsb2NrZGlyID0gIiI7CisjZW5kaWYgLyogTE9DS19ESVIgKi8KKyNlbmRpZiAvKiBVU0VUVFlMT0NLICovCisjZWxzZQorY2hhciAqIHV1Y3Bsb2NrZGlyID0gIiI7CisjZW5kaWYgLyogTk9VVUNQICovCisKKyNpZmRlZiBRTlgJCQkJLyogT25seSBmb3IgUU5YNCAqLworaW50CQkJCQkvKiBWaXNpYmxlIHRvIG91dHNpZGUgd29ybGQgKi8KK3FueG9wZW5jb3VudCgpIHsJCQkvKiBHZXQgUU5YIGRldmljZSBvcGVuIGNvdW50ICovCisgICAgc3RydWN0IF9kZXZfaW5mb19lbnRyeSBpbmZvOworICAgIGludCB4OworCisgICAgeCA9IC0xOwkJCQkvKiBVbmtub3duICovCisgICAgaWYgKHR0eWZkID4gLTEpIHsKKwlpZiAoIWRldl9pbmZvKHR0eWZkLCAmaW5mbykpIHsKKwkgICAgZGVidWcoRjEwMSwidHRsb2NrIFFOWCBvcGVuX2NvdW50IiwiIixpbmZvLm9wZW5fY291bnQpOworCSAgICB4ID0gaW5mby5vcGVuX2NvdW50OworCX0KKyAgICB9CisgICAgcmV0dXJuKHgpOworfQorI2VuZGlmIC8qIFFOWCAqLworCitjaGFyICoKK3R0Z2xja2RpcigpIHsJCQkJLyogR2V0IExvY2tmaWxlIGRpcmVjdG9yeSBuYW1lICovCisjaWZkZWYgX19PcGVuQlNEX18KKyAgICByZXR1cm4oIi92YXIvc3Bvb2wvbG9jayIpOworI2Vsc2UgLyogX19PcGVuQlNEX18gKi8KKyNpZmRlZiBfX0ZyZWVCU0RfXworICAgIHJldHVybigiL3Zhci9zcG9vbC9sb2NrIik7CisjZWxzZSAgLyogX19GcmVlQlNEX18gKi8KKyNpZmRlZiBMT0NLX0RJUgorICAgIGNoYXIgKiBzID0gTE9DS19ESVI7CisjZW5kaWYgLyogTE9DS19ESVIgKi8KKyNpZmRlZiBOT1VVQ1AKKyAgICByZXR1cm4oIiIpOworI2Vsc2UgIC8qIE5PVVVDUCAqLworI2lmZGVmIExPQ0tfRElSCisgICAgcmV0dXJuKHMpOworI2Vsc2UgIC8qIExPQ0tfRElSICovCisgICAgcmV0dXJuKCIiKTsKKyNlbmRpZiAvKiBMT0NLX0RJUiAqLworI2VuZGlmIC8qIE5PVVVDUCAqLworI2VuZGlmIC8qIF9fRnJlZUJTRF9fICovCisjZW5kaWYgLyogX19PcGVuQlNEX18gKi8KK30KKworc3RhdGljIGludAordHRsb2NrKHR0ZGV2KSBjaGFyICp0dGRldjsgeworCisgICAgaW50IHgsIG47CisgICAgaW50IGlzbGluayA9IDA7CisKKyNpZmRlZiBOT1VVQ1AKKyAgICBkZWJ1ZyhGMTAwLCJ0dGxvY2sgTk9VVUNQIiwiIiwwKTsKKyAgICBja3N0cm5jcHkoZmxmbmFtLCJOT0xPQ0siLEZMRk5BTUwpOworICAgIGhhc2xvY2sgPSAxOworICAgIHJldHVybigwKTsKKyNlbHNlIC8qICFOT1VVQ1AgKi8KKworI2lmZGVmIFVTRVRUWUxPQ0sKKyAgICBoYXNsb2NrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgbG9ja2VkIHlldC4gKi8KKyAgICAqZmxmbmFtID0gJ1wwJzsJCQkvKiBMb2NrZmlsZSBuYW1lIGlzIGVtcHR5LiAqLworICAgIGlmICghc3RybmNtcCh0dGRldiwiL2Rldi8iLDUpICYmIHR0ZGV2WzVdKQorICAgICAgY2tzdHJuY3B5KGxvY2tuYW1lLHR0ZGV2KzUsREVWTkFNTEVOKTsKKyAgICBlbHNlCisgICAgICBja3N0cm5jcHkobG9ja25hbWUsdHRkZXYsREVWTkFNTEVOKTsKKy8qCisgIFRoaXMgbWlnaHQgYmUgb3ZlcmtpbGwsIGJ1dCBpdCdzIG5vdCBjbGVhciBmcm9tIHRoZSBtYW4gcGFnZXMgd2hldGhlcgorICB0dHlsb2NrKCkgY2FuIGJlIGNhbGxlZCB3aXRob3V0IGNhbGxpbmcgdHR5bG9ja2VkKCkgZmlyc3QsIHNpbmNlIHRoZSBkb2MKKyAgc2F5cyB0aGF0IHR0eWxvY2tlZCgpIHJlbW92ZXMgYW55IHN0YWxlIGxvY2tmaWxlcywgYnV0IGl0IGRvZXMgbm90IHNheSB0aGlzCisgIGFib3V0IHR0eWxvY2soKS4gIEFsc28gdGhlIGRvY3MgZG9uJ3Qgc2F5IHdoYXQgdHR5bG9ja2VkKCkgcmV0dXJucyBpbiB0aGUKKyAgY2FzZSB3aGVuIGl0IGZpbmRzIGFuZCByZW1vdmVzIGEgc3RhbGUgbG9ja2ZpbGUuICBTbyBvbmUgb3IgYm90aCBjYWxscyB0bworICB0byB0dHlsb2NrZWQoKSBtaWdodCBiZSBzdXBlcmZsdW91cywgYnV0IHRoZXkgc2hvdWxkIGRvIG5vIGhhcm0uICBBbHNvIEknbQorICBhc3N1bWluZyB0aGF0IHdlIGhhdmUgdG8gZG8gYWxsIHRoZSBzYW1lIElEIHN3YXBwaW5nLCBldGMsIHdpdGggdGhlc2UKKyAgcm91dGluZXMgYXMgd2UgZG8gd2l0aG91dCB0aGVtLiAgVGh1cyB0aGUgcHJpdl9vbi9vZmYoKSBzYW5kd2ljaC4KKyovCisjaWZkZWYgVVNFX1VVX0xPQ0sKKyAgICBwcml2X29uKCk7CQkJCS8qIFR1cm4gb24gcHJpdnMgKi8KKyAgICB4ID0gdXVfbG9jayhsb2NrbmFtZSk7CQkvKiBUcnkgdG8gc2V0IHRoZSBsb2NrICovCisgICAgcHJpdl9vZmYoKTsJCQkJLyogVHVybiBwcml2cyBvZmYgKi8KKyAgICBkZWJ1ZyhGMTExLCJ0dGxvY2sgdXVfbG9jayIsbG9ja25hbWUseCk7CisgICAgc3dpdGNoICh4KSB7CisgICAgICBjYXNlIFVVX0xPQ0tfSU5VU0U6CisJcmV0dXJuKC0yKTsKKyAgICAgIGNhc2UgVVVfTE9DS19PSzoKKyNpZmRlZiBCU0Q0NAorCWNrbWFrbXNnKGZsZm5hbSxGTEZOQU1MLCIvdmFyL3Nwb29sL2xvY2svTENLLi4iLGxvY2tuYW1lLE5VTEwsTlVMTCk7CisjZW5kaWYgLyogQlNENDQgKi8KKwloYXNsb2NrID0gMTsKKwlyZXR1cm4oMCk7CisgICAgICBkZWZhdWx0OgorCXJldHVybigtMSk7CisgICAgfQorI2Vsc2UgIC8qIFVTRV9VVV9MT0NLICovCisgICAgcHJpdl9vbigpOwkJCQkvKiBUdXJuIG9uIHByaXZzICovCisgICAgaWYgKHR0eWxvY2tlZChsb2NrbmFtZSkpIHsJCS8qIFRoaXMgc2hvdWxkIHJlbW92ZSBhbnkgc3RhbGUgbG9jayAqLworCWlmICh0dHlsb2NrZWQobG9ja25hbWUpKSB7CS8qIHNvIGNoZWNrIGFnYWluLiAqLworCSAgICBwcml2X29mZigpOworCSAgICByZXR1cm4oLTUpOwkJCS8qIFN0aWxsIGxvY2tlZCwgZmFpbC4gKi8KKwl9CisgICAgfQorICAgIHggPSB0dHlsb2NrKGxvY2tuYW1lKTsJCS8qIExvY2sgaXQuICovCisgICAgcHJpdl9vZmYoKTsJCQkJLyogVHVybiBvZmYgcHJpdnMgKi8KKworICAgIGRlYnVnKEYxMTEsInR0bG9jayBsb2NrbmFtZSIsbG9ja25hbWUseCk7CisgICAgaWYgKHggPiAtMSkgeworCS8qCisJICBXZSBkb24ndCByZWFsbHkga25vdyB0aGUgbmFtZSBvZiB0aGUgbG9ja2ZpbGUsIGJ1dAorCSAgdGhpcyBpcyB3aGF0IHRoZSBtYW4gcGFnZSBzYXlzIGl0IGlzLiAgSW4gVVNFVFRZTE9DSworICAgICAgICAgIGJ1aWxkcywgaXQgaXMgdXNlZCBvbmx5IGZvciBkaXNwbGF5IGJ5IFNIT1cgQ09NTS4KKwkqLworCWNrbWFrbXNnKGZsZm5hbSxGTEZOQU1MLCIvZXRjL2xvY2tzL0xDSy4uIixsb2NrbmFtZSxOVUxMLE5VTEwpOworCWhhc2xvY2sgPSAxOworICAgIH0KKyAgICByZXR1cm4oeCk7CisjZW5kaWYgLyogVVNFX1VVX0xPQ0sgKi8KKyNlbHNlICAvKiBTeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB0dHlsb2NrKCkuLi4gKi8KKworI2lmbmRlZiBIUFVYCisKKyAgICBpbnQgbG9ja2ZkOwkJCQkvKiBGaWxlIGRlc2NyaXB0b3IgZm9yIGxvY2sgZmlsZS4gKi8KKyAgICBQSURfVCBwaWQ7CQkJCS8qIFByb2Nlc3MgaWQgb2YgdGhpcyBwcm9jZXNzLiAqLworICAgIGludCB0cmllczsJCQkJLyogSG93IG1hbnkgdGltZXMgd2UndmUgdHJpZWQuLi4gKi8KKyAgICBzdHJ1Y3Qgc3RhdCBkZXZidWY7CQkJLyogRm9yIGRldmljZSBudW1iZXJzIChTVlI0KS4gKi8KKworI2lmZGVmIFBJRFNUUklORworICAgIGNoYXIgcGlkX3N0clszMl07CQkJLyogTXkgcGlkIGluIHN0cmluZyBmb3JtYXQuICovCisjZW5kaWYgLyogUElEU1RSSU5HICovCisKKyAgICBjaGFyICpkZXZpY2UsICpkZXZuYW1lOworCisjZGVmaW5lIExGTkFNTCAyNTYJCQkvKiBNYXggbGVuZ3RoIGZvciBsb2NrIGZpbGUgbmFtZS4gKi8KKyAgICBjaGFyIGxvY2tmaWxbTEZOQU1MXTsJCS8qIExvY2sgZmlsZSBuYW1lICovCisjaWZkZWYgUlRBSVgKKyAgICBjaGFyIGxrbG9ja2ZbTEZOQU1MXTsJCS8qIE5hbWUgZm9yIGxpbmsgdG8gbG9jayBmaWxlICAqLworI2VuZGlmIC8qIFJUQUlYICovCisjaWZkZWYgQ0tTWU1MSU5LCisgICAgY2hhciBzeW1sb2NrW0xGTkFNTF07CQkvKiBOYW1lIGZvciBzeW1saW5rIGxvY2tmaWxlIG5hbWUgKi8KKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKyAgICBjaGFyIHRtcG5hbVtMRk5BTUwrMzBdOwkJLyogVGVtcG9yYXJ5IGxvY2tmaWxlIG5hbWUuICovCisgICAgY2hhciAqbG9ja2RpciA9IExPQ0tfRElSOwkJLyogRGVmaW5lZCBuZWFyIHRvcCBvZiB0aGlzIGZpbGUsICovCisJCQkJCS8qIG9yIG9uIGNjIGNvbW1hbmQgbGluZS4gKi8KKyAgICBoYXNsb2NrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgbG9ja2VkIHlldC4gKi8KKyAgICAqZmxmbmFtID0gJ1wwJzsJCQkvKiBMb2NrZmlsZSBuYW1lIGlzIGVtcHR5LiAqLworICAgIGxvY2syWzBdID0gJ1wwJzsJCQkvKiBDbGVhciBzZWNvbmRhcnkgbG9ja2ZpbGUgbmFtZS4gKi8KKyAgICBwaWQgPSBnZXRwaWQoKTsJCQkvKiBHZXQgaWQgb2YgdGhpcyBwcm9jZXNzLiAqLworCisvKiAgQ29uc3RydWN0IG5hbWUgb2YgbG9ja2ZpbGUgYW5kIHRlbXBvcmFyeSBmaWxlICovCisKKy8qICBkZXZpY2UgID0gbmFtZSBvZiB0dHkgZGV2aWNlIHdpdGhvdXQgdGhlIHBhdGgsIGUuZy4gInR0eWg4IiAqLworLyogIGxvY2tmaWwgPSBuYW1lIG9mIGxvY2sgZmlsZSwgd2l0aG91dCBwYXRoLCBlLmcuICJMQ0suLnR0eWg4IiAqLworCisgICAgZGV2aWNlID0gKChkZXZuYW1lID0geHhsYXN0KHR0ZGV2LCcvJykpICE9IE5VTEwgPyBkZXZuYW1lKzEgOiB0dGRldik7CisKKyAgICBpZiAoc3RhdCh0dGRldiwmZGV2YnVmKSA8IDApCisgICAgICByZXR1cm4oLTEpOworCisjaWZkZWYgQ0tTWU1MSU5LCisgICAgaXNsaW5rID0gMTsJCQkJLyogQXNzdW1lIGl0J3MgYSBzeW1saW5rICovCisgICAgbGlua3RvWzBdID0gJ1wwJzsJCQkvKiBCdXQgd2UgZG9uJ3Qga25vdyB0byB3aGF0ICovCisjaWZkZWYgQ09NTUVOVAorLyoKKyAgVGhpcyBpcyB1bmRlcGVuZGFibGUuICBJZiBpdCB3b3JrZWQgaXQgd291bGQgc2F2ZSB0aGUgcmVhZGxpbmsgY2FsbCBpZgorICB3ZSBrbmV3IHRoZSBkZXZpY2UgbmFtZSB3YXMgbm90IGEgbGluay4KKyovCisjaWZkZWYgU19JU0xOSworICAgIGlzbGluayA9IFNfSVNMTksoZGV2YnVmLnN0X21vZGUpOworICAgIGRlYnVnKEYxMDEsInR0bG9jayBzdGF0IFNfSVNMTksiLCIiLGlzbGluayk7CisjZW5kaWYgLyogU19JU0xOSyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBpZiAoaXNsaW5rKSB7CisJbiA9IHJlYWRsaW5rKHR0ZGV2LGxpbmt0byxERVZOQU1MRU4pOyAvKiBTZWUgaWYgaXQncyBhIGxpbmsgKi8KKwlkZWJ1ZyhGMTExLCJ0dGxvY2sgcmVhZGxpbmsiLHR0ZGV2LG4pOworCWlmIChuID4gLTEpCQkJLyogSXQgaXMgKi8KKwkgIGxpbmt0b1tuXSA9ICdcMCc7CisJZWxzZQkJCQkvKiBJdCdzIG5vdCAqLworCSAgaXNsaW5rID0gMDsKKwlkZWJ1ZyhGMTExLCJ0dGxvY2sgbGluayIsbGlua3RvLGlzbGluayk7CisgICAgfQorICAgIGlmIChpc2xpbmspIHsKKwlsaW5rZGV2ID0gKGRldm5hbWUgPSB4eGxhc3QobGlua3RvLCcvJykpID8gZGV2bmFtZSArIDEgOiBsaW5rdG87CisJZGVidWcoRjExMCwidHRsb2NrIGxpbmtkZXYiLGxpbmtkZXYsMCk7CisgICAgfQorI2VuZGlmIC8qIENLU1lNTElOSyAqLworCisvKgorICBPbiBTQ08gcGxhdGZvcm1zLCBpZiB3ZSBkb24ndCBoYXZlIGEgc3ltbGluaywgdGhlbiBsZXQncyBwcmV0ZW5kIHRoZQorICBuYW1lIGdpdmVuIGZvciB0aGUgZGV2aWNlIGlzIGEgc3ltbGluaywgYmVjYXVzZSBsYXRlciB3ZSB3aWxsIGNoYW5nZQorICB0aGUgbmFtZSBpZiBpdCBjb250YWlucyBhbnkgdXBwZXJjYXNlIGNoYXJhY3RlcnMuCisqLworI2lmZGVmIENLX1NDT1Y1CQkJCS8qIFNDTyBPcGVuIFNlcnZlciA1LjAgKi8KKyAgICBpZiAoIWlzbGluaykgeworCWlzbGluayA9IDE7CisJY2tzdHJuY3B5KGxpbmt0byx0dGRldixERVZOQU1MRU4pOworCWxpbmtkZXYgPSAoZGV2bmFtZSA9IHh4bGFzdChsaW5rdG8sJy8nKSkgPyBkZXZuYW1lICsgMSA6IGxpbmt0bzsKKwlkZWJ1ZyhGMTEwLCJ0dGxvY2sgbGlua2RldiIsbGlua2RldiwwKTsKKyAgICB9CisjZWxzZQorI2lmZGVmIE1fWEVOSVgJCQkJLyogU0NPIFhlbml4IG9yIFVOSVggKi8KKyAgICBpZiAoIWlzbGluaykgeworCWlzbGluayA9IDE7CisJY2tzdHJuY3B5KGxpbmt0byx0dGRldixERVZOQU1MRU4pOworCWxpbmtkZXYgPSAoZGV2bmFtZSA9IHh4bGFzdChsaW5rdG8sJy8nKSkgPyBkZXZuYW1lICsgMSA6IGxpbmt0bzsKKwlkZWJ1ZyhGMTEwLCJ0dGxvY2sgbGlua2RldiIsbGlua2RldiwwKTsKKyAgICB9CisjZW5kaWYgLyogTV9YRU5JWCAqLworI2VuZGlmIC8qIENLX1NDT1Y1ICovCisKKyNpZmRlZiBJU0lJSQkJCQkvKiBJbnRlcmFjdGl2ZSBTeXN0ZW0gSUlJLCBQQy9JWCAqLworICAgIGNrc3RybmNweShsb2NrZmlsLCBkZXZpY2UsIERFVk5BTUxFTik7CisjZWxzZSAgLyogbm90IElTSUlJICovCisjaWZkZWYgTEZERVZOTwkJCQkvKiBMb2NrZmlsZW5hbWUgaGFzIGRldmljZSBudW1iZXJzLiAqLworI2lmZGVmIENPSEVSRU5UCisgICAgc3ByaW50Zihsb2NrZmlsLCJMQ0suLiVkLiVkIiwJLyogU0FGRSAqLworCSAgICBtYWpvcihkZXZidWYuc3RfcmRldiksCSAgIC8qIG1ham9yIGRldmljZSBudW1iZXIgKi8KKwkgICAgMHgxZiAmIG1pbm9yKGRldmJ1Zi5zdF9yZGV2KSk7IC8qIG1pbm9yIGRldmljZSBudW1iZXIgKi8KKyNlbHNlCisgICAgLyogTm90ZTogJWQgY2hhbmdlZCB0byAldSBpbiA4LjAgLS0gJXUgaXMgcGFydCBvZiBTVklEIGZvciBTVlI0ICovCisgICAgLyogTG9ja2ZpbGUgbmFtZSBmb3JtYXQgdmVyaWZpZWQgdG8gYWdyZWUgd2l0aCBTb2xhcmlzIGN1LCBEZWMgMjAwMSAqLworICAgIHNwcmludGYobG9ja2ZpbCwiTEsuJTAzdS4lMDN1LiUwM3UiLCAvKiBTQUZFICovCisJICAgIG1ham9yKGRldmJ1Zi5zdF9kZXYpLAkvKiBkZXZpY2UgKi8KKwkgICAgbWFqb3IoZGV2YnVmLnN0X3JkZXYpLAkvKiBtYWpvciBkZXZpY2UgbnVtYmVyICovCisJICAgIG1pbm9yKGRldmJ1Zi5zdF9yZGV2KSk7CS8qIG1pbm9yIGRldmljZSBudW1iZXIgKi8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworI2Vsc2UgIC8qIE5vdCBMRkRFVk5PICovCisjaWZkZWYgUFRYCQkJCS8qIER5bml4IFBUWCAqLworICAgIGlmICgoZGV2aWNlICE9ICZ0dGRldls1XSkgJiYgKHN0cm5jbXAodHRkZXYsIi9kZXYvIiw1KSA9PSAwKSkgeworCWlmICgoaW50KXN0cmxlbihkZXZpY2UpICsgOCA8IExGTkFNTCkKKwkgIHNwcmludGYobG9ja2ZpbCwiTENLLi4lLjNzJXMiLCAmdHRkZXZbNV0sIGRldmljZSk7CisJZWxzZQorCSAgY2tzdHJuY3B5KGxvY2tmaWwsIkxPQ0tGSUxFX05BTUVfVE9PX0xPTkciLExGTkFNTCk7CisgICAgfSBlbHNlCisjZW5kaWYgLyogUFRYICovCisgICAgICBpZiAoKGludClzdHJsZW4oZGV2aWNlKSArIDUgPCBMRk5BTUwpCisJc3ByaW50Zihsb2NrZmlsLCJMQ0suLiVzIiwgZGV2aWNlKTsKKyAgICAgIGVsc2UKKwlja3N0cm5jcHkobG9ja2ZpbCwiTE9DS0ZJTEVfTkFNRV9UT09fTE9ORyIsTEZOQU1MKTsKKyNpZmRlZiBSVEFJWAorICAgIGNrc3RybmNweShsa2xvY2tmLGRldmljZSxERVZOQU1MRU4pOworI2VuZGlmIC8qIFJUQUlYICovCisjaWZkZWYgQ0tTWU1MSU5LCisgICAgc3ltbG9ja1swXSA9ICdcMCc7CisgICAgaWYgKGlzbGluaykKKyAgICAgIGNrbWFrbXNnKHN5bWxvY2ssTEZOQU1MLCAiTENLLi4iLCBsaW5rZGV2LCBOVUxMLCBOVUxMKTsKKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKyNlbmRpZiAvKiBMRkRFVk5PICovCisjZW5kaWYgLyogSVNJSUkgKi8KKworI2lmZGVmIENLX1NDT1Y1CQkJCS8qIFNDTyBPcGVuIFNlcnZlciA1LjAgKi8KKyAgICB7CisJLyogTG93ZXJjYXNlIHRoZSBlbnRpcmUgZmlsZW5hbWUuICovCisgICAgICAgIC8qIFNDTyBzYXlzIHdlIG11c3QgZG8gdGhpcyBpbiBWNS4wIGFuZCBsYXRlci4gKi8KKwkvKiBCVVQuLi4gd2F0Y2ggb3V0IGZvciBkZXZpY2VzIC0tIGxpa2UgRGlnaWJvYXJkIFBvcnRzZXJ2ZXIgKi8KKwkvKiBUaGF0IGNhbiBoYXZlIGh1bmRyZWRzIG9mIHBvcnRzLi4uICovCisJY2hhciAqcCA9IChjaGFyICopKGxvY2tmaWwgKyA1KTsKKwl3aGlsZSAoKnApIHsgaWYgKGlzdXBwZXIoKnApKSAqcCA9IChjaGFyKSB0b2xvd2VyKCpwKTsgcCsrOyB9CisgICAgfQorI2lmZGVmIENLU1lNTElOSworICAgIGlmIChpc2xpbmspIHsJCQkvKiBJZiBubyBjaGFuZ2UgKi8KKwlpZiAoIXN0cmNtcChsb2NrZmlsLHN5bWxvY2spKSB7CS8qIHRoZW4gbm8gc2Vjb25kIGxvY2tmaWxlIG5lZWRlZCAqLworCSAgICBpc2xpbmsgPSAwOworCSAgICBzeW1sb2NrWzBdID0gJ1wwJzsKKwl9CisgICAgfQorI2VuZGlmIC8qIENLU1lNTElOSyAqLworI2Vsc2UKKyNpZmRlZiBNX1hFTklYCQkJCS8qIFNDTyBYZW5peCBvciBVTklYICovCisgICAgeworCWludCB4OyBjaGFyIGM7CisJeCA9IChpbnQpc3RybGVuKGxvY2tmaWwpIC0gMTsJLyogR2V0IGxhc3QgbGV0dGVyIG9mIGRldmljZSBuYW1lLiAqLworCWlmICh4ID4gMCkgewkJCS8qIElmIGl0J3MgdXBwZXJjYXNlLCBsb3dlciBpdC4gKi8KKwkgICAgYyA9IGxvY2tmaWxbeF07CisJICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgbG9ja2ZpbFt4XSArPSAoJ2EnIC0gJ0EnKTsKKwl9CisgICAgfQorI2lmZGVmIENLU1lNTElOSworICAgIGlmIChpc2xpbmspIHsKKwlpZiAoIXN0cmNtcChsb2NrZmlsLHN5bWxvY2spKSB7CS8qIE5vIGNoYW5nZSAqLworCSAgICBpc2xpbmsgPSAwOwkJCS8qIHNvIG5vIHNlY29uZCBsb2NrZmlsZSAqLworCSAgICBzeW1sb2NrWzBdID0gJ1wwJzsKKwl9CisgICAgfQorI2VuZGlmIC8qIENLU1lNTElOSyAqLworI2VuZGlmIC8qIE1fWEVOSVggKi8KKyNlbmRpZiAvKiBDS19TQ09WNSAqLworCisvKiAgZmxmbmFtID0gZnVsbCBsb2NrZmlsZSBwYXRobmFtZSwgZS5nLiAiL3Vzci9zcG9vbC91dWNwL0xDSy4udHR5aDgiICovCisvKiAgdG1wbmFtID0gdGVtcG9yYXJ5IHVuaXF1ZSwgZS5nLiAiL3Vzci9zcG9vbC91dWNwL0xUTVAuLnBpZCIgKi8KKworICAgIGNrbWFrbXNnKGZsZm5hbSxMRk5BTUwsbG9ja2RpciwiLyIsbG9ja2ZpbCxOVUxMKTsKKworI2lmZGVmIFJUQUlYCisgICAgY2ttYWttc2cobGtmbGZuLEZMRk5BTUwsbG9ja2RpciwiLyIsbGtsb2NrZixOVUxMKTsKKyNlbmRpZiAvKiBSVEFJWCAqLworCisjaWZuZGVmIExGREVWTk8KKyNpZmRlZiBDS1NZTUxJTksKKyAgICAvKiBJZiBpdCdzIGEgbGluayB0aGVuIGFsc28gbWFrZSBhIGxvY2tmaWxlIGZvciB0aGUgcmVhbCBuYW1lICovCisgICAgZGVidWcoRjExMSwidHRsb2NrIGxpbmsgc3ltbG9jayIsc3ltbG9jayxpc2xpbmspOworICAgIGlmIChpc2xpbmsgJiYgc3ltbG9ja1swXSkgeworCS8qIEJ1dCBvbmx5IGlmIHRoZSBsb2NrZmlsZSBuYW1lcyB3b3VsZCBiZSBkaWZmZXJlbnQuICovCisJLyogV0FSTklORzogVGhleSB3b24ndCBiZSwgZS5nLiBmb3IgL2Rldi90dHlkMiA9PiAvaHcvdHR5cy90dHlkMiAqLworCWNrbWFrbXNnKGxvY2syLEZMRk5BTUwsbG9ja2RpciwiLyIsc3ltbG9jayxOVUxMKTsKKwlkZWJ1ZyhGMTEwLCJ0dGxvY2sgbG9jazIiLGxvY2syLDApOworCWlmICghc3RyY21wKGxvY2syLGZsZm5hbSkpIHsJLyogQXJlIGxvY2tmaWxlIG5hbWVzIHRoZSBzYW1lPyAqLworCSAgICBkZWJ1ZyhGMTAwLCJ0dGxvY2sgbG9jazIgY2xlYXJlZCIsIiIsMCk7CisJICAgIGxvY2syWzBdID0gJ1wwJzsJCS8qIENsZWFyIHNlY29uZGFyeSBsb2NrZmlsZSBuYW1lLiAqLworCX0KKyAgICB9CisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisjZW5kaWYgLyogTEZERVZOTyAqLworCisgICAgc3ByaW50Zih0bXBuYW0sIiVzL0xUTVAuJTA1ZCIsbG9ja2RpciwoaW50KSBwaWQpOyAvKiBzYWZlICovCisgICAgZGVidWcoRjExMCwidHRsb2NrIGZsZm5hbSIsZmxmbmFtLDApOworICAgIGRlYnVnKEYxMTAsInR0bG9jayB0bXBuYW0iLHRtcG5hbSwwKTsKKworICAgIHByaXZfb24oKTsJCQkJLyogVHVybiBvbiBwcml2aWxlZ2VzIGlmIHBvc3NpYmxlLiAqLworICAgIGxvY2tmZCA9IGNyZWF0KHRtcG5hbSwgMDQ0NCk7CS8qIFRyeSB0byBjcmVhdGUgdGVtcCBsb2NrIGZpbGUuICovCisgICAgaWYgKGxvY2tmZCA8IDApIHsJCQkvKiBDcmVhdGUgZmFpbGVkLiAqLworCWRlYnVnKEYxMTEsInR0bG9jayBjcmVhdCBmYWlsZWQiLHRtcG5hbSxlcnJubyk7CisJaWYgKGVycm5vID09IEVOT0VOVCkgeworCSAgICBwZXJyb3IobG9ja2Rpcik7CisJICAgIHByaW50ZigiVVVDUCBub3QgaW5zdGFsbGVkIG9yIEtlcm1pdCBtaXNjb25maWd1cmVkXG4iKTsKKwl9IGVsc2UgeworCSAgICBpZiAoIXF1aWV0KQorCSAgICAgIHBlcnJvcihsb2NrZGlyKTsKKwkgICAgdW5saW5rKHRtcG5hbSk7CQkvKiBHZXQgcmlkIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZS4gKi8KKwl9CisJcHJpdl9vZmYoKTsJCQkvKiBUdXJuIG9mZiBwcml2aWxlZ2VzISEhICovCisJcmV0dXJuKC0xKTsJCQkvKiBSZXR1cm4gZmFpbHVyZSBjb2RlLiAqLworICAgIH0KKy8qIE5vdyB3cml0ZSB0aGUgcGlkIGludG8gdGhlIHRlbXAgbG9ja2ZpbGUgaW4gdGhlIGFwcHJvcHJpYXRlIGZvcm1hdCAqLworCisjaWZkZWYgUElEU1RSSU5HCQkJLyogRm9yIEhvbmV5IERhbkJlciBVVUNQLCAqLworICAgIHNwcmludGYoCQkJCS8qIHdyaXRlIFBJRCBhcyBkZWNpbWFsIHN0cmluZyAqLworCSAgICBwaWRfc3RyLAorI2lmZGVmIExJTlVYRlNTVE5ECQkJLyogVGhlICJMaW51eCBGaWxlIFN5c3RlbSBTdGFuZGFyZCIgKi8KKyNpZmRlZiBGU1NUTkQxMAkJCQkvKiBWZXJzaW9uIDEuMCBjYWxscyBmb3IgKi8KKwkgICAgIiUwMTBkXG4iLAkJCS8qIGxlYWRpbmcgemVyb3MgKi8KKyNlbHNlCQkJCQkvKiB3aGlsZSB2ZXJzaW9uIDEuMiBjYWxscyBmb3IgKi8KKwkgICAgIiUxMGRcbiIsCQkJLyogbGVhZGluZyBzcGFjZXMgKi8KKyNlbmRpZiAvKiBGU1NUTkQxMCAqLworI2Vsc2UKKyNpZmRlZiBDT0hFUkVOVAorCSAgICAiJWRcbiIsCQkJLyogd2l0aCBsZWFkaW5nIG5vdGhpbmcgKi8KKyNlbHNlCisJICAgICIlMTBkXG4iLAkJCS8qIHdpdGggbGVhZGluZyBibGFua3MgKi8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworI2VuZGlmIC8qIExJTlVYRlNTVE5EICovCisJICAgIChpbnQpIHBpZAorCSAgICApOwkJCQkvKiBzYWZlICovCisgICAgd3JpdGUobG9ja2ZkLCBwaWRfc3RyLCAxMSk7CisgICAgZGVidWcoRjExMSwidHRsb2NrIGhkYiBwaWQgc3RyaW5nIixwaWRfc3RyLChpbnQpIHBpZCk7CisKKyNlbHNlIC8qIE5vdCBQSURTVFJJTkcsIHVzZSBpbnRlZ2VyIFBJRCAqLworCisgICAgd3JpdGUobG9ja2ZkLCAoY2hhciAqKSZwaWQsIHNpemVvZihwaWQpICk7CisgICAgZGVidWcoRjEwMSwidHRsb2NrIHBpZCIsIiIsKGludCkgcGlkKTsKKworI2VuZGlmIC8qIFBJRFNUUklORyAqLworCisvKiBOb3cgdHJ5IHRvIHJlbmFtZSB0aGUgdGVtcCBmaWxlIHRvIHRoZSByZWFsIGxvY2sgZmlsZSBuYW1lLiAqLworLyogVGhpcyB3aWxsIGZhaWwgaWYgYSBsb2NrIGZpbGUgb2YgdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzLiAgKi8KKworICAgIGNsb3NlKGxvY2tmZCk7CQkJLyogQ2xvc2UgdGhlIHRlbXAgbG9ja2ZpbGUuICovCisgICAgY2htb2QodG1wbmFtLDA0NDQpOwkJCS8qIFBlcm1pc3Npb24gZm9yIGEgdmFsaWQgbG9jay4gKi8KKyAgICB0cmllcyA9IDA7CisgICAgd2hpbGUgKCFoYXNsb2NrICYmIHRyaWVzKysgPCAyKSB7CisJaGFzbG9jayA9IChsaW5rKHRtcG5hbSxmbGZuYW0pID09IDApOyAvKiBDcmVhdGUgYSBsaW5rIHRvIGl0LiAqLworCWlmIChoYXNsb2NrKSB7CQkJICAgICAgLyogSWYgd2UgZ290IHRoZSBsb2NrZmlsZSAqLworI2lmZGVmIFJUQUlYCisJICAgIGxpbmsoZmxmbmFtLGxrZmxmbik7CisjZW5kaWYgLyogUlRBSVggKi8KKyNpZmRlZiBDS1NZTUxJTksKKyNpZm5kZWYgTEZERVZOTworCSAgICBpZiAoaXNsaW5rICYmIGxvY2syWzBdKQorCSAgICAgIGxpbmsoZmxmbmFtLGxvY2syKTsKKyNlbmRpZiAvKiBMRkRFVk5PICovCisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisKKyNpZmRlZiBDT01NRU5UCisvKiBDYW4ndCBkbyB0aGlzIGFueSBtb3JlIGJlY2F1c2UgZGV2aWNlIGlzIG5vdCBvcGVuIHlldCBzbyBubyB0dHlmZC4gKi8KKyNpZmRlZiBMT0NLRgorLyoKKyAgQWR2aXNvcnkgZmlsZSBsb2NraW5nIHdvcmtzIG9uIFNWUjQsIHNvIHdlIHVzZSBpdC4gIEluIGZhY3QsIGl0IGlzCisgIG5lY2Vzc2FyeSBpbiBzb21lIGNhc2VzLCBlLmcuIHdoZW4gU0xJUCBpcyBpbnZvbHZlZC4gIEJ1dCBpdCBzdGlsbCBkb2Vzbid0CisgIHNlZW0gdG8gcHJldmVudCBtdWx0aXBsZSB1c2VycyBhY2Nlc3NpbmcgdGhlIHNhbWUgZGV2aWNlIGJ5IGRpZmZlcmVudCBuYW1lcy4KKyovCisgICAgICAgICAgICB3aGlsZSAobG9ja2YodHR5ZmQsIEZfVExPQ0ssIDBMKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwgInR0bG9jayBsb2NrZiByZXR1cm5zIGVycm5vIiwgIiIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICBpZiAoKCsrdHJpZXMgPj0gMykgfHwgKGVycm5vICE9IEVBR0FJTikpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IHVubGluayhmbGZuYW0pOyAvKiByZW1vdmUgdGhlIGxvY2tmaWxlICovCisjaWZkZWYgUlRBSVgKKwkJICAgIHVubGluayhsa2ZsZm4pOwkvKiBBbmQgYW55IGxpbmtzIHRvIGl0Li4uICovCisjZW5kaWYgLyogUlRBSVggKi8KKyNpZmRlZiBDS1NZTUxJTksKKyNpZm5kZWYgTEZERVZOTworCQkgICAgaWYgKGlzbGluayAmJiBsb2NrMlswXSkKKwkJICAgICAgdW5saW5rKGxvY2syKTsJLyogZGl0dG8uLi4gKi8KKyNlbmRpZiAvKiBMRkRFVk5PICovCisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInR0bG9jayB1bmxpbmsiLGZsZm5hbSx4KTsKKyAgICAgICAgICAgICAgICAgICAgaGFzbG9jayA9IDA7CisJCSAgICBicmVhazsKKwkJfQorICAgICAgICAgICAgICAgIHNsZWVwKDIpOworCSAgICB9CisJICAgIGlmIChoYXNsb2NrKQkJLyogSWYgd2UgZ290IGFuIGFkdmlzb3J5IGxvY2sgKi8KKyNlbmRpZiAvKiBMT0NLRiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgICAgICBicmVhazsJCQkvKiBXZSdyZSBkb25lLiAqLworCisJfSBlbHNlIHsJCQkvKiBXZSBkaWRuJ3QgY3JlYXRlIGEgbmV3IGxvY2tmaWxlLiAqLworCSAgICBwcml2X29mZigpOworCSAgICBpZiAodHRjaGtwaWQoZmxmbmFtKSkgewkvKiBDaGVjayBleGlzdGluZyBsb2NrZmlsZSAqLworCQlwcml2X29uKCk7CQkvKiBjYXVzZSB0dGNoa3BpZCB0dXJucyBwcml2X29mZi4uLiAqLworCQl1bmxpbmsodG1wbmFtKTsJCS8qIERlbGV0ZSB0aGUgdGVtcGZpbGUgKi8KKwkJZGVidWcoRjEwMCwidHRsb2NrIGZvdW5kIHR0eSBsb2NrZWQiLCIiLDApOworCQlwcml2X29mZigpOwkJLyogVHVybiBvZmYgcHJpdnMgKi8KKwkJcmV0dXJuKC0yKTsJCS8qIENvZGUgZm9yIGRldmljZSBpcyBpbiB1c2UuICovCisJICAgIH0KKwkgICAgcHJpdl9vbigpOworCX0KKyAgICB9CisgICAgdW5saW5rKHRtcG5hbSk7CQkJLyogVW5saW5rIChyZW1vdmUpIHRoZSB0ZW1wIGZpbGUuICovCisgICAgcHJpdl9vZmYoKTsJCQkJLyogVHVybiBvZmYgcHJpdnMgKi8KKyAgICByZXR1cm4oaGFzbG9jayA/IDAgOiAtMSk7CQkvKiBSZXR1cm4gbGluaydzIHJldHVybiBjb2RlLiAqLworCisjZWxzZSAvKiBIUFVYICovCisKKy8qCisgIEhQLVVYIGdldHMgaXRzIG93biBjb3B5IG9mIHRoaXMgcm91dGluZSwgbW9kZWxlZCBhZnRlciB0aGUgb2JzZXJ2ZWQgYmVoYXZpb3IKKyAgb2YgdGhlIEhQLVVYICdjdScgcHJvZ3JhbS4gIEhQLVVYIHNlcmlhbCBkZXZpY2UgbmFtZXMgY29uc2lzdCBvZiBhIGJhc2UgbmFtZQorICBzdWNoIGFzICJ0dHkiLCAidHR5ZCIsICJjdWEiLCAiY3VsIiwgImN1YWQiLCBvciAiY3VsZCIsIGZvbGxvd2VkIGJ5IGEgdW5pdAorICBkZXNpZ25hdG9yIHdoaWNoIGlzIGEgc3RyaW5nIG9mIGRpZ2l0cywgcG9zc2libHkgY29udGFpbmluZyBhbiBpbWJlZGRlZAorICBsZXR0ZXIgInAiLiAgRXhhbXBsZXMgKGZvciBiYXNlIG5hbWUgInR0eSIpOgorCisgICAgIC9kZXYvdHR5MCwgL2Rldi90dHkwMCwgZGV2L3R0eWQwMCwgL2Rldi90dHkwcDAKKworICBBY2NvcmRpbmcgdG8gdGhlIEhQLVVYIFVVQ1AgbWFudWFsIG9mIDE5ODgsIHRoZSAiMHAwIiBub3RhdGlvbiBoYXMgYmVlbgorICB1c2VkIG9uIFNlcmllcyA4MDAgc2luY2UgSFAtVVggMi4wMCwgYW5kIHRoZSAibm9uLXAiIG5vdGF0aW9uIHdhcyB1c2VkCisgIG9uIG90aGVyIG1vZGVscy4gIEluIEhQLVVYIDEwLjAwLCAiMHAwIiBub3RhdGlvbiB3YXMgYWRvcHRlZCBmb3IgYWxsIG1vZGVscy4KKyAgSG93ZXZlciwgd2UgbWFrZSBhbmQgZW5mb3JjZSBubyBzdWNoIGRpc3RpbmN0aW9uczsgZWl0aGVyIG5vdGF0aW9uIGlzCisgIGFjY2VwdGVkIG9uIGFueSBtb2RlbCBvciBIUC1VWCB2ZXJzaW9uIGFzIGEgdmFsaWQgdW5pdCBkZXNpZ25hdG9yLgorCisgIElmIGEgdmFsaWQgdW5pdCBpcyBzcGVjaWZpZWQgKGFzIG9wcG9zZWQgdG8gYSBkZXNpZ25lciBuYW1lIG9yIHN5bWxpbmspLCB3ZQorICBjaGVjayBmb3IgYWxsIGFsaWFzZXMgb2YgdGhlIGdpdmVuIHVuaXQgYWNjb3JkaW5nIHRvIHRoZSBkZXZwcmVmaXhbXSBhcnJheS4KKyAgSWYgbm8gbG9ja2ZpbGVzIGFyZSBmb3VuZCBmb3IgdGhlIGdpdmVuIHVuaXQsIHdlIGNhbiBoYXZlIHRoZSBkZXZpY2U7IHdlCisgIGNyZWF0ZSBhIGxvY2tmaWxlIExDSy4ubmFtZSBpbiB0aGUgbG9ja2ZpbGUgZGlyZWN0b3J5IGFwcHJvcHJpYXRlIGZvciB0aGUKKyAgSFAtVVggdmVyc2lvbiAoL3Zhci9zcG9vbC9sb2NrcyBmb3IgMTAuMDAgYW5kIGxhdGVyLCAvdXNyL3Nwb29sL3V1Y3AgZm9yCisgIDkueHggYW5kIGVhcmxpZXIpLiAgSWYgaXQgaXMgYSAiY3VhIiBvciAiY3VsIiBkZXZpY2UsIGEgc2Vjb25kIGxvY2tmaWxlIGlzCisgIGNyZWF0ZWQgd2l0aCB0aGUgInR0eWQiIHByZWZpeC4gIFRoaXMgaXMgZXhhY3RseSB3aGF0IGN1IGRvZXMuCisKKyAgSWYgdGhlICJzZXQgbGluZSIgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSB2YWxpZCB1bml0IGRlc2lnbmF0b3IsIHRoZW4gaXQgaXMKKyAgdXNlZCBsaXRlcmFsbHkgYW5kIG5vIHN5bm9teW1zIGFyZSBzZWFyY2hlZCBmb3IgYW5kIG9ubHkgb25lIGxvY2tmaWxlIGlzCisgIGNyZWF0ZWQuCisKKyAgLWZkYywgTWFyY2ggMTk5OC4KKyovCisjZGVmaW5lIExGTkFNTCA4MAkJCS8qIE1heCBsZW5ndGggZm9yIGxvY2sgZmlsZSBuYW1lLiAqLworCisgICAgaW50IGxvY2tmZDsJCQkJLyogRmlsZSBkZXNjcmlwdG9yIGZvciBsb2NrIGZpbGUuICovCisgICAgUElEX1QgcGlkOwkJCQkvKiBQcm9jZXNzIElEIG9mIHRoaXMgcHJvY2Vzcy4gKi8KKyAgICBpbnQgZnBpZDsJCQkJLyogcGlkIGZvdW5kIGluIGV4aXN0aW5nIGxvY2tmaWxlLiAqLworICAgIGludCB0cmllczsJCQkJLyogSG93IG1hbnkgdGltZXMgd2UndmUgdHJpZWQuLi4gKi8KKyAgICBpbnQgaSwgazsJCQkJLyogV29ya2VycyAqLworCisgICAgY2hhciAqZGV2aWNlLCAqZGV2bmFtZTsJCS8qICIvZGV2L3h4eCIsICJ4eHgiICovCisgICAgY2hhciAqdW5pdCwgKnA7CQkJLyogPGluc3RhbmNlPnA8cG9ydD4gcGFydCBvZiB4eHggKi8KKworICAgIGNoYXIgbG9ja2ZpbFtMRk5BTUxdOwkJLyogTG9ja2ZpbGUgbmFtZSAobm8gcGF0aCkgKi8KKyAgICBjaGFyIHRtcG5hbVtMRk5BTUxdOwkJLyogVGVtcG9yYXJ5IGxvY2tmaWxlIG5hbWUuICovCisKKyNpZmRlZiBIUFVYMTAJCQkJLyogTG9ja2ZpbGUgZGlyZWN0b3J5ICovCisgICAgY2hhciAqbG9ja2RpciA9ICIvdmFyL3Nwb29sL2xvY2tzIjsJLyogQWx3YXlzIHRoaXMgZm9yIDEwLjAwIGFuZCBoaWdoZXIgKi8KKyNlbHNlICAvKiBIUC1VWCA5Lnh4IGFuZCBiZWxvdyAqLworI2lmZGVmIExPQ0tfRElSCisgICAgY2hhciAqbG9ja2RpciA9IExPQ0tfRElSOwkJLyogRGVmaW5lZCBuZWFyIHRvcCBvZiB0aGlzIGZpbGUgKi8KKyNlbHNlCisgICAgY2hhciAqbG9ja2RpciA9ICIvdXNyL3Nwb29sL3V1Y3AiOwkvKiBvciBub3QuLi4gKi8KKyNlbmRpZiAvKiBMT0NLX0RJUiAqLworI2VuZGlmIC8qIEhQVVgxMCAqLworCisgICAgaGFzbG9jayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGxvY2tlZCB5ZXQuICovCisgICAgKmZsZm5hbSA9ICdcMCc7CQkJLyogTG9ja2ZpbGUgbmFtZSBpcyBlbXB0eS4gKi8KKyAgICBsb2NrMlswXSA9ICdcMCc7CQkJLyogU2Vjb25kIG9uZSB0b28uICovCisgICAgcGlkID0gZ2V0cGlkKCk7CQkJLyogR2V0IG15IHByb2Nlc3MgSUQgKi8KKy8qCisgIENvbnN0cnVjdCBuYW1lIG9mIGxvY2tmaWxlIGFuZCB0ZW1wb3JhcnkgZmlsZS4uLgorICBkZXZpY2UgID0gbmFtZSBvZiB0dHkgZGV2aWNlIHdpdGhvdXQgdGhlIHBhdGgsIGUuZy4gInR0eTBwMCIKKyAgbG9ja2ZpbCA9IG5hbWUgb2YgbG9jayBmaWxlLCB3aXRob3V0IHBhdGgsIGUuZy4gIkxDSy4udHR5MHAwIgorKi8KKyAgICBkZXZpY2UgPSAoKGRldm5hbWUgPSB4eGxhc3QodHRkZXYsJy8nKSkgIT0gTlVMTCA/IGRldm5hbWUrMSA6IHR0ZGV2KTsKKyAgICBkZWJ1ZyhGMTEwLCJUVExPQ0sgZGV2aWNlIixkZXZpY2UsMCk7CisgICAgY2ttYWttc2cobG9ja2ZpbCxMRk5BTUwsIkxDSy4uIixkZXZpY2UsTlVMTCxOVUxMKTsKKworICAgIGsgPSAwOwkJCQkvKiBBc3N1bWUgZGV2aWNlIGlzIG5vdCBsb2NrZWQgKi8KKyAgICBuID0gMDsJCQkJLyogRGlnaXQgY291bnRlciAqLworICAgIHVuaXQgPSBkZXZpY2U7CQkJLyogVW5pdCA9IDxpbnN0YW5jZT5wPHBvcnQ+ICovCisgICAgd2hpbGUgKCp1bml0ICYmICFpc2RpZ2l0KCp1bml0KSkJLyogU2VhcmNoIGZvciBkaWdpdC4uLiAqLworICAgICAgdW5pdCsrOworICAgIHAgPSB1bml0OwkJCQkvKiBWZXJpZnkgPG51bT5wPG51bT4gZm9ybWF0Li4uICovCisgICAgZGVidWcoRjExMCwiVFRMT0NLIHVuaXQgMSIsdW5pdCwwKTsKKy8qCisgIFRoZSB1bml0IG51bWJlciBpcyByZWNvZ25pemVkIGFzOgorICAoYSkgYW55IHNlcXVlbmNlIG9mIGRpZ2l0cyB0aGF0IHJ1bnMgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICAoYikgYW55IChhKSB0aGF0IGluY2x1ZGVzIG9uZSBhbmQgb25seSBvbmUgbGV0dGVyICJwIiwgd2l0aCBhdCBsZWFzdAorICAgICAgb25lIGRpZ2l0IGJlZm9yZSBhbmQgYWZ0ZXIgaXQuCisqLworICAgIHdoaWxlIChpc2RpZ2l0KCpwKSkgcCsrLCBuKys7CS8qIEdldCBhIHJ1biBvZiBkaWdpdHMgKi8KKyAgICBpZiAoKnAgJiYgbiA+IDApIHsJCQkvKiBIYXZlIGEgInAiPyAqLworCWlmICgqcCA9PSAncCcgJiYgaXNkaWdpdCgqKHArMSkpKSB7CisJICAgIHArKzsKKwkgICAgbiA9IDA7CisJICAgIHdoaWxlIChpc2RpZ2l0KCpwKSkgcCsrLCBuKys7CisJfQorICAgIH0KKyAgICBpZiAobiA9PSAwIHx8ICpwKSB1bml0ID0gIiI7CisgICAgZGVidWcoRjExMCwiVFRMT0NLIHVuaXQgMiIsdW5pdCwwKTsKKworICAgIGlmICgqdW5pdCkgewkJCS8qIERldmljZSBuYW1lIGhhcyB1bml0IG51bWJlci4gKi8KKwkvKiBUaGUgZm9sbG93aW5nIGxvb3Agbm90IG9ubHkgc2VhcmNoZXMgZm9yIHRoZSB2YXJpb3VzIGxvY2tmaWxlICAgICovCisJLyogc3lub255bXMsIGJ1dCBhbHNvIHJlbW92ZXMgYWxsIC0tIG5vdCBqdXN0IG9uZSAtLSBzdGFsZSBsb2NrZmlsZSAqLworCS8qIGZvciB0aGUgZGV2aWNlLCBzaG91bGQgdGhlcmUgYmUgbW9yZSB0aGFuIG9uZS4gIFNlZSB0dGNoa3BpZCgpLiAgKi8KKwl0dHlkZXhpc3RzID0gMDsKKwlmb3IgKGkgPSAwOyAqZGV2cHJlZml4W2ldOyBpKyspIHsgLyogRm9yIGVhY2ggZHJpdmVyLi4uICovCisJICAgIC8qIE1ha2UgZGV2aWNlIG5hbWUgKi8KKwkgICAgY2ttYWttc2cobG9jazIsRkxGTkFNTCwiL2Rldi8iLGRldnByZWZpeFtpXSx1bml0LE5VTEwpOworCSAgICBwcml2X29uKCk7CQkJLyogUHJpdnMgb24gKi8KKwkgICAgayA9IHpjaGtpKGxvY2syKSAhPSAtMTsJLyogU2VlIGlmIGRldmljZSBleGlzdHMgKi8KKwkgICAgcHJpdl9vZmYoKTsJCQkvKiBQcml2cyBvZmYgKi8KKwkgICAgZGVidWcoRjExMSwiVFRMT0NLIGV4aXN0Iixsb2NrMixrKTsKKyAgICAgICAgICAgIGlmIChrKSB7CisJCWlmICghc3RyY21wKGRldnByZWZpeFtpXSwidHR5ZCIpKSAvKiB0dHlkIGRldmljZSBleGlzdHMgKi8KKwkJICB0dHlkZXhpc3RzID0gMTsKKwkJLyogTWFrZSBsb2NrZmlsZSBuYW1lICovCisJCWNrbWFrbXNnKGxvY2syLEZMRk5BTUwsbG9ja2RpciwiL0xDSy4uIixkZXZwcmVmaXhbaV0sdW5pdCk7CisJCWRlYnVnKEYxMTAsIlRUTE9DSyBjaGVja2luZyIsbG9jazIsMCk7CisJCXByaXZfb24oKTsJCS8qIFByaXZzIG9uICovCisJCWsgPSB6Y2hraShsb2NrMikgIT0gLTE7CS8qIFNlZSBpZiBsb2NrZmlsZSBleGlzdHMgKi8KKwkJcHJpdl9vZmYoKTsJCS8qIFByaXZzIG9mZiAqLworCQlkZWJ1ZyhGMTExLCJUVExPQ0sgY2hlY2sgZm9yIGxvY2sgQSIsbG9jazIsayk7CisJCWlmIChrKSBpZiAodHRjaGtwaWQobG9jazIpKSB7IC8qIElmIHBpZCBzdGlsbCBhY3RpdmUsIGZhaWwuICovCisJCSAgICBja3N0cm5jcHkoZmxmbmFtLGxvY2syLEZMRk5BTUwpOworCQkgICAgcmV0dXJuKC0yKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0gZWxzZSB7CQkJCS8qIFNvbWUgb3RoZXIgZGV2aWNlLW5hbWUgZm9ybWF0ICovCisJLyogVGhpcyB0YWtlcyBjYXJlIG9mIHN5bWJvbGljIGxpbmtzLCBldGMuLi4gKi8KKwkvKiBCdXQgZG9lcyBub3QgY2hhc2UgdGhlbSBkb3duISAqLworCWNrbWFrbXNnKGxvY2syLEZMRk5BTUwsbG9ja2RpciwiL0xDSy4uIixkZXZpY2UsTlVMTCk7CisJcHJpdl9vbigpOworCWsgPSB6Y2hraShsb2NrMikgIT0gLTE7CQkvKiBDaGVjayBmb3IgZXhpc3RpbmcgbG9ja2ZpbGUgKi8KKwlwcml2X29mZigpOworCWRlYnVnKEYxMTEsIlRUTE9DSyBjaGVjayBmb3IgbG9jayBCIixsb2NrMixrKTsKKwlpZiAoaykgaWYgKHR0Y2hrcGlkKGxvY2syKSkgewkvKiBDaGVjayBwaWQgZnJvbSBsb2NrZmlsZSAqLworCSAgICBja3N0cm5jcHkoZmxmbmFtLGxvY2syLEZMRk5BTUwpOworCSAgICBkZWJ1ZyhGMTEwLCJUVExPQ0sgaW4gdXNlIixkZXZpY2UsMCk7CisJICAgIGRlYnVnKEYxMDEsIlRUTE9DSyByZXR1cm5zIiwiIiwtMik7CisJICAgIHJldHVybigtMik7CisJfQorICAgIH0KKy8qCisgIEdldCBoZXJlIG9ubHkgaWYgdGhlcmUgaXMgbm8gKG1vcmUpIGxvY2tmaWxlLCBzbyBub3cgd2UgbWFrZSBvbmUgKG9yIHR3bykuLi4KKyAgZmxmbmFtID0gZnVsbCBsb2NrZmlsZSBwYXRobmFtZSwgZS5nLiAiL3Vzci9zcG9vbC91dWNwL0xDSy4uY3VsMHAwIi4KKyAgdG1wbmFtID0gdW5pcXVlIHRlbXBvcmFyeSBmaWxuYW1lLCBlLmcuICIvdXNyL3Nwb29sL3V1Y3AvTFRNUC4ucGlkIi4KKyovCisgICAgY2ttYWttc2coZmxmbmFtLEZMRk5BTUwsbG9ja2RpciwiLyIsbG9ja2ZpbCxOVUxMKTsgLyogU0VUIExJTkUgZGV2aWNlICovCisKKyAgICAvKiBJZiBkaWFsb3V0IGRldmljZSwgYWxzbyBtYWtlIG9uZSBmb3IgY29ycmVzcG9uZGluZyBkaWFsaW4gZGV2aWNlICovCisgICAgbG9jazJbMF0gPSAnXDAnOworICAgIGlmICghc3RybmNtcChkZXZpY2UsImN1IiwyKSAmJiAqdW5pdCAmJiB0dHlkZXhpc3RzKQorICAgICAgY2ttYWttc2cobG9jazIsRkxGTkFNTCxsb2NrZGlyLCIvTENLLi50dHlkIix1bml0LE5VTEwpOworCisgICAgaWYgKChpbnQpc3RybGVuKGxvY2tkaXIpKzEyIDwgTEZOQU1MKQorICAgICAgc3ByaW50Zih0bXBuYW0sIiVzL0xUTVAuJTA1ZCIsbG9ja2RpciwoaW50KSBwaWQpOyAvKiBNYWtlIHRlbXAgbmFtZSAqLworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworCWRlYnVnKEYxMTAsIlRUTE9DSyBmbGZuYW0iLGZsZm5hbSwwKTsKKwlkZWJ1ZyhGMTEwLCJUVExPQ0sgbG9jazIiLGxvY2syLDApOworCWRlYnVnKEYxMTAsIlRUTE9DSyB0bXBuYW0iLHRtcG5hbSwwKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKy8qCisgICBMb2NrZmlsZSBwZXJtaXNzaW9ucy4uLgorICAgNDQ0IGlzIHN0YW5kYXJkLCBIUC1VWCAxMC4wMCB1c2VzIDY2NC4gIEl0IGRvZXNuJ3QgbWF0dGVyLgorICAgS2VybWl0IHVzZXMgNDQ0OyB0aGUgZGlmZmVyZW5jZSBsZXRzIHVzIHRlbGwgd2hldGhlciBLZXJtaXQgY3JlYXRlZAorICAgdGhlIGxvY2sgZmlsZS4KKyovCisgICAgcHJpdl9vbigpOwkJCQkvKiBUdXJuIG9uIHByaXZpbGVnZXMuICovCisgICAgbG9ja2ZkID0gY3JlYXQodG1wbmFtLCAwNDQ0KTsJLyogVHJ5IHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZS4gKi8KKyAgICBpZiAobG9ja2ZkIDwgMCkgewkJCS8qIENyZWF0ZSBmYWlsZWQuICovCisJZGVidWcoRjExMSwiVFRMT0NLIGNyZWF0IGZhaWxlZCIsdG1wbmFtLGVycm5vKTsKKwlpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisJICAgIHBlcnJvcihsb2NrZGlyKTsKKwkgICAgcHJpbnRmKCJVVUNQIG5vdCBpbnN0YWxsZWQgb3IgS2VybWl0IG1pc2NvbmZpZ3VyZWRcbiIpOworCX0gZWxzZSB7CisJICAgIGlmICghcXVpZXQpCisJICAgICAgcGVycm9yKGxvY2tkaXIpOworCSAgICB1bmxpbmsodG1wbmFtKTsJCS8qIEdldCByaWQgb2YgdGhlIHRlbXBvcmFyeSBmaWxlLiAqLworCX0KKwlwcml2X29mZigpOwkJCS8qIFR1cm4gb2ZmIHByaXZpbGVnZXMhISEgKi8KKwlkZWJ1ZyhGMTAxLCJUVExPQ0sgcmV0dXJucyIsIiIsLTEpOworCXJldHVybigtMSk7CQkJLyogUmV0dXJuIGZhaWx1cmUgY29kZS4gKi8KKyAgICB9CisgICAgZGVidWcoRjExMCwiVFRMT0NLIHRlbXAgb2siLHRtcG5hbSwwKTsKKworLyogTm93IHdyaXRlIG91ciBwaWQgaW50byB0aGUgdGVtcCBsb2NrZmlsZSBpbiBpbnRlZ2VyIGZvcm1hdC4gKi8KKworICAgIGkgPSB3cml0ZShsb2NrZmQsIChjaGFyICopJnBpZCwgc2l6ZW9mKHBpZCkpOworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisJZGVidWcoRjEwMSwiVFRMT0NLIHBpZCIsIiIscGlkKTsKKwlkZWJ1ZyhGMTAxLCJUVExPQ0sgc2l6ZW9mIHBpZCIsIiIsc2l6ZW9mKHBpZCkpOworCWRlYnVnKEYxMDEsIlRUTE9DSyB3cml0ZSBwaWQgcmV0dXJucyIsIiIsaSk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKy8qCisgIE5vdyB0cnkgdG8gcmVuYW1lIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byB0aGUgcmVhbCBsb2NrZmlsZSBuYW1lLgorICBUaGlzIHdpbGwgZmFpbCBpZiBhIGxvY2sgZmlsZSBvZiB0aGF0IG5hbWUgYWxyZWFkeSBleGlzdHMsIHdoaWNoCisgIHdpbGwgY2F0Y2ggcmFjZSBjb25kaXRpb25zIHdpdGggb3RoZXIgdXNlcnMuCisqLworICAgIGNsb3NlKGxvY2tmZCk7CQkJLyogQ2xvc2UgdGhlIHRlbXAgbG9ja2ZpbGUuICovCisgICAgY2htb2QodG1wbmFtLDA0NDQpOworCisgICAgdHJpZXMgPSAwOworICAgIHdoaWxlICghaGFzbG9jayAmJiB0cmllcysrIDwgMikgeworCWhhc2xvY2sgPSAobGluayh0bXBuYW0sZmxmbmFtKSA9PSAwKTsgLyogQ3JlYXRlIGEgbGluayB0byBpdC4gKi8KKwlkZWJ1ZyhGMTAxLCJUVExPQ0sgbGluayIsIiIsaGFzbG9jayk7CisJaWYgKGhhc2xvY2spIHsJCQkvKiBJZiB3ZSBtYWRlIHRoZSBsb2NrZmlsZS4uLiAqLworCisjaWZkZWYgQ09NTUVOVAorLyogV2UgY2FuJ3QgZG8gdGhpcyBhbnkgbW9yZSBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYSBmaWxlIGRlc2NyaXB0b3IgeWV0LiAqLworI2lmZGVmIExPQ0tGCQkJCS8qIENhbiBiZSBjYW5jZWxlZCB3aXRoIC1ETk9MT0NLRiAqLworLyoKKyAgQ3JlYXRlIGFuIGFkdmlzb3J5IGxvY2sgb24gdGhlIGRldmljZSB0aHJvdWdoIGl0cyBmaWxlIGRlc2NyaXB0b3IuCisgIFRoaXMgY29kZSBhY3R1YWxseSBzZWVtcyB0byB3b3JrLiAgSWYgaXQgaXMgZXhlY3V0ZWQsIGFuZCB0aGVuIGFub3RoZXIKKyAgcHJvY2VzcyB0cmllcyB0byBvcGVuIHRoZSBzYW1lIGRldmljZSB1bmRlciBhIGRpZmZlcmVudCBuYW1lIHRvIGNpcmN1bXZlbnQKKyAgdGhlIGxvY2tmaWxlLCB0aGV5IGdldCBhICJkZXZpY2UgYnVzeSIgZXJyb3IuCisqLworCSAgICBkZWJ1ZyhGMTAwLCJUVExPQ0sgTE9DS0YgY29kZS4uLiIsIiIsMCk7CisgICAgICAgICAgICB3aGlsZSAoIGxvY2tmKHR0eWZkLCBGX1RMT0NLLCAwTCkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCAiVFRMT0NLIGxvY2tmIGVycm9yIiwgIiIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICBpZiAoKCsrdHJpZXMgPj0gMykgfHwgKGVycm5vICE9IEVBR0FJTikpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IHVubGluayhmbGZuYW0pOyAvKiBSZW1vdmUgdGhlIGxvY2tmaWxlICovCisJCSAgICBpZiAoZXJybm8gPT0gRUFDQ0VTICYmICFxdWlldCkKKwkJICAgICAgcHJpbnRmKCJEZXZpY2UgYWxyZWFkeSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzbG9jayA9IDA7CisJCSAgICBicmVhazsKKwkJfQorICAgICAgICAgICAgICAgIHNsZWVwKDIpOworCSAgICB9CisjZW5kaWYgLyogTE9DS0YgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKwkgICAgaWYgKGhhc2xvY2spIHsJCS8qIElmIHdlIG1hZGUgdGhlIGxvY2tmaWxlIC4uLiAqLworCQlpZiAobG9jazJbMF0pIHsJCS8qIGlmIHRoZXJlIGlzIHRvIGJlIGEgMm5kIGxvY2tmaWxlICovCisJCSAgICBsb2NrZmQgPSBjcmVhdChsb2NrMiwgMDQ0NCk7IC8qIENyZWF0ZSBpdCAqLworCQkgICAgZGVidWcoRjExMSwiVFRMT0NLIGxvY2syIGNyZWF0IiwgbG9jazIsIGxvY2tmZCk7CisJCSAgICBpZiAobG9ja2ZkID4gLTEpIHsJLyogQ3JlYXRlZCBPSywgd3JpdGUgcGlkLiAqLworCQkJd3JpdGUobG9ja2ZkLCAoY2hhciAqKSZwaWQsIHNpemVvZihwaWQpICk7CisJCQljbG9zZShsb2NrZmQpOwkvKiBDbG9zZSBhbmQgKi8KKwkJCWNobW9kKGxvY2syLCAwNDQ0KTsgLyogc2V0IHBlcm1pc3Npb25zLiAqLworCQkgICAgfSBlbHNlIHsJCSAvKiBOb3QgT0ssIGJ1dCBkb24ndCBmYWlsLiAqLworCQkJbG9jazJbMF0gPSAnXDAnOyAvKiBKdXN0IHJlbWVtYmVyIGl0J3Mgbm90IHRoZXJlLiAqLworCQkgICAgfQorCQl9CisJCWJyZWFrOwkJCS8qIGFuZCB3ZSdyZSBkb25lLiAqLworCSAgICB9CisJfQorICAgIH0KKyAgICB1bmxpbmsodG1wbmFtKTsJCQkvKiBVbmxpbmsgKHJlbW92ZSkgdGhlIHRlbXAgZmlsZS4gKi8KKyAgICBwcml2X29mZigpOwkJCQkvKiBUdXJuIG9mZiBwcml2cyAqLworICAgIGkgPSBoYXNsb2NrID8gMCA6IC0xOwkJLyogT3VyIHJldHVybiB2YWx1ZSAqLworICAgIGRlYnVnKEYxMDEsIlRUTE9DSyByZXR1cm5zIiwiIixpKTsKKyAgICByZXR1cm4oaSk7CisjZW5kaWYgLyogSFBVWCAqLworI2VuZGlmIC8qIFVTRVRUWUxPQ0sgKi8KKyNlbmRpZiAvKiAhTk9VVUNQICovCit9CisKKy8qICBUIFQgVSBOIEwgTyBDIEsgICovCisKK3N0YXRpYyBpbnQKK3R0dW5sY2soKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZW1vdmUgVVVDUCBsb2NrZmlsZShzKS4gKi8KKyNpZm5kZWYgTk9VVUNQCisgICAgaW50IHg7CisKKyAgICBkZWJ1ZyhGMTExLCJ0dHVubGNrIixmbGZuYW0saGFzbG9jayk7CisKKyNpZmRlZiBVU0VUVFlMT0NLCisKKyAgICBpZiAoaGFzbG9jayAmJiAqZmxmbmFtKSB7CisJaW50IHg7CisJcHJpdl9vbigpOwkJCS8qIFR1cm4gb24gcHJpdnMgKi8KKyNpZmRlZiBVU0VfVVVfTE9DSworCXggPSB1dV91bmxvY2sobG9ja25hbWUpOworI2Vsc2UgIC8qIFVTRV9VVV9MT0NLICovCisJeCA9IHR0eXVubG9jayhsb2NrbmFtZSk7CS8qIFRyeSB0byB1bmxvY2sgKi8KKyNlbmRpZiAvKiBVU0VfVVVfTE9DSyAqLworCXByaXZfb2ZmKCk7CQkJLyogVHVybiBvZmYgcHJpdnMgKi8KKwlpZiAoeCA8IDAgJiYgIXF1aWV0KQorCSAgcHJpbnRmKCJXYXJuaW5nIC0gQ2FuJ3QgcmVtb3ZlIGxvY2tmaWxlOiAlc1xuIiwgZmxmbmFtKTsKKworCSpmbGZuYW0gPSAnXDAnOwkJCS8qIEVyYXNlIHRoZSBuYW1lLiAqLworCWhhc2xvY2sgPSAwOworCXJldHVybigwKTsKKyAgICB9CisKKyNlbHNlICAvKiBObyB0dHlsb2NrKCkuLi4gKi8KKworICAgIGlmIChoYXNsb2NrICYmICpmbGZuYW0pIHsKKwkvKiBEb24ndCByZW1vdmUgbG9ja2ZpbGUgaWYgd2UgZGlkbid0IG1ha2UgaXQgb3Vyc2VsdmVzICovCisJaWYgKCh4ID0gdHRycGlkKGZsZm5hbSkpICE9IChpbnQpZ2V0cGlkKCkpIHsKKwkgICAgZGVidWcoRjExMSwidHR1bmxjayBsb2NrZmlsZSBzZWl6ZWQiLGZsZm5hbSx4KTsKKwkgICAgcHJpbnRmKCJXYXJuaW5nIC0gTG9ja2ZpbGUgJXMgc2VpemVkIGJ5IHBpZCAlZFxuIiwKKwkJICAgZmxmbmFtLAorCQkgICB4CisJCSAgICk7CisJICAgIHJldHVybigwKTsKKwl9CisJcHJpdl9vbigpOwkJCS8qIFR1cm4gcHJpdmlsZWdlcyBvbi4gICovCisJZXJybm8gPSAwOworCXggPSB1bmxpbmsoZmxmbmFtKTsJCS8qIFJlbW92ZSB0aGUgbG9ja2ZpbGUuICovCisJZGVidWcoRjExMSwidHR1bmxjayB1bmxpbmsiLGZsZm5hbSx4KTsKKwlpZiAoeCA8IDApIHsKKwkgICAgaWYgKGVycm5vICYmICFxdWlldCkKKwkgICAgICBwZXJyb3IodHRubXN2KTsKKwkgICAgcHJpbnRmKCJXYXJuaW5nIC0gQ2FuJ3QgcmVtb3ZlIGxvY2tmaWxlOiAlc1xuIiwgZmxmbmFtKTsKKwl9CisJaGFzbG9jayA9IDA7CisJKmZsZm5hbSA9ICdcMCc7CQkJLyogRXJhc2UgdGhlIG5hbWUuICovCisKKyNpZmRlZiBSVEFJWAorCWVycm5vID0gMDsKKwl4ID0gdW5saW5rKGxrZmxmbik7CQkvKiBSZW1vdmUgbGluayB0byBsb2NrZmlsZSAqLworCWRlYnVnKEYxMTEsInR0dW5sY2sgQUlYIGxpbmsgdW5saW5rIixsa2ZsZm4seCk7CisJaWYgKHggPCAwKSB7CisJICAgIGlmIChlcnJubyAmJiAhcXVpZXQpCisJICAgICAgcGVycm9yKHR0bm1zdik7CisJICAgIHByaW50ZigiV2FybmluZyAtIENhbid0IHJlbW92ZSBsaW5rIHRvIGxvY2tmaWxlOiAlc1xuIiwgbGtmbGZuKTsKKwl9CisJKmxrZmxmbiA9ICdcMCc7CisjZWxzZQorCWlmIChsb2NrMlswXSkgewkJCS8qIElmIHRoZXJlIGlzIGEgc2Vjb25kIGxvY2tmaWxlLCAqLworCSAgICBlcnJubyA9IDA7CisJICAgIHggPSB1bmxpbmsobG9jazIpOwkJLyogIHJlbW92ZSBpdCB0b28uICovCisJICAgIGRlYnVnKEYxMTEsInR0dW5sY2sgbG9jazIgdW5saW5rIixsb2NrMix4KTsKKwkgICAgaWYgKHggPCAwKSB7CisJCWlmIChlcnJubyAmJiAhcXVpZXQpCisJCSAgcGVycm9yKHR0bm1zdik7CisJCXByaW50ZigiV2FybmluZyAtIENhbid0IHJlbW92ZSBzZWNvbmRhcnkgbG9ja2ZpbGU6ICVzXG4iLAorCQkgICAgICAgbG9jazIKKwkJICAgICAgICk7CisJICAgIH0KKwkgICAgbG9jazJbMF0gPSAnXDAnOwkJLyogRm9yZ2V0IGl0cyBuYW1lLiAqLworCX0KKyNlbmRpZiAvKiBSVEFJWCAqLworCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIExPQ0tGCisgICAgICAgIChWT0lEKSBsb2NrZih0dHlmZCwgRl9VTE9DSywgMEwpOyAvKiBSZW1vdmUgYWR2aXNvcnkgbG9jayAqLworI2VuZGlmIC8qIExPQ0tGICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisJcHJpdl9vZmYoKTsJCQkvKiBUdXJuIHByaXZpbGVnZXMgb2ZmLiAqLworICAgIH0KKyNlbmRpZiAvKiBVU0VUVFlMT0NLICovCisjZW5kaWYgLyogIU5PVVVDUCAqLworICAgIHJldHVybigwKTsKK30KKworLyoKKyAgNC4zQlNELXN0eWxlIFVVQ1AgbGluZSBkaXJlY3Rpb24gY29udHJvbC4KKyAgKFN0YW4gQmFyYmVyLCBSaWNlIFUsIDE5ODAtc29tZXRoaW5nLi4uKQorKi8KKyNpZm5kZWYgTk9VVUNQCisjaWZkZWYgQUNVQ05UUkwKK1ZPSUQKK2FjdWNudHJsKGZsYWcsdHRuYW1lKSBjaGFyICpmbGFnLCAqdHRuYW1lOyB7CisgICAgY2hhciB4W0RFVk5BTUxFTiszMl0sICpkZXZpY2UsICpkZXZuYW1lOworCisgICAgaWYgKHN0cmNtcCh0dG5hbWUsQ1RUTkFNKSA9PSAwIHx8IHhsb2NhbCA9PSAwKSAvKiBJZiBub3QgbG9jYWwsICovCisgICAgICByZXR1cm47CQkJCS8qIGp1c3QgcmV0dXJuLiAqLworICAgIGRldmljZSA9ICgoZGV2bmFtZSA9IHh4bGFzdCh0dG5hbWUsJy8nKSkgIT0gTlVMTCA/IGRldm5hbWUrMSA6IHR0bmFtZSk7CisgICAgaWYgKHN0cm5jbXAoZGV2aWNlLCJMQ0suLiIsNCkgPT0gMCkgZGV2aWNlICs9IDU7CisgICAgY2ttYWttc2coeCxERVZOQU1MRU4rMzIsIi91c3IvbGliL3V1Y3AvYWN1Y250cmwgIixmbGFnLCIgIixkZXZpY2UpOworICAgIGRlYnVnKEYxMTAsImNhbGxlZCAiLHgsMCk7CisgICAgenN5c2NtZCh4KTsKK30KKyNlbmRpZiAvKiBBQ1VDTlRSTCAqLworI2VuZGlmIC8qIE5PVVVDUCAqLworCisvKgorICBUIFQgSCBGIEwgTyBXICAtLSAgU2V0IG9yIFJlc2V0IGhhcmR3YXJlIGZsb3cgY29udHJvbC4KKworICBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gY29sbGVjdCBhbGwgaGFyZHdhcmUtZmxvdy1jb250cm9sIHJlbGF0ZWQgY29kZQorICBpbnRvIGEgc2luZ2xlIG1vZHVsZS4gIFRoYW5rcyB0byBSaWNrIFNsYWRrZXkgYW5kIEpvaG4gS29obCBmb3IgbG90cyBvZgorICBoZWxwIGhlcmUuICBPdmVydmlldzoKKworICBIYXJkd2FyZSBmbG93IGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZCBpbiBtYW55IFVOSVggaW1wbGVtZW50aW9ucy4gIEV2ZW4KKyAgd2hlbiBpdCBpcyBzdXBwb3J0ZWQsIHRoZXJlIGlzIG5vIChoYSBoYSkgInN0YW5kYXJkIiBmb3IgdGhlIHByb2dyYW1taW5nCisgIGludGVyZmFjZS4gIEluIGdlbmVyYWwsIDQuM0JTRCBhbmQgZWFybGllciAoc29tZXRpbWVzKSwgNC40QlNELCBTeXN0ZW0gViwKKyAgU3VuT1MsIEFJWCwgZXRjLCBoYXZlIHRvdGFsbHkgZGlmZmVyZW50IG1ldGhvZHMuICAoQW5kLCBub3Qgc3RyaWN0bHkKKyAgcmVsZXZhbnQgaGVyZSwgdGhlIHByb2dyYW1taW5nIGludGVyZmFjZSBvZnRlbiBicmluZ3Mgb25lIG9ubHkgdG8gYSBuby1vcAorICBpbiB0aGUgZGV2aWNlIGRyaXZlciEpCisKKyAgQW1vbmcgYWxsIHRoZXNlLCB3ZSBoYXZlIHR3byBtYWpvciB0eXBlcyBvZiBBUElzOiB0aG9zZSBpbiB3aGljaCBoYXJkd2FyZQorICBmbG93IGNvbnRyb2wgaXMgZGV0ZXJtaW5lZCBieSBiaXRzIGluIHRoZSBzYW1lIHRlcm1pby90ZXJtaW9zL3NndHR5IG1vZGUKKyAgd29yZChzKSB0aGF0IGFyZSB1c2VkIGZvciBjb250cm9sbGluZyBzdWNoIGl0ZW1zIGFzIENCUkVBSyB2cyBSQVcgbW9kZSwgYW5kCisgIHdoaWNoIGFyZSBhbHNvIHVzZWQgYnkgdGhlIHR0dnQoKSwgdHRwa3QoKSwgY29uYmluKCksIGFuZCBjb25jYigpIHJvdXRpbmVzCisgIGZvciBjaGFuZ2luZyB0ZXJtaW5hbCBtb2Rlcy4gIEFuZCB0aG9zZSB0aGF0IHVzZSBlbnRpcmVseSBkaWZmZXJlbnQKKyAgbWVjaGFuaXNtcy4KKworICBJbiB0aGUgZmlyc3QgY2F0ZWdvcnksIGl0IGlzIGltcG9ydGFudCB0aGF0IGFueSBjaGFuZ2UgaW4gdGhlIG1vZGUgYml0cyBiZQorICByZWZsZWN0ZWQgaW4gdGhlIHJlbGV2YW50IHRlcm1pbyhzKS9zZ3R0eSBzdHJ1Y3R1cmUsIHNvIHRoYXQgc3Vic2VxdWVudAorICBjaGFuZ2VzIHRvIHRoYXQgc3RydWN0dXJlIGRvIG5vdCB3aXBlIG91dCB0aGUgZWZmZWN0cyBvZiB0aGlzIHJvdXRpbmUuICBUaGF0CisgIGlzIHdoeSBhIHBvaW50ZXIsIGF0dHJzLCB0byB0aGUgYXBwcm9wcmlhdGUgc3RydWN0dXJlIGlzIHBhc3NlZCBhcyBhCisgIHBhcmFtZXRlciB0byB0aGlzIHJvdXRpbmUuCisKKyAgVGhlIHNlY29uZCBjYXRlZ29yeSBzaG91bGQgZ2l2ZSB1cyBubyB3b3JyaWVzLCBzaW5jZSBhbnkgY2hhbmdlcyB0byBoYXJkd2FyZQorICBmbG93IGNvbnRyb2wgYWNjb21wbGlzaGVkIGJ5IHRoaXMgcm91dGluZSBzaG91bGQgbm90IGFmZmVjdCB0aGUgdGVybWlvKHMpLworICBzZ3R0eSBzdHJ1Y3R1cmVzLCBhbmQgdGhlcmVmb3JlIHdpbGwgbm90IGJlIHVuZG9uZSBieSBsYXRlciBjaGFuZ2VzIHRvIHRoZW0uCisKKyAgVGhlIHNlY29uZCBhcmd1bWVudCwgc3RhdHVzLCBtZWFucyB0byB0dXJuIG9uIGhhcmR3YXJlIGZsb3cgY29udHJvbCBpZgorICBub256ZXJvLCBhbmQgdG8gdHVybiBpdCBvZmYgaWYgemVyby4KKworICBSZXR1cm5zOiAwIG9uIGFwcGFyZW50IHN1Y2Nlc3MsIC0xIG9uIHByb2JhYmxlIGZhaWx1cmUuCisqLworCisvKgorICBUaGUgZm9sbG93aW5nIGJ1c2luZXNzIGlzIGZvciBCU0RJLCB3aGVyZSBpdCB3YXMgZGlzY292ZXJlZCB0aGF0IHR3bworICBzZXBhcmF0ZSBiaXRzLCBDQ1RTX09GTE9XIGFuZCBDUlRTX0lGTE9XLCBhcmUgdXNlZCBpbiBoYXJkd2FyZSBmbG93IGNvbnRyb2wsCisgIGJ1dCBDVFJTQ1RTIGlzIGRlZmluZWQgKGluIDx0ZXJtaW9zLmg+KSB0byBiZSBqdXN0IENDVFNfT0ZMT1cgcmF0aGVyIGJvdGgKKyAgYml0cywgc28gaHdmYyBvbmx5IHdvcmtzIGluIG9uZSBkaXJlY3Rpb24gaWYgeW91IHVzZSBDUlRTQ1RTIHRvIGNvbnRyb2wgaXQuCisgIE90aGVyIDQuNEJTRC1iYXNlZCBVbml4ZXMgc3VjaCBhcyBGcmVlQlNEIDQuMSwgd2hpY2ggdXNlIHRoZXNlIHR3byBiaXRzLAorICBkZWZpbmUgQ1JUU0NUUyBjb3JyZWN0bHkuCisqLworI2lmZGVmIEZJWENSVFNDVFMKKyNpZmRlZiBDUlRTQ1RTCisjaWZkZWYgQ0NUU19PRkxPVworI2lmZGVmIENSVFNfSUZMT1cKKyN1bmRlZiBDUlRTQ1RTCisjZGVmaW5lIENSVFNDVFMgKENSVFNfSUZMT1d8Q0NUU19PRkxPVykKKyNlbmRpZiAvKiBDUlRTX0lGTE9XICovCisjZW5kaWYgLyogQ0NUU19PRkxPVyAqLworI2VuZGlmIC8qIENSVFNDVFMgKi8KKyNlbmRpZiAvKiBGSVhDUlRTQ1RTICovCisKK3N0YXRpYyBpbnQKK3R0aGZsb3coZmxvdywgc3RhdHVzLCBhdHRycykKKyAgICBpbnQgZmxvdywJCQkJLyogVHlwZSBvZiBmbG93IGNvbnRyb2wgKGNrY2RlYi5oKSAqLworICAgIHN0YXR1czsJCQkJLyogTm9uemVybyA9IHR1cm4gaXQgb24gKi8KKwkJCQkJLyogWmVybyA9IHR1cm4gaXQgb2ZmICovCisjaWZkZWYgQlNENDRPUlBPU0lYCQkJLyogUE9TSVggb3IgQlNENDQgKi8KKyAgICBzdHJ1Y3QgdGVybWlvcyAqYXR0cnM7CisjZWxzZQkJCQkJLyogU3lzdGVtIFYgKi8KKyNpZmRlZiBBVFRTVgorI2lmZGVmIEFUVDczMDAKKyNpZmRlZiBVTklYMzUxTQorLyogQVQmVCBVTklYIDMuNTFtIGNhbiBzZXQgYnV0IG5vdCB0ZXN0IGZvciBoYXJkd2FyZSBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgUlRTRkxPVyBDVFNDRAorI2RlZmluZSBDVFNGTE9XIENUU0NECisjZW5kaWYgLyogQVRUNzMwMCAqLworI2VuZGlmIC8qIFVOSVgzNTFNICovCisgICAgc3RydWN0IHRlcm1pbyAqYXR0cnM7CisjZWxzZQkJCQkJLyogQlNELCBWNywgZXRjICovCisgICAgc3RydWN0IHNndHR5YiAqYXR0cnM7CQkvKiBzZ3R0eSBpbmZvLi4uICovCisjZW5kaWYgLyogQVRUU1YgKi8KKyNlbmRpZiAvKiBCU0Q0NE9SUE9TSVggKi8KKy8qIHR0aGZsb3cgKi8geworCisgICAgaW50IHggPSAwOwkJCQkvKiB0dGhmbG93KCkgcmV0dXJuIGNvZGUgKi8KKworI2lmZGVmIFBsYW45CisgICAgcmV0dXJuIHA5dHRoZmxvdyhmbG93LCBzdGF0dXMpOworI2Vsc2UKKworI2lmbmRlZiBPWE9TCQkJCS8qIE5PVCBPbGl2ZXR0aSBYL09TLi4uICovCisvKgorICBGb3IgU3VuT1MgNC4wIGFuZCBsYXRlciBpbiB0aGUgQlNEIGVudmlyb25tZW50IC4uLgorCisgIFRoZSBkZWNsYXJhdGlvbnMgYXJlIGNvcGllZCBhbmQgaW50ZXJwcmV0ZWQgZnJvbSB0aGUgU3lzdGVtIFYgaGVhZGVyIGZpbGVzLAorICBzbyB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIHRvIHB1bGwgaW4gYWxsIHRoZSBTeXN0ZW0gViBqdW5rIHdoZW4gYnVpbGRpbmcKKyAgQy1LZXJtaXQgZm9yIFN1bk9TIGluIHRoZSBCU0QgZW52aXJvbm1lbnQsIHdoaWNoIHdvdWxkIGJlIGRhbmdlcm91cyBiZWNhdXNlCisgIGhhdmluZyB0aG9zZSBzeW1ib2xzIGRlZmluZWQgd291bGQgY2F1c2UgdXMgdG8gdGFrZSB0aGUgd3JvbmcgcGF0aHMgdGhyb3VnaAorICB0aGUgY29kZS4gIFRoZSBjb2RlIGluIHRoaXMgc2VjdGlvbiBpcyB1c2VkIGluIGJvdGggdGhlIEJTRCBhbmQgU3lzIFYgU3VuT1MKKyAgdmVyc2lvbnMuCisqLworI2lmZGVmIFNVTk9TNDEKKy8qCisgIEluIFN1bk9TIDQuMSBhbmQgbGF0ZXIsIHdlIHVzZSB0aGUgUE9TSVggY2FsbHMgcmF0aGVyIHRoYW4gaW9jdGwgY2FsbHMKKyAgYmVjYXVzZSBHTlUgQ0MgdXNlcyBkaWZmZXJlbnQgZm9ybWF0cyBmb3IgdGhlIF9JT3h4eCBtYWNyb3MgdGhhbiByZWd1bGFyIENDOworICB0aGUgUE9TSVggZm9ybXMgd29yayBmb3IgYm90aC4gIEJ1dCB0aGUgUE9TSVggY2FsbHMgYXJlIG5vdCBhdmFpbGFibGUgaW4KKyAgU3VuT1MgNC4wLgorKi8KKyNkZWZpbmUgQ1JUU0NUUyAweDgwMDAwMDAwCQkvKiBSVFMvQ1RTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBUQ1NBTk9XIDAJCQkvKiBEbyBpdCBub3cgKi8KKworICAgIHN0cnVjdCB0ZXJtaW9zIHsKKwl1bnNpZ25lZCBsb25nIGNfaWZsYWc7CQkvKiBJbnB1dCBtb2RlcyAqLworCXVuc2lnbmVkIGxvbmcgY19vZmxhZzsJCS8qIE91dHB1dCBtb2RlcyAqLworCXVuc2lnbmVkIGxvbmcgY19jZmxhZzsJCS8qIENvbnRyb2wgbW9kZXMgKi8KKwl1bnNpZ25lZCBsb25nIGNfbGZsYWc7CQkvKiBMaW5lIGRpc2NpcGxpbmUgbW9kZXMgKi8KKwljaGFyIGNfbGluZTsKKwlDSEFSIGNfY2NbMTddOworICAgIH07CisgICAgc3RydWN0IHRlcm1pb3MgdGVtcDsKKworX1BST1RPVFlQKCBpbnQgdGNnZXRhdHRyLCAoaW50LCBzdHJ1Y3QgdGVybWlvcyAqKSApOworX1BST1RPVFlQKCBpbnQgdGNzZXRhdHRyLCAoaW50LCBpbnQsIHN0cnVjdCB0ZXJtaW9zICopICk7CisvKgorICBXaGVuIENSVFNDVFMgaXMgc2V0LCBTdW5PUyB3b24ndCBkbyBvdXRwdXQgdW5sZXNzIGJvdGggQ1RTIGFuZCBDRCBhcmUKKyAgYXNzZXJ0ZWQuICBTbyB3ZSBkb24ndCBzZXQgQ1JUU0NUUyB1bmxlc3MgQ0QgaXMgdXAuICBUaGlzIHNob3VsZCBiZSBPSywKKyAgc2luY2Ugd2UgZG9uJ3QgbmVlZCBSVFMvQ1RTIGR1cmluZyBkaWFsaW5nLCBhbmQgYWZ0ZXIgZGlhbGluZyBpcyBjb21wbGV0ZSwKKyAgd2Ugc2hvdWxkIGhhdmUgQ0QuICBJZiBub3QsIHdlIHN0aWxsIGNvbW11bmljYXRlLCBidXQgd2l0aG91dCBSVFMvQ1RTLgorKi8KKyAgICBpbnQgbWZsYWdzOwkJCQkvKiBNb2RlbSBzaWduYWwgZmxhZ3MgKi8KKworI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpcGUpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICBpZiAodHRwdHkpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKworICAgIGRlYnVnKEYxMDEsInR0aGZsb3cgU1VOT1M0MSBlbnRyeSBzdGF0dXMiLCIiLHN0YXR1cyk7CisgICAgaWYgKCFzdGF0dXMpIHsJCQkvKiBUdXJuIGhhcmQgZmxvdyBvZmYgKi8KKwlpZiAodGNnZXRhdHRyKHR0eWZkLCAmdGVtcCkgPiAtMSAmJiAvKiBHZXQgZGV2aWNlIGF0dHJpYnV0ZXMgKi8KKwkgICAgKHRlbXAuY19jZmxhZyAmIENSVFNDVFMpKSB7IC8qIENoZWNrIGZvciBSVFMvQ1RTICovCisJICAgIHRlbXAuY19jZmxhZyAmPSB+Q1JUU0NUUzsJLyogSXQncyB0aGVyZSwgcmVtb3ZlIGl0ICovCisJICAgIHggPSB0Y3NldGF0dHIodHR5ZmQsVENTQU5PVywmdGVtcCk7CisJfQorICAgIH0gZWxzZSB7CQkJCS8qIFR1cm4gaGFyZCBmbG93IG9uICovCisJaWYgKGlvY3RsKHR0eWZkLFRJT0NNR0VULCZtZmxhZ3MpID4gLTEgJiYgLyogR2V0IG1vZGVtIHNpZ25hbHMgKi8KKwkgICAgKG1mbGFncyAmIFRJT0NNX0NBUikpIHsJCS8qIENoZWNrIGZvciBDRCAqLworCSAgICBkZWJ1ZyhGMTAwLCJ0dGhmbG93IFN1bk9TIGhhcyBDRCIsIiIsMCk7CisJICAgIGlmICh0Y2dldGF0dHIodHR5ZmQsICZ0ZW1wKSA+IC0xICYmIC8qIEdldCBkZXZpY2UgYXR0cmlidXRlcyAqLworCQkhKHRlbXAuY19jZmxhZyAmIENSVFNDVFMpKSB7IC8qIENoZWNrIGZvciBSVFMvQ1RTICovCisJCXRlbXAuY19jZmxhZyB8PSBDUlRTQ1RTOwkvKiBOb3QgdGhlcmUsIGFkZCBpdCAqLworCQl4ID0gdGNzZXRhdHRyKHR0eWZkLFRDU0FOT1csJnRlbXApOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgeCA9IC0xOworCSAgICBkZWJ1ZyhGMTAwLCJ0dGhmbG93IFN1bk9TIG5vIENEIiwiIiwwKTsKKwl9CisgICAgfQorI2Vsc2UKKyNpZmRlZiBRTlgKKyAgICBzdHJ1Y3QgdGVybWlvcyB0ZW1wOworI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpcGUpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICBpZiAodHRwdHkpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dGhmbG93IFFOWCBlbnRyeSBzdGF0dXMiLCIiLHN0YXR1cyk7CisgICAgaWYgKHRjZ2V0YXR0cih0dHlmZCwgJnRlbXApID4gLTEpIHsJLyogR2V0IGRldmljZSBhdHRyaWJ1dGVzICovCisJaWYgKCFzdGF0dXMpIHsJCQkvKiBUdXJuIGhhcmQgZmxvdyBvZmYgKi8KKwkgICAgaWYgKCh0ZW1wLmNfY2ZsYWcgJiAoSUhGTE9XfE9IRkxPVykpID09IChJSEZMT1d8T0hGTE9XKSkgeworCQl0ZW1wLmNfY2ZsYWcgJj0gfihJSEZMT1d8T0hGTE9XKTsgLyogSXQncyB0aGVyZSwgcmVtb3ZlIGl0ICovCisJCWF0dHJzLT5jX2NmbGFnICY9IH4oSUhGTE9XfE9IRkxPVyk7CisJCXggPSB0Y3NldGF0dHIodHR5ZmQsVENTQU5PVywmdGVtcCk7CisJICAgIH0KKwl9IGVsc2UgewkJCS8qIFR1cm4gaGFyZCBmbG93IG9uICovCisJICAgIGlmICgodGVtcC5jX2NmbGFnICYgKElIRkxPV3xPSEZMT1cpKSAhPSAoSUhGTE9XfE9IRkxPVykpIHsKKwkJdGVtcC5jX2NmbGFnIHw9IChJSEZMT1d8T0hGTE9XKTsgLyogTm90IHRoZXJlLCBhZGQgaXQgKi8KKwkJdGVtcC5jX2lmbGFnICY9IH4oSVhPTnxJWE9GRik7ICAgLyogQnllIHRvIElYT04vSVhPRkYgKi8KKwkJdHRyYXcuY19sZmxhZyB8PSBJRVhURU47ICAgICAgICAgLyogTXVzdCBiZSBvbiAqLworCQl4ID0gdGNzZXRhdHRyKHR0eWZkLFRDU0FOT1csJnRlbXApOworCQlhdHRycy0+Y19jZmxhZyB8PSAoSUhGTE9XfE9IRkxPVyk7CisJCWF0dHJzLT5jX2lmbGFnICY9IH4oSVhPTnxJWE9GRik7CisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKwl4ID0gLTE7CisJZGVidWcoRjEwMCwgInR0aGZsb3cgUU5YIGdldGF0dHIgZmFpbHMiLCAiIiwgMCk7CisgICAgfQorI2Vsc2UKKyNpZmRlZiBQT1NJWF9DUlRTQ1RTCisvKgorICBQT1NJWF9DUlRTQ1RTIGlzIGRlZmluZWQgaW4gY2tjZGViLmggb3Igb24gQ0MgY29tbWFuZCBsaW5lLgorICBOb3RlOiBEbyBub3QgYXNzdW1lIENSVFNDVFMgaXMgYSBvbmUtYml0IGZpZWxkIQorKi8KKyAgICBzdHJ1Y3QgdGVybWlvcyB0ZW1wOworI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpcGUpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICBpZiAodHRwdHkpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dGhmbG93IFBPU0lYX0NSVFNDVFMgZW50cnkgc3RhdHVzIiwiIixzdGF0dXMpOworICAgIGVycm5vID0gMDsKKyAgICB4ID0gdGNnZXRhdHRyKHR0eWZkLCAmdGVtcCk7CisgICAgZGVidWcoRjExMSwidHRoZmxvdyBQT1NJWF9DUlRTQ1RTIHRjZ2V0YXR0ciIsY2tpdG9hKHgpLGVycm5vKTsKKyAgICBlcnJubyA9IDA7CisgICAgaWYgKHggPCAwKSB7CisJeCA9IC0xOworICAgIH0gZWxzZSB7CisJaWYgKCFzdGF0dXMpIHsJCQkvKiBUdXJuIGhhcmQgZmxvdyBvZmYgKi8KKwkgICAgaWYgKAorI2lmZGVmIENPTU1FTlQKKwkJLyogVGhpcyBjYW4gZmFpbCBiZWNhdXNlIG9mIHNpZ24gZXh0ZW5zaW9uICovCisJCS8qIGUuZy4gaW4gTGludXggd2hlcmUgaXQncyBCaXQgMzEgKi8KKwkJKHRlbXAuY19jZmxhZyAmIENSVFNDVFMpID09IENSVFNDVFMKKyNlbHNlCisJCSh0ZW1wLmNfY2ZsYWcgJiBDUlRTQ1RTKSAhPSAwCisjZW5kaWYgLyogQ09NTUVOVCAqLworCQkpIHsKKwkJdGVtcC5jX2NmbGFnICY9IH5DUlRTQ1RTOyAvKiBJdCdzIHRoZXJlLCByZW1vdmUgaXQgKi8KKwkJYXR0cnMtPmNfY2ZsYWcgJj0gfkNSVFNDVFM7CisJCXggPSB0Y3NldGF0dHIodHR5ZmQsVENTQU5PVywmdGVtcCk7CisJCWRlYnVnKEYxMTEsInR0aGZsb3cgUE9TSVhfQ1JUU0NUUyBPRkYgdGNzZXRhdHRyIiwKKwkJICAgICAgY2tpdG9hKHgpLGVycm5vKTsKKwkgICAgfQorCX0gZWxzZSB7CQkJLyogVHVybiBoYXJkIGZsb3cgb24gKi8KKwkgICAgaWYgKAorI2lmZGVmIENPTU1FTlQKKwkJLyogVGhpcyBjYW4gZmFpbCBiZWNhdXNlIG9mIHNpZ24gZXh0ZW5zaW9uICovCisJCSh0ZW1wLmNfY2ZsYWcgJiBDUlRTQ1RTKSAhPSBDUlRTQ1RTCisjZWxzZQorCQkodGVtcC5jX2NmbGFnICYgQ1JUU0NUUykgPT0gMAorI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkJKSB7CisJCXRlbXAuY19jZmxhZyB8PSBDUlRTQ1RTOyAvKiBOb3QgdGhlcmUsIGFkZCBpdCAqLworCQl0ZW1wLmNfaWZsYWcgJj0gfihJWE9OfElYT0ZGfElYQU5ZKTsgLyogQnllIHRvIElYT04vSVhPRkYgKi8KKwkJeCA9IHRjc2V0YXR0cih0dHlmZCxUQ1NBTk9XLCZ0ZW1wKTsKKwkJZGVidWcoRjExMSwidHRoZmxvdyBQT1NJWF9DUlRTQ1RTIE9OIHRjc2V0YXR0ciIsCisJCSAgICAgIGNraXRvYSh4KSxlcnJubyk7CisJCWF0dHJzLT5jX2NmbGFnIHw9IENSVFNDVFM7CisJCWF0dHJzLT5jX2lmbGFnICY9IH4oSVhPTnxJWE9GRnxJWEFOWSk7CisJICAgIH0KKwl9CisgICAgfQorI2Vsc2UKKyNpZmRlZiBTVU5PUzQKKy8qCisgIFN1bk9TIDQuMCAoYW5kIG1heWJlIGVhcmxpZXI/KS4gIFRoaXMgY29kZSBpcyBkYW5nZXJvdXMgYmVjYXVzZSBpdAorICBwcmV2ZW50cyBjb21waWxhdGlvbiB3aXRoIEdOVSBnY2MsIHdoaWNoIHVzZXMgZGlmZmVyZW50IGZvcm1hdHMgZm9yIHRoZQorICBfSU9SeHh4IG1hY3JvcyB0aGFuIHJlZ3VsYXIgY2MuICBTdW5PUyA0LjEgYW5kIGxhdGVyIGNhbiB1c2UgdGhlIFBPU0lYCisgIHJvdXRpbmVzIGFib3ZlLCB3aGljaCB3b3JrIGZvciBib3RoIGNjIGFuZCBnY2MuCisqLworI2RlZmluZSBUQ0dFVFMgX0lPUihULCA4LCBzdHJ1Y3QgdGVybWlvcykgLyogR2V0IG1vZGVzIGludG8gdGVybWlvcyBzdHJ1Y3QgKi8KKyNkZWZpbmUgVENTRVRTIF9JT1coVCwgOSwgc3RydWN0IHRlcm1pb3MpIC8qIFNldCBtb2RlcyBmcm9tIHRlcm1pb3Mgc3RydWN0ICovCisjZGVmaW5lIENSVFNDVFMgMHg4MDAwMDAwMAkJICAvKiBSVFMvQ1RTIGZsb3cgY29udHJvbCAqLworCisgICAgc3RydWN0IHRlcm1pb3MgeworCXVuc2lnbmVkIGxvbmcgY19pZmxhZzsJCS8qIElucHV0IG1vZGVzICovCisJdW5zaWduZWQgbG9uZyBjX29mbGFnOwkJLyogT3V0cHV0IG1vZGVzICovCisJdW5zaWduZWQgbG9uZyBjX2NmbGFnOwkJLyogQ29udHJvbCBtb2RlcyAqLworCXVuc2lnbmVkIGxvbmcgY19sZmxhZzsJCS8qIExpbmUgZGlzY2lwbGluZSBtb2RlcyAqLworCWNoYXIgY19saW5lOworCUNIQVIgY19jY1sxN107CisgICAgfTsKKyAgICBzdHJ1Y3QgdGVybWlvcyB0ZW1wOworI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpcGUpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICBpZiAodHRwdHkpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dGhmbG93IGVudHJ5IHN0YXR1cyIsIiIsc3RhdHVzKTsKKyAgICBpZiAoaW9jdGwodHR5ZmQsVENHRVRTLCZ0ZW1wKSA+IC0xKSB7IC8qIEdldCB0ZXJtaW5hbCBtb2Rlcy4gKi8KKwlpZiAoc3RhdHVzKSB7CQkJLyogVHVybiBoYXJkIGZsb3cgb24gKi8KKwkgICAgdGVtcC5jX2NmbGFnIHw9IENSVFNDVFM7CS8qIEFkZCBSVFMvQ1RTIHRvIHRoZW0uICovCisJICAgIHggPSBpb2N0bCh0dHlmZCxUQ1NFVFMsJnRlbXApOyAvKiBTZXQgdGhlbSBhZ2Fpbi4gKi8KKwkgICAgYXR0cnMtPmNfY2ZsYWcgfD0gQ1JUU0NUUzsJLyogQWRkIHRvIGdsb2JhbCBpbmZvLiAqLworCX0gZWxzZSB7CQkJLyogVHVybiBoYXJkIGZsb3cgb2ZmICovCisJICAgIHRlbXAuY19jZmxhZyAmPSB+Q1JUU0NUUzsKKwkgICAgeCA9IGlvY3RsKHR0eWZkLFRDU0VUUywmdGVtcCk7CisJICAgIGF0dHJzLT5jX2NmbGFnICY9IH5DUlRTQ1RTOworCX0KKyAgICB9CisjZWxzZQkJCQkJLyogTm90IFN1bk9TIDQuMCBvciBsYXRlciAqLworI2lmZGVmIEFJWFJTCQkJCS8qIElCTSBBSVggUlMvNjAwMCAqLworI2lmbmRlZiBBSVg0MQkJCQkvKiBCdXQgb25seSBwcmUtNC54ID09IFNWUjQgKi8KKyNpZmRlZiBORVRDTUQKKyAgICBpZiAodHRwaXBlKSByZXR1cm4oMCk7CisjZW5kaWYgLyogTkVUQ01EICovCisjaWZkZWYgTkVUUFRZCisgICAgaWYgKHR0cHR5KSByZXR1cm4oMCk7CisjZW5kaWYgLyogTkVUUFRZICovCisgICAgaWYgKHN0YXR1cykgeworCWlmICgoeCA9IGlvY3RsKHR0eWZkLCBUWEFERENELCAicnRzIikpIDwgMCAmJiBlcnJubyAhPSBFQlVTWSkKKwkgIGRlYnVnKEYxMDAsImhhcmRmbG93IFRYQUREQ0QgKHJ0cykgZXJyb3IiLCAiIiwgMCk7CisgICAgfSBlbHNlIHsKKwlpZiAoKHggPSBpb2N0bCh0dHlmZCwgVFhERUxDRCwgInJ0cyIpKSA8IDAgJiYgZXJybm8gIT0gRUlOVkFMKQorCSAgZGVidWcoRjEwMCwiaGFyZGZsb3cgVFhERUxDRCAocnRzKSBlcnJvciIsICIiLCAwKTsKKyAgICB9CisjZW5kaWYgLyogQUlYNDEgKi8KKyNlbHNlCQkJCQkvKiBOb3QgQUlYIFJTLzYwMDAgKi8KKworI2lmZGVmIEFUVFNWCQkJCS8qIFN5c3RlbSBWLi4uICovCisKKyNpZmRlZiBDS19TQ09WNQkJCQkvKiBTQ08gT3BlbiBTZXJ2ZXIgNS4wICovCisjZGVmaW5lIENLX1NDT1VOSVgKKyNlbHNlCisjaWZkZWYgTV9VTklYCQkJCS8qIFNDTyBVTklYIDMuMnY0Lnggb3IgZWFybGllciAqLworI2RlZmluZSBDS19TQ09VTklYCisjZW5kaWYgLyogTV9VTklYICovCisjZW5kaWYgLyogQ0tfU0NPVjUgKi8KKworI2lmZGVmIFNDT19GT1JDRV9SVFNYT0ZGCisjaWZkZWYgQ0tfU0NPVU5JWAkJCS8qIEJ1dCBub3QgU0NPIE9wZW5TZXJ2ZXIgNS4wLjQgKi8KKyNpZmRlZiBTQ09fT1NSNTA0CQkJLyogb3IgbGF0ZXIuLi4gKi8KKyN1bmRlZiBDS19TQ09VTklYCisjZW5kaWYgLyogU0NPX09TUjUwNCAqLworI2VuZGlmIC8qIENLX1NDT1VOSVggKi8KKyNlbmRpZiAvKiBTQ09fRk9SQ0VfUlRTWE9GRiAqLworCisjaWZkZWYgQ0tfU0NPVU5JWAorI2lmZGVmIFBPU0lYCisgICAgc3RydWN0IHRlcm1pb3MgdGVtcDsKKyNpZmRlZiBORVRDTUQKKyAgICBpZiAodHRwaXBlKSByZXR1cm4oMCk7CisjZW5kaWYgLyogTkVUQ01EICovCisjaWZkZWYgTkVUUFRZCisgICAgaWYgKHR0cHR5KSByZXR1cm4oMCk7CisjZW5kaWYgLyogTkVUUFRZICovCisgICAgZGVidWcoRjEwMSwidHRoZmxvdyBTQ09VTklYIFBPU0lYIGVudHJ5IHN0YXR1cyIsIiIsc3RhdHVzKTsKKyAgICBlcnJubyA9IDA7CisgICAgeCA9IHRjZ2V0YXR0cih0dHlmZCwgJnRlbXApOworICAgIGRlYnVnKEYxMTEsInR0aGZsb3cgU0NPIFVOSVggUE9TSVggdGNnZXRhdHRyIixja2l0b2EoeCksZXJybm8pOworI2Vsc2UgLyogUE9TSVggKi8KKyAgICBzdHJ1Y3QgdGVybWlvIHRlbXA7CisjaWZkZWYgTkVUQ01ECisgICAgaWYgKHR0cGlwZSkgcmV0dXJuKDApOworI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorICAgIGlmICh0dHB0eSkgcmV0dXJuKDApOworI2VuZGlmIC8qIE5FVFBUWSAqLworICAgIGRlYnVnKEYxMDEsInR0aGZsb3cgU0NPVU5JWCBub24tUE9TSVggZW50cnkgc3RhdHVzIiwiIixzdGF0dXMpOworICAgIHggPSBpb2N0bCh0dHlmZCwgVENHRVRBLCAmdGVtcCk7CisgICAgZGVidWcoRjExMSwidHRoZmxvdyBTQ08gVU5JWCBub24tUE9TSVggVENHRVRBIixja2l0b2EoeCksZXJybm8pOworI2VuZGlmIC8qIFBPU0lYICovCisvKgorICBUaGlzIGlzIG5vdCByZWFsbHkgUE9TSVgsIHNpbmNlIFBPU0lYIGRvZXMgbm90IGRlYWwgd2l0aCBoYXJkd2FyZSBmbG93CisgIGNvbnRyb2wsIGJ1dCB3ZSBhcmUgdXNpbmcgdGhlIFBPU0lYIEFQSXMuICBJbiBmYWN0LCBSVFNGTE9XIGFuZCBDVFNGTE9XCisgIGFyZSBkZWZpbmVkIGluIHRlcm1pby5oLCBidXQgd2l0aGluICNpZm5kZWYgX1BPU0lYX1NPVVJDRS4uI2VuZGlmLiAgU28KKyAgbGV0J3MgdHJ5IGZvcmNpbmcgdGhlaXIgZGVmaW5pdGlvbnMgaGVyZS4KKyovCisjaWZuZGVmIENUU0ZMT1cKKyNkZWZpbmUgQ1RTRkxPVyAwMDIwMDAwCisgICAgZGVidWcoRjEwMSwidHRoZmxvdyBTQ08gZGVmaW5pbmcgQ1RTRkxPVyIsIiIsQ1RTRkxPVyk7CisjZWxzZQorICAgIGRlYnVnKEYxMDEsInR0aGZsb3cgU0NPIENUU0ZMT1ciLCIiLENUU0ZMT1cpOworI2VuZGlmIC8qIENUU0ZMT1cgKi8KKyNpZm5kZWYgUlRTRkxPVworI2RlZmluZSBSVFNGTE9XIDAwNDAwMDAKKyAgICBkZWJ1ZyhGMTAxLCJ0dGhmbG93IFNDTyBkZWZpbmluZyBSVFNGTE9XIiwiIixSVFNGTE9XKTsKKyNlbHNlCisgICAgZGVidWcoRjEwMSwidHRoZmxvdyBTQ08gUlRTRkxPVyIsIiIsUlRTRkxPVyk7CisjZW5kaWYgLyogUlRTRkxPVyAqLworI2lmbmRlZiBPUlRTRkwKKyNkZWZpbmUgT1JUU0ZMIDAxMDAwMDAKKyAgICBkZWJ1ZyhGMTAxLCJ0dGhmbG93IFNDTyBkZWZpbmluZyBPUlRTRkwiLCIiLE9SVFNGTCk7CisjZWxzZQorICAgIGRlYnVnKEYxMDEsInR0aGZsb3cgU0NPIE9SVFNGTCIsIiIsT1JUU0ZMKTsKKyNlbmRpZiAvKiBPUlRTRkwgKi8KKworICAgIGlmICh4ICE9IC0xKSB7CisJaWYgKHN0YXR1cykgewkJCS8qIFR1cm4gaXQgT04gKi8KKwkgICAgdGVtcC5jX2NmbGFnIHw9IFJUU0ZMT1d8Q1RTRkxPVzsKKwkgICAgYXR0cnMtPmNfY2ZsYWcgfD0gUlRTRkxPV3xDVFNGTE9XOworI2lmZGVmIE9SVFNGTAorCSAgICB0ZW1wLmNfY2ZsYWcgJj0gfk9SVFNGTDsKKwkgICAgYXR0cnMtPmNfY2ZsYWcgJj0gfk9SVFNGTDsKKyNlbmRpZiAvKiBPUlRTRkwgKi8KKwkgICAgdGVtcC5jX2lmbGFnICY9IH4oSVhPTnxJWE9GRnxJWEFOWSk7CisJICAgIGF0dHJzLT5jX2lmbGFnICY9IH4oSVhPTnxJWE9GRnxJWEFOWSk7CisJfSBlbHNlIHsJCQkvKiBUdXJuIGl0IE9GRiAqLworI2lmZGVmIE9SVFNGTAorCSAgICB0ZW1wLmNfY2ZsYWcgJj0gfihSVFNGTE9XfENUU0ZMT1d8T1JUU0ZMKTsKKwkgICAgYXR0cnMtPmNfY2ZsYWcgJj0gfihSVFNGTE9XfENUU0ZMT1d8T1JUU0ZMKTsKKyNlbHNlICAvKiBPUlRTRkwgKi8KKwkgICAgdGVtcC5jX2NmbGFnICY9IH4oUlRTRkxPV3xDVFNGTE9XKTsKKwkgICAgYXR0cnMtPmNfY2ZsYWcgJj0gfihSVFNGTE9XfENUU0ZMT1cpOworI2VuZGlmIC8qIE9SVFNGTCAqLworCX0KKyNpZmRlZiBQT1NJWAorCXggPSB0Y3NldGF0dHIodHR5ZmQsIFRDU0FEUkFJTiwgJnRlbXApOworI2Vsc2UKKwl4ID0gaW9jdGwodHR5ZmQsIFRDU0VUQSwgJnRlbXApOworI2VuZGlmIC8qIFBPU0lYICovCisJZGVidWcoRjEwMSwidHRoZmxvdyBTQ08gc2V0IG1vZGVzIiwiIix4KTsKKyAgICB9CisjZWxzZSAvKiBOb3QgU0NPIFVOSVggKi8KKyNpZmRlZiBORVRDTUQKKyAgICBpZiAodHRwaXBlKSByZXR1cm4oMCk7CisjZW5kaWYgLyogTkVUQ01EICovCisjaWZkZWYgTkVUUFRZCisgICAgaWYgKHR0cHR5KSByZXR1cm4oMCk7CisjZW5kaWYgLyogTkVUUFRZICovCisgICAgaWYgKCFzdGF0dXMpIHsJCQkvKiBUdXJuIGl0IE9GRiAqLworI2lmZGVmIFJUU1hPRkYKKwlkZWJ1ZyhGMTAwLCJ0dGhmbG93IEFUVFNWIFJUUy9DVFMgT0ZGIiwiIiwwKTsKKwlyY3RzeC54X2hmbGFnICY9IH4oUlRTWE9GRnxDVFNYT04pOworI2lmZGVmIFRDU0VUWAorCXggPSBpb2N0bCh0dHlmZCxUQ1NFVFgsJnJjdHN4KTsKKwlkZWJ1ZyhGMTAxLCJ0dGhmbG93IEFUVFNWIFRDU0VUWCBPRkYiLCIiLHgpOworI2Vsc2UKKwl4ID0gLTEKKwlkZWJ1ZyhGMTAwLCJ0dGhmbG93IFRDU0VUWCBub3QgZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYgLyogVENTRVRYICovCisjZWxzZQorCWRlYnVnKEYxMDAsInR0aGZsb3cgQVRUU1YgUlRTWE9GRiBub3QgZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYgLyogUlRTWE9GRiAqLworI2lmZGVmIERUUlhPRkYKKwlkZWJ1ZyhGMTAwLCJ0dGhmbG93IEFUVFNWIERUUi9DRCBPRkYiLCIiLDApOworCXJjdHN4LnhfaGZsYWcgJj0gfihEVFJYT0ZGfENEWE9OKTsKKwl4ID0gaW9jdGwodHR5ZmQsVENTRVRYLCZyY3RzeCk7CisJZGVidWcoRjEwMSwidHRoZmxvdyBBVFRTViBEVFJYT0ZGIE9GRiIsIiIseCk7CisjZWxzZQorCWRlYnVnKEYxMDAsInR0aGZsb3cgQVRUU1YgRFRSWE9GRiBub3QgZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYgLyogRFRSWE9GRiAqLworICAgIH0gZWxzZSB7CQkJCS8qIFR1cm4gaXQgT04uICovCisJaWYgKGZsb3cgPT0gRkxPX1JUU0MpIHsJLyogUlRTL0NUUyBGbG93IGNvbnRyb2wuLi4gKi8KKwkgICAgZGVidWcoRjEwMCwidHRoZmxvdyBBVFRTViBSVFMvQ1RTIE9OIiwiIiwwKTsKKyNpZmRlZiBSVFNYT0ZGCisJICAgIC8qIFRoaXMgaXMgdGhlIHByZWZlcnJlZCB3YXksIGFjY29yZGluZyB0byBTVklEMyAqLworI2lmZGVmIFRDR0VUWAorCSAgICB4ID0gaW9jdGwodHR5ZmQsVENHRVRYLCZyY3RzeCk7CisJICAgIGRlYnVnKEYxMDEsInR0aGZsb3cgVENHRVRYIiwiIix4KTsKKwkgICAgaWYgKHggPiAtMSkgeworCQlyY3RzeC54X2hmbGFnIHw9IFJUU1hPRkYgfCBDVFNYT047CisJCXggPSBpb2N0bCh0dHlmZCxUQ1NFVFgsJnJjdHN4KTsKKwkJZGVidWcoRjEwMCwidHRoZmxvdyBBVFRTViBpb2N0bCIsIiIseCk7CisJICAgIH0KKyNlbHNlCisJICAgIGRlYnVnKEYxMDAsInR0aGZsb3cgVENHRVRYIG5vdCBkZWZpbmVkIiwiIiwwKTsKKwkgICAgeCA9IC0xCisjZW5kaWYgLyogVENHRVRYICovCisjZWxzZQorCSAgICBkZWJ1ZyhGMTAwLCJ0dGhmbG93IFJUU1hPRkYgbm90IGRlZmluZWQiLCIiLDApOworCSAgICB4ID0gLTE7CisjZW5kaWYgLyogUlRTWE9GRiAqLworCX0gZWxzZSBpZiAoZmxvdyA9PSBGTE9fRFRSQykgewkvKiBEVFIvQ0QgRmxvdyBjb250cm9sLi4uICovCisJICAgIGRlYnVnKEYxMDAsInR0aGZsb3cgQVRUU1YgRFRSL0NEIE9OIiwiIiwwKTsKKyNpZmRlZiBEVFJYT0ZGCisJICAgIC8qIFRoaXMgaXMgc3RyYWlnaHQgb3V0IG9mIFNWSUQgUjQgKi8KKwkgICAgaWYgKGlvY3RsKHR0eWZkLFRDR0VUWCwmcmN0c3gpID4gLTEpIHsKKwkJcmN0c3gueF9oZmxhZyAmPSB+KERUUlhPRkZ8Q0RYT04pOworCQl4ID0gaW9jdGwodHR5ZmQsVENTRVRYLCZyY3RzeCk7CisJICAgIH0KKyNlbHNlCisJICAgIGRlYnVnKEYxMDAsInR0aGZsb3cgQVRUU1YgRFRSWE9GRiBub3QgZGVmaW5lZCIsIiIsMCk7CisJICAgIHggPSAtMTsKKyNlbmRpZiAvKiBEVFJYT0ZGICovCisJfQorICAgIH0KKyNlbmRpZiAvKiBDS19TQ09VTklYICovCisKKyNlbHNlIC8qIG5vdCBTeXN0ZW0gVi4uLiAqLworCisjaWZkZWYgQ0tfRFRSQ1RTCisjaWZkZWYgTERPRFRSCisjaWZkZWYgTERPQ1RTCisjaWZkZWYgTkVUQ01ECisgICAgaWYgKHR0cGlwZSkgcmV0dXJuKDApOworI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorICAgIGlmICh0dHB0eSkgcmV0dXJuKDApOworI2VuZGlmIC8qIE5FVFBUWSAqLworICAgIHggPSBMRE9EVFIgfCBMRE9DVFM7CQkvKiBGb3VuZCBvbmx5IG9uIFVURUs/ICovCisgICAgaWYgKGZsb3cgPT0gRkxPX0RUUlQgJiYgc3RhdHVzKSB7CS8qIFVzZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgKi8KKwlpZiAobG1vZGVmKSB7CisJICAgIHggPSBpb2N0bCh0dHlmZCxUSU9DTEJJUywmeCk7CisJICAgIGlmICh4IDwgMCkgeworCSAgICAgICAgZGVidWcoRjEwMCwiaGFyZGZsb3cgVElPQ0xCSVMgZXJyb3IiLCIiLDApOworCSAgICB9IGVsc2UgeworCQlsbW9kZWYrKzsKKwkJZGVidWcoRjEwMCwiaGFyZGZsb3cgVElPQ0xCSVMgb2siLCIiLDApOworCSAgICB9CisJfQorICAgIH0gZWxzZSB7CisJaWYgKGxtb2RlZikgeworCSAgICB4ID0gaW9jdGwodHR5ZmQsVElPQ0xCSUMsJngpOworCSAgICBpZiAoeCA8IDApIHsKKwkgICAgICAgIGRlYnVnKEYxMDAsImhhcmRmbG93IFRJT0NMQklDIGVycm9yIiwiIiwwKTsKKwkgICAgfSBlbHNlIHsKKwkJbG1vZGVmKys7CisJCWRlYnVnKEYxMDAsImhhcmRmbG93IFRJT0NMQklDIG9rIiwiIiwwKTsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYgLyogTERPRFRSICovCisjZW5kaWYgLyogTERPQ1RTICovCisjZW5kaWYgLyogQ0tfRFRSQ1RTICovCisjZW5kaWYgLyogQVRUU1YgKi8KKyNlbmRpZiAvKiBBSVhSUyAqLworI2VuZGlmIC8qIFNVTk9TNCAqLworI2VuZGlmIC8qIFFOWCAqLworI2VuZGlmIC8qIFBPU0lYX0NSVFNDVFMgKi8KKyNlbmRpZiAvKiBTVU5PUzQxICovCisKKyNlbHNlIC8qIE9YT1MgKi8KKworICAgIHN0cnVjdCB0ZXJtaW9zIHRlbXA7CQkvKiBPbGl2ZXR0aSBYL09TIC4uLiAqLworCisjaWZkZWYgTkVUQ01ECisgICAgaWYgKHR0cGlwZSkgcmV0dXJuKDApOworI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorICAgIGlmICh0dHB0eSkgcmV0dXJuKDApOworI2VuZGlmIC8qIE5FVFBUWSAqLworICAgIHggPSBpb2N0bCh0dHlmZCxUQ0dFVFMsJnRlbXApOworICAgIGlmICh4ID09IDApIHsKKwl0ZW1wLmNfY2ZsYWcgJj0gfihDUlRTQ1RTfENEVFJDVFN8Q0JSS0ZMT1d8Q0RUUkRTUnxDUlRTRFNSKTsKKwlpZiAoc3RhdHVzKSB7CisJICAgIHN3aXRjaCAoZmxvdykgeworCSAgICAgIGNhc2UgRkxPX1JUU0M6IHRlbXAuY19jZmxhZyB8PSBDUlRTQ1RTOyAvKiBSVFMvQ1RTIChoYXJkKSAqLworCQlicmVhazsKKwkgICAgICBjYXNlIEZMT19EVFJUOiB0ZW1wLmNfY2ZsYWcgfD0gQ0RUUkNUUzsgLyogRFRSL0NUUyAoaGFyZCkgKi8KKwkJYnJlYWs7CisJICAgIH0KKwl9CisJeCA9IGlvY3RsKHR0eWZkLFRDU0VUUywmdGVtcCk7CisgICAgfQorI2VuZGlmIC8qIE9YT1MgKi8KKyAgICByZXR1cm4oeCk7CisKKyNlbmRpZiAvKiBQbGFuOSAqLworfQorCisvKiAgVCBUIFAgSyBUICAtLSAgQ29uZGl0aW9uIHRoZSBjb21tdW5pY2F0aW9uIGxpbmUgZm9yIHBhY2tldHMgKi8KKy8qICAgICAgICAgICAgICAgICBvciBmb3IgbW9kZW0gZGlhbGluZyAqLworCisvKgorICBJZiBjYWxsZWQgd2l0aCBzcGVlZCA+IC0xLCBhbHNvIHNldCB0aGUgc3BlZWQuCisgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorCisgIE5PVEU6IHRoZSAieGZsb3ciIHBhcmFtZXRlciBpcyBzdXBwb3NlZCB0byBiZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCisgIHR5cGUgb2YgZmxvdyBjb250cm9sLCBidXQgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgdGhpcyBwYXJhbWV0ZXIgaXMgYWxzbworICB1c2VkIHRvIGluZGljYXRlIHRoYXQgd2UgYXJlIGRpYWxpbmcuICBUaGVyZWZvcmUsIHdoZW4gdGhlIHRydWUgZmxvdworICBjb250cm9sIHNldHRpbmcgaXMgbmVlZGVkLCB3ZSBhY2Nlc3MgdGhlIGV4dGVybmFsIHZhcmlhYmxlICJmbG93IiwgcmF0aGVyCisgIHRoYW4gdHJ1c3Rpbmcgb3VyICJ4ZmxvdyIgYXJndW1lbnQuCisqLworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3R0cGt0KGxvbmcgc3BlZWQsIGludCB4ZmxvdywgaW50IHBhcml0eSkKKyNlbHNlCit0dHBrdChzcGVlZCx4ZmxvdyxwYXJpdHkpIGxvbmcgc3BlZWQ7IGludCB4ZmxvdywgcGFyaXR5OworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0dHBrdCAqLyB7CisjaWZuZGVmIE5PTE9DQUwKKyAgICBpbnQgczI7CisgICAgaW50IHMgPSAtMTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgaW50IHg7CisgICAgZXh0ZXJuIGludCBmbG93OwkJCS8qIFJFQUwgZmxvdy1jb250cm9sIHNldHRpbmcgKi8KKworICAgIGlmICh0dHlmZCA8IDApIHJldHVybigtMSk7ICAgICAgICAgIC8qIE5vdCBvcGVuLiAqLworCisgICAgZGVidWcoRjEwMSwidHRwa3QgcGFyaXR5IiwiIixwYXJpdHkpOworICAgIGRlYnVnKEYxMDEsInR0cGt0IHhmbG93IiwiIix4Zmxvdyk7CisgICAgZGVidWcoRjEwMSwidHRwa3Qgc3BlZWQiLCIiLChpbnQpIHNwZWVkKTsKKworICAgIHR0cHJ0eSA9IHBhcml0eTsgICAgICAgICAgICAgICAgICAgIC8qIExldCBvdGhlciB0dCBmdW5jdGlvbnMgc2VlIHRoZXNlLiAqLworICAgIHR0c3BlZWQgPSBzcGVlZDsJCQkvKiBNYWtlIGdsb2JhbCBjb3B5IGZvciB0aGlzIG1vZHVsZSAqLworICAgIHR0cG1zayA9IHR0cHJ0eSA/IDAxNzcgOiAwMzc3OwkvKiBQYXJpdHkgc3RyaXBwaW5nIG1hc2sgKi8KKyNpZmRlZiBQQVJTRU5TRQorICAgIG5lZWRwY2hrID0gdHRwcnR5ID8gMCA6IDE7CQkvKiBQYXJpdHkgY2hlY2sgbmVlZGVkPyAqLworI2Vsc2UKKyAgICBuZWVkcGNoayA9IDA7CisjZW5kaWYgLyogUEFSU0VOU0UgKi8KKworICAgIGRlYnVnKEYxMDEsInR0cGt0IHR0cG1zayIsIiIsdHRwbXNrKTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dHBrdCBuZXRjb25uIiwiIixuZXRjb25uKTsKKworI2lmZGVmIE5FVENPTk4JCQkJLyogTm8gbW9kZS1jaGFuZ2luZyBmb3IgdGVsbmV0ICovCisgICAgaWYgKG5ldGNvbm4pIHsKKyNpZmRlZiBUQ1BTT0NLRVQKKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgICAgICBpZiAodHRuZXQgPT0gTkVUX1RDUEIpIHsJLyogQnV0IHR1cm4gb2ZmIE5hZ2xlICovCisgICAgICAgICAgICBleHRlcm4gaW50IHRjcF9ub2RlbGF5OworICAgICAgICAgICAgbm9kZWxheV9zYXYgPSB0Y3Bfbm9kZWxheTsKKyAgICAgICAgICAgIG5vX2RlbGF5KHR0eWZkLDEpOworICAgICAgICB9CisjZW5kaWYgLyogVENQX05PREVMQVkgKi8KKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgIGlmIChpc3RuY29tcG9ydCgpKSB7CisgICAgICAgICAgICBpbnQgcmMgPSAtMTsKKyAgICAgICAgICAgIGlmICh0dnRmbGcgPT0gMCAmJiBzcGVlZCA9PSB0dHNwZWVkICYmIGZsb3cgPT0gdHRmbG93CisgICAgICAgICAgICAgICAgIC8qICYmIHR0Y2FyciA9PSBjdXJjYXJyICovICkgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsInR0cGt0IG1vZGVzIGFscmVhZHkgc2V0LCBza2lwcGluZy4uLiIsIiIsMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOwkJLyogQWxyZWFkeSBiZWVuIGNhbGxlZC4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmbG93ICE9IHR0ZmxvdykgeworICAgICAgICAgICAgICAgIGlmICgocmMgPSB0bnNldGZsb3coZmxvdykpIDwgMCkKKwkJICByZXR1cm4ocmMpOworICAgICAgICAgICAgICAgIHR0ZmxvdyA9IGZsb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3BlZWQgIT0gdHRzcGVlZCkgeworICAgICAgICAgICAgICAgIGlmIChzcGVlZCA8PSAwKSAKKwkJICBzcGVlZCA9IHRuY19nZXRfYmF1ZCgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKChyYyA9IHRuY19zZXRfYmF1ZChzcGVlZCkpIDwgMCkKKwkJICByZXR1cm4ocmMpOworICAgICAgICAgICAgICAgIHR0c3BlZWQgPSBzcGVlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRuY19zZXRfZGF0YXNpemUoOCk7CisJICAgIHRuY19zZXRfc3RvcHNpemUoc3RvcGJpdHMpOworCisjaWZkZWYgSFdQQVJJVFkKKyAgICAgICAgICAgIGlmIChod3Bhcml0eSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoaHdwYXJpdHkpIHsKKwkJICBjYXNlICdlJzoJCQkvKiBFdmVuICovCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsInR0cmVzIDggYml0cyArIGV2ZW4gcGFyaXR5IiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgdG5jX3NldF9wYXJpdHkoMyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkgIGNhc2UgJ28nOgkJCS8qIE9kZCAqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ0dHJlcyA4IGJpdHMgKyBvZGQgcGFyaXR5IiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgdG5jX3NldF9wYXJpdHkoMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkgIGNhc2UgJ20nOgkJCS8qIE1hcmsgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwidHRyZXMgOCBiaXRzICsgaW52YWxpZCBwYXJpdHk6IG1hcmsiLCIiLDApOworICAgICAgICAgICAgICAgICAgICB0bmNfc2V0X3Bhcml0eSg0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCSAgY2FzZSAncyc6CQkJLyogU3BhY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwidHRyZXMgOCBiaXRzICsgaW52YWxpZCBwYXJpdHk6IHNwYWNlIiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgdG5jX3NldF9wYXJpdHkoNSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSAKKyNlbmRpZiAvKiBIV1BBUklUWSAqLworCSAgICB7CisgICAgICAgICAgICAgICAgdG5jX3NldF9wYXJpdHkoMSk7ICAgICAgICAgICAgICAvKiBOb25lICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0dnRmbGcgPSAwOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworICAgICAgICB0dnRmbGcgPSAwOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIE5FVENPTk4gKi8KKyNpZmRlZiBORVRDTUQKKyAgICBpZiAodHRwaXBlKSByZXR1cm4oMCk7CisjZW5kaWYgLyogTkVUQ01EICovCisjaWZkZWYgTkVUUFRZCisgICAgaWYgKHR0cHR5KSByZXR1cm4oMCk7CisjZW5kaWYgLyogTkVUUFRZICovCisKKyNpZm5kZWYgUGxhbjkKKyAgICBpZiAodHRmZGZsZyAmJiAhaXNhdHR5KHR0eWZkKSkgcmV0dXJuKDApOworI2VuZGlmIC8qIFBsYW45ICovCisKKyNpZmRlZiBDT0hFUkVOVAorI2RlZmluZSBTVk9SUE9TSVgKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisjaWZuZGVmIFNWT1JQT1NJWAkJCS8qIEJlcmtlbGV5LCBWNywgZXRjLiAqLworI2lmZGVmIExQQVNTOAorLyoKKyBGb3Igc29tZSByZWFzb24sIHdpdGggQlNEIHRlcm1pbmFsIGRyaXZlcnMsIHlvdSBjYW4ndCBzZXQgRkxPVyB0byBYT04vWE9GRgorIGFmdGVyIGhhdmluZyBwcmV2aW91c2x5IHNldCBpdCB0byBOT05FIHdpdGhvdXQgY2xvc2luZyBhbmQgcmVvcGVuaW5nIHRoZQorIGRldmljZS4gIFVubGVzcyB0aGVyZSdzIHNvbWV0aGluZyBJIG92ZXJsb29rZWQgYmVsb3cuLi4KKyovCisgICAgaWYgKHR0ZmxvdyA9PSBGTE9fTk9ORSAmJiBmbG93ID09IEZMT19YT05YICYmIHhsb2NhbCA9PSAwKSB7CisJZGVidWcoRjEwMSwidHRwa3QgZXhlY3V0aW5nIGhvcnJpYmxlIGZsb3cga2x1ZGdlIiwiIiwwKTsKKwl0dGNsb3MoMCk7CQkJLyogQ2xvc2UgaXQgKi8KKwl4ID0gMDsKKwl0dG9wZW4odHRubXN2LCZ4LHR0bWRtLDApOwkvKiBPcGVuIGl0IGFnYWluICovCisgICAgfQorI2VuZGlmIC8qIExQQVNTOCAqLworI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworCisjaWZkZWYgQ09IRVJFTlQJCQkJLyogVGhpcyBtdXN0IGJlIHZlc3RpZ2lhbCBzaW5jZSB3ZSAqLworI3VuZGVmIFNWT1JQT1NJWAkJCS8qIHJldmVyc2UgaXQgYSBmZXcgbGluZXMgYmVsb3cuLi4gKi8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisgICAgaWYgKHhmbG93ICE9IEZMT19ESUFMICYmIHhmbG93ICE9IEZMT19ESUFYKQorICAgICAgdHRmbG93ID0geGZsb3c7CQkJLyogTm93IG1ha2UgdGhpcyBhdmFpbGFibGUgdG9vLiAqLworCisjaWZuZGVmIE5PTE9DQUwKKyAgICBpZiAoeGxvY2FsKSB7CisJczIgPSAoaW50KSAoc3BlZWQgLyAxMEwpOwkvKiBDb252ZXJ0IGJwcyB0byBjcHMgKi8KKwlkZWJ1ZyhGMTAxLCJ0dHBrdCBjYWxsaW5nIHR0c3NwZCIsIiIsczIpOworCXMgPSB0dHNzcGQoczIpOwkJCS8qIENoZWNrIGFuZCBzZXQgdGhlIHNwZWVkICovCisJZGVidWcoRjEwMSwidHRwa3QgdHRzc3BkIHJlc3VsdCIsIiIscyk7CisgCWNhcnJjdGwoJnR0cmF3LCB4ZmxvdyAhPSBGTE9fRElBTCAvKiBDYXJyaWVyIGNvbnRyb2wgKi8KKwkJJiYgKHR0Y2FyciA9PSBDQVJfT04gfHwgKHR0Y2FyciA9PSBDQVJfQVVUICYmIHR0bWRtICE9IDApKSk7CisJdHZ0ZmxnID0gMDsJCQkvKiBTbyB0dHZ0KCkgd2lsbCB3b3JrIG5leHQgdGltZSAqLworICAgIH0KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBDT0hFUkVOVAorI2RlZmluZSBTVk9SUE9TSVgKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisjaWZuZGVmIFNWT1JQT1NJWAkJCS8qIEJTRCBzZWN0aW9uICovCisgICAgaWYgKGZsb3cgPT0gRkxPX1JUU0MgfHwJCS8qIEhhcmR3YXJlIGZsb3cgY29udHJvbCAqLworCWZsb3cgPT0gRkxPX0RUUkMgfHwKKwlmbG93ID09IEZMT19EVFJUKSB7CisJdHRoZmxvdyhmbG93LCAxLCAmdHRyYXcpOworCWRlYnVnKEYxMDAsInR0cGt0IGhhcmQgZmxvdywgVEFOREVNIG9mZiwgUkFXIG9uIiwiIiwwKTsKKwl0dHJhdy5zZ19mbGFncyAmPSB+VEFOREVNOwkvKiBUdXJuIG9mZiBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgKi8KKwl0dHJhdy5zZ19mbGFncyB8PSBSQVc7CQkvKiBFbnRlciByYXcgbW9kZSAqLworICAgIH0gZWxzZSBpZiAoZmxvdyA9PSBGTE9fTk9ORSkgewkvKiBObyBmbG93IGNvbnRyb2wgKi8KKwlkZWJ1ZyhGMTAwLCJ0dHBrdCBubyBmbG93LCBUQU5ERU0gb2ZmLCBSQVcgb24iLCIiLDApOworCXR0cmF3LnNnX2ZsYWdzICY9IH5UQU5ERU07CS8qIFR1cm4gb2ZmIHNvZnR3YXJlIGZsb3cgY29udHJvbCAqLworCXR0aGZsb3coZmxvdywgMCwgJnR0cmF3KTsJLyogVHVybiBvZmYgYW55IGhhcmR3YXJlIGYvYyB0b28gKi8KKwl0dHJhdy5zZ19mbGFncyB8PSBSQVc7CQkvKiBFbnRlciByYXcgbW9kZSAqLworICAgIH0gZWxzZSBpZiAoZmxvdyA9PSBGTE9fS0VFUCkgewkvKiBLZWVwIGRldmljZSdzIG9yaWdpbmFsIHNldHRpbmcgKi8KKwlkZWJ1ZyhGMTAwLCJ0dHBrdCBrZWVwaW5nIG9yaWdpbmFsIFRBTkRFTSIsIiIsMCk7CisJdHRyYXcuc2dfZmxhZ3MgJj0gflRBTkRFTTsKKwl0dHJhdy5zZ19mbGFncyB8PSAodHRvbGQuc2dfZmxhZ3MgJiBUQU5ERU0pOworCS8qIE5PVEU6IFdlIHNob3VsZCBhbHNvIGhhbmRsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaGVyZSEgKi8KKyAgICB9CisKKy8qIFNFVCBGTE9XIFhPTi9YT0ZGIGlzIGluIGVmZmVjdCwgb3IgU0VUIEZMT1cgS0VFUCByZXN1bHRlZCBpbiBYb24vWG9mZiAqLworCisgICAgaWYgKChmbG93ID09IEZMT19YT05YKSB8fCAodHRyYXcuc2dfZmxhZ3MgJiBUQU5ERU0pKSB7CisJZGVidWcoRjEwMCwidHRwa3QgdHVybmluZyBvbiBUQU5ERU0iLCIiLDApOworCXR0cmF3LnNnX2ZsYWdzIHw9IFRBTkRFTTsJLyogU28gYXNrIGZvciBpdC4gKi8KKworI2lmZGVmIExQQVNTOAkJCQkvKiBDYW4gcGFzcyA4LWJpdCBkYXRhIHRocm91Z2g/ICovCisvKiBJZiB0aGUgTFBBU1M4IGxvY2FsIG1vZGUgaXMgYXZhaWxhYmxlLCB0aGVuIGZsb3cgY29udHJvbCBjYW4gYWx3YXlzICAqLworLyogYmUgdXNlZCwgZXZlbiBpZiBwYXJpdHkgaXMgbm9uZSBhbmQgd2UgYXJlIHRyYW5zZmVycmluZyA4LWJpdCBkYXRhLiAgKi8KKy8qIEJ1dCB3ZSBvbmx5IG5lZWQgdG8gZG8gYWxsIHRoaXMgaWYgWG9uL1hvZmYgaXMgcmVxdWVzdGVkLiAqLworLyogQlVULi4uIHRoaXMgdGVuZHMgbm90IHRvIHdvcmsgdGhyb3VnaCBJUCBvciBMQVQgY29ubmVjdGlvbnMsIHRlcm1pbmFsICovCisvKiBzZXJ2ZXJzLCB0ZWxuZXQsIHJsb2dpbiwgZXRjLCBzbyBpdCBpcyBjdXJyZW50bHkgZGlzYWJsZWQuICovCisJeCA9IExQQVNTODsJCQkvKiBJZiBMUEFTUzggZGVmaW5lZCwgdGhlbiAqLworCWRlYnVnKEYxMDAsInR0cGt0IGV4ZWN1dGluZyBMUEFTUzggY29kZSIsIiIsMCk7CisJaWYgKGxtb2RlZikgewkJCS8qIFRJT0NMQklTIG11c3QgYmUgdG9vLiAqLworCSAgICB4ID0gaW9jdGwodHR5ZmQsVElPQ0xCSVMsJngpOyAvKiBUcnkgdG8gc2V0IExQQVNTOC4gKi8KKwkgICAgaWYgKHggPCAwKSB7CisJCWRlYnVnKEYxMDAsInR0cGt0IFRJT0NMQklTIGVycm9yIiwiIiwwKTsKKwkgICAgfSBlbHNlIHsKKwkJbG1vZGVmKys7CisJCWRlYnVnKEYxMDAsInR0cGt0IFRJT0NMQklTIG9rIiwiIiwwKTsKKwkgICAgfQorCX0KKy8qCisgQnV0IGlmIHdlIHVzZSBMUEFTUzggbW9kZSwgd2UgbXVzdCBleHBsaWNpdGx5IHR1cm4gb2ZmCisgdGVybWluYWwgaW50ZXJydXB0cyBvZiBhbGwga2luZHMuCisqLworI2lmZGVmIFRJT0NHRVRDCQkJCS8qIE5vdCByYXdtb2RlLCAqLworCWlmICh0Y2hhcmYgJiYgKHhsb2NhbCA9PSAwKSkgewkvKiBtdXN0IHR1cm4gb2ZmICovCisJICAgIHRjaG5vaS50X2ludHJjID0gLTE7CS8qIGludGVycnVwdCBjaGFyYWN0ZXIgKi8KKwkgICAgdGNobm9pLnRfcXVpdGMgPSAtMTsJLyogYW5kIHF1aXQgY2hhcmFjdGVyLiAqLworCSAgICB0Y2hub2kudF9zdGFydGMgPSAxNzsJLyogTWFrZSBzdXJlIHhvbiAqLworCSAgICB0Y2hub2kudF9zdG9wYyA9IDE5OwkvKiBhbmQgeG9mZiBub3QgaWdub3JlZC4gKi8KKyNpZm5kZWYgTk9CUktDCisJICAgIHRjaG5vaS50X2VvZmMgPSAtMTsJCS8qIGVvZiBjaGFyYWN0ZXIuICovCisJICAgIHRjaG5vaS50X2Jya2MgPSAtMTsJCS8qIGJyayBjaGFyYWN0ZXIuICovCisjZW5kaWYgLyogTk9CUktDICovCisJICAgIGlmIChpb2N0bCh0dHlmZCxUSU9DU0VUQywmdGNobm9pKSA8IDApIHsKKwkJZGVidWcoRjEwMCwidHRwa3QgVElPQ1NFVEMgZmFpbGVkIiwiIiwwKTsKKwkgICAgfSBlbHNlIHsKKwkJdGNoYXJmID0gMTsKKwkJZGVidWcoRjEwMCwidHRwa3QgVElPQ1NFVEMgb2siLCIiLDApOworCSAgICB9CisjaWZkZWYgQ09NTUVOVAorLyogb25seSBmb3IgcGFyYW5vaWQgZGVidWdnaW5nICovCisJICAgIGlmICh0Y2hhcmYpIHsKKwkJc3RydWN0IHRjaGFycyBmb287CisJCWNoYXIgdGNoYnVmWzEwMF07CisJCWlvY3RsKDAsVElPQ0dFVEMsJmZvbyk7CisJCXNwcmludGYodGNoYnVmLAorCQkgICAgImludHI9JWQscXVpdD0lZCwgc3RhcnQ9JWQsIHN0b3A9JWQsIGVvZj0lZCwgYnJrPSVkIiwKKwkJICAgIGZvby50X2ludHJjLCBmb28udF9xdWl0YywgZm9vLnRfc3RhcnRjLAorCQkgICAgZm9vLnRfc3RvcGMsIGZvby50X2VvZmMsICBmb28udF9icmtjKTsKKwkJZGVidWcoRjExMCwidHRwa3QgY2hhcnMiLHRjaGJ1ZiwwKTsKKwkgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKwl9CisJdHRyYXcuc2dfZmxhZ3MgfD0gQ0JSRUFLOwkvKiBOZWVkZWQgZm9yIHVua25vd24gcmVhc29uICovCisjZW5kaWYgLyogVElPQ0dFVEMgKi8KKworLyogUHJldmVudCBzdXNwZW5kIGR1cmluZyBwYWNrZXQgbW9kZSAqLworI2lmZGVmIFRJT0NHTFRDCQkJCS8qIE5vdCByYXdtb2RlLCAqLworCWlmIChsdGNoYXJmICYmICh4bG9jYWwgPT0gMCkpIHsJLyogbXVzdCB0dXJuIG9mZiAqLworCSAgICBsdGNobm9pLnRfc3VzcGMgPSAtMTsJLyogc3VzcGVuZCBjaGFyYWN0ZXIgKi8KKwkgICAgbHRjaG5vaS50X2RzdXNwYyA9IC0xOwkvKiBhbmQgZGVsYXllZCBzdXNwZW5kIGNoYXJhY3RlciAqLworCSAgICBpZiAoaW9jdGwodHR5ZmQsVElPQ1NMVEMsJnRjaG5vaSkgPCAwKSB7CisJCWRlYnVnKEYxMDAsInR0cGt0IFRJT0NTTFRDIGZhaWxlZCIsIiIsMCk7CisJICAgIH0gZWxzZSB7CisJCWx0Y2hhcmYgPSAxOworCQlkZWJ1ZyhGMTAwLCJ0dHBrdCBUSU9DU0xUQyBvayIsIiIsMCk7CisJICAgIH0KKwl9CisjZW5kaWYgLyogVElPQ0dMVEMgKi8KKworI2Vsc2UgLyogTFBBU1M4IG5vdCBkZWZpbmVkICovCisKKy8qIFByZXZpb3VzbHksIEJTRC1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgYWx3YXlzICovCisvKiB1c2VkIHJhd21vZGUgZm9yIHBhY2tldHMuICBOb3csIHdlIHVzZSByYXdtb2RlIG9ubHkgaWYgcGFyaXR5IGlzIE5PTkUuICovCisvKiBUaGlzIGFsbG93cyB0aGUgZmxvdyBjb250cm9sIHJlcXVlc3RlZCBhYm92ZSB0byBhY3R1YWxseSB3b3JrLCBidXQgb25seSAqLworLyogaWYgdGhlIHVzZXIgYXNrcyBmb3IgcGFyaXR5ICh3aGljaCBhbHNvIG1lYW5zIHRoZXkgZ2V0IDh0aC1iaXQgcXVvdGluZykuICovCisKKwlpZiAocGFyaXR5KSB7CQkJLyogSWYgcGFyaXR5LCAqLworCSAgICB0dHJhdy5zZ19mbGFncyAmPSB+UkFXOwkvKiB1c2UgY29va2VkIG1vZGUgKi8KKyNpZmRlZiBDT01NRU5UCisvKiBXSFk/Pz8gKi8KKwkgICAgaWYgKHhsb2NhbCkKKyNlbmRpZiAvKiBDT01NRU5UICovCisJICAgICAgdHRyYXcuc2dfZmxhZ3MgfD0gQ0JSRUFLOworCSAgICBkZWJ1ZyhGMTAxLCJ0dHBrdCBjb29rZWQsIGNicmVhaywgcGFyaXR5IiwiIixwYXJpdHkpOworI2lmZGVmIFRJT0NHRVRDCQkJCS8qIE5vdCByYXdtb2RlLCAqLworCSAgICBpZiAodGNoYXJmICYmICh4bG9jYWwgPT0gMCkpIHsgLyogbXVzdCB0dXJuIG9mZiAqLworCQl0Y2hub2kudF9pbnRyYyA9IC0xOwkvKiBpbnRlcnJ1cHQgY2hhcmFjdGVyICovCisJCXRjaG5vaS50X3F1aXRjID0gLTE7CS8qIGFuZCBxdWl0IGNoYXJhY3Rlci4gKi8KKwkJdGNobm9pLnRfc3RhcnRjID0gMTc7CS8qIE1ha2Ugc3VyZSB4b24gKi8KKwkJdGNobm9pLnRfc3RvcGMgPSAxOTsJLyogYW5kIHhvZmYgbm90IGlnbm9yZWQuICovCisjaWZuZGVmIE5PQlJLQworCQl0Y2hub2kudF9lb2ZjID0gLTE7CS8qIGVvZiBjaGFyYWN0ZXIuICovCisJCXRjaG5vaS50X2Jya2MgPSAtMTsJLyogYnJrIGNoYXJhY3Rlci4gKi8KKyNlbmRpZiAvKiBOT0JSS0MgKi8KKwkJaWYgKGlvY3RsKHR0eWZkLFRJT0NTRVRDLCZ0Y2hub2kpIDwgMCkgeworCQkgICAgZGVidWcoRjEwMCwidHRwa3QgVElPQ1NFVEMgZmFpbGVkIiwiIiwwKTsKKwkJfSBlbHNlIHsKKwkJICAgIHRjaGFyZiA9IDE7CisJCSAgICBkZWJ1ZyhGMTAwLCJ0dHBrdCBUSU9DU0VUQyBvayIsIiIsMCk7CisJCX0KKwkgICAgfQorI2VuZGlmIC8qIFRJT0NHRVRDICovCisjaWZkZWYgVElPQ0dMVEMJCQkJLyogTm90IHJhd21vZGUsICovCisvKiBQcmV2ZW50IHN1c3BlbmQgZHVyaW5nIHBhY2tldCBtb2RlICovCisJICAgIGlmIChsdGNoYXJmICYmICh4bG9jYWwgPT0gMCkpIHsgLyogbXVzdCB0dXJuIG9mZiAqLworCQlsdGNobm9pLnRfc3VzcGMgPSAtMTsJLyogc3VzcGVuZCBjaGFyYWN0ZXIgKi8KKwkJbHRjaG5vaS50X2RzdXNwYyA9IC0xOwkvKiBhbmQgZGVsYXllZCBzdXNwZW5kIGNoYXJhY3RlciAqLworCQlpZiAoaW9jdGwodHR5ZmQsVElPQ1NMVEMsJnRjaG5vaSkgPCAwKSB7CisJCSAgICBkZWJ1ZyhGMTAwLCJ0dHBrdCBUSU9DU0xUQyBmYWlsZWQiLCIiLDApOworCQl9IGVsc2UgeworCQkgICAgbHRjaGFyZiA9IDE7CisJCSAgICBkZWJ1ZyhGMTAwLCJ0dHBrdCBUSU9DU0xUQyBvayIsIiIsMCk7CisJCX0KKwkgICAgfQorI2VuZGlmIC8qIFRJT0NHTFRDICovCisJfSBlbHNlIHsJCQkvKiBJZiBubyBwYXJpdHksICovCisJICAgIHR0cmF3LnNnX2ZsYWdzIHw9IFJBVzsJLyogbXVzdCB1c2UgOC1iaXQgcmF3IG1vZGUuICovCisJICAgIGRlYnVnKEYxMDEsInR0cGt0IHNldHRpbmcgcmF3bW9kZSwgcGFyaXR5IiwiIixwYXJpdHkpOworCX0KKyNlbmRpZiAvKiBMUEFTUzggKi8KKyAgICB9IC8qIEVuZCBvZiBYb24vWG9mZiBzZWN0aW9uICovCisKKyAgICAvKiBEb24ndCBlY2hvLCBkb24ndCBtYXAgQ1IgdG8gQ1JMRiBvbiBvdXRwdXQsIGRvbid0IGZvb2wgd2l0aCBjYXNlICovCisjaWZkZWYgTENBU0UKKyAgICB0dHJhdy5zZ19mbGFncyAmPSB+KEVDSE98Q1JNT0R8TENBU0UpOworI2Vsc2UKKyAgICB0dHJhdy5zZ19mbGFncyAmPSB+KEVDSE98Q1JNT0QpOworI2VuZGlmIC8qIExDQVNFICovCisKKyNpZmRlZiBUT1dFUjEKKyAgICB0dHJhdy5zZ19mbGFncyAmPSB+QU5ZUDsgICAgICAgICAgICAvKiBNdXN0IHNldCB0aGlzIG9uIG9sZCBUb3dlcnMgKi8KKyNlbmRpZiAvKiBUT1dFUjEgKi8KKworI2lmZGVmIEJFTExWMTAKKyAgICBpZiAoaW9jdGwodHR5ZmQsVElPQ1NFVFAsJnR0cmF3KSA8IDApIC8qIFNldCB0aGUgbmV3IG1vZGVzLiAqLworICAgICAgcmV0dXJuKC0xKTsKKyNlbHNlCisgICAgZXJybm8gPSAwOworICAgIGlmIChzdHR5KHR0eWZkLCZ0dHJhdykgPCAwKSB7ICAgICAgIC8qIFNldCB0aGUgbmV3IG1vZGVzLiAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJ0dHBrdCBzdHR5IGZhaWxlZCIsIiIsZXJybm8pOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyNlbmRpZiAvKiBCRUxMVjEwICovCisgICAgZGVidWcoRjEwMCwidHRwa3Qgc3R0eSBvayIsIiIsMCk7CisKKyNpZmRlZiBzb255X25ld3MKKyAgICB4ID0geGxvY2FsID8ga21fZXh0IDoga21fY29uOwkvKiBQdXQgbGluZSBpbiBBU0NJSSBtb2RlLiAqLworICAgIGlmICh4ICE9IC0xKSB7CQkJLyogTWFrZSBzdXJlIHdlIGtub3cgb3JpZ2luYWwgbW9kZXMuICovCisJeCAmPSB+S01fVFRZUEU7CisJeCB8PSBLTV9BU0NJSTsKKwlpZiAoaW9jdGwodHR5ZmQsVElPQ0tTRVQsICZ4KSA8IDApIHsKKwkgICAgcGVycm9yKCJ0dHBrdCBjYW4ndCBzZXQgQVNDSUkgbW9kZSIpOworCSAgICBkZWJ1ZyhGMTAxLCJ0dHBrdCBlcnJvciBzZXR0aW5nIEFTQ0lJIG1vZGUiLCIiLHgpOworCSAgICByZXR1cm4oLTEpOworCX0KKyAgICB9CisgICAgZGVidWcoRjEwMCwidHRwa3Qgc2V0IEFTQ0lJIG1vZGUgb2siLCIiLDApOworI2VuZGlmIC8qIHNvbnlfbmV3cyAqLworCisgICAgaWYgKHhsb2NhbCA9PSAwKSB7CQkJLyogVHVybiB0aGlzIG9mZiBzbyB3ZSBjYW4gcmVhZCAqLworCXNpZ25hbChTSUdJTlQsU0lHX0lHTik7CQkvKiBDdHJsLUMgY2hhcnMgdHlwZWQgYXQgY29uc29sZSAqLworCXNpZ2ludF9pZ24gPSAxOworICAgIH0KKyAgICB0dnRmbGcgPSAwOwkJCQkvKiBTbyB0dHZ0KCkgd2lsbCB3b3JrIG5leHQgdGltZSAqLworICAgIGRlYnVnKEYxMDAsInR0cGt0IHN1Y2Nlc3MiLCIiLDApOworICAgIHJldHVybigwKTsKKworI2VuZGlmIC8qIE5vdCBBVFRTViBvciBQT1NJWCAqLworCisvKiBBVCZUIFVOSVggYW5kIFBPU0lYICovCisKKyNpZmRlZiBDT0hFUkVOVAorI2RlZmluZSBTVk9SUE9TSVgKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisjaWZkZWYgU1ZPUlBPU0lYCisgICAgaWYgKGZsb3cgPT0gRkxPX1hPTlgpIHsJCS8qIFhvbi9Yb2ZmICovCisJdHRyYXcuY19pZmxhZyB8PSAoSVhPTnxJWE9GRik7CisJdHRoZmxvdyhmbG93LCAwLCAmdHRyYXcpOworICAgIH0gZWxzZSBpZiAoZmxvdyA9PSBGTE9fTk9ORSkgewkvKiBOb25lICovCisJLyogTk9URTogV2Ugc2hvdWxkIGFsc28gdHVybiBvZmYgaGFyZHdhcmUgZmxvdyBjb250cm9sIGhlcmUhICovCisJdHRyYXcuY19pZmxhZyAmPSB+KElYT058SVhPRkYpOworCXR0aGZsb3coZmxvdywgMCwgJnR0cmF3KTsKKyAgICB9IGVsc2UgaWYgKGZsb3cgPT0gRkxPX0tFRVApIHsJLyogS2VlcCAqLworCXR0cmF3LmNfaWZsYWcgJj0gfihJWE9OfElYT0ZGKTsJLyogVHVybiBvZmYgWG9uL1hvZmYgZmxhZ3MgKi8KKwl0dHJhdy5jX2lmbGFnIHw9ICh0dG9sZC5jX2lmbGFnICYgKElYT058SVhPRkYpKTsgLyogT1IgaW4gb2xkIG9uZXMgKi8KKwkvKiBOT1RFOiBXZSBzaG91bGQgYWxzbyBoYW5kbGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIGhlcmUhICovCisjaWZkZWYgUE9TSVhfQ1JUU0NUUworLyogSW4gTGludXggY2FzZSwgd2UgZG8gdGhpcywgd2hpY2ggaXMgdW5saWtlbHkgdG8gYmUgcG9ydGFibGUgKi8KKyAgICAgICAgdHRyYXcuY19jZmxhZyAmPSB+Q1JUU0NUUzsJLyogVHVybiBvZmYgUlRTL0NUUyBmbGFnICovCisgICAgICAgIHR0cmF3LmNfY2ZsYWcgfD0gKHR0b2xkLmNfY2ZsYWcgJiBDUlRTQ1RTKTsgLyogT1IgaW4gb2xkIG9uZSAqLworI2VuZGlmIC8qIFBPU0lYX0NSVFNDVFMgKi8KKyAgICB9IGVsc2UgaWYgKGZsb3cgPT0gRkxPX1JUU0MgfHwJLyogSGFyZHdhcmUgKi8KKwkgICAgICAgZmxvdyA9PSBGTE9fRFRSQyB8fAorCSAgICAgICBmbG93ID09IEZMT19EVFJUKSB7CisJdHRyYXcuY19pZmxhZyAmPSB+KElYT058SVhPRkYpOwkvKiAoMTkwKSAqLworCXR0aGZsb3coZmxvdywgMSwgJnR0cmF3KTsKKyAgICB9CisgICAgdHRyYXcuY19sZmxhZyAmPSB+KElDQU5PTnxFQ0hPKTsKKyAgICB0dHJhdy5jX2xmbGFnICY9IH5JU0lHOwkJLyogRG8gTk9UIGNoZWNrIGZvciBpbnRlcnJ1cHQgY2hhcnMgKi8KKworI2lmbmRlZiBPWE9TCisjaWZkZWYgUU5YCisgICAgaWYgKGZsb3cgIT0gRkxPX1JUU0MgJiYgZmxvdyAhPSBGTE9fRFRSQyAmJiBmbG93ICE9IEZMT19EVFJUKQorI2VuZGlmIC8qIFFOWCAqLworI2lmbmRlZiBDT0hFUkVOVAorICAgICAgdHRyYXcuY19sZmxhZyAmPSB+SUVYVEVOOwkJLyogVHVybiBvZmYgXk8vXlYgcHJvY2Vzc2luZyAqLworI2VuZGlmIC8qIENPSEVSRU5UICovCisjZWxzZSAvKiBPWE9TICovCisgICAgdHRyYXcuY19jY1tWRElTQ0FSRF0gPSB0dHJhdy5jX2NjW1ZMTkVYVF0gPSBDRElTQUJMRTsKKyNlbmRpZiAvKiBPWE9TICovCisgICAgdHRyYXcuY19sZmxhZyB8PSBOT0ZMU0g7CQkvKiBEb24ndCBmbHVzaCAqLworICAgIHR0cmF3LmNfaWZsYWcgfD0gSUdOUEFSOwkJLyogSWdub3JlIHBhcml0eSBlcnJvcnMgKi8KKyNpZmRlZiBBVFRTVgorI2lmZGVmIEJTRDQ0CisgICAgdHRyYXcuY19pZmxhZyAmPSB+KElHTkJSS3xJTkxDUnxJR05DUnxJQ1JOTHxJTlBDS3xJU1RSSVB8SVhBTlkpOworI2Vsc2UKKyAgICB0dHJhdy5jX2lmbGFnICY9IH4oSUdOQlJLfElOTENSfElHTkNSfElDUk5MfElVQ0xDfElOUENLfElTVFJJUHxJWEFOWSk7CisjZW5kaWYgLyogQlNENDQgKi8KKyNlbHNlIC8qIFBPU0lYICovCisgICAgdHRyYXcuY19pZmxhZyAmPSB+KElHTkJSS3xJTkxDUnxJR05DUnxJQ1JOTHxJTlBDS3xJU1RSSVApOworI2VuZGlmIC8qIEFUVFNWICovCisgICAgdHRyYXcuY19vZmxhZyAmPSB+T1BPU1Q7CisgICAgdHRyYXcuY19jZmxhZyAmPSB+KENTSVpFKTsKKyAgICB0dHJhdy5jX2NmbGFnIHw9IChDUzh8Q1JFQUR8SFVQQ0wpOworCisjaWZkZWYgQ1NUT1BCCisgICAgaWYgKHhsb2NhbCkgeworCWlmIChzdG9wYml0cyA9PSAyKSB7CisJICAgIHR0cmF3LmNfY2ZsYWcgfD0gQ1NUT1BCOwkvKiAyIHN0b3AgYml0cyAqLworCSAgICBkZWJ1ZyhGMTAwLCJ0dHBrdCAyIHN0b3BiaXRzIiwiIiwwKTsKKwl9IGVsc2UgaWYgKHN0b3BiaXRzID09IDEpIHsKKwkgICAgdHRyYXcuY19jZmxhZyAmPSB+KENTVE9QQik7CS8qIDEgc3RvcCBiaXQgKi8KKwkgICAgZGVidWcoRjEwMCwidHRwa3QgMSBzdG9wYml0IiwiIiwwKTsKKwl9CisgICAgfQorI2VuZGlmIC8qIENTVE9QQiAqLworCisjaWZkZWYgSFdQQVJJVFkKKyAgICBpZiAoaHdwYXJpdHkgJiYgeGxvY2FsKSB7CQkvKiBIYXJkd2FyZSBwYXJpdHkgKi8KKwl0dHJhdy5jX2NmbGFnIHw9IFBBUkVOQjsJLyogRW5hYmxlIHBhcml0eSAqLworI2lmZGVmIENPTU1FTlQKKy8qIFVuY29tbWVudCB0aGlzIG9ubHkgaWYgbmVlZGVkIC0tIEkgZG9uJ3QgdGhpbmsgaXQgaXMgKi8KKwl0dHJhdy5jX2NmbGFnICY9IH4oQ1NJWkUpOwkvKiBDbGVhciBvdXQgY2hhcmFjdGVyLXNpemUgbWFzayAqLworCXR0cmF3LmNfY2ZsYWcgfD0gQ1M4OwkJLyogQW5kIHNldCBpdCB0byA4ICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworI2lmZGVmIElHTlBBUgorCXR0cmF3LmNfaWZsYWcgfD0gSUdOUEFSOwkvKiBEb24ndCBkaXNjYXJkIGluY29taW5nIGJ5dGVzICovCisJZGVidWcoRjEwMCwidHRwa3QgSUdOUEFSIiwiIiwwKTsgLyogdGhhdCBoYXZlIHBhcml0eSBlcnJvcnMgKi8KKyNlbmRpZiAvKiBJR05QQVIgKi8KKwlzd2l0Y2ggKGh3cGFyaXR5KSB7CisJICBjYXNlICdlJzoJCQkvKiBFdmVuICovCisJICAgIHR0cmF3LmNfY2ZsYWcgJj0gfihQQVJPREQpOworCSAgICBkZWJ1ZyhGMTAwLCJ0dHBrdCA4IGJpdHMgKyBldmVuIHBhcml0eSIsIiIsMCk7CisJICAgIGJyZWFrOworCSAgY2FzZSAnbyc6CQkJLyogT2RkICovCisJICAgIHR0cmF3LmNfY2ZsYWcgfD0gUEFST0REOworCSAgICBkZWJ1ZyhGMTAwLCJ0dHBrdCA4IGJpdHMgKyBvZGQgcGFyaXR5IiwiIiwwKTsKKwkgICAgYnJlYWs7CisJICBjYXNlICdtJzoJCQkvKiBNYXJrICovCisJICBjYXNlICdzJzoJCQkvKiBTcGFjZSAqLworCSAgICAvKiBQQVJFWFQgaXMgbWVudGlvbmVkIGluIFNWSUQgYnV0IHRoZSBkZXRhaWxzIGFyZSBub3QgZ2l2ZW4uICovCisJICAgIC8qIFBBUkVYVCBpcyBub3QgaW5jbHVkZWQgaW4gUE9TSVggSVNPL0lFQyA5OTQ1LTEuICovCisJICAgIGRlYnVnKEYxMDAsInR0cGt0IDggYml0cyArIGludmFsaWQgcGFyaXR5IiwiIiwwKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0gZWxzZSB7CQkJCS8qIFdlIGhhbmRsZSBwYXJpdHkgb3Vyc2VsdmVzICovCisjZW5kaWYgLyogSFdQQVJJVFkgKi8KKwl0dHJhdy5jX2NmbGFnICY9IH4oUEFSRU5CKTsJLyogRG9uJ3QgZW5hYmxlIHBhcml0eSAqLworI2lmZGVmIEhXUEFSSVRZCisgICAgfQorI2VuZGlmIC8qIEhXUEFSSVRZICovCisKKyNpZmRlZiBJWDM3MAorICAgIHR0cmF3LmNfY2NbNF0gPSA0ODsgIC8qIFNvIFNlcmllcy8xIGRvZXNuJ3QgaW50ZXJydXB0IG9uIGV2ZXJ5IGNoYXIgKi8KKyAgICB0dHJhdy5jX2NjWzVdID0gMTsKKyNlbHNlCisjaWZuZGVmIFZFT0YJCQkJLyogZm9yIERHVVggdGhpcyBpcyBWRU9GLCBub3QgVk1JTiAqLworICAgIHR0cmF3LmNfY2NbNF0gPSAxOyAgIC8qIFtWTUlOXSAgcmV0dXJuIG1heCBvZiB0aGlzIG1hbnkgY2hhcmFjdGVycyBvciAqLworI2Vsc2UKKyNpZm5kZWYgT1hPUworI2lmZGVmIFZNSU4KKyAgICB0dHJhdy5jX2NjW1ZNSU5dID0gMTsKKyNlbmRpZiAvKiBWTUlOICovCisjZWxzZSAvKiBPWE9TICovCisgICAgdHRyYXcuY19taW4gPSAxOworI2VuZGlmIC8qIE9YT1MgKi8KKyNlbmRpZiAvKiBWRU9GICovCisjaWZuZGVmIFZFT0wJCQkJLyogZm9yIERHVVggdGhpcyBpcyBWRU9MLCBub3QgVlRJTUUgKi8KKyAgICB0dHJhdy5jX2NjWzVdID0gMDsJIC8qIFtWVElNRV0gd2hlbiB0aGlzIG1hbnkgc2Vjcy8xMCBleHBpcmUgdy9ubyBpbnB1dCAqLworI2Vsc2UKKyNpZm5kZWYgT1hPUworI2lmZGVmIFZUSU1FCisgICAgdHRyYXcuY19jY1tWVElNRV0gPSAwOworI2VuZGlmIC8qIFZUSU1FICovCisjZWxzZSAvKiBPWE9TICovCisgICAgdHRyYXcuY190aW1lID0gMDsKKyNlbmRpZiAvKiBPWE9TICovCisjZW5kaWYgLyogVkVPTCAqLworI2VuZGlmIC8qIElYMzcwICovCisKKyNpZmRlZiBWSU5UUgkJCQkvKiBUdXJuIG9mZiBpbnRlcnJ1cHQgY2hhcmFjdGVyICovCisgICAgaWYgKHhsb2NhbCA9PSAwKQkJCS8qIHNvIF5DXkMgY2FuIGJyZWFrIHVzIG91dCBvZiAqLworICAgICAgdHRyYXcuY19jY1tWSU5UUl0gPSAwOwkJLyogcGFja2V0IG1vZGUuICovCisjZW5kaWYgLyogVklOVFIgKi8KKworI2lmZGVmIFBsYW45CisgICAgaWYgKHA5dHR5cGFyaXR5KCduJykgPCAwKQorCXJldHVybiAtMTsKKyNlbHNlCisjaWZkZWYgQlNENDRPUlBPU0lYCisgICAgZXJybm8gPSAwOworI2lmZGVmIEJFT1NPUkJFQk9YCisgICAgdHRyYXcuY19jY1tWTUlOXSA9IDA7CQkvKiBEUjcgY2FuIG9ubHkgcG9sbC4gKi8KKyNlbmRpZiAvKiBCRU9TT1JCRUJPWCAqLworICAgIGRlYnVnKEYxMDAsInR0cGt0IGNhbGxpbmcgdGNzZXRhdHRyKFRDU0VUQVcpIiwiIiwwKTsKKyAgICB4ID0gdGNzZXRhdHRyKHR0eWZkLFRDU0FEUkFJTiwmdHRyYXcpOworICAgIGRlYnVnKEYxMDEsInR0cGt0IEJTRDQ0T1JQT1NJWCB0Y3NldGF0dHIiLCIiLHgpOworICAgIGlmICh4IDwgMCkgeworCWRlYnVnKEYxMDEsInR0cGt0IEJTRDQ0T1JQT1NJWCB0Y3NldGF0dHIgZXJybm8iLCIiLGVycm5vKTsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisjZWxzZSAvKiBCU0Q0NE9SUE9TSVggKi8KKyAgICB4ID0gaW9jdGwodHR5ZmQsVENTRVRBVywmdHRyYXcpOworICAgIGRlYnVnKEYxMDEsInR0cGt0IEFUVFNWIGlvY3RsIFRDU0VUQVciLCIiLHgpOworICAgIGlmICh4IDwgMCkgeyAgLyogc2V0IG5ldyBtb2RlcyAuICovCisJZGVidWcoRjEwMSwidHRwa3QgQVRUU1YgaW9jdGwgVENTRVRBVyBlcnJubyIsIiIsZXJybm8pOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyNlbmRpZiAvKiBCU0Q0NE9SUE9TSVggKi8KKyNlbmRpZiAvKiBQbGFuOSAqLworICAgIHR2dGZsZyA9IDA7CisgICAgZGVidWcoRjEwMCwidHRwa3Qgb2siLCIiLDApOworICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBBVFRTViAqLworCisjaWZkZWYgQ09IRVJFTlQKKyN1bmRlZiBTVk9SUE9TSVgKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCit9CisKKy8qICBUIFQgUyBFIFQgRiBMIE8gVyAgLS0gIFNldCBmbG93IGNvbnRyb2wgaW1tZWRpYXRlbHkuICAqLworCisjaWZkZWYgQ09IRVJFTlQKKyNkZWZpbmUgU1ZPUlBPU0lYCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKworaW50Cit0dHNldGZsb3coZmxvdykgaW50IGZsb3c7IHsKKyAgICBpZiAodHR5ZmQgPCAwKQkJCS8qIEEgY2hhbm5lbCBtdXN0IGJlIG9wZW4gKi8KKyAgICAgIHJldHVybigtMSk7CisKKyAgICBkZWJ1ZyhGMTAxLCJ0dHNldGZsb3cgZmxvdyIsIiIsZmxvdyk7CisKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgaWYgKG5ldGNvbm4gJiYgaXN0bmNvbXBvcnQoKSkgeworCWRlYnVnKEYxMDEsInR0c2V0ZmxvdyBuZXQgbW9kZW0iLCIiLHR0bWRtKTsKKwlyZXR1cm4odG5zZXRmbG93KGZsb3cpKTsKKyAgICB9CisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpcGUpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICBpZiAodHRwdHkpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKworI2lmZGVmIENPTU1FTlQKKyAgICAvKiBUaGlzIHNlZW1zIHRvIGh1cnQuLi4gKi8KKyAgICBpZiAoZmxvdyA9PSBGTE9fS0VFUCkKKyAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICBpZiAoZmxvdyA9PSBGTE9fUlRTQyB8fAkJLyogSGFyZHdhcmUgZmxvdyBjb250cm9sLi4uICovCisJZmxvdyA9PSBGTE9fRFRSQyB8fAorCWZsb3cgPT0gRkxPX0RUUlQpIHsKKwl0dGhmbG93KGZsb3csIDEsICZ0dHJhdyk7CisjaWZuZGVmIFNWT1JQT1NJWAorCXR0cmF3LnNnX2ZsYWdzICY9IH5UQU5ERU07CS8qIFR1cm4gb2ZmIHNvZnR3YXJlIGZsb3cgY29udHJvbCAqLworI2Vsc2UKKwl0dHJhdy5jX2lmbGFnICY9IH4oSVhPTnxJWE9GRik7CisjZW5kaWYgLyogU1ZPUlBPU0lYICovCisKKyAgICB9IGVsc2UgaWYgKGZsb3cgPT0gRkxPX1hPTlgpIHsJLyogWG9uL1hvZmYuLi4gKi8KKworI2lmbmRlZiBTVk9SUE9TSVgKKwl0dHJhdy5zZ19mbGFncyB8PSBUQU5ERU07CisjZWxzZQorCXR0cmF3LmNfaWZsYWcgfD0gKElYT058SVhPRkYpOworI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworCXR0aGZsb3coRkxPX1JUU0MsIDAsICZ0dHJhdyk7CS8qIFR1cm4gb2ZmIGhhcmR3YXJlIGZsb3cgY29udHJvbCAqLworCisgICAgfSBlbHNlIGlmIChmbG93ID09IEZMT19OT05FKSB7CS8qIE5vIGZsb3cgY29udHJvbCAqLworCisjaWZuZGVmIFNWT1JQT1NJWAorCXR0cmF3LnNnX2ZsYWdzICY9IH5UQU5ERU07CS8qIFR1cm4gb2ZmIHNvZnR3YXJlIGZsb3cgY29udHJvbCAqLworI2Vsc2UKKwl0dHJhdy5jX2lmbGFnICY9IH4oSVhPTnxJWE9GRik7CisjZW5kaWYgLyogU1ZPUlBPU0lYICovCisJdHRoZmxvdyhGTE9fUlRTQywgMCwgJnR0cmF3KTsJLyogVHVybiBvZmYgYW55IGhhcmR3YXJlIGYvYyB0b28gKi8KKyAgICB9CisKKy8qIFNldCB0aGUgbmV3IG1vZGVzLi4uICovCisKKyNpZm5kZWYgU1ZPUlBPU0lYCQkJLyogQlNEIGFuZCBmcmllbmRzICovCisjaWZkZWYgQkVMTFYxMAorICAgIGlmIChpb2N0bCh0dHlmZCxUSU9DU0VUUCwmdHRyYXcpIDwgMCkKKyAgICAgIHJldHVybigtMSk7CisjZWxzZQorI2lmbmRlZiBNSU5JWDIKKyAgICBpZiAoc3R0eSh0dHlmZCwmdHRyYXcpIDwgMCkKKyAgICAgIHJldHVybigtMSk7CisjZW5kaWYgLyogTUlOSVgyICovCisjZW5kaWYgLyogQkVMTFYxMCAqLworI2Vsc2UKKyNpZmRlZiBCU0Q0NE9SUE9TSVgJCQkvKiBQT1NJWCAqLworICAgIGlmICh0Y3NldGF0dHIodHR5ZmQsVENTQURSQUlOLCZ0dHJhdykgPCAwKQorICAgICAgcmV0dXJuKC0xKTsKKyNlbHNlCQkJCQkvKiBTeXN0ZW0gViAqLworICAgIGlmIChpb2N0bCh0dHlmZCxUQ1NFVEFXLCZ0dHJhdykgPCAwKQorICAgICAgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBCU0Q0NE9SUE9TSVggKi8KKyNlbmRpZiAvKiBTVk9SUE9TSVggKi8KKyAgICByZXR1cm4oMCk7Cit9CisjaWZkZWYgQ09IRVJFTlQKKyN1bmRlZiBTVk9SUE9TSVgKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisvKiAgVCBUIFYgVCAtLSBDb25kaXRpb24gY29tbXVuaWNhdGlvbiBkZXZpY2UgZm9yIHVzZSBhcyB2aXJ0dWFsIHRlcm1pbmFsLiAqLworCitpbnQKKyNpZmRlZiBDS19BTlNJQwordHR2dChsb25nIHNwZWVkLCBpbnQgZmxvdykKKyNlbHNlCit0dHZ0KHNwZWVkLGZsb3cpIGxvbmcgc3BlZWQ7IGludCBmbG93OworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0dHZ0ICovIHsKKyAgICBpbnQgcywgczIsIHg7CisKKyAgICBkZWJ1ZyhGMTAxLCJ0dHZ0IHR0eWZkIiwiIix0dHlmZCk7CisgICAgZGVidWcoRjEwMSwidHR2dCB0dnRmbGciLCIiLHR2dGZsZyk7CisgICAgZGVidWcoRjExMSwidHR2dCBzcGVlZCIsY2tpdG9hKHR0c3BlZWQpLHNwZWVkKTsKKyAgICBkZWJ1ZyhGMTExLCJ0dHZ0IGZsb3ciLGNraXRvYSh0dGZsb3cpLGZsb3cpOworICAgIGRlYnVnKEYxMTEsInR0dnQgY3VyY2FyciIsY2tpdG9hKHR0Y2FyciksY3VyY2Fycik7CisKKy8qIE5vdGU6IE5ldEJTRCBhbmQgbWF5YmUgb3RoZXIgQlNENDRzIGhhdmUgY2ZtYWtlcmF3KCkgKi8KKy8qIE1heWJlIGl0IHdvdWxkIGJlIHNpbXBsZXIgdG8gdXNlIGl0Li4uICovCisKKyAgICB0dHBtc2sgPSAweGZmOworI2lmZGVmIE5PTE9DQUwKKyAgICByZXR1cm4oY29uYmluKChjaGFyKWVzY2NocikpOworI2Vsc2UKKyAgICBpZiAodHR5ZmQgPCAwKSB7CQkJLyogTm90IG9wZW4uICovCisJaWYgKHR0Y2hrKCkgPCAwKQorCSAgcmV0dXJuKC0xKTsKKwllbHNlCQkJCS8qIEJ1dCBtYXliZSBzb21ldGhpbmcgYnVmZmVyZWQuICovCisJICByZXR1cm4oMCk7CisgICAgfQorI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpcGUpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICBpZiAodHRwdHkpIHJldHVybigwKTsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKyNpZmRlZiBORVRDT05OCisgICAgaWYgKG5ldGNvbm4pIHsKKyNpZmRlZiBUQ1BTT0NLRVQKKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgICAgICB7CisJICAgIGV4dGVybiBpbnQgdGNwX25vZGVsYXk7CisJICAgIGlmICh0dG5ldCA9PSBORVRfVENQQikgeworCQlpZiAobm9kZWxheV9zYXYgPiAtMSkgeworCQkgICAgbm9fZGVsYXkodHR5ZmQsbm9kZWxheV9zYXYpOworCQkgICAgbm9kZWxheV9zYXYgPSAtMTsKKwkJfQorCSAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBUQ1BfTk9ERUxBWSAqLworI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgaWYgKGlzdG5jb21wb3J0KCkpIHsKKyAgICAgICAgICAgIGludCByYyA9IC0xOworICAgICAgICAgICAgaWYgKHR2dGZsZyAhPSAwICYmIHNwZWVkID09IHR0c3BlZWQgJiYgZmxvdyA9PSB0dGZsb3cKKyAgICAgICAgICAgICAgICAgLyogJiYgdHRjYXJyID09IGN1cmNhcnIgKi8gKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwidHR2dCBtb2RlcyBhbHJlYWR5IHNldCwgc2tpcHBpbmcuLi4iLCIiLDApOworICAgICAgICAgICAgICAgIHJldHVybigwKTsJCQkvKiBBbHJlYWR5IGJlZW4gY2FsbGVkLiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZsb3cgIT0gdHRmbG93KSB7CisgICAgICAgICAgICAgICAgaWYgKChyYyA9IHRuc2V0ZmxvdyhmbG93KSkgPCAwKQorCQkgIHJldHVybihyYyk7CisgICAgICAgICAgICAgICAgdHRmbG93ID0gZmxvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcGVlZCAhPSB0dHNwZWVkKSB7CisgICAgICAgICAgICAgICAgaWYgKHNwZWVkIDw9IDApIAorCQkgIHNwZWVkID0gdG5jX2dldF9iYXVkKCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHJjID0gdG5jX3NldF9iYXVkKHNwZWVkKSkgPCAwKQorCQkgIHJldHVybihyYyk7CisgICAgICAgICAgICAgICAgdHRzcGVlZCA9IHNwZWVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG5jX3NldF9kYXRhc2l6ZSg4KTsKKwkgICAgdG5jX3NldF9zdG9wc2l6ZShzdG9wYml0cyk7CisKKyNpZmRlZiBIV1BBUklUWQorICAgICAgICAgICAgaWYgKGh3cGFyaXR5KSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChod3Bhcml0eSkgeworCQkgIGNhc2UgJ2UnOgkJLyogRXZlbiAqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ0dHJlcyA4IGJpdHMgKyBldmVuIHBhcml0eSIsIiIsMCk7CisgICAgICAgICAgICAgICAgICAgIHRuY19zZXRfcGFyaXR5KDMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJICBjYXNlICdvJzoJCS8qIE9kZCAqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ0dHJlcyA4IGJpdHMgKyBvZGQgcGFyaXR5IiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgdG5jX3NldF9wYXJpdHkoMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkgIGNhc2UgJ20nOgkJLyogTWFyayAqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJ0dHJlcyA4IGJpdHMgKyBpbnZhbGlkIHBhcml0eTogbWFyayIsIiIsMCk7CisgICAgICAgICAgICAgICAgICAgIHRuY19zZXRfcGFyaXR5KDQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJICBjYXNlICdzJzoJCS8qIFNwYWNlICovCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsInR0cmVzIDggYml0cyArIGludmFsaWQgcGFyaXR5OiBzcGFjZSIsIiIsMCk7CisgICAgICAgICAgICAgICAgICAgIHRuY19zZXRfcGFyaXR5KDUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBIV1BBUklUWSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRuY19zZXRfcGFyaXR5KDEpOwkvKiBOb25lICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0dnRmbGcgPSAxOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCXR2dGZsZyA9IDE7CQkJLyogTmV0d29yayBjb25uZWN0aW9ucy4uLiAqLworCWRlYnVnKEYxMDAsInR0dnQgbmV0d29yayBjb25uZWN0aW9uLCBza2lwcGluZy4uLiIsIiIsMCk7CisJcmV0dXJuKDApOwkJCS8qIC4uLiByZXF1aXJlIG5vIHNwZWNpYWwgc2V0dXAgKi8KKyAgICB9CisjZW5kaWYgLyogTkVUQ09OTiAqLworCisgICAgaWYgKHR2dGZsZyAhPSAwICYmIHNwZWVkID09IHR0c3BlZWQgJiYgZmxvdyA9PSB0dGZsb3cKKwkvKiAmJiB0dGNhcnIgPT0gY3VyY2FyciAqLyApCisgICAgICB7CisJICBkZWJ1ZyhGMTAwLCJ0dHZ0IG1vZGVzIGFscmVhZHkgc2V0LCBza2lwcGluZy4uLiIsIiIsMCk7CisJICByZXR1cm4oMCk7CQkJLyogQWxyZWFkeSBiZWVuIGNhbGxlZC4gKi8KKyAgICAgIH0KKworICAgIGlmICh0dGZkZmxnCisjaWZuZGVmIFBsYW45CisJJiYgIWlzYXR0eSh0dHlmZCkKKyNlbmRpZiAvKiBQbGFuOSAqLworCSkgeworCWRlYnVnKEYxMDAsInR0dnQgdXNpbmcgZXh0ZXJuYWwgZmQsIHNraXBwaW5nLi4uIiwiIiwwKTsKKwlyZXR1cm4oMCk7CisgICAgfQorCisgICAgZGVidWcoRjEwMCwidHR2dCBzZXR0aW5nIG1vZGVzLi4uIiwiIiwwKTsKKworICAgIGlmICh4bG9jYWwpIHsJCQkvKiBGb3IgZXh0ZXJuYWwgbGluZXMuLi4gKi8KKwlzMiA9IChpbnQpIChzcGVlZCAvIDEwTCk7CisJcyA9IHR0c3NwZChzMik7CQkJLyogQ2hlY2svc2V0IHRoZSBzcGVlZCAqLworCWNhcnJjdGwoJnR0dHZ0LCBmbG93ICE9IEZMT19ESUFMIC8qIERvIGNhcnJpZXIgY29udHJvbCAqLworCQkmJiAodHRjYXJyID09IENBUl9PTiB8fCAodHRjYXJyID09IENBUl9BVVQgJiYgdHRtZG0gIT0gMCkpKTsKKyAgICB9IGVsc2UKKyAgICAgIHMgPSBzMiA9IC0xOworCisjaWZkZWYgQ09IRVJFTlQKKyNkZWZpbmUgU1ZPUlBPU0lYCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKworI2lmbmRlZiBTVk9SUE9TSVgKKyAgICAvKiBCZXJrZWxleSwgVjcsIGV0YyAqLworICAgIGlmIChmbG93ID09IEZMT19SVFNDIHx8CQkvKiBIYXJkd2FyZSBmbG93IGNvbnRyb2wgKi8KKwlmbG93ID09IEZMT19EVFJDIHx8CisJZmxvdyA9PSBGTE9fRFRSVCkgeworCXR0aGZsb3coZmxvdywgMSwgJnR0dHZ0KTsKKwlkZWJ1ZyhGMTAwLCJ0dHZ0IGhhcmQgZmxvdywgVEFOREVNIG9mZiIsIiIsMCk7CisJdHR0dnQuc2dfZmxhZ3MgJj0gflRBTkRFTTsJLyogVHVybiBvZmYgc29mdHdhcmUgZmxvdyBjb250cm9sICovCisgICAgfSBlbHNlIGlmIChmbG93ID09IEZMT19YT05YKSB7CS8qIFhvbi9Yb2ZmIGZsb3cgY29udHJvbCAqLworCWRlYnVnKEYxMDAsInR0dnQgVEFOREVNIG9uIiwiIiwwKTsKKwl0dHR2dC5zZ19mbGFncyB8PSBUQU5ERU07CS8qIEFzayBmb3IgaXQuICovCisJdHRoZmxvdyhmbG93LCAwLCAmdHR0dnQpOwkvKiBUdXJuIG9mZiBoYXJkd2FyZSBmL2MgKi8KKyAgICB9IGVsc2UgaWYgKGZsb3cgPT0gRkxPX05PTkUpIHsKKwlkZWJ1ZyhGMTAwLCJ0dHZ0IG5vIGZsb3csIFRBTkRFTSBvZmYsIFJBVyBvbiIsIiIsMCk7CisJdHR0dnQuc2dfZmxhZ3MgJj0gflRBTkRFTTsJLyogVHVybiBvZmYgc29mdHdhcmUgZmxvdyBjb250cm9sICovCisJdHRoZmxvdyhmbG93LCAwLCAmdHR0dnQpOwkvKiBUdXJuIG9mZiBhbnkgaGFyZHdhcmUgZi9jIHRvbyAqLworCXR0dHZ0LnNnX2ZsYWdzIHw9IFJBVzsJCS8qIEVudGVyIHJhdyBtb2RlICovCisgICAgfSBlbHNlIGlmIChmbG93ID09IEZMT19LRUVQKSB7CS8qIEtlZXAgZGV2aWNlJ3Mgb3JpZ2luYWwgc2V0dGluZyAqLworCWRlYnVnKEYxMDAsInR0dnQga2VlcGluZyBvcmlnaW5hbCBUQU5ERU0iLCIiLDApOworCXR0dHZ0LnNnX2ZsYWdzICY9IH5UQU5ERU07CisJdHR0dnQuc2dfZmxhZ3MgfD0gKHR0b2xkLnNnX2ZsYWdzICYgVEFOREVNKTsKKwkvKiBOT1RFOiBXZSBzaG91bGQgYWxzbyBoYW5kbGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIGhlcmUhICovCisgICAgfQorICAgIHR0dHZ0LnNnX2ZsYWdzIHw9IFJBVzsgICAgICAgICAgICAgIC8qIFJhdyBtb2RlIGluIGFsbCBjYXNlcyAqLworI2lmZGVmIFRPV0VSMQorICAgIHR0dHZ0LnNnX2ZsYWdzICY9IH4oRUNIT3xBTllQKTsgICAgIC8qIE5vIGVjaG8gb3IgcGFyaXR5ICovCisjZWxzZQorICAgIHR0dHZ0LnNnX2ZsYWdzICY9IH5FQ0hPOyAgICAgICAgICAgIC8qIE5vIGVjaG8gKi8KKyNlbmRpZiAvKiBUT1dFUjEgKi8KKworI2lmZGVmIEJFTExWMTAKKyAgICBpZiAoaW9jdGwodHR5ZmQsVElPQ1NFVFAsJnR0dHZ0KSA8IDApIC8qIFNldCB0aGUgbmV3IG1vZGVzICovCisgICAgICByZXR1cm4oLTEpOworI2Vsc2UKKyAgICBpZiAoc3R0eSh0dHlmZCwmdHR0dnQpIDwgMCkJCS8qIFNldCB0aGUgbmV3IG1vZGVzICovCisgICAgICByZXR1cm4oLTEpOworI2VuZGlmIC8qIEJFTExWMTAgKi8KKworI2Vsc2UgLyogSXQgaXMgQVRUU1Ygb3IgUE9TSVggKi8KKworICAgIGlmIChmbG93ID09IEZMT19YT05YKSB7CQkvKiBTb2Z0d2FyZSBmbG93IGNvbnRyb2wgKi8KKwl0dHR2dC5jX2lmbGFnIHw9IChJWE9OfElYT0ZGKTsJLyogT24gaWYgcmVxdWVzdGVkLiAqLworCXR0aGZsb3coZmxvdywgMCwgJnR0dHZ0KTsJLyogVHVybiBvZmYgaGFyZHdhcmUgZi9jICovCisJZGVidWcoRjEwMCwidHR2dCBTVk9SUE9TSVggZmxvdyBYT04vWE9GRiIsIiIsMCk7CisgICAgfSBlbHNlIGlmIChmbG93ID09IEZMT19OT05FKSB7CS8qIE5PTkUgKi8KKwl0dHR2dC5jX2lmbGFnICY9IH4oSVhPTnxJWE9GRik7CS8qIFR1cm4gb2ZmIFhvbi9Yb2ZmICovCisJdHRoZmxvdyhmbG93LCAwLCAmdHR0dnQpOwkvKiBUdXJuIG9mZiBoYXJkd2FyZSBmL2MgKi8KKwlkZWJ1ZyhGMTAwLCJ0dHZ0IFNWT1JQT1NJWCBmbG93IE5PTkUiLCIiLDApOworICAgIH0gZWxzZSBpZiAoZmxvdyA9PSBGTE9fS0VFUCkgeworCXR0dHZ0LmNfaWZsYWcgJj0gfihJWE9OfElYT0ZGKTsJLyogVHVybiBvZmYgWG9uL1hvZmYgZmxhZ3MgKi8KKwl0dHR2dC5jX2lmbGFnIHw9ICh0dG9sZC5jX2lmbGFnICYgKElYT058SVhPRkYpKTsgLyogT1IgaW4gb2xkIG9uZXMgKi8KKyNpZmRlZiBQT1NJWF9DUlRTQ1RTCisgICAgICAgIHR0dHZ0LmNfY2ZsYWcgJj0gfkNSVFNDVFM7CS8qIFR1cm4gb2ZmIFJUUy9DVFMgZmxhZyAqLworICAgICAgICB0dHR2dC5jX2NmbGFnIHw9ICh0dG9sZC5jX2NmbGFnICYgQ1JUU0NUUyk7IC8qIE9SIGluIG9sZCBvbmUgKi8KKyNlbmRpZiAvKiBQT1NJWF9DUlRTQ1RTICovCisJZGVidWcoRjEwMCwidHR2dCBTVk9SUE9TSVggZmxvdyBLRUVQIiwiIiwwKTsKKyAgICB9IGVsc2UgaWYgKGZsb3cgPT0gRkxPX1JUU0MgfHwJLyogSGFyZHdhcmUgZmxvdyBjb250cm9sICovCisJICAgICAgIGZsb3cgPT0gRkxPX0RUUkMgfHwKKwkgICAgICAgZmxvdyA9PSBGTE9fRFRSVCkgeworCXR0dHZ0LmNfaWZsYWcgJj0gfihJWE9OfElYT0ZGKTsJLyogKDE5NikgKi8KKwl0dGhmbG93KGZsb3csIDEsICZ0dHR2dCk7CisJZGVidWcoRjEwMCwidHR2dCBTVk9SUE9TSVggZmxvdyBIQVJEIiwiIiwwKTsKKyAgICB9CisjaWZuZGVmIE9YT1MKKyNpZmRlZiBDT0hFUkVOVAorICAgIHR0dHZ0LmNfbGZsYWcgJj0gfihJU0lHfElDQU5PTnxFQ0hPKTsKKyNlbHNlCisgICAgdHR0dnQuY19sZmxhZyAmPSB+KElTSUd8SUNBTk9OfEVDSE98SUVYVEVOKTsKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworI2lmZGVmIFFOWAorICAgIC8qIE5lZWRlZCBmb3IgaHdmYyAqLworICAgIGlmIChmbG93ID09IEZMT19SVFNDIHx8IGZsb3cgPT0gRkxPX0RUUkMgfHwgZmxvdyA9PSBGTE9fRFRSVCkKKyAgICAgIHR0dHZ0LmNfbGZsYWcgfD0gSUVYVEVOOworI2VuZGlmIC8qIFFOWCAqLworI2Vsc2UgLyogT1hPUyAqLworICAgIHR0dHZ0LmNfbGZsYWcgJj0gfihJU0lHfElDQU5PTnxFQ0hPKTsKKyAgICB0dHR2dC5jX2NjW1ZESVNDQVJEXSA9IHR0dHZ0LmNfY2NbVkxORVhUXSA9IENESVNBQkxFOworI2VuZGlmIC8qIE9YT1MgKi8KKworICAgIHR0dHZ0LmNfaWZsYWcgfD0gKElHTkJSS3xJR05QQVIpOworCisvKiBTdG9wIGJpdHMgKi8KKworI2lmZGVmIENTVE9QQgorICAgIGlmICh4bG9jYWwpIHsKKwlpZiAoc3RvcGJpdHMgPT0gMikgeworCSAgICB0dHR2dC5jX2NmbGFnIHw9IENTVE9QQjsJLyogMiBzdG9wIGJpdHMgKi8KKwkgICAgZGVidWcoRjEwMCwidHR2dCAyIHN0b3BiaXRzIiwiIiwwKTsKKwl9IGVsc2UgaWYgKHN0b3BiaXRzID09IDEpIHsKKwkgICAgdHR0dnQuY19jZmxhZyAmPSB+KENTVE9QQik7CS8qIDEgc3RvcCBiaXQgKi8KKwkgICAgZGVidWcoRjEwMCwidHR2dCAxIHN0b3BiaXQiLCIiLDApOworCX0KKyAgICB9CisjZW5kaWYgLyogQ1NUT1BCICovCisKKy8qIFBhcml0eSAqLworCisjaWZkZWYgSFdQQVJJVFkKKyAgICBpZiAoaHdwYXJpdHkgJiYgeGxvY2FsKSB7CQkvKiBIYXJkd2FyZSBwYXJpdHkgKi8KKyNpZmRlZiBDT01NRU5UCisvKiBVbmNvbW1lbnQgdGhpcyBvbmx5IGlmIG5lZWRlZCAtLSBJIGRvbid0IHRoaW5rIGl0IGlzICovCisJdHRyYXcuY19jZmxhZyAmPSB+KENTSVpFKTsJLyogQ2xlYXIgb3V0IGNoYXJhY3Rlci1zaXplIG1hc2sgKi8KKwl0dHJhdy5jX2NmbGFnIHw9IENTODsJCS8qIEFuZCBzZXQgaXQgdG8gOCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBJR05QQVIKKwlkZWJ1ZyhGMTAxLCJ0dHZ0IGh3cGFyaXR5IElHTlBBUiIsIiIsSUdOUEFSKTsKKwl0dHR2dC5jX2lmbGFnIHw9IElHTlBBUjsJLyogRG9uJ3QgZGlzY2FyZCBpbmNvbWluZyBieXRlcyAqLworI2VuZGlmIC8qIElHTlBBUiAqLworCXR0dHZ0LmNfY2ZsYWcgfD0gUEFSRU5COwkvKiBFbmFibGUgcGFyaXR5ICovCisKKwlzd2l0Y2ggKGh3cGFyaXR5KSB7CisJICBjYXNlICdlJzoJCQkvKiBFdmVuICovCisJICAgIHR0dHZ0LmNfY2ZsYWcgJj0gfihQQVJPREQpOworCSAgICBkZWJ1ZyhGMTAwLCJ0dHZ0IDggYml0cyArIGV2ZW4gcGFyaXR5IiwiIiwwKTsKKwkgICAgYnJlYWs7CisJICBjYXNlICdvJzoJCQkvKiBPZGQgKi8KKwkgICAgdHR0dnQuY19jZmxhZyB8PSBQQVJPREQ7CisJICAgIGRlYnVnKEYxMDAsInR0dnQgOCBiaXRzICsgb2RkIHBhcml0eSIsIiIsMCk7CisJICAgIGJyZWFrOworCSAgY2FzZSAnbSc6CQkJLyogTWFyayAqLworCSAgY2FzZSAncyc6CQkJLyogU3BhY2UgKi8KKwkgICAgLyogUEFSRVhUIGlzIG1lbnRpb25lZCBpbiBTVklEIGJ1dCB0aGUgZGV0YWlscyBhcmUgbm90IGdpdmVuLiAqLworCSAgICAvKiBQQVJFWFQgaXMgbm90IGluY2x1ZGVkIGluIFBPU0lYIElTTy9JRUMgOTk0NS0xLiAqLworCSAgICBkZWJ1ZyhGMTAwLCJ0dHZ0IDggYml0cyArIGludmFsaWQgcGFyaXR5IiwiIiwwKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0gZWxzZSB7CQkJCS8qIFdlIGhhbmRsZSBwYXJpdHkgb3Vyc2VsdmVzICovCisjZW5kaWYgLyogSFdQQVJJVFkgKi8KKwl0dHR2dC5jX2NmbGFnICY9IH4oUEFSRU5CKTsJLyogRG9uJ3QgZW5hYmxlIHBhcml0eSAqLworI2lmZGVmIEhXUEFSSVRZCisgICAgfQorI2VuZGlmIC8qIEhXUEFSSVRZICovCisKKyNpZmRlZiBBVFRTVgorI2lmZGVmIEJTRDQ0CisgICAgLyogVGhpbmdzIG5vdCB0byBkby4uLiAqLworICAgIHR0dHZ0LmNfaWZsYWcgJj0gfihJTkxDUnxJR05DUnxJQ1JOTHxJTlBDS3xJU1RSSVB8SVhBTlkpOworI2Vsc2UKKyAgICB0dHR2dC5jX2lmbGFnICY9IH4oSU5MQ1J8SUdOQ1J8SUNSTkx8SVVDTEN8SU5QQ0t8SVNUUklQfElYQU5ZKTsKKyNlbmRpZiAvKiBCU0Q0NCAqLworI2Vsc2UgLyogUE9TSVggKi8KKyAgICB0dHR2dC5jX2lmbGFnICY9IH4oSU5MQ1J8SUdOQ1J8SUNSTkx8SU5QQ0t8SVNUUklQKTsKKyNlbmRpZiAvKiBBVFRTViAqLworICAgIHR0dHZ0LmNfY2ZsYWcgJj0gfihDU0laRSk7CQkvKiBaZXJvIG91dCB0aGUgY2hhciBzaXplIGZpZWxkICovCisgICAgdHR0dnQuY19jZmxhZyB8PSAoQ1M4fENSRUFEfEhVUENMKTsJLyogQ2hhciBzaXplIDgsIGVuYWJsZSByZWNlaXZlciwgaHVwICovCisgICAgdHR0dnQuY19vZmxhZyAmPSB+T1BPU1Q7CQkvKiBEb24ndCBwb3N0cHJvY2VzcyBvdXRwdXQgKi8KKyNpZm5kZWYgVkVPRiAvKiBER1VYIHRlcm1pbyBoYXMgVkVPRiBhdCBlbnRyeSA0LCBzZWUgY29tbWVudCBhYm92ZSAqLworICAgIHR0dHZ0LmNfY2NbNF0gPSAxOworI2Vsc2UKKyNpZm5kZWYgT1hPUworI2lmZGVmIFZNSU4KKyAgICB0dHR2dC5jX2NjW1ZNSU5dID0gMTsKKyNlbmRpZiAvKiBWTUlOICovCisjZWxzZSAvKiBPWE9TICovCisgICAgdHR0dnQuY19taW4gPSAxOworI2VuZGlmIC8qIE9YT1MgKi8KKyNlbmRpZiAvKiBWRU9GICovCisjaWZuZGVmIFZFT0wJLyogREdVWCB0ZXJtaW8gaGFzIFZFT0wgYXQgZW50cnkgNSwgc2VlIGNvbW1lbnQgYWJvdmUgKi8KKyAgICB0dHR2dC5jX2NjWzVdID0gMDsKKyNlbHNlCisjaWZuZGVmIE9YT1MKKyNpZmRlZiBWVElNRQorICAgIHR0dHZ0LmNfY2NbVlRJTUVdID0gMDsKKyNlbmRpZiAvKiBWVElNRSAqLworI2Vsc2UgLyogT1hPUyAqLworICAgIHR0dHZ0LmNfdGltZSA9IDA7CisjZW5kaWYgLyogT1hPUyAqLworI2VuZGlmIC8qIFZFT0wgKi8KKworI2lmZGVmIFBsYW45CisgICAgaWYgKHA5dHR5cGFyaXR5KCduJykgPCAwKQorICAgICAgcmV0dXJuIC0xOworI2Vsc2UKKyNpZmRlZiBCU0Q0NE9SUE9TSVgKKyAgICBlcnJubyA9IDA7CisjaWZkZWYgQkVPU09SQkVCT1gKKyAgICB0dHR2dC5jX2NjW1ZNSU5dID0gMDsJCS8qIERSNyBjYW4gb25seSBwb2xsLiAqLworI2VuZGlmIC8qIEJFT1NPUkJFQk9YICovCisKKyAgICB4ID0gdGNzZXRhdHRyKHR0eWZkLFRDU0FEUkFJTiwmdHR0dnQpOworICAgIGRlYnVnKEYxMDEsInR0dnQgQlNENDRPUlBPU0lYIHRjc2V0YXR0ciIsIiIseCk7CisgICAgaWYgKHggPCAwKSB7CisJZGVidWcoRjEwMSwidHR2dCBCU0Q0NE9SUE9TSVggdGNzZXRhdHRyIGVycm5vIiwiIixlcnJubyk7CisJcmV0dXJuKC0xKTsKKyAgICB9CisjZWxzZSAvKiBBVFRTViAqLworICAgIHggPSBpb2N0bCh0dHlmZCxUQ1NFVEFXLCZ0dHR2dCk7CisgICAgZGVidWcoRjEwMSwidHR2dCBBVFRTViBpb2N0bCBUQ1NFVEFXIiwiIix4KTsKKyAgICBpZiAoeCA8IDApIHsJCQkvKiBzZXQgbmV3IG1vZGVzIC4gKi8KKwlkZWJ1ZyhGMTAxLCJ0dHZ0IEFUVFNWIGlvY3RsIFRDU0VUQVcgZXJybm8iLCIiLGVycm5vKTsKKwlyZXR1cm4oLTEpOwkKKyAgICB9CisjZW5kaWYgLyogQlNENDRPUlBPU0lYICovCisjZW5kaWYgLyogUGxhbjkgKi8KKyNlbmRpZiAvKiBBVFRTViAqLworCisgICAgdHRzcGVlZCA9IHNwZWVkOwkJCS8qIERvbmUsIHJlbWVtYmVyIGhvdyB3ZSB3ZXJlICovCisgICAgdHRmbG93ID0gZmxvdzsJCQkvKiBjYWxsZWQsIHNvIHdlIGNhbiBkZWNpZGUgaG93IHRvICovCisgICAgdHZ0ZmxnID0gMTsJCQkJLyogcmVzcG9uZCBuZXh0IHRpbWUuICovCisgICAgZGVidWcoRjEwMCwidHR2dCBvayIsIiIsMCk7CisgICAgcmV0dXJuKDApOworCisjaWZkZWYgQ09IRVJFTlQKKyN1bmRlZiBTVk9SUE9TSVgKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisjZW5kaWYgLyogTk9MT0NBTCAqLworfQorCisjaWZuZGVmIE5PTE9DQUwKKworLyogU2VyaWFsIHNwZWVkIGRlcGFydG1lbnQgLiAuIC4gKi8KKworLyoKKyAgU0NPIE9TUjUuMC54IG1pZ2h0IG9yIG1pZ2h0IG5vdCBzdXBwb3J0IGhpZ2ggc3BlZWRzLiAgU29tZXRpbWVzIHRoZXkgYXJlIG5vdAorICBkZWZpbmVkIGluIHRoZSBoZWFkZXIgZmlsZXMgYnV0IHRoZXkgYXJlIHN1cHBvcnRlZCAoZS5nLiB3aGVuIGJ1aWxkaW5nIHdpdGgKKyAgVURLIGNvbXBpbGVyIHJhdGhlciB0aGFuIC9iaW4vY2MpLCBzb21ldGltZXMgdmljZSB2ZXJzYS4gIEV2ZW4gdGhvdWdoIDUuMC40CisgIHdhcyB0aGUgZmlyc3QgcmVsZWFzZSB0aGF0IGNhbWUgd2l0aCBoaWdoIHNlcmlhbCBzcGVlZHMgc3RhbmRhcmQsIHJlbGVhc2VzCisgIGJhY2sgdG8gNS4wLjAgY291bGQgdXNlIHRoZW0gaWYgY2VydGFpbiBwYXRjaGVzIChvciAic3VwcGxlbWVudHMiKSB3ZXJlCisgIGFwcGxpZWQgdG8gdGhlIFNJTyBkcml2ZXIuICBQbHVzIGEgbG90IG9mIFNDTyBpbnN0YWxsYXRpb25zIHJ1biB0aGlyZC1wYXJ0eQorICBkcml2ZXJzLgorKi8KKyNpZmRlZiBDS19TQ09WNQorI2lmbmRlZiBCMzg0MDAKKyNkZWZpbmUJQjM4NDAwCTAwMDAwMTcKKyNlbmRpZiAvKiBCMzg0MDAgKi8KKyNpZm5kZWYgQjU3NjAwCisjZGVmaW5lCUI1NzYwMAkwMDAwMDIxCisjZW5kaWYgLyogQjU3NjAwICovCisjaWZuZGVmIEI3NjgwMAorI2RlZmluZQlCNzY4MDAJMDAwMDAyMgorI2VuZGlmIC8qIEI3NjgwMCAqLworI2lmbmRlZiBCMTE1MjAwCisjZGVmaW5lCUIxMTUyMDAJMDAwMDAyMworI2VuZGlmIC8qIEIxMTUyMDAgKi8KKyNpZm5kZWYgQjIzMDQwMAorI2RlZmluZQlCMjMwNDAwCTAwMDAwMjQKKyNlbmRpZiAvKiBCMjMwNDAwICovCisjaWZuZGVmIEI0NjA4MDAKKyNkZWZpbmUJQjQ2MDgwMAkwMDAwMDI1CisjZW5kaWYgLyogQjQ2MDgwMCAqLworI2lmbmRlZiBCOTIxNjAwCisjZGVmaW5lCUI5MjE2MDAJMDAwMDAyNgorI2VuZGlmIC8qIEI5MjE2MDAgKi8KKyNlbmRpZiAvKiBDS19TQ09WNSAqLworLyoKKyAgUGxhbiA5J3MgbmF0aXZlIHNwZWVkIHNldHRpbmcgaW50ZXJmYWNlIGxldHMgeW91IHNldCBhbnl0aGluZyB5b3UgbGlrZSwKKyAgYnV0IHdpbGwgZmFpbCBpZiB0aGUgaGFyZHdhcmUgZG9lc24ndCBsaWtlIGl0LCBzbyB3ZSBhbGxvdyBhbGwgdGhlIGNvbW1vbgorICBzcGVlZHMuCisqLworI2lmZGVmIFBsYW45CisjaWZuZGVmIEI1MAorI2RlZmluZSBCNTAgNTAKKyNlbmRpZiAvKiBCNTAgKi8KKyNpZm5kZWYgQjc1CisjZGVmaW5lIEI3NSA3NQorI2VuZGlmIC8qIEI3NSAqLworI2lmbmRlZiBCMTEwCisjZGVmaW5lIEIxMTAgMTEwCisjZW5kaWYgLyogQjExMCAqLworI2lmbmRlZiBCMTM0CisjZGVmaW5lIEIxMzQgMTM0CisjZW5kaWYgLyogQjEzNCAqLworI2lmbmRlZiBCMjAwCisjZGVmaW5lIEIyMDAgMjAwCisjZW5kaWYgLyogQjIwMCAqLworI2lmbmRlZiBCMzAwCisjZGVmaW5lIEIzMDAgMzAwCisjZW5kaWYgLyogQjMwMCAqLworI2lmbmRlZiBCMTIwMAorI2RlZmluZSBCMTIwMCAxMjAwCisjZW5kaWYgLyogQjEyMDAgKi8KKyNpZm5kZWYgQjE4MDAKKyNkZWZpbmUgQjE4MDAgMTgwMAorI2VuZGlmIC8qIEIxODAwICovCisjaWZuZGVmIEIyNDAwCisjZGVmaW5lIEIyNDAwIDI0MDAKKyNlbmRpZiAvKiBCMjQwMCAqLworI2lmbmRlZiBCNDgwMAorI2RlZmluZSBCNDgwMCA0ODAwCisjZW5kaWYgLyogQjQ4MDAgKi8KKyNpZm5kZWYgQjk2MDAKKyNkZWZpbmUgQjk2MDAgOTYwMAorI2VuZGlmIC8qIEI5NjAwICovCisjaWZuZGVmIEIxNDQwMAorI2RlZmluZSBCMTQ0MDAgMTQ0MDAKKyNlbmRpZiAvKiBCMTQ0MDAgKi8KKyNpZm5kZWYgQjE5MjAwCisjZGVmaW5lIEIxOTIwMCAxOTIwMAorI2VuZGlmIC8qIEIxOTIwMCAqLworI2lmbmRlZiBCMjg4MDAKKyNkZWZpbmUgQjI4ODAwIDI4ODAwCisjZW5kaWYgLyogQjI4ODAwICovCisjaWZuZGVmIEIzODQwMAorI2RlZmluZSBCMzg0MDAgMzg0MDAKKyNlbmRpZiAvKiBCMzg0MDAgKi8KKyNpZm5kZWYgQjU3NjAwCisjZGVmaW5lIEI1NzYwMCA1NzYwMAorI2VuZGlmIC8qIEI1NzYwMCAqLworI2lmbmRlZiBCNzY4MDAKKyNkZWZpbmUgQjc2ODAwIDc2ODAwCisjZW5kaWYgLyogQjc2ODAwICovCisjaWZuZGVmIEIxMTUyMDAKKyNkZWZpbmUgQjExNTIwMCAxMTUyMDAKKyNlbmRpZiAvKiBCMTE1MjAwICovCisjaWZuZGVmIEIyMzA0MDAKKyNkZWZpbmUgQjIzMDQwMCAyMzA0MDAKKyNlbmRpZiAvKiBCMjMwNDAwICovCisjaWZuZGVmIEI0NjA4MDAKKyNkZWZpbmUgQjQ2MDgwMCA0NjA4MDAKKyNlbmRpZiAvKiBCNDYwODAwICovCisjaWZuZGVmIEI5MjE2MDAKKyNkZWZpbmUgQjkyMTYwMCA5MjE2MDAKKyNlbmRpZiAvKiBCOTIxNjAwICovCisjZW5kaWYgLyogUGxhbjkgKi8KKworLyogIFQgVCBTIFMgUCBEICAtLSAgQ2hlY2tzIGFuZCBzZXRzIHRyYW5zbWlzc2lvbiByYXRlLiAgKi8KKworLyogIENhbGwgd2l0aCBzcGVlZCBpbiBjaGFyYWN0ZXJzIChub3QgYml0cyEpIHBlciBzZWNvbmQuICovCisvKiAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLCAwIGlmIGl0IGRpZCBub3RoaW5nLCAxIGlmIGl0IGNoYW5nZWQgdGhlIHNwZWVkLiAqLworCisjaWZkZWYgVVNFVENTRVRTUEVFRAorLyoKKyAgVGhlIHRjc2V0c3BlZWQoKSAvIHRjZ2V0c3BlZWQoKSBpbnRlcmZhY2UgbGV0cyB5b3UgcGFzcyBhbnkgbnVtYmVyIGF0IGFsbAorICB0byBiZSB1c2VkIGFzIGEgc3BlZWQgdG8gYmUgc2V0LCByYXRoZXIgdGhhbiBmb3JjaW5nIGEgY2hvaWNlIGZyb20gYQorICBwcmVkZWZpbmVkIGxpc3QuICBJdCBzZWVtcyB0byBiZSBwZWN1bGlhciB0byBVbml4V2FyZSA3LgorCisgIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb24gY29kZXMgdG8gYmUgcGFzc2VkIHRvIHRjW2dzXWV0c3BlZWQoKSwKKyAgYnV0IGZvciBzb21lIHJlYXNvbiB0aGV5IGRvbid0IHNlZW0gdG8gYmUgcGlja2VkIHVwIGZyb20gdGVybWlvcy5oLgorKi8KKyNpZm5kZWYgVENTX0FMTAorI2RlZmluZSBUQ1NfQUxMIDAKKyNlbmRpZiAvKiBUQ1NfQUxMICovCisjaWZuZGVmIFRDU19JTgorI2RlZmluZSBUQ1NfSU4gMQorI2VuZGlmIC8qIFRDU19JTiAqLworI2lmbmRlZiBUQ1NfT1VUCisjZGVmaW5lIFRDU19PVVQgMgorI2VuZGlmIC8qIFRDU19PVVQgKi8KKyNlbmRpZiAvKiBVU0VUQ1NFVFNQRUVEICovCisKK2ludAordHRzc3BkKGNwcykgaW50IGNwczsgeworICAgIGludCB4OworI2lmZGVmIFBPU0lYCisvKiBXYXRjaCBvdXQsIHNwZWVkX3Qgc2hvdWxkIGJlIHVuc2lnbmVkLCBzbyBkb24ndCBjb21wYXJlIHdpdGggLTEsIGV0Yy4uLiAqLworICAgIHNwZWVkX3QKKyNlbHNlCisgICAgaW50CisjZW5kaWYgLyogUE9TSVggKi8KKyAgICAgIHMsIHMyOworICAgIGludCBvayA9IDE7CQkJCS8qIFNwZWVkIGNoZWNrIHJlc3VsdCwgYXNzdW1lIG9rICovCisKKyNpZmRlZiBPTElOVVhISVNQRUVECisgICAgdW5zaWduZWQgaW50IHNwZF9mbGFncyA9IDA7CisgICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc2VyaW5mbzsKKyNlbmRpZiAvKiBPTElOVVhISVNQRUVEICovCisKKyAgICBkZWJ1ZyhGMTAxLCJ0dHNzcGQgY3BzIiwiIixjcHMpOworICAgIGRlYnVnKEYxMDEsInR0c3NwZCB0dHlmZCIsIiIsdHR5ZmQpOworICAgIGRlYnVnKEYxMDEsInR0c3NwZCB4bG9jYWwiLCIiLHhsb2NhbCk7CisKKyAgICBpZiAodHR5ZmQgPCAwIHx8IHhsb2NhbCA9PSAwKQkvKiBEb24ndCBzZXQgc3BlZWQgb24gY29uc29sZSAqLworICAgICAgcmV0dXJuKDApOworCisjaWZkZWYJTkVUQ09OTgorICAgIGlmIChuZXRjb25uKSB7CisjaWZkZWYgVE5fQ09NUE9SVAorICAgICAgICBpZiAoaXN0bmNvbXBvcnQoKSkKKwkgIHJldHVybih0bmNfc2V0X2JhdWQoY3BzICogMTApKTsKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKwlyZXR1cm4oMCk7CisgIH0KKyNlbmRpZgkvKiBORVRDT05OICovCisjaWZkZWYgTkVUQ01ECisgICAgaWYgKHR0cGlwZSkgcmV0dXJuKDApOworI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorICAgIGlmICh0dHB0eSkgcmV0dXJuKDApOworI2VuZGlmIC8qIE5FVFBUWSAqLworCisgICAgaWYgKGNwcyA8IDApIHJldHVybigtMSk7CisgICAgcyA9IHMyID0gMDsJCQkJLyogTkI6IHMgYW5kIHMyIG1pZ2h0IGJlIHVuc2lnbmVkICovCisKKyNpZmRlZiBVU0VUQ1NFVFNQRUVECisKKyAgICBzID0gY3BzICogMTBMOworCisgICAgeCA9IHRjZ2V0YXR0cih0dHlmZCwmdHRjdXIpOwkvKiBHZXQgY3VycmVudCBzcGVlZCAqLworICAgIGRlYnVnKEYxMDEsInR0c3NwZCB0Y2dldGF0dHIiLCIiLHgpOworICAgIGlmICh4IDwgMCkKKyAgICAgIHJldHVybigtMSk7CisgICAgZGVidWcoRjEwMSwidHRzc3BkIFRDU0VUU1BFRUQgc3BlZWQiLCIiLHMpOworCisgICAgZXJybm8gPSAwOworICAgIGlmIChzID09IDg4ODBMKSB7CQkJLyogNzUvMTIwMCBzcGxpdCBzcGVlZCByZXF1ZXN0ZWQgKi8KKwl0Y3NldHNwZWVkKFRDU19JTiwgJnR0Y3VyLCAxMjAwTCk7CisJdGNzZXRzcGVlZChUQ1NfT1VULCAmdHRjdXIsIDc1TCk7CisgICAgfSBlbHNlCisgICAgICB0Y3NldHNwZWVkKFRDU19BTEwsICZ0dGN1ciwgcyk7CS8qIFB1dCBuZXcgc3BlZWQgaW4gc3RydWN0cyAqLworI2lmZGVmIERFQlVHCisgICAgaWYgKGVycm5vICYgZGVibG9nKSB7CisJZGVidWcoRjEwMSwidHRzc3BkIFRDU0VUU1BFRUQgZXJybm8iLCIiLGVycm5vKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKworI2lmZGVmIENPTU1FTlQKKyAgICB0Y3NldHNwZWVkKFRDU19BTEwsICZ0dHJhdywgcyk7CisgICAgdGNzZXRzcGVlZChUQ1NfQUxMLCAmdHR0dnQsIHMpOworICAgIHRjc2V0c3BlZWQoVENTX0FMTCwgJnR0b2xkLCBzKTsKKyNlbHNlCisgICAgaWYgKHMgPT0gODg4MEwpIHsJCQkvKiA3NS8xMjAwIHNwbGl0IHNwZWVkIHJlcXVlc3RlZCAqLworCXRjc2V0c3BlZWQoVENTX0lOLCAmdHRyYXcsIDEyMDBMKTsKKwl0Y3NldHNwZWVkKFRDU19PVVQsICZ0dHJhdywgNzVMKTsKKwl0Y3NldHNwZWVkKFRDU19JTiwgJnR0dHZ0LCAxMjAwTCk7CisJdGNzZXRzcGVlZChUQ1NfT1VULCAmdHR0dnQsIDc1TCk7CisJdGNzZXRzcGVlZChUQ1NfSU4sICZ0dG9sZCwgMTIwMEwpOworCXRjc2V0c3BlZWQoVENTX09VVCwgJnR0b2xkLCA3NUwpOworICAgIH0gZWxzZSB7CisJdGNzZXRzcGVlZChUQ1NfQUxMLCAmdHRyYXcsIHMpOworCXRjc2V0c3BlZWQoVENTX0FMTCwgJnR0dHZ0LCBzKTsKKwl0Y3NldHNwZWVkKFRDU19BTEwsICZ0dG9sZCwgcyk7CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIHggPSB0Y3NldGF0dHIodHR5ZmQsVENTQURSQUlOLCZ0dGN1cik7IC8qIFNldCB0aGUgc3BlZWQgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dHNzcGQgdGNzZXRhdHRyIiwiIix4KTsKKyAgICBpZiAoeCA8IDApCisgICAgICByZXR1cm4oLTEpOworCisjZWxzZSAgLyogTm90IFVTRVRDU0VUU1BFRUQgKi8KKworI2lmZGVmIE1JTklYMiAgICAgICAgLyogSGFjayBhbGVydCAqLworI2RlZmluZSBNSU5JWCAgICAgICAgLyogVXNlIHByZS0yLjAgc3BlZWQgc2VsZWN0aW9uIGZvciBNaW5peCAyLjAgYXMgd2VsbCAqLworI2VuZGlmIC8qIE1JTklYMiAqLworCisgICAgLyogRmlyc3QgY2hlY2sgdGhhdCB0aGUgZ2l2ZW4gc3BlZWQgaXMgdmFsaWQuICovCisKKyAgICBzd2l0Y2ggKGNwcykgeworI2lmbmRlZiBNSU5JWAorICAgICAgY2FzZSAwOiAgIHMgPSBCMDsgICAgYnJlYWs7CisgICAgICBjYXNlIDU6ICAgcyA9IEI1MDsgICBicmVhazsKKyAgICAgIGNhc2UgNzogICBzID0gQjc1OyAgIGJyZWFrOworI2VuZGlmIC8qIE1JTklYICovCisgICAgICBjYXNlIDExOiAgcyA9IEIxMTA7ICBicmVhazsKKyNpZm5kZWYgTUlOSVgKKyAgICAgIGNhc2UgMTM6ICBzID0gQjEzNDsgIGJyZWFrOworICAgICAgY2FzZSAxNTogIHMgPSBCMTUwOyAgYnJlYWs7CisgICAgICBjYXNlIDIwOiAgcyA9IEIyMDA7ICBicmVhazsKKyNlbmRpZiAvKiBNSU5JWCAqLworICAgICAgY2FzZSAzMDogIHMgPSBCMzAwOyAgYnJlYWs7CisjaWZuZGVmIE1JTklYCisgICAgICBjYXNlIDYwOiAgcyA9IEI2MDA7ICBicmVhazsKKyNlbmRpZiAvKiBNSU5JWCAqLworICAgICAgY2FzZSAxMjA6IHMgPSBCMTIwMDsgYnJlYWs7CisjaWZuZGVmIE1JTklYCisgICAgICBjYXNlIDE4MDogcyA9IEIxODAwOyBicmVhazsKKyNlbmRpZiAvKiBNSU5JWCAqLworICAgICAgY2FzZSAyNDA6IHMgPSBCMjQwMDsgYnJlYWs7CisgICAgICBjYXNlIDQ4MDogcyA9IEI0ODAwOyBicmVhazsKKyNpZm5kZWYgTUlOSVgKKyAgICAgIGNhc2UgODg4OiBzID0gQjc1OyBzMiA9IEIxMjAwOyBicmVhazsgLyogODg4ID0gNzUvMTIwMCBzcGxpdCBzcGVlZCAqLworI2VuZGlmIC8qIE1JTklYICovCisjaWZkZWYgQjcyMDAKKyAgICAgIGNhc2UgNzIwOiBzID0gQjcyMDA7IGJyZWFrOworI2VuZGlmIC8qIEI3MjAwICovCisgICAgICBjYXNlIDk2MDogcyA9IEI5NjAwOyBicmVhazsKKyNpZmRlZiBCMTQ0MDAKKyAgICAgIGNhc2UgMTQ0MDogcyA9IEIxNDQwMDsgYnJlYWs7CisjZW5kaWYgLyogQjE0NDAwICovCisjaWZkZWYgQjE5MjAwCisgICAgICBjYXNlIDE5MjA6IHMgPSBCMTkyMDA7IGJyZWFrOworI2Vsc2UKKyNpZmRlZiBFWFRBCisgICAgICBjYXNlIDE5MjA6IHMgPSBFWFRBOyBicmVhazsKKyNlbmRpZiAvKiBFWFRBICovCisjZW5kaWYgLyogQjE5MjAwICovCisjaWZkZWYgQjI4ODAwCisgICAgICBjYXNlIDI4ODA6IHMgPSBCMjg4MDA7IGJyZWFrOworI2VuZGlmIC8qIEIyODgwMCAqLworI2lmZGVmIEIzODQwMAorICAgICAgY2FzZSAzODQwOiBzID0gQjM4NDAwOworI2lmZGVmIE9MSU5VWEhJU1BFRUQKKyAgICAgICAgc3BkX2ZsYWdzID0gfkFTWU5DX1NQRF9NQVNLOwkvKiBOb256ZXJvLCBidXQgemVybyBmbGFncyAqLworI2VuZGlmIC8qIE9MSU5VWEhJU1BFRUQgKi8KKwlicmVhazsKKyNlbHNlIC8qIEIzODQwMCBub3QgZGVmaW5lZC4uLiAqLworI2lmZGVmIEVYVEIKKyAgICAgIGNhc2UgMzg0MDogcyA9IEVYVEI7IGJyZWFrOworI2VuZGlmIC8qIEVYVEIgKi8KKyNlbmRpZiAvKiBCMzg0MDAgKi8KKworI2lmZGVmIEhQVVgKKyNpZmRlZiBfQjU3NjAwCisgICAgICBjYXNlIDU3NjA6IHMgPSBfQjU3NjAwOyBicmVhazsKKyNlbmRpZiAvKiBfQjU3NjAwICovCisjaWZkZWYgX0IxMTUyMDAKKyAgICAgIGNhc2UgMTE1MjA6IHMgPSBfQjExNTIwMDsgYnJlYWs7CisjZW5kaWYgLyogX0IxMTUyMDAgKi8KKyNlbHNlCisjaWZkZWYgT0xJTlVYSElTUEVFRAorLyoKKyAgVGhpcyBiaXQgZnJvbSA8Y2FybG9Ac2cudG4udHVkZWxmdC5ubD46CisgICJPbmx5IG5vdGUgdG8gbWFrZSBpcyBtYXliZSB0aGlzOiBXaGVuIHRoZSBBU1lOQ19TUERfQ1VTVCBmbGFncyBhcmUgc2V0IHRoZW4KKyAgc2V0dGluZyB0aGUgc3BlZWQgdG8gMzg0MDAgd2lsbCBzZXQgdGhlIGN1c3RvbSBzcGVlZCAoYW5kIHR0Z3NwZCByZXR1cm5zCisgIDM4NDAwKSwgYnV0IHNwZWVkcyA1NzYwMCBhbmQgMTE1MjAwIHdvbid0IHdvcmsgYW55IG1vcmUgYmVjYXVzZSBJIGRpZG4ndAorICB3YW50IHRvIG1lc3MgdXAgdGhlIHNwZWVkIGZsYWdzIHdoZW4gc29tZW9uZSBpcyBkb2luZyBzb3BoaXN0aWNhdGVkIHN0dWZmCisgIGxpa2UgY3VzdG9tIHNwZWVkcy4uLiIKKyovCisgICAgICBjYXNlIDU3NjA6IHMgPSBCMzg0MDA7IHNwZF9mbGFncyA9IEFTWU5DX1NQRF9ISTsgYnJlYWs7CisgICAgICBjYXNlIDExNTIwOiBzID0gQjM4NDAwOyBzcGRfZmxhZ3MgPSBBU1lOQ19TUERfVkhJOyBicmVhazsKKyNlbHNlCisjaWZkZWYgQjU3NjAwCisgICAgICBjYXNlIDU3NjA6IHMgPSBCNTc2MDA7IGJyZWFrOworI2VuZGlmIC8qIEI1NzYwMCAqLworI2lmZGVmIEI3NjgwMAorICAgICAgY2FzZSA3NjgwOiBzID0gQjc2ODAwOyBicmVhazsKKyNlbmRpZiAvKiBCNzY4MDAgKi8KKyNpZmRlZiBCMTE1MjAwCisgICAgICBjYXNlIDExNTIwOiBzID0gQjExNTIwMDsgYnJlYWs7CisjZW5kaWYgLyogQjExNTIwMCAqLworI2VuZGlmIC8qIE9MSU5VWEhJU1BFRUQgKi8KKyNpZmRlZiBCMTUzNjAwCisgICAgICBjYXNlIDE1MzYwOiBzID0gQjE1MzYwMDsgYnJlYWs7CisjZW5kaWYgLyogQjE1MzYwMCAqLworI2lmZGVmIEIyMzA0MDAKKyAgICAgIGNhc2UgMjMwNDA6IHMgPSBCMjMwNDAwOyBicmVhazsKKyNlbmRpZiAvKiBCMjMwNDAwICovCisjaWZkZWYgQjMwNzIwMAorICAgICAgY2FzZSAzMDcyMDogcyA9IEIzMDcyMDA7IGJyZWFrOworI2VuZGlmIC8qIEIzMDcyMDAgKi8KKyNpZmRlZiBCNDYwODAwCisgICAgICBjYXNlIDQ2MDgwOiBzID0gQjQ2MDgwMDsgYnJlYWs7CisjZW5kaWYgLyogNDYwODAwICovCisjaWZkZWYgQjkyMTYwMAorICAgICAgY2FzZSA5MjE2MDogcyA9IEI5MjE2MDA7IGJyZWFrOworI2VuZGlmIC8qIEI5MjE2MDAgKi8KKyNlbmRpZiAvKiBIUFVYICovCisgICAgICBkZWZhdWx0OgorCW9rID0gMDsJCQkJLyogR29vZCBzcGVlZCBub3QgZm91bmQsIHNvIG5vdCBvayAqLworCWJyZWFrOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJ0dHNzcGQgb2siLCIiLG9rKTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dHNzcGQgcyIsIiIscyk7CisKKyAgICBpZiAoIW9rKSB7CisJZGVidWcoRjEwMCwidHRzc3BkIGZhaWxzIiwiIiwwKTsKKwlyZXR1cm4oLTEpOworICAgIH0gZWxzZSB7CisJaWYgKCFzMikgczIgPSBzOwkJLyogU2V0IGlucHV0IHNwZWVkICovCisjaWZkZWYgUGxhbjkKKwlpZiAocDl0dHNzcGQoY3BzKSA8IDApCisJICByZXR1cm4oLTEpOworI2Vsc2UKKyNpZmRlZiBCU0Q0NE9SUE9TSVgKKwl4ID0gdGNnZXRhdHRyKHR0eWZkLCZ0dGN1cik7CS8qIEdldCBjdXJyZW50IHNwZWVkICovCisJZGVidWcoRjEwMSwidHRzc3BkIHRjZ2V0YXR0ciIsIiIseCk7CisJaWYgKHggPCAwKQorCSAgcmV0dXJuKC0xKTsKKyNpZmRlZiBPTElOVVhISVNQRUVECisJZGVidWcoRjEwMSwidHRzc3BkIHNwZF9mbGFncyIsIiIsc3BkX2ZsYWdzKTsKKwlpZiAoc3BkX2ZsYWdzICYmIHNwZF9mbGFncyAhPSBBU1lOQ19TUERfQ1VTVCkgeworCSAgICBpZiAoaW9jdGwodHR5ZmQsIFRJT0NHU0VSSUFMLCAmc2VyaW5mbykgPCAwKSB7CisJCWRlYnVnKEYxMDAsInR0c3NwZDogVElPQ0dTRVJJQUwgZmFpbGVkIiwiIiwwKTsKKwkJcmV0dXJuKC0xKTsKKwkgICAgfSBlbHNlIGRlYnVnKEYxMDAsInR0c3NwZDogVElPQ0dTRVJJQUwgb2siLCIiLDApOworCSAgICBzZXJpbmZvLmZsYWdzICY9IH5BU1lOQ19TUERfTUFTSzsKKwkgICAgc2VyaW5mby5mbGFncyB8PSAoc3BkX2ZsYWdzICYgQVNZTkNfU1BEX01BU0spOworCSAgICBpZiAoaW9jdGwodHR5ZmQsIFRJT0NTU0VSSUFMLCAmc2VyaW5mbykgPCAwKQorCSAgICAgIHJldHVybigtMSk7CisJfQorI2VuZGlmIC8qIE9MSU5VWEhJU1BFRUQgKi8KKwljZnNldG9zcGVlZCgmdHRjdXIscyk7CisJY2ZzZXRpc3BlZWQoJnR0Y3VyLHMyKTsKKwljZnNldG9zcGVlZCgmdHRyYXcscyk7CisJY2ZzZXRpc3BlZWQoJnR0cmF3LHMyKTsKKwljZnNldG9zcGVlZCgmdHR0dnQscyk7CisJY2ZzZXRpc3BlZWQoJnR0dHZ0LHMyKTsKKwljZnNldG9zcGVlZCgmdHRvbGQscyk7CisJY2ZzZXRpc3BlZWQoJnR0b2xkLHMyKTsKKwl4ID0gdGNzZXRhdHRyKHR0eWZkLFRDU0FEUkFJTiwmdHRjdXIpOworCWRlYnVnKEYxMDEsInR0c3NwZCB0Y3NldGF0dHIiLCIiLHgpOworCWlmICh4IDwgMCkgcmV0dXJuKC0xKTsKKyNlbHNlCisjaWZkZWYgQVRUU1YKKwlpZiAoY3BzID09IDg4OCkgcmV0dXJuKC0xKTsJLyogTm8gc3BsaXQgc3BlZWRzLCBzb3JyeS4gKi8KKwl4ID0gaW9jdGwodHR5ZmQsVENHRVRBLCZ0dGN1cik7CisJZGVidWcoRjEwMSwidHRzc3BkIFRDR0VUQSBpb2N0bCIsIiIseCk7CisJaWYgKHggPCAwKSByZXR1cm4oLTEpOworCXR0Y3VyLmNfY2ZsYWcgJj0gfkNCQVVEOworCXR0Y3VyLmNfY2ZsYWcgfD0gczsKKwl0dHR2dC5jX2NmbGFnICY9IH5DQkFVRDsKKwl0dHR2dC5jX2NmbGFnIHw9IHM7CisJdHRyYXcuY19jZmxhZyAmPSB+Q0JBVUQ7CisJdHRyYXcuY19jZmxhZyB8PSBzOworCXR0b2xkLmNfY2ZsYWcgJj0gfkNCQVVEOworCXR0b2xkLmNfY2ZsYWcgfD0gczsKKwl4ID0gaW9jdGwodHR5ZmQsVENTRVRBVywmdHRjdXIpOworCWRlYnVnKEYxMDEsInR0c3NwZCBUQ1NFVEFXIGlvY3RsIiwiIix4KTsKKwlpZiAoeCA8IDApIHJldHVybigtMSk7CisjZWxzZQorI2lmZGVmIEJFTExWMTAKKwl4ID0gaW9jdGwodHR5ZmQsVElPQ0dERVYsJnRkY3VyKTsKKwlkZWJ1ZyhGMTAxLCJ0dHNzcGQgVElPQ0dERVYgaW9jdGwiLCIiLHgpOworCWlmICh4IDwgMCkgcmV0dXJuKC0xKTsKKwl0ZGN1ci5pc3BlZWQgPSBzMjsKKwl0ZGN1ci5vc3BlZWQgPSBzOworCWVycm5vID0gMDsKKwlvayA9IGlvY3RsKHR0eWZkLFRJT0NTREVWLCZ0ZGN1cik7CisJZGVidWcoRjEwMSwidHRzc3BkIEJFTExWMTAgaW9jdGwiLCIiLG9rKTsKKwlpZiAob2sgPCAwKSB7CisJICAgIHBlcnJvcih0dG5tc3YpOworCSAgICBkZWJ1ZyhGMTAxLCJ0dHNzcGQgQkVMTFYxMCBlcnJubyIsIiIsb2spOworCSAgICByZXR1cm4oLTEpOworCX0KKyNlbHNlCisJeCA9IGd0dHkodHR5ZmQsJnR0Y3VyKTsKKwlkZWJ1ZyhGMTAxLCJ0dHNzcGQgZ3R0eSIsIiIseCk7CisJaWYgKHggPCAwKSByZXR1cm4oLTEpOworCXR0Y3VyLnNnX29zcGVlZCA9IHM7IHR0Y3VyLnNnX2lzcGVlZCA9IHMyOworCXR0dHZ0LnNnX29zcGVlZCA9IHM7IHR0dHZ0LnNnX2lzcGVlZCA9IHMyOworCXR0cmF3LnNnX29zcGVlZCA9IHM7IHR0cmF3LnNnX2lzcGVlZCA9IHMyOworCXR0b2xkLnNnX29zcGVlZCA9IHM7IHR0b2xkLnNnX2lzcGVlZCA9IHMyOworCXggPSBzdHR5KHR0eWZkLCZ0dGN1cik7CisJZGVidWcoRjEwMSwidHRzc3BkIHN0dHkiLCIiLHgpOworCWlmICh4IDwgMCkgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBCRUxMVjEwICovCisjZW5kaWYgLyogQVRUU1YgKi8KKyNlbmRpZiAvKiBCU0Q0NE9SUE9TSVggKi8KKyNlbmRpZiAvKiBQbGFuOSAqLworICAgIH0KKyAgICByZXR1cm4oMSk7CQkJCS8qIFJldHVybiAxID0gc3VjY2Vzcy4gKi8KKyNlbmRpZiAvKiBVU0VUQ1NFVFNQRUVEICovCit9CisKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKy8qIEMgTyBOIEcgUyBQIEQgIC0gIEdldCBzcGVlZCBvZiBjb25zb2xlIHRlcm1pbmFsICAqLworCitsb25nCitjb25nc3BkKCkgeworLyoKKyAgVGhpcyBpcyBhIGRpc2d1c3RpbmcgaGFjay4gIFRoZSByaWdodCB3YXkgdG8gZG8gdGhpcyB3b3VsZCBiZSB0byBwYXNzIGFuCisgIGFyZ3VtZW50IHRvIHR0Z3NwZCgpLCBidXQgdGhlbiB3ZSdkIG5lZWQgdG8gY2hhbmdlIHRoZSBLZXJtaXQgQVBJIGFuZAorICBhbGwgb2YgdGhlIGNrP3Rpby5jIG1vZHVsZXMuICAoQ3VycmVudGx5IHVzZWQgb25seSBmb3IgcmxvZ2luLikKKyovCisgICAgaW50IHQxOworICAgIGxvbmcgc3BkOworI2lmZGVmIE5FVENPTk4KKyAgICBpbnQgdDIgPSBuZXRjb25uOworICAgIG5ldGNvbm4gPSAwOworI2VuZGlmIC8qIE5FVENPTk4gKi8KKyAgICB0MSA9IHR0eWZkOworICAgIHR0eWZkID0gLTE7CisgICAgc3BkID0gdHRnc3BkKCk7CisgICAgZGVidWcoRjEwMSwiY29uZ3NwZCIsIiIsc3BkKTsKKyNpZmRlZiBORVRDT05OCisgICAgbmV0Y29ubiA9IHQyOworI2VuZGlmIC8qIE5FVENPTk4gKi8KKyAgICB0dHlmZCA9IHQxOworICAgIHJldHVybihzcGQpOworfQorCisvKiAgVCBUIFMgUCBEIEwgSSBTIFQgIC0tIEdldCBsaXN0IG9mIHNlcmlhbCBzcGVlZHMgYWxsb3dlZCBvbiB0aGlzIHBsYXRmb3JtICovCisKKyNkZWZpbmUgTlNQRExJU1QgNjQKK3N0YXRpYyBsb25nIHNwZGxpc3RbTlNQRExJU1RdOworLyoKKyAgQXMgd3JpdHRlbiwgdGhpcyBwaWNrcyB1cCB0aGUgc3BlZWRzIGtub3duIGF0IGNvbXBpbGUgdGltZSwgYW5kIHRodXMKKyAgYXBwbHkgdG8gdGhlIHN5c3RlbSB3aGVyZSBDLUtlcm1pdCB3YXMgYnVpbHQsIHJhdGhlciB0aGFuIHRvIHRoZSBvbmUgd2hlcmUKKyAgaXQgaXMgcnVubmluZy4gIFN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudCBhcmUgYWx3YXlzIHdlbGNvbWUuCisqLworbG9uZyAqCit0dHNwZGxpc3QoKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IE5TUERMSVNUOyBpKyspCS8qIEluaXRpYWxpemUgdGhlIGxpc3QgKi8KKyAgICAgIHNwZGxpc3RbaV0gPSAtMUw7CisgICAgaSA9IDE7CisKKyNpZmRlZiBVU0VUQ1NFVFNQRUVECQkJLyogTm8gd2F5IHRvIGZpbmQgb3V0IHdoYXQncyBsZWdhbCAqLworICAgIGRlYnVnKEYxMDAsInR0c3BkbGlzdCBVU0VUQ1NFVFNQRUVEIiwiIiwwKTsKKyAgICBzcGRsaXN0W2krK10gPSA1MEw7CisjaWZuZGVmIFVXNworICAgIHNwZGxpc3RbaSsrXSA9IDc1TDsKKyNlbmRpZiAvKiBVVzcgKi8KKyAgICBzcGRsaXN0W2krK10gPSAxMTBMOworI2lmbmRlZiBVVzcKKyAgICBzcGRsaXN0W2krK10gPSAxMzRMOworI2VuZGlmIC8qIFVXNyAqLworICAgIHNwZGxpc3RbaSsrXSA9IDE1MEw7CisgICAgc3BkbGlzdFtpKytdID0gMjAwTDsKKyAgICBzcGRsaXN0W2krK10gPSAzMDBMOworICAgIHNwZGxpc3RbaSsrXSA9IDYwMEw7CisgICAgc3BkbGlzdFtpKytdID0gMTIwMEw7CisgICAgc3BkbGlzdFtpKytdID0gMTgwMEw7CisgICAgc3BkbGlzdFtpKytdID0gMjQwMEw7CisgICAgc3BkbGlzdFtpKytdID0gNDgwMEw7CisgICAgc3BkbGlzdFtpKytdID0gODg4MEw7CisgICAgc3BkbGlzdFtpKytdID0gOTYwMEw7CisgICAgc3BkbGlzdFtpKytdID0gMTQ0MDBMOworICAgIHNwZGxpc3RbaSsrXSA9IDE5MjAwTDsKKyAgICBzcGRsaXN0W2krK10gPSAyODgwMEw7CisjaWZuZGVmIFVXNworICAgIHNwZGxpc3RbaSsrXSA9IDMzNjAwTDsKKyNlbmRpZiAvKiBVVzcgKi8KKyAgICBzcGRsaXN0W2krK10gPSAzODQwMEw7CisgICAgc3BkbGlzdFtpKytdID0gNTc2MDBMOworICAgIHNwZGxpc3RbaSsrXSA9IDc2ODAwTDsKKyAgICBzcGRsaXN0W2krK10gPSAxMTUyMDBMOworI2lmbmRlZiBVVzcKKyAgICBzcGRsaXN0W2krK10gPSAxNTM2MDBMOworICAgIHNwZGxpc3RbaSsrXSA9IDIzMDQwMEw7CisgICAgc3BkbGlzdFtpKytdID0gMzA3MjAwTDsKKyAgICBzcGRsaXN0W2krK10gPSA0NjA4MDBMOworICAgIHNwZGxpc3RbaSsrXSA9IDkyMTYwMEw7CisjZW5kaWYgLyogVVc3ICovCisKKyNlbHNlICAvKiBVU0VUQ1NFVFNQRUVEICovCisKKyAgICBkZWJ1ZyhGMTAwLCJ0dHNwZGxpc3Qgbm8gVVNFVENTRVRTUEVFRCIsIiIsMCk7CisKKyNpZmRlZiBCNTAKKyAgICBkZWJ1ZyhGMTAxLCJ0dHNwZGxpc3QgQjUwIiwiIixCNTApOworICAgIHNwZGxpc3RbaSsrXSA9IDUwTDsKKyNlbmRpZiAvKiBCNTAgKi8KKyNpZmRlZiBCNzUKKyAgICBkZWJ1ZyhGMTAxLCJ0dHNwZGxpc3QgQjc1IiwiIixCNzUpOworICAgIHNwZGxpc3RbaSsrXSA9IDc1TDsKKyNlbmRpZiAvKiBCNzUgKi8KKyNpZmRlZiBCMTEwCisgICAgZGVidWcoRjEwMSwidHRzcGRsaXN0IEIxMTAiLCIiLEIxMTApOworICAgIHNwZGxpc3RbaSsrXSA9IDExMEw7CisjZW5kaWYgLyogQjExMCAqLworI2lmZGVmIEIxMzQKKyAgICBkZWJ1ZyhGMTAxLCJ0dHNwZGxpc3QgQjEzNCIsIiIsQjEzNCk7CisgICAgc3BkbGlzdFtpKytdID0gMTM0TDsKKyNlbmRpZiAvKiBCMTM0ICovCisjaWZkZWYgQjE1MAorICAgIGRlYnVnKEYxMDEsInR0c3BkbGlzdCBCMTUwIiwiIixCMTUwKTsKKyAgICBzcGRsaXN0W2krK10gPSAxNTBMOworI2VuZGlmIC8qIEIxNTAgKi8KKyNpZmRlZiBCMjAwCisgICAgZGVidWcoRjEwMSwidHRzcGRsaXN0IEIyMDAiLCIiLEIyMDApOworICAgIHNwZGxpc3RbaSsrXSA9IDIwMEw7CisjZW5kaWYgLyogQjIwMCAqLworI2lmZGVmIEIzMDAKKyAgICBkZWJ1ZyhGMTAxLCJ0dHNwZGxpc3QgQjMwMCIsIiIsQjMwMCk7CisgICAgc3BkbGlzdFtpKytdID0gMzAwTDsKKyNlbmRpZiAvKiBCMzAwICovCisjaWZkZWYgQjYwMAorICAgIGRlYnVnKEYxMDEsInR0c3BkbGlzdCBCNjAwIiwiIixCNjAwKTsKKyAgICBzcGRsaXN0W2krK10gPSA2MDBMOworI2VuZGlmIC8qIEI2MDAgKi8KKyNpZmRlZiBCMTIwMAorICAgIGRlYnVnKEYxMDEsInR0c3BkbGlzdCBCMTIwMCIsIiIsQjEyMDApOworICAgIHNwZGxpc3RbaSsrXSA9IDEyMDBMOworI2VuZGlmIC8qIEIxMjAwICovCisjaWZkZWYgQjE4MDAKKyAgICBkZWJ1ZyhGMTAxLCJ0dHNwZGxpc3QgQjE4MDAiLCIiLEIxODAwKTsKKyAgICBzcGRsaXN0W2krK10gPSAxODAwTDsKKyNlbmRpZiAvKiBCMTgwMCAqLworI2lmZGVmIEIyNDAwCisgICAgZGVidWcoRjEwMSwidHRzcGRsaXN0IEIyNDAwIiwiIixCMjQwMCk7CisgICAgc3BkbGlzdFtpKytdID0gMjQwMEw7CisjZW5kaWYgLyogQjI0MDAgKi8KKyNpZmRlZiBCNDgwMAorICAgIGRlYnVnKEYxMDEsInR0c3BkbGlzdCBCNDgwMCIsIiIsQjQ4MDApOworICAgIHNwZGxpc3RbaSsrXSA9IDQ4MDBMOworI2VuZGlmIC8qIEI0ODAwICovCisjaWZkZWYgQjk2MDAKKyAgICBkZWJ1ZyhGMTAxLCJ0dHNwZGxpc3QgQjk2MDAiLCIiLEI5NjAwKTsKKyAgICBzcGRsaXN0W2krK10gPSA5NjAwTDsKKyNlbmRpZiAvKiBCOTYwMCAqLworI2lmZGVmIEIxNDQwMAorICAgIGRlYnVnKEYxMDEsInR0c3BkbGlzdCBCMTQ0MDAiLCIiLEIxNDQwMCk7CisgICAgc3BkbGlzdFtpKytdID0gMTQ0MDBMOworI2VuZGlmIC8qIEIxNDQwMCAqLworI2lmZGVmIEIxOTIwMAorICAgIGRlYnVnKEYxMDEsInR0c3BkbGlzdCBCMTkyMDAiLCIiLEIxOTIwMCk7CisgICAgc3BkbGlzdFtpKytdID0gMTkyMDBMOworI2Vsc2UKKyNpZmRlZiBFWFRBCisgICAgZGVidWcoRjEwMSwidHRzcGRsaXN0IEVYVEEiLCIiLEVYVEEpOworICAgIHNwZGxpc3RbaSsrXSA9IDE5MjAwTDsKKyNlbmRpZiAvKiBFWFRBICovCisjZW5kaWYgLyogQjE5MjAwICovCisjaWZkZWYgQjI4ODAwCisgICAgZGVidWcoRjEwMSwidHRzcGRsaXN0IEIyODgwMCIsIiIsQjI4ODAwKTsKKyAgICBzcGRsaXN0W2krK10gPSAyODgwMEw7CisjZW5kaWYgLyogQjI4ODAwICovCisjaWZkZWYgQjMzNjAwCisgICAgZGVidWcoRjEwMSwidHRzcGRsaXN0IEIzMzYwMCIsIiIsQjMzNjAwKTsKKyAgICBzcGRsaXN0W2krK10gPSAzMzYwMEw7CisjZW5kaWYgLyogQjMzNjAwICovCisjaWZkZWYgQjM4NDAwCisgICAgZGVidWcoRjEwMSwidHRzcGRsaXN0IEIzODQwMCIsIiIsQjM4NDAwKTsKKyAgICBzcGRsaXN0W2krK10gPSAzODQwMEw7CisjZWxzZQorI2lmZGVmIEVYVEIKKyAgICBkZWJ1ZyhGMTAxLCJ0dHNwZGxpc3QgRVhUQiIsIiIsRVhUQik7CisgICAgc3BkbGlzdFtpKytdID0gMzg0MDBMOworI2VuZGlmIC8qIEVYVEIgKi8KKyNlbmRpZiAvKiBCMzg0MDAgKi8KKyNpZmRlZiBfQjU3NjAwCisgICAgZGVidWcoRjEwMSwidHRzcGRsaXN0IF9CNTc2MDAiLCIiLF9CNTc2MDApOworICAgIHNwZGxpc3RbaSsrXSA9IDU3NjAwTDsKKyNlbHNlCisjaWZkZWYgQjU3NjAwCisgICAgZGVidWcoRjEwMSwidHRzcGRsaXN0IEI1NzYwMCIsIiIsQjU3NjAwKTsKKyAgICBzcGRsaXN0W2krK10gPSA1NzYwMEw7CisjZW5kaWYgLyogQjU3NjAwICovCisjZW5kaWYgLyogX0I1NzYwMCAqLworI2lmZGVmIEI3NjgwMAorICAgIGRlYnVnKEYxMDEsInR0c3BkbGlzdCBCNzY4MDAiLCIiLEI3NjgwMCk7CisgICAgc3BkbGlzdFtpKytdID0gNzY4MDBMOworI2VuZGlmIC8qIEI3NjgwMCAqLworI2lmZGVmIF9CMTE1MjAwCisgICAgZGVidWcoRjEwMSwidHRzcGRsaXN0IF9CMTE1MjAwIiwiIixfQjExNTIwMCk7CisgICAgc3BkbGlzdFtpKytdID0gMTE1MjAwTDsKKyNlbHNlCisjaWZkZWYgQjExNTIwMAorICAgIGRlYnVnKEYxMDEsInR0c3BkbGlzdCBCMTE1MjAwIiwiIixCMTE1MjAwKTsKKyAgICBzcGRsaXN0W2krK10gPSAxMTUyMDBMOworI2VuZGlmIC8qIEIxMTUyMDAgKi8KKyNlbmRpZiAvKiBfQjExNTIwMCAqLworI2lmZGVmIEIxNTM2MDAKKyAgICBkZWJ1ZyhGMTAxLCJ0dHNwZGxpc3QgQjE1MzYwMCIsIiIsQjE1MzYwMCk7CisgICAgc3BkbGlzdFtpKytdID0gMTUzNjAwTDsKKyNlbmRpZiAvKiBCMTUzNjAwICovCisjaWZkZWYgQjIzMDQwMAorICAgIGRlYnVnKEYxMDEsInR0c3BkbGlzdCBCMjMwNDAwIiwiIixCMjMwNDAwKTsKKyAgICBzcGRsaXN0W2krK10gPSAyMzA0MDBMOworI2VuZGlmIC8qIEIyMzA0MDAgKi8KKyNpZmRlZiBCMzA3MjAwCisgICAgZGVidWcoRjEwMSwidHRzcGRsaXN0IEIzMDcyMDAiLCIiLEIzMDcyMDApOworICAgIHNwZGxpc3RbaSsrXSA9IDMwNzIwMEw7CisjZW5kaWYgLyogQjMwNzIwMCAqLworI2lmZGVmIEI0NjA4MDAKKyAgICBkZWJ1ZyhGMTAxLCJ0dHNwZGxpc3QgQjQ2MDgwMCIsIiIsQjQ2MDgwMCk7CisgICAgc3BkbGlzdFtpKytdID0gNDYwODAwTDsKKyNlbmRpZiAvKiBCNDYwODAwICovCisjaWZkZWYgQjkyMTYwMAorICAgIGRlYnVnKEYxMDEsInR0c3BkbGlzdCBCOTIxNjAwIiwiIixCOTIxNjAwKTsKKyAgICBzcGRsaXN0W2krK10gPSA5MjE2MDBMOworI2VuZGlmIC8qIEI5MjE2MDAgKi8KKyNlbmRpZiAvKiBVU0VUQ1NFVFNQRUVEICovCisgICAgc3BkbGlzdFswXSA9IGkgLSAxOwkJCS8qIFJldHVybiBjb3VudCBpbiAwdGggZWxlbWVudCAqLworICAgIGRlYnVnKEYxMTEsInR0c3BkbGlzdCBzcGRsaXN0IiwiMCIsc3BkbGlzdFswXSk7CisgICAgcmV0dXJuKChsb25nICopc3BkbGlzdCk7Cit9CisKKy8qIFQgVCBHIFMgUCBEICAtICBHZXQgc3BlZWQgb2YgY3VycmVudGx5IHNlbGVjdGVkIHR0eSBsaW5lICAqLworCisvKgorICBVbnJlbGlhYmxlLiAgQWZ0ZXIgU0VUIExJTkUsIGl0IHJldHVybnMgYW4gYWN0dWFsIHNwZWVkLCBidXQgbm90IG5lY2Vzc2FyaWx5CisgIHRoZSByZWFsIHNwZWVkLiAgT24gc29tZSBzeXN0ZW1zLCBpdCByZXR1cm5zIHRoZSBsaW5lJ3Mgbm9taW5hbCBzcGVlZCwgZnJvbQorICAvZXRjL3R0eXRhYi4gIEV2ZW4gaWYgeW91IFNFVCBTUEVFRCB0byBzb21ldGhpbmcgZWxzZSwgdGhpcyBmdW5jdGlvbiBtaWdodAorICBub3Qgbm90aWNlLgorKi8KK2xvbmcKK3R0Z3NwZCgpIHsJCQkJLyogR2V0IGN1cnJlbnQgc2VyaWFsIGRldmljZSBzcGVlZCAqLworI2lmZGVmIE5PTE9DQUwKKyAgICByZXR1cm4oLTFMKTsKKyNlbHNlCisjaWZkZWYgUE9TSVgKKyAgICBzcGVlZF90CQkJCS8qIFNob3VsZCBiZSB1bnNpZ25lZCAqLworI2Vsc2UKKyAgICBpbnQJCQkJCS8qIElzbid0IHVuc2lnbmVkICovCisjZW5kaWYgLyogUE9TSVggKi8KKyAgICAgIHM7CisgICAgaW50IHg7CisgICAgbG9uZyBzczsKKyNpZmRlZiBPTElOVVhISVNQRUVECisgICAgdW5zaWduZWQgaW50IHNwZF9mbGFncyA9IDA7CisgICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc2VyaW5mbzsKKyNlbmRpZiAvKiBPTElOVVhISVNQRUVEICovCisKKyNpZmRlZiBORVRDT05OCisgICAgaWYgKG5ldGNvbm4pIHsKKyNpZmRlZiBUTl9DT01QT1JUCisJaWYgKGlzdG5jb21wb3J0KCkpCisJICByZXR1cm4odG5jX2dldF9iYXVkKCkpOworCWVsc2UKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisJICByZXR1cm4oLTEpOwkJCS8qIC0xIGlmIG5ldHdvcmsgY29ubmVjdGlvbiAqLworICAgIH0KKyNlbmRpZiAvKiBORVRDT05OICovCisjaWZkZWYgTkVUQ01ECisgICAgaWYgKHR0cGlwZSkgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICBpZiAodHRwdHkpIHJldHVybigtMSk7CisjZW5kaWYgLyogTkVUUFRZICovCisKKyAgICBkZWJ1ZyhGMTAxLCJ0dGdzcGQgdHR5ZmQiLCIiLHR0eWZkKTsKKworI2lmZGVmIFVTRVRDU0VUU1BFRUQKKworICAgIHggPSB0Y2dldGF0dHIodHR5ZmQsJnR0Y3VyKTsJLyogR2V0IGN1cnJlbnQgc3BlZWQgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dGdzcGQgdGNnZXRhdHRyIiwiIix4KTsKKyAgICBpZiAoeCA8IDApCisgICAgICByZXR1cm4oLTEpOworICAgIGVycm5vID0gMDsKKyAgICBzID0gdGNnZXRzcGVlZChUQ1NfQUxMLCAmdHRjdXIpOworICAgIGRlYnVnKEYxMDEsInR0c3NwZCBUQ0dFVFNQRUVEIHNwZWVkIiwiIixzKTsKKyAgICBpZiAocyA9PSAwKSB7CisJbG9uZyBzMSwgczI7CisJczEgPSB0Y2dldHNwZWVkKFRDU19JTiwgJnR0Y3VyKTsKKwlzMiA9IHRjZ2V0c3BlZWQoVENTX09VVCwgJnR0Y3VyKTsKKwlpZiAoczEgPT0gMTIwMEwgJiYgczIgPT0gNzVMKQorCSAgcmV0dXJuKDg4ODBMKTsKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBpZiAoZXJybm8gJiBkZWJsb2cpIHsKKwlkZWJ1ZyhGMTAxLCJ0dHNzcGQgVENHRVRTUEVFRCBlcnJubyIsIiIsZXJybm8pOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHJldHVybihzKTsKKworI2Vsc2UgIC8qIE5vdCBVU0VUQ1NFVFNQRUVEICovCisKKyNpZmRlZiBQbGFuOQorICAgIGlmICh0dHlmZCA8IDApCisgICAgICBzcyA9IC0xOworICAgIGVsc2UKKyAgICAgIHNzID0gdHR5bGFzdHNwZWVkOworI2Vsc2UKKyNpZmRlZiBPTElOVVhISVNQRUVECisgICAgZGVidWcoRjEwMCwidHRnc3BkIExpbnV4IE9MSU5VWEhJU1BFRUQiLCIiLDApOworI2VuZGlmIC8qIE9MSU5VWEhJU1BFRUQgKi8KKworICAgIGlmICh0dHlmZCA8IDApIHsKKyNpZmRlZiBCU0Q0NE9SUE9TSVgKKwlzID0gY2ZnZXRvc3BlZWQoJmNjb2xkKTsKKwlkZWJ1ZyhGMTAxLCJ0dGdzcGQgY2ZnZXRvc3BlZWQgMSBQT1NJWCIsIiIscyk7CisjZWxzZQorI2lmZGVmIEFUVFNWCisJcyA9IGNjb2xkLmNfY2ZsYWcgJiBDQkFVRDsKKwlkZWJ1ZyhGMTAxLCJ0dGdzcGQgY19jZmxhZyBDQkFVRCAxIEFUVFNWIiwiIixzKTsKKyNlbHNlCisJcyA9IGNjb2xkLnNnX29zcGVlZDsJCS8qIChvYnRhaW5lZCBieSBjb25nbSgpKSAqLworCWRlYnVnKEYxMDEsInR0Z3NwZCBzZ19vc3BlZWQgMSIsIiIscyk7CisjZW5kaWYgLyogQVRUU1YgKi8KKyNlbmRpZiAvKiBCU0Q0NFBPU0lYICovCisKKyAgICB9IGVsc2UgeworI2lmZGVmIEJTRDQ0T1JQT1NJWAorCWlmICh0Y2dldGF0dHIodHR5ZmQsJnR0Y3VyKSA8IDApIHJldHVybigtMSk7CisJcyA9IGNmZ2V0b3NwZWVkKCZ0dGN1cik7CisJZGVidWcoRjEwMSwidHRnc3BkIGNmZ2V0b3NwZWVkIDIgQlNET1JQT1NJWCIsIiIscyk7CisjaWZkZWYgT0xJTlVYSElTUEVFRAorCWlmIChpb2N0bCh0dHlmZCxUSU9DR1NFUklBTCwmc2VyaW5mbykgPiAtMSkKKwkgIHNwZF9mbGFncyA9IHNlcmluZm8uZmxhZ3MgJiBBU1lOQ19TUERfTUFTSzsKKwlkZWJ1ZyhGMTAxLCJ0dGdzcGQgc3BkX2ZsYWdzIiwiIixzcGRfZmxhZ3MpOworI2VuZGlmIC8qIE9MSU5VWEhJU1BFRUQgKi8KKyNlbHNlCisjaWZkZWYgQVRUU1YKKwl4ID0gaW9jdGwodHR5ZmQsVENHRVRBLCZ0dGN1cik7CisJZGVidWcoRjEwMSwidHRnc3BkIGlvY3RsIDIgQVRUU1YgeCIsIiIseCk7CisJZGVidWcoRjEwMSwidHRnc3BkIGlvY3RsIDIgQVRUU1YgZXJybm8iLCIiLGVycm5vKTsKKwlpZiAoeCA8IDApIHJldHVybigtMSk7CisJcyA9IHR0Y3VyLmNfY2ZsYWcgJiBDQkFVRDsKKwlkZWJ1ZyhGMTAxLCJ0dGdzcGQgaW9jdGwgMiBBVFRTViBzcGVlZCIsIiIscyk7CisjZWxzZQorI2lmZGVmIEJFTExWMTAKKwl4ID0gaW9jdGwodHR5ZmQsVElPQ0dERVYsJnRkY3VyKTsKKwlkZWJ1ZyhGMTAxLCJ0dGdzcGQgaW9jdGwgMiBCRUxMVjEwIHgiLCIiLHgpOworCWlmICh4IDwgMCkgcmV0dXJuKC0xKTsKKwlzID0gdGRjdXIub3NwZWVkOworCWRlYnVnKEYxMDEsInR0Z3NwZCBpb2N0bCAyIEJFTExWMTAgc3BlZWQiLCIiLHMpOworI2Vsc2UKKwl4ID0gZ3R0eSh0dHlmZCwmdHRjdXIpOworCWRlYnVnKEYxMDEsInR0Z3NwZCBndHR5IDIgeCIsIiIseCk7CisJZGVidWcoRjEwMSwidHRnc3BkIGd0dHkgMiBlcnJubyIsIiIsZXJybm8pOworCWlmICh4IDwgMCkgcmV0dXJuKC0xKTsKKwlzID0gdHRjdXIuc2dfb3NwZWVkOworCWRlYnVnKEYxMDEsInR0Z3NwZCBndHR5IDIgc3BlZWQiLCIiLHMpOworI2VuZGlmIC8qIEJFTExWMTAgKi8KKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIEJTRDQ0T1JQT1NJWCAqLworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJ0dGdzcGQgY29kZSIsIiIscyk7CisjaWZkZWYgT0xJTlVYSElTUEVFRAorICAgIGRlYnVnKEYxMDEsInR0Z3NwZCBzcGRfZmxhZ3MiLCIiLHNwZF9mbGFncyk7CisjZW5kaWYgLyogT0xJTlVYSElTUEVFRCAqLworICAgIHN3aXRjaCAocykgeworI2lmZGVmIEIwCisgICAgICBjYXNlIEIwOiAgICBzcyA9IDBMOyBicmVhazsKKyNlbmRpZiAvKiBCMCAqLworCisjaWZuZGVmIE1JTklYCisvKgorIE1JTklYIGRlZmluZXMgdGhlIEJ4eCBzeW1ib2xzIHRvIGJlIGJwcy8xMDAsIHNvIEI1MD09Qjc1LCBCMTEwPT1CMTM0PT1CMTUwLAorIGV0YywgbWFraW5nIGZvciBtYW55ICJkdXBsaWNhdGUgY2FzZSBpbiBzd2l0Y2giIGVycm9ycywgd2hpY2ggYXJlIGZhdGFsLgorKi8KKyNpZmRlZiBCNTAKKyAgICAgIGNhc2UgQjUwOiAgIHNzID0gNTBMOyBicmVhazsKKyNlbmRpZiAvKiBCNTAgKi8KKyNpZmRlZiBCNzUKKyAgICAgIGNhc2UgQjc1OiAgIHNzID0gNzVMOyBicmVhazsKKyNlbmRpZiAvKiBCNzUgKi8KKyNlbmRpZiAvKiBNSU5JWCAqLworCisjaWZkZWYgQjExMAorICAgICAgY2FzZSBCMTEwOiAgc3MgPSAxMTBMOyBicmVhazsKKyNlbmRpZiAvKiBCMTEwICovCisKKyNpZm5kZWYgTUlOSVgKKyNpZmRlZiBCMTM0CisgICAgICBjYXNlIEIxMzQ6ICBzcyA9IDEzNEw7IGJyZWFrOworI2VuZGlmIC8qIEIxMzQgKi8KKyNpZmRlZiBCMTUwCisgICAgICBjYXNlIEIxNTA6ICBzcyA9IDE1MEw7IGJyZWFrOworI2VuZGlmIC8qIEIxNTAgKi8KKyNlbmRpZiAvKiBNSU5JWCAqLworCisjaWZkZWYgQjIwMAorICAgICAgY2FzZSBCMjAwOiAgc3MgPSAyMDBMOyBicmVhazsKKyNlbmRpZiAvKiBCMjAwICovCisKKyNpZmRlZiBCMzAwCisgICAgICBjYXNlIEIzMDA6ICBzcyA9IDMwMEw7IGJyZWFrOworI2VuZGlmIC8qIEIzMDAgKi8KKworI2lmZGVmIEI2MDAKKyAgICAgIGNhc2UgQjYwMDogIHNzID0gNjAwTDsgYnJlYWs7CisjZW5kaWYgLyogQjYwMCAqLworCisjaWZkZWYgQjEyMDAKKyAgICAgIGNhc2UgQjEyMDA6IHNzID0gMTIwMEw7IGJyZWFrOworI2VuZGlmIC8qIEIxMjAwICovCisKKyNpZmRlZiBCMTgwMAorICAgICAgY2FzZSBCMTgwMDogc3MgPSAxODAwTDsgYnJlYWs7CisjZW5kaWYgLyogQjE4MDAgKi8KKworI2lmZGVmIEIyNDAwCisgICAgICBjYXNlIEIyNDAwOiBzcyA9IDI0MDBMOyBicmVhazsKKyNlbmRpZiAvKiBCMjQwMCAqLworCisjaWZkZWYgQjQ4MDAKKyAgICAgIGNhc2UgQjQ4MDA6IHNzID0gNDgwMEw7IGJyZWFrOworI2VuZGlmIC8qIEI0ODAwICovCisKKyNpZmRlZiBCNzIwMAorICAgICAgY2FzZSBCNzIwMDogc3MgPSA3MjAwTDsgYnJlYWs7CisjZW5kaWYgLyogQjcyMDAgKi8KKworI2lmZGVmIEI5NjAwCisgICAgICBjYXNlIEI5NjAwOiBzcyA9IDk2MDBMOyBicmVhazsKKyNlbmRpZiAvKiBCOTYwMCAqLworCisjaWZkZWYgQjE5MjAwCisgICAgICBjYXNlIEIxOTIwMDogc3MgPSAxOTIwMEw7IGJyZWFrOworI2Vsc2UKKyNpZmRlZiBFWFRBCisgICAgICBjYXNlIEVYVEE6IHNzID0gMTkyMDBMOyBicmVhazsKKyNlbmRpZiAvKiBFWFRBICovCisjZW5kaWYgLyogQjE5MjAwICovCisKKyNpZmRlZiBNSU5JWDIKKy8qIEVuZCBvZiBoYWNrIHRvIG1ha2UgTUlOSVgyIHVzZSBNSU5JWDEgc3BlZWQgc2V0dGluZyAqLworI3VuZGVmIE1JTklYCisjZW5kaWYgLyogTUlOSVgyICovCisKKyNpZm5kZWYgTUlOSVgKKyNpZmRlZiBCMzg0MDAKKyAgICAgIGNhc2UgQjM4NDAwOgorICAgICAgICBzcyA9IDM4NDAwTDsKKyNpZmRlZiBPTElOVVhISVNQRUVECisgICAgICAgIHN3aXRjaChzcGRfZmxhZ3MpIHsKKyAgICAgICAgICBjYXNlIEFTWU5DX1NQRF9ISTogIHNzID0gIDU3NjAwTDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBBU1lOQ19TUERfVkhJOiBzcyA9IDExNTIwMEw7IGJyZWFrOworCX0KKyNlbmRpZiAvKiBPTElOVVhISVNQRUVEICovCisgICAgICAgIGJyZWFrOworI2Vsc2UKKyNpZmRlZiBFWFRCCisgICAgICBjYXNlIEVYVEI6IHNzID0gMzg0MDBMOyBicmVhazsKKyNlbmRpZiAvKiBFWFRCICovCisjZW5kaWYgLyogQjM4NDAwICovCisjZW5kaWYgLyogTUlOSVggKi8KKworI2lmZGVmIEhQVVgKKyNpZmRlZiBfQjU3NjAwCisgICAgICBjYXNlIF9CNTc2MDA6IHNzID0gNTc2MDBMOyBicmVhazsKKyNlbmRpZiAvKiBfQjU3NjAwICovCisjaWZkZWYgX0IxMTUyMDAKKyAgICAgIGNhc2UgX0IxMTUyMDA6IHNzID0gMTE1MjAwTDsgYnJlYWs7CisjZW5kaWYgLyogX0IxMTUyMDAgKi8KKyNlbHNlCisjaWZkZWYgQjU3NjAwCisgICAgICBjYXNlIEI1NzYwMDogc3MgPSA1NzYwMEw7IGJyZWFrOworI2VuZGlmIC8qIEI1NzYwMCAqLworI2lmZGVmIEI3NjgwMAorICAgICAgY2FzZSBCNzY4MDA6IHNzID0gNzY4MDBMOyBicmVhazsKKyNlbmRpZiAvKiBCNzY4MDAgKi8KKyNpZmRlZiBCMTE1MjAwCisgICAgICBjYXNlIEIxMTUyMDA6IHNzID0gMTE1MjAwTDsgYnJlYWs7CisjZW5kaWYgLyogQjExNTIwMCAqLworI2lmZGVmIEIxNTM2MDAKKyAgICAgIGNhc2UgQjE1MzYwMDogc3MgPSAxNTM2MDBMOyBicmVhazsKKyNlbmRpZiAvKiBCMTUzNjAwICovCisjaWZkZWYgQjIzMDQwMAorICAgICAgY2FzZSBCMjMwNDAwOiBzcyA9IDIzMDQwMEw7IGJyZWFrOworI2VuZGlmIC8qIEIyMzA0MDAgKi8KKyNpZmRlZiBCMzA3MjAwCisgICAgICBjYXNlIEIzMDcyMDA6IHNzID0gMzA3MjAwTDsgYnJlYWs7CisjZW5kaWYgLyogQjMwNzIwMCAqLworI2lmZGVmIEI0NjA4MDAKKyAgICAgIGNhc2UgQjQ2MDgwMDogc3MgPSA0NjA4MDBMOyBicmVhazsKKyNlbmRpZiAvKiBCNDYwODAwICovCisjZW5kaWYgLyogSFBVWCAqLworI2lmZGVmIEI5MjE2MDAKKyAgICAgIGNhc2UgOTIxNjA6IHNzID0gOTIxNjAwTDsgYnJlYWs7CisjZW5kaWYgLyogQjkyMTYwMCAqLworICAgICAgZGVmYXVsdDoKKwlzcyA9IC0xOyBicmVhazsKKyAgICB9CisjZW5kaWYgLyogUGxhbjkgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dGdzcGQgc3BlZWQiLCIiLHNzKTsKKyAgICByZXR1cm4oc3MpOworCisjZW5kaWYgLyogVVNFVENTRVRTUEVFRCAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KK30KKyNpZmRlZiBNSU5JWDIJCQkJLyogQW5vdGhlciBoYWNrIGFsZXJ0ICovCisjZGVmaW5lIE1JTklYCisjZW5kaWYgLyogTUlOSVgyICovCisKKy8qCisgIEZJT05SRUFEIGRhdGEgdHlwZS4uLiAgVGhpcyBoYXMgYmVlbiBkZWZpbmVkIGFzICJsb25nIiBmb3IgbWFueSwgbWFueQorICB5ZWFycywgYW5kIGl0IHdvcmtlZCBPSyB1bnRpbCA2NC1iaXQgcGxhdGZvcm1zIGFwcGVhcmVkLiAgVGh1cyB3ZSB1c2UKKyAgaW50IGZvciA2NC1iaXQgcGxhdGZvcm1zLCBidXQga2VlcCBsb25nIGZvciB0aGUgb3RoZXJzLiAgSWYgd2UgY2hhbmdlZAorICB0aGUgZGVmYXVsdCBQRUVLVFlQRSB0byBpbnQsIHRoaXMgd291bGQgcHJvYmFibHkgYnJlYWsgMTYtYml0IGJ1aWxkcworICAobm90ZSB0aGF0IHNpemVvZihsb25nKSA9PSBzaXplb2YoaW50KSBvbiBtb3N0IDMyLWJpdCBwbGF0Zm9ybXMpLCBtYW55CisgIG9mIHdoaWNoIHdlIGhhdmUgbm8gd2F5IG9mIHRlc3RpbmcgYW55IG1vcmUuICBUaGVyZWZvcmUsIGRvIG5vdCBjaGFuZ2UKKyAgdGhlIGRlZmF1bHQgZGVmaW5pdGlvbiBvZiBQRUVLVFlQRSAtLSBvbmx5IGFkZCBleGNlcHRpb25zIHRvIGl0IGFzIG5lZWRlZC4KKyovCisjaWZkZWYgQ09IRVJFTlQKKyNpZmRlZiBGSU9OUkVBRAorI3VuZGVmIEZJT05SRUFECisjZW5kaWYgLyogRklPTlJFQUQgKi8KKy8qICNkZWZpbmUgRklPTlJFQUQgVElPQ1FVRVJZICovCisvKiAjZGVmaW5lIFBFRUtUWVBFIGludCAqLworI2Vsc2UgIC8qIE5vdCBDT0hFUkVOVC4uLiAqLworCisjaWZkZWYgT1NGMzIJCQkJLyogRGlnaXRhbCBVTklYIDMuMiBvciBoaWdoZXIgKi8KKyNkZWZpbmUgUEVFS1RZUEUgaW50CisjZWxzZQorI2RlZmluZSBQRUVLVFlQRSBsb25nCQkJLyogRWxzZXdoZXJlIChzZWUgbm90ZXMgYWJvdmUpICovCisjZW5kaWYgLyogT1NGMzIgKi8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisvKiBja3VteXIuYyBieSBLcmlzdG9mZmVyIEVyaWtzc29uLCBza2VAcGttYWIuc2UsIDE1IE1hciAxOTkwLiAqLworCisjaWZkZWYgTVlSRUFECisKKy8qIFByaXZhdGUgYnVmZmVyIGZvciBteXJlYWQoKSBhbmQgaXRzIGNvbXBhbmlvbnMuICBOb3QgZm9yIHVzZSBieSBhbnl0aGluZworICogZWxzZS4gIHR0Zmx1aSgpIGlzIGFsbG93ZWQgdG8gcmVzZXQgdGhlbSB0byBpbml0aWFsIHZhbHVlcy4gIHR0Y2hrKCkgaXMKKyAqIGFsbG93ZWQgdG8gcmVhZCBteV9jb3VudC4KKyAqCisgKiBteV9pdGVtIGlzIGFuIGluZGV4IGludG8gbXlidWZbXS4gIEluY3JlbWVudCBpdCAqYmVmb3JlKiByZWFkaW5nIG15YnVmW10uCisgKgorICogQSBnbG9iYWwgcGFyaXR5IG1hc2sgdmFyaWFibGUgY291bGQgYmUgdXNlZnVsIHRvby4gIFdlIGNvdWxkIHVzZSBpdCB0bworICogbGV0IG15cmVhZCgpIHN0cmlwIHRoZSBwYXJpdHkgb24gaXRzIG93biwgaW5zdGVhZCBvZiBzdHJpcHBpbmcgc2lnbgorICogYml0cyBhcyBpdCBkb2VzIG5vdy4KKyAqLworI2lmZGVmIEJJR0JVRk9LCisjZGVmaW5lIE1ZQlVGTEVOIDMyNzY4CisjZWxzZQorI2lmZGVmIHBkcDExCisjZGVmaW5lIE1ZQlVGTEVOIDI1NgorI2Vsc2UKKyNkZWZpbmUgTVlCVUZMRU4gMTAyNAorI2VuZGlmIC8qIHBkcDExICovCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKworI2lmZGVmIEFOWVgyNQorI3VuZGVmIE1ZQlVGTEVOCisjZGVmaW5lIE1ZQlVGTEVOIDI1NgorLyoKKyAgT24gWC4yNSBjb25uZWN0aW9ucywgdGhlcmUgaXMgYW4gZXh0cmEgY29udHJvbCBieXRlIGF0IHRoZSBiZWdpbm5pbmcuCisqLworc3RhdGljIENIQVIgeDI1YnVmW01ZQlVGTEVOKzFdOwkJLyogQ29tbXVuaWNhdGlvbiBkZXZpY2UgaW5wdXQgYnVmZmVyICovCitzdGF0aWMgQ0hBUiAgKm15YnVmID0geDI1YnVmKzE7CisjZWxzZQorc3RhdGljIENIQVIgbXlidWZbTVlCVUZMRU5dOworI2VuZGlmIC8qIEFOWVgyNSAqLworCitzdGF0aWMgaW50IG15X2NvdW50ID0gMDsJCS8qIE51bWJlciBvZiBjaGFycyBzdGlsbCBpbiBteWJ1ZiAqLworc3RhdGljIGludCBteV9pdGVtID0gLTE7CQkvKiBMYXN0IGluZGV4IHJlYWQgZnJvbSBteWJ1ZltdICAgKi8KKworLyogIFQgVCBQIEUgRSBLICAtLSAgUGVlayBpbnRvIG91ciBpbnRlcm5hbCBjb21tdW5pY2F0aW9ucyBpbnB1dCBidWZmZXJzLiAqLworCisvKgorICBOT1RFOiBUaGlzIHJvdXRpbmUgaXMgcGVjdWxpYXIgdG8gVU5JWCwgYW5kIGlzIHVzZWQgb25seSBieSB0aGUKKyAgc2VsZWN0KCktYmFzZWQgQ09OTkVDVCBtb2R1bGUsIGNrdWNucy5jLiAgSXQgbmVlZCBub3QgYmUgcmVwbGljYXRlZCBpbgorICB0aGUgY2s/dGlvLmMgb2Ygb3RoZXIgcGxhdGZvcm1zLgorKi8KK2ludAordHRwZWVrKCkgeworI2lmZGVmIFRUTEVCVUYKKyAgICBpbnQgcmMgPSAwOworICAgIGlmICh0dHB1c2ggPj0gMCkKKyAgICAgIHJjKys7CisgICAgcmMgKz0gbGVfaW5idWYoKTsKKyAgICBpZiAocmMgPiAwKQorICAgICAgcmV0dXJuKHJjKTsKKyAgICBlbHNlCisjZW5kaWYgLyogVFRMRUJVRiAqLworCisjaWZkZWYgTVlSRUFECisgICAgcmV0dXJuKG15X2NvdW50KTsKKyNlbHNlCisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIE1ZUkVBRCAqLworfQorCisvKiBteXJlYWQoKSAtLSBFZmZpY2llbnQgcmVhZCBvZiBvbmUgY2hhcmFjdGVyIGZyb20gY29tbXVuaWNhdGlvbnMgbGluZS4KKyAqCisgKiBVc2VzIGEgcHJpdmF0ZSBidWZmZXIgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBleHBlbnNpdmUgcmVhZCgpIHN5c3RlbQorICogY2FsbHMuICBFc3NlbnRpYWxseSBwZXJmb3JtcyB0aGUgZXF1aXZhbGVudCBvZiByZWFkKCkgb2YgMSBjaGFyYWN0ZXIsIHdoaWNoCisgKiBpcyB0aGVuIHJldHVybmVkLiAgQnkgcmVhZGluZyBhbGwgYXZhaWxhYmxlIGlucHV0IGZyb20gdGhlIHN5c3RlbSBidWZmZXJzCisgKiB0byB0aGUgcHJpdmF0ZSBidWZmZXIgaW4gb25lIGNodW5rLCBhbmQgdGhlbiB3b3JraW5nIGZyb20gdGhpcyBidWZmZXIsIHRoZQorICogbnVtYmVyIG9mIHN5c3RlbSBjYWxscyBpcyByZWR1Y2VkIGluIGFueSBjYXNlIHdoZXJlIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyCisgKiBhcnJpdmVzIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgcHJldmlvdXMgY2h1bmssIGZvciBpbnN0YW5jZSBoaWdoCisgKiBiYXVkIHJhdGVzIG9yIG5ldHdvcmsgdHlwZSBjb25uZWN0aW9ucyB3aGVyZSBpbnB1dCBhcnJpdmVzIGluIHBhY2tldHMuCisgKiBJZiB0aGUgdGltZSBuZWVkZWQgZm9yIGEgcmVhZCgpIHN5c3RlbSBjYWxsIGFwcHJvYWNoZXMgdGhlIHRpbWUgZm9yIG1vcmUKKyAqIHRoYW4gb25lIGNoYXJhY3RlciB0byBhcnJpdmUsIHRoZW4gdGhpcyBtZWNoYW5pc20gYXV0b21hdGljYWxseSBjb21wZW5zYXRlcworICogZm9yIHRoYXQgYnkgcGVyZm9ybWluZyBiaWdnZXIgcmVhZCgpcyBsZXNzIGZyZXF1ZW50bHkuICBJZiB0aGUgc3lzdGVtIGxvYWQKKyAqIGlzIGhpZ2gsIHRoZSBzYW1lIG1lY2hhbmlzbSBjb21wZW5zYXRlcyBmb3IgdGhhdCB0b28uCisgKgorICogbXlyZWFkKCkgaXMgYSBtYWNybyB0aGF0IHJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyIGZyb20gdGhlIGJ1ZmZlci4gIElmIHRoZQorICogYnVmZmVyIGlzIGVtcHR5LCBteWdldGJ1ZigpIGlzIGNhbGxlZC4gIFNlZSBteWdldGJ1ZigpIGZvciBwb3NzaWJsZSBlcnJvcgorICogcmV0dXJucy4KKyAqCisgKiBUaGlzIHNob3VsZCBiZSBlZmZpY2llbnQgZW5vdWdoIGZvciBhbnkgb25lLWNoYXJhY3Rlci1hdC1hLXRpbWUgbG9vcHMuCisgKiBGb3IgZXZlbiBiZXR0ZXIgZWZmaWNpZW5jeSB5b3UgbWlnaHQgdXNlIG1lbWNweSgpL2Jjb3B5KCkgb3Igc3VjaCBiZXR3ZWVuCisgKiBidWZmZXJzIChzaW5jZSB0aGV5IGFyZSBvZnRlbiBiZXR0ZXIgb3B0aW1pemVkIGZvciBjb3B5aW5nKSwgYnV0IGl0IG1heSBub3QKKyAqIGJlIHdvcnRoIGl0IGlmIHlvdSBoYXZlIHRvIHRha2UgYW4gZXh0cmEgcGFzcyBvdmVyIHRoZSBidWZmZXIgdG8gc3RyaXAKKyAqIHBhcml0eSBhbmQgY2hlY2sgZm9yIENUUkwtQyBhbnl3YXkuCisgKgorICogTm90ZSB0aGF0IGlmIHlvdSBoYXZlIGJlZW4gdXNpbmcgbXlyZWFkKCkgZnJvbSBhbm90aGVyIHByb2dyYW0gbW9kdWxlLCB5b3UKKyAqIG1heSBoYXZlIHNvbWUgdHJvdWJsZSBhY2Nlc3NpbmcgdGhpcyBtYWNybyB2ZXJzaW9uIGFuZCB0aGUgcHJpdmF0ZSB2YXJpYWJsZXMKKyAqIGl0IHVzZXMuICBJbiB0aGF0IGNhc2UsIGp1c3QgYWRkIGEgZnVuY3Rpb24gaW4gdGhpcyBtb2R1bGUsIHRoYXQgaW52b2tlcyB0aGUKKyAqIG1hY3JvLgorICovCisjZGVmaW5lIG15cmVhZCgpICgtLW15X2NvdW50IDwgMCA/IG15Z2V0YnVmKCkgOiAyNTUgJiAoaW50KW15YnVmWysrbXlfaXRlbV0pCisKKy8qIFNwZWNpZmljYXRpb246IFB1c2ggYmFjayB1cCB0byBvbmUgY2hhcmFjdGVyIG9udG8gbXlyZWFkKCkncyBxdWV1ZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uOiBQdXNoIGJhY2sgY2hhcmFjdGVycyBpbnRvIG15YnVmLiBBdCBsZWFzdCBvbmUgY2hhcmFjdGVyCisgKiBtdXN0IGhhdmUgYmVlbiByZWFkIHRocm91Z2ggbXlyZWFkKCkgYmVmb3JlIG15dW5yZCgpIG1heSBiZSB1c2VkLiAgQWZ0ZXIKKyAqIEVPRiBvciByZWFkIGVycm9yLCBhZ2FpbiwgbXl1bnJkKCkgY2FuIG5vdCBiZSB1c2VkLiAgU29tZXRpbWVzIG1vcmUgdGhhbgorICogb25lIGNoYXJhY3RlciBjYW4gYmUgcHVzaGVkIGJhY2ssIGJ1dCBvbmx5IG9uZSBjaGFyYWN0ZXIgaXMgZ3VhcmFudGVlZC4KKyAqIFNpbmNlIGEgcHJldmlvdXMgbXlyZWFkKCkgbXVzdCBoYXZlIHJlYWQgaXRzIGNoYXJhY3RlciBvdXQgb2YgbXlidWZbXSwKKyAqIHRoYXQgZ3VhcmFudGVlcyB0aGF0IHRoZXJlIGlzIHNwYWNlIGZvciBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLiAgSWYgcHVzaAorICogYmFjayB3YXMgcmVhbGx5IG5lZWRlZCBhZnRlciBFT0YsIGEgc21hbGwgYWRkaXRpb24gY291bGQgcHJvdmlkZSB0aGF0LgorICoKKyAqIG15dW5yZCgpIGlzIGN1cnJlbnRseSBub3QgY2FsbGVkIGZyb20gYW55d2hlcmUgaW5zaWRlIGtlcm1pdC4uLgorICovCisjaWZkZWYgQ09NTUVOVCAvKiBub3QgdXNlZCAqLworbXl1bnJkKGNoKSBDSEFSIGNoOyB7CisgICAgaWYgKG15X2l0ZW0gPj0gMCkgeworCW15YnVmW215X2l0ZW0tLV0gPSBjaDsKKwkrK215X2NvdW50OworICAgIH0KK30KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qICBUIFQgUCBVIFMgSCBCIEEgQyBLICAtLSAgUHV0IG4gYnl0ZXMgYmFjayBpbnRvIHRoZSBteXJlYWQgYnVmZmVyICovCisKK3N0YXRpYyBDSEFSICogcHVzaGJ1ZiA9IE5VTEw7CisvKiBzdGF0aWMgaW50IHB1c2hlZCA9IDA7ICovCisKK2ludAordHRwdXNoYmFjayhzLG4pIENIQVIgKiBzOyBpbnQgbjsgeworICAgIGRlYnVnKEYxMDEsInR0cHVzaGJhY2sgbiIsIiIsbik7CisgICAgaWYgKHB1c2hidWYgfHwgbiA+IE1ZQlVGTEVOIHx8IG4gPCAxKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dHB1c2hiYWNrIG15X2NvdW50IiwiIixteV9jb3VudCk7CisgICAgaWYgKG15X2NvdW50ID4gMCkgeworCWlmICghKHB1c2hidWYgPSAoQ0hBUiAqKW1hbGxvYyhuKzEpKSkKKwkgIHJldHVybigtMSk7CisJbWVtY3B5KHB1c2hidWYsbXlidWYsbXlfY291bnQpOworCS8qIHB1c2hlZCA9IG15X2NvdW50OyAqLyAvKiAoc2V0IGJ1dCBuZXZlciB1c2VkKSAqLworICAgIH0KKyAgICBtZW1jcHkobXlidWYscyxuKTsKKyAgICBteV9jb3VudCA9IG47CisgICAgbXlfaXRlbSA9IC0xOworICAgIHJldHVybigwKTsKK30KKworLyogbXlnZXRidWYoKSAtLSBGaWxsIGJ1ZmZlciBmb3IgbXlyZWFkKCkgYW5kIHJldHVybiBmaXJzdCBjaGFyYWN0ZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB3aGF0IG15cmVhZCgpIHVzZXMgd2hlbiBpdCBjYW4ndCBnZXQgdGhlIG5leHQgY2hhcmFjdGVyCisgKiBkaXJlY3RseSBmcm9tIGl0cyBidWZmZXIuICBGaXJzdCwgaXQgY2FsbHMgYSBzeXN0ZW0gZGVwZW5kZW50IG15ZmlsbGJ1ZigpCisgKiB0byByZWFkIGF0IGxlYXN0IG9uZSBuZXcgY2hhcmFjdGVyIGludG8gdGhlIGJ1ZmZlciwgYW5kIHRoZW4gaXQgcmV0dXJucworICogdGhlIGZpcnN0IGNoYXJhY3RlciBqdXN0IGFzIG15cmVhZCgpIHdvdWxkIGhhdmUgZG9uZS4gIFRoaXMgZnVuY3Rpb24gYWxzbworICogaXMgcmVzcG9uc2libGUgZm9yIGFsbCBlcnJvciBjb25kaXRpb25zIHRoYXQgbXlyZWFkKCkgY2FuIGluZGljYXRlLgorICoKKyAqIFJldHVybnM6IFdoZW4gT0sJPT4gYSBwb3NpdGl2ZSBjaGFyYWN0ZXIsIDAgb3IgZ3JlYXRlci4KKyAqCSAgICBXaGVuIEVPRgk9PiAtMi4KKyAqCSAgICBXaGVuIGVycm9yCT0+IC0zLCBlcnJvciBjb2RlIGluIGVycm5vLgorICoKKyAqIE9sZGVyIG15cmVhZCgpcyBhZGRpdGlvbmFsbHkgcmV0dXJuZWQgLTEgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSB3YXMgbm90aGluZworICogdG8gcmVhZCwgdXBvbiB3aGljaCB0aGUgY2FsbGVyIHdvdWxkIGNhbGwgbXlyZWFkKCkgYWdhaW4gdW50aWwgaXQgZ290CisgKiBzb21ldGhpbmcuICBUaGUgbmV3IG15cmVhZCgpL215Z2V0YnVmKCkgYWx3YXlzIGdldHMgc29tZXRoaW5nLiAgSWYgaXQKKyAqIGRvZXNuJ3QsIHRoZW4gbWFrZSBpdCBkbyBzbyEgIEFueSBwcm9ncmFtIHRoYXQgYWN0dWFsbHkgZGVwZW5kcyBvbiB0aGUgb2xkCisgKiBiZWhhdmlvdXIgd2lsbCBicmVhay4KKyAqCisgKiBUaGUgb2xkZXIgdmVyc2lvbiBhbHNvIHVzZWQgdG8gcmV0dXJuIC0yIGJvdGggZm9yIEVPRiBhbmQgb3RoZXIgZXJyb3JzLAorICogYW5kIHVzZWQgdG8gc2V0IGVycm5vIHRvIDk5OTkgb24gRU9GLiAgVGhlIGVycm5vIHN0dWZmIGlzIGdvbmUsIEVPRiBhbmQKKyAqIG90aGVyIGVycm9ycyBub3cgcmV0dXJuIGRpZmZlcmVudCByZXN1bHRzLCBhbHRob3VnaCBLZXJtaXQgY3VycmVudGx5IG5ldmVyCisgKiBjaGVja3MgdG8gc2VlIHdoaWNoIGl0IHdhcy4gIEl0IGp1c3QgZGlzY29ubmVjdHMgaW4gYm90aCBjYXNlcy4KKyAqCisgKiBLZXJtaXQgbGV0cyB0aGUgdXNlciB1c2UgdGhlIHF1aXQga2V5IHRvIHBlcmZvcm0gc29tZSBzcGVjaWFsIGNvbW1hbmRzCisgKiBkdXJpbmcgZmlsZSB0cmFuc2Zlci4gIFRoaXMgY2F1c2VzIHJlYWQoKSwgYW5kIHRodXMgYWxzbyBteWdldGJ1ZigpLCB0bworICogZmluaXNoIHdpdGhvdXQgcmVhZGluZyBhbnl0aGluZyBhbmQgcmV0dXJuIHRoZSBFSU5UUiBlcnJvci4gIFRoaXMgc2hvdWxkCisgKiBiZSBjaGVja2VkIGJ5IHRoZSBjYWxsZXIuICBNeWdldGJ1ZigpIGNvdWxkIHJldHJ5IHRoZSByZWFkKCkgb24gRUlOVFIsCisgKiBidXQgaWYgdGhlcmUgaXMgbm90aGluZyB0byByZWFkLCB0aGlzIGNvdWxkIGRlbGF5IEtlcm1pdCdzIHJlYWN0aW9uIHRvCisgKiB0aGUgY29tbWFuZCwgYW5kIG1ha2UgS2VybWl0IGFwcGVhciB1bnJlc3BvbnNpdmUuCisgKgorICogVGhlIGRlYnVnKCkgY2FsbCBzaG91bGQgYmUgcmVtb3ZlZCBmb3Igb3B0aW11bSBwZXJmb3JtYW5jZS4KKyAqLworaW50CitteWdldGJ1ZigpIHsKKyAgICBpbnQgeDsKKyAgICBlcnJubyA9IDA7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nICYmIG15X2NvdW50ID4gMCkKKyAgICAgIGRlYnVnKEYxMDEsIm15Z2V0YnVmIElNUFJPUEVSTFkgQ0FMTEVEIHdpdGggbXlfY291bnQiLCIiLG15X2NvdW50KTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIGlmIChteV9jb3VudCA8PSAwKQorICAgICAgbXlfY291bnQgPSBteWZpbGxidWYoKTsKKworI2lmZGVmIERFQlVHCisjaWZkZWYgQ09NTUVOVAorICAgIGlmIChkZWJsb2cpIGRlYnVnKEYxMDEsICJteWdldGJ1ZiByZWFkIiwgIiIsIG15X2NvdW50KTsKKyNlbHNlIC8qIENPTU1FTlQgKi8KKyAgICBpZiAoZGVibG9nKSBoZXhkdW1wKCJteWdldGJ1ZiByZWFkIiwgbXlidWYsIG15X2NvdW50KTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogREVCVUcgKi8KKyAgICB4ID0gbXlfY291bnQ7CisgICAgaWYgKG15X2NvdW50IDw9IDApIHsKKwlteV9jb3VudCA9IDA7CisJbXlfaXRlbSA9IC0xOworCWRlYnVnKEYxMDEsIm15Z2V0YnVmIGVycm5vIiwiIixlcnJubyk7CisjaWZkZWYgVENQU09DS0VUCisJaWYgKG5ldGNvbm4gJiYgdHRuZXQgPT0gTkVUX1RDUEIgJiYgZXJybm8gIT0gMCkgeworCSAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKKwkJZGVidWcoRjEwMSwibXlnZXRidWYgVENQIGVycm9yIiwiIixlcnJubyk7CisJCXR0Y2xvcygwKTsJCS8qIENsb3NlIHRoZSBjb25uZWN0aW9uLiAqLworCSAgICB9CisJICAgIHJldHVybigtMyk7CisJfQorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCWlmICghbmV0Y29ubiAmJiB4bG9jYWwgJiYgZXJybm8pIHsKKwkgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7CisJCWRlYnVnKEYxMDEsIm15Z2V0YnVmIFNFUklBTCBlcnJvciIsIiIsZXJybm8pOworCQl4ID0gLTM7CisJCXR0Y2xvcygwKTsJCS8qIENsb3NlIHRoZSBjb25uZWN0aW9uLiAqLworCSAgICB9CisJfQorCXJldHVybigoeCA8IDApID8gLTMgOiAtMik7CisgICAgfQorICAgIC0tbXlfY291bnQ7CisgICAgcmV0dXJuKCh1bnNpZ25lZCkoMHhmZiAmIG15YnVmW215X2l0ZW0gPSAwXSkpOworfQorCisvKiBteWZpbGxidWYoKToKKyAqIFN5c3RlbS1kZXBlbmRlbnQgcmVhZCgpIGludG8gbXlidWZbXSwgYXMgbWFueSBjaGFyYWN0ZXJzIGFzIHBvc3NpYmxlLgorICoKKyAqIFJldHVybnM6IE9LID0+IG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIGFsd2F5cyBtb3JlIHRoYW4gemVyby4KKyAqICAgICAgICAgIEVPRiA9PiAwCisgKiAgICAgICAgICBFcnJvciA9PiAtMSwgZXJyb3IgY29kZSBpbiBlcnJuby4KKyAqCisgKiBJZiB0aGVyZSBpcyBpbnB1dCBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbSdzIGJ1ZmZlcnMsIGFsbCBvZiBpdCBzaG91bGQgYmUKKyAqIHJlYWQgaW50byBteWJ1ZltdIGFuZCB0aGUgZnVuY3Rpb24gcmV0dXJuIGltbWVkaWF0ZWx5LiAgSWYgbm8gaW5wdXQgaXMKKyAqIGF2YWlsYWJsZSwgaXQgc2hvdWxkIHdhaXQgZm9yIGEgY2hhcmFjdGVyIHRvIGFycml2ZSwgYW5kIHJldHVybiB3aXRoIHRoYXQKKyAqIG9uZSBpbiBteWJ1ZltdIGFzIHNvb24gYXMgcG9zc2libGUuICBJdCBtYXkgd2FpdCBzb21ld2hhdCBwYXN0IHRoZSBmaXJzdAorICogY2hhcmFjdGVyLCBidXQgYmUgYXdhcmUgdGhhdCBhbnkgc3VjaCBkZWxheSBsZW5ndGhlbnMgdGhlIHBhY2tldCB0dXJuYXJvdW5kCisgKiB0aW1lIGR1cmluZyBrZXJtaXQgZmlsZSB0cmFuc2ZlcnMuICBTaG91bGQgbmV2ZXIgcmV0dXJuIHdpdGggemVybyBjaGFyYWN0ZXJzCisgKiB1bmxlc3MgRU9GIG9yIGlycmVjb3ZlcmFibGUgcmVhZCBlcnJvci4KKyAqCisgKiBDb3JyZWN0IGZ1bmN0aW9uaW5nIGRlcGVuZHMgb24gdGhlIGNvcnJlY3QgdHR5IHBhcmFtZXRlcnMgYmVpbmcgdXNlZC4KKyAqIEJldHRlciBjb250cm9sIG9mIGN1cnJlbnQgcGFyYW1ldGVycyBpcyByZXF1aXJlZCB0aGFuIG1heSBoYXZlIGJlZW4gdGhlCisgKiBjYXNlIGluIG9sZGVyIEtlcm1pdCByZWxlYXNlcy4gIEZvciBpbnN0YW5jZSwgT19OREVMQVkgKG9yIGVxdWl2YWxlbnQpIGNhbgorICogbm8gbG9uZ2VyIGJlIHNvbWV0aW1lcyBvZmYgYW5kIHNvbWV0aW1lcyBvbiBsaWtlIGl0IHVzZWQgdG8sIHVubGVzcyBhCisgKiBzcGVjaWFsIG15ZmlsbGJ1ZigpIGlzIHdyaXR0ZW4gdG8gaGFuZGxlIHRoYXQuICBPdGhlcndpc2UgdGhlIG9yZGluYXJ5CisgKiBteWZpbGxidWYoKXMgbWF5IHRoaW5rIHRoZXkgaGF2ZSBjb21lIHRvIEVPRi4KKyAqCisgKiBJZiB5b3VyIHN5c3RlbSBoYXMgYSBmYWNpbGl0eSB0byBkaXJlY3RseSBwZXJmb3JtIHRoZSBmdW5jdGlvbmluZyBvZgorICogbXlmaWxsYnVmKCksIHRoZW4gdXNlIGl0LiAgSWYgdGhlIHN5c3RlbSBjYW4gdGVsbCB5b3UgaG93IG1hbnkgY2hhcmFjdGVycworICogYXJlIGF2YWlsYWJsZSBpbiBpdHMgYnVmZmVycywgdGhlbiByZWFkIHRoYXQgYW1vdW50IChidXQgbm90IGxlc3MgdGhhbiAxKS4KKyAqIElmIHRoZSBzeXN0ZW0gY2FuIHJldHVybiBhIHNwZWNpYWwgaW5kaWNhdGlvbiB3aGVuIHlvdSB0cnkgdG8gcmVhZCB3aXRob3V0CisgKiBhbnl0aGluZyB0byByZWFkLCB3aGlsZSBhbGxvd2luZyB5b3UgdG8gcmVhZCBhbGwgdGhlcmUgaXMgd2hlbiB0aGVyZSBpcworICogc29tZXRoaW5nLCB5b3UgbWF5IGxvb3AgdW50aWwgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHJlYWQsIGJ1dCBwcm9iYWJseSB0aGF0CisgKiBpcyBub3QgZ29vZCBmb3IgdGhlIHN5c3RlbSBsb2FkLgorICovCisKKyNpZmRlZiBTVk9SUE9TSVgKKwkvKiBUaGlzIGlzIGZvciBTeXN0ZW0gSUlJL1Ygd2l0aCBWTUlOPjAsIFZUSU1FPTAgYW5kIE9fTkRFTEFZIG9mZiwKKwkgKiBhbmQgQ0xPQ0FMIHNldCBhbnkgd2F5IHlvdSBsaWtlLiAgVGhpcyB3YXksIHJlYWQoKSB3aWxsIGRvIGV4YWN0bHkKKwkgKiB3aGF0IGlzIHJlcXVpcmVkIGJ5IG15ZmlsbGJ1ZigpOiBJZiB0aGVyZSBpcyBkYXRhIGluIHRoZSBidWZmZXJzCisJICogb2YgdGhlIE8uUy4sIGFsbCBhdmFpbGFibGUgZGF0YSBpcyByZWFkIGludG8gbXlidWYsIHVwIHRvIHRoZSBzaXplCisJICogb2YgbXlidWYuICBJZiB0aGVyZSBpcyBub25lLCB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIGFycml2ZSBpcworCSAqIGF3YWl0ZWQgYW5kIHJldHVybmVkLgorCSAqLworaW50CitteWZpbGxidWYoKSB7CisgICAgaW50IGZkLCBuOworI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpcGUpCisgICAgICBmZCA9IGZkaW47CisgICAgZWxzZQorI2VuZGlmIC8qIE5FVENNRCAqLworICAgICAgZmQgPSB0dHlmZDsKKworI2lmZGVmIHN4YUU1MAorICAgIC8qIEZyb20gUy4gRGV6YXdhIGF0IEZ1amlmaWxtIGluIEphcGFuLiAgSSBkb24ndCBrbm93IHdoeSB0aGlzIGlzICovCisgICAgLyogbmVjZXNzYXJ5IGZvciB0aGUgc3hhIEU1MCwgYnV0IGl0IGlzLiAqLworICAgIHJldHVybiByZWFkKGZkLCBteWJ1ZiwgMjU1KTsKKyNlbHNlCisjaWZkZWYgQkVPU09SQkVCT1gKKyAgICB3aGlsZSAoMSkgeworI2lmZGVmIE5FVENPTk4KKyAgICAgICAgaWYgKG5ldGNvbm4pIHsKKyAgICAgICAgICAgIG4gPSBuZXR4aW4oc2l6ZW9mKG15YnVmKSwgKGNoYXIgKilteWJ1Zik7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJCRUJPWCBTVk9SUE9TSVggbmV0d29yayBteWZpbGxidWYiLCIiLG4pOworCX0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIE5FVENPTk4gKi8KKwkgIG4gPSByZWFkKGZkLCBteWJ1Ziwgc2l6ZW9mKG15YnVmKSk7CisJZGVidWcoRjEwMSwiQkVCT1ggU1ZPUlBPU0lYIG5vdG5ldCBteWZpbGxidWYiLCIiLG4pOworICAgICAgICBpZiAobiA+IDApCisJICByZXR1cm4obik7CisgICAgICAgIHNub296ZSgxMDAwLjApOworICAgIH0KKyNlbHNlIC8qIEJFT1NPUkJFQk9YICovCisgICAgZXJybm8gPSAwOworICAgIGRlYnVnKEYxMDAsIlNWT1JQT1NJWCBteWZpbGxidWYgY2FsbGluZyByZWFkKCkiLCIiLDApOworI2lmZGVmIElCTVgyNQorICAgIGlmIChuZXRjb25uICYmIChuZXR0eXBlID09IE5FVF9JWDI1KSkgeworCS8qIGNhbid0IHVzZSBzaXplb2YgYmVjYXVzZSBteWJ1ZiBpcyBhIHBvaW50ZXIsIGFuZCBub3QgYW4gYXJyYXkhICovCisJbiA9IHgyNXhpbiggTVlCVUZMRU4sIG15YnVmICk7CisgICAgfSBlbHNlCisjZW5kaWYgLyogSUJNWDI1ICovCisKKyNpZmRlZiBDS19TU0wKKyAgICAgIGlmIChzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnKSB7CisJICBpbnQgZXJyb3IsIG4gPSAwOworCSAgd2hpbGUgKG4gPT0gMCkgeworCSAgICAgIGlmIChzc2xfYWN0aXZlX2ZsYWcpCisgICAgICAgICAgICAgICAgbiA9IFNTTF9yZWFkKHNzbF9jb24sIChjaGFyICopbXlidWYsIHNpemVvZihteWJ1ZikpOworCSAgICAgIGVsc2UgaWYgKHRsc19hY3RpdmVfZmxhZykKKyAgICAgICAgICAgICAgICBuID0gU1NMX3JlYWQodGxzX2NvbiwgKGNoYXIgKilteWJ1Ziwgc2l6ZW9mKG15YnVmKSk7CisgICAgICAgICAgICAgIGVsc2UKKwkJYnJlYWs7CisJICAgICAgc3dpdGNoIChTU0xfZ2V0X2Vycm9yKHNzbF9hY3RpdmVfZmxhZz9zc2xfY29uOnRsc19jb24sbikpIHsKKwkJY2FzZSBTU0xfRVJST1JfTk9ORToKKwkJICBpZiAobiA+IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybihuKTsKKwkJICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybigtMik7CisJCSAgbXNsZWVwKDUwKTsKKwkJICBicmVhazsKKwkJY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKwkJY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorCQkgIHJldHVybigtMSk7CisJCWNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisJCSAgaWYgKG4gIT0gMCkKKwkJICAgIHJldHVybigtMSk7CisJCWNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisJCWNhc2UgU1NMX0VSUk9SX1NTTDoKKwkJY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisJCWRlZmF1bHQ6CisJCSAgdHRjbG9zKDApOworCQkgIHJldHVybigtMyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgQ0tfS0VSQkVST1MKKyNpZmRlZiBLUkI0CisjaWZkZWYgUkxPR0NPREUKKyAgICBpZiAodHRucHJvdG8gPT0gTlBfRUs0TE9HSU4pIHsKKyAgICAgICAgaWYgKChuID0ga3JiNF9kZXNfcmVhZCh0dHlmZCxteWJ1ZixzaXplb2YobXlidWYpKSkgPCAwKQorCSAgcmV0dXJuKC0zKTsKKyAgICAgICAgZWxzZQorCSAgcmV0dXJuKG4pOworICAgIH0KKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2VuZGlmIC8qIEtSQjQgKi8KKyNpZmRlZiBLUkI1CisjaWZkZWYgUkxPR0NPREUKKyAgICBpZiAodHRucHJvdG8gPT0gTlBfRUs1TE9HSU4pIHsKKyAgICAgICAgaWYgKChuID0ga3JiNV9kZXNfcmVhZCh0dHlmZCxteWJ1ZixzaXplb2YobXlidWYpLDApKSA8IDApCisJICByZXR1cm4oLTMpOworICAgICAgICBlbHNlCisJICByZXR1cm4obik7CisgICAgfQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisjaWZkZWYgS1JCNV9VMlUKKyAgICBpZiAodHRucHJvdG8gPT0gTlBfSzVVMlUpIHsKKyAgICAgICAgaWYgKChuID0ga3JiNV91MnVfcmVhZCh0dHlmZCxteWJ1ZixzaXplb2YobXlidWYpKSkgPCAwKQorCSAgcmV0dXJuKC0zKTsKKyAgICAgICAgZWxzZQorCSAgcmV0dXJuKG4pOworICAgIH0KKyNlbmRpZiAvKiBLUkI1X1UyVSAqLworI2VuZGlmIC8qIEtSQjUgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCisjaWZkZWYgTkVUUFRZCisjaWZkZWYgSEFWRV9QVFlUUkFQCisgICAgLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgSFAtVVggcHR5IGkvbyAqLworICBwdHlyZWFkOgorICAgIGlmICh0dHB0eSAmJiBwdHlfdHJhcF9wZW5kaW5nKHR0eWZkKSA+IDApIHsKKyAgICAgICAgaWYgKHB0eV90cmFwX2hhbmRsZXIodHR5ZmQpID4gMCkgeworICAgICAgICAgICAgdHRjbG9zKDApOworICAgICAgICAgICAgcmV0dXJuKC0zKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBIQVZFX1BUWVRSQVAgKi8KKyNlbmRpZiAvKiBORVRQVFkgKi8KKyAgICBuID0gcmVhZChmZCwgbXlidWYsIHNpemVvZihteWJ1ZikpOworICAgIGRlYnVnKEYxMDEsIlNWT1JQT1NJWCBteWZpbGxidWYiLCIiLG4pOworICAgIGRlYnVnKEYxMDEsIlNWT1JQT1NJWCBteWZpbGxidWYgdHRjYXJyIiwiIix0dGNhcnIpOworICAgIGRlYnVnKEYxMDEsIlNWT1JQT1NJWCBteWZpbGxidWYgZXJybm8iLCIiLGVycm5vKTsKKyAgICBpZiAobiA8IDEpIHsKKyNpZmRlZiBORVRQVFkKKyNpZmRlZiBIQVZFX1BUWVRSQVAKKyAgICAgICAgLyogV2hlbiB3ZSBoYXZlIGEgUFRZIHRyYXAgaW4gcGxhY2UgdGhlIGNvbm5lY3Rpb24gY2Fubm90ICovCisgICAgICAgIC8qIGJlIGNsb3NlZCB1bnRpbCB0aGUgdHJhcCByZWNlaXZlcyBhIGNsb3NlIGluZGljYXRpb24uICAqLworICAgICAgICBpZiAobiA9PSAwICYmIHR0cHR5KQorICAgICAgICAgICAgZ290byBwdHlyZWFkOworI2VuZGlmIC8qIEhBVkVfUFRZVFJBUCAqLworI2VuZGlmIC8qIE5FVFBUWSAqLworICAgICAgICByZXR1cm4oLTMpOworICAgIH0KKyAgICByZXR1cm4obik7CisjZW5kaWYgLyogQkVPU09SQkVCT1ggKi8KKyNlbmRpZiAvKiBzeGFFNTAgKi8KK30KKworI2Vsc2UgLyogbm90IEFUJlQgb3IgUE9TSVggKi8KKworI2lmZGVmIGFlZ2lzCisJLyogVGhpcyBpcyBxdW90ZWQgZnJvbSB0aGUgb2xkIG15cmVhZCgpLiAgVGhlIHNlbWFudGljcyBzZWVtIHRvIGJlCisJICogYWxyaWdodCwgYnV0IG1heWJlIGVycm5vIHdvdWxkIG5vdCBuZWVkIHRvIGJlIHNldCBldmVuIHdoZW4KKwkgKiB0aGVyZSBpcyBubyBlcnJvcj8gIEkgZG9uJ3Qga25vdyBhZWdpcy4KKwkgKi8KK2ludAorbXlmaWxsYnVmKCkgeworICAgIGludCBjb3VudDsKKyNpZmRlZiBORVRDTUQKKyAgICBpZiAodHRwaXBlKQorICAgICAgZmQgPSBmZGluOworICAgIGVsc2UKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyAgICAgIGZkID0gdHR5ZmQ7CisKKyAgICBjb3VudCA9IGlvc18kZ2V0KChzaG9ydClmZCwgaW9zXyRjb25kX29wdCwgbXlidWYsIDI1NkwsIHN0KTsKKyAgICBlcnJubyA9IEVJTzsKKyAgICBpZiAoc3QuYWxsID09IGlvc18kZ2V0X2NvbmRpdGlvbmFsX2ZhaWxlZCkgLyogZ2V0IGF0IGxlYXN0IG9uZSAqLworICAgICAgY291bnQgPSBpb3NfJGdldCgoc2hvcnQpZmQsIDAsIG15YnVmLCAxTCwgc3QpOworICAgIGlmIChzdC5hbGwgPT0gaW9zXyRlbmRfb2ZfZmlsZSkKKyAgICAgIHJldHVybigtMyk7CisgICAgZWxzZSBpZiAoc3QuYWxsICE9IHN0YXR1c18kb2spIHsKKwllcnJubyA9IEVJTzsKKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICByZXR1cm4oY291bnQgPiAwID8gY291bnQgOiAtMyk7Cit9CisjZWxzZSAvKiAhYWVnaXMgKi8KKworI2lmZGVmIEZJT05SRUFECisJLyogVGhpcyBpcyBmb3Igc3lzdGVtcyB3aXRoIEZJT05SRUFELiAgRklPTlJFQUQgcmV0dXJucyB0aGUgbnVtYmVyCisJICogb2YgY2hhcmFjdGVycyBhdmFpbGFibGUgZm9yIHJlYWRpbmcuIElmIG5vbmUgYXJlIGF2YWlsYWJsZSwgd2FpdAorCSAqIHVudGlsIHNvbWV0aGluZyBhcnJpdmVzLCBvdGhlcndpc2UgcmV0dXJuIGFsbCB0aGVyZSBpcy4KKwkgKi8KK2ludAorbXlmaWxsYnVmKCkgeworICAgIFBFRUtUWVBFIGF2YWlsID0gMDsKKyAgICBpbnQgeCwgZmQ7CisjaWZkZWYgTkVUQ01ECisgICAgaWYgKHR0cGlwZSkKKyAgICAgIGZkID0gZmRpbjsKKyAgICBlbHNlCisjZW5kaWYgLyogTkVUQ01EICovCisgICAgICBmZCA9IHR0eWZkOworCisjaWZkZWYgU1VOWDI1CisvKgorICBTdW5MaW5rIFguMjUgc3VwcG9ydCBpbiB0aGlzIHJvdXRpbmUgZnJvbSBTdGVmYWFuIEEuIEVlY2tlbHMsIEV1cm9zdGF0IChDRUMpLgorICBEZXBlbmRzIG9uIFN1bk9TIGhhdmluZyBGSU9OUkVBRCwgbm90IGJlY2F1c2Ugd2UgdXNlIGl0LCBidXQganVzdCBzbyB0aGlzCisgIGNvZGUgaXMgZ3JvdXBlZCBjb3JyZWN0bHkgd2l0aGluIHRoZSAjaWZkZWZzLiAgTGV0J3MgaG9wZSBTb2xhcmlzIGtlZXBzIGl0LgorCisgIFdlIGNhbGwgeDI1eGluKCkgaW5zdGVhZCBvZiByZWFkKCkgc28gdGhhdCBRLUJpdCBwYWNrZXRzLCB3aGljaCBjb250YWluCisgIFguMjUgc2VydmljZS1sZXZlbCBpbmZvcm1hdGlvbiAoZS5nLiBQQUQgcGFyYW1ldGVyIGNoYW5nZXMpLCBjYW4gYmUgcHJvY2Vzc2VkCisgIHRyYW5zcGFyZW50bHkgdG8gdGhlIHVwcGVyLWxldmVsIGNvZGUuICBUaGlzIGlzIGEgYmxvY2tpbmcgcmVhZCwgYW5kIHNvCisgIHdlIGRlcGVuZCBvbiBoaWdoZXItbGV2ZWwgY29kZSAoc3VjaCBhcyB0dGluYygpKSB0byBzZXQgYW55IG5lY2Vzc2FyeSBhbGFybXMuCisqLworICAgIGV4dGVybiBpbnQgbmV0dHlwZTsKKyAgICBpZiAobmV0Y29ubiAmJiBuZXR0eXBlID09IE5FVF9TWDI1KSB7CisJd2hpbGUgKCh4ID0geDI1eGluKHNpemVvZih4MjVidWYpLCB4MjVidWYpKSA8IDEpIDsKKwlyZXR1cm4oeCAtIDEpOwkgICAgICAgIC8qICItMSIgY29tcGVuc2F0ZXMgZm9yIGV4dHJhIHN0YXR1cyBieXRlICovCisgICAgfQorI2VuZGlmIC8qIFNVTlgyNSAqLworCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKHNzbF9hY3RpdmVfZmxhZyB8fCB0bHNfYWN0aXZlX2ZsYWcpIHsKKyAgICAgICAgaW50IGVycm9yLCBuID0gMDsKKyAgICAgICAgd2hpbGUgKG4gPT0gMCkgeworICAgICAgICAgICAgaWYgKHNzbF9hY3RpdmVfZmxhZykKKwkgICAgICBuID0gU1NMX3JlYWQoc3NsX2NvbiwgKGNoYXIgKilteWJ1Ziwgc2l6ZW9mKG15YnVmKSk7CisgICAgICAgICAgICBlbHNlCisJICAgICAgbiA9IFNTTF9yZWFkKHRsc19jb24sIChjaGFyICopbXlidWYsIHNpemVvZihteWJ1ZikpOworICAgICAgICAgICAgc3dpdGNoIChTU0xfZ2V0X2Vycm9yKHNzbF9hY3RpdmVfZmxhZz9zc2xfY29uOnRsc19jb24sbikpIHsKKwkgICAgICBjYXNlIFNTTF9FUlJPUl9OT05FOgorICAgICAgICAgICAgICAgIGlmIChuID4gMCkKKwkJICByZXR1cm4obik7CisgICAgICAgICAgICAgICAgaWYgKG4gPCAwKQorCQkgIHJldHVybigtMik7CisgICAgICAgICAgICAgICAgbXNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwkgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorCSAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworCSAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisJCWlmIChuICE9IDApCisJCSAgcmV0dXJuKC0xKTsKKwkgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQOgorCSAgICAgIGNhc2UgU1NMX0VSUk9SX1NTTDoKKwkgICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKwkgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHR0Y2xvcygwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgS1JCNAorI2lmZGVmIFJMT0dDT0RFCisgICAgaWYgKHR0bnByb3RvID09IE5QX0VLNExPR0lOKSB7CisgICAgICAgIGlmICgoeCA9IGtyYjRfZGVzX3JlYWQodHR5ZmQsbXlidWYsc2l6ZW9mKG15YnVmKSkpIDwgMCkKKwkgIHJldHVybigtMSk7CisgICAgICAgIGVsc2UKKwkgIHJldHVybih4KTsKKyAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNlbmRpZiAvKiBLUkI0ICovCisjaWZkZWYgS1JCNQorI2lmZGVmIFJMT0dDT0RFCisgICAgaWYgKHR0bnByb3RvID09IE5QX0VLNUxPR0lOKSB7CisgICAgICAgIGlmICgoeCA9IGtyYjVfZGVzX3JlYWQodHR5ZmQsbXlidWYsc2l6ZW9mKG15YnVmKSwwKSkgPCAwKQorCSAgcmV0dXJuKC0xKTsKKyAgICAgICAgZWxzZQorCSAgcmV0dXJuKHgpOworICAgIH0KKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2lmZGVmIEtSQjVfVTJVCisgICAgaWYgKHR0bnByb3RvID09IE5QX0s1VTJVKSB7CisgICAgICAgIGlmICgoeCA9IGtyYjVfdTJ1X3JlYWQodHR5ZmQsbXlidWYsc2l6ZW9mKG15YnVmKSkpIDwgMCkKKwkgIHJldHVybigtMSk7CisgICAgICAgIGVsc2UKKwkgIHJldHVybih4KTsKKyAgICB9CisjZW5kaWYgLyogS1JCNV9VMlUgKi8KKyNlbmRpZiAvKiBLUkI1ICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKworICAgIGVycm5vID0gMDsKKyAgICBkZWJ1ZyhGMTAxLCJteWZpbGxidWYgY2FsbGluZyBGSU9OUkVBRCBpb2N0bCIsIiIseGxvY2FsKTsKKyAgICB4ID0gaW9jdGwoZmQsIEZJT05SRUFELCAmYXZhaWwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworCWRlYnVnKEYxMDEsIm15ZmlsbGJ1ZiBGSU9OUkVBRCIsIiIseCk7CisJZGVidWcoRjEwMSwibXlmaWxsYnVmIEZJT05SRUFEIGF2YWlsIiwiIixhdmFpbCk7CisJZGVidWcoRjEwMSwibXlmaWxsYnVmIEZJT05SRUFEIGVycm5vIiwiIixlcnJubyk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgaWYgKHggPCAwIHx8IGF2YWlsID09IDApCisgICAgICBhdmFpbCA9IDE7CisKKyAgICBpZiAoYXZhaWwgPiBNWUJVRkxFTikKKyAgICAgIGF2YWlsID0gTVlCVUZMRU47CisKKyAgICBlcnJubyA9IDA7CisKKyAgICB4ID0gcmVhZChmZCwgbXlidWYsIChpbnQpIGF2YWlsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKwlkZWJ1ZyhGMTAxLCJteWZpbGxidWYgYXZhaWwiLCIiLGF2YWlsKTsKKwlkZWJ1ZyhGMTAxLCJteWZpbGxidWYgcmVhZCIsIiIseCk7CisJZGVidWcoRjEwMSwibXlmaWxsYnVmIHJlYWQgZXJybm8iLCIiLGVycm5vKTsKKyAgICAgICAgaWYgKHggPiAwKQorCSAgaGV4ZHVtcCgibXlmaWxsYnVmIG15YnVmIixteWJ1Zix4KTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICBpZiAoeCA8IDEpIHggPSAtMzsJCQkvKiByZWFkIDAgPT0gY29ubmVjdGlvbiBsb3NzICovCisgICAgcmV0dXJuKHgpOworfQorCisjZWxzZSAvKiAhRklPTlJFQUQgKi8KKy8qIEFkZCBvdGhlciBzeXN0ZW1zIGhlcmUsIGJldHdlZW4gI2lmZGVmIGFuZCAjZWxzZSwgZS5nLiBORVRDT05OLiAqLworLyogV2hlbiB0aGVyZSBpcyBubyBvdGhlciBwb3NzaWJpbGl0eSwgcmVhZCAxIGNoYXJhY3RlciBhdCBhIHRpbWUuICovCitpbnQKK215ZmlsbGJ1ZigpIHsKKyAgICBpbnQgeDsKKworI2lmZGVmIENLX1NTTAorICAgIGlmIChzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgIGludCBlcnJvciwgbiA9IDA7CisgICAgICAgIHdoaWxlIChuID09IDApIHsKKyAgICAgICAgICAgIGlmIChzc2xfYWN0aXZlX2ZsYWcpCisJICAgICAgbiA9IFNTTF9yZWFkKHNzbF9jb24sIChjaGFyICopbXlidWYsIHNpemVvZihteWJ1ZikpOworICAgICAgICAgICAgZWxzZQorCSAgICAgIGNvdW50ID0gU1NMX3JlYWQodGxzX2NvbiwgKGNoYXIgKilteWJ1Ziwgc2l6ZW9mKG15YnVmKSk7CisgICAgICAgICAgICBzd2l0Y2ggKFNTTF9nZXRfZXJyb3Ioc3NsX2FjdGl2ZV9mbGFnP3NzbF9jb246dGxzX2NvbixuKSkgeworCSAgICAgIGNhc2UgU1NMX0VSUk9SX05PTkU6CisgICAgICAgICAgICAgICAgaWYgKG4gPiAwKQorCQkgIHJldHVybihuKTsKKyAgICAgICAgICAgICAgICBpZiAobiA8IDApCisJCSAgcmV0dXJuKC0yKTsKKyAgICAgICAgICAgICAgICBtc2xlZXAoNTApOworICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisJICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisJICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKwkJaWYgKG4gIT0gMCkKKwkJICByZXR1cm4oLTEpOworCSAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisJICAgICAgY2FzZSBTU0xfRVJST1JfU1NMOgorCSAgICAgIGNhc2UgU1NMX0VSUk9SX1pFUk9fUkVUVVJOOgorCSAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdHRjbG9zKDApOworICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgQ0tfS0VSQkVST1MKKyNpZmRlZiBLUkI0CisjaWZkZWYgUkxPR0NPREUKKyAgICBpZiAodHRucHJvdG8gPT0gTlBfRUs0TE9HSU4pIHsKKyAgICAgICAgaWYgKChsZW4gPSBrcmI0X2Rlc19yZWFkKHR0eWZkLG15YnVmLHNpemVvZihteWJ1ZikpKSA8IDApCisJICByZXR1cm4oLTEpOworICAgICAgICBlbHNlCisJICByZXR1cm4obGVuKTsKKyAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNlbmRpZiAvKiBLUkI0ICovCisjaWZkZWYgS1JCNQorI2lmZGVmIFJMT0dDT0RFCisgICAgaWYgKHR0bnByb3RvID09IE5QX0VLNUxPR0lOKSB7CisgICAgICAgIGlmICgobGVuID0ga3JiNV9kZXNfcmVhZCh0dHlmZCxteWJ1ZixzaXplb2YobXlidWYpLDApKSA8IDApCisJICByZXR1cm4oLTEpOworICAgICAgICBlbHNlCisJICByZXR1cm4obGVuKTsKKyAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBLUkI1X1UyVQorICAgIGlmICh0dG5wcm90byA9PSBOUF9LNVUyVSkgeworICAgICAgICBpZiAoKGxlbiA9IGtyYjVfdTJ1X3JlYWQodHR5ZmQsbXlidWYsc2l6ZW9mKG15YnVmKSkpIDwgMCkKKwkgIHJldHVybigtMSk7CisgICAgICAgIGVsc2UKKwkgIHJldHVybihsZW4pOworICAgIH0KKyNlbmRpZiAvKiBLUkI1X1UyVSAqLworI2VuZGlmIC8qIEtSQjUgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCisjaWZkZWYgTkVUQ01ECisgICAgaWYgKHR0cGlwZSkKKyAgICAgIGZkID0gZmRpbjsKKyAgICBlbHNlCisjZW5kaWYgLyogTkVUQ01EICovCisgICAgICBmZCA9IHR0eWZkOworICAgIHggPSByZWFkKGZkLCBteWJ1ZiwgMSk7CisgICAgcmV0dXJuKHggPiAwID8geCA6IC0zKTsKK30KKworI2VuZGlmIC8qICFGSU9OUkVBRCAqLworI2VuZGlmIC8qICFhZWdpcyAqLworI2VuZGlmIC8qICFBVFRTViAqLworCisjZW5kaWYgLyogTVlSRUFEICovCisKKyNpZmRlZiBNSU5JWDIKKyN1bmRlZiBNSU5JWAorI2VuZGlmIC8qIE1JTklYMiAqLworCisvKiAgVCBUIF8gVCBOIE8gUCBUICAtLSAgSGFuZGxlIFRlbG5ldCBuZWdvdGlvbnMgaW4gaW5jb21pbmcgZGF0YSAqLworLyoKKyAgQ2FsbCB3aXRoIHRoZSBJQUMgdGhhdCB3YXMgZW5jb3VudGVyZWQuCisgIFJldHVybnM6CisgICAtMzogSWYgY29ubmVjdGlvbiBoYXMgZHJvcHBlZCBvciBnb25lIGJhZC4KKyAgIC0yOiBPbiBUZWxuZXQgcHJvdG9jb2wgZXJyb3IgcmVzdWx0aW5nIGluIGluY29uc2lzdGVudCBzdGF0ZXMuCisgICAgMDogSWYgbmVnb3RpYXRpb24gT0sgYW5kIGNhbGxlciBoYXMgbm90aGluZyB0byBkby4KKyAgICAxOiBJZiBwYWNrZXQgc3RhcnQgY2hhcmFjdGVyIGhhcyBjaGFuZ2VkIChuZXcgdmFsdWUgaXMgaW4gZ2xvYmFsIHN0Y2hyKS4KKyAgMjU1OiBJZiB0aGVyZSB3YXMgYSBxdW90ZWQgSUFDIGFzIGRhdGEuCisgICBvcjogTm90IGF0IGFsbCBpZiB3ZSBnb3QgYSBsZWdpdGltYXRlIFRlbG5ldCBMb2dvdXQgcmVxdWVzdC4KKyovCisjaWZkZWYgVENQU09DS0VUCitzdGF0aWMgaW50Cit0dF90bm9wdChuKSBpbnQgbjsgewkJCS8qIEhhbmRsZSBUZWxuZXQgb3B0aW9ucyAqLworICAgIC8qIEluIGNhc2UgY2FsbGVyIGRpZCBub3QgYWxyZWFkeSBjaGVjayB0aGVzZSBjb25kaXRpb25zLi4uICAqLworICAgIGlmIChuID09IElBQyAmJgorCSgoeGxvY2FsICYmIG5ldGNvbm4gJiYgSVNfVEVMTkVUKCkpIHx8CisJICgheGxvY2FsICYmIHNzdGVsbmV0KSkpIHsKKwlleHRlcm4gaW50IGR1cGxleDsKKwlleHRlcm4gaW50IHNlcnZlcjsKKwlpbnQgdHggPSAwOworCWRlYnVnKEYxMDAsInR0aW5sIGNhbGxpbmcgdG5fZG9vcCgpIiwiIiwwKTsKKwl0eCA9IHRuX2Rvb3AoKENIQVIpKG4gJiAweGZmKSxkdXBsZXgsdHRpbmMpOworCWRlYnVnKEYxMTEsInR0aW5sIHRuX2Rvb3AoKSByZXR1cm5lZCIsInR4Iix0eCk7CisJc3dpdGNoICh0eCkgeworCSAgY2FzZSAwOgorCSAgICByZXR1cm4oMCk7CisJICBjYXNlIC0xOgkJCS8qIEkvTyBlcnJvciAqLworCSAgICB0dGltb2ZmKCk7CQkJLyogVHVybiBvZmYgdGltZXIgKi8KKwkgICAgcmV0dXJuKC0zKTsKKyAgICAgICAgICBjYXNlIC0yOgkJCS8qIENvbm5lY3Rpb24gZmFpbGVkLiAqLworICAgICAgICAgIGNhc2UgLTM6CisJICAgIHR0aW1vZmYoKTsJCQkvKiBUdXJuIG9mZiB0aW1lciAqLworCSAgICB0dGNsb3MoMCk7CisJICAgIHJldHVybigtMyk7CisJICBjYXNlIDE6CQkJLyogRUNITyBjaGFuZ2UgKi8KKwkgICAgZHVwbGV4ID0gMTsKKwkgICAgcmV0dXJuKDApOworCSAgY2FzZSAyOgkJCS8qIEVDSE8gY2hhbmdlICovCisJICAgIGR1cGxleCA9IDA7CisJICAgIHJldHVybigwKTsKKwkgIGNhc2UgMzoJCQkvKiBRdW90ZWQgSUFDICovCisJICAgIG4gPSAyNTU7CisJICAgIHJldHVybigodW5zaWduZWQpMjU1KTsKKyNpZmRlZiBJS1NfT1BUSU9OCisJICBjYXNlIDQ6IHsKKwkgICAgICBpZiAoVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC51X3N0YXJ0ICYmIHNlcnZlcgorI2lmZGVmIElLU0QKKwkJICAmJiAhaW5zZXJ2ZXIKKyNlbmRpZiAvKiBJS1NEICovCisJCSAgKSB7CQkJLyogUmVtb3RlIGluIFNlcnZlciBtb2RlICovCisJCSAgdHRpbW9mZigpOwkJLyogVHVybiBvZmYgdGltZXIgKi8KKwkJICBkZWJ1ZyhGMTAwLCJ1X3N0YXJ0IGFuZCAhaW5zZXJ2ZXIiLCIiLDApOworCQkgIHJldHVybigtMik7CQkvKiBFbmQgc2VydmVyIG1vZGUgKi8KKwkgICAgICB9IGVsc2UgaWYgKCFURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0ICYmCisJCQkgc2VydmVyCisJCQkgKSB7CQkvKiBJJ20gbm8gbG9uZ2VyIGluIFNlcnZlciBNb2RlICovCisJCSAgZGVidWcoRjEwMCwibWVfc3RhcnQgYW5kIHNlcnZlciIsIiIsMCk7CisJCSAgdHRpbW9mZigpOworCQkgIHJldHVybigtMik7CisJICAgICAgfQorCSAgICAgIHJldHVybigwKTsKKwkgIH0KKwkgIGNhc2UgNTogewkJCS8qIFN0YXJ0IGNoYXJhY3RlciBjaGFuZ2UgKi8KKwkgICAgICAvKiBleHRlcm4gQ0hBUiBzdGNocjsgKi8KKwkgICAgICAvKiBzdGFydCA9IHN0Y2hyOyAqLworCSAgICAgIHJldHVybigxKTsKKwkgIH0KKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisJICBjYXNlIDY6CQkJLyogUmVtb3RlIExvZ291dCAqLworCSAgICB0dGltb2ZmKCk7CisJICAgIHR0Y2xvcygwKTsKKyNpZmRlZiBJS1NECisJICAgIGlmIChpbnNlcnZlciAmJiAhbG9jYWwpCisJICAgICAgZG9leGl0KEdPT0RfRVhJVCwwKTsKKwkgICAgZWxzZQorI2VuZGlmIC8qIElLU0QgKi8KKwkgICAgICByZXR1cm4oLTIpOworCSAgZGVmYXVsdDoKKwkgICAgcmV0dXJuKDApOworCX0KKyAgICB9IGVsc2UKKyAgICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworLyogIFQgVCBGIEwgVSBJICAtLSAgRmx1c2ggdHR5IGlucHV0IGJ1ZmZlciAqLworCit2b2lkCit0dGZsdXgoKSB7CQkJCS8qIEJ1dCBmaXJzdC4uLiAqLworI2lmZGVmIE1ZUkVBRAorLyoKKyAgRmx1c2ggaW50ZXJuYWwgTVlSRUFEIGJ1ZmZlci4KKyovCisjaWZkZWYgVENQU09DS0VUCisgICAgaW50IGRvdG5vcHRzLCB4OworICAgIGRvdG5vcHRzID0gKCgoeGxvY2FsICYmIG5ldGNvbm4gJiYgSVNfVEVMTkVUKCkpIHx8CisJCSAoIXhsb2NhbCAmJiBzc3RlbG5ldCkpKTsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dGZsdXggbXlfY291bnQiLCIiLG15X2NvdW50KTsKKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICBpZiAoZG90bm9wdHMpIHsKKwlDSEFSIGNoID0gJ1wwJzsKKyAgICAgICAgd2hpbGUgKG15X2NvdW50ID4gMCkgeworCSAgICBjaCA9IG15cmVhZCgpOworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgIGlmIChURUxPUFRfVShURUxPUFRfRU5DUllQVElPTikpCisJICAgICAgY2tfdG5fZGVjcnlwdCgmY2gsMSk7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICAgICAgaWYgKGNoID09IElBQykKKwkgICAgICB4ID0gdHRfdG5vcHQoY2gpOworICAgICAgICB9CisgICAgfSBlbHNlCisjZW5kaWYgLyogVENQU09DS0VUICovCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBpZiAoVEVMT1BUX1UoVEVMT1BUX0VOQ1JZUFRJT04pICYmIG15X2NvdW50ID4gMCkKKyAgICAgIGNrX3RuX2RlY3J5cHQoJm15YnVmW215X2l0ZW0rMV0sbXlfY291bnQpOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgbXlfY291bnQgPSAwOwkJCS8qIFJlc2V0IGNvdW50IHRvIHplcm8gKi8KKyAgICBteV9pdGVtID0gLTE7CQkJLyogQW5kIGJ1ZmZlciBpbmRleCB0byAtMSAqLworI2VuZGlmIC8qIE1ZUkVBRCAqLworfQorCitpbnQKK3R0Zmx1aSgpIHsKKyAgICBpbnQgbiwgZmQ7CisjaWZkZWYgVENQU09DS0VUCisgICAgaW50IGRvdG5vcHRzOworICAgIGRvdG5vcHRzID0gKCgoeGxvY2FsICYmIG5ldGNvbm4gJiYgSVNfVEVMTkVUKCkpIHx8CisJCSAoIXhsb2NhbCAmJiBzc3RlbG5ldCkpKTsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpcGUpCisgICAgICBmZCA9IGZkaW47CisgICAgZWxzZQorI2VuZGlmIC8qIE5FVENNRCAqLworICAgICAgZmQgPSB0dHlmZDsKKworI2lmZGVmIFRUTEVCVUYKKyAgICB0dHB1c2ggPSAtMTsJCQkvKiBDbGVhciB0aGUgcGVlay1haGVhZCBjaGFyICovCisgICAgd2hpbGUgKGxlX2RhdGEgJiYgKGxlX2luYnVmKCkgPiAwKSkgeworICAgICAgICBDSEFSIGNoID0gJ1wwJzsKKyAgICAgICAgaWYgKGxlX2dldGNoYXIoJmNoKSA+IDApIHsJLyogQ2xlYXIgYW55IG1vcmUuLi4gKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInR0Zmx1aSBsZV9pbmJ1ZiBjaCIsIiIsY2gpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFRUTEVCVUYgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dGZsdWkgdHRwaXBlIiwiIix0dHBpcGUpOworCisjaWZkZWYgTVlSRUFECisvKgorICBGbHVzaCBpbnRlcm5hbCBNWVJFQUQgYnVmZmVyICpORVhUKiwgaW4gYWxsIGNhc2VzLgorKi8KKyAgICB0dGZsdXgoKTsKKyNlbmRpZiAvKiBNWVJFQUQgKi8KKworI2lmZGVmIE5FVENPTk4KKy8qIE5ldHdvcmsgZmx1c2ggaXMgZG9uZSBzcGVjaWFsbHksIGluIHRoZSBuZXR3b3JrIHN1cHBvcnQgbW9kdWxlLiAqLworICAgIGlmICgobmV0Y29ubiB8fCBzc3RlbG5ldCkgJiYgIXR0cGlwZSAmJiAhdHRwdHkpIHsKKwlkZWJ1ZyhGMTAwLCJ0dGZsdWkgbmV0Zmx1aSIsIiIsMCk7CisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIFROX0NPTVBPUlQKKwlpZiAoaXN0bmNvbXBvcnQoKSkKKyAgICAgICAgICAgIHRuY19zZW5kX3B1cmdlX2RhdGEoVE5DX1BVUkdFX1JFQ0VJVkUpOworI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisJcmV0dXJuKG5ldGZsdWkoKSk7CisgICAgfQorI2VuZGlmIC8qIE5FVENPTk4gKi8KKworICAgIGRlYnVnKEYxMDEsInR0Zmx1aSB0dHlmZCIsIiIsdHR5ZmQpOyAvKiBOb3QgbmV0d29yayAqLworICAgIGlmICh0dHlmZCA8IDApCisgICAgICByZXR1cm4oLTEpOworCisjaWZkZWYgYWVnaXMKKyAgICBzaW9fJGNvbnRyb2woKHNob3J0KXlmZCwgc2lvXyRmbHVzaF9pbiwgdHJ1ZSwgc3QpOworICAgIGlmIChzdC5hbGwgIT0gc3RhdHVzXyRvaykgeworCWZwcmludGYoc3RkZXJyLCAiZmx1c2ggZmFpbGVkOiAiKTsgZXJyb3JfJHByaW50KHN0KTsKKyAgICB9IGVsc2UgeyAgICAgIC8qIHNvbWV0aW1lcyB0aGUgZmx1c2ggZG9lc24ndCB3b3JrICovCisgICAgICAgIGZvciAoOzspIHsKKwkgICAgY2hhciBidWZbMjU2XTsKKyAgICAgICAgICAgIC8qIGVhdCBhbGwgdGhlIGNoYXJhY3RlcnMgdGhhdCBzaG91bGRuJ3QgYmUgYXZhaWxhYmxlICovCisgICAgICAgICAgICBpb3NfJGdldCgoc2hvcnQpZmQsIGlvc18kY29uZF9vcHQsIGJ1ZiwgMjU2TCwgc3QpOyAvKiAodm9pZCkgKi8KKyAgICAgICAgICAgIGlmIChzdC5hbGwgPT0gaW9zXyRnZXRfY29uZGl0aW9uYWxfZmFpbGVkKSBicmVhazsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmx1c2ggZmFpbGVkKDIpOiAiKTsgZXJyb3JfJHByaW50KHN0KTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisjaWZkZWYgQlNENDQJCQkJLyogNC40IEJTRCAqLworICAgIG4gPSBGUkVBRDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNwZWNpZnkgcmVhZCBxdWV1ZSAqLworICAgIGRlYnVnKEYxMDAsInR0Zmx1aSBCU0Q0NCIsIiIsMCk7CisgICAgaW9jdGwoZmQsVElPQ0ZMVVNILCZuKTsKKyNlbHNlCisjaWZkZWYgUGxhbjkKKyN1bmRlZiBQT1NJWAkJCQkvKiBVaCBvaC4uLiAqLworI2VuZGlmIC8qIFBsYW45ICovCisjaWZkZWYgUE9TSVgJCQkJLyogUE9TSVggKi8KKyAgICBkZWJ1ZyhGMTAwLCJ0dGZsdWkgUE9TSVgiLCIiLDApOworICAgIHRjZmx1c2goZmQsVENJRkxVU0gpOworI2Vsc2UKKyNpZmRlZiBBVFRTVgkJCQkvKiBTeXN0ZW0gViAqLworI2lmbmRlZiBWWFZFCisgICAgZGVidWcoRjEwMCwidHRmbHVpIEFUVFNWIiwiIiwwKTsKKyAgICBpb2N0bChmZCxUQ0ZMU0gsMCk7CisjZW5kaWYgLyogVlhWRSAqLworI2Vsc2UJCQkJCS8qIE5vdCBCU0Q0NCwgUE9TSVgsIG9yIFN5cyBWICovCisjaWZkZWYgVElPQ0ZMVVNICQkJLyogVGhvc2Ugd2l0aCBUSU9DRkxVU0ggZGVmaW5lZCAqLworI2lmZGVmIEFOWUJTRAkJCQkvKiBCZXJrZWxleSAqLworICAgIG4gPSBGUkVBRDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNwZWNpZnkgcmVhZCBxdWV1ZSAqLworICAgIGRlYnVnKEYxMDAsInR0Zmx1aSBUSU9DRkxVU0ggQU5ZQlNEIiwiIiwwKTsKKyAgICBpb2N0bChmZCxUSU9DRkxVU0gsJm4pOworI2Vsc2UJCQkJCS8qIE90aGVycyAoVjcsIGV0YykgKi8KKyAgICBkZWJ1ZyhGMTAwLCJ0dGZsdWkgVElPQ0ZMVVNIIiwiIiwwKTsKKyAgICBpb2N0bChmZCxUSU9DRkxVU0gsMCk7CisjZW5kaWYgLyogQU5ZQlNEICovCisjZWxzZQkJCQkJLyogQWxsIG90aGVycy4uLiAqLworLyoKKyAgTm8gc3lzdGVtIGNhbGwgKHRoYXQgd2Uga25vdyBhYm91dCkgZm9yIGlucHV0IGJ1ZmZlciBmbHVzaGluZy4KKyAgU28gc2VlIGhvdyBtYW55IHRoZXJlIGFyZSBhbmQgcmVhZCB0aGVtIGluIGEgbG9vcCwgdXNpbmcgdHRpbmMoKS4KKyAgdHRpbmMoKSBpcyBidWZmZXJlZCwgc28gd2UncmUgbm90IGdldHRpbmcgY2hhcmdlZCB3aXRoIGEgc3lzdGVtIGNhbGwKKyAgcGVyIGNoYXJhY3RlciwganVzdCBhIGZ1bmN0aW9uIGNhbGwuCisqLworICAgIGlmICgobiA9IHR0Y2hrKCkpID4gMCkgeworCWRlYnVnKEYxMDEsInR0Zmx1aSByZWFkIGxvb3AiLCIiLG4pOworCXdoaWxlICgobi0tKSAmJiB0dGluYygwKSA+IDApIDsKKyAgICB9CisjZW5kaWYgLyogVElPQ0ZMVVNIICovCisjZW5kaWYgLyogQVRUU1YgKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworI2lmZGVmIFBsYW45CisjZGVmaW5lIFBPU0lYCisjZW5kaWYgLyogUGxhbjkgKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworI2VuZGlmIC8qIGFlZ2lzICovCisgICAgcmV0dXJuKDApOworfQorCitpbnQKK3R0Zmx1bygpIHsJCQkJLyogRmx1c2ggb3V0cHV0IGJ1ZmZlciAqLworICAgIGludCBmZDsKKyNpZmRlZiBORVRDTUQKKyAgICBpZiAodHRwaXBlKQorICAgICAgZmQgPSBmZG91dDsKKyAgICBlbHNlCisjZW5kaWYgLyogTkVUQ01EICovCisgICAgICBmZCA9IHR0eWZkOworCisjaWZkZWYgUGxhbjkKKyAgICByZXR1cm4gMDsKKyNlbHNlCisjaWZkZWYgUE9TSVgKKyAgICByZXR1cm4odGNmbHVzaChmZCxUQ09GTFVTSCkpOworI2Vsc2UKKyNpZmRlZiBPWE9TCisgICAgcmV0dXJuKGlvY3RsKGZkLFRDRkxTSCwxKSk7CisjZWxzZQorICAgIHJldHVybigwKTsJCQkJLyogQWxsIG90aGVycywgbm90aGluZyAqLworI2VuZGlmIC8qIE9YT1MgKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworI2VuZGlmIC8qIFBsYW45ICovCit9CisKKy8qIEludGVycnVwdCBGdW5jdGlvbnMgKi8KKworLyogU2V0IHVwIHRlcm1pbmFsIGludGVycnVwdHMgb24gY29uc29sZSB0ZXJtaW5hbCAqLworCisjaWZuZGVmIEZJT05SRUFECQkJLyogV2UgZG9uJ3QgbmVlZCBlc2N0cnAoKSAqLworI2lmbmRlZiBTRUxFQ1QJCQkJLyogaWYgd2UgaGF2ZSBhbnkgb2YgdGhlc2UuLi4gKi8KKyNpZm5kZWYgQ0tfUE9MTAorI2lmbmRlZiBSRENISworCisjaWZuZGVmIE9YT1MKKyNpZmRlZiBTVk9SUE9TSVgKK1NJR1RZUAorZXNjdHJwKGZvbykgaW50IGZvbzsgewkJCS8qIHRyYXAgY29uc29sZSBlc2NhcGVzICheXCkgKi8KKyAgICBzaWduYWwoU0lHUVVJVCxTSUdfSUdOKTsgICAgICAgICAgICAvKiBpZ25vcmUgdW50aWwgdHJhcHBlZCAqLworICAgIGNvbmVzYyA9IDE7CisgICAgZGVidWcoRjEwMSwiZXNjdHJwIGNhdWdodCBTSUdRVUlUIiwiIixjb25lc2MpOworfQorI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworI2VuZGlmIC8qIE9YT1MgKi8KKworI2lmZGVmIFY3CisjaWZuZGVmIE1JTklYMgorU0lHVFlQCitlc2N0cnAoZm9vKSBpbnQgZm9vOyB7CQkJLyogdHJhcCBjb25zb2xlIGVzY2FwZXMgKF5cKSAqLworICAgIHNpZ25hbChTSUdRVUlULFNJR19JR04pOyAgICAgICAgICAgIC8qIGlnbm9yZSB1bnRpbCB0cmFwcGVkICovCisgICAgY29uZXNjID0gMTsKKyAgICBkZWJ1ZyhGMTAxLCJlc2N0cnAgY2F1Z2h0IFNJR1FVSVQiLCIiLGNvbmVzYyk7Cit9CisjZW5kaWYgLyogTUlOSVgyICovCisjZW5kaWYgLyogVjcgKi8KKworI2lmZGVmIEM3MAorU0lHVFlQCitlc2N0cnAoZm9vKSBpbnQgZm9vOyB7CQkJLyogdHJhcCBjb25zb2xlIGVzY2FwZXMgKF5cKSAqLworICAgIGNvbmVzYyA9IDE7CisgICAgc2lnbmFsKFNJR1FVSVQsU0lHX0lHTik7ICAgICAgICAgICAgLyogaWdub3JlIHVudGlsIHRyYXBwZWQgKi8KK30KKyNlbmRpZiAvKiBDNzAgKi8KKworI2VuZGlmIC8qIFJEQ0hLICovCisjZW5kaWYgLyogQ0tfUE9MTCAqLworI2VuZGlmIC8qIFNFTEVDVCAqLworI2VuZGlmIC8qIEZJT05SRUFEICovCisKKy8qICBDIE8gTiBCIEcgVCAgLS0gIEJhY2tncm91bmQgVGVzdCAgKi8KKworc3RhdGljIGludCBqYyA9IDA7CQkJLyogMCA9IG5vIGpvYiBjb250cm9sICovCisKKy8qCisgIENhbGwgd2l0aCBmbGFnID09IDEgdG8gcHJldmVudCBzaWduYWwgdGVzdCwgd2hpY2ggY2FuIG5vdCBiZSBleHBlY3RlZAorICB0byB3b3JrIGR1cmluZyBmaWxlIHRyYW5zZmVyLCB3aGVuIFNJR0lOVCBwcm9iYWJseSAqaXMqIHNldCB0byBTSUdfSUdOLgorCisgIENhbGwgd2l0aCBmbGFnID09IDAgdG8gdXNlIHRoZSBzaWduYWwgdGVzdCwgYnV0IG9ubHkgaWYgdGhlIHByb2Nlc3MtZ3JvdXAKKyAgdGVzdCBmYWlscywgYXMgaXQgZG9lcyBvbiBzb21lIFVOSVggc3lzdGVtcywgd2hlcmUgZ2V0cGdycCgpIGlzIGJ1Z2d5LAorICByZXF1aXJlcyBhbiBhcmd1bWVudCB3aGVuIHRoZSBtYW4gcGFnZSBzYXlzIGl0IGRvZXNuJ3QsIG9yIHZpY2UgdmVyc2EuCisKKyAgSWYgZmxhZyA9PSAwIGFuZCB0aGUgcHJvY2Vzcy1ncm91cCB0ZXN0IGZhaWxzLCB0aGVuIHdlIGRldGVybWluZSBiYWNrZ3JvdW5kCisgIHN0YXR1cyBzaW1wbHkgKGJ1dCBub3QgbmVjZXNzYXJpbHkgcmVsaWFibHkpIGZyb20gaXNhdHR5KCkuCisKKyAgY29uYmd0KCkgc2V0cyB0aGUgZ2xvYmFsIGJhY2tncmQgPSAxIGlmIHdlIGFwcGVhciB0byBiZSBpbiB0aGUgYmFja2dyb3VuZCwKKyAgYW5kIHRvIDAgaWYgd2Ugc2VlbSB0byBiZSBpbiB0aGUgZm9yZWdyb3VuZC4gIGNvbmJndCgpIGlzIGhpZ2hseSBwcm9uZSB0bworICBtaXNiZWhhdmlvci4KKyovCitWT0lECitjb25iZ3QoZmxhZykgaW50IGZsYWc7IHsKKyAgICBpbnQgeCA9IC0xLAkJCQkvKiBwcm9jZXNzIGdyb3VwIG9yIFNJR0lOVCB0ZXN0ICovCisgICAgICAgIHkgPSAwOwkJCQkvKiBpc2F0dHkoKSB0ZXN0ICovCisvKgorICBDaGVjayBmb3IgYmFja2dyb3VuZCBvcGVyYXRpb24sIGV2ZW4gaWYgbm90IHJ1bm5pbmcgb24gcmVhbCB0dHksIHNvIHRoYXQKKyAgYmFja2dyb3VuZCBmbGFnIGNhbiBiZSBzZXQgY29ycmVjdGx5LiAgSWYgYmFja2dyb3VuZCBzdGF0dXMgaXMgZGV0ZWN0ZWQsCisgIHRoZW4gS2VybWl0IHdpbGwgbm90IGlzc3VlIGl0cyBpbnRlcmFjdGl2ZSBwcm9tcHQgb3IgbW9zdCBtZXNzYWdlcy4KKyAgSWYgeW91ciBwcm9tcHQgZ29lcyBhd2F5LCB5b3UgY2FuIGJsYW1lIChhbmQgZml4PykgdGhpcyBmdW5jdGlvbi4KKyovCisKKy8qIFVzZSBwcm9jZXNzLWdyb3VwIHRlc3QgaWYgcG9zc2libGUuICovCisKKyNpZmRlZiBQT1NJWAkJCQkvKiBXZSBjYW4gZG8gaXQgaW4gUE9TSVggKi8KKyNkZWZpbmUgUEdST1VQX1QKKyNlbHNlCisjaWZkZWYgQlNENAkJCQkvKiBhbmQgaW4gQlNEIDQueC4gKi8KKyNkZWZpbmUgUEdST1VQX1QKKyNlbHNlCisjaWZkZWYgSFBVWEpPQkNUTAkJCS8qIGFuZCBpbiBtb3N0IEhQLVVYJ3MgKi8KKyNkZWZpbmUgUEdST1VQX1QKKyNlbHNlCisjaWZkZWYgVElPQ0dQR1JQCQkJLyogYW5kIGFueXBsYWNlIHRoYXQgaGFzIHRoaXMgaW9jdGwuICovCisjZGVmaW5lIFBHUk9VUF9UCisjZW5kaWYgLyogVElPQ0dQR1JQICovCisjZW5kaWYgLyogSFBVWEpPQkNUTCAqLworI2VuZGlmIC8qIEJTRDQgKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworCisjaWZkZWYgTUlQUwkJCQkvKiBFeGNlcHQgaWYgaXQgZG9lc24ndCB3b3JrLi4uICovCisjdW5kZWYgUEdST1VQX1QKKyNlbmRpZiAvKiBNSVBTICovCisKKyNpZmRlZiBQR1JPVVBfVAorLyoKKyAgU2VtaS1yZWxpYWJsZSBwcm9jZXNzLWdyb3VwIHRlc3QuICBDaGVjayB3aGV0aGVyIHRoaXMgcHJvY2VzcydzIGdyb3VwIGlzCisgIHRoZSBzYW1lIGFzIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCdzIHByb2Nlc3MgZ3JvdXAuICBUaGlzIHdvcmtzIGlmIHRoZQorICBnZXRwZ3JwKCkgY2FsbCBkb2Vzbid0IGxpZSAoYXMgaXQgZG9lcyBpbiB0aGUgU1VOT1MgU3lzdGVtIFYgZW52aXJvbm1lbnQpLgorKi8KKyAgICBQSURfVCBteXBncnAgPSAoUElEX1QpMDsJCS8qIEtlcm1pdCdzIHByb2Nlc3MgZ3JvdXAgKi8KKyAgICBQSURfVCBjdHBncnAgPSAoUElEX1QpMDsJCS8qIFRoZSB0ZXJtaW5hbCdzIHByb2Nlc3MgZ3JvdXAgKi8KKyNpZm5kZWYgX1BPU0lYX1NPVVJDRQorLyoKKyAgVGhlIGdldHBncnAoKSBwcm90b3R5cGUgaXMgb2J0YWluZWQgZnJvbSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGZvciBQT1NJWAorICBhbmQgU3lzIFYgUjQgY29tcGlsYXRpb25zLiAgT3RoZXIgc3lzdGVtcywgd2hvIGtub3dzLiAgU29tZSBjb21wbGFpbiBhYm91dAorICBhIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBoZXJlLCBvdGhlcnMgZG9uJ3QsIHNvIGl0J3Mgc2FmZXIgdG8gbGVhdmUgaXQgaW4KKyAgaWYgd2UgZG9uJ3Qga25vdyBmb3IgY2VydGFpbi4KKyovCisjaWZuZGVmIFNWUjQKKyNpZm5kZWYgUFMyQUlYMTAKKyNpZm5kZWYgSFBVWDkKKyAgICBleHRlcm4gUElEX1QgZ2V0cGdycCgpOworI2VuZGlmIC8qIEhQVVg5ICovCisjZW5kaWYgLyogUFMyQUlYMTAgKi8KKyNlbmRpZiAvKiBTVlI0ICovCisjZW5kaWYgLyogX1BPU0lYX1NPVVJDRSAqLworCisvKiBHZXQgbXkgcHJvY2VzcyBncm91cC4gKi8KKworI2lmZGVmIFNWUjMgLyogTWF5YmUgdGhpcyBzaG91bGQgYmUgQVRUU1Y/ICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBkZXNjcmliZWQgaW4gU1ZJRCBSMiAqLworICAgIG15cGdycCA9IGdldHBncnAoKTsKKyAgICAvKiBkZWJ1ZyhGMTAxLCJBVFRTViBjb25iZ3QgcHJvY2VzcyBncm91cCIsIiIsKGludCkgbXlwZ3JwKTsgKi8KKyNlbHNlCisjaWZkZWYgUE9TSVgKKyAgICBteXBncnAgPSBnZXRwZ3JwKCk7CisgICAgLyogZGVidWcoRjEwMSwiUE9TSVggY29uYmd0IHByb2Nlc3MgZ3JvdXAiLCIiLChpbnQpIG15cGdycCk7ICovCisjZWxzZQorI2lmZGVmIE9TRlBDCisgICAgbXlwZ3JwID0gZ2V0cGdycCgpOworICAgIC8qIGRlYnVnKEYxMDEsIk9TRiBjb25iZ3QgcHJvY2VzcyBncm91cCIsIiIsKGludCkgbXlwZ3JwKTsgKi8KKyNlbHNlCisjaWZkZWYgUU5YCisgICAgbXlwZ3JwID0gZ2V0cGdycCgpOworICAgIC8qIGRlYnVnKEYxMDEsIlFOWCBjb25iZ3QgcHJvY2VzcyBncm91cCIsIiIsKGludCkgbXlwZ3JwKTsgKi8KKyNlbHNlCisjaWZkZWYgT1NGMzIJCQkJLyogKHdhcyBPU0Y0MCkgKi8KKyAgICBteXBncnAgPSBnZXRwZ3JwKCk7CisgICAgLyogZGVidWcoRjEwMSwiRGlnaXRhbCBVTklYIGNvbmJndCBwcm9jZXNzIGdyb3VwIiwiIiwoaW50KSBteXBncnApOyAqLworI2Vsc2UgLyogQlNELCBWNywgZXRjICovCisjaWZkZWYgTUlOSVgyCisgICAgbXlwZ3JwID0gZ2V0cGdycCgpOworI2Vsc2UKKyAgICBteXBncnAgPSBnZXRwZ3JwKDApOworI2VuZGlmIC8qIE1JTklYMiAqLworICAgIC8qIGRlYnVnKEYxMDEsIkJTRCBjb25iZ3QgcHJvY2VzcyBncm91cCIsIiIsKGludCkgbXlwZ3JwKTsgKi8KKyNlbmRpZiAvKiBPU0YzMiAqLworI2VuZGlmIC8qIFFOWCAqLworI2VuZGlmIC8qIE9TRlBDICovCisjZW5kaWYgLyogUE9TSVggKi8KKyNlbmRpZiAvKiBTVlIzICovCisKKyNpZmRlZiBNSU5JWDIKKyN1bmRlZiBCU0Q0NE9SUE9TSVgKKyNlbmRpZiAvKiBNSU5JWDIgKi8KKworLyogTm93IGdldCBjb250cm9sbGluZyB0dHkncyBwcm9jZXNzIGdyb3VwICovCisjaWZkZWYgQlNENDRPUlBPU0lYCisgICAgY3RwZ3JwID0gdGNnZXRwZ3JwKDEpOwkJLyogVGhlIFBPU0lYIHdheSAqLworICAgIC8qIGRlYnVnKEYxMDEsIlBPU0lYIGNvbmJndCB0ZXJtaW5hbCBwcm9jZXNzIGdyb3VwIiwiIiwoaW50KSBjdHBncnApOyAqLworI2Vsc2UKKyAgICBpb2N0bCgxLCBUSU9DR1BHUlAsICZjdHBncnApOwkvKiBPciB0aGUgQlNEIHdheSAqLworICAgLyogZGVidWcoRjEwMSwibm9uLVBPU0lYIGNvbmJndCB0ZXJtaW5hbCBwcm9jZXNzIGdyb3VwIiwiIiwoaW50KSBjdHBncnApOyAqLworI2VuZGlmIC8qIEJTRDQ0T1JQT1NJWCAqLworCisjaWZkZWYgTUlOSVgyCisjZGVmaW5lIEJTRDQ0T1JQT1NJWAorI2VuZGlmIC8qIE1JTklYMiAqLworCisgICAgaWYgKChteXBncnAgPiAoUElEX1QpIDApICYmIChjdHBncnAgPiAoUElEX1QpIDApKQorICAgICAgeCA9IChteXBncnAgPT0gY3RwZ3JwKSA/IDAgOiAxOwkvKiBJZiB0aGV5IGRpZmZlciwgdGhlbiBiYWNrZ3JvdW5kLiAqLworICAgIGVsc2UgeCA9IC0xOwkJCS8qIElmIGVycm9yLCByZW1lbWJlci4gKi8KKyAgICBkZWJ1ZyhGMTAxLCJjb25iZ3QgcHJvY2VzcyBncm91cCB0ZXN0IiwiIix4KTsKKyNlbmRpZiAvKiBQR1JPVVBfVCAqLworCisvKiBUcnkgdG8gc2VlIGlmIGpvYiBjb250cm9sIGlzIGF2YWlsYWJsZSAqLworCisjaWZkZWYgTk9KQwkJCQkvKiBVc2VyIG92ZXJyaWRlICovCisgICAgamMgPSAwOwkJCQkvKiBObyBqb2IgY29udHJvbCBhbGxvd2VkICovCisgICAgZGVidWcoRjExMSwiTk9KQyIsImpjIixqYyk7CisjZWxzZQorI2lmZGVmIEJTRDQ0CisgICAgamMgPSAxOworI2Vsc2UKKyNpZmRlZiBTVlI0T1JQT1NJWAkJCS8qIFBPU0lYIGFjdHVhbGx5IHRlbGxzIHVzICovCisgICAgZGVidWcoRjEwMCwiU1ZSNE9SUE9TSVggamMgdGVzdC4uLiIsIiIsMCk7CisjaWZkZWYgX1NDX0pPQl9DT05UUk9MCisjaWZkZWYgX19ic2RpX18KKyAgICBqYyA9IDE7CisjZWxzZQorI2lmZGVmIF9fMzg2QlNEX18KKyAgICBqYyA9IDE7CisjZWxzZQorICAgIGpjID0gc3lzY29uZihfU0NfSk9CX0NPTlRST0wpOwkvKiBXaGF0ZXZlciBzeXN0ZW0gc2F5cyAqLworICAgIGlmIChqYyA8IDApIHsKKwlkZWJ1ZyhGMTAxLCJzeXNjb25mIGZhaWxzLCBqY3NoZWxsIiwiIixqY3NoZWxsKTsKKwlqYyA9IChqY2hkbHIgPT0gU0lHX0RGTCkgPyAxIDogMDsKKyAgICB9IGVsc2UKKyAgICAgIGRlYnVnKEYxMTEsInN5c2NvbmYoX1NDX0pPQl9DT05UUk9MKSIsImpjIixqYyk7CisjZW5kaWYgLyogX18zODZCU0RfXyAqLworI2VuZGlmIC8qIF9fYnNkaV9fICovCisjZWxzZQorI2lmZGVmIF9QT1NJWF9KT0JfQ09OVFJPTAorICAgIGpjID0gMTsJCQkJLyogQnkgZGVmaW5pdGlvbiAqLworICAgIGRlYnVnKEYxMTEsIl9QT1NJWF9KT0JfQ09OVFJPTCBpcyBkZWZpbmVkIiwiamMiLGpjKTsKKyNlbHNlCisgICAgamMgPSAwOwkJCQkvKiBBc3N1bWUgam9iIGNvbnRyb2wgbm90IGFsbG93ZWQgKi8KKyAgICBkZWJ1ZyhGMTExLCJTVlI0T1JQT1NJWCBfU0MvUE9TSVhfSk9CX0NPTlRST0wgbm90IGRlZmluZWQiLCJqYyIsamMpOworI2VuZGlmIC8qIF9QT1NJWF9KT0JfQ09OVFJPTCAqLworI2VuZGlmIC8qIF9TQ19KT0JfQ09OVFJPTCAqLworI2Vsc2UKKyNpZmRlZiBCU0Q0CisgICAgamMgPSAxOwkJCQkvKiBKb2IgY29udHJvbCBhbGxvd2VkICovCisgICAgZGVidWcoRjExMSwiQlNEIGpvYiBjb250cm9sIiwiamMiLGpjKTsKKyNlbHNlCisjaWZkZWYgU1ZSM0pDCisgICAgamMgPSAxOwkJCQkvKiBKQyBhbGxvd2VkICovCisgICAgZGVidWcoRjExMSwiU1ZSMyBqb2IgY29udHJvbCIsImpjIixqYyk7CisjZWxzZQorI2lmZGVmIE9YT1MKKyAgICBqYyA9IDE7CQkJCS8qIEpDIGFsbG93ZWQgKi8KKyAgICBkZWJ1ZyhGMTExLCJYL09TIGpvYiBjb250cm9sIiwiamMiLGpjKTsKKyNlbHNlCisjaWZkZWYgSFBVWDkKKyAgICBqYyA9IDE7CQkJCS8qIEpDIGFsbG93ZWQgKi8KKyAgICBkZWJ1ZyhGMTExLCJIUC1VWCA5LjAgam9iIGNvbnRyb2wiLCJqYyIsamMpOworI2Vsc2UKKyNpZmRlZiBIUFVYMTAKKyAgICBqYyA9IDE7CQkJCS8qIEpDIGFsbG93ZWQgKi8KKyAgICBkZWJ1ZyhGMTExLCJIUC1VWCAxMC4wIGpvYiBjb250cm9sIiwiamMiLGpjKTsKKyNlbHNlCisgICAgamMgPSAwOwkJCQkvKiBKQyBub3QgYWxsb3dlZCAqLworICAgIGRlYnVnKEYxMTEsImpvYiBjb250cm9sIGNhdGNoLWFsbCIsImpjIixqYyk7CisjZW5kaWYgLyogSFBVWDEwICovCisjZW5kaWYgLyogSFBVWDkgKi8KKyNlbmRpZiAvKiBPWE9TICovCisjZW5kaWYgLyogU1ZSM0pDICovCisjZW5kaWYgLyogQlNENCAqLworI2VuZGlmIC8qIFNWUjRPUlBPU0lYICovCisjZW5kaWYgLyogQlNENDQgKi8KKyNlbmRpZiAvKiBOT0pDICovCisgICAgZGVidWcoRjEwMSwiY29uYmd0IGpjIiwiIixqYyk7CisjaWZuZGVmIE5PSkMKKyAgICBkZWJ1ZyhGMTAxLCJjb25iZ3QgamNzaGVsbCIsIiIsamNzaGVsbCk7CisvKgorICBBdCB0aGlzIHBvaW50LCBpZiBqYyA9PSAxIGJ1dCBqY3NoZWxsID09IDAsIGl0IG1lYW5zIHRoYXQgdGhlIE9TIHN1cHBvcnRzCisgIGpvYiBjb250cm9sLCBidXQgdGhlIHNoZWxsIG9yIG90aGVyIHByb2Nlc3Mgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgZG9lcyBub3QKKyAgKGpjc2hlbGwgaXMgc2V0IGluIHN5c2luaXQoKSkgYW5kIHNvIGlmIHdlIHN1c3BlbmQgb3Vyc2VsdmVzLCBub3RoaW5nIGdvb2QKKyAgd2lsbCBjb21lIG9mIGl0LiAgU28uLi4KKyovCisgICAgaWYgKGpjIDwgMCkgamMgPSAwOworICAgIGlmIChqYyA+IDAgJiYgamNzaGVsbCA9PSAwKSBqYyA9IDA7CisjZW5kaWYgLyogTk9KQyAqLworCisvKgorICBBbm90aGVyIGJhY2tncm91bmQgdGVzdC4KKyAgVGVzdCBpZiBTSUdJTlQgKHRlcm1pbmFsIGludGVycnVwdCkgaXMgc2V0IHRvIFNJR19JR04gKGlnbm9yZSksCisgIHdoaWNoIGlzIGRvbmUgYnkgdGhlIHNoZWxsIChzaCkgaWYgdGhlIHByb2dyYW0gaXMgc3RhcnRlZCB3aXRoICcmJy4KKyAgVW5mb3J0dW5hdGVseSwgdGhpcyBpcyBOT1QgZG9uZSBieSBjc2ggb3Iga3NoIHNvIHdhdGNoIG91dCEKKyAgTm90ZSwgaXQncyBzYWZlIHRvIHNldCBTSUdJTlQgdG8gU0lHX0lHTiBoZXJlLCBiZWNhdXNlIGZ1cnRoZXIgZG93bgorICB3ZSBhbHdheXMgc2V0IGl0IHRvIHNvbWV0aGluZyBlbHNlLgorICBOb3RlOiBhcyBvZiAxNiBKdWwgMTk5OSwgd2UgYWxzbyBza2lwIHRoaXMgdGVzdCBpZiB3ZSBzZXQgU0lHSU5UIHRvCisgIFNJR19JR04gb3Vyc2VsdmVzLgorKi8KKyAgICBpZiAoeCA8IDAgJiYgIWZsYWcgJiYgIXNpZ2ludF9pZ24pIHsgLyogRGlkbid0IGdldCBnb29kIHJlc3VsdHMgYWJvdmUuLi4gKi8KKworCVNJR1RZUCAoKm9zaWdpbnQpKCk7CisKKwlvc2lnaW50ID0gc2lnbmFsKFNJR0lOVCxTSUdfSUdOKTsJLyogV2hhdCBpcyBTSUdJTlQgc2V0IHRvPyAqLworCXNpZ2ludF9pZ24gPSAxOworCXggPSAob3NpZ2ludCA9PSBTSUdfSUdOKSA/IDEgOiAwOwkvKiBTSUdfSUdOPyAqLworCWRlYnVnKEYxMDEsImNvbmJndCBvc2lnaW50IiwiIixvc2lnaW50KTsKKwlkZWJ1ZyhGMTAxLCJjb25iZ3Qgc2lnbmFsIHRlc3QiLCIiLHgpOworICAgIH0KKworLyogQWxzbyBjaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB3aXRoIHJlZGlyZWN0ZWQgc3RkaW8uICovCisvKiBUaGlzIGlzIG5vdCByZWFsbHkgYmFja2dyb3VuZCBvcGVyYXRpb24sIGJ1dCB3ZSB3YW50IHRvIGFjdCBhcyB0aG91Z2ggKi8KKy8qIGl0IHdlcmUuICovCisKKyNpZmRlZiBJS1NECisgICAgaWYgKGluc2VydmVyKSB7CQkJLyogSW50ZXJuZXQgS2VybWl0IFNlcnZlciAqLworCWJhY2tncmQgPSAwOwkJCS8qIGlzIG5vdCBpbiB0aGUgYmFja2dyb3VuZCAqLworCXJldHVybjsKKyAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgeSA9IChpc2F0dHkoMCkgJiYgaXNhdHR5KDEpKSA/IDEgOiAwOworICAgIGRlYnVnKEYxMDEsImNvbmJndCBpc2F0dHkgdGVzdCIsIiIseSk7CisKKyNpZmRlZiBCU0QyOQorLyogVGhlIHByb2Nlc3MgZ3JvdXAgYW5kL29yIHNpZ25hbCB0ZXN0IGRvZXNuJ3Qgd29yayB1bmRlciB0aGVzZS4uLiAqLworICAgIGJhY2tncmQgPSAheTsKKyNlbHNlCisjaWZkZWYgc3hhRTUwCisgICAgYmFja2dyZCA9ICF5OworI2Vsc2UKKyNpZmRlZiBNSU5JWAorICAgIGJhY2tncmQgPSAheTsKKyNlbHNlCisjaWZkZWYgTUlOSVgyCisgICAgYmFja2dyZCA9ICF5OworI2Vsc2UKKyAgICBpZiAoeCA+IC0xKQorICAgICAgYmFja2dyZCA9ICh4IHx8ICF5KSA/IDEgOiAwOworICAgIGVsc2UgYmFja2dyZCA9ICF5OworI2VuZGlmIC8qIEJTRDI5ICovCisjZW5kaWYgLyogc3hhRTUwICovCisjZW5kaWYgLyogTUlOSVggKi8KKyNlbmRpZiAvKiBNSU5JWDIgKi8KKyAgICBkZWJ1ZyhGMTAxLCJjb25iZ3QgYmFja2dyZCIsIiIsYmFja2dyZCk7Cit9CisKKy8qICBDIE8gTiBJIE4gVCAgLS0gIENvbnNvbGUgSW50ZXJydXB0IHNldHRlciAgKi8KKworLyoKKyAgRmlyc3QgYXJnIGlzIHBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gaGFuZGxlIFNJR1RFUk0gJiBTSUdJTlQgKGxpa2UgQ3RybC1DKS4KKyAgU2Vjb25kIGFyZyBpcyBwb2ludGVyIHRvIGZ1bmN0aW9uIHRvIGhhbmRsZSBTSUdUU1RQIChzdXNwZW5kKS4KKyovCisKK1ZPSUQJCQkJCS8qIFNldCB0ZXJtaW5hbCBpbnRlcnJ1cHQgdHJhcHMuICovCisjaWZkZWYgQ0tfQU5TSUMKKyNpZmRlZiBhcG9sbG8KK2NvbmludChmLHMpIFNJR1RZUCAoKmYpKCksICgqcykoKTsKKyNlbHNlCitjb25pbnQoU0lHVFlQICgqZikoaW50KSwgU0lHVFlQICgqcykoaW50KSkKKyNlbmRpZiAvKiBhcG9sbG8gKi8KKyNlbHNlCitjb25pbnQoZixzKSBTSUdUWVAgKCpmKSgpLCAoKnMpKCk7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGNvbmludCAqLyB7CisKKyAgICBkZWJ1ZyhGMTAxLCJjb25pbnQgY29uaXN0YXRlIiwiIixjb25pc3RhdGUpOworCisgICAgY29uYmd0KDApOwkJCQkvKiBEbyBiYWNrZ3JvdW5kIHRlc3QuICovCisKKy8qIFNldCB0aGUgZGVzaXJlZCBoYW5kbGVycyBmb3IgaGFuZ3VwIGFuZCBzb2Z0d2FyZSB0ZXJtaW5hdGlvbi4gKi8KKworI2lmZGVmIFNJR1RFUk0KKyAgICBzaWduYWwoU0lHVEVSTSxmKTsgICAgICAgICAgICAgICAgICAvKiBTb2Z0d2FyZSB0ZXJtaW5hdGlvbiAqLworI2VuZGlmIC8qIFNJR1RFUk0gKi8KKworLyoKKyAgUHJpb3IgdG8gSnVseSAxOTk5IHdlIHVzZWQgdG8gY2FsbCBzaWdodXAoKSBoZXJlIGJ1dCBub3cgaXQncyBjYWxsZWQgaW4KKyAgc3lzaW5pdCgpIHNvIFNJR0hVUCBjYW4gYmUgY2F1Z2h0IGR1cmluZyBleGVjdXRpb24gb2YgdGhlIGluaXQgZmlsZSBvcgorICBhIGtlcmJhbmcgc2NyaXB0LgorKi8KKworLyogTm93IGhhbmRsZSBrZXlib2FyZCBzdG9wLCBxdWl0LCBhbmQgaW50ZXJydXB0IHNpZ25hbHMuICovCisvKiBDaGVjayBpZiBpbnZva2VkIGluIGJhY2tncm91bmQgLS0gaWYgc28gc2lnbmFscyBzZXQgdG8gYmUgaWdub3JlZC4gKi8KKy8qIEhvd2V2ZXIsIGlmIHJ1bm5pbmcgdW5kZXIgYSBqb2IgY29udHJvbCBzaGVsbCwgZG9uJ3QgaWdub3JlIHRoZW0uICovCisvKiBXZSB3b24ndCBiZSBnZXR0aW5nIGFueSwgYXMgd2UgYXJlbid0IGluIHRoZSB0ZXJtaW5hbCdzIHByb2Nlc3MgZ3JvdXAuICovCisKKyAgICBkZWJ1ZyhGMTAxLCJjb25pbnQgYmFja2dyZCIsIiIsYmFja2dyZCk7CisgICAgZGVidWcoRjEwMSwiY29uaW50IGpjIiwiIixqYyk7CisKKyAgICBpZiAoYmFja2dyZCAmJiAhamMpIHsJCS8qIEluIGJhY2tncm91bmQsIGlnbm9yZSBzaWduYWxzICovCisJZGVidWcoRjEwMSwiY29uaW50IGJhY2tncm91bmQgaWdub3Jpbmcgc2lnbmFscywgamMiLCIiLGpjKTsKKyNpZmRlZiBTSUdUU1RQCisgICAgICAgIHNpZ25hbChTSUdUU1RQLFNJR19JR04pOyAgICAgICAgLyogS2V5Ym9hcmQgc3RvcCAqLworI2VuZGlmIC8qIFNJR1RTVFAgKi8KKyAgICAgICAgc2lnbmFsKFNJR1FVSVQsU0lHX0lHTik7ICAgICAgICAvKiBLZXlib2FyZCBxdWl0ICovCisgICAgICAgIHNpZ25hbChTSUdJTlQsU0lHX0lHTik7ICAgICAgICAgLyogS2V5Ym9hcmQgaW50ZXJydXB0ICovCisJc2lnaW50X2lnbiA9IDE7CisJY29uaXN0YXRlID0gQ09OSV9OT0k7CisgICAgfSBlbHNlIHsJCQkJLyogRWxzZSBpbiBmb3JlZ3JvdW5kIG9yIHN1c3BlbmRlZCAqLworCWRlYnVnKEYxMDEsImNvbmludCBmb3JlZ3JvdW5kIGNhdGNoaW5nIHNpZ25hbHMsIGpjIiwiIixqYyk7CisgICAgICAgIHNpZ25hbChTSUdJTlQsZik7ICAgICAgICAgICAgICAgLyogQ2F0Y2ggdGVybWluYWwgaW50ZXJydXB0ICovCisJc2lnaW50X2lnbiA9IChmID09IFNJR19JR04pID8gMSA6IDA7CisKKyNpZmRlZiBTSUdUU1RQCQkJCS8qIEtleWJvYXJkIHN0b3AgKHN1c3BlbmQpICovCisJLyogZGVidWcoRjEwMSwiY29uaW50IFNJR1NUU1RQIiwiIixzKTsgKi8KKwlpZiAocyA9PSBOVUxMKSBzID0gU0lHX0RGTDsKKyNpZmRlZiBOT0pDCQkJCS8qIE5vIGpvYiBjb250cm9sIGFsbG93ZWQuICovCisJc2lnbmFsKFNJR1RTVFAsU0lHX0lHTik7CisjZWxzZQkJCQkJLyogSm9iIGNvbnRyb2wgYWxsb3dlZCAqLworCWlmIChqYykJCQkJLyogaWYgYXZhaWxhYmxlLiAqLworCSAgc2lnbmFsKFNJR1RTVFAscyk7CisJZWxzZQorCSAgc2lnbmFsKFNJR1RTVFAsU0lHX0lHTik7CisjZW5kaWYgLyogTk9KQyAqLworI2VuZGlmIC8qIFNJR1RTVFAgKi8KKworI2lmbmRlZiBPWE9TCisjaWZkZWYgU1ZPUlBPU0lYCisjaWZuZGVmIEZJT05SRUFECQkJLyogV2F0Y2ggb3V0LCB3ZSBkb24ndCBrbm93IHRoaXMuLi4gKi8KKyNpZm5kZWYgU0VMRUNUCisjaWZuZGVmIENLX1BPTEwKKyNpZm5kZWYgUkRDSEsKKyAgICAgICAgc2lnbmFsKFNJR1FVSVQsZXNjdHJwKTsgICAgICAgICAvKiBRdWl0IHNpZ25hbCwgU3lzIElJSS9WLiAqLworI2VuZGlmIC8qIFJEQ0hLICovCisjZW5kaWYgLyogQ0tfUE9MTCAqLworI2VuZGlmIC8qIFNFTEVDVCAqLworI2VuZGlmIC8qIEZJT05SRUFEICovCisgICAgICAgIGlmIChjb25lc2MpIGNvbmVzYyA9IDA7ICAgICAgICAgLyogQ2xlYXIgb3V0IHBlbmRpbmcgZXNjYXBlcyAqLworI2Vsc2UKKyNpZmRlZiBWNworICAgICAgICBzaWduYWwoU0lHUVVJVCxlc2N0cnApOyAgICAgICAgIC8qIFY3IGxpa2UgU3lzIElJSS9WICovCisgICAgICAgIGlmIChjb25lc2MpIGNvbmVzYyA9IDA7CisjZWxzZQorI2lmZGVmIGFlZ2lzCisgICAgICAgIHNpZ25hbChTSUdRVUlULGYpOyAgICAgICAgICAgICAgLyogQXBvbGxvLCBjYXRjaCBpdCBsaWtlIG90aGVycy4gKi8KKyNlbHNlCisgICAgICAgIHNpZ25hbChTSUdRVUlULFNJR19JR04pOyAgICAgICAgLyogT3RoZXJzLCBpZ25vcmUgbGlrZSA0RCAmIGVhcmxpZXIuICovCisjZW5kaWYgLyogYWVnaXMgKi8KKyNlbmRpZiAvKiBWNyAqLworI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworI2VuZGlmIC8qIE9YT1MgKi8KKwljb25pc3RhdGUgPSBDT05JX0lOVDsKKyAgICB9Cit9CisKKworLyogIEMgTyBOIE4gTyBJICAtLSAgUmVzZXQgY29uc29sZSB0ZXJtaW5hbCBpbnRlcnJ1cHRzICovCisKK1ZPSUQKK2Nvbm5vaSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb25zb2xlLW5vLWludGVycnVwdHMgKi8KKworICAgIGRlYnVnKEYxMDEsImNvbm5vaSBjb25pc3RhdGUiLCIiLGNvbmlzdGF0ZSk7CisjaWZkZWYgU0lHVFNUUAorICAgIHNpZ25hbChTSUdUU1RQLFNJR19JR04pOwkJLyogU3VzcGVuZCAqLworI2VuZGlmIC8qIFNJR1RTVFAgKi8KKyAgICBjb25pbnQoU0lHX0lHTixTSUdfSUdOKTsJCS8qIEludGVycnVwdCAqLworICAgIHNpZ2ludF9pZ24gPSAxOwkJCS8qIFJlbWVtYmVyIHdlIGRpZCB0aGlzIG91cnNlbHZlcyAqLworI2lmZGVmIFNJR1FVSVQKKyAgICBzaWduYWwoU0lHUVVJVCxTSUdfSUdOKTsJCS8qIFF1aXQgKi8KKyNlbmRpZiAvKiBTSUdRVUlUICovCisjaWZkZWYgU0lHVEVSTQorICAgIHNpZ25hbChTSUdURVJNLFNJR19JR04pOwkJLyogVGVybSAqLworI2VuZGlmIC8qIFNJR1RFUk0gKi8KKyAgICBjb25pc3RhdGUgPSBDT05JX05PSTsKK30KKworLyogIEkgTiBJIFQgUiBBIFcgUSAgLS0gIFNldCB1cCB0byByZWFkIC9kZXYva21lbSBmb3IgY2hhcmFjdGVyIGNvdW50LiAgKi8KKworI2lmZGVmICBWNworLyoKKyBVc2VkIGluIFZlcnNpb24gNyB0byBzaW11bGF0ZSBCZXJrZWxleSdzIEZJT05SRUFEIGlvY3RsIGNhbGwuICBUaGlzCisgZWxpbWluYXRlcyBibG9ja2luZyBvbiBhIHJlYWQsIGJlY2F1c2Ugd2UgY2FuIHJlYWQgL2Rldi9rbWVtIHRvIGdldCB0aGUKKyBudW1iZXIgb2YgY2hhcmFjdGVycyBhdmFpbGFibGUgZm9yIHJhdyBpbnB1dC4gIElmIHlvdXIgc3lzdGVtIGNhbid0Cisgb3IgeW91IHdvbid0IGxldCB0aGUgd29ybGQgcmVhZCAvZGV2L2ttZW0gdGhlbiB5b3UgbXVzdCBmaWd1cmUgb3V0IGEKKyBkaWZmZXJlbnQgd2F5IHRvIGRvIHRoZSBjb3VudGluZyBvZiBjaGFyYWN0ZXJzIGF2YWlsYWJsZSwgb3IgZWxzZSByZXBsYWNlCisgdGhpcyBieSBhIGR1bW15IGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgMC4KKyovCisvKgorICogQ2FsbCB0aGlzIHJvdXRpbmUgYXM6IGluaXRyYXdxKHR0eSkKKyAqIHdoZXJlIHR0eSBpcyB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIGEgdGVybWluYWwuICBJdCB3aWxsIHJldHVybgorICogKGFzIGEgY2hhciAqKSB0aGUga2VybmVsLW1vZGUgbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIHJhd3EgY2hhcmFjdGVyCisgKiBjb3VudCwgd2hpY2ggbWF5IHRoZW4gYmUgcmVhZC4gIEl0IGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2YgZmx1c2hpbmcKKyAqIGlucHV0IG9uIHRoZSB0ZXJtaW5hbC4KKyAqLworLyoKKyAqIEpvaG4gTWFja2luLCBQaHlzaW9sb2d5IERlcHQuLCBVbml2ZXJzaXR5IG9mIFN5ZG5leSAoQXVzdHJhbGlhKQorICogLi4uIWRlY3ZheCFtdWxnYSFwaHlzaW9sLnN1Lm96IWpvaG4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGRvIGFueXRoaW5nIHdpdGggdGhpcyBjb2RlLCBhcworICogbG9uZyBhcyB0aGlzIGNvbW1lbnQgaXMgcmV0YWluZWQgdW5tb2RpZmllZCBhbmQgbm8gY29tbWVyY2lhbAorICogYWR2YW50YWdlIGlzIGdhaW5lZC4KKyAqLworI2lmbmRlZiBNSU5JWAorI2lmbmRlZiBNSU5JWDIKKyNpZm5kZWYgQ09IRVJFTlQKKyNpbmNsdWRlIDxhLm91dC5oPgorI2luY2x1ZGUgPHN5cy9wcm9jLmg+CisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBNSU5JWDIgKi8KKyNlbmRpZiAvKiBNSU5JWCAqLworCisjaWZkZWYgQ09IRVJFTlQKKyNpbmNsdWRlIDxsLm91dC5oPgorI2luY2x1ZGUgPHN5cy9wcm9jLmg+CisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKworY2hhciAqCitpbml0cmF3cSh0dHkpIGludCB0dHk7IHsKKyNpZmRlZiBNSU5JWAorICAgIHJldHVybigwKTsKKyNlbHNlCisjaWZkZWYgTUlOSVgyCisgICAgcmV0dXJuKDApOworI2Vsc2UKKyNpZmRlZiBVVFMyNAorICAgIHJldHVybigwKTsKKyNlbHNlCisjaWZkZWYgQlNEMjkKKyAgICByZXR1cm4oMCk7CisjZWxzZQorICAgIGxvbmcgbHNlZWsoKTsKKyAgICBzdGF0aWMgc3RydWN0IG5saXN0IG5sW10gPSB7CisgICAgICAgIHtQUk9DTkFNRX0sCisgICAgICAgIHtOUFJPQ05BTUV9LAorICAgICAgICB7IiJ9CisgICAgfTsKKyAgICBzdGF0aWMgc3RydWN0IHByb2MgKnBwOworICAgIGNoYXIgKnFhZGRyLCAqcCwgYzsKKyAgICBpbnQgbTsKKyAgICBQSURfVCBwaWQsIG1lOworICAgIE5QVFlQRSB4cHJvYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0cyB0eXBlIGlzIGRlZmluZWQgaW4gbWFrZWZpbGUuICovCisgICAgaW50IGNhdGNoKCk7CisKKyAgICBtZSA9IGdldHBpZCgpOworICAgIGlmICgobSA9IG9wZW4oIi9kZXYva21lbSIsIDApKSA8IDApIGVycigia21lbSIpOworICAgIG5saXN0KEJPT1ROQU1FLCBubCk7CisgICAgaWYgKG5sWzBdLm5fdHlwZSA9PSAwKSBlcnIoInByb2MgYXJyYXkiKTsKKworICAgIGlmIChubFsxXS5uX3R5cGUgPT0gMCkgZXJyKCJucHJvYyIpOworCisgICAgbHNlZWsobSwgKGxvbmcpKG5sWzFdLm5fdmFsdWUpLCAwKTsKKyAgICByZWFkIChtLCAmeHByb2MsIHNpemVvZih4cHJvYykpOworICAgIHNhdmFsID0gc2lnbmFsKFNJR0FMUk0sIGNhdGNoKTsKKyAgICBpZiAoKHBpZCA9IGZvcmsoKSkgPT0gMCkgeworICAgICAgICB3aGlsZSgxKQorICAgICAgICAgICAgcmVhZCh0dHksICZjLCAxKTsKKyAgICB9CisgICAgYWxhcm0oMik7CisKKyAgICBpZihzZXRqbXAoampidWYpID09IDApIHsKKyAgICAgICAgd2hpbGUoMSkKKwkgIHJlYWQodHR5LCAmYywgMSk7CisgICAgfQorICAgIHNpZ25hbChTSUdBTFJNLCBTSUdfREZMKTsKKworI2lmZGVmIERJUkVDVAorICAgIHBwID0gKHN0cnVjdCBwcm9jICopIG5sWzBdLm5fdmFsdWU7CisjZWxzZQorICAgIGlmIChsc2VlayhtLCAobG9uZykobmxbMF0ubl92YWx1ZSksIDApIDwgMEwpIGVycigic2VlayIpOworICAgIGlmIChyZWFkKG0sICZwcCwgc2l6ZW9mKHBwKSkgIT0gc2l6ZW9mKHBwKSkgIGVycigibm8gcmVhZCBvZiBwcm9jIHB0ciIpOworI2VuZGlmCisgICAgbHNlZWsobSwgKGxvbmcpKG5sWzFdLm5fdmFsdWUpLCAwKTsKKyAgICByZWFkKG0sICZ4cHJvYywgc2l6ZW9mKHhwcm9jKSk7CisKKyAgICBpZiAobHNlZWsobSwgKGxvbmcpcHAsIDApIDwgMEwpIGVycigiQ2FuJ3Qgc2VlayB0byBwcm9jIik7CisgICAgaWYgKChwID0gbWFsbG9jKHhwcm9jICogc2l6ZW9mKHN0cnVjdCBwcm9jKSkpID09IE5VTEwpIGVycigibWFsbG9jIik7CisgICAgaWYgKHJlYWQobSxwLHhwcm9jICogc2l6ZW9mKHN0cnVjdCBwcm9jKSkgIT0geHByb2Mqc2l6ZW9mKHN0cnVjdCBwcm9jKSkKKyAgICAgICAgZXJyKCJyZWFkIHByb2MgdGFibGUiKTsKKyAgICBmb3IgKHBwID0gKHN0cnVjdCBwcm9jICopcDsgeHByb2MgPiAwOyAtLXhwcm9jLCArK3BwKSB7CisgICAgICAgIGlmIChwcCAtPiBwX3BpZCA9PSAoc2hvcnQpIHBpZCkgZ290byBpb3V0OworICAgIH0KKyAgICBlcnIoIm5vIHN1Y2ggcHJvYyIpOworCitpb3V0OgorICAgIGNsb3NlKG0pOworICAgIHFhZGRyID0gKGNoYXIgKikocHAgLT4gcF93Y2hhbik7CisgICAgZnJlZSAocCk7CisgICAga2lsbChwaWQsIFNJR0tJTEwpOworICAgIHdhaXQoKFdBSVRfVCAqKTApOworICAgIHJldHVybiAocWFkZHIpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCit9CisKKy8qICBNb3JlIFY3LXN1cHBvcnQgZnVuY3Rpb25zLi4uICAqLworCitzdGF0aWMgVk9JRAorZXJyKHMpIGNoYXIgKnM7IHsKKyAgICBjaGFyIGJ1ZlsyMDBdOworCisgICAgY2ttYWttc2coYnVmLDIwMCwiZmF0YWwgZXJyb3IgaW4gaW5pdHJhd3E6ICIsIHMsIE5VTEwsIE5VTEwpOworICAgIHBlcnJvcihidWYpOworICAgIGRvZXhpdCgxLC0xKTsKK30KKworc3RhdGljIFZPSUQKK2NhdGNoKGZvbykgaW50IGZvbzsgeworICAgIGxvbmdqbXAoampidWYsIC0xKTsKK30KKworCisvKiAgRyBFIE4gQiBSIEsgIC0tICBTaW11bGF0ZSBhIG1vZGVtIGJyZWFrLiAgKi8KKworI2lmZGVmIE1JTklYCisjZGVmaW5lIEJTUEVFRCBCMTEwCisjZWxzZQorI2lmZGVmIE1JTklYMgorI2RlZmluZSBCU1BFRUQgQjExMAorI2Vsc2UKKyNkZWZpbmUgQlNQRUVEIEIxNTAKKyNlbmRpZiAvKiBNSU5JWDIgKi8KKyNlbmRpZiAvKiBNSU5JWCAqLworCisjaWZuZGVmIE1JTklYMgorVk9JRAorZ2VuYnJrKGZuLG1zZWMpIGludCBmbiwgbXNlYzsgeworICAgIHN0cnVjdCBzZ3R0eWIgdHRidWY7CisgICAgaW50IHJldCwgc29zcGVlZCwgeCwgeTsKKworICAgIHJldCA9IGlvY3RsKGZuLCBUSU9DR0VUUCwgJnR0YnVmKTsKKyAgICBzb3NwZWVkID0gdHRidWYuc2dfb3NwZWVkOworICAgIHR0YnVmLnNnX29zcGVlZCA9IEJTUEVFRDsKKyAgICByZXQgPSBpb2N0bChmbiwgVElPQ1NFVFAsICZ0dGJ1Zik7CisgICAgeSA9IChpbnQpc3RybGVuKGJybnVscyk7CisgICAgeCA9ICggQlNQRUVEICogMTAwICkgLyBtc2VjOworICAgIGlmICh4ID4geSkgeCA9IHk7CisgICAgcmV0ID0gd3JpdGUoZm4sIGJybnVscywgKCggQlNQRUVEICogMTAwICkgLyBtc2VjICkpOworICAgIHR0YnVmLnNnX29zcGVlZCA9IHNvc3BlZWQ7CisgICAgcmV0ID0gaW9jdGwoZm4sIFRJT0NTRVRQLCAmdHRidWYpOworICAgIHJldCA9IHdyaXRlKGZuLCAiQCIsIDEpOworICAgIHJldHVybjsKK30KKyNlbmRpZiAvKiBNSU5JWDIgKi8KKworI2lmZGVmIE1JTklYMgoraW50CitnZW5icmsoZm4sbXNlYykgaW50IGZuLCBtc2VjOyB7CisgICAgc3RydWN0IHRlcm1pb3MgdHRidWY7CisgICAgaW50IHJldCwgeCwgeTsKKyAgICBzcGVlZF90IHNvc3BlZWQ7CisKKyAgICByZXQgPSB0Y2dldGF0dHIoZm4sICZ0dGJ1Zik7CisgICAgc29zcGVlZCA9IHR0YnVmLmNfb3NwZWVkOworICAgIHR0YnVmLmNfb3NwZWVkID0gQlNQRUVEOworICAgIHJldCA9IHRjc2V0YXR0cihmbixUQ1NBRFJBSU4sICZ0dGJ1Zik7CisgICAgeSA9IChpbnQpc3RybGVuKGJybnVscyk7CisgICAgeCA9ICggQlNQRUVEICogMTAwICkgLyBtc2VjOworICAgIGlmICh4ID4geSkgeCA9IHk7CisgICAgcmV0ID0gd3JpdGUoZm4sIGJybnVscywgKCggQlNQRUVEICogMTAwICkgLyBtc2VjICkpOworICAgIHR0YnVmLmNfb3NwZWVkID0gc29zcGVlZDsKKyAgICByZXQgPSB0Y3NldGF0dHIoZm4sIFRDU0FEUkFJTiwgJnR0YnVmKTsKKyAgICByZXQgPSB3cml0ZShmbiwgIkAiLCAxKTsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIE1JTklYMiAqLworI2VuZGlmIC8qIFY3ICovCisKKy8qCisgIEkgTiBDIEggSyAgLS0gIENoZWNrIGlmIGNoYXJzIHdhaXRpbmcgdG8gYmUgcmVhZCBvbiBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuCisKKyAgVGhpcyByb3V0aW5lIGlzIGEgbWVyZ2VyIG9mIHR0Y2hrKCkgYW5kIGNvbmNoaygpLgorICBDYWxsIHdpdGg6CisgICAgY2hhbm5lbCA9PSAwIHRvIGNoZWNrIGNvbnNvbGUuCisgICAgY2hhbm5lbCA9PSAxIHRvIGNoZWNrIGNvbW11bmljYXRpb25zIGNvbm5lY3Rpb24uCisgIGFuZDoKKyAgICBmZCA9IGZpbGUgZGVzY3JpcHRvci4KKyAgUmV0dXJuczoKKyAgID49IDA6IG51bWJlciBvZiBjaGFyYWN0ZXJzIHdhaXRpbmcsIDAgb3IgZ3JlYXRlciwKKyAgICAgLTE6IG9uIGFueSBraW5kIG9mIGVycm9yLAorICAgICAtMjogaWYgdGhlcmUgaXMgKGRlZmluaXRlbHkpIG5vIGNvbm5lY3Rpb24uCisgIE5vdGU6IEluIFVOSVggd2UgZG9uJ3QgaGF2ZSB0byBjYWxsIG5ldHRjaGsoKSBiZWNhdXNlIGEgc29ja2V0CisgIGZpbGUgZGVzY3JpcHRvciB3b3JrcyBqdXN0IGxpa2UgaW4gc2VyaWFsIGkvbywgaW9jdGxzIGFuZCBhbGwuCisgIChCdXQgdGhpcyB3aWxsIGNoYW5nZSBpZiB3ZSBhZGQgbm9uLWZpbGUtZGVzY3JpcHRvciBjaGFubmVscywKKyAgc3VjaCBhcyBJQk0gWC4yNSBmb3IgQUlYLi4uKQorKi8KK3N0YXRpYyBpbnQKK2luX2NoayhjaGFubmVsLCBmZCkgaW50IGNoYW5uZWwsIGZkOyB7CisgICAgaW50IHgsIG4gPSAwOwkJCS8qIFdvcmtlcnMsIG4gPSByZXR1cm4gdmFsdWUgKi8KKyAgICBleHRlcm4gaW50IGNsc29uZGlzYzsJCS8qIENsb3NlIG9uIGRpc2Nvbm5lY3QgKi8KKy8qCisgIFRoZSBmaXJzdCBzZWN0aW9uIGNoZWNrcyB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhIGNvbm5lY3Rpb24sCisgIGJ1dCBvbmx5IGlmIHdlJ3JlIGluIGxvY2FsIG1vZGUuCisqLworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworCWRlYnVnKEYxMTEsImluX2NoayBlbnRyeSIsY2tpdG9hKGZkKSxjaGFubmVsKTsKKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgdHR5ZmQiLCIiLHR0eWZkKTsKKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgdHRwdHkiLCIiLHR0cHR5KTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKy8qCisgIEJ1dCBkb24ndCBzYXkgY29ubmVjdGlvbiBpcyBnb25lIGlmIHdlIGhhdmUgYW55IGJ1ZmZlcmVkLXN0dWZmLgorKi8KKyNpZmRlZiBUVExFQlVGCisgICAgZGVidWcoRjEwMSwiaW5fY2hrIHR0cHVzaCIsIiIsdHRwdXNoKTsKKyAgICBpZiAoY2hhbm5lbCA9PSAxKSB7CisJaWYgKHR0cHVzaCA+PSAwKQorCSAgbisrOworCW4gKz0gbGVfaW5idWYoKTsKKwlpZiAobiA+IDApCisJICByZXR1cm4obik7CisgICAgfQorI2VuZGlmIC8qIFRUTEVCVUYgKi8KKworI2lmZGVmIE5FVFBUWQorI2lmZGVmIEhBVkVfUFRZVFJBUAorICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIEhQLVVYIHB0eSBpL28gKi8KKyAgICBpZiAodHRwdHkgJiYgcHR5X3RyYXBfcGVuZGluZyh0dHlmZCkgPiAwKSB7CisgICAgICAgIGlmIChwdHlfdHJhcF9oYW5kbGVyKHR0eWZkKSA+IDApIHsKKyAgICAgICAgICAgIHR0Y2xvcygwKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogSEFWRV9QVFlUUkFQICovCisjZW5kaWYgLyogTkVUUFRZICovCisKKyAgICBpZiAoY2hhbm5lbCkgewkJCS8qIENoZWNraW5nIGNvbW11bmljYXRpb25zIGNoYW5uZWwgKi8KKwlpZiAodHR5ZmQgPCAwKSB7CQkvKiBObyBjb25uZWN0aW9uICovCisJICByZXR1cm4oLTIpOwkJCS8qIFRoYXQncyB3aGF0IHRoaXMgbWVhbnMgKi8KKwl9IGVsc2UgaWYgKHhsb2NhbCAmJgkJLyogSW4gbG9jYWwgbW9kZSAqLworCQkgICAoIW5ldGNvbm4JCS8qIFNlcmlhbCBjb25uZWN0aW9uIG9yICovCisjaWZkZWYgVE5fQ09NUE9SVAorCQkgICAgfHwgaXN0bmNvbXBvcnQoKSAgICAvKiBUZWxuZXQgQ29tIFBvcnQgKi8KKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisJCSAgICkgJiYgdHRjYXJyICE9IENBUl9PRkYgLyogd2l0aCBDQVJSSUVSIFdBVENIIE9OIChvciBBVVRPKSAqLworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBNWVJFQUQKKy8qCisgIFNlZW1zIGxpa2UgdGhpcyB3b3VsZCBiZSBhIGdvb2QgaWRlYSBidXQgaXQgcHJldmVudHMgQy1LZXJtaXQgZnJvbQorICBwb3BwaW5nIGJhY2sgdG8gdGhlIHByb21wdCBhdXRvbWF0aWNhbGx5IHdoZW4gY2FycmllciBkcm9wcy4gIEhvd2V2ZXIsCisgIGNvbW1lbnRpbmcgdGhpcyBvdXQgcHJldmVudHMgdXMgZnJvbSBzZWVpbmcgdGhlIE5PIENBUlJJRVIgbWVzc2FnZS4KKyAgTmVlZHMgbW9yZSB3b3JrLi4uCisqLworCQkgICAmJiBteV9jb3VudCA8IDEJLyogTm90aGluZyBpbiBvdXIgaW50ZXJuYWwgYnVmZmVyICovCisjZW5kaWYgLyogTVlSRUFEICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCQkgICApIHsKKwkgICAgaW50IHg7CisJICAgIHggPSB0dGdtZG0oKTsJCS8qIFNvIGdldCBtb2RlbSBzaWduYWxzICovCisJICAgIGRlYnVnKEYxMDEsImluX2NoayBjbG9zZS1vbi1kaXNjb25uZWN0IiwiIixjbHNvbmRpc2MpOworCSAgICBpZiAoeCA+IC0xKSB7CQkvKiBDaGVjayBmb3IgY2FycmllciAqLworCQlpZiAoISh4ICYgQk1fRENEKSkgewkvKiBObyBjYXJyaWVyICovCisJCSAgICBkZWJ1ZyhGMTAxLCJpbl9jaGsgY2FycmllciBsb3N0IiwiIix4KTsKKwkJICAgIGlmIChjbHNvbmRpc2MpCS8qIElmICJjbG9zZS1vbi1kaXNjb25uZWN0IiAqLworCQkgICAgICB0dGNsb3MoMCk7CS8qIGNsb3NlIGRldmljZSAmIHJlbGVhc2UgbG9jay4gKi8KKwkJICAgIHJldHVybigtMik7CQkvKiBUaGlzIG1lYW5zICJkaXNjb25uZWN0ZWQiICovCisJCX0KKwkgICAgLyogSW4gY2FzZSBJL08gdG8gZGV2aWNlIGFmdGVyIENEIGRyb3BwZWQgYWx3YXlzIGZhaWxzICovCisJICAgIC8qIGFzIGluIERlYmlhbiBMaW51eCAyLjEgYW5kIFVuaXh3YXJlIDIuMS4uLiAqLworCSAgICB9IGVsc2UgeworCSAgICAgICAgZGVidWcoRjEwMSwiaW5fY2hrIHR0Z21kbSBJL08gZXJyb3IiLCIiLGVycm5vKTsKKwkgICAgICAgIGRlYnVnKEYxMDEsImluX2NoayB0dGdtZG0gZ290c2lncyIsIiIsZ290c2lncyk7CisJICAgICAgICBpZiAoZ290c2lncykgewkJLyogSWYgd2UgZ290IHNpZ25hbHMgYmVmb3JlLi4uICovCisJCSAgICBpZiAoZXJybm8gPT0gNSB8fCBlcnJubyA9PSA2KSB7IC8qIEkvTyBlcnJvciBldGMgKi8KKwkJICAgICAgICBpZiAoY2xzb25kaXNjKQkvKiBsaWtlIHdoZW4gbW9kZW0gaGFuZ3MgdXAgKi8KKwkJCSAgdHRjbG9zKDApOworCQkJcmV0dXJuKC0yKTsKKwkJICAgIH0KKwkJfQorCQkvKiBJZiB3ZSBuZXZlciBnb3QgbW9kZW0gc2lnbmFscyBzdWNjZXNzZnVsbHkgb24gdGhpcyAqLworCQkvKiBjb25uZWN0aW9uIGJlZm9yZSwgd2UgY2FuJ3QgY29uY2x1ZGUgdGhhdCBUSElTIGZhaWx1cmUgKi8KKwkJLyogbWVhbnMgdGhlIGNvbm5lY3Rpb24gd2FzIGxvc3QuICovCisJCXJldHVybigwKTsKKwkgICAgfQorCX0KKyAgICB9CisKKy8qIFdlIHNlZW0gdG8gaGF2ZSBhIGNvbm5lY3Rpb24gc28gbm93IHNlZSBpZiBhbnkgYnl0ZXMgYXJlIHdhaXRpbmcgb24gaXQgKi8KKworI2lmZGVmIENLX1NTTAorICAgIGlmIChzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnKSB7CisgICAgICAgIG4gKz0gU1NMX3BlbmRpbmcoc3NsX2FjdGl2ZV9mbGFnP3NzbF9jb246dGxzX2Nvbik7CisgICAgICAgIGRlYnVnKEYxMDEsImluX2NoayBTU0xfcGVuZGluZyIsIiIsbik7CisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgdHRjbG9zKDApOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfSBlbHNlIGlmIChuID4gMCkgeworICAgICAgICAgICAgcmV0dXJuKG4pOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIFJMT0dDT0RFCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAvKiBJdCBpcyBub3Qgc2FmZSB0byByZWFkIGFueSBkYXRhIHdoZW4gdXNpbmcgZW5jcnlwdGVkIEtsb2dpbiAqLworICAgIGlmICh0dG5wcm90byA9PSBOUF9FSzRMT0dJTiB8fCB0dG5wcm90byA9PSBOUF9FSzVMT0dJTikgeworI2lmZGVmIEtSQjQKKyAgICAgICAgaWYgKHR0bnByb3RvID09IE5QX0VLNExPR0lOKSB7CisgICAgICAgICAgICBuICs9IGtyYjRfZGVzX2F2YWlsKHR0eWZkKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImluX2NoayBrcmI0X2Rlc19hdmFpbCIsIiIsbik7CisgICAgICAgIH0KKyNlbmRpZiAvKiBLUkI0ICovCisjaWZkZWYgS1JCNQorICAgICAgICBpZiAodHRucHJvdG8gPT0gTlBfRUs1TE9HSU4pIHsKKyAgICAgICAgICAgIG4gKz0ga3JiNV9kZXNfYXZhaWwodHR5ZmQpOworICAgICAgICAgICAgZGVidWcoRjEwMSwiaW5fY2hrIGtyYjVfZGVzX2F2YWlsIiwiIixuKTsKKyAgICAgICAgfQorI2lmZGVmIEtSQjVfVTJVCisgICAgICAgIGlmICh0dG5wcm90byA9PSBOUF9LNVUyVSkgeworICAgICAgICAgICAgbiArPSBrcmI1X3UydV9hdmFpbCh0dHlmZCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJpbl9jaGsga3JiNV9kZXNfYXZhaWwiLCIiLG4pOworICAgICAgICB9CisjZW5kaWYgLyogS1JCNV9VMlUgKi8KKyNlbmRpZiAvKiBLUkI1ICovCisgICAgICAgIGlmIChuIDwgMCkJCQkvKiBJcyB0aGlzIHJpZ2h0PyAqLworCSAgcmV0dXJuKC0xKTsKKyAgICAgICAgZWxzZQorCSAgcmV0dXJuKG4pOworICAgIH0KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2VuZGlmIC8qIFJMT0dDT0RFICovCisKKyAgICBlcnJubyA9IDA7CQkJCS8qIFJlc2V0IHRoaXMgc28gd2UgbG9nIGdvb2QgaW5mbyAqLworI2lmZGVmIEZJT05SRUFECisgICAgeCA9IGlvY3RsKGZkLCBGSU9OUkVBRCwgJm4pOwkvKiBCU0QgYW5kIGxvdHMgb2Ygb3RoZXJzICovCisjaWZkZWYgREVCVUcJCQkJLyogKHRoZSBtb3JlIHRoZSBiZXR0ZXIpICovCisgICAgaWYgKGRlYmxvZykgeworCWRlYnVnKEYxMDEsImluX2NoayBGSU9OUkVBRCByZXR1cm4gY29kZSIsIiIseCk7CisJZGVidWcoRjEwMSwiaW5fY2hrIEZJT05SRUFEIGNvdW50IiwiIixuKTsKKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgRklPTlJFQUQgZXJybm8iLCIiLGVycm5vKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNlbHNlIC8qIEZJT05SRUFEIG5vdCBkZWZpbmVkICovCisvKgorICBIZXJlLCBpZiAobmV0Y29ubiAmJiB0dG5ldCA9PSBORVRfVENQQiksIHdlIG1pZ2h0IHRyeSBjYWxsaW5nIHJlY3Ztc2coKQorICB3aXRoIGZsYWdzIE1TR19QRUVLfE1TR19ET05UV0FJVCBvbiB0aGUgc29ja2V0ICh0dHlmZCksIGV4Y2VwdCB0aGlzIGlzIG5vdAorICBwb3J0YWJsZSAoTVNHX0RPTlRXQUlUIGlzbid0IGRlZmluZWQgaW4gYW55IG9mIHRoZSA8c3lzL3NvY2tldC5oPiBmaWxlcworICB0aGF0IEkgbG9va2VkIGF0LCBidXQgaXQgaXMgbmVlZGVkIHRvIHByZXZlbnQgdGhlIGNhbGwgZnJvbSBibG9ja2luZyksIGFuZAorICB0aGUgbXNnaGRyIHN0cnVjdCBkaWZmZXJzIGZyb20gcGxhY2UgdG8gcGxhY2UsIHNvIHdlIHdvdWxkIG5lZWQgYW5vdGhlcgorICBhdmFsYW5jaGUgb2YgaWZkZWZzLiAgU3RpbGwsIHdoZW4gRklPTlJFQUQgaXMgbm90IGF2YWlsYWJsZSwgdGhpcyBpcyB0aGUKKyAgb25seSBvdGhlciBrbm93biBtZXRob2Qgb2YgYXNraW5nIHRoZSBPUyBmb3IgdGhlICpudW1iZXIqIG9mIGNoYXJhY3RlcnMKKyAgYXZhaWxhYmxlIGZvciByZWFkaW5nLgorKi8KKyNpZmRlZiBWNwkJCQkvKiBVTklYIFY3OiBsb29rIGluIGtlcm5lbCBtZW1vcnkgKi8KKyNpZmRlZiBNSU5JWAorICAgIG4gPSAwOwkJCQkvKiBCdXQgbm90IGluIE1JTklYICovCisjZWxzZQorI2lmZGVmIE1JTklYMgorICAgIG4gPSAwOworI2Vsc2UKKyAgICBsc2VlayhrbWVtW1RUWV0sIChsb25nKSBxYWRkcltUVFldLCAwKTsgLyogN3RoIEVkaXRpb24gVW5peCAqLworICAgIHggPSByZWFkKGttZW1bVFRZXSwgJm4sIHNpemVvZihpbnQpKTsKKyAgICBpZiAoeCAhPSBzaXplb2YoaW50KSkKKyAgICAgIG4gPSAwOworI2VuZGlmIC8qIE1JTklYMiAqLworI2VuZGlmIC8qIE1JTklYICovCisjZWxzZSAvKiBOb3QgVjcgKi8KKyNpZmRlZiBQUk9WWDEKKyAgICB4ID0gaW9jdGwoZmQsIFRJT0NRQ05ULCAmdHRidWYpOwkvKiBERUMgUHJvLzN4eCBWZW5peCBWLjEgKi8KKyAgICBuID0gdHRidWYuc2dfaXNwZWVkICYgMDM3NzsJCS8qIENpcmNhIDE5ODQgKi8KKyAgICBpZiAoeCA8IDApIG4gPSAwOworI2Vsc2UKKyNpZmRlZiBNWVJFQUQKKy8qCisgIEhlcmUgd2Ugc2tpcCBhbGwgdGhlIHVuZGVwZW5kYWJsZSBhbmQgZXhwZW5zaXZlIGNhbGxzIGJlbG93IGlmIHdlCisgIGFscmVhZHkgaGF2ZSBzb21ldGhpbmcgaW4gb3VyIGludGVybmFsIGJ1ZmZlci4gIFRoaXMgdGVuZHMgdG8gd29yayBxdWl0ZQorICBuaWNlbHksIHNvIHRoZSBvbmx5IHJlYWxseSBiYWQgY2FzZSByZW1haW5pbmcgaXMgdGhlIG9uZSBpbiB3aGljaCBuZWl0aGVyCisgIEZJT05SRUFEIG9yIE1ZUkVBRCBhcmUgZGVmaW5lZCwgd2hpY2ggaXMgaW5jcmVhc2luZ2x5IHJhcmUgdGhlc2UgZGF5cy4KKyovCisgICAgaWYgKGNoYW5uZWwgIT0gMCAmJiBteV9jb3VudCA+IDApIHsKKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgYnVmIG15X2NvdW50IiwiIixteV9jb3VudCk7CisJbiA9IG15X2NvdW50OwkJCS8qIG4gd2FzIDAgYmVmb3JlIHdlIGdvdCBoZXJlICovCisJcmV0dXJuKG4pOworICAgIH0KKyNlbmRpZiAvKiBNWVJFQUQgKi8KKy8qCisgIHJkY2hrKCksIHNlbGVjdCgpLCBhbmQgcG9sbCgpIHRlbGwgdXMgKmlmKiBkYXRhIGlzIGF2YWlsYWJsZSB0byBiZSByZWFkLCBidXQKKyAgbm90IGhvdyBtdWNoLCBzbyB0aGVzZSBzaG91bGQgYmUgdXNlZCBvbmx5IGFzIGEgZmluYWwgcmVzb3J0LiAgRXNwZWNpYWxseQorICBzaW5jZSB0aGVzZSBjYWxscyB0ZW5kIHRvIGFkZCBhIGxvdCBvdmVyaGVhZC4KKyovCisjaWZkZWYgUkRDSEsJCQkJLyogVGhpcyBtb3N0bHkgU0NPLXNwZWNpZmljICovCisgICAgbiA9IHJkY2hrKGZkKTsKKyAgICBkZWJ1ZyhGMTAxLCJpbl9jaGsgcmRjaGsiLCIiLG4pOworI2Vsc2UgLyogTm8gUkRDSEsgKi8KKyNpZmRlZiBTRUxFQ1QKKyNpZmRlZiBQbGFuOQorICAgIC8qIE9ubHkgYWxsb3dzIHNlbGVjdCBvbiB0aGUgY29uc29sZSAuLi4gZG9uJ3QgYXNrICovCisgICAgaWYgKGNoYW5uZWwgPT0gMCkKKyNlbmRpZiAvKiBQbGFuOSAqLworICAgICAgeworCWZkX3NldCByZmRzOwkJCS8qIFJlYWQgZmlsZSBkZXNjcmlwdG9ycyAqLworI2lmZGVmIEJFTExWMTAKKwlGRF9aRVJPKHJmZHMpOwkJCS8qIEluaXRpYWxpemUgdGhlbSAqLworCUZEX1NFVChmZCxyZmRzKTsJCS8qIFdlIHdhbnQgdG8gbG9vayBhdCB0aGlzIGZkICovCisjZWxzZQorCUZEX1pFUk8oJnJmZHMpOwkJCS8qIEluaXRpYWxpemUgdGhlbSAqLworCUZEX1NFVChmZCwmcmZkcyk7CQkvKiBXZSB3YW50IHRvIGxvb2sgYXQgdGhpcyBmZCAqLworCXR2LnR2X3NlYyA9IHR2LnR2X3VzZWMgPSAwTDsJLyogQSAwLXZhbHVlZCB0aW1ldmFsIHN0cnVjdHVyZSAqLworI2VuZGlmIC8qIEJFTExWMTAgKi8KKyNpZmRlZiBQbGFuOQorCW4gPSBzZWxlY3QoIEZEX1NFVFNJWkUsICZyZmRzLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsICZ0diApOworCWRlYnVnKEYxMDEsImluX2NoayBQbGFuIDkgc2VsZWN0IiwiIixuKTsKKyNlbHNlCisjaWZkZWYgQkVMTFYxMAorCW4gPSBzZWxlY3QoIDEyOCwgcmZkcywgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAwICk7CisJZGVidWcoRjEwMSwiaW5fY2hrIEJFTExWMTAgc2VsZWN0IiwiIixuKTsKKyNlbHNlCisjaWZkZWYgQlNENDQKKwluID0gc2VsZWN0KCBGRF9TRVRTSVpFLCAmcmZkcywgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdHYgKTsKKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgQlNENDQgc2VsZWN0IiwiIixuKTsKKyNlbHNlCisjaWZkZWYgQlNENDMKKwluID0gc2VsZWN0KCBGRF9TRVRTSVpFLCAmcmZkcywgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdHYgKTsKKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgQlNENDMgc2VsZWN0IiwiIixuKTsKKyNlbHNlCisjaWZkZWYgU09MQVJJUworCW4gPSBzZWxlY3QoIEZEX1NFVFNJWkUsICZyZmRzLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsICZ0diApOworCWRlYnVnKEYxMDEsImluX2NoayBTT0xBUklTIHNlbGVjdCIsIiIsbik7CisjZWxzZQorI2lmZGVmIFFOWDYKKwluID0gc2VsZWN0KCBGRF9TRVRTSVpFLCAmcmZkcywgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdHYgKTsKKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgUU5YNiBzZWxlY3QiLCIiLG4pOworI2Vsc2UKKyNpZmRlZiBRTlgKKwluID0gc2VsZWN0KCBGRF9TRVRTSVpFLCAmcmZkcywgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdHYgKTsKKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgUU5YIHNlbGVjdCIsIiIsbik7CisjZWxzZQorI2lmZGVmIENPSEVSRU5UCisJbiA9IHNlbGVjdCggRkRfU0VUU0laRSwgJnJmZHMsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgJnR2ICk7CisJZGVidWcoRjEwMSwiaW5fY2hrIENPSEVSRU5UIHNlbGVjdCIsIiIsbik7CisjZWxzZQorI2lmZGVmIFNWUjQKKwluID0gc2VsZWN0KCBGRF9TRVRTSVpFLCAmcmZkcywgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdHYgKTsKKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgU1ZSNCBzZWxlY3QiLCIiLG4pOworI2Vsc2UKKyNpZmRlZiBfX2xpbnV4X18KKwluID0gc2VsZWN0KCBGRF9TRVRTSVpFLCAmcmZkcywgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdHYgKTsKKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgTElOVVggc2VsZWN0IiwiIixuKTsKKyNpZmRlZiBPU0YKKwluID0gc2VsZWN0KCBGRF9TRVRTSVpFLCAmcmZkcywgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdHYgKTsKKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgT1NGIHNlbGVjdCIsIiIsbik7CisjZWxzZQorCW4gPSBzZWxlY3QoIEZEX1NFVFNJWkUsICZyZmRzLCAoaW50ICopMCwgKGludCAqKTAsICZ0diApOworCWRlYnVnKEYxMDEsImluX2NoayBjYXRjaGFsbCBzZWxlY3QiLCIiLG4pOworI2VuZGlmIC8qIE9TRiAqLworI2VuZGlmIC8qIF9fbGludXhfXyAqLworI2VuZGlmIC8qIFNWUjQgKi8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworI2VuZGlmIC8qIFFOWCAqLworI2VuZGlmIC8qIFFOWDYgKi8KKyNlbmRpZiAvKiBTT0xBUklTICovCisjZW5kaWYgLyogQlNENDMgKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworI2VuZGlmIC8qIEJFTExWMTAgKi8KKyNlbmRpZiAvKiBQbGFuOSAqLworICAgIH0KKyNlbHNlICAvKiBOb3QgU0VMRUNUICovCisjaWZkZWYgQ0tfUE9MTAorICAgIHsKKyAgICAgIHN0cnVjdCBwb2xsZmQgcGZkOworCisgICAgICBwZmQuZmQgPSBmZDsKKyAgICAgIHBmZC5ldmVudHMgPSBQT0xMSU47CisgICAgICBwZmQucmV2ZW50cyA9IDA7CisgICAgICBuID0gcG9sbCgmcGZkLCAxLCAwKTsKKyAgICAgIGRlYnVnKEYxMDEsImluX2NoayBwb2xsIiwiIixuKTsKKyAgICAgIGlmICgobiA+IDApICYmIChwZmQucmV2ZW50cyAmIFBPTExJTikpCisJbiA9IDE7CisgICAgfQorI2VuZGlmIC8qIENLX1BPTEwgKi8KKyNlbmRpZiAvKiBTRUxFQ1QgKi8KKyNlbmRpZiAvKiBSRENISyAqLworI2VuZGlmIC8qIFBST1ZYMSAqLworI2VuZGlmIC8qIFY3ICovCisjZW5kaWYgLyogRklPTlJFQUQgKi8KKworLyogRnJvbSBoZXJlIGRvd24sIHRyZWF0IGNvbnNvbGUgYW5kIGNvbW11bmljYXRpb24gZGV2aWNlIGRpZmZlcmVudGx5Li4uICovCisKKyAgICBpZiAoY2hhbm5lbCA9PSAwKSB7CQkJLyogQ29uc29sZSAqLworCisjaWZkZWYgU1ZPUlBPU0lYCisjaWZuZGVmIEZJT05SRUFECisjaWZuZGVmIFNFTEVDVAorI2lmbmRlZiBDS19QT0xMCisjaWZuZGVmIFJEQ0hLCisvKgorICBUaGlzIGlzIHRoZSBoaWRlb3VzIGhhY2sgdXNlZCBpbiBTeXN0ZW0gViBhbmQgUE9TSVggc3lzdGVtcyB0aGF0IGRvbid0CisgIHN1cHBvcnQgRklPTlJFQUQsIHJkY2hrKCksIHNlbGVjdCgpLCBwb2xsKCksIGV0YywgaW4gd2hpY2ggdGhlIHVzZXIncworICBDT05ORUNULW1vZGUgZXNjYXBlIGNoYXJhY3RlciBpcyBhdHRhY2hlZCB0byBTSUdRVUlULiAgVXNlZCwgb2J2aW91c2x5LAorICBvbmx5IG9uIHRoZSBjb25zb2xlLgorKi8KKwlpZiAoY29uZXNjKSB7CQkJLyogRXNjYXBlIGNoYXJhY3RlciB0eXBlZCA9PSBTSUdRVUlUICovCisJICAgIGRlYnVnKEYxMDAsImluX2NoayBjb25lc2MiLCIiLGNvbmVzYyk7CisJICAgIGNvbmVzYyA9IDA7CisJICAgIHNpZ25hbChTSUdRVUlULGVzY3RycCk7CS8qIFJlc3RvcmUgc2lnbmFsICovCisJICAgIG4gKz0gMTsKKwl9CisjZW5kaWYgLyogUkRDSEsgKi8KKyNlbmRpZiAvKiBDS19QT0xMICovCisjZW5kaWYgLyogU0VMRUNUICovCisjZW5kaWYgLyogRklPTlJFQUQgKi8KKyNlbmRpZiAvKiBTVk9SUE9TSVggKi8KKworCXJldHVybihuKTsJCQkvKiBEb25lIHdpdGggY29uc29sZSAqLworICAgIH0KKworICAgIGlmIChjaGFubmVsICE9IDApIHsJCQkvKiBDb21tdW5pY2F0aW9ucyBjb25uZWN0aW9uICovCisKKyNpZmRlZiBNWVJFQUQKKyNpZm5kZWYgRklPTlJFQUQKKy8qCisgIHNlbGVjdCgpIG9yIHJkY2hrKCksIGV0YywgaGFzIHRvbGQgdXMgdGhhdCBzb21ldGhpbmcgaXMgd2FpdGluZywgYnV0IHdlCisgIGRvbid0IGtub3cgaG93IG11Y2guICBTbyB3ZSBkbyBhIHJlYWQgdG8gZ2V0IGl0IGFuZCB0aGVuIHdlIGtub3cuICBOb3RlOgorICBUaGlzIHJlYWQgaXMgTk9UIG5vbmJsb2NraW5nIGlmIG5vdGhpbmcgaXMgdGhlcmUgKGJlY2F1c2Ugb2YgVk1JTj0xKSwgYnV0CisgIGl0IHNob3VsZCBiZSBzYWZlIGluIHRoaXMgY2FzZSBzaW5jZSB0aGUgT1MgdGVsbHMgdXMgYXQgbGVhc3Qgb25lIGJ5dGUgaXMKKyAgd2FpdGluZyB0byBiZSByZWFkLCBhbmQgTVlSRUFEIHJlYWRzIHJldHVybiBhcyBtdWNoIGFzIGlzIHRoZXJlIHdpdGhvdXQKKyAgd2FpdGluZyBmb3IgYW55IG1vcmUuICBDb250cm9sbGVkIHRlc3RzIG9uIFNvbGFyaXMgYW5kIFVuaXh3YXJlICh3aXRoCisgIEZJT05SRUFEIGRlbGliZXJhdGVseSB1bmRlZmluZWQpIHNob3cgdGhpcyB0byBiZSB0cnVlLgorKi8KKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgcmVhZCBteV9jb3VudCIsIiIsbXlfY291bnQpOworCWRlYnVnKEYxMDEsImluX2NoayByZWFkIG4iLCIiLG4pOworCWlmIChuID4gMCAmJiBteV9jb3VudCA9PSAwKSB7CisJICAgIC8qIFRoaXMgYWxzbyBjYXRjaGVzIGRpc2Nvbm5lY3RzIGV0YyAqLworCSAgICAvKiBEbyB3aGF0IG15Z2V0YnVmIGRvZXMgZXhjZXB0IGRvbid0IGdyYWIgYSBjaGFyYWN0ZXIgKi8KKwkgICAgbXlfY291bnQgPSBteWZpbGxidWYoKTsKKwkgICAgbXlfaXRlbSA9IC0xOwkJLyogXl5eICovCisJICAgIGRlYnVnKEYxMDEsImluX2NoayBteWZpbGxidWYgbXlfY291bnQiLCIiLG15X2NvdW50KTsKKwkgICAgaWYgKG15X2NvdW50IDwgMCkKKwkgICAgICByZXR1cm4oLTEpOworCSAgICBlbHNlCisJICAgICAgbiA9IDA7CQkJLyogTkI6IG4gaXMgcmVwbGFjZWQgYnkgbXlfY291bnQgKi8KKwl9CisjZW5kaWYgLyogRklPTlJFQUQgKi8KKy8qCisgIEhlcmUgd2UgYWRkIHdoYXRldmVyIHdlIHRoaW5rIGlzIHVucmVhZCB0byB3aGF0IGlzIHN0aWxsIGluIG91cgorICBvdXIgaW50ZXJuYWwgYnVmZmVyLiAgVGh1cyB0aGUgaW1wb3J0YW5jZSBvZiBzZXR0aW5nIG4gdG8gMCBqdXN0IGFib3ZlLgorKi8KKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgbXlfY291bnQiLCIiLG15X2NvdW50KTsKKwlkZWJ1ZyhGMTAxLCJpbl9jaGsgbiIsIiIsbik7CisJaWYgKG15X2NvdW50ID4gMCkKKwkgIG4gKz0gbXlfY291bnQ7CisjZW5kaWYgLyogTVlSRUFEICovCisgICAgfQorICAgIGRlYnVnKEYxMDEsImluX2NoayByZXN1bHQiLCIiLG4pOworCisgICAgLyogRXJyb3JzIGhlcmUgZG9uJ3QgcHJvdmUgdGhlIGNvbm5lY3Rpb24gaGFzIGRyb3BwZWQgc28ganVzdCBzYXkgMCAqLworCisgICAgcmV0dXJuKG4gPCAwID8gMCA6IG4pOworfQorCisKKy8qICBUIFQgQyBIIEsgIC0tICBUZWxsIGhvdyBtYW55IGNoYXJhY3RlcnMgYXJlIHdhaXRpbmcgaW4gdHR5IGlucHV0IGJ1ZmZlciAgKi8KKworaW50Cit0dGNoaygpIHsKKyAgICBpbnQgZmQ7CisjaWZkZWYgTkVUQ01ECisgICAgaWYgKHR0cGlwZSkKKyAgICAgIGZkID0gZmRpbjsKKyAgICBlbHNlCisjZW5kaWYgLyogTkVUQ01EICovCisgICAgICBmZCA9IHR0eWZkOworICAgIHJldHVybihpbl9jaGsoMSxmZCkpOworfQorCisvKiAgVCBUIFggSSBOICAtLSAgR2V0IG4gY2hhcmFjdGVycyBmcm9tIHR0eSBpbnB1dCBidWZmZXIgICovCisKKy8qICBSZXR1cm5zIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IGdvdHRlbiwgb3IgLTEgb24gZmFpbHVyZSAgKi8KKworLyogIEludGVuZGVkIGZvciB1c2Ugb25seSB3aGVuIGl0IGlzIGtub3duIHRoYXQgbiBjaGFyYWN0ZXJzIGFyZSBhY3R1YWxseSAqLworLyogIEF2YWlsYWJsZSBpbiB0aGUgaW5wdXQgYnVmZmVyLiAgKi8KKworaW50Cit0dHhpbihuLGJ1ZikgaW50IG47IENIQVIgKmJ1ZjsgeworICAgIHJlZ2lzdGVyIGludCB4ID0gMCwgYyA9IC0yOworI2lmZGVmIFRUTEVCVUYKKyAgICByZWdpc3RlciBpbnQgaSA9IDA7CisjZW5kaWYgLyogVFRMRUJVRiAqLworICAgIGludCBmZDsKKworICAgIGlmIChuIDwgMSkJCQkJLyogTm90aGluZyB0byBkbyAqLworICAgICAgcmV0dXJuKDApOworCisjaWZkZWYgVFRMRUJVRgorICAgIGlmICh0dHB1c2ggPj0gMCkgeworICAgICAgICBidWZbMF0gPSB0dHB1c2g7CQkvKiBQdXQgcHVzaGVkIGNoYXIgaW4gYnVmZmVyKi8KKyAgICAgICAgdHRwdXNoID0gLTE7CQkJLyogQ2xlYXIgdGhlIHB1c2ggYnVmZmVyICovCisgICAgICAgIGlmICh0dGNoaygpID4gMCkKKwkgIHJldHVybih0dHhpbihuLTEsICZidWZbMV0pICsgMSk7CisgICAgICAgIGVsc2UKKwkgIHJldHVybigxKTsKKyAgICB9CisgICAgaWYgKGxlX2RhdGEpIHsKKyAgICAgICAgd2hpbGUgKGxlX2luYnVmKCkgPiAwKSB7CisJICAgIGlmIChsZV9nZXRjaGFyKCZidWZbaV0pKSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodHRjaGsoKSA+IDApCisJICByZXR1cm4odHR4aW4obiwmYnVmW2ldKStpKTsKKyAgICAgICAgZWxzZQorCSAgcmV0dXJuKGkpOworICAgIH0KKyNlbmRpZiAvKiBUVExFQlVGICovCisKKyNpZmRlZiBORVRDTUQKKyAgICBpZiAodHRwaXBlKQorICAgICAgZmQgPSBmZGluOworICAgIGVsc2UKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyAgICAgIGZkID0gdHR5ZmQ7CisKKyNpZmRlZiBTVU5YMjUKKyAgICBpZiAobmV0Y29ubiAmJiAodHRuZXQgPT0gTkVUX1NYMjUpKQkvKiBYLjI1IGNvbm5lY3Rpb24gKi8KKyAgICAgIHJldHVybih4MjV4aW4obixidWYpKTsKKyNlbmRpZiAvKiBTVU5YMjUgKi8KKworI2lmZGVmIElCTVgyNQorICAgIC8qIHJpZWhtOiBwb3NzaWJseSBub3QgbmVlZGVkLiBUZXN0IHdvcmtlZCB3aXRoIG5vcm1hbCByZWFkcyBhbmQgd3JpdGVzICovCisgICAgaWYgKG5ldGNvbm4gJiYgKHR0bmV0ID09IE5FVF9JWDI1KSkJeyAvKiBYLjI1IGNvbm5lY3Rpb24gKi8KKwl4ID0geDI1eGluKG4sYnVmKTsKKwlpZiAoeCA+IDApIGJ1Zlt4XSA9ICdcMCc7CisJcmV0dXJuKHgpOworICAgIH0KKyNlbmRpZiAvKiBJQk1YMjUgKi8KKworI2lmZGVmIE1ZUkVBRAorICAgIGRlYnVnKEYxMDEsInR0eGluIE1ZUkVBRCIsIiIsbik7CisgICAgd2hpbGUgKHggPCBuKSB7CisJYyA9IG15cmVhZCgpOworCWlmIChjIDwgMCkgeworCSAgICBkZWJ1ZyhGMTAxLCJ0dHhpbiBteXJlYWQgcmV0dXJucyIsIiIsYyk7CisJICAgIGlmIChjID09IC0zKSB4ID0gLTE7CisJICAgIGJyZWFrOworICAgICAgICB9CisJYnVmW3grK10gPSBjICYgdHRwbXNrOworI2lmZGVmIFJMT0dDT0RFCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAgICAgLyogSXQgaXMgaW1wb3NzaWJsZSB0byBrbm93IGhvdyBtYW55IGNoYXJhY3RlcnMgYXJlIHdhaXRpbmcgKi8KKyAgICAgICAgLyogdG8gYmUgcmVhZCB3aGVuIHlvdSBhcmUgdXNpbmcgRW5jcnlwdGVkIFJsb2dpbiBvciBTU0wgICAgKi8KKyAgICAgICAgLyogYXMgdGhlIHRyYW5zcG9ydCBzaW5jZSB0aGUgbnVtYmVyIG9mIHJlYWwgZGF0YSBieXRlcyAgICAgKi8KKyAgICAgICAgLyogY2FuIGJlIGdyZWF0ZXIgb3IgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb24gdGhlICAgKi8KKyAgICAgICAgLyogd2lyZSB3aGljaCBpcyB3aGF0IHR0Y2hrKCkgcmV0dXJucy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKG5ldGNvbm4gJiYgKHR0bnByb3RvID09IE5QX0VLNExPR0lOIHx8IHR0bnByb3RvID09IE5QX0VLNUxPR0lOKSkKKwkgIGlmICh0dGNoaygpIDw9IDApCisJICAgIGJyZWFrOworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgaWYgKHNzbF9hY3RpdmVfZmxhZyB8fCB0bHNfYWN0aXZlX2ZsYWcpCisJICBpZiAodHRjaGsoKSA8PSAwKQorCSAgICBicmVhazsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICB9CisjZWxzZQorICAgIGRlYnVnKEYxMDEsInR0eGluIFJFQUQiLCIiLG4pOworICAgIHggPSByZWFkKGZkLGJ1ZixuKTsKKyAgICBmb3IgKGMgPSAwOyBjIDwgbjsgYysrKQkJLyogU3RyaXAgYW55IHBhcml0eSAqLworICAgICAgYnVmW2NdICY9IHR0cG1zazsKKyNlbmRpZiAvKiBNWVJFQUQgKi8KKworICAgIGRlYnVnKEYxMDEsInR0eGluIHgiLCIiLHgpOwkJLyogRG9uZSAqLworICAgIGlmICh4ID4gMCkgYnVmW3hdID0gJ1wwJzsKKyAgICBpZiAoeCA8IDApIHggPSAtMTsKKyAgICByZXR1cm4oeCk7Cit9CisKKy8qICBUIFQgTyBMICAtLSAgV3JpdGUgc3RyaW5nIHMsIGxlbmd0aCBuLCB0byBjb21tdW5pY2F0aW9uIGRldmljZS4gICovCisvKgorICBSZXR1cm5zOgorICAgPj0gMCBvbiBzdWNjZXNzLCBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSB3cml0dGVuLgorICAgLTEgb24gZmFpbHVyZS4KKyovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorQ0hBUiAqIHhwYWNrZXQgPSBOVUxMOworaW50IG54cGFja2V0ID0gMDsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisKKyNkZWZpbmUgVFRPTE1BWFQgNQoraW50Cit0dG9sKHMsbikgaW50IG47IENIQVIgKnM7IHsKKyAgICBpbnQgeCwgbGVuLCB0cmllcywgZmQ7CisjaWZkZWYgQ0tYWENIQVIKKyAgICBleHRlcm4gaW50IGRibGZsYWc7CQkJLyogRm9yIFNFVCBTRU5EIERPVUJMRS1DSEFSQUNURVIgKi8KKyAgICBleHRlcm4gc2hvcnQgZGJsdFtdOworICAgIENIQVIgKnAgPSBOVUxMLCAqcDIsICpzMiwgYzsKKyAgICBpbnQgbjIgPSAwOworI2VuZGlmIC8qIENLWFhDSEFSICovCisKKyAgICBpZiAodHR5ZmQgPCAwKQkJCS8qIE5vdCBvcGVuPyAqLworICAgICAgcmV0dXJuKC0zKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIGhleGR1bXAoInR0b2wgcyIscyxuKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgTkVUQ01ECisgICAgaWYgKHR0cGlwZSkKKyAgICAgIGZkID0gZmRvdXQ7CisgICAgZWxzZQorI2VuZGlmIC8qIE5FVENNRCAqLworICAgICAgZmQgPSB0dHlmZDsKKworI2lmZGVmIENLWFhDSEFSCisvKiAgRG91YmxlIGFueSBjaGFyYWN0ZXJzIHRoYXQgbXVzdCBiZSBkb3VibGVkLiAgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dG9sIGRibGZsYWciLCIiLGRibGZsYWcpOworICAgIGlmIChkYmxmbGFnKSB7CisJcCA9IChDSEFSICopIG1hbGxvYyhuICsgbiArIDEpOworCWlmIChwKSB7CisJICAgIHMyID0gczsKKwkgICAgcDIgPSBwOworCSAgICBuMiA9IDA7CisJICAgIHdoaWxlICgqczIpIHsKKwkJYyA9ICpzMisrOworCQkqcDIrKyA9IGM7CisJCW4yKys7CisJCWlmIChkYmx0Wyh1bnNpZ25lZCkgY10gJiAyKSB7CisJCSAgICAqcDIrKyA9IGM7CisJCSAgICBuMisrOworCQl9CisJICAgIH0KKwkgICAgcyA9IHA7CisJICAgIG4gPSBuMjsKKwkgICAgc1tuXSA9ICdcMCc7CisJfQorI2lmZGVmIERFQlVHCisgICAgICAgIGlmIChkZWJsb2cpIGhleGR1bXAoInR0b2wgZG91YmxlZCBzIixzLG4pOworI2VuZGlmIC8qIERFQlVHICovCisgICAgfQorI2VuZGlmIC8qIENLWFhDSEFSICovCisKKyAgICB0cmllcyA9IFRUT0xNQVhUOwkJCS8qIEFsbG93IHVwIHRvIHRoaXMgbWFueSB0cmllcyAqLworICAgIGxlbiA9IG47CQkJCS8qIFJlbWVtYmVyIG9yaWdpbmFsIGxlbmd0aCAqLworCisjaWZkZWYgQ0tfRU5DUllQVElPTgorLyoKKyAgVGhpcyBpcyB0byBhdm9pZCBlbmNyeXB0aW5nIGEgcGFja2V0IHRoYXQgaXMgYWxyZWFkeSBlbmNyeXB0ZWQsIGUuZy4KKyAgd2hlbiB3ZSByZXNlbmQgYSBwYWNrZXQgZGlyZWN0bHkgb3V0IG9mIHRoZSBwYWNrZXQgYnVmZmVyLCBhbmQgYWxzbyB0bworICBhdm9pZCBlbmNyeXB0aW5nIGEgY29uc3RhbnQgKGxpdGVyYWwpIHN0cmluZywgd2hpY2ggY2FuIGNhdXNlIGEgbWVtb3J5CisgIGZhdWx0LgorKi8KKyAgICBpZiAoVEVMT1BUX01FKFRFTE9QVF9FTkNSWVBUSU9OKSkgeworCWludCB4OworCWlmIChueHBhY2tldCA8IG4pIHsKKwkgICAgaWYgKHhwYWNrZXQpIHsKKwkJZnJlZSh4cGFja2V0KTsKKwkJeHBhY2tldCA9IE5VTEw7CisJCW54cGFja2V0ID0gMDsKKwkgICAgfQorCSAgICB4ID0gbiA+IDEwMjQwID8gbiA6IDEwMjQwOworCSAgICB4cGFja2V0ID0gKENIQVIgKiltYWxsb2MoeCk7CisJICAgIGlmICgheHBhY2tldCkgeworCQlmcHJpbnRmKHN0ZGVyciwidHRvbCBtYWxsb2MgZmFpbHVyZVxuIik7CisJCXJldHVybigtMSk7CisJICAgIH0gZWxzZQorCSAgICAgIG54cGFja2V0ID0geDsKKwl9CisJbWVtY3B5KChjaGFyICopeHBhY2tldCwoY2hhciAqKXMsbik7CisJcyA9IHhwYWNrZXQ7CisJY2tfdG5fZW5jcnlwdCgoY2hhciAqKXMsbik7CisgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKworICAgIHdoaWxlIChuID4gMCAmJgorCSAgICh0cmllcy0tID4gMAorI2lmZGVmIENLX0VOQ1JZUFRJT04KKwkgICAgLyoga2VlcCB0cnlpbmcgaWYgd2UgYXJlIGVuY3J5cHRpbmcgKi8KKwkgICAgfHwgVEVMT1BUX01FKFRFTE9QVF9FTkNSWVBUSU9OKQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgICAgICkpIHsJCQkvKiBCZSBwZXJzaXN0ZW50ICovCisJZGVidWcoRjEwMSwidHRvbCB0cnkiLCIiLFRUT0xNQVhUIC0gdHJpZXMpOworI2lmZGVmIEJFT1NPUkJFQk9YCisgICAgICAgIGlmIChuZXRjb25uICYmICF0dHBpcGUgJiYgIXR0cHR5KQorCSAgeCA9IG5ldHRvbCgoY2hhciAqKXMsbik7CS8qIFdyaXRlIHN0cmluZyB0byBkZXZpY2UgKi8KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEJFT1NPUkJFQk9YICovCisjaWZkZWYgSUJNWDI1CisJICBpZiAodHRuZXQgPT0gTkVUX0lYMjUpCisJICAgIC8qCisJICAgICAqIHRoaXMgaXMgYSBtb3JlIGNvbnRyb2xsZWQgd2F5IG9mIHdyaXRpbmcgdG8gWDI1CisJICAgICAqIFNUUkVBTVMsIGhvd2V2ZXIgd3JpdGUgc2hvdWxkIGFsc28gd29yayEKKwkgICAgICovCisJICAgIHggPSB4MjV3cml0ZSh0dHlmZCwgcywgbik7CisJICBlbHNlCisjZW5kaWYgLyogSUJNWDI1ICovCisjaWZkZWYgQ0tfU1NMCisJICAgIGlmIChzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnKSB7CisJCWludCBlcnJvcjsKKwkJLyogV3JpdGUgdXNpbmcgU1NMICovCisgICAgICAgICAgICAgICAgc3NsX3JldHJ5OgorCQlpZiAoc3NsX2FjdGl2ZV9mbGFnKQorICAgICAgICAgICAgICAgICAgeCA9IFNTTF93cml0ZShzc2xfY29uLCBzLCBuKTsKKwkJZWxzZQorICAgICAgICAgICAgICAgICAgeCA9IFNTTF93cml0ZSh0bHNfY29uLCBzLCBuKTsKKwkJc3dpdGNoIChTU0xfZ2V0X2Vycm9yKHNzbF9hY3RpdmVfZmxhZz9zc2xfY29uOnRsc19jb24seCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9OT05FOgorICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PSBuKQorCQkgICAgICByZXR1cm4obGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcyArPSB4OworICAgICAgICAgICAgICAgICAgICBuIC09IHg7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gc3NsX3JldHJ5OworCQkgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisJCSAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorCQkgICAgeCA9IDA7CisJCSAgICBicmVhazsKKwkJICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPSAwKQorCQkgICAgICByZXR1cm4oLTEpOworCQkgIGNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisJCSAgY2FzZSBTU0xfRVJST1JfU1NMOgorCQkgIGNhc2UgU1NMX0VSUk9SX1pFUk9fUkVUVVJOOgorCQkgIGRlZmF1bHQ6CisJCSAgICB0dGNsb3MoMCk7CisJCSAgICByZXR1cm4oLTMpOworCQl9CisJICAgIH0gZWxzZQorI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgS1JCNAorI2lmZGVmIFJMT0dDT0RFCisJICAgIGlmICh0dG5wcm90byA9PSBOUF9FSzRMT0dJTikgeworCQlyZXR1cm4oa3JiNF9kZXNfd3JpdGUodHR5ZmQscyxuKSk7CisJICAgIH0gZWxzZQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisjZW5kaWYgLyogS1JCNCAqLworI2lmZGVmIEtSQjUKKyNpZmRlZiBSTE9HQ09ERQorICAgICAgICAgICAgaWYgKHR0bnByb3RvID09IE5QX0VLNUxPR0lOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuKGtyYjVfZGVzX3dyaXRlKHR0eWZkLHMsbiwwKSk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2lmZGVmIEtSQjVfVTJVCisgICAgICAgICAgICBpZiAodHRucHJvdG8gPT0gTlBfSzVVMlUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oa3JiNV91MnVfd3JpdGUodHR5ZmQscyxuKSk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBLUkI1X1UyVSAqLworI2VuZGlmIC8qIEtSQjUgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCSAgICAgIHggPSB3cml0ZShmZCxzLG4pOwkvKiBXcml0ZSBzdHJpbmcgdG8gZGV2aWNlICovCisKKwlpZiAoeCA9PSBuKSB7CQkJLyogV29ya2VkPyAqLworCSAgICBkZWJ1ZyhGMTAxLCJ0dG9sIG9rIiwiIix4KTsJLyogT0sgKi8KKyNpZmRlZiBDS1hYQ0hBUgorCSAgICBpZiAocCkgZnJlZShwKTsKKyNlbmRpZiAvKiBDS1hYQ0hBUiAqLworCSAgICByZXR1cm4obGVuKTsJCS8qIERvbmUgKi8KKwl9IGVsc2UgaWYgKHggPCAwKSB7CQkvKiBObywgZ290IGVycm9yPyAqLworCSAgICBkZWJ1ZyhGMTAxLCJ0dG9sIHdyaXRlIGVycm9yIiwiIixlcnJubyk7CisjaWZkZWYgRVdPVUxEQkxPQ0sKKwkgICAgaWYgKGVycm5vID09IEVXT1VMREJMT0NLKSB7CisJCW1zbGVlcCgxMCk7CisJCWNvbnRpbnVlOworCSAgICB9IGVsc2UKKyNlbmRpZiAvKiBFV09VTERCTE9DSyAqLworI2lmZGVmIFRDUFNPQ0tFVAorCSAgICBpZiAobmV0Y29ubiAmJiB0dG5ldCA9PSBORVRfVENQQikgeworCQlkZWJ1ZyhGMTAxLCJ0dG9sIFRDUCBlcnJvciIsIiIsZXJybm8pOworCQl0dGNsb3MoMCk7CQkvKiBDbG9zZSB0aGUgY29ubmVjdGlvbi4gKi8KKwkJeCA9IC0zOworCSAgICB9CisjZW5kaWYgLyogVENQU09DS0VUICovCisjaWZkZWYgQ0tYWENIQVIKKwkgICAgaWYgKHApIGZyZWUocCk7CisjZW5kaWYgLyogQ0tYWENIQVIgKi8KKwkgICAgcmV0dXJuKHgpOworCX0gZWxzZSB7CQkJLyogTm8gZXJyb3IsIHNvIHBhcnRpYWwgc3VjY2VzcyAqLworCSAgICBkZWJ1ZyhGMTAxLCJ0dG9sIHBhcnRpYWwiLCIiLHgpOyAvKiBUaGlzIG5ldmVyIGhhcHBlbnMgKi8KKwkgICAgcyArPSB4OwkJCS8qIFBvaW50IHRvIHBhcnQgbm90IHdyaXR0ZW4geWV0ICovCisJICAgIG4gLT0geDsJCQkvKiBBZGp1c3QgbGVuZ3RoICovCisJICAgIGlmICh4ID4gMCkgbXNsZWVwKDEwKTsJLyogV2FpdCAxMCBtc2VjICovCisJfQkJCQkvKiBHbyBiYWNrIGFuZCB0cnkgYWdhaW4gKi8KKyAgICB9CisjaWZkZWYgQ0tYWENIQVIKKyAgICBpZiAocCkgZnJlZShwKTsKKyNlbmRpZiAvKiBDS1hYQ0hBUiAqLworICAgIHJldHVybihuIDwgMSA/IGxlbiA6IC0xKTsJCS8qIFJldHVybiB0aGUgcmVzdWx0cyAqLworfQorCisvKiAgVCBUIE8gQyAgLS0gIE91dHB1dCBhIGNoYXJhY3RlciB0byB0aGUgY29tbXVuaWNhdGlvbiBsaW5lICAqLworCisvKgorIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgaW50ZXJhY3RpdmUsIGNoYXJhY3Rlci1tb2RlIG9wZXJhdGlvbnMsCisgbGlrZSB0ZXJtaW5hbCBjb25uZWN0aW9uLCBzY3JpcHQgZXhlY3V0aW9uLCBkaWFsZXIgaS9vLCB3aGVyZSB0aGUgb3ZlcmhlYWQKKyBvZiB0aGUgc2lnbmFscyBhbmQgYWxhcm1zIGRvZXMgbm90IGNyZWF0ZSBhIGJvdHRsZW5lY2suCisqLworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3R0b2MoY2hhciBjKQorI2Vsc2UKK3R0b2MoYykgY2hhciBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0dG9jICovIHsKKyNkZWZpbmUgVFRPQ19UTU8gMTUJCQkvKiBUaW1lb3V0IGluIGNhc2Ugd2UgZ2V0IHN0dWNrICovCisgICAgaW50IHh4LCBmZDsKKworICAgIGlmICh0dHlmZCA8IDApCQkJLyogQ2hlY2sgZm9yIG5vdCBvcGVuLiAqLworICAgICAgcmV0dXJuKC0xKTsKKworI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpcGUpCisgICAgICBmZCA9IGZkb3V0OworICAgIGVsc2UKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyAgICAgIGZkID0gdHR5ZmQ7CisKKyAgICBjICY9IDB4ZmY7CisgICAgLyogZGVidWcoRjEwMSwidHRvYyIsIiIsKENIQVIpIGMpOyAqLworICAgIHNhdmFsID0gc2lnbmFsKFNJR0FMUk0sdGltZXJoKTsJLyogRW5hYmxlIHRpbWVyIGludGVycnVwdCAqLworICAgIHh4ID0gYWxhcm0oVFRPQ19UTU8pOwkJLyogZm9yIHRoaXMgbWFueSBzZWNvbmRzLiAqLworICAgIGlmICh4eCA8IDApIHh4ID0gMDsJCQkvKiBTYXZlIG9sZCBhbGFybSB2YWx1ZS4gKi8KKyAgICAvKiBkZWJ1ZyhGMTAxLCJ0dG9jIGFsYXJtIiwiIix4eCk7ICovCisgICAgaWYgKAorI2lmZGVmIENLX1BPU0lYX1NJRworCXNpZ3NldGptcChzamJ1ZiwxKQorI2Vsc2UKKwlzZXRqbXAoc2pidWYpCisjZW5kaWYgLyogQ0tfUE9TSVhfU0lHICovCisJKSB7CQkvKiBUaW1lciB3ZW50IG9mZj8gKi8KKwl0dGltb2ZmKCk7CQkJLyogWWVzLCBjYW5jZWwgdGhpcyBhbGFybS4gKi8KKwlpZiAoeHggLSBUVE9DX1RNTyA+IDApIGFsYXJtKHh4IC0gVFRPQ19UTU8pOyAvKiBSZXN0b3JlIHByZXZpb3VzIG9uZSAqLworICAgICAgICAvKiBkZWJ1ZyhGMTAwLCJ0dG9jIHRpbWVvdXQiLCIiLDApOyAqLworI2lmZGVmIE5FVENPTk4KKwlpZiAoIW5ldGNvbm4pIHsKKyNlbmRpZiAvKiBORVRDT05OICovCisJICAgIGRlYnVnKEYxMDEsInR0b2MgdGltZW91dCIsIiIsYyk7CisJICAgIGlmICh0dGZsb3cgPT0gRkxPX1hPTlgpIHsKKwkJZGVidWcoRjEwMSwidHRvYyBmbG93IiwiIix0dGZsb3cpOyAvKiBNYXliZSB3ZSdyZSB4b2ZmJ2QgKi8KKyNpZm5kZWYgUGxhbjkKKyNpZmRlZiBQT1NJWAorCQkvKiBQT1NJWCB3YXkgdG8gdW5zdGljay4gKi8KKwkJZGVidWcoRjEwMCwidHRvYyB0Y2Zsb3ciLCIiLHRjZmxvdyh0dHlmZCxUQ09PTikpOworI2Vsc2UKKyNpZmRlZiBCU0Q0CQkJCS8qIEJlcmtlbGV5IHdheSB0byBkbyBpdC4gKi8KKyNpZmRlZiBUSU9DU1RBUlQKKy8qIC4uLi4gVXNlZCB0byBiZSAiaW9jdGwodHR5ZmQsIFRJT0NTVEFSVCwgMCk7Ii4gIFdobyBrbm93cz8gKi8KKwkJeworCQkgIGludCB4ID0gMDsKKwkJICBkZWJ1ZyhGMTAxLCJ0dG9jIFRJT0NTVEFSVCIsIiIsaW9jdGwodHR5ZmQsIFRJT0NTVEFSVCwgJngpKTsKKwkJfQorI2VuZGlmIC8qIFRJT0NTVEFSVCAqLworI2VuZGlmIC8qIEJTRDQgKi8KKwkJCQkJLyogSXMgdGhlcmUgYSBTeXMgViB3YXkgdG8gZG8gdGhpcz8gKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworI2VuZGlmIC8qIFBsYW45ICovCisJICAgIH0KKyNpZmRlZiBORVRDT05OCisgICAgICAgIH0KKyNlbmRpZiAvKiBORVRDT05OICovCisJcmV0dXJuKC0xKTsJCQkvKiBSZXR1cm4gZmFpbHVyZSBjb2RlLiAqLworICAgIH0gZWxzZSB7CisgICAgICAgIGludCByYzsKKyNpZmRlZiBCRU9TT1JCRUJPWAorI2lmZGVmIE5FVENPTk4KKyAgICAgICAgaWYgKG5ldGNvbm4gJiYgIXR0cGlwZSAmJiAhdHRwdHkpCisJICByYyA9IG5ldHRvYyhjKTsKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qICBCRU9TT1JCRUJPWCAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisJICBpZiAoVEVMT1BUX01FKFRFTE9QVF9FTkNSWVBUSU9OKSkKKwkgICAgY2tfdG5fZW5jcnlwdCgmYywxKTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjaWZkZWYgSUJNWDI1CisJLyogcmllaG06IG1heWJlIHRoaXMgaXNuJ3QgbmVjZXNzYXJ5IGFmdGVyIGFsbC4gVGVzdCBwcm9ncmFtCisJICogd29ya2VkIGZpbmUgd2l0aCBkYXRhIGJlaW5nIHNlbnQgYW5kIHJldHJpZXZlZCB3aXRoIG5vcm1hbAorCSAqIHJlYWQncyBhbmQgd3JpdGVzIQorCSAqLworCWlmICh0dG5ldCA9PSBORVRfSVgyNSkKKwkgIHJjID0geDI1d3JpdGUodHR5ZmQsJmMsMSk7IC8qIGFzIGFib3ZlIGZvciBYMjUgc3RyZWFtcyAqLworCWVsc2UKKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNpZmRlZiBDS19TU0wKKwkgIGlmIChzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnKSB7CisJICAgICAgaW50IGVycm9yOworCSAgICAgIC8qIFdyaXRlIHVzaW5nIFNTTCAqLworCSAgICAgIGlmIChzc2xfYWN0aXZlX2ZsYWcpCisgICAgICAgICAgICAgICAgcmMgPSBTU0xfd3JpdGUoc3NsX2NvbiwgJmMsIDEpOworCSAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByYyA9IFNTTF93cml0ZSh0bHNfY29uLCAmYywgMSk7CisJICAgICAgc3dpdGNoIChTU0xfZ2V0X2Vycm9yKHNzbF9hY3RpdmVfZmxhZz9zc2xfY29uOnRsc19jb24scmMpKXsKKwkJY2FzZSBTU0xfRVJST1JfTk9ORToKKwkJICBicmVhazsKKwkJY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKwkJY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorCQkgIHJjID0gMDsKKwkJICBicmVhazsKKwkJY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKwkJICBpZiAocmMgIT0gMCkKKwkJICAgIHJldHVybigtMSk7CisJCWNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisJCWNhc2UgU1NMX0VSUk9SX1NTTDoKKwkJY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisJCWRlZmF1bHQ6CisJCSAgdHRjbG9zKDApOworCQkgIHJldHVybigtMSk7CisJICAgICAgfQorCSAgfSBlbHNlCisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZkZWYgQ0tfS0VSQkVST1MKKyNpZmRlZiBLUkI0CisjaWZkZWYgUkxPR0NPREUKKwkgIGlmICh0dG5wcm90byA9PSBOUF9FSzRMT0dJTikgeworCSAgICAgIHJjID0gKGtyYjRfZGVzX3dyaXRlKHR0eWZkLCZjLDEpID09IDEpOworCSAgfSBlbHNlCisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNlbmRpZiAvKiBLUkI0ICovCisjaWZkZWYgS1JCNQorI2lmZGVmIFJMT0dDT0RFCisgICAgICAgICAgaWYgKHR0bnByb3RvID09IE5QX0VLNUxPR0lOKSB7CisgICAgICAgICAgICAgIHJjID0gKGtyYjVfZGVzX3dyaXRlKHR0eWZkLCZjLDEsMCkgPT0gMSk7CisgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBLUkI1X1UyVQorICAgICAgICAgIGlmICh0dG5wcm90byA9PSBOUF9LNVUyVSkgeworICAgICAgICAgICAgICByYyA9IChrcmI1X3UydV93cml0ZSh0dHlmZCwmYywxKSA9PSAxKTsKKyAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBLUkI1X1UyVSAqLworI2VuZGlmIC8qIEtSQjUgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCSAgICByYyA9IHdyaXRlKGZkLCZjLDEpOwkvKiBUcnkgdG8gd3JpdGUgdGhlIGNoYXJhY3Rlci4gKi8KKwlpZiAocmMgPCAxKSB7CQkJLyogRmFpbGVkICovCisJICAgIHR0aW1vZmYoKTsJCQkvKiBUdXJuIG9mZiB0aGUgYWxhcm0uICovCisJICAgIGFsYXJtKHh4KTsJCQkvKiBSZXN0b3JlIHByZXZpb3VzIGFsYXJtLiAqLworCSAgICBkZWJ1ZyhGMTAxLCJ0dG9jIGVycm5vIiwiIixlcnJubyk7IC8qIExvZyB0aGUgZXJyb3IsICovCisJICAgIHJldHVybigtMSk7CQkJLyogYW5kIHJldHVybiB0aGUgZXJyb3IgY29kZS4gKi8KKwl9CisgICAgfQorICAgIHR0aW1vZmYoKTsJCQkJLyogU3VjY2VzcywgdHVybiBvZmYgdGhlIGFsYXJtLiAqLworICAgIGFsYXJtKHh4KTsJCQkJLyogUmVzdG9yZSBwcmV2aW91cyBhbGFybS4gKi8KKyAgICByZXR1cm4oMCk7CQkJCS8qIFJldHVybiBnb29kIGNvZGUuICovCit9CisKKy8qICBUIFQgSSBOIEwgIC0tICBSZWFkIGEgcmVjb3JkICh1cCB0byBicmVhayBjaGFyYWN0ZXIpIGZyb20gY29tbSBsaW5lLiAgKi8KKy8qCisgIFJlYWRzIHVwIHRvICJtYXgiIGNoYXJhY3RlcnMgZnJvbSB0aGUgY29tbXVuaWNhdGlvbiBsaW5lLCB0ZXJtaW5hdGluZyBvbjoKKyAgICAoYSkgdGhlIHBhY2tldCBsZW5ndGggZmllbGQgaWYgdGhlICJ0dXJuIiBhcmd1bWVudCBpcyB6ZXJvLCBvcgorICAgIChiKSBvbiB0aGUgcGFja2V0LWVuZCBjaGFyYWN0ZXIgKGVvbCkgaWYgdGhlICJ0dXJuIiBhcmd1bWVudCBpcyBub256ZXJvCisgICAgKGMpIGEgY2VydGFpbiBudW1iZXIgb2YgQ3RybC1DJ3MgaW4gYSByb3cKKworICBSZXR1cm5zOgorICAgID49IDAsIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIHVwb24gc3VjY2VzczsKKyAgICAtMSBpZiAibWF4IiBleGNlZWRlZCwgdGltZW91dCwgb3Igb3RoZXIgY29ycmVjdGFibGUgZXJyb3I7CisgICAgLTIgb24gdXNlciBpbnRlcnJ1cHRpb24gKGMpOworICAgIC0zIG9uIGZhdGFsIGVycm9yIGxpa2UgY29ubmVjdGlvbiBsb3N0LgorCisgIFRoZSBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBpbnB1dCBhcmUgY29waWVkIGludG8gImRlc3QiIHdpdGggdGhlaXIgcGFyaXR5IGJpdHMKKyAgc3RyaXBwZWQgaWYgcGFyaXR5IHdhcyBzZWxlY3RlZC4gIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQuCisgIENoYXJhY3RlcnMgYWZ0ZXIgdGhlIGVvbCBhcmUgYXZhaWxhYmxlIHVwb24gdGhlIG5leHQgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorCisgIFRoZSBpZGVhIGlzIHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2Ygc3lzdGVtIGNhbGxzIHBlciBwYWNrZXQsIGFuZCBhbHNvIHRvCisgIG1pbmltaXplIHRpbWVvdXRzLiAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgcHJvdG9jb2wgYW5kIG11c3QKKyAgYmUgYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLiAgVGhlIGN1cnJlbnQgc3RyYXRlZ3kgaXMgdG8gdXNlIG15cmVhZCgpLgorCisgIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gY2FsbHMgcGFyY2hrKCksIHdoaWNoIGlzIGRlZmluZWQgaW4gYW5vdGhlciBtb2R1bGUuCisgIE5vcm1hbGx5LCBja3V0aW8uYyBkb2VzIG5vdCBkZXBlbmQgb24gY29kZSBmcm9tIGFueSBvdGhlciBtb2R1bGUsIGJ1dCB0aGVyZQorICBpcyBhbiBleGNlcHRpb24gaW4gdGhpcyBjYXNlIGJlY2F1c2UgYWxsIHRoZSBvdGhlciBjaz90aW8uYyBtb2R1bGVzIGFsc28KKyAgbmVlZCB0byBjYWxsIHBhcmNoaygpLCBzbyBpdCdzIGJldHRlciB0byBoYXZlIGl0IGRlZmluZWQgaW4gYSBjb21tb24gcGxhY2UuCisqLworI2lmZGVmIENUUkxDCisjdW5kZWYgQ1RSTEMKKyNlbmRpZiAvKiBDVFJMQyAqLworI2RlZmluZSBDVFJMQyAnXDAzJworLyoKKyAgV2UgaGF2ZSBmb3VyIGRpZmZlcmVudCBkZWNsYXJhdGlvbnMgaGVyZSBiZWNhdXNlOgorICAoYSkgdG8gYWxsb3cgS2VybWl0IHRvIGJlIGJ1aWx0IHdpdGhvdXQgdGhlIGF1dG9tYXRpYyBwYXJpdHkgc2Vuc2luZyBmZWF0dXJlCisgIChiKSBvbmUgb2YgZWFjaCB0eXBlIGZvciBBTlNJIEMsIG9uZSBmb3Igbm9uLUFOU0kuCisqLworCitzdGF0aWMgaW50IGNzYXZlID0gLTE7CisKKyNpZm5kZWYgTk9YRkVSCitpbnQKKyNpZmRlZiBQQVJTRU5TRQorI2lmZGVmIENLX0FOU0lDCit0dGlubChDSEFSICpkZXN0LCBpbnQgbWF4LGludCB0aW1vLCBDSEFSIGVvbCwgQ0hBUiBzdGFydCwgaW50IHR1cm4pCisjZWxzZQordHRpbmwoZGVzdCxtYXgsdGltbyxlb2wsc3RhcnQsdHVybikgaW50IG1heCx0aW1vLHR1cm47IENIQVIgKmRlc3QsIGVvbCwgc3RhcnQ7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyNlbHNlIC8qIG5vdCBQQVJTRU5TRSAqLworI2lmZGVmIENLX0FOU0lDCit0dGlubChDSEFSICpkZXN0LCBpbnQgbWF4LGludCB0aW1vLCBDSEFSIGVvbCkKKyNlbHNlCit0dGlubChkZXN0LG1heCx0aW1vLGVvbCkgaW50IG1heCx0aW1vOyBDSEFSICpkZXN0LCBlb2w7CisjZW5kaWYgLyogX19TRFRDX18gKi8KKyNlbmRpZiAvKiBQQVJTRU5TRSAqLworLyogdHRpbmwgKi8geworCisjaWZuZGVmIE1ZUkVBRAorICAgIENIQVIgY2gsIGR1bTsKKyNlbmRpZiAvKiBNWVJFQUQgKi8KKyNpZmRlZiBQQVJTRU5TRQorICAgIGludCBwa3RsZW4gPSAtMTsKKyAgICBpbnQgbHBsZW4gPSAwOworICAgIGludCBoYXZlbGVuID0gMDsKKyNlbmRpZiAvKiBQQVJTRU5TRSAqLworICAgIGludCBmZDsKKyAgICBpbnQgc29wbWFzayA9IDB4ZmY7CQkJLyogU3RhcnQtT2YtUGFja2V0IG1hc2sgKi8KKyNpZmRlZiBDS1hYQ0hBUgorICAgIGV4dGVybiBzaG9ydCBkYmx0W107CQkvKiBJZ25vcmUtY2hhcmFjdGVyIHRhYmxlICovCisgICAgZXh0ZXJuIGludCBpZ25mbGFnOworI2VuZGlmIC8qIENLWFhDSEFSICovCisjaWZkZWYgVENQU09DS0VUCisgICAgZXh0ZXJuIENIQVIgc3RjaHI7CisjZW5kaWYgLyogVENQU09DS0VUICovCisgICAgaW50IHg7CisjaWZkZWYgU1RSRUFNSU5HCisgICAgZXh0ZXJuIGludCBzdHJlYW1pbmc7CisgICAgZXh0ZXJuIGludCBzbmR0eXA7CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisKKyAgICBpZiAodHR5ZmQgPCAwKSByZXR1cm4oLTMpOyAgICAgICAgICAvKiBOb3Qgb3Blbi4gKi8KKworICAgIGRlYnVnKEYxMDEsInR0aW5sIG1heCIsIiIsbWF4KTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dGlubCB0aW1vIiwiIix0aW1vKTsKKworI2lmZGVmIE5FVENNRAorICAgIGlmICh0dHBpcGUpCisgICAgICBmZCA9IGZkaW47CisgICAgZWxzZQorI2VuZGlmIC8qIE5FVENNRCAqLworICAgICAgZmQgPSB0dHlmZDsKKworI2lmZGVmIENPTU1FTlQKKyAgICBpZiAoeGxvY2FsICYmIGNvbmNoaygpID4gMCkJCS8qIEFsbG93IGZvciBjb25zb2xlIGludGVycnVwdGlvbnMgKi8KKyAgICAgIHJldHVybigtMSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgKmRlc3QgPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgZGVzdGluYXRpb24gYnVmZmVyICovCisgICAgaWYgKHRpbW8gPCAwKSB0aW1vID0gMDsJCS8qIFNhZmV0eSAqLworICAgIGlmICh0aW1vKSB7CQkJCS8qIERvbid0IHRpbWUgb3V0IGlmIHRpbW8gPT0gMCAqLworCWludCB4eDsKKwlzYXZhbCA9IHNpZ25hbChTSUdBTFJNLHRpbWVyaCk7CS8qIEVuYWJsZSB0aW1lciBpbnRlcnJ1cHQgKi8KKwl4eCA9IGFsYXJtKHRpbW8pOwkJLyogU2V0IGl0LiAqLworCWRlYnVnKEYxMDEsInR0aW5sIGFsYXJtIiwiIix4eCk7CisgICAgfQorICAgIGlmICgKKyNpZmRlZiBDS19QT1NJWF9TSUcKKwlzaWdzZXRqbXAoc2pidWYsMSkKKyNlbHNlCisJc2V0am1wKHNqYnVmKQorI2VuZGlmIC8qIENLX1BPU0lYX1NJRyAqLworCSkgewkJCQkvKiBUaW1lciB3ZW50IG9mZj8gKi8KKwlkZWJ1ZyhGMTAwLCJ0dGlubCB0aW1vdXQiLCIiLDApOyAvKiBHZXQgaGVyZSBvbiB0aW1lb3V0LiAqLworCS8qIGRlYnVnKEYxMTAsIiB3aXRoIiwoY2hhciAqKSBkZXN0LDApOyAqLworCXR0aW1vZmYoKTsJCQkvKiBUdXJuIG9mZiB0aW1lciAqLworCXJldHVybigtMSk7CQkJLyogYW5kIHJldHVybiBlcnJvciBjb2RlLiAqLworICAgIH0gZWxzZSB7CisJcmVnaXN0ZXIgaW50IGksIG4gPSAtMTsJCS8qIGxvY2FsIHZhcmlhYmxlcyAqLworCWludCBjY24gPSAwOworI2lmZGVmIFBBUlNFTlNFCisJcmVnaXN0ZXIgaW50IGZsYWcgPSAwOworCWRlYnVnKEYwMDAsInR0aW5sIHN0YXJ0IiwiIixzdGFydCk7CisjZW5kaWYgLyogUEFSU0VOU0UgKi8KKworCXR0cG1zayA9IHR0cHJ0eSA/IDAxNzcgOiAwMzc3OwkvKiBTZXQgcGFyaXR5IHN0cmlwcGluZyBtYXNrLiAqLworCXNvcG1hc2sgPSBuZWVkcGNoayA/IDAxNzcgOiB0dHBtc2s7IC8qIEFuZCBTT1AgbWF0Y2hpbmcgbWFzay4gKi8KKworLyogTm93IHJlYWQgaW50byBkZXN0aW5hdGlvbiwgc3RyaXBwaW5nIHBhcml0eSBhbmQgbG9va2luZyBmb3IgdGhlICovCisvKiB0aGUgcGFja2V0IHRlcm1pbmF0b3IsIGFuZCBhbHNvIGZvciBzZXZlcmFsIEN0cmwtQydzIHR5cGVkIGluIGEgcm93LiAqLworCisJaSA9IDA7CQkJCS8qIERlc3RpbmF0aW9uIGluZGV4ICovCisJZGVidWcoRjEwMSwidHRpbmwgZW9sIiwiIixlb2wpOworCisJd2hpbGUgKGkgPCBtYXgtMSkgeworI2lmZGVmIE1ZUkVBRAorCSAgICAvKiBkZWJ1ZyhGMTAxLCJ0dGlubCBpIiwiIixpKTsgKi8KKwkgICAgZXJybm8gPSAwOworCSAgICBpZiAoY3NhdmUgPiAtMSkgeworCSAgICAgICAgbiA9IGNzYXZlOworCQlkZWJ1ZyhGMTAxLCJ0dGlubCB1bnNhdmluZyIsIiIsbik7CisJICAgIH0gZWxzZQorI2lmZGVmIENPTU1FTlQKKwkgICAgICBpZiAoeGxvY2FsICYmIGNvbmNoaygpID4gMCkgeworCQkgIC8qIEhlcmUgd2UgY291bGQgY2F0Y2gga2V5Ym9hcmQgaW50ZXJydXB0aW9ucy4gKi8KKwkJICAvKiBCdXQgdGhpcyB3b3VsZCBiZSBWRVJZIGV4cGVuc2l2ZS4gKi8KKwkJICAvKiBXZSBjb3VsZCBhbHNvIGRvIGl0IGluIG15cmVhZCgpIGJ1dCBpdCB3b3VsZCBiZSAqLworCQkgIC8qIGV4cGVuc2l2ZSB0aGVyZSB0b28gLS0gZXZlbiBpZiBkb25lIHdpdGggc2VsZWN0KCkuLi4gKi8KKwkgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCSAgICAgIGlmICgobiA9IG15cmVhZCgpKSA8IDApIHsJLyogVGltZW91dCBvciBpL28gZXJyb3I/ICovCisjaWZkZWYgREVCVUcKKwkJaWYgKGRlYmxvZykgeworCQkgICAgZGVidWcoRjEwMSwidHRpbmwgbXlyZWFkIGZhaWx1cmUsIG4iLCIiLG4pOworCQkgICAgZGVidWcoRjEwMSwidHRpbmwgbXlyZWFkIGVycm5vIiwiIixlcnJubyk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCQkvKiBEb24ndCBsZXQgRUlOVFIgYnJlYWsgcGFja2V0cy4gKi8KKwkJaWYgKG4gPT0gLTMpIHsKKwkJICAgIGlmIChlcnJubyA9PSBFSU5UUiAmJiBpID4gMCkgeworCQkJZGVidWcoRjExMSwidHRpbmwgRUlOVFIgbXlyZWFkIGkiLCJjb250aW51aW5nIixpKTsKKwkJCWNvbnRpbnVlOworCQkgICAgfSBlbHNlIHsKKwkJCWRlYnVnKEYxMTAsInR0aW5sIG5vbi1FSU5UUiAtMyIsImNsb3NpbmciLDApOworCQkJd2FzY2xvc2VkID0gMTsKKwkJCXR0aW1vZmYoKTsJLyogVHVybiBvZmYgdGltZXIgKi8KKwkJCXR0Y2xvcygwKTsKKwkJCXJldHVybihuKTsKKwkJICAgIH0KKwkJfSBlbHNlIGlmIChuID09IC0yICYmIG5ldGNvbm4gLyogJiYgdGltbyA9PSAwICovICkgeworCQkgICAgLyogSGVyZSB3ZSB0cnkgdG8gY2F0Y2ggYnJva2VuIG5ldHdvcmsgY29ubmVjdGlvbnMgKi8KKwkJICAgIC8qIGV2ZW4gd2hlbiBpb2N0bCgpIGFuZCByZWFkKCkgZG8gbm90IGNhdGNoIHRoZW0gKi8KKwkJICAgIGRlYnVnKEYxMTEsInR0aW5sIG5ldHdvcmsgbXlyZWFkIGZhaWx1cmUiLCJjbG9zaW5nIixuKTsKKwkJICAgIHdhc2Nsb3NlZCA9IDE7CisJCSAgICB0dGltb2ZmKCk7CisJCSAgICB0dGNsb3MoMCk7CisJCSAgICByZXR1cm4oLTMpOworCQl9CisjaWZkZWYgU1RSRUFNSU5HCisJCS8qIFN0cmVhbWluZyBhbmQgbm8gZGF0YSB0byByZWFkICovCisJCWVsc2UgaWYgKG4gPT0gMCAmJiBzdHJlYW1pbmcgJiYgc25kdHlwID09ICdEJykKKwkJICByZXR1cm4oMCk7CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisJCWJyZWFrOwkJCS8qIEJyZWFrIG91dCBvZiB3aGlsZSBsb29wICovCisJICAgIH0KKworI2Vsc2UgLyogbm90IE1ZUkVBRCAoaXMgdGhpcyBjb2RlIHVzZWQgYW55d2hlcmUgYW55IG1vcmU/KSAqLworCisJICAgIGlmIChjc2F2ZSA+IC0xKQkJLyogQ2hhciBzYXZlZCBmcm9tIGxhc3QgdGltZSAqLworCSAgICAgIGNoID0gY3NhdmU7CisJICAgIGVsc2UgaWYgKChuID0gcmVhZChmZCwgJmNoLCAxKSkgPCAxKQorCSAgICAgIGJyZWFrOwkJCS8qIEVycm9yIC0gYnJlYWsgb3V0IG9mIHdoaWxlIGxvb3AgKi8KKwkgICAgbiA9IGNoOworCisjZW5kaWYgLyogTVlSRUFEICovCisKKwkgICAgLyogR2V0IGhlcmUgd2l0aCBjaGFyIGluIG4gKi8KKworI2lmZGVmIENLX0VOQ1JZUFRJT04KKwkgICAgLyogSWYgY3NhdmUgPiAtMSB3ZSBhbHJlYWR5IGRlY3J5cHRlZCB0aGlzIGNoYXJhY3RlciAqLworCSAgICAvKiBTbyBkb24ndCBkZWNyeXB0IGl0IGFnYWluICovCisJICAgIGlmIChURUxPUFRfVShURUxPUFRfRU5DUllQVElPTikgJiYgY3NhdmUgPT0gLTEpIHsKKwkJQ0hBUiBjaCA9IG47CisJCWNrX3RuX2RlY3J5cHQoJmNoLDEpOworCQluID0gY2g7CisJICAgIH0KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisKKwkgICAgY3NhdmUgPSAtMTsJCQkvKiBVbmZsYWcgdGhhdCB3ZSB1bnNhdmVkIGEgY2hhciAqLworCisjaWZkZWYgVENQU09DS0VUCisJICAgIGlmIChuID09IElBQyAmJgkJLyogSGFuZGxlIFRlbG5ldCBvcHRpb25zICovCisJCSgoeGxvY2FsICYmIG5ldGNvbm4gJiYgSVNfVEVMTkVUKCkpIHx8CisJCSgheGxvY2FsICYmIHNzdGVsbmV0KSkpIHsKKwkJbiA9IHR0X3Rub3B0KG4pOworCQlpZiAobiA8IDApCisJCSAgcmV0dXJuKG4pOworI2lmbmRlZiBOT1BBUlNFTgorCQllbHNlIGlmIChuID09IDEpCisJCSAgc3RhcnQgPSBzdGNocjsKKyNlbmRpZiAvKiBOT1BBUlNFTiAqLworCQlpZiAobiAhPSAyNTUpCQkvKiBObyBkYXRhIC0gZ28gYmFjayBmb3IgbmV4dCBjaGFyICovCisJCSAgY29udGludWU7CisJICAgIH0JCQkJLyogUXVvdGVkIElBQyAtIGtlZXAgZ29pbmcgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNpZmRlZiBDS1hYQ0hBUgorCSAgICBpZiAoaWduZmxhZykKKwkgICAgICBpZiAoZGJsdFsodW5zaWduZWQpIG5dICYgMSkgLyogQ2hhcmFjdGVyIHRvIGlnbm9yZT8gKi8KKwkJY29udGludWU7CisjZW5kaWYgLyogQ0tYWENIQVIgKi8KKworLyoKKyAgVXNlIHBhcml0eSBtYXNrLCByYXRoZXIgdGhhbiBhbHdheXMgc3RyaXBwaW5nIHBhcml0eSwgdG8gY2hlY2sgZm9yCisgIGNhbmNlbGxhdGlvbi4gIE90aGVyd2lzZSwgcnVucyBsaWtlIFx4MDNceDgzXHgwMyBpbiBhIHBhY2tldCBjb3VsZCBjYW5jZWwKKyAgdGhlIHRyYW5zZmVyIHdoZW4gcGFyaXR5IGlzIE5PTkUuICAoTm90ZSB0aGF0IFx4MDNceDAzXHgwMyBpcyBleHRyZW1lbHkKKyAgdW5saWtlbHkgZHVlIHRvIHJ1bi1sZW5ndGggZW5jb2RpbmcuKQorKi8KKwkgICAgLyogQ2hlY2sgY2FuY2VsbGF0aW9uICovCisJICAgIGlmICgheGxvY2FsICYmIHhmcmNhbiAmJiAoKG4gJiB0dHBtc2spID09IHhmcmNocikpIHsKKwkJaWYgKCsrY2NuID49IHhmcm51bSkgewkvKiBJZiB4ZnJudW0gaW4gYSByb3csIGJhaWwgb3V0LiAqLworCQkgICAgaWYgKHRpbW8pIHsJCS8qIENsZWFyIHRpbWVyLiAqLworCQkJdHRpbW9mZigpOworCQkgICAgfQorCQkgICAgaWYgKHhmcmNociA8IDMyKQorCQkgICAgICBwcmludGYoIl4lYy4uLlxyXG4iLChjaGFyKSh4ZnJjaHIrNjQpKTsKKwkJICAgIGVsc2UKKwkJICAgICAgcHJpbnRmKCJDYW5jZWxlZC4uLlxyXG4iKTsKKwkJICAgIHJldHVybigtMik7CisJCX0KKwkgICAgfSBlbHNlIGNjbiA9IDA7CQkvKiBObyBjYW5jZWxsYXRpb24sIHJlc2V0IGNvdW50ZXIsICovCisKKyNpZmRlZiBQQVJTRU5TRQorCSAgICBpZiAoZmxhZyA9PSAwKSB7CQkvKiBGaW5kIHRoZSBTdGFydC1PZi1QYWNrZXQuICovCisJCWlmICgobiAmIHNvcG1hc2spID09IHN0YXJ0KSB7IC8qIEdvdCBpdCAqLworCQkgICAgZmxhZyA9IDE7CisJCX0gZWxzZSB7CQkvKiBLZWVwIGxvb2tpbmcuLi4gKi8KKwkJICAgIGRlYnVnKEYwMDAsInR0aW5sIHNraXBwaW5nIiwiIixuKTsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJICAgIH0KKwkgICAgZGVzdFtpKytdID0gbiAmIHR0cG1zazsKKy8qCisgIElmIHdlIGhhdmUgbm90IGJlZW4gaW5zdHJ1Y3RlZCB0byB3YWl0IGZvciBhIHR1cm5hcm91bmQgY2hhcmFjdGVyLCB3ZQorICBjYW4gZ28gYnkgdGhlIHBhY2tldCBsZW5ndGggZmllbGQuICBJZiB0dXJuICE9IDAsIHdlIG11c3Qgd2FpdCBmb3IgdGhlCisgIGVuZCBvZiBsaW5lIChlb2wpIGNoYXJhY3RlciBiZWZvcmUgcmV0dXJuaW5nLiAgVGhpcyBpcyBhbiBlZ3JlZ2lvdXMKKyAgdmlvbGF0aW9uIG9mIGFsbCBwcmluY2lwbGVzIG9mIGxheWVyaW5nLi4uCisqLworCSAgICBpZiAoIWhhdmVsZW4pIHsKKwkJaWYgKGkgPT0gMikgeworCQkgICAgcGt0bGVuID0geHVuY2hhcihkZXN0WzFdICYgMHg3Zik7CisJCSAgICBpZiAocGt0bGVuID4gMSkgeworCQkJaGF2ZWxlbiA9IDE7CisJCQlkZWJ1ZyhGMTAxLCJ0dGlubCBsZW5ndGgiLCIiLHBrdGxlbik7CisJCSAgICB9CisJCX0gZWxzZSBpZiAoaSA9PSA1ICYmIHBrdGxlbiA9PSAwKSB7CisJCSAgICBscGxlbiA9IHh1bmNoYXIoZGVzdFs0XSAmIDB4N2YpOworCQl9IGVsc2UgaWYgKGkgPT0gNiAmJiBwa3RsZW4gPT0gMCkgeworCQkgICAgcGt0bGVuID0gbHBsZW4gKiA5NSArIHh1bmNoYXIoZGVzdFs1XSAmIDB4N2YpICsgNTsKKwkJICAgIGhhdmVsZW4gPSAxOworCQkgICAgZGVidWcoRjEwMSwidHRpbmwgZXh0ZW5kZWQgbGVuZ3RoIiwiIixwa3RsZW4pOworCQl9CisJICAgIH0KKworLyoKKyAgU3VwcG9zZSB3ZSBsb29rZWQgYXQgdGhlIHNlcXVlbmNlIG51bWJlciBoZXJlIGFuZCBmb3VuZCBpdCB3YXMgb3V0IG9mCisgIHJhbmdlPyAgVGhpcyB3b3VsZCBtZWFuIGVpdGhlciAoYSkgaW5jb21pbmcgcGFja2V0cyBoYWQgU09QIHVucHJlZml4ZWQKKyAgYW5kIHdlIGFyZSBvdXQgb2Ygc3luYywgb3IgKGIpIHRoZSBwYWNrZXQgaXMgZGFtYWdlZC4gIFNpbmNlIChhKSBpcyBiYWQKKyAgcHJhY3RpY2UsIGxldCdzIGlnbm9yZSBpdC4gIFNvIHdoYXQgc2hvdWxkIHdlIGRvIGhlcmUgaWYgd2Uga25vdyB0aGUKKyAgcGFja2V0IGlzIGRhbWFnZWQ/CisKKyAgIDEuIE5vdGhpbmcgLS0ga2VlcCB0cnlpbmcgdG8gcmVhZCB0aGUgcGFja2V0IHRpbGwgd2UgZmluZCB3aGF0IHdlIHRoaW5rCisgICAgICBpcyB0aGUgZW5kLCBvciB3ZSB0aW1lIG91dCwgYW5kIGxldCB0aGUgdXBwZXIgbGF5ZXIgZGVjaWRlIHdoYXQgdG8KKyAgICAgIGRvLiAgQnV0IHNpbmNlIGVpdGhlciB0aGUgcGFja2V0IGlzIGNvcnJ1cHQgb3Igd2UgYXJlIG91dCBvZiBzeW5jLAorICAgICAgb3VyIGNyaXRlcmlvbiBmb3IgZmluZGluZyB0aGUgZW5kIGRvZXMgbm90IGFwcGx5IGFuZCB3ZSBhcmUgbGlrZWx5CisgICAgICB0byB0aW1lIG91dCAob3Igc3dhbGxvdyBhIHBpZWNlIG9mIHRoZSBuZXh0IHBhY2tldCkgaWYgb3VyIGFzc3VtZWQKKyAgICAgIGxlbmd0aCBpcyB0b28gbG9uZy4gIChUaGlzIHdhcyB0aGUgYmVoYXZpb3IgcHJpb3IgdG8gdmVyc2lvbiA3LjAuKQorCisgICAyLiBzZXQgZmxhZyA9IDAgYW5kIGNvbnRpbnVlPyAgVGhpcyB3b3VsZCBmb3JjZSB1cyB0byB3YWl0IGZvciB0aGUKKyAgICAgIG5leHQgcGFja2V0IHRvIGNvbWUgaW4sIGFuZCB0aGVyZWZvcmUgKGluIHRoZSBub253aW5kb3dpbmcgY2FzZSksCisgICAgICB3b3VsZCBmb3JjZSBhIHRpbWVvdXQgaW4gdGhlIG90aGVyIEtlcm1pdC4KKworICAgMy4gc2V0IGZsYWcgPSAwIGFuZCBjb250aW51ZSwgYnV0IG9ubHkgaWYgdGhlIHdpbmRvdyBzaXplIGlzID4gMSBhbmQKKyAgICAgIHRoZSB3aW5kb3cgaXMgbm90IGJsb2NrZWQ/ICBUYWxrIGFib3V0IGNoZWF0aW5nIQorCisgICA0LiBSZXR1cm4gYSBmYWlsdXJlIGNvZGUgYW5kIGxldCB0aGUgdXBwZXIgbGF5ZXIgZGVjaWRlIHdoYXQgdG8gZG8uCisgICAgICBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIDMsIGJ1dCB3aXRob3V0IHRoZSBjaGVhdGluZy4gIFNvIGxldCdzCisgICAgICBkbyBpdCB0aGF0IHdheS4uLiAgQnV0IG5vdGUgdGhhdCB3ZSBtdXN0IGlnbm9yZSB0aGUgcGFyaXR5IGJpdAorICAgICAgaW4gY2FzZSB0aGlzIGlzIHRoZSBmaXJzdCBwYWNrZXQgYW5kIHdlIGhhdmUgbm90IHlldCBydW4gcGFyY2hrKCkuCisqLworCSAgICBpZiAoaSA9PSAzKSB7CQkvKiBQZWVrIGF0IHNlcXVlbmNlIG51bWJlciAqLworCQl4ID0geHVuY2hhcigoZGVzdFtpLTFdICYgMHg3ZikpOyAvKiBJZiBpdCdzIG5vdCBpbiByYW5nZS4uLiAqLworCQlpZiAoeCA8IDAgfHwgeCA+IDYzKSB7CisJCSAgICBkZWJ1ZyhGMTExLCJ0dGlubCBiYWQgc2VxIixkZXN0LHgpOworCQkgICAgaWYgKHRpbW8pIHR0aW1vZmYoKTsKKwkJICAgIHJldHVybigtMSk7CQkvKiByZXR1cm4gYSBub25mYXRhbCBlcnJvciAqLworCQl9CisJICAgIH0KKworI2Vsc2UgLyogUEFSU0VOU0UgKi8KKwkgICAgZGVzdFtpKytdID0gbiAmIHR0cG1zazsKKyNlbmRpZiAvKiBQQVJTRU5TRSAqLworCisgICAgLyogQ2hlY2sgZm9yIGVuZCBvZiBwYWNrZXQgKi8KKworCSAgICBpZiAoCisjaWZkZWYgUEFSU0VOU0UKKy8qCisgIFB1cmVseSBsZW5ndGgtZHJpdmVuIGlmIFNFVCBIQU5EU0hBS0UgTk9ORSAoaS5lLiB0dXJuID09IDApLgorICBUaGlzIGFsbG93cyBwYWNrZXQgdGVybWluYXRvcnMgYW5kIGhhbmRzaGFrZSBjaGFyYWN0ZXJzIHRvIGFwcGVhcgorICBsaXRlcmFsbHkgaW5zaWRlIGEgcGFja2V0IGRhdGEgZmllbGQuCisqLworCQkoaGF2ZWxlbiAmJiAoaSA+IHBrdGxlbisxKSAmJgorCQkgKCF0dXJuIHx8ICh0dXJuICYmIChuICYgMHg3ZikgPT0gdHVybikpKSAvKiAodHVybiwgbm90IGVvbCkgKi8KKyNlbHNlIC8qICFQQVJTRU5TRSAqLworLyoKKyAgQnVpbHQgd2l0aG91dCBQQVJTRU5TRSwgc28ganVzdCBsb29rIGZvciBwYWNrZXQgdGVybWluYXRvci4KKyovCisJCSgobiAmIDB4N2YpID09IGVvbCkKKyNlbmRpZiAvKiBQQVJTRU5TRSAqLworCQkpIHsKKyNpZm5kZWYgUEFSU0VOU0UKKwkJZGVidWcoRjEwMSwidHRpbmwgZ290IGVvbCIsIiIsZW9sKTsgLyogKG9yIHR1cm4pICovCisJCWRlc3RbaV0gPSAnXDAnOwkJLyogWWVzLCB0ZXJtaW5hdGUgdGhlIHN0cmluZywgKi8KKwkJLyogZGVidWcoRjEwMSwidHRpbmwgaSIsIiIsaSk7ICovCisjZWxzZQorI2lmZGVmIERFQlVHCisJCWlmIChkZWJsb2cpIHsKKwkJICAgIGlmICgobiAmIDB4N2YpICE9IGVvbCkgeworCQkJZGVidWcoRjEwMSwidHRpbmwgRU9QIGxlbmd0aCIsIiIscGt0bGVuKTsKKwkJCWRlYnVnKEYxMDEsInR0aW5sIGkiLCIiLGkpOworI2lmZGVmIE1ZUkVBRAorI2lmZGVmIFBBUlNFTlNFCisvKgorICBXZSByZWFkIGEgcGFja2V0IGJhc2VkIG9uIGl0cyBsZW5ndGguICBUaGlzIGxlYXZlcyB0aGUgRU9QIGNoYXJhY3RlciBzdGlsbAorICB1bnJlYWQsIGFuZCBzbyB0dGNoaygpIHdpbGwgYWx3YXlzIHJldHVybiBhdCBsZWFzdCAxIGJlY2F1c2Ugb2YgdGhpcy4gIEJ1dAorICBpZiB3ZSBrbm93IGl0IGlzIHRoZXJlLCB3ZSBjYW4gc2FmZWx5IGdldCByaWQgb2YgaXQuICBTby4uLgorKi8KKwkJCXsKKwkJCSAgICBpbnQgeDsKKwkJCSAgICB3aGlsZSAobXlfY291bnQgPiAwKSB7CisJCQkJeCA9IHR0aW5jKDApOworCQkJCS8qIFN0YXJ0IG9mIG5leHQgcGFja2V0ICovCisJCQkJaWYgKHggPT0gc3RhcnQpIHsgLyogU2F2ZSBmb3IgbmV4dCB0aW1lICovCisJCQkJICAgIGNzYXZlID0gKHVuc2lnbmVkKSgodW5zaWduZWQpeCAmIDB4ZmYpOworCQkJCSAgICBkZWJ1ZyhGMDAwLCJ0dGlubCBjc2F2ZWQiLCIiLHgpOworCQkJCSAgICBicmVhazsKKwkJCQl9CisJCQkJZGVidWcoRjAwMCwidHRpbmwgcmVtb3ZlZCIsIiIseCk7CisJCQkgICAgfQorCQkJfQorI2VuZGlmIC8qIFBBUlNFTlNFICovCisjZW5kaWYgLyogTVlSRUFEICovCisKKwkJICAgIH0gZWxzZSBkZWJ1ZyhGMTAxLCJ0dGlubCBnb3QgZW9sIiwiIixlb2wpOyAvKiAob3IgdHVybikgKi8KKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisJCWRlc3RbaV0gPSAnXDAnOwkJLyogVGVybWluYXRlIHRoZSBzdHJpbmcsICovCisJICAgICAgICBpZiAobmVlZHBjaGspIHsJCS8qIFBhcml0eSBjaGVja2VkIHlldD8gKi8KKwkJICAgIGlmICh0dHBydHkgPT0gMCkgewkvKiBObywgY2hlY2suICovCisJCQlpZiAoKHR0cHJ0eSA9IHBhcmNoayhkZXN0LHN0YXJ0LGkpKSA+IDApIHsKKwkJCSAgICBpbnQgajsKKwkJCSAgICBkZWJ1ZyhGMTAxLCJ0dGlubCBzZW5zZXMgcGFyaXR5IiwiIix0dHBydHkpOworCQkJICAgIGRlYnVnKEYxMTAsInR0aW5sIHBhY2tldCBiZWZvcmUiLGRlc3QsMCk7CisJCQkgICAgdHRwbXNrID0gMHg3ZjsKKwkJCSAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJICAgICAgZGVzdFtqXSAmPSAweDdmOwkvKiBTdHJpcCBwYXJpdHkgZnJvbSBwYWNrZXQgKi8KKwkJCSAgICBkZWJ1ZyhGMTEwLCJ0dGlubCBwYWNrZXQgYWZ0ZXIgIixkZXN0LDApOworCQkJfSBlbHNlIHR0cHJ0eSA9IDA7IC8qIFJlc3RvcmUgaWYgcGFyY2hrIGVycm9yICovCisJCSAgICB9CisJCSAgICBzb3BtYXNrID0gdHRwcnR5OworCQkgICAgbmVlZHBjaGsgPSAwOworCQl9CisjZW5kaWYgLyogUEFSU0VOU0UgKi8KKwkJaWYgKHRpbW8pIHsJCS8qIFR1cm4gb2ZmIHRpbWVyLiAqLworCQkgICAgdHRpbW9mZigpOworCQl9CisjaWZkZWYgQ09NTUVOVAorCQlkZWJ1ZyhGMDExLCJ0dGlubCBnb3QiLCBkZXN0LCAoaSA8IDYwKSA/IGkgOiAtNjApOworI2Vsc2UgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgIGhleGR1bXAoInR0aW5sIGdvdCIsZGVzdCxpKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisjaWZkZWYgU1RSRUFNSU5HCisJCS8qIHR0aW5sKCkgd2FzIGNhbGxlZCBiZWNhdXNlIHRoZXJlIHdhcyBub24tcGFja2V0ICovCisJCS8qIGRhdGEgc2l0dGluZyBpbnQgdGhlIGNoYW5uZWwuICBJZ25vcmUgaXQuICAgICAgICovCisJCWlmIChzdHJlYW1pbmcgJiYgc25kdHlwID09ICdEJykKKwkJICByZXR1cm4oLTEpOworI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCQlyZXR1cm4oaSk7CisJICAgIH0KKwl9IC8qIEVuZCBvZiB3aGlsZSgpICovCisJdHRpbW9mZigpOworCXJldHVybihuKTsKKyAgICB9Cit9CisjZW5kaWYgLyogTk9YRkVSICovCisKKy8qICBUIFQgSSBOIEMgLS0gIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgY29tbXVuaWNhdGlvbiBsaW5lICAqLworLyoKKyBPbiBzdWNjZXNzLCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgdGhhdCB3YXMgcmVhZCwgPj0gMC4KKyBPbiBmYWlsdXJlLCByZXR1cm5zIC0xIG9yIG90aGVyIG5lZ2F0aXZlIG15cmVhZCBlcnJvciBjb2RlLAorICAgb3IgLTIgaWYgY29ubmVjdGlvbiBpcyBicm9rZW4gb3IgdHR5ZmQgPCAwLgorICAgb3IgLTMgaWYgc2Vzc2lvbiBsaW1pdCBoYXMgZXhwaXJlZCwKKyAgIG9yIC00IGlmIHNvbWV0aGluZyBvciBvdGhlci4uLgorIE5PVEU6IFRoZSBBUEkgZG9lcyBub3QgcHJvdmlkZSBmb3IgdHRpbmMoKSByZXR1cm5pbmcgYSBzcGVjaWFsIGNvZGUKKyB1cG9uIHRpbWVvdXQsIGJ1dCB3ZSBuZWVkIGl0LiAgU28gZm9yIHRoaXMgd2UgaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSwKKyB0dGluY3RpbW8uCisqLworc3RhdGljIGludCB0dGluY3RpbW8gPSAwOwkJLyogWXVrICovCisKK2ludAordHRpbmModGltbykgaW50IHRpbW87IHsKKworICAgIGludCBuID0gMCwgZmQ7CisgICAgaW50IGlzX3RuID0gMDsKKyAgICBDSEFSIGNoID0gMDsKKworICAgIHR0aW5jdGltbyA9IDA7CisKKyAgICBpZiAodHR5ZmQgPCAwKSByZXR1cm4oLTIpOyAgICAgICAgICAvKiBOb3Qgb3Blbi4gKi8KKworICAgIGlzX3RuID0gKHhsb2NhbCAmJiBuZXRjb25uICYmIElTX1RFTE5FVCgpKSB8fAorCSAgICAoIXhsb2NhbCAmJiBzc3RlbG5ldCk7CisKKyNpZmRlZiBUVExFQlVGCisgICAgaWYgKHR0cHVzaCA+PSAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsInR0aW5jIiwidHRwdXNoIix0dHB1c2gpOworICAgICAgICBjaCA9IHR0cHVzaDsKKyAgICAgICAgdHRwdXNoID0gLTE7CisgICAgICAgIHJldHVybihjaCk7CisgICAgfQorICAgIGlmIChsZV9kYXRhKSB7CisgICAgICAgIGlmIChsZV9nZXRjaGFyKCZjaCkgPiAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ0dGluYyBsZV9nZXRjaGFyIiwiY2giLGNoKTsKKyAgICAgICAgICAgIHJldHVybihjaCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVFRMRUJVRiAqLworCisjaWZkZWYgTkVUQ01ECisgICAgaWYgKHR0cGlwZSkKKyAgICAgIGZkID0gZmRpbjsKKyAgICBlbHNlCisjZW5kaWYgLyogTkVUQ01EICovCisgICAgICBmZCA9IHR0eWZkOworCisgICAgaWYgKCh0aW1vIDw9IDApCQkJLyogVW50aW1lZC4gKi8KKyNpZmRlZiBNWVJFQUQKKwl8fCAobXlfY291bnQgPiAwKQkJLyogQnVmZmVyZWQgY2hhciBhbHJlYWR5IHdhaXRpbmcuICovCisjZW5kaWYgLyogTVlSRUFEICovCisJKSB7CisjaWZkZWYgTVlSRUFECisgICAgICAgIC8qIENvbW0gbGluZSBmYWlsdXJlIHJldHVybnMgLTEgdGhydSBteXJlYWQsIHNvIG5vICY9IDAzNzcgKi8KKwluID0gbXlyZWFkKCk7CQkJLyogV2FpdCBmb3IgYSBjaGFyYWN0ZXIuLi4gKi8KKwkvKiBkZWJ1ZyhGMDAwLCJ0dGluYyBNWVJFQUQgbiIsIiIsbik7ICovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorCS8qIGRlYnVnKEYxMDEsInR0aW5jIHVfZW5jcnlwdCIsIiIsVEVMT1BUX1UoVEVMT1BUX0VOQ1JZUFRJT04pKTsgKi8KKwlpZiAoVEVMT1BUX1UoVEVMT1BUX0VOQ1JZUFRJT04pICYmIG4gPj0gMCkgeworCSAgICBjaCA9IG47CisJICAgIGNrX3RuX2RlY3J5cHQoJmNoLDEpOworCSAgICBuID0gY2g7CisJfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKworI2lmZGVmIE5FVFBUWQorCWlmICh0dHB0eSAmJiBuIDwgMCkgeworCSAgICBkZWJ1ZyhGMTAxLCJ0dGluYyBlcnJvciBvbiBwdHkiLCIiLG4pOworCSAgICB0dGNsb3MoMCk7CisJICAgIHJldHVybihuKTsKKwl9CisjZW5kaWYgLyogTkVUUFRZICovCisKKyNpZmRlZiBUTkNPREUKKwlpZiAoKG4gPiAtMSkgJiYgaXNfdG4pCisJICByZXR1cm4oKHVuc2lnbmVkKShuICYgMHhmZikpOworCWVsc2UKKyNlbmRpZiAvKiBUTkNPREUgKi8KKwkgIHJldHVybihuIDwgMCA/IG4gOiAodW5zaWduZWQpKG4gJiB0dHBtc2spKTsKKworI2Vsc2UgIC8qIE1ZUkVBRCAqLworCisgICAgICAgIHdoaWxlICgobiA9IHJlYWQoZmQsJmNoLDEpKSA9PSAwKSAvKiBXYWl0IGZvciBhIGNoYXJhY3Rlci4gKi8KKyAgICAgICAgLyogU2hvdWxkbid0IGhhdmUgdG8gbG9vcCBpbiB2ZXIgNUEuICovCisjaWZkZWYgTkVUQ09OTgorCSAgaWYgKG5ldGNvbm4pIHsJCS8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIG5ldCAqLworCSAgICAgIG5ldGNsb3MoKTsJCS8qIElmIHJlYWQoKSByZXR1cm5zIDAgaXQgbWVhbnMgKi8KKwkgICAgICBuZXRjb25uID0gMDsJCS8qIHRoZSBjb25uZWN0aW9uIGhhcyBkcm9wcGVkLiAqLworCSAgICAgIGVycm5vID0gRU5PVENPTk47CisJICAgICAgcmV0dXJuKC0yKTsKKwkgIH0KKyNlbmRpZiAvKiBORVRDT05OICovCisJICA7CisJLyogZGVidWcoRjEwMSwidHRpbmMiLCIiLGNoKTsgKi8KKyNpZmRlZiBUTkNPREUKKwlpZiAoKG4gPiAwKSAmJiBpc190bikgeworI2lmZGVmIENLX0VOQ1JZUFRJT04KKwkgICAgaWYgKFRFTE9QVF9VKFRFTE9QVF9FTkNSWVBUSU9OKSkgeworCQlja190bl9kZWNyeXB0KCZjaCwxKTsKKwkJbiA9IGNoOworCSAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworCSAgICByZXR1cm4oKHVuc2lnbmVkKShjaCAmIDB4ZmYpKTsKKwl9IGVsc2UKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICAgICAgcmV0dXJuKChuIDwgMCkgPyAtNCA6ICgobiA9PSAwKSA/IC0xIDogKHVuc2lnbmVkKShjaCAmIHR0cG1zaykpKTsKKyNlbmRpZiAvKiBNWVJFQUQgKi8KKworICAgIH0gZWxzZSB7CQkJCS8qIFRpbWVkIHJlYWQgKi8KKworCWludCBvbGRhbGFybTsKKwlzYXZhbCA9IHNpZ25hbChTSUdBTFJNLHRpbWVyaCk7CS8qIFNldCB1cCBoYW5kbGVyLCBzYXZlIG9sZCBvbmUuICovCisJb2xkYWxhcm0gPSBhbGFybSh0aW1vKTsJCS8qIFNldCBhbGFybSwgc2F2ZSBvbGQgb25lLiAqLworCWlmICgKKyNpZmRlZiBDS19QT1NJWF9TSUcKKwkgICAgc2lnc2V0am1wKHNqYnVmLDEpCisjZWxzZQorCSAgICBzZXRqbXAoc2pidWYpCisjZW5kaWYgLyogQ0tfUE9TSVhfU0lHICovCisJICAgICkgewkJCQkvKiBUaW1lciBleHBpcmVkICovCisJICAgIHR0aW5jdGltbyA9IDE7CisJICAgIG4gPSAtMTsJCQkvKiBzZXQgZmxhZyAqLworCX0gZWxzZSB7CisjaWZkZWYgTVlSRUFECisJICAgIG4gPSBteXJlYWQoKTsJCS8qIElmIG1hbmFnaW5nIG93biBidWZmZXIuLi4gKi8KKwkgICAgZGVidWcoRjEwMSwidHRpbmMgbXlyZWFkIiwiIixuKTsKKwkgICAgY2ggPSBuOworI2Vsc2UKKwkgICAgbiA9IHJlYWQoZmQsJmNoLDEpOwkJLyogT3RoZXJ3aXNlIGNhbGwgdGhlIHN5c3RlbS4gKi8KKwkgICAgaWYgKG4gPT0gMCkgbiA9IC0xOworCSAgICBkZWJ1ZyhGMTAxLCJ0dGluYyByZWFkIiwiIixuKTsKKyNlbmRpZiAvKiBNWVJFQUQgKi8KKworI2lmZGVmIENLX0VOQ1JZUFRJT04KKwkgICAgaWYgKFRFTE9QVF9VKFRFTE9QVF9FTkNSWVBUSU9OKSAmJiBuID49IDApIHsKKwkJY2tfdG5fZGVjcnlwdCgmY2gsMSk7CisJICAgIH0KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisJICAgIGlmIChuID49IDApCisJICAgICAgbiA9ICh1bnNpZ25lZCkgKGNoICYgMHhmZik7CisJICAgIGVsc2UKKwkgICAgICBuID0gKG4gPCAwKSA/IC00IDogLTI7CS8qIFNwZWNpYWwgcmV0dXJuIGNvZGVzLiAqLworCX0KKwl0dGltb2ZmKCk7CQkJLyogVHVybiBvZmYgdGhlIHRpbWVyICovCisJaWYgKG9sZGFsYXJtID4gMCkgeworCSAgICBpZiAobiA9PSAtMSkJCS8qIGFuZCByZXN0b3JlIGFueSBwcmV2aW91cyBhbGFybSAqLworCSAgICAgIG9sZGFsYXJtIC09IHRpbW87CisJICAgIGlmIChvbGRhbGFybSA8IDApCQkvKiBhZGp1c3RlZCBieSBvdXIgdGltZW91dCBpbnRlcnZhbCAqLworCSAgICAgIG9sZGFsYXJtID0gMDsKKwkgICAgaWYgKG9sZGFsYXJtKSB7CisJICAgICAgICBkZWJ1ZyhGMTAxLCJ0dGluYyByZXN0b3Jpbmcgb2xkYWxhcm0iLCIiLG9sZGFsYXJtKTsKKwkJYWxhcm0ob2xkYWxhcm0pOworCSAgICB9CisJfQorI2lmZGVmIE5FVENPTk4KKwlpZiAobmV0Y29ubikgeworCSAgICBpZiAobiA9PSAtMikgewkJLyogcmVhZCgpIHJldHVybnMgMCAqLworCQluZXRjbG9zKCk7CQkvKiBvbiBuZXR3b3JrIHJlYWQgZmFpbHVyZSAqLworCQluZXRjb25uID0gMDsKKwkJZXJybm8gPSBFTk9UQ09OTjsKKwkgICAgfQorCX0KKyNlbmRpZgkvKiBORVRDT05OICovCisjaWZkZWYgVE5DT0RFCisJaWYgKChuID4gLTEpICYmIGlzX3RuKQorCSAgcmV0dXJuKCh1bnNpZ25lZCkobiAmIDB4ZmYpKTsKKwllbHNlCisjZW5kaWYgLyogVE5DT0RFICovCisJICAvKiBSZXR1cm4gbWFza2VkIGNoYXIgb3IgbmVnLiAqLworCSAgcmV0dXJuKCAobiA8IDApID8gbiA6ICh1bnNpZ25lZCkobiAmIHR0cG1zaykgKTsKKyAgICB9Cit9CisKKy8qICBTIE4gRCBCIFIgSyAgLS0gIFNlbmQgYSBCUkVBSyBzaWduYWwgb2YgdGhlIGdpdmVuIGR1cmF0aW9uICAqLworCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK3NuZGJyayhpbnQgbXNlYykgewkJCS8qIEFyZ3VtZW50IGlzIG1pbGxpc2Vjb25kcyAqLworI2Vsc2UKK3NuZGJyayhtc2VjKSBpbnQgbXNlYzsgeworI2VuZGlmIC8qIENLX0FOU0lDICovCisjaWZuZGVmIFBPU0lYCisgICAgaW50IHgsIG47CisjZW5kaWYgLyogUE9TSVggKi8KKworI2lmZGVmIE9YT1MKKyNkZWZpbmUgQlNEQlJFQUsKKyNlbmRpZiAvKiBPWE9TICovCisKKyNpZmRlZiBBTllCU0QKKyNkZWZpbmUgQlNEQlJFQUsKKyNlbmRpZiAvKiBBTllCU0QgKi8KKworI2lmZGVmIEJTRDQ0CisjZGVmaW5lIEJTREJSRUFLCisjZW5kaWYgLyogQlNENDQgKi8KKworI2lmZGVmIENPSEVSRU5UCisjaWZkZWYgQlNEQlJFQUsKKyN1bmRlZiBCU0RCUkVBSworI2VuZGlmIC8qIEJTREJSRUFLICovCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKworI2lmZGVmIEJFTExWMTAKKyNpZmRlZiBCU0RCUkVBSworI3VuZGVmIEJTREJSRUFLCisjZW5kaWYgLyogQlNEQlJFQUsgKi8KKyNlbmRpZiAvKiBCRUxMVjEwICovCisKKyNpZmRlZiBQUk9WWDEKKyAgICBjaGFyIHNwZDsKKyNlbmRpZiAvKiBQUk9WWDEgKi8KKworICAgIGRlYnVnKEYxMDEsInR0c25kYiB0dHlmZCIsIiIsdHR5ZmQpOworICAgIGlmICh0dHlmZCA8IDApIHJldHVybigtMSk7ICAgICAgICAgIC8qIE5vdCBvcGVuLiAqLworCisjaWZkZWYgUGxhbjkKKyAgICByZXR1cm4gcDlzbmRicmsobXNlYyk7CisjZWxzZQorI2lmZGVmIE5FVENPTk4KKyNpZmRlZiBORVRDTUQKKyAgICBpZiAodHRwaXBlKQkJCQkvKiBQaXBlICovCisgICAgICByZXR1cm4odHRvYygnXDAnKSk7CisjZW5kaWYgLyogTkVUQ01EICovCisjaWZkZWYgTkVUUFRZCisgICAgaWYgKHR0cHR5KQorICAgICAgcmV0dXJuKHR0b2MoJ1wwJykpOworI2VuZGlmIC8qIE5FVFBUWSAqLworICAgIGlmIChuZXRjb25uKSAJCQkvKiBTZW5kIG5ldHdvcmsgQlJFQUsgKi8KKyAgICAgIHJldHVybihuZXRicmVhaygpKTsKKyNlbmRpZiAvKiBORVRDT05OICovCisKKyAgICBpZiAobXNlYyA8IDEgfHwgbXNlYyA+IDUwMDApIHJldHVybigtMSk7IC8qIEJhZCBhcmd1bWVudCAqLworCisjaWZkZWYgUE9TSVgJCQkJLyogRWFzeSBpbiBQT1NJWCAqLworICAgIHsKKwlpbnQgeDsKKwlkZWJ1ZyhGMTExLCJzbmRicmsgUE9TSVgiLGNraXRvYShtc2VjKSwobXNlYy8zNzUpKTsKKwllcnJubyA9IDA7CisJeCA9IHRjc2VuZGJyZWFrKHR0eWZkLG1zZWMgLyAzNzUpOworCWRlYnVnKEYxMTEsInNuZGJyayB0Y3NlbmRicmVhayIsY2tpdG9hKGVycm5vKSx4KTsKKwlyZXR1cm4oeCk7CisgICAgfQorI2Vsc2UKKyNpZmRlZiBQUk9WWDEKKyAgICBndHR5KHR0eWZkLCZ0dGJ1Zik7ICAgICAgICAgICAgICAgICAvKiBHZXQgY3VycmVudCB0dHkgZmxhZ3MgKi8KKyAgICBzcGQgPSB0dGJ1Zi5zZ19vc3BlZWQ7ICAgICAgICAgICAgICAvKiBTYXZlIHNwZWVkICovCisgICAgdHRidWYuc2dfb3NwZWVkID0gQjUwOyAgICAgICAgICAgICAgLyogQ2hhbmdlIHRvIDUwIGJhdWQgKi8KKyAgICBzdHR5KHR0eWZkLCZ0dGJ1Zik7ICAgICAgICAgICAgICAgICAvKiAgLi4uICovCisgICAgbiA9IChpbnQpc3RybGVuKGJybnVscyk7CQkvKiBTZW5kIHRoZSByaWdodCBudW1iZXIgb2YgbnVsbHMgKi8KKyAgICB4ID0gbXNlYyAvIDkxOworICAgIGlmICh4ID4gbikgeCA9IG47CisgICAgd3JpdGUodHR5ZmQsYnJudWxzLG4pOworICAgIHR0YnVmLnNnX29zcGVlZCA9IHNwZDsgICAgICAgICAgICAgIC8qIFJlc3RvcmUgc3BlZWQgKi8KKyAgICBzdHR5KHR0eWZkLCZ0dGJ1Zik7ICAgICAgICAgICAgICAgICAvKiAgLi4uICovCisgICAgcmV0dXJuKDApOworI2Vsc2UKKyNpZmRlZiBhZWdpcworICAgIHNpb18kY29udHJvbCgoc2hvcnQpdHR5ZmQsIHNpb18kc2VuZF9icmVhaywgbXNlYywgc3QpOworICAgIHJldHVybigwKTsKKyNlbHNlCisjaWZkZWYgQlNEQlJFQUsKKyAgICBuID0gRldSSVRFOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbHVzaCBvdXRwdXQgcXVldWUuICovCisvKiBXYXRjaCBvdXQgZm9yIGludCB2cyBsb25nIHByb2JsZW1zIGluICZuIGFyZyEgKi8KKyAgICBkZWJ1ZyhGMTAxLCJzbmRicmsgQlNEQlJFQUsiLCIiLG1zZWMpOworICAgIGlvY3RsKHR0eWZkLFRJT0NGTFVTSCwmbik7ICAgICAgICAgIC8qIElnbm9yZSBhbnkgZXJyb3JzLi4gKi8KKyAgICBpZiAoaW9jdGwodHR5ZmQsVElPQ1NCUkssKGNoYXIgKikwKSA8IDApIHsgIC8qIFR1cm4gb24gQlJFQUsgKi8KKyAgICAgICAgcGVycm9yKCJDYW4ndCBzZW5kIEJSRUFLIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIHggPSBtc2xlZXAobXNlYyk7ICAgICAgICAgICAgICAgICAgICAvKiBTbGVlcCBmb3Igc28gbWFueSBtaWxsaXNlY29uZHMgKi8KKyAgICBpZiAoaW9jdGwodHR5ZmQsVElPQ0NCUkssKGNoYXIgKikwKSA8IDApIHsgIC8qIFR1cm4gb2ZmIEJSRUFLICovCisgICAgICAgIHBlcnJvcigiQlJFQUsgc3R1Y2shISEiKTsKKyAgICAgICAgZG9leGl0KEJBRF9FWElULC0xKTsJCS8qIEdldCBvdXQsIGNsb3NpbmcgdGhlIGxpbmUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICB3aXRoIGJhZCBleGl0IHN0YXR1cyAqLworICAgIH0KKyAgICByZXR1cm4oeCk7CisjZWxzZQorI2lmZGVmIEFUVFNWCisvKgorICBObyB3YXkgdG8gc2VuZCBhIGxvbmcgQlJFQUsgaW4gU3lzIFYsIHNvIHNlbmQgYSBidW5jaCBvZiByZWd1bGFyIG9uZXMuCisgIChBY3R1YWxseSwgU3lzIFYgUjQgaXMgKnN1cHBvc2VkKiB0byBoYXZlIHRoZSBQT1NJWCB0Y3NlbmRicmVhaygpIGZ1bmN0aW9uLAorICBidXQgdGhlcmUncyBubyB3YXkgZm9yIHRoaXMgY29kZSB0byBrbm93IGZvciBzdXJlLikKKyovCisgICAgZGVidWcoRjEwMSwic25kYnJrIEFUVFNWIiwiIixtc2VjKTsKKyAgICB4ID0gbXNlYyAvIDI3NTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgeDsgbisrKSB7CisJLyogUmVwb3J0ZWRseSB0aGUgY2FzdCBicmVha3MgdGhpcyBmdW5jdGlvbiBvbiBzb21lIHN5c3RlbXMgKi8KKwkvKiBCdXQgdGhlbiB3aHkgd2FzIGl0IGhlcmUgaW4gdGhlIGZpcnN0IHBsYWNlPyAqLworCWlmIChpb2N0bCh0dHlmZCxUQ1NCUkssIC8qIChjaGFyICopICovIDApIDwgMCkgeworCSAgICBwZXJyb3IoIkNhbid0IHNlbmQgQlJFQUsiKTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisgICAgfQorICAgIHJldHVybigwKTsKKyNlbHNlCisjaWZkZWYgIFY3CisgICAgZGVidWcoRjEwMSwic25kYnJrIFY3IiwiIixtc2VjKTsKKyAgICByZXR1cm4oZ2VuYnJrKHR0eWZkLDI1MCkpOwkJLyogU2ltdWxhdGUgYSBCUkVBSyAqLworI2Vsc2UKKyAgICBkZWJ1ZyhGMTAxLCJzbmRicmsgY2F0Y2hhbGwiLCIiLG1zZWMpOworICAgIHR0b2MoMCk7dHRvYygwKTt0dG9jKDApO3R0b2MoMCk7CisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIFY3ICovCisjZW5kaWYgLyogQlNEQlJFQUsgKi8KKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIGFlZ2lzICovCisjZW5kaWYgLyogUFJPVlgxICovCisjZW5kaWYgLyogUE9TSVggKi8KKyNlbmRpZiAvKiBQbGFuOSAqLworfQorCisvKiAgVCBUIFMgTiBEIEIgIC0tICBTZW5kIGEgQlJFQUsgc2lnbmFsICAqLworCitpbnQKK3R0c25kYigpIHsKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgaWYgKG5ldGNvbm4gJiYgaXN0bmNvbXBvcnQoKSkKKyAgICAgIHJldHVybigodG5zbmRiKDI3NUwpID49IDApID8gMCA6IC0xKTsKKyAgICBlbHNlCisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworICAgICAgcmV0dXJuKHNuZGJyaygyNzUpKTsKK30KKworLyogIFQgVCBTIE4gRCBMIEIgIC0tICBTZW5kIGEgTG9uZyBCUkVBSyBzaWduYWwgICovCisKK2ludAordHRzbmRsYigpIHsKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgaWYgKG5ldGNvbm4gJiYgaXN0bmNvbXBvcnQoKSkKKyAgICAgIHJldHVybigodG5zbmRiKDE4MDBMKSA+PSAwKSA/IDAgOiAtMSk7CisgICAgZWxzZQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyAgICByZXR1cm4oc25kYnJrKDE1MDApKTsKK30KKworLyogIE0gUyBMIEUgRSBQICAtLSAgTWlsbGlzZWNvbmQgdmVyc2lvbiBvZiBzbGVlcCgpLiAgKi8KKworLyoKKyAgQ2FsbCB3aXRoIG51bWJlciBvZiBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzIG9mIHNlY29uZHMpIHRvIHNsZWVwLgorICBJbnRlbmRlZCBvbmx5IGZvciBzbWFsbCBpbnRlcnZhbHMuICBGb3IgYmlnIG9uZXMsIGp1c3QgdXNlIHNsZWVwKCkuCisgIEhpZ2hseSBzeXN0ZW0tZGVwZW5kZW50LgorICBSZXR1cm5zIDAgYWx3YXlzLCBldmVuIGlmIGl0IGRpZG4ndCB3b3JrLgorKi8KKworLyogRGVmaW5lIE1TTEZUSU1FIGZvciBzeXN0ZW1zIHRoYXQgbXVzdCB1c2UgYW4gZnRpbWUoKSBsb29wLiAqLworI2lmZGVmIEFOWUJTRAkJCQkvKiBGb3IgcHJlLTQuMiBCU0QgdmVyc2lvbnMgKi8KKyNpZm5kZWYgQlNENAorI2RlZmluZSBNU0xGVElNRQorI2VuZGlmIC8qIEJTRDQgKi8KKyNlbmRpZiAvKiBBTllCU0QgKi8KKworI2lmZGVmIFRPV0VSMQkJCQkvKiBOQ1IgVG93ZXIgT1MgMS4wICovCisjZGVmaW5lIE1TTEZUSU1FCisjZW5kaWYgLyogVE9XRVIxICovCisKKyNpZmRlZiBDT0hFUkVOVCAgICAgICAgIC8qIENvaGVyZW50Li4uICovCisjaWZuZGVmIF9JMzg2ICAgICAgICAgICAvKiBNYXliZSBDb2hlcmVudC8zODYgc2hvdWxkIGdldCB0aGlzLCB0b28gKi8KKyNkZWZpbmUgTVNMRlRJTUUgICAgICAgIC8qIE9waW5pb25zIGFyZSBkaXZpZGVkICovCisjZW5kaWYgLyogX0kzODYgKi8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIEdFVE1TRUMKKworLyogTWlsbGlzZWNvbmQgdGltZXIgKi8KKworc3RhdGljIGxvbmcgbXNlY2Jhc2UgPSAwTDsJCS8qIFVuc2lnbmVkIGxvbmcgbm90IHBvcnRhYmxlICovCisKK2xvbmcKK2dldG1zZWMoKSB7CQkJCS8qIE1pbGxpc2Vjb25kcyBzaW5jZSBiYXNlIHRpbWUgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCB4djsKKyAgICBzdHJ1Y3QgdGltZXpvbmUgeHo7CisgICAgbG9uZyBzZWNzLCBtc2VjczsKKyAgICBpZiAoCisjaWZkZWYgR1RPRE9ORUFSRworCWdldHRpbWVvZmRheSgmdHYpCisjZWxzZQorI2lmZGVmIFBUWAorCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpCisjZWxzZQorCWdldHRpbWVvZmRheSgmdHYsICZ0eikKKyNlbmRpZiAvKiBQVFggKi8KKyNlbmRpZiAvKiBHVE9ET05FQVJHICovCisJPCAwKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAobXNlY2Jhc2UgPT0gMEwpIHsJCS8qIEZpcnN0IGNhbGwsIHNldCBiYXNlIHRpbWUuICovCisJbXNlY2Jhc2UgPSB0di50dl9zZWM7CisJZGVidWcoRjEwMSwiZ2V0bXNlYyBiYXNlIiwiIixtc2VjYmFzZSk7CisgICAgfQorICAgIHJldHVybigoKHR2LnR2X3NlYyAtIG1zZWNiYXNlKSAqIDEwMDBMKSArICh0di50dl91c2VjIC8gMTAwMEwpKTsKK30KKyNlbmRpZiAvKiBHRVRNU0VDICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjaWZkZWYgU0VMRUNUCitpbnQKK3R0d2FpdChmZCwgc2VjcykgaW50IGZkLCBzZWNzOyB7CisgICAgaW50IHg7CisgICAgZmRfc2V0IHJmZHM7CisgICAgRkRfWkVSTygmcmZkcyk7CisgICAgRkRfU0VUKGZkLCZyZmRzKTsKKyAgICB0di50dl9zZWMgPSBzZWNzOworICAgIHR2LnR2X3VzZWMgPSAwTDsKKyAgICBlcnJubyA9IDA7CisgICAgaWYgKCh4ID0gc2VsZWN0KEZEX1NFVFNJWkUsCisjaWZkZWYgSFBVWDkKKwkJICAgIChpbnQgKikKKyNlbHNlCisjaWZkZWYgSFBVWDEwMDAKKwkJICAgIChpbnQgKikKKyNlbmRpZiAvKiBIUFVYMTAwMCAqLworI2VuZGlmIC8qIEhQVVg5ICovCisJCSAgICAmcmZkcywKKwkJICAgIDAsIDAsICZ0dikpIDwgMCkgeworCWRlYnVnKEYxMDEsInR0d2FpdCBzZWxlY3QgZXJybm8iLCIiLGVycm5vKTsKKwlyZXR1cm4oMCk7CisgICAgfSBlbHNlIHsKKwlkZWJ1ZyhGMTAxLCJ0dHdhaXQgT0siLCIiLGVycm5vKTsKKwl4ID0gRkRfSVNTRVQoZmQsICZyZmRzKTsKKwlkZWJ1ZyhGMTAxLCJ0dHdhaXQgc2VsZWN0IHgiLCIiLHgpOworCXJldHVybih4ID8gMSA6IDApOworICAgIH0KK30KKyNlbmRpZiAvKiBTRUxFQ1QgKi8KKworaW50Cittc2xlZXAobSkgaW50IG07IHsKKy8qCisgIE90aGVyIHBvc3NpYmlsaXRpZXMgaGVyZSBhcmU6CisgICBuYW5vc2xlZXAoKSwgcmVwb3J0ZWRseSBkZWZpbmVkIGluIFBPU0lYLjQuCisgICBzZ2luYXAoKSwgSVJJWCBvbmx5IChiYWNrIHRvIHdoYXQgSVJJWCB2ZXJzaW9uIEkgZG9uJ3Qga25vdykuCisqLworI2lmZGVmIFBsYW45CisgICAgcmV0dXJuIF9TTEVFUChtKTsKKyNlbHNlCisjaWZkZWYgQkVPU09SQkVCT1gKKyAgICBzbm9vemUobSoxMDAwKTsKKyNlbHNlIC8qIEJFT1NPUkJFQk9YICovCisjaWZkZWYgU0VMRUNUCisgICAgaW50IHQxLCB4OworICAgIGRlYnVnKEYxMDEsIm1zbGVlcCBTRUxFQ1QgMSIsIiIsbSk7CisgICAgaWYgKG0gPD0gMCkgcmV0dXJuKDApOworICAgIGlmIChtID49IDEwMDApIHsJCQkvKiBDYXRjaCBiaWcgYXJndW1lbnRzLiAqLworCXNsZWVwKG0vMTAwMCk7CisJbSA9IG0gJSAxMDAwOworCWlmIChtIDwgMTApIHJldHVybigwKTsKKyAgICB9CisgICAgZGVidWcoRjEwMSwibXNsZWVwIFNFTEVDVCAyIiwiIixtKTsKKyNpZmRlZiBCRUxMVjEwCisgICAgeCA9IHNlbGVjdCggMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgbSApOworICAgIGRlYnVnKEYxMDEsIm1zbGVlcCBCRUxMVjEwIHNlbGVjdCIsIiIseCk7CisjZWxzZSAvKiBCRUxMVjEwICovCisjaWZkZWYgSFBVWDkKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOworI2Vsc2UKKworI2lmbmRlZiBDT0hFUkVOVAorI2lmZGVmIEdUT0RPTkVBUkcKKyAgICBpZiAoZ2V0dGltZW9mZGF5KCZ0dikgPCAwKQorI2Vsc2UKKyNpZmRlZiBQVFgKKyAgICBpZiAoZ2V0dGltZW9mZGF5KCZ0dixOVUxMKSA8IDApCisjZWxzZQorI2lmZGVmIE5PVElNRVpPTkUKKyAgICBpZiAoZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCkgPCAwKQkvKiB3b25kZXIgd2hhdCB0aGlzIGRvZXMuLi4gKi8KKyNlbHNlCisgICAgaWYgKGdldHRpbWVvZmRheSgmdHYsICZ0eikgPCAwKQorI2VuZGlmIC8qIE5PVElNRVpPTkUgKi8KKyNlbmRpZiAvKiBQVFggKi8KKyNlbmRpZiAvKiBHVE9ET05FQVJHICovCisgICAgICByZXR1cm4oLTEpOworICAgIHQxID0gdHYudHZfc2VjOyAgICAgICAgICAgICAgICAgICAgIC8qIFNlY29uZHMgKi8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworI2VuZGlmIC8qIEhQVVg5ICovCisgICAgdHYudHZfc2VjID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogVXNlIHNlbGVjdCgpICovCisgICAgdHYudHZfdXNlYyA9IG0gKiAxMDAwTDsKKyNpZmRlZiBCU0Q0NAorICAgIHggPSBzZWxlY3QoIDAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsICZ0diApOworICAgIGRlYnVnKEYxMDEsIm1zbGVlcCBCU0Q0NCBzZWxlY3QiLCIiLHgpOworI2Vsc2UgLyogQlNENDQgKi8KKyNpZmRlZiBfX2xpbnV4X18KKyAgICB4ID0gc2VsZWN0KCAwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdHYgKTsKKyAgICBkZWJ1ZyhGMTAxLCJtc2xlZXAgX19saW51eF9fIHNlbGVjdCIsIiIseCk7CisjZWxzZSAvKiBfX2xpbnV4X18gKi8KKyNpZmRlZiBCU0Q0MworICAgIHggPSBzZWxlY3QoIDAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsICZ0diApOworICAgIGRlYnVnKEYxMDEsIm1zbGVlcCBCU0Q0MyBzZWxlY3QiLCIiLHgpOworI2Vsc2UgLyogQlNENDMgKi8KKyNpZmRlZiBRTlg2CisgICAgeCA9IHNlbGVjdCggMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgJnR2ICk7CisgICAgZGVidWcoRjEwMSwibXNsZWVwIFFOWDYgc2VsZWN0IiwiIix4KTsKKyNlbHNlIC8qIFFOWDYgKi8KKyNpZmRlZiBRTlgKKyAgICB4ID0gc2VsZWN0KCAwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdHYgKTsKKyAgICBkZWJ1ZyhGMTAxLCJtc2xlZXAgUU5YIHNlbGVjdCIsIiIseCk7CisjZWxzZSAvKiBRTlggKi8KKyNpZmRlZiBDT0hFUkVOVAorICAgIHggPSBzZWxlY3QoIDAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsICZ0diApOworICAgIGRlYnVnKEYxMDEsIm1zbGVlcCBDT0hFUkVOVCBzZWxlY3QiLCIiLHgpOworI2Vsc2UgLyogQ09IRVJFTlQgKi8KKyNpZmRlZiBIUFVYMTAwMAkJCQkvKiAxMC4wMCBvbmx5LCBub3QgMTAuMTAgb3IgbGF0ZXIgKi8KKyAgICB4ID0gc2VsZWN0KCAwLCAoaW50ICopMCwgKGludCAqKTAsIChpbnQgKikwLCAmdHYgKTsKKyAgICBkZWJ1ZyhGMTAxLCJtc2xlZXAgSFAtVVggMTAuMDAgc2VsZWN0IiwiIix4KTsKKyNlbHNlIC8qIEhQVVgxMDAwICovCisjaWZkZWYgU1ZSNAorICAgIHggPSBzZWxlY3QoIDAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsICZ0diApOworICAgIGRlYnVnKEYxMDEsIm1zbGVlcCBTVlI0IHNlbGVjdCIsIiIseCk7CisjZWxzZSAvKiBTVlI0ICovCisjaWZkZWYgT1NGNDAKKyAgICB4ID0gc2VsZWN0KCAwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdHYgKTsKKyAgICBkZWJ1ZyhGMTAxLCJtc2xlZXAgT1NGNDAgc2VsZWN0IiwiIix4KTsKKyNlbHNlIC8qIE9TRjQwICovCisjaWZkZWYgUFRYCisgICAgeCA9IHNlbGVjdCggMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgJnR2ICk7CisgICAgZGVidWcoRjEwMSwibXNsZWVwIE9TRjQwIHNlbGVjdCIsIiIseCk7CisjZWxzZQorICAgIHggPSBzZWxlY3QoIDAsIChpbnQgKikwLCAoaW50ICopMCwgKGludCAqKTAsICZ0diApOworICAgIGRlYnVnKEYxMDEsIm1zbGVlcCBjYXRjaC1hbGwgc2VsZWN0IiwiIix4KTsKKyNlbmRpZiAvKiBQVFggKi8KKyNlbmRpZiAvKiBPU0Y0MCAqLworI2VuZGlmIC8qIEhQMTAwMCAqLworI2VuZGlmIC8qIFNWUjQgKi8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworI2VuZGlmIC8qIFFOWCAqLworI2VuZGlmIC8qIFFOWDYgKi8KKyNlbmRpZiAvKiBCU0Q0MyAqLworI2VuZGlmIC8qIF9fbGludXhfXyAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisjZW5kaWYgLyogQkVMTFYxMCAqLworICAgIHJldHVybigwKTsKKworI2Vsc2UJCQkJCS8qIE5vdCBTRUxFQ1QgKi8KKyNpZmRlZiBDS19QT0xMCQkJCS8qIFdlIGhhdmUgcG9sbCgpICovCisgICAgc3RydWN0IHBvbGxmZCBwZmQ7CQkJLyogU3VwcGx5IGEgdmFsaWQgYWRkcmVzcyBmb3IgcG9sbCgpICovCisKKyNpZmRlZiBPRFQzMAkJCQkvKiBCdXQgaW4gU0NPIE9EVCAzLjAgKi8KKyNpZmRlZiBOQVAJCQkJLyogd2Ugc2hvdWxkIHVzZSBuYXAoKSBpbnN0ZWFkICovCisgICAgZGVidWcoRjEwMSwibXNsZWVwIE9EVCAzLjAgTkFQIiwiIixtKTsgLyogYmVjYXVzZSB1c2luZyBwb2xsKCkgaGVyZSAqLworICAgIG5hcCgobG9uZyltKTsJCQkgICAvKiBzZWVtcyB0byBicmVhayBkaWFsaW5nLiAqLworICAgIHJldHVybigwKTsKKyNlbHNlCisgICAgZGVidWcoRjEwMSwibXNsZWVwIE9EVCAzLjAgUE9MTCIsIiIsbSk7CisgICAgcG9sbCgmcGZkLCAwLCBtKTsKKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogTkFQICovCisjZWxzZQorICAgIGRlYnVnKEYxMDEsIm1zbGVlcCBQT0xMIiwiIixtKTsKKyAgICBwb2xsKCZwZmQsIDAsIG0pOworICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBPRFQzMCAqLworCisvKgorICBXZSBjb3VsZCBoYW5kbGUgdGhlIGFib3ZlIG1vcmUgY2xlYW5seSBieSBqdXN0IGxldHRpbmcgbmFwKCkgYWx3YXlzCisgIHRha2UgcHJlY2VkZW5jZSBvdmVyIHBvbGwoKSBpbiB0aGlzIHJvdXRpbmUsIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdworICB3aGV0aGVyIHRoYXQgd291bGQgYnJlYWsgc29tZXRoaW5nIGVsc2UuCisqLworCisjZWxzZQkJCQkJLyogTm90IFBPTEwgKi8KKyNpZmRlZiBVU0xFRVAKKy8qCisgICJUaGlzIHJvdXRpbmUgaXMgaW1wbGVtZW50ZWQgdXNpbmcgc2V0aXRpbWVyKDIpOyBpdCByZXF1aXJlcyBlaWdodAorICBzeXN0ZW0gY2FsbHMuLi4iLiAgSW4gb3RoZXIgd29yZHMsIGl0IG1pZ2h0IHRha2UgNSBtaW51dGVzIHRvIHNsZWVwCisgIDEwIG1pbGxpc2Vjb25kcy4uLgorKi8KKyAgICBkZWJ1ZyhGMTAxLCJtc2xlZXAgVVNMRUVQIiwiIixtKTsKKyAgICBpZiAobSA+PSAxMDAwKSB7CQkJLyogQ2F0Y2ggYmlnIGFyZ3VtZW50cy4gKi8KKwlzbGVlcChtLzEwMDApOworCW0gPSBtICUgMTAwMDsKKwlpZiAobSA8IDEwKSByZXR1cm4oMCk7CisgICAgfQorICAgIHVzbGVlcCgodW5zaWduZWQgaW50KShtICogMTAwMCkpOworICAgIHJldHVybigwKTsKKyNlbHNlCisjaWZkZWYgYWVnaXMKKyAgICB0aW1lXyRjbG9ja190IGR1cjsKKyAgICBkZWJ1ZyhGMTAxLCJtc2xlZXAgYWVnaXMiLCIiLG0pOworICAgIGR1ci5jMi5oaWdoMTYgPSAwOworICAgIGR1ci5jMi5sb3czMiAgPSAyNTAgKiBtOyAvKiBvbmUgbWlsbGlzZWNvbmQgPSAyNTAgZm91ciBtaWNyb3NlY29uZCB0aWNrcyAqLworICAgIHRpbWVfJHdhaXQodGltZV8kcmVsYXRpdmUsIGR1ciwgc3QpOworICAgIHJldHVybigwKTsKKyNlbHNlCisjaWZkZWYgUFJPVlgxCisgICAgZGVidWcoRjEwMSwibXNsZWVwIFZlbml4IiwiIixtKTsKKyAgICBpZiAobSA8PSAwKSByZXR1cm4oMCk7CisgICAgc2xlZXAoLSgobSAqIDYwICsgNTAwKSAvIDEwMDApKTsKKyAgICByZXR1cm4oMCk7CisjZWxzZQorI2lmZGVmIE5BUAorICAgIGRlYnVnKEYxMDEsIm1zbGVlcCBOQVAiLCIiLG0pOworICAgIG5hcCgobG9uZyltKTsKKyAgICByZXR1cm4oMCk7CisjZWxzZQorI2lmZGVmIEFUVFNWCisjaWZuZGVmIEJTRDQ0CisgICAgZXh0ZXJuIGxvbmcgdGltZXMoKTsJCS8qIE9yICNpbmNsdWRlIDx0aW1lcy5oPiA/ICovCisjZW5kaWYgLyogQlNENDQgKi8KKyAgICBsb25nIHQxLCB0MiwgdGFycmF5WzRdOworICAgIGludCB0MzsKKyAgICBjaGFyICpjcCA9IGdldGVudigiSFoiKTsKKyAgICBpbnQgQ0xPQ0tfVElDSzsKKyAgICBpbnQgaGVydHo7CisKKyAgICBpZiAoY3AgJiYgKGhlcnR6ID0gYXRvaShjcCkpKSB7CisgICAgICAgIENMT0NLX1RJQ0sgID0gMTAwMCAvIGhlcnR6OworICAgIH0gZWxzZSB7CQkJCS8qIHByb2JhYmx5IHNpbmdsZSB1c2VyIG1vZGUgKi8KKyNpZmRlZiBIWgorICAgICAgICBDTE9DS19USUNLICA9IDEwMDAgLyBIWjsKKyNlbHNlCisJc3RhdGljIHdhcm5lZCA9IDA7CisJLyogSFogYWx3YXlzIGV4aXN0cyBpbiwgZm9yIGluc3RhbmNlLCBTQ08gWGVuaXgsIHNvIHlvdSBkb24ndCBoYXZlIHRvCisJICogbWFrZSBzcGVjaWFsICNpZmRlZnMgZm9yIFhFTklYIGhlcmUsIGxpa2UgaW4gdmVyIDRGLiBBbHNvLCBpZiB5b3UKKwkgKiBoYXZlIFhlbml4LCB5b3UgaGF2ZSBzaG91bGQgaGF2ZSBuYXAoKSwgc28gdGhlIGJlc3QgaXMgdG8gdXNlIC1ETkFQCisJICogaW4gdGhlIG1ha2VmaWxlLiBNb3N0IHN5c3RlbXMgaGF2ZSBIWi4KKwkgKi8KKwlDTE9DS19USUNLID0gMTc7CQkvKiAxLzYwIHNlYyAqLworCWlmICghd2FybmVkKSB7CisgICAgICAgICAgcHJpbnRmKCJ3YXJuaW5nOiBlbnZpcm9ubWVudCB2YXJpYWJsZSBIWiBiYWQuLi4gdXNpbmcgSFo9JWRcclxuIiwKKwkJIDEwMDAgLyBDTE9DS19USUNLKTsKKyAgICAgICAgICB3YXJuZWQgPSAxOworCX0KKyNlbmRpZiAvKiAhSFogKi8KKyAgICB9CisgICAgZGVidWcoRjEwMSwibXNsZWVwIEFUVFNWIiwiIixtKTsKKyAgICBpZiAobSA8PSAwKSByZXR1cm4oMCk7CisgICAgaWYgKG0gPj0gMTAwMCkgewkJCS8qIENhdGNoIGJpZyBhcmd1bWVudHMuICovCisJc2xlZXAobS8xMDAwKTsKKwltID0gbSAlIDEwMDA7CisJaWYgKG0gPCAxMCkgcmV0dXJuKDApOworICAgIH0KKyAgICBpZiAoKHQxID0gdGltZXModGFycmF5KSkgPCAwKSByZXR1cm4oLTEpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICgodDIgPSB0aW1lcyh0YXJyYXkpKSA8IDApIHJldHVybigtMSk7CisgICAgICAgIHQzID0gKChpbnQpKHQyIC0gdDEpKSAqIENMT0NLX1RJQ0s7CisgICAgICAgIGlmICh0MyA+IG0pIHJldHVybih0Myk7CisgICAgfQorI2Vsc2UgLyogTm90IEFUVFNWICovCisjaWZkZWYgTVNMRlRJTUUJCQkJLyogVXNlIGZ0aW1lKCkgbG9vcC4uLiAqLworICAgIGludCB0MSwgdDMgPSAwOworICAgIGRlYnVnKEYxMDEsIm1zbGVlcCBNU0xGVElNRSIsIiIsbSk7CisgICAgaWYgKG0gPD0gMCkgcmV0dXJuKDApOworICAgIGlmIChtID49IDEwMDApIHsJCQkvKiBDYXRjaCBiaWcgYXJndW1lbnRzLiAqLworCXNsZWVwKG0vMTAwMCk7CisJbSA9IG0gJSAxMDAwOworCWlmIChtIDwgMTApIHJldHVybigwKTsKKyAgICB9CisjaWZkZWYgUU5YCisgICAgZnRpbWUoJmZ0cCk7CQkJLyogdm9pZCBmdGltZSgpIGluIFFOWCAqLworI2Vsc2UKKyAgICBpZiAoZnRpbWUoJmZ0cCkgPCAwKSByZXR1cm4oLTEpOwkvKiBHZXQgYmFzZSB0aW1lLiAqLworI2VuZGlmIC8qIFFOWCAqLworICAgIHQxID0gKChmdHAudGltZSAmIDB4ZmYpICogMTAwMCkgKyBmdHAubWlsbGl0bTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBmdGltZSgmZnRwKTsJCQkvKiBHZXQgY3VycmVudCB0aW1lIGFuZCBjb21wYXJlLiAqLworICAgICAgICB0MyA9ICgoKGZ0cC50aW1lICYgMHhmZikgKiAxMDAwKSArIGZ0cC5taWxsaXRtKSAtIHQxOworICAgICAgICBpZiAodDMgPiBtKSByZXR1cm4oMCk7CisgICAgfQorI2Vsc2UKKy8qIFRoaXMgaW5jbHVkZXMgdHJ1ZSBQT1NJWCwgd2hpY2ggaGFzIG5vIHdheSB0byBkbyB0aGlzLiAqLworICAgIGRlYnVnKEYxMDEsIm1zbGVlcCBidXN5IGxvb3AiLCIiLG0pOworICAgIGlmIChtID49IDEwMDApIHsJCQkvKiBDYXRjaCBiaWcgYXJndW1lbnRzLiAqLworCXNsZWVwKG0vMTAwMCk7CisJbSA9IG0gJSAxMDAwOworCWlmIChtIDwgMTApIHJldHVybigwKTsKKyAgICB9CisgICAgaWYgKG0gPiAwKSB3aGlsZSAobSA+IDApIG0tLTsJLyogSnVzdCBhIGR1bWIgYnVzeSBsb29wICovCisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIE1TTEZUSU1FICovCisjZW5kaWYgLyogQVRUU1YgKi8KKyNlbmRpZiAvKiBOQVAgKi8KKyNlbmRpZiAvKiBQUk9WWDEgKi8KKyNlbmRpZiAvKiBhZWdpcyAqLworI2VuZGlmIC8qIENLX1BPTEwgKi8KKyNlbmRpZiAvKiBTRUxFQ1QgKi8KKyNlbmRpZiAvKiBCRU9TT1JCRUJPWCAqLworI2VuZGlmIC8qIFVTTEVFUCAqLworI2VuZGlmIC8qIFBsYW45ICovCit9CisKKy8qICBSIFQgSSBNIEUgUiAtLSAgUmVzZXQgZWxhcHNlZCB0aW1lIGNvdW50ZXIgICovCisKK1ZPSUQKK3J0aW1lcigpIHsKKyAgICB0Y291bnQgPSB0aW1lKCAodGltZV90ICopIDAgKTsKK30KKworCisvKiAgRyBUIEkgTSBFIFIgLS0gIEdldCBjdXJyZW50IHZhbHVlIG9mIGVsYXBzZWQgdGltZSBjb3VudGVyIGluIHNlY29uZHMgICovCisKK2ludAorZ3RpbWVyKCkgeworICAgIGludCB4OworICAgIHggPSAoaW50KSAodGltZSggKHRpbWVfdCAqKSAwICkgLSB0Y291bnQpOworICAgIGRlYnVnKEYxMDEsImd0aW1lciIsIiIseCk7CisgICAgcmV0dXJuKCAoeCA8IDApID8gMCA6IHggKTsKK30KKworI2lmZGVmIEdGVElNRVIKKy8qCisgIEZsb2F0aW5nLXBvaW50IHRpbWVycy4gIFJlcXVpcmUgbm90IG9ubHkgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCwgYnV0CisgIGFsc28gZ2V0dGltZW9mZGF5KCkuCisqLworc3RhdGljIHN0cnVjdCB0aW1ldmFsIHR6ZXJvOworCitWT0lECityZnRpbWVyKCkgeworI2lmZGVmIEdUT0RPTkVBUkcJCQkvKiBBY2NvdW50IGZvciBNb3QncyBkZWZpbml0aW9uICovCisgICAgKFZPSUQpIGdldHRpbWVvZmRheSgmdHplcm8pOworI2Vsc2UKKyAgICAoVk9JRCkgZ2V0dGltZW9mZGF5KCZ0emVybywgKHN0cnVjdCB0aW1lem9uZSAqKTApOworI2VuZGlmIC8qIEdUT0RPTkVBUkcgKi8KK30KKworQ0tGTE9BVAorZ2Z0aW1lcigpIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0bm93LCB0ZGVsdGE7CisgICAgQ0tGTE9BVCBzOworI2lmZGVmIERFQlVHCisgICAgY2hhciBmcGJ1Zls2NF07CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBHVE9ET05FQVJHCQkJLyogQWNjb3VudCBmb3IgTW90J3MgZGVmaW5pdGlvbiAqLworICAgIChWT0lEKSBnZXR0aW1lb2ZkYXkoJnRub3cpOworI2Vsc2UKKyAgICAoVk9JRCkgZ2V0dGltZW9mZGF5KCZ0bm93LCAoc3RydWN0IHRpbWV6b25lICopMCk7CisjZW5kaWYgLyogR1RPRE9ORUFSRyAqLworCisgICAgdGRlbHRhLnR2X3NlYyA9IHRub3cudHZfc2VjIC0gdHplcm8udHZfc2VjOworICAgIHRkZWx0YS50dl91c2VjID0gdG5vdy50dl91c2VjIC0gdHplcm8udHZfdXNlYzsKKworICAgIGlmICh0ZGVsdGEudHZfdXNlYyA8IDApIHsKKwl0ZGVsdGEudHZfc2VjLS07CisJdGRlbHRhLnR2X3VzZWMgKz0gMTAwMDAwMDsKKyAgICB9CisgICAgcyA9IChDS0ZMT0FUKSB0ZGVsdGEudHZfc2VjICsgKChDS0ZMT0FUKSB0ZGVsdGEudHZfdXNlYyAvIDEwMDAwMDAuMCk7CisgICAgaWYgKHMgPCBHRk1JTlRJTUUpCisgICAgICBzID0gR0ZNSU5USU1FOworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworCXNwcmludGYoZnBidWYsIiVmIixzKTsKKwlkZWJ1ZyhGMTEwLCJnZnRpbWVyIixmcGJ1ZiwwKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICByZXR1cm4ocyk7Cit9CisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisvKiAgWiBUIEkgTSBFICAtLSAgUmV0dXJuIGFzY3RpbWUoKS1mb3JtYXQgZGF0ZS90aW1lIHN0cmluZyAgKi8KKy8qCisgIE5PVEU6IGFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIHJvdXRpbmUsIHdlIGNhbiBhbHNvIHNldCB0aGUKKyAgZm9sbG93aW5nIHR3byB2YXJpYWJsZXMsIGdpdmluZyB0aGUgbWljcm8tIGFuZCBtaWxsaXNlY29uZHMgKGZyYWN0aW9ucyBvZgorICBzZWNvbmRzKSBvZiB0aGUgY2xvY2sgdGltZS4gIEN1cnJlbnRseSB0aGlzIGlzIGRvbmUgb25seSBpbiBCU0QtYmFzZWQgYnVpbGRzCisgIHRoYXQgdXNlIGdldHRpbWVvZmRheSgpLiAgV2hlbiB0aGVzZSB2YXJpYWJsZXMgYXJlIG5vdCBmaWxsZWQgaW4sIHRoZXkgYXJlCisgIGxlZnQgd2l0aCBhIHZhbHVlIG9mIC0xTC4KKyovCitzdGF0aWMgY2hhciBhc2N0bWJ1Zls2NF07CisKK1ZPSUQKK3p0aW1lKHMpIGNoYXIgKipzOyB7CisKKyNpZmRlZiBHRlRJTUVSCisvKgorICBUaGUgZ2V0dGltZW9mZGF5KCkgbWV0aG9kLCB3aGljaCBhbHNvIHNldHMgenRtc2VjIGFuZCB6dHVzZWMsIHdvcmtzIGZvcgorICBhbGwgR0ZUSU1FUiBidWlsZHMuICBOT1RFOiB6dG1zZWMgYW5kIHp0dXNlYyBhcmUgZGVmaW5lZCBpbiBja2NtYWkuYywKKyAgYW5kIGV4dGVybiBkZWNsYXJhdGlvbnMgZm9yIHRoZW0gYXJlIGluIGNrY2RlYi5oOyB0aHVzIHRoZXkgYXJlCisgIGRlY2xhcmVkIGluIHRoaXMgZmlsZSBieSBpbmNsdXNpb24gb2YgY2tjZGViLmguCisqLworICAgIGNoYXIgKmFzY3RpbWUoKTsKKyAgICBzdHJ1Y3QgdG0gKmxvY2FsdGltZSgpOworICAgIHN0cnVjdCB0bSAqdHA7CisgICAgenRtc2VjID0gLTFMOworICAgIHp0dXNlYyA9IC0xTDsKKworICAgIGlmICghcykKKyAgICAgIGRlYnVnKEYxMDAsInp0aW1lIHM9PU5VTEwiLCIiLDApOworCisjaWZkZWYgR1RPRE9ORUFSRworICAgIC8qIE5vIDJuZCBhcmcgaW4gTW90b3JvbGEgU1Y4OCBhbmQgc29tZSBvdGhlcnMgKi8KKyAgICBpZiAoZ2V0dGltZW9mZGF5KCZ0dikgPiAtMSkKKyNlbHNlCisjaWZuZGVmIENPSEVSRU5UCisjaWZkZWYgUFRYCisgICAgaWYgKGdldHRpbWVvZmRheSgmdHYsTlVMTCkgPiAtMSkKKyNlbHNlCisjaWZkZWYgTk9USU1FWk9ORQorICAgIGlmIChnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKSA+IC0xKQkvKiB3b25kZXIgd2hhdCB0aGlzIGRvZXMuLi4gKi8KKyNlbHNlCisgICAgaWYgKGdldHRpbWVvZmRheSgmdHYsICZ0eikgPiAtMSkKKyNlbmRpZiAvKiBOT1RJTUVaT05FICovCisjZW5kaWYgLyogUFRYICovCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBHVE9ET05FQVJHICovCisgICAgICB7CQkJCQkvKiBGaWxsIGluIHRtIHN0cnVjdCAqLworCXp0dXNlYyA9IHR2LnR2X3VzZWM7CQkvKiBNaWNyb3NlY29uZHMgKi8KKwl6dG1zZWMgPSB6dHVzZWMgLyAxMDAwTDsJLyogTWlsbGlzZWNvbmRzICovCisjaWZkZWYgSFBVWDkKKwl7CisJICAgIHRpbWVfdCB6ejsKKwkgICAgenogPSB0di50dl9zZWM7CisJICAgIHRwID0gbG9jYWx0aW1lKCZ6eik7CS8qIENvbnZlcnQgdG8gbG9jYWwgdGltZSAqLworCX0KKyNlbHNlCisjaWZkZWYgSFBVWDEwMDAKKwl7CisJICAgIHRpbWVfdCB6ejsKKwkgICAgenogPSB0di50dl9zZWM7CisJICAgIHRwID0gbG9jYWx0aW1lKCZ6eik7CisJfQorI2Vsc2UKKyNpZmRlZiBMSU5VWAorCXsgICAvKiBhdm9pZCB1bmFsaWduZWQgYWNjZXNzIHRyYXAgb24gNjQtYml0IHBsYXRmb3JtcyAqLworCSAgICB0aW1lX3Qgeno7CisJICAgIHp6ID0gdHYudHZfc2VjOworCSAgICB0cCA9IGxvY2FsdGltZSgmenopOworCX0KKyNlbHNlCisjaWZkZWYgTUFDT1NYCisJdHAgPSBsb2NhbHRpbWUoKHRpbWVfdCAqKSZ0di50dl9zZWMpOyAvKiBDb252ZXJ0IHRvIGxvY2FsIHRpbWUgKi8KKyNlbHNlCisJdHAgPSBsb2NhbHRpbWUoJnR2LnR2X3NlYyk7CisjZW5kaWYgLyogTUFDT1NYICovCisjZW5kaWYgLyogTElOVVggKi8KKyNlbmRpZiAvKiBIUFVYMTAwMCAqLworI2VuZGlmIC8qIEhQVVg5ICovCisJaWYgKHMpIHsKKwkgICAgY2hhciAqIHMyOworCSAgICBzMiA9IGFzY3RpbWUodHApOwkJLyogQ29udmVydCByZXN1bHQgdG8gQVNDSUkgc3RyaW5nICovCisJICAgIGFzY3RtYnVmWzBdID0gJ1wwJzsKKwkgICAgaWYgKHMyKSBja3N0cm5jcHkoYXNjdG1idWYsczIsNjQpOworCSAgICAqcyA9IGFzY3RtYnVmOworCSAgICBkZWJ1ZyhGMTExLCJ6dGltZSBHRlRJTUVSIGdldHRpbWVvZmRheSIsKnMsenR1c2VjKTsKKwl9CisgICAgfQorI2Vsc2UgIC8qIE5vdCBHRlRJTUVSICovCisKKyN1bmRlZiBaVElNRVY3CQkJCS8qIFdoaWNoIHN5c3RlbXMgbmVlZCB0byB1c2UgKi8KKyNpZmRlZiBDT0hFUkVOVAkJCQkvKiBvbGQgVU5JWCBWZXJzaW9uIDcgd2F5Li4uICovCisjZGVmaW5lIFpUSU1FVjcKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworI2lmZGVmIFRPV0VSMQorI2RlZmluZSBaVElNRVY3CisjZW5kaWYgLyogVE9XRVIxICovCisjaWZkZWYgQU5ZQlNECisjaWZuZGVmIEJTRDQyCisjZGVmaW5lIFpUSU1FVjcKKyNlbmRpZiAvKiBCU0Q0MiAqLworI2VuZGlmIC8qIEFOWUJTRCAqLworI2lmZGVmIFY3CisjaWZuZGVmIE1JTklYCisjZGVmaW5lIFpUSU1FVjcKKyNlbmRpZiAvKiBNSU5JWCAqLworI2VuZGlmIC8qIFY3ICovCisjaWZkZWYgUE9TSVgKKyNkZWZpbmUgWlRJTUVWNworI2VuZGlmIC8qIFBPU0lYICovCisKKyNpZmRlZiBIUFVYMTAyMAorLyoKKyAgUHJvdG90eXBlcyBhcmUgaW4gPHRpbWUuaD4sIGluY2x1ZGVkIGFib3ZlLgorKi8KKyAgICB0aW1lX3QgY2xvY2tfc3RvcmFnZTsKKyAgICBjbG9ja19zdG9yYWdlID0gdGltZSgodm9pZCAqKSAwKTsKKyAgICBpZiAocykgeworCSpzID0gY3RpbWUoJmNsb2NrX3N0b3JhZ2UpOworCWRlYnVnKEYxMTAsInp0aW1lOiBIUFVYIDEwLjIwIiwqcywwKTsKKyAgICB9CisjZWxzZQorI2lmZGVmIEFUVFNWCQkJCS8qIEFUJlQgd2F5ICovCisvKiAgZXh0ZXJuIGxvbmcgdGltZSgpOyAqLwkJLyogVGhlb3JldGljYWxseSB0aGVzZSBzaG91bGQgKi8KKyAgICBjaGFyICpjdGltZSgpOwkJCS8qIGFscmVhZHkgYmVlbiBkY2wnZCBpbiA8dGltZS5oPiAqLworICAgIHRpbWVfdCBjbG9ja19zdG9yYWdlOworICAgIGNsb2NrX3N0b3JhZ2UgPSB0aW1lKAorI2lmZGVmIElSSVg2MAorCQkJICh0aW1lX3QgKikKKyNlbHNlCisjaWZkZWYgQlNENDQKKwkJCSAodGltZV90ICopCisjZWxzZQorCQkJIChsb25nICopCisjZW5kaWYgLyogQlNENDQgKi8KKyNlbmRpZiAvKiBJUklYNjAgKi8KKwkJCSAwICk7CisgICAgaWYgKHMpIHsKKwkqcyA9IGN0aW1lKCAmY2xvY2tfc3RvcmFnZSApOworCWRlYnVnKEYxMTAsInp0aW1lOiBBVFRTViIsKnMsMCk7CisgICAgfQorI2Vsc2UKKyNpZmRlZiBQUk9WWDEJCQkJLyogVmVuaXggMS4wIHdheSAqLworICAgIGludCB1dGltZVsyXTsKKyAgICB0aW1lKHV0aW1lKTsKKyAgICBpZiAocykgeworCSpzID0gY3RpbWUodXRpbWUpOworCWRlYnVnKEYxMTAsInp0aW1lOiBQUk9WWDEiLCpzLDApOworICAgIH0KKyNlbHNlCisjaWZkZWYgQlNENDIJCQkJLyogNC4yQlNEIHdheSAqLworICAgIGNoYXIgKmFzY3RpbWUoKTsKKyAgICBzdHJ1Y3QgdG0gKmxvY2FsdGltZSgpOworICAgIHN0cnVjdCB0bSAqdHA7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgJnR6KTsKKyAgICB6dHVzZWMgPSB0di50dl91c2VjOworICAgIHp0bXNlYyA9IHR2LnR2X3VzZWMgLyAxMDAwTDsKKyAgICB0cCA9IGxvY2FsdGltZSgmdHYudHZfc2VjKTsKKyAgICBpZiAocykgeworCSpzID0gYXNjdGltZSh0cCk7CisJZGVidWcoRjExMSwienRpbWU6IEJTRDQyIiwqcyx6dHVzZWMpOworICAgIH0KKyNlbHNlCisjaWZkZWYgTUlOSVgJCQkJLyogTUlOSVggd2F5ICovCisjaWZkZWYgQ09NTUVOVAorICAgIGV4dGVybiBsb25nIHRpbWUoKTsJCQkvKiBBbHJlYWR5IGdvdCB0aGVzZSBmcm9tIDx0aW1lLmg+ICovCisgICAgZXh0ZXJuIGNoYXIgKmN0aW1lKCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHRpbWVfdCB1dGltZVsyXTsKKyAgICB0aW1lKHV0aW1lKTsKKyAgICBpZiAocykgeworCSpzID0gY3RpbWUodXRpbWUpOworCWRlYnVnKEYxMTAsInp0aW1lOiBNSU5JWCIsKnMsMCk7CisgICAgfQorI2Vsc2UKKyNpZmRlZiBaVElNRVY3CQkJCS8qIFRoZSByZWd1bGFyIHdheSAqLworICAgIGNoYXIgKmFzY3RpbWUoKTsKKyAgICBzdHJ1Y3QgdG0gKmxvY2FsdGltZSgpOworICAgIHN0cnVjdCB0bSAqdHA7CisgICAgbG9uZyB4Y2xvY2s7CQkJLyogb3IgdW5zaWduZWQgbG9uZyBmb3IgQmVCb3g/ICovCisgICAgdGltZSgmeGNsb2NrKTsKKyAgICB0cCA9IGxvY2FsdGltZSgmeGNsb2NrKTsKKyAgICBpZiAocykgeworCSpzID0gYXNjdGltZSh0cCk7CisJZGVidWcoRjExMCwienRpbWU6IFpUSU1FVjciLCpzLDApOworICAgIH0KKyNlbHNlCQkJCQkvKiBDYXRjaC1hbGwgZm9yIG90aGVycy4uLiAqLworICAgIGlmIChzKSB7CisJKnMgPSAiRGF5IE1vbiAwMCAwMDowMDowMCAwMDAwXG4iOyAvKiBEdW1teSBpbiBhc2N0aW1lKCkgZm9ybWF0ICovCisJZGVidWcoRjExMCwienRpbWU6IGNhdGNoLWFsbCIsKnMsMCk7CisgICAgfQorI2VuZGlmIC8qIFpUSU1FVjcgKi8KKyNlbmRpZiAvKiBNSU5JWCAqLworI2VuZGlmIC8qIEJTRDQyICovCisjZW5kaWYgLyogUFJPVlgxICovCisjZW5kaWYgLyogQVRUU1YgKi8KKyNlbmRpZiAvKiBIUFVYMTAyMCAqLworI2VuZGlmIC8qIEdGVElNRVIgKi8KK30KKworLyogIEMgTyBOIEcgTSAgLS0gIEdldCBjb25zb2xlIHRlcm1pbmFsIG1vZGVzLiAgKi8KKworLyoKKyAgU2F2ZXMgaW5pdGlhbCBjb25zb2xlIG1vZGUsIGFuZCBlc3RhYmxpc2hlcyB2YXJpYWJsZXMgZm9yIHN3aXRjaGluZworICBiZXR3ZWVuIGN1cnJlbnQgKHByZXN1bWFibHkgbm9ybWFsKSBtb2RlIGFuZCBvdGhlciBtb2Rlcy4KKyAgU2hvdWxkIGJlIGNhbGxlZCB3aGVuIHByb2dyYW0gc3RhcnRzLCBidXQgb25seSBhZnRlciBlc3RhYmxpc2hpbmcKKyAgd2hldGhlciBwcm9ncmFtIGlzIGluIHRoZSBmb3JlZ3JvdW5kIG9yIGJhY2tncm91bmQuCisgIFJldHVybnMgMSBpZiBpdCBnb3QgdGhlIG1vZGVzIE9LLCAwIGlmIGl0IGRpZCBub3RoaW5nLCAtMSBvbiBlcnJvci4KKyovCitpbnQKK2NvbmdtKCkgeworICAgIGludCBmZDsKKyAgICBpZiAoYmFja2dyZCB8fCAhaXNhdHR5KDApKSB7CS8qIElmIGluIGJhY2tncm91bmQuICovCisJY2dtZiA9IC0xOwkJCS8qIERvbid0IGJvdGhlciwgbW9kZXMgYXJlIGdhcmJhZ2UuICovCisJcmV0dXJuKC0xKTsKKyAgICB9CisgICAgaWYgKGNnbWYgPiAwKSByZXR1cm4oMCk7CQkvKiBBbHJlYWR5IGRpZCB0aGlzLiAqLworICAgIGRlYnVnKEYxMDAsImNvbmdtIGdldHRpbmcgbW9kZXMiLCIiLDApOyAvKiBOZWVkIHRvIGRvIGl0LiAqLworI2lmZGVmIGFlZ2lzCisgICAgaW9zXyRpbnFfdHlwZV91aWQoaW9zXyRzdGRpbiwgY29udWlkLCBzdCk7CisgICAgaWYgKHN0LmFsbCAhPSBzdGF0dXNfJG9rKSB7CisJZnByaW50ZihzdGRlcnIsICJwcm9ibGVtIGdldHRpbmcgc3RkaW4gb2JqdHlwZTogIik7CisJZXJyb3JfJHByaW50KHN0KTsKKyAgICB9CisgICAgY29uY3JwID0gKGNvbnVpZCA9PSBtYnhfJHVpZCk7CisgICAgY29uYnVmbiA9IDA7CisjZW5kaWYgLyogYWVnaXMgKi8KKworI2lmbmRlZiBCRUJPWAorICAgIGlmICgoZmQgPSBvcGVuKENUVE5BTSwyKSkgPCAwKSB7CS8qIE9wZW4gY29udHJvbGxpbmcgdGVybWluYWwgKi8KKyNpZmRlZiBDT01NRU5UCisJZnByaW50ZihzdGRlcnIsIkVycm9yIG9wZW5pbmcgJXNcbiIsIENUVE5BTSk7CisJcGVycm9yKCJjb25nbSIpOworCXJldHVybigtMSk7CisjZWxzZQorCWZkID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfQorI2Vsc2UKKyAgICBmZCA9IDA7CisjZW5kaWYgLyogIUJFQk9YICovCisjaWZkZWYgQlNENDRPUlBPU0lYCisgICAgaWYgKHRjZ2V0YXR0cihmZCwmY2NvbGQpIDwgMCkgcmV0dXJuKC0xKTsKKyAgICBpZiAodGNnZXRhdHRyKGZkLCZjY2NicmspIDwgMCkgcmV0dXJuKC0xKTsKKyAgICBpZiAodGNnZXRhdHRyKGZkLCZjY3JhdykgPCAwKSByZXR1cm4oLTEpOworI2Vsc2UKKyNpZmRlZiBBVFRTVgorICAgIGlmIChpb2N0bChmZCxUQ0dFVEEsJmNjb2xkKSAgPCAwKSByZXR1cm4oLTEpOworICAgIGlmIChpb2N0bChmZCxUQ0dFVEEsJmNjY2JyaykgPCAwKSByZXR1cm4oLTEpOworICAgIGlmIChpb2N0bChmZCxUQ0dFVEEsJmNjcmF3KSAgPCAwKSByZXR1cm4oLTEpOworI2lmZGVmIFZYVkUKKyAgICBjY2NicmsuY19saW5lID0gMDsJCQkvKiBTVFRZIGxpbmUgMCBmb3IgQ0RDIFZYL1ZFICovCisgICAgaWYgKGlvY3RsKGZkLFRDU0VUQSwmY2NjYnJrKSA8IDApIHJldHVybigtMSk7CisgICAgY2NyYXcuY19saW5lID0gMDsJCQkvKiBTVFRZIGxpbmUgMCBmb3IgQ0RDIFZYL1ZFICovCisgICAgaWYgKGlvY3RsKGZkLFRDU0VUQSwmY2NyYXcpIDwgMCkgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBWWFZFICovCisjZWxzZQorI2lmZGVmIEJFTExWMTAKKyAgICBpZiAoaW9jdGwoZmQsVElPQ0dFVFAsJmNjb2xkKSA8IDApIHJldHVybigtMSk7CisgICAgaWYgKGlvY3RsKGZkLFRJT0NHRVRQLCZjY2NicmspIDwgMCkgcmV0dXJuKC0xKTsKKyAgICBpZiAoaW9jdGwoZmQsVElPQ0dFVFAsJmNjcmF3KSA8IDApIHJldHVybigtMSk7CisgICAgZGVidWcoRjEwMSwiY2NjYnJrLnNnX2ZsYWdzIG9yaWciLCIiLCBjY2Nicmsuc2dfZmxhZ3MpOworI2Vsc2UKKyAgICBpZiAoZ3R0eShmZCwmY2NvbGQpIDwgMCkgcmV0dXJuKC0xKTsKKyAgICBpZiAoZ3R0eShmZCwmY2NjYnJrKSA8IDApIHJldHVybigtMSk7CisgICAgaWYgKGd0dHkoZmQsJmNjcmF3KSA8IDApIHJldHVybigtMSk7CisjZW5kaWYgLyogQkVMTFYxMCAqLworI2VuZGlmIC8qIEFUVFNWICovCisjZW5kaWYgLyogQlNENDRPUlBPU0lYICovCisjaWZkZWYgc29ueV9uZXdzCQkJLyogU29ueSBORVdTICovCisgICAgaWYgKGlvY3RsKGZkLFRJT0NLR0VULCZrbV9jb24pIDwgMCkgeyAvKiBHZXQgY29uc29sZSBLYW5qaSBtb2RlICovCisJcGVycm9yKCJjb25nbSBlcnJvciBnZXR0aW5nIEthbmppIG1vZGUiKTsKKwlkZWJ1ZyhGMTAxLCJjb25nbSBlcnJvciBnZXR0aW5nIEthbmppIG1vZGUiLCIiLDApOworCWttX2NvbiA9IC0xOwkJCS8qIE1ha2Ugc3VyZSB0aGlzIHN0YXlzIHVuZGVmaW5lZC4gKi8KKwlyZXR1cm4oLTEpOworICAgIH0KKyNlbmRpZiAvKiBzb255X25ld3MgKi8KKyAgICBpZiAoZmQgPiAwKQorICAgICAgY2xvc2UoZmQpOworICAgIGNnbWYgPSAxOwkJCQkvKiBGbGFnIHRoYXQgd2UgZ290IHRoZW0uICovCisgICAgcmV0dXJuKDEpOworfQorCisKK3N0YXRpYyBWT0lECitjb25nZXRidWYoeCkgaW50IHg7IHsKKyAgICBpbnQgbjsKKyAgICBuID0gQ09OQlVGU0laIC0gKGNvbmJ1ZnAgLSBjb25idWYpOwkvKiBIb3cgbXVjaCByb29tIGxlZnQgaW4gYnVmZmVyPyAqLworICAgIGlmICh4ID4gbikgeworCWRlYnVnKEYxMDEsImNvbmdldGJ1ZiBjaGFyIGxvc3MiLCIiLHgtbik7CisJeCA9IG47CisgICAgfQorICAgIHggPSByZWFkKDAsY29uYnVmcCx4KTsKKyAgICBjb25idWZuICs9IHg7CisgICAgZGVidWcoRjExMSwiY29uZ2V0YnVmIHJlYWRhaGVhZCIsY29uYnVmLHgpOworfQorCisKKy8qICBDIE8gTiBDIEIgLS0gIFB1dCBjb25zb2xlIGluIGNicmVhayBtb2RlLiAgKi8KKworLyogIFJldHVybnMgMCBpZiBvaywgLTEgaWYgbm90ICAqLworCitpbnQKKyNpZmRlZiBDS19BTlNJQworY29uY2IoY2hhciBlc2MpCisjZWxzZQorY29uY2IoZXNjKSBjaGFyIGVzYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogY29uY2IgKi8geworICAgIGludCB4OworICAgIGRlYnVnKEYxMDEsImNvbmNiIGNvbnN0YXRlIiwiIixjb25zdGF0ZSk7CisgICAgZGVidWcoRjEwMSwiY29uY2IgY2dtZiIsIiIsY2dtZik7CisgICAgZGVidWcoRjEwMSwiY29uY2IgYmFja2dyZCIsIiIsYmFja2dyZCk7CisKKyAgICBpZiAoY29uc3RhdGUgPT0gQ09OX0NCKQorICAgICAgcmV0dXJuKDApOworCisgICAgaWYgKGNnbWYgPCAxKQkJCS8qIERpZCB3ZSBnZXQgY29uc29sZSBtb2RlcyB5ZXQ/ICovCisgICAgICBpZiAoIWJhY2tncmQpCQkJLyogTm8sIGluIGJhY2tncm91bmQ/ICovCisJY29uZ20oKTsJCQkvKiBObywgdHJ5IHRvIGdldCB0aGVtIG5vdy4gKi8KKyAgICBpZiAoY2dtZiA8IDEpCQkJLyogU3RpbGwgZG9uJ3QgaGF2ZSB0aGVtPyAqLworICAgICAgcmV0dXJuKDApOwkJCS8qIEdpdmUgdXAuICovCisgICAgZGVidWcoRjEwMSwiY29uY2IgdHR5ZmQiLCIiLHR0eWZkKTsKKyAgICBkZWJ1ZyhGMTAxLCJjb25jYiB0dGZkZmxnIiwiIix0dGZkZmxnKTsKKyNpZmRlZiBDT01NRU5UCisgICAgLyogVGhpcyBicmVha3MgcmV0dXJuaW5nIHRvIHByb21wdCBhZnRlciBwcm90b2NvbCB3aXRoICItbCAwIiAqLworICAgIC8qIENvbW1lbnRlZCBvdXQgSnVseSAxOTk4ICovCisgICAgaWYgKHR0ZmRmbGcgJiYgdHR5ZmQgPj0gMCAmJiB0dHlmZCA8IDMpCisgICAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHggPSBpc2F0dHkoMCk7CisgICAgZGVidWcoRjEwMSwiY29uY2IgaXNhdHR5IiwiIix4KTsKKyAgICBpZiAoIXgpIHJldHVybigwKTsJCQkvKiBPbmx5IHdoZW4gcnVubmluZyBvbiByZWFsIHR0eXMgKi8KKyAgICBkZWJ1ZyhGMTAxLCJjb25jYiB4c3VzcGVuZCIsIiIseHN1c3BlbmQpOworICAgIGlmIChiYWNrZ3JkKQkJCS8qIERvIG5vdGhpbmcgaWYgaW4gYmFja2dyb3VuZC4gKi8KKyAgICAgIHJldHVybigwKTsKKyAgICBlc2NjaHIgPSBlc2M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIHRoaXMgYXZhaWxhYmxlIHRvIG90aGVyIGZucyAqLworICAgIGNreGVjaCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2dyYW0gY2FuIGVjaG8gY2hhcmFjdGVycyAqLworI2lmZGVmIGFlZ2lzCisgICAgY29uYnVmbiA9IDA7CisgICAgaWYgKGNvbmNycCkgcmV0dXJuKHdyaXRlKDEsICJcMDM1XDAwMiIsIDIpKTsKKyAgICBpZiAoY29udWlkID09IGlucHV0X3BhZF8kdWlkKSB7cGFkXyRyYXcoaW9zXyRzdGRpbiwgc3QpOyByZXR1cm4oMCk7fQorI2VuZGlmIC8qIGFlZ2lzICovCisKKyNpZmRlZiBDT0hFUkVOVAorI2RlZmluZSBTVk9SUE9TSVgKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisjaWZkZWYgUGxhbjkKKyAgICB4ID0gcDljb25jYigpOworI2Vsc2UKKyNpZm5kZWYgU1ZPUlBPU0lYCQkJLyogQlNELCBWNywgZXRjICovCisgICAgZGVidWcoRjEwMSwiY2NjYnJrLnNnX2ZsYWdzIGNvbmNiIDEiLCIiLCBjY2Nicmsuc2dfZmxhZ3MpOworICAgIGRlYnVnKEYxMDEsImNvbmNiIHN0dHkgQ0JSRUFLIiwiIiwwKTsKKyAgICBjY2Nicmsuc2dfZmxhZ3MgfD0gKENCUkVBS3xDUk1PRCk7CS8qIFNldCB0byBjaGFyYWN0ZXIgd2FrZXVwLCAqLworICAgIGNjY2Jyay5zZ19mbGFncyAmPSB+RUNITzsgICAgICAgICAgIC8qIG5vIGVjaG8uICovCisgICAgZGVidWcoRjEwMSwiY2NjYnJrLnNnX2ZsYWdzIGNvbmNiIDIiLCIiLCBjY2Nicmsuc2dfZmxhZ3MpOworICAgIGVycm5vID0gMDsKKy8qCisgIEJTRCBzdHR5KCkgY2xlYXJzIHRoZSBjb25zb2xlIGJ1ZmZlci4gIFNvIGlmIGFueXRoaW5nIGlzIHdhaXRpbmcgaW4gaXQsCisgIHdlIGhhdmUgdG8gcmVhZCBpdCBub3cgdG8gYXZvaWQgbG9zaW5nIGl0LgorKi8KKyAgICB4ID0gY29uY2hrKCk7CisgICAgaWYgKHggPiAwKQorICAgICAgY29uZ2V0YnVmKHgpOworCisjaWZkZWYgQkVMTFYxMAorICAgIHggPSBpb2N0bCgwLFRJT0NTRVRQLCZjY2NicmspOworI2Vsc2UKKyAgICB4ID0gc3R0eSgwLCZjY2NicmspOworICAgIGRlYnVnKEYxMDEsImNjY2Jyay5zZ19mbGFncyBjb25jYiB4IiwiIiwgeCk7CisjZW5kaWYgLyogQkVMTFYxMCAqLworI2Vsc2UJCQkJCS8qIFN5cyBWIGFuZCBQT1NJWCAqLworI2lmbmRlZiBPWE9TCisgICAgZGVidWcoRjEwMSwiY29uY2IgY2NjYnJrLmNfZmxhZyIsIiIsY2NjYnJrLmNfbGZsYWcpOworI2lmZGVmIFFOWAorICAgIC8qIERvbid0IG1lc3Mgd2l0aCBJRVhURU4gKi8KKyAgICBjY2NicmsuY19sZmxhZyAmPSB+KElDQU5PTnxFQ0hPKTsKKyNlbHNlCisjaWZkZWYgQ09IRVJFTlQKKyAgICBjY2NicmsuY19sZmxhZyAmPSB+KElDQU5PTnxFQ0hPKTsKKyNlbHNlCisgICAgY2NjYnJrLmNfbGZsYWcgJj0gfihJQ0FOT058RUNIT3xJRVhURU4pOworI2VuZGlmIC8qIENPSEVSRU5UICovCisjZW5kaWYgLyogUU5YICovCisgICAgY2NjYnJrLmNfbGZsYWcgfD0gSVNJRzsJCS8qIEFsbG93IHNpZ25hbHMgaW4gY29tbWFuZCBtb2RlLiAqLworICAgIGNjY2Jyay5jX2lmbGFnIHw9IElHTkJSSzsJCS8qIEJ1dCBpZ25vcmUgQlJFQUsgc2lnbmFsICovCisgICAgY2NjYnJrLmNfaWZsYWcgJj0gfkJSS0lOVDsKKworI2Vsc2UgLyogT1hPUyAqLworICAgIGRlYnVnKEYxMDAsImNvbmNiIE9YT1MgaXMgZGVmaW5lZCIsIiIsMCk7CisgICAgY2NjYnJrLmNfbGZsYWcgJj0gfihJQ0FOT058RUNITyk7CisgICAgY2NjYnJrLmNfY2NbVkRJU0NBUkRdID0gY2NjYnJrLmNfY2NbVkxORVhUXSA9IENESVNBQkxFOworI2VuZGlmIC8qIE9YT1MgKi8KKyNpZmRlZiBDT01NRU5UCisvKgorICBCZWxpZXZlIGl0IG9yIG5vdCwgaW4gU0NPIFVOSVgsIFZTVVNQIGlzIGdyZWF0ZXIgdGhhbiBOQ0MsIGFuZCBzbyB0aGlzCisgIGFycmF5IHJlZmVyZW5jZSBpcyBvdXQgb2YgYm91bmRzLiAgSXQncyBvbmx5IGEgZGVidWcoKSBjYWxsIHNvIHdobyBuZWVkcyBpdC4KKyovCisjaWZkZWYgVlNVU1AKKyAgICBkZWJ1ZyhGMTAxLCJjb25jYiBjX2NjW1ZTVVNQXSIsIiIsY2NjYnJrLmNfY2NbVlNVU1BdKTsKKyNlbmRpZiAvKiBWU1VTUCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZm5kZWYgVklOVFIKKyAgICBkZWJ1ZyhGMTAxLCJjb25jYiBjX2NjWzBdIiwiIixjY2NicmsuY19jY1swXSk7CisgICAgY2NjYnJrLmNfY2NbMF0gPSAwMDM7ICAgICAgICAgICAgICAgLyogSW50ZXJydXB0IGNoYXIgaXMgQ29udHJvbC1DICovCisjZWxzZQorICAgIGRlYnVnKEYxMDEsImNvbmNiIGNfY2NbVklOVFJdIiwiIixjY2NicmsuY19jY1swXSk7CisgICAgY2NjYnJrLmNfY2NbVklOVFJdID0gMDAzOworI2VuZGlmIC8qIFZJTlRSICovCisjaWZuZGVmIFZRVUlUCisgICAgY2NjYnJrLmNfY2NbMV0gPSBlc2NjaHI7ICAgICAgICAgICAgLyogZXNjYXBlIGR1cmluZyBwYWNrZXQgbW9kZXMgKi8KKyNlbHNlCisgICAgY2NjYnJrLmNfY2NbVlFVSVRdID0gZXNjY2hyOworI2VuZGlmIC8qIFZRVUlUICovCisjaWZuZGVmIFZFT0YKKyAgICBjY2NicmsuY19jY1s0XSA9IDE7CisjZWxzZQorI2lmbmRlZiBPWE9TCisjaWZkZWYgVk1JTgorICAgIGNjY2Jyay5jX2NjW1ZNSU5dID0gMTsKKyNlbmRpZiAvKiBWTUlOICovCisjZWxzZSAvKiBPWE9TICovCisgICAgY2NjYnJrLmNfbWluID0gMTsKKyNlbmRpZiAvKiBPWE9TICovCisjZW5kaWYgLyogVkVPRiAqLworI2lmZGVmIFpJTE9HCisgICAgY2NjYnJrLmNfY2NbNV0gPSAwOworI2Vsc2UKKyNpZm5kZWYgVkVPTAorICAgIGNjY2Jyay5jX2NjWzVdID0gMTsKKyNlbHNlCisjaWZuZGVmIE9YT1MKKyNpZmRlZiBWVElNRQorICAgIGNjY2Jyay5jX2NjW1ZUSU1FXSA9IDE7CisjZW5kaWYgLyogVlRJTUUgKi8KKyNlbHNlIC8qIE9YT1MgKi8KKyAgICBjY2NicmsuY190aW1lID0gMTsKKyNlbmRpZiAvKiBPWE9TICovCisjZW5kaWYgLyogVkVPTCAqLworI2VuZGlmIC8qIFpJTE9HICovCisgICAgZXJybm8gPSAwOworI2lmZGVmIEJTRDQ0T1JQT1NJWAkJCS8qIFNldCBuZXcgbW9kZXMgKi8KKyAgICB4ID0gdGNzZXRhdHRyKDAsVENTQURSQUlOLCZjY2NicmspOworI2Vsc2UgLyogQVRUU1YgKi8gICAgICAJCQkvKiBvciB0aGUgUE9TSVggd2F5ICovCisgICAgeCA9IGlvY3RsKDAsVENTRVRBVywmY2NjYnJrKTsJLyogdGhlIFN5cyBWIHdheSAqLworI2VuZGlmIC8qIEJTRDQ0T1JQT1NJWCAqLworI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworCisjaWZkZWYgQ09IRVJFTlQKKyN1bmRlZiBTVk9SUE9TSVgKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworICAgIGRlYnVnKEYxMDEsImNvbmNiIHgiLCIiLHgpOworICAgIGRlYnVnKEYxMDEsImNvbmNiIGVycm5vIiwiIixlcnJubyk7CisjaWZkZWYgTk9OT1NFVEJVRgorICAgIGlmICh4ID4gLTEpIHsKKwlzZXRidWYoc3Rkb3V0LE5VTEwpOyAgICAvKiBNYWtlIGNvbnNvbGUgdW5idWZmZXJlZC4gKi8KKwlkZWJ1ZyhGMTAwLCJjb25jYiBzZXRidWYgQSIsIiIsMCk7CisgICAgfQorI2Vsc2UKKyNpZm5kZWYgYWVnaXMKKyNpZm5kZWYgTk9TRVRCVUYKKyAgICBpZiAoeCA+IC0xKSB7CisJc2V0YnVmKHN0ZG91dCxOVUxMKTsgICAgLyogTWFrZSBjb25zb2xlIHVuYnVmZmVyZWQuICovCisJZGVidWcoRjEwMCwiY29uY2Igc2V0YnVmIEIiLCIiLDApOworICAgIH0KKyNlbmRpZiAvKiBOT1NFVEJVRiAqLworI2VuZGlmIC8qIGFlZ2lzICovCisjZW5kaWYgLyogTk9OT1NFVEJVRiAqLworCisjaWZkZWYgIFY3CisjaWZuZGVmIE1JTklYCisgICAgaWYgKGttZW1bQ09OXSA8IDApIHsKKyAgICAgICAgcWFkZHJbQ09OXSA9IGluaXRyYXdxKDApOworICAgICAgICBpZigoa21lbVtDT05dID0gb3BlbigiL2Rldi9rbWVtIiwgMCkpIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCByZWFkIC9kZXYva21lbSBpbiBjb25jYi5cbiIpOworICAgICAgICAgICAgcGVycm9yKCIvZGV2L2ttZW0iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTUlOSVggKi8KKyNlbmRpZiAvKiBWNyAqLworI2VuZGlmIC8qIFBsYW45ICovCisKKyAgICBpZiAoeCA+IC0xKQorICAgICAgY29uc3RhdGUgPSBDT05fQ0I7CisKKyAgICBkZWJ1ZyhGMTAxLCJjb25jYiByZXR1cm5zIiwiIix4KTsKKyAgICByZXR1cm4oeCk7Cit9CisKKy8qICBDIE8gTiBCIEkgTiAgLS0gIFB1dCBjb25zb2xlIGluIGJpbmFyeSBtb2RlICAqLworCisvKiAgUmV0dXJucyAwIGlmIG9rLCAtMSBpZiBub3QgICovCisKK2ludAorI2lmZGVmIENLX0FOU0lDCitjb25iaW4oY2hhciBlc2MpCisjZWxzZQorY29uYmluKGVzYykgY2hhciBlc2M7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGNvbmJpbiAqLyAgeworCisgICAgaW50IHg7CisKKyAgICBkZWJ1ZyhGMTAxLCJjb25iaW4gY29uc3RhdGUiLCIiLGNvbnN0YXRlKTsKKworICAgIGlmIChjb25zdGF0ZSA9PSBDT05fQklOKQorICAgICAgcmV0dXJuKDApOworCisgICAgaWYgKCFpc2F0dHkoMCkpIHJldHVybigwKTsgICAgICAgICAgLyogb25seSBmb3IgcmVhbCB0dHlzICovCisgICAgY29uZ20oKTsJCQkJLyogR2V0IG1vZGVzIGlmIG5lY2Vzc2FyeS4gKi8KKyAgICBkZWJ1ZyhGMTAwLCJjb25iaW4iLCIiLDApOworICAgIGVzY2NociA9IGVzYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIE1ha2UgdGhpcyBhdmFpbGFibGUgdG8gb3RoZXIgZm5zICovCisgICAgY2t4ZWNoID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvZ3JhbSBjYW4gZWNobyBjaGFyYWN0ZXJzICovCisjaWZkZWYgYWVnaXMKKyAgICBjb25idWZuID0gMDsKKyAgICBpZiAoY29uY3JwKSByZXR1cm4od3JpdGUoMSwgIlwwMzVcMDAyIiwgMikpOworICAgIGlmIChjb251aWQgPT0gaW5wdXRfcGFkXyR1aWQpIHsKKwlwYWRfJHJhdyhpb3NfJHN0ZGluLCBzdCk7CisJcmV0dXJuKDApOworICAgICAgfQorI2VuZGlmIC8qIGFlZ2lzICovCisKKyNpZmRlZiBDT0hFUkVOVAorI2RlZmluZSBTVk9SUE9TSVgKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisjaWZkZWYgUGxhbjkKKyAgICByZXR1cm4gcDljb25iaW4oKTsKKyNlbHNlCisjaWZkZWYgU1ZPUlBPU0lYCisjaWZuZGVmIE9YT1MKKyNpZmRlZiBRTlgKKyAgICBjY3Jhdy5jX2xmbGFnICY9IH4oSVNJR3xJQ0FOT058RUNITyk7CisjZWxzZQorI2lmZGVmIENPSEVSRU5UCisgICAgY2NyYXcuY19sZmxhZyAmPSB+KElTSUd8SUNBTk9OfEVDSE8pOworI2Vsc2UKKyAgICBjY3Jhdy5jX2xmbGFnICY9IH4oSVNJR3xJQ0FOT058RUNIT3xJRVhURU4pOworI2VuZGlmIC8qIENPSEVSRU5UICovCisjZW5kaWYgLyogUU5YICovCisjZWxzZSAvKiBPWE9TICovCisgICAgY2NyYXcuY19sZmxhZyAmPSB+KElTSUd8SUNBTk9OfEVDSE8pOworICAgIGNjcmF3LmNfY2NbVkRJU0NBUkRdID0gY2NyYXcuY19jY1tWTE5FWFRdID0gQ0RJU0FCTEU7CisjZW5kaWYgLyogT1hPUyAqLworICAgIGNjcmF3LmNfaWZsYWcgfD0gSUdOUEFSOworLyoKKyAgTm90ZSB0aGF0IGZvciB0ZXJtaW5hbCBzZXNzaW9ucyB3ZSBkaXNhYmxlIFhvbi9Yb2ZmIGZsb3cgY29udHJvbCB0byBhbGxvdworICB0aGUgcGFzc2FnZSBeUSBhbmQgXlMgYXMgZGF0YSBjaGFyYWN0ZXJzIGZvciBFTUFDUywgYW5kIHRvIGFsbG93IFhNT0RFTQorICB0cmFuc2ZlcnMgdG8gd29yayB3aGVuIEMtS2VybWl0IGlzIGluIHRoZSBtaWRkbGUsIGV0Yy4gIEhhcmR3YXJlIGZsb3cKKyAgY29udHJvbCwgaWYgaW4gdXNlLCBpcyBub3QgYWZmZWN0ZWQuCisqLworI2lmZGVmIEFUVFNWCisjaWZkZWYgQlNENDQKKyAgICBjY3Jhdy5jX2lmbGFnICY9IH4oSUdOQlJLfElOTENSfElHTkNSfElDUk5MfElYT058SVhBTll8SVhPRkYKKyAgICAgICAgICAgICAgICAgICAgICAgIHxJTlBDS3xJU1RSSVApOworI2Vsc2UKKyAgICBjY3Jhdy5jX2lmbGFnICY9IH4oSUdOQlJLfElOTENSfElHTkNSfElDUk5MfElVQ0xDfElYT058SVhBTll8SVhPRkYKKyAgICAgICAgICAgICAgICAgICAgICAgIHxJTlBDS3xJU1RSSVApOworI2VuZGlmIC8qIEJTRDQ0ICovCisjZWxzZSAvKiBQT1NJWCAqLworICAgIGNjcmF3LmNfaWZsYWcgJj0gfihJR05CUkt8SU5MQ1J8SUdOQ1J8SUNSTkx8SVhPTnxJWE9GRnxJTlBDS3xJU1RSSVApOworI2VuZGlmIC8qIEFUVFNWICovCisgICAgY2NyYXcuY19vZmxhZyAmPSB+T1BPU1Q7CisjaWZkZWYgQ09NTUVOVAorLyoKKyAgV0hBVCBUSEUgSEVDSyBXQVMgVEhJUyBGT1I/CisgIFRoZSBCOTYwMCBzZXR0aW5nIChvYnZpb3VzbHkpIHByZXZlbnRzIENPTk5FQ1QgZnJvbSB3b3JraW5nIGF0IGFueQorICBzcGVlZCBvdGhlciB0aGFuIDk2MDAgd2hlbiB5b3UgYXJlIGxvZ2dlZCBpbiB0byB0aGUgNzMwMCBvbiBhIHNlcmlhbAorICBsaW5lLiAgTWF5YmUgc29tZSBvZiB0aGUgb3RoZXIgZmxhZ3MgYXJlIG5lY2Vzc2FyeSAtLSBpZiBzbywgcHV0IGJhY2sKKyAgdGhlIG9uZXMgdGhhdCBhcmUgbmVlZGVkLiAgVGhpcyBjb2RlIGlzIHN1cHBvc2VkIHRvIHdvcmsgdGhlIHNhbWUsIG5vCisgIG1hdHRlciB3aGV0aGVyIHlvdSBhcmUgbG9nZ2VkIGluIHRvIHRoZSA3MzAwIG9uIHRoZSByZWFsIGNvbnNvbGUgZGV2aWNlLAorICBvciB0aHJvdWdoIGEgc2VyaWFsIHBvcnQuCisqLworI2lmZGVmIEFUVDczMDAKKyAgICBjY3Jhdy5jX2NmbGFnID0gQ0xPQ0FMIHwgQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMOworI2VuZGlmIC8qIEFUVDczMDAgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qKiogS2VybWl0IHVzZWQgdG8gcHV0IHRoZSBjb25zb2xlIGluIDgtYml0IHJhdyBtb2RlLCBidXQgc29tZSB1c2VycyBoYXZlCisgKioqIHBvaW50ZWQgb3V0IHRoYXQgdGhpcyBzaG91bGQgbm90IGJlIGRvbmUsIHNpbmNlIHNvbWUgc2l0ZXMgYWN0dWFsbHkKKyAqKiogdXNlIHRlcm1pbmFscyB3aXRoIHBhcml0eSBzZXR0aW5ncyBvbiB0aGVpciBVbml4IHN5c3RlbXMsIGFuZCBpZiB3ZQorICoqKiBvdmVycmlkZSB0aGUgY3VycmVudCBzZXR0aW5ncyBhbmQgc3RvcCBkb2luZyBwYXJpdHksIHRoZW4gdGhlaXIgdGVybWluYWxzCisgKioqIHdpbGwgZGlzcGxheSBibG90Y2hlcyBmb3IgY2hhcmFjdGVycyB3aG9zZSBwYXJpdHkgaXMgd3JvbmcuICBUaGVyZWZvcmUsCisgKioqIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGFyZSBjb21tZW50ZWQgb3V0IChMYXJyeSBBZnJpbiwgQ2xlbXNvbiBVKToKKyAqKioKKyAqKiogICBjY3Jhdy5jX2NmbGFnICY9IH4oUEFSRU5CfENTSVpFKTsKKyAqKiogICBjY3Jhdy5jX2NmbGFnIHw9IChDUzh8Q1JFQUQpOworICoqKgorICoqKiBTeXMgSUlJL1Ygc2l0ZXMgdGhhdCBoYXZlIHRyb3VibGUgd2l0aCB0aGlzIGNhbiByZXN0b3JlIHRoZXNlIGxpbmVzLgorICoqKi8KKyNpZm5kZWYgVklOVFIKKyAgICBjY3Jhdy5jX2NjWzBdID0gMDAzOwkJLyogSW50ZXJydXB0IGNoYXIgaXMgQ3RybC1DICovCisjZWxzZQorICAgIGNjcmF3LmNfY2NbVklOVFJdID0gMDAzOworI2VuZGlmIC8qIFZJTlRSICovCisjaWZuZGVmIFZRVUlUCisgICAgY2NyYXcuY19jY1sxXSA9IGVzY2NocjsJCS8qIEVzY2FwZSBkdXJpbmcgcGFja2V0IG1vZGUgKi8KKyNlbHNlCisgICAgY2NyYXcuY19jY1tWUVVJVF0gPSBlc2NjaHI7CisjZW5kaWYgLyogVlFVSVQgKi8KKyNpZm5kZWYgVkVPRgorICAgIGNjcmF3LmNfY2NbNF0gPSAxOworI2Vsc2UKKyNpZm5kZWYgT1hPUworI2lmZGVmIFZNSU4KKyAgICBjY3Jhdy5jX2NjW1ZNSU5dID0gMTsKKyNlbmRpZiAvKiBWTUlOICovCisjZWxzZSAvKiBPWE9TICovCisgICAgY2NyYXcuY19taW4gPSAxOworI2VuZGlmIC8qIE9YT1MgKi8KKyNlbmRpZiAvKiBWRU9GICovCisKKyNpZmRlZiBaSUxPRworICAgIGNjcmF3LmNfY2NbNV0gPSAwOworI2Vsc2UKKyNpZm5kZWYgVkVPTAorICAgIGNjcmF3LmNfY2NbNV0gPSAxOworI2Vsc2UKKyNpZm5kZWYgT1hPUworI2lmZGVmIFZUSU1FCisgICAgY2NyYXcuY19jY1tWVElNRV0gPSAxOworI2VuZGlmIC8qIFZUSU1FICovCisjZWxzZSAvKiBPWE9TICovCisgICAgY2NyYXcuY190aW1lID0gMTsKKyNlbmRpZiAvKiBPWE9TICovCisjZW5kaWYgLyogVkVPTCAqLworI2VuZGlmIC8qIFpJTE9HICovCisKKyNpZmRlZiBCU0Q0NE9SUE9TSVgKKyAgICB4ID0gdGNzZXRhdHRyKDAsVENTQURSQUlOLCZjY3Jhdyk7CS8qIFNldCBuZXcgbW9kZXMuICovCisjZWxzZQorICAgIHggPSBpb2N0bCgwLFRDU0VUQVcsJmNjcmF3KTsKKyNlbmRpZiAvKiBCU0Q0NE9SUE9TSVggKi8KKyNlbHNlIC8qIEJlcmtlbGV5LCBldGMuICovCisgICAgeCA9IGNvbmNoaygpOwkJCS8qIEJlY2F1c2Ugc3R0eSgpIGlzIGRlc3RydWN0aXZlICovCisgICAgaWYgKHggPiAwKQorICAgICAgY29uZ2V0YnVmKHgpOworICAgIGNjcmF3LnNnX2ZsYWdzIHw9IChSQVd8VEFOREVNKTsgICAgIC8qIFNldCByYXdtb2RlLCBYT04vWE9GRiAoaGEpICovCisgICAgY2NyYXcuc2dfZmxhZ3MgJj0gfihFQ0hPfENSTU9EKTsgICAgLyogU2V0IGNoYXIgd2FrZXVwLCBubyBlY2hvICovCisjaWZkZWYgQkVMTFYxMAorICAgIHggPSBpb2N0bCgwLFRJT0NTRVRQLCZjY3Jhdyk7CisjZWxzZQorICAgIHggPSBzdHR5KDAsJmNjcmF3KTsKKyNlbmRpZiAvKiBCRUxMVjEwICovCisjZW5kaWYgLyogU1ZPUlBPU0lYICovCisjZW5kaWYgLyogUGxhbjkgKi8KKworICAgIGlmICh4ID4gLTEpCisgICAgICBjb25zdGF0ZSA9IENPTl9CSU47CisKKyAgICBkZWJ1ZyhGMTAxLCJjb25iaW4gcmV0dXJucyIsIiIseCk7CisgICAgcmV0dXJuKHgpOworCisjaWZkZWYgQ09IRVJFTlQKKyN1bmRlZiBTVk9SUE9TSVgKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCit9CisKKworLyogIEMgTyBOIFIgRSBTICAtLSAgUmVzdG9yZSB0aGUgY29uc29sZSB0ZXJtaW5hbCAgKi8KKworaW50Citjb25yZXMoKSB7CisgICAgaW50IHg7CisgICAgZGVidWcoRjEwMSwiY29ucmVzIGNnbWYiLCIiLGNnbWYpOworICAgIGRlYnVnKEYxMDEsImNvbnJlcyBjb25zdGF0ZSIsIiIsY29uc3RhdGUpOworCisgICAgaWYgKGNnbWYgPCAxKQkJCS8qIERvIG5vdGhpbmcgaWYgbW9kZXMgdW5jaGFuZ2VkICovCisgICAgICByZXR1cm4oMCk7CisgICAgaWYgKGNvbnN0YXRlID09IENPTl9SRVMpCisgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAoIWlzYXR0eSgwKSkgcmV0dXJuKDApOyAgICAgICAgICAvKiBvbmx5IGZvciByZWFsIHR0eXMgKi8KKyAgICBkZWJ1ZyhGMTAwLCJjb25yZXMgaXNhdHR5IG9rIiwiIiwwKTsKKyAgICBja3hlY2ggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTeXN0ZW0gc2hvdWxkIGVjaG8gY2hhcnMgKi8KKworI2lmZGVmIGFlZ2lzCisgICAgY29uYnVmbiA9IDA7CisgICAgaWYgKGNvbmNycCkgcmV0dXJuKHdyaXRlKDEsICJcMDM1XDAwMSIsIDIpKTsKKyAgICBpZiAoY29udWlkID09IGlucHV0X3BhZF8kdWlkKSB7CisJcGFkXyRjb29rZWQoaW9zXyRzdGRpbiwgc3QpOworCWNvbnN0YXRlID0gQ09OX1JFUzsKKwlyZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIGFlZ2lzICovCisKKyNpZmRlZiBQbGFuOQorICAgIHA5Y29ucmVzKCk7CisjZWxzZQorI2lmZGVmIEJTRDQ0T1JQT1NJWAorICAgIGRlYnVnKEYxMDAsImNvbnJlcyByZXN0b3JpbmcgdGNzZXRhdHRyIiwiIiwwKTsKKyAgICB4ID0gdGNzZXRhdHRyKDAsVENTQURSQUlOLCZjY29sZCk7CisjZWxzZQorI2lmZGVmIEFUVFNWCisgICAgZGVidWcoRjEwMCwiY29ucmVzIHJlc3RvcmluZyBpb2N0bCIsIiIsMCk7CisgICAgeCA9IGlvY3RsKDAsVENTRVRBVywmY2NvbGQpOworI2Vsc2UgLyogQlNELCBWNywgYW5kIGZyaWVuZHMgKi8KKyNpZmRlZiBzb255X25ld3MJCQkvKiBTb255IE5FV1MgKi8KKyAgICBpZiAoa21fY29uICE9IC0xKQorICAgICAgaW9jdGwoMCxUSU9DS1NFVCwma21fY29uKTsJLyogUmVzdG9yZSBjb25zb2xlIEthbmppIG1vZGUgKi8KKyNlbmRpZiAvKiBzb255X25ld3MgKi8KKyAgICBtc2xlZXAoMTAwKTsKKyAgICBkZWJ1ZyhGMTAwLCJjb25yZXMgcmVzdG9yaW5nIHN0dHkiLCIiLDApOworICAgIHggPSBjb25jaGsoKTsJCQkvKiBCZWNhdXNlIHN0dHkoKSBpcyBkZXN0cnVjdGl2ZSAqLworICAgIGlmICh4ID4gMCkKKyAgICAgIGNvbmdldGJ1Zih4KTsKKyNpZmRlZiBCRUxMVjEwCisgICAgeCA9IGlvY3RsKDAsVElPQ1NFVFAsJmNjb2xkKTsKKyNlbHNlCisgICAgeCA9IHN0dHkoMCwmY2NvbGQpOworI2VuZGlmIC8qIEJFTExWMTAgKi8KKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIEJTRDQ0T1JQT1NJWCAqLworI2VuZGlmIC8qIFBsYW45ICovCisgICAgaWYgKHggPiAtMSkKKyAgICAgIGNvbnN0YXRlID0gQ09OX1JFUzsKKworICAgIGRlYnVnKEYxMDEsImNvbnJlcyByZXR1cm5zIiwiIix4KTsKKyAgICByZXR1cm4oeCk7Cit9CisKKy8qICBDIE8gTiBPIEMgIC0tICBPdXRwdXQgYSBjaGFyYWN0ZXIgdG8gdGhlIGNvbnNvbGUgdGVybWluYWwgICovCisKK2ludAorI2lmZGVmIENLX0FOU0lDCitjb25vYyhjaGFyIGMpCisjZWxzZQorY29ub2MoYykgY2hhciBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBjb25vYyAqLyB7CisKKyNpZmRlZiBJS1NECisgICAgaWYgKGluc2VydmVyICYmICFsb2NhbCkKKyAgICAgIHJldHVybih0dG9jKGMpKTsKKworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBpZiAoaW5zZXJ2ZXIgJiYgVEVMT1BUX01FKFRFTE9QVF9FTkNSWVBUSU9OKSkKKyAgICAgICAgY2tfdG5fZW5jcnlwdCgmYywxKTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjZW5kaWYgLyogSUtTRCAqLworCisjaWZkZWYgUGxhbjkKKyAgICByZXR1cm4gY29ud3JpdGUoJmMsMSk7CisjZWxzZQorICAgIHJldHVybih3cml0ZSgxLCZjLDEpKTsKKyNlbmRpZiAvKiBQbGFuOSAqLworfQorCisvKiAgQyBPIE4gWCBPICAtLSAgV3JpdGUgeCBjaGFyYWN0ZXJzIHRvIHRoZSBjb25zb2xlIHRlcm1pbmFsICAqLworCitpbnQKK2NvbnhvKHgscykgaW50IHg7IGNoYXIgKnM7IHsKKworI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIgJiYgIWxvY2FsKQorICAgICAgcmV0dXJuKHR0b2woKENIQVIgKilzLHgpKTsKKworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBpZiAoaW5zZXJ2ZXIgJiYgVEVMT1BUX01FKFRFTE9QVF9FTkNSWVBUSU9OKSkKKyAgICAgICAgY2tfdG5fZW5jcnlwdChzLHgpOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNlbmRpZiAvKiBJS1NEICovCisKKyNpZmRlZiBQbGFuOQorICAgIHJldHVybihjb253cml0ZShzLHgpKTsKKyNlbHNlCisgICAgcmV0dXJuKHdyaXRlKDEscyx4KSk7CisjZW5kaWYgLyogUGxhbjkgKi8KK30KKworLyogIEMgTyBOIE8gTCAgLS0gIFdyaXRlIGEgbGluZSB0byB0aGUgY29uc29sZSB0ZXJtaW5hbCAgKi8KKworaW50Citjb25vbChzKSBjaGFyICpzOyB7CisgICAgaW50IGxlbjsKKyAgICBpZiAoIXMpIHMgPSAiIjsJCQkvKiBBbHdheXMgZG8gdGhpcyEgKi8KKyAgICBsZW4gPSBzdHJsZW4ocyk7CisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgcmV0dXJuKDApOworCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlciAmJiAhbG9jYWwpCisgICAgICByZXR1cm4odHRvbCgoQ0hBUiAqKXMsbGVuKSk7CisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgaWYgKGluc2VydmVyICYmIFRFTE9QVF9NRShURUxPUFRfRU5DUllQVElPTikpIHsKKwlpZiAobnhwYWNrZXQgPCBsZW4pIHsKKwkgICAgaWYgKHhwYWNrZXQpIHsKKwkJZnJlZSh4cGFja2V0KTsKKwkJeHBhY2tldCA9IE5VTEw7CisJCW54cGFja2V0ID0gMDsKKwkgICAgfQorCSAgICBsZW4gPSBsZW4gPiAxMDI0MCA/IGxlbiA6IDEwMjQwOworCSAgICB4cGFja2V0ID0gKGNoYXIgKiltYWxsb2MobGVuKTsKKwkgICAgaWYgKCF4cGFja2V0KSB7CisJCWZwcmludGYoc3RkZXJyLCJ0dG9sIG1hbGxvYyBmYWlsdXJlXG4iKTsKKwkJcmV0dXJuKC0xKTsKKwkgICAgfSBlbHNlCisJICAgICAgbnhwYWNrZXQgPSBsZW47CisJfQorCW1lbWNweSh4cGFja2V0LHMsbGVuKTsKKwlzID0geHBhY2tldDsKKwlja190bl9lbmNyeXB0KHMsbGVuKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2VuZGlmIC8qIElLU0QgKi8KKworI2lmZGVmIFBsYW45CisgICAgcmV0dXJuKGNvbndyaXRlKHMsbGVuKSk7CisjZWxzZQorICAgIHJldHVybih3cml0ZSgxLHMsbGVuKSk7CisjZW5kaWYgLyogUGxhbjkgKi8KK30KKworLyogIEMgTyBOIE8gTCBBICAtLSAgV3JpdGUgYW4gYXJyYXkgb2YgbGluZXMgdG8gdGhlIGNvbnNvbGUgdGVybWluYWwgKi8KKworaW50Citjb25vbGEocykgY2hhciAqc1tdOyB7CisgICAgY2hhciAqIHA7CisgICAgaW50IGksIHg7CisKKworICAgIGlmICghcykgcmV0dXJuKDApOworICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7CisJcCA9IHNbaV07CisJaWYgKCFwKSBwID0gIiI7CQkJLyogTGV0J3Mgbm90IGR1bXAgY29yZSBzaGFsbCB3ZT8gKi8KKwlpZiAoISpwKQorCSAgYnJlYWs7CisjaWZkZWYgSUtTRAorCWlmIChpbnNlcnZlciAmJiAhbG9jYWwpCisJICB4ID0gdHRvbCgoQ0hBUiAqKXAsKGludClzdHJsZW4ocCkpOworCWVsc2UKKyNlbmRpZiAvKiBJS1NEICovCisJICB4ID0gY29ub2wocCk7CisJaWYgKHggPCAwKQorCSAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisvKiAgQyBPIE4gTyBMIEwgIC0tICBPdXRwdXQgYSBzdHJpbmcgZm9sbG93ZWQgYnkgQ1JMRiAgKi8KKworaW50Citjb25vbGwocykgY2hhciAqczsgeworICAgIENIQVIgYnVmWzNdOworICAgIGJ1ZlswXSA9ICdccic7CisgICAgYnVmWzFdID0gJ1xuJzsKKyAgICBidWZbMl0gPSAnXDAnOworICAgIGlmICghcykgcyA9ICIiOworCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlciAmJiAhbG9jYWwpIHsKKwlpZiAoKnMpIHR0b2woKENIQVIgKilzLChpbnQpc3RybGVuKHMpKTsKKwlyZXR1cm4odHRvbChidWYsMikpOworICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisKKyAgICBpZiAoKnMpIGNvbm9sKHMpOworI2lmZGVmIElLU0QKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgaWYgKGluc2VydmVyICYmIFRFTE9QVF9NRShURUxPUFRfRU5DUllQVElPTikpCisgICAgICBja190bl9lbmNyeXB0KGJ1ZiwyKTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjZW5kaWYgLyogSUtTRCAqLworCisjaWZkZWYgUGxhbjkKKyAgICByZXR1cm4oY29ud3JpdGUoYnVmLCAyKSk7CisjZWxzZQorICAgIHJldHVybih3cml0ZSgxLGJ1ZiwyKSk7CisjZW5kaWYgLyogUGxhbjkgKi8KK30KKworLyogIEMgTyBOIEMgSCBLICAtLSAgUmV0dXJuIGhvdyBtYW55IGNoYXJhY3RlcnMgYXZhaWxhYmxlIGF0IGNvbnNvbGUgICovCisvKgorICBXZSBjb3VsZCBhbHNvIHVzZSBzZWxlY3QoKSBoZXJlIHRvIGNvdmVyIGEgZmV3IG1vcmUgc3lzdGVtcyB0aGF0IGFyZSBub3QKKyAgY292ZXJlZCBieSBhbnkgb2YgdGhlIGZvbGxvd2luZywgZS5nLiBIUC1VWCA5LjB4IG9uIHRoZSBtb2RlbCA4MDAuCisqLworaW50Citjb25jaGsoKSB7CisgICAgc3RhdGljIGludCBjb250eXAgPSAwOwkJLyogKzEgZm9yIGlzYXR0eSwgLTEgb3RoZXJ3aXNlICovCisKKyAgICBpZiAoY29udHlwID09IDApCQkJLyogVGhpcyBwcmV2ZW50cyB1bm5lY2Vzc2FyeSAqLworICAgICAgY29udHlwID0gKGlzYXR0eSgwKSA/IDEgOiAtMSk7CS8qIGR1cGxpY2F0ZWQgY2FsbHMgdG8gaXNhdHR5KCkgKi8KKyAgICBkZWJ1ZyhGMTAxLCJjb25jaGsgY29udHlwIiwiIixjb250eXApOworICAgIGlmIChiYWNrZ3JkIHx8IChjb250eXAgPCAwKSkKKyAgICAgIHJldHVybigwKTsKKworI2lmZGVmIGFlZ2lzCisgICAgaWYgKGNvbmJ1Zm4gPiAwKSByZXR1cm4oY29uYnVmbik7ICAgLyogdXNlIG9sZCBjb3VudCBpZiBub256ZXJvICovCisKKyAgICAvKiByZWFkIGluIG1vcmUgY2hhcmFjdGVycyAqLworICAgIGNvbmJ1Zm4gPSBpb3NfJGdldChpb3NfJHN0ZGluLAorICAgICAgICAgICAgICBpb3NfJGNvbmRfb3B0LCBjb25idWYsIChsb25nKXNpemVvZihjb25idWYpLCBzdCk7CisgICAgaWYgKHN0LmFsbCAhPSBzdGF0dXNfJG9rKSBjb25idWZuID0gMDsKKyAgICBjb25idWZwID0gY29uYnVmOworICAgIHJldHVybihjb25idWZuKTsKKyNlbHNlCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlciAmJiAhbG9jYWwpCisgICAgICByZXR1cm4oaW5fY2hrKDEsdHR5ZmQpKTsKKyAgICBlbHNlCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgcmV0dXJuKGluX2NoaygwLDApKTsKKyNlbmRpZiAvKiBhZWdpcyAqLworfQorCisvKiAgQyBPIE4gSSBOIEMgIC0tICBHZXQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgY29uc29sZSAgKi8KKy8qCisgIENhbGwgd2l0aCB0aW1vID4gMCB0byBkbyBhIHRpbWVkIHJlYWQsIHRpbW8gPT0gMCB0byBkbyBhbiB1bnRpbWVkIGJsb2NraW5nCisgIHJlYWQuICBVcG9uIHN1Y2Nlc3MsIHJldHVybnMgdGhlIGNoYXJhY3Rlci4gIFVwb24gZmFpbHVyZSwgcmV0dXJucyAtMS4KKyAgQSB0aW1lZCByZWFkIHRoYXQgZG9lcyBub3QgY29tcGxldGUgd2l0aGluIHRoZSB0aW1lb3V0IHBlcmlvZCByZXR1cm5zIC0yLgorKi8KK2ludAorY29uaW5jKHRpbW8pIGludCB0aW1vOyB7CisgICAgaW50IG4gPSAwOyBDSEFSIGNoOworICAgIGludCB4eDsKKworICAgIGlmIChjb25idWZuID4gMCkgewkJCS8qIElmIHNvbWV0aGluZyBhbHJlYWR5IGJ1ZmZlcmVkICovCisJLS1jb25idWZuOworCXJldHVybigodW5zaWduZWQpKCpjb25idWZwKysgJiAweGZmKSk7CisgICAgfQorCisgICAgZXJybm8gPSAwOwkJCQkvKiBDbGVhciB0aGlzICovCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlciAmJiAhbG9jYWwpIHsKKwl4eCA9IHR0aW5jKHRpbW8pOworCWlmICh4eCA8IDApCisJICByZXR1cm4odHRpbmN0aW1vID8gLTIgOiAtMSk7CisJZWxzZQorCSAgcmV0dXJuKHh4KTsKKyAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCisjaWZkZWYgYWVnaXMJCQkJLyogQXBvbGxvIEFlZ2lzIG9ubHkuLi4gKi8KKyAgICBkZWJ1ZyhGMTAxLCJjb25pbmMgdGltbyIsIiIsdGltbyk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKGNvbmNoaygpID4gMCkgeworCS0tY29uYnVmbjsKKwlyZXR1cm4oKHVuc2lnbmVkKSgqY29uYnVmcCsrICYgMHhmZikpOworICAgIH0KKyNlbmRpZiAvKiBhZWdpcyAqLworCisjaWZkZWYgVFRMRUJVRgorICAgIGlmICgKKyNpZmRlZiBJS1NECisJaW5zZXJ2ZXIgJiYKKyNlbmRpZiAvKiBJS1NEICovCisJIXhsb2NhbAorCSkgeworCWlmICh0dHB1c2ggPj0gMCkgeworCSAgICBkZWJ1ZyhGMTExLCJ0dGluYyIsInR0cHVzaCIsdHRwdXNoKTsKKwkgICAgY2ggPSB0dHB1c2g7CisJICAgIHR0cHVzaCA9IC0xOworCSAgICByZXR1cm4oY2gpOworCX0KKwlpZiAobGVfZGF0YSkgeworCSAgICBpZiAobGVfZ2V0Y2hhcigmY2gpID4gMCkgeworCQlkZWJ1ZyhGMTExLCJ0dGluYyBMb2NhbEVjaG9JbkJ1ZiIsImNoIixjaCk7CisJCXJldHVybihjaCk7CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmIC8qIFRUTEVCVUYgKi8KKworICAgIGlmICh0aW1vIDw9IDApIHsJCQkvKiBVbnRpbWVkLCBibG9ja2luZyByZWFkLiAqLworCXdoaWxlICgxKSB7CQkJLyogS2VlcCB0cnlpbmcgdGlsbCB3ZSBnZXQgb25lLiAqLworCSAgICBuID0gcmVhZCgwLCAmY2gsIDEpOwkvKiBSZWFkIGEgY2hhcmFjdGVyLiAqLworCSAgICBpZiAobiA9PSAwKSBjb250aW51ZTsJLyogU2hvdWxkbid0IGhhcHBlbi4gKi8KKwkgICAgaWYgKG4gPiAwKSB7CQkvKiBJZiByZWFkIHdhcyBzdWNjZXNzZnVsLCAqLworI2lmZGVmIElLU0QKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiY29uaW5jIGRlY3J5cHQgMSIsIiIsMCk7CisgICAgICAgICAgICAgICAgaWYgKGluc2VydmVyICYmICFsb2NhbCAmJiBURUxPUFRfVShURUxPUFRfRU5DUllQVElPTikpCisJCSAgY2tfdG5fZGVjcnlwdCgmY2gsMSk7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2VuZGlmIC8qIElLU0QgKi8KKwkJcmV0dXJuKCh1bnNpZ25lZCkoY2ggJiAweGZmKSk7IC8qIHJldHVybiB0aGUgY2hhcmFjdGVyLiAqLworICAgICAgICAgICAgfQorCisvKiBDb21lIGhlcmUgaWYgcmVhZCgpIHJldHVybmVkIGFuIGVycm9yLiAqLworCisJICAgIGRlYnVnKEYxMDEsICJjb25pbmMoMCkgZXJybm8iLCIiLGVycm5vKTsgLyogTG9nIHRoZSBlcnJvci4gKi8KKyNpZm5kZWYgT1hPUworI2lmZGVmIFNWT1JQT1NJWAorI2lmZGVmIENJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0lFIFJlZ3VsdXMgaGFzIG5vIEVJTlRSIHN5bWJvbD8gKi8KKyNpZm5kZWYgRUlOVFIKKyNkZWZpbmUgRUlOVFIgNAorI2VuZGlmIC8qIEVJTlRSICovCisjZW5kaWYgLyogQ0lFICovCisvKgorICBUaGlzIHJvdXRpbmUgaXMgdXNlZCBmb3Igc2V2ZXJhbCBkaWZmZXJlbnQgcHVycG9zZXMuICBJbiBDT05ORUNUIG1vZGUsIGl0IGlzCisgIHVzZWQgdG8gZG8gYW4gdW50aW1lZCwgYmxvY2tpbmcgcmVhZCBmcm9tIHRoZSBrZXlib2FyZCBpbiB0aGUgbG93ZXIgQ09OTkVDVAorICBmb3JrLiAgRHVyaW5nIGxvY2FsLW1vZGUgZmlsZSB0cmFuc2ZlciwgaXQgcmVhZHMgYSBjaGFyYWN0ZXIgZnJvbSB0aGUKKyAgY29uc29sZSB0byBpbnRlcnJ1cHQgdGhlIGZpbGUgdHJhbnNmZXIgKGxpa2UgQSBmb3IgYSBzdGF0dXMgcmVwb3J0LCBYIHRvCisgIGNhbmNlbCBhIGZpbGUsIGV0YykuICBPYnZpb3VzbHksIHdlIGRvbid0IHdhbnQgdGhlIHJlYWRzIGluIHRoZSBsYXR0ZXIgY2FzZQorICB0byBiZSBibG9ja2luZywgb3IgdGhlIGZpbGUgdHJhbnNmZXIgd291bGQgc3RvcCB1bnRpbCB0aGUgdXNlciB0eXBlZAorICBzb21ldGhpbmcuICBVbmZvcnR1bmF0ZWx5LCBTeXN0ZW0gViBkb2VzIG5vdCBhbGxvdyB0aGUgY29uc29sZSBkZXZpY2UgaW5wdXQKKyAgYnVmZmVyIHRvIGJlIHNhbXBsZWQgbm9uZGVzdHJ1Y3RpdmVseSAoZS5nLiBieSBjb25jaGsoKSksIHNvIGEga2x1ZGdlIGlzCisgIHVzZWQgaW5zdGVhZC4gIER1cmluZyBsb2NhbC1tb2RlIGZpbGUgdHJhbnNmZXIsIHRoZSBTSUdRVUlUIHNpZ25hbCBpcyBhcm1lZAorICBhbmQgdHJhcHBlZCBieSBlc2N0cnAoKSwgYW5kIHRoaXMgcm91dGluZSBwcmV0ZW5kcyB0byBoYXZlIHJlYWQgdGhlIHF1aXQKKyAgY2hhcmFjdGVyIGZyb20gdGhlIGtleWJvYXJkIG5vcm1hbGx5LiAgQnV0LCBrbHVkZ2Ugb3Igbm8ga2x1ZGdlLCB0aGUgcmVhZCgpCisgIGlzc3VlZCBieSB0aGlzIGNvbW1hbmQsIHVuZGVyIFN5c3RlbSBWIG9ubHksIGNhbiBmYWlsIGlmIGEgc2lnbmFsIC0tIEFOWQorICBzaWduYWwgLS0gaXMgY2F1Z2h0IHdoaWxlIHRoZSByZWFkIGlzIHBlbmRpbmcuICBUaGlzIGNhbiBvY2N1ciBub3Qgb25seSB3aGVuCisgIHRoZSB1c2VyIHR5cGVzIHRoZSBxdWl0IGNoYXJhY3RlciwgYnV0IGFsc28gZHVyaW5nIHRlbG5ldCBuZWdvdGlhdGlvbnMsIHdoZW4KKyAgdGhlIGxvd2VyIENPTk5FQ1QgZm9yayBzaWduYWxzIHRoZSB1cHBlciBvbmUgYWJvdXQgYW4gZWNob2luZyBtb2RlIGNoYW5nZS4KKyAgV2hlbiB0aGlzIGhhcHBlbnMsIHdlIGhhdmUgdG8gcG9zdCB0aGUgcmVhZCgpIGFnYWluLiAgVGhpcyBpcyBhcHBhcmVudGx5IG5vdAorICBhIHByb2JsZW0gaW4gQlNELWJhc2VkIFVOSVggdmVyc2lvbnMuCisqLworCSAgICBpZiAoZXJybm8gPT0gRUlOVFIpCQkvKiBSZWFkIGludGVycnVwdGVkLiAqLworCSAgICAgIGlmIChjb25lc2MpICB7CQkvKiBJZiBieSBTSUdRVUlULCAqLworIAkJIGNvbmVzYyA9IDA7CQkvKiB0aGUgY29uZXNjIHZhcmlhYmxlIGlzIHNldCwgKi8KKyAJCSByZXR1cm4oZXNjY2hyKTsJLyogc28gcmV0dXJuIHRoZSBlc2NhcGUgY2hhcmFjdGVyLiAqLworCSAgICAgfSBlbHNlIGNvbnRpbnVlOwkJLyogQnkgb3RoZXIgc2lnbmFsLCB0cnkgYWdhaW4uICovCisjZWxzZQorLyoKKyAgVGhpcyBtaWdodCBiZSBkYW5nZXJvdXMsIGJ1dCBsZXQncyBkbyB0aGlzIG9uIG5vbi1TeXN0ZW0gViB2ZXJzaW9ucyB0b28sCisgIHNpbmNlIGF0IGxlYXN0IG9uZSBTdW5PUyA0LjEuMiB1c2VyIGNvbXBsYWlucyBvZiBpbW1lZGlhdGUgZGlzY29ubmVjdGlvbnMKKyAgdXBvbiBmaXJzdCBtYWtpbmcgYSBURUxORVQgY29ubmVjdGlvbi4KKyovCisJICAgIGlmIChlcnJubyA9PSBFSU5UUikJCS8qIFJlYWQgaW50ZXJydXB0ZWQuICovCisJICAgICAgY29udGludWU7CisjZW5kaWYgLyogU1ZPUlBPU0lYICovCisjZWxzZSAvKiBPWE9TICovCisJICAgIGlmIChlcnJubyA9PSBFSU5UUikJCS8qIFJlYWQgaW50ZXJydXB0ZWQuICovCisJICAgICAgY29udGludWU7CisjZW5kaWYgLyogT1hPUyAqLworCSAgICByZXR1cm4oLTEpOwkJCS8qIEVycm9yICovCisJfQorICAgIH0KKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cgJiYgdGltbyA8PSAwKSB7CisJZGVidWcoRjEwMCwiY29uaW5jIHRpbWVvdXQgbG9naWMgZXJyb3IiLCIiLDApOworCXRpbW8gPSAxOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiBUaW1lZCByZWFkLi4uICovCisKKyAgICBzYXZhbCA9IHNpZ25hbChTSUdBTFJNLHRpbWVyaCk7CS8qIFNldCB1cCB0aW1lb3V0IGhhbmRsZXIuICovCisgICAgeHggPSBhbGFybSh0aW1vKTsJCQkvKiBTZXQgdGhlIGFsYXJtLiAqLworICAgIGRlYnVnKEYxMDEsImNvbmluYyBhbGFybSBzZXQiLCIiLHRpbW8pOworICAgIGlmICgKKyNpZmRlZiBDS19QT1NJWF9TSUcKKwlzaWdzZXRqbXAoc2pidWYsMSkKKyNlbHNlCisJc2V0am1wKHNqYnVmKQorI2VuZGlmIC8qIENLX1BPU0lYX1NJRyAqLworCSkJCQkJLyogVGhlIHJlYWQoKSB0aW1lZCBvdXQuICovCisgICAgICBuID0gLTI7CQkJCS8qIENvZGUgZm9yIHRpbWVvdXQuICovCisgICAgZWxzZQorICAgICAgbiA9IHJlYWQoMCwgJmNoLCAxKTsKKyAgICB0dGltb2ZmKCk7CQkJCS8qIFR1cm4gb2ZmIHRpbWVyICovCisgICAgaWYgKG4gPiAwKSB7CQkJLyogR290IGNoYXJhY3RlciBPSy4gKi8KKyNpZmRlZiBJS1NECisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICBkZWJ1ZyhGMTAwLCJjb25pbmMgZGVjcnlwdCAyIiwiIiwwKTsKKyAgICAgICAgaWYgKGluc2VydmVyICYmICFsb2NhbCAmJiBURUxPUFRfVShURUxPUFRfRU5DUllQVElPTikpCisJICBja190bl9kZWNyeXB0KCZjaCwxKTsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjZW5kaWYgLyogSUtTRCAqLworCXJldHVybigodW5zaWduZWQpKGNoICYgMHhmZikpOwkvKiBSZXR1cm4gaXQuICovCisgICAgfQorLyoKKyAgcmVhZCgpIHJldHVybmVkIGFuIGVycm9yLiAgU2FtZSBkZWFsIGFzIGFib3ZlLCBidXQgd2l0aG91dCB0aGUgbG9vcC4KKyovCisgICAgZGVidWcoRjEwMSwgImNvbmluYyh0aW1vKSBuIiwiIixuKTsKKyAgICBkZWJ1ZyhGMTAxLCAiY29uaW5jKHRpbW8pIGVycm5vIiwiIixlcnJubyk7CisjaWZuZGVmIE9YT1MKKyNpZmRlZiBTVk9SUE9TSVgKKyAgICBpZiAobiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUiAmJiBjb25lc2MgIT0gMCkgeworCWNvbmVzYyA9IDA7CisJcmV0dXJuKGVzY2Nocik7CQkJLyogVXNlciBlbnRlcmVkIGVzY2FwZSBjaGFyYWN0ZXIuICovCisgICAgfQorI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworICAgIGlmIChuID09IDAgJiYgZXJybm8gPiAwKSB7CQkvKiBJdCdzIGFuIGVycm9yICovCisJcmV0dXJuKC0xKTsKKyAgICB9CisjZW5kaWYgLyogISBPWE9TICovCisgICAgcmV0dXJuKG4pOworfQorCisvKiAgQyBPIE4gRyBLIFMgIC0tICBDb25zb2xlIEdldCBLZXlib2FyZCBTY2FuY29kZSAgKi8KKworI2lmbmRlZiBjb25na3MKKy8qCisgIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgZmlsbGVkIGluIHdpdGggdGhlIHZhcmlvdXMgc3lzdGVtLWRlcGVuZGVudAorICBzeXN0ZW0gY2FsbHMgdXNlZCBieSBTVU5PUywgTmVYVCBPUywgWGVuaXgsIEF2aWlvbiwgZXRjLCB0byByZWFkIGEgZnVsbAorICBrZXlib2FyZCBzY2FuIGNvZGUuICBVbmZvcnR1bmF0ZWx5IHRoZXJlIGFyZW4ndCBhbnkuCisqLworaW50Citjb25na3ModGltbykgaW50IHRpbW87IHsKKworI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIgJiYgIWxvY2FsKQorICAgICAgcmV0dXJuKHR0aW5jKHRpbW8pKTsKKyNlbmRpZiAvKiBJS1NEICovCisKKyAgICByZXR1cm4oY29uaW5jKHRpbW8pKTsKK30KKyNlbmRpZiAvKiBjb25na3MgKi8KKworI2lmZGVmIEFUVDczMDAKKworLyogIEEgVCBUIEQgSSBBIEwgIC0tICBEaWFsIHVwIHRoZSByZW1vdGUgc3lzdGVtIHVzaW5nIGludGVybmFsIG1vZGVtCisgKiBQdXJwb3NlOiB0byBvcGVuIGFuZCBkaWFsIGEgbnVtYmVyIG9uIHRoZSBpbnRlcm5hbCBtb2RlbSBhdmFpbGFibGUgb24gdGhlCisgKiBBVFQ3MzAwIFVOSVggUEMuICBXcml0dGVuIGJ5IEpvZSBEb3VwbmlrLiBTdXBlcmNlZWRzIHZlcnNpb24gd3JpdHRlbiBieQorICogUmljaGFyZCBFLiBIaWxsLCBEaWNraW5zb24sIFRYLiB3aGljaCBlbXBsb3llZCBkaWFsKDNjKS4KKyAqIFVzZXMgaW5mb3JtYXRpb24gaW4gPHN5cy9waG9uZS5oPiBhbmQgb3VyIHN0YXR1cyBpbnQgYXR0bW9kZW0uCisgKi8KK2F0dGRpYWwodHRuYW1lLHNwZWVkLHRlbG5icikgY2hhciAqdHRuYW1lLCp0ZWxuYnI7IGxvbmcgc3BlZWQ7IHsKKyAgICBjaGFyICp0ZWxudW07CisKKyAgICBhdHRtb2RlbSAmPSB+SVNNT0RFTTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZGVtIG5vdCBpbiB1c2UgeWV0ICovCisgICAgICAgICAgICAgICAgICAgIC8qIEVuc3VyZSBPX05ERUxBWSBpcyBzZXQsIGVsc2UgaS9vIHRyYWZmaWMgaGFuZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogV2UgdHVybiB0aGlzIGZsYWcgb2ZmIG9uY2UgdGhlIGRpYWwgaXMgY29tcGxldGUgKi8KKyAgICBmY250bCh0dHlmZCwgRl9TRVRGTCwgZmNudGwodHR5ZmQsIEZfR0VURkwsIDApIHwgT19OREVMQVkpOworCisgICAgLyogQ29uZGl0aW9uIGxpbmUsIGNoZWNrIGF2YWlsYWJpbGl0eSAmIERBVEEgbW9kZSwgdHVybiBvbiBzcGVha2VyICovCisgICAgaWYgKGlvY3RsKHR0eWZkLFBJT0NPRkZIT09LLCAmZGlhbGVyKSA9PSAtMSkgeworICAgICAgICBwcmludGYoImNhbm5vdCBhY2Nlc3MgcGhvbmVcbiIpOworICAgICAgICB0dGNsb3MoMCk7CisgICAgICAgIHJldHVybiAoLTIpOworICAgIH0KKyAgICBpb2N0bCh0dHlmZCxQSU9DR0VUUCwmZGlhbGVyKTsgICAgICAvKiBnZXQgcGhvbmUgZGlhbGVyIHBhcmFtZXRlcnMgKi8KKworICAgIGlmIChkaWFsZXIuY19saW5lcGFyYW0gJiBWT0lDRSkgewkvKiBwaG9uZSBtdXN0IGJlIGluIERBVEEgbW9kZSAqLworICAgICAgICBwcmludGYoIiBTaG91bGQgbm90IGRpYWwgd2l0aCBtb2RlbSBpbiBWT0lDRSBtb2RlLlxuIik7CisgICAgICAgIHByaW50ZigiIEV4aXQgS2VybWl0LCBzd2l0Y2ggdG8gREFUQSBhbmQgcmV0cnkgY2FsbC5cbiIpOworICAgICAgICB0dGNsb3MoMCk7CisgICAgICAgIHJldHVybiAoLTIpOworICAgIH0KKyNpZmRlZiBBVFRUT05FRAkJCQkvKiBPbGQgd2F5LCB0b25lIGRpYWxpbmcgb25seS4gKi8KKyAgICBkaWFsZXIuY19saW5lcGFyYW0gPSBEQVRBIHwgRFRNRjsJLyogRGlhbCB3aXRoIHRvbmVzLCAqLworICAgIGRpYWxlci5jX2xpbmVwYXJhbSAmPSB+UFVMU0U7CS8qIG5vdCB3aXRoIHB1bHNlcy4gKi8KKyNlbHNlCisgICAgLyogTGVhdmUgY3VycmVudCBwdWxzZS90b25lIHN0YXRlIGFsb25lLiAqLworICAgIC8qIEJ1dCB3aGF0IGFib3V0IERBVEE/ICBBZGQgaXQgYmFjayBpZiB5b3UgaGF2ZSB0cm91YmxlLiAqLworICAgIC8qIHN5cy9waG9uZSBzYXlzIHlvdSBnZXQgREFUQSBhdXRvbWF0aWNhbGx5IGJ5IG9wZW5pbmcgZGV2aWNlIFJEV1IgKi8KKyNlbmRpZgorICAgIGRpYWxlci5jX3dhaXRkaWFsdG9uZSA9IDU7ICAgICAgICAgICAgICAgICAgLyogd2FpdCA1IHNlYyBmb3IgZGlhbHRvbmUgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgZGlhbGVyLmNfZmVlZGJhY2sgPSBTUEVBS0VST058Tk9STVNQS3xSSU5HT047ICAvKiBjb250cm9sIHNwZWFrZXIgKi8KKyNlbHNlCisgICAgLyogc3lzL3Bob25lIHNheXMgUklOR09OIHVzZWQgb25seSBmb3IgaW5jb21pbmcgdm9pY2UgY2FsbHMgKi8KKyAgICBkaWFsZXIuY19mZWVkYmFjayAmPSB+KFNPRlRTUEt8TE9VRFNQSyk7CisgICAgZGlhbGVyLmNfZmVlZGJhY2sgfD0gU1BFQUtFUk9OfE5PUk1TUEs7CisjZW5kaWYKKyAgICBkaWFsZXIuY193YWl0Zmxhc2ggPSA1MDA7ICAgICAgICAgICAgICAgICAgIC8qIDAuNSBzZWMgZmxhc2ggaG9vayAqLworICAgIGlmKGlvY3RsKHR0eWZkLFBJT0NTRVRQLCZkaWFsZXIpID09IC0xKSB7ICAgLyogc2V0IHBob25lIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgcHJpbnRmKCJDYW5ub3Qgc2V0IG1vZGVtIGNoYXJhY3RlcmlzdGljc1xuIik7CisgICAgICAgIHR0Y2xvcygwKTsKKyAgICAgICAgcmV0dXJuICgtMik7CisgICAgfQorICAgIGlvY3RsKHR0eWZkLFBJT0NSRUNPTk4sMCk7CQkvKiBUdXJucyBvbiBzcGVha2VyIGZvciBwdWxzZSAqLworCisjaWZkZWYgQ09NTUVOVAorICAgIGZwcmludGYoc3RkZXJyLCJQaG9uZSBsaW5lIHN0YXR1cy4gbGluZV9wYXI6JW8gZGlhbHRvbmVfd2FpdDolbyBcCitsaW5lX3N0YXR1czolbyBmZWVkYmFjazolb1xuIiwKKyAgICBkaWFsZXIuY19saW5lcGFyYW0sIGRpYWxlci5jX3dhaXRkaWFsdG9uZSwKKyAgICBkaWFsZXIuY19saW5lc3RhdHVzLCBkaWFsZXIuY19mZWVkYmFjayk7CisjZW5kaWYKKworICAgIGF0dG1vZGVtIHw9IElTTU9ERU07ICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kZW0gaXMgbm93IGluLXVzZSAqLworICAgIHNsZWVwKDEpOworICAgIGZvciAodGVsbnVtID0gdGVsbmJyOyAqdGVsbnVtICE9ICdcMCc7IHRlbG51bSsrKSAgICAvKiBkaWFsIG51bWJlciAqLworI2lmZGVmIEFUVFRPTkVECisgICAgICAvKiBUb25lIGRpYWxpbmcgb25seSAqLworICAgICAgaWYgKGlvY3RsKHR0eWZkLFBJT0NESUFMLHRlbG51bSkgIT0gMCkgeworCSAgcGVycm9yKCJFcnJvciBpbiBkaWFsaW5nIik7CisJICB0dGNsb3MoMCk7CisJICByZXR1cm4oLTIpOworICAgICAgfQorI2Vsc2UgLyogQWxsb3cgUHVsc2Ugb3IgVG9uZSBkaWFsaW5nICovCisgICAgc3dpdGNoICgqdGVsbnVtKSB7CisgICAgICBjYXNlICd0JzogY2FzZSAnVCc6IGNhc2UgJyUnOgkvKiBUb25lIGRpYWxpbmcgcmVxdWVzdGVkICovCisJZGlhbGVyLmNfbGluZXBhcmFtIHw9IERUTUY7CisJZGlhbGVyLmNfbGluZXBhcmFtICY9IH5QVUxTRTsKKwlpZiAoaW9jdGwodHR5ZmQsUElPQ1NFVFAsJmRpYWxlcikgPT0gLTEpIHsKKwkgICAgcHJpbnRmKCJDYW5ub3Qgc2V0IG1vZGVtIHRvIHRvbmUgZGlhbGluZ1xuIik7CisJICAgIHR0Y2xvcygwKTsKKwkgICAgcmV0dXJuKC0yKTsKKwl9CisJYnJlYWs7CisgICAgICBjYXNlICdkJzogY2FzZSAnRCc6IGNhc2UgJ3AnOiBjYXNlICdQJzogY2FzZSAnXic6CisJZGlhbGVyLmNfbGluZXBhcmFtIHw9IFBVTFNFOworCWRpYWxlci5jX2xpbmVwYXJhbSAmPSB+RFRNRjsKKwlpZiAoaW9jdGwodHR5ZmQsUElPQ1NFVFAsJmRpYWxlcikgPT0gLTEpIHsKKwkgICAgcHJpbnRmKCJDYW5ub3Qgc2V0IG1vZGVtIHRvIHB1bHNlIGRpYWxpbmdcbiIpOworCSAgICB0dGNsb3MoMCk7CisJICAgIHJldHVybigtMik7CisJfQorCWJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGlvY3RsKHR0eWZkLFBJT0NESUFMLHRlbG51bSkgIT0gMCkgeworCSAgICBwZXJyb3IoIkRpYWxpbmcgZXJyb3IiKTsKKwkgICAgdHRjbG9zKDApOworCSAgICByZXR1cm4oLTIpOworCX0KKwlicmVhazsKKyAgICB9CisjZW5kaWYKKworICAgIGlvY3RsKHR0eWZkLFBJT0NESUFMLCJAIik7CQkvKiB0ZXJtaW5hdG9yIGZvciBkYXRhIGNhbGwgKi8KKyAgICBkbyB7CQkJCS8qIHdhaXQgZm9yIG1vZGVtcyB0byBDb25uZWN0ICovCisgICAgICAgIGlmIChpb2N0bCh0dHlmZCxQSU9DR0VUUCwmZGlhbGVyKSAhPSAwKQl7IC8qIGdldCBwYXJhbXMgKi8KKwkgICAgcGVycm9yKCJDYW5ub3QgZ2V0IG1vZGVtcyB0byBjb25uZWN0Iik7CisJICAgIHR0Y2xvcygwKTsKKwkgICAgcmV0dXJuKC0yKTsKKwl9CisgICAgfSB3aGlsZSAoKGRpYWxlci5jX2xpbmVzdGF0dXMgJiBNT0RFTUNPTk5FQ1RFRCkgPT0gMCk7CisgICAgLyogVHVybiBvZmYgT19OREVMQVkgZmxhZyBub3cuICovCisgICAgZmNudGwodHR5ZmQsIEZfU0VURkwsIGZjbnRsKHR0eWZkLCBGX0dFVEZMLCAwKSAmIH5PX05ERUxBWSk7CisgICAgc2lnbmFsKFNJR0hVUCwgc2lnaHVwKTsgICAgICAgICAgICAgLyogaGFuZ3VwIG9uIGxvc3Mgb2YgY2FycmllciAqLworICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBzdWNjZXNzICovCit9CisKKy8qCisgIE9mZmdldHR5LCBvbmdldHR5IGZ1bmN0aW9ucy4gVGhlc2UgZnVuY3Rpb24gZ2V0IHRoZSAnZ2V0dHkoMW0pJyBvZmYKKyAgYW5kIHJlc3RvcmUgaXQgdG8gdGhlIGluZGljYXRlZCBsaW5lLiAgU2hlbGwncyByZXR1cm4gY29kZXMgYXJlOgorICAgIDA6IENhbid0IGRvIGl0LiAgUHJvYmFibHkgYSB1c2VyIGxvZ2dlZCBvbi4KKyAgICAxOiBObyBuZWVkLiAgTm8gZ2V0dHkgb24gdGhhdCBsaW5lLgorICAgIDI6IERvbmUsIHlvdSBzaG91bGQgcmVzdG9yZSB0aGUgZ2V0dHkgd2hlbiB5b3UncmUgZG9uZS4KKyAgRE9HRVRZIFN5c3RlbSgzKSwgaG93ZXZlciwgcmV0dXJucyB0aGVtIGFzIDAsIDI1NiwgNTEyLCByZXNwZWN0aXZlbHkuCisgIFRoYW5rcyB0byBLZXZpbiBPJ0dvcm1hbiwgQW5hcm0gU29mdHdhcmUgU3lzdGVtcy4KKworICAgZ2V0b2ZmLnNoIGxvb2tzIGxpa2U6ICAgZ2V0b24uc2ggbG9va3MgbGlrZToKKyAgICAgc2V0Z2V0dHkgJDEgMCAgICAgICAgICAgc2V0Z2V0dHkgJDEgMQorICAgICBlcnI9JD8gICAgICAgICAgICAgICAgICBleGl0ICQ/CisgICAgIHNsZWVwIDIKKyAgICAgZXhpdCAkZXJyCisqLworCisvKiAgTyBGIEYgRyBFIFQgVCBZICAtLSAgVHVybiBvZmYgZ2V0dHkoMW0pIGZvciB0aGUgY29tbXVuaWNhdGlvbnMgdHR5IGxpbmUKKyAqIGFuZCBnZXQgc3RhdHVzIHNvIGl0IGNhbiBiZSByZXN0YXJ0ZWQgYWZ0ZXIgdGhlIGxpbmUgaXMgaHVuZyB1cC4KKyAqLworaW50CitvZmZnZXR0eSh0dG5hbWUpIGNoYXIgKnR0bmFtZTsgeworICAgIGNoYXIgdGVtcFszMF07CisgICAgd2hpbGUgKCp0dG5hbWUgIT0gJ1wwJykgdHRuYW1lKys7ICAgICAgIC8qIHNlZWsgdGVybWluYXRvciBvZiBwYXRoICovCisgICAgdHRuYW1lIC09IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBsYXN0IDMgY2hhcnMgb2YgbmFtZSAqLworICAgIHNwcmludGYodGVtcCwiL3Vzci9iaW4vZ2V0b2ZmLnNoICVzIix0dG5hbWUpOworICAgIHJldHVybih6c3lzY21kKHRlbXApKTsKK30KKworLyogIE8gTiBHIEUgVCBUIFkgIC0tICBUdXJuIG9uIGdldHR5KDFtKSBmb3IgdGhlIGNvbW11bmljYXRpb25zIHR0eSBsaW5lICovCisKK2ludAorb25nZXR0eSh0dG5hbWUpIGNoYXIgKnR0bmFtZTsgeworICAgIGNoYXIgdGVtcFszMF07CisgICAgd2hpbGUgKCp0dG5hbWUgIT0gJ1wwJykgdHRuYW1lKys7ICAgICAgIC8qIGNvbW1zIHR0eSBwYXRoIG5hbWUgKi8KKyAgICB0dG5hbWUgLT0gMzsKKyAgICBzcHJpbnRmKHRlbXAsIi91c3IvYmluL2dldG9uLnNoICVzIix0dG5hbWUpOworICAgIHJldHVybih6c3lzY21kKHRlbXApKTsKK30KKyNlbmRpZiAvKiBBVFQ3MzAwICovCisKKy8qICBUIFQgUyBDIEEgUiBSICAtLSAgU2V0IHR0Y2FyciB2YXJpYWJsZSwgY29udHJvbGxpbmcgY2FycmllciBoYW5kbGluZy4KKyAqCisgKiAgMCA9IE9mZjogQWx3YXlzIGlnbm9yZSBjYXJyaWVyLiBFLmcuIHlvdSBjYW4gY29ubmVjdCB3aXRob3V0IGNhcnJpZXIuCisgKiAgMSA9IE9uOiBIZWVkIGNhcnJpZXIsIGV4Y2VwdCBkdXJpbmcgZGlhbGluZy4gQ2FycmllciBsb3NzIGdpdmVzIGRpc2Nvbm5lY3QuCisgKiAgMiA9IEF1dG86IEZvciAibW9kZW0gZGlyZWN0IjogVGhlIHNhbWUgYXMgIk9mZiIuCisgKiAgICAgICAgICAgIEZvciByZWFsIG1vZGVtIHR5cGVzOiBIZWVkIGNhcnJpZXIgZHVyaW5nIGNvbm5lY3QsIGJ1dCBpZ25vcmUKKyAqICAgICAgICAgICAgICAgIGl0IGFueXRpbWUgZWxzZS4gIENvbXBhdGlibGUgd2l0aCBwcmUtNUEgQy1LZXJtaXQgdmVyc2lvbnMuCisgKgorICogQXMgeW91IGNhbiBzZWUsIHRoaXMgc2V0dGluZyBkb2VzIG5vdCBhZmZlY3QgZGlhbGluZywgd2hpY2ggYWx3YXlzIGlnbm9yZXMKKyAqIGNhcnJpZXIgKHVubGVzcyB0aGVyZSBpcyBzb21lIHNwZWNpYWwgZXhjZXB0aW9uIGZvciBzb21lIG1vZGVtIHR5cGUpLiAgSXQKKyAqIGRvZXMgYWZmZWN0IHR0b3BlbigpIGlmIGl0IGlzIHNldCBiZWZvcmUgdHRvcGVuKCkgaXMgdXNlZC4gIFRoaXMgc2V0dGluZworICogdGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IGNhbGwgdG8gdHRvcGVuKCkvdHRwa3QoKS90dHZ0KCkuICBBbmQgdGhleSBhcmUKKyAqIChvciBzaG91bGQgYmUpIGFsd2F5cyBjYWxsZWQgYmVmb3JlIGFueSBjb21tdW5pY2F0aW9ucyBpcyB0cmllZCwgd2hpY2gKKyAqIG1lYW5zIHRoYXQsIHByYWN0aWNhbGx5IHNwZWFraW5nLCB0aGUgZWZmZWN0IGlzIGltbWVkaWF0ZS4KKyAqCisgKiBPZiBjb3Vyc2UsIG5vdGhpbmcgb2YgdGhpcyBhcHBsaWVzIHRvIHJlbW90ZSBtb2RlICh4bG9jYWwgPSAwKS4KKyAqCisgKiBTb21lb25lIGhhcyB5ZXQgdG8gdW5jb3ZlciBob3cgdG8gbWFuaXB1bGF0ZSB0aGUgY2FycmllciBpbiB0aGUgQlNECisgKiBlbnZpcm9ubWVudCAob3IgYW55IG5vbi10ZXJtaW8gdXNpbmcgZW52aXJvbm1lbnQpLiAgVW50aWwgdGhhdCB0aW1lLCB0aGlzCisgKiB3aWxsIHNpbXBseSBiZSBhIG5vLW9wIGZvciBCU0QuCisgKgorICogTm90ZSB0aGF0IGluIHByZXZpb3VzIHZlcnNpb25zLCB0aGUgY2FycmllciB3YXMgbW9zdCBvZnRlbiBsZWZ0IHVuY2hhbmdlZAorICogaW4gdHRwa3QoKS90dHZ0KCkgdW5sZXNzIHRoZXkgd2VyZSBjYWxsZWQgd2l0aCBGTE9fRElBTCBvciBGTE9fRElBWC4gIFRoaXMKKyAqIGhhcyBjaGFuZ2VkLiAgTm93IGl0IGlzIGNvbnRyb2xsZWQgYnkgdHRjYXJyIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlc2UKKyAqIG1vZGVzLgorICovCitpbnQKK3R0c2NhcnIoY2FycmllcikgaW50IGNhcnJpZXI7IHsKKyAgICB0dGNhcnIgPSBjYXJyaWVyOworICAgIGRlYnVnKEYxMDEsICJ0dHNjYXJyIiwiIix0dGNhcnIpOworICAgIHJldHVybih0dGNhcnIpOworfQorCisvKiBDIEEgUiBSIEMgVCBMICAtLSAgU2V0IHR0eSBtb2RlcyBmb3IgY2FycmllciB0cmVhdG1lbnQuCisgKgorICogU2V0cyB0aGUgYXBwcm9wcmlhdGUgYml0cyBpbiBhIHRlcm1pbyBvciBzZ3R0eWIgc3RydWN0IGZvciBjYXJyaWVyIGNvbnRyb2wKKyAqIChhY3R1YWxseSwgdGhlcmUgYXJlIG5vIGJpdHMgaW4gc2d0dHliIGZvciB0aGF0KSwgb3IgcGVyZm9ybXMgYW55IG90aGVyCisgKiBvcGVyYXRpb25zIG5lZWRlZCB0byBjb250cm9sIHRoaXMgb24gdGhlIGN1cnJlbnQgc3lzdGVtLiAgVGhlIGZ1bmN0aW9uIGRvZXMKKyAqIG5vdCBkbyB0aGUgYWN0dWFsIFRDU0VUQSBvciBzdHR5LCBzaW5jZSBvZnRlbiB3ZSB3YW50IHRvIHNldCBvdGhlciBiaXRzIHRvbworICogZmlyc3QuICBEb24ndCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB4bG9jYWwgaXMgMCwgb3IgdGhlIHR0eSBpcyBub3Qgb3BlbmVkLgorICoKKyAqIFdlIGRvbid0IGtub3cgaG93IHRvIGRvIGFueXRoaW5nIGxpa2UgY2FycmllciBjb250cm9sIG9uIG5vbi1BVFRTViBzeXN0ZW1zLAorICogZXhjZXB0LCBhcHBhcmVudGx5LCB1bHRyaXguICBTZWUgYWJvdmUuICBJdCBpcyBhbHNvIGtub3duIHRoYXQgdGhpcyBkb2Vzbid0CisgKiBoYXZlIG11Y2ggZWZmZWN0IG9uIGEgWGVuaXggc3lzdGVtLiAgRm9yIFhlbml4LCBvbmUgc2hvdWxkIHN3aXRjaCBiYWNrIGFuZAorICogZm9ydGggYmV0d2VlbiB0aGUgdXBwZXIgYW5kIGxvd2VyIGNhc2UgZGV2aWNlIGZpbGVzLiAgTWF5YmUgbGF0ZXIuCisgKiBQcmVzZW50bHksIFhlbml4IHdpbGwgc3RpY2sgdG8gdGhlIG1vZGUgaXQgd2FzIG9wZW5lZCB3aXRoLgorICoKKyAqIGNhcnJpZXI6IDAgPSBpZ25vcmUgY2FycmllciwgMSA9IHJlcXVpcmUgY2Fycmllci4KKyAqIFRoZSBjdXJyZW50IHN0YXRlIGlzIHNhdmVkIGluIGN1cmNhcnIsIGFuZCBjaGVja2VkIHRvIHNhdmUgbGFib3VyLgorICovCisjaWZkZWYgU1ZPUlBPU0lYCitpbnQKKyNpZmRlZiBCU0Q0NE9SUE9TSVgKK2NhcnJjdGwodHRwYXIsIGNhcnJpZXIpCXN0cnVjdCB0ZXJtaW9zICp0dHBhcjsgaW50IGNhcnJpZXI7CisjZWxzZSAvKiBBVFRTViAqLworY2FycmN0bCh0dHBhciwgY2FycmllcikJc3RydWN0IHRlcm1pbyAqdHRwYXI7IGludCBjYXJyaWVyOworI2VuZGlmIC8qIEJTRDQ0T1JQT1NJWCAqLworLyogY2FycmN0bCAqLyB7CisgICAgZGVidWcoRjEwMSwgImNhcnJjdGwiLCIiLGNhcnJpZXIpOworICAgIGlmIChjYXJyaWVyKQorICAgICAgdHRwYXItPmNfY2ZsYWcgJj0gfkNMT0NBTDsKKyAgICBlbHNlCisgICAgICB0dHBhci0+Y19jZmxhZyB8PSBDTE9DQUw7CisgICAgcmV0dXJuKDApOworfQorI2Vsc2UgLyogQmVya2VsZXksIFY3LCBldCBhbC4uLiAqLworaW50CitjYXJyY3RsKHR0cGFyLCBjYXJyaWVyKSBzdHJ1Y3Qgc2d0dHliICp0dHBhcjsgaW50IGNhcnJpZXI7IHsKKyAgICBkZWJ1ZyhGMTAxLCAiY2FycmN0bCIsIiIsY2Fycmllcik7CisgICAgaWYgKGNhcnJpZXIgPT0gY3VyY2FycikKKyAgICAgIHJldHVybigwKTsKKyAgICBjdXJjYXJyID0gY2FycmllcjsKKyNpZmRlZiB1bHRyaXgKKyNpZmRlZiBDT01NRU5UCisvKgorICBPbGQgY29kZSBmcm9tIHNvbWVib2R5IGF0IERFQyB0aGF0IHRlbmRzIHRvIGdldCBzdHVjaywgdGltZSBvdXQsIGV0Yy4KKyovCisgICAgaWYgKGNhcnJpZXIpIHsKKwlpb2N0bCh0dHlmZCwgVElPQ01PREVNLCAmdGVtcCk7CisJaW9jdGwodHR5ZmQsIFRJT0NIUENMLCAwKTsKKyAgICB9IGVsc2UgeworCS8qIChBY2NvcmRpbmcgdG8gdGhlIG1hbnVhbHMsIFRJT0NOQ0FSIHNob3VsZCBiZSBwcmVmZXJyZWQgKi8KKwkvKiBvdmVyIFRJT0NOTU9ERU0uLi4pICovCisJaW9jdGwodHR5ZmQsIFRJT0NOTU9ERU0sICZ0ZW1wKTsKKyAgICB9CisjZWxzZQorLyoKKyAgTmV3IGNvZGUgZnJvbSBKYW1pZSBXYXRzb24gdGhhdCwgaGUgc2F5cywgZWxpbWluYXRlcyB0aGUgcHJvYmxlbXMuCisqLworICAgIGlmIChjYXJyaWVyKSB7CisJaW9jdGwodHR5ZmQsIFRJT0NDQVIpOworCWlvY3RsKHR0eWZkLCBUSU9DSFBDTCk7CisgICAgfSBlbHNlIHsKKwlpb2N0bCh0dHlmZCwgVElPQ05DQVIpOworICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogdWx0cml4ICovCisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworCisKKy8qICBUIFQgRyBNIEQgTSAgLS0gIEdldCBtb2RlbSBzaWduYWxzICAqLworLyoKKyBMb29rcyBmb3IgUlMtMjMyIG1vZGVtIHNpZ25hbHMsIGFuZCByZXR1cm5zIHRob3NlIHRoYXQgYXJlIG9uIGluIGFzIGl0cworIHJldHVybiB2YWx1ZSwgaW4gYSBiaXQgbWFzayBjb21wb3NlZCBvZiB0aGUgQk1feHh4IHZhbHVlcyBkZWZpbmVkIGluIGNrY2RlYi5oLgorIFJldHVybnM6CisgLTMgTm90IGltcGxlbWVudGVkCisgLTIgaWYgdGhlIGNvbW11bmljYXRpb24gZGV2aWNlIGRvZXMgbm90IGhhdmUgbW9kZW0gY29udHJvbCAoZS5nLiB0ZWxuZXQpCisgLTEgb24gZXJyb3IuCisgPj0gMCBvbiBzdWNjZXNzLCB3aXRoIGEgYml0IG1hc2sgY29udGFpbmluZyB0aGUgbW9kZW0gc2lnbmFscyB0aGF0IGFyZSBvbi4KKyovCisKKy8qCisgIERlZmluZSB0aGUgc3ltYm9sIEtfTURNQ1RMIGlmIHdlIGhhdmUgU3lzIFYgUjMgLyA0LjMgQlNEIHN0eWxlCisgIG1vZGVtIGNvbnRyb2wsIG5hbWVseSB0aGUgVElPQ01HRVQgaW9jdGwuCisqLworCisjaWZkZWYgQlNENDMKKyNkZWZpbmUgS19NRE1DVEwKKyNlbmRpZiAvKiBCU0Q0MyAqLworCisjaWZkZWYgU1VOT1M0CisjZGVmaW5lIEtfTURNQ1RMCisjZW5kaWYgLyogU1VOT1M0ICovCisKKy8qCisgIFNDTyBPcGVuU2VydmVyIFI1LjAuNC4gIFRoZSBUSU9DTUdFVCBkZWZpbml0aW9uIGlzIGhhcmR3aXJlZCBpbiBiZWNhdXNlIGl0CisgIGlzIHNraXBwZWQgaW4gdGVybWlvLmggd2hlbiBfUE9TSVhfU09VUkNFIGlzIGRlZmluZWQuICBCdXQgX1BPU0lYX1NPVVJDRQorICBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gZ2V0IHRoZSBoaWdoIHNlcmlhbCBzcGVlZHMgdGhhdCBhcmUgbmV3IHRvCisgIDUuMC40LiAgSG93ZXZlciwgdGhlIHJlZ3VsYXIgU0NPIGRyaXZlcnMgZG8gbm90IGltcGxlbWVudCBUSU9DTUdFVCwgc28gdGhlCisgIGlvY3RsKCkgcmV0dXJucyAtMSB3aXRoIGVycm5vIDIyIChpbnZhbGlkIGZ1bmN0aW9uKS4gIEJ1dCB0aGlyZC1wYXJ0eQorICBkcml2ZXJzLCBlLmcuIGZvciBEaWdpYm9hcmQsIGRvIGltcGxlbWVudCBpdCwgYW5kIHNvIGl0IHNob3VsZCB3b3JrIG9uIHBvcnRzCisgIGRyaXZlbiBieSB0aG9zZSBkcml2ZXJzLgorKi8KKyNpZmRlZiBTQ09fT1NSNTA0CisjaWZuZGVmIFRJT0NNR0VUCisjZGVmaW5lIFRJT0NNR0VUICgoJ3QnPDw4KXwyOSkKKyNlbmRpZiAvKiBUSU9DTUdFVCAqLworI2VuZGlmIC8qIFNDT19PU1I1MDQgKi8KKworI2lmZGVmIENLX1NDT1Y1CisvKiBCZWNhdXNlIFBPU0lYIHN0cmljdG5lc3MgaW4gPHN5cy90ZXJtaW8uaD4gd29uJ3QgbGV0IHVzIHNlZSB0aGVzZS4gKi8KKyNpZm5kZWYgVElPQ01fRFRSCisjZGVmaW5lIFRJT0NNX0RUUgkweDAwMDIJCS8qIGRhdGEgdGVybWluYWwgcmVhZHkgKi8KKyNkZWZpbmUgVElPQ01fUlRTCTB4MDAwNAkJLyogcmVxdWVzdCB0byBzZW5kICovCisjZGVmaW5lIFRJT0NNX0NUUwkweDAwMjAJCS8qIGNsZWFyIHRvIHNlbmQgKi8KKyNkZWZpbmUgVElPQ01fQ0FSCTB4MDA0MAkJLyogY2FycmllciBkZXRlY3QgKi8KKyNkZWZpbmUgVElPQ01fUk5HCTB4MDA4MAkJLyogcmluZyAqLworI2RlZmluZSBUSU9DTV9EU1IJMHgwMTAwCQkvKiBkYXRhIHNldCByZWFkeSAqLworI2RlZmluZSBUSU9DTV9DRAlUSU9DTV9DQVIKKyNkZWZpbmUgVElPQ01fUkkJVElPQ01fUk5HCisjZW5kaWYgLyogVElPQ01fRFRSICovCisjZW5kaWYgLyogQ0tfU0NPVjUgKi8KKworI2lmZGVmIFFOWAorI2RlZmluZSBLX01ETUNUTAorI2Vsc2UKKyNpZmRlZiBUSU9DTUdFVAorI2RlZmluZSBLX01ETUNUTAorI2VuZGlmIC8qIFRJT0NNR0VUICovCisjZW5kaWYgLyogUU5YICovCisvKgorICAiQSBzZXJpYWwgY29tbXVuaWNhdGlvbiBwcm9ncmFtIHRoYXQgY2FuJ3QgcmVhZCBtb2RlbSBzaWduYWxzCisgICBpcyBsaWtlIGEgY2FyIHdpdGhvdXQgd2luZG93cy4iCisqLworaW50Cit0dGdtZG0oKSB7CisKKyNpZmRlZiBRTlgKKyNpbmNsdWRlIDxzeXMvcWlvY3RsLmg+CisKKyAgICB1bnNpZ25lZCBsb25nIHksIG1kbWJpdHNbMl07CisgICAgaW50IHgsIHogPSAwOworCisgICAgaWYgKHhsb2NhbCAmJiB0dHlmZCA8IDApCisgICAgICByZXR1cm4oLTEpOworCisjaWZkZWYgTkVUQ09OTgorICAgIGlmIChuZXRjb25uKSB7CQkJLyogTmV0d29yayBjb25uZWN0aW9uICovCisjaWZkZWYgVE5fQ09NUE9SVAorICAgICAgICBpZiAoaXN0bmNvbXBvcnQoKSkgeworCSAgICBnb3RzaWdzID0gMTsKKwkgICAgcmV0dXJuKHRuZ21kbSgpKTsKKwl9IGVsc2UKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisJICByZXR1cm4oLTIpOwkJCS8qIE5vIG1vZGVtIHNpZ25hbHMgKi8KKyAgICB9CisjZW5kaWYgLyogTkVUQ09OTiAqLworCisjaWZkZWYgTkVUQ01ECisgICAgaWYgKHR0cGlwZSkgcmV0dXJuKC0yKTsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICBpZiAodHRwdHkpIHJldHVybigtMik7CisjZW5kaWYgLyogTkVUUFRZICovCisKKyAgICBtZG1iaXRzWzBdID0gMEw7CisgICAgbWRtYml0c1sxXSA9IDBMOworLyoKKyAqIEZyb20gPHN5cy9xaW9jdGwuaD46CisgKgorICogU0VSSUFMIGRldmljZXMgICAoYWxsIERldi5zZXIgdmVyc2lvbnMpCisgKiAwIDogRFRSICAgICAgICAgICA4ID0gRGF0YSBCaXRzIDAgIDE2IC0gcmVzZXJ2ZWQgICAgIDI0IC0gcmVzZXJ2ZWQKKyAqIDEgOiBSVFMgICAgICAgICAgIDkgPSBEYXRhIEJpdHMgMSAgMTcgLSByZXNlcnZlZCAgICAgMjUgLSByZXNlcnZlZAorICogMiA9IE91dCAxICAgICAgICAxMCA9IFN0b3AgQml0cyAgICAxOCAtIHJlc2VydmVkICAgICAyNiAtIHJlc2VydmVkCisgKiAzID0gSW50IEVuYWJsZSAgIDExID0gUGFyIEVuYWJsZSAgIDE5IC0gcmVzZXJ2ZWQgICAgIDI3IC0gcmVzZXJ2ZWQKKyAqIDQgPSBMb29wICAgICAgICAgMTIgPSBQYXIgRXZlbiAgICAgMjAgPSBDVFMgICAgICAgICAgMjggLSByZXNlcnZlZAorICogNSAtIHJlc2VydmVkICAgICAxMyA9IFBhciBTdGljayAgICAyMSA9IERTUiAgICAgICAgICAyOSAtIHJlc2VydmVkCisgKiA2IC0gcmVzZXJ2ZWQgICAgIDE0IDogQnJlYWsgICAgICAgIDIyID0gUkkgICAgICAgICAgIDMwIC0gcmVzZXJ2ZWQKKyAqIDcgLSByZXNlcnZlZCAgICAgMTUgPSAwICAgICAgICAgICAgMjMgPSBDRCAgICAgICAgICAgMzEgLSByZXNlcnZlZAorICovCisgICAgZXJybm8gPSAwOworICAgIHggPSBxbnhfaW9jdGwodHR5ZmQsIFFDVExfREVWX0NUTCwgJm1kbWJpdHNbMF0sIDgsICZtZG1iaXRzWzBdLCA0KTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dGdtZG0gcW54X2lvY3RsIiwiIix4KTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dGdtZG0gcW54X2lvY3RsIGVycm5vIiwiIixlcnJubyk7CisgICAgaWYgKCF4KSB7CisJZGVidWcoRjEwMSwidHRnbWRtIHFueF9pb2N0bCBtZG1iaXRzWzBdIiwiIixtZG1iaXRzWzBdKTsKKwlkZWJ1ZyhGMTAxLCJ0dGdtZG0gcW54X2lvY3RsIG1kbWJpdHNbMV0iLCIiLG1kbWJpdHNbMV0pOworCXkgPSBtZG1iaXRzWzBdOworCWlmICh5ICYgMHgwMDAwMDFMKSB6IHw9IEJNX0RUUjsJLyogQml0ICAwICovCisJaWYgKHkgJiAweDAwMDAwMkwpIHogfD0gQk1fUlRTOwkvKiBCaXQgIDEgKi8KKwlpZiAoeSAmIDB4MTAwMDAwTCkgeiB8PSBCTV9DVFM7CS8qIEJpdCAyMCAqLworCWlmICh5ICYgMHgyMDAwMDBMKSB6IHw9IEJNX0RTUjsJLyogQml0IDIxICovCisJaWYgKHkgJiAweDQwMDAwMEwpIHogfD0gQk1fUk5HOwkvKiBCaXQgMjIgKi8KKwlpZiAoeSAmIDB4ODAwMDAwTCkgeiB8PSBCTV9EQ0Q7CS8qIEJpdCAyMyAqLworCWRlYnVnKEYxMDEsInR0Z21kbSBxbnggcmVzdWx0IiwiIix6KTsKKwlkZWJ1ZyhGMTEwLCJ0dGdtZG0gcW54IENEID0gIiwoeiAmIEJNX0RDRCkgPyAiT24iIDogIk9mZiIsIDApOworCWdvdHNpZ3MgPSAxOworCXJldHVybih6KTsKKyAgICB9IGVsc2UgcmV0dXJuKC0xKTsKKyNlbHNlIC8qIFFOWCAqLworI2lmZGVmIEhQVVgJCQkJLyogSFBVWCBoYXMgaXRzIG93biB3YXkgKi8KKyAgICBpbnQgeCwgejsKKworI2lmZGVmIEhQVVgxMAkJCQkvKiBNb2RlbSBmbGFnIHdvcmQgKi8KKyAgICBtZmxhZyB5OwkJCQkvKiBtZmxhZyB0eXBlZGVmJ2QgaW4gPHN5cy9tb2RlbS5oPiAqLworI2Vsc2UKKyNpZmRlZiBIUFVYOQorICAgIG1mbGFnIHk7CisjZWxzZQorI2lmZGVmIEhQVVg4CisgICAgbWZsYWcgeTsKKyNlbHNlCisgICAgdW5zaWduZWQgbG9uZyB5OwkJCS8qIE5vdCBzdXJlIGFib3V0IHByZS04LjAuLi4gKi8KKyNlbmRpZiAvKiBIUFVYOCAqLworI2VuZGlmIC8qIEhQVVg5ICovCisjZW5kaWYgLyogSFBVWDEwICovCisKKyAgICBpZiAoeGxvY2FsICYmIHR0eWZkIDwgMCkKKyAgICAgIHJldHVybigtMSk7CisKKyNpZmRlZiBORVRDT05OCisgICAgaWYgKG5ldGNvbm4pIHsJCQkvKiBOZXR3b3JrIGNvbm5lY3Rpb24gKi8KKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgIGlmIChpc3RuY29tcG9ydCgpKSB7CisJICAgIGdvdHNpZ3MgPSAxOworCSAgICByZXR1cm4odG5nbWRtKCkpOworCX0gZWxzZQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKwkgIHJldHVybigtMik7CQkJLyogTm8gbW9kZW0gc2lnbmFscyAqLworICAgIH0KKyNlbmRpZiAvKiBORVRDT05OICovCisKKyNpZmRlZiBORVRDTUQKKyAgICBpZiAodHRwaXBlKSByZXR1cm4oLTIpOworI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorICAgIGlmICh0dHB0eSkgcmV0dXJuKC0yKTsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKworICAgIGlmICh4bG9jYWwpCQkJCS8qIEdldCBtb2RlbSBzaWduYWxzICovCisgICAgICB4ID0gaW9jdGwodHR5ZmQsTUNHRVRBLCZ5KTsKKyAgICBlbHNlCisgICAgICB4ID0gaW9jdGwoMCxNQ0dFVEEsJnkpOworICAgIGlmICh4IDwgMCkgcmV0dXJuKC0xKTsKKyAgICBkZWJ1ZyhGMTAxLCJ0dGdtZG0iLCIiLHkpOworCisgICAgeiA9IDA7CQkJCS8qIEluaXRpYWxpemUgcmV0dXJuIHZhbHVlICovCisKKy8qIE5vdyBzZXQgYml0cyBmb3IgZWFjaCBtb2RlbSBzaWduYWwgdGhhdCBpcyByZXBvcnRlZCB0byBiZSBvbi4gKi8KKworI2lmZGVmIE1DVFMKKyAgICAvKiBDbGVhciBUbyBTZW5kICovCisgICAgZGVidWcoRjEwMSwidHRnbWRtIEhQVVggQ1RTIiwiIix5ICYgTUNUUyk7CisgICAgaWYgKHkgJiBNQ1RTKSB6IHw9IEJNX0NUUzsKKyNlbmRpZgorI2lmZGVmIE1EU1IKKyAgICAvKiBEYXRhIFNldCBSZWFkeSAqLworICAgIGRlYnVnKEYxMDEsInR0Z21kbSBIUFVYIERTUiIsIiIseSAmIE1EU1IpOworICAgIGlmICh5ICYgTURTUikgeiB8PSBCTV9EU1I7CisjZW5kaWYKKyNpZmRlZiBNRENECisgICAgLyogQ2FycmllciAqLworICAgIGRlYnVnKEYxMDEsInR0Z21kbSBIUFVYIERDRCIsIiIseSAmIE1EQ0QpOworICAgIGlmICh5ICYgTURDRCkgeiB8PSBCTV9EQ0Q7CisjZW5kaWYKKyNpZmRlZiBNUkkKKyAgICAvKiBSaW5nIEluZGljYXRlICovCisgICAgZGVidWcoRjEwMSwidHRnbWRtIEhQVVggUkkiLCIiLHkgJiBNUkkpOworICAgIGlmICh5ICYgTVJJKSB6IHw9IEJNX1JORzsKKyNlbmRpZgorI2lmZGVmIE1EVFIKKyAgICAvKiBEYXRhIFRlcm1pbmFsIFJlYWR5ICovCisgICAgZGVidWcoRjEwMSwidHRnbWRtIEhQVVggRFRSIiwiIix5ICYgTURUUik7CisgICAgaWYgKHkgJiBNRFRSKSB6IHw9IEJNX0RUUjsKKyNlbmRpZgorI2lmZGVmIE1SVFMKKyAgICAvKiBSZXF1ZXN0IFRvIFNlbmQgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0dGdtZG0gSFBVWCBSVFMiLCIiLHkgJiBNUlRTKTsKKyAgICBpZiAoeSAmIE1SVFMpIHogfD0gQk1fUlRTOworI2VuZGlmCisgICAgZ290c2lncyA9IDE7CisgICAgcmV0dXJuKHopOworCisjZWxzZSAvKiAhIEhQVVggKi8KKworI2lmZGVmIEtfTURNQ1RMCisvKgorICBOb3RlLCBUSU9DTUdFVCBtaWdodCBhbHJlYWR5IGhhdmUgYmVlbiBkZWZpbmVkIGluIDxzeXMvaW9jdGwuaD4gb3IgZWxzZXdoZXJlLgorICBJZiBub3QsIHdlIHRyeSBpbmNsdWRpbmcgPHN5cy90dHljb20uaD4gLS0gaWYgdGhpcyBibG93cyB1cCB0aGVuIG1vcmUgaWZkZWZzCisgIGFyZSBuZWVkZWQuCisqLworI2lmbmRlZiBUSU9DTUdFVAorI2luY2x1ZGUgPHN5cy90dHljb20uaD4KKyNlbmRpZiAvKiBUSU9DTUdFVCAqLworCisgICAgaW50IHgsIHksIHo7CisKKyAgICBkZWJ1ZyhGMTAwLCJ0dGdtZG0gS19NRE1DVEwgZGVmaW5lZCIsIiIsMCk7CisKKyNpZmRlZiBORVRDT05OCisgICAgaWYgKG5ldGNvbm4pIHsJCQkvKiBOZXR3b3JrIGNvbm5lY3Rpb24gKi8KKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgIGlmIChpc3RuY29tcG9ydCgpKSB7CisJICAgIGdvdHNpZ3MgPSAxOworCSAgICByZXR1cm4odG5nbWRtKCkpOworCX0gZWxzZQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKwkgIHJldHVybigtMik7CQkJLyogTm8gbW9kZW0gc2lnbmFscyAqLworICAgIH0KKyNlbmRpZiAvKiBORVRDT05OICovCisKKyNpZmRlZiBORVRDTUQKKyAgICBpZiAodHRwaXBlKSByZXR1cm4oLTIpOworI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorICAgIGlmICh0dHB0eSkgcmV0dXJuKC0yKTsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKworICAgIGlmICh4bG9jYWwgJiYgdHR5ZmQgPCAwKQorICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmICh4bG9jYWwpCisgICAgICB4ID0gaW9jdGwodHR5ZmQsVElPQ01HRVQsJnkpOwkvKiBHZXQgbW9kZW0gc2lnbmFscy4gKi8KKyAgICBlbHNlCisgICAgICB4ID0gaW9jdGwoMCxUSU9DTUdFVCwmeSk7CisgICAgZGVidWcoRjEwMSwidHRnbWRtIFRJT0NNR0VUIGlvY3RsIiwiIix4KTsKKyAgICBpZiAoeCA8IDApIHsKKwlkZWJ1ZyhGMTAxLCJ0dGdtZG0gZXJybm8iLCIiLGVycm5vKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJ0dGdtZG0gYml0cyIsIiIseSk7CisKKyAgICB6ID0gMDsJCQkJLyogSW5pdGlhbGl6ZSByZXR1cm4gdmFsdWUuICovCisjaWZkZWYgVElPQ01fQ1RTCisgICAgLyogQ2xlYXIgVG8gU2VuZCAqLworICAgIGlmICh5ICYgVElPQ01fQ1RTKSB6IHw9IEJNX0NUUzsKKyAgICBkZWJ1ZyhGMTAxLCJ0dGdtZG0gVElPQ01fQ1RTIGRlZmluZWQiLCIiLFRJT0NNX0NUUyk7IAorI2Vsc2UKKyAgICBkZWJ1ZyhGMTAwLCJ0dGdtZG0gVElPQ01fQ1RTIG5vdCBkZWZpbmVkIiwiIiwwKTsKKyNlbmRpZgorI2lmZGVmIFRJT0NNX0RTUgorICAgIC8qIERhdGEgU2V0IFJlYWR5ICovCisgICAgaWYgKHkgJiBUSU9DTV9EU1IpIHogfD0gQk1fRFNSOworICAgIGRlYnVnKEYxMDEsInR0Z21kbSBUSU9DTV9EU1IgZGVmaW5lZCIsIiIsVElPQ01fRFNSKTsgCisjZWxzZQorICAgIGRlYnVnKEYxMDAsInR0Z21kbSBUSU9DTV9EU1Igbm90IGRlZmluZWQiLCIiLDApOworI2VuZGlmCisjaWZkZWYgVElPQ01fQ0FSCisgICAgLyogQ2FycmllciAqLworICAgIGlmICh5ICYgVElPQ01fQ0FSKSB6IHw9IEJNX0RDRDsKKyAgICBkZWJ1ZyhGMTAxLCJ0dGdtZG0gVElPQ01fQ0FSIGRlZmluZWQiLCIiLFRJT0NNX0NBUik7IAorI2Vsc2UKKyAgICBkZWJ1ZyhGMTAwLCJ0dGdtZG0gVElPQ01fQ0FSIG5vdCBkZWZpbmVkIiwiIiwwKTsKKyNlbmRpZgorI2lmZGVmIFRJT0NNX1JORworICAgIC8qIFJpbmcgSW5kaWNhdGUgKi8KKyAgICBpZiAoeSAmIFRJT0NNX1JORykgeiB8PSBCTV9STkc7CisgICAgZGVidWcoRjEwMSwidHRnbWRtIFRJT0NNX1JORyBkZWZpbmVkIiwiIixUSU9DTV9STkcpOyAKKyNlbHNlCisgICAgZGVidWcoRjEwMCwidHRnbWRtIFRJT0NNX1JORyBub3QgZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYKKyNpZmRlZiBUSU9DTV9EVFIKKyAgICAvKiBEYXRhIFRlcm1pbmFsIFJlYWR5ICovCisgICAgaWYgKHkgJiBUSU9DTV9EVFIpIHogfD0gQk1fRFRSOworICAgIGRlYnVnKEYxMDEsInR0Z21kbSBUSU9DTV9EVFIgZGVmaW5lZCIsIiIsVElPQ01fRFRSKTsgCisjZWxzZQorICAgIGRlYnVnKEYxMDAsInR0Z21kbSBUSU9DTV9EVFIgbm90IGRlZmluZWQiLCIiLDApOworI2VuZGlmCisjaWZkZWYgVElPQ01fUlRTCisgICAgLyogUmVxdWVzdCBUbyBTZW5kICovCisgICAgaWYgKHkgJiBUSU9DTV9SVFMpIHogfD0gQk1fUlRTOworICAgIGRlYnVnKEYxMDEsInR0Z21kbSBUSU9DTV9SVFMgZGVmaW5lZCIsIiIsVElPQ01fUlRTKTsgCisjZWxzZQorICAgIGRlYnVnKEYxMDAsInR0Z21kbSBUSU9DTV9SVFMgbm90IGRlZmluZWQiLCIiLDApOworI2VuZGlmCisgICAgZ290c2lncyA9IDE7CisgICAgcmV0dXJuKHopOworCisjZWxzZSAvKiAhS19NRE1DVEwgY2F0Y2gtQWxsICovCisKKyAgICBkZWJ1ZyhGMTAwLCJ0dGdtZG0gS19NRE1DVEwgbm90IGRlZmluZWQiLCIiLDApOworI2lmZGVmIFRJT0NNR0VUCisgICAgZGVidWcoRjEwMCwidHRnbWRtIFRJT0NNR0VUIGRlZmluZWQiLCIiLDApOworI2Vsc2UKKyAgICBkZWJ1ZyhGMTAwLCJ0dGdtZG0gVElPQ01HRVQgbm90IGRlZmluZWQiLCIiLDApOworI2VuZGlmIC8qIFRJT0NNR0VUICovCisjaWZkZWYgX1NWSUQzCisgICAgZGVidWcoRjEwMCwidHRnbWRtIF9TVklEMyBkZWZpbmVkIiwiIiwwKTsKKyNlbHNlCisgICAgZGVidWcoRjEwMCwidHRnbWRtIF9TVklEMyBub3QgZGVmaW5lZCIsIiIsMCk7CisjZW5kaWYgLyogX1NWSUQzICovCisKKyNpZmRlZiBORVRDT05OCisgICAgaWYgKG5ldGNvbm4pIHsJCQkvKiBOZXR3b3JrIGNvbm5lY3Rpb24gKi8KKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgIGlmIChpc3RuY29tcG9ydCgpKSB7CisJICAgIGdvdHNpZ3MgPSAxOworCSAgICByZXR1cm4odG5nbWRtKCkpOworCX0gZWxzZQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKwkgIHJldHVybigtMik7CQkJLyogTm8gbW9kZW0gc2lnbmFscyAqLworICAgIH0KKyNlbmRpZiAvKiBORVRDT05OICovCisKKyNpZmRlZiBORVRDTUQKKyAgICBpZiAodHRwaXBlKSByZXR1cm4oLTIpOworI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorICAgIGlmICh0dHB0eSkgcmV0dXJuKC0yKTsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKworICAgIHJldHVybigtMyk7CQkJCS8qIFNvcnJ5LCBJIGRvbid0IGtub3cgaG93Li4uICovCisKKyNlbmRpZiAvKiBLX01ETUNUTCAqLworI2VuZGlmIC8qIEhQVVggKi8KKyNlbmRpZiAvKiBRTlggKi8KK30KKworLyogIFAgUyBVIFMgUCBFIE4gRCAgLS0gIFB1dCB0aGlzIHByb2Nlc3MgaW4gdGhlIGJhY2tncm91bmQuICAqLworCisvKgorICBDYWxsIHdpdGggZmxhZyBub256ZXJvIGlmIHN1c3BlbmRpbmcgaXMgYWxsb3dlZCwgemVybyBpZiBub3QgYWxsb3dlZC4KKyAgUmV0dXJucyAwIG9uIGFwcGFyZW50IHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUgKGZsYWcgd2FzIHplcm8sIG9yCisgIGtpbGwoKSByZXR1cm5lZCBhbiBlcnJvciBjb2RlLgorKi8KK2ludAorcHN1c3BlbmQoZmxhZykgaW50IGZsYWc7IHsKKworI2lmZGVmIFJUVQorICAgIGV4dGVybiBpbnQgcnR1X2J1ZzsKKyNlbmRpZiAvKiBSVFUgKi8KKworICAgIGlmIChmbGFnID09IDApIHJldHVybigtMSk7CisKKyNpZmRlZiBOT0pDCisgICAgcmV0dXJuKC0xKTsKKyNlbHNlCisjaWZkZWYgU0lHVFNUUAorLyoKKyAgVGhlIGJpZyBxdWVzdGlvbiBoZXJlIGlzIHdoZXRoZXIgam9iIGNvbnRyb2wgaXMgKnJlYWxseSogc3VwcG9ydGVkLgorICBUaGVyZSdzIG5vIHdheSBLZXJtaXQgY2FuIGtub3cgZm9yIHN1cmUuICBUaGUgZmFjdCB0aGF0IFNJR1RTVFAgaXMKKyAgZGVmaW5lZCBkb2VzIG5vdCBndWFyYW50ZWUgdGhlIFVuaXgga2VybmVsIHN1cHBvcnRzIGl0LCBhbmQgdGhlIGZhY3QKKyAgdGhhdCB0aGUgVW5peCBrZXJuZWwgc3VwcG9ydHMgaXQgZG9lc24ndCBndWFyYW50ZWUgdGhhdCB0aGUgdXNlcidzCisgIHNoZWxsIChvciBvdGhlciBwcm9jZXNzIHRoYXQgaW52b2tlZCBLZXJtaXQpIHN1cHBvcnRzIGl0LgorKi8KKyNpZmRlZiBSVFUKKyAgICBydHVfYnVnID0gMTsKKyNlbmRpZiAvKiBSVFUgKi8KKyAgICBpZiAoa2lsbCgwLFNJR1NUT1ApIDwgMAorI2lmZGVmIE1JUFMKKy8qIExldCdzIHRyeSB0aGlzIGZvciBNSVBTIHRvby4gKi8KKwkmJiBraWxsKGdldHBpZCgpLFNJR1NUT1ApIDwgMAorI2VuZGlmIC8qIE1JUFMgKi8KKwkpIHsJCQkJLyogSWYgam9iIGNvbnRyb2wsIHN1c3BlbmQgdGhlIGpvYiAqLworCXBlcnJvcigic3VzcGVuZCIpOworCWRlYnVnKEYxMDEsInBzdXNwZW5kIGVycm9yIiwiIixlcnJubyk7CisJcmV0dXJuKC0xKTsKKyAgICB9CisgICAgZGVidWcoRjEwMCwicHN1c3BlbmQgb2siLCIiLDApOworICAgIHJldHVybigwKTsKKyNlbHNlCisgICAgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBTSUdUU1RQICovCisjZW5kaWYgLyogTk9KQyAqLworfQorCisvKgorICBzZXR1aWQgcGFja2FnZSwgYnkgS3Jpc3RvZmZlciBFcmlrc3Nvbiwgd2l0aCBjb250cmlidXRpb25zIGZyb20gRGVhbgorICBMb25nIGFuZCBmZGMuCisqLworCisvKiBUaGUgZm9sbG93aW5nIGlzIGZvciBTQ08gd2hlbiBDS19BTlNJTElCUyBpcyBkZWZpbmVkLi4uICovCisjaWZkZWYgTV9VTklYCisjaWZkZWYgQ0tfQU5TSUxJQlMKKyNpZm5kZWYgTk9HRVRJRF9QUk9UT1MKKyNkZWZpbmUgTk9HRVRJRF9QUk9UT1MKKyNlbmRpZiAvKiBOT0dFVElEX1BST1RPUyAqLworI2VuZGlmIC8qIENLX0FOU0lMSUJTICovCisjZW5kaWYgLyogTV9VTklYICovCisKKyNpZm5kZWYgX1BPU0lYX1NPVVJDRQorI2lmbmRlZiBTVU5PUzQKKyNpZm5kZWYgTkVYVAorI2lmbmRlZiBQUzJBSVgxMAorI2lmbmRlZiBzZXF1ZW50CisjaWZuZGVmIEhQVVg5CisjaWZuZGVmIENPSEVSRU5UCisjaWZuZGVmIE5PR0VUSURfUFJPVE9TCitleHRlcm4gVUlEX1QgZ2V0dWlkKCksIGdldGV1aWQoKSwgZ2V0cmV1aWQoKTsKK2V4dGVybiBHSURfVCBnZXRnaWQoKSwgZ2V0ZWdpZCgpLCBnZXRyZWdpZCgpOworI2VuZGlmIC8qIE5PR0VUSURfUFJPVE9TICovCisjZWxzZQorZXh0ZXJuIFVJRF9UIGdldHJldWlkKCk7CitleHRlcm4gR0lEX1QgZ2V0cmVnaWQoKTsKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworI2VuZGlmIC8qIEhQVVg5ICovCisjZW5kaWYgLyogc2VxdWVudCAqLworI2VuZGlmIC8qIFBTMkFJWDEwICovCisjZW5kaWYgLyogTkVYVCAqLworI2VuZGlmIC8qIFNVTk9TNCAqLworI2VuZGlmIC8qIF9QT1NJWF9TT1VSQ0UgKi8KKworLyoKK1N1YmplY3Q6IFNldC11c2VyLWlkCitUbzogZmRjQHdhdHN1bi5jYy5jb2x1bWJpYS5lZHUgKEZyYW5rIGRhIENydXopCitEYXRlOiBTYXQsIDIxIEFwciA5MCA0OjQ4OjI1IE1FUworRnJvbTogS3Jpc3RvZmZlciBFcmlrc3NvbiA8c2tlQHBrbWFiLnNlPgorCitUaGlzIGlzIGEgc2V0IG9mIGZ1bmN0aW9ucyB0byBiZSB1c2VkIGluIHByb2dyYW1zIHRoYXQgbWF5IGJlIHJ1biBzZXQtdXNlci1pZAorYW5kL29yIHNldC1ncm91cC1pZC4gVGhleSBoYW5kbGUgYm90aCB0aGUgY2FzZSB3aGVyZSB0aGUgcHJvZ3JhbSBpcyBub3QgcnVuCit3aXRoIHN1Y2ggcHJpdmlsZWdlcyAobm90aGluZyBzcGVjaWFsIGhhcHBlbnMgdGhlbiksIGFuZCB0aGUgY2FzZSB3aGVyZSBvbmUKK29yIGJvdGggb2YgdGhlc2Ugc2V0LWlkIG1vZGVzIGFyZSB1c2VkLiAgVGhlIHByb2dyYW0gaXMgbWFkZSB0byBydW4gd2l0aCB0aGUKK3VzZXIncyByZWFsIHVzZXIgYW5kIGdyb3VwIGlkcyBtb3N0IG9mIHRoZSB0aW1lLCBleGNlcHQgZm9yIHdoZW4gbW9yZQorcHJpdmlsZWdlcyBhcmUgbmVlZGVkLiAgRG9uJ3Qgc2V0LXVzZXItaWQgdG8gInJvb3QiLgorCitUaGlzIHdvcmtzIG9uIFN5c3RlbSBWIGFuZCBQT1NJWC4gIEluIEJTRCwgaXQgZGVwZW5kcyBvbiB0aGUKKyJzYXZlZC1zZXQtdXNlci1pZCIgZmVhdHVyZS4KKyovCisKKyNkZWZpbmUgVUlEX1JPT1QgMAkJCS8qIFJvb3QgdXNlciBhbmQgZ3JvdXAgaWRzICovCisjZGVmaW5lIEdJRF9ST09UIDAKKworLyoKKyAgVGhlIGZvbGxvd2luZyBjb2RlIGRlZmluZXMgdGhlIHN5bWJvbCBTRVRFVUlEIGZvciBVTklYIHN5c3RlbXMgYmFzZWQKKyAgb24gQlNENC40IChlaXRoZXIgLUVuY3VtYmVyZWQgb3IgLUxpdGUpLiAgVGhpcyBwcm9ncmFtIHdpbGwgdGhlbiB1c2UKKyAgc2V0ZXVpZCgpIGFuZCBzZXRlZ2lkKCkgaW5zdGVhZCBvZiBzZXR1aWQoKSBhbmQgc2V0Z2lkKCksIHdoaWNoIHN0aWxsCisgIGRvbid0IGFsbG93IGFyYml0cmFyeSBzd2l0Y2hpbmcuICBJdCBhbHNvIGF2b2lkcyBzZXRyZXVpZCgpIGFuZAorICBzZXRyZWdpZCgpLCB3aGljaCBhcmUgaW5jbHVkZWQgaW4gQlNENC40IGZvciBjb21wYXRpYmlsaXR5IG9ubHksIGFyZQorICBpbnNlY3VyZSwgYW5kIHByaW50IHdhcm5pbmdzIHRvIHN0ZGVyciB1bmRlciBhdCBsZWFzdCBvbmUgc3lzdGVtIChOZXRCU0QKKyAgMS4wKS4gIE5vdGUgdGhhdCBQT1NJWCBzeXN0ZW1zIHNob3VsZCBzdGlsbCB1c2Ugc2V0dWlkKCkgYW5kIHNldGdpZCgpOworICB0aGUgc2V0ZXVpZCgpIGFuZCBzZXRlZ2lkKCkgZnVuY3Rpb25zIGFyZSBCU0Q0LjQgZXh0ZW5zaW9ucyB0byB0aGUKKyAgUE9TSVggbW9kZWwuICBNaWtlIExvbmcgPG1pa2UubG9uZ0BhbmFsb2cuY29tPiwgOC85NC4KKyovCisjaWZkZWYgQlNENDQKKyNkZWZpbmUgU0VURVVJRAorI2VuZGlmIC8qIEJTRDQ0ICovCisKKy8qCisgIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0aW9uIGF1dG9tYXRpY2FsbHkgZGVmaW5lcyB0aGUgc3ltYm9sIFNFVFJFVUlEIGZvcgorICBVTklYIHZlcnNpb25zIGJhc2VkIG9uIEJlcmtlbGV5IFVuaXggNC4yIGFuZCA0LjMuICBJZiB0aGlzIHN5bWJvbCBpcworICBkZWZpbmVkLCB0aGVuIHRoaXMgcHJvZ3JhbSB3aWxsIHVzZSBnZXRyZXVpZCgpIGFuZCBnZXRyZWdpZCgpIGNhbGxzIGluCisgIHByZWZlcmVuY2UgdG8gZ2V0dWlkKCkgYW5kIGdldGdpZCgpLCB3aGljaCBpbiBCZXJrZWxleS1iYXNlZCBVbml4ZXMgZG8KKyAgbm90IGFsbG93IGFyYml0cmFyeSBzd2l0Y2hpbmcgYmFjayBhbmQgZm9ydGggb2YgcmVhbCAmIGVmZmVjdGl2ZSB1aWQuCisgIFRoaXMgY29uc3RydWN0aW9uIGFsc28gYWxsb3dzIC1EU0VUUkVVSUQgdG8gYmUgcHV0IG9uIHRoZSBjYyBjb21tYW5kIGxpbmUKKyAgZm9yIGFueSBzeXN0ZW0gdGhhdCBoYXMgYW5kIHdhbnRzIHRvIHVzZSBzZXRyZVt1Z11pZCgpLiAgSXQgYWxzbyBwcmV2ZW50cworICBhdXRvbWF0aWMgZGVmaW5pdGlvbiBvZiBTRVRSRVVJRCBpZiAtRE5PU0VUUkVVIGlzIGluY2x1ZGVkIG9uIHRoZSBjYworICBjb21tYW5kIGxpbmUgKG9yIG90aGVyd2lzZSBkZWZpbmVkKS4KKyovCisjaWZkZWYgRlQxOAkJCQkvKiBOb25lIG9mIHRoaXMgZm9yIEZvcnR1bmUuICovCisjZGVmaW5lIE5PU0VUUkVVCisjZW5kaWYgLyogRlQxOCAqLworCisjaWZkZWYgQU5ZQlNECisjaWZuZGVmIEJTRDI5CisjaWZuZGVmIEJTRDQxCisjaWZuZGVmIFNFVFJFVUlECisjaWZuZGVmIE5PU0VUUkVVCisjaWZuZGVmIFNFVEVVSUQKKyNkZWZpbmUgU0VUUkVVSUQKKyNlbmRpZiAvKiBTRVRFVUlEICovCisjZW5kaWYgLyogTk9TRVRSRVUgKi8KKyNlbmRpZiAvKiBTRVRSRVVJRCAqLworI2VuZGlmIC8qICFCU0Q0MSAqLworI2VuZGlmIC8qICFCU0QyOSAqLworI2VuZGlmIC8qIEFOWUJTRCAqLworCisvKiBWYXJpYWJsZXMgZm9yIHVzZXIgYW5kIGdyb3VwIElEcy4gKi8KKworc3RhdGljIFVJRF9UIHJlYWx1aWQgPSAoVUlEX1QpIC0xLCBwcml2dWlkID0gKFVJRF9UKSAtMTsKK3N0YXRpYyBHSURfVCByZWFsZ2lkID0gKEdJRF9UKSAtMSwgcHJpdmdpZCA9IChHSURfVCkgLTE7CisKKworLyogUCBSIEkgViBfIEkgTiBJICAtLSAgSW5pdGlhbGl6ZSBwcml2aWxlZ2VzIHBhY2thZ2UgICovCisKKy8qIENhbGxlZCBhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiBhIHNldC11aWQgb3Igc2V0LWdpZCBwcm9ncmFtIHRvIHN0b3JlIHRoZQorICogc2V0LXRvIHVpZCBhbmQvb3IgZ2lkIGFuZCBzdGVwIGRvd24gdG8gdGhlIHVzZXJzIHJlYWwgdWlkIGFuZCBnaWQuIFRoZQorICogc3RvcmVkIGlkJ3MgY2FuIGJlIHRlbXBvcmFyaWx5IHJlc3RvcmVkIChhbGxvd2VkIGluIFN5c3RlbSBWKSBkdXJpbmcKKyAqIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIHRoZSBwcml2aWxlZ2UuICBNb3N0IG9mIHRoZSB0aW1lLCB0aGUgcHJvZ3JhbQorICogc2hvdWxkIGV4ZWN1dGUgaW4gdW5wcml2aWxpZ2VkIHN0YXRlLCB0byBub3QgaW1wb3NlIGFueSBzZWN1cml0eSB0aHJlYXQuCisgKgorICogTm90ZTogRG9uJ3QgZm9yZ2V0IHRoYXQgYWNjZXNzKCkgYWx3YXlzIHVzZXMgdGhlIHJlYWwgaWQ6cyB0byBkZXRlcm1pbmUKKyAqIGZpbGUgYWNjZXNzLCBldmVuIHdpdGggcHJpdmlsZWdlcyByZXN0b3JlZC4KKyAqCisgKiBSZXR1cm5zIGFuIGVycm9yIG1hc2ssIHdpdGggZXJyb3IgdmFsdWVzIG9yOmVkIHRvZ2V0aGVyOgorICogICAxIGlmIHNldHVpZCgpIGZhaWxzLAorICogICAyIGlmIHNldGdpZCgpIGZhaWxzLCBhbmQKKyAqICAgNCBpZiB0aGUgcHJvZ3JhbSBpcyBzZXQtdXNlci1pZCB0byAicm9vdCIsIHdoaWNoIGNhbid0IGJlIGhhbmRsZWQuCisgKgorICogT25seSB0aGUgcmV0dXJuIHZhbHVlIDAgaW5kaWNhdGVzIHJlYWwgc3VjY2Vzcy4gSW4gY2FzZSBvZiBmYWlsdXJlLAorICogdGhvc2UgcHJpdmlsZWdlcyB0aGF0IGNvdWxkIGJlIHJlZHVjZWQgaGF2ZSBiZWVuLCBhdCBsZWFzdCwgYnV0IHRoZQorICogcHJvZ3JhbSBzaG91bGQgYmUgYWJvcnRlZCBub25lLXRoZS1sZXNzLgorICoKKyAqIEFsc28gbm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBkbyBub3QgZXhwZWN0IHRoZSB1aWQgb3IgZ2lkIHRvIGNoYW5nZQorICogd2l0aG91dCB0aGVpciBrbm93aW5nLiBJdCBtYXkgd29yayBpZiBpdCBpcyBvbmx5IGRvbmUgdGVtcG9yYXJpbHksIGJ1dAorICogeW91J3JlIG9uIHlvdXIgb3duLgorICovCitpbnQKK3ByaXZfaW5pKCkgeworICAgIGludCBlcnIgPSAwOworCisjaWZuZGVmIEhBVkVfQkFVREJPWQorCisgICAgLyogU2F2ZSByZWFsIElEOnMuICovCisgICAgcmVhbHVpZCA9IGdldHVpZCgpOworICAgIHJlYWxnaWQgPSBnZXRnaWQoKTsKKworICAgIC8qIFNhdmUgY3VycmVudCBlZmZlY3RpdmUgSUQ6cywgdGhvc2Ugc2V0IHRvIGF0IHByb2dyYW0gZXhlYy4gKi8KKyAgICBwcml2dWlkID0gZ2V0ZXVpZCgpOworICAgIHByaXZnaWQgPSBnZXRlZ2lkKCk7CisKKyAgICAvKiBJZiBydW5uaW5nIHNldC11aWQsIGdvIGRvd24gdG8gcmVhbCB1aWQsIG90aGVyd2lzZSByZW1lbWJlciB0aGF0CisgICAgICogbm8gcHJpdmlsZWdlZCB1aWQgaXMgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogRXhjZXB0aW9uczoKKyAgICAgKgorICAgICAqIDEpIElmIHRoZSByZWFsIHVpZCBpcyBhbHJlYWR5ICJyb290IiBhbmQgdGhlIHNldC11aWQgdWlkICh0aGUKKyAgICAgKiBpbml0aWFsIGVmZmVjdGl2ZSB1aWQpIGlzIG5vdCAicm9vdCIsIHRoZW4gd2Ugd291bGQgaGF2ZSB0cm91YmxlCisgICAgICogaWYgd2Ugd2VudCAiZG93biIgdG8gInJvb3QiIGhlcmUsIGFuZCB0aGVuIHRlbXBvcmFyaWx5IGJhY2sgdG8gdGhlCisgICAgICogc2V0LXVpZCB1aWQgKG5vdCAicm9vdCIpIGFuZCB0aGVuIGFnYWluIHRyaWVkIHRvIGJlY29tZSAicm9vdCIuIEkKKyAgICAgKiB0aGluayB0aGUgInNhdmVkIHNldC11aWQiIGlzIGxvc3Qgd2hlbiBjaGFuZ2luZyB1aWQgZnJvbSBlZmZlY3RpdmUKKyAgICAgKiB1aWQgInJvb3QiLCB3aGljaCBjaGFuZ2VzIGFsbCB1aWQsIG5vdCBvbmx5IHRoZSBlZmZlY3RpdmUgdWlkLiBCdXQKKyAgICAgKiBpbiB0aGlzIHNpdHVhdGlvbiwgd2UgY2FuIHNpbXBseSBnbyB0byAicm9vdCIgYW5kIHN0YXkgdGhlcmUgYWxsCisgICAgICogdGhlIHRpbWUuIFRoYXQgc2hvdWxkIGdpdmUgc3VmZmljaWVudCBwcml2aWxlZ2UgKHVuZGVyc3RhdGVtZW50ISksCisgICAgICogYW5kIGdpdmUgdGhlIHJpZ2h0IHVpZHMgZm9yIHN1YnByb2Nlc3Nlcy4KKyAgICAgKgorICAgICAqIDIpIElmIHRoZSBzZXQtdWlkICh0aGUgaW5pdGlhbCBlZmZlY3RpdmUgdWlkKSBpcyAicm9vdCIsIGFuZCB3ZQorICAgICAqIGNoYW5nZSB1aWQgdG8gdGhlIHJlYWwgdWlkLCB3ZSBjYW4ndCBjaGFuZ2UgaXQgYmFjayB0byAicm9vdCIgd2hlbgorICAgICAqIHdlIG5lZWQgdGhlIHByaXZpbGVnZSwgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBpbiAxKS4gVGh1cywgd2UgY2FuJ3QKKyAgICAgKiBoYW5kbGUgcHJvZ3JhbXMgdGhhdCBhcmUgc2V0LXVzZXItaWQgdG8gInJvb3QiIGF0IGFsbC4gVGhlIHByb2dyYW0KKyAgICAgKiBzaG91bGQgYmUgc3RvcHBlZC4gIFVzZSBzb21lIG90aGVyIHVpZC4gICJyb290IiBpcyBwcm9iYWJseSB0b28KKyAgICAgKiBwcml2aWxlZ2VkIGZvciBzdWNoIHRoaW5ncywgYW55d2F5LiAoVGhlIHVpZCBpcyByZXZlcnRlZCB0byB0aGUKKyAgICAgKiByZWFsIHVpZCB1bnRpbCB0ZXJtaW5hdGlvbi4pCisgICAgICoKKyAgICAgKiBUaGVzZSB0d28gZXhjZXB0aW9ucyBoYXZlIHRoZSBlZmZlY3QgdGhhdCB0aGUgInJvb3QiIHVpZCB3aWxsIG5ldmVyCisgICAgICogYmUgb25lIG9mIHRoZSB0d28gdWlkcyB0aGF0IGFyZSBiZWluZyBzd2l0Y2hlZCBiZXR3ZWVuLCB3aGljaCBhbHNvCisgICAgICogbWVhbnMgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBmb3Igc3VjaCBjYXNlcyBpbiB0aGUgc3dpdGNoaW5nCisgICAgICogZnVuY3Rpb25zLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IGV4Y2VwdGlvbiAxKSBpcyBoYW5kbGVkIGJ5IHRoZXNlIHJvdXRpbmVzIChieSBjb25zdGFudGx5CisgICAgICogcnVubmluZyB3aXRoIHVpZCAicm9vdCIsIHdoaWxlIGV4Y2VwdGlvbiAyKSBpcyBhIHNlcmlvdXMgZXJyb3IsIGFuZAorICAgICAqIGlzIG5vdCBwcm92aWRlZCBmb3IgYXQgYWxsIGluIHRoZSBzd2l0Y2hpbmcgZnVuY3Rpb25zLgorICAgICAqLworICAgIGlmIChyZWFsdWlkID09IHByaXZ1aWQpCisJcHJpdnVpZCA9IChVSURfVCkgLTE7CQkvKiBOb3QgcnVubmluZyBzZXQtdXNlci1pZC4gKi8KKworICAgIC8qIElmIHJ1bm5pbmcgc2V0LWdpZCwgZ28gZG93biB0byByZWFsIGdpZCwgb3RoZXJ3aXNlIHJlbWVtYmVyIHRoYXQKKyAgICAgKiBubyBwcml2aWxlZ2VkIGdpZCBpcyBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBUaGVyZSBhcmUgbm8gZXhjZXB0aW9uIGxpa2UgdGhlcmUgaXMgZm9yIHRoZSB1c2VyIGlkLCBzaW5jZSB0aGVyZQorICAgICAqIGlzIG5vIGdyb3VwIGlkIHRoYXQgaXMgcHJpdmlsZWdlZCBpbiB0aGUgbWFubmVyIG9mIHVpZCAicm9vdCIuCisgICAgICogVGhlcmUgY291bGQgYmUgZXF1aXZhbGVudCBwcm9ibGVtcyBmb3IgZ3JvdXAgY2hhbmdpbmcgaWYgdGhlCisgICAgICogcHJvZ3JhbSBzb21ldGltZXMgcmFuIHdpdGggdWlkICJyb290IiBhbmQgc29tZXRpbWVzIG5vdCwgYnV0CisgICAgICogdGhhdCBpcyBhbHJlYWR5IGF2b2lkZWQgYXMgZXhwbGFpbmVkIGFib3ZlLgorICAgICAqCisgICAgICogVGh1cyB3ZSBjYW4gZXhwZWN0IGFsd2F5cyB0byBiZSBhYmxlIHRvIHN3aXRjaCB0byB0aGUgInNhdmVkIHNldC0KKyAgICAgKiBnaWQiIHdoZW4gd2Ugd2FudCwgYW5kIGJhY2sgdG8gdGhlIHJlYWwgZ2lkIGFnYWluLiBZb3UgbWF5IGFsc28KKyAgICAgKiBkcmF3IHRoZSBjb25jbHVzaW9uIHRoYXQgc2V0LWdpZCBwcm92aWRlcyBmb3IgZmV3ZXIgaGFzc2xlcyB0aGFuCisgICAgICogc2V0LXVpZC4KKyAgICAgKi8KKworI2lmZGVmIFNVSURERUJVRworICAgIGZwcmludGYoc3RkZXJyLCJVSURfUk9PVD0lZFxuIixVSURfUk9PVCk7CisgICAgZnByaW50ZihzdGRlcnIsInJlYWx1aWQ9JWRcbiIscmVhbHVpZCk7CisgICAgZnByaW50ZihzdGRlcnIsInByaXZ1aWQ9JWRcbiIscHJpdnVpZCk7CisjZW5kaWYgLyogU1VJRERFQlVHICovCisKKyAgICBpZiAocmVhbGdpZCA9PSBwcml2Z2lkKQkJLyogSWYgbm90IHJ1bm5pbmcgc2V0LXVzZXItaWQsICovCisgICAgICBwcml2Z2lkID0gKEdJRF9UKSAtMTsJCS8qICByZW1lbWJlciBpdCB0aGlzIHdheS4gKi8KKworICAgIGVyciA9IHByaXZfb2ZmKCk7CQkJLyogVHVybiBvZmYgc2V0dWlkIHByaXZpbGVnZS4gKi8KKworICAgIGlmIChwcml2dWlkID09IFVJRF9ST09UKQkJLyogSWYgc2V0dWlkIHRvIHJvb3QsICovCisgICAgICBlcnIgfD0gNDsJCQkJLyogcmV0dXJuIHRoaXMgZXJyb3IuICovCisKKyAgICBpZiAocmVhbHVpZCA9PSBVSURfUk9PVCkgewkJLyogSWYgcmVhbCBpZCBpcyByb290LCAqLworCXByaXZ1aWQgPSAoVUlEX1QpIC0xOwkJLyogc3RheSByb290IGF0IGFsbCB0aW1lcy4gKi8KKyNpZmRlZiBBVFQ3MzAwCisJLyogSWYgS2VybWl0IGluc3RhbGxlZCBTVUlEIHV1Y3AgYW5kIHVzZXIgaXMgcnVubmluZyBhcyByb290ICovCisJZXJyICY9IH4xOwkJCS8qIFN5c3RlbSBWIFIwIGRvZXMgbm90IHNhdmUgVUlEICovCisjZW5kaWYgLyogQVRUNzMwMCAqLworICAgIH0KKyNlbmRpZiAvKiBIQVZFX0JBVURCT1kgKi8KKyAgICByZXR1cm4oZXJyKTsKK30KKworCisvKiBNYWNyb3MgZm9yIGhpZGluZyB0aGUgZGlmZmVyZW5jZXMgaW4gVUlEL0dJRCBzZXR0aW5nIGJldHdlZW4gdmFyaW91cyBVbml4CisgKiBzeXN0ZW1zLiBUaGVzZSBtYWNyb3Mgc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCBib3RoIHRoZSBwcml2aWxlZ2VkIElECisgKiBhbmQgdGhlIG5vbi1wcml2aWxlZ2VkIElELiBUaGUgb25lIGluIHRoZSBzZWNvbmQgYXJndW1lbnQsIHdpbGwgYmVjb21lIHRoZQorICogZWZmZWN0aXZlIElELiBUaGUgb25lIGluIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIHJldGFpbmVkIGZvciBsYXRlcgorICogcmV0cmlldmFsLgorICovCisjaWZkZWYgU0VUUkVVSUQKKyNpZmRlZiBTQVZFRFVJRAorLyogT24gQlNEIHN5c3RlbXMgd2l0aCB0aGUgc2F2ZWQtVUlEIGZlYXR1cmUsIHdlIGp1c3QganVnZ2xlIHRoZSBlZmZlY3RpdmUKKyAqIFVJRCBiYWNrIGFuZCBmb3J0aCwgYW5kIGxlYXZlIHRoZSByZWFsIFVJRCBhdCBpdHMgdHJ1ZSB2YWx1ZS4gIFRoZSBrZXJuZWwKKyAqIGFsbG93cyBzd2l0Y2hpbmcgdG8gYm90aCB0aGUgY3VycmVudCByZWFsIFVJRCwgdGhlIGVmZmVjdGl2ZSBVSUQsIGFuZCB0aGUKKyAqIFVJRCB3aGljaCB0aGUgcHJvZ3JhbSBpcyBzZXQtVUlEIHRvLiAgVGhlIHNhdmVkIHNldC1VSUQgYWx3YXlzIGhvbGRzIHRoZQorICogcHJpdmlsZWdlZCBVSUQgZm9yIHVzLCBhbmQgdGhlIHJlYWwgVUlEIHdpbGwgYWx3YXlzIGJlIHRoZSBub24tcHJpdmlsZWdlZCwKKyAqIGFuZCB3ZSBjYW4gZnJlZWx5IGNob29zZSBvbmUgb2YgdGhlbSBmb3IgdGhlIGVmZmVjdGl2ZSBVSUQgYXQgYW55IHRpbWUuCisgKi8KKyNkZWZpbmUgc3dpdGNodWlkKGhpZGRlbixhY3RpdmUpIHNldHJldWlkKCAoVUlEX1QpIC0xLCBhY3RpdmUpCisjZGVmaW5lIHN3aXRjaGdpZChoaWRkZW4sYWN0aXZlKSBzZXRyZWdpZCggKEdJRF9UKSAtMSwgYWN0aXZlKQorCisjZWxzZSAgIC8qIFNFVFJFVUlELCFTQVZFRFVJRCAqLworCisvKiBPbiBzeXN0ZW1zIHdpdGggc2V0cmVYaWQoKSBidXQgd2l0aG91dCB0aGUgc2F2ZWQtVUlEIGZlYXR1cmUsIG5vdGFibHkKKyAqIEJTRCA0LjIsIHdlIHN3YXAgdGhlIHJlYWwgYW5kIGVmZmVjdGl2ZSBVSURzIGVhY2ggdGltZS4gIEl0J3MKKyAqIHRoZSBlZmZlY3RpdmUgVUlEIHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4sIGJ1dCB3ZSBoYXZlIHRvIHJldGFpbiB0aGUKKyAqIHVudXNlZCBVSUQgc29tZXdoZXJlIHRvIGVuYWJsZSB1cyB0byByZXN0b3JlIGl0IGxhdGVyLCBhbmQgd2UgZG8gdGhpcworICogaW4gdGhlIHJlYWwgVUlELiAgVGhlIGtlcm5lbCBvbmx5IGFsbG93cyBzd2l0Y2hpbmcgdG8gZWl0aGVyIHRoZSBjdXJyZW50CisgKiByZWFsIG9yIHRoZSBlZmZlY3RpdmUgVUlELCB1bmxlc3MgeW91J3JlICJyb290Ii4KKyAqLworI2RlZmluZSBzd2l0Y2h1aWQoaGlkZGVuLGFjdGl2ZSkJc2V0cmV1aWQoaGlkZGVuLGFjdGl2ZSkKKyNkZWZpbmUgc3dpdGNoZ2lkKGhpZGRlbixhY3RpdmUpCXNldHJlZ2lkKGhpZGRlbixhY3RpdmUpCisjZW5kaWYKKworI2Vsc2UgLyogIVNFVFJFVUlELCAhU0FWRURVSUQgKi8KKworI2lmZGVmIFNFVEVVSUQKKy8qCisgIEJTRCA0LjQgd29ya3Mgc2ltaWxhcmx5IHRvIFN5c3RlbSBWIGFuZCBQT1NJWCAoc2VlIGJlbG93KSwgYnV0IHVzZXMKKyAgc2V0ZVhpZCgpIGluc3RlYWQgb2Ygc2V0WGlkKCkgdG8gY2hhbmdlIGVmZmVjdGl2ZSBJRHMuICBJbiBhZGRpdGlvbiwgdGhlCisgIHNldGVYaWQoKSBmdW5jdGlvbnMgd29yayB0aGUgc2FtZSBmb3IgInJvb3QiIGFzIGZvciBvdGhlciB1c2Vycy4KKyovCisjZGVmaW5lIHN3aXRjaHVpZChoaWRkZW4sYWN0aXZlKQlzZXRldWlkKGFjdGl2ZSkKKyNkZWZpbmUgc3dpdGNoZ2lkKGhpZGRlbixhY3RpdmUpCXNldGVnaWQoYWN0aXZlKQorCisjZWxzZSAvKiAhU0VURVVJRCAqLworCisvKiBPbiBTeXN0ZW0gViBhbmQgUE9TSVgsIHRoZSBvbmx5IHRoaW5nIHdlIGNhbiBjaGFuZ2UgaXMgdGhlIGVmZmVjdGl2ZSBVSUQKKyAqICh1bmxlc3MgdGhlIGN1cnJlbnQgZWZmZWN0aXZlIFVJRCBpcyAicm9vdCIsIGJ1dCBpbml0c3VpZCgpIGF2b2lkcyB0aGF0IGZvcgorICogdXMpLiAgVGhlIGtlcm5lbCBhbGxvd3Mgc3dpdGNoaW5nIHRvIHRoZSBjdXJyZW50IHJlYWwgVUlEIG9yIHRvIHRoZSBzYXZlZAorICogc2V0LVVJRC4gIFRoZXNlIGFyZSBhbHdheXMgc2V0IHRvIHRoZSBub24tcHJpdmlsZWdlZCBVSUQgYW5kIHRoZSBwcml2aWxlZ2VkCisgKiBVSUQsIHJlc3BlY3RpdmVseSwgYW5kIHdlIG9ubHkgY2hhbmdlIHRoZSBlZmZlY3RpdmUgVUlELiAgVGhpcyBicmVha3MgaWYKKyAqIHRoZSBjdXJyZW50IGVmZmVjdGl2ZSBVSUQgaXMgInJvb3QiLCB0aG91Z2gsIGJlY2F1c2UgZm9yICJyb290IiBzZXR1aWQvZ2lkCisgKiBiZWNvbWVzIG1vcmUgcG93ZXJmdWwsIHdoaWNoIGlzIHdoeSBpbml0c3VpZCgpIHRyZWF0cyAicm9vdCIgc3BlY2lhbGx5LgorICogTm90ZTogVGhhdCBzcGVjaWFsIHRyZWF0bWVudCBtYXliZSBjb3VsZCBiZSBpZ25vcmVkIGZvciBCU0Q/ICBOb3RlOiBGb3IKKyAqIHN5c3RlbXMgdGhhdCBkb24ndCBmaXQgYW55IG9mIHRoZXNlIGZvdXIgY2FzZXMsIHdlIHNpbXBseSBjYW4ndCBzdXBwb3J0CisgKiBzZXQtVUlELgorICovCisjZGVmaW5lIHN3aXRjaHVpZChoaWRkZW4sYWN0aXZlKQlzZXR1aWQoYWN0aXZlKQorI2RlZmluZSBzd2l0Y2hnaWQoaGlkZGVuLGFjdGl2ZSkJc2V0Z2lkKGFjdGl2ZSkKKworI2VuZGlmIC8qIFNFVEVVSUQgKi8KKyNlbmRpZiAvKiBTRVRSRVVJRCAqLworCisKKy8qIFAgUiBJIFYgXyBPIE4gIC0tICBUdXJuIG9uIHRoZSBzZXR1aWQgYW5kL29yIHNldGdpZCAqLworCisvKiBHbyB0byB0aGUgcHJpdmlsZWdlZCB1aWQgKGdpZCkgdGhhdCB0aGUgcHJvZ3JhbSBpcyBzZXQtdXNlci1pZAorICogKHNldC1ncm91cC1pZCkgdG8sIHVubGVzcyB0aGUgcHJvZ3JhbSBpcyBydW5uaW5nIHVucHJpdmlsZWdlZC4KKyAqIElmIHNldHVpZCgpIGZhaWxzLCByZXR1cm4gdmFsdWUgd2lsbCBiZSAxLiBJZiBnZXR1aWQoKSBmYWlscyBpdAorICogd2lsbCBiZSAyLiAgUmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGZpcnN0IGZhaWx1cmUsIGFuZCB0aGUgZnVuY3Rpb24KKyAqIHRyaWVzIHRvIHJlc3RvcmUgYW55IHBhcnRpYWwgd29yayBkb25lLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKiBHcm91cCBpZCBpcyBjaGFuZ2VkIGZpcnN0LCBzaW5jZSBpdCBpcyBsZXNzIHNlcmlvdXMgdGhhbiB1c2VyIGlkLgorICovCitpbnQKK3ByaXZfb24oKSB7CisjaWZuZGVmIEhBVkVfQkFVREJPWQorICAgIGlmIChwcml2Z2lkICE9IChHSURfVCkgLTEpCisgICAgICBpZiAoc3dpdGNoZ2lkKHJlYWxnaWQscHJpdmdpZCkpCisgICAgICAgIHJldHVybigyKTsKKworICAgIGlmIChwcml2dWlkICE9IChVSURfVCkgLTEpCisgICAgICBpZiAoc3dpdGNodWlkKHJlYWx1aWQscHJpdnVpZCkpIHsKKwkgIGlmIChwcml2Z2lkICE9IChHSURfVCkgLTEpCisJICAgIHN3aXRjaGdpZChwcml2Z2lkLHJlYWxnaWQpOworCSAgcmV0dXJuKDEpOworICAgICAgfQorI2VuZGlmIC8qIEhBVkVfQkFVREJPWSAqLworICAgIHJldHVybigwKTsKK30KKworLyogUCBSIEkgViBfIE8gRiBGICAtLSAgVHVybiBvbiB0aGUgcmVhbCB1aWQgYW5kIGdpZCAqLworCisvKiBSZXR1cm4gdG8gdGhlIHVucHJpdmlsZWdlZCB1aWQgKGdpZCkgYWZ0ZXIgYW4gdGVtcG9yYXJ5IHZpc2l0IHRvCisgKiBwcml2aWxlZ2VkIHN0YXR1cywgdW5sZXNzIHRoZSBwcm9ncmFtIGlzIHJ1bm5pbmcgd2l0aG91dCBzZXQtdXNlci1pZAorICogKHNldC1ncm91cC1pZCkuIFJldHVybnMgMSBmb3IgZmFpbHVyZSBpbiBzZXR1aWQoKSBhbmQgMiBmb3IgZmFpbHVyZQorICogaW4gc2V0Z2lkKCkgb3I6ZWQgdG9nZXRoZXIuIFRoZSBmdW5jdGlvbnMgdHJpZXMgdG8gcmV0dXJuIGJvdGggdWlkCisgKiBhbmQgZ2lkIHRvIHVucHJpdmlsZWdlZCBzdGF0ZSwgcmVnYXJkbGVzcyBvZiBlcnJvcnMuIFJldHVybnMgMCBvbgorICogc3VjY2Vzcy4KKyAqLworaW50Citwcml2X29mZigpIHsKKyAgICBpbnQgZXJyID0gMDsKKyNpZm5kZWYgSEFWRV9CQVVEQk9ZCisgICAgaWYgKHByaXZ1aWQgIT0gKFVJRF9UKSAtMSkKKyAgICAgICBpZiAoc3dpdGNodWlkKHByaXZ1aWQscmVhbHVpZCkpCisJICBlcnIgfD0gMTsKKworICAgIGlmIChwcml2Z2lkICE9IChHSURfVCkgLTEpCisgICAgICAgaWYgKHN3aXRjaGdpZChwcml2Z2lkLHJlYWxnaWQpKQorCWVyciB8PSAyOworI2VuZGlmIC8qIEhBVkVfQkFVREJPWSAqLworICAgIHJldHVybihlcnIpOworfQorCisvKiBUdXJuIG9mZiBwcml2aWxlZ2UgcGVybWFuZW50bHkuICBObyBnb2luZyBiYWNrLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVmb3JlCisgKiBhIGZvcmsoKSBvbiBCU0Q0MyBtYWNoaW5lcyB0aGF0IGRvbid0IHNhdmUgdGhlIHNldFVJRCBvciBzZXRHSUQsIGJlY2F1c2UKKyAqIHdlIHN3YXAgdGhlIHJlYWwgYW5kIGVmZmVjdGl2ZSBpZHMsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGxldCB0aGUgZm9ya2VkCisgKiBwcm9jZXNzIHN3YXAgdGhlbSBhZ2FpbiBhbmQgZ2V0IHRoZSBwcml2aWxlZ2UgYmFjay4gSXQgd2lsbCB3b3JrIG9uIG90aGVyCisgKiBtYWNoaW5lcyB0b28sIHN1Y2ggdGhhdCB5b3UgY2FuIHJlbHkgb24gaXRzIGVmZmVjdCBhbHdheXMgYmVpbmcgdGhlIHNhbWUsCisgKiBmb3IgaW5zdGFuY2UsIGV2ZW4gd2hlbiB5b3UncmUgaW4gcHJpdl9vbigpIHN0YXRlIHdoZW4gdGhpcyBpcyBjYWxsZWQuCisgKiAoV2VsbCwgdGhhdCBwYXJ0IGFib3V0ICJwZXJtYW5lbnQiIGlzIG9uIFN5c3RlbSBWIG9ubHkgdHJ1ZSBpZiB5b3UgZm9sbG93CisgKiB0aGlzIHdpdGggYSBjYWxsIHRvIGV4ZWMoKSwgYnV0IHRoYXQncyB3aGF0IHdlIHdhbnQgaXQgZm9yIGFueXdheS4pCisgKiBBZGRlZCBieSBEZWFuIExvbmcgLS0gZGxvbmdAbWlkZ2FyZC51Y3NjLmVkdQorICovCitpbnQKK3ByaXZfY2FuKCkgeworI2lmbmRlZiBIQVZFX0JBVURCT1kKKyNpZmRlZiBTRVRSRVVJRAorICAgIGludCBlcnIgPSAwOworICAgIGlmIChwcml2dWlkICE9IChVSURfVCkgLTEpCisgICAgICAgaWYgKHNldHJldWlkKHJlYWx1aWQscmVhbHVpZCkpCisJICBlcnIgfD0gMTsKKworICAgIGlmIChwcml2Z2lkICE9IChHSURfVCkgLTEpCisgICAgICAgIGlmIChzZXRyZWdpZChyZWFsZ2lkLHJlYWxnaWQpKQorIAkgIGVyciB8PSAyOworCisgICAgcmV0dXJuKGVycik7CisKKyNlbHNlCisjaWZkZWYgU0VURVVJRAorICAgIGludCBlcnIgPSAwOworICAgIGlmIChwcml2dWlkICE9IChVSURfVCkgLTEpCisJaWYgKHNldHVpZChyZWFsdWlkKSkgeworCSAgICBkZWJ1ZyhGMTAxLCJzZXR1aWQgZmFpbGVkIiwiIixlcnJubyk7CisJICAgIGVyciB8PSAxOworCSAgICBkZWJ1ZyhGMTAxLCJydWlkIiwiIixnZXR1aWQoKSk7CisJICAgIGRlYnVnKEYxMDEsImV1aWQiLCIiLGdldGV1aWQoKSk7CisJfQorICAgIGRlYnVnKEYxMDEsInNldHVpZCIsIiIscmVhbHVpZCk7CisgICAgaWYgKHByaXZnaWQgIT0gKEdJRF9UKSAtMSkKKyAgICAgICAgaWYgKHNldGdpZChyZWFsZ2lkKSkgeworCSAgICBkZWJ1ZyhGMTAxLCJzZXRnaWQgZmFpbGVkIiwiIixlcnJubyk7CisJICAgIGVyciB8PSAyOworCSAgICBkZWJ1ZyhGMTAxLCJyZ2lkIiwiIixnZXRnaWQoKSk7CisJICAgIGRlYnVnKEYxMDEsImVnaWQiLCIiLGdldGVnaWQoKSk7CisJfQorICAgIGRlYnVnKEYxMDEsInNldGdpZCIsIiIscmVhbGdpZCk7CisgICAgcmV0dXJuKGVycik7CisjZWxzZQorICAgIC8qIEVhc3kgd2F5IG9mIHVzaW5nIHNldHVpZCgpL3NldGdpZCgpIGluc3RlYWQgb2Ygc2V0cmV1aWQoKS9zZXRyZWdpZCgpLiovCisgICAgcmV0dXJuKHByaXZfb2ZmKCkpOworI2VuZGlmIC8qIFNFVEVVSUQgKi8KKyNlbmRpZiAvKiBTRVRSRVVJRCAqLworI2Vsc2UKKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogSEFWRV9CQVVEQk9ZICovCit9CisKKy8qIFAgUiBJIFYgXyBPIFAgTiAgLS0gIEZvciBvcGVuaW5nIHByb3RlY3RlZCBmaWxlcyBvciBkZXZpY2VzLiAqLworCitpbnQKK3ByaXZfb3BuKG5hbWUsIG1vZGVzKSBjaGFyICpuYW1lOyBpbnQgbW9kZXM7IHsKKyAgICBpbnQgeDsKKyAgICBwcml2X29uKCk7CQkJCS8qIFR1cm4gcHJpdmlsZWdlcyBvbiAqLworICAgIGRlYnVnKEYxMTEsInByaXZfb3BuIixuYW1lLG1vZGVzKTsKKyAgICBlcnJubyA9IDA7CisgICAgeCA9IG9wZW4obmFtZSwgbW9kZXMpOwkJLyogVHJ5IHRvIG9wZW4gdGhlIGRldmljZSAqLworICAgIGRlYnVnKEYxMDEsInByaXZfb3BuIHJlc3VsdCIsIiIseCk7CisgICAgZGVidWcoRjEwMSwicHJpdl9vcG4gZXJybm8iLCIiLGVycm5vKTsKKyAgICBwcml2X29mZigpOwkJCQkvKiBUdXJuIHByaXZpbGVnZXMgb2ZmICovCisgICAgcmV0dXJuKHgpOwkJCQkvKiBSZXR1cm4gb3BlbidzIHJldHVybiBjb2RlICovCit9CisKKy8qICBQIFIgSSBWIF8gQyBIIEsgIC0tICBDaGVjayBwcml2aWxlZ2VzLiAgKi8KKworLyogIFRyeSB0byB0dXJuIHRoZW0gb2ZmLiAgSWYgdHVybmluZyB0aGVtIG9mZiBkaWQgbm90IHN1Y2NlZWQsIGNhbmNlbCB0aGVtICovCisKK2ludAorcHJpdl9jaGsoKSB7CisgICAgaW50IHgsIHkgPSAwOworICAgIHggPSBwcml2X29mZigpOwkJCS8qIFR1cm4gb2ZmIHByaXZzLiAqLworICAgIGlmICh4ICE9IDAgfHwgZ2V0dWlkKCkgPT0gcHJpdnVpZCB8fCBnZXRldWlkKCkgPT0gcHJpdnVpZCkKKyAgICAgIHkgPSBwcml2X2NhbigpOworICAgIGlmICh4ICE9IDAgfHwgZ2V0Z2lkKCkgPT0gcHJpdmdpZCB8fCBnZXRlZ2lkKCkgPT0gcHJpdmdpZCkKKyAgICAgIHkgPSB5IHwgcHJpdl9jYW4oKTsKKyAgICByZXR1cm4oeSk7Cit9CisKK1VJRF9UCityZWFsX3VpZCgpIHsKKyAgICByZXR1cm4ocmVhbHVpZCk7Cit9CisKK1ZPSUQKK3R0aW1vZmYoKSB7CQkJCS8qIFR1cm4gb2ZmIGFueSB0aW1lciBpbnRlcnJ1cHRzICovCisgICAgLyogaW50IHh4OyAqLworLyoKKyAgQXMgb2YgNUEoMTgzKSwgd2Ugc2V0IFNJR0FMUk0gdG8gU0lHX0lHTiAodG8gaWdub3JlIGFsYXJtcykgcmF0aGVyIHRoYW4gdG8KKyAgU0lHX0RGTCAodG8gY2F0Y2ggYWxhcm1zLCBvciBpZiB0aGVyZSBpcyBubyBoYW5kbGVyLCB0byBleGl0KS4gIFRoaXMgaXMgdG8KKyAgY3VyZSAobWFzaywgcmVhbGx5KSBhIGRlZXBlciBwcm9ibGVtIHdpdGggc3RyYXkgYWxhcm1zIHRoYXQgb2NjdXJzIG9uIHNvbWUKKyAgc3lzdGVtcywgcG9zc2libHkgaGF2aW5nIHRvIGRvIHdpdGggc2xlZXAoKSwgdGhhdCBjYXVzZWQgY29yZSBkdW1wcy4gIEl0CisgIHNob3VsZCBiZSBPSyB0byBkbyB0aGlzLCBiZWNhdXNlIG5vIGNvZGUgaW4gdGhpcyBtb2R1bGUgdXNlcyBuZXN0ZWQgYWxhcm1zLgorICAoQnV0IHdlIHN0aWxsIGhhdmUgdG8gd2F0Y2ggb3V0IGZvciBTQ1JJUFQgYW5kIERJQUwuLi4pCisqLworICAgIC8qIHh4ID0gKi8gYWxhcm0oMCk7CisgICAgLyogZGVidWcoRjEwMSwidHRpbW9mZiBhbGFybSIsIiIseHgpOyAqLworICAgIGlmIChzYXZhbCkgewkJCS8qIFJlc3RvcmUgYW55IHByZXZpb3VzICovCisJc2lnbmFsKFNJR0FMUk0sc2F2YWwpOwkJLyogYWxhcm0gaGFuZGxlci4gKi8KKwkvKiBkZWJ1ZyhGMTAxLCJ0dGltb2ZmIGFsYXJtIHJlc3RvcmluZyBzYXZhbCIsIiIsc2F2YWwpOyAqLworCXNhdmFsID0gTlVMTDsKKyAgICB9IGVsc2UgeworCXNpZ25hbChTSUdBTFJNLFNJR19JR04pOwkvKiBVc2VkIHRvIGJlIFNJR19ERkwgKi8KKwkvKiBkZWJ1ZyhGMTAwLCJ0dGltb2ZmIGFsYXJtIFNJR19JR04iLCIiLDApOyAqLworICAgIH0KK30KKworLyogVCBUIFIgVSBOIEMgTSBEICAtLSAgUmVkaXJlY3QgYW4gZXh0ZXJuYWwgY29tbWFuZCBvdmVyIHRoZSBjb25uZWN0aW9uLiAqLworCisjaWZkZWYgQ0tfUkVESVIKK2ludAordHRydW5jbWQocykgY2hhciAqczsgeworICAgIFBJRF9UIHBpZDsJCQkJLyogcGlkIG9mIGxvd2VyIGZvcmsgKi8KKyAgICBpbnQgd3N0YXQ7CQkJCS8qIGZvciB3YWl0KCkgKi8KKyAgICBpbnQgeDsKKyAgICBpbnQgc3RhdHVzcDsKKworICAgIGlmICh0dHlmZCA9PSAtMSkgeworCXByaW50ZigiP1NvcnJ5LCBkZXZpY2UgaXMgbm90IG9wZW5cbiIpOworCXJldHVybigwKTsKKyAgICB9CisgICAgaWYgKG5vcHVzaCkgeworCWRlYnVnKEYxMDAsInR0cnVuY21kIGZhaWw6IG5vcHVzaCIsIiIsMCk7CisJcmV0dXJuKDApOworICAgIH0KKyAgICBjb25yZXMoKTsJCQkJLyogTWFrZSBjb25zb2xlIG5vcm1hbCAgKi8KKyAgICBwZXhpdHN0YXQgPSAtNDsKKyAgICBpZiAoKHBpZCA9IGZvcmsoKSkgPT0gMCkgewkJLyogTWFrZSBhIGNoaWxkIGZvcmsgKi8KKwlpZiAocHJpdl9jYW4oKSkJCQkvKiBDaGlsZDogdHVybiBvZmYgcHJpdnMuICovCisJICBleGl0KDEpOworCWR1cDIodHR5ZmQsIDApOwkJCS8qIEdpdmUgc3RkaW4vb3V0IHRvIHRoZSBsaW5lICovCisJZHVwMih0dHlmZCwgMSk7CisJeCA9IHN5c3RlbShzKTsKKwlkZWJ1ZyhGMTAxLCJ0dHJ1bmNtZCBzeXN0ZW0iLHMseCk7CisJX2V4aXQoeCA/IEJBRF9FWElUIDogMCk7CisgICAgfSBlbHNlIHsKKwlTSUdUWVAgKCppc3RhdCkoKSwgKCpxc3RhdCkoKTsKKwlpZiAocGlkID09IChQSURfVCkgLTEpCQkvKiBmb3JrKCkgZmFpbGVkPyAqLworCSAgcmV0dXJuKDApOworCWlzdGF0ID0gc2lnbmFsKFNJR0lOVCxTSUdfSUdOKTsgLyogTGV0IHRoZSBmb3JrIGhhbmRsZSBrZXlib2FyZCAqLworCXFzdGF0ID0gc2lnbmFsKFNJR1FVSVQsU0lHX0lHTik7IC8qIGludGVycnVwdHMgaXRzZWxmLi4uICovCisKKyNpZmRlZiBDT01NRU5UCisgICAgCXdoaWxlICgoKHdzdGF0ID0gd2FpdCgmc3RhdHVzcCkpICE9IHBpZCkgJiYgKHdzdGF0ICE9IC0xKSkgOworI2Vsc2UgIC8qIE5vdCBDT01NRU5UICovCisgICAgCXdoaWxlICgxKSB7CisJICAgIHdzdGF0ID0gd2FpdCgmc3RhdHVzcCk7CisJICAgIGRlYnVnKEYxMDEsInR0cnVuY21kIHdhaXQiLCIiLHdzdGF0KTsKKwkgICAgaWYgKHdzdGF0ID09IHBpZCB8fCB3c3RhdCA9PSAtMSkKKwkgICAgICBicmVhazsKKwl9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisJcGV4aXRzdGF0ID0gKHN0YXR1c3AgJiAweGZmKSA/IHN0YXR1c3AgOiBzdGF0dXNwID4+IDg7CisJZGVidWcoRjEwMSwidHRydW5jbWQgd2FpdCBzdGF0dXNwIiwiIixzdGF0dXNwKTsKKwlkZWJ1ZyhGMTAxLCJ0dHJ1bmNtZCB3YWl0IHBleGl0c3RhdCIsIiIscGV4aXRzdGF0KTsKKwlzaWduYWwoU0lHSU5ULGlzdGF0KTsJCS8qIFJlc3RvcmUgaW50ZXJydXB0cyAqLworCXNpZ25hbChTSUdRVUlULHFzdGF0KTsKKyAgICB9CisgICAgY29uY2IoKGNoYXIpZXNjY2hyKTsJCS8qIFJlc3RvcmUgY29uc29sZSB0byBDQlJFQUsgbW9kZSAqLworICAgIHJldHVybihzdGF0dXNwID09IDAgPyAxIDogMCk7Cit9CisjZW5kaWYgLyogQ0tfUkVESVIgKi8KKworc3RydWN0IHRtICoKKyNpZmRlZiBDS19BTlNJQworY21kYXRlMnRtKGNoYXIgKiBkYXRlLCBpbnQgZ210KSAgICAgICAgIC8qIGRhdGUgYXMgInl5eXltbWRkIGhoOm1tOnNzIiAqLworI2Vsc2UKK2NtZGF0ZTJ0bShkYXRlLGdtdCkgY2hhciAqIGRhdGU7IGludCBnbXQ7CisjZW5kaWYKK3sKKyAgICAvKiBkYXRlIGFzICJ5eXl5bW1kZCBoaDptbTpzcyIgKi8KKyAgICBzdGF0aWMgc3RydWN0IHRtIF90bTsKKyAgICB0aW1lX3Qgbm93OworCisgICAgaWYgKHN0cmxlbihkYXRlKSAhPSAxNyB8fAorCWRhdGVbOF0gIT0gJyAnIHx8CisJZGF0ZVsxMV0gIT0gJzonIHx8CisJZGF0ZVsxNF0gIT0gJzonKQorICAgICAgcmV0dXJuKE5VTEwpOworCisgICAgdGltZSgmbm93KTsKKyAgICBpZiAoZ210KQorICAgICAgX3RtID0gKmdtdGltZSgmbm93KTsKKyAgICBlbHNlCisgICAgICBfdG0gPSAqbG9jYWx0aW1lKCZub3cpOworICAgIF90bS50bV95ZWFyID0gKGRhdGVbMF0tJzAnKSoxMDAwICsgKGRhdGVbMV0tJzAnKSoxMDAgKworICAgICAgICAgICAgICAgICAgKGRhdGVbMl0tJzAnKSoxMCAgICsgKGRhdGVbM10tJzAnKS0xOTAwOworICAgIF90bS50bV9tb24gID0gKGRhdGVbNF0tJzAnKSoxMCAgICsgKGRhdGVbNV0tJzAnKS0xOworICAgIF90bS50bV9tZGF5ID0gKGRhdGVbNl0tJzAnKSoxMCAgICsgKGRhdGVbN10tJzAnKTsKKyAgICBfdG0udG1faG91ciA9IChkYXRlWzldLScwJykqMTAgICArIChkYXRlWzEwXS0nMCcpOworICAgIF90bS50bV9taW4gID0gKGRhdGVbMTJdLScwJykqMTAgICsgKGRhdGVbMTNdLScwJyk7CisgICAgX3RtLnRtX3NlYyAgPSAoZGF0ZVsxNV0tJzAnKSoxMCAgKyAoZGF0ZVsxNl0tJzAnKTsKKworICAgIC8qIFNob3VsZCB3ZSBzZXQgX3RtLnRtX2lzZHN0IHRvIC0xIGhlcmU/ICovCisKKyAgICBfdG0udG1fd2RheSA9IDA7CisgICAgX3RtLnRtX3lkYXkgPSAwOworCisgICAgcmV0dXJuKCZfdG0pOworfQorCisjaWZkZWYgT1hPUworI3VuZGVmIGtpbGwKKyNlbmRpZiAvKiBPWE9TICovCisKKyNpZmRlZiBPWE9TCitpbnQKK3ByaXZfa2lsbChwaWQsIHNpZykgaW50IHBpZCwgc2lnOyB7CisgICAgaW50CWk7CisKKyAgICBpZiAocHJpdl9vbigpKQorCWRlYnVnKEYxMDAsInByaXZfa2lsbCBwcml2X29uIGZhaWxlZCIsIiIsMCk7CisgICAgaSA9IGtpbGwocGlkLCBzaWcpOworICAgIGlmIChwcml2X29mZigpKQorCWRlYnVnKEYxMDAsInByaXZfa2lsbCBwcml2X29mZiBmYWlsZWQiLCIiLDApOworICAgIHJldHVybihpKTsKK30KKyNlbmRpZiAvKiBPWE9TICovCisKKyNpZmRlZiBCRU9TT1JCRUJPWAorLyogI2lmZGVmIEJFX0RSXzcgKi8KKy8qCisgIGFsYXJtKCkgZnVuY3Rpb24gbm90IHN1cHBsaWVkIHdpdGggQmUgT1MgRFI3IC0gdGhpcyBvbmUgY29udHJpYnV0ZWQgYnkKKyAgTmVhbCBQLiBNdXJwaHkuCisqLworCisvKgorICBUaGlzIHNob3VsZCBtaW1pYyB0aGUgVU5JWC9QT1NJWCBhbGFybSgpIGZ1bmN0aW9uIHdlbGwgZW5vdWdoLCB3aXRoIHRoZQorICBjYXZlYXQgdGhhdCBvbmUncyBTSUdBTFJNIGhhbmRsZXIgbXVzdCBjYWxsIGFsYXJtX2V4cGlyZWQoKSB0byBjbGVhbiB1cCB2YXJzCisgIGFuZCB3YWl0IGZvciB0aGUgYWxhcm0gdGhyZWFkIHRvIGZpbmlzaC4KKyovCit1bnNpZ25lZCBpbnQKK2FsYXJtKHVuc2lnbmVkIGludCBzZWNvbmRzKSB7CisgICAgbG9uZyB0aW1lX2xlZnQgPSAwOworCisvKiBJZiBhbiBhbGFybSBpcyBhY3RpdmUsIHR1cm4gaXQgb2ZmLCBzYXZpbmcgdGhlIHVudXNlZCB0aW1lICovCisgICAgaWYgKGFsYXJtX3RocmVhZCAhPSAtMSkgeworICAgICAgICAvKiBXZSdsbCBiZSBnZW5lcm91cyBhbmQgY291bnQgcGFydGlhbCBzZWNvbmRzIGFzIHdob2xlIHNlY29uZHMuICovCisgICAgICAgIHRpbWVfbGVmdCA9IGFsYXJtX3N0cnVjdC50aW1lIC0KKwkgICgoc3lzdGVtX3RpbWUoKSAtIHRpbWVfc3RhcnRlZCkgLyAxMDAwMDAwLjApOworCisgICAgICAgIC8qIEtpbGwgdGhlIGFsYXJtIHRocmVhZCAqLworICAgICAgICBraWxsX3RocmVhZCAoYWxhcm1fdGhyZWFkKTsKKworICAgICAgICAvKiBXZSBuZWVkIHRvIGNsZWFuIHVwIGFzIHRob3VnaCB0aGUgYWxhcm0gb2NjdXJlZC4gKi8KKyAgICAgICAgdGltZV9zdGFydGVkID0gMDsKKyAgICAgICAgYWxhcm1fc3RydWN0LnRocmVhZCA9IC0xOworICAgICAgICBhbGFybV9zdHJ1Y3QudGltZSA9IDA7CisgICAgICAgIGFsYXJtX2V4cGlyZWQoKTsKKyAgICB9CisKKy8qIFNldCBhIG5ldyBhbGFybSBjbG9jaywgaWYgcmVxdWVzdGVkLiAqLworICAgIGlmIChzZWNvbmRzID4gMCkgeworICAgICAgICBhbGFybV9zdHJ1Y3QudGhyZWFkID0gZmluZF90aHJlYWQoTlVMTCk7CisgICAgICAgIGFsYXJtX3N0cnVjdC50aW1lID0gc2Vjb25kczsKKyAgICAgICAgdGltZV9zdGFydGVkID0gc3lzdGVtX3RpbWUoKTsKKyAgICAgICAgYWxhcm1fdGhyZWFkID0gc3Bhd25fdGhyZWFkIChkb19hbGFybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxhcm1fdGhyZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCX05PUk1BTF9QUklPUklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmYWxhcm1fc3RydWN0CisJCQkJICAgICApOworICAgICAgICByZXN1bWVfdGhyZWFkIChhbGFybV90aHJlYWQpOworICAgIH0KKworLyogTm93IHJldHVybiBbdW51c2VkIHRpbWUgfCAwXSAqLworICAgIHJldHVybiAoKHVuc2lnbmVkIGludCkgdGltZV9sZWZ0KTsKK30KKworLyoKKyAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgZGVwYXJ0dXJlIGZyb20gVU5JWC9QT1NJWCBhbGFybSBoYW5kbGluZy4gSW4gdGhlIGNhc2UKKyAgb2YgQmUncyBtaXNzaW5nIGFsYXJtKCkgZnVuY3Rpb24sIHRoaXMgc3R1ZmYgbmVlZHMgdG8gYmUgZG9uZSBpbiB0aGUgU0lHQUxSTQorICBoYW5kbGVyLiBXaGVuIEJlIGltcGxlbWVudHMgYWxhcm0oKSwgdGhpcyBmdW5jdGlvbiBjYWxsIGNhbiBiZSBlbGltaW5hdGVkCisgIGZyb20gdXNlcidzIFNJR0FMUk0gc2lnbmFsIGhhbmRsZXJzLgorKi8KKwordm9pZAorYWxhcm1fZXhwaXJlZCh2b2lkKSB7CisgICAgbG9uZyByZXRfdmFsOworCisgICAgaWYgKGFsYXJtX3RocmVhZCAhPSAtMSkgeworICAgICAgICB3YWl0X2Zvcl90aHJlYWQgKGFsYXJtX3RocmVhZCwgJnJldF92YWwpOworICAgICAgICBhbGFybV90aHJlYWQgPSAtMTsKKyAgICB9Cit9CisKKy8qCisgIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgc25vb3plcyB0aGUgcmVxdWlzaXRlIG51bWJlciBvZiBzZWNvbmRzIGFuZCB0aGVuCisgIFNJR0FMUk1zIHRoZSBjYWxsaW5nIHRocmVhZC4gTm90ZSB0aGF0IGtpbGwoKSB3YW50cyBhIHBpZF90IGFyZywgd2hpbHN0IEJlCisgIHVzZXMgdGhyZWFkX2lkOyBjdXJyZW50bHkgdGhleSBhcmUgYm90aCB0eXBkZWYnZWQgYXMgbG9uZywgYnV0IEknbGwgZG8gdGhlCisgIGNhc3QgYW55d2F5LiBUaGlzIGZ1bmN0aW9uIGlzIHJ1biBpbiBhIHNlcGFyYXRlIHRocmVhZC4KKyovCisKK2xvbmcKK2RvX2FsYXJtICh2b2lkICphbGFybV9zdHJ1Y3QpIHsKKyAgICBzbm9vemUgKChkb3VibGUpICgoc3RydWN0IEFMQVJNX1NUUlVDVCAqKSBhbGFybV9zdHJ1Y3QpLT50aW1lICogMTAwMDAwMC4wKTsKKyAgICBraWxsICgocGlkX3QpKChzdHJ1Y3QgQUxBUk1fU1RSVUNUICopIGFsYXJtX3N0cnVjdCktPnRocmVhZCwgU0lHQUxSTSk7CisgICAgdGltZV9zdGFydGVkID0gMDsKKyAgICAoKHN0cnVjdCBBTEFSTV9TVFJVQ1QgKikgYWxhcm1fc3RydWN0KS0+dGhyZWFkID0gLTE7CisgICAgKChzdHJ1Y3QgQUxBUk1fU1RSVUNUICopIGFsYXJtX3N0cnVjdCktPnRpbWUgPSAwOworfQorLyogI2VuZGlmICovIC8qIEJFX0RSXzcgKi8KKyNlbmRpZiAvKiBCRU9TT1JCRUJPWCAqLworCisjaWZkZWYgUGxhbjkKKworaW50CitwOXR0eWN0bChjaGFyIGxldHRlciwgaW50IG51bSwgaW50IHBhcmFtKSB7CisgICAgY2hhciBjbWRbMjBdOworICAgIGludCBsZW47CisKKyAgICBpZiAodHR5Y3RsZmQgPCAwKQorICAgICAgcmV0dXJuIC0xOworCisgICAgY21kWzBdID0gbGV0dGVyOworICAgIGlmIChudW0pCisgICAgICBsZW4gPSBzcHJpbnRmKGNtZCArIDEsICIlZCIsIHBhcmFtKSArIDE7CisgICAgZWxzZSB7CisJY21kWzFdID0gcGFyYW07CisJbGVuID0gMjsKKyAgICB9CisgICAgaWYgKHdyaXRlKHR0eWN0bGZkLCBjbWQsIGxlbikgPT0gbGVuKSB7CisJY21kW2xlbl0gPSAwOworCS8qIGZwcmludGYoc3Rkb3V0LCAid3JvdGUgJyVzJ1xuIiwgY21kKTsgKi8KKwlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitpbnQKK3A5dHR5cGFyaXR5KGNoYXIgbCkgeworICAgIHJldHVybiBwOXR0eWN0bCgncCcsIDAsIGwpOworfQorCitpbnQKK3A5dHRoZmxvdyhpbnQgZmxvdywgaW50IHN0YXR1cykgeworICAgIHJldHVybiBwOXR0eWN0bCgnbScsIDEsIHN0YXR1cyk7Cit9CisKK2ludAorcDl0dHNzcGQoaW50IGNwcykgeworICAgIGlmIChwOXR0eWN0bCgnYicsIDEsIGNwcyAqIDEwKSA8IDApCisgICAgICByZXR1cm4gLTE7CisgICAgdHR5bGFzdHNwZWVkID0gY3BzICogMTA7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorcDlvcGVudHR5Y3RsKGNoYXIgKnR0bmFtZSkgeworICAgIGNoYXIgbmFtZVsxMDBdOworCisgICAgaWYgKHR0eWN0bGZkID49IDApIHsKKwljbG9zZSh0dHljdGxmZCk7CisJdHR5Y3RsZmQgPSAtMTsKKwl0dHlsYXN0c3BlZWQgPSAtMTsKKyAgICB9CisgICAgc3ByaW50ZihuYW1lLCAiJXNjdGwiLCB0dG5hbWUpOworICAgIHR0eWN0bGZkID0gb3BlbihuYW1lLCAxKTsKKyAgICByZXR1cm4gdHR5Y3RsZmQ7Cit9CisKK2ludAorcDljb25jYigpIHsKKyAgICBpZiAoY29uc2N0bGZkID49IDApIHsKKwlpZiAod3JpdGUoY29uc2N0bGZkLCAicmF3b24iLCA1KSA9PSA1KQorCSAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworaW50CitwOWNvbmJpbigpIHsKKyAgICByZXR1cm4gcDljb25jYigpOworfQorCitpbnQKK3A5Y29ucmVzKCkgeworICAgIGlmIChjb25zY3RsZmQgPj0gMCkgeworCWlmICh3cml0ZShjb25zY3RsZmQsICJyYXdvZmYiLCA2KSA9PSA2KQorCSAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworaW50CitwOXNuZGJyayhpbnQgbXNlYykgeworICAgIGlmICh0dHljdGxmZCA+PSAwKSB7CisJY2hhciBjbWRbMjBdOworCWludCBpID0gc3ByaW50ZihjbWQsICJrJWQiLCBtc2VjKTsKKwlpZiAod3JpdGUodHR5Y3RsZmQsIGNtZCwgaSkgPT0gaSkKKwkgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK2ludAorY29ud3JpdGUoY2hhciAqYnVmLCBpbnQgbikgeworICAgIGludCB4OworICAgIHN0YXRpYyBpbnQgbGVuZ3RoID0gMDsKKyAgICBzdGF0aWMgaW50IGhvbGRpbmdjciA9IDA7CisgICAgaW50IG5vcm1hbCA9IDA7CisgICAgZm9yICh4ID0gMDsgeCA8IG47IHgrKykgeworCWNoYXIgYyA9IGJ1Zlt4XTsKKwlpZiAoYyA9PSAwMDcpIHsKKwkgICAgaWYgKG5vcm1hbCkgeworCQl3cml0ZSgxLCBidWYgKyAoeCAtIG5vcm1hbCksIG5vcm1hbCk7CisJCWxlbmd0aCArPSBub3JtYWw7CisJCW5vcm1hbCA9IDA7CisJICAgIH0KKwkgICAgLyogd3JpdGUobm9pc2VmZCwgIjEwMDAgMzAwIiwgOCk7ICovCisJICAgIGhvbGRpbmdjciA9IDA7CisJfSBlbHNlIGlmIChjID09ICdccicpIHsKKwkgICAgaWYgKG5vcm1hbCkgeworCQl3cml0ZSgxLCBidWYgKyAoeCAtIG5vcm1hbCksIG5vcm1hbCk7CisJCWxlbmd0aCArPSBub3JtYWw7CisJCW5vcm1hbCA9IDA7CisJICAgIH0KKwkgICAgaG9sZGluZ2NyID0gMTsKKwl9IGVsc2UgaWYgKGMgPT0gJ1xuJykgeworCSAgICB3cml0ZSgxLCBidWYgKyAoeCAtIG5vcm1hbCksIG5vcm1hbCArIDEpOworCSAgICBub3JtYWwgPSAwOworCSAgICBsZW5ndGggPSAwOworCSAgICBob2xkaW5nY3IgPSAwOworCX0gZWxzZSBpZiAoYyA9PSAnXGInKSB7CisJICAgIGlmIChub3JtYWwpIHsKKwkJd3JpdGUoMSwgYnVmICsgKHggLSBub3JtYWwpLCBub3JtYWwpOworCQlsZW5ndGggKz0gbm9ybWFsOworCQlub3JtYWwgPSAwOworCSAgICB9CisJICAgIGlmIChsZW5ndGgpIHsKKwkJd3JpdGUoMSwgJmMsIDEpOworCQlsZW5ndGgtLTsKKwkgICAgfQorCSAgICBob2xkaW5nY3IgPSAwOworCX0gZWxzZSB7CisJICAgIGlmIChob2xkaW5nY3IpIHsKKwkJY2hhciBiID0gJ1xiJzsKKwkJd2hpbGUgKGxlbmd0aC0tID4gMCkKKwkJICB3cml0ZSgxLCAmYiwgMSk7CisJCWxlbmd0aCA9IDA7CS8qIGNvbXBpbGVyIGJ1ZyAqLworCSAgICB9CisJICAgIGhvbGRpbmdjciA9IDA7CisJICAgIG5vcm1hbCsrOworCX0KKyAgICB9CisgICAgaWYgKG5vcm1hbCkgeworCXdyaXRlKDEsIGJ1ZiArICh4IC0gbm9ybWFsKSwgbm9ybWFsKTsKKwlsZW5ndGggKz0gbm9ybWFsOworICAgIH0KKyAgICByZXR1cm4gbjsKK30KKwordm9pZAorY29ucHJpbnQoY2hhciAqZm10LCAuLi4pIHsKKyAgICBzdGF0aWMgY2hhciBidWZbMTAwMF07CQkvKiBub3Qgc2FmZSBpZiBvbiB0aGUgc3RhY2sgKi8KKworICAgIHZhX2xpc3QgYXA7CisgICAgaW50IGk7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBpID0gdnNwcmludGYoYnVmLCBmbXQsIGFwKTsKKyAgICBjb253cml0ZShidWYsIGkpOworfQorI2VuZGlmIC8qIFBsYW45ICovCisKKy8qIGZwcmludGYsIHByaW50ZiwgcGVycm9yIHJlcGxhY2VtZW50cy4uLiAqLworCisvKiBmIHAgciBpIG4gdCBmICovCisKKyNpZmRlZiBVTklYCisjaWZkZWYgQ0tfQU5TSUMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlIC8qIENLX0FOU0lDICovCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmIC8qIENLX0FOU0lDICovCisjaWZkZWYgZnByaW50ZgorI3VuZGVmIGZwcmludGYKK3N0YXRpYyBjaGFyIHN0cjFbNDA5Nl07CitzdGF0aWMgY2hhciBzdHIyWzQwOTZdOworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2NreGZwcmludGYoRklMRSAqIGZpbGUsIGNvbnN0IGNoYXIgKiBmb3JtYXQsIC4uLikKKyNlbHNlIC8qIENLX0FOU0lDICovCitja3hmcHJpbnRmKHZhX2FsaXN0KSB2YV9kY2wKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogY2t4ZnByaW50ZiAqLyB7CisgICAgaW50IGksIGosIGxlbiwgZ290X2NyOworICAgIHZhX2xpc3QgYXJnczsKKyAgICBpbnQgcmMgPSAwOworCisjaWZkZWYgQ0tfQU5TSUMKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworI2Vsc2UgLyogQ0tfQU5TSUMgKi8KKyAgICBjaGFyICogZm9ybWF0OworICAgIEZJTEUgKiBmaWxlOworICAgIHZhX3N0YXJ0KGFyZ3MpOworICAgIGZpbGUgPSB2YV9hcmcoYXJncyxGSUxFICopOworICAgIGZvcm1hdCA9IHZhX2FyZyhhcmdzLGNoYXIgKik7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKworICAgIGlmICghaW5zZXJ2ZXIgfHwgKGZpbGUgIT0gc3Rkb3V0ICYmIGZpbGUgIT0gc3RkZXJyICYmIGZpbGUgIT0gc3RkaW4pKSB7CisJcmMgPSB2ZnByaW50ZihmaWxlLGZvcm1hdCxhcmdzKTsKKyAgICB9IGVsc2UgeworCXVuc2lnbmVkIGludCBjOworICAgICAgICByYyA9IHZzcHJpbnRmKHN0cjEsIGZvcm1hdCwgYXJncyk7CisgICAgICAgIGxlbiA9IHN0cmxlbihzdHIxKTsKKyAgICAgICAgaWYgKGxlbiA+PSBzaXplb2Yoc3RyMSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImNreGZwcmludGYoKSBidWZmZXIgb3ZlcmZsb3ciLCIiLGxlbik7CisgICAgICAgICAgICBkb2V4aXQoQkFEX0VYSVQsMSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMCwgaiA9IDAsIGdvdF9jciA9IDA7CisJICAgICBpIDwgbGVuICYmIGogPCBzaXplb2Yoc3RyMSktMjsKKwkgICAgIGkrKywgaisrICkgeworCSAgICAvKiBXZSBjYW4ndCB1c2UgMjU1IGFzIGEgY2FzZSBsYWJlbCBiZWNhdXNlIG9mIHNpZ25lZCBjaGFycyAqLworCSAgICBjID0gKHVuc2lnbmVkKShzdHIxW2ldICYgMHhmZik7CisjaWZkZWYgVE5DT0RFCisJICAgIGlmIChjID09IDI1NSkgeworCQlpZiAoZ290X2NyICYmICFURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkpCisJCSAgc3RyMltqKytdID0gJ1wwJzsKKwkJc3RyMltqKytdID0gSUFDOworCQlzdHIyW2pdID0gSUFDOworCQlnb3RfY3IgPSAwOworCSAgICB9IGVsc2UKKyNlbmRpZiAvKiBUTkNPREUgKi8KKwkgICAgc3dpdGNoIChjKSB7CisJICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgIGlmIChnb3RfY3IKKyNpZmRlZiBUTkNPREUKKwkJICAgICYmICFURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkKKyNlbmRpZiAvKiBUTkNPREUgKi8KKwkJICAgICkKKwkJICBzdHIyW2orK10gPSAnXDAnOworICAgICAgICAgICAgICAgIHN0cjJbal0gPSBzdHIxW2ldOworICAgICAgICAgICAgICAgIGdvdF9jciA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisJICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgIGlmICghZ290X2NyKQorCQkgIHN0cjJbaisrXSA9ICdccic7CisgICAgICAgICAgICAgICAgc3RyMltqXSA9IHN0cjFbaV07CisgICAgICAgICAgICAgICAgZ290X2NyID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKwkgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChnb3RfY3IKKyNpZmRlZiBUTkNPREUKKwkJICAgICYmICFURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkKKyNlbmRpZiAvKiBUTkNPREUgKi8KKwkJICAgICkKKwkJICBzdHIyW2orK10gPSAnXDAnOworICAgICAgICAgICAgICAgIHN0cjJbal0gPSBzdHIxW2ldOworICAgICAgICAgICAgICAgIGdvdF9jciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdvdF9jcgorI2lmZGVmIFROQ09ERQorICAgICAgICAgICAgICYmICFURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICAgICAgICAgICApCisgICAgICAgICAgICBzdHIyW2orK10gPSAnXDAnOworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyNpZmRlZiBUTkNPREUKKyAgICAgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfRU5DUllQVElPTikpCisJICBja190bl9lbmNyeXB0KHN0cjIsaik7CisjZW5kaWYgLyogVE5DT0RFICovCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmIENLX1NTTAorCWlmIChpbnNlcnZlciAmJiAoc3NsX2FjdGl2ZV9mbGFnIHx8IHRsc19hY3RpdmVfZmxhZykpIHsKKwkgICAgLyogV3JpdGUgdXNpbmcgU1NMICovCisgICAgICAgICAgICBjaGFyICogcCA9IHN0cjI7CisgICAgICAgICAgc3NsX3JldHJ5OgorICAgICAgICAgICAgaWYgKHNzbF9hY3RpdmVfZmxhZykKKwkgICAgICByYyA9IFNTTF93cml0ZShzc2xfY29uLCBwLCBqKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgICByYyA9IFNTTF93cml0ZSh0bHNfY29uLCBwLCBqKTsKKwkgICAgZGVidWcoRjExMSwiY2t4ZnByaW50ZiIsIlNTTF93cml0ZSIscmMpOworICAgICAgICAgICAgc3dpdGNoIChTU0xfZ2V0X2Vycm9yKHNzbF9hY3RpdmVfZmxhZz9zc2xfY29uOnRsc19jb24scmMpKSB7CisJICAgICAgY2FzZSBTU0xfRVJST1JfTk9ORToKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gaikKKwkJICBicmVhazsKKyAgICAgICAgICAgICAgICBwICs9IHJjOworICAgICAgICAgICAgICAgIGogLT0gcmM7CisgICAgICAgICAgICAgICAgZ290byBzc2xfcmV0cnk7CisJICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKwkgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisJICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gMCkKKwkJICByZXR1cm4oLTEpOworCSAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisJICAgICAgY2FzZSBTU0xfRVJST1JfU1NMOgorCSAgICAgIGNhc2UgU1NMX0VSUk9SX1pFUk9fUkVUVVJOOgorCSAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgfQorCX0gZWxzZQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICBmd3JpdGUoc3RyMixzaXplb2YoY2hhciksaixzdGRvdXQpOworICAgIH0KKyAgICB2YV9lbmQoYXJncyk7CisgICAgcmV0dXJuKHJjKTsKK30KKyNlbmRpZiAvKiBmcHJpbnRmICovCisKKy8qIHAgciBpIG4gdCBmICovCisKKyNpZmRlZiBwcmludGYKKyN1bmRlZiBwcmludGYKK2ludAorI2lmZGVmIENLX0FOU0lDCitja3hwcmludGYoY29uc3QgY2hhciAqIGZvcm1hdCwgLi4uKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2NreHByaW50Zih2YV9hbGlzdCkgdmFfZGNsCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGNreHByaW50ZiAqLyB7CisgICAgaW50IGksIGosIGxlbiwgZ290X2NyOworICAgIHZhX2xpc3QgYXJnczsKKyAgICBpbnQgcmMgPSAwOworCisjaWZkZWYgQ0tfQU5TSUMKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworI2Vsc2UgLyogQ0tfQU5TSUMgKi8KKyAgICBjaGFyICogZm9ybWF0OworICAgIHZhX3N0YXJ0KGFyZ3MpOworICAgIGZvcm1hdCA9IHZhX2FyZyhhcmdzLGNoYXIgKik7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKworICAgIGlmICghaW5zZXJ2ZXIpIHsKKwlyYyA9IHZwcmludGYoZm9ybWF0LCBhcmdzKTsKKyAgICB9IGVsc2UgeworCXVuc2lnbmVkIGludCBjOworICAgICAgICByYyA9IHZzcHJpbnRmKHN0cjEsIGZvcm1hdCwgYXJncyk7CisgICAgICAgIGxlbiA9IHN0cmxlbihzdHIxKTsKKyAgICAgICAgaWYgKGxlbiA+PSBzaXplb2Yoc3RyMSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImNreHByaW50ZigpIGJ1ZmZlciBvdmVyZmxvdyIsIiIsbGVuKTsKKyAgICAgICAgICAgIGRvZXhpdChCQURfRVhJVCwxKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwLCBqID0gMCwgZ290X2NyPTA7CisJICAgICBpIDwgbGVuICYmIGogPCBzaXplb2Yoc3RyMSktMjsKKwkgICAgIGkrKywgaisrICkgeworCSAgICBjID0gKHVuc2lnbmVkKShzdHIxW2ldICYgMHhmZik7CisjaWZkZWYgVE5DT0RFCisJICAgIGlmIChjID09IDI1NSkgeworCQlpZiAoZ290X2NyICYmICFURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkpCisJCSAgc3RyMltqKytdID0gJ1wwJzsKKwkJc3RyMltqKytdID0gSUFDOworCQlzdHIyW2pdID0gSUFDOworCQlnb3RfY3IgPSAwOworCSAgICB9IGVsc2UKKyNlbmRpZiAvKiBUTkNPREUgKi8KKwkgICAgc3dpdGNoIChjKSB7CisJICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgIGlmIChnb3RfY3IKKyNpZmRlZiBUTkNPREUKKwkJICAgICYmICFURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkKKyNlbmRpZiAvKiBUTkNPREUgKi8KKwkJICAgICkKKwkJICBzdHIyW2orK10gPSAnXDAnOworICAgICAgICAgICAgICAgIHN0cjJbal0gPSBzdHIxW2ldOworICAgICAgICAgICAgICAgIGdvdF9jciA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisJICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgIGlmICghZ290X2NyKQorCQkgIHN0cjJbaisrXSA9ICdccic7CisgICAgICAgICAgICAgICAgc3RyMltqXSA9IHN0cjFbaV07CisgICAgICAgICAgICAgICAgZ290X2NyID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKwkgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChnb3RfY3IKKyNpZmRlZiBUTkNPREUKKwkJICAgICYmICFURUxPUFRfTUUoVEVMT1BUX0JJTkFSWSkKKyNlbmRpZiAvKiBUTkNPREUgKi8KKwkJICAgICkKKwkJICBzdHIyW2orK10gPSAnXDAnOworICAgICAgICAgICAgICAgIHN0cjJbal0gPSBzdHIxW2ldOworICAgICAgICAgICAgICAgIGdvdF9jciA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisJICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZ290X2NyCisjaWZkZWYgVE5DT0RFCisgICAgICAgICAgICAgJiYgIVRFTE9QVF9NRShURUxPUFRfQklOQVJZKQorI2VuZGlmIC8qIFROQ09ERSAqLworICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHN0cjJbaisrXSA9ICdcMCc7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorI2lmZGVmIFROQ09ERQorICAgICAgICBpZiAoVEVMT1BUX01FKFRFTE9QVF9FTkNSWVBUSU9OKSkKKwkgIGNrX3RuX2VuY3J5cHQoc3RyMixqKTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjaWZkZWYgQ0tfU1NMCisJaWYgKGluc2VydmVyICYmIChzc2xfYWN0aXZlX2ZsYWcgfHwgdGxzX2FjdGl2ZV9mbGFnKSkgeworICAgICAgICAgICAgY2hhciAqIHAgPSBzdHIyOworCSAgICAvKiBXcml0ZSB1c2luZyBTU0wgKi8KKyAgICAgICAgICBzc2xfcmV0cnk6CisgICAgICAgICAgICBpZiAoc3NsX2FjdGl2ZV9mbGFnKQorCSAgICAgIHJjID0gU1NMX3dyaXRlKHNzbF9jb24sIHAsIGopOworICAgICAgICAgICAgZWxzZQorCSAgICAgIHJjID0gU1NMX3dyaXRlKHRsc19jb24sIHAsIGopOworCSAgICBkZWJ1ZyhGMTExLCJja3hwcmludGYiLCJTU0xfd3JpdGUiLHJjKTsKKyAgICAgICAgICAgIHN3aXRjaCAoU1NMX2dldF9lcnJvcihzc2xfYWN0aXZlX2ZsYWc/c3NsX2Nvbjp0bHNfY29uLHJjKSkgeworCSAgICAgIGNhc2UgU1NMX0VSUk9SX05PTkU6CisgICAgICAgICAgICAgICAgaWYgKHJjID09IGopCisJCSAgYnJlYWs7CisgICAgICAgICAgICAgICAgcCArPSByYzsKKyAgICAgICAgICAgICAgICBqIC09IHJjOworICAgICAgICAgICAgICAgIGdvdG8gc3NsX3JldHJ5OworCSAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisJICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorCSAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IDApCisJCSAgcmV0dXJuKC0xKTsKKwkgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQOgorCSAgICAgIGNhc2UgU1NMX0VSUk9SX1NTTDoKKwkgICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKwkgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgIH0KKwl9IGVsc2UKKyNlbmRpZiAvKiBDS19TU0wgKi8KKwkgIHJjID0gZndyaXRlKHN0cjIsc2l6ZW9mKGNoYXIpLGosc3Rkb3V0KTsKKyAgICB9CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybihyYyk7Cit9CisjZW5kaWYgLyogcHJpbnRmICovCisKKy8qICBwIGUgciByIG8gciAgKi8KKworI2lmZGVmIHBlcnJvcgorI3VuZGVmIHBlcnJvcgorX1BST1RPVFlQKGNoYXIgKiBja19lcnJzdHIsKFZPSUQpKTsKKyNpZmRlZiBORVhUCit2b2lkCisjZWxzZQorI2lmZGVmIENLX1NDT1Y1Cit2b2lkCisjZWxzZQoraW50CisjZW5kaWYgLyogQ0tfU0NPVjUgKi8KKyNlbmRpZiAvKiBORVhUICovCisjaWZkZWYgQ0tfQU5TSUMKK2NreHBlcnJvcihjb25zdCBjaGFyICogc3RyKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2NreHBlcnJvcihzdHIpIGNoYXIgKiBzdHI7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGNreHBlcnJvciAqLyB7CisgICAgY2hhciAqIGVycnN0ciA9IGNrX2VycnN0cigpOworI2lmbmRlZiBORVhUCisjaWZuZGVmIENLX1NDT1Y1CisgICAgcmV0dXJuCisjZW5kaWYgLyogQ0tfU0NPVjUgKi8KKyNlbmRpZiAvKiBORVhUICovCisgICAgICBja3hwcmludGYoIiVzJXMgJXNcbiIsc3RyLCplcnJzdHI/IjoiOiIiLGVycnN0cik7Cit9CisjZW5kaWYgLyogcGVycm9yICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZkZWYgTUlOSVgyCisKKy8qIE1pbml4IGRvZXNuJ3QgaGF2ZSBhIGdldHRpbWVvZmRheSBjYWxsLiBXZSBmYWtlIG9uZSBoZXJlIHVzaW5nIHRpbWUoMikgKi8KKworaW50CitnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnRwLCBzdHJ1Y3QgdGltZXpvbmUgKnR6cCkgeworICAgIHRwLT50dl91c2VjID0gMEw7CQkJLyogQ2xvc2UgZW5vdWdoIGZvciBob3JzZXNob2VzICovCisgICAgaWYodGltZSgmKHRwLT50dl9zZWMpKT09LTEpCisgICAgICByZXR1cm4oLTEpOworICAgIHJldHVybigwKTsKK30KKworLyogTWluaXggZG9lcyBub3Qgc3VwcG9ydCBzeW1ib2xpYyBsaW5rcy4gV2UgaW1wbGVtZW50IGEgdmVyc2lvbiBvZgorICAgcmVhZGxpbmsgdGhhdCBhbHdheXMgZmFpbHMgKi8KKworaW50CityZWFkbGluayhjb25zdCBjaGFyICpwYXRoLCB2b2lkICpidWYsIHNpemVfdCBidWZzaXopIHsKKyAgICBlcnJubyA9IEVOT1NZUzsKKyAgICByZXR1cm4oLTEpOworfQorI2VuZGlmIC8qIE1JTklYMiAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdXR1dG9yLnR4dCBiL2NrZXJtaXQtOC4wLjIxMS9ja3V0dXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0ODEyNgotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja3V0dXRvci50eHQKQEAgLTAsMCArMSwxOTU5IEBACisKK0MtS0VSTUlUIDguMCBVTklYIE1BTlVBTCBQQUdFIEFORCBUVVRPUklBTAorCisgICAgIEZyYW5rIGRhIENydXosIENocmlzdGluZSBNLiBHaWFub25lCisgICAgIFsxXVRoZSBLZXJtaXQgUHJvamVjdCwgWzJdQ29sdW1iaWEgVW5pdmVyc2l0eQorICAgICAKKyAgIFsgWzNdUERGIHZlcnNpb24gXSBbIFs0XU5yb2ZmIHZlcnNpb24gXQorICAgCisgICAgIFRoaXMgZG9jdW1lbnQgaXMgaW50ZW5kZWQgdG8gZ2l2ZSB0aGUgYmVnaW5uZXIgc3VmZmljaWVudAorICAgICBpbmZvcm1hdGlvbiB0byBtYWtlIGJhc2ljIChpZiBub3QgYWR2YW5jZWQpIHVzZSBvZiBDLUtlcm1pdCA4LjAuCisgICAgIEFsdGhvdWdoIGl0IG1pZ2h0IGJlIHJhdGhlciBsb25nIGZvciBhIFVuaXggbWFudWFsIHBhZ2UgKGFib3V0IDE2MDAKKyAgICAgbGluZXMpLCBpdCdzIHN0aWxsIGZhciBzaG9ydGVyIHRoYW4gdGhlIEMtS2VybWl0IG1hbnVhbCwgd2hpY2gKKyAgICAgc2hvdWxkIGJlIGNvbnN1bHRlZCBmb3IgYWR2YW5jZWQgdG9waWNzIHN1Y2ggYXMgY3VzdG9taXphdGlvbiwKKyAgICAgY2hhcmFjdGVyLXNldHMsIHNjcmlwdGluZywgZXRjLiBXZSBhbHNvIGF0dGVtcHQgdG8gcHJvdmlkZSBhIGNsZWFyCisgICAgIHN0cnVjdHVyYWwgb3ZlcnZpZXcgb2YgQy1LZXJtaXQncyBtYW55IGNhcGFiaWxpdGllcywgZnVuY3Rpb25hbAorICAgICBhcmVhcywgc3RhdGVzLCBhbmQgbW9kZXMgYW5kIHRoZWlyIGludGVycmVsYXRpb24sIHRoYXQgc2hvdWxkIGJlCisgICAgIGhlbHBmdWwgdG8gYmVnaW5uZXJzIGFuZCB2ZXRlcmFucyBhbGlrZSwgYXMgd2VsbCBhcyB0byB0aG9zZQorICAgICB1cGdyYWRpbmcgdG8gdGhlIG5ldyByZWxlYXNlLiAKKyAgICAgCisgICBNb3N0IHJlY2VudCB1cGRhdGU6IDI0IE9jdG9iZXIgMjAwMgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAKKyAgQ09OVEVOVFMKKyAgICAgKiBbNV1ERVNDUklQVElPTgorICAgICAqIFs2XVNZTk9QU0lTCisgICAgICogWzddT1BUSU9OUworICAgICAqIFs4XUNPTU1BTkQgTEFOR1VBR0UKKyAgICAgKiBbOV1JTklUSUFMSVpBVElPTiBGSUxFCisgICAgICogWzEwXU1PREVTIE9GIE9QRVJBVElPTgorICAgICAqIFsxMV1NQUtJTkcgQ09OTkVDVElPTlMKKyAgICAgKiBbMTJdVFJBTlNGRVJSSU5HIEZJTEVTIFdJVEggS0VSTUlUCisgICAgICogWzEzXUtFUk1JVCBDTElFTlQvU0VSVkVSIENPTk5FQ1RJT05TCisgICAgICogWzE0XUtFUk1JVCdTIEJVSUxULUlOIEZUUCBBTkQgSFRUUCBDTElFTlRTCisgICAgICogWzE1XUlOVEVSTkVUIEtFUk1JVCBTRVJWSUNFCisgICAgICogWzE2XVNFQ1VSSVRZCisgICAgICogWzE3XUFMVEVSTkFUSVZFIENPTU1BTkQtTElORSBQRVJTT05BTElUSUVTCisgICAgICogWzE4XUxJQ0VOU0UKKyAgICAgKiBbMTldT1RIRVIgVE9QSUNTCisgICAgICogWzIwXURPQ1VNRU5UQVRJT04gQU5EIFVQREFURVMKKyAgICAgKiBbMjFdRklMRVMKKyAgICAgKiBbMjJdQVVUSE9SUworICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAgCisgICBERVNDUklQVElPTiBbIFsyM11Ub3AgXSBbIFsyNF1Db250ZW50cyBdIFsgWzI1XU5leHQgXQorICAgCisgICBbMjZdQy1LZXJtaXQgaXMgYW4gYWxsLXB1cnBvc2UgY29tbXVuaWNhdGlvbnMgc29mdHdhcmUgcGFja2FnZSBmcm9tCisgICB0aGUgWzI3XUtlcm1pdCBQcm9qZWN0IGF0IFsyOF1Db2x1bWJpYSBVbml2ZXJzaXR5IHRoYXQ6CisgICAKKyAgICAgKiBJcyBwb3J0YWJsZSB0byBtYW55IHBsYXRmb3JtcywgVW5peCBhbmQgbm9uLVVuaXggYWxpa2UuCisgICAgICogQ2FuIG1ha2UgYm90aCBzZXJpYWwgYW5kIG5ldHdvcmsgY29ubmVjdGlvbnMuCisgICAgICogQ2FuIGNvbmR1Y3QgaW50ZXJhY3RpdmUgdGVybWluYWwgc2Vzc2lvbnMgb3ZlciBpdHMgY29ubmVjdGlvbi4KKyAgICAgKiBDYW4gdHJhbnNmZXIgdGV4dCBvciBiaW5hcnkgZmlsZXMgb3ZlciB0aGUgc2FtZSBjb25uZWN0aW9uLgorICAgICAqIENhbiBjb252ZXJ0IHRleHQtZmlsZSBjaGFyYWN0ZXIgc2V0cyBpbiB0ZXJtaW5hbCBtb2RlIG9yIGZpbGUKKyAgICAgICB0cmFuc2Zlci4KKyAgICAgKiBJcyBjdXN0b21pemFibGUgaW4gZXZlcnkgYXNwZWN0IG9mIGl0cyBvcGVyYXRpb24uCisgICAgICAgCisgICBDLUtlcm1pdCBpcyBhIG1vZGVtIHByb2dyYW0sIGEgVGVsbmV0IGNsaWVudCwgYW4gUmxvZ2luIGNsaWVudCwgYW4gRlRQCisgICBjbGllbnQsIGFuIEhUVFAgY2xpZW50LCBhbmQgb24gc2VsZWN0ZWQgcGxhdGZvcm1zLCBhbHNvIGFuIFguMjUKKyAgIGNsaWVudC4gSXQgY2FuIG1ha2UgaXRzIG93biBzZWN1cmUgSW50ZXJuZXQgY29ubmVjdGlvbnMgdXNpbmcKKyAgIElFVEYtYXBwcm92ZWQgc2VjdXJpdHkgbWV0aG9kcyBpbmNsdWRpbmcgS2VyYmVyb3MgSVYsIEtlcmJlcm9zIFYsCisgICBTU0wvVExTLCBhbmQgU1JQIGFuZCBpdCBjYW4gYWxzbyBtYWtlIFNTSCAoU2VjdXJlIFNoZWxsKSBjb25uZWN0aW9ucworICAgdGhyb3VnaCB5b3VyIGV4dGVybmFsIFNTSCBjbGllbnQgYXBwbGljYXRpb24uIEl0IGNhbiBiZSB0aGUgZmFyLWVuZAorICAgZmlsZS10cmFuc2ZlciBvciBjbGllbnQvc2VydmVyIHBhcnRuZXIgb2YgeW91ciBkZXNrdG9wIEtlcm1pdCBjbGllbnQuCisgICBJdCBjYW4gYWxzbyBhY2NlcHQgaW5jb21pbmcgZGlhbGVkIGFuZCBuZXR3b3JrIGNvbm5lY3Rpb25zLiBJdCBjYW4KKyAgIGV2ZW4gYmUgaW5zdGFsbGVkIGFzIGFuIEludGVybmV0IHNlcnZpY2Ugb24gaXRzIG93biBzdGFuZGFyZCBUQ1AKKyAgIHNvY2tldCwgMTY0OSBbWzI5XVJGQzI4MzksIFszMF1SRkMyODQwXS4KKyAgIAorICAgQW5kIHBlcmhhcHMgbW9zdCBpbXBvcnRhbnQsIGV2ZXJ5dGhpbmcgeW91IGNhbiBkbyAiYnkgaGFuZCIKKyAgIChpbnRlcmFjdGl2ZWx5KSB3aXRoIEMtS2VybWl0LCBjYW4gYmUgInNjcmlwdGVkIiAoYXV0b21hdGVkKSB1c2luZyBpdHMKKyAgIGJ1aWx0LWluIGNyb3NzLXBsYXRmb3JtIHRyYW5zcG9ydC1pbmRlcGVuZGVudCBzY3JpcHQgcHJvZ3JhbW1pbmcKKyAgIGxhbmd1YWdlLCB3aGljaCBoYXBwZW5zIHRvIGJlIGlkZW50aWNhbCB0byBpdHMgaW50ZXJhY3RpdmUgY29tbWFuZAorICAgbGFuZ3VhZ2UuCisgICAKKyAgIFRoaXMgbWFudWFsIHBhZ2Ugb2ZmZXJzIGFuIG92ZXJ2aWV3IG9mIEMtS2VybWl0IDguMCBmb3IgVW5peCAoIlVuaXgiCisgICBpcyBhbiBvcGVyYXRpbmcgc3lzdGVtIGZhbWlseSB0aGF0IGluY2x1ZGVzIEFJWCwgREcvVVgsIEZyZWVCU0QsCisgICBIUC1VWCwgSVJJWCwgTGludXgsIE1hYyBPUyBYLCBOZXRCU0QsIE9wZW5CU0QsIE9wZW4gU2VydmVyLCBPcGVuIFVuaXgsCisgICBRTlgsIFNvbGFyaXMsIFN1bk9TLCBTeXN0ZW0gViBSMywgU3lzdGVtIFYgUjQsIFRydTY0IFVuaXgsIFVuaXh3YXJlLAorICAgWGVuaXgsIGFuZCBtYW55IG90aGVycykuIEZvciB0aG9yb3VnaCBjb3ZlcmFnZSwgcGxlYXNlIGNvbnN1bHQgdGhlCisgICBwdWJsaXNoZWQgQy1LZXJtaXQgbWFudWFsIGFuZCBzdXBwbGVtZW50cyAoc2VlIFszMV1ET0NVTUVOVEFUSU9OCisgICBiZWxvdykuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IEMtS2VybWl0LCBLZXJtaXQgc29mdHdhcmUgZm9yCisgICBvdGhlciBwbGF0Zm9ybXMsIGFuZCBLZXJtaXQgbWFudWFscywgdmlzaXQgdGhlIEtlcm1pdCBQcm9qZWN0IHdlYnNpdGU6CisgICAKKyAgWzMyXWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKworICAgVGhpcyBpcyBhIGxvbmdlci10aGFuLWF2ZXJhZ2UgbWFudWFsIHBhZ2UsIGFuZCB5ZXQgaXQgYmFyZWx5IHNjcmF0Y2hlcworICAgdGhlIHN1cmZhY2UuIERvbid0IGJlIGRhdW50ZWQuIEMtS2VybWl0IGlzIGEgbGFyZ2UgYW5kIGNvbXBsZXgKKyAgIHBhY2thZ2UsIGV2b2x2aW5nIG92ZXIgZGVjYWRlcyBvZiBwcmFjdGljZSBhbmQgZXhwZXJpZW5jZSwgYnV0IHRoYXQKKyAgIGRvZXNuJ3QgbWVhbiBpdCdzIGhhcmQgdG8gbGVhcm4gb3IgdXNlLiBJdHMgbW9zdCBjb21tb25seSB1c2VkCisgICBmdW5jdGlvbnMgYXJlIGV4cGxhaW5lZCBoZXJlIHdpdGggcG9pbnRlcnMgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgZWxzZXdoZXJlLgorICAgCisgICBbIFszM11LZXJtaXQgSG9tZSBdIFsgWzM0XUMtS2VybWl0IEhvbWUgXSBbIFszNV1DLUtlcm1pdCBGQVEgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAKKyAgU1lOT1BTSVMgWyBbMzZdVG9wIF0gWyBbMzddQ29udGVudHMgXSBbIFszOF1OZXh0IF0gWyBbMzldUHJldmlvdXMgXQorICAKKyAgIFVzYWdlOiAga2VybWl0IFtmaWxlbmFtZV0gWy14IGFyZyBbLXggYXJnXS4uLlsteXl5XS4uXSBbIHs9LC0tLCt9IHRleHQKKyAgIF0gXQorICAgT3I6ICAgIGtlcm1pdCBVUkwKKyAgIAorICAgICAqIC14IGlzIGFuIG9wdGlvbiByZXF1aXJpbmcgYW4gYXJndW1lbnQ7CisgICAgICogLXkgaXMgYW4gb3B0aW9uIHdpdGggbm8gYXJndW1lbnQuCisgICAgICAgCisgICBJZiB0aGUgZmlyc3QgY29tbWFuZC1saW5lIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIGEgZmlsZSwKKyAgIGludGVyYWN0aXZlLW1vZGUgY29tbWFuZHMgYXJlIGV4ZWN1dGVkIGZyb20gdGhlIGZpbGUuIFRoZSAnPScgKG9yCisgICAiLS0iKSBhcmd1bWVudCB0ZWxscyBLZXJtaXQgbm90IHRvIHBhcnNlIHRoZSByZW1haW5kZXIgb2YgdGhlIGNvbW1hbmQKKyAgIGxpbmUsIGJ1dCB0byBtYWtlIHRoZSB3b3JkcyBmb2xsb3dpbmcgJz0nIGF2YWlsYWJsZSBhcyBcJTEsIFwlMiwgLi4uCisgICBcJTkuIFRoZSAiKyIgYXJndW1lbnQgaXMgbGlrZSAiPSIgYnV0IGZvciB1c2UgaW4gImtlcmJhbmcgc2NyaXB0cyIKKyAgIChleHBsYWluZWQgWzQwXWJlbG93KS4gQSBzZWNvbmQgY29tbWFuZC1saW5lIGZvcm1hdCBhbGxvd3MgdGhlIG9uZSBhbmQKKyAgIG9ubHkgYXJndW1lbnQgdG8gYmUgYSBbNDFdVGVsbmV0LCBGVFAsIEhUVFAsIG9yIElLU0QgVVJMLgorICAgCisgICBPcmRlciBvZiBleGVjdXRpb246CisgICAKKyAgICAxLiBbNDJdVGhlIGNvbW1hbmQgZmlsZSAoaWYgYW55KS4KKyAgICAyLiBbNDNdVGhlIGluaXRpYWxpemF0aW9uIGZpbGUsIGlmIGFueSwgdW5sZXNzIHN1cHByZXNzZWQgd2l0aCAtWS4KKyAgICAzLiBbNDRdVGhlIGN1c3RvbWl6YXRpb24gZmlsZSAoaWYgaXQgaXMgZXhlY3V0ZWQgYnkgdGhlCisgICAgICAgaW5pdGlhbGl6YXRpb24gZmlsZSkuCisgICAgNC4gWzQ1XVRoZSBjb21tYW5kLWxpbmUgVVJMIChpZiBhbnksIGFuZCBpZiBzbywgZXhlY3V0aW9uIHN0b3BzCisgICAgICAgaGVyZSkuCisgICAgNS4gWzQ2XUNvbW1hbmQtbGluZSBvcHRpb25zIChpZiBhbnkpLgorICAgIDYuIFs0N11JbnRlcmFjdGl2ZSBjb21tYW5kcy4KKyAgICAgICAKKyAgIFNvbWUgY29tbWFuZC1saW5lIG9wdGlvbnMgY2FuIGNhdXNlIGFjdGlvbnMgKHN1Y2ggYXMgLXMgdG8gc2VuZCBhCisgICBmaWxlKTsgb3RoZXJzIGp1c3Qgc2V0IHBhcmFtZXRlcnMuIElmIGFueSBhY3Rpb24gb3B0aW9ucyBhcmUgaW5jbHVkZWQKKyAgIG9uIHRoZSBjb21tYW5kIGxpbmUsIEtlcm1pdCBleGl0cyB3aGVuIGZpbmlzaGVkIHVubGVzcyBhbHNvIGdpdmVuIHRoZQorICAgLVMgKCJzdGF5Iikgb3B0aW9uLiBJZiBubyBhY3Rpb24gb3B0aW9ucyBhcmUgZ2l2ZW4sIG5vIGluaXRpYWxpemF0aW9uCisgICBvciBjb21tYW5kIGZpbGVzIGNvbnRhaW5lZCBhbiBFWElUIG9yIFFVSVQgY29tbWFuZCwgYW5kIG5vIGZhdGFsCisgICBlcnJvcnMgb2NjdXJyZWQsIEtlcm1pdCBpc3N1ZXMgaXRzIHByb21wdCBhbmQgd2FpdHMgZm9yIHlvdSB0byB0eXBlCisgICBjb21tYW5kcy4KKyAgIAorICAgICBCZWFyIGluIG1pbmQgdGhhdCBDLUtlcm1pdCBjYW4gYmUgYnVpbHQgd2l0aCBzZWxlY3RlZCBmZWF0dXJlcworICAgICBkaXNhYmxlZCwgYW5kIGFsc28gdGhhdCBjZXJ0YWluIGZlYXR1cmVzIGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbAorICAgICBwbGF0Zm9ybXMuIEZvciBleGFtcGxlLCBDLUtlcm1pdCBjYW4ndCBiZSBidWlsdCB3aXRoIFRDUC9JUCBzdXBwb3J0CisgICAgIG9uIGEgcGxhdGZvcm0gdGhhdCBkb2VzIG5vdCBoYXZlIFRDUC9JUCBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcworICAgICAoYW5kIGV2ZW4gaWYgS2VybWl0IGRvZXMgaW5jbHVkZSBUQ1AvSVAgc3VwcG9ydCwgaXQgY2FuJ3QgYmUgdXNlZAorICAgICB0byBtYWtlIFRDUC9JUCBjb25uZWN0aW9ucyBvbiBhIGNvbXB1dGVyIHRoYXQgZG9lcyBub3QgaGF2ZSBhCisgICAgIFRDUC9JUCBzdGFjayBpbnN0YWxsZWQpLiBJZiB5b3VyIHZlcnNpb24gb2YgQy1LZXJtaXQgbGFja3MgYQorICAgICBmZWF0dXJlIG1lbnRpb25lZCBoZXJlLCB1c2UgaXRzIFNIT1cgRkVBVFVSRVMgY29tbWFuZCB0byBzZWUgd2hhdAorICAgICBtaWdodCBoYXZlIGJlZW4gZXhjbHVkZWQuIAorICAgICAKKyAgIEMtS2VybWl0IGhhcyB0aHJlZSBraW5kcyBvZiBjb21tYW5kczogcmVndWxhciBzaW5nbGUtbGV0dGVyCisgICBjb21tYW5kLWxpbmUgb3B0aW9ucywgZXh0ZW5kZWQtZm9ybWF0IGNvbW1hbmQtbGluZSBvcHRpb25zLCBhbmQKKyAgIGludGVyYWN0aXZlIGNvbW1hbmRzLgorICAgCisgICBbIFs0OF1LZXJtaXQgSG9tZSBdIFsgWzQ5XUMtS2VybWl0IEhvbWUgXSBbIFs1MF1DLUtlcm1pdCBGQVEgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAKKyAgT1BUSU9OUyBbIFs1MV1Ub3AgXSBbIFs1Ml1Db250ZW50cyBdIFsgWzUzXU5leHQgXSBbIFs1NF1QcmV2aW91cyBdCisgIAorICAgTGlrZSBtb3N0IFVuaXggY29tbWFuZHMsIEMtS2VybWl0IGNhbiBiZSBiZSBnaXZlbiBvcHRpb25zIG9uIHRoZQorICAgY29tbWFuZCBsaW5lLiBCdXQgQy1LZXJtaXQgYWxzbyBjYW4gYmUgdXNlZCBpbnRlcmFjdGl2ZWx5IGJ5IGdpdmluZyBpdAorICAgWzU1XWNvbW1hbmRzIGNvbXBvc2VkIG9mIHdvcmRzLCB3aGljaCBhcmUgbW9yZSBpbnR1aXRpdmUgdGhhbiBjcnlwdGljCisgICBjb21tYW5kLWxpbmUgb3B0aW9ucywgYW5kIG1vcmUgZmxleGlibGUgdG9vLiBJbiBvdGhlciB3b3JkcywgeW91IGRvbid0CisgICBoYXZlIHRvIHVzZSBDLUtlcm1pdCdzIGNvbW1hbmQtbGluZSBvcHRpb25zLCBidXQgdGhleSBhcmUgYXZhaWxhYmxlIGlmCisgICB5b3Ugd2FudCB0by4gKEJ5IHRoZSBzYW1lIHRva2VuLCB5b3UgZG9uJ3QgaGF2ZSB0byB1c2UgaXRzIGludGVyYWN0aXZlCisgICBjb21tYW5kcyBlaXRoZXIgLS0geW91IGNhbiB1c2UgZWl0aGVyIG9yIGJvdGggaW4gYW55IGNvbWJpbmF0aW9uLikKKyAgIAorICAgQy1LZXJtaXQgaXMgZ2VuZXJhbGx5IGluc3RhbGxlZCBpbiB0aGUgUEFUSCBhcyAia2VybWl0IiwgYW5kIHRoZXJlZm9yZQorICAgaXMgaW52b2tlZCBieSB0eXBpbmcgdGhlIHdvcmQgImtlcm1pdCIgKGxvd2VyY2FzZSkgYXQgdGhlIHNoZWxsCisgICBwcm9tcHQsIGFuZCB0aGVuIHByZXNzaW5nIHRoZSBSZXR1cm4gb3IgRW50ZXIga2V5LiBJZiB5b3Ugd2lzaCB0bworICAgaW5jbHVkZSBjb21tYW5kLWxpbmUgb3B0aW9ucywgcHV0IHRoZW0gYWZ0ZXIgdGhlIHdvcmQgImtlcm1pdCIgYnV0CisgICBiZWZvcmUgcHJlc3NpbmcgUmV0dXJuIG9yIEVudGVyLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBmb3IgZXhhbXBsZToKKyAgIAorICAkIGtlcm1pdCAtcyBja2VybWl0LnRhci5negorCisgICAoJyQnIGlzIHRoZSBzaGVsbCBwcm9tcHQ7ICJrZXJtaXQgLXMgY2tlcm1pdC50YXIuZ3oiIGlzIHdoYXQgeW91IHR5cGUsCisgICBmb2xsb3dlZCBieSBSZXR1cm4gb3IgRW50ZXIuKQorICAgCisgICBIZXJlIGlzIGEgbGlzdCBvZiBDLUtlcm1pdCdzIHNpbmdsZS1sZXR0ZXIgY29tbWFuZC1saW5lIG9wdGlvbnMsIHdoaWNoCisgICBzdGFydCB3aXRoIGEgc2luZ2xlIGRhc2ggKC0pLCBpbiBBU0NJSSAoImFscGhhYmV0aWNhbCIpIG9yZGVyLgorICAgQWxwaGFiZXRpYyBjYXNlIGlzIHNpZ25pZmljYW50ICgtQSBpcyBub3QgdGhlIHNhbWUgYXMgLWEpLiBUaGUgQWN0aW9uPworICAgY29sdW1uIGNvbnRhaW5zIFkgZm9yIGFjdGlvbiBvcHRpb25zIGFuZCBOIGZvciBub24tYWN0aW9uIG9wdGlvbnMuCisgICBPcHRpb24gQWN0aW9uPyBEZXNjcmlwdGlvbgorICAgLTAgTiAoZGlnaXQgemVybykgMTAwJSB0cmFuc3BhcmVudCBDb25uZWN0IHN0YXRlIGZvciAiaW4tdGhlLW1pZGRsZSIKKyAgIG9wZXJhdGlvbjogOCBiaXRzLCBubyBwYXJpdHksIG5vIGVzY2FwZSBjaGFyYWN0ZXIsIGV2ZXJ5dGhpbmcgcGFzc2VzCisgICB0aHJvdWdoLgorICAgLTggTiAoZGlnaXQgZWlnaHQpIENvbm5lY3Rpb24gaXMgOC1iaXQgY2xlYW4gKHRoaXMgaXMgdGhlIGRlZmF1bHQgaW4KKyAgIEMtS2VybWl0IDguMCkuIEVxdWl2YWxlbnQgdG8gdGhlIEVJR0hUQklUIGNvbW1hbmQsIHdoaWNoIGluIHR1cm4gaXMgYQorICAgc2hvcnRjdXQgZm9yIFNFVCBURVJNSU5BTCBCWVRFU0laRSA4LCBTRVQgQ09NTUFORCBCWVRFU0laRSA4LCBTRVQKKyAgIFBBUklUWSBOT05FLgorICAgLTkgYXJnIE4gKGRpZ2l0IG5pbmUpIE1ha2UgYSBjb25uZWN0aW9uIHRvIGFuIEZUUCBzZXJ2ZXIuIEVxdWl2YWxlbnQKKyAgIHRvIHRoZSBGVFAgT1BFTiBjb21tYW5kLgorICAgQXJndW1lbnQ6IElQLWFkZHJlc3Mtb3ItaG9zdG5hbWVbOm9wdGlvbmFsLVRDUC1wb3J0XS4KKyAgIE5PVEU6IEMtS2VybWl0IGFsc28gaGFzIGEgc2VwYXJhdGUgRlRQIGNvbW1hbmQtbGluZSBwZXJzb25hbGl0eSwgd2l0aAorICAgcmVndWxhciBGVFAtbGlrZSBjb21tYW5kLWxpbmUgc3ludGF4LiBbNTZdTW9yZSBhYm91dCB0aGlzIGJlbG93LgorICAgLUEgTiBLZXJtaXQgaXMgdG8gYmUgc3RhcnRlZCBhcyBhbiBJbnRlcm5ldCBzZXJ2aWNlIChJS1NEKSAob25seSBmcm9tCisgICBpbmV0ZC5jb25mKS4KKyAgIC1CIE4gS2VybWl0IGlzIHJ1bm5pbmcgaW4gQmF0Y2ggb3IgQmFja2dyb3VuZCAobm8gY29udHJvbGxpbmcKKyAgIHRlcm1pbmFsKS4gVG8gYmUgdXNlZCBpbiBjYXNlIEtlcm1pdCBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgc2Vuc2UgaXRzCisgICBiYWNrZ3JvdW5kIHN0YXR1cy4gRXF1aXZhbGVudCB0byB0aGUgU0VUIEJBQ0tHUk9VTkQgT04gY29tbWFuZC4KKyAgIC1DIGFyZyBOIEludGVyYWN0aXZlLW1vZGUgQ29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQuCisgICBBcmd1bWVudDogQ29tbWFuZHMgc2VwYXJhdGVkIGJ5IGNvbW1hcywgbGlzdCBpbiBkb3VibGVxdW90ZXMuCisgICAtRCBhcmcgTiBEZWxheSBiZWZvcmUgc3RhcnRpbmcgdG8gc2VuZCBpbiBSZW1vdGUgbW9kZS4gRXF1aXZhbGVudCB0bworICAgdGhlIFNFVCBERUxBWSBjb21tYW5kLgorICAgQXJndW1lbnQ6IE51bWJlciBvZiBzZWNvbmRzLgorICAgLUUgTiBFeGl0IGF1dG9tYXRpY2FsbHkgd2hlbiBjb25uZWN0aW9uIGNsb3Nlcy4gRXF1aXZhbGVudCB0byBTRVQgRVhJVAorICAgT04tRElTQ09OTkVDVCBPTi4KKyAgIC1GIGFyZyBOIFVzZSBhbiBvcGVuIFRDUCBjb25uZWN0aW9uLgorICAgQXJndW1lbnQ6IE51bWVyaWMgZmlsZSBkZXNjcmlwdG9yIG9mIG9wZW4gVENQIGNvbm5lY3Rpb24uCisgICBBbHNvIHNlZTogLWosIC1KLgorICAgLUcgYXJnIFkgR2V0IGZpbGUocykgZnJvbSBzZXJ2ZXIsIHNlbmQgY29udGVudHMgdG8gc3RhbmRhcmQgb3V0cHV0LAorICAgd2hpY2ggbm9ybWFsbHkgd291bGQgYmUgcGlwZWQgdG8gYW5vdGhlciBwcm9jZXNzLgorICAgQXJndW1lbnQ6IFJlbW90ZSBmaWxlIHNwZWNpZmljYXRpb24sIGluIHF1b3RlcyBpZiBpdCBjb250YWlucworICAgbWV0YWNoYXJhY3RlcnMuCisgICBBbHNvIHNlZTogLWcsIC1rLgorICAgLUggTiBTdXBwcmVzcyBwcm9ncmFtIHN0YXJ0dXAgSGVyYWxkIGFuZCBncmVldGluZy4KKyAgIC1JIE4gVGVsbCBLZXJtaXQgaXQgaGFzIGEgcmVsaWFibGUgY29ubmVjdGlvbiwgdG8gZm9yY2Ugc3RyZWFtaW5nIHRvCisgICBiZSB1c2VkIHdoZXJlIGl0IG5vcm1hbGx5IHdvdWxkIG5vdCBiZS4gRXF1aXZhbGVudCB0byB0aGUgU0VUIFJFTElBQkxFCisgICBPTiBjb21tYW5kLgorICAgLUogYXJnIE4gIkJlIGxpa2UgVGVsbmV0LiIgTGlrZSAtaiBidXQgaW1wbGllcyAtRS4KKyAgIEFyZ3VtZW50OiBJUCBob3N0bmFtZS9hZGRyZXNzIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgc2VydmljZS4KKyAgIE5PVEU6IEMtS2VybWl0IGFsc28gaGFzIGEgc2VwYXJhdGUgVGVsbmV0IGNvbW1hbmQtbGluZSBwZXJzb25hbGl0eSwKKyAgIHdpdGggcmVndWxhciBUZWxuZXQtbGlrZSBjb21tYW5kLWxpbmUgc3ludGF4LiBbNTddTW9yZSBhYm91dCB0aGlzCisgICBiZWxvdy4KKyAgIC1MIE4gUmVjdXJzaXZlIGRpcmVjdG9yeSBkZXNjZW50IGZvciBmaWxlcyBpbiAtcyBvcHRpb24uCisgICAtTSBhcmcgTiBNeSB1c2VyIG5hbWUgKGZvciB1c2Ugd2l0aCBUZWxuZXQsIFJsb2dpbiwgRlRQLCBldGMpLgorICAgRXF1aXZhbGVudCB0byB0aGUgU0VUIExPR0lOIFVTRVIgY29tbWFuZC4KKyAgIEFyZ3VtZW50OiBVc2VybmFtZSBzdHJpbmcuCisgICAtTyBZIChVcHBlcmNhc2UgbGV0dGVyIE8pIEJlIGEgc2VydmVyIGZvciBPbmUgY29tbWFuZCBvbmx5LiBBbHNvIHNlZToKKyAgIC14LgorICAgLVAgTiBEb24ndCBjb252ZXJ0IGZpbGUgKFBhdGgpIG5hbWVzIG9mIHRyYW5zZmVycmVkIGZpbGVzLiBFcXVpdmFsZW50CisgICB0byBTRVQgRklMRSBOQU1FUyBMSVRFUkFMLgorICAgLVEgTiBRdWljayBLZXJtaXQgcHJvdG9jb2wgc2V0dGluZ3MuIEVxdWl2YWxlbnQgdG8gdGhlIEZBU1QgY29tbWFuZC4KKyAgIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW4gQy1LZXJtaXQgNy4wIGFuZCBsYXRlci4KKyAgIC1SIE4gUmVtb3RlLW9ubHkgKHRoaXMganVzdCBtYWtlcyBJRiBSRU1PVEUgdHJ1ZSkuCisgICAtUyBOIFN0YXkgKGVudGVyIGNvbW1hbmQgcGFyc2VyIGFmdGVyIGFjdGlvbiBvcHRpb25zKS4KKyAgIC1UIE4gRm9yY2UgVGV4dCBtb2RlIGZvciBmaWxlIHRyYW5zZmVyOyBpbXBsaWVzIC1WLiBFcXVpdmFsZW50IHRvIFNFVAorICAgVFJBTlNGRVIgTU9ERSBNQU5VQUwsIFNFVCBGSUxFIFRZUEUgVEVYVC4KKyAgIC1WIE4gRGlzYWJsZSBhdXRvbWF0aWMgcGVyLWZpbGUgdGV4dC9iaW5hcnkgc3dpdGNoaW5nLiBFcXVpdmFsZW50IHRvCisgICBTRVQgVFJBTlNGRVIgTU9ERSBNQU5VQUwuCisgICAtWSBOIFNraXAgKGRvbid0IGV4ZWN1dGUpIHRoZSBpbml0aWFsaXphdGlvbiBmaWxlLgorICAgLWEgYXJnIE4gQXMtbmFtZSBmb3IgZmlsZShzKSBpbiAtcywgLXIsIG9yIC1nLgorICAgQXJndW1lbnQ6IEFzLW5hbWUgc3RyaW5nIChhbHRlcm5hdGl2ZSBmaWxlbmFtZSkuIFdoZW4gcmVjZWl2aW5nIGZpbGVzLAorICAgdGhpcyBjYW4gYmUgYSBkaXJlY3RvcnkgbmFtZS4KKyAgIC1iIGFyZyBOIFNwZWVkIGZvciBzZXJpYWwgZGV2aWNlLiBFcXVpdmFsZW50IHRvIFNFVCBTUEVFRC4KKyAgIEFyZ3VtZW50OiBOdW1lcmljIEJpdHMgcGVyIHNlY29uZCBmb3Igc2VyaWFsIGNvbm5lY3Rpb25zLgorICAgLWMgWSBFbnRlciBDb25uZWN0IHN0YXRlIGJlZm9yZSB0cmFuc2ZlcnJpbmcgZmlsZXMuCisgICAtZCBOIENyZWF0ZSBhIGRlYnVnLmxvZyBmaWxlIHdpdGggZGV0YWlsZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIChhCisgICBzZWNvbmQgLWQgYWRkcyB0aW1lc3RhbXBzKS4gRXF1aXZhbGVudCB0byBMT0cgREVCVUcgYnV0IHRha2VzIGVmZmVjdAorICAgc29vbmVyLgorICAgLWUgYXJnIE4gTWF4aW11bSBsZW5ndGggZm9yIGluY29taW5nIEtlcm1pdCBmaWxlLXRyYW5zZmVyIHBhY2tldHMuCisgICBFcXVpdmFsZW50IHRvIFNFVCBSRUNFSVZFIFBBQ0tFVC1MRU5HVEguCisgICBBcmd1bWVudDogTGVuZ3RoIGluIGJ5dGVzLgorICAgLWYgWSBTZW5kIGEgRklOSVNIIGNvbW1hbmQgdG8gYSBLZXJtaXQgc2VydmVyLgorICAgLWcgYXJnIE4gR2V0IGZpbGUocykgZnJvbSBhIEtlcm1pdCBzZXJ2ZXIuCisgICBBcmd1bWVudDogRmlsZSBzcGVjaWZpY2F0aW9uIG9uIG90aGVyIGNvbXB1dGVyLCBpbiBxdW90ZXMgaWYgaXQKKyAgIGNvbnRhaW5zIG1ldGFjaGFyYWN0ZXJzLiBFcXVpdmFsZW50IHRvIEdFVC4KKyAgIEFsc28gc2VlOiAtYSwgLUcsIC1yLgorICAgLWggWSBQcmludCBIZWxwIHRleHQgZm9yIHNpbmdsZS1sZXR0ZXIgY29tbWFuZC1saW5lIG9wdGlvbnMgKHBpcGUgdGhydQorICAgJ21vcmUnIHRvIHByZXZlbnQgc2Nyb2xsaW5nKS4KKyAgIC1pIE4gRm9yY2UgYmluYXJ5IChJbWFnZSkgbW9kZSBmb3IgZmlsZSB0cmFuc2ZlcjsgaW1wbGllcyAtVi4KKyAgIEVxdWl2YWxlbnQgdG8gU0VUIFRSQU5TRkVSIE1PREUgTUFOVUFMLCBTRVQgRklMRSBUWVBFIEJJTkFSWS4KKyAgIC1qIGFyZyBOIE1ha2UgYSBUQ1AvSVAgY29ubmVjdGlvbi4KKyAgIEFyZ3VtZW50OiBJUCBob3N0IG5hbWUvYWRkcmVzcyBhbmQgb3B0aW9uYWwgc2VydmljZSBuYW1lIG9yIG51bWJlci4KKyAgIEVxdWl2YWxlbnQgdG8gdGhlIFRFTE5FVCBjb21tYW5kLgorICAgQWxzbyBzZWU6IC1KLCAtRi4KKyAgIC1rIFkgUmVjZWl2ZSBmaWxlKHMpIHRvIHN0YW5kYXJkIG91dHB1dCwgd2hpY2ggbm9ybWFsbHkgd291bGQgYmUgcGlwZWQKKyAgIHRvIGFub3RoZXIgcHJvY2Vzcy4KKyAgIEFsc28gc2VlOiAtciwgLUcuCisgICAtbCBhcmcgTiAoTG93ZXJjYXNlIGxldHRlciBMKSBNYWtlIGEgY29ubmVjdGlvbiBvbiB0aGUgZ2l2ZW4gc2VyaWFsCisgICBjb21tdW5pY2F0aW9ucyBkZXZpY2UuIEVxdWl2YWxlbnQgdG8gdGhlIFNFVCBMSU5FIChTRVQgUE9SVCkgY29tbWFuZC4KKyAgIEFyZ3VtZW50OiBTZXJpYWwgZGV2aWNlIG5hbWUsIGUuZy4gL2Rldi90dHlTMC4KKyAgIC1tIGFyZyBOIE1vZGVtIHR5cGUgZm9yIHVzZSB3aXRoIHRoZSAtbCBkZXZpY2UuIEVxdWl2YWxlbnQgdG8gdGhlIFNFVAorICAgTU9ERU0gVFlQRSBjb21tYW5kLgorICAgQXJndW1lbnQ6IE1vZGVtIG5hbWUgYXMgaW4gU0VUIE1PREVNIFRZUEUgY29tbWFuZCwgZS5nLiAidXNyb2JvdGljcyIuCisgICAtbiBZIEVudGVyIENvbm5lY3Qgc3RhdGUgYWZ0ZXIgdHJhbnNmZXJyaW5nIGZpbGVzIChoaXN0b3JpY2FsKS4KKyAgIC1wIGFyZyBOIFBhcml0eS4gRXF1aXZhbGVudCB0byB0aGUgU0VUIFBBUklUWSBjb21tYW5kLgorICAgQXJndW1lbnQ6IE9uZSBvZiB0aGUgZm9sbG93aW5nOiBlKHZlbiksIG8oZGQpLCBtKGFyayksIG4ob25lKSwKKyAgIHMocGFjZSkuCisgICAtcSBOIFF1aWV0IChzdXBwcmVzcyBtb3N0IG1lc3NhZ2VzKS4gRXF1aXZhbGVudCB0byBTRVQgUVVJRVQgT04uCisgICAtciBZIFJlY2VpdmUgZmlsZShzKS4gRXF1aXZhbGVudCB0byB0aGUgUkVDRUlWRSBjb21tYW5kLgorICAgQXJndW1lbnQ6IChub25lLCBidXQgc2VlIC1hKQorICAgLXMgYXJnIE4gU2VuZCBmaWxlKHMpLgorICAgQXJndW1lbnQ6IE9uZSBvciBtb3JlIGxvY2FsIGZpbGUgc3BlY2lmaWNhdGlvbnMuIEVxdWl2YWxlbnQgdG8gdGhlCisgICBTRU5EIGNvbW1hbmQuCisgICBBbHNvIHNlZTogLWEuCisgICAtdCBOIChIaXN0b3JpY2FsKSBYb24gKEN0cmwtUSkgVHVybmFyb3VuZCBjaGFyYWN0ZXIgZm9yIGhhbGYtZHVwbGV4CisgICBjb25uZWN0aW9ucyAodXNlZCBvbiBzZXJpYWwgbGluZW1vZGUgY29ubmVjdGlvbnMgdG8gb2xkIG1haW5mcmFtZXMpLgorICAgRXF1aXZhbGVudCB0byBTRVQgRFVQTEVYIEhBTEYsIFNFVCBIQU5EU0hBS0UgWE9OLgorICAgLXYgYXJnIE4gV2luZG93IHNpemUgZm9yIEtlcm1pdCBwcm90b2NvbCAoaWdub3JlZCB3aGVuIHN0cmVhbWluZykuCisgICBFcXVpdmFsYW5ldCB0byBTRVQgV0lORE9XLVNJWkUuCisgICBBcmd1bWVudDogTnVtYmVyLCAxIHRvIDMyLgorICAgLXcgTiBJbmNvbWluZyBmaWxlcyBXcml0ZSBvdmVyIGV4aXN0aW5nIGZpbGVzLiBFcXVpdmFsZW50IHRvIFNFVCBGSUxFCisgICBDT0xMSVNJT04gT1ZFUldSSVRFLgorICAgLXggWSBFbnRlciBzZXJ2ZXIgbW9kZS4gRXF1aXZhbGVudCB0byB0aGUgU0VSVkVSIGNvbW1hbmQuIEFsc28gc2VlOgorICAgLU8uCisgICAteSBhcmcgTiBBbHRlcm5hdGl2ZSBpbml0aWFsaXphdGlvbiBmaWxlLgorICAgQXJndW1lbnQ6IEZpbGVuYW1lLgorICAgLXogTiBGb3JjZSBmb3JlZ3JvdW5kIGJlaGF2aW9yLiBUbyBiZSB1c2VkIGluIGNhc2UgS2VybWl0IGRvZXNuJ3QKKyAgIGF1dG9tYXRpY2FsbHkgc2Vuc2UgaXRzIGZvcmVncm91bmQgc3RhdHVzLiBFcXVpdmFsZW50IHRvIHRoZSBTRVQKKyAgIEJBQ0tHUk9VTkQgT0ZGIGNvbW1hbmQuCisgICAKKyAgIEV4dGVuZGVkIGNvbW1hbmQtbGluZSBvcHRpb25zIChuZWNlc3NhcnkgYmVjYXVzZSBzaW5nbGUtbGV0dGVyIG9uZXMKKyAgIGFyZSBhYm91dCB1c2VkIHVwKSBzdGFydCB3aXRoIHR3byBkYXNoZXMgKC0tKSwgd2l0aCB3b3JkcyByYXRoZXIgdGhhbgorICAgc2luZ2xlIGxldHRlcnMgYXMgb3B0aW9uIG5hbWVzLiBJZiBhbiBleHRlbmRlZCBvcHRpb24gdGFrZXMgYW4KKyAgIGFyZ3VtZW50LCBpdCBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgb3B0aW9uIHdvcmQgYnkgYSBjb2xvbiAoOikuCisgICBFeHRlbmRlZCBvcHRpb25zIGluY2x1ZGU6CisgICBPcHRpb24gRGVzY3JpcHRpb24KKyAgIC0tYmFubmVyZmlsZTpmaWxlbmFtZSBGaWxlIHRvIGRpc3BsYXkgdXBvbiBzdGFydHVwIG9yIElLU0QgbG9naW4uCisgICAtLWNkZmlsZTpmaWxlbmFtZSBGaWxlIHRvIGJlIHNlbnQgZm9yIGRpc3BsYXkgdG8gdGhlIGNsaWVudCB3aGVuCisgICBzZXJ2ZXIgY2hhbmdlcyBkaXJlY3RvcnkgKGZpbGVuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBjaGFuZ2VkLXRvCisgICBkaXJlY3RvcnkpLgorICAgLS1jZG1lc3NhZ2U6e29uLG9mZn0gRW5hYmxlL2Rpc2FibGUgdGhlIHNlcnZlciBDRCBtZXNzYWdlIGZlYXR1cmUuCisgICAtLWhlbHAgUHJpbnRzIHVzYWdlIG1lc3NhZ2UgZm9yIGV4dGVuZGVkIG9wdGlvbnMuCisgICAtLWhlbHBmaWxlOmZpbGVuYW1lIERlc2lnbmF0ZXMgYSBmaWxlIGNvbnRhaW5pbmcgY3VzdG9tIHRleHQgdG8KKyAgIHJlcGxhY2UgdGhlIHRvcC1sZXZlbCBIRUxQIGNvbW1hbmQuCisgICAtLW5vaW50ZXJydXB0cyBEaXNhYmxlcyBrZXlib2FyZCBpbnRlcnJ1cHRzLgorICAgLS1ub3Blcm1zIERpc2FibGVzIHRoZSBLZXJtaXQgcHJvdG9jb2wgZmlsZSBQZXJtaXNzaW9ucyBhdHRyaWJ1dGUsIHRvCisgICBwcmV2ZW50IHRyYW5zbWlzc2lvbiBvZiBmaWxlIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uKSBmcm9tIHNlbmRlciB0bworICAgcmVjZWl2ZXIuCisgICAKKyAgIFBsdXMgc2V2ZXJhbCBvdGhlciBbNThdSUtTRC1Pbmx5IG9wdGlvbnMuCisgICAKKyAgIFNlZSB0aGUgWzU5XWZpbGUtdHJhbnNmZXIgc2VjdGlvbiBmb3IgZXhhbXBsZXMgb2YgY29tbWFuZC1saW5lCisgICBpbnZvY2F0aW9uLgorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAKKyAgQ09NTUFORCBMQU5HVUFHRSBbIFs2MF1Ub3AgXSBbIFs2MV1Db250ZW50cyBdIFsgWzYyXU5leHQgXSBbIFs2M11QcmV2aW91cyBdCisgIAorICAgICAqIFs2NF1Db21tYW5kIEZpbGVzLCBNYWNyb3MsIGFuZCBTY3JpcHRzCisgICAgICogWzY1XUNvbW1hbmQgTGlzdAorICAgICAgIAorICAgQy1LZXJtaXQncyBpbnRlcmFjdGl2ZSBjb21tYW5kIGxhbmd1YWdlIGlzIHRoZSBzdWJqZWN0IG9mIGEKKyAgIFs2Nl02MjItcGFnZSBib29rIGFuZCBhbm90aGVyIHNldmVyYWwgaHVuZHJlZCBwYWdlcyBvZiB1cGRhdGVzLCBmYXIKKyAgIHRvbyBtdWNoIGZvciBhIG1hbnVhbCBwYWdlLiBCdXQgaXQncyBub3QgaGFyZCB0byBnZXQgc3RhcnRlZC4gQXQgdGhlCisgICBzaGVsbCBwcm9tcHQsIGp1c3QgdHlwZSAia2VybWl0IiB0byBnZXQgQy1LZXJtaXQncyBpbnRlcmFjdGl2ZSBjb21tYW5kCisgICBwcm9tcHQ6CisgICAKKyAgJCBrZXJtaXQKKyAgKC9jdXJyZW50L2RpcmVjdG9yeSkgQy1LZXJtaXQ+CisKKyAgIEJlZ2luIGJ5IHR5cGluZyAiaGVscCIgKGFuZCB0aGVuIHByZXNzIHRoZSBSZXR1cm4gb3IgRW50ZXIga2V5KSBmb3IgYQorICAgdG9wLWxldmVsIG92ZXJ2aWV3LCByZWFkIGl0LCBhbmQgZ28gZnJvbSB0aGVyZS4gWW91ciBzZWNvbmQgY29tbWFuZAorICAgc2hvdWxkIHByb2JhYmx5IGJlICJpbnRybyIgKGludHJvZHVjdGlvbikuIE5vdGUgdGhlIHByb21wdCBzaG93cyB5b3VyCisgICBjdXJyZW50IGRpcmVjdG9yeSAodW5sZXNzIHlvdSB0ZWxsIEtlcm1pdCB0byBwcm9tcHQgeW91IHdpdGggc29tZXRoaW5nCisgICBlbHNlKS4KKyAgIAorICAgSW50ZXJhY3RpdmUgY29tbWFuZHMgYXJlIGNvbXBvc2VkIG1haW5seSBvZiByZWd1bGFyIEVuZ2xpc2ggd29yZHMsCisgICB1c3VhbGx5IGluIHRoZSBmb3JtIG9mIGltcGVyYXRpdmUgc2VudGVuY2VzLCBzdWNoIGFzOgorICAgCisgIHNlbmQgb29mYS50eHQKKworICAgd2hpY2ggdGVsbHMgS2VybWl0IHRvIHNlbmQgKHRyYW5zZmVyKSB0aGUgZmlsZSB3aG9zZSBuYW1lIGlzIG9vZmEudHh0LAorICAgb3I6CisgICAKKyAgc2V0IHRyYW5zZmVyIG1vZGUgYXV0b21hdGljCisKKyAgIHdoaWNoIHNldHMgS2VybWl0J3MgInRyYW5zZmVyIG1vZGUiIHRvICJhdXRvbWF0aWMiICh3aGF0ZXZlciB0aGF0CisgICBtZWFucykuCisgICAKKyAgIFdoaWxlIHR5cGluZyBjb21tYW5kcywgeW91IGNhbiBhYmJyZXZpYXRlLCBhc2sgZm9yIGhlbHAgKGJ5IHByZXNzaW5nCisgICB0aGUgIj8iIGtleSBhbnl3aGVyZSBpbiBhIGNvbW1hbmQpLCBjb21wbGV0ZSBrZXl3b3JkcyBvciBmaWxlbmFtZXMKKyAgICh3aXRoIHRoZSBUYWIgb3IgRXNjIGtleSksIGFuZCBlZGl0IHlvdXIgdHlwaW5nIHdpdGggQmFja3NwYWNlIG9yCisgICBEZWxldGUsIEN0cmwtVywgQ3RybC1VLCBldGMuIFlvdSBjYW4gYWxzbyByZWNhbGwgcHJldmlvdXMgY29tbWFuZHMsCisgICBzYXZlIHlvdXIgY29tbWFuZCBoaXN0b3J5LCBhbmQgd2hvIGtub3dzIHdoYXQgZWxzZS4gR2l2ZSB0aGUgSU5UUk8KKyAgIGNvbW1hbmQgZm9yIGRldGFpbHMuCisgICAKKyAgIEMtS2VybWl0IGhhcyBodW5kcmVkcyBvZiBjb21tYW5kcywgYW5kIHRoZXkgY2FuIGJlIGlzc3VlZCBpbiBpbmZpbml0ZQorICAgdmFyaWV0eSBhbmQgY29tYmluYXRpb25zLCBpbmNsdWRpbmcgY29tbWFuZHMgZm9yOgorICAgCisgICAgICogTWFraW5nIGNvbm5lY3Rpb25zIChTRVQgTElORSwgRElBTCwgVEVMTkVULCBTU0gsIEZUUCwgQ09OTkVDVCwKKyAgICAgICAuLi4pCisgICAgICogQnJlYWtpbmcgY29ubmVjdGlvbnMgKEhBTkdVUCwgQ0xPU0UpCisgICAgICogVHJhbnNmZXJyaW5nIGZpbGVzIChTRU5ELCBHRVQsIFJFQ0VJVkUsIE1PVkUsIFJFU0VORCwgLi4uKQorICAgICAqIEVzdGFibGlzaGluZyBwcmVmZXJlbmNlcyAoU0VUKQorICAgICAqIERpc3BsYXlpbmcgcHJlZmVyZW5jZXMgKFNIT1cpCisgICAgICogTWFuYWdpbmcgbG9jYWwgZmlsZXMgKENELCBERUxFVEUsIE1LRElSLCBESVJFQ1RPUlksIFJFTkFNRSwgVFlQRSwKKyAgICAgICAuLi4pCisgICAgICogTWFuYWdpbmcgcmVtb3RlIGZpbGVzIChSQ0QsIFJERUwsIFJNS0RJUiwgUkRJUiwgLi4uKQorICAgICAqIFVzaW5nIGxvY2FsIGZpbGVzIChGT1BFTiwgRkNMT1NFLCBGUkVBRCwgRldSSVRFKQorICAgICAqIFByb2dyYW1taW5nIChUQUtFLCBERUZJTkUsIElGLCBGT1IsIFdISUxFLCBTV0lUQ0gsIERFQ0xBUkUsIC4uLikKKyAgICAgKiBJbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyIChFQ0hPLCBBU0ssIC4uLikKKyAgICAgKiBJbnRlcmFjdGluZyB3aXRoIGEgcmVtb3RlIGNvbXB1dGVyIChJTlBVVCwgT1VUUFVULCAuLi4pCisgICAgICogSW50ZXJhY3Rpbmcgd2l0aCBsb2NhbCBwcm9ncmFtcyAoUlVOLCBFWEVDLCBQVFksIC4uLikKKyAgICAgKiBMb2dnaW5nIHRoaW5ncyAoTE9HIFNFU1NJT04sIExPRyBQQUNLRVRTLCBMT0cgREVCVUcsIC4uLikKKyAgICAgICAKKyAgIEFuZCBvZiBjb3Vyc2UgUVVJVCBvciBFWElUIHRvIGdldCBvdXQgYW5kIEhFTFAgdG8gZ2V0IGhlbHAsIGFuZCBmb3IKKyAgIHByb2dyYW1tZXJzOiBsb29wcywgZGVjaXNpb24gbWFraW5nLCB2YXJpYWJsZXMsIGFycmF5cywgYXNzb2NpYXRpdmUKKyAgIGFycmF5cywgaW50ZWdlciBhbmQgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYywgbWFjcm9zLCBidWlsdC1pbiBhbmQKKyAgIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMsIHN0cmluZyBtYW5pcHVsYXRpb24sIHBhdHRlcm4gbWF0Y2hpbmcsIGJsb2NrCisgICBzdHJ1Y3R1cmUsIHNjb3BpbmcsIHJlY3Vyc2lvbiwgYW5kIGFsbCB0aGUgcmVzdC4gVG8gZ2V0IGEgbGlzdCBvZiBhbGwKKyAgIEMtS2VybWl0J3MgY29tbWFuZHMsIHR5cGUgYSBxdWVzdGlvbiBtYXJrICg/KSBhdCB0aGUgcHJvbXB0LiBUbyBnZXQgYQorICAgZGVzY3JpcHRpb24gb2YgYW55IGNvbW1hbmQsIHR5cGUgSEVMUCBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUKKyAgIGNvbW1hbmQsIGZvciBleGFtcGxlOgorICAgCisgIGhlbHAgc2VuZAorCisgICBUaGUgY29tbWFuZCBpbnRlcnJ1cHRpb24gY2hhcmFjdGVyIGlzIEN0cmwtQyAoaG9sZCBkb3duIHRoZSBDdHJsIGtleQorICAgYW5kIHByZXNzIHRoZSBDIGtleSkuCisgICAKKyAgIFRoZSBjb21tYW5kIGxhbmd1YWdlICJlc2NhcGUgY2hhcmFjdGVyIiwgdXNlZCB0byBpbnRyb2R1Y2UgdmFyaWFibGUKKyAgIG5hbWVzLCBmdW5jdGlvbiBpbnZvY2F0aW9ucywgYW5kIHNvIG9uLCBpcyBiYWNrc2xhc2ggKFwpLiBJZiB5b3UgbmVlZAorICAgdG8gaW5jbHVkZSBhIGxpdGVyYWwgYmFja3NsYXNoIGluIGEgY29tbWFuZCwgdHlwZSB0d28gb2YgdGhlbSwgZS5nLjoKKyAgIAorICBnZXQgYzpcXGs5NVxcazk1Y3VzdG9tLmluaQorCisgIENvbW1hbmQgRmlsZXMsIE1hY3JvcywgYW5kIFNjcmlwdHMKKyAgCisgICBBIGZpbGUgY29udGFpbmluZyBLZXJtaXQgY29tbWFuZHMgaXMgY2FsbGVkIGEgS2VybWl0IGNvbW1hbmQgZmlsZSBvcgorICAgS2VybWl0IHNjcmlwdC4gSXQgY2FuIGJlIGV4ZWN1dGVkIHdpdGggS2VybWl0J3MgVEFLRSBjb21tYW5kOgorICAgCisgICgvY3VycmVudC9kaXIpIEMtS2VybWl0PiB0YWtlIGNvbW1hbmRmaWxlCisKKyAgICh3aGVyZSAiY29tbWFuZGZpbGUiIGlzIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIGZpbGUpLiBQbGVhc2UgZG9uJ3QKKyAgIHBpcGUgYSBjb21tYW5kIGZpbGUgaW50byBLZXJtaXQncyBzdGFuZGFyZCBpbnB1dCAod2hpY2ggbWlnaHQgb3IgbWlnaHQKKyAgIG5vdCB3b3JrKTsgaWYgeW91IGhhdmUgS2VybWl0IGNvbW1hbmRzIGluIGEgZmlsZSwgdGVsbCBLZXJtaXQgdG8gVEFLRQorICAgdGhlIGZpbGUuCisgICAKKyAgIEluIFVuaXggb25seSwgYSBLZXJtaXQgY29tbWFuZCBmaWxlIGNhbiBhbHNvIGJlIGV4ZWN1dGVkIGRpcmVjdGx5IGJ5CisgICBpbmNsdWRpbmcgYSAia2VyYmFuZyIgbGluZSBhcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZmlsZToKKyAgIAorICAjIS91c3IvbG9jYWwvYmluL2tlcm1pdCArCisKKyAgIFRoYXQgaXMsIGEgdG9wIGxpbmUgdGhhdCBzdGFydHMgd2l0aCAiIyEiLCBmb2xsb3dlZCBpbW1lZGlhdGVseSBieSB0aGUKKyAgIGZ1bGwgcGF0aCBvZiB0aGUgS2VybWl0IGV4ZWN1dGFibGUsIGFuZCB0aGVuLCBpZiB0aGUgS2VybWl0IHNjcmlwdCBpcworICAgdG8gYmUgZ2l2ZW4gYXJndW1lbnRzIG9uIHRoZSBjb21tYW5kIGxpbmUsIGEgc3BhY2UgYW5kIGEgcGx1cyBzaWduLgorICAgVGhlIHNjcmlwdCBmaWxlIG11c3QgYWxzbyBoYXZlIGV4ZWN1dGUgcGVybWlzc2lvbjoKKyAgIAorICBjaG1vZCAreCBjb21tYW5kZmlsZQorCisgICBFeGNlcHQgZm9yIHRoZSAiICsiIHBhcnQsIHRoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB5b3Ugd291bGQgZG8gZm9yCisgICBhIHNoZWxsIHNjcmlwdCwgYSBQZXJsIHNjcmlwdCwgZXRjLiBIZXJlJ3MgYSBzaW1wbGUgYnV0IHVzZWxlc3MKKyAgIGV4YW1wbGUgc2NyaXB0IHRoYXQgcmVndXJnaXRhdGVzIGl0cyBhcmd1bWVudHMgKHVwIHRvIHRocmVlIG9mIHRoZW0pOgorICAgCisgICMhL3Vzci9sb2NhbC9iaW4va2VybWl0ICsKKyAgaWYgZGVmaW5lZCBcJTEgZWNobyAiQXJndW1lbnQgMTogXCUxIgorICBpZiBkZWZpbmVkIFwlMiBlY2hvICJBcmd1bWVudCAyOiBcJTIiCisgIGlmIGRlZmluZWQgXCUzIGVjaG8gIkFyZ3VtZW50IDM6IFwlMyIKKyAgaWYgZGVmaW5lZCBcJTQgZWNobyAiZXRjLi4uIgorICBleGl0CisKKyAgIElmIHRoaXMgZmlsZSBpcyBzdG9yZWQgaW4geW91ciBjdXJyZW50IGRpcmVjdG9yeSBhcyAiY29tbWFuZGZpbGUiLAorICAgdGhlbjoKKyAgIAorICAuL2NvbW1hbmRmaWxlIG9uZSB0d28gdGhyZWUgZm91ciBmaXZlCisKKyAgIHByaW50czoKKyAgIAorICBBcmd1bWVudCAxOiBvbmUKKyAgQXJndW1lbnQgMjogdHdvCisgIEFyZ3VtZW50IDM6IHRocmVlCisgIGV0Yy4uLgorCisgICBUaGlzIGlsbHVzdHJhdGVzIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgb2YgYSBzdGFuZGFsb25lIEtlcm1pdCBzY3JpcHQ6CisgICB0aGUgImtlcmJhbmcgbGluZSIsIHRoZW4gc29tZSBjb21tYW5kcy4gSXQgc2hvdWxkIGVuZCB3aXRoICJleGl0IgorICAgdW5sZXNzIHlvdSB3YW50IHRoZSBLZXJtaXQgcHJvbXB0IHRvIGFwcGVhciB3aGVuIGl0IGlzIGZpbmlzaGVkLiBcJTEKKyAgIGlzIHRoZSBmaXJzdCBhcmd1bWVudCwgXCUyIHRoZSBzZWNvbmQsIGFuZCBzbyBvbi4KKyAgIAorICAgWW91IGNhbiBhbHNvIGNyZWF0ZSB5b3VyIG93biBjb21tYW5kcyBieSBkZWZpbmluZyBuYW1lZCBtYWNyb3MKKyAgIGNvbXBvc2VkIG9mIG90aGVyIEtlcm1pdCBjb21tYW5kcyAob3IgbWFjcm9zKS4gSGVyZSdzIGEgc2ltcGxlCisgICBleGFtcGxlOgorICAgCisgIGRlZmluZSBteWRpYWwgeworICAgICAgc2V0IG1vZGVtIHR5cGUgdXNyb2JvdGljcworICAgICAgc2V0IHBvcnQgL2Rldi90dHlTMAorICAgICAgaWYgZmFpbCBlbmQgMQorICAgICAgc2V0IHNwZWVkIDU3NjAwCisgICAgICBkaWFsIFwlMQorICAgICAgaWYgc3VjY2VzcyBjb25uZWN0CisgIH0KKworICAgVGhpcyBzaG93cyBob3cgeW91IGNhbiBjb21iaW5lIG1hbnkgY29tbWFuZHMgaW50byBvbmUgY29tbWFuZCwKKyAgICJteWRpYWwiIGluIHRoaXMgY2FzZSAoeW91IGNhbiB1c2UgYW55IG5hbWUgeW91IGxpa2UsIHByb3ZpZGVkIGl0IGRvZXMKKyAgIG5vdCBjbGFzaCB3aXRoIHRoZSBuYW1lIG9mIGEgYnVpbHQtaW4gY29tbWFuZCkuIFdoZW4gdGhpcyBtYWNybworICAgZGVmaW5pdGlvbiBpcyBpbiBlZmZlY3QsIHlvdSBjYW4gdHlwZSBjb21tYW5kcyBsaWtlOgorICAgCisgIG15ZGlhbCA3NjU0MzIxCisKKyAgIGFuZCBpdCBleGVjdXRlcyBhbGwgdGhlIGNvbW1hbmRzIGluIG1hY3JvIGRlZmluaXRpb24sIHN1YnN0aXR1dGluZyB0aGUKKyAgIGZpcnN0IG9wZXJhbmQgKCI3NjU0MzIxIikgZm9yIHRoZSBmb3JtYWwgcGFyYW1ldGVyICgiXCUxIikgaW4gdGhlCisgICBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHlvdSBmcm9tIGhhdmluZyB0byB0eXBlIGxvdHMgb2YgY29tbWFuZHMgZXZlcnkKKyAgIHRpbWUgeW91IHdhbnQgdG8gbWFrZSBhIG1vZGVtIGNhbGwuCisgICAKKyAgIE9uZSB3YXkgdG8gaGF2ZSB0aGUgbWFjcm8gZGVmaW5pdGlvbiBpbiBlZmZlY3QgaXMgdG8gdHlwZSB0aGUKKyAgIGRlZmluaXRpb24gYXQgdGhlIEtlcm1pdCBwcm9tcHQuIEFub3RoZXIgd2F5IGlzIHRvIHN0b3JlIHRoZQorICAgZGVmaW5pdGlvbiBpbiBhIGZpbGUgYW5kIFRBS0UgdGhlIGZpbGUuIElmIHlvdSB3YW50IHRoZSB0aGUgZGVmaW5pdGlvbgorICAgdG8gYmUgaW4gZWZmZWN0IGF1dG9tYXRpY2FsbHkgZXZlcnkgdGltZSB5b3Ugc3RhcnQgS2VybWl0LCBwdXQgdGhlCisgICBkZWZpbml0aW9uIGluIHlvdXIgaW5pdGlhbGl6YXRpb24gb3IgY3VzdG9taXphdGlvbiBmaWxlIChleHBsYWluZWQKKyAgIFs2N11iZWxvdykuCisgICAKKyAgIEhlcmUncyBhIHNvbWV3aGF0IG1vcmUgYW1iaXRpb3VzIGV4YW1wbGU6CisgICAKKyAgZGVmaW5lIG15ZGVsZXRlIHsKKyAgICAgIGxvY2FsIHRyYXNoCisgICAgICBhc3NpZ24gdHJhc2ggXHYoaG9tZSl0cmFzaGNhbi8KKyAgICAgIGlmIG5vdCBkZWZpbmVkIFwlMSBlbmQgMSAiRGVsZXRlIHdoYXQ/IgorICAgICAgaWYgd2lsZCBcJTEgZW5kIDEgIkRlbGV0aW5nIG11bHRpcGxlIGZpbGVzIGlzIHRvbyBzY2FyeSIKKyAgICAgIGlmIG5vdCBleGlzdCBcJTEgZW5kIDEgIkkgY2FuJ3QgZmluZCBcJTEiCisgICAgICBpZiBub3QgZGlyZWN0b3J5IFxtKHRyYXNoKSB7CisgICAgICAgICAgbWtkaXIgXG0odHJhc2gpCisgICAgICAgICAgaWYgZmFpbCBlbmQgMSAiTm8gdHJhc2ggY2FuIgorICAgICAgfQorICAgICAgcmVuYW1lIC9saXN0IFwlMSBcbSh0cmFzaCkKKyAgfQorICBkZWZpbmUgbXl1bmRlbGV0ZSB7CisgICAgICBsb2NhbCB0cmFzaAorICAgICAgYXNzaWduIHRyYXNoIFx2KGhvbWUpdHJhc2hjYW4vCisgICAgICBpZiBub3QgZGVmaW5lZCBcJTEgZW5kIDEgIlVuZGVsZXRlIHdoYXQ/IgorICAgICAgaWYgd2lsZCBcJTEgZW5kIDEgIlVuZGVsZXRpbmcgbXVsdGlwbGUgZmlsZXMgaXMgdG9vIGhhcmQiCisgICAgICBpZiBub3QgZGlyZWN0b3J5IFxtKHRyYXNoKSBlbmQgMSAiTm8gdHJhc2ggY2FuIgorICAgICAgaWYgbm90IGV4aXN0IFxtKHRyYXNoKVwlMSBlbmQgMSAiSSBjYW4ndCBmaW5kIFwlMSBpbiB0cmFzaCBjYW4iCisgICAgICByZW5hbWUgL2xpc3QgXG0odHJhc2gpXCUxIC4KKyAgfQorCisgICBUaGVzZSBtYWNyb3MgYXJlIG5vdCBleGFjdGx5IHByb2R1Y3Rpb24gcXVhbGl0eSAodGhleSBkb24ndCBoYW5kbGUKKyAgIGZpbGVuYW1lcyB0aGF0IGluY2x1ZGUgcGF0aCBzZWdtZW50cywgdGhleSBkb24ndCBoYW5kbGUgbXVsdGlwbGUKKyAgIGZpbGVzLCBldGMpLCBidXQgeW91IGdldCB0aGUgaWRlYTogeW91IGNhbiBwYXNzIGFyZ3VtZW50cyB0byBtYWNyb3MsCisgICB0aGV5IGNhbiBjaGVjayB0aGVtIGFuZCBtYWtlIG90aGVyIGtpbmRzIG9mIGRlY2lzaW9ucywgYW5kIHRoZQorICAgY29tbWFuZHMgdGhlbXNlbHZlcyBhcmUgcmVsYXRpdmVseSBpbnR1aXRpdmUgYW5kIGludGVsbGlnaWJsZS4KKyAgIAorICAgSWYgeW91IHB1dCB0aGUgYWJvdmUgbGluZXMgaW50byB5b3VyIGluaXRpYWxpemF0aW9uIG9yIGN1c3RvbWl6YXRpb24KKyAgIGZpbGUsIHlvdSdsbCBoYXZlIE1ZREVMRVRFIGFuZCBNWVVOREVMRVRFIGNvbW1hbmRzIGF2YWlsYWJsZSBldmVyeQorICAgdGltZSB5b3Ugc3RhcnQgS2VybWl0LCBhdCBsZWFzdCBhcyBsb25nIGFzIHlvdSBkb24ndCBzdXBwcmVzcworICAgZXhlY3V0aW9uIG9mIHRoZSBpbml0aWFsaXphdGlvbiBmaWxlLiAoRXhlcmNpc2UgZm9yIHRoZSByZWFkZXI6IE1ha2UKKyAgIHRoZXNlIG1hY3JvcyBnZW5lcmFsbHkgdXNlZnVsOiByZW1vdmUgbGltaXRhdGlvbnMsIGFkZCB0cmFzaGNhbgorICAgZGlzcGxheSwgYnJvd3NpbmcsIGVtcHR5aW5nLCBldGMuKQorICAgCisgICBLZXJiYW5nIHNjcmlwdHMgZXhlY3V0ZSB3aXRob3V0IHRoZSBpbml0aWFsaXphdGlvbiBmaWxlLiBUaGlzIHRvIGtlZXAKKyAgIHRoZW0gcG9ydGFibGUgYW5kIGFsc28gdG8gbWFrZSB0aGVtIHN0YXJ0IGZhc3Rlci4gSWYgeW91IHdhbnQgdG8gd3JpdGUKKyAgIEtlcmJhbmcgc2NyaXB0cyB0aGF0IGRlcGVuZCBvbiB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZSwgaW5jbHVkZSB0aGUKKyAgIGNvbW1hbmQKKyAgIAorICB0YWtlIFx2KGhvbWUpLmtlcm1yYworCisgICBhdCB0aGUgZGVzaXJlZCBzcG90IGluIHRoZSBzY3JpcHQuIEJ5IHRoZSB3YXksIFx2KHh4eCkgaXMgYSBidWlsdC1pbgorICAgdmFyaWFibGUgKHh4eCBpcyB0aGUgdmFyaWFibGUgbmFtZSwgImhvbWUiIGluIHRoaXMgY2FzZSkuIFRvIHNlZSB3aGF0CisgICBidWlsdC1pbiB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSwgdHlwZSAic2hvdyB2YXJpYWJsZXMiIGF0IHRoZQorICAgQy1LZXJtaXQgcHJvbXB0LiBUbyBzZWUgd2hhdCBlbHNlIHlvdSBjYW4gc2hvdywgdHlwZSAic2hvdyA/Ii4gXG0oeHh4KQorICAgaXMgYSB1c2VyIGRlZmluZWQgdmFyaWFibGUgKHN0cmljdGx5IHNwZWFraW5nLCBpdCBpcyBhIG1hY3JvIHVzZWQgYXMgYQorICAgdmFyaWFibGUpLgorICAgCisgIENvbW1hbmQgTGlzdAorICAKKyAgIEMtS2VybWl0IGhhcyBtb3JlIHRoYW4gMjAwIHRvcC1sZXZlbCBjb21tYW5kcywgYW5kIHNvbWUgb2YgdGhlc2UsIHN1Y2gKKyAgIGFzIFNFVCwgYnJhbmNoIG9mZiBpbnRvIGh1bmRyZWRzIG9mIHN1YmNvbW1hbmRzIG9mIHRoZWlyIG93biwgc28gaXQncworICAgbm90IHByYWN0aWNhbCB0byBkZXNjcmliZSB0aGVtIGFsbCBoZXJlLiBJbnN0ZWFkLCBoZXJlJ3MgYSBjb25jaXNlCisgICBsaXN0IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgdG9wLWxldmVsIGNvbW1hbmRzLCBncm91cGVkIGJ5CisgICBjYXRlZ29yeS4gVG8gbGVhcm4gYWJvdXQgZWFjaCBjb21tYW5kLCB0eXBlICJoZWxwIiBmb2xsb3dlZCBieSB0aGUKKyAgIGNvbW1hbmQgbmFtZSwgZS5nLiAiaGVscCBzZXQiLiBUZXJtcyBzdWNoIGFzIENvbW1hbmQgc3RhdGUgYW5kIENvbm5lY3QKKyAgIHN0YXRlIGFyZSBleHBsYWluZWQgaW4gc3Vic2VxdWVudCBzZWN0aW9ucy4KKyAgIAorICAgT3B0aW9uYWwgZmllbGRzIGFyZSBzaG93biBpbiBbIGl0YWxpY2l6ZWQgYnJhY2tldHMgXS4gZmlsZW5hbWUgbWVhbnMKKyAgIHRoZSBuYW1lIG9mIGEgc2luZ2xlIGZpbGUuIGZpbGVzcGVjIG1lYW5zIGEgZmlsZSBzcGVjaWZpY2F0aW9uIHRoYXQgaXMKKyAgIGFsbG93ZWQgdG8gY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzIGxpa2UgJyonIHRvIG1hdGNoIGdyb3VwcyBvZgorICAgZmlsZXMuIG9wdGlvbnMgYXJlIChvcHRpb25hbCkgc3dpdGNoZXMgbGlrZSAvUEFHRSwgL05PUEFHRSwgL1FVSUVULAorICAgZXRjLCBsaXN0ZWQgaW4gdGhlIEhFTFAgdGV4dCBmb3IgZWFjaCBjb21tYW5kLiBFeGFtcGxlOgorICAgCisgIHNlbmQgL3JlY3Vyc2l2ZSAvbGFyZ2VyOjEwMDAwIC9hZnRlcjotMXdlZWsgL2V4Y2VwdDoqLnR4dCAqCisKKyAgIHdoaWNoIGNhbiBiZSByZWFkIGFzICJzZW5kIGFsbCB0aGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIGFsbCB0aGUKKyAgIG9uZXMgdW5kZXJuZWF0aCBpdCB0aGF0IGFyZSBsYXJnZXIgdGhhbiAxMDAwMCBieXRlcywgbm8gbW9yZSB0aGFuIG9uZQorICAgd2VlayBvbGQsIGFuZCB3aG9zZSBuYW1lcyBkb24ndCBlbmQgd2l0aCAiLnR4dCIuCisgICAKKyAgIEJhc2ljIENvbW1hbmRzCisgICAgICAgICAgSEVMUCBSZXF1ZXN0cyB0b3AtbGV2ZWwgaGVscC4KKyAgICAgICAgICBIRUxQIGNvbW1hbmQgUmVxdWVzdHMgaGVscCBhYm91dCB0aGUgZ2l2ZW4gY29tbWFuZC4KKyAgICAgICAgICBJTlRST0RVQ1RJT04gUmVxdWVzdHMgYSBicmllZiBpbnRyb2R1Y3Rpb24gdG8gQy1LZXJtaXQuCisgICAgICAgICAgTElDRU5TRSBEaXNwbGF5cyB0aGUgQy1LZXJtaXQgc29mdHdhcmUgY29weXJpZ2h0IGFuZCBsaWNlbnNlLgorICAgICAgICAgIFZFUlNJT04gRGlzcGxheXMgQy1LZXJtaXQncyB2ZXJzaW9uIG51bWJlci4KKyAgICAgICAgICBFWElUIFsgbnVtYmVyIF0gRXhpdHMgZnJvbSBLZXJtaXQgd2l0aCB0aGUgZ2l2ZW4gc3RhdHVzIGNvZGUuCisgICAgICAgICAgU3lub255bXM6IFFVSVQsIEUsIFEuCisgICAgICAgICAgVEFLRSBmaWxlbmFtZSBbIHBhcmFtZXRlcnMuLi4gXSBFeGVjdXRlcyBjb21tYW5kcyBmcm9tIHRoZQorICAgICAgICAgIGdpdmVuIGZpbGUuCisgICAgICAgICAgTE9HIGl0ZW0gWyBmaWxlbmFtZSBdIEtlZXBzIGEgbG9nIG9mIHRoZSBnaXZlbiBpdGVtIGluIHRoZQorICAgICAgICAgIGdpdmVuIGZpbGUuCisgICAgICAgICAgWyBETyBdIG1hY3JvIFsgcGFyYW1ldGVycy4uLiBdICAgIEV4ZWN1dGVzIGNvbW1hbmRzIGZyb20gdGhlCisgICAgICAgICAgZ2l2ZW4gbWFjcm8uCisgICAgICAgICAgU0VUIHBhcmFtZXRlciB2YWx1ZSBTZXRzIHRoZSBnaXZlbiBwYXJhbWV0ZXIgdG8gdGhlIGdpdmVuCisgICAgICAgICAgdmFsdWUuCisgICAgICAgICAgU0hPVyBjYXRlZ29yeSBTaG93cyBzZXR0aW5ncyBpbiBhIGdpdmVuIGNhdGVnb3J5LgorICAgICAgICAgIFNUQVRVUyBUZWxscyB3aGV0aGVyIHByZXZpb3VzIGNvbW1hbmQgc3VjY2VlZGVkIG9yIGZhaWxlZC4KKyAgICAgICAgICBEQVRFIFsgZGF0ZS1hbmQvb3ItdGltZSBdIFNob3dzIGN1cnJlbnQgZGF0ZS10aW1lIG9yIGludGVycHJldHMKKyAgICAgICAgICBnaXZlbiBkYXRlLXRpbWUuCisgICAgICAgICAgUlVOIFsgZXh0ZXJuLWNvbW1hbmQgWyBwYXJhbWV0ZXJzLi4uIF0gUnVucyB0aGUgZ2l2ZW4gZXh0ZXJuYWwKKyAgICAgICAgICBjb21tYW5kLiBTeW5vbnltOiAhLgorICAgICAgICAgIEVYRUMgWyBleHRlcm4tY29tbWFuZCBbIHBhcmFtcy4uLiBdIEtlcm1pdCBvdmVybGF5cyBpdHNlbGYgd2l0aAorICAgICAgICAgIHRoZSBnaXZlbiBjb21tYW5kLgorICAgICAgICAgIFNVU1BFTkQgU3RvcHMgS2VybWl0IGFuZCBwdXRzIGl0IGluIHRoZSBiYWNrZ3JvdW5kLiBTeW5vbnltOiBaLgorICAgICAgICAgIAorICAgTG9jYWwgRmlsZSBNYW5hZ2VtZW50CisgICAgICAgICAgVFlQRSBbIG9wdGlvbnMgXSBmaWxlbmFtZSBEaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuCisgICAgICAgICAgZmlsZS4KKyAgICAgICAgICBNT1JFIFsgb3B0aW9ucyBdIGZpbGVuYW1lIEVxdWl2YWxlbnQgdG8gVFlQRSAvUEFHRSAocGF1c2UgYWZ0ZXIKKyAgICAgICAgICBlYWNoIHNjcmVlbmZ1bCkuCisgICAgICAgICAgQ0FUIFsgb3B0aW9ucyBdIGZpbGVuYW1lIEVxdWl2YWxlbnQgdG8gVFlQRSAvTk9QQUdFLgorICAgICAgICAgIEhFQUQgWyBvcHRpb25zIF0gZmlsZW5hbWUgRGlzcGxheXMgdGhlIGZpcnN0IGZldyBsaW5lcyBvZiBhCisgICAgICAgICAgZ2l2ZW4gZmlsZS4KKyAgICAgICAgICBUQUlMIFsgb3B0aW9ucyBdIGZpbGVuYW1lIERpc3BsYXlzIHRoZSBsYXN0IGZldyBsaW5lcyBvZiBhCisgICAgICAgICAgZ2l2ZW4gZmlsZS4KKyAgICAgICAgICBHUkVQIFsgb3B0aW9ucyBdIHBhdHRlcm4gZmlsZXNwZWMgRGlzcGxheXMgbGluZXMgZnJvbSBmaWxlcworICAgICAgICAgIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uIFN5bm9ueW06IEZJTkQuCisgICAgICAgICAgRElSRUNUT1JZIFsgb3B0aW9ucyBdIFsgZmlsZXNwZWMgXSBMaXN0cyBmaWxlcyAoYnVpbHQtaW4sIG1hbnkKKyAgICAgICAgICBvcHRpb25zKS4KKyAgICAgICAgICBMUyBbIG9wdGlvbnMgXSBbIGZpbGVzcGVjIF0gTGlzdHMgZmlsZXMgKHJ1bnMgZXh0ZXJuYWwgImxzIgorICAgICAgICAgIGNvbW1hbmQpLgorICAgICAgICAgIERFTEVURSBbIG9wdGlvbnMgXSBbIGZpbGVzcGVjIF0gRGVsZXRlcyBmaWxlcy4gU3lub255bTogUk0uCisgICAgICAgICAgUFVSR0UgWyBvcHRpb25zIF0gWyBmaWxlc3BlYyBdIFJlbW92ZXMgYmFja3VwICgqLn5ufikgZmlsZXMuCisgICAgICAgICAgQ09QWSBbIG9wdGlvbnMgXSBbIGZpbGVzcGVjcy4uLiBdIENvcGllcyBmaWxlcy4gU3lub255bTogQ1AuCisgICAgICAgICAgUkVOQU1FIFsgb3B0aW9ucyBdIFsgZmlsZXNwZWNzLi4uIF0gUmVuYW1lcyBmaWxlcy4gU3lub255bTogTVYuCisgICAgICAgICAgQ0hNT0QgWyBvcHRpb25zIF0gWyBmaWxlc3BlY3MuLi4gXSBDaGFuZ2VzIHBlcm1pc3Npb25zIG9mCisgICAgICAgICAgZmlsZXMuCisgICAgICAgICAgVFJBTlNMQVRFIGZpbGVuYW1lIGNoYXJzZXRzIGZpbGVuYW1lIF0gQ29udmVydHMgZmlsZSdzCisgICAgICAgICAgY2hhcmFjdGVyIHNldC4gU3lub255bTogWExBVEUuCisgICAgICAgICAgQ0QgQ2hhbmdlcyB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHlvdXIgaG9tZSBkaXJlY3RvcnkuCisgICAgICAgICAgQ0QgZGlyZWN0b3J5IENoYW5nZXMgeW91ciB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgb25lIGdpdmVuLgorICAgICAgICAgIENEVVAgQ2hhbmdlcyB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IG9uZSBsZXZlbCB1cC4KKyAgICAgICAgICBQV0QgRGlzcGxheXMgeW91ciB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgICAgICBCQUNLIFJldHVybnMgdG8geW91ciBwcmV2aW91cyB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgICAgICBNS0RJUiBbIGRpcmVjdG9yeSBdIENyZWF0ZXMgYSBkaXJlY3RvcnkuCisgICAgICAgICAgUk1ESVIgWyBkaXJlY3RvcnkgXSBSZW1vdmVzIGEgZGlyZWN0b3J5LgorICAgICAgICAgIAorICAgTWFraW5nIENvbm5lY3Rpb25zCisgICAgICAgICAgU0VUIExJTkUgWyBvcHRpb25zIF0gZGV2aWNlbmFtZSAgICAgICAgT3BlbnMgdGhlIG5hbWVkIHNlcmlhbAorICAgICAgICAgIHBvcnQuIFN5bm9ueW06IFNFVCBQT1JULgorICAgICAgICAgIE9QRU4gTElORSBbIG9wdGlvbnMgXSBkZXZpY2VuYW1lIFNhbWUgYXMgU0VUIExJTkUuIFN5bm9ueW06CisgICAgICAgICAgT1BFTiBQT1JULgorICAgICAgICAgIFNFVCBNT0RFTSBUWVBFIFsgbmFtZSBdIFRlbGxzIEtlcm1pdCB3aGF0IGtpbmQgb2YgbW9kZW0gaXMgb24KKyAgICAgICAgICB0aGUgcG9ydC4KKyAgICAgICAgICBESUFMIFsgbnVtYmVyIF0gVGVsbHMgS2VybWl0IHRvIGRpYWwgdGhlIGdpdmVuIHBob25lIG51bWJlcgorICAgICAgICAgIHdpdGggdGhlIG1vZGVtLgorICAgICAgICAgIFJFRElBTCBSZWRpYWxzIHRoZSBtb3N0IHJlY2VudGx5IGRpYWxlZCBwaG9uZSBudW1iZXIuCisgICAgICAgICAgQU5TV0VSIFdhaXRzIGZvciBhbmQgYW5zd2VycyBhbiBpbmNvbWluZyBjYWxsIG9uIHRoZSBtb2RlbS4KKyAgICAgICAgICBBVVRIRU5USUNBVEUgWyBwYXJhbWV0ZXJzLi4uIF0gUGVyZm9ybXMgc2VjdXJlIGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgb24gYSBUQ1AvSVAgY29ubmVjdGlvbi4KKyAgICAgICAgICBTRVQgTkVUV09SSyBUWVBFIHsgVENQL0lQLCBYLjI1LCAuLi4gfSBTZWxlY3RzIG5ldHdvcmsgdHlwZSBmb3IKKyAgICAgICAgICBzdWJzZXF1ZW50IFNFVCBIT1NUIGNvbW1hbmRzLgorICAgICAgICAgIFNFVCBIT1NUIFsgb3B0aW9ucyBdIGhvc3QgWyBwb3J0IF0gT3BlbnMgYSBuZXR3b3JrIGNvbm5lY3Rpb24KKyAgICAgICAgICB0byB0aGUgZ2l2ZW4gaG9zdCBhbmQgcG9ydC4KKyAgICAgICAgICBTRVQgSE9TVCBbIG9wdGlvbnMgXSAqIHBvcnQgV2FpdHMgZm9yIGFuIGluY29taW5nIFRDUC9JUAorICAgICAgICAgIGNvbm5lY3Rpb24gb24gdGhlIGdpdmVuIHBvcnQuCisgICAgICAgICAgVEVMTkVUIFsgb3B0aW9ucyBdIGhvc3QgT3BlbnMgYSBUZWxuZXQgY29ubmVjdGlvbiB0byB0aGUgaG9zdAorICAgICAgICAgIGFuZCBlbnRlcnMgQ29ubmVjdCBzdGF0ZS4KKyAgICAgICAgICBSTE9HSU4gWyBvcHRpb25zIF0gaG9zdCBPcGVucyBhbiBSbG9naW4gY29ubmVjdGlvbiB0byB0aGUgaG9zdAorICAgICAgICAgIGFuZCBlbnRlcnMgQ29ubmVjdCBzdGF0ZS4KKyAgICAgICAgICBJS1NEIFsgb3B0aW9ucyBdIGhvc3QgT3BlbnMgYSBjb25uZWN0aW9uIHRvIGFuIEludGVybmV0IEtlcm1pdAorICAgICAgICAgIFNlcnZpY2UuCisgICAgICAgICAgU1NIIFsgb3B0aW9ucyBdIGhvc3QgT3BlbnMgYW4gU1NIIGNvbm5lY3Rpb24gdG8gdGhlIGhvc3QgYW5kCisgICAgICAgICAgZW50ZXJzIENvbm5lY3Qgc3RhdGUuCisgICAgICAgICAgRlRQIE9QRU4gaG9zdCBbIG9wdGlvbnMgXSBPcGVucyBhbiBGVFAgY29ubmVjdGlvbiB0byB0aGUgaG9zdC4KKyAgICAgICAgICBIVFRQIFsgb3B0aW9ucyBdIE9QRU4gaG9zdCBPcGVucyBhbiBIVFRQIGNvbm5lY3Rpb24gdG8gdGhlCisgICAgICAgICAgaG9zdC4KKyAgICAgICAgICBQVFkgZXh0ZXJuYWwtY29tbWFuZCBSdW5zIHRoZSBjb21tYW5kIG9uIGEgcHNldWRvdGVybWluYWwgYXMgaWYKKyAgICAgICAgICBpdCB3ZXJlIGEgY29ubmVjdGlvbi4KKyAgICAgICAgICBQSVBFIGV4dGVybmFsLWNvbW1hbmQgUnVucyB0aGUgY29tbWFuZCB0aHJvdWdoIGEgcGlwZSBhcyBpZiBpdAorICAgICAgICAgIHdlcmUgYSBjb25uZWN0aW9uLgorICAgICAgICAgIAorICAgVXNpbmcgQ29ubmVjdGlvbnMKKyAgICAgICAgICBDT05ORUNUIFsgb3B0aW9ucyBdICAgICAgICAgICAgICAgICAgICBFbnRlcnMgQ29ubmVjdAorICAgICAgICAgICh0ZXJtaW5hbCkgc3RhdGUuIFN5bm9ueW06IEMuCisgICAgICAgICAgUkVESVJFQ1QgY29tbWFuZCBSZWRpcmVjdHMgdGhlIGdpdmVuIGV4dGVybmFsIGNvbW1hbmQgb3ZlciB0aGUKKyAgICAgICAgICBjb25uZWN0aW9uLgorICAgICAgICAgIFRFTE9QVCBjb21tYW5kIFNlbmRzIGEgVGVsbmV0IHByb3RvY29sIGNvbW1hbmQgKFRlbG5ldAorICAgICAgICAgIGNvbm5lY3Rpb25zIG9ubHkpLgorICAgICAgICAgIEN0cmwtXEMgIkVzY2FwZXMgYmFjayIgZnJvbSBDb25uZWN0IHN0YXRlIHRvIENvbW1hbmQgc3RhdGUuCisgICAgICAgICAgQ3RybC1cQiAoSW4gQ29ubmVjdCBzdGF0ZSkgU2VuZHMgYSBCUkVBSyBzaWduYWwgKHNlcmlhbCBvcgorICAgICAgICAgIFRlbG5ldCkuCisgICAgICAgICAgQ3RybC1cISAoSW4gQ29ubmVjdCBzdGF0ZSkgRW50ZXJzIGluZmVyaW9yIHNoZWxsOyAiZXhpdCIgdG8KKyAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgQ3RybC1cPyAoSW4gQ29ubmVjdCBzdGF0ZSkgU2hvd3MgYSBtZW51IG9mIG90aGVyIGVzY2FwZS1sZXZlbAorICAgICAgICAgIG9wdGlvbnMuCisgICAgICAgICAgQ3RybC1cQ3RybC1cIChJbiBDb25uZWN0IHN0YXRlKSBUeXBlIHR3byBDdHJsLUJhY2tzbGFzaGVzIHRvCisgICAgICAgICAgc2VuZCBvbmUgb2YgdGhlbS4KKyAgICAgICAgICBTRVQgRVNDQVBFIFsgY2hhcmFjdGVyIF0gQ2hhbmdlcyBLZXJtaXQncyBDb25uZWN0LXN0YXRlIGVzY2FwZQorICAgICAgICAgIGNoYXJhY3Rlci4KKyAgICAgICAgICAKKyAgIENsb3NpbmcgQ29ubmVjdGlvbnMKKyAgICAgICAgICBIQU5HVVAgSGFuZ3MgdXAgdGhlIGN1cnJlbnRseSBvcGVuIHNlcmlhbC1wb3J0IG9yIG5ldHdvcmsKKyAgICAgICAgICBjb25uZWN0aW9uLgorICAgICAgICAgIENMT1NFIENsb3NlcyB0aGUgY3VycmVudGx5IG9wZW4gc2VyaWFsLXBvcnQgb3IgbmV0d29yaworICAgICAgICAgIGNvbm5lY3Rpb24uCisgICAgICAgICAgU0VUIExJTkUgKHdpdGggbm8gZGV2aWNlbmFtZSkgICAgICAgICAgQ2xvc2VzIHRoZSBjdXJyZW50bHkKKyAgICAgICAgICBvcGVuIHNlcmlhbC1wb3J0IG9yIG5ldHdvcmsgY29ubmVjdGlvbi4KKyAgICAgICAgICBTRVQgSE9TVCAod2l0aCBubyBob3N0bmFtZSkgQ2xvc2VzIHRoZSBjdXJyZW50bHkgb3BlbgorICAgICAgICAgIHNlcmlhbC1wb3J0IG9yIG5ldHdvcmsgY29ubmVjdGlvbi4KKyAgICAgICAgICBGVFAgQ0xPU0UgQ2xvc2VzIHRoZSBjdXJyZW50bHkgb3BlbiBGVFAgY29ubmVjdGlvbi4KKyAgICAgICAgICBIVFRQIENMT1NFIENsb3NlcyB0aGUgY3VycmVudGx5IG9wZW4gSFRUUCBjb25uZWN0aW9uLgorICAgICAgICAgIEVYSVQgQWxzbyBjbG9zZXMgYWxsIGNvbm5lY3Rpb25zLiBTeW5vbnltOiBRVUlULgorICAgICAgICAgIFNFVCBFWElUIFdBUk5JTkcgT0ZGIFN1cHByZXNzZXMgd2FybmluZyBhYm91dCBvcGVuIGNvbm5lY3Rpb25zCisgICAgICAgICAgb24gZXhpdCBvciBjbG9zZS4KKyAgICAgICAgICAKKyAgIEZpbGUgVHJhbnNmZXIKKyAgICAgICAgICBTRU5EIFsgb3B0aW9ucyBdIGZpbGVuYW1lIFsgYXMtbmFtZSBdICBTZW5kcyB0aGUgZ2l2ZW4gZmlsZS4KKyAgICAgICAgICBTeW5vbnltOiBTLgorICAgICAgICAgIFNFTkQgWyBvcHRpb25zIF0gZmlsZXNwZWMgU2VuZHMgYWxsIGZpbGVzIHRoYXQgbWF0Y2guCisgICAgICAgICAgUkVTRU5EIFsgb3B0aW9ucyBdIGZpbGVzcGVjIFJlc3VtZXMgYW4gaW50ZXJ1cHRlZCBTRU5EIGZyb20gdGhlCisgICAgICAgICAgcG9pbnQgb2YgZmFpbHVyZS4KKyAgICAgICAgICBSRUNFSVZFIFsgb3B0aW9ucyBdIFsgYXMtbmFtZSBdIFdhaXRzIHBhc3NpdmVseSBmb3IgZmlsZXMgdG8KKyAgICAgICAgICBhcnJpdmUuIFN5bm9ueW06IFIuCisgICAgICAgICAgTE9HIFRSQU5TQUNUSU9OUyBbIGZpbGVuYW1lIF0gS2VlcHMgYSByZWNvcmQgb2YgZmlsZSB0cmFuc2ZlcnMuCisgICAgICAgICAgRkFTVCBVc2UgZmFzdCBmaWxlLXRyYW5zZmVyIHNldHRpbmdzIChkZWZhdWx0KS4KKyAgICAgICAgICBDQVVUSU9VUyBVc2UgY2F1dGlvdXMgYW5kIGxlc3MgZmFzdCBmaWxlLXRyYW5zZmVyIHNldHRpbmdzLgorICAgICAgICAgIFJPQlVTVCBVc2UgdWx0cmEtY29uc2VydmF0aXZlIGFuZCBzbG93IGZpbGUtdHJhbnNmZXIgc2V0dGluZ3MuCisgICAgICAgICAgU1RBVElTVElDUyBbIG9wdGlvbnMgXSBHaXZlcyBzdGF0aXN0aWNzIGFib3V0IHRoZSBtb3N0IHJlY2VudAorICAgICAgICAgIGZpbGUgdHJhbnNmZXIuCisgICAgICAgICAgV0hFUkUgQWZ0ZXIgdHJhbnNmZXI6ICJXaGVyZSBkaWQgbXkgZmlsZXMgZ28/Ii4KKyAgICAgICAgICBUUkFOU01JVCBbIG9wdGlvbnMgXSBbIGZpbGVuYW1lIF0gU2VuZHMgZmlsZSB3aXRob3V0IHByb3RvY29sLgorICAgICAgICAgIFN5bm9ueW06IFhNSVQuCisgICAgICAgICAgTE9HIFNFU1NJT04gWyBmaWxlbmFtZSBdIENhcHR1cmVzIHJlbW90ZSB0ZXh0IG9yIGZpbGVzIHdpdGhvdXQKKyAgICAgICAgICBwcm90b2NvbC4KKyAgICAgICAgICBTRVQgUFJPVE9DT0wgWyBuYW1lLi4uIF0gVGVsbHMgS2VybWl0IHRvIHVzZSBhbiBleHRlcm5hbAorICAgICAgICAgIGZpbGUtdHJhbnNmZXIgcHJvdG9jb2wuCisgICAgICAgICAgRlRQIHsgUFVULCBNUFVULCBHRVQsIE1HRVQsIC4uLiB9IEZUUCBjbGllbnQgY29tbWFuZHMuCisgICAgICAgICAgSFRUUCB7IFBVVCwgR0VULCBIRUFELCBQT1NULCAuLi4gfSBIVFRQIGNsaWVudCBjb21tYW5kcy4KKyAgICAgICAgICAKKyAgIEtlcm1pdCBTZXJ2ZXIKKyAgICAgICAgICBFTkFCTEUsIERJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9scyB3aGljaCBmZWF0dXJlcworICAgICAgICAgIGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMuCisgICAgICAgICAgU0VUIFNFUlZFUiBTZXRzIHBhcmFtZXRlcnMgcHJpb3IgdG8gZW50ZXJpbmcgU2VydmVyIHN0YXRlLgorICAgICAgICAgIFNFUlZFUiBFbnRlcnMgU2VydmVyIHN0YXRlLgorICAgICAgICAgIAorICAgQ2xpZW50IG9mIEtlcm1pdCBvciBGVFAgU2VydmVyCisgICAgICAgICAgWyBSRU1PVEUgXSBMT0dJTiBbIHVzZXIgcGFzc3dvcmQgXSBMb2dzIGluIHRvIGEgS2VybWl0IHNlcnZlcgorICAgICAgICAgIG9yIElLU0QgdGhhdCByZXF1aXJlcyBpdC4KKyAgICAgICAgICBbIFJFTU9URSBdIExPR09VVCBMb2dzIG91dCBmcm9tIGEgS2VybWl0IHNlcnZlciBvciBJS1NELgorICAgICAgICAgIFNFTkQgWyBvcHRpb25zIF0gZmlsZW5hbWUgWyBhcy1uYW1lIF0gIFNlbmRzIHRoZSBnaXZlbiBmaWxlIHRvCisgICAgICAgICAgdGhlIHNlcnZlci4gU3lub255bXM6IFMsIFBVVC4KKyAgICAgICAgICBTRU5EIFsgb3B0aW9ucyBdIGZpbGVzcGVjIFNlbmRzIGFsbCBmaWxlcyB0aGF0IG1hdGNoLgorICAgICAgICAgIFJFU0VORCBbIG9wdGlvbnMgXSBmaWxlc3BlYyBSZXN1bWVzIGFuIGludGVydXB0ZWQgU0VORCBmcm9tIHRoZQorICAgICAgICAgIHBvaW50IG9mIGZhaWx1cmUuCisgICAgICAgICAgR0VUIFsgb3B0aW9ucyBdIHJlbW90ZS1maWxlc3BlYyBBc2tzIHRoZSBzZXJ2ZXIgdG8gc2VuZCB0aGUKKyAgICAgICAgICBnaXZlbiBmaWxlcy4gU3lub255bTogRy4KKyAgICAgICAgICBSRUdFVCBbIG9wdGlvbnMgXSByZW1vdGUtZmlsZXNwZWMgUmVzdW1lcyBhbiBpbnRlcnJ1cHRlZCBHRVQKKyAgICAgICAgICBmcm9tIHRoZSBwb2ludCBvZiBmYWlsdXJlLgorICAgICAgICAgIFJFTU9URSBDRCBbIGRpcmVjdG9yeSBdIEFza3Mgc2VydmVyIHRvIGNoYW5nZSBpdHMgd29ya2luZworICAgICAgICAgIGRpcmVjdG9yeS4gU3lub255bTogUkNELgorICAgICAgICAgIFJFTU9URSBQV0QgWyBkaXJlY3RvcnkgXSBBc2tzIHNlcnZlciB0byBkaXNwbGF5IGl0cyB3b3JraW5nCisgICAgICAgICAgZGlyZWN0b3J5LiBTeW5vbnltOiBSUFdELgorICAgICAgICAgIFJFTU9URSBESVJFQ1RPUlkgWyBmaWxlc3BlYy4uLiBdIEFza3Mgc2VydmVyIHRvIHNlbmQgYQorICAgICAgICAgIGRpcmVjdG9yeSBsaXN0aW5nLiBTeW5vbnltOiBSRElSLgorICAgICAgICAgIFJFTU9URSBERUxFVEUgWyBmaWxlc3BlYy4uLiBdIEFza3Mgc2VydmVyIHRvIGRlbGV0ZSBmaWxlcy4KKyAgICAgICAgICBTeW5vbnltOiBSREVMLgorICAgICAgICAgIFJFTU9URSBbIGNvbW1hbmQuLi4gXSAoTWFueSBvdGhlciBjb21tYW5kczogInJlbW90ZSA/IiBmb3IgYQorICAgICAgICAgIGxpc3QpLgorICAgICAgICAgIE1BSUwgWyBvcHRpb25zIF0gZmlsZXNwZWMgU2VuZHMgZmlsZShzKSB0byBiZSBkZWxpdmVyZWQgYXMKKyAgICAgICAgICBlLW1haWwgKEtlcm1pdCBvbmx5KS4KKyAgICAgICAgICBGSU5JU0ggQXNrcyB0aGUgc2VydmVyIHRvIGV4aXQgc2VydmVyIHN0YXRlIChLZXJtaXQgb25seSkuCisgICAgICAgICAgQllFIEFza3MgdGhlIHNlcnZlciB0byBsb2cgb3V0IGFuZCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICAKKyAgIFNjcmlwdCBQcm9ncmFtbWluZworICAgICAgICAgIERFRklORSwgREVDTEFSRSwgVU5ERUZJTkUsIFVOREVDTEFSRSwgQVNTSUdOLCBFVkFMVUFURSwKKyAgICAgICAgICBTRVhQUkVTU0lPTiwgQVJSQVksIFNPUlQsIElOUFVULCBPVVRQVVQsIElGLCBGT1IsIFdISUxFLAorICAgICAgICAgIFNXSVRDSCwgR09UTywgRUNITywgQVNLLCBHRVRDLCBHRVRPSywgQVNTRVJULCBXQUlULCBTTEVFUCwKKyAgICAgICAgICBGT1BFTiwgRlJFQUQsIEZXUklURSwgRkNMT1NFLCBTVE9QLCBFTkQsIFJFVFVSTiwgTEVBUk4sIFNISUZULAorICAgICAgICAgIFRSQUNFLCBWT0lELCBJTkNSRU1FTlQsIERFQ1JFTUVOVCwgLi4uIEZvciB0aGVzZSBhbmQgbWFueSBtb3JlCisgICAgICAgICAgeW91J2xsIG5lZWQgdG8gY29uc3VsdCB0aGUgWzY4XW1hbnVhbCBhbmQgc3VwcGxlbWVudHMsIGFuZC9vcgorICAgICAgICAgIHZpc2l0IHRoZSBbNjldS2VybWl0IFNjcmlwdCBMaWJyYXJ5LCB3aGljaCBhbHNvIGluY2x1ZGVzIGEKKyAgICAgICAgICBicmllZiB0dXRvcmlhbC4gSGludDogSEVMUCBMRUFSTiB0byBmaW5kIG91dCBob3cgdG8gZ2V0IEtlcm1pdAorICAgICAgICAgIHRvIHdyaXRlIHNpbXBsZSBzY3JpcHRzIGZvciB5b3UuCisgICAgICAgICAgCisgICBNYW55IG9mIEtlcm1pdCdzIGNvbW1hbmRzIGhhdmUgc3lub255bXMsIHZhcmlhbnRzLCByZWxhdGl2ZXMsIGFuZCBzbworICAgb24uIEZvciBleGFtcGxlLCBNU0VORCBpcyBhIHZlcnNpb24gb2YgU0VORCB0aGF0IGFjY2VwdHMgYSBsaXN0IG9mCisgICBmaWxlIHNwZWNpZmljYXRpb25zIHRvIGJlIHNlbnQsIHJhdGhlciB0aGFuIGp1c3Qgb25lIGZpbGUKKyAgIHNwZWNpZmljYXRpb24sIGFuZCBNUFVUIGlzIGEgc3lub255bSBvZiBNU0VORC4gTU9WRSBtZWFucyB0byBTRU5EIGFuZAorICAgdGhlbiBERUxFVEUgdGhlIHNvdXJjZSBmaWxlIGlmIHN1Y2Nlc3NmdWwuIE1NT1ZFIGlzIGxpa2UgTU9WRSwgYnV0CisgICBhY2NlcHRzIGEgbGlzdCBvZiBmaWxlc3BlY3MsIGFuZCBzbyBvbi4gVGhlc2UgYXJlIGRlc2NyaWJlZCBpbiB0aGUKKyAgIFs3MF1mdWxsIGRvY3VtZW50YXRpb24uCisgICAKKyAgIFVzZSBxdWVzdGlvbiBtYXJrIHRvIGZlZWwgeW91ciB3YXkgdGhyb3VnaCBhbiB1bmZhbWlsaWFyIGNvbW1hbmQsIGFzCisgICBpbiB0aGlzIGV4YW1wbGUgKHRoZSBwYXJ0IHlvdSB0eXBlIGlzIHVuZGVybGluZWQpOgorICAgCisgIEMtS2VybWl0PiByZW1vdGUgPyBPbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgIGFzc2lnbiAgICAgZGVsZXRlICAgICBoZWxwICAgICAgIGxvZ2luICAgICAgcHJpbnQgICAgICByZW5hbWUgICAgIHNwYWNlCisgICBjZCAgICAgICAgIGRpcmVjdG9yeSAgaG9zdCAgICAgICBsb2dvdXQgICAgIHB3ZCAgICAgICAgcm1kaXIgICAgICB0eXBlCisgICBjb3B5ICAgICAgIGV4aXQgICAgICAga2VybWl0ICAgICBta2RpciAgICAgIHF1ZXJ5ICAgICAgc2V0ICAgICAgICB3aG8KKyAgQy1LZXJtaXQ+IHJlbW90ZSBzZXQgPyBPbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgIGF0dHJpYnV0ZXMgICBmaWxlICAgICAgICAgcmV0cnkgICAgICAgIHRyYW5zZmVyCisgICBibG9jay1jaGVjayAgcmVjZWl2ZSAgICAgIHNlcnZlciAgICAgICB3aW5kb3cKKyAgQy1LZXJtaXQ+IHJlbW90ZSBzZXQgZmlsZSA/IE9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgY2hhcmFjdGVyLXNldCAgaW5jb21wbGV0ZSAgICAgcmVjb3JkLWxlbmd0aAorICAgY29sbGlzaW9uICAgICAgbmFtZXMgICAgICAgICAgdHlwZQorICBDLUtlcm1pdD4gcmVtb3RlIHNldCBmaWxlIG5hbWVzID8gT25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICBjb252ZXJ0ZWQgIGxpdGVyYWwKKyAgQy1LZXJtaXQ+IHJlbW90ZSBzZXQgZmlsZSBuYW1lcyBsaXRlcmFsCisgIEMtS2VybWl0PgorCisgICBUaGlzIGlzIGNhbGxlZCBtZW51IG9uIGRlbWFuZDogeW91IGdldCBhIG1lbnUgd2hlbiB5b3Ugd2FudCBvbmUsIGJ1dAorICAgbWVudXMgYXJlIG5vdCBmb3JjZWQgb24geW91IGV2ZW4gd2hlbiBrbm93IHdoYXQgeW91J3JlIGRvaW5nLiBOb3RlCisgICB0aGF0IHlvdSBjYW4gYWxzbyBhYmJyZXZpYXRlIG1vc3Qga2V5d29yZHMsIGFuZCB5b3UgY2FuIGNvbXBsZXRlIHRoZW0KKyAgIHdpdGggdGhlIFRhYiBvciBFc2Mga2V5LiBBbHNvIG5vdGUgdGhhdCA/IHdvcmtzIGZvciBmaWxlbmFtZXMgdG9vLCBhbmQKKyAgIHRoYXQgeW91IGNhbiB1c2UgaXQgaW4gdGhlIG1pZGRsZSBvZiBhIGtleXdvcmQgb3IgZmlsZW5hbWUsIG5vdCBqdXN0CisgICBhdCB0aGUgYmVnaW5uaW5nLiBGb3IgZXhhbXBsZSwgInNlbmQgeD8iIGxpc3RzIGFsbCB0aGUgZmlsZXMgaW4gdGhlCisgICBjdXJyZW50IGRpcmVjdG9yeSB3aG9zZSBuYW1lcyBzdGFydCB3aXRoICd4Jy4KKyAgIAorICAgWyBbNzFdS2VybWl0IEhvbWUgXSBbIFs3Ml1DLUtlcm1pdCBIb21lIF0gWyBbNzNdQy1LZXJtaXQgRkFRIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgCisgIElOSVRJQUxJWkFUSU9OIEZJTEUgWyBbNzRdVG9wIF0gWyBbNzVdQ29udGVudHMgXSBbIFs3Nl1OZXh0IF0gWyBbNzddUHJldmlvdXMKKyAgXQorICAKKyAgIEluIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIEMtS2VybWl0IGV4ZWN1dGVzIGNvbW1hbmRzIGZyb20gYSBmaWxlCisgICBjYWxsZWQgLmtlcm1yYyBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5IHdoZW4gaXQgc3RhcnRzLCB1bmxlc3MgaXQgaXMKKyAgIGdpdmVuIHRoZSAtWSBvciAteSBjb21tYW5kLWxpbmUgb3B0aW9uLiBDdXN0b20gY29uZmlndXJhdGlvbnMgbWlnaHQKKyAgIHN1YnN0aXR1dGUgYSBzaGFyZWQgc3lzdGVtLXdpZGUgaW5pdGlhbGl6YXRpb24gZmlsZS4gVGhlIFNIT1cgRklMRQorICAgY29tbWFuZCB0ZWxscyB3aGF0IGluaXRpYWxpemF0aW9uIGZpbGUsIGlmIGFueSwgd2FzIHVzZWQuIFRoZSBzdGFuZGFyZAorICAgaW5pdGlhbGl6YXRpb24gZmlsZSAiY2hhaW5zIiB0byBhbiBpbmRpdmlkdWFsIGN1c3RvbWl6YXRpb24gZmlsZSwKKyAgIC5teWtlcm1jLCBpbiB0aGUgaG9tZSBkaXJlY3RvcnksIGluIHdoaWNoIGVhY2ggdXNlciBjYW4gZXN0YWJsaXNoCisgICBoZXIvaGlzIG93biBwcmVmZXJlbmNlcywgZGVmaW5lIG1hY3JvcywgYW5kIHNvIG9uLgorICAgCisgICBTaW5jZSBleGVjdXRpb24gb2YgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgKGF0IGxlYXN0IHRoZSBzdGFuZGFyZCBvbmUpCisgICBtYWtlcyBDLUtlcm1pdCB0YWtlIGxvbmdlciB0byBzdGFydCwgaXQgbWlnaHQgYmUgYmV0dGVyIG5vdCB0byBoYXZlIGFuCisgICBpbml0aWFsaXphdGlvbiBmaWxlLCBlc3BlY2lhbGx5IG5vdyB0aGF0IEtlcm1pdCdzIGRlZmF1bHQgc3RhcnR1cAorICAgY29uZmlndXJhdGlvbiBpcyB3ZWxsIGF0dHVuZWQgdG8gbW9kZXJuIGNvbXB1dGluZyBhbmQgbmV0d29ya2luZyAtLSBpbgorICAgb3RoZXIgd29yZHMsIHlvdSBubyBsb25nZXIgaGF2ZSBkbyBhbnl0aGluZyBzcGVjaWFsIHRvIG1ha2UgS2VybWl0CisgICB0cmFuc2ZlcnMgZ28gZmFzdC4gU28gaW5zdGVhZCBvZiBoYXZpbmcgYW4gaW5pdGlhbGl6YXRpb24gZmlsZSB0aGF0IGlzCisgICBleGVjdXRlZCBldmVyeSB0aW1lIEtlcm1pdCBzdGFydHMsIHlvdSBtaWdodCBjb25zaWRlciBtYWtpbmcgb25lIG9yCisgICBtb3JlIGtlcmJhbmcgc2NyaXB0cyAod2l0aCBuYW1lcyBvdGhlciB0aGF0IC5rZXJtcmMpIHRoYXQgZG8gTk9UCisgICBpbmNsdWRlIGFuICJleGl0IiBjb21tYW5kLCBhbmQgaW52b2tlIHRob3NlIHdoZW4geW91IG5lZWQgdGhlCisgICBzZXR0aW5ncywgbWFjcm8gZGVmaW5pdGlvbnMsIGFuZC9vciBzY3JpcHRlZCBhY3Rpb25zIHRoZXkgY29udGFpbiwgYW5kCisgICBpbnZva2UgQy1LZXJtaXQgZGlyZWN0bHkgd2hlbiB5b3UgZG9uJ3QuCisgICAKKyAgIFRvIHB1dCBpdCBhbm90aGVyIHdheS4uLiBXZSBzdGlsbCBkaXN0cmlidXRlIHRoZSBzdGFuZGFyZAorICAgaW5pdGlhbGl6YXRpb24gZmlsZSBzaW5jZSBpdCdzIGZlYXR1cmVkIGluIHRoZSBtYW51YWwgYW5kIGJhY2t3YXJkcworICAgY29tcGF0aWJpbGl0eSBpcyBpbXBvcnRhbnQgdG8gdXMuIEJ1dCB0aGVyZSdzIG5vIGhhcm0gaW4gbm90IHVzaW5nIGl0CisgICBpZiB5b3UgZG9uJ3QgbmVlZCB0aGUgc3R1ZmYgdGhhdCdzIGluIGl0IChzZXJ2aWNlcyBkaXJlY3RvcnksIGRpYWxpbmcKKyAgIGRpcmVjdG9yeSwgbmV0d29yayBkaXJlY3RvcnksIGFuZCBhc3NvY2lhdGVkIG1hY3JvIGRlZmluaXRpb25zKS4gT24KKyAgIHRoZSBvdGhlciBoYW5kLCBpZiB0aGVyZSBhcmUgc2V0dGluZ3Mgb3IgbWFjcm9zIHlvdSB3YW50IGluIGVmZmVjdAorICAgRVZFUlkgdGltZSB5b3UgdXNlIEtlcm1pdCwgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgKG9yIHRoZQorICAgY3VzdG9taXphdGlvbiBmaWxlIGl0IGNoYWlucyB0bykgaXMgdGhlIHBsYWNlIHRvIHB1dCB0aGVtLCBiZWNhdXNlCisgICB0aGF0J3MgdGhlIG9ubHkgcGxhY2UgS2VybWl0IGxvb2tzIGZvciB0aGVtIGF1dG9tYXRpY2FsbHkgZWFjaCB0aW1lCisgICB5b3Ugc3RhcnQgaXQuCisgICAKKyAgIFsgWzc4XUtlcm1pdCBIb21lIF0gWyBbNzldQy1LZXJtaXQgSG9tZSBdIFsgWzgwXUMtS2VybWl0IEZBUSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgIAorICBNT0RFUyBPRiBPUEVSQVRJT04gWyBbODFdVG9wIF0gWyBbODJdQ29udGVudHMgXSBbIFs4M11OZXh0IF0gWyBbODRdUHJldmlvdXMgXQorICAKKyAgIEtlcm1pdCBpcyBzYWlkIHRvIGJlIGluIExvY2FsIG1vZGUgaWYgaXQgaGFzIG1hZGUgYSBjb25uZWN0aW9uIHRvCisgICBhbm90aGVyIGNvbXB1dGVyLCBlLmcuIGJ5IGRpYWxpbmcgaXQgb3IgZXN0YWJsaXNoaW5nIGEgVGVsbmV0CisgICBjb25uZWN0aW9uIHRvIGl0LiBUaGUgb3RoZXIgY29tcHV0ZXIgaXMgcmVtb3RlLCBzbyBpZiB5b3Ugc3RhcnQKKyAgIGFub3RoZXIgY29weSBvZiBLZXJtaXQgb24gdGhlIHJlbW90ZSBjb21wdXRlciwgaXQgaXMgc2FpZCB0byBiZSBpbgorICAgUmVtb3RlIG1vZGUgKGFzIGxvbmcgYXMgaXQgaGFzIG5vdCBtYWRlIGFueSBjb25uZWN0aW9ucyBvZiBpdHMgb3duKS4KKyAgIFRoZSBsb2NhbCBLZXJtaXQgY29tbXVuaWNhdGVzIG92ZXIgdGhlIGNvbW11bmljYXRpb25zIGRldmljZSBvcgorICAgbmV0d29yayBjb25uZWN0aW9uLCBhY3RpbmcgYXMgYSBjb25kdWl0IGJldHdlZW4gdGhlIHRoZSByZW1vdGUKKyAgIGNvbXB1dGVyIGFuZCB5b3VyIGtleWJvYXJkIGFuZCBzY3JlZW4uIFRoZSByZW1vdGUgS2VybWl0IGlzIHRoZQorICAgZmlsZS10cmFuc2ZlciBwYXJ0bmVyIHRvIHRoZSBsb2NhbCBLZXJtaXQgYW5kIGNvbW11bmljYXRlcyBvbmx5CisgICB0aHJvdWdoIGl0cyBzdGFuZGFyZCBpbnB1dCBhbmQgb3V0cHV0LgorICAgCisgICBBdCBhbnkgbW9tZW50LCBhIEtlcm1pdCBwcm9ncmFtIGNhbiBiZSBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBzdGF0ZXMuCisgICBJdCdzIGltcG9ydGFudCB0byBrbm93IHdoYXQgdGhleSBhcmUgYW5kIGhvdyB0byBjaGFuZ2UgZnJvbSBvbmUgdG8gdGhlCisgICBvdGhlci4KKyAgIAorICAgQ29tbWFuZCBzdGF0ZQorICAgICAgICAgIAorICAgICAgICAgIEluIHRoaXMgc3RhdGUsIEtlcm1pdCByZWFkcyBjb21tYW5kcyBmcm9tOgorICAgICAgICAgIAorICAgICAgICAgICsgWW91ciBrZXlib2FyZDsgb3I6CisgICAgICAgICAgKyBBIGZpbGUsIG9yOgorICAgICAgICAgICsgQSBtYWNybyBkZWZpbml0aW9uLgorICAgICAgICAgICAgCisgICAgICAgICAgWW91IGNhbiBleGl0IGZyb20gQ29tbWFuZCBzdGF0ZSBiYWNrIHRvIFVuaXggd2l0aCB0aGUgRVhJVCBvcgorICAgICAgICAgIFFVSVQgY29tbWFuZCAoc2FtZSB0aGluZykuIFlvdSBjYW4gZW50ZXIgQ29ubmVjdCBzdGF0ZSB3aXRoIGFueQorICAgICAgICAgIG9mIHZhcmlvdXMgY29tbWFuZHMgKENPTk5FQ1QsIERJQUwsIFRFTE5FVCwgZXRjKS4gWW91IGNhbiBlbnRlcgorICAgICAgICAgIGZpbGUgdHJhbnNmZXIgc3RhdGUgd2l0aCBjb21tYW5kcyBsaWtlIFNFTkQsIFJFQ0VJVkUsIGFuZCBHRVQuCisgICAgICAgICAgWW91IGNhbiBlbnRlciBTZXJ2ZXIgc3RhdGUgd2l0aCB0aGUgU0VSVkVSIGNvbW1hbmQuIFRoZSBUQUtFCisgICAgICAgICAgY29tbWFuZCB0ZWxscyBLZXJtaXQgdG8gcmVhZCBhbmQgZXhlY3V0ZSBjb21tYW5kcyBmcm9tIGEgZmlsZS4KKyAgICAgICAgICBUaGUgKHBlcmhhcHMgaW1wbGllZCkgRE8gY29tbWFuZCB0ZWxscyBLZXJtaXQgdG8gcmVhZCBhbmQKKyAgICAgICAgICBleGVjdXRlIGNvbW1hbmRzIGZyb20gYSBtYWNybyBkZWZpbml0aW9uLiBXaGlsZSBpbiBDb21tYW5kCisgICAgICAgICAgc3RhdGUsIHlvdSBjYW4gaW50ZXJydXB0IGFueSBjb21tYW5kLCBtYWNybywgb3IgY29tbWFuZCBmaWxlIGJ5CisgICAgICAgICAgdHlwaW5nIEN0cmwtQyAoaG9sZCBkb3duIHRoZSBDdHJsIGtleSBhbmQgcHJlc3MgdGhlIEMga2V5KTsKKyAgICAgICAgICB0aGlzIG5vcm1hbGx5IGJyaW5ncyB5b3UgYmFjayB0byB0aGUgcHJvbXB0LgorICAgICAgICAgIAorICAgU2hlbGwgc3RhdGUKKyAgICAgICAgICAKKyAgICAgICAgICBZb3UgY2FuIGludm9rZSBhbiBpbmZlcmlvciBzaGVsbCBvciBleHRlcm5hbCBjb21tYW5kIGZyb20gdGhlCisgICAgICAgICAgS2VybWl0IGNvbW1hbmQgcHJvbXB0IGJ5IHVzaW5nIHRoZSBQVVNILCBSVU4gKCEpLCBFRElULCBvcgorICAgICAgICAgIEJST1dTRSBjb21tYW5kLiBXaGlsZSB0aGUgaW5mZXJpb3Igc2hlbGwgb3IgY29tbWFuZCBpcyBhY3RpdmUsCisgICAgICAgICAgS2VybWl0IGlzIHN1c3BlbmRlZCBhbmQgZG9lcyBub3RoaW5nLiBSZXR1cm4gdG8gS2VybWl0IENvbW1hbmQKKyAgICAgICAgICBzdGF0ZSBieSBleGl0aW5nIGZyb20gdGhlIGluZmVyaW9yIHNoZWxsIG9yIGFwcGxpY2F0aW9uLgorICAgICAgICAgIAorICAgQ29ubmVjdCBzdGF0ZQorICAgICAgICAgIAorICAgICAgICAgIEluIHRoaXMgc3RhdGUsIHdoaWNoIGNhbiBiZSBlbnRlcmVkIG9ubHkgd2hlbiBpbiBMb2NhbCBtb2RlCisgICAgICAgICAgKGkuZS4gd2hlbiBLZXJtaXQgaGFzIG1hZGUgYSBjb25uZWN0aW9uIHRvIGFub3RoZXIgY29tcHV0ZXIpLAorICAgICAgICAgIEtlcm1pdCBpcyBhY3RpbmcgYXMgYSB0ZXJtaW5hbCB0byB0aGUgcmVtb3RlIGNvbXB1dGVyLiBZb3VyCisgICAgICAgICAga2V5c3Ryb2tlcyBhcmUgc2VudCB0byB0aGUgcmVtb3RlIGNvbXB1dGVyIGFuZCBjaGFyYWN0ZXJzIHRoYXQKKyAgICAgICAgICBhcnJpdmUgb3ZlciB0aGUgY29tbXVuaWNhdGlvbiBjb25uZWN0aW9uIGFyZSBkaXNwbGF5ZWQgb24geW91cgorICAgICAgICAgIHNjcmVlbi4gVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIHdoZW4geW91IGdpdmUgYSBDT05ORUNULCBESUFMLAorICAgICAgICAgIFRFTE5FVCwgUkxPR0lOLCBvciBJS1NEIGNvbW1hbmQuIFlvdSBjYW4gcmV0dXJuIHRvIGNvbW1hbmQKKyAgICAgICAgICBzdGF0ZSBieSBsb2dnaW5nIG91dCBvZiB0aGUgcmVtb3RlIGNvbXB1dGVyLCBvciBieSB0eXBpbmc6CisgICAgICAgICAgCisgIEN0cmwtXGMKKworICAgICAgICAgIFRoYXQgaXM6IEhvbGQgZG93biB0aGUgQ3RybCBrZXkgYW5kIHByZXNzIHRoZSBiYWNrc2xhc2gga2V5LAorICAgICAgICAgIHRoZW4gbGV0IGdvIG9mIHRoZSBDdHJsIGtleSBhbmQgcHJlc3MgdGhlIEMga2V5LiBUaGlzIGlzIGNhbGxlZAorICAgICAgICAgIGVzY2FwaW5nIGJhY2suIENlcnRhaW4gb3RoZXIgZXNjYXBlLWxldmVsIGNvbW1hbmRzIGFyZSBhbHNvCisgICAgICAgICAgcHJvdmlkZWQ7IHR5cGUgQ3RybC1cPyBmb3IgYSBsaXN0LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBlbnRlcgorICAgICAgICAgIFNoZWxsIHN0YXRlIHdpdGg6CisgICAgICAgICAgCisgIEN0cmwtXCEKKworICAgICAgICAgIFRvIHNlbmQgYSBDdHJsLVwgdG8gdGhlIGhvc3Qgd2hpbGUgaW4gQ29ubmVjdCBzdGF0ZSwgdHlwZSB0d28KKyAgICAgICAgICBvZiB0aGVtIGluIGEgcm93LiBTZWUgSEVMUCBDT05ORUNUIGFuZCBIRUxQIFNFVCBFU0NBUEUgZm9yIG1vcmUKKyAgICAgICAgICBpbmZvLgorICAgICAgICAgIAorICAgTG9jYWwgZmlsZS10cmFuc2ZlciBzdGF0ZQorICAgICAgICAgIAorICAgICAgICAgIEluIHRoaXMgc3RhdGUsIEtlcm1pdCBpcyBzZW5kaW5nIHBhY2tldHMgYmFjayBhbmQgZm9ydGggd2l0aAorICAgICAgICAgIHRoZSBvdGhlciBjb21wdXRlciBpbiBvcmRlciB0byB0cmFuc2ZlciBhIGZpbGUgb3IgYWNjb21wbGlzaAorICAgICAgICAgIHNvbWUgb3RoZXIgZmlsZS1yZWxhdGVkIHRhc2suIEFuZCBhdCB0aGUgc2FtZSB0aW1lLCBpdCBpcworICAgICAgICAgIGRpc3BsYXlpbmcgaXRzIHByb2dyZXNzIG9uIHlvdXIgc2NyZWVuIGFuZCB3YXRjaGluZyB5b3VyCisgICAgICAgICAga2V5Ym9hcmQgZm9yIGludGVycnVwdGlvbnMuIEluIHRoaXMgc3RhdGUsIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICBzaW5nbGUta2V5c3Ryb2tlIGNvbW1hbmRzIGFyZSBhY2NlcHRlZDoKKyAgICAgICAgICAKKyAgICAgICAgICAgIFggSW50ZXJydXB0IHRoZSBjdXJyZW50IGZpbGUgYW5kIGdvIG9uIHRvIHRoZSBuZXh0IChpZiBhbnkpLgorICAgICAgICAgICAgWiBJbnRlcnJ1cHQgdGhlIGN1cnJlbnQgZmlsZSBhbmQgc2tpcCBhbGwgdGhlIHJlc3QuCisgICAgICAgICAgICBFIExpa2UgWiBidXQgdXNlcyBhICJzdHJvbmdlciIgcHJvdG9jb2wgKHVzZSBpZiBYIG9yIFogZG9uJ3QKKyAgICAgICAgICB3b3JrKS4KKyAgICAgICAgICAgIEN0cmwtQyAgIEludGVycnVwdCBmaWxlLXRyYW5zZmVyIG1vZGUgKHVzZSBpZiBaIG9yIEUgZG9uJ3QKKyAgICAgICAgICB3b3JrKS4KKyAgICAgICAgICAKKyAgICAgICAgICBLZXJtaXQgcmV0dXJucyB0byBpdHMgcHJldmlvdXMgc3RhdGUgKENvbW1hbmQgb3IgQ29ubmVjdCkgd2hlbgorICAgICAgICAgIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBvciB3aGVuIGludGVycnVwdGVkIHN1Y2Nlc3NmdWxseSBieSBYLAorICAgICAgICAgIFosIEUsIG9yIEN0cmwtQyAoaG9sZCBkb3duIHRoZSBDdHJsIGtleSBhbmQgcHJlc3MgdGhlIEMga2V5KS4KKyAgICAgICAgICAKKyAgIFJlbW90ZSBmaWxlLXRyYW5zZmVyIHN0YXRlCisgICAgICAgICAgCisgICAgICAgICAgSW4gdGhpcyBzdGF0ZSwgS2VybWl0IGlzIGV4Y2hhbmdpbmcgZmlsZS10cmFuc2ZlciBwYWNrZXRzIHdpdGgKKyAgICAgICAgICBpdHMgbG9jYWwgcGFydG5lciBvdmVyIGl0cyBzdGFuZGFyZCBpL28uIEl0IGxlYXZlcyB0aGlzIHN0YXRlCisgICAgICAgICAgYXV0b21hdGljYWxseSB3aGVuIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4gSW4gY2FzZSB5b3UgZmluZAorICAgICAgICAgIHlvdXIgbG9jYWwgS2VybWl0IGluIENvbm5lY3Qgc3RhdGUgYW5kIHRoZSByZW1vdGUgb25lIGluCisgICAgICAgICAgRmlsZS10cmFuc2ZlciBzdGF0ZSAoaW4gd2hpY2ggaXQgc2VlbXMgdG8gaWdub3JlIHlvdXIKKyAgICAgICAgICBrZXlzdHJva2VzKSwgeW91IGNhbiB1c3VhbGx5IHJldHVybiBpdCB0byBjb21tYW5kIHN0YXRlIGJ5CisgICAgICAgICAgdHlwaW5nIHRocmVlIEN0cmwtQydzIGluIGEgcm93LiBJZiB0aGF0IGRvZXNuJ3Qgd29yaywgcmV0dXJuCisgICAgICAgICAgeW91ciBsb2NhbCBLZXJtaXQgdG8gQ29tbWFuZCBzdGF0ZSAoQ3RybC1cIEMpIGFuZCB0eXBlCisgICAgICAgICAgImUtcGFja2V0IiBhbmQgdGhlbiBwcmVzcyB0aGUgUmV0dXJuIG9yIEVudGVyIGtleTsgdGhpcyBmb3JjZXMKKyAgICAgICAgICBhIGZhdGFsIEtlcm1pdCBwcm90b2NvbCBlcnJvci4KKyAgICAgICAgICAKKyAgIFJlbW90ZSBTZXJ2ZXIgc3RhdGUKKyAgICAgICAgICAKKyAgICAgICAgICBUaGlzIGlzIGxpa2UgUmVtb3RlIEZpbGUtdHJhbnNmZXIgc3RhdGUsIGV4Y2VwdCBpdCBuZXZlcgorICAgICAgICAgIHJldHVybnMgYXV0b21hdGljYWxseSB0byBDb21tYW5kIHN0YXRlLiBSYXRoZXIsIGl0IGF3YWl0cworICAgICAgICAgIGZ1cnRoZXIgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGNsaWVudCBwcm9ncmFtOyB0aGF0IGlzLCBmcm9tCisgICAgICAgICAgeW91ciBMb2NhbCBLZXJtaXQgcHJvZ3JhbS4gWW91IGNhbiByZXR1cm4gdGhlIFJlbW90ZSBTZXJ2ZXIgdG8KKyAgICAgICAgICBpdHMgcHJldmlvdXMgc3RhdGUgYnkgaXNzdWluZyBhICJmaW5pc2giIGNvbW1hbmQgdG8gdGhlIGNsaWVudCwKKyAgICAgICAgICBvciBpZiB5b3UgYXJlIGluIENvbm5lY3Qgc3RhdGUsIGJ5IHR5cGluZyB0aHJlZSBDdHJsLUMncyBpbiBhCisgICAgICAgICAgcm93LiBZb3UgY2FuIHRlbGwgdGhlIHNlcnZlciBqb2IgdG8gbG9nIG91dCBhbmQgYnJlYWsgdGhlCisgICAgICAgICAgY29ubmVjdGlvbiBieSBpc3N1aW5nIGEgImJ5ZSIgY29tbWFuZCB0byB0aGUgY2xpZW50LgorICAgICAgICAgIAorICAgTG9jYWwgU2VydmVyIHN0YXRlCisgICAgICAgICAgCisgICAgICAgICAgTGlrZSBSZW1vdGUtU2VydmVyIHN0YXRlLCBidXQgaW4gbG9jYWwgbW9kZSwgYW5kIHRoZXJlZm9yZSB3aXRoCisgICAgICAgICAgaXRzIGZpbGUtdHJhbnNmZXIgZGlzcGxheSBzaG93aW5nLCBhbmQgbGlzdGVuaW5nIGZvciBzaW5nbGUta2V5CisgICAgICAgICAgY29tbWFuZHMsIGFzIGluIExvY2FsIEZpbGUtdHJhbnNmZXIgc3RhdGUuIFVzdWFsbHkgdGhpcyBzdGF0ZQorICAgICAgICAgIGlzIGVudGVyZWQgYXV0b21hdGljYWxseSB3aGVuIGEgcmVtb3RlIEtlcm1pdCBwcm9ncmFtIGdpdmVzIGEKKyAgICAgICAgICBHRVQgY29tbWFuZC4KKyAgICAgICAgICAKKyAgIEMtS2VybWl0LCBLZXJtaXQgOTUsIGFuZCBNUy1ET1MgS2VybWl0IGFsbCBjYW4gc3dpdGNoIGF1dG9tYXRpY2FsbHkKKyAgIGZyb20gQ29ubmVjdCBzdGF0ZSB0byBMb2NhbCBGaWxlLXRyYW5zZmVyIHN0YXRlIHdoZW4geW91IGluaXRpYXRlIGEKKyAgIGZpbGUgdHJhbnNmZXIgZnJvbSB0aGUgcmVtb3RlIGNvbXB1dGVyIGJ5IHN0YXJ0aW5nIEtlcm1pdCBhbmQgdGVsbGluZworICAgaXQgdG8gc2VuZCBvciBnZXQgYSBmaWxlLCBpbiB3aGljaCBjYXNlLCBDb25uZWN0IHN0YXRlIGlzCisgICBhdXRvbWF0aWNhbGx5IHJlc3VtZWQgYWZ0ZXIgdGhlIGZpbGUgdHJhbnNmZXIgaXMgZmluaXNoZWQuCisgICAKKyAgIE5vdGUgdGhhdCBDLUtlcm1pdCBpcyBub3QgYSB0ZXJtaW5hbCBlbXVsYXRvci4gSXQgaXMgYSBjb21tdW5pY2F0aW9ucworICAgYXBwbGljYXRpb24gdGhhdCB5b3UgcnVuIGluIGEgdGVybWluYWwgd2luZG93IChlLmcuIGNvbnNvbGUgb3IgWHRlcm0pLgorICAgVGhlIHNwZWNpZmljIGVtdWxhdGlvbiwgc3VjaCBhcyBWVDEwMCwgVlQyMjAsIExpbnV4IENvbnNvbGUsIG9yIFh0ZXJtLAorICAgaXMgcHJvdmlkZWQgYnkgdGhlIHRlcm1pbmFsIHdpbmRvdyBpbiB3aGljaCB5b3UgYXJlIHJ1bm5pbmcgQy1LZXJtaXQuCisgICBLZXJtaXQgOTUgYW5kIE1TLURPUyBLZXJtaXQsIG9uIHRoZSBvdGhlciBoYW5kLCBhcmUgdHJ1ZSB0ZXJtaW5hbAorICAgZW11bGF0b3JzLiBXaHkgaXMgQy1LZXJtaXQgbm90IGEgdGVybWluYWwgZW11bGF0b3I/IFs4NV1DTElDSyBIRVJFIHRvCisgICByZWFkIGFib3V0IGl0LgorICAgCisgICBbIFs4Nl1LZXJtaXQgSG9tZSBdIFsgWzg3XUMtS2VybWl0IEhvbWUgXSBbIFs4OF1DLUtlcm1pdCBGQVEgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAKKyAgTUFLSU5HIENPTk5FQ1RJT05TIFsgWzg5XVRvcCBdIFsgWzkwXUNvbnRlbnRzIF0gWyBbOTFdTmV4dCBdIFsgWzkyXVByZXZpb3VzIF0KKyAgCisgICBIZXJlIGlzIGhvdyB0byBtYWtlIGRpZmZlcmVudCBraW5kcyBvZiBjb25uZWN0aW9ucyB1c2luZyBpbnRlcmFjdGl2ZQorICAgS2VybWl0IGNvbW1hbmRzIChhcyBub3RlZCBhYm92ZSwgeW91IGNhbiBhbHNvIG1ha2UgY29ubmVjdGlvbnMgd2l0aAorICAgY29tbWFuZC1saW5lIG9wdGlvbnMpLiBOb3RlIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gbWFrZSBjb25uZWN0aW9ucworICAgd2l0aCBLZXJtaXQuIEl0IGNhbiBhbHNvIGJlIHVzZWQgb24gdGhlIGZhciBlbmQgb2YgYSBjb25uZWN0aW9uIGFzIHRoZQorICAgcmVtb3RlIGZpbGUgdHJhbnNmZXIgYW5kIG1hbmFnZW1lbnQgcGFydG5lciBvZiB5b3VyIGxvY2FsCisgICBjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZS4KKyAgIAorICAgTWFraW5nIGEgVGVsbmV0IENvbm5lY3Rpb24KKyAgICAgICAgICAKKyAgICAgICAgICBBdCB0aGUgQy1LZXJtaXQgY29tbWFuZCBwcm9tcHQsIHNpbXBseSB0eXBlOgorICAgICAgICAgIAorICB0ZWxuZXQgZm9vLmJhci5jb20gICAgICAgICA7IFN1YnN0aXR1dGUgZGVzaXJlZCBob3N0IG5hbWUgb3IgYWRkcmVzcy4KKyAgdGVsbmV0IHh5emNvcnAuY29tIDMwMDAgICAgOyBZb3UgY2FuIGFsc28gaW5jbHVkZSBhIHBvcnQgbnVtYmVyLgorCisgICAgICAgICAgSWYgdGhlIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgS2VybWl0IGF1dG9taWNhbGx5IGVudGVycworICAgICAgICAgIENvbm5lY3Qgc3RhdGUuIFdoZW4geW91IGxvZ291dCBmcm9tIHRoZSByZW1vdGUgaG9zdCwgS2VybWl0CisgICAgICAgICAgYXV0b21hdGljYWxseSByZXR1cm5zIHRvIGl0cyBwcm9tcHQuIE1vcmUgaW5mbzogSEVMUCBURUxORVQsCisgICAgICAgICAgSEVMUCBTRVQgVEVMTkVULCBIRUxQIFNFVCBURUxPUFQuIEFsc28gc2VlIHRoZSBbOTNdSUtTRCBzZWN0aW9uCisgICAgICAgICAgYmVsb3cuCisgICAgICAgICAgCisgICBNYWtpbmcgYW4gUmxvZ2luIGNvbm5lY3Rpb24KKyAgICAgICAgICAKKyAgICAgICAgICBUaGlzIGlzIGp1c3QgbGlrZSBUZWxuZXQsIGV4Y2VwdCB5b3UgaGF2ZSB0byBiZSByb290IHRvIGRvIGl0CisgICAgICAgICAgYmVjYXVzZSBSbG9naW4gdXNlcyBhIHByaXZpbGVnZWQgVENQIHBvcnQ6CisgICAgICAgICAgCisgIHJsb2dpbiBmb28uYmFyLmNvbSAgICAgICAgIDsgU3Vic3RpdHV0ZSBkZXNpcmVkIGhvc3QgbmFtZSBvciBhZGRyZXNzLgorCisgICAgICAgICAgTW9yZSBpbmZvOiBIRUxQIFJMT0dJTi4KKyAgICAgICAgICAKKyAgIE1ha2luZyBhbiBTU0ggQ29ubmVjdGlvbgorICAgICAgICAgIAorICAgICAgICAgIFVubGlrZSBUZWxuZXQgYW5kIFJsb2dpbiwgU1NIIGNvbm5lY3Rpb25zIGFyZSBub3QgYnVpbHQtaW4sIGJ1dAorICAgICAgICAgIGhhbmRsZWQgYnkgcnVubmluZyB5b3VyIGV4dGVybmFsIFNTSCBjbGllbnQgdGhyb3VnaCBhCisgICAgICAgICAgcHNldWRvdGVybWluYWwuIFVzaW5nIEMtS2VybWl0IHRvIGNvbnRyb2wgdGhlIFNTSCBjbGllbnQgZ2l2ZXMKKyAgICAgICAgICB5b3UgYWxsIG9mIEtlcm1pdCdzIGZlYXR1cmVzIChmaWxlIHRyYW5zZmVyLCBjaGFyYWN0ZXItc2V0CisgICAgICAgICAgY29udmVyc2lvbiwgc2NyaXB0aW5nLCBldGMpIG92ZXIgU1NILgorICAgICAgICAgIAorICBzc2ggZm9vLmJhci5jb20gICAgICAgICAgICA7IFN1YnN0aXR1dGUgZGVzaXJlZCBob3N0IG5hbWUgb3IgYWRkcmVzcy4KKworICAgICAgICAgIE1vcmUgaW5mbzogSEVMUCBTU0gsIEhFTFAgU0VUIFNTSC4KKyAgICAgICAgICAKKyAgIERpYWxpbmcgd2l0aCBhIE1vZGVtCisgICAgICAgICAgCisgICAgICAgICAgSWYgaXQncyBhbiBleHRlcm5hbCBtb2RlbSwgbWFrZSBzdXJlIGl0IGlzIGNvbm5lY3RlZCB0byBhCisgICAgICAgICAgdXNhYmxlIHNlcmlhbCBwb3J0IG9uIHlvdXIgY29tcHV0ZXIgd2l0aCBhIHJlZ3VsYXIKKyAgICAgICAgICAoc3RyYWlnaHQtdGhyb3VnaCkgbW9kZW0gY2FibGUsIGFuZCB0byB0aGUgdGVsZXBob25lIGphY2sgd2l0aAorICAgICAgICAgIGEgdGVsZXBob25lIGNhYmxlLCBhbmQgdGhhdCBpdCdzIHR1cm5lZCBvbi4gVGhlbiB1c2UgdGhlc2UKKyAgICAgICAgICBjb21tYW5kczoKKyAgICAgICAgICAKKyAgc2V0IG1vZGVtIHR5cGUgdXNyb2JvdGljcyAgOyBPciBvdGhlciBzdXBwb3J0ZWQgdHlwZQorICBzZXQgbGluZSAvZGV2L3R0eVMwICAgICAgICA7IFNwZWNpZnkgZGV2aWNlIG5hbWUKKyAgc2V0IHNwZWVkIDU3NjAwICAgICAgICAgICAgOyBPciBvdGhlciBkZXNpcmVkIHNwZWVkCisgIHNldCBmbG93IHJ0cy9jdHMgICAgICAgICAgIDsgTW9zdCBtb2Rlcm4gbW9kZW1zIHN1cHBvcnQgdGhpcworICBzZXQgZGlhbCBtZXRob2QgdG9uZSAgICAgICA7IChvciBwdWxzZSkKKyAgZGlhbCA3NjU0MzIxICAgICAgICAgICAgICAgOyBEaWFsIHRoZSBkZXNpcmVkIG51bWJlcgorCisgICAgICAgICAgVHlwZSAic2V0IG1vZGVtIHR5cGUgPyIgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgbW9kZW0gdHlwZXMuIElmCisgICAgICAgICAgeW91IG9taXQgdGhlIFNFVCBNT0RFTSBUWVBFIGNvbW1hbmQsIHRoZSBkZWZhdWx0IHR5cGUgaXMKKyAgICAgICAgICAiZ2VuZXJpYy1oaWdoLXNwZWVkIiwgd2hpY2ggc2hvdWxkIHdvcmsgZm9yIG1vc3QgbW9kZXJuCisgICAgICAgICAgQVQtY29tbWFuZC1zZXQgbW9kZW1zLiBJZiB0aGUgbGluZSBpcyBidXN5LCBLZXJtaXQgcmVkaWFscworICAgICAgICAgIGF1dG9tYXRpY2FsbHkuIElmIHRoZSBjYWxsIGRvZXMgbm90IHN1Y2NlZWQsIHVzZSAic2V0IGRpYWwKKyAgICAgICAgICBkaXNwbGF5IG9uIiBhbmQgdHJ5IGl0IGFnYWluIHRvIHdhdGNoIHdoYXQgaGFwcGVucy4gSWYgdGhlIGNhbGwKKyAgICAgICAgICBzdWNjZWVkcywgS2VybWl0IGVudGVycyBDb25uZWN0IHN0YXRlIGF1dG9tYXRpY2FsbHkgYW5kIHJldHVybnMKKyAgICAgICAgICB0byBpdHMgcHJvbXB0IGF1dG9tYXRpY2FsbHkgd2hlbiB5b3UgbG9nIG91dCBmcm9tIHRoZSByZW1vdGUKKyAgICAgICAgICBjb21wdXRlciBvciB0aGUgY29ubmVjdGlvbiBpcyBvdGhlcndpc2UgbG9zdC4KKyAgICAgICAgICAKKyAgICAgICAgICBZb3UgY2FuIGFsc28gZGlhbCBmcm9tIGEgbW9kZW0gdGhhdCBpcyBhY2Nlc3NpYmxlIGJ5IFRlbG5ldCwKKyAgICAgICAgICBlLmcuIHRvIGEgcmV2ZXJzZSB0ZXJtaW5hbCBzZXJ2ZXIuIEluIHRoaXMgY2FzZSB0aGUgY29tbWFuZAorICAgICAgICAgIHNlcXVlbmNlIGlzOgorICAgICAgICAgIAorICBzZXQgaG9zdCB0cy54eHguY29tIDIwMDAgICA7IFRlcm1pbmFsLXNlcnZlciBhbmQgcG9ydAorICBzZXQgbW9kZW0gdHlwZSB1c3JvYm90aWNzICA7IE9yIG90aGVyIHN1cHBvcnRlZCB0eXBlCisgIHNldCBkaWFsIG1ldGhvZCB0b25lICAgICAgIDsgKG9yIHB1bHNlKQorICBkaWFsIDc2NTQzMjEgICAgICAgICAgICAgICA7IERpYWwgdGhlIGRlc2lyZWQgbnVtYmVyCisKKyAgICAgICAgICBJZiB0aGUgdGVybWluYWwgc2VydmVyIHN1cHBvcnRzIHRoZSBUZWxuZXQgQ29tIFBvcnQgT3B0aW9uLAorICAgICAgICAgIFs5NF1SRkMgMjIxNywgeW91IGNhbiBhbHNvIGdpdmUgc2VyaWFsLXBvcnQgcmVsYXRlZCBjb21tYW5kcworICAgICAgICAgIHN1Y2ggYXMgU0VUIFNQRUVELCBTRVQgUEFSSVRZLCBhbmQgc28gb24sIGFuZCBLZXJtaXQgcmVsYXlzCisgICAgICAgICAgdGhlbSB0byB0aGUgdGVybWluYWwgc2VydmVyIHVzaW5nIHRoZSBwcm90b2NvbCBzcGVjaWZpZWQgaW4gdGhlCisgICAgICAgICAgUkZDLgorICAgICAgICAgIAorICAgICAgICAgIE1vcmUgaW5mbzogSEVMUCBTRVQgTU9ERU0sIEhFTFAgU0VUIExJTkUsIEhFTFAgU0VUIFNQRUVELCBIRUxQCisgICAgICAgICAgU0VUIEZMT1csIEhFTFAgRElBTCwgSEVMUCBTRVQgRElBTCwgSEVMUCBTRVQgTU9ERU0sIEhFTFAgU0VUCisgICAgICAgICAgQ0FSUklFUi1XQVRDSCwgU0hPVyBDT01NVU5JQ0FUSU9OUywgU0hPVyBNT0RFTSwgU0hPVyBESUFMLgorICAgICAgICAgIAorICAgRGlyZWN0IFNlcmlhbCBQb3J0CisgICAgICAgICAgCisgICAgICAgICAgQ29ubmVjdCB0aGUgdHdvIGNvbXB1dGVycywgQSBhbmQgQiwgd2l0aCBhIG51bGwgbW9kZW0gY2FibGUgKG9yCisgICAgICAgICAgdHdvIG1vZGVtIGNhYmxlcyBpbnRlcmNvbm5lY3RlZCB3aXRoIGEgbnVsbC1tb2RlbSBhZGFwdGVyIG9yCisgICAgICAgICAgbW9kZW0gZWxpbWluYXRvcikuIEZyb20gQ29tcHV0ZXIgQToKKyAgICAgICAgICAKKyAgc2V0IG1vZGVtIHR5cGUgbm9uZSAgICAgICAgOyBUaGVyZSBpcyBubyBtb2RlbQorICBzZXQgbGluZSAvZGV2L3R0eVMwICAgICAgICA7IFNwZWNpZnkgZGV2aWNlIG5hbWUKKyAgc2V0IGNhcnJpZXItd2F0Y2ggb2ZmICAgICAgOyBJZiBEVFIgYW5kIENEIGFyZSBub3QgY3Jvc3MtY29ubmVjdGVkCisgIHNldCBzcGVlZCA1NzYwMCAgICAgICAgICAgIDsgT3Igb3RoZXIgZGVzaXJlZCBzcGVlZAorICBzZXQgZmxvdyBydHMvY3RzICAgICAgICAgICA7IElmIFJUUyBhbmQgQ1RTIGFyZSBjcm9zcy1jb25uZWN0ZWQKKyAgc2V0IGZsb3cgeG9uL3hvZmYgICAgICAgICAgOyBJZiB5b3UgY2FuJ3QgdXNlIFJUUy9DVFMKKyAgc2V0IHBhcml0eSBldmVuICAgICAgICAgICAgOyAob3IgIm1hcmsiIG9yICJzcGFjZSIsIGlmIG5lY2Vzc2FyeSkKKyAgc2V0IHN0b3AtYml0cyAyICAgICAgICAgICAgOyAocmFyZWx5IG5lY2Vzc2FyeSkKKyAgY29ubmVjdCAgICAgICAgICAgICAgICAgICAgOyBFbnRlciBDb25uZWN0ICh0ZXJtaW5hbCkgc3RhdGUKKworICAgICAgICAgIFRoaXMgYXNzdW1lcyBDb21wdXRlciBCIGlzIHNldCB1cCB0byBsZXQgeW91IGxvZyBpbi4gSWYgaXQKKyAgICAgICAgICBpc24ndCwgeW91IGNhbiBydW4gYSBjb3B5IG9mIEtlcm1pdCBvbiBDb21wdXRlciBCIGFuZCBmb2xsb3cKKyAgICAgICAgICBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGRpcmVjdGlvbnMuIE1vcmUgaW5mbzogQXMgYWJvdmUgcGx1cworICAgICAgICAgIEhFTFAgQ09OTkVDVC4KKyAgICAgICAgICAKKyAgIFdpdGggbW9kZW1zIG9yIGRpcmVjdCBzZXJpYWwgY29ubmVjdGlvbnMsIHlvdSBtaWdodCBhbHNvIGhhdmUgdG8gInNldAorICAgcGFyaXR5IGV2ZW4iIChvciAibWFyayIgb3IgInNwYWNlIikgaWYgaXQncyBhIDctYml0IGNvbm5lY3Rpb24uCisgICAKKyAgIE9mIHRoZSBjb25uZWN0aW9uIHR5cGVzIGxpc3RlZCBhYm92ZSwgb25seSBvbmUgY2FuIGJlIG9wZW4gYXQgYSB0aW1lLgorICAgSG93ZXZlciwgYW55IG9uZSBvZiB0aGVzZSBjYW4gYmUgb3BlbiBjb25jdXJyZW50bHkgd2l0aCBhbiBbOTVdRlRQIG9yCisgICBIVFRQIHNlc3Npb24uIEVhY2ggY29ubmVjdGlvbiB0eXBlIGNhbiBiZSBjdXN0b21pemVkIHRvIGFueSBkZXNpcmVkCisgICBkZWdyZWUsIHNjcmlwdGVkLCBsb2dnZWQsIHlvdSBuYW1lIGl0LiBTZWUgdGhlIG1hbnVhbC4KKyAgIAorICAgTk9URTogT24gc2VsZWN0ZWQgcGxhdGZvcm1zLCBDLUtlcm1pdCBhbHNvIGNhbiBtYWtlIFguMjUgY29ubmVjdGlvbnMuCisgICBTZWUgdGhlIG1hbnVhbCBmb3IgZGV0YWlscy4KKyAgIAorICAgWyBbOTZdS2VybWl0IEhvbWUgXSBbIFs5N11DLUtlcm1pdCBIb21lIF0gWyBbOThdQy1LZXJtaXQgRkFRIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgCisgIFRSQU5TRkVSUklORyBGSUxFUyBXSVRIIEtFUk1JVCBbIFs5OV1Ub3AgXSBbIFsxMDBdQ29udGVudHMgXSBbIFsxMDFdTmV4dCBdIFsKKyAgWzEwMl1QcmV2aW91cyBdCisgIAorICAgICAqIFsxMDNdRG93bmxvYWRpbmcgRmlsZXMKKyAgICAgKiBbMTA0XVVwbG9hZGluZyBGaWxlcworICAgICAqIFsxMDVdS2VybWl0IFRyYW5zZmVycyB0aGUgT2xkLUZhc2hpb25lZCBXYXkKKyAgICAgKiBbMTA2XUlmIEZpbGUgVHJhbnNmZXIgRmFpbHMKKyAgICAgKiBbMTA3XUFkdmFuY2VkIEtlcm1pdCBGaWxlIFRyYW5zZmVyIEZlYXR1cmVzCisgICAgICogWzEwOF1Ob24tS2VybWl0IEZpbGUgVHJhbnNmZXIKKyAgICAgICAKKyAgIFRoZXJlIGlzIGEgWzEwOV13aWRlc3ByZWFkIGFuZCBwZXJzaXN0ZW50IGJlbGllZiB0aGF0IEtlcm1pdCBpcyBhIHNsb3cKKyAgIHByb3RvY29sLiBUaGlzIGlzIGJlY2F1c2UsIHVudGlsIHJlY2VudGx5LCBpdCB1c2VkIGNvbnNlcnZhdGl2ZSB0dW5pbmcKKyAgIGJ5IGRlZmF1bHQgdG8gbWFrZSBzdXJlIGZpbGUgdHJhbnNmZXJzIHN1Y2NlZWRlZCwgcmF0aGVyIHRoYW4gZmFpbGluZworICAgYmVjYXVzZSB0aGV5IG92ZXJsb2FkZWQgdGhlIGNvbm5lY3Rpb24uIFNvbWUgZXh0cmEgY29tbWFuZHMgKG9yCisgICBjb21tYW5kLWxpbmUgb3B0aW9ucywgbGlrZSAtUSkgd2VyZSBuZWVkZWQgdG8gbWFrZSBpdCBnbyBmYXN0LCBidXQKKyAgIG5vYm9keSBib3RoZXJlZCB0byBmaW5kIG91dCBhYm91dCB0aGVtLiBBbHNvLCBpdCB0YWtlcyB0d28gdG8gdGFuZ286CisgICBtb3N0IG5vbi1LZXJtaXQtUHJvamVjdCBLZXJtaXQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zIHJlYWxseSBBUkUKKyAgIHNsb3cuIFRoZSBiZXN0IGZpbGUtdHJhbnNmZXIgcGFydG5lcnMgZm9yIEMtS2VybWl0IGFyZTogYW5vdGhlciBjb3B5CisgICBvZiBbMTEwXUMtS2VybWl0ICg3LjAgb3IgbGF0ZXIpIGFuZCBbMTExXUtlcm1pdCA5NS4gVGhlc2UgY29tYmluYXRpb25zCisgICB3b3JrIHdlbGwgYW5kIHRoZXkgd29yayBmYXN0IGJ5IGRlZmF1bHQuIE1TLURPUyBLZXJtaXQgaXMgZ29vZCB0b28sCisgICBidXQgeW91IGhhdmUgdG8gdGVsbCBpdCB0byBnbyBmYXN0IChieSBnaXZpbmcgaXQgdGhlIEZBU1QgY29tbWFuZCkuCisgICAKKyAgIEZ1cnRoZXJtb3JlLCBhbGwgdGhyZWUgb2YgdGhlc2UgS2VybWl0IHByb2dyYW1zIHN1cHBvcnQgImF1dG9kb3dubG9hZCIKKyAgIGFuZCAiYXV0b3VwbG9hZCIsIG1lYW5pbmcgdGhhdCB3aGVuIHRoZXkgYXJlIGluIENvbm5lY3Qgc3RhdGUgYW5kIGEKKyAgIEtlcm1pdCBwYWNrZXQgY29tZXMgaW4gZnJvbSB0aGUgcmVtb3RlLCB0aGV5IGF1dG9tYXRpY2FsbHkgc3dpdGNoIGludG8KKyAgIGZpbGUgdHJhbnNmZXIgbW9kZS4KKyAgIAorICAgQW5kIHBsdXMsIEMtS2VybWl0IGFuZCBLOTUgYWxzbyBzd2l0Y2ggYXV0b21hdGljYWxseSBiZXR3ZWVuIHRleHQgYW5kCisgICBiaW5hcnkgbW9kZSBmb3IgZWFjaCBmaWxlLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvICJzZXQgZmlsZSB0eXBlCisgICBiaW5hcnkiIG9yICJzZXQgZmlsZSB0eXBlIHRleHQiLCBvciB0byB3b3JyeSBhYm91dCBmaWxlcyBiZWluZworICAgY29ycnVwdGVkIGJlY2F1c2UgdGhleSB3ZXJlIHRyYW5zZmVycmVkIGluIHRoZSB3cm9uZyBtb2RlLgorICAgCisgICBXaGF0IGFsbCBvZiB0aGVzZSB3b3JkcyBhZGQgdXAgdG8gaXMgdGhhdCBub3csIHdoZW4geW91IHVzZSB1cC10by1kYXRlCisgICBLZXJtaXQgc29mdHdhcmUgZnJvbSB0aGUgS2VybWl0IFByb2plY3QsIGZpbGUgdHJhbnNmZXIgaXMgbm90IG9ubHkKKyAgIGZhc3QsIGl0J3MgcmlkaWN1bG91c2x5IGVhc3kuIFlvdSBiYXJlbHkgaGF2ZSB0byBnaXZlIGFueSBjb21tYW5kcyBhdAorICAgYWxsLgorICAgCisgICBEb3dubG9hZGluZyBGaWxlcworICAgICAgICAgIAorICAgICAgICAgIExldCdzIHNheSB5b3UgaGF2ZSBbMTEyXUtlcm1pdCA5NSwgWzExM11DLUtlcm1pdCwgb3IKKyAgICAgICAgICBbMTE0XU1TLURPUyBLZXJtaXQgb24geW91ciBkZXNrdG9wIGNvbXB1dGVyLCB3aXRoIGEgY29ubmVjdGlvbgorICAgICAgICAgIHRvIGEgVW5peCBjb21wdXRlciB0aGF0IGhhcyBDLUtlcm1pdCBpbnN0YWxsZWQgYXMgImtlcm1pdCIuIFRvCisgICAgICAgICAgZG93bmxvYWQgYSBmaWxlIChzZW5kIGl0IGZyb20gVW5peCB0byB5b3VyIGRlc2t0b3AgY29tcHV0ZXIpLAorICAgICAgICAgIGp1c3QgdHlwZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgYXQgeW91ciBVbml4IHNoZWxsIHByb21wdDoKKyAgICAgICAgICAKKyAga2VybWl0IC1zIG9vZmEudHh0CisKKyAgICAgICAgICAod2hlcmUgb29mYS50eHQgaXMgdGhlIGZpbGVuYW1lKS4gSWYgeW91IHdhbnQgdG8gc2VuZCBtb3JlIHRoYW4KKyAgICAgICAgICBvbmUgZmlsZSwgeW91IGNhbiBwdXQgYXMgbWFueSBmaWxlbmFtZXMgYXMgeW91IHdhbnQgb24gdGhlCisgICAgICAgICAgY29tbWFuZCBsaW5lLCBhbmQgdGhleSBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRleHQgYW5kCisgICAgICAgICAgYmluYXJ5OgorICAgICAgICAgIAorICBrZXJtaXQgLXMgb29mYS50eHQgb29mYS56aXAgb29mYS5odG1sIG9vZmEudGFyLmd6CisKKyAgICAgICAgICBhbmQvb3IgeW91IGNhbiB1c2Ugd2lsZGNhcmRzIHRvIHNlbmQgZ3JvdXBzIG9mIGZpbGVzOgorICAgICAgICAgIAorICBrZXJtaXQgLXMgb29mYS4qCisKKyAgICAgICAgICBJZiB5b3Ugd2FudCB0byBzZW5kIGEgZmlsZSB1bmRlciBhbiBhc3N1bWVkIG5hbWUsIHVzZToKKyAgICAgICAgICAKKyAga2VybWl0IC1zIGZyaWRheS50eHQgLWEgdG9kYXkudHh0CisKKyAgICAgICAgICBUaGlzIHNlbmRzIHRoZSBmaWxlIGZyaWRheS50eHQgYnV0IHRlbGxzIHRoZSByZWNlaXZpbmcgS2VybWl0CisgICAgICAgICAgdGhhdCBpdHMgbmFtZSBpcyB0b2RheS50eHQuIEluIGFsbCBjYXNlcywgYXMgbm90ZWQsIHdoZW4gdGhlCisgICAgICAgICAgZmlsZSB0cmFuc2ZlciBpcyBmaW5pc2hlZCwgeW91ciBkZXNrdG9wIEtlcm1pdCByZXR1cm5zCisgICAgICAgICAgYXV0b21hdGljYWxseSB0byBDb25uZWN0IHN0YXRlLiBObyB3b3JyaWVzIGFib3V0IGVzY2FwaW5nIGJhY2ssCisgICAgICAgICAgcmUtY29ubmVjdGluZywgdGV4dC9iaW5hcnkgbW9kZSBzd2l0Y2hpbmcuIEFsbW9zdCB0b28gZWFzeSwKKyAgICAgICAgICByaWdodD8KKyAgICAgICAgICAKKyAgIFVwbG9hZGluZyBGaWxlcworICAgICAgICAgIAorICAgICAgICAgIFRvIHVwbG9hZCBmaWxlcyAoc2VuZCB0aGVtIGZyb20geW91ciBkZXNrdG9wIGNvbXB1dGVyIHRvIHRoZQorICAgICAgICAgIHJlbW90ZSBVbml4IGNvbXB1dGVyKSBkbyB0aGUgc2FtZSB0aGluZywgYnV0IHVzZSB0aGUgLWcgKEdFVCkKKyAgICAgICAgICBvcHRpb24gaW5zdGVhZCBvZiAtczoKKyAgICAgICAgICAKKyAga2VybWl0IC1nIG9vZmEudHh0CisKKyAgICAgICAgICBUaGlzIGNhdXNlcyB5b3VyIGxvY2FsIEtlcm1pdCB0byBlbnRlciBzZXJ2ZXIgbW9kZTsgdGhlbiB0aGUKKyAgICAgICAgICByZW1vdGUgS2VybWl0IHByb2dyYW0gcmVxdWVzdHMgdGhlIG5hbWVkIGZpbGUgYW5kIHRoZSBsb2NhbAorICAgICAgICAgIEtlcm1pdCBzZW5kcyBpdCBhbmQgcmV0dXJucyBhdXRvbWF0aWNhbGx5IHRvIENvbm5lY3Qgc3RhdGUgd2hlbgorICAgICAgICAgIGRvbmUuCisgICAgICAgICAgCisgICAgICAgICAgSWYgeW91IHdhbnQgdG8gdXBsb2FkIG11bHRpcGxlIGZpbGVzLCB5b3UgaGF2ZSBoYXZlIHVzZSBzaGVsbAorICAgICAgICAgIHF1b3RpbmcgcnVsZXMsIHNpbmNlIHRoZXNlIGFyZW4ndCBsb2NhbCBmaWxlczoKKyAgICAgICAgICAKKyAga2VybWl0IC1nICJvb2ZhLnR4dCBvb2ZhLnppcCBvb2ZhLmh0bWwgb29mYS50YXIuZ3oiCisgIGtlcm1pdCAtZyAib29mYS4qIgorCisgICAgICAgICAgSWYgeW91IHdhbnQgdG8gdXBsb2FkIGEgZmlsZSBidXQgc3RvcmUgaXQgdW5kZXIgYSBkaWZmZXJlbnQKKyAgICAgICAgICBuYW1lLCB1c2U6CisgICAgICAgICAgCisgIGtlcm1pdCAtZyBmcmlkYXkudHh0IC1hIHRvZGF5LnR4dAorCisgICBLZXJtaXQgVHJhbnNmZXJzIHRoZSBPbGQtRmFzaGlvbmVkIFdheQorICAgICAgICAgIAorICAgICAgICAgIElmIHlvdXIgZGVza3RvcCBjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZSBkb2VzIG5vdCBzdXBwb3J0CisgICAgICAgICAgYXV0b3VwbG9hZCBvciBhdXRvZG93bmxvYWQsIG9yIGl0IGRvZXMgbm90IGluY2x1ZGUgS2VybWl0CisgICAgICAgICAgc2VydmVyIG1vZGUsIHRoZSBwcm9jZWR1cmUgcmVxdWlyZXMgbW9yZSBzdGVwcy4KKyAgICAgICAgICAKKyAgICAgICAgICBUbyBkb3dubG9hZCBhIGZpbGUsIHR5cGU6CisgICAgICAgICAgCisgIGtlcm1pdCAtcyBmaWxlbmFtZQorCisgICAgICAgICAgb24gdGhlIGhvc3QgYXMgYmVmb3JlLCBidXQgaWYgbm90aGluZyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaW4KKyAgICAgICAgICByZXNwb25zZSB0byB0aGlzIGNvbW1hbmQsIHlvdSBoYXZlIHRvIHN3aXRjaCB5b3VyIGRlc2t0b3AKKyAgICAgICAgICBjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZSBpbnRvIEtlcm1pdCBSZWNlaXZlIHN0YXRlLiBUaGlzIG1pZ2h0CisgICAgICAgICAgYmUgZG9uZSBieSBlc2NhcGluZyBiYWNrIHVzaW5nIGtleWJvYXJkIGNoYXJhY3RlcnMgb3IgaG90IGtleXMKKyAgICAgICAgICAoQWx0LXggaXMgdHlwaWNhbCkgYW5kL29yIHdpdGggYSBjb21tYW5kIChsaWtlIFJFQ0VJVkUpIG9yIGEKKyAgICAgICAgICBtZW51LiBXaGVuIHRoZSBmaWxlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLCB5b3UgaGF2ZSB0byBnbyBiYWNrCisgICAgICAgICAgdG8gQ29ubmVjdCBzdGF0ZSwgVGVybWluYWwgZW11bGF0aW9uLCBvciB3aGF0ZXZlciB0ZXJtaW5vbG9neQorICAgICAgICAgIGFwcGxpZXMgdG8geW91ciBkZXNrdG9wIGNvbW11bmljYXRpb25zIHNvZnR3YXJlLgorICAgICAgICAgIAorICAgICAgICAgIFRvIHVwbG9hZCBhIGZpbGUsIHR5cGU6CisgICAgICAgICAgCisgIGtlcm1pdCAtcgorCisgICAgICAgICAgb24gdGhlIGhvc3QgKHJhdGhlciB0aGFuICJrZXJtaXQgLWciKS4gVGhpcyB0ZWxscyBDLUtlcm1pdCB0bworICAgICAgICAgIHdhaXQgcGFzc2l2ZWx5IGZvciBhIGZpbGUgdG8gc3RhcnQgYXJyaXZpbmcuIFRoZW4gcmVnYWluIHRoZQorICAgICAgICAgIGF0dGVudGlvbiBvZiB5b3VyIGRlc2t0b3Agc29mdHdhcmUgKEFsdC14IG9yIHdoYXRldmVyKSBhbmQKKyAgICAgICAgICBpbnN0cnVjdCBpdCB0byBzZW5kIHRoZSBkZXNpcmVkIGZpbGUocykgd2l0aCBLZXJtaXQgcHJvdG9jb2wuCisgICAgICAgICAgV2hlbiB0aGUgdHJhbnNmZXIgaXMgZmluaXNoZWQsIHJldHVybiB0byB0aGUgQ29ubmVjdCBvcgorICAgICAgICAgIFRlcm1pbmFsIHNjcmVlbi4KKyAgICAgICAgICAKKyAgIElmIEZpbGUgVHJhbnNmZXIgRmFpbHMKKyAgICAgICAgICAKKyAgICAgICAgICBBbHRob3VnaCBldmVyeSBhc3BlY3Qgb2YgS2VybWl0J3Mgb3BlcmF0aW9uIGNhbiBiZSBmaW5lbHkKKyAgICAgICAgICB0dW5lZCwgdGhlcmUgYXJlIGFsc28gdGhyZWUgc2hvcnQgYW5kIHNpbXBsZSAib21uaWJ1cyB0dW5pbmciCisgICAgICAgICAgY29tbWFuZHMgeW91IGNhbiB1c2UgZm9yIHRyb3VibGVzaG9vdGluZzoKKyAgICAgICAgICAKKyAgICAgICAgRkFTVAorICAgICAgICAgICAgICAgIFVzZSBmYXN0IGZpbGUtdHJhbnNmZXIgc2V0dGluZ3MuIFRoaXMgaGFzIGJlZW4gdGhlCisgICAgICAgICAgICAgICAgZGVmYXVsdCBzaW5jZSBDLUtlcm1pdCA3LjAgbm93IHRoYXQgbW9zdCBtb2Rlcm4gY29tcHV0ZXJzCisgICAgICAgICAgICAgICAgYW5kIGNvbm5lY3Rpb25zIHN1cHBvcnQgaXQuIElmIHRyYW5zZmVycyBmYWlsIHdpdGggZmFzdAorICAgICAgICAgICAgICAgIHNldHRpbmdzLCB0cnkgLiAuIC4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgQ0FVVElPVVMKKyAgICAgICAgICAgICAgICBVc2UgY2F1dGlvdXMgYnV0IG5vdCBwYXJhbm9pZCBzZXR0aW5ncy4gRmlsZSB0cmFuc2ZlcnMsCisgICAgICAgICAgICAgICAgaWYgdGhleSB3b3JrLCB3aWxsIGdvIGF0IG1lZGl1bSBzcGVlZC4gSWYgbm90LCB0cnkgLiAuIC4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgUk9CVVNUCisgICAgICAgICAgICAgICAgVXNlIHRoZSBtb3N0IHJvYnVzdCwgcmVzaWxpZW50LCBjb25zZXJ2YXRpdmUsIHNhZmUsIGFuZAorICAgICAgICAgICAgICAgIHJlbGlhYmxlIHNldHRpbmdzLiBGaWxlIHRyYW5zZmVycyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkKKyAgICAgICAgICAgICAgICB3b3JrLCBidXQgdGhleSB3aWxsIGJlIHF1aXRlIHNsb3cgKG9mIGNvdXJzZSB0aGlzIGlzIGEKKyAgICAgICAgICAgICAgICBjbGFzc2ljIHRyYWRlb2ZmOyBST0JVU1Qgd2FzIEMtS2VybWl0J3MgZGVmYXVsdCB0dW5pbmcgaW4KKyAgICAgICAgICAgICAgICB2ZXJzaW9ucyA2LjAgYW5kIGVhcmxpZXIsIHdoaWNoIG1hZGUgZXZlcnlib2R5IHRoaW5rCisgICAgICAgICAgICAgICAgS2VybWl0IHByb3RvY29sIHdhcyBzbG93KS4gSWYgUk9CVVNUIGRvZXNuJ3QgZG8gdGhlCisgICAgICAgICAgICAgICAgdHJpY2ssIHRyeSBhZ2FpbiB3aXRoIFNFVCBQQVJJVFkgU1BBQ0UgZmlyc3QgaW4gY2FzZSBpdCdzCisgICAgICAgICAgICAgICAgbm90IGFuIDgtYml0IGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgT2J2aW91c2x5IHRoZSBzdWNjZXNzIGFuZCBwZXJmb3JtYW5jZSBvZiBhIGZpbGUgdHJhbnNmZXIgYWxzbworICAgICAgICAgIGRlcGVuZHMgb24gQy1LZXJtaXQncyBmaWxlIHRyYW5zZmVyIHBhcnRuZXIuIFVwLXRvLWRhdGUsIHJlYWwKKyAgICAgICAgICBbMTE1XUtlcm1pdCBQcm9qZWN0IHBhcnRuZXJzIGFyZSByZWNvbW1lbmRlZCBiZWNhdXNlIHRoZXkKKyAgICAgICAgICBjb250YWluIHRoZSBiZXN0IEtlcm1pdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMgYW5kIGJlY2F1c2UKKyAgICAgICAgICBbMTE2XXdlIGNhbiBzdXBwb3J0IHRoZW0gaW4gY2FzZSBvZiB0cm91YmxlLgorICAgICAgICAgIAorICAgICAgICAgIElmIHlvdSBzdGlsbCBoYXZlIHRyb3VibGUsIGNvbnN1bHQgQ2hhcHRlciAxMCBvZiBbMTE3XVVzaW5nCisgICAgICAgICAgQy1LZXJtaXQsIG9yIHNlbmQgZW1haWwgdG8gWzExOF1rZXJtaXQtc3VwcG9ydEBjb2x1bWJpYS5lZHUuCisgICAgICAgICAgCisgICBBZHZhbmNlZCBLZXJtaXQgRmlsZS1UcmFuc2ZlciBGZWF0dXJlcworICAgICAgICAgIAorICAgICAgICAgIE9idmlvdXNseSB0aGVyZSBpcyBhIGxvdCBtb3JlIHRvIEtlcm1pdCBmaWxlIHRyYW5zZmVyLAorICAgICAgICAgIGluY2x1ZGluZyBhbGwgc29ydHMgb2YgaW50ZXJhY3RpdmUgY29tbWFuZHMsIHByZWZlcmVuY2VzLAorICAgICAgICAgIG9wdGlvbnMsIGxvZ2dpbmcsIGRlYnVnZ2luZywgdHJvdWJsZXNob290aW5nLCBhbmQgYW55dGhpbmcgZWxzZQorICAgICAgICAgIHlvdSBjYW4gaW1hZ2luZSBidXQgdGhhdCdzIHdoYXQgdGhlIFsxMTldbWFudWFsIGFuZCB1cGRhdGVzIGFyZQorICAgICAgICAgIGZvci4gSGVyZSBhcmUgYSBmZXcgdG9waWNzIHlvdSBjYW4gZXhwbG9yZSBpZiB5b3UncmUgaW50ZXJlc3RlZAorICAgICAgICAgIGJ5IFR5cGluZyBIRUxQIGZvciB0aGUgbGlzdGVkIGNvbW1hbmRzOgorICAgICAgICAgIAorICAgICAgICBMb2dnaW5nIHRyYW5zZmVyczoKKyAgICAgICAgICAgICAgICBMT0cgVFJBTlNBQ1RJT05TIChIRUxQIExPRykKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgQXV0b21hdGljIHBlci1maWxlIHRleHQvYmluYXJ5IG1vZGUgc3dpdGNoaW5nOgorICAgICAgICAgICAgICAgIFNFVCBUUkFOU0ZFUiBNT0RFIHsgQVVUT01BVElDLCBNQU5VQUwgfSAoSEVMUCBTRVQKKyAgICAgICAgICAgICAgICBUUkFOU0ZFUikuCisgICAgICAgICAgICAgICAgCisgICAgICAgIENyb3NzLXBsYXRmb3JtIHJlY3Vyc2l2ZSBkaXJlY3RvcnkgdHJlZSB0cmFuc2ZlcjoKKyAgICAgICAgICAgICAgICBTRU5EIC9SRUNVUlNJVkUsIEdFVCAvUkVDVVJTSVZFIChIRUxQIFNFTkQsIEhFTFAgR0VUKS4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgRmlsZSBjb2xsaXNpb24gb3B0aW9uczoKKyAgICAgICAgICAgICAgICBTRVQgRklMRSBDT0xMSVNJT04geyBPVkVSV1JJVEUsIEJBQ0tVUCwgRElTQ0FSRCwgLi4uIH0KKyAgICAgICAgICAgICAgICAoSEVMUCBTRVQgRklMRSkuCisgICAgICAgICAgICAgICAgCisgICAgICAgIFVwZGF0ZSBtb2RlIChvbmx5IHRyYW5zZmVyIGZpbGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUpOgorICAgICAgICAgICAgICAgIFNFVCBGSUxFIENPTExJU0lPTiBVUERBVEUgKEhFTFAgU0VUIEZJTEUpLgorICAgICAgICAgICAgICAgIAorICAgICAgICBGaWxlbmFtZSBzZWxlY3Rpb24gcGF0dGVybnM6CisgICAgICAgICAgICAgICAgKEhFTFAgV0lMRENBUkQpLgorICAgICAgICAgICAgICAgIAorICAgICAgICBGbGV4aWJsZSBmaWxlIHNlbGVjdGlvbjoKKyAgICAgICAgICAgICAgICBTRU5EIChvciBHRVQpIC9CRUZPUkUgL0FGVEVSIC9MQVJHRVIgL1NNQUxMRVIgL1RZUEUKKyAgICAgICAgICAgICAgICAvRVhDRVBULCAuLi4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgQ2hhcmFjdGVyLXNldCBjb252ZXJzaW9uOgorICAgICAgICAgICAgICAgIFNFVCB7IEZJTEUsIFRSQU5TRkVSIH0gQ0hBUkFDVEVSLVNFVCwgQVNTT0NJQVRFLCAuLi4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgRmlsZS9QYXRobmFtZSBjb250cm9sOgorICAgICAgICAgICAgICAgIFNFVCB7IFNFTkQsIFJFQ0VJVkUgfSBQQVRITkFNRVMsIFNFVCBGSUxFIE5BTUVTLgorICAgICAgICAgICAgICAgIAorICAgICAgICBBdG9taWMgZmlsZSBtb3ZlbWVudDoKKyAgICAgICAgICAgICAgICBTRU5EIChvciBHRVQpIC9ERUxFVEUgL1JFTkFNRSAvTU9WRS1UTworICAgICAgICAgICAgICAgIAorICAgICAgICBUcmFuc2ZlcnJpbmcgdG8vZnJvbSBzdGFuZGFyZCBpL28gb2Ygb3RoZXIgY29tbWFuZHM6CisgICAgICAgICAgICAgICAgU0VORCAob3IgR0VUKSAvQ09NTUFORAorICAgICAgICAgICAgICAgIAorICAgICAgICBSZWNvdmVyeSBvZiBpbnRlcnJ1cHRlZCB0cmFuc2ZlciBmcm9tIHBvaW50IG9mIGZhaWx1cmU6CisgICAgICAgICAgICAgICAgUkVTRU5ELCBSRUdFVCAoSEVMUCBSRVNFTkQsIEhFTFAgUkVHRVQpLgorICAgICAgICAgICAgICAgIAorICAgTm9uLUtlcm1pdCBGaWxlIFRyYW5zZmVyCisgICAgICAgICAgCisgICAgICAgICAgWW91IGNhbiBhbHNvIHVzZSBDLUtlcm1pdCB0byB0cmFuc2ZlciBmaWxlcyB3aXRoIEZUUCBvciBIVFRQCisgICAgICAgICAgSW50ZXJuZXQgcHJvdG9jb2xzOyBbMTIwXXNlZSBiZWxvdy4KKyAgICAgICAgICAKKyAgICAgICAgICBPbiBhIHJlZ3VsYXIgc2VyaWFsIG9yIFRlbG5ldCBjb25uZWN0aW9uIHdoZXJlIHRoZSBvdGhlcgorICAgICAgICAgIGNvbXB1dGVyIGRvZXNuJ3Qgc3VwcG9ydCBLZXJtaXQgcHJvdG9jb2wgYXQgYWxsLCB5b3UgaGF2ZQorICAgICAgICAgIHNldmVyYWwgb3B0aW9ucy4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgZGVza3RvcCBjb21tdW5pY2F0aW9ucworICAgICAgICAgIHNvZnR3YXJlIHN1cHBvcnRzIFptb2RlbSwgdXNlICJyeiIgYW5kICJzeiIgb24gdGhlIGhvc3QgcmF0aGVyCisgICAgICAgICAgdGhhbiBLZXJtaXQuIEJ1dCBpZiBLZXJtaXQgaXMgeW91ciBkZXNrdG9wIHNvZnR3YXJlLCBhbmQgeW91CisgICAgICAgICAgYXJlIHVzaW5nIGl0IHRvIG1ha2UgY2FsbHMgb3IgbmV0d29yayBjb25uZWN0aW9ucyB0byBvdGhlcgorICAgICAgICAgIGNvbXB1dGVycyB0aGF0IGRvbid0IHN1cHBvcnQgS2VybWl0IHByb3RvY29sIChvciB0aGF0IGRvbid0CisgICAgICAgICAgaGF2ZSBhIGdvb2QgaW1wbGVtZW50YXRpb24gb2YgaXQpLCB0aGVuIGlmIHlvdXIgY29tcHV0ZXIgYWxzbworICAgICAgICAgIGhhcyBleHRlcm5hbCBYLCBZLCBvciBabW9kZW0gcHJvZ3JhbXMgdGhhdCBhcmUgcmVkaXJlY3RhYmxlLAorICAgICAgICAgIEtlcm1pdCBjYW4gdXNlIHRoZW0gYXMgZXh0ZXJuYWwgcHJvdG9jb2xzLiBIRUxQIFNFVCBQUk9UT0NPTAorICAgICAgICAgIGZvciBkZXRhaWxzLgorICAgICAgICAgIAorICAgICAgICAgIFlvdSBjYW4gYWxzbyBjYXB0dXJlICJyYXciIGRhdGEgc3RyZWFtcyBmcm9tIHRoZSBvdGhlciBjb21wdXRlcgorICAgICAgICAgIHdpdGggTE9HIFNFU1NJT04gKEhFTFAgTE9HIGFuZCBIRUxQIFNFVCBTRVNTSU9OLUxPRyBmb3IKKyAgICAgICAgICBkZXRhaWxzKSwgYW5kIHlvdSBjYW4gdXBsb2FkIGZpbGVzIHdpdGhvdXQgYW55IHByb3RvY29sIGF0IGFsbAorICAgICAgICAgIHdpdGggVFJBTlNNSVQgKEhFTFAgVFJBTlNNSVQsIEhFTFAgU0VUIFRSQU5TTUlUKS4KKyAgICAgICAgICAKKyAgIFsgWzEyMV1LZXJtaXQgSG9tZSBdIFsgWzEyMl1DLUtlcm1pdCBIb21lIF0gWyBbMTIzXUMtS2VybWl0IEZBUSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgIAorICBLRVJNSVQgQ0xJRU5UL1NFUlZFUiBDT05ORUNUSU9OUyBbIFsxMjRdVG9wIF0gWyBbMTI1XUNvbnRlbnRzIF0gWyBbMTI2XU5leHQgXQorICBbIFsxMjddUHJldmlvdXMgXQorICAKKyAgIE9uIGFueSBraW5kIG9mIGNvbm5lY3Rpb24geW91IGNhbiBtYWtlIHdpdGggS2VybWl0IC0tIHNlcmlhbCwgVENQL0lQLAorICAgWC4yNSwgZXRjIC0tIHlvdSBjYW4gc2V0IHVwIGEgY29udmVuaWVudCBjbGllbnQvc2VydmVyIHJlbGF0aW9uc2hpcAorICAgYmV0d2VlbiB5b3VyIEtlcm1pdCBjbGllbnQgKHRoZSBvbmUgdGhhdCBtYWRlIHRoZSBjb25uZWN0aW9uKSBhbmQgdGhlCisgICBLZXJtaXQgcHJvZ3JhbSBvbiB0aGUgZmFyIGVuZCBvZiB0aGUgY29ubmVjdGlvbiAodGhlIHJlbW90ZSBLZXJtaXQpIGJ5CisgICBwdXR0aW5nIHRoZSByZW1vdGUgS2VybWl0IGluIHNlcnZlciBtb2RlLiBUaGlzIGlzIG5vcm1hbGx5IGRvbmUgYnkKKyAgIGdpdmluZyBpdCBhIFNFUlZFUiBjb21tYW5kLCBvciBieSBzdGFydGluZyBpdCB3aXRoIHRoZSAteCBjb21tYW5kLWxpbmUKKyAgIG9wdGlvbi4gSW4gc29tZSBjYXNlcyAoWzEyOF1JbnRlcm5ldCBLZXJtaXQgU2VydmljZSwgU1NIIGNvbm5lY3Rpb25zCisgICB0byBhIEtlcm1pdCBzdWJzeXN0ZW0sIG9yIHNwZWNpYWxseSBjb25maWd1cmVkIGhvc3RzKSwgdGhlcmUgaXMKKyAgIGFscmVhZHkgYSBLZXJtaXQgc2VydmVyIHdhaXRpbmcgb24gdGhlIGZhciBlbmQuIEhlcmUgaXMgYSBxdWljaworICAgc3lub3BzaXMgb2YgdGhlIGNvbW1hbmRzIHlvdSBjYW4gZ2l2ZSB0byB0aGUgY2xpZW50IGZvciBpbnRlcmFjdGluZworICAgd2l0aCB0aGUgc2VydmVyOgorICAgCisgICBTRU5EIFsgc3dpdGNoZXMgXSBmaWxlbmFtZQorICAgICAgICAgIFNlbmRzIHRoZSBuYW1lZCBmaWxlIHRvIHRoZSBzZXJ2ZXIuIFRoZSBmaWxlbmFtZSBjYW4gaW5jbHVkZQorICAgICAgICAgIHdpbGRjYXJkcy4gTG90cyBvZiBzd2l0Y2hlcyBhcmUgYXZhaWxhYmxlIGZvciBmaWxlIHNlbGVjdGlvbiwKKyAgICAgICAgICBldGMuIFR5cGUgSEVMUCBTRU5EIGF0IHRoZSBjbGllbnQgcHJvbXB0IGZvciBkZXRhaWxzLgorICAgICAgICAgIAorICAgR0VUIFsgc3dpdGNoZXMgXSBmaWxlbmFtZQorICAgICAgICAgIEFza3MgdGhlIHNlcnZlciB0byBzZW5kIHRoZSBuYW1lZCBmaWxlLiBUaGUgZmlsZW5hbWUgY2FuCisgICAgICAgICAgaW5jbHVkZSB3aWxkY2FyZHMuIFR5cGUgSEVMUCBHRVQgYXQgdGhlIGNsaWVudCBwcm9tcHQgZm9yCisgICAgICAgICAgZGV0YWlscy4KKyAgICAgICAgICAKKyAgIEJZRQorICAgICAgICAgIFRlcm1pbmF0ZXMgdGhlIHNlcnZlciBhbmQgY2xvc2VzIHlvdXIgY29ubmVjdGlvbiB0byBpdC4KKyAgICAgICAgICAKKyAgIEZJTklTSAorICAgICAgICAgIFRlcm1pbmF0ZXMgdGhlIHNlcnZlci4gSWYgeW91IHN0YXJ0ZWQgdGhlIHNlcnZlciB5b3Vyc2VsZiwgdGhpcworICAgICAgICAgIGxlYXZlcyB0aGUgcmVtb3RlIGhvc3QgYXQgaXRzIHNoZWxsIHByb21wdC4gSWYgaXQgd2FzIGEKKyAgICAgICAgICBkZWRpY2F0ZWQgc2VydmVyIChzdWNoIGFzIElLU0Qgb3IgYW4gU1NIIHN1YnN5c3RlbSksIEZJTklTSCBpcworICAgICAgICAgIGVxdWl2YWxlbnQgdG8gQllFLgorICAgICAgICAgIAorICAgU0VUIExPQ1VTIHsgTE9DQUwsIFJFTU9URSwgQVVUTyB9CisgICAgICAgICAgKEMtS2VybWl0IDguMC4yMDEgYW5kIGxhdGVyLCBLOTUgMS4xLjIxIGFuZCBsYXRlcikgVGhpcyB0ZWxscworICAgICAgICAgIHRoZSBjbGllbnQgd2hldGhlciBmaWxlLW1hbmFnZW1lbnQgY29tbWFuZHMgbGlrZSBDRCwgUFdELAorICAgICAgICAgIERJUkVDVE9SWSwgREVMRVRFLCBNS0RJUiwgZXRjLCBzaG91bGQgYmUgZXhlY3V0ZWQgbG9jYWxseSBvciBieQorICAgICAgICAgIHRoZSBzZXJ2ZXIuIEluIHRoaXMgdHlwZSBvZiBjb25uZWN0aW9uLCB0aGUgZGVmYXVsdCBpcyBMT0NBTC4KKyAgICAgICAgICBVc2UgU0VUIExPQ1VTIFJFTU9URSBpZiB5b3Ugd2FudCBLZXJtaXQgdG8gYmVoYXZlIGxpa2UgYW4gRlRQCisgICAgICAgICAgY2xpZW50LCBpbiB3aGljaCBjYXNlIHRoZXNlIGNvbW1hbmRzIGFyZSBleGVjdXRlZCByZW1vdGVseSwgYW5kCisgICAgICAgICAgdGhlaXIgbG9jYWwgdmVyc2lvbnMgbXVzdCBoYXZlIGFuIEwgcHJlZml4OiBMQ0QsIExQV0QsCisgICAgICAgICAgTERJUkVDVE9SWSwgZXRjLiBXaGVuIExPQ1VTIGlzIExPQ0FMLCB0aGVuIHRoZSByZW1vdGUgdmVyc2lvbnMKKyAgICAgICAgICBtdXN0IGhhdmUgYW4gUiBwcmVmaXg6IFJDRCwgUlBXRCwgUkRJUkVDVE9SWSwgZXRjLiBIRUxQIFNFVAorICAgICAgICAgIExPQ1VTIGZvciBkZXRhaWxzLiBTSE9XIENPTU1BTkQgdG8gc2VlIGN1cnJlbnQgbG9jdXMuCisgICAgICAgICAgCisgICBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBhZmZlY3RlZCBieSBTRVQgTE9DVVM6CisgICAKKyAgIENELCBMQ0QsIFJDRAorICAgQ2hhbmdlICh3b3JraW5nLCBjdXJyZW50KSBkaXJlY3RvcnkuIEhFTFAgQ0QgZm9yIGRldGFpbHMuCisgICAKKyAgIENEVVAsIExDRFVQLCBSQ0RVUAorICAgQ0Qgb25lIGxldmVsIHVwLgorICAgCisgICBESVJFQ1RPUlksIExESVJFQ1RPUlksIFJESVJFQ1RPUlkKKyAgIFByb2R1Y2UgYSBkaXJlY3RvcnkgbGlzdGluZy4gTWFueSBvcHRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGxvY2FsCisgICBsaXN0aW5ncy4gSEVMUCBESVJFQ1RPUlkgZm9yIGRldGFpbHMuCisgICAKKyAgIERFTEVURSwgTERFTEVURSwgUkRFTEVURQorICAgRGVsZXRlcyBmaWxlcyBvciBkaXJlY3Rvcmllcy4gTWFueSBvcHRpb25zIGF2YWlsYWJsZSwgSEVMUCBERUxFVEUuCisgICAKKyAgIFJFTkFNRSwgTFJFTkFNRSwgUlJFTkFNRQorICAgUmVuYW1lcyBmaWxlcyBvciBkaXJlY3Rvcmllcy4gTWFueSBvcHRpb25zIGF2YWlsYWJsZSwgSEVMUCBSRU5BTUUuCisgICAKKyAgIE1LRElSLCBMTUtESVIsIFJNS0RJUgorICAgQ3JlYXRlcyBhIGRpcmVjdG9yeS4gSEVMUCBNS0RJUi4KKyAgIAorICAgUk1ESVIsIExSTURJUiwgUlJNRElSCisgICBSZW1vdmVzIGEgZGlyZWN0b3J5LiBIRUxQIFJNRElSLiBUaGVyZSBhcmUgZG96ZW5zIC0tIG1heWJlIGh1bmRyZWRzIC0tCisgICBvZiBvdGhlciBjb21tYW5kcywgZGVzY3JpYmVkIGluIHRoZSBidWlsdC1pbiBoZWxwLCBvbiB0aGUgd2Vic2l0ZSwKKyAgIGFuZC9vciBpbiB0aGUgcHVibGlzaGVkIG9yIG9ubGluZSBtYW51YWxzLiBCdXQgZXZlbiBpZiB5b3UgZG9uJ3QgaGF2ZQorICAgYWNjZXNzIHRvIGRvY3VtZW50YXRpb24sIHlvdSBjYW4gInNldCBsb2N1cyByZW1vdGUiIGFuZCB0aGVuIHVzZQorICAgcHJldHR5IG11Y2ggdGhlIHNhbWUgY29tbWFuZHMgeW91IHdvdWxkIHVzZSB3aXRoIGFueSBGVFAgY2xpZW50LgorICAgCisgICBbIFsxMjldS2VybWl0IEhvbWUgXSBbIFsxMzBdQy1LZXJtaXQgSG9tZSBdIFsgWzEzMV1DLUtlcm1pdCBGQVEgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAKKyAgS0VSTUlUJ1MgQlVJTFQtSU4gRlRQIEFORCBIVFRQIENMSUVOVFMgWyBbMTMyXVRvcCBdIFsgWzEzM11Db250ZW50cyBdIFsKKyAgWzEzNF1OZXh0IF0gWyBbMTM1XVByZXZpb3VzIF0KKyAgCisgICBLZXJtaXQncyBGVFAgY2xpZW50IGlzIGxpa2UgdGhlIHJlZ3VsYXIgVW5peCBGVFAgY2xpZW50IHRoYXQgeW91J3JlCisgICB1c2VkIHRvLCBidXQgd2l0aCBzb21lIGRpZmZlcmVuY2VzOgorICAgCisgICAgICogSXQgaGFzIGxvdHMgbW9yZSBjb21tYW5kcyBhbmQgZmVhdHVyZXMuCisgICAgICogWW91IGNhbiBoYXZlIGFuIEZUUCBzZXNzaW9uIGFuZCBhIHJlZ3VsYXIgS2VybWl0IHNlcmlhbCBvciBUZWxuZXQKKyAgICAgICBzZXNzaW9uIG9wZW4gYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgKiBGVFAgc2Vzc2lvbnMgY2FuIGJlIGZ1bGx5IGF1dG9tYXRlZC4KKyAgICAgICAKKyAgIEJ5IGRlZmF1bHQgS2VybWl0J3MgRlRQIGNsaWVudCB0cmllcyBpdHMgYmVzdCB0byBwcmVzZW50IHRoZSBzYW1lIHVzZXIKKyAgIGludGVyZmFjZSBhcyBhIHJlZ3VsYXIgRlRQIGNsaWVudDogUFVULCBHRVQsIERJUiwgQ0QsIEJZRSwgZXRjLCBzaG91bGQKKyAgIHdvcmsgdGhlIHNhbWUsIGV2ZW4gdGhvdWdoIHNvbWUgb2YgdGhlc2UgY29tbWFuZHMgaGF2ZSBkaWZmZXJlbnQKKyAgIG1lYW5pbmcgaW4gS2VybWl0LXRvLUtlcm1pdCBjb25uZWN0aW9uczsgZm9yIGV4YW1wbGUsIENELCBESVIsIFJFTkFNRSwKKyAgIGV0YywgaW4gS2VybWl0IGFjdCBsb2NhbGx5LCB3aGVyZWFzIGluIEZUUCB0aGV5IGFyZSBjb21tYW5kcyBmb3IgdGhlCisgICBzZXJ2ZXIuIFRoaXMgbWlnaHQgY2F1c2Ugc29tZSBjb25mdXNpb24sIGJ1dCBhcyBpbiBhbGwgdGhpbmdzIEtlcm1pdCwKKyAgIHlvdSBoYXZlIHRvdGFsIGNvbnRyb2w6CisgICAKKyAgICAgKiBUaGUgWzEzNl1TRVQgTE9DVVMgY29tbWFuZCBsZXRzIHlvdSBzcGVjaWZ5IHdoZXJlIGZpbGUgbWFuYWdlbWVudAorICAgICAgIGNvbW1hbmRzIHNob3VsZCBiZSBleGVjdXRlZCAtLSBsb2NhbGx5IG9yIHJlbW90ZWx5IC0tIGZvciBhbnkga2luZAorICAgICAgIG9mIGNvbm5lY3Rpb24uCisgICAgICogQW55IEZUUCBjb21tYW5kIGNhbiBiZSBwcmVmaXhlZCB3aXRoIHRoZSB3b3JkICJGVFAiIHRvIHJlbW92ZSBhbnkKKyAgICAgICBhbWJpZ3VpdHkuCisgICAgICAgCisgICBQZW5kaW5nIHB1YmxpY2F0aW9uIG9mIHRoZSBuZXh0IGVkaXRpb24gb2YgdGhlIG1hbnVhbCwgdGhlIEtlcm1pdCBGVFAKKyAgIGNsaWVudCBpcyB0aG9yb3VnaGx5IGRvY3VtZW50ZWQgYXQgdGhlIEtlcm1pdCBQcm9qZWN0IHdlYnNpdGU6CisgICAKKyAgWzEzN11odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvZnRwY2xpZW50Lmh0bWwKKworICAgWW91IGFsc28gY2FuIHVzZSBIRUxQIEZUUCBhbmQgSEVMUCBTRVQgRlRQIHRvIGdldCBkZXNjcmlwdGlvbnMgb2YKKyAgIEtlcm1pdCdzIEZUUC1yZWxhdGVkIGNvbW1hbmRzLgorICAgCisgICBUaGUgSFRUUCBjbGllbnQgaXMgc2ltaWxhciB0byB0aGUgRlRQIG9uZSwgZXhjZXB0IHlvdSBwcmVmaXggZWFjaAorICAgY29tbWFuZCB3aXRoIEhUVFAgaW5zdGVhZCBvZiBGVFA6IEhUVFAgT1BFTiwgSFRUUCBHRVQsIEhUVFAgUFVULCBIVFRQCisgICBDTE9TRSwgZXRjLiBUeXBlIEhFTFAgSFRUUCBmb3IgZGV0YWlscywgb3IgdmlzaXQgdGhlIHRvIHZpZXcgdGhlCisgICBbMTM4XW1hbnVhbCBzdXBwbGVtZW50cy4gSFRUUCBjb25uZWN0aW9ucyBjYW4gYmUgb3BlbiBhdCB0aGUgc2FtZSB0aW1lCisgICBhcyByZWd1bGFyIHNlcmlhbCBvciBUZWxuZXQgY29ubmVjdGlvbnMgYW5kIEZUUCBjb25uZWN0aW9ucy4gU28gS2VybWl0CisgICBjYW4gbWFuYWdlIHVwIHRvIHRocmVlIHR5cGVzIGNvbm5lY3Rpb25zIHNpbXVsdGFuZW91c2x5LgorICAgCisgICBbIFsxMzldS2VybWl0IEhvbWUgXSBbIFsxNDBdQy1LZXJtaXQgSG9tZSBdIFsgWzE0MV1DLUtlcm1pdCBGQVEgXSBbCisgICBbMTQyXUZUUCBDbGllbnQgXSBbIFsxNDNdSFRUUCBDbGllbnQgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAKKyAgSU5URVJORVQgS0VSTUlUIFNFUlZJQ0UgWyBbMTQ0XVRvcCBdIFsgWzE0NV1Db250ZW50cyBdIFsgWzE0Nl1OZXh0IF0gWworICBbMTQ3XVByZXZpb3VzIF0KKyAgCisgICBDLUtlcm1pdCBjYW4gYmUgY29uZmlndXJlZCBhbmQgcnVuIGFzIGFuIEludGVybmV0IHNlcnZpY2UgKGNhbGxlZAorICAgSUtTRCksIHNpbWlsYXIgdG8gYW4gRlRQIHNlcnZlciAoRlRQRCkgZXhjZXB0IHlvdSBjYW4gKGJ1dCBuZWVkIG5vdCkKKyAgIGludGVyYWN0IHdpdGggaXQgZGlyZWN0bHksIHBsdXMgaXQgZG9lcyBhIGxvdCBtb3JlIHRoYW4gYW4gRlRQIHNlcnZlcgorICAgY2FuIGRvLiBUaGUgVENQIHBvcnQgZm9yIElLU0QgaXMgMTY0OS4gSXQgdXNlcyBUZWxuZXQgcHJvdG9jb2wuCisgICBDLUtlcm1pdCBjYW4gYmUgYW4gSW50ZXJuZXQgS2VybWl0IFNlcnZlciwgb3IgaXQgY2FuIGJlIGEgY2xpZW50IG9mIGFuCisgICBJS1NELiBZb3UgY2FuIG1ha2UgY29ubmVjdGlvbnMgZnJvbSBDLUtlcm1pdCB0byBhbiBJS1NEIHdpdGggYW55IG9mCisgICB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorICAgCisgIHRlbG5ldCBmb28uYmFyLmVkdSAxNjQ5CisgIHRlbG5ldCBmb28uYmFyLmVkdSBrZXJtaXQgICA7IGlmICJrZXJtaXQiIGlzIGxpc3RlZCBpbiAvZXRjL3NlcnZpY2VzCisgIGlrc2QgZm9vLmJhci5lZHUKKworICAgVGhlIElLU0QgY29tbWFuZCBpcyBlcXVpdmFsZW50IHRvIGEgVEVMTkVUIGNvbW1hbmQgc3BlY2lmeWluZyBwb3J0CisgICAxNjQ5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBtYWtpbmcgYW5kIHVzaW5nIGNvbm5lY3Rpb25zIHRvIGFuCisgICBJS1NELCBzZWU6CisgICAKKyAgWzE0OF1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY3Vpa3NkLmh0bWwKKworICAgWW91IGNhbiBydW4gYW4gSW50ZXJuZXQgS2VybWl0IFNlcnZpY2Ugb24geW91ciBvd24gY29tcHV0ZXIgdG9vIChpZgorICAgeW91IGFyZSB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3IpLiBGb3IgaW5zdHJ1Y3Rpb25zLCBzZWU6CisgICAKKyAgWzE0OV1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaWtzZC5odG1sCisKKyAgIFsgWzE1MF1LZXJtaXQgSG9tZSBdIFsgWzE1MV1DLUtlcm1pdCBIb21lIF0gWyBbMTUyXUMtS2VybWl0IEZBUSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgIAorICBTRUNVUklUWSBbIFsxNTNdVG9wIF0gWyBbMTU0XUNvbnRlbnRzIF0gWyBbMTU1XU5leHQgXSBbIFsxNTZdUHJldmlvdXMgXQorICAKKyAgIEFsbCBvZiBDLUtlcm1pdCdzIGJ1aWx0LWluIFRDUC9JUCBuZXR3b3JraW5nIG1ldGhvZHMgKFRlbG5ldCwgUmxvZ2luLAorICAgSUtTRCwgRlRQLCBhbmQgSFRUUCkgY2FuIGJlIHNlY3VyZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZworICAgSUVURi1hcHByb3ZlZCBtZXRob2RzOgorICAgCisgICAgICogTUlUIEtlcmJlcm9zIElWCisgICAgICogTUlUIEtlcmJlcm9zIFYKKyAgICAgKiBTU0wvVExTCisgICAgICogU3RhbmZvcmQgU1JQCisgICAgICAgCisgICBGb3IgY29tcGxldGUgaW5zdHJ1Y3Rpb25zIHNlZToKKyAgIAorICBbMTU3XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zZWN1cml0eS5odG1sCisKKyAgIEFuZCBhcyBub3RlZCBwcmV2aW91c2x5LCB5b3UgY2FuIGFsc28gbWFrZSBTU0ggY29ubmVjdGlvbnMgd2l0aAorICAgQy1LZXJtaXQgaWYgeW91IGFscmVhZHkgaGF2ZSBhbiBTU0ggY2xpZW50IGluc3RhbGxlZC4KKyAgIAorICAgWyBbMTU4XUtlcm1pdCBIb21lIF0gWyBbMTU5XUMtS2VybWl0IEhvbWUgXSBbIFsxNjBdQy1LZXJtaXQgRkFRIF0KKyAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgCisgIEFMVEVSTkFUSVZFIENPTU1BTkQtTElORSBQRVJTT05BTElUSUVTIFsgWzE2MV1Ub3AgXSBbIFsxNjJdQ29udGVudHMgXSBbCisgIFsxNjNdTmV4dCBdIFsgWzE2NF1QcmV2aW91cyBdCisgIAorICAgV2hlbiBpbnZva2VkIGFzICJrZXJtaXQiIG9yIGFueSBvdGhlciBuYW1lIGJlc2lkZXMgYW55IG9mIHRoZSBzcGVjaWFsCisgICBvbmVzLCBDLUtlcm1pdCBoYXMgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIGRlc2NyaWJlZCBhYm92ZSBpbiB0aGUKKyAgIFsxNjVdT1BUSU9OUyBzZWN0aW9uLiBIb3dldmVyLCBpZiB5b3UgaW52b2tlIEMtS2VybWl0IHVzaW5nIGFueSBvZiB0aGUKKyAgIGZvbGxvd2luZyBuYW1lczoKKyAgIAorICAgICB0ZWxuZXQgIFRlbG5ldCBjbGllbnQKKyAgICAgZnRwICAgICBGVFAgY2xpZW50CisgICAgIGh0dHAgICAgSFRUUCBjbGllbnQKKyAgICAgaHR0cHMgICBTZWN1cmUgSFRUUCBjbGllbnQKKyAgIAorICAgS2VybWl0J3MgY29tbWFuZC1saW5lIHBlcnNvbmFsaXR5IGNoYW5nZXMgdG8gbWF0Y2guIFRoaXMgY2FuIGJlIGRvbmUKKyAgIChhbW9uZyBvdGhlciB3YXlzKSB3aXRoIHN5bWJvbGljIGxpbmtzIChzeW1saW5rcykuIEZvciBleGFtcGxlLCBpZiB5b3UKKyAgIHdhbnQgQy1LZXJtaXQgdG8gYmUgeW91ciByZWd1bGFyIFRlbG5ldCBjbGllbnQsIG9yIHRoZSBUZWxuZXQgaGVscGVyCisgICBvZiB5b3VyIFdlYiBicm93c2VyLCB5b3UgY2FuIGNyZWF0ZSBhIGxpbmsgbGlrZSB0aGUgZm9sbG93aW5nIGluIGEKKyAgIGRpcmVjdG9yeSB0aGF0IGxpZXMgaW4geW91ciBQQVRIIGFoZWFkIG9mIHRoZSByZWd1bGFyIHRlbG5ldCBwcm9ncmFtOgorICAgCisgIGxuIC1zIC91c3IvbG9jYWwvYmluL2tlcm1pdCB0ZWxuZXQKKworICAgTm93IHdoZW4geW91IGdpdmUgYSAidGVsbmV0IiBjb21tYW5kLCB5b3UgYXJlIGludm9raW5nIEtlcm1pdCBpbnN0ZWFkLAorICAgYnV0IHdpdGggaXRzIFRlbG5ldCBjb21tYW5kLWxpbmUgcGVyc29uYWxpdHkgc28sIGZvciBleGFtcGxlOgorICAgCisgIHRlbG5ldCB4eXpjb3JwLmNvbQorCisgICBNYWtlcyBhIFRlbG5ldCBjb25uZWN0aW9uIHRvIHh5emNvcnAuY29tLCBhbmQgS2VybWl0IGV4aXRzCisgICBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIChqdXN0IGxpa2UgdGhlIHJlZ3VsYXIKKyAgIFRlbG5ldCBjbGllbnQpLiBUeXBlICJ0ZWxuZXQgLWgiIHRvIGdldCBhIGxpc3Qgb2YgS2VybWl0J3MKKyAgIFRlbG5ldC1wZXJzb25hbGl0eSBjb21tYW5kLWxpbmUgb3B0aW9ucywgd2hpY2ggYXJlIGludGVuZGVkIHRvIGJlIGFzCisgICBjb21wYXRpYmxlIGFzIHBvc3NpYmxlIHdpdGggdGhlIHJlZ3VsYXIgVGVsbmV0IGNsaWVudC4KKyAgIAorICAgU2ltaWxhcmx5IGZvciBGVFA6CisgICAKKyAgbG4gLXMgL3Vzci9sb2NhbC9iaW4va2VybWl0IGZ0cAorCisgICBBbmQgbm93IHR5cGUgImZ0cCAtaCIgdG8gc2VlIGl0cyBjb21tYW5kLWxpbmUgb3B0aW9ucywgYW5kIHVzZSBjb21tYW5kCisgICBsaW5lcyBqdXN0IGxpa2UgeW91IHdvdWxkIGdpdmUgeW91ciByZWd1bGFyIEZUUCBjbGllbnQ6CisgICAKKyAgZnRwIC1uIHh5emNvcnAuY29tCisKKyAgIGJ1dCB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucyBhbGxvd2luZyBhbiBlbnRpcmUgc2Vzc2lvbiB0byBiZSBzcGVjaWZpZWQKKyAgIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFzIGV4cGxhaW5lZCBpbiB0aGUgQy1LZXJtaXQgWzE2Nl1GVFAgY2xpZW50CisgICBkb2N1bWVudGF0aW9uLgorICAgCisgICBBbmQgc2ltaWxhcmx5IGZvciBIVFRQOgorICAgCisgIGxuIC1zIC91c3IvbG9jYWwvYmluL2tlcm1pdCBodHRwCisgIC4vaHR0cCAtaAorICAuL2h0dHAgd3d3LmNvbHVtYmlhLmVkdSAtZyBrZXJtaXQvaW5kZXguaHRtbAorCisgICBGaW5hbGx5LCBpZiBLZXJtaXQncyBmaXJzdCBjb21tYW5kLWxpbmUgb3B0aW9uIGlzIGEgVGVsbmV0LCBGVFAsIElLU0QsCisgICBvciBIVFRQIFVSTCwgS2VybWl0IGF1dG9tYXRpY2FsbHkgbWFrZXMgdGhlIGFwcHJvcHJpYXRlIGtpbmQgb2YKKyAgIGNvbm5lY3Rpb24gYW5kLCBpZiBpbmRpY2F0ZWQgYnkgdGhlIFVSTCwgdGFrZXMgdGhlIGRlc2lyZWQgYWN0aW9uOgorICAgCisgIGtlcm1pdCB0ZWxuZXQ6eHl6Y29ycC5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBPcGVucyBhIFRlbG5ldCBzZXNzaW9uCisgIGtlcm1pdCB0ZWxuZXQ6Ly9vbGdhQHh5emNvcnAuY29tICAgICAgICAgICAgICAgICAgICAgOyBEaXR0byBmb3IgdXNlciBvbGdhCisgIGtlcm1pdCBmdHA6Ly9vbGdhQHh5emNvcnAuY29tL3B1YmxpYy9vb2ZhLnppcCAgICAgICAgOyBEb3dubG9hZHMgYSBmaWxlCisgIGtlcm1pdCBrZXJtaXQ6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL1JFQUQuTUUgOyBEaXR0byBmb3IgSUtTRAorICBrZXJtaXQgaWtzZDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvUkVBRC5NRSAgIDsgKFRoaXMgd29ya3MgdG9vKQorICBrZXJtaXQgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwgICAgIDsgR3JhYnMgYSB3ZWIgcGFnZQorICBrZXJtaXQgaHR0cHM6Ly93d3dzLnh5emNvcnAuY29tL3NlY3JldC9wbGFuLmh0bWwgICAgIDsgR3JhYnMgYSBzZWN1cmUgd2ViIHBhZworZQorCisgICBbIFsxNjddS2VybWl0IEhvbWUgXSBbIFsxNjhdQy1LZXJtaXQgSG9tZSBdIFsgWzE2OV1DLUtlcm1pdCBGQVEgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAKKyAgTElDRU5TRSBbIFsxNzBdVG9wIF0gWyBbMTcxXUNvbnRlbnRzIF0gWyBbMTcyXU5leHQgXSBbIFsxNzNdUHJldmlvdXMgXQorICAKKyAgIEMtS2VybWl0IGhhcyBhbiB1bnVzdWFsIGxpY2Vuc2UsIGJ1dCBhIGZhaXIgYW5kIHNlbnNpYmxlIG9uZSBnaXZlbgorICAgdGhhdCB0aGUgS2VybWl0IFByb2plY3QgbXVzdCBzdXBwb3J0IGl0c2VsZiBvdXQgb2YgcmV2ZW51ZTogaXQncyBub3QgYQorICAgQlNEIGxpY2Vuc2UsIG5vdCBHUEwsIG5vdCBBcnRpc3RpYywgbm90IGNvbW1lcmNpYWwsIG5vdCBzaGFyZXdhcmUsIG5vdAorICAgZnJlZXdhcmUuIEl0IGNhbiBiZSBzdW1tZWQgdXAgbGlrZSB0aGlzOiBpZiB5b3Ugd2FudCBDLUtlcm1pdCBmb3IgeW91cgorICAgb3duIHVzZSwgeW91IGNhbiBkb3dubG9hZCBhbmQgdXNlIGl0IHdpdGhvdXQgY29zdCBvciBsaWNlbnNlIChidXQgd2UnZAorICAgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgcHVyY2hhc2UgdGhlIG1hbnVhbCkuIEJ1dCBpZiB5b3Ugd2FudCB0bworICAgc2VsbCBDLUtlcm1pdCBvciBidW5kbGUgaXQgd2l0aCBhIHByb2R1Y3Qgb3Igb3RoZXJ3aXNlIGRpc3RyaWJ1dGUgaXQKKyAgIGluIGEgY29tbWVyY2lhbCBzZXR0aW5nIEVYQ0VQVCBXSVRIIEFOIE9QRU4tU09VUkNFIE9QRVJBVElORyBTWVNURU0KKyAgIERJU1RSSUJVVElPTiBzdWNoIGFzIExpbnV4LCBGcmVlQlNELCBOZXRCU0QsIG9yIE9wZW5CU0QsIHlvdSBtdXN0CisgICBsaWNlbnNlIGl0LiBUbyBzZWUgdGhlIGNvbXBsZXRlIGxpY2Vuc2UsIGdpdmUgdGhlIExJQ0VOU0UgY29tbWFuZCBhdAorICAgdGhlIHByb21wdCwgb3Igc2VlIHRoZSBDT1BZSU5HLlRYVCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggQy1LZXJtaXQgNy4wCisgICBvciBsYXRlciwgb3IgZG93bmxvYWQgaXQgZnJvbQorICAgWzE3NF1mdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9DT1BZSU5HLlRYVC4gU2VuZAorICAgbGljZW5zaW5nIGlucXVpcmllcyB0byBbMTc1XWtlcm1pdEBjb2x1bWJpYS5lZHUuCisgICAKKyAgIFsgWzE3Nl1LZXJtaXQgSG9tZSBdIFsgWzE3N11DLUtlcm1pdCBIb21lIF0gWyBbMTc4XUMtS2VybWl0IEZBUSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgIAorICBPVEhFUiBUT1BJQ1MgWyBbMTc5XVRvcCBdIFsgWzE4MF1Db250ZW50cyBdIFsgWzE4MV1OZXh0IF0gWyBbMTgyXVByZXZpb3VzIF0KKyAgCisgICBUaGVyZSdzIHdheSBtb3JlIHRvIEMtS2VybWl0IHRoYW4gd2UndmUgdG91Y2hlZCBvbiBoZXJlIC0tCisgICB0cm91Ymxlc2hvb3RpbmcsIGN1c3RvbWl6YXRpb24sIGNoYXJhY3RlciBzZXRzLCBkaWFsaW5nIGRpcmVjdG9yaWVzLAorICAgc2VuZGluZyBwYWdlcywgc2NyaXB0IHdyaXRpbmcsIGFuZCBvbiBhbmQgb24sIGFsbCBvZiB3aGljaCBhcmUgY292ZXJlZAorICAgaW4gdGhlIG1hbnVhbCBhbmQgdXBkYXRlcyBhbmQgc3VwcGxlbWVudHMuIEZvciB0aGUgbW9zdCB1cC10by1kYXRlCisgICBpbmZvcm1hdGlvbiBvbiBkb2N1bWVudGF0aW9uIChvciB1cGRhdGVkIGRvY3VtZW50YXRpb24gaXRzZWxmKSB2aXNpdAorICAgdGhlIEtlcm1pdCBQcm9qZWN0IHdlYnNpdGU6CisgICAKKyAgWzE4M11odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvCisKKyAgIFRoZXJlIHlvdSB3aWxsIGFsc28gZmluZCBbMTg0XUtlcm1pdCBzb2Z0d2FyZSBwYWNrYWdlcyBmb3Igb3RoZXIKKyAgIHBsYXRmb3JtczogZGlmZmVyZW50IFVuaXggdmFyaWV0aWVzLCBXaW5kb3dzLCBET1MsIFZNUywgSUJNCisgICBtYWluZnJhbWVzLCBhbmQgbWFueSBvdGhlcnM6IDIwKyB5ZWFycycgd29ydGguCisgICAKKyAgIFsgWzE4NV1LZXJtaXQgSG9tZSBdIFsgWzE4Nl1DLUtlcm1pdCBIb21lIF0gWyBbMTg3XUMtS2VybWl0IEZBUSBdCisgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgIAorICBET0NVTUVOVEFUSU9OIEFORCBVUERBVEVTIFsgWzE4OF1Ub3AgXSBbIFsxODldQ29udGVudHMgXSBbIFsxOTBdTmV4dCBdIFsKKyAgWzE5MV1QcmV2aW91cyBdCisgIAorICAgVGhlIG1hbnVhbCBmb3IgQy1LZXJtaXQgaXM6CisgICAKKyAgICAxLiBGcmFuayBkYSBDcnV6IGFuZCBDaHJpc3RpbmUgTS4gR2lhbm9uZSwgWzE5Ml1Vc2luZyBDLUtlcm1pdCwKKyAgICAgICBTZWNvbmQgRWRpdGlvbiwgRGlnaXRhbCBQcmVzcyAvIEJ1dHRlcndvcnRoLUhlaW5lbWFubiwgV29idXJuLCBNQSwKKyAgICAgICAxOTk3LCA2MjIgcGFnZXMsIElTQk4gMS01NTU1OC0xNjQtMS4gVGhpcyBpcyBhIHByaW50ZWQgYm9vay4gSXQKKyAgICAgICBjb3ZlcnMgQy1LZXJtaXQgNi4wLgorICAgIDIuIFRoZSBDLUtlcm1pdCA3LjAgU3VwcGxlbWVudDoKKyAgICAgICBbMTkzXWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbAorICAgIDMuIFRoZSBDLUtlcm1pdCA4LjAgU3VwcGxlbWVudDoKKyAgICAgICBbMTk0XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbAorICAgICAgIAorICAgVGhlIEMtS2VybWl0IGhvbWUgcGFnZSBpcyBoZXJlOgorICAgCisgIFsxOTVdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorCisgICBWaXNpdCB0aGlzIHBhZ2UgdG8gbGVhcm4gYWJvdXQgbmV3IHZlcnNpb25zLCBCZXRhIHRlc3RzLCBhbmQgb3RoZXIKKyAgIG5ld3M7IHRvIHJlYWQgY2FzZSBzdHVkaWVzIGFuZCB0dXRvcmlhbHM7IHRvIGRvd25sb2FkIHNvdXJjZSBjb2RlLAorICAgaW5zdGFsbCBwYWNrYWdlcywgYW5kIFsxOTZdcHJlYnVpbHQgYmluYXJpZXMgZm9yIG1hbnkgcGxhdGZvcm1zLiBBbHNvCisgICB2aXNpdDoKKyAgIAorICAgWzE5N11odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2NyaXB0bGliLmh0bWwKKyAgICAgICAgICBUaGUgS2VybWl0IHNjcmlwdCBsaWJyYXJ5IGFuZCB0dXRvcmlhbAorICAgICAgICAgIAorICAgWzE5OF1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvbmV3ZmFxLmh0bWwKKyAgICAgICAgICBUaGUgS2VybWl0IEZBUSAoRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgYWJvdXQgS2VybWl0KQorICAgICAgICAgIAorICAgWzE5OV1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tmYXEuaHRtbAorICAgICAgICAgIFRoZSBDLUtlcm1pdCBGQVEgKEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IEMtS2VybWl0KQorICAgICAgICAgIAorICAgWzIwMF1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtbAorICAgICAgICAgIFRoZSBLZXJtaXQgc2VjdXJpdHkgcmVmZXJlbmNlLgorICAgICAgICAgIAorICAgWzIwMV1odHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvdGVsbmV0Lmh0bWwKKyAgICAgICAgICBDLUtlcm1pdCBUZWxuZXQgY2xpZW50IGRvY3VtZW50YXRpb24uCisgICAgICAgICAgCisgICBbMjAyXWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zdHVkaWVzLmh0bWwKKyAgICAgICAgICBDYXNlIHN0dWRpZXMuCisgICAgICAgICAgCisgICBbMjAzXWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbAorICAgICAgICAgIEdlbmVyYWwgQy1LZXJtaXQgSGludHMgYW5kIFRpcHMuCisgICAgICAgICAgCisgICBbMjA0XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Vid3IuaHRtbAorICAgICAgICAgIFVuaXggQy1LZXJtaXQgSGludHMgYW5kIFRpcHMuCisgICAgICAgICAgCisgICBbMjA1XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3Zid3IuaHRtbAorICAgICAgICAgIFZNUyBDLUtlcm1pdCBIaW50cyBhbmQgVGlwcy4KKyAgICAgICAgICAKKyAgIFsyMDZdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sCisgICAgICAgICAgVW5peCBDLUtlcm1pdCBJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zCisgICAgICAgICAgCisgICBbMjA3XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3ZpbnMuaHRtbAorICAgICAgICAgIFZNUyBDLUtlcm1pdCBJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zCisgICAgICAgICAgCisgICBbMjA4XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zdXBwb3J0Lmh0bWwKKyAgICAgICAgICBUZWNobmljYWwgc3VwcG9ydC4KKyAgICAgICAgICAKKyAgIFsyMDldaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2s5NXR1dG9yaWFsLmh0bWwKKyAgICAgICAgICBLZXJtaXQgOTUgdHV0b3JpYWwgKHRoaXMgZG9jdW1lbnQpLgorICAgICAgICAgIAorICAgWzIxMF1jb21wLnByb3RvY29scy5rZXJtaXQubWlzYworICAgICAgICAgIFRoZSBLZXJtaXQgbmV3c2dyb3VwICh1bm1vZGVyYXRlZCkuCisgICAgICAgICAgCisgICBbIFsyMTFdS2VybWl0IEhvbWUgXSBbIFsyMTJdQy1LZXJtaXQgSG9tZSBdIFsgWzIxM11DLUtlcm1pdCBGQVEgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAKKyAgRklMRVMgWyBbMjE0XVRvcCBdIFsgWzIxNV1Db250ZW50cyBdIFsgWzIxNl1OZXh0IF0gWyBbMjE3XVByZXZpb3VzIF0KKyAgCisgICBbMjE4XUNPUFlJTkcuVFhUCisgICAgICAgICAgQy1LZXJtaXQgbGljZW5zZS4KKyAgICAgICAgICAKKyAgIFsyMTldfi8ua2VybXJjCisgICAgICAgICAgSW5pdGlhbGl6YXRpb24gZmlsZS4KKyAgICAgICAgICAKKyAgIFsyMjBdfi8ubXlrZXJtcmMKKyAgICAgICAgICBDdXN0b21pemF0aW9uIGZpbGUuCisgICAgICAgICAgCisgICB+Ly5rZGQKKyAgICAgICAgICBLZXJtaXQgZGlhbGluZyBkaXJlY3RvcnkgKHNlZSBtYW51YWwpLgorICAgICAgICAgIAorICAgfi8ua25kCisgICAgICAgICAgS2VybWl0IG5ldHdvcmsgZGlyZWN0b3J5IChzZWUgbWFudWFsKS4KKyAgICAgICAgICAKKyAgIH4vLmtzZAorICAgICAgICAgIEtlcm1pdCBzZXJ2aWNlcyBkaXJlY3RvcnkgKHNlZSBtYW51YWwpLgorICAgICAgICAgIAorICAgWzIyMV1ja3VpbnMuaHRtbAorICAgICAgICAgIEluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgZm9yIFVuaXguCisgICAgICAgICAgCisgICBbMjIyXWNrY2J3ci5odG1sCisgICAgICAgICAgR2VuZXJhbCBDLUtlcm1pdCBidWdzLCBoaW50cywgdGlwcy4KKyAgICAgICAgICAKKyAgIFsyMjNdY2t1YndyLmh0bWwKKyAgICAgICAgICBVbml4LXNwZWNpZmljIEMtS2VybWl0IGJ1Z3MsIGhpbnRzLCB0aXBzLgorICAgICAgICAgIAorICAgWzIyNF1ja2NwbG0uaHRtbAorICAgICAgICAgIEMtS2VybWl0IHByb2dyYW0gbG9naWMgbWFudWFsLgorICAgICAgICAgIAorICAgWzIyNV1ja2NjZmcuaHRtbAorICAgICAgICAgIEMtS2VybWl0IGNvbXBpbGUtdGltZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisgICAgICAgICAgCisgICBzc2gKKyAgICAgICAgICAoaW4geW91ciBQQVRIKSBTU0ggY29ubmVjdGlvbiBoZWxwZXIuCisgICAgICAgICAgCisgICByeiwgc3osIGV0Yy4KKyAgICAgICAgICAoaW4geW91ciBQQVRIKSBleHRlcm5hbCBwcm90b2NvbHMgZm9yIFhZWm1vZGVtLgorICAgICAgICAgIAorICAgL3Zhci9zcG9vbC9sb2NrcyAob3Igd2hhdGV2ZXIpCisgICAgICAgICAgVVVDUCBsb2NrZmlsZSBmb3IgZGlhbGluZyBvdXQgKHNlZSBbMjI2XWluc3RhbGxhdGlvbgorICAgICAgICAgIGluc3RydWN0aW9ucykuCisgICAgICAgICAgCisgICBbIFsyMjddS2VybWl0IEhvbWUgXSBbIFsyMjhdQy1LZXJtaXQgSG9tZSBdIFsgWzIyOV1DLUtlcm1pdCBGQVEgXQorICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAKKyAgQVVUSE9SUyBbIFsyMzBdVG9wIF0gWyBbMjMxXUNvbnRlbnRzIF0gWyBbMjMyXVByZXZpb3VzIF0KKyAgCisgICAgIEZyYW5rIGRhIENydXogYW5kIEplZmZyZXkgRSBBbHRtYW4KKyAgICAgVGhlIEtlcm1pdCBQcm9qZWN0IC0gQ29sdW1iaWEgVW5pdmVyaXR5CisgICAgIDYxMiBXZXN0IDExNXRoIFN0cmVldAorICAgICBOZXcgWW9yayBOWSAxMDAyNS03Nzk5CisgICAgIFVTQQorICAgICAKKyAgIDE5ODUtcHJlc2VudCwgd2l0aCBjb250cmlidXRpb25zIGZyb20gaHVuZHJlZHMgb2Ygb3RoZXJzIGFsbCBvdmVyIHRoZQorICAgd29ybGQuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgICAKKyAgIAorICAgIEMtS2VybWl0IDguMCBVbml4IE1hbnVhbCBQYWdlIGFuZCBUdXRvcmlhbCAvCisgICAgWzIzM11rZXJtaXRAY29sdW1iaWEuZWR1IC8gMjQgT2N0b2JlciAyMDAyCisKK1JlZmVyZW5jZXMKKworICAgMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworICAgMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUvCisgICAzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IucGRmCisgICA0LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC90ZXN0L3RleHQvY2t1a2VyLm5yCisgICA1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNkZXNjcmlwdGlvbgorICAgNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjc3lub3BzaXMKKyAgIDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI29wdGlvbnMKKyAgIDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2NvbW1hbmRzCisgICA5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNpbml0ZmlsZQorICAxMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjbW9kZXMKKyAgMTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2Nvbm5lY3Rpb25zCisgIDEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCN0cmFuc2ZlcgorICAxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjc2VydmVyCisgIDE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNmdHAKKyAgMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2lrc2QKKyAgMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI3NlY3VyaXR5CisgIDE3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNwZXJzb25hZQorICAxOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjbGljZW5zZQorICAxOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjb3RoZXIKKyAgMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2RvY3VtZW50YXRpb24KKyAgMjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2ZpbGVzCisgIDIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNhdXRob3JzCisgIDIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCN0b3AKKyAgMjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2NvbnRlbnRzCisgIDI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNzeW5vcHNpcworICAyNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorICAyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworICAyOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUvCisgIDI5LiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMyODM5LnR4dAorICAzMC4gZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjMjg0MC50eHQKKyAgMzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2RvY3VtZW50YXRpb24KKyAgMzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKyAgMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKyAgMzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgMzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2ZhcS5odG1sCisgIDM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCN0b3AKKyAgMzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2NvbnRlbnRzCisgIDM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNvcHRpb25zCisgIDM5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNzeW5vcHNpcworICA0MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwja2VyYmFuZworICA0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjcGVyc29uYWUKKyAgNDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2tlcmJhbmcKKyAgNDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2luaXRmaWxlCisgIDQ0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNpbml0ZmlsZQorICA0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjcGVyc29uYWUKKyAgNDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI29wdGlvbnMKKyAgNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2NvbW1hbmRzCisgIDQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvCisgIDQ5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgIDUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tmYXEuaHRtbAorICA1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjdG9wCisgIDUyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNjb250ZW50cworICA1My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjY29tbWFuZHMKKyAgNTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2Rlc2NyaXB0aW9uCisgIDU1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNjb21tYW5kcworICA1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjcGVyc29uYWUKKyAgNTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI3BlcnNvbmFlCisgIDU4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNpa3NkCisgIDU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCN0cmFuc2ZlcgorICA2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjdG9wCisgIDYxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNjb250ZW50cworICA2Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjaW5pdGZpbGUKKyAgNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI29wdGlvbnMKKyAgNjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2tlcmJhbmcKKyAgNjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2NtZGxpc3QKKyAgNjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2RvY3VtZW50YXRpb24KKyAgNjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2luaXRmaWxlCisgIDY4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNkb2N1bWVudGF0aW9uCisgIDY5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tzY3JpcHRzLmh0bWwKKyAgNzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2RvY3VtZW50YXRpb24KKyAgNzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKyAgNzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgNzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2ZhcS5odG1sCisgIDc0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCN0b3AKKyAgNzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2NvbnRlbnRzCisgIDc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNtb2RlcworICA3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjY29tbWFuZHMKKyAgNzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKyAgNzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2ZhcS5odG1sCisgIDgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCN0b3AKKyAgODIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2NvbnRlbnRzCisgIDgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNjb25uZWN0aW9ucworICA4NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjaW5pdGZpbGUKKyAgODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2ZhcS5odG1sI3Rlcm0KKyAgODYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKyAgODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgODguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2ZhcS5odG1sCisgIDg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCN0b3AKKyAgOTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2NvbnRlbnRzCisgIDkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCN0cmFuc2ZlcgorICA5Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjbW9kZXMKKyAgOTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2lrc2QKKyAgOTQuIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzIyMTcudHh0CisgIDk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNmdHAKKyAgOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKyAgOTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAgOTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2ZhcS5odG1sCisgIDk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCN0b3AKKyAxMDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2NvbnRlbnRzCisgMTAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNzZXJ2ZXIKKyAxMDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2Nvbm5lY3Rpb25zCisgMTAzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNkb3dubG9hZAorIDEwNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjdXBsb2FkCisgMTA1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNvbGRmYXNoaW9uZWQKKyAxMDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI3Ryb3VibGUKKyAxMDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2FkdmFuY2VkCisgMTA4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNub25rZXJtaXQKKyAxMDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9rZXJtaXQuaHRtbCNub3RzbG93CisgMTEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvazk1Lmh0bWwKKyAxMTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9rOTUuaHRtbAorIDExMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDExNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L21za2VybWl0Lmh0bWwKKyAxMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKyAxMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zdXBwb3J0Lmh0bWwKKyAxMTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja21hbnVhbC5odG1sCisgMTE4LiBtYWlsdG86a2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1CisgMTE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNkb2N1bWVudGF0aW9uCisgMTIwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNmdHAKKyAxMjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKyAxMjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAxMjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2ZhcS5odG1sCisgMTI0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCN0b3AKKyAxMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2NvbnRlbnRzCisgMTI2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNmdHAKKyAxMjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI3RyYW5zZmVyCisgMTI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNpa3NkCisgMTI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvCisgMTMwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTMxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tmYXEuaHRtbAorIDEzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjdG9wCisgMTMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNjb250ZW50cworIDEzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjaWtzZAorIDEzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjdHJhbnNmZXIKKyAxMzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI3NlcnZlcgorIDEzNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2Z0cGNsaWVudC5odG1sCisgMTM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNkb2N1bWVudGF0aW9uCisgMTM5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvCisgMTQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTQxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tmYXEuaHRtbAorIDE0Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQzLmh0bWwjeDMKKyAxNDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0My5odG1sI3gyLjIKKyAxNDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI3RvcAorIDE0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjY29udGVudHMKKyAxNDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI3NlY3VyaXR5CisgMTQ3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNmdHAKKyAxNDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9jdWlrc2QuaHRtbAorIDE0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2lrc2QuaHRtbAorIDE1MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworIDE1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDE1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZmFxLmh0bWwKKyAxNTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI3RvcAorIDE1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjY29udGVudHMKKyAxNTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI3BlcnNvbmFlCisgMTU2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNpa3NkCisgMTU3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtbAorIDE1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworIDE1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDE2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZmFxLmh0bWwKKyAxNjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI3RvcAorIDE2Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjY29udGVudHMKKyAxNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2xpY2Vuc2UKKyAxNjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2lrc2QKKyAxNjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI29wdGlvbnMKKyAxNjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0My5odG1sI3gzLjEuMgorIDE2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworIDE2OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDE2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZmFxLmh0bWwKKyAxNzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI3RvcAorIDE3MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjY29udGVudHMKKyAxNzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI290aGVyCisgMTczLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNwZXJzb25hZQorIDE3NC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvQ09QWUlORy5UWFQKKyAxNzUuIG1haWx0bzprZXJtaXRAY29sdW1iaWEuZWR1CisgMTc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvCisgMTc3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCisgMTc4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tmYXEuaHRtbAorIDE3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjdG9wCisgMTgwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNjb250ZW50cworIDE4MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjZG9jdW1lbnRhdGlvbgorIDE4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjbGljZW5zZQorIDE4My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworIDE4NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2hvd3RvZ2V0Lmh0bWwKKyAxODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKyAxODYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAxODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2ZhcS5odG1sCisgMTg4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCN0b3AKKyAxODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2NvbnRlbnRzCisgMTkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNmaWxlcworIDE5MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjb3RoZXIKKyAxOTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja21hbnVhbC5odG1sCisgMTkzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwKKyAxOTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0ODAuaHRtbAorIDE5NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDE5Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrODBiaW5hcmllcy5odG1sCisgMTk3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2NyaXB0bGliLmh0bWwKKyAxOTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9uZXdmYXEuaHRtbAorIDE5OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZmFxLmh0bWwKKyAyMDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zZWN1cml0eS5odG1sCisgMjAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvdGVsbmV0Lmh0bWwKKyAyMDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zdHVkaWVzLmh0bWwKKyAyMDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2Nid3IuaHRtbAorIDIwNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWJ3ci5odG1sCisgMjA1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t2YndyLmh0bWwKKyAyMDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbAorIDIwNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2Nrdmlucy5odG1sCisgMjA4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc3VwcG9ydC5odG1sCisgMjA5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvazk1dHV0b3JpYWwuaHRtbAorIDIxMC4gbmV3czpjb21wLnByb3RvY29scy5rZXJtaXQubWlzYworIDIxMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworIDIxMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQuaHRtbAorIDIxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZmFxLmh0bWwKKyAyMTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI3RvcAorIDIxNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdXR1dG9yLmh0bWwjY29udGVudHMKKyAyMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2F1dGhvcnMKKyAyMTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2RvY3VtZW50YXRpb24KKyAyMTguIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2Mta2VybWl0L0NPUFlJTkcuVFhUCisgMjE5LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9jLWtlcm1pdC9ja2VybWl0LmluaQorIDIyMC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvYy1rZXJtaXQvY2tlcm1vZC5pbmkKKyAyMjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbAorIDIyMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2J3ci5odG1sCisgMjIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwKKyAyMjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NwbG0uaHRtbAorIDIyNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrY2NmZy5odG1sCisgMjI2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1aW5zLmh0bWwKKyAyMjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KKyAyMjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKKyAyMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2ZhcS5odG1sCisgMjMwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCN0b3AKKyAyMzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3V0dXRvci5odG1sI2NvbnRlbnRzCisgMjMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCNmaWxlcworIDIzMy4gbWFpbHRvOmtlcm1pdEBjb2x1bWJpYS5lZHUKZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja3V1czIuYyBiL2NrZXJtaXQtOC4wLjIxMS9ja3V1czIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjkwNzYzCi0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrdXVzMi5jCkBAIC0wLDAgKzEsMTM4MzggQEAKKyNpZmRlZiBTU0hURVNUCisjZGVmaW5lIFNTSEJVSUxUSU4KKyNlbmRpZiAvKiBTU0hURVNUICovCisKKy8qICBDIEsgVSBVIFMgMiAgLS0gIFVzZXIgaW50ZXJmYWNlIHN0cmluZ3MgJiBoZWxwIHRleHQgbW9kdWxlIGZvciBDLUtlcm1pdCAgKi8KKworLyoKKyAgQXV0aG9yczoKKyAgICBGcmFuayBkYSBDcnV6IDxmZGNAY29sdW1iaWEuZWR1PiwKKyAgICAgIFRoZSBLZXJtaXQgUHJvamVjdCwgQ29sdW1iaWEgVW5pdmVyc2l0eSwgTmV3IFlvcmsgQ2l0eQorICAgIEplZmZyZXkgRSBBbHRtYW4gPGphbHRtYW5Ac2VjdXJlLWVuZHBvaW50cy5jb20+CisgICAgICBTZWN1cmUgRW5kcG9pbnRzIEluYy4sIE5ldyBZb3JrIENpdHkKKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorCisgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIEhFTFAgY29tbWFuZCBhbmQgb3RoZXIgbG9uZyB0ZXh0IHN0cmluZ3MuCisKKyAgSU1QT1JUQU5UOiBDaGFyYWN0ZXIgc3RyaW5nIGNvbnN0YW50cyBsb25nZXIgdGhhbiBhYm91dCAyNTAgYXJlIG5vdCBwb3J0YWJsZS4KKyAgTG9uZ2VyIHN0cmluZ3Mgc2hvdWxkIGJlIGJyb2tlbiB1cCBpbnRvIGFycmF5cyBvZiBzdHJpbmdzIGFuZCBhY2Nlc3NlZCB3aXRoCisgIGhtc2dhKCkgcmF0aGVyIHRoYW4gaG1zZygpLgorKi8KKyNpbmNsdWRlICJja2NzeW0uaCIKKyNpbmNsdWRlICJja2NkZWIuaCIKKyNpbmNsdWRlICJja2NuZXQuaCIKKyNpbmNsdWRlICJja2Nhc2MuaCIKKyNpbmNsdWRlICJja2NrZXIuaCIKKyNpbmNsdWRlICJja3V1c3IuaCIKKyNpbmNsdWRlICJja2N4bGEuaCIKKyNpZmRlZiBPUzIKKyNpZmRlZiBOVAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlIC8qIG5vdCBOVCAqLworI2RlZmluZSBJTkNMX0tCRAorI2lmZGVmIE9TMk1PVVNFCisjZGVmaW5lIElOQ0xfTU9VCisjZW5kaWYgLyogT1MyTU9VU0UgKi8KKyNkZWZpbmUgSU5DTF9ET1NNSVNDCisjZGVmaW5lIElOQ0xfRE9TREVWSUNFUworI2luY2x1ZGUgPG9zMi5oPiAgICAgICAgICAgICAgICAvKiBUaGlzIHB1bGxzIGluIGEgd2hvbGUgbG9hZCBvZiBzdHVmZiAqLworI3VuZGVmIENPTU1FTlQKKyNlbmRpZiAvKiBOVCAqLworI2luY2x1ZGUgImNrb2Nvbi5oIgorI2luY2x1ZGUgImNrb2t2Yi5oIgorI2luY2x1ZGUgImNrb2tleS5oIgorI2VuZGlmIC8qIE9TMiAqLworCitleHRlcm4geHhfc3RycCB4eHN0cmluZzsKK2V4dGVybiBjaGFyICogY2NudGFiW107CisvKgorICBobHB0b2sgY29udGFpbnMgdGhlIHN0cmluZyBmb3Igd2hpY2ggdGhlIHVzZXIgcmVxdWVzdGVkIGhlbHAuICBUaGlzIGlzCisgIHVzZWZ1bCBmb3IgZGlzdGluZ3Vpc2hpbmcgc3lub255bXMsIGluIGNhc2UgZGlmZmVyZW50IGhlbHAgdGV4dCBpcyBuZWVkZWQKKyAgZGVwZW5kaW5nIG9uIHdoaWNoIHN5bm9ueW0gd2FzIGdpdmVuLgorKi8KK2V4dGVybiBjaGFyICogaGxwdG9rOworCisjaWZuZGVmIE5PSUtTRAorICAgIGV4dGVybiBpbnQgaW5zZXJ2ZXI7CisjZW5kaWYgLyogSUtTRCAqLworCisjaWZuZGVmIE5PSUNQCitleHRlcm4gaW50IGNtZmxnczsKKworI2lmZGVmIERDTURCVUYKK2V4dGVybiBjaGFyICpjbWRidWYsICphdG1idWY7CisjZWxzZQorZXh0ZXJuIGNoYXIgY21kYnVmW10sIGF0bWJ1ZltdOworI2VuZGlmIC8qIERDTURCVUYgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworCitleHRlcm4gY2hhciAqeGFyZzA7CitleHRlcm4gaW50IG5ybXQsIG5wcm0sIGRmbG9jLCBsb2NhbCwgcGFyaXR5LCBlc2NhcGU7CitleHRlcm4gaW50IHR1cm4sIGZsb3c7CitleHRlcm4gaW50IGJpbmFyeSwgcXVpZXQsIGtlZXA7CitleHRlcm4gaW50IHN1Y2Nlc3MsIHhhc2ttb3JlOworI2lmZGVmIE9TMgorZXh0ZXJuIGludCB0dF9yb3dzW10sIHR0X2NvbHNbXTsKKyNlbHNlIC8qIE9TMiAqLworZXh0ZXJuIGludCB0dF9yb3dzLCB0dF9jb2xzOworI2VuZGlmIC8qIE9TMiAqLworZXh0ZXJuIGludCBjbWRfcm93cywgY21kX2NvbHM7CisKK2V4dGVybiBsb25nIHNwZWVkOworZXh0ZXJuIGNoYXIgKmRmdHR5LCAqdmVyc2lvLCAqY2t4c3lzOworI2lmbmRlZiBOT0hFTFAKK2V4dGVybiBjaGFyICpoZWxwZmlsZTsKKyNlbmRpZiAvKiBOT0hFTFAgKi8KK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIHBybXRhYltdOworI2lmbmRlZiBOT1hGRVIKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIHJlbWNtZFtdOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PSUNQCisKKy8qICBJbnRlcmFjdGl2ZSBoZWxwIHN0cmluZ3MgICovCisKKy8qIFRvcC1sZXZlbCBIRUxQIHRleHQuICBJTVBPUlRBTlQ6IEFsc28gc2VlIHRvcGhscGlbXSBmb3IgSUtTRC4gKi8KKworc3RhdGljIGNoYXIgKnRvcGhscFtdID0geworIlRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuXG4iLAorCisjaWZuZGVmIE5PSEVMUAorIiAgVHlwZSBFWElUICAgIHRvIGV4aXQuIiwKKyNpZmRlZiBPUzIKKyIgIFR5cGUgSU5UUk8gICBmb3IgYSBicmllZiBpbnRyb2R1Y3Rpb24gdG8gdGhlIEtlcm1pdCBDb21tYW5kIHNjcmVlbi4iLAorIiAgVHlwZSBMSUNFTlNFIHRvIHNlZSB0aGUgS2VybWl0IDk1IGxpY2Vuc2UuIiwKKyNlbHNlCisiICBUeXBlIElOVFJPICAgZm9yIGEgYnJpZWYgaW50cm9kdWN0aW9uIHRvIEMtS2VybWl0LiIsCisiICBUeXBlIExJQ0VOU0UgdG8gc2VlIHRoZSBDLUtlcm1pdCBsaWNlbnNlLiIsCisjZW5kaWYgLyogT1MyICovCisiICBUeXBlIEhFTFAgICAgZm9sbG93ZWQgYnkgYSBjb21tYW5kIG5hbWUgZm9yIGhlbHAgYWJvdXQgYSBzcGVjaWZpYyBjb21tYW5kLiIsCisjaWZuZGVmIE5PUFVTSAorI2lmZGVmIFVOSVgKKyIgIFR5cGUgTUFOVUFMICB0byBhY2Nlc3MgdGhlIEMtS2VybWl0IG1hbnVhbCBwYWdlLiIsCisjZWxzZQorI2lmZGVmIFZNUworIiAgVHlwZSBNQU5VQUwgIHRvIGFjY2VzcyB0aGUgQy1LZXJtaXQgaGVscCB0b3BpYy4iLAorI2Vsc2UKKyNpZmRlZiBPUzIKKyIgIFR5cGUgTUFOVUFMICB0byBhY2Nlc3MgdGhlIEs5NSBtYW51YWwuIiwKKyNlbHNlCisiICBUeXBlIE1BTlVBTCAgdG8gYWNjZXNzIHRoZSBDLUtlcm1pdCBtYW51YWwuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogTk9QVVNIICovCisiICBUeXBlIE5FV1MgICAgZm9yIG5ld3MgYWJvdXQgbmV3IGZlYXR1cmVzLiIsCisiICBUeXBlIFNVUFBPUlQgdG8gbGVhcm4gaG93IHRvIGdldCB0ZWNobmljYWwgc3VwcG9ydC4iLAorIiAgUHJlc3MgPyAgICAgIChxdWVzdGlvbiBtYXJrKSBhdCB0aGUgcHJvbXB0LCBvciBhbnl3aGVyZSB3aXRoaW4gYSBjb21tYW5kLCIsCisiICAgICAgICAgICAgICAgZm9yIGEgbWVudSAoY29udGV4dC1zZW5zaXRpdmUgaGVscCwgbWVudSBvbiBkZW1hbmQpLiIsCisjZWxzZQorIlByZXNzID8gZm9yIGEgbGlzdCBvZiBjb21tYW5kczsgc2VlIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbGVkIGRlc2NyaXB0aW9ucy4iLAorI2VuZGlmIC8qIE5PSEVMUCAqLworCisjaWZuZGVmIE5PQ01ETAorI2lmbmRlZiBOT0hFTFAKKyIgIiwKKyIgIFR5cGUgSEVMUCBPUFRJT05TIGZvciBoZWxwIHdpdGggY29tbWFuZC1saW5lIG9wdGlvbnMuIiwKKyNlbmRpZiAvKiBOT0hFTFAgKi8KKyNlbmRpZiAvKiBOT0NNREwgKi8KKyIgIiwKKyNpZm5kZWYgT1MyCisjaWZkZWYgTUFDCisiRG9jdW1lbnRhdGlvbiBmb3IgQ29tbWFuZCBXaW5kb3c6IFwiVXNpbmcgQy1LZXJtaXRcIiBieSBGcmFuayBkYSBDcnV6IGFuZCIsCisiQ2hyaXN0aW5lIE0uIEdpYW5vbmUsIERpZ2l0YWwgUHJlc3MsIDE5OTcsIElTQk46IDEtNTU1NTgtMTY0LTEuICBUbyBvcmRlciwiLAorImNhbGwgKzEgMjEyIDg1NC0zNzAzIG9yICsxIDgwMCAzNjYtMjY2NS4iLAorI2Vsc2UKKyJET0NVTUVOVEFUSU9OOiBcIlVzaW5nIEMtS2VybWl0XCIgYnkgRnJhbmsgZGEgQ3J1eiBhbmQgQ2hyaXN0aW5lIE0uIEdpYW5vbmUsIiwKKyIybmQgRWRpdGlvbiwgRGlnaXRhbCBQcmVzcyAvIEJ1dHRlcndvcnRoLUhlaW5lbWFubiAxOTk3LCBJU0JOIDEtNTU1NTgtMTY0LTEsIiwKKyJwbHVzIHN1cHBsZW1lbnRzIGF0IGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwuIiwKKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBNQUMKKyIgIiwKKyJBbHNvIHNlZSB0aGUgTWFjIEtlcm1pdCBEb2MgYW5kIEJ3ciBmaWxlcyBvbiB0aGUgTWFjIEtlcm1pdCBkaXNrZXR0ZS5cbiIsCisjZWxzZQorI2lmZGVmIEhQVVgxMAorIiAiLAorIlNlZSB0aGUgZmlsZXMgaW4gL3Vzci9zaGFyZS9saWIva2VybWl0LyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4iLAorI2VuZGlmIC8qIEhQVVgxMCAqLworI2VuZGlmIC8qIE1BQyAqLworIiIKK307CisKKyNpZm5kZWYgTk9JS1NECitzdGF0aWMgY2hhciAqdG9waGxwaVtdID0geyAgICAgICAgICAgICAgLyogVG9wLWxldmVsIGhlbHAgZm9yIElLU0QgKi8KKworIlRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuXG4iLAorCisjaWZuZGVmIE5PSEVMUAorIiAgVHlwZSBJTlRSTyAgIGZvciBhIGJyaWVmIGludHJvZHVjdGlvbiB0byBLZXJtaXQgY29tbWFuZHMuIiwKKyIgIFR5cGUgVkVSU0lPTiBmb3IgdmVyc2lvbiBhbmQgY29weXJpZ2h0IGluZm9ybWF0aW9uLiIsCisiICBUeXBlIEhFTFAgICAgZm9sbG93ZWQgYnkgYSBjb21tYW5kIG5hbWUgZm9yIGhlbHAgYWJvdXQgYSBzcGVjaWZpYyBjb21tYW5kLiIsCisiICBUeXBlIFNVUFBPUlQgdG8gbGVhcm4gaG93IHRvIGdldCB0ZWNobmljYWwgc3VwcG9ydC4iLAorIiAgVHlwZSBMT0dPVVQgIChvciBFWElUKSB0byBsb2cgb3V0LiIsCisiICBQcmVzcyA/ICAgICAgKHF1ZXN0aW9uIG1hcmspIGF0IHRoZSBwcm9tcHQsIG9yIGFueXdoZXJlIHdpdGhpbiBhIGNvbW1hbmQsIiwKKyIgICAgICAgICAgICAgICBmb3IgYSBtZW51IChjb250ZXh0LXNlbnNpdGl2ZSBoZWxwLCBtZW51IG9uIGRlbWFuZCkuIiwKKyNlbHNlCisiUHJlc3MgPyBmb3IgYSBsaXN0IG9mIGNvbW1hbmRzOyBzZWUgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlsZWQgZGVzY3JpcHRpb25zLiIsCisjZW5kaWYgLyogTk9IRUxQICovCisiICIsCisiRE9DVU1FTlRBVElPTjogXCJVc2luZyBDLUtlcm1pdFwiIGJ5IEZyYW5rIGRhIENydXogYW5kIENocmlzdGluZSBNLiBHaWFub25lLCIsCisiMm5kIEVkaXRpb24sIERpZ2l0YWwgUHJlc3MgLyBCdXR0ZXJ3b3J0aC1IZWluZW1hbm4gMTk5NywgSVNCTiAxLTU1NTU4LTE2NC0xLiIsCisiVG8gb3JkZXI6ICsxIDIxMiA4NTQtMzcwMyBvciArMSA4MDAgMzY2LTI2NjUuICBNb3JlIGluZm8gYXQgdGhlIEtlcm1pdCIsCisKKyJQcm9qZWN0IHdlYnNpdGUsIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8uIiwKKyIiCit9OworI2VuZGlmIC8qIE5PSUtTRCAqLworCisjaWZuZGVmIE5PSEVMUAorY2hhciAqbmV3c3R4dFtdID0geworI2lmZGVmIE9TMgorIldlbGNvbWUgdG8gS2VybWl0IDk1IDIuMS4zLiAgTWFqb3IgbmV3IGZlYXR1cmVzIGluY2x1ZGU6IiwKKyNlbHNlCisiV2VsY29tZSB0byBDLUtlcm1pdCA4LjAuMjA2LiAgTWFqb3IgbmV3IGZlYXR1cmVzIGluY2x1ZGU6IiwKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBOVAorI2lmZGVmIEtVSQorIiAuIFJ1bnMgaW4gR1VJIHdpbmRvdyIsCisjZWxzZQorIiAuIEdVSSB2ZXJzaW9uIGF2YWlsYWJsZSIsCisjZW5kaWYgLyogS1VJICovCisjZW5kaWYgLyogTlQgKi8KKyNpZmRlZiBTU0hCVUlMVElOCisiIC4gTmV3IGJ1aWx0LWluIFNTSCB2MSBhbmQgdjIgY2xpZW50cyIsCisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworI2lmZGVmIE5FV0ZUUAorIiAuIEEgbmV3IGJ1aWx0LWluIEZUUCBjbGllbnQiLAorI2VuZGlmIC8qIE5FV0ZUUCAqLworI2lmbmRlZiBOT0hUVFAKKyIgLiBBIG5ldyBIVFRQIDEuMSBjbGllbnQiLAorI2VuZGlmIC8qIE5PSFRUUCAqLworI2lmZGVmIFROX0NPTVBPUlQKKyIgLiBUZWxuZXQgQ29tIFBvcnQgT3B0aW9uIGZvciBkaWFsaW5nIGZyb20gVGVsbmV0IG1vZGVtIHNlcnZlcnMiLAorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyIgLiBGaWxlIHNjYW5uaW5nIGZvciBhdXRvbWF0aWMgdGV4dC9iaW5hcnkgZGV0ZXJtaW5hdGlvbiIsCisjaWZkZWYgQ0tMRUFSTgorI2lmbmRlZiBPUzIKKyIgLiBMZWFybmVkIHNjcmlwdHMiLAorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIENLTEVBUk4gKi8KKyNpZm5kZWYgTk9TUEwKKyNpZm5kZWYgTk9TRVhQCisiIC4gTElTUC1saWtlIFMtRXhwcmVzc2lvbnMgYW5kIG5hdHVyYWwgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYyIsCisjZW5kaWYgLyogTk9TRVhQICovCisiIC4gTG90cyBvZiBzY3JpcHQgcHJvZ3JhbW1pbmcgaW1wcm92ZW1lbnRzIiwKKyNlbmRpZiAvKiBOT1NQTCAqLworIiAuIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBhbmQgYnVnIGZpeGVzIiwKKyIgIiwKKyJEb2N1bWVudGF0aW9uOiIsCisiIDEuIFwiVXNpbmcgQy1LZXJtaXRcIiwgc2Vjb25kIGVkaXRpb24gKDE5OTcpLCBjdXJyZW50IHdpdGggQy1LZXJtaXQgNi4wLiIsCisiIDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCIsCisiICAgIHdoaWNoIGRvY3VtZW50cyB0aGUgbmV3IGZlYXR1cmVzIG9mIEMtS2VybWl0IDcuMC4iLAorIiAzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDgwLmh0bWwiLAorIiAgICB3aGljaCBkb2N1bWVudHMgdGhlIG5ldyBmZWF0dXJlcyBvZiBDLUtlcm1pdCA4LjAuIiwKKyIgIiwKKyJJZiB0aGUgcmVsZWFzZSBkYXRlIHNob3duIGJ5IHRoZSBWRVJTSU9OIGNvbW1hbmQgaXMgbG9uZyBwYXN0LCBiZSBzdXJlIHRvIiwKKyJjaGVjayB3aXRoIHRoZSBLZXJtaXQgUHJvamVjdCB0byBzZWUgaWYgdGhlcmUgaGF2ZSBiZWVuIHVwZGF0ZXMuIiwKKyIiCit9OworI2VuZGlmIC8qIE5PSEVMUCAqLworCisjaWZuZGVmIE5PSEVMUAorY2hhciAqaW50cm90eHRbXSA9IHsKKyNpZmRlZiBPUzIKKyJXZWxjb21lIHRvIEstOTUsIEtlcm1pdCBjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZSBmb3I6IiwKKyNlbHNlCisjaWZkZWYgVU5JWAorI2lmZGVmIEhQVVgKKyJXZWxjb21lIHRvIEhQLVVYIEMtS2VybWl0IGNvbW11bmljYXRpb25zIHNvZnR3YXJlIGZvcjoiLAorI2Vsc2UKKyJXZWxjb21lIHRvIFVOSVggQy1LZXJtaXQgY29tbXVuaWNhdGlvbnMgc29mdHdhcmUgZm9yOiIsCisjZW5kaWYgLyogSFBVWCAqLworI2Vsc2UKKyNpZmRlZiBWTVMKKyJXZWxjb21lIHRvIFZNUyBDLUtlcm1pdCBjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZSBmb3I6IiwKKyNlbHNlCisjaWZkZWYgVk9TCisiV2VsY29tZSB0byBWT1MgQy1LZXJtaXQgY29tbXVuaWNhdGlvbnMgc29mdHdhcmUgZm9yOiIsCisjZWxzZQorI2lmZGVmIE1BQworIldlbGNvbWUgdG8gTWFjIEtlcm1pdCBjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZSBmb3I6IiwKKyNlbHNlCisiV2VsY29tZSB0byBDLUtlcm1pdCBjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZSBmb3I6IiwKKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBWT1MgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogT1MyICovCisjaWZuZGVmIE5PWEZFUgorIiAuIEVycm9yLWZyZWUgYW5kIGVmZmljaWVudCBmaWxlIHRyYW5zZmVyIiwKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorIiAuIFZUMzIwLzIyMC8xMDIvMTAwLzUyLCBBTlNJLCBXeXNlLCBMaW51eCwgVGVsZXZpZGVvLCBhbmQgb3RoZXIgZW11bGF0aW9ucyIsCisjZWxzZQorI2lmZGVmIE1BQworIiAuIFZUMjIwIHRlcm1pbmFsIGVtdWxhdGlvbiIsCisjZWxzZQorIiAuIFRlcm1pbmFsIGNvbm5lY3Rpb24iLAorI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZm5kZWYgTk9TUEwKKyIgLiBTY3JpcHQgcHJvZ3JhbW1pbmciLAorI2VuZGlmIC8qIE5PU1BMICovCisjaWZuZGVmIE5PSUNTCisiIC4gSW50ZXJuYXRpb25hbCBjaGFyYWN0ZXIgc2V0IGNvbnZlcnNpb24iLAorI2VuZGlmIC8qIE5PSUNTICovCisjaWZuZGVmIE5PRElBTAorI2lmbmRlZiBOT1NQTAorIiAuIE51bWVyaWMgYW5kIGFscGhhbnVtZXJpYyBwYWdpbmciLAorI2VuZGlmIC8qIE5PU1BMICovCisjZW5kaWYgLyogTk9ESUFMICovCisKKyNpZm5kZWYgTk9MT0NBTAorIiAiLAorIlN1cHBvcnRpbmc6IiwKKyIgLiBTZXJpYWwgY29ubmVjdGlvbnMsIGRpcmVjdCBvciBkaWFsZWQuIiwKKyNpZm5kZWYgTk9ESUFMCisiIC4gQXV0b21hdGljIG1vZGVtIGRpYWxpbmciLAorI2VuZGlmIC8qIE5PRElBTCAqLworI2lmZGVmIFRDUFNPQ0tFVAorIiAuIFRDUC9JUCBuZXR3b3JrIGNvbm5lY3Rpb25zOiIsCisjaWZkZWYgVE5DT0RFCisiICAgLSBUZWxuZXQgc2Vzc2lvbnMiLAorI2VuZGlmIC8qIFROQ09ERSAqLworI2lmZGVmIFNTSEJVSUxUSU4KKyIgICAtIFNTSCB2MSBhbmQgdjIgY29ubmVjdGlvbnMiLAorI2Vsc2UKKyNpZmRlZiBBTllTU0gKKyIgICAtIFNTSCBjb25uZWN0aW9ucyB2aWEgZXh0ZXJuYWwgYWdlbnQiLAorI2VuZGlmIC8qIEFOWVNTSCAqLworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKyNpZmRlZiBSTE9HQ09ERQorIiAgIC0gUmxvZ2luIHNlc3Npb25zIiwKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2lmZGVmIE5FV0ZUUAorIiAgIC0gRlRQIHNlc3Npb25zIiwKKyNlbmRpZiAvKiBORVdGVFAgKi8KKyNpZmRlZiBDS0hUVFAKKyIgICAtIEhUVFAgMS4xIHNlc3Npb25zIiwKKyNlbmRpZiAvKiBDS0hUVFAgKi8KKyNpZmRlZiBJS1NECisiICAgLSBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSIsCisjZW5kaWYgLyogSUtTRCAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2lmZGVmIEFOWVgyNQorIiAuIFguMjUgbmV0d29yayBjb25uZWN0aW9ucyIsCisjZW5kaWYgLyogQU5ZWDI1ICovCisjaWZkZWYgT1MyCisjaWZkZWYgREVDTkVUCisiIC4gREVDbmV0L1BBVEhXT1JLUyBMQVQgRXRoZXJuZXQgY29ubmVjdGlvbnMiLAorI2VuZGlmIC8qIERFQ05FVCAqLworI2lmZGVmIFNVUEVSTEFUCisiIC4gTWVyaWRpYW4gVGVjaG5vbG9naWVzJyBTdXBlckxBVCBjb25uZWN0aW9ucyIsCisjZW5kaWYgLyogU1VQRVJMQVQgKi8KKyNpZmRlZiBOUElQRQorIiAuIE5hbWVkLXBpcGUgY29ubmVjdGlvbnMiLAorI2VuZGlmIC8qIE5QSVBFICovCisjaWZkZWYgQ0tfTkVUQklPUworIiAuIE5FVEJJT1MgY29ubmVjdGlvbnMiLAorI2VuZGlmIC8qIENLX05FVEJJT1MgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyIgIiwKKyJXaGlsZSB0eXBpbmcgY29tbWFuZHMsIHlvdSBtYXkgdXNlIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzOiIsCisiIC4gREVMLCBSVUJPVVQsIEJBQ0tTUEFDRSwgQ1RSTC1IOiBEZWxldGUgdGhlIG1vc3QgcmVjZW50IGNoYXJhY3RlciB0eXBlZC4iLAorIiAuIENUUkwtVzogICAgICBEZWxldGUgdGhlIG1vc3QgcmVjZW50IHdvcmQgdHlwZWQuIiwKKyIgLiBDVFJMLVU6ICAgICAgRGVsZXRlIHRoZSBjdXJyZW50IGxpbmUuIiwKKyIgLiBDVFJMLVI6ICAgICAgUmVkaXNwbGF5IHRoZSBjdXJyZW50IGxpbmUuIiwKKworI2lmZGVmIENLX1JFQ0FMTAorI2lmZGVmIE9TMgorIiAuIFVwYXJyb3c6ICAgICBDb21tYW5kIHJlY2FsbCAtIGdvIGJhY2t3YXJkcyBpbiBjb21tYW5kIHJlY2FsbCBidWZmZXIuIiwKKyIgLiBEb3duYXJyb3c6ICAgQ29tbWFuZCByZWNhbGwgLSBnbyBmb3J3YXJkIGluIGNvbW1hbmQgcmVjYWxsIGJ1ZmZlci4iLAorI2lmbmRlZiBOT0lLU0QKKyIgICAoTm90ZTogQXJyb3cga2V5cyBjYW4gYmUgdXNlZCBvbmx5IG9uIHRoZSBQQydzIHBoeXNpY2FsIGtleWJvYXJkLikiLAorI2VuZGlmIC8qIE5PSUtTRCAqLworI2VuZGlmIC8qIE9TMiAqLworIiAuIENUUkwtUDogICAgICBDb21tYW5kIHJlY2FsbCAtIGdvIGJhY2t3YXJkcyBpbiBjb21tYW5kIHJlY2FsbCBidWZmZXIuIiwKKyIgLiBDVFJMLUI6ICAgICAgQ29tbWFuZCByZWNhbGwgLSBzYW1lIGFzIEN0cmwtUC4iLAorIiAuIENUUkwtTjogICAgICBDb21tYW5kIHJlY2FsbCAtIGdvIGZvcndhcmQgaW4gY29tbWFuZCByZWNhbGwgYnVmZmVyLiIsCisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisKKyIgLiA/ICAgICAgICAgICAgKHF1ZXN0aW9uIG1hcmspIERpc3BsYXkgYSBtZW51IGZvciB0aGUgY3VycmVudCBjb21tYW5kIGZpZWxkLiIKKywKKyIgLiBFU0MgICAgICAgICAgKG9yIFRBQikgQXR0ZW1wdCB0byBjb21wbGV0ZSB0aGUgY3VycmVudCBmaWVsZC4iLAorIiAuIFxcICAgICAgICAgICAgKGJhY2tzbGFzaCkgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlciBsaXRlcmFsbHkiLAorI2lmbmRlZiBOT1NQTAorIiAgICAgICAgICAgICAgICBvciBpbnRyb2R1Y2UgYSBiYWNrc2xhc2ggY29kZSwgdmFyaWFibGUsIG9yIGZ1bmN0aW9uLiIsCisjZWxzZQorIiAgICAgICAgICAgICAgICBvciBpbnRyb2R1Y2UgYSBudW1lcmljIGJhY2tzbGFzaCBjb2RlLiIsCisjZW5kaWYgLyogTk9TUEwgKi8KKyIgIiwKKworIklNUE9SVEFOVDogU2luY2UgYmFja3NsYXNoIChcXCkgaXMgS2VybWl0J3MgY29tbWFuZC1saW5lIGVzY2FwZSBjaGFyYWN0ZXIsIiwKKyJ5b3UgbXVzdCBlbnRlciBET1MsIFdpbmRvd3MsIG9yIE9TLzIgcGF0aG5hbWVzIHVzaW5nIGVpdGhlciBmb3J3YXJkIHNsYXNoICgvKSIKKywKKyJvciBkb3VibGUgYmFja3NsYXNoIChcXFxcKSBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciBpbiBtb3N0IGNvbnRleHRzLiIsCisiRXhhbXBsZXM6IEM6L1RNUC9SRUFETUUuVFhULCBDOlxcXFxUTVBcXFxcUkVBRE1FLlRYVC4iLAorIiAiLAorCisiQ29tbWFuZCB3b3JkcyBvdGhlciB0aGFuIGZpbGVuYW1lcyBjYW4gYmUgYWJicmV2aWF0ZWQgaW4gbW9zdCBjb250ZXh0cy4iLAorIiAiLAorCisiQmFzaWMgY29tbWFuZHM6IiwKKyIgIEVYSVQgICAgICAgICAgRXhpdCBmcm9tIEtlcm1pdCIsCisiICBIRUxQICAgICAgICAgIFJlcXVlc3QgZ2VuZXJhbCBoZWxwIiwKKyIgIEhFTFAgY29tbWFuZCAgUmVxdWVzdCBoZWxwIGFib3V0IHRoZSBnaXZlbiBjb21tYW5kIiwKKyIgIFRBS0UgICAgICAgICAgRXhlY3V0ZSBjb21tYW5kcyBmcm9tIGEgZmlsZSIsCisiICBUWVBFICAgICAgICAgIERpc3BsYXkgYSBmaWxlIG9uIHlvdXIgc2NyZWVuIiwKKyIgIE9SSUVOVEFUSU9OICAgRXhwbGFpbnMgZGlyZWN0b3J5IHN0cnVjdHVyZSIsCisiICIsCisKKyNpZm5kZWYgTk9YRkVSCisiQ29tbWFuZHMgZm9yIGZpbGUgdHJhbnNmZXI6IiwKKyIgIFNFTkQgICAgICAgICAgU2VuZCBmaWxlcyIsCisiICBSRUNFSVZFICAgICAgIFJlY2VpdmUgZmlsZXMiLAorIiAgR0VUICAgICAgICAgICBHZXQgZmlsZXMgZnJvbSBhIEtlcm1pdCBzZXJ2ZXIiLAorI2lmZGVmIENLX1JFU0VORAorIiAgUkVTRU5EICAgICAgICBSZWNvdmVyIGFuIGludGVycnVwdGVkIHNlbmQiLAorIiAgUkVHRVQgICAgICAgICBSZWNvdmVyIGFuIGludGVycnVwdGVkIGdldCBmcm9tIGEgc2VydmVyIiwKKyNlbmRpZiAvKiBDS19SRVNFTkQgKi8KKyNpZm5kZWYgTk9TRVJWRVIKKyIgIFNFUlZFUiAgICAgICAgQmUgYSBLZXJtaXQgc2VydmVyIiwKKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworIiAiLAorIkZpbGUtdHJhbnNmZXIgc3BlZWQgc2VsZWN0aW9uOiIsCisiICBGQVNUICAgICAgICAgIFVzZSBmYXN0IHNldHRpbmdzIC0tIFRISVMgSVMgVEhFIERFRkFVTFQiLAorIiAgQ0FVVElPVVMgICAgICBVc2Ugc2xvd2VyLCBtb3JlIGNhdXRpb3VzIHNldHRpbmdzIiwKKyIgIFJPQlVTVCAgICAgICAgVXNlIGV4dHJlbWVseSBzbG93IGFuZCBjYXV0aW91cyBzZXR0aW5ncyIsCisiICIsCisiRmlsZS10cmFuc2ZlciBwZXJmb3JtYW5jZSBmaW5lIHR1bmluZzoiLAorIiAgU0VUIFJFQ0VJVkUgUEFDS0VULUxFTkdUSCAgS2VybWl0IHBhY2tldCBzaXplIiwKKyIgIFNFVCBXSU5ET1cgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzbGlkaW5nIHdpbmRvdyBzbG90cyIsCisiICBTRVQgUFJFRklYSU5HICAgICAgICAgICAgICBBbW91bnQgb2YgY29udHJvbC1jaGFyYWN0ZXIgcHJlZml4aW5nIiwKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT0xPQ0FMCisiICIsCisiVG8gbWFrZSBhIGRpcmVjdCBzZXJpYWwgY29ubmVjdGlvbjoiLAorI2lmZGVmIE9TMgorI2lmZGVmIE5UCisjaWZkZWYgQ0tfVEFQSQorIiAgU0VUIFBPUlQgVEFQSSBTZWxlY3QgVEFQSSBjb21tdW5pY2F0aW9uIGRldmljZSIsCisjZW5kaWYgLyogQ0tfVEFQSSAqLworIiAgU0VUIFBPUlQgICAgICBTZWxlY3Qgc2VyaWFsIGNvbW11bmljYXRpb24gZGV2aWNlIiwKKyNlbHNlCisiICBTRVQgUE9SVCAgICAgIFNlbGVjdCBzZXJpYWwgY29tbXVuaWNhdGlvbiBwb3J0IG9yIHNlcnZlciIsCisjZW5kaWYgLyogTlQgKi8KKyNlbHNlCisiICBTRVQgTElORSAgICAgIFNlbGVjdCBzZXJpYWwgY29tbXVuaWNhdGlvbiBkZXZpY2UiLAorI2VuZGlmIC8qIE9TMiAqLworIiAgU0VUIFNQRUVEICAgICBTZWxlY3QgY29tbXVuaWNhdGlvbiBzcGVlZCIsCisiICBTRVQgUEFSSVRZICAgIENvbW11bmljYXRpb25zIHBhcml0eSAoaWYgbmVjZXNzYXJ5KSIsCisjaWZkZWYgQ0tfUlRTQ1RTCisiICBTRVQgRkxPVyAgICAgIENvbW11bmljYXRpb25zIGZsb3cgY29udHJvbCwgc3VjaCBhcyBSVFMvQ1RTIiwKKyNlbHNlCisiICBTRVQgRkxPVyAgICAgIENvbW11bmljYXRpb25zIGZsb3cgY29udHJvbCwgc3VjaCBhcyBYT04vWE9GRiIsCisjZW5kaWYgLyogQ0tfUlRTQ1RTICovCisiICBDT05ORUNUICAgICAgIEJlZ2luIHRlcm1pbmFsIGNvbm5lY3Rpb24iLAorCisjaWZuZGVmIE5PRElBTAorIiAiLAorIlRvIGRpYWwgb3V0IHdpdGggYSBtb2RlbToiLAorIiAgU0VUIERJQUwgRElSRUNUT1JZICAgICBTcGVjaWZ5IGRpYWxpbmcgZGlyZWN0b3J5IGZpbGUgKG9wdGlvbmFsKSIsCisiICBTRVQgRElBTCBDT1VOVFJZLUNPREUgIENvdW50cnkgeW91IGFyZSBkaWFsaW5nIGZyb20gKCopIiwKKyIgIFNFVCBESUFMIEFSRUEtQ09ERSAgICAgQXJlYS1jb2RlIHlvdSBhcmUgZGlhbGluZyBmcm9tICgqKSIsCisiICBMT09LVVAgICAgICAgICAgICAgICAgIExvb2t1cCBlbnRyaWVzIGluIHlvdXIgZGlhbGluZyBkaXJlY3RvcnkgKCopIiwKKyIgIFNFVCBNT0RFTSBUWVBFICAgICAgICAgU2VsZWN0IG1vZGVtIHR5cGUiLAorI2lmZGVmIE9TMgorI2lmZGVmIE5UCisjaWZkZWYgQ0tfVEFQSQorIiAgU0VUIFBPUlQgVEFQSSAgICAgICAgICBTZWxlY3QgVEFQSSBjb21tdW5pY2F0aW9uIGRldmljZSIsCisjZW5kaWYgLyogQ0tfVEFQSSAqLworIiAgU0VUIFBPUlQgICAgICAgICAgICAgICBTZWxlY3Qgc2VyaWFsIGNvbW11bmljYXRpb24gZGV2aWNlIiwKKyNlbHNlCisiICBTRVQgUE9SVCAgICAgICAgICAgICAgIFNlbGVjdCBzZXJpYWwgY29tbXVuaWNhdGlvbiBwb3J0IG9yIHNlcnZlciIsCisjZW5kaWYgLyogTlQgKi8KKyNlbHNlCisiICBTRVQgTElORSAgICAgICAgICAgICAgIFNlbGVjdCBzZXJpYWwgY29tbXVuaWNhdGlvbiBkZXZpY2UiLAorI2VuZGlmIC8qIE9TMiAqLworIiAgU0VUIFNQRUVEICAgICAgICAgICAgICBTZWxlY3QgY29tbXVuaWNhdGlvbiBzcGVlZCIsCisiICBTRVQgUEFSSVRZICAgICAgICAgICAgIENvbW11bmljYXRpb25zIHBhcml0eSAoaWYgbmVjZXNzYXJ5KSIsCisiICBESUFMICAgICAgICAgICAgICAgICAgIERpYWwgdGhlIHBob25lIG51bWJlciIsCisiICBDT05ORUNUICAgICAgICAgICAgICAgIEJlZ2luIHRlcm1pbmFsIGNvbm5lY3Rpb24iLAorIiAiLAorI2lmZGVmIE9TMgorIkZ1cnRoZXIgaW5mbzogICBIRUxQIERJQUwsIEhFTFAgU0VUIE1PREVNLCBIRUxQIFNFVCBQT1JULCBIRUxQIFNFVCBESUFMIiwKKyNlbHNlCisiRnVydGhlciBpbmZvOiAgIEhFTFAgRElBTCwgSEVMUCBTRVQgTU9ERU0sIEhFTFAgU0VUIExJTkUsIEhFTFAgU0VUIERJQUwiLAorI2VuZGlmIC8qIE9TMiAqLworIigqKSAoRm9yIHVzZSB3aXRoIG9wdGlvbmFsIGRpYWxpbmcgZGlyZWN0b3J5KSIsCisjZW5kaWYgLyogTk9ESUFMICovCisKKyNpZmRlZiBORVRDT05OCisiICIsCisiVG8gbWFrZSBhIG5ldHdvcmsgY29ubmVjdGlvbjoiLAorI2lmbmRlZiBOT0RJQUwKKyIgIFNFVCBORVRXT1JLIERJUkVDVE9SWSAgU3BlY2lmeSBhIG5ldHdvcmsgc2VydmljZXMgZGlyZWN0b3J5IChvcHRpb25hbCkiLAorIiAgTE9PS1VQICAgICAgICAgICAgICAgICBMb29rdXAgZW50cmllcyBpbiB5b3VyIG5ldHdvcmsgZGlyZWN0b3J5IiwKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyIgIFNFVCBORVRXT1JLIFRZUEUgICAgICAgU2VsZWN0IG5ldHdvcmsgdHlwZSAoaWYgbW9yZSB0aGFuIG9uZSBhdmFpbGFibGUpIiwKKyIgIFNFVCBIT1NUICAgICAgICAgICAgICAgTWFrZSBhIG5ldHdvcmsgY29ubmVjdGlvbiBidXQgc3RheSBpbiBjb21tYW5kIG1vZGUiLAorIiAgQ09OTkVDVCAgICAgICAgICAgICAgICBCZWdpbiB0ZXJtaW5hbCBjb25uZWN0aW9uIiwKKyNpZmRlZiBUTkNPREUKKyIgIFRFTE5FVCAgICAgICAgICAgICAgICAgU2VsZWN0IGEgVGVsbmV0IGhvc3QgYW5kIENPTk5FQ1QgdG8gaXQiLAorI2VuZGlmIC8qIFROQ09ERSAqLworI2lmZGVmIFJMT0dDT0RFCisiICBSTE9HSU4gICAgICAgICAgICAgICAgIFNlbGVjdCBhbiBSbG9naW4gaG9zdCBhbmQgQ09OTkVDVCB0byBpdCIsCisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBBTllTU0gKKyIgIFNTSCBbIE9QRU4gXSAgICAgICAgICAgU2VsZWN0IGFuIFNTSCBob3N0IGFuZCBDT05ORUNUIHRvIGl0IiwKKyNlbmRpZiAvKiBBTllTU0ggKi8KKyNpZmRlZiBORVdGVFAKKyIgIEZUUCBbIE9QRU4gXSAgICAgICAgICAgTWFrZSBhbiBGVFAgY29ubmVjdGlvbiIsCisjZW5kaWYgLyogTkVXRlRQICovCisjaWZkZWYgQ0tIVFRQCisiICBIVFRQIE9QRU4gICAgICAgICAgICAgIE1ha2UgYW4gSFRUUCBjb25uZWN0aW9uIiwKKyNlbmRpZiAvKiBDS0hUVFAgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisKKyNpZmRlZiBOVAorIiAiLAorIlRvIHJldHVybiBmcm9tIHRoZSB0ZXJtaW5hbCB3aW5kb3cgdG8gdGhlIEstOTU+IHByb21wdDoiLAorI2Vsc2UKKyNpZmRlZiBPUzIKKyIgIiwKKyJUbyByZXR1cm4gZnJvbSB0aGUgdGVybWluYWwgd2luZG93IHRvIHRoZSBLLzI+IHByb21wdDoiLAorI2Vsc2UKKyIgIiwKKyJUbyByZXR1cm4gZnJvbSBhIHRlcm1pbmFsIGNvbm5lY3Rpb24gdG8gdGhlIEMtS2VybWl0IHByb21wdDoiLAorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5UICovCisjaWZkZWYgT1MyCisiICBcCitQcmVzcyB0aGUga2V5IG9yIGtleS1jb21iaW5hdGlvbiBzaG93biBhZnRlciBcIkNvbW1hbmQ6XCIgaW4gdGhlIHN0YXR1cyBsaW5lIiwKKyIgIChzdWNoIGFzIEFsdC14KSBvciB0eXBlIHlvdXIgZXNjYXBlIGNoYXJhY3RlciBmb2xsb3dlZCBieSB0aGUgbGV0dGVyIEMuIiwKKyNlbHNlCisiICBUeXBlIHlvdXIgZXNjYXBlIGNoYXJhY3RlciBmb2xsb3dlZCBieSB0aGUgbGV0dGVyIEMuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyIgIiwKKyJUbyBkaXNwbGF5IHlvdXIgZXNjYXBlIGNoYXJhY3RlcjoiLAorIiAgU0hPVyBFU0NBUEUiLAorIiAiLAorIlRvIGRpc3BsYXkgb3RoZXIgc2V0dGluZ3M6IiwKKyIgIFNIT1cgQ09NTVVOSUNBVElPTlMsIFNIT1cgVEVSTUlOQUwsIFNIT1cgRklMRSwgU0hPVyBQUk9UT0NPTCwgZXRjLiIsCisjZWxzZSAgLyogIU5PTE9DQUwgKi8KKyIgIiwKKyJUbyBkaXNwbGF5IHNldHRpbmdzOiIsCisiICBTSE9XIENPTU1VTklDQVRJT05TLCBTSE9XIEZJTEUsIFNIT1cgUFJPVE9DT0wsIGV0Yy4iLAorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyIgIiwKKyNpZmRlZiBPUzIKKyJGb3IgYSBLZXJtaXQgOTUgdHV0b3JpYWwsIHZpc2l0OiIsCisiICBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvazk1dHV0b3IuaHRtbCIsCisiICIsCisjZW5kaWYgLyogT1MyICovCisiRm9yIGEgQy1LZXJtaXQgdHV0b3JpYWwsIHZpc2l0OiIsCisiICBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1dHV0b3IuaHRtbCIsCisiICIsCisiVG8gbGVhcm4gYWJvdXQgc2NyaXB0IHByb2dyYW1taW5nIGFuZCBhdXRvbWF0aW9uOiIsCisiICBSZWFkIHRoZSBtYW51YWwsIFwiVXNpbmcgQy1LZXJtaXRcIi4gIEZvciBhIGJyaWVmIHR1dG9yaWFsLCB2aXNpdDoiLAorIiAgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2Nrc2NyaXB0cy5odG1sIiwKKyIgIiwKKyJGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgY29tbWFuZCwgdHlwZSBIRUxQIHh4eCwiLAorIndoZXJlIHh4eCBpcyB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZC4gIEZvciBkb2N1bWVudGF0aW9uLCBuZXdzIG9mIG5ldyIsCisicmVsZWFzZXMsIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBLZXJtaXQgc29mdHdhcmUsIGNvbnRhY3Q6IiwKKyIgIiwKKyIgIFRoZSBLZXJtaXQgUHJvamVjdCAgICAgICAgIEUtbWFpbDoga2VybWl0QGNvbHVtYmlhLmVkdSIsCisiICBDb2x1bWJpYSBVbml2ZXJzaXR5ICAgICAgICBXZWI6ICAgIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8iLAorIiAgNjEyIFdlc3QgMTE1dGggU3RyZWV0ICAgICAgVm9pY2U6ICArMSAoMjEyKSA4NTQtMzcwMyIsCisiICBOZXcgWW9yayBOWSAgMTAwMjUtNzc5OSAgICBGYXg6ICAgICsxICgyMTIpIDY2Mi02NDQyIiwKKyIgIFVTQSIsCisiIgorfTsKKworc3RhdGljIGNoYXIgKiBobXh5bWF0Y2hbXSA9IHsKKyJTRVQgTUFUQ0ggeyBET1RGSUxFLCBGSUZPIH0geyBPTiwgT0ZGIH0iLAorIiAgVGVsbHMgd2hldGhlciB3aWxkY2FyZHMgc2hvdWxkIG1hdGNoIGRvdGZpbGVzIChmaWxlcyB3aG9zZSBuYW1lcyBiZWdpbiIsCisiICB3aXRoIHBlcmlvZCkgb3IgVU5JWCBGSUZPIHNwZWNpYWwgZmlsZXMuICBNQVRDSCBGSUZPIGRlZmF1bHQgaXMgT0ZGLiIsCisiICBNQVRDSCBET1RGSUxFIGRlZmF1bHQgaXMgT0ZGIGluIFVOSVgsIE9OIGVsc2V3aGVyZS4iLAorIiIKK307CisKKyNpZmRlZiBPUzIKKyNpZmRlZiBLVUkKK3N0YXRpYyBjaGFyICogaG14eWd1aVtdID0geworIlNFVCBHVUkgRElBTE9HUyB7IE9OLCBPRkYgfSIsCisiICBPTiBtZWFucyB0aGF0IHBvcHVwcywgYWxlcnRzLCB1c2UgR1VJIGRpYWxvZ3M7IE9GRiBtZWFucyB0byB1c2UiLAorIiAgdGV4dC1tb2RlIHBvcHVwcyBvciBwcm9tcHRzLiAgT04gYnkgZGVmYXVsdC4iLAorIiAiLAorIlNFVCBHVUkgRk9OVCBuYW1lIHNpemUiLAorIiAgQ2hvb3NlcyB0aGUgZm9udCBhbmQgc2l6ZS4gIFR5cGUgXCJzZXQgZ3VpIGZvbnQgP1wiIHRvIHNlZSB0aGUgbGlzdCBvZiIsCisiICBjaG9pY2VzLiAgVGhlIHNpemUgY2FuIGJlIGEgd2hvbGUgbnVtYmVyIG9yIGNhbiBjb250YWluIGEgZGVjaW1hbCBwb2ludCIsCisiICBhbmQgYSBmcmFjdGlvbiAod2hpY2ggaXMgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBoYWxmIHBvaW50KS4iLAorIiAiLAorIlNFVCBHVUkgUkdCQ09MT1IgY29sb3JuYW1lIHJlZHZhbHVlIGdyZWVudmFsdWUgYmx1ZXZhbHVlIiwKKyIgIFNwZWNpZmllcyB0aGUgcmVkLWdyZWVuLWJsdWUgbWl4dHVyZSB0byBiZSB1c2VkIHRvIHJlbmRlciB0aGUgZ2l2ZW4iLAorIiAgY29sb3IgbmFtZS4gIFR5cGUgXCJzZXQgZ3VpIHJnYmNvbG9yXCIgdG8gc2VlIGEgbGlzdCBvZiBjb2xvcm5hbWVzLiIsCisiICB0aGUgUkdCIHZhbHVlcyBhcmUgd2hvbGUgbnVtYmVycyBmcm9tIDAgdG8gMjU1LiIsCisiICIsCisiU0VUIEdVSSBXSU5ET1cgUE9TSVRJT04geCB5IiwKKyIgIE1vdmVzIHRoZSBLOTUgd2luZG93IHRvIHRoZSBnaXZlbiBYLFkgY29vcmRpbmF0ZXMsIHBpeGVscyBmcm9tIHRvcCBsZWZ0LiIsCisiICAoTm90IHlldCBpbXBsZW1lbnRlZCAtLSB1c2UgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gZG8gdGhpcy4pIiwKKyIgIiwKKyJTRVQgR1VJIFdJTkRPVyBSRVNJWkUtTU9ERSB7IENIQU5HRS1ESU1FTlNJT05TLCBTQ0FMRS1GT05UIH0iLAorIiAgRGVmYXVsdCBpcyBDSEFOR0UtRElNRU5TSU9OUy4iLAorIiIsCisiU0VUIEdVSSBXSU5ET1cgUlVOLU1PREUgeyBNQVhJTUlaRSwgTUlOSU1JWkUsIFJFU1RPUkUgfSIsCisiICBDaGFuZ2VzIHRoZSBydW4gbW9kZSBzdGF0ZSBvZiB0aGUgR1VJIHdpbmRvdy4iLAorIiIKK307CisjZW5kaWYgLyogS1VJICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBBTllTU0gKK3N0YXRpYyBjaGFyICogaG14eHNzaFtdID0geworI2lmZGVmIFNTSEJVSUxUSU4KKyJTeW50YXg6IFNTSCB7IEFERCwgQUdFTlQsIENMRUFSLCBLRVksIFsgT1BFTiBdLCBWMiB9IG9wZXJhbmRzLi4uIiwKKyIgIFBlcmZvcm1zIGFuIFNTSC1yZWxhdGVkIGFjdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBrZXl3b3JkIHRoYXQgZm9sbG93czoiLAorIiAiLAorIlNTSCBBREQgTE9DQUwtUE9SVC1GT1JXQVJEIGxvY2FsLXBvcnQgaG9zdCBwb3J0IiwKKyIgIEFkZHMgYSBwb3J0IGZvcndhcmRpbmcgdHJpcGxldCB0byB0aGUgbG9jYWwgcG9ydCBmb3J3YXJkaW5nIGxpc3QuIiwKKyIgIFRoZSB0cmlwbGV0IHNwZWNpZmllcyBhIGxvY2FsIHBvcnQgdG8gYmUgZm9yd2FyZGVkIGFuZCB0aGUgaG9zdG5hbWUgLyIsCisiICBpcC1hZGRyZXNzIGFuZCBwb3J0IG51bWJlciB0byB3aGljaCB0aGUgcG9ydCBzaG91bGQgYmUgZm9yd2FyZGVkIGZyb20iLAorIiAgdGhlIHJlbW90ZSBob3N0LiAgUG9ydCBmb3J3YXJkaW5nIGlzIGFjdGl2YXRlZCBhdCBjb25uZWN0aW9uIiwKKyIgIGVzdGFibGlzaG1lbnQgYW5kIGNvbnRpbnVlcyB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyB0ZXJtaW5hdGVkLiIsCisiICIsCisiU1NIIEFERCBSRU1PVEUtUE9SVC1GT1JXQVJEIHJlbW90ZS1wb3J0IGhvc3QgcG9ydCIsCisiICBBZGRzIGEgcG9ydCBmb3J3YXJkaW5nIHRyaXBsZXQgdG8gdGhlIHJlbW90ZSBwb3J0IGZvcndhcmRpbmcgbGlzdC4iLAorIiAgVGhlIHRyaXBsZXQgc3BlY2lmaWVzIGEgcmVtb3RlIHBvcnQgdG8gYmUgZm9yd2FyZGVkIGFuZCB0aGUiLAorIiAgaG9zdG5hbWUvaXAtYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIgdG8gd2hpY2ggdGhlIHBvcnQgc2hvdWxkIGJlIiwKKyIgIGZvcndhcmRlZCBmcm9tIHRoZSBsb2NhbCBtYWNoaW5lLiAgUG9ydCBmb3J3YXJkaW5nIGlzIGFjdGl2YXRlZCBhdCIsCisiICBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQgYW5kIGNvbnRpbnVlcyB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyIsCisiICB0ZXJtaW5hdGVkLiIsCisiICIsCisiU1NIIEFHRU5UIEFERCBbIGlkZW50aXR5LWZpbGUgXSIsCisiICBBZGRzIHRoZSBjb250ZW50cyBvZiB0aGUgaWRlbnRpdHktZmlsZSAoaWYgYW55KSB0byB0aGUgU1NIIEFHRU5UIiwKKyIgIHByaXZhdGUga2V5IGNhY2hlLiAgSWYgbm8gaWRlbnRpdHktZmlsZSBpcyBzcGVjaWZpZWQsIGFsbCBmaWxlcyIsCisiICBzcGVjaWZpZWQgd2l0aCBTRVQgU1NIIElERU5USVRZLUZJTEUgYXJlIGFkZGVkIHRvIHRoZSBjYWNoZS4iLAorIiAiLAorIlNTSCBBR0VOVCBERUxFVEUgWyBpZGVudGl0eS1maWxlIF0iLAorIiAgRGVsZXRlcyB0aGUgY29udGVudHMgb2YgdGhlIGlkZW50aXR5LWZpbGUgKGlmIGFueSkgZnJvbSB0aGUgU1NIIEFHRU5UIiwKKyIgIHByaXZhdGUga2V5IGNhY2hlLiAgSWYgbm8gaWRlbnRpdHktZmlsZSBpcyBzcGVjaWZpZWQsIGFsbCBmaWxlcyIsCisiICBzcGVjaWZpZWQgd2l0aCBTRVQgU1NIIElERU5USVRZLUZJTEUgYXJlIGRlbGV0ZWQgZnJvbSB0aGUgY2FjaGUuIiwKKyIgIiwKKyJTU0ggQUdFTlQgTElTVCBbIC9GSU5HRVJQUklOVCBdIiwKKyIgIExpc3RzIHRoZSBjb250ZW50cyBvZiB0aGUgU1NIIEFHRU5UIHByaXZhdGUga2V5IGNhY2hlLiAgSWYgL0ZJTkdFUlBSSU5UIiwKKyIgIGlzIHNwZWNpZmllZCwgdGhlIGZpbmdlcnByaW50IG9mIHRoZSBwcml2YXRlIGtleXMgYXJlIGRpc3BsYXllZCBpbnN0ZWFkIiwKKyIgIG9mIHRoZSBrZXlzLiIsCisiICIsCisiU1NIIENMRUFSIExPQ0FMLVBPUlQtRk9SV0FSRCIsCisiICBDbGVhcnMgdGhlIGxvY2FsIHBvcnQgZm9yd2FyZGluZyBsaXN0LiIsCisiICIsCisiU1NIIENMRUFSIFJFTU9URS1QT1JULUZPUldBUkQiLAorIiAgQ2xlYXJzIHRoZSByZW1vdGUgcG9ydCBmb3J3YXJkaW5nIGxpc3QuIiwKKyIgIiwKKyJTU0ggS0VZIGNvbW1hbmRzOiIsCisiICBUaGUgU1NIIEtFWSBjb21tYW5kcyBjcmVhdGUgYW5kIG1hbmFnZSBwdWJsaWMgYW5kIHByaXZhdGUga2V5IHBhaXJzIiwKKyIgIChpZGVudGl0aWVzKS4gIFRoZXJlIGFyZSB0aHJlZSBmb3JtcyBvZiBTU0gga2V5cy4gIEVhY2gga2V5IHBhaXIgaXMiLAorIiAgc3RvcmVkIGluIGl0cyBvd24gc2V0IG9mIGZpbGVzOiIsCisiICIsCisiICAgS2V5IFR5cGUgICAgICBQcml2YXRlIEtleSBGaWxlICAgICAgICAgICBQdWJsaWMgS2V5IEZpbGUiLAorIiAgICB2MSBSU0Ega2V5cyAgIFxcdihhcHBkYXRhKXNzaC9pZGVudGl0eSAgIFxcdihhcHBkYXRhKXNzaC9pZGVudGl0eS5wdWIiLAorIiAgICB2MiBSU0Ega2V5cyAgIFxcdihhcHBkYXRhKXNzaC9pZF9yc2EgICAgIFxcdihhcHBkYXRhKXNzaC9pZF9yc2EucHViIiwKKyIgICAgdjIgRFNBIGtleXMgICBcXHYoYXBwZGF0YSlzc2gvaWRfZHNhICAgICBcXHYoYXBwZGF0YSlzc2gvaWRfZHNhLnB1YiIsCisiICIsCisiICBLZXlzIGFyZSBzdG9yZWQgdXNpbmcgdGhlIE9wZW5TU0gga2V5ZmlsZSBmb3JtYXQuICBUaGUgcHJpdmF0ZSBrZXkiLAorIiAgZmlsZXMgY2FuIGJlIChvcHRpb25hbGx5KSBwcm90ZWN0ZWQgYnkgc3BlY2lmeWluZyBhIHBhc3NwaHJhc2UuICBBIiwKKyIgIHBhc3NwaHJhc2UgaXMgYSBsb25nZXIgdmVyc2lvbiBvZiBhIHBhc3N3b3JkLiAgRW5nbGlzaCB0ZXh0IHByb3ZpZGVzIiwKKyIgIG5vIG1vcmUgdGhhbiAyIGJpdHMgb2Yga2V5IGRhdGEgcGVyIGNoYXJhY3Rlci4gIDU2LWJpdCBrZXlzIGNhbiBiZSIsCisiICBicm9rZW4gYnkgYSBicnV0ZSBmb3JjZSBhdHRhY2sgaW4gYXBwcm94aW1hdGVseSAyNCBob3Vycy4gIFdoZW4gdXNlZCwiLAorIiAgcHJpdmF0ZSBrZXkgZmlsZXMgc2hvdWxkIHRoZXJlZm9yZSBiZSBwcm90ZWN0ZWQgYnkgYSBwYXNzcGhyYXNlIG9mIGF0IiwKKyIgIGxlYXN0IDQwIGNoYXJhY3RlcnMgKGFib3V0IDgwIGJpdHMpLiIsCisiICIsCisiICBUbyBpbnN0YWxsIGEgcHVibGljIGtleSBmaWxlIG9uIHRoZSBob3N0LCB5b3UgbXVzdCB0cmFuc2ZlciB0aGUgZmlsZSIsCisiICB0byB0aGUgaG9zdCBhbmQgYXBwZW5kIGl0IHRvIHlvdXIgXCJhdXRob3JpemVkX2tleXNcIiBmaWxlLiAgVGhlIGZpbGUiLAorIiAgcGVybWlzc2lvbnMgbXVzdCBiZSA2MDAgKG9yIGVxdWl2YWxlbnQpLiIsCisiICIsCisiU1NIIEtFWSBDSEFOR0UtUEFTU1BIUkFTRSBbIC9ORVctUEFTU1BIUkFTRTpwYXNzcGhyYXNlIiwKKyIgICAgICAvT0xELVBBU1NQSFJBU0U6cGFzc3BocmFzZSBdIGZpbGVuYW1lIiwKKyIgIFRoaXMgcmUtZW5jcnlwdHMgdGhlIHNwZWNpZmllZCBwcml2YXRlIGtleSBmaWxlIHdpdGggYSBuZXcgcGFzc3BocmFzZS4iLAorIiAgVGhlIG9sZCBwYXNzcGhyYXNlIGlzIHJlcXVpcmVkLiAgSWYgdGhlIHBhc3NwaHJhc2VzIChhbmQgZmlsZW5hbWUpIGFyZSIsCisiICBub3QgcHJvdmlkZWQgS2VybWl0IHByb21wdHMgeW91ciBmb3IgdGhlbS4iLAorIiAiLAorIlNTSCBLRVkgQ1JFQVRFIFsgL0JJVFM6Yml0cyAvUEFTU1BIUkFTRTpwYXNzcGhyYXNlIiwKKyIgICAgL1RZUEU6eyBWMS1SU0EsIFYyLURTQSwgVjItUlNBIH0gL1YxLVJTQS1DT01NRU5UOmNvbW1lbnQgXSBmaWxlbmFtZSIsCisiICBUaGlzIGNvbW1hbmQgY3JlYXRlcyBhIG5ldyBwcml2YXRlL3B1YmxpYyBrZXkgcGFpci4gIFRoZSBkZWZhdWx0cyBhcmU6IiwKKyIgIEJJVFM6MTAyNCBhbmQgVFlQRTpWMi1SU0EuICBUaGUgZmlsZW5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByaXZhdGUiLAorIiAga2V5IGZpbGUuICBUaGUgcHVibGljIGtleSBpcyBjcmVhdGVkIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoIC5wdWIiLAorIiAgYXBwZW5kZWQgdG8gaXQuICBJZiBhIGZpbGVuYW1lIGlzIG5vdCBzcGVjaWZpZWQgS2VybWl0IHByb21wdHMgeW91IGZvciIsCisiICBpdC4gIFYxIFJTQSBrZXkgZmlsZXMgbWF5IGhhdmUgYW4gb3B0aW9uYWwgY29tbWVudCwgd2hpY2ggaXMgaWdub3JlZCIsCisiICBmb3Igb3RoZXIga2V5IHR5cGVzLiIsCisiICIsCisiU1NIIEtFWSBESVNQTEFZIFsgL0ZPUk1BVDp7RklOR0VSUFJJTlQsSUVURixPUEVOU1NILFNTSC5DT019IF0gZmlsZW5hbWUiLAorIiAgVGhpcyBjb21tYW5kIGRpc3BsYXlzIHRoZSBjb250ZW50cyBvZiBhIHB1YmxpYyBvciBwcml2YXRlIGtleSBmaWxlLiIsCisiICBUaGUgZGVmYXVsdCBmb3JtYXQgaXMgT1BFTlNTSC4iLAorIiAiLAorIlNTSCBLRVkgVjEgU0VULUNPTU1FTlQgZmlsZW5hbWUgY29tbWVudCIsCisiICBUaGlzIGNvbW1hbmQgcmVwbGFjZXMgdGhlIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIGEgVjEgUlNBIGtleSBmaWxlLiIsCisiICIsCisiU1NIIFsgT1BFTiBdIGhvc3QgWyBwb3J0IF0gWyAvQ09NTUFORDpjb21tYW5kIC9VU0VSOnVzZXJuYW1lIiwKKyIgICAgICAvUEFTU1dPUkQ6cHdkIC9WRVJTSU9OOnsgMSwgMiB9IC9YMTEtRk9SV0FSRElORzp7IE9OLCBPRkYgfSBdIiwKKyIgIFRoaXMgY29tbWFuZCBlc3RhYmxpc2hlcyBhIG5ldyBjb25uZWN0aW9uIHVzaW5nIFNTSCB2ZXJzaW9uIDEgb3IiLAorIiAgdmVyc2lvbiAyIHByb3RvY29sLiAgVGhlIGNvbm5lY3Rpb24gaXMgbWFkZSB0byB0aGUgc3BlY2lmaWVkIGhvc3Qgb24iLAorIiAgdGhlIFNTSCBwb3J0ICh5b3UgY2FuIG92ZXJyaWRlIHRoZSBwb3J0IGJ5IGluY2x1ZGluZyBhIHBvcnQgbmFtZSBvciIsCisiICBudW1iZXIgYWZ0ZXIgdGhlIGhvc3QgbmFtZSkuICBPbmNlIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHRoZSIsCisiICBhdXRoZW50aWNhdGlvbiBuZWdvdGlhdGlvbnMgYmVnaW4uICBJZiB0aGUgYXV0aGVudGljYXRpb24gaXMgYWNjZXB0ZWQsIiwKKyIgIHRoZSBsb2NhbCBhbmQgcmVtb3RlIHBvcnQgZm9yd2FyZGluZyBsaXN0cyBhcmUgdXNlZCB0byBlc3RhYmxpc2ggdGhlIiwKKyIgIGRlc2lyZWQgY29ubmVjdGlvbnMuICBJZiBYMTEgRm9yd2FyZGluZyBpcyBhY3RpdmUsIHRoaXMgcmVzdWx0cyBpbiBhIiwKKyIgIHJlbW90ZSBwb3J0IGZvcndhcmRpbmcgYmV0d2VlbiB0aGUgWDExIGNsaWVudHMgb24gdGhlIHJlbW90ZSBob3N0IGFuZCIsCisiICBYMTEgU2VydmVyIG9uIHRoZSBsb2NhbCBtYWNoaW5lLiAgSWYgYSAvQ09NTUFORCBpcyBwcm92aWRlZCwgdGhlIiwKKyIgIGNvbW1hbmQgaXMgZXhlY3V0ZWQgb24gdGhlIHJlbW90ZSBob3N0IGluIHBsYWNlIG9mIHlvdXIgZGVmYXVsdCBzaGVsbC4iLAorIiAiLAorIiAgQW4gZXhhbXBsZSBvZiBhIC9DT01NQU5EIHRvIGV4ZWN1dGUgQy1LZXJtaXQgaW4gU0VSVkVSIG1vZGUgaXM6IiwKKyIgICAgIFNTSCBPUEVOIGhvc3RuYW1lIC9DT01NQU5EOntrZXJtaXQgLXggLWwgMH0iLAorIiAiLAorIlNTSCBWMiBSRUtFWSIsCisiICBSZXF1ZXN0cyB0aGF0IGFuIGV4aXN0aW5nIFNTSCBWMiBjb25uZWN0aW9uIGdlbmVyYXRlIG5ldyBzZXNzaW9uIGtleXMuIiwKKyNlbHNlICAvKiBTU0hCVUlMVElOICovCisiU3ludGF4OiBTU0ggWyBvcHRpb25zIF0gPGhvc3RuYW1lPiBbIGNvbW1hbmQgXSIsCisiICBNYWtlcyBhbiBTU0ggY29ubmVjdGlvbiB1c2luZyB0aGUgZXh0ZXJuYWwgc3NoIHByb2dyYW0gdmlhIHRoZSBTRVQgU1NIIiwKKyIgIENPTU1BTkQgc3RyaW5nLCB3aGljaCBpcyBcInNzaCAtZSBub25lXCIgYnkgZGVmYXVsdC4gIE9wdGlvbnMgZm9yIHRoZSIsCisiICBleHRlcm5hbCBzc2ggcHJvZ3JhbSBtYXkgYmUgaW5jbHVkZWQuICBJZiB0aGUgaG9zdG5hbWUgaXMgZm9sbG93ZWQgYnkgYSIsCisiICBjb21tYW5kLCB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCBvbiB0aGUgaG9zdCBpbnN0ZWFkIG9mIGFuIGludGVyYWN0aXZlIiwKKyIgIHNoZWxsLiIsCisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworIiIKK307CisKK3N0YXRpYyBjaGFyICpobXh5c3NoW10gPSB7CisjaWZkZWYgU1NIQlVJTFRJTgorIlNFVCBTU0ggQUdFTlQtRk9SV0FSRElORyB7IE9OLCBPRkYgfSIsCisiICBJZiBhbiBhdXRoZW50aWNhdGlvbiBhZ2VudCBpcyBpbiB1c2UsIHNldHRpbmcgdGhpcyB2YWx1ZSB0byBPTiIsCisiICByZXN1bHRzIGluIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBhZ2VudCBiZWluZyBmb3J3YXJkZWQgdG8gdGhlIHJlbW90ZSIsCisiICBjb21wdXRlci4gIFRoZSBkZWZhdWx0IGlzIE9GRi4iLAorIiAiLAorIlNFVCBTU0ggQ0hFQ0stSE9TVC1JUCB7IE9OLCBPRkYgfSIsCisiICBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVtb3RlIGhvc3QncyBpcC1hZGRyZXNzIHNob3VsZCBiZSBjaGVja2VkIiwKKyIgIGFnYWluc3QgdGhlIG1hdGNoaW5nIGhvc3Qga2V5IGluIHRoZSBrbm93bl9ob3N0cyBmaWxlLiAgVGhpcyBjYW4gYmUiLAorIiAgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGhvc3Qga2V5IGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgRE5TIHNwb29maW5nLiIsCisiICBUaGUgZGVmYXVsdCBpcyBPTi4iLAorIiAiLAorIlNFVCBTU0ggQ09NUFJFU1NJT04geyBPTiwgT0ZGIH0iLAorIiAgU3BlY2lmaWVzIHdoZXRoZXIgY29tcHJlc3Npb24gd2lsbCBiZSB1c2VkLiAgVGhlIGRlZmF1bHQgaXMgT04uIiwKKyIgIiwKKyJTRVQgU1NIIERZTkFNSUMtRk9SV0FSRElORyB7IE9OLCBPRkYgfSIsCisiICBTcGVjaWZpZXMgd2hldGhlciBLZXJtaXQgaXMgdG8gYWN0IGFzIGEgU09DS1M0IHNlcnZpY2Ugb24gcG9ydCAxMDgwIiwKKyIgIHdoZW4gY29ubmVjdGVkIHRvIGEgcmVtb3RlIGhvc3QgdmlhIFNTSC4gIFdoZW4gS2VybWl0IGFjdHMgYXMgYSBTT0NLUzQiLAorIiAgc2VydmljZSwgaXQgYWNjZXB0cyBjb25uZWN0aW9uIHJlcXVlc3RzIGFuZCBmb3J3YXJkcyB0aGUgY29ubmVjdGlvbnMiLAorIiAgdGhyb3VnaCB0aGUgcmVtb3RlIGhvc3QuICBUaGUgZGVmYXVsdCBpcyBPRkYuIiwKKyIgIiwKKyJTRVQgU1NIIEdBVEVXQVktUE9SVFMgeyBPTiwgT0ZGIH0iLAorIiAgU3BlY2lmaWVzIHdoZXRoZXIgS2VybWl0IHNob3VsZCBhY3QgYXMgYSBnYXRld2F5IGZvciBmb3J3YXJkZWQiLAorIiAgY29ubmVjdGlvbnMgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIGhvc3QuICBUaGUgZGVmYXVsdCBpcyBPRkYuIiwKKyIgIiwKKyJTRVQgU1NIIEdTU0FQSSBERUxFR0FURS1DUkVERU5USUFMUyB7IE9OLCBPRkYgfSIsCisiICBTcGVjaWZpZXMgd2hldGhlciBLZXJtaXQgc2hvdWxkIGRlbGVnYXRlIEdTU0FQSSBjcmVkZW50aWFscyB0byAiLAorIiAgdGhlIHJlbW90ZSBob3N0IGFmdGVyIGF1dGhlbnRpY2F0aW9uLiAgRGVsZWdhdGluZyBjcmVkZW50aWFscyBhbGxvd3MiLAorIiAgdGhlIGNyZWRlbnRpYWxzIHRvIGJlIHVzZWQgZnJvbSB0aGUgcmVtb3RlIGhvc3QuICBUaGUgZGVmYXVsdCBpcyBPRkYuIiwKKyIgIiwKKyJTRVQgU1NIIEhFQVJUQkVBVC1JTlRFUlZBTCA8c2Vjb25kcz4iLAorIiAgU3BlY2lmaWVzIGEgbnVtYmVyIG9mIHNlY29uZHMgb2YgaWRsZSB0aW1lIGFmdGVyIHdoaWNoIGFuIElHTk9SRSIsCisiICBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgc2VydmVyLiAgVGhpcyBwdWxzZSBpcyB1c2VmdWwgZm9yIiwKKyIgIG1haW50YWluaW5nIGNvbm5lY3Rpb25zIHRocm91Z2ggSFRUUCBQcm94eSBzZXJ2ZXJzIGFuZCBOZXR3b3JrIiwKKyIgIEFkZHJlc3MgVHJhbnNsYXRvcnMuICBUaGUgZGVmYXVsdCBpcyBPRkYgKDAgc2Vjb25kcykuIiwKKyIgIiwKKyJTRVQgU1NIIElERU5USVRZLUZJTEUgZmlsZW5hbWUgWyBmaWxlbmFtZSBbIC4uLiBdIF0iLAorIiAgU3BlY2lmaWVzIG9uZSBvciBtb3JlIGZpbGVzIGZyb20gd2hpY2ggdGhlIHVzZXIncyBhdXRob3JpemF0aW9uIiwKKyIgIGlkZW50aXRpZXMgKHByaXZhdGUga2V5cykgYXJlIHRvIGJlIHJlYWQgd2hlbiB1c2luZyBwdWJsaWMga2V5IiwKKyIgIGF1dGhvcml6YXRpb24uICBUaGVzZSBhcmUgZmlsZXMgdXNlZCBpbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCBmaWxlczoiLAorIiAiLAorIiAgICBcXHYoYXBwZGF0YSlzc2gvaWRlbnRpdHkgICAgICBWMSBSU0EiLAorIiAgICBcXHYoYXBwZGF0YSlzc2gvaWRfcnNhICAgICAgICBWMiBSU0EiLAorIiAgICBcXHYoYXBwZGF0YSlzc2gvaWRfZHNhICAgICAgICBWMiBEU0EiLAorIiAiLAorIlNFVCBTU0ggS0VSQkVST1M0IFRHVC1QQVNTSU5HIHsgT04sIE9GRiB9IiwKKyIgIFNwZWNpZmllcyB3aGV0aGVyIEtlcm1pdCBzaG91bGQgZm9yd2FyZCBLZXJiZXJvcyA0IFRHVHMgdG8gdGhlIGhvc3QuIiwKKyIgIFRoZSBkZWZhdWx0IGlzIE9GRi4iLAorIiAiLAorIlNFVCBTU0ggS0VSQkVST1M1IFRHVC1QQVNTSU5HIHsgT04sIE9GRiB9IiwKKyIgIFNwZWNpZmllcyB3aGV0aGVyIEtlcm1pdCBzaG91bGQgZm9yd2FyZCBLZXJiZXJvcyA1IFRHVHMgdG8gdG8gdGhlIiwKKyIgIGhvc3QuICBUaGUgZGVmYXVsdCBpcyBPRkYuIiwKKyIgIiwKKyJTRVQgU1NIIFBSSVZJTEVHRUQtUE9SVCB7IE9OLCBPRkYgfSIsCisiICBTcGVjaWZpZXMgd2hldGhlciBhIHByaXZpbGVnZWQgcG9ydCAobGVzcyB0aGFuIDEwMjQpIHNob3VsZCBiZSB1c2VkIiwKKyIgIHdoZW4gY29ubmVjdGluZyB0byB0aGUgaG9zdC4gIFByaXZpbGVnZWQgcG9ydHMgYXJlIG5vdCByZXF1aXJlZCBleGNlcHQiLAorIiAgd2hlbiB1c2luZyBTU0ggVjEgd2l0aCBSaG9zdHMgb3IgUmhvc3RzUlNBIGF1dGhvcml6YXRpb24uICBUaGUgZGVmYXVsdCIsCisiICBpcyBPRkYuIiwKKyIgIiwKKyJTRVQgU1NIIFFVSUVUIHsgT04sIE9GRiB9IiwKKyIgIFNwZWNpZmllcyB3aGV0aGVyIGFsbCBtZXNzYWdlcyBnZW5lcmF0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTU0giLAorIiAgcHJvdG9jb2xzIHNob3VsZCBiZSBzdXBwcmVzc2VkLiAgVGhlIGRlZmF1bHQgaXMgT0ZGLiIsCisiICIsCisiU0VUIFNTSCBTVFJJQ1QtSE9TVC1LRVktQ0hFQ0sgeyBBU0ssIE9OLCBPRkYgfSIsCisiICBTcGVjaWZpZXMgaG93IEtlcm1pdCBzaG91bGQgYmVoYXZlIGlmIHRoZSB0aGUgaG9zdCBrZXkgY2hlY2sgZmFpbHMuIiwKKyIgIFdoZW4gc3RyaWN0IGhvc3Qga2V5IGNoZWNraW5nIGlzIE9GRiwgdGhlIG5ldyBob3N0IGtleSBpcyBhZGRlZCB0byB0aGUiLAorIiAgcHJvdG9jb2wtdmVyc2lvbi1zcGVjaWZpYyB1c2VyLWtub3duLWhvc3RzLWZpbGUuICBXaGVuIHN0cmljdCBob3N0IGtleSIsCisiICBjaGVja2luZyBpcyBPTiwgdGhlIG5ldyBob3N0IGtleSBpcyByZWZ1c2VkIGFuZCB0aGUgY29ubmVjdGlvbiBpcyIsCisiICBkcm9wcGVkLiAgV2hlbiBzZXQgdG8gQVNLLCBLZXJtaXQgcHJvbXB0IHlvdSB0byBzYXkgd2hldGhlciB0aGUgbmV3IiwKKyIgIGhvc3Qga2V5IHNob3VsZCBiZSBhY2NlcHRlZC4gIFRoZSBkZWZhdWx0IGlzIEFTSy4iLAorIiAiLAorIiAgU3RyaWN0IGhvc3Qga2V5IGNoZWNraW5nIHByb3RlY3RzIHlvdSBhZ2FpbnN0IFRyb2phbiBob3JzZSBhdHRhY2tzLiIsCisiICBJdCBkZXBlbmRzIG9uIHlvdSB0byBtYWludGFpbiB0aGUgY29udGVudHMgb2YgdGhlIGtub3duLWhvc3RzLWZpbGUiLAorIiAgd2l0aCBjdXJyZW50IGFuZCB0cnVzdGVkIGhvc3Qga2V5cy4iLAorIiAiLAorIlNFVCBTU0ggVVNFLU9QRU5TU0gtQ09ORklHIHsgT04sIE9GRiB9IiwKKyIgIFNwZWNpZmllcyB3aGV0aGVyIEtlcm1pdCBzaG91bGQgcGFyc2UgYW4gT3BlblNTSCBjb25maWd1cmF0aW9uIGZpbGUiLAorIiAgYWZ0ZXIgYXBwbHlpbmcgS2VybWl0J3MgU0VUIFNTSCBjb21tYW5kcy4gIFRoZSBjb25maWd1cmF0aW9uIGZpbGUiLAorIiAgd291bGQgYmUgbG9jYXRlZCBhdCBcXHYoaG9tZSlzc2gvc3NoX2NvbmZpZy4gIFRoZSBkZWZhdWx0IGlzIE9GRi4iLAorIiAiLAorIlNFVCBTU0ggVjEgQ0lQSEVSIHsgM0RFUywgQkxPV0ZJU0gsIERFUyB9IiwKKyIgIFNwZWNpZmllcyB3aGljaCBjaXBoZXIgc2hvdWxkIGJlIHVzZWQgdG8gcHJvdGVjdCBTU0ggdmVyc2lvbiAxIiwKKyIgIGNvbm5lY3Rpb25zLiAgVGhlIGRlZmF1bHQgaXMgM0RFUy4iLAorIiAiLAorIlNFVCBTU0ggVjEgR0xPQkFMLUtOT1dOLUhPU1RTLUZJTEUgZmlsZW5hbWUiLAorIiAgU3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3lzdGVtLXdpZGUga25vd24taG9zdHMgZmlsZS4gIFRoZSIsCisiICBkZWZhdWx0IGlzOiIsCisiICIsCisiICAgIFx2KGNvbW1vbilzc2hfa25vd25faG9zdHMiLAorIiAiLAorIlNFVCBTU0ggVjEgVVNFUi1LTk9XTi1IT1NUUy1GSUxFIGZpbGVuYW1lIiwKKyIgIFNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIHVzZXIta25vd24taG9zdHMtZmlsZS4gIFRoZSBkZWZhdWx0IiwKKyIgIGxvY2F0aW9uIGlzOiIsCisiICIsCisiICAgIFxcdihhcHBkYXRhKXNzaC9rbm93bl9ob3N0cyIsCisiICIsCisiU0VUIFNTSCBWMiBBVVRIRU5USUNBVElPTiB7IEVYVEVSTkFMLUtFWVgsIEdTU0FQSSwgSE9TVEJBU0VELCAiLAorIiAgICBLRVlCT0FSRC1JTlRFUkFDVElWRSwgUEFTU1dPUkQsIFBVQktFWSwgU1JQLUdFWC1TSEExIH0gWyAuLi4gXSIsCisiICBTcGVjaWZpZXMgYW4gb3JkZXJlZCBsaXN0IG9mIFNTSCB2ZXJzaW9uIDIgYXV0aGVudGljYXRpb24gbWV0aG9kcyB0byIsCisiICBiZSB1c2VkIHdoZW4gY29ubmVjdGluZyB0byB0aGUgcmVtb3RlIGhvc3QuICBUaGUgZGVmYXVsdCBsaXN0IGlzOiIsCisiICIsCisiICAgIGV4dGVybmFsLWtleXggZ3NzYXBpIGhvc3RiYXNlZCBwdWJsaWNrZXkgc3JwLWdleC1zaGExIHB1YmxpY2tleSIsCisiICAgIGtleWJvYXJkLWludGVyYWN0aXZlIHBhc3N3b3JkIG5vbmUiLAorIiAiLAorIlNFVCBTU0ggVjIgQVVUTy1SRUtFWSB7IE9OLCBPRkYgfSIsCisiICBTcGVjaWZpZXMgd2hldGhlciBLZXJtaXQgYXV0b21hdGljYWxseSBpc3N1ZXMgcmVrZXlpbmcgcmVxdWVzdHMiLAorIiAgb25jZSBhbiBob3VyIHdoZW4gU1NIIHZlcnNpb24gMiBpbiBpbiB1c2UuICBUaGUgZGVmYXVsdCBpcyBPTi4iLAorIiAiLAorIlNFVCBTU0ggVjIgQ0lQSEVSUyB7IDNERVMtQ0JDLCBBRVMxMjgtQ0JDIEFFUzE5Mi1DQkMgQUVTMjU2LUNCQyIsCisiICAgICBBUkNGT1VSIEJMT1dGSVNILUNCQyBDQVNUMTI4LUNCQyBSSUpOREFFTDEyOC1DQkMgUklKTkRBRUwxOTItQ0JDIiwKKyIgICAgIFJJSk5EQUVMMjU2LUNCQyB9IiwKKyIgIFNwZWNpZmllcyBhbiBvcmRlcmVkIGxpc3Qgb2YgU1NIIHZlcnNpb24gY2lwaGVycyB0byBiZSB1c2VkIHRvIGVuY3J5cHQiLAorIiAgdGhlIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24uICBUaGUgZGVmYXVsdCBsaXN0IGlzOiIsCisiICIsCisiICAgIGFlczEyOC1jYmMgM2Rlcy1jYmMgYmxvd2Zpc2gtY2JjIGNhc3QxMjgtY2JjIGFyY2ZvdXIgYWVzMTkyLWNiYyIsCisiICAgIGFlczI1Ni1jYmMiLAorIiAiLAorIiAgXCJyaWpuZGFlbFwiIGlzIGFuIGFsaWFzIGZvciBcImFlc1wiLiIsCisiICIsCisiU0VUIFNTSCBWMiBHTE9CQUwtS05PV04tSE9TVFMtRklMRSBmaWxlbmFtZSIsCisiICBTcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeXN0ZW0td2lkZSBrbm93bi1ob3N0cyBmaWxlLiAgVGhlIGRlZmF1bHQiLAorIiAgbG9jYXRpb24gaXM6IiwKKyIgIiwKKyIgICAgXFx2KGNvbW1vbilzc2gva25vd25faG9zdHMyIiwKKyIgIiwKKyJTRVQgU1NIIFYyIEhPU1RLRVktQUxHT1JJVEhNUyB7IFNTSC1EU1MsIFNTSC1SU0EgfSIsCisiICBTcGVjaWZpZXMgYW4gb3JkZXJlZCBsaXN0IG9mIGhvc3RrZXkgYWxnb3JpdGhtcyB0byBiZSB1c2VkIHRvIHZlcmlmeSIsCisiICB0aGUgaWRlbnRpdHkgb2YgdGhlIGhvc3QuICBUaGUgZGVmYXVsdCBsaXN0IGlzIiwKKyIgIiwKKyIgICAgc3NoLXJzYSBzc2gtZHNzIiwKKyIgIiwKKyJTRVQgU1NIIFYyIE1BQ1MgeyBITUFDLU1ENSBITUFDLU1ENS05NiBITUFDLVJJUEVNRDE2MCBITUFDLVNIQTEiLAorIiAgICAgSE1BQy1TSEExLTk2IH0iLAorIiAgU3BlY2lmaWVzIGFuIG9yZGVyZWQgbGlzdCBvZiBNZXNzYWdlIEF1dGhlbnRpY2F0aW9uIENvZGUgYWxnb3JpdGhtcyB0byIsCisiICBiZSB1c2VkIGZvciBpbnRlZ3JpdHkgIHByb3RlY3Rpb24gb2YgdGhlIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24uICBUaGUiLAorIiAgZGVmYXVsdCBsaXN0IGlzOiIsCisiICIsCisiICAgIGhtYWMtbWQ1IGhtYWMtc2hhMSBobWFjLXJpcGVtZDE2MCBobWFjLXNoYTEtOTYgaG1hYy1tZDUtOTYiLAorIiAiLAorIlNFVCBTU0ggVjIgVVNFUi1LTk9XTi1IT1NUUy1GSUxFIGZpbGVuYW1lIiwKKyIgIFNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIHVzZXIta25vd24taG9zdHMgZmlsZS4gIFRoZSBkZWZhdWx0IiwKKyIgIGxvY2F0aW9uIGlzOiIsCisiICIsCisiICAgIFxcdihhcHBkYXRhKXNzaC9rbm93bl9ob3N0czIiLAorIiAiLAorIlNFVCBTU0ggVkVSQk9TRSBsZXZlbCIsCisiICBTcGVjaWZpZXMgaG93IG1hbnkgbWVzc2FnZXMgc2hvdWxkIGJlIGdlbmVyYXRlZCBieSB0aGUgT3BlblNTSCBlbmdpbmUuIiwKKyIgIFRoZSBsZXZlbCBjYW4gcmFuZ2UgZnJvbSAwIHRvIDcuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAyLiIsCisiICIsCisiU0VUIFNTSCBWRVJTSU9OIHsgMSwgMiwgQVVUT01BVElDIH0iLAorIiAgU3BlY2lmaWVzIHdoaWNoIFNTSCB2ZXJzaW9uIHNob3VsZCBiZSBuZWdvdGlhdGVkLiAgVGhlIGRlZmF1bHQgaXMiLAorIiAgQVVUT01BVElDIHdoaWNoIG1lYW5zIHVzZSB2ZXJzaW9uIDIgaWYgc3VwcG9ydGVkOyBvdGhlcndpc2UgdG8gZmFsbCIsCisiICBiYWNrIHRvIHZlcnNpb24gMS4iLAorIiAiLAorIlNFVCBTU0ggWDExLUZPUldBUkRJTkcgeyBPTiwgT0ZGIH0iLAorIiAgU3BlY2lmaWVzIHdoZXRoZXIgWCBXaW5kb3dzIFN5c3RlbSBEYXRhIGlzIHRvIGJlIGZvcndhcmRlZCBhY3Jvc3MgdGhlIiwKKyIgIGVzdGFibGlzaGVkIFNTSCBjb25uZWN0aW9uLiAgVGhlIGRlZmF1bHQgaXMgT0ZGLiAgV2hlbiBPTiwgdGhlIERJU1BMQVkiLAorIiAgdmFsdWUgaXMgZWl0aGVyIHNldCB1c2luZyB0aGUgU0VUIFRFTE5FVCBFTlYgRElTUExBWSBjb21tYW5kIG9yIHJlYWQiLAorIiAgZnJvbSB0aGUgRElTUExBWSBlbnZpcm9ubWVudCB2YXJpYWJsZS4iLAorIiAiLAorIlNFVCBTU0ggWEFVVEgtTE9DQVRJT04gZmlsZW5hbWUiLAorIiAgU3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgeGF1dGggZXhlY3V0YWJsZSAoaWYgcHJvdmlkZWQgd2l0aCB0aGUiLAorIiAgWDExIFNlcnZlciBzb2Z0d2FyZS4pIiwKKyNlbHNlICAvKiBTU0hCVUlMVElOICovCisiU3ludGF4OiBTRVQgU1NIIENPTU1BTkQgY29tbWFuZCIsCisiICBTcGVjaWZpZXMgdGhlIGV4dGVybmFsIGNvbW1hbmQgdG8gYmUgdXNlZCB0byBtYWtlIGFuIFNTSCBjb25uZWN0aW9uLiIsCisiICBCeSBkZWZhdWx0IGl0IGlzIFwic3NoIC1lIG5vbmVcIiAoc3NoIHdpdGggbm8gZXNjYXBlIGNoYXJhY3RlcikuIiwKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisiIgorfTsKKyNlbmRpZiAvKiBBTllTU0ggKi8KKworI2lmZGVmIE5FV0ZUUAorc3RhdGljIGNoYXIgKmhteHlncHJbXSA9IHsKKyJTeW50YXg6IFNFVCBHRVQtUFVULVJFTU9URSB7IEFVVE8sIEZUUCwgS0VSTUlUfSIsCisiICBUZWxscyBLZXJtaXQgd2hldGhlciBHRVQsIFBVVCwgYW5kIFJFTU9URSBjb21tYW5kcyBzaG91bGQgYmUgZGlyZWN0ZWQiLAorIiAgYXQgYSBLZXJtaXQgc2VydmVyIG9yIGFuIEZUUCBzZXJ2ZXIuICBUaGUgZGVmYXVsdCBpcyBBVVRPLCBtZWFuaW5nIHRoYXQiLAorIiAgaWYgeW91IGhhdmUgb25seSBvbmUgYWN0aXZlIGNvbm5lY3Rpb24sIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gaXMgdGFrZW4iLAorIiAgd2hlbiB5b3UgZ2l2ZSBhIEdFVCwgUFVULCBvciBSRU1PVEUgY29tbWFuZC4gIFNFVCBHRVQtUFVULVJFTU9URSBGVFAgZm9yY2VzIgorLAorIiAgS2VybWl0IHRvIHRyZWF0IEdFVCwgUFVULCBhbmQgUkVNT1RFIGFzIEZUUCBjbGllbnQgY29tbWFuZHM7IHNldHRpbmcgdGhpcyIsCisiICB0byBLRVJNSVQgZm9yY2VzIHRoZXNlIGNvbW1hbmRzIHRvIGJlIHRyZWF0ZWQgYXMgS2VybWl0IGNsaWVudCBjb21tYW5kcy4iLAorIiAgTk9URTogUFVUIGluY2x1ZGVzIFNFTkQsIE1QVVQsIE1TRU5ELCBhbmQgYWxsIG90aGVyIHNpbWlsYXIgY29tbWFuZHMuIiwKKyIgIEFsc28gc2VlIEhFTFAgUkVNT1RFLCBIRUxQIFNFVCBMT0NVUywgSEVMUCBGVFAuIiwKKyIiCit9OworI2VuZGlmIC8qIE5FV0ZUUCAqLworCisjaWZkZWYgTE9DVVMKK3N0YXRpYyBjaGFyICpobXh5bG9jdXNbXSA9IHsKKyNpZmRlZiBLVUkKKyJTeW50YXg6IFNFVCBMT0NVUyB7IEFTSywgQVVUTywgTE9DQUwsIFJFTU9URSB9IiwKKyNlbHNlCisiU3ludGF4OiBTRVQgTE9DVVMgeyBBVVRPLCBMT0NBTCwgUkVNT1RFIH0iLAorI2VuZGlmIC8qIEtVSSAqLworIiAgU3BlY2lmaWVzIHdoZXRoZXIgdW5wcmVmaXhlZCBmaWxlIG1hbmFnZW1lbnQgY29tbWFuZHMgc2hvdWxkIG9wZXJhdGUiLAorIiAgbG9jYWxseSBvciAod2hlbiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgRlRQIG9yIEtlcm1pdCIsCisiICBzZXJ2ZXIpIHNlbnQgdG8gdGhlIHNlcnZlci4gIFRoZSBhZmZlY3RlZCBjb21tYW5kcyBhcmU6IENEIChDV0QpLCBQV0QsIiwKKyIgIENEVVAsIERJUkVDVE9SWSwgREVMRVRFLCBSRU5BTUUsIE1LRElSLCBhbmQgUk1ESVIuICBUbyBmb3JjZSBhbnkgb2YiLAorIiAgdGhlc2UgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgbG9jYWxseSwgZ2l2ZSBpdCBhbiBMLXByZWZpeDogTENELCBMRElSLCIsCisiICBldGMuICBUbyBmb3JjZSByZW1vdGUgZXhlY3V0aW9uLCB1c2UgdGhlIFItcHJlZml4OiBSQ0QsIFJESVIsIGFuZCBzbyIsCisiICBvbi4gIFNIT1cgQ09NTUFORCBzaG93cyB0aGUgY3VycmVudCBMb2N1cy4iLAorIiAiLAorIiAgQnkgZGVmYXVsdCwgdGhlIExvY3VzIGZvciBmaWxlIG1hbmFnZW1lbnQgY29tbWFuZHMgaXMgc3dpdGNoZWQiLAorIiAgYXV0b21hdGljYWxseSB3aGVuZXZlciB5b3UgbWFrZSBvciBjbG9zZSBhIGNvbm5lY3Rpb246IGlmIHlvdSBtYWtlIGFuIiwKKyIgIEZUUCBjb25uZWN0aW9uLCB0aGUgTG9jdXMgYmVjb21lcyBSRU1PVEU7IGlmIHlvdSBjbG9zZSBhbiBGVFAgY29ubmVjdGlvbiIsCisiICBvciBtYWtlIGFueSBvdGhlciBraW5kIG9mIGNvbm5lY3Rpb24sIHRoZSBMb2N1cyBiZWNvbWVzIExPQ0FMLiIsCisjaWZkZWYgS1VJCisiICIsCisiICBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGF1dG9tYXRpYyBzd2l0Y2hpbmc6IEFTSyAodGhlIGRlZmF1bHQpIHdoaWNoIiwKKyIgIGFza3MgeW91IGlmIGl0J3MgT0sgdG8gc3dpdGNoLCBhbmQgQVVUTywgd2hpY2ggc3dpdGNoZXMgd2l0aG91dCBhc2tpbmcuIiwKKyNlbmRpZiAvKiBLVUkgKi8KKyIgIiwKKyIgIElmIHlvdSBnaXZlIGEgU0VUIExPQ1VTIExPQ0FMIG9yIFNFVCBMT0NVUyBSRU1PVEUgY29tbWFuZCwgdGhpcyBzZXRzIiwKKyIgIHRoZSBsb2N1cyBhcyBpbmRpY2F0ZWQgYW5kIGRpc2FibGVzIGF1dG9tYXRpYyBzd2l0Y2hpbmcuIiwKKyNpZmRlZiBLVUkKKyIgIFNFVCBMT0NVUyBBVVRPIG9yIFNFVCBMT0NVUyBBU0sgcmVzdG9yZXMgYXV0b21hdGljIHN3aXRjaGluZy4iLAorIiAgWW91IGNhbiBhbHNvIGNoYW5nZSBMb2N1cyBzd2l0Y2hpbmcgYW5kIGJlaGF2aW9yIGluIHRoZSBBY3Rpb25zIG1lbnUuIiwKKyNlbHNlCisiICBTRVQgTE9DVVMgQVVUTyByZXN0b3JlcyBhdXRvbWF0aWMgc3dpdGNoaW5nLiIsCisjZW5kaWYgLyogS1VJICovCisiIiwKK307CisjZW5kaWYgLyogTE9DVVMgKi8KKworc3RhdGljIGNoYXIgKmhteHh0YWtbXSA9IHsKKyJTeW50YXg6IFRBS0UgZmlsZW5hbWUgWyBhcmd1bWVudHMgXSIsCisiICBUZWxscyBLZXJtaXQgdG8gZXhlY3V0ZSBjb21tYW5kcyBmcm9tIHRoZSBuYW1lZCBmaWxlLiAgT3B0aW9uYWwgYXJndW1lbnQiLAorIiAgd29yZHMsIGFyZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIHRvIHRoZSBtYWNybyBhcmd1bWVudCB2YXJpYWJsZXMgXFwlMSIsCisiICB0aHJvdWdoIFxcJTkuICBLZXJtaXQgY29tbWFuZCBmaWxlcyBtYXkgdGhlbXNlbHZlcyBjb250YWluIFRBS0UgY29tbWFuZHMsIiwKKyIgIHVwIHRvIGFueSByZWFzb25hYmxlIGRlcHRoIG9mIG5lc3RpbmcuIiwKKyIiCit9OworCisjaWZkZWYgVENQU09DS0VUCitzdGF0aWMgY2hhciAqaG14eGZpcmV3W10gPSB7CisjaWZkZWYgT1MyCisiRmlyZXdhbGwgVHJhdmVyc2FsIGluIEtlcm1pdCA5NSIsCisjZWxzZQorIkZpcmV3YWxsIFRyYXZlcnNhbCBpbiBDLUtlcm1pdCIsCisjZW5kaWYKKyIgIiwKKyNpZm5kZWYgTkVXRlRQCisjaWZuZGVmIENLSFRUUAorI2lmbmRlZiBDS19TT0NLUworI2RlZmluZSBOT0ZJUkVXQUxMCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgTk9GSVJFV0FMTAorIlRoaXMgdmVyc2lvbiBvZiBLZXJtaXQgd2FzIGJ1aWx0IHdpdGggbm8gc3VwcG9ydCBmb3IgZmlyZXdhbGwgdHJhdmVyc2FsIiwKKyJwcm90b2NvbHMuICBLZXJtaXQgY2FuIGJlIGJ1aWx0IHdpdGggc3VwcG9ydCBmb3IgSFRUUCBQcm94eSBTZXJ2ZXJzLCIsCisiU09DS1MgYXV0aG9yaXplZCBmaXJld2FsbCB0cmF2ZXJzYWwsIGFuZCBGVFAgUGFzc2l2ZSBjb25uZWN0aW9uIG1vZGVzLiIsCisiICIsCisjZWxzZSAvKiBOT0ZJUkVXQUxMICovCisjaWZkZWYgQ0tIVFRQCisiVGhlIHNpbXBsaXN0IGZvcm0gb2YgZmlyZXdhbGwgdHJhdmVyc2FsIGlzIHRoZSBIVFRQIENPTk5FQ1QgY29tbWFuZC4gVGhlIiwKKyJDT05ORUNUIGNvbW1hbmQgd2FzIGltcGxlbWVudGVkIHRvIGFsbG93IGEgcHVibGljIHdlYiBzZXJ2ZXIgd2hpY2ggdXN1YWxseSIsCisicmVzaWRlcyBvbiB0aGUgYm91bmRhcnkgYmV0d2VlbiB0aGUgcHVibGljIGFuZCBwcml2YXRlIG5ldHdvcmtzIHRvIGZvcndhcmQiLAorIkhUVFAgcmVxdWVzdHMgZnJvbSBjbGllbnRzIG9uIHRoZSBwcml2YXRlIG5ldHdvcmsgdG8gcHVibGljIHdlYiBzaXRlcy4gIFRvIiwKKyJhbGxvdyBzZWN1cmUgd2ViIGNvbm5lY3Rpb25zLCB0aGUgSFRUUCBDT05ORUNUIGNvbW1hbmQgYXV0aGVudGljYXRlcyB0aGUiLAorImNsaWVudCB3aXRoIGEgdXNlcm5hbWUvcGFzc3dvcmQgYW5kIHRoZW4gZXN0YWJsaXNoZXMgYSB0dW5uZWwgdG8gdGhlIiwKKyJkZXNpcmVkIGhvc3QuIiwKKworIiAiLAorCisiV2ViIHNlcnZlcnMgdGhhdCBzdXBwb3J0IHRoZSBDT05ORUNUIGNvbW1hbmQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYWxsb3ciLAorIm91dGJvdW5kIGNvbm5lY3Rpb25zIGZvciBhdXRoZW50aWNhdGVkIHVzZXJzIHRvIGFueSBUQ1AvSVAgaG9zdG5hbWUtcG9ydCIsCisiY29tYmluYXRpb24gYWNjZXNzaWJsZSB0byB0aGUgV2ViIHNlcnZlci4gIEhUVFAgQ09OTkVDVCBjYW4gYmUgdXNlZCBvbmx5IiwKKyJ3aXRoIFRDUC1iYXNlZCBwcm90b2NvbHMuICBQcm90b2NvbHMgc3VjaCBhcyBLZXJiZXJvcyBhdXRoZW50aWNhdGlvbiB0aGF0IiwKKyJ1c2UgVURQL0lQIGNhbm5vdCBiZSB0dW5uZWxlZCB1c2luZyBIVFRQIENPTk5FQ1QuIiwKKworIiAiLAorCisiU0VUIFRDUCBIVFRQLVBST1hZIFtzd2l0Y2hlc10gWzxob3N0bmFtZSBvciBpcC1hZGRyZXNzPls6PHBvcnQ+XV0iLAorIiAgSWYgYSBob3N0bmFtZSBvciBpcC1hZGRyZXNzIGlzIHNwZWNpZmllZCwgS2VybWl0IHVzZXMgdGhlIGdpdmVuIiwKKyIgIHByb3h5IHNlcnZlciB3aGVuIGF0dGVtcHRpbmcgb3V0Z29pbmcgVENQIGNvbm5lY3Rpb25zLiAgSWYgbm8gaG9zdG5hbWVyIiwKKyIgIG9yIGlwLWFkZHJlc3MgaXMgc3BlY2lmaWVkLCBhbnkgcHJldmlvdXNseSBzcGVjaWZpZWQgUHJveHkgc2VydmVyIGlzIiwKKyIgIHJlbW92ZWQuICBJZiBubyBwb3J0IG51bWJlciBpcyBzcGVjaWZpZWQsIHRoZSBcImh0dHBcIiBzZXJ2aWNlIGlzIHVzZWQuIiwKKyIgIFtzd2l0Y2hlc10gY2FuIGJlIG9uZSBvciBtb3JlIG9mOiIsCisiICAgICAvQUdFTlQ6PGFnZW50PiAvVVNFUjo8dXNlcj4gL1BBU1NXT1JEOjxwYXNzd29yZD4iLAorIiAgU3dpdGNoIHBhcmFtZXRlcnMgYXJlIHVzZWQgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBwcm94eSBzZXJ2ZXIgYW5kIiwKKyIgIG92ZXJyaWRlIGFueSBvdGhlciB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25uZWN0aW9uLiIsCisiICIsCisKKyNlbmRpZiAvKiBDS0hUVFAgKi8KKyNpZmRlZiBDS19TT0NLUworCisiSW4gdGhlIGVhcmx5IDE5OTBzIGFzIGZpcmV3YWxscyB3ZXJlIGJlY29taW5nIHByZXZhbGVudCwgRGF2aWQgS29ibGFzIiwKKyJkZXZlbG9wZWQgdGhlIFNPQ0tTIHByb3RvY29sIGZvciBUQ1AvSVAgZmlyZXdhbGwgdHJhdmVyc2FsLiAgVHdvIHZlcnNpb25zIiwKKyJvZiBTT0NLUyBhcmUgY3VycmVudGx5IGluIHVzZTogVmVyc2lvbiA0LjIgbGV0cyBUQ1AvSVAgY2xpZW50IGFwcGxpY2F0aW9ucyIsCisidHJhdmVyc2UgZmlyZXdhbGxzLCBzaW1pbGFyIHRvIEhUVFAgQ09OTkVDVCwgZXhjZXB0IHRoYXQgdGhlIFNPQ0tTIGNsaWVudCIsCisiaXMgYXdhcmUgb2YgdGhlIHB1YmxpYyBzb3VyY2UgSVAgYWRkcmVzcyBhbmQgcG9ydCwgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aGluIiwKKyJ0aGUgYXBwbGljYXRpb24gcHJvdG9jb2wgdG8gYXNzaXN0IGluIHNlY3VyaW5nIHRoZSBjb25uZWN0aW9uIChlLmcuIEZUUCIsCisic2Vzc2lvbnMgc2VjdXJlZCB3aXRoIEdTU0FQSSBLZXJiZXJvcyA1KS4iLAorCisiICIsCisKKyJJbiAxOTk1IHRoZSBJRVRGIGlzc3VlZCBTT0NLUyBQcm90b2NvbCBWZXJzaW9uIDUgKFJGQyAxOTI4KSwgd2hpY2ggaXMiLAorInNpZ25pZmljYW50bHkgbW9yZSBnZW5lcmFsIHRoYW4gdmVyc2lvbiA0LiAgQmVzaWRlcyBzdXBwb3J0aW5nIGNsaWVudC0iLAorInRvLXNlcnZlciBUQ1AvSVAgY29ubmVjdGlvbnMsIGl0IGFsc28gaW5jbHVkZXM6IiwKKworIiAiLAorIiAuIEF1dGhlbnRpY2F0ZWQgZmlyZXdhbGwgdHJhdmVyc2FsIG9mIFVEUC9JUCBwYWNrZXRzLiIsCisiIC4gQXV0aGVudGljYXRlZCBiaW5kaW5nIG9mIGluY29taW5nIHB1YmxpYyBwb3J0cyBvbiB0aGUgZmlyZXdhbGwuIiwKKyIgIiwKKworIlRoaXMgbGV0cyBhIHNlcnZpY2Ugb24gdGhlIHByaXZhdGUgbmV0d29yayBvZmZlciBwdWJsaWMgc2VydmljZXMuICBJdCBhbHNvIiwKKyJsZXRzIGNsaWVudCBhcHBsaWNhdGlvbnMgbGlrZSBGVFAgZXN0YWJsaXNoIGEgdGVtcG9yYXJ5IHB1YmxpYyBwcmVzZW5jZSIsCisidGhhdCBjYW4gYmUgdXNlZCBieSB0aGUgRlRQIHNlcnZlciB0byBjcmVhdGUgYSBkYXRhIGNoYW5uZWwuICBCeSBhbGxvd2luZyIsCisidGhlIGNsaWVudCB0byBiaW5kIHRvIGEgcHVibGljIHBvcnQgb24gdGhlIGZpcmV3YWxsIGFuZCBiZSBhd2FyZSBvZiB0aGUiLAorInB1YmxpYyBhZGRyZXNzLCBTT0NLUyA1IGxldHMgdGhlIGFwcGxpY2F0aW9uIHByb3RvY29sIGNvbW11bmljYXRlIHRoaXMiLAorImluZm9ybWF0aW9uIHRvIHRoZSBzZXJ2ZXIuIiwKKworIiAiLAorCisjaWZkZWYgT1MyCisjaWZkZWYgTlQKKyJLZXJtaXQgOTUgc3VwcG9ydHMgU09DS1MgNC4yLiAgVGhlIFNPQ0tTIFNlcnZlciBpcyBzcGVjaWZpZWQgd2l0aDoiLAorIiAiLAorIiAgU0VUIFRDUCBTT0NLUy1TRVJWRVIgaG9zdG5hbWUvaXAtYWRkcmVzcyIsCisiICIsCisiVGhlIFNPQ0tTLkNPTkYgZmlsZSBpcyBmb3VuZCBieSBleGFtaW5pbmcgdGhlIEVUQyBlbnZpcm9ubWVudCB2YXJpYWJsZTsiLAorInNlYXJjaGluZyBpbiBcXFdJTkRPV1Mgb24gV2luZG93cyA5NS85OC9NRTsgb3IgdGhlIiwKKyJcXFdJTkRPV1NcXFNZU1RFTVxcRFJJVkVSU1xcRVRDIGRpcmVjdG9yeSBvbiBOVFxcMjAwMFxcWFAgc3lzdGVtcy4iLAorCisjZWxzZSAvKiBOVCAqLworCisiS2VybWl0LzIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgU09DS1MgNC4yIHNlcnZlcnMgd2hlbiB1c2luZyBJQk0gVENQL0lQIDIuMCwiLAorIklCTSBPUy8yIFdBUlAsIG9yIGEgY29tcGF0aWJsZSBwcm90b2NvbCBzdGFjay4gU09DS1MgaXMgb25lIHBvcHVsYXIgbWVhbnMiLAorIm9mIGltcGxlbWVudGluZyBhIGZpcmV3YWxsIGJldHdlZW4gYSBwcml2YXRlIG5ldHdvcmsgYW5kIHRoZSBJbnRlcm5ldC4iLAorIiAiLAorIktlcm1pdC8yIHNoYXJlcyB0aGUgc2FtZSBTT0NLUyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgSUJNIEdvcGhlci4gSXQgYWxzbyIsCisic3VwcG9ydHMgdGhlIHVzZSBvZiBsb2NhbCBTT0NLUyBjb25maWd1cmF0aW9uIGZpbGVzLiIsCisiICIsCisiVG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBTT0NLUyBTZXJ2ZXIsIGFkZCBTRVQgU09DS1NfU0VSVkVSPSB0byB5b3VyIiwKKyJDT05GSUcuU1lTIGZpbGUuIiwKKyIgIiwKKyJJZiB5b3UgbXVzdCB1c2UgYSBTT0NLUyBEaXN0cmlidXRlZCBOYW1lIFNlcnZlciwgYWRkIFNFVCBTT0NLU19OUz0gdG8geW91ciIsCisiQ09ORklHLlNZUyBmaWxlLiIsCisiICIsCisKKyJJZiB5b3UgbXVzdCB1c2UgYSBzcGVjaWZpYyB3aXRoIHlvdXIgU09DS1Mgc2VydmVyLCBiZSBzdXJlIHRvIGFkZCBTRVQgVVNFUj0iLAorInRvIHlvdXIgQ09ORklHLlNZUyBmaWxlLiBPdGhlcndpc2UsIFwib3MydXNlclwiIGlzIHVzZWQgYnkgZGVmYXVsdC4iLAorCisiICIsCisKKyJUaGUgU09DS1MgY29uZmlndXJhdGlvbiBmaWxlIG11c3QgYmUgcGxhY2VkIGluIHRoZSBkaXJlY3RvcnkgcG9pbnRlZCB0byBieSIsCisidGhlIEVUQyBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBkZWNsYXJlZCBpbiB5b3VyIENPTkZJRy5TWVMgZmlsZS4gVGhlIG5hbWUiLAorInNob3VsZCBiZSBTT0NLUy5DT05GLiBPbiBhIEZBVCBmaWxlIHN5c3RlbSwgdXNlIFNPQ0tTLkNORi4iLAorCisiICIsCisiVGhlIGZvcm1hdCBvZiB0aGUgbGluZXMgaW4gdGhlIFNPQ0tTIGNvbmZpZ3VyYXRpb24gZmlsZSBhcmUgYXMgZm9sbG93czoiLAorIiAiLAorIiAuICMgY29tbWVudHMiLAorIiAuIGRlbnkgWyo9dXNlcmxpc3RdIGRzdF9hZGRyIGRzdF9tYXNrIFtvcCBwb3J0XSIsCisiIC4gZGlyZWN0IFsqPXVzZXJsaXN0XSBkc3RfYWRkciBkc3RfbWFzayBbb3AgcG9ydF0iLAorIiAuIHNvY2tkIFtAPXNlcnZlcmxpc3RdIFsqPXVzZXJsaXN0XSBkc3RfYWRkciBkc3RfbWFzayBbb3AgcG9ydF0iLAorIiAiLAorCisib3AgbXVzdCBiZSBvbmUgb2YgJ2VxJywgJ25lcScsICdsdCcsICdndCcsICdsZScsIG9yICdnZScuIGRzdF9hZGRyLCIsCisiZHN0X21hc2ssIGFuZCBwb3J0IG1heSBiZSBlaXRoZXIgbnVtZXJpYyBvciBuYW1lIGVxdWl2YWxlbnRzLiIsCisKKyIgIiwKKworIktlcm1pdC8yIGlnbm9yZXMgdGhlIFsqPXVzZXJsaXN0XSBhbmQgW0A9c2VydmVybGlzdF0gZmllbGRzLiBNYXRjaGVzIGFyZSIsCisiZGV0ZXJtaW5lZCBvbiBhIGZpcnN0IG1hdGNoIG5vdCBhIGJlc3QgbWF0Y2ggYmFzaXMuIEFkZHJlc3NlcyBmb3Igd2hpY2ggbm8iLAorIm1hdGNoIGlzIGZvdW5kIGRlZmF1bHQgdG8gXCJzb2NrZFwiLiIsCisKKyIgIiwKKworIkZvciBjb21wbGV0ZW5lc3M6IEZpZWxkcyBpbiBzcXVhcmUgYnJhY2tldHMgYXJlIG9wdGlvbmFsLiBUaGUgb3B0aW9uYWwiLAorIkA9c2VydmVybGlzdCBmaWVsZCB3aXRoIGEgJ3NvY2tkJyBsaW5lIHNwZWNpZmllcyB0aGUgbGlzdCBvZiBTT0NLUyBzZXJ2ZXJzIiwKKyJ0aGUgY2xpZW50IHNob3VsZCB0cnkgKGluIHRoZSBnaXZlbiBvcmRlcikgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBTT0NLUyIsCisic2VydmVyLiBJZiB0aGUgQD1zZXJ2ZXJsaXN0IHBhcnQgaXMgb21pdHRlZCwgdGhlbiB0aGUgZGVmYXVsdCBTT0NLUyBzZXJ2ZXIiLAorImlzIHVzZWQuICBDb21tYXMgYXJlIHVzZWQgaW4gdGhlIHVzZXJsaXN0IGFuZCBzZXJ2ZXJsaXN0IGFzIHNlcGFyYXRvcnMsIG5vIiwKKyJ3aGl0ZSBzcGFjZXMgYXJlIGFsbG93ZWQuIiwKKworI2VuZGlmIC8qIE5UICovCisKKyIgIiwKKworI2Vsc2UgLyogT1MyICovCisjaWZkZWYgQ0tfU09DS1M1CisiVGhpcyB2ZXJzaW9uIG9mIEMtS2VybWl0IHN1cHBvcnRzIFNPQ0tTIHZlcnNpb24gNS4iLAorI2Vsc2UgLyogQ0tfU09DS1M1ICovCisiVGhpcyB2ZXJzaW9uIG9mIEMtS2VybWl0IHN1cHBvcnRzIFNPQ0tTIHZlcnNpb24gNC4iLAorI2VuZGlmIC8qIENLX1NPQ0tTNSAqLworCisiU2VlIHRoZSBtYW4gcGFnZSAob3Igb3RoZXIgc3lzdGVtIGRvY3VtZW50YXRpb24pIGZvciBpbmZvcm1hdGlvbiBvbiIsCisiY29uZmlndXJpbmcgdGhlIFNPQ0tTIGxpYnJhcnkgdmlhIHRoZSAvZXRjL3NvY2tzLmNvbmYgZmlsZS4iLAorCisjZW5kaWYgLyogT1MyICovCisiICIsCisjZW5kaWYgLyogQ0tfU09DS1MgKi8KKworI2lmZGVmIE5FV0ZUUAorCisiRlRQIGlzIG9uZSBvZiB0aGUgZmV3IHdlbGwta25vd24gSW50ZXJuZXQgc2VydmljZXMgdGhhdCByZXF1aXJlcyIsCisibXVsdGlwbGUgY29ubmVjdGlvbnMuICBBcyBkZXNjcmliZWQgYWJvdmUsIEZUUCBvcmlnaW5hbGx5IHJlcXVpcmVkIHRoZSIsCisic2VydmVyIHRvIGVzdGFibGlzaCB0aGUgZGF0YSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgdXNpbmcgYSBkZXN0aW5hdGlvbiIsCisiYWRkcmVzcyBhbmQgcG9ydCBwcm92aWRlZCBieSB0aGUgY2xpZW50LiAgVGhpcyBkb2Vzbid0IHdvcmsgd2l0aCBwb3J0IiwKKyJmaWx0ZXJpbmcgZmlyZXdhbGxzLiIsCisKKyIgIiwKKworIkxhdGVyLCBGVFAgcHJvdG9jb2wgYWRkZWQgYSBcInBhc3NpdmVcIiBtb2RlLCBpbiB3aGljaCBjb25uZWN0aW9ucyBmb3IiLAorInRoZSBkYXRhIGNoYW5uZWxzIGFyZSBjcmVhdGVkIGluIHRoZSByZXZlcnNlIGRpcmVjdGlvbi4gIEluc3RlYWQgb2YgdGhlIiwKKyJzZXJ2ZXIgZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50LCB0aGUgY2xpZW50IG1ha2VzIGEgc2Vjb25kIiwKKyJjb25uZWN0aW9uIHdpdGggdGhlIHNlcnZlciBhcyB0aGUgZGVzdGluYXRpb24uICBUaGlzIHdvcmtzIGp1c3QgZmluZSBhcyIsCisibG9uZyBhcyB0aGUgY2xpZW50IGlzIGJlaGluZCB0aGUgZmlyZXdhbGwgYW5kIHRoZSBzZXJ2ZXIgaXMgaW4gcHVibGljIiwKKyJhZGRyZXNzIHNwYWNlLiAgSWYgdGhlIHNlcnZlciBpcyBiZWhpbmQgYSBmaXJld2FsbCB0aGVuIHRoZSB0cmFkaXRpb25hbCIsCisiYWN0aXZlIG1vZGUgbXVzdCBiZSB1c2VkLiAgSWYgYm90aCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgYXJlIGJlaGluZCB0aGVpciIsCisib3duIHBvcnQgZmlsdGVyaW5nIGZpcmV3YWxscyB0aGVuIGRhdGEgY2hhbm5lbHMgY2Fubm90IGJlIGVzdGFibGlzaGVkLiIsCisKKyIgIiwKKworIkluIEtlcm1pdCdzIEZUUCBjbGllbnQsIHBhc3NpdmUgbW9kZSBpcyBjb250cm9sbGVkIHdpdGggdGhlIGNvbW1hbmQ6IiwKKworIiAiLAorIiAgU0VUIEZUUCBQQVNTSVZFLU1PREUgeyBPTiwgT0ZGIH0iLAorIiAiLAorCisiVGhlIGRlZmF1bHQgaXMgT04sIG1lYW5pbmcgdG8gdXNlIHBhc3NpdmUgbW9kZS4iLAorCisjZW5kaWYgLyogTkVXRlRQICovCisjZW5kaWYgLyogTk9GSVJFV0FMTCAqLworCisiIgorfTsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworc3RhdGljIGNoYXIgKmhteHhzYXZlW10gPSB7CisiU3ludGF4OiBTQVZFIGl0ZW0gZmlsZW5hbWUgeyBORVcsIEFQUEVORCB9IiwKKyIgIFNhdmVzIHRoZSByZXF1ZXN0ZWQgbWF0ZXJpYWwgaW4gdGhlIGdpdmVuIGZpbGUuICBBIG5ldyBmaWxlIGlzIGNyZWF0ZWQiLAorIiAgYnkgZGVmYXVsdDsgaW5jbHVkZSBBUFBFTkQgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCB0byBhcHBlbmQgdG8gYW4iLAorIiAgZXhpc3RpbmcgZmlsZS4gIEl0ZW1zOiIsCisjaWZuZGVmIE5PU0VUS0VZCisiICAgIEtFWU1BUCAgICAgICAgICAgICAgIFNhdmVzIHRoZSBjdXJyZW50IGtleSBzZXR0aW5ncy4iLAorI2VuZGlmIC8qIE5PU0VUS0VZICovCisjaWZkZWYgQ0tfUkVDQUxMCisiICAgIENPTU1BTkQgSElTVE9SWSAgICAgIFNhdmVzIHRoZSBjdXJyZW50IGNvbW1hbmQgcmVjYWxsIChoaXN0b3J5KSBidWZmZXIiLAorI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworI2lmZGVmIE9TMgorIiAgICBDT01NQU5EIFNDUk9MTEJBQ0sgICBTYXZlcyB0aGUgY3VycmVudCBjb21tYW5kLXNjcmVlbiBzY3JvbGxiYWNrIGJ1ZmZlciIsCisiICAgIFRFUk1JTkFMIFNDUk9MTEJBQ0sgIFNhdmVzIHRoZSBjdXJyZW50IHRlcm1pbmFsLXNjcmVlbiBzY3JvbGxiYWNrIGJ1ZmZlciIsCisjZW5kaWYgLyogT1MyICovCisiIgorfTsKKworI2lmZGVmIENLUk9PVAorc3RhdGljIGNoYXIgKmhteHhjaHJvb3RbXSA9IHsKKyJTeW50YXg6IFNFVCBST09UIGRpcmVjdG9yeW5hbWUiLAorIiAgU2V0cyB0aGUgcm9vdCBmb3IgZmlsZSBhY2Nlc3MgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeSBhbmQgZGlzYWJsZXMgYWNjZXNzIiwKKyIgIHRvIHN5c3RlbSBhbmQgc2hlbGwgY29tbWFuZHMgYW5kIGV4dGVybmFsIHByb2dyYW1zLiAgT25jZSB0aGlzIGNvbW1hbmQiLAorIiAgaXMgZ2l2ZW4sIG5vIGZpbGVzIG9yIGRpcmVjdG9yaWVzIG91dHNpZGUgdGhlIHRyZWUgcm9vdGVkIGJ5IHRoZSBnaXZlbiIsCisiICBkaXJlY3RvcnkgY2FuIGJlIG9wZW5lZCwgcmVhZCwgbGlzdGVkLCBkZWxldGVkLCByZW5hbWVkLCBvciBhY2Nlc3NlZCBpbiIsCisiICBhbnkgb3RoZXIgd2F5LiAgVGhpcyBjb21tYW5kIGNhbiBub3QgYmUgdW5kb25lIGJ5IGEgc3Vic2VxdWVudCBTRVQgUk9PVCIsCisiICBjb21tYW5kLiAgUHJpbWFyaWx5IGZvciB1c2Ugd2l0aCBzZXJ2ZXIgbW9kZSwgdG8gcmVzdHJpY3QgYWNjZXNzIG9mIiwKKyIgIGNsaWVudHMgdG8gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSB0cmVlLiAgU3lub255bTogQ0hST09ULiIsCisiIgorfTsKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworc3RhdGljIGNoYXIgKmhteHhzY3JuW10gPSB7CisiU3ludGF4OiBTQ1JFRU4geyBDTEVBUiwgQ0xFT0wsIE1PVkUgcm93IGNvbHVtbiB9IiwKKyNpZmRlZiBPUzIKKyIgIFBlcmZvcm1zIHNjcmVlbi1mb3JtYXR0aW5nIGFjdGlvbnMuIiwKKyNlbHNlCisiICBQZXJmb3JtcyBzY3JlZW4tZm9ybWF0dGluZyBhY3Rpb25zLiAgQ29ycmVjdCBvcGVyYXRpb24gb2YgdGhlc2UgY29tbWFuZHMiLAorIiAgZGVwZW5kcyBvbiBwcm9wZXIgdGVybWluYWwgc2V0dXAgb24gYm90aCBlbmRzIG9mIHRoZSBjb25uZWN0aW9uIC0tIG1haW5seSIsCisiICB0aGF0IHRoZSBob3N0IHRlcm1pbmFsIHR5cGUgaXMgc2V0IHRvIGFncmVlIHdpdGggdGhlIGtpbmQgb2YgdGVybWluYWwgb3IiLAorIiAgdGhlIGVtdWxhdGlvbiB5b3UgYXJlIHZpZXdpbmcgQy1LZXJtaXQgdGhyb3VnaC4iLAorI2VuZGlmIC8qIE9TMiAqLworIiAiLAorIlNDUkVFTiBDTEVBUiIsCisiICBNb3ZlcyB0aGUgY3Vyc29yIHRvIGhvbWUgcG9zaXRpb24gYW5kIGNsZWFycyB0aGUgZW50aXJlIHNjcmVlbi4iLAorI2lmZGVmIE9TMgorIiAgU3lub255bXM6IENMUywgQ0xFQVIgU0NSRUVOLCBDTEVBUiBDT01NQU5ELVNDUkVFTiBBTEwiLAorI2Vsc2UKKyIgIFN5bm9ueW1zOiBDTFMsIENMRUFSIFNDUkVFTi4iLAorI2VuZGlmIC8qIE9TMiAqLworIiAiLAorIlNDUkVFTiBDTEVPTCIsCisiICBDbGVhcnMgZnJvbSB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4iLAorI2lmZGVmIE9TMgorIiAgU3lub255bTogQ0xFQVIgQ09NTUFORC1TQ1JFRU4gRU9MIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyIgIiwKKyJTQ1JFRU4gTU9WRSByb3cgY29sdW1uIiwKKyIgIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGluZGljYXRlZCByb3cgYW5kIGNvbHVtbi4gIFRoZSByb3cgYW5kIGNvbHVtbiIsCisiICBudW1iZXJzIGFyZSAxLWJhc2VkIHNvIG9uIGEgMjR4ODAgc2NyZWVuLCB0aGUgaG9tZSBwb3NpdGlvbiBpcyAxIDEgYW5kIiwKKyIgIHRoZSBsb3dlciByaWdodCBjb3JuZXIgaXMgMjQgODAuICBJZiBhIHJvdyBvciBjb2x1bW4gbnVtYmVyIGlzIGdpdmVuIHRoYXQiLAorIiAgdG9vIGxhcmdlIGZvciB3aGF0IEtlcm1pdCBvciB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0aGlua3MgaXMgeW91ciBzY3JlZW4iLAorIiAgc2l6ZSwgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBpcyBzdWJzdGl0dXRlZC4iLAorIiAiLAorIkFsc28gc2VlOiIsCisjaWZkZWYgT1MyCisiICBIRUxQIEZVTkNUSU9OIFNDUk5DVVJYLCBIRUxQIEZVTkNUSU9OIFNDUk5DVVJZLCBIRUxQIEZVTkNUSU9OIFNDUlNUUiwiLAorI2VuZGlmIC8qIE9TMiAqLworIiAgU0hPVyBWQVJJQUJMRSBURVJNSU5BTCwgU0hPVyBWQVJJQUJMRSBDT0xTLCBTSE9XIFZBUiBST1dTLCBTSE9XIENPTU1BTkQuIiwKKyIiCit9OworCisjaWZuZGVmIE5PU1BMCitzdGF0aWMgY2hhciAqaG1md29yZFtdID0geworIlxcZndvcmQoczEsbjEsczIsczMsbjIsbjMpIC0gRXh0cmFjdCB3b3JkIGZyb20gc3RyaW5nLiIsCisiICAgIHMxID0gc291cmNlIHN0cmluZyIsCisiICAgIG4xID0gd29yZCBudW1iZXIgKDEtYmFzZWQpIiwKKyIgICAgczIgPSBvcHRpb25hbCBicmVhayBzZXQuIiwKKyIgICAgczMgPSBvcHRpb25hbCBpbmNsdWRlIHNldC4iLAorIiAgICBuMiA9IG9wdGlvbmFsIGdyb3VwaW5nIG1hc2suIiwKKyIgICAgbjMgPSBvcHRpb25hbCBzZXBhcmF0b3IgZmxhZzoiLAorIiAgICAgICAwID0gY29sbGFwc2UgYWRqYWNlbnQgc2VwYXJhdG9ycyIsCisiICAgICAgIDEgPSBkb24ndCBjb2xsYXBzZSBhZGphY2VudCBzZXBhcmF0b3JzLiIsCisiICIsCisiICBEZWZhdWx0IGJyZWFrIHNldCBpcyBhbGwgY2hhcmFjdGVycyBleGNlcHQgQVNDSUkgbGV0dGVycyBhbmQgZGlnaXRzLiIsCisiICBBU0NJSSAoQzApIGNvbnRyb2wgY2hhcmFjdGVycyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYnJlYWsgY2hhcmFjdGVycy4iLAorIiAgRGVmYXVsdCBpbmNsdWRlIHNldCBpcyBudWxsLiIsCisiICIsCisiICBJZiBncm91cGluZyBtYXNrIGdpdmVuIGFuZCBub256ZXJvLCB3b3JkcyBjYW4gYmUgZ3JvdXBlZCBieSBxdW90ZXMgb3IiLAorIiAgYnJhY2tldHMgc2VsZWN0ZWQgYnkgdGhlIHN1bSBvZiB0aGUgZm9sbG93aW5nOiIsCisiICIsCisiICAgICAxID0gZG91YmxlcXVvdGVzOiAgICBcImEgYiBjXCIiLAorIiAgICAgMiA9IGJyYWNlczogICAgICAgICAge2EgYiBjfSIsCisiICAgICA0ID0gYXBvc3Ryb3BoZXM6ICAgICAnYSBiIGMnIiwKKyIgICAgIDggPSBwYXJlbnRoZXNlczogICAgIChhIGIgYykiLAorIiAgICAxNiA9IHNxdWFyZSBicmFja2V0czogW2EgYiBjXSIsCisiICAgIDMyID0gYW5nbGUgYnJhY2tldHM6ICA8YSBiIGM+IiwKKyIgIiwKKyIgIE5lc3RpbmcgaXMgcG9zc2libGUgd2l0aCB7fSgpW108PiBidXQgbm90IHdpdGggcXVvdGVzIG9yIGFwb3N0cm9waGVzLiIsCisiICIsCisiUmV0dXJucyBzdHJpbmc6IiwKKyIgIFdvcmQgbnVtYmVyIG4sIGlmIHRoZXJlIGlzIG9uZSwgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZy4iLAorIiIKK307CisKK3N0YXRpYyBjaGFyICpobXh4cHJvbXB0W10gPSB7CisiU3ludGF4OiBQUk9NUFQgWyB0ZXh0IF0iLAorIiAgRW50ZXJzIGludGVyYWN0aXZlIGNvbW1hbmQgbGV2ZWwgZnJvbSB3aXRoaW4gYSBzY3JpcHQgaW4gc3VjaCBhIHdheSB0aGF0IiwKKyIgIHRoZSBzY3JpcHQgY2FuIGJlIGNvbnRpbnVlZCB3aXRoIGFuIEVORCBvciBSRVRVUk4gY29tbWFuZC4gIFNUT1AsIEVYSVQsIiwKKyIgIFNIT1cgU1RBQ0ssIFRSQUNFLCBhbmQgQ3RybC1DIGFsbCBoYXZlIHRoZWlyIG5vcm1hbCBlZmZlY3RzLiAgVGhlIFBST01QVCIsCisiICBjb21tYW5kIGFsbG93cyB2YXJpYWJsZXMgdG8gYmUgZXhhbWluZWQgb3IgY2hhbmdlZCwgb3IgYW55IG90aGVyIGNvbW1hbmRzIiwKKyIgIHRvIGJlIGdpdmVuLCBpbiBhbnkgbnVtYmVyLCBwcmlvciB0byByZXR1cm5pbmcgdG8gdGhlIHNjcmlwdCwgYWxsb3dpbmciLAorIiAgS2VybWl0IHRvIHNlcnZlIGFzIGl0cyBvd24gZGVidWdnZXI7IGFkZGluZyB0aGUgUFJPTVBUIGNvbW1hbmQgdG8gYSBzY3JpcHQiLAorIiAgaXMgbGlrZSBzZXR0aW5nIGEgYnJlYWtwb2ludC4gIElmIHRoZSBvcHRpb25hbCB0ZXh0IGlzIGluY2x1ZGVkLCBpdCBpcyIsCisiICB1c2VkIGFzIHRoZSBuZXcgcHJvbXB0IGZvciB0aGlzIGxldmVsLCBlLmcuIFwicHJvbXB0IEJyZWFrcG9pbnRfMT5cIi4iLAorIiIKK307CisKK3N0YXRpYyBjaGFyICpoeHhpbnBbXSA9IHsKKyJTeW50YXg6ICBJTlBVVCBbIC9OT01BVENIIF0geyBudW1iZXItb2Ytc2Vjb25kcywgdGltZS1vZi1kYXkgfSBbIHRleHQgXSIsCisiRXhhbXBsZTogSU5QVVQgNSBMb2dpbjogIG9yICBJTlBVVCAyMzo1OTo1OSBSSU5HIiwKKyIgIFdhaXRzIHVwIHRvIHRoZSBnaXZlbiBudW1iZXIgb2Ygc2Vjb25kcywgb3IgdW50aWwgdGhlIGdpdmVuIHRpbWUgb2YgZGF5LCIsCisiICBmb3IgdGhlIGdpdmVuIHRleHQgdG8gYXJyaXZlIG9uIHRoZSBjb25uZWN0aW9uLiAgSWYgbm8gdGV4dCBpcyBnaXZlbiwiLAorIiAgSU5QVVQgd2FpdHMgZm9yIGFueSBjaGFyYWN0ZXIuICBJZiB0aGUgL05PTUFUQ0ggc3dpdGNoIGlzIGluY2x1ZGVkLCBJTlBVVCIsCisiICBkb2VzIG5vdCBhdHRlbXB0IHRvIG1hdGNoIGFueSBjaGFyYWN0ZXJzLCBidXQgY29udGludWVzIHJlYWRpbmcgZnJvbSB0aGUiLAorIiAgY29tbXVuaWNhdGlvbiBjb25uZWN0aW9uIHVudGlsIHRoZSB0aW1lb3V0IGludGVydmFsIGV4cGlyZXMuICBJZiB0aGUiLAorIiAgdGltZW91dCBpbnRlcnZhbCBpcyAwLCB0aGUgSU5QVVQgY29tbWFuZCBkb2VzIG5vdCB3YWl0OyBpLmUuIHRoZSBnaXZlbiIsCisiICB0ZXh0IG11c3QgYWxyZWFkeSBiZSBhdmFpbGFibGUgZm9yIHJlYWRpbmcgZm9yIHRoZSBJTlBVVCBjb21tYW5kIHRvIiwKKyIgIHN1Y2NlZWQuICBJZiB0aGUgaW50ZXJ2YWwgaXMgbmVnYXRpdmUsIHRoZSBJTlBVVCBjb21tYW5kIHdhaXRzIGZvcmV2ZXIuIiwKKyIgIEZvciB1c2UgaW4gc2NyaXB0IHByb2dyYW1zIHdpdGggSUYgRkFJTFVSRSBhbmQgSUYgU1VDQ0VTUy4gIEFsc28gc2VlIiwKKyIgIE1JTlBVVCwgUkVJTlBVVCwgU0VUIElOUFVULiAgU2VlIEhFTFAgUEFVU0UgZm9yIGRldGFpbHMgb24gdGltZS1vZi1kYXkiLAorIiAgZm9ybWF0LiAgVGhlIHRleHQsIGlmIGdpdmVuLCBjYW4gYmUgYSBcXHBhdHRlcm4oKSBpbnZvY2F0aW9uLCBpbiB3aGljaCIsCisiICBjYXNlIGl0IGlzIHRyZWF0ZWQgYXMgYSBwYXR0ZXJuIHJhdGhlciB0aGFuIGEgbGl0ZXJhbCBzdHJpbmcgKEhFTFAiLAorIiAgUEFUVEVSTlMgZm9yIGRldGFpbHMpLiIsCisiIn07CisKK3N0YXRpYyBjaGFyICpoeHhvdXRbXSA9IHsKKyJTeW50YXg6IE9VVFBVVCB0ZXh0IiwKKyIgIFNlbmRzIHRoZSB0ZXh0IG91dCB0aGUgY29tbXVuaWNhdGlvbnMgY29ubmVjdGlvbiwgYXMgaWYgeW91IGhhZCB0eXBlZCBpdCIsCisiICBkdXJpbmcgQ09OTkVDVCBtb2RlLiAgVGhlIHRleHQgbWF5IGNvbnRhaW4gYmFja3NsYXNoIGNvZGVzLCB2YXJpYWJsZXMsIiwKKyIgIGV0YywgcGx1cyB0aGUgZm9sbG93aW5nIHNwZWNpYWwgY29kZXM6IiwKKyIgIiwKKyIgICAgXFxOIC0gU2VuZCBhIE5VTCAoQVNDSUkgMCkgY2hhcmFjdGVyICh5b3UgY2FuJ3QgdXNlIFxcMCBmb3IgdGhpcykuIiwKKyIgICAgXFxCIC0gU2VuZCBhIEJSRUFLIHNpZ25hbC4iLAorIiAgICBcXEwgLSBTZW5kIGEgTG9uZyBCUkVBSyBzaWduYWwuIiwKKyIgIiwKKyJBbHNvIHNlZSBTRVQgT1VUUFVULiIsCisiIiB9OworI2VuZGlmIC8qIE5PU1BMICovCisKK3N0YXRpYyBjaGFyICpoeHlwYXJpW10gPSB7CisiU0VUIFBBUklUWSBOT05FIiwKKyIgIENob29zZXMgOCBkYXRhIGJpdHMgYW5kIG5vIHBhcml0eS4iLAorIiAiLAorIlNFVCBQQVJJVFkgeyBFVkVOLCBPREQsIE1BUkssIFNQQUNFIH0iLAorIiAgQ2hvb3NlcyA3IGRhdGEgYml0cyBwbHVzIHRoZSBpbmRpY2F0ZWQga2luZCBvZiBwYXJpdHkuIiwKKyIgIEZvcmNlcyA4dGgtYml0IHByZWZpeGluZyBkdXJpbmcgZmlsZSB0cmFuc2Zlci4iLAorIiAiLAorI2lmZGVmIEhXUEFSSVRZCisiU0VUIFBBUklUWSBIQVJEV0FSRSB7IEVWRU4sIE9ERCB9IiwKKyIgIENob29zZXMgOCBkYXRhIGJpdHMgcGx1cyB0aGUgaW5kaWNhdGVkIGtpbmQgb2YgcGFyaXR5LiIsCisiICIsCisiQWxzbyBzZWUgU0VUIFRFUk1JTkFMIEJZVEVTSVpFLCBTRVQgU0VSSUFMLCBhbmQgU0VUIFNUT1AtQklUUy4iLAorI2Vsc2UKKyJBbHNvIHNlZSBTRVQgVEVSTUlOQUwgQllURVNJWkUgYW5kIFNFVCBTRVJJQUwuIiwKKyNlbmRpZiAvKiBIV1BBUklUWSAqLworIiJ9OworCisjaWZuZGVmIE5PTE9DQUwKK3N0YXRpYyBjaGFyICpoeHllc2NbXSA9IHsKKyNpZmRlZiBPUzIKKyJTeW50YXg6IFNFVCBFU0NBUEUgbnVtYmVyIiwKKyIgIERlY2ltYWwgQVNDSUkgdmFsdWUgZm9yIGVzY2FwZSBjaGFyYWN0ZXIgZHVyaW5nIENPTk5FQ1QsIG5vcm1hbGx5IDI5IiwKKyIgIChDb250cm9sLV0pLiAgVHlwZSB0aGUgZXNjYXBlIGNoYXJhY3RlciBmb2xsb3dlZCBieSBDIHRvIGdldCBiYWNrIHRvIHRoZSIsCisiICBDLUtlcm1pdCBwcm9tcHQgb3IgZm9sbG93ZWQgYnkgPyB0byBzZWUgb3RoZXIgb3B0aW9ucywgb3IgdXNlIHRoZSBcXEtleGl0IiwKKyIgIGtleWJvYXJkIHZlcmIsIG5vcm1hbGx5IGFzc2lnbmVkIHRvIEFsdC14LiIsCisjZWxzZQorI2lmZGVmIE5FWFQKKyJTeW50YXg6IFNFVCBFU0NBUEUgbnVtYmVyIiwKKyIgIERlY2ltYWwgQVNDSUkgdmFsdWUgZm9yIGVzY2FwZSBjaGFyYWN0ZXIgZHVyaW5nIENPTk5FQ1QsIG5vcm1hbGx5IDI5IiwKKyIgIChDb250cm9sLV0pLiAgVHlwZSB0aGUgZXNjYXBlIGNoYXJhY3RlciBmb2xsb3dlZCBieSBDIHRvIGdldCBiYWNrIHRvIHRoZSIsCisiICBDLUtlcm1pdCBwcm9tcHQgb3IgZm9sbG93ZWQgYnkgPyB0byBzZWUgb3RoZXIgb3B0aW9ucy4iLAorI2Vsc2UKKyJTeW50YXg6IFNFVCBFU0NBUEUgbnVtYmVyIiwKKyIgIERlY2ltYWwgQVNDSUkgdmFsdWUgZm9yIGVzY2FwZSBjaGFyYWN0ZXIgZHVyaW5nIENPTk5FQ1QsIG5vcm1hbGx5IDI4IiwKKyIgIChDb250cm9sLVxcKS4gIFR5cGUgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgQyB0byBnZXQgYmFjayB0byB0aGUiLAorIiAgQy1LZXJtaXQgcHJvbXB0IG9yIGZvbGxvd2VkIGJ5ID8gdG8gc2VlIG90aGVyIG9wdGlvbnMuIiwKKyNlbmRpZiAvKiBORVhUICovCisjZW5kaWYgLyogT1MyICovCisiICIsCisiWW91IG1heSBhbHNvIGVudGVyIHRoZSBlc2NhcGUgY2hhcmFjdGVyIGFzIF5YIChjaXJjdW1mbGV4IGZvbGxvd2VkIGJ5IGEiLAorImxldHRlciBvciBvbmUgb2Y6IEAsIF4sIF8sIFssIFxcLCBvciBdLCB0byBpbmRpY2F0ZSBhIGNvbnRyb2wgY2hhcmFjdGVyOyIsCisiZm9yIGV4YW1wbGUsIFNFVCBFU0MgXl8gc2V0cyB5b3VyIGVzY2FwZSBjaGFyYWN0ZXIgdG8gQ3RybC1VbmRlcnNjb3JlLiIsCisiICIsCisiWW91IGNhbiBhbHNvIHNwZWNpZnkgYW4gOC1iaXQgY2hhcmFjdGVyICgxMjgtMjU1KSBhcyB5b3VyIGVzY2FwZSBjaGFyYWN0ZXIsIiwKKyJlaXRoZXIgYnkgdHlwaW5nIGl0IGxpdGVyYWxseSBvciBieSBlbnRlcmluZyBpdHMgbnVtZXJpYyBjb2RlLiIsCisiIiB9OworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmbmRlZiBOT1NQTAorc3RhdGljIGNoYXIgKmh4eW91dFtdID0geworIlNFVCBPVVRQVVQgUEFDSU5HIDxudW1iZXI+IiwKKyIgIEhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byBwYXVzZSBhZnRlciBzZW5kaW5nIGVhY2ggT1VUUFVUIGNoYXJhY3RlciwiLAorIiAgbm9ybWFsbHkgMC4iLAorIiAiLAorIlNFVCBPVVRQVVQgU1BFQ0lBTC1FU0NBUEVTIHsgT04sIE9GRiB9IiwKKyIgIFdoZXRoZXIgdG8gcHJvY2VzcyB0aGUgc3BlY2lhbCBPVVRQVVQtb25seSBlc2NhcGVzIFxcQiwgXFxMLCBhbmQgXFxOLiIsCisiICBOb3JtYWxseSBPTiAodGhleSBhcmUgcHJvY2Vzc2VkKS4iLAorIiIgfTsKKworc3RhdGljIGNoYXIgKmh4eWlucFtdID0geworIlN5bnRheDogU0VUIElOUFVUIHBhcmFtZXRlciB2YWx1ZSIsCisiICIsCisjaWZkZWYgQ0tfQVVUT0RMCisiU0VUIElOUFVUIEFVVE9ET1dOTE9BRCB7IE9OLCBPRkYgfSIsCisiICBDb250cm9scyB3aGV0aGVyIGF1dG9kb3dubG9hZHMgYXJlIGFsbG93ZWQgZHVyaW5nIElOUFVUIGNvbW1hbmQgZXhlY3V0aW9uLiIsCisiICIsCisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisiU0VUIElOUFVUIEJVRkZFUi1MRU5HVEggbnVtYmVyLW9mLWJ5dGVzIiwKKyIgIFJlbW92ZXMgdGhlIG9sZCBJTlBVVCBidWZmZXIgYW5kIGNyZWF0ZXMgYSBuZXcgb25lIHdpdGggdGhlIGdpdmVuIGxlbmd0aC4iLAorIiAiLAorIlNFVCBJTlBVVCBDQU5DRUxMQVRJT04geyBPTiwgT0ZGIH0iLAorIiAgV2hldGhlciBhbiBJTlBVVCBpbiBwcm9ncmVzcyBjYW4gYmUgY2FuIGludGVycnVwdGVkIGZyb20gdGhlIGtleWJvYXJkLiIsCisiICIsCisiU0VUIElOUFVUIENBU0UgeyBJR05PUkUsIE9CU0VSVkUgfSIsCisiICBUZWxscyB3aGV0aGVyIGFscGhhYmV0aWMgY2FzZSBpcyB0byBiZSBzaWduaWZpY2FudCBpbiBzdHJpbmcgY29tcGFyaXNvbnMuIiwKKyIgIFRoaXMgc2V0dGluZyBpcyBsb2NhbCB0byB0aGUgY3VycmVudCBtYWNybyBvciBjb21tYW5kIGZpbGUsIGFuZCBpcyIsCisiICBpbmhlcml0ZWQgYnkgc3Vib3JkaW5hdGUgbWFjcm9zIGFuZCB0YWtlIGZpbGVzLiIsCisiICIsCisiU0VUIElOUFVUIEVDSE8geyBPTiwgT0ZGIH0iLAorIiAgVGVsbHMgd2hldGhlciB0byBkaXNwbGF5IGFycml2aW5nIGNoYXJhY3RlcnMgcmVhZCBieSBJTlBVVCBvbiB0aGUgc2NyZWVuLiIsCisiICIsCisjaWZkZWYgQ0tGTE9BVAorIlNFVCBJTlBVVCBTQ0FMRS1GQUNUT1IgPG51bWJlcj4iLAorIiAgQSBudW1iZXIgdG8gbXVsdGlwbHkgYWxsIElOUFVUIHRpbWVvdXRzIGJ5LCB3aGljaCBtYXkgaW5jbHVkZSBhIGZyYWN0aW9uYWwiLAorIiAgcGFydCwgZS5nLiAyLjUuICBBbGwgSU5QVVQgY29tbWFuZHMgdGhhdCBzcGVjaWZ5IGEgdGltZW91dCBpbiBzZWNvbmRzIiwKKyIgIChhcyBvcHBvc2VkIHRvIGEgc3BlY2lmaWMgdGltZSBvZiBkYXkpIGhhdmUgdGhlaXIgdGltZSBsaW1pdCBhZGp1c3RlZCIsCisiICBhdXRvbWF0aWNhbGx5IGJ5IHRoaXMgZmFjdG9yLCB3aGljaCBpcyBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgYnVpbHQtaW4iLAorIiAgcmVhZC1vbmx5IHZhcmlhYmxlIFxcdihpbnNjYWxlKS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuMC4iLAorIiAiLAorCisjZW5kaWYJLyogQ0tGTE9BVCAqLworCisiU0VUIElOUFVUIFNJTEVOQ0UgPG51bWJlcj4iLAorIiAgVGhlIG1heGltdW0gbnVtYmVyIHRvIHNlY29uZHMgb2Ygc2lsZW5jZSAobm8gaW5wdXQgYXQgYWxsKSBiZWZvcmUgdGhlIiwKKyIgIElOUFVUIGNvbW1hbmQgdGltZXMgb3V0LCAwIGZvciBubyBtYXhpbXVtLiIsCisiICIsCisjaWZkZWYgT1MyCisiU0VUIElOUFVUIFRFUk1JTkFMIHsgT04sIE9GRiB9IiwKKyIgIERldGVybWluZXMgd2hldGhlciB0aGUgZGF0YSByZWNlaXZlZCBkdXJpbmcgYW4gSU5QVVQgY29tbWFuZCBpcyBkaXNwbGF5ZWQiLAorIiAgaW4gdGhlIHRlcm1pbmFsIHdpbmRvdy4gIERlZmF1bHQgaXMgT04uIiwKKyIgIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyJTRVQgSU5QVVQgVElNRU9VVC1BQ1RJT04geyBQUk9DRUVELCBRVUlUIH0iLAorIiAgVGVsbHMgd2hldGhlciB0byBwcm9jZWVkIG9yIHF1aXQgZnJvbSBhIHNjcmlwdCBwcm9ncmFtIGlmIGFuIElOUFVUIGNvbW1hbmQiLAorIiAgZmFpbHMuICBQUk9DRUVEIChkZWZhdWx0KSBhbGxvd3MgdXNlIG9mIElGIFNVQ0NFU1MgLyBJRiBGQUlMVVJFIGNvbW1hbmRzLiIsCisiICBUaGlzIHNldHRpbmcgaXMgbG9jYWwgdG8gdGhlIGN1cnJlbnQgbWFjcm8gb3IgY29tbWFuZCBmaWxlLCBhbmQgaXMiLAorIiAgaW5oZXJpdGVkIGJ5IHN1Ym9yZGluYXRlIG1hY3JvcyBhbmQgdGFrZSBmaWxlcy4iLAorIiIgfTsKKworc3RhdGljIGNoYXIgKmh4eWZ1bmNbXSA9IHsKKyJTRVQgRlVOQ1RJT04gRElBR05PU1RJQ1MgeyBPTiwgT0ZGIH0iLAorIiAgV2hldGhlciB0byBpc3N1ZSBkaWFnbm9zdGljIG1lc3NhZ2VzIGZvciBpbGxlZ2FsIGZ1bmN0aW9uIGNhbGxzIGFuZCIsCisiICByZWZlcmVuY2VzIHRvIG5vbmV4aXN0ZW50IGJ1aWx0LWluIHZhcmlhYmxlcy4gIE9OIGJ5IGRlZmF1bHQuIiwKKyIgIiwKKyJTRVQgRlVOQ1RJT04gRVJST1IgeyBPTiwgT0ZGIH0iLAorIiAgV2hldGhlciBhbiBpbGxlZ2FsIGZ1bmN0aW9uIGNhbGwgb3IgcmVmZXJlbmNlIHRvIGEgbm9uZXhpc3RlbnQgYnVpbHQtaW4iLAorIiAgdmFyaWFibGUgc2hvdWxkIGNhdXNlIGEgY29tbWFuZCB0byBmYWlsLiAgT0ZGIGJ5IGRlZmF1bHQuIiwKKyIiIH07CisjZW5kaWYgLyogTk9TUEwgKi8KKworc3RhdGljIGNoYXIgKmh4eXh5eltdID0geworI2lmZGVmIENLX1hZWgorI2lmZGVmIFhZWl9JTlRFUk5BTAorCisvKiBUaGlzIGlzIGZvciBidWlsdC1pbiBwcm90b2NvbHMgKi8KKworIlN5bnRheDogU0VUIFBST1RPQ09MIHsgS0VSTUlULCBYTU9ERU0sIFlNT0RFTSwgWk1PREVNIH0gWyBzMSBzMiBbIHMzIF0gXSIsCisiICBTZWxlY3RzIHByb3RvY29sIHRvIHVzZSBmb3IgdHJhbnNmZXJyaW5nIGZpbGVzLiAgU3RyaW5nIHMxIGlzIGEgY29tbWFuZCB0byIsCisiICBzZW5kIHRvIHRoZSByZW1vdGUgaG9zdCBwcmlvciB0byBTRU5EaW5nIGZpbGVzIHdpdGggdGhpcyBwcm90b2NvbCBpbiIsCisiICBiaW5hcnkgbW9kZTsgc3RyaW5nIHMyIGlzIHRoZSBzYW1lIHRoaW5nIGJ1dCBmb3IgdGV4dCBtb2RlLiAgVXNlIFwiJVwiIGluIiwKKyIgIGFueSBvZiB0aGVzZSBzdHJpbmdzIHRvIHJlcHJlc2VudCB0aGUgZmlsZW5hbWUocykuICBJZiB0aGUgcHJvdG9jb2wgaXMiLAorIiAgS0VSTUlULCB5b3UgbWF5IGFsc28gc3BlY2lmeSBhIHN0cmluZyBzMywgdGhlIGNvbW1hbmQgdG8gc3RhcnQgYSBLZXJtaXQiLAorIiAgc2VydmVyIG9uIHRoZSByZW1vdGUgaG9zdCB3aGVuIHlvdSBnaXZlIGEgR0VULCBSRUdFVCwgUkVNT1RFLCBvciBvdGhlciIsCisiICBjbGllbnQgY29tbWFuZC4gIFVzZSB7IGJyYWNlcyB9IGlmIGFueSBjb21tYW5kIGNvbnRhaW5zIHNwYWNlcy4gIEV4YW1wbGVzOiIsCisiICIsCisiICAgIHNldCBwcm90byB4bW9kZW0ge3J4ICVzfSB7cnggLWEgJXN9IiwKKyIgICAgc2V0IHByb3RvIGtlcm1pdCB7a2VybWl0IC1ZUWlyfSB7a2VybWl0IC1ZUVRyfSB7a2VybWl0IC1ZUXh9IiwKKworI2Vsc2UgLyogVGhpcyBpcyBmb3Igd2hlbiBub24tS2VybWl0IHByb3RvY29scyBhcmUgZXh0ZXJuYWwgKi8KKworIlN5bnRheDogXAorU0VUIFBST1RPQ09MIHsgS0VSTUlULCBYTU9ERU0sIFlNT0RFTSwgWk1PREVNIH0gWyBzMSBzMiBzMyBzNCBzNSBzNiBdIiwKKyIgIFNlbGVjdHMgcHJvdG9jb2wgdG8gdXNlIGZvciB0cmFuc2ZlcnJpbmcgZmlsZXMuICBzMSBhbmQgczIgYXJlIGNvbW1hbmRzIHRvIiwKKyIgIG91dHB1dCBwcmlvciB0byBTRU5EaW5nIHdpdGggdGhpcyBwcm90b2NvbCwgdG8gYXV0b21hdGljYWxseSBzdGFydCB0aGUiLAorIiAgUkVDRUlWRSBwcm9jZXNzIG9uIHRoZSBvdGhlciBlbmQgaW4gYmluYXJ5IG9yIHRleHQgbW9kZSwgcmVzcGVjdGl2ZWx5LiIsCisiICBJZiB0aGUgcHJvdG9jb2wgaXMgS0VSTUlULCBzMyBpcyB0aGUgY29tbWFuZCB0byBzdGFydCBhIEtlcm1pdCBzZXJ2ZXIgb24iLAorIiAgdGhlIHJlbW90ZSBjb21wdXRlciwgYW5kIHRoZXJlIGFyZSBubyBzNC1zNiBjb21tYW5kcy4gIE90aGVyd2lzZSwgczMgYW5kIiwKKyIgIHM0IGFyZSBjb21tYW5kcyB1c2VkIG9uIHRoaXMgY29tcHV0ZXIgZm9yIHNlbmRpbmcgZmlsZXMgd2l0aCB0aGlzIHByb3RvY29sIiwKKyIgIGluIGJpbmFyeSBvciB0ZXh0IG1vZGUsIHJlc3BlY3RpdmVseTsgczUgYW5kIHM2IGFyZSB0aGUgY29tbWFuZHMgZm9yIiwKKyIgIHJlY2VpdmluZyBmaWxlcyB3aXRoIHRoaXMgcHJvdG9jb2wuICBVc2UgXCIlc1wiIGluIGFueSBvZiB0aGVzZSBzdHJpbmdzIiwKKyIgIHRvIHJlcHJlc2VudCB0aGUgZmlsZW5hbWUocykuICBVc2UgeyBicmFjZXMgfSBpZiBhbnkgY29tbWFuZCBjb250YWlucyIsCisiICBzcGFjZXMuICBFeGFtcGxlczoiLAorIiAiLAorIiAgICBzZXQgcHJvdG8ga2VybWl0IHtrZXJtaXQgLVlRaXJ9IHtrZXJtaXQgLVlRVHJ9IHtrZXJtaXQgLVlReH0iLAorIiAgICBzZXQgcHJvdG8geW1vZGVtIHJiIHtyYiAtYX0ge3NiICVzfSB7c2IgLWEgJXN9IHJiIHJiIiwKKyIgIiwKKyJFeHRlcm5hbCBwcm90b2NvbHMgcmVxdWlyZSBSRURJUkVDVCBhbmQgZXh0ZXJuYWwgZmlsZSB0cmFuc2ZlciBwcm9ncmFtcyB0aGF0IiwKKyJ1c2UgcmVkaXJlY3RhYmxlIHN0YW5kYXJkIGlucHV0L291dHB1dC4iLAorI2VuZGlmIC8qIFhZWl9JTlRFUk5BTCAqLworI2Vsc2UKKyJTeW50YXg6IFwKK1NFVCBQUk9UT0NPTCBLRVJNSVQgWyBzMSBbIHMyIFsgczMgXSBdIF0iLAorIiAgTGV0cyB5b3Ugc3BlY2lmeSB0aGUgYXV0b3VwbG9hZCBiaW5hcnksIGF1dG91cGxvYWQgdGV4dCwgYW5kIGF1dG9zZXJ2ZXIiLAorIiAgY29tbWFuZCBzdHJpbmdzIHRvIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBzeXN0ZW0gaW4gYWR2YW5jZSBvZiBhbnkgU0VORCIsCisiICBvciBHRVQgY29tbWFuZHMuICBCeSBkZWZhdWx0IHRoZXNlIGFyZSBcImtlcm1pdCAtaXJcIiwgXCJrZXJtaXQgLXJcIiwgYW5kIiwKKyIgIFwia2VybWl0IC14XCIuICBVc2UgeyBicmFjZXMgfSBhcm91bmQgYW55IGNvbW1hbmQgdGhhdCBjb250YWlucyBzcGFjZXMuIiwKKyIgIEV4YW1wbGU6IiwKKyIgIiwKKyIgICAgc2V0IHByb3RvIGtlcm1pdCB7a2VybWl0IC1ZaXJ9IHtrZXJtaXQgLVlUcn0ge2tlcm1pdCAtWXh9IiwKKyNlbmRpZiAvKiBDS19YWVogKi8KKyIgIiwKKyIgIFNIT1cgUFJPVE9DT0wgZGlzcGxheXMgdGhlIGN1cnJlbnQgc2V0dGluZ3MuIiwKKyIifTsKKworc3RhdGljIGNoYXIgKmhteHhieWUgPSAiU3ludGF4OiBCWUVcblwKKyAgU2h1dCBkb3duIGFuZCBsb2cgb3V0IGEgcmVtb3RlIEtlcm1pdCBzZXJ2ZXIiOworCisjaWZkZWYgQ0tfUEVSTVMKKyNpZmRlZiBVTklYCitzdGF0aWMgY2hhciAqaG14eGNobW9kW10gPSB7CisiU3ludGF4OiBDSE1PRCBbIHN3aXRjaGVzIF0gY29kZSBmaWxlc3BlYyIsCisiICBVTklYIG9ubHkuICBDaGFuZ2VzIHBlcm1pc3Npb25zIG9mIHRoZSBnaXZlbiBmaWxlKHMpIHRvIHRoZSBnaXZlbiBjb2RlLCIsCisiICB3aGljaCBtdXN0IGJlIGFuIG9jdGFsIG51bWJlciBzdWNoIGFzIDY2NCBvciA3NzUuICBPcHRpb25hbCBzd2l0Y2hlczoiLAorIiAiLAorIiAgIC9GSUxFUyAgICAgICAgT25seSBjaGFuZ2UgcGVybWlzc2lvbnMgb2YgcmVndWxhciBmaWxlcy4iLAorIiAgIC9ESVJFQ1RPUklFUyAgT25seSBjaGFuZ2UgcGVybWlzc2lvbnMgb2YgZGlyZWN0b3J5IGZpbGVzLiIsCisiICAgL1RZUEU6QklOQVJZICBPbmx5IGNoYW5nZSBwZXJtaXNzaW9ucyBvZiBiaW5hcnkgZmlsZXMuIiwKKyIgICAvVFlQRTpURVhUICAgIE9ubHkgY2hhbmdlIHBlcm1pc3Npb25zIG9mIHRleHQgZmlsZXMuIiwKKyIgICAvRE9URklMRVMgICAgIEluY2x1ZGUgZmlsZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBkb3QgKC4pLiIsCisiICAgL1JFQ1VSU0lWRSAgICBDaGFuZ2UgcGVybWlzc2lvbnMgaW4gc3ViZGlyZWN0b3JpZXMgdG9vLiIsCisiICAgL0xJU1QgICAgICAgICBMaXN0IGVhY2ggZmlsZSAoc3lub255bTogL1ZFUkJPU0UpLiIsCisiICAgL05PTElTVCAgICAgICBPcGVyYXRlIHNpbGVudGx5IChzeW5vbnltOiAvUVVJRVQpLiIsCisiICAgL1BBR0UgICAgICAgICBXaGVuIGxpc3RpbmcsIHBhdXNlIGF0IGVuZCBvZiBlYWNoIHNjcmVlbiAoaW1wbGllcyAvTElTVCkuIiwKKyIgICAvTk9QQUdFICAgICAgIFdoZW4gbGlzdGluZywgZG9uJ3QgcGF1c2UgYXQgZW5kIG9mIGVhY2ggc2NyZWVuLiIsCisiICAgL1NJTVVMQVRFICAgICBTaG93IHdoYXQgd291bGQgYmUgZG9uZSBidXQgZG9uJ3QgYWN0dWFsbHkgZG8gaXQuIiwKKyIiCit9OworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBDS19QRVJNUyAqLworCisjaWZuZGVmIE5PU1BMCisjaWZuZGVmIE5PU0VYUAorc3RhdGljIGNoYXIgKmhteHhzZXhwW10gPSB7CisiU3ludGF4OiAob3BlcmF0aW9uIG9wZXJhbmQgWyBvcGVyYW5kIFsgLi4uIF0gXSkiLAorIiAiLAorIiAgQy1LZXJtaXQgaW5jbHVkZXMgYSBzaW1wbGUgTElTUC1saWtlIFMtRXhwcmVzc2lvbiBwYXJzZXIgb3BlcmF0aW5nIG9uIiwKKyIgIG51bWJlcnMgb25seS4gIEFuIFMtRXhwcmVzc2lvbiBpcyBhbHdheXMgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMuICBUaGUiLAorIiAgcGFyZW50aGVzZXMgY2FuIGNvbnRhaW4gKGEpIGEgbnVtYmVyLCAoYikgYSB2YXJpYWJsZSwgKGMpIGEgZnVuY3Rpb24gdGhhdCIsCisiICByZXR1cm5zIGEgbnVtYmVyLCBvciAoZCkgYW4gb3BlcmF0b3IgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgb3BlcmFuZHMuIiwKKyIgIE9wZXJhbmRzIGNhbiBiZSBhbnkgb2YgKGEpIHRocm91Z2ggKGMpIG9yIGFuIFMtRXhwcmVzc2lvbi4gIE51bWJlcnMgY2FuIGJlIiwKKyIgIGludGVnZXJzIG9yIGZsb2F0aW5nLXBvaW50LiAgQW55IG9wZXJhbmQgdGhhdCBpcyBub3QgYSBudW1iZXIgYW5kIGRvZXMgbm90IiwKKyIgIHN0YXJ0IHdpdGggYmFja3NsYXNoIChcXCkgaXMgdHJlYXRlZCBhcyBhIEtlcm1pdCBtYWNybyBuYW1lLiAgT3BlcmF0b3JzOiIsCisiICIsCisiIE9wZXJhdG9yICBBY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlICAgICAgICAgICBWYWx1ZSIsCisiICBFVkFMICguKSAgUmV0dXJucyB0aGUgY29udGFpbmVkIHZhbHVlICAgICAgICAgICAgKDYpICAgICAgICAgICAgICAgNiIsCisiICBRVU9URSAoJykgSW5oaWJpdHMgZXZhbHVhdGlvbiBvZiBmb2xsb3dpbmcgdmFsdWUgKHF1b3RlIGEpICAgICAgICAgYSIsCisiICBTRVRRICAgICAgQXNzaWducyBhIHZhbHVlIHRvIGEgZ2xvYmFsIHZhcmlhYmxlICAgKHNldHEgYSAyKSAgICAgICAgMiIsCisiICBMRVQgICAgICAgQXNzaWducyBhIHZhbHVlIHRvIGEgbG9jYWwgdmFyaWFibGUgICAgKGxldCBiIC0xLjMpICAgICAtMS4zIiwKKyIgICsgICAgICAgICBBZGRzIGFsbCBvcGVyYW5kcyAoMSBvciBtb3JlKSAgICAgICAgICAoKyBhIGIpICAgICAgICAgICAwLjciLAorIiAgLSAgICAgICAgIFN1YnRyYWN0cyBhbGwgb3BlcmFuZHMgKDEgb3IgbW9yZSkgICAgICgtIDkgNSAyIDEpICAgICAgIDEiLAorIiAgKiAgICAgICAgIE11bHRpcGxpZXMgYWxsIG9wZXJhbmRzICgxIG9yIG1vcmUpICAgICgqIGEgKCsgYiAxKSAzKSAgLTEuOCIsCisiICAvICAgICAgICAgRGl2aWRlcyBhbGwgb3BlcmFuZHMgKDEgb3IgbW9yZSkgICAgICAgKC8gYiBhIDIpICAgICAgICAtMC4zMjUiLAorIiAgXiAgICAgICAgIFJhaXNlIGdpdmVuIG51bWJlciB0byBnaXZlbiBwb3dlciAgICAgICheIDMgMikgICAgICAgICAgIDkiLAorIiAgKysgICAgICAgIEluY3JlbWVudHMgYSB2YXJpYWJsZSAgICAgICAgICAgICAgICAgICgrKyBhIDEuMikgICAgICAgIDMuMiIsCisiICAtLSAgICAgICAgRGVjcmVtZW50cyBhIHZhcmlhYmxlICAgICAgICAgICAgICAgICAgKC0tIGEpICAgICAgICAgICAgMSIsCisiICBBQlMgICAgICAgQWJzb2x1dGUgdmFsdWUgb2YgMSBvcGVyYW5kICAgICAgICAgICAgKGFicyAoKiBhIGIgMykpICAgNy44IiwKKyIgIE1BWCAgICAgICBNYXhpbXVtIG9mIGFsbCBvcGVyYW5kcyAoMSBvciBtb3JlKSAgICAobWF4IDEgMiAzIDQpICAgICA0IiwKKyIgIE1JTiAgICAgICBNaW5pbXVtIG9mIGFsbCBvcGVyYW5kcyAoMSBvciBtb3JlKSAgICAobWluIDEgMiAzIDQpICAgICAxIiwKKyIgIE1PRCAgICAgICBNb2R1bHVzIG9mIGFsbCBvcGVyYW5kcyAoMSBvciBtb3JlKSAgICAobW9kIDcgNCAyKSAgICAgICAxIiwKKyIgIFRSVU5DQVRFICBJbnRlZ2VyIHBhcnQgb2YgZmxvYXRpbmctcG9pbnQgb3BlcmFuZCAodHJ1bmNhdGUgMS4zMzMpICAxIiwKKyIgIENFSUxJTkcgICBDZWlsaW5nIG9mIGZsb2F0aW5nLXBvaW50IG9wZXJhbmQgICAgICAoY2VpbGluZyAxLjI1KSAgICAyIiwKKyIgIEZMT09SICAgICBGbG9vciBvZiBmbG9hdGluZy1wb2ludCBvcGVyYW5kICAgICAgICAoZmxvb3IgMS4yNSkgICAgICAxIiwKKyIgIFJPVU5EICAgICBPcGVyYW5kIHJvdW5kZWQgdG8gbmVhcmVzdCBpbnRlZ2VyICAgICAocm91bmQgMS43NSkgICAgICAyIiwKKyIgIFNRUlQgICAgICBTcXVhcmUgcm9vdCBvZiAxIG9wZXJhbmQgICAgICAgICAgICAgICAoc3FydCAyKSAgICAgICAgICAxLjQxNC4uIiwKKyIgIEVYUCAgICAgICBlICgyLjcxODI4Li4pIHRvIHRoZSBnaXZlbiBwb3dlciAgICAgICAoZXhwIC0xKSAgICAgICAgICAwLjM2Ny4uIiwKKyIgIFNJTiAgICAgICBTaW5lIG9mIGFuZ2xlIGV4cHJlc3NlZCBpbiByYWRpYW5zICAgICAoc2luICgvIHBpIDIpKSAgICAxLjAiLAorIiAgQ09TICAgICAgIENvc2luZSBvZiBnaXZlbiBudW1iZXIgICAgICAgICAgICAgICAgIChjb3MgcGkpICAgICAgICAgLTEuMCIsCisiICBUQU4gICAgICAgVGFuZ2VudCBvZiBnaXZlbiBudW1iZXIgICAgICAgICAgICAgICAgKHRhbiBwaSkgICAgICAgICAgMC4wIiwKKyIgIExPRyAgICAgICBOYXR1cmFsIGxvZyAoYmFzZSBlKSBvZiBnaXZlbiBudW1iZXIgICAobG9nIDIuNzE4MykgICAgICAxLjAwMC4uIiwKKyIgIExPRzEwICAgICBMb2cgYmFzZSAxMCBvZiBnaXZlbiBudW1iZXIgICAgICAgICAgICAobG9nMTAgMTAwMCkgICAgICAzLjAiLAorIiAiLAorIlByZWRpY2F0ZSBvcGVyYXRvcnMgcmV0dXJuIDAgaWYgZmFsc2UsIDEgaWYgdHJ1ZSwgYW5kIGlmIGl0IGlzIHRoZSBvdXRlcm1vc3QiLAorIm9wZXJhdG9yLCBzZXRzIFNVQ0NFU1Mgb3IgRkFJTFVSRSBhY2NvcmRpbmdseToiLAorIiAiLAorIiAgPCAgICAgICAgIE9wZXJhbmRzIGluIHN0cmljdGx5IGRlc2NlbmRpbmcgb3JkZXIgICg8IDYgNSA0IDMgMiAxKSAgIDEiLAorIiAgPD0gICAgICAgIE9wZXJhbmRzIGluIGRlc2NlbmRpbmcgb3JkZXIgICAgICAgICAgICg8PSA2IDYgNSA0IDMgMikgIDEiLAorIiAgIT0gICAgICAgIE9wZXJhbmRzIGFyZSBub3QgZXF1YWwgICAgICAgICAgICAgICAgICghPSAxIDEgMS4wKSAgICAgIDAiLAorIiAgPSAgICg9PSkgIEFsbCBvcGVyYW5kcyBhcmUgZXF1YWwgICAgICAgICAgICAgICAgICg9IDMgMyAzIDMpICAgICAgIDEiLAorIiAgPiAgICAgICAgIE9wZXJhbmRzIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlciAgICg+IDEgMiAzIDQgNSA2KSAgIDEiLAorIiAgPj0gICAgICAgIE9wZXJhbmRzIGluIGFzY2VuZGluZyBvcmRlciAgICAgICAgICAgICg+IDEgMSAyIDMgNCA1KSAgIDEiLAorIiAgQU5EICgmJikgIE9wZXJhbmRzIGFyZSBhbGwgdHJ1ZSAgICAgICAgICAgICAgICAgIChhbmQgMSAxIDEgMSAwKSAgIDAiLAorIiAgT1IgICh8fCkgIEF0IGxlYXN0IG9uZSBvcGVyYW5kIGlzIHRydWUgICAgICAgICAgIChvciAxIDEgMSAxIDApICAgIDEiLAorIiAgWE9SICAgICAgIExvZ2ljYWwgRXhjbHVzaXZlIE9SICAgICAgICAgICAgICAgICAgICh4b3IgMyAxKSAgICAgICAgIDAiLAorIiAgTk9UICghKSAgIFJldmVyc2VzIHRydXRoIHZhbHVlIG9mIG9wZXJhbmQgICAgICAgIChub3QgMykgICAgICAgICAgIDAiLAorIiAiLAorIkJpdC1vcmllbnRlZCBvcGVyYXRvcnM6IiwKKyIgIiwKKyIgICYgICAgICAgICBCaXR3aXNlIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJiA3IDIpICAgICAgICAgICAyIiwKKyIgIHwgICAgICAgICBCaXR3aXNlIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAofCAxIDIgMyA0KSAgICAgICA3IiwKKyIgICMgICAgICAgICBCaXR3aXNlIEV4Y2x1c2l2ZSBPUiAgICAgICAgICAgICAgICAgICAoIyAzIDEpICAgICAgICAgICAyIiwKKyIgIH4gICAgICAgICBSZXZlcnNlcyBhbGwgYml0cyAgICAgICAgICAgICAgICAgICAgICAofiAzKSAgICAgICAgICAgIC00IiwKKyIgIiwKKyJPcGVyYXRvcnMgdGhhdCB3b3JrIG9uIHRydXRoIHZhbHVlczoiLAorIiAiLAorIiAgSUYgICAgICAgIENvbmRpdGlvbmFsIGV2YWx1YXRpb24gICAgICAgICAgICAgICAgIChpZiAoMSkgMiAzKSAgICAgIDIiLAorIiAiLAorIk9wZXJhdG9ycyBjYW4gYWxzbyBiZSBuYW1lcyBvZiBLZXJtaXQgbWFjcm9zIHRoYXQgcmV0dXJuIGVpdGhlciBudW1lcmljIiwKKyJ2YWx1ZXMgb3Igbm8gdmFsdWUgYXQgYWxsLiIsCisiICIsCisiQnVpbHQtaW4gY29uc3RhbnRzIGFyZToiLAorIiAiLAorIiAgdCAgICAgICAgIFRydWUgKDEpIiwKKyIgIG5pbCAgICAgICBGYWxzZSAoZW1wdHkpIiwKKyIgIHBpICAgICAgICBUaGUgdmFsdWUgb2YgUGkgKDMuMTQxNTkyNi4uLikiLAorIiAiLAorIklmIFNFVCBTRVhQUkVTU0lPTiBFQ0hPLVJFU1VMVCBpcyBBVVRPICh0aGUgZGVmYXVsdCksIHRoZSB2YWx1ZSBvZiB0aGUiLAorIlMtRXhwcmVzc2lvbiBpcyBwcmludGVkIGlmIHRoZSBTLUV4cHJlc3Npb24gaXMgZ2l2ZW4gYXQgdG9wIGxldmVsOyBpZiBPTiwiLAorIml0IGlzIHByaW50ZWQgYXQgYW55IGxldmVsOyBpZiBPRkYgaXQgaXMgbm90IHByaW50ZWQuICBBdCBhbGwgbGV2ZWxzLCB0aGUiLAorInZhcmlhYmxlIFxcdihzZXhwcmVzc2lvbikgaXMgc2V0IHRvIHRoZSBtb3N0IHJlY2VudCBTLUV4cHJlc3Npb24sIGFuZCIsCisiXFx2KHN2YWx1ZSkgaXMgc2V0IHRvIGl0cyB2YWx1ZS4gIFlvdSBjYW4gdXNlIHRoZSBcXGZzZXhwcmVzc3Npb24oKSBmdW5jdGlvbiIsCisidG8gZXZhbHVhdGUgYW4gUy1FeHByZXNzaW9uIGFueXdoZXJlIGluIGEgS2VybWl0IGNvbW1hbmQuIiwKKyIiCit9OworI2VuZGlmIC8qIE5PU0VYUCAqLworI2VuZGlmIC8qIE5PU1BMICovCisKK3N0YXRpYyBjaGFyICpobXh4Z3JlcFtdID0geworI2lmZGVmIFVOSVhPUk9TSworIlN5bnRheDogR1JFUCBbIG9wdGlvbnMgXSBwYXR0ZXJuIGZpbGVzcGVjIiwKKyNlbHNlCisiU3ludGF4OiBGSU5EIFsgb3B0aW9ucyBdIHBhdHRlcm4gZmlsZXNwZWMiLAorI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworIiAgU2VhcmNoZXMgdGhyb3VnaCB0aGUgZ2l2ZW4gZmlsZSBvciBmaWxlcyBmb3IgdGhlIGdpdmVuIGNoYXJhY3RlciBzdHJpbmciLAorIiAgb3IgcGF0dGVybi4gIEluIHRoZSBub3JtYWwgY2FzZSwgYWxsIGxpbmVzIGNvbnRhaW5pbmcgYW55IHRleHQgdGhhdCBtYXRjaGVzIgorLAorIiAgdGhlIHBhdHRlcm4gYXJlIHByaW50ZWQuICBQYXR0ZXJuIHN5bnRheCBpcyBhcyBkZXNjcmliZWQgaW4gSEVMUCBQQVRURVJOUyIsCisiICBleGNlcHQgdGhhdCAnKicgaXMgaW1wbGllZCBhdCB0aGUgYmVnaW5uaW5nIHVubGVzcyB0aGUgcGF0dGVybiBzdGFydHMgd2l0aCIsCisiICAnXicgYW5kIGFsc28gYXQgdGhlIGVuZCB1bmxlc3MgdGhlIHBhdHRlcm4gZW5kcyB3aXRoICckJy4gIFRoZXJlZm9yZSwiLAorIiAgXCJncmVwIHNvbWV0aGluZyAqLnR4dFwiIGxpc3RzIGFsbCBsaW5lcyBpbiBhbGwgKi50eHQgZmlsZXMgdGhhdCBjb250YWluIiwKKyIgIHRoZSB3b3JkIFwic29tZXRoaW5nXCIsIGJ1dCBcImdyZXAgXnNvbWV0aGluZyAqLnR4dFwiIGxpc3RzIG9ubHkgdGhlIGxpbmVzIiwKKyIgIHRoYXQgU1RBUlQgd2l0aCBcInNvbWV0aGluZ1wiLiAgVGhlIGNvbW1hbmQgc3VjY2VlZHMgaWYgYW55IG9mIHRoZSBnaXZlbiIsCisiICBmaWxlcyBjb250YWluZWQgYW55IGxpbmVzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4sIG90aGVyd2lzZSBpdCBmYWlscy4iLAorI2lmZGVmIFVOSVhPUk9TSworIiAgU3lub255bTogRklORC4iLAorI2Vsc2UKKyIgIFN5bm9ueW06IEdSRVAuIiwKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyIgIiwKKyJGaWxlIHNlbGVjdGlvbiBvcHRpb25zOiIsCisiICAvTk9CQUNLVVBGSUxFUyIsCisiICAgIEV4Y2x1ZGVzIGJhY2t1cCBmaWxlcyAobGlrZSBvb2ZhLnR4dC5+M34pIGZyb20gdGhlIHNlYXJjaC4iLAorIiAgL0RPVEZJTEVTIiwKKyIgICAgSW5jbHVkZXMgZmlsZXMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCBkb3QgKC4pIGluIHRoZSBzZWFyY2guIiwKKyIgIC9OT0RPVEZJTEVTIiwKKyIgICAgRXhjbHVkZXMgZmlsZXMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCBkb3QgKC4pIGZyb20gdGhlIHNlYXJjaC4iLAorI2lmZGVmIFJFQ1VSU0lWRQorIiAgL1JFQ1VSU0lWRSIsCisiICAgIFNlYXJjaGVzIHRocm91Z2ggZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMgdG9vLiIsCisjZW5kaWYgLyogUkVDVVJTSVZFICovCisiICAvVFlQRTpURVhUIiwKKyIgICAgU2VhcmNoIG9ubHkgdGV4dCBmaWxlcyAocmVxdWlyZXMgRklMRSBTQ0FOIE9OKS4iLAorIiAgL1RZUEU6QklOQVJZIiwKKyIgICAgU2VhcmNoIG9ubHkgYmluYXJ5IGZpbGVzIChyZXF1aXJlcyBGSUxFIFNDQU4gT04pLiIsCisiICIsCisiUGF0dGVybi1tYXRjaGluZyBvcHRpb25zOiIsCisiICAvTk9DQVNFIiwKKyIgICAgSWdub3JlcyBjYXNlIG9mIGxldHRlcnMgKEFTQ0lJIG9ubHkpIHdoZW4gY29tcGFyaW5nLiIsCisiICAvTk9NQVRDSCIsCisiICAgIFNlYXJjaGVzIGZvciBsaW5lcyB0aGF0IGRvIE5PVCBtYXRjaCB0aGUgcGF0dGVybi4iLAorIiAiLAorIkRpc3BsYXkgb3B0aW9uczoiLAorIiAgL0NPVU5UOnZhcmlhYmxlLW5hbWUiLAorIiAgICBGb3IgZWFjaCBmaWxlLCBwcmludHMgb25seSB0aGUgZmlsZW5hbWUgYW5kIGEgY291bnQgb2YgbWF0Y2hpbmcgbGluZXMiLAorIiAgICBhbmQgYXNzaWducyB0aGUgdG90YWwgbWF0Y2ggY291bnQgdG8gdGhlIHZhcmlhYmxlLCBpZiBvbmUgaXMgZ2l2ZW4uIiwKKyIgIC9OQU1FT05MWSIsCisiICAgIFByaW50cyB0aGUgbmFtZSBvZiBlYWNoIGZpbGUgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgbWF0Y2hpbmcgbGluZSwiLAorIiAgICBvbmUgbmFtZSBwZXIgbGluZSwgcmF0aGVyIHRoYW4gc2hvd2luZyBlYWNoIG1hdGNoaW5nIGxpbmUuIiwKKyIgIC9OT0xJU1QiLAorIiAgICBEb2Vzbid0IHByaW50IGFueXRoaW5nIChidXQgc2V0cyBTVUNDRVNTIG9yIEZBSUxVUkUgYXBwcm9wcmlhdGVseSkuIiwKKyIgIC9MSU5FTlVNQkVSUyIsCisiICAgIFByZWNlZGVzIGVhY2ggZmlsZSBsaW5lIGJ5IGl0cyBsaW5lIG51bWJlciB3aXRoaW4gdGhlIGZpbGUuIiwKKyIgIC9QQUdFIiwKKyIgICAgUGF1c2VzIGFmdGVyIGVhY2ggc2NyZWVuZnVsLiIsCisiICAvTk9QQUdFIiwKKyIgICAgRG9lc24ndCBwYXVzZSBhZnRlciBlYWNoIHNjcmVlbmZ1bC4iLAorIiAgL09VVFBVVDpuYW1lIiwKKyIgICAgU2VuZHMgcmVzdWx0cyB0byB0aGUgZ2l2ZW4gZmlsZS4gIElmIHRoaXMgc3dpdGNoIGlzIG9taXR0ZWQsIHRoZSIsCisiICAgIHJlc3VsdHMgYXBwZWFyIG9uIHlvdXIgc2NyZWVuLiAgVGhpcyBzd2l0Y2ggb3ZlcnJpZGVzIGFueSBleHByZXNzIG9yIiwKKyIgICAgaW1wbGllZCAvUEFHRSBzd2l0Y2guIiwKKyIifTsKKworc3RhdGljIGNoYXIgKmhteHhkaXJbXSA9IHsKKyNpZmRlZiBET01ZRElSCisiU3ludGF4OiBESVJFQ1RPUlkgWyBzd2l0Y2hlcyBdIFsgZmlsZXNwZWMgWyBmaWxlc3BlYyBbIC4uLiBdIF0gXSIsCisjaWZkZWYgTE9DVVMKKyIgIElmIExPQ1VTIGlzIFJFTU9URSBvciBMT0NVUyBpcyBBVVRPIGFuZCB5b3UgaGF2ZSBhbiBGVFAgY29ubmVjdGlvbiwiLAorIiAgdGhpcyBjb21tYW5kIGlzIGVxdWl2YWxlbnQgdG8gUkVNT1RFIERJUkVDVE9SWSAoUkRJUikuICBPdGhlcndpc2U6IiwKKyIgIiwKKyNlbmRpZiAvKiBMT0NVUyAqLworIiAgTGlzdHMgbG9jYWwgZmlsZXMuICBUaGUgZmlsZXNwZWMgbWF5IGJlIGEgZmlsZW5hbWUsIHBvc3NpYmx5IGNvbnRhaW5pbmciLAorIiAgd2lsZGNhcmQgY2hhcmFjdGVycywgb3IgYSBkaXJlY3RvcnkgbmFtZS4gIElmIG5vIGZpbGVzcGVjIGlzIGdpdmVuLCBhbGwiLAorIiAgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFyZSBsaXN0ZWQuICBJZiBhIGRpcmVjdG9yeSBuYW1lIGlzIGdpdmVuLCIsCisiICBhbGwgdGhlICBmaWxlcyBpbiBpdCBhcmUgbGlzdGVkLiAgTXVsdGlwbGUgZmlsZXNwZWNzIGNhbiBiZSBnaXZlbi4iLAorIiAgT3B0aW9uYWwgc3dpdGNoZXM6IiwKKyIgIiwKKyIgICAvQlJJRUYgICAgICAgICAgIExpc3QgZmlsZW5hbWVzIG9ubHkuIiwKKyNpZmRlZiBDS19QRVJNUworIiAgIC9WRVJCT1NFICAgICAgICsgQWxzbyBsaXN0IHBlcm1pc3Npb25zLCBzaXplLCBhbmQgZGF0ZS4iLAorI2Vsc2UKKyIgICAvVkVSQk9TRSAgICAgICArIEFsc28gbGlzdCBkYXRlIGFuZCBzaXplLiIsCisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKyIgICAvRklMRVMgICAgICAgICAgIFNob3cgZmlsZXMgYnV0IG5vdCBkaXJlY3Rvcmllcy4iLAorIiAgIC9ESVJFQ1RPUklFUyAgICAgU2hvdyBkaXJlY3RvcmllcyBidXQgbm90IGZpbGVzLiIsCisiICAgL0FMTCAgICAgICAgICAgKyBTaG93IGJvdGggZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiIsCisiICAgL0FSUkFZOiZhICAgICAgICBTdG9yZSBmaWxlIGxpc3QgaW4gc3BlY2lmaWVkIGFycmF5IChlLmcuIFxcJWFbXSkuIiwKKyIgICAvUEFHRSAgICAgICAgICAgIFBhdXNlIGFmdGVyIGVhY2ggc2NyZWVuZnVsLiIsCisiICAgL05PUEFHRSAgICAgICAgICBEb24ndCBwYXVzZSBhZnRlciBlYWNoIHNjcmVlbmZ1bC4iLAorI2lmZGVmIFVOSVhPUk9TSworIiAgIC9ET1RGSUxFUyAgICAgICAgSW5jbHVkZSBmaWxlcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIGRvdCAocGVyaW9kKS4iLAorIiAgIC9OT0RPVEZJTEVTICAgICsgRG9uJ3QgaW5jbHVkZSBmaWxlcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIGRvdC4iLAorIiAgIC9GT0xMT1dMSU5LUyAgICAgRm9sbG93IHN5bWJvbGljIGxpbmtzLiIsCisiICAgL05PRk9MTE9XTElOS1MgKyBEb24ndCBmb2xsb3cgc3ltYm9saWMgbGlua3MuIiwKKyIgICAvQkFDS1VQICAgICAgICArIEluY2x1ZGUgYmFja3VwIGZpbGVzIChuYW1lcyBlbmQgd2l0aCAufm5+KS4iLAorIiAgIC9OT0JBQ0tVUEZJTEVTICAgRG9uJ3QgaW5jbHVkZSBiYWNrdXAgZmlsZXMuIiwKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyIgICAvT1VUUFVUOmZpbGUgICAgIFN0b3JlIGRpcmVjdG9yeSBsaXN0aW5nIGluIHRoZSBnaXZlbiBmaWxlLiIsCisiICAgL0hFQURJTkcgICAgICAgICBJbmNsdWRlIGhlYWRpbmcgYW5kIHN1bW1hcnkuIiwKKyIgICAvTk9IRUFESU5HICAgICArIERvbid0IGluY2x1ZGUgaGVhZGluZyBvciBzdW1tYXJ5LiIsCisiICAgL1NVTU1BUlkgICAgICAgICBQcmludCBvbmx5IGNvdW50IGFuZCB0b3RhbCBzaXplIG9mIG1hdGNoaW5nIGZpbGVzLiIsCisiICAgL1hGRVJNT0RFICAgICAgICBTaG93IHBhdHRlcm4tYmFzZWQgdHJhbnNmZXIgbW9kZSAoVD1UZXh0LCBCPUJpbmFyeSkuIiwKKyIgICAvVFlQRTogICAgICAgICAgIFNob3cgb25seSBmaWxlcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgKHRleHQgb3IgYmluYXJ5KS4iLAorIiAgIC9NRVNTQUdFOnRleHQgICAgQWRkIGJyaWVmIG1lc3NhZ2UgdG8gZWFjaCBsaXN0aW5nIGxpbmUuIiwKKyIgICAvTk9NRVNTQUdFICAgICArIERvbid0IGFkZCBtZXNzYWdlIHRvIGVhY2ggbGlzdGluZyBsaW5lLiIsCisiICAgL05PWEZFUk1PREUgICAgKyBEb24ndCBzaG93IHBhdHRlcm4tYmFzZWQgdHJhbnNmZXIgbW9kZSIsCisiICAgL0lTT0RBVEUgICAgICAgKyBJbiB2ZXJib3NlIGxpc3RpbmdzLCBzaG93IGRhdGUgaW4gSVNPIDgwNjEgZm9ybWF0LiIsCisiICAgL0VOR0xJU0hEQVRFICAgICBJbiB2ZXJib3NlIGxpc3RpbmdzLCBzaG93IGRhdGUgaW4gXCJFbmdsaXNoXCIgZm9ybWF0LiIsCisjaWZkZWYgUkVDVVJTSVZFCisiICAgL1JFQ1VSU0lWRSAgICAgICBEZXNjZW5kIHRocm91Z2ggc3ViZGlyZWN0b3JpZXMuIiwKKyIgICAvTk9SRUNVUlNJVkUgICArIERvbid0IGRlc2NlbmQgdGhyb3VnaCBzdWJkaXJlY3Rvcmllcy4iLAorI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworIiAgIC9TT1JUOmtleSAgICAgICAgU29ydCBieSBrZXksIE5BTUUsIERBVEUsIG9yIFNJWkU7IGRlZmF1bHQga2V5IGlzIE5BTUUuIiwKKyIgICAvTk9TT1JUICAgICAgICArIERvbid0IHNvcnQuIiwKKyIgICAvQVNDRU5ESU5HICAgICArIElmIHNvcnRpbmcsIHNvcnQgaW4gYXNjZW5kaW5nIG9yZGVyLiIsCisiICAgL1JFVkVSU0UgICAgICAgICBJZiBzb3J0aW5nLCBzb3J0IGluIHJldmVyc2Ugb3JkZXIuIiwKKyIgIiwKKyJGYWN0b3J5IGRlZmF1bHRzIGFyZSBtYXJrZWQgd2l0aCArLiAgRGVmYXVsdCBmb3IgcGFnaW5nIGRlcGVuZHMgb24gU0VUIiwKKyJDT01NQU5EIE1PUkUtUFJPTVBUSU5HLiAgVXNlIFNFVCBPUFRJT05TIERJUkVDVE9SWSBbIHN3aXRjaGVzIF0gdG8gY2hhbmdlIiwKKyJkZWZhdWx0czsgdXNlIFNIT1cgT1BUSU9OUyB0byBkaXNwbGF5IGN1c3RvbWl6ZWQgZGVmYXVsdHMuIiwKKyNlbHNlCisiU3ludGF4OiBESVJFQ1RPUlkgWyBmaWxlc3BlYyBdIiwKKyIgIExpc3RzIHRoZSBzcGVjaWZpZWQgZmlsZSBvciBmaWxlcy4gIElmIG5vIGZpbGVzcGVjIGlzIGdpdmVuLCBhbGwgZmlsZXMiLAorIiAgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFyZSBsaXN0ZWQuIiwKKyNlbmRpZiAvKiBET01ZRElSICovCisiIn07CisKKworI2lmbmRlZiBOT1NQTAorc3RhdGljIGNoYXIgKmhteHhrY2RbXSA9IHsKKyJTeW50YXg6IEtDRCBzeW1ib2xpYy1kaXJlY3RvcnktbmFtZSIsCisiICBLZXJtaXQgQ2hhbmdlIERpcmVjdG9yeTogTGlrZSBDRCAocS52LikgYnV0IChhKSBhbHdheXMgYWN0cyBsb2NhbGx5LCBhbmQiLAorIiAgKGIpIHRha2VzIGEgc3ltYm9saWMgZGlyZWN0b3J5IG5hbWUgcmF0aGVyIHRoYW4gYW4gYWN0dWFsIGRpcmVjdG9yeSBuYW1lLiIsCisiICBUaGUgc3ltYm9saWMgbmFtZXMgY29ycmVzcG9uZCB0byBLZXJtaXQncyBkaXJlY3RvcnktdmFsdWVkIGJ1aWx0LWluIiwKKyIgIHZhcmlhYmxlcywgc3VjaCBhcyBcXHYoZG93bmxvYWQpLCBcXHYoZXhlZGlyKSwgYW5kIHNvIG9uLiAgSGVyZSdzIHRoZSBsaXN0OiIKKywKKyIgIiwKKyNpZmRlZiBOVAorIiAgICBhcHBkYXRhICAgICAgIFlvdXIgcGVyc29uYWwgS2VybWl0IDk1IGFwcGxpY2F0aW9uIGRhdGEgZGlyZWN0b3J5IiwKKyIgICAgY29tbW9uICAgICAgICBLZXJtaXQgOTUncyBhcHBsaWNhdGlvbiBkYXRhIGRpcmVjdG9yeSBmb3IgYWxsIHVzZXJzIiwKKyIgICAgZGVza3RvcCAgICAgICBZb3VyIFdpbmRvd3MgZGVza3RvcCIsCisjZW5kaWYgLyogTlQgKi8KKyIgICAgZG93bmxvYWQgICAgICBZb3VyIGRvd25sb2FkIGRpcmVjdG9yeSAoaWYgYW55KSIsCisjaWZkZWYgT1MyT1JVTklYCisiICAgIGV4ZWRpciAgICAgICAgVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgS2VybWl0IGV4ZWN1dGFibGUgcmVzaWRlcyIsCisjZW5kaWYgLyogT1MyT1JVTklYICovCisiICAgIGhvbWUgICAgICAgICAgWW91ciBob21lLCBsb2dpbiwgb3IgZGVmYXVsdCBkaXJlY3RvcnkiLAorIiAgICBpbmlkaXIgICAgICAgIFRoZSBkaXJlY3Rvcnkgd2hlcmUgS2VybWl0J3MgaW5pdGlhbGl6YXRpb24gd2FzIGZvdW5kIiwKKyNpZmRlZiBVTklYCisiICAgIGxvY2tkaXIgICAgICAgVGhlIFVOSVggVVVDUCBsb2NrZmlsZSBkaXJlY3Rvcnkgb24gdGhpcyBjb21wdXRlciIsCisjZW5kaWYgLyogVU5JWCAqLworI2lmZGVmIE5UCisiICAgIHBlcnNvbmFsICAgICAgWW91ciBcIk15IERvY3VtZW50c1wiIGRpcmVjdG9yeSIsCisjZW5kaWYgLyogTlQgKi8KKyIgICAgc3RhcnR1cCAgICAgICBZb3VyIGN1cnJlbnQgZGlyZWN0b3J5IGF0IHRoZSB0aW1lIEtlcm1pdCBzdGFydGVkIiwKKyIgICAgdGV4dGRpciAgICAgICBUaGUgZGlyZWN0b3J5IHdoZXJlIEtlcm1pdCB0ZXh0IGZpbGVzIHJlc2lkZSwgaWYgYW55IiwKKyIgICAgdG1wZGlyICAgICAgICBZb3VyIHRlbXBvcmFyeSBkaXJlY3RvcnkiLAorIiAiLAorIiAgQWxzbyBzZWUgQ0QsIFNFVCBGSUxFIERPV05MT0FELCBTRVQgVEVNUC1ESVJFQ1RPUlkuIiwKKyIiCit9OworI2VuZGlmIC8qIE5PU1BMICovCisKK3N0YXRpYyBjaGFyICpobXh4Y3dkW10gPSB7CisjaWZkZWYgTE9DVVMKKyIgIElmIExPQ1VTIGlzIFJFTU9URSBvciBMT0NVUyBpcyBBVVRPIGFuZCB5b3UgaGF2ZSBhbiBGVFAgY29ubmVjdGlvbiwiLAorIiAgdGhpcyBjb21tYW5kIGlzIGVxdWl2YWxlbnQgdG8gUkVNT1RFIENEIChSQ0QpLiAgT3RoZXJ3aXNlOiIsCisiICIsCisjZW5kaWYgLyogTE9DVVMgKi8KKyNpZmRlZiB2bXMKKyJTeW50YXg6IENEIFsgZGlyZWN0b3J5IG9yIGRldmljZTpkaXJlY3RvcnkgXSIsCisiICBDaGFuZ2UgV29ya2luZyBEaXJlY3RvcnkuICBFcXVpdmFsZW50IHRvIFZNUyBTRVQgREVGQVVMVCBjb21tYW5kLiIsCisjZWxzZQorI2lmZGVmIGRhdGFnZW5lcmFsCisiQ2hhbmdlIFdvcmtpbmcgRGlyZWN0b3J5LCBlcXVpdmFsZW50IHRvIEFPUy9WUyAnZGlyJyBjb21tYW5kLiIsCisjZWxzZQorI2lmZGVmIE9TMgorIlN5bnRheDogQ0QgWyBkaXNrIG9yIGRpcmVjdG9yeSBuYW1lIF0iLAorIiAgQ2hhbmdlIERpc2sgb3IgRGlyZWN0b3J5LiAgSWYgYSBkaXNrIG9yIGRpcmVjdG9yeSBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIiwKKyIgIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgYmVjb21lcyB0aGUgb25lIHNwZWNpZmllZCBieSBIT01FIGVudmlyb25tZW50IiwKKyIgIHZhcmlhYmxlLCBpZiBhbnkuICBBIGRpc2sgbGV0dGVyIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBjb2xvbi4iLAorI2Vsc2UKKyJTeW50YXg6IENEIFsgZGlyZWN0b3J5IG5hbWUgXSIsCisiICBDaGFuZ2UgRGlyZWN0b3J5LiAgQ2hhbmdlcyB5b3VyIGN1cnJlbnQsIHdvcmtpbmcsIGRlZmF1bHQgZGlyZWN0b3J5IHRvIHRoZSIsCisiICBvbmUgZ2l2ZW4sIHNvIHRoYXQgZnV0dXJlIG5vbi1hYnNvbHV0ZSBmaWxlbmFtZSByZWZlcmVuY2VzIGFyZSByZWxhdGl2ZSB0byIsCisiICB0aGlzIGRpcmVjdG9yeS4gIElmIHRoZSBkaXJlY3RvcnkgbmFtZSBpcyBvbWl0dGVkLCB5b3VyIGhvbWUgKGxvZ2luKSIsCisiICBkaXJlY3RvcnkgaXMgc3VwcGxpZWQuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIHZtcyAqLworIiAgQy1LZXJtaXQncyBkZWZhdWx0IHByb21wdCBzaG93cyB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5LiIsCisiICBTeW5vbnltczogTENELCBDV0QuIiwKKyNpZmRlZiBMT0NVUworIiAgQWxzbyBzZWU6IFNFVCBMT0NVUywgUFdELCBDRFVQLCBCQUNLLCBSRU1PVEUgQ0QgKFJDRCksIFNFVCBDRCwgU0VUIFBST01QVC4iLAorI2Vsc2UKKyIgIEFsc28gc2VlOiBQV0QsIENEVVAsIEJBQ0ssIFJFTU9URSBDRCAoUkNEKSwgU0VUIENELCBTRVQgUFJPTVBULiIsCisjZW5kaWYgLyogTE9DVVMgKi8KKyNpZm5kZWYgTk9TUEwKKyIgIEFuZCBzZWU6IEhFTFAgS0NELiIsCisjZW5kaWYgLyogTk9TUEwgKi8KKyIgIFJlbGV2YW50IGVudmlyb25tZW50IHZhcmlhYmxlczogQ0RQQVRILCBIT01FLiIsCisiIn07CisKK3N0YXRpYyBjaGFyICpobXh4ZGVsW10gPSB7CisiU3ludGF4OiBERUxFVEUgWyBzd2l0Y2hlcy4uLiBdIGZpbGVzcGVjIiwKKyNpZmRlZiBMT0NVUworIiAgSWYgTE9DVVMgaXMgUkVNT1RFIG9yIExPQ1VTIGlzIEFVVE8gYW5kIHlvdSBoYXZlIGFuIEZUUCBjb25uZWN0aW9uLCIsCisiICB0aGlzIGNvbW1hbmQgaXMgZXF1aXZhbGVudCB0byBSRU1PVEUgREVMRVRFIChSREVMRVRFKS4gIE90aGVyd2lzZToiLAorIiAiLAorI2VuZGlmIC8qIExPQ1VTICovCisiICBEZWxldGVzIGEgZmlsZSBvciBmaWxlcyBvbiB0aGUgY29tcHV0ZXIgd2hlcmUgQy1LZXJtaXQgaXMgcnVubmluZy4iLAorIiAgVGhlIGZpbGVzcGVjIG1heSBkZW5vdGUgYSBzaW5nbGUgZmlsZSBvciBjYW4gaW5jbHVkZSB3aWxkY2FyZCBjaGFyYWN0ZXJzIiwKKyIgIHRvIG1hdGNoIG11bHRpcGxlIGZpbGVzLiAgUk0gaXMgYSBzeW5vbnltIGZvciBERUxFVEUuICBTd2l0Y2hlcyBpbmNsdWRlOiIsCisiICIsCisiL0FGVEVSOmRhdGUtdGltZSIsCisjaWZkZWYgVk1TCisiICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUtdGltZSBhcmUiLAorI2Vsc2UKKyIgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgbW9kaWZpZWQgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUtdGltZSBhcmUiLAorI2VuZGlmIC8qIFZNUyAqLworIiAgdG8gYmUgZGVsZXRlZC4gIEhFTFAgREFURSBmb3IgaW5mbyBhYm91dCBkYXRlLXRpbWUgZm9ybWF0cy4iLAorIiAiLAorIi9CRUZPUkU6ZGF0ZS10aW1lIiwKKyNpZmRlZiBWTVMKKyIgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgbW9kaWZpZWQgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLXRpbWUiLAorI2Vsc2UKKyIgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgbW9kaWZpZWQgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLXRpbWUiLAorI2VuZGlmIC8qIFZNUyAqLworIiAgYXJlIHRvIGJlIGRlbGV0ZWQuIiwKKyIgIiwKKyIvTk9ULUFGVEVSOmRhdGUtdGltZSIsCisjaWZkZWYgVk1TCisiICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIG1vZGlmaWVkIGF0IG9yIGJlZm9yZSB0aGUgZ2l2ZW4gZGF0ZS10aW1lIiwKKyNlbHNlCisiICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIG1vZGlmaWVkIGF0IG9yIGJlZm9yZSB0aGUgZ2l2ZW4gZGF0ZS10aW1lIiwKKyNlbmRpZiAvKiBWTVMgKi8KKyIgIGFyZSB0byBiZSBkZWxldGVkLiIsCisiICIsCisiL05PVC1CRUZPUkU6ZGF0ZS10aW1lIiwKKyNpZmRlZiBWTVMKKyIgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgbW9kaWZpZWQgYXQgb3IgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUtdGltZSIsCisjZWxzZQorIiAgU3BlY2lmaWVzIHRoYXQgb25seSB0aG9zZSBmaWxlcyBtb2RpZmllZCBhdCBvciBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS10aW1lIiwKKyNlbmRpZiAvKiBWTVMgKi8KKyIgIGFyZSB0byBiZSBkZWxldGVkLiIsCisiICIsCisiL0xBUkdFUi1USEFOOm51bWJlciIsCisiICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIGxvbmdlciB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgYXJlIiwKKyIgIHRvIGJlIGRlbGV0ZWQuIiwKKyIgIiwKKyIvU01BTExFUi1USEFOOm51bWJlciIsCisiICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIHNtYWxsZXIgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGFyZSIsCisiICB0byBiZSBzZW50LiIsCisiICIsCisiL0VYQ0VQVDpwYXR0ZXJuIiwKKyIgIFNwZWNpZmllcyB0aGF0IGFueSBmaWxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcGF0dGVybiwgd2hpY2ggY2FuIGJlIGEiLAorIiAgcmVndWxhciBmaWxlbmFtZSBvciBtYXkgY29udGFpbiB3aWxkY2FyZHMsIGFyZSBub3QgdG8gYmUgZGVsZXRlZC4gIFRvIiwKKyIgIHNwZWNpZnkgbXVsdGlwbGUgcGF0dGVybnMgKHVwIHRvIDgpLCB1c2Ugb3V0ZXIgYnJhY2VzIGFyb3VuZCB0aGUgZ3JvdXAiLAorIiAgYW5kIGlubmVyIGJyYWNlcyBhcm91bmQgZWFjaCBwYXR0ZXJuOiIsCisiICIsCisiICAgIC9FWENFUFQ6e3twYXR0ZXJuMX17cGF0dGVybjJ9Li4ufSIsCisiICIsCisjaWZkZWYgVU5JWE9ST1NLCisiL0RPVEZJTEVTIiwKKyIgIEluY2x1ZGUgKGRlbGV0ZSkgZmlsZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBcIi5cIi4iLAorIiAiLAorIi9OT0RPVEZJTEVTIiwKKyIgIFNraXAgKGRvbid0IGRlbGV0ZSkgZmlsZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBcIi5cIi4iLAorIiAiLAorI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworIi9UWVBFOlRFWFQiLAorIiAgRGVsZXRlIG9ubHkgcmVndWxhciB0ZXh0IGZpbGVzIChyZXF1aXJlcyBGSUxFIFNDQU4gT04pIiwKKyIgIiwKKyIvVFlQRTpCSU5BUlkiLAorIiAgRGVsZXRlIG9ubHkgcmVndWxhciBiaW5hcnkgZmlsZXMgKHJlcXVpcmVzIEZJTEUgU0NBTiBPTikiLAorIiAiLAorIi9ESVJFQ1RPUklFUyIsCisiICBJbmNsdWRlIGRpcmVjdG9yaWVzLiAgSWYgdGhpcyBzd2l0Y2ggaXMgbm90IGdpdmVuLCBvbmx5IHJlZ3VsYXIgZmlsZXMiLAorIiAgYXJlIGRlbGV0ZWQuICBJZiBpdCBpcyBnaXZlbiwgS2VybWl0IGF0dGVtcHRzIHRvIGRlbGV0ZSBhbnkgZGlyZWN0b3JpZXMiLAorIiAgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gZmlsZSBzcGVjaWZpY2F0aW9uLCB3aGljaCBzdWNjZWVkcyBvbmx5IGlmIHRoZSIsCisiICBkaXJlY3RvcnkgaXMgZW1wdHkuIiwKKyIgIiwKKyNpZmRlZiBSRUNVUlNJVkUKKyIvUkVDVVJTSVZFIiwKKyIgIFRoZSBERUxFVEUgY29tbWFuZCBhcHBsaWVzIHRvIHRoZSBlbnRpcmUgZGlyZWN0b3J5IHRyZWUgcm9vdGVkIGluIHRoZSIsCisiICBjdXJyZW50IG9yIHNwZWNpZmllZCBkaXJlY3RvcnkuICBXaGVuIHRoZSAvRElSRUNUT1JJRVMgc3dpdGNoIGlzIGFsc28iLAorIiAgZ2l2ZW4sIEtlcm1pdCBkZWxldGVzIGFsbCB0aGUgKG1hdGNoaW5nKSBmaWxlcyBpbiBlYWNoIGRpcmVjdG9yeSBiZWZvcmUiLAorIiAgYXR0ZW1wdGluZyB0byBkZWxldGUgdGhlIGRpcmVjdG9yeSBpdHNlbGYuIiwKKyIgIiwKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyNpZmRlZiBVTklYCisjaWZkZWYgUkVDVVJTSVZFCisiL0FMTCIsCisiICBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIC9SRUNVUlNJVkUgL0RJUkVDVE9SSUVTIC9ET1RGSUxFUy4iLAorI2Vsc2UKKyIvQUxMIiwKKyIgIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3IgL0RJUkVDVE9SSUVTIC9ET1RGSUxFUy4iLAorI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworI2Vsc2UgIC8qICFVTklYICovCisjaWZkZWYgUkVDVVJTSVZFCisiL0FMTCIsCisiICBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIC9SRUNVUlNJVkUgL0RJUkVDVE9SSUVTLiIsCisjZWxzZQorIi9BTEwiLAorIiAgVGhpcyBpcyBhIHN5bm9ueW0gZm9yIC9ESVJFQ1RPUklFUy4iLAorI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworI2VuZGlmIC8qIFVOSVggKi8KKyIgIiwKKyIvTElTVCIsCisiICBMaXN0IGVhY2ggZmlsZSBhbmQgdGVsbCB3aGV0aGVyIGl0IHdhcyBkZWxldGVkLiAgU3lub255bXM6IC9MT0csIC9WRVJCT1NFLiIsCisiICIsCisiL05PTElTVCIsCisiICBEb24ndCBsaXN0IGZpbGVzIHdoaWxlIGRlbGV0aW5nLiAgU3lub255bXM6IC9OT0xPRywgL1FVSUVULiIsCisiICIsCisiL0hFQURJTkciLAorIiAgUHJpbnQgaGVhZGluZyBhbmQgc3VtbWFyeSBpbmZvcm1hdGlvbi4iLAorIiAiLAorIi9OT0hFQURJTkciLAorIiAgRG9uJ3QgcHJpbnQgaGVhZGluZyBhbmQgc3VtbWFyeSBpbmZvcm1hdGlvbi4iLAorIiAiLAorIi9TVU1NQVJZIiwKKyIgIExpa2UgL0hFQURJTkcgL05PTElTVCwgYnV0IG9ubHkgcHJpbnRzIHRoZSBzdW1tYXJ5IGxpbmUuIiwKKyIgIiwKKyIvUEFHRSIsCisiICBJZiBsaXN0aW5nLCBwYXVzZSBhZnRlciBlYWNoIHNjcmVlbmZ1bC4iLAorIiAiLAorIi9OT1BBR0UiLAorIiAgRG9uJ3QgcGF1c2UgYWZ0ZXIgZWFjaCBzY3JlZW5mdWwuIiwKKyIgIiwKKyIvQVNLIiwKKyIgIEludGVyYWN0aXZlbHkgYXNrIHBlcm1pc3Npb24gdG8gZGVsZXRlIGVhY2ggZmlsZS4gIFJlcGx5IFllcyBvciBPSyB0byIsCisiICBkZWxldGUgaXQsIE5vIG5vdCB0byBkZWxldGUgaXQsIFF1aXQgdG8gY2FuY2VsIHRoZSBERUxFVEUgY29tbWFuZCwgYW5kIiwKKyIgIEdvIHRvIGdvIGFoZWFkIGFuZCBkZWxldGUgYWxsIHRoZSByZXN0IG9mIHRoZSBmaWxlcyB3aXRob3V0IGFza2luZy4iLAorIiAiLAorIi9OT0FTSyIsCisiICBEZWxldGUgZmlsZXMgd2l0aG91dCBhc2tpbmcgcGVybWlzc2lvbi4iLAorIiAiLAorIi9TSU1VTEFURSIsCisiICBQcmV2aWV3IGZpbGVzIHNlbGVjdGVkIGZvciBkZWxldGlvbiB3aXRob3V0IGFjdHVhbGx5IGRlbGV0aW5nIHRoZW0uIiwKKyIgIEltcGxpZXMgL0xJU1QuIiwKKyIgIiwKKyJVc2UgU0VUIE9QVElPTlMgREVMRVRFIHRvIG1ha2Ugc2VsZWN0ZWQgc3dpdGNoZXMgZWZmZWN0aXZlIGZvciBldmVyeSBERUxFVEUiLAorImNvbW1hbmQgXAordW5sZXNzIHlvdSBvdmVycmlkZSB0aGVtOyB1c2UgU0hPVyBPUFRJT05TIHRvIHNlZSBzZWxlY3Rpb25zIGN1cnJlbnRseSIsCisjaWZkZWYgTE9DVVMKKyJpbiBlZmZlY3QuICBBbHNvIHNlZSBIRUxQIFNFVCBMT0NVUywgSEVMUCBQVVJHRSwgSEVMUCBXSUxEQ0FSRC4iLAorI2Vsc2UKKyJpbiBlZmZlY3QuICBBbHNvIHNlZSBIRUxQIFBVUkdFLCBIRUxQIFdJTERDQVJELiIsCisjZW5kaWYgLyogTE9DVVMgKi8KKyIifTsKKworI2lmbmRlZiBOT0hUVFAKK3N0YXRpYyBjaGFyICpobXh4aHR0cFtdID0geworIlN5bnRheDoiLAorI2lmZGVmIENLX1NTTAorIkhUVFAgWyA8c3dpdGNoZXM+IF0gT1BFTiBbeyAvU1NMLCAvVExTIH1dIDxob3N0bmFtZT4gPHNlcnZpY2UvcG9ydD4iLAorI2Vsc2UKKyJIVFRQIFsgPHN3aXRjaGVzPiBdIE9QRU4gPGhvc3RuYW1lPiA8c2VydmljZS9wb3J0PiIsCisjZW5kaWYgLypDS19TU0wgKi8KKyIgIEluc3RydWN0cyBLZXJtaXQgdG8gb3BlbiBhIG5ldyBjb25uZWN0aW9uIGZvciBIVFRQIGNvbW11bmljYXRpb24gd2l0aCIsCisiICB0aGUgc3BlY2lmaWVkIGhvc3Qgb24gdGhlIHNwZWNpZmllZCBwb3J0LiAgVGhlIGRlZmF1bHQgcG9ydCBpcyBcImh0dHBcIi4iLAorI2lmZGVmIENLX1NTTAorIiAgSWYgL1NTTCBvciAvVExTIGFyZSBzcGVjaWZpZWQgb3IgaWYgdGhlIHNlcnZpY2UgaXMgXCJodHRwc1wiIG9yIHBvcnQgNDQzLCIsCisiICBhIHNlY3VyZSBjb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWQgdXNpbmcgdGhlIGN1cnJlbnQgYXV0aGVudGljYXRpb24iLAorIiAgc2V0dGluZ3MuICBTZWUgSEVMUCBTRVQgQVVUSCBmb3IgZGV0YWlscy4iLAorI2VuZGlmIC8qIENLX1NTTCAqLworIiAgSWYgPHN3aXRjaGVzPiBhcmUgc3BlY2lmaWVkLCB0aGV5IGFyZSBhcHBsaWVkIHRvIGFsbCBzdWJzZXF1ZW50IEhUVFAiLAorIiAgYWN0aW9ucyAoR0VULCBQVVQsIC4uLikgdW50aWwgYW4gSFRUUCBDTE9TRSBjb21tYW5kIGlzIGV4ZWN1dGVkLiIsCisiICBBIFVSTCBjYW4gYmUgaW5jbHVkZWQgaW4gcGxhY2Ugb2YgdGhlIGhvc3RuYW1lIGFuZCBzZXJ2aWNlIG9yIHBvcnQuIiwKKyIgIiwKKyJIVFRQIENMT1NFIiwKKyIgIEluc3RydWN0cyBLZXJtaXQgdG8gY2xvc2UgYW55IG9wZW4gSFRUUCBjb25uZWN0aW9uIGFuZCBjbGVhciBhbnkgc2F2ZWQiLAorIiAgc3dpdGNoIHZhbHVlcy4iLAorIiAiLAorIkhUVFAgWyA8c3dpdGNoZXM+IF0gQ09OTkVDVCA8aG9zdD5bOjxwb3J0Pl0iLAorIiAgSW5zdHJ1Y3RzIHRoZSBzZXJ2ZXIgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgaG9zdCIsCisiICBhbmQgdG8gcmVkaXJlY3QgYWxsIGRhdGEgdHJhbnNtaXR0ZWQgYmV0d2VlbiBLZXJtaXQgYW5kIHRoZSBob3N0IGZvciB0aGUiLAorIiAgbGlmZSBvZiB0aGUgY29ubmVjdGlvbi4iLAorIiAiLAorIkhUVFAgWyA8c3dpdGNoZXM+IF0gR0VUIDxyZW1vdGUtZmlsZW5hbWU+IFsgPGxvY2FsLWZpbGVuYW1lPiBdIiwKKyIgIFJldHJpZXZlcyB0aGUgbmFtZWQgZmlsZSBvbiB0aGUgY3VycmVudGx5IG9wZW4gSFRUUCBjb25uZWN0aW9uLiAgVGhlIiwKKyIgIGRlZmF1bHQgbG9jYWwgZmlsZW5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHJlbW90ZSBmaWxlbmFtZSwgYnV0IHdpdGggYW55IiwKKyIgIHBhdGggc3RyaXBwZWQuICBJZiB5b3Ugd2FudCB0aGUgZmlsZSB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbiBpbnN0ZWFkIiwKKyIgIG9mIHN0b3JlZCBvbiBkaXNrLCBpbmNsdWRlIHRoZSAvVE9TQ1JFRU4gc3dpdGNoIGFuZCBvbWl0IHRoZSBsb2NhbCIsCisiICBmaWxlbmFtZS4gIElmIHlvdSBnaXZlIGEgVVJMIGluc3RlYWQgb2YgYSByZW1vdGUgZmlsZW5hbWUsIHRoaXMgY29tbWFuZHMiLAorIiAgb3BlbnMgdGhlIGNvbm5lY3Rpb24sIEdFVHMgdGhlIGZpbGUsIGFuZCBjbG9zZXMgdGhlIGNvbm5lY3Rpb247IHRoZSBzYW1lIiwKKyIgIGlzIHRydWUgZm9yIHRoZSByZW1haW5pbmcgSFRUUCBjb21tYW5kcyBmb3Igd2hpY2ggeW91IGNhbiBzcGVjaWZ5IGEiLAorIiAgcmVtb3RlIGZpbGVuYW1lLCBkaXJlY3RvcnkgbmFtZSwgb3IgcGF0aC4iLAorIiAiLAorIkhUVFAgWyA8c3dpdGNoZXM+IF0gSEVBRCA8cmVtb3RlLWZpbGVuYW1lPiBbIDxsb2NhbC1maWxlbmFtZT4gXSIsCisiICBMaWtlIEdFVCBleGNlcHQgd2l0aG91dCBhY3R1YWxseSBnZXR0aW5nIHRoZSBmaWxlOyBpbnN0ZWFkIGl0IGdldHMgb25seSIsCisiICB0aGUgaGVhZGVycywgc3RvcmluZyB0aGVtIGludG8gdGhlIGdpdmVuIGZpbGUgKGlmIGEgbG9jYWwgZmlsZW5hbWUgaXMiLAorIiAgc3BlY2lmaWVkKSwgb25lIGxpbmUgcGVyIGhlYWRlciBpdGVtIGFzIHNob3duIGluIHRoZSAvQVJSQVk6IHN3aXRjaCIsCisiICBkZXNjcmlwdGlvbi4iLAorIiAiLAorIkhUVFAgWyA8c3dpdGNoZXM+IF0gSU5ERVggPHJlbW90ZS1kaXJlY3Rvcnk+IFsgPGxvY2FsLWZpbGVuYW1lPiBdIiwKKyIgIFJldHJpZXZlcyB0aGUgZmlsZSBsaXN0aW5nIGZvciB0aGUgZ2l2ZW4gc2VydmVyIGRpcmVjdG9yeS4iLAorIiAgTk9URTogVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgbW9zdCBXZWIgc2VydmVycywgYW5kIGV2ZW4gd2hlbiIsCisiICB0aGUgc2VydmVyIHVuZGVyc3RhbmQgaXQsIHRoZXJlIGlzIG5vIHN0YXJkYXJkIHJlc3BvbnNlIGZvcm1hdC4iLAorIiAiLAorIkhUVFAgWyA8c3dpdGNoZXM+IF0gUE9TVCBbIC9NSU1FLVRZUEU6PHR5cGU+IF0gPGxvY2FsLWZpbGU+IDxyZW1vdGUtcGF0aD4iLAorIiAgICAgWyA8ZGVzdC1maWxlPiBdIiwKKyIgIFVzZWQgdG8gc2VuZCBhIHJlc3BvbnNlIGFzIGlmIGl0IHdlcmUgc2VudCBmcm9tIGEgZm9ybS4gIFRoZSBkYXRhIHRvIGJlIiwKKyIgIHBvc3RlZCBtdXN0IGJlIHJlYWQgZnJvbSBhIGZpbGUuIiwKKyIgIiwKKyJIVFRQIFsgPHN3aXRjaGVzPiBdIFBVVCBbIC9NSU1FLVRZUEU6PHR5cGU+IF0gPGxvY2FsLWZpbGU+IDxyZW1vdGUtZmlsZT4iLAorIiAgICAgWyA8ZGVzdC1maWxlPiBdIiwKKyIgIFVwbG9hZHMgdGhlIGdpdmVuIGxvY2FsIGZpbGUgdG8gc2VydmVyIGZpbGUuICBJZiB0aGUgcmVtb3RlIGZpbGVuYW1lIGlzIiwKKyIgIG9taXR0ZWQsIHRoZSBsb2NhbCBuYW1lIGlzIHVzZWQsIGJ1dCB3aXRoIGFueSBwYXRoIHN0cmlwcGVkLiIsCisiICIsCisiSFRUUCBbIDxzd2l0Y2hlcz4gXSBERUxFVEUgPHJlbW90ZS1maWxlbmFtZT4iLAorIiAgSW5zdHJ1Y3RzIHRoZSBzZXJ2ZXIgdG8gZGVsZXRlIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUuIiwKKyIgIiwKKyJ3aGVyZSA8c3dpdGNoZXM+IGFyZToiLAorIi9BR0VOVDo8dXNlci1hZ2VudD4iLAorIiAgSWRlbnRpZmllcyB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXI7IFwiQy1LZXJtaXRcIiBvciBcIktlcm1pdC05NVwiIiwKKyIgIGJ5IGRlZmF1bHQuIiwKKyIgIiwKKyIvSEVBREVSOjxoZWFkZXItbGluZT4iLAorIiAgVXNlZCBmb3Igc3BlY2lmeWluZyBhbnkgb3B0aW9uYWwgaGVhZGVycy4gIEEgbGlzdCBvZiBoZWFkZXJzIGlzIHByb3ZpZGVkIiwKKyIgIHVzaW5nIGJyYWNlcyBmb3IgZ3JvdXBpbmc6IiwKKyIgIiwKKyIgICAgL0hFQURFUjp7ezx0YWc+Ojx2YWx1ZT59ezx0YWc+Ojx2YWx1ZT59Li4ufSIsCisiICIsCisiICBGb3IgYSBsaXN0aW5nIG9mIHZhbGlkIDx0YWc+IHZhbHVlIGFuZCA8dmFsdWU+IGZvcm1hdHMgc2VlIFJGQyAxOTQ1OiIsCisiICBcIkh5cGVydGV4dCBUcmFuc2ZlciBQcm90b2NvbCAtLSBIVFRQLzEuMFwiLiAgQSBtYXhpbXVtIG9mIGVpZ2h0IGhlYWRlcnMiLAorIiAgbWF5IGJlIHNwZWNpZmllZC4iLAorIiAiLAorIi9UT1NDUkVFTiIsCisiICBEaXNwbGF5IHNlcnZlciByZXNwb25zZXMgb24gdGhlIHNjcmVlbi4iLAorIiAiLAorIi9VU0VSOjxuYW1lPiIsCisiICBJbiBjYXNlIGEgcGFnZSByZXF1aXJlcyBhIHVzZXJuYW1lIGZvciBhY2Nlc3MuIiwKKyIgIiwKKyIvUEFTU1dPUkQ6PHBhc3N3b3JkPiIsCisiICBJbiBjYXNlIGEgcGFnZSByZXF1aXJlcyBhIHBhc3N3b3JkIGZvciBhY2Nlc3MuIiwKKyIgIiwKKyIvQVJSQVk6PGFycmF5bmFtZT4iLAorIiAgVGVsbHMgS2VybWl0IHRvIHN0b3JlIHRoZSByZXNwb25zZSBoZWFkZXJzIGluIHRoZSBnaXZlbiBhcnJheSwgb25lIGxpbmUiLAorIiAgcGVyIGVsZW1lbnQuICBUaGUgYXJyYXkgbmVlZCBub3QgYmUgZGVjbGFyZWQgaW4gYWR2YW5jZS4gIEV4YW1wbGU6IiwKKyIgIiwKKyIgICAgaHR0cCAvYXJyYXk6YyBnZXQga2VybWl0L2luZGV4Lmh0bWwiLAorIiAgICBzaG93IGFycmF5IGMiLAorIiAgICBEaW1lbnNpb24gPSA5IiwKKyIgICAgMS4gRGF0ZTogRnJpLCAyNiBOb3YgMTk5OSAyMzoxMjoyMiBHTVQiLAorIiAgICAyLiBTZXJ2ZXI6IEFwYWNoZS8xLjMuNCAoVW5peCkiLAorIiAgICAzLiBMYXN0LU1vZGlmaWVkOiBNb24sIDA2IFNlcCAxOTk5IDIyOjM1OjU4IEdNVCIsCisiICAgIDQuIEVUYWc6IFwiYmMwNDktZjcyLTM3ZDQ0MWNlXCIiLAorIiAgICA1LiBBY2NlcHQtUmFuZ2VzOiBieXRlcyIsCisiICAgIDYuIENvbnRlbnQtTGVuZ3RoOiAzOTU0IiwKKyIgICAgNy4gQ29ubmVjdGlvbjogY2xvc2UgICAgICIsCisiICAgIDguIENvbnRlbnQtVHlwZTogdGV4dC9odG1sIiwKKyIgIiwKKyJBcyB5b3UgY2FuIHNlZSwgdGhlIGhlYWRlciBsaW5lcyBhcmUgbGlrZSBNSU1FIGUtbWFpbCBoZWFkZXIgbGluZXM6IiwKKyJpZGVudGlmaWVyLCBjb2xvbiwgdmFsdWUuICBUaGUgL0FSUkFZIHN3aXRjaCBpcyB0aGUgb25seSBtZXRob2QgYXZhaWxhYmxlIiwKKyJ0byBhIHNjcmlwdCB0byBwcm9jZXNzIHRoZSBzZXJ2ZXIgcmVzcG9uc2VzIGZvciBhIFBPU1Qgb3IgUFVUIGNvbW1hbmQuIiwKKyIgIiwKKyIiCit9OworI2VuZGlmIC8qIE5PSFRUUCAqLworCisjaWZkZWYgQ0tfS0VSQkVST1MKK3N0YXRpYyBjaGFyICpobXh4YXV0aFtdID0geworIlN5bnRheDoiLAorIkFVVEhFTlRJQ0FURSB7IEtFUkJFUk9TNCwgS0VSQkVST1M1IFsgc3dpdGNoZXMgXSB9IDxhY3Rpb24+IFsgc3dpdGNoZXMgXSIsCisiICBPYnRhaW5zIG9yIGRlc3Ryb3lzIEtlcmJlcm9zIHRpY2tldHMgYW5kIGxpc3RzIGluZm9ybWF0aW9uIGFib3V0IHRoZW0uIiwKKyIgIEFjdGlvbnMgYXJlIElOSVRJQUxJWkUsIERFU1RST1ksIGFuZCBMSVNULUNSRURFTlRJQUxTLiAgS0VSQkVST1M0IGNhbiBiZSIsCisiICBhYmJyZXZpYXRlZCBLNCBvciBLUkI0OyBLRVJCRVJPUzUgY2FuIGJlIGFiYnJldmlhdGVkIEs1IG9yIEtSQjUuICBVc2UgPyB0byIsCisiICBzZWUgd2hpY2gga2V5d29yZHMsIHN3aXRjaGVzLCBvciBvdGhlciBxdWFudGl0aWVzIGFyZSB2YWxpZCBhdCBlYWNoIHBvaW50IiwKKyIgIGluIHRoZSBjb21tYW5kLiIsCisiICIsCisiICBUaGUgYWN0aW9ucyBhcmUgSU5JVElBTElaRSwgREVTVFJPWSwgYW5kIExJU1QtQ1JFREVOVElBTFM6IiwKKyIgIiwKKyIgICAgQVVUSCB7IEs0LCBLNSB9IHsgSU5JVElBTElaRSBbc3dpdGNoZXNdLCBERVNUUk9ZLCIsCisiICAgICAgTElTVC1DUkVERU5USUFMUyBbc3dpdGNoZXNdIH0iLAorIiAiLAorIiAgVGhlIElOSVRJQUxJWkUgYWN0aW9uIGlzIHRoZSBtb3N0IGNvbXBsZXgsIGFuZCBpdHMgZm9ybWF0IGlzIGRpZmZlcmVudCIsCisiICBmb3IgS2VyYmVyb3MgNCBhbmQgS2VyYmVyb3MgNS4gIFRoZSBmb3JtYXQgZm9yIEtlcmJlcm9zIDQgaXM6IiwKKyIgIiwKKyIgIEFVVEggSzQgSU5JVElBTElaRSBbIC9JTlNUQU5DRTo8bmFtZT4gL0xJRkVUSU1FOjxtaW51dGVzPiAtIiwKKyIgICAgL1BBU1NXT1JEOjxwYXNzd29yZD4gL1BSRUFVVEggL1JFQUxNOjxuYW1lPiA8cHJpbmNpcGFsPiBdIiwKKyIgIiwKKyIgIEFsbCBzd2l0Y2hlcyBhcmUgb3B0aW9uYWwuICBLZXJiZXJvcyA0IElOSVRJQUxJWkUgc3dpdGNoZXMgYXJlOiIsCisiICIsCisiICAvSU5TVEFOQ0U6PG5hbWU+IiwKKyIgICAgQWxsb3dzIGFuIEluc3RhbmNlIChzdWNoIGFzIGEgaG9zdG5hbWUpIHRvIGJlIHNwZWNpZmllZC4iLAorIiAiLAorIiAgL0xJRkVUSU1FOjxudW1iZXI+IiwKKyIgICAgU3BlY2lmaWVzIHRoZSByZXF1ZXN0ZWQgbGlmZXRpbWUgaW4gbWludXRlcyBmb3IgdGhlIHRpY2tldC4gIElmIG5vIiwKKyIgICAgbGlmZXRpbWUgaXMgc3BlY2lmaWVkLCA2MDAgbWludXRlcyBpcyB1c2VkLiAgSWYgdGhlIGxpZmV0aW1lIGlzIGdyZWF0ZXIiLAorIiAgICB0aGFuIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBieSB0aGUgdGlja2V0IGdyYW50aW5nIHNlcnZpY2UsIHRoZSByZXN1bHRpbmciLAorIiAgICBsaWZldGltZSBpcyBzaG9ydGVuZWQgYWNjb3JkaW5nbHkuIiwKKyIgIiwKKyIgIC9OT1QtUFJFQVVUSCIsCisiICAgIEluc3RydWN0cyBLZXJtaXQgdG8gc2VuZCBhIHRpY2tldCBnZXR0aW5nIHRpY2tldCAoVEdUKSByZXF1ZXN0IHRvIHRoZSIsCisiICAgIEtEQyB3aXRob3V0IGFueSBwcmVhdXRoZW50aWNhdGlvbiBkYXRhLiIsCisiICIsCisiICAvUEFTU1dPUkQ6PHN0cmluZz4iLAorIiAgICBBbGxvd3MgYSBwYXNzd29yZCB0byBiZSBpbmNsdWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lIG9yIGluIGEgc2NyaXB0IiwKKyIgICAgZmlsZS4gIElmIG5vIC9QQVNTV09SRCBzd2l0Y2ggaXMgaW5jbHVkZWQsIHlvdSBhcmUgcHJvbXB0ZWQgb24gYSBzZXBhcmF0ZSIKKywKKyIgICAgbGluZS4gIFRoZSBwYXNzd29yZCBzd2l0Y2ggaXMgcHJvdmlkZWQgb24gYSB1c2UtYXQteW91ci1vd24tcmlzayBiYXNpcyIsCisiICAgIGZvciB1c2UgaW4gYXV0b21hdGVkIHNjcmlwdHMuICBXQVJOSU5HOiBQYXNzd29yZHMgc2hvdWxkIG5vdCBiZSBzdG9yZWQgaW4iCissCisiICAgIGZpbGVzLiIsCisiICIsCisiICAvUFJFQVVUSCIsCisiICAgIEluc3RydWN0cyBLZXJtaXQgdG8gc2VuZCBhIHByZWF1dGhlbnRpY2F0ZWQgVGlja2V0LUdldHRpbmcgVGlja2V0IChUR1QpIiwKKyIgICAgcmVxdWVzdCB0byB0aGUgS0RDIGluc3RlYWQgb2YgYSBwbGFpbnRleHQgcmVxdWVzdC4gIFRoZSBkZWZhdWx0IHdoZW4iLAorIiAgICBzdXBwb3J0ZWQgYnkgdGhlIEtlcmJlcm9zIGxpYnJhcmllcy4iLAorIiAiLAorIiAgL1JFQUxNOjxuYW1lPiIsCisiICAgIEFsbG93cyBhIHJlYWxtIHRvIGJlIHNwZWNpZmllZCAob3ZlcnJpZGluZyB0aGUgZGVmYXVsdCByZWFsbSkuIiwKKyIgIiwKKyIgIDxwcmluY2lwYWw+IiwKKyIgICAgWW91ciBpZGVudGl0eSBpbiB0aGUgZ2l2ZW4gb3IgZGVmYXVsdCBLZXJiZXJvcyByZWFsbSwgb2YgdGhlIGZvcm06IiwKKyIgICAgdXNlcmlkWy5pbnN0YW5jZVsuaW5zdGFuY2VdXUBbcmVhbG1dICAiLAorIiAgICBDYW4gYmUgb21pdHRlZCBpZiBpdCBpcyB0aGUgc2FtZSBhcyB5b3VyIHVzZXJuYW1lIG9yIFNFVCBMT0dJTiBVU0VSSUQiLAorIiAgICB2YWx1ZSBvbiB0aGUgY2xpZW50IHN5c3RlbS4iLAorIiAiLAorIiAgVGhlIGZvcm1hdCBmb3IgS2VyYmVyb3MgNSBpcyBhcyBmb2xsb3dzOiIsCisiICIsCisiICBBVVRIIEs1IFsgL0NBQ0hFOjxmaWxlbmFtZT4gXSB7IElOSVRJQUxJWkUgWyBzd2l0Y2hlcyBdLCBERVNUUk9ZLCIsCisiICAgIExJU1QtQ1JFREVOVElBTFMgLi4ufSIsCisiICIsCisiVGhlIElOSVRJQUxJWkUgY29tbWFuZCBmb3IgS2VyYmVyb3MgNSBjYW4gaW5jbHVkZSBhIG51bWJlciBvZiBzd2l0Y2hlczsiLAorImFsbCBhcmUgb3B0aW9uYWw6IiwKKyIgIiwKKyJBVVRIIEs1IFsgL0NBQ0hFOjxmaWxlbmFtZT4gXSBJTklUSVRJQUxJWkUgWyAvQUREUkVTU0VTOjxhZGRyLWxpc3Q+IiwKKyIgIC9GT1JXQVJEQUJMRSAvS0VSQkVST1M0IC9MSUZFVElNRTo8bWludXRlcz4gL1BBU1NXT1JEOjxwYXNzd29yZD4iLAorIiAgL1BPU1REQVRFOjxkYXRlLXRpbWU+IC9QUk9YSUFCTEUgL1JFQUxNOjxuYW1lPiAvUkVORVcgL1JFTkVXQUJMRTo8bWludXRlcz4iLAorIiAgL1NFUlZJQ0U6PG5hbWU+IC9WQUxJREFURSA8cHJpbmNpcGFsPiBdIiwKKyIgIiwKKyIgIEFsbCBLZXJiZXJvcyA1IElOSVRJQUxJWkUgc3dpdGNoZXMgYXJlIG9wdGlvbmFsOiIsCisiICIsCisiICAvQUREUkVTU0VTOntsaXN0IG9mIGlwLWFkZHJlc3Nlc30iLAorIiAgICBTcGVjaWZpZXMgYSBsaXN0IG9mIElQIGFkZHJlc3NlcyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gdGhlIFRpY2tldCIsCisiICAgIEdldHRpbmcgVGlja2V0IGluIGFkZGl0aW9uIHRvIHRoZSBsb2NhbCBtYWNoaW5lIGFkZHJlc3Nlcy4iLAorIiAiLAorIiAgL0ZPUldBUkRBQkxFIiwKKyIgICAgUmVxdWVzdHMgZm9yd2FyZGFibGUgdGlja2V0cy4iLAorIiAiLAorIiAgL0lOU1RBTkNFOjxuYW1lPiIsCisiICAgIEFsbG93cyBhbiBJbnN0YW5jZSAoc3VjaCBhcyBhIGhvc3RuYW1lKSB0byBiZSBzcGVjaWZpZWQuIiwKKyIgIiwKKyIgIC9LRVJCRVJPUzQiLAorIiAgICBJbnN0cnVjdHMgS2VybWl0IHRvIGdldCBLZXJiZXJvcyA0IHRpY2tldHMgaW4gYWRkaXRpb24gdG8gS2VyYmVyb3MgNSIsCisiICAgIHRpY2tldHMuICBJZiBLZXJiZXJvcyA1IHRpY2tldHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciwgYSIsCisiICAgIG1pbGQgd2FybmluZyBpcyBwcmludGVkIGFuZCBLZXJiZXJvcyA0IHRpY2tldHMgYXJlIHJlcXVlc3RlZC4iLAorIiAiLAorIiAgL0xJRkVUSU1FOjxudW1iZXI+IiwKKyIgICAgU3BlY2lmaWVzIHRoZSByZXF1ZXN0ZWQgbGlmZXRpbWUgaW4gbWludXRlcyBmb3IgdGhlIHRpY2tldC4gIElmIG5vIiwKKyIgICAgbGlmZXRpbWUgaXMgc3BlY2lmaWVkLCA2MDAgbWludXRlcyBpcyB1c2VkLiAgSWYgdGhlIGxpZmV0aW1lIGlzIGdyZWF0ZXIiLAorIiAgICB0aGFuIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBieSB0aGUgdGlja2V0IGdyYW50aW5nIHNlcnZpY2UsIHRoZSByZXN1bHRpbmciLAorIiAgICBsaWZldGltZSBpcyBzaG9ydGVuZWQuIiwKKyIgIiwKKyIgIC9OTy1LRVJCRVJPUzQiLAorIiAgICBJbnN0cnVjdHMgS2VybWl0IHRvIG5vdCBhdHRlbXB0IHRvIHJldHJpZXZlIEtlcmJlcm9zIDQgY3JlZGVudGlhbHMuIiwKKyIgIiwKKyIgIC9OT1QtRk9SV0FSREFCTEUiLAorIiAgICBSZXF1ZXN0cyBub24tZm9yd2FyZGFibGUgdGlja2V0cy4iLAorIiAiLAorIiAgL05PVC1QUk9YSUFCTEUiLAorIiAgICBSZXF1ZXN0cyBub24tcHJveGlhYmxlIHRpY2tldHMuIiwKKyIgIiwKKyIgIC9QQVNTV09SRDo8c3RyaW5nPiIsCisiICAgIEFsbG93cyBhIHBhc3N3b3JkIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUgb3IgaW4gYSBzY3JpcHQiLAorIiAgICBmaWxlLiAgSWYgbm8gL1BBU1NXT1JEIHN3aXRjaCBpcyBpbmNsdWRlZCwgeW91IGFyZSBwcm9tcHRlZCBvbiBhIHNlcGFyYXRlIgorLAorIiAgICBsaW5lLiAgVGhlIHBhc3N3b3JkIHN3aXRjaCBpcyBwcm92aWRlZCBvbiBhIHVzZS1hdC15b3VyLW93bi1yaXNrIGJhc2lzIiwKKyIgICAgZm9yIHVzZSBpbiBhdXRvbWF0ZWQgc2NyaXB0cy4gIFdBUk5JTkc6IFBhc3N3b3JkcyBzaG91bGQgbm90IGJlIHN0b3JlZCBpbiIKKywKKyIgICAgZmlsZXMuIiwKKyIgIiwKKyIgIC9QT1NUREFURTo8ZGF0ZS10aW1lPiIsCisiICAgIFJlcXVlc3RzIGEgcG9zdGRhdGVkIHRpY2tldCwgdmFsaWQgc3RhcnRpbmcgYXQgPGRhdGUtdGltZT4uICBQb3N0ZGF0ZWQiLAorIiAgICB0aWNrZXRzIGFyZSBpc3N1ZWQgd2l0aCB0aGUgaW52YWxpZCBmbGFnIHNldCwgYW5kIG5lZWQgdG8gYmUgZmVkIGJhY2sgdG8iLAorIiAgICB0aGUgS0RDIGJlZm9yZSB1c2Ugd2l0aCB0aGUgL1ZBTElEQVRFIHN3aXRjaC4gIFR5cGUgSEVMUCBEQVRFIGZvciBpbmZvIiwKKyIgICAgb24gZGF0ZS10aW1lIGZvcm1hdHMuIiwKKyIgIiwKKyIgIC9QUk9YSUFCTEUiLAorIiAgICBSZXF1ZXN0cyBwcm94aWFibGUgdGlja2V0cy4iLAorIiAiLAorIiAgL1JFQUxNOjxzdHJpbmc+IiwKKyIgICAgQWxsb3dzIGFuIGFsdGVybmF0aXZlIHJlYWxtIHRvIGJlIHNwZWNpZmllZC4iLAorIiAiLAorIiAgL1JFTkVXIiwKKyIgICAgUmVxdWVzdHMgcmVuZXdhbCBvZiBhIHJlbmV3YWJsZSBUaWNrZXQtR3JhbnRpbmcgVGlja2V0LiAgTm90ZSB0aGF0ICIsCisiICAgIGFuIGV4cGlyZWQgdGlja2V0IGNhbm5vdCBiZSByZW5ld2VkIGV2ZW4gaWYgaXQgaXMgd2l0aGluIGl0cyByZW5ld2FibGUgIiwKKyIgICAgbGlmZXRpbWUuIiwKKyIgIiwKKyIgIC9SRU5FV0FCTEU6PG51bWJlcj4iLAorIiAgICBSZXF1ZXN0cyByZW5ld2FibGUgdGlja2V0cywgd2l0aCBhIHRvdGFsIGxpZmV0aW1lIG9mIDxudW1iZXI+IG1pbnV0ZXMuIiwKKyIgIiwKKyIgIC9TRVJWSUNFOjxzdHJpbmc+IiwKKyIgICAgQWxsb3dzIGEgc2VydmljZSBvdGhlciB0aGFuIHRoZSB0aWNrZXQgZ3JhbnRpbmcgc2VydmljZSB0byBiZSBzcGVjaWZpZWQuIiwKKyIgIiwKKyIgIC9WQUxJREFURSIsCisiICAgIFJlcXVlc3RzIHRoYXQgdGhlIFRpY2tldCBHcmFudGluZyBUaWNrZXQgaW4gdGhlIGNhY2hlICh3aXRoIHRoZSBpbnZhbGlkIiwKKyIgICAgZmxhZyBzZXQpIGJlIHBhc3NlZCB0byB0aGUgS0RDIGZvciB2YWxpZGF0aW9uLiAgSWYgdGhlIHRpY2tldCBpcyB3aXRoaW4iLAorIiAgICBpdHMgcmVxdWVzdGVkIHRpbWUgcmFuZ2UsIHRoZSBjYWNoZSBpcyByZXBsYWNlZCB3aXRoIHRoZSB2YWxpZGF0ZWQiLAorIiAgICB0aWNrZXQuIiwKKyIgIiwKKyIgIDxwcmluY2lwYWw+IiwKKyIgICAgWW91ciBpZGVudGl0eSBpbiB0aGUgZ2l2ZW4gb3IgZGVmYXVsdCBLZXJiZXJvcyByZWFsbSwgb2YgdGhlIGZvcm06IiwKKyIgICAgdXNlcmlkWy9pbnN0YW5jZV1bQHJlYWxtXSAgIiwKKyIgICAgQ2FuIGJlIG9taXR0ZWQgaWYgaXQgaXMgdGhlIHNhbWUgYXMgeW91ciB1c2VybmFtZSBvciBTRVQgTE9HSU4gVVNFUklEIiwKKyIgICAgdmFsdWUgb24gdGhlIGNsaWVudCBzeXN0ZW0uIiwKKyIgIiwKKyIgIE5vdGU6IEtlcmJlcm9zIDUgYWx3YXlzIGF0dGVtcHRzIHRvIHJldHJpZXZlIGEgVGlja2V0LUdldHRpbmcgVGlja2V0IChUR1QpIiwKKyIgIHVzaW5nIHRoZSBwcmVhdXRoZW50aWNhdGVkIFRHVCByZXF1ZXN0LiIsCisiICIsCisiICBBVVRIT1JJWkUgSzUgTElTVC1DUkVERU5USUFMUyBbIC9BRERSRVNTRVMgL0ZMQUdTIC9FTkNSWVBUSU9OIF0iLAorIiAiLAorIiAgU2hvd3Mgc3RhcnQgdGltZSwgZXhwaXJhdGlvbiB0aW1lLCBzZXJ2aWNlIG9yIHByaW5jaXBhbCBuYW1lLCBwbHVzIiwKKyIgIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBkZXBlbmRpbmcgdGhlIHN3aXRjaGVzOiIsCisiICIsCisiICAvQUREUkVTU0VTIGRpc3BsYXlzIHRoZSBob3N0bmFtZXMgYW5kL29yIElQIGFkZHJlc3NlcyBlbWJlZGRlZCB3aXRoaW4iLAorIiAgICB0aGUgdGlja2V0cy4iLAorIiAiLAorIiAgL0ZMQUdTIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gKGlmIGFwcGxpY2FibGUpIGZvciBlYWNoIHRpY2tldDoiLAorIiAgICBGIC0gVGlja2V0IGlzIEZvcndhcmRhYmxlIiwKKyIgICAgZiAtIFRpY2tldCB3YXMgRm9yd2FyZGVkIiwKKyIgICAgUCAtIFRpY2tldCBpcyBQcm94aWFibGUiLAorIiAgICBwIC0gVGlja2V0IGlzIGEgUHJveHkiLAorIiAgICBEIC0gVGlja2V0IG1heSBiZSBQb3N0ZGF0ZWQiLAorIiAgICBkIC0gVGlja2V0IGhhcyBiZWVuIFBvc3RkYXRlZCIsCisiICAgIGkgLSBUaWNrZXQgaXMgSW52YWxpZCIsCisiICAgIFIgLSBUaWNrZXQgaXMgUmVuZXdhYmxlIiwKKyIgICAgSSAtIFRpY2tldCBpcyB0aGUgSW5pdGlhbCBUaWNrZXQiLAorIiAgICBIIC0gVGlja2V0IGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgYnkgSGFyZHdhcmUiLAorIiAgICBBIC0gVGlja2V0IGhhcyBiZWVuIFByZS1hdXRoZW50aWNhdGVkIiwKKyIgIiwKKyIgIC9FTkNSWVBUSU9OIGRpc3BsYXlzIHRoZSBlbmNyeXB0aW9uIHVzZWQgYnkgZWFjaCB0aWNrZXQgKGlmIGFwcGxpY2FibGUpOiIsCisiICAgIERFUy1DQkMtQ1JDIiwKKyIgICAgREVTLUNCQy1NRDQiLAorIiAgICBERVMtQ0JDLU1ENSIsCisiICAgIERFUzMtQ0JDLVNIQSIsCisiIgorfTsKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCisjaWZuZGVmIE5PQ1NFVFMKK3N0YXRpYyBjaGFyICpobXh4YXNzb2NbXSA9IHsKKyJBU1NPQ0lBVEUgRklMRS1DSEFSQUNURVItU0VUIDxmaWxlLWNoYXJhY3Rlci1zZXQ+IDx0cmFuc2Zlci1jaGFyYWN0ZXItc2V0PiIsCisiICBUZWxscyBDLUtlcm1pdCB0aGF0IHdoZW5ldmVyIHRoZSBnaXZlbiBmaWxlLWNoYXJhY3RlciBzZXQgaXMgc2VsZWN0ZWQsIGFuZCIsCisiICBTRU5EIENIQVJBQ1RFUi1TRVQgKHEudi4pIGlzIEFVVE9NQVRJQywgdGhlIGdpdmVuIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQiLAorIiAgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseS4iLAorIiAiLAorIkFTU09DSUFURSBYRkVSLUNIQVJBQ1RFUi1TRVQgPHhmZXItY2hhcmFjdGVyLXNldD4gPGZpbGUtY2hhcmFjdGVyLXNldD4iLAorIiAgVGVsbHMgQy1LZXJtaXQgdGhhdCB3aGVuZXZlciB0aGUgZ2l2ZW4gdHJhbnNmZXItY2hhcmFjdGVyIHNldCBpcyBzZWxlY3RlZCwiLAorIiAgZWl0aGVyIGJ5IGNvbW1hbmQgb3IgYnkgYW4gYW5ub3VuY2VyIGF0dGFjaGVkIHRvIGFuIGluY29taW5nIHRleHQgZmlsZSwiLAorIiAgYW5kIFNFTkQgQ0hBUkFDVEVSLVNFVCBpcyBBVVRPTUFUSUMsIHRoZSBzcGVjaWZpZWQgZmlsZSBjaGFyYWN0ZXItc2V0IGlzIiwKKyIgIHRvIGJlIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkuICBTeW5vbnltOiBBU1NPQ0lBVEUgVFJBTlNGRVItQ0hBUkFDVEVSLVNFVC4iLAorIiAiLAorIlVzZSBTSE9XIEFTU09DSUFUSU9OUyB0byBsaXN0IHRoZSBjdXJyZW50IGNoYXJhY3Rlci1zZXQgYXNzb2NpYXRpb25zLCBhbmQiLAorIlNIT1cgQ0hBUkFDVEVSLVNFVFMgdG8gbGlzdCB0aGUgY3VycmVudCBzZXR0aW5ncy4iLAorIiIKK307CisjZW5kaWYgLyogTk9DU0VUUyAqLworCitzdGF0aWMgY2hhciAqaG14eHBhdFtdID0geworIkEgXCJwYXR0ZXJuXCIgaXMgbm90YXRpb24gdXNlZCBpbiBhIHNlYXJjaCBzdHJpbmcgd2hlbiBzZWFyY2hpbmcgdGhyb3VnaCIsCisidGV4dC4gIEMtS2VybWl0IHVzZXMgdGhyZWUga2luZHMgb2YgcGF0dGVybnM6IGZsb2F0aW5nIHBhdHRlcm5zLCBhbmNob3JlZCIsCisicGF0dGVybnMsIGFuZCB3aWxkY2FyZHMuICBXaWxkY2FyZHMgYXJlIGFuY2hvcmVkIHBhdHRlcm5zIHRoYXQgYXJlIHVzZWQgdG8iLAorIm1hdGNoIGZpbGUgbmFtZXM7IHR5cGUgSEVMUCBXSUxEQ0FSRCB0byBsZWFybiBhYm91dCB0aGVtLiIsCisiICIsCisiSW4gYSBwYXR0ZXJuLCBjZXJ0YWluIGNoYXJhY3RlcnMgYXJlIHNwZWNpYWw6IiwKKyIgIiwKKyIqIE1hdGNoZXMgYW55IHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzLiAgRm9yIGV4YW1wbGUsIFwiayp0XCIiLAorIiAgbWF0Y2hlcyBhbGwgc3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggXCJrXCIgYW5kIGVuZCB3aXRoIFwidFwiIGluY2x1ZGluZyIsCisiICBcImt0XCIsIFwia2l0XCIsIFwia25pZ2h0XCIsIG9yIFwia2VybWl0XCIuIiwKKyIgIiwKKyNpZmRlZiBWTVMKKyIlIE1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZSwgXCJrJSUlJXRcIiBtYXRjaGVzIGFsbCBzdHJpbmdzIiwKKyNlbHNlCisiPyBNYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyLiAgRm9yIGV4YW1wbGUsIFwiaz8/Pz90XCIgbWF0Y2hlcyBhbGwgc3RyaW5ncyIsCisjZW5kaWYgLyogVk1TICovCisiICB0aGF0IGFyZSBleGFjdGx5IDYgY2hhcmFjdGVycyBsb25nIGFuZCBzdGFydCB3aXRoIFwia1wiIGFuZCBlbmQgd2l0aCIsCisjaWZkZWYgVk1TCisiICB3aXRoIFwidFwiLiIsCisjZWxzZQorIiAgd2l0aCBcInRcIi4gIFdoZW4gdHlwaW5nIGNvbW1hbmRzIGF0IHRoZSBwcm9tcHQsIHlvdSBtdXN0IHByZWNlZGUgYW55IiwKKyIgIHF1ZXN0aW9uIG1hcmsgdG8gYmUgdXNlZCBmb3IgbWF0Y2hpbmcgYnkgYSBiYWNrc2xhc2ggKFxcKSB0byBvdmVycmlkZSB0aGUiLAorIiAgbm9ybWFsIGZ1bmN0aW9uIG9mIHF1ZXN0aW9uIG1hcmssIHdoaWNoIGlzIHByb3ZpZGluZyBtZW51cyBhbmQgZmlsZSBsaXN0cy4iLAorI2VuZGlmIC8qIFZNUyAqLworIiAiLAorI2lmZGVmIE9TMk9SVU5JWAorI2lmZGVmIENLUkVHRVgKKyJbYWJjXSIsCisiICBTcXVhcmUgYnJhY2tldHMgZW5jbG9zaW5nIGEgbGlzdCBvZiBjaGFyYWN0ZXJzIG1hdGNoZXMgYW55IGNoYXJhY3RlciBpbiIsCisiICB0aGUgbGlzdC4gIEV4YW1wbGU6IGhbYW91XXQgbWF0Y2hlcyBoYXQsIGhvdCwgYW5kIGh1dC4iLAorIiAiLAorIlthLXpdIiwKKyIgIFNxdWFyZSBicmFja2V0cyBlbmNsb3NpbmcgYSByYW5nZSBvZiBjaGFyYWN0ZXJzIG1hdGNoZXMgYW55IGNoYXJhY3RlciBpbiIsCisiICB0aGUgcmFuZ2U7IGEgaHlwaGVuICgtKSBzZXBhcmF0ZXMgdGhlIGxvdyBhbmQgaGlnaCBlbGVtZW50cyBvZiB0aGUgcmFuZ2UuIiwKKyIgIEZvciBleGFtcGxlLCBbYS16XSBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgZnJvbSBhIHRvIHouIiwKKyIgIiwKKyJbYWNkbS16XSIsCisiICBMaXN0cyBhbmQgcmFuZ2VzIG1heSBiZSBjb21iaW5lZC4gIFRoaXMgZXhhbXBsZSBtYXRjaGVzIGEsIGMsIGQsIG9yIGFueSIsCisiICBsZXR0ZXIgZnJvbSBtIHRocm91Z2ggei4iLAorIiAiLAorIntzdHJpbmcxLHN0cmluZzIsLi4ufSIsCisiICBCcmFjZXMgZW5jbG9zZSBhIGxpc3Qgb2Ygc3RyaW5ncyB0byBiZSBtYXRjaGVkLiAgRm9yIGV4YW1wbGU6IiwKKyIgIGtlcnttaXQsbmVsLGJlcm9zfSBtYXRjaGVzIGtlcm1pdCwga2VybmVsLCBhbmQga2VyYmVyb3MuICBUaGUgc3RyaW5ncyIsCisiICBtYXkgdGhlbXNlbHZlcyBjb250YWluICosID8sIFthYmNdLCBbYS16XSwgb3Igb3RoZXIgbGlzdHMgb2Ygc3RyaW5ncy4iLAorI2VuZGlmIC8qIENLUkVHRVggKi8KKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyNpZm5kZWYgTk9TUEwKKyIgIiwKKyJUbyBmb3JjZSBhIHNwZWNpYWwgcGF0dGVybiBjaGFyYWN0ZXIgdG8gYmUgdGFrZW4gbGl0ZXJhbGx5LCBwcmVjZWRlIGl0IHdpdGgiLAorImEgYmFja3NsYXNoLCBlLmcuIFthXFwtel0gbWF0Y2hlcyBhLCBoeXBoZW4sIGFuZCB6IHJhdGhlciB0aGFuIGEgdGhyb3VnaCB6LiIsCisiICIsCisiQSBmbG9hdGluZyAgcGF0dGVybiBjYW4gYWxzbyBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzOiIsCisiICIsCisiXiAoRmlyc3QgY2hhcmFjdGVyIG9mIHBhdHRlcm4pIEFuY2hvcnMgdGhlIHBhdHRlcm4gYXQgdGhlIGJlZ2lubmluZy4iLAorIiQgKExhc3QgY2hhcmFjdGVyIG9mIHBhdHRlcm4pIEFuY2hvcnMgdGhlIHBhdHRlcm4gYXQgdGhlIGVuZC4iLAorIiAiLAorIklmIGEgZmxvYXRpbmcgcGF0dGVybiBkb2VzIG5vdCBzdGFydCB3aXRoIFwiXlwiLCB0aGUgcGF0dGVybiBjYW4gbWF0Y2giLAorImFueXdoZXJlIGluIHRoZSBzdHJpbmcgaW5zdGVhZCBvZiBvbmx5IGF0IHRoZSBiZWdpbm5pbmc7IGluIG90aGVyIHdvcmRzLCBhIiwKKyJsZWFkaW5nIFwiKlwiIGlzIGFzc3VtZWQuICBTaW1pbGFybHksIGlmIHRoZSBwYXR0ZXJuIGRvZXNuJ3QgZW5kIHdpdGggXCIkXCIsIiwKKyJhIHRyYWlsaW5nIFwiKlwiIGlzIGFzc3VtZWQuIiwKKyIgIiwKKyJUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFuZCBmdW5jdGlvbnMgdXNlIGZsb2F0aW5nIHBhdHRlcm5zOiIsCisiICBHUkVQIFsgPHN3aXRjaGVzPiBdIDxwYXR0ZXJuPiA8ZmlsZXNwZWM+IiwKKyIgIFRZUEUgL01BVENIOjxwYXR0ZXJuPiA8ZmlsZT4iLAorIiAgXFxmYXJyYXlsb29rKDxwYXR0ZXJuPiw8YXJyYXluYW1lPikiLAorIiAgXFxmc2VhcmNoKDxwYXR0ZXJuPiw8c3RyaW5nPlssPG9mZnNldD5dKSIsCisiICBcXGZyc2VhcmNoKDxwYXR0ZXJuPiw8c3RyaW5nPlssPG9mZnNldD5dKSIsCisiICBUaGUgL0VYQ0VQVDogY2xhdXNlIGluIFNFTkQsIEdFVCwgREVMRVRFLCBldGMuIiwKKyIgIiwKKyJFeGFtcGxlOiIsCisiICBcXGZzZWFyY2goYWJjLHh4YWJjeHh4KSBzdWNjZWVkcyBiZWNhdXNlIHh4YWJjeHggY29udGFpbnMgYWJjLiIsCisiICBcXGZzZWFyY2goXmFiYyx4eGFiY3h4KSBmYWlscyBiZWNhdXNlIHh4YWJjeHggZG9lcyBub3Qgc3RhcnQgd2l0aCBhYmMuIiwKKyIgIiwKKyJBbGwgb3RoZXIgY29tbWFuZHMgYW5kIGZ1bmN0aW9ucyB0aGF0IHVzZSBwYXR0ZXJucyB1c2UgYW5jaG9yZWQgcGF0dGVybnMsIiwKKyJtZWFuaW5nIHRoYXQgXiBhbmQgJCBhcmUgbm90IHRyZWF0ZWQgc3BlY2lhbGx5LCBhbmQgKiBpcyBub3QgYXNzdW1lZCBhdCB0aGUiLAorImJlZ2lubmluZyBvciBlbmQgb2YgdGhlIHBhdHRlcm4uICBUaGlzIGlzIHRydWUgbWFpbmx5IG9mIGZpbGVuYW1lIHBhdHRlcm5zIiwKKyIod2lsZGNhcmRzKSwgc2luY2UgeW91IHdvdWxkIG5vdCB3YW50IGEgY29tbWFuZCBsaWtlIFwiZGVsZXRlIHhcIiB0byBkZWxldGUiLAorImFsbCBmaWxlcyB3aG9zZSBuYW1lcyBjb250YWluZWQgXCJ4XCIhIiwKKyIgIiwKKyJZb3UgY2FuIHVzZSBhbmNob3JlZCBwYXR0ZXJucyBub3Qgb25seSBpbiBmaWxlbmFtZXMsIGJ1dCBhbHNvIGluIFNXSVRDSCIsCisiY2FzZSBsYWJlbHMsIGluIHRoZSBJTlBVVCBhbmQgTUlOUFVUIGNvbW1hbmRzLCBhbmQgaW4gZmlsZSBiaW5hcnktIGFuZCIsCisidGV4dC1wYXR0ZXJucyBmb3IgZmlsZW5hbWVzLiAgVGhlIElGIE1BVENIIHBhdHRlcm4gaXMgYWxzbyBhbmNob3JlZC4iLAorI2VuZGlmIC8qIE5PU1BMICovCisiIiB9OworCitzdGF0aWMgY2hhciAqaG14eHdpbGRbXSA9IHsKKworIkEgXCJ3aWxkY2FyZFwiIGlzIGEgbm90YXRpb24gdXNlZCBpbiBhIGZpbGVuYW1lIHRvIG1hdGNoIG11bHRpcGxlIGZpbGVzLiIsCisiRm9yIGV4YW1wbGUsIGluIFwic2VuZCAqLnR4dFwiIHRoZSBhc3RlcmlzayBpcyBhIHdpbGRjYXJkLiAgS2VybWl0IGNvbW1hbmRzIiwKKyJ0aGF0IGFjY2VwdCBmaWxlbmFtZXMgYWxzbyBhY2NlcHRzIHdpbGRjYXJkcywgZXhjZXB0IGNvbW1hbmRzIHRoYXQgYXJlIiwKKyJhbGxvd2VkIHRvIG9wZXJhdGUgb24gb25seSBvbmUgZmlsZSwgc3VjaCBhcyBUUkFOU01JVC4iLAorIlRoaXMgdmVyc2lvbiBvZiBLZXJtaXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHdpbGRjYXJkczoiLAorIiAiLAorIiogTWF0Y2hlcyBhbnkgc2VxdWVuY2Ugb2YgemVybyBvciBtb3JlIGNoYXJhY3RlcnMuICBGb3IgZXhhbXBsZSwgXCJjayouY1wiIiwKKyIgIG1hdGNoZXMgYWxsIGZpbGVzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggXCJja1wiIGFuZCBlbmQgd2l0aCBcIi5jXCIiLAorIiAgaW5jbHVkaW5nIFwiY2suY1wiLiIsCisiICIsCisjaWZkZWYgVk1TCisiJSBNYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyLiAgRm9yIGV4YW1wbGUsIFwiY2slLmNcIiBtYXRjaGVzIGFsbCBmaWxlcyIsCisjZWxzZQorIj8gTWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3Rlci4gIEZvciBleGFtcGxlLCBcImNrPy5jXCIgbWF0Y2hlcyBhbGwgZmlsZXMiLAorI2VuZGlmIC8qIFZNUyAqLworIiAgd2hvc2UgbmFtZXMgYXJlIGV4YWN0bHkgNSBjaGFyYWN0ZXJzIGxvbmcgYW5kIHN0YXJ0IHdpdGggXCJja1wiIGFuZCBlbmQiLAorI2lmZGVmIFZNUworIiAgd2l0aCBcIi5jXCIuIiwKKyNlbHNlCisiICB3aXRoIFwiLmNcIi4gIFdoZW4gdHlwaW5nIGNvbW1hbmRzIGF0IHRoZSBwcm9tcHQsIHlvdSBtdXN0IHByZWNlZGUgYW55IiwKKyIgIHF1ZXN0aW9uIG1hcmsgdG8gYmUgdXNlZCBmb3IgbWF0Y2hpbmcgYnkgYSBiYWNrc2xhc2ggKFxcKSB0byBvdmVycmlkZSB0aGUiLAorIiAgbm9ybWFsIGZ1bmN0aW9uIG9mIHF1ZXN0aW9uIG1hcmssIHdoaWNoIGlzIHByb3ZpZGluZyBtZW51cyBhbmQgZmlsZSBsaXN0cy4iLAorI2VuZGlmIC8qIFZNUyAqLworIiAiLAorI2lmZGVmIE9TMk9SVU5JWAorI2lmZGVmIENLUkVHRVgKKyJbYWJjXSIsCisiICBTcXVhcmUgYnJhY2tldHMgZW5jbG9zaW5nIGEgbGlzdCBvZiBjaGFyYWN0ZXJzIG1hdGNoZXMgYW55IGNoYXJhY3RlciBpbiIsCisiICB0aGUgbGlzdC4gIEV4YW1wbGU6IGNrdXVzci5bY2hdIG1hdGNoZXMgY2t1dXNyLmMgYW5kIGNrdXVzci5oLiIsCisiICIsCisiW2Etel0iLAorIiAgU3F1YXJlIGJyYWNrZXRzIGVuY2xvc2luZyBhIHJhbmdlIG9mIGNoYXJhY3RlcnMgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGluIiwKKyIgIHRoZSByYW5nZTsgYSBoeXBoZW4gKC0pIHNlcGFyYXRlcyB0aGUgbG93IGFuZCBoaWdoIGVsZW1lbnRzIG9mIHRoZSByYW5nZS4iLAorIiAgRm9yIGV4YW1wbGUsIFthLXpdIG1hdGNoZXMgYW55IGNoYXJhY3RlciBmcm9tIGEgdG8gei4iLAorIiAiLAorIlthY2RtLXpdIiwKKyIgIExpc3RzIGFuZCByYW5nZXMgbWF5IGJlIGNvbWJpbmVkLiAgVGhpcyBleGFtcGxlIG1hdGNoZXMgYSwgYywgZCwgb3IgYW55IiwKKyIgIGxldHRlciBmcm9tIG0gdGhyb3VnaCB6LiIsCisiICIsCisie3N0cmluZzEsc3RyaW5nMiwuLi59IiwKKyIgIEJyYWNlcyBlbmNsb3NlIGEgbGlzdCBvZiBzdHJpbmdzIHRvIGJlIG1hdGNoZWQuICBGb3IgZXhhbXBsZToiLAorIiAgY2t7dWZpbyx2Y29uLGNtYWl9LmMgbWF0Y2hlcyBja3VmaW8uYywgY2t2Y29uLmMsIG9yIGNrY21haS5jLiAgVGhlIHN0cmluZ3MiLAorIiAgbWF5IHRoZW1zZWx2ZXMgY29udGFpbiAqLCA/LCBbYWJjXSwgW2Etel0sIG9yIG90aGVyIGxpc3RzIG9mIHN0cmluZ3MuIiwKKyNlbmRpZiAvKiBDS1JFR0VYICovCisjZW5kaWYgLyogT1MyT1JVTklYICovCisiICIsCisiVG8gZm9yY2UgYSBzcGVjaWFsIHBhdHRlcm4gY2hhcmFjdGVyIHRvIGJlIHRha2VuIGxpdGVyYWxseSwgcHJlY2VkZSBpdCB3aXRoIiwKKyJhIGJhY2tzbGFzaCwgZS5nLiBbYVxcLXpdIG1hdGNoZXMgYSwgaHlwaGVuLCBhbmQgeiByYXRoZXIgdGhhbiBhIHRocm91Z2ggei4iLAorIiAiLAorI2lmbmRlZiBOT1NQTAorIlNpbWlsYXIgbm90YXRpb24gY2FuIGJlIHVzZWQgaW4gZ2VuZXJhbC1wdXJwb3NlIHN0cmluZyBtYXRjaGluZy4gIFR5cGUgSEVMUCIsCisiUEFUVEVSTlMgZm9yIGRldGFpbHMuICBBbHNvIHNlZSBIRUxQIFNFVCBNQVRDSC4iLAorI2VuZGlmIC8qIE5PU1BMICovCisiIiB9OworCisjaWZuZGVmIE5PWEZFUgorc3RhdGljIGNoYXIgKmhteHhmYXN0W10gPSB7CisiRkFTVCwgQ0FVVElPVVMsIGFuZCBST0JVU1QgYXJlIHByZWRlZmluZWQgbWFjcm9zIHRoYXQgc2V0IHNldmVyYWwiLAorImZpbGUtdHJhbnNmZXIgcGFyYW1ldGVycyBhdCBvbmNlIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgZmlsZS10cmFuc2ZlciBnb2FsLiIsCisiRkFTVCBjaG9vc2VzIGEgbGFyZ2UgcGFja2V0IHNpemUsIGEgbGFyZ2Ugd2luZG93IHNpemUsIGFuZCBhIGZhaXIgYW1vdW50IG9mIiwKKyJjb250cm9sLWNoYXJhY3RlciB1bnByZWZpeGluZyBhdCB0aGUgcmlzayBvZiBwb3NzaWJsZSBmYWlsdXJlIG9uIHNvbWUiLAorImNvbm5lY3Rpb25zLiAgRkFTVCBpcyB0aGUgZGVmYXVsdCB0dW5pbmcgaW4gQy1LZXJtaXQgNy4wIGFuZCBsYXRlci4gIEluIGNhc2UiLAorIkZBU1QgZmlsZSB0cmFuc2ZlcnMgZmFpbCBmb3IgeW91IG9uIGEgcGFydGljdWxhciBjb25uZWN0aW9uLCB0cnkgQ0FVVElPVVMuIiwKKyJJZiB0aGF0IGZhaWxzIHRvbywgdHJ5IFJPQlVTVC4gIFlvdSBjYW4gYWxzbyBjaGFuZ2UgdGhlIGRlZmluaXRpb25zIG9mIGVhY2giLAorIm1hY3JvIHdpdGggdGhlIERFRklORSBjb21tYW5kLiAgVG8gc2VlIHRoZSBjdXJyZW50IGRlZmluaXRpb25zLCB0eXBlIiwKKyJcInNob3cgbWFjcm8gZmFzdFwiLCBcInNob3cgbWFjcm8gY2F1dGlvdXNcIiwgb3IgXCJzaG93IG1hY3JvIHJvYnVzdFwiLiIsCisiIgorfTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIFZNUworc3RhdGljIGNoYXIgKiBobXh4cHVyZ2VbXSA9IHsKKyJTeW50YXg6IFBVUkdFIFsgc3dpdGNoZXMgXSBbIGZpbGVzcGVjIF0iLAorIiAgUnVucyB0aGUgRENMIFBVUkdFIGNvbW1hbmQuICBTd2l0Y2hlcyBhbmQgZmlsZXNwZWMgYXJlIG5vdCBwYXJzZWQgb3IiLAorIiAgdmVyaWZpZWQgYnkgS2VybWl0LCBidXQgcGFzc2VkIGRpcmVjdGx5IHRvIERDTC4iLAorIiIKK307CisjZWxzZQorI2lmZGVmIENLUFVSR0UKK3N0YXRpYyBjaGFyICogaG14eHB1cmdlW10gPSB7CisiU3ludGF4OiBQVVJHRSBbIHN3aXRjaGVzIF0gWyBmaWxlc3BlYyBdIiwKKyIgIERlbGV0ZXMgYmFja3VwIGZpbGVzOyB0aGF0IGlzLCBmaWxlcyB3aG9zZSBuYW1lcyBlbmQgaW4gXCIufm5+XCIsIHdoZXJlIiwKKyIgIG4gaXMgYSBudW1iZXIuICBQVVJHRSBieSBpdHNlbGYgZGVsZXRlcyBhbGwgYmFja3VwIGZpbGVzIGluIHRoZSBjdXJyZW50IiwKKyIgIGRpcmVjdG9yeS4gIFN3aXRjaGVzOiIsCisKKyIgIiwKKyIvQUZURVI6ZGF0ZS10aW1lIiwKKyNpZmRlZiBWTVMKKyIgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgY3JlYXRlZCBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS10aW1lIGFyZSIsCisjZWxzZQorIiAgU3BlY2lmaWVzIHRoYXQgb25seSB0aG9zZSBmaWxlcyBtb2RpZmllZCBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS10aW1lIGFyZSIsCisjZW5kaWYgLyogVk1TICovCisiICB0byBiZSBwdXJnZWQuICBIRUxQIERBVEUgZm9yIGluZm8gYWJvdXQgZGF0ZS10aW1lIGZvcm1hdHMuIiwKKyIgIiwKKyIvQkVGT1JFOmRhdGUtdGltZSIsCisjaWZkZWYgVk1TCisiICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIG1vZGlmaWVkIGJlZm9yZSB0aGUgZ2l2ZW4gZGF0ZS10aW1lIiwKKyNlbHNlCisiICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIG1vZGlmaWVkIGJlZm9yZSB0aGUgZ2l2ZW4gZGF0ZS10aW1lIiwKKyNlbmRpZiAvKiBWTVMgKi8KKyIgIGFyZSB0byBiZSBwdXJnZWQuIiwKKyIgIiwKKyIvTk9ULUFGVEVSOmRhdGUtdGltZSIsCisjaWZkZWYgVk1TCisiICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIG1vZGlmaWVkIGF0IG9yIGJlZm9yZSB0aGUgZ2l2ZW4gZGF0ZS10aW1lIiwKKyNlbHNlCisiICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIG1vZGlmaWVkIGF0IG9yIGJlZm9yZSB0aGUgZ2l2ZW4gZGF0ZS10aW1lIiwKKyNlbmRpZiAvKiBWTVMgKi8KKyIgIGFyZSB0byBiZSBwdXJnZWQuIiwKKyIgIiwKKyIvTk9ULUJFRk9SRTpkYXRlLXRpbWUiLAorI2lmZGVmIFZNUworIiAgU3BlY2lmaWVzIHRoYXQgb25seSB0aG9zZSBmaWxlcyBtb2RpZmllZCBhdCBvciBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS10aW1lIiwKKyNlbHNlCisiICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIG1vZGlmaWVkIGF0IG9yIGFmdGVyIHRoZSBnaXZlbiBkYXRlLXRpbWUiLAorI2VuZGlmIC8qIFZNUyAqLworIiAgYXJlIHRvIGJlIHB1cmdlZC4iLAorIiAiLAorIi9MQVJHRVItVEhBTjpudW1iZXIiLAorIiAgU3BlY2lmaWVzIHRoYXQgb25seSB0aG9zZSBmaWxlcyBsb25nZXIgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGFyZSIsCisiICB0byBiZSBwdXJnZWQuIiwKKyIgIiwKKyIvU01BTExFUi1USEFOOm51bWJlciIsCisiICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIHNtYWxsZXIgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGFyZSIsCisiICB0byBiZSBwdXJnZWQuIiwKKyIgIiwKKyIvRVhDRVBUOnBhdHRlcm4iLAorIiAgU3BlY2lmaWVzIHRoYXQgYW55IGZpbGVzIHdob3NlIG5hbWVzIG1hdGNoIHRoZSBwYXR0ZXJuLCB3aGljaCBjYW4gYmUgYSIsCisiICByZWd1bGFyIGZpbGVuYW1lIG9yIG1heSBjb250YWluIHdpbGRjYXJkcywgYXJlIG5vdCB0byBiZSBwdXJnZWQuICBUbyIsCisiICBzcGVjaWZ5IG11bHRpcGxlIHBhdHRlcm5zICh1cCB0byA4KSwgdXNlIG91dGVyIGJyYWNlcyBhcm91bmQgdGhlIGdyb3VwIiwKKyIgIGFuZCBpbm5lciBicmFjZXMgYXJvdW5kIGVhY2ggcGF0dGVybjoiLAorIiAiLAorIiAgICAvRVhDRVBUOnt7cGF0dGVybjF9e3BhdHRlcm4yfS4uLn0iLAorIiAiLAorI2lmZGVmIFVOSVhPUk9TSworIi9ET1RGSUxFUyIsCisiICBJbmNsdWRlIChwdXJnZSkgZmlsZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBcIi5cIi4iLAorIiAiLAorIi9OT0RPVEZJTEVTIiwKKyIgIFNraXAgKGRvbid0IHB1cmdlKSBmaWxlcyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIFwiLlwiLiIsCisiICIsCisjZW5kaWYgLyogVU5JWE9ST1NLICovCisjaWZkZWYgUkVDVVJTSVZFCisiL1JFQ1VSU0lWRSIsCisiICBEZXNjZW5kcyB0aHJvdWdoIHRoZSBjdXJyZW50IG9yIHNwZWNpZmllZCBkaXJlY3RvcnkgdHJlZS4iLAorIiAiLAorI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworIi9LRUVQOm4iLAorIiAgUmV0YWluIHRoZSAnbicgbW9zdCByZWNlbnQgKGhpZ2hlc3QtbnVtYmVyZWQpIGJhY2t1cCBmaWxlcyBmb3IgZWFjaCBmaWxlLiIsCisiICBCeSBkZWZhdWx0LCBub25lIGFyZSBrZXB0LiAgSWYgL0tFRVAgaXMgZ2l2ZW4gd2l0aG91dCBhIG51bWJlciwgMSBpcyB1c2VkLiIsCisiICIsCisiL0xJU1QiLAorIiAgRGlzcGxheSBlYWNoIGZpbGUgYXMgaXQgaXMgcHJvY2Vzc2VkIGFuZCBzYXkgd2hldGhlciBpdCBpcyBwdXJnZWQgb3Iga2VwdC4iLAorIiAgU3lub255bXM6IC9MT0csIC9WRVJCT1NFLiIsCisiICIsCisiL05PTElTVCIsCisiICBUaGUgUFVSR0UgY29tbWFuZCBzaG91bGQgb3BlcmF0ZSBzaWxlbnRseSAoZGVmYXVsdCkuIiwKKyIgIFN5bm9ueW1zOiAvTk9MT0csIC9RVUlFVC4iLAorIiAiLAorIi9IRUFESU5HIiwKKyIgIFByaW50IGhlYWRpbmcgYW5kIHN1bW1hcnkgaW5mb3JtYXRpb24uIiwKKyIgIiwKKyIvTk9IRUFESU5HIiwKKyIgIERvbid0IHByaW50IGhlYWRpbmcgYW5kIHN1bW1hcnkgaW5mb3JtYXRpb24uIiwKKyIgIiwKKyIvUEFHRSIsCisiICBXaGVuIC9MSVNUIGlzIGluIGVmZmVjdCwgcGF1c2UgYXQgdGhlIGVuZCBvZiBlYWNoIHNjcmVlbmZ1bCwgZXZlbiBpZiIsCisiICBDT01NQU5EIE1PUkUtUFJPTVBUSU5HIGlzIE9GRi4iLAorIiAiLAorIi9OT1BBR0UiLAorIiAgRG9uJ3QgcGF1c2UsIGV2ZW4gaWYgQ09NTUFORCBNT1JFLVBST01QVElORyBpcyBPTi4iLAorIiAiLAorIi9BU0siLAorIiAgSW50ZXJhY3RpdmVseSBhc2sgcGVybWlzc2lvbiB0byBkZWxldGUgZWFjaCBiYWNrdXAgZmlsZS4iLAorIiAiLAorIi9OT0FTSyIsCisiICBQdXJnZSBiYWNrdXAgZmlsZXMgd2l0aG91dCBhc2tpbmcgcGVybWlzc2lvbi4iLAorIiAiLAorIi9TSU1VTEFURSIsCisiICBJbmhpYml0cyB0aGUgYWN0dWFsIGRlbGV0aW9uIG9mIGZpbGVzOyB1c2UgdG8gcHJldmlldyB3aGljaCBmaWxlcyB3b3VsZCIsCisiICBhY3R1YWxseSBiZSBkZWxldGVkLiAgSW1wbGllcyAvTElTVC4iLAorIiAiLAorIlVzZSBTRVQgT1BUSU9OUyBQVVJHRSBbIHN3aXRjaGVzIF0gdG8gY2hhbmdlIGRlZmF1bHRzOyB1c2UgU0hPVyBPUFRJT05TIHRvIiwKKyJkaXNwbGF5IGN1c3RvbWl6ZWQgZGVmYXVsdHMuICBBbHNvIHNlZSBIRUxQIERFTEVURSwgSEVMUCBXSUxEQ0FSRC4iLAorIiIKK307CisjZW5kaWYgLyogQ0tQVVJHRSAqLworI2VuZGlmIC8qIFZNUyAqLworCitzdGF0aWMgY2hhciAqaG14eGNsb1tdID0geworIlN5bnRheDogIENMT1NFIFsgaXRlbSBdIiwKKyIgIENsb3NlIHRoZSBpbmRpY2F0ZWQgaXRlbS4gIFRoZSBkZWZhdWx0IGl0ZW0gaXMgQ09OTkVDVElPTiwgd2hpY2ggaXMgdGhlIiwKKyIgIGN1cnJlbnQgU0VUIExJTkUgb3IgU0VUIEhPU1QgY29ubmVjdGlvbi4gIFRoZSBvdGhlciBpdGVtcyBhcmU6IiwKKyIgIiwKKyNpZmRlZiBDS0xPR0RJQUwKKyIgICAgQ1gtTE9HICAgICAgICAgIChjb25uZWN0aW9uIGxvZywgb3BlbmVkIHdpdGggTE9HIENYKSIsCisjZW5kaWYgLyogQ0tMT0dESUFMICovCisjaWZuZGVmIE5PTE9DQUwKKyIgICAgU0VTU0lPTi1MT0cgICAgIChvcGVuZWQgd2l0aCBMT0cgU0VTU0lPTikiLAorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZmRlZiBUTE9HCisiICAgIFRSQU5TQUNUSU9OLUxPRyAob3BlbmVkIHdpdGggTE9HIFRSQU5TQUNUSU9OUykiLAorI2VuZGlmIC8qIFRMT0cgKi8KKyIgICAgUEFDS0VULUxPRyAgICAgIChvcGVuZWQgd2l0aCBMT0cgUEFDS0VUUykiLAorI2lmZGVmIERFQlVHCisiICAgIERFQlVHLUxPRyAgICAgICAob3BlbmVkIHdpdGggTE9HIERFQlVHKSIsCisjZW5kaWYgLyogREVCVUcgKi8KKyNpZm5kZWYgTk9TUEwKKyIgICAgUkVBRC1GSUxFICAgICAgIChvcGVuZWQgd2l0aCBPUEVOIFJFQUQpIiwKKyIgICAgV1JJVEUtRklMRSAgICAgIChvcGVuZWQgd2l0aCBPUEVOIFdSSVRFIG9yIE9QRU4gQVBQRU5EKSIsCisjZW5kaWYgLyogTk9TUEwgKi8KKyIgIiwKKyJUeXBlIEhFTFAgTE9HIGFuZCBIRUxQIE9QRU4gZm9yIGZ1cnRoZXIgaW5mby4iLAorIiIKK307CisKKyNpZmRlZiBDS0xFQVJOCitzdGF0aWMgY2hhciAqIGhteHhsZWFybltdID0geworIlN5bnRheDogTEVBUk4gWyAvT04gL09GRiAvQ0xPU0UgXSBbIGZpbGVuYW1lIF0iLAorIiAgUmVjb3JkcyBhIGxvZ2luIHNjcmlwdC4gIElmIHlvdSBnaXZlIGEgZmlsZW5hbWUsIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3IiLAorIiAgc3Vic2VxdWVudCByZWNvcmRpbmcuICBJZiB5b3UgZG9uJ3QgZ2l2ZSBhbnkgc3dpdGNoZXMsIC9PTiBpcyBhc3N1bWVkLiIsCisiICAvT04gZW5hYmxlcyByZWNvcmRpbmcgdG8gdGhlIGN1cnJlbnQgZmlsZSAoaWYgYW55KTsgL09GRiBkaXNhYmxlcyIsCisiICByZWNvcmRpbmcuICAvQ0xPU0UgY2xvc2VzIHRoZSBjdXJyZW50IGZpbGUgKGlmIGFueSkuICBBZnRlciBMRUFSTiAvQ0xPU0UiLAorIiAgb3IgZXhpdCBmcm9tIEtlcm1pdCwgeW91ciBzY3JpcHQgaXMgYXZhaWxhYmxlIGZvciBleGVjdXRpb24gYnkgdGhlIFRBS0UiLAorIiAgY29tbWFuZC4iLAorIiIKK307CisjZW5kaWYgLyogQ0tMRUFSTiAqLworCisjaWZkZWYgQ0tfTUlOUFVUCitzdGF0aWMgY2hhciAqaG14eG1pbnBbXSA9IHsKKyJTeW50YXg6ICBNSU5QVVQgbiBbIHN0cmluZzEgWyBzdHJpbmcyIFsgLi4uIF0gXSBdIiwKKyJFeGFtcGxlOiBNSU5QVVQgNSBMb2dpbjoge1VzZXJuYW1lOiB9IHtOTyBDQVJSSUVSfSBCVVNZIFJJTkciLAorIiAgRm9yIHVzZSBpbiBzY3JpcHQgcHJvZ3JhbXMuICBXYWl0cyB1cCB0byBuIHNlY29uZHMgZm9yIGFueSBvbmUgb2YgdGhlIiwKKyIgIHN0cmluZ3MgdG8gYXJyaXZlIG9uIHRoZSBjb21tdW5pY2F0aW9uIGRldmljZS4gIElmIG5vIHN0cmluZ3MgYXJlIGdpdmVuLCIsCisiICB0aGUgY29tbWFuZCB3YWl0cyBmb3IgYW55IGNoYXJhY3RlciBhdCBhbGwgdG8gYXJyaXZlLiAgU3RyaW5ncyBhcmUiLAorIiAgc2VwYXJhdGVkIGJ5IHNwYWNlczsgdXNlIHsgYnJhY2VzIH0gZm9yIGdyb3VwaW5nLiAgSWYgYW55IG9mIHRoZSBzdHJpbmdzIiwKKyIgIGlzIGVuY291bnRlcmVkIHdpdGhpbiB0aGUgdGltZW91dCBpbnRlcnZhbCwgdGhlIGNvbW1hbmQgc3VjY2VlZHMgYW5kIHRoZSIsCisiICBcXHYobWlucHV0KSB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiB0aGUgc3RyaW5nIHRoYXQgd2FzIG1hdGNoZWQ6IiwKKyIgIDEsIDIsIDMsIGV0Yy4gIElmIG5vbmUgb2YgdGhlIHN0cmluZ3MgYXJyaXZlcywgdGhlIGNvbW1hbmQgdGltZXMgb3V0LCIsCisiICBmYWlscywgYW5kIFxcdihtaW5wdXQpIGlzIHNldCB0byAwLiAgSWYgdGhlIHRpbWVvdXQgaW50ZXJ2YWwgaXMgMCB0aGUiLAorIiAgTUlOUFVUIGNvbW1hbmQgZG9lcyBub3Qgd2FpdDsgaS5lLiB0aGUgZ2l2ZW4gdGV4dCBtdXN0IGFscmVhZHkgYmUiLAorIiAgYXZhaWxhYmxlIGZvciByZWFkaW5nIGZvciB0aGUgTUlOUFVUIGNvbW1hbmQgdG8gc3VjY2VlZC4gIElmIHRoZSBpbnRlcnZhbCIsCisiICBpcyBuZWdhdGl2ZSwgdGhlIE1JTlBVVCBjb21tYW5kIHdhaXRzIGZvcmV2ZXIuIiwKKyIgIiwKKyJBbHNvIHNlZTogSU5QVVQsIFJFSU5QVVQsIFNFVCBJTlBVVC4iLAorIiIgfTsKKyNlbmRpZiAvKiBDS19NSU5QVVQgKi8KKworI2lmbmRlZiBOT0xPQ0FMCitzdGF0aWMgY2hhciAqaG14eGNvbltdID0geworIlN5bnRheDogQ09OTkVDVCAob3IgQywgb3IgQ1EpIFsgc3dpdGNoZXMgXSIsCisiICBDb25uZWN0IHRvIGEgcmVtb3RlIGNvbXB1dGVyIHZpYSB0aGUgc2VyaWFsIGNvbW11bmljYXRpb25zIGRldmljZSBnaXZlbiBpbiIsCisjaWZkZWYgT1MyCisiICB0aGUgbW9zdCByZWNlbnQgU0VUIFBPUlQgY29tbWFuZCwgb3IgdG8gdGhlIG5ldHdvcmsgaG9zdCBuYW1lZCBpbiB0aGUgbW9zdCIsCisjZWxzZQorIiAgdGhlIG1vc3QgcmVjZW50IFNFVCBMSU5FIGNvbW1hbmQsIG9yIHRvIHRoZSBuZXR3b3JrIGhvc3QgbmFtZWQgaW4gdGhlIG1vc3QiLAorI2VuZGlmIC8qIE9TMiAqLworIiAgcmVjZW50IFNFVCBIT1NUIGNvbW1hbmQuICBUeXBlIHRoZSBlc2NhcGUgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IEMgdG8gZ2V0IiwKKyIgIGJhY2sgdG8gdGhlIEMtS2VybWl0IHByb21wdCwgb3IgZm9sbG93ZWQgYnkgPyBmb3IgYSBsaXN0IG9mIENPTk5FQ1QtbW9kZSIsCisjaWZkZWYgT1MyCisiICBlc2NhcGUgY29tbWFuZHMuICBZb3UgY2FuIGFsc28gYXNzaWduIHRoZSBcXEtleGl0IHZlcmIgdG8gdGhlIGtleSBvciIsCisiICBrZXktY29tYmluYXRpb24gb2YgeW91ciBjaG9pY2U7IGJ5IGRlZmF1bHQgaXQgaXMgYXNzaWduZWQgdG8gQWx0LXguIiwKKyNlbHNlCisiICBlc2NhcGUgY29tbWFuZHMuIiwKKyIgIiwKKyJJbmNsdWRlIHRoZSAvUVVJRVRMWSBzd2l0Y2ggdG8gc3VwcHJlc3MgdGhlIGluZm9ybWF0aW9uYWwgbWVzc2FnZSB0aGF0IiwKKyJ0ZWxscyB5b3UgaG93IHRvIGVzY2FwZSBiYWNrLCBldGMuICBDUSBpcyBhIHN5bm9ueW0gZm9yIENPTk5FQ1QgL1FVSUVUTFkuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyIgIiwKKyJPdGhlciBzd2l0Y2hlcyBpbmNsdWRlOiIsCisjaWZkZWYgQ0tfVFJJR0dFUgorIiAiLAorIi9UUklHR0VSOnN0cmluZyIsCisiICBPbmUgb3IgbW9yZSBzdHJpbmdzIHRvIGxvb2sgZm9yIHRoYXQgd2lsbCBjYXVzZSBhdXRvbWF0aWMgcmV0dXJuIHRvIiwKKyIgIGNvbW1hbmQgbW9kZS4gIFRvIHNwZWNpZnkgb25lIHN0cmluZywganVzdCBwdXQgaXQgcmlnaHQgYWZ0ZXIgdGhlIiwKKyIgIGNvbG9uLCBlLmcuIFwiL1RSSUdHRVI6R29vZGJ5ZVwiLiAgSWYgdGhlIHN0cmluZyBjb250YWlucyBhbnkgc3BhY2VzLCB5b3UiLAorIiAgbXVzdCBlbmNsb3NlIGl0IGluIGJyYWNlcywgZS5nLiBcIi9UUklHR0VSOntSRUFEWSBUTyBTRU5ELi4ufVwiLiAgVG8iLAorIiAgc3BlY2lmeSBtb3JlIHRoYW4gb25lIHRyaWdnZXIsIHVzZSB0aGUgZm9sbG93aW5nIGZvcm1hdDoiLAorIiAiLAorIiAgICAvVFJJR0dFUjp7e3N0cmluZzF9e3N0cmluZzJ9Li4ue3N0cmluZ259fSIsCisiICIsCisiICBVcG9uIHJldHVybiBmcm9tIENPTk5FQ1QgbW9kZSwgdGhlIHZhcmlhYmxlIFxcdih0cmlnZ2VyKSBpcyBzZXQgdG8gdGhlIiwKKyIgIHRyaWdnZXIgc3RyaW5nLCBpZiBhbnksIHRoYXQgd2FzIGFjdHVhbGx5IGVuY291bnRlcmVkLiAgVGhpcyB2YWx1ZSwgbGlrZSIsCisiICBhbGwgb3RoZXIgQ09OTkVDVCBzd2l0Y2hlcyBhcHBsaWVzIG9ubHkgdG8gdGhlIENPTk5FQ1QgY29tbWFuZCB3aXRoIHdoaWNoIiwKKyIgIGl0IGlzIGdpdmVuLCBhbmQgb3ZlcnJpZGVzICh0ZW1wb3JhcmlseSkgYW55IGdsb2JhbCBTRVQgVEVSTUlOQUwgVFJJR0dFUiIsCisiICBzdHJpbmcgdGhhdCBtaWdodCBiZSBpbiBlZmZlY3QuIiwKKyNlbmRpZiAvKiBDS19UUklHR0VSICovCisjaWZkZWYgT1MyCisiICIsCisiL0lETEUtTElNSVQ6bnVtYmVyIiwKKyIgIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiBpZGxlIHRpbWUsIGFmdGVyIHdoaWNoIEtlcm1pdCByZXR1cm5zIiwKKyIgIGF1dG9tYXRpY2FsbHkgdG8gY29tbWFuZCBtb2RlOyBkZWZhdWx0IDAgKG5vIGxpbWl0KS4iLAorIiAiLAorIi9JRExFLUlOVEVSVkFMOm51bWJlciIsCisiICBUaGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgaWRsZSB0aW1lLCBhZnRlciB3aGljaCBLZXJtaXQgYXV0b21hdGljYWxseSIsCisiICB0cmFuc21pdHMgdGhlIGlkbGUgc3RyaW5nLiIsCisiICIsCisiL0lETEUtU1RSSU5HOnN0cmluZyIsCisiICBUaGUgc3RyaW5nIHRvIHRyYW5zbWl0IHdoZW5ldmVyIHRoZSBpZGxlIGludGVydmFsIGhhcyBwYXNzZWQuIiwKKyIgIiwKKyIvVElNRS1MSU1JVDpudW1iZXIiLAorIiAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlY29uZHMgZm9yIHdoaWNoIHRoZSBDT05ORUNUIHNlc3Npb24gbWF5IGxhc3QuIiwKKyIgIFRoZSBkZWZhdWx0IGlzIDAgKG5vIGxpbWl0KS4gIElmIGEgbm9uemVybyBudW1iZXIgaXMgZ2l2ZW4sIEtlcm1pdCByZXR1cm5zIiwKKyIgIGF1dG9tYXRpY2FsbHkgdG8gY29tbWFuZCBtb2RlIGFmdGVyIHRoaXMgbWFueSBzZWNvbmRzLiIsCisjZW5kaWYgLyogT1MyICovCisiIiB9OworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworc3RhdGljIGNoYXIgKmhteHhtZ2V0W10gPSB7CisiU3ludGF4OiBNR0VUIFsgc3dpdGNoZXMuLi4gXSByZW1vdGUtZmlsZXNwZWMgWyByZW1vdGUtZmlsZXNwZWMgLi4uIF0iLAorIiAiLAorIkp1c3QgbGlrZSBHRVQgKHEudi4pIGV4Y2VwdCBhbGxvd3MgYSBsaXN0IG9mIHJlbW90ZSBmaWxlIHNwZWNpZmljYXRpb25zLCIsCisic2VwYXJhdGVkIGJ5IHNwYWNlcy4iLAorIiIKK307CisKK3N0YXRpYyBjaGFyICpobXh4Z2V0W10gPSB7CisiU3ludGF4OiBHRVQgWyBzd2l0Y2hlcy4uLiBdIHJlbW90ZS1maWxlc3BlYyBbIGFzLW5hbWUgXSIsCisiICBUZWxscyB0aGUgb3RoZXIgS2VybWl0LCB3aGljaCBtdXN0IGJlIGluIChvciBzdXBwb3J0IGF1dG9zd2l0Y2hpbmcgaW50bykiLAorIiAgc2VydmVyIG1vZGUsIHRvIHNlbmQgdGhlIG5hbWVkIGZpbGUgb3IgZmlsZXMuICBJZiB0aGUgcmVtb3RlLWZpbGVzcGVjIG9yIiwKKyIgIHRoZSBhcy1uYW1lIGNvbnRhaW4gc3BhY2VzLCB0aGV5IG11c3QgYmUgZW5jbG9zZWQgaW4gYnJhY2VzLiAgSWYgYXMtbmFtZSIsCisiICBpcyB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBsb2NhbCBkaXJlY3RvcnksIGluY29taW5nIGZpbGVzIGFyZSBwbGFjZWQgaW4iLAorIiAgdGhhdCBkaXJlY3Rvcnk7IGlmIGl0IGlzIHRoZSBuYW1lIG9mIGRpcmVjdG9yeSB0aGF0IGRvZXMgbm90IGV4aXN0LCBLZXJtaXQiLAorIiAgdHJpZXMgdG8gY3JlYXRlIGl0LiAgT3B0aW9uYWwgc3dpdGNoZXMgaW5jbHVkZToiLAorIiAiLAorIi9BUy1OQU1FOnRleHQiLAorIiAgU3BlY2lmaWVzIFwidGV4dFwiIGFzIHRoZSBuYW1lIHRvIHN0b3JlIHRoZSBpbmNvbWluZyBmaWxlIHVuZGVyLCBvciIsCisiICBkaXJlY3RvcnkgdG8gc3RvcmUgaXQgaW4uICBZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgYXMtbmFtZSBhcyB0aGUgc2Vjb25kIiwKKyIgIGZpbGVuYW1lIG9uIHRoZSBHRVQgY29tbWFuZCBsaW5lLiIsCisiICIsCisiL0JJTkFSWSIsCisiICBQZXJmb3JtcyB0aGlzIHRyYW5zZmVyIGluIGJpbmFyeSBtb2RlIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBnbG9iYWwiLAorIiAgdHJhbnNmZXIgbW9kZS4iLAorIiAiLAorIi9DT01NQU5EIiwKKyIgIFJlY2VpdmVzIHRoZSBmaWxlIGludG8gdGhlIHN0YW5kYXJkIGlucHV0IG9mIGEgY29tbWFuZCwgcmF0aGVyIHRoYW4gc2F2aW5nIiwKKyIgIGl0IG9uICBkaXNrLiAgVGhlIC9BUy1OQU1FIG9yIHRoZSBzZWNvbmQgXCJmaWxlbmFtZVwiIG9uIHRoZSBHRVQgY29tbWFuZCIsCisiICBsaW5lIGlzIGludGVycHJldGVkIGFzIHRoZSBuYW1lIG9mIGEgY29tbWFuZC4iLAorIiAiLAorIi9ERUxFVEUiLAorIiAgQXNrcyB0aGUgb3RoZXIgS2VybWl0IHRvIGRlbGV0ZSB0aGUgZmlsZSAob3IgZWFjaCBmaWxlIGluIHRoZSBncm91cCkiLAorIiAgYWZ0ZXIgaXQgaGFzIGJlZW4gdHJhbnNmZXJyZWQgc3VjY2Vzc2Z1bGx5LiIsCisiICIsCisiL0VYQ0VQVDpwYXR0ZXJuIiwKKyIgIFNwZWNpZmllcyB0aGF0IGFueSBmaWxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcGF0dGVybiwgd2hpY2ggY2FuIGJlIGEiLAorIiAgcmVndWxhciBmaWxlbmFtZSwgb3IgbWF5IGNvbnRhaW4gXCIqXCIgYW5kL29yIFwiP1wiIG1ldGFjaGFyYWN0ZXJzLCIsCisiICBhcmUgdG8gYmUgcmVmdXNlZC4gIFRvIHNwZWNpZnkgbXVsdGlwbGUgcGF0dGVybnMgKHVwIHRvIDgpLCB1c2Ugb3V0ZXIiLAorIiAgYnJhY2VzIGFyb3VuZCB0aGUgZ3JvdXAsIGFuZCBpbm5lciBicmFjZXMgYXJvdW5kIGVhY2ggcGF0dGVybjoiLAorIiAiLAorIiAgICAvRVhDRVBUOnt7cGF0dGVybjF9e3BhdHRlcm4yfS4uLn0iLAorIiAiLAorIi9GSUxFTkFNRVM6e0NPTlZFUlRFRCxMSVRFUkFMfSIsCisiICBPdmVycmlkZXMgdGhlIGdsb2JhbCBTRVQgRklMRSBOQU1FUyBzZXR0aW5nIGZvciB0aGlzIHRyYW5zZmVyIG9ubHkuIiwKKyIgIiwKKyIvRklMVEVSOmNvbW1hbmQiLAorIiAgQ2F1c2VzIHRoZSBpbmNvbWluZyBmaWxlIHRvIHBhc3NlZCB0aHJvdWdoIHRoZSBnaXZlbiBjb21tYW5kIChzdGFuZGFyZCIsCisiICBpbnB1dC9vdXRwdXQgZmlsdGVyKSBiZWZvcmUgYmVpbmcgd3JpdHRlbiB0byBkaXNrLiIsCisiICIsCisjaWZkZWYgVk1TCisiL0lNQUdFIiwKKyIgIFRyYW5zZmVyIGluIGltYWdlIG1vZGUuIiwKKyIgIiwKKyNlbmRpZiAvKiBWTVMgKi8KKyNpZmRlZiBDS19MQUJFTEVECisiL0xBQkVMRUQiLAorIiAgVk1TIGFuZCBPUy8yIG9ubHk6IFNwZWNpZmllcyBsYWJlbGVkIHRyYW5zZmVyIG1vZGUuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisKKyIvTU9WRS1UTzpkaXJlY3RvcnktbmFtZSIsCisiICBTcGVjaWZpZXMgdGhhdCBlYWNoIGZpbGUgdGhhdCBhcnJpdmVzIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgc3BlY2lmaWVkIiwKKyIgIGRpcmVjdG9yeSBhZnRlciwgYW5kIG9ubHkgaWYsIGl0IGhhcyBiZWVuIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseS4iLAorIiAiLAorIi9QQVRITkFNRVM6e09GRixBQlNPTFVURSxSRUxBVElWRSxBVVRPfSIsCisiICBPdmVycmlkZXMgdGhlIGdsb2JhbCBTRVQgUkVDRUlWRSBQQVRITkFNRVMgc2V0dGluZyBmb3IgdGhpcyB0cmFuc2Zlci4iLAorIiAiLAorIi9QSVBFUzp7T04sT0ZGfSIsCisiICBPdmVycmlkZXMgdGhlIFRSQU5TRkVSIFBJUEVTIHNldHRpbmcgZm9yIHRoaXMgY29tbWFuZCBvbmx5LiAgT04gYWxsb3dzIiwKKyIgIHJlY2VwdGlvbiBvZiBmaWxlcyB3aXRoIG5hbWVzIGxpa2UgXCIhdGFyIHhmIC1cIiB0byBiZSBhdXRvbWF0aWNhbGx5IiwKKyIgIGRpcmVjdGVkIHRvIGEgcGlwZWxpbmUuIiwKKyIgIiwKKyIvUVVJRVQiLAorIiAgV2hlbiBzZW5kaW5nIGluIGxvY2FsIG1vZGUsIHRoaXMgc3VwcHJlc3NlcyB0aGUgZmlsZS10cmFuc2ZlciBkaXNwbGF5LiIsCisiICIsCisiL1JFQ09WRVIiLAorIiAgVXNlZCB0byByZWNvdmVyIGZyb20gYSBwcmV2aW91c2x5IGludGVycnVwdGVkIHRyYW5zZmVyOyBHRVQgL1JFQ09WRVIiLAorIiAgaXMgZXF1aXZhbGVudCBSRUdFVC4gIFdvcmtzIG9ubHkgaW4gYmluYXJ5IG1vZGUuIiwKKyIgIiwKKyIvUkVDVVJTSVZFIiwKKyIgIFRlbGxzIHRoZSBzZXJ2ZXIgdG8gZGVzY2VuZCB0aHJvdWdoIHRoZSBkaXJlY3RvcnkgdHJlZSB3aGVuIGxvY2F0aW5nIiwKKyIgIHRoZSBmaWxlcyB0byBiZSBzZW50LiIsCisiICIsCisiL1JFTkFNRS1UTzpzdHJpbmciLAorIiAgU3BlY2lmaWVzIHRoYXQgZWFjaCBmaWxlIHRoYXQgYXJyaXZlcyBzaG91bGQgYmUgcmVuYW1lZCBhcyBzcGVjaWZpZWQiLAorIiAgYWZ0ZXIsIGFuZCBvbmx5IGlmLCBpdCBoYXMgYmVlbiByZWNlaXZlZCBzdWNjZXNzZnVsbHkuICBUaGUgc3RyaW5nIHNob3VsZCIsCisiICBub3JtYWxseSBjb250YWluIHZhcmlhYmxlcyBsaWtlIFxcdihmaWxlbmFtZSkgb3IgXFx2KGZpbGVudW0pLiIsCisiICIsCisiL1RFWFQiLAorIiAgUGVyZm9ybXMgdGhpcyB0cmFuc2ZlciBpbiB0ZXh0IG1vZGUgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGdsb2JhbCIsCisiICB0cmFuc2ZlciBtb2RlLiIsCisiICIsCisiL1RSQU5TUEFSRU5UIiwKKyIgIEluaGliaXRzIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gb2YgaW5jb21pbmcgdGV4dCBmaWxlcyBmb3IgdGhlIGR1cmF0aW9uIiwKKyIgIG9mIHRoZSBHRVQgY29tbWFuZCB3aXRob3V0IGFmZmVjdGluZyBzdWJzZXF1ZW50IGNvbW1hbmRzLiIsCisiICIsCisiQWxzbyBzZWUgSEVMUCBNR0VULCBIRUxQIFNFTkQsIEhFTFAgUkVDRUlWRSwgSEVMUCBTRVJWRVIsIEhFTFAgUkVNT1RFLiIsCisiIn07CisKK3N0YXRpYyBjaGFyICpobXh4bGdbXSA9IHsKKyJTeW50YXg6IExPRyAob3IgTCkgbG9nLXR5cGUgWyBmaWxlbmFtZSBbIHsgTkVXLCBBUFBFTkQgfSBdIF0iLAorIiAiLAorIlJlY29yZCBpbmZvcm1hdGlvbiBpbiBhIGxvZyBmaWxlOiIsCisiICIsCisjaWZkZWYgQ0tMT0dESUFMCisiQ1giLAorIiAgQ29ubmVjdGlvbnMgbWFkZSB3aXRoIFNFVCBMSU5FLCBTRVQgUE9SVCwgU0VUIEhPU1QsIERJQUwsIFRFTE5FVCwgZXRjLiIsCisiICBUaGUgZGVmYXVsdCBmaWxlbmFtZSBpcyBDWC5MT0cgaW4geW91ciBob21lIGRpcmVjdG9yeSBhbmQgQVBQRU5EIGlzIHRoZSIsCisiICBkZWZhdWx0IG1vZGUgZm9yIG9wZW5pbmcuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS0xPR0RJQUwgKi8KKyNpZmRlZiBERUJVRworIkRFQlVHIiwKKyIgIERlYnVnZ2luZyBpbmZvcm1hdGlvbiwgdG8gaGVscCB0cmFjayBkb3duIGJ1Z3MgaW4gdGhlIEMtS2VybWl0IHByb2dyYW0uIiwKKyIgIFRoZSBkZWZhdWx0IGxvZyBuYW1lIGlzIGRlYnVnLmxvZyBpbiBjdXJyZW50IGRpcmVjdG9yeS4iLAorIiAiLAorI2VuZGlmIC8qIERFQlVHICovCisiUEFDS0VUUyIsCisiICBLZXJtaXQgcGFja2V0cywgdG8gaGVscCB3aXRoIHByb3RvY29sIHByb2JsZW1zLiAgVGhlIGRlZmF1bHQgZmlsZW5hbWUgaXMiLAorIiAgcGFja2V0LmxvZyBpbiBjdXJyZW50IGRpcmVjdG9yeS4iLAorIiAiLAorI2lmbmRlZiBOT0xPQ0FMCisiU0VTU0lPTiIsCisiICBSZWNvcmRzIHlvdXIgQ09OTkVDVCBzZXNzaW9uIChkZWZhdWx0OiBzZXNzaW9uLmxvZyBpbiBjdXJyZW50IGRpcmVjdG9yeSkuIiwKKyIgIiwKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZkZWYgVExPRworIlRSQU5TQUNUSU9OUyIsCisiICBOYW1lcyBhbmQgc3RhdGlzdGljcyBhYm91dCBmaWxlcyB0cmFuc2ZlcnJlZCAoZGVmYXVsdDogdHJhbnNhY3QubG9nIGluIiwKKyIgIGN1cnJlbnQgZGlyZWN0b3J5OyBzZWUgSEVMUCBTRVQgVFJBTlNBQ1RJT04tTE9HIGZvciB0cmFuc2FjdGlvbi1sb2cgZm9ybWF0IiwKKyIgIG9wdGlvbnMuKSIsCisiICIsCisjZW5kaWYgLyogVExPRyAqLworIklmIHlvdSBpbmNsdWRlIHRoZSBBUFBFTkQga2V5d29yZCBhZnRlciB0aGUgZmlsZW5hbWUsIHRoZSBleGlzdGluZyBsb2cgZmlsZSwiLAorImlmIGFueSwgaXMgYXBwZW5kZWQgdG87IG90aGVyd2lzZSBhIG5ldyBmaWxlIGlzIGNyZWF0ZWQgKGV4Y2VwdCBBUFBFTkQgaXMiLAorInRoZSBkZWZhdWx0IGZvciB0aGUgY29ubmVjdGlvbiBsb2cpLiAgVXNlIENMT1NFIDxrZXl3b3JkPiB0byBzdG9wIGxvZ2dpbmcuIiwKKyNpZmRlZiBPUzJPUlVOSVgKKyIgIiwKKyJOb3RlOiBUaGUgZmlsZW5hbWUgY2FuIGFsc28gYmUgYSBwaXBlLCBlLmcuOiIsCisiICIsCisiICBsb2cgdHJhbnNhY3Rpb25zIHxscHIiLAorIiAgbG9nIGRlYnVnIHt8IGdyZXAgXCJeVEVMTkVUXCIgPiBkZWJ1Zy5sb2d9IiwKKyIgIiwKKyJCcmFjZXMgYXJlIHJlcXVpcmVkIGlmIHRoZSBwaXBlbGluZSBvciBmaWxlbmFtZSBjb250YWlucyBzcGFjZXMuIiwKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyIiIH07CisKKyNpZm5kZWYgTk9TQ1JJUFQKK3N0YXRpYyBjaGFyICpobXh4bG9naVtdID0geyAiXAorU3ludGF4OiBTQ1JJUFQgdGV4dCIsCisiICBBIGxpbWl0ZWQgYW5kIGNyeXB0aWMgXCJsb2dpbiBhc3Npc3RhbnRcIiwgY2FycmllZCBvdmVyIGZyb20gb2xkIEMtS2VybWl0IiwKKyIgIHJlbGVhc2VzIGZvciBjb21wdGFiaWxpdHksIGJ1dCBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gIEluc3RlYWQsIHBsZWFzZSIsCisiICB1c2UgdGhlIGZ1bGwgc2NyaXB0IHByb2dyYW1taW5nIGxhbmd1YWdlIGRlc2NyaWJlZCBpbiBjaGFwdGVycyAxNy0xOSBvZiIsCisiICBcIlVzaW5nIEMtS2VybWl0XCIuIiwKKyIgIiwKKyIgIExvZ2luIHRvIGEgcmVtb3RlIHN5c3RlbSB1c2luZyB0aGUgdGV4dCBwcm92aWRlZC4gIFRoZSBsb2dpbiBzY3JpcHQiLAorIiAgaXMgaW50ZW5kZWQgdG8gb3BlcmF0ZSBzaW1pbGFybHkgdG8gVU5JWCB1dWNwIFwiTC5zeXNcIiBlbnRyaWVzLiIsCisiICBBIGxvZ2luIHNjcmlwdCBpcyBhIHNlcXVlbmNlIG9mIHRoZSBmb3JtOiIsCisiICIsCisiICAgIGV4cGVjdCBzZW5kIFtleHBlY3Qgc2VuZF0gLiAuIC4iLAorIiAiLAorIiAgd2hlcmUgJ2V4cGVjdCcgaXMgYSBwcm9tcHQgb3IgbWVzc2FnZSB0byBiZSBpc3N1ZWQgYnkgdGhlIHJlbW90ZSBzaXRlLCBhbmQiLAorIiAgJ3NlbmQnIGlzIHRoZSBuYW1lcywgbnVtYmVycywgZXRjLCB0byByZXR1cm4uICBUaGUgc2VuZCBtYXkgYWxzbyBiZSB0aGUiLAorIiAga2V5d29yZCBFT1QgdG8gc2VuZCBDb250cm9sLUQsIG9yIEJSRUFLIChvciBcXFxcYikgdG8gc2VuZCBhIGJyZWFrIHNpZ25hbC4iLAorIiAgTGV0dGVycyBpbiBzZW5kIG1heSBiZSBwcmVmaXhlZCBieSB+IHRvIHNlbmQgc3BlY2lhbCBjaGFyYWN0ZXJzOiIsCisiICIsCisiICB+YiBiYWNrc3BhY2UsIH5zIHNwYWNlLCB+cSAnPycsIH5uIGxpbmVmZWVkLCB+ciByZXR1cm4sIH5jIGRvblwndCIsCisiICBhcHBlbmQgYSByZXR1cm4sIGFuZCB+b1tvW29dXSBmb3Igb2N0YWwgb2YgYSBjaGFyYWN0ZXIuICBBcyB3aXRoIHNvbWUiLAorIiAgVVVDUCBzeXN0ZW1zLCBzZW50IHN0cmluZ3MgYXJlIGZvbGxvd2VkIGJ5IH5yIHVubGVzcyB0aGV5IGVuZCB3aXRoIH5jLiIsCisiICIsCisiICBPbmx5IHRoZSBsYXN0IDcgY2hhcmFjdGVycyBpbiBlYWNoIGV4cGVjdCBhcmUgbWF0Y2hlZC4gIEEgbnVsbCBleHBlY3QsIiwKKyIgIGUuZy4gfjAgb3IgdHdvIGFkamFjZW50IGRhc2hlcywgY2F1c2VzIGEgc2hvcnQgZGVsYXkuICBJZiB5b3UgZXhwZWN0IiwKKyIgIHRoYXQgYSBzZXF1ZW5jZSBtaWdodCBub3QgYXJyaXZlLCBhcyB3aXRoIHV1Y3AsIGNvbmRpdGlvbmFsIHNlcXVlbmNlcyIsCisiICBtYXkgYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtOiIsCisiICIsCisiICAgIC1zZW5kLWV4cGVjdFstc2VuZC1leHBlY3RbLi4uXV0iLAorIiAiLAorIiAgd2hlcmUgZGFzaGVkIHNlcXVlbmNlcyBhcmUgZm9sbG93ZWQgYXMgbG9uZyBhcyBwcmV2aW91cyBleHBlY3RzIGZhaWwuIiwKKyIiIH07CisjZW5kaWYgLyogTk9TQ1JJUFQgKi8KKworI2lmbmRlZiBOT0ZSSUxMUworc3RhdGljIGNoYXIgKiBobXh4dHlwW10gPSB7CisiU3ludGF4OiBUWVBFIFsgc3dpdGNoZXMuLi4gXSBmaWxlIiwKKyIgIERpc3BsYXlzIGEgZmlsZSBvbiB0aGUgc2NyZWVuLiAgUGF1c2VzIGF1dG9tYXRpY2FsbHkgYXQgZW5kIG9mIGVhY2giLAorIiAgc2NyZWVuZnVsIGlmIENPTU1BTkQgTU9SRS1QUk9NUFRJTkcgaXMgT04uICBPcHRpb25hbCBzd2l0Y2hlczoiLAorIiAiLAorIiAgL1BBR0UiLAorIiAgICAgUGF1c2UgYXQgdGhlIGVuZCBvZiBlYWNoIHNjcmVlbmZ1bCBldmVuIGlmIENPTU1BTkQgTU9SRS1QUk9NUFRJTkcgT0ZGLiIsCisiICAgICBTeW5vbnltOiAvTU9SRSIsCisiICAvTk9QQUdFIiwKKyIgICAgIERvbid0IHBhdXNlIGF0IHRoZSBlbmQgb2YgZWFjaCBzY3JlZW4gZXZlbiBpZiBDT01NQU5EIE1PUkUtUFJPTVBUSU5HIE9OLiIKKywKKyIgIC9IRUFEOm4iLAorIiAgICAgT25seSB0eXBlIHRoZSBmaXJzdCAnbicgbGluZXMgb2YgdGhlIGZpbGUuIiwKKyIgIC9UQUlMOm4iLAorIiAgICAgT25seSB0eXBlIHRoZSBsYXN0ICduJyBsaW5lcyBvZiB0aGUgZmlsZS4iLAorIiAgL01BVENIOnBhdHRlcm4iLAorIiAgICAgT25seSB0eXBlIGxpbmVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm4uICBIRUxQIFdJTERDQVJEUyBmb3IgaW5mbyIsCisiICAgICBpbmZvIGFib3V0IHBhdHRlcm5zLiAgL0hFQUQgYW5kIC9UQUlMIGFwcGx5IGFmdGVyIC9NQVRDSC4iLAorIiAgL1BSRUZJWDpzdHJpbmciLAorIiAgICAgUHJpbnQgdGhlIGdpdmVuIHN0cmluZyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZS4iLAorIiAgL05VTUJFUiIsCisiICAgICBBZGQgbGluZSBudW1iZXJzIChjb25mbGljdHMgd2l0aCAvUFJFRklYKSIsCisiICAvV0lEVEg6bnVtYmVyIiwKKyIgICAgIFRydW5jYXRlIGVhY2ggbGluZSBhdCB0aGUgZ2l2ZW4gY29sdW1uIG51bWJlciBiZWZvcmUgcHJpbnRpbmcuIiwKKyNpZmRlZiBLVUkKKyIgICAgIE9yIHdoZW4gY29tYmluZWQgd2l0aCAvR1VJIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGRpYWxvZyBib3guIiwKKyIgIC9IRUlHSFQ6bnVtYmVyIiwKKyIgICAgIFdoZW4gY29tYmluZWQgd2l0aCAvR1VJIHNwZWNpZmllcyB0aGUgaGVpZ2h0IG9mIHRoZSBkaWFsb2cgYm94LiIsCisiICAvR1VJOnN0cmluZyIsCisiICAgICBTcGVjaWZpZXMgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhlIGRpYWxvZyBib3guIiwKKyNlbmRpZiAvKiBLVUkgKi8KKyIgIC9DT1VOVCIsCisiICAgICBDb3VudCBsaW5lcyAoYW5kIG1hdGNoZXMpIGFuZCBwcmludCB0aGUgY291bnQocykgYnV0IG5vdCB0aGUgbGluZXMuIiwKKyNpZmRlZiBVTklDT0RFCisiICAvQ0hBUkFDVEVSLVNFVDpuYW1lIiwKKyIgICAgIFRyYW5zbGF0ZXMgZnJvbSB0aGUgbmFtZWQgY2hhcmFjdGVyIHNldC4iLAorI2lmbmRlZiBPUzIKKyIgIC9UUkFOU0xBVEUtVE86bmFtZSIsCisiICAgICBUcmFuc2xhdGVzIHRvIHRoZSBuYW1lZCBjaGFyYWN0ZXIgc2V0IChkZWZhdWx0ID0gY3VycmVudCBmaWxlIGNoYXJzZXQpLiIsCisjZW5kaWYgLyogT1MyICovCisiICAvVFJBTlNQQVJFTlQiLAorIiAgICAgSW5oaWJpdHMgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbi4iLAorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyIgIC9PVVRQVVQ6bmFtZSIsCisiICAgICBTZW5kcyByZXN1bHRzIHRvIHRoZSBnaXZlbiBmaWxlLiAgSWYgdGhpcyBzd2l0Y2ggaXMgb21pdHRlZCwgdGhlIiwKKyIgICAgIHJlc3VsdHMgYXBwZWFyIG9uIHlvdXIgc2NyZWVuLiAgVGhpcyBzd2l0Y2ggb3ZlcnJpZGVzIGFueSBleHByZXNzIG9yIiwKKyIgICAgIGltcGxpZWQgL1BBR0Ugc3dpdGNoLiIsCisiICIsCisiWW91IGNhbiB1c2UgU0VUIE9QVElPTlMgVFlQRSB0byBzZXQgdGhlIGRlZmF1bHRzIGZvciAvUEFHRSBvciAvTk9QQUdFIGFuZCIsCisiL1dJRFRILiAgVXNlIFNIT1cgT1BUSU9OUyB0byBzZWUgY3VycmVudCBUWVBFIG9wdGlvbnMuIiwKKyIiCit9OworCitzdGF0aWMgY2hhciAqIGhteHhjbGVbXSA9IHsKKyJTeW50YXg6IENMRUFSIFsgaXRlbS1uYW1lIF0iLAorIiAiLAorIkNsZWFycyB0aGUgbmFtZWQgaXRlbS4gIElmIG5vIGl0ZW0gaXMgbmFtZWQsIERFVklDRS1BTkQtSU5QVVQgaXMgYXNzdW1lZC4iLAorIiAiLAorIiAgQUxBUk0gICAgICAgICAgICBDbGVhcnMgYW55IHBlbmRpbmcgYWxhcm0gKHNlZSBTRVQgQUxBUk0pLiIsCisjaWZkZWYgQ0tfQVBDCisiICBBUEMtU1RBVFVTICAgICAgIENsZWFycyBBcHBsaWNhdGlvbiBQcm9ncmFtIENvbW1hbmQgc3RhdHVzLiIsCisjZW5kaWYgLyogQ0tfQVBDICovCisjaWZkZWYgUEFUVEVSTlMKKyIgIEJJTkFSWS1QQVRURVJOUyAgQ2xlYXJzIHRoZSBmaWxlIGJpbmFyeS1wYXR0ZXJucyBsaXN0LiIsCisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyNpZmRlZiBPUzIKKyIgIENPTU1BTkQtU0NSRUVOICAgQ2xlYXJzIHRoZSBjdXJyZW50IGNvbW1hbmQgc2NyZWVuLiIsCisjZW5kaWYgLyogT1MyICovCisiICBERVZJQ0UgICAgICAgICAgIENsZWFycyB0aGUgY3VycmVudCBwb3J0IG9yIG5ldHdvcmsgaW5wdXQgYnVmZmVyLiIsCisiICBERVZJQ0UtQU5ELUlOUFVUIENsZWFycyBib3RoIHRoZSBkZXZpY2UgYW5kIHRoZSBJTlBVVCBidWZmZXIuIiwKKyIgIERJQUwtU1RBVFVTICAgICAgQ2xlYXJzIHRoZSBcXHYoZGlhbHN0YXR1cykgdmFyaWFibGUuIiwKKyIgIFwKK0lOUFVUICAgICAgICAgICAgQ2xlYXJzIHRoZSBJTlBVVC1jb21tYW5kIGJ1ZmZlciBhbmQgdGhlIFxcdihpbnB1dCkgdmFyaWFibGUuIiwKKyIgIEtFWUJPQVJELUJVRkZFUiAgQ2xlYXJzIHRoZSBjb21tYW5kIHRlcm1pbmFsIGtleWJvYXJkIGlucHV0IGJ1ZmZlci4iLAorI2lmZGVmIE9TMgorIiAgXAorU0NST0xMQkFDSyAgICAgICBlbXB0aWVzIHRoZSBzY3JvbGxiYWNrIGJ1ZmZlciBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgc2NyZWVuLiIsCisjZW5kaWYgLyogT1MyICovCisiICBTRU5ELUxJU1QgICAgICAgIENsZWFycyB0aGUgY3VycmVudCBTRU5EIGxpc3QgKHNlZSBBREQpLiIsCisjaWZkZWYgT1MyCisiICBcCitURVJNSU5BTC1TQ1JFRU4gIENsZWFycyB0aGUgY3VycmVudCBzY3JlZW4gYSBwbGFjZXMgaXQgaW50byB0aGUgc2Nyb2xsYmFjay4iLAorIiAgICBidWZmZXIuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBQQVRURVJOUworIiAgVEVYVC1QQVRURVJOUyAgICBDbGVhcnMgdGhlIGZpbGUgdGV4dC1wYXR0ZXJucyBsaXN0LiIsCisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyIifTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCitzdGF0aWMgY2hhciAqIGhteHhkYXRlW10gPSB7CisiU3ludGF4OiBEQVRFIFsgZGF0ZS10aW1lIFsgdGltZXpvbmUgXSBdIFsgZGVsdGEtdGltZSBdIiwKKyIgIFByaW50cyBhIGRhdGUtdGltZSBpbiBzdGFuZGFyZCBmb3JtYXQ6IHl5eXltbWRkX2hoOm1tOnNzLiIsCisiICBWYXJpb3VzIGRhdGUtdGltZSBmb3JtYXRzIGFyZSBhY2NlcHRlZDoiLAorIiAiLAorIiAgLiBUaGUgZGF0ZSwgaWYgZ2l2ZW4sIG11c3QgcHJlY2VkZSB0aGUgdGltZS4iLAorIiAgLiBUaGUgeWVhciBtdXN0IGJlIGZvdXIgZGlnaXRzIG9yIGVsc2UgYSAyLWRpZ2l0IGZvcm1hdCBkZCBtbW0geXksIiwKKyIgICAgaW4gd2hpY2ggY2FzZSBpZiAoeXkgPCA1MCkgeXl5eSA9IHl5ICsgMjAwMDsgZWxzZSB5eXl5ID0geXkgKyAxOTAwLiIsCisiICAuIElmIHRoZSB5ZWFyIGNvbWVzIGZpcnN0LCB0aGUgc2Vjb25kIGZpZWxkIGlzIHRoZSBtb250aC4iLAorIiAgLiBUaGUgZGF5LCBtb250aCwgYW5kIHllYXIgbWF5IGJlIHNlcGFyYXRlZCBieSBzcGFjZXMsIC8sIC0sIG9yIHVuZGVyc2NvcmUuIgorLCIgIC4gVGhlIGRhdGUgYW5kIHRpbWUgbWF5IGJlIHNlcGFyYXRlZCBieSBzcGFjZXMgb3IgdW5kZXJzY29yZS4iLAorIiAgLiBUaGUgbW9udGggbWF5IGJlIG51bWVyaWMgKDEgPSBKYW51YXJ5KSBvciBzcGVsbGVkIG91dCBvciBhYmJyZXZpYXRlZCBpbiIsCisiICAgIEVuZ2xpc2guIiwKKyIgIC4gVGhlIHRpbWUgbWF5IGJlIGluIDI0LWhvdXIgZm9ybWF0IG9yIDEyLWhvdXIgZm9ybWF0LiIsCisiICAuIElmIHRoZSBob3VyIGlzIDEyIG9yIGxlc3MsIEFNIGlzIGFzc3VtZWQgdW5sZXNzIEFNIG9yIFBNIGlzIGluY2x1ZGVkLiIsCisiICAuIElmIHRoZSBkYXRlIGlzIG9taXR0ZWQgYnV0IGEgdGltZSBpcyBnaXZlbiwgdGhlIGN1cnJlbnQgZGF0ZSBpcyBzdXBwbGllZC4iCissCisiICAuIElmIHRoZSB0aW1lIGlzIGdpdmVuIGJ1dCBkYXRlIG9taXR0ZWQsIDAwOjAwOjAwIGlzIHN1cHBsaWVkLiIsCisiICAuIElmIGJvdGggdGhlIGRhdGUgYW5kIHRpbWUgYXJlIG9taXR0ZWQsIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgYXJlIiwKKyIgICAgc3VwcGxpZWQuIiwKKyIgIiwKKyIgIFRoZSBmb2xsb3dpbmcgc2hvcnRjdXRzIGNhbiBhbHNvIGJlIHVzZWQgaW4gcGxhY2Ugb2YgZGF0ZXM6IiwKKyIgIiwKKyIgIFRPREFZIiwKKyIgICAgVG9kYXkncyBkYXRlLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgdGltZTsgMDA6MDA6MDAgaWYgbm8gdGltZSBnaXZlbi4iLAorIiAiLAorIiAgWUVTVEVSREFZIiwKKyIgICAgWWVzdGVyZGF5J3MgZGF0ZSwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIHRpbWUgKGRlZmF1bHQgMDA6MDA6MDApLiIsCisiICIsCisiICBUT01PUlJPVyIsCisiICAgIFRvbW9ycm93cydzIGRhdGUsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSB0aW1lIChkZWZhdWx0IDAwOjAwOjAwKS4iLAorIiAiLAorIiAgVGltZXpvbmUgc3BlY2lmaWNhdGlvbnMgYXJlIHNpbWlsYXIgdG8gdGhvc2UgdXNlZCBpbiBlLW1haWwgYW5kIEhUVFAiLAorIiAgICBoZWFkZXJzLCBlaXRoZXIgYSBVU0EgdGltZXpvbmUgbmFtZSwgZS5nLiBFU1Qgb3IgYSBzaWduZWQgZm91ci1kaWdpdCIsCisiICAgIHRpbWV6b25lIG9mZnNldCwgeyssLX1oaG1tLCBlLmcuLCAtMDUwMDsgaXQgaXMgdXNlZCB0byBjb252ZXJ0IGRhdGUtdGltZSwiCissCisiICAgIGEgbG9jYWwgdGltZSBpbiB0aGF0IHRpbWV6b25lLCB0byBHTVQgd2hpY2ggaXMgdGhlbiBjb252ZXJ0ZWQgdG8gdGhlIiwKKyIgICAgbG9jYWwgdGltZSBhdCB0aGUgaG9zdC4gIElmIG5vIHRpbWV6b25lIGlzIGdpdmVuLCB0aGUgZGF0ZS10aW1lIGlzIGxvY2FsLiIKKywKKyIgIiwKKyIgIERlbHRhIHRpbWVzIGFyZSBnaXZlbiBhcyB7KywtfVtudW1iZXIgZGF0ZS11bml0c11baGhbOm1tWzpzc11dXSIsCisiICAgIEEgZGF0ZSBpbiB0aGUgZnV0dXJlL3Bhc3QgcmVsYXRpdmUgdG8gdGhlIGRhdGUtdGltZTsgZGF0ZS11bml0cyBtYXkgYmUiLAorIiAgICBEQVlTLCBXRUVLUywgTU9OVEhTLCBZRUFSUzogKzNkYXlzLCAtN3dlZWtzLCArMzowMCwgKzFtb250aCA4OjAwLiIsCisiICIsCisiQWxsIHRoZSBmb3JtYXRzIHNob3duIGFib3ZlIGFyZSBhY2NlcHRhYmxlIGFzIGFyZ3VtZW50cyB0byBkYXRlLXRpbWUgc3dpdGNoZXMiCissCisic3VjaCBhcyAvQUZURVI6IG9yIC9CRUZPUkU6LCBhbmQgdG8gZnVuY3Rpb25zIHN1Y2ggYXMgXFxmY3Z0ZGF0ZSgpLCIsCisiXFxmZGlmZmRhdGUoKSwgYW5kIFxcZnV0Y2RhdGUoKSwgdGhhdCB0YWtlIGRhdGUtdGltZSBzdHJpbmdzIGFzIGFyZ3VtZW50cy4iLAorIiIKK307CisKKworI2lmbmRlZiBOT1hGRVIKK3N0YXRpYyBjaGFyICogaG14eHNlbltdID0geworIlN5bnRheDogU0VORCAob3IgUykgWyBzd2l0Y2hlcy4uLl0gWyBmaWxlc3BlYyBbIGFzLW5hbWUgXSBdIiwKKyIgIFNlbmRzIHRoZSBmaWxlIG9yIGZpbGVzIHNwZWNpZmllZCBieSBmaWxlc3BlYy4gIElmIHRoZSBmaWxlc3BlYyBpcyBvbWl0dGVkIiwKKyIgIHRoZSBTRU5ELUxJU1QgaXMgdXNlZCAoSEVMUCBBREQgZm9yIG1vcmUgaW5mbykuICBUaGUgZmlsZXNwZWMgbWF5IGNvbnRhaW4iLAorIiAgd2lsZGNhcmQgY2hhcmFjdGVycy4gIEFuICdhcy1uYW1lJyBtYXkgYmUgZ2l2ZW4gdG8gc3BlY2lmeSB0aGUgbmFtZShzKSIsCisiICB0aGUgZmlsZXMocykgYXJlIHNlbnQgdW5kZXI7IGlmIHRoZSBhcy1uYW1lIGlzIG9taXR0ZWQsIGVhY2ggZmlsZSBpcyIsCisiICBzZW50IHVuZGVyIGl0cyBvd24gbmFtZS4gIEFsc28gc2VlIEhFTFAgTVNFTkQsIEhFTFAgV0lMRENBUkQuIiwKKyIgIE9wdGlvbmFsIHN3aXRjaGVzIGluY2x1ZGU6IiwKKyIgIiwKKyNpZm5kZWYgTk9TUEwKKyIvQVJSQVk6PGFycmF5bmFtZT4iLAorIiAgU3BlY2lmaWVzIHRoYXQgdGhlIGRhdGEgdG8gYmUgc2VudCBjb21lcyBmcm9tIHRoZSBnaXZlbiBhcnJheSwgc3VjaCBhcyIsCisiICBcXCZhW10uICBBIHJhbmdlIG1heSBiZSBzcGVjaWZpZWQsIGUuZy4gU0VORCAvQVJSQVk6JmFbMTAwOjE5OV0uICBMZWF2ZSIsCisiICB0aGUgYnJhY2tldHMgZW1wdHkgb3Igb21pdCB0aGVtIGFsdG9nZXRoZXIgdG8gc2VuZCB0aGUgd2hvbGUgMS1iYXNlZCBhcnJheS4iCissCisiICBJbmNsdWRlIC9URVhUIHRvIGhhdmUgS2VybWl0IHN1cHBseSBhIGxpbmUgdGVybWluYXRvciBhdCB0aGUgZW5kIG9mIGVhY2giLAorIiAgYXJyYXkgZWxlbWVudCAoYW5kIHRyYW5zbGF0ZSBjaGFyYWN0ZXIgc2V0cyBpZiBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9ucyIsCisiICBhcmUgc2V0IHVwKSwgb3IgL0JJTkFSWSB0byB0cmVhdCB0aGUgYXJyYXkgYXMgb25lIGxvbmcgc3RyaW5nIG9mIGNoYXJhY3RlcnMiCissCisiICB0byBiZSBzZW50IGFzLWlzLiAgSWYgYW4gYXMtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgYXJyYXkgaXMgc2VudCB3aXRoIiwKKyIgIHRoZSBuYW1lIF9BUlJBWV9YXywgd2hlcmUgXCJYXCIgaXMgcmVwbGFjZWQgYnkgYWN0dWFsIGFycmF5IGxldHRlci4iLAorIiAiLAorI2VuZGlmIC8qIE5PU1BMICovCisKKyIvQVMtTkFNRTo8dGV4dD4iLAorIiAgU3BlY2lmaWVzIDx0ZXh0PiBhcyB0aGUgbmFtZSB0byBzZW5kIHRoZSBmaWxlIHVuZGVyIGluc3RlYWQgb2YgaXRzIHJlYWwiLAorIiAgbmFtZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBnaXZpbmcgYW4gYXMtbmFtZSBhZnRlciB0aGUgZmlsZXNwZWMuIiwKKyIgIiwKKyIvQklOQVJZIiwKKyIgIFBlcmZvcm1zIHRoaXMgdHJhbnNmZXIgaW4gYmluYXJ5IG1vZGUgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGdsb2JhbCIsCisiICB0cmFuc2ZlciBtb2RlLiIsCisiICIsCisiL1RFWFQiLAorIiAgUGVyZm9ybXMgdGhpcyB0cmFuc2ZlciBpbiB0ZXh0IG1vZGUgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGdsb2JhbCIsCisiICB0cmFuc2ZlciBtb2RlLiIsCisiICIsCisiL1RSQU5TUEFSRU5UIiwKKyIgIEluaGliaXRzIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gZm9yIHRleHQgZmlsZXMgZm9yIHRoZSBkdXJhdGlvbiBvZiIsCisiICB0aGUgU0VORCBjb21tYW5kIHdpdGhvdXQgYWZmZWN0aW5nIHN1YnNlcXVlbnQgY29tbWFuZHMuIiwKKyIgIiwKKyIvTk9CQUNLVVBGSUxFUyIsCisiICBTa2lwIChkb24ndCBzZW5kKSBLZXJtaXQgb3IgRU1BQ1MgYmFja3VwIGZpbGVzIChmaWxlcyB3aXRoIG5hbWVzIHRoYXQiLAorIiAgZW5kIHdpdGggLn5ufiwgd2hlcmUgbiBpcyBhIG51bWJlcikuIiwKKyIgIiwKKyNpZmRlZiBVTklYT1JPU0sKKyIvRE9URklMRVMiLAorIiAgSW5jbHVkZSAoc2VuZCkgZmlsZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBcIi5cIi4iLAorIiAiLAorIi9OT0RPVEZJTEVTIiwKKyIgIERvbid0IHNlbmQgZmlsZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBcIi5cIi4iLAorIiAiLAorIi9GT0xMT1dMSU5LUyIsCisiICBTZW5kIGZpbGVzIHRoYXQgYXJlIHBvaW50ZWQgdG8gYnkgc3ltYm9saWMgbGlua3MuIiwKKyIgIiwKKyIvTk9GT0xMT1dMSU5LUyIsCisiICBTa2lwIG92ZXIgc3ltYm9saWMgbGlua3MgKGRlZmF1bHQpLiIsCisiICIsCisjZW5kaWYgLyogVU5JWE9ST1NLICovCisKKyNpZmRlZiBWTVMKKyIvSU1BR0UiLAorIiAgUGVyZm9ybXMgdGhpcyB0cmFuc2ZlciBpbiBpbWFnZSBtb2RlIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBnbG9iYWwiLAorIiAgdHJhbnNmZXIgbW9kZS4iLAorIiAiLAorI2VuZGlmIC8qIFZNUyAqLworI2lmZGVmIENLX0xBQkVMRUQKKyIvTEFCRUxFRCIsCisiICBQZXJmb3JtcyB0aGlzIHRyYW5zZmVyIGluIGxhYmVsZWQgbW9kZSB3aXRob3V0IGFmZmVjdGluZyB0aGUgZ2xvYmFsIiwKKyIgIHRyYW5zZmVyIG1vZGUuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisiL0NPTU1BTkQiLAorIiAgU2VuZHMgdGhlIG91dHB1dCBmcm9tIGEgY29tbWFuZCwgcmF0aGVyIHRoYW4gdGhlIGNvbnRlbnRzIG9mIGEgZmlsZS4iLAorIiAgVGhlIGZpcnN0IFwiZmlsZW5hbWVcIiBvbiB0aGUgU0VORCBjb21tYW5kIGxpbmUgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIG5hbWUiLAorIiAgb2YgYSBjb21tYW5kOyB0aGUgc2Vjb25kIChpZiBhbnkpIGlzIHRoZSBhcy1uYW1lLiIsCisiICIsCisiL0ZJTEVOQU1FUzp7Q09OVkVSVEVELExJVEVSQUx9IiwKKyIgIE92ZXJyaWRlcyB0aGUgZ2xvYmFsIFNFVCBGSUxFIE5BTUVTIHNldHRpbmcgZm9yIHRoaXMgdHJhbnNmZXIgb25seS4iLAorIiAiLAorIi9QQVRITkFNRVM6e09GRixBQlNPTFVURSxSRUxBVElWRX0iLAorIiAgT3ZlcnJpZGVzIHRoZSBnbG9iYWwgU0VUIFNFTkQgUEFUSE5BTUVTIHNldHRpbmcgZm9yIHRoaXMgdHJhbnNmZXIuIiwKKyIgIiwKKyIvRklMVEVSOmNvbW1hbmQiLAorIiAgU3BlY2lmaWVzIGEgY29tbWFuZCBcCisoc3RhbmRhcmQgaW5wdXQvb3V0cHV0IGZpbHRlcikgdG8gcGFzcyB0aGUgZmlsZSB0aHJvdWdoIiwKKyIgIGJlZm9yZSBzZW5kaW5nIGl0LiIsCisiICIsCisiL0RFTEVURSIsCisiICBEZWxldGVzIHRoZSBmaWxlIChvciBlYWNoIGZpbGUgaW4gdGhlIGdyb3VwKSBhZnRlciBpdCBoYXMgYmVlbiBzZW50IiwKKyIgIHN1Y2Nlc3NmdWxseSAoYXBwbGllcyBvbmx5IHRvIHJlYWwgZmlsZXMpLiIsCisiICIsCisiL1FVSUVUIiwKKyIgIFdoZW4gc2VuZGluZyBpbiBsb2NhbCBtb2RlLCB0aGlzIHN1cHByZXNzZXMgdGhlIGZpbGUtdHJhbnNmZXIgZGlzcGxheS4iLAorIiAiLAorIi9SRUNPVkVSIiwKKyIgIFVzZWQgdG8gcmVjb3ZlciBmcm9tIGEgcHJldmlvdXNseSBpbnRlcnJ1cHRlZCB0cmFuc2ZlcjsgU0VORCAvUkVDT1ZFUiIsCisiICBpcyBlcXVpdmFsZW50IFJFU0VORCAodXNlIGluIGJpbmFyeSBtb2RlIG9ubHkpLiIsCisiICIsCisiL1JFQ1VSU0lWRSIsCisiICBUZWxscyBDLUtlcm1pdCB0byBsb29rIG5vdCBvbmx5IGluIHRoZSBnaXZlbiBvciBjdXJyZW50IGRpcmVjdG9yeSBmb3IiLAorIiAgZmlsZXMgdGhhdCBtYXRjaCB0aGUgZmlsZXNwZWMsIGJ1dCBhbHNvIGluIGFsbCBpdHMgc3ViZGlyZWN0b3JpZXMsIGFuZCIsCisiICBhbGwgdGhlaXIgc3ViZGlyZWN0b3JpZXMsIGV0Yy4iLAorIiAiLAorIi9SRU5BTUUtVE86bmFtZSIsCisiICBUZWxscyBDLUtlcm1pdCB0byByZW5hbWUgZWFjaCBzb3VyY2UgZmlsZSB0aGF0IGlzIHNlbnQgc3VjY2Vzc2Z1bGx5IHRvIiwKKyIgIHRoZSBnaXZlbiBuYW1lICh1c3VhbGx5IHlvdSBzaG91bGQgaW5jbHVkZSBcXHYoZmlsZW5hbWUpIGluIHRoZSBuZXcgbmFtZSwiLAorIiAgd2hpY2ggaXMgcmVwbGFjZWQgYnkgdGhlIG9yaWdpbmFsIGZpbGVuYW1lLiIsCisiICIsCisiL01PVkUtVE86ZGlyZWN0b3J5IiwKKyIgIFRlbGxzIEMtS2VybWl0IHRvIG1vdmUgZWFjaCBzb3VyY2UgZmlsZSB0aGF0IGlzIHNlbnQgc3VjY2Vzc2Z1bGx5IHRvIiwKKyIgIHRoZSBnaXZlbiBkaXJlY3RvcnkuIiwKKyIgIiwKKyIvU1RBUlRJTkc6bnVtYmVyIiwKKyIgIFN0YXJ0cyBzZW5kaW5nIHRoZSBmaWxlIGZyb20gdGhlIGdpdmVuIGJ5dGUgcG9zaXRpb24uIiwKKyIgIFNFTkQgL1NUQVJUSU5HOm4gZmlsZW5hbWUgaXMgZXF1aXZhbGVudCB0byBQU0VORCBmaWxlbmFtZSBuLiIsCisiICIsCisiL1NVQkpFQ1Q6dGV4dCIsCisiICBTcGVjaWZpZXMgdGhlIHN1YmplY3Qgb2YgYW4gZW1haWwgbWVzc2FnZSwgdG8gYmUgdXNlZCB3aXRoIC9NQUlMLiAgSWYgdGhlIiwKKyIgIHRleHQgY29udGFpbnMgc3BhY2VzLCBpdCBtdXN0IGJlIGVuY2xvc2VkIGluIGJyYWNlcy4iLAorIiAiLAorIi9NQUlMOmFkZHJlc3MiLAorIiAgU2VuZHMgdGhlIGZpbGUgYXMgZS1tYWlsIHRvIHRoZSBnaXZlbiBhZGRyZXNzOyB1c2Ugd2l0aCAvU1VCSkVDVDouIiwKKyIgIiwKKyIvUFJJTlQ6b3B0aW9ucyIsCisiICBTZW5kcyB0aGUgZmlsZSB0byBiZSBwcmludGVkLCB3aXRoIG9wdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSBwcmludGVyLiIsCisiICIsCisjaWZkZWYgQ0tfWFlaCisiL1BST1RPQ09MOm5hbWUiLAorIiAgVXNlcyB0aGUgZ2l2ZW4gcHJvdG9jb2wgdG8gc2VuZCB0aGUgZmlsZSAoS2VybWl0LCBabW9kZW0sIGV0YykgZm9yIHRoaXMiLAorIiAgdHJhbnNmZXIgd2l0aG91dCBjaGFuZ2luZyBnbG9iYWwgcHJvdG9jb2wuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19YWVogKi8KKyIvQUZURVI6ZGF0ZS10aW1lIiwKKyNpZmRlZiBWTVMKKyIgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgY3JlYXRlZCBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS10aW1lIGFyZSIsCisjZWxzZQorIiAgU3BlY2lmaWVzIHRoYXQgb25seSB0aG9zZSBmaWxlcyBtb2RpZmllZCBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS10aW1lIGFyZSIsCisjZW5kaWYgLyogVk1TICovCisiICB0byBiZSBzZW50LiAgSEVMUCBEQVRFIGZvciBpbmZvIGFib3V0IGRhdGUtdGltZSBmb3JtYXRzLiIsCisiICIsCisiL0JFRk9SRTpkYXRlLXRpbWUiLAorI2lmZGVmIFZNUworIiAgU3BlY2lmaWVzIHRoYXQgb25seSB0aG9zZSBmaWxlcyBtb2RpZmllZCBiZWZvcmUgdGhlIGdpdmVuIGRhdGUtdGltZSIsCisjZWxzZQorIiAgU3BlY2lmaWVzIHRoYXQgb25seSB0aG9zZSBmaWxlcyBtb2RpZmllZCBiZWZvcmUgdGhlIGdpdmVuIGRhdGUtdGltZSIsCisjZW5kaWYgLyogVk1TICovCisiICBhcmUgdG8gYmUgc2VudC4iLAorIiAiLAorIi9OT1QtQUZURVI6ZGF0ZS10aW1lIiwKKyNpZmRlZiBWTVMKKyIgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgbW9kaWZpZWQgYXQgb3IgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLXRpbWUiLAorI2Vsc2UKKyIgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgbW9kaWZpZWQgYXQgb3IgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLXRpbWUiLAorI2VuZGlmIC8qIFZNUyAqLworIiAgYXJlIHRvIGJlIHNlbnQuIiwKKyIgIiwKKyIvTk9ULUJFRk9SRTpkYXRlLXRpbWUiLAorI2lmZGVmIFZNUworIiAgU3BlY2lmaWVzIHRoYXQgb25seSB0aG9zZSBmaWxlcyBtb2RpZmllZCBhdCBvciBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS10aW1lIiwKKyNlbHNlCisiICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIG1vZGlmaWVkIGF0IG9yIGFmdGVyIHRoZSBnaXZlbiBkYXRlLXRpbWUiLAorI2VuZGlmIC8qIFZNUyAqLworIiAgYXJlIHRvIGJlIHNlbnQuIiwKKyIgIiwKKyIvTEFSR0VSLVRIQU46bnVtYmVyIiwKKyIgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBhcmUiLAorIiAgdG8gYmUgc2VudC4iLAorIiAiLAorIi9TTUFMTEVSLVRIQU46bnVtYmVyIiwKKyIgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgc21hbGxlciB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgYXJlIiwKKyIgIHRvIGJlIHNlbnQuIiwKKyIgIiwKKyIvRVhDRVBUOnBhdHRlcm4iLAorIiAgU3BlY2lmaWVzIHRoYXQgYW55IGZpbGVzIHdob3NlIG5hbWVzIG1hdGNoIHRoZSBwYXR0ZXJuLCB3aGljaCBjYW4gYmUgYSIsCisiICByZWd1bGFyIGZpbGVuYW1lLCBvciBtYXkgY29udGFpbiBcIipcIiBhbmQvb3IgXCI/XCIgbWV0YWNoYXJhY3RlcnMsIiwKKyIgIGFyZSBub3QgdG8gYmUgc2VudC4gIFRvIHNwZWNpZnkgbXVsdGlwbGUgcGF0dGVybnMgKHVwIHRvIDgpLCB1c2Ugb3V0ZXIiLAorIiAgYnJhY2VzIGFyb3VuZCB0aGUgZ3JvdXAsIGFuZCBpbm5lciBicmFjZXMgYXJvdW5kIGVhY2ggcGF0dGVybjoiLAorIiAiLAorIiAgICAvRVhDRVBUOnt7cGF0dGVybjF9e3BhdHRlcm4yfS4uLn0iLAorIiAiLAorIi9UWVBFOntBTEwsVEVYVCxCSU5BUll9IiwKKyIgIFNlbmQgb25seSBmaWxlcyBvZiB0aGUgZ2l2ZW4gdHlwZSAoc2VlIFNFVCBGSUxFIFNDQU4pLiIsCisiICIsCisiL0xJU1RGSUxFOmZpbGVuYW1lIiwKKyIgIFNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbGlzdCBvZiBuYW1lcyBvZiBmaWxlcyIsCisiICB0aGF0IGFyZSB0byBiZSBzZW50LiAgVGhlIGZpbGVuYW1lcyBzaG91bGQgYmUgbGlzdGVkIG9uZSBuYW1lIHBlciBsaW5lIiwKKyIgIGluIHRoaXMgZmlsZSAoYnV0IGEgbmFtZSBjYW4gY29udGFpbiB3aWxkY2FyZHMpLiIsCisiICIsCisiQWxzbyBzZWUgSEVMUCBSRUNFSVZFLCBIRUxQIEdFVCwgSEVMUCBTRVJWRVIsIEhFTFAgUkVNT1RFLiIsCisiIn07CisKK3N0YXRpYyBjaGFyICpobXh4cmNbXSA9IHsKKyJTeW50YXg6IFJFQ0VJVkUgKG9yIFIpIFsgc3dpdGNoZXMuLi4gXSBbIGFzLW5hbWUgXSIsCisiICBXYWl0IGZvciBhIGZpbGUgdG8gYXJyaXZlIGZyb20gdGhlIG90aGVyIEtlcm1pdCwgd2hpY2ggbXVzdCBiZSBnaXZlbiBhIiwKKyIgIFNFTkQgY29tbWFuZC4gIElmIHRoZSBvcHRpb25hbCBhcy1uYW1lIGlzIGdpdmVuLCB0aGUgaW5jb21pbmcgZmlsZSBvciIsCisiICBmaWxlcyBhcmUgc3RvcmVkIHVuZGVyIHRoYXQgbmFtZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgc3RvcmVkIHVuZGVyIiwKKyNpZm5kZWYgQ0tfVE1QRElSCisiICB0aGUgbmFtZSBpdCBhcnJpdmVzIHdpdGguIiwKKyNlbHNlCisjaWZkZWYgT1MyCisiICB0aGUgbmFtZSBpdCBhcnJpdmVzIHdpdGguICBJZiB0aGUgZmlsZXNwZWMgZGVub3RlcyBhIGRpc2sgYW5kL29yIiwKKyIgIGRpcmVjdG9yeSwgdGhlIGluY29taW5nIGZpbGUgb3IgZmlsZXMgd2lsbCBiZSBzdG9yZWQgdGhlcmUuIiwKKyNlbHNlCisiICB0aGUgbmFtZSBpdCBhcnJpdmVzIHdpdGguICBJZiB0aGUgZmlsZXNwZWMgZGVub3RlcyBhIGRpcmVjdG9yeSwgdGhlIiwKKyIgIGluY29taW5nIGZpbGUgb3IgZmlsZXMgd2lsbCBiZSBwbGFjZWQgaW4gdGhhdCBkaXJlY3RvcnkuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKyIgIiwKKyJPcHRpb25hbCBzd2l0Y2hlcyBpbmNsdWRlOiIsCisiICIsCisiL0FTLU5BTUU6dGV4dCIsCisiICBTcGVjaWZpZXMgXCJ0ZXh0XCIgYXMgdGhlIG5hbWUgdG8gc3RvcmUgdGhlIGluY29taW5nIGZpbGUgdW5kZXIuIiwKKyIgIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBhcy1uYW1lIGFzIGEgZmlsZW5hbWUgb24gdGhlIGNvbW1hbmQgbGluZS4iLAorIiAiLAorIi9CSU5BUlkiLAorIiAgU2tpcHMgdGV4dC1tb2RlIGNvbnZlcnNpb25zIHVubGVzcyB0aGUgaW5jb21pbmcgZmlsZSBhcnJpdmVzIHdpdGggYmluYXJ5IiwKKyIgIGF0dHJpYnV0ZSIsCisiICIsCisiL0NPTU1BTkQiLAorIiAgUmVjZWl2ZXMgdGhlIGZpbGUgaW50byB0aGUgc3RhbmRhcmQgaW5wdXQgb2YgYSBjb21tYW5kLCByYXRoZXIgdGhhbiBzYXZpbmciLAorIiAgaXQgb24gZGlzay4gIFRoZSAvQVMtTkFNRSBvciB0aGUgXCJmaWxlbmFtZVwiIG9uIHRoZSBSRUNFSVZFIGNvbW1hbmQgbGluZSIsCisiICBpcyBpbnRlcnByZXRlZCBhcyB0aGUgbmFtZSBvZiBhIGNvbW1hbmQuIiwKKyIgIiwKKyIvRVhDRVBUOnBhdHRlcm4iLAorIiAgU3BlY2lmaWVzIHRoYXQgYW55IGZpbGVzIHdob3NlIG5hbWVzIG1hdGNoIHRoZSBwYXR0ZXJuLCB3aGljaCBjYW4gYmUgYSIsCisiICByZWd1bGFyIGZpbGVuYW1lLCBvciBtYXkgY29udGFpbiBcIipcIiBhbmQvb3IgXCI/XCIgbWV0YWNoYXJhY3RlcnMsIiwKKyIgIGFyZSB0byBiZSByZWZ1c2VkLiAgVG8gc3BlY2lmeSBtdWx0aXBsZSBwYXR0ZXJucyAodXAgdG8gOCksIHVzZSBvdXRlciIsCisiICBicmFjZXMgYXJvdW5kIHRoZSBncm91cCwgYW5kIGlubmVyIGJyYWNlcyBhcm91bmQgZWFjaCBwYXR0ZXJuOiIsCisiICIsCisiICAgIC9FWENFUFQ6e3twYXR0ZXJuMX17cGF0dGVybjJ9Li4ufSIsCisiICIsCisiL0ZJTEVOQU1FUzp7Q09OVkVSVEVELExJVEVSQUx9IiwKKyIgIE92ZXJyaWRlcyB0aGUgZ2xvYmFsIFNFVCBGSUxFIE5BTUVTIHNldHRpbmcgZm9yIHRoaXMgdHJhbnNmZXIgb25seS4iLAorIiAiLAorIi9GSUxURVI6Y29tbWFuZCIsCisiICBDYXVzZXMgdGhlIGluY29taW5nIGZpbGUgdG8gcGFzc2VkIHRocm91Z2ggdGhlIGdpdmVuIGNvbW1hbmQgKHN0YW5kYXJkIiwKKyIgIGlucHV0L291dHB1dCBmaWx0ZXIpIGJlZm9yZSBiZWluZyB3cml0dGVuIHRvIGRpc2suIiwKKyIgIiwKKyNpZmRlZiBWTVMKKyIvSU1BR0UiLAorIiAgUmVjZWl2ZXMgdGhlIGZpbGUgaW4gaW1hZ2UgbW9kZS4iLAorIiAiLAorI2VuZGlmIC8qIFZNUyAqLworI2lmZGVmIENLX0xBQkVMRUQKKyIvTEFCRUxFRCIsCisiICBTcGVjaWZpZXMgbGFiZWxlZCB0cmFuc2ZlciBtb2RlLiIsCisiICIsCisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworCisiL01PVkUtVE86ZGlyZWN0b3J5LW5hbWUiLAorIiAgU3BlY2lmaWVzIHRoYXQgZWFjaCBmaWxlIHRoYXQgYXJyaXZlcyBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIHNwZWNpZmllZCIsCisiICBkaXJlY3RvcnkgYWZ0ZXIsIGFuZCBvbmx5IGlmLCBpdCBoYXMgYmVlbiByZWNlaXZlZCBzdWNjZXNzZnVsbHkuIiwKKyIgIiwKKyIvUEFUSE5BTUVTOntPRkYsQUJTT0xVVEUsUkVMQVRJVkUsQVVUT30iLAorIiAgT3ZlcnJpZGVzIHRoZSBnbG9iYWwgU0VUIFJFQ0VJVkUgUEFUSE5BTUVTIHNldHRpbmcgZm9yIHRoaXMgdHJhbnNmZXIuIiwKKyIgIiwKKyIvUElQRVM6e09OLE9GRn0iLAorIiAgT3ZlcnJpZGVzIHRoZSBUUkFOU0ZFUiBQSVBFUyBzZXR0aW5nIGZvciB0aGlzIGNvbW1hbmQgb25seS4gIE9OIGFsbG93cyIsCisiICByZWNlcHRpb24gb2YgZmlsZXMgd2l0aCBuYW1lcyBsaWtlIFwiIXRhciB4ZiAtXCIgdG8gYmUgYXV0b21hdGljYWxseSIsCisiICBkaXJlY3RlZCB0byBhIHBpcGVsaW5lLiIsCisiICIsCisiL1BST1RPQ09MOm5hbWUiLAorIiAgVXNlIHRoZSBnaXZlbiBwcm90b2NvbCB0byByZWNlaXZlIHRoZSBpbmNvbWluZyBmaWxlKHMpLiIsCisiICIsCisiL1FVSUVUIiwKKyIgIFdoZW4gc2VuZGluZyBpbiBsb2NhbCBtb2RlLCB0aGlzIHN1cHByZXNzZXMgdGhlIGZpbGUtdHJhbnNmZXIgZGlzcGxheS4iLAorIiAiLAorIi9SRUNVUlNJVkUiLAorIiAgRXF1aXZhbGVudCB0byAvUEFUSE5BTUVTOlJFTEFUSVZFLiIsCisiICIsCisiL1JFTkFNRS1UTzpzdHJpbmciLAorIiAgU3BlY2lmaWVzIHRoYXQgZWFjaCBmaWxlIHRoYXQgYXJyaXZlcyBzaG91bGQgYmUgcmVuYW1lZCBhcyBzcGVjaWZpZWQiLAorIiAgYWZ0ZXIsIGFuZCBvbmx5IGlmLCBpdCBoYXMgYmVlbiByZWNlaXZlZCBzdWNjZXNzZnVsbHkuICBUaGUgc3RyaW5nIHNob3VsZCIsCisiICBub3JtYWxseSBjb250YWluIHZhcmlhYmxlcyBsaWtlIFxcdihmaWxlbmFtZSkgb3IgXFx2KGZpbGVudW0pLiIsCisiICIsCisiL1RFWFQiLAorIiAgRm9yY2VzIHRleHQtbW9kZSBjb252ZXJzaW9ucyB1bmxlc3MgdGhlIGluY29taW5nIGZpbGUgaGFzIHRoZSBiaW5hcnkiLAorIiAgYXR0cmlidXRlIiwKKyIgIiwKKyIvVFJBTlNQQVJFTlQiLAorIiAgSW5oaWJpdHMgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiBvZiBpbmNvbWluZyB0ZXh0IGZpbGVzIGZvciB0aGUgZHVyYXRpb24iLAorIiAgb2YgdGhlIFJFQ0VJVkUgY29tbWFuZCB3aXRob3V0IGFmZmVjdGluZyBzdWJzZXF1ZW50IGNvbW1hbmRzLiIsCisiICIsCisiQWxzbyBzZWUgSEVMUCBTRU5ELCBIRUxQIEdFVCwgSEVMUCBTRVJWRVIsIEhFTFAgUkVNT1RFLiIsCisiIiB9OworCisjaWZuZGVmIE5PUkVTRU5ECitzdGF0aWMgY2hhciAqaG14eHJzZW4gPSAiXAorU3ludGF4OiBSRVNFTkQgZmlsZXNwZWMgW25hbWVdXG5cblwKKyAgUmVzZW5kIHRoZSBmaWxlIG9yIGZpbGVzLCB3aG9zZSBwcmV2aW91cyB0cmFuc2ZlciB3YXMgaW50ZXJydXB0ZWQuXG5cCisgIFBpY2tzIHVwIGZyb20gd2hlcmUgcHJldmlvdXMgdHJhbnNmZXIgbGVmdCBvZmYsIElGIHRoZSByZWNlaXZlciB3YXMgdG9sZFxuXAorICB0byBTRVQgRklMRSBJTkNPTVBMRVRFIEtFRVAuICBPbmx5IHdvcmtzIGZvciBiaW5hcnktbW9kZSB0cmFuc2ZlcnMuXG5cCisgIFJlcXVpcmVzIHRoZSBvdGhlciBLZXJtaXQgdG8gaGF2ZSBSRVNFTkQgY2FwYWJpbGl0eS4iOworCitzdGF0aWMgY2hhciAqaG14eHJnZXQgPSAiXAorU3ludGF4OiBSRUdFVCBmaWxlc3BlY1xuXG5cCisgIEFzayBhIHNlcnZlciB0byBSRVNFTkQgYSBmaWxlIHRvIEMtS2VybWl0LiI7CisKK3N0YXRpYyBjaGFyICpobXh4cHNlbiA9ICJcCitTeW50YXg6IFBTRU5EIGZpbGVzcGVjIHBvc2l0aW9uIFtuYW1lXVxuXG5cCisgIEp1c3QgbGlrZSBTRU5ELCBleGNlcHQgc2VuZHMgdGhlIGZpbGUgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGJ5dGUgcG9zaXRpb24uIjsKKyNlbmRpZiAvKiBOT1JFU0VORCAqLworCisjaWZuZGVmIE5PTVNFTkQKK3N0YXRpYyBjaGFyICpobXh4bXNlW10gPSB7CisiU3ludGF4OiBNU0VORCBbIHN3aXRjaGVzLi4uIF0gZmlsZXNwZWMgWyBmaWxlc3BlYyBbIC4uLiBdIF0iLAorIiAgU2VuZHMgdGhlIGZpbGVzIHNwZWNpZmllZCBieSB0aGUgZmlsZXNwZWNzLiAgT25lIG9yIG1vcmUgZmlsZXNwZWNzIG1heSBiZSIsCisiICBsaXN0ZWQsIHNlcGFyYXRlZCBieSBzcGFjZXMuICBBbnkgb3IgYWxsIGZpbGVzcGVjcyBtYXkgY29udGFpbiB3aWxkY2FyZHMiLAorIiAgYW5kIHRoZXkgbWF5IGJlIGluIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4gIEFsdGVybmF0aXZlIG5hbWVzIGNhbm5vdCBiZSIsCisiICBnaXZlbi4gIFN3aXRjaGVzIGluY2x1ZGUgL0JJTkFSWSAvREVMRVRFIC9NQUlMIC9QUk9UT0NPTCAvUVVJRVQgL1JFQ09WRVIiLAorIiAgL1RFWFQgL1RZUEU7IHNlZSBIRUxQIFNFTkQgZm9yIGRlc2NyaXB0aW9ucy4iLAorIiIKK307CisjZW5kaWYgLyogTk9NU0VORCAqLworCitzdGF0aWMgY2hhciAqaG14eGFkZFtdID0geworI2lmbmRlZiBOT01TRU5ECisiQUREIFNFTkQtTElTVCBmaWxlc3BlYyBbIDxtb2RlPiBbIDxhcy1uYW1lPiBdIF0iLAorIiAgQWRkcyB0aGUgc3BlY2lmaWVkIGZpbGUgb3IgZmlsZXMgdG8gdGhlIGN1cnJlbnQgU0VORCBsaXN0LiAgVXNlIFNIT1ciLAorIiAgU0VORC1MSVNUIGFuZCBDTEVBUiBTRU5ELUxJU1QgdG8gZGlzcGxheSBhbmQgY2xlYXIgdGhlIGxpc3Q7IHVzZSBTRU5EIiwKKyIgIGJ5IGl0c2VsZiB0byBzZW5kIHRoZSBmaWxlcyBmcm9tIGl0LiIsCisiICIsCisjZW5kaWYgLyogTk9NU0VORCAqLworI2lmZGVmIFBBVFRFUk5TCisiQUREIEJJTkFSWS1QQVRURVJOUyBbIDxwYXR0ZXJuPiBbIDxwYXR0ZXJuPiAuLi4gXSBdIiwKKyIgIEFkZHMgdGhlIHBhdHRlcm4ocyksIGlmIGFueSwgdG8gdGhlIFNFVCBGSUxFIEJJTkFSWS1QQVRURVJOUyBsaXN0LiIsCisiICIsCisiQUREIFRFWFQtUEFUVEVSTlMgWyA8cGF0dGVybj4gWyA8cGF0dGVybj4gLi4uIF0gXSIsCisiICBBZGRzIHRoZSBwYXR0ZXJuKHMpLCBpZiBhbnksIHRvIHRoZSBTRVQgRklMRSBURVhULVBBVFRFUk5TIGxpc3QuIiwKKyIgIFVzZSBTSE9XIFBBVFRFUk5TIHRvIHNlZSB0aGUgbGlzdHMuICBTZWUgSEVMUCBTRVQgRklMRSBmb3IgZnVydGhlciBpbmZvLiIsCisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyIifTsKKworc3RhdGljIGNoYXIgKmhteHhyZW12W10gPSB7CisjaWZkZWYgUEFUVEVSTlMKKyJSRU1PVkUgQklOQVJZLVBBVFRFUk5TIFsgPHBhdHRlcm4+IFsgPHBhdHRlcm4+IC4uLiBdIF0iLAorIiAgUmVtb3ZlcyB0aGUgcGF0dGVybihzKSwgaWYgYW55LCBmcm9tIHRoZSBTRVQgRklMRSBCSU5BUlktUEFUVEVSTlMgbGlzdCIsCisiICIsCisiUkVNT1ZFIFRFWFQtUEFUVEVSTlMgWyA8cGF0dGVybj4gWyA8cGF0dGVybj4gLi4uIF0gXSIsCisiICBSZW1vdmVzIHRoZSBnaXZlbiBwYXR0ZXJucyBmcm9tIHRoZSBTRVQgRklMRSBURVhULVBBVFRFUk5TIGxpc3QuIiwKKyIgIFVzZSBTSE9XIFBBVFRFUk5TIHRvIHNlZSB0aGUgbGlzdHMuICBTZWUgSEVMUCBTRVQgRklMRSBmb3IgZnVydGhlciBpbmZvLiIsCisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyIifTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1NFUlZFUgorc3RhdGljIGNoYXIgKmhteHhzZXIgPSAiU3ludGF4OiBTRVJWRVJcblwKKyAgRW50ZXIgc2VydmVyIG1vZGUgb24gdGhlIGN1cnJlbnQgY29ubmVjdGlvbi4gIEFsbCBmdXJ0aGVyIGNvbW1hbmRzXG5cCisgIGFyZSB0YWtlbiBpbiBwYWNrZXQgZm9ybSBmcm9tIHRoZSBvdGhlciBLZXJtaXQgcHJvZ3JhbS4gIFVzZSBGSU5JU0gsXG5cCisgIEJZRSwgb3IgUkVNT1RFIEVYSVQgdG8gZ2V0IEMtS2VybWl0IG91dCBvZiBzZXJ2ZXIgbW9kZS4iOworI2VuZGlmIC8qIE5PU0VSVkVSICovCisKK3N0YXRpYyBjaGFyICpobWhzZXRbXSA9IHsKKyIgIFRoZSBTRVQgY29tbWFuZCBlc3RhYmxpc2hlcyBjb21tdW5pY2F0aW9uLCBmaWxlLCBzY3JpcHRpbmcsIG9yIG90aGVyIiwKKyIgIHBhcmFtZXRlcnMuICBUaGUgU0hPVyBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgdGhlIHZhbHVlcyBvZiIsCisiICBTRVQgcGFyYW1ldGVycy4gIEhlbHAgaXMgYXZhaWxhYmxlIGZvciBlYWNoIGluZGl2aWR1YWwgcGFyYW1ldGVyOyIsCisiICB0eXBlIEhFTFAgU0VUID8gdG8gc2VlIHdoYXQncyBhdmFpbGFibGUuIiwKKyIiIH07CisKKyNpZm5kZWYgTk9TRVRLRVkKK3N0YXRpYyBjaGFyICpobWhza2V5W10gPSB7CisiU3ludGF4OiBTRVQgS0VZIGsgdGV4dCIsCisiT3I6ICAgICBTRVQgS0VZIENMRUFSIiwKKyIgIENvbmZpZ3VyZSB0aGUga2V5IHdob3NlIFwic2NhbiBjb2RlXCIgaXMgayB0byBzZW5kIHRoZSBnaXZlbiB0ZXh0IHdoZW4iLAorIiAgcHJlc3NlZCBkdXJpbmcgQ09OTkVDVCBtb2RlLiAgU0VUIEtFWSBDTEVBUiByZXN0b3JlcyBhbGwgdGhlIGRlZmF1bHQiLAorIiAga2V5IG1hcHBpbmdzLiAgSWYgdGhlcmUgaXMgbm8gdGV4dCwgdGhlIGRlZmF1bHQga2V5IGJpbmRpbmcgaXMgcmVzdG9yZWQiLAorI2lmbmRlZiBOT0NTRVRTCisiICBmb3IgdGhlIGtleSBrLiAgU0VUIEtFWSBtYXBwaW5ncyB0YWtlIHBsYWNlIGJlZm9yZSB0ZXJtaW5hbCBjaGFyYWN0ZXItc2V0IiwKKyIgIHRyYW5zbGF0aW9uLiIsCisjZWxzZQorIiAgdGhlIGtleSBrLiIsCisjZW5kaWYgLyogTk9DU0VUUyAqLworI2lmZGVmIE9TMgorIiAiLAorIiAgVGhlIHRleHQgbWF5IGNvbnRhaW4gXCJcXEt2ZXJic1wiIHRvIGRlbm90ZSBhY3Rpb25zLCB0byBzdGFuZCBmb3IgREVDIiwKKyIgIGtleXBhZCwgZnVuY3Rpb24sIG9yIGVkaXRpbmcga2V5cywgZXRjLiAgRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUga2V5Ym9hcmQiLAorIiAgdmVyYnMsIHR5cGUgU0hPVyBLVkVSQlMuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyIgIiwKKyIgIFRvIGZpbmQgb3V0IHRoZSBzY2FuIGNvZGUgYW5kIG1hcHBpbmcgZm9yIGEgcGFydGljdWxhciBrZXksIHVzZSB0aGUiLAorIiAgU0hPVyBLRVkgY29tbWFuZC4iLAorIiJ9OworI2VuZGlmIC8qIE5PU0VUS0VZICovCisKK3N0YXRpYyBjaGFyICpobXh5Y2hrdFtdID0geyAiU3ludGF4OiBTRVQgQkxPQ0stQ0hFQ0sgdHlwZSIsCisiICIsCisiICBUeXBlIG9mIHBhY2tldCBibG9jayBjaGVjayB0byBiZSB1c2VkIGZvciBlcnJvciBkZXRlY3Rpb24sIDEsIDIsIDMsIG9yIiwKKyIgIEJMQU5LLUZSRUUtMi4gIFR5cGUgMSBpcyBzdGFuZGFyZCwgYW5kIGNhdGNoZXMgbW9zdCBlcnJvcnMuICBUeXBlcyAyIGFuZCAzIiwKKyIgIHNwZWNpZnkgbW9yZSByaWdvcm91cyBjaGVja2luZyBhdCB0aGUgY29zdCBvZiBoaWdoZXIgb3ZlcmhlYWQuICBUaGUiLAorIiAgQkxBTkstRlJFRS0yIHR5cGUgaXMgdGhlIHNhbWUgYXMgVHlwZSAyLCBidXQgaXMgZ3VhcmFudGVlZCB0byBjb250YWluIG5vIiwKKyIgIGJsYW5rcy4iLAorIiIgfTsKKworc3RhdGljIGNoYXIgKiBobXh5ZGViW10gPSB7CisiU3ludGF4OiBTRVQgREVCVUcgeyBTRVNTSU9OLCBPTiwgT0ZGLCBUSU1FU1RBTVAgfSIsCisiICIsCisiU0VUIERFQlVHIE9OIiwKKyNpZmRlZiBERUJVRworIiAgT3BlbnMgYSBkZWJ1ZyBsb2cgZmlsZSBuYW1lZCBkZWJ1Zy5sb2cgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiIsCisiICBVc2UgTE9HIERFQlVHIGlmIHlvdSB3YW50IHNwZWNpZnkgYSBkaWZmZXJlbnQgbG9nIGZpbGUgbmFtZSBvciBwYXRoLiIsCisjZWxzZQorIiAgKEhhcyBubyBlZmZlY3QgaW4gdGhpcyB2ZXJzaW9uIG9mIEtlcm1pdC4pIiwKKyNlbmRpZiAvKiBERUJVRyAqLworIiAiLAorIlNFVCBERUJVRyBPRkYiLAorIiAgU3RvcHMgZGVidWcgbG9nZ2luZyBhbmQgc2Vzc2lvbiBkZWJ1Z2dpbmcuIiwKKyIgIiwKKyJTRVQgREVCVUcgU0VTU0lPTiIsCisjaWZuZGVmIE5PTE9DQUwKKyIgIERpc3BsYXlzIGNvbnRyb2wgYW5kIDgtYml0IGNoYXJhY3RlcnMgc3ltYm9saWNhbGx5IGR1cmluZyBDT05ORUNUIG1vZGUuIiwKKyIgIEVxdWl2YWxlbnQgdG8gU0VUIFRFUk1JTkFMIERFQlVHIE9OLiIsCisjZWxzZQorIiAgKEhhcyBubyBlZmZlY3QgaW4gdGhpcyB2ZXJzaW9uIG9mIEtlcm1pdC4pIiwKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisiICIsCisiU0VUIERFQlVHIFRJTUVTVEFNUCB7IE9OLCBPRkYgfSIsCisiICBFbmFibGVzL0Rpc2FibGVzIHRpbWVzdGFtcHMgb24gZGVidWcgbG9nIGVudHJpZXMuIiwKKyIiIH07CisKKyNpZmRlZiBDS19TUEVFRAorc3RhdGljIGNoYXIgKmhteHlxY3RsW10gPSB7CisiU3ludGF4OiBTRVQgQ09OVFJPTC1DSEFSQUNURVIgeyBQUkVGSVhFRCwgVU5QUkVGSVhFRCB9IHsgPGNvZGU+Li4uLCBBTEwgfSIsCisiICIsCisiICA8Y29kZT4gaXMgdGhlIG51bWVyaWMgQVNDSUkgY29kZSBmb3IgYSBjb250cm9sIGNoYXJhY3RlciAxLTMxLDEyNy0xNTksMjU1LiIKKywKKyIgIFRoZSB3b3JkIFwiQUxMXCIgbWVhbnMgYWxsIGNoYXJhY3RlcnMgaW4gdGhpcyByYW5nZS4iLAorIiAiLAorIiAgUFJFRklYRUQgPGNvZGU+IG1lYW5zIHRoZSBnaXZlbiBjb250cm9sIGNoYXJhY3RlciBtdXN0IGJlIGNvbnZlcnRlZCB0byBhIiwKKyIgIHByaW50YWJsZSBjaGFyYWN0ZXIgYW5kIHByZWZpeGVkLCB0aGUgZGVmYXVsdCBmb3IgYWxsIGNvbnRyb2wgY2hhcmFjdGVycy4iLAorIiAiLAorIiAgVU5QUkVGSVhFRCA8Y29kZT4gbWVhbnMgeW91IHRoaW5rIGl0IGlzIHNhZmUgdG8gc2VuZCB0aGUgZ2l2ZW4gY29udHJvbCIsCisiICBjaGFyYWN0ZXIgYXMtaXMsIHdpdGhvdXQgYSBwcmVmaXguICBVU0UgVEhJUyBPUFRJT04gQVQgWU9VUiBPV04gUklTSyEiLAorIiAiLAorIiAgU0hPVyBDT05UUk9MIHRvIHNlZSBjdXJyZW50IHNldHRpbmdzLiAgU0VUIENPTlRST0wgUFJFRklYRUQgQUxMIGlzIiwKKyIgIHJlY29tbWVuZGVkIGZvciBzYWZldHkuICBZb3UgY2FuIGluY2x1ZGUgbXVsdGlwbGUgPGNvZGU+IHZhbHVlcyBpbiBvbmUiLAorIiAgY29tbWFuZCwgc2VwYXJhdGVkIGJ5IHNwYWNlcy4iLAorIiIgfTsKKyNlbmRpZiAvKiBDS19TUEVFRCAqLworCisjaWZuZGVmIE5PRElBTAorc3RhdGljIGNoYXIgKmh4eW1vZG1bXSA9IHsKKyJTeW50YXg6IFNFVCBNT0RFTSA8cGFyYW1ldGVyPiA8dmFsdWU+IC4uLiIsCisiICIsCisiTm90ZTogTWFueSBvZiB0aGUgU0VUIE1PREVNIHBhcmFtZXRlcnMgYXJlIGNvbmZpZ3VyZWQgYXV0b21hdGljYWxseSB3aGVuIiwKKyJ5b3UgU0VUIE1PREVNIFRZUEUsIGFjY29yZGluZyB0byB0aGUgbW9kZW0ncyBjYXBhYmlsaXRpZXMuICBTSE9XIE1PREVNIHRvIiwKKyJzZWUgdGhlbS4gIEFsc28gc2VlIEhFTFAgRElBTCBhbmQgSEVMUCBTRVQgRElBTC4iLAorIiAiLAorIlNFVCBNT0RFTSBUWVBFIDxuYW1lPiIsCisKKyIgVGVsbHMgS2VybWl0IHdoaWNoIGtpbmQgb2YgbW9kZW0geW91IGhhdmUsIHNvIGl0IGNhbiBpc3N1ZSB0aGUiLAorIiBhcHByb3ByaWF0ZSBtb2RlbS1zcGVjaWZpYyBjb21tYW5kcyBmb3IgY29uZmlndXJhdGlvbiwgZGlhbGluZywgYW5kIiwKKyIgaGFuZ2luZyB1cC4gIEZvciBhIGxpc3Qgb2YgdGhlIG1vZGVtIHR5cGVzIGtub3duIHRvIEtlcm1pdCwgdHlwZSBcInNldCIsCisiIG1vZGVtIHR5cGUgP1wiLiAgVGhlIGRlZmF1bHQgbW9kZW0gdHlwZSBpcyBHRU5FUklDLCB3aGljaCBzaG91bGQgd29yayIsCisiIHdpdGggYW55IEFUIGNvbW1hbmQtc2V0IG1vZGVtIHRoYXQgaXMgY29uZmlndXJlZCBmb3IgZXJyb3IgY29ycmVjdGlvbiwiLAorIiBkYXRhIGNvbXByZXNzaW9uLCBhbmQgaGFyZHdhcmUgZmxvdyBjb250cm9sLiAgVXNlIFNFVCBNT0RFTSBUWVBFIE5PTkUiLAorIiBmb3IgZGlyZWN0IHNlcmlhbCwgY29ubmVjdGlvbnMuICBVc2UgU0VUIE1PREVNIFRZUEUgVVNFUi1ERUZJTkVEIHRvIHVzZSIsCisiIGEgdHlwZSBvZiBtb2RlbSB0aGF0IGlzIG5vdCBidWlsdCBpbiB0byBLZXJtaXQsIGFuZCB0aGVuIHVzZSBTRVQgTU9ERU0iLAorIiBDQVBBQklMSVRJRVMsIFNFVCBNT0RFTSwgRElBTC1DT01NQU5ELCBhbmQgU0VUIE1PREVNIENPTU1BTkQgdG8gdGVsbCIsCisiIEtlcm1pdCBob3cgdG8gY29uZmlndXJlIGFuZCBjb250cm9sIGl0LiIsCisKKyIgIiwKKworIlNFVCBNT0RFTSBDQVBBQklMSVRJRVMgPGxpc3Q+IiwKKyIgIFVzZSB0aGlzIGNvbW1hbmQgZm9yIGNoYW5naW5nIEtlcm1pdCdzIGlkZWEgb2YgeW91ciBtb2RlbSdzIGNhcGFiaWxpdGllcywiLAorIiAgZm9yIGV4YW1wbGUsIGlmIHlvdXIgbW9kZW0gaXMgc3VwcG9zZWQgdG8gaGF2ZSBidWlsdC1pbiBlcnJvciBjb3JyZWN0aW9uIiwKKyIgIGJ1dCBpbiBmYWN0IGRvZXMgbm90LiAgQWxzbyB1c2UgdGhpcyBjb21tYW5kIHRvIGRlZmluZSB0aGUgY2FwYWJpbGl0aWVzIiwKKyIgIG9mIGEgVVNFUi1ERUZJTkVEIG1vZGVtLiAgQ2FwYWJpbGl0aWVzIGFyZToiLAorIiAiLAorIiAgICBBVCAgICAgIEFULWNvbW1hbmRzIiwKKyIgICAgREMgICAgICBkYXRhLWNvbXByZXNzaW9uIiwKKyIgICAgRUMgICAgICBlcnJvci1jb3JyZWN0aW9uIiwKKyIgICAgSFdGQyAgICBoYXJkd2FyZS1mbG93IiwKKyIgICAgSVRVICAgICB2MjViaXMtY29tbWFuZHMiLAorIiAgICBTV0ZDICAgIHNvZnR3YXJlLWZsb3ciLAorIiAgICBLUyAgICAgIGtlcm1pdC1zcG9vZiIsCisiICAgIFNCICAgICAgc3BlZWQtYnVmZmVyaW5nIiwKKyIgICAgVEIgICAgICBUZWxlYml0IiwKKyIgIiwKKyJTRVQgTU9ERU0gQ0FSUklFUi1XQVRDSCB7IEFVVE8sIE9OLCBPRkYgfSIsCisiICBTeW5vbnltIGZvciBTRVQgQ0FSUklFUi1XQVRDSCAocS52LikiLAorIiAiLAorIlNFVCBNT0RFTSBDT01QUkVTU0lPTiB7IE9OLCBPRkYgfSIsCisiICBFbmFibGVzL2Rpc2FibGVzIHRoZSBtb2RlbSdzIGRhdGEgY29tcHJlc3Npb24gZmVhdHVyZSwgaWYgYW55LiIsCisiICIsCisiU0VUIE1PREVNIERJQUwtQ09NTUFORCA8dGV4dD4iLAorIiAgVGhlIHRleHQgcmVwbGFjZXMgS2VybWl0J3MgYnVpbHQtaW4gbW9kZW0gZGlhbGluZyBjb21tYW5kLiAgSXQgbXVzdCIsCisiICBpbmNsdWRlICclcycgKHBlcmNlbnQgcykgYXMgYSBwbGFjZS1ob2xkZXIgZm9yIHRoZSB0ZWxlcGhvbmUgbnVtYmVycyIsCisiICBnaXZlbiBpbiB5b3VyIERJQUwgY29tbWFuZHMuIiwKKyIgIiwKKyJTRVQgTU9ERU0gRVJST1ItQ09SUkVDVElPTiB7IE9OLCBPRkYgfSIsCisiICBFbmFibGVzL2Rpc2FibGVzIHRoZSBtb2RlbSdzIGVycm9yLWNvcnJlY3Rpb24gZmVhdHVyZSwgaWYgYW55LiIsCisiICIsCisiU0VUIE1PREVNIEVTQ0FQRS1DSEFSQUNURVIgbnVtYmVyIiwKKyIgIE51bWVyaWMgQVNDSUkgdmFsdWUgb2YgbW9kZW0ncyBlc2NhcGUgY2hhcmFjdGVyLCBlLmcuIDQzIGZvciAnKycuIiwKKyIgIEZvciBIYXllcy1jb21wYXRpYmxlIG1vZGVtcywgS2VybWl0IHVzZXMgdGhyZWUgY29waWVzLCBlLmcuIFwiKysrXCIuIiwKKyIgIiwKKyJTRVQgTU9ERU0gRkxPVy1DT05UUk9MIHtBVVRPLCBOT05FLCBSVFMvQ1RTLCBYT04vWE9GRn0iLAorIiAgU2VsZWN0cyB0aGUgdHlwZSBvZiBsb2NhbCBmbG93IGNvbnRyb2wgdG8gYmUgdXNlZCBieSB0aGUgbW9kZW0uIiwKKyIgIiwKKyJTRVQgTU9ERU0gSEFOR1VQLU1FVEhPRCB7IE1PREVNLUNPTU1BTkQsIFJTMjMyLVNJR05BTCwgRFRSIH0iLAorIiAgSG93IGhhbmd1cCBvcGVyYXRpb25zIHNob3VsZCBiZSBkb25lLiAgTU9ERU0tQ09NTUFORCBtZWFucyB0cnkgdG8iLAorIiAgZXNjYXBlIGJhY2sgdG8gdGhlIG1vZGVtJ3MgY29tbWFuZCBwcm9jZXNzb3IgYW5kIGdpdmUgYSBtb2RlbS1zcGVjaWZpYyIsCisiICBoYW5ndXAgY29tbWFuZC4gIFJTMjMyLVNJR05BTCBtZWFucyB0dXJuIG9mZiB0aGUgRFRSIHNpZ25hbC4gIERUUiBpcyBhIiwKKyIgIHN5bm9ueW0gZm9yIFJTMjMyLVNJR05BTC4iLAorIiAiLAorIlNFVCBNT0RFTSBLRVJNSVQtU1BPT0Yge09OLCBPRkZ9IiwKKyIgIElmIHRoZSBzZWxlY3RlZCBtb2RlbSB0eXBlIHN1cHBvcnRzIHRoZSBLZXJtaXQgcHJvdG9jb2wgZGlyZWN0bHksIiwKKyIgIHVzZSB0aGlzIGNvbW1hbmQgdG8gdHVybiBpdHMgS2VybWl0IHByb3RvY29sIGZ1bmN0aW9uIG9uIG9yIG9mZi4iLAorIiAiLAorIlNFVCBNT0RFTSBNQVhJTVVNLVNQRUVEIDxudW1iZXI+IiwKKyIgIFNwZWNpZnkgdGhlIG1heGltdW0gaW50ZXJmYWNlIHNwZWVkIGZvciB0aGUgbW9kZW0uIiwKKyIgIiwKKyJTRVQgTU9ERU0gTkFNRSA8dGV4dD4iLAorIiAgRGVzY3JpcHRpdmUgbmFtZSBmb3IgYSBVU0VSLURFRklORUQgbW9kZW0uIiwKKyIgIiwKKyJTRVQgTU9ERU0gU1BFQUtFUiB7T04sIE9GRn0iLAorIiAgVHVybnMgdGhlIG1vZGVtJ3Mgc3BlYWtlciBvbiBvciBvZmYgZHVyaW5nIGRpYWxpbmcuIiwKKyIgIiwKKyJTRVQgTU9ERU0gU1BFRUQtTUFUQ0hJTkcge09OLCBPRkZ9IiwKKyIgIE9OIG1lYW5zIHRoYXQgQy1LZXJtaXQgY2hhbmdlcyBpdHMgc2VyaWFsIGludGVyZmFjZSBzcGVlZCB0byBhZ3JlZSB3aXRoIiwKKyIgIHRoZSBzcGVlZCByZXBvcnRlZCBieSB0aGUgbW9kZW0ncyBDT05ORUNUIG1lc3NhZ2UsIGlmIGFueS4gIE9GRiBtZWFucyIsCisiICBLZXJtaXQgc2hvdWxkIG5vdCBjaGFuZ2UgaXRzIGludGVyZmFjZSBzcGVlZC4iLAorIiAiLAorIlNFVCBNT0RFTSBWT0xVTUUge0xPVywgTUVESVVNLCBISUdIfSIsCisiICBTZWxlY3RzIHRoZSBkZXNpcmVkIG1vZGVtIHNwZWFrZXIgdm9sdW1lIGZvciB3aGVuIHRoZSBzcGVha2VyIGlzIE9OLiIsCisiICIsCisiU0VUIE1PREVNIENPTU1BTkQgY29tbWFuZHMgYXJlIHVzZWQgdG8gb3ZlcnJpZGUgYnVpbHQtaW4gbW9kZW0gY29tbWFuZHMgZm9yIiwKKyJlYWNoIG1vZGVtIHR5cGUsIG9yIHRvIGZpbGwgaW4gY29tbWFuZHMgZm9yIHRoZSBVU0VSLURFRklORUQgbW9kZW0gdHlwZS4iLAorIk9taXR0aW5nIHRoZSBvcHRpb25hbCBbIHRleHQgXSByZXN0b3JlcyB0aGUgYnVpbHQtaW4gbW9kZW0tc3BlY2lmaWMgY29tbWFuZCwiLAorImlmIGFueToiLAorIiAiLAorIlNFVCBNT0RFTSBDT01NQU5EIEFVVE9BTlNXRVIge09OLCBPRkZ9IFsgdGV4dCBdIiwKKyIgIE1vZGVtIGNvbW1hbmRzIHRvIHR1cm4gYXV0b2Fuc3dlciBvbiBhbmQgb2ZmLiIsCisiICIsCisiU0VUIE1PREVNIENPTU1BTkQgQ09NUFJFU1NJT04ge09OLCBPRkZ9IFsgdGV4dCBdIiwKKyIgIE1vZGVtIGNvbW1hbmRzIHRvIHR1cm4gZGF0YSBjb21wcmVzc2lvbiBvbiBhbmQgb2ZmLiIsCisiICIsCisiU0VUIE1PREVNIENPTU1BTkQgRVJST1ItQ09SUkVDVElPTiB7T04sIE9GRn0gWyB0ZXh0IF0iLAorIiAgTW9kZW0gY29tbWFuZHMgdG8gdHVybiBlcnJvciBjb3JyZWN0aW9uIG9uIGFuZCBvZmYuIiwKKyIgIiwKKyJTRVQgTU9ERU0gQ09NTUFORCBIQU5HVVAgWyB0ZXh0IF0iLAorIiAgQ29tbWFuZCB0aGF0IHRlbGxzIHRoZSBtb2RlbSB0byBoYW5nIHVwIHRoZSBjb25uZWN0aW9uLiIsCisiICIsCisiU0VUIE1PREVNIENPTU1BTkQgSUdOT1JFLURJQUxUT05FIFsgdGV4dCBdIiwKKyIgIENvbW1hbmQgdGhhdCB0ZWxscyB0aGUgbW9kZW0gbm90IHRvIHdhaXQgZm9yIGRpYWx0b25lIGJlZm9yZSBkaWFsaW5nLiIsCisiICIsCisiU0VUIE1PREVNIENPTU1BTkQgSU5JVC1TVFJJTkcgWyB0ZXh0IF0iLAorIiAgVGhlICd0ZXh0JyBpcyBhIHJlcGxhY2VtZW50IGZvciBDLUtlcm1pdCdzIGJ1aWx0LWluIGluaXRpYWxpemF0aW9uIGNvbW1hbmQiLAorIiAgZm9yIHRoZSBtb2RlbS4iLAorIiAiLAorIlNFVCBNT0RFTSBDT01NQU5EIFBSRURJQUwtSU5JVCBbIHRleHQgXSIsCisiICBBIHNlY29uZCBJTklULVNUUklORyB0aGF0IGlzIHRvIGJlIHNlbnQgdG8gdGhlIG1vZGVtIGp1c3QgcHJpb3IgdG8gXAorZGlhbGluZy4iLAorIiAiLAorIlNFVCBNT0RFTSBDT01NQU5EIEhBUkRXQVJFLUZMT1cgWyB0ZXh0IF0iLAorIiAgTW9kZW0gY29tbWFuZCB0byBlbmFibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIChSVFMvQ1RTKSBpbiB0aGUgbW9kZW0uIiwKKyIgIiwKKyJTRVQgTU9ERU0gQ09NTUFORCBTT0ZUV0FSRS1GTE9XIFsgdGV4dCBdIiwKKyIgIE1vZGVtIGNvbW1hbmQgdG8gZW5hYmxlIGxvY2FsIHNvZnR3YXJlIGZsb3cgY29udHJvbCAoWG9uL1hvZmYpIGluIG1vZGVtLiIsCisiICIsCisiU0VUIE1PREVNIENPTU1BTkQgU1BFQUtFUiB7IE9OLCBPRkYgfSBbIHRleHQgXSIsCisiICBNb2RlbSBjb21tYW5kIHRvIHR1cm4gdGhlIG1vZGVtJ3Mgc3BlYWtlciBvbiBvciBvZmYuIiwKKyIgIiwKKyJTRVQgTU9ERU0gQ09NTUFORCBOTy1GTE9XLUNPTlRST0wgWyB0ZXh0IF0iLAorIiAgTW9kZW0gY29tbWFuZCB0byBkaXNhYmxlIGxvY2FsIGZsb3cgY29udHJvbCBpbiB0aGUgbW9kZW0uIiwKKyIgIiwKKyJTRVQgTU9ERU0gQ09NTUFORCBQVUxTRSBbIHRleHQgXSIsCisiICBNb2RlbSBjb21tYW5kIHRvIHNlbGVjdCBwdWxzZSBkaWFsaW5nLiIsCisiICIsCisiU0VUIE1PREVNIENPTU1BTkQgVE9ORSBbIHRleHQgXSIsCisiICBNb2RlbSBjb21tYW5kIHRvIHNlbGVjdCB0b25lIGRpYWxpbmcuIiwKKyIgIiwKKyJTRVQgTU9ERU0gQ09NTUFORCBWT0xVTUUgeyBMT1csIE1FRElVTSwgSElHSCB9IFsgdGV4dCBdIiwKKyIgIE1vZGVtIGNvbW1hbmQgdG8gc2V0IHRoZSBtb2RlbSdzIHNwZWFrZXIgdm9sdW1lLiIsCisiIn07CisKK3N0YXRpYyBjaGFyICpobXh5ZGlhbFtdID0geworIlRoZSBTRVQgRElBTCBjb21tYW5kIGVzdGFibGlzaGVzIG9yIGNoYW5nZXMgYWxsIHBhcmFtZXRlcnMgcmVsYXRlZCB0byIsCisiZGlhbGluZyB0aGUgdGVsZXBob25lLiAgQWxzbyBzZWUgSEVMUCBESUFMIGFuZCBIRUxQIFNFVCBNT0RFTS4gIFVzZSBTSE9XIiwKKyJESUFMIHRvIGRpc3BsYXkgYWxsIG9mIHRoZSBTRVQgRElBTCB2YWx1ZXMuIiwKKyIgIiwKKyJTRVQgRElBTCBDT1VOVFJZLUNPREUgPG51bWJlcj4iLAorIiAgVGVsbHMgS2VybWl0IHRoZSB0ZWxlcGhvbmljIGNvdW50cnktY29kZSBvZiB0aGUgY291bnRyeSB5b3UgYXJlIGRpYWxpbmciLAorIiAgZnJvbSwgc28gaXQgY2FuIHRlbGwgd2hldGhlciBhIHBvcnRhYmxlLWZvcm1hdCBwaG9uZSBudW1iZXIgZnJvbSB5b3VyIiwKKyIgIGRpYWxpbmcgZGlyZWN0b3J5IHdpbGwgcmVzdWx0IGluIGEgbmF0aW9uYWwgb3IgYW4gaW50ZXJuYXRpb25hbCBjYWxsLiIsCisiICBFeGFtcGxlczogMSBmb3IgVVNBLCBDYW5hZGEsIFB1ZXJ0byBSaWNvLCBldGM7IDcgZm9yIFJ1c3NpYSwgMzkgZm9yIEl0YWx5LCIsCisiICAzNTEgZm9yIFBvcnR1Z2FsLCA0NyBmb3IgTm9yd2F5LCA0NCBmb3IgdGhlIFVLLCA5NzIgZm9yIElzcmFlbCwgODEgZm9yIiwKKyIgIEphcGFuLCAuLi4iLAorIiAiLAorIiAgSWYgeW91IGhhdmUgbm90IGFscmVhZHkgc2V0IHlvdXIgRElBTCBJTlRMLVBSRUZJWCBhbmQgTEQtUFJFRklYLCB0aGVuIHRoaXMiLAorIiAgY29tbWFuZCBzZXRzIGRlZmF1bHQgdmFsdWVzIGZvciB0aGVtOiAwMTEgYW5kIDEsIHJlc3BlY3RpdmVseSwgZm9yIGNvdW50cnkiLAorIiAgY29kZSAxOyAwMCBhbmQgMCwgcmVzcGVjdGl2ZWx5LCBmb3IgYWxsIG90aGVyIGNvdW50cnkgY29kZXMuICBJZiB0aGVzZSBhcmUiLAorIiAgbm90IHlvdXIgdHJ1ZSBpbnRlcm5hdGlvbmFsIGFuZCBsb25nLWRpc3RhbmNlIGRpYWxpbmcgcHJlZml4ZXMsIHRoZW4geW91IiwKKyIgIHNob3VsZCBmb2xsb3cgdGhpcyBjb21tYW5kIGJ5IERJQUwgSU5UTC1QUkVGSVggYW5kIExELVBSRUZJWCB0byBsZXQgS2VybWl0IiwKKyIgIGtub3cgd2hhdCB0aGV5IHJlYWxseSBhcmUuIiwKKyIgIiwKKyJTRVQgRElBTCBBUkVBLUNPREUgWyA8bnVtYmVyPiBdIiwKKyIgIFRlbGxzIEtlcm1pdCB0aGUgYXJlYSBvciBjaXR5IGNvZGUgdGhhdCB5b3UgYXJlIGRpYWxpbmcgZnJvbSwgc28gaXQgY2FuIiwKKyIgIHRlbGwgd2hldGhlciBhIHBvcnRhYmxlLWZvcm1hdCBwaG9uZSBudW1iZXIgZnJvbSB0aGUgZGlhbGluZyBkaXJlY3RvcnkgaXMiLAorIiAgbG9jYWwgb3IgbG9uZyBkaXN0YW5jZS4gIEJlIGNhcmVmdWwgbm90IHRvIGluY2x1ZGUgeW91ciBsb25nLWRpc3RhbmNlIiwKKyIgIGRpYWxpbmcgcHJlZml4IGFzIHBhcnQgb2YgeW91ciBhcmVhIGNvZGU7IGZvciBleGFtcGxlLCB0aGUgYXJlYSBjb2RlIGZvciIsCisiICBjZW50cmFsIExvbmRvbiBpcyAxNzEsIG5vdCAwMTcxLiIsCisiICIsCisiU0VUIERJQUwgQ09ORklSTUFUSU9OIHtPTiwgT0ZGfSIsCisiICBLZXJtaXQgZG9lcyB2YXJpb3VzIHRyYW5zZm9ybWF0aW9ucyBvbiBhIHRlbGVwaG9uZSBudW1iZXIgcmV0cmlldmVkIGZyb20iLAorIiAgdGhlIGRpYWxpbmcgZGlyZWN0b3J5IHByaW9yIHRvIGRpYWxpbmcgKHVzZSBMT09LVVAgPG5hbWU+IHRvIHNlZSB0aGVtKS4iLAorIiAgSW4gY2FzZSB0aGUgcmVzdWx0IG1pZ2h0IGJlIHdyb25nLCB5b3UgY2FuIHVzZSBTRVQgRElBTCBDT05GSVJNIE9OIHRvIGhhdmUiLAorIiAgS2VybWl0IGFzayB5b3UgaWYgaXQgaXMgT0sgdG8gZGlhbCB0aGUgbnVtYmVyLCBhbmQgaWYgbm90LCB0byBsZXQgeW91IHR5cGUiLAorIiAgaW4gYSByZXBsYWNlbWVudC4iLAorIiAiLAorIlNFVCBESUFMIENPTk5FQ1QgeyBBVVRPLCBPTiwgT0ZGIH0iLAorIiAgV2hldGhlciB0byBDT05ORUNUIChlbnRlciB0ZXJtaW5hbCBtb2RlKSBhdXRvbWF0aWNhbGx5IGFmdGVyIHN1Y2Nlc3NmdWxseSIsCisiICBkaWFsaW5nLiAgT04gbWVhbnMgdG8gZG8gdGhpczsgT0ZGIG1lYW5zIG5vdCB0by4gIEFVVE8gKHRoZSBkZWZhdWx0KSBtZWFucyIsCisiICBkbyBpdCBpZiB0aGUgRElBTCBjb21tYW5kIHdhcyBnaXZlbiBpbnRlcmFjdGl2ZWx5LCBidXQgZG9uJ3QgZG8gaXQgaWYgdGhlIiwKKyIgIERJQUwgY29tbWFuZCB3YXMgaXNzdWVkIGZyb20gYSBtYWNybyBvciBjb21tYW5kIGZpbGUuICBJZiB5b3Ugc3BlY2lmeSBPTiIsCisiICBvciBBVVRPLCB5b3UgbWF5IGZvbGxvdyB0aGlzIGJ5IG9uZSBvZiB0aGUga2V5d29yZHMgVkVSQk9TRSBvciBRVUlFVCwgdG8iLAorIiAgaW5kaWNhdGUgd2hldGhlciB0aGUgdmVyYm9zZSA0LWxpbmUgJ0Nvbm5lY3RpbmcuLi4nIG1lc3NhZ2UgaXMgdG8gYmUiLAorIiAgZGlzcGxheWVkIGlmIERJQUwgc3VjY2VlZHMgYW5kIEtlcm1pdCBnb2VzIGludG8gQ09OTkVDVCBtb2RlLiIsCisiICIsCisiU0VUIERJQUwgQ09OVkVSVC1ESVJFQ1RPUlkge0FTSywgT04sIE9GRn0iLAorIiAgVGhlIGZvcm1hdCBvZiBLZXJtaXQncyBkaWFsaW5nIGRpcmVjdG9yeSBjaGFuZ2VkIGluIHZlcnNpb24gNUEoMTkyKS4gIFRoaXMiLAorIiAgY29tbWFuZCB0ZWxscyBLZXJtaXQgd2hhdCB0byBkbyB3aGVuIGl0IGVuY291bnRlcnMgYW4gb2xkLXN0eWxlIGRpcmVjdG9yeToiLAorIiAgQVNLIHlvdSB3aGV0aGVyIHRvIGNvbnZlcnQgaXQsIG9yIGNvbnZlcnQgaXQgYXV0b21hdGljYWxseSAoT04pLCBvciBsZWF2ZSIsCisiICBpdCBhbG9uZSAoT0ZGKS4gIE9sZC1zdHlsZSBkaXJlY3RvcmllcyBjYW4gc3RpbGwgYmUgdXNlZCB3aXRob3V0IiwKKyIgIGNvbnZlcnNpb24sIGJ1dCB0aGUgcGFyaXR5IGFuZCBzcGVlZCBmaWVsZHMgYXJlIGlnbm9yZWQuIiwKKyIgIiwKKyJTRVQgRElBTCBESVJFQ1RPUlkgWyBmaWxlbmFtZSBbIGZpbGVuYW1lIFsgZmlsZW5hbWUgWyAuLi4gXSBdIF0gXSIsCisiICBUaGUgbmFtZShzKSBvZiB5b3VyIGRpYWxpbmcgZGlyZWN0b3J5IGZpbGUocykuICBJZiB5b3UgZG8gbm90IHN1cHBseSBhbnkiLAorIiAgZmlsZW5hbWVzLCB0aGUgIGRpYWxpbmcgZGlyZWN0b3J5IGZlYXR1cmUgaXMgZGlzYWJsZWQgYW5kIGFsbCBudW1iZXJzIGFyZSIsCisiICBkaWFsZWQgbGl0ZXJhbGx5IGFzIGdpdmVuIGluIHRoZSBESUFMIGNvbW1hbmQuICBJZiB5b3Ugc3VwcGx5IG1vcmUgdGhhbiIsCisiICBvbmUgZGlyZWN0b3J5LCBhbGwgb2YgdGhlbSBhcmUgc2VhcmNoZWQuIiwKKyIgIiwKKyJTRVQgRElBTCBTT1JUIHtPTiwgT0ZGfSIsCisiICBXaGVuIG11bHRpcGxlIGVudHJpZXMgYXJlIG9idGFpbmVkIGZyb20geW91ciBkaWFsaW5nIGRpcmVjdG9yeSwgdGhleSBhcmUiLAorIiAgc29ydGVkIGluIFwiY2hlYXBlc3QtZmlyc3RcIiBvcmRlci4gIElmIHRoaXMgZG9lcyBub3QgcHJvZHVjZSB0aGUgZGVzaXJlZCIsCisiICBlZmZlY3QsIFNFVCBESUFMIFNPUlQgT0ZGIHRvIGRpc2FibGUgc29ydGluZywgYW5kIHRoZSBudW1iZXJzIHdpbGwgYmUiLAorIiAgZGlhbGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgZm91bmQuIiwKKyIgIiwKKyJTRVQgRElBTCBESVNQTEFZIHtPTiwgT0ZGfSIsCisiICBXaGV0aGVyIHRvIGRpc3BsYXkgZGlhbGluZyBwcm9ncmVzcyBvbiB0aGUgc2NyZWVuOyBkZWZhdWx0IGlzIE9GRi4iLAorIiAiLAorIlNFVCBESUFMIEhBTkdVUCB7T04sIE9GRn0iLAorIiAgV2hldGhlciB0byBoYW5nIHVwIHRoZSBwaG9uZSBwcmlvciB0byBkaWFsaW5nOyBkZWZhdWx0IGlzIE9OLiIsCisiICIsCisiU0VUIERJQUwgSUdOT1JFLURJQUxUT05FIHtPTiwgT0ZGfSIsCisiICBXaGV0aGVyIHRvIGlnbm9yZSBkaWFsdG9uZSB3aGVuIGRpYWxpbmc7IGRlZmF1bHQgaXMgT0ZGLiIsCisiICIsCisjaWZuZGVmIE5PU1BMCisiU0VUIERJQUwgTUFDUk8gWyBuYW1lIF0iLAorIiAgU3BlY2lmeSB0aGUgbmFtZSBvZiBhIG1hY3JvIHRvIGV4ZWN1dGUgb24gZXZlcnkgcGhvbmUgbnVtYmVyIGRpYWxlZCwganVzdCIsCisiICBwcmlvciB0byBkaWFsaW5nIGl0LCBpbiBvcmRlciB0byBwZXJmb3JtIGFueSBsYXN0LW1pbnV0ZSBhbHRlcmF0aW9ucy4iLAorIiAiLAorI2VuZGlmIC8qIE5PU1BMICovCisiU0VUIERJQUwgTUVUSE9EIHtBVVRPLCBERUZBVUxULCBUT05FLCBQVUxTRX0iLAorIiAgV2hldGhlciB0byB1c2UgdGhlIG1vZGVtJ3MgREVGQVVMVCBkaWFsaW5nIG1ldGhvZCwgb3IgdG8gZm9yY2UgVE9ORSBvciIsCisiICBQVUxTRSBkaWFsaW5nLiAgQVVUTyAodGhlIGRlZmF1bHQpIG1lYW5zIHRvIGNob29zZSB0b25lIG9yIHB1bHNlIGRpYWxpbmciLAorIiAgYmFzZWQgb24gdGhlIGNvdW50cnkgY29kZS4gIChBbHNvIHNlZSBTRVQgRElBTCBUT05FLUNPVU5UUklFUyBhbmQgU0VUIERJQUwiLAorIiAgUFVMU0UtQ09VTlRSSUVTLikiLAorIiAiLAorIlNFVCBESUFMIFBBQ0lORyBudW1iZXIiLAorIiAgSG93IG1hbnkgbWlsbGlzZWNvbmRzIHRvIHBhdXNlIGJldHdlZW4gc2VuZGluZyBlYWNoIGNoYXJhY3RlciB0byB0aGUgbW9kZW0iLAorIiAgZGlhbGVyLiAgVGhlIGRlZmF1bHQgaXMgLTEsIG1lYW5pbmcgdG8gdXNlIHRoZSBudW1iZXIgZnJvbSB0aGUgYnVpbHQtaW4iLAorIiBtb2RlbSBkYXRhYmFzZS4iLAorIiAgIiwKKyJTRVQgRElBTCBQVUxTRS1DT1VOVFJJRVMgWyBjYyBbIGNjIFsgLi4uIF0gXSBdIiwKKyIgIFNldHMgdGhlIGxpc3Qgb2YgY291bnRyaWVzIGluIHdoaWNoIHB1bHNlIGRpYWxpbmcgaXMgcmVxdWlyZWQuICBFYWNoIGNjIiwKKyIgIGlzIGEgY291bnRyeSBjb2RlLiIsCisiICIsCisiU0VUIERJQUwgVEVTVCB7IE9OLCBPRkYgfSIsCisiICBPRkYgZm9yIG5vcm1hbCBkaWFsaW5nLiAgU2V0IHRvIE9OIHRvIHRlc3QgZGlhbGluZyBwcm9jZWR1cmVzIHdpdGhvdXQiLAorIiAgYWN0dWFsbHkgZGlhbGluZy4iLAorIiAiLAorIlNFVCBESUFMIFRPTkUtQ09VTlRSSUVTIFsgY2MgWyBjYyBbIC4uLiBdIF0gXSIsCisiICBTZXRzIHRoZSBsaXN0IG9mIGNvdW50cmllcyBpbiB3aGljaCB0b25lIGRpYWxpbmcgaXMgYXZhaWxhYmxlLiAgRWFjaCBjYyIsCisiICBpcyBhIGNvdW50cnkgY29kZS4iLAorIiAiLAorIlNFVCBESUFMIFRJTUVPVVQgbnVtYmVyIiwKKyIgIEhvdyBtYW55IHNlY29uZHMgdG8gd2FpdCBmb3IgYSBkaWFsZWQgY2FsbCB0byBjb21wbGV0ZS4gIFVzZSB0aGlzIGNvbW1hbmQiLAorIiAgdG8gb3ZlcnJpZGUgdGhlIERJQUwgY29tbWFuZCdzIGF1dG9tYXRpYyB0aW1lb3V0IGNhbGN1bGF0aW9uLiAgQSB2YWx1ZSIsCisiICBvZiAwIHR1cm5zIG9mZiB0aGlzIGZlYXR1cmUgYW5kIHJldHVybnMgdG8gS2VybWl0J3MgYXV0b21hdGljIGRpYWwiLAorIiAgdGltZW91dCBjYWxjdWxhdGlvbi4iLAorIiAiLAorIlNFVCBESUFMIFJFU1RSSUNUIHsgSU5URVJOQVRJT05BTCwgTE9DQUwsIExPTkctRElTVEFOQ0UsIE5PTkUgfSIsCisiICBQcmV2ZW50cyBwbGFjaW5nIGNhbGxzIG9mIHRoZSB0eXBlIGluZGljYXRlZCwgb3IgZ3JlYXRlci4gIEZvciBleGFtcGxlIiwKKyIgIFNFVCBESUFMIFJFU1RSSUNUIExPTkcgcHJldmVudHMgcGxhY2luZyBvZiBsb25nLWRpc3RhbmNlIGFuZCBpbnRlcm5hdGlvbmFsIiwKKyIgIGNhbGxzLiAgSWYgdGhpcyBjb21tYW5kIGlzIG5vdCBnaXZlbiwgdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucy4gIFVzZWZ1bCIsCisiICB3aGVuIGRpYWxpbmcgYSBsaXN0IG9mIG51bWJlcnMgZmV0Y2hlZCBmcm9tIGEgZGlhbGluZyBkaXJlY3RvcnkuIiwKKyIgIiwKKyJTRVQgRElBTCBSRVRSSUVTIDxudW1iZXI+IiwKKyIgIEhvdyBtYW55IHRpbWVzIHRvIHJlZGlhbCBlYWNoIG51bWJlciBpZiB0aGUgZGlhbGluZyByZXN1bHQgaXMgYnVzeSBvciBubyIsCisiICBubyBhbnN3ZXIsIHVudGlsIHRoZSBjYWxsIGlzIHN1Y2Nlc2Z1bGx5IGFuc3dlcmVkLiAgVGhlIGRlZmF1bHQgaXMgMCIsCisiICBiZWNhdXNlIGF1dG9tYXRpYyByZWRpYWxpbmcgaXMgaWxsZWdhbCBpbiBzb21lIGNvdW50cmllcy4iLAorIiAiLAorIlNFVCBESUFMIElOVEVSVkFMIDxudW1iZXI+IiwKKyIgIEhvdyBtYW55IHNlY29uZHMgdG8gcGF1c2UgYmV0d2VlbiBhdXRvbWF0aWMgcmVkaWFsIGF0dGVtcHRzOyBkZWZhdWx0IDEwLiIsCisiICIsCisiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcHBseSB0byBhbGwgcGhvbmUgbnVtYmVycywgd2hldGhlciBnaXZlbiBsaXRlcmFsbHkiLAorIm9yIGZvdW5kIGluIHRoZSBkaWFsaW5nIGRpcmVjdG9yeToiLAorIiAiLAorIlNFVCBESUFMIFBSRUZJWCBbIHRleHQgXSIsCisiICBFc3RhYmxpc2ggYSBwcmVmaXggdG8gYmUgYXBwbGllZCB0byBhbGwgcGhvbmUgbnVtYmVycyB0aGF0IGFyZSBkaWFsZWQsIiwKKyIgIGZvciBleGFtcGxlIHRvIGRpc2FibGUgY2FsbCB3YWl0aW5nLiIsCisiICIsCisiU0VUIERJQUwgU1VGRklYIFsgdGV4dCBdIiwKKyIgIEVzdGFibGlzaCBhIHN1ZmZpeCB0byBiZSBhZGRlZCBhZnRlciBhbGwgcGhvbmUgbnVtYmVycyB0aGF0IGFyZSBkaWFsZWQuIiwKKyIgIiwKKyJUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFwcGx5IG9ubHkgdG8gcG9ydGFibGUtZm9ybWF0IG51bWJlcnMgb2J0YWluZWQgZnJvbSIsCisidGhlIGRpYWxpbmcgZGlyZWN0b3J5OyBpLmUuIG51bWJlcnMgdGhhdCBzdGFydCB3aXRoIGEgXCIrXCIgc2lnbiBhbmQiLAorImNvdW50cnkgY29kZSwgZm9sbG93ZWQgYnkgYXJlYSBjb2RlIGluIHBhcmVudGhlc2VzLCBmb2xsb3dlZCBieSB0aGUgcGhvbmUiLAorIm51bWJlci4iLAorIiAiLAorIlNFVCBESUFMIExDLUFSRUEtQ09ERVMgWyA8bGlzdD4gXSIsCisiICBTcGVjaWVzIGEgbGlzdCBvZiBhcmVhIGNvZGVzIHRvIHdoaWNoIGRpYWxpbmcgaXMgbG9jYWwsIGkuZS4gZG9lcyBub3QiLAorIiAgcmVxdWlyZSB0aGUgTEQtUFJFRklYLiAgVXAgdG8gMzIgYXJlYSBjb2RlcyBtYXkgYmUgbGlzdGVkLCBzZXBhcmF0ZWQgYnkiLAorIiAgc3BhY2VzLiAgQW55IGFyZWEgY29kZXMgaW4gdGhpcyBsaXN0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIGRpYWwiLAorIiAgc3RyaW5nIHNvIGRvIG5vdCBpbmNsdWRlIHlvdXIgb3duIGFyZWEgY29kZSBpZiBpdCBzaG91bGQgbm90IGJlIGRpYWxlZC4iLAorIiAiLAorIlNFVCBESUFMIExDLVBSRUZJWCBbIDx0ZXh0PiBdIiwKKyIgIFNwZWNpZmllcyBhIHByZWZpeCB0byBiZSBhcHBsaWVkIHRvIGxvY2FsIGNhbGxzIG1hZGUgZnJvbSBwb3J0YWJsZSBkaWFsaW5nIiwKKyIgIGRpcmVjdG9yeSBlbnRyaWVzLiAgTm9ybWFsbHkgbm8gcHJlZml4IGlzIHVzZWQgZm9yIGxvY2FsIGNhbGxzLiIsCisiICIsCisiU0VUIERJQUwgTEMtU1VGRklYIFsgPHRleHQ+IF0iLAorIiAgU3BlY2lmaWVzIGEgc3VmZml4IHRvIGJlIGFwcGxpZWQgdG8gbG9jYWwgY2FsbHMgbWFkZSBmcm9tIHBvcnRhYmxlIGRpYWxpbmciLAorIiAgZGlyZWN0b3J5IGVudHJpZXMuICBOb3JtYWxseSBubyBzdWZmaXggaXMgdXNlZCBmb3IgbG9jYWwgY2FsbHMuIiwKKyIgIiwKKyJTRVQgRElBTCBMRC1QUkVGSVggWyA8dGV4dD4gXSIsCisiICBZb3VyIGxvbmctZGlzdGFuY2UgZGlhbGluZyBwcmVmaXgsIHRvIGJlIHVzZWQgd2l0aCBwb3J0YWJsZSBkaWFsaW5nIiwKKyIgIGRpcmVjdG9yeSBlbnRyaWVzIHRoYXQgcmVzdWx0IGluIGxvbmctZGlzdGFuY2UgY2FsbHMuIiwKKyIgIiwKKyJTRVQgRElBTCBMRC1TVUZGSVggWyA8dGV4dD4gXSIsCisiICBMb25nLWRpc3RhbmNlIGRpYWxpbmcgc3VmZml4LCBpZiBhbnksIHRvIGJlIHVzZWQgd2l0aCBwb3J0YWJsZSBkaWFsaW5nIiwKKyIgIGRpcmVjdG9yeSBlbnRyaWVzIHRoYXQgcmVzdWx0IGluIGxvbmctZGlzdGFuY2UgY2FsbHMuICBUaGlzIHdvdWxkIG5vcm1hbGx5IiwKKyIgIGJlIHVzZWQgZm9yIGFwcGVuZGluZyBhIGNhbGxpbmctY2FyZCBudW1iZXIgdG8gdGhlIHBob25lIG51bWJlci4iLAorIiAiLAorIlNFVCBESUFMIEZPUkNFLUxPTkctRElTVEFOQ0UgeyBPTiwgT0ZGIH0iLAorIiAgV2hldGhlciB0byBmb3JjZSBsb25nLWRpc3RhbmNlIGRpYWxpbmcgZm9yIGNhbGxzIHRoYXQgbm9ybWFsbHkgd291bGQgYmUiLAorIiAgbG9jYWwuICBGb3IgdXNlIChlLmcuKSBpbiBGcmFuY2UuIiwKKyIgIiwKKyJTRVQgRElBTCBUT0xMLUZSRUUtQVJFQS1DT0RFIFsgPG51bWJlcj4gWyA8bnVtYmVyPiBbIC4uLiBdIF0gXSIsCisiICBUZWxscyBLZXJtaXQgdGhlIHRvbGwtZnJlZSBhcmVhIGNvZGUocykgaW4geW91ciBjb3VudHJ5LiIsCisiICIsCisiU0VUIERJQUwgVE9MTC1GUkVFLVBSRUZJWCBbIDx0ZXh0PiBdIiwKKyIgIFlvdSB0b2xsLWZyZWUgZGlhbGluZyBwcmVmaXgsIGluIGNhc2UgaXQgaXMgZGlmZmVyZW50IGZyb20geW91ciBsb25nLSIsCisiICBkaXN0YW5jZSBkaWFsaW5nIHByZWZpeC4iLAorIiAiLAorIlNFVCBESUFMIElOVEwtUFJFRklYIDx0ZXh0PiIsCisiICBZb3VyIGludGVybmF0aW9uYWwgZGlhbGluZyBwcmVmaXgsIHRvIGJlIHVzZWQgd2l0aCBwb3J0YWJsZSBkaWFsaW5nIiwKKyIgIGRpcmVjdG9yeSBlbnRyaWVzIHRoYXQgcmVzdWx0IGluIGludGVybmF0aW9uYWwgY2FsbHMuIiwKKyIgIiwKKyJTRVQgRElBTCBJTlRMLVNVRkZJWCA8dGV4dD4iLAorIiAgSW50ZXJuYXRpb25hbCBkaWFsaW5nIHN1ZmZpeCwgaWYgYW55LCB0byBiZSB1c2VkIHdpdGggcG9ydGFibGUgZGlhbGluZyIsCisiICBkaXJlY3RvcnkgZW50cmllcyB0aGF0IHJlc3VsdCBpbiBpbnRlcm5hdGlvbmFsIGNhbGxzLiIsCisiICIsCisiU0VUIERJQUwgUEJYLU9VVFNJREUtUFJFRklYIDx0ZXh0PiIsCisiICBVc2UgdGhpcyB0byB0ZWxsIEtlcm1pdCBob3cgdG8gZ2V0IGFuIG91dHNpZGUgbGluZSB3aGVuIGRpYWxpbmcgZnJvbSBhIiwKKyIgIFByaXZhdGUgQnJhbmNoIEV4Y2hhbmdlIChQQlgpLiIsCisiICIsCisiU0VUIERJQUwgUEJYLUVYQ0hBTkdFIDx0ZXh0PiBbIDx0ZXh0PiBbIC4uLiBdIF0iLAorIiAgSWYgUEJYLU9VVFNJREUtUFJFRklYIGlzIHNldCwgdGhlbiB5b3UgY2FuIHVzZSB0aGlzIGNvbW1hbmQgdG8gdGVsbCBLZXJtaXQiLAorIiAgdGhlIGxlYWRpbmcgZGlnaXRzIG9mIG9uZSBvciBtb3JlIGxvY2FsIHBob25lIG51bWJlcnMgdGhhdCBpZGVudGlmeSBpdCBhcyIsCisiICBiZWluZyBvbiB5b3VyIFBCWCwgc28gaXQgY2FuIG1ha2UgYW4gaW50ZXJuYWwgY2FsbCBieSBkZWxldGluZyB0aG9zZSBkaWdpdHMiCissCisiICBmcm9tIHRoZSBwaG9uZSBudW1iZXIuIiwKKyIgIiwKKyJTRVQgRElBTCBQQlgtSU5URVJOQUwtUFJFRklYIDx0ZXh0PiIsCisiICBJZiBQQlgtRVhDSEFOR0UgaXMgc2V0LCBhbmQgS2VybWl0IGRldGVybWluZXMgZnJvbSBpdCB0aGF0IGEgY2FsbCBpcyIsCisiICBpbnRlcm5hbCwgdGhlbiB0aGlzIHByZWZpeCwgaWYgYW55LCBpcyBhZGRlZCB0byB0aGUgbnVtYmVyIHByaW9yIHRvIiwKKyIgIFwKK2RpYWxpbmcuICBVc2UgdGhpcyBpZiBpbnRlcm5hbCBjYWxscyBmcm9tIHlvdXIgUEJYIHJlcXVpcmUgYSBzcGVjaWFsIHByZWZpeC4iLAorIiIgfTsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworc3RhdGljIGNoYXIgKmhteHlmbG9bXSA9IHsgIlN5bnRheDogU0VUIEZMT1cgWyBzd2l0Y2ggXSB2YWx1ZSIsCisiICIsCisjaWZuZGVmIE5PTE9DQUwKKyIgIFNlbGVjdHMgdGhlIHR5cGUgb2YgZmxvdyBjb250cm9sIHRvIHVzZSBkdXJpbmcgZmlsZSB0cmFuc2ZlciwgdGVybWluYWwiLAorIiAgY29ubmVjdGlvbiwgYW5kIHNjcmlwdCBleGVjdXRpb24uIiwKKyNlbHNlCisiICBTZWxlY3RzIHRoZSB0eXBlIG9mIGZsb3cgY29udHJvbCB0byB1c2UgZHVyaW5nIGZpbGUgdHJhbnNmZXIuIiwKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisiICIsCisiICBTd2l0Y2hlcyBsZXQgeW91IGFzc29jaWF0ZSBhIHBhcnRpY3VsYXIga2luZCBvZiBmbG93IGNvbnRyb2wgd2l0aCBlYWNoIiwKKyIgIGtpbmQgb2YgY29ubmVjdGlvbjogL1JFTU9URSwgL01PREVNLCAvRElSRUNULVNFUklBTCwgL1RDUElQLCBldGM7IHR5cGUiLAorIiAgXCJzZXQgZmxvdyA/XCIgZm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgc3dpdGNoZXMuICBUaGVuIHdoZW5ldmVyIHlvdSBtYWtlIiwKKyIgIGEgY29ubmVjdGlvbiwgdGhlIGFzc29jaWF0ZWQgZmxvdy1jb250cm9sIGlzIGNob3NlbiBhdXRvbWF0aWNhbGx5LiIsCisiICBUaGUgZmxvdy1jb250cm9sIHZhbHVlcyBhcmUgTk9ORSwgS0VFUCwgWE9OL1hPRkYsIGFuZCBwb3NzaWJseSBSVFMvQ1RTIiwKKyIgIGFuZCBzb21lIG90aGVyczsgYWdhaW4sIHR5cGUgXCJzZXQgZmxvdyA/XCIgZm9yIGEgbGlzdC4gIEtFRVAgdGVsbHMgS2VybWl0IiwKKyIgIG5vdCB0byB0cnkgdG8gY2hhbmdlIHRoZSBjdXJyZW50IGZsb3ctY29udHJvbCBtZXRob2QgZm9yIHRoZSBjb25uZWN0aW9uLiIsCisiICIsCisiICBJZiB5b3Ugb21pdCB0aGUgc3dpdGNoIGFuZCBzaW1wbHkgc3VwcGx5IGEgdmFsdWUsIHRoaXMgdmFsdWUgYmVjb21lcyB0aGUiLAorIiAgY3VycmVudCBmbG93IGNvbnRyb2wgdHlwZSwgb3ZlcnJpZGluZyBhbnkgZGVmYXVsdCB2YWx1ZSB0aGF0IG1pZ2h0IGhhdmUiLAorIiAgYmVlbiBjaG9zZW4gaW4geW91ciBtb3N0IHJlY2VudCBTRVQgTElORSwgU0VUIFBPUlQsIG9yIFNFVCBIT1NULCBvciBvdGhlciIsCisiICBjb25uZWN0aW9uLWVzdGFibGlzaG1lbnQgY29tbWFuZC4iLAorIiAiLAorIiAgVHlwZSBTSE9XIEZMT1ctQ09OVFJPTCB0byBzZWUgdGhlIGN1cnJlbnQgZGVmYXVsdHMgZm9yIGVhY2ggY29ubmVjdGlvbiB0eXBlIgorLAorIiAgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBjb25uZWN0aW9uIHR5cGUgYW5kIGZsb3ctY29udHJvbCBzZXR0aW5nLiAgU0hPVyIsCisiICBDT01NVU5JQ0FUSU9OUyBhbHNvIHNob3dzIHRoZSBjdXJyZW50IGZsb3ctY29udHJvbCBzZXR0aW5nLiIsCisiIn07CisKK3N0YXRpYyBjaGFyICpobXh5ZltdID0geworIlN5bnRheDogU0VUIEZJTEUgcGFyYW1ldGVyIHZhbHVlIiwKKyIgIiwKKyJTZXRzIGZpbGUtcmVsYXRlZCBwYXJhbWV0ZXJzLiAgVXNlIFNIT1cgRklMRSB0byB2aWV3IHRoZW0uICBBbHNvIHNlZSBTRVQiLAorIihhbmQgU0hPVykgVFJBTlNGRVIgYW5kIFBST1RPQ09MLiIsCisiICIsCisjaWZkZWYgVk1TCisiU0VUIEZJTEUgVFlQRSB7IFRFWFQsIEJJTkFSWSwgSU1BR0UsIExBQkVMRUQgfSIsCisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKyJTRVQgRklMRSBUWVBFIHsgVEVYVCwgQklOQVJZLCBMQUJFTEVEIH0iLAorI2Vsc2UKKyNpZmRlZiBNQUMKKyJTRVQgRklMRSBUWVBFIHsgVEVYVCwgQklOQVJZLCBNQUNCSU5BUlkgfSIsCisjZWxzZQorIlNFVCBGSUxFIFRZUEUgeyBURVhULCBCSU5BUlkgfSIsCisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIFZNUyAqLworIiAgSG93IGZpbGUgY29udGVudHMgYXJlIHRvIGJlIHRyZWF0ZWQgZHVyaW5nIGZpbGUgdHJhbnNmZXIgaW4gdGhlIGFic2VuY2UiLAorIiAgb2YgYW55IG90aGVyIGluZGljYXRpb24uICBUWVBFIGNhbiBiZSBURVhUIGZvciBjb252ZXJzaW9uIG9mIHJlY29yZCBmb3JtYXQiLAorIiAgYW5kIGNoYXJhY3RlciBzZXQsIHdoaWNoIGlzIHVzdWFsbHkgbmVlZGVkIHdoZW4gdHJhbnNmZXJyaW5nIHRleHQgZmlsZXMiLAorIiAgYmV0d2VlbiB1bmxpa2UgcGxhdGZvcm1zIChzdWNoIGFzIFVOSVggYW5kIFdpbmRvd3MpLCBvciBCSU5BUlkgZm9yIG5vIiwKKyIgIGNvbnZlcnNpb24gaWYgVFJBTlNGRVIgTU9ERSBpcyBNQU5VQUwsIHdoaWNoIGlzIG5vdCB0aGUgZGVmYXVsdC4gIFVzZSIsCisiICBCSU5BUlkgd2l0aCBUUkFOU0ZFUiBNT0RFIE1BTlVBTCBmb3IgZXhlY3V0YWJsZSBwcm9ncmFtcyBvciBiaW5hcnkgZGF0YSBvciIsCisiICB3aGVuZXZlciB5b3Ugd2lzaCB0byBkdXBsaWNhdGUgdGhlIG9yaWdpbmFsIGNvbnRlbnRzIG9mIHRoZSBmaWxlLCBieXRlIGZvciIKKywKKyIgIGJ5dGUuICBJbiBtb3N0IG1vZGVybiBLZXJtaXQgcHJvZ3JhbXMsIHRoZSBmaWxlIHNlbmRlciBpbmZvcm1zIHRoZSByZWNlaXZlciIKKywKKyIgIG9mIHRoZSBmaWxlIHR5cGUgYXV0b21hdGljYWxseS4gIEhvd2V2ZXIsIHdoZW4gc2VuZGluZyBmaWxlcyBmcm9tIEMtS2VybWl0IiwKKyIgIHRvIGFuIGFuY2llbnQgb3Igbm9uLUNvbHVtYmlhIEtlcm1pdCBpbXBsZW1lbnRhdGlvbiwgeW91IG1pZ2h0IG5lZWQgdG8gc2V0IiwKKyIgIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgdHlwZSBhdCB0aGUgcmVjZWl2ZXIgYXMgd2VsbC4iLAorIiAiLAorI2lmZGVmIFZNUworIiAgRklMRSBUWVBFIHNldHRpbmdzIG9mIFRFWFQgYW5kIEJJTkFSWSBoYXZlIG5vIGVmZmVjdCB3aGVuIHNlbmRpbmcgZmlsZXMsIiwKKyIgIHNpbmNlIFZNUyBDLUtlcm1pdCBkZXRlcm1pbmVzIGVhY2ggZmlsZSdzIHR5cGUgYXV0b21hdGljYWxseSBmcm9tIGl0cyIsCisiICByZWNvcmQgZm9ybWF0OiBiaW5hcnkgZm9yIGZpeGVkLCB0ZXh0IGZvciBvdGhlcnMuICBGb3IgaW5jb21pbmcgZmlsZXMsIiwKKyIgIHRoZXNlIHNldHRpbmdzIGFyZSBlZmZlY3RpdmUgb25seSBpbiB0aGUgYWJzZW5jZSBvZiBhIGZpbGUtdHlwZSBpbmRpY2F0aW9uIiwKKyIgIGZyb20gdGhlIHNlbmRlci4iLAorIiAiLAorIiAgWW91IG1heSBpbmNsdWRlIGFuIG9wdGlvbmFsIHJlY29yZC1mb3JtYXQgYWZ0ZXIgdGhlIHdvcmQgQklOQVJZLiAgVGhpcyBtYXkiLAorIiAgYmUgRklYRUQgKHRoZSBkZWZhdWx0KSBvciBVTkRFRklORUQuICBVTkRFRklORUQgaXMgdXNlZCB3aGVuIHlvdSBuZWVkIHRvIiwKKyIgIHJlY2VpdmUgYmluYXJ5IGZpbGVzIGluIGJpbmFyeSBtb2RlIGFuZCBoYXZlIHRoZW0gc3RvcmVkIHdpdGggVU5ERUZJTkVEIiwKKyIgIHJlY29yZCBmb3JtYXQsIHdoaWNoIGlzIHJlcXVpcmVkIGJ5IGNlcnRhaW4gVk1TIGFwcGxpY2F0aW9ucy4iLAorIiAiLAorIiAgVHdvIGFkZGl0aW9uYWwgVk1TIGZpbGUgdHlwZXMgYXJlIGFsc28gc3VwcG9ydGVkOiBJTUFHRSBhbmQgTEFCRUxFRC4iLAorIiAgSU1BR0UgbWVhbnMgcmF3IGJsb2NrIGkvbywgbm8gaW50ZXJmZXJlbmNlIGZyb20gUk1TLCBhcHBsaWVzIHRvIGZpbGUiLAorIiAgdHJhbnNtaXNzaW9uIG9ubHksIGFuZCBvdmVycmlkZXMgdGhlIG5vcm1hbCBhdXRvbWF0aWNhIGZpbGUgdHlwZSIsCisiICBkZXRlcm1pbmF0aW9uLiAgIExBQkVMRUQgbWVhbnMgdG8gc2VuZCBvciBpbnRlcnByZXQgUk1TIGF0dHJpYnV0ZXMiLAorIiAgd2l0aCB0aGUgZmlsZS4iLAorIiAiLAorI2Vsc2UKKyIgIFdoZW4gVFJBTlNGRVIgTU9ERSBpcyBBVVRPTUFUSUMgKGFzIGl0IGlzIGJ5IGRlZmF1bHQpLCB2YXJpb3VzIGF1dG9tYXRpYyIsCisiICBtZXRob2RzIChkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtKSBhcmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGZpbGUiLAorIiAgaXMgdHJhbnNmZXJyZWQgaW4gdGV4dCBvciBiaW5hcnkgbW9kZTsgdGhlc2UgbWV0aG9kcyAod2hpY2ggbWlnaHQgaW5jbHVkZSIsCisiICBjb250ZW50IHNjYW4gKHNlZSBTRVQgRklMRSBTQ0FOIGJlbG93KSwgZmlsZW5hbWUgcGF0dGVybiBtYXRjaGluZyAoU0VUIEZJTEUiCissCisiICBQQVRURVJOUyksIGNsaWVudC9zZXJ2ZXIgXCJraW5kcmVkLXNwaXJpdFwiIHJlY29nbml0aW9uLCBvciBzb3VyY2UgZmlsZSIsCisiICByZWNvcmQgZm9ybWF0KSBzdXBlcnNlZGUgdGhlIEZJTEUgVFlQRSBzZXR0aW5nIGJ1dCBjYW4sIHRoZW1zZWx2ZXMsIGJlIiwKKyIgIHN1cGVyc2VkZWQgYnkgaW5jbHVkaW5nIGEgL0JJTkFSWSBvciAvVEVYVCBzd2l0Y2ggaW4gdGhlIFNFTkQsIEdFVCwgb3IiLAorIiAgUkVDRUlWRSBjb21tYW5kLiIsCisiICIsCisiICBXaGVuIFRSQU5TRkVSIE1PREUgaXMgTUFOVUFMLCB0aGUgYXV0b21hdGljIG1ldGhvZHMgYXJlIHNraXBwZWQgZm9yIHNlbmRpbmciCissCisiICBmaWxlczsgdGhlIEZJTEUgVFlQRSBzZXR0aW5nIGlzIHVzZWQgaW5zdGVhZCwgd2hpY2ggY2FuIGJlIHN1cGVyc2VkZWQgb24iLAorIiAgYSBwZXItY29tbWFuZCBiYXNpcyB3aXRoIGEgL1RFWFQgb3IgL0JJTkFSWSBzd2l0Y2guIiwKKyNlbmRpZiAvKiBWTVMgKi8KKyIgIiwKKworI2lmbmRlZiBOT1hGRVIKKworIlNFVCBGSUxFIEJZVEVTSVpFIHsgNywgOCB9IiwKKyIgIE5vcm1hbGx5IDguICBJZiA3LCBLZXJtaXQgdHJ1bmNhdGVzIHRoZSA4dGggYml0IG9mIGFsbCBmaWxlIGJ5dGVzLiIsCisiICIsCisjaWZuZGVmIE5PQ1NFVFMKKyJTRVQgRklMRSBDSEFSQUNURVItU0VUIG5hbWUiLAorIiAgVGVsbHMgdGhlIGVuY29kaW5nIG9mIHRoZSBsb2NhbCBmaWxlLCBBU0NJSSBieSBkZWZhdWx0LiIsCisiICBUaGUgbmFtZXMgSVRBTElBTiwgUE9SVFVHVUVTRSwgTk9SV0VHSUFOLCBldGMsIHJlZmVyIHRvIDctYml0IElTTy02NDYiLAorIiAgbmF0aW9uYWwgY2hhcmFjdGVyIHNldHMuICBMQVRJTjEgaXMgdGhlIDgtYml0IElTTyA4ODU5LTEgTGF0aW4gQWxwaGFiZXQgMSIsCisiICBmb3IgV2VzdGVybiBFdXJvcGVhbiBsYW5ndWFnZXMuIiwKKyIgIE5FWFQgaXMgdGhlIDgtYml0IGNoYXJhY3RlciBzZXQgb2YgdGhlIE5lWFQgd29ya3N0YXRpb24uIiwKKyIgIFRoZSBDUG5ubiBzZXRzIGFyZSBmb3IgUENzLiAgTUFDSU5UT1NILUxBVElOIGlzIGZvciB0aGUgTWFjaW50b3NoLiIsCisjaWZuZGVmIE5PTEFUSU4yCisiICBMQVRJTjIgaXMgSVNPIDg4NTktMiBmb3IgRWFzdGVybiBFdXJvcGVhbiBsYW5ndWFnZXMgdGhhdCBhcmUgd3JpdHRlbiB3aXRoIiwKKyIgIFJvbWFuIGxldHRlcnMuICBNYXpvdmlhIGlzIGEgUEMgY29kZSBwYWdlIHVzZWQgaW4gUG9sYW5kLiIsCisjZW5kaWYgLyogTk9MQVRJTjIgKi8KKyNpZmRlZiBDWVJJTExJQworIiAgS09JLUNZUklMTElDLCBDWVJJTExJQy1JU08sIGFuZCBDUDg2NiBhcmUgOC1iaXQgQ3lyaWxsaWMgY2hhcmFjdGVyIHNldHMuIiwKKyIgIFNIT1JULUtPSSBpcyBhIDctYml0IEFTQ0lJIGNvZGluZyBmb3IgQ3lyaWxsaWMuICBCVUxHQVJJQS1QQyBpcyBhIFBDIGNvZGUiLAorIiAgcGFnZSB1c2VkIGluIEJ1bGdhcmlhIiwKKyNlbmRpZiAvKiBDWVJJTExJQyAqLworI2lmZGVmIEhFQlJFVworIiAgSEVCUkVXLUlTTyBpcyBJU08gODg1OS04IExhdGluL0hlYnJldy4gIENQODYyIGlzIHRoZSBIZWJyZXcgUEMgY29kZSBwYWdlLiIsCisiICBIRUJSRVctNyBpcyBsaWtlIEFTQ0lJIHdpdGggdGhlIGxvd2VyY2FzZSBsZXR0ZXJzIHJlcGxhY2VkIGJ5IEhlYnJldy4iLAorI2VuZGlmIC8qIEhFQlJFVyAqLworI2lmZGVmIEdSRUVLCisiICBHUkVFSy1JU08gaXMgSVNPIDg4NTktNyBMYXRpbi9HcmVlay4gIENQODY5IGlzIHRoZSBHcmVlayBQQyBjb2RlIHBhZ2UuIiwKKyIgIEVMT1QtOTI3IGlzIGxpa2UgQVNDSUkgd2l0aCB0aGUgbG93ZXJjYXNlIGxldHRlcnMgcmVwbGFjZWQgYnkgR3JlZWsuIiwKKyNlbmRpZiAvKiBHUkVFSyAqLworI2lmZGVmIEtBTkpJCisiICBKQVBBTkVTRS1FVUMsIEpJUzctS0FOSkksIERFQy1LQU5KSSwgYW5kIFNISUZULUpJUy1LQU5KSSBhcmUgSmFwYW5lc2UiLAorIiAgS2FuamkgY2hhcmFjdGVyIHNldHMuIiwKKyNlbmRpZiAvKiBLQU5KSSAqLworI2lmZGVmIFVOSUNPREUKKyIgIFVDUy0yIGlzIHRoZSAyLWJ5dGUgZm9ybSBvZiB0aGUgVW5pdmVyc2FsIENoYXJhY3RlciBTZXQuIiwKKyIgIFVURi04IGlzIHRoZSBzZXJpYWxpemVkIGZvcm0gb2YgdGhlIFVuaXZlcnNhbCBDaGFyYWN0ZXIgU2V0LiIsCisjZW5kaWYgLyogVU5JQ09ERSAqLworIiAgVHlwZSBTRVQgRklMRSBDSEFSID8gZm9yIGEgY29tcGxldGUgbGlzdCBvZiBmaWxlIGNoYXJhY3RlciBzZXRzLiIsCisiICIsCisiU0VUIEZJTEUgREVGQVVMVCA3QklULUNIQVJBQ1RFUi1TRVQiLAorIiAgV2hlbiBhdXRvbWF0aWNhbGx5IHN3aXRjaGluZyBhbW9uZyBkaWZmZXJlbnQga2luZHMgb2YgZmlsZXMgd2hpbGUgc2VuZGluZyIsCisiICB0aGlzIHRlbGxzIHRoZSBjaGFyYWN0ZXIgc2V0IHRvIGJlIHVzZWQgZm9yIDctYml0IHRleHQgZmlsZXMuIiwKKyIgIiwKKyJTRVQgRklMRSBERUZBVUxUIDhCSVQtQ0hBUkFDVEVSLVNFVCIsCisiICBUaGlzIHRlbGxzIHRoZSBjaGFyYWN0ZXIgc2V0IHRvIGJlIHVzZWQgZm9yIDgtYml0IHRleHQgZmlsZXMgd2hlbiIsCisiICBzd2l0Y2hpbmcgYXV0b21hdGljYWxseSBhbW9uZyBkaWZmZXJlbnQga2luZHMgb2YgZmlsZXMuIiwKKyIgIiwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyJTRVQgRklMRSBDT0xMSVNJT04gb3B0aW9uIiwKKyIgIFRlbGxzIHdoYXQgdG8gZG8gd2hlbiBhIGZpbGUgYXJyaXZlcyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIiwKKyIgIGFuIGV4aXN0aW5nIGZpbGUuICBUaGUgb3B0aW9ucyBhcmU6IiwKKyIgICBCQUNLVVAgKGRlZmF1bHQpIC0gUmVuYW1lIHRoZSBvbGQgZmlsZSB0byBhIG5ldywgdW5pcXVlIG5hbWUgYW5kIHN0b3JlIiwKKyIgICAgIHRoZSBpbmNvbWluZyBmaWxlIHVuZGVyIHRoZSBuYW1lIGl0IHdhcyBzZW50IHdpdGguIiwKKyIgICBPVkVSV1JJVEUgLSBPdmVyd3JpdGUgKHJlcGxhY2UpIHRoZSBleGlzdGluZyBmaWxlLiIsCisiICAgQVBQRU5EIC0gQXBwZW5kIHRoZSBpbmNvbWluZyBmaWxlIHRvIHRoZSBlbmQgb2YgdGhlIGV4aXN0aW5nIGZpbGUuIiwKKyIgICBESVNDQVJEIC0gUmVmdXNlIGFuZC9vciBkaXNjYXJkIHRoZSBpbmNvbWluZyBmaWxlLiIsCisiICAgUkVOQU1FIC0gR2l2ZSB0aGUgaW5jb21pbmcgZmlsZSBhIHVuaXF1ZSBuYW1lLiIsCisiICAgVVBEQVRFIC0gQWNjZXB0IHRoZSBpbmNvbWluZyBmaWxlIG9ubHkgaWYgbmV3ZXIgdGhhbiB0aGUgZXhpc3RpbmcgZmlsZS4iLAorIiAiLAorCisiU0VUIEZJTEUgREVTVElOQVRJT04geyBESVNLLCBQUklOVEVSLCBTQ1JFRU4sIE5PV0hFUkUgfSIsCisiICBESVNLIChkZWZhdWx0KTogU3RvcmUgaW5jb21pbmcgZmlsZXMgb24gZGlzay4iLAorIiAgUFJJTlRFUjogICAgICAgIFNlbmQgaW5jb21pbmcgZmlsZXMgdG8gU0VUIFBSSU5URVIgZGV2aWNlLiIsCisiICBTQ1JFRU46ICAgICAgICAgRGlzcGxheSBpbmNvbWluZyBmaWxlcyBvbiBzY3JlZW4gKGxvY2FsIG1vZGUgb25seSkuIiwKKyIgIE5PV0hFUkU6ICAgICAgICBEbyBub3QgcHV0IGluY29taW5nIGZpbGVzIGFueXdoZXJlICh1c2UgZm9yIGNhbGlicmF0aW9uKS4iLAorIiAiLAorIlNFVCBGSUxFIERJU1BMQVkgb3B0aW9uIiwKKyIgIFNlbGVjdHMgdGhlIGZvcm1hdCBvZiB0aGUgZmlsZSB0cmFuc2ZlciBkaXNwbGF5IGZvciBsb2NhbC1tb2RlIGZpbGUiLAorIiAgdHJhbnNmZXIuICBUaGUgY2hvaWNlcyBhcmU6IiwKKyIgIiwKKyIgIEJSSUVGICAgICAgQSBsaW5lIHBlciBmaWxlLCBzaG93aW5nIHNpemUsIG1vZGUsIHN0YXR1cywgYW5kIHRocm91Z2hwdXQuIiwKKyIgIFNFUklBTCAgICAgT25lIGRvdCBpcyBwcmludGVkIGZvciBldmVyeSBLIGJ5dGVzIHRyYW5zZmVycmVkLiIsCisiICBDUlQgICAgICAgIE51bWJlcnMgYXJlIGNvbnRpbnVvdXNseSB1cGRhdGVkIG9uIGEgc2luZ2xlIHNjcmVlbiBsaW5lLiIsCisiICAgICAgICAgICAgIFRoaXMgZm9ybWF0IGNhbiBiZSB1c2VkIG9uIGFueSB2aWRlbyBkaXNwbGF5IHRlcm1pbmFsLiIsCisjaWZkZWYgQ0tfQ1VSU0VTCisiICBGVUxMU0NSRUVOIEEgZnVsbHkgZm9ybWF0dGVkIDI0eDgwIHNjcmVlbiBzaG93aW5nIGxvdHMgb2YgaW5mb3JtYXRpb24uIiwKKyIgICAgICAgICAgICAgVGhpcyByZXF1aXJlcyBhIHRlcm1pbmFsIG9yIHRlcm1pbmFsIGVtdWxhdG9yLiIsCisjZW5kaWYgLyogQ0tfQ1VSU0VTICovCisiICBOT05FICAgICAgIE5vIGZpbGUgdHJhbnNmZXIgZGlzcGxheSBhdCBhbGwuIiwKKyIgIiwKKworIlNFVCBGSUxFIERPV05MT0FELURJUkVDVE9SWSBbIDxkaXJlY3RvcnktbmFtZT4gXSIsCisiICBUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggYWxsIHJlY2VpdmVkIGZpbGVzIHNob3VsZCBiZSBwbGFjZWQuICBCeSBkZWZhdWx0LCIsCisiICByZWNlaXZlZCBmaWxlcyBnbyBpbnRvIHlvdXIgY3VycmVudCBkaXJlY3RvcnkuIiwKKyIgIiwKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIENLX0NUUkxaCisiU0VUIEZJTEUgRU9GIHsgQ1RSTC1aLCBMRU5HVEggfSIsCisiICBFbmQtT2YtRmlsZSBkZXRlY3Rpb24gbWV0aG9kLCBub3JtYWxseSBMRU5HVEguICBBcHBsaWVzIG9ubHkgdG8gdGV4dC1tb2RlIiwKKyIgIHRyYW5zZmVycy4gIFdoZW4gc2V0IHRvIENUUkwtWiwgdGhpcyBtYWtlcyB0aGUgZmlsZSBzZW5kZXIgdHJlYXQgdGhlIGZpcnN0IiwKKyIgIEN0cmwtWiBpbiB0aGUgaW5wdXQgZmlsZSBhcyB0aGUgZW5kIG9mIGZpbGUgKEVPRiksIGFuZCBpdCBtYWtlcyB0aGUgZmlsZSIsCisiICByZWNlaXZlciB0YWNrIGEgQ3RybC1aIG9udG8gdGhlIGVuZCBvZiB0aGUgb3V0cHV0IGZpbGUgaWYgaXQgZG9lcyBub3QiLAorIiAgYWxyZWFkeSBlbmQgd2l0aCBDdHJsLVouIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19DVFJMWiAqLworCisiU0VUIEZJTEUgRU5ELU9GLUxJTkUgeyBDUiwgQ1JMRiwgTEYgfSIsCisiICBVc2UgdGhpcyBjb21tYW5kIHRvIHNwZWNpZnkgbm9uc3RhbmRhcmQgbGluZSB0ZXJtaW5hdG9ycyBmb3IgdGV4dCBmaWxlcy4iLAorIiAiLAorCisjaWZuZGVmIE5PWEZFUgorIlNFVCBGSUxFIElOQ09NUExFVEUgeyBBVVRPLCBLRUVQLCBESVNDQVJEIH0iLAorIiAgV2hhdCB0byBkbyB3aXRoIGFuIGluY29tcGxldGVseSByZWNlaXZlZCBmaWxlOiBLRUVQLCBESVNDQVJELCBvciBBVVRPLiIsCisiICBBVVRPICh0aGUgZGVmYXVsdCkgbWVhbnMgRElTQ0FSRCBpZiB0cmFuc2ZlciBpcyBpbiB0ZXh0IG1vZGUsIEtFRVAgaWYgaXQiLAorIiAgaXMgaW4gYmluYXJ5IG1vZGUuIiwKKyIgIiwKKyNpZmRlZiBWTVMKKyJTRVQgRklMRSBMQUJFTCB7IEFDTCwgQkFDS1VQLURBVEUsIE5BTUUsIE9XTkVSLCBQQVRIIH0geyBPTiwgT0ZGIH0iLAorIiAgVGVsbHMgd2hpY2ggaXRlbXMgdG8gaW5jbHVkZSAoT04pIG9yIGV4Y2x1ZGUgKE9GRikgaW4gbGFiZWxlZCBmaWxlIiwKKyIgIHRyYW5zZmVycyIsCisiICIsCisjZWxzZQorI2lmZGVmIE9TMgorIlNFVCBGSUxFIExBQkVMIHsgQVJDSElWRSwgUkVBRC1PTkxZLCBISURERU4sIFNZU1RFTSwgRVhURU5ERUQgfSB7IE9OLCBPRkYgfSIsCisiICBUZWxscyB3aGljaCBpdGVtcyB0byBpbmNsdWRlIChPTikgb3IgZXhjbHVkZSAoT0ZGKSBpbiBsYWJlbGVkIGZpbGUiLAorIiAgdHJhbnNmZXJzLiIsCisiICIsCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVk1TICovCisKKyNpZmRlZiBVTklYCisjaWZkZWYgRFlOQU1JQworIlNFVCBGSUxFIExJU1RTSVpFIG51bWJlciIsCisiICBDaGFuZ2VzIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCB3aWxkY2FyZCBleHBhbnNpb24gbGlzdC4gIFVzZSBTSE9XIEZJTEUiLAorIiAgdG8gc2VlIHRoZSBjdXJyZW50IHNpemUuICBVc2UgdGhpcyBjb21tYW5kIHRvIGluY3JlYXNlIHRoZSBzaXplIGlmIHlvdSBnZXQiLAorIiAgYSBcIj9Ub28gbWFueSBmaWxlc1wiIGVycm9yLiAgQWxzbyBzZWUgU0VUIEZJTEUgU1RSSU5HU1BBQ0UuIiwKKyIgIiwKKyNlbmRpZiAvKiBEWU5BTUlDICovCisjZW5kaWYgLyogVU5JWCAqLworCisiU0VUIEZJTEUgTkFNRVMgeyBDT05WRVJURUQsIExJVEVSQUwgfSIsCisiICBGaWxlIG5hbWVzIGFyZSBub3JtYWxseSBDT05WRVJURUQgdG8gXCJjb21tb24gZm9ybVwiIGR1cmluZyB0cmFuc21pc3Npb24iLAorIiAgKGUuZy4gbG93ZXJjYXNlIHRvIHVwcGVyY2FzZSwgZXh0cmEgcGVyaW9kcyBjaGFuZ2VkIHRvIHVuZGVyc2NvcmUsIGV0YykuIiwKKyIgIExJVEVSQUwgbWVhbnMgdXNlIGZpbGVuYW1lcyBsaXRlcmFsbHkgKHVzZWZ1bCBiZXR3ZWVuIGxpa2Ugc3lzdGVtcykuICBBbHNvIiwKKyIgIHNlZSBTRVQgU0VORCBQQVRITkFNRVMgYW5kIFNFVCBSRUNFSVZFIFBBVEhOQU1FUy4iLAorIiAiLAorCisjaWZkZWYgVU5JWAorIlNFVCBGSUxFIE9VVFBVVCB7IHsgQlVGRkVSRUQsIFVOQlVGRkVSRUQgfSBbIHNpemUgXSwgQkxPQ0tJTkcsIE5PTkJMT0NLSU5HIH0iLAorIiAgTGV0cyB5b3UgY29udHJvbCB0aGUgZGlzayBvdXRwdXQgYnVmZmVyIGZvciBpbmNvbWluZyBmaWxlcy4gIEJ1ZmZlcmVkIiwKKyIgIGJsb2NraW5nIHdyaXRlcyBhcmUgbm9ybWFsLiAgTm9uYmxvY2tpbmcgd3JpdGVzIG1pZ2h0IGJlIGZhc3RlciBvbiBzb21lIiwKKyIgIHN5c3RlbXMgYnV0IG1pZ2h0IGFsc28gYmUgcmlza3ksIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBmaWxlIHNlcnZpY2UuIiwKKyIgIFVuYnVmZmVyZWQgd3JpdGVzIG1pZ2h0IGJlIHVzZWZ1bCBpbiBjcml0aWNhbCBhcHBsaWNhdGlvbnMgdG8gZW5zdXJlIHRoYXQiLAorIiAgY2FjaGVkIGRpc2sgd3JpdGVzIGFyZSBub3QgbG9zdCBpbiBhIGNyYXNoLCBidXQgd2lsbCBwcm9iYWJseSBhbHNvIGJlIiwKKyIgIHNsb3dlci4gIFRoZSBvcHRpb25hbCBzaXplIHBhcmFtZXRlciBhZnRlciBCVUZGRVJFRCBvciBVTkJVRkZFUkVEIGxldHMgeW91IiwKKyIgIGNoYW5nZSB0aGUgZGlzayBvdXRwdXQgYnVmZmVyIHNpemU7IHRoaXMgbWlnaHQgbWFrZSBhIGRpZmZlcmVuY2UgaW4iLAorIiAgcGVyZm9ybWFuY2UuIiwKKyIgIiwKKyNlbmRpZiAvKiBVTklYICovCisKKyNpZmRlZiBQQVRURVJOUworIlNFVCBGSUxFIFBBVFRFUk5TIHsgT04sIE9GRiwgQVVUTyB9IiwKKyIgIE9OIG1lYW5zIHRvIHVzZSBmaWxlbmFtZSBwYXR0ZXJuIGxpc3RzIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNlbmQgYSBmaWxlIiwKKyIgIGluIHRleHQgb3IgYmluYXJ5IG1vZGUuICBPRkYgbWVhbnMgdG8gc2VuZCBhbGwgZmlsZXMgaW4gdGhlIHByZXZhaWxpbmciLAorIiAgbW9kZS4gIEFVVE8gKHRoZSBkZWZhdWx0KSBpcyBsaWtlIE9OIGlmIHRoZSBvdGhlciBLZXJtaXQgYWNjZXB0cyBBdHRyaWJ1dGUiLAorIiAgcGFja2V0cyBhbmQgbGlrZSBPRkYgb3RoZXJ3aXNlLiAgRklMRSBQQVRURVJOUyBhcmUgdXNlZCBvbmx5IGlmIEZJTEUgU0NBTiIsCisiICBpcyBPRkYgKHNlZSBTRVQgRklMRSBTQ0FOKS4iLAorIiAiLAorIlNFVCBGSUxFIEJJTkFSWS1QQVRURVJOUyBbIDxwYXR0ZXJuPiBbIDxwYXR0ZXJuPiAuLi4gXSBdIiwKKyIgIFplcm8gb3IgbW9yZSBmaWxlbmFtZSBwYXR0ZXJucyB3aGljaCwgaWYgbWF0Y2hlZCwgY2F1c2UgYSBmaWxlIHRvIGJlIHNlbnQiLAorIiAgaW4gYmluYXJ5IG1vZGUgd2hlbiBGSUxFIFBBVFRFUk5TIGFyZSBPTi4gIEhFTFAgV0lMRENBUkRTIGZvciBhIGRlc2NyaXB0aW9uIgorLAorIiAgb2YgcGF0dGVybiBzeW50YXguICBTSE9XIFBBVFRFUk5TIHRvIHNlZSB0aGUgY3VycmVudCBmaWxlIHBhdHRlcm4gbGlzdHMuIiwKKyIgIiwKKyJTRVQgRklMRSBURVhULVBBVFRFUk5TIFsgPHBhdHRlcm4+IFsgPHBhdHRlcm4+IC4uLiBdIF0iLAorIiAgWmVybyBvciBtb3JlIGZpbGVuYW1lIHBhdHRlcm5zIHdoaWNoLCBpZiBtYXRjaGVkLCBjYXVzZSBhIGZpbGUgdG8gYmUgc2VudCIsCisiICBpbiB0ZXh0IG1vZGUgd2hlbiBGSUxFIFBBVFRFUk5TIGlzIE9OOyBpZiBhIGZpbGUgZG9lcyBub3QgbWF0Y2ggYSB0ZXh0IG9yIiwKKyIgIGJpbmFyeSBwYXR0ZXJuLCB0aGUgcHJldmFpbGluZyBTRVQgRklMRSBUWVBFIGlzIHVzZWQuIiwKKyIgIiwKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworCisjaWZkZWYgVk1TCisiU0VUIEZJTEUgUkVDT1JELUxFTkdUSCBudW1iZXIiLAorIiAgU2V0cyB0aGUgcmVjb3JkIGxlbmd0aCBmb3IgcmVjZWl2ZWQgZmlsZXMgb2YgdHlwZSBCSU5BUlkuICBVc2UgdGhpcyB0byIsCisiICByZWNlaXZlIFZNUyBCQUNLVVAgc2F2ZXNldHMgb3Igb3RoZXIgZml4ZWQtZm9ybWF0IGZpbGVzIHRoYXQgZG8gbm90IHVzZSIsCisiICB0aGUgZGVmYXVsdCByZWNvcmQgbGVuZ3RoIG9mIDUxMi4iLAorIiAiLAorI2VuZGlmIC8qIFZNUyAqLworCisiU0VUIEZJTEUgU0NBTiB7IE9OIFsgc2l6ZSBdLCBPRkYgfSIsCisiICBJZiBUUkFOU0ZFUiBNT0RFIGlzIEFVVE9NQVRJQyBhbmQgRklMRSBTQ0FOIGlzIE9OIChhcyBpdCBpcyBieSBkZWZhdWx0KSIsCisiICBLZXJtaXQgcGVla3MgYXQgdGhlIGZpbGUncyBjb250ZW50cyB0byBzZWUgaWYgaXQncyB0ZXh0IG9yIGJpbmFyeS4gIFVzZSIsCisiICBTRVQgRklMRSBTQ0FOIE9GRiB0byBkaXNhYmxlIGZpbGUgcGVla2luZywgd2hpbGUgc3RpbGwga2VlcGluZyBUUkFOU0ZFUiIsCisiICBNT0RFIGF1dG9tYXRpYyB0byBhbGxvdyBuYW1lIHBhdHRlcm5zIGFuZCBvdGhlciBtZXRob2RzLiAgVGhlIG9wdGlvbmFsIiwKKyIgIHNpemUgaXMgdGhlIG51bWJlciBvZiBmaWxlIGJ5dGVzIHRvIHNjYW4sIDQ5MTUyIGJ5IGRlZmF1bHQuICAtMSBtZWFucyB0byIsCisiICBzY2FuIHRoZSB3aG9sZSBmaWxlLiAgQWxzbyBzZWUgU0VUIEZJTEUgUEFUVEVSTlMuIiwKKyIgIiwKKworI2lmZGVmIFVOSVgKKyNpZmRlZiBEWU5BTUlDCisiU0VUIEZJTEUgU1RSSU5HU1BBQ0UgbnVtYmVyIiwKKyIgIENoYW5nZXMgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyIHRoYXQgaG9sZHMgbGlzdHMgb2YiLAorIiAgZmlsZW5hbWVzIHN1Y2ggYXMgd2lsZGNhcmQgZXhwYW5zaW9uIGxpc3RzLiAgVXNlIFNIT1cgRklMRSB0byBzZWUgdGhlIiwKKyIgIGN1cnJlbnQgc2l6ZS4gIFVzZSB0aGlzIGNvbW1hbmQgdG8gaW5jcmVhc2UgdGhlIHNpemUgaWYgeW91IGdldCBhIiwKKyIgIFwiP1N0cmluZyBzcGFjZSBleGhhdXN0ZWRcIiBlcnJvci4gIEFsc28gc2VlIFNFVCBGSUxFIExJU1RTSVpFLiIsCisiICIsCisjZW5kaWYgLyogRFlOQU1JQyAqLworI2VuZGlmIC8qIFVOSVggKi8KKworI2lmZGVmIFVOSUNPREUKKyJTRVQgRklMRSBVQ1MgQk9NIHsgT04sIE9GRiB9IiwKKyIgIFdoZXRoZXIgdG8gd3JpdGUgYSBCeXRlIE9yZGVyIE1hcmsgd2hlbiBjcmVhdGluZyBhIFVDUy0yIGZpbGUuIiwKKyIgIiwKKyJTRVQgRklMRSBVQ1MgQllURS1PUkRFUiB7IEJJRy1FTkRJQU4sIExJVFRMRS1FTkRJQU4gfSIsCisiICBCeXRlIG9yZGVyIHRvIHVzZSB3aGVuIGNyZWF0aW5nIFVDUy0yIGZpbGVzLCBhbmQgdG8gdXNlIHdoZW4gcmVhZGluZyBVQ1MtMiIsCisiICBmaWxlcyB0aGF0IGRvIG5vdCBzdGFydCB3aXRoIGEgQnl0ZSBPcmRlciBNYXJrLiIsCisiICIsCisjZW5kaWYgLyogVU5JQ09ERSAqLworCisiU0VUIEZJTEUgV0FSTklORyB7IE9OLCBPRkYgfSIsCisiICBTRVQgRklMRSBXQVJOSU5HIGlzIHN1cGVyc2VkZWQgYnkgdGhlIG5ld2VyIGNvbW1hbmQsIFNFVCBGSUxFIiwKKyIgIENPTExJU0lPTi4gIFNFVCBGSUxFIFdBUk5JTkcgT04gaXMgZXF1aXZhbGVudCB0byBTRVQgRklMRSBDT0xMSVNJT04gUkVOQU1FIiwKKyIgIGFuZCBTRVQgRklMRSBXQVJOSU5HIE9GRiBpcyBlcXVpdmFsZW50IHRvIFNFVCBGSUxFIENPTExJU0lPTiBPVkVSV1JJVEUuIiwKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyIiIH07CisKK3N0YXRpYyBjaGFyICpobXh5aHNoW10gPSB7CisiU3ludGF4OiBTRVQgSEFORFNIQUtFIHsgTk9ORSwgWE9OLCBMRiwgQkVMTCwgRVNDLCBDT0RFIG51bWJlciB9IiwKKyIgIENoYXJhY3RlciB0byB1c2UgZm9yIGhhbGYgZHVwbGV4IGxpbmUgdHVybmFyb3VuZCBoYW5kc2hha2UgZHVyaW5nIGZpbGUiLAorIiAgdHJhbnNmZXIuICBDLUtlcm1pdCB3YWl0cyBmb3IgdGhpcyBjaGFyYWN0ZXIgZnJvbSB0aGUgb3RoZXIgY29tcHV0ZXIiLAorIiAgYmVmb3JlIHNlbmRpbmcgaXRzIG5leHQgcGFja2V0LiAgRGVmYXVsdCBpcyBOT05FOyB5b3UgY2FuIGdpdmUgb25lIG9mIHRoZSIsCisiICBvdGhlciBuYW1lcyBsaWtlIEJFTEwgb3IgRVNDLCBvciB1c2UgU0VUIEhBTkRTSEFLRSBDT0RFIHRvIHNwZWNpZnkgdGhlIiwKKyIgIG51bWVyaWMgY29kZSB2YWx1ZSBvZiB0aGUgaGFuZHNoYWtlIGNoYXJhY3Rlci4gIFR5cGUgU0VUIEhBTkRTSCA/IGZvciBhIiwKKyIgIGNvbXBsZXRlIGxpc3Qgb2YgcG9zc2liaWxpdGllcy4iLAorIiIgfTsKKworI2lmbmRlZiBOT1NFUlZFUgorc3RhdGljIGNoYXIgKmhzZXRzcnZbXSA9IHsKKyJTRVQgU0VSVkVSIENELU1FU1NBR0Uge09OLE9GRn0iLAorIiAgVGVsbHMgd2hldGhlciB0aGUgc2VydmVyLCBhZnRlciBzdWNjZXNzZnVsbHkgZXhlY3V0aW5nIGEgUkVNT1RFIENEIiwKKyIgIGNvbW1hbmQsIHNob3VsZCBzZW5kIHRoZSBjb250ZW50cyBvZiB0aGUgbmV3IGRpcmVjdG9yeSdzIFJFQUQuTUUiLAorIiAgKG9yIHNpbWlsYXIpIGZpbGUgdG8geW91ciBzY3JlZW4uIiwKKyIgIiwKKyJTRVQgU0VSVkVSIENELU1FU1NBR0UgRklMRSBuYW1lIiwKKyIgIFRlbGxzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGRpc3BsYXllZCBhcyBhIENELU1FU1NBR0UsIHN1Y2ggYXMiLAorIiAgUkVBRC5NRSAoU0hPVyBTRVJWRVIgdGVsbHMgdGhlIGN1cnJlbnQgQ0QtTUVTU0FHRSBGSUxFIG5hbWUpLiIsCisiICBUbyBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgZmlsZW5hbWUgdG8gbG9vayBmb3IsIHVzZSB7e25hbWUxfXtuYW1lMn0uLn0uIiwKKyIgIFN5bm9ueW06IFNFVCBDRCBNRVNTQUdFIEZJTEUgPGxpc3Q+LiIsCisiICIsCisiU0VUIFNFUlZFUiBESVNQTEFZIHtPTixPRkZ9IiwKKyIgIFRlbGxzIHdoZXRoZXIgbG9jYWwtbW9kZSBDLUtlcm1pdCBkdXJpbmcgc2VydmVyIG9wZXJhdGlvbiBzaG91bGQgcHV0IGEiLAorIiAgZmlsZSB0cmFuc2ZlciBkaXNwbGF5IG9uIHRoZSBzY3JlZW4uICBEZWZhdWx0IGlzIE9GRi4iLAorIiAiLAorIlNFVCBTRVJWRVIgR0VULVBBVEggWyBkaXJlY3RvcnkgWyBkaXJlY3RvcnkgWyAuLi4gXSBdIF0iLAorIiAgVGVsbHMgdGhlIEMtS2VybWl0IHNlcnZlciB3aGVyZSB0byBsb29rIGZvciBmaWxlcyB3aG9zZSBuYW1lcyBpdCByZWNlaXZlcyIsCisiICBmcm9tIGNsaWVudCBHRVQgY29tbWFuZHMgd2hlbiB0aGUgbmFtZXMgYXJlIG5vdCBmdWxseSBzcGVjaWZpZWQgcGF0aG5hbWVzLiIsCisiICBEZWZhdWx0IGlzIG5vIEdFVC1QQVRILCBzbyBDLUtlcm1pdCBsb29rcyBvbmx5IGluIGl0cyBjdXJyZW50IGRpcmVjdG9yeS4iLAorIiAiLAorIlNFVCBTRVJWRVIgSURMRS1USU1FT1VUIHNlY29uZHMiLAorIiAgSWRsZSB0aW1lIGxpbWl0IHdoaWxlIGluIHNlcnZlciBtb2RlLCAwIGZvciBubyBsaW1pdC4iLAorI2lmbmRlZiBPUzIKKyIgIE5PVEU6IFNFUlZFUiBJRExFLVRJTUVPVVQgYW5kIFNFUlZFUiBUSU1FT1VUIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyIgIiwKKyJTRVQgU0VSVkVSIEtFRVBBTElWRSB7T04sT0ZGfSIsCisiICBUZWxscyB3aGV0aGVyIEMtS2VybWl0IHNob3VsZCBzZW5kIFwia2VlcGFsaXZlXCIgcGFja2V0cyB3aGlsZSBleGVjdXRpbmciLAorIiAgUkVNT1RFIEhPU1QgY29tbWFuZHMsIHdoaWNoIGlzIHVzZWZ1bCBpbiBjYXNlIHRoZSBjb21tYW5kIHRha2VzIGEgbG9uZyIsCisiICB0aW1lIHRvIHByb2R1Y2UgYW55IG91dHB1dCBhbmQgdGhlcmVmb3JlIG1pZ2h0IGNhdXNlIHRoZSBvcGVyYXRpb24gdG8gdGltZSIsCisiICBvdXQuICBPTiBieSBkZWZhdWx0OyB0dXJuIGl0IE9GRiBpZiBpdCBjYXVzZXMgdHJvdWJsZSB3aXRoIHRoZSBjbGllbnQgb3IiLAorIiAgc2xvd3MgZG93biB0aGUgc2VydmVyIHRvbyBtdWNoLiIsCisiICIsCisiU0VUIFNFUlZFUiBMT0dJTiBbIHVzZXJuYW1lIFsgcGFzc3dvcmQgWyBhY2NvdW50IF0gXSBdIiwKKyIgIFNldHMgdXAgYSB1c2VybmFtZSBhbmQgb3B0aW9uYWwgcGFzc3dvcmQgd2hpY2ggbXVzdCBiZSBzdXBwbGllZCBiZWZvcmUiLAorIiAgdGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgdG8gYW55IGNvbW1hbmRzIG90aGVyIHRoYW4gUkVNT1RFIExPR0lOLiAgVGhlIiwKKyIgIGFjY291bnQgaXMgaWdub3JlZC4gIElmIHlvdSBlbnRlciBTRVQgU0VSVkVSIExPR0lOIGJ5IGl0c2VsZiwgdGhlbiBsb2dpbiIsCisiICBpcyBubyBsb25nZXIgcmVxdWlyZWQuICBPbmx5IG9uZSBTRVQgU0VSVkVSIExPR0lOIGNvbW1hbmQgY2FuIGJlIGluIGVmZmVjdCIsCisiICBhdCBhIHRpbWU7IEMtS2VybWl0IGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgdXNlci9wYXNzd29yZCBwYWlycy4iLAorIiAiLAorIlNFVCBTRVJWRVIgVElNRU9VVCBuIiwKKyIgIFNlcnZlciBjb21tYW5kIHdhaXQgdGltZW91dCBpbnRlcnZhbCwgaG93IG9mdGVuIHRoZSBDLUtlcm1pdCBzZXJ2ZXIgaXNzdWVzIiwKKyIgIGEgTkFLIHdoaWxlIHdhaXRpbmcgZm9yIGEgY29tbWFuZCBwYWNrZXQuICBTcGVjaWZ5IDAgZm9yIG5vIE5BS3MgYXQgYWxsLiIsCisiICBEZWZhdWx0IGlzIDAuIiwKKyIiCit9OworI2VuZGlmIC8qIE5PU0VSVkVSICovCisKK3N0YXRpYyBjaGFyICpobWhybXRbXSA9IHsKKyNpZmRlZiBORVdGVFAKKyJUaGUgUkVNT1RFIGNvbW1hbmQgc2VuZHMgZmlsZSBtYW5hZ2VtZW50IGluc3RydWN0aW9ucyBvciBvdGhlciBjb21tYW5kcyIsCisidG8gYSBLZXJtaXQgb3IgRlRQIHNlcnZlci4gIElmIHlvdSBoYXZlIGEgc2luZ2xlIGNvbm5lY3Rpb24sIHRoZSBjb21tYW5kIGlzIiwKKyJkaXJlY3RlZCB0byB0aGUgc2VydmVyIHlvdSBhcmUgY29ubmVjdGVkIHRvOyBpZiB5b3UgaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucyIKKywKKyJ0aGUgY29tbWFuZCBpcyBkaXJlY3RlZCBhY2NvcmRpbmcgdG8geW91ciBHRVQtUFVULVJFTU9URSBzZXR0aW5nLiIsCisjZWxzZQorIlRoZSBSRU1PVEUgY29tbWFuZCBzZW5kcyBmaWxlIG1hbmFnZW1lbnQgaW5zdHJ1Y3Rpb25zIG9yIG90aGVyIGNvbW1hbmRzIiwKKyJ0byBhIEtlcm1pdCBzZXJ2ZXIuICBUaGVyZSBzaG91bGQgYWxyZWFkeSBiZSBhIEtlcm1pdCBydW5uaW5nIGluIHNlcnZlciIsCisibW9kZSBvbiB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uLiIsCisjZW5kaWYgLyogTkVXRlRQICovCisiVHlwZSBSRU1PVEUgPyB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSByZW1vdGUgY29tbWFuZHMuICBUeXBlIEhFTFAgUkVNT1RFIiwKKyJ4eHggdG8gZ2V0IGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIHJlbW90ZSBjb21tYW5kIHh4eC4iLAorIiAiLAorIkFsbCBSRU1PVEUgY29tbWFuZHMgZXhjZXB0IExPR0lOIGFuZCBMT0dPVVQgaGF2ZSBSLWNvbW1hbmQgc2hvcnRjdXRzOyIsCisiZm9yIGV4YW1wbGUsIFJESVIgZm9yIFJFTU9URSBESVIsIFJDRCBmb3IgUkVNT1RFIENELCBldGMuIiwKKyIgIiwKKyNpZmRlZiBORVdGVFAKKyNpZmRlZiBMT0NVUworIkFsc28gc2VlOiBIRUxQIFNFVCBMT0NVUywgSEVMUCBGVFAsIEhFTFAgU0VUIEdFVC1QVVQtUkVNT1RFLiIsCisjZWxzZQorIkFsc28gc2VlOiBIRUxQIEZUUCwgSEVMUCBTRVQgR0VULVBVVC1SRU1PVEUuIiwKKyNlbmRpZiAvKiBMT0NVUyAqLworI2Vsc2UKKyNpZmRlZiBMT0NVUworIkFsc28gc2VlOiBIRUxQIFNFVCBMT0NVUy4iLAorI2VuZGlmIC8qIExPQ1VTICovCisjZW5kaWYgLyogTkVXRlRQICovCisiIiB9OworCisjaWZuZGVmIE5PU1BMCitzdGF0aWMgY2hhciAqaWZobHBbXSA9IHsgIlN5bnRheDogSUYgW05PVF0gY29uZGl0aW9uIGNvbW1hbmRsaXN0IiwKKyIgIiwKKyJJZiB0aGUgY29uZGl0aW9uIGlzIChpcyBub3QpIHRydWUsIGRvIHRoZSBjb21tYW5kbGlzdC4gIFRoZSBjb21tYW5kbGlzdCIsCisiY2FuIGJlIGEgc2luZ2xlIGNvbW1hbmQsIG9yIGEgbGlzdCBvZiBjb21tYW5kcyBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCIsCisiZW5jbG9zZWQgaW4gYnJhY2VzLiAgVGhlIGNvbmRpdGlvbiBjYW4gYmUgYSBzaW5nbGUgY29uZGl0aW9uIG9yIGEgZ3JvdXAgb2YiLAorImNvbmRpdGlvbnMgc2VwYXJhdGVkIGJ5IEFORCAoJiYpIG9yIE9SICh8fCkgYW5kIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLiIsCisiSWYgcGFyZW50aGVzZXMgYXJlIHVzZWQgdGhleSBtdXN0IGJlIHN1cnJvdW5kZWQgYnkgc3BhY2VzLiAgRXhhbXBsZXM6IiwKKyIgIiwKKyIgIElGIEVYSVNUIG9vZmEudHh0IDxjb21tYW5kPiIsCisiICBJRiAoIEVYSVNUIG9vZmEudHh0IHx8ID0gXFx2KG5kYXkpIDMgKSA8Y29tbWFuZD4iLAorIiAgSUYgKCBFWElTVCBvb2ZhLnR4dCB8fCA9IFxcdihuZGF5KSAzICkgeyA8Y29tbWFuZD4sIDxjb21tYW5kPiwgLi4uIH0iLAorIiAiLAorIlRoZSBjb25kaXRpb25zIGFyZToiLAorIiAiLAorIiAgU1VDQ0VTUyAgICAgLSBUaGUgcHJldmlvdXMgY29tbWFuZCBzdWNjZWVkZWQiLAorIiAgT0sgICAgICAgICAgLSBTeW5vbnltIGZvciBTVUNDRVNTIiwKKyIgIEZBSUxVUkUgICAgIC0gVGhlIHByZXZpb3VzIGNvbW1hbmQgZmFpbGVkIiwKKyIgIEVSUk9SICAgICAgIC0gU3lub255bSBmb3IgRkFJTFVSRSIsCisiICBGTEFHICAgICAgICAtIFN1Y2NlZWRzIGlmIFNFVCBGTEFHIE9OLCBmYWlscyBpZiBTRVQgRkxBRyBPRkYiLAorIiAgQkFDS0dST1VORCAgLSBDLUtlcm1pdCBpcyBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kIiwKKyNpZmRlZiBDS19JRlJPCisiICBGT1JFR1JPVU5EICAtIEMtS2VybWl0IGlzIHJ1bm5pbmcgaW4gdGhlIGZvcmVncm91bmQiLAorIiAgUkVNT1RFLU9OTFkgLSBDLUtlcm1pdCB3YXMgc3RhcnRlZCB3aXRoIHRoZSAtUiBjb21tYW5kLWxpbmUgb3B0aW9uIiwKKyNlbHNlCisiICBGT1JFR1JPVU5EICAtIEMtS2VybWl0IGlzIHJ1bm5pbmcgaW4gdGhlIGZvcmVncm91bmQiLAorI2VuZGlmIC8qIENLX0lGUk8gKi8KKyIgIEtFUkJBTkcgICAgIC0gQSBLZXJiYW5nIHNjcmlwdCBpcyBydW5uaW5nIiwKKyIgIEFMQVJNICAgICAgIC0gU0VUIEFMQVJNIHRpbWUgaGFzIHBhc3NlZCIsCisiICBBU0tUSU1FT1VUICAtIFRoZSBtb3N0IHJlY2VudCBBU0ssIEFTS1EsIEdFVEMsIG9yIEdFVE9LIHRpbWVkIG91dCIsCisiICBFTVVMQVRJT04gICAtIFN1Y2NlZWRzIGlmIGV4ZWN1dGVkIHdoaWxlIGluIENPTk5FQ1QgbW9kZSIsCisjaWZkZWYgT1MyCisiICBUQVBJICAgICAgICAtIEN1cnJlbnQgY29ubmVjdGlvbiBpcyB2aWEgYSBNaWNyb3NvZnQgVEFQSSBkZXZpY2UiLAorI2VuZGlmIC8qIE9TMiAqLworIiAiLAorIiAgTVMtS0VSTUlUICAgLSBQcm9ncmFtIGlzIE1TLURPUyBLZXJtaXQiLAorIiAgQy1LRVJNSVQgICAgLSBQcm9ncmFtIGlzIEMtS2VybWl0IiwKKyIgIEstOTUgICAgICAgIC0gUHJvZ3JhbSBpcyBLZXJtaXQgOTUiLAorIiAgR1VJICAgICAgICAgLSBQcm9ncmFtIHJ1bnMgaW4gYSBHVUkgd2luZG93IiwKKyIgIiwKKyIgIEFWQUlMQUJMRSBDUllQVE8gICAgICAgICAgICAgICAgICAtIEVuY3J5cHRpb24gaXMgYXZhaWxhYmxlIiwKKyIgIEFWQUlMQUJMRSBLRVJCRVJPUzQgICAgICAgICAgICAgICAtIEtlcmJlcm9zIDQgYXV0aGVudGljYXRpb24gaXMgYXZhaWxhYmxlIiwKKyIgIEFWQUlMQUJMRSBLRVJCRVJPUzUgICAgICAgICAgICAgICAtIEtlcmJlcm9zIDUgYXV0aGVudGljYXRpb24gaXMgYXZhaWxhYmxlIiwKKyIgIEFWQUlMQUJMRSBOVExNICAgICAgICAgICAgICAgICAgICAtIE5UTE0gYXV0aGVudGljYXRpb24gaXMgYXZhaWxhYmxlIiwKKyIgIEFWQUlMQUJMRSBTUlAgICAgICAgICAgICAgICAgICAgICAtIFNSUCBhdXRoZW50aWNhdGlvbiBpcyBhdmFpbGFibGUiLAorIiAgQVZBSUxBQkxFIFNTTCAgICAgICAgICAgICAgICAgICAgIC0gU1NML1RMUyBhdXRoZW50aWNhdGlvbiBpcyBhdmFpbGFibGUiLAorIiAgTUFUQ0ggc3RyaW5nIHBhdHRlcm4gICAgICAgICAgICAgIC0gU3VjY2VlZHMgaWYgc3RyaW5nIG1hdGNoZXMgcGF0dGVybiIsCisjaWZkZWYgQ0tGTE9BVAorIiAgRkxPQVQgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgIC0gU3VjY2VlZHMgaWYgZmxvYXRpbmctcG9pbnQgbnVtYmVyIiwKKyNlbmRpZiAvKiBDS0ZMT0FUICovCisiICBDT01NQU5EIHdvcmQgICAgICAgICAgICAgICAgICAgICAgLSBTdWNjZWVkcyBpZiB3b3JkIGlzIGJ1aWx0LWluIGNvbW1hbmQiLAorIiAgREVGSU5FRCB2YXJpYWJsZW5hbWUgb3IgbWFjcm9uYW1lIC0gVGhlIG5hbWVkIHZhcmlhYmxlIG9yIG1hY3JvIGlzIGRlZmluZWQiLAorIiAgREVDTEFSRUQgYXJyYXluYW1lICAgICAgICAgICAgICAgIC0gVGhlIG5hbWVkIGFycmF5IGlzIGRlY2xhcmVkIiwKKyIgIE5VTUVSSUMgdmFyaWFibGUgb3IgY29uc3RhbnQgICAgICAtIFRoZSB2YXJpYWJsZSBvciBjb25zdGFudCBpcyBudW1lcmljIiwKKyIgIEVYSVNUIGZpbGVuYW1lICAgICAgICAgICAgICAgICAgICAtIFRoZSBuYW1lZCBmaWxlIGV4aXN0cyIsCisiICBBQlNPTFVURSBmaWxlbmFtZSAgICAgICAgICAgICAgICAgLSBUaGUgZmlsZW5hbWUgaXMgYWJzb2x1dGUsIG5vdCByZWxhdGl2ZSIsCisjaWZkZWYgQ0tfVE1QRElSCisiICBESVJFQ1RPUlkgc3RyaW5nICAgICAgICAgICAgICAgICAgLSBUaGUgc3RyaW5nIGlzIHRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5IiwKKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKyIgIFJFQURBQkxFIGZpbGVuYW1lICAgICAgICAgICAgICAgICAtIFN1Y2NlZWRzIGlmIHRoZSBmaWxlIGlzIHJlYWRhYmxlIiwKKyIgIFdSSVRFQUJMRSBmaWxlbmFtZSAgICAgICAgICAgICAgICAtIFN1Y2NlZWRzIGlmIHRoZSBmaWxlIGlzIHdyaXRlYWJsZSIsCisjaWZkZWYgWkZDREFUCisiICBORVdFUiBmaWxlMSBmaWxlMiAgICAgICAgICAgICAgICAgLSBUaGUgMXN0IGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgMm5kIG9uZSIsCisjZW5kaWYgLyogWkZDREFUICovCisiICBPUEVOIHsgUkVBRC1GSUxFLFNFU1NJT04tTE9HLC4uLn0gLSBUaGUgZ2l2ZW4gZmlsZSBvciBsb2cgaXMgb3BlbiIsCisjaWZuZGVmIE5PTE9DQUwKKyIgIE9QRU4gQ09OTkVDVElPTiAgICAgICAgICAgICAgICAgICAtIEEgY29ubmVjdGlvbiBpcyBvcGVuIiwKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisiICBLQkhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBIGtleSBoYXMgYmVlbiBwcmVzc2VkIiwKKyIgIiwKKyIgIFZFUlNJT04gLSBlcXVpdmFsZW50IHRvIFwiaWYgPj0gXFx2KHZlcnNpb24pIC4uLlwiIiwKKyIgIENPVU5UICAgLSBzdWJ0cmFjdCBvbmUgZnJvbSBDT1VOVCwgZXhlY3V0ZSB0aGUgY29tbWFuZCBpZiB0aGUgcmVzdWx0IGlzIiwKKyIgICAgICAgICAgICBncmVhdGVyIHRoYW4gemVybyAoc2VlIFNFVCBDT1VOVCkiLAorIiAiLAorIiAgRVFVQUwgczEgczIgLSBzMSBhbmQgczIgKGNoYXJhY3RlciBzdHJpbmdzIG9yIHZhcmlhYmxlcykgYXJlIGVxdWFsIiwKKyIgIExMVCBzMSBzMiAgIC0gczEgaXMgbGV4aWNhbGx5IChhbHBoYWJldGljYWxseSkgbGVzcyB0aGFuIHMyIiwKKyIgIExHVCBzMSBzMSAgIC0gczEgaXMgbGV4aWNhbGx5IChhbHBoYWJldGljYWxseSkgZ3JlYXRlciB0aGFuIHMyIiwKKyIgIiwKKyIgID0gIG4xIG4yIC0gbjEgYW5kIG4yIChudW1iZXJzIG9yIHZhcmlhYmxlcyBjb250YWluaW5nIG51bWJlcnMpIGFyZSBlcXVhbCIsCisiICA8ICBuMSBuMiAtIG4xIGlzIGFyaXRobWV0aWNhbGx5IGxlc3MgdGhhbiBuMiIsCisiICA8PSBuMSBuMiAtIG4xIGlzIGFyaXRobWV0aWNhbGx5IGxlc3MgdGhhbiBvciBlcXVhbCB0byBuMiIsCisiICA+ICBuMSBuMiAtIG4xIGlzIGFyaXRobWV0aWNhbGx5IGdyZWF0ZXIgdGhhbiBuMiIsCisiICA+PSBuMSBuMiAtIG4xIGlzIGFyaXRobWV0aWNhbGx5IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBuMiIsCisiICIsCisiICAobnVtYmVyIGJ5IGl0c2VsZikgLSBmYWlscyBpZiB0aGUgbnVtYmVyIGlzIDAsIHN1Y2NlZWRzIG90aGVyd2lzZSIsCisiICIsCisiICBUUlVFICAgICAtIGFsd2F5cyBzdWNjZWVkcyIsCisiICBGQUxTRSAgICAtIGFsd2F5cyBmYWlscyIsCisiICIsCisiVGhlIElGIGNvbW1hbmQgbWF5IGJlIGZvbGxvd2VkIG9uIHRoZSBuZXh0IGxpbmUgYnkgYW4gRUxTRSBjb21tYW5kLiBFeGFtcGxlOiIsCisiICIsCisiICBJRiA8IFxcJXggMTAgRUNITyBJdCdzIGxlc3MiLAorIiAgRUxTRSBlY2hvIEl0J3Mgbm90IGxlc3MiLAorIiAiLAorIkl0IGNhbiBhbHNvIGluY2x1ZGUgYW4gRUxTRSBwYXJ0IG9uIHRoZSBzYW1lIGxpbmUgaWYgYnJhY2VzIGFyZSB1c2VkOiIsCisiICIsCisiICBJRiA8IFxcJXggMTAgeyBFQ0hPIEl0J3MgbGVzcyB9IEVMU0UgeyBFQ0hPIEl0J3Mgbm90IGxlc3MgfSIsCisiICIsCisiQWxzbyBzZWUgSEVMUCBXSUxEQ0FSRCAoZm9yIElGIE1BVENIIHBhdHRlcm4gc3ludGF4KS4iLAorIiIgfTsKKworc3RhdGljIGNoYXIgKmhteHhldmFsW10gPSB7ICJTeW50YXg6IEVWQUxVQVRFIHZhcmlhYmxlIGV4cHJlc3Npb24iLAorIiAgRXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGFuZCBhc3NpZ25zIGl0cyB2YWx1ZSB0byB0aGUgZ2l2ZW4gdmFyaWFibGUuIiwKKyIgIFRoZSBleHByZXNzaW9uIGNhbiBjb250YWluIG51bWJlcnMgYW5kL29yIG51bWVyaWMtdmFsdWVkIHZhcmlhYmxlcyBvciIsCisiICBmdW5jdGlvbnMsIGNvbWJpbmVkIHdpdGggbWF0aGVtYXRpY2FsIG9wZXJhdG9ycyBhbmQgcGFyZW50aGVzZXMgaW4iLAorIiAgdHJhZGl0aW9uYWwgbm90YXRpb24uICBPcGVyYXRvcnMgaW5jbHVkZSArLS8qKCksIGV0Yy4gIEV4YW1wbGU6IiwKKyIgIEVWQUxVQVRFIFxcJW4gKDErMSkgKiAoXFwlYSAvIDMpLiIsCisiICIsCisiICBOT1RFOiBQcmlvciB0byBDLUtlcm1pdCA3LjAsIHRoZSBzeW50YXggd2FzIFwiRVZBTFVBVEUgZXhwcmVzc2lvblwiIiwKKyIgIChubyB2YXJpYWJsZSksIGFuZCB0aGUgcmVzdWx0IHdhcyBwcmludGVkLiAgVXNlIFNFVCBFVkFMIHsgT0xELCBORVcgfSIsCisiICB0byBjaG9vc2UgdGhlIG9sZCBvciBuZXcgYmVoYXZpb3IsIHdoaWNoIGlzIE5FVyBieSBkZWZhdWx0LiIsCisiICIsCisiQWxzZSBzZWU6IEhFTFAgRlVOQ1RJT04gRVZBTC4iLAorIiIgfTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCitzdGF0aWMgY2hhciAqaG14eGV4aXRbXSA9IHsKKyJTeW50YXg6IEVYSVQgKG9yIFFVSVQpIFsgbnVtYmVyIFsgdGV4dCBdIF0iLAorIiAgRXhpdHMgZnJvbSB0aGUgS2VybWl0IHByb2dyYW0sIGNsb3NpbmcgYWxsIG9wZW4gZmlsZXMgYW5kIGRldmljZXMuIiwKKyIgIElmIGEgbnVtYmVyIGlzIGdpdmVuIGl0IGJlY29tZXMgS2VybWl0J3MgZXhpdCBzdGF0dXMgY29kZS4gIElmIHRleHQgaXMiLAorIiAgaW5jbHVkZWQsIGl0IGlzIHByaW50ZWQuICBBbHNvIHNlZSBTRVQgRVhJVC4iLAorIiIgfTsKKworI2lmbmRlZiBOT1NQTAorc3RhdGljIGNoYXIgKmlmeGhscFtdID0geyAiXAorU3ludGF4OiBYSUYgY29uZGl0aW9uIHsgY29tbWFuZGxpc3QgfSBbIEVMU0UgeyBjb21tYW5kbGlzdCB9IF0iLAorIiAgT2Jzb2xldGUuICBTYW1lIGFzIElGIChzZWUgSEVMUCBJRikuIiwKKyIiIH07CisKK3N0YXRpYyBjaGFyICpmb3JobHBbXSA9IHsgIlwKK1N5bnRheDogRk9SIHZhcmlhYmxlbmFtZSBpbml0aWFsLXZhbHVlIGZpbmFsLXZhbHVlIGluY3JlbWVudCB7IGNvbW1hbmRsaXN0IH0iLAorIiAgRk9SIGxvb3AuICBFeGVjdXRlIHRoZSBjb21tYS1zZXBhcmF0ZWQgY29tbWFuZHMgaW4gdGhlIGNvbW1hbmRsaXN0IHRoZSIsCisiICBudW1iZXIgb2YgdGltZXMgZ2l2ZW4gYnkgdGhlIGluaXRpYWwgdmFsdWUsIGZpbmFsIHZhbHVlIGFuZCBpbmNyZW1lbnQuIiwKKyIgIEV4YW1wbGU6ICBGT1IgXFwlaSAxMCAxIC0xIHsgcGF1c2UgMSwgZWNobyBcXCVpIH0iLCAiIiB9OworCitzdGF0aWMgY2hhciAqd2hpaGxwW10gPSB7ICJcCitTeW50YXg6IFdISUxFIGNvbmRpdGlvbiB7IGNvbW1hbmRsaXN0IH0iLAorIiAgV0hJTEUgbG9vcC4gIEV4ZWN1dGUgdGhlIGNvbW1hLXNlcGFyYXRlZCBjb21tYW5kcyBpbiB0aGUgYnJhY2tldGVkIiwKKyIgIGNvbW1hbmRsaXN0IHdoaWxlIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4gIENvbmRpdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciIsCisiICBJRiBjb21tYW5kcy4iLAorIiIgfTsKKworc3RhdGljIGNoYXIgKnN3aWhscFtdID0geworIlN5bnRheDogU1dJVENIIDx2YXJpYWJsZT4geyBjYXNlLWxpc3QgfSIsCisiICBTZWxlY3RzIGZyb20gYSBncm91cCBvZiBjb21tYW5kcyBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS4iLAorIiAgVGhlIGNhc2UtbGlzdCBpcyBhIHNlcmllcyBvZiBsaW5lcyBsaWtlIHRoZXNlOiIsCisiICIsCisiICAgIDp4LCBjb21tYW5kLCBjb21tYW5kLCAuLi4sIGJyZWFrIiwKKyIgIiwKKyIgIHdoZXJlIFwieFwiIGlzIGEgcG9zc2libGUgdmFsdWUgZm9yIHRoZSB2YXJpYWJsZS4gIEF0IHRoZSBlbmQgb2YgdGhlIiwKKyIgIGNhc2UtbGlzdCwgeW91IGNhbiBwdXQgYSBcImRlZmF1bHRcIiBsYWJlbCB0byBjYXRjaCB3aGVuIHRoZSB2YXJpYWJsZSBkb2VzIiwKKyIgIG5vdCBtYXRjaCBhbnkgb2YgdGhlIGxhYmVsczoiLAorIiAiLAorIiAgICA6ZGVmYXVsdCwgY29tbWFuZCwgY29tbWFuZCwgLi4uIiwKKyIgIiwKKyJUaGUgY2FzZSBsYWJlbCBcInhcIiBjYW4gYmUgYSBjaGFyYWN0ZXIsIGEgc3RyaW5nLCBhIHZhcmlhYmxlLCBhIGZ1bmN0aW9uIiwKKyJpbnZvY2F0aW9uLCBhIHBhdHRlcm4sIG9yIGFueSBjb21iaW5hdGlvbiBvZiB0aGVzZS4gIFNlZSBIRUxQIFdJTERDQVJEUyIsCisiZm9yIGluZm9ybWF0aW9uIGFib3V0IHBhdHRlcm5zLiIsCisiIn07CisKK3N0YXRpYyBjaGFyICpvcGVuaGxwW10gPSB7CisiU3ludGF4OiAgT1BFTiBtb2RlIGZpbGVuYW1lIiwKKyIgIEZvciB1c2Ugd2l0aCBSRUFEIGFuZCBXUklURSBjb21tYW5kcy4gIE9wZW4gdGhlIGxvY2FsIGZpbGUgaW4gdGhlIiwKKyIgIHNwZWNpZmllZCBtb2RlOiBSRUFELCBXUklURSwgb3IgQVBQRU5ELiAgIVJFQUQgYW5kICFXUklURSBtZWFuIHRvIHJlYWQiLAorIiAgZnJvbSBvciB3cml0ZSB0byBhIHN5c3RlbSBjb21tYW5kIHJhdGhlciB0aGFuIGEgZmlsZS4gIEV4YW1wbGVzOiIsCisiICIsCisiICAgIE9QRU4gUkVBRCBvb2ZhLnR4dCIsCisiICAgIE9QRU4gIVJFQUQgc29ydCBmb28uYmFyIiwKKyIiIH07CisKK3N0YXRpYyBjaGFyICpoeHhhc2tbXSA9IHsKKyJTeW50YXg6ICBBU0sgWyBzd2l0Y2hlcyBdIHZhcmlhYmxlbmFtZSBbIHByb21wdCBdIiwKKyJFeGFtcGxlOiBBU0sgXFwlbiB7IFdoYXQgaXMgeW91ciBuYW1lXFw/IH0iLAorIiAgSXNzdWVzIHRoZSBwcm9tcHQgYW5kIGRlZmluZXMgdGhlIHZhcmlhYmxlIHRvIGJlIHdoYXRldmVyIGlzIHR5cGVkIGluIiwKKyIgIHJlc3BvbnNlLCB1cCB0byB0aGUgdGVybWluYXRpbmcgY2FycmlhZ2UgcmV0dXJuLiAgVXNlIGJyYWNlcyB0byBwcmVzZXJ2ZSIsCisiICBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBzcGFjZXMgaW4gdGhlIHByb21wdC4iLAorIiAiLAorIlN5bnRheDogIEFTS1EgWyBzd2l0Y2hlcyBdIHZhcmlhYmxlbmFtZSBbIHByb21wdCBdIiwKKyJFeGFtcGxlOiBBU0tRIFxcJXAgeyBQYXNzd29yZDp9IiwKKyIgIExpa2UgQVNLIGV4Y2VwdCB0aGUgcmVzcG9uc2UgZG9lcyBub3QgZWNobyBvbiB0aGUgc2NyZWVuLiIsCisiICIsCisiU3dpdGNoZXM6IiwKKyIgL0RFRkFVTFQ6dGV4dCIsCisiICBUZXh0IHRvIHN1cHBseSBpZiB0aGUgdXNlciBlbnRlcnMgYSBibGFuayByZXNwb25zZSBvciB0aGUgL1RJTUVPVVQiLAorIiAgbGltaXQgZXhwaXJlZCB3aXRoIG5vIHJlc3BvbnNlLiIsCisiICIsCisjaWZkZWYgT1MyCisiIC9QT1BVUCIsCisiICBUaGUgcHJvbXB0IGFuZCByZXNwb25zZSBkaWFsb2cgdGFrZXMgcGxhY2UgaW4gYSB0ZXh0LW1vZGUgcG9wdXAuIiwKKyIgIEs5NSBvbmx5OyBpbiBDLUtlcm1pdCB0aGlzIHN3aXRjaCBpcyBpZ25vcmVkLiIsCisiICIsCisjaWZkZWYgS1VJCisiIC9HVUkiLAorIiAgVGhlIHByb21wdCBhbmQgcmVzcG9uc2UgZGlhbG9nIHRha2VzIHBsYWNlIGluIGEgR1VJIHBvcHVwLiIsCisiICBLOTUgR1VJIHZlcnNpb24gb25seTsgaW4gQy1LZXJtaXQgYW5kIHRoZSBLOTUgY29uc29sZSB2ZXJzaW9uLCIsIAorIiAgdGhpcyBzd2l0Y2ggaXMgaWdub3JlZC4iLAorIiAiLAorI2VuZGlmIC8qIEtVSSAqLworI2VuZGlmIC8qIE9TMiAqLworIiAvVElNRU9VVDpudW1iZXIiLAorIiAgSWYgdGhlIHJlc3BvbnNlIGlzIG5vdCBlbnRlcmVkIHdpdGhpbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNlY29uZHMsIHRoZSIsCisiICBjb21tYW5kIGZhaWxzLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgQVNLLVRJTUVSIHRvIGEgcG9zaXRpdmUiLAorIiAgbnVtYmVyLCBleGNlcHQgaXQgYXBwbGllcyBvbmx5IHRvIHRoaXMgY29tbWFuZC4gIEFsc28gc2VlIFNFVCBBU0stVElNRVIuIiwKKyIgIE5PVEU6IElmIGEgL0RFRkFVTFQ6IHZhbHVlIHdhcyBhbHNvIGdpdmVuLCBpdCBpcyBzdXBwbGllZCBhdXRvbWF0aWNhbGx5IiwKKyIgIHVwb24gdGltZW91dCBhbmQgdGhlIGNvbW1hbmQgZG9lcyBOT1QgZmFpbC4iLAorCisiICIsCisiIC9RVUlFVCIsCisiICBTdXBwcmVzc2VzIFwiP1RpbWVkIG91dFwiIG1lc3NhZ2Ugd2hlbiAvVElNRU9VVCBpcyBnaXZlbiBhbmQgdXNlciBkb2Vzbid0IiwKKyIgIHJlc3BvbmQgd2l0aGluIHRoZSB0aW1lIGxpbWl0LiIsCisiIn07CitzdGF0aWMgY2hhciAqaHh4Z2V0Y1tdID0geworIlN5bnRheDogIEdFVEMgdmFyaWFibGVuYW1lIFsgcHJvbXB0IF0iLAorIkV4YW1wbGU6IEdFVEMgXFwlYyB7IFR5cGUgYW55IGNoYXJhY3RlciB0byBjb250aW51ZS4uLn0iLAorIiAgSXNzdWVzIHRoZSBwcm9tcHQgYW5kIHNldHMgdGhlIHZhcmlhYmxlIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgeW91IHR5cGUuIiwKKyIgIFVzZSBicmFjZXMgdG8gcHJlc2VydmUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgc3BhY2VzIGluIHRoZSBwcm9tcHQuIiwKKyIgIiwKKyJBbHNvIHNlZSBTRVQgQVNLLVRJTUVSLiIsCisiIn07CisKK3N0YXRpYyBjaGFyICpobXh5dGltZXJbXSA9IHsKKyJTeW50YXg6IFNFVCBBU0stVElNRVIgbnVtYmVyIiwKKyIgIEZvciB1c2Ugd2l0aCBBU0ssIEFTS1EsIEdFVE9LLCBhbmQgR0VUQy4gIElmIEFTSy1USU1FUiBpcyBzZXQgdG8gYSBudW1iZXIiLAorIiAgZ3JlYXRlciB0aGFuIDAsIHRoZXNlIGNvbW1hbmRzIHdpbGwgdGltZSBvdXQgYWZ0ZXIgdGhlIGdpdmVuIG51bWJlciBvZiIsCisiICBzZWNvbmRzIHdpdGggbm8gcmVzcG9uc2UuICBUaGlzIGNvbW1hbmQgaXMgXCJzdGlja3lcIiwgc28gdG8gcmV2ZXJ0IHRvIiwKKyIgXAordW50aW1lZCBBU0tzIGFmdGVyIGEgdGltZWQgb25lLCB1c2UgU0VUIEFTSy1USU1FUiAwLiAgQWxzbyBzZWUgSUYgQVNLVElNRU9VVC4iLAorIiJ9OworCitzdGF0aWMgY2hhciAqaHh4ZG90W10gPSB7CisiU3ludGF4OiAuPHZhcmlhYmxlLW5hbWU+IDxhc3NpZ25tZW50LW9wZXJhdG9yPiA8dmFsdWU+IiwKKyIgIEFzc2lnbnMgdGhlIHZhbHVlIHRvIHRoZSB2YXJpYWJsZSBpbiB0aGUgbWFubmVyIGluZGljYXRlZCBieSB0aGUiLAorIiAgYXNzaWdubWVudCBvcGVyYXRvcjoiLAorIiAgPSAgIENvcGllcyB3aXRob3V0IGV2YWx1YXRpb24gKGxpa2UgREVGSU5FKS4iLAorIiAgOj0gIENvcGllcyB3aXRoIGV2YWx1YXRpb24gKGxpa2UgQVNTSUdOKS4iLAorIiAgOjo9IENvcGllcyB3aXRoIGFyaXRobWV0aWMgZXZhbHVhdGlvbiAobGlrZSBFVkFMVUFURSkuIiwKKyIifTsKKworc3RhdGljIGNoYXIgKmh4eGRlZltdID0geworIlN5bnRheDogREVGSU5FIG5hbWUgWyBkZWZpbml0aW9uIF0iLAorIiAgRGVmaW5lcyBhIG1hY3JvIG9yIHZhcmlhYmxlLiAgSXRzIHZhbHVlIGlzIHRoZSBkZWZpbml0aW9uLCB0YWtlbiIsCisiICBsaXRlcmFsbHkuICBObyBleHBhbnNpb24gb3IgZXZhbHVhdGlvbiBvZiB0aGUgZGVmaW5pdGlvbiBpcyBkb25lLiAgVGh1cyIsCisiICBpZiB0aGUgZGVmaW5pdGlvbiBpbmNsdWRlcyBhbnkgdmFyaWFibGUgb3IgZnVuY3Rpb24gcmVmZXJlbmNlcywgdGhlaXIiLAorIiAgbmFtZXMgYXJlIGluY2x1ZGVkLCByYXRoZXIgdGhhbiB0aGVpciB2YWx1ZXMgKGNvbXBhcmUgd2l0aCBBU1NJR04pLiAgSWYiLAorIiAgdGhlIGRlZmluaXRpb24gaXMgb21pdHRlZCwgdGhlbiB0aGUgbmFtZWQgdmFyaWFibGUgb3IgbWFjcm8gaXMgdW5kZWZpbmVkLiIsCisiICIsCisiQSB0eXBpY2FsIG1hY3JvIGRlZmluaXRpb24gbG9va3MgbGlrZSB0aGlzOiIsCisiICIsCisiICBERUZJTkUgbmFtZSBjb21tYW5kLCBjb21tYW5kLCBjb21tYW5kLCAuLi4iLAorIiAiLAorImZvciBleGFtcGxlOiIsCisiICIsCisiICBERUZJTkUgdmF4IHNldCBwYXJpdHkgZXZlbiwgc2V0IGR1cGxleCBmdWxsLCBzZXQgZmxvdyB4b24veG9mZiIsCisiICIsCisid2hpY2ggZGVmaW5lcyBhIEtlcm1pdCBjb21tYW5kIG1hY3JvIGNhbGxlZCAndmF4Jy4gIFRoZSBkZWZpbml0aW9uIGlzIGEiLAorImNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIEtlcm1pdCBjb21tYW5kcy4gIFVzZSB0aGUgRE8gY29tbWFuZCB0byBleGVjdXRlIiwKKyJ0aGUgbWFjcm8sIG9yIGp1c3QgdHlwZSBpdHMgbmFtZSwgZm9sbG93ZWQgb3B0aW9uYWxseSBieSBhcmd1bWVudHMuIiwKKyIgIiwKKyJUaGUgZGVmaW5pdGlvbiBvZiBhIHZhcmlhYmxlIGNhbiBiZSBhbnl0aGluZyBhdCBhbGwsIGZvciBleGFtcGxlOiIsCisiICIsCisiICBERUZJTkUgXFwlYSBNb25kYXkiLAorIiAgREVGSU5FIFxcJWIgMyIsCisiICIsCisiVGhlc2UgdmFyaWFibGVzIGNhbiBiZSB1c2VkIGFsbW9zdCBhbnl3aGVyZSwgZm9yIGV4YW1wbGU6IiwKKyIgIiwKKyIgIEVDSE8gVG9kYXkgaXMgXFwlYSIsCisiICBTRVQgQkxPQ0stQ0hFQ0sgXFwlYiIsCisiIiB9OworCitzdGF0aWMgY2hhciAqaHh4YXNzW10gPSB7CisiU3ludGF4OiAgQVNTSUdOIHZhcmlhYmxlbmFtZSBzdHJpbmcuIiwKKyJFeGFtcGxlOiBBU1NJR04gXFwlYSBNeSBuYW1lIGlzIFxcJWIuIiwKKyIgIEFzc2lnbnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0cmluZyB0byB0aGUgdmFyaWFibGUgKG9yIG1hY3JvKS4iLAorIiAgVGhlIGRlZmluaXRpb24gc3RyaW5nIGlzIGZ1bGx5IGV2YWx1YXRlZCBiZWZvcmUgaXQgaXMgYXNzaWduZWQsIHNvIHRoYXQiLAorIiAgdGhlIHZhbHVlcyBvZiBhbnkgdmFyaWFibGVzIHRoYXQgYXJlIGNvbnRhaW5lZCBhcmUgdXNlZCwgcmF0aGVyIHRoYW4gdGhlaXIiLAorIiAgbmFtZXMuICBDb21wYXJlIHdpdGggREVGSU5FLiAgVG8gaWxsdXN0cmF0ZSB0aGUgZGlmZmVyZW5jZSwgdHJ5IHRoaXM6IiwKKyIgIiwKKyIgICAgREVGSU5FIFxcJWEgaGVsbG8iLAorIiAgICBERUZJTkUgXFwleCBcXCVhIiwKKyIgICAgQVNTSUdOIFxcJXkgXFwlYSIsCisiICAgIERFRklORSBcXCVhIGdvb2RieWUiLAorIiAgICBFQ0hPIFxcJXggXFwleSIsCisiICIsCisiICBUaGlzIHByaW50cyAnZ29vZGJ5ZSBoZWxsbycuIiwgIiIgfTsKKworc3RhdGljIGNoYXIgKmh4eGRlY1tdID0geworIlN5bnRheDogREVDUkVNRU5UIHZhcmlhYmxlbmFtZSBbIG51bWJlciBdIiwKKyIgIERlY3JlbWVudCAoc3VidHJhY3Qgb25lIGZyb20pIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIGlmIHRoZSBjdXJyZW50IHZhbHVlIiwKKyIgIGlzIG51bWVyaWMuICBJZiB0aGUgbnVtYmVyIGFyZ3VtZW50IGlzIGdpdmVuLCBzdWJ0cmFjdCB0aGF0IG51bWJlciIsCisiICBpbnN0ZWFkLiIsCisiICIsCisiRXhhbXBsZXM6IERFQ1IgXFwlYSwgREVDUiBcXCVhIDcsIERFQ1IgXFwlYSBcXCVuIiwgIiIgfTsKKworc3RhdGljIGNoYXIgKmh4eGluY1tdID0geworIlN5bnRheDogSU5DUkVNRU5UIHZhcmlhYmxlbmFtZSBbIG51bWJlciBdIiwKKyIgIEluY3JlbWVudCAoYWRkIG9uZSB0bykgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUgaWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMiLAorIiAgbnVtZXJpYy4gIElmIHRoZSBudW1iZXIgYXJndW1lbnQgaXMgZ2l2ZW4sIGFkZCB0aGF0IG51bWJlciBpbnN0ZWFkLiIsCisiICIsCisiRXhhbXBsZXM6IElOQ1IgXFwlYSwgSU5DUiBcXCVhIDcsIElOQ1IgXFwlYSBcXCVuIiwgIiIgfTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZkZWYgQU5ZWDI1CisjaWZuZGVmIElCTVgyNQorc3RhdGljIGNoYXIgKmh4eHBhZFtdID0geworIlN5bnRheDogUEFEIGNvbW1hbmQiLAorIlguMjUgUEFEIGNvbW1hbmRzOiIsCisiICIsCisiICAgIFBBRCBDTEVBUiAgICAgLSBDbGVhciB0aGUgdmlydHVhbCBjYWxsIiwKKyIgICAgUEFEIFNUQVRVUyAgICAtIFJldHVybiB0aGUgc3RhdHVzIG9mIHZpcnR1YWwgY2FsbCIsCisiICAgIFBBRCBSRVNFVCAgICAgLSBTZW5kIGEgcmVzZXQgcGFja2V0IiwKKyIgICAgUEFEIElOVEVSUlVQVCAtIFNlbmQgYW4gaW50ZXJydXB0IHBhY2tldCIsCisiIn07CisjZW5kaWYgLyogSUJNWDI1ICovCisKK3N0YXRpYyBjaGFyICpoeHl4MjVbXSA9IHsKKyJTeW50YXg6IFNFVCBYLjI1IG9wdGlvbiB7IE9OIFsgZGF0YSBdLCBPRkYgfSIsCisiICIsCisiWC4yNSBjYWxsIG9wdGlvbnM6IiwKKyIgIENMT1NFRC1VU0VSLUdST1VQIHsgT04gaW5kZXgsIE9GRiB9IiwKKyIgICAgRW5hYmxlIG9yIGRpc2FibGUgY2xvc2VkIHVzZXIgZ3JvdXAgY2FsbCwgd2hlcmUgaW5kZXggaXMgdGhlIGdyb3VwIiwKKyIgICAgaW5kZXgsIDAgdG8gOTkuIiwKKyIgIFJFVkVSU0UtQ0hBUkdFIHsgT04sIE9GRiB9IiwKKyIgICAgVGVsbCB3aGV0aGVyIHlvdSB3YW50IHRvIHJldmVyc2UgdGhlIGNoYXJnZXMgZm9yIHRoZSBjYWxsLiIsCisiICBDQUxMLVVTRVItREFUQSB7IE9OIHN0cmluZywgT0ZGIH0iLAorIiAgICBTcGVjaWZ5IGNhbGwgdXNlci1kYXRhIGZvciB0aGUgWC4yNSBjYWxsLiIsCisiIn07CisjZW5kaWYgLyogQU5ZWDI1ICovCisKK3N0YXRpYyBjaGFyICpoeHlwcnRyW10gPSB7CisjaWZkZWYgUFJJTlRTV0kKKyJTeW50YXg6IFNFVCBQUklOVEVSIFsgc3dpdGNoZXMgXSBbIG5hbWUgXSIsCisiICIsCisiICBTcGVjaWZpZXMgdGhlIHByaW50ZXIgdG8gYmUgdXNlZCBmb3IgdHJhbnNwYXJlbnQtcHJpbnQsIGF1dG9wcmludCwgYW5kIiwKKyIgIHNjcmVlbi1kdW1wIG1hdGVyaWFsIGR1cmluZyB0ZXJtaW5hbCBlbXVsYXRpb24sIGFzIHdlbGwgYXMgZm9yIHRoZSBQUklOVCIsCisiICBjb21tYW5kLCBwbHVzIHZhcmlvdXMgb3B0aW9ucyBnb3Zlcm5pbmcgcHJpbnQgYmVoYXZpb3IuIiwKKyIgIiwKKyJTd2l0Y2hlcyBmb3Igc3BlY2lmeWluZyB0aGUgcHJpbnRlciBieSB0eXBlOiIsCisiICIsCisiL05PTkUiLAorIiAgSW5jbHVkZSB0aGlzIHN3aXRjaCB0byBzcGVjaWZ5IHRoYXQgYWxsIHByaW50ZXIgYWN0aW9ucyBzaG91bGQgc2ltcGx5IGJlIiwKKyIgIHNraXBwZWQuICBVc2UgdGhpcywgZm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIG5vIHByaW50ZXIuIiwKKyIgIiwKKyIvRE9TLURFVklDRVs6bmFtZV0iLAorIiAgSW5jbHVkZSB0aGlzIHRvIGRlY2xhcmUgYSBET1MgcHJpbnRlciBhbmQgdG8gc3BlY2lmeSBpdHMgbmFtZSwgc3VjaCBhcyIsCisiICBQUk4sIExQVDEsIGV0Yy4iLAorIiAiLAorI2lmZGVmIE5UCisiL1dJTkRPV1MtUVVFVUVbOltxdWV1ZS1uYW1lXV0iLAorIiAgSW5jbHVkZSB0aGlzIHRvIGRlY2xhcmUgYSBXaW5kb3dzIHByaW50ZXIgYW5kIHNwZWNpZnkgaXRzIHF1ZXVlIG5hbWUuIiwKKyIgIFR5cGUgcXVlc3Rpb24gbWFyayAoPykgYWZ0ZXIgdGhlIGNvbG9uICg6KSB0byBzZWUgYSBsaXN0IG9mIGtub3duIHF1ZXVlIiwKKyIgIG5hbWVzLiAgSWYgdGhlIGNvbG9uIGlzIGFic2VudCwgdGhlIHN3aXRjaCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnRseSIsCisiICBzZWxlY3RlZCBwcmludGVyIGlzIGEgV2luZG93cyBQcmludCBRdWV1ZS4gIElmIHRoZSBjb2xvbiBpcyBwcm92aWRlZCIsCisiICBhbmQgdGhlIG5hbWUgaXMgYWJzZW50LCB0aGUgV2luZG93cyBQcmludCBRdWV1ZSBjaG9zZW4gYXMgdGhlIERlZmF1bHQiLAorIiAgUHJpbnRlciBpcyBzZWxlY3RlZC4iLAorIiAiLAorI2VuZGlmIC8qIE5UICovCisiL0ZJTEVbOm5hbWVdIiwKKyIgIFNwZWNpZmllcyB0aGF0IGFsbCBwcmludGVyIG1hdGVyaWFsIGlzIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBuYW1lZCBmaWxlLCIsCisiICByYXRoZXIgdGhhbiBiZWluZyBzZW50IHRvIGEgcHJpbnRlci4gIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyIsCisiICBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGFueSBtYXRlcmlhbCBpcyB0byBiZSBwcmludGVkLiIsCisiICIsCisiL1BJUEVbOm5hbWVdIiwKKyIgIFNwZWNpZmllcyB0aGF0IGFsbCBwcmludGVyIG1hdGVyaWFsIGlzIHRvIGJlIHNlbnQgYXMgc3RhbmRhcmQgaW5wdXQgdG8iLAorIiAgdGhlIHByb2dyYW0gb3IgY29tbWFuZCB3aG9zZSBuYW1lIGlzIGdpdmVuLiAgRXhhbXBsZToiLAorIiAiLAorIiAgICBTRVQgUFJJTlRFUiAvUElQRTp7dGV4dHBzID4gbHB0MX0iLAorIiAiLAorIklmIHlvdSBnaXZlIGEgcHJpbnRlciBuYW1lIHdpdGhvdXQgc3BlY2lmeWluZyBhbnkgb2YgdGhlc2Ugc3dpdGNoZXMsIHRoZW4gaXQiLAorImlzIGFzc3VtZWQgdG8gYmUgYSBET1MgcHJpbnRlciBkZXZpY2Ugb3IgZmlsZW5hbWUgdW5sZXNzIHRoZSBuYW1lIGdpdmVuIiwKKyIoYWZ0ZXIgcmVtb3ZpbmcgZW5jbG9zaW5nIGJyYWNlcywgaWYgYW55KSBzdGFydHMgd2l0aCBcInxcIiwgXAoraW4gd2hpY2ggY2FzZSBpdCIsCisiaXMgYSBwaXBlLiAgRXhhbXBsZXM6IiwKKyIgIiwKKyIgIFNFVCBQUklOVEVSIExQVDEgICAgICAgICAgICAgICA8LS0gRE9TIGRldmljZSIsCisiICBTRVQgUFJJTlRFUiB7fCB0ZXh0cHMgPiBscHQxfSAgPC0tIFBpcGUiLAorIiAiLAorIlRoZSBuZXh0IGdyb3VwIG9mIHN3aXRjaGVzIHRlbGxzIHdoZXRoZXIgdGhlIHByaW50ZXIgaXMgb25lLXdheSBvciIsCisiYmlkaXJlY3Rpb25hbCAodHdvLXdheSk6IiwKKyIgIiwKKyIvT1VUUFVULU9OTFkiLAorIiAgSW5jbHVkZSB0aGlzIHRvIGRlY2xhcmUgdGhlIHByaW50ZXIgY2FwYWJsZSBvbmx5IG9mIHJlY2VpdmluZyBtYXRlcmlhbCB0byIsCisiICBiZSBwcmludGVkLCBidXQgbm90IHNlbmRpbmcgYW55dGhpbmcgYmFjay4gIFRoaXMgaXMgdGhlIG5vcm1hbCBraW5kIG9mIiwKKyIgIHByaW50ZXIsIEtlcm1pdCdzIGRlZmF1bHQga2luZCwgYW5kIHRoZSBvcHBvc2l0ZSBvZiAvQklESVJFQ1RJT05BTC4iLAorIiAiLAorIi9CSURJUkVDVElPTkFMIiwKKyIgIEluY2x1ZGUgdGhpcyB0byBkZWNsYXJlIHRoZSBwcmludGVyIGJpZGlyZWN0aW9uYWwuICBUaGlzIGlzIHRoZSBvcHBvc2l0ZSAiLAorIiAgb2YgL09VVFBVVC1PTkxZLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIG9wdGlvbiB3aXRoIHNlcmlhbCBwcmludGVycywgZXZlbiIsCisiICBpZiB0aGV5IGFyZW4ndCBiaWRpcmVjdGlvbmFsLCBpbiBjYXNlIHlvdSBuZWVkIHRvIHNwZWNpZnkgc3BlZWQsIGZsb3ciLAorIiAgY29udHJvbCwgb3IgcGFyaXR5LiIsCisiICIsCisiVGhlIG5leHQgZ3JvdXAgYXBwbGllcyBvbmx5IHRvIGJpZGlyZWN0aW9uYWwgYW5kL29yIHNlcmlhbCBwcmludGVyczoiLAorIiAiLAorIi9GTE9XLUNPTlRST0w6e05PTkUsWE9OL1hPRkYsUlRTL0NUUyxLRUVQfSIsCisiICBGbG93IGNvbnRyb2wgdG8gdXNlIHdpdGggYSBzZXJpYWwgYmlkaXJlY3Rpb25hbCBwcmludGVyLCBkZWZhdWx0IEtFRVA7IiwKKyNpZmRlZiBOVAorIiAgaS5lLiB1c2Ugd2hhdGV2ZXIgdGhlIFdpbmRvd3MgZHJpdmVyIGZvciB0aGUgcG9ydCBub3JtYWxseSB1c2VzLiIsCisjZWxzZQorIiAgaS5lLiB1c2Ugd2hhdGV2ZXIgdGhlIE9TLzIgZHJpdmVyIGZvciB0aGUgcG9ydCBub3JtYWxseSB1c2VzLiIsCisjZW5kaWYgLyogTlQgKi8KKyIgIiwKKyIvUEFSSVRZOntOT05FLEVWRU4sT0RELFNQQUNFLE1BUkt9IiwKKyIgIFBhcml0eSB0byB1c2Ugd2l0aCBhIHNlcmlhbCBwcmludGVyLCBkZWZhdWx0IE5PTkU7IGkuZS4gdXNlIDggZGF0YSBiaXRzIiwKKyIgIGFuZCBubyBwYXJpdHkuICBJZiB5b3Ugb21pdCB0aGUgY29sb24gYW5kIHRoZSBrZXl3b3JkLCBOT05FIGlzIHNlbGVjdGVkLiIsCisiICIsCisiL1NQRUVEOm51bWJlciIsCisiICBJbnRlcmZhY2Ugc3BlZWQsIGluIGJpdHMgcGVyIHNlY29uZCwgdG8gdXNlIHdpdGggYSBzZXJpYWwgcHJpbnRlciwgc3VjaCBhcyIsCisiICAyNDAwLCA5NjAwLCAxOTIwMCwgZXRjLiAgVHlwZSBTRVQgUFJJTlRFUiAvU1BFRUQ6PyBmb3IgYSBsaXN0IG9mIHBvc3NpYmxlIiwKKyIgIHNwZWVkcy4iLAorIiAiLAorIlRoZSBuZXh0IGdyb3VwIGRlYWxzIHdpdGggcHJpbnQgam9icyAtLSBob3cgdG8gaWRlbnRpZnkgdGhlbSwgaG93IHRvIHN0YXJ0IiwKKyJ0aGVtLCBob3cgdG8gdGVybWluYXRlIHRoZW06IiwKKyIgIiwKKyIvVElNRU9VVFs6bnVtYmVyXSIsCisiICBVc2VkIHdpdGggaG9zdC1kaXJlY3RlZCB0cmFuc3BhcmVudCBvciBhdXRvIHByaW50aW5nLCB0aGlzIGlzIHRoZSBudW1iZXIiLAorIiAgb2Ygc2Vjb25kcyB0byB3YWl0IGFmdGVyIHRoZSBob3N0IGNsb3NlcyB0aGUgcHJpbnRlciBiZWZvcmUgdGVybWluYXRpbmciLAorIiAgdGhlIHByaW50IGpvYiBpZiB0aGUgcHJpbnRlciBpcyBub3Qgb3BlbmVkIGFnYWluIGR1cmluZyB0aGUgc3BlY2lmaWVkIiwKKyIgIGFtb3VudCBvZiB0aW1lLiIsCisiICIsCisiL0pPQi1IRUFERVItRklMRVs6ZmlsZW5hbWVdIiwKKyIgIFRoZSBuYW1lIG9mIGEgZmlsZSB0byBiZSBzZW50IHRvIHRoZSBwcmludGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCIsCisiICBwcmludCBqb2IsIGFzIGEgYnVyc3QgcGFnZSwgb3IgdG8gY29uZmlndXJlIHRoZSBwcmludGVyLiAgTm9ybWFsbHkgbm8gZmlsZSIsCisiICBpcyBpcyBzZW50LiIsCisiICIsCisiL0VORC1PRi1KT0ItU1RSSU5HWzpzdHJpbmddIiwKKyIgIFN0cmluZyBvZiBjaGFyYWN0ZXJzIHRvIGJlIHNlbnQgdG8gdGhlIHByaW50ZXIgYXQgdGhlIGVuZCBvZiB0aGUgcHJpbnQiLAorIiAgam9iLCB1c3VhbGx5IHVzZWQgdG8gZm9yY2UgdGhlIGxhc3Qgb3Igb25seSBwYWdlIG91dCBvZiB0aGUgcHJpbnRlci4gIFdoZW4iLAorIiAgc3VjaCBhIHN0cmluZyBpcyBuZWVkZWQsIGl0IHVzdWFsbHkgY29uc2lzdHMgb2YgYSBzaW5nbGUgZm9ybWZlZWQ6IFwic2V0IiwKKyIgIHByaW50ZXIgL2VuZC1vZi1qb2I6e1xcMTJ9XCIuICBObyBlbmQtb2Ytam9iIHN0cmluZyBpcyBzZW50IHVubGVzcyB5b3UiLAorIiAgc3BlY2lmeSBvbmUgd2l0aCB0aGlzIG9wdGlvbi4gIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYW55IHNwYWNlcyBvciIsCisiICBjb250cm9sIGNoYXJhY3RlcnMgKGV2ZW4gaW4gYmFja3NsYXNoIG5vdGF0aW9uLCBhcyBhYm92ZSksIGVuY2xvc2UgaXQgaW4iLAorIiAgYnJhY2VzLiIsCisiICIsCisiVGhlIG5leHQgZ3JvdXAgaXMgZm9yIHVzZSB3aXRoIHByaW50ZXJzIHRoYXQgcHJpbnQgb25seSBQb3N0U2NyaXB0OiIsCisiICIsCisiL1BPU1RTQ1JJUFQgb3IgL1BTIiwKKyIgIEluZGljYXRlcyB0aGF0IEs5NSBzaG91bGQgY29udmVydCBhbGwgdGV4dCB0byBQb3N0U2NyaXB0IGJlZm9yZSBzZW5kaW5nIiwKKyIgIGl0IHRvIHRoZSBwcmludGVyLiAgVGhlIGZpeGVkLXBpdGNoIENvdXJpZXItMTEgZm9udCBpcyB1c2VkLiIsCisiICIsCisiL1dJRFRIOm51bWJlciIsCisiICBTcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBwYWdlIGluIGNoYXJhY3RlcnMuICBJZiB0aGlzIHN3aXRjaCBpcyBub3QiLAorIiAgZ2l2ZW4sIDgwIGlzIHVzZWQuIiwKKyIgIiwKKyIvSEVJR0hUOm51bWJlciIsCisiICBTcGVjaWZpZXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBpbiBsaW5lcy4gIElmIHRoaXMgc3dpdGNoIGlzIG5vdCBnaXZlbiIsCisiICA2NiBpcyB1c2VkLiIsCisiICIsCisiL05PUE9TVFNDUklQVCBvciAvTk9QUyIsCisiICBJbmRpY2F0ZXMgdGhhdCBLOTUgc2hvdWxkIG5vdCBjb252ZXJ0IGFsbCB0ZXh0IHRvIFBvc3RTY3JpcHQgYmVmb3JlIiwKKyIgIHNlbmRpbmcgaXQgdG8gdGhlIHByaW50ZXIuIiwKKyIgIiwKKyJUaGUgZmluYWwgc3dpdGNoIGlzIGZvciB1c2Ugd2l0aCBBdXRvUHJpbnQgbW9kZSBhbmQgU2NyZWVuIER1bXBzIiwKKyIgIiwKKyIvQ0hBUkFDVEVSLVNFVDo8Y2hhcmFjdGVyLXNldD4iLAorIiAgU3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXIgc2V0IHVzZWQgYnkgdGhlIHByaW50ZXIgd2hpY2ggbWF5IGJlIGRpZmZlcmVudCIsCisiICBmcm9tIGJvdGggdGhlIGNoYXJhY3RlciBzZXQgdXNlZCBieSB0aGUgaG9zdCBhbmQgYnkgdGhlIGxvY2FsIGNvbXB1dGVyLiIsCisiICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBDUDQzNy4iLAorIiAiLAorIlNIT1cgUFJJTlRFUiBkaXNwbGF5cyB5b3VyIGN1cnJlbnQgcHJpbnRlciBzZXR0aW5ncy4iLAorI2Vsc2UKKyNpZmRlZiBVTklYCisiU3ludGF4OiBTRVQgUFJJTlRFUiBbIHsgfGNvbW1hbmQsIGZpbGVuYW1lIH0gXSIsCisiICBTcGVjaWZpZXMgdGhlIGNvbW1hbmQgKHN1Y2ggYXMgXCJ8bHByXCIpIG9yIGZpbGVuYW1lIHRvIGJlIHVzZWQgYnkgdGhlIiwKKyIgIFBSSU5UIGNvbW1hbmQuICBJZiBhIGZpbGVuYW1lIGlzIGdpdmVuLCBlYWNoIFBSSU5UIGNvbW1hbmQgYXBwZW5kcyB0byB0aGUiLAorIiAgZ2l2ZW4gZmlsZS4gIElmIHRoZSBTRVQgUFJJTlRFUiBhcmd1bWVudCBjb250YWlucyBzcGFjZXMsIGl0IG11c3QgYmUiLAorIiAgZW5jbG9zZWQgaW4gYnJhY2VzLCBlLmcuIFwic2V0IHByaW50ZXIge3wgbHByIC1QbGFzZXJ9XCIuIElmIHRoZSBhcmd1bWVudCIsCisiICBpcyBvbWl0dGVkIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHJlc3RvcmVkLiAgU0hPVyBQUklOVEVSIGxpc3RzIHRoZSBjdXJyZW50IiwKKyIgIHByaW50ZXIuICBTZWUgSEVMUCBQUklOVCBmb3IgZnVydGhlciBpbmZvLiIsCisjZWxzZQorIlNvcnJ5LCBTRVQgUFJJTlRFUiBub3QgYXZhaWxhYmxlIHlldC4iLAorI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBQUklOVFNXSSAqLworIiJ9OworCisjaWZkZWYgT1MyCisjaWZkZWYgQlBSSU5UCitzdGF0aWMgY2hhciAqaHh5YnBydHJbXSA9IHsKKyJTeW50YXg6IFNFVCBCUFJJTlRFUiBbIHBvcnRuYW1lIHNwZWVkIFsgcGFyaXR5IFsgZmxvdy1jb250cm9sIF0gXSBdIiwKKyIgIChPYnNvbGV0ZSwgcmVwbGFjZWQgYnkgU0VUIFBSSU5URVIgL0JJRElSRUNUSU9OQUwuKSIsCisiIn07CisjZW5kaWYgLyogQlBSSU5UICovCisjZW5kaWYgLyogT1MyICovCisKK3N0YXRpYyBjaGFyICpoeHlleGl0W10gPSB7CisiU3ludGF4OiBTRVQgRVhJVCBIQU5HVVAgeyBPTiwgT0ZGIH0iLAorIiAgV2hlbiBPTiAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLCBDLUtlcm1pdCBleGVjdXRlcyBhbiBpbXBsaWNpdCBIQU5HVVAgYW5kIiwKKyIgIENMT1NFIGNvbW1hbmQgb24gdGhlIGNvbW11bmljYXRpb25zIGRldmljZSBvciBjb25uZWN0aW9uIHdoZW4gaXQgZXhpdHMuIiwKKyIgIFdoZW4gT0ZGLCBLZXJtaXQgc2tpcHMgdGhpcyBzZXF1ZW5jZS4iLAorIiAiLAorIlN5bnRheDogU0VUIEVYSVQgT04tRElTQ09OTkVDVCB7IE9OLCBPRkYgfSIsCisiICBXaGVuIE9OLCBDLUtlcm1pdCBFWElUcyBhdXRvbWF0aWNhbGx5IHdoZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24iLAorIiAgaXMgdGVybWluYXRlZCBlaXRoZXIgYnkgdGhlIGhvc3Qgb3IgYnkgaXNzdWluZyBhIEhBTkdVUCBjb21tYW5kLiIsCisiICIsCisiU3ludGF4OiBTRVQgRVhJVCBTVEFUVVMgbnVtYmVyIiwKKyNpZmRlZiBOT1NQTAorIiAgU2V0IEMtS2VybWl0J3MgcHJvZ3JhbSByZXR1cm4gY29kZSB0byB0aGUgZ2l2ZW4gbnVtYmVyLiIsCisjZWxzZQorIiAgU2V0IEMtS2VybWl0J3MgcHJvZ3JhbSByZXR1cm4gY29kZSB0byB0aGUgZ2l2ZW4gbnVtYmVyLCB3aGljaCBjYW4gYmUgYSIsCisiICBjb25zdGFudCwgdmFyaWFibGUsIGZ1bmN0aW9uIHJlc3VsdCwgb3IgYXJpdGhtZXRpYyBleHByZXNzaW9uLiIsCisjZW5kaWYgLyogTk9TUEwgKi8KKyIgIiwKKyJTeW50YXg6IFNFVCBFWElUIFdBUk5JTkcgeyBPTiwgT0ZGLCBBTFdBWVMgfSIsCisiICBXaGVuIEVYSVQgV0FSTklORyBpcyBPTiwgaXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2UgYW5kIGFzayBmb3IgY29uZmlybWF0aW9uIiwKKyIgIGJlZm9yZSBFWElUaW5nIGlmIGEgY29ubmVjdGlvbiB0byBhbm90aGVyIGNvbXB1dGVyIG1pZ2h0IHN0aWxsIGJlIG9wZW4uIiwKKyIgIFdoZW4gRVhJVCBXQVJOSU5HIGlzIEFMV0FZUywgY29uZmlybWF0aW9uIGlzIGFsd2F5cyByZXF1ZXN0ZWQuICBXaGVuIE9GRiIsCisiICBpdCBpcyBuZXZlciByZXF1ZXN0ZWQuICBUaGUgZGVmYXVsdCBpcyBPTi4iLAorIiIgfTsKKworI2lmbmRlZiBOT1NQTAorc3RhdGljIGNoYXIgKmh4eHBhdVtdID0geworIlN5bnRheDogIFBBVVNFIFsgeyBudW1iZXItb2Ytc2Vjb25kcywgaGg6bW06c3MgfSBdIiwKKyJFeGFtcGxlOiBQQVVTRSAzICBvciAgUEFVU0UgMTQ6NTI6MzAiLAorIiAgRG8gbm90aGluZyBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcyBvciB1bnRpbCB0aGUgZ2l2ZW4gdGltZSBvZiIsCisiICBkYXkgaW4gMjQtaG91ciBoaDptbTpzcyBub3RhdGlvbi4gIElmIHRoZSB0aW1lIG9mIGRheSBpcyBlYXJsaWVyIHRoYW4gdGhlIiwKKyIgIGN1cnJlbnQgdGltZSwgaXQgaXMgYXNzdW1lZCB0byBiZSB0b21vcnJvdy4gIElmIG5vIGFyZ3VtZW50IGdpdmVuLCBvbmUiLAorIiAgc2Vjb25kIGlzIHVzZWQuICBUaGUgcGF1c2UgY2FuIGJlIGludGVycnVwdGVkIGJ5IHR5cGluZyBhbnkgY2hhcmFjdGVyIG9uIiwKKyIgIHRoZSBrZXlib2FyZCB1bmxlc3MgU0xFRVAgQ0FOQ0VMTEFUSU9OIGlzIE9GRi4gIElmIGludGVycnVwdGVkLCBQQVVTRSIsCisiICBmYWlscywgb3RoZXJ3aXNlIGl0IHN1Y2NlZWRzLiAgU3lub255bTogU0xFRVAuIiwKKyIiIH07CisKK3N0YXRpYyBjaGFyICpoeHhtc2xbXSA9IHsKKyJTeW50YXg6ICBNU0xFRVAgWyBudW1iZXIgXSIsCisiRXhhbXBsZTogTVNMRUVQIDUwMCIsCisiICBEbyBub3RoaW5nIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHM7IGlmIG5vIG51bWJlciBnaXZlbiwiLAorIiAgMTAwIG1pbGxpc2Vjb25kcy4iLCIiIH07CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT1BVU0gKK2V4dGVybiBpbnQgbm9wdXNoOworc3RhdGljIGNoYXIgKmh4eHNoZVtdID0geworIlN5bnRheDogISwgQCwgUlVOLCBQVVNILCBvciBTUEFXTiwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGNvbW1hbmQuIiwKKyIgIEdpdmVzIHRoZSBjb21tYW5kIHRvIHRoZSBsb2NhbCBvcGVyYXRpbmcgc3lzdGVtJ3MgY29tbWFuZCBwcm9jZXNzb3IsIGFuZCIsCisiICBkaXNwbGF5cyB0aGUgcmVzdWx0cyBvbiB0aGUgc2NyZWVuLiAgSWYgdGhlIGNvbW1hbmQgaXMgb21pdHRlZCwgZW50ZXJzIHRoZSIsCisiICBzeXN0ZW0ncyBjb21tYW5kIGxpbmUgaW50ZXJwcmV0ZXIgb3Igc2hlbGw7IGV4aXQgZnJvbSBpdCAodGhlIGNvbW1hbmQgZm9yIiwKKyIgIHRoaXMgaXMgdXN1YWxseSBFWElUIG9yIFFVSVQgb3IgTE9HT1VUKSB0byByZXR1cm4gdG8gS2VybWl0LiIsCisiIgorfTsKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworI2lmbmRlZiBOT1hNSVQKK3N0YXRpYyBjaGFyICpoeHh4bWl0W10gPSB7CisiU3ludGF4OiBUUkFOU01JVCBbIHN3aXRjaGVzIF0gZmlsZW5hbWUiLAorIiAgU2VuZHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSwgd2l0aG91dCBhbnkgZXJyb3IgY2hlY2tpbmcgb3IgY29ycmVjdGlvbiwiLAorIiAgdG8gdGhlIGNvbXB1dGVyIG9uIHRoZSBvdGhlciBlbmQgb2YgeW91ciBTRVQgTElORSBvciBTRVQgSE9TVCBjb25uZWN0aW9uIiwKKyIgIChvciBpZiBDLUtlcm1pdCBpcyBpbiByZW1vdGUgbW9kZSwgZGlzcGxheXMgaXQgb24gdGhlIHNjcmVlbikuICBUaGUiLAorIiAgZmlsZW5hbWUgaXMgdGhlIG5hbWUgb2YgYSBzaW5nbGUgZmlsZSAobm8gd2lsZGNhcmRzKSB0byBiZSBzZW50IG9yLCBpZiIsCisiICB0aGUgL1BJUEUgc3dpdGNoIGlzIGluY2x1ZGVkLCB0aGUgbmFtZSBvZiBhIGNvbW1hbmQgd2hvc2Ugb3V0cHV0IGlzIHRvIGJlIiwKKyIgIHNlbnQuIiwKKyIgIiwKKyIgIFRoZSBmaWxlIGlzIHNlbnQgYWNjb3JkaW5nIHRvIHlvdXIgY3VycmVudCBGSUxFIFRZUEUgc2V0dGluZyAoQklOQVJZIG9yIiwKKyIgIFRFWFQpLCB3aGljaCB5b3UgY2FuIG92ZXJyaWRlIHdpdGggYSAvQklOQVJZIG9yIC9URVhUIHN3aXRjaCB3aXRob3V0IiwKKyIgIGNoYW5naW5nIHRoZSBnbG9iYWwgc2V0dGluZy4gIEluIHRleHQgbW9kZSwgaXQgaXMgc2VudCBhIGxpbmUgYXQgYSB0aW1lLCIsCisiICB3aXRoIGNhcnJpYWdlIHJldHVybiBhdCB0aGUgZW5kIG9mIGVhY2ggbGluZSAoYXMgaWYgeW91IHdlcmUgdHlwaW5nIGl0IGF0IiwKKyIgIHlvdXIga2V5Ym9hcmQpLCBhbmQgQy1LZXJtaXQgd2FpdHMgZm9yIGEgbGluZWZlZWQgdG8gZWNobyBiZWZvcmUgc2VuZGluZyIsCisiICB0aGUgbmV4dCBsaW5lOyB1c2UgL05PV0FJVCB0byBlbGltaW5hdGUgdGhlIGZlZWRiYWNrIHJlcXVpcmVtZW50LiAgSW4iLAorIiAgYmluYXJ5IG1vZGUsIGl0IGlzIHNlbnQgYSBjaGFyYWN0ZXIgYXQgYSB0aW1lLCB3aXRoIG5vIGZlZWRiYWNrIHJlcXVpcmVkLiIsCisiICIsCisiICBOb3JtYWxseSB0aGUgdHJhbnNtaXR0ZWQgbWF0ZXJpYWwgaXMgZWNob2VkIHRvIHlvdXIgc2NyZWVuLiAgVXNlIFNFVCIsCisiICBUUkFOU01JVCBFQ0hPIE9GRiBvciB0aGUgL05PRUNITyBzd2l0Y2ggdG8gc3VwcHJlc3MgZWNob2luZy4gIE5vdGUgdGhhdCIsCisiICBUUkFOU01JVCAvTk9FQ0hPIC9OT1dBSVQgL0JJTkFSWSBpcyBhIHNwZWNpYWwgY2FzZSwgdGhhdCBtb3JlIG9yIGxlc3MiLAorIiAgYmxhc3RzIHRoZSBmaWxlIG91dCBhdCBmdWxsIHNwZWVkLiIsCisiICIsCisjaWZuZGVmIE5PQ1NFVFMKKyIgIENoYXJhY3RlciBzZXRzIGFyZSB0cmFuc2xhdGVkIGFjY29yZGluZyB0byB5b3VyIGN1cnJlbnQgRklMRSBhbmQgVEVSTUlOQUwiLAorIiAgQ0hBUkFDVEVSLVNFVCBzZXR0aW5ncyB3aGVuIFRSQU5TTUlUIGlzIGluIHRleHQgbW9kZS4gIEluY2x1ZGUgL1RSQU5TUEFSRU5UIgorLAorIiAgdG8gZGlzYWJsZSBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGluIHRleHQgbW9kZSAoL1RSQU5TUEFSRU5UIGltcGxpZXMiLAorIiAgL1RFWFQpLiIsCisiICIsCisjZW5kaWYgLyogTk9DU0VUUyAqLworIiAgVGhlcmUgY2FuIGJlIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBvdGhlciBjb21wdXRlciB3aWxsIHJlY2VpdmUgdGhlIGZpbGUiLAorIiAgY29ycmVjdGx5IGFuZCBjb21wbGV0ZWx5LiAgQmVmb3JlIHlvdSBzdGFydCB0aGUgVFJBTlNNSVQgY29tbWFuZCwgeW91IiwKKyIgIG11c3QgcHV0IHRoZSBvdGhlciBjb21wdXRlciBpbiBkYXRhIGNvbGxlY3Rpb24gbW9kZSwgZm9yIGV4YW1wbGUgYnkiLAorIiAgc3RhcnRpbmcgYSB0ZXh0IGVkaXRvci4gIFRSQU5TTUlUIG1heSBiZSBpbnRlcnJ1cHRlZCBieSBDdHJsLUMuICBTeW5vbnltOiIsCisiICBYTUlULiAgU2VlIEhFTFAgU0VUIFRSQU5TTUlUIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLiIsCisiIiB9OworI2VuZGlmIC8qIE5PWE1JVCAqLworCisjaWZuZGVmIE5PQ1NFVFMKK3N0YXRpYyBjaGFyICpoeHh4bGFbXSA9IHsKKyJTeW50YXg6IFRSQU5TTEFURSBmaWxlMSBjczEgY3MyIFsgZmlsZTIgXSIsCisiICBUcmFuc2xhdGVzIGZpbGUxIGZyb20gdGhlIGNoYXJhY3RlciBzZXQgY3MxIGludG8gdGhlIGNoYXJhY3RlciBzZXQgY3MyIiwKKyIgIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBmaWxlMi4gIFRoZSBjaGFyYWN0ZXIgc2V0cyBjYW4gYmUgYW55IG9mIiwKKyIgIEMtS2VybWl0J3MgZmlsZSBjaGFyYWN0ZXIgc2V0cy4gIElmIGZpbGUyIGlzIG9taXR0ZWQsIHRoZSB0cmFuc2xhdGlvbiIsCisiICBpcyBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi4gIEFuIGFwcHJvcHJpYXRlIGludGVybWVkaWF0ZSBjaGFyYWN0ZXItc2V0IiwKKyIgIGlzIGNob3NlbiBhdXRvbWF0aWNhbGx5LCBpZiBuZWNlc3NhcnkuICBTeW5vbnltOiBYTEFURS4gIEV4YW1wbGU6IiwKKyIgIiwKKyIgICAgVFJBTlNMQVRFIGxhc2FnbmEubGF0IGxhdGluMSBpdGFsaWFuIGxhc2FnbmEubnJjIiwKKyIgIiwKKyIgIE11bHRpcGxlIGZpbGVzIGNhbiBiZSB0cmFuc2xhdGVkIGlmIGZpbGUyIGlzIGEgZGlyZWN0b3J5IG9yIGRldmljZSBuYW1lLCIsCisiICByYXRoZXIgdGhhbiBhIGZpbGVuYW1lLCBvciBpZiBmaWxlMiBpcyBvbWl0dGVkLiIsCisiIiB9OworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmbmRlZiBOT1NQTAorc3RhdGljIGNoYXIgKmh4eHdhaVtdID0geworIlN5bnRheDogV0FJVCB7IG51bWJlci1vZi1zZWNvbmRzLCBoaDptbTpzcyB9IFsgPHdoYXQ+IF0iLAorIiAiLAorIkV4YW1wbGVzOiIsCisiICB3YWl0IDUgY2QgY3RzIiwKKyIgIHdhaXQgMjM6NTk6NTkgY2QiLAorIiAiLAorIiAgV2FpdHMgdXAgdG8gdGhlIGdpdmVuIG51bWJlciBvZiBzZWNvbmRzIG9yIHRoZSBnaXZlbiB0aW1lIG9mIGRheSBmb3IgdGhlIiwKKyIgIHNwZWNpZmllZCBpdGVtIG9yIGV2ZW50LCB3aGljaCBjYW4gYmUgRklMRSwgdGhlIG5hbWUocykgb2Ygb25lIG9yIG1vcmUiLAorIiAgbW9kZW0gc2lnbmFscywgb3Igbm90aGluZy4gIElmIG5vdGhpbmcgaXMgc3BlY2lmaWVkLCBXQUlUIGFjdHMgbGlrZSBTTEVFUC4iLAorIiAgSWYgb25lIG9yIG1vcmUgbW9kZW0gc2lnbmFsIG5hbWVzIGFyZSBnaXZlbiwgS2VybWl0IHdhaXRzIGZvciB0aGUgc3BlY2lmaWVkIgorLAorIiAgbW9kZW0gc2lnbmFscyB0byBhcHBlYXIgb24gdGhlIHNlcmlhbCBjb21tdW5pY2F0aW9uIGRldmljZS4iLAorIiAgU2V0cyBGQUlMVVJFIGlmIHRoZSBzaWduYWxzIGRvIG5vdCBhcHBlYXIgaW4gdGhlIGdpdmVuIHRpbWUgb3IgaW50ZXJydXB0ZWQiLAorIiAgZnJvbSB0aGUga2V5Ym9hcmQgZHVyaW5nIHRoZSB3YWl0aW5nIHBlcmlvZC4iLAorIiAiLAorIlNpZ25hbHM6IiwKKyIgIGNkICA9IENhcnJpZXIgRGV0ZWN0OyIsCisiICBkc3IgPSBEYXRhc2V0IFJlYWR5OyIsCisiICBjdHMgPSBDbGVhciBUbyBTZW5kOyIsCisiICByaSAgPSBSaW5nIEluZGljYXRlLiIsCisiICIsCisiSWYgeW91IHdhbnQgS2VybWl0IHRvIHdhaXQgZm9yIGEgZmlsZSBldmVudCwgdGhlbiB0aGUgc3ludGF4IGlzOiIsCisiICIsCisiICBXQUlUIDx0aW1lPiBGSUxFIHsgQ1JFQVRJT04sIERFTEVUSU9OLCBNT0RJRklDQVRJT04gfSA8ZmlsZW5hbWU+IiwKKyIgIiwKKyJ3aGVyZSA8dGltZT4gaXMgYXMgYWJvdmUsIGFuZCA8ZmlsZW5hbWU+IGlzIHRoZSBuYW1lIG9mIGEgc2luZ2xlIGZpbGUuIiwKKyJLZXJtaXQgd2FpdHMgdXAgdG8gdGhlIGdpdmVuIGFtb3VudCBvZiB0aW1lIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IHRvIG9jY3VyIiwKKyJ3aXRoIHRoZSBzcGVjaWZpZWQgZmlsZSwgc3VjY2VlZHMgaWYgaXQgZG9lcywgZmFpbHMgaWYgaXQgZG9lc24ndC4iLAorIiIgfTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCitzdGF0aWMgY2hhciAqaHh4d3JpW10gPSB7CisiU3ludGF4OiBXUklURSBuYW1lIHRleHQiLAorIiAgV3JpdGVzIHRoZSBnaXZlbiB0ZXh0IHRvIHRoZSBuYW1lZCBsb2cgb3IgZmlsZS4gIFRoZSB0ZXh0IHRleHQgbWF5IGluY2x1ZGUiLAorIiAgYmFja3NsYXNoIGNvZGVzLCBhbmQgaXMgbm90IHRlcm1pbmF0ZWQgYnkgYSBuZXdsaW5lIHVubGVzcyB5b3UgaW5jbHVkZSB0aGUiLAorIiAgYXBwcm9wcmlhdGUgY29kZS4gIFRoZSBuYW1lIHBhcmFtZXRlciBjYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6IiwKKyIgIiwKKyIgICBERUJVRy1MT0ciLAorIiAgIEVSUk9SIChzdGFuZGFyZCBlcnJvcikiLAorI2lmbmRlZiBOT1NQTAorIiAgIEZJTEUgKHRoZSBPUEVOIFdSSVRFLCBPUEVOICFXUklURSwgb3IgT1BFTiBBUFBFTkQgZmlsZSwgc2VlIEhFTFAgT1BFTikiLAorI2VuZGlmIC8qIE5PU1BMICovCisiICAgUEFDS0VULUxPRyIsCisiICAgU0NSRUVOIChjb21wYXJlIHdpdGggRUNITykiLAorI2lmbmRlZiBOT0xPQ0FMCisiICAgU0VTU0lPTi1MT0ciLAorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyIgICBUUkFOU0FDVElPTi1MT0ciLCAiIiB9OworCisjaWZuZGVmIE5PRElBTAorc3RhdGljIGNoYXIgKmh4eGxvb2tbXSA9IHsgIlN5bnRheDogTE9PS1VQIG5hbWUiLAorIiAgTG9va3MgdXAgdGhlIGdpdmVuIG5hbWUgaW4gdGhlIGRpYWxpbmcgZGlyZWN0b3J5IG9yIGRpcmVjdG9yaWVzLCBpZiBhbnksIiwKKyIgIHNwZWNpZmllZCBpbiB0aGUgbW9zdCByZWNlbnQgU0VUIERJQUwgRElSRUNUT1JZIGNvbW1hbmQuICBFYWNoIG1hdGNoaW5nIiwKKyIgIGVudHJ5IGlzIHNob3duLCBhbG9uZyB3aXRoIGFueSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCB3b3VsZCBiZSBhcHBsaWVkIHRvIiwKKyIgIHBvcnRhYmxlLWZvcm1hdCBlbnRyaWVzIGJhc2VkIG9uIHlvdXIgbG9jYWxlLiAgSEVMUCBESUFMLCBIRUxQIFNFVCBESUFMIiwKKyIgIGZvciBmdXJ0aGVyIGluZm8uIiwKKyIiCit9OworCitzdGF0aWMgY2hhciAqaHh4YW5zd1tdID0geyAiU3ludGF4OiAgQU5TV0VSIFsgPHNlY29uZHM+IF0iLAorI2lmZGVmIE9TMgorIiAgV2FpdHMgZm9yIGEgbW9kZW0gY2FsbCB0byBjb21lIGluLiAgUHJpb3IgU0VUIE1PREVNIFRZUEUgYW5kIFNFVCBQT1JUIiwKKyNlbHNlCisiICBXYWl0cyBmb3IgYSBtb2RlbSBjYWxsIHRvIGNvbWUgaW4uICBQcmlvciBTRVQgTU9ERU0gVFlQRSBhbmQgU0VUIExJTkUiLAorI2VuZGlmIC8qIE9TMiAqLworIiAgcmVxdWlyZWQuICBJZiA8c2Vjb25kcz4gaXMgMCBvciBub3Qgc3BlY2lmaWVkLCBLZXJtaXQgd2FpdHMgZm9yZXZlciBvciIsCisiICB1bnRpbCBpbnRlcnJ1cHRlZCwgb3RoZXJ3aXNlIEtlcm1pdCB3YWl0cyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNlY29uZHMuIiwKKyIgIFRoZSBBTlNXRVIgY29tbWFuZCBwdXRzIHRoZSBtb2RlbSBpbiBhdXRvYW5zd2VyIG1vZGUuICBTdWJzZXF1ZW50IERJQUwiLAorIiAgY29tbWFuZHMgd2lsbCBhdXRvbWF0aWNhbGx5IHB1dCBpdCAoYmFjaykgaW4gb3JpZ2luYXRlIG1vZGUuICBTSE9XIE1PREVNLCIsCisiICBIRUxQIFNFVCBNT0RFTSBmb3IgbW9yZSBpbmZvLiIsCisiIgorfTsKKworc3RhdGljIGNoYXIgKmh4eGRpYWxbXSA9IHsgIlN5bnRheDogIERJQUwgcGhvbmVudW1iZXIiLAorIkV4YW1wbGU6IERJQUwgNzY1NDMyMSIsCisiICBcCitEaWFscyBhIG51bWJlciB1c2luZyBhbiBhdXRvZGlhbCBtb2RlbS4gIEZpcnN0IHlvdSBtdXN0IFNFVCBNT0RFTSBUWVBFLCB0aGVuIiwKKyNpZmRlZiBPUzIKKyIgIFNFVCBQT1JUIChvciBpbiBXaW5kb3dzIG9ubHksIFNFVCBQT1JUIFRBUEkgaW5zdGVhZCBvZiBTRVQgTU9ERU0gVFlQRSBhbmQiLAorIiAgU0VUIExJTkUpLCB0aGVuIFNFVCBTUEVFRC4gVGhlbiBnaXZlIHRoZSBESUFMIGNvbW1hbmQsIGluY2x1ZGluZyB0aGUgcGhvbmUiLAorI2Vsc2UKKyIgIFNFVCBMSU5FLCB0aGVuIFNFVCBTUEVFRC4gIFRoZW4gZ2l2ZSB0aGUgRElBTCBjb21tYW5kLCBpbmNsdWRpbmcgdGhlIHBob25lIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyIgIG51bWJlciwgZm9yIGV4YW1wbGU6IiwKKyIgIiwKKyIgICBESUFMIDc2NTQzMjEiLAorI2lmZGVmIE5FVENPTk4KKyIgIiwKKyIgIElmIHRoZSBtb2RlbSBpcyBvbiBhIG5ldHdvcmsgbW9kZW0gc2VydmVyLCBTRVQgSE9TVCBmaXJzdCwgdGhlbiBTRVQgTU9ERU0iLAorIiAgVFlQRSwgdGhlbiBESUFMLiIsCisjZW5kaWYgLyogTkVUQ09OTiAqLworIiAiLAorIklmIHlvdSBnaXZlIHRoZSBESUFMIGNvbW1hbmQgaW50ZXJhY3RpdmVseSBhdCB0aGUgS2VybWl0IHByb21wdCwgYW5kIHRoZSIsCisiY2FsbCBpcyBwbGFjZWQgc3VjY2Vzc2Z1bGx5LCBLZXJtaXQgYXV0b21hdGljYWxseSBlbnRlcnMgQ09OTkVDVCBtb2RlLiIsCisiSWYgdGhlIERJQUwgY29tbWFuZCBpcyBnaXZlbiBmcm9tIGEgbWFjcm8gb3IgY29tbWFuZCBmaWxlLCBLZXJtaXQgcmVtYWlucyIsCisiaW4gY29tbWFuZCBtb2RlIGFmdGVyIHRoZSBjYWxsIGlzIHBsYWNlZCwgc3VjY2Vzc2Z1bGx5IG9yIG5vdC4gIFlvdSBjYW4iLAorImNoYW5nZSB0aGlzIGJlaGF2aW9yIHdpdGggdGhlIFNFVCBESUFMIENPTk5FQ1QgY29tbWFuZC4iLAorIiAiLAorIklmIHRoZSBwaG9uZW51bWJlciBzdGFydHMgd2l0aCBhIGxldHRlciwgYW5kIGlmIHlvdSBoYXZlIHVzZWQgdGhlIFNFVCBESUFMIiwKKyJESVJFQ1RPUlkgY29tbWFuZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpYWxpbmctZGlyZWN0b3J5IGZpbGVzLCBLZXJtaXQiLAorImxvb2tzIGl0IHVwIGluIHRoZSBnaXZlbiBmaWxlKHMpOyBpZiBpdCBpcyBmb3VuZCwgdGhlIG5hbWUgaXMgcmVwbGFjZWQgYnkiLAorInRoZSBudW1iZXIgb3IgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUuICBJZiBpdCBpcyBub3QgZm91bmQsIHRoZSIsCisibmFtZSBpcyBzZW50IHRvIHRoZSBtb2RlbSBsaXRlcmFsbHkuIiwKKyIgIiwKKyJJZiB0aGUgcGhvbmVudW1iZXIgc3RhcnRzIHdpdGggYW4gZXF1YWxzIHNpZ24gKFwiPVwiKSwgdGhpcyBmb3JjZXMgdGhlIHBhcnQiLAorImFmdGVyIHRoZSA9IHRvIGJlIHNlbnQgbGl0ZXJhbGx5IHRvIHRoZSBtb2RlbSwgZXZlbiBpZiBpdCBzdGFydHMgd2l0aCBhIiwKKyJsZXR0ZXIsIHdpdGhvdXQgYW55IGRpcmVjdG9yeSBsb29rdXAuIiwKKyIgIiwKKyJZb3UgY2FuIGFsc28gZ2l2ZSBhIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyBlbmNsb3NlZCBpbiBicmFjZXMsIGUuZzoiLAorIiAiLAorIiAgZGlhbCB7ezc2NTQzMjF9ezg3NjU0MzJ9eysxICgyMTIgNTU1LTEyMTJ9fSIsCisiICIsCisiKEVhY2ggbnVtYmVyIGlzIGVuY2xvc2VkIGluIGJyYWNlcyBhbmQgdGhlIGVudGlyZSBsaXN0IGlzIGFsc28gZW5jbG9zZWQgaW4iLAorImJyYWNlcy4pICBJbiB0aGlzIGNhc2UsIGVhY2ggbnVtYmVyIGlzIHRyaWVkIHVudGlsIHRoZXJlIGlzIGFuIGFuc3dlci4gIFRoZSIsCisicGhvbmUgbnVtYmVycyBpbiB0aGlzIGtpbmQgb2YgbGlzdCBjYW4gbm90IGJlIG5hbWVzIG9mIGRpYWxpbmcgZGlyZWN0b3J5IiwKKyJlbnRyaWVzLiIsCisiICIsCisiQSBkaWFsaW5nIGRpcmVjdG9yeSBpcyBhIHBsYWluIHRleHQgZmlsZSwgb25lIGVudHJ5IHBlciBsaW5lOiIsCisiICIsCisiICBuYW1lICBwaG9uZW51bWJlciAgOyAgY29tbWVudHMiLAorIiAiLAorImZvciBleGFtcGxlOiIsCisiICIsCisiICB3b3JrICAgIDk4NzY1NDMgICAgICAgICAgICAgIDsgVGhpcyBpcyBhIGNvbW1lbnQiLAorIiAgZS1tYWlsICArMSAgKDIxMikgNTU1IDQzMjEgICA7IE15IGVsZWN0cm9uaWMgbWFpbGJveCIsCisiICBnZXJtYW55ICs0OSAoNTExKSA1NTUgMTIzNCAgIDsgT3VyIGJyYW5jaCBpbiBIYW5vdmVyIiwKKyIgIiwKKyJJZiBhIHBob25lIG51bWJlciBzdGFydHMgd2l0aCArLCB0aGVuIGl0IG11c3QgaW5jbHVkZSBjb3VudHJ5IGNvZGUgYW5kIiwKKyJhcmVhIGNvZGUsIGFuZCBDLUtlcm1pdCB3aWxsIHRyeSB0byBoYW5kbGUgdGhlc2UgYXBwcm9wcmlhdGVseSBiYXNlZCBvbiIsCisidGhlIGN1cnJlbnQgbG9jYWxlIChIRUxQIFNFVCBESUFMIGZvciBmdXJ0aGVyIGluZm8pOyB0aGVzZSBhcmUgY2FsbGVkIiwKKyJQT1JUQUJMRSBlbnRyaWVzLiAgSWYgaXQgZG9lcyBub3Qgc3RhcnQgd2l0aCArLCBpdCBpcyBkaWFsZWQgbGl0ZXJhbGx5LiIsCisiICIsCisiSWYgbW9yZSB0aGFuIG9uZSBlbnRyeSBpcyBmb3VuZCB3aXRoIHRoZSBzYW1lIG5hbWUsIEtlcm1pdCBkaWFscyBhbGwgb2YiLAorInRoZW0gdW50aWwgdGhlIGNhbGwgaXMgY29tcGxldGVkOyBpZiB0aGUgZW50cmllcyBhcmUgaW4gcG9ydGFibGUgZm9ybWF0LCIsCisiS2VybWl0IGRpYWxzIHRoZW0gaW4gY2hlYXAtdG8tZXhwZW5zaXZlIG9yZGVyOiBpbnRlcm5hbCwgdGhlbiBsb2NhbCwgdGhlbiIsCisibG9uZy1kaXN0YW5jZSwgdGhlbiBpbnRlcm5hdGlvbmFsLCBiYXNlZCBvbiBpdHMga25vd2xlZGdlIG9mIHlvdXIgbG9jYWwiLAorImNvdW50cnkgY29kZSBhbmQgYXJlYSBjb2RlIChzZWUgSEVMUCBTRVQgRElBTCkuIiwKKyIgIiwKKyJTcGVjaWZ5IHlvdXIgZGlhbGluZyBkaXJlY3RvcnkgZmlsZShzKSB3aXRoIHRoZSBTRVQgRElBTCBESVJFQ1RPUlkgY29tbWFuZC4iLAorIiAiLAorI2lmZGVmIE5FVENPTk4KKyJTZWUgYWxzbyBTRVQgRElBTCwgU0VUIE1PREVNLCBTRVQgTElORSwgU0VUIEhPU1QsIFNFVCBTUEVFRCwgUkVESUFMLCBhbmQiLAorIlBESUFMLiIsCisjZWxzZQorIlNlZSBhbHNvIFNFVCBESUFMLCBTRVQgTU9ERU0sIFNFVCBMSU5FLCBTRVQgU1BFRUQsIFBESUFMLCBhbmQgUkVESUFMLiIsCisjZW5kaWYgLyogTkVUQ09OTiAqLworIiIgfTsKKworI2lmZGVmIENLX1RBUEkKK3N0YXRpYyBjaGFyICpoeHh0YXBpW10gPSB7CisiVEFQSSBDT05GSUdVUkUtTElORSA8dGFwaS1saW5lPiIsCisiICBEaXNwbGF5cyB0aGUgVEFQSSBDb25maWd1cmUgTGluZSBEaWFsb2cgYm94IGFuZCBhbGxvd3MgeW91IHRvIiwKKyIgIGFsdGVyIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgPHRhcGktbGluZT4uIiwKKyIgIiwKKyJUQVBJIERJQUxJTkctUFJPUEVSVElFUyIsCisiICBEaXNwbGF5cyB0aGUgVEFQSSBEaWFsaW5nIFByb3BlcnRpZXMgKGxvY2F0aW9ucykgRGlhbG9nIGJveC4gIFRoZSIsCisiICBEaWFsaW5nIHJ1bGVzIG1heSBiZSBjaGFuZ2VkIGFuZCBsb2NhdGlvbnMgY3JlYXRlZCBhbmQgZGVsZXRlZC4iLAorIiAgV2hlbiB0aGUgZGlhbG9nIGJveCBpcyBjbG9zZWQsIEstOTUgaW1wb3J0cyB0aGUgY3VycmVudCBEaWFsaW5nIiwKKyIgIFByb3BlcnRpZXMnIExvY2F0aW9uIGludG8gdGhlIEtlcm1pdCBESUFMIGNvbW1hbmQgc2V0dGluZ3MuIiwKKyIifTsKKworc3RhdGljIGNoYXIgKmh4eXRhcGlbXSA9IHsKKyJTRVQgVEFQSSBMSU5FIDx0YXBpLWxpbmU+IiwKKyIgIE9wZW5zIGEgVEFQSSBkZXZpY2UgZm9yIHVzZSBieSBLZXJtaXQuIiwKKyIgIiwKKyJTRVQgVEFQSSBNT0RFTS1ESUFMSU5HIHtPTiwgW09GRl19IiwKKyIgIElmIFRBUEkgTU9ERU0tRElBTElORyBpcyBPRkYgd2hlbiBTRVQgVEFQSSBMSU5FIGlzIGlzc3VlZCwgS2VybWl0IG9wZW5zIiwKKyIgIHRoZSBUQVBJIGRldmljZSBkaXJlY3RseSBhcyBhIFwicmF3IHBvcnRcIi4gIFRoZSBkZXZpY2UgaXMgdW5hdmFpbGFibGUgdG8iLAorIiAgb3RoZXIgYXBwbGljYXRpb25zIGFuZCBLZXJtaXQgcGVyZm9ybXMgZGlhbGluZyBmdW5jdGlvbnMgdXNpbmcgaXRzIiwKKyIgIGJ1aWx0LWluIGRpYWxpbmcgYW5kIG1vZGVtIGRhdGFiYXNlcy4gIElmIFRBUEkgTU9ERU0tRElBTElORyBpcyBPTiwgVEFQSSIsCisiICBoYW5kbGVzIGFsbCBkaWFsaW5nIGZ1bmN0aW9ucyBhbmQgdGhlIHBvcnQgbWF5IGJlIHNoYXJlZCB3aXRoIG90aGVyIiwKKyIgIGFwcGxpY2F0aW9ucyB3aGVuIGEgY2FsbCBpbiBub3QgYWN0aXZlLiAgV2hlbiBUQVBJIE1PREVNLURJQUxJTkcgaXMgT0ZGLCIsCisiICBTRVQgTU9ERU0gVFlQRSBUQVBJIEtlcm1pdCB1c2VzIHRoZSBUQVBJIG1vZGVtIGNvbW1hbmRzIGltcG9ydGVkIGZyb20gdGhlIiwKKyIgIFdpbmRvd3MgUmVnaXN0cnkgZHVyaW5nIHRoZSBwcmV2aW91cyBTRVQgVEFQSSBMSU5FIGNhbGwuIiwKKyIgIiwKKyJTRVQgVEFQSSBMT0NBVElPTiA8dGFwaS1sb2NhdGlvbj4iLAorIiAgU3BlY2lmaWVzIHRoZSBUQVBJIGxvY2F0aW9uIHRvIG1ha2UgY3VycmVudCBmb3IgdGhlIGVudGlyZSBzeXN0ZW0uICBUaGUiLAorIiAgPHRhcGktbG9jYXRpb24+J3MgZGlhbGluZyBwcm9wZXJ0aWVzIGFyZSBpbXBvcnRlZCBpbnRvIEtlcm1pdCdzIFNFVCBESUFMIiwKKyIgIGNvbW1hbmQgZGF0YWJhc2UuIiwKKyIgIiwKKyJTRVQgVEFQSSBQSE9ORS1OVU1CRVItQ09OVkVSU0lPTlMge09OLCBPRkYsIFtBVVRPXX0iLAorIiAgQ29udHJvbHMgd2hldGhlciB0aGUgcGhvbmUgbnVtYmVyIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgYnkgVEFQSSAoT04pIiwKKyIgIG9yIGJ5IEtlcm1pdCAoT0ZGKSwgb3IgYWNjb3JkaW5nIHRoZSB0eXBlIG9mIHBvcnQgdGhhdCB3YXMgc2VsZWN0ZWQiLAorIiAgKEFVVE8pOyBBVVRPIGlzIHRoZSBkZWZhdWx0LCBhbmQgaXMgZXF1aXZhbGVudCB0byBPTiBpZiB0aGUgY3VycmVudCIsCisiICBMSU5FL1BPUlQgaXMgYSBUQVBJIGRldmljZSBhbmQgVEFQSSBNT0RFTS1ESUFMSU5HIGlzIE9OLCBPRkYgb3RoZXJ3aXNlLiIsCisiICIsCisiU0VUIFRBUEkgTU9ERU0tTElHSFRTIHtbT05dLCBPRkZ9IiwKKyIgIERpc3BsYXlzIGEgbW9kZW0gbGlnaHRzIGluZGljYXRvciBvbiB0aGUgV2luZG93cyA5NSBUYXNrYmFyLiAgRG9lcyBub3RoaW5nIiwKKyIgIGluIFdpbmRvd3MgTlQgNC4wLiIsCisiICIsCisiU0VUIFRBUEkgTUFOVUFMLURJQUxJTkcge09OLCBbT0ZGXX0iLAorIiAgRGlzcGxheXMgYSBkaWFsb2cgYm94IGR1cmluZyBkaWFsaW5nIHJlcXVlc3RpbmcgdGhhdCB5b3UgbWFudWFsbHkgZGlhbCB0aGUiLAorIiAgcGhvbmUgYmVmb3JlIGNvbnRpbnVpbmcuICBBcHBsaWVzIG9ubHkgd2hlbiBUQVBJIE1PREVNLURJQUxJTkcgaXMgT04uIiwKKyIgIiwKKyJTRVQgVEFQSSBXQUlULUZPUi1DUkVESVQtQ0FSRC1UT05FIDxzZWNvbmRzPiIsCisiICBTb21lIG1vZGVtcyBkb24ndCBzdXBwb3J0IHRoZSAnJCcgKEJPTkcpIHN5bWJvbCBkdXJpbmcgZGlhbGluZywgd2hpY2giLAorIiAgbWVhbnMgXCJ3YWl0IGZvciBjcmVkaXQgY2FyZCB0b25lIGJlZm9yZSBjb250aW51aW5nLlwiICBJZiBUQVBJIHJlY29nbml6ZXMiLAorIiAgdGhlIG1vZGVtIGFzIG9uZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgQk9ORywgaXQgcmVwbGFjZXMgdGhlICckJyB3aXRoIiwKKyIgIDxzZWNvbmRzPiB3b3J0aCBvZiBwYXVzZXMuICBUaGUgZGVmYXVsdCBpcyA4IHNlY29uZHMuICBUaGlzIGNvbW1hbmQiLAorIiAgYXBwbGllcyBvbmx5IHdoZW4gVEFQSSBNT0RFTS1ESUFMSU5HIGlzIE9OIiwKKyIgIiwKKyJTRVQgVEFQSSBQUkUtRElBTC1URVJNSU5BTCB7T04sIFtPRkZdfSIsCisiU0VUIFRBUEkgUE9TVC1ESUFMLVRFUk1JTkFMIHtPTiwgW09GRl19IiwKKyIgIERpc3BsYXlzIGEgc21hbGwgdGVybWluYWwgd2luZG93IHRoYXQgbWF5IGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUiLAorIiAgbW9kZW0gb3IgdGhlIGhvc3QgcHJpb3IgdG8gb3IgaW1tZWRpYXRlbHkgYWZ0ZXIgZGlhbGluZzsgYXBwbGllcyBvbmx5IHdoZW4iLAorIiAgVEFQSSBNT0RFTS1ESUFMSU5HIGlzIE9OIiwKKyIgIiwKKyJTRVQgVEFQSSBJTkFDVElWSVRZLVRJTUVPVVQgPG1pbnV0ZXM+IiwKKyIgIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1pbnV0ZXMgb2YgaW5hY3Rpdml0eSB0aGF0IG1heSBnbyBieSBiZWZvcmUgVEFQSSIsCisiICBkaXNjb25uZWN0cyB0aGUgbGluZS4gIFRoZSBkZWZhdWx0IGlzIDAgd2hpY2ggbWVhbnMgZGlzYWJsZSB0aGlzIGZ1bmN0aW9uLiIsCisiICBBcHBsaWVzIG9ubHkgd2hlbiBUQVBJIE1PREVNLURJQUxJTkcgaXMgT04uIiwKKyIgIiwKKyJTRVQgVEFQSSBVU0UtV0lORE9XUy1DT05GSUdVUkFUSU9OIHtPTiwgW09GRl19IiwKKyIgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBUQVBJIG1vZGVtIHZhbHVlcyBmb3Igc3BlZWQsIHBhcml0eSwgc3RvcCBiaXRzLCBmbG93IiwKKyIgIGNvbnRyb2wsIGV0Yy4gYXJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCB2YWx1ZXMgc3BlY2lmaWVkIiwKKyIgIHdpdGhpbiBLZXJtaXQtOTUuIiwKKyIgIiwKKyIifTsKKyNlbmRpZiAvKiBDS19UQVBJICovCisKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworI2lmZGVmIFROQ09ERQorc3RhdGljIGNoYXIgKmhteHhpa3NbXSA9IHsKKyJTeW50YXg6IElLUyBbIHN3aXRjaGVzIF0gWyBob3N0IFsgc2VydmljZSBdIF0iLAorIiAgRXN0YWJsaXNoZXMgYSBuZXcgY29ubmVjdGlvbiB0byBhbiBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSBkYWVtb24uIiwKKyIgIEVxdWl2YWxlbnQgdG8gU0VUIE5FVFdPUksgVFlQRSBUQ1AvSVAsIFNFVCBIT1NUIGhvc3QgS0VSTUlUIC9URUxORVQsIiwKKyIgIElGIFNVQ0NFU1MgQ09OTkVDVC4gIElmIGhvc3QgaXMgb21pdHRlZCwgdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24gKGlmIGFueSkiLAorIiAgaXMgcmVzdW1lZC4gIERlcGVuZGluZyBvbiBob3cgS2VybWl0IGhhcyBiZWVuIGJ1aWx0IHN3aXRjaGVzIG1heSBiZSIsCisiICBhdmFpbGFibGUgdG8gcmVxdWlyZSBhIHNlY3VyZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgYW5kIGJpZGlyZWN0aW9uYWwiLAorIiAgZW5jcnlwdGlvbi4gIFNlZSBIRUxQIFNFVCBURUxORVQgZm9yIG1vcmUgaW5mby4iLAorIiAiLAorI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisiIC9BVVRIOjx0eXBlPiBpcyBlcXVpdmFsZW50IHRvIFNFVCBURUxORVQgQVVUSCBUWVBFIDx0eXBlPiBhbmQiLAorIiAgIFNFVCBURUxPUFQgQVVUSCBSRVFVSVJFRCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9ucy4gIElmIHRoZSB0eXBlIiwKKyIgICBpcyBBVVRPLCB0aGVuIFNFVCBURUxPUFQgQVVUSCBSRVFVRVNURUQgaXMgZXhlY3V0ZWQgYW5kIGlmIHRoZSB0eXBlIiwKKyIgICBpcyBOT05FLCB0aGVuIFNFVCBURUxPUFQgQVVUSCBSRUZVU0VEIGlzIGV4ZWN1dGVkLiIsCisiICIsCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisiIC9FTkNSWVBUOjx0eXBlPiBpcyBlcXVpdmFsZW50IHRvIFNFVCBURUxORVQgRU5DUllQVCBUWVBFIDx0eXBlPiIsCisiICAgYW5kIFNFVCBURUxPUFQgRU5DUllQVCBSRVFVSVJFRCBSRVFVSVJFRCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9ucy4iLAorIiAgIElmIHRoZSB0eXBlIGlzIEFVVE8gdGhlbiBTRVQgVEVMT1BUIEFVVEggUkVRVUVTVEVEIFJFUVVFU1RFRCBpcyBleGVjdXRlZCIsCisiICAgYW5kIGlmIHRoZSB0eXBlIGlzIE5PTkUgdGhlbiBTRVQgVEVMT1BUIEVOQ1JZUFQgUkVGVVNFRCBSRUZVU0VEIGlzIiwKKyIgICBleGVjdXRlZC4iLAorIiAiLAorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyIgL1VTRVJJRDpbPG5hbWU+XSIsCisiICAgVGhpcyBzd2l0Y2ggaXMgZXF1aXZhbGVudCB0byBTRVQgTE9HSU4gVVNFUklEIDxuYW1lPiBvciBTRVQgVEVMTkVUIiwKKyIgICBFTlZJUk9OTUVOVCBVU0VSIDxuYW1lPi4gIElmIGEgc3RyaW5nIGlzIGdpdmVuLCBpdCBzZW50IHRvIGhvc3QgZHVyaW5nIiwKKyIgICBUZWxuZXQgbmVnb3RpYXRpb25zOyBpZiB0aGlzIHN3aXRjaCBpcyBnaXZlbiBidXQgdGhlIHN0cmluZyBpcyBvbWl0dGVkLCIsCisiICAgbm8gdXNlciBJRCBpcyBzZW50IHRvIHRoZSBob3N0LiAgSWYgdGhpcyBzd2l0Y2ggaXMgbm90IGdpdmVuLCB5b3VyIiwKKyIgICBjdXJyZW50IFVTRVJJRCB2YWx1ZSwgXFx2KHVzZXJpZCksIGlzIHNlbnQuICBXaGVuIGEgdXNlcmlkIGlzIHNlbnQgdG8gdGhlIiwKKyIgICBob3N0IGl0IGlzIGEgcmVxdWVzdCB0byBsb2dpbiBhcyB0aGUgc3BlY2lmaWVkIHVzZXIuIiwKKyIgIiwKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorIiAvUEFTU1dPUkQ6WzxzdHJpbmc+XSIsCisiICAgVGhpcyBzd2l0Y2ggaXMgZXF1aXZhbGVudCB0byBTRVQgTE9HSU4gUEFTU1dPUkQuICBJZiBhIHN0cmluZyBpcyBnaXZlbiwiLAorIiAgIGl0IGlzIHRyZWF0ZWQgYXMgdGhlIHBhc3N3b3JkIHRvIGJlIHVzZWQgKGlmIHJlcXVpcmVkKSBieSBhbnkgVGVsbmV0IiwKKyIgICBBdXRoZW50aWNhdGlvbiBwcm90b2NvbCAoS2VyYmVyb3MgVGlja2V0IHJldHJpZXZhbCwgU2VjdXJlIFJlbW90ZSIsCisiICAgUGFzc3dvcmQsIG9yIFguNTA5IGNlcnRpZmljYXRlIHByaXZhdGUga2V5IGRlY3J5cHRpb24uKSAgSWYgbm8gcGFzc3dvcmQiLAorIiAgIHN3aXRjaCBpcyBzcGVjaWZpZWQgYSBwcm9tcHQgaXMgaXNzdWVkIHRvIHJlcXVlc3QgdGhlIHBhc3N3b3JkIGlmIG9uZSIsCisiICAgaXMgcmVxdWlyZWQgZm9yIHRoZSBuZWdvdGlhdGVkIGF1dGhlbnRpY2F0aW9uIG1ldGhvZC4iLAorI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisiIn07CisKK3N0YXRpYyBjaGFyICpobXh4dGVsW10gPSB7CisiU3ludGF4OiBURUxORVQgWyBzd2l0Y2hlcyBdIFsgaG9zdCBbIHNlcnZpY2UgXSBdIiwKKyIgIEVxdWl2YWxlbnQgdG8gU0VUIE5FVFdPUksgVFlQRSBUQ1AvSVAsIFNFVCBIT1NUIGhvc3QgWyBzZXJ2aWNlIF0gL1RFTE5FVCwiLAorIiAgSUYgU1VDQ0VTUyBDT05ORUNULiAgSWYgaG9zdCBpcyBvbWl0dGVkLCB0aGUgcHJldmlvdXMgY29ubmVjdGlvbiAoaWYgYW55KSIsCisiICBpcyByZXN1bWVkLiAgRGVwZW5kaW5nIG9uIGhvdyBLZXJtaXQgaGFzIGJlZW4gYnVpbHQgc3dpdGNoZXMgbWF5IGJlIiwKKyIgIGF2YWlsYWJsZSB0byByZXF1aXJlIGEgc2VjdXJlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBhbmQgYmlkaXJlY3Rpb25hbCIsCisiICBlbmNyeXB0aW9uLiAgU2VlIEhFTFAgU0VUIFRFTE5FVCBmb3IgbW9yZSBpbmZvLiIsCisiICIsCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyIgL0FVVEg6PHR5cGU+IGlzIGVxdWl2YWxlbnQgdG8gU0VUIFRFTE5FVCBBVVRIIFRZUEUgPHR5cGU+IGFuZCIsCisiICAgU0VUIFRFTE9QVCBBVVRIIFJFUVVJUkVEIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zLiAgSWYgdGhlIHR5cGUiLAorIiAgIGlzIEFVVE8sIHRoZW4gU0VUIFRFTE9QVCBBVVRIIFJFUVVFU1RFRCBpcyBleGVjdXRlZCBhbmQgaWYgdGhlIHR5cGUiLAorIiAgIGlzIE5PTkUsIHRoZW4gU0VUIFRFTE9QVCBBVVRIIFJFRlVTRUQgaXMgZXhlY3V0ZWQuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyIgL0VOQ1JZUFQ6PHR5cGU+IGlzIGVxdWl2YWxlbnQgdG8gU0VUIFRFTE5FVCBFTkNSWVBUIFRZUEUgPHR5cGU+IiwKKyIgICBhbmQgU0VUIFRFTE9QVCBFTkNSWVBUIFJFUVVJUkVEIFJFUVVJUkVEIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zLiIsCisiICAgSWYgdGhlIHR5cGUgaXMgQVVUTyB0aGVuIFNFVCBURUxPUFQgQVVUSCBSRVFVRVNURUQgUkVRVUVTVEVEIGlzIGV4ZWN1dGVkIiwKKyIgICBhbmQgaWYgdGhlIHR5cGUgaXMgTk9ORSB0aGVuIFNFVCBURUxPUFQgRU5DUllQVCBSRUZVU0VEIFJFRlVTRUQgaXMiLAorIiAgIGV4ZWN1dGVkLiIsCisiICIsCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworIiAvVVNFUklEOls8bmFtZT5dIiwKKyIgICBUaGlzIHN3aXRjaCBpcyBlcXVpdmFsZW50IHRvIFNFVCBMT0dJTiBVU0VSSUQgPG5hbWU+IG9yIFNFVCBURUxORVQiLAorIiAgIEVOVklST05NRU5UIFVTRVIgPG5hbWU+LiAgSWYgYSBzdHJpbmcgaXMgZ2l2ZW4sIGl0IHNlbnQgdG8gaG9zdCBkdXJpbmciLAorIiAgIFRlbG5ldCBuZWdvdGlhdGlvbnM7IGlmIHRoaXMgc3dpdGNoIGlzIGdpdmVuIGJ1dCB0aGUgc3RyaW5nIGlzIG9taXR0ZWQsIiwKKyIgICBubyB1c2VyIElEIGlzIHNlbnQgdG8gdGhlIGhvc3QuICBJZiB0aGlzIHN3aXRjaCBpcyBub3QgZ2l2ZW4sIHlvdXIiLAorIiAgIGN1cnJlbnQgVVNFUklEIHZhbHVlLCBcXHYodXNlcmlkKSwgaXMgc2VudC4gIFdoZW4gYSB1c2VyaWQgaXMgc2VudCB0byB0aGUiLAorIiAgIGhvc3QgaXQgaXMgYSByZXF1ZXN0IHRvIGxvZ2luIGFzIHRoZSBzcGVjaWZpZWQgdXNlci4iLAorIiAiLAorI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisiIC9QQVNTV09SRDpbPHN0cmluZz5dIiwKKyIgICBUaGlzIHN3aXRjaCBpcyBlcXVpdmFsZW50IHRvIFNFVCBMT0dJTiBQQVNTV09SRC4gIElmIGEgc3RyaW5nIGlzIGdpdmVuLCIsCisiICAgaXQgaXMgdHJlYXRlZCBhcyB0aGUgcGFzc3dvcmQgdG8gYmUgdXNlZCAoaWYgcmVxdWlyZWQpIGJ5IGFueSBUZWxuZXQiLAorIiAgIEF1dGhlbnRpY2F0aW9uIHByb3RvY29sIChLZXJiZXJvcyBUaWNrZXQgcmV0cmlldmFsLCBTZWN1cmUgUmVtb3RlIiwKKyIgICBQYXNzd29yZCwgb3IgWC41MDkgY2VydGlmaWNhdGUgcHJpdmF0ZSBrZXkgZGVjcnlwdGlvbi4pICBJZiBubyBwYXNzd29yZCIsCisiICAgc3dpdGNoIGlzIHNwZWNpZmllZCBhIHByb21wdCBpcyBpc3N1ZWQgdG8gcmVxdWVzdCB0aGUgcGFzc3dvcmQgaWYgb25lIiwKKyIgICBpcyByZXF1aXJlZCBmb3IgdGhlIG5lZ290aWF0ZWQgYXV0aGVudGljYXRpb24gbWV0aG9kLiIsCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyIifTsKKworc3RhdGljIGNoYXIgKmh4dG9wdFtdID0geworIlRFTE9QVCB7IEFPLCBBWVQsIEJSRUFLLCBDQU5DRUwsIEVDLCBFTCwgRU9GLCBFT1IsIEdBLCBJUCwgRE1BUkssIE5PUCwgU0UsIiwKKyIgICAgICAgICBTVVNQLCBTQiBbIG9wdGlvbiBdLCBETyBbIG9wdGlvbiBdLCBET05UIFsgb3B0aW9uIF0sIiwKKyIgICAgICAgICBXSUxMIFsgb3B0aW9uIF0sIFdPTlQgW29wdGlvbl0gfSIsCisiICBUaGlzIGNvbW1hbmQgbGV0cyB5b3Ugc2VuZCBhbGwgdGhlIFRlbG5ldCBwcm90b2NvbCBjb21tYW5kcy4gIE5vdGUgdGhhdCIsCisiICBjZXJ0YWluIGNvbW1hbmRzIGRvIG5vdCByZXF1aXJlIGEgcmVzcG9uc2UsIGFuZCB0aGVyZWZvcmUgY2FuIGJlIHVzZWQgYXMiLAorIiAgbm9uZGVzdHJ1Y3RpdmUgXCJwcm9iZXNcIiB0byBzZWUgaWYgdGhlIFRlbG5ldCBzZXNzaW9uIGlzIHN0aWxsIG9wZW47IiwKKyIgIGUuZy46IiwKKyIgIiwKKyIgICAgc2V0IGhvc3QgeHl6Y29ycC5jb20iLAorIiAgICAuLi4iLAorIiAgICB0ZWxvcHQgbm9wIiwKKyIgICAgdGVsb3B0IG5vcCIsCisiICAgIGlmIGZhaWwgc3RvcCAxIENvbm5lY3Rpb24gbG9zdCIsCisiICIsCisiICBURUxPUFQgTk9QIGlzIHNlbnQgdHdpY2UgYmVjYXVzZSB0aGUgZmFpbHVyZSBvZiB0aGUgY29ubmVjdGlvbiB3aWxsIG5vdCIsCisiICBiZSBkZXRlY3RlZCB1bnRpbCB0aGUgc2Vjb25kIHNlbmQgaXMgYXR0ZW1wdGVkLiAgVGhpcyBjb21tYW5kIGlzIG1lYW50IiwKKyIgIHByaW1hcmlseSBhcyBhIGRlYnVnZ2luZyB0b29sIGZvciB0aGUgZXhwZXJ0IHVzZXIuIiwKKyIifTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKworI2VuZGlmIC8qIE5PSEVMUCAqLworCisvKiAgRCBPIEggTCBQICAtLSAgR2l2ZSBhIGhlbHAgbWVzc2FnZSAgKi8KKworX1BST1RPVFlQKCBpbnQgZG9oc2V0LCAoaW50KSApOworI2lmbmRlZiBOT0NNREwKK19QUk9UT1RZUCggaW50IGRvaG9wdHMsICh2b2lkKSApOworI2VuZGlmIC8qIE5PQ01ETCAqLworI2lmbmRlZiBOT1NQTAorX1BST1RPVFlQKCBpbnQgZG9oZnVuYywgKGludCkgKTsKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIGZuY3RhYltdOworZXh0ZXJuIGludCBuZnVuY3M7CisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZmRlZiBPUzIKKyNpZm5kZWYgTk9LVkVSQlMKK19QUk9UT1RZUCggaW50IGRvaGt2ZXJiLCAoaW50KSApOworZXh0ZXJuIHN0cnVjdCBrZXl0YWIga3ZlcmJzW107CitleHRlcm4gaW50IG5rdmVyYnM7CisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBOT1NQTAorc3RhdGljIGNoYXIgKiBoeHhkY2xbXSA9IHsKKyJTeW50YXg6IEFSUkFZIHZlcmIgb3BlcmFuZHMuLi4iLAorIiAiLAorIkRlY2xhcmVzIGFycmF5cyBhbmQgcGVyZm9ybXMgdmFyaW91cyBvcGVyYXRpb25zIG9uIHRoZW0uICBBcnJheXMgaGF2ZSIsCisidGhlIGZvbGxvd2luZyBzeW50YXg6IiwKKyIgIiwKKyIgIFxcJmFbbl0iLAorIiAiLAorIndoZXJlIFwiYVwiIGlzIGEgbGV0dGVyIGFuZCBuIGlzIGEgbnVtYmVyIG9yIGEgdmFyaWFibGUgd2l0aCBhIG51bWVyaWMgdmFsdWUiLAorIm9yIGFuIGFyaXRobWV0aWMgZXhwcmVzc2lvbi4gIFRoZSB2YWx1ZSBvZiBhbiBhcnJheSBlbGVtZW50IGNhbiBiZSBhbnl0aGluZyIsCisiYXQgYWxsIC0tIGEgbnVtYmVyLCBhIGNoYXJhY3RlciwgYSBzdHJpbmcsIGEgZmlsZW5hbWUsIGV0Yy4iLAorIiAiLAorIlRoZSBmb2xsb3dpbmcgQVJSQVkgdmVyYnMgYXJlIGF2YWlsYWJsZToiLAorIiAiLAorIlsgQVJSQVkgXSBERUNMQVJFIGFycmF5bmFtZVtuXSBbID0gaW5pdGlhbGl6ZXJzLi4uIF0iLAorIiAgRGVjbGFyZXMgYW4gYXJyYXkgb2YgdGhlIGdpdmVuIHNpemUsIG4uICBUaGUgcmVzdWx0aW5nIGFycmF5IGhhcyBuKzEiLAorIiAgZWxlbWVudHMsIDAgdGhyb3VnaCBuLiAgQXJyYXkgZWxlbWVudHMgY2FuIGJlIHVzZWQganVzdCBsaWtlIGFueSBvdGhlciIsCisiICB2YXJpYWJsZXMuICBJbml0aWFsIHZhbHVlcyBjYW4gYmUgZ2l2ZW4gZm9yIGVsZW1lbnRzIDEsIDIsIC4uLiBieSIsCisiICBpbmNsdWRpbmcgPSBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSB2YWx1ZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4gIElmIHlvdSIsCisiICBvbWl0IHRoZSBzaXplLCB0aGUgYXJyYXkgaXMgc2l6ZWQgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YgaW5pdGlhbGl6ZXJzOyIsCisiICBpZiBub25lIGFyZSBnaXZlbiB0aGUgYXJyYXkgaXMgZGVzdHJveWVkIGFuZCB1bmRlY2xhcmVkIGlmIGl0IGFscmVhZHkiLAorIiAgZXhpc3RlZC4gIFRoZSBBUlJBWSBrZXl3b3JkIGlzIG9wdGlvbmFsLiAgU3lub255bTogWyBBUlJBWSBdIERDTC4iLAorIiAiLAorIlsgQVJSQVkgXSBVTkRFQ0xBUkUgYXJyYXluYW1lIiwKKyIgIERlc3Ryb3lzIGFuZCB1bmRlY2xhcmVzIHRoZSBnaXZlbiBhcnJheS4gIFN5bm9ueW06IEFSUkFZIERFU1RST1kuIiwKKyIgIiwKKyJBUlJBWSBTSE9XIFsgYXJyYXluYW1lIF0iLAorIiAgRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBhcnJheS4gIEEgcmFuZ2Ugc3BlY2lmaWVyIGNhbiBiZSIsCisiICBpbmNsdWRlZCB0byBkaXNwbGF5IGEgc2VnbWVudCBvZiB0aGUgYXJyYXksIGUuZy4gXCJhcnJheSBzaG93IFxcJmFbMToyNF0uXCIiCissCisiICBJZiB0aGUgYXJyYXluYW1lIGlzIG9taXR0ZWQsIGFsbCBkZWNsYXJlZCBhcnJheXMgYXJlIGxpc3RlZCwgYnV0IHRoZWlyIiwKKyIgIGNvbnRlbnRzIGlzIG5vdCBzaG93bi4gIFN5bm9ueW06IFNIT1cgQVJSQVkuIiwKKyIgIiwKKyJBUlJBWSBDTEVBUiBhcnJheW5hbWUiLAorIiAgQ2xlYXJzIGFsbCBlbGVtZW50cyBvZiB0aGUgYXJyYXksIGkuZS4gc2V0cyB0aGVtIHRvIGVtcHR5IHZhbHVlcy4iLAorIiAgWW91IG1heSBpbmNsdWRlIGEgcmFuZ2Ugc3BlY2lmaWVyIHRvIGNsZWFyIGEgc2VnbWVudCBvZiB0aGUgYXJyYXkgcmF0aGVyIiwKKyIgIHRoYW4gdGhlIHdob2xlIGFycmF5LCBlLmcuIFwiYXJyYXkgY2xlYXIgXFwlYVsyMjozOF1cIiIsCisiICIsCisiQVJSQVkgU0VUIGFycmF5bmFtZSB2YWx1ZSIsCisiICBTZXRzIGFsbCBlbGVtZW50cyBvZiB0aGUgYXJyYXkgdG8gdGhlIGdpdmVuIHZhbHVlLiAgWW91IG1heSBzcGVjaWZ5IGEiLAorIiAgcmFuZ2UgdG8gc2V0IGEgc2VnbWVudCBvZiB0aGUgYXJyYXksIGUuZy4gXCJhcnJheSBzZXQgXFwlYVsyOjldIDBcIiIsCisiICIsCisiQVJSQVkgUkVTSVpFIGFycmF5bmFtZSBudW1iZXIiLAorIiAgQ2hhbmdlcyB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gYXJyYXksIHdoaWNoIG11c3QgYWxyZWFkeSBleGlzdCwgdG8gdGhlIiwKKyIgIG51bWJlciBnaXZlbi4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHNpemUsIHRoZSBleHRyYSIsCisiICBlbGVtZW50cyBhcmUgZGlzY2FyZGVkOyBpZiBpdCBpcyBsYXJnZXIsIG5ldyBlbXB0eSBlbGVtZW50cyBhcmUgYWRkZWQuIiwKKyIgIiwKKyJBUlJBWSBDT1BZIGFycmF5MSBhcnJheTIiLAorIiAgQ29weXMgYXJyYXkxIHRvIGFycmF5Mi4gIElmIGFycmF5MiBoYXMgbm90IGJlZW4gZGVjbGFyZWQsIGl0IGlzIGNyZWF0ZWQiLAorIiAgYXV0b21hdGljYWxseS4gIFJhbmdlIHNwZWNpZmllcnMgbWF5IGJlIGdpdmVuIG9uIG9uZSBvciBib3RoIGFycmF5cy4iLAorIiAiLAorIkFSUkFZIExJTksgYXJyYXkxIGFycmEyIiwKKyIgIE1ha2VzIGFycmF5MSBhIGxpbmsgdG8gYXJyYXkyLiIsCisiICIsCisiWyBBUlJBWSBdIFNPUlQgWyBzd2l0Y2hlcyBdIGFycmF5LW5hbWUgWyBhcnJheTIgXSIsCisiICBTb3J0cyB0aGUgZ2l2ZW4gYXJyYXkgbGV4aWNhbGx5IGFjY29yZGluZyB0byB0aGUgc3dpdGNoZXMuICBFbGVtZW50IDAgb2YiLAorIiAgdGhlIGFycmF5IGlzIGV4Y2x1ZGVkIGZyb20gc29ydGluZyBieSBkZWZhdWx0LiAgVGhlIEFSUkFZIGtleXdvcmQgaXMiLAorIiAgb3B0aW9uYWwuICBJZiBhIHNlY29uZCBhcnJheSBuYW1lIGlzIGdpdmVuLCB0aGF0IGFycmF5IGlzIHNvcnRlZCBhY2NvcmRpbmciLAorIiAgdG8gdGhlIGZpcnN0IG9uZS4gIFN3aXRjaGVzOiIsCisiICIsCisiICAvQ0FTRTp7T04sT0ZGfSIsCisiICAgIElmIE9OLCBhbHBoYWJldGljIGNhc2UgbWF0dGVyczsgaWYgT0ZGIGl0IGlzIGlnbm9yZWQuICBJZiB0aGlzIHN3aXRjaCBpcyIsCisiICAgIG9taXR0ZWQsIHRoZSBjdXJyZW50IFNFVCBDQVNFIHNldHRpbmcgYXBwbGllcy4iLAorIiAiLAorIiAgL0tFWTpudW1iZXIiLAorIiAgICBcCitQb3NpdGlvbiAoMS1iYXNlZCBjb2x1bW4gbnVtYmVyKSBhdCB3aGljaCBjb21wYXJpc29ucyBiZWdpbiwgMSBieSBkZWZhdWx0LiIsCisiICIsCisiICAvTlVNRVJJQyIsCisiICAgIFNwZWNpZmllcyBhIG51bWVyaWMgcmF0aGVyIHRoYW4gbGV4aWNhbCBzb3J0LiIsCisiICIsCisiICAvUkFOR0U6bG93WzpoaWdoXSIsCisiICAgIFRoZSByYW5nZSBvZiBlbGVtZW50cywgbG93IHRocm91Z2ggaGlnaCwgdG8gYmUgc29ydGVkLiAgSWYgdGhpcyBzd2l0Y2giLAorIiAgICBpcyBub3QgZ2l2ZW4sIGVsZW1lbnRzIDEgdGhyb3VnaCB0aGUgZGltZW5zaW9uZWQgc2l6ZSBhcmUgc29ydGVkLiAgSWYiLAorIiAgICA6aGlnaCBpcyBvbWl0dGVkLCB0aGUgZGltZW5zaW9uZWQgc2l6ZSBpcyB1c2VkLiAgVG8gaW5jbHVkZSBlbGVtZW50IDAgaW4iLAorIiAgICBhIHNvcnQsIHVzZSAvUkFOR0U6MCAodG8gc29ydCB0aGUgd2hvbGUgYXJyYXkpIG9yIC9SQU5HRTowOm4gKHRvIHNvcnQiLAorIiAgICBlbGVtZW50cyAwIHRocm91Z2ggbikuICBZb3UgY2FuIHVzZSBhIHJhbmdlIHNwZWNpZmllciBpbiB0aGUgYXJyYXkgbmFtZSIsCisiICAgIGluc3RlYWQgb2YgdGhlIC9SQU5HRSBzd2l0Y2guIiwKKyIgIiwKKyIgIC9SRVZFUlNFIiwKKyIgICAgU29ydCBpbiByZXZlcnNlIG9yZGVyLiAgSWYgdGhpcyBzd2l0Y2ggaXMgbm90IGdpdmVuLCB0aGUgYXJyYXkgaXMgc29ydGVkIiwKKyIgICAgaW4gYXNjZW5kaW5nIG9yZGVyLiIsCisiICIsCisiVmFyaW91cyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgYXJyYXkgb3BlcmF0aW9uczsgc2VlIEhFTFAgRlVOQ1RJT04gZm9yIiwKKyJkZXRhaWxzLiAgVGhlc2UgaW5jbHVkZSBcXGZkaW1lbnNpb24oKSwgXFxmYXJyYXlsb29rKCksIFxcZmZpbGVzKCksIFwKK1xcZnNwbGl0KCksIiwKKyJhbmQgbWFueSBtb3JlLiIsCisiIn07CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIFpDT1BZCitzdGF0aWMgY2hhciAqIGhteHhjcHlbXSA9IHsKKyJTeW50YXg6IENPUFkgWyBzd2l0Y2hlcyBdIGZpbGUxIGZpbGUyIiwKKyIgIENvcGllcyB0aGUgc291cmNlIGZpbGUgKGZpbGUxKSB0byB0aGUgZGVzdGluYXRpb24gZmlsZSAoZmlsZTIpLiAgSWYgZmlsZTIiLAorIiAgaXMgYSBkaXJlY3RvcnksIGZpbGUxIGNhbiBjb250YWluIHdpbGRjYXJkcyB0byBkZW5vdGUgYSBncm91cCBvZiBmaWxlcyB0byIsCisiICBiZSBjb3BpZWQgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4gIFN3aXRjaGVzOiIsCisiICIsCisiICAvTElTVCIsCisiICAgIFByaW50IHRoZSBmaWxlbmFtZXMgYW5kIHN0YXR1cyB3aGlsZSBjb3B5aW5nLiAgU3lub255bXM6IC9MT0csIC9WRVJCT1NFIiwKKyIgIiwKKyIgIC9OT0xJU1QiLAorIiAgICBDb3B5IHNpbGVudGx5IChkZWZhdWx0KS4gU3lub255bXM6IC9OT0xPRywgL1FVSUVUIiwKKyIgIiwKKyIgIC9TV0FQLUJZVEVTIiwKKyIgICAgU3dhcCBieXRlcyB3aGlsZSBjb3B5aW5nLiIsCisjaWZuZGVmIE5PU1BMCisiICIsCisiICAvRlJPTUI2NCIsCisiICAgIENvbnZlcnQgZnJvbSBCYXNlNjQgZW5jb2Rpbmcgd2hpbGUgY29weWluZy4iLAorIiAiLAorIiAgL1RPQjY0IiwKKyIgICAgQ29udmVydCB0byBCYXNlNjQgZW5jb2Rpbmcgd2hpbGUgY29weWluZy4iLAorI2VuZGlmIC8qIE5PU1BMICovCisiIgorfTsKKyNlbmRpZiAvKiBaQ09QWSAqLworCisjaWZuZGVmIE5PRlJJTExTCitzdGF0aWMgY2hhciAqIGhteHhyZW5bXSA9IHsKKyNpZmRlZiBMT0NVUworIiAgSWYgTE9DVVMgaXMgUkVNT1RFIG9yIExPQ1VTIGlzIEFVVE8gYW5kIHlvdSBoYXZlIGFuIEZUUCBjb25uZWN0aW9uLCIsCisiICB0aGlzIGNvbW1hbmQgaXMgZXF1aXZhbGVudCB0byBSRU1PVEUgUkVOQU1FIChSUkVOKS4gIE90aGVyd2lzZToiLAorIiAiLAorI2VuZGlmIC8qIExPQ1VTICovCisiU3ludGF4OiBSRU5BTUUgWyBzd2l0Y2hlcyBdIG5hbWUxIG5hbWUyIiwKKyIgIFJlbmFtZXMgdGhlIHNvdXJjZSBmaWxlIChuYW1lMSkgdG8gdGhlIHRhcmdldCBuYW1lMi4gIElmIG5hbWUyIGlzIGEiLAorIiAgZGlyZWN0b3J5LCBuYW1lMSBpcyBhbGxvd2VkIHRvIGNvbnRhaW4gd2lsZGNhcmRzLCBhbmQgdGhlIGZpbGUocykgbWF0Y2hpbmciLAorIiAgbmFtZTEgYXJlIG1vdmVkIHRvIGRpcmVjdG9yeSBuYW1lMiwgc3ViamVjdCB0byBydWxlcyBvZiB0aGUgdW5kZXJseWluZyIsCisiICBvcGVyYXRpbmcgc3lzdGVtIHJlZ2FyZGluZyByZW5hbWluZyBhY3Jvc3MgZGlzayBib3VuZGFyaWVzLCBldGMuICBJZiBuYW1lMiIsCisiICBpcyBub3QgYSBkaXJlY3RvcnksIG5hbWUxIG1heSBub3QgaW5jbHVkZSB3aWxkY2FyZHMsIGFuZCB0aGUgZmlsZSB3aG9zZSIsCisiICBuYW1lIGlzIG5hbWUxIGlzIHJlbmFtZWQgdG8gbmFtZTIuICBTd2l0Y2hlczoiLAorIiAiLAorIiAgL0xJU1QiLAorIiAgICBQcmludCB0aGUgZmlsZW5hbWVzIGFuZCBzdGF0dXMgd2hpbGUgcmVuYW1pbmcuICBTeW5vbnltczogL0xPRywgL1ZFUkJPU0UiLAorIiAiLAorIiAgL05PTElTVCIsCisiICAgIFJlbmFtZSBzaWxlbnRseSAoZGVmYXVsdCkuIFN5bm9ueW1zOiAvTk9MT0csIC9RVUlFVCIsCisiIgorfTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCitzdGF0aWMgY2hhciAqCitjbWRsaGxwW10gPSB7CisiQ29tbWFuZC1saW5lIG9wdGlvbnMgYXJlIGdpdmVuIGFmdGVyIHRoZSBwcm9ncmFtIG5hbWUgaW4gdGhlIHN5c3RlbSIsCisiY29tbWFuZCB0aGF0IHlvdSB1c2UgdG8gc3RhcnQgS2VybWl0LiAgRXhhbXBsZToiLAorIiAiLAorIiBrZXJtaXQgLWkgLXMgb29mYS5leGUiLAorIiAiLAorInRlbGxzIEtlcm1pdCB0byBzZW5kICgtcykgdGhlIGZpbGUgb29mYS5leGUgaW4gYmluYXJ5ICgtaSkgbW9kZS4iLAorIiAiLAorIkNvbW1hbmQtbGluZSBvcHRpb25zIGFyZSBjYXNlLXNlbnNpdGl2ZTsgXCItc1wiIGlzIGRpZmZlcmVudCBmcm9tIFwiLVNcIi4iLAorI2lmZGVmIFZNUworIkluIFZNUywgdXBwZXJjYXNlIG9wdGlvbnMgbXVzdCBiZSBlbmNsb3NlZCBpbiBkb3VibGVxdW90ZXM6ICIsCisiICIsCisiICQga2VybWl0IFwiLVlcIiBcIi1TXCIgLXMgb29mYS50eHQgIiwKKyNlbmRpZiAvKiBWTVMgKi8KKyIgIiwKKyJJZiBhbnkgXCJhY3Rpb24gb3B0aW9uc1wiIGFyZSBpbmNsdWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBLZXJtaXQgZXhpdHMiLAorImFmdGVyIGV4ZWN1dGluZyBpdHMgY29tbWFuZC1saW5lIG9wdGlvbnMuICBJZiAtUyBpcyBpbmNsdWRlZCwgb3Igbm8gYWN0aW9uIiwKKyJvcHRpb25zIHdlcmUgZ2l2ZW4sIEtlcm1pdCBlbnRlcnMgaXRzIGludGVyYWN0aXZlIGNvbW1hbmQgcGFyc2VyIGFuZCIsCisiaXNzdWVzIGl0cyBwcm9tcHQuIiwKKyIgIiwKKyJDb21tYW5kLWxpbmUgb3B0aW9ucyBhcmUgc2luZ2xlIGNoYXJhY3RlcnMgcHJlY2VkZWQgYnkgZGFzaCAoLSkuICBTb21lIiwKKyJyZXF1aXJlIGFuIFwiYXJndW1lbnQsXCIgb3RoZXJzIGRvIG5vdC4gIElmIGFuIGFyZ3VtZW50IGNvbnRhaW5zIHNwYWNlcywgaXQiLAorIm11c3QgYmUgZW5jbG9zZWQgaW4gZG91YmxlcXVvdGVzOiIsCisiICIsCisiIGtlcm1pdCAtcyBcImZpbGVuYW1lIHdpdGggc3BhY2VzXCIiLAorIiAiLAorIlwKK0FuIG9wdGlvbiB0aGF0IGRvZXMgbm90IHJlcXVpcmUgYW4gYXJndW1lbnQgY2FuIGJlIGJ1bmRsZWQgd2l0aCBvdGhlciBvcHRpb25zOiIKKywKKyIgIiwKKyIga2VybWl0IC1RaXMgb29mYS5leGUiLAorIiAiLAorIkV4Y2VwdGlvbnMgdG8gdGhlIHJ1bGVzOiIsCisiICIsCisiIC4gSWYgdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBvcHRpb24gaXMgYSBmaWxlbmFtZSwgS2VybWl0IGV4ZWN1dGVzIGNvbW1hbmRzIiwKKyIgICBmcm9tIHRoZSBmaWxlLiAgQWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBjYW4gZm9sbG93IHRoZSBmaWxlbmFtZS4iLAorIiAiLAorIiAuIFRoZSBzcGVjaWFsIG9wdGlvbiBcIj1cIiAoZXF1YWwgc2lnbikgb3IgXCItLVwiIChkb3VibGUgaHlwaGVuKSBtZWFucyB0byIsCisiICAgdHJlYXQgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgbGluZSBhcyBkYXRhLCByYXRoZXIgdGhhbiBjb21tYW5kczsgdGhpcyIsCisiICAgZGF0YSBpcyBwbGFjZWQgaW4gdGhlIGFyZ3VtZW50IHZlY3RvciBhcnJheSwgXFwmQFtdLCBhbG9uZyB3aXRoIHRoZSBvdGhlciIsCisiICAgaXRlbXMgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIGFsc28gaW4gdGhlIHRvcC1sZXZlbCBcXCUxLi5cXCU5IHZhcmlhYmxlcy4iCissCisiICIsCisjaWZkZWYgS0VSQkFORworIiAuIEEgc2ltaWxhciBvcHRpb24gXCIrXCIgKHBsdXMgc2lnbikgbWVhbnM6IHRoZSBuYW1lIG9mIGEgS2VybWl0IHNjcmlwdCIsCisiICAgZmlsZSBmb2xsb3dzLiAgVGhpcyBmaWxlIGlzIHRvIGJlIGV4ZWN1dGVkLCBhbmQgaXRzIG5hbWUgYXNzaWduZWQgdG8gXFwlMCIsCisiICAgYW5kIFxcJl9bMF0uICBBbGwgc3Vic2VxdWVudCBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFyZSB0byBiZSBpZ25vcmVkIGJ5IiwKKyIgICBLZXJtaXQgYnV0IG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBzY3JpcHQgYXMgXFwlMSwgXFwlMiwgLi4uLCBhcyB3ZWxsIGFzIiwKKyIgICBpbiB0aGUgYXJndW1lbnQtdmVjdG9yIGFycmF5cy4gIFRoZSBpbml0aWFsaXphdGlvbiBmaWxlIGlzIG5vdCBleGVjdXRlZCIsCisiICAgYXV0b21hdGljYWxseSBpbiB0aGlzIGNhc2UuIiwKKyIgIiwKKyNlbmRpZiAvKiBLRVJCQU5HICovCisiIC4gVGhlIC1zIG9wdGlvbiBjYW4gYWNjZXB0IG11bHRpcGxlIGZpbGVuYW1lcywgc2VwYXJhdGVkIGJ5IHNwYWNlcy4iLAorIiAiLAorIiAuIHRoZSAtaiBhbmQgLUogb3B0aW9ucyBhbGxvdyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQsIHRoZSBUQ1AgcG9ydCIsCisiICAgbmFtZSBvciBudW1iZXIuIiwKKyIgIiwKKyJUeXBlIFwiaGVscCBvcHRpb25zIGFsbFwiIHRvIGxpc3QgYWxsIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucy4iLAorIlR5cGUgXCJoZWxwIG9wdGlvbiB4XCIgdG8gc2VlIHRoZSBoZWxwIG1lc3NhZ2UgZm9yIG9wdGlvbiB4LiIsCisiICIsCisiS2VybWl0IGFsc28gb2ZmZXJzIGEgc2VsZWN0aW9uIG9mIFwiZXh0ZW5kZWQgY29tbWFuZC1saW5lXCIgb3B0aW9ucy4iLAorIlRoZXNlIGJlZ2luIHdpdGggdHdvIGRhc2hlcywgZm9sbG93ZWQgYnkgYSBrZXl3b3JkLCBhbmQgdGhlbiwgaWYgdGhlIG9wdGlvbiIsCisiaGFzIGFyZ3VtZW50cywgYSBjb2xvbiAoOikgb3IgZXF1YWwgc2lnbiAoPSkgZm9sbG93ZWQgYnkgdGhlIGFyZ3VtZW50LiIsCisiVW5saWtlIHNpbmdsZS1sZXR0ZXIgb3B0aW9ucywgZXh0ZW5kZWQgb3B0aW9uIGtleXdvcmRzIGFyZW4ndCBjYXNlIHNlbnNpdGl2ZSIsCisiYW5kIHRoZXkgY2FuIGJlIGFiYnJldmlhdGVkIHRvIGFueSBsZW5ndGggdGhhdCBzdGlsbCBkaXN0aW5ndWlzaGVzIHRoZW0gZnJvbSIsCisib3RoZXIgZXh0ZW5kZWQtb3B0aW9uIGtleXdvcmRzLiAgRXhhbXBsZToiLAorIiAiLAorIiAga2VybWl0IC0tYmFubmVyOm9vZmEudHh0IiwKKyIgIiwKKyJ3aGljaCBkZXNpZ25hdGVzIHRoZSBmaWxlIG9vZmEudHh0IHRvIGJlIHByaW50ZWQgdXBvbiBzdGFydHVwLCByYXRoZXIgdGhhbiIsCisidGhlIGJ1aWx0LWluIGJhbm5lciAoZ3JlZXRpbmcpIHRleHQuICBUbyBvYnRhaW4gYSBsaXN0IG9mIGF2YWlsYWJsZSIsCisiZXh0ZW5kZWQgb3B0aW9ucywgdHlwZSBcImhlbHAgZXh0ZW5kZWQtb3B0aW9ucyA/XCIuICBUbyBnZXQgaGVscCBhYm91dCBhbGwiLAorImV4dGVuZGVkIG9wdGlvbnMsIHR5cGUgXCJoZWxwIGV4dGVuZGVkLW9wdGlvbnNcIi4gIFRvIGdldCBoZWxwIGFib3V0IGEiLAorInBhcnRpY3VsYXIgZXh0ZW5kZWQgb3B0aW9uLCB0eXBlIFwiaGVscCBleHRlbmRlZC1vcHRpb24geHh4XCIsIHdoZXJlIFwieHh4XCIiLAorImlzIHRoZSBvcHRpb24ga2V5d29yZC4iLAorI2lmZGVmIENPTU1FTlQKKyNpZm5kZWYgTk9JS1NECisiICIsCisiQXQgcHJlc2VudCwgbW9zdCBvZiB0aGUgZXh0ZW5kZWQgb3B0aW9ucyBhcHBseSBvbmx5IHRvIHRoZSBJbnRlcm5ldCBLZXJtaXQiLAorIlNlcnZpY2UgRGFlbW9uIChJS1NEKS4gIFR5cGUgXCJoZWxwIGlrc2RcIiBmb3IgZGV0YWlscy4iLAorI2VuZGlmIC8qIE5PSUtTRCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyIiCit9OworCisjaWZuZGVmIE5PSEVMUAorI2lmbmRlZiBOT0NNREwKK2ludAorZG94b3B0cygpIHsKKyAgICBleHRlcm4gY2hhciAqIHhvcHRobHBbXSwgKiB4YXJnaGxwW107CisgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgeGFyZ3RhYltdOworICAgIGV4dGVybiBpbnQgbnhhcmdzOworICAgIGludCBpLCB4LCB5LCBuID0gMDsKKyNpZmRlZiBDS19UVEdXU0laCisjaWZkZWYgT1MyCisgICAgdHRnY3dzeigpOworI2Vsc2UgLyogT1MyICovCisgICAgLyogQ2hlY2sgd2hldGhlciB3aW5kb3cgc2l6ZSBjaGFuZ2VkICovCisgICAgaWYgKHR0Z3dzaXooKSA+IDApIHsKKyAgICAgICAgaWYgKHR0X3Jvd3MgPiAwICYmIHR0X2NvbHMgPiAwKSB7CisgICAgICAgICAgICBjbWRfcm93cyA9IHR0X3Jvd3M7CisgICAgICAgICAgICBjbWRfY29scyA9IHR0X2NvbHM7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworICAgIHkgPSBjbWtleSh4YXJndGFiLAorICAgICAgICAgICAgICBueGFyZ3MsCisgICAgICAgICAgICAgICJFeHRlbmRlZCBhcmd1bWVudCB3aXRob3V0IHRoZSBcIi0tXCIgcHJlZml4IiwKKyAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgIHh4c3RyaW5nCisgICAgICAgICAgICAgICk7CisgICAgaWYgKHkgPT0gLTMpIHsKKwlwcmludGYoIlxuIik7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKwkgIHJldHVybih4KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBYQV9NQVg7IGkrKykgeworICAgICAgICAgICAgaWYgKHhvcHRobHBbaV0pIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzXG4iLHhvcHRobHBbaV0pOworICAgICAgICAgICAgICAgIHByaW50ZigiICAgJXNcbiIseGFyZ2hscFtpXSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgICAgIG4gKz0gMzsKKyAgICAgICAgICAgICAgICBpZiAobiA+IChjbWRfcm93cyAtIDYpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYXNrbW9yZSgpKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4oMSk7CisgICAgfSBlbHNlIGlmICh5IDwgMCkKKyAgICAgIHJldHVybih5KTsKKyAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgcHJpbnRmKCJcbiVzXG4iLHhvcHRobHBbeV0pOworICAgIHByaW50ZigiICAgJXNcblxuIix4YXJnaGxwW3ldKTsKKyAgICByZXR1cm4oMSk7Cit9CisKK2ludAorZG9ob3B0cygpIHsKKyAgICBpbnQgaSwgbiwgeCwgeSwgeiwgYWxsID0gMCwgbXNnID0gMDsKKyAgICBjaGFyICpzOworICAgIGV4dGVybiBjaGFyICpvcHRobHBbXSwgKmFyZ2hscFtdOworICAgIGV4dGVybiBjaGFyICogeG9wdGhscFtdLCAqIHhhcmdobHBbXTsKKyAgICBleHRlcm4gaW50IG9wdGFjdFtdOworICAgIGlmICgoeCA9IGNtdHh0KCJBIGNvbW1hbmQtbGluZSBvcHRpb24gY2hhcmFjdGVyLFxuXAorb3IgdGhlIHdvcmQgQUxMLCBvciBjYXJyaWFnZSByZXR1cm4gZm9yIGFuIG92ZXJ2aWV3IiwKKyAgICAgICAgICAgICAgICAgICAiIiwgJnMsIHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworICAgIGlmICghKnMpCisgICAgICBtc2cgPSAxOworICAgIGVsc2UgaWYgKCFzdHJjbXAocywiYWxsIikgfHwgKCFzdHJjbXAocywiQUxMIikpKQorICAgICAgYWxsID0gMTsKKyAgICBlbHNlIGlmICgqcyA9PSAnLScpICAgICAgICAgICAgICAgICAvKiBCZSB0b2xlcmFudCBvZiBsZWFkaW5nIGh5cGhlbiAqLworICAgICAgcysrOworICAgIGlmICghYWxsICYmIChpbnQpc3RybGVuKHMpID4gMSkgeworICAgICAgICBwcmludGYoIj9BIHNpbmdsZSBjaGFyYWN0ZXIsIHBsZWFzZSwgb3IgY2FycmlhZ2UgdG8gbGlzdCB0aGVtIGFsbC5cbiIpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAoYWxsKSB7CisgICAgICAgIHkgPSAzMzsKKyAgICAgICAgeiA9IDEyNzsKKyAgICB9IGVsc2UgeworICAgICAgICB5ID0gKnM7CisgICAgICAgIHogPSAoeSA9PSAwKSA/IDEyNyA6IHk7CisgICAgICAgIGlmICh5ID09IDApIHkgPSAzMzsKKyAgICB9CisjaWZkZWYgQ0tfVFRHV1NJWgorI2lmZGVmIE9TMgorICAgIHR0Z2N3c3ooKTsKKyNlbHNlIC8qIE9TMiAqLworICAgIC8qIENoZWNrIHdoZXRoZXIgd2luZG93IHNpemUgY2hhbmdlZCAqLworICAgIGlmICh0dGd3c2l6KCkgPiAwKSB7CisgICAgICAgIGlmICh0dF9yb3dzID4gMCAmJiB0dF9jb2xzID4gMCkgeworICAgICAgICAgICAgY21kX3Jvd3MgPSB0dF9yb3dzOworICAgICAgICAgICAgY21kX2NvbHMgPSB0dF9jb2xzOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKyAgICBwcmludGYoIlxuIik7CisgICAgZm9yIChpID0gMCwgbiA9IDE7IG1zZyAhPSAwICYmICpjbWRsaGxwW2ldOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIlc1xuIixjbWRsaGxwW2ldKTsKKyAgICAgICAgaWYgKCsrbiA+IChjbWRfcm93cyAtIDMpKSB7CisgICAgICAgICAgIGlmICghYXNrbW9yZSgpKQorICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIG4gPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhbGwpIHsKKyAgICAgICAgcHJpbnRmKCJUaGUgZm9sbG93aW5nIGNvbW1hbmQtbGluZSBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG5cbiIpOworICAgICAgICBuICs9IDI7CisgICAgfQorICAgIGZvciAoaSA9IHk7IG1zZyA9PSAwICYmIGkgPD0gejsgaSsrKSB7CisgICAgICAgIGlmICghb3B0aGxwW2ldKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYXJnaGxwW2ldKSB7ICAgICAgICAgICAgICAgIC8qIE9wdGlvbiB3aXRoIGFyZyAqLworICAgICAgICAgICAgcHJpbnRmKCIgLSVjIDxhcmc+JXNcbiIsKGNoYXIpaSwob3B0YWN0W2ldPyIgKGFjdGlvbiBvcHRpb24pIjoiIikpOworCisgICAgICAgICAgICBwcmludGYoIiAgICAgJXNcbiIsb3B0aGxwW2ldKTsKKyAgICAgICAgICAgIHByaW50ZigiICAgICBBcmd1bWVudDogJXNcblxuIixhcmdobHBbaV0pOworICAgICAgICAgICAgeCA9IDQ7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogT3B0aW9uIHdpdGhvdXQgYXJnICovCisgICAgICAgICAgICBwcmludGYoIiAtJWMgICVzJXNcbiIsCisgICAgICAgICAgICAgICAgICAgKGNoYXIpaSwgb3B0aGxwW2ldLAorICAgICAgICAgICAgICAgICAgIChvcHRhY3RbaV0/IiAoYWN0aW9uIG9wdGlvbikiOiIiKQorICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHByaW50ZigiICAgICBBcmd1bWVudDogKG5vbmUpXG5cbiIpOworICAgICAgICAgICAgeCA9IDM7CisgICAgICAgIH0KKyAgICAgICAgbiArPSB4OworICAgICAgICBpZiAobiA+IChjbWRfcm93cyAtIHggLSAxKSkgeworICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpCisgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYWxsKSB7CQkJCS8qIEplZmYsIEphbiAyMDAzICovCisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgaWYgKCsrbiA+PSBjbWRfcm93cykgeworICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpCisgICAgICAgICAgICAgIHJldHVybigwKTsKKwkgICAgZWxzZQorICAgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlRoZSBmb2xsb3dpbmcgZXh0ZW5kZWQgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuIik7CisgICAgICAgIGlmICgrK24gPj0gY21kX3Jvd3MpIHsKKyAgICAgICAgICAgIGlmICghYXNrbW9yZSgpKQorICAgICAgICAgICAgICByZXR1cm4oMCk7CisJICAgIGVsc2UKKyAgICAgICAgICAgICAgbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBpZiAoKytuID49IGNtZF9yb3dzKSB7CisgICAgICAgICAgICBpZiAoIWFza21vcmUoKSkKKyAgICAgICAgICAgICAgcmV0dXJuKDApOworCSAgICBlbHNlCisgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gWEFfTUFYOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh4b3B0aGxwW2ldKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlc1xuIix4b3B0aGxwW2ldKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICVzXG4iLHhhcmdobHBbaV0pOworICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgICAgICBuICs9IDM7CisgICAgICAgICAgICAgICAgaWYgKG4gPiAoY21kX3Jvd3MgLSA0KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWFza21vcmUoKSkKKwkJICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisJCSAgICAgIG4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oMSk7Cit9CisjZW5kaWYgLyogTk9DTURMICovCisjZW5kaWYgLyogTk9IRUxQICovCisKKyNpZmRlZiBDS0NIQU5ORUxJTworc3RhdGljIGNoYXIgKiBoeHhmaWxlW10gPSB7CisiU3ludGF4OiBGSUxFIDxzdWJjb21tYW5kPiBbIHN3aXRjaGVzIF0gPGNoYW5uZWw+IFsgPGRhdGE+IF0iLAorIiAgT3BlbnMsIGNsb3NlcywgcmVhZHMsIHdyaXRlcywgYW5kIG1hbmFnZXMgbG9jYWwgZmlsZXMuIiwKKyIgIiwKKyJUaGUgRklMRSBjb21tYW5kcyBhcmU6IiwKKyIgIiwKKyIgIEZJTEUgT1BFTiAgIChvciBGT1BFTikgICAtLSBPcGVuIGEgbG9jYWwgZmlsZS4iLAorIiAgRklMRSBDTE9TRSAgKG9yIEZDTE9TRSkgIC0tIENsb3NlIGFuIG9wZW4gZmlsZS4iLAorIiAgRklMRSBSRUFEICAgKG9yIEZSRUFEKSAgIC0tIFJlYWQgZGF0YSBmcm9tIGFuIG9wZW4gZmlsZS4iLAorIiAgRklMRSBXUklURSAgKG9yIEZXUklURSkgIC0tIFdyaXRlIGRhdGEgdG8gYW4gb3BlbiBmaWxlLiIsCisiICBGSUxFIExJU1QgICAob3IgRkxJU1QpICAgLS0gTGlzdCBvcGVuIGZpbGVzLiIsCisiICBGSUxFIFNUQVRVUyAob3IgRlNUQVRVUykgLS0gU2hvdyBzdGF0dXMgb2YgYSBjaGFubmVsLiIsCisiICBGSUxFIFJFV0lORCAob3IgRlJFV0lORCkgLS0gUmV3aW5kIGFuIG9wZW4gZmlsZSIsCisiICBGSUxFIENPVU5UICAob3IgRkNPVU5UKSAgLS0gQ291bnQgbGluZXMgb3IgYnl0ZXMgaW4gYW4gb3BlbiBmaWxlIiwKKyIgIEZJTEUgU0VFSyAgIChvciBGU0VFSykgICAtLSBTZWVrIHRvIHNwZWNpZmllZCBzcG90IGluIGFuIG9wZW4gZmlsZS4iLAorIiAgRklMRSBGTFVTSCAgKG9yIEZGTFVTSCkgIC0tIEZsdXNoIG91dHB1dCBidWZmZXJzIGZvciBhbiBvcGVuIGZpbGUuIiwKKyIgIiwKKyJUeXBlIEhFTFAgRklMRSBPUEVOIG9yIEhFTFAgRk9QRU4gZm9yIGRldGFpbHMgYWJvdXQgRklMRSBPUEVOOyIsCisidHlwZSBIRUxQIEZJTEUgQ0xPU0Ugb3IgSEVMUCBGQ0xPU0UgZm9yIGRldGFpbHMgYWJvdXQgRklMRSBDTE9TRSwgYW5kIHNvIG9uLiIsCisiICIsCisiVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHJlbGF0ZWQgdG8gdGhlIEZJTEUgY29tbWFuZDoiLAorIiAiLAorIiAgXFx2KGZfbWF4KSAgICAgLS0gTWF4aW11bSBudW1iZXIgb2YgZmlsZXMgdGhhdCBjYW4gYmUgb3BlbiBhdCBvbmNlIiwKKyIgIFxcdihmX2Vycm9yKSAgIC0tIENvbXBsZXRpb24gY29kZSBvZiBtb3N0IHJlY2VudCBGSUxFIGNvbW1hbmQgb3IgZnVuY3Rpb24iLAorIiAgXFx2KGZfY291bnQpICAgLS0gUmVzdWx0IG9mIG1vc3QgcmVjZW50IEZJTEUgQ09VTlQgY29tbWFuZCIsCisiICIsCisiVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHJlbGF0ZWQgdG8gdGhlIEZJTEUgY29tbWFuZDoiLAorIiAiLAorIiAgXFxGX2VvZigpICAgICAgLS0gQ2hlY2sgaWYgY2hhbm5lbCBpcyBhdCBFT0YiLAorIiAgXFxGX3BvcygpICAgICAgLS0gR2V0IGNoYW5uZWwgcmVhZC93cml0ZSBwb3NpdGlvbiAoYnl0ZSBudW1iZXIpIiwKKyIgIFxcRl9saW5lKCkgICAgIC0tIEdldCBjaGFubmVsIHJlYWQvd3JpdGUgcG9zaXRpb24gKGxpbmUgbnVtYmVyKSIsCisiICBcXEZfaGFuZGxlKCkgICAtLSBHZXQgZmlsZSBoYW5kbGUiLAorIiAgXFxGX3N0YXR1cygpICAgLS0gR2V0IGNoYW5uZWwgc3RhdHVzIiwKKyIgIFxcRl9nZXRjaGFyKCkgIC0tIFJlYWQgY2hhcmFjdGVyIiwKKyIgIFxcRl9nZXRsaW5lKCkgIC0tIFJlYWQgbGluZSIsCisiICBcXEZfZ2V0YmxvY2soKSAtLSBSZWFkIGJsb2NrIiwKKyIgIFxcRl9wdXRjaGFyKCkgIC0tIFdyaXRlIGNoYXJhY3RlciIsCisiICBcXEZfcHV0bGluZSgpICAtLSBXcml0ZSBsaW5lIiwKKyIgIFxcRl9wdXRibG9jaygpIC0tIFdyaXRlIGJsb2NrIiwKKyIgIFxcRl9lcnJtc2coKSAgIC0tIEVycm9yIG1lc3NhZ2UgZnJvbSBtb3N0IHJlY2VudCBGSUxFIGNvbW1hbmQgb3IgZnVuY3Rpb24iLAorIiAiLAorIlR5cGUgSEVMUCA8ZnVuY3Rpb24tbmFtZT4gZm9yIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggb25lLiIsCisiIgorfTsKKworc3RhdGljIGNoYXIgKiBoeHhmX29wW10gPSB7CisiU3ludGF4OiBGSUxFIE9QRU4gWyBzd2l0Y2hlcyBdIDx2YXJpYWJsZT4gPGZpbGVuYW1lPiIsCisiICBPcGVucyB0aGUgZmlsZSBpbmRpY2F0ZWQgYnkgPGZpbGVuYW1lPiBpbiB0aGUgbW9kZSBpbmRpY2F0ZWQgYnkgdGhlIiwKKyIgIHN3aXRjaGVzLCBpZiBhbnksIG9yIGlmIG5vIHN3aXRjaGVzIGFyZSBpbmNsdWRlZCwgaW4gcmVhZC1vbmx5IG1vZGUsIGFuZCIsCisiICBhc3NpZ25zIGEgY2hhbm5lbCBudW1iZXIgZm9yIHRoZSBmaWxlIHRvIHRoZSBnaXZlbiB2YXJpYWJsZS4iLAorIiAgU3lub255bTogRk9QRU4uICBTd2l0Y2hlczoiLAorIiAiLAorIi9SRUFEIiwKKyIgIE9wZW4gdGhlIGZpbGUgZm9yIHJlYWRpbmcuIiwKKyIgIiwKKyIvV1JJVEUiLAorIiAgT3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZy4gIElmIC9SRUFEIHdhcyBub3QgYWxzbyBzcGVjaWZpZWQsIHRoaXMgY3JlYXRlcyIsCisiICBhIG5ldyBmaWxlLiAgSWYgL1JFQUQgd2FzIHNwZWNpZmVkLCB0aGUgZXhpc3RpbmcgZmlsZSBpcyBwcmVzZXJ2ZWQsIGJ1dCIsCisiICB3cml0aW5nIGlzIGFsbG93ZWQuICBJbiBib3RoIGNhc2VzLCB0aGUgcmVhZC93cml0ZSBwb2ludGVyIGlzIGluaXRpYWxseSIsCisiICBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiIsCisiICIsCisiL0FQUEVORCIsCisiICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIGEgbmV3IGZpbGUgYW5kIG9wZW4gaXQgZm9yIHdyaXRpbmcuIiwKKyIgIElmIHRoZSBmaWxlIGV4aXN0cywgb3BlbiBpdCBmb3Igd3JpdGluZywgYnV0IHdpdGggdGhlIHdyaXRlIHBvaW50ZXIiLAorIiAgcG9zaXRpb25lZCBhdCB0aGUgZW5kLiIsCisiICIsCisiL0JJTkFSWSIsCisjaWZkZWYgVk1TCisiICBPcGVucyB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZSB0byBpbmhpYml0IGVuZC1vZi1saW5lIGNvbnZlcnNpb25zLiIsCisjZWxzZQorI2lmZGVmIE9TMgorIiAgT3BlbnMgdGhlIGZpbGUgaW4gYmluYXJ5IG1vZGUgdG8gaW5oaWJpdCBlbmQtb2YtbGluZSBjb252ZXJzaW9ucy4iLAorI2Vsc2UKKyNpZmRlZiBVTklYCisiICBUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGluIFVOSVguIiwKKyNlbHNlCisiICBUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIG9uIHRoaXMgcGxhdGZvcm0uIiwKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVk1TICovCisiICIsCisiU3dpdGNoZXMgY2FuIGJlIGNvbWJpbmVkIGluIGFuIHdheSB0aGF0IG1ha2VzIHNlbnNlIGFuZCBpcyBzdXBwb3J0ZWQgYnkgdGhlIiwKKyJ1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0uIiwKKyIiCit9OworCitzdGF0aWMgY2hhciAqIGh4eGZfY2xbXSA9IHsKKyJTeW50YXg6IEZJTEUgQ0xPU0UgPGNoYW5uZWw+IiwKKyIgIENsb3NlcyB0aGUgZmlsZSBvbiB0aGUgZ2l2ZW4gY2hhbm5lbCBpZiBpdCB3YXMgb3Blbi4iLAorIiAgQWxzbyBzZWUgSEVMUCBGSUxFIE9QRU4uICBTeW5vbnltOiBGQ0xPU0UuIiwKKyIiCit9OworCitzdGF0aWMgY2hhciAqIGh4eGZfZmxbXSA9IHsKKyJTeW50YXg6IEZJTEUgRkxVU0ggPGNoYW5uZWw+IiwKKyIgIEZsdXNoZXMgb3V0cHV0IGJ1ZmZlcnMgb24gdGhlIGdpdmVuIGNoYW5uZWwgaWYgaXQgd2FzIG9wZW4sIGZvcmNpbmciLAorIiAgYWxsIG1hdGVyaWFsIHByZXZpb3VzbHkgd3JpdHRlbiB0byBiZSBjb21taXR0ZWQgdG8gZGlzay4gIFN5bm9ueW06IEZGTFVTSC4iLAorIiAgQWxzbyBhdmFpbGFibGUgYXMgXFxGX2ZsdXNoKCkuIiwKKyIiCit9OworCitzdGF0aWMgY2hhciAqIGh4eGZfbGlbXSA9IHsKKyJTeW50YXg6IEZJTEUgTElTVCIsCisiICBMaXN0cyB0aGUgY2hhbm5lbCBudW1iZXIsIG5hbWUsIG1vZGVzLCBhbmQgcG9zaXRpb24gb2YgZWFjaCBmaWxlIG9wZW5lZCIsCisiICB3aXRoIEZJTEUgT1BFTi4gIFN5bm9ueW06IEZMSVNULiIsCisiIgorfTsKKworc3RhdGljIGNoYXIgKiBoeHhmX3JlW10gPSB7CisiU3ludGF4OiBGSUxFIFJFQUQgWyBzd2l0Y2hlcyBdIDxjaGFubmVsPiBbIDx2YXJpYWJsZT4gXSIsCisiICBSZWFkcyBkYXRhIGZyb20gdGhlIGZpbGUgb24gdGhlIGdpdmVuIGNoYW5uZWwgbnVtYmVyIGludG8gdGhlIDx2YXJpYWJsZT4sIiwKKyIgIGlmIG9uZSB3YXMgZ2l2ZW47IGlmIG5vIHZhcmlhYmxlIHdhcyBnaXZlbiwgdGhlIHJlc3VsdCBpcyBwcmludGVkIG9uIiwKKyIgIHRoZSBzY3JlZW4uICBUaGUgdmFyaWFibGUgc2hvdWxkIGJlIGEgbWFjcm8gbmFtZSByYXRoZXIgdGhhbiBhIFxcJXgiLAorIiAgdmFyaWFibGUgb3IgYXJyYXkgZWxlbWVudCBpZiB5b3Ugd2FudCBiYWNrc2xhc2ggY2hhcmFjdGVycyBpbiB0aGUgZmlsZSB0byIsCisiICBiZSB0YWtlbiBsaXRlcmFsbHkuICBTeW5vbnltOiBGUkVBRC4gIFN3aXRjaGVzOiIsCisiICIsCisiL0xJTkUiLAorIiAgU3BlY2lmaWVzIHRoYXQgYSBsaW5lIG9mIHRleHQgaXMgdG8gYmUgcmVhZC4gIEEgbGluZSBpcyBkZWZpbmVkIGFjY29yZGluZyIsCisiICB0byB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtJ3MgdGV4dC1maWxlIGZvcm1hdC4gIEZvciBleGFtcGxlLCBpbiIsCisiICBVTklYIGEgbGluZSBpcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdXAgdG8gYW5kIGluY2x1ZGluZyBhIGxpbmVmZWVkLiIsCisiICBUaGUgbGluZSB0ZXJtaW5hdG9yIChpZiBhbnkpIGlzIHJlbW92ZWQgYmVmb3JlIGFzc2lnbmluZyB0aGUgdGV4dCB0byB0aGUiLAorIiAgdmFyaWFibGUuICBJZiBubyBzd2l0Y2hlcyBhcmUgaW5jbHVkZWQgd2l0aCB0aGUgRklMRSBSRUFEIGNvbW1hbmQsIC9MSU5FIiwKKyIgIGlzIGFzc3VtZWQuIiwKKyIgIiwKKyIvU0laRTpudW1iZXIiLAorIiAgU3BlY2lmaWVzIHRoYXQgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyAoY2hhcmFjdGVycykgaXMgdG8gYmUgcmVhZC4iLAorIiAgVGhpcyBnaXZlcyBhIHNlbWJsYW5jZSBvZiBcInJlY29yZCBpL29cIiBmb3IgZmlsZXMgdGhhdCBkbyBub3QgbmVjZXNzYXJpbHkiLAorIiAgY29udGFpbiBsaW5lcy4gIFRoZSByZXN1bHRpbmcgYmxvY2sgb2YgY2hhcmFjdGVycyBpcyBhc3NpZ25lZCB0byB0aGUiLAorIiAgdmFyaWFibGUgd2l0aG91dCBhbnkgZWRpdGluZy4iLAorIiAiLAorIi9DSEFSQUNURVIiLAorIiAgRXF1aXZhbGVudCB0byAvU0laRToxLiAgSWYgRklMRSBSRUFEIC9DSEFSIHN1Y2NlZWRzIGJ1dCB0aGUgPHZhcmlhYmxlPiBpcyIsCisiICBlbXB0eSwgdGhpcyBpbmRpY2F0ZXMgYSBOVUwgYnl0ZSB3YXMgcmVhZC4iLAorIiAiLAorIi9UUklNIiwKKyIgIFRlbGxzIEtlcm1pdCB0byB0cmltIHRyYWlsaW5nIHdoaXRlc3BhY2Ugd2hlbiB1c2VkIHdpdGggL0xJTkUuICBJZ25vcmVkIiwKKyIgIGlmIHVzZWQgd2l0aCAvQ0hBUiBvciAvU0laRS4iLAorIiAiLAorIi9VTlRBQklGWSIsCisiICBUZWxscyBLZXJtaXQgdG8gY29udmVydCB0YWJzIHRvIHNwYWNlcyAoYXNzdW1pbmcgdGFicyBzZXQgZXZlcnkgOCBzcGFjZXMpIiwKKyIgIHdoZW4gdXNlZCB3aXRoIC9MSU5FLiAgSWdub3JlZCBpZiB1c2VkIHdpdGggL0NIQVIgb3IgL1NJWkUuIiwKKyIgIiwKKyJTeW5vbnltOiBGUkVBRC4iLAorIkFsc28gYXZhaWxhYmxlIGFzIFxcRl9nZXRjaGFyKCksIFxcRl9nZXRsaW5lKCksIFxcRl9nZXRibG9jaygpLiIsCisiIgorfTsKKworc3RhdGljIGNoYXIgKiBoeHhmX3J3W10gPSB7CisiU3ludGF4OiBGSUxFIFJFV0lORCA8Y2hhbm5lbD4iLAorIiAgSWYgdGhlIGNoYW5uZWwgaXMgb3BlbiwgbW92ZXMgdGhlIHJlYWQvd3JpdGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIiwKKyIgIHRoZSBmaWxlLiAgRXF1aXZhbGVudCB0byBGSUxFIFNFRUsgPGNoYW5uZWw+IDAuICBTeW5vbnltOiBGUkVXSU5ELiIsCisiICBBbHNvIGF2YWlsYWJsZSBhcyBcXEZfcmV3aW5kKCkuIiwKKyIiCit9OworCitzdGF0aWMgY2hhciAqIGh4eGZfc2VbXSA9IHsKKyJTeW50YXg6IEZJTEUgU0VFSyBbIHN3aXRjaGVzIF0gPGNoYW5uZWw+IHsgW3srLC19XTxudW1iZXI+LCBFT0YgfSIsCisiICBTd2l0Y2hlcyBhcmUgL0JZVEUsIC9MSU5FLCAvUkVMQVRJVkUsIEFCU09MVVRFLiIsCisiICBNb3ZlcyB0aGUgZmlsZSBwb2ludGVyIGZvciB0aGlzIGZpbGUgdG8gdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSIsCisiICBmaWxlLiAgU3Vic2VxdWVudCBGSUxFIFJFQURzIG9yIFdSSVRFcyB3aWxsIHRha2UgcGxhY2UgYXQgdGhhdCBwb3NpdGlvbi4iLAorIiAgSWYgbmVpdGhlciB0aGUgL1JFTEFUSVZFIG5vciAvQUJTT0xVVEUgc3dpdGNoIGlzIGdpdmVuLCBhbiB1bnNpZ25lZCIsCisiICA8bnVtYmVyPiBpcyBhYnNvbHV0ZTsgYSBzaWduZWQgbnVtYmVyIGlzIHJlbGF0aXZlLiAgRU9GIG1lYW5zIHRvIG1vdmUgdG8iLAorIiAgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIFN5bm9ueW06IEZTRUVLLiAgQWxzbyBhdmFpbGFibGUgYXMgXFxGX3NlZWsoKS4iLAorIiIKK307CisKK3N0YXRpYyBjaGFyICogaHh4Zl9zdFtdID0geworIlN5bnRheDogRklMRSBTVEFUVVMgPGNoYW5uZWw+IiwKKyIgIElmIHRoZSBjaGFubmVsIGlzIG9wZW4sIHRoaXMgY29tbWFuZCBzaG93cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgdGhlIiwKKyIgIHN3aXRjaGVzIGl0IHdhcyBvcGVuZWQgd2l0aCwgYW5kIHRoZSBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24uIiwKKyIgIFN5bm9ueW06IEZTVEFUVVMiLAorIiIKK307CisKK3N0YXRpYyBjaGFyICogaHh4Zl9jb1tdID0geworIlN5bnRheDogRklMRSBDT1VOVCBbIHsgL0JZVEVTLCAvTElORVMsIC9MSVNULCAvTk9MSVNUIH0gXSA8Y2hhbm5lbD4iLAorIiAgSWYgdGhlIGNoYW5uZWwgaXMgb3BlbiwgdGhpcyBjb21tYW5kIHByaW50cyB0aGUgbnVibWVyIG9mIGJ5dGVzIChkZWZhdWx0KSIsCisiICBvciBsaW5lcyBpbiB0aGUgZmlsZSBpZiBhdCB0b3AgbGV2ZWwgb3IgaWYgL0xJU1QgaXMgaW5jbHVkZWQ7IGlmIC9OT0xJU1QiLAorIiAgaXMgZ2l2ZW4sIHRoZSByZXN1bHQgaXMgbm90IHByaW50ZWQuICBJbiBhbGwgY2FzZXMgdGhlIHJlc3VsdCBpcyBhc3NpZ25lZCIsCisiICB0byBcXHYoZl9jb3VudCkuICBTeW5vbnltOiBGQ09VTlQiLAorIiIKK307CisKK3N0YXRpYyBjaGFyICogaHh4Zl93cltdID0geworIkZJTEUgV1JJVEUgWyBzd2l0Y2hlcyBdIDxjaGFubmVsPiA8dGV4dD4iLAorIiAgV3JpdGVzIHRoZSBnaXZlbiB0ZXh0IHRvIHRoZSBmaWxlIG9uIHRoZSBnaXZlbiBjaGFubmVsIG51bWJlci4gIFRoZSA8dGV4dD4iLAorIiAgY2FuIGJlIGxpdGVyYWwgdGV4dCBvciBhIHZhcmlhYmxlLCBvciBhbnkgY29tYmluYXRpb24uICBJZiB0aGUgdGV4dCBtaWdodCIsCisiICBjb250YWluIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLCBpdCBtdXN0IGJlIGVuY2xvc2VkIGluIGJyYWNlcyBpZiB5b3UiLAorIiAgd2FudCB0byBwcmVzZXJ2ZSB0aGVtLiAgU3lub255bTogRldSSVRFLiAgU3dpdGNoZXM6IiwKKyIgIiwKKyIvTElORSIsCisiICBTcGVjaWZpZXMgdGhhdCBhbiBhcHByb3ByaWF0ZSBsaW5lIHRlcm1pbmF0b3IgaXMgdG8gYmUgYWRkZWQgdG8gdGhlIiwKKyIgIGVuZCBvZiB0aGUgPHRleHQ+LiAgSWYgbm8gc3dpdGNoZXMgYXJlIGluY2x1ZGVkLCAvTElORSBpcyBhc3N1bWVkLiIsCisiICIsCisiL1NJWkU6bnVtYmVyIiwKKyIgIFNwZWNpZmllcyB0aGF0IHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgKGNoYXJhY3RlcnMpIGlzIHRvIGJlIHdyaXR0ZW4uIiwKKyIgIElmIHRoZSBnaXZlbiA8dGV4dD4gaXMgbG9uZ2VyIHRoYW4gdGhlIHJlcXVlc3RlZCBzaXplLCBpdCBpcyB0cnVuY2F0ZWQ7IiwKKyIgIGlmIGlzIHNob3J0ZXIsIGl0IGlzIHBhZGRlZCBhY2NvcmRpbmcgL0xQQUQgYW5kIC9SUEFEIHN3aXRjaGVzLiAgU3lub255bToiLAorIiAgL0JMT0NLLiIsCisiICIsCisiL0xQQURbOnZhbHVlXSIsCisiICBJZiAvU0laRSB3YXMgZ2l2ZW4sIGJ1dCB0aGUgPHRleHQ+IGlzIHNob3J0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkIHNpemUsIiwKKyIgIHRoZSB0ZXh0IGlzIHBhZGRlZCBvbiB0aGUgbGVmdCB3aXRoIHN1ZmZpY2llbnQgY29waWVzIG9mIHRoZSBjaGFyYWN0ZXIiLAorIiAgd2hvc2UgQVNDSUkgdmFsdWUgaXMgZ2l2ZW4gdG8gd3JpdGUgdGhlIGdpdmVuIGxlbmd0aC4gIElmIG5vIHZhbHVlIGlzIiwKKyIgIHNwZWNpZmllZCwgMzIgKHRoZSBjb2RlIGZvciBTcGFjZSkgaXMgdXNlZC4gIFRoZSB2YWx1ZSBjYW4gYWxzbyBiZSAwIHRvIiwKKyIgIHdyaXRlIHRoZSBpbmRpY2F0ZWQgbnVtYmVyIG9mIE5VTCBieXRlcy4gIElmIC9TSVpFIHdhcyBub3QgZ2l2ZW4sIHRoaXMiLAorIiAgc3dpdGNoIGlzIGlnbm9yZWQuIiwKKyIgIiwKKyIvUlBBRFs6dmFsdWVdIiwKKyIgIExpa2UgTFBBRCwgYnV0IHBhZHMgb24gdGhlIHJpZ2h0LiIsCisiICIsCisiL1NUUklORyIsCisiICBTcGVjaWZpZXMgdGhhdCB0aGUgPHRleHQ+IGlzIHRvIGJlIHdyaXR0ZW4gYXMtaXMsIHdpdGggbm8gdGVybWluYXRvciBhZGRlZC4iCissCisiICIsCisiL0NIQVJBQ1RFUiIsCisiICBTcGVjaWZpZXMgdGhhdCBvbmUgY2hhcmFjdGVyIHNob3VsZCBiZSB3cml0dGVuLiAgSWYgdGhlIDx0ZXh0PiBpcyBlbXB0eSBvciIsCisiICBub3QgZ2l2ZW4sIGEgTlVMIGNoYXJhY3RlciBpcyB3cml0dGVuOyBvdGhlcndpc2UgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiIsCisiICA8dGV4dD4gaXMgZ2l2ZW4uIiwKKyIgIiwKKyJTeW5vbnltIEZXUklURS4iLAorIkFsc28gYXZhaWxhYmxlIGFzIFxcRl9wdXRjaGFyKCksIFxcRl9wdXRsaW5lKCksIFxcRl9wdXRibG9jaygpLiIsCisiIgorfTsKKworc3RhdGljIGludAorZG9oZmlsZShjeCkgaW50IGN4OyB7CisgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgZmN0YWJbXTsKKyAgICBleHRlcm4gaW50IG5mY3RhYjsKKyAgICBpbnQgeDsKKyAgICBpZiAoY3ggPT0gWFhGSUxFKSB7ICAgICAgICAgICAgICAgICAvKiBGSUxFIGNvbW1hbmQgd2FzIGdpdmVuICovCisgICAgICAgIC8qIEdldCBzdWJjb21tYW5kICovCisgICAgICAgIGlmICgoY3ggPSBjbWtleShmY3RhYixuZmN0YWIsIk9wZXJhdGlvbiIsIiIseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChjeCA9PSAtMykgeworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICBjeCA9IFhYRklMRTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICByZXR1cm4oY3gpOworICAgICAgICB9CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIHN3aXRjaCAoY3gpIHsKKyAgICAgICAgICBjYXNlIEZJTF9DTFM6IGN4ID0gWFhGX0NMOyBicmVhazsKKyAgICAgICAgICBjYXNlIEZJTF9GTFU6IGN4ID0gWFhGX0ZMOyBicmVhazsKKyAgICAgICAgICBjYXNlIEZJTF9MSVM6IGN4ID0gWFhGX0xJOyBicmVhazsKKyAgICAgICAgICBjYXNlIEZJTF9PUE46IGN4ID0gWFhGX09QOyBicmVhazsKKyAgICAgICAgICBjYXNlIEZJTF9SRUE6IGN4ID0gWFhGX1JFOyBicmVhazsKKyAgICAgICAgICBjYXNlIEZJTF9SRVc6IGN4ID0gWFhGX1JXOyBicmVhazsKKyAgICAgICAgICBjYXNlIEZJTF9TRUU6IGN4ID0gWFhGX1NFOyBicmVhazsKKyAgICAgICAgICBjYXNlIEZJTF9TVEE6IGN4ID0gWFhGX1NUOyBicmVhazsKKyAgICAgICAgICBjYXNlIEZJTF9XUkk6IGN4ID0gWFhGX1dSOyBicmVhazsKKyAgICAgICAgICBjYXNlIEZJTF9DT1U6IGN4ID0gWFhGX0NPOyBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzd2l0Y2ggKGN4KSB7CisgICAgICBjYXNlIFhYRklMRTogcmV0dXJuKGhtc2dhKGh4eGZpbGUpKTsKKyAgICAgIGNhc2UgWFhGX0NMOiByZXR1cm4oaG1zZ2EoaHh4Zl9jbCkpOworICAgICAgY2FzZSBYWEZfRkw6IHJldHVybihobXNnYShoeHhmX2ZsKSk7CisgICAgICBjYXNlIFhYRl9MSTogcmV0dXJuKGhtc2dhKGh4eGZfbGkpKTsKKyAgICAgIGNhc2UgWFhGX09QOiByZXR1cm4oaG1zZ2EoaHh4Zl9vcCkpOworICAgICAgY2FzZSBYWEZfUkU6IHJldHVybihobXNnYShoeHhmX3JlKSk7CisgICAgICBjYXNlIFhYRl9SVzogcmV0dXJuKGhtc2dhKGh4eGZfcncpKTsKKyAgICAgIGNhc2UgWFhGX1NFOiByZXR1cm4oaG1zZ2EoaHh4Zl9zZSkpOworICAgICAgY2FzZSBYWEZfU1Q6IHJldHVybihobXNnYShoeHhmX3N0KSk7CisgICAgICBjYXNlIFhYRl9XUjogcmV0dXJuKGhtc2dhKGh4eGZfd3IpKTsKKyAgICAgIGNhc2UgWFhGX0NPOiByZXR1cm4oaG1zZ2EoaHh4Zl9jbykpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9Cit9CisjZW5kaWYgLyogQ0tDSEFOTkVMSU8gKi8KKworaW50Citkb2hscCh4eCkgaW50IHh4OyB7CisgICAgaW50IHgseTsKKworICAgIGRlYnVnKEYxMDEsIkRPSEVMUCB4eCIsIiIseHgpOworICAgIGlmICh4eCA8IDApIHJldHVybih4eCk7CisKKyNpZmRlZiBOT0hFTFAKKyAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgcHJpbnRmKCJcbiVzLCBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsIix2ZXJzaW8pOworI2lmbmRlZiBOT0lLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpCisgICAgICByZXR1cm4oaG1zZ2EodG9waGxwaSkpOworICAgIGVsc2UKKyNlbmRpZiAvKiBJS1NEICovCisgICAgICByZXR1cm4oaG1zZ2EodG9waGxwKSk7CisKKyNlbHNlIC8qIGhlbHAgaXMgYXZhaWxhYmxlICovCisKKyAgICBpZiAoaGVscGZpbGUpCisgICAgICByZXR1cm4oZG90eXBlKGhlbHBmaWxlLHhhc2ttb3JlLDAsMCxOVUxMLDAsTlVMTCwwLDAsTlVMTCwwKSk7CisKKyNpZmRlZiBDS0NIQU5ORUxJTworICAgIGlmICh4eCA9PSBYWEZJTEUpCisgICAgICByZXR1cm4oZG9oZmlsZSh4eCkpOworICAgIGVsc2UgaWYgKHh4ID09IFhYRl9SRSB8fCB4eCA9PSBYWEZfV1IgfHwgeHggPT0gWFhGX09QIHx8CisgICAgICAgICAgICAgeHggPT0gWFhGX0NMIHx8IHh4ID09IFhYRl9TRSB8fCB4eCA9PSBYWEZfUlcgfHwKKyAgICAgICAgICAgICB4eCA9PSBYWEZfRkwgfHwgeHggPT0gWFhGX0xJIHx8IHh4ID09IFhYRl9TVCB8fCB4eCA9PSBYWEZfQ08pCisgICAgICByZXR1cm4oZG9oZmlsZSh4eCkpOworI2VuZGlmIC8qIENLQ0hBTk5FTElPICovCisKKyAgICBzd2l0Y2ggKHh4KSB7CisKKyNpZm5kZWYgTk9TUEwKK2Nhc2UgWFhBU1M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBU1NJR04gKi8KKyAgICByZXR1cm4oaG1zZ2EoaHh4YXNzKSk7CisKK2Nhc2UgWFhBU0s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBU0sgKi8KK2Nhc2UgWFhBU0tROiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBU0tRICovCisgICAgcmV0dXJuKGhtc2dhKGh4eGFzaykpOworCitjYXNlIFhYQVBDOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IEFQQyB0ZXh0XG5cCisgIEVjaG9lcyB0aGUgdGV4dCB3aXRoaW4gYSBWVDIyMC8zMjAvNDIwIEFwcGxpY2F0aW9uIFByb2dyYW0gQ29tbWFuZC4iKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT0ZSSUxMUworY2FzZSBYWEJVRzoKKyAgICByZXR1cm4oaG1zZygiRGVzY3JpYmVzIGhvdyB0byBnZXQgdGVjaG5pY2FsIHN1cHBvcnQuIikpOworI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyNpZm5kZWYgTk9TUEwKK2Nhc2UgWFhCRUVQOgorI2lmZGVmIE9TMgorICAgIHJldHVybihobXNnKCJTeW50YXg6IEJFRVAgWyB7IEVSUk9SLCBJTkZPUk1BVElPTiwgV0FSTklORyB9IF1cblwKKyAgR2VuZXJhdGVzIGEgYmVsbCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2V0dGluZ3MuICBJZiBTRVQgQkVMTCBpcyBzZXQgdG9cblwKKyAgXCJzeXN0ZW0tc291bmRzXCIgdGhlbiB0aGUgYXBwcm9wcmlhdGUgU3lzdGVtIFNvdW5kIHdpbGwgYmUgZ2VuZXJhdGVkLlxuXAorICBEZWZhdWx0IGlzIElORk9STUFUSU9OLiIpKTsKKyNlbHNlIC8qIE9TMiAqLworICAgIHJldHVybihobXNnKCJTeW50YXg6IEJFRVBcblwKK1NlbmRzIGEgQkVMIGNoYXJhY3RlciB0byB5b3VyIHRlcm1pbmFsLiIpKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCitjYXNlIFhYQllFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQllFICovCisgICAgcmV0dXJuKGhtc2coaG14eGJ5ZSkpOworCitjYXNlIFhYQ0hLOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgKi8KKyAgICByZXR1cm4oaG1zZygiXAorU3ludGF4OiBDSEVDSyBuYW1lXG5cCisgIENoZWNrc1wKKyAgdG8gc2VlIGlmIHRoZSBuYW1lZCBmZWF0dXJlIGlzIGluY2x1ZGVkIGluIHRoaXMgdmVyc2lvbiBvZiBLZXJtaXQuXG5cCisgIFRvIGxpc3QgdGhlIGZlYXR1cmVzIHlvdSBjYW4gY2hlY2ssIHR5cGUgXCJjaGVjayA/XCIuIikpOworCisjaWZuZGVmIE5PRlJJTExTCitjYXNlIFhYQ0xFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgKi8KKyAgICByZXR1cm4oaG1zZ2EoaG14eGNsZSkpOworI2VuZGlmIC8qIE5PRlJJTExTICovCisKK2Nhc2UgWFhDTE86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbG9zZSAqLworICAgIHJldHVybihobXNnYShobXh4Y2xvKSk7CisKK2Nhc2UgWFhDT006ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tZW50ICovCisjaWZuZGVmIFNUUkFUVVMgLyogQ2FuJ3QgdXNlICMgZm9yIGNvbW1lbnRzIGluIFN0cmF0dXMgVk9TICovCisgICAgcmV0dXJuKGhtc2coIlwKK1N5bnRheDogQ09NTUVOVCB0ZXh0XG5cCitFeGFtcGxlOiBDT01NRU5UIC0gdGhpcyBpcyBhIGNvbW1lbnQuXG5cCisgIEludHJvZHVjZXMgYSBjb21tZW50LiAgQmVnaW5uaW5nIG9mIGNvbW1hbmQgbGluZSBvbmx5LiAgQ29tbWFuZHMgbWF5IGFsc29cblwKKyAgaGF2ZSB0cmFpbGluZyBjb21tZW50cywgaW50cm9kdWNlZCBieSA7IG9yICMuIikpOworI2Vsc2UKKyAgICByZXR1cm4oaG1zZygiXAorU3ludGF4OiBDT01NRU5UIHRleHRcblwKK0V4YW1wbGU6IENPTU1FTlQgLSB0aGlzIGlzIGEgY29tbWVudC5cblwKKyAgSW50cm9kdWNlcyBhIGNvbW1lbnQuICBCZWdpbm5pbmcgb2YgY29tbWFuZCBsaW5lIG9ubHkuICBDb21tYW5kcyBtYXkgYWxzb1xuXAorICBoYXZlIHRyYWlsaW5nIGNvbW1lbnRzLCBpbnRyb2R1Y2VkIGJ5IDsgKHNlbWljb2xvbikuIikpOworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKworI2lmbmRlZiBOT0xPQ0FMCitjYXNlIFhYQ09OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ09OTkVDVCAqLworY2FzZSBYWENROiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENRID09IENPTk5FQ1QgL1FVSUVUTFkgKi8KKyAgICBobXNnYShobXh4Y29uKTsKKyAgICBwcmludGYoIllvdXIgZXNjYXBlIGNoYXJhY3RlciBpcyBDdHJsLSVjIChBU0NJSSAlZCwgJXMpXHJcbiIsCisgICAgICAgICAgIGN0bChlc2NhcGUpLCBlc2NhcGUsIChlc2NhcGUgPT0gMTI3ID8gIkRFTCIgOiBjY250YWJbZXNjYXBlXSkpOworICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBaQ09QWQorY2FzZSBYWENQWToKKyAgICByZXR1cm4oaG1zZ2EoaG14eGNweSkpOworI2VuZGlmIC8qIFpDT1BZICovCisKKyNpZmRlZiBOVAorY2FzZSBYWExJTks6CityZXR1cm4oaG1zZygKKyIgIExJTksgc291cmNlIGRlc3RpbmF0aW9uXG5cCisgICBjcmVhdGVzIGEgaGFyZCBsaW5rIHRvIHRoZSBmaWxlIHNwZWNpZmllZCBieSBzb3VyY2UgdG8gdGhlIGZpbGVuYW1lXG5cCisgICBzcGVjaWZpZWQgYnkgZGVzdGluYXRpb24uICBIYXJkIGxpbmtzIGFyZSBvbmx5IHN1cHBvcnRlZCBvbiBOVEZTLlxuXAorICAgZGVzdGluYXRpb24gY2FuIGVpdGhlciBiZSBhIGZpbGVuYW1lIG9yIGEgZGlyZWN0b3J5LiAgc291cmNlIG1heVxuXAorICAgY29udGFpbiB3aWxkY2FyZHMgaWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnkuIikpOworI2VuZGlmIC8qIE5UICovCisKKyNpZm5kZWYgTk9GUklMTFMKK2Nhc2UgWFhMUkVOOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMUkVOQU1FICovCisgICAgcmV0dXJuKGhtc2coCisiICBMUkVOQU1FIGlzIGFuIGFsaWFzIGZvciB0aGUgUkVOQU1FIGNvbW1hbmQgZm9yY2luZyBpdCB0byBleGVjdXRlXG5cCisgIG9uIHRoZSBsb2NhbCBjb21wdXRlci4gIEFsc28gc2VlOiBSRU5BTUUsIFJSRU5BTUUsIFNFVCBMT0NVUy4iKSk7CisKK2Nhc2UgWFhSRU46CisgICAgcmV0dXJuKGhtc2dhKGhteHhyZW4pKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCitjYXNlIFhYQ0RVUDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENEVVAgKi8KK2Nhc2UgWFhMQ0RVOgorICAgIHJldHVybihobXNnKAorIkNoYW5nZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgb25lIGp1c3QgYWJvdmUgdGhlIGN1cnJlbnQgb25lLiIpKTsKKworY2FzZSBYWExDV0Q6CisgICAgcmV0dXJuKGhtc2coCisiICBMQ0QgKExDV0QpIGlzIGFuIGFsaWFzIGZvciB0aGUgQ0QgKENXRCkgY29tbWFuZCBmb3JjaW5nIGl0IHRvIGV4ZWN1dGVcblwKKyAgb24gdGhlIGxvY2FsIGNvbXB1dGVyLiAgQWxzbyBzZWU6IENELCBDRFVQLCBSQ0QsIFNFVCBMT0NVUy4iKSk7CisKK2Nhc2UgWFhDV0Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDRCAvIENXRCAqLworICAgIHJldHVybihobXNnYShobXh4Y3dkKSk7CisKKyNpZm5kZWYgTk9TUEwKK2Nhc2UgWFhLQ0Q6CisgICAgcmV0dXJuKGhtc2dhKGhteHhrY2QpKTsKKworY2FzZSBYWEFSUkFZOgorY2FzZSBYWERDTDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERFQ0xBUkUgKi8KK2Nhc2UgWFhTT1JUOgorICAgIHJldHVybihobXNnYShoeHhkY2wpKTsKKworY2FzZSBYWERFRjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERFRklORSAqLworI2lmbmRlZiBOT1NQTAorICAgIGlmIChobHB0b2spICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdoYXQgdGhleSBhY3R1YWxseSB0eXBlZC4uLiAqLworICAgICAgaWYgKGhscHRva1swXSA9PSAnLicpCisgICAgICAgIHJldHVybihobXNnYShoeHhkb3QpKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHJldHVybihobXNnYShoeHhkZWYpKTsKKworY2FzZSBYWFVOREVGOiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVOREVGSU5FICovCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogIFVOREVGSU5FIHZhcmlhYmxlLW5hbWVcblwKKyAgVW5kZWZpbmVzIGEgbWFjcm8gb3IgdmFyaWFibGUuIikpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9GUklMTFMKK2Nhc2UgWFhMREVMOgorICAgIHJldHVybihobXNnKAorIiAgTERFTEVURSBpcyBhbiBhbGlhcyBmb3IgdGhlIERFTEVURSBjb21tYW5kIGZvcmNpbmcgaXQgdG8gZXhlY3V0ZVxuXAorICBvbiB0aGUgbG9jYWwgY29tcHV0ZXIuICBBbHNvIHNlZTogREVMRVRFLCBSREVMRVRFLCBTRVQgTE9DVVMuIikpOworCitjYXNlIFhYREVMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVsZXRlICovCisgICAgcmV0dXJuKGhtc2dhKGhteHhkZWwpKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisjaWZuZGVmIE5PRElBTAorY2FzZSBYWERJQUw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwsIGV0Yy4uLiAqLworICAgIHJldHVybihobXNnYShoeHhkaWFsKSk7CisKK2Nhc2UgWFhQRElBOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQRElBTCAqLworICAgIHJldHVybihobXNnKCJTeW50YXg6IFBESUFMIHBob25lbnVtYmVyXG5cCisgIFBhcnRpYWxseSBkaWFscyBhIHBob25lIG51bWJlci4gIExpa2UgRElBTCBidXQgZG9lcyBub3Qgd2FpdCBmb3IgY2FycmllclxuXAorICBvciBDT05ORUNUIG1lc3NhZ2UuIikpOworCitjYXNlIFhYUkVEOgorICAgIHJldHVybihobXNnKCJSZWRpYWwgdGhlIG51bWJlciBnaXZlbiBpbiB0aGUgbW9zdCByZWNlbnQgRElBTCBjb21tbmQuIikpOworCitjYXNlIFhYQU5TVzogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQU5TV0VSICovCisgICAgcmV0dXJuKGhtc2dhKGh4eGFuc3cpKTsKKworY2FzZSBYWExPT0s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExPT0tVUCBudW1iZXIgaW4gZGlyZWN0b3J5ICovCisgICAgcmV0dXJuKGhtc2dhKGh4eGxvb2spKTsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworY2FzZSBYWExESVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExESVJFQ1RPUlkgKi8KKyAgICByZXR1cm4oaG1zZygKKyIgIExESVJJUkVDVE9SWSBpcyBhbiBhbGlhcyBmb3IgdGhlIERJUkVDVE9SWSBjb21tYW5kIGZvcmNpbmcgaXQgdG8gZXhlY3V0ZVxuXAorICBvbiB0aGUgbG9jYWwgY29tcHV0ZXIuICBBbHNvIHNlZTogRElSRUNUT1JZLCBTRVQgTE9DVVMsIFJESVJFQ1RPUlkuIikpOworCitjYXNlIFhYRElSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRElSRUNUT1JZICovCisgICAgcmV0dXJuKGhtc2dhKGhteHhkaXIpKTsKKworY2FzZSBYWExNS0Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExNS0RJUiAqLworICAgIHJldHVybihobXNnKAorIiAgTE1LRElSIGlzIGFuIGFsaWFzIGZvciB0aGUgTUtESVIgY29tbWFuZCBmb3JjaW5nIGl0IHRvIGV4ZWN1dGVcblwKKyAgb24gdGhlIGxvY2FsIGNvbXB1dGVyLiAgQWxzbyBzZWU6IE1LRElSLCBSTUtESVIsIFNFVCBMT0NVUy4iKSk7CisKK2Nhc2UgWFhNS0RJUjogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNS0RJUiAqLworICAgIHJldHVybihobXNnKCJDcmVhdGVzIGEgZGlyZWN0b3J5LiAgQWxzbyBzZWUgTFJNRElSLCBSUk1ESVIsIFNFVCBMT0NVUy4iKSk7CisKK2Nhc2UgWFhMUk1EOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMUk1ESVIgKi8KKyAgICByZXR1cm4oaG1zZygKKyIgIExSTURJUiBpcyBhbiBhbGlhcyBmb3IgdGhlIFJNRElSIGNvbW1hbmQgZm9yY2luZyBpdCB0byBleGVjdXRlXG5cCisgIG9uIHRoZSBsb2NhbCBjb21wdXRlci4gIEFsc28gc2VlOiBSTURJUiwgUlJNRElSLCBTRVQgTE9DVVMuIikpOworCitjYXNlIFhYUk1ESVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUk1ESVIgKi8KKyAgICByZXR1cm4oaG1zZygiUmVtb3ZlcyBhIGRpcmVjdG9yeS4gIEFsc28gc2VlIExSTURJUiwgUlJNRElSLCBTRVQgTE9DVVMuIikpOworCitjYXNlIFhYTFM6CisjaWZkZWYgVU5JWE9ST1NLCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogTFMgWyBhcmdzIF1cblwKKyAgUnVucyBcImxzXCIgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiIpKTsKKyNlbHNlCisgICAgcmV0dXJuKGhtc2dhKGhteHhkaXIpKTsKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKworI2lmbmRlZiBOT1NFUlZFUgorI2lmbmRlZiBOT0ZSSUxMUworY2FzZSBYWERJUzoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBESVNBQkxFIGNvbW1hbmRcblwKKyAgU2VjdXJpdHkgZm9yIHRoZSBLZXJtaXQgc2VydmVyLiAgUHJldmVudHMgdGhlIGNsaWVudCBLZXJtaXQgcHJvZ3JhbSBmcm9tXG5cCisgIGV4ZWN1dGluZyB0aGUgbmFtZWQgUkVNT1RFIGNvbW1hbmQsIHN1Y2ggYXMgQ0QsIERFTEVURSwgUkVDRUlWRSwgZXRjLiIpKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2VuZGlmIC8qIE5PU0VSVkVSICovCisKKyNpZm5kZWYgTk9TUEwKK2Nhc2UgWFhETzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyAqLworICAgIHJldHVybihobXNnKCJTeW50YXg6IFsgRE8gXSBtYWNyb25hbWUgWyBhcmd1bWVudHMgXVxuXAorICBFeGVjdXRlcyBhIG1hY3JvIHRoYXQgd2FzIGRlZmluZWQgd2l0aCB0aGUgREVGSU5FIGNvbW1hbmQuICBUaGUgd29yZCBET1xuXAorICBjYW4gYmUgb21pdHRlZC4gIFRyYWlsaW5nIGFyZ3VtZW50IHdvcmRzLCBpZiBhbnksIGFyZSBhdXRvbWF0aWNhbGx5XG5cCisgIGFzc2lnbmVkIHRvIHRoZSBtYWNybyBhcmd1bWVudCB2YXJpYWJsZXMgXFwlMSB0aHJvdWdoIFxcJTkuIikpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9TUEwKK2Nhc2UgWFhERUM6CisgICAgcmV0dXJuKGhtc2dhKGh4eGRlYykpOworI2VuZGlmIC8qIE5PU1BMICovCisKK2Nhc2UgWFhFQ0g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlY2hvICovCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogRUNITyB0ZXh0XG5cCisgIERpc3BsYXlzIHRoZSB0ZXh0IG9uIHRoZSBzY3JlZW4sIGZvbGxvd2VkIGJ5IGEgbGluZSB0ZXJtaW5hdG9yLiAgVGhlIEVDSE9cblwKKyAgdGV4dCBtYXkgY29udGFpbiBiYWNrc2xhc2ggY29kZXMuICBFeGFtcGxlOiBFQ0hPIFxcN1dha2UgdXAhXFw3LiAgQWxzbyBzZWVcblwKKyAgWEVDSE8gYW5kIFdSSVRFIFNDUkVFTi4iKSk7CisKK2Nhc2UgWFhYRUNIOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB4ZWNobyAqLworICAgIHJldHVybihobXNnKCJTeW50YXg6IFhFQ0hPIHRleHRcblwKKyAgSnVzdCBsaWtlIEVDSE8gYnV0IGRvZXMgbm90IGFkZCBhIGxpbmUgdGVybWluYXRvciB0byB0aGUgdGV4dC4gIFNlZSBFQ0hPLiIpKTsKKworY2FzZSBYWFZPSUQ6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogVk9JRCB0ZXh0XG5cCisgIExpa2UgRUNITyBidXQgZG9lc24ndCBwcmludCBhbnl0aGluZzsgY2FuIGJlIHVzZWQgdG8gaW52b2tlIGZ1bmN0aW9uc1xuXAorICB3aGVuIHlvdSBkb24ndCBuZWVkIHRvIGRpc3BsYXkgb3IgdXNlIHRoZWlyIHJlc3VsdHMuIikpOworCisjaWZuZGVmIE5PU0VSVkVSCisjaWZuZGVmIE5PRlJJTExTCitjYXNlIFhYRU5BOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IEVOQUJMRSBjYXBhYmlsaXR5XG5cCisgIEZvciB1c2Ugd2l0aCBzZXJ2ZXIgbW9kZS4gIEFsbG93cyB0aGUgY2xpZW50IEtlcm1pdCBwcm9ncmFtIGFjY2VzcyB0byB0aGVcblwKKyAgbmFtZWQgY2FwYWJpbGl0eSwgc3VjaCBhcyBDRCwgREVMRVRFLCBSRUNFSVZFLCBldGMuICBPcHBvc2l0ZSBvZiBESVNBQkxFLiIpKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2VuZGlmIC8qIE5PU0VSVkVSICovCisKKyNpZm5kZWYgTk9TUEwKK2Nhc2UgWFhFTkQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgKi8KKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBFTkQgWyBudW1iZXIgWyBtZXNzYWdlIF0gXVxuXAorICBFeGl0cyBmcm9tIHRoZSBjdXJyZW50IG1hY3JvIG9yIFRBS0UgZmlsZSwgYmFjayB0byB3aGVyZXZlciBpbnZva2VkIGZyb20uXG5cCisgIE51bWJlciBpcyByZXR1cm4gY29kZS4gIE1lc3NhZ2UsIGlmIGdpdmVuLCBpcyBwcmludGVkLiIpKTsKKworY2FzZSBYWEVWQUw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV2YWx1YXRlICovCisgICAgcmV0dXJuKGhtc2dhKGhteHhldmFsKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT0ZSSUxMUworY2FzZSBYWEVSUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGUtcGFja2V0ICovCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogRS1QQUNLRVRcblwKKyAgU2VuZHMgYW4gRXJyb3IgcGFja2V0IHRvIHRoZSBvdGhlciBLZXJtaXQuIikpOworI2VuZGlmIC8qIE5PRlJJTExTICovCisKK2Nhc2UgWFhFWEk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleGl0ICovCitjYXNlIFhYUVVJOgorICAgIHJldHVybihobXNnYShobXh4ZXhpdCkpOworCitjYXNlIFhYRklOOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IEZJTklTSFxuXAorICBUZWxscyB0aGUgcmVtb3RlIEtlcm1pdCBzZXJ2ZXIgdG8gc2h1dCBkb3duIHdpdGhvdXQgbG9nZ2luZyBvdXQuIikpOworCisjaWZuZGVmIE5PU1BMCisgIGNhc2UgWFhGT1I6CisgICAgcmV0dXJuKGhtc2dhKGZvcmhscCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgY2FzZSBYWEdFVDoKKyAgICByZXR1cm4oaG1zZ2EoaG14eGdldCkpOworICBjYXNlIFhYTUdFVDoKKyAgICByZXR1cm4oaG1zZ2EoaG14eG1nZXQpKTsKKworI2lmbmRlZiBOT1NQTAorI2lmbmRlZiBOT0ZSSUxMUworICBjYXNlIFhYR09LOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IEdFVE9LIFsgc3dpdGNoZXMgXSBwcm9tcHRcblwKKyAgUHJpbnRzIHRoZSBwcm9tcHQsIG1ha2VzIHVzZXIgdHlwZSAneWVzJywgJ25vJywgb3IgJ29rJywgYW5kIHNldHMgU1VDQ0VTU1xuXAorICBvciBGQUlMVVJFIGFjY29yZGluZ2x5LiAgVGhlIG9wdGlvbmFsIHN3aXRjaGVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgQVNLLiIpKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9TUEwKKyAgY2FzZSBYWEdPVE86CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogR09UTyBsYWJlbFxuXAorICBJbiBhIFRBS0UgZmlsZSBvciBtYWNybywgZ28gdG8gdGhlIGdpdmVuIGxhYmVsLiAgQSBsYWJlbCBpcyBhIHdvcmQgb24gdGhlXG5cCisgIGxlZnQgbWFyZ2luIHRoYXQgc3RhcnRzIHdpdGggYSBjb2xvbiAoOikuICBFeGFtcGxlOlxuXG5cCisgIDpvb2ZhXG5cCisgIGVjaG8gSGVsbG8hXG5cCisgIGdvdG8gb29mYSIpKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisgIGNhc2UgWFhIQU46CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogSEFOR1VQXG5cCitIYW5nIHVwIHRoZSBwaG9uZSBvciBuZXR3b3JrIGNvbm5lY3Rpb24uIikpOworCisgIGNhc2UgWFhITFA6CisvKgorICBXZSBnZXQgY29uZmlybWF0aW9uIGhlcmUsIGV2ZW4gdGhvdWdoIHdlIGRvIGl0IGFnYWluIGluIGhtc2dhKCksIHRvIHByZXZlbnQKKyAgdGhlIENvcHlyaWdodCBtZXNzYWdlIGZyb20gYmVpbmcgcHJpbnRlZCBwcmVtYXR1cmVseS4gIFRoaXMgZG9lc24ndCBkbyBhbnkKKyAgaGFybSwgYmVjYXVzZSB0aGUgZmlyc3QgY2FsbCB0byBjbWNmbSgpIHNldHMgY21mbGdzIHRvIDEsIG1ha2luZyB0aGUgc2Vjb25kCisgIGNhbGwgcmV0dXJuIGltbWVkaWF0ZWx5LgorKi8KKyAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisKKyAgICBpZiAoaGVscGZpbGUpIHsKKyAgICAgICAgcHJpbnRmKCJcbiVzLCBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsXG5cCitUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLlxuXG4iLHZlcnNpbyk7CisgICAgICAgIHJldHVybihkb3R5cGUoaGVscGZpbGUseGFza21vcmUsMywwLE5VTEwsMCxOVUxMLDAsMCxOVUxMLDApKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIlxuJXMsIENvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwiLHZlcnNpbyk7CisgICAgICAgIHJldHVybihobXNnYSh0b3BobHApKTsKKyAgICB9CisKK2Nhc2UgWFhJTlQ6CisjaWZkZWYgT1MyCisgICAgcmV0dXJuKGhtc2coIkdpdmUgYSBicmllZiBpbnRyb2R1Y3Rpb24gdG8gQy1LZXJtaXQuIikpOworI2Vsc2UKKyAgICByZXR1cm4oaG1zZygiR2l2ZSBhIGJyaWVmIGludHJvZHVjdGlvbiB0byBLZXJtaXQgOTUuIikpOworI2VuZGlmIC8qIE9TMiAqLworCisjaWZuZGVmIE5PU1BMCitjYXNlIFhYSUY6CisgICAgcmV0dXJuKGhtc2dhKGlmaGxwKSk7CisKK2Nhc2UgWFhJTkM6CisgICAgcmV0dXJuKGhtc2dhKGh4eGluYykpOworCitjYXNlIFhYSU5QOgorICAgcmV0dXJuKGhtc2dhKGh4eGlucCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBDS19NSU5QVVQKK2Nhc2UgWFhNSU5QOgorICAgIHJldHVybihobXNnYShobXh4bWlucCkpOworI2VuZGlmIC8qIENLX01JTlBVVCAqLworCisjaWZuZGVmIE5PU1BMCitjYXNlIFhYUkVJOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFJFSU5QVVQgbiBzdHJpbmdcblwKKyAgTG9va3MgZm9yIHRoZSBzdHJpbmcgaW4gdGhlIHRleHQgdGhhdCBoYXMgcmVjZW50bHkgYmVlbiBJTlBVVCwgc2V0IFNVQ0NFU1NcblwKKyAgb3IgRkFJTFVSRSBhY2NvcmRpbmdseS4gIFRpbWVvdXQsIG4sIG11c3QgYmUgc3BlY2lmaWVkIGJ1dCBpcyBpZ25vcmVkLiIpKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PU1BMCitjYXNlIFhYTEJMOgorICAgIHJldHVybihobXNnKCJcCisgIEludHJvZHVjZXMgYSBsYWJlbCwgbGlrZSA6bG9vcCwgZm9yIHVzZSB3aXRoIEdPVE8gaW4gVEFLRSBmaWxlcyBvciBtYWNyb3MuXG5cCitTZWUgR09UTy4iKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworY2FzZSBYWExPRzoKKyAgICByZXR1cm4oaG1zZ2EoaG14eGxnKSk7CisKKyNpZm5kZWYgTk9TQ1JJUFQKK2Nhc2UgWFhMT0dJOgorICAgIHJldHVybihobXNnYShobXh4bG9naSkpOworI2VuZGlmCisKKyNpZm5kZWYgTk9GUklMTFMKK2Nhc2UgWFhNQUk6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogTUFJTCBmaWxlbmFtZSBhZGRyZXNzXG5cCisgIEVxdWl2YWxlbnQgdG8gU0VORCAvTUFJTDphZGRyZXNzIGZpbGVuYW1lLiIpKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisjaWZuZGVmIE5PTVNFTkQKK2Nhc2UgWFhNU0U6CisgICAgcmV0dXJuKGhtc2dhKGhteHhtc2UpKTsKKworY2FzZSBYWEFERDoKKyAgICByZXR1cm4oaG1zZ2EoaG14eGFkZCkpOworCitjYXNlIFhYTU1PVkU6CisgICAgcmV0dXJuKGhtc2coIk1NT1ZFIGlzIGV4YWN0bHkgbGlrZSBNU0VORCwgZXhjZXB0IGVhY2ggZmlsZSB0aGF0IGlzXG5cCitzZW50IHN1Y2Nlc3NmdWxseSBpcyBkZWxldGVkIGFmdGVyIGl0IGlzIHNlbnQuIikpOworI2VuZGlmIC8qIE5PTVNFTkQgKi8KKworI2lmbmRlZiBOT1NQTAorY2FzZSBYWE9QRToKKyAgICByZXR1cm4oaG1zZ2Eob3BlbmhscCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKK2Nhc2UgWFhORVc6CisgICAgcmV0dXJuKGhtc2coCisiICBQcmludHMgbmV3cyBvZiBuZXcgZmVhdHVyZXMgc2luY2UgcHVibGljYXRpb24gb2YgXCJVc2luZyBDLUtlcm1pdFwiLiIpKTsKKworY2FzZSBYWFVQRDoKKyAgICByZXR1cm4oaG1zZygKKyIgIE5ldyBmZWF0dXJlcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBvbmxpbmUgS2VybWl0IDk1IG1hbnVhbCxcblwKKyAgIGFjY2Vzc2libGUgdmlhIHRoZSBNQU5VQUwgY29tbWFuZC4iKSk7CisKKyNpZm5kZWYgTk9TUEwKK2Nhc2UgWFhPVVQ6CisgICAgcmV0dXJuKGhtc2dhKGh4eG91dCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBBTllYMjUKKyNpZm5kZWYgSUJNWDI1CitjYXNlIFhYUEFEOgorICAgIHJldHVybihobXNnYShoeHhwYWQpKTsKKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNlbmRpZiAvKiBBTllYMjUgKi8KKworI2lmbmRlZiBOT1NQTAorY2FzZSBYWFBBVToKKyAgICByZXR1cm4oaG1zZ2EoaHh4cGF1KSk7CisKK2Nhc2UgWFhNU0w6CisgICAgcmV0dXJuKGhtc2dhKGh4eG1zbCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBUQ1BTT0NLRVQKK2Nhc2UgWFhQTkc6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUElORyBbIElQLWhvc3RuYW1lLW9yLW51bWJlciBdXG5cCisgIENoZWNrcyBpZiB0aGUgZ2l2ZW4gSVAgbmV0d29yayBob3N0IGlzIHJlYWNoYWJsZS4gIERlZmF1bHQgaG9zdCBpcyBmcm9tXG5cCisgIG1vc3QgcmVjZW50IFNFVCBIT1NUIG9yIFRFTE5FVCBjb21tYW5kLiAgUnVucyBzeXN0ZW0gUElORyBwcm9ncmFtLCBpZiBhbnkuIikKKyAgICAgICAgICAgKTsKKworY2FzZSBYWEZUUDoKKyNpZmRlZiBTWVNGVFAKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBGVFAgWyBJUC1ob3N0bmFtZS1vci1udW1iZXIgXVxuXAorICBNYWtlcyBhbiBGVFAgY29ubmVjdGlvbiB0byB0aGUgZ2l2ZW4gSVAgaG9zdCBvciwgaWYgbm8gaG9zdCBzcGVjaWZpZWQsIHRvXG5cCisgIHRoZSBjdXJyZW50IGhvc3QuICBVc2VzIHRoZSBzeXN0ZW0ncyBGVFAgcHJvZ3JhbSwgaWYgYW55LiIpKTsKKyNlbHNlCisjaWZuZGVmIE5PRlRQCisgICAgcmV0dXJuKGRvZnRwaGxwKCkpOworI2VuZGlmIC8qIE5PRlRQICovCisjZW5kaWYgLyogU1lTRlRQICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZm5kZWYgTk9GUklMTFMKK2Nhc2UgWFhQUkk6CisjaWZkZWYgVU5JWAorICAgIHJldHVybihobXNnKCJTeW50YXg6IFBSSU5UIGZpbGUgWyBvcHRpb25zIF1cblwKKyAgUHJpbnRzIHRoZSBsb2NhbCBmaWxlIG9uIGEgbG9jYWwgcHJpbnRlciB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLiAgQWxzbyBzZWVcblwKKyAgSEVMUCBTRVQgUFJJTlRFUi4iKSk7CisjZWxzZQorI2lmZGVmIFZNUworICAgIHJldHVybihobXNnKCJTeW50YXg6IFBSSU5UIGZpbGUgWyBvcHRpb25zIF1cblwKKyAgUHJpbnRzIHRoZSBsb2NhbCBmaWxlIG9uIGEgbG9jYWwgcHJpbnRlciB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLiAgQWxzbyBzZWVcblwKKyAgSEVMUCBTRVQgUFJJTlRFUi4iKSk7CisjZWxzZQorICAgIHJldHVybihobXNnKCJTeW50YXg6IFBSSU5UIGZpbGVcblwKKyAgUHJpbnRzIHRoZSBsb2NhbCBmaWxlIG9uIGEgbG9jYWwgcHJpbnRlci4gIEFsc28gc2VlIEhFTFAgU0VUIFBSSU5URVIuIikpOworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCitjYXNlIFhYUFdEOgorY2FzZSBYWExQV0Q6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUFdEXG5cCitQcmludCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4iKSk7CisKKyNpZm5kZWYgTk9TUEwKK2Nhc2UgWFhSRUE6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkVBRCB2YXJpYWJsZW5hbWVcblwKKyAgUmVhZHMgYSBsaW5lIGZyb20gdGhlIGN1cnJlbnRseSBvcGVuIFJFQUQgb3IgIVJFQUQgZmlsZSBpbnRvIHRoZSB2YXJpYWJsZVxuXAorICAoc2VlIE9QRU4pLiIpKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PWEZFUgorY2FzZSBYWFJFQzoKKyAgICByZXR1cm4oaG1zZ2EoaG14eHJjKSk7CisKK2Nhc2UgWFhSRU06CisgICAgeSA9IGNta2V5KHJlbWNtZCxucm10LCJSZW1vdGUgY29tbWFuZCIsIiIseHhzdHJpbmcpOworICAgIHJldHVybihkb2hybXQoeSkpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PU1BMCitjYXNlIFhYUkVUOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFJFVFVSTiBbIHZhbHVlIF1cblwKKyAgUmV0dXJuIGZyb20gYSBtYWNyby4gIEFuIG9wdGlvbmFsIHJldHVybiB2YWx1ZSBjYW4gYmUgZ2l2ZW4gZm9yIHVzZSB3aXRoXG5cCisgIFxcZmV4ZWN1dGUobWFjcm8pLCB3aGljaCBhbGxvd3MgbWFjcm9zIHRvIGJlIHVzZWQgbGlrZSBmdW5jdGlvbnMuIikpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9YRkVSCitjYXNlIFhYU0VOOgorICAgIHJldHVybihobXNnYShobXh4c2VuKSk7CitjYXNlIFhYTU9WRToKKyAgICByZXR1cm4oaG1zZygiTU9WRSBpcyBleGFjdGx5IGxpa2UgU0VORCwgZXhjZXB0IGVhY2ggZmlsZSB0aGF0IGlzXG5cCitzZW50IHN1Y2Nlc3NmdWxseSBpcyBkZWxldGVkIGFmdGVyIGl0IGlzIHNlbnQuIikpOworI2lmbmRlZiBOT1JFU0VORAorY2FzZSBYWFJTRU46CisgICAgcmV0dXJuKGhtc2coaG14eHJzZW4pKTsKK2Nhc2UgWFhSRUdFVDoKKyAgICByZXR1cm4oaG1zZyhobXh4cmdldCkpOworY2FzZSBYWFBTRU46CisgICAgcmV0dXJuKGhtc2coaG14eHBzZW4pKTsKKyNlbmRpZiAvKiBOT1JFU0VORCAqLworCisjaWZuZGVmIE5PU0VSVkVSCitjYXNlIFhYU0VSOgorICAgIHJldHVybihobXNnKGhteHhzZXIpKTsKKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PSkMKK2Nhc2UgWFhTVVM6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU1VTUEVORCBvciBaXG5cCisgIFN1c3BlbmRzIEtlcm1pdC4gIENvbnRpbnVlIEtlcm1pdCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzeXN0ZW0gY29tbWFuZCxcblwKKyAgc3VjaCBhcyBmZy4iKSk7CisjZW5kaWYgLyogTk9KQyAqLworCitjYXNlIFhYU0VUOgorICAgIHkgPSBjbWtleShwcm10YWIsbnBybSwiUGFyYW1ldGVyIiwiIix4eHN0cmluZyk7CisgICAgZGVidWcoRjEwMSwiSEVMUCBTRVQgeSIsIiIseSk7CisgICAgcmV0dXJuKGRvaHNldCh5KSk7CisKKyNpZm5kZWYgTk9QVVNICitjYXNlIFhYU0hFOgorICAgIGlmIChub3B1c2gpIHsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIHByaW50ZigiU29ycnksIGhlbHAgbm90IGF2YWlsYWJsZSBmb3IgXCIlc1wiXG4iLGNtZGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIH0gZWxzZQorICAgICAgIHJldHVybihobXNnYShoeHhzaGUpKTsKKyNpZmRlZiBDS19SRURJUgorY2FzZSBYWEZVTjoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBSRURJUkVDVCBjb21tYW5kXG5cCisgIFJ1bnMgdGhlIGdpdmVuIGxvY2FsIGNvbW1hbmQgd2l0aCBpdHMgc3RhbmRhcmQgaW5wdXQgYW5kIG91dHB1dCByZWRpcmVjdGVkXG5cCisgIHRvIHRoZSBjdXJyZW50IFNFVCBMSU5FIG9yIFNFVCBIT1NUIGNvbW11bmljYXRpb25zIHBhdGguXG5cCisgIFN5bm9ueW06IDwgKExlZnQgYW5nbGUgYnJhY2tldCkuIikpOworI2VuZGlmIC8qIENLX1JFRElSICovCisKKyNpZmRlZiBDS19SRVhYCitjYXNlIFhYUkVYWDoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBSRVhYIHRleHRcblwKKyAgVGhlIHRleHQgaXMgYSBSZXh4IGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQuIFRoZSBcXHYocmV4eCkgdmFyaWFibGUgaXMgc2V0XG5cCisgIHRvIHRoZSBSZXh4IGNvbW1hbmQncyByZXR1cm4gdmFsdWUuXG5cCisgIFRvIGV4ZWN1dGUgYSByZXh4IHByb2dyYW0gZmlsZSwgdXNlOiAgUkVYWCBjYWxsIDxmaWxlbmFtZT5cblwKKyAgUmV4eCBwcm9ncmFtcyBtYXkgY2FsbCBLZXJtaXQgZnVuY3Rpb25zIGJ5IHBsYWNpbmcgdGhlIEtlcm1pdCBjb21tYW5kXG5cCisgIGluIHNpbmdsZSBxdW90ZXMuICBGb3IgaW5zdGFuY2U6ICAnc2V0IHBhcml0eSBub25lJy4iKSk7CisjZW5kaWYgLyogQ0tfUkVYWCAqLworI2VuZGlmIC8qIE5PUFVTSCAqLworCisjaWZuZGVmIE5PU0hPVworY2FzZSBYWFNITzoKKyAgICByZXR1cm4oaG1zZygiXAorICBEaXNwbGF5IGN1cnJlbnQgdmFsdWVzIG9mIHZhcmlvdXMgaXRlbXMgKFNFVCBwYXJhbWV0ZXJzLCB2YXJpYWJsZXMsIGV0YykuXG5cCisgIFR5cGUgU0hPVyA/IGZvciBhIGxpc3Qgb2YgY2F0ZWdvcmllcy4iKSk7CisjZW5kaWYgLyogTk9TSE9XICovCisKK2Nhc2UgWFhTUEE6CisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICByZXR1cm4oaG1zZygiXAorICBEaXNwbGF5IGRpc2sgdXNhZ2UgaW4gY3VycmVudCBkZXZpY2UsIGRpcmVjdG9yeSxcblwKKyAgb3IgcmV0dXJuIHNwYWNlIGZvciBhIHNwZWNpZmllZCBkZXZpY2UsIGRpcmVjdG9yeS4iKSk7CisjZWxzZQorICAgIHJldHVybihobXNnKCJTeW50YXg6IFNQQUNFXG5cCisgIERpc3BsYXkgZGlzayB1c2FnZSBpbiBjdXJyZW50IGRldmljZSBhbmQvb3IgZGlyZWN0b3J5IikpOworI2VuZGlmCisKK2Nhc2UgWFhTVEE6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU1RBVElTVElDUyBbL0JSSUVGXVxuXAorICBEaXNwbGF5IHN0YXRpc3RpY3MgYWJvdXQgbW9zdCByZWNlbnQgZmlsZSB0cmFuc2ZlciIpKTsKKworI2lmbmRlZiBOT1NQTAorY2FzZSBYWFNUTzoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBTVE9QIFsgbnVtYmVyIFsgbWVzc2FnZSBdIF1cblwKKyAgU3RvcCBleGVjdXRpbmcgdGhlIGN1cnJlbnQgbWFjcm8gb3IgVEFLRSBmaWxlIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgdG9cblwKKyAgdGhlIEtlcm1pdCBwcm9tcHQuICBOdW1iZXIgaXMgYSByZXR1cm4gY29kZS4gIE1lc3NhZ2UgcHJpbnRlZCBpZiBnaXZlbi4iKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworY2FzZSBYWFRBSzoKKyAgICByZXR1cm4oaG1zZ2EoaG14eHRhaykpOworCisjaWZkZWYgVENQU09DS0VUCisjaWZkZWYgVE5DT0RFCitjYXNlIFhYSUtTRDoKKyAgICByZXR1cm4oaG1zZ2EoaG14eGlrcykpOworCitjYXNlIFhYVEVMOgorICAgIHJldHVybihobXNnYShobXh4dGVsKSk7CisKK2Nhc2UgWFhURUxPUDoKKyAgICByZXR1cm4oaG1zZ2EoaHh0b3B0KSk7CisjZW5kaWYgLyogVE5DT0RFICovCisKKyNpZmRlZiBSTE9HQ09ERQorY2FzZSBYWFJMT0c6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkxPR0lOIFsgc3dpdGNoZXMgXSBbIGhvc3QgWyB1c2VybmFtZSBdIF1cblwKKyAgRXF1aXZhbGVudCB0byBTRVQgTkVUV09SSyBUWVBFIFRDUC9JUCwgU0VUIEhPU1QgaG9zdCBbIHNlcnZpY2UgXSAvUkxPR0lOLFxuXAorICBJRiBTVUNDRVNTIENPTk5FQ1QuICBJZiBob3N0IGlzIG9taXR0ZWQsIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uIChpZiBhbnkpXG5cCisgIGlzIHJlc3VtZWQuICBEZXBlbmRpbmcgb24gaG93IEtlcm1pdCBoYXMgYmVlbiBidWlsdCBzd2l0Y2hlcyBtYXkgYmVcblwKKyAgYXZhaWxhYmxlIHRvIHJlcXVpcmUgS2VyYmVyb3MgYXV0aGVudGljYXRpb24gYW5kIERFUyBlbmNyeXB0aW9uLiIpKTsKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCisjaWZuZGVmIE5PWE1JVAorY2FzZSBYWFRSQToKKyAgICByZXR1cm4oaG1zZ2EoaHh4eG1pdCkpOworI2VuZGlmIC8qIE5PWE1JVCAqLworCisjaWZuZGVmIE5PRlJJTExTCitjYXNlIFhYVFlQOgorICAgIHJldHVybihobXNnYShobXh4dHlwKSk7CitjYXNlIFhYTU9SRToKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBNT1JFIFsgc3dpdGNoZXMgXSBmaWxlbmFtZVxuXAorICBFcXVpdmFsZW50IHRvIFRZUEUgL1BBR0UgZmlsZW5hbWU7IHNlZSBIRUxQIFRZUEUuIikpOworY2FzZSBYWENBVDoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBNT1JFIFsgc3dpdGNoZXMgXSBmaWxlbmFtZVxuXAorICBFcXVpdmFsZW50IHRvIFRZUEUgL05PUEFHRSBmaWxlbmFtZTsgc2VlIEhFTFAgVFlQRS4iKSk7CitjYXNlIFhYSEVBRDoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBIRUFEIFsgc3dpdGNoZXMgXSBmaWxlbmFtZVxuXAorICBFcXVpdmFsZW50IHRvIFRZUEUgL0hFQUQgZmlsZW5hbWU7IHNlZSBIRUxQIFRZUEUuIikpOworY2FzZSBYWFRBSUw6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogVEFJTCBbIHN3aXRjaGVzIF0gZmlsZW5hbWVcblwKKyAgRXF1aXZhbGVudCB0byBUWVBFIC9UQUlMIGZpbGVuYW1lOyBzZWUgSEVMUCBUWVBFLiIpKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisjaWZuZGVmIE5PU1BMCitjYXNlIFhYV0hJOgorICAgIHJldHVybihobXNnYSh3aGlobHApKTsKKworY2FzZSBYWFNXSVQ6CisgICAgcmV0dXJuKGhtc2dhKHN3aWhscCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9DU0VUUworY2FzZSBYWFhMQToKKyAgICByZXR1cm4oaG1zZ2EoaHh4eGxhKSk7CisjZW5kaWYgLyogTk9DU0VUUyAqLworCitjYXNlIFhYVkVSOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFZFUlNJT05cbkRpc3BsYXlzIHRoZSBwcm9ncmFtIHZlcnNpb24gbnVtYmVyLiIpKTsKKworI2lmbmRlZiBOT1NQTAorY2FzZSBYWFdBSToKKyAgICByZXR1cm4oaG1zZ2EoaHh4d2FpKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT0ZSSUxMUworY2FzZSBYWFdITzoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBXSE8gWyB1c2VyIF1cbkRpc3BsYXlzIGluZm8gYWJvdXQgdGhlIHVzZXIuIikpOworCitjYXNlIFhYV1JJOgorICAgIHJldHVybihobXNnYShoeHh3cmkpKTsKKworY2FzZSBYWFdSTDoKKyAgICByZXR1cm4oaG1zZygKKyJXUklURS1MSU5FIChXUklURUxOKSBpcyBqdXN0IGxpa2UgV1JJVEUsIGJ1dCBpbmNsdWRlcyBhIGxpbmUgdGVybWluYXRvclxuXAorYXQgdGhlIGVuZCBvZiB0ZXh0LiAgU2VlIFdSSVRFLiIpKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisjaWZuZGVmIE5PU1BMCitjYXNlIFhYSUZYOgorICAgIHJldHVybihobXNnYShpZnhobHApKTsKKworY2FzZSBYWEdFVEM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdFVEMgKi8KKyAgICByZXR1cm4oaG1zZ2EoaHh4Z2V0YykpOworCitjYXNlIFhYRldEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRk9SV0FSRCAqLworICAgIHJldHVybihobXNnKAorIkxpa2UgR09UTywgYnV0IHNlYXJjaGVzIG9ubHkgZm9yd2FyZCBmb3IgdGhlIGxhYmVsLiAgU2VlIEdPVE8uIikpOworCitjYXNlIFhYTE9DQUw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTE9DQUwgKi8KKyAgICByZXR1cm4oaG1zZygKKyJEZWNsYXJlcyBhIHZhcmlhYmxlIHRvIGJlIGxvY2FsIHRvIHRoZSBjdXJyZW50IG1hY3JvIG9yIGNvbW1hbmQgZmlsZS4iKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworY2FzZSBYWFZJRVc6CisgICAgcmV0dXJuKGhtc2coCisiVmlldyB0aGUgdGVybWluYWwgZW11bGF0aW9uIHNjcmVlbiBldmVuIHdoZW4gdGhlcmUgaXMgbm8gY29ubmVjdGlvbi4iKSk7CisKK2Nhc2UgWFhBU0M6CisgICAgcmV0dXJuKGhtc2coIlN5bm9ueW0gZm9yIFNFVCBGSUxFIFRZUEUgVEVYVC4iKSk7CisKK2Nhc2UgWFhCSU46CisgICAgcmV0dXJuKGhtc2coIlN5bm9ueW0gZm9yIFNFVCBGSUxFIFRZUEUgQklOQVJZLiIpKTsKKworY2FzZSBYWERBVEU6CisgICAgcmV0dXJuKGhtc2dhKGhteHhkYXRlKSk7CisKK2Nhc2UgWFhSRVRSOgorICAgIHJldHVybihobXNnKAorIkp1c3QgbGlrZSBHRVQgYnV0IGFza3MgdGhlIHNlcnZlciB0byBkZWxldGUgZWFjaCBmaWxlIHRoYXQgaGFzIGJlZW5cblwKK3NlbnQgc3VjY2Vzc2Z1bGx5LiIpKTsKKworY2FzZSBYWEVJR0hUOgorICAgIHJldHVybihobXNnKAorIkVxdWl2YWxlbnQgdG8gU0VUIFBBUklUWSBOT05FLCBTRVQgQ09NTUFORCBCWVRFIDgsIFNFVCBURVJNSU5BTCBCWVRFIDguIikpOworCitjYXNlIFhYU0FWRToKKyAgICByZXR1cm4oaG1zZ2EoaG14eHNhdmUpKTsKKworI2lmbmRlZiBOT0ZSSUxMUworI2lmbmRlZiBOT1BVU0gKK2Nhc2UgWFhFRElUOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IEVESVQgWyA8ZmlsZT4gXVxuXAorU3RhcnRzIHlvdXIgcHJlZmVycmVkIGVkaXRvciBvbiB0aGUgZ2l2ZW4gZmlsZSwgb3IgaWYgbm9uZSBnaXZlbiwgdGhlIG1vc3RcblwKK3JlY2VudGx5IGVkaXRlZCBmaWxlLCBpZiBhbnkuICBBbHNvIHNlZSBTRVQgRURJVE9SLiIpKTsKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisjaWZkZWYgQlJPV1NFUgorY2FzZSBYWEJST1dTOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IEJST1dTRSBbIDx1cmw+IF1cblwKK1N0YXJ0cyB5b3VyIHByZWZlcnJlZCBXZWIgYnJvd3NlciBvbiB0aGUgZ2l2ZW4gVVJMLCBvciBpZiBub25lIGdpdmVuLCB0aGVcblwKK21vc3QgcmVjZW50bHkgdmlzaXRlZCBVUkwsIGlmIGFueS4gIEFsc28gc2VlIFNFVCBCUk9XU0VSLiIpKTsKKyNlbmRpZiAvKiBCUk9XU0VSICovCisKKyNpZmRlZiBDS19UQVBJCitjYXNlIFhYVEFQSToKKyAgICByZXR1cm4oaG1zZ2EoaHh4dGFwaSkpOworI2VuZGlmIC8qIENLX1RBUEkgKi8KKworI2lmZGVmIFBJUEVTRU5ECitjYXNlIFhYQ1NFTjoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBDU0VORCBbIHN3aXRjaGVzIF0gPGNvbW1hbmQ+IFsgPGFzLW5hbWU+IF1cblwKK1NlbmRzIGZyb20gdGhlIGdpdmVuIDxjb21tYW5kPiByYXRoZXIgdGhhbiBmcm9tIGEgZmlsZS4gIEVxdWl2YWxlbnQgdG9cblwKK1NFTkQgL0NPTU1BTkQ7IHNlZSBIRUxQIFNFTkQgZm9yIGRldGFpbHMuIikpOworCitjYXNlIFhYQ1JFQzoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBDUkVDRUlWRSBbIHN3aXRjaGVzIF0gPGNvbW1hbmQ+XG5cCitSZWNlaXZlcyB0byB0aGUgZ2l2ZW4gPGNvbW1hbmQ+IHJhdGhlciB0aGFuIHRvIGEgZmlsZS4gIEVxdWl2YWxlbnQgdG9cblwKK1JFQ0VJVkUgL0NPTU1BTkQ7IHNlZSBIRUxQIFJFQ0VJVkUgZm9yIGRldGFpbHMuIikpOworCitjYXNlIFhYQ0dFVDoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBDR0VUIDxyZW1vdGUtZmlsZS1vci1jb21tYW5kPiA8bG9jYWwtY29tbWFuZD5cblwKK0VxdWl2YWxlbnQgdG8gR0VUIC9DT01NQU5EOyBzZWUgSEVMUCBHRVQgZm9yIGRldGFpbHMuIikpOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyNpZm5kZWYgTk9TUEwKK2Nhc2UgWFhGVU5DOgorLyoKKyAgVHJpY2t5IHBhcnNpbmcuICBXZSB3YW50IHRvIGxldCB0aGVtIHR5cGUgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gYW55IGZvcm1hdAorICBhdCBhbGw6IFxmYmxhaCgpLCBcZmJsYWgsIFxcZmJsYWgoKSwgZmJsYWgsIGJsYWgsIGJsYWgoKSwgZXRjLCBidXQgb2YgY291cnNlCisgIG9ubHkgb25lIG9mIHRoZXNlIGlzIHJlY29nbml6ZWQgYnkgY21rZXkoKS4gIFNvIHdlIGNhbGwgY21rZXl4KCkgKHRoZSAibm8KKyAgY29tcGxhaW50cyIgdmVyc2lvbiBvZiBjbWtleSgpKSwgYW5kIGlmIGl0IGZhaWxzLCB3ZSB0cnkgdGhlIG90aGVyIGZvcm1hdHMKKyAgc2lsZW50bHksIGFuZCBzdGlsbCBhbGxvdyBmb3IgPG5vLW5hbWUtZ2l2ZW4+LCBlZGl0aW5nIGFuZCByZXBhcnNlLCBldGMuCisqLworICAgIHkgPSBjbWtleXgoZm5jdGFiLG5mdW5jcywiTmFtZSBvZiBmdW5jdGlvbiIsIiIsTlVMTCk7CisgICAgaWYgKHkgPT0gLTEpIHsgICAgICAgICAgICAgICAgICAgICAgLyogUmVwYXJzZSBuZWVkZWQgKi8KKyAgICAgICAgcmV0dXJuKHkpOworICAgIH0gZWxzZSBpZiAoeSA9PSAtMykgeworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApICAgICAgICAgIC8qIEZvciByZWNhbGwgYnVmZmVyLi4uICovCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICByZXR1cm4oZG9oZnVuYyh5KSk7ICAgICAgICAgICAgIC8qIC0zIGdpdmVzIGdlbmVyYWwgbWVzc2FnZSAqLworICAgIH0KKyAgICBpZiAoeSA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb21ldGhpbmcgZ2l2ZW4gYnV0IGRpZG4ndCBtYXRjaCAqLworICAgICAgICBpbnQgZHVtbXk7CisgICAgICAgIGNoYXIgKiBwOworICAgICAgICBmb3IgKHAgPSBhdG1idWY7ICpwOyBwKyspIHsgICAgIC8qIENob3Agb2ZmIHRyYWlsaW5nIHBhcmVucyBpZiBhbnkgKi8KKyAgICAgICAgICAgIGlmICgqcCA9PSAnKCcpIHsKKyAgICAgICAgICAgICAgICAqcCA9IE5VTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBDaG9wIG9mZiBsZWFkaW5nICJcXGYiIG9yICJcZiIgb3IgImYiICovCisgICAgICAgIHAgPSBhdG1idWY7CisgICAgICAgIGlmICgqcCA9PSBDTURRKSAgICAgICAgICAgICAgICAgLyogQWxsb3cgZm9yIFxcZi4uLiAqLworICAgICAgICAgIHArKzsKKyAgICAgICAgaWYgKCpwID09IENNRFEgJiYgKCoocCsxKSA9PSAnZicgfHwgKihwKzEpID09ICdGJykpIHsgLyogb3IgXGYgKi8KKyAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgfSBlbHNlIGlmICgqcCA9PSAnZicgfHwgKnAgPT0gJ0YnKSB7IC8qIG9yIGp1c3QgZiAqLworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgIHkgPSBsb29rdXAoZm5jdGFiLHAsbmZ1bmNzLCZkdW1teSk7IC8qIExvb2sgdXAgdGhlIHJlc3VsdCAqLworICAgIH0KKyAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgcHJpbnRmKCI/Tm8gc3VjaCBmdW5jdGlvbiAtIFwiJXNcIlxuIixhdG1idWYpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICB4ID0gY21nYnJrKCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBGaW5kIG91dCBob3cgdXNlciB0ZXJtaW5hdGVkICovCisgICAgaWYgKHggPT0gTEYgfHwgeCA9PSBDUikgICAgICAgICAgICAgLyogaWYgd2l0aCBDUiBvciBMRiAqLworICAgICAgY21mbGdzID0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgY21mbGdzIHRvIHNheSBzbyAqLworICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgICAgICAgICAgICAgIC8qIEFuZCBUSEVOIGNvbmZpcm0gc28gY29tbWFuZCB3aWxsICovCisgICAgICByZXR1cm4oeCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGludG8gcmVjYWxsIGJ1ZmZlci4gKi8KKyAgICByZXR1cm4oZG9oZnVuYyh5KSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT0NNREwKK2Nhc2UgWFhPUFRTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kLWxpbmUgb3B0aW9ucyAqLworICAgIHJldHVybihkb2hvcHRzKCkpOworCitjYXNlIFhYWE9QVFM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgY29tbWFuZC1saW5lIG9wdGlvbnMgKi8KKyAgICByZXR1cm4oZG94b3B0cygpKTsKKyNlbmRpZiAvKiBOT0NNREwgKi8KKworI2lmZGVmIE9TMgorI2lmbmRlZiBOT0tWRVJCUworY2FzZSBYWEtWUkI6IHsKKyAgICB5ID0gY21rZXl4KGt2ZXJicyxua3ZlcmJzLCJOYW1lIG9mIGtleWJvYXJkIHZlcmIgd2l0aG91dCBcXGsiLCIiLE5VTEwpOworICAgIGlmICh5ID09IC0xKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcGFyc2UgbmVlZGVkICovCisgICAgICAgIHJldHVybih5KTsKKyAgICB9IGVsc2UgaWYgKHkgPT0gLTMpIHsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSAgICAgICAgICAvKiBGb3IgcmVjYWxsIGJ1ZmZlci4uLiAqLworICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgcmV0dXJuKGRvaGt2ZXJiKHkpKTsgICAgICAgICAgICAvKiAtMyBnaXZlcyBnZW5lcmFsIG1lc3NhZ2UgKi8KKyAgICB9CisgICAgaWYgKHkgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU29tZXRoaW5nIGdpdmVuIGJ1dCBkaWRuJ3QgbWF0Y2ggKi8KKyAgICAgICAgaW50IGR1bW15OworICAgICAgICBjaGFyICogcDsKKyAgICAgICAgZm9yIChwID0gYXRtYnVmOyAqcDsgcCsrKSB7ICAgICAvKiBDaG9wIG9mZiB0cmFpbGluZyBwYXJlbnMgaWYgYW55ICovCisgICAgICAgICAgICBpZiAoKnAgPT0gJygnKSB7CisgICAgICAgICAgICAgICAgKnAgPSBOVUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQ2hvcCBvZmYgbGVhZGluZyAiXFxrIiBvciAiXGsiIG9yICJrIiAqLworICAgICAgICBwID0gYXRtYnVmOworICAgICAgICBpZiAoKnAgPT0gQ01EUSkgICAgICAgICAgICAgICAgIC8qIEFsbG93IGZvciBcXGsuLi4gKi8KKyAgICAgICAgICBwKys7CisgICAgICAgIGlmICgqcCA9PSBDTURRICYmICgqKHArMSkgPT0gJ2snIHx8ICoocCsxKSA9PSAnSycpKSB7IC8qIG9yIFxrICovCisgICAgICAgICAgICBwICs9IDI7CisgICAgICAgIH0gZWxzZSBpZiAoKnAgPT0gJ2snIHx8ICpwID09ICdLJykgeyAvKiBvciBqdXN0IGsgKi8KKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgICAgICB5ID0gbG9va3VwKGt2ZXJicyxwLG5rdmVyYnMsJmR1bW15KTsgLyogTG9vayB1cCB0aGUgcmVzdWx0ICovCisgICAgfQorICAgIGlmICh5IDwgMCkgeworICAgICAgICBwcmludGYoIj9ObyBzdWNoIGZ1bmN0aW9uIC0gXCIlc1wiXG4iLGF0bWJ1Zik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIHggPSBjbWdicmsoKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgb3V0IGhvdyB1c2VyIHRlcm1pbmF0ZWQgKi8KKyAgICBpZiAoeCA9PSBMRiB8fCB4ID09IENSKSAgICAgICAgICAgICAvKiBpZiB3aXRoIENSIG9yIExGICovCisgICAgICBjbWZsZ3MgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBjbWZsZ3MgdG8gc2F5IHNvICovCisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSAgICAgICAgICAgICAgLyogQW5kIFRIRU4gY29uZmlybSBzbyBjb21tYW5kIHdpbGwgKi8KKyAgICAgIHJldHVybih4KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgaW50byByZWNhbGwgYnVmZmVyLiAqLworICAgIHJldHVybihkb2hrdmVyYih5KSk7Cit9CisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworY2FzZSBYWEtFUk1JOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IEtFUk1JVCBbY29tbWFuZC1saW5lLW9wdGlvbnNdXG5cCisgIExldHMgeW91IGdpdmUgY29tbWFuZC1saW5lIG9wdGlvbnMgYXQgdGhlIHByb21wdCBvciBpbiBhIHNjcmlwdC5cblwKKyAgSEVMUCBPUFRJT05TIGZvciBtb3JlIGluZm8uIikpOworCitjYXNlIFhYQkFDSzoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBCQUNLXG4gIFJldHVybnMgdG8geW91ciBwcmV2aW91cyBkaXJlY3RvcnkuIikpOworCitjYXNlIFhYV0hFUkU6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogV0hFUkVcbiAgVGVsbHMgd2hlcmUgeW91ciB0cmFuc2ZlcnJlZCBmaWxlcyB3ZW50LiIpKTsKKworI2lmbmRlZiBOT1hGRVIKK2Nhc2UgWFhSRU1WOgorICAgIHJldHVybihobXNnYShobXh4cmVtdikpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgQ0tfS0VSQkVST1MKK2Nhc2UgWFhBVVRIOgorICAgIHJldHVybihobXNnYShobXh4YXV0aCkpOworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKyNpZm5kZWYgTk9IVFRQCitjYXNlIFhYSFRUUDoKKyAgICByZXR1cm4oaG1zZ2EoaG14eGh0dHApKTsKKyNlbmRpZiAvKiBOT0hUVFAgKi8KKworI2lmZGVmIE5FVENNRAorY2FzZSBYWFBJUEU6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUElQRSBbIGNvbW1hbmQgXVxuXAorTWFrZXMgYSBjb25uZWN0aW9uIHRocm91Z2ggdGhlIHByb2dyYW0gd2hvc2UgY29tbWFuZCBsaW5lIGlzIGdpdmVuLiBFeGFtcGxlOlxuXAorXG4gcGlwZSBybG9naW4geHl6Y29ycC5jb20iKSk7CisjZW5kaWYgLyogTkVUQ01EICovCisKK2Nhc2UgWFhTVEFUVVM6CisgICAgcmV0dXJuKGhtc2coCisiU1RBVFVTIGlzIHRoZSBzYW1lIGFzIFNIT1cgU1RBVFVTOyBwcmludHMgU1VDQ0VTUyBvciBGQUlMVVJFIGZvciB0aGVcblwKK3ByZXZpb3VzIGNvbW1hbmQuIikpOworCisjaWZuZGVmIE5PU1BMCitjYXNlIFhYQVNTRVI6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogQVNTRVJUIDxjb25kaXRpb24+XG5cCitTdWNjZWVkcyBvciBmYWlscyBkZXBlbmRpbmcgb24gPGNvbmRpdGlvbj47IHNlZSBIRUxQIElGIGZvciA8Y29uZGl0aW9uPnMuIikpOworCitjYXNlIFhYRkFJTDoKKyAgICByZXR1cm4oaG1zZygiQWx3YXlzIGZhaWxzLiIpKTsKKworY2FzZSBYWFNVQ0M6CisgICAgcmV0dXJuKGhtc2coIkFsd2F5cyBzdWNjZWVkcy4iKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIENLX0xPR0lOCitjYXNlIFhYTE9HT1VUOgorICAgIHJldHVybihobXNnKAorIklmIHlvdSBoYXZlZCBsb2dnZWQgaW4gdG8gS2VybWl0IGFzIGFuIEludGVybmV0IEtlcm1pdCBzZXJ2ZXIsIHRoZSBMT0dPVVRcblwKK2NvbW1hbmQsIGdpdmVuIGF0IHRoZSBwcm9tcHQsIGxvZ3MgeW91IG91dCBhbmQgY2xvc2VzIHlvdXIgc2Vzc2lvbi4iKSk7CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKworY2FzZSBYWFJFU0VUOgorICAgIHJldHVybihobXNnKCJDbG9zZXMgYWxsIG9wZW4gZmlsZXMgYW5kIGxvZ3MuIikpOworCisjaWZuZGVmIE5PQ1NFVFMKK2Nhc2UgWFhBU1NPQzoKKyAgICByZXR1cm4oaG1zZ2EoaG14eGFzc29jKSk7CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisjaWZuZGVmIE5PU1BMCitjYXNlIFhYU0hJRlQ6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0hJRlQgWyBuIF1cblwKKyAgU2hpZnRzIFxcJTEuLjkgdmFyaWFibGVzIG4gcGxhY2VzIHRvIHRoZSBsZWZ0OyBkZWZhdWx0IG4gPSAxLiIpKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PUFVTSAorY2FzZSBYWE1BTjoKKyNpZmRlZiBVTklYCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogTUFOVUFMIFsgdG9waWMgXVxuXAorICBSdW5zIHRoZSBcIm1hblwiIGNvbW1hbmQgb24gdGhlIGdpdmVuIHRvcGljIChkZWZhdWx0IFwia2VybWl0XCIpLiIpKTsKKyNlbHNlCisjaWZkZWYgT1MyCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogTUFOVUFMXG5cCisgIEFjY2Vzc2VzIHRoZSBLZXJtaXQgOTUgSFRNTCBtYW51YWwgdXNpbmcgdGhlIGN1cnJlbnQgYnJvd3Nlci4iKSk7CisjZWxzZQorICAgIHJldHVybihobXNnKCJTeW50YXg6IE1BTlVBTCBbIHRvcGljIF1cblwKKyAgUnVucyB0aGUgXCJoZWxwXCIgY29tbWFuZCBvbiB0aGUgZ2l2ZW4gdG9waWMgKGRlZmF1bHQgXCJrZXJtaXRcIikuIikpOworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworY2FzZSBYWFdJTEQ6CisgICAgcmV0dXJuKGhtc2dhKGhteHh3aWxkKSk7CisKK2Nhc2UgWFhQQVQ6CisgICAgcmV0dXJuKGhtc2dhKGhteHhwYXQpKTsKKworI2lmbmRlZiBOT1hGRVIKK2Nhc2UgWFhGQVNUOgorY2FzZSBYWENBVToKK2Nhc2UgWFhST0I6CisgICAgcmV0dXJuKGhtc2dhKGhteHhmYXN0KSk7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBDS1BVUkdFCitjYXNlIFhYUFVSR0U6CisgICAgcmV0dXJuKGhtc2dhKGhteHhwdXJnZSkpOworI2Vsc2UKKyNpZmRlZiBWTVMKK2Nhc2UgWFhQVVJHRToKKyAgICByZXR1cm4oaG1zZ2EoaG14eHB1cmdlKSk7CisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogQ0tQVVJHRSAqLworCisjaWZuZGVmIE5PWEZFUgorICBjYXNlIFhYUkFTRzoKKyAgICByZXR1cm4oaG1zZygiICBSQVNHIGFuZCBSQVNTSUdOIGFyZSBzaG9ydCBmb3JtcyBvZiBSRU1PVEUgQVNTSUdOLiIpKTsKKyAgY2FzZSBYWFJDV0Q6CisgICAgcmV0dXJuKGhtc2coIiAgUkNEIGFuZCBSQ1dEIGFyZSBzaG9ydCBmb3JtcyBvZiBSRU1PVEUgQ0QuIikpOworICBjYXNlIFhYUkNQWToKKyAgICByZXR1cm4oaG1zZygiICBSQ09QWSBpcyBhIHNob3J0IGZvcm0gb2YgUkVNT1RFIENPUFkuIikpOworICBjYXNlIFhYUkRFTDoKKyAgICByZXR1cm4oaG1zZygiICBSREVMRVRFIGlzIGEgc2hvcnQgZm9ybSBvZiBSRU1PVEUgUkVMRVRFLiIpKTsKKyAgY2FzZSBYWFJESVI6CisgICAgcmV0dXJuKGhtc2coIiAgUkRJUkVDVE9SWSBpcyBhIHNob3J0IGZvcm0gb2YgUkVNT1RFIERJUkVDVE9SWS4iKSk7CisgIGNhc2UgWFhSWElUOgorICAgIHJldHVybihobXNnKCIgIFJFWElUIGlzIGEgc2hvcnQgZm9ybSBvZiBSRU1PVEUgRVhJVC4iKSk7CisgIGNhc2UgWFhSSExQOgorICAgIHJldHVybihobXNnKCIgIFJIRUxQIGlzIGEgc2hvcnQgZm9ybSBvZiBSRU1PVEUgSEVMUC4iKSk7CisgIGNhc2UgWFhSSE9TOgorICAgIHJldHVybihobXNnKCIgIFJIT1NUIGlzIGEgc2hvcnQgZm9ybSBvZiBSRU1PVEUgSE9TVC4iKSk7CisgIGNhc2UgWFhSS0VSOgorICAgIHJldHVybihobXNnKCIgIFJLRVJNSVQgaXMgYSBzaG9ydCBmb3JtIG9mIFJFTU9URSBLRVJNSVQuIikpOworICBjYXNlIFhYUk1LRDoKKyAgICByZXR1cm4oaG1zZygiICBSTUtESVIgaXMgYSBzaG9ydCBmb3JtIG9mIFJFTU9URSBNS0RJUi4iKSk7CisgIGNhc2UgWFhSUFJJOgorICAgIHJldHVybihobXNnKCIgIFJQUklOVCBpcyBhIHNob3J0IGZvcm0gb2YgUkVNT1RFIFBSSU5ULiIpKTsKKyAgY2FzZSBYWFJQV0Q6CisgICAgcmV0dXJuKGhtc2coIiAgUlBXRCBpcyBhIHNob3J0IGZvcm0gb2YgUkVNT1RFIFBXRC4iKSk7CisgIGNhc2UgWFhSUVVFOgorICAgIHJldHVybihobXNnKCIgIFFVRVJZIGFuZCBSUVVFUlkgYXJlIHNob3J0IGZvcm1zIG9mIFJFTU9URSBRVUVSWS4iKSk7CisgIGNhc2UgWFhSUkVOOgorICAgIHJldHVybihobXNnKCIgIFJSRU5BTUUgaXMgYSBzaG9ydCBmb3JtIG9mIFJFTU9URSBSRU5BTUUuIikpOworICBjYXNlIFhYUlJNRDoKKyAgICByZXR1cm4oaG1zZygiICBSUk1ESVIgaXMgYSBzaG9ydCBmb3JtIG9mIFJFTU9URSBSTURJUi4iKSk7CisgIGNhc2UgWFhSU0VUOgorICAgIHJldHVybihobXNnKCIgIFJTRVQgaXMgYSBzaG9ydCBmb3JtIG9mIFJFTU9URSBTRVQuIikpOworICBjYXNlIFhYUlNQQToKKyAgICByZXR1cm4oaG1zZygiICBSU1BBQ0UgaXMgYSBzaG9ydCBmb3JtIG9mIFJFTU9URSBTUEFDRS4iKSk7CisgIGNhc2UgWFhSVFlQOgorICAgIHJldHVybihobXNnKCIgIFJUWVBFIGlzIGEgc2hvcnQgZm9ybSBvZiBSRU1PVEUgVFlQRS4iKSk7CisgIGNhc2UgWFhSV0hPOgorICAgIHJldHVybihobXNnKCIgIFJXSE8gaXMgYSBzaG9ydCBmb3JtIG9mIFJFTU9URSBXSE8uIikpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisgIGNhc2UgWFhTQ1JOOgorICAgIHJldHVybihobXNnYShobXh4c2NybikpOworCisjaWZkZWYgQ0tFWEVDCisgIGNhc2UgWFhFWEVDOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IEVYRUMgPGNvbW1hbmQ+IFsgPGFyZzE+IFsgPGFyZzI+IFsgLi4uIF0gXVxuXAorICBDLUtlcm1pdCBvdmVybGF5cyBpdHNlbGYgd2l0aCB0aGUgZ2l2ZW4gc3lzdGVtIGNvbW1hbmQgYW5kIHN0YXJ0cyBpdCB3aXRoXG5cCisgIHRoZSBnaXZlbiBhcmd1bWVudHMuICBVcG9uIGFueSBlcnJvciwgY29udHJvbCByZXR1cm5zIHRvIEMtS2VybWl0LiIpKTsKKyNlbmRpZiAvKiBDS0VYRUMgKi8KKworI2lmbmRlZiBOT1NQTAorICBjYXNlIFhYVFJBQ0U6CisgICAgcmV0dXJuKGhtc2coCisiU3ludGF4OiBUUkFDRSB7IC9PTiwgL09GRiB9IHsgQVNTSUdOTUVOVFMsIENPTU1BTkQtTEVWRUwsIEFMTCB9XG5cCisgIFR1cm5zIHRyYWNpbmcgb2YgdGhlIGdpdmVuIG9iamVjdCBvbiBvciBvZmYuIikpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBDS19QRVJNUworI2lmZGVmIFVOSVgKKyAgY2FzZSBYWENITU9EOgorICAgIHJldHVybihobXNnYShobXh4Y2htb2QpKTsKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKworI2lmZGVmIENLUk9PVAorICBjYXNlIFhYQ0hSVDoKKyAgICByZXR1cm4oaG1zZ2EoaG14eGNocm9vdCkpOworI2VuZGlmIC8qIENLUk9PVCAqLworCisjaWZuZGVmIE5PU1BMCisgIGNhc2UgWFhQUk9NUDoKKyAgICByZXR1cm4oaG1zZ2EoaG14eHByb21wdCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgY2FzZSBYWEdSRVA6CisgICAgcmV0dXJuKGhtc2dhKGhteHhncmVwKSk7CisKKyNpZm5kZWYgTk9TRVhQCisjaWZuZGVmIE5PU1BMCisgIGNhc2UgWFhTRVhQOgorICAgIHJldHVybihobXNnYShobXh4c2V4cCkpOworI2VuZGlmIC8qIE5PU1BMICovCisjZW5kaWYgLyogTk9TRVhQICovCisKKyNpZmRlZiBDS0xFQVJOCisgIGNhc2UgWFhMRUFSTjoKKyAgICByZXR1cm4oaG1zZ2EoaG14eGxlYXJuKSk7CisjZW5kaWYgLyogQ0tMRUFSTiAqLworCisjaWZkZWYgQU5ZU1NICisgIGNhc2UgWFhTU0g6CisgICAgcmV0dXJuKGhtc2dhKGhteHhzc2gpKTsKKyNlbmRpZiAvKiBBTllTU0ggKi8KKworI2lmZGVmIFRDUFNPQ0tFVAorICBjYXNlIFhYRklSRVc6CisgICAgcmV0dXJuKGhtc2dhKGhteHhmaXJldykpOworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCisjaWZkZWYgTkVXRlRQCisgIGNhc2UgWFhVU0VSOgorICAgIHJldHVybihobXNnKCIgRXF1aXZhbGVudCB0byBGVFAgVVNFUi4iKSk7CisgIGNhc2UgWFhBQ0NUOgorICAgIHJldHVybihobXNnKCIgRXF1aXZhbGVudCB0byBGVFAgQUNDT1VOVC4iKSk7CisjZW5kaWYgLyogTkVXRlRQICovCisKKyAgY2FzZSBYWE9SSUU6CisgICAgcmV0dXJuKGhtc2coIiBTaG93cyB0aGUgZGlyZWN0b3JpZXMgaW1wb3J0YW50IHRvIEtlcm1pdC4iKSk7CisKKyAgY2FzZSBYWENPTlQ6CisgICAgcmV0dXJuKGhtc2coIiBJbiBhIEZPUiBvciBXSElMRSBsb29wOiBjb250aW51ZSB0aGUgbG9vcC5cblwKKyBBdCB0aGUgcHJvbXB0OiBjb250aW51ZSBhIHNjcmlwdCB0aGF0IGhhcyBcInNoZWxsZWQgb3V0XCIgdG8gdGhlIHByb21wdC4iKSk7CisKKyAgY2FzZSBYWE5PVEFWOgorICAgIHJldHVybihobXNnKCIgVGhpcyBjb21tYW5kIGlzIG5vdCBjb25maWd1cmVkIGluIHRoaXMgdmVyc2lvbiBvZiBLZXJtaXQuIikpOworCitkZWZhdWx0OiB7CisgICAgICAgIGNoYXIgKnM7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICBzID0gY21kYnVmICsgKGludClzdHJsZW4oY21kYnVmKSAtMTsKKyAgICAgICAgd2hpbGUgKHMgPj0gY21kYnVmICYmICpzID09IFNQKQorICAgICAgICAgICpzLS0gPSBOVUw7CisgICAgICAgIHdoaWxlIChzID49IGNtZGJ1ZiAmJiAqcyAhPSBTUCkKKyAgICAgICAgICBzLS07CisgICAgICAgIHdoaWxlICgqcyA9PSBTUCkgcysrOworICAgICAgICBwcmludGYoIlNvcnJ5LCBoZWxwIG5vdCBhdmFpbGFibGUgZm9yIFwiJXNcIlxuIixzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSAvKiBzd2l0Y2ggKi8KKyNlbmRpZiAvKiBOT0hFTFAgKi8KKworICAgIHJldHVybihzdWNjZXNzID0gMCk7Cit9CisKKy8qICBIIE0gUyBHICAtLSAgR2V0IGNvbmZpcm1hdGlvbiwgdGhlbiBwcmludCB0aGUgZ2l2ZW4gbWVzc2FnZSAgKi8KKworaW50CitobXNnKHMpIGNoYXIgKnM7IHsKKyAgICBpbnQgeDsKKyAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICBwcmludGYoIlxuJXNcblxuIixzKTsKKyAgICByZXR1cm4oMCk7Cit9CisKKyNpZmRlZiBOT0hFTFAKKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByaW50IGFuIGFycmF5IG9mIGxpbmVzLCAqLworaG1zZ2EocykgY2hhciAqc1tdOyB7ICAgICAgICAgICAgICAgICAgIC8qIGNoZWFwIHZlcnNpb24uICovCisgICAgaW50IGk7CisgICAgaWYgKChpID0gY21jZm0oKSkgPCAwKSByZXR1cm4oaSk7CisgICAgcHJpbnRmKCJcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhcnQgb2ZmIHdpdGggYSBibGFuayBsaW5lICovCisgICAgZm9yIChpID0gMDsgKnNbaV07IGkrKykgeyAgICAgICAgICAgLyogUHJpbnQgZWFjaCBsaW5lLiAqLworICAgICAgICBwcmludGYoIiVzXG4iLHNbaV0pOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisgICAgcmV0dXJuKDApOworfQorCisjZWxzZSAvKiBOT0hFTFAgbm90IGRlZmluZWQuLi4gKi8KKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByaW50IGFuIGFycmF5IG9mIGxpbmVzLCAqLworaG1zZ2EocykgY2hhciAqc1tdOyB7ICAgICAgICAgICAgICAgICAgIC8qIHBhdXNpbmcgYXQgZW5kIG9mIGVhY2ggc2NyZWVuLiAqLworICAgIGV4dGVybiBpbnQgaG10b3BsaW5lOyAgICAgICAgICAgICAgIC8qIChUaGlzIHNob3VsZCBiZSBhIHBhcmFtZXRlci4uLikgKi8KKyAgICBpbnQgeCwgeSwgaSwgaiwgaywgbjsKKyAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKworI2lmZGVmIENLX1RUR1dTSVoKKyNpZmRlZiBPUzIKKyAgICB0dGdjd3N6KCk7CisjZWxzZSAvKiBPUzIgKi8KKyAgICAvKiBDaGVjayB3aGV0aGVyIHdpbmRvdyBzaXplIGNoYW5nZWQgKi8KKyAgICBpZiAodHRnd3NpeigpID4gMCkgeworICAgICAgICBpZiAodHRfcm93cyA+IDAgJiYgdHRfY29scyA+IDApIHsKKyAgICAgICAgICAgIGNtZF9yb3dzID0gdHRfcm93czsKKyAgICAgICAgICAgIGNtZF9jb2xzID0gdHRfY29sczsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisKKyAgICBwcmludGYoIlxuIik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCBvZmYgd2l0aCBhIGJsYW5rIGxpbmUgKi8KKyAgICBuID0gKGhtdG9wbGluZSA+IDApID8gaG10b3BsaW5lIDogMTsgLyogTGluZSBjb3VudGVyICovCisgICAgZm9yIChpID0gMDsgKnNbaV07IGkrKykgeworICAgICAgICBwcmludGYoIiVzXG4iLHNbaV0pOyAgICAgICAgICAgIC8qIFByaW50IGEgbGluZS4gKi8KKyAgICAgICAgeSA9IChpbnQpc3RybGVuKHNbaV0pOworICAgICAgICBrID0gMTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHk7IGorKykgICAgICAgICAvKiBTZWUgaG93IG1hbnkgbmV3bGluZXMgd2VyZSAqLworICAgICAgICAgIGlmIChzW2ldW2pdID09ICdcbicpIGsrKzsgICAgIC8qIGluIHRoZSBzdHJpbmcuLi4gKi8KKyAgICAgICAgbiArPSBrOworICAgICAgICBpZiAobiA+IChjbWRfcm93cyAtIDMpICYmICpzW2krMV0pIC8qIEFmdGVyIGEgc2NyZWVuZnVsLCBnaXZlIHRoZW0gKi8KKyAgICAgICAgICBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyAgICAvKiBhICJtb3JlPyIgcHJvbXB0LiAqLworICAgICAgICAgIGVsc2UgbiA9IDA7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgICByZXR1cm4oMCk7Cit9CisKKyNpZm5kZWYgTk9YTUlUCitzdGF0aWMgY2hhciAqaHNldHhtaXRbXSA9IHsKKyJTeW50YXg6IFNFVCBUUkFOU01JVCBwYXJhbWV0ZXIgdmFsdWUiLAorIiAiLAorIkNvbnRyb2xzIHRoZSBiZWhhdmlvciBvZiB0aGUgVFJBTlNNSVQgY29tbWFuZCAoc2VlIEhFTFAgVFJBTlNNSVQpOiIsCisiICIsCisiU0VUIFRSQU5TTUlUIEVDSE8geyBPTiwgT0ZGIH0iLAorIiAgV2hldGhlciB0byBlY2hvIHRleHQgdG8geW91ciBzY3JlZW4gYXMgaXQgaXMgYmVpbmcgdHJhbnNtaXR0ZWQuIiwKKyIgIiwKKyJTRVQgVFJBTlNNSVQgRU9GIHRleHQiLAorIiAgVGV4dCB0byBzZW5kIGFmdGVyIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQsIGUuZy4gXFw0IGZvciBDdHJsLUQiLAorIiAiLAorIlNFVCBUUkFOU01JVCBGSUxMIG51bWJlciIsCisiICBBU0NJSSB2YWx1ZSBvZiBhIGNoYXJhY3RlciB0byBpbnNlcnQgaW50byBibGFuayBsaW5lcywgMCBmb3Igbm9uZS4iLAorIiAgQXBwbGllcyBvbmx5IHRvIHRleHQgbW9kZS4gIDAgYnkgZGVmYXVsdC4iLAorIiAiLAorIlNFVCBUUkFOU01JVCBMSU5FRkVFRCB7IE9OLCBPRkYgfSIsCisiICBUcmFuc21pdCBMaW5lZmVlZCBhcyB3ZWxsIGFzIENhcnJpYWdlIFJldHVybiAoQ1IpIGF0IHRoZSBlbmQgb2YgZWFjaCBsaW5lLiIsCisiICBOb3JtYWxseSwgb25seSBDUiAgaXMgc2VudC4iLAorIiAiLAorIlNFVCBUUkFOU01JVCBMT0NLSU5HLVNISUZUIHsgT04sIE9GRiB9IiwKKyIgIFdoZXRoZXIgdG8gdXNlIFNPL1NJIGZvciB0cmFuc21pdHRpbmcgOC1iaXQgZGF0YSB3aGVuIFBBUklUWSBpcyBub3QgTk9ORS4iLAorIiAiLAorIlNFVCBUUkFOU01JVCBQQVVTRSBudW1iZXIiLAorIiAgSG93IG1hbnkgbWlsbGlzZWNvbmRzIHRvIHBhdXNlIGFmdGVyIHRyYW5zbWl0dGluZyBlYWNoIGxpbmUgKHRleHQgbW9kZSksIiwKKyIgIG9yIGVhY2ggY2hhcmFjdGVyIChiaW5hcnkgbW9kZSkuIiwKKyIgIiwKKyJTRVQgVFJBTlNNSVQgUFJPTVBUIG51bWJlciIsCisiICBBU0NJSSB2YWx1ZSBvZiBjaGFyYWN0ZXIgdG8gbG9vayBmb3IgZnJvbSBob3N0IGJlZm9yZSBzZW5kaW5nIG5leHQgbGluZSIsCisiICB3aGVuIFRSQU5TTUlUdGluZyBpbiB0ZXh0IG1vZGU7IG5vcm1hbGx5IDEwIChMaW5lZmVlZCkuICAwIG1lYW5zIG5vbmU7IiwKKyIgIGRvbid0IHdhaXQgZm9yIGEgcHJvbXB0LiIsCisiICIsCisiU0VUIFRSQU5TTUlUIFRJTUVPVVQgbnVtYmVyIiwKKyIgIE51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIGVhY2ggY2hhcmFjdGVyIHRvIGVjaG8gd2hlbiBUUkFOU01JVCBFQ0hPIiwKKyIgIGlzIE9OIG9yIFRSQU5TTUlUIFBST01QVCBpcyBub3QgMC4gIElmIDAgaXMgc3BlY2lmaWVkLCB0aGlzIG1lYW5zIHdhaXQiLAorIiAgaW5kZWZpbml0ZWx5IGZvciBlYWNoIGVjaG8uIiwKKyIgIiwKKyJTeW5vbnltOiBTRVQgWE1JVC4gIFNIT1cgVFJBTlNNSVQgZGlzcGxheXMgY3VycmVudCBzZXR0aW5ncy4iLAorIiIgfTsKKyNlbmRpZiAvKiBOT1hNSVQgKi8KKworc3RhdGljIGNoYXIgKmhzZXRia2dbXSA9IHsKKyJTeW50YXg6IFNFVCBCQUNLR1JPVU5EIHsgT0ZGLCBPTiB9IiwKKyIgIiwKKyIgIFNFVCBCQUNLR1JPVU5EIE9GRiBmb3JjZXMgcHJvbXB0cyBhbmQgbWVzc2FnZXMgdG8gYXBwZWFyIG9uIHlvdXIgc2NyZWVuIiwKKyIgIGV2ZW4gdGhvdWdoIEtlcm1pdCB0aGlua3MgaXQgaXMgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZC4iLAorIiIgfTsKKworI2lmZGVmIERZTkFNSUMKK3N0YXRpYyBjaGFyICpoc2V0YnVmW10gPSB7CisiU3ludGF4OiBTRVQgQlVGRkVSUyBuMSBbIG4yIF0iLAorIiAiLAorIiAgQ2hhbmdlcyB0aGUgb3ZlcmFsbCBhbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZCBmb3IgU0VORCBhbmQgUkVDRUlWRSBwYWNrZXQiLAorIiAgYnVmZmVycywgcmVzcGVjdGl2ZWx5LiAgQmlnZ2VyIG51bWJlcnMgbGV0IHlvdSBoYXZlIGxvbmdlciBwYWNrZXRzIGFuZCIsCisiICBtb3JlIHdpbmRvdyBzbG90cy4gIElmIG4yIGlzIG9taXR0ZWQsIHRoZSBzYW1lIHZhbHVlIGFzIG4xIGlzIHVzZWQuIiwKKyNpZmRlZiBCSUdCVUZPSworIiAiLAorIiAgTk9URTogVGhpcyBjb21tYW5kIGlzIG5vdCBuZWVkZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIEtlcm1pdCwgd2hpY2ggaXMiLAorIiAgYWxyZWFkeSBjb25maWd1cmVkIGZvciBtYXhpbXVtLXNpemUgcGFja2V0IGJ1ZmZlcnMuIiwKKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworIiIgfTsKKyNlbmRpZiAvKiBEWU5BTUlDICovCisKK3N0YXRpYyBjaGFyICpoc2V0Y21kW10gPSB7CisiU3ludGF4OiBTRVQgQ09NTUFORCBwYXJhbWV0ZXIgdmFsdWUiLAorIiAiLAorCisjaWZkZWYgQ0tfQVVUT0RMCisiU0VUIENPTU1BTkQgQVVUT0RPV05MT0FEIHsgT04sIE9GRiB9IiwKKyIgIEVuYWJsZXMvRGlzYWJsZXMgYXV0b21hdGljIHJlY29nbml0aW9uIG9mIEtlcm1pdCBwYWNrZXRzIHdoaWxlIGluIiwKKyIgIGNvbW1hbmQgbW9kZS4gIE9OIGJ5IGRlZmF1bHQuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19BVVRPREwgKi8KKworIlNFVCBDT01NQU5EIEJZVEVTSVpFIHsgNywgOCB9IiwKKyIgIEluZm9ybXMgS2VybWl0IG9mIHRoZSBieXRlc2l6ZSBvZiB0aGUgY29tbXVuaWNhdGlvbiBwYXRoIGJldHdlZW4gaXRzZWxmIiwKKyIgIGFuZCB5b3VyIGtleWJvYXJkIGFuZCBzY3JlZW4uICA4IGlzIGFzc3VtZWQuICBTRVQgQ09NTUFORCBCWVRFIDcgb25seSBpZiIsCisiICA4LWJpdCBjaGFyYWN0ZXJzIGNhbm5vdCBwYXNzLiIsCisiICIsCisKKyNpZmRlZiBPUzIKKyJTRVQgQ09NTUFORCBDT0xPUiA8Zm9yZWdyb3VuZC1jb2xvcj4gPGJhY2tncm91bmQtY29sb3I+IiwKKyIgIExldHMgeW91IGNob29zZSBjb2xvcnMgZm9yIENvbW1hbmQgc2NyZWVuLiAgVXNlID8gaW4gdGhlIGNvbG9yIGZpZWxkcyB0byIsCisiICB0byBnZXQgbGlzdHMgb2YgYXZhaWxhYmxlIGNvbG9ycy4iLAorIiAiLAorIlNFVCBDT01NQU5EIENVUlNPUi1QT1NJVElPTiA8cm93PiA8Y29sdW1uPiIsCisiICBNb3ZlcyB0aGUgY29tbWFuZC1zY3JlZW4gY3Vyc29yIHRvIHRoZSBnaXZlbiBwb3NpdGlvbiAoMS1iYXNlZCkuICBUaGlzIiwKKyIgIGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQgaW4gc2NyaXB0cyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gQU5TSS5TWVMgZXNjYXBlIiwKKyIgIHNlcXVlbmNlcy4iLAorIiAiLAorI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgT1MyCisjaWZkZWYgTlQKKyJTRVQgQ09NTUFORCBIRUlHSFQgPG51bWJlcj4iLAorIiAgQ2hhbmdlcyB0aGUgbnVtYmVyIG9mIHJvd3MgKGxpbmVzKSBpbiB5b3VyIGNvbW1hbmQgc2NyZWVuLCBub3QiLAorIiAgY291bnRpbmcgdGhlIHN0YXR1cyBsaW5lLiAgUmVjb21tZW5kZWQgdmFsdWVzIGFyZSAyNCwgNDIsIGFuZCA0OSAob3IgMjUsIiwKKyIgIDQzLCBhbmQgNTAgaWYgU0VUIENPTU1BTkQgU1RBVFVTTElORSBpcyBPRkYuKSIsCisjZWxzZQorIlNFVCBDT01NQU5EIEhFSUdIVCA8bnVtYmVyPiIKKyIgIENoYW5nZXMgdGhlIG51bWJlciBvZiByb3dzIChsaW5lcykgaW4geW91ciBjb21tYW5kIHNjcmVlbiwgbm90IiwKKyIgIGNvdW50aW5nIHRoZSBzdGF0dXMgbGluZS4gIFdpbmRvd2VkIHNlc3Npb25zIGNhbiB1c2UgYW55IHZhbHVlIGZyb20gOCB0byIsCisiICAxMDEuICBGdWxsc2NyZWVuIHNlc3Npb25zIGFyZSBsaW1pdGVkIHRvIDI0LCA0MiwgNDksIG9yIDU5LiAgTm90IGFsbCIKKyIgIGhlaWdodHMgYXJlIHN1cHBvcnRlZCBieSBhbGwgdmlkZW8gYWRhcHRlcnMuIiwKKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UgIC8qIE9TMiAqLworIlNFVCBDT01NQU5EIEhFSUdIVCA8bnVtYmVyPiIsCisiICBJbmZvcm1zIEtlcm1pdCBvZiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4geW91ciBjb21tYW5kIHNjcmVlbiBmb3IgdGhlIiwKKyIgIHB1cnBvc2VzIG9mIE1vcmU/LXByb21wdGluZy4iLAorI2VuZGlmIC8qIE9TMiAqLworIiAiLAorIlNFVCBDT01NQU5EIFdJRFRIIDxudW1iZXI+IiwKKyIgIEluZm9ybXMgS2VybWl0IG9mIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3Jvc3MgeW91ciBzY3JlZW4gZm9yIiwKKyIgIHB1cnBvc2VzIG9mIHNjcmVlbiBmb3JtYXR0aW5nLiIsCisiICIsCisiU0VUIENPTU1BTkQgTU9SRS1QUk9NUFRJTkcgeyBPTiwgT0ZGIH0iLAorIiAgT04gKHRoZSBkZWZhdWx0KSBlbmFibGVzIE1vcmU/LXByb21wdGluZyB3aGVuIEtlcm1pdCBuZWVkcyB0byBkaXNwbGF5IiwKKyIgIHRleHQgdGhhdCBkb2VzIG5vdCBmaXQgdmVydGljYWxseSBvbiB5b3VyIHNjcmVlbi4gIE9GRiBhbGxvd3MgdGhlIHRleHQgdG8iLAorIiAgc2Nyb2xsIGJ5IHdpdGhvdXQgaW50ZXJ2ZW50aW9uLiAgSWYgeW91ciBjb21tYW5kIHdpbmRvdyBoYXMgc2Nyb2xsIGJhcnMsIiwKKyIgIHlvdSBtaWdodCBwcmVmZXIgT0ZGLiIsCisiICIsCisKKyNpZmRlZiBDS19SRUNBTEwKKyJTRVQgQ09NTUFORCBSRUNBTEwtQlVGRkVSLVNJWkUgbnVtYmVyIiwKKyIgIEhvdyBiaWcgeW91IHdhbnQgS2VybWl0J3MgY29tbWFuZCByZWNhbGwgYnVmZmVyIHRvIGJlLiAgQnkgZGVmYXVsdCwgaXQiLAorIiAgaG9sZHMgMTAgY29tbWFuZHMuICBZb3UgY2FuIG1ha2UgaXQgYW55IHNpemUgeW91IGxpa2UsIHN1YmplY3QgdG8gbWVtb3J5IiwKKyIgIGNvbnN0cmFpbnRzIG9mIHRoZSBjb21wdXRlci4gIEEgc2l6ZSBvZiAwIGRpc2FibGVzIGNvbW1hbmQgcmVjYWxsLiIsCisiICBXaGVuZXZlciB5b3UgZ2l2ZSB0aGlzIGNvbW1hbmQsIHByZXZpb3VzIGNvbW1hbmQgaGlzdG9yeSBpcyBsb3N0LiIsCisiICIsCisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisKKyJTRVQgQ09NTUFORCBRVU9USU5HIHsgT04sIE9GRiB9IiwKKyIgIFdoZXRoZXIgdG8gdHJlYXQgYmFja3NsYXNoIGFuZCBxdWVzdGlvbiBtYXJrIGFzIHNwZWNpYWwgY2hhcmFjdGVycyAoT04pLCIsCisiICBvciBhcyBvcmRpbmFyeSBkYXRhIGNoYXJhY3RlcnMgKE9GRikgaW4gY29tbWFuZHMuICBPTiBieSBkZWZhdWx0LiIsCisiICIsCisjaWZkZWYgRE9VQkxFUVVPVElORworIlNFVCBDT01NQU5EIERPVUJMRVFVT1RJTkcgeyBPTiwgT0ZGIH0iLAorIiAgV2hldGhlciB0byBhbGxvdyBkb3VibGVxdW90ZXMgKFwiKSB0byBiZSB1c2VkIHRvIGVuY2xvc2UgZmllbGRzLCIsCisiICBmaWxlbmFtZXMsIGRpcmVjdG9yeSBuYW1lcywgYW5kIG1hY3JvIGFyZ3VtZW50cyB0aGF0IG1pZ2h0IGNvbnRhaW4iLAorIiAgc3BhY2VzLiAgT04gYnkgZGVmYXVsdDsgdXNlIE9GRiB0byBmb3JjZSBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIiLAorIiAgdmVyc2lvbnMuIiwKKyIgIiwKKyNlbmRpZiAvKiBET1VCTEVRVU9USU5HICovCisKKyNpZmRlZiBDS19SRUNBTEwKKyJTRVQgQ09NTUFORCBSRVRSWSB7IE9OLCBPRkYgfSIsCisiICBXaGV0aGVyIHRvIHJlcHJvbXB0IHlvdSB3aXRoIHRoZSBjb3JyZWN0IGJ1dCBpbmNvbXBsZXRlIHBvcnRpb24gb2YgYSIsCisiICBzeW50YWN0aWNhbGx5IGluY29ycmVjdCBjb21tYW5kLiAgT04gYnkgZGVmYXVsdC4iLAorIiAiLAorI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworCisjaWZkZWYgT1MyCisiU0VUIENPTU1BTkQgU0NST0xMQkFDSyA8bGluZXM+IiwKKyIgIFNldHMgc2l6ZSBvZiB2aXJ0dWFsIENvbW1hbmQgc2NyZWVuIGJ1ZmZlciB0byB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGxpbmVzLCIsCisiICB3aGljaCBpbmNsdWRlcyB0aGUgYWN0aXZlIENvbW1hbmQgc2NyZWVuLiAgVGhlIG1pbmltdW0gaXMgMjU2LiAgVGhlIG1heCIsCisiICBpcyAyIG1pbGxpb24uICBUaGUgZGVmYXVsdCBpcyA1MTIuIiwKKyIgIiwKKyJTRVQgQ09NTUFORCBTVEFUVVNMSU5FIHsgT04sIE9GRiB9IiwKKyIgIE9OIChkZWZhdWx0KSBlbmFibGVzIHRoZSBLZXJtaXQgc3RhdHVzIGxpbmUgaW4gdGhlIGNvbW1hbmQgc2NyZWVuLiIsCisiICBPRkYgcmVtb3ZlcyBpdCwgbWFraW5nIHRoZSBsaW5lIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IHRoZSBob3N0LiIsCisiICIsCisjZW5kaWYgLyogT1MyICovCisKKyJVc2UgU0hPVyBDT01NQU5EIHRvIGRpc3BsYXkgdGhlc2Ugc2V0dGluZ3MuIiwKKyIiIH07CisKKyNpZm5kZWYgTk9MT0NBTAorc3RhdGljIGNoYXIgKmhzZXRjYXJbXSA9IHsKKyJTeW50YXg6IFNFVCBDQVJSSUVSLVdBVENIIHsgQVVUTywgT0ZGLCBPTiB9IiwKKyIgIiwKKyIgIEF0dGVtcHRzIHRvIGNvbnRyb2wgdHJlYXRtZW50IG9mIGNhcnJpZXIgKHRoZSBEYXRhIENhcnJpZXIgRGV0ZWN0IHNpZ25hbCkiLAorIiAgb24gc2VyaWFsIGNvbW11bmljYXRpb24gKFNFVCBMSU5FIG9yIFNFVCBQT1JUKSBkZXZpY2VzLiAgT04gbWVhbnMgdGhhdCIsCisiICBjYXJyaWVyIGlzIHJlcXVpcmVkIGF0IGFsbCB0aW1lcy4gIE9GRiBtZWFucyBjYXJyaWVyIGlzIG5ldmVyIHJlcXVpcmVkLiIsCisiICBBVVRPICh0aGUgZGVmYXVsdCkgbWVhbnMgY2FycmllciBpcyByZXF1aXJlZCBhdCBhbGwgdGltZXMgZXhjZXB0IGR1cmluZyIsCisiICB0aGUgRElBTCBjb21tYW5kLiAgQ29ycmVjdCBvcGVyYXRpb24gb2YgY2Fycmllci13YXRjaCBkZXBlbmRzIG9uIHRoZSIsCisiICBjYXBhYmlsaXRpZXMgb2YgdGhlIHVuZGVybHlpbmcgT1MsIGRyaXZlcnMsIGRldmljZXMsIGFuZCBjYWJsZXMuICBJZiB5b3UiLAorIiAgbmVlZCB0byBDT05ORUNUIHRvIGEgc2VyaWFsIGRldmljZSB0aGF0IGlzIG5vdCBhc3NlcnRpbmcgY2FycmllciwgYW5kIiwKKyIgIEtlcm1pdCB3b24ndCBsZXQgeW91LCB1c2UgU0VUIENBUlJJRVItV0FUQ0ggT0ZGLiAgVXNlIFNIT1cgQ09NTVVOSUNBVElPTlMiLAorIiAgdG8gZGlzcGxheSB0aGUgQ0FSUklFUi1XQVRDSCBzZXR0aW5nLiIsCisiIiB9OworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworc3RhdGljIGNoYXIgKmhzZXRhdFtdID0geworIlN5bnRheDogU0VUIEFUVFJJQlVURVMgbmFtZSBPTiBvciBPRkYiLAorIiAiLAorIiAgVXNlIHRoaXMgY29tbWFuZCB0byBlbmFibGUgKE9OKSBvciBkaXNhYmxlIChPRkYpIHRoZSB0cmFuc21pc3Npb24gb2YiLAorIiAgc2VsZWN0ZWQgZmlsZSBhdHRyaWJ1dGVzIGFsb25nIHdpdGggZWFjaCBmaWxlLCBhbmQgdG8gaGFuZGxlIG9yIGlnbm9yZSIsCisiICBzZWxlY3RlZCBpbmNvbWluZyBmaWxlIGF0dHJpYnV0ZXMsIGluY2x1ZGluZzoiLAorIiAiLAorI2lmbmRlZiBOT0NTRVRTCisiICAgQ0hBUkFDVEVSLVNFVDogIFRoZSB0cmFuc2ZlciBjaGFyYWN0ZXIgc2V0IGZvciB0ZXh0IGZpbGVzIiwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisiICAgREFURTogICAgICAgICAgIFRoZSBmaWxlJ3MgY3JlYXRpb24gZGF0ZSIsCisiICAgRElTUE9TSVRJT046ICAgIFVudXN1YWwgdGhpbmdzIHRvIGRvIHdpdGggdGhlIGZpbGUsIGxpa2UgTUFJTCBvciBQUklOVCIsCisiICAgTEVOR1RIOiAgICAgICAgIFRoZSBmaWxlJ3MgbGVuZ3RoIiwKKyIgICBQUk9URUNUSU9OOiAgICAgVGhlIGZpbGUncyBwcm90ZWN0aW9uIChwZXJtaXNzaW9ucykiLAorIiAgIFNZU1RFTS1JRDogICAgICBNYWNoaW5lL09wZXJhdGluZyBzeXN0ZW0gb2Ygb3JpZ2luIiwKKyIgICBUWVBFOiAgICAgICAgICAgVGhlIGZpbGUncyB0eXBlICh0ZXh0IG9yIGJpbmFyeSkiLAorIiAiLAorIllvdSBjYW4gYWxzbyBzcGVjaWZ5IEFMTCB0byBzZWxlY3QgYWxsIG9mIHRoZW0uICBFeGFtcGxlczoiLAorIiAiLAorIiAgIFNFVCBBVFRSIERBVEUgT0ZGIiwKKyIgICBTRVQgQVRUUiBMRU5HVEggT04iLAorIiAgIFNFVCBBVFRSIEFMTCBPRkYiLAorIiAiLAorIkFsc28gc2VlIEhFTFAgU0VUIFNFTkQgYW5kIEhFTFAgU0VUIFJFQ0VJVkUuIiwKKyIiCit9OworCitzdGF0aWMgY2hhciAqaHh5dGFrW10gPSB7CisiU3ludGF4OiBTRVQgVEFLRSBwYXJhbWV0ZXIgdmFsdWUiLAorIiAiLAorIiAgQ29udHJvbHMgYmVoYXZpb3Igb2YgVEFLRSBjb21tYW5kOiIsCisiICIsCisiU0VUIFRBS0UgRUNITyB7IE9OLCBPRkYgfSIsCisiICBUZWxscyB3aGV0aGVyIGNvbW1hbmRzIHJlYWQgZnJvbSBhIFRBS0UgZmlsZSBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRoZSIsCisiICBzY3JlZW4gKGlmIHNvLCBlYWNoIGNvbW1hbmQgaXMgc2hvd24gYXQgdGhlIHRpbWUgaXQgaXMgcmVhZCwgYW5kIGxhYmVsZWQiLAorIiAgd2l0aCBhIGxpbmUgbnVtYmVyKS4iLAorIiAiLAorIlNFVCBUQUtFIEVSUk9SIHsgT04sIE9GRiB9IiwKKyIgIFRlbGxzIHdoZXRoZXIgYSBUQUtFIGNvbW1hbmQgZmlsZSBzaG91bGQgYmUgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkIHdoZW4iLAorIiAgYSBjb21tYW5kIGZhaWxzLiAgVGhpcyBzZXR0aW5nIGlzIGxvY2FsIHRvIHRoZSBjdXJyZW50IGNvbW1hbmQgZmlsZSwgYW5kIiwKKyIgIGluaGVyaXRlZCBieSBzdWJvcmRpbmF0ZSBjb21tYW5kIGZpbGVzLiIsCisiIiB9OworCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzJNT1VTRQorc3RhdGljIGNoYXIgKmh4eW1vdXNlW10gPSB7CisiU3ludGF4OiBTRVQgTU9VU0UgQUNUSVZBVEUgeyBPTiwgT0ZGIH0iLAorIiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbW91c2UgaW4gQ29ubmVjdCBtb2RlLiAgRGVmYXVsdCBpcyBPTiIsCisiICIsCisiU3ludGF4OiBTRVQgTU9VU0UgQlVUVE9OIDxudW1iZXI+IDxrZXktbW9kaWZpZXI+IDxhY3Rpb24+IFsgPHRleHQ+IF0iLAorIiB3aGVyZToiLAorIiAgPG51bWJlcj4gaXMgdGhlIG1vdXNlIGJ1dHRvbiBudW1iZXIsIDEsIDIsIG9yIDM7IiwKKyIgIDxrZXktbW9kaWZpZXI+IGRlbm90ZXMgbW9kaWZpZXIga2V5cyBoZWxkIGRvd24gZHVyaW5nIHRoZSBtb3VzZSBldmVudDoiLAorIiAgIEFMVCwgQUxULVNISUZULCBDVFJMLCBDVFJMLUFMVCBDVFJMLUFMVC1TSElGVCwgQ1RSTC1TSElGVCwgU0hJRlQsIE5PTkU7IiwKKyIgIDxhY3Rpb24+IGlzIHRoZSBtb3VzZSBhY3Rpb24sIENMSUNLLCBEUkFHLCBvciBET1VCTEUtQ0xJQ0suIiwKKyIgIiwKKyIgVGhlIDx0ZXh0PiBoYXMgZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSA8dGV4dD4gZnJvbSB0aGUgU0VUIEtFWSIsCisiIGNvbW1hbmQgLS0gaXQgY2FuIGJlIGEgY2hhcmFjdGVyLCBhIHN0cmluZywgb25lIG9yIG1vcmUgS3ZlcmJzLCBhIG1hY3JvIiwKKyIgaW52b2tlZCBhcyBhIEt2ZXJiLCBvciBhbnkgY29tYmluYXRpb24gb2YgdGhlc2UuICBUaHVzLCBhbnl0aGluZyB0aGF0IGNhbiIsCisiIGJlIGFzc2lnbmVkIHRvIGEga2V5IGNhbiBhbHNvIGJlIGFzc2lnbmVkIHRvIHRoZSBtb3VzZSAtLSBhbmQgdmljZSB2ZXJzYS4iLAorIiBJZiB0aGUgPHRleHQ+IGlzIG9taXR0ZWQsIHRoZSBhY3Rpb24gd2lsbCBiZSBpZ25vcmVkLiAgRXhhbXBsZXM6IiwKKyIgIiwKKyIgU0VUIE1PVVNFIEJVVFRPTiAxIE5PTkUgRE9VQkxFIFxcS21vdXNlQ3VyUG9zIiwKKyIgU0VUIE1PVSBCIDIgU0hJRlQgQ0xJQ0sgaGVscFxcMTMiLAorIiAiLAorIiBEUkFHIG9wZXJhdGlvbnMgcGVyZm9ybSBhIFwibWFyayBtb2RlXCIgc2VsZWN0aW9uIG9mIFRleHQuIFlvdSBzaG91bGQiLAorIiBhc3NpZ24gb25seSB0aGUgZm9sbG93aW5nIGFjdGlvbnMgdG8gZHJhZyBvcGVyYXRpb25zOiIsCisiICIsCisiICBcXEtkdW1wICAgICAgICAgLSBjb3B5IG1hcmtlZCB0ZXh0IHRvIHByaW50ZXIgKG9yIGZpbGUpIiwKKyIgIFxcS21hcmtjb3B5Y2xpcCAtIGNvcHkgbWFya2VkIHRleHQgdG8gUE0gQ2xpcGJvYXJkIiwKKyIgIFxcS21hcmtjb3B5aG9zdCAtIGNvcHkgbWFya2VkIHRleHQgZGlyZWN0IHRvIEhvc3QiLAorIiAgXFxLbW91c2VtYXJrICAgIC0gbWFyayB0ZXh0LCBubyBjb3B5IG9wZXJhdGlvbiBwZXJmb3JtZWQiLAorIiAiLAorIiBUaGUgZm9sbG93aW5nIEt2ZXJiIGlzIG9ubHkgZm9yIHVzZSB3aXRoIHRoZSBtb3VzZToiLAorIiAiLAorIiAgXFxLbW91c2VDdXJQb3MiLAorIiAiLAorIiB3aGljaCByZXByZXNlbnRzIHRoZSBtb3VzZS1kaXJlY3RlZCB0ZXJtaW5hbCBjdXJzb3IgZmVhdHVyZS4iLAorIiAiLAorIlN5bnRheDogU0VUIE1PVVNFIENMRUFSIiwKKyIgUmVzdG9yZXMgYWxsIG1vdXNlIGV2ZW50cyB0byB0aGVpciBkZWZhdWx0IGRlZmluaXRpb25zIiwKKyIgICBCdXR0b24gMSBDdHJsLUNsaWNrID0gS3ZlcmI6IFxcS21vdXNldXJsIiwKKyIgICBCdXR0b24gMSBEb3VibGUtQ2xpY2sgPSBLdmVyYjogXFxLbW91c2VjdXJwb3MiLAorIiAgIEJ1dHRvbiAxIERyYWcgPSBLdmVyYjogXFxLbWFya2NvcHljbGlwIiwKKyIgICBCdXR0b24gMSBBbHQtRHJhZyA9IEt2ZXJiOiBcXEttYXJrY29weWNsaXBfbm9lb2wiLAorIiAgIEJ1dHRvbiAxIEN0cmwtRHJhZyA9IEt2ZXJiOiBcXEttYXJrY29weWhvc3QiLAorIiAgIEJ1dHRvbiAxIEN0cmwtQWx0LURyYWcgPSBLdmVyYjogXFxLbWFya2NvcHlob3N0X25vZW9sIiwKKyIgICBCdXR0b24gMSBDdHJsLVNoaWZ0LURyYWcgPSBLdmVyYjogXFxLZHVtcCIsCisiICAgQnV0dG9uIDIgRG91YmxlLUNsaWNrID0gS3ZlcmI6IFxcS3Bhc3RlIiwKKyIgICBCdXR0b24gMiBEcmFnID0gS3ZlcmI6IFxcS21hcmtjb3B5aG9zdCIsCisiICAgQnV0dG9uIDIgQWx0LURyYWcgPSBLdmVyYjogXFxLbWFya2NvcHlob3N0X25vZW9sICAgICAiLCAgICAKKyIgICBCdXR0b24gMyBEb3VibGUtQ2xpY2sgPSBLdmVyYjogXFxLcGFzdGUiLAorIiJ9OworI2VuZGlmIC8qIE9TMk1PVVNFICovCisKK3N0YXRpYyBjaGFyICpoeHl0ZXJtW10gPSB7CisiU3ludGF4OiBTRVQgVEVSTUlOQUwgcGFyYW1ldGVyIHZhbHVlIiwKKyIgIiwKKyNpZmRlZiBPUzIKKyJTRVQgVEVSTUlOQUwgVFlQRSB7IEFOU0ksIFZUNTIsIFZUMTAwLCBWVDEwMiwgVlQyMjAsIFZUMzIwLCAuLi4gfSIsCisiICBTZWxlY3RzIHR5cGUgdHlwZSBvZiB0ZXJtaW5hbCB0byBlbXVsYXRlLiAgVHlwZSBTRVQgVEVSTUlOQUwgVFlQRSA/IHRvIiwKKyIgIHNlZSBhIGNvbXBsZXRlIGxpc3QuIiwKKyIgIiwKKyJTRVQgVEVSTUlOQUwgQU5TV0VSQkFDSyB7IE9GRiwgT04gfSIsCisiICBEaXNhYmxlcy9lbmFibGVzIHRoZSBFTlEvQW5zd2VyYmFjayBzZXF1ZW5jZSAoXCJLLTk1IHZlcnNpb24gdGVybS10eXBlXCIpLiIsCisiICIsCisiU0VUIFRFUk1JTkFMIEFOU1dFUkJBQ0sgTUVTU0FHRSA8ZXh0ZW5zaW9uPiIsCisiICBBbGxvd3MgeW91IHRvIHNwZWNpZnkgYW4gZXh0ZW5zaW9uIHRvIHRoZSBkZWZhdWx0IGFuc3dlcmJhY2sgbWVzc2FnZS4iLAorIiAiLAorI2Vsc2UKKyJTRVQgVEVSTUlOQUwgVFlQRSAuLi4iLAorIiAgVGhpcyBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSB0aGlzIHZlcnNpb24gb2YgS2VybWl0IGRvZXMgbm90IiwKKyIgIGluY2x1ZGUgYSB0ZXJtaW5hbCBlbXVsYXRvci4gIEluc3RlYWQsIGl0IGlzIGEgXCJzZW1pdHJhbnNwYXJlbnQgcGlwZVwiIiwKKyIgIChvciBhIHRvdGFsbHkgdHJhbnNwYXJlbnQgb25lLCBpZiB5b3UgY29uZmlndXJlIGl0IHRoYXQgd2F5KSB0byB0aGUiLAorIiAgY29tcHV0ZXIgb3Igc2VydmljZSB5b3UgaGF2ZSBtYWRlIGEgY29ubmVjdGlvbiB0by4gIFlvdXIgY29uc29sZSwiLAorIiAgd29ya3N0YXRpb24gd2luZG93LCBvciB0aGUgdGVybWluYWwgZW11bGF0b3Igb3IgdGVybWluYWwgZnJvbSB3aGljaCB5b3UiLAorIiAgYXJlIHJ1bm5pbmcgS2VybWl0IHByb3ZpZGVzIHRoZSBlbXVsYXRpb24uIiwKKyIgIiwKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIENLX0FQQworIlNFVCBURVJNSU5BTCBBUEMgeyBPTiwgT0ZGLCBOTy1JTlBVVCwgTk8tSU5QVVQtVU5DSEVDS0VELCBVTkNIRUNLRUQgfSIsCisjaWZkZWYgT1MyCisiICBDb250cm9scyBleGVjdXRpb24gb2YgQXBwbGljYXRpb24gUHJvZ3JhbSBDb21tYW5kcyBzZW50IGJ5IHRoZSBob3N0IHdoaWxlIiwKKyIgIEstOTUgaXMgZWl0aGVyIGluIENPTk5FQ1QgbW9kZSBvciBwcm9jZXNzaW5nIElOUFVUIGNvbW1hbmRzLiAgT04gYWxsb3dzIiwKKyIgIGV4ZWN1dGlvbiBvZiBcInNhZmVcIiBjb21tYW5kcyBhbmQgZGlzYWxsb3dzIHBvdGVudGlhbGx5IGRhbmdlcm91cyBvbmVzIiwKKyIgIHN1Y2ggYXMgREVMRVRFLCBSRU5BTUUsIE9VVFBVVCwgYW5kIFJVTi4gIE9GRiBwcmV2ZW50cyBleGVjdXRpb24gb2YgQVBDcy4iLAorIiAgVU5DSEVDS0VEIGFsbG93cyBleGVjdXRpb24gb2YgYWxsIEFQQ3MuICBPRkYgaXMgdGhlIGRlZmF1bHQuIiwKKyNlbHNlIC8qIE9TMiAqLworIiAgQ29udHJvbHMgZXhlY3V0aW9uIG9mIEFwcGxpY2F0aW9uIFByb2dyYW0gQ29tbWFuZHMgc2VudCBieSB0aGUgaG9zdCB3aGlsZSIsCisiICBDLUtlcm1pdCBpcyBpbiBDT05ORUNUIG1vZGUuICBPTiBhbGxvd3MgZXhlY3V0aW9uIG9mIFwic2FmZVwiIGNvbW1hbmRzIGFuZCIsCisiICBkaXNhbGxvd3MgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNvbW1hbmRzIHN1Y2ggYXMgREVMRVRFLCBSRU5BTUUsIE9VVFBVVCwiLAorIiAgYW5kIFJVTi4gIE9GRiBwcmV2ZW50cyBleGVjdXRpb24gb2YgQVBDcy4gIFVOQ0hFQ0tFRCBhbGxvd3MgZXhlY3V0aW9uIG9mIiwKKyIgIGFsbCBBUENzLiAgT0ZGIGlzIHRoZSBkZWZhdWx0LiIsCisjZW5kaWYgLyogT1MyICovCisiICIsCisjZW5kaWYgLyogQ0tfQVBDICovCisKKyNpZmRlZiBPUzIKKyJTRVQgVEVSTUlOQUwgQVJST1ctS0VZUyB7IEFQUExJQ0FUSU9OLCBDVVJTT1IgfSIsCisiICBTZXRzIHRoZSBtb2RlIGZvciB0aGUgYXJyb3cga2V5cyBkdXJpbmcgVlQgdGVybWluYWwgZW11bGF0aW9uLiIsCisiICIsCisiU0VUIFRFUk1JTkFMIEFUVFJJQlVURSB7IEJMSU5LLCBESU0sIFBST1RFQ1RFRCwgUkVWRVJTRSwgVU5ERVJMSU5FIH0iLAorIiAgRGV0ZXJtaW5lcyBob3cgYXR0cmlidXRlcyBhcmUgZGlzcGxheWVkIGJ5IEtlcm1pdC05NS4iLAorIiAiLAorIlNFVCBURVJNSU5BTCBBVFRSSUJVVEUgeyBCTElOSywgRElNLCBSRVZFUlNFLCBVTkRFUkxJTkUgfSB7IE9OLCBPRkYgfSIsCisiICBEZXRlcm1pbmVzIHdoZXRoZXIgcmVhbCBCbGlua2luZywgRGltLCBSZXZlcnNlLCBhbmQgVW5kZXJsaW5lIGFyZSB1c2VkIGluIiwKKyIgIHRoZSB0ZXJtaW5hbCBkaXNwbGF5LiAgV2hlbiBCTElOSyBpcyB0dXJuZWQgT0ZGLCByZXZlcnNlIGJhY2tncm91bmQiLAorIiAgaW50ZW5zaXR5IGlzIHVzZWQuICBXaGVuIERJTSBpcyB0dXJuZWQgT0ZGLCBkaW0gY2hhcmFjdGVycyBhcHBlYXIgQk9MRC4iLAorIiAgV2hlbiBSRVZFUlNFIGFuZCBVTkRFUkxJTkUgYXJlIE9GRiwgdGhlIGNvbG9ycyBzZWxlY3RlZCB3aXRoIFNFVCIsCisiICBURVJNSU5BTCBDT0xPUiB7IFJFVkVSU0UsVU5ERVJMSU5FIH0gYXJlIHVzZWQgaW5zdGVhZC4gIFRoaXMgY29tbWFuZCIsCisiICBhZmZlY3RzIHRoZSBlbnRpcmUgY3VycmVudCBzY3JlZW4gYW5kIHRlcm1pbmFsIHNjcm9sbGJhY2sgYnVmZmVyLiIsCisiICIsCisiU0VUIFRFUk1JTkFMIEFUVFJJQlVURSBQUk9URUNURUQgWyAtIiwKKyIgICB7IEJPTEQsIERJTSwgSU5WSVNJQkxFLCBOT1JNQUwsIFJFVkVSU0UsIFVOREVSTElORUQgfSBdIiwKKyIgIFNldHMgdGhlIGF0dHJpYnV0ZXMgdXNlZCB0byByZXByZXNlbnQgUHJvdGVjdGVkIHRleHQgaW4gV3lzZSBhbmQgVGVsZXZpZGVvIiwKKyIgIHRlcm1pbmFsIGVtdWxhdGlvbnMuICBBbnkgY29tYmluYXRpb24gb2YgYXR0cmlidXRlcyBtYXkgYmUgdXNlZC4gIFRoZSIsCisiICBkZWZhdWx0IGlzIERJTS4pIiwKKyIgIiwKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIE9TMgorI2lmZGVmIENLX1hZWgorIlNFVCBURVJNSU5BTCBBVVRPRE9XTkxPQUQgeyBPTiwgT0ZGLCBFUlJPUiB7IFNUT1AsIENPTlRJTlVFIH0gfSIsCisiICBlbmFibGVzL2Rpc2FibGVzIGF1dG9tYXRpYyBzd2l0Y2hpbmcgaW50byBmaWxlLXRyYW5zZmVyIG1vZGUgd2hlbiBhIEtlcm1pdCIsCisiICBvciBaTU9ERU0gZmlsZSB0cmFuc2ZlciBoYXMgYmVlbiBkZXRlY3RlZCBkdXJpbmcgQ09OTkVDVCBtb2RlIG9yIHdoaWxlIiwKKyIgIGFuIElOUFVUIGNvbW1hbmQgaXMgYWN0aXZlLiAgRGVmYXVsdCBpcyBPRkYuIiwKKyNlbHNlCisiU0VUIFRFUk1JTkFMIEFVVE9ET1dOTE9BRCB7IE9OLCBPRkYsIEVSUk9SIHsgU1RPUCwgQ09OVElOVUUgfSB9IiwKKyIgIGVuYWJsZXMvZGlzYWJsZXMgYXV0b21hdGljIHN3aXRjaGluZyBpbnRvIGZpbGUtdHJhbnNmZXIgbW9kZSB3aGVuIGEgS2VybWl0IiwKKyIgIGZpbGUgdHJhbnNmZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgZHVyaW5nIENPTk5FQ1QgbW9kZSBvciB3aGlsZSBhbiBJTlBVVCIsCisiICBjb21tYW5kIGlzIGFjdGl2ZS4gIERlZmF1bHQgaXMgT0ZGLiIsCisjZW5kaWYgLyogQ0tfWFlaICovCisKKyIgIiwKKyIgIFdoZW4gVEVSTUlOQUwgQVVUT0RPV05MT0FEIGlzIE9OLCB0aGUgVEVSTUlOQUwgQVVUT0RPV05MT0FEIEVSUk9SIHNldHRpbmciLAorIiAgdGVsbHMgd2hhdCB0byBkbyBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGEgZmlsZSB0cmFuc2ZlciBvciBvdGhlciIsCisiICBwcm90b2NvbCBvcGVyYXRpb24gaW5pdGlhdGVkIGJ5IHRoZSB0ZXJtaW5hbCBlbXVsYXRvcjogU1RPUCAodGhlIGRlZmF1bHQpIiwKKyIgIG1lYW5zIHRvIHJlbWFpbiBpbiBjb21tYW5kIG1vZGUgc28geW91IGNhbiBzZWUgd2hhdCBoYXBwZW5lZDsgQ09OVElOVUUiLAorIiAgbWVhbnMgdG8gcmVzdW1lIHRoZSBDT05ORUNUIHNlc3Npb24gKGUuZy4gc28gYSBmYXItZW5kIHNjcmlwdCBjYW4gY29udGludWUiLAorIiAgaXRzIHdvcmspLiIsCisiICIsCisKKyNpZmRlZiBDS19YWVoKKyJTRVQgVEVSTS4uLiBBVVRPLi4uIHsgS0VSTUlULCBaTU9ERU0gfSBDMC1DT05GTElDVFMgeyBJR05PUkVELCBQUk9DRVNTRUQgfSIsCisiICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFjdGl2ZSB0ZXJtaW5hbCBlbXVsYXRvciBzaG91bGQgcHJvY2VzcyBvciBpZ25vcmUiLAorIiAgQzAgY29udHJvbCBjaGFyYWN0ZXJzIHdoaWNoIGFyZSBhbHNvIHVzZWQgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSB0cmFuc2ZlciIsCisiICBwcm90b2NvbC4gIEtlcm1pdCBieSBkZWZhdWx0IHVzZXMgXkEgKFNPSCkgYW5kIFptb2RlbSB1c2VzIF5YIChDQU4pLiIsCisiICBEZWZhdWx0IGlzIFBST0NFU1NFRC4iLAorIiAiLAorIlNFVCBURVJNLi4uIEFVVE8uLi4geyBLRVJNSVQsIFpNT0RFTSB9IERFVEVDVElPTi1NRVRIT0QgeyBQQUNLRVQsIFNUUklORyB9IiwKKyIgIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgdHJhbnNmZXIgcHJvdG9jb2wgc2hvdWxkIGJlIGRldGVjdGVkIiwKKyIgIGJ5IGxvb2tpbmcgZm9yIHZhbGlkIHBhY2tldHMgb3IgYnkgaWRlbnRpZnlpbmcgYSBzcGVjaWZpZWQgdGV4dCBzdHJpbmcuIiwKKyIgIERlZmF1bHQgaXMgUEFDS0VULiIsCisiICIsCisiU0VUIFRFUk0uLi4gQVVUTy4uLiB7IEtFUk1JVCwgWk1PREVNIH0gU1RSSU5HIDx0ZXh0PiIsCisiICBMZXRzIHlvdSBhc3NpZ24gYW4gYXV0b2Rvd25sb2FkIGRldGVjdGlvbiBzdHJpbmcgZm9yIHVzZSB3aXRoIHRoZSIsCisiICBzcGVjaWZpZWQgZmlsZSB0cmFuc2ZlciBwcm90b2NvbC4iLAorIiAgRGVmYXVsdCBmb3IgS2VybWl0IGlzIFwiUkVBRFkgVE8gU0VORC4uLlwiLCBmb3IgWm1vZGVtIGlzIFwicnpcXHsxM31cIi4iLAorIiAiLAorI2Vsc2UgLyogQ0tfWFlaICovCisiU0VUIFRFUk0uLi4gQVVUTy4uLiBLRVJNSVQgQzAtQ09ORkxJQ1RTIHsgSUdOT1JFRCwgUFJPQ0VTU0VEIH0iLAorIiAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBhY3RpdmUgdGVybWluYWwgZW11bGF0b3Igc2hvdWxkIHByb2Nlc3Mgb3IgaWdub3JlIiwKKyIgIEMwIGNvbnRyb2wgY2hhcmFjdGVycyB3aGljaCBhcmUgYWxzbyB1c2VkIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUgdHJhbnNmZXIiLAorIiAgcHJvdG9jb2wuICBLZXJtaXQgYnkgZGVmYXVsdCB1c2VzIF5BIDxTT0g+LiAgRGVmYXVsdCBpcyBQUk9DRVNTRUQuIiwKKyIgIiwKKyJTRVQgVEVSTS4uLiBBVVRPLi4uIEtFUk1JVCBERVRFQ1RJT04tTUVUSE9EIHsgUEFDS0VULCBTVFJJTkcgfSIsCisiICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIHRyYW5zZmVyIHByb3RvY29sIHNob3VsZCBiZSBkZXRlY3RlZCIsCisiICBieSBsb29raW5nIGZvciB2YWxpZCBwYWNrZXRzIG9yIGJ5IGlkZW50aWZ5aW5nIGEgc3BlY2lmaWVkIHRleHQgc3RyaW5nLiIsCisiICBEZWZhdWx0IGlzIFBBQ0tFVC4iLAorIiAiLAorIlNFVCBURVJNLi4uIEFVVE8uLi4gS0VSTUlUIFNUUklORyA8dGV4dD4iLAorIiAgTGV0cyB5b3UgYXNzaWduIGFuIGF1dG9kb3dubG9hZCBkZXRlY3Rpb24gc3RyaW5nIGZvciB1c2Ugd2l0aCB0aGUiLAorIiAgc3BlY2lmaWVkIGZpbGUgdHJhbnNmZXIgcHJvdG9jb2wuICBEZWZhdWx0IGlzIFwiUkVBRFkgVE8gU0VORC4uLlwiLiIsCisiICIsCisjZW5kaWYgLyogQ0tfWFlaICovCisiU0VUIFRFUk1JTkFMIEFVVE9QQUdFIHsgT04sIE9GRiB9IiwKKyIgIiwKKyJTRVQgVEVSTUlOQUwgQVVUT1NDUk9MTCB7IE9OLCBPRkYgfSIsCisiICIsCisjZWxzZSAvKiBPUzIgKi8KKyJTRVQgVEVSTUlOQUwgQVVUT0RPV05MT0FEIHsgT04sIE9GRiwgRVJST1IgeyBTVE9QLCBDT05USU5VRSB9IH0iLAorIiAgRW5hYmxlcy9kaXNhYmxlcyBhdXRvbWF0aWMgc3dpdGNoaW5nIGludG8gZmlsZS10cmFuc2ZlciBtb2RlIHdoZW4gYSB2YWxpZCIsCisjaWZkZWYgQ0tfWFlaCisiICBLZXJtaXQgb3IgWk1PREVNIHBhY2tldCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZSBpcyByZWNlaXZlZCBkdXJpbmcgQ09OTkVDVCIsCisiICBtb2RlLiAgRGVmYXVsdCBpcyBPRkYuIiwKKyNlbHNlCisiICBLZXJtaXQgcGFja2V0IG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGlzIHJlY2VpdmVkIGR1cmluZyBDT05ORUNUIG1vZGUuIiwKKyIgIERlZmF1bHQgaXMgT0ZGLiIsCisjZW5kaWYgLyogQ0tfWFlaICovCisKKyIgIiwKKyIgIFdoZW4gVEVSTUlOQUwgQVVUT0RPV05MT0FEIGlzIE9OLCB0aGUgVEVSTUlOQUwgQVVUT0RPV05MT0FEIEVSUk9SIHNldHRpbmciLAorIiAgdGVsbHMgd2hhdCB0byBkbyBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGEgZmlsZSB0cmFuc2ZlciBvciBvdGhlciIsCisiICBwcm90b2NvbCBvcGVyYXRpb24gaW5pdGlhdGVkIGJ5IHRoZSB0ZXJtaW5hbCBlbXVsYXRvcjogU1RPUCAodGhlIGRlZmF1bHQpIiwKKyIgIG1lYW5zIHRvIHJlbWFpbiBpbiBjb21tYW5kIG1vZGUgc28geW91IGNhbiBzZWUgd2hhdCBoYXBwZW5lZDsgQ09OVElOVUUiLAorIiAgbWVhbnMgdG8gcmVzdW1lIHRoZSBDT05ORUNUIHNlc3Npb24gKGUuZy4gc28gYSBmYXItZW5kIHNjcmlwdCBjYW4gY29udGludWUiLAorIiAgaXRzIHdvcmspLiIsCisiICIsCisKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIE9TMgorIlNFVCBURVJNSU5BTCBCRUxMIHsgQVVESUJMRSwgVklTSUJMRSwgTk9ORSB9IiwKKyIgIFNwZWNpZmllcyBob3cgQ29udHJvbC1HIChiZWxsKSBjaGFyYWN0ZXJzIGFyZSBoYW5kbGVkLiAgQVVESUJMRSBtZWFucyIsCisiICBhIGJlZXAgaXMgc291bmRlZDsgVklTSUJMRSBtZWFucyB0aGUgc2NyZWVuIGlzIGZsYXNoZWQgbW9tZW50YXJpbHkuIiwKKyIgIiwKKyIgIChUaGlzIGNvbW1hbmQgaGFzIGJlZW4gc3VwZXJzZWRlZCBieSBTRVQgQkVMTC4pIiwKKyIgIiwKKyNlbmRpZiAvKiBPUzIgKi8KKworIlNFVCBURVJNSU5BTCBCWVRFU0laRSB7IDcsIDggfSIsCisiICBVc2UgNy0gb3IgOC1iaXQgY2hhcmFjdGVycyBiZXR3ZWVuIEtlcm1pdCBhbmQgdGhlIHJlbW90ZSBjb21wdXRlciBkdXJpbmciLAorIiAgdGVybWluYWwgc2Vzc2lvbnMuICBUaGUgZGVmYXVsdCBpcyA4LiIsCisiICIsCisKKyNpZm5kZWYgTk9DU0VUUworI2lmZGVmIE9TMgorIlNFVCBURVJNSU5BTCBDSEFSQUNURVItU0VUIDxyZW1vdGUtY3M+IiwKKyIgIFNwZWNpZmllcyB0aGUgY2hhcmFjdGVyIHNldCB1c2VkIGJ5IHRoZSByZW1vdGUgaG9zdCwgPHJlbW90ZS1jcz4uIiwKKyIgIEVxdWl2YWxlbnQgdG8gU0VUIFRFUk0gUkVNT1RFLUNIQVJBQ1RFUi1TRVQgPHJlbW90ZS1jcz4gQUxMLiAgRm9yIG1vcmUiLAorIiAgY29udHJvbCBvdmVyIHRoZSBkZXRhaWxzLCB1c2UgU0VUIFRFUk0gUkVNT1RFLUNIQVJBQ1RFUi1TRVQgYW5kIChpbiIsCisiICBub24tR1VJIEs5NSB2ZXJzaW9ucykgU0VUIFRFUk0gTE9DQUwtQ0hBUkFDVEVSLVNFVDsgdGhlc2UgYXJlIGV4cGxhaW5lZCIsCisiICBiZWxvdy4gIFRoZSBkZWZhdWx0IFRFUk1JTkFMIENIQVJBQ1RFUi1TRVQgaXMgTEFUSU4xIChJU08gODg1OS0xKS4iLAorI2Vsc2UgIC8qIG5vdCBPUzIgKi8KKyJTRVQgVEVSTUlOQUwgQ0hBUkFDVEVSLVNFVCA8cmVtb3RlLWNzPiBbIDxsb2NhbC1jcz4gXSIsCisiICBTcGVjaWZpZXMgdGhlIGNoYXJhY3RlciBzZXQgdXNlZCBieSB0aGUgcmVtb3RlIGhvc3QsIDxyZW1vdGUtY3M+LCBhbmQgdGhlIiwKKyIgIGNoYXJhY3RlciBzZXQgdXNlZCBieSBDLUtlcm1pdCBsb2NhbGx5LCA8bG9jYWwtY3M+LiAgSWYgeW91IGRvbid0IHNwZWNpZnkiLAorIiAgdGhlIGxvY2FsIGNoYXJhY3RlciBzZXQsIHRoZSBjdXJyZW50IEZJTEUgQ0hBUkFDVEVSLVNFVCBpcyB1c2VkLiAgV2hlbiIsCisiICB5b3Ugc3BlY2lmeSB0d28gZGlmZmVyZW50IGNoYXJhY3RlciBzZXRzLCBDLUtlcm1pdCB0cmFuc2xhdGVzIGJldHdlZW4gdGhlbSIsCisiICBkdXJpbmcgQ09OTkVDVC4gIEJ5IGRlZmF1bHQsIGJvdGggY2hhcmFjdGVyIHNldHMgYXJlIFRSQU5TUEFSRU5ULCBhbmQiLAorIiAgbm8gdHJhbnNsYXRpb24gaXMgZG9uZS4iLAorI2VuZGlmIC8qIE9TMiAqLworIiAiLAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmZGVmIE9TMgorCisiU0VUIFRFUk1JTkFMIENPREUtUEFHRSA8bnVtYmVyPiIsCisiICBMZXRzIHlvdSBjaGFuZ2UgdGhlIFBDIGNvZGUgcGFnZS4gIE9ubHkgd29ya3MgZm9yIGNvZGUgcGFnZXMgdGhhdCBhcmUiLAorIiAgc3VjY2Vzc2Z1bGx5IHByZXBhcmVkIGluIENPTkZJRy5TWVMuICBVc2UgU0hPVyBURVJNSU5BTCB0byBsaXN0IHRoZSIsCisiICBjdXJyZW50IGNvZGUgcGFnZSBhbmQgdGhlIGF2YWlsYWJsZSBjb2RlIHBhZ2VzLiIsCisjaWZkZWYgT1MyT05MWQorIiAiLAorIiAgQWxzbyBzZWUgU0VUIFRFUk1JTkFMIEZPTlQgaWYgdGhlIGRlc2lyZWQgY29kZSBwYWdlIGluIG5vdCBhdmFpbGFibGUgaW4iLAorIiAgeW91ciB2ZXJzaW9uIG9mIE9TLzIuIiwKKyNlbmRpZiAvKiBPUzJPTkxZICovCisiICIsCisKKyNpZm5kZWYgTlQKKyJTRVQgVEVSTUlOQUwgQ09MT1IgQk9SREVSIDxmb3JlZ3JvdW5kPiIsCisjZW5kaWYgLyogTlQgKi8KKyJTRVQgVEVSTUlOQUwgQ09MT1IgPHNjcmVlbnBhcnQ+IDxmb3JlZ3JvdW5kPiA8YmFja2dyb3VuZD4iLAorIiBTZXRzIHRoZSBjb2xvcnMgb2YgdGhlIHRlcm1pbmFsIGVtdWxhdGlvbiBzY3JlZW4uIiwKKyIgPHNjcmVlbnBhcnQ+IG1heSBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZzoiLAorIiAgREVCVUcsIEhFTFAtVEVYVCwgUkVWRVJTRSwgU0VMRUNUSU9OLCBTVEFUVVMtTElORSwgVEVSTUlOQUwtU0NSRUVOLCBvciIsCisiICBVTkRFUkxJTkVELVRFWFQuIiwKKyIgPGZvcmVncm91bmQ+IGFuZCA8YmFja2dyb3VuZD4gbWF5IGJlIGFueSBvZjoiLAorIiAgQkxBQ0ssIEJMVUUsIEdSRUVOLCBDWUFOLCBSRUQsIE1BR0VOVEEsIEJST1dOLCBMR1JBWSwgREdSQVksIExCTFVFLCIsCisiICBMR1JFRU4sIExDWUFOLCBMUkVELCBMTUFHRU5UQSwgWUVMTE9XIG9yIFdISVRFLiIsCisiIFRoZSBMIHByZWZpeCBmb3IgdGhlIGNvbG9yIG5hbWVzIG1lYW5zIExpZ2h0LiIsCisiICIsCisKKyJTRVQgVEVSTUlOQUwgQ09MT1IgRVJBU0UgeyBDVVJSRU5ULUNPTE9SLCBERUZBVUxULUNPTE9SIH0iLAorIiAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IGNvbG9yIGFzIHNldCBieSB0aGUgaG9zdCBvciB0aGUgZGVmYXVsdCIsCisiICBjb2xvciBhcyBzZXQgYnkgdGhlIHVzZXIgKFNFVCBURVJNSU5BTCBDT0xPUiBURVJNSU5BTCkgaXMgdXNlZCB0byBjbGVhciIsCisiICB0aGUgc2NyZWVuIHdoZW4gZXJhc2UgY29tbWFuZHMgYXJlIHJlY2VpdmVkIGZyb20gdGhlIGhvc3QuIiwKKyIgIiwKKworIlNFVCBURVJNSU5BTCBDT0xPUiBSRVNFVC1PTi1FU0NbMG0geyBDVVJSRU5ULUNPTE9SLCBERUZBVUxULUNPTE9SIH0iLAorIiAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IGNvbG9yIG9yIHRoZSBkZWZhdWx0IGNvbG9yIGlzIHVzZWQgYWZ0ZXIiLAorIiAgPEVTQz5bMG0gKFwicmVzZXQgYXR0cmlidXRlc1wiKSBjb21tYW5kIHNlcXVlbmNlIGlzIHJlY2VpdmVkIGZyb20gdGhlIiwKKyIgIGhvc3QuIiwKKyIgIiwKKworIlNFVCBURVJNSU5BTCBDT05UUk9MUyB7IDcsIDggfSIsCisiICBEZXRlcm1pbmVzIHdoZXRoZXIgVlQyMjAvMzIwIG9yIFd5c2UgMzcwIGZ1bmN0aW9uIGtleXMsIGFycm93IGtleXMsIGV0YywiLAorIiAgdGhhdCBnZW5lcmF0ZSBBTlNJLWZvcm1hdCBlc2NhcGUgc2VxdWVuY2VzIHNob3VsZCBzZW5kIDgtYml0IGNvbnRyb2wiLAorIiAgY2hhcmFjdGVycyBvciA3LWJpdCBlc2NhcGUgc2VxdWVuY2VzLiIsCisiICIsCisjZW5kaWYgLyogT1MyICovCisKKyJTRVQgVEVSTUlOQUwgQ1ItRElTUExBWSB7IENSTEYsIE5PUk1BTCB9IiwKKyIgIFNwZWNpZmllcyBob3cgaW5jb21pbmcgY2FycmlhZ2UgcmV0dXJuIGNoYXJhY3RlcnMgYXJlIHRvIGJlIGRpc3BsYXllZCIsCisiICBvbiB5b3VyIHNjcmVlbi4iLAorIiAiLAorCisjaWZkZWYgT1MyCisjaWZkZWYgS1VJCisiU0VUIFRFUk1JTkFMIENVUlNPUiB7IEZVTEwsIEhBTEYsIFVOREVSTElORSB9IHtPTiwgT0ZGLCBOT0JMSU5LfSIsCisiICBTZWxlY3RzIHRoZSBjdXJzb3Igc3R5bGUgYW5kIHZpc2liaWxpdHkgZm9yIHRoZSB0ZXJtaW5hbCBzY3JlZW4uIiwKKyNlbHNlCisiU0VUIFRFUk1JTkFMIENVUlNPUiB7IEZVTEwsIEhBTEYsIFVOREVSTElORSB9IHtPTiwgT0ZGfSIsCisiICBTZWxlY3RzIHRoZSBjdXJzb3Igc3R5bGUgYW5kIHZpc2liaWxpdHkgZm9yIHRoZSB0ZXJtaW5hbCBzY3JlZW4uIiwKKyNlbmRpZiAvKiBLVUkgKi8KKyIgIiwKKyJTRVQgVEVSTUlOQUwgREctVU5JWC1NT0RFIHsgT04sIE9GRiB9IiwKKyIgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBEYXRhIEdlbmVyYWwgZW11bGF0aW9ucyBzaG91bGQgYWNjZXB0IGNvbnRyb2wiLAorIiAgc2VxdWVuY2VzIGluIFVuaXggY29tcGF0aWJsZSBmb3JtYXQgb3IgaW4gbmF0aXZlIERHIGZvcm1hdC4gIFRoZSIsCisiICBkZWZhdWx0IGlzIE9GRiwgREcgZm9ybWF0LiIsCisiICIsCisjZW5kaWYgLyogT1MyICovCisKKyJTRVQgVEVSTUlOQUwgREVCVUcgeyBPTiwgT0ZGIH0iLAorIiAgVHVybnMgdGVybWluYWwgc2Vzc2lvbiBkZWJ1Z2dpbmcgb24gYW5kIG9mZi4gIFdoZW4gT04sIGluY29taW5nIGNvbnRyb2wiLAorIiAgY2hhcmFjdGVycyBhcmUgZGlzcGxheWVkIHN5bWJvbGljYWxseSwgcmF0aGVyIHRoYW4gYmUgdGFrZW4gYXMgZm9ybWF0dGluZyIsCisiICBjb21tYW5kcy4gIFNFVCBURVJNSU5BTCBERUJVRyBPTiBpbXBsaWVzIFNFVCBURUxORVQgREVCVUcgT04uIiwKKyIgIiwKKyNpZmRlZiBPUzIKKyJTRVQgVEVSTUlOQUwgREctVU5JWC1NT0RFIHsgT04sIE9GRiB9IiwKKyIgIiwKKyNlbmRpZiAvKiBPUzIgKi8KKworIlNFVCBURVJNSU5BTCBFQ0hPIHsgTE9DQUwsIFJFTU9URSB9IiwKKyIgIFNwZWNpZmllcyB3aGljaCBzaWRlIGRvZXMgdGhlIGVjaG9pbmcgZHVyaW5nIHRlcm1pbmFsIGNvbm5lY3Rpb24uIiwKKyIgIiwKKworIlNFVCBURVJNSU5BTCBFU0NBUEUtQ0hBUkFDVEVSIHsgRU5BQkxFRCwgRElTQUJMRUQgfSIsCisiICBUdXJucyBvbi9vZmYgdGhlIGFiaWxpdHkgdG8gZXNjYXBlIGJhY2sgZnJvbSBDT05ORUNUIG1vZGUgdXNpbmcgdGhlIFNFVCIsCisjaWZkZWYgT1MyCisiICBFU0NBUEUgY2hhcmFjdGVyLiAgSWYgeW91IGRpc2FibGUgaXQgeW91IGNhbiBzdGlsbCBnZXQgYmFjayB1c2luZyBBbHQta2V5IiwKKyIgIGNvbWJpbmF0aW9ucyBhcyBzaG93biBpbiB0aGUgc3RhdHVzIGxpbmUuICBBbHNvIHNlZSBIRUxQIFNFVCBFU0NBUEUuIiwKKyNlbHNlCisiICBFU0NBUEUgY2hhcmFjdGVyLiAgSWYgeW91IGRpc2FibGUgaXQsIEtlcm1pdCByZXR1cm5zIHRvIGl0cyBwcm9tcHQgb25seSIsCisiICB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBieSB0aGUgb3RoZXIgZW5kLiAgVVNFIFdJVEggRVhUUkVNRSBDQVVUSU9OLiIsCisiICBBbHNvIHNlZSBIRUxQIFNFVCBFU0NBUEUuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyIgIiwKKworI2lmZGVmIE9TMgorI2lmZGVmIEtVSQorIlNFVCBURVJNSU5BTCBGT05UIDxmYWNlbmFtZT4gPGhlaWdodD4iLAorIiAgU3BlY2lmaWVzIHRoZSBmb250IHRvIGJlIHVzZWQgaW4gdGhlIEtlcm1pdCA5NSB3aW5kb3cuICBUaGUgZm9udCBpcyIsCisiICBkZXRlcm1pbmVkIGJ5IHRoZSBjaG9pY2Ugb2YgYSBmYWNlbmFtZSBhbmQgYSBoZWlnaHQgbWVhc3VyZWQgaW4gUG9pbnRzLiIsCisiICBUaGUgYXZhaWxhYmxlIGZhY2VuYW1lcyBhcmUgdGhvc2UgaW5zdGFsbGVkIGluIHRoZSBGb250IENvbnRyb2wgUGFuZWwuIiwKKyIgIiwKKyNlbHNlIC8qIEtVSSAqLworI2lmZGVmIE9TMk9OTFkKKyJTRVQgVEVSTUlOQUwgRk9OVCB7IENQNDM3LCBDUDg1MCwgQ1A4NTIsIENQODYyLCBDUDg2NiwgREVGQVVMVCB9IiwKKyIgIENQNDM3IC0gT3JpZ2luYWwgUEMgY29kZSBwYWdlIiwKKyIgIENQODUwIC0gXCJNdWx0aWxpbmd1YWxcIiAoV2VzdCBFdXJvcGUpIGNvZGUgcGFnZSIsCisiICBDUDg1MiAtIEVhc3QgRXVyb3BlIFJvbWFuIEFscGhhYmV0IGNvZGUgcGFnZSAoZm9yIEN6ZWNoLCBQb2xpc2gsIGV0YykiLAorIiAgQ1A4NjIgLSBIZWJyZXcgY29kZSBwYWdlIiwKKyIgIENQODY2IC0gQ3lyaWxsaWMgKFJ1c3NpYW4sIEJlbG9ydXNzaWFuLCBhbmQgVWtyYWluaWFuKSBjb2RlIHBhZ2UiLAorIiAiLAorIiAgTG9hZHMgYSBzb2Z0IGludG8gdGhlIHZpZGVvIGFkYXB0ZXIgZm9yIHVzZSBkdXJpbmcgdGVybWluYWwgZW11bGF0aW9uLiIsCisiICBVc2UgdGhpcyBjb21tYW5kIHdoZW4geW91ciBPUy8yIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZSBkZXNpcmVkIGNvZGUuIiwKKyIgIHBhZ2UuICBDYW4gYmUgdXNlZCBvbmx5IGluIGZ1bGwtc2NyZWVuIHNlc3Npb25zLiAgQWxzbyBzZWUgU0VUIFRFUk1JTkFMIiwKKyIgIENPREUtUEFHRSBhbmQgU0VUIFRFUk1JTkFMIFJFTU9URS1DSEFSQUNURVItU0VULiIsCisiICIsCisjZW5kaWYgLyogT1MyT05MWSAqLworI2VuZGlmIC8qIEtVSSAqLworCisjaWZkZWYgTlQKKyJTRVQgVEVSTUlOQUwgSEVJR0hUIDxudW1iZXI+IiwKKyIgIENoYW5nZXMgdGhlIG51bWJlciBvZiByb3dzIChsaW5lcykgdG8gdXNlIGR1cmluZyB0ZXJtaW5hbCBlbXVsYXRpb24sIG5vdCIsCisiICBjb3VudGluZyB0aGUgc3RhdHVzIGxpbmUuICBSZWNvbW1lbmRlZCB2YWx1ZXMgYXJlIDI0LCA0MiwgYW5kIDQ5IChvciAyNSwiLAorIiAgNDMsIGFuZCA1MCBpZiBTRVQgVEVSTUlOQUwgU1RBVFVTTElORSBpcyBPRkYuKSIsCisjZWxzZQorIlNFVCBURVJNSU5BTCBIRUlHSFQgPG51bWJlcj4iCisiICBDaGFuZ2VzIHRoZSBudW1iZXIgb2Ygcm93cyAobGluZXMpIHRvIHVzZSBkdXJpbmcgdGVybWluYWwgZW11bGF0aW9uLCBub3QiLAorIiAgY291bnRpbmcgdGhlIHN0YXR1cyBsaW5lLiAgV2luZG93ZWQgc2Vzc2lvbnMgY2FuIHVzZSBhbnkgdmFsdWUgZnJvbSA4IHRvIiwKKyIgIDEwMS4gIEZ1bGxzY3JlZW4gc2Vzc2lvbnMgYXJlIGxpbWl0ZWQgdG8gMjQsIDQyLCA0OSwgb3IgNTkuICBOb3QgYWxsIgorIiAgaGVpZ2h0cyBhcmUgc3VwcG9ydGVkIGJ5IGFsbCB2aWRlbyBhZGFwdGVycy4iLAorI2VuZGlmIC8qIE5UICovCisjZWxzZSAgLyogT1MyICovCisiU0VUIFRFUk1JTkFMIEhFSUdIVCA8bnVtYmVyPiIsCisiICBUZWxscyBDLUtlcm1pdCBob3cgbWFueSByb3dzIChsaW5lcykgYXJlIG9uIHlvdXIgQ09OTkVDVC1tb2RlIHNjcmVlbi4iLAorI2VuZGlmIC8qIE9TMiAqLworIiAiLAorCisjaWZkZWYgQ0tUSURMRQorIlNFVCBURVJNSU5BTCBJRExFLVRJTUVPVVQgPG51bWJlcj4iLAorIiAgU2V0cyB0aGUgbGltaXQgb24gaWRsZSB0aW1lIGluIENPTk5FQ1QgbW9kZSB0byB0aGUgZ2l2ZW4gbnVtYmVyIG9mIiwKKyIgIHNlY29uZHMuICAwICh0aGUgZGVmYXVsdCkgbWVhbnMgbm8gbGltaXQuIiwKKyIgIiwKKyJTRVQgVEVSTUlOQUwgSURMRS1BQ1RJT04geyBFWElULCBIQU5HVVAsIE9VVFBVVCBbIHRleHQgXSwgUkVUVVJOIH0iLAorIiAgU3BlY2lmaWVzIHRoZSBhY3Rpb24gdG8gYmUgdGFrZW4gd2hlbiBhIENPTk5FQ1Qgc2Vzc2lvbiBpcyBpZGxlIGZvciB0aGUiLAorIiAgbnVtYmVyIG9mIHNlY29uZHMgZ2l2ZW4gYnkgU0VUIFRFUk1JTkFMIElETEUtVElNRU9VVC4gIFRoZSBkZWZhdWx0IGFjdGlvbiIsCisiICBpcyB0byBSRVRVUk4gdG8gY29tbWFuZCBtb2RlLiAgRVhJVCBleGl0cyBmcm9tIEtlcm1pdDsgSEFOR1VQIGhhbmdzIHVwIHRoZSIsCisiICBjb25uZWN0aW9uLCBhbmQgT1VUUFVUIHNlbmRzIHRoZSBnaXZlbiB0ZXh0IHRvIHRoZSBob3N0IHdpdGhvdXQgbGVhdmluZyIsCisiICBDT05ORUNUIG1vZGU7IGlmIG5vIHRleHQgaXMgZ2l2ZW4gYSBOVUwgKDApIGNoYXJhY3RlciBpcyBzZW50LiIsCisjaWZkZWYgVE5DT0RFCisiICIsCisiQW5kIGZvciBUZWxuZXQgY29ubmVjdGlvbnM6IiwKKyIgIiwKKyJTRVQgVEVSTUlOQUwgSURMRS1BQ1RJT04geyBURUxORVQtTk9QLCBURUxORVQtQVlUIH0iLAorIiAgU2VuZHMgdGhlIGluZGljYXRlZCBUZWxuZXQgcHJvdG9jb2wgbWVzc2FnZTogTm8gT3BlcmF0aW9uIChOT1ApIG9yIiwKKyIgIFwiQXJlIFlvdSBUaGVyZT9cIiAoQVlUKS4iLAorI2VuZGlmIC8qIFROQ09ERSAqLworIiAiLAorI2VuZGlmIC8qIENLVElETEUgKi8KKworI2lmZGVmIE9TMgorCisiU0VUIFRFUk1JTkFMIEtEQi1GT0xMT1dTLUdML0dSIHsgT04sIE9GRiB9IiwKKyIgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBrZXlib2FyZCBjaGFyYWN0ZXIgc2V0IHNob3VsZCBmb2xsb3cgdGhlIiwKKyIgIGFjdGl2ZSBHTCBhbmQgR1IgY2hhcmFjdGVyIHNldHMuICBUaGlzIGZlYXR1cmUgaXMgT0ZGIGJ5IGRlZmF1bHQgYW5kIiwKKyIgIHNob3VsZCBub3QgYmUgdXNlZCB1bmxlc3MgaXQgaXMgc3BlY2lmaWNseSByZXF1aXJlZCBieSB0aGUgaG9zdCIsCisiICBhcHBsaWNhdGlvbi4iLAorIiAiLAorCisiU0VUIFRFUk1JTkFMIEtFWSA8bW9kZT4gL0xJVEVSQUwgPGtleWNvZGU+IDx0ZXh0PiIsCisiU0VUIFRFUk1JTkFMIEtFWSA8bW9kZT4gREVGQVVMVCIsCisiU0VUIFRFUk1JTkFMIEtFWSA8bW9kZT4gQ0xFQVIiLAorIiAgQ29uZmlndXJlcyB0aGUga2V5IHdob3NlIDxrZXljb2RlPiBpcyBnaXZlbiB0byBzZW5kIHRoZSBnaXZlbiB0ZXh0IHdoZW4iLAorIiAgcHJlc3NlZCB3aGlsZSA8bW9kZT4gaXMgYWN0aXZlLiAgPG1vZGU+IG1heSBiZSBhbnkgb2YgdGhlIHZhbGlkIHRlcm1pbmFsIiwKKyIgIHR5cGVzIG9yIHRoZSBzcGVjaWFsIG1vZGVzIFwiRU1BQ1NcIiwgXCJIRUJSRVdcIiBvciBcIlJVU1NJQU5cIi4gIERFRkFVTFQiLAorIiAgcmVzdG9yZXMgYWxsIGRlZmF1bHQga2V5IG1hcHBpbmdzIGZvciB0aGUgc3BlY2lmaWVkIG1vZGUuICBDTEVBUiBlcmFzZXMiLAorIiAgYWxsIHRoZSBrZXkgbWFwcGluZ3MuICBJZiB0aGVyZSBpcyBubyB0ZXh0LCB0aGUgZGVmYXVsdCBrZXkgYmluZGluZyBpcyIsCisjaWZuZGVmIE5PQ1NFVFMKKyIgIHJlc3RvcmVkIGZvciB0aGUga2V5IGsuICBTRVQgVEVSTUlOQUwgS0VZIG1hcHBpbmdzIHRha2UgcGxhY2UgYmVmb3JlIiwKKyIgIHRlcm1pbmFsIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24uICBTRVQgS0VZIG1hcHBpbmdzIHRha2UgcHJlY2VkZW5jZSBvdmVyIiwKKyIgIFNFVCBURVJNSU5BTCBLRVkgPHRlcm1pbmFsIHR5cGU+IHNldHRpbmdzLiIsCisjZWxzZQorIiAgcmVzdG9yZWQgZm9yIHRoZSBrZXkuICBTRVQgS0VZIG1hcHBpbmdzIHRha2UgcHJlY2VkZW5jZSBvdmVyIFNFVCBURVJNSU5BTCIsCisiICBLRVkgPHRlcm1pbmFsIHR5cGU+IHNldHRpbmdzLiIsCisjZW5kaWYgLyogTk9DU0VUUyAqLworIiAgVGhlIC9MSVRFUkFMIHN3aXRjaCBtYXkgYmUgdXNlZCB0byBpbnN0cnVjdCBLZXJtaXQgdG8gaWdub3JlIGNoYXJhY3Rlci1zZXQiLAorIiAgdHJhbnNsYXRpb25zIHdoZW4gc2VuZGluZyB0aGlzIGRlZmluaXRpb24gdG8gdGhlIGhvc3QuIiwKKyIgIiwKKyIgIFRoZSB0ZXh0IG1heSBjb250YWluIFwiXFxLdmVyYnNcIiB0byBkZW5vdGUgYWN0aW9ucywgdG8gc3RhbmQgZm9yIERFQyIsCisiICBrZXlwYWQsIGZ1bmN0aW9uLCBvciBlZGl0aW5nIGtleXMsIGV0Yy4gIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIGtleWJvYXJkIiwKKyIgIHZlcmJzLCB0eXBlIFNIT1cgS1ZFUkJTLiIsCisiICIsCisiICBUbyBmaW5kIG91dCB0aGUga2V5Y29kZSBhbmQgbWFwcGluZyBmb3IgYSBwYXJ0aWN1bGFyIGtleSwgdXNlIHRoZSBTSE9XIiwKKyIgIEtFWSBjb21tYW5kLiAgVXNlIHRoZSBTQVZFIEtFWVMgY29tbWFuZCB0byBzYXZlIGFsbCBzZXR0aW5ncyB0byBhIGZpbGUuIiwKKyIgIiwKKyJTRVQgVEVSTUlOQUwgS0VZQk9BUkQtTU9ERSB7IE5PUk1BTCwgRU1BQ1MsIFJVU1NJQU4sIEhFQlJFVyB9IiwKKyIgIFNlbGVjdCBhIHNwZWNpYWwga2V5Ym9hcmQgbW9kZSBmb3IgdXNlIGluIHRoZSB0ZXJtaW5hbCBzY3JlZW4uIiwKKyIgIiwKKworIlNFVCBURVJNSU5BTCBLRVlQQUQtTU9ERSB7IEFQUExJQ0FUSU9OLCBOVU1FUklDIH0iLAorIiAgU3BlY2lmaWVzIHRoZSBcIm1vZGVcIiBvZiB0aGUgbnVtZXJpYyBrZXlwYWQgZm9yIFZUIHRlcm1pbmFsIGVtdWxhdGlvbi4iLAorIiAgVXNlIHRoaXMgY29tbWFuZCBpbiBjYXNlIHRoZSBob3N0IG9yIGFwcGxpY2F0aW9uIHdhbnRzIHRoZSBrZXlwYWQgdG8gYmUiLAorIiAgaW4gYSBkaWZmZXJlbnQgbW9kZSB0aGFuIGl0J3MgaW4sIGJ1dCBkaWQgbm90IHNlbmQgdGhlIGVzY2FwZSBzZXF1ZW5jZSIsCisiICB0byBwdXQgaXQgaW4gdGhlIG5lZWRlZCBtb2RlLiIsCisiICIsCisjaWZkZWYgS1VJCisiU0VUIFRFUk1JTkFMIExJTkUtU1BBQ0lORyA8ZmxvYXQ+IiwKKyIgIFNwZWNpZmllcyB0aGUgbGluZSBzcGFjaW5nIHVzZWQgd2hlbiBkaXNwbGF5aW5nIHRleHQuICBUaGUgZGVmYXVsdCBpcyAxLjAuIiwKKyIgIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDEuMCB0byAzLjAgaW5jbHVzaXZlLiIsCisiICIsCisjZW5kaWYgLyogS1VJICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgTk9DU0VUUworI2lmZGVmIE9TMgorIlNFVCBURVJNSU5BTCBMT0NBTC1DSEFSQUNURVItU0VUIDxsb2NhbC1jcz4iLAorIiAgU3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXIgc2V0IHVzZWQgYnkgSy05NSBsb2NhbGx5LiAgSWYgeW91IGRvbid0IHNwZWNpZnkiLAorI2lmZGVmIE9TMk9OTFkKKyIgIHRoZSBsb2NhbCBjaGFyYWN0ZXItc2V0LCB0aGUgY3VycmVudCBURVJNSU5BTCBGT05UIGlzIHVzZWQgaWYgeW91IGhhdmUiLAorIiAgZ2l2ZW4gYSBTRVQgVEVSTUlOQUwgRk9OVCBjb21tYW5kOyBvdGhlcndpc2UgdGhlIGN1cnJlbnQgY29kZXBhZ2UgaXMgdXNlZC4iLAorI2Vsc2UKKyIgIHRoZSBsb2NhbCBjaGFyYWN0ZXItc2V0LCB0aGUgY3VycmVudCBjb2RlIHBhZ2UgaXMgdXNlZC4iLAorI2VuZGlmIC8qIE9TMk9OTFkgKi8KKyIgIiwKKyIgIFdoZW4gdGhlIGxvY2FsIGFuZCByZW1vdGUgY2hhcmFjdGVyIHNldHMgZGlmZmVyLCBLZXJtaXQgdHJhbnNsYXRlcyBiZXR3ZWVuIiwKKyIgIHRoZW0gZHVyaW5nIENPTk5FQ1QuICBCeSBkZWZhdWx0LCB0aGUgcmVtb3RlIGNoYXJhY3RlciBzZXQgaXMgTGF0aW4xIGFuZCIsCisiICB0aGUgbG9jYWwgb25lIGlzIHlvdXIgY3VycmVudCBjb2RlIHBhZ2UuIiwKKyNpZmRlZiBOVAorIiAiLAorIiAgSW4gV2luZG93cyBOVCwgVW5pY29kZSBpcyB1c2VkIGFzIHRoZSBsb2NhbCBjaGFyYWN0ZXItc2V0IHJlZ2FyZGxlc3Mgb2YiLAorIiAgdGhpcyBzZXR0aW5nLiIsCisjZW5kaWYgLyogTlQgKi8KKyIgIiwKKyJTZWUgYWxzbyBTRVQgVEVSTUlOQUwgUkVNT1RFLUNIQVJBQ1RFUi1TRVQiLAorIiAiLAorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmZGVmIE9TMgorIlNFVCBURVJNSU5BTCBMT0NLSU5HLVNISUZUIHsgT0ZGLCBPTiB9IiwKKyIgIFRlbGxzIHdoZXRoZXIgdG8gc2VuZCBTaGlmdC1Jbi9TaGlmdC1PdXQgKEN0cmwtTyBhbmQgQ3RybC1OKSB0byBzd2l0Y2giLAorIiAgYmV0d2VlbiA3LWJpdCBhbmQgOC1iaXQgY2hhcmFjdGVycyBzZW50IGR1cmluZyB0ZXJtaW5hbCBlbXVsYXRpb24gb3ZlciIsCisiICA3LWJpdCBjb25uZWN0aW9ucy4gIE9GRiBieSBkZWZhdWx0LiIsCisjZWxzZQorIlNFVCBURVJNSU5BTCBMT0NLSU5HLVNISUZUIHsgT0ZGLCBPTiB9IiwKKyIgIFRlbGxzIEtlcm1pdCB3aGV0aGVyIHRvIHVzZSBTaGlmdC1Jbi9TaGlmdC1PdXQgKEN0cmwtTyBhbmQgQ3RybC1OKSB0byIsCisiICBzd2l0Y2ggYmV0d2VlbiA3LWJpdCBhbmQgOC1iaXQgY2hhcmFjdGVycyBkdXJpbmcgQ09OTkVDVC4gIE9GRiBieSBkZWZhdWx0LiIsCisjZW5kaWYgLyogT1MyICovCisiICIsCisKKyNpZmRlZiBPUzIKKyJTRVQgVEVSTUlOQUwgTUFSR0lOLUJFTEwgeyBPTiBbY29sdW1uXSwgT0ZGIH0iLAorIiAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtYXJnaW4tYmVsbCBpcyBhY3RpdmF0ZWQgYW5kIHdoYXQgY29sdW1uIGl0IHNob3VsZCIsCisiICByaW5nIGF0LiAgT0ZGIGJ5IGRlZmF1bHQuIiwKKyIgIiwKKyNlbmRpZiAvKiBPUzIgKi8KKworIlNFVCBURVJNSU5BTCBORVdMSU5FLU1PREUgeyBPRkYsIE9OIH0iLAorIiAgVGVsbHMgd2hldGhlciB0byBzZW5kIENSTEYgKENhcnJpYWdlIFJldHVybiBhbmQgTGluZSBGZWVkKSB3aGVuIHlvdSB0eXBlIiwKKyIgIENSIChwcmVzcyB0aGUgUmV0dXJuIG9yIEVudGVyIGtleSkgaW4gQ09OTkVDVCBtb2RlLiIsCisiICIsCisKKyNpZmRlZiBPUzIKKyJTRVQgVEVSTUlOQUwgT1VUUFVULVBBQ0lORyA8bWlsbGlzZWNvbmRzPiIsCisiICBUZWxscyBob3cgbG9uZyB0byBwYXVzZSBiZXR3ZWVuIHNlbmRpbmcgZWFjaCBjaGFyYWN0ZXIgdG8gdGhlIGhvc3QgZHVyaW5nIiwKKyIgIENPTk5FQ1QgbW9kZS4gIE5vcm1hbGx5IG5vdCBuZWVkZWQgYnV0IHNvbWV0aW1lcyByZXF1aXJlZCB0byB3b3JrIGFyb3VuZCIsCisiICBUUkFOU01JU1NJT04gQkxPQ0tFRCBjb25kaXRpb25zIHdoZW4gcGFzdGluZyBpbnRvIHRoZSB0ZXJtaW5hbCB3aW5kb3cuIiwKKyIgIiwKKworI2lmZGVmIFBDVEVSTQorIlNFVCBURVJNSU5BTCBQQ1RFUk0geyBPTiwgT0ZGIH0iLAorIiAgQWN0aXZhdGVzIG9yIGRlYWN0aXZhdGVzIHRoZSBQQ1RFUk0gdGVybWluYWwgZW11bGF0aW9uIGtleWJvYXJkIG1vZGUuIiwKKyIgIFdoZW4gUENURVJNIGlzIE9OIGFsbCBrZXlzdHJva2VzIGluIHRoZSB0ZXJtaW5hbCBzY3JlZW4gYXJlIHNlbnQgdG8gdGhlIiwKKyIgIGhvc3QgYXMgbWFrZS9icmVhayAoZG93bi91cCkgY29kZXMgaW5zdGVhZCBvZiBhcyBjaGFyYWN0ZXJzIGZyb20gdGhlIiwKKyIgIFJFTU9URS1DSEFSQUNURVItU0VULCBhbmQgYWxsIGtleWJvYXJkIG1hcHBpbmdzLCBpbmNsdWRpbmcgS3ZlcmJzIGFuZCB0aGUiLAorIiAgZXNjYXBlIGNoYXJhY3RlciBhcmUgZGlzYWJsZWQuICBUbyB0dXJuIG9mZiBQQ1RFUk0ga2V5Ym9hcmQgbW9kZSB3aGlsZSBpbiIsCisiICBDT05ORUNUIG1vZGUgcHJlc3MgQ29udHJvbC1DYXBzTG9jay4gIFBDVEVSTSBpcyBPRkYgYnkgZGVmYXVsdC4iLAorIiAiLAorI2VuZGlmIC8qIFBDVEVSTSAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgT1MyCisiU0VUIFRFUk1JTkFMIFBSSU5UIHsgQVVUTywgQ09QWSwgT0ZGLCBVU0VSIH0iLAorIiAgQWxsb3dzIHNlbGVjdGl2ZSBjb250cm9sIG9mIHZhcmlvdXMgdHlwZXMgb2YgcHJpbnRpbmcgZnJvbSB0aGUgVGVybWluYWwiLAorIiAgc2Vzc2lvbi4gIEFVVE8gcHJpbnRzIGEgbGluZSBvZiB0ZXh0IGZyb20gdGhlIHRlcm1pbmFsIHNjcmVlbiB3aGVuZXZlciIsCisiICB0aGUgY3Vyc29yIGlzIG1vdmVkIG9mZiB0aGUgbGluZS4gIENPUFkgcHJpbnRzIGV2ZXJ5IGJ5dGUgcmVjZWl2ZWQgYXMiLAorIiAgaXQgaXMgcmVjZWl2ZWQgd2l0aG91dCBpbnRlcnByZXRhdGlvbi4gIFVTRVIgcHJpbnRzIGV2ZXJ5IGJ5dGUgYWZ0ZXIiLAorIiAgaW50ZXJwcmV0YXRpb24gYnkgdGhlIHRlcm1pbmFsIGVtdWxhdG9yIHRyYW5zbGF0ZXMgY2hhcmFjdGVyLXNldHMgYW5kIiwKKyIgIGNvbnN0cnVjdCBlc2NhcGUgc2VxdWVuY2VzLCAuLi4gIFRoZSBkZWZhdWx0IGlzIE9GRi4iLAorIiAiLAorI2Vsc2UKKyNpZmRlZiBYUFJJTlQKKyJTRVQgVEVSTUlOQUwgUFJJTlQgeyBPTiwgT0ZGIH0iLAorIiAgRW5hYmxlcyBhbmQgZGlzYWJsZXMgaG9zdC1pbml0aWF0ZWQgdHJhbnNwYXJlbnQgcHJpbnRpbmcgaW4gQ09OTkVDVCBtb2RlLiIsCisiICIsCisjZW5kaWYgLyogWFBSSU5UICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBPUzIKKyNpZm5kZWYgTk9DU0VUUworIlNFVCBURVJNSU5BTCBSRU1PVEUtQ0hBUkFDVEVSLVNFVCA8cmVtb3RlLWNzPiBbIHsgRzAsRzEsRzIsRzMgfS4uLiBdIiwKKyIgIFNwZWNpZmllcyB0aGUgY2hhcmFjdGVyIHNldCB1c2VkIGJ5IHRoZSByZW1vdGUgaG9zdCwgPHJlbW90ZS1jcz4uIiwKKyIgIFdoZW4gdGhlIGxvY2FsIGFuZCByZW1vdGUgY2hhcmFjdGVyIHNldHMgZGlmZmVyLCBLZXJtaXQgdHJhbnNsYXRlcyIsCisiICBiZXR3ZWVuIHRoZW0gZHVyaW5nIENPTk5FQ1QuICBCeSBkZWZhdWx0LCB0aGUgcmVtb3RlIGNoYXJhY3RlciBzZXQgaXMiLAorIiAgTGF0aW4xIGFuZCB0aGUgbG9jYWwgb25lIGlzIHlvdXIgY3VycmVudCBjb2RlIHBhZ2UuICBPcHRpb25hbGx5LCB5b3UgY2FuIiwKKyIgIGFsc28gZGVzaWduYXRlIHRoZSBjaGFyYWN0ZXIgc2V0IHRvIHRoZSBHMC4uRzMgZ3JhcGhpYyB0YWJsZXMuIiwKKyIgIiwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBPUzIKKyJTRVQgVEVSTUlOQUwgUk9MTC1NT0RFIHsgSU5TRVJULCBPVkVSV1JJVEUsIEtFWVNUUk9LRVMgWyBvcHRpb24gXSB9IiwKKyIgIFRlbGxzIHdoZXRoZXIgbmV3IGRhdGEgd2hlbiByZWNlaXZlZCBmcm9tIHRoZSBob3N0IGlzIGVudGVyZWQgaW50byB0aGUiLAorIiAgc2Nyb2xsYmFjayBidWZmZXIgYXQgdGhlIGN1cnJlbnQgcm9sbGJhY2sgcG9zaXRpb24gKE9WRVJXUklURSkgb3IgYXQgdGhlIiwKKyIgIGVuZCBvZiB0aGUgYnVmZmVyIChJTlNFUlQpLiAgVGhlIGRlZmF1bHQgaXMgSU5TRVJULiAgVHlwaW5nIGlzIGFsbG93ZWQiLAorIiAgZHVyaW5nIHJvbGxiYWNrcyBpbiBlaXRoZXIgbW9kZSwgYWNjb3JkaW5nIHRvIFNFVCBURVJNIFJPTEwgS0VZU1RST0tFUzoiLAorIiAgU0VORCAodGhlIGRlZmF1bHQpIG1lYW5zIHRvIHByb2Nlc3Mga2V5c3Ryb2tlcyBub3JtYWxseTsgSUdOT1JFIG1lYW5zIHRvIiwKKyIgIGlnbm9yZSB0aGVtIHdoZW4gdGhlIHNjcmVlbiBpcyBzY3JvbGxlZCBiYWNrOyBSRVNUT1JFLUFORC1TRU5EIGlzIGxpa2UiLAorIiAgU0VORCBidXQgcmVzdG9yZXMgdGhlIHNjcmVlbiB0byBpdHMgYWN0aXZlIHBvc2l0aW9uIGZpcnN0LiIsCisiICIsCisKKyJTRVQgVEVSTUlOQUwgU0NSRUVOLU1PREUgeyBOT1JNQUwsIFJFVkVSU0UgfSIsCisiICBXaGVuIHNldCB0byBSRVZFUlNFIHRoZSBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycyBhcmUgc3dhcHBlZCBhcyIsCisiICB3ZWxsIGFzIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBpbnRlbnNpdHkgYml0cy4iLAorIiAgVGhlIGRlZmF1bHQgaXMgTk9STUFMLiIsCisiICIsCisKKyJTRVQgVEVSTUlOQUwgU0NSRUVOLU9QVElNSVpFIHsgT04sIE9GRiB9IiwKKyIgIFdoZW4gc2V0IHRvIE9OLCB0aGUgZGVmYXVsdCwgS2VybWl0IG9ubHkgcGFpbnRzIHRoZSBzY3JlZW4gd2l0aCBjaGFyYWN0ZXJzIiwKKyIgIHRoYXQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHNjcmVlbiBwYWludC4gIFdoZW4gT0ZGLCB0aGUgc2NyZWVuIGlzIiwKKyIgIGNvbXBsZXRlbHkgcmVwYWludGVkIGVhY2ggdGltZSB0aGVyZSBpcyBhIGNoYW5nZS4iLAorIiAiLAorCisiU0VUIFRFUk1JTkFMIFNDUkVFTi1VUERBVEUgeyBGQVNULCBTTU9PVEggfSBbIDxtaWxsaXNlY29uZHM+IF0iLAorIiAgQ2hvb3NlcyB0aGUgbWVjaGFuaXNtIHVzZWQgZm9yIHNjcmVlbiB1cGRhdGluZyBhbmQgdGhlIHVwZGF0ZSBmcmVxdWVuY3kuIiwKKyIgIERlZmF1bHRzIGFyZSBGQVNUIHNjcm9sbGluZyB3aXRoIHVwZGF0ZXMgZXZlcnkgMTAwIG1pbGxpc2Vjb25kcy4iLAorIiAiLAorCisiU0VUIFRFUk1JTkFMIFNDUk9MTEJBQ0sgPGxpbmVzPiIsCisiICBTZXRzIHNpemUgb2YgQ09OTkVDVCB2aXJ0dWFsIHNjcmVlbiBidWZmZXIuICA8bGluZXM+IGluY2x1ZGVzIHRoZSBhY3RpdmUiLAorIiAgdGVybWluYWwgc2NyZWVuLiAgVGhlIG1pbmltdW0gaXMgMjU2LiAgVGhlIG1heGltdW0gaXMgMiBtaWxsaW9uLiAgVGhlIiwKKyIgIGRlZmF1bHQgaXMgMjAwMC4iLAorIiAiLAorCisiU0VUIFRFUk1JTkFMIFNFTkQtREFUQSB7IE9OLCBPRkYgfSIsCisiICBEZXRlcm1pbmVzIHdoZXRoZXIgQVNDSUkgZW11bGF0aW9ucyBzdWNoIGFzIFdZU0UgMzAsNTAsNjAgb3IgVFZJIDkxMCssOTI1LCIsCisiICA5NTAgbWF5IHNlbmQgdGhlaXIgc2NyZWVuIGNvbnRlbnRzIHRvIHRoZSBob3N0IHVwb24gcmVxdWVzdC4gIEFsbG93aW5nIHRoZSIsCisiICBzY3JlZW4gdG8gYmUgcmVhZCBieSB0aGUgaG9zdCBpcyBhIHNpZ25pZmljYW50IHNlY3VyaXR5IHJpc2suICBUaGUgZGVmYXVsdCIsCisiICBpcyBPRkYgYW5kIHNob3VsZCBvbmx5IGJlIGNoYW5nZWQgYWZ0ZXIgYSBzZWN1cml0eSBldmFsdWF0aW9uIG9mIGhvc3QiLAorIiAgZW52aXJvbm1lbnQuIiwKKyIgIiwKKworIlNFVCBURVJNSU5BTCBTRU5ELUVORC1PRi1CTE9DSyB7IENSTEZfRVRYLCBVU19DUiB9IiwKKyIgIERldGVybWluZXMgd2hpY2ggc2V0IG9mIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHVzZWQgYXMgZW5kIG9mIGxpbmUgYW5kIGVuZCIsCisiICBvZiB0cmFuc21pc3Npb24gaW5kaWNhdG9ycyB3aGVuIHNlbmRpbmcgc2NyZWVuIGRhdGEgdG8gdGhlIGhvc3QiLAorIiAiLAorCisiU0VUIFRFUk1JTkFMIFNHUi1DT0xPUlMgeyBPTiwgT0ZGIH0iLAorIiAgT04gKGRlZmF1bHQpIG1lYW5zIGFsbG93IGhvc3QgY29udHJvbCBvZiBjb2xvcnM7IE9GRiBtZWFucyBpZ25vcmUgaG9zdCIsCisiICBlc2NhcGUgc2VxdWVuY2VzIHRvIHNldCBjb2xvci4iLAorIiAiLAorCisiU0VUIFRFUk1JTkFMIFNOSS1DSC5DT0RFIHsgT04sIE9GRiB9IiwKKyIgIFRoaXMgY29tbWFuZCBjb250cm9scyB0aGUgc3RhdGUgb2YgdGhlIENILkNPREUga2V5LiAgSXQgaXMgdGhlIGVxdWl2YWxlbnQiLAorIiAgdG8gdGhlIFNOSV9DSF9DT0RFIEtleWJvYXJkIHZlcmIuICBUaGUgU05JIHRlcm1pbmFsIHVzZXMgQ0guQ09ERSB0byIsCisiICBlYXNpbHkgc3dpdGNoIGJldHdlZW4gdGhlIE5hdGlvbmFsIExhbmd1YWdlIGNoYXJhY3RlciBzZXQgYW5kIFUuUy4gQVNDSUkuIiwKKyIgIFRoZSBkZWZhdWx0IGlzIE9OIHdoaWNoIG1lYW5zIHRvIGRpc3BsYXkgY2hhcmFjdGVycyBhcyBVLlMuIEFTQ0lJLiAgV2hlbiIsCisiICBPRkYgdGhlIGxhbnVhZ2Ugc3BlY2lmaWVkIGJ5IFNFVCBURVJNSU5BTCBTTkktTEFOVUFHRSBpcyB1c2VkIHRvIGRpc3BsYXkiLAorIiAgY2hhcmFjdGVycyB3aGVuIDctYml0IGNoYXJhY3RlciBzZXRzIGFyZSBpbiB1c2UuIgorIiAiLAorIlNFVCBURVJNSU5BTCBTTkktRklSTVdBUkUtVkVSU0lPTlMgPGtiZC12ZXJzaW9uPiA8dGVybWluYWwtdmVyc2lvbj4iLAorIiAgU3BlY2lmaWVzIHRoZSBGaXJtd2FyZSBWZXJzaW9uIG51bWJlciB0aGF0IHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgaG9zdCIsCisiICB3aGVuIHRoZSB0ZXJtaW5hbCBpcyBxdWVyaWVkLiAgVGhlIGRlZmF1bHQgaXMgOTIwMDMxIGZvciB0aGUga2V5Ym9hcmQiLAorIiAgYW5kIDgzMDg1MSBmb3IgdGhlIHRlcm1pbmFsLiIsCisiICIsCisiU0VUIFRFUk1JTkFMIFNOSS1MQU5HVUFHRSA8bmF0aW9uYWwtbGFuZ3VhZ2U+IiwKKyIgIEFuIGFsaWFzIGZvciBTRVQgVEVSTUlOQUwgVlQtTEFOVUFHRSwgdGhpcyBjb21tYW5kIHNwZWNpZmllcyB0aGUgbmF0aW9uYWwiLAorIiAgbGFuZ3VhZ2UgY2hhcmFjdGVyLXNldCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIE5SQyBtb2RlIGlzIGFjdGl2YXRlZCIsCisiICBmb3IgVlQgZW11bGF0aW9ucyBvciB3aGVuIENILkNPREUgaXMgT0ZGIGZvciBTTkkgZW11bGF0aW9ucy4gIFRoZSBkZWZhdWx0IiwKKyIgIGxhbmd1YWdlIGZvciBTRVQgVEVSTUlOQUwgVFlQRSBTTkktOTc4MDEgaXMgXCJHZXJtYW5cIi4iLAorIiAiLAorIlNFVCBURVJNSU5BTCBTTkktUEFHRU1PREUgeyBPTiwgT0ZGIH0iLAorIiAgRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBwYWdlIG1vZGUgaXMgYWN0aXZlLiAgT0ZGIGJ5IGRlZmF1bHQuIiwKKyIgIiwKKyJTRVQgVEVSTUlOQUwgU05JLVNDUk9MTE1PREUgeyBPTiwgT0ZGIH0iLAorIiAgRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBzY3JvbGwgbW9kZSBpcyBhY3RpdmUuICBPRkYgYnkgZGVmYXVsdC4iLAorIiAiLAorIlNFVCBURVJNSU5BTCBTVEFUVVNMSU5FIHsgT04sIE9GRiB9IiwKKyIgIE9OIChkZWZhdWx0KSBlbmFibGVzIHRoZSBLZXJtaXQgc3RhdHVzIGxpbmUgaW4gdGhlIHRlcm1pbmFsIHNjcmVlbi4iLAorIiAgT0ZGIHJlbW92ZXMgaXQsIG1ha2luZyB0aGUgbGluZSBhdmFpbGFibGUgZm9yIHVzZSBieSB0aGUgaG9zdC4iLAorIiAiLAorCisiU0VUIFRFUk1JTkFMIFRSQU5TTUlULVRJTUVPVVQgPHNlY29uZHM+IiwKKyIgIFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSBLLTk1IHdhaXRzIGJlZm9yZSByZXR1cm5pbmcgdG8gdGhlIiwKKyIgIHByb21wdCBpZiB5b3VyIGtleXN0cm9rZXMgY2FuJ3QgYmUgdHJhbnNtaXR0ZWQgZm9yIHNvbWUgcmVhc29uLCBzdWNoIGFzIGEiLAorIiAgZmxvdy1jb250cm9sIGRlYWRsb2NrLiIsCisiICIsCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBDS19UUklHR0VSCisiU0VUIFRFUk1JTkFMIFRSSUdHRVIgPHN0cmluZz4iLAorIiAgU3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQsIHdoZW4gZGV0ZWN0ZWQgZHVyaW5nIGFueSBzdWJzZXF1ZW50IENPTk5FQ1QiLAorIiAgc2Vzc2lvbiwgaXMgdG8gY2F1c2UgYXV0b21hdGljIHJldHVybiB0byBjb21tYW5kIG1vZGUuICBHaXZlIHRoaXMgY29tbWFuZCIsCisiICB3aXRob3V0IGEgc3RyaW5nIHRvIGNhbmNlbCB0aGUgY3VycmVudCB0cmlnZ2VyLiAgU2VlIEhFTFAgQ09OTkVDVCBmb3IiLAorIiAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4iLAorIiAiLAorI2VuZGlmIC8qIENLX1RSSUdHRVIgKi8KKworI2lmZGVmIE9TMgorIlNFVCBURVJNSU5BTCBVUkwtSElHSExJR0hUIHsgT04gPGF0dHJpYnV0ZT4sIE9GRiB9IiwKKyIgIFNwZWNpZmllcyB3aGV0aGVyIEstOTUgc2hvdWxkIGhpZ2hsaWdodCBVUkxzIGFuZCB3aGljaCBzY3JlZW4gYXR0cmlidXRlIiwKKyIgIHNob3VsZCBiZSB1c2VkLiAgVGhlIHNjcmVlbiBhdHRyaWJ1dGVzIGNhbiBiZSBvbmUgb2YgTk9STUFMLCBCTElOSywgQk9MRCwiLAorIiAgRElNLCBJTlZJU0lCTEUsIFJFVkVSU0UsIG9yIFVOREVSTElORS4gIFRoZSBkZWZhdWx0IGlzIE9OIHVzaW5nIHRoZSIsCisiICBCT0xEIHNjcmVlbiBhdHRyaWJ1dGUuIiwKKyIgIiwKKyJTRVQgVEVSTUlOQUwgVklERU8tQ0hBTkdFIHsgRElTQUJMRUQsIEVOQUJMRUQgfSIsCisiICBTcGVjaWZpZXMgd2hldGhlciBLLTk1IHNob3VsZCBjaGFuZ2UgdmlkZW8gbW9kZXMgYXV0b21hdGljYWxseSBpbiByZXNwb25zZSIsCisjaWZkZWYgTlQKKyIgIHRvIGVzY2FwZSBzZXF1ZW5jZXMgZnJvbSB0aGUgb3RoZXIgY29tcHV0ZXIuICBFTkFCTEVEIGJ5IGRlZmF1bHQgKGV4Y2VwdCIsCisiICBvbiBXaW5kb3dzIDk1KS4iLAorI2Vsc2UgLyogTlQgKi8KKyIgIHRvIGVzY2FwZSBzZXF1ZW5jZXMgZnJvbSB0aGUgb3RoZXIgY29tcHV0ZXIuICBFTkFCTEVEIGJ5IGRlZmF1bHQuIiwKKyNlbmRpZiAvKiBOVCAqLworIiAiLAorCisiU0VUIFRFUk1JTkFMIFZULUxBTkdVQUdFIDxsYW5ndWFnZT4iLAorIiAgU3BlY2lmaWVzIHRoZSBOYXRpb25hbCBSZXBsYWNlbWVudCBDaGFyYWN0ZXIgU2V0IChOUkMpIHRvIGJlIHVzZWQgd2hlbiIsCisiICBOUkMgbW9kZSBpcyBhY3RpdmF0ZWQuICBUaGUgZGVmYXVsdCBpcyBcIk5vcnRoIEFtZXJpY2FuXCIuIiwKKyIgIiwKKyJTRVQgVEVSTUlOQUwgVlQtTlJDLU1PREUgeyBPTiwgT0ZGIH0iLAorIiAgT0ZGIChkZWZhdWx0KSBjaG9vc2VzIFZUIG11bHRpbmF0aW9uYWwgQ2hhcmFjdGVyIFNldCBtb2RlLiAgT0ZGIGNob29zZXMiLAorIiAgVlQgTmF0aW9uYWwgUmVwbGFjZW1lbnQgQ2hhcmFjdGVyLXNldCBtb2RlLiAgVGhlIE5SQyBpcyBzZWxlY3RlZCB3aXRoIiwKKyIgIFNFVCBURVJNSU5BTCBWVC1MQU5HVUFHRSIsCisiICIsCisKKyNpZmRlZiBOVAorIlNFVCBURVJNSU5BTCBXSURUSCA8Y29scz4iLAorIiAgVGVsbHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0ZXJtaW5hbCBzY3JlZW4uIiwKKyIgIiwKKyIgIFRoZSBkZWZhdWx0IGlzIDgwLiAgWW91IGNhbiBhbHNvIHVzZSAxMzIuICBPdGhlciB3aWR0aHMgY2FuIGJlIGNob3NlbiBidXQiLAorIiAgYXJlIHVzdWFsbHkgbm90IHN1cHBvcnRlZCBieSBob3N0IHNvZnR3YXJlLiIsCisiICIsCisjZWxzZQorIlNFVCBURVJNSU5BTCBXSURUSCA8Y29scz4iLAorIiAgVGVsbHMgaG93IG1hbnkgY29sdW1ucyBkZWZpbmUgdGhlIHRlcm1pbmFsIHNpemUuIiwKKyIgIiwKKyJEZWZhdWx0IGlzIDgwLiAgSW4gV2luZG93ZWQgT1MvMiAyLnggc2Vzc2lvbnMsIHRoaXMgdmFsdWUgbWF5IG5vdCBiZSBjaGFuZ2VkIiwKKyJJbiBXaW5kb3dlZCBPUy8yIFdBUlAgMy54IHNlc3Npb25zLCB0aGlzIHZhbHVlIG1heSByYW5nZSBmcm9tIDIwIHRvIDI1NS4iLAorIkluIEZ1bGwgc2NyZWVuIHNlc3Npb25zLCB2YWx1ZXMgb2YgNDAsIDgwLCBhbmQgMTMyIGFyZSB2YWxpZC4gIE5vdCBhbGwiLAorImNvbWJpbmF0aW9ucyBvZiBoZWlnaHQgYW5kIHdpZHRoIGFyZSBzdXBwb3J0ZWQgb24gYWxsIGFkYXB0ZXJzLiIsCisiICIsCisjZW5kaWYgLyogTlQgKi8KKyJTRVQgVEVSTUlOQUwgV1JBUCB7IE9GRiwgT04gfSIsCisiICBUZWxscyB3aGV0aGVyIHRoZSB0ZXJtaW5hbCBlbXVsYXRvciBzaG91bGQgYXV0b21hdGljYWxseSB3cmFwIGxvbmcgbGluZXMiLAorIiAgb24geW91ciBzY3JlZW4uIiwKKyIgIiwKKyNlbHNlCisKKyJTRVQgVEVSTUlOQUwgV0lEVEggPG51bWJlcj4iLAorIiBcCitUZWxscyBLZXJtaXQgaG93IG1hbnkgY29sdW1ucyAoY2hhcmFjdGVycykgYXJlIG9uIHlvdXIgQ09OTkVDVC1tb2RlIHNjcmVlbi4iLAorIiAiLAorI2VuZGlmIC8qIE9TMiAqLworIlR5cGUgU0hPVyBURVJNSU5BTCB0byBzZWUgY3VycmVudCB0ZXJtaW5hbCBzZXR0aW5ncy4iLAorIiIgfTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBORVRDT05OCitzdGF0aWMgY2hhciAqaHh5aG9zdFtdID0geworIlNFVCBIT1NUIFsgc3dpdGNoZXMgXSBob3N0bmFtZS1vci1hZGRyZXNzIFsgc2VydmljZSBdIFsgcHJvdG9jb2wtc3dpdGNoIF0iLAorIiAgRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbmV0d29yayBob3N0IG9uIHRoZSBjdXJyZW50bHkiLAorIiAgc2VsZWN0ZWQgbmV0d29yayB0eXBlLiAgRm9yIFRDUC9JUCBjb25uZWN0aW9ucywgdGhlIGRlZmF1bHQgc2VydmljZSBpcyIsCisiICBURUxORVQ7IHNwZWNpZnkgYSBkaWZmZXJlbnQgVENQIHBvcnQgbnVtYmVyIG9yIHNlcnZpY2UgbmFtZSB0byBjaG9vc2UgYSIsCisiICBkaWZmZXJlbnQgc2VydmljZS4gIFRoZSBmaXJzdCBzZXQgb2Ygc3dpdGNoZXMgY2FuIGJlOiIsCisiICIsCisiIC9ORVRXT1JLLVRZUEU6bmFtZSIsCisiICAgTWFrZXMgdGhlIGNvbm5lY3Rpb24gb24gdGhlIGdpdmVuIHR5cGUgb2YgbmV0d29yay4gIEVxdWl2YWxlbnQgdG8gU0VUIiwKKyIgICBORVRXT1JLIFRZUEUgbmFtZSBwcmlvciB0byBTRVQgSE9TVCwgZXhjZXB0IHRoYXQgdGhlIHNlbGVjdGVkIG5ldHdvcmsiLAorIiAgIHR5cGUgaXMgdXNlZCBvbmx5IGZvciB0aGlzIGNvbm5lY3Rpb24uICBUeXBlIFwic2V0IGhvc3QgL25ldDo/XCIgdG8gc2VlIiwKKyNpZmRlZiBORVRDTUQKKyIgICBhIGxpc3QuICAvTkVUV09SSy1UWVBFOkNPTU1BTkQgbWVhbnMgdG8gbWFrZSB0aGUgY29ubmVjdGlvbiB0aHJvdWdoIHRoZSIsCisiICAgZ2l2ZW4gc3lzdGVtIGNvbW1hbmQsIHN1Y2ggYXMgXCJybG9naW5cIiBvciBcImN1XCIuIiwKKyNlbHNlCisiICAgYSBsaXN0LiIsCisjZW5kaWYgLyogTkVUQ01EICovCisiICIsCisiIC9DT05ORUNUIiwKKyIgICBcCitFbnRlciBDT05ORUNUICh0ZXJtaW5hbCkgbW9kZSBhdXRvbWF0aWNhbGx5IGlmIHRoZSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWwuIiwKKyIgIiwKKyIgL1NFUlZFUiIsCisiICAgRW50ZXIgc2VydmVyIG1vZGUgYXV0b21hdGljYWxseSBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsLiIsCisiICIsCisiIC9VU0VSSUQ6WzxuYW1lPl0iLAorIiAgIFRoaXMgc3dpdGNoIGlzIGVxdWl2YWxlbnQgdG8gU0VUIExPR0lOIFVTRVJJRCA8bmFtZT4gb3IgU0VUIFRFTE5FVCIsCisiICAgRU5WSVJPTk1FTlQgVVNFUiA8bmFtZT4uICBJZiBhIHN0cmluZyBpcyBnaXZlbiwgaXQgc2VudCB0byBob3N0IGR1cmluZyIsCisiICAgVGVsbmV0IG5lZ290aWF0aW9uczsgaWYgdGhpcyBzd2l0Y2ggaXMgZ2l2ZW4gYnV0IHRoZSBzdHJpbmcgaXMgb21pdHRlZCwiLAorIiAgIG5vIHVzZXIgSUQgaXMgc2VudCB0byB0aGUgaG9zdC4gIElmIHRoaXMgc3dpdGNoIGlzIG5vdCBnaXZlbiwgeW91ciIsCisiICAgY3VycmVudCBVU0VSSUQgdmFsdWUsIFxcdih1c2VyaWQpLCBpcyBzZW50LiAgV2hlbiBhIHVzZXJpZCBpcyBzZW50IHRvIHRoZSIsCisiICAgaG9zdCBpdCBpcyBhIHJlcXVlc3QgdG8gbG9naW4gYXMgdGhlIHNwZWNpZmllZCB1c2VyLiIsCisiICIsCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyIgL1BBU1NXT1JEOls8c3RyaW5nPl0iLAorIiAgIFRoaXMgc3dpdGNoIGlzIGVxdWl2YWxlbnQgdG8gU0VUIExPR0lOIFBBU1NXT1JELiAgSWYgYSBzdHJpbmcgaXMgZ2l2ZW4sIiwKKyIgICBpdCBpcyB0cmVhdGVkIGFzIHRoZSBwYXNzd29yZCB0byBiZSB1c2VkIChpZiByZXF1aXJlZCkgYnkgYW55IFRlbG5ldCIsCisiICAgQXV0aGVudGljYXRpb24gcHJvdG9jb2wgKEtlcmJlcm9zIFRpY2tldCByZXRyaWV2YWwsIFNlY3VyZSBSZW1vdGUiLAorIiAgIFBhc3N3b3JkLCBvciBYLjUwOSBjZXJ0aWZpY2F0ZSBwcml2YXRlIGtleSBkZWNyeXB0aW9uLikgIElmIG5vIHBhc3N3b3JkIiwKKyIgICBzd2l0Y2ggaXMgc3BlY2lmaWVkIGEgcHJvbXB0IGlzIGlzc3VlZCB0byByZXF1ZXN0IHRoZSBwYXNzd29yZCBpZiBvbmUiLAorIiAgIGlzIHJlcXVpcmVkIGZvciB0aGUgbmVnb3RpYXRlZCBhdXRoZW50aWNhdGlvbiBtZXRob2QuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworIlRoZSBwcm90b2NvbC1zd2l0Y2hlcyBjYW4gYmU6IiwKKyIgIiwKKyIgL05PLVRFTE5FVC1JTklUIiwKKyIgICBEbyBub3Qgc2VuZCBpbml0aWFsIFRlbG5ldCBuZWdvdGlhdGlvbnMgZXZlbiBpZiB0aGlzIGlzIGEgVGVsbmV0IHBvcnQuIiwKKyIgIiwKKyIgL1JBVy1TT0NLRVQiLAorIiAgIFRoaXMgaXMgYSBjb25uZWN0aW9uIHRvIGEgcmF3IFRDUCBzb2NrZXQuIiwKKyIgIiwKKyNpZmRlZiBSTE9HQ09ERQorIiAvUkxPR0lOIiwKKyIgICBVc2UgUmxvZ2luIHByb3RvY29sIGV2ZW4gaWYgdGhpcyBpcyBub3QgYW4gUmxvZ2luIHBvcnQuIiwKKyIgIiwKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworIiAvVEVMTkVUIiwKKyIgICBTZW5kIGluaXRpYWwgVGVsbmV0IG5lZ290aWF0aW9ucyBldmVuIGlmIHRoaXMgaXMgbm90IGEgVGVsbmV0IHBvcnQuIiwKKyIgIiwKKyNpZmRlZiBDS19LRVJCRVJPUworI2lmZGVmIFJMT0dDT0RFCisjaWZkZWYgS1JCNAorIiAvSzRMT0dJTiIsCisiICAgVXNlIEtlcmJlcm9zIElWIGtsb2dpbiBwcm90b2NvbCBldmVuIGlmIHRoaXMgaXMgbm90IGEga2xvZ2luIHBvcnQuIiwKKyIgIiwKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisiIC9FSzRMT0dJTiIsCisiICAgVXNlIEtlcmJlcm9zIElWIEVuY3J5cHRlZCBsb2dpbiBwcm90b2NvbCBldmVuIGlmIHRoaXMgaXMgbm90IGFuIGVrbG9naW4iLAorIiAgIHBvcnQuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjZW5kaWYgLyogS1JCNCAqLworI2lmZGVmIEtSQjUKKyIgL0s1TE9HSU4iLAorIiAgIFVzZSBLZXJiZXJvcyBWIGtsb2dpbiBwcm90b2NvbCBldmVuIGlmIHRoaXMgaXMgbm90IGEga2xvZ2luIHBvcnQuIiwKKyIgIiwKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisiIC9FSzVMT0dJTiIsCisiICAgVXNlIEtlcmJlcm9zIFYgRW5jcnlwdGVkIGxvZ2luIHByb3RvY29sIGV2ZW4gaWYgdGhpcyBpcyBub3QgYW4gZWtsb2dpbiIsCisiICAgcG9ydC4iLAorIiAiLAorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNlbmRpZiAvKiBLUkI1ICovCisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2lmZGVmIENLX1NTTAorIiAvU1NMIiwKKyIgICBQZXJmb3JtIFNTTCBuZWdvdGlhdGlvbnMuIiwKKyIgIiwKKyIgL1NTTC1URUxORVQiLAorIiAgIFBlcmZvcm0gU1NMIG5lZ290aWF0aW9ucyBhbmQgaWYgc3VjY2Vzc2Z1bCBzdGFydCBUZWxuZXQgbmVnb3RpYXRpb25zLiIsCisiICIsCisiIC9UTFMiLAorIiAgIFBlcmZvcm0gVExTIG5lZ290aWF0aW9ucy4iLAorIiAiLAorIiAvVExTLVRFTE5FVCIsCisiICAgUGVyZm9ybSBUTFMgbmVnb3RpYXRpb25zIGFuZCBpZiBzdWNjZXNzZnVsIHN0YXJ0IFRlbG5ldCBuZWdvdGlhdGlvbnMuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyJFeGFtcGxlczoiLAorIiAgU0VUIEhPU1Qga2VybWl0LmNvbHVtYmlhLmVkdSIsCisiICBTRVQgSE9TVCAvQ09OTkVDVCBrZXJtaXQuY29sdW1iaWEuZWR1IiwKKyIgIFNFVCBIT1NUICogMTY0OSIsCisiICBTRVQgSE9TVCAvU0VSVkVSICogMTY0OSIsCisiICBTRVQgSE9TVCAxMjguNTkuMzkuMiIsCisiICBTRVQgSE9TVCBtYWRsYWIuc3BybC51bWljaC5lZHUgMzAwMCIsCisiICBTRVQgSE9TVCB4eXpjb3JwLmNvbSAyMDAwIC9SQVctU09DS0VUIiwKKyNpZmRlZiBTU0hCVUlMVElOCisiICBTRVQgSE9TVCAvTkVUOlNTSCBrZXJtaXQuY29sdW1iaWEuZWR1IC94MTEtZm9yd2FyZGluZzpvbiIsIAorI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKyNpZmRlZiBORVRDTUQKKyIgIFNFVCBIT1NUIC9DT05ORUNUIC9DT01NQU5EIHJsb2dpbiB4eXpjb3JwLmNvbSIsCisjZW5kaWYgLyogTkVUQ01EICovCisiICIsCisjaWZkZWYgU1VQRVJMQVQKKyJOb3RlczoiLAorIiAiLAorIiAuIFRoZSBURUxORVQgY29tbWFuZCBpcyBlcXVpdmFsZW50IHRvIFNFVCBORVRXT1JLIFRZUEUgVENQL0lQLCIsCisiICAgU0VUIEhPU1QgbmFtZSBbIHBvcnQgXSAvVEVMTkVULCBJRiBTVUNDRVNTIENPTk5FQ1QiLAorIiAiLAorIiAuIEZvciBTVVBFUkxBVCBjb25uZWN0aW9ucywgdGhlIGhvc3RuYW1lLW9yLWFkZHJlc3MgbWF5IGJlIGVpdGhlciBhIHNlcnZpY2UiLAorIiAgIG5hbWUsIG9yIGEgbm9kZS9wb3J0IGNvbWJpbmF0aW9uLCBhcyByZXF1aXJlZCBieSB5b3VyIExBVCBob3N0LiIsCisjZWxzZQorIlRoZSBURUxORVQgY29tbWFuZCBpcyBlcXVpdmFsZW50IHRvIFNFVCBORVRXT1JLIFRZUEUgVENQL0lQLCIsCisiU0VUIEhPU1QgbmFtZSBbIHBvcnQgXSAvVEVMTkVULCBJRiBTVUNDRVNTIENPTk5FQ1QiLAorI2VuZGlmIC8qIFNVUEVSTEFUICovCisiICIsCisiQWxzbyBzZWUgU0VUIE5FVFdPUkssIFRFTE5FVCwgU0VUIFRFTE5FVC4iLAorIiIgfTsKKworc3RhdGljIGNoYXIgKmhteHlhdXRoW10gPSB7CisiU3luYXR4OiBTRVQgQVVUSEVOVElDQVRJT04gPGF1dGhfdHlwZT4gPHBhcmFtZXRlcj4gPHZhbHVlPiIsCisiICBTZXRzIGRlZmF1bHRzIGZvciB0aGUgQVVUSEVOVElDQVRFIGNvbW1hbmQ6IiwKKyIgIiwKKyNpZmRlZiBDS19LRVJCRVJPUworIlNFVCBBVVRIRU5USUNBVElPTiBLRVJCRVJPUzUgQUREUkVTU0VTIHtsaXN0IG9mIGlwLWFkZHJlc3Nlc30iLAorIiAgU3BlY2lmaWVzIGEgbGlzdCBvZiBJUCBhZGRyZXNzZXMgdGhhdCBzaG91bGQgYmUgcGxhY2VkIGluIHRoZSBUaWNrZXQiLAorIiAgR2V0dGluZyBUaWNrZXQgaW4gYWRkaXRpb24gdG8gdGhlIGxvY2FsIG1hY2hpbmUgYWRkcmVzc2VzLiIsCisiICIsCisiU0VUIEFVVEhFTlRJQ0FUSU9OIHsgS0VSQkVST1M0LCBLRVJCRVJPUzUgfSBBVVRPREVTVFJPWSIsCisiICB7IE9OLUNMT1NFLCBPTi1FWElULCBORVZFUiB9IiwKKyIgIFdoZW4gT04sIEtlcm1pdCB3aWxsIGRlc3Ryb3kgYWxsIGNyZWRlbnRpYWxzIGluIHRoZSBkZWZhdWx0IiwKKyIgIGNyZWRlbnRpYWxzIGNhY2hlIHVwb24gS2VybWl0IHRlcm1pbmF0aW9uLiAgRGVmYXVsdCBpcyBORVZFUi4iLAorIiAiLAorIlNFVCBBVVRIRU5USUNBVElPTiB7IEtFUkJFUk9TNCwgS0VSQkVST1M1IH0gQVVUT0dFVCB7IE9OLCBPRkYgfSIsCisiICBXaGVuIE9OLCBpZiB0aGUgaG9zdCBvZmZlcnMgS2VyYmVyb3MgNCBvciBLZXJiZXJvcyA1IGF1dGhlbnRpY2F0aW9uIiwKKyIgIGFuZCBLZXJtaXQgaXMgY29uZmlndXJlZCB0byB1c2UgdGhhdCBhdXRoZW50aWNhdGlvbiBtZXRob2QgYW5kIHRoZXJlIiwKKyIgIGlzIG5vIFRHVCwgS2VybWl0IHdpbGwgYXV0b21hdGljYWxseSBhdHRlbXB0IHRvIHJldHJpZXZlIG9uZSBieSIsCisiICBwcm9tcHRpbmcgZm9yIHRoZSBwYXNzd29yZCAoYW5kIHByaW5jaXBhbCBpZiBuZWVkZWQuKSAgRGVmYXVsdCBpcyBPTi4iLAorIiAiLAorIlNFVCBBVVRIRU5USUNBVElPTiBLRVJCRVJPUzUgQ1JFREVOVElBTFMtQ0FDSEUgPGZpbGVuYW1lPiIsCisiICBBbGxvd3MgYW4gYWx0ZXJuYXRpdmUgY3JlZGVudGlhbHMgY2FjaGUgdG8gYmUgc3BlY2lmaWVkLiAgVGhpcyBpcyB1c2VmdWwiLAorIiAgd2hlbiB5b3UgbmVlZCB0byBtYWludGFpbiB0d28gb3IgbW9yZSBzZXRzIG9mIGNyZWRlbnRpYWxzIGZvciBkaWZmZXJlbnQiLAorIiAgcmVhbG1zIG9yIHJvbGVzLiAgVGhlIGRlZmF1bHQgaXMgc3BlY2lmaWVkIGJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSIsCisiICBLUkI1Q0NOQU1FIG9yIGFzIHJlcG9ydGVkIGJ5IHRoZSBLZXJiZXJvcyA1IGxpYnJhcnkuIiwKKyIgIiwKKyJTRVQgQVVUSEVOVElDQVRJT04gS0VSQkVST1M1IEZPUldBUkRBQkxFIHsgT04sIE9GRiB9IiwKKyIgIFdoZW4gT04sIHNwZWNpZmllcyB0aGF0IEtlcmJlcm9zIDUgY3JlZGVudGlhbHMgc2hvdWxkIGJlIGZvcndhcmRhYmxlIHRvIiwKKyIgIHRoZSBob3N0LiAgSWYgU0VUIFRFTE5FVCBBVVRIRU5USUNBVElPTiBGT1JXQVJESU5HIGlzIE9OLCBmb3J3YXJkYWJsZSIsCisiICBjcmVkZW50aWFscyBhcmUgc2VudCB0byB0aGUgaG9zdC4gIFRoZSBkZWZhdWx0IGlzIE9GRi4iLAorIiAiLAorIlNFVCBBVVRIRU5USUNBVElPTiBLRVJCRVJPUzUgR0VULUs0LVRHVCB7IE9OLCBPRkYgfSIsCisiICBXaGVuIE9OLCBzcGVjaWZpZXMgdGhhdCBLZXJiZXJvcyA0IGNyZWRlbnRpYWxzIHNob3VsZCBiZSByZXF1ZXN0ZWQgZWFjaCIsCisiICB0aW1lIEtlcmJlcm9zIDUgY3JlZGVudGlhbHMgYXJlIHJlcXVlc3RlZCB3aXRoIEFVVEggS0VSQkVST1M1IElOSVQuIiwKKyIgIERlZmF1bHQgaXMgT0ZGLiIsCisiICIsCisiU0VUIEFVVEhFTlRJQ0FUSU9OIEtFUkJFUk9TNCBJTlNUQU5DRSA8aW5zdGFuY2U+IiwKKyIgIEFsbG93cyBhIEtlcmJlcm9zIDQgaW5zdGFuY2UgdG8gYmUgc3BlY2lmaWVkIGFzIGEgZGVmYXVsdCAoaWYgbmVlZGVkKS4iLAorIiAiLAorIlNFVCBBVVRIRU5USUNBVElPTiB7IEtFUkJFUk9TNCwgS0VSQkVST1M1IH0gS0VZVEFCIDxmaWxlbmFtZT4iLAorIiAgU3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUga2V5dGFiIGZpbGUgdXNlZCB0byBhdXRoZW50aWNhdGUgaW5jb21pbmciLAorIiAgY29ubmVjdGlvbnMuICBUaGUgZGVmYXVsdCBpcyBub25lLCB3aGljaCBtZWFucyB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWUiLAorIiAgY29uZmlndXJlZCBpbiB0aGUgS2VyYmVyb3MgaW5zdGFsbGF0aW9uLiIsCisiICIsCisiU0VUIEFVVEhFTlRJQ0FUSU9OIHsgS0VSQkVST1M0LCBLRVJCRVJPUzUgfSBMSUZFVElNRSA8bWludXRlcz4iLAorIiAgU3BlY2lmaWVzIHRoZSBsaWZldGltZSBvZiB0aGUgVEdUcyByZXF1ZXN0ZWQgZnJvbSB0aGUgS0RDLiAgVGhlIGRlZmF1bHQiLAorIiAgaXMgNjAwIG1pbnV0ZXMgKDEwIGhvdXJzKS4iLAorIiAiLAorIlNFVCBBVVRIRU5USUNBVElPTiBLRVJCRVJPUzUgTk8tQUREUkVTU0VTIHsgT04sIE9GRiB9IiwKKyIgIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBJUCBhZGRyZXNzZXMgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBUR1QuIgorIiAgRGVmYXVsdCBpcyBPRkYuIiwKKyIgIiwKKyJTRVQgQVVUSEVOVElDQVRJT04gS0VSQkVST1M0IFBSRUFVVEggeyBPTiwgT0ZGIH0iLAorIiAgQWxsb3dzIEtlcmJlcm9zIDQgcHJlYXV0aGVudGljYXRlZCBUR1QgcmVxdWVzdHMgdG8gYmUgdHVybmVkIG9mZi4gIFRoZSIsCisiICBkZWZhdWx0IGlzIE9OLiAgT25seSB1c2UgaWYgYWJzb2x1dGVseSBuZWNlc3NhcnkuICBXZSByZWNvbW1lbmQgdGhhdCIsCisiICBwcmVhdXRoZW50aWNhdGVkIHJlcXVlc3RzIGJlIHJlcXVpcmVkIGZvciBhbGwgdGlja2V0cyByZXR1cm5lZCBieSBhIEtEQyIsCisiICB0byBhIHJlcXVlc3Rvci4iLAorIiAiLAorIlNFVCBBVVRIRU5USUNBVElPTiB7IEtFUkJFUk9TNCwgS0VSQkVST1M1IH0gUFJJTkNJUEFMIDxuYW1lPiIsCisiICBXaGVuIEtlcm1pdCBzdGFydHMsIGl0IGF0dGVtcHRzIHRvIHNldCB0aGUgcHJpbmNpcGFsIG5hbWUgdG8gdGhhdCBzdG9yZWQiLAorIiAgaW4gdGhlIGN1cnJlbnQgY3JlZGVudGlhbHMgY2FjaGUuICBJZiBubyBjcmVkZW50aWFsIGNhY2hlIGV4aXN0cywgdGhlIiwKKyIgIGN1cnJlbnQgU0VUIExPR0lOIFVTRVJJRCB2YWx1ZSBpcyB1c2VkLiAgU0VUIExPR0lOIFVTRVJJRCBpcyBzZXQgdG8gdGhlIiwKKyIgIG9wZXJhdGluZyBzeXN0ZW0ncyBjdXJyZW50IHVzZXJuYW1lIHdoZW4gS2VybWl0IGlzIHN0YXJ0ZWQuICBUbyBmb3JjZSIsCisiICBLZXJtaXQgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgcHJpbmNpcGFsIG5hbWUgd2hlbiByZXF1ZXN0aW5nIFRHVHMsIiwKKyIgIHBsYWNlOiIsCisiICIsCisiICAgIFNFVCBBVVRIIEs0IFBSSU5DSVBBTCB7fSIsCisiICAgIFNFVCBBVVRIIEs1IFBSSU5DSVBBTCB7fSIsCisiICIsCisiICBpbiB0aGUgS2VybWl0IGluaXRpYWxpemF0aW9uIGZpbGUgb3IgY29ubmVjdGlvbiBzY3JpcHQuIiwKKyIgIiwKKyJTRVQgQVVUSEVOVElDQVRJT04geyBLRVJCRVJPUzQsIEtFUkJFUk9TNSB9IFBST01QVCBQQVNTV09SRCA8cHJvbXB0PiIsCisiICBTcGVjaWZpZXMgYSBjdXN0b20gcHJvbXB0IHRvIGJlIHVzZWQgd2hlbiBwcm9tcHRpbmcgZm9yIGEgcGFzc3dvcmQuIiwKKyIgIFRoZSBLZXJiZXJvcyBwcm9tcHQgc3RyaW5ncyBtYXkgY29udGFpbiB0d28gJXMgcmVwbGFjZW1lbnQgZmllbGRzLiIsCisiICBUaGUgZmlyc3QgJXMgaXMgcmVwbGFjZWQgYnkgdGhlIHByaW5jaXBhbCBuYW1lOyB0aGUgc2Vjb25kIGJ5IHRoZSByZWFsbS4iLAorIiAiLAorIlNFVCBBVVRIRU5USUNBVElPTiB7IEtFUkJFUk9TNCwgS0VSQkVST1M1IH0gUFJPTVBUIFBSSU5DSVBBTCA8cHJvbXB0PiIsCisiICBTcGVjaWZpZXMgYSBjdXN0b20gcHJvbXB0IHRvIGJlIHVzZWQgd2hlbiBwcm9tcHRpbmcgZm9yIHRoZSBLZXJiZXJvcyIsCisiICBwcmluY2lwYWwgbmFtZS4gIE5vICVzIHJlcGxhY2VtZW50IGZpZWxkcyBtYXkgYmUgdXNlZC4gIEtlcm1pdCBwcm9tcHRzIiwKKyIgIGZvciBhIHByaW5jaXBhbCBuYW1lIHdoZW4gcmV0cmlldmluZyBhIFRHVCBpZiB0aGUgY29tbWFuZDoiLAorIiAiLAorIiAgICBTRVQgQVVUSEVOVElDQVRJT04geyBLRVJCRVJPUzQsIEtFUkJFUk9TNSB9IFBSSU5DSVBBTCB7fSIsCisiICIsCisiICBoYXMgYmVlbiBpc3N1ZWQuIiwKKyIgIiwKKyJTRVQgQVVUSEVOVElDQVRJT04gS0VSQkVST1M1IFBST1hJQUJMRSB7IE9OLCBPRkYgfSIsCisiICBXaGVuIE9OLCBzcGVjaWZpZXMgdGhhdCBLZXJiZXJvcyA1IGNyZWRlbnRpYWxzIHNob3VsZCBiZSBwcm94aWFibGUuIiwKKyIgIERlZmF1bHQgaXMgT0ZGLiIsCisiICIsCisiU0VUIEFVVEhFTlRJQ0FUSU9OIEtFUkJFUk9TNSBSRU5FV0FCTEUgPG1pbnV0ZXM+IiwKKyIgIFdoZW4gPG1pbnV0ZXM+IGlzIGdyZWF0ZXIgdGhhbiB0aGUgdGlja2V0IGxpZmV0aW1lIGEgVEdUIG1heSBiZSByZW5ld2VkIiwKKyIgIHdpdGggQVVUSCBLNSBJTklUIC9SRU5FVyBpbnN0ZWFkIG9mIGdldHRpbmcgYSBuZXcgdGlja2V0IGFzIGxvbmcgYXMgdGhlIiwKKyIgIHRpY2tldCBpcyBub3QgZXhwaXJlZCBhbmQgaXRzIHdpdGhpbiB0aGUgcmVuZXdhYmxlIGxpZmV0aW1lLiAgRGVmYXVsdCBpcyIsCisiICAwICh6ZXJvKSBtaW51dGVzLiIsCisiICIsCisiU0VUIEFVVEhFTlRJQ0FUSU9OIHsgS0VSQkVST1M0LCBLRVJCRVJPUzUgfSBSRUFMTSA8bmFtZT4iLAorIiAgSWYgbm8gZGVmYXVsdCBpcyBzZXQsIHRoZSBkZWZhdWx0IHJlYWxtIGNvbmZpZ3VyZWQgZm9yIHRoZSBLZXJiZXJvcyIsCisiICBsaWJyYXJpZXMgaXMgdXNlZC4gIEFiYnJldmlhdGlvbnMgYWNjZXB0ZWQuIiwKKyIgIiwKKyJTRVQgQVVUSEVOVElDQVRJT04geyBLRVJCRVJPUzQsIEtFUkJFUk9TNSB9IFNFUlZJQ0UtTkFNRSA8bmFtZT4iLAorIiAgVGhpcyBjb21tYW5kIHNwZWNpZmllcyB0aGUgc2VydmljZSB0aWNrZXQgbmFtZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSIsCisiICB0byB0aGUgaG9zdCB3aGVuIEtlcm1pdCBpcyB1c2VkIGFzIGEgY2xpZW50OyBvciB0aGUgc2VydmljZSB0aWNrZXQiLAorIiAgbmFtZSBhY2NlcHRlZCBieSBLZXJtaXQgd2hlbiBpdCBpcyBhY3RpbmcgYXMgdGhlIGhvc3QuIiwKKyIgIElmIG5vIGRlZmF1bHQgaXMgc2V0LCB0aGUgZGVmYXVsdCBzZXJ2aWNlIG5hbWUgZm9yIEtlcmJlcm9zIDQgaXMiLAorIiAgXCJyY21kXCIgYW5kIGZvciBLZXJiZXJvcyA1IGlzIFwiaG9zdFwiLiIsCisiICIsCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyNpZmRlZiBDS19TUlAKKyJTRVQgQVVUSEVOVElDQVRJT04gU1JQIFBST01QVCBQQVNTV09SRCA8cHJvbXB0PiIsCisiICBTcGVjaWZpZXMgYSBjdXN0b20gcHJvbXB0IHRvIGJlIHVzZWQgd2hlbiBwcm9tcHRpbmcgZm9yIGEgcGFzc3dvcmQuIiwKKyIgIFRoZSBTUlAgcHJvbXB0IHN0cmluZyBtYXkgY29udGFpbiBvbmUgJXMgcmVwbGFjZW1lbnQgZmllbGRzIHdoaWNoIGlzIiwKKyIgIHJlcGxhY2VkIGJ5IHRoZSBsb2dpbiB1c2VyaWQuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19TUlAgKi8KKyNpZmRlZiBDS19TU0wKKyJJbiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBcIlNTTFwiIGFuZCBcIlRMU1wiIGFyZSBhbGlhc2VzLiIsCisiICIsCisiU0VUIEFVVEhFTlRJQ0FUSU9OIHsgU1NMLCBUTFMgfSBDSVBIRVItTElTVCA8bGlzdCBvZiBjaXBoZXJzPiIsCisiQXBwbGllcyB0byBib3RoIFNTTCBhbmQgVExTLiAgQSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZyIsCisiKGNhc2Ugc2Vuc2l0aXZlKSBvcHRpb25zIGRlcGVuZGluZyBvbiB0aGUgb3B0aW9ucyBjaG9zZW4gd2hlbiBPcGVuU1NMIHdhcyAiLAorImNvbXBpbGVkOiAiLAorIiAiLAorIiAgS2V5IEV4Y2hhbmdlIEFsZ29yaXRobXM6IiwKKyIgICAgXCJrUlNBXCIgICAgICBSU0Ega2V5IGV4Y2hhbmdlIiwKKyIgICAgXCJrREhyXCIgICAgICBEaWZmaWUtSGVsbG1hbiBrZXkgZXhjaGFuZ2UgKGtleSBmcm9tIFJTQSBjZXJ0KSIsCisiICAgIFwia0RIZFwiICAgICAgRGlmZmllLUhlbGxtYW4ga2V5IGV4Y2hhbmdlIChrZXkgZnJvbSBEU0EgY2VydCkiLAorIiAgICBcImtFREhcIiAgICAgIEVwaGVtZXJhbCBEaWZmaWUtSGVsbG1hbiBrZXkgZXhjaGFuZ2UgKHRlbXBvcmFyeSBrZXkpIiwKKyIgICAgXCJrS1JCNVwiICAgICBLZXJiZXJvcyA1IiwKKyIgIiwKKyIgIEF1dGhlbnRpY2F0aW9uIEFsZ29yaXRobToiLAorIiAgICBcImFOVUxMXCIgICAgIE5vIGF1dGhlbnRpY2F0aW9uIiwKKyIgICAgXCJhUlNBXCIgICAgICBSU0EgYXV0aGVudGljYXRpb24iLAorIiAgICBcImFEU1NcIiAgICAgIERTUyBhdXRoZW50aWNhdGlvbiIsCisiICAgIFwiYURIXCIgICAgICAgRGlmZmllLUhlbGxtYW4gYXV0aGVudGljYXRpb24iLAorIiAgICBcImFLUkI1XCIgICAgIEtlcmJlcm9zIDUiLAorIiAiLAorIiAgQ2lwaGVyIEVuY29kaW5nIEFsZ29yaXRobToiLAorIiAgICBcImVOVUxMXCIgICAgIE5vIGVuY29kaWluZyIsCisiICAgIFwiREVTXCIgICAgICAgREVTIGVuY29kaW5nIiwKKyIgICAgXCIzREVTXCIgICAgICBUcmlwbGUgREVTIGVuY29kaW5nIiwKKyIgICAgXCJSQzRcIiAgICAgICBSQzQgZW5jb2RpbmciLAorIiAgICBcIlJDMlwiICAgICAgIFJDMiBlbmNvZGluZyIsCisiICAgIFwiSURFQVwiICAgICAgSURFQSBlbmNvZGluZyIsCisiICIsCisiICBNQUMgRGlnZXN0IEFsZ29yaXRobToiLAorIiAgICBcIk1ENVwiICAgICAgIE1ENSBoYXNoIGZ1bmN0aW9uIiwKKyIgICAgXCJTSEExXCIgICAgICBTSEExIGhhc2ggZnVuY3Rpb24iLAorIiAgICBcIlNIQVwiICAgICAgIFNIQSBoYXNoIGZ1bmN0aW9uIChzaG91bGQgbm90IGJlIHVzZWQpIiwKKyIgIiwKKyIgIEFsaWFzZXM6IiwKKyIgICAgXCJTU0x2MlwiICAgICBhbGwgU1NMIHZlcnNpb24gMi4wIGNpcGhlcnMgKHNob3VsZCBub3QgYmUgdXNlZCkiLAorIiAgICBcIlNTTHYzXCIgICAgIGFsbCBTU0wgdmVyc2lvbiAzLjAgY2lwaGVycyIsCisiICAgIFwiRVhQXCIgICAgICAgYWxsIGV4cG9ydCBjaXBoZXJzICg0MC1iaXQpIiwKKyIgICAgXCJFWFBPUlQ1NlwiICBhbGwgZXhwb3J0IGNpcGhlcnMgKDU2LWJpdCkiLAorIiAgICBcIkxPV1wiICAgICAgIGFsbCBsb3cgc3RyZW5ndGggY2lwaGVycyAobm8gZXhwb3J0KSIsCisiICAgIFwiTUVESVVNXCIgICAgYWxsIGNpcGhlcnMgd2l0aCAxMjgtYml0IGVuY3J5cHRpb24iLAorIiAgICBcIkhJR0hcIiAgICAgIGFsbCBjaXBoZXJzIHVzaW5nIGdyZWF0ZXIgdGhhbiAxMjgtYml0IGVuY3J5cHRpb24iLAorIiAgICBcIlJTQVwiICAgICAgIGFsbCBjaXBoZXJzIHVzaW5nIFJTQSBrZXkgZXhjaGFuZ2UiLAorIiAgICBcIkRIXCIgICAgICAgIGFsbCBjaXBoZXJzIHVzaW5nIERpZmZpZS1IZWxsbWFuIGtleSBleGNoYW5nZSIsCisiICAgIFwiRURIXCIgICAgICAgYWxsIGNpcGhlcnMgdXNpbmcgRXBoZW1lcmFsIERpZmZpZS1IZWxsbWFuIGtleSBleGNoYW5nZSIsCisiICAgIFwiQURIXCIgICAgICAgYWxsIGNpcGhlcnMgdXNpbmcgQW5vbnltb3VzIERpZmZpZS1IZWxsbWFuIGtleSBleGNoYW5nZSIsCisiICAgIFwiRFNTXCIgICAgICAgYWxsIGNpcGhlcnMgdXNpbmcgRFNTIGF1dGhlbnRpY2F0aW9uIiwKKyIgICAgXCJLUkI1XCIgICAgICBhbGwgY2lwaGVycyB1c2luZyBLZXJiZXJvcyA1IGF1dGhlbnRpY2F0aW9uIiwKKyIgICAgXCJOVUxMXCIgICAgICBhbGwgY2lwaGVycyB1c2luZyBubyBlbmNyeXB0aW9uIiwKKyIgIiwKKyJFYWNoIGl0ZW0gaW4gdGhlIGxpc3QgbWF5IGluY2x1ZGUgYSBwcmVmaXggbW9kaWZpZXI6IiwKKyIgIiwKKyIgICAgXCIrXCIgICAgICAgICBtb3ZlIGNpcGhlcihzKSB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgbGlzdCIsCisiICAgIFwiLVwiICAgICAgICAgcmVtb3ZlIGNpcGhlcihzKSBmcm9tIHRoZSBsaXN0IChtYXkgYmUgYWRkZWQgYWdhaW4gYnkiLAorIiAgICAgICAgICAgICAgICBhIHN1YnNlcXVlbnQgbGlzdCBlbnRyeSkiLAorIiAgICBcIiFcIiAgICAgICAgIGtpbGwgY2lwaGVyIGZyb20gdGhlIGxpc3QgKGl0IG1heSBub3QgYmUgYWRkZWQgYWdhaW4iLAorIiAgICAgICAgICAgICAgICBieSBhIHN1YnNlcXVlbnQgbGlzdCBlbnRyeSkiLAorIiAiLAorIklmIG5vIG1vZGlmaWVyIGlzIHNwZWNpZmllZCB0aGUgZW50cnkgaXMgYWRkZWQgdG8gdGhlIGxpc3QgYXQgdGhlIGN1cnJlbnQgIiwKKyJwb3NpdGlvbi4gIFwiK1wiIG1heSBhbHNvIGJlIHVzZWQgdG8gY29tYmluZSB0YWdzIHRvIHNwZWNpZnkgZW50cmllcyBzdWNoIGFzICIKKywKKyJcIlJTQStSQzRcIiBkZXNjcmliZXMgYWxsIGNpcGhlcnMgdGhhdCB1c2UgYm90aCBSU0EgYW5kIFJDNC4iLAorIiAiLAorIkZvciBleGFtcGxlLCBhbGwgYXZhaWxhYmxlIGNpcGhlcnMgbm90IGluY2x1ZGluZyBBREgga2V5IGV4Y2hhbmdlOiIsCisiICIsCisiICBBTEw6IUFESDpSQzQrUlNBOitISUdIOitNRURJVU06K0xPVzorU1NMdjI6K0VYUCIsCisiICIsCisiQWxsIGFsZ29yaXRobXMgaW5jbHVkaW5nIEFESCBhbmQgZXhwb3J0IGJ1dCBleGNsdWRpbmcgcGF0ZW50ZWQgYWxnb3JpdGhtczogIiwKKyIgIiwKKyIgIEhJR0g6TUVESVVNOkxPVzpFWFBPUlQ1NjpFWFA6QURIOiFrUlNBOiFhUlNBOiFSQzQ6IVJDMjohSURFQSIsCisiICIsCisiVGhlIE9wZW5TU0wgY29tbWFuZCAiLAorIiAiLAorIiAgb3BlbnNzbC5leGUgY2lwaGVycyAtdiA8bGlzdCBvZiBjaXBoZXJzPiAiLAorIiAiLAorIm1heSBiZSB1c2VkIHRvIGxpc3QgYWxsIG9mIHRoZSBjaXBoZXJzIGFuZCB0aGUgb3JkZXIgZGVzY3JpYmVkIGJ5IGEgc3BlY2lmaWMiLAorIjxsaXN0IG9mIGNpcGhlcnM+LiIsCisiICIsCisiU0VUIEFVVEhFTlRJQ0FUSU9OIHsgU1NMLCBUTFMgfSBDUkwtRElSIDxkaXJlY3Rvcnk+IiwKKyJzcGVjaWZpZXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBjZXJ0aWZpY2F0ZSByZXZvY2F0aW9uIGZpbGVzIHdoZXJlIGVhY2giLAorImZpbGUgaXMgbmFtZWQgYnkgdGhlIGhhc2ggb2YgdGhlIGNlcnRpZmljYXRlIHRoYXQgaGFzIGJlZW4gcmV2b2tlZC4iLAorIiAiLAorIiAgT3BlblNTTCBleHBlY3RzIHRoZSBoYXNoIHN5bWxpbmtzIHRvIGJlIG1hZGUgbGlrZSB0aGlzOiIsCisiICIsCisiICAgIGxuIC1zIGNybC5wZW0gYG9wZW5zc2wgY3JsIC1oYXNoIC1ub291dCAtaW4gY3JsLnBlbWAucjAiLAorIiAiLAorIiAgU2luY2Ugbm90IGFsbCBmaWxlIHN5c3RlbXMgaGF2ZSBzeW1saW5rcyB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQiLAorIiAgaW4gS2VybWl0IHRvIGNvcHkgdGhlIGNybC5wZW0gZmlsZSB0byB0aGUgaGFzaCBmaWxlIG5hbWUuIiwKKyIgIiwKKyIgICAgIGNvcHkgY3JsLnBlbSB7XFxmY29tbWFuZChvcGVuc3NsLmV4ZSBjcmwgLWhhc2ggLW5vb3V0IC1pbiBjcmwucGVtKS5yMH0iLAorIiAiLAorIiAgVGhpcyBwcm9kdWNlcyBhIGhhc2ggYmFzZWQgb24gdGhlIGlzc3VlciBmaWVsZCBpbiB0aGUgQ1JMIHN1Y2ggIiwKKyIgIHRoYXQgdGhlIGlzc3VlciBmaWVsZCBvZiBhIENlcnQgbWF5IGJlIHF1aWNrbHkgbWFwcGVkIHRvIHRoZSAiLAorIiAgY29ycmVjdCBDUkwuIiwKKyIgIiwKKyJTRVQgQVVUSEVOVElDQVRJT04geyBTU0wsIFRMUyB9IENSTC1GSUxFIDxmaWxlbmFtZT4iLAorInNwZWNpZmllcyBhIGZpbGUgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgY2VydGlmaWNhdGUgcmV2b2NhdGlvbnMuIiwKKyIgIiwKKyJTRVQgQVVUSEVOVElDQVRJT04geyBTU0wsIFRMUyB9IERFQlVHIHsgT04sIE9GRiB9IiwKKyJzcGVjaWZpZXMgd2hldGhlciBkZWJ1ZyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgZGlzcGxheWVkIGFib3V0IHRoZSBTU0wvVExTIiwKKyJjb25uZWN0aW9uLiAgV2hlbiBERUJVRyBpcyBPTiwgdGhlIFZFUklGWSBjb21tYW5kIGRvZXMgbm90IHRlcm1pbmF0ZSIsCisiY29ubmVjdGlvbnMgd2hlbiBzZXQgdG8gRkFJTC1JRi1OTy1QRUVSLUNFUlQgd2hlbiBhIGNlcnRpZmljYXRlIGlzIiwKKyJwcmVzZW50ZWQgdGhhdCBjYW5ub3QgYmUgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkLiAgSW5zdGVhZCBlYWNoIGVycm9yIiwKKyJpcyBkaXNwbGF5ZWQgYnV0IHRoZSBjb25uZWN0aW9uIGF1dG9tYXRpY2FsbHkgY29udGludWVzLiIsCisiICIsCisiU0VUIEFVVEhFTlRJQ0FUSU9OIHsgU1NMLCBUTFMgfSBESC1QQVJBTS1GSUxFIDxmaWxlbmFtZT4iLAorIiAgU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIERIIHBhcmFtZXRlcnMgd2hpY2ggYXJlIHVzZWQgdG8gZ2VuZXJhdGUiLAorIiAgdGVtcG9yYXJ5IERIIGtleXMuICBJZiBhIERIIHBhcmFtZXRlciBmaWxlIGlzIG5vdCBwcm92aWRlZCBLZXJtaXQgdXNlcyBhIiwKKyIgIGZpeGVkIHNldCBvZiBwYXJhbWV0ZXJzIGRlcGVuZGluZyBvbiB0aGUgbmVnb3RpYXRlZCBrZXkgbGVuZ3RoLiAgS2VybWl0IiwKKyIgIHByb3ZpZGVzIERIIHBhcmFtZXRlcnMgZm9yIGtleSBsZW5ndGhzIG9mIDUxMiwgNzY4LCAxMDI0LCAxNTM2LCBhbmQgMjA0OCIsCisiICBiaXRzLiIsCisiICIsCisiU0VUIEFVVEhFTlRJQ0FUSU9OIHsgU1NMLCBUTFMgfSBEU0EtQ0VSVC1DSEFJTi1GSUxFIDxmaWxlbmFtZT4iLAorIiAgU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIGEgRFNBIGNlcnRpZmljYXRlIGNoYWluIHRvIGJlIHNlbnQgYWxvbmcgd2l0aCIsCisiICB0aGUgRFNBLUNFUlQgdG8gdGhlIHBlZXIuICBUaGlzIGZpbGUgbXVzdCBvbmx5IGJlIHNwZWNpZmllZCBpZiBLZXJtaXQgaXMiLAorIiAgYmVpbmcgdXNlZCBhcyBhIHNlcnZlciBhbmQgdGhlIERTQSBjZXJ0aWZpY2F0ZSB3YXMgc2lnbmVkIGJ5IGFuIiwKKyIgIGludGVybWVkaWFyeSBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkuIiwKKyIgIiwKKyJTRVQgQVVUSEVOVElDQVRJT04geyBTU0wsIFRMUyB9IERTQS1DRVJULUZJTEUgPGZpbGVuYW1lPiIsCisiICBTcGVjaWZpZXMgYSBmaWxlIGNvbnRhaW5pbmcgYSBEU0EgY2VydGlmaWNhdGUgdG8gYmUgc2VudCB0byB0aGUgcGVlciB0byAiLAorIiAgYXV0aGVudGljYXRlIHRoZSBob3N0IG9yIGVuZCB1c2VyLiAgVGhlIGZpbGUgbWF5IGNvbnRhaW4gdGhlIG1hdGNoaW5nIERIICIsCisiICBwcml2YXRlIGtleSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBEU0EtS0VZLUZJTEUgY29tbWFuZC4iLAorIiAiLAorIlNFVCBBVVRIRU5USUNBVElPTiB7IFNTTCwgVExTIH0gRFNBLUtFWS1GSUxFIDxmaWxlbmFtZT4iLAorIlNwZWNpZmllcyBhIGZpbGUgY29udGFpbmluZyB0aGUgcHJpdmF0ZSBESCBrZXkgdGhhdCBtYXRjaGVzIHRoZSBEU0EgIiwKKyJjZXJ0aWZpY2F0ZSBzcGVjaWZpZWQgd2l0aCBEU0EtQ0VSVC1GSUxFLiAgVGhpcyBjb21tYW5kIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIiwKKyJ0aGUgcHJpdmF0ZSBrZXkgaXMgbm90IGFwcGVuZGVkIHRvIHRoZSBjZXJ0aWZpY2F0ZSBpbiB0aGUgZmlsZSBzcGVjaWZpZWQgYnkiLAorIkRTQS1DRVJULUZJTEUuIiwKKyIgIiwKKyIgIE5vdGU6IFdoZW4gZXhlY3V0aW5nIGEgc2NyaXB0IGluIHRoZSBiYWNrZ3JvdW5kIG9yIHdoZW4gaXQgaXMiLAorIiAgcnVubmluZyBhcyBhbiBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSBEYWVtb24sIEtlcm1pdCBjYW5ub3Qgc3VwcG9ydCAiLAorIiAgZW5jcnlwdGVkIHByaXZhdGUga2V5cy4gIFdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIGEgcHJpdmF0ZSBrZXkgdGhhdCBpcyIsCisiICBlbmNyeXB0ZWQsIGEgcHJvbXB0IHdpbGwgYmUgZ2VuZXJhdGVkIHJlcXVlc3RpbmcgdGhlIHBhc3NwaHJhc2UgbmVjZXNzYXJ5IiwKKyIgIHRvIGRlY3J5cHQgdGhlIGtleWZpbGUuICBUbyBhdXRvbWF0ZSBhY2Nlc3MgdG8gdGhlIHByaXZhdGUga2V5IHlvdSBtdXN0IiwKKyIgIGRlY3J5cHQgdGhlIGVuY3J5cHRlZCBrZXlmaWxlIGFuZCBjcmVhdGUgYW4gdW5lbmNyeXB0ZWQga2V5ZmlsZSBmb3IgdXNlIiwKKyIgIGJ5IEtlcm1pdC4gIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBieSB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQgYW5kIiwKKyIgIHRoZSBwYXNzcGhyYXNlOiIsCisiICIsCisiICBvcGVuc3NsIGRzYSAtaW4gPGVuY3J5cHRlZC1rZXktZmlsZT4gLW91dCA8dW5lbmNyeXB0ZWQta2V5LWZpbGU+IiwKKyIgIiwKKyJTRVQgQVVUSEVOVElDQVRJT04geyBTU0wsIFRMUyB9IFJBTkRPTS1GSUxFIDxmaWxlbmFtZT4iLAorIiAgU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIHJhbmRvbSBkYXRhIHRvIGJlIHVzZWQgYXMgc2VlZCBmb3IgdGhlIiwKKyIgIFBzZXVkbyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvci4gIFRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhcmUiLAorIiAgb3ZlcndyaXR0ZW4gd2l0aCBuZXcgcmFuZG9tIGRhdGEgb24gZWFjaCB1c2UuIiwKKyIgIiwKKyJTRVQgQVVUSEVOVElDQVRJT04geyBTU0wsIFRMUyB9IFJTQS1DRVJULUNIQUlOLUZJTEUgPGZpbGVuYW1lPiIsCisiICBTcGVjaWZpZXMgYSBmaWxlIGNvbnRhaW5pbmcgYSBSU0EgY2VydGlmaWNhdGUgY2hhaW4gdG8gYmUgc2VudCBhbG9uZyB3aXRoIiwKKyIgIHRoZSBSU0EtQ0VSVCB0byB0aGUgcGVlci4gIFRoaXMgZmlsZSBtdXN0IG9ubHkgYmUgc3BlY2lmaWVkIGlmIEtlcm1pdCBpcyIsCisiICBiZWluZyB1c2VkIGFzIGEgc2VydmVyIGFuZCB0aGUgUlNBIGNlcnRpZmljYXRlIHdhcyBzaWduZWQgYnkgYW4iLAorIiAgaW50ZXJtZWRpYXJ5IGNlcnRpZmljYXRlIGF1dGhvcml0eS4iLAorIiAiLAorIlNFVCBBVVRIRU5USUNBVElPTiB7IFNTTCwgVExTIH0gUlNBLUNFUlQtRklMRSA8ZmlsZW5hbWU+IiwKKyIgIFNwZWNpZmllcyBhIGZpbGUgY29udGFpbmluZyBhIFJTQSBjZXJ0aWZpY2F0ZSB0byBiZSBzZW50IHRvIHRoZSBwZWVyIHRvICIsCisiICBhdXRoZW50aWNhdGUgdGhlIGhvc3Qgb3IgZW5kIHVzZXIuICBUaGUgZmlsZSBtYXkgY29udGFpbiB0aGUgbWF0Y2hpbmcgUlNBICIsCisiICBwcml2YXRlIGtleSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBSU0EtS0VZLUZJTEUgY29tbWFuZC4iLAorIiAiLAorIlNFVCBBVVRIRU5USUNBVElPTiB7IFNTTCwgVExTIH0gUlNBLUtFWS1GSUxFIDxmaWxlbmFtZT4iLAorIiAgU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIHRoZSBwcml2YXRlIFJTQSBrZXkgdGhhdCBtYXRjaGVzIHRoZSBSU0EiLAorIiAgY2VydGlmaWNhdGUgc3BlY2lmaWVkIHdpdGggUlNBLUNFUlQtRklMRS4gIFRoaXMgY29tbWFuZCBpcyBvbmx5IG5lY2Vzc2FyeSIsCisiICBpZiB0aGUgcHJpdmF0ZSBrZXkgaXMgbm90IGFwcGVuZGVkIHRvIHRoZSBjZXJ0aWZpY2F0ZSBpbiB0aGUgZmlsZSBzcGVjaWZpZWQiCissCisiICBieSBSU0EtQ0VSVC1GSUxFLiAgIiwKKyIgIiwKKyIgIE5vdGU6IFdoZW4gZXhlY3V0aW5nIGEgc2NyaXB0IGluIHRoZSBiYWNrZ3JvdW5kIG9yIHdoZW4gaXQgaXMiLAorIiAgcnVubmluZyBhcyBhbiBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSBEYWVtb24sIEtlcm1pdCBjYW5ub3Qgc3VwcG9ydCAiLAorIiAgZW5jcnlwdGVkIHByaXZhdGUga2V5cy4gIFdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIGEgcHJpdmF0ZSBrZXkgdGhhdCBpcyIsCisiICBlbmNyeXB0ZWQsIGEgcHJvbXB0IHdpbGwgYmUgZ2VuZXJhdGVkIHJlcXVlc3RpbmcgdGhlIHBhc3NwaHJhc2UgbmVjZXNzYXJ5IiwKKyIgIHRvIGRlY3J5cHQgdGhlIGtleWZpbGUuICBUbyBhdXRvbWF0ZSBhY2Nlc3MgdG8gdGhlIHByaXZhdGUga2V5IHlvdSBtdXN0IiwKKyIgIGRlY3J5cHQgdGhlIGVuY3J5cHRlZCBrZXlmaWxlIGFuZCBjcmVhdGUgYW4gdW5lbmNyeXB0ZWQga2V5ZmlsZSBmb3IgdXNlIiwKKyIgIGJ5IEtlcm1pdC4gIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBieSB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQgYW5kIiwKKyIgIHRoZSBwYXNzcGhyYXNlOiIsCisiICIsCisiICBvcGVuc3NsIHJzYSAtaW4gPGVuY3J5cHRlZC1rZXktZmlsZT4gLW91dCA8dW5lbmNyeXB0ZWQta2V5LWZpbGU+IiwKKyIgIiwKKyJTRVQgQVVUSEVOVElDQVRJT04geyBTU0wsIFRMUyB9IFZFUkJPU0UgeyBPTiwgT0ZGIH0iLAorIiAgU3BlY2lmaWVzIHdoZXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF1dGhlbnRpY2F0aW9uIChpZSwgdGhlIiwKKyIgIGNlcnRpZmljYXRlIGNoYWluKSBzaG91bGQgYmUgZGlzcGxheWVkIHVwb24gbWFraW5nIGEgY29ubmVjdGlvbi4iLAorIiAiLAorIlNFVCBBVVRIRU5USUNBVElPTiB7IFNTTCwgVExTIH0gVkVSSUZZIHsgTk8sUEVFUi1DRVJULEZBSUwtSUYtTk8tUEVFUi1DRVJUIH0iLAorIiAgU3BlY2lmaWVzIHdoZXRoZXIgY2VydGlmaWNhdGVzIHNob3VsZCBiZSByZXF1ZXN0ZWQgZnJvbSB0aGUgcGVlciB2ZXJpZmllZDsiLAorIiAgd2hldGhlciB0aGV5IHNob3VsZCBiZSB2ZXJpZmllZCB3aGVuIHRoZXkgYXJlIHByZXNlbnRlZDsgYW5kIHdoZXRoZXIgdGhleSIsCisiICBzaG91bGQgYmUgcmVxdWlyZWQuICBXaGVuIHNldCB0byBOTyAodGhlIGRlZmF1bHQgZm9yIElLU0QpLCBLZXJtaXQgZG9lcyIsCisiICBub3QgcmVxdWVzdCB0aGF0IHRoZSBwZWVyIHNlbmQgYSBjZXJ0aWZpY2F0ZTsgaWYgb25lIGlzIHByZXNlbnRlZCBpdCBpcyIsCisiICBpZ25vcmVkLiAgV2hlbiBzZXQgdG8gUEVFUi1DRVJUICh0aGUgZGVmYXVsdCB3aGVuIG5vdCBJS1NEKSwgS2VybWl0IiwKKyIgIHJlcXVlc3RzIGEgY2VydGlmaWNhdGUgYmUgc2VudCBieSB0aGUgcGVlci4gIElmIHByZXNlbnRlZCwgdGhlIGNlcnRpZmljYXRlIiwKKyIgIGlzIHZlcmlmaWVkLiAgQW55IGVycm9ycyBkdXJpbmcgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIHJlc3VsdCBpbiIsCisiICBxdWVyaWVzIHRvIHRoZSBlbmQgdXNlci4gIFdoZW4gc2V0IHRvIEZBSUwtSUYtTk8tUEVFUi1DRVJULCBLZXJtaXQiLAorIiAgcmVxdWVzdHMgYSBjZXJ0aWZpY2F0ZSBiZSBzZW50IGJ5IHRoZSBwZWVyLiAgSWYgdGhlIGNlcnRpZmljYXRlIGlzIG5vdCIsCisiICBwcmVzZW50ZWQgb3IgZmFpbHMgdG8gdmVyaWZ5LCB0aGUgY29ubmVjdGlvbiBpcyB0ZXJtaW5hdGVkIHdpdGhvdXQiLAorIiAgcXVlcnlpbmcgdGhlIHVzZXIuIiwKKyIgIiwKKyIgIElmIGFuIGFub255bW91cyBjaXBoZXIgKGkuZS4sIEFESCkgaXMgZGVzaXJlZCwgdGhlIE5PIHNldHRpbmcgbXVzdCBiZSIsCisiICB1c2VkLiAgT3RoZXJ3aXNlLCB0aGUgcmVjZWlwdCBvZiB0aGUgcGVlciBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGlzIiwKKyIgIGludGVycHJldGVkIGFzIGEgcHJvdG9jb2wgZXJyb3IgYW5kIHRoZSBuZWdvdGlhdGlvbiBmYWlscy4iLAorIiAiLAorIiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHBlZXIgdG8gYXV0aGVudGljYXRlIHVzaW5nIGVpdGhlciBhbiBYNTA5IiwKKyIgIGNlcnRpZmljYXRlIHRvIHVzZXJpZCBtYXBwaW5nIGZ1bmN0aW9uIG9yIHZpYSB1c2Ugb2YgYSB+Ly50bHNsb2dpbiBmaWxlIiwKKyIgIHlvdSBtdXN0IHVzZSBlaXRoZXIgUEVFUi1DRVJUIG9yIEZBSUwtSUYtTk8tUEVFUi1DRVJULiAgT3RoZXJ3aXNlLCBhbnkiLAorIiAgY2VydGlmaWNhdGVzIHRoYXQgYXJlIHByZXNlbnRlZCBpcyBpZ25vcmVkLiAgSW4gb3RoZXIgd29yZHMsIHVzZSBOTyBpZiB5b3UiLAorIiAgd2FudCB0byBkaXNhYmxlIHRoZSBhYmlsaXR5IHRvIHVzZSBjZXJ0aWZpY2F0ZXMgdG8gYXV0aGVudGljYXRlIGEgcGVlci4iLAorIiAiLAorIlNFVCBBVVRIRU5USUNBVElPTiB7IFNTTCwgVExTIH0gVkVSSUZZLURJUiA8ZGlyZWN0b3J5PiIsCisiICBTcGVjaWZpZXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyByb290IENBIGNlcnRpZmljYXRlIGZpbGVzIHVzZWQgdG8iLAorIiAgdmVyaWZ5IHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbnMgcHJlc2VudGVkIGJ5IHRoZSBwZWVyLiAgRWFjaCBmaWxlIGlzIG5hbWVkIiwKKyIgIGJ5IGEgaGFzaCBvZiB0aGUgY2VydGlmaWNhdGUuIiwKKyIgIiwKKyIgIE9wZW5TU0wgZXhwZWN0cyB0aGUgaGFzaCBzeW1saW5rcyB0byBiZSBtYWRlIGxpa2UgdGhpczoiLAorIiAiLAorIiAgICBsbiAtcyBjZXJ0LnBlbSBgb3BlbnNzbCB4NTA5IC1oYXNoIC1ub291dCAtaW4gY2VydC5wZW1gLjAiLAorIiAiLAorIiAgU2luY2Ugbm90IGFsbCBmaWxlIHN5c3RlbXMgaGF2ZSBzeW1saW5rcyB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQiLAorIiAgaW4gS2VybWl0IHRvIGNvcHkgdGhlIGNlcnQucGVtIGZpbGUgdG8gdGhlIGhhc2ggZmlsZSBuYW1lLiIsCisiICIsCisiICAgIGNvcHkgY2VydC5wZW0ge1xcZmNvbW1hbmQob3BlbnNzbC5leGUgeDUwOSAtaGFzaCAtbm9vdXQgLWluIGNlcnQucGVtKS4wfSIsCisiICIsCisiICBUaGlzIHByb2R1Y2VzIGEgaGFzaCBiYXNlZCBvbiB0aGUgc3ViamVjdCBmaWVsZCBpbiB0aGUgY2VydCBzdWNoIHRoYXQgdGhlIiwKKyIgIGNlcnRpZmljYXRlIG1heSBiZSBxdWlja2x5IGZvdW5kLiIsCisiICIsCisiU0VUIEFVVEhFTlRJQ0FUSU9OIHsgU1NMLCBUTFMgfSBWRVJJRlktRklMRSA8ZmlsZT4iLAorIiAgU3BlY2lmaWVzIGEgZmlsZSB0aGF0IGNvbnRhaW5zIHJvb3QgQ0EgY2VydGlmaWNhdGVzIHRvIGJlIHVzZWQgZm9yIiwKKyIgIHZlcmlmeWluZyBjZXJ0aWZpY2F0ZSBjaGFpbnMuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyIiCit9OworCitzdGF0aWMgY2hhciAqaHh5bmV0W10gPSB7CisiU3ludGF4OiBTRVQgTkVUV09SSyB7IFRZUEUgbmV0d29yay10eXBlLCBESVJFQ1RPUlkgWyBmaWxlKHMpLi4uIF0gfSIsCisiICIsCisiU2VsZWN0IHRoZSB0eXBlIG9mIG5ldHdvcmsgdG8gYmUgdXNlZCB3aXRoIFNFVCBIT1NUIGNvbm5lY3Rpb25zOiIsCisiICIsCisjaWZkZWYgTkVUQ01ECisiICBTRVQgTkVUV09SSyBUWVBFIENPTU1BTkQgICA7IE1ha2UgYSBjb25uZWN0aW9uIHRocm91Z2ggYW4gZXh0ZXJuYWwgY29tbWFuZCIsCisjZW5kaWYgLyogTkVUQ01EICovCisjaWZkZWYgVENQU09DS0VUCisiICBTRVQgTkVUV09SSyBUWVBFIFRDUC9JUCAgICA7IEludGVybmV0OiBUZWxuZXQsIFJsb2dpbiwgZXRjLiIsCisjZW5kaWYgLyogVENQU09DS0VUICovCisjaWZkZWYgQU5ZWDI1CisiICBTRVQgTkVUV09SSyBUWVBFIFguMjUgICAgICA7IFguMjUgcGVlci10by1wZWVyIGNvbm5lY3Rpb25zLiIsCisjZW5kaWYgLyogQU5ZWDI1ICovCisjaWZkZWYgREVDTkVUCisiICBTRVQgTkVUV09SSyBUWVBFIFBBVEhXT1JLUyB7IExBVCwgQ1RFUk0gfSA7IERFQyBMQVQgb3IgQ1RFUk0gY29ubmVjdGlvbnMuIiwKKyNlbmRpZiAvKiBERUNORVQgKi8KKyNpZmRlZiBOUElQRQorIiAgU0VUIE5FVFdPUksgVFlQRSBOQU1FRC1QSVBFIDxwaXBlbmFtZT4gIDsgT1MvMiBOYW1lZCBQaXBlIGNvbm5lY3Rpb25zLiIsCisjZW5kaWYgLyogTlBJUEUgKi8KKyNpZmRlZiBDS19ORVRCSU9TCisiICBTRVQgTkVUV09SSyBUWVBFIE5FVEJJT1MgICAgICAgICAgICAgICAgOyBORVRCSU9TIHBlZXItdG8tcGVlciBjb25uZWN0aW9ucyIsCisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworI2lmZGVmIFNVUEVSTEFUCisiICBTRVQgTkVUV09SSyBUWVBFIFNVUEVSTEFUIDsgTEFUIGNvbm5lY3Rpb25zIChNZXJpZGlhbiBUZWNobm9sb2d5IFN1cGVyTEFUKSIsCisjZW5kaWYgLyogU1VQRVJMQVQgKi8KKyIgIiwKKyJJZiBvbmx5IG9uZSBuZXR3b3JrIHR5cGUgaXMgbGlzdGVkIGFib3ZlLCB0aGF0IGlzIHRoZSBkZWZhdWx0IG5ldHdvcmsgZm9yIiwKKyNpZmRlZiBSTE9HQ09ERQorIlNFVCBIT1NUIGNvbW1hbmRzLiAgQWxzbyBzZWUgU0VUIEhPU1QsIFRFTE5FVCwgUkxPR0lOLiIsCisjZWxzZQorI2lmZGVmIFROQ09ERQorIlNFVCBIT1NUIGNvbW1hbmRzLiAgQWxzbyBzZWUgU0VUIEhPU1QsIFRFTE5FVC4iLAorI2Vsc2UKKyJTRVQgSE9TVCBjb21tYW5kcy4gIEFsc28gc2VlIFNFVCBIT1NULiIsCisjZW5kaWYgLyogVE5DT0RFICovCisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyIgIiwKKyJTRVQgTkVUV09SSyBESVJFQ1RPUlkgWyBmaWxlIFsgZmlsZSBbIC4uLiBdIF0gXSIsCisiICBTcGVjaWZpZXMgdGhlIG5hbWUocykgb2YgemVybyBvciBtb3JlIG5ldHdvcmsgZGlyZWN0b3J5IGZpbGVzLCBzaW1pbGFyIHRvIiwKKyIgIGRpYWxpbmcgZGlyZWN0b3JpZXMgKEhFTFAgRElBTCBmb3IgZGV0YWlscykuICBUaGUgZ2VuZXJhbCBmb3JtYXQgb2YgYSIsCisiICBuZXR3b3JrIGRpcmVjdG9yeSBlbnRyeSBpczoiLAorIiAiLAorIiAgICBuYW1lIG5ldHdvcmstdHlwZSBhZGRyZXNzIFsgbmV0d29yay1zcGVjaWZpYy1pbmZvIF0gWyA7IGNvbW1lbnQgXSIsCisiICIsCisiICBGb3IgVENQL0lQLCB0aGUgZm9ybWF0IGlzOiIsCisiICIsCisiICAgIG5hbWUgdGNwL2lwIGlwLWhvc3RuYW1lLW9yLWFkZHJlc3MgWyBzb2NrZXQgXSBbIDsgY29tbWVudCBdIiwKKyIgIiwKKyJZb3UgY2FuIGhhdmUgbXVsdGlwbGUgbmV0d29yayBkaXJlY3RvcmllcyBhbmQgeW91IGNhbiBoYXZlIG11bHRpcGxlIGVudHJpZXMiLAorIndpdGggdGhlIHNhbWUgbmFtZS4gIFNFVCBIT1NUIDxuYW1lPiBhbmQgVEVMTkVUIDxuYW1lPiBjb21tYW5kcyBsb29rIHVwIHRoZSIsCisiZ2l2ZW4gPG5hbWU+IGluIHRoZSBkaXJlY3RvcnkgYW5kLCBpZiBmb3VuZCwgZmlsbCBpbiB0aGUgYWRkaXRpb25hbCBpdGVtcyIsCisiZnJvbSB0aGUgZW50cnksIGFuZCB0aGVuIHRyeSBhbGwgbWF0Y2hpbmcgZW50cmllcyB1bnRpbCBvbmUgc3VjY2VlZHMuIiwKKyIifTsKKworI2lmbmRlZiBOT1RDUE9QVFMKK3N0YXRpYyBjaGFyICpoeHl0Y3BbXSA9IHsKKyNpZmRlZiBTT0xfU09DS0VUCisiU0VUIFRDUCBBRERSRVNTIDxpcC1hZGRyZXNzPiIsCisiICBUaGlzIGFsbG93cyBhIHNwZWNpZmljIElQIEFkZHJlc3Mgb24gYSBtdWx0aWhvbWVkIGhvc3QgdG8gYmUgdXNlZCIsCisiICBpbnN0ZWFkIG9mIGFsbG93aW5nIHRoZSBUQ1AvSVAgc3RhY2sgdG8gY2hvb3NlLiAgVGhpcyBtYXkgYmUgbmVjZXNzYXJ5IiwKKyIgIHdoZW4gdXNpbmcgYXV0aGVudGljYXRpb24gb3IgbGlzdGVuaW5nIGZvciBhbiBpbmNvbWluZyBjb25uZWN0aW9uLiIsCisiICBTcGVjaWZ5IG5vIDxpcC1hZGRyZXNzPiB0byByZW1vdmUgdGhlIHByZWZlcmVuY2UuIiwKKyIgIiwKKyJTRVQgVENQIEtFRVBBTElWRSB7IE9OLCBPRkYgfSIsCisiICBTZXR0aW5nIHRoaXMgT04gbWlnaHQgaGVscCB0byBkZXRlY3QgYnJva2VuIGNvbm5lY3Rpb25zIG1vcmUgcXVpY2tseS4iLAorIiAgKGRlZmF1bHQgaXMgT04uKSIsCisiICIsCisiU0VUIFRDUCBMSU5HRVIgeyBPTiBbdGltZW91dF0sIE9GRiB9IiwKKyIgIFNldHRpbmcgdGhpcyBPTiBlbnN1cmVzIHRoYXQgYSBjb25uZWN0aW9uIGRvZXNuJ3QgY2xvc2UgYmVmb3JlIGFsbCIsCisiICBvdXRzdGFuZGluZyBkYXRhIGhhcyBiZWVuIHRyYW5zZmVycmVkIGFuZCBhY2tub3dsZWRnZWQuICBUaGUgdGltZW91dCBpcyIsCisiICBtZWFzdXJlZCBpbiAxMHRocyBvZiBtaWxsaXNlY29uZHMuICBUaGUgZGVmYXVsdCBpcyBPTiB3aXRoIGEgdGltZW91dCBvZiAwLiIsCisiICIsCisiU0VUIFRDUCBOT0RFTEFZIHsgT04sIE9GRiB9IiwKKyIgIE9OIG1lYW5zIHNlbmQgc2hvcnQgVENQIHBhY2tldHMgaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gd2FpdGluZyIsCisiICB0byBhY2N1bXVsYXRlIGEgYnVuY2ggb2YgdGhlbSBiZWZvcmUgdHJhbnNtaXR0aW5nIChOYWdsZSBBbGdvcml0aG0pLiIsCisiICAoZGVmYXVsdCBpcyBPRkYuKSIsCisiICIsCisiU0VUIFRDUCBSRUNWQlVGIDxudW1iZXI+IiwKKyJTRVQgVENQIFNFTkRCVUYgPG51bWJlcj4iLAorIiAgIFRDUCByZWNlaXZlIGFuZCBzZW5kIGJ1ZmZlciBzaXplcy4gIChkZWZhdWx0IGlzIC0xLCB1c2Ugc3lzdGVtIGRlZmF1bHRzLikiLAorIiAiLAorIlRoZXNlIGl0ZW1zIGxldCB5b3UgdHVuZSBUQ1AgbmV0d29ya2luZyBwZXJmb3JtYW5jZSBvbiBhIHBlci1jb25uZWN0aW9uIiwKKyJiYXNpcyBieSBhZGp1c3RpbmcgcGFyYW1ldGVycyB5b3Ugbm9ybWFsbHkgd291bGQgbm90IGhhdmUgYWNjZXNzIHRvLiAgWW91IiwKKyJzaG91bGQgdXNlIHRoZXNlIGNvbW1hbmRzIG9ubHkgaWYgeW91IGZlZWwgdGhhdCB0aGUgVENQL0lQIHByb3RvY29sIHN0YWNrIiwKKyJ0aGF0IEtlcm1pdCBpcyB1c2luZyBpcyBnaXZpbmcgeW91IGluYWRlcXVhdGUgcGVyZm9ybWFuY2UsIGFuZCB0aGVuIG9ubHkgaWYiLAorInlvdSB1bmRlcnN0YW5kIHRoZSBjb25jZXB0cyAoc2VlLCBmb3IgZXhhbXBsZSwgdGhlIENvbWVyIFRDUC9JUCBib29rcyksIGFuZCIsCisidGhlbiBhdCB5b3VyIG93biByaXNrLiAgVGhlc2Ugc2V0dGluZ3MgYXJlIGRpc3BsYXllZCBieSBTSE9XIE5FVFdPUksuICBOb3QiLAorImFsbCBvcHRpb25zIGFyZSBuZWNlc3NhcmlseSBhdmFpbGFibGUgaW4gYWxsIEtlcm1pdCB2ZXJzaW9uczsgaXQgZGVwZW5kcyBvbiIsCisidGhlIHVuZGVybHlpbmcgVENQL0lQIHNlcnZpY2VzLiIsCisiICIsCisiVGhlIGZvbGxvd2luZyBUQ1AgYW5kL29yIElQIHBhcmFtZXRlcihzKSBtYXkgYWxzbyBiZSBjaGFuZ2VkOiIsCisiICIsCisjZW5kaWYgLyogU09MX1NPQ0tFVCAqLworIlNFVCBUQ1AgUkVWRVJTRS1ETlMtTE9PS1VQIHsgQVVUTywgT04sIE9GRiB9IiwKKyIgIFRlbGxzIEtlcm1pdCB3aGV0aGVyIHRvIHBlcmZvcm0gcmV2ZXJzZSBETlMgbG9va3VwIG9uIFRDUC9JUCBjb25uZWN0aW9ucyIsCisiICBzbyBLZXJtaXQgY2FuIGRldGVybWluZSB0aGUgYWN0dWFsIGhvc3RuYW1lIG9mIHRoZSBob3N0IGl0IGlzIGNvbm5lY3RlZCIsCisiICB0bywgd2hpY2ggaXMgdXNlZnVsIGZvciBjb25uZWN0aW9ucyB0byBob3N0IHBvb2xzLCBhbmQgaXMgcmVxdWlyZWQgZm9yIiwKKyIgIEtlcmJlcm9zIGNvbm5lY3Rpb25zIHRvIGhvc3QgcG9vbHMgYW5kIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4gIElmIHRoZSIsCisiICBvdGhlciBob3N0IGRvZXMgbm90IGhhdmUgYSBETlMgZW50cnksIHRoZSByZXZlcnNlIGxvb2t1cCBjb3VsZCB0YWtlIGEgbG9uZyIsCisiICB0aW1lIChtaW51dGVzKSB0byBmYWlsLCBidXQgdGhlIGNvbm5lY3Rpb24gd2lsbCBzdGlsbCBiZSBtYWRlLiAgVHVybiB0aGlzIiwKKyIgIG9wdGlvbiBPRkYgZm9yIHNwZWVkaWVyIGNvbm5lY3Rpb25zIGlmIHlvdSBkbyBub3QgbmVlZCB0byBrbm93IGV4YWN0bHkiLAorIiAgd2hpY2ggaG9zdCB5b3UgYXJlIGNvbm5lY3RlZCB0byBhbmQgeW91IGFyZSBub3QgdXNpbmcgS2VyYmVyb3MuICBBVVRPLCB0aGUiLAorIiAgZGVmYXVsdCwgbWVhbnMgdGhlIGxvb2t1cCBpcyBkb25lIG9uIGhvc3RuYW1lcywgYnV0IG5vdCBvbiBudW1lcmljIElQIiwKKyIgIGFkZHJlc3NlcyB1bmxlc3MgS2VyYmVyb3Mgc3VwcG9ydCBpcyBpbnN0YWxsZWQuIiwKKyNpZmRlZiBDS19ETlNfU1JWCisiICIsCisiU0VUIFRDUCBETlMtU0VSVklDRS1SRUNPUkRTIHtPTiwgT0ZGfSIsCisiICBUZWxscyBLZXJtaXQgd2hldGhlciB0byB0cnkgdG8gdXNlIEROUyBTUlYgcmVjb3JkcyB0byBkZXRlcm1pbmUgdGhlIiwKKyIgIGhvc3QgYW5kIHBvcnQgbnVtYmVyIHVwb24gd2hpY2ggdG8gZmluZCBhbiBhZHZlcnRpc2VkIHNlcnZpY2UuICBGb3IiLAorIiAgZXhhbXBsZSwgaWYgYSBob3N0IHdhbnRzIHJlZ3VsYXIgVGVsbmV0IGNvbm5lY3Rpb25zIHJlZGlyZWN0ZWQgdG8gc29tZSIsCisiICBwb3J0IG90aGVyIHRoYW4gMjMsIHRoaXMgZmVhdHVyZSBhbGxvd3MgS2VybWl0IHRvIGFzayB0aGUgaG9zdCB3aGljaCIsCisiICBwb3J0IGl0IHNob3VsZCB1c2UuICBTaW5jZSBub3QgYWxsIGRvbWFpbiBzZXJ2ZXJzIGFyZSBzZXQgdXAgdG8gYW5zd2VyIiwKKyIgIHN1Y2ggcmVxdWVzdHMsIHRoaXMgZmVhdHVyZSBpcyBPRkYgYnkgZGVmYXVsdC4iLAorI2VuZGlmIC8qIENLX0ROU19TUlYgKi8KKyNpZmRlZiBOVAorI2lmZGVmIENLX1NPQ0tTCisiICIsCisiU0VUIFRDUCBTT0NLUy1TRVJWRVIgWzxob3N0bmFtZSBvciBpcC1hZGRyZXNzPl0iLAorIiAgSWYgYSBob3N0bmFtZSBvciBpcC1hZGRyZXNzIGlzIHNwZWNpZmllZCwgS2VybWl0IHdpbGwgdXNlIHRoZSBTT0NLUyIsCisiICBzZXJ2ZXIgd2hlbiBhdHRlbXB0aW5nIG91dGdvaW5nIGNvbm5lY3Rpb25zLiAgSWYgbm8gaG9zdG5hbWUgb3IiLAorIiAgaXAtYWRkcmVzcyBpcyBzcGVjaWZpZWQsIGFueSBwcmV2aW91c2x5IHNwZWNpZmllZCBTT0NLUyBzZXJ2ZXIgd2lsbCIsCisiICBiZSByZW1vdmVkLiIsCisjZW5kaWYgLyogQ0tfU09DS1MgKi8KKyNlbmRpZiAvKiBOVCAqLworI2lmbmRlZiBOT0hUVFAKKyIgIiwKKyJTRVQgVENQIEhUVFAtUFJPWFkgWzxob3N0bmFtZSBvciBpcC1hZGRyZXNzPls6PHBvcnQ+XV0iLAorIiAgSWYgYSBob3N0bmFtZSBvciBpcC1hZGRyZXNzIGlzIHNwZWNpZmllZCwgS2VybWl0IHdpbGwgdXNlIHRoZSBQcm94eSIsCisiICBzZXJ2ZXIgd2hlbiBhdHRlbXB0aW5nIG91dGdvaW5nIGNvbm5lY3Rpb25zLiAgSWYgbm8gaG9zdG5hbWUgb3IiLAorIiAgaXAtYWRkcmVzcyBpcyBzcGVjaWZpZWQsIGFueSBwcmV2aW91c2x5IHNwZWNpZmllZCBQcm94eSBzZXJ2ZXIgd2lsbCIsCisiICBiZSByZW1vdmVkLiAgSWYgbm8gcG9ydCBudW1iZXIgaXMgc3BlY2lmaWVkLCB0aGUgXCJodHRwXCIgc2VydmljZSIsCisiICB3aWxsIGJlIHVzZWQuIiwKKyNlbmRpZiAvKiBOT0hUVFAgKi8KKyIifTsKKyNlbmRpZiAvKiBOT1RDUE9QVFMgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisKKyNpZmRlZiBUTkNPREUKK3N0YXRpYyBjaGFyICpoeHl0b3B0W10gPSB7CisiU0VUIFRFTE9QVCBbIHsgL0NMSUVOVCwgL1NFUlZFUiB9IF0gPG9wdGlvbj4gLSIsCisiICAgIHsgQUNDRVBURUQsIFJFRlVTRUQsIFJFUVVFU1RFRCwgUkVRVUlSRUQgfSAtIiwKKyIgICAgWyB7IEFDQ0VQVEVELCBSRUZVU0VELCBSRVFVRVNURUQsIFJFUVVJUkVEIH0gXSIsCisiICBTRVQgVEVMT1BUIGxldHMgeW91IHNwZWNpZnkgcG9saWN5IHJlcXVpcmVtZW50cyBmb3IgS2VybWl0J3MgaGFuZGxpbmcgb2YiLAorIiAgVGVsbmV0IG9wdGlvbiBuZWdvdGlhdGlvbnMuICBTZXR0aW5nIGFuIG9wdGlvbiBSRVFVSVJFRCBjYXVzZXMgS2VybWl0IiwKKyIgIHRvIG9mZmVyIHRoZSBvcHRpb24gdG8gdGhlIHBlZXIgYW5kIGRpc2Nvbm5lY3QgaWYgdGhlIG9wdGlvbiBpcyByZWZ1c2VkLiIsCisiICBSRVFVRVNURUQgY2F1c2VzIEtlcm1pdCB0byBvZmZlciBhbiBvcHRpb24gdG8gdGhlIHBlZXIuICBBQ0NFUFRFRCByZXN1bHRzIiwKKyIgIGluIG5vIG9mZmVyIGJ1dCBLZXJtaXQgd2lsbCBhdHRlbXB0IHRvIG5lZ290aWF0ZSB0aGUgb3B0aW9uIGlmIGl0IGlzIiwKKyIgIHJlcXVlc3RlZC4gIFJFRlVTRUQgaW5zdHJ1Y3RzIEtlcm1pdCB0byByZWZ1c2UgdGhlIG9wdGlvbiBpZiBpdCBpcyIsCisiICByZXF1ZXN0ZWQgYnkgdGhlIHBlZXIuIiwKKyIgIiwKKyIgIFNvbWUgb3B0aW9ucyBhcmUgbmVnb3RpYXRlZCBpbiB0d28gZGlyZWN0aW9ucyBhbmQgYWNjZXB0IHNlcGFyYXRlIHBvbGljaWVzIiwKKyIgIGZvciBlYWNoIGRpcmVjdGlvbjsgdGhlIGZpcnN0IGtleXdvcmQgYXBwbGllcyB0byBLZXJtaXQgaXRzZWxmLCB0aGUgc2Vjb25kIiwKKyIgIGFwcGxpZXMgdG8gS2VybWl0J3MgVGVsbmV0IHBhcnRuZXI7IGlmIHRoZSBzZWNvbmQga2V5d29yZCBpcyBvbWl0dGVkLCBhbiIsCisiICBhcHByb3ByaWF0ZSAob3B0aW9uLXNwZWNpZmljKSBkZWZhdWx0IGlzIGFwcGxpZWQuICBZb3UgY2FuIGFsc28gaW5jbHVkZSBhIiwKKyIgIC9DTElFTlQgb3IgL1NFUlZFUiBzd2l0Y2ggdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgZ2l2ZW4gcG9saWNpZXMgYXBwbHkiLAorIiAgd2hlbiBLZXJtaXQgaXMgdGhlIFRlbG5ldCBjbGllbnQgb3IgdGhlIFRlbG5ldCBzZXJ2ZXI7IGlmIG5vIHN3aXRjaCBpcyIsCisiICBnaXZlbiwgdGhlIGNvbW1hbmQgYXBwbGllcyB0byB0aGUgY2xpZW50LiIsCisiICIsCisiICBOb3RlIHRoYXQgc29tZSBvZiBLZXJtaXQncyBUZWxuZXQgcGFydG5lcnMgZmFpbCB0byByZWZ1c2Ugb3B0aW9ucyB0aGF0IiwKKyIgIHRoZXkgZG8gbm90IHJlY29nbml6ZSBhbmQgaW5zdGVhZCBkbyBub3QgcmVzcG9uZCBhdCBhbGwuICBJbiB0aGlzIGNhc2UgaXQiLAorIiAgaXMgcG9zc2libGUgdG8gdXNlIFNFVCBURUxPUFQgdG8gaW5zdHJ1Y3QgS2VybWl0IHRvIFJFRlVTRSB0aGUgb3B0aW9uIiwKKyIgIGJlZm9yZSBjb25uZWN0aW5nIHRvIHRoZSBwcm9ibGVtIGhvc3QsIHRodXMgc2tpcHBpbmcgdGhlIHByb2JsZW1hdGljIiwKKyIgIG5lZ290aWF0aW9uLiIsCisiICIsCisiICBVc2UgU0hPVyBURUxPUFQgdG8gdmlldyBjdXJyZW50IFRlbG5ldCBPcHRpb24gbmVnb3RpYXRpb24gc2V0dGluZ3MuIiwKKyIgIFNIT1cgVEVMTkVUIGRpc3BsYXlzIGN1cnJlbnQgVGVsbmV0IHNldHRpbmdzLiIsCisiIn07CisKK3N0YXRpYyBjaGFyICpoeHl0ZWxbXSA9IHsKKyJTeW50YXg6IFNFVCBURUxORVQgcGFyYW1ldGVyIHZhbHVlIiwKKyIgIiwKKyJGb3IgVENQL0lQIFRFTE5FVCBjb25uZWN0aW9ucywgd2hpY2ggYXJlIGluIE5WVCAoQVNDSUkpIG1vZGUgYnkgZGVmYXVsdDoiLAorIiAiLAorI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisjaWZkZWYgQ09NTUVOVAorIlNFVCBURUxORVQgQVVUSEVOSUNBVElPTiB7IEFDQ0VQVEVELCBSRUZVU0VELCBSRVFVRVNURUQsIFJFUVVJUkVEIH0iLAorIiAgQUNDRVBUIG9yIFJFRlVTRSBhdXRoZW50aWNhdGlvbiBiaWRzLCBvciBhY3RpdmVseSBSRVFVRVNUIGF1dGhlbnRpY2F0aW9uLiIsCisiICBSRVFVSVJFRCByZWZ1c2VzIHRoZSBjb25uZWN0aW9uIGlmIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBzdWNjZXNzZnVsbHkiLAorIiAgbmVnb3RpYXRlZC4gIEFDQ0VQVEVEIGJ5IGRlZmF1bHQuIiwKKyIgIiwKKyNlbmRpZiAvKiBDT01NRU5UICovCisiU0VUIFRFTE5FVCBBVVRIRU5USUNBVElPTiBUWVBFIHsgQVVUT01BVElDLCBLRVJCRVJPU19JViwgS0VSQkVST1NfViwgLi4uIiwKKyNpZmRlZiBOVAorIiAgLi4uLCBOVExNLCBTU0wsIFNSUCwgTk9ORSB9IFsuLi5dIiwKKyNlbHNlIC8qIE5UICovCisiICAuLi4sIFNTTCwgU1JQLCBOT05FIH0gWy4uLl0iLAorI2VuZGlmIC8qIE5UICovCisiICBBVVRPTUFUSUMgaXMgdGhlIGRlZmF1bHQuICBBdmFpbGFibGUgb3B0aW9ucyBjYW4gdmFyeSBkZXBlbmRpbmcgb24gdGhlIiwKKyIgIGZlYXR1cmVzIEtlcm1pdCB3YXMgYnVpbHQgdG8gc3VwcG9ydCBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0iLAorIiAgY29uZmlndXJhdGlvbjsgdHlwZSBTRVQgVEVMTkVUIEFVVEhFTlRJQ0FUSU9OIFRZUEUgPyBmb3IgYSBsaXN0LiIsCisiICIsCisiICBXaGVuIEtlcm1pdCBpcyB0aGUgVGVsbmV0IGNsaWVudDoiLAorIiAgICBBVVRPTUFUSUMgYWxsb3dzIHRoZSBob3N0IHRvIGNob29zZSB0aGUgcHJlZmVycmVkIHR5cGUgb2YgYXV0aGVudGljYXRpb24uIgorLAorIiAgICBOT05FIGluc3RydWN0cyBLZXJtaXQgdG8gcmVmdXNlIGFsbCBhdXRoZW50aWNhdGlvbiBtZXRob2RzIHdoZW4gdGhlIiwKKyIgICAgYXV0aGVudGljYXRpb24gb3B0aW9uIGlzIG5lZ290aWF0ZWQuICBBIGxpc3Qgb2Ygb25lIG9yIG1vcmUgb3RoZXIgdmFsdWVzIiwKKyIgICAgYWxsb3cgYSBzcGVjaWZpYyBzdWJzZXQgb2YgdGhlIHN1cHBvcnRlZCBhdXRoZW50aWNhdGlvbiBtZXRob2RzIHRvIGJlIiwKKyIgICAgdXNlZC4iLAorIiAiLAorIiAgV2hlbiBLZXJtaXQgaXMgdGhlIFRlbG5ldCBzZXJ2ZXI6IiwKKyIgICAgQVVUT01BVElDIHJlc3VsdHMgaW4gYXZhaWxhYmxlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgYmVpbmcgb2ZmZXJlZCIsCisiICAgIHRvIHRoZSB0ZWxuZXQgY2xpZW50IGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IiwKKyIgIiwKKyNpZmRlZiBOVAorIiAgICAgIEtFUkJFUk9TX1YsIEtFUkJFUk9TX0lWLCBTUlAsIFNTTCwgTlRMTSIsCisjZWxzZSAvKiBOVCAqLworIiAgICAgIEtFUkJFUk9TX1YsIEtFUkJFUk9TX0lWLCBTUlAsIFNTTCwgTlRMTSIsCisjZW5kaWYgLyogTlQgKi8KKyIgIiwKKyIgIE5PTkUgcmVzdWx0cyBpbiBubyBhdXRoZW50aWNhdGlvbiBtZXRob2RzIGJlaW5nIG9mZmVyZWQgdG8gdGhlIFRlbG5ldCIsCisiICBzZXJ2ZXIgd2hlbiB0aGUgYXV0aGVudGljYXRpb24gb3B0aW9uIGlzIG5lZ290aWF0ZWQuICBUaGUgcHJlZmVycmVkIiwKKyIgIG1ldGhvZCBvZiBkaXNhYmxpbmcgYXV0aGVudGljYXRpb24gaXM6IiwKKyIgIiwKKyIgICAgU0VUIFRFTE9QVCAvU0VSVkVSIEFVVEhFTlRJQ0FUSU9OIFJFRlVTRSIsCisiICIsCisiICBBIGxpc3Qgb2Ygb25lIG9yIG1vcmUgYXV0aGVudGljYXRpb24gbWV0aG9kcyBzcGVjaWZpZXMgdGhlIG9yZGVyIHRob3NlIiwKKyIgIG1ldGhvZHMgYXJlIHRvIGJlIG9mZmVyZWQgdG8gdGhlIHRlbG5ldCBjbGllbnQuIiwKKyNpZmRlZiBOVAorIiAiLAorIiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgTlRMTSBhdXRoZW50aWNhdGlvbiB0byBiZSB1c2VkIHdpdGggdGhlIE1pY3Jvc29mdCIsCisiICBXaW5kb3dzIDIwMDAgb3IgU2VydmljZXMgZm9yIFVuaXggVGVsbmV0IGNsaWVudCB5b3UgbXVzdCBzcGVjaWZ5IGEgbGlzdCIsCisiICB3aXRoIE5UTE0gYXMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuICBCeSBkZWZhdWx0LCBOVExNIGlzIHRoZSBsYXN0IiwKKyIgIGl0ZW0gaW4gdGhlIGxpc3QgYmVjYXVzZSBpdCBkb2VzIG5vdCBwcm92aWRlIGFueSBmb3JtIG9mIGRhdGEgZW5jcnlwdGlvbi4iLAorI2VuZGlmIC8qIE5UICovCisiICIsCisjaWZkZWYgQ0tfS0VSQkVST1MKKyJTRVQgVEVMTkVUIEFVVEhFTlRJQ0FUSU9OIEZPUldBUkRJTkcgeyBPTiwgT0ZGIH0iLAorIiAgU2V0IHRoaXMgdG8gT04gdG8gZm9yd2FyZCBLZXJiZXJvcyBWIHRpY2tldC1ncmFudGluZy10aWNrZXRzIHRvIHRoZSBob3N0IiwKKyIgIGFmdGVyIGF1dGhlbnRpY2F0aW9uIGlzIGNvbXBsZXRlLiAgT0ZGIGJ5IGRlZmF1bHQuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworIlNFVCBURUxORVQgQVVUSEVOVElDQVRJT04gRU5DUllQVC1GTEFHIHsgQU5ZLCBOT05FLCBURUxPUFQgfSIsCisiICBVc2UgdGhpcyBjb21tYW5kIHRvIHNwZWNpZnkgd2hpY2ggQVVUSCB0ZWxvcHQgZW5jcnlwdGlvbiBmbGFncyBtYXkgYmUiLAorIiAgYWNjZXB0ZWQgaW4gY2xpZW50IG1vZGUgb3Igb2ZmZXJlZCBpbiBzZXJ2ZXIgbW9kZS4gIFRoZSBkZWZhdWx0IGlzIEFOWS4iLAorIiAiLAorIlNFVCBURUxORVQgQVVUSEVOVElDQVRJT04gSE9XLUZMQUcgeyBBTlksIE9ORS1XQVksIE1VVFVBTCB9IiwKKyIgIFVzZSB0aGlzIGNvbW1hbmQgdG8gc3BlY2lmeSB3aGljaCBBVVRIIHRlbG9wdCBob3cgZmxhZ3MgbWF5IGJlIiwKKyIgIGFjY2VwdGVkIGluIGNsaWVudCBtb2RlIG9yIG9mZmVyZWQgaW4gc2VydmVyIG1vZGUuICBUaGUgZGVmYXVsdCBpcyBBTlkuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENPTU1FTlQKKyJTRVQgVEVMTkVUIEJJTkFSWS1NT0RFIHsgQUNDRVBURUQsIFJFRlVTRUQsIFJFUVVFU1RFRCwgUkVRVUlSRUQgfSIsCisiICBBQ0NFUFQgb3IgUkVGVVNFIGJpbmFyeS1tb2RlIGJpZHMsIG9yIGFjdGl2ZWx5IFJFUVVFU1QgYmluYXJ5IG1vZGUuIiwKKyIgIFJFUVVJUkVEIHJlZnVzZXMgdGhlIGNvbm5lY3Rpb24gaWYgYmluYXJ5IG1vZGUgaXMgbm90IHN1Y2Nlc3NmdWxseSIsCisiICBuZWdvdGlhdGVkIGluIGJvdGggZGlyZWN0aW9ucy4gIEFDQ0VQVEVEIGJ5IGRlZmF1bHQuIiwKKyIgIiwKKyNlbmRpZiAvKiBDT01NRU5UICovCisiU0VUIFRFTE5FVCBCSU5BUlktVFJBTlNGRVItTU9ERSB7IE9OLCBPRkYgfSIsCisiICBXaGVuIE9OIChPRkYgYnkgZGVmYXVsdCkgYW5kIEJJTkFSWSBuZWdvdGlhdGlvbnMgYXJlIG5vdCBSRUZVU0VEIEtlcm1pdCIsCisiICB3aWxsIGF0dGVtcHQgdG8gbmVnb3RpYXRlIEJJTkFSWSBtb2RlIGluIGVhY2ggZGlyZWN0aW9uIGJlZm9yZSB0aGUgc3RhcnQiLAorIiAgb2YgZWFjaCBmaWxlIHRyYW5zZmVyLiAgQWZ0ZXIgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlIEJJTkFSWSBtb2RlIHdpbGwiLAorIiAgYmUgcmVzdG9yZWQgdG8gdGhlIHByZS10cmFuc2ZlciBzdGF0ZS4iLAorIiAiLAorIlNFVCBURUxORVQgQklOQVJZLVRSQU5TRkVSLU1PREUgeyBPTiwgT0ZGIH0iLAorIiAgU2V0IHRoaXMgY29tbWFuZCB0byBPTiBpZiB5b3Ugd2FudCB0byBmb3JjZSBLZXJtaXQgdG8gbmVnb3RpYXRlIiwKKyIgIFRlbG5ldCBCaW5hcnkgaW4gYm90aCBkaXJlY3Rpb25zIHdoZW4gcGVyZm9ybWluZyBmaWxlIHRyYW5zZmVycy4iLAorIiAgRGVmYXVsdCBpcyBPRkYuICBBbGlhcyBTRVQgVEVMTkVUIEJJTkFSWS1YRkVSLU1PREUuIiwKKyIgIiwKKyJTRVQgVEVMTkVUIEJVRyBBVVRILUtSQjUtREVTIHsgT04sIE9GRiB9IiwKKyIgIERlZmF1bHQgaXMgT04uICBEaXNhYmxlIHRoaXMgYnVnIHRvIGVuYWJsZSB0aGUgdXNlIG9mIGVuY3J5cHRpb24gdHlwZXMiLAorIiAgb3RoZXIgdGhhbiBERVMgc3VjaCBhcyAzREVTIG9yIENBU1QtMTI4IHdoZW4gdGhlIEtlcmJlcm9zIDUgc2Vzc2lvbiBrZXkiLAorIiAgaXMgbG9uZ2VyIHRoYW4gOCBieXRlcy4iLAorIiAiLAorIlNFVCBURUxORVQgQlVHIEJJTkFSWS1NRS1NRUFOUy1VLVRPTyB7IE9OLCBPRkYgfSIsCisiICBTZXQgdGhpcyB0byBPTiB0byB0cnkgdG8gb3ZlcmNvbWUgVEVMTkVUIGJpbmFyeS1tb2RlIG1pc25lZ290aWF0aW9ucyBieSIsCisiICBLZXJtaXQncyBURUxORVQgcGFydG5lci4iLAorIiAiLAorIlNFVCBURUxORVQgQlVHIEJJTkFSWS1VLU1FQU5TLU1FLVRPTyB7IE9OLCBPRkYgfSIsCisiICBTZXQgdGhpcyB0byBPTiB0byB0cnkgdG8gb3ZlcmNvbWUgVEVMTkVUIGJpbmFyeS1tb2RlIG1pc25lZ290aWF0aW9ucyBieSIsCisiICBLZXJtaXQncyBURUxORVQgcGFydG5lci4iLAorIiAiLAorIlNFVCBURUxORVQgQlVHIElORklOSVRFLUxPT1AtQ0hFQ0sgeyBPTiwgT0ZGIH0iLAorIiAgU2V0IHRoaXMgdG8gT04gdG8gcHJldmVudCBLZXJtaXQgZnJvbSByZXNwb25kaW5nIHRvIGEgdGVsbmV0IG5lZ290aWF0aW9uIiwKKyIgIHNlcXVlbmNlIHRoYXQgZW50ZXJzIGFuIGluZmluaXRlIGxvb3AuICBUaGUgZGVmYXVsdCBpcyBPRkYgYmVjYXVzZSB0aGlzIiwKKyIgIHNob3VsZCBuZXZlciBvY2N1ci4iLAorIiAiLAorIlNFVCBURUxORVQgQlVHIFNCLUlNUExJRVMtV0lMTC1ETyB7IE9OLCBPRkYgfSIsCisiICBTZXQgdGhpcyB0byBPTiB0byBhbGxvdyBLZXJtaXQgdG8gcmVzcG9uZCB0byB0ZWxuZXQgc3ViLW5lZ290aWF0aW9ucyBpZiIsCisiICB0aGUgcGVlciBmb3JnZXRzIHRvIHJlc3BvbmQgdG8gV0lMTCB3aXRoIERPIG9yIHRvIERPIHdpdGggV0lMTC4iLAorIiAiLAorIlNFVCBURUxORVQgREVCVUcgeyBPTiwgT0ZGIH0iLAorIiAgU2V0IHRoaXMgdG8gT04gdG8gZGlzcGxheSB0ZWxuZXQgbmVnb3RpYXRpb25zIGFzIHRoZXkgYXJlIHNlbnQgYW5kIiwKKyIgIHJlY2VpdmVkLiIsCisiICIsCisiU0VUIFRFTE5FVCBERUxBWS1TQiB7IE9OLCBPRkYgfSIsCisiICBXaGVuIE9OLCB0ZWxuZXQgc3VibmVnb3RpYXRpb24gcmVzcG9uc2VzIGFyZSBkZWxheWVkIHVudGlsIGFmdGVyIGFsbCIsCisiICBhdXRoZW50aWNhdGlvbiBhbmQgZW5jcnlwdGlvbiBvcHRpb25zIGFyZSBlaXRoZXIgc3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZWQiLAorIiAgb3IgcmVmdXNlZC4gVGhpcyBlbnN1cmVzIHRoYXQgcHJpdmF0ZSBkYXRhIGlzIHByb3RlY3RlZC4gIFdoZW4gT0ZGLCB0ZWxuZXQiLAorIiAgc3VibmVnb3RpYXRpb24gcmVzcG9uc2VzIGFyZSBzZW50IGltbWVkaWF0ZWx5LiAgVGhlIGRlZmF1bHQgaXMgT04uIiwKKyIgIiwKKyJTRVQgVEVMTkVUIEVDSE8geyBMT0NBTCwgUkVNT1RFIH0iLAorIiAgS2VybWl0J3MgaW5pdGlhbCBlY2hvaW5nIHN0YXRlIGZvciBURUxORVQgY29ubmVjdGlvbnMsIExPQ0FMIGJ5IGRlZmF1bHQuIiwKKyIgIEFmdGVyIHRoZSBjb25uZWN0aW9uIGlzIG1hZGUsIFRFTE5FVCBuZWdvdGlhdGlvbnMgZGV0ZXJtaW5lIHRoZSBlY2hvaW5nLiIsCisiICIsCisjaWZkZWYgQ0tfRU5DUllQVElPTgorI2lmZGVmIENPTU1FTlQKKyJTRVQgVEVMTkVUIEVOQ1JZUFRJT04geyBBQ0NFUFRFRCwgUkVGVVNFRCwgUkVRVUVTVEVELCBSRVFVSVJFRCB9IiwKKyIgIEFDQ0VQVCBvciBSRUZVU0UgZW5jcnlwdGlvbiBiaWRzLCBvciBhY3RpdmVseSBSRVFVRVNUIGVuY3J5cHRpb24gaW4gYm90aC4iLAorIiAgZGlyZWN0aW9ucy4gIFJFUVVJUkVEIHJlZnVzZXMgdGhlIGNvbm5lY3Rpb24gaWYgZW5jcnlwdGlvbiBpcyBub3QiLAorIiAgc3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZWQgaW4gYm90aCBkaXJlY3Rpb25zLiAgQUNDRVBURUQgYnkgZGVmYXVsdC4iLAorIiAiLAorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyJTRVQgVEVMTkVUIEVOQ1JZUFRJT04gVFlQRSB7IEFVVE9NQVRJQywgQ0FTVDEyOF9DRkI2NCwgQ0FTVDEyOF9PRkI2NCwgIiwKKyIgIENBU1Q1XzQwX0NGQjY0LCBDQVNUNV80MF9PRkI2NCwgREVTX0NGQjY0LCBERVNfT0ZCNjQsIE5PTkUgfSIsCisiICBBVVRPTUFUSUMgYWxsb3dzIHRoZSBob3N0IHRvIGNob29zZSB0aGUgcHJlZmVycmVkIHR5cGUgb2YgZW5jcnlwdGlvbi4iLAorIiAgT3RoZXIgdmFsdWVzIGFsbG93IGEgc3BlY2lmaWMgZW5jcnlwdGlvbiBtZXRob2QgdG8gYmUgc3BlY2lmaWVkLiIsCisiICBBVVRPTUFUSUMgaXMgdGhlIGRlZmF1bHQuICBUaGUgbGlzdCBvZiBvcHRpb25zIHdpbGwgdmFyeSBkZXBlbmRpbmciLAorIiAgb24gdGhlIGVuY3J5cHRpb24gdHlwZXMgc2VsZWN0ZWQgYXQgY29tcGlsYXRpb24gdGltZS4iLAorIiAiLAorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNpZmRlZiBDS19FTlZJUk9OTUVOVAorI2lmZGVmIENPTU1FTlQKKyJTRVQgVEVMTkVUIEVOVklST05NRU5UIHsgT04sIE9GRiwgdmFyaWFibGUtbmFtZSBbIHZhbHVlIF0gfSIsCisiICBUaGlzIGZlYXR1cmUgbGV0cyBLZXJtaXQgc2VuZCB0aGUgdmFsdWVzIG9mIGNlcnRhaW4gZW52aXJvbm1lbnQgdmFyaWFibGVzIiwKKyIgIHRvIHRoZSBvdGhlciBjb21wdXRlciBpZiBpdCBhc2tzIGZvciB0aGVtLiAgVGhlIHZhcmlhYmxlLW5hbWUgY2FuIGJlIGFueSIsCisiICBvZiB0aGUgXCJ3ZWxsLWtub3duXCIgdmFyaWFibGVzIFwiVVNFUlwiLCBcIkpPQlwiLCBcIkFDQ1RcIiwgXCJQUklOVEVSXCIsIiwKKyIgIFwiU1lTVEVNVFlQRVwiLCBvciBcIkRJU1BMQVlcIi4gIFNvbWUgVGVsbmV0IHNlcnZlcnMsIGlmIGdpdmVuIGEgVVNFUiIsCisiICB2YWx1ZSBpbiB0aGlzIHdheSwgd2lsbCBhY2NlcHQgaXQgYW5kIHRoZXJlZm9yZSBub3QgcHJvbXB0IHlvdSBmb3IgdXNlciIsCisiICBuYW1lIHdoZW4geW91IGxvZyBpbi4gIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgdGFrZW4gZnJvbSB5b3VyIGVudmlyb25tZW50OyIsCisiICB1c2UgdGhpcyBjb21tYW5kIHRvIGNoYW5nZSBvciByZW1vdmUgdGhlbS4gIFNlZSBSRkMxNTcyIGZvciBkZXRhaWxzLiAgWW91IiwKKyIgIG1heSBhbHNvIHNwZWNpZnkgT0ZGIHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLCBhbmQgT04gdG8gcmUtZW5hYmxlIGl0LiIsCisiICIsCisjZWxzZQorIlNFVCBURUxORVQgRU5WSVJPTk1FTlQgeyB2YXJpYWJsZS1uYW1lIFsgdmFsdWUgXSB9IiwKKyIgIFRoaXMgZmVhdHVyZSBsZXRzIEtlcm1pdCBzZW5kIHRoZSB2YWx1ZXMgb2YgY2VydGFpbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMiLAorIiAgdG8gdGhlIG90aGVyIGNvbXB1dGVyIGlmIGl0IGFza3MgZm9yIHRoZW0uICBUaGUgdmFyaWFibGUtbmFtZSBjYW4gYmUgYW55IiwKKyIgIG9mIHRoZSBcIndlbGwta25vd25cIiB2YXJpYWJsZXMgXCJVU0VSXCIsIFwiSk9CXCIsIFwiQUNDVFwiLCBcIlBSSU5URVJcIiwiLAorIiAgXCJTWVNURU1UWVBFXCIsIG9yIFwiRElTUExBWVwiLiAgU29tZSBUZWxuZXQgc2VydmVycywgaWYgZ2l2ZW4gYSBVU0VSIiwKKyIgIHZhbHVlIGluIHRoaXMgd2F5LCB3aWxsIGFjY2VwdCBpdCBhbmQgdGhlcmVmb3JlIG5vdCBwcm9tcHQgeW91IGZvciB1c2VyIiwKKyIgIG5hbWUgd2hlbiB5b3UgbG9nIGluLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSB0YWtlbiBmcm9tIHlvdXIgZW52aXJvbm1lbnQ7IiwKKyIgIHVzZSB0aGlzIGNvbW1hbmQgdG8gY2hhbmdlIG9yIHJlbW92ZSB0aGVtLiAgU2VlIFJGQzE1NzIgZm9yIGRldGFpbHMuIiwKKyIgIiwKKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogQ0tfRU5WSVJPTk1FTlQgKi8KKyNpZmRlZiBDS19GT1JXQVJEX1gKKyJTRVQgVEVMTkVUIEZPUldBUkQtWCBYQVVUSE9SSVRZLUZJTEUgPGZpbGU+IiwKKyIgIElmIHlvdXIgWCBTZXJ2ZXIgcmVxdWlyZXMgWCBhdXRoZW50aWNhdGlvbiBhbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSIsCisiICAuWGF1dGhvcml0eSBmaWxlIGlzIG5vdCBkZWZpbmVkIGJ5IHRoZSBYQVVUSE9SSVRZIGVudmlyb25tZW50IHZhcmlhYmxlLCIsCisiICB1c2UgdGhpcyBjb21tYW5kIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSAuWGF1dGhvcml0eSBmaWxlLiIKKyIgICIsCisjZW5kaWYgLyogQ0tfRk9SV0FSRF9YICovCisjaWZkZWYgQ0tfU05ETE9DCisiU0VUIFRFTE5FVCBMT0NBVElPTiBbIHRleHQgXSIsCisiICBMb2NhdGlvbiBzdHJpbmcgdG8gc2VuZCB0byB0aGUgVGVsbmV0IHNlcnZlciBpZiBpdCBhc2tzLiAgQnkgZGVmYXVsdCB0aGlzIiwKKyIgIGlzIHBpY2tlZCB1cCBmcm9tIHRoZSBMT0NBVElPTiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEdpdmUgdGhpcyBjb21tYW5kIiwKKyIgIHdpdGggbm8gdGV4dCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4iLAorIiAiLAorI2VuZGlmIC8qIENLX1NORExPQyAqLworIlNFVCBURUxORVQgTkVXTElORS1NT0RFIHsgTlZULCBCSU5BUlktTU9ERSB9IHsgT0ZGLCBPTiwgUkFXIH0iLAorCisiICBEZXRlcm1pbmVzIGhvdyBjYXJyaWFnZSByZXR1cm5zIGFyZSBoYW5kbGVkIG9uIFRFTE5FVCBjb25uZWN0aW9ucy4gIFRoZXJlIiwKKyIgIGFyZSBzZXBhcmF0ZSBzZXR0aW5ncyBmb3IgTlZUIChBU0NJSSkgbW9kZSBhbmQgYmluYXJ5IG1vZGUuICBPTiAoZGVmYXVsdCIsCisiICBmb3IgTlZUIG1vZGUpIG1lYW5zIENSTEYgcmVwcmVzZW50cyBDUi4gIE9GRiBtZWFucyBDUiBmb2xsb3dlZCBieSBOVUwiLAorIiAgcmVwcmVzZW50cyBDUi4gIFJBVyAoZGVmYXVsdCBmb3IgQklOQVJZIG1vZGUpIG1lYW5zIENSIHN0YW5kcyBmb3IgaXRzZWxmLiIsCisiICIsCisjaWZkZWYgVENQU09DS0VUCisiU0VUIFRFTE5FVCBQUk9NUFQtRk9SLVVTRVJJRCA8cHJvbXB0PiIsCisiICBTcGVjaWZpZXMgYSBjdXN0b20gcHJvbXB0IHRvIGJlIHVzZWQgd2hlbiBwcm9tcHRpbmcgZm9yIGEgdXNlcmlkLiAgS2VybWl0IiwKKyIgIHByb21wdHMgZm9yIGEgdXNlcmlkIGlmIHRoZSBjb21tYW5kOiIsCisiICIsCisiICAgIFNFVCBMT0dJTiBVU0VSSUQge30iLAorIiAiLAorIiAgaGFzIGJlZW4gaXNzdWVkIHByaW9yIHRvIGEgVGVsbmV0IGF1dGhlbnRpY2F0aW9uIG5lZ290aWF0aW9uIGZvciBhbiIsCisiICBhdXRoZW50aWNhdGlvbiB0eXBlIHRoYXQgcmVxdWlyZXMgdGhlIHRyYW5zbWlzc2lvbiBvZiBhIG5hbWUsIHN1Y2ggYXMiLAorIiAgU2VjdXJlIFJlbW90ZSBQYXNzd29yZC4iLAorIiAiLAorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworIlNFVCBURUxORVQgUkVNT1RFLUVDSE8geyBPTiwgT0ZGIH0iLAorIiAgQXBwbGllcyBvbmx5IHRvIGluY29taW5nIGNvbm5lY3Rpb25zIGNyZWF0ZWQgd2l0aDoiLAorIiAgICBTRVQgSE9TVCAqIDxwb3J0PiAvVEVMTkVUIiwKKyIgIFRoaXMgY29tbWFuZCBkZXRlcm1pbmVzIHdoZXRoZXIgS2VybWl0IHdpbGwgYWN0dWFsbHkgZWNobyBjaGFyYWN0ZXJzIiwKKyIgIHJlY2VpdmVkIGZyb20gdGhlIHJlbW90ZSB3aGVuIGl0IGhhcyBuZWdvdGlhdGVkIHRvIGRvIHNvLiAgVGhlIGRlZmF1bHQiLAorIiAgaXMgT04uICBSZW1vdGUgZWNob2luZyBtYXkgYmUgdHVybmVkIG9mZiB3aGVuIGl0IGlzIG5lY2Vzc2FyeSB0byByZWFkIiwKKyIgIGEgcGFzc3dvcmQgd2l0aCB0aGUgSU5QVVQgY29tbWFuZC4iLAorIiAiLAorIlNFVCBURUxORVQgVEVSTUlOQUwtVFlQRSBuYW1lIiwKKyIgIFRoZSB0ZXJtaW5hbCB0eXBlIHRvIHNlbmQgdG8gdGhlIHJlbW90ZSBURUxORVQgaG9zdC4gIElmIG5vbmUgaXMgZ2l2ZW4sIiwKKyNpZmRlZiBPUzIKKyIgIHlvdXIgY3VycmVudCBTRVQgVEVSTUlOQUwgVFlQRSB2YWx1ZSBpcyBzZW50LCBlLmcuIFZUMjIwLiIsCisiICIsCisjZWxzZQorIiAgeW91ciBsb2NhbCB0ZXJtaW5hbCB0eXBlIGlzIHNlbnQuIiwKKyIgIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyJTRVQgVEVMTkVUIFdBSVQtRk9SLU5FR09USUFUSU9OUyB7IE9OLCBPRkYgfSIsCisiICBFYWNoIFRlbG5ldCBvcHRpb24gbXVzdCBiZSBmdWxseSBuZWdvdGlhdGVkIGVpdGhlciBPbiBvciBPZmYgYmVmb3JlIHRoZSIsCisiICBzZXNzaW9uIGNhbiBjb250aW51ZS4gIFRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIHdpdGggb3B0aW9ucyB0aGF0IHJlcXVpcmUiLAorIiAgc3VibmVnb3RpYXRpb25zIHN1Y2ggYXMgQXV0aGVudGljYXRpb24sIEVuY3J5cHRpb24sIGFuZCBLZXJtaXQ7IGZvciIsCisiICBwcm9wZXIgc3VwcG9ydCBvZiB0aGVzZSBvcHRpb25zIEtlcm1pdCBtdXN0IHdhaXQgZm9yIHRoZSBuZWdvdGlhdGlvbnMgdG8iLAorIiAgY29tcGxldGUuICBPZiBjb3Vyc2UsIEtlcm1pdCBoYXMgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciBhIHJlcGx5IGlzIiwKKyIgIGRlbGF5ZWQgb3Igbm90IGNvbWluZyBhdCBhbGwsIGFuZCBzbyB3aWxsIHdhaXQgYSBtaW51dGUgb3IgbW9yZSBmb3IiLAorIiAgcmVxdWlyZWQgcmVwbGllcyBiZWZvcmUgY29udGludWluZyB0aGUgc2Vzc2lvbi4gIElmIHlvdSBrbm93IHRoYXQgS2VybWl0J3MiLAorIiAgVGVsbmV0IHBhcnRuZXIgd2lsbCBub3QgYmUgc2VuZGluZyB0aGUgcmVxdWlyZWQgcmVwbGllcywgeW91IGNhbiBzZXQgdGhpcyIsCisiICBvcHRpb24gb2YgT0ZGIHRvIGF2b2lkIHRoZSBsb25nIHRpbWVvdXRzLiAgT3IgeW91IGNhbiBpbnN0cnVjdCBLZXJtaXQgdG8iLAorIiAgUkVGVVNFIHNwZWNpZmljIG9wdGlvbnMgd2l0aCB0aGUgU0VUIFRFTE9QVCBjb21tYW5kLiIsCisiIiwKKyJUeXBlIFNIT1cgVEVMTkVUIHRvIHNlZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlc2UgcGFyYW1ldGVycy4iLAorIiIgfTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKworI2lmbmRlZiBOT1NQTAorc3RhdGljIGNoYXIgKmh4eW1hY3JbXSA9IHsKKyJTeW50YXg6IFNFVCBNQUNSTyBwYXJhbWV0ZXIgdmFsdWUiLAorIiAgQ29udHJvbHMgdGhlIGJlaGF2aW9yIG9mIG1hY3Jvcy4iLAorIiAiLAorIlNFVCBNQUNSTyBFQ0hPIHsgT04sIE9GRiB9IiwKKyIgIFRlbGxzIHdoZXRoZXIgY29tbWFuZHMgZXhlY3V0ZWQgZnJvbSBhIG1hY3JvIGRlZmluaXRpb24gc2hvdWxkIGJlIiwKKyIgIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuLiAgT0ZGIGJ5IGRlZmF1bHQ7IHVzZSBPTiBmb3IgZGVidWdnaW5nLiIsCisiICIsCisiU0VUIE1BQ1JPIEVSUk9SIHsgT04sIE9GRiB9IiwKKyIgIFRlbGxzIHdoZXRoZXIgYSBtYWNybyBzaG91bGQgYmUgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkIHVwb24gYSBjb21tYW5kIiwKKyIgIGVycm9yLiAgVGhpcyBzZXR0aW5nIGlzIGxvY2FsIHRvIHRoZSBjdXJyZW50IG1hY3JvLCBhbmQgaW5oZXJpdGVkIGJ5IiwKKyIgIHN1Ym9yZGluYXRlIG1hY3Jvcy4iLAorIiIgfTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCitzdGF0aWMgY2hhciAqaG14eXBybVtdID0geworIlN5bnRheDogU0VUIFBST01QVCBbIHRleHQgXSIsCisiICIsCisjaWZkZWYgT1MyCisiUHJvbXB0IHRleHQgZm9yIHRoaXMgcHJvZ3JhbSwgbm9ybWFsbHkgJ0stOTU+Jy4gIE1heSBjb250YWluIGJhY2tzbGFzaCIsCisjZWxzZQorI2lmZGVmIE1BQworIlByb21wdCB0ZXh0IGZvciB0aGlzIHByb2dyYW0sIG5vcm1hbGx5ICdNYWMtS2VybWl0PicuICBNYXkgY29udGFpbiBiYWNrc2xhc2giLAorI2Vsc2UKKyJQcm9tcHQgdGV4dCBmb3IgdGhpcyBwcm9ncmFtLCBub3JtYWxseSAnQy1LZXJtaXQ+Jy4gIE1heSBjb250YWluIGJhY2tzbGFzaCIsCisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogT1MyICovCisiY29kZXMgZm9yIHNwZWNpYWwgZWZmZWN0cy4gIFN1cnJvdW5kIGJ5IHsgfSB0byBwcmVzZXJ2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIiwKKyNpZmRlZiBPUzIKKyJzcGFjZXMuICBJZiB0ZXh0IG9taXR0ZWQsIHByb21wdCByZXZlcnRzIHRvIEstOTU+LiAgUHJvbXB0IGNhbiBpbmNsdWRlIiwKKyNlbHNlCisjaWZkZWYgTUFDCisic3BhY2VzLiAgSWYgdGV4dCBvbWl0dGVkLCBwcm9tcHQgcmV2ZXJ0cyB0byBNYWMtS2VybWl0Pi4gIFByb21wdCBjYW4gaW5jbHVkZSIsCisjZWxzZQorInNwYWNlcy4gIElmIHRleHQgb21pdHRlZCwgcHJvbXB0IHJldmVydHMgdG8gQy1LZXJtaXQ+LiAgUHJvbXB0IGNhbiBpbmNsdWRlIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyJ2YXJpYWJsZXMgbGlrZSBcXHYoZGlyKSBvciBcXHYodGltZSkgdG8gc2hvdyBjdXJyZW50IGRpcmVjdG9yeSBvciB0aW1lLiIsCisiIiB9OworCisjaWZkZWYgVU5JWAorc3RhdGljIGNoYXIgKmh4eXdpbGRbXSA9IHsKKyJTeW50YXg6IFNFVCBXSUxEQ0FSRC1FWFBBTlNJT04geyBLRVJNSVQgWyBzd2l0Y2ggXSwgU0hFTEwgfSIsCisiICBLRVJNSVQgKHRoZSBkZWZhdWx0KSBtZWFucyBDLUtlcm1pdCBleHBhbmRzIGZpbGVuYW1lIHdpbGRjYXJkcyBpbiBTRU5EIGFuZCIsCisiICBzaW1pbGFyIGNvbW1hbmRzIGl0c2VsZiwgYW5kIGluIGluY29taW5nIEdFVCBjb21tYW5kcy4gIE9wdGlvbmFsIHN3aXRjaGVzIiwKKyIgIGFyZSAvTk8tTUFUQ0gtRE9ULUZJTEVTIChcIipcIiBhbmQgXCI/XCIgc2hvdWxkIG5vdCBtYXRjaCBpbiBpbml0aWFsIiwKKyIgIHBlcmlvZCBpbiBhIGZpbGVuYW1lOyB0aGlzIGlzIHRoZSBkZWZhdWx0KSBhbmQgL01BVENILURPVC1GSUxFUyBpZiB5b3UiLAorIiAgd2FudCBmaWxlcyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIFwiLlwiIGluY2x1ZGVkLiAgU0VUIFdJTERDQVJEIFNIRUxMIiwKKyIgIG1lYW5zIHRoYXQgS2VybWl0IGFza3MgeW91ciBwcmVmZXJyZWQgc2hlbGwgdG8gZXhwYW5kIHdpbGRjYXJkcyAodGhpcyIsCisiICBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSBpbiBDLUtlcm1pdCA3LjAgYW5kIGxhdGVyKS4gIEhFTFAgV0lMRENBUkQgZm9yIiwKKyIgIGZ1cnRoZXIgaW5mb3JtYXRpb24uIiwKKyIiIH07CisjZW5kaWYgLyogVU5JWCAqLworCisjaWZuZGVmIE5PWEZFUgorc3RhdGljIGNoYXIgKmh4eXdpbmRbXSA9IHsKKyJTeW50YXg6IFNFVCBXSU5ET1ctU0laRSBudW1iZXIiLAorIiAgU3BlY2lmaWVzIG51bWJlciBvZiBzbG90cyBmb3Igc2xpZGluZyB3aW5kb3dzLCBpLmUuIHRoZSBudW1iZXIgb2YgcGFja2V0cyIsCisiICB0aGF0IGNhbiBiZSB0cmFuc21pdHRlZCBiZWZvcmUgd2FpdGluZyBmb3IgYWNrbm93bGVkZ2VtZW50LiAgVGhlIGRlZmF1bHQiLAorI2lmZGVmIFhZWl9JTlRFUk5BTAorIiAgZm9yIEtlcm1pdCBwcm90b2NvbCBpcyBvbmUsIHRoZSBtYXhpbXVtIGlzIDMyOyBmb3IgWk1PREVNLCB0aGUgZGVmYXVsdCIsCisiICBpcyBubyB3aW5kb3dpbmcgKDApLiAgRm9yIFpNT0RFTSwgdGhlIHdpbmRvdyBzaXplIGlzIHJlYWxseSB0aGUgcGFja2V0IiwKKyIgIGxlbmd0aCwgYW5kIGlzIHVzZWQgb25seSB3aGVuIG5vbi13aW5kb3dlZCAoc3RyZWFtaW5nKSB0cmFuc2ZlcnMgZmFpbDsgdGhlIiwKKyIgIFpNT0RFTSB3aW5kb3cgc2l6ZSBzaG91bGQgYmUgYSBsYXJnaXNoIG51bWJlciwgbGlrZSAxMDI0LCBhbmQgaXQgc2hvdWxkIGJlIiwKKyIgIGEgbXVsdGlwbGUgb2YgNjQuIiwKKyNlbHNlCisiICBpcyBvbmUsIHRoZSBtYXhpbXVtIGlzIDMyLiAgSW5jcmVhc2VkIHdpbmRvdyBzaXplIG1pZ2h0IHJlc3VsdCBpbiByZWR1Y2VkIiwKKyIgIG1heGltdW0gcGFja2V0IGxlbmd0aC4gIFVzZSBzbGlkaW5nIHdpbmRvd3MgZm9yIGltcHJvdmVkIGVmZmljaWVuY3kgb24iLAorIiAgY29ubmVjdGlvbnMgd2l0aCBsb25nIGRlbGF5cy4gIEEgZnVsbCBkdXBsZXggY29ubmVjdGlvbiBpcyByZXF1aXJlZCwgYXMiLAorIiAgd2VsbCBhcyBhIGNvb3BlcmF0aW5nIEtlcm1pdCBvbiB0aGUgb3RoZXIgZW5kLiIsCisjZW5kaWYgLyogWFlaX0lOVEVSTkFMICovCisiIiB9OworCitzdGF0aWMgY2hhciAqaHh5cnB0W10gPSB7CisiU3ludGF4OiBTRVQgUkVQRUFUIHsgQ09VTlRTIHsgT04sIE9GRiB9LCBQUkVGSVggPGNvZGU+IH0iLAorIiAgU0VUIFJFUEVBVCBDT1VOVFMgdHVybnMgdGhlIHJlcGVhdC1jb3VudCBjb21wcmVzc2lvbiBtZWNoYW5pc20gT04gYW5kIE9GRi4iLAorIiAgVGhlIGRlZmF1bHQgaXMgT04uICBTRVQgUkVQRUFUIFBSRUZJWCA8Y29kZT4gc2V0cyB0aGUgcmVwZWF0LWNvdW50IHByZWZpeCIsCisiICBjaGFyYWN0ZXIgdG8gdGhlIGdpdmVuIGNvZGUuICBUaGUgZGVmYXVsdCBpcyAxMjYgKHRpbGRlKS4iLAorIiIgfTsKKworc3RhdGljIGNoYXIgKmh4eXJjdltdID0geworIlN5bnRheDogU0VUIFJFQ0VJVkUgcGFyYW1ldGVyIHZhbHVlIiwKKyIgIFNwZWNpZmllcyBwYXJhbWV0ZXJzIGZvciBpbmJvdW5kIHBhY2tldHM6IiwKKyIgIiwKKyNpZm5kZWYgTk9DU0VUUworIlNFVCBSRUNFSVZFIENIQVJBQ1RFUi1TRVQgeyBBVVRPTUFUSUMsIE1BTlVBTCB9IiwKKyIgIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzd2l0Y2ggdG8gYW4gYXBwcm9wcmlhdGUgZmlsZS1jaGFyYWN0ZXIgc2V0IGJhc2VkIiwKKyIgIG9uIHRoZSB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IGFubm91bmNlciwgaWYgYW55LCBvZiBhbiBpbmNvbWluZyB0ZXh0IGZpbGUuIiwKKyIgIEFVVE9NQVRJQyBieSBkZWZhdWx0LiAgQWxzbyBzZWUgSEVMUCBBU1NPQ0lBVEUuIiwKKyIgIiwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisiU0VUIFJFQ0VJVkUgQ09OVFJPTC1QUkVGSVggbnVtYmVyIiwKKyIgIEFTQ0lJIHZhbHVlIG9mIHByZWZpeCBjaGFyYWN0ZXIgdXNlZCBmb3IgcXVvdGluZyBjb250cm9sIGNoYXJhY3RlcnMgaW4iLAorIiAgcGFja2V0cyB0aGF0IEtlcm1pdCByZWNlaXZlcywgbm9ybWFsbHkgMzUgKG51bWJlciBzaWduKS4gIERvbid0IGNoYW5nZSIsCisiICB0aGlzIHVubGVzcyBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgb3RoZXIgS2VybWl0IHByb2dyYW0uIiwKKyIgIiwKKyJTRVQgUkVDRUlWRSBFTkQtT0YtUEFDS0VUIG51bWJlciIsCisiICBBU0NJSSB2YWx1ZSBvZiBjb250cm9sIGNoYXJhY3RlciB0aGF0IHRlcm1pbmF0ZXMgaW5jb21pbmcgcGFja2V0cywiLAorIiAgbm9ybWFsbHkgMTMgKGNhcnJpYWdlIHJldHVybikuIiwKKyIgIiwKKyNpZmRlZiBDS1hYQ0hBUgorIlNFVCBSRUNFSVZFIElHTk9SRS1DSEFSQUNURVIgbnVtYmVyIiwKKyIgIEFTQ0lJIHZhbHVlIG9mIGNoYXJhY3RlciB0byBiZSBkaXNjYXJkZWQgd2hlbiByZWNlaXZpbmcgcGFja2V0cywgc3VjaCBhcyIsCisiICBsaW5lIGZvbGRpbmcgY2hhcmFjdGVycy4iLAorIiAiLAorI2VuZGlmIC8qIENLWFhDSEFSICovCisiU0VUIFJFQ0VJVkUgTU9WRS1UTyBbIGRpcmVjdG9yeSBdIiwKKyIgIElmIGEgZGlyZWN0b3J5IG5hbWUgaXMgc3BlY2lmaWVkLCB0aGVuIGV2ZXJ5IGZpbGUgdGhhdCBpcyByZWNlaXZlZCIsCisiICBzdWNjZXNzZnVsbHkgaXMgbW92ZWQgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeSBpbW1lZGlhdGVseSBhZnRlciByZWNlcHRpb24iLAorIiAgaXMgY29tcGxldGUuICBPbWl0IHRoZSBkaXJlY3RvcnkgbmFtZSB0byByZW1vdmUgYW55IHByZXZpb3VzbHkgc2V0IG1vdmUtdG8iLAorIiAgZGlyZWN0b3J5LiIsCisiICIsCisiU0VUIFJFQ0VJVkUgUEFDS0VULUxFTkdUSCBudW1iZXIiLAorIiAgTWF4aW11bSBsZW5ndGggcGFja2V0IHRoZSBvdGhlciBLZXJtaXQgc2hvdWxkIHNlbmQuIiwKKyIgIiwKKyJTRVQgUkVDRUlWRSBQQURESU5HIG51bWJlciIsCisiICBOdW1iZXIgb2YgcHJlcGFja2V0IHBhZGRpbmcgY2hhcmFjdGVycyB0byBhc2sgZm9yIChub3JtYWxseSAwKS4iLAorIiAiLAorIlNFVCBSRUNFSVZFIFBBRC1DSEFSQUNURVIgbnVtYmVyIiwKKyIgIEFTQ0lJIHZhbHVlIG9mIGNvbnRyb2wgY2hhcmFjdGVyIHRvIHVzZSBmb3IgcGFkZGluZyAobm9ybWFsbHkgMCkuIiwKKyIgIiwKKyJTRVQgUkVDRUlWRSBQQVRITkFNRVMge09GRiwgQUJTT0xVVEUsIFJFTEFUSVZFLCBBVVRPfSIsCisiICBJZiBhIHJlY29nbml6YWJsZSBwYXRoIChkaXJlY3RvcnksIGRldmljZSkgc3BlY2lmaWNhdGlvbiBhcHBlYXJzIGluIGFuIiwKKyIgIGluY29taW5nIGZpbGVuYW1lLCBzdHJpcCBpdCBPRkYgYmVmb3JlIHRyeWluZyB0byBjcmVhdGUgdGhlIG91dHB1dCBmaWxlLiIsCisjaWZkZWYgQ0tfTUtESVIKKyIgIE90aGVyd2lzZSwgdGhlbiBpZiBhbnkgb2YgdGhlIGRpcmVjdG9yaWVzIGluIHRoZSBwYXRoIGRvbid0IGV4aXN0LCBLZXJtaXQiLAorIiAgdHJpZXMgdG8gY3JlYXRlIHRoZW0sIHJlbGF0aXZlIHRvIHlvdXIgY3VycmVudCBvciBkb3dubG9hZCBkaXJlY3RvcnksIG9yIiwKKyIgIGFic29sdXRlbHksIGFzIHNwZWNpZmllZC4gIFJFTEFUSVZFIG1lYW5zIGZvcmNlIGFsbCBpbmNvbWluZyBuYW1lcywgZXZlbiIsCisiICBpZiB0aGV5IGFyZSBhYnNvbHV0ZSwgdG8gYmUgcmVsYXRpdmUgdG8geW91ciBjdXJyZW50IG9yIGRvd25sb2FkIGRpcmVjdG9yeS4iCissCisiICBBVVRPLCB3aGljaCBpcyB0aGUgZGVmYXVsdCwgbWVhbnMgUkVMQVRJVkUgaWYgdGhlIGZpbGUgc2VuZGVyIGluZGljYXRlcyBpbiIsCisiICBhZHZhbmNlIHRoYXQgdGhpcyBpcyBhIHJlY3Vyc2l2ZSB0cmFuc2Zlciwgb3RoZXJ3aXNlIE9GRi4iLAorI2VuZGlmIC8qIENLX01LRElSICovCisiICIsCisiU0VUIFJFQ0VJVkUgUEFVU0UgbnVtYmVyIiwKKyIgIE1pbGxpc2Vjb25kcyB0byBwYXVzZSBiZXR3ZWVuIHBhY2tldHMsIG5vcm1hbGx5IDAuIiwKKyIgIiwKKworI2lmZGVmIENLX1BFUk1TCisiU0VUIFJFQ0VJVkUgUEVSTUlTU0lPTlMgeyBPTiwgT0ZGIH0iLAorIiAgV2hldGhlciB0byBjb3B5IGZpbGUgcGVybWlzc2lvbnMgZnJvbSBpbmJvdW5kIEF0dHJpYnV0ZSBwYWNrZXRzLiIsCisiICIsCisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKworIlNFVCBSRUNFSVZFIFJFTkFNRS1UTyBbIHRlbXBsYXRlIF0iLAorIiAgSWYgYSB0ZW1wbGF0ZSBpcyBzcGVjaWZpZWQsIHRoZW4gZXZlcnkgZmlsZSB0aGF0IGlzIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseSIsCisiICBcCitpcyByZW5hbWVkIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gdGVtcGxhdGUgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgcmVjZWl2ZWQuIiwKKyIgIFwKK1RoZSB0ZW1wbGF0ZSBzaG91bGQgaW5jbHVkZSB2YXJpYWJsZXMgbGlrZSBcXHYoZmlsZW5hbWUpIG9yIFxcdihmaWxlbnVtYmVyKS4iLAorIiAgT21pdCB0aGUgdGVtcGxhdGUgdG8gcmVtb3ZlIGFueSB0ZW1wbGF0ZSBwcmV2aW91c2x5IHNldC4iLAorIiAiLAorIlNFVCBSRUNFSVZFIFNUQVJULU9GLVBBQ0tFVCBudW1iZXIiLAorIiAgQVNDSUkgdmFsdWUgb2YgY2hhcmFjdGVyIHRoYXQgbWFya3Mgc3RhcnQgb2YgaW5ib3VuZCBwYWNrZXQuIiwKKyIgIiwKKyJTRVQgUkVDRUlWRSBUSU1FT1VUIG51bWJlciIsCisiICBOdW1iZXIgb2Ygc2Vjb25kcyB0aGUgb3RoZXIgS2VybWl0IHNob3VsZCB3YWl0IGZvciBhIHBhY2tldCBiZWZvcmUgc2VuZGluZyIsCisiICBhIE5BSyBvciByZXRyYW5zbWl0dGluZy4iLAorI2lmZGVmIFZNUworIiAiLAorIlNFVCBSRUNFSVZFIFZFUlNJT04tTlVNQkVSUyB7IE9OLCBPRkYgfSIsCisiICBJZiBPTiwgYW5kIGluIGluY29taW5nIGZpbGVuYW1lIGluY2x1ZGVzIGEgVk1TIHZlcnNpb24gbnVtYmVyLCB1c2UgaXQgd2hlbiIsCisiICBjcmVhdGluZyB0aGUgZmlsZS4gIElmIE9GRiAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLCBzdHJpcCBhbnkgVk1TIHZlcnNpb24iLAorIiAgbnVtYmVyIGZyb20gaW5jb21pbmcgZmlsZW5hbWVzIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGNyZWF0ZSB0aGUgZmlsZSwgXAorY2F1c2luZyIsCisiICB0aGUgbmV3IGZpbGUgdG8gcmVjZWl2ZSB0aGUgbmV4dCBoaWdoZXN0IHZlcnNpb24gbnVtYmVyLiIsCisjZW5kaWYgLyogVk1TICovCisiIiB9OworCitzdGF0aWMgY2hhciAqaHh5c25kW10gPSB7CisiU3ludGF4OiBTRVQgU0VORCBwYXJhbWV0ZXIgdmFsdWUiLAorIiAgU3BlY2lmaWVzIHBhcmFtZXRlcnMgZm9yIG91dGJvdW5kIGZpbGVzIG9yIHBhY2tldHMuIiwKKyIgIiwKKyJTRVQgU0VORCBCQUNLVVAgeyBPTiwgT0ZGIH0iLAorIiAgVGVsbHMgd2hldGhlciB0byBpbmNsdWRlIGJhY2t1cCBmaWxlcyB3aGVuIHNlbmRpbmcgZmlsZSBncm91cHMuICBCYWNrdXAiLAorIiAgZmlsZXMgYXJlIHRob3NlIGNyZWF0ZWQgYnkgS2VybWl0LCBFTUFDUywgZXRjLCB3aGVuIGNyZWF0aW5nIGEgbmV3IGZpbGUiLAorIiAgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhbiBleGlzdGluZyBmaWxlLiAgQSBiYWNrdXAgZmlsZSBoYXMgYSB2ZXJzaW9uIiwKKyIgIGFwcGVuZGVkIHRvIGl0cyBuYW1lLCBlLmcuIG9vZmEudHh0Ln4yM34uICBPTiBpcyB0aGUgZGVmYXVsdCwgbWVhbmluZyIsCisiICBkb24ndCBleGNsdWRlIGJhY2t1cCBmaWxlcy4gIFVzZSBPRkYgdG8gZXhjbHVkZSBiYWNrdXAgZmlsZXMgZnJvbSBncm91cCIsCisiICB0cmFuc2ZlcnMuIiwKKyIgIiwKKyNpZm5kZWYgTk9DU0VUUworIlNFVCBTRU5EIENIQVJBQ1RFUi1TRVQgeyBBVVRPTUFUSUMsIE1BTlVBTCB9IiwKKyIgIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzd2l0Y2ggdG8gYW4gYXBwcm9wcmlhdGUgZmlsZS1jaGFyYWN0ZXIgd2hlbiBhIiwKKyIgIFNFVCBUUkFOU0ZFUiBDSEFSQUNURVItU0VUIGNvbW1hbmQgaXMgZ2l2ZW4sIG9yIHZpY2UgdmVyc2EuICBBVVRPTUFUSUMgYnkiLAorIiAgZGVmYXVsdC4gIEFsc28gc2VlIEhFTFAgQVNTT0NJQVRFLiIsCisiICIsCisjZW5kaWYgLyogTk9DU0VUUyAqLworCisiU0VUIFNFTkQgQ09OVFJPTC1QUkVGSVggbnVtYmVyIiwKKyIgIEFTQ0lJIHZhbHVlIG9mIHByZWZpeCBjaGFyYWN0ZXIgdXNlZCBmb3IgcXVvdGluZyBjb250cm9sIGNoYXJhY3RlcnMgaW4iLAorIiAgcGFja2V0cyB0aGF0IEtlcm1pdCBzZW5kcywgbm9ybWFsbHkgMzUgKG51bWJlciBzaWduKS4iLAorIiAiLAorI2lmZGVmIENLWFhDSEFSCisiU0VUIFNFTkQgRE9VQkxFLUNIQVJBQ1RFUiBudW1iZXIiLAorIiAgQVNDSUkgdmFsdWUgb2YgY2hhcmFjdGVyIHRvIGJlIGRvdWJsZWQgd2hlbiBzZW5kaW5nIHBhY2tldHMsIHN1Y2ggYXMgYW4iLAorIiAgWC4yNSBQQUQgZXNjYXBlIGNoYXJhY3Rlci4iLAorIiAiLAorI2VuZGlmIC8qIENLWFhDSEFSICovCisiU0VUIFNFTkQgRU5ELU9GLVBBQ0tFVCBudW1iZXIiLAorIiAgQVNDSUkgdmFsdWUgb2YgY29udHJvbCBjaGFyYWN0ZXIgdG8gdGVybWluYXRlIGFuIG91dGJvdW5kIHBhY2tldCwiLAorIiAgbm9ybWFsbHkgMTMgKGNhcnJpYWdlIHJldHVybikuIiwKKyIgIiwKKyJTRVQgU0VORCBNT1ZFLVRPIFsgZGlyZWN0b3J5IF0iLAorIiAgXAorSWYgYSBkaXJlY3RvcnkgbmFtZSBpcyBzcGVjaWZpZWQsIHRoZW4gZXZlcnkgZmlsZSB0aGF0IGlzIHNlbnQgc3VjY2Vzc2Z1bGx5IiwKKyIgIGlzIG1vdmVkIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgc2VudC4iLAorIiAgT21pdCB0aGUgZGlyZWN0b3J5IG5hbWUgdG8gcmVtb3ZlIGFueSBwcmV2aW91c2x5IHNldCBtb3ZlLXRvIGRpcmVjdG9yeS4iLAorIiAiLAorIlNFVCBTRU5EIFBBQ0tFVC1MRU5HVEggbnVtYmVyIiwKKyIgIE1heGltdW0gbGVuZ3RoIHBhY2tldCB0byBzZW5kLCBldmVuIGlmIG90aGVyIEtlcm1pdCBhc2tzIGZvciBsb25nZXIgb25lcy4iLAorIiAgVGhpcyBjb21tYW5kIGNhbiBub3QgYmUgdXNlZCB0byBmb3JjZSBwYWNrZXRzIHRvIGJlIHNlbnQgdGhhdCBhcmUgbG9uZ2VyIiwKKyIgIHRoYW4gdGhlIGxlbmd0aCByZXF1ZXN0ZWQgYnkgdGhlIHJlY2VpdmVyLiAgVXNlIHRoaXMgY29tbWFuZCBvbmx5IHRvIiwKKyIgIGZvcmNlIHNob3J0ZXIgb25lcy4iLAorIiAiLAorIlNFVCBTRU5EIFBBRERJTkcgbnVtYmVyIiwKKyIgIE51bWJlciBvZiBwcmVwYWNrZXQgcGFkZGluZyBjaGFyYWN0ZXJzIHRvIHNlbmQuIiwKKyIgIiwKKyJTRVQgU0VORCBQQUQtQ0hBUkFDVEVSIG51bWJlciIsCisiICBBU0NJSSB2YWx1ZSBvZiBjb250cm9sIGNoYXJhY3RlciB0byB1c2UgZm9yIHBhZGRpbmcuIiwKKyIgIiwKKyJTRVQgU0VORCBQQVRITkFNRVMge09GRiwgQUJTT0xVVEUsIFJFTEFUSVZFfSIsCisiICBJbmNsdWRlIHRoZSBwYXRoIChkZXZpY2UsIGRpcmVjdG9yeSkgcG9ydGlvbiB3aXRoIHRoZSBmaWxlIG5hbWUgd2hlbiIsCisiICBzZW5kaW5nIGl0IGFzIHNwZWNpZmllZDsgQUJTT0xVVEUgbWVhbnMgdG8gc2VuZCB0aGUgd2hvbGUgcGF0aG5hbWUsIiwKKyIgIFJFTEFUSVZFIG1lYW5zIHRvIGluY2x1ZGUgdGhlIHBhdGhuYW1lIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4iLAorIiAgQXBwbGllcyB0byB0aGUgYWN0dWFsIGZpbGVuYW1lLCBub3QgdG8gdGhlIFwiYXMtbmFtZVwiLiAgVGhlIGRlZmF1bHQgaXMiLAorIiAgT0ZGLiIsCisiICIsCisiU0VUIFNFTkQgUEFVU0UgbnVtYmVyIiwKKyIgIE1pbGxpc2Vjb25kcyB0byBwYXVzZSBiZXR3ZWVuIHBhY2tldHMsIG5vcm1hbGx5IDAuIiwKKyIgIiwKKworI2lmZGVmIENLX1BFUk1TCisiU0VUIFNFTkQgUEVSTUlTU0lPTlMgeyBPTiwgT0ZGIH0iLAorIiAgV2hldGhlciB0byBpbmNsdWRlIGZpbGUgcGVybWlzc2lvbnMgaW4gb3V0Ym91bmQgQXR0cmlidXRlIHBhY2tldHMuIiwKKyIgIiwKKyNlbmRpZiAvKiBDS19QRVJNUyAqLworCisiU0VUIFNFTkQgUkVOQU1FLVRPIFsgdGVtcGxhdGUgXSIsCisiICBJZiBhIHRlbXBsYXRlIGlzIHNwZWNpZmllZCwgdGhlbiBldmVyeSBmaWxlIHRoYXQgaXMgc2VudCBzdWNjZXNzZnVsbHkiLAorIiAgaXMgcmVuYW1lZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHRlbXBsYXRlIGltbWVkaWF0ZWx5IGFmdGVyIGl0IGlzIHNlbnQuIiwKKyIgIFwKK1RoZSB0ZW1wbGF0ZSBzaG91bGQgaW5jbHVkZSB2YXJpYWJsZXMgbGlrZSBcXHYoZmlsZW5hbWUpIG9yIFxcdihmaWxlbnVtYmVyKS4iLAorIiAgT21pdCB0aGUgdGVtcGxhdGUgdG8gcmVtb3ZlIGFueSB0ZW1wbGF0ZSBwcmV2aW91c2x5IHNldC4iLAorIiAiLAorIlNFVCBTRU5EIFNUQVJULU9GLVBBQ0tFVCBudW1iZXIiLAorIiAgQVNDSUkgdmFsdWUgb2YgY2hhcmFjdGVyIHRvIG1hcmsgc3RhcnQgb2Ygb3V0Ym91bmQgcGFja2V0LiIsCisiICIsCisjaWZkZWYgQ0tfVElNRVJTCisiU0VUIFNFTkQgVElNRU9VVCBudW1iZXIgWyB7IERZTkFNSUMgWyBtaW4gbWF4IF0gXSwgRklYRUQgfSBdIiwKKyNlbHNlCisiU0VUIFNFTkQgVElNRU9VVCBudW1iZXIiLAorI2VuZGlmIC8qIENLX1RJTUVSUyAqLworCisiICBOdW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBhIHBhY2tldCBiZWZvcmUgc2VuZGluZyBOQUsgb3IiLAorI2lmZGVmIENLX1RJTUVSUworIiAgcmV0cmFuc21pdHRpbmcuICBJbmNsdWRlIHRoZSB3b3JkIERZTkFNSUMgYWZ0ZXIgdGhlIG51bWJlciBpbiB0aGUiLAorIiAgU0VUIFNFTkQgVElNRU9VVCBjb21tYW5kIHRvIGhhdmUgS2VybWl0IGNvbXB1dGUgdGhlIHRpbWVvdXRzIGR5bmFtaWNhbGx5IiwKKyIgIHRocm91Z2hvdXQgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIHRoZSBwYWNrZXQgcmF0ZS4gIEluY2x1ZGUgdGhlIHdvcmQgRklYRUQiLAorIiAgdG8gdXNlIHRoZSBcIm51bWJlclwiIGdpdmVuIHRocm91Z2hvdXQgdGhlIHRyYW5zZmVyLiAgRFlOQU1JQyBpcyB0aGUiLAorIiAgZGVmYXVsdC4gIEFmdGVyIERZTkFNSUMgeW91IG1heSBpbmNsdWRlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzLiIsCisjZWxzZQorIiAgcmV0cmFuc21pdHRpbmcuIiwKKyNlbmRpZiAvKiBDS19USU1FUlMgKi8KKyNpZmRlZiBWTVMKKyIgIiwKKyJTRVQgU0VORCBWRVJTSU9OLU5VTUJFUlMgeyBPTiwgT0ZGIH0iLAorIiAgSWYgT04sIGluY2x1ZGUgVk1TIHZlcnNpb24gbnVtYmVycyBpbiBvdXRib3VuZCBmaWxlbmFtZXMuICBJZiBPRkYgKHdoaWNoIiwKKyIgIGlzIHRoZSBkZWZhdWx0KSwgc3RyaXAgdmVyc2lvbiBudW1iZXJzLiIsCisjZW5kaWYgLyogVk1TICovCisiIiB9OworCitzdGF0aWMgY2hhciAqaHh5eGZlcltdID0geworIlN5bnRheDogU0VUIFRSQU5TRkVSIChvciBYRkVSKSBwYXJhbWF0ZXIgdmFsdWUiLAorIiAiLAorIkNob2ljZXM6IiwKKyIgIiwKKyJTRVQgVFJBTlNGRVIgQkVMTCB7IE9GRiwgT04gfSIsCisiICBXaGV0aGVyIHRvIHJpbmcgdGhlIHRlcm1pbmFsIGJlbGwgYXQgdGhlIGVuZCBvZiBhIGZpbGUgdHJhbnNmZXIuIiwKKyIgIiwKKyNpZmRlZiBYRlJDQU4KKyJTRVQgVFJBTlNGRVIgQ0FOQ0VMTEFUSU9OIHsgT0ZGLCBPTiBbIDxjb2RlPiBbIDxudW1iZXI+IF0gXSB9IiwKKyIgIE9GRiBkaXNhYmxlcyByZW1vdGUtbW9kZSBwYWNrZXQtbW9kZSBjYW5jZWxsYXRpb24gZnJvbSB0aGUga2V5Ym9hcmQuIiwKKyIgIE9OIGVuYWJsZXMgaXQuICBUaGUgb3B0aW9uYWwgPGNvZGU+IGlzIHRoZSBjb250cm9sIGNoYXJhY3RlciB0byB1c2UgZm9yIiwKKyIgIGNhbmNlbGxhdGlvbjsgdGhlIG9wdGlvbmFsIDxudW1iZXI+IGlzIGhvdyBtYW55IGNvbnNlY3V0aXZlIG9jY3VycmVuY2VzIiwKKyIgIG9mIHRoZSBnaXZlbiBjb250cm9sIGNoYXJhY3RlciBhcmUgcmVxdWlyZWQgZm9yIGNhbmNlbGxhdGlvbi4iLAorIiAiLAorI2VuZGlmIC8qIFhGUkNBTiAqLworIlNFVCBUUkFOU0ZFUiBJTlRFUlJVUFRJT04geyBPTiwgT0ZGIH0iLAorIiAgVFJBTlNGRVIgSU5URVJSVVBUSU9OIGlzIG5vcm1hbGx5IE9OLCBhbGxvd2luZyBmb3IgaW50ZXJydXB0aW9uIG9mIGEgZmlsZSIsCisiICB0cmFuc2ZlciBpbiBwcm9ncmVzcyBieSB0eXBpbmcgY2VydGFpbiBjaGFyYWN0ZXJzIHdoaWxlIHRoZSBmaWxlLXRyYW5zZmVyIiwKKyIgIGRpc3BsYXkgaXMgYWN0aXZlLiAgU0VUIFRSQU5TRkVSIElOVEVSUlVQVElPTiBPRkYgZGlzYWJsZXMgaW50ZXJydXB0aW9uIiwKKyIgIG9mIGZpbGUgdHJhbnNmZXIgZnJvbSB0aGUga2V5Ym9hcmQgaW4gbG9jYWwgbW9kZS4iLAorIiAiLAorI2lmbmRlZiBOT1NQTAorIlNFVCBUUkFOU0ZFUiBDUkMtQ0FMQ1VMQVRJT04geyBPRkYsIE9OIH0iLAorIiAgVGVsbHMgd2hldGhlciBLZXJtaXQgc2hvdWxkIGFjY3VtdWxhdGUgYSBDeWNsaWMgUmVkdW5kYW5jeSBDaGVjayBmb3IgIiwKKyIgIGVhY2ggZmlsZSB0cmFuc2Zlci4gIE5vcm1hbGx5IE9OLCBpbiB3aGljaCBjYXNlIHRoZSBDUkMgdmFsdWUgaXMgYXZhaWxhYmxlIiwKKyIgIGluIHRoZSBcXHYoY3JjMTYpIHZhcmlhYmxlIGFmdGVyIHRoZSB0cmFuc2Zlci4gIEFkZHMgc29tZSBvdmVyaGVhZC4gIFVzZSIsCisiICBTRVQgVFJBTlNGRVIgQ1JDIE9GRiB0byBkaXNhYmxlLiIsCisiICIsCisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZm5kZWYgTk9DU0VUUworIlNFVCBUUkFOU0ZFUiBDSEFSQUNURVItU0VUIG5hbWUiLAorIiAgU2VsZWN0cyB0aGUgY2hhcmFjdGVyIHNldCB1c2VkIHRvIHJlcHJlc2VudCB0ZXh0dWFsIGRhdGEgaW4gS2VybWl0IiwKKyIgIHBhY2tldHMuICBUZXh0IGNoYXJhY3RlcnMgYXJlIHRyYW5zbGF0ZWQgdG8vZnJvbSB0aGUgRklMRSBDSEFSQUNURVItU0VULiIsCisiICBDaG9pY2VzOiIsCisiICIsCisiICBUUkFOU1BBUkVOVCAobm8gdHJhbnNsYXRpb24sIHRoZSBkZWZhdWx0KSIsCisiICBBU0NJSSIsCisiICBMQVRJTjEgKElTTyA4ODU5LTEgTGF0aW4gQWxwaGFiZXQgMSkiLAorI2lmbmRlZiBOT0xBVElOMgorIiAgTEFUSU4yIChJU08gODg1OS0yIExhdGluIEFscGhhYmV0IDIpIiwKKyNlbmRpZiAvKiBOT0xBVElOMiAqLworIiAgTEFUSU45IChJU08gODg1OS0xNSBMYXRpbiBBbHBoYWJldCA5KSIsCisjaWZkZWYgQ1lSSUxMSUMKKyIgIENZUklMTElDLUlTTyAoSVNPIDg4NTktNSBMYXRpbi9DeXJpbGxpYykiLAorI2VuZGlmIC8qIENZUklMTElDICovCisjaWZkZWYgR1JFRUsKKyIgIEdSRUVLLUlTTyAoSVNPIDg4NTktNyBMYXRpbi9HcmVlaykiLAorI2VuZGlmIC8qIEdSRUVLICovCisjaWZkZWYgSEVCUkVXCisiICBIRUJSRVctSVNPIChJU08gODg1OS04IExhdGluL0hlYnJldykiLAorI2VuZGlmIC8qIEhFQlJFVyAqLworI2lmZGVmIEtBTkpJCisiICBKQVBBTkVTRS1FVUMgKEpJUyBYIDAyMDggS2FuamkgKyBSb21hbiBhbmQgS2F0YWthbmEpIiwKKyNlbmRpZiAvKiBLQU5KSSAqLworI2lmZGVmIFVOSUNPREUKKyIgIFVDUy0yIChJU08gMTA2NDYgLyBVbmljb2RlIDItYnl0ZSBmb3JtKSIsCisiICBVVEYtOCAoSVNPIDEwNjQ2IC8gVW5pY29kZSA4LWJpdCBzZXJpYWxpemVkIHRyYW5zZm9ybWF0aW9uIGZvcm1hdCkiLAorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyIgIiwKKyJTRVQgVFJBTlNGRVIgVFJBTlNMQVRJT04geyBPTiwgT0ZGIH0iLAorIiAgRW5hYmxlcyBhbmQgZGlzYWJsZXMgZmlsZS10cmFuc2ZlciBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uLiAgSXQncyIsCisiICBlbmFibGVkIGJ5IGRlZmF1bHQuIiwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisiICIsCisjaWZkZWYgQ0tfQ1VSU0VTCisiU0VUIFRSQU5TRkVSIERJU1BMQVkgeyBCUklFRiwgQ1JULCBGVUxMU0NSRUVOLCBOT05FLCBTRVJJQUwgfSIsCisjZWxzZQorIlNFVCBUUkFOU0ZFUiBESVNQTEFZIHsgQlJJRUYsIENSVCwgTk9ORSwgU0VSSUFMIH0iLAorI2VuZGlmICAvKiBDS19DVVJTRVMgKi8KKyIgIENob29zZSB0aGUgZGVzaXJlZCBmb3JtYXQgZm9yIHRoZSBwcm9ncmVzcyByZXBvcnQgdG8gYmUgZGlzcGxheWVkIG9uIiwKKyIgIHlvdXIgc2NyZWVuIGR1cmluZyBmaWxlIHRyYW5zZmVycyB3aGVuIEtlcm1pdCBpcyBpbiBsb2NhbCBtb2RlLiIsCisjaWZkZWYgQ0tfQ1VSU0VTCisiICBGVUxMU0NSRUVOIHJlcXVpcmVzIHlvdXIgdGVybWluYWwgdHlwZSBiZSBzZXQgY29ycmVjdGx5OyB0aGUgb3RoZXJzIiwKKyIgIGFyZSBpbmRlcGVuZGVudCBvZiB0ZXJtaW5hbCB0eXBlLiIsCisjZWxzZQorIiAgZmlsZSB0cmFuc2Zlci4iLAorI2VuZGlmICAvKiBDS19DVVJTRVMgKi8KKyIgIiwKKyJTRVQgVFJBTlNGRVIgTE9DS0lORy1TSElGVCB7IE9GRiwgT04sIEZPUkNFRCB9IiwKKyIgIFRlbGwgd2hldGhlciBsb2NraW5nLXNoaWZ0IHByb3RvY29sIHNob3VsZCBiZSB1c2VkIGR1cmluZyBmaWxlIHRyYW5zZmVyIiwKKyIgIHRvIGFjaGlldmUgOC1iaXQgdHJhbnNwYXJlbmN5IG9uIGEgNy1iaXQgY29ubmVjdGlvbi4gIE9OIG1lYW5zIHRvIHJlcXVlc3QiLAorIiAgaXRzIHVzZSBpZiBQQVJJVFkgaXMgbm90IE5PTkUgYW5kIHRvIHVzZSBpdCBpZiB0aGUgb3RoZXIgS2VybWl0IGFncmVlcywiLAorIiAgT0ZGIG1lYW5zIG5vdCB0byB1c2UgaXQsIEZPUkNFRCBtZWFucyB0byB1c2UgaXQgZXZlbiBpZiB0aGUgb3RoZXIgS2VybWl0IiwKKyIgIGRvZXMgbm90IGFncmVlLiIsCisiICIsCisiU0VUIFRSQU5TRkVSIE1PREUgeyBBVVRPTUFUSUMsIE1BTlVBTCB9IiwKKyIgIEF1dG9tYXRpYyAodGhlIGRlZmF1bHQpIG1lYW5zIEtlcm1pdCBzaG91bGQgYXV0b21hdGljYWxseSBnbyBpbnRvIGJpbmFyeSIsCisiICBmaWxlLXRyYW5zZmVyIG1vZGUgYW5kIHVzZSBsaXRlcmFsIGZpbGVuYW1lcyBpZiB0aGUgb3RoZXIgS2VybWl0IHNheXMgaXQiLAorIiAgaGFzIGEgY29tcGF0aWJsZSBmaWxlIHN5c3RlbSwgZS5nLiBVTklYLXRvLVVOSVgsIGJ1dCBub3QgVU5JWC10by1ET1MuIiwKKyNpZmRlZiBQQVRURVJOUworIiAgQWxzbywgd2hlbiBzZW5kaW5nIGZpbGVzLCBLZXJtaXQgc2hvdWxkIHN3aXRjaCBiZXR3ZWVuIGJpbmFyeSBhbmQgdGV4dCIsCisiICBtb2RlIGF1dG9tYXRpY2FsbHkgcGVyIGZpbGUgYmFzZWQgb24gdGhlIFNFVCBGSUxFIEJJTkFSWS1QQVRURVJOUyBhbmQgU0VUIiwKKyIgIEZJTEUgVEVYVC1QQVRURVJOUy4iLAorI2VuZGlmIC8qIFBBVFRFUk5TICovCisiICIsCisjaWZkZWYgUElQRVNFTkQKKyJTRVQgVFJBTlNGRVIgUElQRVMgeyBPTiwgT0ZGIH0iLAorIiAgRW5hYmxlcy9EaXNhYmxlcyBhdXRvbWF0aWMgc2VuZGluZyBmcm9tIC8gcmVjZXB0aW9uIHRvIGNvbW1hbmQgcGlwZXMgd2hlbiIsCisiICB0aGUgaW5jb21pbmcgZmlsZW5hbWUgc3RhcnRzIHdpdGggJyEnLiAgQWxzbyBzZWUgQ1NFTkQsIENSRUNFSVZFLiIsCisiICIsCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyNpZmRlZiBDS19YWVoKKyJTRVQgVFJBTlNGRVIgUFJPVE9DT0wgeyBLRVJNSVQsIFhNT0RFTSwgLi4uIH0iLAorIiAgU3lub255bSBmb3IgU0VUIFBST1RPQ09MIChxLnYuKS4iLAorIiAiLAorI2VuZGlmIC8qIENLX1hZWiAqLworIlNFVCBUUkFOU0ZFUiBSRVBPUlQgeyBPTiwgT0ZGIH0iLAorIiAgRW5hYmxlcy9EaXNhYmxlcyB0aGUgYXV0b21hdGljIHBvc3QtdHJhbnNmZXIgbWVzc2FnZSB0ZWxsaW5nIHdoYXQgZmlsZXMiLAorIiAgd2VudCB3aGVyZSBmcm9tIEMtS2VybWl0IHdoZW4gaXQgaXMgaW4gcmVtb3RlIG1vZGUuICBPTiBieSBkZWZhdWx0LiIsCisiICIsCisiU0VUIFRSQU5TRkVSIFNMT1ctU1RBUlQgeyBPRkYsIE9OIH0iLAorIiAgT04gKHRoZSBkZWZhdWx0KSB0ZWxscyBLZXJtaXQsIHdoZW4gc2VuZGluZyBmaWxlcywgdG8gZ3JhZHVhbGx5IGJ1aWxkIHVwIiwKKyIgIHRoZSBwYWNrZXQgbGVuZ3RoIHRvIHRoZSBtYXhpbXVtIG5lZ290aWF0ZWQgbGVuZ3RoLiAgT0ZGIG1lYW5zIHN0YXJ0IiwKKyIgIHNlbmRpbmcgdGhlIG1heGltdW0gbGVuZ3RoIHJpZ2h0IGF3YXkuIiwKKyIgIiwKKyJTeW5vbnltOiBTRVQgWEZFUi4gIFVzZSBTSE9XIFRSQU5TRkVSIChYRkVSKSB0byBzZWUgU0VUIFRSQU5TRkVSIHZhbHVlcy4iLAorIiIgfTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIE5UCitzdGF0aWMgY2hhciAqaHh5d2luOTVbXSA9IHsKKyJTRVQgV0lOOTUgOC4zLUZJTEVOQU1FUyB7IE9OLCBPRkYgfSIsCisiICBJbnN0cnVjdHMgSy05NSB0byByZXBvcnQgYWxsIGZpbGVuYW1lcyB1c2luZyA4LjMgbm90YXRpb24gaW5zdGVhZCBvZiB0aGUiLAorIiAgbm9ybWFsIGxvbmcgZmlsZW5hbWVzLiAgRGVmYXVsdCBpcyBPRkYiLAorIiAiLAorIlNFVCBXSU45NSBBTFQtR1IgeyBPTiwgT0ZGIH0iLAorIiAgSW5zdHJ1Y3RzIEstOTUsIHdoZW4gdXNlZCBvbiBNUyBXaW5kb3dzIDk1LCB0byBpbnRlcnByZXQgdGhlIFJpZ2h0IEFsdCBrZXkiLAorIiAgYXMgdGhlIEFsdC1HciBrZXkuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byB3b3JrIGFyb3VuZCB0aGUgZmFpbHVyZSBvZiIsCisiICBXaW5kb3dzIDk1IHRvIHByb3Blcmx5IHRyYW5zbGF0ZSBub24tVVMga2V5Ym9hcmRzLiAgRGVmYXVsdCBpcyBPRkYuIiwKKyIgIiwKKyJTRVQgV0lOOTUgS0VZQk9BUkQtVFJBTlNMQVRJT04gPGNoYXJhY3Rlci1zZXQ+IiwKKyIgIFNwZWNpZmllcyB0aGUgY2hhcmFjdGVyLXNldCB0aGF0IFdpbmRvd3MgOTUgaXMgdXNpbmcgdG8gc2VuZCBrZXlzdHJva2VzIiwKKyIgIHRvIEtlcm1pdC05NSB2aWEgdGhlIGtleWJvYXJkIGlucHV0IGZ1bmN0aW9ucy4gIERlZmF1bHQgaXMgTGF0aW4xLUlTTy4iLAorIiAiLAorIlNFVCBXSU45NSBPVkVSTEFQUEVELUlPIHsgT04gPHJlcXVlc3RzPiwgT0ZGIH0iLAorIiAgRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBLLTk1IHVzZXMgT3ZlcmxhcHBlZC1JL08gbWV0aG9kcyBmb3IgcmVhZGluZyIsCisiICBmcm9tIGFuZCB3cml0aW5nIHRvIHNlcmlhbCBhbmQgVEFQSSBjb21tdW5pY2F0aW9uIGRldmljZXMuICA8cmVxdWVzdHM+IiwKKyIgIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHdyaXRlIHJlcXVlc3RzIHRoYXQgbWF5IGJlIiwKKyIgIG92ZXJsYXBwZWQsIGZyb20gMSB0byAzMC4gIERlZmF1bHQgaXMgT04uIiwKKyIgIiwKKyJTRVQgV0lOOTUgUE9QVVBTIHsgT04sIE9GRiB9IiwKKyIgIERldGVybWluZXMgd2hldGhlciBvciBub3QgS2VybWl0IDk1IHVzZXMgUG9wdXBzIHRvIHF1ZXJ5IHRoZSB1c2VyIGZvciIsCisiICBuZWNlc3NhcnkgaW5mb3JtYXRpb24gc3VjaCBhcyB1c2VyIElEcyBvciBwYXNzd29yZHMuICBEZWZhdWx0IGlzIE9OLiIsCisiICIsCisiU0VUIFdJTjk1IFNFTEVDVC1CVUcgeyBPTiwgT0ZGIH0iCisiICBTb21lIFRDUC9JUCAoV2luc29jaykgaW1wbGVtZW50YXRpb25zIGZvciBXaW5kb3dzIGhhdmUgYSBkZWZlY3RpdmUiLAorIiAgc2VsZWN0KCkgZnVuY3Rpb24uICBVc2UgdGhpcyBjb21tYW5kIHRvIGF2b2lkIHRoZSB1c2Ugb2Ygc2VsZWN0KCkgaWYiLAorIiAgSzk1IGFwcGVhcnMgdG8gYmUgdW5hYmxlIHRvIHNlbmQgZGF0YSBvdmVyIFRDUC9JUC4gIERlZmF1bHQgaXMgT0ZGLiIsCisiIn07CisjZW5kaWYgLyogTlQgKi8KKworc3RhdGljIGNoYXIgKmhteHliZWxbXSA9IHsKKyNpZmRlZiBPUzIKKyJTeW50YXg6IFNFVCBCRUxMIHsgQVVESUJMRSBbIHsgQkVFUCwgU1lTVEVNLVNPVU5EUyB9IF0sIFZJU0lCTEUsIE5PTkUgfSIsCisiICBTcGVjaWZpZXMgaG93IGluY29taW5nIEN0cmwtRyAoYmVsbCkgY2hhcmFjdGVycyBhcmUgaGFuZGxlZCBpbiBDT05ORUNUIiwKKyIgIG1vZGUgYW5kIGhvdyBjb21tYW5kIHdhcm5pbmdzIGFyZSBwcmVzZW50ZWQgaW4gY29tbWFuZCBtb2RlLiAgQVVESUJMRSIsCisiICBtZWFucyBlaXRoZXIgYSBiZWVwIG9yIGEgc3lzdGVtLXNvdW5kIGlzIGdlbmVyYXRlZDsgVklTSUJMRSBtZWFucyB0aGUiLAorIiAgc2NyZWVuIGlzIGZsYXNoZWQgbW9tZW50YXJpbHkuIiwKKyNlbHNlCisiU3ludGF4OiBTRVQgQkVMTCB7IE9GRiwgT04gfSIsCisiICBPTiAodGhlIGRlZmF1bHQpIGVuYWJsZXMgcmluZ2luZyBvZiB0aGUgdGVybWluYWwgYmVsbCAoYmVlcCkgZXhjZXB0IHdoZXJlIiwKKyIgIGl0IGlzIGRpc2FibGVkIGluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgZS5nLiBieSBTRVQgVFJBTlNGRVIgQkVMTC4gIE9GRiIsCisiICBkaXNhYmxlcyByaW5naW5nIG9mIHRoZSBiZWxsIGluIGFsbCBjaXJjdW1zdGFuY2VzLCBvdmVycmlkaW5nIGFueSBzcGVjaWZpYyIsCisiICBTRVQgeHh4IEJFTEwgc2VsZWN0aW9ucy4iLAorI2VuZGlmIC8qIE9TMiAqLworIiJ9OworCitzdGF0aWMgY2hhciAqaG14eWNkW10gPSB7CisiU3ludGF4OiBTRVQgQ0QgeyBIT01FIDxwYXRoPiwgUEFUSCA8cGF0aD4sIE1FU1NBR0UgeyBPTiwgT0ZGLCBGSUxFIDxsaXN0PiB9IH0iCissCisiICIsCisiU0VUIENEIEhPTUUgPHBhdGg+IiwKKyIgIFNwZWNpZmllZCB3aGljaCBkaXJlY3RvcnkgdG8gY2hhbmdlIHRvIGlmIENEIG9yIEtDRCBpcyBnaXZlbiB3aXRob3V0IGEiLAorIiAgcGF0aG5hbWUuICBJZiB0aGlzIGNvbW1hbmQgaXMgbm90IGdpdmVuLCB5b3VyIGxvZ2luIG9yIEhPTUUgZGlyZWN0b3J5IGlzIiwKKyIgIHVzZWQuIiwKKyIgIiwKKyJTRVQgQ0QgUEFUSCA8cGF0aD4iLAorIiAgT3ZlcnJpZGVzIG5vcm1hbCBDRFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIHdoaWNoIHRlbGxzIHRoZSBDRCBjb21tYW5kIiwKKyIgIHdoZXJlIHRvIGxvb2sgZm9yIGRpcmVjdG9yaWVzIHRvIENEIHRvIGlmIHlvdSBkb24ndCBzcGVjaWZ5IHRoZW0gZnVsbHkuIiwKKyIgIFRoZSBmb3JtYXQgaXM6IiwKKyIgIiwKKyNpZmRlZiBVTklYT1JPU0sKKyIgICAgc2V0IGNkIHBhdGggOmRpcmVjdG9yeTpkaXJlY3Rvcnk6Li4uIiwKKyIgIiwKKyIgIGluIG90aGVyIHdvcmRzLCBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgc2VwYXJhdGVkIGJ5IGNvbG9ucywgd2l0aCBhIGNvbG9uIiwKKyIgIGF0IHRoZSBiZWdpbm5pbmcsIGUuZy46IiwKKyIgIiwKKyIgICAgc2V0IGNkIHBhdGggOi91c3Ivb2xnYTovdXNyL2l2YW4vcHVibGljOi90bXAiLAorI2Vsc2UKKyNpZmRlZiBPUzIKKyIgICAgc2V0IGNkIHBhdGggZGlzazpkaXJlY3Rvcnk7ZGlzazpkaXJlY3Rvcnk7Li4uIiwKKyIgIiwKKyIgIGp1c3QgbGlrZSB0aGUgRE9TIFBBVEg7IGluIG90aGVyIHdvcmRzLCBhIGxpc3Qgb2YgZGlzazpkaXJlY3RvcnkgbmFtZXMiLAorIiAgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMsIGUuZy46IiwKKyIgIiwKKyIgICAgU0VUIENEIFBBVEggQzpcXEs5NTtDOlxcSE9NRTtDOlxcTE9DQUw7QzpcXCIsCisjZWxzZQorI2lmZGVmIFZNUworIiAgICBzZXQgY2QgcGF0aCBkaXJlY3RvcnksZGlyZWN0b3J5LC4uLiIsCisiICIsCisiICBpbiBvdGhlciB3b3JkcywgYSBsaXN0IG9mIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9ucyBvciBsb2dpY2FsIG5hbWVzIHRoYXQiLAorIiAgcmVwcmVzZW50IHRoZW0sIGUuZy46IiwKKyIgIiwKKyIgICAgU0VUIENEIFBBVEggU1lTJExPR0lOOiwkRElTSzE6W09MR0FdLCRESVNLMltTQ1JBVENILklWQU5dLiIsCisjZWxzZQorIiAgKHVua25vd24gZm9yIHRoaXMgcGxhdGZvcm0pIiwKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyIgIiwKKyJTRVQgQ0QgTUVTU0FHRSB7IE9OLCBPRkYgfSIsCisiICBEZWZhdWx0IGlzIE9GRi4gIFdoZW4gT04sIHRoaXMgdGVsbHMgS2VybWl0IHRvIGxvb2sgZm9yIGEgZmlsZSB3aXRoIGEiLAorIiAgY2VydGFpbiBuYW1lIGluIGFueSBkaXJlY3RvcnkgdGhhdCB5b3UgQ0QgdG8sIGFuZCBpZiBpdCBmaW5kcyBvbmUsIHRvIiwKKyIgIGRpc3BsYXkgaXQgb24geW91ciBzY3JlZW4gd2hlbiB5b3UgZ2l2ZSB0aGUgQ0QgY29tbWFuZC4gIFRoZSBmaWxlbmFtZSwiLAorIiAgb3IgbGlzdCBvZiBuYW1lcywgaXMgZ2l2ZW4gaW4gdGhlIFNFVCBDRCBNRVNTQUdFIEZJTEUgY29tbWFuZC4iLAorIiAiLAorIlNFVCBDRCBNRVNTQUdFIEZJTEUgbmFtZSIsCisiICBvcjoiLAorIlNFVCBDRCBNRVNTQUdFIEZJTEUge3tuYW1lMX17bmFtZTJ9Li4ue25hbWU4fX0iLAorIiAgU3BlY2lmeSB1cCB0byA4IGZpbGVuYW1lcyB0byBsb29rIGZvciB3aGVuIHdoZW4gQ0RpbmcgdG8gYSBuZXcgZGlyZWN0b3J5IiwKKyIgIGFuZCBDRCBNRVNTQUdFIGlzIE9OLiAgVGhlIGZpcnN0IG9uZSBmb3VuZCwgaWYgYW55LCBpbiB0aGUgbmV3IGRpcmVjdG9yeSIsCisjaWZuZGVmIERGQ0RNU0cKKyIgIGlzIGRpc3BsYXllZC4iLAorI2Vsc2UKKyIgIGlzIGRpc3BsYXllZC4gIFRoZSBkZWZhdWx0IGxpc3QgaXM6IiwKKyIgIiwKKyNpZmRlZiBVTklYT1JPU0sKKyIgICB7ey4vLnJlYWRtZX17UkVBRE1FLlRYVH17UkVBRC5NRX19IiwKKyNlbHNlCisiICAge3tSRUFETUUuVFhUfXtSRUFELk1FfX0iLAorI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworIiAiLAorI2VuZGlmIC8qIERGQ0RNU0cgKi8KKyNpZm5kZWYgTk9TRVJWRVIKKyJTeW5vbnltOiBTRVQgU0VSVkVSIENELU1FU1NBR0UgRklMRS4iLAorI2VuZGlmIC8qIE5PU0VSVkVSICovCisiICIsCisiVHlwZSBTSE9XIENEIHRvIHZpZXcgY3VycmVudCBDRCBzZXR0aW5ncy4gIEFsc28gc2VlIEhFTFAgU0VUIFNFUlZFUi4iLAorIiIKK307CisKKyNpZm5kZWYgTk9JS1NECitzdGF0aWMgY2hhciAqIGhzZXRpa3NbXSA9IHsKKyNpZmRlZiBPUzIKKyJTRVQgSUtTIEFOT05ZTU9VUyBBQ0NPVU5UIDx1c2VybmFtZT4iLAorIiAgT24gV2luZG93cyBOVC8yMDAwIHRoaXMgaXMgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWxsb3ciLAorIiAgYW5vbnltb3VzIGFjY2VzcyB0byB0aGUgc3lzdGVtLiAgVGhpcyBhY2NvdW50IE1VU1QgaGF2ZSBubyBwYXNzd29yZCIsCisiICBhbmQgaXRzIHByaXZpbGVnZXMgc2hvdWxkIGJlIHJlc3RyaWN0ZWQgdG8gb25seSBhbGxvdyB0aG9zZSBvcGVyYXRpb25zIiwKKyIgIHdoaWNoIHNob3VsZCBiZSBwZXJtaXR0ZWQgdG8gdW5rbm93biB1c2Vycy4gIEluIHByYWN0aWNlIHRoaXMgbWVhbnMiLAorIiAgTGlzdCBEaXJlY3RvcmllcyBhbmQgUmVhZC1FeGVjdXRlIHByaXZpbGVnZXMgb25seS4gIElmIGEgZGlyZWN0b3J5IiwKKyIgIGlzIGNvbmZpZ3VyZWQgZm9yIFdyaXRlIHByaXZpbGVnZXMgdGhlbiBSZWFkIHByaXZpbGVnZXMgc2hvdWxkIGJlIiwKKyIgIGRlbmllZCBmb3IgdGhhdCBkaXJlY3RvcnkuICBPdGhlcndpc2UsIHlvdXIgc3lzdGVtIHdpbGwgYmVjb21lIHVzZWQiLAorIiAgYnkgc29mdHdhcmUgcGlyYXRlcy4gIElmIHRoaXMgY29tbWFuZCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBJS1NELktTQyIsCisiICBmaWxlIHRoZSB1c2VybmFtZSBcIkdVRVNUXCIgaXMgdXNlZCBieSBkZWZhdWx0LiAgVGhpcyBjb21tYW5kIGhhcyBubyIsCisiICBlZmZlY3Qgb24gV2luZG93cyA5NS85OC4iLAorIiAiLAorI2VuZGlmIC8qIE9TMiAqLworIlNFVCBJS1MgQU5PTllNT1VTIElOSVRGSUxFIGZpbGVuYW1lIiwKKyNpZmRlZiBPUzIKKyIgIFRoZSBpbml0aWFsaXphdGlvbiBmaWxlIHRvIGJlIGV4ZWN1dGVkIGZvciBhbm9ueW1vdXMgbG9naW5zLiAgQnkgZGVmYXVsdCIsCisiICBpdCBpcyBLOTUuSU5JIGluIHRoZSBob21lIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIEFOTk9OWU1PVVMgYWNjb3VudC4iCissCisiICBBbnkgZmlsZW5hbWUgdGhhdCB5b3Ugc3BlY2lmeSBoZXJlIG11c3QgYmUgcmVhZGFibGUgYnkgdGhlIEFOT05ZTU9VUyIsCisiICBhY2NvdW50IGFuZCBpZiBhIFNFVCBJS1MgQU5PTllNT1VTIFJPT1QgY29tbWFuZCB3YXMgZ2l2ZW4sIGV4aXN0IHdpdGhpbiIsCisiICB0aGUgcmVzdHJpY3RlZCBkaXJlY3RvcnkgdHJlZS4gIFRoaXMgb3B0aW9uIGlzIGluZGVwZW5kZW50IG9mIHRoZSBTRVQgSUtTIiwKKyIgIElOSVRGSUxFIGNvbW1hbmQgd2hpY2ggYXBwbGllcyBvbmx5IHRvIHJlYWwgdXNlcnMuIiwKKyNlbHNlCisiICBUaGUgaW5pdGlhbGl6YXRpb24gZmlsZSB0byBiZSBleGVjdXRlZCBmb3IgYW5vbnltb3VzIGxvZ2lucy4gIEJ5IGRlZmF1bHQiLAorIiAgaXQgaXMgLmtlcm1yYyBpbiB0aGUgYW5vbnltb3VzIHJvb3QgZGlyZWN0b3J5LiAgVGhpcyBvcHRpb24gaXMgaW5kZXBlbmRlbnQiLAorIiAgb2YgdGhlIFNFVCBJS1MgSU5JVEZJTEUgY29tbWFuZCB3aGljaCBhcHBsaWVzIG9ubHkgdG8gcmVhbCB1c2Vycy4iLAorI2VuZGlmIC8qIE9TMiAqLworIiAiLAorIlNFVCBJS1MgQU5PTllNT1VTIExPR0lOIHsgT04sIE9GRiB9IiwKKyNpZmRlZiBPUzIKKyIgIFdoZXRoZXIgYW5vbnltb3VzIGxvZ2lucyBhcmUgYWxsb3dlZC4gIEJ5IGRlZmF1bHQgdGhleSBhcmUgTk9UIGFsbG93ZWQsIiwKKyIgIHNvIHRoaXMgb3B0aW9uIG5lZWQgYmUgaW5jbHVkZWQgb25seSB0byBhbGxvdyB0aGVtIChvciBmb3IgY2xhcml0eSwgdG8iLAorIiAgZW1waGFzaXplIHRoYXQgdGhleSBhcmUgbm90IGFsbG93ZWQpLiAgQW5vbnltb3VzIGxvZ2luIG9jY3VycyB3aGVuIHRoZSIsCisiICB1c2VybmFtZSBcImFub255bW91c1wiIGlzIHNwZWNpZmllZCB3aXRoIGFueSBwYXNzd29yZCAoYXMgd2l0aCBmdHBkKS4iLAorIiAgSW4gb3JkZXIgZm9yIGFub255bW91cyBsb2dpbnMgdG8gc3VjY2VlZCBvbiBXaW5kb3dzIE5ULzIwMDAsIHRoZSIsCisiICBBTk9OWU1PVVMgYWNjb3VudCBtdXN0IGJlIGVuYWJsZWQuIiwKKyIgIiwKKyIgIE9uIFdpbmRvd3MgTlQgYW5kIDIwMDAsIGFub255bW91cyB1c2VycyBoYXZlIHRoZSBzYW1lIGFjY2VzcyByaWdodHMgYXMiLAorIiAgdGhlIEFOT05ZTU9VUyBhY2NvdW50LiAgSW4gV2luZG93cyA5NS85OCwgYW5vbnltb3VzIHVzZXJzLCBqdXN0IGxpa2UgYW55IiwKKyIgIG90aGVyIHVzZXJzLCBoYXZlIGZ1bGwgYWNjZXNzIHJpZ2h0cyB0byB5b3VyIGVudGlyZSBQQywgc2luY2UgV2luZG93cyA5NSIsCisiICBhbmQgOTggaW5jbHVkZSBubyBzZWN1cml0eSBmZWF0dXJlcy4gIEZvciB0aGlzIHJlYXNvbiwgaWYgeW91IGFyZSBhbGxvd2luZyIsCisiICBhbm9ueW1vdXMgbG9naW5zLCBiZSBzdXJlIHRvIGFsc28gU0VUIGFuIElLUyBBTk9OWU1PVVMgUk9PVCBkaXJlY3RvcnkgdG8iLAorIiAgcmVzdHJpY3QgYW5vbnltb3VzIHVzZXJzJyBmaWxlIGFjY2Vzcy4iLAorIiAiLAorIiAgQW5vbnltb3VzIHVzZXIgcGVybWlzc2lvbnMgbWF5IGJlIHJlc3RyaWN0ZWQgdmlhIHRoZSBzcGVjaWZpY2F0aW9uIG9mICIsCisiICBESVNBQkxFIGNvbW1hbmRzIGluIHRoZSBBTk9OWU1PVVMgaW5pdGZpbGUuICBBbm9ueW1vdXMgdXNlcnMgYXJlIG5vdCAiLAorIiAgcGVybWl0dGVkIHRvIGV4ZWN1dGUgYW4gRU5BQkxFIGNvbW1hbmQuICBBbm9ueW1vdXMgdXNlcnMgYXJlIGFsc28gcHJldmVudGVkIgorLAorIiAgZnJvbSBTSE9XaW5nIHNlbnNpdGl2ZSBkYXRhIGFib3V0IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9yIHRoZSBJS1MiLAorIiAgY29uZmlndXJhdGlvbi4iLAorI2Vsc2UKKyIgIFdoZXRoZXIgYW5vbnltb3VzIGxvZ2lucyBhcmUgYWxsb3dlZC4gQnkgZGVmYXVsdCB0aGV5IGFyZSBhbGxvd2VkLCBzbyB0aGlzIiwKKyIgIG9wdGlvbiBuZWVkIGJlIGluY2x1ZGVkIG9ubHkgdG8gZGlzYWxsb3cgdGhlbSAob3IgZm9yIGNsYXJpdHksIHRvIGVtcGhhc2l6ZSIKKywKKyIgIHRoZXkgYXJlIGFsbG93ZWQpLiBBbm9ueW1vdXMgbG9naW4gb2NjdXJzIHdoZW4gdGhlIHVzZXJuYW1lIFwiYW5vbnltb3VzXCIiLAorIiAgb3IgXCJmdHBcIiBpcyBnaXZlbiwgd2l0aCBhbnkgcGFzc3dvcmQgKGFzIHdpdGggZnRwZCkuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyIgIiwKKyJTRVQgSUtTIEFOT05ZTU9VUyBST09UIDxkaXJlY3Rvcnk+IiwKKyIgIFNwZWNpZmllcyBhIGRpcmVjdG9yeSB0cmVlIHRvIHdoaWNoIGFub255bW91cyB1c2VycyBhcmUgcmVzdHJpY3RlZCBhZnRlciIsCisiICBsb2dpbi4iLAorIiAiLAorIlNFVCBJS1MgQkFOTkVSRklMRSA8ZmlsZW5hbWU+IiwKKyIgIFRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbWVzc2FnZSB0byBiZSBwcmludGVkIGFmdGVyIHRoZSB1c2VyIGxvZ3MiLAorIiAgaW4sIGluIHBsYWNlIG9mIHRoZSBub3JtYWwgbWVzc2FnZSAoY29weXJpZ2h0IG5vdGljZSwgXCJUeXBlIEhFTFAgb3IgPyBmb3IiLAorIiAgaGVscFwiLCBldGMpLiIsCisiICIsCisiU0VUIElLUyBDREZJTEUgPGZpbGVsaXN0PiIsCisiICBXaGVuIGNkbWVzc2FnZSBpcyBvbiwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgXCJyZWFkIG1lXCIgZmlsZSB0byBiZSBzaG93bi4iCissCisiICBOb3JtYWxseSB5b3Ugd291bGQgc3BlY2lmeSBhIHJlbGF0aXZlIChub3QgYWJzb2x1dGUpIG5hbWUsIHNpbmNlIHRoZSBmaWxlIiwKKyIgIGlzIG9wZW5lZCB1c2luZyB0aGUgbGl0ZXJhbCBuYW1lIHlvdSBzcGVjaWZpZWQsIGFmdGVyIGNoYW5naW5nIHRvIHRoZSBuZXciLAorIiAgZGlyZWN0b3J5LiAgRXhhbXBsZToiLAorIiAiLAorIiAgICBTRVQgSUtTIENERklMRSBSRUFELk1FIiwKKyIgIiwKKyIgIFlvdSBjYW4gYWxzbyBnaXZlIGEgbGlzdCBvZiB1cCB0byA4IGZpbGVuYW1lcyBieSAoYSkgZW5jbG9zaW5nIGVhY2giLAorIiAgZmlsZW5hbWUgaW4gYnJhY2VzLCBhbmQgKGIpIGVuY2xvc2luZyB0aGUgZW50aXJlIGxpc3QgaW4gYnJhY2VzLiAgRXhhbXBsZToiLAorIiAiLAorIiAgICBTRVQgSUtTIENERklMRSB7e1JFQUQuTUV9e2FhcmVhZG1lLnR4dH17UkVBRE1FfXtyZWFkLXRoaXMtZmlyc3R9fSIsCisiICIsCisiICBXaGVuIGEgbGlzdCBpcyBnaXZlbiwgaXQgaXMgc2VhcmNoZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCB0aGUgZmlyc3QiLAorIiAgZmlsZSBmb3VuZCBpcyBkaXNwbGF5ZWQuIiwKKyIgIiwKKyJTRVQgSUtTIENETUVTU0FHRSB7T04sIE9GRiwgMCwgMSwgMn0iLAorIiAgRm9yIHVzZSBpbiB0aGUgU2VydmVyLVNpZGUgU2VydmVyIGNvbmZpZ3VyYXRpb247IHdoZW5ldmVyIHRoZSBjbGllbnQiLAorIiAgdGVsbHMgdGhlIHNlcnZlciB0byBjaGFuZ2UgZGlyZWN0b3J5LCB0aGUgc2VydmVyIHNlbmRzIHRoZSBjb250ZW50cyBvZiBhIiwKKyIgIFwicmVhZCBtZVwiIGZpbGUgdG8gdGhlIGNsaWVudCdzIHNjcmVlbi4gIFRoaXMgZmVhdHVyZSBpcyBPTiBieSBkZWZhdWx0LCIsCisiICBhbmQgb3BlcmF0ZXMgaW4gY2xpZW50L3NlcnZlciBtb2RlIG9ubHkgd2hlbiBPTiBvciAxLiAgSWYgc2V0IHRvIDIgb3IiLAorIiAgaGlnaGVyLCBpdCBhbHNvIG9wZXJhdGVzIHdoZW4gdGhlIENEIGNvbW1hbmQgaXMgZ2l2ZW4gYXQgdGhlIElLU0Q+IHByb21wdC4iLAorIiAgU3lub255bTogU0VUIElLUyBDRE1TRy4iLAorIiAiLAorIlNFVCBJS1MgREFUQUJBU0UgeyBPTiwgT0ZGIH0iLAorIiAgVGhpcyBjb21tYW5kIGRldGVybWluZXMgd2hldGhlciBlbnRyaWVzIGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBTRVQgSUtTIiwKKyIgIERCRklMRSAoSUtTRCBhY3RpdmUgc2Vzc2lvbnMgZGF0YWJhc2UpLiIsCisiICIsCisiU0VUIElLUyBEQkZJTEUgPGZpbGVuYW1lPiIsCisiICBTcGVjaWZpZXMgdGhlIGZpbGUgd2hpY2ggc2hvdWxkIGJlIHVzZWQgZm9yIHN0b3JpbmcgcnVudGltZSBzdGF0dXMiLAorI2lmZGVmIE9TMgorIiAgaW5mb3JtYXRpb24gYWJvdXQgYWN0aXZlIGNvbm5lY3Rpb25zLiAgVGhlIGRlZmF1bHQgaXMgYSBmaWxlIGNhbGxlZCIsCisiICBcImlrc2QuZGJcIiBpbiB0aGUgV0lORE9XUyBkaXJlY3RvcnkuIiwKKyNlbHNlCisjaWZkZWYgVU5JWAorIiAgaW5mb3JtYXRpb24gYWJvdXQgYWN0aXZlIGNvbm5lY3Rpb25zLiAgVGhlIGRlZmF1bHQgaXMgYSBmaWxlIGNhbGxlZCIsCisiICBcImlrc2QuZGJcIiBpbiB0aGUgL3Zhci9sb2cgZGlyZWN0b3J5LiIsCisjZWxzZQorIiAgaW5mb3JtYXRpb24gYWJvdXQgYWN0aXZlIGNvbm5lY3Rpb25zLiIsCisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIE9TMiAqLworIiAiLAorI2lmZGVmIE9TMgorIlNFVCBJS1MgREVGQVVMVC1ET01BSU4gPGRvbWFpbi1uYW1lPiIsCisiICBBIHVzZXJpZCBvbiBXaW5kb3dzIGlzIG9mIHRoZSBmb3JtIERPTUFJTlxcXFx1c2VyaWQuICBUaGlzIGNvbW1hbmQiLAorIiAgZGV0ZXJtaW5lcyB3aGljaCBkb21haW4gd2lsbCBiZSBzZWFyY2hlZCBmb3IgdGhlIHVzZXJpZCBpZiBhIGRvbWFpbiIsCisiICBpcyBub3Qgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiAgT24gV2luZG93cyA5NS85OCB3aGVuIFVzZXItbGV2ZWwiLAorIiAgYWNjZXNzIGlzIGFjdGl2YXRlZCBpbiB0aGUgTmV0d29yayBDb250cm9sIFBhbmVsLCB0aGUgZGVmYXVsdCAiLAorIiAgZG9tYWluIHdpbGwgYmUgYXV0b21hdGljYWxseSBzZXQuICBJZiB0aGUgZGVmYXVsdCBkb21haW4gaXMgbm90IiwKKyIgIHNwZWNpZmllZCwgYWNjb3VudHMgb24gdGhlIGxvY2FsIG1hY2hpbmUgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciIsCisiICBhY2NvdW50cyBpbiBEb21haW5zIHRvIHdoaWNoIHRoZSBsb2NhbCBtYWNoaW5lIGJlbG9uZ3MuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyIgIiwKKyJTRVQgSUtTIEhFTFBGSUxFIDxmaWxlbmFtZT4iLAorIiAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgZmlsZSB0byBiZSBkaXNwbGF5ZWQgaWYgdGhlIHVzZXIgdHlwZXMgSEVMUCIsCisiICAobm90IGZvbGxvd2VkIGJ5IGEgc3BlY2lmaWMgY29tbWFuZCBvciB0b3BpYyksIGluIHBsYWNlIG9mIHRoZSBidWlsdC1pbiIsCisiICB0b3AtbGV2ZWwgaGVscCB0ZXh0LiAgVGhlIGZpbGUgbmVlZCBub3QgZml0IG9uIG9uZSBzY3JlZW47IG1vcmUtcHJvbXB0aW5nIiwKKyIgIGlzIHVzZWQgaWYgdGhlIGZpbGUgaXMgbW9yZSB0aGFuIG9uZSBzY3JlZW4gbG9uZyBpZiBDT01NQU5EIE1PUkUtUFJPTVBUSU5HIiwKKyIgIGlzIE9OLCBhcyBpdCBpcyBieSBkZWZhdWx0LiIsCisiICIsCisiU0VUIElLUyBJTklURklMRSA8ZmlsZW5hbWU+IiwKKyIgIEV4ZWN1dGUgPGZpbGVuYW1lPiByYXRoZXIgdGhhbiB0aGUgbm9ybWFsIGluaXRpYWxpemF0aW9uIGZpbGUgZm9yIHJlYWwiLAorIiAgdXNlcnM7IHRoaXMgb3B0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFub255bW91cyB1c2Vycy4iLAorIiAiLAorIlNFVCBJS1MgTk8tSU5JVEZJTEUgeyBPTiwgT0ZGIH0iLAorIiAgRG8gbm90IGV4ZWN1dGUgYW4gaW5pdGlhbGl6YXRpb24gZmlsZSwgZXZlbiBpZiBhIHJlYWwgdXNlciBpcyBsb2dnaW5nIGluLiIsCisiICIsCisiU0VUIElLUyBTRVJWRVItT05MWSB7IE9OLCBPRkYgfSIsCisiICBJZiB0aGlzIG9wdGlvbiBpcyBpbmNsdWRlZCBvbiB0aGUgSUtTRCBjb21tYW5kIGxpbmUsIHRoZSBDbGllbnQgU2lkZSBTZXJ2ZXIiCissCisiICBjb25maWd1cmF0aW9uIGlzIGRpc2FibGVkLCBhbmQgdGhlIHVzZXIgd2lsbCBub3QgZ2V0IGEgVXNlcm5hbWU6IG9yIiwKKyIgIFBhc3N3b3JkOiBwcm9tcHQsIGFuZCB3aWxsIG5vdCBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgSUtTRCBjb21tYW5kIHByb21wdC4iLAorIiAgQSBGSU5JU0ggY29tbWFuZCBzZW50IHRvIHRoZSBJS1NEIHdpbGwgbG9nIGl0IG91dCBhbmQgY2xvc2UgdGhlIiwKKyIgIGNvbm5lY3Rpb24sIHJhdGhlciB0aGFuIHJldHVybmluZyBpdCB0byBpdHMgcHJvbXB0LiIsCisiICIsCisiU0VUIElLUyBUSU1FT1VUIDxudW1iZXI+IiwKKyIgIFRoaXMgc2V0cyBhIGxpbWl0IChpbiBzZWNvbmRzKSBvbiB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIGNsaWVudCBoYXMgdG8gbG9nIiwKKyIgIGluIG9uY2UgdGhlIGNvbm5lY3Rpb24gaXMgbWFkZS4gIElmIHN1Y2Nlc3NmdWwgbG9naW4gZG9lcyBub3Qgb2NjdXIgd2l0aGluIiwKKyIgIHRoZSBnaXZlbiBudW1iZXIgb2Ygc2Vjb25kcywgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLiAgVGhlIGRlZmF1bHQgdGltZW91dCIKKywKKyIgIGlzIDMwMCBzZWNvbmRzICg1IG1pbnV0ZXMpLiAgQSB2YWx1ZSBvZiAwIG9yIGxlc3MgaW5kaWNhdGVzIHRoZXJlIGlzIHRvIGJlIiwKKyIgIG5vIGxpbWl0LiIsCisiICIsCisiU0VUIElLUyBVU0VSRklMRSA8ZmlsZW5hbWU+IiwKKyNpZmRlZiBVTklYCisiICBUaGlzIGZpbGUgY29udGFpbnMgYSBsaXN0IG9mIGxvY2FsIHVzZXJuYW1lcyB0aGF0IGFyZSB0byBiZSBkZW5pZWQgYWNjZXNzIiwKKyIgIHRvIEludGVybmV0IEtlcm1pdCBTZXJ2aWNlLiAgVGhlIGRlZmF1bHQgaXMgL2V0Yy9mdHB1c2Vycy4gIFRoaXMgY2FuIGJlIHRoZSIKKywKKyIgIHNhbWUgZmlsZSB0aGF0IGlzIHVzZWQgYnkgd3VmdHBkLCBhbmQgdGhlIHN5bnRheCBpcyB0aGUgc2FtZTogb25lIHVzZXJuYW1lIiwKKyIgIHBlciBsaW5lOyBsaW5lcyBzdGFydGluZyB3aXRoIFwiI1wiIGFyZSBpZ25vcmVkLiAgVXNlIHRoaXMgb3B0aW9uIHRvIiwKKyIgIHNwZWNpZnkgdGhlIG5hbWUgb2YgYSBkaWZmZXJlbnQgZm9yYmlkZGVuLXVzZXIgZmlsZSwgb3IgdXNlIiwKKyIgIFwic2V0IGlrcyB1c2VyZmlsZSAvZGV2L251bGxcIiB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZSBpbiBjYXNlIHRoZXJlIGlzIGEiLAorIiAgIC9ldGMvZnRwdXNlcnMgZmlsZSBidXQgeW91IGRvbid0IHdhbnQgdG8gdXNlIGl0LiIsCisjZWxzZQorIiAgVGhpcyBmaWxlIGNvbnRhaW5zIGEgbGlzdCBvZiBsb2NhbCB1c2VybmFtZXMgdGhhdCBhcmUgdG8gYmUgZGVuaWVkIGFjY2VzcyIsCisiICB0byBJbnRlcm5ldCBLZXJtaXQgU2VydmljZS4gIFRoZSBzeW50YXggaXM6IG9uZSB1c2VybmFtZSBwZXIgbGluZTsgbGluZXMiLAorIiAgc3RhcnRpbmcgd2l0aCBcIiNcIiBhcmUgaWdub3JlZC4iLAorI2VuZGlmIC8qIFVOSVggKi8KKyIgIiwKKyJTRVQgSUtTIFhGRVJMT0cgeyBPTiwgT0ZGIH0iLAorI2lmZGVmIFVOSVgKKyIgIFdoZXRoZXIgYSBmaWxlLXRyYW5zZmVyIGxvZyBzaG91bGQgYmUga2VwdC4gIE9mZiBieSBkZWZhdWx0LiAgSWYgXCJvblwiLCIsCisiICBidXQgbm8gU0VUIElLU0QgWEZFUkZJTEUgY29tbWFuZCBpcyBnaXZlbiwgL3Zhci9sb2cvaWtzZC5sb2cgaXMgdXNlZC4iLAorI2Vsc2UKKyIgIFdoZXRoZXIgYSBmaWxlLXRyYW5zZmVyIGxvZyBzaG91bGQgYmUga2VwdC4gIE9mZiBieSBkZWZhdWx0LiIsCisjZW5kaWYgLyogVU5JWCAqLworIiAiLAorIlNFVCBJS1MgWEZFUkZJTEUgPGZpbGVuYW1lPiIsCisiICBVc2UgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSBhbiBpa3NkIGxvZyBmaWxlIG5hbWUuICBJZiB5b3UgaW5jbHVkZSB0aGlzIiwKKyIgIG9wdGlvbiwgaXQgaW1wbGllcyBTRVQgSUtTIFhGRVJGSUxFIE9OLiIsCisiIgorfTsKKyNlbmRpZiAvKiBOT0lLU0QgKi8KKworLyogIEQgTyBIIFMgRSBUICAtLSAgR2l2ZSBoZWxwIGZvciBTRVQgY29tbWFuZCAgKi8KKworaW50Citkb2hzZXQoeHgpIGludCB4eDsgeworICAgIGludCB4OworCisgICAgaWYgKHh4ID09IC0zKSByZXR1cm4oaG1zZ2EoaG1oc2V0KSk7CisgICAgaWYgKHh4IDwgMCkgcmV0dXJuKHh4KTsKKworI2lmZGVmIE5FV0ZUUAorICAgIGlmICh4eCA9PSBYWUZUUFgpCisgICAgICByZXR1cm4oZG9zZXRmdHBobHAoKSk7CisgICAgaWYgKHh4ID09IFhZR1BSKQorICAgICAgcmV0dXJuKGhtc2dhKGhteHlncHIpKTsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKworICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgIHN3aXRjaCAoeHgpIHsKKyNpZm5kZWYgTk9JS1NECisgICAgICBjYXNlIFhZSUtTOgorICAgICAgICByZXR1cm4oaG1zZ2EoaHNldGlrcykpOworI2VuZGlmIC8qIE5PSUtTRCAqLworCitjYXNlIFhZQVRUUjoKKyAgICByZXR1cm4oaG1zZ2EoaHNldGF0KSk7CisKK2Nhc2UgWFlCQUNLOgorICAgIHJldHVybihobXNnYShoc2V0YmtnKSk7CisKK2Nhc2UgWFlCRUxMOgorICAgIHJldHVybihobXNnYShobXh5YmVsKSk7CisKKyNpZmRlZiBPUzIKK2Nhc2UgWFlQUlRZOgorICAgIHJldHVybihobXNnKCJTRVQgUFJJT1JJVFkgeyBSRUdVTEFSLCBGT1JFR1JPVU5ELVNFUlZFUiwgVElNRS1DUklUSUNBTCB9XG5cCisgIFNwZWNpZmllcyBhdCB3aGljaCBwcmlvcml0eSBsZXZlbCB0aGUgY29tbXVuaWNhdGlvbiBhbmQgc2NyZWVuIHVwZGF0ZVxuXAorICB0aHJlYWRzIHNob3VsZCBvcGVyYXRlLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgRk9SRUdST1VORC1TRVJWRVIuIikpOworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgRFlOQU1JQworY2FzZSBYWUJVRjoKKyAgICByZXR1cm4oaG1zZ2EoaHNldGJ1ZikpOworI2VuZGlmIC8qIERZTkFNSUMgKi8KKworI2lmbmRlZiBOT0xPQ0FMCitjYXNlIFhZQ0FSUjoKKyAgICByZXR1cm4oaG1zZ2EoaHNldGNhcikpOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmbmRlZiBOT1NQTAorY2FzZSBYWUNBU0U6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIENBU0UgeyBPTiwgT0ZGIH1cblwKKyAgVGVsbHMgd2hldGhlciBhbHBoYWJldGljIGNhc2UgaXMgc2lnbmlmaWNhbnQgaW4gc3RyaW5nIGNvbXBhcmlzb25zXG5cCisgIGRvbmUgYnkgSU5QVVQsIElGLCBhbmQgb3RoZXIgY29tbWFuZHMuICBUaGlzIHNldHRpbmcgaXMgbG9jYWwgdG8gdGhlXG5cCisgIGN1cnJlbnQgbWFjcm8gb3IgY29tbWFuZCBmaWxlLCBhbmQgaW5oZXJpdGVkIGJ5IHN1Ym9yZGluYXRlcy4iKSk7CisKKyNlbmRpZiAvKiBOT1NQTCAqLworCitjYXNlIFhZQ01EOgorICAgIHJldHVybihobXNnYShoc2V0Y21kKSk7CisKK2Nhc2UgWFlJRkQ6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIElOQ09NUExFVEUgeyBESVNDQVJELCBLRUVQIH1cblwKKyAgV2hldGhlciB0byBkaXNjYXJkIG9yIGtlZXAgaW5jb21wbGV0ZWx5IHJlY2VpdmVkIGZpbGVzLCBkZWZhdWx0IGlzIEtFRVAuIikpOworCisjaWZuZGVmIE5PU1BMCitjYXNlIFhZSU5QVToKKyAgICByZXR1cm4oaG1zZ2EoaHh5aW5wKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworY2FzZSBYWUNIS1Q6CisgICAgcmV0dXJuKGhtc2dhKGhteHljaGt0KSk7CisKKyNpZm5kZWYgTk9TUEwKK2Nhc2UgWFlDT1VOOgorICAgIHJldHVybihobXNnKCJTeW50YXg6ICBTRVQgQ09VTlQgbnVtYmVyXG5cCisgRXhhbXBsZTogU0VUIENPVU5UIDVcblwKKyAgU2V0IHVwIGEgbG9vcCBjb3VudGVyLCBmb3IgdXNlIHdpdGggSUYgQ09VTlQuICBMb2NhbCB0byBjdXJyZW50IG1hY3JvXG5cCisgIG9yIGNvbW1hbmQgZmlsZSwgaW5oZXJpdGVkIGJ5IHN1Ym9yZGluYXRlIG1hY3JvcyBhbmQgY29tbWFuZCBmaWxlcy4iKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworY2FzZSBYWURFQlU6CisgICAgcmV0dXJuKGhtc2dhKGhteHlkZWIpKTsKKworY2FzZSBYWURGTFQ6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIERFRkFVTFQgZGlyZWN0b3J5XG5cCisgIENoYW5nZSBkaXJlY3RvcnkuICBFcXVpdmFsZW50IHRvIENEIGNvbW1hbmQuIikpOworCitjYXNlIFhZREVMQToKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBTRVQgREVMQVkgbnVtYmVyXG5cCisgIE51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHNlbmRpbmcgZmlyc3QgcGFja2V0IGFmdGVyIFNFTkQgY29tbWFuZC4iKSk7CisKKyNpZm5kZWYgTk9ESUFMCitjYXNlIFhZRElBTDoKKyAgICByZXR1cm4oaG1zZ2EoaG14eWRpYWwpKTsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworI2lmZGVmIFVOSVgKK2Nhc2UgWFlTVVNQOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFNFVCBTVVNQRU5EIHsgT0ZGLCBPTiB9XG5cCisgIERpc2FibGVzIFNVU1BFTkQgY29tbWFuZCwgc3VzcGVuZCBzaWduYWxzLCBhbmQgPGVzYy1jaGFyPlogZHVyaW5nIENPTk5FQ1QuIikKKyAgICAgICAgICAgKTsKKyNlbmRpZgorCisjaWZuZGVmIE5PU0NSSVBUCitjYXNlIFhZU0NSSToKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBTRVQgU0NSSVBUIEVDSE8geyBPRkYsIE9OIH1cblwKKyAgRGlzYWJsZXMvRW5hYmxlcyBlY2hvaW5nIG9mIFNDUklQVCBjb21tYW5kIG9wZXJhdGlvbi4iKSk7CisjZW5kaWYgLyogTk9TQ1JJUFQgKi8KKworY2FzZSBYWVRBS0U6CisgICAgcmV0dXJuKGhtc2dhKGh4eXRhaykpOworCisjaWZuZGVmIE5PTE9DQUwKK2Nhc2UgWFlURVJNOgorICAgIHJldHVybihobXNnYShoeHl0ZXJtKSk7CisKK2Nhc2UgWFlEVVBMOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFNFVCBEVVBMRVggeyBGVUxMLCBIQUxGIH1cblwKKyAgRHVyaW5nIENPTk5FQ1Q6IEZVTEwgbWVhbnMgcmVtb3RlIGhvc3QgZWNob2VzLCBIQUxGIG1lYW5zIEtlcm1pdFxuXAorICBkb2VzIGl0cyBvd24gZWNob2luZy4iKSk7CisKK2Nhc2UgWFlMQ0xFOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFNFVCBMT0NBTC1FQ0hPIHsgT0ZGLCBPTiB9XG5cCisgIER1cmluZyBDT05ORUNUOiBPRkYgbWVhbnMgcmVtb3RlIGhvc3QgZWNob2VzLCBPTiBtZWFucyBLZXJtaXRcblwKKyAgZG9lcyBpdHMgb3duIGVjaG9pbmcuICBTeW5vbnltIGZvciBTRVQgRFVQTEVYIHsgRlVMTCwgSEFMRiB9LiIpKTsKKworY2FzZSBYWUVTQzoKKyAgICByZXR1cm4oaG1zZ2EoaHh5ZXNjKSk7ICAgICAgICAgICAgICAvKiBTRVQgRVNDQVBFICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCitjYXNlIFhZUFJUUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFBSSU5URVIgKi8KKyAgICByZXR1cm4oaG1zZ2EoaHh5cHJ0cikpOworCisjaWZkZWYgT1MyCisjaWZkZWYgQlBSSU5UCitjYXNlIFhZQkRDUDogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0VUIEJQUklOVEVSICovCisgICAgcmV0dXJuKGhtc2dhKGh4eWJwcnRyKSk7CisjZW5kaWYgLyogQlBSSU5UICovCisjZW5kaWYgLyogT1MyICovCisKK2Nhc2UgWFlFWElUOgorICAgIHJldHVybihobXNnYShoeHlleGl0KSk7CisKK2Nhc2UgWFlGSUxFOgorICAgIHJldHVybihobXNnYShobXh5ZikpOworCitjYXNlIFhZRkxPVzoKKyAgICByZXR1cm4oaG1zZ2EoaG14eWZsbykpOworCitjYXNlIFhZSEFORDoKKyAgIHJldHVybihobXNnYShobXh5aHNoKSk7CisKKyNpZmRlZiBORVRDT05OCisKK2Nhc2UgWFlIT1NUOgorICAgIHJldHVybihobXNnYShoeHlob3N0KSk7CisKK2Nhc2UgWFlORVQ6CisgICAgcmV0dXJuKGhtc2dhKGh4eW5ldCkpOworCisjaWZuZGVmIE5PVENQT1BUUworI2lmZGVmIFNPTF9TT0NLRVQKK2Nhc2UgWFlUQ1A6CisgICAgcmV0dXJuKGhtc2dhKGh4eXRjcCkpOworI2VuZGlmIC8qIFNPTF9TT0NLRVQgKi8KKyNlbmRpZiAvKiBOT1RDUE9QVFMgKi8KKworI2lmZGVmIEFOWVgyNQorY2FzZSBYWVgyNToKKyAgICByZXR1cm4oaG1zZ2EoaHh5eDI1KSk7CisKKyNpZm5kZWYgSUJNWDI1CitjYXNlIFhZUEFEOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFNFVCBQQUQgbmFtZSB2YWx1ZVxuXAorU2V0IGEgUEFEIFguMyBwYXJhbWV0ZXIgd2l0aCBhIGRlc2lyZWQgdmFsdWUuIikpOworI2VuZGlmIC8qIElCTVgyNSAqLworI2VuZGlmIC8qIEFOWVgyNSAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmbmRlZiBOT1NQTAorY2FzZSBYWU9VVFA6CisgICAgcmV0dXJuKGhtc2dhKGh4eW91dCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9TRVRLRVkKK2Nhc2UgWFlLRVk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgS0VZICovCisgICAgcmV0dXJuKGhtc2dhKGhtaHNrZXkpKTsKKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworCisjaWZuZGVmIE5PQ1NFVFMKK2Nhc2UgWFlMQU5HOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFNFVCBMQU5HVUFHRSBuYW1lXG5cCisgIFNlbGVjdHMgbGFuZ3VhZ2Utc3BlY2lmaWMgdHJhbnNsYXRpb24gcnVsZXMgZm9yIHRleHQtbW9kZSBmaWxlIHRyYW5zZmVycy5cblwKKyAgVXNlZCB3aXRoIFNFVCBGSUxFIENIQVJBQ1RFUi1TRVQgYW5kIFNFVCBUUkFOU0ZFUiBDSEFSQUNURVItU0VUIHdoZW4gb25lXG5cCisgIG9mIHRoZXNlIGlzIEFTQ0lJLiIpKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisKK2Nhc2UgWFlMSU5FOgorICAgIHByaW50ZigiXG5TeW50YXg6IFNFVCBMSU5FIChvciBTRVQgUE9SVCkgWyBzd2l0Y2hlcyBdIFsgZGV2aWNlbmFtZSBdXG5cCisgIFNlbGVjdHMgYSBzZXJpYWwtcG9ydCBkZXZpY2UgdG8gdXNlIGZvciBtYWtpbmcgY29ubmVjdGlvbnMuXG4iKTsKKyNpZmRlZiBPUzIKKyNpZmRlZiBOVAorICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoCisiICBZb3UgbWF5IGFjY2VzcyBjb21tdW5pY2F0aW9uIHBvcnRzIGJ5IHRoZSB0cmFkaXRpb25hbCBcIkRPU1wiIHBvcnQgbmFtZVxuIik7CisgICAgcHJpbnRmKAorIiAgKGUuZy4gU0VUIFBPUlQgQ09NMSkgb3IgYnkgdGhlIE1pY3Jvc29mdCBUZWxlcGhvbnkgbW9kZW0gbmFtZSBmcm9tIHRoZVxuIik7CisgICAgcHJpbnRmKAorIiAgTW9kZW1zIGZvbGRlciBvZiB0aGUgQ29udHJvbCBQYW5lbCAoZS5nLiBTRVQgUE9SVCBUQVBJKS4gSWYgb25lIG1ldGhvZFxuIik7CisgICAgcHJpbnRmKCIgIGRvZXNuJ3Qgd29yaywgdHJ5IHRoZSBvdGhlci5cblxuIik7CisjZW5kaWYgLyogTlQgKi8KKyNlbHNlICAvKiBPUzIgKi8KKyAgICBwcmludGYoIiAgVHlwaWNhbCBkZXZpY2UgbmFtZSBmb3IgdGhpcyBwbGF0Zm9ybTogJXMuXG4iLHR0Z3RwbigpKTsKKyAgICBwcmludGYoIiAgVGhlIGRlZmF1bHQgZGV2aWNlIG5hbWUgaXMgJXMgKGkuZS4gbm9uZSkuXG4iLGRmdHR5KTsKKyAgICBpZiAoIWRmbG9jKSB7CisgICAgICAgIHByaW50ZigKKyIgIElmIHlvdSBkbyBub3QgZ2l2ZSBhIFNFVCBMSU5FIGNvbW1hbmQgb3IgaWYgeW91IGdpdmUgYSBTRVQgTElORSBjb21tYW5kXG4iKTsKKyAgICAgICAgcHJpbnRmKAorIiAgd2l0aCBubyBkZXZpY2UgbmFtZSwgb3IgaWYgeW91IHNwZWNpZnkgJXMgYXMgdGhlIGRldmljZSBuYW1lLFxuIixkZnR0eSk7CisgICAgICAgIHByaW50ZigKKyIgIEtlcm1pdCB3aWxsIGJlIGluIFwicmVtb3RlIG1vZGVcIiwgc3VpdGFibGUgZm9yIHVzZSBvbiB0aGUgZmFyIGVuZCBvZiBhXG4iKTsKKyAgICAgICAgcHJpbnRmKAorIiAgY29ubmVjdGlvbiwgZS5nLiBhcyB0aGUgZmlsZS10cmFuc2ZlciBwYXJ0bmVyIG9mIHlvdXIgZGVza3RvcCBjb21tdW5pY2F0aW9uXAorXG4iKTsKKyAgICAgICAgcHJpbnRmKAorIiAgc29mdHdhcmUuICBJZiB5b3UgU0VUIExJTkUgdG8gYSBzcGVjaWZpYyBkZXZpY2Ugb3RoZXIgdGhhbiAlcyxcbiIsIGRmdHR5KTsKKyAgICAgICAgcHJpbnRmKAorIiAgS2VybWl0IGlzIGluIFwibG9jYWwgbW9kZVwiLCBzdWl0YWJsZSBmb3IgbWFraW5nIGEgY29ubmVjdGlvbiB0byBhbm90aGVyXG4iCisgICAgICAgICAgICAgICk7CisgICAgICAgIHByaW50ZigKKyIgIGNvbXB1dGVyLiAgU0VUIExJTkUgYWxvbmUgcmVzZXRzIEtlcm1pdCB0byByZW1vdGUgbW9kZS5cbiIpOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgcHJpbnRmKAorIiAgVG8gdXNlIGEgbW9kZW0gdG8gZGlhbCBvdXQsIGZpcnN0IFNFVCBNT0RFTSBUWVBFIChlLmcuLCB0byBVU1IpLCB0aGVuXG4iKTsKKyAgICBwcmludGYoCisjaWZkZWYgT1MyCisiICBTRVQgUE9SVCBDT014IChvciBTRVQgUE9SVCBUQVBJKSwgU0VUIFNQRUVELCB0aGVuIGdpdmUgYSBESUFMIGNvbW1hbmQuXG4iKTsKKyNlbHNlCisiICBTRVQgTElORSB4eHgsIHRoZW4gU0VUIFNQRUVELCB0aGVuIGdpdmUgYSBESUFMIGNvbW1hbmQuXG4iKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBwcmludGYoCisjaWZkZWYgT1MyCisiICBGb3IgZGlyZWN0IG51bGwtbW9kZW0gY29ubmVjdGlvbnMgdXNlIFNFVCBNT0RFTSBUWVBFIE5PTkUsIFNFVCBQT1JUIENPTXgsXG4iCisjZWxzZQorIiAgRm9yIGRpcmVjdCBudWxsLW1vZGVtIGNvbm5lY3Rpb25zLCB1c2UgU0VUIE1PREVNIFRZUEUgTk9ORSwgU0VUIExJTkUgeHh4LFxuIgorI2VuZGlmIC8qIE9TMiAqLworICAgICk7CisgICAgcHJpbnRmKAorIiAgdGhlbiBTRVQgRkxPVywgU0VUIFNQRUVELCBhbmQgQ09OTkVDVC5cbiIpOworICAgIHByaW50ZigKKyJcbk9wdGlvbmFsIHN3aXRjaGVzOlxuXAorICAvQ09OTkVDVCAtIEVudGVyIENPTk5FQ1QgbW9kZSBhdXRvbWF0aWNhbGx5IGlmIFNFVCBMSU5FIHN1Y2NlZWRzLlxuIik7CisgICAgcHJpbnRmKAorIiAgL1NFUlZFUiAgLSBFbnRlciBzZXJ2ZXIgbW9kZSBhdXRvbWF0aWNhbGx5IGlmIFNFVCBMSU5FIHN1Y2NlZWRzLlxuIik7CisjaWZkZWYgVk1TCisgICAgcHJpbnRmKAorIiAgL1NIQVJFICAgLSBPcGVuIHRoZSBkZXZpY2UgaW4gc2hhcmVkIG1vZGUuXG4iKTsKKyAgICBwcmludGYoCisiICAvTk9TSEFSRSAtIE9wZW4gdGhlIGRldmljZSBpbiBleGNsdXNpdmUgbW9kZS5cbiIpOworI2VuZGlmIC8qIFZNUyAqLworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoCisiQWxzbyBzZWUgSEVMUCBTRVQgTU9ERU0sIEhFTFAgU0VUIERJQUwsIEhFTFAgU0VUIFNQRUVELCBIRUxQIFNFVCBGTE9XLlxuIik7CisgICAgcmV0dXJuKDApOworCisjaWZuZGVmIE5PU1BMCitjYXNlIFhZTUFDUjoKKyAgICByZXR1cm4oaG1zZ2EoaHh5bWFjcikpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9ESUFMCitjYXNlIFhZTU9ETToKKyAgICByZXR1cm4oaG1zZ2EoaHh5bW9kbSkpOworI2VuZGlmIC8qIE5PRElBTCAqLworCitjYXNlIFhZUEFSSToKKyAgICByZXR1cm4oaG1zZ2EoaHh5cGFyaSkpOworCitjYXNlIFhZUFJPTToKKyAgICByZXR1cm4oaG1zZ2EoaG14eXBybSkpOworCitjYXNlIFhZUVVJRToKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBTRVQgUVVJRVQge09OLCBPRkZ9XG5cCisgIE5vcm1hbGx5IE9GRi4gIE9OIGRpc2FibGVzIG1vc3QgaW5mb3JtYXRpb24gbWVzc2FnZXMgZHVyaW5nIGludGVyYWN0aXZlXG5cCisgIG9wZXJhdGlvbi4iKSk7CisKKyNpZmRlZiBDS19TUEVFRAorY2FzZSBYWVFDVEw6CisgICAgcmV0dXJuKGhtc2dhKGhteHlxY3RsKSk7CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKworY2FzZSBYWVJFVFI6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIFJFVFJZIG51bWJlclxuXAorICBJbiBLZXJtaXQgcHJvdG9jb2wgZmlsZSB0cmFuc2ZlcnM6IEhvdyBtYW55IHRpbWVzIHRvIHJldHJhbnNtaXQgYVxuXAorICBwYXJ0aWN1bGFyIHBhY2tldCBiZWZvcmUgZ2l2aW5nIHVwOyAwID0gbm8gbGltaXQuIikpOworCisjaWZuZGVmIE5PTE9DQUwKK2Nhc2UgWFlTRVNTOgorI2lmZGVmIFVOSVgKKyAgICByZXR1cm4oaG1zZygKKyJTeW50YXg6IFNFVCBTRVNTSU9OLUxPRyB7IEJJTkFSWSwgREVCVUcsIFRFWFQsIFRJTUVTVEFNUEVELVRFWFQgfVxuXAorICBJZiBCSU5BUlksIHJlY29yZCBhbGwgQ09OTkVDVCBjaGFyYWN0ZXJzIGluIHNlc3Npb24gbG9nLiAgSWYgVEVYVCwgc3RyaXBcblwKKyAgb3V0IENSLCBOVUwsIGFuZCBYT04vWE9GRiBjaGFyYWN0ZXJzLiAgREVCVUcgaXMgdGhlIHNhbWUgYXMgQklOQVJZIGJ1dFxuXAorICBhbHNvIGluY2x1ZGVzIFRlbG5ldCBuZWdvdGlhdGlvbnMgb24gVENQL0lQIGNvbm5lY3Rpb25zLiIpKTsKKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICByZXR1cm4oaG1zZygKKyJTeW50YXg6IFNFVCBTRVNTSU9OLUxPRyB7IEJJTkFSWSwgREVCVUcsIFRFWFQsIFRJTUVTVEFNUEVELVRFWFQgfVxuXAorICBJZiBCSU5BUlksIHJlY29yZCBhbGwgQ09OTkVDVCBjaGFyYWN0ZXJzIGluIHNlc3Npb24gbG9nLiAgSWYgVEVYVCwgc3RyaXBcblwKKyAgb3V0IENSLCBOVUwsIGFuZCBYT04vWE9GRiBjaGFyYWN0ZXJzLiAgREVCVUcgaXMgdGhlIHNhbWUgYXMgQklOQVJZIGJ1dFxuXAorICBhbHNvIGluY2x1ZGVzIFRlbG5ldCBuZWdvdGlhdGlvbnMgb24gVENQL0lQIGNvbm5lY3Rpb25zLiIpKTsKKyNlbHNlCisjaWZkZWYgU1RSQVRVUworICAgIHJldHVybihobXNnKAorIlN5bnRheDogU0VUIFNFU1NJT04tTE9HIHsgQklOQVJZLCBERUJVRywgVEVYVCwgVElNRVNUQU1QRUQtVEVYVCB9XG5cCisgIElmIEJJTkFSWSwgcmVjb3JkIGFsbCBDT05ORUNUIGNoYXJhY3RlcnMgaW4gc2Vzc2lvbiBsb2cuICBJZiBURVhULCBzdHJpcFxuXAorICBvdXQgQ1IsIE5VTCwgYW5kIFhPTi9YT0ZGIGNoYXJhY3RlcnMuICBERUJVRyBpcyB0aGUgc2FtZSBhcyBCSU5BUlkgYnV0XG5cCisgIGFsc28gaW5jbHVkZXMgVGVsbmV0IG5lZ290aWF0aW9ucyBvbiBUQ1AvSVAgY29ubmVjdGlvbnMuIikpOworI2Vsc2UKKyNpZmRlZiBBTUlHQQorICAgIHJldHVybihobXNnKAorIlN5bnRheDogU0VUIFNFU1NJT04tTE9HIHsgQklOQVJZLCBERUJVRywgVEVYVCwgVElNRVNUQU1QRUQtVEVYVCB9XG5cCisgIElmIEJJTkFSWSwgcmVjb3JkIGFsbCBDT05ORUNUIGNoYXJhY3RlcnMgaW4gc2Vzc2lvbiBsb2cuICBJZiBURVhULCBzdHJpcFxuXAorICBvdXQgQ1IsIE5VTCwgYW5kIFhPTi9YT0ZGIGNoYXJhY3RlcnMuICBERUJVRyBpcyB0aGUgc2FtZSBhcyBCSU5BUlkgYnV0XG5cCisgIGFsc28gaW5jbHVkZXMgVGVsbmV0IG5lZ290aWF0aW9ucyBvbiBUQ1AvSVAgY29ubmVjdGlvbnMuIikpOworI2Vsc2UKKyNpZmRlZiBHRU1ET1MKKyAgICByZXR1cm4oaG1zZygKKyJTeW50YXg6IFNFVCBTRVNTSU9OLUxPRyB7IEJJTkFSWSwgREVCVUcsIFRFWFQsIFRJTUVTVEFNUEVELVRFWFQgfVxuXAorICBJZiBCSU5BUlksIHJlY29yZCBhbGwgQ09OTkVDVCBjaGFyYWN0ZXJzIGluIHNlc3Npb24gbG9nLiAgSWYgVEVYVCwgc3RyaXBcblwKKyAgb3V0IENSLCBOVUwsIGFuZCBYT04vWE9GRiBjaGFyYWN0ZXJzLiAgREVCVUcgaXMgdGhlIHNhbWUgYXMgQklOQVJZIGJ1dFxuXAorICBhbHNvIGluY2x1ZGVzIFRlbG5ldCBuZWdvdGlhdGlvbnMgb24gVENQL0lQIGNvbm5lY3Rpb25zLiIpKTsKKyNlbHNlCisjaWZkZWYgT1MyCisgICAgcmV0dXJuKGhtc2coCisiU3ludGF4OiBTRVQgU0VTU0lPTi1MT0cgeyBCSU5BUlksIERFQlVHLCBURVhULCBUSU1FU1RBTVBFRC1URVhUIH1cblwKKyAgSWYgQklOQVJZLCByZWNvcmQgYWxsIENPTk5FQ1QgY2hhcmFjdGVycyBpbiBzZXNzaW9uIGxvZy4gIElmIFRFWFQsIHN0cmlwXG5cCisgIG91dCBOVUwgYW5kIFhPTi9YT0ZGIGNoYXJhY3RlcnMuICBERUJVRyBpcyB0aGUgc2FtZSBhcyBCSU5BUlkgYnV0XG5cCisgIGFsc28gaW5jbHVkZXMgVGVsbmV0IG5lZ290aWF0aW9ucyBvbiBUQ1AvSVAgY29ubmVjdGlvbnMuIikpOworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICByZXR1cm4oaG1zZygKKyJTeW50YXg6IFNFVCBTRVNTSU9OLUxPRyB7IEJJTkFSWSwgREVCVUcsIFRFWFQsIFRJTUVTVEFNUEVELVRFWFQgfVxuXAorICBJZiBCSU5BUlksIHJlY29yZCBhbGwgQ09OTkVDVCBjaGFyYWN0ZXJzIGluIHNlc3Npb24gbG9nLiAgSWYgVEVYVCwgc3RyaXBcblwKKyAgb3V0IENSLCBOVUwsIGFuZCBYT04vWE9GRiBjaGFyYWN0ZXJzLiAgREVCVUcgaXMgdGhlIHNhbWUgYXMgQklOQVJZIGJ1dFxuXAorICBhbHNvIGluY2x1ZGVzIFRlbG5ldCBuZWdvdGlhdGlvbnMgb24gVENQL0lQIGNvbm5lY3Rpb25zLiIpKTsKKyNlbHNlCisjaWZkZWYgT1NLCisgICAgcmV0dXJuKGhtc2coCisiU3ludGF4OiBTRVQgU0VTU0lPTi1MT0cgeyBCSU5BUlksIERFQlVHLCBURVhULCBUSU1FU1RBTVBFRC1URVhUIH1cblwKKyAgSWYgQklOQVJZLCByZWNvcmQgYWxsIENPTk5FQ1QgY2hhcmFjdGVycyBpbiBzZXNzaW9uIGxvZy4gIElmIFRFWFQsIHN0cmlwXG5cCisgIG91dCBMRiwgTlVMIGFuZCBYT04vWE9GRiBjaGFyYWN0ZXJzLiIpKTsKKyNlbHNlCisjaWZkZWYgTUFDCisgICAgcmV0dXJuKGhtc2coCisiU3ludGF4OiBTRVQgU0VTU0lPTi1MT0cgeyBCSU5BUlksIERFQlVHLCBURVhULCBUSU1FU1RBTVBFRC1URVhUIH1cblwKKyAgSWYgQklOQVJZLCByZWNvcmQgYWxsIENPTk5FQ1QgY2hhcmFjdGVycyBpbiBzZXNzaW9uIGxvZy4gIElmIFRFWFQsIHN0cmlwXG5cCisgIG91dCBMRiwgTlVMIGFuZCBYT04vWE9GRiBjaGFyYWN0ZXJzLiIpKTsKKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBHRU1ET1MgKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworCitjYXNlIFhZU1BFRToKKyNpZmRlZiBPUzIKKworICAgIHJldHVybihobXNnKCJTeW50YXg6IFNFVCBTUEVFRCBudW1iZXJcblwKKyAgU3BlZWQgZm9yIHNlcmlhbC1wb3J0IGNvbW11bmljYXRpb24gZGV2aWNlIHNwZWNpZmllZCBpbiBtb3N0IHJlY2VudFxuXAorICBTRVQgUE9SVCBjb21tYW5kLCBpbiBiaXRzIHBlciBzZWNvbmQuICBUeXBlIFNFVCBTUEVFRCA/IGZvciBhIGxpc3Qgb2ZcblwKKyAgcG9zc2libGUgc3BlZWRzLiIpKTsKKyNlbHNlCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIFNQRUVEIG51bWJlclxuXAorICBTcGVlZCBmb3Igc2VyaWFsLXBvcnQgY29tbXVuaWNhdGlvbiBkZXZpY2Ugc3BlY2lmaWVkIGluIG1vc3QgcmVjZW50XG5cCisgIFNFVCBMSU5FIGNvbW1hbmQsIGluIGJpdHMgcGVyIHNlY29uZC4gIFR5cGUgU0VUIFNQRUVEID8gZm9yIGEgbGlzdCBvZlxuXAorICBwb3NzaWJsZSBzcGVlZHMuICBIYXMgbm8gZWZmZWN0IG9uIGpvYidzIGNvbnRyb2xsaW5nIHRlcm1pbmFsLiIpKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZm5kZWYgTk9YRkVSCitjYXNlIFhZUkVDVjoKKyAgICByZXR1cm4oaG1zZ2EoaHh5cmN2KSk7CitjYXNlIFhZU0VORDoKKyAgICByZXR1cm4oaG1zZ2EoaHh5c25kKSk7CitjYXNlIFhZUkVQVDoKKyAgICByZXR1cm4oaG1zZ2EoaHh5cnB0KSk7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9TRVJWRVIKK2Nhc2UgWFlTRVJWOgorICAgIHJldHVybihobXNnYShoc2V0c3J2KSk7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKworI2lmZGVmIFROQ09ERQorY2FzZSBYWVRFTDoKKyAgICByZXR1cm4oaG1zZ2EoaHh5dGVsKSk7CisKK2Nhc2UgWFlURUxPUDoKKyAgICByZXR1cm4oaG1zZ2EoaHh5dG9wdCkpOworI2VuZGlmIC8qIFROQ09ERSAqLworCisjaWZuZGVmIE5PWE1JVAorY2FzZSBYWVhNSVQ6CisgICAgcmV0dXJuKGhtc2dhKGhzZXR4bWl0KSk7CisjZW5kaWYgLyogTk9YTUlUICovCisKKyNpZm5kZWYgTk9DU0VUUworY2FzZSBYWVVOQ1M6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIFVOS05PV04tQ0hBUi1TRVQgYWN0aW9uXG5cCisgIERJU0NBUkQgKGRlZmF1bHQpIG1lYW5zIHJlamVjdCBhbnkgYXJyaXZpbmcgZmlsZXMgZW5jb2RlZCBpbiB1bmtub3duXG5cCisgIGNoYXJhY3RlciBzZXRzLiAgS0VFUCBtZWFucyB0byBhY2NlcHQgdGhlbSBhbnl3YXkuIikpOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmZGVmIFVOSVgKK2Nhc2UgWFlXSUxEOgorICAgIHJldHVybihobXNnYShoeHl3aWxkKSk7CisjZW5kaWYgLyogVU5JWCAqLworCisjaWZuZGVmIE5PWEZFUgorY2FzZSBYWVdJTkQ6CisgICAgcmV0dXJuKGhtc2dhKGh4eXdpbmQpKTsKK2Nhc2UgWFlYRkVSOgorICAgIHJldHVybihobXNnYShoeHl4ZmVyKSk7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMk1PVVNFCitjYXNlIFhZTU9VU0U6CisgICAgcmV0dXJuKGhtc2dhKGh4eW1vdXNlKSk7CisjZW5kaWYgLyogT1MyTU9VU0UgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKK2Nhc2UgWFlBTFJNOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFNFVCBBTEFSTSBbIHsgc2Vjb25kcywgaGg6bW06c3MgfSBdXG5cCisgIE51bWJlciBvZiBzZWNvbmRzIGZyb20gbm93LCBvciB0aW1lIG9mIGRheSwgYWZ0ZXIgd2hpY2ggSUYgQUxBUk1cblwKKyAgd2lsbCBzdWNjZWVkLiAgMCwgb3Igbm8gdGltZSBhdCBhbGwsIG1lYW5zIG5vIGFsYXJtLiIpKTsKKworY2FzZSBYWVBST1RPOgorICAgIHJldHVybihobXNnYShoeHl4eXopKTsKKworI2lmZGVmIENLX1NQRUVECitjYXNlIFhZUFJFRklYOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFNFVCBQUkVGSVhJTkcgeyBBTEwsIENBVVRJT1VTLCBNSU5JTUFMIH1cblwKKyAgXAorU2VsZWN0cyB0aGUgZGVncmVlIG9mIGNvbnRyb2wtY2hhcmFjdGVyIHByZWZpeGluZy4gIEFsc28gc2VlIEhFTFAgU0VUIENPTlRST0wuIgorKSk7CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKworI2lmZGVmIE9TMgorY2FzZSBYWUxPR0lOOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFNFVCBMT0dJTiB7IFVTRVJJRCwgUEFTU1dPUkQsIFBST01QVCB9IDx0ZXh0PlxuXAorICBQcm92aWRlcyBhY2Nlc3MgaW5mb3JtYXRpb24gZm9yIHVzZSBieSBsb2dpbiBzY3JpcHRzLiIpKTsKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBOT1NQTAorY2FzZSBYWVRNUERJUjoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBTRVQgVEVNUC1ESVJFQ1RPUlkgWyA8ZGlyZWN0b3J5LW5hbWU+IF1cblwKKyAgT3ZlcnJpZGVzIGF1dG9tYXRpYyBhc3NpZ25tZW50IG9mIFxcdih0bXBkaXIpIHZhcmlhYmxlLiIpKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZkZWYgT1MyCitjYXNlIFhZVElUTEU6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIFRJVExFIDx0ZXh0PlxuXAorICBTZXRzIHdpbmRvdyB0aXRsZSB0byB0ZXh0IGluc3RlYWQgb2YgdXNpbmcgY3VycmVudCBob3N0L3BvcnQgbmFtZS4iKSk7CisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgTk9QVVNICisjaWZuZGVmIE5PRlJJTExTCitjYXNlIFhZRURJVDoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBTRVQgRURJVE9SIHBhdGhuYW1lIFsgb3B0aW9ucyBdXG5cCisgIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB5b3VyIHByZWZlcnJlZCBlZGl0b3IsIHBsdXMgYW55IGNvbW1hbmQtbGluZVxuXAorICBvcHRpb25zLiAgU0hPVyBFRElUT1IgZGlzcGxheXMgaXQuIikpOworI2VuZGlmIC8qIE5PRlJJTExTICovCisjZW5kaWYgLyogTk9QVVNIICovCisKKyNpZmRlZiBCUk9XU0VSCitjYXNlIFhZQlJPV1NFOgorI2lmZGVmIE5UCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIEJST1dTRVIgWyBwYXRobmFtZSBbIG9wdGlvbnMgXSBdXG5cCisgIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB5b3VyIHByZWZlcnJlZCBicm93c2VyIHBsdXMgYW55IGNvbW1hbmQtbGluZVxuXAorICBvcHRpb25zLiAgU0hPVyBCUk9XU0VSIGRpc3BsYXlzIGl0LiAgT21pdCBwYXRobmFtZSBhbmQgb3B0aW9ucyB0byB1c2VcblwKKyAgU2hlbGxFeGVjdXRlLiIpKTsKKyNlbHNlCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIEJST1dTRVIgWyBwYXRobmFtZSBbIG9wdGlvbnMgXSBdXG5cCisgIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB5b3VyIHByZWZlcnJlZCBicm93c2VyIHBsdXMgYW55IGNvbW1hbmQtbGluZVxuXAorICBvcHRpb25zLiAgU0hPVyBCUk9XU0VSIGRpc3BsYXlzIGl0LiIpKTsKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIEJST1dTRVIgKi8KKworI2lmZGVmIENLX1RBUEkKK2Nhc2UgWFlUQVBJOgorICAgIHJldHVybihobXNnYShoeHl0YXBpKSk7CisjZW5kaWYgLyogQ0tfVEFQSSAqLworCisjaWZkZWYgTlQKK2Nhc2UgWFlXSU45NToKKyAgICByZXR1cm4oaG1zZ2EoaHh5d2luOTUpKTsKKyNlbmRpZiAvKiBOVCAqLworCisjaWZuZGVmIE5PU1BMCitjYXNlIFhZRlVOQzoKKyAgICByZXR1cm4oaG1zZ2EoaHh5ZnVuYykpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorY2FzZSBYWUFVVEg6CisgICAgcmV0dXJuKGhtc2dhKGhteHlhdXRoKSk7CisjZWxzZSAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX1NTTAorY2FzZSBYWUFVVEg6CisgICAgcmV0dXJuKGhtc2dhKGhteHlhdXRoKSk7CisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKworI2lmZGVmIEJST1dTRVIKK2Nhc2UgWFlGVFA6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIEZUUCBbIHBhdGhuYW1lIFsgb3B0aW9ucyBdIF1cblwKKyAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHlvdXIgZnRwIGNsaWVudCwgcGx1cyBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuXG5cCisgIFNIT1cgRlRQIGRpc3BsYXlzIGl0LiIpKTsKKyNlbmRpZiAvKiBCUk9XU0VSICovCisKK2Nhc2UgWFlTTEVFUDoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBTRVQgU0xFRVAgQ0FOQ0VMTEFUSU9OIHsgT04sIE9GRiB9XG5cCisgIFRlbGxzIHdoZXRoZXIgU0xFRVAgKFBBVVNFKSBvciBXQUlUIGNvbW1hbmRzIGNhbiBiZSBpbnRlcnJ1cHRlZCBmcm9tIHRoZVxuXAorICBrZXlib2FyZDsgT04gYnkgZGVmYXVsdC4iKSk7CisKK2Nhc2UgWFlDRDoKKyAgICByZXR1cm4oaG1zZ2EoaG14eWNkKSk7CisKK2Nhc2UgWFlTRVJJQUw6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIFNFUklBTCBkcHNcblwKKyAgZCBpcyBkYXRhIGxlbmd0aCBpbiBiaXRzLCA3IG9yIDg7IHAgaXMgZmlyc3QgbGV0dGVyIG9mIHBhcml0eTsgcyBpcyBzdG9wXG5cCisgIGJpdHMsIDEgb3IgMi4gIEV4YW1wbGVzOiBcInNldCBzZXJpYWwgN2UxXCIsIFwic2V0IHNlcmlhbCA4bjFcIi4iKSk7CisKKyNpZmRlZiBIV1BBUklUWQorY2FzZSBYWVNUT1A6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIFNUT1AtQklUUyB7IDEsIDIgfVxuXAorICBOdW1iZXIgb2Ygc3RvcCBiaXRzIHRvIHVzZSBvbiBTRVQgTElORSBjb25uZWN0aW9ucywgbm9ybWFsbHkgMS4iKSk7CisjZW5kaWYgLyogSFdQQVJJVFkgKi8KKworI2lmbmRlZiBOT0xPQ0FMCitjYXNlIFhZRElTQzoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBTRVQgRElTQ09OTkVDVCB7IE9OLCBPRkYgfVxuXAorICBXaGV0aGVyIHRvIGNsb3NlIGFuZCByZWxlYXNlIGEgU0VUIExJTkUgZGV2aWNlIGF1dG9tYXRpY2FsbHkgdXBvblxuXAorICBkaXNjb25uZWN0aW9uOyBPRkYgPSBrZWVwIGRldmljZSBvcGVuIChkZWZhdWx0KTsgT04gPSBjbG9zZSBhbmQgcmVsZWFzZS4iKSk7CisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZkZWYgU1RSRUFNSU5HCitjYXNlIFhZU1RSRUFNOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFNFVCBTVFJFQU1JTkcgeyBPTiwgT0ZGLCBBVVRPIH1cblwKKyAgVGVsbHMgS2VybWl0IHdoZXRoZXIgc3RyZWFtaW5nIHByb3RvY29sIGNhbiBiZSB1c2VkIGR1cmluZyBLZXJtaXQgZmlsZVxuXAorICB0cmFuc2ZlcnMuICBEZWZhdWx0IGlzIEFVVE8sIG1lYW5pbmcgdXNlIGl0IGlmIGNvbm5lY3Rpb24gaXMgcmVsaWFibGUuIikpOworI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCitjYXNlIFhZUkVMWToKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBTRVQgUkVMSUFCTEUgeyBPTiwgT0ZGLCBBVVRPIH1cblwKKyAgVGVsbHMgS2VybWl0IHdoZXRoZXIgaXRzIGNvbm5lY3Rpb24gaXMgcmVsaWFibGUuICBEZWZhdWx0IGlzIEFVVE8sXG5cCisgIG1lYW5pbmcgS2VybWl0IHNob3VsZCBmaWd1cmUgaXQgb3V0IGZvciBpdHNlbGYuIikpOworCitjYXNlIFhZQ0xFQVI6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIENMRUFSLUNIQU5ORUwgeyBPTiwgT0ZGLCBBVVRPIH1cblwKKyAgVGVsbHMgS2VybWl0IHdoZXRoZXIgaXRzIGNvbm5lY3Rpb24gaXMgdHJhbnNwYXJlbnQgdG8gYWxsIDgtYml0IGJ5dGVzLlxuXAorICBEZWZhdWx0IGlzIEFVVE8sIG1lYW5pbmcgS2VybWl0IGZpZ3VyZXMgaXQgb3V0IGZyb20gdGhlIGNvbm5lY3Rpb24gdHlwZS5cblwKKyAgV2hlbiBib3RoIHNlbmRlciBhbmQgcmVjZWl2ZXIgYWdyZWUgY2hhbm5lbCBpcyBjbGVhciwgU0VUIFBSRUZJWElORyBOT05FXG5cCisgIGlzIHVzZWQgYXV0b21hdGljYWxseS4iKSk7CisKKyNpZmRlZiBUTE9HCitjYXNlIFhZVExPRzoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBTRVQgVFJBTlNBQ1RJT04tTE9HIHsgQlJJRUYsIEZUUCwgVkVSQk9TRSB9XG5cCisgIFNlbGVjdHMgdGhlIHRyYW5zYWN0aW9uLWxvZyBmb3JtYXQ7IEJSSUVGIGFuZCBGVFAgaGF2ZSBvbmUgbGluZSBwZXIgZmlsZTtcblwKKyAgRlRQIGlzIGNvbXBhdGlibGUgd2l0aCBGVFAgbG9nLiAgVkVSQk9TRSAodGhlIGRlZmF1bHQpIGhhcyBtb3JlIGluZm8uIikpOworI2VuZGlmIC8qIFRMT0cgKi8KKworY2FzZSBYWU9QVFM6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogU0VUIE9QVElPTlMgY29tbWFuZCBbIHN3aXRjaGVzLi4uIF1cblwKKyAgRm9yIHVzZSB3aXRoIGNvbW1hbmRzIHRoYXQgaGF2ZSBzd2l0Y2hlczsgc2V0cyB0aGUgZGVmYXVsdCBzd2l0Y2hlcyBmb3JcblwKKyAgdGhlIGdpdmVuIGNvbW1hbmQuICBUeXBlIFNFVCBPUFRJT05TID8gZm9yIGEgbGlzdCBvZiBhbWVuYWJsZSBjb21tYW5kcy4iKSk7CisKKyNpZm5kZWYgTk9TUEwKK2Nhc2UgWFlUSU1FUjoKKyAgICByZXR1cm4oaG1zZ2EoaG14eXRpbWVyKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIENLUk9PVAorICBjYXNlIFhZUk9PVDoKKyAgICByZXR1cm4oaG1zZ2EoaG14eGNocm9vdCkpOworI2VuZGlmIC8qIFhZUk9PVCAqLworCisjaWZkZWYgQU5ZU1NICisgIGNhc2UgWFlTU0g6CisgICAgcmV0dXJuKGhtc2dhKGhteHlzc2gpKTsKKyNlbmRpZiAvKiBBTllDTUQgKi8KKworI2lmZGVmIExPQ1VTCisgIGNhc2UgWFlMT0NVUzoKKyAgICByZXR1cm4oaG1zZ2EoaG14eWxvY3VzKSk7CisjZW5kaWYgLyogTE9DVVMgKi8KKworI2lmZGVmIE9TMgorI2lmZGVmIEtVSQorICBjYXNlIFhZR1VJOgorICAgIHJldHVybihobXNnYShobXh5Z3VpKSk7CisjZW5kaWYgLyogS1VJICovCisjZW5kaWYgLyogT1MyICovCisKKyAgY2FzZSBYWU1BVENIOgorICAgIHJldHVybihobXNnYShobXh5bWF0Y2gpKTsKKworZGVmYXVsdDoKKyAgICBwcmludGYoIk5vdCBhdmFpbGFibGUgLSBcIiVzXCJcbiIsY21kYnVmKTsKKyAgICByZXR1cm4oMCk7CisgICAgfQorfQorCisjaWZuZGVmIE5PU1BMCisvKiAgRCBPIEggRiBVIE4gQyAgLS0gIEdpdmUgaGVscCBmb3IgYSBmdW5jdGlvbiAgKi8KKworaW50Citkb2hmdW5jKHh4KSBpbnQgeHg7IHsKKyAgICAvKiBpbnQgeDsgKi8KKyAgICBpZiAoeHggPT0gLTMpIHsKKyAgICAgICAgcHJpbnRmKCJcbiBUeXBlIFNIT1cgRlVOQ1RJT05TIHRvIHNlZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIGZ1bmN0aW9ucy5cbiIKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIHByaW50ZigKKyAgICAgICAgIiBUeXBlIEhFTFAgRlVOQ1RJT04gPG5hbWU+IGZvciBoZWxwIG9uIGEgcGFydGljdWxhciBmdW5jdGlvbi5cbiIpOworICAgICAgICBwcmludGYoCisgICAgICAgICIgRm9yIGZ1bmN0aW9uIHNldHRpbmdzIHVzZSBIRUxQIFNFVCBGVU5DVElPTiBhbmQgU0hPVyBTQ1JJUFRTLlxuXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBpZiAoeHggPT0gRk5fV09SRCkgICAgICAgICAgICAgICAgICAvKiBMb25nIGhlbHAgbWVzc2FnZSAqLworICAgICAgICByZXR1cm4oaG1zZ2EoaG1md29yZCkpOworCisgICAgcHJpbnRmKCJcbiIpOworICAgIHN3aXRjaCAoeHgpIHsKKyAgICAgIGNhc2UgRk5fSU5EOiAgICAgICAgICAgICAgICAgICAgICAvKiBJbmRleCAob2Ygc3RyaW5nIDEgaW4gc3RyaW5nIDIpICovCisgICAgICBjYXNlIEZOX1JJWDogICAgICAgICAgICAgICAgICAgICAgLyogUmluZGV4IChpbmRleCBmcm9tIHJpZ2h0KSAqLworICAgICAgICBwcmludGYoIlxcZiVzaW5kZXgoczEsczIsbjEpXG5cCisgIHMxID0gc3RyaW5nIHRvIGxvb2sgZm9yLlxuXAorICBzMiA9IHN0cmluZyB0byBsb29rIGluLlxuXAorICBuMSA9IG9wdGlvbmFsIDEtYmFzZWQgc3RhcnRpbmcgcG9zaXRpb24sIGRlZmF1bHQgPSAxLlxuIiwKKyAgICAgICAgICAgICAgIHh4ID09IEZOX1JJWCA/ICJyIiA6ICIiCisgICAgICAgICAgICAgICApOworICAgICAgICBwcmludGYoIlJldHVybnMgaW50ZWdlcjpcblwKKyAgMS1iYXNlZCBwb3NpdGlvbiBvZiAlc21vc3Qgb2NjdXJyZW5jZSBvZiBzMSBpbiBzMiwgaWdub3JpbmcgdGhlICVzbW9zdFxuXAorICAobjEtMSkgY2hhcmFjdGVycyBpbiBzMjsgcmV0dXJucyAwIGlmIHMxIG5vdCBmb3VuZCBpbiBzMi5cbiIsCisgICAgICAgICAgICAgICB4eCA9PSBGTl9JTkQgPyAibGVmdCIgOiAicmlnaHQiLAorICAgICAgICAgICAgICAgeHggPT0gRk5fSU5EID8gImxlZnQiIDogInJpZ2h0IgorICAgICAgICApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fU0VBUkNIOiAgICAgICAgICAgICAgICAgICAvKiBTZWFyY2ggZm9yIHBhdHRlcm4gKi8KKyAgICAgIGNhc2UgRk5fUlNFQVJDSDogICAgICAgICAgICAgICAgICAvKiBTZWFyY2ggZm9yIHBhdHRlcm4gZnJvbSByaWdodCAqLworICAgICAgICBwcmludGYoIlxcZiVzc2VhcmNoKHMxLHMyLG4xKVxuXAorICBzMSA9IHBhdHRlcm4gdG8gbG9vayBmb3IuXG5cCisgIHMyID0gc3RyaW5nIHRvIGxvb2sgaW4uXG5cCisgIG4xID0gb3B0aW9uYWwgMS1iYXNlZCBvZmZzZXQsIGRlZmF1bHQgPSAxLlxuIiwKKyAgICAgICAgICAgICAgIHh4ID09IEZOX1JTRUFSQ0ggPyAiciIgOiAiIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIGludGVnZXI6XG5cCisgIDEtYmFzZWQgcG9zaXRpb24gb2YgJXNtb3N0IG1hdGNoIGZvciBzMSBpbiBzMiwgaWdub3JpbmcgdGhlICVzbW9zdFxuXAorICAobjEtMSkgY2hhcmFjdGVycyBpbiBzMjsgcmV0dXJucyAwIGlmIG5vIG1hdGNoLlxuIiwKKyAgICAgICAgICAgICAgIHh4ID09IEZOX1NFQVJDSCA/ICJsZWZ0IiA6ICJyaWdodCIsCisgICAgICAgICAgICAgICB4eCA9PSBGTl9TRUFSQ0ggPyAibGVmdCIgOiAicmlnaHQiCisgICAgICAgICk7CisgICAgICAgIHByaW50ZigiICBTZWUgSEVMUCBXSUxEQ0FSRFMgZm9yIGluZm8gYWJvdXQgcGF0dGVybnMuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX0xFTjogICAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIChvZiBzdHJpbmcpICovCisgICAgICAgIHByaW50ZigiXFxmbGVuZ3RoKHMxKVxuXAorICBzMSA9IHN0cmluZy5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgaW50ZWdlcjpcblwKKyAgTGVuZ3RoIG9mIHN0cmluZyBzMS5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fTElUOiAgICAgICAgICAgICAgICAgICAgICAvKiBMaXRlcmFsIChkb24ndCBleHBhbmQgdGhlIHN0cmluZykgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZsaXRlcmFsKHMxKVxuXAorICBzMSA9IHN0cmluZy5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBzMSBsaXRlcmFsbHkgd2l0aG91dCBldmFsdWF0aW9uLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9MT1c6ICAgICAgICAgICAgICAgICAgICAgIC8qIExvd2VyIChjb252ZXJ0IHRvIGxvd2VyY2FzZSkgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZsb3dlcihzMSlcblwKKyAgczEgPSBzdHJpbmcuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIHN0cmluZzpcblwKKyAgczEgd2l0aCB1cHBlcmNhc2UgbGV0dGVycyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9NQVg6ICAgICAgICAgICAgICAgICAgICAgIC8qIE1heCAobWF4aW11bSkgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZtYXhpbXVtKG4xLG4yKVxuXAorICBuMSA9IGludGVnZXIuXG5cCisgIG4yID0gaW50ZWdlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgaW50ZWdlcjpcblwKKyAgVGhlIGdyZWF0ZXIgb2YgbjEgYW5kIG4yLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9NSU46ICAgICAgICAgICAgICAgICAgICAgIC8qIE1pbiAobWluaW11bSkgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZtaW5pbXVtKG4xLG4yKVxuXAorICBuMSA9IGludGVnZXIuXG5cCisgIG4yID0gaW50ZWdlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgaW50ZWdlcjpcblwKKyAgVGhlIGxlc3NlciBvZiBuMSBhbmQgbjIuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX01PRDogICAgICAgICAgICAgICAgICAgICAgLyogTW9kIChtb2R1bHVzKSAqLworICAgICAgICBwcmludGYoIlxcZm1vZHVsdXMobjEsbjIpXG5cCisgIG4xID0gaW50ZWdlci5cblwKKyAgbjIgPSBpbnRlZ2VyLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBpbnRlZ2VyOlxuXAorICBUaGUgcmVtYWluZGVyIGFmdGVyIGRpdmlkaW5nIG4xIGJ5IG4yLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9FVkE6ICAgICAgICAgICAgICAgICAgICAgIC8qIEV2YWwgKGV2YWx1YXRlIGFyaXRoIGV4cHJlc3Npb24pICovCisgICAgICAgIHByaW50ZigiXFxmZXZhbHVhdGUoZSlcblwKKyAgZSA9IGFyaXRobWV0aWMgZXhwcmVzc2lvbi5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgaW50ZWdlcjpcblwKKyAgVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9TVUI6ICAgICAgICAgICAgICAgICAgICAgIC8qIFN1YnN0ciAoc3Vic3RyaW5nKSAqLworICAgICAgICBwcmludGYoIlxcZnN1YnN0cmluZyhzMSxuMSxuMilcblwKKyAgczEgPSBzdHJpbmcuXG5cCisgIG4xID0gaW50ZWdlciwgMS1iYXNlZCBzdGFydGluZyBwb3NpdGlvbiwgZGVmYXVsdCA9IDEuXG5cCisgIG4yID0gaW50ZWdlciwgbGVuZ3RoLCBkZWZhdWx0ID0gbGVuZ3RoKHMxKSAtIG4xICsgMS5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBTdWJzdHJpbmcgb2YgczEgc3RhcnRpbmcgYXQgbjEsIGxlbmd0aCBuMi5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fVVBQOiAgICAgICAgICAgICAgICAgICAgICAvKiBVcHBlciAoY29udmVydCB0byB1cHBlcmNhc2UpICovCisgICAgICAgIHByaW50ZigiXFxmdXBwZXIoczEpXG5cCisgIHMxID0gc3RyaW5nLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBzdHJpbmc6XG5cCisgIHMxIHdpdGggbG93ZXJjYXNlIGxldHRlcnMgY29udmVydGVkIHRvIHVwcGVyY2FzZS5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fUkVWOiAgICAgICAgICAgICAgICAgICAgICAvKiBSZXZlcnNlIChhIHN0cmluZykgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZyZXZlcnNlKHMxKVxuXAorICBzMSA9IHN0cmluZy5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBzMSB3aXRoIGl0cyBjaGFyYWN0ZXJzIGluIHJldmVyc2Ugb3JkZXIuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX1JFUDogICAgICAgICAgICAgICAgICAgICAgLyogUmVwZWF0IChhIHN0cmluZykgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZyZXBlYXQoczEsbjEpXG5cCisgIHMxID0gc3RyaW5nLlxuXAorICBuMSA9IGludGVnZXIuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIHN0cmluZzpcblwKKyAgczEgcmVwZWF0ZWQgbjEgdGltZXMuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX0VYRTogICAgICAgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSAoYSBtYWNybykgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZleGVjdXRlKG0xLGExLGEyLGEzLC4uLilcblwKKyAgbTEgPSBtYWNybyBuYW1lLlxuXAorICBhMSA9IGFyZ3VtZW50IDEuXG5cCisgIGEyID0gYXJndW1lbnQgMiwgZXRjXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIHN0cmluZzpcblwKKyAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbWFjcm8gKEhFTFAgUkVUVVJOIGZvciBmdXJ0aGVyIGluZm8pLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9MUEE6ICAgICAgICAgICAgICAgICAgICAgIC8qIExQQUQgKGxlZnQgcGFkKSAqLworICAgICAgY2FzZSBGTl9SUEE6ICAgICAgICAgICAgICAgICAgICAgIC8qIFJQQUQgKHJpZ2h0IHBhZCkgKi8KKyAgICAgICAgcHJpbnRmKCJcXGYlY3BhZChzMSxuMSxjMSlcblwKKyAgczEgPSBzdHJpbmcuXG5cCisgIG4xID0gaW50ZWdlci5cblwKKyAgYzEgPSBjaGFyYWN0ZXIsIGRlZmF1bHQgPSBzcGFjZS5cbiIsCisgICAgICAgICAgICAgICAgeHggPT0gRk5fTFBBID8gJ2wnIDogJ3InKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIHN0cmluZzpcblwKKyAgczEgJXMtcGFkZGVkIHdpdGggY2hhcmFjdGVyIGMxIHRvIGxlbmd0aCBuMS5cbiIsCisgICAgICAgICAgICAgICB4eCA9PSBGTl9MUEEgPyAibGVmdCIgOiAicmlnaHQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX0RFRjogICAgICAgICAgICAgICAgICAgICAgLyogRGVmaW5pdGlvbiBvZiBhIG1hY3JvLCB1bmV4cGFuZGVkICovCisgICAgICAgIHByaW50ZigiXFxmZGVmaW5pdGlvbihtMSlcblwKKyAgbTEgPSBtYWNybyBuYW1lLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBzdHJpbmc6XG5cCisgIExpdGVyYWwgZGVmaW5pdGlvbiBvZiBtYWNybyBtMS5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fQ09OOiAgICAgICAgICAgICAgICAgICAgICAvKiBDb250ZW50cyBvZiBhIHZhcmlhYmxlLCBkaXR0byAqLworICAgICAgICBwcmludGYoIlxcZmNvbnRlbnRzKHYxKVxuXAorICB2MSA9IHZhcmlhYmxlIG5hbWUgc3VjaCBhcyBcXCUlYS5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBMaXRlcmFsIGRlZmluaXRpb24gb2YgdmFyaWFibGUgdjEsIGV2YWx1YXRlZCBvbmUgbGV2ZWwgb25seS5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fRklMOiAgICAgICAgICAgICAgICAgICAgICAvKiBOZXh0IGZpbGUgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZuZXh0ZmlsZSgpXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIHN0cmluZzpcblwKKyAgTmFtZSBvZiBuZXh0IGZpbGUgZnJvbSBsaXN0IGNyZWF0ZWQgYnkgbW9zdCByZWNlbnQgXFxmW3JdZmlsZXMoKSBvclxuXAorICBcXGZbcl1kaXIoKWludm9jYXRpb24sIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBmaWxlcyBpblxuXAorICB0aGUgbGlzdC5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fRkM6ICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIGNvdW50ICovCisgICAgICAgIHByaW50ZigiXFxmZmlsZXMoZjFbLCZhXSkgLSBGaWxlIGxpc3QuXG5cCisgIGYxID0gZmlsZSBzcGVjaWZpY2F0aW9uLCBwb3NzaWJseSBjb250YWluaW5nIHdpbGRjYXJkcy5cblwKKyAgJmEgPSBvcHRpb25hbCBuYW1lIG9mIGFycmF5IHRvIGFzc2lnbiBmaWxlIGxpc3QgdG8uXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIGludGVnZXI6XG5cCisgIFRoZSBudW1iZXIgb2YgcmVndWxhciBmaWxlcyB0aGF0IG1hdGNoIGYxLiAgVXNlIHdpdGggXFxmbmV4dGZpbGUoKS5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fQ0hSOiAgICAgICAgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXIgKGxpa2UgQkFTSUMgQ0hSJCgpKSAqLworICAgICAgICBwcmludGYoIlxcZmNoYXJhY3RlcihuMSlcblwKKyAgbjEgPSBpbnRlZ2VyLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBjaGFyYWN0ZXI6XG5cCisgIFRoZSBjaGFyYWN0ZXIgd2hvc2UgbnVtZXJpYyBjb2RlIGlzIG4xLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9SSUc6ICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IChsaWtlIEJBU0lDIFJJR0hUJCgpKSAqLworICAgICAgICBwcmludGYoIlxcZnJpZ2h0KHMxLG4xKVxuXAorICBzMSA9IHN0cmluZy5cblwKKyAgbjEgPSBpbnRlZ2VyLCBkZWZhdWx0ID0gbGVuZ3RoKHMxKS5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBUaGUgcmlnaHRtb3N0IG4xIGNoYXJhY3RlcnMgb2Ygc3RyaW5nIHMxLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9MRUY6ICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgKGxpa2UgQkFTSUMgTEVGVCQoKSkgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZsZWZ0KHMxLG4xKVxuXAorICBzMSA9IHN0cmluZy5cblwKKyAgbjEgPSBpbnRlZ2VyLCBkZWZhdWx0ID0gbGVuZ3RoKHMxKS5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBUaGUgbGVmdG1vc3QgbjEgY2hhcmFjdGVycyBvZiBzdHJpbmcgczEuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX0NPRDogICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSB2YWx1ZSBvZiBjaGFyYWN0ZXIgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZjb2RlKHMxKVxuXAorICBjMSA9IGNoYXJhY3Rlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgaW50ZWdlcjpcblwKKyAgVGhlIG51bWVyaWMgY29kZSBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHN0cmluZyBzMSwgb3IgMCBpZiBzMSBlbXB0eS5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fUlBMOiAgICAgICAgICAgICAgICAgICAgICAvKiBSZXBsYWNlICovCisgICAgICAgIHByaW50ZigiXFxmcmVwbGFjZShzMSxzMixzM1ssbjFdKVxuXAorICBzMSA9IG9yaWdpbmFsIHN0cmluZy5cblwKKyAgczIgPSBtYXRjaCBzdHJpbmcuXG5cCisgIHMzID0gcmVwbGFjZW1lbnQgc3RyaW5nLlxuXAorICBuMSA9IG9jY3VycmVuY2UuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIHN0cmluZzpcblwKKyAgczEgd2l0aCBvY2N1cnJlbmNlIG51bWJlciBuMSBvZiBzMiByZXBsYWNlZCBieSBzMy5cblwKKyAgSWYgbjEgPSAwIG9yIG9taXR0ZWQsIGFsbCBvY2N1cnJlbmNlcyBhcmUgcmVwbGFjZWQuXG5cCisgIElmIG4xIDwgMCwgb2NjdXJyZW5jZXMgYXJlIGNvdW50ZWQgZnJvbSB0aGUgcmlnaHQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fRkQ6ICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIGRhdGUgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZkYXRlKGYxKVxuXAorICBmMSA9IGZpbGVuYW1lLlxuIik7CisjaWZkZWYgVk1TCisgICAgICAgIHByaW50ZigiUmV0dXJucyBzdHJpbmc6XG5cCisgIENyZWF0aW9uIGRhdGUgb2YgZmlsZSBmMSwgZm9ybWF0OiB5eXl5bW1kZCBoaDptbTpzcy5cbiIpOworI2Vsc2UKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIHN0cmluZzpcblwKKyAgTW9kaWZpY2F0aW9uIGRhdGUgb2YgZmlsZSBmMSwgZm9ybWF0OiB5eXl5bW1kZCBoaDptbTpzcy5cbiIpOworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fRlM6ICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIHNpemUgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZzaXplKGYxKVxuXAorICBmMSA9IGZpbGVuYW1lLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBpbnRlZ2VyOlxuXAorICBTaXplIG9mIGZpbGUgZjEuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX1ZFUjogICAgICAgICAgICAgICAgICAgICAgLyogVmVyaWZ5ICovCisgICAgICAgIHByaW50ZigiXFxmdmVyaWZ5KHMxLHMyLG4xKVxuXAorICBzMSA9IHN0cmluZyBvZiBjaGFyYWN0ZXJzIHRvIGxvb2sgZm9yLlxuXAorICBzMiA9IHN0cmluZyB0byBsb29rIGluLlxuXAorICBuMSA9IHN0YXJ0aW5nIHBvc2l0aW9uIGluIHMyLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBpbnRlZ2VyOlxuXAorICAxLWJhc2VkIHBvc2l0aW9uIG9mIGZpcnN0IGNoYXJhY3RlciBpbiBzMiB0aGF0IGlzIG5vdCBhbHNvIGluIHMxLFxuXAorICBvciAtMSBpZiBzMSBpcyBlbXB0eSwgb3IgMCBpZiBhbGwgY2hhcmFjdGVycyBpbiBzMiBhcmUgYWxzbyBpbiBzMS5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fSVBBOiAgICAgICAgICAgICAgICAgICAgICAvKiBGaW5kIGFuZCByZXR1cm4gSVAgYWRkcmVzcyAqLworICAgICAgICBwcmludGYoIlxcZmlwYWRkcmVzcyhzMSxuMSlcblwKKyAgczEgPSBzdHJpbmcuXG5cCisgIG4xID0gMS1iYXNlZCBpbnRlZ2VyIHN0YXJ0aW5nIHBvc2l0aW9uLCBkZWZhdWx0ID0gMS5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBGaXJzdCBJUCBhZGRyZXNzIGluIHMxLCBzY2FubmluZyBmcm9tIGxlZnQgc3RhcnRpbmcgYXQgcG9zaXRpb24gbjEuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX0hFWDogICAgICAgICAgICAgICAgICAgICAgLyogSGV4aWZ5ICovCisgICAgICAgIHByaW50ZigiXFxmaGV4aWZ5KHMxKVxuXAorICBzMSA9IHN0cmluZy5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBUaGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgczEuICBBbHNvIHNlZSBcXGZuMmhleCgpLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9VTkg6ICAgICAgICAgICAgICAgICAgICAgIC8qIFVuaGV4aWZ5ICovCisgICAgICAgIHByaW50ZigiXFxmdW5oZXhpZnkoaDEpXG5cCisgIGgxID0gSGV4YWRlY2ltYWwgc3RyaW5nLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBzdHJpbmc6XG5cCisgIFRoZSByZXN1bHQgb2YgdW5oZXhpZnlpbmcgczEsIG9yIG5vdGhpbmcgaWYgczEgaXMgbm90IGEgaGV4IHN0cmluZy5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fVU5UQUI6CQkJLyogVW50YWJpZnkgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZ1bnRhYmlmeShzMSlcblwKKyAgczEgPSBzdHJpbmcuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIHN0cmluZzpcblwKKyAgVGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRhYnMgaW4gczEgdG8gc3BhY2VzIGFzc3VtaW5nIHRhYiBzdG9wcyBldmVyeVxuXAorICA4IHNwYWNlcy5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fQlJLOiAgICAgICAgICAgICAgICAgICAgICAvKiBCcmVhayAqLworICAgICAgY2FzZSBGTl9TUE46ICAgICAgICAgICAgICAgICAgICAgIC8qIFNwYW4gKi8KKyAgICAgICAgcHJpbnRmKCJcXGYlcyhzMSxzMixuMSlcblwKKyAgczEgPSBzdHJpbmcgdG8gbG9vayBpbi5cblwKKyAgczIgPSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0byBsb29rIGZvci5cblwKKyAgbjEgPSAxLWJhc2VkIGludGVnZXIgc3RhcnRpbmcgcG9zaXRpb24sIGRlZmF1bHQgPSAxLlxuIiwKKyAgICAgICAgICAgICAgeHggPT0gRk5fQlJLID8gImJyZWFrIiA6ICJzcGFuIgorICAgICAgICAgICAgICApOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBzMSB1cCB0byB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbnkgY2hhcmFjdGVyJXNhbHNvIGluIHMyLFxuXAorICBzY2FubmluZyBmcm9tIHRoZSBsZWZ0IHN0YXJ0aW5nIGF0IHBvc2l0aW9uIG4xLlxuIiwKKyAgICAgICAgICAgICAgIHh4ID09IEZOX1NQTiA/ICIgbm90ICIgOiAiICIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fVFJNOiAgICAgICAgICAgICAgICAgICAgICAvKiBUcmltICovCisgICAgICBjYXNlIEZOX0xUUjogICAgICAgICAgICAgICAgICAgICAgLyogTGVmdC1UcmltICovCisgICAgICAgIHByaW50ZigiXFxmJXMoczEsczIpXG5cCisgIHMxID0gc3RyaW5nIHRvIGxvb2sgaW4uXG5cCisgIHMyID0gc3RyaW5nIG9mIGNoYXJhY3RlcnMgdG8gbG9vayBmb3IsIGRlZmF1bHQgPSBibGFua3MgYW5kIHRhYnMuXG4iLAorICAgICAgICAgICAgICAgeHggPT0gRk5fVFJNID8gInRyaW0iIDogImx0cmltIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBzdHJpbmc6XG5cCisgIHMxIHdpdGggYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxzbyBpbiBzMiB0cmltbWVkIGZyb20gdGhlICVzLlxuLiIsCisgICAgICAgICAgICAgICB4eCA9PSBGTl9UUk0gPyAicmlnaHQiIDogImxlZnQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX0NBUDogICAgICAgICAgICAgICAgICAgICAgLyogQ2FwaXRhbGl6ZSAqLworICAgICAgICBwcmludGYoIlxcZmNhcGl0YWxpemUoczEpXG5cCisgIHMxID0gc3RyaW5nLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBzdHJpbmc6XG5cCisgIHMxIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlIGFuZCB0aGUgcmVtYWluaW5nXG5cCisgIGxldHRlcnMgdG8gbG93ZXJjYXNlLlxuIik7CisgICAgICAgIHByaW50ZigiU3lub255bTogXFxmY2FwcyhzMSlcbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fVE9EOiAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lLW9mLWRheS10by1zZWNzLXNpbmNlLW1pZG5pdGUgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZ0b2Qyc2VjcyhzMSlcblwKKyAgczEgPSB0aW1lLW9mLWRheSBzdHJpbmcsIGhoOm1tOnNzLCAyNC1ob3VyIGZvcm1hdC5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgbnVtYmVyOlxuXAorICBTZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9GRk46ICAgICAgICAgICAgICAgICAgICAgIC8qIEZ1bGwgZmlsZSBuYW1lICovCisgICAgICAgIHByaW50ZigiXFxmcGF0aG5hbWUoZjEpXG5cCisgIGYxID0gZmlsZW5hbWUsIHBvc3NpYmx5IHdpbGQuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIHN0cmluZzpcblwKKyAgRnVsbCBwYXRobmFtZSBvZiBmMS5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fQ0hLOiAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVja3N1bSBvZiB0ZXh0ICovCisgICAgICAgIHByaW50ZigiXFxmY2hlY2tzdW0oczEpXG5cCisgIHMxID0gc3RyaW5nLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBpbnRlZ2VyOlxuXAorICAxNi1iaXQgY2hlY2tzdW0gb2Ygc3RyaW5nIHMxLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9DUkM6ICAgICAgICAgICAgICAgICAgICAgIC8qIENSQy0xNiBvZiB0ZXh0ICovCisgICAgICAgIHByaW50ZigiXFxmY3JjMTYoczEpXG5cCisgIHMxID0gc3RyaW5nLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBpbnRlZ2VyOlxuXAorICAxNi1iaXQgY3ljbGljIHJlZHVuZGFuY3kgY2hlY2sgb2Ygc3RyaW5nIHMxLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9CU046ICAgICAgICAgICAgICAgICAgICAgIC8qIEJhc2VuYW1lIG9mIGZpbGUgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZiYXNlbmFtZShmMSlcblwKKyAgZjEgPSBmaWxlbmFtZSwgcG9zc2libHkgd2lsZC5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBGaWxlbmFtZSBmMSBzdHJpcHBlZCBvZiBhbGwgZGV2aWNlIGFuZCBkaXJlY3RvcnkgaW5mb3JtYXRpb24uXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX0NNRDogICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IG9mIGEgY29tbWFuZCAoY29va2VkKSAqLworICAgICAgICBwcmludGYoIlxcZmNvbW1hbmQoczEpXG5cCisgIHMxID0gc3RyaW5nXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIHN0cmluZzpcblwKKyAgT3V0cHV0IG9mIHN5c3RlbSBjb21tYW5kIHMxLCBpZiBhbnksIHdpdGggZmluYWwgbGluZSB0ZXJtaW5hdG9yIHN0cmlwcGVkLlxuIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX1JBVzogICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IG9mIGEgY29tbWFuZCAocmF3KSAqLworICAgICAgICBwcmludGYoIlxcZnJhd2NvbW1hbmQoczEpXG5cCisgIHMxID0gc3RyaW5nXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIHN0cmluZzpcblwKKyAgT3V0cHV0IG9mIHN5c3RlbSBjb21tYW5kIHMxLCBpZiBhbnkuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX1NUWDogICAgICAgICAgICAgICAgICAgICAgLyogU3RyaXAgZnJvbSByaWdodCAqLworICAgICAgICBwcmludGYoIlxcZnN0cmlweChzMSxjMSlcblwKKyAgczEgPSBzdHJpbmcgdG8gbG9vayBpbi5cblwKKyAgYzEgPSBjaGFyYWN0ZXIgdG8gbG9vayBmb3IsIGRlZmF1bHQgPSBcIi5cIi5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBzMSB1cCB0byB0aGUgcmlnaHRtb3N0IG9jY3VycmVuY2Ugb2YgY2hhcmFjdGVyIGMxLlxuIgorICAgICAgICApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9TVEw6ICAgICAgICAgICAgICAgICAgICAgIC8qIFN0cmlwIGZyb20gbGVmdCAqLworICAgICAgICBwcmludGYoIlxcZmxvcChzMSxjMSlcblwKKyAgczEgPSBzdHJpbmcgdG8gbG9vayBpbi5cblwKKyAgYzEgPSBjaGFyYWN0ZXIgdG8gbG9vayBmb3IsIGRlZmF1bHQgPSBcIi5cIi5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBUaGUgcGFydCBvZiBzMSBhZnRlciB0aGUgbGVmdG1vc3Qgb2NjdXJyZW5jZSBvZiBjaGFyYWN0ZXIgYzEuXG4iCisgICAgICAgICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX1NUTjogICAgICAgICAgICAgICAgICAgICAgLyogU3RyaXAgbiBjaGFycyAqLworICAgICAgICBwcmludGYoIlxcZnN0cmlwbihzMSxuMSlcblwKKyAgczEgPSBzdHJpbmcgdG8gbG9vayBpbi5cblwKKyAgbjEgPSBpbnRlZ2VyLCBkZWZhdWx0ID0gMC5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBzMSB3aXRoIG4xIGNoYXJhY3RlcnMgcmVtb3ZlZCBmcm9tIHRoZSByaWdodC5cbiIKKyAgICAgICAgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fU1RCOiAgICAgICAgICAgICAgICAgICAgICAvKiBTdHJpcCBlbmNsb3NpbmcgYnJhY2tldHMgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZzdHJpcGIoczFbLGMxWyxjMl1dKVxuXAorICBzMSA9IG9yaWdpbmFsIHN0cmluZy5cblwKKyAgYzEgPSBvcHRpb25hbCBmaXJzdCBjaGFyYWN0ZXJcbiIpOworICAgICAgICBwcmludGYoIlwKKyAgYzIgPSBvcHRpb25hbCBmaW5hbCBjaGFyYWN0ZXIuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIHN0cmluZzpcblwKKyAgczEgd2l0aCB0aGUgaW5kaWNhdGVkIGVuY2xvc2luZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBJZiBjMSBhbmQgYzIgbm90XG5cCisgICAgIHNwZWNpZmllZCwgYW55IG1hdGNoaW5nIGJyYWNrZXRzLCBicmFjZXMsIHBhcmVudGhlc2VzLCBvciBxdW90ZXMgYXJlXG4iKTsKKyAgICAgICAgcHJpbnRmKCJcCisgICAgIGFzc3VtZWQuICBJZiBjMSBpcyBnaXZlbiBidXQgbm90IGMyLCB0aGUgYXBwcm9wcmlhdGUgYzIgaXMgYXNzdW1lZC5cblwKKyAgICAgaWYgYm90aCBjMSBhbmQgYzIgYXJlIGdpdmVuLCB0aGV5IGFyZSB1c2VkIGFzLWlzLlxuIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcHJpbnRmKAorIkFsdGVybmF0aXZlIGZvcm1hdDpcblwKKyAgSW5jbHVkZSBhIGdyb3VwaW5nIG1hc2sgbnVtYmVyIGluIHBsYWNlIG9mIGMxIGFuZCBvbWl0IGMyIHRvIHNwZWNpZnkgbW9yZVxuXAorICB0aGFuIG9uZSBwb3NzaWJpbGl0eSBhdCBvbmNlOyBzZWUgXFxmd29yZCgpIGZvciBkZXRhaWxzLlxuIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBPUzIKKyAgICAgIGNhc2UgRk5fU0NSTl9DWDogICAgICAgICAgICAgICAgICAvKiBTY3JlZW4gQ3Vyc29yIFggUG9zICovCisgICAgICAgIHByaW50ZigiXFxmc2NybmN1cngoKVxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBpbnRlZ2VyOlxuXAorICBUaGUgMC1iYXNlZCBYIGNvb3JkaW5hdGUgKGNvbHVtbikgb2YgdGhlIFRlcm1pbmFsIHNjcmVlbiBjdXJzb3IuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX1NDUk5fQ1k6ICAgICAgICAgICAgICAgICAgLyogU2NyZWVuIEN1cnNvciBZIFBvcyAqLworICAgICAgICBwcmludGYoIlxcZnNjcm5jdXJ5KClcbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgaW50ZWdlcjpcblwKKyAgVGhlIDAtYmFzZWQgWSBjb29yZGluYXRlIChyb3cpIG9mIHRoZSBUZXJtaW5hbCBzY3JlZW4gY3Vyc29yLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9TQ1JOX1NUUjogICAgICAgICAgICAgICAgIC8qIFNjcmVlbiBTdHJpbmcgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZzY3Juc3RyKG55LG54LG4xKVxuXAorICBueSA9IGludGVnZXIuXG5cCisgIG54ID0gaW50ZWdlci5cblwKKyAgbjEgPSBpbnRlZ2VyLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBzdHJpbmc6XG5cCisgIFRoZSBzdHJpbmcgYXQgVGVybWluYWwtc2NyZWVuIGNvb3JkaW5hdGVzIChueCxueSksIGxlbmd0aCBuMSxcblwKKyAgYmxhbmtzIGluY2x1ZGVkLiAgQ29vcmRpbmF0ZXMgc3RhcnQgYXQgMC4gIERlZmF1bHQgdmFsdWVzIGFyZVxuXAorICAwIGZvciBueSBhbmQgbngsIGFuZCBsaW5lIHdpZHRoIGZvciBuMS5cbiIpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgICAgY2FzZSBGTl8ySEVYOiAgICAgICAgICAgICAgICAgICAgIC8qIE51bSB0byBoZXggKi8KKyAgICAgICAgcHJpbnRmKCJcXGZuMmhleChuMSkgLSBOdW1iZXIgdG8gaGV4XG4gIG4xID0gaW50ZWdlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuICBUaGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgbjEuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fMk9DVDogICAgICAgICAgICAgICAgICAgICAvKiBOdW0gdG8gaGV4ICovCisgICAgICAgIHByaW50ZigiXFxmbjJvY3RhbChuMSkgLSBOdW1iZXIgdG8gb2N0YWxcbiAgbjEgPSBpbnRlZ2VyLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBzdHJpbmc6XG4gIFRoZSBvY3RhbCByZXByZXNlbnRhdGlvbiBvZiBuMS5cbiIpOworICAgICAgICBicmVhazsKKworI2lmZGVmIFJFQ1VSU0lWRQorICAgICAgY2FzZSBGTl9ESVI6ICAgICAgICAgICAgICAgICAgICAgIC8qIFJlY3Vyc2l2ZSBkaXJlY3RvcnkgY291bnQgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZkaXJlY3RvcmllcyhmMSkgLSBEaXJlY3RvcnkgbGlzdC5cblwKKyAgZjEgPSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbiwgcG9zc2libHkgY29udGFpbmluZyB3aWxkY2FyZHMuXG5cCisgICZhID0gb3B0aW9uYWwgbmFtZSBvZiBhcnJheSB0byBhc3NpZ24gZGlyZWN0b3J5IGxpc3QgdG8uXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIGludGVnZXI6XG5cCisgIFRoZSBudW1iZXIgb2YgZGlyZWN0b3JpZXMgdGhhdCBtYXRjaCBmMTsgdXNlIHdpdGggXFxmbmV4dGZpbGUoKS5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9SRklMOiAgICAgICAgICAgICAgICAgICAgIC8qIFJlY3Vyc2l2ZSBmaWxlIGNvdW50ICovCisgICAgICAgIHByaW50ZigiXFxmcmZpbGVzKGYxWywmYV0pIC0gUmVjdXJzaXZlIGZpbGUgbGlzdC5cblwKKyAgZjEgPSBmaWxlIHNwZWNpZmljYXRpb24sIHBvc3NpYmx5IGNvbnRhaW5pbmcgd2lsZGNhcmRzLlxuXAorICAmYSA9IG9wdGlvbmFsIG5hbWUgb2YgYXJyYXkgdG8gYXNzaWduIGZpbGUgbGlzdCB0by5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgaW50ZWdlcjpcblwKKyAgVGhlIG51bWJlciBvZiBmaWxlcyB3aG9zZSBuYW1lcyBtYXRjaCBmMSBpbiB0aGUgY3VycmVudCBvciBnaXZlblxuXAorICBkaXJlY3RvcnkgdHJlZTsgdXNlIHdpdGggXFxmbmV4dGZpbGUoKS5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9SRElSOiAgICAgICAgICAgICAgICAgICAgIC8qIFJlY3Vyc2l2ZSBkaXJlY3RvcnkgY291bnQgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZyZGlyZWN0b3JpZXMoZjEpIC0gUmVjdXJzaXZlIGRpcmVjdG9yeSBsaXN0LlxuXAorICBmMSA9IGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uLCBwb3NzaWJseSBjb250YWluaW5nIHdpbGRjYXJkcy5cblwKKyAgJmEgPSBvcHRpb25hbCBuYW1lIG9mIGFycmF5IHRvIGFzc2lnbiBkaXJlY3RvcnkgbGlzdCB0by5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgaW50ZWdlcjpcblwKKyAgVGhlIG51bWJlciBvZiBkaXJlY3RvcmllcyB0aGF0IG1hdGNoIGYxIGluIHRoZSBjdXJyZW50IG9yIGdpdmVuIGRpcmVjdG9yeVxuXAorICB0cmVlLiAgVXNlIHdpdGggXFxmbmV4dGZpbGUoKS5cbiIpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKworICAgICAgY2FzZSBGTl9ETkFNOiAgICAgICAgICAgICAgICAgICAgIC8qIERpcmVjdG9yeSBwYXJ0IG9mIGEgZmlsZW5hbWUgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZkaXJuYW1lKGYpIC0gRGlyZWN0b3J5IHBhcnQgb2YgYSBmaWxlbmFtZS5cblwKKyAgZiA9IGEgZmlsZSBzcGVjaWZpY2F0aW9uLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBkaXJlY3RvcnkgbmFtZTpcblwKKyAgVGhlIGZ1bGwgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgdGhlIGZpbGUgaXMgaW4sIG9yIGlmIHRoZSBmaWxlIGlzIGFcblwKKyAgZGlyZWN0b3J5LCBpdHMgZnVsbCBuYW1lLlxuIik7CisgICAgICAgIGJyZWFrOworCisjaWZuZGVmIE5PUkFORE9NCisgICAgICBjYXNlIEZOX1JBTkQ6ICAgICAgICAgICAgICAgICAgICAgLyogUmFuZG9tIG51bWJlciAqLworICAgICAgICBwcmludGYoIlxcZnJhbmRvbShuKSAtIFJhbmRvbSBudW1iZXIuXG5cCisgIG4gPSBhIHBvc2l0aXZlIGludGVnZXIuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIGludGVnZXI6XG5cCisgIEEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIG4tMS5cbiIpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1JBTkRPTSAqLworCisgICAgICBjYXNlIEZOX1NQTElUOiAgICAgICAgICAgICAgICAgICAgLyogU3BsaXQgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZzcGxpdChzMSwmYSxzMixzMyxuMixuMykgLSBcCitBc3NpZ24gc3RyaW5nIHdvcmRzIHRvIGFuIGFycmF5LlxuXAorICBzMSA9IHNvdXJjZSBzdHJpbmdcbiAgJmEgPSBhcnJheSBkZXNpZ25hdG9yXG4gIHMyID0gb3B0aW9uYWwgYnJlYWsgc2V0LlxuIik7CisgICAgICAgIHByaW50ZigiICBzMyA9IG9wdGlvbmFsIGluY2x1ZGUgc2V0LlxuIik7CisgICAgICAgIHByaW50ZigiICBuMiA9IG9wdGlvbmFsIGdyb3VwaW5nIG1hc2suXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIG4zID0gb3B0aW9uYWwgc2VwYXJhdG9yIGZsYWcuXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIHMyLCBzMywgbjIsIG4zIGFyZSBhcyBpbiBcXGZ3b3JkKCkuXG4iKTsKKyAgICAgICAgcHJpbnRmKAorIiAgQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWw7IGlmIFxcJmFbXSBhbHJlYWR5IGV4aXN0cywgaXQgaXMgcmVjeWNsZWQ7XG5cCisgIGlmIGFycmF5IG5vdCBzcGVjaWZpZWQsIHRoZSBjb3VudCBpcyByZXR1cm5lZCBidXQgbm8gYXJyYXkgaXMgY3JlYXRlZC5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgaW50ZWdlcjpcblwKKyAgTnVtYmVyIG9mIHdvcmRzIGluIHNvdXJjZSBzdHJpbmcuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fRFRJTTogICAgICAgICAgICAgICAgICAgICAvKiBDVlREQVRFICovCisgICAgICAgIHByaW50ZigiXFxmY3Z0ZGF0ZShbZGF0ZS10aW1lXVssbjFdKSAtIERhdGUvdGltZSBjb252ZXJzaW9uLlxuIik7CisgICAgICAgIHByaW50ZigiICBDb252ZXJ0cyBkYXRlIGFuZC9vciB0aW1lIHRvIHN0YW5kYXJkIGZvcm1hdC5cbiIpOworICAgICAgICBwcmludGYoIiAgSWYgbm8gZGF0ZS90aW1lIGdpdmVuLCByZXR1cm5zIGN1cnJlbnQgZGF0ZS90aW1lLlxuIik7CisgICAgICAgIHByaW50ZigiICBbZGF0ZS10aW1lXSwgaWYgZ2l2ZW4sIGlzIGZyZWUtZm9ybWF0IGRhdGUgYW5kL29yIHRpbWUuXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIEhFTFAgREFURSBmb3IgaW5mbyBhYm91dCBkYXRlLXRpbWUgZm9ybWF0cy5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgc3RyaW5nOlxuXAorICBTdGFuZGFyZC1mb3JtYXQgZGF0ZSBhbmQgdGltZTogeXl5eW1tZGQgaGg6bW06c3MgKG51bWVyaWMpXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIElmIG4xIGlzIGdpdmVuOlxuXAorICBuMSA9IDE6IHl5eXktbW1tLWRkIGhoOm1tOnNzIChtbW0gPSBFbmdsaXNoIDMtbGV0dGVyIG1vbnRoIGFiYnJldmlhdGlvbilcblwKKyAgbjEgPSAyOiBkZC1tbW0teXl5eSBoaDptbTpzcyAoZGl0dG8pXG5cCisgIG4xID0gMzogeXl5eW1tZGRoaG1tc3MgKGFsbCBudW1lcmljKVxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX0pEQVRFOiAgICAgICAgICAgICAgICAgICAgLyogRE9ZICovCisgICAgICAgIHByaW50ZigiXFxmZG95KFtkYXRlLXRpbWVdKSAtIERheSBvZiBZZWFyLlxuIik7CisgICAgICAgIHByaW50ZigiICBDb252ZXJ0cyBkYXRlIGFuZC9vciB0aW1lIHRvIGRheS1vZi15ZWFyIChET1kpIGZvcm1hdC5cbiIpOworICAgICAgICBwcmludGYoIiAgSWYgbm8gZGF0ZS90aW1lIGdpdmVuLCByZXR1cm5zIGN1cnJlbnQgZGF0ZS5cbiIpOworICAgICAgICBwcmludGYoIiAgW2RhdGUtdGltZV0sIGlmIGdpdmVuLCBpcyBmcmVlLWZvcm1hdCBkYXRlIGFuZC9vciB0aW1lLlxuIik7CisgICAgICAgIHByaW50ZigiICBIRUxQIERBVEUgZm9yIGluZm8gYWJvdXQgZGF0ZS10aW1lIGZvcm1hdHMuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIG51bWVyaWMgc3RyaW5nOlxuXAorICBET1k6IHl5eXlkZGQsIHdoZXJlIGRkZCBpcyAxLWJhc2VkIGRheSBudW1iZXIgaW4geWVhci5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9QTkNWVDoKKyAgICAgICAgcHJpbnRmKCJcXGZkaWFsY29udmVydChwaG9uZS1udW1iZXIpIC0gQ29udmVydCBwaG9uZSBudW1iZXIuXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIENvbnZlcnRzIHRoZSBnaXZlbiBwaG9uZSBudW1iZXIgZm9yIGRpYWxpbmcgYWNjb3JkaW5nXG4iKTsKKyAgICAgICAgcHJpbnRmKAorIiAgdG8gdGhlIHByZXZhaWxpbmcgZGlhbGluZyBydWxlcyAtLSBjb3VudHJ5IGNvZGUsIGFyZWEgY29kZSwgZXRjLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBzdHJpbmc6XG5cCisgIFRoZSBkaWFsIHN0cmluZyB0aGF0IHdvdWxkIGJlIHVzZWQgaWYgdGhlIHNhbWUgcGhvbmUgbnVtYmVyIGhhZCBiZWVuXG5cCisgIGdpdmVuIHRvIHRoZSBESUFMIGNvbW1hbmQuXG4iCisgICAgICAgICAgICAgICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX0RBVEVKOiAgICAgICAgICAgICAgICAgICAgLyogRE9ZMkRBVEUgKi8KKyAgICAgICAgcHJpbnRmKCJcXGZkb3kyZGF0ZShbZG95WyB0aW1lXV0pIC0gRGF5IG9mIFllYXIgdG8gRGF0ZS5cbiIpOworICAgICAgICBwcmludGYoIiAgQ29udmVydHMgeXl5eW1tbSB0byB5eXl5bW1kZFxuIik7CisgICAgICAgIHByaW50ZigiICBJZiB0aW1lIGluY2x1ZGVkLCBpdCBpcyBjb252ZXJ0ZWQgdG8gMjQtaG91ciBmb3JtYXQuIik7CisgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICJSZXR1cm5zIHN0YW5kYXJkIGRhdGUgb3IgZGF0ZS10aW1lIHN0cmluZyB5eXl5bW1kZCBoaDptbTpzc1xuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX01KRDoKKyAgICAgICAgcHJpbnRmKCJcXGZtamQoW1tkYXRlXVsgdGltZV1dKSAtIE1vZGlmaWVkIEp1bGlhbiBEYXRlIChNSkQpLlxuIik7CisgICAgICAgIHByaW50ZigKKyIgIENvbnZlcnRzIGRhdGUgYW5kL29yIHRpbWUgdG8gTUpELCB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgMTcgTm92IDE4NTguXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIEhFTFAgREFURSBmb3IgaW5mbyBhYm91dCBkYXRlLXRpbWUgZm9ybWF0cy5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnM6IGludGVnZXIuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fTUpEMjoKKyAgICAgICAgcHJpbnRmKCJcXGZtamQyZGF0ZShtamQpIC0gTW9kaWZpZWQgSnVsaWFuIERhdGUgKE1KRCkgdG8gRGF0ZS5cbiIpOworICAgICAgICBwcmludGYoIiAgQ29udmVydHMgTUpEIHRvIHN0YW5kYXJkLWZvcm1hdCBkYXRlLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJuczogeXl5eW1tZGQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fREFZOgorICAgICAgICBwcmludGYoIlxcZmRheShbW2RhdGVdWyB0aW1lXV0pIC0gRGF5IG9mIFdlZWsuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIGRheSBvZiB3ZWVrIG9mIGdpdmVuIGRhdGUgYXMgTW9uLCBUdWUsIGV0Yy5cbiIpOworICAgICAgICBwcmludGYoIkhFTFAgREFURSBmb3IgaW5mbyBhYm91dCBkYXRlLXRpbWUgZm9ybWF0cy5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9OREFZOgorICAgICAgICBwcmludGYoIlxcZm5kYXkoW1tkYXRlXVsgdGltZV1dKSAtIE51bWVyaWMgRGF5IG9mIFdlZWsuXG4iKTsKKyAgICAgICAgcHJpbnRmKAorICAgICJSZXR1cm5zIG51bWVyaWMgZGF5IG9mIHdlZWsgb2YgZ2l2ZW4gZGF0ZSwgMD1TdW4sIDE9TW9uLCAuLi4sIDY9U2F0LlxuIik7CisgICAgICAgIHByaW50ZigiSEVMUCBEQVRFIGZvciBpbmZvIGFib3V0IGRhdGUtdGltZSBmb3JtYXRzLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX1RJTUU6CisgICAgICAgIHByaW50ZigiXFxmdGltZShbW2RhdGVdWyB0aW1lXV0pIC0gVGltZS5cbiIpOworICAgICAgICBwcmludGYoCisiUmV0dXJucyB0aW1lIHBvcnRpb24gb2YgZ2l2ZW4gZGF0ZSBhbmQvb3IgdGltZSBpbiBoaDptbTpzcyBmb3JtYXQuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJJZiBubyBhcmd1bWVudCBnaXZlbiwgcmV0dXJucyBjdXJyZW50IHRpbWUuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJIRUxQIERBVEUgZm9yIGluZm8gYWJvdXQgZGF0ZS10aW1lIGZvcm1hdHMuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fTlRJTToKKyAgICAgICAgcHJpbnRmKCJcXGZudGltZShbW2RhdGVdWyB0aW1lXV0pIC0gTnVtZXJpYyBUaW1lLlxuIik7CisgICAgICAgIHByaW50ZigKKyJSZXR1cm5zIHRpbWUgcG9ydGlvbiBvZiBnaXZlbiBkYXRlIGFuZC9vciB0aW1lIGFzIHNlY29uZHMgc2luY2UgbWlkbmlnaHQuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJJZiBubyBhcmd1bWVudCBnaXZlbiwgcmV0dXJucyBjdXJyZW50IHRpbWUuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJIRUxQIERBVEUgZm9yIGluZm8gYWJvdXQgZGF0ZS10aW1lIGZvcm1hdHMuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fTjJUSU06CisgICAgICAgIHByaW50ZigiXFxmbjJ0aW1lKHNlY29uZHMpIC0gTnVtZXJpYyBUaW1lIHRvIFRpbWUuXG4iKTsKKyAgICAgICAgcHJpbnRmKAorIlJldHVybnMgdGhlIGdpdmVuIG51bWJlciBvZiBzZWNvbmRzIGluIGhoOm1tOnNzIGZvcm1hdC5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9QRVJNOgorICAgICAgICBwcmludGYoIlxcZnBlcm1pc3Npb25zKGZpbGUpIC0gUGVybWlzc2lvbnMgb2YgRmlsZS5cbiIpOworICAgICAgICBwcmludGYoCisjaWZkZWYgVU5JWAorIlJldHVybnMgcGVybWlzc2lvbnMgb2YgZ2l2ZW4gZmlsZSBhcyB0aGV5IHdvdWxkIGJlIHNob3duIGJ5IFwibHMgLWxcIi5cbiIKKyNlbHNlCisjaWZkZWYgVk1TCisiUmV0dXJucyBwZXJtaXNzaW9ucyBvZiBnaXZlbiBmaWxlIGFzIHRoZXkgd291bGQgYmUgc2hvd24gYnkgXCJkaXIgL3Byb3RcIi5cbiIKKyNlbHNlCisiUmV0dXJucyB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIGdpdmVuIGZpbGUuXG4iCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogVU5JWCAqLworICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fQUxPT0s6CisgICAgICAgIHByaW50ZigiXFxmYXJyYXlsb29rKHBhdHRlcm4sJmEpIC0gTG9va3VwIHBhdHRlcm4gaW4gYXJyYXkuXG5cCisgIHBhdHRlcm4gPSBTdHJpbmcgb3IgcGF0dGVyblxuIik7CisgICAgICAgIHByaW50ZigiICAmYSA9IGFycmF5IGRlc2lnbmF0b3IsIGNhbiBpbmNsdWRlIHJhbmdlIHNwZWNpZmllci5cbiIpOworICAgICAgICBwcmludGYoCisiUmV0dXJucyBudW1iZXI6XG5cCisgIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgYXJyYXkgZWxlbWVudCBvciAtMSBpZiBub25lLlxuIik7CisgICAgICAgIHByaW50ZigiTW9yZSBpbmZvOlxuXAorICBIRUxQIFBBVFRFUk4gZm9yIHBhdHRlcm4gc3ludGF4LlxuICBIRUxQIEFSUkFZIGZvciBhcnJheXMuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fVExPT0s6CisgICAgICAgIHByaW50ZigKKyJcXGZ0YWJsZWxvb2soa2V5d29yZCwmYSxbY10pIC0gTG9va3VwIGtleXdvcmQgaW4ga2V5d29yZCB0YWJsZS5cblwKKyAgcGF0dGVybiA9IFN0cmluZ1xuIik7CisgICAgICAgIHByaW50ZigiICBrZXl3b3JkID0ga2V5d29yZCB0byBsb29rIHVwIChjYW4gYmUgYWJicmV2aWF0ZWQpLlxuIik7CisgICAgICAgIHByaW50ZigiICAmYSAgICAgID0gYXJyYXkgZGVzaWduYXRvciwgY2FuIGluY2x1ZGUgcmFuZ2Ugc3BlY2lmaWVyLlxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgICAgICAgVGhpcyBhcnJheSBtdXN0IGJlIGluIGFscGhhYmV0aWNhbCBvcmRlci5cbiIpOworICAgICAgICBwcmludGYoIiAgYyAgICAgICA9IE9wdGlvbmFsIGZpZWxkIGRlbGltaXRlciwgY29sb24oOikgYnkgZGVmYXVsdC5cbiIpOworICAgICAgICBwcmludGYoCisiUmV0dXJucyBudW1iZXI6XG5cCisgIDEgb3IgZ3JlYXRlciwgaW5kZXggb2YgYXJyYXkgZWxlbWVudCB0aGF0IHVuaXF1ZWx5IG1hdGNoZXMgZ2l2ZW4ga2V5d29yZDtcbiIKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIHByaW50ZigKKyJvciAtMiBpZiBrZXl3b3JkIHdhcyBhbWJpZ3VvdXMsIG9yIC0xIGlmIGtleXdvcmQgZW1wdHkgb3Igbm90IGZvdW5kLlxuIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcHJpbnRmKCJBbHNvIHNlZTpcblwKKyAgSEVMUCBGVU5DIEFSUkFZTE9PSyBmb3IgYSBzaW1pbGFyIGZ1bmN0aW9uLlxuICBIRUxQIEFSUkFZIGZvciBhcnJheXMuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fQUJTOiAgICAgICAgICAgICAgICAgICAgICAvKiBBYnNvbHV0ZSAqLworICAgICAgICBwcmludGYoIlxcZmFic29sdXRlKG4xKVxuXAorICBuMSA9IGludGVnZXIuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIGludGVnZXI6XG5cCisgIFRoZSBhYnNvbHV0ZSAodW5zaWduZWQpIHZhbHVlIG9mIG4xLlxuIik7CisgICAgICAgIGJyZWFrOworCisjaWZkZWYgRk5GTE9BVAorICAgICAgY2FzZSBGTl9GUEFCUzoKKyAgICAgICAgcHJpbnRmKCJcXGZmcGFic29sdXRlKGYxLGQpXG5cCisgIGYxID0gZmxvYXRpbmctcG9pbnQgbnVtYmVyIG9yIGludGVnZXIuXG5cCisgICBkID0gaW50ZWdlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgZmxvYXRpbmctcG9pbnQgbnVtYmVyOlxuXAorICBUaGUgYWJzb2x1dGUgKHVuc2lnbmVkKSB2YWx1ZSBvZiBmMSB0byBkIGRlY2ltYWwgcGxhY2VzLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX0ZQQUREOgorICAgICAgICBwcmludGYoIlxcZmZwYWRkKGYxLGYyLGQpXG5cCisgIGYxLGYyID0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBvciBpbnRlZ2Vycy5cblwKKyAgICAgIGQgPSBpbnRlZ2VyLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBmbG9hdGluZy1wb2ludCBudW1iZXI6XG5cCisgIFRoZSBzdW0gb2YgZjEgYW5kIGYyIHRvIGQgZGVjaW1hbCBwbGFjZXMuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fRlBTVUI6CisgICAgICAgIHByaW50ZigiXFxmZnBzdWJ0cmFjdChmMSxmMixkKVxuXAorICBmMSxmMiA9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgb3IgaW50ZWdlcnMuXG5cCisgICAgICBkID0gaW50ZWdlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgZmxvYXRpbmctcG9pbnQgbnVtYmVyOlxuXAorICBmMSBtaW51cyBmMiB0byBkIGRlY2ltYWwgcGxhY2VzLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX0ZQTVVMOgorICAgICAgICBwcmludGYoIlxcZmZwbXVsdGlwbHkoZjEsZjIsZClcblwKKyAgZjEsZjIgPSBmbG9hdGluZy1wb2ludCBudW1iZXJzIG9yIGludGVnZXJzLlxuXAorICAgICAgZCA9IGludGVnZXIuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIGZsb2F0aW5nLXBvaW50IG51bWJlcjpcblwKKyAgVGhlIHByb2R1Y3Qgb2YgZjEgYW5kIGYyIHRvIGQgZGVjaW1hbCBwbGFjZXMuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fRlBESVY6CisgICAgICAgIHByaW50ZigiXFxmZnBkaXZpZGUoZjEsZjIsZClcblwKKyAgZjEsZjIgPSBmbG9hdGluZy1wb2ludCBudW1iZXJzIG9yIGludGVnZXJzLlxuXAorICAgICAgZCA9IGludGVnZXIuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIGZsb2F0aW5nLXBvaW50IG51bWJlcjpcblwKKyAgZjEgZGl2aWRlZCBieSBmMiB0byBkIGRlY2ltYWwgcGxhY2VzLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX0ZQTUFYOgorICAgICAgICBwcmludGYoIlxcZmZwbWF4aW11bShmMSxmMixkKVxuXAorICBmMSxmMiA9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgb3IgaW50ZWdlcnMuXG5cCisgICAgICBkID0gaW50ZWdlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgZmxvYXRpbmctcG9pbnQgbnVtYmVyOlxuXAorICBUaGUgbWF4aW11bSBvZiBmMSBhbmQgZjIgdG8gZCBkZWNpbWFsIHBsYWNlcy5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9GUE1JTjoKKyAgICAgICAgcHJpbnRmKCJcXGZmcG1pbmltdW0oZjEsZjIsZClcblwKKyAgZjEsZjIgPSBmbG9hdGluZy1wb2ludCBudW1iZXJzIG9yIGludGVnZXJzLlxuXAorICAgICAgZCA9IGludGVnZXIuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIGZsb2F0aW5nLXBvaW50IG51bWJlcjpcblwKKyAgVGhlIG1pbmltdW0gb2YgZjEgYW5kIGYyIHRvIGQgZGVjaW1hbCBwbGFjZXMuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fRlBNT0Q6CisgICAgICAgIHByaW50ZigiXFxmZnBtb2R1bHVzKGYxLGYyLGQpXG5cCisgIGYxLGYyID0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBvciBpbnRlZ2Vycy5cblwKKyAgICAgIGQgPSBpbnRlZ2VyLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBmbG9hdGluZy1wb2ludCBudW1iZXI6XG5cCisgIFRoZSBtb2R1bHVzIG9mIGYxIGFuZCBmMiB0byBkIGRlY2ltYWwgcGxhY2VzLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX0ZQUE9XOgorICAgICAgICBwcmludGYoIlxcZmZwcmFpc2UoZjEsZjIsZClcblwKKyAgZjEsZjIgPSBmbG9hdGluZy1wb2ludCBudW1iZXJzIG9yIGludGVnZXJzLlxuXAorICAgICAgZCA9IGludGVnZXIuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIGZsb2F0aW5nLXBvaW50IG51bWJlcjpcblwKKyAgZjEgcmFpc2VkIHRvIHRoZSBwb3dlciBmMiwgdG8gZCBkZWNpbWFsIHBsYWNlcy5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9GUENPUzoKKyAgICAgICAgcHJpbnRmKCJcXGZmcGNvc2luZShmMSxkKVxuXAorICBmMSA9IGZsb2F0aW5nLXBvaW50IG51bWJlciBvciBpbnRlZ2VyLlxuXAorICAgZCA9IGludGVnZXIuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIGZsb2F0aW5nLXBvaW50IG51bWJlcjpcblwKKyAgVGhlIGNvc2luZSBvZiBhbmdsZSBmMSAoaW4gcmFkaWFucykgdG8gZCBkZWNpbWFsIHBsYWNlcy5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9GUFNJTjoKKyAgICAgICAgcHJpbnRmKCJcXGZmcHNpbmUoZjEsZClcblwKKyAgZjEgPSBmbG9hdGluZy1wb2ludCBudW1iZXIgb3IgaW50ZWdlci5cblwKKyAgIGQgPSBpbnRlZ2VyLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBmbG9hdGluZy1wb2ludCBudW1iZXI6XG5cCisgIFRoZSBzaW5lIG9mIGFuZ2xlIGYxIChpbiByYWRpYW5zKSB0byBkIGRlY2ltYWwgcGxhY2VzLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX0ZQVEFOOgorICAgICAgICBwcmludGYoIlxcZmZwdGFuZ2VudChmMSxkKVxuXAorICBmMSA9IGZsb2F0aW5nLXBvaW50IG51bWJlciBvciBpbnRlZ2VyLlxuXAorICAgZCA9IGludGVnZXIuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIGZsb2F0aW5nLXBvaW50IG51bWJlcjpcblwKKyAgVGhlIHRhbmdlbnQgb2YgYW5nbGUgZjEgKGluIHJhZGlhbnMpIHRvIGQgZGVjaW1hbCBwbGFjZXMuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fRlBFWFA6CisgICAgICAgIHByaW50ZigiXFxmZnBleHAoZjEsZClcblwKKyAgZjEgPSBmbG9hdGluZy1wb2ludCBudW1iZXIgb3IgaW50ZWdlci5cblwKKyAgIGQgPSBpbnRlZ2VyLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBmbG9hdGluZy1wb2ludCBudW1iZXI6XG5cCisgIGUgKHRoZSBiYXNlIG9mIG5hdHVyYWwgbG9nYXJpdGhtcykgcmFpc2VkIHRvIHRoZSBmMSBwb3dlcixcblwKKyAgdG8gZCBkZWNpbWFsIHBsYWNlcy5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9GUElOVDoKKyAgICAgICAgcHJpbnRmKCJcXGZmcGludChmMSlcblwKKyAgZjEgPSBmbG9hdGluZy1wb2ludCBudW1iZXIgb3IgaW50ZWdlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgaW50ZWdlcjpcblwKKyAgVGhlIGludGVnZXIgcGFydCBvZiBmMS5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9GUExPRzoKKyAgICAgICAgcHJpbnRmKCJcXGZmcGxvZzEwKGYxLGQpXG5cCisgIGYxID0gZmxvYXRpbmctcG9pbnQgbnVtYmVyIG9yIGludGVnZXIuXG5cCisgICBkID0gaW50ZWdlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgZmxvYXRpbmctcG9pbnQgbnVtYmVyOlxuXAorICBUaGUgbG9nYXJpdGhtLCBiYXNlIDEwLCBvZiBmMSB0byBkIGRlY2ltYWwgcGxhY2VzLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX0ZQTE46CisgICAgICAgIHByaW50ZigiXFxmZnBsb2duKGYxLGQpXG5cCisgIGYxID0gZmxvYXRpbmctcG9pbnQgbnVtYmVyIG9yIGludGVnZXIuXG5cCisgICBkID0gaW50ZWdlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgZmxvYXRpbmctcG9pbnQgbnVtYmVyOlxuXAorICBUaGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgZjEgdG8gZCBkZWNpbWFsIHBsYWNlcy5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9GUFJPVToKKyAgICAgICAgcHJpbnRmKCJcXGZmcHJvdW5kKGYxLGQpXG5cCisgIGYxID0gZmxvYXRpbmctcG9pbnQgbnVtYmVyIG9yIGludGVnZXIuXG5cCisgICBkID0gaW50ZWdlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgZmxvYXRpbmctcG9pbnQgbnVtYmVyOlxuXAorICBmMSByb3VuZGVkIHRvIGQgZGVjaW1hbCBwbGFjZXMuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fRlBTUVI6CisgICAgICAgIHByaW50ZigiXFxmZnBzcXJ0KGYxLGQpXG5cCisgIGYxID0gZmxvYXRpbmctcG9pbnQgbnVtYmVyIG9yIGludGVnZXIuXG5cCisgICBkID0gaW50ZWdlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgZmxvYXRpbmctcG9pbnQgbnVtYmVyOlxuXAorICBUaGUgc3F1YXJlIHJvb3Qgb2YgZjEgdG8gZCBkZWNpbWFsIHBsYWNlcy5cbiIpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBGTkZMT0FUICovCisKKyNpZmRlZiBDS0NIQU5ORUxJTworICAgICAgY2FzZSBGTl9GRU9GOgorICAgICAgICBwcmludGYoIlxcZl9lb2YobjEpXG5cCisgIG4xID0gY2hhbm5lbCBudW1iZXIuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIG51bWJlcjpcblwKKyAgMSBpZiBjaGFubmVsIG4xIGF0IGVuZCBvZiBmaWxlLCAwIG90aGVyd2lzZS5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fRlBPUzoKKyAgICAgICAgcHJpbnRmKCJcXGZfcG9zKG4xKVxuXAorICBuMSA9IGNoYW5uZWwgbnVtYmVyLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJucyBudW1iZXI6XG5cCisgIFJlYWQvd3JpdGUgcG9pbnRlciBvZiBjaGFubmVsIG4xIGFzIGJ5dGUgbnVtYmVyLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9OTElORToKKyAgICAgICAgcHJpbnRmKCJcXGZfbGluZShuMSlcblwKKyAgbjEgPSBjaGFubmVsIG51bWJlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgbnVtYmVyOlxuXAorICBSZWFkL3dyaXRlIHBvaW50ZXIgb2YgY2hhbm5lbCBuMSBhcyBsaW5lIG51bWJlci5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fRklMTk86CisgICAgICAgIHByaW50ZigiXFxmX2hhbmRsZShuMSlcblwKKyAgbjEgPSBjaGFubmVsIG51bWJlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgbnVtYmVyOlxuXAorICBGaWxlICVzIG9mIG9wZW4gZmlsZSBvbiBjaGFubmVsIG4xLlxuIiwKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICJoYW5kbGUiCisjZWxzZQorICAgICAgICAgICAgICAgImRlc2NyaXB0b3IiCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fRlNUQVQ6CisgICAgICAgIHByaW50ZigiXFxmX3N0YXR1cyhuMSlcblwKKyAgbjEgPSBjaGFubmVsIG51bWJlci5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnMgbnVtYmVyOlxuXAorICBTdW0gb2Ygb3BlbiBtb2RlcyBvZiBjaGFubmVsIG4xOiAxID0gcmVhZDsgMiA9IHdyaXRlOyA0ID0gYXBwZW5kLCBvcjpcblwKKyAgMCBpZiBub3Qgb3Blbi5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fRkdDSEFSOgorICAgICAgICBwcmludGYoIlxcZl9nZXRjaGFyKG4xKVxuXAorICBuMSA9IGNoYW5uZWwgbnVtYmVyLlxuIik7CisgICAgICAgIHByaW50ZigiICBSZWFkcyBhIGNoYXJhY3RlciBmcm9tIGNoYW5uZWwgbjEgYW5kIHJldHVybnMgaXQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX0ZHTElORToKKyAgICAgICAgcHJpbnRmKCJcXGZfZ2V0bGluZShuMSlcblwKKyAgbjEgPSBjaGFubmVsIG51bWJlci5cbiIpOworICAgICAgICBwcmludGYoIiAgUmVhZHMgYSBsaW5lIGZyb20gY2hhbm5lbCBuMSBhbmQgcmV0dXJucyBpdC5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fRkdCTEs6CisgICAgICAgIHByaW50ZigiXFxmX2dldGJsb2NrKG4xLG4yKVxuXAorICBuMSA9IGNoYW5uZWwgbnVtYmVyLCBuMiA9IHNpemVcbiIpOworICAgICAgICBwcmludGYoCisiICBSZWFkcyBhIGJsb2NrIG9mIG4yIGNoYXJhY3RlcnMgZnJvbSBjaGFubmVsIG4xIGFuZCByZXR1cm5zIGl0LlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGTl9GUENIQVI6CisgICAgICAgIHByaW50ZigiXFxmX3B1dGNoYXIobjEsYylcblwKKyAgbjEgPSBjaGFubmVsIG51bWJlciwgYyA9IGNoYXJhY3RlclxuIik7CisgICAgICAgIHByaW50ZigiICBXcml0ZXMgYSBjaGFyYWN0ZXIgdG8gY2hhbm5lbCBuMS5cblwKK1JldHVybnMgbnVtYmVyOlxuXAorICAxIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX0ZQTElORToKKyAgICAgICAgcHJpbnRmKCJcXGZfcHV0bGluZShuMSxzMSlcblwKKyAgbjEgPSBjaGFubmVsIG51bWJlciwgczEgPSBzdHJpbmdcbiIpOworICAgICAgICBwcmludGYoCisiICBXcml0ZXMgdGhlIHN0cmluZyBzMSB0byBjaGFubmVsIG4xIGFuZCBhZGRzIGEgbGluZSB0ZXJtaW5hdG9yLlxuXAorUmV0dXJucyBudW1iZXI6XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIEhvdyBtYW55IGNoYXJhY3RlcnMgd3JpdHRlbiBpZiBzdWNjZXNzZnVsO1xuXAorICBPdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLlxuIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZOX0ZQQkxLOgorICAgICAgICBwcmludGYoIlxcZl9wdXRibG9jayhuMSxzMSlcblwKKyAgbjEgPSBjaGFubmVsIG51bWJlciwgczEgPSBzdHJpbmdcbiIpOworICAgICAgICBwcmludGYoCisiICBXcml0ZXMgdGhlIHN0cmluZyBzMSB0byBjaGFubmVsIG4xLlxuXAorICBSZXR1cm5zIG51bWJlcjpcbiIpOworICAgICAgICBwcmludGYoIiAgSG93IG1hbnkgY2hhcmFjdGVycyB3cml0dGVuIGlmIHN1Y2Nlc3NmdWw7XG5cCisgIE90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuXG4iCisgICAgICAgICAgICAgICApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fRkVSTVNHOgorICAgICAgICBwcmludGYoIlxcZl9lcnJtc2coW24xXSlcblwKKyAgbjEgPSBudW1lcmljIGVycm9yIGNvZGUsIFxcdihmX2Vycm9yKSBieSBkZWZhdWx0LlxuIik7CisgICAgICAgIHByaW50ZigiICBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGVycm9yIG1lc3NhZ2Ugc3RyaW5nLlxuIik7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLQ0hBTk5FTElPICovCisKKyAgICAgIGNhc2UgRk5fQUFEVU1QOgorICAgICAgICBwcmludGYoIlxcZmFhY29udmVydChuYW1lLCZhWywmYl0pXG5cCisgIG5hbWUgPSBuYW1lIG9mIGFzc29jaWF0aXZlIGFycmF5LCAmYSBhbmQgJmIgPSBuYW1lcyBvZiByZWd1bGFyIGFycmF5cy5cbiIpOworICAgICAgICBwcmludGYoCisiICBDb252ZXJ0cyB0aGUgZ2l2ZW4gYXNzb2NpYXRpdmUgYXJyYXkgaW50byB0d28gcmVndWxhciBhcnJheXMsICZhIGFuZCAmYixcblwKKyAgY29udGFpbmluZyB0aGUgaW5kaWNlcyBhbmQgdmFsdWVzLCByZXNwZWN0aXZlbHk6XG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zIG51bWJlcjpcblwKKyAgSG93IG1hbnkgZWxlbWVudHMgd2VyZSBjb252ZXJ0ZWQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBDS19LRVJCRVJPUworICAgICAgY2FzZSBGTl9LUkJfVEs6CisgICAgICAgIHByaW50ZigiXFxma3JidGlja2V0cyhuKVxuXAorICBuID0gS2VyYmVyb3MgdmVyc2lvbiBudW1iZXIgKDQgb3IgNSkuXG5cCisgIFJldHVybnMgc3RyaW5nOlxuXAorICBUaGUgbnVtYmVyIG9mIGFjdGl2ZSBLZXJiZXJvcyA0IG9yIDUgdGlja2V0cy5cblwKKyAgUmVzZXRzIHRoZSB0aWNrZXQgbGlzdCB1c2VkIGJ5IFxcZmtyYm5leHR0aWNrZXQobikuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fS1JCX05YOgorICAgICAgICBwcmludGYoIlxcZmtyYm5leHR0aWNrZXQobilcblwKKyAgbiA9IEtlcmJlcm9zIHZlcnNpb24gbnVtYmVyICg0IG9yIDUpLlxuXAorICBSZXR1cm5zIHN0cmluZzpcblwKKyAgICBUaGUgbmV4dCB0aWNrZXQgaW4gdGhlIEtlcmJlcm9zIDQgb3IgNSB0aWNrZXQgbGlzdCB0aGF0IHdhcyBzZXQgdXAgYnlcblwKKyAgICB0aGUgbW9zdCByZWNlbnQgaW52b2NhdGlvbiBvZiBcXGZrcmJ0aWNrZXRzKG4pLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX0tSQl9JVjoKKyAgICAgICAgcHJpbnRmKCJcXGZrcmJpc3ZhbGlkKG4sbmFtZSlcblwKKyAgbiAgICA9IEtlcmJlcm9zIHZlcnNpb24gbnVtYmVyICg0IG9yIDUpLlxuXAorICBuYW1lID0gYSB0aWNrZXQgbmFtZSBhcyByZXR1cm5lZCBieSBcXGZrcmJuZXh0dGlja2V0KG4pLlxuXAorICBSZXR1cm5zIG51bWJlcjpcblwKKyAgICAxIGlmIHRoZSB0aWNrZXQgaXMgdmFsaWQsIDAgaWYgbm90IHZhbGlkLlxuXAorICAgIEEgdGlja2V0IGlzIHZhbGlkIGlmIGFsbCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWU6XG5cbiIpOworICAgICAgICBwcmludGYoIlxuXAorICAgIChpKSAgIGl0IGV4aXN0cyBpbiB0aGUgY3VycmVudCBjYWNoZSBmaWxlO1xuXAorICAgIChpaSkgIGl0IGlzIG5vdCBleHBpcmVkO1xuXAorICAgIChpaWkpIGl0IGlzIG5vdCBtYXJrZWQgaW52YWxpZCAoSzUgb25seSk7XG5cCisgICAgKGl2KSAgaXQgd2FzIGlzc3VlZCBmcm9tIHRoZSBjdXJyZW50IElQIGFkZHJlc3NcbiIpOworICAgICAgICBwcmludGYoIlxuICBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkIGluIGFuIElGIHN0YXRlbWVudCwgZS5nLjpcblxuIik7CisgICAgICAgIHByaW50ZigiICAgIGlmIFxcZmtyYmlzdmFsaWQoNCxrcmJ0Z3QuRk9PLkJBUi5FRFVARk9PLkJBUi5FRFUpIC4uLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX0tSQl9UVDoKKyAgICAgICAgcHJpbnRmKCJcXGZrcmJ0aW1lbGVmdChuLG5hbWUpXG5cCisgIG4gICAgPSBLZXJiZXJvcyB2ZXJzaW9uIG51bWJlciAoNCBvciA1KS5cblwKKyAgbmFtZSA9IGEgdGlja2V0IG5hbWUgYXMgcmV0dXJuZWQgYnkgXFxma3JibmV4dHRpY2tldChuKS5cblwKKyAgUmV0dXJucyBzdHJpbmc6XG5cCisgICAgVGhlIG51bWJlciBvZiBzZWNvbmRzIHJlbWFpbmluZyBpbiB0aGUgdGlja2V0J3MgbGlmZXRpbWUuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fS1JCX0ZHOgorICAgICAgICBwcmludGYoIlxcZmtyYmZsYWdzKG4sbmFtZSlcblwKKyAgbiAgICA9IEtlcmJlcm9zIHZlcnNpb24gbnVtYmVyICg0IG9yIDUpLlxuXAorICBuYW1lID0gYSB0aWNrZXQgbmFtZSBhcyByZXR1cm5lZCBieSBcXGZrcmJuZXh0dGlja2V0KG4pLlxuXAorICBSZXR1cm5zIHN0cmluZzpcbiIpOworICAgICAgICBwcmludGYoCisiICAgIFRoZSBmbGFncyBzdHJpbmcgYXMgcmVwb3J0ZWQgd2l0aCBBVVRIIEs1IExJU1QgL0ZMQUdTLiAgVGhpcyBzdHJpbmcgY2FuXG5cCisgICAgYmUgc2VhcmNoZWQgZm9yIGEgcGFydGljdWxhciBmbGFnIHVzaW5nIHRoZSBcXGZpbmRleCgpIGZ1bmN0aW9uIHdoZW5cblwKKyAgICBTRVQgQ0FTRSBpcyBPTiAoZm9yIGNhc2Ugc2Vuc2l0aXZlIHNlYXJjaGVzKS4gIEZsYWcgc3RyaW5ncyBhcmUgb25seVxuXAorICAgIGF2YWlsYWJsZSBmb3IgSzUgdGlja2V0cy5cbiIpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCisgICAgICBjYXNlIEZOX1BBVFRFUk46CisgICAgICAgIHByaW50ZigiXFxmcGF0dGVybihzKVxuXAorICBzID0gc3RyaW5nXG5cCisgIFJldHVybnMgc3RyaW5nOiBzIHdpdGggYW55IHZhcmlhYmxlcywgZXRjLCBldmFsdWF0ZWQgaW4gdGhlIG5vcm1hbCBtYW5uZXIuXG4iCisgICAgICAgICAgICAgICApOworICAgICAgICBwcmludGYoIlwKKyAgRm9yIHVzZSB3aXRoIElOUFVULCBNSU5QVVQsIGFuZCBSRUlOUFVUIHRvIGRlY2xhcmUgdGhhdCBhIHNlYXJjaCB0YXJnZXQgaXNcblwKKyAgYSBwYXR0ZXJuIHJhdGhlciB0aGFuIGEgbGl0ZXJhbCBzdHJpbmcuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fSEVYMk46CisgICAgICAgIHByaW50ZigiXFxmaGV4Mm4ocylcblwKKyAgcyA9IGhleGFkZWNpbWFsIG51bWJlclxuXAorICBSZXR1cm5zIGRlY2ltYWwgZXF1aXZhbGVudC5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9IRVgySVA6CisgICAgICAgIHByaW50ZigiXFxmaGV4MmlwKHMpXG5cCisgIHMgPSA4LWRpZ2l0IGhleGFkZWNpbWFsIG51bWJlclxuXAorICBSZXR1cm5zIHRoZSBlcXVpdmFsZW50IGRlY2ltYWwgZG90dGVkIElQIGFkZHJlc3MuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fSVAySEVYOgorICAgICAgICBwcmludGYoIlxcZmlwMmhleChzKVxuXAorICBzID0gZGVjaW1hbCBkb3R0ZWQgSVAgYWRkcmVzc1xuXAorICBSZXR1cm5zIHRoZSBlcXVpdmFsZW50IDgtZGlnaXQgaGV4YWRlY2ltYWwgbnVtYmVyLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX09DVDJOOgorICAgICAgICBwcmludGYoIlxcZm9jdDJuKHMpXG5cCisgIHMgPSBvY3RhbCBudW1iZXJcblwKKyAgUmV0dXJucyBkZWNpbWFsIGVxdWl2YWxlbnQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fUkFESVg6CisgICAgICAgIHByaW50ZigiXFxmcmFkaXgocyxuMSxuMilcblwKKyAgcyA9IG51bWJlciBpbiByYWRpeCBuMVxuXAorICBSZXR1cm5zIHRoZSBudW1iZXIncyByZXByZXNlbnRhdGlvbiBpbiByYWRpeCBuMi5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9KT0lOOgorICAgICAgICBwcmludGYoIlxcZmpvaW4oJmFbLHNbLG4xWyxuMl1dXSlcblwKKyAgJmEgPSBhcnJheSBkZXNpZ25hdG9yLCBjYW4gaW5jbHVkZSByYW5nZSBzcGVjaWZpZXIuXG5cCisgIHMgID0gb3B0aW9uYWwgc2VwYXJhdG9yLlxuIik7CisgICAgICAgIHByaW50ZigiXAorICBuMSA9IG5vbnplcm8gdG8gcHV0IGdyb3VwaW5nIGFyb3VuZCBlbGVtZW50cyB0aGF0IGNvbnRhaW4gc3BhY2VzO1xuXAorICAgICAgIHNlZSBcXGZ3b3JkKCkgZ3JvdXBpbmcgbWFzayBmb3IgdmFsdWVzIG9mIG4uXG4iKTsKKyAgICAgICAgcHJpbnRmKCJcCisgIG4yID0gMCBvciBvbWl0dGVkIHRvIHB1dCBzcGFjZXMgYmV0d2VlbiBlbGVtZW50czsgbm9uemVybyB0byBvbWl0IHRoZW0uXG4iKTsKKyAgICAgICAgcHJpbnRmKCJcCisgIFJldHVybnMgdGhlIChzZWxlY3RlZCkgZWxlbWVudHMgb2YgdGhlIGFycmF5IGpvaW5lZCB0byB0b2dldGhlcixcblwKKyAgc2VwYXJhdGVkIGJ5IHRoZSBzZXBhcmF0b3IuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fU1VCU1Q6CisgICAgICAgIHByaW50ZigiXFxmc3Vic3RpdHV0ZShzMSxzMixzMylcblwKKyAgczEgPSBTb3VyY2Ugc3RyaW5nLlxuXAorICBzMiA9IExpc3Qgb2YgY2hhcmFjdGVycyB0byBiZSB0cmFuc2xhdGVkLlxuXAorICBzMyA9IExpc3Qgb2YgY2hhcmFjdGVycyB0byB0cmFuc2xhdGUgdGhlbSB0by5cbiIpOworICAgICAgICBwcmludGYoCisiICBSZXR1cm5zOiBzMSwgd2l0aCBlYWNoIGNoYXJhY3RlciB0aGF0IGlzIGluIHMyIHRyYW5zbGF0ZWQgdG8gdGhlXG5cCisgIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyIGluIHMzLiAgczIgYW5kIHMzIGNhbiBjb250YWluIEFTQ0lJIHJhbmdlcyxcblwKKyAgbGlrZSBbYS16XS4gIEFueSBjaGFyYWN0ZXJzIGluIHMyIHRoYXQgZG9uJ3QgaGF2ZSBjb3JyZXNwb25kaW5nXG5cCisgIGNoYXJhY3RlcnMgaW4gczMgKGFmdGVyIHJhbmdlIGV4cGFuc2lvbikgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcmVzdWx0LlxuIik7CisgICAgICAgIGJyZWFrOworCisjaWZuZGVmIE5PU0VYUAorICAgICAgY2FzZSBGTl9TRVhQOgorICAgICAgICBwcmludGYoIlxcZnNleHByZXNzaW9uKHMxKVxuXAorICBzMSA9IFMtRXhwcmVzc2lvbi5cbiIpOworICAgICAgICBwcmludGYoIiAgUmV0dXJuczogVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHMxLlxuIik7CisgICAgICAgIGJyZWFrOworCisjZW5kaWYgLyogTk9TRVhQICovCisKKyAgICAgIGNhc2UgRk5fQ01EU1RLOgorICAgICAgICBwcmludGYoIlxcZmNtZHN0YWNrKG4xLG4yKVxuXAorICBuMSA9IENvbW1hbmQtc3RhY2sgbGV2ZWwsIDAgdG8gXFx2KGNtZGxldmVsKSwgZGVmYXVsdCBcXHYoY21kbGV2ZWwpLlxuXAorICBuMiA9IEZ1bmN0aW9uIGNvZGUsIDAgb3IgMS5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnM6XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIG4yID0gMDogbmFtZSBvZiBvYmplY3QgYXQgc3RhY2sgbGV2ZWwgbjFcblwKKyAgbjIgPSAxOiB0eXBlIG9mIG9iamVjdCBhdCBzdGFjayBsZXZlbCBuMTpcblwKKyAgICAgMCA9IGludGVyYWN0aXZlIHByb21wdFxuXAorICAgICAxID0gY29tbWFuZCBmaWxlXG5cCisgICAgIDIgPSBtYWNyb1xuIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICBicmVhazsKKworI2lmZGVmIENLRkxPQVQKKyAgICAgIGNhc2UgRk5fRElGREFURToKKyAgICAgICAgcHJpbnRmKCJcXGZkaWZmZGF0ZXMoZDEsZDIpXG5cCisgIGQxID0gZnJlZS1mb3JtYXQgZGF0ZSBhbmQvb3IgdGltZSAoZGVmYXVsdCA9IE5PVykuXG5cCisgIGQyID0gZGl0dG8uXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zOlxuIik7CisgICAgICAgIHByaW50ZigiICBEaWZmZXJlbmNlIGV4cHJlc3NlZCBhcyBkZWx0YSB0aW1lOlxuIik7CisgICAgICAgIHByaW50ZigiICBOZWdhdGl2ZSBpZiBkMiBpcyBsYXRlciB0aGFuIGQxLCBvdGhlcndpc2UgcG9zaXRpdmUuXG4iKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tGTE9BVCAqLworCisgICAgICBjYXNlIEZOX0NNUERBVEU6CisgICAgICAgIHByaW50ZigiXFxmY21wZGF0ZXMoZDEsZDIpXG5cCisgIGQxID0gZnJlZS1mb3JtYXQgZGF0ZSBhbmQvb3IgdGltZSAoZGVmYXVsdCA9IE5PVykuXG5cCisgIGQyID0gZGl0dG8uXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zOlxuIik7CisgICAgICAgIHByaW50ZigiICAwIGlmIGQxIGlzIGVxdWFsIHRvIGQyO1xuXAorICAxIGlmIGQxIGlzIGxhdGVyIHRoYW4gZDI7XG5cCisgLTEgaWYgZDEgaXMgZWFybGllciB0aGFuIGQyLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX1RPR01UOgorICAgICAgICBwcmludGYoIlxcZnV0Y2RhdGUoZDEpXG5cCisgIGQxID0gZnJlZS1mb3JtYXQgZGF0ZSBhbmQvb3IgdGltZSAoZGVmYXVsdCA9IE5PVykuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zOlxuIik7CisgICAgICAgIHByaW50ZigiICBEYXRlLXRpbWUgY29udmVydGVkIHRvIFVUQyAoR01UKSB5eXl5bW1kZCBoaDptbTpzcy5cbiIpOworICAgICAgICBicmVhazsKKworI2lmZGVmIFRDUFNPQ0tFVAorICAgICAgY2FzZSBGTl9IU1RBREQ6CisgICAgICAgIHByaW50ZigiXFxmYWRkcjJuYW1lKHMpXG5cCisgIHMgPSBudW1lcmljIElQIGFkZHJlc3MuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zOlxuIik7CisgICAgICAgIHByaW50ZigiICBDb3JyZXNwb25kaW5nIElQIGhvc3RuYW1lIGlmIGZvdW5kLCBvdGhlcndpc2UgbnVsbC5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk5fSFNUTkFNOgorICAgICAgICBwcmludGYoIlxcZm5hbWUyYWRkcihzKVxuXAorICBzID0gSVAgaG9zdCBuYW1lLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJuczpcbiIpOworICAgICAgICBwcmludGYoIiAgQ29ycmVzcG9uZGluZyBudW1lcmljIElQIGFkZHJlc3MgaWYgZm91bmQsIGVsc2UgbnVsbC5cbiIpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworICAgICAgY2FzZSBGTl9ERUxTRUM6CisgICAgICAgIHByaW50ZigiXFxmZGVsdGEyc2VjcyhkdClcblwKKyAgZHQgPSBEZWx0YSB0aW1lLCBlLmcuICszZDE0OjI3OjUyLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJuczpcbiIpOworICAgICAgICBwcmludGYoIiAgVGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIHNlY29uZHMuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fUENfRFU6CisgICAgICAgIHByaW50ZigiXFxmZG9zMnVuaXhwYXRoKHApXG5cCisgIHAgPSBzdHJpbmcsIERPUyBwYXRobmFtZS5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnM6XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIFRoZSBhcmd1bWVudCBjb252ZXJ0ZWQgdG8gYSBVbml4IHBhdGhuYW1lLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX1BDX1VEOgorICAgICAgICBwcmludGYoIlxcZnVuaXgyZG9zcGF0aChwKVxuXAorICBwID0gc3RyaW5nLCBVbml4IHBhdGhuYW1lLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJuczpcbiIpOworICAgICAgICBwcmludGYoIiAgVGhlIGFyZ3VtZW50IGNvbnZlcnRlZCB0byBhIERPUyBwYXRobmFtZS5cbiIpOworICAgICAgICBicmVhazsKKworI2lmZGVmIEZOX0VSUk1TRworICAgICAgY2FzZSBGTl9FUlJNU0c6CisgICAgICAgIHByaW50ZigiXFxmZXJyc3RyaW5nKG4pXG5cCisgIG4gPSBwbGF0Zm9ybS1kZXBlbmRlbnQgbnVtZXJpYyBlcnJvciBjb2RlLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJuczpcbiIpOworICAgICAgICBwcmludGYoIiAgVGhlIGNvcnJlc3BvbmRpbmcgZXJyb3Igc3RyaW5nLlxuIik7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEZOX0VSUk1TRyAqLworCisgICAgICBjYXNlIEZOX0tXVkFMOgorICAgICAgICBwcmludGYoIlxcZmtleXdvcmR2YWx1ZShzMSxjMSlcblwKKyAgczEgPSBzdHJpbmcgb2YgdGhlIGZvcm0gXCJuYW1lPXZhbHVlXCJcblwKKyAgYzEgPSBzZXBhcmF0b3IgY2hhcmFjdGVyIChkZWZhdWx0IHNlcGFyYXRvciBpcyBcIj1cIilcbiIpOworICAgICAgICBwcmludGYoIiAgICBBc3NpZ25zIHRoZSB2YWx1ZSwgaWYgYW55LCB0byB0aGUgbmFtZWQgbWFjcm8uXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgSWYgczEgY29udGFpbnMgbm8gc2VwYXJhdG9yLCBub3RoaW5nIGhhcHBlbnMuXG4iKTsKKyAgICAgICAgcHJpbnRmKAorIiAgICBJZiBzMSBjb250YWlucyBhIHNlcGFyYXRvciBidXQgbm8gdmFsdWUsIHRoZSBtYWNybyBpcyB1bmRlZmluZWQuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJSZXR1cm5zOlxuIik7CisgICAgICAgIHByaW50ZigiICAwIG9uIGZhaWx1cmVcbiIpOworICAgICAgICBwcmludGYoIiAgMSBvbiBzdWNjZXNzXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBDT01NRU5UCisgICAgICBjYXNlIEZOX1NMRUVQOgorICAgICAgICBwcmludGYoIlxcZnNsZWVwKG4pXG5cCisgIG4gPSBudW1iZXIgb2Ygc2Vjb25kc1xuIik7CisgICAgICAgIHByaW50ZigiICAgIFBhdXNlcyBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBzZWNvbmRzLlxuIik7CisgICAgICAgIHByaW50ZigiUmV0dXJuczogdGhlIGVtcHR5IHN0cmluZy5cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTl9NU0xFRVA6CisgICAgICAgIHByaW50ZigiXFxmbXNsZWVwKG4pXG5cCisgIG4gPSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgUGF1c2VzIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiIpOworICAgICAgICBwcmludGYoIlJldHVybnM6IHRoZSBlbXB0eSBzdHJpbmcuXG4iKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjaWZkZWYgTlQKKyAgICAgIGNhc2UgRk5fU05BTUU6CisgICAgICAgIHByaW50ZigiXFxmc2hvcnRwYXRobmFtZShzKVxuXAorICBzID0gZmlsZSBvciBkaXJlY3RvcnkgbmFtZSBzdHJpbmdcbiIpOworICAgICAgICBwcmludGYoIiAgICBSZXR1cm5zIHRoZSBzaG9ydCBwYXRoIGZvcm0gb2YgdGhlIGdpdmVuIGlucHV0LlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZOX0xOQU1FOgorICAgICAgICBwcmludGYoIlxcZmxvbmdwYXRobmFtZShzKVxuXAorICBzID0gZmlsZSBvciBkaXJlY3RvcnkgbmFtZSBzdHJpbmdcbiIpOworICAgICAgICBwcmludGYoIiAgICBSZXR1cm5zIHRoZSBsb25nIHBhdGggZm9ybSBvZiB0aGUgZ2l2ZW4gaW5wdXQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgY2FzZSBGTl9TTkFNRToKKyAgICAgICAgcHJpbnRmKCJcXGZzaG9ydHBhdGhuYW1lKHMpXG5cCisgICAgU3lub255bSBmb3IgXGZwYXRobmFtZSgpXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRk5fTE5BTUU6CisgICAgICAgIHByaW50ZigiXFxmbG9uZ3BhdGhuYW1lKHMpXG5cCisgICAgU3lub255bSBmb3IgXGZwYXRobmFtZSgpXG4iKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTlQgKi8KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJTb3JyeSwgaGVscCBub3QgYXZhaWxhYmxlIGZvciBcIiVzXCJcbiIsY21kYnVmKTsKKyAgICB9CisgICBwcmludGYoIlxuIik7CisgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIE9TMgorI2lmbmRlZiBOT0tWRVJCUworCisvKiAgRCBPIEggSyBWIEUgUiBCICAtLSAgR2l2ZSBoZWxwIGZvciBhIEt2ZXJiICAqLworCitpbnQKK2RvaGt2ZXJiKHh4KSBpbnQgeHg7IHsKKyAgICBpbnQgeCxpLGZvdW5kLGJ1dHRvbixldmVudDsKKworICAgIGlmICh4eCA9PSAtMykgeworICAgICAgICBwcmludGYoIlxuIFR5cGUgU0hPVyBLVkVSQlMgdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgS3ZlcmJzLlxuIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcHJpbnRmKAorIiBUeXBlIEhFTFAgS1ZFUkIgPG5hbWU+IHRvIHNlZSB0aGUgY3VycmVudCBkZWZpbml0aW9uIG9mIGEgZ2l2ZW4gS3ZlcmIuXG5cbiIKKyAgICAgICAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKHh4IDwgMCkgcmV0dXJuKHh4KTsKKyAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICBzd2l0Y2ggKCB4eCApIHsKKyAgICAgICAgLyogREVDIFZUIGtleWJvYXJkIGtleSBkZWZpbml0aW9ucyAqLworCisgICAgY2FzZSAgS19DT01QT1NFIDogICAgICAgICAgICAgICAgICAgLyogQ29tcG9zZSBrZXkgKi8KKyAgICAgICAgcHJpbnRmKCJcXEtjb21wb3NlICAgICAgICAgICBDb21wb3NlIGFuIGFjY2VudGVkIGNoYXJhY3RlclxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQ19VTkkxNiA6ICAgICAgICAgICAgICAgICAgIC8qIFVDUzIga2V5ICovCisgICAgICAgIHByaW50ZigiXFxLdWNzMiAgICAgICAgICAgICAgRW50ZXIgYSBVbmljb2RlIGNoYXJhY3RlclxuIik7CisgICAgICAgIGJyZWFrOworCisvKiBERUMgYXJyb3cga2V5cyAqLworCisgICAgY2FzZSAgS19VUEFSUiAgICAgOiAgICAgICAgICAgICAgICAgLyogREVDIFVwIEFycm93IGtleSAqLworICAgICAgICBwcmludGYoIlxcS3VwYXJyICAgICAgICAgVHJhbnNtaXQgVGVybWluYWwgVXAgQXJyb3cgc2VxdWVuY2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICBLX0ROQVJSICAgICA6ICAgICAgICAgICAgICAgICAvKiBERUMgRG93biBBcnJvdyBrZXkgKi8KKyAgICAgICAgcHJpbnRmKCJcXEtkbmFyciAgICAgICAgIFRyYW5zbWl0IFRlcm1pbmFsIERvd24gQXJyb3cgc2VxdWVuY2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICBLX1JUQVJSICAgICA6ICAgICAgICAgICAgICAgICAvKiBERUMgUmlnaHQgQXJyb3cga2V5ICovCisgICAgICAgIHByaW50ZigiXFxLcnRhcnIgICAgICAgICBUcmFuc21pdCBUZXJtaW5hbCBSaWdodCBBcnJvdyBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfTEZBUlIgICAgIDogICAgICAgICAgICAgICAgIC8qIERFQyBMZWZ0IEFycm93IGtleSAqLworICAgICAgICBwcmludGYoIlxcS2xmYXJyICAgICAgICAgVHJhbnNtaXQgVGVybWluYWwgTGVmdCBBcnJvdyBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAgS19QRjEgICAgICAgOiAgICAgICAgICAgICAgICAgLyogREVDIFBGMSBrZXkgKi8KKyAgICAgICAgcHJpbnRmKCJcXEtwZjEsXFxLZ29sZCAgICBUcmFuc21pdCBERUMgUEYxIHNlcXVlbmNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19QRjIgICAgICAgOiAgICAgICAgICAgICAgICAgLyogREVDIFBGMiBrZXkgKi8KKyAgICAgICAgcHJpbnRmKCJcXEtwZjIgICAgICAgICAgIFRyYW5zbWl0IERFQyBQRjIgc2VxdWVuY2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICBLX1BGMyAgICAgICA6ICAgICAgICAgICAgICAgICAvKiBERUMgUEYzIGtleSAqLworICAgICAgICBwcmludGYoIlxcS3BmMyAgICAgICAgICAgVHJhbnNtaXQgREVDIFBGMyBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfUEY0ICAgICAgIDogICAgICAgICAgICAgICAgIC8qIERFQyBQRjQga2V5ICovCisgICAgICAgIHByaW50ZigiXFxLcGY0ICAgICAgICAgICBUcmFuc21pdCBERUMgUEY0IHNlcXVlbmNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlICBLX0tQMCAgICAgICA6ICAgICAgICAgICAgICAgICAvKiBERUMgS2V5cGFkIDAgKi8KKyAgICAgICAgcHJpbnRmKCJcXEtrcDAgICAgICAgICAgIFRyYW5zbWl0IERFQyBLZXlwYWQtMCBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfS1AxICAgICAgIDogICAgICAgICAgICAgICAgIC8qIERFQyBLZXlwYWQgMSAqLworICAgICAgICBwcmludGYoIlxcS2twMSAgICAgICAgICAgVHJhbnNtaXQgREVDIEtleXBhZC0xIHNlcXVlbmNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19LUDIgICAgICAgOiAgICAgICAgICAgICAgICAgLyogZXRjIC4uLiB0aHJvdWdoIDkgKi8KKyAgICAgICAgcHJpbnRmKCJcXEtrcDIgICAgICAgICAgIFRyYW5zbWl0IERFQyBLZXlwYWQtMiBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfS1AzICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtrcDMgICAgICAgICAgIFRyYW5zbWl0IERFQyBLZXlwYWQtMyBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfS1A0ICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtrcDQgICAgICAgICAgIFRyYW5zbWl0IERFQyBLZXlwYWQtNCBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfS1A1ICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtrcDUgICAgICAgICAgIFRyYW5zbWl0IERFQyBLZXlwYWQtNSBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfS1A2ICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtrcDYgICAgICAgICAgIFRyYW5zbWl0IERFQyBLZXlwYWQtNiBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfS1A3ICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtrcDcgICAgICAgICAgIFRyYW5zbWl0IERFQyBLZXlwYWQtNyBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfS1A4ICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtrcDggICAgICAgICAgIFRyYW5zbWl0IERFQyBLZXlwYWQtOCBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfS1A5ICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtrcDkgICAgICAgICAgIFRyYW5zbWl0IERFQyBLZXlwYWQtOSBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfS1BDT01BICAgIDogICAgICAgICAgICAgICAgIC8qIERFQyBrZXlwYWQgY29tbWEgKi8KKyAgICAgICAgcHJpbnRmKCJcXEtrcGNvbWEgICAgICAgIFRyYW5zbWl0IERFQyBLZXlwYWQtQ29tbWEgc2VxdWVuY2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICBLX0tQTUlOVVMgICA6ICAgICAgICAgICAgICAgICAvKiBERUMga2V5cGFkIG1pbnVzICovCisgICAgICAgIHByaW50ZigiXFxLa3BtaW51cyAgICAgICBUcmFuc21pdCBERUMgS2V5cGFkLU1pbnVzIHNlcXVlbmNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19LUERPVCAgICAgOiAgICAgICAgICAgICAgICAgLyogREVDIGtleXBhZCBwZXJpb2QgKi8KKyAgICAgICAgcHJpbnRmKCJcXEtrcGRvdCAgICAgICAgIFRyYW5zbWl0IERFQyBLZXlwYWQtUGVyaW9kIHNlcXVlbmNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19LUEVOVEVSICAgOiAgICAgICAgICAgICAgICAgLyogREVDIGtleXBhZCBlbnRlciAqLworICAgICAgICBwcmludGYoIlxcS2twZW50ZXIgICAgICAgVHJhbnNtaXQgREVDIEtleXBhZC1FbnRlciBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworCisvKiBERUMgVG9wLVJhbmsgRiBrZXlzICovCisKKyAgICBjYXNlICBLX0RFQ0YxICAgICA6ICAgICAgICAgICAgICAgICAvKiBERUMgRjEga2V5ICovCisgICAgICAgIHByaW50ZigiXFxLZGVjZjEgICAgICAgICBUcmFuc21pdCBERUMgRjEgc2VxdWVuY2UgZm9yIFBDIGtleWJvYXJkXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ERUNGMiAgICAgOiAgICAgICAgICAgICAgICAgLyogREVDIEYyIGtleSAqLworICAgICAgICBwcmludGYoIlxcS2RlY2YyICAgICAgICAgVHJhbnNtaXQgREVDIEYyIHNlcXVlbmNlIGZvciBQQyBrZXlib2FyZFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREVDRjMgICAgIDogICAgICAgICAgICAgICAgIC8qIERFQyBGMyBrZXkgKi8KKyAgICAgICAgcHJpbnRmKCJcXEtkZWNmMyAgICAgICAgIFRyYW5zbWl0IERFQyBGMyBzZXF1ZW5jZSBmb3IgUEMga2V5Ym9hcmRcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RFQ0Y0ICAgICA6ICAgICAgICAgICAgICAgICAvKiBERUMgRjQga2V5ICovCisgICAgICAgIHByaW50ZigiXFxLZGVjZjQgICAgICAgICBUcmFuc21pdCBERUMgRjQgc2VxdWVuY2UgZm9yIFBDIGtleWJvYXJkXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ERUNGNSAgICAgOiAgICAgICAgICAgICAgICAgLyogREVDIEY1IGtleSAqLworICAgICAgICBwcmludGYoIlxcS2RlY2Y1ICAgICAgICAgVHJhbnNtaXQgREVDIEY1IHNlcXVlbmNlIGZvciBQQyBrZXlib2FyZFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREVDSE9NRTogICAgICAgICAgICAgICAgICAgIC8qIERFQyBIT01FIGtleSAqLworICAgICAgIHByaW50ZigiXFxLZGVjaG9tZSAgICAgICBUcmFuc21pdCBERUMgSE9NRSBzZXF1ZW5jZSBmb3IgUEMga2V5Ym9hcmRcbiIpOworICAgICAgIGJyZWFrOworCisgICAgY2FzZSAgS19ERUNGNiAgICAgOiAgICAgICAgICAgICAgICAgLyogREVDIEY2IGtleSAqLworICAgICAgICBwcmludGYoIlxcS2RlY2Y2ICAgICAgICAgVHJhbnNtaXQgREVDIEY2IHNlcXVlbmNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ERUNGNyAgICAgOiAgICAgICAgICAgICAgICAgLyogZXRjLCB0aHJvdWdoIEYyMCAqLworICAgICAgICBwcmludGYoIlxcS2RlY2Y3ICAgICAgICAgVHJhbnNtaXQgREVDIEY3IHNlcXVlbmNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ERUNGOCAgICAgOgorICAgICAgICBwcmludGYoIlxcS2RlY2Y4ICAgICAgICAgVHJhbnNtaXQgREVDIEY4IHNlcXVlbmNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ERUNGOSAgICAgOgorICAgICAgICBwcmludGYoIlxcS2RlY2Y5ICAgICAgICAgVHJhbnNtaXQgREVDIEY5IHNlcXVlbmNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ERUNGMTAgICAgOgorICAgICAgICBwcmludGYoIlxcS2RlY2YxMCAgICAgICAgVHJhbnNtaXQgREVDIEYxMCBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREVDRjExICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtkZWNmMTEgICAgICAgIFRyYW5zbWl0IERFQyBGMTEgc2VxdWVuY2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RFQ0YxMiAgICA6CisgICAgICAgIHByaW50ZigiXFxLZGVjZjEyICAgICAgICBUcmFuc21pdCBERUMgRjEyIHNlcXVlbmNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ERUNGMTMgICAgOgorICAgICAgICBwcmludGYoIlxcS2RlY2YxMyAgICAgICAgVHJhbnNtaXQgREVDIEYxMyBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREVDRjE0ICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtkZWNmMTQgICAgICAgIFRyYW5zbWl0IERFQyBGMTQgc2VxdWVuY2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RFQ0hFTFAgICA6ICAgICAgICAgICAgICAgICAvKiBERUMgSGVscCBrZXkgKi8KKyAgICAgICAgcHJpbnRmKCJcXEtkZWNmMTUsXFxLZGVjaGVscCAgVHJhbnNtaXQgREVDIEhFTFAgc2VxdWVuY2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RFQ0RPICAgICA6ICAgICAgICAgICAgICAgICAvKiBERUMgRG8ga2V5ICovCisgICAgICAgIHByaW50ZigiXFxLZGVjZjE2LFxcS2RlY2RvICAgIFRyYW5zbWl0IERFQyBETyBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREVDRjE3ICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtkZWNmMTcgICAgICAgIFRyYW5zbWl0IERFQyBGMTcgc2VxdWVuY2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RFQ0YxOCAgICA6CisgICAgICAgIHByaW50ZigiXFxLZGVjZjE4ICAgICAgICBUcmFuc21pdCBERUMgRjE4IHNlcXVlbmNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ERUNGMTkgICAgOgorICAgICAgICBwcmludGYoIlxcS2RlY2YxOSAgICAgICAgVHJhbnNtaXQgREVDIEYxOSBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREVDRjIwICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtkZWNmMjAgICAgICAgIFRyYW5zbWl0IERFQyBGMjAgc2VxdWVuY2VcbiIpOworICAgICAgICBicmVhazsKKworLyogREVDIGVkaXRpbmcga2V5cyAqLworCisgICAgY2FzZSAgS19ERUNGSU5EICAgOiAgICAgICAgICAgICAgICAgLyogREVDIEZpbmQga2V5ICovCisgICAgICAgIHByaW50ZigiXFxLZGVjZmluZCAgICAgICBUcmFuc21pdCBERUMgRklORCBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREVDSU5TRVJUIDogICAgICAgICAgICAgICAgIC8qIERFQyBJbnNlcnQga2V5ICovCisgICAgICAgIHByaW50ZigiXFxLZGVjaW5zZXJ0ICAgICBUcmFuc21pdCBERUMgSU5TRVJUIEhFUkUgc2VxdWVuY2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RFQ1JFTU9WRSA6ICAgICAgICAgICAgICAgICAvKiBERUMgUmVtb3ZlIGtleSAqLworICAgICAgICBwcmludGYoIlxcS2RlY3JlbW92ZSAgICAgVHJhbnNtaXQgREVDIFJFTU9WRSBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREVDU0VMRUNUIDogICAgICAgICAgICAgICAgIC8qIERFQyBTZWxlY3Qga2V5ICovCisgICAgICAgIHByaW50ZigiXFxLZGVjZnNlbGVjdCAgICBUcmFuc21pdCBERUMgU0VMRUNUIHNlcXVlbmNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ERUNQUkVWICAgOiAgICAgICAgICAgICAgICAgLyogREVDIFByZXZpb3VzIFNjcmVlbiBrZXkgKi8KKyAgICAgICAgcHJpbnRmKCJcXEtkZWNwcmV2ICAgICAgIFRyYW5zbWl0IERFQyBQUkVWIFNDUkVFTiBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREVDTkVYVCAgIDogICAgICAgICAgICAgICAgIC8qIERFQyBOZXh0IFNjcmVlbiBrZXkgKi8KKyAgICAgICAgcHJpbnRmKCJcXEtkZWNuZXh0ICAgICAgIFRyYW5zbWl0IERFQyBORVhUIFNDUkVFTiBzZXF1ZW5jZVxuIik7CisgICAgICAgIGJyZWFrOworCisvKiBERUMgVXNlci1EZWZpbmVkIEtleXMgKi8KKworICAgIGNhc2UgIEtfVURLRjEgICAgIDogICAgICAgICAgICAgICAgIC8qIEYxIC0gRjUgYXJlIFhURVJNIGV4dGVuc2lvbnMgKi8KKyAgICAgIHByaW50ZigiXFxLdWRrZjEgICAgICAgICBUcmFuc21pdCBYVEVSTSBGMSBVc2VyIERlZmluZWQgS2V5IHNlcXVlbmNlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVURLRjIgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdWRrZjIgICAgICAgICBUcmFuc21pdCBYVEVSTSBGMiBVc2VyIERlZmluZWQgS2V5IHNlcXVlbmNlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVURLRjMgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdWRrZjMgICAgICAgICBUcmFuc21pdCBYVEVSTSBGMyBVc2VyIERlZmluZWQgS2V5IHNlcXVlbmNlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVURLRjQgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdWRrZjQgICAgICAgICBUcmFuc21pdCBYVEVSTSBGNCBVc2VyIERlZmluZWQgS2V5IHNlcXVlbmNlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVURLRjUgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdWRrZjUgICAgICAgICBUcmFuc21pdCBYVEVSTSBGNSBVc2VyIERlZmluZWQgS2V5IHNlcXVlbmNlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVURLRjYgICAgIDogICAgICAgICAgICAgICAgIC8qIERFQyBVc2VyIERlZmluZWQgS2V5IEY2ICovCisgICAgICBwcmludGYoIlxcS3Vka2Y2ICAgICAgICAgVHJhbnNtaXQgREVDIEY2IFVzZXIgRGVmaW5lZCBLZXkgc2VxdWVuY2VcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19VREtGNyAgICAgOiAgICAgICAgICAgICAgICAgLyogREVDIFVzZXIgRGVmaW5lZCBLZXkgRjcgKi8KKyAgICAgIHByaW50ZigiXFxLdWRrZjcgICAgICAgICBUcmFuc21pdCBERUMgRjcgVXNlciBEZWZpbmVkIEtleSBzZXF1ZW5jZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1VES0Y4ICAgICA6ICAgICAgICAgICAgICAgICAvKiBldGMgLi4uIHRocm91Z2ggRjIwICovCisgICAgICBwcmludGYoIlxcS3Vka2Y4ICAgICAgICAgVHJhbnNtaXQgREVDIEY4IFVzZXIgRGVmaW5lZCBLZXkgc2VxdWVuY2VcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19VREtGOSAgICAgOgorICAgICAgcHJpbnRmKCJcXEt1ZGtmOSAgICAgICAgIFRyYW5zbWl0IERFQyBGOSBVc2VyIERlZmluZWQgS2V5IHNlcXVlbmNlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVURLRjEwICAgIDoKKyAgICAgIHByaW50ZigiXFxLdWRrZjEwICAgICAgICBUcmFuc21pdCBERUMgRjEwIFVzZXIgRGVmaW5lZCBLZXkgc2VxdWVuY2VcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19VREtGMTEgICAgOgorICAgICAgcHJpbnRmKCJcXEt1ZGtmMTEgICAgICAgIFRyYW5zbWl0IERFQyBGMTEgVXNlciBEZWZpbmVkIEtleSBzZXF1ZW5jZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1VES0YxMiAgICA6CisgICAgICBwcmludGYoIlxcS3Vka2YxMiAgICAgICAgVHJhbnNtaXQgREVDIEYxMiBVc2VyIERlZmluZWQgS2V5IHNlcXVlbmNlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVURLRjEzICAgIDoKKyAgICAgIHByaW50ZigiXFxLdWRrZjEzICAgICAgICBUcmFuc21pdCBERUMgRjEzIFVzZXIgRGVmaW5lZCBLZXkgc2VxdWVuY2VcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19VREtGMTQgICAgOgorICAgICAgcHJpbnRmKCJcXEt1ZGtmMTQgICAgICAgIFRyYW5zbWl0IERFQyBGMTQgVXNlciBEZWZpbmVkIEtleSBzZXF1ZW5jZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1VES0hFTFAgICA6CisgICAgICBwcmludGYoCisgICAgICAiXFxLdWRraGVscCxcXEt1ZGtmMTUgIFRyYW5zbWl0IERFQyBIRUxQIFVzZXIgRGVmaW5lZCBLZXkgc2VxdWVuY2VcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19VREtETyAgICAgOgorICAgICAgcHJpbnRmKAorICAgICAgIlxcS3Vka2RvLFxcS3Vka2YxNiAgICBUcmFuc21pdCBERUMgRE8gVXNlciBEZWZpbmVkIEtleSBzZXF1ZW5jZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1VES0YxNyAgICA6CisgICAgICBwcmludGYoIlxcS3Vka2YxNyAgICAgICAgVHJhbnNtaXQgREVDIEYxNyBVc2VyIERlZmluZWQgS2V5IHNlcXVlbmNlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVURLRjE4ICAgIDoKKyAgICAgIHByaW50ZigiXFxLdWRrZjE4ICAgICAgICBUcmFuc21pdCBERUMgRjE4IFVzZXIgRGVmaW5lZCBLZXkgc2VxdWVuY2VcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19VREtGMTkgICAgOgorICAgICAgcHJpbnRmKCJcXEt1ZGtmMTkgICAgICAgIFRyYW5zbWl0IERFQyBGMTkgVXNlciBEZWZpbmVkIEtleSBzZXF1ZW5jZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1VES0YyMCAgICA6CisgICAgICBwcmludGYoIlxcS3Vka2YyMCAgICAgICAgVHJhbnNtaXQgREVDIEYyMCBVc2VyIERlZmluZWQgS2V5IHNlcXVlbmNlXG4iKTsKKyAgICAgIGJyZWFrOworCisvKiBFbWFjcyBLZXlzICovCisgICAgY2FzZSAgS19FTUFDU19PVkVSOgorICAgICAgcHJpbnRmKAorICAgICAiXFxLZW1hY3Nfb3ZlcndyaXRlICBUcmFuc21pdCBFTUFDUyBPdmVyd3JpdGUgdG9nZ2xlIGNvbW1hbmQgc2VxdWVuY2VcbiIpOworICAgICAgYnJlYWs7CisKKy8qIEtlcm1pdCBzY3JlZW4tc2Nyb2xsaW5nIGtleXMgKi8KKworICAgIGNhc2UgIEtfRE5PTkUgICAgIDogICAgICAgICAgICAgICAgIC8qIFNjcmVlbiByb2xsYmFjazogZG93biBvbmUgbGluZSAqLworICAgICAgcHJpbnRmKCJcXEtkbm9uZSAgICAgICAgIFNjcmVlbiByb2xsYmFjazogZG93biBvbmUgbGluZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0ROU0NOICAgICA6ICAgICAgICAgICAgICAgICAvKiBTY3JlZW4gcm9sbGJhY2s6IGRvd24gb25lIHNjcmVlbiAqLworICAgICAgcHJpbnRmKCJcXEtkbnNjbiAgICAgICAgIFNjcmVlbiByb2xsYmFjazogZG93biBvbmUgc2NyZWVuXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVVBPTkUgICAgIDogICAgICAgICAgICAgICAgIC8qIFNjcmVlbiByb2xsYmFjazogVXAgb25lIGxpbmUgKi8KKyAgICAgIHByaW50ZigiXFxLdXBvbmUgICAgICAgICBTY3JlZW4gcm9sbGJhY2s6IHVwIG9uZSBsaW5lXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVVBTQ04gICAgIDogICAgICAgICAgICAgICAgIC8qIFNjcmVlbiByb2xsYmFjazogVXAgb25lIHNjcmVlbiAqLworICAgICAgcHJpbnRmKCJcXEt1cHNjbiAgICAgICAgIFNjcmVlbiByb2xsYmFjazogdXAgb25lIHNjcmVlblxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0VORFNDTiAgICA6ICAgICAgICAgICAgICAgICAvKiBTY3JlZW4gcm9sbGJhY2s6IGxhdGVzdCBzY3JlZW4gKi8KKyAgICAgIHByaW50ZigiXFxLZW5kc2NuICAgICAgICBTY3JlZW4gcm9sbGJhY2s6IGxhdGVzdCBzY3JlZW5cbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19IT01TQ04gICAgOiAgICAgICAgICAgICAgICAgLyogU2NyZWVuIHJvbGxiYWNrOiBvbGRlc3Qgc2NyZWVuICovCisgICAgICBwcmludGYoIlxcS2hvbXNjbiAgICAgICAgU2NyZWVuIHJvbGxiYWNrOiBvbGRlc3Qgc2NyZWVuXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfR09fQk9PSyAgIDogICAgICAgICAvKiBTY3JvbGwgdG8gYm9va21hcmsgKi8KKyAgICAgIHByaW50ZigiXFxLZ29ib29rICAgICAgICBTY3JlZW4gcm9sbGJhY2s6IGdvIHRvIGJvb2ttYXJrXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfR09UTyAgICAgIDogICAgICAgICAvKiBTY3JvbGwgdG8gbGluZSBudW1iZXIgKi8KKyAgICAgIHByaW50ZigiXFxLZ290byAgICAgICAgICBTY3JlZW4gcm9sbGJhY2s6IGdvIHRvIGxpbmUgbnVtYmVyXG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAgS19MRk9ORSAgICAgOiAgICAgICAgICAgICAgICAgLyogSG9yaXpvbnRhbCBTY3JvbGw6IExlZnQgb25lIGNlbGwgKi8KKyAgICAgIHByaW50ZigiXFxLbGZvbmUgICAgICAgICBIb3Jpem9udGFsIFNjcm9sbDogTGVmdCBvbmUgY29sdW1uXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfTEZQQUdFICAgIDogICAgICAgICAgICAgICAgIC8qIEhvcml6b250YWwgU2Nyb2xsOiBMZWZ0IG9uZSBwYWdlICovCisgICAgICBwcmludGYoIlxcS2xmcGFnZSAgICAgICAgSG9yaXpvbnRhbCBTY3JvbGw6IExlZnQgZWlnaHQgY29sdW1uc1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0xGQUxMICAgICA6CisgICAgICBwcmludGYoIlxcS2xmYWxsICAgICAgICAgSG9yaXpvbnRhbCBTY3JvbGw6IExlZnQgdG8gbWFyZ2luXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfUlRPTkUgICAgIDogICAgICAgICAgICAgICAgIC8qIEhvcml6b250YWwgU2Nyb2xsOiBSaWdodCBvbmUgY2VsbCAqLworICAgICAgcHJpbnRmKCJcXEtydG9uZSAgICAgICAgIEhvcml6b250YWwgU2Nyb2xsOiBSaWdodCBvbmUgY29sdW1uXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfUlRQQUdFICAgIDogICAgICAgICAgICAgICAgIC8qIEhvcml6b250YWwgU2Nyb2xsOiBSaWdodCBvbmUgcGFnZSAqLworICAgICAgcHJpbnRmKCJcXEtydHBhZ2UgICAgICAgIEhvcml6b250YWwgU2Nyb2xsOiBSaWdodCBlaWdodCBjb2x1bW5zXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfUlRBTEwgICAgIDoKKyAgICAgIHByaW50ZigiXFxLcnRhbGwgICAgICAgICBIb3Jpem9udGFsIFNjcm9sbDogUmlnaHQgdG8gbWFyZ2luXG4iKTsKKyAgICAgIGJyZWFrOworCisvKiBLZXlib2FyZCBsYW5ndWFnZSBzd2l0Y2hpbmcgdmVyYnMgKi8KKworICAgIGNhc2UgIEtfS0JfRU5HICAgIDogICAgICAgICAgICAgICAgIC8qIEVuZ2xpc2gga2V5Ym9hcmQgbW9kZSAqLworICAgICAgcHJpbnRmKCJcXEtrYmVuZ2xpc2ggICAgIFN3aXRjaCB0byBOb3JtYWwgKEVuZ2xpc2gpIGtleWJvYXJkIG1vZGVcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19LQl9IRUIgICAgOiAgICAgICAgICAgICAgICAgLyogSGVicmV3IGtleWJvYXJkIG1vZGUgKi8KKyAgICAgIHByaW50ZigiXFxLa2JoZWJyZXcgICAgICBTd2l0Y2ggdG8gSGVicmV3IGtleWJvYXJkIG1vZGVcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19LQl9SVVMgICAgOiAgICAgICAgICAgICAgICAgLyogUnVzc2lhbiBrZXlib2FyZCBtb2RlICovCisgICAgICBwcmludGYoIlxcS2ticnVzc2lhbiAgICAgU3dpdGNoIHRvIFJ1c3NpYW4ga2V5Ym9hcmQgbW9kZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0tCX0VNQSAgICA6ICAgICAgICAgICAgICAgICAvKiBFbWFjcyBrZXlib2FyZCBtb2RlICovCisgICAgICBwcmludGYoIlxcS2tiZW1hY3MgICAgICAgU3dpdGNoIHRvIEVNQUNTIGtleWJvYXJkIG1vZGVcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19LQl9XUCAgICAgOiAgICAgICAgICAgICAgICAgLyogV29yZCBQZXJmZWN0IDUuMSBtb2RlICovCisgICAgICBwcmludGYoIlxcS2tid3AgICAgICAgICAgU3dpdGNoIHRvIFdvcmQgUGVyZmVjdCA1LjEga2V5Ym9hcmQgbW9kZVxuIik7CisgICAgICBicmVhazsKKworLyogTWFyayBNb2RlIGFjdGlvbnMgKi8KKworICAgIGNhc2UgIEtfTUFSS19TVEFSVCAgOiAgICAgICAvKiBFbnRlciBNYXJrIE1vZGUvU3RhcnQgbWFya2luZyAqLworICAgICAgcHJpbnRmKCJcXEttYXJrc3RhcnQgICAgIE1hcmsgTW9kZTogRW50ZXIgbW9kZSBvciBTdGFydCBtYXJraW5nXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfTUFSS19DQU5DRUwgOiAgICAgICAvKiBFeGl0IE1hcmsgTW9kZSAtIERvIE5vdGhpbmcgKi8KKyAgICAgIHByaW50ZigiXFxLbWFya2NhbmNlbCAgICBNYXJrIE1vZGU6IENhbmNlbCBtb2RlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfTUFSS19DT1BZQ0xJUDogICAgICAvKiBFeGl0IE1hcmsgTW9kZSAtIENvcHkgZGF0YSB0byBjbGlwYm9hcmQgKi8KKyAgICAgIHByaW50ZigiXFxLbWFya2NvcHljbGlwICBNYXJrIE1vZGU6IENvcHkgbWFya2VkIHRleHQgdG8gY2xpcGJvYXJkXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfTUFSS19DT1BZSE9TVDogICAgICAvKiBFeGl0IE1hcmsgTW9kZSAtIENvcHkgZGF0YSB0byBob3N0ICAgKi8KKyAgICAgIHByaW50ZigiXFxLbWFya2NvcHlob3N0ICBNYXJrIE1vZGU6IENvcHkgbWFya2VkIHRleHQgdG8gaG9zdFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX01BUktfU0VMRUNUIDogICAgICAgLyogRXhpdCBNYXJrIE1vZGUgLSBTZWxlY3QgKi8KKyAgICAgIHByaW50ZigKKyAgICAgICJcXEttYXJrc2VsZWN0ICAgIE1hcmsgTW9kZTogUGxhY2UgbWFya2VkIHRleHQgaW50byBcXHYoc2VsZWN0KVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0JBQ0tTUkNIICAgIDogICAgICAgICAgICAvKiBTZWFyY2ggQmFja3dhcmRzIGZvciB0ZXh0ICovCisgICAgICBwcmludGYoIlxcS2JhY2tzZWFyY2ggICAgU2VhcmNoOiBCZWdpbiBiYWNrd2FyZCBzZWFyY2ggZm9yIHRleHRcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19GV0RTUkNIICAgICA6ICAgICAgICAgICAgLyogU2VhcmNoIEZvcndhcmRzIGZvciB0ZXh0ICovCisgICAgICBwcmludGYoIlxcS2Z3ZHNlYXJjaCAgICAgU2VhcmNoOiBCZWdpbiBmb3J3YXJkIHNlYXJjaCBmb3IgdGV4dFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0JBQ0tORVhUICAgIDogICAgIC8qIFNlYXJjaCBCYWNrd2FyZHMgZm9yIG5leHQgaW5zdGFuY2Ugb2YgdGV4dCAqLworICAgICAgcHJpbnRmKAorICAgICAgIlxcS2JhY2tuZXh0ICAgICAgU2VhcmNoOiBGaW5kIG5leHQgaW5zdGFuY2Ugb2YgdGV4dCBiYWNrd2FyZHNcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19GV0RORVhUICAgICA6ICAgICAgLyogU2VhcmNoIEZvcndhcmRzIGZvciBuZXh0IGluc3RhbmNlIG9mIHRleHQgKi8KKyAgICAgIHByaW50ZigiXFxLZndkbmV4dCAgICAgICBTZWFyY2g6IEZpbmQgbmV4dCBpbnN0YW5jZSBvZiB0ZXh0IGZvcndhcmRzXG4iKTsKKyAgICAgIGJyZWFrOworCisvKiBNaXNjZWxsYW5lb3VzIEtlcm1pdCBhY3Rpb25zICovCisKKyAgICBjYXNlICBLX0VYSVQgICAgICAgIDogICAgICAgICAgICAgICAvKiBSZXR1cm4gdG8gY29tbWFuZCBwYXJzZXIgKi8KKyAgICAgIHByaW50ZigiXFxLZXhpdCAgICAgICAgICBUb2dnbGUgYmV0d2VlbiBDT01NQU5EIGFuZCBDT05ORUNUIG1vZGVzXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQlJFQUsgICAgICAgOiAgICAgICAgICAgICAgIC8qIFNlbmQgYSBCUkVBSyAqLworICAgICAgcHJpbnRmKCJcXEticmVhayAgICAgICAgIFRyYW5zbWl0IEJSRUFLIHNpZ25hbCB0byBob3N0XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfUkVTRVQgICAgICAgOiAgICAgICAgICAgICAgIC8qIFJlc2V0IGVtdWxhdG9yICovCisgICAgICBwcmludGYoIlxcS3Jlc2V0ICAgICAgICAgUmVzZXQgVGVybWluYWwgRW11bGF0b3IgdG8gdXNlciBkZWZhdWx0c1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RPUyAgICAgICAgIDogICAgICAgICAgICAgICAvKiBQdXNoIHRvIERPUyAoaS5lLiBPUy8yKSAqLworICAgICAgcHJpbnRmKCJcXEtkb3MsXFxLb3MyICAgICBQdXNoIHRvIENvbW1hbmQgU2hlbGxcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19IQU5HVVAgICAgICA6ICAgICAgICAgICAgICAgLyogSGFuZyB1cCB0aGUgY29ubmVjdGlvbiAqLworICAgICAgcHJpbnRmKCJcXEtoYW5ndXAgICAgICAgIEhhbmd1cCB0aGUgYWN0aXZlIGNvbm5lY3Rpb25cbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19EVU1QICAgICAgICA6ICAgICAgICAgICAgICAgLyogRHVtcC9QcmludCBjdXJyZW50IHNjcmVlbiAqLworICAgICAgcHJpbnRmKAorICAgICAiXFxLZHVtcCAgICAgICAgICBEdW1wL2NvcHkgY3VycmVudCBzY3JlZW4gdG8gU0VUIFBSSU5URVIgZGV2aWNlL2ZpbGVcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19MQlJFQUsgICAgICA6ICAgICAgICAgICAgICAgLyogU2VuZCBhIExvbmcgQlJFQUsgKi8KKyAgICAgIHByaW50ZigiXFxLbGJyZWFrICAgICAgICBUcmFuc21pdCBMT05HIEJSRUFLIHNpZ25hbCB0byBob3N0XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfTlVMTCAgICAgICAgOiAgICAgICAgICAgICAgIC8qIFNlbmQgYSBOVUwgKi8KKyAgICAgIHByaW50ZigiXFxLbnVsbCAgICAgICAgICBUcmFuc21pdCBOVUxMICgnXDAnKSBjaGFyYWN0ZXIgdG8gaG9zdFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0hFTFAgICAgICAgIDogICAgICAgICAgICAgICAvKiBQb3AtdXAgaGVscCAqLworICAgICAgcHJpbnRmKCJcXEtoZWxwICAgICAgICAgIFJhaXNlIFBvcC1VcCBoZWxwIGRpc3BsYXlcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19IT0xEU0NSTiAgICA6ICAgICAgICAgICAgICAgLyogSG9sZCBzY3JlZW4gKi8KKyAgICAgIHByaW50ZigiXFxLaG9sZHNjcm4gICAgICBQYXVzZSBkYXRhIGlucHV0IGR1cmluZyBDT05ORUNUIG1vZGVcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19JR05PUkUgICAgICA6ICAgICAgICAgICAgICAgLyogSWdub3JlIHRoaXMga2V5LCBkb24ndCBldmVuIGJlZXAgKi8KKyAgICAgIHByaW50ZigiXFxLaWdub3JlICAgICAgICBJZ25vcmUga2V5XG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAgS19MT0dPRkYgICAgICA6ICAgICAgICAgICAgICAgLyogVHVybiBvZmYgc2Vzc2lvbiBsb2dnaW5nICovCisgICAgICBwcmludGYoIlxcS2xvZ29mZiAgICAgICAgVHVybiBvZmYgc2Vzc2lvbiBsb2dnaW5nIChzZWUgXFxLc2Vzc2lvbilcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19MT0dPTiAgICAgICA6ICAgICAgICAgICAgICAgLyogVHVybiBvbiBzZXNzaW9uIGxvZ2dpbmcgKi8KKyAgICAgIHByaW50ZigiXFxLbG9nb24gICAgICAgICBUdXJuIG9uIHNlc3Npb24gbG9nZ2luZyAoc2VlIFxcS3Nlc3Npb24pXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgS19TRVNTSU9OOgorICAgICAgcHJpbnRmKAorICAgICAgICAgIlxcS3Nlc3Npb24gICAgICAgVG9nZ2xlIG9uL29mZiBzZXNzaW9uIGxvZ2dpbmcgdG8gJ3Nlc3Npb24ubG9nJ1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEtfQVVUT0RPV046CisgICAgICBwcmludGYoIlxcS2F1dG9kb3duICAgICAgVG9nZ2xlIG9uL29mZiB0ZXJtaW5hbCBhdXRvZG93bmxvYWQuXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgS19CWVRFU0laRToKKyAgICAgIHByaW50ZigKKyAgICAgICAgIlxcS2J5dGVzaXplICAgICAgVG9nZ2xlIHRlcm1pbmFsIGJ5dGVzaXplIGJldHdlZW4gNyBhbmQgOCBiaXRzLlxuIik7CisgICAgICBicmVhazsKKworI2lmZGVmIENPTU1FTlQKKyAgICBjYXNlIE1PREVMSU5FOgorICAgIGNhc2UgIEtfTkVUSE9MRCAgICAgOiAgICAgICAgICAgICAgIC8qIFB1dCBuZXR3b3JrIGNvbm5lY3Rpb24gb24gaG9sZCAqLworICAgIGNhc2UgIEtfTkVYVFNFU1MgICAgOiAgICAgICAgICAgICAgIC8qIFRvZ2dsZSB0byBuZXh0IG5ldHdvcmsgc2Vzc2lvbiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIGNhc2UgS19DVVJTT1JfVVJMOgorICAgICAgICBwcmludGYoCisgICAgICJcXEt1cmwgICAgICAgICAgIFRyZWF0IHRleHQgdW5kZXIgY3Vyc29yIHBvc2l0aW9uIGFzIGEgVVJMXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19TVEFUVVMgICAgICA6ICAgICAgICAgICAgICAgLyogU2hvdyBzdGF0dXMgKi8KKyAgICAgIHByaW50ZigKKyAgICAgIlxcS3N0YXR1cyAgICAgICAgVG9nZ2xlIHN0YXR1c2xpbmUgKE5vbmUsIEluZGljYXRvciwgSG9zdCBXcml0ZWFibGUpXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVEVSTVRZUEUgICAgOiAgICAgICAgICAgICAgIC8qIFRvZ2dsZSB0ZXJtIHR5cGU6IHRleHQvZ3JhcGhpY3MgKi8KKyAgICAgIHByaW50ZigiXFxLdGVybXR5cGUgICAgICBUb2dnbGUgVGVybWluYWwgVHlwZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1BSVENUUkwgICAgIDogICAgICAgICAgICAgICAvKiBQcmludCBDb250cm9sbGVyIG1vZGUgKi8KKyAgICAgIHByaW50ZigiXFxLcHJ0Y3RybCAgICAgICBUb2dnbGUgQ3RybC1QcmludCAodHJhbnNwYXJlbnQpIG1vZGVcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19QUklOVEZGICAgICA6ICAgICAgICAgICAgICAgLyogUHJpbnQgZm9ybWZlZWQgKi8KKyAgICAgIHByaW50ZigiXFxLcHJpbnRmZiAgICAgICBPdXRwdXQgRm9ybSBGZWVkIHRvIFNFVCBQUklOVEVSIGRldmljZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0ZMSVBTQ04gICAgIDogICAgICAgICAgICAgICAvKiBGbGlwIHNjcmVlbiAqLworICAgICAgcHJpbnRmKCJcXEtmbGlwc2NuICAgICAgIFJldmVyc2UgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnNcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ERUJVRyAgICAgICA6ICAgICAgICAgICAgICAgLyogVG9nZ2xlIGRlYnVnZ2luZyAqLworICAgICAgcHJpbnRmKCJcXEtkZWJ1ZyAgICAgICAgIFRvZ2dsZSBUZXJtaW5hbCBEZWJ1ZyBtb2RlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVE5fU0FLICAgICAgOiAgICAgICAgICAgICAgIC8qIFRFTE5FVCBTZWN1cmUgQWNjZXNzIEtleSAqLworICAgICAgcHJpbnRmKCJcXEt0bl9zYWsgICAgICAgIFRFTE5FVDogSUJNIFNlY3VyZSBBY2Nlc3MgS2V5XG4iKTsKKyAgICAgIHByaW50ZigiICAgICAgICAgICAgICAgIFVzZWQgdG8gcmVxdWVzdCBhIFRydXN0ZWQgU2hlbGwgd2l0aCBBSVhcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UTl9BTyAgICAgICA6ICAgICAgICAgICAgICAgLyogVEVMTkVUIENhbmNlbCBPdXRwdXQgKi8KKyAgICAgIHByaW50ZigiXFxLdG5fYW8gICAgICAgICBURUxORVQ6IFRyYW5zbWl0IENhbmNlbC1PdXRwdXQgcmVxdWVzdFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1ROX0FZVCAgICAgIDogICAgICAgICAgICAgICAvKiBURUxORVQgQXJlIFlvdSBUaGVyZSAqLworICAgICAgcHJpbnRmKCJcXEt0bmF5dCAgICAgICAgIFRFTE5FVDogVHJhbnNtaXQgQXJlIFlvdSBUaGVyZT8gcmVxdWVzdFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1ROX0VDICAgICAgIDogICAgICAgICAgICAgICAvKiBURUxORVQgRXJhc2UgQ2hhcmFjdGVyICovCisgICAgICBwcmludGYoIlxcS3RuX2VjICAgICAgICAgVEVMTkVUOiBUcmFuc21pdCBFcmFzZSBDaGFyYWN0ZXIgcmVxdWVzdFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1ROX0VMICAgICAgIDogICAgICAgICAgICAgICAvKiBURUxORVQgRXJhc2UgTGluZSAqLworICAgICAgcHJpbnRmKCJcXEt0bl9lbCAgICAgICAgIFRFTE5FVDogVHJhbnNtaXQgRXJhc2UgTGluZSByZXF1ZXN0XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVE5fR0EgICAgICAgOiAgICAgICAgICAgICAgIC8qIFRFTE5FVCBHbyBBaGVhZCAqLworICAgICAgcHJpbnRmKCJcXEt0bl9nYSAgICAgICAgIFRFTE5FVDogVHJhbnNtaXQgR28gQWhlYWQgcmVxdWVzdFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1ROX0lQICAgICAgIDogICAgICAgICAgICAgICAvKiBURUxORVQgSW50ZXJydXB0IFByb2Nlc3MgKi8KKyAgICAgIHByaW50ZigiXFxLdG5faXAgICAgICAgICBURUxORVQ6IFRyYW5zbWl0IEludGVycnVwdCBQcm9jZXNzIHJlcXVlc3RcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UTl9MT0dPVVQgICA6ICAgICAgICAgICAgICAgLyogVEVMTkVUIExvZ291dCAqLworICAgICAgcHJpbnRmKCJcXEt0bl9sb2dvdXQgICAgIFRFTE5FVDogVHJhbnNtaXQgRG8gTG9nb3V0IE9wdGlvblxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1ROX05BV1MgICA6ICAgICAgICAgICAgICAgICAvKiBURUxORVQgTkFXUyAqLworICAgICAgcHJpbnRmKAorICAgICAgICAiXFxLdG5fbmF3cyAgICAgICBURUxORVQ6IFRyYW5zbWl0IFdpbmRvdyBTaXplIGlmIE5BV1MgaXMgYWN0aXZlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfUEFTVEUgICAgICAgOiAgICAgICAgICAgICAgIC8qIFBhc3RlIGRhdGEgZnJvbSBjbGlwYm9hcmQgKi8KKyAgICAgIHByaW50ZigiXFxLcGFzdGUgICAgICAgICBQYXN0ZSBkYXRhIGZyb20gY2xpcGJvYXJkIHRvIGhvc3RcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19DTFJTQ1JOICAgICA6ICAgICAgICAgICAgICAgLyogQ2xlYXIgVGVybWluYWwgU2NyZWVuICovCisgICAgICBwcmludGYoIlxcS2NsZWFyc2NyZWVuICAgQ2xlYXIgdGhlIFRlcm1pbmFsIHNjcmVlblxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1BSVEFVVE8gICAgIDogICAgICAgICAgICAgICAvKiBQcmludCBBdXRvIG1vZGUgKi8KKyAgICAgIHByaW50ZigiXFxLcHJ0YXV0byAgICAgICBUb2dnbGUgQXV0by1QcmludCBtb2RlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfUFJUQ09QWSAgICAgOiAgICAgICAgICAgICAgIC8qIFByaW50IENvcHkgbW9kZSAqLworICAgICAgcHJpbnRmKCJcXEtwcnRjb3B5ICAgICAgIFRvZ2dsZSBDb3B5LVByaW50IG1vZGVcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19BTlNXRVJCQUNLICA6ICAgICAgICAgICAgICAgLyogVHJhbnNtaXQgQW5zd2VyYmFjayBTdHJpbmcgKi8KKyAgICAgIHByaW50ZigiXFxLYW5zd2VyYmFjayAgICBUcmFuc21pdCBhbnN3ZXJiYWNrIHN0cmluZyB0byBob3N0XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfU0VUX0JPT0sgICAgOiAgICAgICAgICAgICAgIC8qIFNldCBCb29rbWFyayAqLworICAgICAgcHJpbnRmKCJcXEtzZXRib29rICAgICAgIFNldCBib29rbWFya1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1FVSVQgICAgICAgIDogICAgICAgICAgICAgICAvKiBRdWl0IEtlcm1pdCAqLworICAgICAgcHJpbnRmKCJcXEtxdWl0ICAgICAgICAgIEhhbmd1cCBjb25uZWN0aW9uIGFuZCBxdWl0IGtlcm1pdFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0tFWUNMSUNLICAgIDogICAgICAgICAgICAgICAvKiBUb2dnbGUgS2V5Y2xpY2sgKi8KKyAgICAgIHByaW50ZigiXFxLa2V5Y2xpY2sgICAgICBUb2dnbGUgS2V5Y2xpY2sgbW9kZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0xPR0RFQlVHICAgIDogICAgICAgICAgICAgICAvKiBUb2dnbGUgRGVidWcgTG9nIEZpbGUgKi8KKyAgICAgIHByaW50ZigiXFxLbG9nZGVidWcgICAgICBUb2dnbGUgRGVidWcgTG9nZ2luZyB0byBGaWxlXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfRk5LRVlTICAgICAgOiAgICAgICAgICAgICAgIC8qIFNob3cgRnVuY3Rpb24gS2V5IExhYmVscyAqLworICAgICAgcHJpbnRmKCJcXEtmbmtleXMgICAgICAgIERpc3BsYXkgRnVuY3Rpb24gS2V5IExhYmVsc1xuIik7CisgICAgICBicmVhazsKKworI2lmZGVmIE9TMk1PVVNFCisvKiBNb3VzZSBvbmx5IEt2ZXJicyAqLworCisgICAgY2FzZSAgS19NT1VTRV9DVVJQT1MgOgorICAgICAgcHJpbnRmKCJcXEttb3VzZWN1cnBvcyAgIE1vdXNlOiBNb3ZlIGhvc3QgY3Vyc29yIHRvIHBvc2l0aW9uXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfTU9VU0VfTUFSSyAgIDoKKyAgICAgIHByaW50ZigKKyAgICAgIlxcS21vdXNlbWFyayAgICAgTW91c2U6IE1hcmsgdGV4dCBmb3Igc2VsZWN0aW9uIChkcmFnIGV2ZW50IG9ubHkpXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfTU9VU0VfVVJMICAgIDoKKyAgICAgIHByaW50ZigiXFxLbW91c2V1cmwgICAgICBNb3VzZTogU3RhcnQgYnJvd3NlciB3aXRoIHNlbGVjdGVkIFVSTFxuIik7CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBPUzJNT1VTRSAqLworCisvKiBBTlNJIEZ1bmN0aW9uIEtleSBkZWZpbml0aW9ucyAqLworICAgIGNhc2UgIEtfQU5TSUYwMSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMDEgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogRjEgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYwMiAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMDIgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogRjIgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYwMyAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMDMgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogRjMgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYwNCAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMDQgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogRjQgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYwNSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMDUgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogRjUgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYwNiAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMDYgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogRjYgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYwNyAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMDcgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogRjcgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYwOCAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMDggICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogRjggXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYwOSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMDkgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogRjkgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYxMCAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMTAgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogRjEwXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYxMSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMTEgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogRjExXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYxMiAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMTIgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogRjEyXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYxMyAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMTMgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogU2hpZnQtRjEgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYxNCAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMTQgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogU2hpZnQtRjIgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYxNSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMTUgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogU2hpZnQtRjMgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYxNiAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMTYgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogU2hpZnQtRjQgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYxNyAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMTcgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogU2hpZnQtRjUgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYxOCAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMTggICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogU2hpZnQtRjYgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYxOSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMTkgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogU2hpZnQtRjcgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYyMCAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMjAgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogU2hpZnQtRjggXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYyMSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMjEgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogU2hpZnQtRjkgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYyMiAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMjIgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogU2hpZnQtRjEwXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYyMyAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMjMgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogU2hpZnQtRjExXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYyNCAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMjQgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogU2hpZnQtRjEyXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYyNSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMjUgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogQ3RybC1GMSBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19BTlNJRjI2ICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLYW5zaWYyNiAgICAgICBUcmFuc21pdCBTQ09BTlNJL0FUMzg2OiBDdHJsLUYyIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGMjcgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjI3ICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IEN0cmwtRjMgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYyOCAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMjggICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogQ3RybC1GNCBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19BTlNJRjI5ICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLYW5zaWYyOSAgICAgICBUcmFuc21pdCBTQ09BTlNJL0FUMzg2OiBDdHJsLUY1IFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGMzAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjMwICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IEN0cmwtRjYgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYzMSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMzEgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogQ3RybC1GNyBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19BTlNJRjMyICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLYW5zaWYzMiAgICAgICBUcmFuc21pdCBTQ09BTlNJL0FUMzg2OiBDdHJsLUY4IFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGMzMgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjMzICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IEN0cmwtRjkgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYzNCAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMzQgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogQ3RybC1GMTBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19BTlNJRjM1ICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLYW5zaWYzNSAgICAgICBUcmFuc21pdCBTQ09BTlNJL0FUMzg2OiBDdHJsLUYxMVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGMzYgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjM2ICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IEN0cmwtRjEyXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUYzNyAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmMzcgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogQ3RybC1TaGlmdC1GMSBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19BTlNJRjM4ICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLYW5zaWYzOCAgICAgICBUcmFuc21pdCBTQ09BTlNJL0FUMzg2OiBDdHJsLVNoaWZ0LUYyIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGMzkgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjM5ICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IEN0cmwtU2hpZnQtRjMgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUY0MCAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmNDAgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogQ3RybC1TaGlmdC1GNCBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19BTlNJRjQxICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLYW5zaWY0MSAgICAgICBUcmFuc21pdCBTQ09BTlNJL0FUMzg2OiBDdHJsLVNoaWZ0LUY1IFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGNDIgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjQyICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IEN0cmwtU2hpZnQtRjYgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUY0MyAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmNDMgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogQ3RybC1TaGlmdC1GNyBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19BTlNJRjQ0ICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLYW5zaWY0NCAgICAgICBUcmFuc21pdCBTQ09BTlNJL0FUMzg2OiBDdHJsLVNoaWZ0LUY4IFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGNDUgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjQ1ICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IEN0cmwtU2hpZnQtRjkgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUY0NiAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmNDYgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogQ3RybC1TaGlmdC1GMTBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19BTlNJRjQ3ICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLYW5zaWY0NyAgICAgICBUcmFuc21pdCBTQ09BTlNJL0FUMzg2OiBDdHJsLVNoaWZ0LUYxMVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGNDggICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjQ4ICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IEN0cmwtU2hpZnQtRjEyXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUY0OSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmNDkgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogSG9tZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGNTAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjUwICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IFVwIEFycm93XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUY1MSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmNTEgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogUGdVcFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGNTIgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjUyICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IEN0cmwtU2hpZnQtU3VidHJhY3RcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19BTlNJRjUzICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLYW5zaWY1MyAgICAgICBUcmFuc21pdCBTQ09BTlNJL0FUMzg2OiBMZWZ0IEFycm93XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUY1NCAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmNTQgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogQ2xlYXJcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19BTlNJRjU1ICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLYW5zaWY1NSAgICAgICBUcmFuc21pdCBTQ09BTlNJL0FUMzg2OiBSaWdodCBBcnJvd1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGNTYgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjU2ICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IFNoaWZ0LUFkZFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGNTcgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjU3ICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IEVuZFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0FOU0lGNTggICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEthbnNpZjU4ICAgICAgIFRyYW5zbWl0IFNDT0FOU0kvQVQzODY6IERvd24gQXJyb3dcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19BTlNJRjU5ICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLYW5zaWY1OSAgICAgICBUcmFuc21pdCBTQ09BTlNJL0FUMzg2OiBQZ0RuXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUY2MCAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmNjAgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogSW5zZXJ0XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfQU5TSUY2MSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Fuc2lmNjEgICAgICAgVHJhbnNtaXQgU0NPQU5TSS9BVDM4NjogKG5vdCBuYW1lZClcbiIpOworICAgICAgYnJlYWs7CisKKy8qIFdZU0UgRnVuY3Rpb24gS2V5cyAodW5zaGlmdGVkKSAqLworICAgIGNhc2UgIEtfV1lGMDEgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjAxICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEYxXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lGMDIgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjAyICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEYyXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lGMDMgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjAzICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEYzXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lGMDQgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjA0ICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEY0XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lGMDUgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjA1ICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEY1XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lGMDYgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjA2ICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEY2XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lGMDcgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjA3ICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEY3XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lGMDggICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjA4ICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEY4XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lGMDkgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjA5ICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEY5XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lGMTAgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjEwICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEYxMFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZRjExICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eWYxMSAgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBGMTFcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWUYxMiAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lmMTIgICAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogRjEyXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lGMTMgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjEzICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEYxM1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZRjE0ICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eWYxNCAgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBGMTRcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWUYxNSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lmMTUgICAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogRjE1XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lGMTYgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjE2ICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEYxNlxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZRjE3ICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eWYxNyAgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBGMTdcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWUYxOCAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lmMTggICAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogRjE4XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lGMTkgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZjE5ICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEYxOVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZRjIwICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eWYyMCAgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBGMjBcbiIpOworICAgICAgYnJlYWs7CisKKy8qIFdZU0UgRnVuY3Rpb24gS2V5cyAoc2hpZnRlZCkgKi8KKyAgICBjYXNlICBLX1dZU0YwMSAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eXNmMDEgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBTaGlmdC1GMVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU0YwMiAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eXNmMDIgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBTaGlmdC1GMlxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU0YwMyAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lzZjAzICAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2hpZnQtRjNcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWVNGMDQgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5c2YwNCAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFNoaWZ0LUY0XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lTRjA1ICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eXNmMDUgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBTaGlmdC1GNVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU0YwNiAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lzZjA2ICAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2hpZnQtRjZcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWVNGMDcgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5c2YwNyAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFNoaWZ0LUY3XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lTRjA4ICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eXNmMDggICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBTaGlmdC1GOFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU0YwOSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lzZjA5ICAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2hpZnQtRjlcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWVNGMTAgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5c2YxMCAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFNoaWZ0LUYxMFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU0YxMSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lzZjExICAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2hpZnQtRjExXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lTRjEyICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eXNmMTIgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBTaGlmdC1GMTJcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWVNGMTMgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5c2YxMyAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFNoaWZ0LUYxM1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU0YxNCAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lzZjE0ICAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2hpZnQtRjE0XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lTRjE1ICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eXNmMTUgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBTaGlmdC1GMTVcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWVNGMTYgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5c2YxNiAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFNoaWZ0LUYxNlxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU0YxNyAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eXNmMTcgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBTaGlmdC1GMTdcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWVNGMTggICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lzZjE4ICAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2hpZnQtRjE4XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lTRjE5ICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5c2YxOSAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFNoaWZ0LUYxOVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU0YyMCAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eXNmMjAgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBTaGlmdC1GMjBcbiIpOworICAgICAgYnJlYWs7CisKKy8qIFdZU0UgRWRpdCBhbmQgU3BlY2lhbCBLZXlzICovCisgICAgY2FzZSAgS19XWUJTICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eWJzICAgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBCYWNrc3BhY2VcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWUNMUkxOICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3ljbHJsbiAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogQ2xlYXIgTGluZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU0NMUkxOICAgICA6CisgICAgIHByaW50ZigiXFxLd3lzY2xybG4gICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2hpZnQtQ2xlYXIgTGluZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZQ0xSUEcgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5Y2xycGcgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IENsZWFyIFBhZ2VcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWVNDTFJQRyAgICAgOgorICAgIHByaW50ZigiXFxLd3lzY2xycGcgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2hpZnQtQ2xlYXIgUGFnZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZREVMQ0hBUiAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZGVsY2hhciAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IERlbGV0ZSBDaGFyXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lERUxMTiAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lkZWxsbiAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogRGVsZXRlIExpbmVcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWUVOVEVSICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3llbnRlciAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogRW50ZXJcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWUVTQyAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3llc2MgICAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogRXNjXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lIT01FICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5aG9tZSAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEhvbWVcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWVNIT01FICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lzaG9tZSAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2hpZnQtSG9tZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZSU5TRVJUICAgICA6CisgICAgICBwcmludGYoIlxcS3d5aW5zZXJ0ICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEluc2VydFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZSU5TQ0hBUiAgICA6CisgICAgICBwcmludGYoIlxcS3d5aW5zY2hhciAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEluc2VydCBDaGFyXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lJTlNMTiAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5aW5zbG4gICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IEluc2VydCBMaW5lXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lQR05FWFQgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lwZ25leHQgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogUGFnZSBOZXh0XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lQR1BSRVYgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lwZ3ByZXYgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogUGFnZSBQcmV2aW91c1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZUkVQTEFDRSAgICA6CisgICAgICBwcmludGYoIlxcS3d5cmVwbGFjZSAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFJlcGxhY2UgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWVJFVFVSTiAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eXJldHVybiAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBSZXR1cm4gICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lUQUIgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5dGFiICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFRhYiAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWVNUQUIgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lzdGFiICAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2hpZnQtVGFiICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZUFJUU0NOICAgICA6CisgICAgICBwcmludGYoIlxcS3d5cHJ0c2NuICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFByaW50IFNjcmVlbiBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWVNFU0MgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eXNlc2MgICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBTaGlmdC1Fc2MgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lTQlMgICAgICAgIDoKKyAgICBwcmludGYoIlxcS3d5c2JzICAgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFNoaWZ0LUJhY2tzcGFjZVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU0VOVEVSICAgICA6CisgICAgICBwcmludGYoIlxcS3d5c2VudGVyICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFNoaWZ0LUVudGVyXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lTUkVUVVJOICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lzcmV0dXJuICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2hpZnQtUmV0dXJuXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lVUEFSUiAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5dXBhcnIgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFVwIEFycm93XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lETkFSUiAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3d5ZG5hcnIgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IERvd24gQXJyb3dcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWUxGQVJSICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLd3lsZmFyciAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogTGVmdCBBcnJvd1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZUlRBUlIgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt3eXJ0YXJyICAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBSaWdodCBBcnJvd1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU1VQQVJSICAgICA6CisgICAgICBwcmludGYoIlxcS3d5c3VwYXJyICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFNoaWZ0LVVwIEFycm93XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfV1lTRE5BUlIgICAgIDoKKyAgICBwcmludGYoIlxcS3d5c2RuYXJyICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFNoaWZ0LURvd24gQXJyb3dcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19XWVNMRkFSUiAgICAgOgorICAgIHByaW50ZigiXFxLd3lzbGZhcnIgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2hpZnQtTGVmdCBBcnJvd1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU1JUQVJSICAgICA6CisgICAgcHJpbnRmKCJcXEt3eXNydGFyciAgICAgIFRyYW5zbWl0IFdZU0UgMzAvNTAvNjAvMTYwOiBTaGlmdC1SaWdodCBBcnJvd1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU0VORDoKKyAgICAgIHByaW50ZigiXFxLd3lzZW5kICAgICAgICBUcmFuc21pdCBXWVNFIDMwLzUwLzYwLzE2MDogU2VuZFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1dZU1NFTkQ6CisgICAgICBwcmludGYoIlxcS3d5c3NlbmQgICAgICAgVHJhbnNtaXQgV1lTRSAzMC81MC82MC8xNjA6IFNoaWZ0LVNlbmRcbiIpOworICAgICAgYnJlYWs7CisKKy8qIERhdGEgR2VuZXJhbCBGdW5jdGlvbiBLZXlzICh1bnNoaWZ0ZWQpICovCisgICAgY2FzZSAgS19ER0YwMSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEYxICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YwMiAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEYyICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YwMyAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEYzICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YwNCAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEY0ICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YwNSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEY1ICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YwNiAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEY2ICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YwNyAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEY3ICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YwOCAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEY4ICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YwOSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEY5ICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YxMCAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEYxMCAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YxMSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEYxMSAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YxMiAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEYxMiAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YxMyAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEYxMyAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YxNCAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEYxNCAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0YxNSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdmMDEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEYxNSAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisKKy8qIERhdGEgR2VuZXJhbCBGdW5jdGlvbiBLZXlzIChzaGlmdGVkKSAqLworICAgIGNhc2UgIEtfREdTRjAxICAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgICAiXFxLZGdzZjAxICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IFNoaWZ0LUYxICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER1NGMDIgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAgICJcXEtkZ3NmMDIgICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogU2hpZnQtRjIgICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHU0YwMyAgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICAgIlxcS2Rnc2YwMyAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBTaGlmdC1GMyAgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdTRjA0ICAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgICAiXFxLZGdzZjA0ICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IFNoaWZ0LUY0ICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER1NGMDUgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAgICJcXEtkZ3NmMDUgICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogU2hpZnQtRjUgICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHU0YwNiAgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICAgIlxcS2Rnc2YwNiAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBTaGlmdC1GNiAgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdTRjA3ICAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgICAiXFxLZGdzZjA3ICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IFNoaWZ0LUY3ICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER1NGMDggICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAgICJcXEtkZ3NmMDggICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogU2hpZnQtRjggICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHU0YwOSAgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICAgIlxcS2Rnc2YwOSAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBTaGlmdC1GOSAgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdTRjEwICAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgICAiXFxLZGdzZjEwICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IFNoaWZ0LUYxMCAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER1NGMTEgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAgICJcXEtkZ3NmMTEgICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogU2hpZnQtRjExICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHU0YxMiAgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICAgIlxcS2Rnc2YxMiAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBTaGlmdC1GMTIgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdTRjEzICAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgICAiXFxLZGdzZjEzICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IFNoaWZ0LUYxMyAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER1NGMTQgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAgICJcXEtkZ3NmMTQgICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogU2hpZnQtRjE0ICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHU0YxNSAgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICAgIlxcS2Rnc2YxNSAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBTaGlmdC1GMTUgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworCisvKiBEYXRhIEdlbmVyYWwgRnVuY3Rpb24gS2V5cyAoY29udHJvbCkgKi8KKyAgICBjYXNlICBLX0RHQ0YwMSAgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICAgIlxcS2RnY2YwMSAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBDdHJsLUYxICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0NGMDIgICAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgICAiXFxLZGdjZjAyICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEN0cmwtRjIgICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHQ0YwMyAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAgICJcXEtkZ2NmMDMgICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQ3RybC1GMyAgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdDRjA0ICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICAgIlxcS2RnY2YwNCAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBDdHJsLUY0ICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0NGMDUgICAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgICAiXFxLZGdjZjA1ICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEN0cmwtRjUgICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHQ0YwNiAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAgICJcXEtkZ2NmMDYgICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQ3RybC1GNiAgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdDRjA3ICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICAgIlxcS2RnY2YwNyAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBDdHJsLUY3ICAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0NGMDggICAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgICAiXFxLZGdjZjA4ICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEN0cmwtRjggICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHQ0YwOSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAgICJcXEtkZ2NmMDkgICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQ3RybC1GOSAgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdDRjEwICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICAgIlxcS2RnY2YxMCAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBDdHJsLUYxMCAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0NGMTEgICAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgICAiXFxLZGdjZjExICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEN0cmwtRjExICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHQ0YxMiAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAgICJcXEtkZ2NmMTIgICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQ3RybC1GMTIgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdDRjEzICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICAgIlxcS2RnY2YxMyAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBDdHJsLUYxMyAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0NGMTQgICAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgICAiXFxLZGdjZjE0ICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEN0cmwtRjE0ICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHQ0YxNSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAgICJcXEtkZ2NmMTUgICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQ3RybC1GMTUgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworCisvKiBEYXRhIEdlbmVyYWwgRnVuY3Rpb24gS2V5cyAoY29udHJvbCBzaGlmdGVkKSAqLworICAgIGNhc2UgIEtfREdDU0YwMSAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgIlxcS2RnY3NmMDEgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBDdHJsLVNoaWZ0LUYxICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHQ1NGMDIgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICJcXEtkZ2NzZjAyICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQ3RybC1TaGlmdC1GMiAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0NTRjAzICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAiXFxLZGdjc2YwMyAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEN0cmwtU2hpZnQtRjMgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdDU0YwNCAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgIlxcS2RnY3NmMDQgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBDdHJsLVNoaWZ0LUY0ICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHQ1NGMDUgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICJcXEtkZ2NzZjA1ICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQ3RybC1TaGlmdC1GNSAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0NTRjA2ICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAiXFxLZGdjc2YwNiAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEN0cmwtU2hpZnQtRjYgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdDU0YwNyAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgIlxcS2RnY3NmMDcgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBDdHJsLVNoaWZ0LUY3ICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHQ1NGMDggICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICJcXEtkZ2NzZjA4ICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQ3RybC1TaGlmdC1GOCAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0NTRjA5ICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAiXFxLZGdjc2YwOSAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEN0cmwtU2hpZnQtRjkgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdDU0YxMCAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgIlxcS2RnY3NmMTAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBDdHJsLVNoaWZ0LUYxMCAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHQ1NGMTEgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICJcXEtkZ2NzZjExICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQ3RybC1TaGlmdC1GMTEgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0NTRjEyICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAiXFxLZGdjc2YxMiAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEN0cmwtU2hpZnQtRjEyICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdDU0YxMyAgICAgICAgICA6CisgICAgICBwcmludGYoCisgICAgIlxcS2RnY3NmMTMgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBDdHJsLVNoaWZ0LUYxMyAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHQ1NGMTQgICAgICAgICAgOgorICAgICAgcHJpbnRmKAorICAgICJcXEtkZ2NzZjE0ICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQ3RybC1TaGlmdC1GMTQgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0NTRjE1ICAgICAgICAgIDoKKyAgICAgIHByaW50ZigKKyAgICAiXFxLZGdjc2YxNSAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEN0cmwtU2hpZnQtRjE1ICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAgS19ER1VQQVJSICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGd1cGFyciAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IFVwIEFycm93ICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHRE5BUlIgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEtkZ2RuYXJyICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogRG93biBBcnJvdyAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdMRkFSUiAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2RnbGZhcnIgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBMZWZ0IEFycm93ICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER1JUQVJSICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdydGFyciAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IFJpZ2h0IEFycm93ICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHU1VQQVJSICAgICA6CisgICAgICBwcmludGYoIlxcS2Rnc3VwYXJyICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBTaGlmdC1VcCBBcnJvdyAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER1NETkFSUiAgICAgOgorICAgICAgcHJpbnRmKCJcXEtkZ3NkbmFyciAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogU2hpZnQtRG93biBBcnJvdyAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdTTEZBUlIgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdzbGZhcnIgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IFNoaWZ0LUxlZnQgQXJyb3cgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHU1JUQVJSICAgICA6CisgICAgICBwcmludGYoIlxcS2Rnc3J0YXJyICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBTaGlmdC1SaWdodCBBcnJvdyBcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICBLX0RHRVJBU0VQQUdFICA6CisgICAgICBwcmludGYoIlxcS2RnZXJhc2VwYWdlICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBFcmFzZSBQYWdlICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0MxICAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdjMSAgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEMxICAgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHQzIgICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEtkZ2MyICAgICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQzIgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdFUkFTRUVPTCAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdlcmFzZWVvbCAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEVyYXNlIEVPTCAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHQzMgICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEtkZ2MzICAgICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQzMgICAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdDNCAgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2RnYzQgICAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBDNCAgICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER0NNRFBSSU5UICAgOgorICAgICAgcHJpbnRmKCJcXEtkZ2NtZHByaW50ICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogQ29tbWFuZCBQcmludCAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdIT01FICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdob21lICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEhvbWUgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHU0VSQVNFUEFHRSA6CisgICAgICBwcmludGYoIlxcS2Rnc2VyYXNlcGFnZSAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBFcmFzZSBQYWdlICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER1NDMSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdzYzEgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IFNoaWZ0LUMxICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHU0MyICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEtkZ3NjMiAgICAgICAgIFRyYW5zbWl0IERhdGEgR2VuZXJhbDogU2hpZnQtQzIgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdTRVJBU0VFT0wgIDoKKyAgICAgIHByaW50ZigiXFxLZGdzZXJhc2Vlb2wgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IFNoaWZ0LUVyYXNlIEVPTCAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdTQzMgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2Rnc2MzICAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBTaGlmdC1DMyAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19ER1NDNCAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdzYzQgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IFNoaWZ0LUM0ICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHU0NNRFBSSU5UICA6CisgICAgICBwcmludGYoIlxcS2Rnc2NtZHByaW50ICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBTaGlmdC1Db21tYW5kIFByaW50XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfREdCUyAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLZGdicyAgICAgICAgICBUcmFuc21pdCBEYXRhIEdlbmVyYWw6IEJhY2tzcGFjZSAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0RHU0hPTUUgICAgICA6CisgICAgICBwcmludGYoIlxcS2RzaG9tZSAgICAgICAgVHJhbnNtaXQgRGF0YSBHZW5lcmFsOiBTaGlmdC1Ib21lICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisKKworLyogVGVsZXZpZGVvIEZ1bmN0aW9uIEtleXMgKHVuc2hpZnRlZCkgKi8KKyAgICBjYXNlICBLX1RWSUYwMSAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt0dmlmMDEgICAgICAgIFRyYW5zbWl0IFRlbGV2aWRlbzogRjEgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVFZJRjAyICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3R2aWYwMiAgICAgICAgVHJhbnNtaXQgVGVsZXZpZGVvOiBGMiAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVFZJRjAzICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3R2aWYwMyAgICAgICAgVHJhbnNtaXQgVGVsZXZpZGVvOiBGMyAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMDQgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjA0ICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEY0ICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMDUgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjA1ICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEY1ICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMDYgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjA2ICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEY2ICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMDcgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjA3ICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEY3ICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMDggICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjA4ICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEY4ICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMDkgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjA5ICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEY5ICAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMTAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjEwICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEYxMCAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMTEgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjExICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEYxMSAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMTIgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjEyICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEYxMiAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMTMgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjEzICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEYxMyAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMTQgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjE0ICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEYxNCAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMTUgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjE1ICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEYxNSAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklGMTYgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZjE2ICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEYxNiAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisKKy8qIFRlbGV2aWRlbyBGdW5jdGlvbiBLZXlzIChzaGlmdGVkKSAqLworICAgIGNhc2UgIEtfVFZJU0YwMSAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3R2aXNmMDEgICAgICAgVHJhbnNtaXQgVGVsZXZpZGVvOiBTaGlmdC1GMSBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTRjAyICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2YwMiAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LUYyIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1RWSVNGMDMgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3R2aXNmMDMgICAgICAgVHJhbnNtaXQgVGVsZXZpZGVvOiBTaGlmdC1GMyBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTRjA0ICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt0dmlzZjA0ICAgICAgIFRyYW5zbWl0IFRlbGV2aWRlbzogU2hpZnQtRjQgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVFZJU0YwNSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2YwNSAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LUY1IFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1RWSVNGMDYgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3R2aXNmMDYgICAgICAgVHJhbnNtaXQgVGVsZXZpZGVvOiBTaGlmdC1GNiBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTRjA3ICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt0dmlzZjA3ICAgICAgIFRyYW5zbWl0IFRlbGV2aWRlbzogU2hpZnQtRjcgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVFZJU0YwOCAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2YwOCAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LUY4IFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1RWSVNGMDkgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3R2aXNmMDkgICAgICAgVHJhbnNtaXQgVGVsZXZpZGVvOiBTaGlmdC1GOSBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTRjEwICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt0dmlzZjEwICAgICAgIFRyYW5zbWl0IFRlbGV2aWRlbzogU2hpZnQtRjEwXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVFZJU0YxMSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2YxMSAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LUYxMVxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1RWSVNGMTIgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3R2aXNmMTIgICAgICAgVHJhbnNtaXQgVGVsZXZpZGVvOiBTaGlmdC1GMTJcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTRjEzICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt0dmlzZjEzICAgICAgIFRyYW5zbWl0IFRlbGV2aWRlbzogU2hpZnQtRjEzXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfVFZJU0YxNCAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2YxNCAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LUYxNFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX1RWSVNGMTUgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS3R2aXNmMTUgICAgICAgVHJhbnNtaXQgVGVsZXZpZGVvOiBTaGlmdC1GMTVcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTRjE2ICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEt0dmlzZjE2ICAgICAgIFRyYW5zbWl0IFRlbGV2aWRlbzogU2hpZnQtRjE2XG4iKTsKKyAgICAgIGJyZWFrOworCisvKiBUZWxldmlkZW8gRWRpdCBhbmQgU3BlY2lhbCBLZXlzICovCisgICAgY2FzZSAgS19UVklCUyAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpYnMgICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEJhY2tzcGFjZSAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklDTFJMTiAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpY2xybG4gICAgICBUcmFuc21pdCBUZWxldmlkZW86IENsZWFyIExpbmUgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTQ0xSTE4gICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2NscmxuICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LUNsZWFyIExpbmVcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklDTFJQRyAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpY2xycGcgICAgICBUcmFuc21pdCBUZWxldmlkZW86IENsZWFyIFBhZ2UgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTQ0xSUEcgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2NscnBnICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LUNsZWFyIFBhZ2VcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklERUxDSEFSICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZGVsY2hhciAgICBUcmFuc21pdCBUZWxldmlkZW86IERlbGV0ZSBDaGFyICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklERUxMTiAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZGVsbG4gICAgICBUcmFuc21pdCBUZWxldmlkZW86IERlbGV0ZSBMaW5lICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklFTlRFUiAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZW50ZXIgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEVudGVyICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklFU0MgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZXNjICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEVzYyAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklIT01FICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpaG9tZSAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IEhvbWUgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTSE9NRSAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2hvbWUgICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LUhvbWUgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklJTlNFUlQgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpaW5zZXJ0ICAgICBUcmFuc21pdCBUZWxldmlkZW86IEluc2VydCAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklJTlNDSEFSICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpaW5zY2hhciAgICBUcmFuc21pdCBUZWxldmlkZW86IEluc2VydCBDaGFyICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklJTlNMTiAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpaW5zbG4gICAgICBUcmFuc21pdCBUZWxldmlkZW86IEluc2VydCBMaW5lICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklQR05FWFQgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpcGduZXh0ICAgICBUcmFuc21pdCBUZWxldmlkZW86IFBhZ2UgTmV4dCAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklQR1BSRVYgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpcGdwcmV2ICAgICBUcmFuc21pdCBUZWxldmlkZW86IFBhZ2UgUHJldmlvdXMgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklSRVBMQUNFICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpcmVwbGFjZSAgICBUcmFuc21pdCBUZWxldmlkZW86IFJlcGxhY2UgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklSRVRVUk4gICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpcmV0dXJuICAgICBUcmFuc21pdCBUZWxldmlkZW86IFJldHVybiAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklUQUIgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpdGFiICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IFRhYiAgICAgICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTVEFCICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc3RhYiAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LVRhYiAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklQUlRTQ04gICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpcHJ0c2NuICAgICBUcmFuc21pdCBUZWxldmlkZW86IFByaW50IFNjcmVlbiAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTRVNDICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2VzYyAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LUVzYyAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTQlMgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2JzICAgICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LUJhY2tzcGFjZSBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTRU5URVIgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2VudGVyICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LUVudGVyICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTUkVUVVJOICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc3JldHVybiAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LVJldHVybiAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklVUEFSUiAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpdXBhcnIgICAgICBUcmFuc21pdCBUZWxldmlkZW86IFVwIEFycm93ICAgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklETkFSUiAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpZG5hcnIgICAgICBUcmFuc21pdCBUZWxldmlkZW86IERvd24gQXJyb3cgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklMRkFSUiAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpbGZhcnIgICAgICBUcmFuc21pdCBUZWxldmlkZW86IExlZnQgQXJyb3cgICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklSVEFSUiAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpcnRhcnIgICAgICBUcmFuc21pdCBUZWxldmlkZW86IFJpZ2h0IEFycm93ICAgICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTVVBBUlIgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc3VwYXJyICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LVVwIEFycm93ICBcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTRE5BUlIgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2RuYXJyICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LURvd24gQXJyb3dcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTTEZBUlIgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc2xmYXJyICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LUxlZnQgQXJyb3dcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19UVklTUlRBUlIgICAgIDoKKyAgICAgIHByaW50ZigiXFxLdHZpc3J0YXJyICAgICBUcmFuc21pdCBUZWxldmlkZW86IFNoaWZ0LVJpZ2h0IEFycm93XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgS19UVklTRU5EOgorICAgICAgcHJpbnRmKCJcXEt0dmlzZW5kICAgICAgIFRyYW5zbWl0IFRlbGV2aWRlbzogU2VuZFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEtfVFZJU1NFTkQ6CisgICAgICBwcmludGYoIlxcS3R2aXNzZW5kICAgICAgVHJhbnNtaXQgVGVsZXZpZGVvOiBTaGlmdC1TZW5kXG4iKTsKKyAgICAgIGJyZWFrOworCisvKiBIUCBGdW5jdGlvbiBhbmQgRWRpdCBrZXlzICovCisgICAgY2FzZSAgS19IUEYwMSAgICAgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLaHBmMDEgICAgICAgICBUcmFuc21pdCBIZXdsZXR0LVBhY2thcmQ6IEYxICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0hQRjAyICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEtocGYwMiAgICAgICAgIFRyYW5zbWl0IEhld2xldHQtUGFja2FyZDogRjIgICAgICAgICAgICAgIFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0hQRjAzICAgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEtocGYwMyAgICAgICAgIFRyYW5zbWl0IEhld2xldHQtUGFja2FyZDogRjMgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMDQgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjA0ICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGNCAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMDUgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjA1ICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGNSAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMDYgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjA2ICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGNiAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMDcgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjA3ICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGNyAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMDggICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjA4ICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGOCAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMDkgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjA5ICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGOSAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMTAgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjEwICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGMTAgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMTEgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjExICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGMTEgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMTIgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjEyICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGMTIgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMTMgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjEzICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGMTMgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMTQgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjE0ICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGMTQgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMTUgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjE1ICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGMTUgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBGMTYgICAgICAgICAgICA6CisgICAgICBwcmludGYoIlxcS2hwZjE2ICAgICAgICAgVHJhbnNtaXQgSGV3bGV0dC1QYWNrYXJkOiBGMTYgICAgICAgICAgICAgXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIEtfSFBSRVRVUk4gICAgIDoKKyAgICAgIHByaW50ZigiXFxLaHByZXR1cm4gICAgICBUcmFuc21pdCBIZXdsZXR0LVBhY2thcmQ6IFJldHVyblxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICBLX0hQRU5URVIgICAgICAgICAgOgorICAgICAgcHJpbnRmKCJcXEtocGVudGVyICAgICAgIFRyYW5zbWl0IEhld2xldHQtUGFja2FyZDogRW50ZXIgKGtleXBhZClcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAgS19IUEJBQ0tUQUIgICAgICAgIDoKKyAgICAgIHByaW50ZigiXFxLaHBiYWNrdGFiICAgICBUcmFuc21pdCBIZXdsZXR0LVBhY2thcmQ6IEJhY2sgVGFiXG4iKTsKKyAgICAgIGJyZWFrOworICAgICAgICAvKiBTaWVtZW5zIE5peGRvcmYgSW50ZXJuYXRpb25hbCA5NzgwMS01eHgga3ZlcmJzICovCisgICAgY2FzZSBLX1NOSV9ET1VCTEVfMCAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfMDAgICAgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogRG91YmxlLVplcm9cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfRE9VQkxFXzAgICAgOgorICAgICAgICBwcmludGYoCisiXFxLc25pX2NfMDAgICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtRG91YmxlLVplcm9cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfQ0UgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jX2NlICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUNFXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0NPTVBPU0UgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19jb21wb3NlICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1Db21wb3NlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0RFTEVURV9DSEFSIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9jX2RlbF9jaGFyICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLURlbGV0ZSBDaGFyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0RFTEVURV9MSU5FIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9jX2RlbF9saW5lICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLURlbGV0ZSBMaW5lXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0RFTEVURV9XT1JEIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9jX2RlbF93b3JkICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLURlbGV0ZSBXb3JkXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0NVUlNPUl9ET1dOIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9jX2RuYXJyICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUN1cnNvciBEb3duXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0VORE1BUktFICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19lbmRtYXJrZSAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1FbmQgTWFya2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfRjAxICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jX2YwMSAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUYxXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0YwMiAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19mMDIgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1GMlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19GMDMgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2NfZjAzICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtRjNcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfRjA0ICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jX2YwNCAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUY0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0YwNSAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19mMDUgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1GNVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19GMDYgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2NfZjA2ICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtRjZcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfRjA3ICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jX2YwNyAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUY3XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0YwOCAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19mMDggICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1GOFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19GMDkgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2NfZjA5ICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtRjlcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfRjEwICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jX2YxMCAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUYxMFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19GMTEgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2NfZjExICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtRjExXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0YxMiAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19mMTIgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1GMTJcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfRjEzICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jX2YxMyAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUYxM1xuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19GMTQgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2NfZjE0ICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtRjE0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0YxNSAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19mMTUgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1GMTVcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfRjE2ICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jX2YxNiAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUYxNlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19GMTcgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2NfZjE3ICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtRjE3XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0YxOCAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19mMTggICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1GMThcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfVVNFUjEgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9jX3VzZXIxICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUtleSBiZWxvdyBGMThcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfRjE5ICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jX2YxOSAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUYxOVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19VU0VSMiAgICAgICA6CisgICAgICAgIHByaW50ZigKKyJcXEtzbmlfY191c2VyMiAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1LZXkgYmVsb3cgRjE5XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0YyMCAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19mMjAgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1GMjBcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfVVNFUjMgICAgICAgOgorICAgICAgICBwcmludGYoCisiXFxLc25pX2NfdXNlcjMgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtS2V5IGJlbG93IEYyMFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19GMjEgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2NfZjIxICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtRjIxXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX1VTRVI0ICAgICAgIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9jX3VzZXI0ICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUtleSBiZWxvdyBGMjFcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfRjIyICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jX2YyMiAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUYyMlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19VU0VSNSAgICAgICA6CisgICAgICAgIHByaW50ZigKKyJcXEtzbmlfY191c2VyNSAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1LZXkgYmVsb3cgRjIyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0hFTFAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19oZWxwICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1IZWxwXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0hPTUUgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19ob21lICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1Ib21lXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0lOU0VSVF9DSEFSIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9jX2luc19jaGFyICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUluc2VydCBDaGFyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0lOU0VSVF9MSU5FIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9jX2luc19saW5lICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUluc2VydCBMaW5lXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0lOU0VSVF9XT1JEIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9jX2luc193b3JkICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLUluc2VydCBXb3JkXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0xFRlRfVEFCICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19sZWZ0X3RhYiAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1MZWZ0IFRhYlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19DVVJTT1JfTEVGVCA6CisgICAgICAgIHByaW50ZigKKyJcXEtzbmlfY19sZmFyciAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1DdXJzb3IgTGVmdFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19NT0RFICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2NfbW9kZSAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtTW9kZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19QQUdFICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2NfcGFnZSAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtUGFnZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ19QUklOVCAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2NfcHJpbnQgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtUHJpbnRcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfQ1VSU09SX1JJR0hUOgorICAgICAgICBwcmludGYoCisiXFxLc25pX2NfcnRhcnIgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN0cmwtQ3Vyc29yIFJpZ2h0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX1NDUk9MTF9ET1dOIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9jX3Njcm9sbF9kbiBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLVNjcm9sbCBEb3duXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX1NDUk9MTF9VUCAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY19zY3JvbGxfdXAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1TY3JvbGwgVXBcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfU1RBUlQgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jX3N0YXJ0ICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLVN0YXJ0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DX0NVUlNPUl9VUCAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfY191cGFyciAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3RybC1DdXJzb3IgVXBcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NfVEFCICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jX3RhYiAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDdHJsLVRhYlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ0UgICAgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2NlICAgICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IENFXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DSF9DT0RFOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jaF9jb2RlICAgICBUb2dnbGUgU05JLTk3ODAxLTV4eDogQ0guQ09ERSBmdW5jdGlvbi5cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0NPTVBPU0UgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9jb21wb3NlICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBDb21wb3NlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9ERUxFVEVfQ0hBUiAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfZGVsX2NoYXIgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogRGVsZXRlIENoYXJcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0RFTEVURV9MSU5FICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9kZWxfbGluZSAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBEZWxldGUgTGluZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfREVMRVRFX1dPUkQgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2RlbF93b3JkICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IERlbGV0ZSBXb3JkXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9DVVJTT1JfRE9XTiAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfZG5hcnIgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogQ3Vyc29yIERvd25cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0VORE1BUktFICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9lbmRtYXJrZSAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBFbmQgTWFya2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YwMSAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMDEgICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGMVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfRjAyICAgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2YwMiAgICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEYyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9GMDMgICAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfZjAzICAgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogRjNcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YwNCAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMDQgICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGNFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfRjA1ICAgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2YwNSAgICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEY1XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9GMDYgICAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfZjA2ICAgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogRjZcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YwNyAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMDcgICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGN1xuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfRjA4ICAgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2YwOCAgICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEY4XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9GMDkgICAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfZjA5ICAgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogRjlcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YxMCAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMTAgICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGMTBcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YxMSAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMTEgICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGMTFcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YxMiAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMTIgICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGMTJcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YxMyAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMTMgICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGMTNcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YxNCAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMTQgICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGMTRcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YxNSAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMTUgICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGMTVcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YxNiAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMTYgICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGMTZcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YxNyAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMTcgICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGMTdcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YxOCAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMTggICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGMThcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1VTRVIxICAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfdXNlcjEgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogS2V5IGJlbG93IEYxOFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfRjE5ICAgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2YxOSAgICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEYxOVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfVVNFUjIgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV91c2VyMiAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBLZXkgYmVsb3cgRjE5XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9GMjAgICAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfZjIwICAgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogRjIwXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9VU0VSMyAgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3VzZXIzICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEtleSBiZWxvdyBGMjBcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0YyMSAgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9mMjEgICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBGMjFcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1VTRVI0ICAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfdXNlcjQgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogS2V5IGJlbG93IEYyMVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfRjIyICAgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2YyMiAgICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEYyMlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfVVNFUjUgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV91c2VyNSAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBLZXkgYmVsb3cgRjIyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9IRUxQICAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfaGVscCAgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogSGVscFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfSE9NRSAgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2hvbWUgICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEhvbWVcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0lOU0VSVF9DSEFSICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9pbnNfY2hhciAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBJbnNlcnQgQ2hhclxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfSU5TRVJUX0xJTkUgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2luc19saW5lICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEluc2VydCBMaW5lXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9JTlNFUlRfV09SRCAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfaW5zX3dvcmQgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogSW5zZXJ0IFdvcmRcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX0xFRlRfVEFCICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9sZWZ0X3RhYiAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBMZWZ0IFRhYlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ1VSU09SX0xFRlQgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX2xmYXJyICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN1cnNvciBMZWZ0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9NT0RFICAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfbW9kZSAgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogTW9kZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfUEFHRSAgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3BhZ2UgICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFBhZ2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1BSSU5UICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9wcmludCAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBQcmludFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ1VSU09SX1JJR0hUICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3J0YXJyICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN1cnNvciBSaWdodFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19ET1VCTEVfMCAgICA6CisgICAgICAgIHByaW50ZigKKyJcXEtzbmlfc18wMCAgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRG91YmxlLVplcm9cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1NfQ0UgICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9zX2NlICAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBTaGlmdC1DRVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19DT01QT1NFICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3NfY29tcG9zZSAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LUNvbXBvc2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1NfREVMRVRFX0NIQVIgOgorICAgICAgICBwcmludGYoCisiXFxLc25pX3NfZGVsX2NoYXIgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LURlbGV0ZSBDaGFyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0RFTEVURV9MSU5FIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9zX2RlbF9saW5lICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBTaGlmdC1EZWxldGUgTGluZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19ERUxFVEVfV09SRCA6CisgICAgICAgIHByaW50ZigKKyJcXEtzbmlfc19kZWxfd29yZCAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRGVsZXRlIFdvcmRcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1NfQ1VSU09SX0RPV04gOgorICAgICAgICBwcmludGYoCisiXFxLc25pX3NfZG5hcnIgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LUN1cnNvciBEb3duXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0VORE1BUktFICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19lbmRtYXJrZSAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRW5kIE1hcmtlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0YwMSAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19mMDEgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRjFcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1NfRjAyICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9zX2YwMiAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBTaGlmdC1GMlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19GMDMgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3NfZjAzICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LUYzXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0YwNCAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19mMDQgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRjRcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1NfRjA1ICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9zX2YwNSAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBTaGlmdC1GNVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19GMDYgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3NfZjA2ICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LUY2XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0YwNyAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19mMDcgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRjdcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1NfRjA4ICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9zX2YwOCAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBTaGlmdC1GOFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19GMDkgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3NfZjA5ICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LUY5XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0YxMCAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19mMTAgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRjEwXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0YxMSAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19mMTEgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRjExXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0YxMiAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19mMTIgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRjEyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0YxMyAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19mMTMgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRjEzXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0YxNCAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19mMTQgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRjE0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0YxNSAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19mMTUgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRjE1XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0YxNiAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19mMTYgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRjE2XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0YxNyAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19mMTcgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRjE3XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0YxOCAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19mMTggICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtRjE4XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX1VTRVIxICAgICAgICA6CisgICAgICAgIHByaW50ZigKKyJcXEtzbmlfc191c2VyMSAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtS2V5IGJlbG93IEYxOFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19GMTkgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3NfZjE5ICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LUYxOVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19VU0VSMiAgICAgICA6CisgICAgICAgIHByaW50ZigKKyJcXEtzbmlfc191c2VyMiAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtS2V5IGJlbG93IEYxOVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19GMjAgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3NfZjIwICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LUYyMFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19VU0VSMyAgICAgICA6CisgICAgICAgIHByaW50ZigKKyJcXEtzbmlfc191c2VyMyAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtS2V5IGJlbG93IEYyMFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19GMjEgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3NfZjIxICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LUYyMVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19VU0VSNCAgICAgICA6CisgICAgICAgIHByaW50ZigKKyJcXEtzbmlfc191c2VyNCAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtS2V5IGJlbG93IEYyMVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19GMjIgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3NfZjIyICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LUYyMlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19VU0VSNSAgICAgICA6CisgICAgICAgIHByaW50ZigKKyJcXEtzbmlfc191c2VyNSAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtS2V5IGJlbG93IEYyMlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19IRUxQICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3NfaGVscCAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LUhlbHBcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1NfSE9NRSAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9zX2hvbWUgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBTaGlmdC1Ib21lXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0lOU0VSVF9DSEFSIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9zX2luc19jaGFyICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBTaGlmdC1JbnNlcnQgQ2hhclxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19JTlNFUlRfTElORSA6CisgICAgICAgIHByaW50ZigKKyJcXEtzbmlfc19pbnNfbGluZSAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtSW5zZXJ0IExpbmVcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1NfSU5TRVJUX1dPUkQgOgorICAgICAgICBwcmludGYoCisiXFxLc25pX3NfaW5zX3dvcmQgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LUluc2VydCBXb3JkXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0xFRlRfVEFCICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19sZWZ0X3RhYiAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtTGVmdCBUYWJcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1NfQ1VSU09SX0xFRlQgOgorICAgICAgICBwcmludGYoCisiXFxLc25pX3NfbGZhcnIgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LUN1cnNvciBMZWZ0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX01PREUgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc19tb2RlICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtTW9kZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19QQUdFICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3NfcGFnZSAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LVBhZ2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1NfUFJJTlQgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9zX3ByaW50ICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBTaGlmdC1QcmludFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19DVVJTT1JfUklHSFQ6CisgICAgICAgIHByaW50ZigKKyJcXEtzbmlfc19ydGFyciAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtQ3Vyc29yIFJpZ2h0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX1NDUk9MTF9ET1dOIDoKKyAgICAgICAgcHJpbnRmKAorIlxcS3NuaV9zX3Njcm9sbF9kbiBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBTaGlmdC1TY3JvbGwgRG93blxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19TQ1JPTExfVVAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3Nfc2Nyb2xsX3VwIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LVNjcm9sbCBVcFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfU19TVEFSVCAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3Nfc3RhcnQgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFNoaWZ0LVN0YXJ0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX0NVUlNPUl9VUCAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc191cGFyciAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtQ3Vyc29yIFVwXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TX1RBQiAgICAgICAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc190YWIgICAgICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2hpZnQtVGFiXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX1NOSV9TQ1JPTExfRE9XTiAgIDoKKyAgICAgICAgcHJpbnRmKCJcXEtzbmlfc2Nyb2xsX2RuICAgVHJhbnNtaXQgU05JLTk3ODAxLTV4eDogU2Nyb2xsIERvd25cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1NDUk9MTF9VUCAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9zY3JvbGxfdXAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBTY3JvbGwgVXBcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfU05JX1NUQVJUICAgICAgICAgOgorICAgICAgICBwcmludGYoIlxcS3NuaV9zdGFydCAgICAgICBUcmFuc21pdCBTTkktOTc4MDEtNXh4OiBTdGFydFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfVEFCICAgICAgICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3RhYiAgICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IFRhYlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19TTklfQ1VSU09SX1VQICAgICA6CisgICAgICAgIHByaW50ZigiXFxLc25pX3VwYXJyICAgICAgIFRyYW5zbWl0IFNOSS05NzgwMS01eHg6IEN1cnNvciBVcFxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBLX0JBODBfQVRUUjoKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX2F0dHIgICAgICAgVHJhbnNtaXQgQkE4MDogQXR0clxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX0NfS0VZOgorICAgICAgICBwcmludGYoIlxcS2JhODBfY19rZXkgICAgICBUcmFuc21pdCBCQTgwOiBDXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfQ0xFQVI6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9jbGVhciAgICAgIFRyYW5zbWl0IEJBODA6IENsZWFyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfQ01EOgorICAgICAgICBwcmludGYoIlxcS2JhODBfY21kICAgICAgICBUcmFuc21pdCBCQTgwOiBDbWRcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9DT1BZOgorICAgICAgICBwcmludGYoIlxcS2JhODBfY29weSAgICAgICBUcmFuc21pdCBCQTgwOiBDb3B5XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfREVMOgorICAgICAgICBwcmludGYoIlxcS2JhODBfZGVsICAgICAgICBUcmFuc21pdCBCQTgwOiBEZWxldGVcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9ERUxfQjoKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX2RlbF9iICAgICAgVHJhbnNtaXQgQkE4MDogRGVsZXRlIEJcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9ETzoKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX2RvICAgICAgICAgVHJhbnNtaXQgQkE4MDogRG9cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9FTkQ6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9lbmQgICAgICAgIFRyYW5zbWl0IEJBODA6IEVuZFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX0VOVjoKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX2VudiAgICAgICAgVHJhbnNtaXQgQkE4MDogRW52XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfRU9QOgorICAgICAgICBwcmludGYoIlxcS2JhODBfZW9wICAgICAgICBUcmFuc21pdCBCQTgwOiBFT1BcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9FUkFTRToKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX2VyYXNlICAgICAgVHJhbnNtaXQgQkE4MDogRXJhc2VcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9GTVQ6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9mbXQgICAgICAgIFRyYW5zbWl0IEJBODA6IEZvcm1hdFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX0hFTFA6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9oZWxwICAgICAgIFRyYW5zbWl0IEJBODA6IEhlbHBcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9IT01FOgorICAgICAgICBwcmludGYoIlxcS2JhODBfaG9tZSAgICAgICBUcmFuc21pdCBCQTgwOiBIb21lXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfSU5TOgorICAgICAgICBwcmludGYoIlxcS2JhODBfaW5zICAgICAgICBUcmFuc21pdCBCQTgwOiBJbnNlcnRcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9JTlNfQjoKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX2luc19iICAgICAgVHJhbnNtaXQgQkE4MDogSW5zZXJ0IEJcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9NQVJLOgorICAgICAgICBwcmludGYoIlxcS2JhODBfbWFyayAgICAgICBUcmFuc21pdCBCQTgwOiBNYXJrXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfTU9WRToKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX21vdmUgICAgICAgVHJhbnNtaXQgQkE4MDogTW92ZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMDE6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTAxICAgICAgIFRyYW5zbWl0IEJBODA6IFBBMVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMDI6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTAyICAgICAgIFRyYW5zbWl0IEJBODA6IFBBMlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMDM6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTAzICAgICAgIFRyYW5zbWl0IEJBODA6IFBBM1xuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMDQ6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTA0ICAgICAgIFRyYW5zbWl0IEJBODA6IFBBNFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMDU6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTA1ICAgICAgIFRyYW5zbWl0IEJBODA6IFBBNVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMDY6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTA2ICAgICAgIFRyYW5zbWl0IEJBODA6IFBBNlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMDc6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTA3ICAgICAgIFRyYW5zbWl0IEJBODA6IFBBN1xuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMDg6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTA4ICAgICAgIFRyYW5zbWl0IEJBODA6IFBBOFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMDk6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTA5ICAgICAgIFRyYW5zbWl0IEJBODA6IFBBOVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMTA6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTEwICAgICAgIFRyYW5zbWl0IEJBODA6IFBBMTBcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9QQTExOgorICAgICAgICBwcmludGYoIlxcS2JhODBfcGExMSAgICAgICBUcmFuc21pdCBCQTgwOiBQQTExXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfUEExMjoKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX3BhMTIgICAgICAgVHJhbnNtaXQgQkE4MDogUEExMlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMTM6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTEzICAgICAgIFRyYW5zbWl0IEJBODA6IFBBMTNcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9QQTE0OgorICAgICAgICBwcmludGYoIlxcS2JhODBfcGExNCAgICAgICBUcmFuc21pdCBCQTgwOiBQQTE0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfUEExNToKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX3BhMTUgICAgICAgVHJhbnNtaXQgQkE4MDogUEExNVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMTY6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTE2ICAgICAgIFRyYW5zbWl0IEJBODA6IFBBMTZcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9QQTE3OgorICAgICAgICBwcmludGYoIlxcS2JhODBfcGExNyAgICAgICBUcmFuc21pdCBCQTgwOiBQQTE3XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfUEExODoKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX3BhMTggICAgICAgVHJhbnNtaXQgQkE4MDogUEExOFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMTk6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTE5ICAgICAgIFRyYW5zbWl0IEJBODA6IFBBMTlcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9QQTIwOgorICAgICAgICBwcmludGYoIlxcS2JhODBfcGEyMCAgICAgICBUcmFuc21pdCBCQTgwOiBQQTIwXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfUEEyMToKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX3BhMjEgICAgICAgVHJhbnNtaXQgQkE4MDogUEEyMVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BBMjI6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wYTIyICAgICAgIFRyYW5zbWl0IEJBODA6IFBBMjJcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9QQTIzOgorICAgICAgICBwcmludGYoIlxcS2JhODBfcGEyMyAgICAgICBUcmFuc21pdCBCQTgwOiBQQTIzXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfUEEyNDoKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX3BhMjQgICAgICAgVHJhbnNtaXQgQkE4MDogUEEyNFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BHRE46CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wZ2RuICAgICAgIFRyYW5zbWl0IEJBODA6IFBhZ2UgRG93blxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1BHVVA6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wZ3VwICAgICAgIFRyYW5zbWl0IEJBODA6IFBhZ2UgVXBcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9QSUNLOgorICAgICAgICBwcmludGYoIlxcS2JhODBfcGljayAgICAgICBUcmFuc21pdCBCQTgwOiBQaWNrXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfUFJJTlQ6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9wcmludCAgICAgIFRyYW5zbWl0IEJBODA6IFByaW50XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfUFVUOgorICAgICAgICBwcmludGYoIlxcS2JhODBfcHV0ICAgICAgICBUcmFuc21pdCBCQTgwOiBQdXRcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9SRUZSRVNIOgorICAgICAgICBwcmludGYoIlxcS2JhODBfcmVmcmVzaCAgICBUcmFuc21pdCBCQTgwOiBSZWZyZXNoIFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1JFU0VUOgorICAgICAgICBwcmludGYoIlxcS2JhODBfcmVzZXQgICAgICBUcmFuc21pdCBCQTgwOiBSZXNldFxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1JVQk9VVDoKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX3J1Ym91dCAgICAgVHJhbnNtaXQgQkE4MDogUnVib3V0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfU0FWRToKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX3NhdmUgICAgICAgVHJhbnNtaXQgQkE4MDogU2F2ZVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1NPRlRLRVkxOgorICAgICAgICBwcmludGYoIlxcS2JhODBfc29mdGtleTEgICBUcmFuc21pdCBCQTgwOiBTb2Z0a2V5IDFcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9TT0ZUS0VZMjoKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX3NvZnRrZXkyICAgVHJhbnNtaXQgQkE4MDogU29mdGtleSAyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfU09GVEtFWTM6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9zb2Z0a2V5MyAgIFRyYW5zbWl0IEJBODA6IFNvZnRrZXkgM1xuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1NPRlRLRVk0OgorICAgICAgICBwcmludGYoIlxcS2JhODBfc29mdGtleTQgICBUcmFuc21pdCBCQTgwOiBTb2Z0a2V5IDRcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9TT0ZUS0VZNToKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX3NvZnRrZXk1ICAgVHJhbnNtaXQgQkE4MDogU29mdGtleSA1XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfU09GVEtFWTY6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9zb2Z0a2V5NiAgIFRyYW5zbWl0IEJBODA6IFNvZnRrZXkgNlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1NPRlRLRVk3OgorICAgICAgICBwcmludGYoIlxcS2JhODBfc29mdGtleTcgICBUcmFuc21pdCBCQTgwOiBTb2Z0a2V5IDdcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtfQkE4MF9TT0ZUS0VZODoKKyAgICAgICAgcHJpbnRmKCJcXEtiYTgwX3NvZnRrZXk4ICAgVHJhbnNtaXQgQkE4MDogU29mdGtleSA4XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLX0JBODBfU09GVEtFWTk6CisgICAgICAgIHByaW50ZigiXFxLYmE4MF9zb2Z0a2V5OSAgIFRyYW5zbWl0IEJBODA6IFNvZnRrZXkgOVxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS19CQTgwX1VORE86CisgICAgICAgIHByaW50ZigiXFxLYmE4MF91bmRvICAgICAgIFRyYW5zbWl0IEJBODA6IFVuZG9cbiIpOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICBLX0kzMV9GMDE6CisgICAgICAgIHByaW50ZigiXFxLaTMxX2YwMSAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMVxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgIEtfSTMxX0YwMjogICAgICAgICAKKyAgICAgICAgcHJpbnRmKCJcXEtpMzFfZjAyICAgICAgICAgVHJhbnNtaXQgSUJNIDMxeHg6IEYyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfRjAzOiAgICAgICAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9mMDMgICAgICAgICBUcmFuc21pdCBJQk0gMzF4eDogRjNcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMDQ6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YwNCAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGNFxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgIEtfSTMxX0YwNTogICAgICAgICAKKyAgICAgICAgcHJpbnRmKCJcXEtpMzFfZjA1ICAgICAgICAgVHJhbnNtaXQgSUJNIDMxeHg6IEY1XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfRjA2OiAgICAgICAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9mMDYgICAgICAgICBUcmFuc21pdCBJQk0gMzF4eDogRjZcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMDc6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YwNyAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGN1xuIik7CisgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgIEtfSTMxX0YwODogICAgICAgICAKKyAgICAgICAgcHJpbnRmKCJcXEtpMzFfZjA4ICAgICAgICAgVHJhbnNtaXQgSUJNIDMxeHg6IEY4XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfRjA5OiAgICAgICAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9mMDkgICAgICAgICBUcmFuc21pdCBJQk0gMzF4eDogRjlcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMTA6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YxMCAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMTBcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMTE6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YxMSAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMTFcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMTI6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YxMiAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMTJcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMTM6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YxMyAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMTNcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMTQ6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YxNCAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMTRcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMTU6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YxNSAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMTVcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMTY6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YxNiAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMTZcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMTc6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YxNyAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMTdcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMTg6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YxOCAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMThcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMTk6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YxOSAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMTlcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMjA6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YyMCAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMjBcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMjE6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YyMSAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMjFcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMjI6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YyMiAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMjJcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMjM6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YyMyAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMjNcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMjQ6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YyNCAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMjRcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMjU6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YyNSAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMjVcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMjY6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YyNiAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMjZcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMjc6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YyNyAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMjdcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMjg6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YyOCAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMjhcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMjk6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YyOSAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMjlcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMzA6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YzMCAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMzBcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMzE6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YzMSAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMzFcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMzI6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YzMiAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMzJcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMzM6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YzMyAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMzNcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMzQ6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YzNCAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMzRcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMzU6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YzNSAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMzVcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9GMzY6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2YzNiAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBGMzZcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9QQTE6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX3BhMSAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBQQTFcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9QQTI6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX3BhMiAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBQQTJcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9QQTM6ICAgICAgICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX3BhMyAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBQQTNcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9SRVNFVDoKKyAgICAgICAgcHJpbnRmKCJcXEtpMzFfcmVzZXQgICAgICAgVHJhbnNtaXQgSUJNIDMxeHg6IFJlc2V0XG4iKTsKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgY2FzZSAgS19JMzFfSlVNUDogICAgICAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9qdW1wICAgICAgICBUcmFuc21pdCBJQk0gMzF4eDogSnVtcFxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgIEtfSTMxX0NMRUFSOiAgICAgICAKKyAgICAgICAgcHJpbnRmKCJcXEtpMzFfY2xlYXIgICAgICAgVHJhbnNtaXQgSUJNIDMxeHg6IENsZWFyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfRVJBU0VfRU9GOiAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9lcmFzZV9lb2YgICBUcmFuc21pdCBJQk0gMzF4eDogRXJhc2UgdG8gRW5kIG9mIEZpZWxkXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfRVJBU0VfRU9QOiAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9lb3AgICAgICAgICBUcmFuc21pdCBJQk0gMzF4eDogRXJhc2UgdG8gRW5kIG9mIFBhZ2VcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9FUkFTRV9JTlA6ICAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX2lucCAgICAgICAgIFRyYW5zbWl0IElCTSAzMXh4OiBFcmFzZSBJbnB1dCBPcGVyYXRpb25cbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9JTlNFUlRfQ0hBUjogCisgICAgICAgIHByaW50ZigiXFxLaTMxX2luc19jaGFyICAgIFRyYW5zbWl0IElCTSAzMXh4OiBJbnNlcnQgQ2hhcmFjdGVyXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfSU5TRVJUX1NQQUNFOgorICAgICAgICBwcmludGYoIlxcS2kzMV9pbnNfc3BhY2UgICBUcmFuc21pdCBJQk0gMzF4eDogSW5zZXJ0IFNwYWNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfREVMRVRFOiAgICAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9kZWxldGUgICAgICBUcmFuc21pdCBJQk0gMzF4eDogRGVsZXRlIENoYXJhY3RlclxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgIEtfSTMxX0lOU19MTjogICAgICAKKyAgICAgICAgcHJpbnRmKCJcXEtpMzFfaW5zX2xpbmUgICAgVHJhbnNtaXQgSUJNIDMxeHg6IEluc2VydCBMaW5lXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfREVMX0xOOiAgICAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9kZWxfbG4gICAgICBUcmFuc21pdCBJQk0gMzF4eDogRGVsZXRlIExpbmVcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX0kzMV9QUklOVF9MSU5FOiAgCisgICAgICAgIHByaW50ZigiXFxLaTMxX3BydF9saW5lICAgIFRyYW5zbWl0IElCTSAzMXh4OiBQcmludCBMaW5lXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfUFJJTlRfTVNHOiAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9wcnRfbXNnICAgICBUcmFuc21pdCBJQk0gMzF4eDogUHJpbnQgTWVzc2FnZVxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgIEtfSTMxX1BSSU5UX1NISUZUOiAKKyAgICAgICAgcHJpbnRmKCJcXEtpMzFfcHJ0X3NoaWZ0ICAgVHJhbnNtaXQgSUJNIDMxeHg6IFByaW50IFNoaWZ0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfQ0FOQ0VMOiAgICAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9jYW5jZWwgICAgICBUcmFuc21pdCBJQk0gMzF4eDogQ2FuY2VsXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfU0VORF9MSU5FOiAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9zZW5kX2xpbmUgICBUcmFuc21pdCBJQk0gMzF4eDogU2VuZCBMaW5lXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfU0VORF9NU0c6ICAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9zZW5kX21zZyAgICBUcmFuc21pdCBJQk0gMzF4eDogU2VuZCBNZXNzYWdlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfU0VORF9QQUdFOiAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9zZW5kX3BhZ2UgICBUcmFuc21pdCBJQk0gMzF4eDogU2VuZCBQYWdlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19JMzFfSE9NRTogICAgICAgIAorICAgICAgICBwcmludGYoIlxcS2kzMV9ob21lICAgICAgICBUcmFuc21pdCBJQk0gMzF4eDogSG9tZVxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgIEtfSTMxX0JBQ0tfVEFCOiAgICAKKyAgICAgICAgcHJpbnRmKCJcXEtpMzFfYmFja190YWIgICAgVHJhbnNtaXQgSUJNIDMxeHg6IEJhY2sgVGFiXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19TVU5fU1RPUDogCisgICAgICAgIHByaW50ZigiXFxLc3Vuc3RvcCAgICAgICAgIFRyYW5zbWl0IFNVTiBDb25zb2xlOiBTdG9wXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19TVU5fQUdBSU46CisgICAgICAgIHByaW50ZigiXFxLc3VuYWdhaW4gICAgICAgIFRyYW5zbWl0IFNVTiBDb25zb2xlOiBBZ2FpblxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgIEtfU1VOX1BST1BTOgorICAgICAgICBwcmludGYoIlxcS3N1bnByb3BzICAgICAgICBUcmFuc21pdCBTVU4gQ29uc29sZTogUHJvcHNcbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX1NVTl9VTkRPOiAKKyAgICAgICAgcHJpbnRmKCJcXEtzdW51bmRvICAgICAgICAgVHJhbnNtaXQgU1VOIENvbnNvbGU6IFVuZG9cbiIpOworICAgICAgICBicmVhazsKKyAgICAgICBjYXNlICBLX1NVTl9GUk9OVDoKKyAgICAgICAgcHJpbnRmKCJcXEtzdW5mcm9udCAgICAgICAgVHJhbnNtaXQgU1VOIENvbnNvbGU6IEZyb250XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19TVU5fQ09QWTogCisgICAgICAgIHByaW50ZigiXFxLc3VuY29weSAgICAgICAgIFRyYW5zbWl0IFNVTiBDb25zb2xlOiBDb3B5XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19TVU5fT1BFTjogCisgICAgICAgIHByaW50ZigiXFxLc3Vub3BlbiAgICAgICAgIFRyYW5zbWl0IFNVTiBDb25zb2xlOiBPcGVuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19TVU5fUEFTVEU6CisgICAgICAgIHByaW50ZigiXFxLc3VucGFzdGUgICAgICAgIFRyYW5zbWl0IFNVTiBDb25zb2xlOiBQYXN0ZVxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgIEtfU1VOX0ZJTkQ6IAorICAgICAgICBwcmludGYoIlxcS3N1bmZpbmQgICAgICAgICBUcmFuc21pdCBTVU4gQ29uc29sZTogRmluZFxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgIEtfU1VOX0NVVDogIAorICAgICAgICBwcmludGYoIlxcS3N1bmN1dCAgICAgICAgICBUcmFuc21pdCBTVU4gQ29uc29sZTogQ3V0XG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAgS19TVU5fSEVMUDogCisgICAgICAgIHByaW50ZigiXFxLc3VuaGVscCAgICAgICAgIFRyYW5zbWl0IFNVTiBDb25zb2xlOiBIZWxwXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICBkZWZhdWx0OgorICAgICAgICBwcmludGYoIk5vIGFkZGl0aW9uYWwgaGVscCBhdmFpbGFibGUgZm9yIHRoaXMga3ZlcmJcbiIpOworICB9CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgLyogVGhpcyBpcyBub3QgdGhlIHByb3BlciB3YXkgdG8gZG8gaXQgc2luY2UgaXQgZG9lc24ndCBzaG93ICAqLworICAgIC8qIGFsbCBlbXVsYXRpb25zLCBub3IgZG9lcyBpdCBzaG93IHRoZSBzcGVjaWFsIG1vZGVzLCBidXQgaXQgKi8KKyAgICAvKiBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBwcmludGYoIkN1cnJlbnQgYmluZGluZ3M6XG4iKTsKKyAgICBmb3VuZCA9IDA7CisgICAgZm9yIChpID0gMjU2OyBpIDwgS01TSVpFIDsgaSsrKSB7CisgICAgICAgIGNvbl9ldmVudCBldnQgPSBtYXBrZXkoaSk7CisgICAgICAgIGlmIChldnQudHlwZSAhPSBrdmVyYikKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKChldnQua3ZlcmIuaWQgJiB+Rl9LVkVSQikgPT0geHgpIHsKKyAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgIHByaW50ZigiICBcXCUtNGQgLSAlc1xuIixpLGtleW5hbWUoaSkpOworICAgICAgICB9CisgICAgfQorI2lmZGVmIE9TMk1PVVNFCisgICAgZm9yICggYnV0dG9uID0gMCA7IGJ1dHRvbiA8IE1NQlVUVE9OTUFYIDsgYnV0dG9uKysgKQorICAgICAgZm9yICggZXZlbnQgPSAwIDsgZXZlbnQgPCBNTUVWRU5UU0laRSA7IGV2ZW50KysgKQorICAgICAgICBpZiAoIG1vdXNlbWFwW2J1dHRvbl1bZXZlbnRdLnR5cGUgPT0ga3ZlcmIgKSB7CisgICAgICAgICAgICBpZiAoIChtb3VzZW1hcFtidXR0b25dW2V2ZW50XS5rdmVyYi5pZCAmIH5GX0tWRVJCKSA9PSB4eCApIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgIE1vdXNlIC0gJXNcbiIsbW91c2VuYW1lKGJ1dHRvbixldmVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogT1MyTU9VU0UgKi8KKworICAgIGlmICggIWZvdW5kICkgeworICAgICAgICBwcmludGYoIiAgKG5vbmUpXG4iKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIE5PS1ZFUkJTICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgTk9YRkVSCisvKiAgRCBPIEggUiBNIFQgIC0tICBHaXZlIGhlbHAgYWJvdXQgUkVNT1RFIGNvbW1hbmQgICovCisKK3N0YXRpYyBjaGFyICpocnNldFtdID0geworIlN5bnRheDogIFJFTU9URSBTRVQgcGFyYW1ldGVyIHZhbHVlIiwKKyJFeGFtcGxlOiBSRU1PVEUgU0VUIEZJTEUgVFlQRSBCSU5BUlkiLAorIiAgQXNrcyB0aGUgS2VybWl0IHNlcnZlciB0byBzZXQgdGhlIG5hbWVkIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gdmFsdWUuIiwKKyIgIEVxdWl2YWxlbnQgdG8gdHlwaW5nIHRoZSBjb3JyZXNwb25kaW5nIFNFVCBjb21tYW5kIGRpcmVjdGx5IHRvIHRoZSBvdGhlciIsCisiICBLZXJtaXQgaWYgaXQgd2VyZSBpbiBpbnRlcmFjdGl2ZSBtb2RlLiIsICIiIH07CisKK2ludAorZG9ocm10KHh4KSBpbnQgeHg7IHsKKyAgICBpbnQgeDsKKyAgICBpZiAoeHggPT0gLTMpIHJldHVybihobXNnYShobWhybXQpKTsKKyAgICBpZiAoeHggPCAwKSByZXR1cm4oeHgpOworICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgIHN3aXRjaCAoeHgpIHsKKworY2FzZSBYWkNQWToKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBSRU1PVEUgQ09QWSBzb3VyY2UgZGVzdGluYXRpb25cblwKKyAgQXNrcyB0aGUgS2VybWl0IHNlcnZlciB0byBjb3B5IHRoZSBzb3VyY2UgZmlsZSB0byBkZXN0aW5hdGlvbi5cblwKKyAgU3lub255bTogUkNPUFkuIikpOworCitjYXNlIFhaQ1dEOgorI2lmZGVmIE5FV0ZUUAorICAgIHJldHVybihobXNnKCJTeW50YXg6IFJFTU9URSBDRCBbIG5hbWUgXVxuXAorICBBc2tzIHRoZSBLZXJtaXQgb3IgRlRQIHNlcnZlciB0byBjaGFuZ2UgaXRzIHdvcmtpbmcgZGlyZWN0b3J5IG9yIGRldmljZS5cblwKKyAgSWYgdGhlIGRldmljZSBvciBkaXJlY3RvcnkgbmFtZSBpcyBvbWl0dGVkLCByZXN0b3JlIHRoZSBkZWZhdWx0LlxuXAorICBTeW5vbnltOiBSQ0QuIikpOworI2Vsc2UKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBSRU1PVEUgQ0QgWyBuYW1lIF1cblwKKyAgQXNrcyB0aGUgS2VybWl0IHNlcnZlciB0byBjaGFuZ2UgaXRzIHdvcmtpbmcgZGlyZWN0b3J5IG9yIGRldmljZS5cblwKKyAgSWYgdGhlIGRldmljZSBvciBkaXJlY3RvcnkgbmFtZSBpcyBvbWl0dGVkLCByZXN0b3JlIHRoZSBkZWZhdWx0LlxuXAorICBTeW5vbnltOiBSQ0QuIikpOworI2VuZGlmIC8qIE5FV0ZUUCAqLworCitjYXNlIFhaREVMOgorI2lmZGVmIE5FV0ZUUAorICAgIHJldHVybihobXNnKCJTeW50YXg6IFJFTU9URSBERUxFVEUgZmlsZXNwZWNcblwKKyAgQXNrcyB0aGUgS2VybWl0IG9yIEZUUCBzZXJ2ZXIgdG8gZGVsZXRlIHRoZSBuYW1lZCBmaWxlKHMpLlxuXAorICBTeW5vbnltOiBSREVMLiIpKTsKKyNlbHNlCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkVNT1RFIERFTEVURSBmaWxlc3BlY1xuXAorICBBc2tzIHRoZSBLZXJtaXQgc2VydmVyIHRvIGRlbGV0ZSB0aGUgbmFtZWQgZmlsZShzKS5cblwKKyAgU3lub255bTogUkRFTC4iKSk7CisjZW5kaWYgLyogTkVXRlRQICovCisKK2Nhc2UgWFpNS0Q6CisjaWZkZWYgTkVXRlRQCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkVNT1RFIE1LRElSIGRpcmVjdG9yeS1uYW1lXG5cCisgIEFza3MgdGhlIEtlcm1pdCBvciBGVFAgc2VydmVyIHRvIGNyZWF0ZSB0aGUgbmFtZWQgZGlyZWN0b3J5LlxuXAorICBTeW5vbnltOiBSTUtESVIuIikpOworI2Vsc2UKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBSRU1PVEUgTUtESVIgZGlyZWN0b3J5LW5hbWVcblwKKyAgQXNrcyB0aGUgS2VybWl0IHNlcnZlciB0byBjcmVhdGUgdGhlIG5hbWVkIGRpcmVjdG9yeS5cblwKKyAgU3lub255bTogUk1LRElSLiIpKTsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKworY2FzZSBYWlJNRDoKKyNpZmRlZiBORVdGVFAKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBSRU1PVEUgUk1ESVIgZGlyZWN0b3J5LW5hbWVcblwKKyAgQXNrcyB0aGUgS2VybWl0IG9yIEZUUCBzZXJ2ZXIgdG8gcmVtb3ZlIHRoZSBuYW1lZCBkaXJlY3RvcnkuXG5cCisgIFN5bm9ueW06IFJSTURJUi4iKSk7CisjZWxzZQorICAgIHJldHVybihobXNnKCJTeW50YXg6IFJFTU9URSBSTURJUiBkaXJlY3RvcnktbmFtZVxuXAorICBBc2tzIHRoZSBLZXJtaXQgc2VydmVyIHRvIHJlbW92ZSB0aGUgbmFtZWQgZGlyZWN0b3J5LlxuXAorICBTeW5vbnltOiBSUk1ESVIuIikpOworI2VuZGlmIC8qIE5FV0ZUUCAqLworCitjYXNlIFhaRElSOgorI2lmZGVmIE5FV0ZUUAorICAgIHJldHVybihobXNnKCJTeW50YXg6IFJFTU9URSBESVJFQ1RPUlkgWyBmaWxlc3BlYyBdXG5cCisgIEFza3MgdGhlIEtlcm1pdCBvciBGVFAgc2VydmVyIHRvIHByb3ZpZGUgYSBkaXJlY3RvcnkgbGlzdGluZyBvZiB0aGUgbmFtZWRcblwKKyAgZmlsZShzKSBvciBpZiBubyBmaWxlIHNwZWNpZmljYXRpb24gaXMgZ2l2ZW4sIG9mIGFsbCBmaWxlcyBpbiBpdHMgY3VycmVudFxuXAorICBkaXJlY3RvcnkuICBTeW5vbnltOiBSRElSLiIpKTsKKyNlbHNlCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkVNT1RFIERJUkVDVE9SWSBbIGZpbGVzcGVjIF1cblwKKyAgQXNrcyB0aGUgS2VybWl0IHNlcnZlciB0byBwcm92aWRlIGEgZGlyZWN0b3J5IGxpc3Rpbmcgb2YgdGhlIG5hbWVkXG5cCisgIGZpbGUocykgb3IgaWYgbm8gZmlsZSBzcGVjaWZpY2F0aW9uIGlzIGdpdmVuLCBvZiBhbGwgZmlsZXMgaW4gaXRzIGN1cnJlbnRcblwKKyAgZGlyZWN0b3J5LiAgU3lub255bTogUkRJUi4iKSk7CisjZW5kaWYgLyogTkVXRlRQICovCisKK2Nhc2UgWFpITFA6CisjaWZkZWYgTkVXRlRQCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkVNT1RFIEhFTFBcblwKKyAgQXNrcyB0aGUgS2VybWl0IG9yIEZUUCBzZXJ2ZXIgdG8gbGlzdCB0aGUgc2VydmljZXMgaXQgcHJvdmlkZXMuXG5cCisgIFN5bm9ueW06IFJIRUxQLiIpKTsKKyNlbHNlCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkVNT1RFIEhFTFBcblwKKyAgQXNrcyB0aGUgS2VybWl0IHNlcnZlciB0byBsaXN0IHRoZSBzZXJ2aWNlcyBpdCBwcm92aWRlcy5cblwKKyAgU3lub255bTogUkhFTFAuIikpOworI2VuZGlmIC8qIE5FV0ZUUCAqLworCitjYXNlIFhaSE9TOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFJFTU9URSBIT1NUIGNvbW1hbmRcblwKKyAgU2VuZHMgYSBjb21tYW5kIHRvIHRoZSBvdGhlciBjb21wdXRlciBpbiBpdHMgb3duIGNvbW1hbmQgbGFuZ3VhZ2VcblwKKyAgdGhyb3VnaCB0aGUgS2VybWl0IHNlcnZlciB0aGF0IGlzIHJ1bm5pbmcgb24gdGhhdCBob3N0LiAgU3lub255bTogUkhPU1QuIikpOworCisjaWZuZGVmIE5PRlJJTExTCitjYXNlIFhaS0VSOgorICAgIHJldHVybihobXNnKCJTeW50YXg6IFJFTU9URSBLRVJNSVQgY29tbWFuZFxuXAorICBTZW5kcyBhIGNvbW1hbmQgdG8gdGhlIHJlbW90ZSBLZXJtaXQgc2VydmVyIGluIGl0cyBvd24gY29tbWFuZCBsYW5ndWFnZS5cblwKKyAgU3lub255bTogUktFUk1JVC4iKSk7CisKK2Nhc2UgWFpMR0k6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkVNT1RFIExPR0lOIHVzZXIgcGFzc3dvcmQgWyBhY2NvdW50IF1cblwKKyAgTG9ncyBpbiB0byBhIHJlbW90ZSBLZXJtaXQgc2VydmVyIHRoYXQgcmVxdWlyZXMgeW91IGxvZ2luLiAgTm90ZTogUkxPR0lOXG5cCisgIGlzIE5PVCBhIHN5bm9ueW0gZm9yIFJFTU9URSBMT0dJTi4iKSk7CisKK2Nhc2UgWFpMR086CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkVNT1RFIExPR09VVFxuXAorICBMb2dzIG91dCBmcm9tIGEgcmVtb3RlIEtlcm1pdCBzZXJ2ZXIgdG8gd2hpY2ggeW91IGhhdmUgcHJldmlvdXNseSBsb2dnZWQgaW4uIgorKSk7CisKK2Nhc2UgWFpQUkk6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkVNT1RFIFBSSU5UIGZpbGVzcGVjIFsgb3B0aW9ucyBdXG5cCisgIFNlbmRzIHRoZSBzcGVjaWZpZWQgZmlsZShzKSB0byB0aGUgcmVtb3RlIEtlcm1pdCBhbmQgYXNrIGl0IHRvIGhhdmUgdGhlXG5cCisgIGZpbGUgcHJpbnRlZCBvbiB0aGUgcmVtb3RlIHN5c3RlbSdzIHByaW50ZXIsIHVzaW5nIGFueSBzcGVjaWZpZWQgb3B0aW9ucy5cblwKKyAgU3lub255bTogUlBSSU5ULiIpKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCitjYXNlIFhaUkVOOgorI2lmZGVmIE5FV0ZUUAorICAgIHJldHVybihobXNnKCJTeW50YXg6IFJFTU9URSBSRU5BTUUgZmlsZXNwZWMgbmV3bmFtZVxuXAorICBBc2tzIHRoZSBLZXJtaXQgb3IgRlRQIHNlcnZlciB0byByZW5hbWUgdGhlIGZpbGUuICBTeW5vbnltOiBSUkVOQU1FLiIpKTsKKyNlbHNlCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkVNT1RFIFJFTkFNRSBmaWxlc3BlYyBuZXduYW1lXG5cCisgIEFza3MgdGhlIEtlcm1pdCBzZXJ2ZXIgdG8gcmVuYW1lIHRoZSBmaWxlLiAgU3lub255bTogUlJFTkFNRS4iKSk7CisjZW5kaWYgLyogTkVXRlRQICovCisKK2Nhc2UgWFpTRVQ6CisgICAgcmV0dXJuKGhtc2dhKGhyc2V0KSk7CisKK2Nhc2UgWFpTUEE6CisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkVNT1RFIFNQQUNFIFsgbmFtZSBdXG5cCisgIEFza3MgdGhlIEtlcm1pdCBzZXJ2ZXIgdG8gdGVsbCB5b3UgYWJvdXQgaXRzIGRpc2sgc3BhY2Ugb24gdGhlIGN1cnJlbnRcblwKKyAgZGlzayBvciBkaXJlY3RvcnksIG9yIGluIHRoZSBvbmUgdGhhdCB5b3UgbmFtZS4gIFN5bm9ueW06IFJTUEFDRS4iKSk7CisKKyNpZm5kZWYgTk9GUklMTFMKK2Nhc2UgWFpUWVA6CisjaWZkZWYgTkVXRlRQCisgICAgcmV0dXJuKGhtc2coIlN5bnRheDogUkVNT1RFIFRZUEUgZmlsZVxuXAorICBBc2tzIHRoZSBLZXJtaXQgb3IgRlRQIHNlcnZlciB0byBzZW5kIHRoZSBuYW1lZCBmaWxlIHRvIHlvdXIgc2NyZWVuLlxuXAorICBTeW5vbnltOiBSVFlQRS4iKSk7CisjZWxzZQorICAgIHJldHVybihobXNnKCJTeW50YXg6IFJFTU9URSBUWVBFIGZpbGVcblwKKyAgQXNrcyB0aGUgS2VybWl0IHNlcnZlciB0byBzZW5kIHRoZSBuYW1lZCBmaWxlKHMpIHRvIHlvdXIgc2NyZWVuLlxuXAorICBTeW5vbnltOiBSVFlQRS4iKSk7CisjZW5kaWYgLyogTkVXRlRQICovCisKKworY2FzZSBYWldITzoKKyAgICByZXR1cm4oaG1zZygiU3ludGF4OiBSRU1PVEUgV0hPIFsgbmFtZSBdXG5cCisgIEFza3MgdGhlIEtlcm1pdCBzZXJ2ZXIgdG8gbGlzdCB3aG8ncyBsb2dnZWQgaW4sIG9yIHRvIGdpdmUgaW5mb3JtYXRpb25cblwKKyAgYWJvdXQgdGhlIG5hbWVkIHVzZXIuICBTeW5vbnltOiBSV0hPLiIpKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisjaWZuZGVmIE5PU1BMCitjYXNlIFhaUVVFOgorICAgIHJldHVybihobXNnKAorIlN5bnRheDogWyBSRU1PVEUgXSBRVUVSWSB7IEtFUk1JVCwgU1lTVEVNLCBVU0VSIH0gdmFyaWFibGUtbmFtZVxuXAorICBBc2tzIHRoZSBLZXJtaXQgc2VydmVyIHRvIHNlbmQgdGhlIHZhbHVlIG9mIHRoZSBuYW1lZCB2YXJpYWJsZSBvZiB0aGVcblwKKyAgZ2l2ZW4gdHlwZSwgYW5kIG1ha2UgaXQgYXZhaWxhYmxlIGluIHRoZSBcXHYocXVlcnkpIHZhcmlhYmxlLiAgV2hlbiB0aGVcblwKKyAgdHlwZSBpcyBLRVJNSVQgZnVuY3Rpb25zIG1heSBhbHNvIGJlIHNwZWNpZmllZCBhcyBpZiB0aGV5IHdlcmUgdmFyaWFibGVzLiIpKTsKKworY2FzZSBYWkFTRzoKKyAgICByZXR1cm4oaG1zZygKKyJTeW50YXg6IFJFTU9URSBBU1NJR04gdmFyaWFibGUtbmFtZSBbIHZhbHVlIF1cblwKKyAgQXNzaWducyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIG5hbWVkIGdsb2JhbCB2YXJpYWJsZSBvbiB0aGUgc2VydmVyLlxuXAorICBTeW5vbnltczogUkFTRywgUkFTU0lHTi4iKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworY2FzZSBYWlBXRDoKKyAgICByZXR1cm4oaG1zZygKKyNpZmRlZiBORVdGVFAKKyJTeW50YXg6IFJFTU9URSBQV0RcblwKKyAgQXNrcyB0aGUgS2VybWl0IHNlcnZlciB0byBkaXNwbGF5IGl0cyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuXAorICBTeW5vbnltOiBSUFdELiIpKTsKKyNlbHNlCisiU3ludGF4OiBSRU1PVEUgUFdEXG5cCisgIEFza3MgdGhlIEtlcm1pdCBvciBGVFAgc2VydmVyIHRvIGRpc3BsYXkgaXRzIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG5cCisgIFN5bm9ueW06IFJQV0QuIikpOworI2VuZGlmIC8qIE5FV0ZUUCAqLworCitjYXNlIFhaWElUOgorI2lmZGVmIE5FV0ZUUAorICAgIHJldHVybihobXNnKCJTeW50YXg6IFJFTU9URSBFWElUXG5cCisgICBBc2tzIHRoZSBLZXJtaXQgc2VydmVyIHRvIGV4aXQgKHdpdGhvdXQgZGlzY29ubmVjdGluZyksIG9yIGNsb3NlcyBhbiBGVFBcblwKKyAgIGNvbm5lY3Rpb24uICBTeW5vbnltOiBSRVhJVCwgYW5kIChmb3IgRlRQIG9ubHkpIEJZRSwgRlRQIEJZRS4iKSk7CisjZWxzZQorICAgIHJldHVybihobXNnKCJTeW50YXg6IFJFTU9URSBFWElUXG5cCisgIEFza3MgdGhlIEtlcm1pdCBzZXJ2ZXIgdG8gZXhpdC4gIFN5bm9ueW06IFJFWElULiIpKTsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKworZGVmYXVsdDoKKyAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICBwcmludGYoIj9Tb3JyeSwgbm8gaGVscCBhdmFpbGFibGUgLSBcIiVzXCJcbiIsY21kYnVmKTsKKyAgICByZXR1cm4oLTkpOworICAgIH0KK30KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNlbmRpZiAvKiBOT0hFTFAgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdXVzMy5jIGIvY2tlcm1pdC04LjAuMjExL2NrdXVzMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMmY4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2t1dXMzLmMKQEAgLTAsMCArMSwxMzMxMCBAQAorI2lmZGVmIFNTSFRFU1QKKyNkZWZpbmUgU1NIQlVJTFRJTgorI2VuZGlmIC8qIFNTSFRFU1QgKi8KKworI2luY2x1ZGUgImNrY3N5bS5oIiAgICAgICAgICAgICAgICAgICAgIC8qIFN5bWJvbCBkZWZpbml0aW9ucyAqLworCisvKiAgQyBLIFUgVSBTIDMgLS0gICJVc2VyIEludGVyZmFjZSIgZm9yIEMtS2VybWl0LCBwYXJ0IDMgICovCisKKy8qCisgIEF1dGhvcnM6CisgICAgRnJhbmsgZGEgQ3J1eiA8ZmRjQGNvbHVtYmlhLmVkdT4sCisgICAgICBUaGUgS2VybWl0IFByb2plY3QsIENvbHVtYmlhIFVuaXZlcnNpdHksIE5ldyBZb3JrIENpdHkKKyAgICBKZWZmcmV5IEUgQWx0bWFuIDxqYWx0bWFuQHNlY3VyZS1lbmRwb2ludHMuY29tPgorICAgICAgU2VjdXJlIEVuZHBvaW50cyBJbmMuLCBOZXcgWW9yayBDaXR5CisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisKKy8qICBTRVQgY29tbWFuZCAoYnV0IG11Y2ggbWF0ZXJpYWwgaGFzIGJlZW4gc3BsaXQgb2ZmIGludG8gY2t1dXM3LmMpLiAqLworCisvKgorICBLZXJtaXQtc3BlY2lmaWMgaW5jbHVkZXMuCisgIERlZmluaXRpb25zIGhlcmUgc3VwZXJzZWRlIHRob3NlIGZyb20gc3lzdGVtIGluY2x1ZGUgZmlsZXMuCisqLworI2luY2x1ZGUgImNrY2RlYi5oIiAgICAgICAgICAgICAgICAgICAgIC8qIERlYnVnZ2luZyAmIGNvbXBpbGVyIHRoaW5ncyAqLworI2luY2x1ZGUgImNrY2FzYy5oIiAgICAgICAgICAgICAgICAgICAgIC8qIEFTQ0lJIGNoYXJhY3RlciBzeW1ib2xzICovCisjaW5jbHVkZSAiY2tja2VyLmgiICAgICAgICAgICAgICAgICAgICAgLyogS2VybWl0IGFwcGxpY2F0aW9uIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiY2tjeGxhLmgiICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIHNldCB0cmFuc2xhdGlvbiAqLworI2luY2x1ZGUgImNrY25ldC5oIiAgICAgICAgICAgICAgICAgICAgIC8qIE5ldHdvcmsgc3ltYm9scyAqLworCitjaGFyIHB3YnVmW1BXQlVGTCsxXSAgPSB7IE5VTCwgTlVMIH07CitpbnQgcHdmbGcgPSAwOworaW50IHB3Y3J5cHQgPSAwOworCisjaWZuZGVmIE5PSUNQCisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorI2luY2x1ZGUgImNrdWF0aC5oIgorI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisjaWZkZWYgQ0tfU1NMCisjaW5jbHVkZSAiY2tfc3NsLmgiCisjZW5kaWYgLyogQ0tfU1NMICovCisjaW5jbHVkZSAiY2t1dXNyLmgiICAgICAgICAgICAgICAgICAgICAgLyogVXNlciBpbnRlcmZhY2Ugc3ltYm9scyAqLworI2lmZGVmIE9TMgorI2luY2x1ZGUgImNrY3VuaS5oIgorI2lmZGVmIFNTSEJVSUxUSU4KKyNpbmNsdWRlICJja29zc2guaCIKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisjaWZkZWYgQ0tfTkVUQklPUworI2luY2x1ZGUgPG9zMi5oPgorI2lmZGVmIENPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdvdWxkIHlvdSBiZWxpZXZlICovCisjdW5kZWYgQ09NTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPG9zMi5oPiBkZWZpbmVzIHRoaXMgPyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpbmNsdWRlICJja29uYmkuaCIKK2V4dGVybiBVQ0hBUiBOZXRCaW9zQWRhcHRlcjsKKyNlbmRpZiAvKiBDS19ORVRCSU9TICovCisjaW5jbHVkZSAiY2tvY29uLmgiCisjaW5jbHVkZSAiY2tva2V5LmgiCisjaWZuZGVmIE5PVEVSTQorZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY29sb3JjbWQ7ICAvKiBDb21tYW5kLXNjcmVlbiBjb2xvcnMgKi8KK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIHR0eWNscnRhYltdOworZXh0ZXJuIGludCBuY2xyczsKK2V4dGVybiBpbnQgdHRfY29sc1tdLCB0dF9yb3dzW10sIHR0X3N6Y2huZ1tdLCB0dF9zdGF0dXNbXTsKKyNlbmRpZiAvKiBOT1RFUk0gKi8KK19QUk9UT1RZUChpbnQgc2V0cHJ0eSwgKHZvaWQpKTsKK2V4dGVybiBjaGFyIHN0YXJ0dXBkaXJbXSwgZXhlZGlyW107CitleHRlcm4gaW50IHR0X21vZGVjaGc7CisjaWZkZWYgTlQKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8dGFwaS5oPgorI2luY2x1ZGUgImNrbnRhcC5oIiAgICAgICAgICAgICAgICAgICAgIC8qIE1pY3Jvc29mdCBUQVBJICovCisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBPUzIKK2V4dGVybiBjaGFyICogZXhlZGlyOworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgQ0tfUkVDQUxMCitleHRlcm4gaW50IGNtX3JldHJ5OworI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworCitleHRlcm4gaW50IGNtZGludDsKK2V4dGVybiBpbnQgc3J2aWRsOworCisjaWZkZWYgQ0tGTE9BVAorZXh0ZXJuIENLRkxPQVQgZmxvYXR2YWw7CQkvKiAoc2VlIGlzZmxvYXQoKSkgKi8KKyNlbmRpZiAvKiBDS0ZMT0FUICovCisKKyNpZm5kZWYgTk9QVVNICisjaWZuZGVmIE5PRlJJTExTCisjaWZkZWYgVk1TCitjaGFyIGVkaXRvcltDS01BWFBBVEggKyAxXSA9ICJlZGl0IjsKKyNlbHNlCitjaGFyIGVkaXRvcltDS01BWFBBVEggKyAxXSA9IHsgTlVMLCBOVUwgfTsKKyNlbmRpZiAvKiBWTVMgKi8KK2NoYXIgZWRpdG9wdHNbMTI4XSA9IHsgTlVMLCBOVUwgfTsKK2NoYXIgZWRpdGZpbGVbQ0tNQVhQQVRIICsgMV0gPSB7IE5VTCwgTlVMIH07CisjaWZkZWYgQlJPV1NFUgorY2hhciBicm93c2VyW0NLTUFYUEFUSCArIDFdID0geyBOVUwsIE5VTCB9OworY2hhciBicm93c29wdHNbMTI4XSA9IHsgTlVMLCBOVUwgfTsKK2NoYXIgYnJvd3N1cmxbNDA5Nl0gPSB7IE5VTCwgTlVMIH07CisjZW5kaWYgLyogQlJPV1NFUiAqLworI2VuZGlmIC8qICBOT0ZSSUxMUyAqLworI2VuZGlmIC8qIE5PUFVTSCAqLworCisvKiBWYXJpYWJsZXMgKi8KKworaW50IGNtZF9xdW90aW5nID0gMTsKK2V4dGVybiBpbnQgaGludHMsIHhjbWRzcmM7CisKKyNpZmRlZiBDS19LRVJCRVJPUworY2hhciAqIGs0cHdwcm9tcHQgPSBOVUxMOyAgICAgICAgICAgICAgIC8qIEtlcmJlcm9zIDQgcGFzc3dvcmQgcHJvbXB0ICovCitjaGFyICogazRwcnByb21wdCA9IE5VTEw7ICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgNCBwcmluY2lwYWwgcHJvbXB0ICovCitjaGFyICogazVwd3Byb21wdCA9IE5VTEw7ICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgNSBwYXNzd29yZCBwcm9tcHQgKi8KK2NoYXIgKiBrNXBycHJvbXB0ID0gTlVMTDsgICAgICAgICAgICAgICAvKiBLZXJiZXJvcyA1IHByaW5jaXBhbCBwcm9tcHQgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2lmZGVmIENLX1NSUAorY2hhciAqIHNycHB3cHJvbXB0ID0gTlVMTDsKKyNlbmRpZiAvKiBDS19TUlAgKi8KKworZXh0ZXJuIGNoYXIgKiBja3Byb21wdCwgKiBpa3Byb21wdDsgICAgIC8qIERlZmF1bHQgcHJvbXB0ICovCitleHRlcm4geHhfc3RycCB4eHN0cmluZzsKKworZXh0ZXJuIGNoYXIgKiBjZG1zZ2ZpbGVbXSwgKiBjZG1zZ3N0cjsKKworZXh0ZXJuIGludAorICBsb2NhbCwgc2VydmVyLCBzdWNjZXNzLCBkZXN0LCBzbGVlcGNhbiwgaW5zZXJ2ZXIsIGZsb3csIGF1dG9mbG93LCBiaW5hcnksCisgIHBhcml0eSwgZXNjYXBlLCB3aGF0LCB0dXJuLCBkdXBsZXgsIGJhY2tncmQsIGh3cGFyaXR5LCBzdG9wYml0cywgdHVybmNoLAorICBtZG10eXAsIG5ldHdvcmssIHF1aWV0LCBuZXR0eXBlLCBjYXJyaWVyLCBkZWJzZXMsIGRlYnRpbSwgY2R0aW1vLCBubGFuZ3MsCisgIGJnc2V0LCBwZmxhZywgbXNnZmxnLCBjbWRtc2ssIHhzdXNwZW5kLCB0ZWNobywgcGFjaW5nLCB4aXR3YXJuLCB4aXRzdGEsCisgIG91dGVzYywgY21kX2NvbHMsIGNtZF9yb3dzLCBja3hlY2gsIHhhc2ttb3JlLCBoYXZlbGluZSwgZGlkc2V0bGluLCBpc2d1ZXN0LAorICBtZG1zYXYsIGNsZWFycnEsIHNhdmVhc2s7CisKK2V4dGVybiBpbnQgcmVsaWFibGUsIHNldHJlbGlhYmxlLCBtYXRjaGRvdCwgbWF0Y2hmaWZvLCBkaXJfZG90czsKKworI2lmbmRlZiBOT1NFUlZFUgorICBleHRlcm4gaW50IGVuX3ByaTsKKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworCisjaWZkZWYgSUtTRENPTkYKK2V4dGVybiBpbnQgaWtzZGNmOworI2VuZGlmIC8qIElLU0RDT05GICovCisjaWZkZWYgVENQU09DS0VUCisgIGV4dGVybiBpbnQgdG5fZXhpdDsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNpZmRlZiBUTkNPREUKKyAgY2hhciAqIHRuX3ByX3VpZCA9IE5VTEw7CisjZW5kaWYgLyogVE5DT0RFICovCisgIGV4dGVybiBpbnQgZXhpdG9uY2xvc2U7CisKKyNpZm5kZWYgTk9LVkVSQlMKK2V4dGVybiBpbnQgbmt2ZXJiczsKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIGt2ZXJic1tdOworI2VuZGlmIC8qIE5PS1ZFUkJTICovCisKK2V4dGVybiBpbnQgdHRucHJvdG87ICAgICAgICAgICAgICAgICAgICAvKiBOZXR3b3JrIHByb3RvY29sICovCisKK2V4dGVybiBjaGFyICpjY250YWJbXTsgICAgICAgICAgICAgICAgICAvKiBOYW1lcyBvZiBjb250cm9sIGNoYXJzICovCisKKyNpZmRlZiBDS19BUEMKK2V4dGVybiBpbnQgYXBjYWN0aXZlLCBhcGNzdGF0dXM7CisjZW5kaWYgLyogQ0tfQVBDICovCisKKyNpZm5kZWYgTk9TQ1JJUFQKK2V4dGVybiBpbnQgc2VjaG87ICAgICAgICAgICAgICAgICAgICAgICAvKiBXaGV0aGVyIFNDUklQVCBjbWQgc2hvdWxkIGVjaG8gKi8KKyNlbmRpZiAvKiBOT1NDUklQVCAqLworCisjaWZkZWYgRENNREJVRgorZXh0ZXJuIGNoYXIgKmF0bWJ1ZiwgKmF0eGJ1ZjsKKyNlbHNlCitleHRlcm4gY2hhciBhdG1idWZbXSwgYXR4YnVmW107CisjZW5kaWYgLyogRENNREJVRiAqLworZXh0ZXJuIGludCBjbWZsZ3M7CisKK2V4dGVybiBjaGFyIHBzYXZlW107CitleHRlcm4gY2hhciB1aWRidWZbXTsKK2V4dGVybiBpbnQgIHNsX3VpZF9zYXZlZDsKK2ludCBEZWxldGVTdGFydHVwRmlsZSA9IDA7CisKK2V4dGVybiBpbnQgY21kbHZsOyAgICAgICAgICAgICAgICAgICAgICAvKiBPdmVyYWxsIGNvbW1hbmQgbGV2ZWwgKi8KKworI2lmbmRlZiBOT1NQTAorX1BST1RPVFlQKCBzdGF0aWMgaW50IHBhcnNkaXIsIChpbnQpICk7CitjaGFyIHBybWJ1ZltQV0JVRkwrMV0gPSB7IE5VTCwgTlVMIH07CitpbnQgZm5kaWFncyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gZGlhZ25vc3RpY3Mgb24vb2ZmICovCitpbnQgZm5lcnJvciA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gZXJyb3IgdHJlYXRtZW50ICovCisKKyNpZmRlZiBEQ01EQlVGCitleHRlcm4gaW50ICpjb3VudCwgKnRha2VyciwgKm1lcnJvciwgKmlucGNhczsKKyNlbHNlCitleHRlcm4gaW50IGNvdW50W10sIHRha2VycltdLCBtZXJyb3JbXSwgaW5wY2FzW107CisjZW5kaWYgLyogRENNREJVRiAqLworZXh0ZXJuIGludCBtZWNobzsgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIGVjaG8gKi8KK2V4dGVybiBsb25nIGNrX2FsYXJtOworZXh0ZXJuIGNoYXIgYWxybV9kYXRlW10sIGFscm1fdGltZVtdOworI2Vsc2UKK2V4dGVybiBpbnQgdGFrZXJyW107CisjZW5kaWYgLyogTk9TUEwgKi8KKworZXh0ZXJuIGludCB4X2lmbnVtOworZXh0ZXJuIGludCBiaWdzYnNpeiwgYmlncmJzaXo7ICAgICAgICAgIC8qIFBhY2tldCBidWZmZXJzICovCisKK2V4dGVybiBsb25nIHNwZWVkOyAgICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hbCBzcGVlZCAqLworCitleHRlcm4gY2hhciB0dG5hbWVbXTsgICAgICAgICAgICAgICAgICAgLyogQ29tbXVuaWNhdGlvbiBkZXZpY2UgbmFtZSAqLworZXh0ZXJuIGNoYXIgbXlob3N0W10gOworZXh0ZXJuIGNoYXIgaW5pZGlyW107ICAgICAgICAgICAgICAgICAgIC8qIEluaSBGaWxlIGRpcmVjdG9yeSAqLworCisjaWZuZGVmIE5PU0VUS0VZCitleHRlcm4gS0VZICprZXltYXA7ICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIG1hcCBmb3IgU0VUIEtFWSAoMToxKSAgKi8KK2V4dGVybiBNQUNSTyAqbWFjcm90YWI7ICAgICAgICAgICAgICAgICAvKiBNYWNybyBtYXAgZm9yIFNFVCBLRVkgKDE6c3RyaW5nKSAqLworI2VuZGlmIC8qIE5PU0VUS0VZICovCisjaWZkZWYgT1MyCitpbnQgd2lkZXJlc3VsdDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIHdpZGUgT1MvMiBzY2FuIGNvZGVzL2NtbnVtKCkgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCitleHRlcm4gaW50IHR0X3NjcnNpemVbXTsgICAgICAgICAgICAgICAgLyogU2Nyb2xsYmFjayBidWZmZXIgU2l6ZXMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKy8qIFByaW50ZXIgc2V0dGluZ3MgKi8KKworZXh0ZXJuIGNoYXIgKiBwcmludGVybmFtZTsgICAgICAgICAgICAgIC8qIE5VTEwgaWYgcHJpbnRlciBub3QgcmVkaXJlY3RlZCAqLworZXh0ZXJuIGludCBwcmludHBpcGU7CitleHRlcm4gaW50IG5vcHJpbnRlcjsKKyNpZmRlZiBQUklOVFNXSQoraW50IHByaW50dGltbyA9IDA7CitjaGFyICogcHJpbnR0ZXJtID0gTlVMTDsKK2NoYXIgKiBwcmludHNlcCA9IE5VTEw7CitpbnQgcHJpbnRlcnR5cGUgPSAwOworI2lmZGVmIEJQUklOVAoraW50IHByaW50YmlkaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBCUFJJTlRFUiAoYmlkaXJlY3Rpb25hbCkgKi8KK2xvbmcgcHBvcnRzcGVlZCA9IDBMOyAgICAgICAgICAgICAgICAgICAvKiBCaWRpcmVjdGlvbiBwcmludGVyIHBvcnQgc3BlZWQsICovCitpbnQgcHBvcnRwYXJpdHkgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogIHBhcml0eSwgKi8KK2ludCBwcG9ydGZsb3cgPSBGTE9fS0VFUDsgICAgICAgICAgICAgICAvKiAgYW5kIGZsb3cgY29udHJvbCAqLworI2VuZGlmIC8qIEJQUklOVCAqLworI2lmZGVmIE9TMgorZXh0ZXJuIGludCB0eHQycHM7ICAgICAgICAgICAgICAgICAgICAgIC8qIFRleHQyUFMgY29udmVyc2lvbj8gKi8KK2V4dGVybiBpbnQgcHNfd2lkdGgsIHBzX2xlbmd0aDsgICAgICAgICAvKiBUZXh0MlBTIGRpbWVuc2lvbnMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBQUklOVFNXSSAqLworCisjaWZkZWYgT1MyCitleHRlcm4gaW50IHRjcF9hdmFpbDsgICAgICAgICAgICAgICAgICAgLyogTm9uemVybyBpZiBUQ1AvSVAgaXMgYXZhaWxhYmxlICovCisjaWZkZWYgREVDTkVUCitleHRlcm4gaW50IGRuZXRfYXZhaWw7ICAgICAgICAgICAgICAgICAgLyogRGl0dG8gZm9yIERFQ25ldCAqLworI2VuZGlmIC8qIERFQ05FVCAqLworI2lmZGVmIFNVUEVSTEFUCitleHRlcm4gaW50IHNsYXRfYXZhaWw7CisjZW5kaWYgLyogU1VQRVJMQVQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworc3RhdGljIHN0cnVjdCBrZXl0YWIgbG9naW50YWJbXSA9IHsKKyAgICB7ICJwYXNzd29yZCIsIExPR0lfUFNXLCBDTV9JTlYgfSwKKyAgICB7ICJwcm9tcHQiLCAgIExPR0lfUFJNLCBDTV9JTlYgfSwKKyAgICB7ICJ1c2VyaWQiLCAgIExPR0lfVUlELCAwIH0KK307CisKKyNpZm5kZWYgTk9DU0VUUworLyogc3lzdGVtLWluZGVwZW5kZW50IGNoYXJhY3RlciBzZXRzLCBkZWZpbmVkIGluIGNrY3hsYS5bY2hdICovCitleHRlcm4gc3RydWN0IGNzaW5mbyB0Y3NpbmZvW107CitleHRlcm4gc3RydWN0IGxhbmdpbmZvIGxhbmdzW107CisKKy8qIE90aGVyIGNoYXJhY3Rlci1zZXQgcmVsYXRlZCB2YXJpYWJsZXMgKi8KK2V4dGVybiBpbnQgdGNoYXJzZXQsIHRzbGV2ZWwsIGxhbmd1YWdlOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworLyogRmlsZS10cmFuc2ZlciB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBOT1hGRVIKKyNpZmRlZiBDS19BVVRPREwKK2V4dGVybiBpbnQgY21kYWRsOworI2VuZGlmIC8qIENLX0FVVE9ETCAqLworCisjaWZuZGVmIE5PU0VSVkVSCitleHRlcm4gaW50IG5nZXRwYXRoOworZXh0ZXJuIGNoYXIgKiBnZXRwYXRoW107CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKworZXh0ZXJuIHN0cnVjdCBja19wIHB0YWJbXTsKKworZXh0ZXJuIENIQVIgc3N0YXRlOyAgICAgICAgICAgICAgICAgICAgIC8qIFByb3RvY29sIHN0YXJ0IHN0YXRlICovCitleHRlcm4gQ0hBUiBteWN0bHE7ICAgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbC1jaGFyYWN0ZXIgcHJlZml4ICovCitleHRlcm4gQ0hBUiBteXJwdHE7ICAgICAgICAgICAgICAgICAgICAgLyogUmVwZWF0LWNvdW50IHByZWZpeCAqLworCitleHRlcm4gaW50IHByb3RvY29sLCBzaXplLCBzcHNpeiwgc3BtYXgsIHVycHNpeiwgc3J2dGltLCBzcnZjZG1zZywgc2xvc3RhcnQsCisgIHNydmRpcywgeGZlcm1vZGUsIGNrZGVsYXksIGtlZXAsIG1heHRyeSwgdW5rY3MsIGJjdHIsIGVicWZsZywgc3djYXByLAorICB3c2xvdHIsIGxzY2FwciwgbHNjYXB1LCBzcHNpenIsIHJwdGVuYSwgcnB0bWluLCBkb2NyYywgeGZyY2FuLCB4ZnJjaHIsCisgIHhmcm51bSwgeGZyYmVsLCB4ZnJpbnQsIHNydnBpbmcsIGdfeGZlcm1vZGUsIHhmcnhsYTsKKworI2lmZGVmIFBJUEVTRU5ECitleHRlcm4gaW50IHVzZXBpcGVzOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyNpZmRlZiBDS1hYQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBET1VCTEUgLyBJR05PUkUgY2hhciB0YWJsZSAqLworZXh0ZXJuIGludCBkYmxmbGFnLCBpZ25mbGFnLCBkYmxjaGFyOworZXh0ZXJuIHNob3J0IGRibHRbXTsKKyNlbmRpZiAvKiBDS1hYQ0hBUiAqLworCisjaWZkZWYgQ0tfU1BFRUQKK2V4dGVybiBzaG9ydCBjdGxwW107ICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sLXByZWZpeCB0YWJsZSAqLworZXh0ZXJuIGludCBwcmVmaXhpbmc7CitzdGF0aWMgc3RydWN0IGtleXRhYiBwZnh0YWJbXSA9IHsKKyAgICAiYWxsIiwgICAgICAgICBQWF9BTEwsIDAsCisgICAgImNhdXRpb3VzIiwgICAgUFhfQ0FVLCAwLAorICAgICJtaW5pbWFsIiwgICAgIFBYX1dJTCwgMCwKKyAgICAibm9uZSIsICAgICAgICBQWF9OT04sIDAKK307CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworLyogRGVjbGFyYXRpb25zIGZyb20gY21kIHBhY2thZ2UgKi8KKworI2lmZGVmIERDTURCVUYKK2V4dGVybiBjaGFyICpjbWRidWY7ICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kIGJ1ZmZlciAqLworZXh0ZXJuIGNoYXIgKmxpbmU7CitleHRlcm4gY2hhciAqdG1wYnVmOworI2Vsc2UKK2V4dGVybiBjaGFyIGNtZGJ1ZltdOyAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kIGJ1ZmZlciAqLworZXh0ZXJuIGNoYXIgbGluZVtdOyAgICAgICAgICAgICAgICAgICAgIC8qIENoYXJhY3RlciBidWZmZXIgZm9yIGFueXRoaW5nICovCitleHRlcm4gY2hhciB0bXBidWZbXTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisKKy8qIEZyb20gbWFpbiBja3VzZXIgbW9kdWxlLi4uICovCisKK2V4dGVybiBjaGFyICp0cCwgKmxwOyAgICAgICAgICAgICAgICAgICAvKiBUZW1wb3JhcnkgYnVmZmVyICovCisKK2V4dGVybiBpbnQgdGxldmVsOyAgICAgICAgICAgICAgICAgICAgICAvKiBUYWtlIENvbW1hbmQgZmlsZSBsZXZlbCAqLworCisjaWZuZGVmIE5PTE9DQUwKK2V4dGVybiBpbnQgc2Vzc2Z0OyAgICAgICAgICAgICAgICAgICAgICAvKiBTZXNzaW9uLWxvZyBmaWxlIHR5cGUgKi8KK2V4dGVybiBpbnQgc2xvZ3RzOyAgICAgICAgICAgICAgICAgICAgICAvKiBTZXNzaW9uLWxvZyB0aW1lc3RhbXBzIG9uL29mZiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworY2hhciAqIHRlbXBkaXIgPSBOVUxMOworCisjaWZkZWYgVk1TCitpbnQgdm1zX21zZ3MgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgLyogU0VUIE1FU1NBR0VTICovCitleHRlcm4gaW50IGJhdGNoOworI2VuZGlmIC8qIFZNUyAqLworCisvKiBLZXl3b3JkIHRhYmxlcyBmb3IgU0VUIGNvbW1hbmRzICovCisKKyNpZmRlZiBDS19TUEVFRAorc3RydWN0IGtleXRhYiBjdGx0YWJbXSA9IHsKKyAgICAicHJlZml4ZWQiLCAgIDEsIDAsICAgICAgICAgICAgICAgICAvKiBOb3RlLCB0aGUgdmFsdWVzIGFyZSBpbXBvcnRhbnQuICovCisgICAgInVucHJlZml4ZWQiLCAwLCAwCit9OworI2VuZGlmIC8qIENLX1NQRUVEICovCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIG9sZG5ld1tdID0geworICAgICJuZXciLCAwLCAwLAorICAgICJvbGQiLCAxLCAwCit9OworCisjZGVmaW5lIE1DSF9GSUZPIDEKKyNkZWZpbmUgTUNIX0RPVEYgMgorc3RydWN0IGtleXRhYiBtYXRjaHRhYltdID0geworICAgIHsgImRvdGZpbGUiLCBNQ0hfRE9URiwgMCB9LAorICAgIHsgImZpZm8iLCAgICBNQ0hfRklGTywgMCB9Cit9OworaW50IG5tYXRjaHRhYiA9IChzaXplb2YobWF0Y2h0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2lmbmRlZiBOT1NQTAorc3RhdGljIHN0cnVjdCBrZXl0YWIgZnVuY3RhYltdID0geworICAgICJkaWFnbm9zdGljcyIsIEZVTkNfREksIDAsCisgICAgImVycm9yIiwgICAgICAgRlVOQ19FUiwgMAorfTsKK3N0YXRpYyBpbnQgbmZ1bmN0YWIgPSAoc2l6ZW9mKGZ1bmN0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RydWN0IGtleXRhYiBvdXRwdGFiW10gPSB7ICAgICAgICAgICAgIC8qIFNFVCBPVVRQVVQgcGFyYW1ldGVycyAqLworICAgICJwYWNpbmciLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgIC8qIG9ubHkgb25lIHNvIGZhci4uLiAqLworICAgICJzcGVjaWFsLWVzY2FwZXMiLCAxLCAwCit9OworaW50IG5vdXRwdGFiID0gKHNpemVvZihvdXRwdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7IC8qIEhvdyBtYW55ICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworc3RydWN0IGtleXRhYiBjaGt0YWJbXSA9IHsgICAgICAgICAgICAgIC8qIEJsb2NrIGNoZWNrIHR5cGVzICovCisgICAgIjEiLCAxLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSA9ICA2LWJpdCBjaGVja3N1bSAqLworICAgICIyIiwgMiwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgPSAxMi1iaXQgY2hlY2tzdW0gKi8KKyAgICAiMyIsIDMsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzID0gMTYtYml0IENSQyAqLworICAgICI0IiwgNCwgQ01fSU5WLCAgICAgICAgICAgICAgICAgICAgIC8qIFNhbWUgYXMgQiAqLworICAgICJibGFuay1mcmVlLTIiLCA0LCAwICAgICAgICAgICAgICAgIC8qIEIgPSAxMi1iaXQgY2hlY2tzdW0sIG5vIGJsYW5rcyAqLworfTsKKworc3RydWN0IGtleXRhYiBycHR0YWJbXSA9IHsgICAgICAgICAgICAgIC8qIFNFVCBSRVBFQVQgKi8KKyAgICAiY291bnRzIiwgICAgMCwgMCwgICAgICAgICAgICAgICAgICAvKiBPbiBvciBPZmYgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgIm1pbmltdW0iLCAgIDEsIDAsICAgICAgICAgICAgICAgICAgLyogVGhyZXNoaG9sZCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAicHJlZml4IiwgICAgMiwgMCAgICAgICAgICAgICAgICAgICAvKiBSZXBlYXQtcHJlZml4IGNoYXJhY3RlciB2YWx1ZSAqLworfTsKKworI2lmbmRlZiBOT0xPQ0FMCisvKiBGb3IgU0VUIFsgTU9ERU0gXSBDQVJSSUVSLCBhbmQgYWxzbyBmb3IgU0VUIERJQUwgQ09OTkVDVCAqLworCitzdHJ1Y3Qga2V5dGFiIGNycnRhYltdID0geworICAgICJhdXRvbWF0aWMiLCBDQVJfQVVULCAwLCAgICAgICAgICAgIC8qIDIgKi8KKyAgICAib2ZmIiwgICAgICAgQ0FSX09GRiwgMCwgICAgICAgICAgICAvKiAwICovCisgICAgIm9uIiwgICAgICAgIENBUl9PTiwgIDAgICAgICAgICAgICAgLyogMSAqLworfTsKK2ludCBuY3JyID0gMzsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKK3N0cnVjdCBrZXl0YWIgb29hdGFiW10gPSB7ICAgICAgICAgICAgICAvKiBPbi9PZmYvQXV0byB0YWJsZSAqLworICAgICJhdXRvbWF0aWMiLCBTRVRfQVVUTywgMCwgICAgICAgICAgIC8qIDIgKi8KKyAgICAib2ZmIiwgICAgICAgU0VUX09GRiwgIDAsICAgICAgICAgICAvKiAwICovCisgICAgIm9uIiwgICAgICAgIFNFVF9PTiwgICAwICAgICAgICAgICAgLyogMSAqLworfTsKKworc3RydWN0IGtleXRhYiBvb2t0YWJbXSA9IHsgICAgICAgICAgICAgIC8qIE9uL09mZi9Bc2sgdGFibGUgKi8KKyAgICAiYXNrIiwgICAgICAgMiwgICAgICAgIDAsICAgICAgICAgICAvKiAyICovCisgICAgIm9mZiIsICAgICAgIFNFVF9PRkYsICAwLCAgICAgICAgICAgLyogMCAqLworICAgICJvbiIsICAgICAgICBTRVRfT04sICAgMCAgICAgICAgICAgIC8qIDEgKi8KK307CisKK3N0cnVjdCBrZXl0YWIgcXZ0YWJbXSA9IHsgICAgICAgICAgICAgICAvKiBRdWlldC9WZXJib3NlIHRhYmxlICovCisgICAgInF1aWV0IiwgMSwgMCwKKyAgICAidmVyYm9zZSIsIDAsIDAKK307CitpbnQgbnF2dCA9IDI7CisKKy8qIEZvciBTRVQgREVCVUcgKi8KKworI2RlZmluZSBERUJfT0ZGICAwCisjZGVmaW5lIERFQl9PTiAgIDEKKyNkZWZpbmUgREVCX1NFUyAgMgorI2RlZmluZSBERUJfVElNICAzCisjZGVmaW5lIERFQl9MRU4gIDQKKworc3RydWN0IGtleXRhYiBkYmd0YWJbXSA9IHsKKyAgICAibGluZWxlbmd0aCIsIERFQl9MRU4sIENNX0lOViwKKyAgICAib2ZmIiwgICAgICAgIERFQl9PRkYsIDAsCisgICAgIm9uIiwgICAgICAgICBERUJfT04sICAwLAorICAgICJzZXNzaW9uIiwgICAgREVCX1NFUywgMCwKKyAgICAidGltZXN0YW1wcyIsIERFQl9USU0sIDAKK307CitpbnQgbmRiZyA9IChzaXplb2YoZGJndGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKKyNpZm5kZWYgTk9MT0NBTAorLyogVHJhbnNtaXNzaW9uIHNwZWVkcyAqLworCisjaWZkZWYgVFRTUERMSVNUIC8qIFNwZWVkIHRhYmxlIGNvbnN0cnVjdGVkIGF0IHJ1bnRpbWUgLiAuIC4gKi8KKworc3RydWN0IGtleXRhYiAqIHNwZHRhYiA9IE5VTEw7CitpbnQgbnNwZCA9IDA7CisKKyNlbHNlCisvKgorICBOb3RlLCB0aGUgdmFsdWVzIGFyZSBlbmNvZGVkIGluIGNwcyByYXRoZXIgdGhhbiBicHMgYmVjYXVzZSAxOTIwMCBhbmQgaGlnaGVyCisgIGFyZSB0b28gYmlnIGZvciBzb21lIGludHMuICBBbGwgYnV0IDc1YnBzIGFyZSBtdWx0aXBsZXMgb2YgdGVuLiAgUmVzdWx0IG9mCisgIGxvb2t1cCBpbiB0aGlzIHRhYmxlIG11c3QgYmUgbXVsdGlwbGllZCBieSAxMCB0byBnZXQgYWN0dWFsIHNwZWVkIGluIGJwcy4KKyAgSWYgdGhpcyBudW1iZXIgaXMgNzAsIGl0IG11c3QgYmUgY2hhbmdlZCB0byA3NS4gIElmIGl0IGlzIDg4OCwgdGhpcyBtZWFucworICA3NS8xMjAwIHNwbGl0IHNwZWVkLgorCisgIFRoZSB2YWx1ZXMgYXJlIGdlbmVyaWMsIHJhdGhlciB0aGFuIHNwZWNpZmljIHRvIFVOSVguICBXZSBjYW4ndCB1c2UgQjc1LAorICBCMTIwMCwgQjk2MDAsIGV0YywgYmVjYXVzZSBub24tVU5JWCB2ZXJzaW9ucyBvZiBDLUtlcm1pdCB3aWxsIG5vdAorICBuZWNlc3NhcmlseSBoYXZlIHRoZXNlIHN5bWJvbHMgZGVmaW5lZC4gIFRoZSBCUFNfeHh4IHN5bWJvbHMgYXJlCisgIEtlcm1pdC1zcGVjaWZpYywgYW5kIGFyZSBkZWZpbmVkIGluIGNrY2RlYi5oIG9yIG9uIHRoZSBDQyBjb21tYW5kIGxpbmUuCisKKyAgTGlrZSBhbGwgb3RoZXIga2V5dGFicywgdGhpcyBvbmUgbXVzdCBiZSBpbiAiYWxwaGFiZXRpY2FsIiBvcmRlciwKKyAgcmF0aGVyIHRoYW4gbnVtZXJpYyBvcmRlci4KKyovCitzdHJ1Y3Qga2V5dGFiIHNwZHRhYltdID0geworICAgICIwIiwgICAgICAwLCAgQ01fSU5WLAorICAgICIxMTAiLCAgIDExLCAgMCwKKyNpZmRlZiBCUFNfMTE1SworICIxMTUyMDAiLDExNTIwLCAgMCwKKyNlbmRpZiAvKiBCUFNfMTE1SyAqLworICAiMTIwMCIsICAgMTIwLCAgMCwKKyNpZmRlZiBCUFNfMTM0CisgICIxMzQuNSIsICAxMzQsICAwLAorI2VuZGlmIC8qIEJQU18xMzQgKi8KKyNpZmRlZiBCUFNfMTRLCisgICIxNDQwMCIsIDE0NDAsICAwLAorI2VuZGlmIC8qIEJQU18xNEsgKi8KKyNpZmRlZiBCUFNfMTUwCisgICIxNTAiLCAgICAgMTUsICAwLAorI2VuZGlmIC8qIEJQU18xNTAgKi8KKyNpZmRlZiBCUFNfMTgwMAorICAiMTgwMCIsICAgICAxODAsICAwLAorI2VuZGlmIC8qIEJQU18xNTAgKi8KKyNpZmRlZiBCUFNfMTlLCisgICIxOTIwMCIsIDE5MjAsICAwLAorI2VuZGlmIC8qIEJQU18xOUsgKi8KKyNpZmRlZiBCUFNfMjAwCisgICIyMDAiLCAgICAgMjAsICAwLAorI2VuZGlmIC8qIEJQU18yMDAgKi8KKyNpZmRlZiBCUFNfMjMwSworICAiMjMwNDAwIiwgMjMwNDAsIDAsCisjZW5kaWYgLyogQlBTXzIzMEsgKi8KKyAgIjI0MDAiLCAgIDI0MCwgIDAsCisjaWZkZWYgQlBTXzI4SworICAiMjg4MDAiLCAyODgwLCAgMCwKKyNlbmRpZiAvKiBCUFNfMjhLICovCisgICIzMDAiLCAgICAgMzAsICAwLAorI2lmZGVmIEJQU18zNjAwCisgICIzNjAwIiwgICAzNjAsICAwLAorI2VuZGlmIC8qIEJQU18zNjAwICovCisjaWZkZWYgQlBTXzM4SworICAiMzg0MDAiLCAzODQwLCAgMCwKKyNlbmRpZiAvKiBCUFNfMzhLICovCisjaWZkZWYgQlBTXzQ2MEsKKyAgIjQ2MDgwMCIsIDQ2MDgwLCAgMCwgICAgICAgICAgICAgICAgICAvKiBOZWVkIDMyIGJpdHMgZm9yIHRoaXMuLi4gKi8KKyNlbmRpZiAvKiBCUFNfNDYwSyAqLworICAiNDgwMCIsICAgNDgwLCAgMCwKKyNpZmRlZiBCUFNfNTAKKyAgIjUwIiwgICAgICAgNSwgIDAsCisjZW5kaWYgLyogQlBTXzUwICovCisjaWZkZWYgQlBTXzU3SworICAiNTc2MDAiLCA1NzYwLCAgMCwKKyNlbmRpZiAvKiBCUFNfNTdLICovCisgICI2MDAiLCAgICAgNjAsICAwLAorI2lmZGVmIEJQU183MjAwCisgICI3MjAwIiwgICA3MjAsICAwLAorI2VuZGlmIC8qIEJQU183MjAwICovCisjaWZkZWYgQlBTXzc1CisgICI3NSIsICAgICAgIDcsICAwLAorI2VuZGlmIC8qIEJQU183NSAqLworI2lmZGVmIEJQU183NTEyCisgICI3NS8xMjAwIiw4ODgsICAwLCAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAiODg4IiBmb3Igc3BsaXQgc3BlZWQgKi8KKyNlbmRpZiAvKiBCUFNfNzUxMiAqLworI2lmZGVmIEJQU183NksKKyAgIjc2ODAwIiwgNzY4MCwgIDAsCisjZW5kaWYgLyogQlBTXzc2SyAqLworI2lmZGVmIEJQU185MjFLCisgICI5MjE2MDAiLCA5MjE2MCwwLCAgICAgICAgICAgICAgICAgICAgLyogTmVlZCAzMiBiaXRzIGZvciB0aGlzLi4uICovCisjZW5kaWYgLyogQlBTXzkyMUsgKi8KKyAgIjk2MDAiLCAgIDk2MCwgIDAKK307CitpbnQgbnNwZCA9IChzaXplb2Yoc3BkdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7IC8qIEhvdyBtYW55IHNwZWVkcyAqLworI2VuZGlmIC8qIFRUU1BETElTVCAqLworCisjaWZkZWYgVE5fQ09NUE9SVAorc3RydWN0IGtleXRhYiB0bnNwZHRhYltdID0geyAgICAgICAgICAgIC8qIFJGQyAyMjE3IFRFTE5FVCBDT01QT1JUIE9wdGlvbiAqLworICAgICIxMTUyMDAiLCAxMTUyMCwgIDAsICAgICAgICAgICAgICAgIC8qIChhZGQgYW55IG90aGVyIGRlZmluZWQgc3BlZWRzKSAqLworICAgICIxMjAwIiwgICAgIDEyMCwgIDAsCisgICAgIjE0NDAwIiwgICAxNDQwLCAgMCwKKyAgICAiMTkyMDAiLCAgIDE5MjAsICAwLAorICAgICIyMzA0MDAiLCAyMzA0MCwgIDAsCisgICAgIjI0MDAiLCAgICAgMjQwLCAgMCwKKyAgICAiMjg4MDAiLCAgIDI4ODAsICAwLAorICAgICIzMDAiLCAgICAgICAzMCwgIDAsCisgICAgIjM4NDAwIiwgICAzODQwLCAgMCwKKyAgICAiNDYwODAwIiwgNDYwODAsICAwLAorICAgICI0ODAwIiwgICAgIDQ4MCwgIDAsCisgICAgIjU3NjAwIiwgICA1NzYwLCAgMCwKKyAgICAiNjAwIiwgICAgICAgNjAsICAwLAorICAgICI5NjAwIiwgICAgIDk2MCwgIDAKK307CitpbnQgbnRuc3BkID0gKHNpemVvZih0bnNwZHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOyAvKiBIb3cgbWFueSBzcGVlZHMgKi8KKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZuZGVmIE5PQ1NFVFMKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIGxuZ3RhYltdOyAgICAgICAgICAvKiBMYW5ndWFnZXMgZm9yIFNFVCBMQU5HVUFHRSAqLworZXh0ZXJuIGludCBubG5nOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmbmRlZiBOT0xPQ0FMCisvKiBEdXBsZXgga2V5d29yZCB0YWJsZSAqLworCitzdHJ1Y3Qga2V5dGFiIGRweHRhYltdID0geworICAgICJmdWxsIiwgICAgICAwLCAwLAorICAgICJoYWxmIiwgICAgICAxLCAwCit9OworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworLyogRmxvdyBDb250cm9sICovCisKK3N0cnVjdCBrZXl0YWIgY3h0eXBlc3dbXSA9IHsKKyNpZmRlZiBERUNORVQKKyAgICAiL2RlY25ldCIsICAgICAgICAgQ1hUX0RFQ05FVCwgIDAsCisjZW5kaWYgLyogREVDTkVUICovCisgICAgIi9kaXJlY3Qtc2VyaWFsIiwgIENYVF9ESVJFQ1QsICAwLAorI2lmZGVmIERFQ05FVAorICAgICIvbGF0IiwgICAgICAgICAgICBDWFRfTEFULCAgICAgMCwKKyNlbHNlCisjaWZkZWYgU1VQRVJMQVQKKyAgICAiL2xhdCIsICAgICAgICAgICAgQ1hUX0xBVCwgICAgIDAsCisjZW5kaWYgLyogU1VQRVJMQVQgKi8KKyNlbmRpZiAvKiBERUNORVQgKi8KKyAgICAiL21vZGVtIiwgICAgICAgICAgQ1hUX01PREVNLCAgIDAsCisjaWZkZWYgTlBJUEUKKyAgICAiL25hbWVkLXBpcGUiLCAgICAgQ1hUX05QSVBFLCAgIDAsCisjZW5kaWYgLyogTlBJUEUgKi8KKyNpZmRlZiBORVRCSU9TCisgICAgIi9uZXRiaW9zIiwgICAgICAgIENYVF9ORVRCSU9TLCAwLAorI2VuZGlmIC8qIE5FVEJJT1MgKi8KKyAgICAiL3JlbW90ZSIsICAgICAgICAgQ1hUX1JFTU9URSwgIDAsCisjaWZkZWYgVENQU09DS0VUCisgICAgIi90Y3BpcCIsICAgICAgICAgIENYVF9UQ1BJUCwgICAwLAorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2lmZGVmIEFOWVgyNQorICAgICIveC4yNSIsICAgICAgICAgICBDWFRfWDI1LCAgICAgMCwKKyNlbmRpZiAvKiBBTllYMjUgKi8KKyAgICAiIiwgMCwgMAorfTsKK2ludCBuY3h0eXBlc3cgPSAoc2l6ZW9mKGN4dHlwZXN3KSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKKyNpZmRlZiBUTl9DT01QT1JUCitzdHJ1Y3Qga2V5dGFiIHRuZmxvdGFiW10gPSB7ICAgICAgICAgICAgLyogU0VUIEZMT1ctQ09OVFJPTCBrZXl3b3JkIHRhYmxlICovCisgICAgImR0ci9jZCIsICAgIEZMT19EVFJDLCAwLCAgICAgICAgICAgLyogZm9yIFJGQyAyMjE3IFRlbG5ldCBDT01QT1JUICovCisgICAgImR0ci9jdHMiLCAgIEZMT19EVFJULCAwLAorICAgICJrZWVwIiwgICAgICBGTE9fS0VFUCwgMCwKKyAgICAibm9uZSIsICAgICAgRkxPX05PTkUsIDAsCisgICAgInJ0cy9jdHMiLCAgIEZMT19SVFNDLCAwLAorICAgICJ4b24veG9mZiIsICBGTE9fWE9OWCwgMAorfTsKK2ludCBudG5mbG8gPSAoc2l6ZW9mKHRuZmxvdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworCitzdHJ1Y3Qga2V5dGFiIGZsb3RhYltdID0geyAgICAgICAgICAgICAgLyogU0VUIEZMT1ctQ09OVFJPTCBrZXl3b3JkIHRhYmxlICovCisgICAgImF1dG9tYXRpYyIsIEZMT19BVVRPLCBDTV9JTlYsICAgICAgLyogTm90IG5lZWRlZCBhbnkgbW9yZSAqLworI2lmZGVmIENLX0RUUkNECisgICAgImR0ci9jZCIsICAgIEZMT19EVFJDLCAwLAorI2VuZGlmIC8qIENLX0RUUkNEICovCisjaWZkZWYgQ0tfRFRSQ1RTCisgICAgImR0ci9jdHMiLCAgIEZMT19EVFJULCAwLAorI2VuZGlmIC8qIENLX0RUUkNUUyAqLworICAgICJrZWVwIiwgICAgICBGTE9fS0VFUCwgMCwKKyAgICAibm9uZSIsICAgICAgRkxPX05PTkUsIDAsCisjaWZkZWYgQ0tfUlRTQ1RTCisgICAgInJ0cy9jdHMiLCAgIEZMT19SVFNDLCAwLAorI2VuZGlmIC8qIENLX1JUU0NUUyAqLworI2lmbmRlZiBQbGFuOQorICAgICJ4b24veG9mZiIsICBGTE9fWE9OWCwgMCwKKyNlbmRpZiAvKiBQbGFuOSAqLworICAgICIiLCAwLCAwCit9OworaW50IG5mbG8gPSAoc2l6ZW9mKGZsb3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworLyogIEhhbmRzaGFrZSBjaGFyYWN0ZXJzICAqLworCitzdHJ1Y3Qga2V5dGFiIGhzaHRhYltdID0geworICAgICJiZWxsIiwgMDA3LCAwLAorICAgICJjb2RlIiwgOTk4LCAwLAorICAgICJjciIsICAgMDE1LCAwLAorICAgICJlc2MiLCAgMDMzLCAwLAorICAgICJsZiIsICAgMDEyLCAwLAorICAgICJub25lIiwgOTk5LCAwLCAgICAgICAgICAgICAgICAgICAgIC8qIChjYW4ndCB1c2UgbmVnYXRpdmUgbnVtYmVycykgKi8KKyAgICAieG9mZiIsIDAyMywgMCwKKyAgICAieG9uIiwgIDAyMSwgMAorfTsKK2ludCBuaHNoID0gKHNpemVvZihoc2h0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2lmbmRlZiBOT0xPQ0FMCitzdGF0aWMgc3RydWN0IGtleXRhYiBzZnR0YWJbXSA9IHsgICAgICAgLyogRmlsZSB0eXBlcyBmb3IgU0VUIFNFU1NJT04tTE9HICovCisgICAgImFzY2lpIiwgICAgIFhZRlRfVCwgQ01fSU5WLAorICAgICJiaW5hcnkiLCAgICBYWUZUX0IsIDAsCisgICAgImRlYnVnIiwgICAgIFhZRlRfRCwgMCwKKyAgICAidGV4dCIsICAgICAgWFlGVF9ULCAwLAorICAgICJ0aW1lc3RhbXBlZC10ZXh0IiwgOTk5LCAwCit9Oworc3RhdGljIGludCBuc2Z0dGFiID0gKHNpemVvZihzZnR0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZm5kZWYgTk9ESUFMCisKKyNpZmRlZiBORVRDT05OICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXR3b3JrcyBkaXJlY3RvcnkgZGVwZW5kcyAqLworaW50IG5uZXRkaXIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIERJQUwgY29kZSAtLSBmaXggbGF0ZXIuLi4gKi8KK2NoYXIgKm5ldGRpcltNQVhERElSKzJdOworI2VuZGlmIC8qIE5FVENPTk4gKi8KKworX1BST1RPVFlQKCBzdGF0aWMgaW50IHNldGRpYWwsIChpbnQpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBpbnQgc2V0ZGNkLCAodm9pZCkgKTsKK19QUk9UT1RZUCggc3RhdGljIGludCBja2xvZ2luLCAodm9pZCkgKTsKKworI2lmbmRlZiBNSU5JRElBTAorI2lmZGVmIE9MRFRCQ09ERQorZXh0ZXJuIGludCB0Ym1vZGVsOyAgICAgICAgICAgICAgICAgICAgIC8qIFRlbGViaXQgbW9kZWwgSUQgKi8KKyNlbmRpZiAvKiBPTERUQkNPREUgKi8KKyNlbmRpZiAvKiBNSU5JRElBTCAqLworCitleHRlcm4gTURNSU5GICptb2RlbXBbXTsgICAgICAgICAgICAgICAgLyogUG9pbnRlcnMgdG8gbW9kZW0gaW5mbyBzdHJ1Y3RzICovCitleHRlcm4gc3RydWN0IGtleXRhYiBtZG10YWJbXTsgICAgICAgICAgLyogTW9kZW0gdHlwZXMgKGluIG1vZHVsZSBja3VkaWEuYykgKi8KK2V4dGVybiBpbnQgbm1kbTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdGhlbSAqLworCitfUFJPVE9UWVAoc3RhdGljIGludCBkaWFsc3RyLChjaGFyICoqLCBjaGFyICopKTsKKworZXh0ZXJuIGludCBkaWFsaG5nLCBkaWFsdG1vLCBkaWFsa3NwLCBkaWFsZHB5LCBkaWFsbWh1LCBkaWFsZWMsIGRpYWxkYzsKK2V4dGVybiBpbnQgZGlhbHJ0ciwgZGlhbGludCwgZGlhbHVkdCwgZGlhbHNydCwgZGlhbHJzdHIsIG1kbXdhaXRkOworZXh0ZXJuIGludCBtZG1zcGQsIGRpYWxmYywgZGlhbG10aCwgZGlhbGVzYywgZGlhbGZsZCwgZGlhbGlkdCwgZGlhbHBhY2U7CitleHRlcm4gaW50IG1kbXNwaywgbWRtdm9sLCBkaWFsdGVzdDsKKworaW50IGRpYWxjdnQgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgQ09OVkVSVC1ESVJFQ1RPUlkgKi8KK2ludCBkaWFsY25mID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIENPTkZJUk1BVElPTiAqLworaW50IGRpYWxjb24gPSAyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgQ09OTkVDVCAqLworaW50IGRpYWxjcSAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgQ09OTkVDVCBBVVRPIHF1aWV0L3ZlcmJvc2UgKi8KK2V4dGVybiBsb25nIGRpYWxtYXgsIGRpYWxjYXBhczsKK2ludCB1c2VybWRtID0gMDsKK2V4dGVybiBpbnQgbmRpYWxkaXI7CitleHRlcm4gY2hhciAqZGlhbGluaSwgICAqZGlhbG1zdHIsICpkaWFsbXBybXQsICpkaWFsZGlyW10sICpkaWFsY21kLCAgKmRpYWxucHIsCisgKmRpYWxkY29uLCAqZGlhbGRjb2ZmLCAqZGlhbGVjb24sICpkaWFsZWNvZmYsICpkaWFsaGNtZCwgICpkaWFseDMsCisgKmRpYWxod2ZjLCAqZGlhbHN3ZmMsICAqZGlhbG5vZmMsICpkaWFsdG9uZSwgICpkaWFscHVsc2UsICpkaWFsbmFtZSwgKmRpYWxsYWM7CitleHRlcm4gY2hhciAqZGlhbGxjYywgICAqZGlhbGl4cCwgICpkaWFsaXhzLCAgICpkaWFsbGRwLCAgICpkaWFsbGRzLCAgKmRpYWx0ZnAsCisgKmRpYWxweGksICAqZGlhbHB4bywgICAqZGlhbHNmeCwgICpkaWFsYWFvbiwgICpkaWFsYWFvZmY7CitleHRlcm4gY2hhciAqZGlhbGxjcCwgICAqZGlhbGxjcywgICpkaWFsaW5pMiwgICpkaWFsbWFjOworZXh0ZXJuIGNoYXIgKmRpYWxzcG9mZiwgKmRpYWxzcG9uLCAqZGlhbHZvbDEsICAqZGlhbHZvbDIsICAqZGlhbHZvbDM7CisKK2NoYXIgKmRpYWx0b2NjW01BWFRQQ0NdID0geyBOVUxMLCBOVUxMIH07CitpbnQgbmRpYWx0b2NjID0gMDsKK2NoYXIgKmRpYWxwdWNjW01BWFRQQ0NdID0geyBOVUxMLCBOVUxMIH07CitpbnQgbmRpYWxwdWNjID0gMDsKKworY2hhciAqZGlhbHRmY1tNQVhUT0xMRlJFRV0gPSB7CisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAorfTsKK2ludCBudG9sbGZyZWUgPSAwOworCitjaGFyICpkaWFscHh4W01BWFBCWEVYQ0hdID0geworICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKK307CitpbnQgbmRpYWxweHggPSAwOworCitjaGFyICpkaWFsbGNhY1tNQVhMT0NBTEFDXSA9IHsKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCit9OworaW50IG5sb2NhbGFjID0gMDsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgZHJzdHJ0YWJbXSA9IHsKKyAgICAiaW50ZXJuYXRpb25hbCIsIDUsIDAsCisgICAgImxvY2FsIiwgICAgICAgICAyLCAwLAorICAgICJsb25nLWRpc3RhbmNlIiwgNCwgMCwKKyAgICAibm9uZSIsICAgICAgICAgIDYsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGRjbnZ0YWJbXSA9IHsKKyAgICAiYXNrIiwgIDIsIDAsCisgICAgIm9mZiIsICAwLCAwLAorICAgICJvbiIsICAgMSwgMAorfTsKKworc3RydWN0IGtleXRhYiBzZXRtZG1bXSA9IHsKKyAgICAiY2FwYWJpbGl0aWVzIiwgICAgIFhZRENBUCwgIDAsCisgICAgImNhcnJpZXItd2F0Y2giLCAgICBYWURNQ0QsICAwLAorICAgICJjb21tYW5kIiwgICAgICAgICAgWFlEU1RSLCAgMCwKKyAgICAiY29tcHJlc3Npb24iLCAgICAgIFhZRERDLCAgIENNX0lOViwKKyAgICAiZGF0YS1jb21wcmVzc2lvbiIsIFhZRERDLCAgIDAsCisgICAgImRpYWwtY29tbWFuZCIsICAgICBYWURESUEsICAwLAorICAgICJlcnJvci1jb3JyZWN0aW9uIiwgWFlERUMsICAgMCwKKyAgICAiZXNjYXBlLWNoYXJhY3RlciIsIFhZREVTQywgIDAsCisgICAgImZsb3ctY29udHJvbCIsICAgICBYWURGQywgICAwLAorICAgICJoYW5ndXAtbWV0aG9kIiwgICAgWFlETUhVLCAgMCwKKyNpZm5kZWYgTk9YRkVSCisgICAgImtlcm1pdC1zcG9vZiIsICAgICBYWURLU1AsICAwLAorI2VuZGlmIC8qIE5PWEZFUiAqLworICAgICJtYXhpbXVtLXNwZWVkIiwgICAgWFlETUFYLCAgMCwKKyAgICAibmFtZSIsICAgICAgICAgICAgIFhZRE5BTSwgIDAsCisgICAgInNwZWFrZXIiLCAgICAgICAgICBYWURTUEssICAwLAorICAgICJzcGVlZC1tYXRjaGluZyIsICAgWFlEU1BELCAgMCwKKyAgICAidHlwZSIsICAgICAgICAgICAgIFhZRFRZUCwgIDAsCisgICAgInZvbHVtZSIsICAgICAgICAgICBYWURWT0wsICAwCit9OworaW50IG5zZXRtZG0gPSAoc2l6ZW9mKHNldG1kbSkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdHJ1Y3Qga2V5dGFiIHZvbHRhYltdID0geworICAgICJoaWdoIiwgICAzLCAgMCwKKyAgICAibG93IiwgICAgMSwgIDAsCisgICAgIm1lZGl1bSIsIDIsICAwCit9OworCitzdHJ1Y3Qga2V5dGFiIG1kbWNhcFtdID0geworICAgICJhdC1jb21tYW5kcyIsICAgICAgQ0tEX0FULCAgMCwKKyAgICAiY29tcHJlc3Npb24iLCAgICAgIENLRF9EQywgIDAsCisgICAgImRjIiwgICAgICAgICAgICAgICBDS0RfREMsICBDTV9JTlYsCisgICAgImVjIiwgICAgICAgICAgICAgICBDS0RfRUMsICBDTV9JTlYsCisgICAgImVycm9yLWNvcnJlY3Rpb24iLCBDS0RfRUMsICAwLAorICAgICJoYXJkd2FyZS1mbG93IiwgICAgQ0tEX0hXLCAgMCwKKyAgICAiaHdmYyIsICAgICAgICAgICAgIENLRF9IVywgIENNX0lOViwKKyAgICAiaXR1IiwgICAgICAgICAgICAgIENLRF9WMjUsIENNX0lOViwKKyAgICAia2VybWl0LXNwb29mIiwgICAgIENLRF9LUywgIDAsCisgICAgImtzIiwgICAgICAgICAgICAgICBDS0RfS1MsICBDTV9JTlYsCisgICAgInNiIiwgICAgICAgICAgICAgICBDS0RfU0IsICBDTV9JTlYsCisgICAgInNvZnR3YXJlLWZsb3ciLCAgICBDS0RfU1csICAwLAorICAgICJzcGVlZC1idWZmZXJpbmciLCAgQ0tEX1NCLCAgMCwKKyAgICAic3dmYyIsICAgICAgICAgICAgIENLRF9TVywgIENNX0lOViwKKyAgICAidGIiLCAgICAgICAgICAgICAgIENLRF9UQiwgIENNX0lOViwKKyAgICAidGVsZWJpdCIsICAgICAgICAgIENLRF9UQiwgIDAsCisgICAgInYyNWJpcy1jb21tYW5kcyIsICBDS0RfVjI1LCAwCit9OworaW50IG5tZG1jYXAgPSAoc2l6ZW9mKG1kbWNhcCkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCisjaWZkZWYgQ09NTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0VUIEFOU1dFUiBub3QgaW1wbGVtZW50ZWQgeWV0ICovCitzdGF0aWMgc3RydWN0IGtleXRhYiBhbnN3ZXJ0YWJbXSA9IHsKKyAgICB7ICJjYWxsZXItaWQiLCAgWFlBX0NJRCwgIDAgfTsKKyAgICB7ICJyaW5ncyIsICAgICAgWFlBX1JORywgIDAgfTsKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5hbnN3ZXJ0YWIgPSAgKHNpemVvZihhbnN3ZXJ0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCitzdHJ1Y3Qga2V5dGFiIGRpYWx0YWJbXSA9IHsgICAgICAgICAgICAgLyogU0VUIERJQUwgdGFibGUgKi8KKyAgICAiYXJlYS1jb2RlIiwgICAgICAgIFhZRExBQywgMCwgICAgICAvKiBBbHNvIHN0aWxsIGluY2x1ZGVzIGl0ZW1zICAgICAqLworICAgICJjb21wcmVzc2lvbiIsICAgICAgWFlEREMsICBDTV9JTlYsIC8qIHRoYXQgd2VyZSBtb3ZlZCB0byBTRVQgTU9ERU0sICovCisgICAgImNvbmZpcm1hdGlvbiIsICAgICBYWURDTkYsIDAsICAgICAgLyogYnV0IHRoZXkgYXJlIENNX0lOVmlzaWJsZS4uLiAgKi8KKyAgICAiY29ubmVjdCIsICAgICAgICAgIFhZRENPTiwgMCwKKyAgICAiY29udmVydC1kaXJlY3RvcnkiLFhZRENWVCwgMCwKKyAgICAiY291bnRyeS1jb2RlIiwgICAgIFhZRExDQywgMCwKKyAgICAiZGlhbC1jb21tYW5kIiwgICAgIFhZRERJQSwgQ01fSU5WLAorICAgICJkaXJlY3RvcnkiLCAgICAgICAgWFlERElSLCAwLAorICAgICJkaXNwbGF5IiwgICAgICAgICAgWFlERFBZLCAwLAorICAgICJlc2NhcGUtY2hhcmFjdGVyIiwgWFlERVNDLCBDTV9JTlYsCisgICAgImVycm9yLWNvcnJlY3Rpb24iLCBYWURFQywgIENNX0lOViwKKyAgICAiZmxvdy1jb250cm9sIiwgICAgIFhZREZDLCAgQ01fSU5WLAorICAgICJmb3JjZS1sb25nLWRpc3RhbmNlIiwgWFlERkxELCAwLAorICAgICJoYW5ndXAiLCAgICAgICAgICAgWFlESFVQLCAwLAorICAgICJpZ25vcmUtZGlhbHRvbmUiLCAgWFlESURULCAwLAorICAgICJpbnRlcnZhbCIsICAgICAgICAgWFlESU5ULCAwLAorICAgICJpbiIsICAgICAgICAgICAgICAgWFlESU5JLCBDTV9JTlZ8Q01fQUJSLAorICAgICJpbml0LXN0cmluZyIsICAgICAgWFlESU5JLCBDTV9JTlYsCisgICAgImludGwtcHJlZml4IiwgICAgICBYWURJWFAsIDAsCisgICAgImludGwtc3VmZml4IiwgICAgICBYWURJWFMsIDAsCisjaWZuZGVmIE5PWEZFUgorICAgICJrZXJtaXQtc3Bvb2YiLCAgICAgWFlES1NQLCBDTV9JTlYsCisjZW5kaWYgLyogTk9YRkVSICovCisgICAgImxjLWFyZWEtY29kZXMiLCAgICBYWURMTEFDLCAwLAorICAgICJsYy1wcmVmaXgiLCAgICAgICAgWFlETENQLCAwLAorICAgICJsYy1zdWZmaXgiLCAgICAgICAgWFlETENTLCAwLAorICAgICJsZC1wcmVmaXgiLCAgICAgICAgWFlETERQLCAwLAorICAgICJsZC1zdWZmaXgiLCAgICAgICAgWFlETERTLCAwLAorICAgICJsb2NhbC1hcmVhLWNvZGUiLCAgWFlETEFDLCBDTV9JTlYsCisgICAgImxvY2FsLXByZWZpeCIsICAgICBYWURMQ1AsIENNX0lOViwKKyAgICAibG9jYWwtc3VmZml4IiwgICAgIFhZRExDUywgQ01fSU5WLAorICAgICJtIiwgICAgICAgICAgICAgICAgWFlETVRILCBDTV9JTlZ8Q01fQUJSLAorI2lmbmRlZiBOT1NQTAorICAgICJtYWNybyIsICAgICAgICAgICAgWFlETUFDLCAwLCAgICAgIC8qIDE5NSAqLworI2VuZGlmIC8qIE5PU1BMICovCisjaWZkZWYgTURNSFVQCisgICAgIm1lIiwgICAgICAgICAgICAgICBYWURNVEgsIENNX0lOVnxDTV9BQlIsCisjZW5kaWYgLyogTURNSFVQICovCisgICAgIm1ldGhvZCIsICAgICAgICAgICBYWURNVEgsIDAsCisgICAgIm1ucC1lbmFibGUiLCAgICAgICBYWURNTlAsIENNX0lOViwgLyogb2Jzb2xldGUgYnV0IHN0aWxsIGFjY2VwdGVkICovCisjaWZkZWYgTURNSFVQCisgICAgIm1vZGVtLWhhbmd1cCIsICAgICBYWURNSFUsIENNX0lOViwKKyNlbmRpZiAvKiBNRE1IVVAgKi8KKyAgICAicGFjaW5nIiwgICAgICAgICAgIFhZRFBBQywgIDAsCisgICAgInBieC1leGNoYW5nZSIsICAgICBYWURQWFgsICAwLAorICAgICJwYngtaW5zaWRlLXByZWZpeCIsWFlEUFhJLCAgMCwKKyAgICAicGJ4LW91dHNpZGUtcHJlZml4IixYWURQWE8sIDAsCisgICAgInByZWZpeCIsICAgICAgICAgICBYWUROUFIsICAwLAorICAgICJwdWxzZS1jb3VudHJpZXMiLCAgWFlEUFVDQywgMCwKKyAgICAicmVzdHJpY3QiLCAgICAgICAgIFhZRFJTVFIsIDAsCisgICAgInJldHJpZXMiLCAgICAgICAgICBYWURSVE0sICAwLAorICAgICJzb3J0IiwgICAgICAgICAgICAgWFlEU1JULCAgMCwKKyAgICAic3BlZWQtbWF0Y2hpbmciLCAgIFhZRFNQRCwgIENNX0lOViwKKyAgICAic3RyaW5nIiwgICAgICAgICAgIFhZRFNUUiwgIENNX0lOViwKKyAgICAic3VmZml4IiwgICAgICAgICAgIFhZRFNGWCwgIDAsCisgICAgInRlc3QiLCAgICAgICAgICAgICBYWURURVNULCAwLAorICAgICJ0aW1lb3V0IiwgICAgICAgICAgWFlEVE1PLCAgMCwKKyAgICAidGYtYXJlYS1jb2RlIiwgICAgIFhZRFRGQywgIENNX0lOViwKKyAgICAidGYtcHJlZml4IiwgICAgICAgIFhZRFRGUCwgIENNX0lOViwKKyAgICAidG9sbC1mcmVlLWFyZWEtY29kZSIsWFlEVEZDLDAsCisgICAgInRvbGwtZnJlZS1wcmVmaXgiLCBYWURURlAsICAwLAorICAgICJ0b25lLWNvdW50cmllcyIsICAgWFlEVE9DQywgMAorfTsKK2ludCBuZGlhbCA9IChzaXplb2YoZGlhbHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCisjaWZkZWYgTURNSFVQCitzdHJ1Y3Qga2V5dGFiIG1kbWhhbmdbXSA9IHsKKyAgICAiZHRyIiwgICAgICAgICAgIDAsIDAsCisgICAgIm1vZGVtLWNvbW1hbmQiLCAxLCAwLAorICAgICJyczIzMi1zaWduYWwiLCAgMCwgMCwKKyAgICAidjI0LXNpZ25hbCIsICAgIDAsIENNX0lOVgorfTsKKyNlbmRpZiAvKiBNRE1IVVAgKi8KKworc3RhdGljIHN0cnVjdCBrZXl0YWIgbWRtY21kW10gPSB7CisgICAgImF1dG9hbnN3ZXIiLCAgICAgICBYWURTX0FOLCAwLCAgICAgLyogYXV0b2Fuc3dlciAqLworICAgICJjb21wcmVzc2lvbiIsICAgICAgWFlEU19EQywgMCwgICAgIC8qIGRhdGEgY29tcHJlc3Npb24gKi8KKyAgICAiZGlhbC1tb2RlLXByb21wdCIsIFhZRFNfTVAsIDAsICAgICAvKiBkaWFsIG1vZGUgcHJvbXB0ICovCisgICAgImRpYWwtbW9kZS1zdHJpbmciLCBYWURTX01TLCAwLCAgICAgLyogZGlhbCBtb2RlIHN0cmluZyAqLworICAgICJlcnJvci1jb3JyZWN0aW9uIiwgWFlEU19FQywgMCwgICAgIC8qIGVycm9yIGNvcnJlY3Rpb24gKi8KKyAgICAiaGFuZ3VwLWNvbW1hbmQiLCAgIFhZRFNfSFUsIDAsICAgICAvKiBoYW5ndXAgY29tbWFuZCAqLworICAgICJoYXJkd2FyZS1mbG93IiwgICAgWFlEU19IVywgMCwgICAgIC8qIGh3ZmMgKi8KKyAgICAiaWdub3JlLWRpYWx0b25lIiwgIFhZRFNfSUQsIDAsICAgICAvKiBpZ25vcmUgZGlhbHRvbmUgKi8KKyAgICAiaW5pdC1zdHJpbmciLCAgICAgIFhZRFNfSU4sIDAsICAgICAvKiBpbml0IHN0cmluZyAqLworICAgICJuby1mbG93LWNvbnRyb2wiLCAgWFlEU19ORiwgMCwgICAgIC8qIG5vIGZsb3cgY29udHJvbCAqLworICAgICJwcmVkaWFsLWluaXQiLCAgICAgWFlEU19JMiwgMCwgICAgIC8qIGxhc3QtbWludXRlIHNldHVwIGNvbW1hbmRzICovCisgICAgInB1bHNlIiwgICAgICAgICAgICBYWURTX0RQLCAwLCAgICAgLyogcHVsc2UgKi8KKyAgICAic29mdHdhcmUtZmxvdyIsICAgIFhZRFNfU1csIDAsICAgICAvKiBzd2ZjICovCisgICAgInNwZWFrZXIiLCAgICAgICAgICBYWURTX1NQLCAwLCAgICAgLyogU3BlYWtlciAqLworICAgICJ0b25lIiwgICAgICAgICAgICAgWFlEU19EVCwgMCwgICAgIC8qIHRvbmUgKi8KKyAgICAidm9sdW1lIiwgICAgICAgICAgIFhZRFNfVk8sIDAgICAgICAvKiBWb2x1bWUgKi8KK307CitzdGF0aWMgaW50IG5tZG1jbWQgPSAoc2l6ZW9mKG1kbWNtZCkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdHJ1Y3Qga2V5dGFiIGRpYWxfZmNbXSA9IHsKKyAgICAiYXV0byIsICAgICBGTE9fQVVUTywgMCwKKyAgICAibm9uZSIsICAgICBGTE9fTk9ORSwgMCwKKyAgICAicnRzL2N0cyIsICBGTE9fUlRTQywgMCwKKyAgICAieG9uL3hvZmYiLCBGTE9fWE9OWCwgMAorfTsKKworc3RydWN0IGtleXRhYiBkaWFsX21bXSA9IHsgICAgICAgICAgICAgIC8qIERJQUwgTUVUSE9EICovCisgICAgImF1dG8iLCAgICBYWURNX0EsIDAsCisgICAgImRlZmF1bHQiLCBYWURNX0QsIDAsCisgICAgInB1bHNlIiwgICBYWURNX1AsIDAsCisgICAgInRvbmUiLCAgICBYWURNX1QsIDAKK307CitpbnQgbmRpYWxfbSA9IChzaXplb2YoZGlhbF9tKS9zaXplb2Yoc3RydWN0IGtleXRhYikpOworI2VuZGlmIC8qIE5PRElBTCAqLworCisjaWZkZWYgQ0tfVEFQSQorc3RydWN0IGtleXRhYiB0YXBpdGFiW10gPSB7ICAgICAgICAgICAgIC8qIFRvcC1MZXZlbCBNaWNyb3NvZnQgVEFQSSAqLworICAgICJjb25maWd1cmUtbGluZSIsICAgICBYWVRBUElfQ0ZHLCAgMCwKKyAgICAiZGlhbGluZy1wcm9wZXJ0aWVzIiwgWFlUQVBJX0RJQUwsIDAKK307CitpbnQgbnRhcGl0YWIgPSAoc2l6ZW9mKHRhcGl0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgc2V0dGFwaXRhYltdID0geyAgICAgICAgICAvKiBTRVQgTWljcm9zb2Z0IFRBUEkgKi8KKyAgICAiaW5hY3Rpdml0eS10aW1lb3V0IiwgWFlUQVBJX0lOQSwgIDAsCisgICAgImxpbmUiLCAgICAgICAgICAgICAgIFhZVEFQSV9MSU4sICAwLAorICAgICJsb2NhdGlvbiIsICAgICAgICAgICBYWVRBUElfTE9DLCAgMCwKKyAgICAibWFudWFsLWRpYWxpbmciLCAgICAgWFlUQVBJX01BTiwgIDAsCisgICAgIm1vZGVtLWRpYWxpbmciLCAgICAgIFhZVEFQSV9QQVNTLCAwLAorICAgICJtb2RlbS1saWdodHMiLCAgICAgICBYWVRBUElfTEdIVCwgMCwKKyAgICAicGhvbmUtbnVtYmVyLWNvbnZlcnNpb25zIiwgICBYWVRBUElfQ09OLCAgMCwKKyAgICAicG9ydCIsICAgICAgICAgICAgICAgWFlUQVBJX0xJTiwgIENNX0lOViwKKyAgICAicG9zdC1kaWFsLXRlcm1pbmFsIiwgWFlUQVBJX1BTVCwgIDAsCisgICAgInByZS1kaWFsLXRlcm1pbmFsIiwgIFhZVEFQSV9QUkUsICAwLAorICAgICJ1c2Utd2luZG93cy1jb25maWd1cmF0aW9uIiwgWFlUQVBJX1VTRSwgMCwKKyAgICAid2FpdC1mb3ItY3JlZGl0LWNhcmQtdG9uZSIsIFhZVEFQSV9CTkcsIDAKK307CitpbnQgbnNldHRhcGl0YWIgPSAoc2l6ZW9mKHNldHRhcGl0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgKiB0YXBpbG9jdGFiID0gTlVMTDsgICAgICAvKiBNaWNyb3NvZnQgVEFQSSBMb2NhdGlvbnMgKi8KK2ludCBudGFwaWxvYyA9IDA7CitleHRlcm4gc3RydWN0IGtleXRhYiAqIHRhcGlsaW5ldGFiOyAgICAgLyogTWljcm9zb2Z0IFRBUEkgTGluZSBEZXZpY2VzICovCitleHRlcm4gaW50IG50YXBpbGluZTsKK2V4dGVybiBpbnQgdHR0YXBpOyAgICAgICAgICAgICAgICAgICAgICAvKiBUQVBJIGluIHVzZSAqLworZXh0ZXJuIGludCB0YXBpcGFzczsgICAgICAgICAgICAgICAgICAgIC8qIFRBUEkgUGFzc3Rocm91Z2ggbW9kZSAqLworZXh0ZXJuIGludCB0YXBpY29udjsgICAgICAgICAgICAgICAgICAgIC8qIFRBUEkgQ29udmVyc2lvbiBtb2RlICovCitleHRlcm4gaW50IHRhcGlsaWdodHM7CitleHRlcm4gaW50IHRhcGlwcmV0ZXJtOworZXh0ZXJuIGludCB0YXBpcG9zdHRlcm07CitleHRlcm4gaW50IHRhcGltYW51YWw7CitleHRlcm4gaW50IHRhcGlpbmFjdGl2aXR5OworZXh0ZXJuIGludCB0YXBpYm9uZzsKK2V4dGVybiBpbnQgdGFwaXVzZWNmZzsKKyNlbmRpZiAvKiBDS19UQVBJICovCisKKyNpZm5kZWYgTk9QVVNICitleHRlcm4gaW50IG5vcHVzaDsKKyNpZmRlZiBVTklYCitzdHJ1Y3Qga2V5dGFiIHdpbGR0YWJbXSA9IHsgICAgICAgICAgICAgLyogU0VUIFdJTERDQVJELUVYUEFOU0lPTiAqLworICAgICJrZXJtaXQiLCAgMCwgMCwKKyAgICAic2hlbGwiLCAgIDEsIDAKK307CitzdHJ1Y3Qga2V5dGFiIHdkb3R0YWJbXSA9IHsgICAgICAgICAgICAgLyogY29udCdkICovCisgICAgIi9tYXRjaC1kb3QtZmlsZXMiLCAgICAxLCAwLAorICAgICIvbm8tbWF0Y2gtZG90LWZpbGVzIiwgMCwgMAorfTsKK2V4dGVybiBpbnQgd2lsZHhwYW5kOworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworI2lmZGVmIE5FVENPTk4KK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIG5ldGNtZFtdLCBuZXRrZXlbXTsKK2V4dGVybiBpbnQgbm5ldHMsIG5uZXRrZXk7CisjaWZkZWYgVENQU09DS0VUCitleHRlcm4gc3RydWN0IGtleXRhYiB0Y3BvcHRbXTsKK2V4dGVybiBpbnQgbnRjcG9wdDsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNpZmRlZiBOUElQRQorY2hhciBwaXBlbmFtZVtQSVBFTkFNTCsxXSA9IHsgTlVMLCBOVUwgfTsKKyNlbmRpZiAvKiBOUElQRSAqLworI2lmZGVmIENLX05FVEJJT1MKK2V4dGVybiB1bnNpZ25lZCBjaGFyIE5ldEJpb3NOYW1lW107CisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmZGVmIEFOWVgyNQorc3RydWN0IGtleXRhYiB4MjV0YWJbXSA9IHsKKyAgICAiY2FsbC11c2VyLWRhdGEiLCAgICBYWVVEQVQsIDAsCisgICAgImNsb3NlZC11c2VyLWdyb3VwIiwgWFlDTE9TLCAwLAorICAgICJyZXZlcnNlLWNoYXJnZSIsICAgIFhZUkVWQywgMAorfTsKK2ludCBueDI1ID0gKHNpemVvZih4MjV0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2lmbmRlZiBJQk1YMjUKK3N0cnVjdCBrZXl0YWIgcGFkeDN0YWJbXSA9IHsKKyAgICAiYnJlYWstYWN0aW9uIiwgICAgICAgICBQQURfQlJFQUtfQUNUSU9OLCAgICAgICAgICAgMCwKKyAgICAiYnJlYWstY2hhcmFjdGVyIiwgICAgICBQQURfQlJFQUtfQ0hBUkFDVEVSLCAgICAgICAgMCwKKyAgICAiY2hhcmFjdGVyLWRlbGV0ZSIsICAgICBQQURfQ0hBUl9ERUxFVEVfQ0hBUiwgICAgICAgMCwKKyAgICAiY3ItcGFkZGluZyIsICAgICAgICAgICBQQURfUEFERElOR19BRlRFUl9DUiwgICAgICAgMCwKKyAgICAiZGlzY2FyZC1vdXRwdXQiLCAgICAgICBQQURfU1VQUFJFU1NJT05fT0ZfREFUQSwgICAgMCwKKyAgICAiZWNobyIsICAgICAgICAgICAgICAgICBQQURfRUNITywgICAgICAgICAgICAgICAgICAgMCwKKyAgICAiZWRpdGluZyIsICAgICAgICAgICAgICBQQURfRURJVElORywgICAgICAgICAgICAgICAgMCwKKyAgICAiZXNjYXBlIiwgICAgICAgICAgICAgICBQQURfRVNDQVBFLCAgICAgICAgICAgICAgICAgMCwKKyAgICAiZm9yd2FyZCIsICAgICAgICAgICAgICBQQURfREFUQV9GT1JXQVJEX0NIQVIsICAgICAgMCwKKyAgICAibGYtcGFkZGluZyIsICAgICAgICAgICBQQURfUEFERElOR19BRlRFUl9MRiwgICAgICAgMCwKKyAgICAibGYtaW5zZXJ0IiwgICAgICAgICAgICBQQURfTEZfQUZURVJfQ1IsICAgICAgICAgICAgMCwKKyAgICAibGluZS1kZWxldGUiLCAgICAgICAgICBQQURfQlVGRkVSX0RFTEVURV9DSEFSLCAgICAgMCwKKyAgICAibGluZS1kaXNwbGF5IiwgICAgICAgICBQQURfQlVGRkVSX0RJU1BMQVlfQ0hBUiwgICAgMCwKKyAgICAibGluZS1mb2xkIiwgICAgICAgICAgICBQQURfTElORV9GT0xESU5HLCAgICAgICAgICAgMCwKKyAgICAicGFkLWZsb3ctY29udHJvbCIsICAgICBQQURfRkxPV19DT05UUk9MX0JZX1BBRCwgICAgMCwKKyAgICAic2VydmljZS1zaWduYWxzIiwgICAgICBQQURfU1VQUFJFU1NJT05fT0ZfU0lHTkFMUywgMCwKKyAgICAidGltZW91dCIsICAgICAgICAgICAgICBQQURfREFUQV9GT1JXQVJEX1RJTUVPVVQsICAgMCwKKy8qIFNwZWVkIGlzIHJlYWQtb25seSAqLworICAgICJ0cmFuc21pc3Npb24tcmF0ZSIsICAgIFBBRF9MSU5FX1NQRUVELCAgICAgICAgICAgICAwLAorICAgICJ1c2VyLWZsb3ctY29udHJvbCIsICAgIFBBRF9GTE9XX0NPTlRST0xfQllfVVNFUiwgICAwCit9OworaW50IG5wYWR4MyA9IChzaXplb2YocGFkeDN0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNlbmRpZiAvKiBBTllYMjUgKi8KKworI2lmZGVmIFRMT0cKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHZidGFiW10gPSB7CisgICAgImJyaWVmIiwgICAwLCAwLAorI2lmZGVmIE9TMk9SVU5JWAorICAgICJmdHAiLCAgICAgMiwgMCwKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyAgICAidmVyYm9zZSIsIDEsIDAKK307CitpbnQgbnZiID0gKHNpemVvZih2YnRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworI2VuZGlmIC8qIFRMT0cgKi8KKworI2lmZGVmIENLU1lTTE9HCitzdGF0aWMgc3RydWN0IGtleXRhYiBzeXNsb2d0YWJbXSA9IHsKKyAgICAiYWxsIiwgICAgICAgICBTWVNMR19DWCwgMCwKKyAgICAiY29tbWFuZHMiLCAgICBTWVNMR19DTSwgMCwKKyAgICAiY29ubmVjdGlvbiIsICBTWVNMR19BQywgMCwKKyAgICAiZGVidWciLCAgICAgICBTWVNMR19EQiwgMCwKKyAgICAiZGlhbCIsICAgICAgICBTWVNMR19ESSwgMCwKKyAgICAiZmlsZS1hY2Nlc3MiLCBTWVNMR19GQSwgMCwKKyAgICAiZmlsZS1jcmVhdGUiLCBTWVNMR19GQywgMCwKKyAgICAibG9naW4iLCAgICAgICBTWVNMR19MSSwgMCwKKyAgICAibm9uZSIsICAgICAgICBTWVNMR19OTywgMCwKKyAgICAicHJvdG9jb2wiLCAgICBTWVNMR19QUiwgMAorfTsKK2ludCBuc3lzbG9nID0gKHNpemVvZihzeXNsb2d0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworCisvKiBQYXJpdHkga2V5d29yZCB0YWJsZSAqLworCitzdHJ1Y3Qga2V5dGFiIHBhcnRibFtdID0geworICAgICJldmVuIiwgICAgJ2UnLCAwLAorI2lmZGVmIEhXUEFSSVRZCisgICAgImhhcmR3YXJlIiwnSCcsIDAsCisjZW5kaWYgLyogSFdQQVJJVFkgKi8KKyAgICAibWFyayIsICAgICdtJywgMCwKKyAgICAibm9uZSIsICAgICAwICwgMCwKKyAgICAib2RkIiwgICAgICdvJywgMCwKKyAgICAic3BhY2UiLCAgICdzJywgMAorfTsKK2ludCBucGFyID0gKHNpemVvZihwYXJ0YmwpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2lmZGVmIEhXUEFSSVRZCitzdHJ1Y3Qga2V5dGFiIGh3cGFydGJsW10gPSB7CisvKiBBZGQgbWFyayBhbmQgc3BhY2UgaWYgbmVlZGVkIGFuZCBwb3NzaWJsZSAqLworICAgICJldmVuIiwgICAgJ2UnLCAwLAorI2lmZGVmIE9TMgorICAgICJtYXJrIiwgICAgJ20nLCAwLAorI2VuZGlmIC8qIE9TMiAqLworICAgICJvZGQiLCAgICAgJ28nLCAwLAorI2lmZGVmIE9TMgorICAgICJzcGFjZSIsICAgJ3MnLCAwLAorI2VuZGlmIC8qIE9TMiAqLworICAgICIiLCAwLCAwCit9OworaW50IG5od3BhciA9IChzaXplb2YoaHdwYXJ0YmwpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisjZW5kaWYgLyogSFdQQVJJVFkgKi8KKworLyogT24vT2ZmIHRhYmxlICovCisKK3N0cnVjdCBrZXl0YWIgb25vZmZbXSA9IHsKKyAgICAib2ZmIiwgICAgICAgMCwgMCwKKyAgICAib24iLCAgICAgICAgMSwgMAorfTsKKworI2RlZmluZSBYWUNEX00gICAgMAkJCS8qIENEIE1FU1NBR0UgKi8KKyNkZWZpbmUgWFlDRF9QICAgIDEJCQkvKiBDRCBQQVRIICovCisjZGVmaW5lIFhZQ0RfSCAgICAyCQkJLyogQ0QgSE9NRSAqLworCitzdHJ1Y3Qga2V5dGFiIGNkdGFiW10gPSB7CisgICAgImhvbWUiLCAgICAgIFhZQ0RfSCwgMCwKKyAgICAibWVzc2FnZSIsICAgWFlDRF9NLCAwLAorICAgICJwYXRoIiwgICAgICBYWUNEX1AsIDAKK307CitpbnQgbmNkdGFiID0gKHNpemVvZihjZHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdHJ1Y3Qga2V5dGFiIGNkbXNnW10gPSB7CisgICAgImZpbGUiLCAgICAgIDIsIDAsCisgICAgIm9mZiIsICAgICAgIDAsIDAsCisgICAgIm9uIiwgICAgICAgIDEsIDAKK307CitpbnQgbmNkbXNnID0gKHNpemVvZihjZG1zZykgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdGF0aWMKK3N0cnVjdCBrZXl0YWIgeGl0dGFiW10gPSB7ICAgICAgICAgICAgICAvKiBTRVQgRVhJVCAqLworICAgICJoYW5ndXAiLCAgICAgICAgMywgMCwgICAgICAgICAgICAgIC8qIC4uLkhBTkdVUCAqLworICAgICJvbi1kaXNjb25uZWN0IiwgMiwgMCwgICAgICAgICAgICAgIC8qIC4uLk9OLURJU0NPTk5FQ1QgKi8KKyAgICAic3RhdHVzIiwgICAgICAgIDAsIDAsICAgICAgICAgICAgICAvKiAuLi5TVEFUVVMgKi8KKyAgICAid2FybmluZyIsICAgICAgIDEsIDAgICAgICAgICAgICAgICAvKiAuLi5XQVJOSU5HICovCit9OworaW50IG5leGl0ID0gKHNpemVvZih4aXR0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RydWN0IGtleXRhYiB4aXR3dGFiW10gPSB7ICAgICAgICAgICAgIC8qIFNFVCBFWElUIFdBUk5JTkcgKi8KKyAgICAiYWx3YXlzIiwgMiwgMCwgICAgICAgICAgICAgICAgICAgICAvKiBldmVuIHdoZW4gbm90IGNvbm5lY3RlZCAqLworICAgICJvZmYiLCAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHdhcm5pbmcgICAgICovCisgICAgIm9uIiwgICAgIDEsIDAgICAgICAgICAgICAgICAgICAgICAgLyogd2hlbiBjb25uZWN0ZWQgKi8KK307CitpbnQgbmV4aXR3ID0gKHNpemVvZih4aXR3dGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgcmx0YWJbXSA9IHsKKyAgICAibG9jYWwiLCAgICAgMSwgMCwgICAgICAgICAgICAgICAgICAvKiBFQ0hPIHZhbHVlcyAqLworICAgICJvZmYiLCAgICAgICAwLCBDTV9JTlYsCisgICAgIm9uIiwgICAgICAgIDEsIENNX0lOViwKKyAgICAicmVtb3RlIiwgICAgMCwgMAorfTsKK2ludCBucmx0ID0gKHNpemVvZihybHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCisvKiBJbmNvbXBsZXRlIEZpbGUgRGlzcG9zaXRpb24gdGFibGUgKi8KKworc3RydWN0IGtleXRhYiBpZmR0YWJbXSA9IHsKKyAgICAiZGlzY2FyZCIsIFNFVF9PRkYsIDAsCisgICAgImtlZXAiLCAgICBTRVRfT04sICAwCit9OworCitzdHJ1Y3Qga2V5dGFiIGlmZGF0YWJbXSA9IHsKKyAgICAiYXV0byIsICAgIFNFVF9BVVRPLCAwLAorICAgICJkaXNjYXJkIiwgU0VUX09GRiwgIDAsCisgICAgImtlZXAiLCAgICBTRVRfT04sICAgMAorfTsKKworY2hhciAqIGlmZG5hbVtdID0geyAiZGlzY2FyZCIsICJrZWVwIiwgImF1dG8iIH07CisKKy8qIFNFVCBUQUtFIHBhcmFtZXRlcnMgdGFibGUgKi8KK3N0YXRpYworc3RydWN0IGtleXRhYiB0YWt0YWJbXSA9IHsKKyAgICAiZWNobyIsICAwLCAwLAorICAgICJlcnJvciIsIDEsIDAsCisgICAgIm9mZiIsICAgMiwgQ01fSU5WLCAgICAgICAgICAgICAgICAgLyogRm9yIGNvbXBhdGliaWxpdHkgKi8KKyAgICAib24iLCAgICAzLCBDTV9JTlYgICAgICAgICAgICAgICAgICAvKiB3aXRoIE1TLURPUyBLZXJtaXQuLi4gKi8KK307CisKKyNpZm5kZWYgTk9TUEwKKyNpZmRlZiBDT01NRU5UCisvKiBub3QgdXNlZCAqLworc3RhdGljCitzdHJ1Y3Qga2V5dGFiIHN1ZnRhYltdID0geyAgICAgICAgICAgICAgLyogKHdoYXQgdG8gZG8gd2l0aCkgU1RBUlRVUC1GSUxFICovCisgICAgImRlbGV0ZSIsIDEsIDAsCisgICAgImtlZXAiLCAgIDAsIDAKK307CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisvKiBTRVQgTUFDUk8gcGFyYW1ldGVycyB0YWJsZSAqLworc3RhdGljCitzdHJ1Y3Qga2V5dGFiIHNtYWN0YWJbXSA9IHsKKyAgICAiZWNobyIsICAwLCAwLAorICAgICJlcnJvciIsIDEsIDAKK307CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT1NDUklQVAorc3RhdGljCitzdHJ1Y3Qga2V5dGFiIHNjcnRhYltdID0geworICAgICJlY2hvIiwgIDAsIDAKK307CisjZW5kaWYgLyogTk9TQ1JJUFQgKi8KKworLyogU0VUIENPTU1BTkQgdGFibGUgKi8KKworLyogU0VUIENPTU1BTkQgaXRlbXMuLi4gKi8KKworI2RlZmluZSBTQ01EX0JTWiAwCS8qIEJZVEVTSVpFICovCisjZGVmaW5lIFNDTURfUkNMIDEJLyogUkVDQUxMICovCisjZGVmaW5lIFNDTURfUlRSIDIJLyogUkVUUlkgKi8KKyNkZWZpbmUgU0NNRF9RVU8gMwkvKiBRVU9USU5HICovCisjZGVmaW5lIFNDTURfQ09MIDQJLyogQ09MT1IgKi8KKyNkZWZpbmUgU0NNRF9ISUcgNQkvKiBIRUlHSFQgKi8KKyNkZWZpbmUgU0NNRF9XSUQgNgkvKiBXSURUSCAqLworI2RlZmluZSBTQ01EX0NVUiA3CS8qIENVUlNPUi1QT1NJVElPTiAqLworI2RlZmluZSBTQ01EX1NDUiA4CS8qIFNDUk9MTEJBQ0sgKi8KKyNkZWZpbmUgU0NNRF9NT1IgOQkvKiBNT1JFLVBST01QVElORyAqLworI2RlZmluZSBTQ01EX0lOVCAxMCAgICAgLyogSU5URVJSVVBUSU9OICovCisjZGVmaW5lIFNDTURfQURMIDExICAgICAvKiBBVVRPRE9XTkxPQUQgKi8KKyNkZWZpbmUgU0NNRF9TVEEgMTIgICAgIC8qIFNUQVRVU0xJTkUgKi8KKyNkZWZpbmUgU0NNRF9EQlEgMTMJLyogRE9VQkxFUVVPVElORyAqLworI2RlZmluZSBTQ01EX0NCUiAxNAkvKiBDQlJFQUsgKi8KKyNkZWZpbmUgU0NNRF9CRkwgMTUJLyogQlVGRkVSLVNJWkUgKG5vdCB1c2VkKSAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBzY21kdGFiW10gPSB7CisjaWZkZWYgQ0tfQVVUT0RMCisgICAgImF1dG9kb3dubG9hZCIsICAgICAgIFNDTURfQURMLCAwLAorI2VuZGlmIC8qIENLX0FVVE9ETCAqLworI2lmZGVmIENPTU1FTlQKKy8qCisgIFRvIGltcGxlbWVudCB0aGlzIHJlcXVpcmVzIHRoYXQgd2UgY2hhbmdlIENNREJMIGFuZCBBVE1CTAorICBmcm9tIGNvbXBpbGUtdGltZSBzeW1ib2xzIHRvIHJ1bnRpbWUgdmFyaWFibGVzLiAgTm90IGEgYmlnIGRlYWwsCisgIGJ1dCBub3QgdHJpdmlhbCBlaXRoZXIuCisgKi8KKyAgICAiYnVmZmVyLXNpemUiLCAgICAgICAgU0NNRF9CRkwsIDAsCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICJieXRlc2l6ZSIsICAgICAgICAgICBTQ01EX0JTWiwgMCwKKyAgICAiY2JyZWFrIiwgICAgICAgICAgICAgU0NNRF9DQlIsIENNX0lOViwKKyNpZmRlZiBPUzIKKyAgICAiY29sb3IiLCAgICAgICAgICAgICAgU0NNRF9DT0wsIDAsCisgICAgImN1cnNvci1wb3NpdGlvbiIsICAgIFNDTURfQ1VSLCAwLAorI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIERPVUJMRVFVT1RJTkcKKyAgICAiZG91YmxlcXVvdGluZyIsICAgICAgU0NNRF9EQlEsIDAsCisjZW5kaWYgLyogRE9VQkxFUVVPVElORyAqLworICAgICJoZWlnaHQiLCAgICAgICAgICAgICBTQ01EX0hJRywgMCwKKyAgICAiaW50ZXJydXB0aW9uIiwgICAgICAgU0NNRF9JTlQsIDAsCisgICAgIm1vcmUtcHJvbXB0aW5nIiwgICAgIFNDTURfTU9SLCAwLAorICAgICJxdW90aW5nIiwgICAgICAgICAgICBTQ01EX1FVTywgMCwKKyNpZmRlZiBDS19SRUNBTEwKKyAgICAicmVjYWxsLWJ1ZmZlci1zaXplIiwgU0NNRF9SQ0wsIDAsCisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisjaWZkZWYgQ0tfUkVDQUxMCisgICAgInJldHJ5IiwgICAgICAgICAgICAgIFNDTURfUlRSLCAwLAorI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworI2lmZGVmIE9TMgorI2lmZGVmIE9ORVRFUk1VUEQKKyAgICAic2Nyb2xsYmFjayIsICAgICAgICAgU0NNRF9TQ1IsIDAsCisgICAgInN0YXR1c2xpbmUiLCAgICAgICAgIFNDTURfU1RBLCAwLAorI2VuZGlmIC8qIE9ORVRFUk1VUEQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAid2lkdGgiLCAgICAgICAgICAgICAgU0NNRF9XSUQsIDAKK307CitzdGF0aWMgaW50IG5ieXR0ID0gKHNpemVvZihzY21kdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKKyNpZm5kZWYgTk9TRVJWRVIKKy8qIFNlcnZlciBwYXJhbWV0ZXJzIHRhYmxlICovCitzdGF0aWMgc3RydWN0IGtleXRhYiBzcnZ0YWJbXSA9IHsKKyAgICAiY2QtbWVzc2FnZSIsICAgWFlTRVJDLCAwLAorICAgICJkaXNwbGF5IiwgICAgICBYWVNFUkQsIDAsCisgICAgImdldC1wYXRoIiwgICAgIFhZU0VSUCwgMCwKKyAgICAiaWRsZS10aW1lb3V0IiwgWFlTRVJJLCAwLAorICAgICJrZWVwYWxpdmUiLCAgICBYWVNFUkssIDAsCisgICAgImxvZ2luIiwgICAgICAgIFhZU0VSTCwgMCwKKyAgICAidGltZW91dCIsICAgICAgWFlTRVJULCAwCit9Oworc3RhdGljIGludCBuc3J2dCA9IChzaXplb2Yoc3J2dGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKworc3RhdGljIHN0cnVjdCBrZXl0YWIgc2xlZXB0YWJbXSA9IHsgICAgIC8qIFNFVCBTTEVFUCB0YWJsZSAqLworICAgICJjYW5jZWxsYXRpb24iLCAgMCwgICAwCit9OworCitzdGF0aWMgc3RydWN0IGtleXRhYiB0c3RhYltdID0geyAgICAgICAgLyogU0VUIFRSQU5TRkVSL1hGRVIgdGFibGUgKi8KKyAgICAiYmVsbCIsICAgICAgICAgICAgWFlYX0JFTCwgMCwKKyNpZmRlZiBYRlJDQU4KKyAgICAiY2FuY2VsbGF0aW9uIiwgICAgWFlYX0NBTiwgMCwKKyNlbmRpZiAvKiBYRlJDQU4gKi8KKyNpZm5kZWYgTk9DU0VUUworICAgICJjaGFyYWN0ZXItc2V0IiwgICBYWVhfQ1NFLCAwLAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAiY3JjLWNhbGN1bGF0aW9uIiwgWFlYX0NSQywgMCwKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICJkaXNwbGF5IiwgICAgICAgICBYWVhfRElTLCAwLAorICAgICJpbnRlcnJ1cHRpb24iLCAgICBYWVhfSU5ULCAwLAorICAgICJsb2NraW5nLXNoaWZ0IiwgICBYWVhfTFNILCAwLAorICAgICJtZXNzYWdlIiwgICAgICAgICBYWVhfTVNHLCAwLAorICAgICJtb2RlIiwgICAgICAgICAgICBYWVhfTU9ELCAwLAorICAgICJtc2ciLCAgICAgICAgICAgICBYWVhfTVNHLCBDTV9JTlYsCisjaWZkZWYgUElQRVNFTkQKKyAgICAicGlwZXMiLCAgICAgICAgICAgWFlYX1BJUCwgMCwKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworI2lmZGVmIENLX1hZWgorICAgICJwcm90b2NvbCIsICAgICAgICBYWVhfUFJPLCAwLAorI2VuZGlmIC8qIENLX1hZWiAqLworICAgICJyZXBvcnQiLCAgICAgICAgICBYWVhfUlBULCAwLAorICAgICJzbG93LXN0YXJ0IiwgICAgICBYWVhfU0xPLCAwLAorI2lmbmRlZiBOT0NTRVRTCisgICAgInRyYW5zbGF0aW9uIiwgICAgIFhZWF9YTEEsIDAsCisjZWxzZQorICAgICJ0cmFuc2xhdGlvbiIsICAgICBYWVhfWExBLCBDTV9JTlYsCisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgICJ4bGF0aW9uIiwgICAgICAgICBYWVhfWExBLCBDTV9JTlYsCisgICAgIiIsIDAsIDAKK307CitzdGF0aWMgaW50IG50cyA9IChzaXplb2YodHN0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHJ0c3RhYltdID0geyAgICAgICAvKiBSRU1PVEUgU0VUIFRSQU5TRkVSL1hGRVIgdGFibGUgKi8KKyNpZm5kZWYgTk9DU0VUUworICAgICJjaGFyYWN0ZXItc2V0IiwgICBYWVhfQ1NFLCAwLAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICAibW9kZSIsICAgICAgICAgICAgWFlYX01PRCwgMAorfTsKK3N0YXRpYyBpbnQgbnJ0cyA9IChzaXplb2YocnRzdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgeGZybXRhYltdID0geyAgICAgICAgICAgICAvKiBUUkFOU0ZFUiBNT0RFIHRhYmxlICovCisgICAgImF1dG9tYXRpYyIsIFhNT0RFX0EsIDAsCisgICAgIm1hbnVhbCIsICAgIFhNT0RFX00sIDAKK307CisKKyNpZmRlZiBMT0NVUworZXh0ZXJuIGludCBsb2N1cywgYXV0b2xvY3VzOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBsb2N1c3RhYltdID0geworI2lmZGVmIEtVSQorICAgIHsgImFzayIsICAgICAzLCAwIH0sCQkvKiBQcmVzZW50bHkgaW1wbGVtZW50ZWQgaW4gR1VJIG9ubHkgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICB7ICJhdXRvIiwgICAgMiwgMCB9LAorICAgIHsgImxvY2FsIiwgICAxLCAwIH0sCisgICAgeyAicmVtb3RlIiwgIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmxvY3VzdGFiID0gKHNpemVvZihsb2N1c3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCisjZW5kaWYgLyogTE9DVVMgKi8KKworI2lmbmRlZiBOT0NTRVRTCisvKiBTRVQgVFJBTlNGRVIgQ0hBUkFDVEVSLVNFVCB0YWJsZSAqLworCitleHRlcm4gc3RydWN0IGtleXRhYiB0Y3N0YWJbXTsKK2V4dGVybiBpbnQgbnRjczsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKy8qIFNFVCBUUkFOU0ZFUiBMT0NLSU5HLVNISUZUIHRhYmxlICovCitzdHJ1Y3Qga2V5dGFiIGxzdGFiW10gPSB7CisgICAgImZvcmNlZCIsIDIsICAgMCwKKyAgICAib2ZmIiwgICAgMCwgICAwLAorICAgICJvbiIsICAgICAxLCAgIDAKK307CitpbnQgbmxzID0gKHNpemVvZihsc3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCisvKiBTRVQgVEVMTkVUIHRhYmxlcyAqLworI2lmZGVmIFROQ09ERQorZXh0ZXJuIGludCB0bl9ubG0sIHRuX2JfbmxtLCB0bl9iX21ldSwgdG5fYl91bWUsIHRuX2JfeGZlciwgdG5fc2JfYnVnOworZXh0ZXJuIGludCB0bl9ub19lbmNyeXB0X3hmZXIsIHRuX2F1dGhfa3JiNV9kZXNfYnVnOworZXh0ZXJuIGludCB0bl93YWl0X2ZsZywgdG5fZHVwbGV4LCB0bl9kZWxheV9zYiwgdG5fc2Z1OworZXh0ZXJuIGludCBzbF90bl9zYXZlZDsKK2V4dGVybiBpbnQgdG5faW5maW5pdGU7CitleHRlcm4gaW50IHRuX3JlbV9lY2hvOworZXh0ZXJuIGludCB0bl9kZWI7CitleHRlcm4gaW50IHRuX2F1dGhfaG93OworZXh0ZXJuIGludCB0bl9hdXRoX2VuYzsKKyNpZmRlZiBDS19GT1JXQVJEX1gKK2V4dGVybiBjaGFyICogdG5fZndkeF94YXV0aG9yaXR5OworI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCitzdGF0aWMgc3RydWN0IGtleXRhYiBzZXRhdXRoW10gPSB7CisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAiazQiLCAgICAgICAgQVVUSF9LUkI0LCBDTV9JTlYsCisgICAgIms1IiwgICAgICAgIEFVVEhfS1JCNSwgQ01fSU5WLAorICAgICJrZXJiZXJvczQiLCBBVVRIX0tSQjQsIDAsCisgICAgImtlcmJlcm9zNSIsIEFVVEhfS1JCNSwgMCwKKyAgICAia2VyYmVyb3NfaXYiLEFVVEhfS1JCNCwgQ01fSU5WLAorICAgICJrZXJiZXJvc192IiwgQVVUSF9LUkI1LCBDTV9JTlYsCisgICAgImtyYjQiLCAgICAgIEFVVEhfS1JCNCwgQ01fSU5WLAorICAgICJrcmI1IiwgICAgICBBVVRIX0tSQjUsIENNX0lOViwKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2lmZGVmIENLX1NSUAorICAgICJzcnAiLCAgICAgICBBVVRIX1NSUCwgIDAsCisjZW5kaWYgLyogQ0tfU1JQICovCisjaWZkZWYgQ0tfU1NMCisgICAgInNzbCIsICAgICAgQVVUSF9TU0wsICAgMCwKKyAgICAidGxzIiwgICAgICBBVVRIX1RMUywgICAwLAorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICIiLCAgICAgICAgIDAsICAgICAgMAorfTsKK3N0YXRpYyBpbnQgbnNldGF1dGggPSBzaXplb2Yoc2V0YXV0aCkvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpIC0gMTsKKyNpZmRlZiBDS19LRVJCRVJPUworZXh0ZXJuIGNoYXIgKiBrcmI1X2RfcHJpbmNpcGFsOyAgICAgICAgIC8qIERlZmF1bHQgcHJpbmNpcGFsICovCitleHRlcm4gY2hhciAqIGtyYjVfZF9pbnN0YW5jZTsKK2V4dGVybiBjaGFyICoga3JiNV9kX3JlYWxtOyAgICAgICAgICAgICAvKiBEZWZhdWx0IHJlYWxtICovCitleHRlcm4gY2hhciAqIGtyYjVfZF9jYzsgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBjcmVkZW50aWFscyBjYWNoZSAqLworZXh0ZXJuIGNoYXIgKiBrcmI1X2Rfc3J2OyAgICAgICAgICAgICAgIC8qIERlZmF1bHQgc2VydmljZSBuYW1lICovCitleHRlcm4gaW50ICAgIGtyYjVfZF9saWZldGltZTsgICAgICAgICAgLyogRGVmYXVsdCBsaWZldGltZSAqLworZXh0ZXJuIGludCAgICBrcmI1X2RfZm9yd2FyZGFibGU7CitleHRlcm4gaW50ICAgIGtyYjVfZF9wcm94aWFibGU7CitleHRlcm4gaW50ICAgIGtyYjVfZF9yZW5ld2FibGU7CitleHRlcm4gaW50ICAgIGtyYjVfYXV0b2dldDsKK2V4dGVybiBpbnQgICAga3JiNV9hdXRvZGVsOworZXh0ZXJuIGludCAgICBrcmI1X2RfZ2V0azQ7CitleHRlcm4gaW50ICAgIGtyYjVfY2hlY2thZGRyczsgICAgICAgICAgLyogQ2hlY2sgVEdUIEFkZHJzICovCitleHRlcm4gaW50ICAgIGtyYjVfZF9ub19hZGRyZXNzZXM7CitleHRlcm4gY2hhciAqIGtyYjVfZF9hZGRyc1tdOworZXh0ZXJuIGNoYXIgKiBrNV9rZXl0YWI7ICAgICAgICAgICAgICAgIC8qIEtleXRhYiBmaWxlICovCisKK2V4dGVybiBzdHJ1Y3Qga3JiNF9pbml0X2RhdGEga3JiNF9pbml0OworZXh0ZXJuIGNoYXIgKiBrcmI0X2RfcHJpbmNpcGFsOyAgICAgICAgIC8qIERlZmF1bHQgcHJpbmNpcGFsICovCitleHRlcm4gY2hhciAqIGtyYjRfZF9yZWFsbTsgICAgICAgICAgICAgLyogRGVmYXVsdCByZWFsbSAqLworZXh0ZXJuIGNoYXIgKiBrcmI0X2Rfc3J2OyAgICAgICAgICAgICAgIC8qIERlZmF1bHQgc2VydmljZSBuYW1lICovCitleHRlcm4gaW50ICAgIGtyYjRfZF9saWZldGltZTsgICAgICAgICAgLyogRGVmYXVsdCBsaWZldGltZSAqLworZXh0ZXJuIGludCAgICBrcmI0X2RfcHJlYXV0aDsKK2V4dGVybiBjaGFyICoga3JiNF9kX2luc3RhbmNlOworZXh0ZXJuIGludCAgICBrcmI0X2F1dG9nZXQ7CitleHRlcm4gaW50ICAgIGtyYjRfYXV0b2RlbDsKK2V4dGVybiBpbnQgICAga3JiNF9jaGVja2FkZHJzOyAgICAgICAgICAvKiBDaGVjayBUR1QgQWRkcnMgKi8KK2V4dGVybiBjaGFyICogazRfa2V5dGFiOyAgICAgICAgICAgICAgICAvKiBLZXl0YWIgZmlsZSAqLworI2lmZGVmIEtSQjQKK2V4dGVybiBpbnQgICAgazRkZWJ1ZzsKKyNlbmRpZiAvKiBLUkI0ICovCitzdGF0aWMgc3RydWN0IGtleXRhYiBrcmJ2ZXJbXSA9IHsKKyAgICAiNCIsICAgICAgICAgICAgICAgICA0LCAwLAorICAgICI1IiwgICAgICAgICAgICAgICAgIDUsIDAsCisgICAgIml2IiwgICAgICAgICAgICAgICAgNCwgQ01fSU5WLAorICAgICJ2IiwgICAgICAgICAgICAgICAgIDUsIENNX0lOVgorfTsKK3N0YXRpYyBpbnQgbmtyYnZlciA9IHNpemVvZihrcmJ2ZXIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIga2Rlc3RhYltdID0geworICAgICJuZXZlciIsICAgICAgICAgICAgS1JCX0RFTF9OTywgMCwKKyAgICAibm8iLCAgICAgICAgICAgICAgIEtSQl9ERUxfTk8sIENNX0lOViwKKyAgICAib24tY2xvc2UiLCAgICAgICAgIEtSQl9ERUxfQ0wsIDAsCisgICAgIm9uLWV4aXQiLCAgICAgICAgICBLUkJfREVMX0VYLCAwCit9Oworc3RhdGljIGludCBua2Rlc3RhYiA9IHNpemVvZihrZGVzdGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYik7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGs0dGFiW10gPSB7CisgICAgImF1dG9kZWwiLCAgICAgICAgICAgWFlLUkJERUwsIENNX0lOViwKKyAgICAiYXV0b2Rlc3Ryb3kiLCAgICAgICBYWUtSQkRFTCwgMCwKKyAgICAiYXV0b2dldCIsICAgICAgICAgICBYWUtSQkdFVCwgMCwKKyAgICAiY2hlY2stYWRkcmVzcyIsICAgICBYWUtSQkFEUiwgMCwKKyAgICAiZGVidWciLCAgICAgICAgICAgICBYWUtSQkRCRywgQ01fSU5WLAorICAgICJpbnN0YW5jZSIsICAgICAgICAgIFhZS1JCSU5TLCAwLAorICAgICJrZXl0YWIiLCAgICAgICAgICAgIFhZS1JCS1RCLCAwLAorICAgICJsaWZldGltZSIsICAgICAgICAgIFhZS1JCTElGLCAwLAorICAgICJwcmVhdXRoIiwgICAgICAgICAgIFhZS1JCUFJFLCAwLAorICAgICJwcmluY2lwYWwiLCAgICAgICAgIFhZS1JCUFIsICAwLAorICAgICJwcm9tcHQiLCAgICAgICAgICAgIFhZS1JCUFJNLCAwLAorICAgICJyZWFsbSIsICAgICAgICAgICAgIFhZS1JCUkwsICAwLAorICAgICJzZXJ2aWNlLW5hbWUiLCAgICAgIFhZS1JCU1JWLCAwCit9Oworc3RhdGljIGludCBuazR0YWIgPSBzaXplb2YoazR0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgazV0YWJbXSA9IHsKKyAgICAiYWRkcmVzc2VzIiwgICAgICAgICBYWUtSQkFERCwgMCwKKyAgICAiYXV0b2RlbGV0ZSIsICAgICAgICBYWUtSQkRFTCwgQ01fSU5WLAorICAgICJhdXRvZGVzdHJveSIsICAgICAgIFhZS1JCREVMLCAwLAorICAgICJhdXRvZ2V0IiwgICAgICAgICAgIFhZS1JCR0VULCAwLAorICAgICJjYyIsICAgICAgICAgICAgICAgIFhZS1JCQ0MsICBDTV9JTlYsCisgICAgImNoZWNrLWFkZHJlc3MiLCAgICAgWFlLUkJBRFIsIDAsCisgICAgImNyZWRlbnRpYWxzLWNhY2hlIiwgWFlLUkJDQywgIDAsCisgICAgImZvcndhcmRhYmxlIiwgICAgICAgWFlLUkJGV0QsIDAsCisgICAgImdldC1rNC10Z3QiLCAgICAgICAgWFlLUkJLNUs0LDAsCisgICAgImluc3RhbmNlIiwgICAgICAgICAgWFlLUkJJTlMsIDAsCisgICAgImtleXRhYiIsICAgICAgICAgICAgWFlLUkJLVEIsIDAsCisgICAgImxpZmV0aW1lIiwgICAgICAgICAgWFlLUkJMSUYsIDAsCisgICAgIm5vLWFkZHJlc3NlcyIsICAgICAgWFlLUkJOQUQsIDAsCisgICAgInByaW5jaXBhbCIsICAgICAgICAgWFlLUkJQUiwgIDAsCisgICAgInByb21wdCIsICAgICAgICAgICAgWFlLUkJQUk0sIDAsCisgICAgInByb3hpYWJsZSIsICAgICAgICAgWFlLUkJQUlgsIDAsCisgICAgInJlYWxtIiwgICAgICAgICAgICAgWFlLUkJSTCwgIDAsCisgICAgInJlbmV3YWJsZSIsICAgICAgICAgWFlLUkJSTlcsIDAsCisgICAgInNlcnZpY2UtbmFtZSIsICAgICAgWFlLUkJTUlYsIDAKK307CitzdGF0aWMgaW50IG5rNXRhYiA9IHNpemVvZihrNXRhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpOworCisjZGVmaW5lIEtSQl9QV19QUk0gMQorI2RlZmluZSBLUkJfUFJfUFJNIDIKKworc3RhdGljIHN0cnVjdCBrZXl0YWIga3JicHJtdGFiW10gPSB7CisgICAgInBhc3N3b3JkIiwgIEtSQl9QV19QUk0sIDAsCisgICAgInByaW5jaXBhbCIsIEtSQl9QUl9QUk0sIDAKK307CisKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2lmZGVmIENLX1NSUAorc3RhdGljIHN0cnVjdCBrZXl0YWIgc3JwdGFiW10gPSB7CisgICAgInByb21wdCIsICAgICAgICAgICAgWFlTUlBQUk0sIDAKK307CitzdGF0aWMgaW50IG5zcnB0YWIgPSBzaXplb2Yoc3JwdGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYik7CisjZGVmaW5lIFNSUF9QV19QUk0gMQorCitzdGF0aWMgc3RydWN0IGtleXRhYiBzcnBwcm10YWJbXSA9IHsKKyAgICAicGFzc3dvcmQiLCAgU1JQX1BXX1BSTSwgMAorfTsKKyNlbmRpZiAvKiBDS19TUlAgKi8KKyNpZmRlZiBDS19TU0wKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHNzbHRhYltdID0geworICAgICJjZXJ0cy1vayIsICAgICAgICAgIFhZU1NMQ09LLCAgQ01fSU5WLAorICAgICJjaXBoZXItbGlzdCIsICAgICAgIFhZU1NMQ0wsICAgMCwKKyAgICAiY3JsLWRpciIsICAgICAgICAgICBYWVNTTENSTEQsIDAsCisgICAgImNybC1maWxlIiwgICAgICAgICAgWFlTU0xDUkwsICAwLAorICAgICJkZWJ1ZyIsICAgICAgICAgICAgIFhZU1NMREJHLCAgMCwKKyAgICAiZGgta2V5LWZpbGUiLCAgICAgICBYWVNTTERLRkwsIENNX0lOViwKKyAgICAiZGgtcGFyYW0tZmlsZSIsICAgICBYWVNTTERQRkwsIDAsCisgICAgImRzYS1jZXJ0LWNoYWluLWZpbGUiLCBYWVNTTERDQ0YsIDAsCisgICAgImRzYS1jZXJ0LWZpbGUiLCAgICAgWFlTU0xEQ0ZMLCAwLAorICAgICJkc2Eta2V5LWZpbGUiLCAgICAgIFhZU1NMREtGTCwgMCwKKyAgICAiZHVtbXkiLCAgICAgICAgICAgICBYWVNTTERVTSwgIENNX0lOViwKKyAgICAib25seSIsICAgICAgICAgICAgICBYWVNTTE9OLCAgIENNX0lOViwKKyAgICAicmFuZG9tLWZpbGUiLCAgICAgICBYWVNTTFJORCwgIDAsCisgICAgInJzYS1jZXJ0LWNoYWluLWZpbGUiLCBYWVNTTFJDQ0YsIDAsCisgICAgInJzYS1jZXJ0LWZpbGUiLCAgICAgWFlTU0xSQ0ZMLCAwLAorICAgICJyc2Eta2V5LWZpbGUiLCAgICAgIFhZU1NMUktGTCwgMCwKKyAgICAidmVyYm9zZSIsICAgICAgICAgICBYWVNTTFZSQiwgIDAsCisgICAgInZlcmlmeSIsICAgICAgICAgICAgWFlTU0xWUkYsICAwLAorICAgICJ2ZXJpZnktZGlyIiwgICAgICAgIFhZU1NMVlJGRCwgMCwKKyAgICAidmVyaWZ5LWZpbGUiLCAgICAgICBYWVNTTFZSRkYsIDAKK307CitzdGF0aWMgaW50IG5zc2x0YWIgPSBzaXplb2Yoc3NsdGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYik7CitzdGF0aWMgc3RydWN0IGtleXRhYiBzc2x2ZXJ0YWJbXSA9IHsKKyAgICAiZmFpbC1pZi1uby1wZWVyLWNlcnQiLCBTU0xfVkVSSUZZX1BFRVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQsIDAsCisgICAgIm5vIiwgICAgICAgICAgICAgICBTU0xfVkVSSUZZX05PTkUsIDAsCisgICAgIm5vbmUiLCAgICAgICAgICAgICBTU0xfVkVSSUZZX05PTkUsIENNX0lOViwKKyAgICAib2ZmIiwgICAgICAgICAgICAgIFNTTF9WRVJJRllfTk9ORSwgQ01fSU5WLAorICAgICJvbiIsICAgICAgICAgICAgICAgU1NMX1ZFUklGWV9QRUVSLCBDTV9JTlYsCisgICAgInBlZXItY2VydCIsICAgICAgICBTU0xfVkVSSUZZX1BFRVIsIDAKK307CitzdGF0aWMgaW50IG5zc2x2ZXJ0YWIgPSBzaXplb2Yoc3NsdmVydGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYik7CisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyNpZmRlZiBDS19FTkNSWVBUSU9OCitpbnQgY3hfdHlwZSA9IENYX0FVVE87CitleHRlcm4gaW50IHNsX2N4X3R5cGU7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworZXh0ZXJuIGNoYXIgKnRjcF9hZGRyZXNzOworI2lmbmRlZiBOT0hUVFAKK2V4dGVybiBjaGFyICogdGNwX2h0dHBfcHJveHk7CitleHRlcm4gY2hhciAqIHRjcF9odHRwX3Byb3h5X3VzZXI7CitleHRlcm4gY2hhciAqIHRjcF9odHRwX3Byb3h5X3B3ZDsKK2V4dGVybiBjaGFyICogdGNwX2h0dHBfcHJveHlfYWdlbnQ7CisjZW5kaWYgLyogTk9IVFRQICovCisjaWZkZWYgTlQKKyNpZmRlZiBDS19TT0NLUworZXh0ZXJuIGNoYXIgKnRjcF9zb2Nrc19zdnI7CitleHRlcm4gY2hhciAqdGNwX3NvY2tzX3VzZXI7CisjaWZkZWYgQ0tfU09DS1NfTlMKK2V4dGVybiBjaGFyICp0Y3Bfc29ja3NfbnM7CisjZW5kaWYgLyogQ0tfU09DS1NfTlMgKi8KKyNlbmRpZiAvKiBDS19TT0NLUyAqLworI2VuZGlmIC8qIE5UICovCisKKyNkZWZpbmUgVVBXX1VTRVIgIDEKKyNkZWZpbmUgVVBXX1BBU1MgIDIKKyNkZWZpbmUgVVBXX0FHRU5UIDMKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgdXNlcnBhc3NbXSA9IHsKKyAgICB7ICIvYWdlbnQiLCAgIFVQV19BR0VOVCwgQ01fQVJHIH0sCisgICAgeyAiL3Bhc3N3b3JkIiwgVVBXX1BBU1MsIENNX0FSRyB9LAorICAgIHsgIi91c2VyIiwgICAgIFVQV19VU0VSLCBDTV9BUkcgfSwKK307CitzdGF0aWMgaW50IG51c2VycGFzcyA9IHNpemVvZih1c2VycGFzcykvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpOworCitzdGF0aWMgc3RydWN0IGtleXRhYiB0bm5lZ3RhYltdID0geyAgICAgLyogVEVMTkVUIE5FR09USUFUSU9OIHRhYmxlICovCisgICAgImFjY2VwdGVkIiwgIFROX05HX0FDLCAwLAorICAgICJyZWZ1c2VkIiwgICBUTl9OR19SRiwgMCwKKyAgICAicmVxIiwgICAgICAgVE5fTkdfUlEsIENNX0lOVnxDTV9BQlIsCisgICAgInJlcXUiLCAgICAgIFROX05HX1JRLCBDTV9JTlZ8Q01fQUJSLAorICAgICJyZXF1ZSIsICAgICBUTl9OR19SUSwgQ01fSU5WfENNX0FCUiwKKyAgICAicmVxdWVzIiwgICAgVE5fTkdfUlEsIENNX0lOVnxDTV9BQlIsCisgICAgInJlcXVlc3QiLCAgIFROX05HX1JRLCBDTV9JTlZ8Q01fQUJSLAorICAgICJyZXF1ZXN0ZSIsICBUTl9OR19SUSwgQ01fSU5WfENNX0FCUiwKKyAgICAicmVxdWVzdGVkIiwgVE5fTkdfUlEsIDAsCisgICAgInJlcXVpcmVkIiwgIFROX05HX01VLCAwCit9Oworc3RhdGljIGludCBudG5uZWd0YWIgPSBzaXplb2YodG5uZWd0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKTsKKworI2lmZGVmIENLX0VOQ1JZUFRJT04KK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHR5cGt3ZFtdID0geworICAgICIvdHlwZSIsIDAsIENNX0FSRworfTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgdG5lbmN0YWJbXSA9IHsgICAgIC8qIFRFTE5FVCBFTkNSWVBUSU9OIHRhYmxlICovCisgICAgImFjY2VwdGVkIiwgICBUTl9OR19BQywgICAgQ01fSU5WLAorICAgICJyZWZ1c2VkIiwgICAgVE5fTkdfUkYsICAgIENNX0lOViwKKyAgICAicmVxIiwgICAgICAgIFROX05HX1JRLCAgICBDTV9JTlZ8Q01fQUJSLAorICAgICJyZXF1IiwgICAgICAgVE5fTkdfUlEsICAgIENNX0lOVnxDTV9BQlIsCisgICAgInJlcXVlIiwgICAgICBUTl9OR19SUSwgICAgQ01fSU5WfENNX0FCUiwKKyAgICAicmVxdWVzIiwgICAgIFROX05HX1JRLCAgICBDTV9JTlZ8Q01fQUJSLAorICAgICJyZXF1ZXN0IiwgICAgVE5fTkdfUlEsICAgIENNX0lOVnxDTV9BQlIsCisgICAgInJlcXVlc3RlIiwgICBUTl9OR19SUSwgICAgQ01fSU5WfENNX0FCUiwKKyAgICAicmVxdWVzdGVkIiwgIFROX05HX1JRLCAgICBDTV9JTlYsCisgICAgInJlcXVpcmVkIiwgICBUTl9OR19NVSwgICAgQ01fSU5WLAorICAgICJzdGFydCIsICAgICAgVE5fRU5fU1RBUlQsIENNX0lOViwKKyAgICAic3RvcCIsICAgICAgIFROX0VOX1NUT1AsICBDTV9JTlYsCisgICAgInR5cGUiLCAgICAgICBUTl9FTl9UWVAsICAgMAorfTsKK3N0YXRpYyBpbnQgbnRuZW5jID0gc2l6ZW9mKHRuZW5jdGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYikgOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKworI2lmZGVmIENLX0ZPUldBUkRfWAorc3RhdGljIHN0cnVjdCBrZXl0YWIgdG5md2R4dGFiW10gPSB7ICAgIC8qIFRFTE5FVCBGT1JXQVJELVggdGFibGUgKi8KKyAgICAibm8tZW5jcnlwdGlvbiIsICAgIDEsICBDTV9JTlYsCisgICAgInhhdXRob3JpdHktZmlsZSIsICAwLCAgMAorfTsKK3N0YXRpYyBpbnQgbnRuZndkeCA9IHNpemVvZih0bmZ3ZHh0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKSA7CisjZW5kaWYgLyogQ0tfRk9SV0FSRF9YICovCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHRuYnVndGFiW10gPSB7ICAgICAvKiBURUxORVQgQlVHIHRhYmxlICovCisgICAgImF1dGgta3JiNS1kZXMiLCAgICAgICAgIDQsIDAsCisgICAgImJpbmFyeS1tZS1tZWFucy11LXRvbyIsIDAsIDAsCisgICAgImJpbmFyeS11LW1lYW5zLW1lLXRvbyIsIDEsIDAsCisgICAgImluZmluaXRlLWxvb3AtY2hlY2siLCAgIDIsIDAsCisgICAgInNiLWltcGxpZXMtd2lsbC1kbyIsICAgIDMsIDAKK307CisKKyNpZmRlZiBDS19FTlZJUk9OTUVOVAorc3RhdGljIHN0cnVjdCBrZXl0YWIgdG5lbnZ0YWJbXSA9IHsgICAgIC8qIFRFTE5FVCBFTlZJUk9OTUVOVCB0YWJsZSAqLworICAgICJhY2N0IiwgICAgIFROX0VOVl9BQ0NULCAgICAwLAorICAgICJkaXNwbGF5IiwgIFROX0VOVl9ESVNQLCAgICAwLAorICAgICJqb2IiLCAgICAgIFROX0VOVl9KT0IsICAgICAwLAorICAgICJsb2NhdGlvbiIsIFROX0VOVl9MT0MsICAgICAwLAorICAgICJvZmYiLCAgICAgIFROX0VOVl9PRkYsICAgICBDTV9JTlYsCisgICAgIm9uIiwgICAgICAgVE5fRU5WX09OLCAgICAgIENNX0lOViwKKyAgICAicHJpbnRlciIsICBUTl9FTlZfUFJOVCwgICAgMCwKKyAgICAic3lzdGVtdHlwZSIsVE5fRU5WX1NZUywgICAgMCwKKyAgICAidXNlciIsICAgICBUTl9FTlZfVVNSLCAgICAgMCwKKyAgICAidXNlcnZhciIsICBUTl9FTlZfVVZBUiwgICAgMCwKKyAgICAiIiwgMCwgMAorfTsKK3N0YXRpYyBpbnQgbnRuZW52ID0gc2l6ZW9mKHRuZW52dGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYikgLSAxOworI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorc3RhdGljIHN0cnVjdCBrZXl0YWIgdG5hdXRodGFiW10gPSB7ICAgIC8qIFRFTE5FVCBBVVRIRU5USUNBVElPTiB0YWJsZSAqLworICAgICJhY2NlcHRlZCIsICAgVE5fTkdfQUMsICBDTV9JTlYsCisgICAgImVuY3J5cHQtZmxhZyIsIFROX0FVX0VOQywgMCwKKyAgICAiZm9yd2FyZGluZyIsIFROX0FVX0ZXRCwgICAwLAorICAgICJob3ctZmxhZyIsICAgVE5fQVVfSE9XLCAgIDAsCisgICAgInJlZnVzZWQiLCAgICBUTl9OR19SRiwgIENNX0lOViwKKyAgICAicmVxIiwgICAgICAgIFROX05HX1JRLCAgQ01fSU5WfENNX0FCUiwKKyAgICAicmVxdSIsICAgICAgIFROX05HX1JRLCAgQ01fSU5WfENNX0FCUiwKKyAgICAicmVxdWUiLCAgICAgIFROX05HX1JRLCAgQ01fSU5WfENNX0FCUiwKKyAgICAicmVxdWVzIiwgICAgIFROX05HX1JRLCAgQ01fSU5WfENNX0FCUiwKKyAgICAicmVxdWVzdCIsICAgIFROX05HX1JRLCAgQ01fSU5WfENNX0FCUiwKKyAgICAicmVxdWVzdGUiLCAgIFROX05HX1JRLCAgQ01fSU5WfENNX0FCUiwKKyAgICAicmVxdWVzdGVkIiwgIFROX05HX1JRLCAgQ01fSU5WLAorICAgICJyZXF1aXJlZCIsICAgVE5fTkdfTVUsICBDTV9JTlYsCisgICAgInR5cGUiLCAgICAgICBUTl9BVV9UWVAsIDAKK307CitzdGF0aWMgaW50IG50bmF1dGggPSBzaXplb2YodG5hdXRodGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYikgOworCitzdHJ1Y3Qga2V5dGFiIGF1dHlwdGFiW10gPSB7ICAgIC8qIFRFTE5FVCBBVVRIRU5USUNBVElPTiBUWVBFIHRhYmxlICovCisgICAgImF1dG9tYXRpYyIsICBBVVRIX0FVVE8sIDAsCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAiazQiLCAgICAgICAgIEFVVEhfS1JCNCwgQ01fSU5WLAorICAgICJrNSIsICAgICAgICAgQVVUSF9LUkI1LCBDTV9JTlYsCisgICAgImtlcmJlcm9zNCIsICBBVVRIX0tSQjQsIDAsCisgICAgImtlcmJlcm9zNSIsICBBVVRIX0tSQjUsIDAsCisgICAgImtlcmJlcm9zX2l2IixBVVRIX0tSQjQsIENNX0lOViwKKyAgICAia2VyYmVyb3NfdiIsIEFVVEhfS1JCNSwgQ01fSU5WLAorICAgICJrcmI0IiwgICAgICAgQVVUSF9LUkI0LCBDTV9JTlYsCisgICAgImtyYjUiLCAgICAgICBBVVRIX0tSQjUsIENNX0lOViwKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworICAgICJub25lIiwgICAgICAgQVVUSF9OT05FLCAwLAorI2lmZGVmIE5UCisgICAgIm50bG0iLCAgICAgICBBVVRIX05UTE0sIDAsCisjZW5kaWYgLyogTlQgKi8KKyNpZmRlZiBDS19TUlAKKyAgICAic3JwIiwgICAgICAgIEFVVEhfU1JQLCAgMCwKKyNlbmRpZiAvKiBDS19TUlAgKi8KKyNpZmRlZiBDS19TU0wKKyAgICAic3NsIiwgICAgICAgIEFVVEhfU1NMLCAgMCwKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAiIiwgMCwgMAorfTsKK2ludCBuYXV0eXAgPSBzaXplb2YoYXV0eXB0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKSAtIDE7CisKK3N0cnVjdCBrZXl0YWIgYXVob3d0YWJbXSA9IHsgICAgLyogVEVMTkVUIEFVVEhFTlRJQ0FUSU9OIEhPVyB0YWJsZSAqLworICAgICJhbnkiLCAgICAgVE5fQVVUSF9IT1dfQU5ZLCAgICAgMCwKKyAgICAibXV0dWFsIiwgIFROX0FVVEhfSE9XX01VVFVBTCwgIDAsCisgICAgIm9uZS13YXkiLCBUTl9BVVRIX0hPV19PTkVfV0FZLCAwLAorICAgICIiLCAwLCAwCit9OworaW50IG5hdWhvdyA9IHNpemVvZihhdWhvd3RhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpIC0gMTsKKworc3RydWN0IGtleXRhYiBhdWVuY3RhYltdID0geyAgICAvKiBURUxORVQgQVVUSEVOVElDQVRJT04gRU5DUllQVCB0YWJsZSAqLworICAgICJhbnkiLCAgICAgVE5fQVVUSF9FTkNfQU5ZLCAgICAgMCwKKyAgICAibm9uZSIsICAgIFROX0FVVEhfRU5DX05PTkUsICAgIDAsCisgICAgInRlbG9wdCIsICBUTl9BVVRIX0VOQ19URUxPUFQsICAwLAorI2lmZGVmIENLX1NTTAorICAgICJ0bHMiLCAgICAgVE5fQVVUSF9FTkNfVExTLCAgICAgMCwKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAiIiwgMCwgMAorfTsKK2ludCBuYXVlbmMgPSBzaXplb2YoYXVlbmN0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKSAtIDE7CisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKworI2RlZmluZSBUTl9OTF9CSU4gMworI2RlZmluZSBUTl9OTF9OVlQgNAorc3RhdGljIHN0cnVjdCBrZXl0YWIgdG5fbmxtdGFiW10gPSB7ICAgIC8qIFRFTE5FVCBORVdMSU5FLU1PREUgdGFibGUgKi8KKyAgICAiYmluYXJ5LW1vZGUiLCBUTl9OTF9CSU4sIDAsICAgICAgICAvKiBCaW5hcnkgbW9kZSAqLworICAgICJudnQiLCAgICBUTl9OTF9OVlQsIDAsICAgICAgICAgICAgIC8qIE5WVCBtb2RlICovCisgICAgIm9mZiIsICAgIFROTF9DUk5VTCwgQ01fSU5WLCAgICAgICAgLyogQ1ItTlVMIChURUxORVQgc3BlYykgKi8KKyAgICAib24iLCAgICAgVE5MX0NSTEYsICBDTV9JTlYsICAgICAgICAvKiBDUi1MRiAoVEVMTkVUIHNwZWMpICovCisgICAgInJhdyIsICAgIFROTF9DUiwgICAgQ01fSU5WICAgICAgICAgLyogQ1Igb25seSAob3V0IG9mIHNwZWMpICovCit9Oworc3RhdGljIGludCBudG5fbmxtID0gKHNpemVvZih0bl9ubG10YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgdG5sbXRhYltdID0geyAgICAgIC8qIFRFTE5FVCBORVdMSU5FLU1PREUgdGFibGUgKi8KKyAgICAiY3IiLCAgICAgVE5MX0NSLCAgICBDTV9JTlYsICAgICAgICAvKiBDUiBvbmx5IChvdXQgb2Ygc3BlYykgKi8KKyAgICAiY3ItbGYiLCAgVE5MX0NSTEYsICBDTV9JTlYsICAgICAgICAvKiBDUi1MRiAoVEVMTkVUIHNwZWMpICovCisgICAgImNyLW51bCIsIFROTF9DUk5VTCwgQ01fSU5WLCAgICAgICAgLyogQ1ItTlVMIChURUxORVQgc3BlYykgKi8KKyAgICAibGYiLCAgICAgVE5MX0xGLCAgICBDTV9JTlYsICAgICAgICAvKiBMRiBpbnN0ZWFkIG9mIENSLUxGICovCisgICAgIm9mZiIsICAgIFROTF9DUk5VTCwgMCwgICAgICAgICAgICAgLyogQ1ItTlVMIChURUxORVQgc3BlYykgKi8KKyAgICAib24iLCAgICAgVE5MX0NSTEYsICAwLCAgICAgICAgICAgICAvKiBDUi1MRiAoVEVMTkVUIHNwZWMpICovCisgICAgInJhdyIsICAgIFROTF9DUiwgICAgMCAgICAgICAgICAgICAgLyogQ1Igb25seSAob3V0IG9mIHNwZWMpICovCit9Oworc3RhdGljIGludCBudG5sbSA9IChzaXplb2YodG5sbXRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdHJ1Y3Qga2V5dGFiIHRudGFiW10gPSB7CisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICAiYXV0aGVudGljYXRpb24iLCAgICAgICBDS19UTl9BVSwgIDAsCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyAgICAiYiIsICAgICAgICAgICAgICAgICAgICBDS19UTl9CTSwgIENNX0lOVnxDTV9BQlIsCisgICAgImJpIiwgICAgICAgICAgICAgICAgICAgQ0tfVE5fQk0sICBDTV9JTlZ8Q01fQUJSLAorICAgICJiaW4iLCAgICAgICAgICAgICAgICAgIENLX1ROX0JNLCAgQ01fSU5WfENNX0FCUiwKKyAgICAiYmluYSIsICAgICAgICAgICAgICAgICBDS19UTl9CTSwgIENNX0lOVnxDTV9BQlIsCisgICAgImJpbmFyIiwgICAgICAgICAgICAgICAgQ0tfVE5fQk0sICBDTV9JTlZ8Q01fQUJSLAorICAgICJiaW5hcnkiLCAgICAgICAgICAgICAgIENLX1ROX0JNLCAgQ01fSU5WfENNX0FCUiwKKyAgICAiYmluYXJ5LSIsICAgICAgICAgICAgICBDS19UTl9CTSwgIENNX0lOVnxDTV9BQlIsCisgICAgImJpbmFyeS1tb2RlIiwgICAgICAgICAgQ0tfVE5fQk0sICBDTV9JTlYsCisgICAgImJpbmFyeS10cmFuc2Zlci1tb2RlIiwgQ0tfVE5fWEYsICAwLAorICAgICJiaW5hcnkteGZlci1tb2RlIiwgICAgIENLX1ROX1hGLCAgQ01fSU5WLAorICAgICJidWciLCAgICAgICAgICAgICAgICAgIENLX1ROX0JVRywgMCwKKyAgICAiZGVidWciLCAgICAgICAgICAgICAgICBDS19UTl9EQiwgIDAsCisgICAgImRlbGF5LXNiIiwgICAgICAgICAgICAgQ0tfVE5fREwsICAwLAorICAgICJlY2hvIiwgICAgICAgICAgICAgICAgIENLX1ROX0VDLCAgMCwKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgImVuY3J5cHRpb24iLCAgICAgIENLX1ROX0VOQywgIDAsCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmIENLX0VOVklST05NRU5UCisgICAgImVudmlyb25tZW50IiwgICAgIENLX1ROX0VOViwgIDAsCisjZW5kaWYgLyogQ0tfRU5WSVJPTk1FTlQgKi8KKyNpZmRlZiBDS19GT1JXQVJEX1gKKyAgICAiZm9yd2FyZC14IiwgICAgICAgQ0tfVE5fRlgsICAgMCwKKyNlbmRpZiAvKiBDS19GT1JXQVJEX1ggKi8KKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgImtlcm1pdCIsICAgICAgICAgIENLX1ROX0lLUywgIENNX0lOViwKKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisjaWZkZWYgQ0tfU05ETE9DCisgICAgImxvY2F0aW9uIiwgICAgICAgIENLX1ROX0xPQywgIDAsCisjZW5kaWYgLyogQ0tfU05ETE9DICovCisjaWZkZWYgQ0tfTkFXUworICAgICJuYXdzIiwgICAgICAgICAgICBDS19UTl9OQVdTLCBDTV9JTlYsCisjZW5kaWYgLyogQ0tfTkFXUyAqLworICAgICJuZXdsaW5lLW1vZGUiLCAgICBDS19UTl9OTCwgICAwLAorICAgICJuby1lbmNyeXB0LWR1cmluZy14ZmVyIiwgQ0tfVE5fTkUsIENNX0lOViwKKyAgICAicHJvbXB0LWZvci11c2VyaWQiLENLX1ROX1BVSUQsMCwKKyAgICAicmVtb3RlLWVjaG8iLCAgICAgQ0tfVE5fUkUsICAgMCwKKyNpZmRlZiBDS19TU0wKKyAgICAic3RhcnQtdGxzIiwgICAgICAgQ0tfVE5fVExTLCAgQ01fSU5WLAorI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIE5UCisgICAgInNmdS1jb21wYXRpYmlsaXR5IiwgQ0tfVE5fU0ZVLCAwLAorI2Vsc2UKKyAgICAic2Z1LWNvbXBhdGliaWxpdHkiLCBDS19UTl9TRlUsIENNX0lOViwKKyNlbmRpZiAvKiBOVCAqLworICAgICJ0ZXJtaW5hbC10eXBlIiwgICBDS19UTl9UVCwgICAwLAorICAgICJ3YWl0LWZvci1uZWdvdGlhdGlvbnMiLCBDS19UTl9XQUlULCAwLAorI2lmZGVmIENLX0VOVklST05NRU5UCisgICAgInhkaXNwbGF5LWxvY2F0aW9uIixDS19UTl9YRCwgQ01fSU5WLAorI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisgICAgIiIsIDAsIDAKK307CitpbnQgbnRuID0gKHNpemVvZih0bnRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RydWN0IGtleXRhYiB0bm9wdHRhYltdID0geworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgImF1dGhlbnRpY2F0aW9uIiwgIENLX1ROX0FVLCAgIDAsCisjZWxzZQorICAgICJhdXRoZW50aWNhdGlvbiIsICBDS19UTl9BVSwgICBDTV9JTlYsCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyAgICAiYmluYXJ5LW1vZGUiLCAgICAgQ0tfVE5fQk0sICAgMCwKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgImMiLCAgICAgICAgICAgICAgIENLX1ROX0NQQywgICBDTV9JTlZ8Q01fQUJSLAorICAgICJjbyIsICAgICAgICAgICAgICBDS19UTl9DUEMsICAgQ01fSU5WfENNX0FCUiwKKyAgICAiY29tIiwgICAgICAgICAgICAgQ0tfVE5fQ1BDLCAgIENNX0lOVnxDTV9BQlIsCisgICAgImNvbS1wb3J0LWNvbnRyb2wiLENLX1ROX0NQQywgICAwLAorICAgICJjb21wb3J0LWNvbnRyb2wiLCBDS19UTl9DUEMsICAgQ01fSU5WLAorI2Vsc2UgLyogVE5fQ09NUE9SVCAqLworICAgICJjb20tcG9ydC1jb250cm9sIixDS19UTl9DUEMsICBDTV9JTlYsCisgICAgImNvbXBvcnQtY29udHJvbCIsIENLX1ROX0NQQywgICBDTV9JTlYsCisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworICAgICJlY2hvIiwgICAgICAgICAgICBDS19UTl9FQywgICAwLAorI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAiZW5jcnlwdGlvbiIsICAgICAgQ0tfVE5fRU5DLCAgMCwKKyNlbHNlCisgICAgImVuY3J5cHRpb24iLCAgICAgIENLX1ROX0VOQywgIENNX0lOViwKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjaWZkZWYgQ0tfRk9SV0FSRF9YCisgICAgImZvcndhcmQteCIsICAgICAgIENLX1ROX0ZYLCAgIDAsCisjZWxzZSAvKiBDS19GT1JXQVJEX1ggKi8KKyAgICAiZm9yd2FyZC14IiwgICAgICAgQ0tfVE5fRlgsICAgQ01fSU5WLAorI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworICAgICJpYm0tc2FrIiwgICAgICAgICBDS19UTl9TQUssICBDTV9JTlYsCisjaWZkZWYgSUtTX09QVElPTgorICAgICJrZXJtaXQiLCAgICAgICAgICBDS19UTl9JS1MsICAwLAorI2Vsc2UKKyAgICAia2VybWl0IiwgICAgICAgICAgQ0tfVE5fSUtTLCAgQ01fSU5WLAorI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKyAgICAibGZsb3ciLCAgICAgICAgICAgQ0tfVE5fRkxXLCAgQ01fSU5WLAorICAgICJsb2dvdXQiLCAgICAgICAgICBDS19UTl9MT0csICAwLAorI2lmZGVmIENLX05BV1MKKyAgICAibmF3cyIsICAgICAgICAgICAgQ0tfVE5fTkFXUywgMCwKKyNlbHNlCisgICAgIm5hd3MiLCAgICAgICAgICAgIENLX1ROX05BV1MsIENNX0lOViwKKyNlbmRpZiAvKiBDS19OQVdTICovCisjaWZkZWYgQ0tfRU5WSVJPTk1FTlQKKyAgICAibmV3LWVudmlyb25tZW50IiwgQ0tfVE5fRU5WLCAgMCwKKyNlbHNlCisgICAgIm5ldy1lbnZpcm9ubWVudCIsIENLX1ROX0VOViwgIENNX0lOViwKKyNlbmRpZiAvKiBDS19FTlZJUk9OTUVOVCAqLworICAgICJwcmFnbWEtaGVhcnRiZWF0IixDS19UTl9QSFIsICBDTV9JTlYsCisgICAgInByYWdtYS1sb2dvbiIsICAgIENLX1ROX1BMRywgIENNX0lOViwKKyAgICAicHJhZ21hLXNzcGkiLCAgICAgQ0tfVE5fUFNQLCAgQ01fSU5WLAorICAgICJzYWsiLCAgICAgICAgICAgICBDS19UTl9TQUssICBDTV9JTlYsCisjaWZkZWYgQ0tfU05ETE9DCisgICAgInNlbmQtbG9jYXRpb24iLCAgIENLX1ROX0xPQywgIDAsCisjZWxzZQorICAgICJzZW5kLWxvY2F0aW9uIiwgICBDS19UTl9MT0MsICBDTV9JTlYsCisjZW5kaWYgLyogQ0tfU05ETE9DICovCisgICAgInNnYSIsICAgICAgICAgICAgIENLX1ROX1NHQSwgQ01fSU5WfENNX0FCUiwKKyNpZmRlZiBDS19TU0wKKyAgICAic3RhcnQtdGxzIiwgICAgICAgQ0tfVE5fVExTLCAgMCwKKyNlbHNlCisgICAgInN0YXJ0LXRscyIsICAgICAgIENLX1ROX1RMUywgIENNX0lOViwKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAic3VwcHJlc3MtZ28tYWhlYWRzIiwgQ0tfVE5fU0dBLCAwLAorICAgICJ0ZXJtaW5hbC10eXBlIiwgICBDS19UTl9UVCwgICAwLAorICAgICJ0dHlwZSIsICAgICAgICAgICBDS19UTl9UVCwgICBDTV9JTlZ8Q01fQUJSLAorI2lmZGVmIENLX0VOVklST05NRU5UCisgICAgInhkaXNwbGF5LWxvY2F0aW9uIiwgQ0tfVE5fWEQsIDAsCisjZWxzZQorICAgICJ4ZGlzcGxheS1sb2NhdGlvbiIsIENLX1ROX1hELCBDTV9JTlYsCisjZW5kaWYgLyogQ0tfRU5WSVJPTk1FTlQgKi8KKyAgICAiIiwgMCwgMAorfTsKK2ludCBudG5vcHQgPSAoc2l6ZW9mKHRub3B0dGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCitzdHJ1Y3Qga2V5dGFiIHRub3B0c3dbXSA9IHsKKyAgICAiL2NsaWVudCIsICBDS19UTl9DTElFTlQsICAgMCwKKyAgICAiL3NlcnZlciIsICBDS19UTl9TRVJWRVIsICAgMAorfTsKK2ludCBudG5vcHRzdyA9IChzaXplb2YodG5vcHRzdykgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworI2VuZGlmIC8qIFROQ09ERSAqLworCitzdHJ1Y3Qga2V5dGFiIGZ0cnRhYltdID0geyAgICAgICAgICAgICAgLyogRmVhdHVyZSB0YWJsZSAqLworI2lmbmRlZiBOT0NTRVRTICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgPSB3ZSBoYXZlIGl0LCAxID0gd2UgZG9uJ3QgKi8KKyJjaGFyYWN0ZXItc2V0cyIsICAgICAgIDAsIDAsCisjZWxzZQorImNoYXJhY3Rlci1zZXRzIiwgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisjaWZuZGVmIE5PQ1lSSUwKKyJjeXJpbGxpYyIsICAgICAgICAgICAgIDAsIDAsCisjZWxzZQorImN5cmlsbGljIiwgICAgICAgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBOT0NZUklMICovCisKKyNpZm5kZWYgTk9MT0dESUFMCisiY3gtbG9nIiwgICAgICAgICAgICAgICAwLCAwLAorI2Vsc2UKKyJjeC1sb2ciLCAgICAgICAgICAgICAgIDEsIDAsCisjZW5kaWYgLyogTk9MT0dESUFMICovCisKKyNpZm5kZWYgTk9ERUJVRworImRlYnVnIiwgICAgICAgICAgICAgICAgMCwgMCwKKyNlbHNlCisiZGVidWciLCAgICAgICAgICAgICAgICAxLCAwLAorI2VuZGlmIC8qIE5PREVCVUcgKi8KKworI2lmbmRlZiBOT0RJQUwKKyJkaWFsIiwgICAgICAgICAgICAgICAgIDAsIDAsCisjZWxzZQorImRpYWwiLCAgICAgICAgICAgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworI2lmZGVmIERZTkFNSUMKKyJkeW5hbWljLW1lbW9yeSIsICAgICAgIDAsIDAsCisjZWxzZQorImR5bmFtaWMtbWVtb3J5IiwgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBEWU5BTUlDICovCisKKyNpZm5kZWYgTk9YRkVSCisiZmlsZS10cmFuc2ZlciIsICAgICAgICAwLCAwLAorI2Vsc2UKKyJmaWxlLXRyYW5zZmVyIiwgICAgICAgIDEsIDAsCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBYWEZXRAorImZvcndhcmQiLCAgICAgICAgICAgICAgMCwgMCwKKyNlbHNlCisiZm9yd2FyZCIsICAgICAgICAgICAgICAxLCAwLAorI2VuZGlmIC8qIFhYRldEICovCisKKyNpZmRlZiBORVdGVFAKKyJmdHAiLCAgICAgICAgICAgICAgICAgIDAsIDAsCisjZWxzZQorImZ0cCIsICAgICAgICAgICAgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBORVdGVFAgKi8KKworI2lmZGVmIENLX0NVUlNFUworImZ1bGxzY3JlZW4tZGlzcGxheSIsICAgMCwgMCwKKyNlbHNlCisiZnVsbHNjcmVlbi1kaXNwbGF5IiwgICAxLCAwLAorI2VuZGlmIC8qIENLX0NVUlNFUyAqLworI2lmZGVmIEdSRUVLCisiZ3JlZWsiLCAgICAgICAgICAgICAgICAwLCAwLAorI2Vsc2UKKyJncmVlayIsICAgICAgICAgICAgICAgIDEsIDAsCisjZW5kaWYgLyogR1JFRUsgKi8KKyNpZmRlZiBIRUJSRVcKKyJoZWJyZXciLCAgICAgICAgICAgICAgIDAsIDAsCisjZWxzZQorImhlYnJldyIsICAgICAgICAgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBIRUJSRVcgKi8KKyNpZm5kZWYgTk9IRUxQCisiaGVscCIsICAgICAgICAgICAgICAgICAwLCAwLAorI2Vsc2UKKyJoZWxwIiwgICAgICAgICAgICAgICAgIDEsIDAsCisjZW5kaWYgLyogTk9IRUxQICovCisKKyNpZm5kZWYgTk9JS1NECisiaWtzZCIsICAgICAgICAgICAgICAgICAwLCAwLAorI2Vsc2UKKyJpa3NkIiwgICAgICAgICAgICAgICAgIDEsIDAsCisjZW5kaWYgLyogTk9JS1NEICovCisKKyNpZm5kZWYgTk9TUEwKKyJpZi1jb21tYW5kIiwgICAgICAgICAgIDAsIDAsCisjZWxzZQorImlmLWNvbW1hbmQiLCAgICAgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBOT0pDCisjaWZkZWYgVU5JWAorImpvYi1jb250cm9sIiwgICAgICAgICAgMCwgMCwKKyNlbHNlCisiam9iLWNvbnRyb2wiLCAgICAgICAgICAxLCAwLAorI2VuZGlmIC8qIFVOSVggKi8KKyNlbHNlCisiam9iLWNvbnRyb2wiLCAgICAgICAgICAxLCAwLAorI2VuZGlmIC8qIE5PSkMgKi8KKyNpZmRlZiBLQU5KSQorImthbmppIiwgICAgICAgICAgICAgICAgMCwgMCwKKyNlbHNlCisia2FuamkiLCAgICAgICAgICAgICAgICAxLCAwLAorI2VuZGlmIC8qIEtBTkpJICovCisKKyNpZm5kZWYgTk9YRkVSCisia2VybWl0IiwgICAgICAgICAgICAgICAwLCAwLAorI2Vsc2UKKyJrZXJtaXQiLCAgICAgICAgICAgICAgIDEsIDAsCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBDS19LRVJCRVJPUworImtlcmJlcm9zIiwgICAgICAgICAgICAgMCwgMCwKKyNlbHNlCisia2VyYmVyb3MiLCAgICAgICAgICAgICAxLCAwLAorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKyNpZm5kZWYgTk9DU0VUUworImxhdGluMSIsICAgICAgICAgICAgICAgMCwgMCwKKyNlbHNlCisibGF0aW4xIiwgICAgICAgICAgICAgICAxLCAwLAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyNpZmRlZiBMQVRJTjIKKyJsYXRpbjIiLCAgICAgICAgICAgICAgIDAsIDAsCisjZWxzZQorImxhdGluMiIsICAgICAgICAgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBMQVRJTjIgKi8KKworI2lmZGVmIENLTEVBUk4KKyJsZWFybmVkLXNjcmlwdHMiLCAgICAgICAwLCAwLAorI2Vsc2UKKyJsZWFybmVkLXNjcmlwdHMiLCAgICAgICAxLCAwLAorI2VuZGlmIC8qIENLTEVBUk4gKi8KKworI2lmbmRlZiBOT0xPQ0FMCisibWFraW5nLWNvbm5lY3Rpb25zIiwgICAwLCAwLAorI2Vsc2UKKyJtYWtpbmctY29ubmVjdGlvbnMiLCAgIDEsIDAsCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZkZWYgTkVUQ09OTgorIm5ldHdvcmsiLCAgICAgICAgICAgICAgMCwgMCwKKyNlbHNlCisibmV0d29yayIsICAgICAgICAgICAgICAxLCAwLAorI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmZGVmIE5UCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyJudGxtIiwgICAgICAgICAgICAgICAgIDEsIDAsCisjZWxzZSAvKiBDS19BVVRIRU5USUNBVElPTiAqLworIm50bG0iLCAgICAgICAgICAgICAgICAgMCwgMCwKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2Vsc2UgLyogTlQgKi8KKyJudGxtIiwgICAgICAgICAgICAgICAgIDAsIDAsCisjZW5kaWYgLyogTlQgKi8KKworI2lmZGVmIFBJUEVTRU5ECisicGlwZXMiLCAgICAgICAgICAgICAgICAwLCAwLAorI2Vsc2UKKyNpZmRlZiBORVRDTUQKKyJwaXBlcyIsICAgICAgICAgICAgICAgIDAsIDAsCisjZW5kaWYgLyogTkVUQ01EICovCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyNpZm5kZWYgUElQRVNFTkQKKyNpZm5kZWYgTkVUQ01ECisicGlwZXMiLCAgICAgICAgICAgICAgICAxLCAwLAorI2VuZGlmIC8qIFBJUEVTRU5EICovCisjZW5kaWYgLyogTkVUQ01EICovCisKKyNpZmRlZiBORVRQVFkKKyJwdHkiLCAgICAgICAgICAgICAgICAgIDAsIDAsCisjZWxzZQorInB0eSIsICAgICAgICAgICAgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBORVRQVFkgKi8KKworI2lmbmRlZiBOT1BVU0gKKyJwdXNoIiwgICAgICAgICAgICAgICAgIDAsIDAsCisjZWxzZQorInB1c2giLCAgICAgICAgICAgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBQVVNIICovCisKKyNpZmRlZiBDS19SRURJUgorInJlZGlyZWN0IiwgICAgICAgICAgICAgMCwgMCwKKyNlbHNlCisicmVkaXJlY3QiLCAgICAgICAgICAgICAxLCAwLAorI2VuZGlmIC8qIENLX1JFRElSICovCisKKyNpZmRlZiBDS19SVFNDVFMKKyJydHMvY3RzIiwgICAgICAgICAgICAgIDAsIDAsCisjZWxzZQorInJ0cy9jdHMiLCAgICAgICAgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBSVFMvQ1RTICovCisKKyNpZm5kZWYgTk9TQ1JJUFQKKyJzY3JpcHQtY29tbWFuZCIsICAgICAgIDAsIDAsCisjZWxzZQorInNjcmlwdC1jb21tYW5kIiwgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBOT1NDUklQVCAqLworI2lmbmRlZiBOT1NFUlZFUgorInNlcnZlci1tb2RlIiwgICAgICAgICAgMCwgMCwKKyNlbHNlCisic2VydmVyLW1vZGUiLCAgICAgICAgICAxLCAwLAorI2VuZGlmIC8qIE5PU0VSVkVSICovCisKKyNpZm5kZWYgTk9TRVhQCisic2V4cHJlc3Npb24iLCAgICAgICAgICAwLCAwLAorI2Vsc2UKKyJzZXhwcmVzc2lvbiIsICAgICAgICAgIDEsIDAsCisjZW5kaWYgLyogTk9TRVhQICovCisKKyNpZmRlZiBTRlRQX0JVSUxUSU4KKyJzZnRwIiwgICAgICAgICAgICAgICAgIDEsIDAsCisjZWxzZQorInNmdHAiLCAgICAgICAgICAgICAgICAgMCwgMCwKKyNlbmRpZiAvKiBTRlRQX0JVSUxUSU4gKi8KKworI2lmbmRlZiBOT1NIT1cKKyJzaG93LWNvbW1hbmQiLCAgICAgICAgIDAsIDAsCisjZWxzZQorInNob3ctY29tbWFuZCIsICAgICAgICAgMSwgMCwKKyNlbmRpZiAvKiBOT1NIT1cgKi8KKworI2lmZGVmIENLX1NSUAorInNycCIsICAgICAgICAgICAgICAgICAgMCwgMCwKKyNlbHNlCisic3JwIiwgICAgICAgICAgICAgICAgICAxLCAwLAorI2VuZGlmIC8qIENLX1NSUCAqLworCisjaWZkZWYgU1NIQlVJTFRJTgorInNzaCIsICAgICAgICAgICAgICAgICAgMCwgMCwKKyNlbHNlIC8qIFNTSEJVSUxUSU4gKi8KKyJzc2giLCAgICAgICAgICAgICAgICAgIDEsIDAsCisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworCisjaWZkZWYgQ0tfU1NMCisic3NsL3RscyIsICAgICAgICAgICAgICAwLCAwLAorI2Vsc2UKKyJzc2wvdGxzIiwgICAgICAgICAgICAgIDEsIDAsCisjZW5kaWYgLyogQ0tfU1NMICovCisKKyNpZm5kZWYgTk9YTUlUCisidHJhbnNtaXQiLCAgICAgICAgICAgICAwLCAwLAorI2Vsc2UKKyJ0cmFuc21pdCIsICAgICAgICAgICAgIDEsIDAsCisjZW5kaWYgLyogTk9YTUlUICovCisKKyNpZmRlZiBVTklDT0RFCisidW5pY29kZSIsICAgICAgICAgICAgICAwLCAwLAorI2Vsc2UKKyJ1bmljb2RlIiwgICAgICAgICAgICAgIDEsIDAsCisjZW5kaWYgLyogVU5JQ09ERSAqLworCisjaWZkZWYgQ0tfWFlaCisieHl6bW9kZW0iLCAgICAgICAgICAgICAwLCAwLAorI2Vsc2UKKyJ4eXptb2RlbSIsICAgICAgICAgICAgIDEsIDAsCisjZW5kaWYgLyogTk9YTUlUICovCisKKyIiLCAwLCAwCit9OworaW50IG5mdHIgPSAoc2l6ZW9mKGZ0cnRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RydWN0IGtleXRhYiBkZXN0dGFiW10gPSB7ICAgICAgICAgICAgIC8qIFNFVCBERVNUSU5BVElPTiAqLworI2lmZGVmIENBTElCUkFURQorICAgICJjYWxpYnJhdGUiLCBERVNUX04sIENNX0lOViwKKyNlbmRpZiAvKiBDQUxJQlJBVEUgKi8KKyAgICAiZGlzayIsICAgIERFU1RfRCwgMCwKKyNpZmRlZiBDQUxJQlJBVEUKKyAgICAibm93aGVyZSIsIERFU1RfTiwgMCwKKyNlbmRpZiAvKiBDQUxJQlJBVEUgKi8KKyAgICAicHJpbnRlciIsIERFU1RfUCwgMCwKKyAgICAic2NyZWVuIiwgIERFU1RfUywgMAorfTsKK2ludCBuZGVzdHMgPSAgKHNpemVvZihkZXN0dGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKKyNpZm5kZWYgTk9TUEwgICAgICAgICAgIC8qIFVzZWQgb25seSB3aXRoIHNjcmlwdCBwcm9ncmFtbWluZyBpdGVtcy4uLiAqLworCisjaWZuZGVmIE5PU0VSVkVSICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBqdXN0IHRvIGF2b2lkIHNvbWUgKi8KKyNkZWZpbmUgQ0tfUEFSU0RJUiAgICAgICAgICAgICAgICAgICAgICAvKiAic3RhdGVtZW50IG5vdCByZWFjaGVkIiAqLworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBsYWludHMuLi4gKi8KKyNpZm5kZWYgTk9ESUFMCisjZGVmaW5lIENLX1BBUlNESVIKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworCisvKgorICBjeCA9PSAwIG1lYW5zIGRpYWwgZGlyZWN0b3J5CisgIGN4ID09IDEgbWVhbnMgbmV0d29yayBkaXJlY3RvcnkKKyAgY3ggPT0gMiBtZWFucyBhIGRpcmVjdG9yeSBwYXRoIGxpc3QKKyovCitzdGF0aWMgaW50CitwYXJzZGlyKGN4KSBpbnQgY3g7IHsKKyAgICBpbnQgaSwgeCwgeSwgZGQ7ICAgICAgICAgICAgICAgICAgICAvKiBXb3JrZXJzICovCisgICAgaW50IG54ZGlyOworICAgIGNoYXIgKnM7CisgICAgY2hhciAqKiB4ZGlyOworICAgIGNoYXIgKnBwW01BWEdFVFBBVEhdOyAgICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBuYW1lIHBvaW50ZXJzICovCisjaWZkZWYgWkZOUUZQCisgICAgc3RydWN0IHpmbmZwICogZm5wOworI2lmZGVmIE9TMgorICAgIGNoYXIgKiBlbnY7CisgICAgY2hhciBkaXJwYXRoWzQwOTZdOworI2Vsc2UgLyogT1MyICovCisgICAgY2hhciBkaXJwYXRoWzEwMjRdOyAgICAgICAgICAgICAgICAgLyogRm9yIGZ1bGx5IHF1YWxpZmllZCBmaWxlbmFtZXMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBaRk5RRlAgKi8KKworICAgIGludCBtYXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIHRoaW5ncyB0byBwYXJzZSAqLworICAgIGNoYXIgYzsKKworI2lmbmRlZiBOT0RJQUwKKyAgICBpZiAoY3ggPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAvKiBEaWFsaW5nICovCisgICAgICAgIG54ZGlyID0gbmRpYWxkaXI7CisgICAgICAgIHhkaXIgPSBkaWFsZGlyOworICAgICAgICBtYXggPSBNQVhERElSOworICAgIH0gZWxzZQorI2lmZGVmIE5FVENPTk4KKyAgICBpZiAoY3ggPT0gMSkgeyAgICAgICAgICAgICAgICAgICAgICAvKiBOZXR3b3JrICovCisgICAgICAgIG54ZGlyID0gbm5ldGRpcjsKKyAgICAgICAgeGRpciA9IG5ldGRpcjsKKyAgICAgICAgbWF4ID0gTUFYRERJUjsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBORVRDT05OICovCisjZW5kaWYgLyogTk9ESUFMICovCisjaWZuZGVmIE5PU0VSVkVSCisgICAgaWYgKGN4ID09IDIpIHsgICAgICAgICAgICAgICAgICAgICAgLyogR0VUIHBhdGggKi8KKyAgICAgICAgbnhkaXIgPSBuZ2V0cGF0aDsKKyAgICAgICAgeGRpciA9IGdldHBhdGg7CisgICAgICAgIG1heCA9IE1BWEdFVFBBVEg7CisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbGVkIHdpdGggaW52YWxpZCBmdW5jdGlvbiBjb2RlICovCisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKyAgICAgIHJldHVybigtMik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYR0VUUEFUSDsgaSsrKSAgICAvKiBJbml0IHRoZXNlLiAqLworICAgICAgcHBbaV0gPSBOVUxMOworCisjaWZkZWYgQ0tfUEFSU0RJUgorICAgIGRkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBuYW1lIGNvdW50ZXIgKi8KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoY3ggIT0gMikgeyAgICAgICAgICAgICAgICAgIC8qIERpYWxpbmcgb3IgTmV0d29yayBEaXJlY3RvcnkgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICBjaGFyICogYXBwZGF0YTAgPSBOVUxMLCAqIGFwcGRhdGExID0gTlVMTDsKKyNpZmRlZiBOVAorICAgICAgICAgICAgZW52ID0gZ2V0ZW52KCJLOTVQSE9ORVMiKTsKKyAgICAgICAgICAgIG1ha2VzdHIoJmFwcGRhdGEwLChjaGFyICopR2V0QXBwRGF0YSgwKSk7CisgICAgICAgICAgICBtYWtlc3RyKCZhcHBkYXRhMSwoY2hhciAqKUdldEFwcERhdGEoMSkpOworI2Vsc2UgLyogTlQgKi8KKyAgICAgICAgICAgIGVudiA9IGdldGVudigiSzJQSE9ORVMiKTsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgaWYgKCFlbnYpCisgICAgICAgICAgICAgIGVudiA9IGdldGVudigiSzk1UEhPTkVTIik7CisgICAgICAgICAgICBpZiAoIWVudikKKyAgICAgICAgICAgICAgZW52ID0gIiI7CisKKyAgICAgICAgICAgIGRpcnBhdGhbMF0gPSAnXDAnOworICAgICAgICAgICAgbGVuID0gc3RybGVuKGVudikgKyAyKnN0cmxlbihzdGFydHVwZGlyKSArIDIqc3RybGVuKGluaWRpcikKKyAgICAgICAgICAgICAgICArIChhcHBkYXRhMD8yKnN0cmxlbihhcHBkYXRhMCk6MCkgCisgICAgICAgICAgICAgICAgKyAoYXBwZGF0YTE/MipzdHJsZW4oYXBwZGF0YTEpOjApCisgICAgICAgICAgICAgICAgKyAyKnN0cmxlbih6aG9tZSgpKSArIDIqc3RybGVuKGV4ZWRpcikgKyA4KnN0cmxlbigiUEhPTkVTLyIpCisgICAgICAgICAgICAgICAgKyAxMjsKKyAgICAgICAgICAgIGlmIChsZW4gPCA0MDk2KSAgICAgICAgICAgICAvKiBTQUZFICovCisgICAgICAgICAgICAgIHNwcmludGYoZGlycGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIiVzJXMlczslcyVzOyVzJXMlcyVzJXMlcyVzJXMlczslcyVzOyVzOyVzJXMiLAorICAgICAgICAgICAgICAgICAgICAvKiBTZW1pY29sb24tc2VwYXJhdGVkIHBhdGggbGlzdCAqLworICAgICAgICAgICAgICAgICAgICBlbnYsCisgICAgICAgICAgICAgICAgICAgIChlbnZbMF0gJiYgZW52W3N0cmxlbihlbnYpLTFdID09ICc7JykgPyAiIiA6ICI7IiwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGRpciwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGRpciwgIlBIT05FUy8iLAorICAgICAgICAgICAgICAgICAgICBhcHBkYXRhMSA/IGFwcGRhdGExIDogIiIsIAorICAgICAgICAgICAgICAgICAgICBhcHBkYXRhMSA/ICJLZXJtaXQgOTU7IiA6ICIiLAorICAgICAgICAgICAgICAgICAgICBhcHBkYXRhMSA/IGFwcGRhdGExIDogIiIsIAorICAgICAgICAgICAgICAgICAgICBhcHBkYXRhMSA/ICJLZXJtaXQgOTUvUEhPTkVTLzsiIDogIiIsCisgICAgICAgICAgICAgICAgICAgIGFwcGRhdGEwID8gYXBwZGF0YTAgOiAiIiwgCisgICAgICAgICAgICAgICAgICAgIGFwcGRhdGEwID8gIktlcm1pdCA5NTsiIDogIiIsCisgICAgICAgICAgICAgICAgICAgIGFwcGRhdGEwID8gYXBwZGF0YTAgOiAiIiwgCisgICAgICAgICAgICAgICAgICAgIGFwcGRhdGEwID8gIktlcm1pdCA5NS9QSE9ORVMvOyIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgaW5pZGlyLAorICAgICAgICAgICAgICAgICAgICBpbmlkaXIsICJQSE9ORVMvIiwKKyAgICAgICAgICAgICAgICAgICAgemhvbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgemhvbWUoKSwgIlBIT05FUy8iLAorICAgICAgICAgICAgICAgICAgICBleGVkaXIsCisgICAgICAgICAgICAgICAgICAgIGV4ZWRpciwgIlBIT05FUy8iCisgICAgICAgICAgICAgICAgICAgICk7CisjaWZkZWYgTlQKKyAgICAgICAgICAgIG1ha2VzdHIoJmFwcGRhdGEwLE5VTEwpOworICAgICAgICAgICAgbWFrZXN0cigmYXBwZGF0YTEsTlVMTCk7CisjZW5kaWYgLyogTlQgKi8KKyNlbHNlCisjaWZkZWYgVU5JWAorICAgICAgICAgICAgeSA9IDEwMjQ7CisgICAgICAgICAgICBzID0gZGlycGF0aDsKKyAgICAgICAgICAgIHp6c3RyaW5nKCJcXHYoaG9tZSkiLCZzLCZ5KTsKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICB5ID0gY21pZmlwKAorICAgICAgICAgICAgICAgICAgIk5hbWVzIG9mIG9uZSBvciBtb3JlIGRpcmVjdG9yeSBmaWxlcywgc2VwYXJhdGVkIGJ5IHNwYWNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICIiLCZzLCZ4LDAsCisjaWZkZWYgT1MyT1JVTklYCisgICAgICAgICAgICAgICAgICAgICAgIGRpcnBhdGgsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpc3Qgb2YgZGlyZWN0b3J5IG5hbWVzICovCisgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgIHkgPSBjbWRpcigiRGlyZWN0b3J5IG5hbWUiLCIiLCZzLHh4c3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgICAgIGlmICh5ID09IC0zKSB7ICAgICAgICAgICAgICAvKiBFT0wgb3IgdXNlciB0eXBlZCA8Q1I+ICovCisgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7IC8qIENsZWFyIHRoZXNlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbnhkaXIgJiYgeGRpcltpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4ZGlyW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB4ZGlyW2ldID0gKGkgPCBkZCkgPyBwcFtpXSA6IE5VTEw7CisgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBOT0RJQUwKKyAgICAgICAgICAgICAgICBpZiAoY3ggPT0gMCkKKyAgICAgICAgICAgICAgICAgIG5kaWFsZGlyID0gZGQ7CisjaWZkZWYgTkVUQ09OTgorICAgICAgICAgICAgICAgIGlmIChjeCA9PSAxKQorICAgICAgICAgICAgICAgICAgbm5ldGRpciA9IGRkOworI2VuZGlmIC8qIE5FVENPTk4gKi8KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyNpZm5kZWYgTk9TRVJWRVIKKyAgICAgICAgICAgICAgICBpZiAoY3ggPT0gMikKKyAgICAgICAgICAgICAgICAgIG5nZXRwYXRoID0gZGQ7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogUGFyc2UgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGQ7IGkrKykgeyAgLyogRnJlZSB0ZW1wIHN0b3JhZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBwW2ldKSBmcmVlKHBwW2ldKTsgLyogYnV0IGRvbid0IGNoYW5nZSAqLworICAgICAgICAgICAgICAgICAgICBwcFtpXSA9IE5VTEw7ICAgICAgICAgICAvKiBhbnl0aGluZyBlbHNlICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoeCkgeworICAgICAgICAgICAgcHJpbnRmKCI/V2lsZGNhcmRzIG5vdCBhbGxvd2VkXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyNpZmRlZiBDS19UTVBESVIKKyAgICAgICAgaWYgKGN4ID09IDIgJiYgIWlzZGlyKHMpKSB7CisgICAgICAgICAgICBwcmludGYoIj9Ob3QgYSBkaXJlY3RvcnkgLSAlc1xuIiwgcyk7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisjZW5kaWYgLyogQ0tfVE1QRElSICovCisKKyNpZmRlZiBaRk5RRlAKKyAgICAgICAgaWYgKGN4IDwgMikgeworICAgICAgICAgICAgaWYgKCFpc2Fic29sdXRlKHMpKSB7ICAgICAgIC8qIElmIG5vdCByZWxhdGl2ZSBnZXQgZnVsbCBwYXRoICovCisgICAgICAgICAgICAgICAgaWYgKChmbnAgPSB6Zm5xZnAocyxUTVBCVUZTSVogLSAxLHRtcGJ1ZikpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbnAtPmZwYXRoKQorICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW50KSBzdHJsZW4oZm5wLT5mcGF0aCkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGZucC0+ZnBhdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogWkZOUUZQICovCisgICAgICAgIGMgPSBOVUw7CisgICAgICAgIHggPSBzdHJsZW4ocyk7CisgICAgICAgIGlmICh4ID4gMCkgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IGxhc3QgY2hhciAqLworICAgICAgICAgIGMgPSBzW3gtMV07CisgICAgICAgIGRlYnVnKEYwMDAsInBhcnNkaXIgcyIscyxjKTsKKyAgICAgICAgaWYgKChwcFtkZF0gPSBtYWxsb2Moc3RybGVuKHMpKzIpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBwcmludGYoIj9JbnRlcm5hbCBlcnJvciAtIG1hbGxvY1xuIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGQ7IGkrKykgeyAgLyogRnJlZSB0ZW1wIHN0b3JhZ2UgKi8KKyAgICAgICAgICAgICAgICBpZiAocHBbaV0pIGZyZWUocHBbaV0pOworICAgICAgICAgICAgICAgIHBwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSGF2ZSBzdG9yYWdlIGZvciBuYW1lICovCisgICAgICAgICAgICBzdHJjcHkocHBbZGRdLHMpOyAgICAgICAgICAgLyogQ29weSBzdHJpbmcgaW50byBuZXcgc3RvcmFnZSAqLworICAgICAgICAgICAgZGVidWcoRjExMSwicGFyc2RpciBwcFtkZF0gMSIscHBbZGRdLGRkKTsKKyNpZm5kZWYgTk9YRkVSCisgICAgICAgICAgICBpZiAoY3ggPT0gMikgeyAgICAgICAgICAgICAgLyogSWYgd2UgYXJlIHBhcnNpbmcgZGlyZWN0b3JpZXMgKi8KKyAgICAgICAgICAgICAgICBjaGFyIGRpcnNlcFsyXTsKKyAgICAgICAgICAgICAgICBleHRlcm4gaW50IG15aW5kZXg7ICAgICAvKiBBcHBlbmQgZGlyZWN0b3J5IHNlcGFyYXRvciBpZiAqLworICAgICAgICAgICAgICAgIGV4dGVybiBzdHJ1Y3Qgc3lzZGF0YSBzeXNpZGxpc3RbXTsgLyogaXQgaXMgbWlzc2luZy4uLiAgICovCisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwicGFyc2RpciBteWluZGV4IiwiIixteWluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAobXlpbmRleCA+IC0xKQorICAgICAgICAgICAgICAgICAgaWYgKHN5c2lkbGlzdFtteWluZGV4XS5zaWRfdW5peGxpa2UpCisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9IHN5c2lkbGlzdFtteWluZGV4XS5zaWRfZGlyc2VwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJzZXBbMF0gPSBzeXNpZGxpc3RbbXlpbmRleF0uc2lkX2RpcnNlcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcnNlcFsxXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhdChwcFtkZF0sIChjaGFyICopIGRpcnNlcCk7IC8qIHNhZmUgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5PWEZFUiAqLworICAgICAgICAgICAgZGVidWcoRjExMSwicGFyc2RpciBwcFtkZF0gMiIscHBbZGRdLGRkKTsKKyAgICAgICAgICAgIGlmICgrK2RkID4gbWF4KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VG9vIG1hbnkgZGlyZWN0b3JpZXMgLSAlZCBtYXhcbiIsIG1heCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRkOyBpKyspIHsgIC8qIEZyZWUgdGVtcCBzdG9yYWdlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChwcFtpXSkgZnJlZShwcFtpXSk7CisgICAgICAgICAgICAgICAgICAgIHBwW2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tfUEFSU0RJUiAqLworfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9TRVJWRVIKK3N0YXRpYyBpbnQKK2NrbG9naW4oKSB7CisgICAgaW50IHg7CisgICAgY2hhciAqIHM7CisgICAgY2hhciB1c2VybmFtZVtMT0dJTkxFTisxXTsKKyAgICBjaGFyIHBhc3N3b3JkW0xPR0lOTEVOKzFdOworICAgIGNoYXIgYWNjb3VudFtMT0dJTkxFTisxXTsKKyAgICBleHRlcm4gY2hhciAqIHhfdXNlciwgKiB4X3Bhc3N3ZCwgKiB4X2FjY3Q7CisgICAgZXh0ZXJuIGludCB4X2xvZ2luLCB4X2xvZ2dlZDsKKworICAgIHVzZXJuYW1lWzBdID0gTlVMOworICAgIHBhc3N3b3JkWzBdID0gTlVMOworICAgIGFjY291bnRbMF0gID0gTlVMOworCisgICAgeCA9IGNtZmxkKCJ1c2VybmFtZSIsICIiLCAmcywgeHhzdHJpbmcpOworICAgIGlmICh4ICE9IC0zKSB7CisgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoaW50KXN0cmxlbihzKSA+IExPR0lOTEVOKSB7CisgICAgICAgICAgICBwcmludGYoIlwiJXNcIiAtIHRvbyBsb25nLCAlZCBtYXhcbiIsIHMsIExPR0lOTEVOKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgY2tzdHJuY3B5KHVzZXJuYW1lLHMsTE9HSU5MRU4rMSk7CisgICAgICAgIHggPSBjbWZsZCgicGFzc3dvcmQiLCAiIiwgJnMsIHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKHggIT0gLTMpIHsKKyAgICAgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKChpbnQpc3RybGVuKHMpID4gTE9HSU5MRU4pIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlwiJXNcIiAtIHRvbyBsb25nLCAlZCBtYXhcbiIsIHMsIExPR0lOTEVOKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2tzdHJuY3B5KHBhc3N3b3JkLHMsTE9HSU5MRU4rMSk7CisgICAgICAgICAgICB4ID0gY21mbGQoImFjY291bnQiLCAiIiwgJnMsIHh4c3RyaW5nKTsKKyAgICAgICAgICAgIGlmICh4ICE9IC0zKSB7CisgICAgICAgICAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgIGlmICgoaW50KXN0cmxlbihzKSA+IExPR0lOTEVOKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXCIlc1wiIC0gdG9vIGxvbmcsICVkIG1heFxuIiwgcywgTE9HSU5MRU4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBja3N0cm5jcHkoYWNjb3VudCxzLExPR0lOTEVOKzEpOworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtYWtlc3RyKCZ4X3VzZXIsdXNlcm5hbWUpOworICAgIG1ha2VzdHIoJnhfcGFzc3dkLHBhc3N3b3JkKTsKKyAgICBtYWtlc3RyKCZ4X2FjY3QsYWNjb3VudCk7CisgICAgeF9sb2dpbiA9ICh4X3VzZXIpID8gMSA6IDA7CisgICAgeF9sb2dnZWQgPSAwOworICAgIHJldHVybigxKTsKK30KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworCisjaWZuZGVmIE5PTE9DQUwKK3N0YXRpYyBpbnQKK3NldGRjZCgpIHsKKyAgICBpbnQgeCwgeSwgeiA9IDA7CisgICAgaWYgKCh5ID0gY21rZXkoY3JydGFiLG5jcnIsIiIsImF1dG9tYXRpYyIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICBpZiAoeSA9PSBDQVJfT04pIHsKKyAgICAgICAgeCA9IGNtbnVtKCJDYXJyaWVyIHdhaXQgdGltZW91dCwgc2Vjb25kcyIsIjAiLDEwLCZ6LHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKHggPCAwKSByZXR1cm4oeCk7CisgICAgfQorICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgIGNhcnJpZXIgPSB0dHNjYXJyKHkpOworICAgIGNkdGltbyA9IHo7CisgICAgcmV0dXJuKDEpOworfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworZXh0ZXJuIHN0cnVjdCBrZXl0YWIgeWVzbm9bXTsKK2V4dGVybiBpbnQgbnllc25vOworCisvKiBnIGUgdCB5IGUgcyBuIG8gICovCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHEweWVzbm9bXSA9IHsgICAgICAvKiBZZXMvTm8vUXVpdCBrZXl3b3JkIHRhYmxlICovCisgICAgIm5vIiwgICAgMCwgMCwKKyAgICAib2siLCAgICAxLCAwLAorICAgICJ5ZXMiLCAgIDEsIDAKK307CitzdGF0aWMgaW50IG5xMHllc25vID0gKHNpemVvZihxMHllc25vKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHExeWVzbm9bXSA9IHsgICAgICAvKiBZZXMvTm8vUXVpdCBrZXl3b3JkIHRhYmxlICovCisgICAgIm5vIiwgICAgMCwgMCwKKyAgICAib2siLCAgICAxLCAwLAorICAgICJxdWl0IiwgIDIsIDAsCisgICAgInllcyIsICAgMSwgMAorfTsKK3N0YXRpYyBpbnQgbnExeWVzbm8gPSAoc2l6ZW9mKHExeWVzbm8pIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgcTJ5ZXNub1tdID0geyAgICAgIC8qIFllcy9Oby9RdWl0IGtleXdvcmQgdGFibGUgKi8KKyAgICAiZ28iLCAgICAzLCAwLAorICAgICJubyIsICAgIDAsIDAsCisgICAgIm9rIiwgICAgMSwgMCwKKyAgICAieWVzIiwgICAxLCAwCit9Oworc3RhdGljIGludCBucTJ5ZXNubyA9IChzaXplb2YocTJ5ZXNubykgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBxM3llc25vW10gPSB7ICAgICAgLyogWWVzL05vL1F1aXQga2V5d29yZCB0YWJsZSAqLworICAgICJnbyIsICAgIDMsIDAsCisgICAgIm5vIiwgICAgMCwgMCwKKyAgICAib2siLCAgICAxLCAwLAorICAgICJxdWl0IiwgIDIsIDAsCisgICAgInllcyIsICAgMSwgMAorfTsKK3N0YXRpYyBpbnQgbnEzeWVzbm8gPSAoc2l6ZW9mKHEzeWVzbm8pIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworCisvKiBBc2sgcXVlc3Rpb24sIGdldCB5ZXMvbm8gYW5zd2VyICovCisKK2ludAorZ2V0eWVzbm8obXNnLCBmbGFncykgY2hhciAqIG1zZzsgaW50IGZsYWdzOyB7CisjaWZkZWYgQ0tfUkVDQUxMCisgICAgZXh0ZXJuIGludCBvbl9yZWNhbGw7ICAgICAgICAgICAgICAgLyogYXJvdW5kIFBhc3N3b3JkIHByb21wdGluZyAqLworI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworICAgIGludCB5LCB6OworCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IHZtb2RlLCB3aW45NV9wb3B1cCwgc3RhcnRmbGFnczsKKyAgICBpbnQgdm1vZGVfc2F2ID0gdm1vZGU7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZkZWYgQ0tfQVBDCisgICAgaWYgKCBhcGNhY3RpdmUgIT0gQVBDX0lOQUNUSVZFICYmIChhcGNzdGF0dXMgJiBBUENfTk9JTlApICkgeworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgIH0KKyNlbmRpZiAvKiBDS19BUEMgKi8KKworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisjaWZkZWYgQ09NTUVOVAorICAgIGlmICh3aW45NV9wb3B1cCAmJiAhKHN0YXJ0ZmxhZ3MgJiA5NikKKyNpZmRlZiBJS1NECisgICAgICAgICYmICFpbnNlcnZlcgorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgKQorICAgICAgcmV0dXJuKHBvcHVwX3JlYWR5ZXNubyh2bW9kZSxOVUxMLG1zZyxmbGFncykpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBpZiAodm1vZGUgPT0gVlRFUk0pIHsKKyAgICAgICAgdm1vZGUgPSBWQ01EOworICAgICAgICBWc2NybklzRGlydHkoVlRFUk0pOworICAgICAgICBWc2NybklzRGlydHkoVkNNRCk7CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZmRlZiBWTVMKKy8qCisgIEluIFZNUywgd2hlbmV2ZXIgYSBUQUtFIGZpbGUgb3IgbWFjcm8gaXMgYWN0aXZlLCB3ZSByZXN0b3JlIHRoZQorICBvcmlnaW5hbCBjb25zb2xlIG1vZGVzIHNvIEN0cmwtQy9DdHJsLVkgY2FuIHdvcmsuICBCdXQgaGVyZSB3ZQorICBnbyBpbnRlcmFjdGl2ZSBhZ2Fpbiwgc28gd2UgaGF2ZSB0byB0ZW1wb3JhcmlseSBwdXQgdGhlbSBiYWNrLgorKi8KKyAgICBpZiAoIXhjbWRzcmMpCisgICAgICBjb25jYigoY2hhcillc2NhcGUpOworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgQ0tfUkVDQUxMCisgICAgb25fcmVjYWxsID0gMDsKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyAgICBjbXNhdnAocHNhdmUsUFJPTVBUTCk7ICAgICAgICAgICAgICAvKiBTYXZlIG9sZCBwcm9tcHQgKi8KKyAgICBjbXNldHAobXNnKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIG5ldyBwcm9tcHQgKi8KKyAgICB6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGFuc3dlciB0byBOby4gKi8KKyAgICBjbWluaShja3hlY2gpOyAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHBhcnNlci4gKi8KKyAgICBkbyB7CisgICAgICAgIHByb21wdChOVUxMKTsgICAgICAgICAgICAgICAgICAgLyogSXNzdWUgcHJvbXB0LiAqLworICAgICAgICBzd2l0Y2ggKGZsYWdzKSB7CisgICAgICAgICAgY2FzZSAwOiAgeSA9IGNta2V5KHEweWVzbm8sbnEweWVzbm8sIiIsIiIsTlVMTCk7IGJyZWFrOworICAgICAgICAgIGNhc2UgMTogIHkgPSBjbWtleShxMXllc25vLG5xMXllc25vLCIiLCIiLE5VTEwpOyBicmVhazsKKyAgICAgICAgICBjYXNlIDI6ICB5ID0gY21rZXkocTJ5ZXNubyxucTJ5ZXNubywiIiwiIixOVUxMKTsgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogeSA9IGNta2V5KHEzeWVzbm8sbnEzeWVzbm8sIiIsIiIsTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHkgPCAwKSB7CisgICAgICAgICAgICBpZiAoeSA9PSAtNCkgeyAgICAgICAgICAgICAgLyogRU9GICovCisgICAgICAgICAgICAgICAgeiA9IHk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHkgPT0gLTMpICAgICAgICAgLyogTm8gYW5zd2VyPyAqLworICAgICAgICAgICAgICBwcmludGYoIiBQbGVhc2UgcmVzcG9uZDsgdHlwZSAnPycgdG8gc2VlIHZhbGlkIGFuc3dlcnMuXG4iKTsKKyAgICAgICAgICAgIGNtaW5pKGNreGVjaCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6ID0geTsgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSBhbnN3ZXIgKi8KKyAgICAgICAgICAgIHkgPSBjbWNmbSgpOyAgICAgICAgICAgICAgICAvKiBHZXQgY29uZmlybWF0aW9uICovCisgICAgICAgIH0KKyAgICB9IHdoaWxlICh5IDwgMCk7ICAgICAgICAgICAgICAgICAgICAvKiBDb250aW51ZSB0aWxsIGRvbmUgKi8KKyAgICBjbXNldHAocHNhdmUpOyAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIHJlYWwgcHJvbXB0ICovCisjaWZkZWYgVk1TCisgICAgaWYgKGNtZGx2bCA+IDApICAgICAgICAgICAgICAgICAgICAgLyogSW4gVk1TIGFuZCBub3QgYXQgdG9wIGxldmVsLCAqLworICAgICAgY29ucmVzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qICByZXN0b3JlIGNvbnNvbGUgYWdhaW4uICovCisjZW5kaWYgLyogVk1TICovCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICBpZiAodm1vZGUgIT0gdm1vZGVfc2F2KSB7CisgICAgICAgIHZtb2RlID0gVlRFUk07CisgICAgICAgIFZzY3JuSXNEaXJ0eShWQ01EKTsKKyAgICAgICAgVnNjcm5Jc0RpcnR5KFZURVJNKTsKKyAgICB9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIHJldHVybih6KTsKK30KKworI2lmZGVmIEtVSQorZXh0ZXJuIEhXTkQgaHduZENvbnNvbGU7CitfUFJPVE9UWVAoaW50IGd1aV90eHRfZGlhbG9nLChjaGFyICosY2hhciAqLGludCxjaGFyICosaW50LGNoYXIgKixpbnQpKTsKK19QUk9UT1RZUChpbnQgZ3VpX210eHRfZGlhbG9nLChjaGFyICosaW50LHN0cnVjdCB0eHRib3ggW10pKTsKK19QUk9UT1RZUChpbnQgZ3VpX3Bvc2l0aW9uLChpbnQsIGludCkpOworX1BST1RPVFlQKGludCBndWlfcmVzaXplX21vZGUsKGludCkpOworX1BST1RPVFlQKGludCBndWlfd2luX3J1bl9tb2RlLChpbnQpKTsKK19QUk9UT1RZUChpbnQgZ3VpX3NhdmVhc19kaWFsb2csKGNoYXIgKixjaGFyICosIGludCwgY2hhciAqLCBjaGFyICosIGludCkpOworZXh0ZXJuIGludCBndWlfZGlhbG9nOworI2VuZGlmIC8qIEtVSSAqLworCisvKiB1IHEgXyBvIGsgIC0tICBVc2VyIFF1ZXJ5LCBnZXQgWWVzL05vIG9yIE9LIENhbmNlbCAgKi8KKy8qCisgIENhbGwgd2l0aDogIAorICAgIHByZWZhY2U6IEV4cGxhbmF0b3J5IHRleHQgdG8gcHJpbnQsIG9yIE5VTEwuCisgICAgcHJvbXB0OiAgUHJvbXB0LgorICAgIG1hc2s6ICAgIEJpdG1hc2sgZm9yIGxlZ2FsIHJlc3BvbnNlczogMSA9IE9LIG9yIFllczsgMiA9IE5vIG9yIENhbmNlbC4KKyAgICBoZWxwOiAgICBIZWxwIHRleHQgKGFycmF5IG9mIHN0cmluZ3Mgb3IgTlVMTCkgW25vdCB1c2VkIGJ5IHBhcnNlcl0uCisgICAgZGZsdDogICAgRGVmYXVsdCByZXNwb25zZSAoMSBvciAyKSBbbm90IHVzZWQgYnkgcGFyc2VyXS4KKyAgUmV0dXJuczoKKyAgIC0xOiAgICAgICBJbnZhbGlkIGFyZ3VtZW50KHMpLgorICAgIDA6ICAgICAgIFVzZXIgc2FpZCBObyBvciBDYW5jZWwuCisgICAgMSAgICAgICAgVXNlciBzYWlkIFllcyBvciBPSy4gICAgCisgIE5vdGVzOgorICAgIHByZWZhY2UgYW5kIHByb21wdCBzaG91bGQgbm90IGluY2x1ZGUgZmluYWwgbGluZSB0ZXJtaW5hdG9yIGJ1dCBtYXkKKyAgICBpbmNsdWRlIGVtYmVkZGVkIG9uZXMuICBIZWxwIHRleHQgaXMgaW4gY2FzZSBHVUkgZGlhbG9nIG5lZWRzIGEgSGVscAorICAgIGJ1dHRvbjsgZmluYWwgZWxlbWVudCBvZiBoZWxwLXN0cmluZyBhcnJheSBpcyAiIi4gIGRmbHQgaXMgdXNlZCBieSBHVUkKKyAgICB0byBoaWdobGlnaHQgdGhlIGRlZmF1bHQgcmVzcG9uc2UgYnV0dG9uLgorKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCit1cV9vayhjaGFyICogcHJlZmFjZSwgY2hhciAqIHByb21wdCwgaW50IG1hc2ssY2hhciAqKiBoZWxwLCBpbnQgZGZsdCkKKyNlbHNlIC8qIENLX0FOU0lDICovCit1cV9vayhwcmVmYWNlLHByb21wdCxtYXNrLGhlbHAsZGZsdCkKKyAgICBjaGFyICogcHJlZmFjZSwgKiBwcm9tcHQsICoqIGhlbHA7CisgICAgaW50IG1hc2ssIGRmbHQ7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHVxX29rICovIHsKKyAgICBpbnQgcmMsIGxlbjsKKyAgICBjaGFyICogdGV4dD1OVUxMOworCisgICAgaWYgKCFwcm9tcHQpCisgICAgICByZXR1cm4oLTEpOworCisgICAgaWYgKChtYXNrICYgMykgPT0gMSkgewkJLyogT0sgKEdVSSBvbmx5KSAqLworI2lmZGVmIEtVSQorICAgICAgaWYgKCBndWlfZGlhbG9nICkgeworCS8qIFRoaXMgb25lIGlzIGZvciBwb3B1cCBoZWxwLCBhbGVydHMsIGV0YyAqLworICAgICAgICBpZiAocHJlZmFjZSkgeworICAgICAgICAgICAgbGVuID0gc3RybGVuKHByZWZhY2UpICsgc3RybGVuKHByb21wdCkgKyA0OworICAgICAgICAgICAgdGV4dCA9IChjaGFyICopbWFsbG9jKGxlbik7CisgICAgICAgICAgICBja21ha21zZyh0ZXh0LGxlbixwcmVmYWNlLCJcbiIscHJvbXB0LE5VTEwpOworICAgICAgICB9CisgICAgICAgIHJjID0gTWVzc2FnZUJveChod25kQ29uc29sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID8gdGV4dCA6IHByb21wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUJfT0sgfCBNQl9JQ09OSU5GT1JNQVRJT04gfCBNQl9UQVNLTU9EQUwpOworICAgICAgICBTaG93V2luZG93QXN5bmMoaHduZENvbnNvbGUsU1dfU0hPV05PUk1BTCk7CisgICAgICAgIFNldEZvcmVncm91bmRXaW5kb3coaHduZENvbnNvbGUpOworICAgICAgICBpZiAodGV4dCkKKwkgIGZyZWUodGV4dCk7CisgICAgICAgIGlmICghcmMpCisJICByZXR1cm4oLTEpOworICAgICAgICBlbHNlIAorCSAgcmV0dXJuKDEpOworICAgICAgfSBlbHNlCisjZW5kaWYgIC8qIEtVSSAqLworICAgICAgeworCWlmIChwcmVmYWNlKQkJCS8qIEp1c3QgZGlzcGxheSB0aGUgdGV4dCwgaWYgYW55ICovCisJICBwcmludGYoIiVzXG4iLHByZWZhY2UpOworCWlmIChwcm9tcHQpCisJICBwcmludGYoIiVzXG4iLHByb21wdCk7CisgICAgICAgIHJldHVybigxKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChtYXNrICYgMykgPT0gMykgewkvKiBZZXMvTm8gb3IgT0svQ2FuY2VsICovCisjaWZkZWYgS1VJCisgICAgICBpZiAoIGd1aV9kaWFsb2cgKSB7CisgICAgICAgIGlmIChwcmVmYWNlKSB7CisgICAgICAgICAgICBsZW4gPSBzdHJsZW4ocHJlZmFjZSkgKyBzdHJsZW4ocHJvbXB0KSArIDQ7CisgICAgICAgICAgICB0ZXh0ID0gKGNoYXIgKiltYWxsb2MobGVuKTsKKyAgICAgICAgICAgIGNrbWFrbXNnKHRleHQsbGVuLHByZWZhY2UsIlxuIixwcm9tcHQsTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBNZXNzYWdlQm94KGh3bmRDb25zb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPyB0ZXh0IDogcHJvbXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQl9ZRVNOTyB8IE1CX0lDT05JTkZPUk1BVElPTiB8IE1CX1RBU0tNT0RBTCB8IAorICAgICAgICAgICAgICAgICAgICAgICAgIChkZmx0ID09IDIgPyBNQl9ERUZCVVRUT04yIDogTUJfREVGQlVUVE9OMSkpOworICAgICAgICBTaG93V2luZG93QXN5bmMoaHduZENvbnNvbGUsU1dfU0hPV05PUk1BTCk7CisgICAgICAgIFNldEZvcmVncm91bmRXaW5kb3coaHduZENvbnNvbGUpOworICAgICAgICBpZiAodGV4dCkKKwkgIGZyZWUodGV4dCk7CisgICAgICAgIGlmICghcmMpCisJICByZXR1cm4oLTEpOworICAgICAgICBlbHNlIGlmIChyYyA9PSBJRE5PIHx8IHJjID09IElEQ0FOQ0VMKQorCSAgcmV0dXJuKDApOworICAgICAgICBlbHNlCisJICByZXR1cm4oMSk7CisgICAgICB9IGVsc2UKKyNlbmRpZiAgLyogS1VJICovCisgICAgICB7CisJaWYgKHByZWZhY2UpCisJICBwcmludGYoIiVzXG4iLHByZWZhY2UpOworCXJldHVybihnZXR5ZXNubyhwcm9tcHQsMCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisJcHJpbnRmKCI/SW50ZXJuYWwgZXJyb3I6IHVxX29rKClcbiIpOworCXJldHVybigtMSk7CisgICAgfQorfQorCisvKiB1IHEgXyB0IHggdCAgLS0gIFVzZXIgUXVlcnksIGdldCBzaW5nbGUgdGV4dCByZXNwb25zZSAgKi8KKy8qCisgIENhbGwgd2l0aDogIAorICAgIHByZWZhY2U6IEV4cGxhbmF0b3J5IHRleHQgdG8gcHJpbnQsIG9yIE5VTEwuCisgICAgcHJvbXB0OiAgUHJvbXB0LiAKKyAgICBlY2hvOiAgICAwID0gZG9uJ3QgZWNobzsgMSA9IGVjaG87IDIgPSBlY2hvIHdpdGggYXN0ZXJpc2tzLgorICAgIGhlbHA6ICAgIEhlbHAgdGV4dCAoYXJyYXkgb2Ygc3RyaW5ncyBvciBOVUxMKSBbbm90IHVzZWQgYnkgcGFyc2VyXS4KKyAgICBidWY6ICAgICBQb2ludGVyIHRvIHJlc3VsdCBidWZmZXIuCisgICAgYnVmbGVuOiAgTGVuZ3RoIG9mIHJlc3VsdCBidWZmZXIuCisgICAgZGZsdDogICAgRGVmYXVsdCByZXNwb25zZSB0ZXh0IG9yIE5VTEwgW25vdCB1c2VkIGJ5IHBhcnNlcl0uCisgICAgdGltZXI6ICAgT3B0aW9uYWwgVGltZW91dAorICBSZXR1cm5zOgorICAgIDA6ICAgICAgIFVzZXIgc2FpZCBObyBvciBDYW5jZWwuCisgICAgMSAgICAgICAgVXNlciBzYWlkIFllcyBvciBPSy4gICAgCisgIE5vdGVzOgorICAgIHByZWZhY2UsIHByb21wdCwgYW5kIGhlbHAgYXMgZm9yIHVxX29rKCkuCisqLworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3VxX3R4dChjaGFyICogcHJlZmFjZSwgY2hhciAqIHByb21wdCwgaW50IGVjaG8sIGNoYXIgKiogaGVscCwgY2hhciAqIGJ1ZiwgCisgICAgICAgaW50IGJ1ZmxlbiwgY2hhciAqZGZsdCwgaW50IHRpbWVyKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK3VxX3R4dChwcmVmYWNlLHByb21wdCxlY2hvLGhlbHAsYnVmLGJ1ZmxlbixkZmx0LHRpbWVyKQorICAgIGNoYXIgKiBwcmVmYWNlLCAqIHByb21wdCwgKiogaGVscCwgKiBidWYsICogZGZsdDsgCisgICAgaW50IGJ1ZmxlbiwgZWNobywgdGltZXI7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgIGV4dGVybiBpbnQgdm1vZGU7CisgICAgZXh0ZXJuIGludCBzdGFydGZsYWdzOworICAgIGV4dGVybiBpbnQgd2luOTVfcG9wdXA7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIGludCByYzsgCisKKyAgICBpZiAoYnVmbGVuIDwgMSB8fCAhYnVmKQorICAgICAgcmV0dXJuKDApOworI2lmZGVmIEtVSQorICAgIGlmICggZ3VpX2RpYWxvZyApIHsKKyAgICAgICAgcmMgPSBndWlfdHh0X2RpYWxvZyhwcmVmYWNlLHByb21wdCxlY2hvLGJ1ZixidWZsZW4sZGZsdCx0aW1lcik7CisgICAgICAgIGlmICggcmMgPiAtMSApCisgICAgICAgICAgICByZXR1cm4ocmMpOworICAgIC8qIE90aGVyd2lzZSwgdGhlIGRpYWxvZyBjb3VsZCBub3QgYmUgY3JlYXRlZC4gIEZhbGxiYWNrIHRvIHRleHQgbW9kZSAqLworICAgIH0gCisjZW5kaWYgLyogS1VJICovCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICBpZiAod2luOTVfcG9wdXAgJiYgIShzdGFydGZsYWdzICYgOTYpCisjaWZkZWYgSUtTRAorICAgICAgICAgJiYgIWluc2VydmVyCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgKSB7CisgICAgICAgIGRlYm9rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGxvZyAqLworICAgICAgICBpZiAoZWNobyA9PSAxKQorICAgICAgICAgICAgICAgIHBvcHVwX3JlYWR0ZXh0KHZtb2RlLHByZWZhY2UscHJvbXB0LGJ1ZixidWZsZW4sMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcG9wdXBfcmVhZHBhc3Modm1vZGUscHJlZmFjZSxwcm9tcHQsYnVmLGJ1ZmxlbiwwKTsKKyAgICAgICAgZGVib2sgPSAxOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworICAgIGlmIChwcmVmYWNlKQorICAgICAgcHJpbnRmKCIlc1xuIixwcmVmYWNlKTsKKyAgICBpZiAoZWNobyA9PSAxKQorICAgICAgcmVhZHRleHQocHJvbXB0LGJ1ZixidWZsZW4pOworICAgIGVsc2UKKyAgICAgIHJlYWRwYXNzKHByb21wdCxidWYsYnVmbGVuKTsKKyAgICByZXR1cm4oMSk7CQkJCS8qIChubyBidXR0b25zIGluIHBhcnNlcikgKi8KK30KKworLyogdSBxIF8gbSB0IHggdCAgLS0gIFVzZXIgUXVlcnksIGdldCBtdWx0aXBsZSB0ZXh0IHJlc3BvbnNlcyAqLworLyoKKyAgQ2FsbCB3aXRoOiAgCisgICAgcHJlZmFjZTogRXhwbGFuYXRvcnkgdGV4dCB0byBwcmludCwgb3IgTlVMTC4KKyAgICBoZWxwOiAgICBIZWxwIHRleHQgKGFycmF5IG9mIHN0cmluZ3Mgb3IgTlVMTCkgW25vdCB1c2VkIGJ5IHBhcnNlcl0uCisgICAgbjogICAgICAgTnVtYmVyIG9mIHJlc3BvbnNlcyB3YW50ZWQuCisgICAgZmllbGQ6ICAgQXJyYXkgb2Ygc3RydWN0IHR4dGJveCwgb25lIGVsZW1lbnQgcGVyIGZpZWxkLCBzZWUgY2t1dXNyLmguCisgIFJldHVybnM6CisgICAgMDogICAgICAgVXNlciBzYWlkIE5vIG9yIENhbmNlbC4KKyAgICAxICAgICAgICBVc2VyIHNhaWQgWWVzIG9yIE9LLiAgICAKKyAgTm90ZXM6CisgICAgcHJlZmFjZSBhbmQgaGVscCBhcyBmb3IgdXFfb2soKS4KKyovCitpbnQKKyNpZmRlZiBDS19BTlNJQwordXFfbXR4dChjaGFyICogcHJlZmFjZSxjaGFyICoqaGVscCwgaW50IG4sIHN0cnVjdCB0eHRib3ggZmllbGRbXSkKKyNlbHNlIC8qIENLX0FOU0lDICovCit1cV9tdHh0KHByZWZhY2UsaGVscCxuLGZpZWxkKQorICAgIGNoYXIgKiBwcmVmYWNlOyBjaGFyICoqIGhlbHA7IGludCBuOyBzdHJ1Y3QgdHh0Ym94IGZpZWxkW107IAorI2VuZGlmIC8qIENLX0FOU0lDICovCit7CisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IHZtb2RlOworICAgIGV4dGVybiBpbnQgc3RhcnRmbGFnczsKKyAgICBleHRlcm4gaW50IHdpbjk1X3BvcHVwOworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICBpbnQgaSwgcmM7CisKKyAgICBpZiAobiA8IDEgfHwgIWZpZWxkKQorICAgICAgcmV0dXJuKDApOworI2lmZGVmIEtVSQorICAgIGlmICggZ3VpX2RpYWxvZyApIHsKKyAgICAgICAgcmMgPSBndWlfbXR4dF9kaWFsb2cocHJlZmFjZSwgbiwgZmllbGQpOworICAgICAgICBpZiAoIHJjID4gLTEgKQorICAgICAgICAgICAgcmV0dXJuKHJjKTsKKyAgICAvKiBPdGhlcndpc2UsIHRoZSBkaWFsb2cgY291bGQgbm90IGJlIGNyZWF0ZWQuICBGYWxsYmFjayB0byB0ZXh0IG1vZGUgKi8KKyAgICB9CisjZW5kaWYgLyogS1VJICovCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICBpZiAod2luOTVfcG9wdXAgJiYgIShzdGFydGZsYWdzICYgOTYpCisjaWZkZWYgSUtTRAorICAgICAgICAgJiYgIWluc2VydmVyCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgKSB7CisgICAgICAgIGRlYm9rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGxvZyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZmllbGRbaV0udF9lY2hvID09IDEpCisgICAgICAgICAgICAgICAgcG9wdXBfcmVhZHRleHQodm1vZGUscHJlZmFjZSxmaWVsZFtpXS50X2xibCxmaWVsZFtpXS50X2J1ZixmaWVsZFtpXS50X2xlbiwwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwb3B1cF9yZWFkcGFzcyh2bW9kZSxwcmVmYWNlLGZpZWxkW2ldLnRfbGJsLGZpZWxkW2ldLnRfYnVmLGZpZWxkW2ldLnRfbGVuLDApOworICAgICAgICB9CisgICAgICAgIGRlYm9rID0gMTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyAgICBpZiAocHJlZmFjZSkKKyAgICAgIHByaW50ZigiJXNcbiIscHJlZmFjZSk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCWlmIChmaWVsZFtpXS50X2VjaG8gPT0gMSkKKwkgIHJlYWR0ZXh0KGZpZWxkW2ldLnRfbGJsLGZpZWxkW2ldLnRfYnVmLGZpZWxkW2ldLnRfbGVuKTsKKwllbHNlCisJICByZWFkcGFzcyhmaWVsZFtpXS50X2xibCxmaWVsZFtpXS50X2J1ZixmaWVsZFtpXS50X2xlbik7CisgICAgfQorICAgIHJldHVybigxKTsKK30KKworLyogdSBxIF8gZiBpIGwgZSAgLS0gIFVzZXIgUXVlcnksIGdldCBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lICAqLworLyoKKyAgQ2FsbCB3aXRoOiAgCisgICAgcHJlZmFjZTogRXhwbGFuYXRvcnkgdGV4dCB0byBwcmludCwgb3IgTlVMTC4KKyAgICBwcm9tcHQ6ICBQcm9tcHQgc3RyaW5nLgorICAgIGZjOiAgICAgIEZ1bmN0aW9uIGNvZGU6CisJICAgICAgIDEgPSBpbnB1dCAoZXhpc3RpbmcpIGZpbGUKKwkgICAgICAgMiA9IGV4aXN0aW5nIGRpcmVjdG9yeSAKKwkgICAgICAgMyA9IGNyZWF0ZSBuZXcgb3V0cHV0IGZpbGUKKwkgICAgICAgNCA9IG91dHB1dCBmaWxlIGFsbG93aW5nIGFwcGVuZCBhY2Nlc3MKKyAgICBoZWxwOiAgICBIZWxwIHRleHQgKGFycmF5IG9mIHN0cmluZ3Mgb3IgTlVMTCkgW25vdCB1c2VkIGJ5IHBhcnNlcl0uCisgICAgZGZsdDogICAgRGVmYXVsdCByZXNwb25zZS4KKyAgICByZXN1bHQ6ICBQb2ludGVyIHRvIHJlc3VsdCBidWZmZXIuCisgICAgcmxlbmd0aDogTGVuZ3RoIG9mIHJlc3VsdCBidWZmZXIuCisKKyAgUmV0dXJuczoKKyAgIC0xOiAgICAgICBJbnZhbGlkIGFyZ3VtZW50LCByZXN1bHQgdG9vIGxvbmcsIG9yIG90aGVyIGVycm9yLgorICAgIDA6ICAgICAgIFVzZXIgQ2FuY2VsZWQuCisgICAgMTogICAgICAgT0ssIHdpdGggZmlsZS9wYXRobmFtZSBjb3BpZWQgdG8gcmVzdWx0IGJ1ZmZlci4KKyAgICAyOiAgICAgICBMaWtlIDEsIGJ1dCBmb3Igb3V0cHV0IGZpbGUgdGhhdCBpcyB0byBiZSBhcHBlbmRlZCB0by4KKworICBOb3RlczoKKyAgICAxLiBwcmVmYWNlIGFuZCBwcm9tcHQgc2hvdWxkIG5vdCBpbmNsdWRlIGZpbmFsIGxpbmUgdGVybWluYXRvciBidXQgbWF5CisgICAgICAgaW5jbHVkZSBlbWJlZGRlZCBvbmVzLiAgSGVscCB0ZXh0IGlzIGluIGNhc2UgR1VJIGRpYWxvZyBuZWVkcyBhIEhlbHAKKyAgICAgICBidXR0b247IGZpbmFsIGVsZW1lbnQgb2YgaGVscC1zdHJpbmcgYXJyYXkgaXMgIiIuCisKKyAgICAyLiBUaGUgZGVmYXVsdCBtaWdodCBiZSBhIGZpbGVuYW1lLCBhIGRpcmVjdG9yeSBuYW1lLCBhIHJlbGF0aXZlCisgICAgICAgcGF0aG5hbWUsIG9yIGFuIGFic29sdXRlIHBhdGhuYW1lLiAgVGhpcyByb3V0aW5lIG11c3QgY29udmVydCBpdCBpbnRvCisgICAgICAgaW50byBhIGZ1bGx5IHF1YWxpZmllZCAoYWJzb2x1dGUpIHBhdGhuYW1lIHNvIHRoZSB1c2VyIGtub3dzIGV4YWN0bHkKKyAgICAgICB3aGVyZSB0aGUgZmlsZSBpcyB0byBiZSBmb3VuZCBvciBzdG9yZWQuICBJbiBhZGRpdGlvbiwgdGhlIFdpbmRvd3MKKyAgICAgICB2ZXJzaW9uIG9mIHRoaXMgcm91dGluZSBtdXN0IHNlcGFyYXRlIHRoZSBkaXJlY3RvcnkgcGFydCBmcm9tIHRoZQorICAgICAgIG5hbWUgcGFydCwgc28gaXQgY2FuIGRpc3BsYXkgdGhlIGdpdmVuIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBkaWFsb2csCisgICAgICAgYW5kIHB1dCBuYW1lIGluIHRoZSBmaWxlbmFtZSBib3ggdG8gYmUgZWRpdGVkLCByZXBsYWNlZCwgb3IKKyAgICAgICBhY2NlcHRlZC4KKworICAgIDMuIFdoZW4gY2FsbGVkIHdpdGggRkMgNCwgdGhlIFdpbmRvd3MgdmVyc2lvbiBzaG91bGQgaW5jbHVkZSAiTmV3IiBhbmQKKyAgICAgICAiQXBwZW5kIiBidXR0b25zIGluIHRoZSBkaWFsb2cuIHNvIHRoZSB1c2VyIGNhbiBzYXkgd2hldGhlciB0aGUgZmlsZQorICAgICAgIHNob3VsZCBvdmVyd3JpdGUgYW55IGZpbGUgb2YgdGhlIHNhbWUgbmFtZSwgb3IgYmUgYXBwZW5kZWQgdG8gaXQuCisqLworCitpbnQKKyNpZmRlZiBDS19BTlNJQwordXFfZmlsZShjaGFyICogcHJlZmFjZSwgY2hhciAqIGZwcm9tcHQsIGludCBmYywgY2hhciAqKiBoZWxwLAorCWNoYXIgKiBkZmx0LCBjaGFyICogcmVzdWx0LCBpbnQgcmxlbmd0aCkKKyNlbHNlIC8qIENLX0FOU0lDICovCit1cV9maWxlKHByZWZhY2UsZnByb21wdCxmYyxoZWxwLGRmbHQscmVzdWx0LHJsZW5ndGgpCisgICAgY2hhciAqIHByZWZhY2UsICogZnByb21wdCwgKiogaGVscCwgKiBkZmx0LCAqIHJlc3VsdDsKKyAgICBpbnQgZmMsIHJsZW5ndGg7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHVxX2ZpbGUgKi8geworCisgICAgaW50IHJjID0gLTEsIHgsIHksIHo7CisgICAgY2hhciAqIHMsICogcCwgKiBmdWxscGF0aDsKKyAgICBjaGFyIGZpbGVidWZbQ0tNQVhQQVRIKzFdOworCisjaWZkZWYgQ0tfUkVDQUxMCisgICAgZXh0ZXJuIGludCBvbl9yZWNhbGw7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisKKyNpZmRlZiBLVUkKKyAgICBpZiAoIGd1aV9kaWFsb2cgKSB7CisgICAgICAgIHJjID0gZ3VpX3NhdmVhc19kaWFsb2cocHJlZmFjZSxmcHJvbXB0LGZjLGRmbHQscmVzdWx0LHJsZW5ndGgpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorI2VuZGlmIC8qIEtVSSAqLworCisjaWZkZWYgQ0tfUkVDQUxMCisgICAgb25fcmVjYWxsID0gMDsKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKworICAgIGlmIChwcmVmYWNlKQkJCS8qIElmIHByZWZhdG9yeSB0ZXh0IGdpdmVuLi4uICovCisgICAgICBwcmludGYoIiVzXG4iLHByZWZhY2UpOwkJLyogZGlzcGxheSBpdC4gKi8KKworICAgIGNtc2F2cChwc2F2ZSxQUk9NUFRMKTsgICAgICAgICAgICAgIC8qIFNhdmUgb2xkIHByb21wdCAqLworCisgICAgLyogV2UgZ2V0IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBwcm9wb3NlZCBvdXRwdXQgZmlsZSBqdXN0IHNvICovCisgICAgLyogd2UgY2FuIHNob3cgaXQgdG8gdGhlIHVzZXIgYnV0IHdlIGRvbid0IHVzZSBpdCBvdXJzZWx2ZXMuICovCisKKyAgICBwID0gTlVMTDsJCQkJLyogQnVpbGQgbmV3IHByb21wdCAqLworICAgIGlmICghZGZsdCkgZGZsdCA9ICIiOworICAgIGlmICgqZGZsdCkJCQkJLyogSGF2ZSBkZWZhdWx0IGZpbGVuYW1lICovCisgICAgICB6Zm5xZnAoZGZsdCxDS01BWFBBVEgrMSxmaWxlYnVmKTsJLyogR2V0IGZ1bGwgcGF0aCAqLworICAgIGVsc2UKKyAgICAgIGNrbWFrbXNnKGZpbGVidWYsQ0tNQVhQQVRIKzEsemd0ZGlyKCksIm5ld2ZpbGUiLE5VTEwsTlVMTCk7CisgICAgZnVsbHBhdGggPSBmaWxlYnVmOworICAgIHggPSBzdHJsZW4oZnVsbHBhdGgpOworCisgICAgLyogSWYgbm8gcHJvbXB0IGdpdmVuLCBidWlsZCBvbmUgdGhhdCBzaG93cyB0aGUgcHJvcG9zZWQgZnVsbCBwYXRobmFtZS4gKi8KKworICAgIGlmICghZnByb21wdCkgZnByb21wdCA9ICIiOworICAgIGlmICghKmZwcm9tcHQpIGZwcm9tcHQgPSB4ID8gIiBGaWxlbmFtZSIgOiAiIEZpbGVuYW1lOiAiOworICAgIHkgPSBzdHJsZW4oZnByb21wdCk7CisgICAgaWYgKHggPiAwKSB7CQkJLyogSGF2ZSBkZWZhdWx0IHBhdGhuYW1lPyAqLworCXAgPSAoY2hhciAqKW1hbGxvYyh4ICsgeSArIDcpOwkvKiBHZXQgdGVtcCBzdG9yYWdlICovCisJaWYgKHApIHsJCQkvKiBCdWlsZCBwcm9tcHQgKi8KKwkgICAgY2ttYWttc2cocCx4K3krNyxmcHJvbXB0LCIgWyIsZnVsbHBhdGgsIl06ICIpOworCSAgICBmcHJvbXB0ID0gcDsKKwl9CisgICAgfQorICAgIGNtc2V0cChmcHJvbXB0KTsJCQkvKiBNYWtlIG5ldyBwcm9tcHQgKi8KKyAgICBpZiAocCkgZnJlZShwKTsJCQkvKiBGcmVlIHRlbXAgc3RvcmFnZSAqLworICAgIGNtaW5pKGNreGVjaCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgcGFyc2VyLiAqLworICAgIHggPSAtMTsKKyAgICBkbyB7CisgICAgICAgIHByb21wdChOVUxMKTsgICAgICAgICAgICAgICAgICAgLyogSXNzdWUgcHJvbXB0LiAqLworICAgICAgICBzd2l0Y2ggKGZjKSB7CQkJLyogUGFyc2UgZGVwZW5kcyBvbiBmdW5jdGlvbiBjb2RlICovCisgICAgICAgICAgY2FzZSAxOgkJCS8qIElucHV0IGZpbGUgKi8KKwkgICAgeCA9IGNtaWZpKCJOYW1lIG9mIGV4aXN0aW5nIGZpbGUiLGRmbHQsJnMsJnkseHhzdHJpbmcpOworCSAgICByYyA9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSAyOgkJCS8qIERpcmVjdG9yeSAqLworCSAgICB4ID0gY21kaXIoIkRpcmVjdG9yeSBuYW1lIixkZmx0LCZzLHh4c3RyaW5nKTsKKwkgICAgcmMgPSAxOworCSAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDM6CQkJLyogTmV3IG91dHB1dCBmaWxlICovCisJICAgIC8qIEZhbGwgdGhydS4uLiAqLworCSAgY2FzZSA0OgkJCS8qIE91dHB1dCBmaWxlIC0gQXBwZW5kIGFsbG93ZWQgKi8KKwkgICAgeCA9IGNtb2ZpKCJPdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uIixkZmx0LCZzLHh4c3RyaW5nKTsKKwkgICAgcmMgPSAoZmMgPT0gNCkgPyAxIDogMjsKKwkgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoJCQkvKiBCYWQgZnVuY3Rpb24gY29kZSAqLworCSAgICBnb3RvIHhfdXFfZmlsZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeCA8IDApIHsJCQkvKiBQYXJzZSBlcnJvciAqLworCSAgICBmaWxlYnVmWzBdID0gTlVMOworICAgICAgICAgICAgaWYgKHggPT0gLTQpIHsgICAgICAgICAgICAgIC8qIEVPRiAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmICh4ID09IC0zKSAgICAgICAgIC8qIE5vIGFuc3dlcj8gKi8KKyAgICAgICAgICAgICAgcHJpbnRmKGZjID09IDIgPworCQkgICAgICIgUGxlYXNlIGVudGVyIGEgZGlyZWN0b3J5IG5hbWUuXG4iIDoKKwkJICAgICAiIFBsZWFzZSBlbnRlciBhIGZpbGVuYW1lLlxuIgorCQkgICAgICk7CisgICAgICAgICAgICBjbWluaShja3hlY2gpOworICAgICAgICB9IGVsc2UgeworCSAgICB6ID0gc3RybGVuKHMpOworCSAgICBpZiAoeiA+IHJsZW5ndGggfHwgY2tzdHJuY3B5KGZpbGVidWYsYnJzdHJpcChzKSxDS01BWFBBVEgrMSkgPCB6KSB7CisJCXByaW50ZigiP05hbWUgdG9vIGxvbmdcbiIpOworCQl4ID0gLTk7CisJICAgIH0gZWxzZQorCSAgICAgIHggPSBjbWNmbSgpOwkJLyogR2V0IGNvbmZpcm1hdGlvbiAqLworICAgICAgICB9CisJaWYgKGZjID09IDEgJiYgeCA+IC0xICYmIHkgPiAwKSB7CisJICAgIHByaW50ZigiP1dpbGRjYXJkcyBub3QgYWxsb3dlZFxuIik7CisJICAgIHggPSAtOTsKKwl9CisgICAgfSB3aGlsZSAoeCA8IDApOyAgICAgICAgICAgICAgICAgICAgLyogQ29udGludWUgdGlsbCBkb25lICovCisKKyAgeF91cV9maWxlOgorICAgIGlmICh4IDwgMCkKKyAgICAgIHJjID0gLTE7CisKKyAgICBjbXNldHAocHNhdmUpOyAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIHJlYWwgcHJvbXB0ICovCisKKyAgICBpZiAocmMgPiAwKQorICAgICAgY2tzdHJuY3B5KHJlc3VsdCxmaWxlYnVmLHJsZW5ndGgpOworICAgIHJldHVybihyYyk7Cit9CisKKworI2lmZGVmIENLX1BFUk1TCisjaWZkZWYgVU5JWAorCitfUFJPVE9UWVAoIGludCB6c2V0cGVybSwgKGNoYXIgKiwgaW50KSk7CisKKy8qIENITU9EIGNvbW1hbmQgZm9yIFVOSVggb25seSAqLworCisjZGVmaW5lIENITV9ESVIgMAorI2RlZmluZSBDSE1fRE9UIDEKKyNkZWZpbmUgQ0hNX0ZJTCAyCisjZGVmaW5lIENITV9MSVMgMworI2RlZmluZSBDSE1fTk9MIDQKKyNkZWZpbmUgQ0hNX1FVSSA1CisjZGVmaW5lIENITV9SRUMgNgorI2RlZmluZSBDSE1fVlJCIDcKKyNkZWZpbmUgQ0hNX1BBRyA4CisjZGVmaW5lIENITV9OT1AgOQorI2RlZmluZSBDSE1fVFlQIDEwCisjZGVmaW5lIENITV9TSU0gMTEKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgdWNobW9kc3dbXSA9IHsKKyAgICAiL2RpcmVjdG9yaWVzIiwgQ0hNX0RJUiwgMCwKKyAgICAiL2RvdGZpbGVzIiwgICAgQ0hNX0RPVCwgMCwKKyAgICAiL2ZpbGVzIiwgICAgICAgQ0hNX0ZJTCwgMCwKKyAgICAiL2xpc3QiLCAgICAgICAgQ0hNX0xJUywgMCwKKyAgICAiL25vbGlzdCIsICAgICAgQ0hNX05PTCwgMCwKKyAgICAiL25vcGFnZSIsICAgICAgQ0hNX05PUCwgMCwKKyAgICAiL3BhZ2UiLCAgICAgICAgQ0hNX1BBRywgMCwKKyAgICAiL3F1aWV0IiwgICAgICAgQ0hNX1FVSSwgQ01fSU5WLAorICAgICIvcmVjdXJzaXZlIiwgICBDSE1fUkVDLCAwLAorICAgICIvc2ltdWxhdGUiLCAgICBDSE1fU0lNLCAwLAorICAgICIvdHlwZSIsICAgICAgICBDSE1fVFlQLCBDTV9BUkcsCisgICAgIi92ZXJib3NlIiwgICAgIENITV9WUkIsIENNX0lOViwKK307CitzdGF0aWMgaW50IG5jaG1vZHN3ID0gKHNpemVvZih1Y2htb2RzdykgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitpbnQKK2RvdWNobW9kKCkgeworICAgIGV4dGVybiBpbnQgcmVjdXJzaXZlLCBuc2NhbmZpbGUsIGRpcmFjdGl2ZTsKKyNpZmRlZiBDS19UVEdXU0laCisgICAgZXh0ZXJuIGludCB0dF9yb3dzLCB0dF9jb2xzOworICAgIGludCBuID0gMDsKKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisgICAgaW50IGksIGZpbGVzID0gMSwgdDEgPSAxLCB0MiA9IDAsIHgsIHksIHosIHZlcmJvc2UgPSAwLCByYyA9IDEsIHBhZ2luZzsKKyAgICBpbnQgeG1vZGUgPSAtMSwgZnMgPSAwLCBnZXR2YWwgPSAwLCBzaW11bGF0ZSA9IDAsIHdpbGQgPSAwOworICAgIGNoYXIgYywgKiBzOworICAgIHN0cnVjdCBGREIgc3csIG51OworCisgICAgaWYgKHhhc2ttb3JlIDwgMCkgeworI2lmZGVmIENLX1RUR1dTSVoKKyAgICAgICAgeGFza21vcmUgPSAxOworI2Vsc2UKKyAgICAgICAgeGFza21vcmUgPSAwOworI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKyAgICB9CisgICAgcGFnaW5nID0geGFza21vcmU7CisKKyAgICBjbWZkYmkoJnN3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBGREIgLSBjb21tYW5kIHN3aXRjaGVzICovCisgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIk9jdGFsIGZpbGUgcGVybWlzc2lvbiBjb2RlLCBvciBzd2l0Y2giLAorICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICBuY2htb2RzdywgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgIHVjaG1vZHN3LCAgICAgICAgICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAmbnUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKyAgICAgICAgICAgKTsKKyAgICBjbWZkYmkoJm51LAorICAgICAgICAgICBfQ01OVU0sICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhlbHAgbWVzc2FnZSAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOL0EgKi8KKyAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSYWRpeCA9IDggKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOL0EgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogTi9BICovCisgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV4dCAqLworICAgICAgICAgICApOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCh4ID0gY21mZGIoJnN3KSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9GaWxlbmFtZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgYyA9IGNtZ2JyaygpOworICAgICAgICBnZXR2YWwgPSAoYyA9PSAnOicgfHwgYyA9PSAnPScpOworICAgICAgICBpZiAoZ2V0dmFsICYmICEoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnZXR2YWwgJiYgKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNtcmVzdWx0Lm5yZXN1bHQpIHsKKyAgICAgICAgICBjYXNlIENITV9ESVI6CisgICAgICAgICAgICB0MSA9IDE7CisgICAgICAgICAgICB0MiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENITV9ET1Q6CisgICAgICAgICAgICBtYXRjaGRvdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENITV9GSUw6CisgICAgICAgICAgICB0MSA9IDA7CisgICAgICAgICAgICB0MiA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENITV9MSVM6CisgICAgICAgICAgY2FzZSBDSE1fVlJCOgorICAgICAgICAgICAgdmVyYm9zZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENITV9OT0w6CisgICAgICAgICAgY2FzZSBDSE1fUVVJOgorICAgICAgICAgICAgdmVyYm9zZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENITV9SRUM6CisgICAgICAgICAgICByZWN1cnNpdmUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDSE1fUEFHOgorICAgICAgICAgICAgdmVyYm9zZSA9IDE7CisgICAgICAgICAgICBwYWdpbmcgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDSE1fTk9QOgorICAgICAgICAgICAgcGFnaW5nID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0hNX1NJTToKKyAgICAgICAgICAgIHNpbXVsYXRlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0hNX1RZUDogeworICAgICAgICAgICAgICBleHRlcm4gc3RydWN0IGtleXRhYiB0eHRiaW5bXTsKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkodHh0YmluLDMsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICBpZiAoeCA9PSAyKSB7ICAgICAgICAgICAgIC8qIEFMTCAqLworICAgICAgICAgICAgICAgICAgeG1vZGUgPSAtMTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAvKiBURVhUIG9yIEJJTkFSWSBvbmx5ICovCisgICAgICAgICAgICAgICAgICB4bW9kZSA9IHg7CisgICAgICAgICAgICAgICAgICBmcyA9IDE7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHogPSBjbXJlc3VsdC5ucmVzdWx0OworICAgIHggPSBjbWlmaTIoIkZpbGUgc3BlY2lmaWNhdGlvbiIsIiIsJnMsJndpbGQsdDEsTlVMTCx4eHN0cmluZyx0Mik7CisgICAgaWYgKHggPCAwKSB7CisgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICBwcmludGYoIj9BIGZpbGUgc3BlY2lmaWNhdGlvbiBpcyByZXF1aXJlZFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgfQorICAgIGNrc3RybmNweSh0bXBidWYscyxUTVBCVUZTSVopOworICAgIHMgPSB0bXBidWY7CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworI2lmZGVmIFpYUkVXSU5ECisgICAgaWYgKHdpbGQpIGZpbGVzID0genhyZXdpbmQoKTsKKyNlbHNlCisgICAgaWYgKHdpbGQpIGZpbGVzID0gbnp4cGFuZChzLDApOworI2VuZGlmIC8qIFpYUkVXSU5EICovCisKKyAgICBpZiAocGFnaW5nID4gLTEpCisgICAgICB4YXNrbW9yZSA9IHBhZ2luZzsKKworI2lmZGVmIENLX1RUR1dTSVoKKyAgICBpZiAodmVyYm9zZSAmJiBwYWdpbmcpIHsKKyNpZmRlZiBPUzIKKyAgICAgICAgdHRnY3dzeigpOworI2Vsc2UgLyogT1MyICovCisgICAgICAgIGlmICh0dGd3c2l6KCkgPiAwKSB7CisgICAgICAgICAgICBpZiAodHRfcm93cyA+IDAgJiYgdHRfY29scyA+IDApIHsKKyAgICAgICAgICAgICAgICBjbWRfcm93cyA9IHR0X3Jvd3M7CisgICAgICAgICAgICAgICAgY21kX2NvbHMgPSB0dF9jb2xzOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisgICAgfQorI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBmaWxlczsgaSsrKSB7CisgICAgICAgIGlmIChmaWxlcyA9PSAxICYmIHdpbGQgPT0gMCkgeyAgLyogRm9yICJjaG1vZCA3NzcgLiIgKi8KKyAgICAgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHggPSB6bmV4dChsaW5lKTsKKyAgICAgICAgICAgIGlmICh4IDwgMSkgeworICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/Tm8gZmlsZXMgbWF0Y2ggLSBcIiVzXCJcbiIsbGluZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZnMpIHsKKyNpZmRlZiBWTVNPUlVOSVgKKyAgICAgICAgICAgIC8qIElmIC9UWVBFOlRFWFQgb3IgQklOQVJZIGdpdmVuLCBza2lwIGRpcmVjdG9yaWVzIGFuZCBsaW5rcyAqLworICAgICAgICAgICAgLyogc2luY2UgdGhleSBhcmUgbmVpdGhlciB0ZXh0IG5vciBiaW5hcnkuICovCisgICAgICAgICAgICBleHRlcm4gaW50IHpnZnNfZGlyLCB6Z2ZzX2xpbms7CisgICAgICAgICAgICB6Z2V0ZnMobGluZSk7CisgICAgICAgICAgICBpZiAoemdmc19kaXIgfHwgemdmc19saW5rKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbHNlCisgICAgICAgICAgICBpZiAoemNoa2kobGluZSkgPCAwKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbmRpZiAvKiBWTVNPUlVOSVggKi8KKyAgICAgICAgICAgIC8qIFJlZ3VsYXIgZmlsZSwgc2NhbiBpdCAqLworICAgICAgICAgICAgc3dpdGNoIChzY2FuZmlsZShsaW5lLCZ5LG5zY2FuZmlsZSkpIHsKKyAgICAgICAgICAgICAgY2FzZSBGVF9CSU46CisgICAgICAgICAgICAgICAgaWYgKHhtb2RlICE9IDEpCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBGVF9URVhUOgorICAgICAgICAgICAgICBjYXNlIEZUXzdCSVQ6CisgICAgICAgICAgICAgIGNhc2UgRlRfOEJJVDoKKyNpZmRlZiBVTklDT0RFCisgICAgICAgICAgICAgIGNhc2UgRlRfVVRGODoKKyAgICAgICAgICAgICAgY2FzZSBGVF9VQ1MyOgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyAgICAgICAgICAgICAgICBpZiAoeG1vZGUgIT0gMCkKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzaW11bGF0ZSkgeworI2lmZGVmIFVOSVgKKyAgICAgICAgICAgIGV4dGVybiBpbnQgemNoa29kOyAgICAgICAgICAvKiBVbmlkZW50aWZpZWQgRmx5aW5nICovCisgICAgICAgICAgICBpbnQgeHggPSB6Y2hrb2Q7ICAgICAgICAgICAgLyogQVBJIEV4dGVuc2lvbi4uLiAqLworICAgICAgICAgICAgemNoa29kID0gMTsKKyNlbmRpZiAvKiBVTklYICovCisgICAgICAgICAgICBpZiAoemNoa28obGluZSkgPCAwKQorICAgICAgICAgICAgICBwcmludGYoIiVzIC0gQWNjZXNzIGRlbmllZFxuIixsaW5lKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCIlcyAtIE9LXG4iLGxpbmUpOworI2lmZGVmIFVOSVgKKyAgICAgICAgICAgIHpjaGtvZCA9IHh4OworI2VuZGlmIC8qIFVOSVggKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh6c2V0cGVybShsaW5lLHopIDwgMSkgeworICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlIHx8IGZpbGVzIDwgMikgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzOiAlc1xuIixsaW5lLGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgJXNcbiIsemlwZXJtKGxpbmUpLGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjaWZkZWYgQ0tfVFRHV1NJWgorICAgICAgICBpZiAodmVyYm9zZSAmJiBwYWdpbmcpIHsgICAgICAgIC8qIFBhdXNlIGF0IGVuZCBvZiBzY3JlZW4gKi8KKyAgICAgICAgICAgIGlmIChjbWRfcm93cyA+IDAgJiYgY21kX2NvbHMgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWFza21vcmUoKSkKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKworICAgIH0KKyAgICByZXR1cm4oc3VjY2VzcyA9IHJjKTsKK30KKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKworI2lmbmRlZiBOT1NQTCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFMtRXhwcmVzc2lvbnMgKi8KKyNpZm5kZWYgTk9TRVhQCisKK3N0cnVjdCBrZXl0YWIgc2V4cHRhYltdID0geworICAgICJkZXB0aC1saW1pdCIsIDEsIDAsCisgICAgImVjaG8tcmVzdWx0IiwgMCwgMAorfTsKKworc3RhdGljIGludCBzZXhwbWF4ZGVwID0gMTAwMDsgICAgICAgICAgIC8qIE1heGltdW0gZGVwdGggKi8KKworI2RlZmluZSB4eGZsb2F0KHMseCkgXAorKChpc2RpZ2l0KCpzKXx8KCpzPT0nLScpfHwoKnM9PScrJyl8fCgqcz09Jy4nKXx8KCpzPT0nXDA0MCcpKT9pc2Zsb2F0KHMseCk6MCkKKworI2RlZmluZSBTWF9BREQgIDEgICAgICAgICAgICAgICAgICAgICAgIC8qIFN5bWJvbHMgZm9yIGJ1aWx0LWluIG9wZXJhdG9ycyAqLworI2RlZmluZSBTWF9TVUIgIDIKKyNkZWZpbmUgU1hfTVVMICAzCisjZGVmaW5lIFNYX0RJViAgNAorI2RlZmluZSBTWF9QT1cgIDUKKyNkZWZpbmUgU1hfU0VUICA2CisjZGVmaW5lIFNYX01PRCAgNworI2RlZmluZSBTWF9FVkEgIDgKKyNkZWZpbmUgU1hfRVhQICA5CisjZGVmaW5lIFNYX0FFUSAxMAorI2RlZmluZSBTWF9BTFQgMTEKKyNkZWZpbmUgU1hfQUdUIDEyCisjZGVmaW5lIFNYX0FMRSAxMworI2RlZmluZSBTWF9BR0UgMTQKKyNkZWZpbmUgU1hfTUlOIDE1CisjZGVmaW5lIFNYX01BWCAxNgorI2RlZmluZSBTWF9TUVIgMTcKKyNkZWZpbmUgU1hfRkxSIDE4CisjZGVmaW5lIFNYX0NFSSAxOQorI2RlZmluZSBTWF9UUlUgMjAKKyNkZWZpbmUgU1hfQUJTIDIxCisjZGVmaW5lIFNYX1JPVSAyMgorI2RlZmluZSBTWF9MRVQgMjMKKyNkZWZpbmUgU1hfTEdOIDI0CisjZGVmaW5lIFNYX0xHWCAyNQorI2RlZmluZSBTWF9GTE8gMjYKKyNkZWZpbmUgU1hfSUZDIDI3CisjZGVmaW5lIFNYX05PVCAyOAorI2RlZmluZSBTWF9ORVEgMjkKKyNkZWZpbmUgU1hfQU5EIDMwCisjZGVmaW5lIFNYX0xPUiAzMQorI2RlZmluZSBTWF9TSU4gMzIKKyNkZWZpbmUgU1hfQ09TIDMzCisjZGVmaW5lIFNYX1RBTiAzNAorI2RlZmluZSBTWF9CV0EgMzUKKyNkZWZpbmUgU1hfQldPIDM2CisjZGVmaW5lIFNYX0JXWCAzNworI2RlZmluZSBTWF9CV04gMzgKKyNkZWZpbmUgU1hfWE9SIDM5CisjZGVmaW5lIFNYX0lOQyA0MAorI2RlZmluZSBTWF9ERUMgNDEKKyNkZWZpbmUgU1hfUVVPIDQyCisjZGVmaW5lIFNYX1NUUiA0MworCisvKiBPcGVyYXRvciBmbGFncyAqLworCisjZGVmaW5lIFNYRl9QUkUgMjU2ICAgICAgICAgICAgICAgICAgICAgLyogUHJlZGljYXRlICovCisjZGVmaW5lIFNYRl9PTkUgNTEyICAgICAgICAgICAgICAgICAgICAgLyogUmVxdWlyZXMgb25lIGFyZyAqLworI2RlZmluZSBTWEZfVFdPIDEwMjQgICAgICAgICAgICAgICAgICAgIC8qIFJlcXVpcmVzIHR3byBhcmdzIG9yIG1vcmUgKi8KKyNkZWZpbmUgU1hGX0ZMTyAyMDQ4ICAgICAgICAgICAgICAgICAgICAvKiBDb2VyY2UgdG8gZmxvYXRpbmctcG9pbnQgKi8KKworLyogQnVpbHQtaW4gY29uc3RhbnRzICovCisKKyNkZWZpbmUgU1hDX05JTCAxICAgICAgICAgICAgICAgICAgICAgICAvKiBOSUwgKi8KKyNkZWZpbmUgU1hDX1BJICAyICAgICAgICAgICAgICAgICAgICAgICAvKiBQSSAqLworI2RlZmluZSBTWENfVCAgIDMgICAgICAgICAgICAgICAgICAgICAgIC8qIFQgKi8KKworLyoKKyAgVGhpcyBpcyBhbiB4bG9va3VwKCkgdGFibGUgYW5kIHNvIG5lZWQgbm90IGJlIGluICJhbGhhYmV0aWNhbCIgb3JkZXIuCisgIFRoZXJlZm9yZSBlbnRyaWVzIGFyZSBhcnJhbmdlZCB0byBtaW5pbWl6ZSBzZWFyY2ggZm9yIG1vc3QgY29tbW9uCisgIG9wZXJhdG9ycy4KKyovCitzdGF0aWMgc3RydWN0IGtleXRhYiBzZXhwb3BzW10gPSB7ICAgICAgLyogQnVpbHQtaW4gb3BlcmF0b3JzICovCisgICAgInNldHEiLCAgICBTWF9TRVQsIDAsICAgICAgICAgICAgICAgLyogR2xvYmFsIGFzc2lnbm1lbnQgKi8KKyAgICAiKyIsICAgICAgIFNYX0FERCwgMCwgICAgICAgICAgICAgICAvKiBTaW1wbGUgYXJpdGhtZXRpYyAqLworICAgICItIiwgICAgICAgU1hfU1VCLCAwLAorICAgICIqIiwgICAgICAgU1hfTVVMLCAwLAorICAgICIvIiwgICAgICAgU1hfRElWLCBTWEZfVFdPLAorICAgICJeIiwgICAgICAgU1hfUE9XLCBTWEZfVFdPLAorCisgICAgImlmIiwgICAgICBTWF9JRkMsIFNYRl9UV08sICAgICAgICAgLyogSUYgKi8KKyAgICAibGV0IiwgICAgIFNYX0xFVCwgMCwgICAgICAgICAgICAgICAvKiBMb2NhbCBhc3NpZ25tZW50ICovCisgICAgIm5vdCIsICAgICBTWF9OT1QsIFNYRl9PTkUsICAgICAgICAgLyogTk9UICovCisgICAgIm1vZCIsICAgICBTWF9NT0QsIFNYRl9UV08sICAgICAgICAgLyogTW9kdWx1cyAqLworCisgICAgIjwiLCAgICAgICBTWF9BTFQsIFNYRl9QUkV8U1hGX1RXTywgLyogQ29tcGFyaXNvbnMgKi8KKyAgICAiPiIsICAgICAgIFNYX0FHVCwgU1hGX1BSRXxTWEZfVFdPLAorICAgICI8PSIsICAgICAgU1hfQUxFLCBTWEZfUFJFfFNYRl9UV08sCisgICAgIj0iLCAgICAgICBTWF9BRVEsIFNYRl9QUkV8U1hGX1RXTywKKyAgICAiPj0iLCAgICAgIFNYX0FHRSwgU1hGX1BSRXxTWEZfVFdPLAorICAgICIhPSIsICAgICAgU1hfTkVRLCBTWEZfUFJFfFNYRl9UV08sCisKKyAgICAiKysiLCAgICAgIFNYX0lOQywgU1hGX09ORXxTWEZfVFdPLCAvKiBJbmNyZW1lbnQgKi8KKyAgICAiLS0iLCAgICAgIFNYX0RFQywgU1hGX09ORXxTWEZfVFdPLCAvKiBEZWNyZW1lbnQgKi8KKworICAgICIqKiIsICAgICAgU1hfUE9XLCBTWEZfVFdPLCAgICAgICAgIC8qIENvbW1vbiBzeW5vbnltcyAqLworICAgICI9PSIsICAgICAgU1hfQUVRLCBTWEZfUFJFfFNYRl9UV08sCisgICAgIiEiLCAgICAgICBTWF9OT1QsIFNYRl9PTkUsCisgICAgIi4iLCAgICAgICBTWF9FVkEsIDAsCisKKyAgICAiYW5kIiwgICAgIFNYX0FORCwgMCwgICAgICAgICAgICAgICAvKiBMb2dpY2FsIG9wZXJhdG9ycyAqLworICAgICJvciIsICAgICAgU1hfTE9SLCAwLAorICAgICJ4b3IiLCAgICAgU1hfWE9SLCBTWEZfVFdPLAorCisgICAgIm1heCIsICAgICBTWF9NQVgsIFNYRl9PTkV8U1hGX1RXTywgLyogTWF4IGFuZCBtaW4gKi8KKyAgICAibWluIiwgICAgIFNYX01JTiwgU1hGX09ORXxTWEZfVFdPLAorCisgICAgIiUiLCAgICAgICBTWF9NT0QsIFNYRl9UV08sICAgICAgICAgLyogTW9yZSBzeW5vbnltcyAqLworICAgICJ8fCIsICAgICAgU1hfTE9SLCAwLAorICAgICImJiIsICAgICAgU1hfQU5ELCAwLAorCisgICAgInF1b3RlIiwgICBTWF9RVU8sIFNYRl9PTkUsCisgICAgInN0cmluZyIsICBTWF9TVFIsIFNYRl9PTkUsCisKKyAgICAiZXZhbCIsICAgIFNYX0VWQSwgMCwgICAgICAgICAgICAgICAvKiBBc3NvcnRlZCBjb21tYW5kcyAqLworICAgICJhYnMiLCAgICAgU1hfQUJTLCBTWEZfT05FLAorICAgICJ0cnVuY2F0ZSIsU1hfVFJVLCBTWEZfT05FfFNYRl9GTE8sCisgICAgInJvdW5kIiwgICBTWF9ST1UsIFNYRl9PTkV8U1hGX0ZMTywKKyAgICAiY2VpbGluZyIsIFNYX0NFSSwgU1hGX09ORXxTWEZfRkxPLAorICAgICJmbG9vciIsICAgU1hfRkxSLCBTWEZfT05FfFNYRl9GTE8sCisgICAgImZsb2F0IiwgICBTWF9GTE8sIFNYRl9PTkV8U1hGX0ZMTywKKworI2lmZGVmIEZORkxPQVQKKyAgICAic3FydCIsICAgIFNYX1NRUiwgU1hGX09ORXxTWEZfRkxPLCAvKiBGbG9hdGluZyBwb2ludCBmdW5jdGlvbnMgKi8KKyAgICAiZXhwIiwgICAgIFNYX0VYUCwgU1hGX09ORXxTWEZfRkxPLAorICAgICJzaW4iLCAgICAgU1hfU0lOLCBTWEZfT05FfFNYRl9GTE8sCisgICAgImNvcyIsICAgICBTWF9DT1MsIFNYRl9PTkV8U1hGX0ZMTywKKyAgICAidGFuIiwgICAgIFNYX1RBTiwgU1hGX09ORXxTWEZfRkxPLAorICAgICJsb2ciLCAgICAgU1hfTEdOLCBTWEZfT05FfFNYRl9GTE8sCisgICAgImxvZzEwIiwgICBTWF9MR1gsIFNYRl9PTkV8U1hGX0ZMTywKKyNlbmRpZiAvKiBGTkZMT0FUICovCisKKyAgICAiIyIsICAgICAgIFNYX0JXWCwgU1hGX1RXTywgICAgICAgICAvKiBCaXR3aXNlIG9wZXJhdG9ycyAqLworICAgICImIiwgICAgICAgU1hfQldBLCAwLAorICAgICJ8IiwgICAgICAgU1hfQldPLCAwLAorICAgICJ+IiwgICAgICAgU1hfQldOLCBTWEZfT05FLAorICAgICIiLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChlbmQpICovCit9Oworc3RhdGljIGludCBuc2V4cG9wcyA9IChzaXplb2Yoc2V4cG9wcykgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgc2V4cGNvbnN0c1tdID0geyAgIC8qIEJ1aWx0LWluIGNvbnN0YW50cyAqLworICAgICJuaWwiLCBTWENfTklMLCAwLCAgICAgICAgICAgICAgICAgIC8qIE5JTCAoZmFsc2UpICovCisgICAgInBpIiwgIFNYQ19QSSwgIDAsICAgICAgICAgICAgICAgICAgLyogUGkgKDMuMTQxNTkyNi4uLikgKi8KKyAgICAidCIsICAgU1hDX1QsICAgMCwgICAgICAgICAgICAgICAgICAvKiBUICh0cnVlKSAqLworICAgICIiLCAwLCAwCit9Oworc3RhdGljIGludCBuc2V4cGNvbnN0cyA9IChzaXplb2Yoc2V4cGNvbnN0cykgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworaW50IHNleHByYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFMtRXhwcmVzc2lvbiBlcnJvciBmbGFnICovCitpbnQgc2V4cHB2ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJlZGljYXRlIHZhbHVlICovCisKKyNkZWZpbmUgU1hNTEVOIDY0ICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBhcmcgbGlzdCBpbml0aWFsIGxlbmd0aCAqLworI2luY2x1ZGUgPG1hdGguaD4gICAgICAgICAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nLXBvaW50IGZ1bmN0aW9ucyAqLworCitfUFJPVE9UWVAoIGNoYXIgKiBmcGZvcm1hdCwgKENLRkxPQVQsIGludCwgaW50KSApOworCitleHRlcm4gY2hhciBtYXRoX3BpW107ICAgICAgICAgICAgICAgICAgLyogVmFsdWUgb2YgUGkgKi8KK2V4dGVybiBpbnQgc2V4cGVjaG87ICAgICAgICAgICAgICAgICAgICAvKiBTRVQgU0VYUFJFU1NJT04gRUNITyB2YWx1ZSAqLworZXh0ZXJuIGNoYXIgKiBzZXhwdmFsOyAgICAgICAgICAgICAgICAgIC8qIExhc3QgdG9wLWxldmVsIFMtRXhwcmVzc2lvbiB2YWx1ZSAqLworZXh0ZXJuIGNoYXIgKiBsYXN0c2V4cDsgICAgICAgICAgICAgICAgIC8qIExhc3QgUy1FeHByZXNzaW9uICovCitpbnQgc2V4cHJtYXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogTG9uZ2VzdCByZXN1bHQgKGZvciBzdGF0cykgKi8KK2ludCBzZXhwZG1heCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXggZGVwdGggcmVhY2hlZCAoZm9yIHN0YXRzKSAqLworaW50IHNleHBkZXAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvc2V4cCgpIHJlY3Vyc2lvbiBkZXB0aCAqLworc3RhdGljIGludCAqIHN4cmxlbiA9IE5VTEw7ICAgICAgICAgICAgIC8qIFJlc3VsdCBzdGFjayBzdHJpbmcgc2l6ZXMgKi8KK3N0YXRpYyBjaGFyICoqIHN4cmVzdWx0ID0gTlVMTDsgICAgICAgICAvKiBSZXN1bHQgc3RhY2sgKi8KKworLyogIHMgaCBvIHMgZSB4IHAgIC0tICBTaG93IFMtRXhwcmVzc2lvbiBpbmZvICAqLworCitWT0lECitzaG9zZXhwKCkgeworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIiBzZXhwcmVzc2lvbiBlY2hvLXJlc3VsdDogJXNcbiIsc2hvd29vYShzZXhwZWNobykpOworICAgIHByaW50ZigiIHNleHByZXNzaW9uIGRlcHRoLWxpbWl0OiAlZFxuIixzZXhwbWF4ZGVwKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCIgbWF4aW11bSBkZXB0aCByZWFjaGVkOiAgICVkXG4iLHNleHBkbWF4KTsKKyAgICBwcmludGYoIiBsb25nZXN0IHJlc3VsdCByZXR1cm5lZDogJWRcbiIsc2V4cHJtYXgpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIiBsYXN0IHNleHByZXNzaW9uOiAgICAgICAgJXNcbiIsbGFzdHNleHAgPyBsYXN0c2V4cCA6ICIobm9uZSkiKTsKKyAgICBwcmludGYoIiBsYXN0IHZhbHVlOiAgICAgICAgICAgICAgJXNcbiIsc2V4cHZhbCA/IHNleHB2YWwgOiAiKG5vbmUpIik7CisgICAgcHJpbnRmKCJcbiIpOworfQorCisKK3N0YXRpYyBjaGFyICoKK3NleHBkZWJ1ZyhzKSBjaGFyICogczsgeworICAgIC8qIEZvciBkZWJ1Z2dpbmcgLS0gaW5jbHVkZXMgcmVjdXJzaW9uIGRlcHRoIGluIGVhY2ggZGVidWcgZW50cnkgKi8KKyAgICBzdGF0aWMgY2hhciBidWZbNjRdOworICAgIGNrbWFrbXNnKGJ1Ziw2NCwiZG9zZXhwWyIsY2tpdG9hKHNleHBkZXApLCJdICIscyk7CisgICAgcmV0dXJuKChjaGFyICopYnVmKTsKK30KKworLyogIGQgbyBzIGUgeCBwICAtLSAgUy1FeHByZXNzaW9uIFJlYWRlciAgKi8KKworLyogIFJldHVybnMgdmFsdWUgYXMgc3RyaW5nIChlbXB0eSwgbnVtZXJpYywgb3Igbm9uLW51bWVyaWMpICovCisKK2NoYXIgKgorZG9zZXhwKHMpIGNoYXIgKnM7IHsgICAgICAgICAgICAgICAgICAgIC8qIHMgPSBTLUV4cHJlc3Npb24gKi8KKyAgICBleHRlcm4gc3RydWN0IG10YWIgKm1hY3RhYjsgICAgICAgICAvKiBNYWNybyB0YWJsZSAqLworICAgIGV4dGVybiBpbnQgbWFjbHZsLCBubWFjOworICAgIGV4dGVybiBjaGFyICptcnZhbFtdOworICAgIGV4dGVybiBpbnQgbWFrZXN0cmxlbjsgICAgICAgICAgICAgIC8qIChzZWUgbWFrZXN0cigpKSAqLworICAgIHN0cnVjdCBzdHJpbmdhcnJheSAqIHEgPSBOVUxMOyAgICAgIC8qIGNrc3BsaXQoKSByZXR1cm4gdHlwZSAqLworICAgIGNoYXIgKiBwW1NFWFBNQVgrMV0sICoqIHAyOyAgICAgICAgIC8qIExpc3QgaXRlbXMgKG11c3QgYmUgb24gc3RhY2spICovCisgICAgY2hhciAqIGxpbmUgPSBOVUxMOyAgICAgICAgICAgICAgICAgLyogRm9yIGJ1aWxkaW5nIG1hY3JvIGFyZ3VtZW50IGxpc3QgKi8KKyAgICBpbnQgbm9zcGxpdCA9IDA7CisgICAgaW50IGxpbmVsZW4gPSAwOworICAgIGludCBsaW5lcG9zID0gMDsKKyAgICBpbnQgcXVvdGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBMSVNQIHF1b3RlIGZsYWcgKi8KKyAgICBjaGFyICogczI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXb3JrZXJzICovCisgICAgaW50IGksIGosIGssIG4gPSAwLCB4ID0gMCwga3csIGt3ZmxhZ3MsIG14ID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMCwgbm90ID0gMCwgdHJ1bmNhdGUgPSAwLCBidWlsdGluID0gMDsKKyAgICBpbnQgZnBmbGFnID0gMCwgcXVpdCA9IDAsIG1hY3JvID0gMDsKKyAgICBDS0ZMT0FUIGZwaiwgZnByZXN1bHQgPSAwLjA7ICAgICAgICAvKiBGbG9hdGluZy1wb2ludCByZXN1bHRzICovCisgICAgaW50IHBmbGFnID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogSGF2ZSBwcmVkaWNhdGUgKi8KKyAgICBpbnQgcHJlc3VsdCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBQcmVkaWNhdGUgcmVzdWx0ICovCisgICAgaW50IG11c3RmcmVlID0gMDsgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgbWFsbG9jJ2Qgd2UgbXVzdCBmcmVlICovCisKKyAgICBzZXhwcHYgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmVkaWNhdGUgdmFsdWUgKi8KKyAgICBzMiA9ICIiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IHJldHVybiB2YWx1ZSAqLworCisgICAgaWYgKCsrc2V4cGRlcCA+IHNleHBtYXhkZXApIHsgICAgICAgLyogS2VlcCB0cmFjayBvZiBkZXB0aCAqLworICAgICAgICBwcmludGYoIj9TLUV4cHJlc3Npb24gZGVwdGggbGltaXQgZXhjZWVkZWQ6ICVkXG4iLHNleHBtYXhkZXApOworICAgICAgICBzZXhwcmMrKzsKKyAgICAgICAgZGVidWcoRjExMSxzZXhwZGVidWcoIm1heCBkZXB0aCBleGNlZWRlZCIpLHMsc2V4cHJjKTsKKyAgICB9CisgICAgaWYgKHNleHBkZXAgPiBzZXhwZG1heCkgICAgICAgICAgICAgLyogRm9yIHN0YXRzICovCisgICAgICBzZXhwZG1heCA9IHNleHBkZXA7CisKKyAgICBpZiAoc2V4cHJjKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFcnJvciwgcXVpdCBhbGwgbGV2ZWxzICovCisgICAgICBnb3RvIHhkb3NleHA7ICAgICAgICAgICAgICAgICAgICAgLyogQWx3YXlzIGdvdG8gY29tbW9uIGV4aXQgcG9pbnQgKi8KKworICAgIGRlYnVnKEYxMTEsc2V4cGRlYnVnKCJlbnRyeSIpLHMsc2V4cHJjKTsKKworICAgIGlmICghcykgcyA9ICIiOyAgICAgICAgICAgICAgICAgICAgIC8qIE51bGwgb3IgZW1wdHkgYXJnICovCisKKyAgICB3aGlsZSAoKnMgPT0gU1ApIHMrKzsgICAgICAgICAgICAgICAvKiBTdHJpcCBsZWFkaW5nIHNwYWNlcyAqLworICAgIGlmICghKnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvIGVtcHR5IHJlc3VsdCAqLworICAgICAgZ290byB4ZG9zZXhwOworCisvKgorICBBbGxvY2F0ZSByZXN1bHQgc3RhY2sgdXBvbiBmaXJzdCB1c2UsIG9yIGFmdGVyIGl0IGhhcyBiZWVuIHJlc2l6ZWQgd2l0aAorICBTRVQgU0VYUCBERVBUSC1MSU1JVC4KKyovCisgICAgaWYgKCFzeHJlc3VsdCkgeworICAgICAgICBzeHJlc3VsdCA9IChjaGFyICoqKW1hbGxvYyhzZXhwbWF4ZGVwICogc2l6ZW9mKGNoYXIgKikpOworICAgICAgICBpZiAoIXN4cmVzdWx0KSB7CisgICAgICAgICAgICBwcmludGYoIj9NZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIC0gXCIlc1wiXG4iLCBzKTsKKyAgICAgICAgICAgIHNleHByYysrOworICAgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICB9CisgICAgICAgIHN4cmxlbiA9IChpbnQgKiltYWxsb2Moc2V4cG1heGRlcCAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgaWYgKCFzeHJsZW4pIHsKKyAgICAgICAgICAgIHByaW50ZigiP01lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgLSBcIiVzXCJcbiIsIHMpOworICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNleHBtYXhkZXA7IGkrKykgeworICAgICAgICAgICAgc3hyZXN1bHRbaV0gPSBOVUxMOyAgICAgICAgIC8qIFJlc3VsdCBwb2ludGVycyAqLworICAgICAgICAgICAgc3hybGVuW2ldID0gMDsgICAgICAgICAgICAgIC8qIEJ1ZmZlciBzaXplcyAqLworICAgICAgICB9CisgICAgfQorICAgIHMyID0gczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHMyIGlzIHRoZSByZXN1bHQgcG9pbnRlciAqLworICAgIGsgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBhY2N1bXVsYXRvciAqLworICAgIGlmIChzWzBdID09ICcoJykgeyAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0cyB3aXRoIG9wZW4gcGFyZW4/ICovCisgICAgICAgIHdoaWxlICgqczIrKykgaysrOyAgICAgICAgICAgICAgLyogR2V0IGxlbmd0aCAqLworICAgICAgICBpZiAoc1trLTFdID09ICcpJykgeyAgICAgICAgICAgIC8qIFN0cmlwIG91dGVyIHBhcmVucyBpZiBhbnkgKi8KKyAgICAgICAgICAgIHNbay0xXSA9IE5VTDsKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgIGsgLT0gMjsKKyAgICAgICAgICAgIHdoaWxlICgqcyA9PSBTUCkgeyAgICAgICAgICAvKiBTdHJpcCBsZWFkaW5nIHNwYWNlcyBmcm9tIHJlc3VsdCAqLworICAgICAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgICAgICBrLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoayA+IDAgJiYgc1trLTFdID09IFNQKSB7IC8qIEFuZCB0cmFpbGluZyBzcGFjZXMuICovCisgICAgICAgICAgICAgICAgc1trLTFdID0gTlVMOworICAgICAgICAgICAgICAgIGstLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoISpzKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdGhpbmcgcmVtYWlucyAqLworICAgICAgICAgICAgczIgPSAiIjsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBlbXB0eSByZXN1bHQuICovCisgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQnJlYWsgcmVzdWx0IHVwIGludG8gIndvcmRzIiAoYW4gU0VYUCBjb3VudHMgYXMgYSB3b3JkKSAqLworCisgICAgcFswXSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgLyogKFdlIGRvbid0IHVzZSBlbGVtZW50IDApICovCisgICAgaWYgKCEqKHMrMSkgfHwgISoocysyKSkgeyAgICAgICAgICAgLyogTm8gbmVlZCB0byBjYWxsIGNrc3BsaXQoKSAqLworICAgICAgICBuID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIGl0J3Mgb25lIG9yIHR3byBjaGFycy4gKi8KKyAgICAgICAgcFsxXSA9IHM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBuZWVkIHRvIG1hbGxvYyB0aGlzIGVpdGhlci4gKi8KKwlub3NwbGl0ID0gMTsKKyAgICAgICAgZGVidWcoRjEwMSxzZXhwZGVidWcoIm5vc3BsaXQiKSwiIixuKTsKKyAgICAgICAgaWYgKHNbMF0gPT0gJygnKSB7ICAgICAgICAgICAgICAvKiAoKSBlbXB0eSAqLworICAgICAgICAgICAgczIgPSAiIjsKKyAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisJbm9zcGxpdCA9IDA7CisgICAgICAgIHEgPSBja3NwbGl0KDEsU0VYUE1BWCxzLE5VTEwsIlxcJVtdJiQrLS89Kl5fQCF7fS88PnwuI34nYDo7PyIsOCwzOSwwKTsKKyAgICAgICAgaWYgKCFxKQorICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgbiA9IHEtPmFfc2l6ZTsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaXRlbXMgKi8KKyAgICAgICAgZGVidWcoRjEwMSxzZXhwZGVidWcoInNwbGl0IiksIiIsbik7CisgICAgICAgIGlmIChuIDwgMCB8fCBuID4gU0VYUE1BWCkgeyAgICAgLyogQ2hlY2sgZm9yIHRvbyBtYW55ICovCisgICAgICAgICAgICBwcmludGYoIj9Ub28gbWFueSBvcGVyYW5kczogbWF4ID0gJWRcbiIsU0VYUE1BWCk7CisgICAgICAgICAgICBzZXhwcmMrKzsKKyAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgfQorICAgICAgICBpZiAobiA9PSAwKSAgICAgICAgICAgICAgICAgICAgIC8qIE5vbmUsIHJlc3VsdCBpcyBOVUxMLCBkb25lLiAqLworICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgaWYgKG4gPT0gMSAmJiBzWzBdID09ICcoJykgeyAgICAvKiBPbmUgYnV0IGl0J3MgYW5vdGhlciBTRVhQICovCisgICAgICAgICAgICBzMiA9IGRvc2V4cChzKTsKKyAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgfQorICAgICAgICBwMiA9IHEtPmFfaGVhZDsgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIHJlc3VsdCBhcnJheS4gKi8KKyAgICAgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpKyspIHsgICAgICAvKiBXZSBtdXN0IGNvcHkgaXQgYmVjYXVzZSAqLworICAgICAgICAgICAgcFtpXSA9IE5VTEw7ICAgICAgICAgICAgICAgIC8qIHJlY3Vyc2l2ZSBjYWxscyB0byBkb3NleHAoKSAqLworICAgICAgICAgICAgaWYgKHAyW2ldKSAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIG92ZXIgdGhlIHNhbWUgYXJyYXkgKi8KKyAgICAgICAgICAgICAgbWFrZXN0cigmKHBbaV0pLHAyW2ldKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc1swXSA9PSAnKCcpIHsgICAgICAgICAgICAgIC8qIE9wZXJhdG9yIGlzIGFuIFMtRXhwcmVzc2lvbiAqLworICAgICAgICAgICAgczIgPSBkb3NleHAocFsxXSk7ICAgICAgICAgIC8qIFJlcGxhY2UgaXQgYnkgaXRzIHZhbHVlICovCisgICAgICAgICAgICBtYWtlc3RyKCYocFsxXSksczIpOworICAgICAgICB9CisgICAgICAgIG11c3RmcmVlKys7ICAgICAgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgdG8gZnJlZSBpdCAqLworICAgIH0KKyAgICBkZWJ1ZyhGMTEwLHNleHBkZWJ1ZygiaGVhZCIpLHBbMV0sMCk7CisKKyAgICBpZiAobiA9PSAxICYmIHBbMV0pIHsKKyAgICAgICAgaWYgKCoocFsxXSkgPT0gJ1wwNDcnKSB7CisgICAgICAgICAgICBzMiA9IHBbMV07CisgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgIH0KKyAgICB9CisvKgorICBUaGlzIHNlY3Rpb24gc2lkZXN0ZXBzIHhsb29rdXAoKSBvZiB0aGUgbW9zdCBjb21tb24gb3BlcmF0b3JzLgorICBJdCdzIG5vdCBuZWNlc3NhcnkgYnV0IGl0IHNwZWVkcyB1cCBTRVhQLWhlYXZ5IGxvb3BzIGJ5IGFib3V0IDEwJS4KKyovCisgICAga3dmbGFncyA9IDA7CisgICAgaWYgKG4gPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9vayB1cCB0aGUgb3BlcmF0b3IgKi8KKyAgICAgICAgczIgPSBwWzFdOyAgICAgICAgICAgICAgICAgICAgICAvKiBQcmVsb29rdXAgb3B0aW1pemF0aW9uLi4uICovCisgICAgICAgIGlmICghczIpCisgICAgICAgICAgczIgPSAiIjsKKyAgICAgICAgaWYgKCEqczIpCisgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICBrdyA9IDA7CisgICAgICAgIHggPSAwOworICAgICAgICBpZiAoaXNkaWdpdCgqczIpKSB7ICAgICAgICAgICAgIC8qIERpZ2l0ICovCisgICAgICAgICAgICB4ID0gLTI7CisKKyAgICAgICAgfSBlbHNlIGlmIChpc2FscGhhKCpzMikgJiYgISooczIrMSkpIHsgLyogU2luZ2xlIGxldHRlciAqLworICAgICAgICAgICAgeCA9IC0xOworCisgICAgICAgIH0gZWxzZSBpZiAoKnMyID09ICdzJyB8fCAqczIgPT0gJ1MnKSB7IC8qIFNFVFEgKi8KKyAgICAgICAgICAgIHMyKys7CisgICAgICAgICAgICBpZiAoKnMyID09ICdlJyB8fCAqczIgPT0gJ0UnKSB7CisgICAgICAgICAgICAgICAgczIrKzsKKyAgICAgICAgICAgICAgICBpZiAoKnMyID09ICd0JyB8fCAqczIgPT0gJ1QnKSB7CisgICAgICAgICAgICAgICAgICAgIHMyKys7CisgICAgICAgICAgICAgICAgICAgIGlmICgqczIgPT0gJ3EnIHx8ICpzMiA9PSAnUScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKihzMisxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBTWF9TRVQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dmbGFncyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4KSB7CisgICAgICAgICAgICBpZiAoISooczIrMSkpIHsgICAgICAgICAgICAgLyogQ29tbW9uIHNpbmdsZS1jaGFyYWN0ZXIgb3BzICovCisgICAgICAgICAgICAgICAgaWYgKCpzMiA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IFNYX0FERDsKKyAgICAgICAgICAgICAgICAgICAga3dmbGFncyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW4gPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKnMyID09ICctJykgeworICAgICAgICAgICAgICAgICAgICB4ID0gU1hfU1VCOworICAgICAgICAgICAgICAgICAgICBrd2ZsYWdzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnVpbHRpbiA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgqczIgPT0gJyonKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSBTWF9NVUw7CisgICAgICAgICAgICAgICAgICAgIGt3ZmxhZ3MgPSAwOworICAgICAgICAgICAgICAgICAgICBidWlsdGluID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCpzMiA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IFNYX0RJVjsKKyAgICAgICAgICAgICAgICAgICAga3dmbGFncyA9IFNYRl9UV087CisgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW4gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgheCkgeyAgICAgICAgICAgICAgICAgICAvKiBOb25lIG9mIHRoZSBhYm92ZSwgbG9vayBpdCB1cCAqLworICAgICAgICAgICAgICAgIHggPSB4bG9va3VwKHNleHBvcHMscFsxXSxuc2V4cG9wcywma3cpOworCQlkZWJ1ZyhGMTExLCJYWFgiLHBbMV0seCk7CisgICAgICAgICAgICAgICAgaWYgKHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGt3ZmxhZ3MgPSBzZXhwb3BzW2t3XS5mbGdzOworICAgICAgICAgICAgICAgICAgICBidWlsdGluID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogSWYgbm9uZSBvZiB0aGUgYWJvdmUsIGNoZWNrIGJ1aWx0LWluIGNvbnN0YW50cyAqLworCisgICAgaWYgKHggPT0gLTEpIHsKKyAgICAgICAgeCA9IHhsb29rdXAoc2V4cGNvbnN0cyxwWzFdLG5zZXhwY29uc3RzLCZrdyk7CisgICAgICAgIGlmICh4ID4gMCkgeworICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgIGNhc2UgU1hDX05JTDoKKyAgICAgICAgICAgICAgICBzMiA9ICIiOworICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgICAgY2FzZSBTWENfUEk6CisgICAgICAgICAgICAgICAgczIgPSBtYXRoX3BpOworICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgICAgY2FzZSBTWENfVDoKKyAgICAgICAgICAgICAgICBzMiA9ICIxIjsKKyAgICAgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG4gPT0gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGFuIGV4cHJlc3Npb24gKi8KKyAgICAgICAgaWYgKGJ1aWx0aW4pIHsgICAgICAgICAgICAgICAgICAvKiBCdWlsdC1pbiBvcGVyYW5kPyAqLworICAgICAgICAgICAgc3dpdGNoICh4KSB7ICAgICAgICAgICAgICAgIC8qIE9wZXJhdG9ycyB3aXRoIGRlZmF1bHQgdmFsdWVzICovCisgICAgICAgICAgICAgIGNhc2UgU1hfRVZBOgorICAgICAgICAgICAgICAgIHMyID0gIiI7CisgICAgICAgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICAgICAgICBjYXNlIFNYX01VTDogICAgICAgICAgICAgIC8qICgqKSAqLworICAgICAgICAgICAgICAgIHMyID0gc2V4cHZhbCA/IHNleHB2YWwgOiAiMSI7CisgICAgICAgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICAgICAgICBjYXNlIFNYX0FORDogICAgICAgICAgICAgIC8qIChBTkQpICovCisgICAgICAgICAgICAgIGNhc2UgU1hfQldBOiAgICAgICAgICAgICAgLyogQml0d2lzZSAoJikgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgICAgICAgY2FzZSBTWF9MT1I6ICAgICAgICAgICAgICAvKiAoT1IpICovCisgICAgICAgICAgICAgIGNhc2UgU1hfQldPOiAgICAgICAgICAgICAgLyogQml0d2lzZSAofCkgKi8KKyAgICAgICAgICAgICAgY2FzZSBTWF9BREQ6ICAgICAgICAgICAgICAvKiAoKykgKi8KKyAgICAgICAgICAgICAgY2FzZSBTWF9TVUI6ICAgICAgICAgICAgICAvKiAoLSkgKi8KKyAgICAgICAgICAgICAgICBzMiA9IHJlc3VsdCA/ICIxIiA6ICIwIjsKKyAgICAgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgYSBidWlsdC1pbiBvcGVyYW5kICovCisgICAgICAgICAgICBjaGFyICogcDE7CisgICAgICAgICAgICBwMSA9IHBbMV07CisgICAgICAgICAgICB3aGlsZSAoKnAxID09IFNQKSBwMSsrOworICAgICAgICAgICAgaWYgKCFpc2FscGhhKCpwMSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoeHhmbG9hdChwMSwwKSA+IDApIHsgLyogSXMgaXQgYSBudW1iZXI/ICovCisgICAgICAgICAgICAgICAgICAgIHMyID0gcDE7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqczIgPT0gJysnKSBzMisrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKnAxID09ICcoJykgeyAvKiBBbiBTLUV4cHJlc3Npb24/ICovCisKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgIHMyID0gZG9zZXhwKHMyKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIHMyID0gZG9zZXhwKHAxKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA8IDEpIHsgICAgICAgICAvKiBJcyBpdCBhIHZhcmlhYmxlPyAqLworICAgICAgICAgICAgICAgIGogPSBteGxvb2sobWFjdGFiLHBbMV0sbm1hYyk7IC8qIExvb2sgaXQgdXAgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLHNleHBkZWJ1Zygibj09MSBteGxvb2siKSxwWzFdLGopOworICAgICAgICAgICAgICAgIHMyID0gKGogPiAtMSkgPyBtYWN0YWJbal0ubXZhbCA6ICIiOworICAgICAgICAgICAgICAgIGlmICghczIpIHMyID0gIiI7CisgICAgICAgICAgICAgICAgaWYgKHh4ZmxvYXQoczIsMCkgPiAwKSAgLyogTWFjcm8gdmFsdWUgaXMgYSBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgICAgICBpZiAoaiA+IC0xKSB7ICAgICAgICAgICAvKiBJdCdzIGEgbWFjcm8gKi8KKyAgICAgICAgICAgICAgICAgICAgbXggPSBqOworICAgICAgICAgICAgICAgICAgICB4ID0gajsgICAgICAgICAgICAgIC8qIHdob3NlIGRlZmluaXRpb24gaXMgbm90IG51bWVyaWMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCpzMiA9PSAnKCcpIHsgICAvKiBJcyBpdCBhbiBTLUV4cHJlc3Npb24/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIHRvIGFsbG9jYXRlIG1lbW9yeSBvbiB0aGUgc3RhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvIGNhbGwgb3Vyc2VsdmVzIHJlY3Vyc2l2ZWx5IG9uIGl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2Ugd2UnbGwgd2lwZSBvdXQgdGhlIG1hY3JvIGRlZmluaXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBzMyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnQgayA9IDA7ICovCisgICAgICAgICAgICAgICAgICAgICAgICBzMyA9IHMyOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpzMysrKSBrKys7CisgICAgICAgICAgICAgICAgICAgICAgICBzMyA9IChjaGFyICopbWFsbG9jKGsgKyA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShzMyxzMik7ICAgLyogU0FGRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMyID0gZG9zZXhwKHMzKTsgLyogRXZhbHVhdGUgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHMzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/TWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSAtIFwiJXNcIlxuIixzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCpzMiA9PSAnXDA0NycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMyKys7CisjaWZkZWYgQ09NTUVOVAorCQkJLyogRHVtcHMgY29yZSBpZiBwZXR0eSBvcHRpbWl6YXRpb24gd2FzIHRha2VuICovCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCYocFsxXSksczIpOworI2Vsc2UKKwkJCWlmICghbm9zcGxpdCAmJiBwWzFdKSBmcmVlKHBbMV0pOworCQkJcFsxXSA9IChjaGFyICopbWFsbG9jKChpbnQpc3RybGVuKHMyKSArIDEpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHMyID0gcFsxXTsKKwkJCWlmICghczIpIHMyID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnMyID09ICcoJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMlttYWtlc3RybGVuLTFdID09ICcpJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMlttYWtlc3RybGVuLTFdID0gTlVMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsc2V4cGRlYnVnKCInQSIpLHMyLDApOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1hY3JvKys7ICAgICAgICAgICAgLyogTm90IGFuIFMtRXhwcmVzc2lvbiAqLworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIE5vdCBmb3VuZCBpbiBtYWNybyB0YWJsZSAqLworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9Ob3QgZGVmaW5lZCAtIFwiJXNcIlxuIiwgcFsxXSk7CisgICAgICAgICAgICAgICAgICAgIHNleHByYysrOworICAgICAgICAgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmICh4IDwgMSAmJiAhbWFjcm8pIHsgICAgICAgLyogbiA+IDEgYW5kIG5vdCBhIGJ1aWx0LWluIG9wZXJhdG9yICovCisgICAgICAgIHggPSBteGxvb2sobWFjdGFiLHBbMV0sbm1hYyk7ICAgLyogU2VlIGlmIGl0J3MgYSBtYWNybyAqLworICAgICAgICBkZWJ1ZyhGMTExLHNleHBkZWJ1ZygibiE9MSBteGxvb2siKSxwWzFdLHgpOworICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiP0ludmFsaWQgb3BlcmFuZCAtIFwiJXNcIlxuIixwWzFdKTsKKyAgICAgICAgICAgIHNleHByYysrOworICAgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICB9CisgICAgICAgIG14ID0geDsKKyAgICAgICAgbWFjcm8rKzsKKyAgICB9CisgICAgaWYgKGJ1aWx0aW4pIHsgICAgICAgICAgICAgICAgICAgICAgLyogQnVpbHQtaW4gb3BlcmF0b3IuLi4gKi8KKyAgICAgICAgaWYgKGt3ZmxhZ3MpIHsKKyAgICAgICAgICAgIGludCBmbGdzOworICAgICAgICAgICAgaWYgKChmbGdzID0gKGt3ZmxhZ3MgJiAoU1hGX09ORXxTWEZfVFdPKSkpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChmbGdzKSB7CisgICAgICAgICAgICAgICAgICBjYXNlIChTWEZfT05FfFNYRl9UV08pOgorICAgICAgICAgICAgICAgICAgICBpZiAobiA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RvbyBmZXcgb3BlcmFuZHMgLSBcIiVzXCJcbiIscyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXhwcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgU1hGX1RXTzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPCAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9Ub28gZmV3IG9wZXJhbmRzIC0gXCIlc1wiXG4iLHMpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFNYRl9PTkU6CisgICAgICAgICAgICAgICAgICAgIGlmIChuICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RvbyAlcyBvcGVyYW5kcyAtIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobiA+IDIpID8gIm1hbnkiIDogImZldyIsIHMpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoa3dmbGFncyAmIFNYRl9QUkUpIHsgICAgLyogUHJlZGljYXRlPyAqLworICAgICAgICAgICAgICAgIHBmbGFnID0gMTsKKyAgICAgICAgICAgICAgICBwcmVzdWx0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChrd2ZsYWdzICYgU1hGX0ZMTykgICAgICAvKiBPcGVyYXRvciByZXF1aXJlcyBmbG9hdGluZyBwb2ludCAqLworICAgICAgICAgICAgICBmcGZsYWcrKzsgICAgICAgICAgICAgICAgIC8qIEZvcmNlIGl0ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHggPT0gU1hfU0VUIHx8IHggPT0gU1hfTEVUIHx8IC8qIEFzc2lnbm1lbnQgaXMgc3BlY2lhbCAqLworICAgICAgICAgICAgeCA9PSBTWF9JTkMgfHwgeCA9PSBTWF9ERUMpIHsKKyAgICAgICAgICAgIGludCByYzsKKyAgICAgICAgICAgIGNoYXIgYywgKiBtLCAqIHMzOworICAgICAgICAgICAgaWYgKG4gPT0gMSkgeworICAgICAgICAgICAgICAgIHMyID0gIiI7CisgICAgICAgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgczIgPSBOVUxMOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IG47IGkgKz0gMikgeyAvKiBMb29wIHRocnUgb3BlcmFuZCBwYWlycyAqLworICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICBzMyA9IHBbaSsxXTsKKyAgICAgICAgICAgICAgICBjID0gKnMzOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsc2V4cGRlYnVnKCJ0YXJnZXQgcCIpLHMzLDApOworCisgICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRhcmdldCBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgd29yZHMgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoKnMzKSB7IGlmICgqczMgPCAnIScpIHsgcmMgPSAxOyBicmVhazsgfTsgczMrKzsgfQorICAgICAgICAgICAgICAgIHMzID0gcFtpKzFdOworICAgICAgICAgICAgICAgIGlmIChyYykgeyAgICAgICAgICAgICAgIC8qIElmIGl0IGRvZXMgaXQgbXVzdCBoYXZlIGJlZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgY2hhciAqIHM0OyAgICAgICAgICAvKiBhbiBTRVhQIHNvIGV2YWx1YXRlIGl0ICovCisgICAgICAgICAgICAgICAgICAgIHMzID0gZG9zZXhwKHMzKTsKKyAgICAgICAgICAgICAgICAgICAgczQgPSBzMzsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKnM0KSB7IGlmICgqczQgPCAnIScpIHsgcmMgPSAxOyBicmVhazsgfTsgczQrKzsgfQorICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gMCkgbWFrZXN0cigmKHBbaSsxXSksczMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIEFuZCB0aGF0IGl0J3Mgbm90IGEgbnVtYmVyLCBldGMuICovCisgICAgICAgICAgICAgICAgaWYgKHJjID4gMCB8fCBpc2RpZ2l0KGMpIHx8IGMgPT0gJygnKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0ludmFsaWQgYXNzaWdubWVudCAtIFwiJXNcIlxuIixzKTsKKyAgICAgICAgICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzYWxwaGEoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSB4bG9va3VwKHNleHBjb25zdHMsczMsbnNleHBjb25zdHMsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0Fzc2lnbm1lbnQgdG8gY29uc3RhbnQgLSBcIiVzXCJcbiIscyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXhwcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIElmICsrIG9yIC0tLCBnZXQgY3VycmVudCB2YWx1ZSBvZiB2YXJpYWJsZSAqLworICAgICAgICAgICAgICAgIGlmICh4ID09IFNYX0lOQyB8fCB4ID09IFNYX0RFQykgeworICAgICAgICAgICAgICAgICAgICBpbnQgb2sgPSAxOworICAgICAgICAgICAgICAgICAgICBjaGFyIGJ1ZlszMl07CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09IENNRFEpIHsgICAgLyogQSBiYWNrc2xhc2ggdmFyaWFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuID0gMzI7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcyA9IGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlswXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6enN0cmluZyhzMywmcywmbikgPCAwIHx8ICFidWZbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMyID0gYnVmOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgIC8qIEEgbWFjcm8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoayA9IG14bG9vayhtYWN0YWIsczMsbm1hYykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBzMiA9IG1hY3RhYltrXS5tdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP05vdCBkZWZpbmVkIC0gXCIlc1wiXG4iLHBbaSsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXhwcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXMyKSBzMiA9ICIiOworICAgICAgICAgICAgICAgICAgICBrID0geHhmbG9hdChzMiwwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9Ob3QgbnVtZXJpYyAtIFwiJXNcIlxuIixwW2krMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpzMiA9PSAnKycpIHMyKys7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF0b2koczIpOworICAgICAgICAgICAgICAgICAgICBmcHJlc3VsdCA9IGZsb2F0dmFsOworICAgICAgICAgICAgICAgICAgICBpZiAoayA+IDEgfHwgZnByZXN1bHQgIT0gcmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgIGZwZmxhZysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobiA8IGkrMikgeyAgICAgICAgICAvKiBWYXJpYWJsZSB3aXRoIG5vIHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgIHMyID0gIiI7CisgICAgICAgICAgICAgICAgICAgIGlmICh4ID09IFNYX1NFVCB8fCB4ID09IFNYX0xFVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsbWFjKHBbaSsxXSwxKTsgLyogRGVsZXRlIHRoZSB2YXJpYWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzMiA9ICIxIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIFZhcmlhYmxlIHdpdGggdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgayA9IHh4ZmxvYXQocFtpKzJdLDApOyAvKiBJcyBpdCBhIG51bWJlcj8gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzMiA9IHBbaSsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqczIgPT0gJysnKSBzMisrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgczIgPSBkb3NleHAocFtpKzJdKTsgLyogSGF2ZSB2YWx1ZSwgZXZhbHVhdGUgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXhwcmMpIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghczIpIHMyID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISpzMiAmJiAoeCA9PSBTWF9JTkMgfHwgeCA9PSBTWF9ERUMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoeCA9PSBTWF9JTkMgfHwgeCA9PSBTWF9ERUMpIHsKKyAgICAgICAgICAgICAgICAgICAgayA9IHh4ZmxvYXQoczIsMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChrIDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/Tm90IG51bWVyaWMgLSBcIiVzXCJcbiIsczIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpzMiA9PSAnKycpIHMyKys7CisgICAgICAgICAgICAgICAgICAgIGogPSBhdG9pKHMyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcGogPSBmbG9hdHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwZmxhZysrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnBqID0gKENLRkxPQVQpajsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PSBTWF9JTkMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgZnByZXN1bHQgKz0gZnBqOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPT0gU1hfREVDKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmVzdWx0IC09IGZwajsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IGZwcmVzdWx0KSBmcGZsYWcrKzsKKyAgICAgICAgICAgICAgICAgICAgczIgPSBmcGZsYWcgPyBmcGZvcm1hdChmcHJlc3VsdCwwLDApIDogY2tpdG9hKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh4ID09IFNYX0xFVCAmJiBjbWRsdmwgPiAwKSAvKiBMRVQgbWFrZXMgdmFyIGxvY2FsICovCisgICAgICAgICAgICAgICAgICBhZGRsb2NhbChwW2krMV0pOworICAgICAgICAgICAgICAgIGlmICgocmMgPSBhZGRtYWMocFtpKzFdLHMyKSkgPCAwKSB7IC8qIEFkZCB0aGUgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyYykgeworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgLTM6IG0gPSAiQXJyYXkgbm90IGRlY2xhcmVkIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAtMjogbSA9ICJTdWJzY3JpcHQgb3V0IG9mIHJhbmdlIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAtNDogbSA9ICJPdXQgb2YgbWVtb3J5IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogbSA9ICJFcnJvciBjcmVhdGluZyB2YXJpYWJsZSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/JXMgLSBcIiVzXCJcbiIsbSxzKTsKKyAgICAgICAgICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHMyKSByZXN1bHQgPSBhdG9pKHMyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgfSBlbHNlIGlmICh4ID09IFNYX0lGQykgeyAgICAgICAgICAgICAgIC8qIENvbmRpdGlvbmFsIGV4cHJlc3Npb24gKi8KKyAgICAgICAgICAgIGludCB0cnVlID0gMDsKKyAgICAgICAgICAgIGlmIChuID4gNCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1RvbyBtYW55IG9wZXJhbmRzOiBJRiAtIFwiJXNcIlxuIixzKTsKKyAgICAgICAgICAgICAgICBzZXhwcmMrKzsKKyAgICAgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzMiA9IGRvc2V4cChwWzJdKTsKKyAgICAgICAgICAgIGlmIChzZXhwcmMpIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgIGlmIChzMikgeworICAgICAgICAgICAgICAgIGogPSBhdG9pKHMyKTsKKyAgICAgICAgICAgICAgICBpZiAoeHhmbG9hdChzMiwwKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGZwZmxhZysrOworICAgICAgICAgICAgICAgICAgICBmcHJlc3VsdCA9IChDS0ZMT0FUKXJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgZnBqID0gZmxvYXR2YWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnBqID0gYXRvZihzMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRydWUgPSAoKGZwaiAhPSAwLjApID8gMSA6IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF0cnVlICYmIG4gPCA0KSB7CisgICAgICAgICAgICAgICAgczIgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzMiA9IGRvc2V4cCh0cnVlID8gcFszXSA6IHBbNF0pOworICAgICAgICAgICAgICAgIGlmIChzZXhwcmMpIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgICAgICBqID0gczIgPyBhdG9pKHMyKSA6IDA7CisgICAgICAgICAgICAgICAgaWYgKHh4ZmxvYXQoczIsMCkgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBmcGZsYWcrKzsKKyAgICAgICAgICAgICAgICAgICAgZnByZXN1bHQgPSAoQ0tGTE9BVClyZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGZwaiA9IGZsb2F0dmFsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZwaiA9IHMyID8gYXRvZihzMikgOiAwLjA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZwcmVzdWx0ID0gZnBqOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgIH0gZWxzZSBpZiAoeCA9PSBTWF9RVU8pIHsKKyNpZm5kZWYgQ09NTUVOVAorICAgICAgICAgICAgaW50IHh4OworICAgICAgICAgICAgeHggPSBzdHJsZW4ocFsyXSk7CisgICAgICAgICAgICBwWzNdID0gKGNoYXIgKiltYWxsb2MoeHgrNCk7CisgICAgICAgICAgICBzMiA9IHBbM107CisgICAgICAgICAgICBja21ha21zZyhwWzNdLHh4KzQsIicoIixwWzJdLCIpIixOVUxMKTsKKyAgICAgICAgICAgIG4rKzsKKyNlbHNlCisgICAgICAgICAgICBzMiA9IHBbMl07CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICB9IGVsc2UgaWYgKHggPT0gU1hfU1RSKSB7CisgICAgICAgICAgICBpbnQgeHg7CisgICAgICAgICAgICBzMiA9IGRvc2V4cChwWzJdKTsKKyAgICAgICAgICAgIGlmIChzZXhwcmMpIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgIHh4ID0gc3RybGVuKHMyKTsKKyAgICAgICAgICAgIHBbM10gPSAoY2hhciAqKW1hbGxvYyh4eCs0KTsKKyAgICAgICAgICAgIGNrbWFrbXNnKHBbM10seHgrNCwiJygiLHMyLCIpIixOVUxMKTsKKyAgICAgICAgICAgIHMyID0gcFszXTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBBcml0aG1ldGljIG9wZXJhdG9yIG9yIG1hY3JvIC0gTG9vcCB0aHJ1IG9wZXJhbmRzICovCisKKyAgICBxdWl0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydC1jaXJjdWl0IGZsYWcuICovCisgICAgaWYgKG1hY3JvICYmIG4gPiAxKSB7ICAgICAgICAgICAgICAgLyogSWYgb3BlcmF0b3IgaXMgYSBtYWNybyAqLworICAgICAgICBpZiAoIWxpbmUpIHsgICAgICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlIGxvY2FsIGJ1ZmZlciBmb3IgKi8KKyAgICAgICAgICAgIGxpbmUgPSAoY2hhciAqKW1hbGxvYyhTWE1MRU4pOyAvKiB0aGUgZXZhbHVhdGVkIGFyZ3VtZW50IGxpc3QuICovCisgICAgICAgICAgICBpZiAoIWxpbmUpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9NZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIC0gXCIlc1wiXG4iLHBbMV0pOworICAgICAgICAgICAgICAgIHNleHByYysrOworICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmVsZW4gPSBTWE1MRU47CisgICAgICAgICAgICAvKiBkZWJ1ZyhGMTAxLCJkb3NleHAgbWFjcm8gYXJnIGJ1ZmZlciIsIiIsbGluZWxlbik7ICovCisgICAgICAgIH0KKyAgICAgICAgbGluZXBvcyA9IDA7CisgICAgICAgIGxpbmVbbGluZXBvc10gPSBOVUw7CisgICAgfQorICAgIGZvciAoaSA9IDE7ICgoaSA8IG4pICYmICFzZXhwcmMgJiYgIXF1aXQpOyBpKyspIHsgLyogTG9vcCB0aHJ1IG9wZXJhbmRzICovCisgICAgICAgIHF1b3RlID0gMDsKKyAgICAgICAgczIgPSBwW2krMV07ICAgICAgICAgICAgICAgICAgICAvKiBHZXQgb3BlcmFuZCAqLworICAgICAgICBpZiAoIXMyKSBzMiA9ICIiOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgaWYgKCpzMiA9PSAnXDA0NycpIHsgICAgICAgICAgICAvKiBJcyBpdCBxdW90ZWQ/ICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLHNleHBkZWJ1ZygiJ0IiKSxzMiwwKTsKKyAgICAgICAgICAgIHMyKys7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTcGFjZSBwYXN0IHRoZSBxdW90ZSAqLworICAgICAgICAgICAgcXVvdGUrKzsKKyAgICAgICAgICAgIGlmICgqczIgPT0gJygnKSB7ICAgICAgICAgICAvKiBRdW90ZWQgUy1FeHByZXNzaW9uPyAqLworICAgICAgICAgICAgICAgIGNoYXIgYzQsICogczQgPSBzMisxOyAgIC8qIFN0cmlwIG91dGVyIHBhcmVucyAqLworICAgICAgICAgICAgICAgIHdoaWxlICgoYzQgPSAqczQrKykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGM0ID09ICcpJyAmJiAhKnM0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzMisrOworICAgICAgICAgICAgICAgICAgICAgICAgKihzNC0xKSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjExMCxzZXhwZGVidWcoIidDIiksczIsMCk7CisKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgcXVvdGVkICovCisgICAgICAgICAgICBzMiA9IGRvc2V4cChwW2krMV0pOyAgICAgICAgLyogZXZhbHVhdGUgaXQgKi8KKyAgICAgICAgICAgIGlmIChzZXhwcmMpIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgIGlmICghczIpIHMyID0gIiI7CisgICAgICAgICAgICBpZiAoIW1hY3JvICYmIHggPT0gU1hfRVZBKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKCpzMiAhPSAnXDA0NycpIHsgICAgICAgICAgICAvKiBJcyBpdCBxdW90ZWQ/ICovCisgICAgICAgICAgICBzMiA9IGRvc2V4cChwW2krMV0pOyAgICAgICAgLyogTm8sIGV2YWx1YXRlIGl0ICovCisgICAgICAgICAgICBpZiAoc2V4cHJjKSBnb3RvIHhkb3NleHA7CisgICAgICAgICAgICBpZiAoIXMyKSBzMiA9ICIiOworICAgICAgICAgICAgaWYgKCFtYWNybyAmJiB4ID09IFNYX0VWQSkKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzMiA9PSAnXDA0NycpIHsgICAgICAgICAgICAvKiBJcyByZXN1bHQgcXVvdGVkPyAqLworICAgICAgICAgICAgZGVidWcoRjExMCxzZXhwZGVidWcoIidCIiksczIsMCk7CisgICAgICAgICAgICBzMisrOyAgICAgICAgICAgICAgICAgICAgICAgLyogU3BhY2UgcGFzdCB0aGUgcXVvdGUgKi8KKyAgICAgICAgICAgIHF1b3RlKys7CisgICAgICAgICAgICBpZiAoKnMyID09ICcoJykgeyAgICAgICAgICAgLyogUXVvdGVkIFMtRXhwcmVzc2lvbj8gKi8KKyAgICAgICAgICAgICAgICBjaGFyIGM0LCAqIHM0ID0gczIrMTsgICAvKiBTdHJpcCBvdXRlciBwYXJlbnMgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoKGM0ID0gKnM0KyspKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjNCA9PSAnKScgJiYgISpzNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgczIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICooczQtMSkgPSBOVUw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsc2V4cGRlYnVnKCInQyIpLHMyLDApOworICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBpZiAobWFjcm8pIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsc2V4cGRlYnVnKCJtYWNybyBhcmciKSxzMixpKTsKKyAgICAgICAgICAgIGlmICghKnMyKSBxdW90ZSsrOworICAgICAgICAgICAgaWYgKCFxdW90ZSkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNoYXIgYzQsICogczQgPSBzMjsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGM0ID0gKnM0KyspKSBpZiAoYzQgPT0gU1ApIHsgcXVvdGUrKzsgYnJlYWs7IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChxdW90ZSkgbGluZVtsaW5lcG9zKytdID0gJ3snOworICAgICAgICAgICAgd2hpbGUgKChsaW5lW2xpbmVwb3MrK10gPSAqczIrKykpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZXBvcyA+IGxpbmVsZW4gLSAzKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKiB0bXAgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBsaW5lW2xpbmVwb3NdID0gTlVMOworICAgICAgICAgICAgICAgICAgICBsaW5lbGVuICs9IFNYTUxFTjsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gKGNoYXIgKikgbWFsbG9jKGxpbmVsZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoIXRtcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/TWVtb3J5IHJlLWFsbG9jYXRpb24gZmFpbHVyZSAtIFwiJXMuLi5cIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNleHByYysrOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0cmNweSh0bXAsbGluZSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUobGluZSk7CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0bXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZXBvcy0tOyAgICAgICAgICAgICAgICAgIC8qIEJhY2sgdXAgb3ZlciBOVUwgKi8KKyAgICAgICAgICAgIGlmIChxdW90ZSkKKyAgICAgICAgICAgICAgbGluZVtsaW5lcG9zKytdID0gJ30nOyAgICAvKiBFbmQgcXVvdGUgZ3JvdXAgKi8KKyAgICAgICAgICAgIGxpbmVbbGluZXBvcysrXSA9IFNQOyAgICAgICAvKiBhZGQgYSBzcGFjZSAqLworICAgICAgICAgICAgbGluZVtsaW5lcG9zXSA9IE5VTDsgICAgICAgIC8qIGFuZCBhIE5VTCAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFxdW90ZSkgeyAgICAgICAgICAgICAgICAgICAvKiBCdWlsdC1pbiBvcGVyYXRvci4uLiAqLworICAgICAgICAgICAgczIgPSBkb3NleHAoczIpOworICAgICAgICAgICAgaWYgKHNleHByYykgZ290byB4ZG9zZXhwOworICAgICAgICAgICAgaWYgKCFzMikgczIgPSAiIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoeCA9PSBTWF9FVkEpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKCEqczIpIHsKKyAgICAgICAgICAgIC8qIEFuIGVtcHR5IHZhbHVlIGlzIG5vdCBhIGxlZ2FsIG51bWJlciAqLworICAgICAgICAgICAgLyogYnV0IGl0IGlzIGEgbGVnYWwgdHJ1dGggdmFsdWUgKi8KKyAgICAgICAgICAgIGlmICh4ICE9IFNYX0FORCAmJiB4ICE9IFNYX0xPUiAmJiB4ICE9IFNYX05PVCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP05vdCBOdW1lcmljIC0gXCIlc1wiXG4iLHBbaSsxXSk7CisgICAgICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICBmcGogPSAwLjA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqID0gYXRvaShzMik7CisgICAgICAgICAgICAvKiBTd2l0Y2ggdG8gZmxvYXRpbmctcG9pbnQgdXBvbiBlbmNvdW50ZXJpbmcgYW55IGYucC4gYXJnICovCisgICAgICAgICAgICAvKiBPUi4uLiBpZiBpbnRlZ2VyIGlzIHRvbyBiaWcgKi8KKyAgICAgICAgICAgIGlmICghZnBmbGFnKSBpZiAoeHhmbG9hdChzMiwwKSA9PSAyKQorICAgICAgICAgICAgICBmcGZsYWcrKzsKKyAgICAgICAgICAgIGZwaiA9IGF0b2YoczIpOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IDEpIHsgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbCByZXN1bHQgaXMgZmlyc3Qgb3BlcmFuZCAqLworICAgICAgICAgICAgcmVzdWx0ID0gKG4gPT0gMiAmJiB4ID09IFNYX1NVQikgPyAwLWogOiBqOworICAgICAgICAgICAgZnByZXN1bHQgPSAobiA9PSAyICYmIHggPT0gU1hfU1VCKSA/IC1mcGogOiBmcGo7CisgICAgICAgICAgICBpZiAoIShrd2ZsYWdzICYgU1hGX09ORSkpICAgLyogQ29tbWFuZCB3aXRoIHNpbmdsZSBhcmcgKi8KKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHggPT0gU1hfTU9EIHx8IHggPT0gU1hfRElWKSB7CisgICAgICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgICAgZnBmbGFnKys7CisgICAgICAgICAgICBpZiAoIWZwaikgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0RpdmlkZSBieSB6ZXJvIC0gXCIlc1wiXG4iLGNtZGJ1Zik7CisgICAgICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoeCkgeyAgICAgICAgICAgICAgICAgICAgLyogQWNjdW11bGF0ZSByZXN1bHQgKi8KKworICAgICAgICAgIGNhc2UgU1hfRVZBOiAgICAgICAgICAgICAgICAgIC8qIEVWQUwgKi8KKyAgICAgICAgICAgIHJlc3VsdCA9IGo7CisgICAgICAgICAgICBmcHJlc3VsdCA9IGZwajsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9BREQ6ICAgICAgICAgICAgICAgICAgLyogKyAqLworICAgICAgICAgICAgcmVzdWx0ICs9IGo7CisgICAgICAgICAgICBmcHJlc3VsdCArPSBmcGo7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IGZwcmVzdWx0KQorICAgICAgICAgICAgICBmcGZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9TVUI6ICAgICAgICAgICAgICAgICAgLyogLSAqLworICAgICAgICAgICAgcmVzdWx0IC09IGo7CisgICAgICAgICAgICBmcHJlc3VsdCAtPSBmcGo7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IGZwcmVzdWx0KQorICAgICAgICAgICAgICBmcGZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9NVUw6ICAgICAgICAgICAgICAgICAgLyogKiAqLworICAgICAgICAgICAgcmVzdWx0ICo9IGo7CisgICAgICAgICAgICBmcHJlc3VsdCAqPSBmcGo7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IGZwcmVzdWx0KQorICAgICAgICAgICAgICBmcGZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9BTkQ6ICAgICAgICAgICAgICAgICAgLyogQU5EICovCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgajsKKyAgICAgICAgICAgIGlmICghcmVzdWx0KSBxdWl0Kys7CisgICAgICAgICAgICBmcHJlc3VsdCA9IGZwcmVzdWx0ICYmIGZwajsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9MT1I6ICAgICAgICAgICAgICAgICAgLyogT1IgKi8KKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCBqOworICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHF1aXQrKzsKKyAgICAgICAgICAgIGZwcmVzdWx0ID0gZnByZXN1bHQgfHwgZnBqOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFNYX01PRDogICAgICAgICAgICAgICAgICAvKiBNb2R1bHVzICovCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgJSBqOworI2lmZGVmIEZORkxPQVQKKyAgICAgICAgICAgIGZwcmVzdWx0ID0gKENLRkxPQVQpZm1vZChmcHJlc3VsdCxmcGopOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBmcHJlc3VsdCkKKyAgICAgICAgICAgICAgZnBmbGFnKys7CisjZWxzZQorICAgICAgICAgICAgZnByZXN1bHQgPSByZXN1bHQ7CisjZW5kaWYgLyogRk5GTE9BVCAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFNYX0RJVjogICAgICAgICAgICAgICAgICAvKiAvICovCisgICAgICAgICAgICByZXN1bHQgLz0gajsKKyAgICAgICAgICAgIGZwcmVzdWx0IC89IGZwajsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gZnByZXN1bHQpCisgICAgICAgICAgICAgIGZwZmxhZysrOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFNYX0FFUTogICAgICAgICAgICAgICAgICAvKiBUZXN0IGZvciBlcXVhbGl0eSAqLworICAgICAgICAgICAgaWYgKGZwZmxhZykgeworICAgICAgICAgICAgICAgIGlmIChmcHJlc3VsdCAhPSBmcGopCisgICAgICAgICAgICAgICAgICBwcmVzdWx0ID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBqKQorICAgICAgICAgICAgICAgICAgcHJlc3VsdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU1hfTkVROiAgICAgICAgICAgICAgICAgIC8qIFRlc3QgZm9yIGluZXFhbGl0eSAqLworICAgICAgICAgICAgaWYgKGZwZmxhZykgeworICAgICAgICAgICAgICAgIGlmIChmcHJlc3VsdCA9PSBmcGopCisgICAgICAgICAgICAgICAgICBwcmVzdWx0ID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBqKQorICAgICAgICAgICAgICAgICAgcHJlc3VsdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU1hfQUxFOiAgICAgICAgICAgICAgICAgIC8qIEFyaXRobWV0aWMgbGVzcy1lcXVhbCAqLworICAgICAgICAgICAgaWYgKGZwZmxhZykgeworICAgICAgICAgICAgICAgIGlmIChmcGogPCBmcHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgIHByZXN1bHQgPSAwOworICAgICAgICAgICAgICAgIGZwcmVzdWx0ID0gZnBqOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaiA8IHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgIHByZXN1bHQgPSAwOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU1hfQUxUOiAgICAgICAgICAgICAgICAgIC8qIEFyaXRobWV0aWMgbGVzcy10aGFuICovCisgICAgICAgICAgICBpZiAoZnBmbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKGZwaiA8PSBmcHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgIHByZXN1bHQgPSAwOworICAgICAgICAgICAgICAgIGZwcmVzdWx0ID0gZnBqOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaiA8PSByZXN1bHQpCisgICAgICAgICAgICAgICAgICBwcmVzdWx0ID0gMDsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBqOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFNYX0FHVDogICAgICAgICAgICAgICAgICAvKiBBcml0aG1ldGljIGdyZWF0ZXItdGhhbiAqLworICAgICAgICAgICAgaWYgKGZwZmxhZykgeworICAgICAgICAgICAgICAgIGlmIChmcGogPj0gZnByZXN1bHQpCisgICAgICAgICAgICAgICAgICBwcmVzdWx0ID0gMDsKKyAgICAgICAgICAgICAgICBmcHJlc3VsdCA9IGZwajsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGogPj0gcmVzdWx0KQorICAgICAgICAgICAgICAgICAgcHJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9BR0U6ICAgICAgICAgICAgICAgICAgLyogQXJpdGhtZXRpYyBncmVhdGVyLWVxdWFsICovCisgICAgICAgICAgICBpZiAoZnBmbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKGZwaiA+IGZwcmVzdWx0KQorICAgICAgICAgICAgICAgICAgcHJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgZnByZXN1bHQgPSBmcGo7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChqID4gcmVzdWx0KQorICAgICAgICAgICAgICAgICAgcHJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9QT1c6ICAgICAgICAgICAgICAgICAgLyogUmFpc2UgdG8gcG93ZXIgKi8KKyNpZmRlZiBGTkZMT0FUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGR1bW15OworICAgICAgICAgICAgICAgIGlmICghZnBqKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmVzdWx0ID0gMS4wOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCFmcHJlc3VsdCAmJiBmcGogPD0gMC4wKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9EaXZpZGUgYnkgemVybyAtIFwiJXNcIlxuIixjbWRidWYpOworICAgICAgICAgICAgICAgICAgICBzZXhwcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnByZXN1bHQgPCAwLjAgJiYgbW9kZihmcGosJmR1bW15KSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9Eb21haW4gZXJyb3IgLSBcIiVzXCJcbiIsY21kYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcHJlc3VsdCA9IChDS0ZMT0FUKXBvdyhmcHJlc3VsdCxmcGopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBGTkZMT0FUICovCisgICAgICAgICAgICBpZiAoaiA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHosIHNpZ24gPSAwOworICAgICAgICAgICAgICAgIGlmIChqIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0RpdmlkZSBieSB6ZXJvIC0gXCIlc1wiXG4iLGNtZGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXhwcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBqID0gMCAtIGo7CisgICAgICAgICAgICAgICAgICAgIHNpZ24rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeiA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoLS1qID4gMCkKKyAgICAgICAgICAgICAgICAgIHJlc3VsdCAqPSB6OworICAgICAgICAgICAgICAgIGlmIChzaWduKQorICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMSAvIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gZnByZXN1bHQpCisgICAgICAgICAgICAgIGZwZmxhZysrOworICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBGTkZMT0FUCisgICAgICAgICAgY2FzZSBTWF9FWFA6ICAgICAgICAgICAgICAgICAgLyogZSB0byB0aGUgZ2l2ZW4gcG93ZXIgKi8KKyAgICAgICAgICAgIGZwcmVzdWx0ID0gKENLRkxPQVQpIGV4cChmcGopOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFNYX0xHTjogICAgICAgICAgICAgICAgICAvKiBOYXR1cmFsIGxvZyAqLworICAgICAgICAgIGNhc2UgU1hfTEdYOiAgICAgICAgICAgICAgICAgIC8qIExvZyBiYXNlIDEwICovCisgICAgICAgICAgY2FzZSBTWF9TUVI6ICAgICAgICAgICAgICAgICAgLyogU3F1YXJlIHJvb3QgKi8KKyAgICAgICAgICAgIGlmIChmcGogPCAwLjApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9Bcmd1bWVudCBvdXQgb2YgcmFuZ2UgLSBcIiVzXCJcbiIsY21kYnVmKTsKKyAgICAgICAgICAgICAgICBzZXhwcmMrKzsKKyAgICAgICAgICAgICAgICBnb3RvIHhkb3NleHA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeCA9PSBTWF9TUVIpCisgICAgICAgICAgICAgIGZwcmVzdWx0ID0gKENLRkxPQVQpIHNxcnQoZnBqKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHggPT0gU1hfTEdOKQorICAgICAgICAgICAgICBmcHJlc3VsdCA9IChDS0ZMT0FUKSBsb2coZnBqKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZnByZXN1bHQgPSAoQ0tGTE9BVCkgbG9nMTAoZnBqKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9TSU46ICAgICAgICAgICAgICAgICAgLyogc2luZSAqLworICAgICAgICAgICAgZnByZXN1bHQgPSAoQ0tGTE9BVCkgc2luKGZwaik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU1hfQ09TOiAgICAgICAgICAgICAgICAgIC8qIGNvc2luZSAqLworICAgICAgICAgICAgZnByZXN1bHQgPSAoQ0tGTE9BVCkgY29zKGZwaik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU1hfVEFOOiAgICAgICAgICAgICAgICAgIC8qIHRhbmdlbnQgKi8KKyAgICAgICAgICAgIGZwcmVzdWx0ID0gKENLRkxPQVQpIHRhbihmcGopOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogRk5GTE9BVCAqLworCisgICAgICAgICAgY2FzZSBTWF9DRUk6ICAgICAgICAgICAgICAgICAgLyogQ2VpbGluZyAqLworICAgICAgICAgICAgaWYgKGogIT0gZnBqKQorICAgICAgICAgICAgICBpZiAoZnBqID4gMC4wKQorICAgICAgICAgICAgICAgIGZwaiArPSAxLjA7CisgICAgICAgICAgICBmcHJlc3VsdCA9IGZwajsKKyAgICAgICAgICAgIGZwZmxhZyA9IDE7CisgICAgICAgICAgICB0cnVuY2F0ZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU1hfRkxSOiAgICAgICAgICAgICAgICAgIC8qIEZsb29yICovCisgICAgICAgICAgICBpZiAoaiAhPSBmcGopCisgICAgICAgICAgICAgIGlmIChmcGogPCAwLjApCisgICAgICAgICAgICAgICAgZnBqIC09IDEuMDsKKyAgICAgICAgICAgIGZwcmVzdWx0ID0gZnBqOworICAgICAgICAgICAgZnBmbGFnID0gMTsKKyAgICAgICAgICAgIHRydW5jYXRlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9UUlU6ICAgICAgICAgICAgICAgICAgLyogVHJ1bmNhdGUgKi8KKyAgICAgICAgICAgIGZwcmVzdWx0ID0gZnBqOworICAgICAgICAgICAgZnBmbGFnID0gMTsKKyAgICAgICAgICAgIHRydW5jYXRlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9ST1U6ICAgICAgICAgICAgICAgICAgLyogUm91bmQgKi8KKyAgICAgICAgICAgIGlmIChmcGogPiAwLjApCisgICAgICAgICAgICAgIGZwaiArPSAwLjU7CisgICAgICAgICAgICBlbHNlIGlmIChmcGogPCAwLjApCisgICAgICAgICAgICAgIGZwaiAtPSAwLjU7CisgICAgICAgICAgICBmcHJlc3VsdCA9IGZwajsKKyAgICAgICAgICAgIGZwZmxhZyA9IDE7CisgICAgICAgICAgICB0cnVuY2F0ZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU1hfQUJTOiAgICAgICAgICAgICAgICAgIC8qIEFic29sdXRlIHZhbHVlICovCisgICAgICAgICAgICByZXN1bHQgPSAoaiA8IDApID8gMCAtIGogOiBqOworICAgICAgICAgICAgZnByZXN1bHQgPSAoZnBqIDwgMC4wKSA/IDAuMCAtIGZwaiA6IGZwajsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gZnByZXN1bHQpCisgICAgICAgICAgICAgIGZwZmxhZysrOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFNYX01BWDogICAgICAgICAgICAgICAgICAvKiBNYXggKi8KKyAgICAgICAgICAgIGlmIChqICE9IGZwaikKKyAgICAgICAgICAgICAgZnBmbGFnKys7CisgICAgICAgICAgICBpZiAoZnBmbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKGZwaiA+IGZwcmVzdWx0KQorICAgICAgICAgICAgICAgICAgZnByZXN1bHQgPSBmcGo7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgaWYgKGogPiByZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gajsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9NSU46ICAgICAgICAgICAgICAgICAgLyogTWluICovCisgICAgICAgICAgICBpZiAoaiAhPSBmcGopCisgICAgICAgICAgICAgIGZwZmxhZysrOworICAgICAgICAgICAgaWYgKGZwZmxhZykgeworICAgICAgICAgICAgICAgIGlmIChmcGogPCBmcHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgIGZwcmVzdWx0ID0gZnBqOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIGlmIChqIDwgcmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGo7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU1hfRkxPOiAgICAgICAgICAgICAgICAgIC8qIEZsb2F0ICovCisgICAgICAgICAgICBmcGZsYWcrKzsKKyAgICAgICAgICAgIGZwcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgZnBqID0gajsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9OT1Q6ICAgICAgICAgICAgICAgICAgLyogTk9UIChyZXZlcnNlIHRydXRoIHZhbHVlKSAqLworICAgICAgICAgICAgZnBmbGFnID0gMDsKKyAgICAgICAgICAgIG5vdCsrOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFNYX0JXQTogICAgICAgICAgICAgICAgICAvKiBCaXR3aXNlIEFORCAqLworICAgICAgICAgICAgZnBmbGFnID0gMDsKKyAgICAgICAgICAgIHJlc3VsdCAmPSBqOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFNYX0JXTzogICAgICAgICAgICAgICAgICAvKiBCaXR3aXNlIE9SICovCisgICAgICAgICAgICBmcGZsYWcgPSAwOworICAgICAgICAgICAgcmVzdWx0IHw9IGo7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU1hfQldYOiAgICAgICAgICAgICAgICAgIC8qIEJpdHdpc2UgWE9SICovCisgICAgICAgICAgY2FzZSBTWF9YT1I6ICAgICAgICAgICAgICAgICAgLyogTG9naWNhbCBYT1IgKi8KKyAgICAgICAgICAgIGlmIChuID4gMykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1RvbyBtYW55IG9wZXJhbmRzIC0gXCIlc1wiXG4iLHMpOworICAgICAgICAgICAgICAgIHNleHByYysrOworICAgICAgICAgICAgICAgIGdvdG8geGRvc2V4cDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZwZmxhZyA9IDA7CisgICAgICAgICAgICBpZiAoeCA9PSBTWF9CV1gpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgXj0gajsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCAmJiAhaikgfHwgKCFyZXN1bHQgJiYgaik7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTWF9CV046ICAgICAgICAgICAgICAgICAgLyogQml0d2lzZSBOb3QgKi8KKyAgICAgICAgICAgIGZwZmxhZyA9IDA7CisgICAgICAgICAgICByZXN1bHQgPSB+cmVzdWx0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCJCQUQgT1AgWyVzXVxuIixwWzFdKTsKKyAgICAgICAgICAgIHNleHByYysrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghcGZsYWcpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBhIHByZWRpY2F0ZSAqLworICAgICAgc2V4cHB2ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIFNvIHVuc2V0IHRoaXMgKi8KKworICAvKiBkb21hY3JvOiAqLworCisgICAgaWYgKG1hY3JvKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlci1kZWZpbmVkIG1hY3JvICovCisgICAgICAgIGV4dGVybiBpbnQgZnNleHBmbGFnOyAgICAgICAgICAgLyogKHNlZSBmbmV2YWwoKTpja3V1czQuYykgKi8KKyAgICAgICAgaW50IGxvb2thZ2FpbiA9IDA7ICAgICAgICAgICAgICAvKiBNYXliZSB0aGUgbWFjcm8gdGFibGUgY2hhbmdlZCAqLworICAgICAgICBpZiAobWFjdGFiW214XS5rd2QpIHsgICAgICAgICAgIC8qIENoZWNrIGFuZCBzZWUgKi8KKyAgICAgICAgICAgIGlmIChja3N0cmNtcChtYWN0YWJbbXhdLmt3ZCxwWzFdLC0xLDApKQorICAgICAgICAgICAgICBsb29rYWdhaW4rKzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgbG9va2FnYWluKys7CisgICAgICAgIGlmIChsb29rYWdhaW4pIHsgICAgICAgICAgICAgICAgLyogVGhlIHRhYmxlIGNoYW5nZWQgKi8KKyAgICAgICAgICAgIG14ID0gbXhsb29rKG1hY3RhYixwWzFdLG5tYWMpOyAvKiBHZXQgdGhlIG1hY3JvJ3MgbmV3IGluZGV4ICovCisgICAgICAgICAgICBkZWJ1ZyhGMTExLHNleHBkZWJ1ZygibWFjcm8gbW92ZWQiKSxwWzFdLG14KTsKKyAgICAgICAgICAgIGlmIChteCA8IDApIHsgICAgICAgICAgICAgICAgICAvKiBZaWtlcyEgKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIj9NYWNybyBkaXNhcHBlYXJlZCEgLSBcIiVzXCJcbiIscFsxXSk7CisgICAgICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICAgICAgZ290byB4ZG9zZXhwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTEsc2V4cGRlYnVnKCJtYWNybyBteCIpLG1hY3RhYltteF0ua3dkLG14KTsKKyAgICAgICAgaWYgKGZzZXhwZmxhZykgeyAgICAgICAgICAgICAgICAvKiBJZiBlbWJlZGRlZCBpbiBhIGZ1bmN0aW9uIGNhbGwgKi8KKyAgICAgICAgICAgIGlmIChjbXB1c2goKSA+IC0xKSB7ICAgICAgICAvKiBnZXQgYSBuZXcgY29weSBvZiB0aGUgcGFyc2luZyAqLworICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgaWZjOyAgICAgICAgIC8qIGVudmlyb25tZW50LCAqLworICAgICAgICAgICAgICAgIGludCBrLCBpZmNzYXYgPSBpZmM7ICAgIC8qIHNhdmUgdGhlIElGIHN0YXRlICovCisgICAgICAgICAgICAgICAgZG9kbyhteCxsaW5lLDApOyAgICAgICAgLyogU2V0IHVwIHRoZSBtYWNybyAqLworICAgICAgICAgICAgICAgIGsgPSBwYXJzZXIoMSk7ICAgICAgICAgIC8qIENhbGwgdGhlIHBhcnNlciB0byBleGVjdXRlIGl0ICovCisgICAgICAgICAgICAgICAgY21wb3AoKTsgICAgICAgICAgICAgICAgLyogUG9wIGJhY2sgdG8gcHJldmlvdXMgbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICBpZmMgPSBpZmNzYXY7ICAgICAgICAgICAvKiByZXN0b3JlIElGIHN0YXRlICovCisgICAgICAgICAgICAgICAgaWYgKGsgPT0gMCkgICAgICAgICAgICAgLyogSWYgbm8gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgIHMyID0gbXJ2YWxbbWFjbHZsKzFdOyAvKiBnZXQgcmV0dXJuIHZhbHVlLCBpZiBhbnkgKi8KKyAgICAgICAgICAgICAgICBpZiAoIXMyKSBzMiA9ICIiOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsc2V4cGRlYnVnKCJtYWNybyByZXR1cm4iKSxzMiwwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/UmVzb3VyY2VzIGV4aGF1c3RlZCAtIFwiJXNcIlxuIixzKTsKKyAgICAgICAgICAgICAgICBzZXhwcmMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgZW1iZWRkZWQgaW4gYSBmdW5jdGlvbiBjYWxsICovCisgICAgICAgICAgICBkb2RvKG14LGxpbmUsMCk7ICAgICAgICAgICAgLyogQXMgYWJvdmUgYnV0IHdpdGhvdXQgY21wdXNoL3BvcCgpICovCisgICAgICAgICAgICBrID0gcGFyc2VyKDEpOworICAgICAgICAgICAgaWYgKGsgPT0gMCkKKyAgICAgICAgICAgICAgczIgPSBtcnZhbFttYWNsdmwrMV07CisgICAgICAgICAgICBpZiAoIXMyKSBzMiA9ICIiOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwZmxhZykgeyAgICAgICAgICAgICAgICAgLyogUHJlZGljYXRlICovCisgICAgICAgIGlmIChub3QpIHByZXN1bHQgPSBwcmVzdWx0ID8gMCA6IDE7CisgICAgICAgIHNleHBwdiA9IHByZXN1bHQ7ICAgICAgICAgICAgICAgLyogU28gc2V0IHByZWRpY2F0ZSB2YWx1ZSAoMCBvciAxKSAqLworICAgICAgICBzMiA9IHByZXN1bHQgPyAiMSIgOiAiMCI7CisgICAgfSBlbHNlIGlmIChmcGZsYWcpIHsgICAgICAgICAgICAgICAgLyogUmVzdWx0IGlzIGZsb2F0aW5nLXBvaW50ICovCisgICAgICAgIGlmIChub3QpIGZwcmVzdWx0ID0gZnByZXN1bHQgPyAwLjAgOiAxLjA7CisgICAgICAgIHMyID0gZnBmb3JtYXQoZnByZXN1bHQsMCwwKTsKKyAgICB9IGVsc2UgaWYgKHggIT0gU1hfRVZBKSB7CisgICAgICAgIGlmIChub3QpIHJlc3VsdCA9IHJlc3VsdCA/IDAgOiAxOworICAgICAgICBzMiA9IGNraXRvYShyZXN1bHQpOworICAgIH0KKworLyogQ29tbW9uIGV4aXQgcG9pbnQuICBBbHdheXMgY29tZSBoZXJlIHRvIGV4aXQuICovCisKKyAgeGRvc2V4cDoKKworICAgIGlmICghczIpIHMyID0gIiI7CisgICAgaWYgKCFzZXhwcmMgJiYgczIpIHsgICAgICAgICAgICAgICAgLyogSGF2ZSBhIHJlc3VsdCAqLworICAgICAgICBjaGFyICogc3g7CisgICAgICAgIGNoYXIgKiBxMiA9IHMyOyBpbnQgeHggPSAwOworICAgICAgICBpZiAoKnMyKSB7CisgICAgICAgICAgICB3aGlsZSAoKnEyKyspIHh4Kys7ICAgICAgICAgLyogR2V0IGxlbmd0aCAqLworICAgICAgICAgICAgaWYgKHh4ID4gc2V4cHJtYXgpICAgICAgICAgIC8qIChzdGF0cykgKi8KKyAgICAgICAgICAgICAgc2V4cHJtYXggPSB4eDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgeHggPSAwOworICAgICAgICBpZiAoeHggPiBzeHJsZW5bc2V4cGRlcF0gfHwgIXN4cmVzdWx0W3NleHBkZXBdKSB7CisgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgIGsgPSB4eCArIHh4IC8gNDsKKyAgICAgICAgICAgIGlmIChrIDwgMzIpIGsgPSAzMjsKKyAgICAgICAgICAgIGlmIChzeHJlc3VsdFtzZXhwZGVwXSkKKyAgICAgICAgICAgICAgZnJlZShzeHJlc3VsdFtzZXhwZGVwXSk7CisgICAgICAgICAgICBpZiAoKHN4cmVzdWx0W3NleHBkZXBdID0gKGNoYXIgKiltYWxsb2MoaykpKSB7CisgICAgICAgICAgICAgICAgc3hybGVuW3NleHBkZXBdID0gazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/TWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSAtIFwiJXNcIlxuIixzMik7CisgICAgICAgICAgICAgICAgc2V4cHJjKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3ggPSBzeHJlc3VsdFtzZXhwZGVwXTsgICAgICAgICAvKiBQb2ludCB0byByZXN1bHQgYnVmZmVyICovCisgICAgICAgIHdoaWxlICgoKnN4KysgPSAqczIrKykpIDsgICAgICAgLyogY29weSByZXN1bHQuICovCisgICAgICAgIGlmIChmcGZsYWcgJiYgdHJ1bmNhdGUpIHsgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgKyB0cnVuY2F0ZSAqLworICAgICAgICAgICAgc3ggPSBzeHJlc3VsdFtzZXhwZGVwXTsgICAgIC8qIGF0IGRlY2ltYWwgcG9pbnQgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IHh4IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoc3hbaV0gPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgICAgIHN4W2ldID0gTlVMOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7ICAgICAgIC8qIElmIG5vdGhpbmcgbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3hbMF0gPSAnMCc7ICAgIC8qIHB1dCBhIHplcm8uICovCisgICAgICAgICAgICAgICAgICAgICAgICBzeFsxXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobGluZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBtYWNybyBhcmcgYnVmZmVyIGFsbG9jYXRlZCAqLworICAgICAgZnJlZShsaW5lKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgaXQuICovCisgICAgaWYgKG11c3RmcmVlKSB7ICAgICAgICAgICAgICAgICAgICAgLyogQW5kIGZyZWUgbG9jYWwgY29weSBvZiBzcGxpdCBsaXN0ICovCisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAocFtpXSkgZnJlZShwW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWJ1ZyhGMTExLHNleHBkZWJ1ZygiZXhpdCIpLHN4cmVzdWx0W3NleHBkZXBdLHNleHByYyk7CisgICAgcmV0dXJuKHN4cmVzdWx0W3NleHBkZXAtLV0pOworfQorI2VuZGlmIC8qIE5PU0VYUCAqLworI2VuZGlmIC8qIE5PU1BMICovCisKK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDSEVDSyBjb21tYW5kICovCitkb2NoaygpIHsKKyAgICBpbnQgeCwgeTsKKyAgICBpZiAoKHkgPSBjbWtleShmdHJ0YWIsbmZ0ciwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih5KTsKKyAgICBja3N0cm5jcHkobGluZSxhdG1idWYsTElOQlVGU0laKTsKKyAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICByZXR1cm4oeSk7CisjaWZuZGVmIE5PUFVTSAorICAgIGlmICghY2tzdHJjbXAobGluZSwicHVzaCIsKGludClzdHJsZW4obGluZSksMCkpIHsKKyAgICAgICAgaWYgKG1zZ2ZsZykgICAgICAgICAgICAgICAgICAgICAvKiBJZiBhdCB0b3AgbGV2ZWwuLi4gKi8KKyAgICAgICAgICBwcmludGYoIiBwdXNoJXMgYXZhaWxhYmxlXG4iLCBub3B1c2ggPyAiIG5vdCIgOiAiIik7CisgICAgICAgIGVsc2UgaWYgKG5vcHVzaCAmJiAhYmFja2dyZCkKKyAgICAgICAgICBwcmludGYoIiBDSEVDSzogcHVzaCBub3QgYXZhaWxhYmxlXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxIC0gbm9wdXNoKTsKKyAgICB9CisjZW5kaWYgLyogTk9QVVNIICovCisjaWZkZWYgUElQRVNFTkQKKyAgICBpZiAoIWNrc3RyY21wKGxpbmUsInBpcGVzIiwoaW50KXN0cmxlbihsaW5lKSwwKSkgeworICAgICAgICBpZiAobXNnZmxnKSAgICAgICAgICAgICAgICAgICAgIC8qIElmIGF0IHRvcCBsZXZlbC4uLiAqLworICAgICAgICAgIHByaW50ZigiIHBpcGVzJXMgYXZhaWxhYmxlXG4iLAorICAgICAgICAgICAgICAgICAobm9wdXNoIHx8IHByb3RvY29sICE9IFBST1RPX0spID8gIiBub3QiIDogIiIpOworICAgICAgICBlbHNlIGlmICgobm9wdXNoIHx8IHByb3RvY29sICE9IFBST1RPX0spICYmICFiYWNrZ3JkKQorICAgICAgICAgIHByaW50ZigiIENIRUNLOiBwaXBlcyBub3QgYXZhaWxhYmxlXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxIC0gbm9wdXNoKTsKKyAgICB9CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyAgICB5ID0gbG9va3VwKGZ0cnRhYixsaW5lLG5mdHIsJngpOyAgICAvKiBMb29rIGl0IHVwICovCisgICAgZGVidWcoRjExMSwiZG9jaGsiLGZ0cnRhYlt4XS5rd2QseSk7CisgICAgaWYgKG1zZ2ZsZykgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgYXQgdG9wIGxldmVsLi4uICovCisgICAgICBwcmludGYoIiAlcyVzIGF2YWlsYWJsZVxuIiwgZnRydGFiW3hdLmt3ZCwgeSA/ICIgbm90IiA6ICIiKTsKKyAgICBlbHNlIGlmICh5ICYmICFiYWNrZ3JkKQorICAgICAgcHJpbnRmKCIgQ0hFQ0s6ICVzIG5vdCBhdmFpbGFibGVcbiIsIGZ0cnRhYlt4XS5rd2QpOworICAgIHJldHVybihzdWNjZXNzID0gMSAtIHkpOworfQorCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBDS0xPR0RJQUwKKworLyogQ29ubmVjdGlvbiBsb2cgYW5kIGVsYXBzZWQtdGltZSByZXBvcnRpbmcgKi8KKworZXh0ZXJuIGNoYXIgY3hsb2didWZbXTsgICAgICAgICAgICAgICAgIC8qIExvZyByZWNvcmQgYnVmZmVyICovCitleHRlcm4gY2hhciBkaWFmaWxbXTsgICAgICAgICAgICAgICAgICAgLyogTG9nIGZpbGUgbmFtZSAqLworZXh0ZXJuIGludCBkaWFsb2csIGN4X2FjdGl2ZTsgICAgICAgICAgIC8qIEZsYWdzICovCitzdGF0aWMgbG9uZyBjeF9wcmV2ID0gMEw7ICAgICAgICAgICAgICAgLyogRWxhcHNlZCB0aW1lIG9mIHByZXZpb3VzIHNlc3Npb24gKi8KKworI2VuZGlmIC8qIENLTE9HRElBTCAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworVk9JRAorZG9sb2dlbmQoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIHJlY29yZCB0byBjb25uZWN0aW9uIGxvZyAqLworI2lmZGVmIExPQ1VTCisgICAgZXh0ZXJuIGludCBsb2N1cywgYXV0b2xvY3VzOworI2VuZGlmIC8qIExPQ1VTICovCisKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIENLTE9HRElBTAorICAgIGxvbmcgZDEsIGQyLCB0MSwgdDI7CisgICAgY2hhciBidWZbMzJdLCAqIHA7CisjZW5kaWYgLyogQ0tMT0dESUFMICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZkZWYgTE9DVVMKKyAgICBpZiAoYXV0b2xvY3VzKSB7CisgICAgICAgIGludCB4ID0gbG9jdXM7CisjaWZkZWYgTkVXRlRQCisgICAgICAgIGV4dGVybiBpbnQgZnRwaXNjb25uZWN0ZWQoKTsKKwlkZWJ1ZyhGMTAxLCJkb2xvZ2VuZCBmdHBpc2Nvbm5lY3RlZCIsIiIsZnRwaXNjb25uZWN0ZWQoKSk7CisgICAgICAgIHNldGxvY3VzKGZ0cGlzY29ubmVjdGVkKCkgPyAwIDogMSwgMSk7CisjZWxzZQorICAgICAgICBzZXRsb2N1cygxLDEpOworI2VuZGlmIC8qIE5FV0ZUUCAqLworICAgIH0KKyNlbmRpZiAvKiBMT0NVUyAqLworCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBDS0xPR0RJQUwKKyAgICBkZWJ1ZyhGMTAxLCJkb2xvZ2VuZCBkaWFsb2ciLCIiLGRpYWxvZyk7CisgICAgZGVidWcoRjEwMSwiZG9sb2dlbmQgY3hsb2didWZbMF0iLCIiLGN4bG9nYnVmWzBdKTsKKyNpZmRlZiBDS1NZU0xPRworICAgIGRlYnVnKEYxMDEsImRvbG9nZW5kIGNreGxvZ2dpbmciLCIiLGNreGxvZ2dpbmcpOworI2VuZGlmIC8qIENLU1lTTE9HICovCisKKyAgICBpZiAoIWN4X2FjdGl2ZSB8fCAhY3hsb2didWZbMF0pICAgICAvKiBObyBhY3RpdmUgcmVjb3JkICovCisgICAgICByZXR1cm47CisKKyAgICBjeF9hY3RpdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBSZWNvcmQgaXMgbm90IGFjdGl2ZSAqLworICAgIGRlYnVnKEYxMTEsImRvbG9nZW5kIGN4bG9nYnVmIDEiLGN4bG9nYnVmLGN4X2FjdGl2ZSk7CisKKyAgICBkMSA9IG1qZCgoY2hhciAqKWN4bG9nYnVmKTsgICAgICAgICAvKiBHZXQgc3RhcnQgZGF0ZSBvZiB0aGlzIHNlc3Npb24gKi8KKyAgICBja3N0cm5jcHkoYnVmLGNrZGF0ZSgpLDMxKTsgICAgICAgICAvKiBHZXQgY3VycmVudCBkYXRlICovCisgICAgZDIgPSBtamQoYnVmKTsgICAgICAgICAgICAgICAgICAgICAgLyogQ29udmVydCB0aGVtIHRvIG1qZHMgKi8KKyAgICBwID0gY3hsb2didWY7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgc3RhcnQgdGltZSAqLworICAgIHBbMTFdID0gTlVMOworICAgIHBbMTRdID0gTlVMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgdG8gc2Vjb25kcyAqLworICAgIHQxID0gYXRvbChwKzkpICogMzYwMEwgKyBhdG9sKHArMTIpICogNjBMICsgYXRvbChwKzE1KTsKKyAgICBwWzExXSA9ICc6JzsKKyAgICBwWzE0XSA9ICc6JzsKKyAgICBwID0gYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgZW5kIHRpbWUgKi8KKyAgICBwWzExXSA9IE5VTDsKKyAgICBwWzE0XSA9IE5VTDsKKyAgICB0MiA9IGF0b2wocCs5KSAqIDM2MDBMICsgYXRvbChwKzEyKSAqIDYwTCArIGF0b2wocCsxNSk7CisgICAgdDIgPSAoKGQyIC0gZDEpICogODY0MDBMKSArICh0MiAtIHQxKTsgLyogQ29tcHV0ZSBlbGFwc2VkIHRpbWUgKi8KKyAgICBkZWJ1ZyhGMTAxLCJkb2xvZ2VuZCB0MiIsIiIsdDIpOworICAgIGlmICh0MiA+IC0xTCkgeworICAgICAgICBjeF9wcmV2ID0gdDI7CisgICAgICAgIHAgPSBoaG1tc3ModDIpOworICAgICAgICBkZWJ1ZyhGMTEwLCJkb2xvZ2VuZCBoaG1tc3MiLHAsMCk7CisgICAgICAgIHN0cm5jYXQoY3hsb2didWYsIkU9IixDWExPR0JVRkwpOyAvKiBBcHBlbmQgdG8gbG9nIHJlY29yZCAqLworICAgICAgICBzdHJuY2F0KGN4bG9nYnVmLHAsQ1hMT0dCVUZMKTsKKyAgICAgICAgZGVidWcoRjExMCwiZG9sb2dlbmQgY3hsb2didWYgMiIsY3hsb2didWYsMCk7CisgICAgfSBlbHNlCisgICAgICBjeF9wcmV2ID0gMEw7CisgICAgZGVidWcoRjEwMSwiZG9sb2dlbmQgY3hfcHJldiIsIiIsY3hfcHJldik7CisgICAgaWYgKGRpYWxvZykgeyAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgbG9nZ2luZyAqLworICAgICAgICBpbnQgeDsKKyAgICAgICAgeCA9IGRpYW9wbihkaWFmaWwsMSwxKTsgICAgICAgICAvKiBPcGVuIGxvZyBpbiBhcHBlbmQgbW9kZSAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJkb2xvZ2VuZCBkaWFvcG4iLCIiLHgpOworICAgICAgICB4ID0genNvdXRsKFpESUZJTCxjeGxvZ2J1Zik7ICAgIC8qIFdyaXRlIHRoZSByZWNvcmQgKi8KKyAgICAgICAgZGVidWcoRjEwMSwiZG9sb2dlbmQgenNvdXRsIiwiIix4KTsKKyAgICAgICAgeCA9IHpjbG9zZShaRElGSUwpOyAgICAgICAgICAgICAvKiBDbG9zZSB0aGUgbG9nICovCisgICAgICAgIGRlYnVnKEYxMDEsImRvbG9nZW5kIHpjbG9zZSIsIiIseCk7CisgICAgfQorI2lmZGVmIENLU1lTTE9HCisgICAgZGVidWcoRjEwMSwiZG9sb2dlbmQgY2t4bG9nZ2luZyIsIiIsY2t4bG9nZ2luZyk7CisgICAgaWYgKGNreGxvZ2dpbmcpIHsKKyAgICAgICAgaW50IHg7CisgICAgICAgIHggPSBja2luZGV4KCJUPURJQUwiLGN4bG9nYnVmLDAsMCwxKTsKKyAgICAgICAgZGVidWcoRjExMSwiZG9sb2dlbmQgY2t4c3lzbG9nIixjeGxvZ2J1Zixja3hzeXNsb2cpOworICAgICAgICBkZWJ1ZyhGMTExLCJkb2xvZ2VuZCBja2luZGV4IiwiVD1ESUFMIix4KTsKKyAgICAgICAgaWYgKHggPiAwKSB7CisgICAgICAgICAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX0RJKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZG9sb2dlbmQgc3lzbG9nIixjeGxvZ2J1ZisxOCwwKTsKKyAgICAgICAgICAgICAgICBja3N5c2xvZyhTWVNMR19ESSwxLCJDT05ORUNUSU9OIiwoY2hhciAqKShjeGxvZ2J1ZisxOCksIiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfQUMpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJkb2xvZ2VuZCBzeXNsb2ciLGN4bG9nYnVmKzE4LDApOworICAgICAgICAgICAgICAgIGNrc3lzbG9nKFNZU0xHX0FDLDEsIkNPTk5FQ1RJT04iLChjaGFyICopKGN4bG9nYnVmKzE4KSwiIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyNlbmRpZiAvKiBDS0xPR0RJQUwgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCit9CisKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIENLTE9HRElBTAorCisvKiAgRCBPIEwgTyBHIFMgSCBPIFcgIC0tICBTaG93IHNlc3Npb24vY29ubmVjdGlvbiBpbmZvICAqLworCisvKiBDYWxsIHdpdGggZmMgPT0gMSB0byBzaG93LCBmYyA9PSAwIHRvIG9ubHkgY2FsY3VsYXRlLiAqLworLyogUmV0dXJucyBzZXNzaW9uIGVsYXBzZWQgdGltZSBpbiBzZWNvbmRzLiAqLworLyogSWYgbm8gc2Vzc2lvbiBhY3RpdmUsIHJldHVybnMgZWxhcHNlZCB0aW1lIG9mIHByZXZpb3VzIHNlc3Npb24sIGlmIGFueSwgKi8KKy8qIG90aGVyd2lzZSAwICovCisKK2xvbmcKK2RvbG9nc2hvdyhmYykgaW50IGZjOyB7ICAgICAgICAgICAgICAgICAvKiBTSE9XIChjdXJyZW50KSBDT05ORUNUSU9OICovCisgICAgbG9uZyBkMSwgZDIsIHQxLCB0MiA9IDAsIHByZXY7CisgICAgY2hhciBjLCBidWYxWzMyXSwgYnVmMlszMl0sICogaW5mb1szMl0sICogcCwgKiBzOworICAgIGNoYXIgKiB4bG9nYnVmLCB4YnVmW0NYTE9HQlVGTCsxXTsKKyAgICBpbnQgaSwgeCA9IDAsIHosIGZ0cCA9IDAsIGFjdGl2ZSA9IDA7CisKKyNpZmRlZiBORVdGVFAKKyAgICBleHRlcm4gY2hhciBmdHBsb2didWZbXTsKKyAgICBleHRlcm4gbG9uZyBmdHBsb2dwcmV2OworICAgIGV4dGVybiBpbnQgZnRwbG9nYWN0aXZlOworICAgIGlmIChmYyAmIFdfRlRQKSB7CisgICAgICAgIGZjICY9IDYzOworICAgICAgICBmdHAgPSAxOworICAgICAgICB4bG9nYnVmID0gZnRwbG9nYnVmOworICAgICAgICBwcmV2ID0gZnRwbG9ncHJldjsKKyAgICAgICAgYWN0aXZlID0gZnRwbG9nYWN0aXZlOworICAgIH0gZWxzZSB7CisjZW5kaWYgLyogTkVXRlRQICovCisgICAgICAgIGZ0cCA9IDA7CisgICAgICAgIHhsb2didWYgPSBjeGxvZ2J1ZjsKKyAgICAgICAgcHJldiA9IGN4X3ByZXY7CisgICAgICAgIGFjdGl2ZSA9IGN4X2FjdGl2ZTsKKyNpZmRlZiBORVdGVFAKKyAgICB9CisjZW5kaWYgLyogTkVXRlRQICovCisKKyAgICBkZWJ1ZyhGMTAxLCJkb2xvZ3Nob3cgbG9jYWwiLCIiLGxvY2FsKTsKKyAgICBkZWJ1ZyhGMTAxLCJkb2xvZ3Nob3cgZnRwIiwiIixmdHApOworICAgIGRlYnVnKEYxMTEsImRvbG9nc2hvdyBhY3RpdmUiLHhsb2didWYsYWN0aXZlKTsKKworICAgIGlmICgheGxvZ2J1ZlswXSkgeworICAgICAgICBpZiAoZmMpIHsKKyAgICAgICAgICAgIGlmIChkaWRzZXRsaW4gfHwgZnRwKQorICAgICAgICAgICAgICBwcmludGYoIiAlczogTm8gcmVjb3JkLlxuIiwgZnRwID8gIkZUUCIgOiAiS2VybWl0Iik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ZigiICVzOiBObyBjb25uZWN0aW9uLlxuIiwgZnRwID8gIkZUUCIgOiAiS2VybWl0Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHByZXYpOworICAgIH0KKworI2lmZGVmIE5FV0ZUUAorICAgIGlmIChmdHApIHsKKyAgICAgICAgeiA9IGZ0cGlzY29ubmVjdGVkKCkgPyAxIDogLTE7CisgICAgfSBlbHNlIHsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKyAgICAgICAgaWYgKGxvY2FsKSB7ICAgICAgICAgICAgICAgICAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhbiBvcGVuIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgIHogPSB0dGNoaygpOworICAgICAgICAgICAgZGVidWcoRjEwMSwiZG9sb2dzaG93IHR0Y2hrIiwiIix6KTsKKyAgICAgICAgICAgIHogPSAoeiA+IC0xKSA/IDEgOiAtMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHogPSBhY3RpdmUgPyAxIDogLTI7CisgICAgICAgIH0KKyNpZmRlZiBORVdGVFAKKyAgICB9CisjZW5kaWYgLyogTkVXRlRQICovCisgICAgaWYgKHogPCAwTCkgeworICAgICAgICBpZiAoIWZjKQorICAgICAgICAgIHJldHVybihwcmV2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHQyID0gcHJldjsKKyAgICB9CisgICAgLyogTm90ZTogTk9UIGNrc3RybmNweSEgKi8KKyAgICBzdHJuY3B5KGJ1ZjEseGxvZ2J1ZiwxNyk7ICAgICAgICAgICAvKiBDb3B5IG9mIGp1c3QgdGhlIHRpbWVzdGFtcCAqLworICAgIGJ1ZjFbMTddID0gTlVMOyAgICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSBpdCAqLworICAgIGNrc3RybmNweSh4YnVmLHhsb2didWYrMTgsQ1hMT0dCVUZMKTsgLyogQ29weSB0aGF0IGNhbiBiZSBwb2tlZCAqLworICAgIGRlYnVnKEYxMTEsImRvbG9nc2hvdyBwcmV2Iix4YnVmLHByZXYpOworCisgICAgeHdvcmRzKHhidWYsMzEsaW5mbywxKTsgICAgICAgICAgICAgLyogQnJlYWsgdXAgaW50byBmaWVsZHMgKi8KKyAgICBkMSA9IG1qZChidWYxKTsgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHN0YXJ0IHRpbWUgdG8gTUpEICovCisgICAgY2tzdHJuY3B5KGJ1ZjIsY2tkYXRlKCksMzEpOyAgICAgICAgLyogQ3VycmVudCBkYXRlICovCisgICAgZDIgPSBtamQoYnVmMik7ICAgICAgICAgICAgICAgICAgICAgLyogQ29udmVydCB0byBNSkQgKi8KKyAgICBwID0gYnVmMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBzdGFydCB0aW1lICovCisgICAgcFsxMV0gPSBOVUw7CisgICAgcFsxNF0gPSBOVUw7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udmVydCB0byBzZWNvbmRzICovCisgICAgdDEgPSBhdG9sKHArOSkgKiAzNjAwTCArIGF0b2wocCsxMikgKiA2MEwgKyBhdG9sKHArMTUpOworICAgIHBbMTFdID0gJzonOworICAgIHBbMTRdID0gJzonOworICAgIHAgPSBidWYyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpdHRvIGZvciBjdXJyZW50IHRpbWUgKi8KKyAgICBwWzExXSA9IE5VTDsKKyAgICBwWzE0XSA9IE5VTDsKKyAgICBpZiAoeiA+IC0xTCkgeworICAgICAgICB0MiA9IGF0b2wocCs5KSAqIDM2MDBMICsgYXRvbChwKzEyKSAqIDYwTCArIGF0b2wocCsxNSk7CisgICAgICAgIHQyID0gKChkMiAtIGQxKSAqIDg2NDAwTCkgKyAodDIgLSB0MSk7IC8qIEVsYXBzZWQgdGltZSBzbyBmYXIgKi8KKyAgICB9CisgICAgaWYgKGZjKSB7CisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBpZiAodDIgPiAtMUwpICAgICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgc2Vjb25kcyB0byBoaDptbTpzcyAqLworICAgICAgICAgIHAgPSBoaG1tc3ModDIpOworICAgICAgICBpZiAoeiA+IC0xKQorICAgICAgICAgIHMgPSAiQWN0aXZlIjsKKyAgICAgICAgZWxzZSBpZiAoeiA9PSAtMikKKyAgICAgICAgICBzID0gIkNsb3NlZCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzID0gIlVua25vd24iOworICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAgICAgICAgICAgIC8qIFNob3cgcmVzdWx0cyAqLworICAgICAgICBwcmludGYoIiBTdGF0dXM6ICAgICAgICVzXG4iLHMpOworICAgICAgICBwcmludGYoIiBPcGVuZWQ6ICAgICAgICVzXG4iLGJ1ZjEpOworICAgICAgICBwcmludGYoIiBVc2VyOiAgICAgICAgICVzXG4iLGluZm9bMV0gPyBpbmZvWzFdIDogIiIpOworICAgICAgICBwcmludGYoIiBQSUQ6ICAgICAgICAgICVzXG4iLGluZm9bMl0gPyBpbmZvWzJdIDogIiIpOworICAgICAgICBmb3IgKGkgPSAzOyBpbmZvW2ldOyBpKyspIHsKKyAgICAgICAgICAgIGMgPSBpbmZvW2ldWzBdOworICAgICAgICAgICAgcyA9IChpbmZvW2ldKSA/IGluZm9baV0rMiA6ICIiOworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgIGNhc2UgJ1QnOiBwcmludGYoIiBUeXBlOiAgICAgICAgICVzXG4iLCBzKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ04nOiBwcmludGYoIiBUbzogICAgICAgICAgICVzXG4iLCBzKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ0gnOiBwcmludGYoIiBGcm9tOiAgICAgICAgICVzXG4iLCBzKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ0QnOiBwcmludGYoIiBEZXZpY2U6ICAgICAgICVzXG4iLCBzKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ08nOiBwcmludGYoIiBPcmlnaW46ICAgICAgICVzXG4iLCBzKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ0UnOiBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDogIHByaW50ZigiICVzXG4iLGluZm9baV0gPyBpbmZvW2ldIDogIiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh6IDwgMEwpCisgICAgICAgICAgcHJpbnRmKCIgRWxhcHNlZCB0aW1lOiAlc1xuIiwgaGhtbXNzKHQyKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoIiBFbGFwc2VkIHRpbWU6ICVzXG4iLCBwID8gcCA6ICIodW5rbm93bikiKTsKKyAgICAgICAgeCA9IDA7CisjaWZkZWYgTkVUQ09OTgorI2lmZGVmIFNTSEJVSUxUSU4KKyAgICAgICAgaWYgKCBJU19TU0goKSApIHgrKzsKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICBpZiAoY2tfdG5fZW5jcnlwdGluZygpICYmIGNrX3RuX2RlY3J5cHRpbmcoKSkgeCsrOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgaWYgKHRsc19hY3RpdmVfZmxhZyB8fCBzc2xfYWN0aXZlX2ZsYWcpIHgrKzsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBSTE9HQ09ERQorI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICBpZiAodHRucHJvdG8gPT0gTlBfRUs0TE9HSU4gfHwgdHRucHJvdG8gPT0gTlBfRUs1TE9HSU4pIHgrKzsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKyAgICAgICAgaWYgKHogPiAwKQorICAgICAgICAgIHByaW50ZigiIEVuY3J5cHRlZDogICAgJXNcbiIsIHggPyAiWWVzIiA6ICJObyIpOworICAgICAgICBwcmludGYoIiBMb2c6ICAgICAgICAgICVzXG4iLCBkaWFsb2cgPyBkaWFmaWwgOiAiKG5vbmUpIik7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgICAgcmV0dXJuKHQyID4gLTFMID8gdDIgOiAwTCk7Cit9CisKK1ZPSUQKK2RvbG9nbGluZSgpIHsKKyAgICBjaGFyICogcDsKKyAgICBpbnQgbiwgbSA9IDA7CisKKyAgICBkb2xvZ2VuZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmV2aW91cyBzZXNzaW9uIG5vdCBjbG9zZWQgb3V0PyAqLworICAgIGN4X2FjdGl2ZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIFJlY29yZCBpcyBhY3RpdmUgKi8KKyAgICBjeF9wcmV2ID0gMEw7CisgICAgcCA9IGNrZGF0ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRpbWVzdGFtcCAqLworICAgIG4gPSBja3N0cm5jcHkoY3hsb2didWYscCxDWExPR0JVRkwtMSk7IC8qIFN0YXJ0IHJlY29yZCBvZmYgd2l0aCBpdCAqLworICAgIGlmICghdWlkYnVmWzBdKSB7CisgICAgICAgIGRlYnVnKEYxMDAsImRvbG9nbGluZSB1aWRidWYgZW1wdHkiLCIiLDApOworI2lmZGVmIFVOSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdobyBoYXMgd2hvYW1pKCkuLi4gKi8KKyAgICAgICAgY2tzdHJuY3B5KHVpZGJ1ZiwoY2hhciAqKXdob2FtaSgpLFVJREJVRkxFTik7CisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKyAgICAgICAgY2tzdHJuY3B5KHVpZGJ1ZiwoY2hhciAqKXdob2FtaSgpLFVJREJVRkxFTik7CisjZWxzZQorICAgICAgICBja3N0cm5jcHkodWlkYnVmLCJVTktOT1dOIixVSURCVUZMRU4pOworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisgICAgfQorICAgIG0gPSBzdHJsZW4odWlkYnVmKSArIHN0cmxlbihteWhvc3QpICsgc3RybGVuKHR0bmFtZSkgKyAzMjsKKyAgICBpZiAobittIDwgQ1hMT0dCVUZMLTEpIHsgICAgICAgICAgICAvKiBBZGQgc2VyaWFsIGRldmljZSBpbmZvICovCisgICAgICAgIHAgPSBjeGxvZ2J1ZituOworICAgICAgICBzcHJpbnRmKHAsIiAlcyAlcyBUPVNFUklBTCBIPSVzIEQ9JXMgIiwgLyogU0FGRSAqLworICAgICAgICAgICAgICAgIHVpZGJ1ZiwKKyAgICAgICAgICAgICAgICBja2dldHBpZCgpLAorICAgICAgICAgICAgICAgIG15aG9zdCwKKyAgICAgICAgICAgICAgICB0dG5hbWUKKyAgICAgICAgICAgICAgICApOworICAgIH0gZWxzZQorICAgICAgY2tzdHJuY3B5KGN4bG9nYnVmLCJMT0dMSU5FIEJVRkZFUiBPVkVSRkxPVyIsQ1hMT0dCVUZMKTsKKyAgICBkZWJ1ZyhGMTEwLCJkb2xvZ2xpbmUiLGN4bG9nYnVmLDApOworfQorCisjaWZkZWYgTkVUQ09OTgorVk9JRAorZG9sb2duZXQoKSB7CisgICAgY2hhciAqIHAsICogcyA9ICJORVQiLCAqIHV1ID0gdWlkYnVmOworICAgIGludCBuLCBtOworCisgICAgZG9sb2dlbmQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJldmlvdXMgc2Vzc2lvbiBub3QgY2xvc2VkIG91dD8gKi8KKyAgICBjeF9wcmV2ID0gMEw7CisgICAgY3hfYWN0aXZlID0gMTsgICAgICAgICAgICAgICAgICAgICAgLyogUmVjb3JkIGlzIGFjdGl2ZSAqLworICAgIHAgPSBja2RhdGUoKTsKKyAgICBuID0gY2tzdHJuY3B5KGN4bG9nYnVmLHAsQ1hMT0dCVUZMKTsKKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICBpZiAobmV0dHlwZSA9PSBORVRfVENQQiB8fCBuZXR0eXBlID09IE5FVF9UQ1BBKQorICAgICAgcyA9ICJUQ1AiOworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2lmZGVmIEFOWVgyNQorICAgIGlmIChuZXR0eXBlID09IE5FVF9TWDI1IHx8IG5ldHR5cGUgPT0gTkVUX1ZYMjUgfHwgbmV0dHlwZSA9PSBORVRfSVgyNSkKKyAgICAgIHMgPSAiWDI1IjsKKyNlbmRpZiAvKiBBTllYMjUgKi8KKyNpZmRlZiBERUNORVQKKyAgICBpZiAobmV0dHlwZSA9PSBORVRfREVDKQorICAgICAgcyA9ICJERUNORVQiOworI2VuZGlmIC8qIERFQ05FVCAqLworI2lmZGVmIFNVUEVSTEFUCisgICAgaWYgKG5ldHR5cGUgPT0gTkVUX1NMQVQpCisgICAgICBzID0gIlNVUEVSTEFUIjsKKyNlbmRpZiAvKiBTVVBFUkxBVCAqLworI2lmZGVmIENLX05FVEJJT1MKKyAgICBpZiAobmV0dHlwZSA9PSBORVRfQklPUykKKyAgICAgIHMgPSAiTkVUQklPUyI7CisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworCisgICAgaWYgKCF1dVswXSkgeworICAgICAgICBkZWJ1ZyhGMTAwLCJkb2xvZ25ldCB1aWRidWYgZW1wdHkiLCIiLDApOworI2lmZGVmIE9TMk9SVU5JWCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdobyBoYXMgd2hvYW1pKCkuLi4gKi8KKyAgICAgICAgdXUgPSAoY2hhciAqKXdob2FtaSgpOworI2Vsc2UKKyNpZmRlZiBTVFJBVFVTCisgICAgICAgIHV1ID0gKGNoYXIgKil3aG9hbWkoKTsKKyNlbHNlCisgICAgICAgIHV1ID0gIlVOS05PV04iOworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisgICAgfQorICAgIG0gPSBzdHJsZW4odXUpICsgc3RybGVuKG15aG9zdCkgKyBzdHJsZW4odHRuYW1lKSArIHN0cmxlbihzKSArIDMyOworICAgIGlmIChuK20gPCBDWExPR0JVRkwtMSkgeyAgICAgICAgICAgIC8qIFNBRkUgKi8KKyAgICAgICAgcCA9IGN4bG9nYnVmK247CisgICAgICAgIHNwcmludGYocCwiICVzICVzIFQ9JXMgTj0lcyBIPSVzICIsCisgICAgICAgICAgICAgICAgdXUsCisgICAgICAgICAgICAgICAgY2tnZXRwaWQoKSwKKyAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgIHR0bmFtZSwKKyAgICAgICAgICAgICAgICBteWhvc3QKKyAgICAgICAgICAgICAgICApOworICAgIH0gZWxzZQorICAgICAgY2tzdHJuY3B5KGN4bG9nYnVmLCJMT0dORVQgQlVGRkVSIE9WRVJGTE9XIixDWExPR0JVRkwpOworICAgIGRlYnVnKEYxMTAsImRvbG9nbmV0IGN4bG9nYnVmIixjeGxvZ2J1ZiwwKTsKK30KKyNlbmRpZiAvKiBORVRDT05OICovCisjZW5kaWYgLyogQ0tMT0dESUFMICovCisKKyNpZm5kZWYgTk9ESUFMCisvKgorICBQYXJzZSBhIERJQUwtcmVsYXRlZCBzdHJpbmcsIHN0cmlwcGluZyBlbmNsb3NpbmcgYnJhY2VzLCBpZiBhbnkuCisqLworc3RhdGljIGludAorZGlhbHN0cihwLG1zZykgY2hhciAqKnA7IGNoYXIgKm1zZzsgeworICAgIGludCB4OworICAgIGNoYXIgKnM7CisKKyAgICBpZiAoKHggPSBjbXR4dChtc2csICIiLCAmcywgeHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgcyA9IGJyc3RyaXAocyk7ICAgICAgICAgICAgICAgICAgICAgLyogU3RyaXAgYnJhY2VzIGFyb3VuZC4gKi8KKyAgICBkZWJ1ZyhGMTEwLCJkaWFsc3RyIixzLDApOworICAgIG1ha2VzdHIocCwqcz9zOk5VTEwpOworICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisKK1ZPSUQKK2luaXRtZG0oeCkgaW50IHg7IHsKKyAgICBNRE1JTkYgKiBwOworICAgIGludCBtOworCisgICAgbWRtdHlwID0geDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGdsb2JhbCBtb2RlbSB0eXBlICovCisgICAgZGVidWcoRjEwMSwiaW5pdG1kbSBtZG10eXAiLCIiLG1kbXR5cCk7CisgICAgZGVidWcoRjEwMSwiaW5pdG1kbSB1c2VybWRtIiwiIix1c2VybWRtKTsKKyAgICBpZiAoeCA8IDEpIHJldHVybjsKKworICAgIG0gPSB1c2VybWRtID8gdXNlcm1kbSA6IG1kbXR5cDsKKworICAgIHAgPSBtb2RlbXBbbV07ICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIG1vZGVtIGluZm8gc3RydWN0LCBhbmQgKi8KKyAgICBkZWJ1ZyhGMTAxLCJpbml0bWRtIHAiLCIiLHApOworICAgIGlmIChwKSB7CisgICAgICAgIGRpYWxlYyA9IHAtPmNhcGFzICYgQ0tEX0VDOyAgICAgLyogc2V0IERJQUwgRVJST1ItQ09SUkVDVElPTiwgKi8KKyAgICAgICAgZGlhbGRjID0gcC0+Y2FwYXMgJiBDS0RfREM7ICAgICAvKiBESUFMIERBVEEtQ09NUFJFU1NJT04sIGFuZCAqLworICAgICAgICBtZG1zcGQgPSBwLT5jYXBhcyAmIENLRF9TQiA/IDAgOiAxOyAvKiBESUFMIFNQRUVELU1BVENISU5HIGZyb20gaXQuICovCisgICAgICAgIGRpYWxmYyA9IEZMT19BVVRPOyAgICAgICAgICAgICAgICAgIC8qIE1vZGVtJ3MgbG9jYWwgZmxvdyBjb250cm9sLi4gKi8KKyAgICAgICAgZGlhbG1heCAgID0gcC0+bWF4X3NwZWVkOworICAgICAgICBkaWFsY2FwYXMgPSBwLT5jYXBhczsKKyAgICAgICAgZGlhbGVzYyAgID0gcC0+ZXNjX2NoYXI7CisgICAgfSBlbHNlIGlmIChtZG10eXAgPiAwKSB7CisgICAgICAgIHByaW50ZigiV0FSTklORzogbW9kZW0gaW5mbyBmb3IgXCIlc1wiIG5vdCBmaWxsZWQgaW4geWV0XG4iLAorICAgICAgICAgICAgICAgZ21kbXR5cCgpCisgICAgICAgICAgICAgICApOworICAgIH0KKworLyogUmVzZXQgb3Igc2V0IHRoZSBTRVQgRElBTCBTVFJJTkcgaXRlbXMgLi4uICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKyAgICAgICAgZGVidWcoRjExMCwiaW5pdG1kbSBkaWFsaW5pIixkaWFsaW5pLDApOworICAgICAgICBkZWJ1ZyhGMTEwLCJpbml0bWRtIGRpYWxtc3RyICIsZGlhbG1zdHIsMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImluaXRtZG0gZGlhbG1wcm10IixkaWFsbXBybXQsMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImluaXRtZG0gZGlhbGNtZCIsZGlhbGNtZCwwKTsKKyAgICAgICAgZGVidWcoRjExMCwiaW5pdG1kbSBkaWFsZGNvbiIsZGlhbGRjb24sMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImluaXRtZG0gZGlhbGRjb2ZmIixkaWFsZGNvZmYsMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImluaXRtZG0gZGlhbGVjb24iLGRpYWxlY29uLDApOworICAgICAgICBkZWJ1ZyhGMTEwLCJpbml0bWRtIGRpYWxlY29mZiIsZGlhbGVjb2ZmLDApOworICAgICAgICBkZWJ1ZyhGMTEwLCJpbml0bWRtIGRpYWxoY21kIixkaWFsaGNtZCwwKTsKKyAgICAgICAgZGVidWcoRjExMCwiaW5pdG1kbSBkaWFsaHdmYyIsZGlhbGh3ZmMsMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImluaXRtZG0gZGlhbHN3ZmMiLGRpYWxzd2ZjLDApOworICAgICAgICBkZWJ1ZyhGMTEwLCJpbml0bWRtIGRpYWxub2ZjIixkaWFsbm9mYywwKTsKKyAgICAgICAgZGVidWcoRjExMCwiaW5pdG1kbSBkaWFsdG9uZSIsZGlhbHRvbmUsMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImluaXRtZG0gZGlhbHB1bHNlIixkaWFscHVsc2UsMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImluaXRtZG0gZGlhbG5hbWUiLGRpYWxuYW1lLDApOworICAgICAgICBkZWJ1ZyhGMTEwLCJpbml0bWRtIGRpYWxhYW9uIixkaWFsYWFvbiwwKTsKKyAgICAgICAgZGVidWcoRjExMCwiaW5pdG1kbSBkaWFsYWFvZmYiLGRpYWxhYW9mZiwwKTsKKyAgICAgICAgZGVidWcoRjExMCwiaW5pdG1kbSBkaWFseDMiLGRpYWx4MywwKTsKKyAgICAgICAgZGVidWcoRjExMCwiaW5pdG1kbSBkaWFsc3BvbiIsZGlhbHNwb24sMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImluaXRtZG0gZGlhbHNwb2ZmIixkaWFsc3BvZmYsMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImluaXRtZG0gZGlhbHZvbDEiLGRpYWx2b2wxLDApOworICAgICAgICBkZWJ1ZyhGMTEwLCJpbml0bWRtIGRpYWx2b2wyIixkaWFsdm9sMiwwKTsKKyAgICAgICAgZGVidWcoRjExMCwiaW5pdG1kbSBkaWFsdm9sMyIsZGlhbHZvbDMsMCk7CisgICAgICAgIGRlYnVnKEYxMTAsImluaXRtZG0gZGlhbGluaTIiLGRpYWxpbmkyLDApOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgaWYgKHVzZXJtZG0gJiYgcCkgeyAvKiBVU0VSLURFRklORUQ6IGNvcHkgaW5mbyBmcm9tIHNwZWNpZmllZCB0ZW1wbGF0ZSAqLworCisgICAgICAgIG1ha2VzdHIoJmRpYWxpbmkgICxwLT53YWtlX3N0cik7CisgICAgICAgIG1ha2VzdHIoJmRpYWxtc3RyICxwLT5kbW9kZV9zdHIpOworICAgICAgICBtYWtlc3RyKCZkaWFsbXBybXQscC0+ZG1vZGVfcHJvbXB0KTsKKyAgICAgICAgbWFrZXN0cigmZGlhbGNtZCAgLHAtPmRpYWxfc3RyKTsKKyAgICAgICAgbWFrZXN0cigmZGlhbGRjb24gLHAtPmRjX29uX3N0cik7CisgICAgICAgIG1ha2VzdHIoJmRpYWxkY29mZixwLT5kY19vZmZfc3RyKTsKKyAgICAgICAgbWFrZXN0cigmZGlhbGVjb24gLHAtPmVjX29uX3N0cik7CisgICAgICAgIG1ha2VzdHIoJmRpYWxlY29mZixwLT5lY19vZmZfc3RyKTsKKyAgICAgICAgbWFrZXN0cigmZGlhbGhjbWQgLHAtPmh1cF9zdHIpOworICAgICAgICBtYWtlc3RyKCZkaWFsaHdmYyAscC0+aHdmY19zdHIpOworICAgICAgICBtYWtlc3RyKCZkaWFsc3dmYyAscC0+c3dmY19zdHIpOworICAgICAgICBtYWtlc3RyKCZkaWFsbm9mYyAscC0+bm9mY19zdHIpOworICAgICAgICBtYWtlc3RyKCZkaWFsdG9uZSAscC0+dG9uZSk7CisgICAgICAgIG1ha2VzdHIoJmRpYWxwdWxzZSxwLT5wdWxzZSk7CisgICAgICAgIG1ha2VzdHIoJmRpYWxuYW1lICwiVGhpcyBzcGFjZSBhdmFpbGFibGUgKHVzZSBTRVQgTU9ERU0gTkFNRSkiKTsKKyAgICAgICAgbWFrZXN0cigmZGlhbGFhb24gLHAtPmFhX29uX3N0cik7CisgICAgICAgIG1ha2VzdHIoJmRpYWxhYW9mZixwLT5hYV9vZmZfc3RyKTsKKyAgICAgICAgbWFrZXN0cigmZGlhbHgzICAgLHAtPmlnbm9yZWR0KTsKKyAgICAgICAgbWFrZXN0cigmZGlhbHNwb24gLHAtPnNwX29uX3N0cik7CisgICAgICAgIG1ha2VzdHIoJmRpYWxzcG9mZixwLT5zcF9vZmZfc3RyKTsKKyAgICAgICAgbWFrZXN0cigmZGlhbHZvbDEgLHAtPnZvbDFfc3RyKTsKKyAgICAgICAgbWFrZXN0cigmZGlhbHZvbDIgLHAtPnZvbDJfc3RyKTsKKyAgICAgICAgbWFrZXN0cigmZGlhbHZvbDMgLHAtPnZvbDNfc3RyKTsKKyAgICAgICAgbWFrZXN0cigmZGlhbGluaTIgLHAtPmluaTIpOworCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIE5vdCB1c2VyLWRlZmluZWQsIHNvIHdpcGUgb3V0IG92ZXJyaWRlcyAqLworCisgICAgICAgIGlmIChkaWFsaW5pKSAgIG1ha2VzdHIoJmRpYWxpbmksTlVMTCk7ICAgLyogSW5pdC1zdHJpbmcgKi8KKyAgICAgICAgaWYgKGRpYWxtc3RyKSAgbWFrZXN0cigmZGlhbG1zdHIsTlVMTCk7ICAvKiBEaWFsLW1vZGUtc3RyICovCisgICAgICAgIGlmIChkaWFsbXBybXQpIG1ha2VzdHIoJmRpYWxtcHJtdCxOVUxMKTsgLyogRGlhbC1tb2RlLXBybyAqLworICAgICAgICBpZiAoZGlhbGNtZCkgICBtYWtlc3RyKCZkaWFsY21kLE5VTEwpOyAgIC8qIERpYWwtY29tbWFuZCAgKi8KKyAgICAgICAgaWYgKGRpYWxkY29uKSAgbWFrZXN0cigmZGlhbGRjb24sTlVMTCk7ICAvKiBEQyBPTiBjb21tYW5kICovCisgICAgICAgIGlmIChkaWFsZGNvZmYpIG1ha2VzdHIoJmRpYWxkY29mZixOVUxMKTsgLyogREMgT0ZGIGNvbW1hbmQgKi8KKyAgICAgICAgaWYgKGRpYWxlY29uKSAgbWFrZXN0cigmZGlhbGVjb24sTlVMTCk7ICAvKiBFQyBPTiBjb21tYW5kICovCisgICAgICAgIGlmIChkaWFsZWNvZmYpIG1ha2VzdHIoJmRpYWxlY29mZixOVUxMKTsgLyogRUMgT0ZGIGNvbW1hbmQgKi8KKyAgICAgICAgaWYgKGRpYWxoY21kKSAgbWFrZXN0cigmZGlhbGhjbWQsTlVMTCk7ICAvKiBIYW5ndXAgY29tbWFuZCAqLworICAgICAgICBpZiAoZGlhbGh3ZmMpICBtYWtlc3RyKCZkaWFsaHdmYyxOVUxMKTsgIC8qIEZsb3cgY29udHJvbC4uLiAqLworICAgICAgICBpZiAoZGlhbHN3ZmMpICBtYWtlc3RyKCZkaWFsc3dmYyxOVUxMKTsgIC8qICAqLworICAgICAgICBpZiAoZGlhbG5vZmMpICBtYWtlc3RyKCZkaWFsbm9mYyxOVUxMKTsgIC8qICAqLworICAgICAgICBpZiAoZGlhbHRvbmUpICBtYWtlc3RyKCZkaWFsdG9uZSxOVUxMKTsgIC8qIERpYWxpbmcgbWV0aG9kICovCisgICAgICAgIGlmIChkaWFscHVsc2UpIG1ha2VzdHIoJmRpYWxwdWxzZSxOVUxMKTsgLyogICovCisgICAgICAgIGlmIChkaWFsbmFtZSkgIG1ha2VzdHIoJmRpYWxuYW1lLE5VTEwpOyAgLyogTW9kZW0gbmFtZSAqLworICAgICAgICBpZiAoZGlhbGFhb24pICBtYWtlc3RyKCZkaWFsYWFvbixOVUxMKTsgIC8qIEF1dG9hbnN3ZXIgT24gKi8KKyAgICAgICAgaWYgKGRpYWxhYW9mZikgbWFrZXN0cigmZGlhbGFhb2ZmLE5VTEwpOyAvKiBBdXRvYW5zd2VyIE9mZiAqLworICAgICAgICBpZiAoZGlhbHgzKSAgICBtYWtlc3RyKCZkaWFseDMsTlVMTCk7ICAgIC8qIElnbm9yZSBkaWFsdG9uZSAqLworICAgICAgICBpZiAoZGlhbHNwb24pICBtYWtlc3RyKCZkaWFsc3BvbixOVUxMKTsgIC8qIFNwZWFrZXIgT24gKi8KKyAgICAgICAgaWYgKGRpYWxzcG9mZikgbWFrZXN0cigmZGlhbHNwb2ZmLE5VTEwpOyAvKiBTcGVha2VyIE9mZiAqLworICAgICAgICBpZiAoZGlhbHZvbDEpICBtYWtlc3RyKCZkaWFsdm9sMSxOVUxMKTsgIC8qIExvdyB2b2x1bWUgKi8KKyAgICAgICAgaWYgKGRpYWx2b2wyKSAgbWFrZXN0cigmZGlhbHZvbDIsTlVMTCk7ICAvKiBNZWRpdW0gdm9sdW1lICovCisgICAgICAgIGlmIChkaWFsdm9sMykgIG1ha2VzdHIoJmRpYWx2b2wzLE5VTEwpOyAgLyogSGlnaCB2b2x1bWUgKi8KKyAgICAgICAgaWYgKGRpYWxpbmkyKSAgbWFrZXN0cigmZGlhbGluaTIsTlVMTCk7ICAvKiBJbml0IHN0cmluZyAyICovCisgICAgfQorICAgIGlmIChhdXRvZmxvdykgICAgICAgICAgICAgICAgICAgICAgIC8qIE1heWJlIGNoYW5nZSBmbG93IGNvbnRyb2wgKi8KKyAgICAgIHNldGZsb3coKTsKKworI2lmbmRlZiBNSU5JRElBTAorI2lmZGVmIE9MRFRCQ09ERQorICAgIHRibW9kZWwgPSAwOyAgICAgICAgICAgLyogSWYgaXQncyBhIFRlbGViaXQsIHdlIGRvbid0IGtub3cgdGhlIG1vZGVsIHlldCAqLworI2VuZGlmIC8qIE9MRFRCQ09ERSAqLworI2VuZGlmIC8qIE1JTklESUFMICovCit9CisKKyNpZmRlZiBDT01NRU5UCisvKiBOb3QgaW1wbGVtZW50ZWQgeWV0ICovCitpbnQKK3NldGFuc3dlcigpIHsKKyAgICBpbnQgeCwgeTsKKyAgICBleHRlcm4gaW50IGFuc19jaWQsIGFuc19yaW5nOworICAgIGlmICgoeCA9IGNta2V5KGFuc3dlcnRhYixuYW5zd2VydGFiLCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworICAgIHN3aXRjaCAoeCkgeworICAgICAgY2FzZSBYWUFfQ0lEOgorICAgICAgICByZXR1cm4oc2V0b24oJmFuc19jaWQpKTsKKyAgICAgIGNhc2UgWFlBX1JORzoKKyAgICAgICAgeSA9IGNtbnVtKCJIb3cgbWFueSByaW5ncyBiZWZvcmUgYW5zd2VyaW5nIiwiMSIsMTAsJngseHhzdHJpbmcpOworICAgICAgICB5ID0gc2V0bnVtKCZhbnNfcmluZ3MseCx5LDI1NCk7CisgICAgICAgIHJldHVybih5KTsKKyAgICB9Cit9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCitpbnQKK3NldG1vZGVtKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgTU9ERU0gKi8KKworICAgIGludCB4LCB5LCB6OworICAgIGxvbmcgeno7CisgICAgc3RydWN0IEZEQiBrMSwgazI7CisgICAgZXh0ZXJuIGludCBtZG1zZXQ7CisKKyAgICBjbWZkYmkoJmsxLF9DTUtFWSwKKyAgICAgICAgICAgIk1vZGVtIHBhcmFtZXRlciIsIiIsIiIsbnNldG1kbSwgMCwgeHhzdHJpbmcsIHNldG1kbSwgJmsyKTsKKyAgICBjbWZkYmkoJmsyLF9DTUtFWSwiIiwiIiwiIixubWRtLDAseHhzdHJpbmcsbWRtdGFiLE5VTEwpOworICAgIHggPSBjbWZkYigmazEpOworICAgIGlmICh4IDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgIGlmICh4ID09IC0yIHx8IHggPT0gLTkpCisgICAgICAgICAgcHJpbnRmKCI/Tm8ga2V5d29yZHMgbWF0Y2g6IFwiJXNcIlxuIixhdG1idWYpOworICAgICAgICByZXR1cm4oeCk7CisgICAgfQorICAgIHkgPSBjbXJlc3VsdC5ucmVzdWx0OyAgICAgICAgICAgICAgIC8qIEtleXdvcmQgdmFsdWUgKi8KKyAgICBpZiAoY21yZXN1bHQuZmRiYWRkciA9PSAmazIpIHsgICAgICAvKiBNb2RlbS10eXBlIGtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgdXNlcm1kbSA9IDA7CisgICAgICAgIGluaXRtZG0oY21yZXN1bHQubnJlc3VsdCk7ICAgICAgLyogU2V0IHRoZSBtb2RlbSB0eXBlLiAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOyAgICAgICAgICAgIC8qIERvbmUgKi8KKyAgICB9CisgICAgc3dpdGNoIChjbXJlc3VsdC5ucmVzdWx0KSB7ICAgICAgICAgLyogU0VUIE1PREVNIGtleXdvcmQgdGFibGUuICovCisjaWZkZWYgTURNSFVQCisgICAgICBjYXNlIFhZRE1IVTogICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBNT0RFTS1IQU5HVVAgKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkobWRtaGFuZyw0LCJob3cgdG8gaGFuZyB1cCBtb2RlbSIsCisgICAgICAgICAgICAgICAgICAgICAgICJtb2RlbS1jb21tYW5kIiwgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBkaWFsbWh1ID0geTsKKyNpZmRlZiBDT01NRU5UCisvKiBOb3BlLCBJIGZpeGVkIGl0ICgyMDAxIDExIDA4KSAqLworI2lmZGVmIENLX1NDT1Y1CisgICAgICAgIGlmIChkaWFsbWh1ID09IDAgJiYgIXF1aWV0KSB7CisgICAgICAgICAgICBwcmludGYoCisiXG4gV0FSTklORzogUlMtMjMyIHNpZ25hbCBzYW1wbGluZyBhbmQgbWFuaXB1bGF0aW9uIGRvIG5vdCB3b3JrXG4iCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBwcmludGYoCisiIGluIHRoZSBzdGFuZGFyZCBTQ08gT1NSNSBzZXJpYWwgaS9vIGRyaXZlcnMuICBTRVQgTU9ERU0gSEFOR1VQLU1FVEhPRFxuIgorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBwcmludGYoCisiIE1PREVNLUNPTU1BTkQgaXMgcmVjb21tZW5kZWQgZm9yIE9TUjUuXG5cbiIKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX1NDT1Y1ICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworI2VuZGlmIC8qIE1ETUhVUCAqLworCisgICAgICBjYXNlIFhZRENBUDoKKyAgICAgICAgenogPSAwTDsKKyAgICAgICAgeSA9IDA7CisgICAgICAgIHdoaWxlICh5ICE9IC0zKSB7CisgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShtZG1jYXAsbm1kbWNhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IG9mIG1vZGVtIiwgIiIsIHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHkgPT0gLTMpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6eiB8PSB5OworICAgICAgICB9CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGRpYWxjYXBhcyA9IHp6OworICAgICAgICBkZWJ1ZyhGMTAxLCJzZXRtb2RlbSBhdXRvZmxvdyIsIiIsYXV0b2Zsb3cpOworICAgICAgICBkZWJ1ZyhGMTAxLCJzZXRtb2RlbSBmbG93IDEiLCIiLGZsb3cpOworICAgICAgICBpZiAoYXV0b2Zsb3cpICAgICAgICAgICAgICAgICAgIC8qIE1heWJlIGNoYW5nZSBmbG93IGNvbnRyb2wgKi8KKyAgICAgICAgICBzZXRmbG93KCk7CisgICAgICAgIGRlYnVnKEYxMDEsInNldG1vZGVtIGZsb3cgMiIsIiIsZmxvdyk7CisgICAgICAgIG1kbXNwZCA9IHp6ICYgQ0tEX1NCID8gMCA6IDE7ICAgLyogU2V0IE1PREVNIFNQRUVELU1BVENISU5HIGZyb20gaXQuICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgWFlETUFYOgorI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgaWYgKG5ldHdvcmsgJiYgaXN0bmNvbXBvcnQoKSkKKyAgICAgICAgICB4ID0gY21rZXkodG5zcGR0YWIsbnRuc3BkLGxpbmUsIiIseHhzdHJpbmcpOworICAgICAgICBlbHNlCisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworICAgICAgICAgIHggPSBjbWtleShzcGR0YWIsbnNwZCxsaW5lLCIiLHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICBpZiAoeCA9PSAtMykgcHJpbnRmKCI/dmFsdWUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBkaWFsbWF4ID0gKGxvbmcpIHggKiAxMEw7CisgICAgICAgIGlmIChkaWFsbWF4ID09IDcwKSBkaWFsbWF4ID0gNzU7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgWFlEU1RSOiAgICAgICAgICAgICAgICAgICAgICAvKiBUaGVzZSBtb3ZlZCBmcm9tIFNFVCBESUFMICovCisgICAgICBjYXNlIFhZRERDOgorICAgICAgY2FzZSBYWURFQzoKKyAgICAgIGNhc2UgWFlERVNDOgorICAgICAgY2FzZSBYWURGQzoKKyAgICAgIGNhc2UgWFlES1NQOgorICAgICAgY2FzZSBYWURTUEQ6CisgICAgICBjYXNlIFhZRERJQToKKyAgICAgICAgcmV0dXJuKHNldGRpYWwoeCkpOworCisgICAgICBjYXNlIFhZRFRZUDoKKyAgICAgICAgaWYgKCh5ID0gY21rZXkobWRtdGFiLG5tZG0sIm1vZGVtIHR5cGUiLCJub25lIiwgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoeSA9PSBkaWFsdWR0KSB7ICAgICAgICAgICAgIC8qIFVzZXItZGVmaW5lZCBtb2RlbSB0eXBlICovCisgICAgICAgICAgICBpZiAoKHggPSBjbWtleShtZG10YWIsbm1kbSwiYmFzZWQgb24gZXhpc3RpbmcgbW9kZW0gdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIsIHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgdXNlcm1kbSA9IDA7CisgICAgICAgIHVzZXJtZG0gPSAoeSA9PSBkaWFsdWR0KSA/IHggOiAwOworICAgICAgICBpbml0bWRtKHkpOworICAgICAgICBtZG1zZXQgPSAobWRtdHlwID4gMCk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgWFlETkFNOgorICAgICAgICByZXR1cm4oZGlhbHN0cigmZGlhbG5hbWUsIkRlc2NyaXB0aXZlIG5hbWUgZm9yIG1vZGVtIikpOworCisgICAgICBjYXNlIFhZRE1DRDogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIE1PREVNIENBUlJJRVItV0FUQ0ggKi8KKyAgICAgICAgcmV0dXJuKHNldGRjZCgpKTsKKworICAgICAgY2FzZSBYWURTUEs6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBNT0RFTSBTUEVBS0VSICovCisgICAgICAgIHJldHVybihzZXRvbigmbWRtc3BrKSk7CisKKyAgICAgIGNhc2UgWFlEVk9MOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgTU9ERU0gVk9MVU1FICovCisgICAgICAgIGlmICgoeCA9IGNta2V5KHZvbHRhYiwzLCIiLCJtZWRpdW0iLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgbWRtdm9sID0geDsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJVbmV4cGVjdGVkIFNFVCBNT0RFTSBwYXJhbWV0ZXJcbiIpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KK30KKworc3RhdGljIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBESUFMIGNvbW1hbmQgb3B0aW9ucyAqLworc2V0ZGlhbCh5KSBpbnQgeTsgeworICAgIGludCB4ID0gMCwgeiA9IDA7CisgICAgY2hhciAqcyA9IE5VTEw7CisKKyAgICBpZiAoeSA8IDApCisgICAgICBpZiAoKHkgPSBjbWtleShkaWFsdGFiLG5kaWFsLCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICByZXR1cm4oeSk7CisgICAgc3dpdGNoICh5KSB7CisgICAgICBjYXNlIFhZREhVUDogICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBIQU5HVVAgKi8KKyAgICAgICAgcmV0dXJuKHNldG9uKCZkaWFsaG5nKSk7CisgICAgICBjYXNlIFhZRElOSTogICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBJTklULVNUUklORyAqLworICAgICAgICByZXR1cm4oZGlhbHN0cigmZGlhbGluaSwiTW9kZW0gaW5pdGlhbGl6YXRpb24gc3RyaW5nIikpOworICAgICAgY2FzZSBYWUROUFI6ICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgUFJFRklYICovCisgICAgICAgIHJldHVybihkaWFsc3RyKCZkaWFsbnByLCJUZWxlcGhvbmUgbnVtYmVyIHByZWZpeCIpKTsKKyAgICAgIGNhc2UgWFlERElBOiAgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIERJQUwtQ09NTUFORCAqLworICAgICAgICB4ID0gY210eHQoIkRpYWxpbmcgY29tbWFuZCBmb3IgbW9kZW0sXG5cCisgaW5jbHVkZSBcIiVzXCIgdG8gc3RhbmQgZm9yIHBob25lIG51bWJlcixcblwKKyBmb3IgZXhhbXBsZSwgXCJzZXQgZGlhbCBkaWFsLWNvbW1hbmQgQVREVCVzXFwxM1wiIiwKKyAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgJnMsCisgICAgICAgICAgICAgICAgICB4eHN0cmluZyk7CisgICAgICAgIGlmICh4IDwgMCAmJiB4ICE9IC0zKSAgICAgICAgICAgLyogSGFuZGxlIHBhcnNlIGVycm9ycyAqLworICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgcyA9IGJyc3RyaXAocyk7ICAgICAgICAgICAgICAgICAvKiBTdHJpcCBicmFjZXMgb3IgcXVvdGVzICovCisgICAgICAgIHkgPSB4ID0gc3RybGVuKHMpOyAgICAgICAgICAgICAgLyogR2V0IGxlbmd0aCBvZiB0ZXh0ICovCisgICAgICAgIGlmICh5ID4gMCkgeyAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlcmUgaXMgYW55IHRleHQgKGxlZnQpLCAqLworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHk7IHgrKykgeyAgIC8qIG1ha2Ugc3VyZSB0aGV5IGluY2x1ZGVkICIlcyIgKi8KKyAgICAgICAgICAgICAgICBpZiAoc1t4XSAhPSAnJScpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChzW3grMV0gPT0gJ3MnKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh4ID09IHkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoCisiP0RpYWwtY29tbWFuZCBtdXN0IGNvbnRhaW4gXCIlY3NcIiBmb3IgcGhvbmUgbnVtYmVyLlxuIiwnJScpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpYWxjbWQpIHsgICAgICAgICAgICAgICAgICAvKiBGcmVlIGFueSBwcmV2aW91cyBzdHJpbmcuICovCisgICAgICAgICAgICBmcmVlKGRpYWxjbWQpOworICAgICAgICAgICAgZGlhbGNtZCA9IChjaGFyICopIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHkgPiAwKSB7CisgICAgICAgICAgICBkaWFsY21kID0gbWFsbG9jKHkgKyAxKTsgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGl0ICovCisgICAgICAgICAgICBpZiAoZGlhbGNtZCkKKyAgICAgICAgICAgICAgc3RyY3B5KGRpYWxjbWQscyk7ICAgICAgICAvKiBhbmQgbWFrZSBhIHNhZmUgY29weS4gKi8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgWFlES1NQOiAgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIEtFUk1JVC1TUE9PRiAqLworICAgICAgICByZXR1cm4oc2V0b24oJmRpYWxrc3ApKTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICAgIGNhc2UgWFlEVE1POiAgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIFRJTUVPVVQgKi8KKyAgICAgICAgeSA9IGNtbnVtKCJTZWNvbmRzIHRvIHdhaXQgZm9yIGNhbGwgY29tcGxldGlvbiIsIjAiLDEwLCZ4LHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKHkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHkgPSBjbW51bSgiS2VybWl0L21vZGVtIHRpbWVvdXQgZGlmZmVyZW50aWFsIiwiMTAiLDEwLCZ6LHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKHkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGRpYWx0bW8gPSB4OworICAgICAgICBtZG13YWl0ZCA9IHo7CisgICAgICBjYXNlIFhZREVTQzogICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBFU0NBUEUtQ0hBUkFDVEVSICovCisgICAgICAgIHkgPSBjbW51bSgiQVNDSUkgdmFsdWUgb2YgY2hhcmFjdGVyIHRvIGVzY2FwZSBiYWNrIHRvIG1vZGVtIiwKKyAgICAgICAgICAgICAgICAgICI0MyIsMTAsJngseHhzdHJpbmcpOworICAgICAgICB5ID0gc2V0bnVtKCZkaWFsZXNjLHgseSwxMjgpOworICAgICAgICBpZiAoeSA+IC0xICYmIGRpYWxlc2MgPCAwKSAgICAgIC8qIE5vIGVzY2FwZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICBkaWFsbWh1ID0gMDsgICAgICAgICAgICAgICAgICAvKiBTbyBubyBoYW5ndXAgYnkgbW9kZW0gY29tbWFuZCAqLworICAgICAgICByZXR1cm4oeSk7CisgICAgICBjYXNlIFhZRERQWTogICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBESVNQTEFZICovCisgICAgICAgIHJldHVybihzZXRvbigmZGlhbGRweSkpOworICAgICAgY2FzZSBYWURTUEQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgU1BFRUQtTUFUQ0hJTkcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VkIHRvIGJlIHNwZWVkLWNoYW5naW5nICovCisgICAgICAgIGlmICgoeSA9IHNldG9uKCZtZG1zcGQpKSA8IDApIHJldHVybih5KTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIG1kbXNwZCA9IDEgLSBtZG1zcGQ7ICAgICAgICAgICAgLyogc28gaGVyZSB3ZSByZXZlcnNlIHRoZSBtZWFuaW5nICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgY2FzZSBYWURNTlA6ICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgTU5QLUVOQUJMRSAqLworICAgICAgY2FzZSBYWURFQzogICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgRVJST1ItQ09SUkVDVElPTiAqLworICAgICAgICB4ID0gc2V0b24oJmRpYWxlYyk7CisgICAgICAgIGlmICh4ID4gMCkKKyAgICAgICAgICBpZiAoIWRpYWxlYykgZGlhbGRjID0gMDsgICAgICAvKiBPRkYgYWxzbyB0dXJucyBvZmYgY29tcHJlc3Npb24gKi8KKyAgICAgICAgcmV0dXJuKHgpOworCisgICAgICBjYXNlIFhZRERDOiAgICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBDT01QUkVTU0lPTiAqLworICAgICAgICB4ID0gc2V0b24oJmRpYWxkYyk7CisgICAgICAgIGlmICh4ID4gMCkKKyAgICAgICAgICBpZiAoZGlhbGRjKSBkaWFsZWMgPSAxOyAgICAgICAvKiBPTiBhbHNvIHR1cm5zIG9uIGVycm9yIGNvcnJlY3Rpb24gKi8KKyAgICAgICAgcmV0dXJuKHgpOworCisjaWZkZWYgTURNSFVQCisgICAgICBjYXNlIFhZRE1IVTogICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBNT0RFTS1IQU5HVVAgKi8KKyAgICAgICAgcmV0dXJuKHNldG9uKCZkaWFsbWh1KSk7CisjZW5kaWYgLyogTURNSFVQICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICAgIGNhc2UgWFlERElSOiAgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIERJUkVDVE9SWSAoemVybyBvciBtb3JlKSAqLworICAgICAgICByZXR1cm4ocGFyc2RpcigwKSk7ICAgICAgICAgICAgIC8qIDAgbWVhbnMgRElBTCAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICAgIGNhc2UgWFlEU1RSOiAgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIFNUUklORyAqLworICAgICAgICBpZiAoKHkgPSBjbWtleShtZG1jbWQsbm1kbWNtZCwiIiwiIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBzd2l0Y2ggKHkpIHsKKyAgICAgICAgICBjYXNlIFhZRFNfQU46ICAgICAgICAgICAgICAgICAvKiBBdXRvYW5zd2VyIE9OL09GRiAqLworICAgICAgICAgIGNhc2UgWFlEU19EQzogICAgICAgICAgICAgICAgIC8qIERhdGEgY29tcHJlc3Npb24gT04vT0ZGICovCisgICAgICAgICAgY2FzZSBYWURTX0VDOiAgICAgICAgICAgICAgICAgLyogRXJyb3IgY29ycmVjdGlvbiBPTi9PRkYgKi8KKyAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgc3ByaW50Zih0bXBidWYsIk1vZGVtJ3MgY29tbWFuZCB0byAlc2FibGUgJXMiLCAvKiBTQUZFICovCisgICAgICAgICAgICAgICAgICAgIHggPyAiZW4iIDogImRpcyIsCisgICAgICAgICAgICAgICAgICAgICh5ID09IFhZRFNfREMpID8gImNvbXByZXNzaW9uIiA6CisgICAgICAgICAgICAgICAgICAgICgoeSA9PSBYWURTX0VDKSA/ICJlcnJvci1jb3JyZWN0aW9uIiA6CisgICAgICAgICAgICAgICAgICAgICJhdXRvYW5zd2VyIikKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmICh4KSB7CisgICAgICAgICAgICAgICAgaWYgKHkgPT0gWFlEU19EQykKKyAgICAgICAgICAgICAgICAgIHJldHVybihkaWFsc3RyKCZkaWFsZGNvbix0bXBidWYpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICh5ID09IFhZRFNfRUMpCisgICAgICAgICAgICAgICAgICByZXR1cm4oZGlhbHN0cigmZGlhbGVjb24sdG1wYnVmKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWxhYW9uLHRtcGJ1ZikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoeSA9PSBYWURTX0RDKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWxkY29mZix0bXBidWYpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICh5ID09IFhZRFNfRUMpCisgICAgICAgICAgICAgICAgICByZXR1cm4oZGlhbHN0cigmZGlhbGVjb2ZmLHRtcGJ1ZikpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHJldHVybihkaWFsc3RyKCZkaWFsYWFvZmYsdG1wYnVmKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBYWURTX0hVOiAgICAgICAgICAgICAgICAgLyogICAgaGFuZ3VwIGNvbW1hbmQgKi8KKyAgICAgICAgICAgIHJldHVybihkaWFsc3RyKCZkaWFsaGNtZCwiTW9kZW0ncyBoYW5ndXAgY29tbWFuZCIpKTsKKyAgICAgICAgICBjYXNlIFhZRFNfSFc6ICAgICAgICAgICAgICAgICAvKiAgICBod2ZjICovCisgICAgICAgICAgICByZXR1cm4oZGlhbHN0cigmZGlhbGh3ZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9kZW0ncyBjb21tYW5kIHRvIGVuYWJsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wiKSk7CisgICAgICAgICAgY2FzZSBYWURTX0lOOiAgICAgICAgICAgICAgICAgLyogICAgaW5pdCAqLworICAgICAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWxpbmksIk1vZGVtJ3MgaW5pdGlhbGl6YXRpb24gc3RyaW5nIikpOworICAgICAgICAgIGNhc2UgWFlEU19ORjogICAgICAgICAgICAgICAgIC8qICAgIG5vIGZsb3cgY29udHJvbCAqLworICAgICAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWxub2ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vZGVtJ3MgY29tbWFuZCB0byBkaXNhYmxlIGxvY2FsIGZsb3cgY29udHJvbCIpKTsKKyAgICAgICAgICBjYXNlIFhZRFNfUFg6ICAgICAgICAgICAgICAgICAvKiAgICBwcmVmaXggKi8KKyAgICAgICAgICAgIHJldHVybihkaWFsc3RyKCZkaWFsbnByLCJUZWxlcGhvbmUgbnVtYmVyIHByZWZpeCBmb3IgZGlhbGluZyIpKTsKKyAgICAgICAgICBjYXNlIFhZRFNfU1c6ICAgICAgICAgICAgICAgICAvKiAgICBzd2ZjICovCisgICAgICAgICAgICByZXR1cm4oZGlhbHN0cigmZGlhbHN3ZmMsCisgICAgICAgICAgICAgICAgICAgIk1vZGVtJ3MgY29tbWFuZCB0byBlbmFibGUgbG9jYWwgc29mdHdhcmUgZmxvdyBjb250cm9sIikpOworICAgICAgICAgIGNhc2UgWFlEU19EVDogICAgICAgICAgICAgICAgIC8qICAgIHRvbmUgZGlhbGluZyAqLworICAgICAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWx0b25lLAorICAgICAgICAgICAgICAgICAgICJDb21tYW5kIHRvIGNvbmZpZ3VyZSBtb2RlbSBmb3IgdG9uZSBkaWFsaW5nIikpOworICAgICAgICAgIGNhc2UgWFlEU19EUDogICAgICAgICAgICAgICAgIC8qICAgIHB1bHNlIGRpYWxpbmcgKi8KKyAgICAgICAgICAgIHJldHVybihkaWFsc3RyKCZkaWFscHVsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tbWFuZCB0byBjb25maWd1cmUgbW9kZW0gZm9yIHB1bHNlIGRpYWxpbmciKSk7CisgICAgICAgICAgY2FzZSBYWURTX01TOiAgICAgICAgICAgICAgICAgLyogICAgZGlhbCBtb2RlIHN0cmluZyAqLworICAgICAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWxtc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJDb21tYW5kIHRvIGVudGVyIGRpYWwgbW9kZSIpKTsKKyAgICAgICAgICBjYXNlIFhZRFNfTVA6ICAgICAgICAgICAgICAgICAvKiAgICBkaWFsIG1vZGUgcHJvbXB0ICovCisgICAgICAgICAgICByZXR1cm4oZGlhbHN0cigmZGlhbG1wcm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vZGVtIHJlc3BvbnNlIHVwb24gZW50ZXJpbmcgZGlhbCBtb2RlIikpOworICAgICAgICAgIGNhc2UgWFlEU19TUDogICAgICAgICAgICAgICAgIC8qIFNQRUFLRVIgT0ZGICovCisgICAgICAgICAgICBpZiAoKHggPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgICAgIGlmICh4KQorICAgICAgICAgICAgICByZXR1cm4oZGlhbHN0cigmZGlhbHNwb24sIkNvbW1hbmQgdG8gdHVybiBtb2RlbSBzcGVha2VyIG9uIikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm4oZGlhbHN0cigmZGlhbHNwb2ZmLCJDb21tYW5kIHRvIHR1cm4gbW9kZW0gc3BlYWtlciBvZmYiKSk7CisKKyAgICAgICAgICBjYXNlIFhZRFNfVk86ICAgICAgICAgICAgICAgICAvKiBWT0xVTUUgTE9XICovCisgICAgICAgICAgICBpZiAoKHggPSBjbWtleSh2b2x0YWIsMywiIiwibWVkaXVtIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHJldHVybihkaWFsc3RyKCZkaWFsdm9sMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tbWFuZCBmb3IgbG93IG1vZGVtIHNwZWFrZXIgdm9sdW1lIikpOworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWx2b2wyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbW1hbmQgZm9yIG1lZGl1bSBtb2RlbSBzcGVha2VyIHZvbHVtZSIpKTsKKworICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWx2b2wzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21tYW5kIGZvciBoaWdoIG1vZGVtIHNwZWFrZXIgdm9sdW1lIikpOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjYXNlIFhZRFNfSUQ6ICAgICAgICAgICAgICAgICAvKiBJR05PUkUtRElBTFRPTkUgKi8KKyAgICAgICAgICAgIHJldHVybihkaWFsc3RyKCZkaWFseDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tbWFuZCB0byB0ZWxsIG1vZGVtIHRvIGlnbm9yZSBkaWFsdG9uZSIpKTsKKworICAgICAgICAgIGNhc2UgWFlEU19JMjogICAgICAgICAgICAgICAgIC8qIFBSRURJQUwtSU5JVCAqLworICAgICAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWxpbmkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbW1hbmQgdG8gc2VuZCB0byBtb2RlbSBqdXN0IHByaW9yIHRvIGRpYWxpbmciKSk7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCI/VW5leHBlY3RlZCBTRVQgRElBTCBTVFJJTkcgcGFyYW1ldGVyXG4iKTsKKyAgICAgICAgfQorCisgICAgICBjYXNlIFhZREZDOiAgICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBGTE9XLUNPTlRST0wgKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkoZGlhbF9mYyw0LCIiLCJhdXRvIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgZGlhbGZjID0geTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgY2FzZSBYWURNVEg6IHsgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgTUVUSE9EICovCisgICAgICAgIGV4dGVybiBpbnQgZGlhbG1hdXRvOworICAgICAgICBpZiAoKHkgPSBjbWtleShkaWFsX20sbmRpYWxfbSwiIiwiZGVmYXVsdCIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoeSA9PSBYWURNX0EpIHsgICAgICAgICAgICAgIC8qIEFVVE8gKi8KKyAgICAgICAgICAgIGRpYWxtYXV0byA9IDE7ICAgICAgICAgICAgICAvKiBsb2NhbCBjb3VudHJ5IGNvZGUsIGlmIGtub3duLiAqLworICAgICAgICAgICAgZGlhbG10aCA9IFhZRE1fRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkaWFsbWF1dG8gPSAwOyAgICAgICAgICAgICAgICAvKiB1c2UgdGhlIG1ldGhvZCBzcGVjaWZpZWQgKi8KKyAgICAgICAgICBkaWFsbXRoID0geTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorICAgICAgY2FzZSBYWURSVE06CisgICAgICAgIHkgPSBjbW51bSgiTnVtYmVyIG9mIHRpbWVzIHRvIHRyeSBkaWFsaW5nIGEgbnVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICIxIiwxMCwmeCx4eHN0cmluZyk7CisJeiA9IHNldG51bSgmZGlhbHJ0cix4LHksLTEpOworCWlmICh6ID4gLTEgJiYgZGlhbHJ0ciA8IDApIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIG5lZ2F0aXZlIGRpYWwgcmV0cmllcyBub3QgdmFsaWQ6ICVkXG4iLGRpYWxydHIpOworCSAgICByZXR1cm4oLTkpOworCX0KKyAgICAgICAgcmV0dXJuKHopOworCisgICAgICBjYXNlIFhZRElOVDoKKyAgICAgICAgeSA9IGNtbnVtKCJTZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiByZWRpYWwgYXR0ZW1wdHMiLAorICAgICAgICAgICAgICAgICAgIjMwIiwxMCwmeCx4eHN0cmluZyk7CisgICAgICAgIHogPSBzZXRudW0oJmRpYWxpbnQseCx5LC0xKTsKKwlpZiAoeiA+IC0xICYmIGRpYWxpbnQgPCAwKSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCBuZWdhdGl2ZSBkaWFsIGludGVydmFsIG5vdCB2YWxpZDogJWRcbiIsZGlhbGludCk7CisJICAgIHJldHVybigtOSk7CisJfQorICAgICAgICByZXR1cm4oeik7CisKKyAgICAgIGNhc2UgWFlETEFDOiAgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIEFSRUEtQ09ERSAqLworICAgICAgICBpZiAoKHggPSBkaWFsc3RyKCZkaWFsbGFjLCJBcmVhIGNvZGUgeW91IGFyZSBjYWxsaW5nIGZyb20iKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKGRpYWxsYWMpIHsKKyAgICAgICAgICAgIGlmICghcmRpZ2l0cyhkaWFsbGFjKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBhcmVhIGNvZGUgbXVzdCBiZSBudW1lcmljXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoKmRpYWxsYWMgPT0gJygnKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCIocGxlYXNlIG9taXQgdGhlIHBhcmVudGhlc2VzKVxuIik7CisgICAgICAgICAgICAgICAgaWYgKCpkaWFsbGFjID09ICcvJykKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiKG5vIHNsYXNoZXMsIHBsZWFzZSlcbiIpOworICAgICAgICAgICAgICAgIGlmIChkaWFsbGFjKSBmcmVlKGRpYWxsYWMpOworICAgICAgICAgICAgICAgIGRpYWxsYWMgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHgpOworCisgICAgICBjYXNlIFhZRENORjogICAgICAgICAgICAgICAgICAgICAgLyogQ09ORklSTUFUSU9OICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJmRpYWxjbmYpKTsKKworICAgICAgY2FzZSBYWURDVlQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIENPTlZFUlQtRElSRUNUT1JZICovCisgICAgICAgIGlmICgoeSA9IGNta2V5KGRjbnZ0YWIsMywiIiwiYXNrIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGRpYWxjdnQgPSB5OworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICBjYXNlIFhZRExDQzogICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBDT1VOVFJZLUNPREUgKi8KKyAgICAgICAgeCA9IGRpYWxzdHIoJmRpYWxsY2MsIkNvdW50cnkgY29kZSB5b3UgYXJlIGNhbGxpbmcgZnJvbSIpOworICAgICAgICBpZiAoeCA8IDEpIHJldHVybih4KTsKKyAgICAgICAgaWYgKGRpYWxsY2MpIHsKKyAgICAgICAgICAgIGlmICghcmRpZ2l0cyhkaWFsbGNjKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBjb3VudHJ5IGNvZGUgbXVzdCBiZSBudW1lcmljXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoKmRpYWxsY2MgPT0gJysnKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCIocGxlYXNlIG9taXQgdGhlIHBsdXMgc2lnbilcbiIpOworICAgICAgICAgICAgICAgIGlmIChkaWFsbGNjKSBmcmVlKGRpYWxsY2MpOworICAgICAgICAgICAgICAgIGRpYWxsY2MgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXN0cmNtcChkaWFsbGNjLCIxIikpIHsgLyogU2V0IGRlZmF1bHRzIGZvciBVU0EgYW5kIENhbmFkYSAqLworICAgICAgICAgICAgICAgIGlmICghZGlhbGxkcCkgICAgICAgICAgIC8qIExvbmctZGlzdGFuY2UgcHJlZml4ICovCisgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZkaWFsbGRwLCIxIik7CisgICAgICAgICAgICAgICAgaWYgKCFkaWFsaXhwKSAgICAgICAgICAgLyogSW50ZXJuYXRpb25hbCBkaWFsaW5nIHByZWZpeCAqLworICAgICAgICAgICAgICAgICAgbWFrZXN0cigmZGlhbGl4cCwiMDExIik7CisgICAgICAgICAgICAgICAgaWYgKG50b2xsZnJlZSA9PSAwKSB7ICAgLyogVG9sbC1mcmVlIGFyZWEgY29kZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKChkaWFsdGZjWzBdID0gbWFsbG9jKDQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGRpYWx0ZmNbMF0sIjgwMCIpOyAvKiAxOTcwLXNvbWV0aGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgbnRvbGxmcmVlKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRpYWx0ZmNbMV0gPSBtYWxsb2MoNCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGRpYWx0ZmNbMV0sIjg4OCIpOyAvKiAxOTk2ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvbGxmcmVlKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkaWFsdGZjWzJdID0gbWFsbG9jKDQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoZGlhbHRmY1syXSwiODc3Iik7IC8qIDUgQXByaWwgMTk5OCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9sbGZyZWUrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkaWFsdGZjWzNdID0gbWFsbG9jKDQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGRpYWx0ZmNbM10sIjg2NiIpOyAvKiAyMDAwPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvbGxmcmVlKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFkaWFsdGZwKSAgICAgICAgICAgLyogVG9sbC1mcmVlIGRpYWxpbmcgcHJlZml4ICovCisgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZkaWFsdGZwLCIxIik7CisjaWZkZWYgQ09NTUVOVAorLyogVGhlIHRpbWUgZm9yIHRoaXMgaXMgcGFzdCAqLworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGRpYWxsY2MsIjM1OCIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICgoaW50KSBzdHJjbXAoenpuZGF0ZSgpLCIxOTk2MTAxMSIpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgKSB7ICAgICAgICAgICAgICAvKiBGaW5sYW5kICovCisgICAgICAgICAgICAgICAgaWYgKCFkaWFsbGRwKSAgICAgICAgICAgLyogTG9uZy1kaXN0YW5jZSBwcmVmaXggKi8KKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmRpYWxsZHAsIjkiKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRpYWxpeHApICAgICAgICAgICAvKiBJbnRlcm5hdGlvbmFsIGRpYWxpbmcgcHJlZml4ICovCisgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZkaWFsaXhwLCI5OTAiKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRXZlcnl3aGVyZSBlbHNlIC4uLiAqLworICAgICAgICAgICAgICAgIGlmICghZGlhbGxkcCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGRpYWxsZHAgPSBtYWxsb2MoNCkpKQorICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShkaWFsbGRwLCIwIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZGlhbGl4cCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGRpYWxpeHAgPSBtYWxsb2MoNCkpKQorICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShkaWFsaXhwLCIwMCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc3RyY21wKGRpYWxsY2MsIjMzIikpICAvKiBGcmFuY2UgKi8KKyAgICAgICAgICAgICAgZGlhbGZsZCA9IDE7ICAgICAgICAgICAgICAvKiBMb25nLWRpc3RhbmNlIGRpYWxpbmcgaXMgZm9yY2VkICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgY2FzZSBYWURJWFA6ICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgSU5UTC1QUkVGSVggKi8KKyAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWxpeHAsIkludGVybmF0aW9uYWwgZGlhbGluZyBwcmVmaXgiKSk7CisKKyAgICAgIGNhc2UgWFlESVhTOiAgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIElOVEwtU1VGRklYICovCisgICAgICAgIHJldHVybihkaWFsc3RyKCZkaWFsaXhzLCJJbnRlcm5hdGlvbmFsIGRpYWxpbmcgc3VmZml4IikpOworCisgICAgICBjYXNlIFhZRExEUDogICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBMRC1QUkVGSVggKi8KKyAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWxsZHAsIkxvbmctZGlzdGFuY2UgZGlhbGluZyBwcmVmaXgiKSk7CisKKyAgICAgIGNhc2UgWFlETERTOiAgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIExELVNVRkZJWCAqLworICAgICAgICByZXR1cm4oZGlhbHN0cigmZGlhbGxkcywiTG9uZy1kaXN0YW5jZSBkaWFsaW5nIHN1ZmZpeCIpKTsKKworICAgICAgY2FzZSBYWURMQ1A6ICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgTEMtUFJFRklYICovCisgICAgICAgIHJldHVybihkaWFsc3RyKCZkaWFsbGNwLCJMb2NhbCBkaWFsaW5nIHByZWZpeCIpKTsKKworICAgICAgY2FzZSBYWURMQ1M6ICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgTEMtU1VGRklYICovCisgICAgICAgIHJldHVybihkaWFsc3RyKCZkaWFsbGNzLCJMb2NhbCBkaWFsaW5nIHN1ZmZpeCIpKTsKKworI2lmZGVmIENPTU1FTlQKKyAgICAgIGNhc2UgWFlEUFhYOiAgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIFBCWC1FWENIQU5HRSAqLworICAgICAgICByZXR1cm4oZGlhbHN0cigmZGlhbHB4eCwiRXhjaGFuZ2Ugb2YgUEJYIHlvdSBhcmUgY2FsbGluZyBmcm9tIikpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgICAgY2FzZSBYWURQWEk6IHsgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgUEJYLUlOVEVSTkFMLVBSRUZJWCAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICByZXR1cm4oZGlhbHN0cigmZGlhbHB4aSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsLWNhbGwgcHJlZml4IG9mIFBCWCB5b3UgYXJlIGNhbGxpbmcgZnJvbSIpKTsKKyNlbHNlCisgICAgICAgICAgaW50IHg7CisgICAgICAgICAgaWYgKCh4ID0gY210eHQoIkludGVybmFsLWNhbGwgcHJlZml4IG9mIFBCWCB5b3UgYXJlIGNhbGxpbmcgZnJvbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiIsJnMsTlVMTCkpIDwgMCkgLyogRG9uJ3QgZXZhbHVhdGUgKi8KKyAgICAgICAgICAgIHJldHVybih4KTsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICBpZiAoKnMpIHsKKyAgICAgICAgICAgICAgY2hhciBjLCAqIHAgPSB0bXBidWY7CisgICAgICAgICAgICAgIGlmICgqcyA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICBjID0gKihzKzEpOworICAgICAgICAgICAgICAgICAgaWYgKGlzdXBwZXIoYykpIGMgPSB0b2xvd2VyKGMpOworICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gJ2YnICYmCisgICAgICAgICAgICAgICAgICAgICAgY2tzdHJjbXAocywiXFx2KGQkcHgpIiw4LDApICYmCisgICAgICAgICAgICAgICAgICAgICAgY2tzdHJjbXAocywiXFx2KGQkcHh4KSIsOSwwKSAmJgorICAgICAgICAgICAgICAgICAgICAgIGNrc3RyY21wKHMsIlxcdihkJHApIiw3LDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgeCA9IFRNUEJVRlNJWjsKKyAgICAgICAgICAgICAgICAgICAgICB6enN0cmluZyhzLCZwLCZ4KTsKKyAgICAgICAgICAgICAgICAgICAgICBzID0gdG1wYnVmOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgbWFrZXN0cigmZGlhbHB4aSxzKTsKKyAgICAgICAgICByZXR1cm4oMSk7CisgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgICBjYXNlIFhZRFBYTzogICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBQQlgtT1VUU0lERS1QUkVGSVggKi8KKyAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWxweG8sCisgICAgICAgICAgICAgICAgICAgICAgICJPdXRzaWRlLWxpbmUgcHJlZml4IG9mIFBCWCB5b3UgYXJlIGNhbGxpbmcgZnJvbSIpKTsKKworICAgICAgY2FzZSBYWURTRlg6ICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgSU5UTC1TVUZGSVggKi8KKyAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWxzZngsIiBUZWxlcGhvbmUgbnVtYmVyIHN1ZmZpeCBmb3IgZGlhbGluZyIpKTsKKworICAgICAgY2FzZSBYWURTUlQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgU09SVCAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHNldG9uKCZkaWFsc3J0KSk7CisKKyAgICAgIGNhc2UgWFlEUFhYOiAgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIFBCWC1FWENIQU5HRSAqLworICAgICAgY2FzZSBYWURURkM6IHsgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgVE9MTC1GUkVFLUFSRUEtQ09ERSAgKi8KKyAgICAgICAgICBpbnQgbiwgaTsgICAgICAgICAgICAgICAgICAgICAvKiAoemVybyBvciBtb3JlIG9mIHRoZW0uLi4pICovCisgICAgICAgICAgY2hhciAqIHBbTUFYVE9MTEZSRUVdOyAgICAgICAgLyogVGVtcG9yYXJ5IHBvaW50ZXJzICovCisgICAgICAgICAgY2hhciAqIG07CisgICAgICAgICAgZm9yIChuID0gMDsgbiA8IE1BWFRPTExGUkVFOyBuKyspIHsKKyAgICAgICAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgbSA9ICh5ID09IFhZRFRGQykgPworICAgICAgICAgICAgICAgICAgIlRvbGwtZnJlZSBhcmVhIGNvZGUocykgaW4gdGhlIGNvdW50cnkgeW91IGFyZSBjYWxsaW5nIGZyb20iCisgICAgICAgICAgICAgICAgICAgIDogIkV4Y2hhbmdlKHMpIG9mIFBCWCB5b3UgYXJlIGNhbGxpbmcgZnJvbSI7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBtID0gKHkgPT0gWFlEVEZDKSA/CisgICAgICAgICAgICAgICAgICAgICJBbm90aGVyIHRvbGwtZnJlZSBhcmVhIGNvZGUiCisgICAgICAgICAgICAgICAgICAgICAgOiAiQW5vdGhlciBQQlggZXhjaGFuZ2UiOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKG0sIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGlmIChzKSB7CisgICAgICAgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgICAgICAgIGsgPSAoaW50KSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgICBpZiAoayA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBbbl0gPSBtYWxsb2MoayArIDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShwW25dLCBzKTsgLyogc2FmZSAqLworICAgICAgICAgICAgICAgICAgfSBlbHNlIGJyZWFrOworICAgICAgICAgICAgICB9IGVsc2UgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh4ID09IC0zKSB7ICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgd2FzIHN1Y2Nlc3NmdWwgKi8KKyAgICAgICAgICAgICAgaW50IG07CisgICAgICAgICAgICAgIG0gPSAoeSA9PSBYWURURkMpID8gbnRvbGxmcmVlIDogbmRpYWxweHg7CisgICAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgIHggPSAxOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7IC8qIFJlbW92ZSBvbGQgbGlzdCwgaWYgYW55ICovCisgICAgICAgICAgICAgICAgICBpZiAgKHkgPT0gWFlEVEZDKQorICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCYoZGlhbHRmY1tpXSksTlVMTCk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJihkaWFscHh4W2ldKSxOVUxMKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAgKHkgPT0gWFlEVEZDKQorICAgICAgICAgICAgICAgIG50b2xsZnJlZSA9IG47ICAgICAgICAgIC8qIE5ldyBjb3VudCAqLworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmRpYWxweHggPSBuOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7IC8qIE5ldyBsaXN0ICovCisgICAgICAgICAgICAgICAgICBpZiAgKHkgPT0gWFlEVEZDKQorICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCYoZGlhbHRmY1tpXSkscFtpXSk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJihkaWFscHh4W2ldKSxwW2ldKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB4ID0gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIGlmIChwW2ldKSBmcmVlKHBbaV0pOworICAgICAgICAgIHJldHVybih4KTsKKyAgICAgIH0KKworICAgICAgY2FzZSBYWURURlA6ICAgICAgICAgICAgICAgICAgICAgIC8qIFRPTEwtRlJFRS1QUkVGSVggKi8KKyAgICAgICAgcmV0dXJuKGRpYWxzdHIoJmRpYWx0ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICIgTG9uZy1kaXN0YW5jZSBwcmVmaXggZm9yIHRvbGwtZnJlZSBkaWFsaW5nIikpOworCisgICAgICBjYXNlIFhZRENPTjogICAgICAgICAgICAgICAgICAgICAgLyogQ09OTkVDVCAqLworICAgICAgICB6ID0gLTE7CisgICAgICAgIGlmICgoeSA9IGNta2V5KGNycnRhYixuY3JyLCIiLCJhdXRvIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAoeSAhPSBDQVJfT0ZGKSAgICAgICAgICAgICAgIC8qIEFVVE8gb3IgT04/ICovCisgICAgICAgICAgaWYgKCh6ID0gY21rZXkocXZ0YWIsbnF2dCwiIiwidmVyYm9zZSIseHhzdHJpbmcpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmICh6ID4gLTEpCisgICAgICAgICAgZGlhbGNxID0gejsKKyAgICAgICAgZGlhbGNvbiA9IHk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgWFlEUlNUUjogICAgICAgICAgICAgICAgICAgICAvKiBSRVNUUklDVCAqLworICAgICAgICBpZiAoKHkgPSBjbWtleShkcnN0cnRhYiw0LCIiLCJub25lIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgZGlhbHJzdHIgPSB5OworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICBjYXNlIFhZRExMQUM6IHsgICAgICAgICAgICAgICAgICAgLyogTG9jYWwgYXJlYS1jb2RlIGxpc3QgICovCisgICAgICAgICAgaW50IG4sIGk7ICAgICAgICAgICAgICAgICAgICAgLyogKHplcm8gb3IgbW9yZSBvZiB0aGVtLi4uKSAqLworICAgICAgICAgIGNoYXIgKiBwW01BWExPQ0FMQUNdOyAvKiBUZW1wb3JhcnkgcG9pbnRlcnMgKi8KKyAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTUFYTE9DQUxBQzsgbisrKSB7CisgICAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKAorICAgICAgICAgICAgICAgICAgICAiQXJlYSBjb2RlIHRvIHdoaWNoIGNhbGxzIGZyb20geW91ciBhcmVhIGFyZSBsb2NhbCIsCisgICAgICAgICAgICAgICAgICAgICAgICIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBpZiAocykgeworICAgICAgICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICAgICAgICBrID0gKGludCkgc3RybGVuKHMpOworICAgICAgICAgICAgICAgICAgaWYgKGsgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKChwW25dID0gbWFsbG9jKGsgKyAxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkocFtuXSwgcyk7IC8qIHNhZmUgKi8KKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKyAgICAgICAgICAgICAgfSBlbHNlIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoeCA9PSAtMykgeyAgICAgICAgICAgICAgICAvKiBDb21tYW5kIHdhcyBzdWNjZXNzZnVsICovCisgICAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBubG9jYWxhYzsgaSsrKSAvKiBSZW1vdmUgb2xkIGxpc3QsIGlmIGFueSAqLworICAgICAgICAgICAgICAgIGlmIChkaWFsbGNhY1tpXSkgeworICAgICAgICAgICAgICAgICAgICBmcmVlKGRpYWxsY2FjW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgZGlhbGxjYWNbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbmxvY2FsYWMgPSBuOyAgICAgICAgICAgICAvKiBOZXcgY291bnQgKi8KKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5sb2NhbGFjOyBpKyspIC8qIE5ldyBsaXN0ICovCisgICAgICAgICAgICAgICAgZGlhbGxjYWNbaV0gPSBwW2ldOworICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIGVycm9yLCB1bmRvIGV2ZXJ5dGhpbmcgKi8KKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgICAgICBpZiAocFtpXSkgZnJlZShwW2ldKTsKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY2FzZSBYWURGTEQ6CisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJmRpYWxmbGQpKTsKKworICAgICAgY2FzZSBYWURJRFQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgSUdOT1JFLURJQUxUT05FICovCisgICAgICAgIHJldHVybihzZXRvbigmZGlhbGlkdCkpOworCisgICAgICBjYXNlIFhZRFBBQzoKKyAgICAgICAgeSA9IGNtbnVtKAorICAgICAgICAgICAgICAiTWlsbGlzZWNvbmRzIHRvIHBhdXNlIGJldHdlZW4gZWFjaCBjaGFyYWN0ZXIgc2VudCB0byBkaWFsZXIiLAorICAgICAgICAgICAgICAgICAgIiIsMTAsJngseHhzdHJpbmcpOworICAgICAgICByZXR1cm4oc2V0bnVtKCZkaWFscGFjZSx4LHksOTk5OSkpOworCisjaWZuZGVmIE5PU1BMCisgICAgICBjYXNlIFhZRE1BQzoKKyAgICAgICAgaWYgKCh4ID0gY21mbGQoIk5hbWUgb2YgbWFjcm8gdG8gZXhlY3V0ZSBqdXN0IHByaW9yIHRvIGRpYWxpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAiIiwmcyx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgaWYgKHggPT0gLTMpCisgICAgICAgICAgICAgIHMgPSBOVUxMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMpIHsKKyAgICAgICAgICAgIGlmICghKnMpIHsKKyAgICAgICAgICAgICAgICBzID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICAgICAgICAgIHMgPSBsaW5lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIG1ha2VzdHIoJmRpYWxtYWMscyk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworICAgICAgY2FzZSBYWURQVUNDOiAgICAgICAgICAgICAgICAgICAgIC8qIFB1bHNlIGNvdW50cnkgY29kZXMgKi8KKyAgICAgIGNhc2UgWFlEVE9DQzogeyAgICAgICAgICAgICAgICAgICAvKiBUb25lIGNvdW50cnkgY29kZXMgKi8KKyAgICAgICAgICBpbnQgbiwgaTsKKyAgICAgICAgICBjaGFyICogcFtNQVhUUENDXTsKKyAgICAgICAgICBjaGFyICogbTsKKyAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTUFYVFBDQzsgbisrKSB7CisgICAgICAgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgICAgICAgIG0gPSAoeSA9PSBYWURQVUNDKSA/CisgICAgICAgICAgICAgICAgICAiQ291bnRyeSBjb2RlIHdoZXJlIFB1bHNlIGRpYWxpbmcgaXMgcmVxdWlyZWQiCisgICAgICAgICAgICAgICAgICAgIDogIkNvdW50cnkgY29kZSB3aGVyZSBUb25lIGRpYWxpbmcgaXMgYXZhaWxhYmxlIjsKKyAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbSA9ICJBbm90aGVyIGNvdW50cnkgY29kZSI7CisgICAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKG0sIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGlmIChzKSB7CisgICAgICAgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgICAgICAgIGsgPSAoaW50KSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgICBpZiAoayA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBbbl0gPSBtYWxsb2MoayArIDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShwW25dLCBzKTsgLyogc2FmZSAqLworICAgICAgICAgICAgICAgICAgfSBlbHNlIGJyZWFrOworICAgICAgICAgICAgICB9IGVsc2UgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh4ID09IC0zKSB7ICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgd2FzIHN1Y2Nlc3NmdWwgKi8KKyAgICAgICAgICAgICAgaW50IG07CisgICAgICAgICAgICAgIG0gPSAoeSA9PSBYWURQVUNDKSA/IG5kaWFscHVjYyA6IG5kaWFsdG9jYzsKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgeCA9IDE7CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHsgLyogUmVtb3ZlIG9sZCBsaXN0LCBpZiBhbnkgKi8KKyAgICAgICAgICAgICAgICAgIGlmICh5ID09IFhZRFBVQ0MpCisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJihkaWFscHVjY1tpXSksTlVMTCk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJihkaWFsdG9jY1tpXSksTlVMTCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHkgPT0gWFlEUFVDQykgeworICAgICAgICAgICAgICAgICAgbmRpYWxwdWNjID0gbjsgICAgICAgICAgICAgICAgLyogTmV3IGNvdW50ICovCisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBuZGlhbHRvY2MgPSBuOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsgLyogTmV3IGxpc3QgKi8KKyAgICAgICAgICAgICAgICAgIGlmICh5ID09IFhZRFBVQ0MpIHsKKyAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCYoZGlhbHB1Y2NbaV0pLHBbaV0pOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCYoZGlhbHRvY2NbaV0pLHBbaV0pOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHggPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgaWYgKHBbaV0pIGZyZWUocFtpXSk7CisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgfQorICAgICAgY2FzZSBYWURURVNUOgorICAgICAgICByZXR1cm4oc2V0b24oJmRpYWx0ZXN0KSk7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ZigiP1VuZXhwZWN0ZWQgU0VUIERJQUwgcGFyYW1ldGVyXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9Cit9CisKKyNpZm5kZWYgTk9TSE9XCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0hPVyBNT0RFTSAqLworc2hvbW9kZW0oKSB7CisgICAgTURNSU5GICogcDsKKyAgICBpbnQgeCwgbiwgbWRtOworICAgIGNoYXIgYzsKKyAgICBsb25nIHp6OworCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICBwcmludGYoIlNvcnJ5LCBjb21tYW5kIGRpc2FibGVkXHJcbiIpOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisKKyAgICBzaG1kbWxpbigpOworICAgIHByaW50ZigiXG4iKTsKKworICAgIG1kbSA9IChtZG10eXAgPiAwKSA/IG1kbXR5cCA6IG1kbXNhdjsKKyAgICBwID0gKG1kbSA+IDApID8gbW9kZW1wW21kbV0gOiBOVUxMOworCisgICAgaWYgKHApIHsKKyAgICAgICAgcHJpbnRmKCIgJXNcblxuIiwgZGlhbG5hbWUgPyBkaWFsbmFtZSA6IHAtPm5hbWUpOworCisgICAgICAgIHByaW50ZigiIE1vZGVtIGNhcGFiaWxpdGllczogICAgIik7CisgICAgICAgIHp6ID0gZGlhbGNhcGFzID8gZGlhbGNhcGFzIDogcC0+Y2FwYXM7CisgICAgICAgIGlmICghenopIHsKKyAgICAgICAgICAgIHByaW50ZigiIChub25lKSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHp6ICYgQ0tEX0FUKSBwcmludGYoIiBBVCIpOworICAgICAgICAgICAgaWYgKHp6ICYgQ0tEX1YyNSkgcHJpbnRmKCIgSVRVIik7CisgICAgICAgICAgICBpZiAoenogJiBDS0RfU0IpIHByaW50ZigiIFNCIik7CisgICAgICAgICAgICBpZiAoenogJiBDS0RfRUMpIHByaW50ZigiIEVDIik7CisgICAgICAgICAgICBpZiAoenogJiBDS0RfREMpIHByaW50ZigiIERDIik7CisgICAgICAgICAgICBpZiAoenogJiBDS0RfSFcpIHByaW50ZigiIEhXRkMiKTsKKyAgICAgICAgICAgIGlmICh6eiAmIENLRF9TVykgcHJpbnRmKCIgU1dGQyIpOworICAgICAgICAgICAgaWYgKHp6ICYgQ0tEX0tTKSBwcmludGYoIiBLUyIpOworICAgICAgICAgICAgaWYgKHp6ICYgQ0tEX1RCKSBwcmludGYoIiBUQiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXG4gTW9kZW0gY2Fycmllci13YXRjaDogICAgIik7CisgICAgICAgIGlmIChjYXJyaWVyID09IENBUl9PRkYpIHByaW50Zigib2ZmXG4iKTsKKyAgICAgICAgZWxzZSBpZiAoY2FycmllciA9PSBDQVJfT04pIHByaW50Zigib25cbiIpOworICAgICAgICBlbHNlIGlmIChjYXJyaWVyID09IENBUl9BVVQpIHByaW50ZigiYXV0b1xuIik7CisgICAgICAgIGVsc2UgcHJpbnRmKCJ1bmtub3duXG4iKTsKKworICAgICAgICBwcmludGYoIiBNb2RlbSBtYXhpbXVtLXNwZWVkOiAgICAiKTsKKyAgICAgICAgenogPSAoZGlhbG1heCA+IDBMKSA/IGRpYWxtYXggOiBwLT5tYXhfc3BlZWQ7CisgICAgICAgIGlmICh6eiA+IDApCisgICAgICAgICAgcHJpbnRmKCIlbGQgYnBzXG4iLCB6eik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoIih1bmtub3duKVxuIik7CisgICAgICAgIHByaW50ZigiIE1vZGVtIGVycm9yLWNvcnJlY3Rpb246ICVzXG4iLCBkaWFsZWMgPyAib24iIDogIm9mZiIpOworICAgICAgICBwcmludGYoIiBNb2RlbSBjb21wcmVzc2lvbjogICAgICAlc1xuIiwgZGlhbGRjID8gIm9uIiA6ICJvZmYiKTsKKyAgICAgICAgcHJpbnRmKCIgTW9kZW0gc3BlZWQtbWF0Y2hpbmc6ICAgJXMiLCAgIG1kbXNwZCA/ICJvbiIgOiAib2ZmIik7CisgICAgICAgIHByaW50ZigiIChpbnRlcmZhY2Ugc3BlZWQgJXMpXG4iLCBtZG1zcGQgPyAiY2hhbmdlcyIgOiAiaXMgbG9ja2VkIik7CisgICAgICAgIHByaW50ZigiIE1vZGVtIGZsb3ctY29udHJvbDogICAgICIpOworICAgICAgICBpZiAoZGlhbGZjID09IEZMT19OT05FKSBwcmludGYoIm5vbmVcbiIpOworICAgICAgICBlbHNlIGlmIChkaWFsZmMgPT0gRkxPX1hPTlgpIHByaW50ZigieG9uL3hvZmZcbiIpOworICAgICAgICBlbHNlIGlmIChkaWFsZmMgPT0gRkxPX1JUU0MpIHByaW50ZigicnRzL2N0c1xuIik7CisgICAgICAgIGVsc2UgaWYgKGRpYWxmYyA9PSBGTE9fQVVUTykgcHJpbnRmKCJhdXRvXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgTW9kZW0gaGFuZ3VwLW1ldGhvZDogICAgJXNcbiIsCisgICAgICAgICAgICAgICBkaWFsbWh1ID8KKyAgICAgICAgICAgICAgICJtb2RlbS1jb21tYW5kIiA6CisgICAgICAgICAgICAgICAicnMyMzItc2lnbmFsIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcHJpbnRmKCIgTW9kZW0gc3BlYWtlcjogICAgICAgICAgJXNcbiIsIHNob3dvZmYobWRtc3BrKSk7CisgICAgICAgIHByaW50ZigiIE1vZGVtIHZvbHVtZTogICAgICAgICAgICVzXG4iLAorICAgICAgICAgICAgICAgKG1kbXZvbCA9PSAyKSA/ICJtZWRpdW0iIDogKChtZG12b2wgPD0gMSkgPyAibG93IiA6ICJoaWdoIikpOworICAgICAgICBwcmludGYoIiBNb2RlbSBrZXJtaXQtc3Bvb2Y6ICAgICAlc1xuIiwgZGlhbGtzcCA/ICJvbiIgOiAib2ZmIik7CisgICAgICAgIGMgPSAoY2hhcikgKHggPSAoZGlhbGVzYyA/IGRpYWxlc2MgOiBwLT5lc2NfY2hhcikpOworICAgICAgICBwcmludGYoIiBNb2RlbSBlc2NhcGUtY2hhcmFjdGVyOiAlZCIsIHgpOworICAgICAgICBpZiAoaXNwcmludChjKSkKKyAgICAgICAgICBwcmludGYoIiAoPSBcIiVjXCIpIixjKTsKKyAgICAgICAgcHJpbnRmKAorIlxuXG5NT0RFTSBDT01NQU5EcyAoKiA9IHNldCBhdXRvbWF0aWNhbGx5IGJ5IFNFVCBNT0RFTSBUWVBFKTpcblxuIik7CisgICAgICAgIGRlYnVnKEYxMTAsInNob3cgZGlhbGluaSIsZGlhbGluaSwwKTsKKyAgICAgICAgcHJpbnRmKCIgJWMgSW5pdC1zdHJpbmc6ICAgICAgICAgICIsIGRpYWxpbmkgPyAnICcgOiAnKicgKTsKKyAgICAgICAgc2hvZHMoZGlhbGluaSA/IGRpYWxpbmkgOiBwLT53YWtlX3N0cik7CisgICAgICAgIHByaW50ZigiICVjIERpYWwtbW9kZS1zdHJpbmc6ICAgICAiLCBkaWFsbXN0ciA/ICcgJyA6ICcqJyApOworICAgICAgICBzaG9kcyhkaWFsbXN0ciA/IGRpYWxtc3RyIDogcC0+ZG1vZGVfc3RyKTsKKyAgICAgICAgbiA9IGxvY2FsID8gMTkgOiAyMDsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgcHJpbnRmKCIgJWMgRGlhbC1tb2RlLXByb21wdDogICAgICIsIGRpYWxtcHJtdCA/ICcgJyA6ICcqJyApOworICAgICAgICBzaG9kcyhkaWFsbXBybXQgPyBkaWFsbXBybXQgOiBwLT5kbW9kZV9wcm9tcHQpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICBwcmludGYoIiAlYyBEaWFsLWNvbW1hbmQ6ICAgICAgICAgIiwgZGlhbGNtZCA/ICcgJyA6ICcqJyApOworICAgICAgICBzaG9kcyhkaWFsY21kID8gZGlhbGNtZCA6IHAtPmRpYWxfc3RyKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgcHJpbnRmKCIgJWMgQ29tcHJlc3Npb24gb246ICAgICAgICIsIGRpYWxkY29uID8gJyAnIDogJyonICk7CisgICAgICAgIGlmICghZGlhbGRjb24pCisgICAgICAgICAgZGVidWcoRjExMCwiZGlhbGRjb24iLCIobnVsbCkiLDApOworICAgICAgICBlbHNlCisgICAgICAgICAgZGVidWcoRjExMCwiZGlhbGRjb24iLGRpYWxkY29uLDApOworICAgICAgICBzaG9kcyhkaWFsZGNvbiA/IGRpYWxkY29uIDogcC0+ZGNfb25fc3RyKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgcHJpbnRmKCIgJWMgQ29tcHJlc3Npb24gb2ZmOiAgICAgICIsIGRpYWxkY29mZiA/ICcgJyA6ICcqJyApOworICAgICAgICBzaG9kcyhkaWFsZGNvZmYgPyBkaWFsZGNvZmYgOiBwLT5kY19vZmZfc3RyKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgcHJpbnRmKCIgJWMgRXJyb3ItY29ycmVjdGlvbiBvbjogICIsIGRpYWxlY29uID8gJyAnIDogJyonICk7CisgICAgICAgIHNob2RzKGRpYWxlY29uID8gZGlhbGVjb24gOiBwLT5lY19vbl9zdHIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICBwcmludGYoIiAlYyBFcnJvci1jb3JyZWN0aW9uIG9mZjogIiwgZGlhbGVjb2ZmID8gJyAnIDogJyonICk7CisgICAgICAgIHNob2RzKGRpYWxlY29mZiA/IGRpYWxlY29mZiA6IHAtPmVjX29mZl9zdHIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICBwcmludGYoIiAlYyBBdXRvYW5zd2VyIG9uOiAgICAgICAgIiwgZGlhbGFhb24gPyAnICcgOiAnKicgKTsKKyAgICAgICAgc2hvZHMoZGlhbGFhb24gPyBkaWFsYWFvbiA6IHAtPmFhX29uX3N0cik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgIHByaW50ZigiICVjIEF1dG9hbnN3ZXIgb2ZmOiAgICAgICAiLCBkaWFsYWFvZmYgPyAnICcgOiAnKicgKTsKKyAgICAgICAgc2hvZHMoZGlhbGFhb2ZmID8gZGlhbGFhb2ZmIDogcC0+YWFfb2ZmX3N0cik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisKKyAgICAgICAgcHJpbnRmKCIgJWMgU3BlYWtlciBvbjogICAgICAgICAgICIsIGRpYWxzcG9uID8gJyAnIDogJyonICk7CisgICAgICAgIHNob2RzKGRpYWxzcG9uID8gZGlhbHNwb24gOiBwLT5zcF9vbl9zdHIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICBwcmludGYoIiAlYyBTcGVha2VyIG9mZjogICAgICAgICAgIiwgZGlhbHNwb2ZmID8gJyAnIDogJyonICk7CisgICAgICAgIHNob2RzKGRpYWxzcG9mZiA/IGRpYWxzcG9mZiA6IHAtPnNwX29mZl9zdHIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICBwcmludGYoIiAlYyBWb2x1bWUgbG93OiAgICAgICAgICAgIiwgZGlhbHZvbDEgPyAnICcgOiAnKicgKTsKKyAgICAgICAgc2hvZHMoZGlhbHZvbDEgPyBkaWFsdm9sMSA6IHAtPnZvbDFfc3RyKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgcHJpbnRmKCIgJWMgVm9sdW1lIG1lZGl1bTogICAgICAgICIsIGRpYWx2b2wyID8gJyAnIDogJyonICk7CisgICAgICAgIHNob2RzKGRpYWx2b2wyID8gZGlhbHZvbDIgOiBwLT52b2wyX3N0cik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgIHByaW50ZigiICVjIFZvbHVtZSBoaWdoOiAgICAgICAgICAiLCBkaWFsdm9sMyA/ICcgJyA6ICcqJyApOworICAgICAgICBzaG9kcyhkaWFsdm9sMyA/IGRpYWx2b2wzIDogcC0+dm9sM19zdHIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworCisgICAgICAgIHByaW50ZigiICVjIEhhbmd1cC1jb21tYW5kOiAgICAgICAiLCBkaWFsaGNtZCA/ICcgJyA6ICcqJyApOworICAgICAgICBzaG9kcyhkaWFsaGNtZCA/IGRpYWxoY21kIDogcC0+aHVwX3N0cik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgIHByaW50ZigiICVjIEhhcmR3YXJlLWZsb3c6ICAgICAgICAiLCBkaWFsaHdmYyA/ICcgJyA6ICcqJyApOworICAgICAgICBzaG9kcyhkaWFsaHdmYyA/IGRpYWxod2ZjIDogcC0+aHdmY19zdHIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICBwcmludGYoIiAlYyBTb2Z0d2FyZS1mbG93OiAgICAgICAgIiwgZGlhbHN3ZmMgPyAnICcgOiAnKicgKTsKKyAgICAgICAgc2hvZHMoZGlhbHN3ZmMgPyBkaWFsc3dmYyA6IHAtPnN3ZmNfc3RyKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgcHJpbnRmKCIgJWMgTm8tZmxvdy1jb250cm9sOiAgICAgICIsIGRpYWxub2ZjID8gJyAnIDogJyonICk7CisgICAgICAgIHNob2RzKGRpYWxub2ZjID8gZGlhbG5vZmMgOiBwLT5ub2ZjX3N0cik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgIHByaW50ZigiICVjIFB1bHNlOiAgICAgICAgICAgICAgICAiLCBkaWFscHVsc2UgPyAnICcgOiAnKicpOworICAgICAgICBzaG9kcyhkaWFscHVsc2UgPyBkaWFscHVsc2UgOiBwLT5wdWxzZSk7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgIHByaW50ZigiICVjIFRvbmU6ICAgICAgICAgICAgICAgICAiLCBkaWFsdG9uZSA/ICcgJyA6ICcqJyk7CisgICAgICAgIHNob2RzKGRpYWx0b25lID8gZGlhbHRvbmUgOiBwLT50b25lKTsKKworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICBwcmludGYoIiAlYyBJZ25vcmUtZGlhbHRvbmU6ICAgICAgIiwgZGlhbHgzID8gJyAnIDogJyonKTsKKyAgICAgICAgc2hvZHMoZGlhbHgzID8gZGlhbHgzIDogcC0+aWdub3JlZHQpOworCisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgIHByaW50ZigiICVjIFByZWRpYWwtaW5pdDogICAgICAgICAiLCBkaWFsaW5pMiA/ICcgJyA6ICcqJyk7CisgICAgICAgIHNob2RzKGRpYWxpbmkyID8gZGlhbGluaTIgOiBwLT5pbmkyKTsKKworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSA0KSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICBwcmludGYoIlxuIEZvciBtb3JlIGluZm86IFNIT1cgRElBTCBhbmQgU0hPVyBDT01NVU5JQ0FUSU9OU1xuIik7CisKKyAgICB9IGVsc2UgaWYgKG1kbSA+IDApIHsKKyAgICAgICAgcHJpbnRmKCJNb2RlbSBpbmZvIGZvciBcIiVzXCIgbm90IGZpbGxlZCBpbiB5ZXRcbiIsIGdtZG10eXAoKSk7CisgICAgfSBlbHNlIHByaW50ZigKKyIgTm8gbW9kZW0gc2VsZWN0ZWQsIHNvIERJQUwgYW5kIG1vc3QgU0VUIE1PREVNIGNvbW1hbmRzIGhhdmUgbm8gZWZmZWN0LlxuXAorIFVzZSBTRVQgTU9ERU0gVFlQRSB0byBzZWxlY3QgYSBtb2RlbS5cbiIpOworICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisjZW5kaWYgLyogTk9TSE9XICovCisjZW5kaWYgLyogTk9ESUFMICovCisKKyNpZmRlZiBDS19UQVBJCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQVBJIGFjdGlvbiBjb21tYW5kcyAqLworZG90YXBpKCkgeworICAgIGludCB4LHk7CisgICAgY2hhciAqczsKKworICAgIGlmICghVEFQSUF2YWlsKSB7CisgICAgICAgIHByaW50ZigiXG5UQVBJIGlzIHVuYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtLlxuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGlmICgoeSA9IGNta2V5KHRhcGl0YWIsbnRhcGl0YWIsIk1TIFRBUEkgY29tbWFuZCIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeSk7CisgICAgc3dpdGNoICh5KSB7CisgICAgICBjYXNlIFhZVEFQSV9DRkc6IHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQVBJIENPTkZJR1VSRS1MSU5FICovCisgICAgICAgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgKiB0YXBpbGluZXRhYjsKKyAgICAgICAgICBleHRlcm4gc3RydWN0IGtleXRhYiAqIF90YXBpbGluZXRhYjsKKyAgICAgICAgICBleHRlcm4gaW50IG50YXBpbGluZTsKKyAgICAgICAgICBleHRlcm4gaW50IExpbmVEZXZpY2VJZDsKKyAgICAgICAgICBpbnQgbGluZUlEPUxpbmVEZXZpY2VJZDsKKyAgICAgICAgICBpZiAoVEFQSUF2YWlsKQorICAgICAgICAgICAgY2t0YXBpQnVpbGRMaW5lVGFibGUoJnRhcGlsaW5ldGFiLCAmX3RhcGlsaW5ldGFiLCAmbnRhcGlsaW5lKTsKKyAgICAgICAgICBpZiAodGFwaWxpbmV0YWIgJiYgX3RhcGlsaW5ldGFiICYmIG50YXBpbGluZSA+IDApIHsKKyAgICAgICAgICAgICAgaW50IGk9MCwgaiA9IDk5OTksIGsgPSAtMTsKKworICAgICAgICAgICAgICBpZiAoIExpbmVEZXZpY2VJZCA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICAgIC8qIEZpbmQgb3V0IHdoYXQgdGhlIGxvd2VzdCBudW1iZXJlZCBUQVBJIGRldmljZSBpcyAqLworICAgICAgICAgICAgICAgICAgLyogYW5kIHVzZSBpdCBhcyB0aGUgZGVmYXVsdC4gICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnRhcGlsaW5lOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcGlsaW5ldGFiW2ldLmt3dmFsIDwgaikgeworICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAvKiBGaW5kIHRoZSBMaW5lRGV2aWNlSWQgaW4gdGhlIHRhYmxlIGFuZCB1c2UgdGhhdCBlbnRyeSAqLworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG50YXBpbGluZTsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXBpbGluZXRhYltpXS5rd3ZhbCA9PSBMaW5lRGV2aWNlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoayA+PSAwKQorICAgICAgICAgICAgICAgIHMgPSBfdGFwaWxpbmV0YWJba10ua3dkOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcyA9ICIiOworCisgICAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KF90YXBpbGluZXRhYixudGFwaWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFQSSBkZXZpY2UgbmFtZSIscyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgIGxpbmVJRCA9IHk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworI2lmZGVmIElLU0QKKyAgICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCJTb3JyeSwgY29tbWFuZCBkaXNhYmxlZFxyXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgICB9CisjZW5kaWYgLyogSVNLRCAqLworICAgICAgICAgIGNrdGFwaUNvbmZpZ3VyZUxpbmUobGluZUlEKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgWFlUQVBJX0RJQUw6ICAgICAgICAgICAgICAgICAvKiBUQVBJIERJQUxJTkctUFJPUEVSVElFUyAqLworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworI2lmZGVmIElLU0QKKyAgICAgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCBjb21tYW5kIGRpc2FibGVkXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElTS0QgKi8KKyAgICAgICAgY2t0YXBpRGlhbGluZ1Byb3AoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEFQSSBjb21tYW5kIG9wdGlvbnMgKi8KK3NldHRhcGkoKSB7CisgICAgaW50IHgsIHk7CisgICAgY2hhciAqczsKKworICAgIGlmICghVEFQSUF2YWlsKSB7CisgICAgICAgIHByaW50ZigiXG5UQVBJIGlzIHVuYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtLlxuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGlmICgoeSA9IGNta2V5KHNldHRhcGl0YWIsbnNldHRhcGl0YWIsIk1TIFRBUEkgb3B0aW9uIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih5KTsKKyAgICBzd2l0Y2ggKHkpIHsKKyAgICAgIGNhc2UgWFlUQVBJX1VTRToKKyAgICAgICAgcmV0dXJuIChzdWNjZXNzID0gc2V0b24oJnRhcGl1c2VjZmcpKTsKKyAgICAgIGNhc2UgWFlUQVBJX0xHSFQ6CisgICAgICAgIHJldHVybiAoc3VjY2VzcyA9IHNldG9uKCZ0YXBpbGlnaHRzKSk7CisgICAgICBjYXNlIFhZVEFQSV9QUkU6CisgICAgICAgIHJldHVybiAoc3VjY2VzcyA9IHNldG9uKCZ0YXBpcHJldGVybSkpOworICAgICAgY2FzZSBYWVRBUElfUFNUOgorICAgICAgICByZXR1cm4gKHN1Y2Nlc3MgPSBzZXRvbigmdGFwaXBvc3R0ZXJtKSk7CisgICAgICBjYXNlIFhZVEFQSV9JTkE6CisgICAgICAgIHkgPSBjbW51bSgic2Vjb25kcyBvZiBpbmFjdGl2aXR5IGJlZm9yZSBhdXRvLWRpc2Nvbm5lY3QiLAorICAgICAgICAgICAgICAgICAgIjAiLDEwLCZ4LHh4c3RyaW5nKTsKKyAgICAgICAgcmV0dXJuKHNldG51bSgmdGFwaWluYWN0aXZpdHkseCx5LDY1NTM1KSk7CisgICAgICBjYXNlIFhZVEFQSV9CTkc6CisgICAgICAgIHkgPSBjbW51bSgic2Vjb25kcyB0byB3YWl0IGZvciBjcmVkaXQgY2FyZCB0b25lIiwKKyAgICAgICAgICAgICAgICAgICI4IiwxMCwmeCx4eHN0cmluZyk7CisgICAgICAgIHJldHVybihzZXRudW0oJnRhcGlib25nLHgseSw5MCkpOworICAgICAgY2FzZSBYWVRBUElfTUFOOgorICAgICAgICByZXR1cm4gKHN1Y2Nlc3MgPSBzZXRvbigmdGFwaW1hbnVhbCkpOworICAgICAgY2FzZSBYWVRBUElfQ09OOiAgICAgICAgICAgICAgICAgIC8qIFRBUEkgQ09OVkVSU0lPTlMgKi8KKyAgICAgICAgcmV0dXJuIChzdWNjZXNzID0gc2V0b25hdXQoJnRhcGljb252KSk7CisgICAgICBjYXNlIFhZVEFQSV9MSU46ICAgICAgICAgICAgICAgICAgLyogVEFQSSBMSU5FICovCisgICAgICAgIHggPSBzZXRsaW4oWFlUQVBJX0xJTiwxLDApOworICAgICAgICBpZiAoeCA+IC0xKSBkaWRzZXRsaW4rKzsKKyAgICAgICAgcmV0dXJuKHgpOworICAgICAgY2FzZSBYWVRBUElfUEFTUzogeyAgICAgICAgICAgICAgIC8qIFRBUEkgUEFTU1RIUk9VR0ggKi8KKyNpZmRlZiBOT0RJQUwKKyAgICAgICAgICBwcmludGYoIlxuP01vZGVtLWRpYWxpbmcgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgcmV0dXJuKC05KTsKKyNlbHNlIC8qIE5PRElBTCAqLworICAgICAgICAgIC8qIFBhc3N0aHJvdWdoIGJlY2FtZSBNb2RlbS1kaWFsaW5nIHdoaWNoIGlzIGFuIGFudG9ueW0gKi8KKyAgICAgICAgICBzdWNjZXNzID0gc2V0b24oJnRhcGlwYXNzKTsKKyAgICAgICAgICB0YXBpcGFzcyA9ICF0YXBpcGFzczsKKyAgICAgICAgICByZXR1cm4gKHN1Y2Nlc3MpOworI2VuZGlmIC8qIE5PRElBTCAqLyAgICAgICAgCisgICAgICB9CisgICAgICBjYXNlIFhZVEFQSV9MT0M6IHsgICAgICAgICAgICAgICAgLyogVEFQSSBMT0NBVElPTiAqLworICAgICAgICAgIGV4dGVybiBjaGFyIHRhcGlsb2NbXTsKKyAgICAgICAgICBleHRlcm4gaW50IHRhcGlsb2NpZDsKKyAgICAgICAgICBpbnQgaSA9IDAsIGogPSA5OTk5LCBrID0gLTE7CisKKyAgICAgICAgICBja3RhcGlCdWlsZExvY2F0aW9uVGFibGUoJnRhcGlsb2N0YWIsICZudGFwaWxvYyk7CisgICAgICAgICAgaWYgKCF0YXBpbG9jdGFiIHx8ICFudGFwaWxvYykgeworICAgICAgICAgICAgICBwcmludGYoIlxuTm8gVEFQSSBMb2NhdGlvbnMgYXJlIGNvbmZpZ3VyZWQgZm9yIHRoaXMgc3lzdGVtXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRhcGlsb2NpZCA9PSAtMSkKKyAgICAgICAgICAgIHRhcGlsb2NpZCA9IGNrdGFwaUdldEN1cnJlbnRMb2NhdGlvbklEKCk7CisKKyAgICAgICAgICAvKiBGaW5kIHRoZSBjdXJyZW50IHRhcGlsb2MgZW50cnkgKi8KKyAgICAgICAgICAvKiBhbmQgdXNlIGl0IGFzIHRoZSBkZWZhdWx0LiAqLworICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBudGFwaWxvYzsgaysrKSB7CisgICAgICAgICAgICAgIGlmICh0YXBpbG9jdGFiW2tdLmt3dmFsID09IHRhcGlsb2NpZCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGsgPj0gMCAmJiBrIDwgbnRhcGlsb2MpCisgICAgICAgICAgICBzID0gdGFwaWxvY3RhYltrXS5rd2Q7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcyA9ICIiOworCisgICAgICAgICAgaWYgKCh5ID0gY21rZXkodGFwaWxvY3RhYixudGFwaWxvYywgIlRBUEkgbG9jYXRpb24iLHMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeSk7CisKKyAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisjaWZkZWYgSUtTRAorICAgICAgICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCBjb21tYW5kIGRpc2FibGVkXHJcbiIpOworICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgICAgY2t0YXBpRmV0Y2hMb2NhdGlvbkluZm9CeUlEKCB5ICk7CisjaWZuZGVmIE5PRElBTAorICAgICAgICAgIENvcHlUYXBpTG9jYXRpb25JbmZvVG9LZXJtaXREaWFsQ21kKCk7CisjZW5kaWYgLyogTk9ESUFMICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybihzdWNjZXNzPTEpOworfQorI2VuZGlmIC8qIENLX1RBUEkgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZm5kZWYgTk9TUEwKKyNpZmRlZiBDS19BTlNJQyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgQUxBUk0gKi8KK2ludAorc2V0YWxhcm0obG9uZyB4eCkKKyNlbHNlCitpbnQKK3NldGFsYXJtKHh4KSBsb25nIHh4OworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBzZXRhbGFybSAqLyB7CisjaWZkZWYgQ09NTUVOVAorICAgIGludCB5eXl5LCBtbSwgZGQsIHg7CisgICAgY2hhciAqczsKKyAgICBsb25nIHp6OworICAgIGNoYXIgYnVmWzZdOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBsb25nIHNlYywgamQ7CisgICAgY2hhciB4YnVmWzIwXSwgKiBwOworCisgICAgZGVidWcoRjEwMSwic2V0YWxhcm0geHgiLCIiLHh4KTsKKyAgICBja19hbGFybSA9IDBMOyAgICAgICAgICAgICAgICAgICAgICAvKiAwID0gbm8gYWxhcm0gKGluIGNhc2Ugb2YgZXJyb3IpICovCisgICAgaWYgKHh4IDwgMEwpIHsKKyAgICAgICAgcHJpbnRmKCIlbGQgLSBpbGxlZ2FsIHZhbHVlLCBtdXN0IGJlIDAgb3IgcG9zaXRpdmVcbiIsIHh4KTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKHh4ID09IDBMKSB7ICAgICAgICAgICAgICAgICAgICAgLyogQ0xFQVIgQUxBUk0gKi8KKyAgICAgICAgYWxybV9kYXRlWzBdID0gTlVMOworICAgICAgICBhbHJtX3RpbWVbMF0gPSBOVUw7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgIHggPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBjdXJyZW50IGRhdGUgKi8KKyAgICBzID0gYWxybV9kYXRlOworICAgIGlmICh6enN0cmluZygiXFx2KG5kYXRlKSIsJnMsJngpIDwgMCkgeworICAgICAgICBwcmludGYoIkludGVybmFsIGRhdGUgZXJyb3IsIHNvcnJ5LlxuIik7CisgICAgICAgIGFscm1fZGF0ZVswXSA9IFNQOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICB4ID0gNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgY3VycmVudCB0aW1lICovCisgICAgcyA9IGFscm1fdGltZTsKKyAgICBpZiAoenpzdHJpbmcoIlxcdihudGltZSkiLCZzLCZ4KSA8IDApIHsKKyAgICAgICAgcHJpbnRmKCJJbnRlcm5hbCB0aW1lIGVycm9yLCBzb3JyeS5cbiIpOworICAgICAgICBhbHJtX3RpbWVbMF0gPSBTUDsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgc3ByaW50ZihidWYsIiUwNWxkIixhdG9sKGFscm1fdGltZSkpOyAvKiBTQUZFICgyMCkgKi8KKyAgICBja3N0cm5jcHkoYWxybV90aW1lLGJ1Ziw4KTsKKyAgICBkZWJ1ZyhGMTEwLCJTRVQgQUxBUk0gZGF0ZSAoMSkiLGFscm1fZGF0ZSwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJTRVQgQUxBUk0gdGltZSAoMSkiLGFscm1fdGltZSwwKTsKKworICAgIGlmICgoenogPSBhdG9sKGFscm1fdGltZSkgKyB4eCkgPCAwTCkgeworICAgICAgICBwcmludGYoIkludGVybmFsIHRpbWUgY29udmVyc2lvbiBlcnJvciwgc29ycnkuXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKHp6ID49IDg2NDAwTCkgeyAgICAgICAgICAgICAgICAgLyogQWxhcm0gY3Jvc3NlcyBtaWRuaWdodCAqLworICAgICAgICBjaGFyIGRbMTBdOyAgICAgICAgICAgICAgICAgICAgIC8qIExvY2FsIGRhdGUgYnVmZmVyICovCisgICAgICAgIGludCBsYXN0ZGF5OyAgICAgICAgICAgICAgICAgICAgLyogTGFzdCBkYXkgb2YgdGhpcyBtb250aCAqLworCisgICAgICAgIGNrc3RybmNweShkLGFscm1fZGF0ZSw4KTsgICAgICAgLyogV2UnbGwgaGF2ZSB0byBjaGFuZ2UgdGhlIGRhdGUgKi8KKworICAgICAgICB4ID0gKHp6IC8gODY0MDBMKTsgICAgICAgICAgICAgIC8qIEhvdyBtYW55IGRheXMgYWZ0ZXIgdG9kYXkgKi8KKworICAgICAgICBkZCA9IGF0b2koKGNoYXIgKikoZCs2KSk7ICAgICAgIC8qIFBhcnNlIHl5eXltbWRkICovCisgICAgICAgIGRbNl0gPSBOVUw7ICAgICAgICAgICAgICAgICAgICAgLyogaW50byB5eXl5LCBtbSwgZGQgLi4uICovCisgICAgICAgIG1tID0gYXRvaSgoY2hhciAqKShkKzQpKTsKKyAgICAgICAgZFs0XSA9IE5VTDsKKyAgICAgICAgeXl5eSA9IGF0b2koKGNoYXIgKilkKTsKKworICAgICAgICAvKiBIb3cgbWFueSBkYXlzIGluIHRoaXMgbW9udGggKi8KKworICAgICAgICBsYXN0ZGF5ID0gbWRheXNbbW1dOworICAgICAgICBpZiAobW0gPT0gMiAmJiB5eXl5ICUgNCA9PSAwKSAgIC8qIFdvcmtzIHRocnUgMjA5OSBBRC4uLiAqLworICAgICAgICAgIGxhc3RkYXkrKzsKKworICAgICAgICBpZiAoZGQgKyB4ID4gbGFzdGRheSkgeyAgICAgICAgIC8qIER1bWIgbG9vcCAqLworICAgICAgICAgICAgaW50IHk7CisKKyAgICAgICAgICAgIHggLT0gKG1kYXlzW21tXSAtIGRkKTsgICAgICAvKiBEZWR1Y3QgcmVzdCBvZiB0aGlzIG1vbnRoJ3MgZGF5cyAqLworCisgICAgICAgICAgICAvKiBUaGVyZSdzIGEgbW9yZSBlbGVnYW50IHdheSB0byBkbyB0aGlzLi4uICovCisKKyAgICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgICAgbW0rKzsgICAgICAgICAgICAgICAgICAgLyogTmV4dCBtb250aCAqLworICAgICAgICAgICAgICAgIGlmIChtbSA+IDEyKSB7ICAgICAgICAgIC8qIFdyYXAgYXJvdW5kICovCisgICAgICAgICAgICAgICAgICAgIG1tID0gMTsgICAgICAgICAgICAgLyogSmFuLCBuZXh0IHllYXIgKi8KKyAgICAgICAgICAgICAgICAgICAgeXl5eSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB5ID0gbWRheXNbbW1dOyAgICAgICAgICAvKiBEYXlzIGluIG5ldyBtb250aCAqLworICAgICAgICAgICAgICAgIGlmIChtbSA9PSAyICYmIHl5eXkgJSA0ID09IDApIC8qIEZlYiBpbiBsZWFwIHllYXIgKi8KKyAgICAgICAgICAgICAgICAgIHkrKzsgICAgICAgICAgICAgICAgICAvKiBXb3JrcyB1bnRpbCAyMTAwIEFEICovCisgICAgICAgICAgICAgICAgaWYgKHggLSB5IDwgMSkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHggLT0geTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRkID0geDsgICAgICAgICAgICAgICAgICAgICAvKiBEYXkgb2YgYWxhcm0gbW9udGggKi8KKyAgICAgICAgfSBlbHNlIGRkICs9IHg7CisKKyAgICAgICAgc3ByaW50ZihhbHJtX2RhdGUsIiUwNGQlMDJkJTAyZCIseXl5eSxtbSxkZCk7IC8qIFNBRkUgKDI0KSAqLworICAgICAgICB6eiA9IHp6ICUgODY0MDBMOworICAgIH0KKyAgICBzcHJpbnRmKGFscm1fdGltZSwiJWxkIix6eik7ICAgICAgICAvKiBTQUZFICgyNCkgKi8KKyAgICBkZWJ1ZyhGMTEwLCJTRVQgQUxBUk0gZGF0ZSAoMikiLGFscm1fZGF0ZSwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJTRVQgQUxBUk0gdGltZSAoMikiLGFscm1fdGltZSwwKTsKKyAgICBja19hbGFybSA9IHh4OworI2Vsc2UKKyAgICAvKiBKdWwgMTk5OCAqLworICAgIGNrc3RybmNweSh4YnVmLGNrY3Z0ZGF0ZSgiIiwxKSwyMCk7IC8qIEdldCBjdXJyZW50IGRhdGUgYW5kIHRpbWUgKi8KKyAgICBwID0geGJ1ZjsKKyAgICBja3N0cm5jcHkoYWxybV9kYXRlLHhidWYsMTApOworICAgIGFscm1fZGF0ZVs4XSA9IE5VTDsKKyAgICBzZWMgPSBhdG9sKHArOSkgKiAzNjAwTCArIGF0b2wocCsxMikgKiA2MEwgKyBhdG9sKHArMTUpOworICAgIGRlYnVnKEYxMTAsIlNFVCBBTEFSTSBkYXRlICgxKSIsYWxybV9kYXRlLDApOworICAgIGRlYnVnKEYxMDEsIlNFVCBBTEFSTSB0aW1lICgxKSIsIiIsc2VjKTsKKyAgICBpZiAoKHNlYyArPSB4eCkgPCAwTCkgeworICAgICAgICBwcmludGYoIkludGVybmFsIHRpbWUgY29udmVyc2lvbiBlcnJvciwgc29ycnkuXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKHNlYyA+PSA4NjQwMEwpIHsgICAgICAgICAgICAgICAgLyogQWxhcm0gY3Jvc3NlcyBtaWRuaWdodCAqLworICAgICAgICBsb25nIGRheXM7CisgICAgICAgIGRheXMgPSBzZWMgLyA4NjQwMEw7CisgICAgICAgIGpkID0gbWpkKHApICsgZGF5czsgICAgICAgICAgICAgLyogR2V0IG1vZGlmaWVkIEp1bGlhbiBkYXRlICovCisgICAgICAgIGNrc3RybmNweShhbHJtX2RhdGUsbWpkMmRhdGUoamQpLDEwKTsKKyAgICAgICAgc2VjICU9IDg2NDAwTDsKKyAgICB9CisgICAgc3ByaW50ZihhbHJtX3RpbWUsIiUwNWxkIixzZWMpOyAgICAgLyogU0FGRSAoMjQpICovCisgICAgZGVidWcoRjExMCwiU0VUIEFMQVJNIGRhdGUgKDIpIixhbHJtX2RhdGUsMCk7CisgICAgZGVidWcoRjExMCwiU0VUIEFMQVJNIHRpbWUgKDIpIixhbHJtX3RpbWUsMCk7CisgICAgY2tfYWxhcm0gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgLyogQWxhcm0gaXMgc2V0ICovCisKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PU0VUS0VZCitpbnQKK2Rvc2V0a2V5KCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgS0VZICovCisgICAgaW50IHgsIHk7CisgICAgaW50IGZsYWcgPSAwOworICAgIGludCBrYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtleSBjb2RlICovCisgICAgY2hhciAqczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogS2V5IGJpbmRpbmcgKi8KKyNpZm5kZWYgTk9LVkVSQlMKKyAgICBjaGFyICpwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXb3JrZXIgKi8KKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworI2lmZGVmIE9TMgorICAgIGV4dGVybiBpbnQgb3MyZ2tzOworICAgIGV4dGVybiBpbnQgbXNra2V5czsKKyAgICBleHRlcm4gaW50IGluaXR2aWs7CisjZW5kaWYgLyogT1MyICovCisKKyAgICB4X2lmbnVtID0gMTsKKyAgICB5ID0gY21udW0oIm51bWVyaWMga2V5IGNvZGUsIG9yIHRoZSB3b3JkIENMRUFSLCIsIiIsMTAsJmtjLHh4c3RyaW5nKTsKKyAgICB4X2lmbnVtID0gMDsKKyAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgZGVidWcoRjExMSwiU0VUIEtFWSIsYXRtYnVmLHkpOworICAgICAgICBpZiAoeSA9PSAtMikgeyAgICAgICAgICAgICAgICAgIC8qIE5vdCBhIHZhbGlkIG51bWJlciAqLworICAgICAgICAgICAgaWYgKCh5ID0gc3RybGVuKGF0bWJ1ZikpIDwgMCkgLyogQ2hlY2sgZm9yIFNFVCBLRVkgQ0xFQVIgKi8KKyAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICAgIGlmIChja3N0cmNtcChhdG1idWYsImNsZWFyIix5LDApKQorICAgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgS01TSVpFOyB5KyspIHsKKyAgICAgICAgICAgICAgICBrZXltYXBbeV0gPSAoS0VZKSB5OworICAgICAgICAgICAgICAgIG1hY3JvdGFiW3ldID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGtleW1hcGluaXQoKTsgICAgICAgICAgICAgICAvKiBTcGVjaWFsIE9TLzIgaW5pdGlhbGl6YXRpb25zICovCisgICAgICAgICAgICBpbml0dmlrID0gMTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBWSUsgdGFibGUgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgfSBlbHNlIGlmICh5ID09IC0zKSB7ICAgICAgICAgICAvKiBTRVQgS0VZIDxSZXR1cm4+ICovCisgICAgICAgICAgICBwcmludGYoIiBQcmVzcyBrZXkgdG8gYmUgZGVmaW5lZDogIik7IC8qIFByb21wdCBmb3IgYSBrZXlzdHJva2UgKi8KKyNpZmRlZiBVTklYCisjaWZkZWYgTk9TRVRCVUYKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmIC8qIE5PU0VUQlVGICovCisjZW5kaWYgLyogVU5JWCAqLworICAgICAgICAgICAgY29uYmluKChjaGFyKWVzY2FwZSk7ICAgICAgIC8qIFB1dCB0ZXJtaW5hbCBpbiBiaW5hcnkgbW9kZSAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgb3MyZ2tzID0gMDsgICAgICAgICAgICAgICAgIC8qIFR1cm4gb2ZmIEt2ZXJiIHByZXByb2Nlc3NpbmcgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIGtjID0gY29uZ2tzKDApOyAgICAgICAgICAgICAvKiBHZXQgY2hhcmFjdGVyIG9yIHNjYW4gY29kZSAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgb3MyZ2tzID0gMTsgICAgICAgICAgICAgICAgIC8qIFR1cm4gb24gS3ZlcmIgcHJlcHJvY2Vzc2luZyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsgICAgICAgIC8qIFJlc3RvcmUgdGVybWluYWwgdG8gY2JyZWFrIG1vZGUgKi8KKyAgICAgICAgICAgIGlmIChrYyA8IDApIHsgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIj9FcnJvciByZWFkaW5nIGtleVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgfQorI2lmZGVmIE9TMgorICAgICAgICAgICAgc2hva2V5Y29kZShrYywtMSk7ICAgICAgICAgIC8qIFNob3cgY3VycmVudCBkZWZpbml0aW9uICovCisjZWxzZQorICAgICAgICAgICAgc2hva2V5Y29kZShrYyk7ICAgICAgICAgICAgIC8qIFNob3cgY3VycmVudCBkZWZpbml0aW9uICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICBmbGFnID0gMTsgICAgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgaXQncyBhIG11bHRpbGluZSBjb21tYW5kICovCisgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgfQorCisgICAgLyogTm9ybWFsIFNFVCBLRVkgPHNjYW5jb2RlPiA8dmFsdWU+IGNvbW1hbmQuLi4gKi8KKworI2lmZGVmIE9TMgorICAgIGlmIChtc2trZXlzKQorICAgICAga2MgPSBtc2t0b2NrKGtjKTsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIGlmIChrYyA8IDAgfHwga2MgPj0gS01TSVpFKSB7CisgICAgICAgIHByaW50ZigiP2tleSBjb2RlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAlZFxuIiwgS01TSVpFIC0gMSk7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGlmIChrYyA9PSBlc2NhcGUpIHsKKyAgICAgICAgcHJpbnRmKCJTb3JyeSwgJWQgaXMgdGhlIENPTk5FQ1QtbW9kZSBlc2NhcGUgY2hhcmFjdGVyXG4iLGtjKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisjaWZkZWYgT1MyCisgICAgd2lkZXJlc3VsdCA9IC0xOworI2VuZGlmIC8qIE9TMiAqLworICAgIGlmIChmbGFnKSB7CisgICAgICAgIGNtc2F2cChwc2F2ZSxQUk9NUFRMKTsKKyAgICAgICAgY21zZXRwKCIgRW50ZXIgbmV3IGRlZmluaXRpb246ICIpOworICAgICAgICBjbWluaShja3hlY2gpOworICAgICAgICBjbWZsZ3MgPSAwOworICAgICAgICBwcm9tcHQoTlVMTCk7CisgICAgfQorICBkZWZfYWdhaW46CisgICAgaWYgKGZsYWcpCisgICAgICBjbXJlcygpOworICAgIGlmICgoeSA9IGNtdHh0KCJrZXkgZGVmaW5pdGlvbixcblwKK29yIEN0cmwtQyB0byBjYW5jZWwgdGhpcyBjb21tYW5kLFxuXAorb3IgRW50ZXIgdG8gcmVzdG9yZSBkZWZhdWx0IGRlZmluaXRpb24iLAorICAgICAgICAgICAgICAgICAgICIiLCZzLE5VTEwpKSA8IDApIHsKKyAgICAgICAgaWYgKGZsYWcpICAgICAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgcGFyc2UgZXJyb3JzICovCisgICAgICAgICAgZ290byBkZWZfYWdhaW47CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgfQorICAgIHMgPSBicnN0cmlwKHMpOworI2lmbmRlZiBOT0tWRVJCUworICAgIHAgPSBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhpcyBwbGFjZSAqLworI2VuZGlmIC8qIE5PS1ZFUkJTICovCisvKgorICBJZiB0aGUgZGVmaW5pdGlvbiBpbmNsdWRlZCBhbnkgXEt2ZXJicywgcXVvdGUgdGhlIGJhY2tzbGFzaCBzbyB0aGUgXEt2ZXJiCisgIHdpbGwgc3RpbGwgYmUgaW4gdGhlIGRlZmluaXRpb24gd2hlbiB0aGUga2V5IGlzIHByZXNzZWQuICBXZSBkb24ndCBkbyB0aGlzCisgIGluIHp6c3RyaW5nKCksIGJlY2F1c2UgXEt2ZXJicyBhcmUgdmFsaWQgb25seSBpbiB0aGlzIGNvbnRleHQgYW5kIG5vd2hlcmUKKyAgZWxzZS4KKworICBXZSB1c2UgdGhpcyBjb2RlIGFjdGl2ZSBmb3IgYWxsIHZlcnNpb25zIHRoYXQgc3VwcG9ydCBTRVQgS0VZLCBldmVuIGlmIHRoZXkKKyAgZG9uJ3Qgc3VwcG9ydCBcS3ZlcmJzLCBiZWNhdXNlIG90aGVyd2lzZSBcSyB3b3VsZCBiZWhhdmUgZGlmZmVyZW50bHkgZm9yCisgIGRpZmZlcmVudCB2ZXJzaW9ucy4KKyovCisgICAgZm9yICh4ID0gMCwgeSA9IDA7IHNbeF07IHgrKywgeSsrKSB7IC8qIENvbnZlcnQgXEsgdG8gXFxLICovCisgICAgICAgIGlmICgoeCA+IDApICYmCisgICAgICAgICAgICAoc1t4XSA9PSAnSycgfHwgc1t4XSA9PSAnaycpCisgICAgICAgICAgICApIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGF2ZSBLICovCisKKyAgICAgICAgICAgIGlmICgoeCA9PSAxICYmIHNbeC0xXSA9PSBDTURRKSB8fAorICAgICAgICAgICAgICAgICh4ID4gMSAmJiBzW3gtMV0gPT0gQ01EUSAmJiBzW3gtMl0gIT0gQ01EUSkpIHsKKyAgICAgICAgICAgICAgICBsaW5lW3krK10gPSBDTURROyAgICAgICAvKiBNYWtlIGl0IFxcSyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHggPiAxICYmIHNbeC0xXSA9PSAneycgJiYgc1t4LTJdID09IENNRFEpIHsKKyAgICAgICAgICAgICAgICBsaW5lW3ktMV0gPSBDTURROyAgICAgICAvKiBIYXZlIFx7SyAqLworICAgICAgICAgICAgICAgIGxpbmVbeSsrXSA9ICd7JzsgICAgICAgIC8qIE1ha2UgaXQgXFx7SyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxpbmVbeV0gPSBzW3hdOworICAgIH0KKyAgICBsaW5lW3krK10gPSBOVUw7ICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hdGUgKi8KKyAgICBzID0gbGluZSArIHkgKyAxOyAgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBhZnRlciBpdCAqLworICAgIHggPSBMSU5CVUZTSVogLSAoaW50KSBzdHJsZW4obGluZSkgLSAxOyAvKiBDYWxjdWxhdGUgcmVtYWluaW5nIHNwYWNlICovCisgICAgaWYgKCh4IDwgKExJTkJVRlNJWiAvIDIpKSB8fAorICAgICAgICAoenpzdHJpbmcobGluZSwgJnMsICZ4KSA8IDApKSB7IC8qIEV4cGFuZCB2YXJpYWJsZXMsIGV0Yy4gKi8KKyAgICAgICAgcHJpbnRmKCI/S2V5IGRlZmluaXRpb24gdG9vIGxvbmdcbiIpOworICAgICAgICBpZiAoZmxhZykgY21zZXRwKHBzYXZlKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgcyA9IGxpbmUgKyB5ICsgMTsgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gcmVzdWx0LiAqLworCisjaWZuZGVmIE5PS1ZFUkJTCisvKgorICBTcGVjaWFsIGNhc2U6IHNlZSBpZiB0aGUgZGVmaW5pdGlvbiBzdGFydHMgd2l0aCBhIFxLdmVyYi4KKyAgSWYgaXQgZG9lcywgcG9pbnQgdG8gaXQgd2l0aCBwLCBvdGhlcndpc2Ugc2V0IHAgdG8gTlVMTC4KKyovCisgICAgcCA9IHM7CisgICAgaWYgKCpwKysgPT0gQ01EUSkgeworICAgICAgICBpZiAoKnAgPT0gJ3snKSBwKys7CisgICAgICAgIHAgPSAoKnAgPT0gJ2snIHx8ICpwID09ICdLJykgPyBwICsgMSA6IE5VTEw7CisgICAgfQorI2VuZGlmIC8qIE5PS1ZFUkJTICovCisKKyAgICBpZiAobWFjcm90YWJba2NdKSB7ICAgICAgICAgICAgICAgICAvKiBQb3NzaWJseSBmcmVlIG9sZCBtYWNybyBmcm9tIGtleS4gKi8KKyAgICAgICAgZnJlZSgoY2hhciAqKW1hY3JvdGFiW2tjXSk7CisgICAgICAgIG1hY3JvdGFiW2tjXSA9IE5VTEw7CisgICAgfQorICAgIHN3aXRjaCAoc3RybGVuKHMpKSB7ICAgICAgICAgICAgICAgIC8qIEFjdGlvbiBkZXBlbmRzIG9uIGxlbmd0aCAqLworICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRvIGRlZmF1bHQgYmluZGluZyAqLworICAgICAgICBrZXltYXBba2NdID0gKEtFWSkga2M7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpbmdsZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAga2V5bWFwW2tjXSA9IChDSEFSKSAqczsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIHN0cmluZyAqLworI2lmbmRlZiBOT0tWRVJCUworICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgeSA9IHhsb29rdXAoa3ZlcmJzLHAsbmt2ZXJicywmeCk7IC8qIExvb2sgaXQgdXAgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInNldCBrZXkga3ZlcmIgbG9va3VwIiwwLHkpOyAvKiBleGFjdCBtYXRjaCByZXF1aXJlZCAqLworICAgICAgICAgICAgaWYgKHkgPiAtMSkgeworICAgICAgICAgICAgICAgIGtleW1hcFtrY10gPSBGX0tWRVJCIHwgeTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIE5PS1ZFUkJTICovCisgICAgICAgIGtleW1hcFtrY10gPSAoS0VZKSBrYzsKKyAgICAgICAgbWFjcm90YWJba2NdID0gKE1BQ1JPKSBtYWxsb2Moc3RybGVuKHMpKzEpOworICAgICAgICBpZiAobWFjcm90YWJba2NdKQorICAgICAgICAgIHN0cmNweSgoY2hhciAqKSBtYWNyb3RhYltrY10sIHMpOyAvKiBzYWZlICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZmxhZykgY21zZXRwKHBzYXZlKTsKKyNpZmRlZiBPUzIKKyAgICBpbml0dmlrID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgVklLIHRhYmxlICovCisjZW5kaWYgLyogT1MyICovCisgICAgcmV0dXJuKDEpOworfQorI2VuZGlmIC8qIE5PU0VUS0VZICovCisKKyNpZmRlZiBTVE9QQklUUworc3RydWN0IGtleXRhYiBzdG9wdGJsW10gPSB7CisgICAgeyAiMSIsIDEsIDAgfSwKKyAgICB7ICIyIiwgMiwgMCB9Cit9OworI2VuZGlmIC8qIFNUT1BCSVRTICovCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHNlcnRibFtdID0geworICAgIHsgIjdFMSIsIDAsIDAgfSwKKyAgICB7ICI3RTIiLCAxLCAwIH0sCisgICAgeyAiN00xIiwgMiwgMCB9LAorICAgIHsgIjdNMiIsIDMsIDAgfSwKKyAgICB7ICI3TzEiLCA0LCAwIH0sCisgICAgeyAiN08yIiwgNSwgMCB9LAorICAgIHsgIjdTMSIsIDYsIDAgfSwKKyAgICB7ICI3UzIiLCA3LCAwIH0sCisjaWZkZWYgSFdQQVJJVFkKKyAgICB7ICI4RTEiLCA5LCAwIH0sCisgICAgeyAiOEUyIiwgMTAsIDAgfSwKKyNlbmRpZiAvKiBIV1BBUklUWSAqLworICAgIHsgIjhOMSIsIDgsIDAgfSwKKyNpZmRlZiBIV1BBUklUWQorICAgIHsgIjhOMiIsIDExLCAwIH0sCisgICAgeyAiOE8xIiwgMTIsIDAgfSwKKyAgICB7ICI4TzIiLCAxMywgMCB9LAorI2VuZGlmIC8qIEhXUEFSSVRZICovCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuc2VydGJsID0gKHNpemVvZihzZXJ0YmwpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKK3N0YXRpYyBjaGFyICogc2VybmFtW10gPSB7ICAgICAgICAgICAgICAvKiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIHNlcnRibFtdICovCisgICI3RTEiLCAiN0UyIiwgIjdNMSIsICI3TTIiLCAiN08xIiwgIjdPMiIsICI3UzEiLCAiN1MyIiwKKyAgIjhOMSIsICI4RTEiLCAiOEUyIiwgIjhOMiIsICI4TzEiLCAiOE8yIgorfTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgb3B0c3RhYltdID0geyAgICAgIC8qIFNFVCBPUFRJT05TIHRhYmxlICovCisjaWZuZGVmIE5PRlJJTExTCisgICAgeyAiZGVsZXRlIiwgICAgWFhERUwsICAgMH0sICAgICAgICAgICAgLyogREVMRVRFICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyAgICB7ICJkaXJlY3RvcnkiLCBYWERJUiwgICAwfSwgICAgICAgICAvKiBESVJFQ1RPUlkgKi8KKyNpZmRlZiBDS1BVUkdFCisgICAgeyAicHVyZ2UiLCAgICAgWFhQVVJHRSwgMH0sICAgICAgICAgLyogUFVSR0UgKi8KKyNlbmRpZiAvKiBDS1BVUkdFICovCisgICAgeyAidHlwZSIsICAgICAgWFhUWVAsICAgMH0sICAgICAgICAgLyogVFlQRSAqLworICAgIHsgIiIsIDAsIDB9Cit9Oworc3RhdGljIGludCBub3B0c3RhYiA9ICAoc2l6ZW9mKG9wdHN0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKKyNpZm5kZWYgTk9YRkVSCisvKgorICBQUk9UT0NPTCBTRUxFQ1RJT04uICBLZXJtaXQgaXMgYWx3YXlzIGF2YWlsYWJsZS4gIElmIENLX1hZWiBpcyBkZWZpbmVkIGF0CisgIGNvbXBpbGUgdGltZSwgdGhlbiB0aGUgb3RoZXJzIGJlY29tZSBzZWxlY3Rpb25zIGFsc28uICBJbiBPUy8yIGFuZAorICBXaW5kb3dzLCB0aGV5IGFyZSBpbnRlZ3JhdGVkIGFuZCB0aGUgdmFyaW91cyBTRVQgY29tbWFuZHMgKGUuZy4gInNldCBmaWxlCisgIHR5cGUiKSBhZmZlY3QgdGhlbSBhcyB0aGV5IHdvdWxkIEtlcm1pdC4gIEluIG90aGVyIE9TJ3MgKFVOSVgsIFZNUywgZXRjKSwKKyAgdGhleSBhcmUgZXh0ZXJuYWwgcHJvdG9jb2xzIHdoaWNoIGFyZSBydW4gdmlhIEtlcm1pdCdzIFJFRElSRUNUIG1lY2hhbmlzbS4KKyAgQWxsIHdlIGRvIGlzIGNvbGxlY3QgYW5kIHZlcmlmeSB0aGUgZmlsZW5hbWVzIGFuZCBwYXNzIHRoZW0gYWxvbmcgdG8gdGhlCisgIGV4dGVybmFsIHByb3RvY29sLgorKi8KK3N0cnVjdCBrZXl0YWIgcHJvdG9zW10gPSB7CisjaWZkZWYgQ0tfWFlaCisgICAgImciLCAgICAgICAgICBQUk9UT19HLCAgQ01fSU5WLAorI2VuZGlmIC8qIENLX1hZWiAqLworICAgICJrZXJtaXQiLCAgICAgUFJPVE9fSywgIDAsCisjaWZkZWYgQ0tfWFlaCisgICAgIm90aGVyIiwgICAgICBQUk9UT19PLCAgMCwKKyAgICAieCIsICAgICAgICAgIFBST1RPX1gsICBDTV9JTlZ8Q01fQUJSLAorICAgICJ4bW9kZW0iLCAgICAgUFJPVE9fWCwgIDAsCisgICAgInhtb2RlbS1jcmMiLCBQUk9UT19YQywgMCwKKyAgICAieSIsICAgICAgICAgIFBST1RPX1ksICBDTV9JTlZ8Q01fQUJSLAorICAgICJ5bW9kZW0iLCAgICAgUFJPVE9fWSwgIDAsCisgICAgInltb2RlbS1nIiwgICBQUk9UT19HLCAgMCwKKyAgICAiem1vZGVtIiwgICAgIFBST1RPX1osICAwCisjZW5kaWYgLyogQ0tfWFlaICovCit9OworaW50IG5wcm90b3MgPSAgKHNpemVvZihwcm90b3MpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2RlZmluZSBYUENNRExFTiA3MQorCitfUFJPVE9UWVAoc3RhdGljIGludCBwcm90b2ZpZWxkLCAoY2hhciAqLCBjaGFyICosIGNoYXIgKikpOworX1BST1RPVFlQKHN0YXRpYyBpbnQgc2V0cHJvdG8sICh2b2lkKSk7CisKK3N0YXRpYyBpbnQKK3Byb3RvZmllbGQoY3VycmVudCwgaGVscCwgcHgpIGNoYXIgKiBjdXJyZW50LCAqIGhlbHAsICogcHg7IHsKKworICAgIGNoYXIgKnMsIHRtcGJ1ZltYUENNRExFTisxXTsKKyAgICBpbnQgeDsKKworICAgIGlmIChjdXJyZW50KSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFB1dCBicmFjZXMgYXJvdW5kIGRlZmF1bHQgKi8KKyAgICAgIGNrbWFrbXNnKHRtcGJ1ZixUTVBCVUZTSVosInsiLGN1cnJlbnQsIn0iLE5VTEwpOworICAgIGVsc2UKKyAgICAgIHRtcGJ1ZlswXSA9IE5VTDsKKworICAgIGlmICgoeCA9IGNtZmxkKGhlbHAsIChjaGFyICopdG1wYnVmLCAmcywgeHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgaWYgKChpbnQpc3RybGVuKHMpID4gWFBDTURMRU4pIHsKKyAgICAgICAgcHJpbnRmKCI/U29ycnkgLSBtYXhpbXVtIGxlbmd0aCBpcyAlZFxuIiwgWFBDTURMRU4pOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0gZWxzZSBpZiAoKnMpIHsKKyAgICAgICAgc3RyY3B5KHB4LHMpOyAgICAgICAgICAgICAgICAgICAvKiBzYWZlICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgcHggPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4oeCk7Cit9CisKK3N0YXRpYyBpbnQKK3NldHByb3RvKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWxlY3QgYSBmaWxlIHRyYW5zZmVyIHByb3RvY29sICovCisgICAgLyogY2hhciAqIHMgPSBOVUxMOyAqLworICAgIGludCB4ID0gMCwgeTsKKyAgICBjaGFyIHMxW1hQQ01ETEVOKzFdLCBzMltYUENNRExFTisxXSwgczNbWFBDTURMRU4rMV07CisgICAgY2hhciBzNFtYUENNRExFTisxXSwgczVbWFBDTURMRU4rMV0sIHM2W1hQQ01ETEVOKzFdLCBzN1tYUENNRExFTisxXTsKKyAgICBjaGFyICogcDEgPSBzMSwgKiBwMiA9IHMyLCAqcDMgPSBzMzsKKyAgICBjaGFyICogcDQgPSBzNCwgKiBwNSA9IHM1LCAqcDYgPSBzNiwgKnA3ID0gczc7CisKKyNpZmRlZiBYWVpfSU5URVJOQUwKKyAgICBleHRlcm4gaW50IHBfYXZhaWw7CisjZWxzZQorI2lmbmRlZiBDS19SRURJUgorICAgIHggPSAxOworI2VuZGlmIC8qIENLX1JFRElSICovCisjZW5kaWYgLyogWFlaX0lOVEVSTkFMICovCisgICAgczFbMF0gPSBOVUw7CisgICAgczJbMF0gPSBOVUw7CisgICAgczNbMF0gPSBOVUw7CisgICAgczRbMF0gPSBOVUw7CisgICAgczVbMF0gPSBOVUw7CisgICAgczZbMF0gPSBOVUw7CisKKyAgICBpZiAoKHkgPSBjbWtleShwcm90b3MsbnByb3RvcywiIiwia2VybWl0Iix4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih5KTsKKworICAgIGlmICh4ICYmIHkgIT0gUFJPVE9fSykgeworICAgICAgICBwcmludGYoCisgICAgICAgICAgICI/U29ycnksIFJFRElSRUNUIGNhcGFiaWxpdHkgcmVxdWlyZWQgZm9yIGV4dGVybmFsIHByb3RvY29scy5cbiIpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAoKHggPSBwcm90b2ZpZWxkKHB0YWJbeV0uaF9iX2luaXQsCisgICAgICJPcHRpb25hbCBjb21tYW5kIHRvIHNlbmQgdG8gaG9zdCBwcmlvciB0byB1cGxvYWRpbmcgaW4gYmluYXJ5IG1vZGUiLAorICAgICAgICAgICAgICAgcDEpKSA8IDApIHsKKyAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgIHByb3RvY29sID0geTsgICAgICAgICAgICAgICAvKiBTZXQgcHJvdG9jb2wgYnV0IGRvbid0IGNoYW5nZSAqLworICAgICAgICAgICAgcmV0dXJuKDEpOyAgICAgICAgICAgICAgICAgIC8qIGFueXRoaW5nIGVsc2UgKi8KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcmV0dXJuKHgpOworICAgIH0KKyAgICBpZiAoKHggPSBwcm90b2ZpZWxkKHB0YWJbeV0uaF90X2luaXQsCisgICAgICJPcHRpb25hbCBjb21tYW5kIHRvIHNlbmQgdG8gaG9zdCBwcmlvciB0byB1cGxvYWRpbmcgaW4gdGV4dCBtb2RlIiwKKyAgICAgICAgICAgICAgIHAyKSkgPCAwKSB7CisgICAgICAgIGlmICh4ID09IC0zKQorICAgICAgICAgIGdvdG8gcHJvdG9leGl0OworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuKHgpOworICAgIH0KKworICAgIGlmICh5ID09IFBST1RPX0spIHsKKyAgICAgICAgaWYgKCh4ID0gcHJvdG9maWVsZChwdGFiW3ldLmhfeF9pbml0LAorICAgICAgICAgICAgICAgICAgICAiT3B0aW9uYWwgY29tbWFuZCB0byBzZW5kIHRvIGhvc3QgdG8gc3RhcnQgS2VybWl0IHNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDMpKSA8IDApIHsKKyAgICAgICAgICAgIGlmICh4ID09IC0zKQorICAgICAgICAgICAgICBnb3RvIHByb3RvZXhpdDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICB9CisgICAgfQorCisKKyNpZm5kZWYgWFlaX0lOVEVSTkFMICAgICAgICAgICAgICAgICAgICAvKiBJZiBYWVpNT0RFTSBhcmUgZXh0ZXJuYWwuLi4gKi8KKworICAgIGlmICh5ICE9IFBST1RPX0spIHsKKyAgICAgICAgaWYgKCh4ID0gcHJvdG9maWVsZChwdGFiW3ldLnBfYl9zY21kLAorICAgICAgICAgICAgICAgICAiRXh0ZXJuYWwgY29tbWFuZCB0byBTRU5EIGluIEJJTkFSWSBtb2RlIHdpdGggdGhpcyBwcm90b2NvbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDQpKSA8IDApIHsKKyAgICAgICAgICAgIGlmICh4ID09IC0zKQorICAgICAgICAgICAgICBnb3RvIHByb3RvZXhpdDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICB9CisgICAgICAgIGlmICgoeCA9IHByb3RvZmllbGQocHRhYlt5XS5wX3Rfc2NtZCwKKyAgICAgICAgICAgICAgICAgIkV4dGVybmFsIGNvbW1hbmQgdG8gU0VORCBpbiBURVhUIG1vZGUgd2l0aCB0aGlzIHByb3RvY29sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwNSkpIDwgMCkgeworICAgICAgICAgICAgaWYgKHggPT0gLTMpCisgICAgICAgICAgICAgIGdvdG8gcHJvdG9leGl0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh4ID0gcHJvdG9maWVsZChwdGFiW3ldLnBfYl9yY21kLAorICAgICAgICAgICAgICAgIkV4dGVybmFsIGNvbW1hbmQgdG8gUkVDRUlWRSBpbiBCSU5BUlkgbW9kZSB3aXRoIHRoaXMgcHJvdG9jb2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA2KSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoeCA9PSAtMykKKyAgICAgICAgICAgICAgZ290byBwcm90b2V4aXQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHggPSBwcm90b2ZpZWxkKHB0YWJbeV0ucF90X3JjbWQsCisgICAgICAgICAgICAgICAgICJFeHRlcm5hbCBjb21tYW5kIHRvIFJFQ0VJVkUgaW4gVEVYVCBtb2RlIHdpdGggdGhpcyBwcm90b2NvbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDcpKSA8IDApIHsKKyAgICAgICAgICAgIGlmICh4ID09IC0zKQorICAgICAgICAgICAgICBnb3RvIHByb3RvZXhpdDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFhZWl9JTlRFUk5BTCAqLworCisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSAgICAgICAgICAgICAgLyogQ29uZmlybSB0aGUgY29tbWFuZCAqLworICAgICAgcmV0dXJuKHgpOworCitwcm90b2V4aXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbW9uIGV4aXQgZnJvbSB0aGlzIHJvdXRpbmUgKi8KKworI2lmZGVmIFhZWl9JTlRFUk5BTAorICAgIGlmICghcF9hdmFpbCkgeworICAgICAgICBibGVlcChCUF9XQVJOKTsKKyAgICAgICAgcHJpbnRmKCJcbj9YLFksIGFuZCBabW9kZW0gYXJlIHVuYXZhaWxhYmxlXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICB9CisjZW5kaWYgLyogWFlaX0lOVEVSTkFMICovCisKKyAgICBwMSA9IGJyc3RyaXAocDEpOworICAgIHAyID0gYnJzdHJpcChwMik7CisgICAgcDMgPSBicnN0cmlwKHAzKTsKKyAgICBwNCA9IGJyc3RyaXAocDQpOworICAgIHA1ID0gYnJzdHJpcChwNSk7CisgICAgcDYgPSBicnN0cmlwKHA2KTsKKyAgICBwNyA9IGJyc3RyaXAocDcpOworICAgIGluaXRwcm90byh5LHAxLHAyLHAzLHA0LHA1LHA2LHA3KTsKKyAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworfQorCitpbnQKK3NldGRlc3QoKSB7CisgICAgaW50IHgsIHk7CisgICAgaWYgKCh5ID0gY21rZXkoZGVzdHRhYixuZGVzdHMsIiIsImRpc2siLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgZGVzdCA9IHk7CisgICAgcmV0dXJuKDEpOworfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgREVDTkVUCitzdHJ1Y3Qga2V5dGFiIGRuZXR0YWJbXSA9IHsKKyNpZm5kZWYgT1MyT05MWQorICAgICJjdGVybSIsIE5QX0NURVJNLCAwLAorI2VuZGlmIC8qIE9TMk9OTFkgKi8KKyAgICAibGF0IiwgICBOUF9MQVQsICAgMAorfTsKK2ludCBuZG5ldCA9ICAoc2l6ZW9mKGRuZXR0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKyNlbmRpZiAvKiBERUNORVQgKi8KKworLyogIFMgRSBUIFAgUiBJIE4gVCBFIFIgIC0tICBTRVQgUFJJTlRFUiBjb21tYW5kICAqLworCisjaWZkZWYgUFJJTlRTV0kKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHBybnRhYltdID0geyAgICAgICAvKiBTRVQgUFJJTlRFUiBzd2l0Y2hlcyAqLworICAgICIvYmlkaXJlY3Rpb25hbCIsICAgIFBSTl9CSUQsIDAsCisjaWZkZWYgT1MyCisgICAgIi9jaGFyYWN0ZXItc2V0IiwgICAgUFJOX0NTLCAgQ01fQVJHLAorI2VuZGlmIC8qIE9TMiAqLworICAgICIvY29tbWFuZCIsICAgICAgICAgIFBSTl9QSVAsIENNX0FSRywKKyAgICAiL2Rvcy1kZXZpY2UiLCAgICAgICBQUk5fRE9TLCBDTV9BUkcsCisgICAgIi9lbmQtb2Ytam9iLXN0cmluZyIsUFJOX1RSTSwgQ01fQVJHLAorICAgICIvZmlsZSIsICAgICAgICAgICAgIFBSTl9GSUwsIENNX0FSRywKKyNpZmRlZiBCUFJJTlQKKyAgICAiL2Zsb3ctY29udHJvbCIsICAgICBQUk5fRkxPLCBDTV9BUkcsCisjZW5kaWYgLyogQlBSSU5UICovCisgICAgIi9qb2ItaGVhZGVyLWZpbGUiLCAgUFJOX1NFUCwgQ01fQVJHLAorI2lmZGVmIE9TMgorICAgICIvbGVuZ3RoIiwgICAgICAgICAgIFBSTl9MRU4sIENNX0FSRywKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAiL25vbmUiLCAgICAgICAgICAgICBQUk5fTk9OLCAwLAorI2lmZGVmIE9TMgorICAgICIvbm9wb3N0c2NyaXB0IiwgICAgIFBSTl9SQVcsIDAsCisgICAgIi9ub3BzIiwgICAgICAgICAgICAgUFJOX1JBVywgQ01fSU5WLAorI2VuZGlmIC8qIE9TMiAqLworICAgICIvb3V0cHV0LW9ubHkiLCAgICAgIFBSTl9PVVQsIDAsCisjaWZkZWYgQlBSSU5UCisgICAgIi9wYXJpdHkiLCAgICAgICAgICAgUFJOX1BBUiwgQ01fQVJHLAorI2VuZGlmIC8qIEJQUklOVCAqLworICAgICIvcGlwZSIsICAgICAgICAgICAgIFBSTl9QSVAsIENNX0FSR3xDTV9JTlYsCisjaWZkZWYgT1MyCisgICAgIi9wb3N0c2NyaXB0IiwgICAgICAgUFJOX1BTLCAgMCwKKyAgICAiL3BzIiwgICAgICAgICAgICAgICBQUk5fUFMsICBDTV9JTlYsCisjZW5kaWYgLyogT1MyICovCisgICAgIi9zZXBhcmF0b3IiLCAgICAgICAgUFJOX1NFUCwgQ01fQVJHfENNX0lOViwKKyNpZmRlZiBCUFJJTlQKKyAgICAiL3NwZWVkIiwgICAgICAgICAgICBQUk5fU1BELCBDTV9BUkcsCisjZW5kaWYgLyogQlBSSU5UICovCisgICAgIi90aW1lb3V0IiwgICAgICAgICAgUFJOX1RNTywgQ01fQVJHLAorICAgICIvdGVybWluYXRvciIsICAgICAgIFBSTl9UUk0sIENNX0FSR3xDTV9JTlYsCisjaWZkZWYgT1MyCisjaWZkZWYgTlQKKyAgICAiL3ciLCAgICAgICAgICAgICAgICBQUk5fV0lOLCBDTV9BUkd8Q01fQUJSfENNX0lOViwKKyAgICAiL3dpIiwgICAgICAgICAgICAgICBQUk5fV0lOLCBDTV9BUkd8Q01fQUJSfENNX0lOViwKKyNlbmRpZiAvKiBOVCAqLworICAgICIvd2lkdGgiLCAgICAgICAgICAgIFBSTl9XSUQsIENNX0FSRywKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBOVAorICAgICIvd2luZG93cy1xdWV1ZSIsICAgIFBSTl9XSU4sIENNX0FSRywKKyNlbmRpZiAvKiBOVCAqLworICAgICIiLCAgICAgICAgICAgICAgICAgMCwgICAgICAwCit9OworaW50IG5wcm5zd2kgPSAgKHNpemVvZihwcm50YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisjZW5kaWYgLyogUFJJTlRTV0kgKi8KKworc3RhdGljIGludAorc2V0cHJpbnRlcih4eCkgaW50IHh4OyB7CisgICAgaW50IHgsIHk7CisgICAgY2hhciAqIHM7CisgICAgY2hhciAqIGRlZm5hbWUgPSBOVUxMOworI2lmZGVmIE9TMgorICAgIGV4dGVybiBpbnQgcHJuY3M7CisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBCUFJJTlQKKyAgICBjaGFyIHBvcnRidWZbNjRdOworICAgIGxvbmcgcG9ydHNwZWVkID0gMEw7CisgICAgaW50IHBvcnRwYXJpdHkgPSAwOworICAgIGludCBwb3J0ZmxvdyA9IDA7CisjZW5kaWYgLyogQlBSSU5UICovCisKKyNpZmRlZiBQUklOVFNXSQorICAgIGludCBjLCBpLCBuLCB3aWxkLCBjb25maXJtZWQgPSAwOyAgIC8qIFdvcmtlcnMgKi8KKyAgICBpbnQgZ2V0dmFsID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBXaGV0aGVyIHRvIGdldCBzd2l0Y2ggdmFsdWUgKi8KKyAgICBzdHJ1Y3Qgc3RyaW5naW50IHsgICAgICAgICAgICAgICAgICAvKiBUZW1wb3JhcnkgYXJyYXkgZm9yIHN3aXRjaCB2YWx1ZXMgKi8KKyAgICAgICAgY2hhciAqIHN2YWw7CisgICAgICAgIGludCBpdmFsOworICAgIH0gcHZbUFJOX01BWCsxXTsKKyAgICBzdHJ1Y3QgRkRCIHN3LCBvZiwgY207ICAgICAgICAgICAgICAvKiBGREJzIGZvciBlYWNoIHBhcnNlIGZ1bmN0aW9uICovCisgICAgaW50IGhhdmVxdWUgPSAwOworICAgIGludCB0eXBlc2V0ID0gMDsKKyNlbmRpZiAvKiBQUklOVFNXSSAqLworCisjaWZkZWYgTlQKKyAgICBzdHJ1Y3Qga2V5dGFiICogcHJpbnR0YWIgPSBOVUxMLCAqIF9wcmludHRhYiA9IE5VTEw7CisgICAgaW50IG5wcmludCA9IDAsIHByaW50ZGVmPTA7CisjZW5kaWYgLyogTlQgKi8KKworI2lmZGVmIE9TMgorICAgIGRlZm5hbWUgPSAiUFJOIjsgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgZGVmbmFtZSA9ICJMUFQ6IjsKKyNlbHNlCisjaWZkZWYgVU5JWAorICAgIGRlZm5hbWUgPSAifGxwciI7CisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgUFJJTlRTV0kKKyNpZmRlZiBOVAorICAgIGhhdmVxdWUgPSBXaW4zMkVudW1QcnQoJnByaW50dGFiLCZfcHJpbnR0YWIsJm5wcmludCwmcHJpbnRkZWYpOworICAgIGhhdmVxdWUgPSBoYXZlcXVlICYmIG5wcmludDsKKyNlbmRpZiAvKiBOVCAqLworCisgICAgZm9yIChpID0gMDsgaSA8PSBQUk5fTUFYOyBpKyspIHsgICAgLyogSW5pdGlhbGl6ZSBzd2l0Y2ggdmFsdWVzICovCisgICAgICAgIHB2W2ldLnN2YWwgPSBOVUxMOyAgICAgICAgICAgICAgLyogdG8gbnVsbCBwb2ludGVycyAqLworICAgICAgICBwdltpXS5pdmFsID0gLTE7ICAgICAgICAgICAgICAgIC8qIGFuZCAtMSBpbnQgdmFsdWVzICovCisgICAgfQorICAgIGlmICh4eCA9PSBYWUJEQ1ApIHsgICAgICAgICAgICAgICAgIC8qIFNFVCBCUFJJTlRFUiA9PSAvQklESVJFQ1RJT05BTCAqLworICAgICAgICBwdltQUk5fQklEXS5pdmFsID0gMTsKKyAgICAgICAgcHZbUFJOX09VVF0uaXZhbCA9IDA7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBkZWZhdWx0cyBiYXNlZCB1cG9uIGN1cnJlbnQgcHJpbnRlciBzZXR0aW5ncyAqLworICAgIGlmIChwcmludGVybmFtZSkgeworICAgICAgICBkZWZuYW1lID0gcHJpbnRlcm5hbWU7CisgICAgICAgIHN3aXRjaCAocHJpbnRlcnR5cGUpIHsKKyAgICAgICAgICBjYXNlIFBSVF9XSU46IHB2W1BSTl9XSU5dLml2YWwgPSAxOyBicmVhazsKKyAgICAgICAgICBjYXNlIFBSVF9ET1M6IHB2W1BSTl9ET1NdLml2YWwgPSAxOyBicmVhazsKKyAgICAgICAgICBjYXNlIFBSVF9QSVA6IHB2W1BSTl9QSVBdLml2YWwgPSAxOyBicmVhazsKKyAgICAgICAgICBjYXNlIFBSVF9GSUw6IHB2W1BSTl9GSUxdLml2YWwgPSAxOyBicmVhazsKKyAgICAgICAgICBjYXNlIFBSVF9OT046IHB2W1BSTl9OT05dLml2YWwgPSAxOyBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBCUFJJTlQKKyAgICAvKiBvbmx5IHNldCB0aGUgQklESSBmbGFnIGlmIHdlIGFyZSBiaWRpICovCisgICAgaWYgKHByaW50YmlkaSkKKyAgICAgICAgcHZbUFJOX0JJRF0uaXZhbCA9IDE7CisKKyAgICAvKiBzZXJpYWwgcG9ydCBwYXJhbWV0ZXJzIG1heSBiZSBzZXQgZm9yIG5vbi1iaWRpIGRldmljZXMgKi8KKyAgICBwdltQUk5fU1BEXS5pdmFsID0gcHBvcnRzcGVlZCAvIDEwTDsKKyAgICBwdltQUk5fUEFSXS5pdmFsID0gcHBvcnRwYXJpdHk7CisgICAgcHZbUFJOX0ZMT10uaXZhbCA9IHBwb3J0ZmxvdzsKKyNlbmRpZiAvKiBCUFJJTlQgKi8KKyAgICBpZiAocHJpbnR0aW1vKQorICAgICAgICBwdltQUk5fVE1PXS5pdmFsID0gcHJpbnR0aW1vOworICAgIGlmIChwcmludHRlcm0pIHsKKyAgICAgICAgcHZbUFJOX1RSTV0uaXZhbCA9IDE7CisgICAgICAgIG1ha2VzdHIoJnB2W1BSTl9UUk1dLnN2YWwscHJpbnR0ZXJtKTsKKyAgICB9CisgICAgaWYgKHByaW50c2VwKSB7CisgICAgICAgIHB2W1BSTl9TRVBdLml2YWwgPSAxOworICAgICAgICBtYWtlc3RyKCZwdltQUk5fU0VQXS5zdmFsLHByaW50c2VwKTsKKyAgICB9CisgICAgaWYgKHR4dDJwcykgeworICAgICAgICBwdltQUk5fUFNdLml2YWwgPSAxOworICAgICAgICBwdltQUk5fV0lEXS5pdmFsID0gcHNfd2lkdGg7CisgICAgICAgIHB2W1BSTl9MRU5dLml2YWwgPSBwc19sZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHZbUFJOX1JBV10uaXZhbCA9IDE7CisgICAgfQorCisgICAgLyogU2V0IHVwIGNoYWluZWQgcGFyc2UgZnVuY3Rpb25zLi4uICovCisKKyAgICBjbWZkYmkoJnN3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBGREIgLSBjb21tYW5kIHN3aXRjaGVzICovCisgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIlN3aXRjaCIsICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgbnBybnN3aSwgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKyAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICBwcm50YWIsICAgICAgICAgICAgICAgICAgICAgIC8qIEtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgICAgJmNtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICk7CisgICAgY21mZGJpKCZjbSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2Vjb25kIGZkYiBmb3IgY29uZmlybWF0aW9uICovCisgICAgICAgICAgIF9DTUNGTSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICZvZgorICAgICAgICAgICApOworICAgIGNtZmRiaSgmb2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXJkIEZEQiBmb3IgcHJpbnRlciBuYW1lICovCisgICAgICAgICAgIF9DTU9GSSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIlByaW50ZXIgb3IgZmlsZSBuYW1lIiwgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgZGVmbmFtZSwgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgKi8KKyAgICAgICAgICAgTlVMTAorICAgICAgICAgICApOworCisgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFyc2UgMCBvciBtb3JlIHN3aXRjaGVzICovCisgICAgICAgIHggPSBjbWZkYigmc3cpOyAgICAgICAgICAgICAgICAgLyogUGFyc2Ugc3dpdGNoIG9yIG90aGVyIHRoaW5nICovCisgICAgICAgIGRlYnVnKEYxMDEsInNldHByaW50ZXIgY21mZGIiLCIiLHgpOworICAgICAgICBpZiAoeCA8IDApICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgZ290byB4c2V0cHJuOyAgICAgICAgICAgICAgICAgLyogb3IgcmVwYXJzZSBuZWVkZWQgKi8KKyAgICAgICAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkgICAvKiBCcmVhayBvdXQgaWYgbm90IGEgc3dpdGNoICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChjbXJlc3VsdC5mZGJhZGRyICE9ICZzdykgICAgLyogQWR2YW5jZWQgdXNhZ2UgOi0pICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGMgPSBjbWdicmsoKTsgICAgICAgICAgICAgICAgICAgLyogR2V0IGJyZWFrIGNoYXJhY3RlciAqLworICAgICAgICBnZXR2YWwgPSAoYyA9PSAnOicgfHwgYyA9PSAnPScpOyAvKiB0byBzZWUgaG93IHRoZXkgZW5kZWQgdGhlIHN3aXRjaCAqLworICAgICAgICBuID0gY21yZXN1bHQubnJlc3VsdDsgICAgICAgICAgIC8qIE51bWVyaWMgcmVzdWx0ID0gc3dpdGNoIHZhbHVlICovCisgICAgICAgIGRlYnVnKEYxMDEsInNldHByaW50ZXIgc3dpdGNoIiwiIixuKTsKKworICAgICAgICBzd2l0Y2ggKG4pIHsgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3MgdGhlIHN3aXRjaCAqLworICAgICAgICAgIGNhc2UgUFJOX1BTOiAgICAgICAgICAgICAgICAgIC8qIFRleHQgdG8gUG9zdHNjcmlwdCAqLworICAgICAgICAgICAgcHZbUFJOX1BTXS5pdmFsID0gMTsKKyAgICAgICAgICAgIHB2W1BSTl9CSURdLml2YWwgPSAwOworICAgICAgICAgICAgcHZbUFJOX09VVF0uaXZhbCA9IDE7CisgICAgICAgICAgICBwdltQUk5fUkFXXS5pdmFsID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBQUk5fUkFXOiAgICAgICAgICAgICAgICAgLyogTm9uLVBvc3RzY3JpcHQgKi8KKyAgICAgICAgICAgIHB2W1BSTl9QU10uaXZhbCA9IDA7CisgICAgICAgICAgICBwdltQUk5fUkFXXS5pdmFsID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBQUk5fQklEOiAgICAgICAgICAgICAgICAgLyogQmlkaXJlY3Rpb25hbCAqLworICAgICAgICAgICAgcHZbUFJOX0JJRF0uaXZhbCA9IDE7CisgICAgICAgICAgICBwdltQUk5fT1VUXS5pdmFsID0gMDsKKyAgICAgICAgICAgIHB2W1BSTl9QU10uaXZhbCA9IDA7CisgICAgICAgICAgICBwdltQUk5fUkFXXS5pdmFsID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBQUk5fT1VUOiAgICAgICAgICAgICAgICAgLyogT3V0cHV0LW9ubHkgKi8KKyAgICAgICAgICAgIHB2W1BSTl9PVVRdLml2YWwgPSAxOworICAgICAgICAgICAgcHZbUFJOX0JJRF0uaXZhbCA9IDA7CisgICAgICAgICAgICBwdltQUk5fUFNdLml2YWwgPSAwOworICAgICAgICAgICAgcHZbUFJOX1JBV10uaXZhbCA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgUFJOX05PTjogICAgICAgICAgICAgICAgIC8qIE5PTkUgKi8KKyAgICAgICAgICAgIHR5cGVzZXQrKzsKKyAgICAgICAgICAgIHB2W25dLml2YWwgPSAxOworICAgICAgICAgICAgcHZbUFJOX1NQRF0uaXZhbCA9IDA7CisgICAgICAgICAgICBwdltQUk5fUEFSXS5pdmFsID0gMDsKKyAgICAgICAgICAgIHB2W1BSTl9GTE9dLml2YWwgPSBGTE9fS0VFUDsKKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgVU5JWAorICAgICAgICAgIGNhc2UgUFJOX1dJTjoKKyNlbmRpZiAvKiBVTklYICovCisgICAgICAgICAgY2FzZSBQUk5fRE9TOiAgICAgICAgICAgICAgICAgLyogRE9TIHByaW50ZXIgbmFtZSAqLworICAgICAgICAgIGNhc2UgUFJOX0ZJTDogICAgICAgICAgICAgICAgIC8qIE9yIGZpbGVuYW1lICovCisgICAgICAgICAgY2FzZSBQUk5fUElQOgorICAgICAgICAgICAgdHlwZXNldCsrOworICAgICAgICAgICAgaWYgKHB2W25dLnN2YWwpIGZyZWUocHZbbl0uc3ZhbCk7CisgICAgICAgICAgICBwdltuXS5zdmFsID0gTlVMTDsKKyAgICAgICAgICAgIHB2W1BSTl9OT05dLml2YWwgPSAwOyAgICAgICAvKiBaZXJvIGFueSBwcmV2aW91cyBzZWxlY3Rpb25zICovCisgICAgICAgICAgICBwdltQUk5fV0lOXS5pdmFsID0gMDsKKyAgICAgICAgICAgIHB2W1BSTl9ET1NdLml2YWwgPSAwOworICAgICAgICAgICAgcHZbUFJOX0ZJTF0uaXZhbCA9IDA7CisgICAgICAgICAgICBwdltQUk5fUElQXS5pdmFsID0gMDsKKyAgICAgICAgICAgIHB2W25dLml2YWwgPSAxOyAgICAgICAgICAgICAvKiBGbGFnIHRoaXMgb25lICovCisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7ICAgICAgICAgLyogTm8gdmFsdWUgd2FudGVkICovCisKKyAgICAgICAgICAgIGlmIChuID09IFBSTl9GSUwpIHsgICAgICAgICAvKiBGaWxlLCBjaGVjayBhY2Nlc3NpYmlsaXR5ICovCisgICAgICAgICAgICAgICAgaW50IHdpbGQgPSAwOworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtaW9maSgiRmlsZW5hbWUiLCJrZXJtaXQucHJuIiwmcywmd2lsZCx4eHN0cmluZykpPCAwKQorICAgICAgICAgICAgICAgICAgaWYgKHggPT0gLTkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoemNoa28ocykgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ2FuJ3QgY3JlYXRlIFwiJXNcIlxuIixzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBnb3RvIHhzZXRwcm47CisgICAgICAgICAgICAgICAgaWYgKGlzd2lsZChzKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9BIHNpbmdsZSBmaWxlIHBsZWFzZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB2W1BSTl9TUERdLml2YWwgPSAwOworICAgICAgICAgICAgICAgIHB2W1BSTl9QQVJdLml2YWwgPSAwOworICAgICAgICAgICAgICAgIHB2W1BSTl9GTE9dLml2YWwgPSBGTE9fS0VFUDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHggPSBjbWZsZChuID09IFBSTl9ET1MgPyAvKiBWYWx1ZSB3YW50ZWQgLSBwYXJzZSBpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRPUyBwcmludGVyIGRldmljZSBuYW1lIiA6IC8qIEhlbHAgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKG4gPT0gUFJOX1BJUCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbSBuYW1lIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZW5hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPT0gUFJOX0RPUyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFJOIiA6ICAgICAgLyogRGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICApKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geHNldHBybjsKKyAgICAgICAgICAgIHMgPSBicnN0cmlwKHMpOyAgICAgICAgICAgICAvKiBTdHJpcCBlbmNsb3NpbmcgYnJhY2VzICovCisgICAgICAgICAgICB3aGlsZSAoKnMgPT0gU1ApICAgICAgICAgICAgLyogU3RyaXAgbGVhZGluZyBibGFua3MgKi8KKyAgICAgICAgICAgICAgcysrOworICAgICAgICAgICAgaWYgKG4gPT0gUFJOX1BJUCkgeyAgICAgICAgIC8qIElmIC9QSVBFOiAqLworICAgICAgICAgICAgICAgIGlmICgqcyA9PSAnfCcpIHsgICAgICAgIC8qIHN0cmlwIGFueSBleHRyYW5lb3VzIHBpcGUgc2lnbiAqLworICAgICAgICAgICAgICAgICAgICBzKys7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqcyA9PSBTUCkKKyAgICAgICAgICAgICAgICAgICAgICBzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB2W1BSTl9TUERdLml2YWwgPSAwOworICAgICAgICAgICAgICAgIHB2W1BSTl9QQVJdLml2YWwgPSAwOworICAgICAgICAgICAgICAgIHB2W1BSTl9GTE9dLml2YWwgPSBGTE9fS0VFUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoeSA9IHN0cmxlbihzKSkgPiAwKSAgICAvKiBBbnl0aGluZyBsZWZ0PyAqLworICAgICAgICAgICAgICBpZiAocHZbbl0uc3ZhbCA9IChjaGFyICopIG1hbGxvYyh5KzEpKSAvKiBZZXMsIGtlZXAgaXQgKi8KKyAgICAgICAgICAgICAgICBzdHJjcHkocHZbbl0uc3ZhbCxzKTsgICAvKiBzYWZlICovCisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBOVAorICAgICAgICAgIGNhc2UgUFJOX1dJTjogICAgICAgICAgICAgICAgIC8qIFdpbmRvd3MgcXVldWUgbmFtZSAqLworICAgICAgICAgICAgdHlwZXNldCsrOworICAgICAgICAgICAgaWYgKHB2W25dLnN2YWwpIGZyZWUocHZbbl0uc3ZhbCk7CisgICAgICAgICAgICBwdltuXS5zdmFsID0gTlVMTDsKKyAgICAgICAgICAgIHB2W1BSTl9OT05dLml2YWwgPSAwOworICAgICAgICAgICAgcHZbUFJOX0RPU10uaXZhbCA9IDA7CisgICAgICAgICAgICBwdltQUk5fRklMXS5pdmFsID0gMDsKKyAgICAgICAgICAgIHB2W25dLml2YWwgPSAxOworICAgICAgICAgICAgcHZbUFJOX1NQRF0uaXZhbCA9IDA7CisgICAgICAgICAgICBwdltQUk5fUEFSXS5pdmFsID0gMDsKKyAgICAgICAgICAgIHB2W1BSTl9GTE9dLml2YWwgPSBGTE9fS0VFUDsKKworICAgICAgICAgICAgaWYgKCFnZXR2YWwgfHwgIWhhdmVxdWUpCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkoX3ByaW50dGFiLG5wcmludCwiUHJpbnQgcXVldWUgbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJpbnR0YWJbcHJpbnRkZWZdLmt3ZCx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgIGlmICh4ICE9IC0yKQorICAgICAgICAgICAgICAgICAgZ290byB4c2V0cHJuOworCisgICAgICAgICAgICAgICAgaWYgKHB2W1BSTl9XSU5dLnN2YWwpIGZyZWUocHZbUFJOX1dJTl0uc3ZhbCk7CisgICAgICAgICAgICAgICAgcyA9IGF0bWJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoKHkgPSBzdHJsZW4ocykpID4gMCkKKyAgICAgICAgICAgICAgICAgIGlmIChwdltuXS5zdmFsID0gKGNoYXIgKiltYWxsb2MoeSsxKSkKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHB2W25dLnN2YWwscyk7IC8qIHNhZmUgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHB2W1BSTl9XSU5dLnN2YWwpIGZyZWUocHZbUFJOX1dJTl0uc3ZhbCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5wcmludDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh4ID09IHByaW50dGFiW2ldLmt3dmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gcHJpbnR0YWJbaV0ua3dkOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCh5ID0gc3RybGVuKHMpKSA+IDApCisgICAgICAgICAgICAgICAgICBpZiAocHZbbl0uc3ZhbCA9IChjaGFyICopbWFsbG9jKHkrMSkpCisgICAgICAgICAgICAgICAgICAgIHN0cmNweShwdltuXS5zdmFsLHMpOyAvKiBzYWZlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOVCAqLworCisgICAgICAgICAgY2FzZSBQUk5fU0VQOiAgICAgICAgICAgICAgICAgLyogL0pPQi1IRUFERVIgKHNlcGFyYXRvcikgKi8KKyAgICAgICAgICAgIGlmIChwdltuXS5zdmFsKSBmcmVlKHB2W25dLnN2YWwpOworICAgICAgICAgICAgcHZbbl0uc3ZhbCA9IE5VTEw7CisgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsKKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtaWZpKCJGaWxlbmFtZSIsIiIsJnMsJnkseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geHNldHBybjsKKyAgICAgICAgICAgIGlmICh5KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/V2lsZGNhcmRzIG5vdCBhbGxvd2VkXG4iKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgZ290byB4c2V0cHJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh5ID0gc3RybGVuKHMpKSA+IDApCisgICAgICAgICAgICAgIGlmIChwdltuXS5zdmFsID0gKGNoYXIgKikgbWFsbG9jKHkrMSkpCisgICAgICAgICAgICAgICAgc3RyY3B5KHB2W25dLnN2YWwscyk7ICAgLyogc2FmZSAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFBSTl9UTU86ICAgICAgICAgICAgICAgICAvKiAvVElNRU9VVDpudW1iZXIgKi8KKyAgICAgICAgICAgIHB2W25dLml2YWwgPSAwOworICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgaWYgKCh4ID0gY21udW0oIlNlY29uZHMiLCIwIiwxMCwmeSx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgZ290byB4c2V0cHJuOworICAgICAgICAgICAgaWYgKHkgPiA5OTkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSAtIDk5OSBpcyB0aGUgbWF4aW11bVxuIik7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geHNldHBybjsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBwdltuXS5pdmFsID0geTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBQUk5fVFJNOiAgICAgICAgICAgICAgICAgLyogL0VORC1PRi1KT0I6c3RyaW5nICovCisgICAgICAgICAgICBpZiAocHZbbl0uc3ZhbCkgZnJlZShwdltuXS5zdmFsKTsKKyAgICAgICAgICAgIHB2W25dLnN2YWwgPSBOVUxMOworICAgICAgICAgICAgcHZbbl0uaXZhbCA9IDE7CisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiU3RyaW5nIChlbmNsb3NlIGluIGJyYWNlcyBpZiBpdCBjb250YWlucyBzcGFjZXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICBnb3RvIHhzZXRwcm47CisgICAgICAgICAgICBzID0gYnJzdHJpcChzKTsKKyAgICAgICAgICAgIGlmICgoeSA9IHN0cmxlbihzKSkgPiAwKQorICAgICAgICAgICAgICBpZiAocHZbbl0uc3ZhbCA9IChjaGFyICopIG1hbGxvYyh5KzEpKQorICAgICAgICAgICAgICAgIHN0cmNweShwdltuXS5zdmFsLHMpOyAgIC8qIHNhZmUgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgQlBSSU5UCisgICAgICAgICAgY2FzZSBQUk5fRkxPOgorICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkoZmxvdGFiLG5mbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VyaWFsIHByaW50ZXItcG9ydCBmbG93IGNvbnRyb2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ0cy9jdHMiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICBnb3RvIHhzZXRwcm47CisgICAgICAgICAgICBwdltuXS5pdmFsID0geDsKKyAgICAgICAgICAgIGJyZWFrOworCisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgICBjYXNlIFBSTl9TUEQ6CisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIFROX0NPTVBPUlQgaGVyZSB0b28/ICovCisKKyAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KHNwZHRhYiwgICAgICAvKiBTcGVlZCAobm8gZGVmYXVsdCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zcGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VyaWFsIHByaW50ZXItcG9ydCBpbnRlcmZhY2Ugc3BlZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjk2MDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpCisgICAgICAgICAgICAgICAgICkgPCAwKQorICAgICAgICAgICAgICBnb3RvIHhzZXRwcm47CisgICAgICAgICAgICBwdltuXS5pdmFsID0geDsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworICAgICAgICAgIGNhc2UgUFJOX1BBUjoKKyAgICAgICAgICAgIHB2W25dLml2YWwgPSAwOworICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkocGFydGJsLG5wYXIsIlNlcmlhbCBwcmludGVyLXBvcnQgcGFyaXR5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25lIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgZ290byB4c2V0cHJuOworICAgICAgICAgICAgcHZbbl0uaXZhbCA9IHg7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBCUFJJTlQgKi8KKworI2lmZGVmIE9TMgorICAgICAgICAgIGNhc2UgUFJOX0xFTjoKKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtbnVtKCJQUyBwYWdlIGxlbmd0aCIsICI2NiIsMTAsJnkseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geHNldHBybjsKKyAgICAgICAgICAgIHB2W25dLml2YWwgPSB5OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFBSTl9XSUQ6CisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbW51bSgiUFMgcGFnZSB3aWR0aCIsICI4MCIsMTAsJnkseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geHNldHBybjsKKyAgICAgICAgICAgIHB2W25dLml2YWwgPSB5OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFBSTl9DUzoKKyAgICAgICAgICAgICAgcHZbbl0uaXZhbCA9IDA7CisgICAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkoCisjaWZkZWYgQ0tPVU5JCisgICAgICAgICAgICAgICAgICAgICAgIHR4cnRhYixudHhydGFiLAorI2Vsc2UgLyogQ0tPVU5JICovCisgICAgICAgICAgICAgICAgICAgICAgIHR0Y3N0YWIsbnRlcm1jLAorI2VuZGlmIC8qIENLT1VOSSAqLworICAgICAgICAgICAgICAgICAgICAgICAiYXV0by1wcmludC9wcmludHNjcmVlbiBjaGFyYWN0ZXItc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgImNwNDM3Iix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgIGdvdG8geHNldHBybjsKKyAgICAgICAgICAgICAgcHZbbl0uaXZhbCA9IHg7CisgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZigiP1VuZXhwZWN0ZWQgc3dpdGNoIHZhbHVlIC0gJWRcbiIsY21yZXN1bHQubnJlc3VsdCk7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhzZXRwcm47CisgICAgICAgIH0KKyAgICB9CisgICAgbGluZVswXSA9IE5VTDsgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBwcmludGVyIG5hbWUgdmFsdWUgKi8KKyAgICBzd2l0Y2ggKGNtcmVzdWx0LmZjb2RlKSB7ICAgICAgICAgICAvKiBIb3cgZGlkIHdlIGdldCBoZXJlPyAqLworICAgICAgY2FzZSBfQ01PRkk6ICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZXkgdHlwZWQgYSBmaWxlbmFtZSAqLworICAgICAgICBja3N0cm5jcHkobGluZSxjbXJlc3VsdC5zcmVzdWx0LExJTkJVRlNJWik7IC8qIE5hbWUgKi8KKyAgICAgICAgd2lsZCA9IGNtcmVzdWx0Lm5yZXN1bHQ7ICAgICAgICAvKiBXaWxkIGZsYWcgKi8KKyAgICAgICAgaWYgKCF0eXBlc2V0KSB7ICAgICAgICAgICAgICAgICAvKiBBIHByaW50ZXIgbmFtZSB3aXRob3V0IGEgdHlwZSAqLworICAgICAgICAgICAgcHZbUFJOX05PTl0uaXZhbCA9IDA7ICAgICAgIC8qIGlzIHN1cHBvc2VkIHRvIGJlIHRyZWF0ZWQgYXMgICovCisgICAgICAgICAgICBwdltQUk5fV0lOXS5pdmFsID0gMDsgICAgICAgLyogYSBET1Mgb3IgUGlwZSBwcmludGVyLiAgV2UgICAgKi8KKyAgICAgICAgICAgIHB2W1BSTl9GSUxdLml2YWwgPSAwOyAgICAgICAvKiBjbGVhciBhbGwgdGhlIGZsYWdzIGFuZCBsZXQgICAqLworICAgICAgICAgICAgcHZbUFJOX1BJUF0uaXZhbCA9IDA7ICAgICAgIC8qIHRoZSBjb2RlIGJlbG93IGRvcGUgb3V0IHRoZSAgICovCisgICAgICAgICAgICBwdltQUk5fRE9TXS5pdmFsID0gMDsgICAgICAgLyogdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgfQorI2lmZGVmIE5UCisgICAgICAgIGVsc2UgaWYgKHB2W1BSTl9XSU5dLml2YWwgJiYgbG9va3VwKF9wcmludHRhYixsaW5lLG5wcmludCwmeSkpIHsKKyAgICAgICAgICAgIC8qIGludmFsaWQgV2luZG93IFF1ZXVlIG5hbWUgKi8KKyAgICAgICAgICAgIHByaW50ZigiP2ludmFsaWQgV2luZG93cyBQcmludGVyIFF1ZXVlIG5hbWU6IFwiJXNcIlxyXG4iLGxpbmUpOworICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgZ290byB4c2V0cHJuOworICAgICAgICB9CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSAgICAgICAgICAvKiBDb25maXJtIHRoZSBjb21tYW5kICovCisgICAgICAgICAgZ290byB4c2V0cHJuOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgX0NNQ0ZNOiAgICAgICAgICAgICAgICAgICAgICAvKiBUaGV5IGVudGVyZWQgdGhlIGNvbW1hbmQgKi8KKyAgICAgICAgaWYgKHB2W1BSTl9ET1NdLml2YWwgPiAwKQorICAgICAgICAgIGNrc3RybmNweShsaW5lLHB2W1BSTl9ET1NdLnN2YWwgPyBwdltQUk5fRE9TXS5zdmFsIDogIiIsTElOQlVGU0laKTsKKyAgICAgICAgZWxzZSBpZiAocHZbUFJOX1dJTl0uaXZhbCA+IDApCisgICAgICAgICAgY2tzdHJuY3B5KGxpbmUscHZbUFJOX1dJTl0uc3ZhbCA/IHB2W1BSTl9XSU5dLnN2YWwgOiAiIixMSU5CVUZTSVopOworICAgICAgICBlbHNlIGlmIChwdltQUk5fRklMXS5pdmFsID4gMCkKKyAgICAgICAgICBja3N0cm5jcHkobGluZSxwdltQUk5fRklMXS5zdmFsID8gcHZbUFJOX0ZJTF0uc3ZhbCA6ICIiLExJTkJVRlNJWik7CisgICAgICAgIGVsc2UgaWYgKHB2W1BSTl9QSVBdLml2YWwgPiAwKQorICAgICAgICAgIGNrc3RybmNweShsaW5lLHB2W1BSTl9QSVBdLnN2YWwgPyBwdltQUk5fUElQXS5zdmFsIDogIiIsTElOQlVGU0laKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnkgbWlzdGFrZSAqLworICAgICAgICBwcmludGYoIj9VbmV4cGVjdGVkIGZ1bmN0aW9uIGNvZGU6ICVkXG4iLGNtcmVzdWx0LmZjb2RlKTsKKyAgICAgICAgeCA9IC05OworICAgICAgICBnb3RvIHhzZXRwcm47CisgICAgfQorCisjZWxzZSAgLyogTm8gUFJJTlRTV0kgKi8KKworICAgIGlmICgoeCA9IGNtb2ZpKCJQcmludGVyIG9yIGZpbGUgbmFtZSIsZGVmbmFtZSwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih4KTsKKyAgICBpZiAoeCA+IDEpIHsKKyAgICAgICAgcHJpbnRmKCI/RGlyZWN0b3J5IG5hbWVzIG5vdCBhbGxvd2VkXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgd2hpbGUgKCpzID09IFNQIHx8ICpzID09IEhUKSBzKys7ICAgLyogVHJpbSBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKyAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7ICAgICAgICAvKiBNYWtlIGEgdGVtcG9yYXJ5IHNhZmUgY29weSAqLworICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOyAgIC8qIENvbmZpcm0gdGhlIGNvbW1hbmQgKi8KKyNlbmRpZiAvKiBQUklOVFNXSSAqLworCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlciAmJiAoaXNndWVzdAorI2lmbmRlZiBOT1NFUlZFUgorICAgICAgICAgICAgICAgICAgICAgfHwgIUVOQUJMRUQoZW5fcHJpKQorI2VuZGlmIC8qIE5PU0VSVkVSICovCisgICAgICAgICAgICAgICAgICAgICApKSB7CisgICAgICAgIHByaW50ZigiU29ycnksIHByaW50aW5nIGRpc2FibGVkXHJcbiIpOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgIH0KKyNlbmRpZiAvKiBJU0tEICovCisKKyNpZmRlZiBQUklOVFNXSQorI2lmZGVmIEJQUklOVAorICAgIGlmIChwcmludGJpZGkpIHsgICAgICAgICAgICAgICAgICAgIC8qIElmIGJpZGkgcHJpbnRpbmcgYWN0aXZlICovCisjaWZuZGVmIFVOSVgKKyAgICAgICAgYnBydHN0b3AoKTsgICAgICAgICAgICAgICAgICAgICAvKiBTdG9wIGl0IGJlZm9yZSBwcm9jZWVkaW5nICovCisjZW5kaWYgLyogVU5JWCAqLworICAgICAgICBwcmludGJpZGkgPSAwOworICAgIH0KKyAgICBpZiAocHZbUFJOX1NQRF0uaXZhbCA+IDApIHsKKyAgICAgICAgcG9ydHNwZWVkID0gKGxvbmcpIHB2W1BSTl9TUERdLml2YWwgKiAxMEw7CisgICAgICAgIGlmIChwb3J0c3BlZWQgPT0gNzBMKSBwb3J0c3BlZWQgPSA3NUw7CisgICAgfQorICAgIGlmIChwdltQUk5fUEFSXS5pdmFsID4gMCkKKyAgICAgICAgcG9ydHBhcml0eSA9IHB2W1BSTl9QQVJdLml2YWw7CisgICAgaWYgKHB2W1BSTl9GTE9dLml2YWwgPiAwKQorICAgICAgICBwb3J0ZmxvdyA9IHB2W1BSTl9GTE9dLml2YWw7CisjZW5kaWYgLyogQlBSSU5UICovCisjZW5kaWYgLyogUFJJTlRTV0kgKi8KKworICAgIHMgPSBsaW5lOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByaW50ZXIgbmFtZSwgaWYgZ2l2ZW4gKi8KKworI2lmZGVmIE9TMk9SVU5JWAorI2lmZGVmIFBSSU5UU1dJCisgICAgaWYgKHB2W1BSTl9QSVBdLml2YWwgPiAwKSB7ICAgICAgICAgLyogL1BJUEUgd2FzIGdpdmVuPyAqLworICAgICAgICBwcmludHBpcGUgPSAxOworICAgICAgICBub3ByaW50ZXIgPSAwOworICAgICAgICBpZiAoKnMgPT0gICd8JykgeyAgICAgICAgICAgICAgIC8qIEl0IG1pZ2h0IHN0aWxsIGhhdmUgYSBwaXBlIHNpZ24gKi8KKyAgICAgICAgICAgIHMrKzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBuYW1lIGdpdmUgbGF0ZXIgKi8KKyAgICAgICAgICAgIHdoaWxlICgqcyA9PSBTUCkgICAgICAgICAgICAvKiBzbyByZW1vdmUgaXQgYW5kIHNwYWNlcyAqLworICAgICAgICAgICAgICBzKys7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBQUklOVFNXSSAqLworICAgICAgaWYgKCpzID09ICd8JykgeyAgICAgICAgICAgICAgICAgIC8qIE9yIHBpcGUgaW1wbGllZCBieSBuYW1lPyAqLworICAgICAgICAgIHMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHBhc3QgcGlwZSBzaWduICovCisgICAgICAgICAgd2hpbGUgKCpzID09IFNQKSAgICAgICAgICAgICAgLyogR29iYmxlIHdoaXRlc3BhY2UgKi8KKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICBpZiAoKnMpIHsKKyAgICAgICAgICAgICAgcHJpbnRwaXBlID0gMTsKKyAgICAgICAgICAgICAgbm9wcmludGVyID0gMDsKKyAgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50cGlwZSA9IDA7CisgICAgICB9CisKKyNpZmRlZiBQUklOVFNXSQorI2lmZGVmIEJQUklOVAorICAgIGlmIChwcmludHBpcGUgJiYgcHZbUFJOX0JJRF0uaXZhbCA+IDApIHsKKyAgICAgICAgcHJpbnRmKCI/U29ycnksIHBpcGVzIG5vdCBhbGxvd2VkIGZvciBiaWRpcmVjdGlvbmFsIHByaW50ZXJcbiIpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyNlbmRpZiAvKiBCUFJJTlQgKi8KKyNlbmRpZiAvKiBQUklOVFNXSSAqLworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworCisjaWZkZWYgT1MyCisgICAgaWYgKCBwdltQUk5fQ1NdLml2YWwgPiAwICkgCisgICAgICAgIHBybmNzID0gcHZbUFJOX0NTXS5pdmFsOworCisgICAgaWYgKCBwdltQUk5fUFNdLml2YWwgPiAwICkgeworICAgICAgICB0eHQycHMgPSAxOworICAgICAgICBwc193aWR0aCA9IHB2W1BSTl9XSURdLml2YWwgPD0gMCA/IDgwIDogcHZbUFJOX1dJRF0uaXZhbDsKKyAgICAgICAgcHNfbGVuZ3RoID0gcHZbUFJOX0xFTl0uaXZhbCA8PSAwID8gNjYgOiBwdltQUk5fTEVOXS5pdmFsOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIHkgPSBzdHJsZW4ocyk7ICAgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBuYW1lIG9mIG5ldyBwcmludCBmaWxlICovCisgICAgaWYgKHkgPiAwCisjaWZkZWYgT1MyCisgICAgICAgICYmICgoeSAhPSAzKSB8fCAoY2tzdHJjbXAocywiUFJOIiwzLDApICE9IDApKQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICApIHsKKyAgICAgICAgaWYgKHByaW50ZXJuYW1lKSB7ICAgICAgICAgICAgICAvKiBIYWQgYSBwcmludCBmaWxlIGJlZm9yZT8gKi8KKyAgICAgICAgICAgIGZyZWUocHJpbnRlcm5hbWUpOyAgICAgICAgICAvKiBSZW1vdmUgaXRzIG5hbWUgKi8KKyAgICAgICAgICAgIHByaW50ZXJuYW1lID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBwcmludGVybmFtZSA9IChjaGFyICopIG1hbGxvYyh5ICsgMSk7IC8qIEFsbG9jYXRlIHNwYWNlIGZvciBpdCAqLworICAgICAgICBpZiAoIXByaW50ZXJuYW1lKSB7CisgICAgICAgICAgICBwcmludGYoIj9NZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KHByaW50ZXJuYW1lLHMpOyAgICAgICAgICAvKiAoc2FmZSkgQ29weSBuZXcgbmFtZSB0byBuZXcgc3BhY2UgKi8KKyAgICAgICAgZGVidWcoRjExMCwicHJpbnRlcm5hbWUiLHByaW50ZXJuYW1lLDApOworICAgIH0KKworI2lmZGVmIFBSSU5UU1dJCisgICAgLyogU2V0IHByaW50ZXIgdHlwZSBmcm9tIHN3aXRjaGVzIHRoYXQgd2VyZSBnaXZlbiBleHBsaWNpdGx5ICovCisKKyAgICBpZiAocHZbUFJOX05PTl0uaXZhbCA+IDApIHsgICAgICAgICAvKiBObyBwcmludGVyICovCisgICAgICAgIHByaW50ZXJ0eXBlID0gUFJUX05PTjsKKyAgICAgICAgbm9wcmludGVyID0gMTsKKyAgICAgICAgcHJpbnRwaXBlID0gMDsKKyAgICB9IGVsc2UgaWYgKHB2W1BSTl9GSUxdLml2YWwgPiAwKSB7ICAvKiBGaWxlICovCisgICAgICAgIHByaW50ZXJ0eXBlID0gUFJUX0ZJTDsKKyAgICAgICAgbm9wcmludGVyID0gMDsKKyAgICAgICAgcHJpbnRwaXBlID0gMDsKKyAgICB9IGVsc2UgaWYgKHB2W1BSTl9QSVBdLml2YWwgPiAwKSB7ICAvKiBQaXBlICovCisgICAgICAgIHByaW50ZXJ0eXBlID0gUFJUX1BJUDsKKyAgICAgICAgbm9wcmludGVyID0gMDsKKyAgICAgICAgcHJpbnRwaXBlID0gMTsKKyAgICB9IGVsc2UgaWYgKHB2W1BSTl9XSU5dLml2YWwgPiAwKSB7ICAvKiBXaW5kb3dzIHByaW50IHF1ZXVlICovCisgICAgICAgIHByaW50ZXJ0eXBlID0gUFJUX1dJTjsKKyAgICAgICAgbm9wcmludGVyID0gMDsKKyAgICAgICAgcHJpbnRwaXBlID0gMDsKKyAgICB9IGVsc2UgaWYgKHB2W1BSTl9ET1NdLml2YWwgPiAwKSB7ICAvKiBET1MgZGV2aWNlICovCisgICAgICAgIHByaW50ZXJ0eXBlID0gUFJUX0RPUzsKKyAgICAgICAgbm9wcmludGVyID0gMDsKKyAgICAgICAgcHJpbnRwaXBlID0gMDsKKyAgICB9IGVsc2UgaWYgKGxpbmVbMF0pIHsgICAgICAgICAgICAgICAvKiBOYW1lIGdpdmVuIHdpdGhvdXQgc3dpdGNoZXMgKi8KKyAgICAgICAgbm9wcmludGVyID0gMDsKKyAgICAgICAgcHJpbnRlcnR5cGUgPSBwcmludHBpcGUgPyBQUlRfUElQIDogUFJUX0RPUzsKKyNpZmRlZiBOVAorICAgICAgICAvKiB3YXMgdGhlIGNvbW1hbmQgU0VUIFBSSU5URVIgd2luZG93cy1xdWV1ZSA/ICovCisgICAgICAgIHkgPSBsb29rdXAoX3ByaW50dGFiLGxpbmUsbnByaW50LCZ4KTsKKyAgICAgICAgaWYgKHkgPj0gMCkgeworICAgICAgICAgICAgcHJpbnRlcnR5cGUgPSBQUlRfV0lOOworICAgICAgICAgICAgaWYgKHB2W1BSTl9XSU5dLnN2YWwpIGZyZWUocHZbUFJOX1dJTl0uc3ZhbCk7CisgICAgICAgICAgICBpZiAocHJpbnRlcm5hbWUpIHsgICAgICAgICAgLyogSGFkIGEgcHJpbnQgZmlsZSBiZWZvcmU/ICovCisgICAgICAgICAgICAgICAgZnJlZShwcmludGVybmFtZSk7ICAgICAgLyogUmVtb3ZlIGl0cyBuYW1lICovCisgICAgICAgICAgICAgICAgcHJpbnRlcm5hbWUgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHZbUFJOX1dJTl0uc3ZhbCA9IE5VTEw7CisgICAgICAgICAgICBwdltQUk5fV0lOXS5pdmFsID0gMTsKKyAgICAgICAgICAgIHMgPSBwcmludHRhYlt4XS5rd2Q7ICAgICAgICAvKiBHZXQgZnVsbCBuZXcgbmFtZSAqLworICAgICAgICAgICAgaWYgKCh5ID0gc3RybGVuKHMpKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZwdltQUk5fV0lOXS5zdmFsLHMpOworICAgICAgICAgICAgICAgIG1ha2VzdHIoJnByaW50ZXJuYW1lLHMpOworICAgICAgICAgICAgICAgIGlmICghcHJpbnRlcm5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/TWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInByaW50ZXJuYW1lIixwcmludGVybmFtZSwwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICggeSA9PSAtMiApIHsKKyAgICAgICAgICAgIC8qIEFtYmlndW91cyBQcmludCBRdWV1ZSBOYW1lICovCisgICAgICAgICAgICBwcmludGYoIj9BbWJpZ3VvdXMgcHJpbnRlciBuYW1lIHByb3ZpZGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisjZW5kaWYgLyogTlQgKi8KKyAgICB9CisKKyNpZmRlZiBCUFJJTlQKKyAgICAvKiBQb3J0IHBhcmFtZXRlcnMgbWF5IGJlIHNldCBmb3Igbm9uLWJpZGkgbW9kZSAqLworCisgICAgcHBvcnRzcGVlZCA9IHBvcnRzcGVlZDsgICAgICAgICAgICAgLyogU2V0IHBhcmFtZXRlcnMgKi8KKyAgICBwcG9ydHBhcml0eSA9IHBvcnRwYXJpdHk7CisgICAgcHBvcnRmbG93ID0gcG9ydGZsb3c7CisKKyAgICBpZiAocHZbUFJOX0JJRF0uaXZhbCA+IDApIHsgICAgICAgICAvKiBCaWRpcmVjdGlvbmFsICovCisjaWZkZWYgVU5JWAorICAgICAgICBwcmludGJpZGkgPSAxOyAgICAgICAgICAgICAgICAgIC8qIChqdXN0IHRvIHRlc3QgcGFyc2luZy4uLikgKi8KKyNlbHNlCisgICAgICAgIHByaW50YmlkaSA9IGJwcnRzdGFydCgpOyAgICAgICAgLyogU3RhcnQgYmlkaXJlY3Rpb25hbCBwcmludGVyICovCisjZW5kaWYgLyogVU5JWCAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHByaW50YmlkaSk7CisgICAgfSBlbHNlCisgICAgICBwcmludGJpZGkgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogTm90IEJQUklOVEVSLCB1bnNldCBmbGFnICovCisjZW5kaWYgLyogQlBSSU5UICovCisKKyAgICBpZiAocHZbUFJOX1RNT10uaXZhbCA+IC0xKSB7ICAgICAgICAvKiBUYWtlIGNhcmUgb2YgdGltZW91dCAqLworICAgICAgICBwcmludHRpbW8gPSBwdltQUk5fVE1PXS5pdmFsOworICAgIH0KKyAgICBpZiAocHZbUFJOX1RSTV0uaXZhbCA+IDApIHsgICAgICAgICAvKiBUZXJtaW5hdGlvbiBzdHJpbmcgKi8KKyAgICAgICAgaWYgKHByaW50dGVybSkgeworICAgICAgICAgICAgZnJlZShwcmludHRlcm0pOworICAgICAgICAgICAgcHJpbnR0ZXJtID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocHZbUFJOX1RSTV0uc3ZhbCkKKyAgICAgICAgICBtYWtlc3RyKCZwcmludHRlcm0scHZbUFJOX1RSTV0uc3ZhbCk7CisgICAgfQorICAgIGlmIChwdltQUk5fU0VQXS5pdmFsID4gMCkgeyAgICAgICAgIC8qIGFuZCBzZXBhcmF0b3IgZmlsZSAqLworICAgICAgICBpZiAocHJpbnRzZXApIHsKKyAgICAgICAgICAgIGZyZWUocHJpbnRzZXApOworICAgICAgICAgICAgcHJpbnRzZXAgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChwdltQUk5fU0VQXS5zdmFsKQorICAgICAgICAgIG1ha2VzdHIoJnByaW50c2VwLHB2W1BSTl9TRVBdLnN2YWwpOworICAgIH0KKyNlbmRpZiAvKiBQUklOVFNXSSAqLworCisjaWZkZWYgVU5JWE9ST1NLCisgICAgaWYgKCFwcmludHBpcGUKKyNpZmRlZiBQUklOVFNXSQorICAgICAgICAmJiAhbm9wcmludGVyCisjZW5kaWYgLyogUFJJTlRTV0kgKi8KKyAgICAgICAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIC0gY2hlY2sgYWNjZXNzICovCisgICAgICAgIGlmICh6Y2hrbyhzKSA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiP0FjY2VzcyBkZW5pZWQgLSAlc1xuIixzKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geHNldHBybjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKworICAgIHggPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBjb2RlICovCisKKyAgeHNldHBybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tb24gZXhpdCAqLworI2lmZGVmIFBSSU5UU1dJCisgICAgZm9yIChpID0gMDsgaSA8PSBQUk5fTUFYOyBpKyspIHsgICAgLyogRnJlZSBtYWxsb2MnZCBtZW1vcnkgKi8KKyAgICAgICAgaWYgKHB2W2ldLnN2YWwpCisgICAgICAgICAgZnJlZShwdltpXS5zdmFsKTsKKyAgICB9CisjZW5kaWYgLyogUFJJTlRTV0kgKi8KKyAgICBzdWNjZXNzID0gKHggPiAwKSA/IDEgOiAwOworICAgIHJldHVybih4KTsKK30KKworI2lmZGVmIEFOWVNTSAorLyogVGhlIFNFVCBTU0ggY29tbWFuZCAqLworCisjZGVmaW5lIFNTSF9DTUQgIDEgICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFNTSCBDT01NQU5EICovCisKKyNpZmRlZiBTU0hCVUlMVElOICAgICAgICAgICAgICAgICAgICAgICAvKiBCdWlsdC1pbiBTRVQgU1NIIG9wdGlvbnMgKi8KKyNkZWZpbmUgU1NIX0FERCAgMiAgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgKi8KKyNkZWZpbmUgU1NIX0FGVyAgMyAgICAgICAgICAgICAgICAgICAgICAvKiBBZ2VudC1mb3J3YXJkaW5nICovCisjZGVmaW5lIFNTSF9DSEkgIDQgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgSG9zdCBJUCAqLworI2RlZmluZSBTU0hfWEZXICA1ICAgICAgICAgICAgICAgICAgICAgIC8qIFgxMS1mb3J3YXJkaW5nICovCisjZGVmaW5lIFNTSF9EWUYgIDYgICAgICAgICAgICAgICAgICAgICAgLyogRHluYW1pYyBmb3J3YXJkaW5nICovCisjZGVmaW5lIFNTSF9HV1AgIDcgICAgICAgICAgICAgICAgICAgICAgLyogR2F0ZXdhIHBvcnRncyAqLworI2RlZmluZSBTU0hfR1NTICA4ICAgICAgICAgICAgICAgICAgICAgIC8qIEdTU0FQSSAqLworI2RlZmluZSBTU0hfS0JEICA5ICAgICAgICAgICAgICAgICAgICAgIC8qIEtCRCBJbnRlcmFjdGl2ZSBEZXZpY2VzICovCisjZGVmaW5lIFNTSF9LNCAgMTAgICAgICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgNCAqLworI2RlZmluZSBTU0hfSzUgIDExICAgICAgICAgICAgICAgICAgICAgIC8qIEtlcmJlcm9zIDUgKi8KKyNkZWZpbmUgU1NIX1NISyAxMiAgICAgICAgICAgICAgICAgICAgICAvKiBTdHJpY3QgSG9zdCBLZXkgQ2hlY2sgKi8KKyNkZWZpbmUgU1NIX1YxICAxMyAgICAgICAgICAgICAgICAgICAgICAvKiBTU0ggVjEgKi8KKyNkZWZpbmUgU1NIX1YyICAxNCAgICAgICAgICAgICAgICAgICAgICAvKiBTU0ggVjIgKi8KKyNkZWZpbmUgU1NIX1BSUCAxNSAgICAgICAgICAgICAgICAgICAgICAvKiBQcml2ZCBwb3J0ICovCisjZGVmaW5lIFNTSF9DTVAgMTYgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3Npb24gKi8KKyNkZWZpbmUgU1NIX1hBTCAxNyAgICAgICAgICAgICAgICAgICAgICAvKiBYIEF1dGggTG9jYXRpb24gKi8KKyNkZWZpbmUgU1NIX1NISCAxOCAgICAgICAgICAgICAgICAgICAgICAvKiBRdWlldCAqLworI2RlZmluZSBTU0hfVkVSIDE5ICAgICAgICAgICAgICAgICAgICAgIC8qIFZlcnNpb24gKi8KKyNkZWZpbmUgU1NIX1ZSQiAyMCAgICAgICAgICAgICAgICAgICAgICAvKiBWZXJib3NpdHkgbGV2ZWwgKi8KKyNkZWZpbmUgU1NIX0lERiAyMSAgICAgICAgICAgICAgICAgICAgICAvKiBJZGVudGl0eSBGaWxlICovCisjZGVmaW5lIFNTSF9DRkcgMjIgICAgICAgICAgICAgICAgICAgICAgLyogVXNlIE9wZW5TU0ggQ29uZmlnICovCisjZGVmaW5lIFNTSF9IQlQgMjMgICAgICAgICAgICAgICAgICAgICAgLyogSGVhcnRiZWF0IEludGVydmFsICovCisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBzc2h0YWJbXSA9IHsgICAgICAgLyogU0VUIFNTSCBjb21tYW5kIHRhYmxlICovCisjaWZkZWYgU1NIQlVJTFRJTgorICAgIHsgImFnZW50LWZvcndhcmRpbmciLCAgICAgICAgU1NIX0FGVywgIDAgfSwKKyAgICB7ICJjaGVjay1ob3N0LWlwIiwgICAgICAgICAgIFNTSF9DSEksICAwIH0sCisgICAgeyAiY29tcHJlc3Npb24iLCAgICAgICAgICAgICBTU0hfQ01QLCAgMCB9LAorICAgIHsgImR5bmFtaWMtZm9yd2FyZGluZyIsICAgICAgU1NIX0RZRiwgIDAgfSwKKyAgICB7ICJnYXRld2F5LXBvcnRzIiwgICAgICAgICAgIFNTSF9HV1AsICAwIH0sCisgICAgeyAiZ3NzYXBpIiwgICAgICAgICAgICAgICAgICBTU0hfR1NTLCAgMCB9LAorICAgIHsgImhlYXJ0YmVhdC1pbnRlcnZhbCIsICAgICAgU1NIX0hCVCwgIDAgfSwKKyAgICB7ICJpZGVudGl0eS1maWxlIiwgICAgICAgICAgIFNTSF9JREYsICAwIH0sCisjaWZkZWYgQ09NTUVOVAorICAgIHsgImtiZC1pbnRlcmFjdGl2ZS1kZXZpY2VzIiwgU1NIX0tCRCwgIDAgfSwKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgeyAiazQiLCAgICAgICAgICAgICAgICAgICAgICBTU0hfSzQsIENNX0lOViB9LAorICAgIHsgIms1IiwgICAgICAgICAgICAgICAgICAgICAgU1NIX0s1LCBDTV9JTlYgfSwKKyAgICB7ICJrZXJiZXJvczQiLCAgICAgICAgICAgICAgIFNTSF9LNCwgICAwIH0sCisgICAgeyAia2VyYmVyb3M1IiwgICAgICAgICAgICAgICBTU0hfSzUsICAgMCB9LAorICAgIHsgImtyYjQiLCAgICAgICAgICAgICAgICAgICAgU1NIX0s0LCBDTV9JTlYgfSwKKyAgICB7ICJrcmI1IiwgICAgICAgICAgICAgICAgICAgIFNTSF9LNSwgQ01fSU5WIH0sCisgICAgeyAicHJpdmlsZWdlZC1wb3J0IiwgICAgICAgICBTU0hfUFJQLCAgMCB9LAorICAgIHsgInF1aWV0IiwgICAgICAgICAgICAgICAgICAgU1NIX1NISCwgIDAgfSwKKyAgICB7ICJzdHJpY3QtaG9zdC1rZXktY2hlY2siLCAgIFNTSF9TSEssICAwIH0sCisgICAgeyAidXNlLW9wZW5zc2gtY29uZmlnIiwgICAgICBTU0hfQ0ZHLCAgMCB9LAorICAgIHsgInYxIiwgICAgICAgICAgICAgICAgICAgICAgU1NIX1YxLCAgIDAgfSwKKyAgICB7ICJ2MiIsICAgICAgICAgICAgICAgICAgICAgIFNTSF9WMiwgICAwIH0sCisgICAgeyAidmVyYm9zZSIsICAgICAgICAgICAgICAgICBTU0hfVlJCLCAgMCB9LAorICAgIHsgInZlcnNpb24iLCAgICAgICAgICAgICAgICAgU1NIX1ZFUiwgIDAgfSwKKyAgICB7ICJ4MTEtZm9yd2FyZGluZyIsICAgICAgICAgIFNTSF9YRlcsICAwIH0sCisgICAgeyAieGF1dGgtbG9jYXRpb24iLCAgICAgICAgICBTU0hfWEFMLCAgMCB9LAorI2Vsc2UKKyNpZmRlZiBTU0hDTUQKKyAgICB7ICJjb21tYW5kIiwgICAgICAgICAgICAgICAgIFNTSF9DTUQsICAwIH0sCisjZW5kaWYgLyogU1NIQ01EICovCisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbnNzaHRhYiA9IChzaXplb2Yoc3NodGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCisjaWZkZWYgU1NIQlVJTFRJTgorc3RhdGljIHN0cnVjdCBrZXl0YWIgc3NodmVyW10gPSB7ICAgICAgIC8qIFNFVCBTU0ggVkVSU0lPTiBjb21tYW5kIHRhYmxlICovCisgICAgeyAiMSIsICAgICAgICAgIDEsICAwIH0sCisgICAgeyAiMiIsICAgICAgICAgIDIsICAwIH0sCisgICAgeyAiYXV0b21hdGljIiwgIDAsICAwIH0KK307CisKKyNkZWZpbmUgU1NIQV9DUlMgICAxCisjZGVmaW5lIFNTSEFfRFNBICAgMgorI2RlZmluZSBTU0hBX0dTUyAgIDMKKyNkZWZpbmUgU1NIQV9IT1MgICA0CisjZGVmaW5lIFNTSEFfS0JEICAgNQorI2RlZmluZSBTU0hBX0s0ICAgIDYKKyNkZWZpbmUgU1NIQV9LNSAgICA3CisjZGVmaW5lIFNTSEFfUFNXICAgOAorI2RlZmluZSBTU0hBX1BLICAgIDkKKyNkZWZpbmUgU1NIQV9TS0UgIDEwCisjZGVmaW5lIFNTSEFfVElTICAxMQorI2RlZmluZSBTU0hBX0VYVCAgMTIKKyNkZWZpbmUgU1NIQV9TUlAgIDEzCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHNzaDJhdXRbXSA9IHsgICAgICAvKiBTRVQgU1NIIFYyIEFVVEggY29tbWFuZCB0YWJsZSAqLworICAgIHsgImV4dGVybmFsLWtleXgiLCAgICAgIFNTSEFfRVhULCAwIH0sCisgICAgeyAiZ3NzYXBpIiwgICAgICAgICAgICAgU1NIQV9HU1MsIDAgfSwKKyAgICB7ICJob3N0YmFzZWQiLCAgICAgICAgICBTU0hBX0hPUywgMCB9LAorICAgIHsgImtleWJvYXJkLWludGVyYWN0aXZlIiwgIFNTSEFfS0JELCAwIH0sCisgICAgeyAicGFzc3dvcmQiLCAgICAgICAgICAgU1NIQV9QU1csIDAgfSwKKyAgICB7ICJwdWJsaWNrZXkiLCAgICAgICAgICBTU0hBX1BLLCAgMCB9LAorICAgIHsgInNycC1nZXgtc2hhMSIsICAgICAgIFNTSEFfU1JQLCAwIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuc3NoMmF1dCA9IChzaXplb2Yoc3NoMmF1dCkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworI2RlZmluZSBTU0hGX0xDTCAgIDEKKyNkZWZpbmUgU1NIRl9STVQgICAyCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGFkZGZ3ZFtdID0geyAgICAgICAvKiBTRVQgU1NIIEFERCBjb21tYW5kIHRhYmxlICovCisgICAgeyAibG9jYWwtcG9ydC1mb3J3YXJkIiwgIFNTSEZfTENMLCAwIH0sCisgICAgeyAicmVtb3RlLXBvcnQtZm9yd2FyZCIsIFNTSEZfUk1ULCAwIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuYWRkZndkID0gKHNpemVvZihhZGRmd2QpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKKyNkZWZpbmUgU1NIMV9DSUYgICAxCisjZGVmaW5lIFNTSDFfR05IICAgMgorI2RlZmluZSBTU0gxX1VOSCAgIDMKKyNkZWZpbmUgU1NIMV9LNTQgICA0CisKKyNkZWZpbmUgU1NIMl9DSUYgICAxCisjZGVmaW5lIFNTSDJfR05IICAgMgorI2RlZmluZSBTU0gyX1VOSCAgIDMKKyNkZWZpbmUgU1NIMl9BUksgICA0CisjZGVmaW5lIFNTSDJfSEtBICAgNQorI2RlZmluZSBTU0gyX01BQyAgIDYKKyNkZWZpbmUgU1NIMl9BVVQgICA3CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHNzaHYxdGFiW10gPSB7ICAgICAvKiBTRVQgU1NIIFYxIGNvbW1hbmQgdGFibGUgKi8KKyAgICB7ICJjaXBoZXIiLCAgICAgICAgICAgICAgICAgIFNTSDFfQ0lGLCAwIH0sCisgICAgeyAiZ2xvYmFsLWtub3duLWhvc3RzLWZpbGUiLCBTU0gxX0dOSCwgMCB9LAorICAgIHsgIms1LXJldXNlLWs0LW1lc3NhZ2VzIiwgICAgU1NIMV9LNTQsIENNX0lOViB9LAorICAgIHsgInVzZXIta25vd24taG9zdHMtZmlsZSIsICAgU1NIMV9VTkgsIDAgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5zc2h2MXRhYiA9IChzaXplb2Yoc3NodjF0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHNzaHYydGFiW10gPSB7ICAgICAvKiBTRVQgU1NIIFYyIGNvbW1hbmQgdGFibGUgKi8KKyAgICB7ICJhdXRoZW50aWNhdGlvbiIsICAgICAgICAgIFNTSDJfQVVULCAwIH0sCisgICAgeyAiYXV0by1yZWtleSIsICAgICAgICAgICAgICBTU0gyX0FSSywgMCB9LAorICAgIHsgImNpcGhlcnMiLCAgICAgICAgICAgICAgICAgU1NIMl9DSUYsIDAgfSwKKyAgICB7ICJnbG9iYWwta25vd24taG9zdHMtZmlsZSIsIFNTSDJfR05ILCAwIH0sCisgICAgeyAiaG9zdGtleS1hbGdvcml0aG1zIiwgICAgICBTU0gyX0hLQSwgMCB9LAorICAgIHsgIm1hY3MiLCAgICAgICAgICAgICAgICAgICAgU1NIMl9NQUMsIDAgfSwKKyAgICB7ICJ1c2VyLWtub3duLWhvc3RzLWZpbGUiLCAgIFNTSDJfVU5ILCAwIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuc3NodjJ0YWIgPSAoc2l6ZW9mKHNzaHYydGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCisjZGVmaW5lIFNTSENfM0RFUyAxICAgICAgICAgICAgICAgICAgICAgLyogM0RFUyAqLworI2RlZmluZSBTU0hDXzNDQkMgMiAgICAgICAgICAgICAgICAgICAgIC8qIDNERVMtQ0JDICovCisjZGVmaW5lIFNTSENfQTEyOCAzICAgICAgICAgICAgICAgICAgICAgLyogQUVTMTI4LUNCQyAqLworI2RlZmluZSBTU0hDX0ExOTIgNCAgICAgICAgICAgICAgICAgICAgIC8qIEFFUzE5Mi1DQkMgKi8KKyNkZWZpbmUgU1NIQ19BMjU2IDUgICAgICAgICAgICAgICAgICAgICAvKiBBRVMyNTYtQ0JDICovCisjZGVmaW5lIFNTSENfQVJDNCA2ICAgICAgICAgICAgICAgICAgICAgLyogQVJDRk9VUiAqLworI2RlZmluZSBTU0hDX0ZJU0ggNyAgICAgICAgICAgICAgICAgICAgIC8qIEJMT1dGSVNIICovCisjZGVmaW5lIFNTSENfQkNCQyA5ICAgICAgICAgICAgICAgICAgICAgLyogQkxPV0ZJU0gtQ0JDICovCisjZGVmaW5lIFNTSENfQzEyOCA4ICAgICAgICAgICAgICAgICAgICAgLyogQ0FTVDEyOC1DQkMgKi8KKyNkZWZpbmUgU1NIQ18xREVTIDEwICAgICAgICAgICAgICAgICAgICAvKiBERVMgKi8KKworc3RhdGljIHN0cnVjdCBrZXl0YWIgc3NoMWNpcGhlcnNbXSA9IHsKKyAgICB7ICIzZGVzIiwgICAgICAgICBTU0hDXzNERVMsIDAgfSwKKyAgICB7ICJibG93ZmlzaCIsICAgICBTU0hDX0ZJU0gsIDAgfSwKKyAgICB7ICJkZXMiLCAgICAgICAgICBTU0hDXzFERVMsIDAgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5zc2gxY2lwaGVycyA9IChzaXplb2Yoc3NoMWNpcGhlcnMpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHNzaDJjaXBoZXJzW10gPSB7ICAvKiBTRVQgU1NIIFYyIENJUEhFUlMgY29tbWFuZCB0YWJsZSAqLworICAgIHsgIjNkZXMtY2JjIiwgICAgICAgIFNTSENfM0RFUywgMCB9LAorICAgIHsgImFlczEyOC1jYmMiLCAgICAgIFNTSENfQTEyOCwgMCB9LAorICAgIHsgImFlczE5Mi1jYmMiLCAgICAgIFNTSENfQTE5MiwgMCB9LAorICAgIHsgImFlczI1Ni1jYmMiLCAgICAgIFNTSENfQTI1NiwgMCB9LAorICAgIHsgImFyY2ZvdXIiLCAgICAgICAgIFNTSENfQVJDNCwgMCB9LAorICAgIHsgImJsb3dmaXNoLWNiYyIsICAgIFNTSENfRklTSCwgMCB9LAorICAgIHsgImNhc3QxMjgtY2JjIiwgICAgIFNTSENfQzEyOCwgMCB9LAorICAgIHsgInJpam5kYWVsMTI4LWNiYyIsIFNTSENfQTEyOCwgMCB9LAorICAgIHsgInJpam5kYWVsMTkyLWNiYyIsIFNTSENfQTE5MiwgMCB9LAorICAgIHsgInJpam5kYWVsMjU2LWNiYyIsIFNTSENfQTI1NiwgMCB9LAorICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbnNzaDJjaXBoZXJzID0gKHNpemVvZihzc2gyY2lwaGVycykgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworI2RlZmluZSBTU0hNX1NIQSAgICAgICAgMSAgICAgICAgICAgICAgIC8qIEhNQUMtU0hBMSAqLworI2RlZmluZSBTU0hNX1NIQV85NiAgICAgMiAgICAgICAgICAgICAgIC8qIEhNQUMtU0hBMS05NiAqLworI2RlZmluZSBTU0hNX01ENSAgICAgICAgMyAgICAgICAgICAgICAgIC8qIEhNQUMtTUQ1ICovCisjZGVmaW5lIFNTSE1fTUQ1Xzk2ICAgICA0ICAgICAgICAgICAgICAgLyogSE1BQy1NRDUtOTYgKi8KKyNkZWZpbmUgU1NITV9SSVBFICAgICAgIDUgICAgICAgICAgICAgICAvKiBITUFDLVJJUEVNRDE2MCAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBzc2gybWFjc1tdID0geyAgICAgLyogU0VUIFNTSCBWMiBNQUNTIGNvbW1hbmQgdGFibGUgKi8KKyAgICB7ICJobWFjLW1kNSIsICAgICAgIFNTSE1fTUQ1LCAgICAwIH0sCisgICAgeyAiaG1hYy1tZDUtOTYiLCAgICBTU0hNX01ENV85NiwgMCB9LAorICAgIHsgImhtYWMtcmlwZW1kMTYwIiwgU1NITV9SSVBFLCAgIDAgfSwKKyAgICB7ICJobWFjLXNoYTEiLCAgICAgIFNTSE1fU0hBLCAgICAwIH0sCisgICAgeyAiaG1hYy1zaGExLTk2IiwgICBTU0hNX1NIQV85NiwgMCB9LAorICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbnNzaDJtYWNzID0gKHNpemVvZihzc2gybWFjcykgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgdGd0cGFzc1tdID0geworICAgIHsgInRndC1wYXNzaW5nIiwgMSwgMCwgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG50Z3RwYXNzID0gKHNpemVvZih0Z3RwYXNzKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBnc3NhcGl0YWJbXSA9IHsKKyAgICB7ICJkZWxlZ2F0ZS1jcmVkZW50aWFscyIsIDEsIDAsIH0sCisgICAgeyAia2V5LWV4Y2hhbmdlIiwgICAgICAgICAyLCBDTV9JTlYsIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuZ3NzYXBpdGFiID0gKHNpemVvZihnc3NhcGl0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKKyNkZWZpbmUgSEtBX1JTQSAxCisjZGVmaW5lIEhLQV9EU1MgMgorCitzdGF0aWMgc3RydWN0IGtleXRhYiBoa2F0YWJbXSA9IHsKKyAgICB7ICJzc2gtZHNzIiwgSEtBX0RTUywgMCwgfSwKKyAgICB7ICJzc2gtcnNhIiwgSEtBX1JTQSwgMCwgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5oa2F0YWIgPSAoc2l6ZW9mKGhrYXRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBTU0ggdmFyaWFibGVzICovCisgIHNzaF9hZncgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWdlbnQgZm9yd2FyZGluZyAqLworICBzc2hfeGZ3ID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHgxMSBmb3J3YXJkaW5nICAgKi8KKyAgc3NoX3BycCA9IFNFVF9PRkYsICAgICAgICAgICAgICAgICAgICAvKiBwcml2aWxlZ2VkIHBvcnRzICovCisgIHNzaF9jbXAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcHJlc3Npb24gKi8KKyAgc3NoX3NoaCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxdWlldCAgICAgICAqLworICBzc2hfdmVyID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sIHZlcnNpb24gKGF1dG8sMSwyKSAqLworICBzc2hfdnJiID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcG9ydCBlcnJvcnMgKi8KKyAgc3NoX2Noa2lwID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBTU0ggQ2hlY2sgSG9zdCBJUCBmbGFnICovCisgIHNzaF9nd3AgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2F0ZXdheSBwb3J0cyAqLworICBzc2hfZHlmID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgZm9yd2FyZGluZyAqLworICBzc2hfZ3NkID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdzc2FwaSBkZWxlZ2F0ZSBjcmVkZW50aWFscyAqLworICBzc2hfazR0Z3QgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGs0IHRndCBwYXNzaW5nICovCisgIHNzaF9rNXRndCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogazUgdGd0IHBhc3NpbmcgKi8KKyAgc3NoX3NoayA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdHJpY3QgaG9zdCBrZXkgKG5vLCB5ZXMsIGFzaykgKi8KKyAgc3NoMl9hcmsgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvIHJlLWtleSAqLworICBzc2hfY2FzID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgYXMgc3Vic3lzICovCisgIHNzaF9jZmcgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIE9wZW5TU0ggY29uZmlnPyAqLworICBzc2hfZ2t4ID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdzc2FwaSBrZXkgZXhjaGFuZ2UgKi8KKyAgc3NoX2s1X2lzX2s0ID0gMSwgICAgICAgICAgICAgICAgICAgICAvKiBzb21lIFNTSCB2MSB1c2Ugc2FtZSBjb2RlcyAqLworICBzc2hfaGJ0ID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhlYXJ0YmVhdCAoc2Vjb25kcykgKi8KKyAgc3NoX2R1bW15ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBib3R0b20gb2YgbGlzdCAqLworCitjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBhcmUgdG8gYmUgbWFsbG9jJ2QgKi8KKyAgKiBzc2gxX2NpZiA9IE5VTEwsICAgICAgICAgICAgICAgICAgICAvKiB2MSBjaXBoZXIgKi8KKyAgKiBzc2gyX2NpZiA9IE5VTEwsICAgICAgICAgICAgICAgICAgICAvKiB2MiBjaXBoZXIgbGlzdCAqLworICAqIHNzaDJfbWFjID0gTlVMTCwgICAgICAgICAgICAgICAgICAgIC8qIHYyIG1hYyBsaXN0ICovCisgICogc3NoMl9hdXRoID0gTlVMTCwgICAgICAgICAgICAgICAgICAgLyogdjIgYXV0aGVudGljYXRpb24gbGlzdCAqLworICAqIHNzaF9oc3QgPSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGhvc3RuYW1lICovCisgICogc3NoX3BydCA9IE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogcG9ydC9zZXJ2aWNlICovCisgICogc3NoX2NtZCA9IE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogY29tbWFuZCB0byBleGVjdXRlICovCisgICogc3NoX3hhbCA9IE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogeGF1dGgtbG9jYXRpb24gKi8KKyAgKiBzc2gxX2duaCA9IE5VTEwsICAgICAgICAgICAgICAgICAgICAvKiB2MSBnbG9iYWwga25vd24gaG9zdHMgZmlsZSAqLworICAqIHNzaDFfdW5oID0gTlVMTCwgICAgICAgICAgICAgICAgICAgIC8qIHYxIHVzZXIga25vd24gaG9zdHMgZmlsZSAqLworICAqIHNzaDJfZ25oID0gTlVMTCwgICAgICAgICAgICAgICAgICAgIC8qIHYyIGdsb2JhbCBrbm93biBob3N0cyBmaWxlICovCisgICogc3NoMl91bmggPSBOVUxMLCAgICAgICAgICAgICAgICAgICAgLyogdjIgdXNlciBrbm93biBob3N0cyBmaWxlICovCisgICogc3NoMl9oa2EgPSBOVUxMLCAgICAgICAgICAgICAgICAgICAgLyogSG9zdCBLZXkgQWxnb3JpdGhtcyAqLworICAqIHh4eF9kdW1teSA9IE5VTEw7CisKK2NoYXIgKiBzc2hfaWRmWzMyXSA9IHsgICAgICAgICAgICAgICAgICAvKiBJZGVudGl0eSBmaWxlIGxpc3QgKi8KKyAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLAorICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsCisgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCwKKyAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMCit9OworY2hhciAqIHNzaF90bXBbMzJdID0geyAgICAgICAgICAgICAgICAgIC8qIFRlbXAgaWRlbnRpdHkgZmlsZSBsaXN0ICovCisgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCwKKyAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLAorICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsCisgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTAorfTsKK2ludCBzc2hfaWRmX24gPSAwOworCitleHRlcm4gaW50ICAgIHNzaF9wZl9sY2xfbiwKKyAgICAgICAgICAgICAgc3NoX3BmX3JtdF9uOworZXh0ZXJuIHN0cnVjdCBzc2hfcGYgc3NoX3BmX2xjbFszMl07ICAgIC8qIFBvcnQgZm9yd2FyZGluZyBzdHJ1Y3RzICovCitleHRlcm4gc3RydWN0IHNzaF9wZiBzc2hfcGZfcm10WzMyXTsgICAgLyogKGRlY2xhcmVkIGluIGNrdXVzci5jKSAqLworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKworI2lmZGVmIFNGVFBfQlVJTFRJTgorc3RhdGljIHN0cnVjdCBrZXl0YWIgc2Z0cHRhYltdID0geworICAgIHsgImVuZC1vZi1saW5lIiwgICAgICAgICAgICBYWV9TRlRQX0VPTCwgMCwgfSwKKyAgICB7ICJyZW1vdGUtY2hhcmFjdGVyLXNldCIsICAgWFlfU0ZUUF9SQ1MsIDAsIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuc2Z0cHRhYiA9IChzaXplb2Yoc2Z0cHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKyNlbmRpZiAvKiBTRlRQX0JVSUxUSU4gKi8KKworVk9JRAorc2hvc3NoKCkgeworI2lmZGVmIFNTSEJVSUxUSU4KKyAgICBpbnQgaSwgbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBREQgYXNrbW9yZSgpISAqLworCisgICAgcHJpbnRmKCJcblNTSCBpcyBidWlsdCBpbjpcblxuIik7CisKKyAgICBwcmludGYoIiBzc2ggaG9zdDogICAgICAgICAgICAgICAgICAgICAgICAlc1xuIixzaG93c3RyaW5nKHNzaF9oc3QpKTsKKyAgICBwcmludGYoIiBzc2ggcG9ydDogICAgICAgICAgICAgICAgICAgICAgICAlc1xuIixzaG93c3RyaW5nKHNzaF9wcnQpKTsKKyAgICBwcmludGYoIiBzc2ggY29tbWFuZDogICAgICAgICAgICAgICAgICAgICAlc1xuIixzaG93c3RyaW5nKHNzaF9jbWQpKTsKKyAgICBwcmludGYoIiBzc2ggYWdlbnQtZm9yd2FyZGluZzogICAgICAgICAgICAlc1xuIixzaG93b2ZmKHNzaF9hZncpKTsKKyAgICBwcmludGYoIiBzc2ggY2hlY2staG9zdC1pcDogICAgICAgICAgICAgICAlc1xuIixzaG93b2ZmKHNzaF9jaGtpcCkpOworICAgIHByaW50ZigiIHNzaCBjb21wcmVzc2lvbjogICAgICAgICAgICAgICAgICVzXG4iLHNob3dvZmYoc3NoX2NtcCkpOworICAgIHByaW50ZigiIHNzaCBkeW5hbWljLWZvcndhcmRpbmc6ICAgICAgICAgICVzXG4iLHNob3dvZmYoc3NoX2R5ZikpOworICAgIGlmIChzc2hfcGZfbGNsWzBdLnAxICYmIHNzaF9wZl9sY2xbMF0uaG9zdCAmJiBzc2hfcGZfbGNsWzBdLnAyKSB7CisgICAgICBwcmludGYoIiBzc2ggZm9yd2FyZC1sb2NhbC1wb3J0OiAgICAgICAgICAlZCAlcyAlZFxuIiwKKyAgICAgICAgICAgICBzc2hfcGZfbGNsWzBdLnAxLCBzc2hfcGZfbGNsWzBdLmhvc3QsIHNzaF9wZl9sY2xbMF0ucDIpOworICAgICAgZm9yICggbj0xO248c3NoX3BmX2xjbF9uO24rKyApCisgICAgICAgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICVkICVzICVkXG4iLAorICAgICAgICAgICAgICAgc3NoX3BmX2xjbFtuXS5wMSwgc3NoX3BmX2xjbFtuXS5ob3N0LCBzc2hfcGZfbGNsW25dLnAyKTsKKyAgICB9IGVsc2UKKyAgICAgIHByaW50ZigiIHNzaCBmb3J3YXJkLWxvY2FsLXBvcnQ6ICAgICAgICAgKG5vbmUpXG4iKTsKKyAgICBpZiAoc3NoX3BmX3JtdFswXS5wMSAmJiBzc2hfcGZfcm10WzBdLmhvc3QgJiYgc3NoX3BmX3JtdFswXS5wMikgeworICAgICAgcHJpbnRmKCIgc3NoIGZvcndhcmQtcmVtb3RlLXBvcnQ6ICAgICAgICAgJWQgJXMgJWRcbiIsCisgICAgICAgICAgICAgc3NoX3BmX3JtdFswXS5wMSwgc3NoX3BmX3JtdFswXS5ob3N0LCBzc2hfcGZfcm10WzBdLnAyKTsKKyAgICAgIGZvciAoIG49MTtuPHNzaF9wZl9ybXRfbjtuKysgKQorICAgICAgICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAlZCAlcyAlZFxuIiwKKyAgICAgICAgICAgICAgIHNzaF9wZl9ybXRbbl0ucDEsIHNzaF9wZl9ybXRbbl0uaG9zdCwgc3NoX3BmX3JtdFtuXS5wMik7CisgICAgfSBlbHNlCisgICAgICBwcmludGYoIiBzc2ggZm9yd2FyZC1yZW1vdGUtcG9ydDogICAgICAgIChub25lKVxuIik7CisgICAgcHJpbnRmKCIgc3NoIGdhdGV3YXktcG9ydHM6ICAgICAgICAgICAgICAgJXNcbiIsc2hvd29mZihzc2hfZ3dwKSk7CisgICAgcHJpbnRmKCIgc3NoIGdzc2FwaSBkZWxlZ2F0ZS1jcmVkZW50aWFsczogJXNcbiIsc2hvd29mZihzc2hfZ3NkKSk7CisgICAgcHJpbnRmKCIgc3NoIGdzc2FwaSBrZXktZXhjaGFuZ2UgICAgICAgIDogJXNcbiIsc2hvd29mZihzc2hfZ2t4KSk7CisgICAgcHJpbnRmKCIgc3NoIGlkZW50aXR5LWZpbGU6ICAgICAgICAgICAgICAgJWRcbiIsc3NoX2lkZl9uKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3NoX2lkZl9uOyBpKyspCisgICAgICBwcmludGYoIiAgJTJkLiAlc1xuIixpKzEsc2hvd3N0cmluZyhzc2hfaWRmW2ldKSk7CisgICAgcHJpbnRmKCIgc3NoIGhlYXJ0YmVhdCBpbnRlcnZhbDogICAgICAgICAgJWRcbiIsIHNzaF9oYnQpOworICAgIHByaW50ZigiIHNzaCBrNCB0Z3QtcGFzc2luZzogICAgICAgICAgICAgICVzXG4iLHNob3dvZmYoc3NoX2s0dGd0KSk7CisgICAgcHJpbnRmKCIgc3NoIGs1IHRndC1wYXNzaW5nOiAgICAgICAgICAgICAgJXNcbiIsc2hvd29mZihzc2hfazV0Z3QpKTsKKworICAgIHByaW50ZigiIHNzaCBwcml2aWxlZ2VkLXBvcnQ6ICAgICAgICAgICAgICVzXG4iLHNob3dvb2Eoc3NoX3BycCkpOworICAgIHByaW50ZigiIHNzaCBxdWlldDogICAgICAgICAgICAgICAgICAgICAgICVzXG4iLHNob3dvZmYoc3NoX3NoaCkpOworICAgIHByaW50ZigiIHNzaCBzdHJpY3QtaG9zdC1rZXktY2hlY2s6ICAgICAgICVkXG4iLHNzaF9zaGspOworICAgIHByaW50ZigiIHNzaCB1c2Utb3BlbnNzaC1jb25maWc6ICAgICAgICAgICVzXG4iLHNob3dvZmYoc3NoX2NmZykpOworICAgIHByaW50ZigiIHNzaCB2ZXJib3NlOiAgICAgICAgICAgICAgICAgICAgICVkXG4iLHNzaF92cmIpOworICAgIHByaW50ZigiIHNzaCB2ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICVzXG4iLAorICAgICAgICAgICBzc2hfdmVyID8gY2tpdG9hKHNzaF92ZXIpIDogImF1dG9tYXRpYyIKKyAgICAgICAgICAgKTsKKyAgICBwcmludGYoIiBzc2ggeDExLWZvcndhcmRpbmc6ICAgICAgICAgICAgICAlc1xuIixzaG93b29hKHNzaF94ZncpKTsKKyAgICBwcmludGYoIiBzc2ggeGF1dGgtbG9jYXRpb246ICAgICAgICAgICAgICAlc1xuIixzaG93c3RyaW5nKHNzaF94YWwpKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCIgc3NoIHYxIGNpcGhlcjogICAgICAgICAgICAgICAgICAgJXNcbiIsc2hvd3N0cmluZyhzc2gxX2NpZikpOworICAgIHByaW50ZigiIHNzaCB2MSBnbG9iYWwta25vd24taG9zdHMtZmlsZTogICVzXG4iLHNob3dzdHJpbmcoc3NoMV9nbmgpKTsKKyAgICBwcmludGYoIiBzc2ggdjEgdXNlci1rbm93bi1ob3N0cy1maWxlOiAgICAlc1xuIixzaG93c3RyaW5nKHNzaDFfdW5oKSk7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiIHNzaCB2MiBhdXRoZW50aWNhdGlvbjogICAgICAgICAgICVzXG4iLHNob3dzdHJpbmcoc3NoMl9hdXRoKSk7CisgICAgcHJpbnRmKCIgc3NoIHYyIGF1dG8tcmVrZXk6ICAgICAgICAgICAgICAgJXNcbiIsc2hvd29mZihzc2gyX2FyaykpOworICAgIHByaW50ZigiIHNzaCB2MiBjaXBoZXJzOiAgICAgICAgICAgICAgICAgICVzXG4iLHNob3dzdHJpbmcoc3NoMl9jaWYpKTsKKyAgICBwcmludGYoIiBzc2ggdjIgY29tbWFuZC1hcy1zdWJzeXN0ZW06ICAgICAlc1xuIixzaG93b2ZmKHNzaF9jYXMpKTsKKyAgICBwcmludGYoIiBzc2ggdjIgZ2xvYmFsLWtub3duLWhvc3RzLWZpbGU6ICAlc1xuIixzaG93c3RyaW5nKHNzaDJfZ25oKSk7CisgICAgcHJpbnRmKCIgc3NoIHYyIGhvc3RrZXktYWxnb3JpdGhtczogICAgICAgJXNcbiIsc2hvd3N0cmluZyhzc2gyX2hrYSkpOworICAgIHByaW50ZigiIHNzaCB2MiBtYWM6ICAgICAgICAgICAgICAgICAgICAgICVzXG4iLHNob3dzdHJpbmcoc3NoMl9tYWMpKTsKKyAgICBwcmludGYoIiBzc2ggdjIgdXNlci1rbm93bi1ob3N0cy1maWxlOiAgICAlc1xuIixzaG93c3RyaW5nKHNzaDJfdW5oKSk7CisjZWxzZQorI2lmZGVmIFNTSENNRAorICAgIGV4dGVybiBjaGFyICogc3NoY21kLCAqIGRlZnNzaGNtZDsKKyAgICBjaGFyICogczsKKyAgICBzID0gc3NoY21kID8gc3NoY21kIDogZGVmc3NoY21kOworICAgIHByaW50ZigiXG4gU1NIIGlzIGV4dGVybmFsLlxuXG4iKTsKKyAgICBwcmludGYoIiBzc2ggY29tbWFuZDogJXNcbiIsc2hvd3N0cmluZyhzKSk7CisjZW5kaWYgLyogU1NIQ01EICovCisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworICAgIHByaW50ZigiXG4iKTsKK30KKworc3RhdGljIGludAorZG9zZXRzc2goKSB7CisjaWZkZWYgU1NIQ01ECisgICAgZXh0ZXJuIGNoYXIgKiBzc2hjbWQ7CisjZW5kaWYgLyogU1NIQ01EICovCisjaWZkZWYgU1NIQlVJTFRJTgorI2lmbmRlZiBTU0hURVNUCisgICAgZXh0ZXJuIGludCBzbF9zc2hfeGZ3X3NhdmVkLCBzbF9zc2hfdmVyX3NhdmVkOworI2VuZGlmIC8qIFNTSFRFU1QgKi8KKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisgICAgaW50IGN4LCB4LCB5LCB6OworICAgIGNoYXIgKiBzOworCisgICAgaWYgKChjeCA9IGNta2V5KHNzaHRhYixuc3NodGFiLCIiLCJjb21tYW5kIiwgeHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oY3gpOworICAgIHN3aXRjaCAoY3gpIHsKKyNpZmRlZiBTU0hDTUQKKyAgICAgIGNhc2UgU1NIX0NNRDogICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kICovCisgICAgICAgIGlmICgoeCA9IGNtdHh0KCJDb21tYW5kIHRvIHN0YXJ0IHNzaCIsInNzaCAtZSBub25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBtYWtlc3RyKCZzc2hjbWQscyk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZW5kaWYgLyogU1NIQ01EICovCisKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICBjYXNlIFNTSF9BRlc6ICAgICAgICAgICAgICAgICAgICAgLyogQWdlbnQtZm9yd2FyZGluZyAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHNldG9uKCZzc2hfYWZ3KSk7CisKKyAgICAgIGNhc2UgU1NIX0NISTogICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBIb3N0IElQICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJnNzaF9jaGtpcCkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTU0hfQ01QOiAgICAgICAgICAgICAgICAgICAgIC8qIENvbXByZXNzaW9uICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJnNzaF9jbXApKTsKKworICAgICAgY2FzZSBTU0hfRFlGOiAgICAgICAgICAgICAgICAgICAgIC8qIER5bmFtaWMgRm9yd2FyZGluZyAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHNldG9uKCZzc2hfZHlmKSk7CisKKyAgICAgIGNhc2UgU1NIX0dXUDogICAgICAgICAgICAgICAgICAgICAvKiBHYXRld2F5IHBvcnRzICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJnNzaF9nd3ApKTsKKworICAgICAgY2FzZSBTU0hfR1NTOiAgICAgICAgICAgICAgICAgICAgIC8qIEdTU0FQSSAqLworICAgICAgICBpZiAoKHkgPSBjbWtleShnc3NhcGl0YWIsbmdzc2FwaXRhYiwiIiwiIiwgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBzd2l0Y2ggKHkpIHsKKyAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxlZ2F0ZSBjcmVkZW50aWFscyAqLworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSBzZXRvbigmc3NoX2dzZCkpOworICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgIC8qIGtleS1leGNoYW5nZSAqLworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSBzZXRvbigmc3NoX2dreCkpOworICAgICAgICB9CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisKKyNpZmRlZiBDT01NRU5UCisgICAgICBjYXNlIFNTSF9LQkQ6ICAgICAgICAgICAgICAgICAgICAgLyogS2JkIEludGVyYWN0aXZlIERldmljZXMgKi8KKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgLyogVE8gQkUgRklMTEVEIElOICovCisgICAgICAgIHJldHVybigtMik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgICBjYXNlIFNTSF9LNDogICAgICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgSVYgKi8KKyAgICAgIGNhc2UgU1NIX0s1OiAgICAgICAgICAgICAgICAgICAgICAvKiBLZXJiZXJvcyBWICovCisgICAgICAgIGlmICgoeSA9IGNta2V5KHRndHBhc3MsMSwiIiwidGd0LXBhc3NpbmciLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIHN3aXRjaCAoeSkgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gKGN4ID09IFNTSF9LNCkgPworICAgICAgICAgICAgICAgICAgIHNldG9uKCZzc2hfazR0Z3QpIDogc2V0b24oJnNzaF9rNXRndCkpOworICAgICAgICB9CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisKKyAgICAgIGNhc2UgU1NIX1BSUDogICAgICAgICAgICAgICAgICAgICAvKiBQcml2ZCBwb3J0ICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJnNzaF9wcnApKTsKKworICAgICAgY2FzZSBTU0hfU0hIOiAgICAgICAgICAgICAgICAgICAgIC8qIFF1aWV0ICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJnNzaF9zaGgpKTsKKworICAgICAgY2FzZSBTU0hfU0hLOiAgICAgICAgICAgICAgICAgICAgIC8qIFN0cmljdCBIb3N0IEtleSBDaGVjayAqLworICAgICAgICBpZiAoKHkgPSBjbWtleShvb2t0YWIsMywiIiwiIiwgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBzc2hfc2hrID0geTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgY2FzZSBTU0hfSEJUOgorCXggPSBjbW51bSgiSGVhcnRiZWF0IGludGVydmFsLCBzZWNvbmRzIiwiMCIsMTAsJnoseHhzdHJpbmcpOworCWlmICh4IDwgMCkgcmV0dXJuKHgpOworCWlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworCXNzaF9oYnQgPSB6OworCXJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgU1NIX1YxOiAgICAgICAgICAgICAgICAgICAgICAvKiBTU0ggVjEgKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkoc3NodjF0YWIsbnNzaHYxdGFiLCIiLCIiLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIHN3aXRjaCAoeSkgeworICAgICAgICAgIGNhc2UgU1NIMV9LNTQ6CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHNldG9uKCZzc2hfazVfaXNfazQpKTsKKyAgICAgICAgICBjYXNlIFNTSDFfQ0lGOiAgICAgICAgICAgICAgICAvKiBOb3QgYSBsaXN0ICovCisgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShzc2gxY2lwaGVycyxuc3NoMWNpcGhlcnMsIiIsIiIsIHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICBpZiAoeSAhPSAtMykKKyAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgICAgIGlmICh5ID09IC0zKSB7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NoMV9jaWYsTlVMTCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBuc3NoMWNpcGhlcnM7IHgrKykKKyAgICAgICAgICAgICAgICAgIGlmIChzc2gxY2lwaGVyc1t4XS5rd3ZhbCA9PSB5KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2gxX2NpZixzc2gxY2lwaGVyc1t4XS5rd2QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgIGNhc2UgU1NIMV9HTkg6CisgICAgICAgICAgY2FzZSBTU0gxX1VOSDoKKyAgICAgICAgICAgIGlmICgoeCA9IGNtaWZpKCJGaWxlbmFtZSIsIiIsJnMsJnoseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeCAhPSAtMykKKyAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICAgICAgICAgIGlmICh6Zm5xZnAobGluZSxUTVBCVUZTSVosdG1wYnVmKSkKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweShsaW5lLHRtcGJ1ZixMSU5CVUZTSVopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA9ICh4ID09IC0zKSA/IE5VTEwgOiBsaW5lOworICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICBzd2l0Y2ggKHkpIHsKKyAgICAgICAgICAgICAgY2FzZSBTU0gxX0dOSDogbWFrZXN0cigmc3NoMV9nbmgscyk7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFNTSDFfVU5IOiBtYWtlc3RyKCZzc2gxX3VuaCxzKTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0KKworICAgICAgY2FzZSBTU0hfVjI6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNTSCBWMiAqLworICAgICAgICBpZiAoKHkgPSBjbWtleShzc2h2MnRhYixuc3NodjJ0YWIsIiIsIiIsIHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgY2FzZSBTU0gyX0FSSzoKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJnNzaDJfYXJrKSk7CisgICAgICAgIGNhc2UgU1NIMl9BVVQ6IHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiAqLworI2RlZmluZSBUTVBDTlQgMTIKKyAgICAgICAgICAgIGludCBpLCBqLCB0bXBbVE1QQ05UXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBUTVBDTlQ7IGkrKykKKyAgICAgICAgICAgICAgdG1wW2ldID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBUTVBDTlQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KHNzaDJhdXQsbnNzaDJhdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIG1ldGhvZCIsIiIseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHkgPT0gLTMpCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodG1wW2pdID09IHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXHJcbj9DaG9pY2UgaGFzIGFscmVhZHkgYmVlbiB1c2VkLlxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wW2ldID0geTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoeiA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHopOworCisgICAgICAgICAgICBpZiAoc3NoMl9hdXRoKSB7CisgICAgICAgICAgICAgICAgZnJlZShzc2gyX2F1dGgpOworICAgICAgICAgICAgICAgIHNzaDJfYXV0aCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBuc3NoMmF1dDsgeCsrKQorICAgICAgICAgICAgICAgICAgICAgIGlmIChzc2gyYXV0W3hdLmt3dmFsID09IHRtcFtqXSAmJiAhc3NoMmF1dFt4XS5mbGdzKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGxlbiArPSBzdHJsZW4oc3NoMmF1dFt4XS5rd2QpICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3NoMl9hdXRoID0gbWFsbG9jKGxlbik7CisgICAgICAgICAgICAgICAgc3NoMl9hdXRoWzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBuc3NoMmF1dDsgeCsrKQorICAgICAgICAgICAgICAgICAgICAgIGlmIChzc2gyYXV0W3hdLmt3dmFsID09IHRtcFtqXSAmJiAhc3NoMmF1dFt4XS5mbGdzKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdChzc2gyX2F1dGgsc3NoMmF1dFt4XS5rd2QsbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPCBpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQoc3NoMl9hdXRoLCIsIixsZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjdW5kZWYgVE1QQ05UCisgICAgICAgICAgfQorICAgICAgICBjYXNlIFNTSDJfQ0lGOiB7CisjZGVmaW5lIFRNUENOVCAxMgorICAgICAgICAgICAgaW50IGksIGosIHRtcFtUTVBDTlRdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFRNUENOVDsgaSsrKQorICAgICAgICAgICAgICB0bXBbaV0gPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgVE1QQ05UOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShzc2gyY2lwaGVycyxuc3NoMmNpcGhlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIiIsIHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh5ID09IC0zKQorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFtqXSA9PSB5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxyXG4/Q2hvaWNlIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC5cclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRtcFtpXSA9IHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih6KTsKKworICAgICAgICAgICAgaWYgKHNzaDJfY2lmKSB7CisgICAgICAgICAgICAgICAgZnJlZShzc2gyX2NpZik7CisgICAgICAgICAgICAgICAgc3NoMl9jaWYgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChqPTA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG5zc2gyY2lwaGVyczsgeCsrKQorICAgICAgICAgICAgICAgICAgICAgIGlmIChzc2gyY2lwaGVyc1t4XS5rd3ZhbCA9PSB0bXBbal0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIXNzaDJjaXBoZXJzW3hdLmZsZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgbGVuICs9IHN0cmxlbihzc2gyY2lwaGVyc1t4XS5rd2QpICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3NoMl9jaWYgPSBtYWxsb2MobGVuKTsKKyAgICAgICAgICAgICAgICBzc2gyX2NpZlswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG5zc2gyY2lwaGVyczsgeCsrKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3NoMmNpcGhlcnNbeF0ua3d2YWwgPT0gdG1wW2pdICYmICFzc2gyY2lwaGVyc1t4XS5mbGdzKQorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQoc3NoMl9jaWYsc3NoMmNpcGhlcnNbeF0ua3dkLGxlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgaSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHNzaDJfY2lmLCIsIixsZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjdW5kZWYgVE1QQ05UCisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTU0gyX01BQzogeworI2RlZmluZSBUTVBDTlQgMTIKKyAgICAgICAgICAgIGludCBpLCBqLCB0bXBbVE1QQ05UXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBUTVBDTlQ7IGkrKykKKyAgICAgICAgICAgICAgdG1wW2ldID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFRNUENOVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkoc3NoMm1hY3MsbnNzaDJtYWNzLCIiLCIiLCB4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoeSA9PSAtMykKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXBbal0gPT0geSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcclxuP0Nob2ljZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0bXBbaV0gPSB5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih6KTsKKworICAgICAgICAgICAgaWYgKHNzaDJfbWFjKSB7CisgICAgICAgICAgICAgICAgZnJlZShzc2gyX21hYyk7CisgICAgICAgICAgICAgICAgc3NoMl9tYWMgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbnNzaDJtYWNzOyB4KyspCisgICAgICAgICAgICAgICAgICAgICAgaWYgKHNzaDJtYWNzW3hdLmt3dmFsID09IHRtcFtqXSAmJiAhc3NoMm1hY3NbeF0uZmxncykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBsZW4gKz0gc3RybGVuKHNzaDJtYWNzW3hdLmt3ZCkgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzc2gyX21hYyA9IG1hbGxvYyhsZW4pOworICAgICAgICAgICAgICAgIHNzaDJfbWFjWzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbnNzaDJtYWNzOyB4KyspCisgICAgICAgICAgICAgICAgICAgICAgaWYgKHNzaDJtYWNzW3hdLmt3dmFsID09IHRtcFtqXSAmJiAhc3NoMm1hY3NbeF0uZmxncykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQoc3NoMl9tYWMsc3NoMm1hY3NbeF0ua3dkLGxlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgaSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHNzaDJfbWFjLCIsIixsZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjdW5kZWYgVE1QQ05UCisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgU1NIMl9IS0E6IHsKKyNkZWZpbmUgVE1QQ05UIDEyCisgICAgICAgICAgICBpbnQgaSwgaiwgdG1wW1RNUENOVF07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgVE1QQ05UOyBpKyspCisgICAgICAgICAgICAgIHRtcFtpXSA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBUTVBDTlQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KGhrYXRhYixuaGthdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCIiLCB4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoeSA9PSAtMykKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXBbal0gPT0geSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcclxuP0Nob2ljZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0bXBbaV0gPSB5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeik7CisKKyAgICAgICAgICAgIGlmIChzc2gyX2hrYSkgeworICAgICAgICAgICAgICAgIGZyZWUoc3NoMl9oa2EpOworICAgICAgICAgICAgICAgIHNzaDJfaGthID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSAwOworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBuaGthdGFiOyB4KyspCisgICAgICAgICAgICAgICAgICAgICAgaWYgKGhrYXRhYlt4XS5rd3ZhbCA9PSB0bXBbal0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIWhrYXRhYlt4XS5mbGdzKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGxlbiArPSBzdHJsZW4oaGthdGFiW3hdLmt3ZCkgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzc2gyX2hrYSA9IG1hbGxvYyhsZW4pOworICAgICAgICAgICAgICAgIHNzaDJfaGthWzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbmhrYXRhYjsgeCsrKQorICAgICAgICAgICAgICAgICAgICBpZiAoaGthdGFiW3hdLmt3dmFsID09IHRtcFtqXSAmJiAhaGthdGFiW3hdLmZsZ3MpCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdChzc2gyX2hrYSxoa2F0YWJbeF0ua3dkLGxlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgaSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHNzaDJfaGthLCIsIixsZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjdW5kZWYgVE1QQ05UCisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgU1NIMl9HTkg6CisgICAgICAgICAgY2FzZSBTU0gyX1VOSDoKKyAgICAgICAgICAgIGlmICgoeCA9IGNtaWZpKCJGaWxlbmFtZSIsIiIsJnMsJnoseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeCAhPSAtMykKKyAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICAgICAgICAgIGlmICh6Zm5xZnAobGluZSxUTVBCVUZTSVosdG1wYnVmKSkKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweShsaW5lLHRtcGJ1ZixMSU5CVUZTSVopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA9ICh4ID09IC0zKSA/IE5VTEwgOiBsaW5lOworICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICBzd2l0Y2ggKHkpIHsKKyAgICAgICAgICAgICAgY2FzZSBTU0gyX0dOSDogbWFrZXN0cigmc3NoMl9nbmgscyk7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFNTSDJfVU5IOiBtYWtlc3RyKCZzc2gyX3VuaCxzKTsgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICB9CisKKyAgICAgIGNhc2UgU1NIX1ZSQjogICAgICAgICAgICAgICAgICAgICAvKiBWZXJib3NpdHkgbGV2ZWwgKi8KKyAgICAgICAgeSA9IGNtbnVtKCJTU0ggdmVyYm9zaXR5IGxldmVsLCAwLTciLCIyIiwxMCwmeCx4eHN0cmluZyk7CisgICAgICAgIHJldHVybihzZXRudW0oJnNzaF92cmIseCx5LDcpKTsKKworICAgICAgY2FzZSBTU0hfVkVSOiAgICAgICAgICAgICAgICAgICAgIC8qIFZlcnNpb24gKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkoc3NodmVyLDMsIiIsImF1dG8iLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIHNzaF92ZXIgPSB5OyAgICAgICAgICAgICAgICAgICAgLyogMCA9PSBBVVRPICovCisjaWZuZGVmIFNTSFRFU1QKKyAgICAgICAgc2xfc3NoX3Zlcl9zYXZlZCA9IDA7CisjZW5kaWYgLyogU1NIVEVTVCAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICBjYXNlIFNTSF9JREY6IHsgICAgICAgICAgICAgICAgICAgLyogSWRlbnRpdHkgZmlsZSAqLworICAgICAgICBpbnQgaSwgbjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtaWZpKCJGaWxlbmFtZSIsIiIsJnMsJnkseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghemZucWZwKHMsTElOQlVGU0laLGxpbmUpKQorICAgICAgICAgICAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgICAgICAgICBtYWtlc3RyKCZzc2hfdG1wW2ldLGxpbmUpOworICAgICAgICB9CisgICAgICAgIG4gPSBpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICAgIG1ha2VzdHIoJihzc2hfdG1wW2ldKSxOVUxMKTsKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgICAgICAgbWFrZXN0cigmKHNzaF9pZGZbaV0pLE5VTEwpOworICAgICAgICAgICAgaWYgKGkgPCBuKSB7CisgICAgICAgICAgICAgICAgc3NoX2lkZltpXSA9IHNzaF90bXBbaV07CisgICAgICAgICAgICAgICAgc3NoX3RtcFtpXSA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1ha2VzdHIoJihzc2hfdG1wW2ldKSxOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzc2hfaWRmX24gPSBuOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorICAgICAgY2FzZSBTU0hfWEZXOiAgICAgICAgICAgICAgICAgICAgIC8qIFgxMS1mb3J3YXJkaW5nICovCisgICAgICAgIHN1Y2Nlc3MgPSBzZXRvbigmc3NoX3hmdyk7CisjaWZuZGVmIFNTSFRFU1QKKyAgICAgICAgaWYgKHN1Y2Nlc3MpCisgICAgICAgICAgc2xfc3NoX3hmd19zYXZlZCA9IDA7CisjZW5kaWYgLyogU1NIVEVTVCAqLworICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisKKyAgICAgIGNhc2UgU1NIX1hBTDogICAgICAgICAgICAgICAgICAgICAvKiBTU0ggWGF1dGggTG9jYXRpb24gKi8KKyAgICAgICAgaWYgKCh4ID0gY21pZmkoIlBhdGggdG8gZXhlY3V0YWJsZSIsICIiLCZzLCZ5LHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoeCAhPSAtMykKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICAgICAgaWYgKHpmbnFmcChsaW5lLFRNUEJVRlNJWix0bXBidWYpKQorICAgICAgICAgICAgICBja3N0cm5jcHkobGluZSx0bXBidWYsTElOQlVGU0laKTsKKyAgICAgICAgfQorICAgICAgICBzID0gKHggPT0gLTMpID8gTlVMTCA6IGxpbmU7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICBtYWtlc3RyKCZzc2hfeGFsLHMpOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICBjYXNlIFNTSF9DRkc6ICAgICAgICAgICAgICAgICAgICAgLyogVXNlIE9wZW5TU0ggQ29uZmlnICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJnNzaF9jZmcpKTsKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybigtMik7CisgICAgfQorfQorI2VuZGlmIC8qIEFOWVNTSCAqLworCisjaWZkZWYgU0ZUUF9CVUlMVElOCitzdGF0aWMgaW50Citkb3NldHNmdHAoKSB7CisgICAgaW50IGN4LCB4LCB5LCB6OworICAgIGNoYXIgKiBzOworCisgICAgaWYgKChjeCA9IGNta2V5KHNmdHB0YWIsbnNmdHB0YWIsIiIsIiIsIHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKGN4KTsKKyAgICBzd2l0Y2ggKGN4KSB7CisgICAgY2FzZSBYWV9TRlRQX0VPTDoKKyAgICBjYXNlIFhZX1NGVFBfUkNTOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybigtMik7CisgICAgfQorfQorI2VuZGlmIC8qIFNGVFBfQlVJTFRJTiAqLworCisjaWZkZWYgS1VJCisjaW5jbHVkZSAiaWt1aS5oIgorZXh0ZXJuIFVMT05HIFJHQlRhYmxlWzE2XTsKKworI2RlZmluZSBHVUlfUkdCICAxCisjZGVmaW5lIEdVSV9XSU4gIDIKKyNkZWZpbmUgR1VJX0ZPTiAgMworI2RlZmluZSBHVUlfRElBICA0CisjZGVmaW5lIEdVSV9UTEIgIDUKKyNkZWZpbmUgR1VJX01OQiAgNgorCisjZGVmaW5lIEdVSVdfUE9TIDEKKyNkZWZpbmUgR1VJV19SRVMgMgorI2RlZmluZSBHVUlXX1JVTiAzCisjZGVmaW5lIEdVSVdSX05PTiAwCisjZGVmaW5lIEdVSVdSX0ZPTiAxCisjZGVmaW5lIEdVSVdSX0RJTSAyCisjZGVmaW5lIEdVSVdOX1JFUyAxCisjZGVmaW5lIEdVSVdOX01JTiAyCisjZGVmaW5lIEdVSVdOX01BWCAzCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGd1aXRhYltdID0geworICAgIHsgImRpYWxvZ3MiLCAgICAgR1VJX0RJQSwgIDAgfSwKKyAgICB7ICJmb250IiwgICAgICAgIEdVSV9GT04sICAwIH0sCisgICAgeyAibWVudWJhciIsICAgICBHVUlfTU5CLCAgMCB9LAorICAgIHsgInJnYmNvbG9yIiwgICAgR1VJX1JHQiwgIDAgfSwKKyAgICB7ICJ0b29sYmFyIiwgICAgIEdVSV9UTEIsICAwIH0sCisgICAgeyAid2luZG93IiwgICAgICBHVUlfV0lOLCAgMCB9LAorICAgIHsgIiIsIDAsIDB9Cit9Oworc3RhdGljIGludCBuZ3VpdGFiID0gKHNpemVvZihndWl0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgZ3Vpd3RhYltdID0geworICAgIHsgInBvc2l0aW9uIiwgICAgR1VJV19QT1MsIDAgfSwKKyAgICB7ICJyZXNpemUtbW9kZSIsIEdVSVdfUkVTLCAwIH0sCisgICAgeyAicnVuLW1vZGUiLCAgICBHVUlXX1JVTiwgMCB9LAorICAgIHsgIiIsIDAsIDB9Cit9Oworc3RhdGljIGludCBuZ3Vpd3RhYiA9IChzaXplb2YoZ3Vpd3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBndWl3cnRhYltdID0geworICAgIHsgImNoYW5nZS1kaW1lbnNpb25zIiwgIEdVSVdSX0RJTSwgMCB9LAorICAgIHsgIm5vbmUiLCAgICAgICAgICAgICAgIEdVSVdSX05PTiwgMCB9LAorICAgIHsgInNjYWxlLWZvbnQiLCAgICAgICAgIEdVSVdSX0ZPTiwgMCB9LAorICAgIHsgIiIsIDAsIDB9Cit9Oworc3RhdGljIGludCBuZ3Vpd3J0YWIgPSAoc2l6ZW9mKGd1aXdydGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGd1aXdudGFiW10gPSB7CisgICAgeyAibWF4aW1pemUiLCAgR1VJV05fTUFYLCAwIH0sCisgICAgeyAibWluaW1pemUiLCAgR1VJV05fTUlOLCAwIH0sCisgICAgeyAicmVzdG9yZSIsICAgR1VJV05fUkVTLCAwIH0sCisgICAgeyAiIiwgMCwgMH0KK307CitzdGF0aWMgaW50IG5ndWl3bnRhYiA9IChzaXplb2YoZ3Vpd250YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgcmdidGFiW10gPSB7CisgICAgeyAiYmxhY2siLCAgICAgICAgIDAsIDAgfSwKKyAgICB7ICJibHVlIiwgICAgICAgICAgMSwgMCB9LAorICAgIHsgImJyb3duIiwgICAgICAgICA2LCAwIH0sCisgICAgeyAiY3lhbiIsICAgICAgICAgIDMsIDAgfSwKKyAgICB7ICJkYXJrZ3JheSIsICAgICAgOCwgMCB9LAorICAgIHsgImRncmF5IiwgICAgICAgICA4LCBDTV9JTlYgfSwKKyAgICB7ICJncmVlbiIsICAgICAgICAgMiwgMCB9LAorICAgIHsgImxibHVlIiwgICAgICAgICA5LCBDTV9JTlYgfSwKKyAgICB7ICJsY3lhbiIsICAgICAgICAxMSwgQ01fSU5WIH0sCisgICAgeyAibGdyZWVuIiwgICAgICAgMTAsIENNX0lOViB9LAorICAgIHsgImxncmF5IiwgICAgICAgICA3LCBDTV9JTlYgfSwKKyAgICB7ICJsaWdodGJsdWUiLCAgICAgOSwgMCB9LAorICAgIHsgImxpZ2h0Y3lhbiIsICAgIDExLCAwIH0sCisgICAgeyAibGlnaHRncmVlbiIsICAgMTAsIDAgfSwKKyAgICB7ICJsaWdodGdyYXkiLCAgICAgNywgMCB9LAorICAgIHsgImxpZ2h0bWFnZW50YSIsIDEzLCAwIH0sCisgICAgeyAibGlnaHRyZWQiLCAgICAgMTIsIDAgfSwKKyAgICB7ICJsbWFnZW50YSIsICAgICAxMywgQ01fSU5WIH0sCisgICAgeyAibHJlZCIsICAgICAgICAgMTIsIENNX0lOViB9LAorICAgIHsgIm1hZ2VudGEiLCAgICAgICA1LCAwIH0sCisgICAgeyAicmVkIiwgICAgICAgICAgIDQsIDAgfSwKKyAgICB7ICJ3aGl0ZSIsICAgICAgICAxNSwgMCB9LAorICAgIHsgInllbGxvdyIsICAgICAgIDE0LCAwIH0sCisKK307CitpbnQgbnJnYiA9IChzaXplb2YocmdidGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK1ZPSUQKK3Nob2d1aSgpIHsKKyAgICBleHRlcm4gZ3VpX2RpYWxvZzsKKyAgICBleHRlcm4gSFdORCBnZXRId25kS1VJKCk7CisgICAgdW5zaWduZWQgY2hhciBjbWRzYXYgPSBjb2xvcmNtZDsKKyAgICBpbnQgaSwgcmVkLCBncmVlbiwgYmx1ZSwgbGluZXM9MDsKKyAgICBjaGFyICogczsKKworCisgICAgcHJpbnRmKCJHVUkgcGFyYW10ZXJzOlxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIiAgRGlhbG9nczogICAgICVzXG4iLHNob3dvZmYoZ3VpX2RpYWxvZykpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCIgIFBvc2l0aW9uOiAgICAlZCwlZFxuIixnZXRfZ3VpX3dpbmRvd19wb3NfeCgpLAorICAgICAgICAgICAgZ2V0X2d1aV93aW5kb3dfcG9zX3koKSk7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIiAgUmVzb2x1dGlvbjogICVkIHggJWRcbiIsR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTiksCisgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKSk7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIiAgUnVuLW1vZGU6ICAgICVzXG4iLElzSWNvbmljKGdldEh3bmRLVUkoKSkgPyAibWluaW1pemVkIiA6CisgICAgICAgICAgICBJc1pvb21lZChnZXRId25kS1VJKCkpID8gIm1heGltaXplZCIgOiAicmVzdG9yZWQiKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIHN3aXRjaCAoIGdldF9ndWlfcmVzaXplX21vZGUoKSApIHsKKyAgICAgIGNhc2UgR1VJV1JfTk9OOgorICAgICAgICBzID0gIm5vbmUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1VJV1JfRk9OOgorICAgICAgICBzID0gInNjYWxlcyBmb250IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdVSVdSX0RJTToKKyAgICAgICAgcz0gImNoYW5nZXMgZGltZW5zaW9ucyI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwcmludGYoIiAgUmVzaXplLW1vZGU6ICVzXG4iLHMpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCJcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbGluZXMgPSAwOyB9CisKKyAgICBwcmludGYoIlJHQiBDb2xvciBUYWJsZTpcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCIgIENvbG9yICAgICAgICAgICAgICBSZWQgR3JlZW4gQmx1ZVxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZvciAoaSA9IDA7IGkgPCBucmdiOyBpKyspIHsKKyAgICAgICAgaWYgKCFyZ2J0YWJbaV0uZmxncykgeworICAgICAgICAgICAgYmx1ZSA9IChSR0JUYWJsZVtyZ2J0YWJbaV0ua3d2YWxdICYgMHgwMEZGMDAwMCk+PjE2OworICAgICAgICAgICAgZ3JlZW4gPSAoUkdCVGFibGVbcmdidGFiW2ldLmt3dmFsXSAmIDB4MDAwMEZGMDApPj44OworICAgICAgICAgICAgcmVkID0gKFJHQlRhYmxlW3JnYnRhYltpXS5rd3ZhbF0gJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgIHByaW50ZigiICAlLTE4cyAlM2QgICUzZCAgJTNkICAiLHJnYnRhYltpXS5rd2QscmVkLGdyZWVuLGJsdWUpOworICAgICAgICAgICAgY29sb3JjbWQgPSByZ2J0YWJbaV0ua3d2YWwgPDwgNDsKKyAgICAgICAgICAgIHByaW50ZigiKioqKioqKioiKTsKKyAgICAgICAgICAgIGNvbG9yY21kID0gY21kc2F2OworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsKKwkJaWYgKCFhc2ttb3JlKCkpCisJCSAgcmV0dXJuOworCQllbHNlCisJCSAgbGluZXMgPSAwOworCSAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworfQorCitpbnQKK3NldHJnYigpIHsKKyAgICBpbnQgY3gsIHJlZCA9IDAsIGJsdWUgPSAwLCBncmVlbiA9IDAsIHosIHg7CisKKyAgICBpZiAoKGN4ID0gY21rZXkocmdidGFiLG5yZ2IsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oY3gpOworICAgIGlmICgoeiA9IGNtbnVtKCJSZWQgdmFsdWUsIDAtMjU1IiwiIiwxMCwmcmVkLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHopOworICAgIGlmICgoeiA9IGNtbnVtKCJHcmVlbiB2YWx1ZSwgMC0yNTUiLCIiLDEwLCZncmVlbix4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih6KTsKKyAgICBpZiAoKHogPSBjbW51bSgiQmx1ZSB2YWx1ZSwgMC0yNTUiLCIiLDEwLCZibHVlLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHopOworICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgIGlmIChjeCA+IDE1IHx8IHJlZCA+IDI1NSB8fCBibHVlID4gMjU1IHx8IGdyZWVuID4gMjU1KQorICAgICAgcmV0dXJuKC0yKTsKKyAgICBSR0JUYWJsZVtjeF0gPSAodW5zaWduZWQpKCgodW5zaWduZWQpYmx1ZSA8PCAxNikgfAorICAgICAgICAodW5zaWduZWQpKCh1bnNpZ25lZClncmVlbiA8PCA4KSB8CisgICAgICAgICh1bnNpZ25lZClyZWQpOworICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisKKy8qCisgIFNldCBHVUkgd2luZG93IHBvc2l0aW9uOiBYWSBjb29yZGluYXRlcyBvZiB1cHBlciBsZWZ0IGNvcm5lciwKKyAgZXhwcmVzc2VkIGFzIHBpeGVsIG51bWJlcnMgaW4gdGhlIGN1cnJlbnQgc2NyZWVuIHJlc29sdXRpb24uCisgICgwLDApIG1lYW5zIHB1dCBvdXJzZWx2ZXMgaW4gdGhlIHVwcGVyIGxlZnQgY29ybmVyLgorICBDYW4gd2UgY2hlY2sgZm9yIG91dCBvZiBib3VuZHM/CisqLworCitpbnQKK3NldGd1aXdpbigpIHsKKyAgICBpbnQgY3gsIHgsIHksIHo7CisgICAgaWYgKChjeCA9IGNta2V5KGd1aXd0YWIsbmd1aXd0YWIsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oY3gpOworICAgIHN3aXRjaCAoY3gpIHsKKyAgICAgIGNhc2UgR1VJV19QT1M6CisgICAgICAgIGlmICgoeiA9IGNtbnVtKCJYIGNvb3JkaW5hdGUgKHBpeGVsIG51bWJlcikiLCIiLDEwLCZ4LHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgaWYgKCh6ID0gY21udW0oIlkgY29vcmRpbmF0ZSAocGl4ZWwgbnVtYmVyKSIsIiIsMTAsJnkseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiP0Nvb3JkaW5hdGVzIG11c3QgYmUgMCBvciBncmVhdGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgZ3VpX3Bvc2l0aW9uKHgseSk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICBjYXNlIEdVSVdfUkVTOgorICAgICAgICBpZiAoKHggPSBjbWtleShndWl3cnRhYixuZ3Vpd3J0YWIsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICBndWlfcmVzaXplX21vZGUoeCk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICBjYXNlIEdVSVdfUlVOOgorCWlmICgoeCA9IGNta2V5KGd1aXdudGFiLG5ndWl3bnRhYiwiIiwiIix4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih4KTsKKwlpZiAoKHogPSBjbWNmbSgpKSA8IDApCisJICByZXR1cm4oeik7CisJZ3VpX3dpbl9ydW5fbW9kZSh4KTsKKwlyZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9Cit9CisKK2ludAorc2V0Z3VpZm9udCgpIHsJCQkJLyogQXNzdW1lcyB0aGF0IENLRkxPQVQgaXMgZGVmaW5lZCEgKi8KKworICAgIGV4dGVybiBzdHJ1Y3Qga2V5dGFiICogdGVybV9mb250OworICAgIGV4dGVybiBzdHJ1Y3Qga2V5dGFiICogX3Rlcm1fZm9udDsKKyAgICBleHRlcm4gaW50IHR0X2ZvbnQsIHR0X2ZvbnRfc2l6ZSwgbnRlcm1mb250OworICAgIGludCB4LCB5LCB6OworICAgIGNoYXIgKnM7CisKKyAgICBpZiAobnRlcm1mb250ID09IDApCisgICAgICBCdWlsZEZvbnRUYWJsZSgmdGVybV9mb250LCAmX3Rlcm1fZm9udCwgJm50ZXJtZm9udCk7CisgICAgaWYgKCEodGVybV9mb250ICYmIF90ZXJtX2ZvbnQgJiYgbnRlcm1mb250ID4gMCkpIHsKKyAgICAgICAgcHJpbnRmKCI/SW50ZXJuYWwgZXJyb3I6IEZhaWx1cmUgdG8gZW51bWVyYXRlIGZvbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKCh4ID0gY21rZXkoX3Rlcm1fZm9udCxudGVybWZvbnQsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgaWYgKCh6ID0gY21mbGQoIkhlaWdodCBvZiBmb250IGluIHBvaW50cyIsIjEyIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih6KTsKKyAgICBpZiAoaXNmbG9hdChzLDApIDwgMSkgewkJLyogKHNldHMgZmxvYXR2YWwpICovCisJcHJpbnRmKCI/SW50ZWdlciBvciBmbG9hdGluZy1wb2ludCBudW1iZXIgcmVxdWlyZWRcbiIpOworCXJldHVybigtOSk7CisgICAgfQorICAgIGlmIChmbG9hdHZhbCA8IDAuNSkgeworCXByaW50ZigiP1Bvc2l0aXZlIG51bWJlciByZXF1aXJlZFxuIik7CisJcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHopOworICAgIHR0X2ZvbnQgPSB4OwkJCS8qIEZvbnQgaW5kZXggKi8KKyAgICB0dF9mb250X3NpemUgPSAoaW50KShmbG9hdHZhbCAqIDIpOwkvKiBGb250IHNpemUgaW4gaGFsZiBwb2ludHMgKi8KKyAgICBLdWlTZXRQcm9wZXJ0eShLVUlfVEVSTV9GT05ULCAobG9uZyl0dF9mb250LCAobG9uZyl0dF9mb250X3NpemUpOworICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisKK1ZPSUQKK3NldGd1aWRpYWxvZyh4KSBpbnQgeDsKK3sKKyAgICBleHRlcm4gaW50IGd1aV9kaWFsb2c7CisgICAgZ3VpX2RpYWxvZyA9IHg7CisgICAgS3VpU2V0UHJvcGVydHkoS1VJX0dVSV9ESUFMT0dTLCAobG9uZyl4LCAwTCk7Cit9CisKK1ZPSUQKK3NldGd1aW1lbnViYXIoeCkgaW50IHg7Cit7CisgICAgS3VpU2V0UHJvcGVydHkoS1VJX0dVSV9NRU5VQkFSLCAobG9uZyl4LCAwTCk7Cit9CisKK1ZPSUQKK3NldGd1aXRvb2xiYXIoeCkgaW50IHg7Cit7CisgICAgS3VpU2V0UHJvcGVydHkoS1VJX0dVSV9UT09MQkFSLCAobG9uZyl4LCAwTCk7Cit9CisKK2ludAorc2V0Z3VpKCkgeworICAgIGludCBjeCwgeCwgcmM7CisgICAgaWYgKChjeCA9IGNta2V5KGd1aXRhYixuZ3VpdGFiLCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKGN4KTsKKyAgICBzd2l0Y2ggKGN4KSB7CisgICAgICBjYXNlIEdVSV9ESUE6CisgICAgICAgIHJjID0gc2V0b24oJngpOworICAgICAgICBpZiAocmMgPj0gMCkKKyAgICAgICAgICBzZXRndWlkaWFsb2coeCk7CisgICAgICAgIHJldHVybihyYyk7CisgICAgICBjYXNlIEdVSV9GT046CisgICAgICAgIHJldHVybihzZXRndWlmb250KCkpOworICAgICAgY2FzZSBHVUlfUkdCOgorICAgICAgICByZXR1cm4oc2V0cmdiKCkpOworICAgICAgY2FzZSBHVUlfV0lOOgorICAgICAgICByZXR1cm4oc2V0Z3Vpd2luKCkpOworICAgICAgY2FzZSBHVUlfVExCOgorICAgICAgICByYyA9IHNldG9uKCZ4KTsKKyAgICAgICAgaWYgKHJjID49IDApCisgICAgICAgICAgc2V0Z3VpdG9vbGJhcih4KTsKKyAgICAgICAgcmV0dXJuKHJjKTsKKyAgICAgIGNhc2UgR1VJX01OQjoKKyAgICAgICAgcmMgPSBzZXRvbigmeCk7CisgICAgICAgIGlmIChyYyA+PSAwKQorICAgICAgICAgIHNldGd1aW1lbnViYXIoeCk7CisgICAgICAgIHJldHVybihyYyk7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4oLTIpOworICAgIH0KK30KKyNlbmRpZiAvKiBLVUkgKi8KKworVk9JRAorc2V0ZXhpdHdhcm4oeCkgaW50IHg7IAoreworICAgIHhpdHdhcm4gPSB4OworI2lmZGVmIEtVSQorICAgIEt1aVNldFByb3BlcnR5KEtVSV9FWElUX1dBUk5JTkcsIChsb25nKXgsIDBMKTsKKyNlbmRpZiAvKiBLVUkgKi8KK30KKworI2lmbmRlZiBOT0xPQ0FMCitWT0lECitzZXRkZWJzZXMoeCkgaW50IHg7IHsKKyNpZmRlZiBPUzIKKyAgICBpZiAoKGRlYnNlcyAhPSAwKSAmJiAoeCA9PSAwKSkJLyogSXQgd2FzIG9uIGFuZCB3ZSB0dXJuZWQgaXQgb2ZmPyAqLworICAgICAgb3MyZGVidWdvZmYoKTsJCQkvKiBGaXggT1MvMiBjb2xvcmF0aW9uICovCisjZW5kaWYgLyogT1MyICovCisgICAgZGVic2VzID0geDsKKyNpZmRlZiBLVUkKKyAgICBLdWlTZXRQcm9wZXJ0eShLVUlfVEVSTV9ERUJVRyx4LDApOworI2VuZGlmIC8qIEtVSSAqLworfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworLyogIEQgTyBQIFIgTSAgLS0gIFNldCBhIHBhcmFtZXRlci4gICovCisvKgorIFJldHVybnM6CisgIC0yOiBpbGxlZ2FsIGlucHV0CisgIC0xOiByZXBhcnNlIG5lZWRlZAorICAgMDogc3VjY2VzcworKi8KK2ludAorZG9wcm0oeHgscm1zZmxnKSBpbnQgeHgsIHJtc2ZsZzsgeworICAgIGludCBpID0gMCwgeCA9IDAsIHkgPSAwLCB6ID0gMDsKKyAgICBsb25nIHp6ID0gMEw7CisgICAgY2hhciAqcyA9IE5VTEwsICpwID0gTlVMTDsKKyNpZmRlZiBPUzIKKyAgICBjaGFyIHBvcnRidWZbNjRdOworICAgIGxvbmcgcG9ydHNwZWVkID0gMEw7CisgICAgaW50IHBvcnRwYXJpdHkgPSAwOworICAgIGludCBwb3J0ZmxvdyA9IDA7CisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgTk9TRVRLRVkKKyNpZmRlZiBPUzIKKyAgICBpZiAoeHggPT0gWFlNU0spCisgICAgICByZXR1cm4oc2V0bXNrKCkpOworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PU0VUS0VZICovCisKKyAgICBpZiAoeHggPT0gWFlGTEFHKSB7ICAgICAgICAgICAgICAgICAvKiBTRVQgRkxBRyAqLworICAgICAgICBleHRlcm4gaW50IG9vZmxhZzsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSBzZXRvbigmb29mbGFnKSk7CisgICAgfQorICAgIGlmICh4eCA9PSBYWVBSVFIgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBQUklOVEVSIChvciBCUFJJTlRFUikgKi8KKyNpZmRlZiBCUFJJTlQKKyAgICAgICAgfHwgeHggPT0gWFlCRENQCisjZW5kaWYgLyogQlBSSU5UICovCisgICAgICAgICkKKyAgICAgIHJldHVybihzZXRwcmludGVyKHh4KSk7CisKKyAgICBzd2l0Y2ggKHh4KSB7CisKKyNpZmRlZiBBTllYMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgWDI1IC4uLiAqLworY2FzZSBYWVgyNToKKyAgICAgICAgcmV0dXJuKHNldHgyNSgpKTsKKworI2lmbmRlZiBJQk1YMjUKK2Nhc2UgWFlQQUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgUEFEIC4uLiAqLworICAgICAgICByZXR1cm4oc2V0cGFkcCgpKTsKKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNlbmRpZiAvKiBBTllYMjUgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgWFlFT0w6ICAgICAgIC8qIFRoZXNlIGhhdmUgYWxsIGJlZW4gbW92ZWQgdG8gc2V0IHNlbmQvcmVjZWl2ZS4uLiAqLworICAgICAgY2FzZSBYWUxFTjogICAgICAgLyogTGV0IHRoZSB1c2VyIGtub3cgd2hhdCB0byBkby4gKi8KKyAgICAgIGNhc2UgWFlNQVJLOgorICAgICAgY2FzZSBYWU5QQUQ6CisgICAgICBjYXNlIFhZUEFEQzoKKyAgICAgIGNhc2UgWFlUSU1POgorICAgICAgICBwcmludGYoIi4uLlVzZSBTRVQgU0VORCBvciBTRVQgUkVDRUlWRSBpbnN0ZWFkLlxuIik7CisgICAgICAgIHByaW50ZigiVHlwZSBIRUxQIFNFVCBTRU5EIG9yIEhFTFAgU0VUIFJFQ0VJVkUgZm9yIG1vcmUgaW5mby5cbiIpOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworCisgICAgICBjYXNlIFhZQVRUUjogICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSBBdHRyaWJ1dGUgcGFja2V0cyAqLworICAgICAgICByZXR1cm4oc2V0YXQocm1zZmxnKSk7CisKKyAgICAgIGNhc2UgWFlJRkQ6ICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNvbXBsZXRlIGZpbGUgZGlzcG9zaXRpb24gKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkoaWZkYXRhYiwzLCIiLCJhdXRvIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdTJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzEwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID09IDAgPyAiMCIgOiAoeSA9PSAxID8gIjEiIDogIjIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGtlZXAgPSB5OworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisgICAgICBjYXNlIFhZTUFUQ0g6CQkJLyogWyBSRU1PVEUgXSBTRVQgTUFUQ0guLi4gICovCisjaWZuZGVmIE5PWEZFUgorCWlmICgoeiA9IGNta2V5KG1hdGNodGFiLG5tYXRjaHRhYiwiIiwiIix4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih6KTsKKwlpZiAocm1zZmxnKSB7CisgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKwkgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisJICAgIHN3aXRjaCAoeikgeworCSAgICAgIGNhc2UgTUNIX0RPVEY6CisJCXJldHVybihzc3RhdGUgPSBzZXRnZW4oJ1MnLCIzMzAiLCB5ID09IDAgPyAiMCIgOiAiMSIsICIiKSk7CisJICAgICAgY2FzZSBNQ0hfRklGTzoKKwkJcmV0dXJuKHNzdGF0ZSA9IHNldGdlbignUycsIjMzMSIsIHkgPT0gMCA/ICIwIiA6ICIxIiwgIiIpKTsKKwkgICAgICBkZWZhdWx0OgorCQlyZXR1cm4oLTIpOworCSAgICAgIH0KKwkgIH0KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKwkgIHN3aXRjaCAoeikgeworCSAgICBjYXNlIE1DSF9GSUZPOgorCSAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJm1hdGNoZmlmbykpOworCSAgICBjYXNlIE1DSF9ET1RGOgorCSAgICAgIHggPSBzZXRvbigmbWF0Y2hkb3QpOyAKKwkgICAgICBpZiAoeCA8IDApIHJldHVybih4KTsKKwkgICAgICBkaXJfZG90cyA9IC0xOworCSAgICAgIHJldHVybihzdWNjZXNzID0geCk7CisJICAgIGRlZmF1bHQ6CisJICAgICAgcmV0dXJuKC0yKTsKKwkgIH0KKworI2lmbmRlZiBOT1NQTAorICAgICAgY2FzZSBYWUlOUFU6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBJTlBVVCAqLworICAgICAgICByZXR1cm4oc2V0aW5wKCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBORVRDT05OCisgICAgICBjYXNlIFhZTkVUOiB7ICAgICAgICAgICAgICAgICAgICAgLyogU0VUIE5FVFdPUksgKi8KKworICAgICAgICAgIHN0cnVjdCBGREIgazEsIGsyOworCisgICAgICAgICAgY21mZGJpKCZrMSxfQ01LRVksIiIsIiIsIiIsbm5ldGtleSwgMCwgeHhzdHJpbmcsIG5ldGtleSwgJmsyKTsKKyAgICAgICAgICBjbWZkYmkoJmsyLF9DTUtFWSwiIiwiIiwiIixubmV0cywgICAwLCB4eHN0cmluZywgbmV0Y21kLCBOVUxMKTsKKworI2lmZGVmIE9TMiAgICAgLyogSGlkZSBuZXR3b3JrLXR5cGUga2V5d29yZHMgZm9yIG5ldHdvcmtzIG5vdCBpbnN0YWxsZWQgKi8KKyAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgbm5ldHM7IHorKykgeworICAgICAgICAgICAgICBpZiAobmV0Y21kW3pdLmt3dmFsID09IE5FVF9UQ1BCICYmIHRjcF9hdmFpbCA9PSAwKQorICAgICAgICAgICAgICAgIG5ldGNtZFt6XS5mbGdzID0gIENNX0lOVjsKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICAgICAgICAgIGlmIChuZXRjbWRbel0ua3d2YWwgPT0gTkVUX1NTSCAmJgorICAgICAgICAgICAgICAgICAgICFja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkpCisgICAgICAgICAgICAgICAgbmV0Y21kW3pdLmZsZ3MgPSAgQ01fSU5WOworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKyNpZmRlZiBERUNORVQKKyAgICAgICAgICAgICAgZWxzZSBpZiAobmV0Y21kW3pdLmt3dmFsID09IE5FVF9ERUMgICYmIGRuZXRfYXZhaWwgPT0gMCkKKyAgICAgICAgICAgICAgICBuZXRjbWRbel0uZmxncyA9ICBDTV9JTlY7CisjZW5kaWYgLyogREVDTkVUICovCisjaWZkZWYgQ0tfTkVUQklPUworICAgICAgICAgICAgICBlbHNlIGlmIChuZXRjbWRbel0ua3d2YWwgPT0gTkVUX0JJT1MgJiYgbmV0Ymlvc0F2YWlsID09IDApCisgICAgICAgICAgICAgICAgbmV0Y21kW3pdLmZsZ3MgPSAgQ01fSU5WOworI2VuZGlmIC8qIENLX05FVEJJT1MgKi8KKyNpZmRlZiBTVVBFUkxBVAorICAgICAgICAgICAgICBlbHNlIGlmIChuZXRjbWRbel0ua3d2YWwgPT0gTkVUX1NMQVQgICYmIHNsYXRfYXZhaWwgPT0gMCkKKyAgICAgICAgICAgICAgICBuZXRjbWRbel0uZmxncyA9ICBDTV9JTlY7CisjZW5kaWYgLyogU1VQRVJMQVQgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRjcF9hdmFpbCkgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBuZXR3b3JrIHR5cGUgKi8KKyAgICAgICAgICAgIGNrc3RybmNweSh0bXBidWYsInRjcC9pcCIsVE1QQlVGU0laKTsKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICAgICAgZWxzZSBpZiAoIGNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSApCisgICAgICAgICAgICBja3N0cm5jcHkodG1wYnVmLCJzc2giLFRNUEJVRlNJWik7CisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworI2lmZGVmIERFQ05FVAorICAgICAgICAgIGVsc2UgaWYgKGRuZXRfYXZhaWwpCisgICAgICAgICAgICBja3N0cm5jcHkodG1wYnVmLCJkZWNuZXQiLFRNUEJVRlNJWik7CisjZW5kaWYgLyogREVDTkVUICovCisjaWZkZWYgU1VQRVJMQVQKKyAgICAgICAgICBlbHNlIGlmIChzbGF0X2F2YWlsKQorICAgICAgICAgICAgY2tzdHJuY3B5KHRtcGJ1Ziwic3VwZXJsYXQiLFRNUEJVRlNJWik7CisjZW5kaWYgLyogU1VQRVJMQVQgKi8KKyNpZmRlZiBDS19ORVRCSU9TCisgICAgICAgICAgZWxzZSBpZiAobmV0Ymlvc0F2YWlsKQorICAgICAgICAgICAgY2tzdHJuY3B5KHRtcGJ1ZiwibmV0YmlvcyIsVE1QQlVGU0laKTsKKyNlbmRpZiAvKiBDS19ORVRCSU9TICovCisgICAgICAgICAgZWxzZSBja3N0cm5jcHkodG1wYnVmLCJuYW1lZC1waXBlIixUTVBCVUZTSVopOworI2Vsc2UgIC8qIE9TMiAqLworI2lmZGVmIFRDUFNPQ0tFVAorICAgICAgICAgIGNrc3RybmNweSh0bXBidWYsInRjcC9pcCIsVE1QQlVGU0laKTsKKyNlbHNlCisjaWZkZWYgQU5ZWDI1CisgICAgICAgICAgY2tzdHJuY3B5KHRtcGJ1ZiwieC4yNSIsVE1QQlVGU0laKTsKKyNlbHNlCisgICAgICAgICAgY2tzdHJuY3B5KHRtcGJ1ZiwiIixUTVBCVUZTSVopOworI2VuZGlmIC8qIEFOWVgyNSAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2VuZGlmIC8qIE9TMiAqLworCisgICAgICAgICAgeCA9IGNtZmRiKCZrMSk7CisgICAgICAgICAgaWYgKHggPCAwKSB7ICAgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgICAgaWYgKHggPT0gLTIgfHwgeCA9PSAtOSkKKyAgICAgICAgICAgICAgICBwcmludGYoIj9ObyBrZXl3b3JkcyBtYXRjaDogXCIlc1wiXG4iLGF0bWJ1Zik7CisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICB9CisgICAgICAgICAgeiA9IGNtcmVzdWx0Lm5yZXN1bHQ7ICAgICAgICAgLyogS2V5d29yZCB2YWx1ZSAqLworICAgICAgICAgIGlmIChjbXJlc3VsdC5mZGJhZGRyID09ICZrMSkgeyAvKiBXaGljaCB0YWJsZT8gKi8KKyNpZm5kZWYgTk9TUEwKKyNpZm5kZWYgTk9ESUFMCisgICAgICAgICAgICAgIGlmICh6ID09IFhZTkVUX0QpCisgICAgICAgICAgICAgICAgcmV0dXJuKHBhcnNkaXIoMSkpOworI2VuZGlmIC8qIE5PRElBTCAqLworI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICAgIGlmICgoeiA9IGNta2V5KG5ldGNtZCxubmV0cywiIix0bXBidWYseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICAgIH0KKworI2lmZGVmIE5FVENNRAorICAgICAgICAgIGlmICh6ID09IE5FVF9DTUQgJiYgbm9wdXNoKSB7CisgICAgICAgICAgICAgIHByaW50ZigiXG4/U29ycnksIGFjY2VzcyB0byBleHRlcm5hbCBjb21tYW5kcyBpcyBkaXNhYmxlZFxuIik7CisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIE5FVENNRCAqLworCisjaWZuZGVmIE5PUFVTSAorI2lmZGVmIE5FVFBUWQorICAgICAgICAgIGlmICh6ID09IE5FVF9QVFkgJiYgbm9wdXNoKSB7CisgICAgICAgICAgICAgIHByaW50ZigiXG4/U29ycnksIGFjY2VzcyB0byBleHRlcm5hbCBjb21tYW5kcyBpcyBkaXNhYmxlZFxuIik7CisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIE5FVFBUWSAqLworI2VuZGlmIC8qIE5PUFVTSCAqLworCisjaWZkZWYgT1MyCisgICAgICAgICAgaWYgKHogPT0gTkVUX1RDUEIgJiYgdGNwX2F2YWlsID09IDApIHsKKyAgICAgICAgICAgICAgcHJpbnRmKAorIlxuP1NvcnJ5LCBlaXRoZXIgVENQL0lQIGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0gb3JcblwKK25lY2Vzc2FyeSBETExzIGRpZCBub3QgbG9hZC4gIFVzZSBTSE9XIE5FVFdPUksgdG8gY2hlY2sgbmV0d29yayBzdGF0dXMuXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICAgICAgfSBlbHNlIGlmICh6ID09IE5FVF9TU0ggJiYgIWNrX3NzbGVheV9pc19pbnN0YWxsZWQoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJcbj9Tb3JyeSwgU1NIIGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0uXG4iKSA7CisgICAgICAgICAgICByZXR1cm4oLTkpOworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKyNpZmRlZiBDS19ORVRCSU9TCisgICAgICAgICAgfSBlbHNlIGlmICh6ID09IE5FVF9CSU9TICYmIG5ldGJpb3NBdmFpbCA9PSAwKSB7CisgICAgICAgICAgICAgIHByaW50ZigiXG4/U29ycnksIE5FVEJJT1MgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHN5c3RlbS5cbiIpIDsKKyAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyNlbmRpZiAvKiBDS19ORVRCSU9TICovCisjaWZkZWYgREVDTkVUCisgICAgICAgICAgfSBlbHNlIGlmICh6ID09IE5FVF9ERUMgJiYgZG5ldF9hdmFpbCA9PSAwKSB7CisgICAgICAgICAgICAgIHByaW50ZigiXG4/U29ycnksIERFQ25ldCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtLlxuIikgOworICAgICAgICAgICAgICByZXR1cm4oLTkpOworI2VuZGlmIC8qIERFQ05FVCAqLworI2lmZGVmIFNVUEVSTEFUCisgICAgICAgICAgfSBlbHNlIGlmICh6ID09IE5FVF9TTEFUICYmIHNsYXRfYXZhaWwgPT0gMCkgeworICAgICAgICAgICAgICBwcmludGYoIlxuP1NvcnJ5LCBTdXBlckxBVCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtLlxuIikgOworICAgICAgICAgICAgICByZXR1cm4oLTkpOworI2VuZGlmIC8qIFNVUEVSTEFUICovCisgICAgICAgICAgfQorI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgTlBJUEVPUkJJT1MKKyAgICAgICAgICBpZiAoeiA9PSBORVRfUElQRSB8fCAgICAgICAgICAvKiBOYW1lZCBwaXBlIC0tIGFsc28gZ2V0IHBpcGVuYW1lICovCisgICAgICAgICAgICAgIHogPT0gTkVUX0JJT1MpIHsgICAgICAgICAgLyogTkVUQklPUyAtLSBhbHNvIGdldCBsb2NhbCBuYW1lICovCisgICAgICAgICAgICAgIGNoYXIgKmRlZm5hbTsKKyNpZmRlZiBDS19ORVRCSU9TCisgICAgICAgICAgICAgIGNoYXIgdG1wbmJuYW1bTkVUQklPU19OQU1FX0xFTisxXTsKKyNlbmRpZiAvKiBDS19ORVRCSU9TICovCisgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBkZWZhdWx0IG5hbWUgICovCisgICAgICAgICAgICAgIGlmICh6ID09IE5FVF9QSVBFKSB7ICAgICAgLyogTmFtZWQgcGlwZSAqLworICAgICAgICAgICAgICAgICAgZGVmbmFtID0gImtlcm1pdCI7ICAgIC8qIERlZmF1bHQgbmFtZSBpcyBhbHdheXMgImtlcm1pdCIgKi8KKyAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAvKiBOZXRCSU9TICovCisgICAgICAgICAgICAgICAgICBpZiAoTmV0Qmlvc05hbWVbMF0gIT0gU1ApIHsgLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIG5hbWUsICovCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgaW50IG47ICAgICAgICAgICAgLyogdXNlIGl0IGFzIHRoZSBkZWZhdWx0LiAqLworICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh0bXBuYm5hbSxOZXRCaW9zTmFtZSxORVRCSU9TX05BTUVfTEVOKzEpOworICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgdHJhaWxpbmcgc3BhY2VzIHRvIE5VTHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICBwID0gJnRtcG5ibmFtW05FVEJJT1NfTkFNRV9MRU4tMV07CisgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpwID09IFNQKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICpwID0gTlVMOworICAgICAgICAgICAgICAgICAgICAgICAgICBwLS07CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGRlZm5hbSA9IHRtcG5ibmFtOworICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgqbXlob3N0KSAgIC8qIE90aGVyd2lzZSB1c2UgdGhpcyBQQydzIGhvc3QgbmFtZSAqLworICAgICAgICAgICAgICAgICAgICBkZWZuYW0gPSAoY2hhciAqKSBteWhvc3Q7CisgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIHVzZSAia2VybWl0IiAqLworICAgICAgICAgICAgICAgICAgICBkZWZuYW0gPSAia2VybWl0IjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoKHkgPSBjbXR4dCgoeiA9PSBORVRfUElQRSkgPyAicGlwZSBuYW1lIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbCBORVRCSU9TIG5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuYW0sICZzLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisjaWZkZWYgTlBJUEUKKyAgICAgICAgICAgICAgcGlwZW5hbWVbMF0gPSBOVUw7CisjZW5kaWYgLyogTlBJUEUgKi8KKyAgICAgICAgICAgICAgaWYgKCh5ID0gKGludCkgc3RybGVuKHMpKSA8IDEpIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiP1lvdSBtdXN0IGFsc28gc3BlY2lmeSBhICVzIG5hbWVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHogPT0gTkVUX1BJUEUpID8gInBpcGUiIDogImxvY2FsIE5FVEJJT1MiICk7CisgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICB9CisjaWZkZWYgQ0tfTkVUQklPUworICAgICAgICAgICAgICBpZiAoeiA9PSBORVRfQklPUykgeworICAgICAgICAgICAgICAgICAgaWYgKCFuZXRiaW9zQXZhaWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9ORVRCSU9TIGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0uXG4iKSA7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmICh5IC0gTkVUQklPU19OQU1FX0xFTiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9ORVRCSU9TIG5hbWUgdG9vIGxvbmcsICVsZCBtYXhpbXVtXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRCSU9TX05BTUVfTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIXN0cmNtcChzLHRtcG5ibmFtKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICBuZXR0eXBlID0gejsgICAgICAvKiBSZXR1cm5pbmcgdG8gb2xkIGNvbm5lY3Rpb24uLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOyAvKiBEb25lICovCisgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiICAgICAgICAgICAgICAgICIsTmV0Qmlvc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/TkVUQklPUyBuYW1lIGFscmVhZHkgYXNzaWduZWQgdG8gXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRCaW9zTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgTkNCIG5jYjsKKyAgICAgICAgICAgICAgICAgICAgICBBUElSRVQgcmM7CisgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KE5ldEJpb3NOYW1lLHMsMTYpOworICAgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IHk7IHggPCBORVRCSU9TX05BTUVfTEVOOyB4KyspCisgICAgICAgICAgICAgICAgICAgICAgICBOZXRCaW9zTmFtZVt4XSA9IFNQOworICAgICAgICAgICAgICAgICAgICAgIE5ldEJpb3NOYW1lW05FVEJJT1NfTkFNRV9MRU5dID0gTlVMOworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ2hlY2tpbmcgXCIlc1wiIGFzIGEgdW5pcXVlIE5ldEJJT1MgbmFtZS4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0Qmlvc05hbWUpOworICAgICAgICAgICAgICAgICAgICAgIHJjID0gTkNCQWRkTmFtZSggTmV0YmV1aUFQSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5jYiwgTmV0Qmlvc0FkYXB0ZXIsIE5ldEJpb3NOYW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAiP1NvcnJ5LCBcIiVzXCIgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciBOZXRCSU9TIG5vZGUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0Qmlvc05hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgTkVUQklPU19OQU1FX0xFTjsgeCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldEJpb3NOYW1lW3hdID0gU1A7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworI2lmZGVmIE5QSVBFCisgICAgICAgICAgICAgIGlmICh6ID09IE5FVF9QSVBFKQorICAgICAgICAgICAgICAgIGNrc3RybmNweShwaXBlbmFtZSxzLFBJUEVOQU1MKTsKKyNlbmRpZiAvKiBOUElQRSAqLworICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIE5QSVBFT1JCSU9TICovCisjaWZkZWYgREVDTkVUCisgICAgICAgICAgICBpZiAoeiA9PSBORVRfREVDKSB7CisgICAgICAgICAgICAgICAgLyogRGV0ZXJtaW5lIGlmIHdlIGFyZSB1c2luZyBMQVQgb3IgQ1RFUk0gKi8KKyAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShkbmV0dGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbmV0LCJERUNORVQgcHJvdG9jb2wiLCJsYXQiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgIHR0bnByb3RvID0geTsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIERFQ05FVCAqLworI2lmZGVmIE5FVERMTAorICAgICAgICAgICAgICBpZiAoeiA9PSBORVRfRExMKSB7CisgICAgICAgICAgICAgICAgICAvKiBGaW5kIG91dCB3aGljaCBETEwgdGhleSBhcmUgdXNpbmcgKi8KKyAgICAgICAgICAgICAgICAgIGNoYXIgZGxsbmFtZVsyNTZdPSIiOworICAgICAgICAgICAgICAgICAgY2hhciAqIHA9TlVMTDsKKyAgICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtaWZpKCJEeW5hbWljIGxvYWQgbGlicmFyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwmcCwmeSx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP05hbWUgb2YgRExMIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGRsbG5hbWUscCwyNTYpOworICAgICAgICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChuZXRkbGxfbG9hZChkbGxuYW1lKSA8IDApIC8qIFRyeSB0byBsb2FkIHRoZSBkbGwgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgIG5ldHR5cGUgPSB6OworICAgICAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIE5FVERMTCAqLworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgIG5ldHR5cGUgPSB6OworICAgICAgICAgIGlmICgKKyNpZmRlZiBERUNORVQKKyAgICAgICAgICAgICAgKG5ldHR5cGUgIT0gTkVUX0RFQykgICYmCisjZW5kaWYgLyogREVDTkVUICovCisjaWZkZWYgTlBJUEUKKyAgICAgICAgICAgICAgKG5ldHR5cGUgIT0gTkVUX1BJUEUpICYmCisjZW5kaWYgLyogTlBJUEUgKi8KKyNpZmRlZiBDS19ORVRCSU9TCisgICAgICAgICAgICAgIChuZXR0eXBlICE9IE5FVF9CSU9TKSAmJgorI2VuZGlmIC8qIENLX05FVEJJT1MgKi8KKyNpZmRlZiBORVRGSUxFCisgICAgICAgICAgICAgIChuZXR0eXBlICE9IE5FVF9GSUxFKSAmJgorI2VuZGlmIC8qIE5FVEZJTEUgKi8KKyNpZmRlZiBORVRDTUQKKyAgICAgICAgICAgICAgKG5ldHR5cGUgIT0gTkVUX0NNRCkgJiYKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICAgICAgICAgICAgKG5ldHR5cGUgIT0gTkVUX1BUWSkgJiYKKyNlbmRpZiAvKiBORVRQVFkgKi8KKyNpZmRlZiBORVRETEwKKyAgICAgICAgICAgICAgKG5ldHR5cGUgIT0gTkVUX0RMTCkgJiYKKyNlbmRpZiAvKiBORVRETEwgKi8KKyNpZmRlZiBTVVBFUkxBVAorICAgICAgICAgICAgICAobmV0dHlwZSAhPSBORVRfU0xBVCkgJiYKKyNlbmRpZiAvKiBTVVBFUkxBVCAqLworICAgICAgICAgICAgICAobmV0dHlwZSAhPSBORVRfU1gyNSkgJiYKKyAgICAgICAgICAgICAgKG5ldHR5cGUgIT0gTkVUX1ZYMjUpICYmCisjaWZkZWYgSUJNWDI1CisgICAgICAgICAgICAgIChuZXR0eXBlICE9IE5FVF9JWDI1KSAmJgorI2VuZGlmIC8qIElCTVgyNSAqLworI2lmZGVmIFNTSEJVSUxUSU4KKyAgICAgICAgICAgICAgKG5ldHR5cGUgIT0gTkVUX1NTSCkgJiYKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisgICAgICAgICAgICAgIChuZXR0eXBlICE9IE5FVF9UQ1BCKSkgeworICAgICAgICAgICAgICBwcmludGYoIj9OZXR3b3JrIHR5cGUgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICB9CisgICAgICB9CisKKyNpZm5kZWYgTk9UQ1BPUFRTCisjaWZkZWYgVENQU09DS0VUCisgICAgICBjYXNlIFhZVENQOiB7CisgICAgICAgIGV4dGVybiBpbnQgdHR5ZmQ7CisKKyAgICAgICAgaWYgKCh6ID0gY21rZXkodGNwb3B0LG50Y3BvcHQsIlRDUCBvcHRpb24iLCJub2RlbGF5Iix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeik7CisKKyAgICAgICAgc3dpdGNoICh6KSB7CisjaWZuZGVmIE5PSFRUUAorICAgICAgICAgIGNhc2UgWFlUQ1BfSFRUUF9QUk9YWTogeworCSAgICAgIHN0cnVjdCBGREIgc3csIHR4OworCSAgICAgIGludCBuLCB4OworCSAgICAgIGNoYXIgdWJ1ZltMT0dJTkxFTisxXSwgcGJ1ZltMT0dJTkxFTisxXSwgYWJ1ZlsyNTZdOworCSAgICAgIHVidWZbMF0gPSBwYnVmWzBdID0gYWJ1ZlswXSA9IDA7CisKKwkgICAgICBjbWZkYmkoJnN3LAkJLyogRmlyc3QgRkRCIC0gc3dpdGNoZXMgKi8KKwkJICAgICBfQ01LRVksCQkvKiBmY29kZSAqLworCQkgICAgICJIVFRQIHByb3h5IHNlcnZlciBob3N0Wzpwb3J0XSBvciBzd2l0Y2giLAorCQkgICAgICIiLAkJLyogZGVmYXVsdCAqLworCQkgICAgICIiLAkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkJICAgICBudXNlcnBhc3MsCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKwkJICAgICA0LAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKwkJICAgICB4eHN0cmluZywJCS8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKwkJICAgICB1c2VycGFzcywJCS8qIEtleXdvcmQgdGFibGUgKi8KKwkJICAgICAmdHgJCS8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKwkJICAgICApOworCSAgICAgIGNtZmRiaSgmdHgsCisJCSAgICAgX0NNVFhULAkJLyogZmNvZGUgKi8KKwkJICAgICAiSFRUUCBwcm94eSBzZXJ2ZXIgaG9zdFs6cG9ydF0iLAorCQkgICAgICIiLAkJLyogZGVmYXVsdCAqLworCQkgICAgICIiLAkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkJICAgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisJCSAgICAgMCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworCQkgICAgIHh4c3RyaW5nLAorCQkgICAgIE5VTEwsCisJCSAgICAgTlVMTAorCQkgICAgICk7CisJICAgICAgd2hpbGUgKDEpIHsKKwkJICBpZiAoKHggPSBjbWZkYigmc3cpKSA8IDApIHsKKwkJICAgICAgaWYgKHggPT0gLTMpIHsKKwkJCSAgeCA9IC05OworCQkJICBwcmludGYoIj9Ib3N0bmFtZSByZXF1aXJlZFxuIik7CisJCSAgICAgIH0KKwkJICAgICAgcmV0dXJuKHgpOworCQkgIH0KKwkJICBpZiAoY21yZXN1bHQuZmNvZGUgIT0gX0NNS0VZKQorCQkgICAgYnJlYWs7CisJCSAgbiA9IGNtcmVzdWx0Lm5yZXN1bHQ7CisJCSAgc3dpdGNoIChuKSB7CisJCSAgICBjYXNlIFVQV19VU0VSOgorCQkgICAgY2FzZSBVUFdfUEFTUzoKKwkJICAgIGNhc2UgVVBXX0FHRU5UOgorCQkgICAgICBpZiAoKHggPSBjbWZsZCgobiA9PSBVUFdfVVNFUikgPworCQkJCSAgICAgIlVzZXJuYW1lIiA6CisJCQkJICAgICAoKG4gPT0gVVBXX1BBU1MpID8gIlBhc3N3b3JkIiA6ICJBZ2VudCIpLAorCQkJCSAgICAgIiIsICZzLCB4eHN0cmluZykpIDwgMCkgeworCQkJICBpZiAoeCAhPSAtMykKKwkJCSAgICByZXR1cm4oeCk7CisJCSAgICAgIH0KKwkJICAgICAgY2tzdHJuY3B5KChuID09IFVQV19VU0VSKSA/IHVidWYgOgorICAgICAgICAgICAgICAgICAgICAgICAgKChuID09IFVQV19QQVNTKSA/IHBidWYgOiBhYnVmKSwgcywgCisgICAgICAgICAgICAgICAgICAgICAgICAobiA9PSBVUFdfQUdFTlQpID8gMjU2IDogKExPR0lOTEVOKzEpKTsKKwkJICB9CisJICAgICAgfQorCSAgICAgIGlmIChjbXJlc3VsdC5mY29kZSAhPSBfQ01UWFQpCisJCXJldHVybigtMik7CisJICAgICAgcyA9IGNtcmVzdWx0LnNyZXN1bHQ7CisJICAgICAgaWYgKHMpIGlmICghKnMpIHMgPSBOVUxMOworCisjaWZkZWYgSUtTRENPTkYKKwkgICAgICBpZiAoaWtzZGNmKQorCQlyZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIElLU0RDT05GICovCisJICAgICAgbWFrZXN0cigmdGNwX2h0dHBfcHJveHlfdXNlcix1YnVmWzBdP3VidWY6TlVMTCk7CisJICAgICAgbWFrZXN0cigmdGNwX2h0dHBfcHJveHlfcHdkLHBidWZbMF0/cGJ1ZjpOVUxMKTsKKwkgICAgICBtYWtlc3RyKCZ0Y3BfaHR0cF9wcm94eV9hZ2VudCxhYnVmWzBdP2FidWY6TlVMTCk7CisJICAgICAgbWFrZXN0cigmdGNwX2h0dHBfcHJveHkscyk7CisJICAgICAgbWVtc2V0KHBidWYsMCxzaXplb2YocGJ1ZikpOworCSAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisJICB9CisjZW5kaWYgLyogTk9IVFRQICovCisvKgorICBJdCB3b3VsZCBoYXZlIGJlZW4gZWFzeSB0byBjb21iaW5lIFhZVENQX1NPQ0tTX1NWUiB3aXRoIHRoZSBwcmV2aW91cworICBvbmUgZXhjZXB0IGZvciB0aGUgI2lmZGVmcy4uLgorKi8KKyNpZmRlZiBOVAorI2lmZGVmIENLX1NPQ0tTCisgICAgICAgICAgY2FzZSBYWVRDUF9TT0NLU19TVlI6IHsKKwkgICAgICBjaGFyIHVidWZbTE9HSU5MRU4rMV0sIHBidWZbTE9HSU5MRU4rMV07CisJICAgICAgY2hhciAqIHAgPSBnZXRlbnYoIlNPQ0tTX1NFUlZFUiIpOworCSAgICAgIHN0cnVjdCBGREIgc3csIHR4OworCSAgICAgIGludCBuLCB4OworCisJICAgICAgaWYgKCFwKSBwID0gIiI7CisKKwkgICAgICBjbWZkYmkoJnN3LAkJLyogRmlyc3QgRkRCIC0gc3dpdGNoZXMgKi8KKwkJICAgICBfQ01LRVksCQkvKiBmY29kZSAqLworCQkgICAgICJTT0NLUyBzZXJ2ZXIgaG9zdFs6cG9ydF0gb3Igc3dpdGNoIiwKKwkJICAgICAiIiwJCS8qIGRlZmF1bHQgKi8KKwkJICAgICAiIiwJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJCSAgICAgbnVzZXJwYXNzLAkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisJCSAgICAgNCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisJCSAgICAgeHhzdHJpbmcsCQkvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisJCSAgICAgdXNlcnBhc3MsCQkvKiBLZXl3b3JkIHRhYmxlICovCisJCSAgICAgJnR4CQkvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisJCSAgICAgKTsKKwkgICAgICBjbWZkYmkoJnR4LAorCQkgICAgIF9DTVRYVCwJCS8qIGZjb2RlICovCisJCSAgICAgIlNPQ0tTIHNlcnZlciBob3N0Wzpwb3J0XSIsCisJCSAgICAgcCwJCQkvKiBkZWZhdWx0ICovCisJCSAgICAgIiIsCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCQkgICAgIDAsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKwkJICAgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisJCSAgICAgeHhzdHJpbmcsCisJCSAgICAgTlVMTCwKKwkJICAgICBOVUxMCisJCSAgICAgKTsKKwkgICAgICB3aGlsZSAoMSkgeworCQkgIGlmICgoeCA9IGNtZmRiKCZzdykpIDwgMCkgeworCQkgICAgICBpZiAoeCA9PSAtMykgeworCQkJICB4ID0gLTk7CisJCQkgIHByaW50ZigiP0hvc3RuYW1lIHJlcXVpcmVkXG4iKTsKKwkJICAgICAgfQorCQkgICAgICByZXR1cm4oeCk7CisJCSAgfQorCQkgIGlmIChjbXJlc3VsdC5mY29kZSAhPSBfQ01LRVkpCisJCSAgICBicmVhazsKKwkJICBuID0gY21yZXN1bHQubnJlc3VsdDsKKwkJICBzd2l0Y2ggKG4pIHsKKwkJICAgIGNhc2UgVVBXX1VTRVI6CisJCSAgICBjYXNlIFVQV19QQVNTOgorCQkgICAgICBpZiAoKHggPSBjbWZsZCgobiA9PSBVUFdfVVNFUikgPyAiVXNlcm5hbWUiIDogIlBhc3N3b3JkIiwKKwkJCQkgICAgICIiLCAmcywgeHhzdHJpbmcpKSA8IDApIHsKKwkJCSAgaWYgKHggIT0gLTMpCisJCQkgICAgcmV0dXJuKHgpOworCQkgICAgICB9CisJCSAgICAgIGNrc3RybmNweSgobiA9PSBVUFdfVVNFUikgPyB1YnVmIDogcGJ1ZiwgcywgTE9HSU5MRU4rMSk7CisJCSAgfQorCSAgICAgIH0KKwkgICAgICBpZiAoY21yZXN1bHQuZmNvZGUgIT0gX0NNVFhUKQorCQlyZXR1cm4oLTIpOworCSAgICAgIHMgPSBjbXJlc3VsdC5zcmVzdWx0OworCSAgICAgIGlmIChzKSBpZiAoISpzKSBzID0gTlVMTDsKKworI2lmZGVmIElLU0RDT05GCisJICAgICAgaWYgKGlrc2RjZikKKwkJcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyNlbmRpZiAvKiBJS1NEQ09ORiAqLworCSAgICAgIG1ha2VzdHIoJnRjcF9zb2Nrc191c2VyLHVidWYpOworICAgICAgICAgICAgICBtZW1zZXQocGJ1ZiwwLHNpemVvZihwYnVmKSk7CisJICAgICAgbWFrZXN0cigmdGNwX3NvY2tzX3N2cixzKTsKKwkgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCSAgfQorCisjaWZkZWYgQ0tfU09DS1NfTlMKKyAgICAgICAgICBjYXNlIFhZVENQX1NPQ0tTX05TOiB7CisgICAgICAgICAgICBjaGFyICogcCA9IGdldGVudigiU09DS1NfTlMiKTsKKyAgICAgICAgICAgIGlmICghcCkgcCA9ICIiOworICAgICAgICAgICAgaWYgKCh5ID0gY210eHQoImhvc3RuYW1lIG9yIElQIG9mIFNPQ0tTIE5hbWUgU2VydmVyIixwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyNpZmRlZiBJS1NEQ09ORgorICAgICAgICAgICAgICBpZiAoaWtzZGNmKSByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIElLU0RDT05GICovCisgICAgICAgICAgICAgIGlmICh0Y3Bfc29ja3NfbnMpIHsKKyAgICAgICAgICAgICAgICAgIGZyZWUodGNwX3NvY2tzX25zKTsgICAvKiBGcmVlIGFueSBwcmV2aW91cyBzdG9yYWdlICovCisgICAgICAgICAgICAgICAgICB0Y3Bfc29ja3NfbnMgPSBOVUxMOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzID09IE5VTEwgfHwgKnMgPT0gTlVMKSB7IC8qIElmIG5vbmUgZ2l2ZW4gKi8KKyAgICAgICAgICAgICAgICAgIHRjcF9zb2Nrc19ucyA9IE5VTEw7ICAvKiByZW1vdmUgdGhlIG92ZXJyaWRlIHN0cmluZyAqLworICAgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGNwX3NvY2tzX25zID0gbWFsbG9jKHN0cmxlbihzKSsxKSkpIHsKKyAgICAgICAgICAgICAgICAgIHN0cmNweSh0Y3Bfc29ja3NfbnMscyk7CisgICAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19TT0NLU19OUyAqLworI2VuZGlmIC8qIENLX1NPQ0tTICovCisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICBjYXNlIFhZVENQX0FERFJFU1M6CisgICAgICAgICAgICBpZiAoKHkgPSBjbXR4dCgicHJlZmVycmVkIElQIEFkZHJlc3MgZm9yIFRDUCBjb25uZWN0aW9ucyIsIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworI2lmZGVmIElLU0RDT05GCisgICAgICAgICAgICBpZiAoaWtzZGNmKSByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIElLU0RDT05GICovCisgICAgICAgICAgICBpZiAodGNwX2FkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICBmcmVlKHRjcF9hZGRyZXNzKTsgICAgICAvKiBGcmVlIGFueSBwcmV2aW91cyBzdG9yYWdlICovCisgICAgICAgICAgICAgICAgdGNwX2FkZHJlc3MgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMgPT0gTlVMTCB8fCAqcyA9PSBOVUwpIHsgLyogSWYgbm9uZSBnaXZlbiAqLworICAgICAgICAgICAgICAgIHRjcF9hZGRyZXNzID0gTlVMTDsgICAgIC8qIHJlbW92ZSB0aGUgb3ZlcnJpZGUgc3RyaW5nICovCisgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRjcF9hZGRyZXNzID0gbWFsbG9jKHN0cmxlbihzKSsxKSkpIHsKKyAgICAgICAgICAgICAgICBzdHJjcHkodGNwX2FkZHJlc3Mscyk7CisgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2lmZGVmIFNPX0tFRVBBTElWRQorICAgICAgICAgIGNhc2UgWFlUQ1BfS0VFUEFMSVZFOgorICAgICAgICAgICAgaWYgKCh6ID0gY21rZXkob25vZmYsMiwiIiwib24iLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeik7CisgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyNpZmRlZiBJS1NEQ09ORgorICAgICAgICAgICAgaWYgKGlrc2RjZikgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyNlbmRpZiAvKiBJS1NEQ09ORiAqLworI2lmZGVmIFNTSEJVSUxUSU4KKyAgICAgICAgICAgIGlmIChuZXR3b3JrICYmIG5ldHR5cGUgPT0gTkVUX1NTSCAmJiBzc2hfc29jayAhPSAtMSkKKyAgICAgICAgICAgICAgc3VjY2VzcyA9IGtlZXBhbGl2ZShzc2hfc29jayx6KTsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisJICAgICAgc3VjY2VzcyA9IGtlZXBhbGl2ZSh0dHlmZCx6KTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzKTsKKyNlbmRpZiAvKiBTT19LRUVQQUxJVkUgKi8KKyNpZmRlZiBTT19ET05UUk9VVEUKKyAgICAgICAgICBjYXNlIFhZVENQX0RPTlRST1VURToKKyAgICAgICAgICAgIGlmICgoeiA9IGNta2V5KG9ub2ZmLDIsIiIsIm9mZiIseHhzdHJpbmcpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworI2lmZGVmIElLU0RDT05GCisgICAgICAgICAgICBpZiAoaWtzZGNmKSByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIElLU0RDT05GICovCisjaWZkZWYgU1NIQlVJTFRJTgorICAgICAgICAgICAgaWYgKG5ldHdvcmsgJiYgbmV0dHlwZSA9PSBORVRfU1NIICYmIHNzaF9zb2NrICE9IC0xKQorICAgICAgICAgICAgICBzdWNjZXNzID0gZG9udHJvdXRlKHNzaF9zb2NrLHopOworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKwkgICAgICBzdWNjZXNzID0gZG9udHJvdXRlKHR0eWZkLHopOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MpOworI2VuZGlmIC8qIFNPX0RPTlRST1VURSAqLworI2lmZGVmIFRDUF9OT0RFTEFZCisgICAgICAgICAgY2FzZSBYWVRDUF9OT0RFTEFZOgorICAgICAgICAgICAgaWYgKCh6ID0gY21rZXkob25vZmYsMiwiIiwib2ZmIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHopOworICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogSUtTRENPTkYgKi8KKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICAgICAgICBpZiAobmV0d29yayAmJiBuZXR0eXBlID09IE5FVF9TU0ggJiYgc3NoX3NvY2sgIT0gLTEpCisgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBub19kZWxheShzc2hfc29jayx6KTsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisJICAgICAgc3VjY2VzcyA9IG5vX2RlbGF5KHR0eWZkLHopOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MpOworICAgICAgICAgIGNhc2UgWFlUQ1BfTkFHTEU6ICAgICAgICAgICAgIC8qIFRoZSBpbnZlcnNlIG9mIE5PREVMQVkgKi8KKyAgICAgICAgICAgIGlmICgoeiA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHopOworICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogSUtTRENPTkYgKi8KKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICAgICAgICBpZiAobmV0d29yayAmJiBuZXR0eXBlID09IE5FVF9TU0ggJiYgc3NoX3NvY2sgIT0gLTEpCisgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBub19kZWxheShzc2hfc29jayx6KTsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisJICAgICAgc3VjY2VzcyA9IG5vX2RlbGF5KHR0eWZkLCF6KTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzKTsKKyNlbmRpZiAvKiBUQ1BfTk9ERUxBWSAqLworI2lmZGVmIFNPX0xJTkdFUgorICAgICAgICAgIGNhc2UgWFlUQ1BfTElOR0VSOgorICAgICAgICAgICAgaWYgKCh6ID0gY21rZXkob25vZmYsMiwiIiwib24iLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgICAgICBpZiAoeikgeyAgICAgICAgICAgICAgICAgICAgLyogaWYgb24sIHdlIG5lZWQgYSB0aW1lb3V0IHZhbHVlICovCisgICAgICAgICAgICAgICAgaWYgKCh4ID0gY21udW0oIkxpbmdlciB0aW1lb3V0IGluIDEwdGggb2YgYSBtaWxsaXNlY29uZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAiLDEwLCZ5LHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIHkgPSAwOworICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogSUtTRENPTkYgKi8KKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICAgICAgICBpZiAobmV0d29yayAmJiBuZXR0eXBlID09IE5FVF9TU0ggJiYgc3NoX3NvY2sgIT0gLTEpCisgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBja19saW5nZXIoc3NoX3NvY2sseix5KTsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisJICAgICAgc3VjY2VzcyA9IGNrX2xpbmdlcih0dHlmZCx6LHkpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MpOworI2VuZGlmIC8qIFNPX0xJTkdFUiAqLworI2lmZGVmIFNPX1NOREJVRgorICAgICAgICAgIGNhc2UgWFlUQ1BfU0VOREJVRjoKKyAgICAgICAgICAgIHggPSBjbW51bSgiU2VuZCBidWZmZXIgc2l6ZSwgYnl0ZXMiLCI4MTkyIiwxMCwmeix4eHN0cmluZyk7CisgICAgICAgICAgICBpZiAoeCA8IDApIHJldHVybih4KTsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworI2lmZGVmIElLU0RDT05GCisgICAgICAgICAgICBpZiAoaWtzZGNmKSByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIElLU0RDT05GICovCisjaWZkZWYgU1NIQlVJTFRJTgorICAgICAgICAgICAgaWYgKG5ldHdvcmsgJiYgbmV0dHlwZSA9PSBORVRfU1NIICYmIHNzaF9zb2NrICE9IC0xKQorICAgICAgICAgICAgICBzdWNjZXNzID0gc2VuZGJ1Zihzc2hfc29jayx6KTsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisJICAgICAgc3VjY2VzcyA9IHNlbmRidWYodHR5ZmQseik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisjZW5kaWYgLyogU09fU05EQlVGICovCisjaWZkZWYgU09fUkNWQlVGCisgICAgICAgICAgY2FzZSBYWVRDUF9SRUNWQlVGOgorICAgICAgICAgICAgeCA9IGNtbnVtKCJSZWNlaXZlIGJ1ZmZlciBzaXplLCBieXRlcyIsIjgxOTIiLDEwLCZ6LHh4c3RyaW5nKTsKKyAgICAgICAgICAgIGlmICh4IDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogSUtTRENPTkYgKi8KKworLyogTm90ZTogVGhlIGZvbGxvd2luZyBpcyBub3QgMTYtYml0IHNhZmUgKi8KKworI2lmbmRlZiBRTlgxNgorICAgICAgICAgICAgaWYgKHggPiA1MjI0OCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1dhcm5pbmc6IHJlY2VpdmUgYnVmZmVycyBsYXJnZXIgdGhhbiA1MjI0OCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgbWF5IG5vdCBiZSB1bmRlcnN0b29kIGJ5IGFsbCBob3N0cy4gIFBlcmZvcm1hbmNlXG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiBtYXkgc3VmZmVyLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBRTlgxNiAqLworI2lmZGVmIFNTSEJVSUxUSU4KKyAgICAgICAgICAgIGlmIChuZXR3b3JrICYmIG5ldHR5cGUgPT0gTkVUX1NTSCAmJiBzc2hfc29jayAhPSAtMSkKKyAgICAgICAgICAgICAgc3VjY2VzcyA9IHJlY3ZidWYoc3NoX3NvY2sseik7CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworCSAgICAgIHN1Y2Nlc3MgPSByZWN2YnVmKHR0eWZkLHopOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MpOworI2VuZGlmIC8qIFNPX1JDVkJVRiAqLworCisjaWZkZWYgVk1TCisjaWZkZWYgREVDX1RDUElQCisgICAgICAgICAgY2FzZSBYWVRDUF9VQ1g6IHsgICAgICAgICAgICAgLyogVUNYIDIuMCBwb3J0IHN3YWJiaW5nIGJ1ZyAqLworICAgICAgICAgICAgICBleHRlcm4gaW50IHVjeF9wb3J0X2J1ZzsKKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSBzZXRvbigmdWN4X3BvcnRfYnVnKSk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIERFQ19UQ1BJUCAqLworI2VuZGlmIC8qIFZNUyAqLworCisgICAgICAgICAgY2FzZSBYWVRDUF9SRE5TOiB7CisgICAgICAgICAgICAgIGV4dGVybiBpbnQgdGNwX3JkbnM7CisgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b25hdXQoJnRjcF9yZG5zKSk7CisgICAgICAgICAgfQorCisjaWZkZWYgQ0tfRE5TX1NSVgorICAgICAgICAgIGNhc2UgWFlUQ1BfRE5TX1NSVjogeworICAgICAgICAgICAgICBleHRlcm4gaW50IHRjcF9kbnNfc3J2OworICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHNldG9uKCZ0Y3BfZG5zX3NydikpOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19ETlNfU1JWICovCisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogTk9UQ1BPUFRTICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworICAgIH0KKworICAgIHN3aXRjaCAoeHgpIHsKKworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgTkVUQ09OTgorICAgICAgY2FzZSBYWUhPU1Q6IHsgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBIT1NUICovCisgICAgICAgICAgeiA9IHR0bnByb3RvOyAgICAgICAgICAgICAgICAgLyogU2F2ZSBwcm90b2NvbCBpbiBjYXNlIG9mIGZhaWx1cmUgKi8KKyNpZmRlZiBERUNORVQKKyAgICAgICAgICBpZiAobmV0dHlwZSAhPSBORVRfREVDKQorI2VuZGlmIC8qIERFQ05FVCAqLworICAgICAgICAgICAgdHRucHJvdG8gPSBOUF9OT05FOworICAgICAgICAgIGlmICgoeSA9IHNldGxpbihYWUhPU1QsMSwwKSkgPD0gMCkgeyAvKiBTZXRzIHN1Y2Nlc3MgdG8gMSAqLworICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJTRVQgSE9TVCBmYWlsIG1kbXR5cCIsIiIsbWRtdHlwKTsKKyAgICAgICAgICAgICAgdHRucHJvdG8gPSB6OyAgICAgICAgICAgICAvKiBGYWlsZWQsIHJlc3RvcmUgcHJvdG9jb2wgKi8KKyAgICAgICAgICAgICAgc3VjY2VzcyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGRpZHNldGxpbisrOworICAgICAgICAgIGRlYnVnKEYxMDEsIlNFVCBIT1NUIE9LIG1kbXR5cCIsIiIsbWRtdHlwKTsKKyAgICAgICAgICBkZWJ1ZyhGMTAxLCJTRVQgSE9TVCByZWxpYWJsZSIsIiIscmVsaWFibGUpOworICAgICAgICAgIHJldHVybih5KTsKKyAgICAgIH0KKyNlbmRpZiAvKiBORVRDT05OICovCisKKyAgICAgIGNhc2UgWFlMSU5FOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgTElORSAoPSBTRVQgUE9SVCkgKi8KKyAgICAgICAgZGVidWcoRjEwMSwic2V0bGluIGZsb3cgMSIsIiIsZmxvdyk7CisgICAgICAgIHggPSBzZXRsaW4oeHgsMSwwKTsKKyAgICAgICAgaWYgKHggPiAtMSkgZGlkc2V0bGluKys7CisgICAgICAgIGRlYnVnKEYxMDEsIlNFVCBMSU5FIHNldGxpbiIsIiIseCk7CisgICAgICAgIGRlYnVnKEYxMDEsIlNFVCBMSU5FIGZsb3ciLCIiLGZsb3cpOworICAgICAgICBkZWJ1ZyhGMTAxLCJTRVQgTElORSBsb2NhbCIsIiIsbG9jYWwpOworICAgICAgICBkZWJ1ZyhGMTAxLCJTRVQgTElORSByZWxpYWJsZSIsIiIscmVsaWFibGUpOworICAgICAgICByZXR1cm4oeCk7CisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZuZGVmIE5PU0VUS0VZCisgICAgICBjYXNlIFhZS0VZOiAgICAgICAgICAgICAgICAgICAgICAgLyogU0VUIEtFWSAqLworICAgICAgICByZXR1cm4oZG9zZXRrZXkoKSk7CisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKworI2lmbmRlZiBOT0NTRVRTCisgICAgICBjYXNlIFhZTEFORzogICAgICAgICAgICAgICAgICAgICAgLyogTGFuZ3VhZ2UgKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkobG5ndGFiLG5sbmcsIiIsIm5vbmUiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisKKyAgICAgICAgLyogTG9vayB1cCBsYW5ndWFnZSBhbmQgZ2V0IGFzc29jaWF0ZWQgY2hhcmFjdGVyIHNldHMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgKGkgPCBubGFuZ3MpICYmIChsYW5nc1tpXS5pZCAhPSB5KTsgaSsrKSA7CisgICAgICAgIGlmIChpID49IG5sYW5ncykgeworICAgICAgICAgICAgcHJpbnRmKCI/aW50ZXJuYWwgZXJyb3IsIHNvcnJ5XG4iKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0gLyogICovCisgICAgICAgIGxhbmd1YWdlID0gaTsgICAgICAgICAgICAgICAgICAgLyogQWxsIGdvb2QsIHNldCB0aGUgbGFuZ3VhZ2UsICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisjaWZuZGVmIE1BQworICAgICAgY2FzZSBYWUJBQ0s6ICAgICAgICAgICAgICAgICAgICAgIC8qIEJBQ0tHUk9VTkQgKi8KKyAgICAgICAgaWYgKCh6ID0gY21rZXkob25vZmYsMiwiIiwiIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHopOworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIGJnc2V0ID0gejsgICAgICAgICAgICAgICAgICAgICAgLyogMCA9IG9mZiAoZm9yZWdyb3VuZCkgKi8KKyNpZmRlZiBWTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxID0gb24gKGJhY2tncm91bmQpICovCisgICAgICAgIGlmIChiYXRjaCAmJiBiZ3NldCA9PSAwKSAgICAgICAgLyogVG8gZW5hYmxlIGVjaG9pbmcgb2YgY29tbWFuZHMgKi8KKyAgICAgICAgICBja3hlY2ggPSAxOyAgICAgICAgICAgICAgICAgICAvKiBpbiBWTVMgYmF0Y2ggbG9ncyAqLworI2VuZGlmIC8qIFZNUyAqLworI2Vsc2UgIC8qIENPTU1FTlQgKi8KKyAgICAgICAgaWYgKHopIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiAxID0gQmFja2dyb3VuZCAqLworICAgICAgICAgICAgYmdzZXQgPSAxOworICAgICAgICAgICAgYmFja2dyZCA9IDE7CisjaWZkZWYgVk1TCisgICAgICAgICAgICBiYXRjaCA9IDE7CisjZW5kaWYgLyogVk1TICovCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMCA9IEZvcmVncm91bmQgKi8KKyAgICAgICAgICAgIGJnc2V0ID0gMDsKKyAgICAgICAgICAgIGJhY2tncmQgPSAwOworI2lmZGVmIFZNUworICAgICAgICAgICAgYmF0Y2ggPSAwOworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBzdWNjZXNzID0gMTsKKyAgICAgICAgYmdjaGsoKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MpOworI2VuZGlmIC8qIE1BQyAqLworCisgICAgICBjYXNlIFhZUVVJRTogeyAgICAgICAgICAgICAgICAgICAgLyogUVVJRVQgKi8KKyNpZmRlZiBEQ01EQlVGCisgICAgICAgICAgZXh0ZXJuIGludCAqIHhxdWlldDsKKyNlbHNlCisgICAgICAgICAgZXh0ZXJuIGludCB4cXVpZXRbXTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisgICAgICAgICAgeCA9IHNldG9uKCZxdWlldCk7CisgICAgICAgICAgaWYgKHggPCAwKSByZXR1cm4oeCk7CisgICAgICAgICAgeHF1aWV0W2NtZGx2bF0gPSBxdWlldDsKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHgpOworICAgICAgfQorCisjaWZuZGVmIE5PWEZFUgorICAgICAgY2FzZSBYWUJVRjogeyAgICAgICAgICAgICAgICAgICAgIC8qIEJVRkZFUlMgKi8KKyNpZmRlZiBEWU5BTUlDCisgICAgICAgICAgaW50IHNiLCByYjsKKyAgICAgICAgICBpZiAoKHkgPSBjbW51bSgiU2VuZCBidWZmZXIgc2l6ZSIsIiIsMTAsJnNiLHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICAgIGlmICh5ID09IC0zKSBwcmludGYoIj9CdWZmZXIgc2l6ZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNiIDwgMCkgeworICAgICAgICAgICAgICBpZiAoKmF0bWJ1ZiA9PSAnLScpCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/TmVnYXRpdmUgbnVtYmVycyBjYW4ndCBiZSB1c2VkIGhlcmVcbiIpOworICAgICAgICAgICAgICBlbHNlIHByaW50ZigiP0ludGVnZXIgb3ZlcmZsb3csIHVzZSBhIHNtYWxsZXIgbnVtYmVyIHBsZWFzZVxuIik7CisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgfSBlbHNlIGlmIChzYiA8IDgwKSB7CisgICAgICAgICAgICAgIHByaW50ZigiP1RvbyBzbWFsbFxuIik7CisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoeT1jbW51bSgiUmVjZWl2ZSBidWZmZXIgc2l6ZSIsY2tpdG9hKHNiKSwxMCwmcmIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgaWYgKHJiIDwgMCkgeworICAgICAgICAgICAgICBpZiAoKmF0bWJ1ZiA9PSAnLScpCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/TmVnYXRpdmUgbnVtYmVycyBjYW4ndCBiZSB1c2VkIGhlcmVcbiIpOworICAgICAgICAgICAgICBlbHNlIHByaW50ZigiP0ludGVnZXIgb3ZlcmZsb3csIHVzZSBhIHNtYWxsZXIgbnVtYmVyIHBsZWFzZVxuIik7CisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgfSBlbHNlIGlmIChyYiA8IDgwKSB7CisgICAgICAgICAgICAgIHByaW50ZigiP1RvbyBzbWFsbFxuIik7CisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgIGlmICgoeSA9IGluaWJ1ZnMoc2IscmIpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgICB5ID0gYWRqcGtsKHVycHNpeix3c2xvdHIsYmlncmJzaXopOyAvKiBNYXliZSBhZGp1c3QgcGFja2V0IHNpemVzICovCisgICAgICAgICAgaWYgKHkgIT0gdXJwc2l6KSB1cnBzaXogPSB5OworICAgICAgICAgIHkgPSBhZGpwa2woc3BzaXosd3Nsb3RyLGJpZ3Nic2l6KTsKKyAgICAgICAgICBpZiAoeSAhPSBzcHNpeikgc3BzaXogPSBzcG1heCA9IHNwc2l6ciA9IHk7CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyNlbHNlCisgICAgICAgICAgcHJpbnRmKCI/U29ycnksIG5vdCBhdmFpbGFibGVcbiIpOworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogRFlOQU1JQyAqLworICAgICAgfQorCisgICAgICBjYXNlIFhZQ0hLVDogICAgICAgICAgICAgICAgICAgICAgLyogQkxPQ0stQ0hFQ0sgKi8KKyAgICAgICAgaWYgKCh4ID0gY21rZXkoY2hrdGFiLDQsIiIsIjMiLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBiY3RyID0geDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBsb2NhbCB0b28gZXZlbiBpZiBSRU1PVEUgU0VUICovCisgICAgICAgIGlmIChybXNmbGcpIHsKKyAgICAgICAgICAgIGlmICh4ID09IDQpIHsKKyAgICAgICAgICAgICAgICB0bXBidWZbMF0gPSAnQic7CisgICAgICAgICAgICAgICAgdG1wYnVmWzFdID0gJ1wwJzsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBja3N0cm5jcHkodG1wYnVmLGNraXRvYSh4KSxUTVBCVUZTSVopOworICAgICAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdTJywgIjQwMCIsIHRtcGJ1ZiwgIiIpOworICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICB9CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9MT0NBTAorI2lmbmRlZiBNQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBNYWMgaGFzIG5vIFJTLTIzMiAqLworY2FzZSBYWUNBUlI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENBUlJJRVItV0FUQ0ggKi8KKyAgICAgICAgcmV0dXJuKHNldGRjZCgpKTsKKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgfQorCisjaWZkZWYgVE5DT0RFCisgICAgc3dpdGNoICh4eCkgeyAgICAgICAgICAgICAgICAgICAgICAgLyogQXZvaWQgbG9uZyBzd2l0Y2ggc3RhdGVtZW50cy4uLiAqLworICAgICAgY2FzZSBYWVRFTE9QOiB7CisgICAgICAgICAgaW50IGMsIG47ICAgICAgICAgICAgICAgICAgICAgLyogV29ya2VycyAqLworICAgICAgICAgIGludCBnZXR2YWwgPSAwOyAgICAgICAgICAgICAgIC8qIFdoZXRoZXIgdG8gZ2V0IHN3aXRjaCB2YWx1ZSAqLworICAgICAgICAgIGludCB0bnNlcnZlciA9IDA7ICAgICAgICAgICAgIC8qIENsaWVudCBieSBkZWZhdWx0ICovCisgICAgICAgICAgaW50IG9wdCA9IC0xOyAgICAgICAgICAgICAgICAgLyogVGVsbmV0IE9wdGlvbiAqLworICAgICAgICAgIHN0cnVjdCBGREIgc3csIG9wOyAgICAgICAgICAgIC8qIEZEQnMgZm9yIGVhY2ggcGFyc2UgZnVuY3Rpb24gKi8KKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgICAgICAgIGV4dGVybiBpbnQgc2xfdG9wdF9hX3Nfc2F2ZWQ7CisgICAgICAgICAgZXh0ZXJuIGludCBzbF90b3B0X2FfY19zYXZlZDsKKyAgICAgICAgICBleHRlcm4gaW50IHNsX3RvcHRfZV9zX3NhdmVkOworICAgICAgICAgIGV4dGVybiBpbnQgc2xfdG9wdF9lX2Nfc2F2ZWQ7CisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyNpZmRlZiBJS1NECisgICAgICAgICAgaWYgKGluc2VydmVyKSAgICAgICAgICAgICAgICAgLyogU2VydmVyIGJ5IGRlZmF1bHQgd2hlbiBJS1NEICovCisgICAgICAgICAgICB0bnNlcnZlciA9IDE7CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgICAgICAgLyogU2V0IHVwIGNoYWluZWQgcGFyc2UgZnVuY3Rpb25zLi4uICovCisKKyAgICAgICAgICBjbWZkYmkoJm9wLCAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBmZGIgLSB0ZWxvcHRzKi8KKyAgICAgICAgICAgICAgICAgX0NNS0VZLCAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAgICAgICAiL2NsaWVudCwgL3NlcnZlciBvciIsIC8qIGhscG1zZyAqLworICAgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAgICAgICBudG5vcHQsICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKyAgICAgICAgICAgICAgICAgeHhzdHJpbmcsCisgICAgICAgICAgICAgICAgIHRub3B0dGFiLAorICAgICAgICAgICAgICAgICAmc3cKKyAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICBjbWZkYmkoJnN3LCAgICAgICAgICAgICAgICAgICAvKiBTZWNvbmQgRkRCIC0gY29tbWFuZCBzd2l0Y2hlcyAqLworICAgICAgICAgICAgICAgICBfQ01LRVksICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgLyogaGxwbXNnICovCisgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgICAgICAgIG50bm9wdHN3LCAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisgICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworICAgICAgICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgdG5vcHRzdywgICAgICAgICAgICAgICAvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgd2hpbGUgKG9wdCA8IDApIHsgICAgICAgICAgICAgLyogUGFyc2UgMCBvciBtb3JlIHN3aXRjaGVzICovCisgICAgICAgICAgICAgIHggPSBjbWZkYigmb3ApOyAgICAgICAgICAgLyogUGFyc2Ugc3dpdGNoIG9yIG90aGVyIHRoaW5nICovCisgICAgICAgICAgICAgIGRlYnVnKEYxMDEsIlhZVEVMT1AgY21mZGIiLCIiLHgpOworICAgICAgICAgICAgICBpZiAoeCA8IDApICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOyAgICAgICAgICAgICAgLyogb3IgcmVwYXJzZSBuZWVkZWQgKi8KKyAgICAgICAgICAgICAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkgLyogQnJlYWsgb3V0IGlmIG5vdCBhIHN3aXRjaCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjID0gY21nYnJrKCk7ICAgICAgICAgICAgIC8qIEdldCBicmVhayBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgZ2V0dmFsID0gKGMgPT0gJzonIHx8IGMgPT0gJz0nKTsgLyogc2VlIGhvdyBzd2l0Y2ggZW5kZWQgKi8KKyAgICAgICAgICAgICAgaWYgKGdldHZhbCAmJiAhKGNtcmVzdWx0LmtmbGFncyAmIENNX0FSRykpIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIGRvZXMgbm90IHRha2UgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgeiA9IGNtcmVzdWx0Lm5yZXN1bHQ7ICAgICAvKiBOdW1lcmljIHJlc3VsdCA9IHN3aXRjaCB2YWx1ZSAqLworICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJYWVRFTE9QIHN3aXRjaCIsIiIseik7CisKKyAgICAgICAgICAgICAgc3dpdGNoICh6KSB7ICAgICAgICAgICAgICAvKiBQcm9jZXNzIHRoZSBzd2l0Y2ggKi8KKyAgICAgICAgICAgICAgICBjYXNlIENLX1ROX0NMSUVOVDoKKyAgICAgICAgICAgICAgICAgIHRuc2VydmVyID0gMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0tfVE5fU0VSVkVSOgorICAgICAgICAgICAgICAgICAgdG5zZXJ2ZXIgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENLX1ROX0VDOgorICAgICAgICAgICAgICAgICAgb3B0ID0gVEVMT1BUX0VDSE87CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENLX1ROX1RUOgorICAgICAgICAgICAgICAgICAgb3B0ID0gVEVMT1BUX1RUWVBFOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDS19UTl9CTToKKyAgICAgICAgICAgICAgICAgIG9wdCA9IFRFTE9QVF9CSU5BUlk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENLX1ROX0VOVjoKKyAgICAgICAgICAgICAgICAgIG9wdCA9IFRFTE9QVF9ORVdFTlZJUk9OOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDS19UTl9MT0M6CisgICAgICAgICAgICAgICAgICBvcHQgPSBURUxPUFRfU05ETE9DOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDS19UTl9BVToKKyAgICAgICAgICAgICAgICAgIG9wdCA9IFRFTE9QVF9BVVRIRU5USUNBVElPTjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0tfVE5fRlg6CisgICAgICAgICAgICAgICAgICBvcHQgPSBURUxPUFRfRk9SV0FSRF9YOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDS19UTl9FTkM6CisgICAgICAgICAgICAgICAgICBvcHQgPSBURUxPUFRfRU5DUllQVElPTjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0tfVE5fSUtTOgorICAgICAgICAgICAgICAgICAgb3B0ID0gVEVMT1BUX0tFUk1JVDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0tfVE5fVExTOgorICAgICAgICAgICAgICAgICAgb3B0ID0gVEVMT1BUX1NUQVJUX1RMUzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0tfVE5fWEQ6CisgICAgICAgICAgICAgICAgICBvcHQgPSBURUxPUFRfWERJU1BMT0M7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENLX1ROX05BV1M6CisgICAgICAgICAgICAgICAgICBvcHQgPSBURUxPUFRfTkFXUzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0tfVE5fU0dBOgorICAgICAgICAgICAgICAgICAgb3B0ID0gVEVMT1BUX1NHQTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0tfVE5fUEhSOgorICAgICAgICAgICAgICAgICAgb3B0ID0gVEVMT1BUX1BSQUdNQV9IRUFSVEJFQVQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENLX1ROX1BTUDoKKyAgICAgICAgICAgICAgICAgIG9wdCA9IFRFTE9QVF9TU1BJX0xPR09OOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDS19UTl9QTEc6CisgICAgICAgICAgICAgICAgICBvcHQgPSBURUxPUFRfUFJBR01BX0xPR09OOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDS19UTl9TQUs6CisgICAgICAgICAgICAgICAgICBvcHQgPSBURUxPUFRfSUJNX1NBSzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0tfVE5fQ1BDOgorICAgICAgICAgICAgICAgICAgb3B0ID0gVEVMT1BUX0NPTVBPUlQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENLX1ROX0xPRzoKKyAgICAgICAgICAgICAgICAgIG9wdCA9IFRFTE9QVF9MT0dPVVQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENLX1ROX0ZMVzoKKyAgICAgICAgICAgICAgICAgIG9wdCA9IFRFTE9QVF9MRkxPVzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBwcmludGYoIj9VbmV4cGVjdGVkIHZhbHVlIC0gJWRcbiIseik7CisgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICBpZiAoY21yZXN1bHQuZmRiYWRkciA9PSAmb3ApCisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgIH0KKyAgICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgY2FzZSBURUxPUFRfRUNITzogICAgICAgICAgIC8qIE9wdGlvbnMgb25seSB0aGUgU2VydmVyIFdJTEwgKi8KKyAgICAgICAgICAgIGNhc2UgVEVMT1BUX0ZPUldBUkRfWDoKKyAgICAgICAgICAgIGNhc2UgVEVMT1BUX1NFTkRfVVJMOgorICAgICAgICAgICAgY2FzZSBURUxPUFRfSUJNX1NBSzoKKyAgICAgICAgICAgIGNhc2UgVEVMT1BUX0xPR09VVDoKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkodG5uZWd0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50bm5lZ3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2lyZWQgc2VydmVyIHN0YXRlIiwKKyAgIFRFTE9QVF9NT0RFKHRuc2VydmVyP1RFTE9QVF9ERUZfU19NRV9NT0RFKG9wdCk6VEVMT1BUX0RFRl9DX1VfTU9ERShvcHQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpCisgICAgICAgICAgICAgICAgICAgKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgICAgICAgIGlmICh0bnNlcnZlcikgeworICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9TX01FX01PREUob3B0KSA9IHg7CisgICAgICAgICAgICAgICAgICBURUxPUFRfTUVfTU9ERShvcHQpID0geDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfQ19VX01PREUob3B0KSA9IHg7CisgICAgICAgICAgICAgICAgICBURUxPUFRfVV9NT0RFKG9wdCkgPSB4OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFRFTE9QVF9UVFlQRTogICAgICAgICAgLyogT3B0aW9ucyBvbmx5IHRoZSBDbGllbnQgV0lMTCAqLworICAgICAgICAgICAgY2FzZSBURUxPUFRfTkVXRU5WSVJPTjoKKyAgICAgICAgICAgIGNhc2UgVEVMT1BUX1NORExPQzoKKyAgICAgICAgICAgIGNhc2UgVEVMT1BUX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgY2FzZSBURUxPUFRfU1RBUlRfVExTOgorICAgICAgICAgICAgY2FzZSBURUxPUFRfWERJU1BMT0M6CisgICAgICAgICAgICBjYXNlIFRFTE9QVF9OQVdTOgorICAgICAgICAgICAgY2FzZSBURUxPUFRfTEZMT1c6CisgICAgICAgICAgICBjYXNlIFRFTE9QVF9DT01QT1JUOgorICAgICAgICAgICAgICBpZiAoKHggPSBjbWtleSh0bm5lZ3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRubmVndGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzaXJlZCBjbGllbnQgc3RhdGUiLAorICAgIFRFTE9QVF9NT0RFKCF0bnNlcnZlcj9URUxPUFRfREVGX1NfVV9NT0RFKG9wdCk6VEVMT1BUX0RFRl9DX01FX01PREUob3B0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nKQorICAgICAgICAgICAgICAgICAgICkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgICAgICAgaWYgKHRuc2VydmVyKSB7CisgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX1NfVV9NT0RFKG9wdCkgPSB4OworICAgICAgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShvcHQpID0geDsKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgICAgICAgICAgICAgICAgaWYgKG9wdCA9PSBURUxPUFRfQVVUSEVOVElDQVRJT04pCisgICAgICAgICAgICAgICAgICAgIHNsX3RvcHRfYV9zX3NhdmVkID0gMDsKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9DX01FX01PREUob3B0KSA9IHg7CisgICAgICAgICAgICAgICAgICBURUxPUFRfTUVfTU9ERShvcHQpID0geDsKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgICAgICAgICAgICAgICAgaWYgKG9wdCA9PSBURUxPUFRfQVVUSEVOVElDQVRJT04pCisgICAgICAgICAgICAgICAgICAgIHNsX3RvcHRfYV9jX3NhdmVkID0gMDsKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAoKHggPSBjbWtleSh0bm5lZ3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRubmVndGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNlcnZlciA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNpcmVkIHNlcnZlciBzdGF0ZSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzaXJlZCBjbGllbnQgc3RhdGUiLAorICAgIFRFTE9QVF9NT0RFKHRuc2VydmVyP1RFTE9QVF9ERUZfU19NRV9NT0RFKG9wdCk6VEVMT1BUX0RFRl9DX01FX01PREUob3B0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICApIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KHRubmVndGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG5uZWd0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0bnNlcnZlciA/ICJkZXNpcmVkIHNlcnZlciBzdGF0ZSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzaXJlZCBjbGllbnQgc3RhdGUiLAorICAgIFRFTE9QVF9NT0RFKCF0bnNlcnZlcj9URUxPUFRfREVGX1NfVV9NT0RFKG9wdCk6VEVMT1BUX0RFRl9DX1VfTU9ERShvcHQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgICAgICAgaWYgKHRuc2VydmVyKSB7CisgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX1NfTUVfTU9ERShvcHQpID0geDsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKG9wdCkgPSB4OworICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShvcHQpID0geTsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUob3B0KSA9IHk7CisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgICAgICAgaWYgKG9wdCA9PSBURUxPUFRfRU5DUllQVElPTikKKyAgICAgICAgICAgICAgICAgICAgc2xfdG9wdF9lX3Nfc2F2ZWQgPSAwOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfQ19NRV9NT0RFKG9wdCkgPSB4OworICAgICAgICAgICAgICAgICAgVEVMT1BUX01FX01PREUob3B0KSA9IHg7CisgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfVV9NT0RFKG9wdCkgPSB5OworICAgICAgICAgICAgICAgICAgVEVMT1BUX1VfTU9ERShvcHQpID0geTsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgICBpZiAob3B0ID09IFRFTE9QVF9FTkNSWVBUSU9OKQorICAgICAgICAgICAgICAgICAgICBzbF90b3B0X2VfY19zYXZlZCA9IDA7CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICB9CisKKyAgICAgIGNhc2UgWFlURUw6ICAgICAgICAgICAgICAgICAgICAgICAvKiBURUxORVQgKi8KKyAgICAgICAgaWYgKCh6ID0gY21rZXkodG50YWIsbnRuLCJwYXJhbWV0ZXIgZm9yIFRFTE5FVCBuZWdvdGlhdGlvbnMiLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICBzd2l0Y2ggKHopIHsKKyAgICAgICAgICBjYXNlIENLX1ROX0VDOiAgICAgICAgICAgICAgICAvKiBFQ0hPICovCisgICAgICAgICAgICBpZiAoKHggPSBjbWtleShybHRhYixucmx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaXRpYWwgVEVMTkVUIGVjaG9pbmcgc3RhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgICAgICB0bl9kdXBsZXggPSB4OworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgICAgIGNhc2UgQ0tfVE5fUkU6ICAgICAgICAgICAgICAgIC8qIFJFTU9URS1FQ0hPICovCisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHNldG9uKCZ0bl9yZW1fZWNobykpOworCisgICAgICAgICAgY2FzZSBDS19UTl9EQjogICAgICAgICAgICAgICAgLyogREVCVUcgKi8KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJnRuX2RlYikpOworCisgICAgICAgICAgY2FzZSBDS19UTl9UVDogICAgICAgICAgICAgICAgLyogVEVSTUlOQUwgVFlQRSAqLworICAgICAgICAgICAgaWYgKCh5ID0gY210eHQoInRlcm1pbmFsIHR5cGUgZm9yIFRFTE5FVCBjb25uZWN0aW9ucyIsIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKHRuX3Rlcm0pIHsKKyAgICAgICAgICAgICAgICBmcmVlKHRuX3Rlcm0pOyAgICAgICAgICAvKiBGcmVlIGFueSBwcmV2aW91cyBzdG9yYWdlICovCisgICAgICAgICAgICAgICAgdG5fdGVybSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocyA9PSBOVUxMIHx8ICpzID09IE5VTCkgeyAvKiBJZiBub25lIGdpdmVuICovCisgICAgICAgICAgICAgICAgdG5fdGVybSA9IE5VTEw7ICAgICAgICAgLyogcmVtb3ZlIHRoZSBvdmVycmlkZSBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgICAgfSBlbHNlIGlmICgodG5fdGVybSA9IG1hbGxvYyhzdHJsZW4ocykrMSkpKSB7CisgICAgICAgICAgICAgICAgc3RyY3B5KHRuX3Rlcm0scyk7CisgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICAgIH0gZWxzZSByZXR1cm4oc3VjY2VzcyA9IDApOworCisjaWZkZWYgQ0tfRk9SV0FSRF9YCisgICAgICAgICAgY2FzZSBDS19UTl9GWDogICAgICAgICAgICAgICAgLyogRk9SV0FSRC1YICovCisgICAgICAgICAgICBpZiAoKHg9Y21rZXkodG5md2R4dGFiLG50bmZ3ZHgsIiIsInhhdXRob3JpdHktZmlsZSIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIHN3aXRjaCAoeCkgeworICAgICAgICAgICAgICBjYXNlIDA6IHsgICAgICAgICAgICAgICAgIC8qIFhhdXRob3JpdHktRmlsZSAqLworICAgICAgICAgICAgICAgICAgeCA9IGNtaWZpKCJGdWxsIHBhdGggb2YgLlhhdXRob3JpdHkgZmlsZSIsIiIsJnMsJnkseHhzdHJpbmcpOworICAgICAgICAgICAgICAgICAgaWYgKHggPCAwICYmIHggIT0gLTMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnRuX2Z3ZHhfeGF1dGhvcml0eSxzKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY2FzZSAxOiB7ICAgICAgICAgICAgICAgICAvKiBOby1FbmNyeXB0aW9uICovCisgICAgICAgICAgICAgICAgICBleHRlcm4gaW50IGZ3ZHhfbm9fZW5jcnlwdDsKKyAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJmZ3ZHhfbm9fZW5jcnlwdCkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworCisgICAgICAgICAgY2FzZSBDS19UTl9OTDogICAgICAgICAgICAgICAgLyogVEVMTkVUIE5FV0xJTkUtTU9ERSAqLworICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkodG5fbmxtdGFiLG50bl9ubG0sIiIsIm52dCIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIGlmICh4ID09IFROX05MX0JJTikgeworICAgICAgICAgICAgICBpZiAoKHggPSBjbWtleSh0bmxtdGFiLG50bmxtLCIiLCJyYXciLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgdG5fYl9ubG0gPSB4OworICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgIH0gZWxzZSBpZiAoeCA9PSBUTl9OTF9OVlQpIHsKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkodG5sbXRhYixudG5sbSwiIiwib24iLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgdG5fbmxtID0geDsKKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICB0bl9ubG0gPSB4OworICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIENLX1ROX1hGOiAgICAgICAgICAgICAgICAgIC8qIEJJTkFSWS1UUkFOU0ZFUi1NT0RFICovCisgICAgICAgICAgICBpZiAoKHogPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgdG5fYl94ZmVyID0gejsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgICAgY2FzZSBDS19UTl9ORTogICAgICAgICAgICAgICAgICAvKiBOTy1FTkNSWVBULURVUklORy1YRkVSICovCisgICAgICAgICAgICBpZiAoKHogPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworI2lmZGVmIENLX0FQQworICAgICAgICAgICAgLyogRG9uJ3QgbGV0IHRoaXMgYmUgc2V0IHJlbW90ZWx5ICovCisgICAgICAgICAgICBpZiAoYXBjYWN0aXZlID09IEFQQ19MT0NBTCB8fAorICAgICAgICAgICAgICAgIChhcGNhY3RpdmUgPT0gQVBDX1JFTU9URSAmJiAhKGFwY3N0YXR1cyAmIEFQQ19VTkNIKSkpCisgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogQ0tfQVBDICovCisgICAgICAgICAgICB0bl9ub19lbmNyeXB0X3hmZXIgPSB6OworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgICAgIGNhc2UgQ0tfVE5fQk06ICAgICAgICAgICAgICAgIC8qIEJJTkFSWS1NT0RFICovCisgICAgICAgICAgICBpZiAoKHggPSBjbWtleSh0bm5lZ3RhYixudG5uZWd0YWIsIiIsInJlZnVzZWQiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIFRFTE9QVF9ERUZfU19NRV9NT0RFKFRFTE9QVF9CSU5BUlkpID0geDsKKyAgICAgICAgICAgIFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX0JJTkFSWSkgPSB4OworICAgICAgICAgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0JJTkFSWSkgPSB4OworICAgICAgICAgICAgVEVMT1BUX0RFRl9DX1VfTU9ERShURUxPUFRfQklOQVJZKSA9IHg7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICAgIGNhc2UgQ0tfVE5fSUtTOiAgICAgICAgICAgICAgIC8qIEtFUk1JVCAqLworICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkodG5uZWd0YWIsbnRubmVndGFiLCJETyIsImFjY2VwdCIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KHRubmVndGFiLG50bm5lZ3RhYiwiV0lMTCIsImFjY2VwdCIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIGlmICgoeiA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICAgICAgVEVMT1BUX0RFRl9TX01FX01PREUoVEVMT1BUX0tFUk1JVCkgPSB5OworICAgICAgICAgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfS0VSTUlUKSA9IHg7CisgICAgICAgICAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfS0VSTUlUKSA9IHk7CisgICAgICAgICAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9LRVJNSVQpID0geDsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgY2FzZSBDS19UTl9UTFM6ICAgICAgICAgICAgICAgLyogU1RBUlRfVExTICovCisgICAgICAgICAgICBpZiAoKHggPSBjbWtleSh0bm5lZ3RhYixudG5uZWd0YWIsIm1lIiwiYWNjZXB0Iix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkodG5uZWd0YWIsbnRubmVndGFiLCJ1IiwiYWNjZXB0Iix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgICAgICBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfU1RBUlRfVExTKSA9IHg7CisgICAgICAgICAgICBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpID0geTsKKyAgICAgICAgICAgIFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9TVEFSVF9UTFMpID0geDsKKyAgICAgICAgICAgIFRFTE9QVF9ERUZfQ19VX01PREUoVEVMT1BUX1NUQVJUX1RMUykgPSB5OworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworI2lmZGVmIENLX05BV1MKKyAgICAgICAgICBjYXNlIENLX1ROX05BV1M6ICAgICAgICAgICAgICAvKiBOQVdTICovCisgICAgICAgICAgICBpZiAoKHggPSBjbWtleSh0bm5lZ3RhYixudG5uZWd0YWIsIm1lIiwiYWNjZXB0Iix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkodG5uZWd0YWIsbnRubmVndGFiLCJ1IiwiYWNjZXB0Iix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgICAgICBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfTkFXUykgPSB4OworICAgICAgICAgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfTkFXUykgPSB5OworICAgICAgICAgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX05BV1MpID0geDsKKyAgICAgICAgICAgIFRFTE9QVF9ERUZfQ19VX01PREUoVEVMT1BUX05BV1MpID0geTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZW5kaWYgLyogQ0tfTkFXUyAqLworCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICAgICAgICBjYXNlIENLX1ROX0FVOiAgICAgICAgICAgICAgICAvKiBBVVRIRU5USUNBVElPTiAqLworICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkodG5hdXRodGFiLG50bmF1dGgsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIGlmICh4ID09IFROX0FVX0ZXRCkgeworICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgZm9yd2FyZF9mbGFnOworICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJmZvcndhcmRfZmxhZykpOworICAgICAgICAgICAgfSBlbHNlIGlmICh4ID09IFROX0FVX1RZUCkgeworICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgYXV0aF90eXBlX3VzZXJbXTsKKyAgICAgICAgICAgICAgICBleHRlcm4gaW50IHNsX2F1dGhfdHlwZV91c2VyW107CisgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBzbF9hdXRoX3NhdmVkOworICAgICAgICAgICAgICAgIGludCBpLCBqLCBhdHlwZXNbQVVUSFRZUExTVFNaXTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBVVRIVFlQTFNUU1o7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShhdXR5cHRhYixuYXV0eXAsIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPT0gMCA/ICJhdXRvbWF0aWMiIDogIiIgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPT0gLTMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiAoeSA9PSBBVVRIVFlQRV9BVVRPIHx8IHkgPT0gQVVUSFRZUEVfTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICJcclxuP0Nob2ljZSBtYXkgb25seSBiZSB1c2VkIGluIGZpcnN0IHBvc2l0aW9uLlxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0eXBlc1tqXSA9PSB5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcclxuP0Nob2ljZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXR5cGVzW2ldID0geTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHkgPT0gQVVUSFRZUEVfTlVMTCB8fCB5ID09IEFVVEhUWVBFX0FVVE8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpIDwgQVVUSFRZUExTVFNaKQorICAgICAgICAgICAgICAgICAgYXR5cGVzW2ldID0gQVVUSFRZUEVfTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgICAgICAgICAgc2xfYXV0aF9zYXZlZCA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEFVVEhUWVBMU1RTWjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dGhfdHlwZV91c2VyW2ldID0gYXR5cGVzW2ldOworICAgICAgICAgICAgICAgICAgICBzbF9hdXRoX3R5cGVfdXNlcltpXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh4ID09IFROX0FVX0hPVykgeworICAgICAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KGF1aG93dGFiLG5hdWhvdywiIiwiYW55Iix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgICAgICAgICAgdG5fYXV0aF9ob3cgPSB5OworICAgICAgICAgICAgfSBlbHNlIGlmICh4ID09IFROX0FVX0VOQykgeworICAgICAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KGF1ZW5jdGFiLG5hdWVuYywiIiwiZW5jcnlwdCIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICAgICAgICAgIHRuX2F1dGhfZW5jID0geTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9BVVRIRU5USUNBVElPTikgPSB4OworICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9IHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgY2FzZSBDS19UTl9FTkM6IHsgICAgICAgICAgICAgLyogRU5DUllQVElPTiAqLworICAgICAgICAgICAgICBpbnQgYywgdG1wID0gLTE7CisgICAgICAgICAgICAgIGludCBnZXR2YWwgPSAwOworICAgICAgICAgICAgICBzdGF0aWMgc3RydWN0IGtleXRhYiAqIHRuZXRibCA9IE5VTEw7CisgICAgICAgICAgICAgIHN0YXRpYyBpbnQgbnRuZXRibCA9IDA7CisKKyAgICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkodG5lbmN0YWIsbnRuZW5jLCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgICAgICAgY2FzZSBUTl9FTl9UWVA6CisgICAgICAgICAgICAgICAgICB4ID0gY2tfZ2V0X2NyeXB0X3RhYmxlKCZ0bmV0YmwsJm50bmV0YmwpOworICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiY2tfZ2V0X2NyeXB0X3RhYmxlIHgiLCIiLHgpOworICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiY2tfZ2V0X2NyeXB0X3RhYmxlIG4iLCIiLG50bmV0YmwpOworICAgICAgICAgICAgICAgICAgaWYgKHggPCAxIHx8ICF0bmV0YmwgfHwgbnRuZXRibCA8IDEpIC8qIERpZG4ndCBnZXQgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgICBpZiAoIXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9Pb3BzLCB0eXBlcyBub3QgbG9hZGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkodG5ldGJsLG50bmV0YmwsInR5cGUgb2YgZW5jcnlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0b21hdGljIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgICAgICAgICAgICBjeF90eXBlID0geDsKKyAgICAgICAgICAgICAgICAgIHNsX2N4X3R5cGUgPSAwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUTl9FTl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgIGlmICgoeiA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHopOworI2lmZGVmIENLX0FQQworICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgbGV0IHRoaXMgYmUgc2V0IHJlbW90ZWx5ICovCisgICAgICAgICAgICAgICAgICBpZiAoYXBjYWN0aXZlID09IEFQQ19MT0NBTCB8fAorICAgICAgICAgICAgICAgICAgICAgIGFwY2FjdGl2ZSA9PSBBUENfUkVNT1RFICYmICEoYXBjc3RhdHVzICYgQVBDX1VOQ0gpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIENLX0FQQyAqLworICAgICAgICAgICAgICAgICAgY2tfdG5fZW5jX3N0YXJ0KCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFROX0VOX1NUT1A6CisgICAgICAgICAgICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybih6KTsKKyNpZmRlZiBDS19BUEMKKyAgICAgICAgICAgICAgICAgIC8qIERvbid0IGxldCB0aGlzIGJlIHNldCByZW1vdGVseSAqLworICAgICAgICAgICAgICAgICAgaWYgKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwgfHwKKyAgICAgICAgICAgICAgICAgICAgICBhcGNhY3RpdmUgPT0gQVBDX1JFTU9URSAmJiAhKGFwY3N0YXR1cyAmIEFQQ19VTkNIKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKyAgICAgICAgICAgICAgICAgIGNrX3RuX2VuY19zdG9wKCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgICAgICAgICAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSB5OworICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9DX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSB5OworICAgICAgICAgICAgICAgICAgVEVMT1BUX0RFRl9TX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0geTsKKyAgICAgICAgICAgICAgICAgIFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0geTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisKKyAgICAgICAgICBjYXNlIENLX1ROX0JVRzogICAgICAgICAgICAgICAvKiBCVUcgKi8KKyAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KHRuYnVndGFiLDQsIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmluYXJ5LW1lLW1lYW5zLXUtdG9vIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKCh6ID0gY21rZXkob25vZmYsMiwiIiwib2ZmIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHopOworICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgICAgICBzd2l0Y2ggKHgpIHsKKyAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHRuX2JfbWV1ID0gejsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHRuX2JfdW1lID0gejsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHRuX2luZmluaXRlID0gejsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHRuX3NiX2J1ZyA9IHo7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICB0bl9hdXRoX2tyYjVfZGVzX2J1ZyA9IHo7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisjaWZkZWYgQ0tfRU5WSVJPTk1FTlQKKyAgICAgICAgICBjYXNlIENLX1ROX1hEOiAgICAgICAgICAgICAgICAvKiBYRElTUExPQyAqLworICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkodG5uZWd0YWIsbnRubmVndGFiLCJtZSIsImFjY2VwdCIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KHRubmVndGFiLG50bm5lZ3RhYiwidSIsImFjY2VwdCIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIGlmICgoeiA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICAgICAgVEVMT1BUX0RFRl9TX01FX01PREUoVEVMT1BUX1hESVNQTE9DKSA9IHg7CisgICAgICAgICAgICBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9YRElTUExPQykgPSB5OworICAgICAgICAgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX1hESVNQTE9DKSA9IHg7CisgICAgICAgICAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9YRElTUExPQykgPSB5OworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgICAgIGNhc2UgQ0tfVE5fRU5WOiB7CisgICAgICAgICAgICAgIGNoYXIgKiBtc2cgPSAidmFsdWUgb2YgdGVsbmV0IGVudmlyb25tZW50IHZhcmlhYmxlIjsKKyAgICAgICAgICAgICAgZXh0ZXJuIGludCB0bl9lbnZfZmxnOworICAgICAgICAgICAgICBleHRlcm4gY2hhciB0bl9lbnZfYWNjdFtdLCB0bl9lbnZfZGlzcFtdLCB0bl9lbnZfam9iW10sCisgICAgICAgICAgICAgIHRuX2Vudl9wcm50W10sIHRuX2Vudl9zeXNbXTsKKyAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiB0bl9sb2M7CisgICAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KHRuZW52dGFiLG50bmVudiwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgIGlmICh4ID09IFROX0VOVl9VVkFSKSB7ICAgLyogVXNlciB2YXJpYWJsZXMgKi8KKyAgICAgICAgICAgICAgICAgIGNoYXIgKiB1dmFyPU5VTEw7CisgICAgICAgICAgICAgICAgICBjaGFyICogdXZhbD1OVUxMOworICAgICAgICAgICAgICAgICAgY2hhciAqIGVudjsKKyAgICAgICAgICAgICAgICAgIGV4dGVybiBjaGFyICogdG5fZW52X3VzZXJ2YXJbOF1bMl07CisKKyAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgdXNlciB2YXJpYWJsZSBuYW1lICovCisgICAgICAgICAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiTmFtZSBvZiBFbnZpcm9ubWVudCBWYXJpYWJsZSIsIiIsJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgICAgbWFrZXN0cigmdXZhcixzKTsKKworICAgICAgICAgICAgICAgICAgZW52ID0gZ2V0ZW52KHV2YXIpOworICAgICAgICAgICAgICAgICAgaWYgKCFlbnYpIGVudiA9ICIiOworCisgICAgICAgICAgICAgICAgICBpZiAoKHggPSBjbXR4dCgiVmFsdWUgb2YgRW52aXJvbm1lbnQgVmFyaWFibGUiLGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgICAgICBpZiAoKnMpCisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnV2YWwscyk7CisKKyAgICAgICAgICAgICAgICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgdGhlIHZhcmlhYmxlIGFuZCBwZXJoYXBzIGEgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgIC8qIHRoZXJlIGFyZSB0aHJlZSBwb3NzaWJpbGl0aWVzOiAoMSkgbmV3IHZhcmlhYmxlICAgKi8KKyAgICAgICAgICAgICAgICAgIC8qIGFuZCBhc3NvY2lhdGVkIHZhbHVlOyAoMikgdmFyaWFibGUgYWxyZWFkeSBleGlzdHMgKi8KKyAgICAgICAgICAgICAgICAgIC8qIGJ1dCB3ZSBoYXZlIGEgbmV3IHZhbHVlOyAoMykgdmFyaWFibGUgYWxyZWFkeSAgICAgKi8KKyAgICAgICAgICAgICAgICAgIC8qIGV4aXN0cyBidXQgbm8gbmV3IHZhbHVlIHRoZXJlZm9yZSB0aGUgdXNlciB3YW50cyAgKi8KKyAgICAgICAgICAgICAgICAgIC8qIHRvIGNsZWFyIHZhcmlhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgLyogVHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcgdmFyaWFibGUgKi8KKyAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNrc3RyY21wKHRuX2Vudl91c2VydmFyW3hdWzBdLHV2YXIsLTEsMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUodG5fZW52X3VzZXJ2YXJbeF1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5fZW52X3VzZXJ2YXJbeF1bMV0gPSB1dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh1dmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHRuX2Vudl91c2VydmFyW3hdWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuX2Vudl91c2VydmFyW3hdWzBdID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUodG5fZW52X3VzZXJ2YXJbeF1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5fZW52X3VzZXJ2YXJbeF1bMV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh1dmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8qIENvdWxkbid0IGZpbmQgb25lOyBsb29rIGZvciBlbXB0eSBsb2NhdGlvbiB0byBpbnNlcnQgKi8KKyAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRuX2Vudl91c2VydmFyW3hdWzBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRuX2Vudl91c2VydmFyW3hdWzBdID0gdXZhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG5fZW52X3VzZXJ2YXJbeF1bMV0gPSB1dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBubyBzcGFjZSBmb3IgdmFyaWFibGUuXG4iKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHggPT0gVE5fRU5WX09GRiB8fCB4ID09IFROX0VOVl9PTikgeworICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisjaWZkZWYgSUtTRAorICAgICAgICAgICAgICAgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/U29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgICAgICAgICAgdG5fZW52X2ZsZyA9IHggPT0gVE5fRU5WX09GRiA/IDAgOiAxOworICAgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIE5vdCBPTi9PRkYgLSBHZXQgdGhlIHZhbHVlICovCisgICAgICAgICAgICAgIHogPSBjbWRncXVvKCk7CisgICAgICAgICAgICAgIGNtZHNxdW8oMCk7CisgICAgICAgICAgICAgIGlmICgoeSA9IGNtdHh0KG1zZywgIiIsICZzLCB4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgY21kc3F1byh6KTsKKyAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjbWRzcXVvKHopOworI2lmZGVmIElLU0QKKyAgICAgICAgICAgICAgaWYgKGluc2VydmVyKQorICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgICAgICBpZiAoKGludClzdHJsZW4ocykgPiA2MykgeworICAgICAgICAgICAgICAgICAgcHJpbnRmKCJTb3JyeSwgdG9vIGxvbmdcbiIpOworICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzd2l0Y2ggKHgpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFROX0VOVl9VU1I6CisgICAgICAgICAgICAgICAgICBja3N0cm5jcHkodWlkYnVmLHMsVUlEQlVGTEVOKTsKKyAgICAgICAgICAgICAgICAgIHNsX3VpZF9zYXZlZCA9IDA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFROX0VOVl9BQ0NUOgorICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHRuX2Vudl9hY2N0LHMsNjQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUTl9FTlZfRElTUDoKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh0bl9lbnZfZGlzcCxzLDY0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVE5fRU5WX0pPQjoKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh0bl9lbnZfam9iLHMsNjQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUTl9FTlZfUFJOVDoKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh0bl9lbnZfcHJudCxzLDY0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVE5fRU5WX1NZUzoKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh0bl9lbnZfc3lzLHMsNjQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUTl9FTlZfTE9DOgorICAgICAgICAgICAgICAgICAgaWYgKCEqcykgcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZ0bl9sb2Mscyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFROX0VOVl9VVkFSOgorICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbj9Ob3QgeWV0IGltcGxlbWVudGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisKKyNpZmRlZiBDS19TTkRMT0MKKyAgICAgICAgICBjYXNlIENLX1ROX0xPQzogeyAgICAgICAgICAgICAvKiBMT0NBVElPTiAqLworICAgICAgICAgICAgICBleHRlcm4gY2hhciAqIHRuX2xvYzsKKyAgICAgICAgICAgICAgaWYgKCh5ID0gY210eHQoIkxvY2F0aW9uIHN0cmluZyIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICBpZiAoISpzKSBzID0gTlVMTDsKKyAgICAgICAgICAgICAgbWFrZXN0cigmdG5fbG9jLHMpOworICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19TTkRMT0MgKi8KKyAgICAgICAgICBjYXNlIENLX1ROX1NGVTogICAgICAgICAgICAgICAvKiBNaWNyb3NvZnQgU0ZVIGNvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgICAgIGlmICgoeiA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHopOworICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgICAgICB0bl9zZnUgPSB6OworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBDS19UTl9XQUlUOiAgICAgICAgICAgICAgLyogV0FJVC1GT1ItTkVHT1RJQVRJT05TICovCisgICAgICAgICAgICBpZiAoKHogPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworI2lmZGVmIElLU0QKKyAgICAgICAgICAgIGlmIChpbnNlcnZlciAmJgorI2lmZGVmIElLU0RDT05GCisgICAgICAgICAgICAgICAgaWtzZGNmCisjZWxzZQorICAgICAgICAgICAgICAgIDEKKyNlbmRpZiAvKiBJS1NEQ09ORiAqLworICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgICAgIHRuX3dhaXRfZmxnID0gejsKKyAgICAgICAgICAgIHNsX3RuX3NhdmVkID0gMDsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgICAgICBjYXNlIENLX1ROX0RMOiAgICAgICAgICAgICAgICAvKiBERUxBWSBTVUJORUdPVElBVElPTlMgKi8KKyAgICAgICAgICAgIGlmICgoeiA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHopOworICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisjaWZkZWYgSUtTRAorICAgICAgICAgICAgaWYgKGluc2VydmVyICYmCisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICAgICAgICBpa3NkY2YKKyNlbHNlCisgICAgICAgICAgICAgICAgMQorI2VuZGlmIC8qIElLU0RDT05GICovCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/U29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgICAgdG5fZGVsYXlfc2IgPSB6OworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgICAgIGNhc2UgQ0tfVE5fUFVJRDogeyAgICAgICAgICAgIC8qIFBST01QVC1GT1ItVVNFUklEICovCisgICAgICAgICAgICAgIGludCBpLGxlbjsKKyAgICAgICAgICAgICAgaWYgKCh5ID0gY210eHQoIlByb21wdCBzdHJpbmciLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgaWYgKHMgPT0gIiIpIHMgPSBOVUxMOworICAgICAgICAgICAgICBpZiAocykgeworICAgICAgICAgICAgICAgICAgcyA9IGJyc3RyaXAocyk7CisgICAgICAgICAgICAgICAgICBpZiAocyA9PSAiIikgcyA9IE5VTEw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLyogd2UgbXVzdCBjaGVjayB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vICUgZmllbGRzICovCisgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICBpZiAoc1tpXSA9PSAnJScpIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoc1tpKzFdICE9ICclJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUlIGZpZWxkcyBhcmUgbm90IHVzZWQgaW4gdGhpcyBjb21tYW5kLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBtYWtlc3RyKCZ0bl9wcl91aWQscyk7CisgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFROQ09ERSAqLworCisgICAgc3dpdGNoICh4eCkgeworI2lmbmRlZiBOT1NQTAorICAgICAgY2FzZSBYWUNPVU46ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBDT1VOVCAqLworICAgICAgICB4ID0gY21udW0oIlBvc2l0aXZlIG51bWJlciIsIjAiLDEwLCZ6LHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKHggPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICBpZiAoeiA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiP0EgcG9zaXRpdmUgbnVtYmVyLCBwbGVhc2VcbiIpOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMDEsIlhZQ09VTjogeiIsIiIseik7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0bnVtKCZjb3VudFtjbWRsdmxdLHosMCwxMDAwMCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICAgIGNhc2UgWFlDQVNFOgorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHNldG9uKCZpbnBjYXNbY21kbHZsXSkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICAgIGNhc2UgWFlDTUQ6ICAgICAgICAgICAgICAgICAgICAgICAvKiBDT01NQU5EIC4uLiAqLworICAgICAgICBpZiAoKHkgPSBjbWtleShzY21kdGFiLG5ieXR0LCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgY2FzZSBTQ01EX0NCUjoKKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgICAgICBjYXNlIFNDTURfQlNaOgorICAgICAgICAgICAgaWYgKCh5ID0gY21udW0oImJ5dGVzaXplIGZvciBjb21tYW5kIGNoYXJhY3RlcnMsIDcgb3IgOCIsIjciLDEwLCZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIGlmICh4ICE9IDcgJiYgeCAhPSA4KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbj9UaGUgY2hvaWNlcyBhcmUgNyBhbmQgOFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKHggPT0gNykgY21kbXNrID0gMDE3NzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHggPT0gOCkgY21kbXNrID0gMDM3NzsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjaWZkZWYgQ0tfUkVDQUxMCisgICAgICAgICAgY2FzZSBTQ01EX1JDTDoKKyAgICAgICAgICAgIGlmICgoeSA9IGNtbnVtKCJtYXhpbXVtIG51bWJlciBvZiBjb21tYW5kcyBpbiByZWNhbGwgYnVmZmVyIiwiMTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsJngseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSBjbXJpbmkoeCkpOworI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworI2lmZGVmIENLX1JFQ0FMTAorICAgICAgICAgIGNhc2UgU0NNRF9SVFI6CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHNldG9uKCZjbV9yZXRyeSkpOworI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworICAgICAgICAgIGNhc2UgU0NNRF9NT1I6ICAgICAgICAgICAgICAgIC8qIE1vcmUtcHJvbXB0aW5nICovCisgICAgICAgICAgICBzdWNjZXNzID0gc2V0b24oJnhhc2ttb3JlKTsKKyAgICAgICAgICAgIGlmIChzdWNjZXNzKQorICAgICAgICAgICAgICBzYXZlYXNrID0geGFza21vcmU7CisgICAgICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisgICAgICAgICAgY2FzZSBTQ01EX1FVTzoKKyAgICAgICAgICAgIGlmICgoeCA9IHNldG9uKCZ5KSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgICAgICBjbWRzcXVvKHkpOyAgICAgICAgICAgICAgICAgLyogRG8gaXQgdGhlIHJpZ2h0IHdheSAqLworICAgICAgICAgICAgY21kX3F1b3RpbmcgPSB5OyAgICAgICAgICAgIC8qIEFsc28ga2VlcCBhIGdsb2JhbCBjb3B5ICovCisgICAgICAgICAgICAvKiBTZXQgc3RyaW5nLXByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgICAgICAgICAgeHhzdHJpbmcgPSB5ID8genpzdHJpbmcgOiAoeHhfc3RycCkgTlVMTDsKKyNlbHNlCisjaWZkZWYgQ0tfQU5TSUMKKyAgICAgICAgICAgIHh4c3RyaW5nID0geSA/IHp6c3RyaW5nIDogKHh4X3N0cnApIE5VTEw7CisjZWxzZQorICAgICAgICAgICAgeHhzdHJpbmcgPSB5ID8genpzdHJpbmcgOiAoeHhfc3RycCkgTlVMTDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisjaWZkZWYgT1MyCisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgICBjYXNlIFNDTURfQ09MOiB7ICAgICAgICAgICAgICAvKiBDb21tYW5kLXNjcmVlbiBjb2xvcnMgKi8KKyAgICAgICAgICAgICAgaW50IGZnLCBiZzsKKyAgICAgICAgICAgICAgZmcgPSBjbWtleSh0dHljbHJ0YWIsIG5jbHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JlZ3JvdW5kIGNvbG9yIGFuZCB0aGVuIGJhY2tncm91bmQgY29sb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpOworICAgICAgICAgICAgICBpZiAoZmcgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybihmZyk7CisgICAgICAgICAgICAgIGlmICgoYmcgPSBjbWtleSh0dHljbHJ0YWIsbmNscnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZCBjb2xvciIsImJsYWNrIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oYmcpOworICAgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICBjb2xvcmNtZCA9IGZnIHwgYmcgPDwgNDsKKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBTQ01EX1NDUjogICAgICAgICAgICAgICAgLyogQ29tbWFuZCBTY3JvbGxiYWNrIHNpemUgKi8KKyAgICAgICAgICAgIGlmICgoeSA9IGNtbnVtKCJDT01NQU5EIHNjcm9sbGJhY2sgYnVmZmVyIHNpemUsIGxpbmVzIiwiNTEyIiwxMCwmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAvKiBUaGUgbWF4IG51bWJlciBvZiBsaW5lcyBpcyB0aGUgUkFNICAqLworICAgICAgICAgICAgLyogd2UgY2FuIGFjdHVhbGx5IGRlZGljYXRlIHRvIGEgICAgICAgKi8KKyAgICAgICAgICAgIC8qIHNjcm9sbGJhY2sgYnVmZmVyIGdpdmVuIHRoZSBtYXhpbXVtICovCisgICAgICAgICAgICAvKiBwcm9jZXNzIG1lbW9yeSBzcGFjZSBvZiA1MTJNQiAgICAgICAqLworICAgICAgICAgICAgaWYgKHggPCAyNTYgfHwgeCA+IDIwMDAwMDBMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbj9UaGUgc2l6ZSBtdXN0IGJlIGJldHdlZW4gMjU2IGFuZCAyLDAwMCwwMDAuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgICAgICB0dF9zY3JzaXplW1ZDTURdID0geDsKKyAgICAgICAgICAgIFZzY3JuSW5pdCggVkNNRCApOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgICAgIGNhc2UgU0NNRF9XSUQ6IHsKKyAgICAgICAgICAgICAgaWYgKCh5ID0gY21udW0oIk51bWJlciBvZiBjb2x1bW5zIGluIGRpc3BsYXkgd2luZG93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiODAiLDEwLCZ4LHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisKKyAgICAgICAgICAgICAgb3MyX3NldGNtZHdpZHRoKHgpOworICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFNDTURfSElHOgorICAgICAgICAgICAgaWYgKCh5ID0gY21udW0oIk51bWJlciBvZiByb3dzIGluIGRpc3BsYXkgd2luZG93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIyNCIsMTAsJngseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgb3MyX3NldGNtZGhlaWdodCh4KTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgICAgICBjYXNlIFNDTURfU1RBOiB7CisgICAgICAgICAgICAgIGV4dGVybiBpbnQgbWFyZ2luYm90OworICAgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgICAgICAgIGlmICh5ICE9IHR0X3N0YXR1c1tWQ01EXSkgeworICAgICAgICAgICAgICAgICAgLyogTWlnaHQgbmVlZCB0byBmaXh1cCB0aGUgbWFyZ2lucyAqLworICAgICAgICAgICAgICAgICAgdHRfc3RhdHVzW1ZDTURdID0geTsKKyAgICAgICAgICAgICAgICAgIGlmICh5KSB7CisgICAgICAgICAgICAgICAgICAgICAgdHRfc3pjaG5nW1ZDTURdID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICB0dF9yb3dzW1ZDTURdLS07CisgICAgICAgICAgICAgICAgICAgICAgY21kX3Jvd3MtLTsKKyAgICAgICAgICAgICAgICAgICAgICBWc2NybkluaXQoVkNNRCk7ICAvKiBIZWlnaHQgc2V0IGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgIHR0X3N6Y2huZ1tWQ01EXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgdHRfcm93c1tWQ01EXSsrOworICAgICAgICAgICAgICAgICAgICAgIGNtZF9yb3dzKys7CisgICAgICAgICAgICAgICAgICAgICAgVnNjcm5Jbml0KFZDTUQpOyAgLyogSGVpZ2h0IHNldCBoZXJlICovCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjYXNlIFNDTURfQ1VSOiB7CisgICAgICAgICAgICAgIGludCByb3csIGNvbDsKKyAgICAgICAgICAgICAgcG9zaXRpb24gKiBwcG9zOworCisgICAgICAgICAgICAgIHBwb3MgPSBWc2NybkdldEN1clBvcyhWQ01EKTsKKyNpZmRlZiBOVAorI2RlZmluZSBpdG9hIF9pdG9hCisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICAgICAgaXRvYShwcG9zLT55KzEsIHRtcGJ1ZiwgMTApOworICAgICAgICAgICAgICBpZiAoKHkgPSBjbW51bSgicm93ICgxLWJhc2VkKSIsdG1wYnVmLDEwLCZyb3cseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworCisgICAgICAgICAgICAgIGl0b2EocHBvcy0+eCsxLCB0bXBidWYsIDEwKTsKKyAgICAgICAgICAgICAgaWYgKCh5ID0gY21udW0oImNvbCAoMS1iYXNlZCkiLHRtcGJ1ZiwxMCwmY29sLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisKKyAgICAgICAgICAgICAgbGdvdG94eSggVkNNRCwgY29sLCByb3cgKSA7CisgICAgICAgICAgICAgIFZzY3JuSXNEaXJ0eSggVkNNRCApOworICAgICAgICAgICAgICByZXR1cm4oc3VjY2Vzcz0xKTsKKyAgICAgICAgICB9CisjZW5kaWYgLyogTk9MT0NBTCAqLworI2Vsc2UKKyAgICAgICAgICBjYXNlIFNDTURfV0lEOgorICAgICAgICAgICAgeSA9IGNtbnVtKCJDb21tYW5kIHNjcmVlbiB3aWR0aCwgY2hhcmFjdGVycyIsIjgwIiwxMCwmeCx4eHN0cmluZyk7CisgICAgICAgICAgICByZXR1cm4oc2V0bnVtKCZjbWRfY29scyx4LHksMTAyNCkpOworCisgICAgICAgICAgY2FzZSBTQ01EX0hJRzoKKyAgICAgICAgICAgIHkgPSBjbW51bSgiQ29tbWFuZCBzY3JlZW4gaGVpZ2h0LCByb3dzIiwiMjQiLDEwLCZ4LHh4c3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybihzZXRudW0oJmNtZF9yb3dzLHgseSwxMDI0KSk7CisjZW5kaWYgLyogT1MyICovCisKKyAgICAgICAgICBjYXNlIFNDTURfSU5UOgorICAgICAgICAgICAgcmV0dXJuKHNldG9uKCZjbWRpbnQpKTsKKworI2lmZGVmIENLX0FVVE9ETAorICAgICAgICAgIGNhc2UgU0NNRF9BREw6CisgICAgICAgICAgICByZXR1cm4oc2V0b24oJmNtZGFkbCkpOworI2VuZGlmIC8qIENLX0FVVE9ETCAqLworCisjaWZkZWYgRE9VQkxFUVVPVElORworICAgICAgICAgIGNhc2UgU0NNRF9EQlE6IHsKKyAgICAgICAgICAgICAgZXh0ZXJuIGludCBkYmxxdW87CisgICAgICAgICAgICAgIHJldHVybihzZXRvbigmZGJscXVvKSk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIERPVUJMRVFVT1RJTkcgKi8KKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoICh4eCkgeworCisgICAgICBjYXNlIFhZREZMVDogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIERFRkFVTFQgPSBDRCAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IGRvY2QoWFhDV0QpKTsKKworY2FzZSBYWURFQlU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBERUJVRyB7IG9uLCBvZmYsIHNlc3Npb24gfSAqLworICAgICAgICBpZiAoKHkgPSBjbWtleShkYmd0YWIsbmRiZywiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmICh5ID09IERFQl9USU0pCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgIHJldHVybihzZXRvbigmZGVidGltKSA8IDAgPyB4IDogKHN1Y2Nlc3MgPSAxKSk7CisjZWxzZQorICAgICAgICAgIC8qIHdoeSB0aGlzIGNoYW5nZT8gKi8KKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHNldG9uKCZkZWJ0aW0pKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBJS1NECisgICAgICAgIGlmIChpbnNlcnZlciAmJiBpc2d1ZXN0KSB7CisgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgY29tbWFuZCBkaXNhYmxlZC5cclxuIik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisKKyAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgY2FzZSBERUJfTEVOOgorICAgICAgICAgICAgeSA9IGNtbnVtKCJNYXggbGVuZ3RoIGZvciBkZWJ1ZyBsb2cgc3RyaW5ncyIsIiIsMTAsJngseHhzdHJpbmcpOworICAgICAgICAgICAgaWYgKCh6ID0gc2V0bnVtKCZkZWJ4bGVuLHgseSwtMSkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICAgICAgY2FzZSBERUJfT0ZGOgorICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgICAgIHNldGRlYnNlcygwKTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGlmIChkZWJsb2cpIGRvY2xzbG9nKExPR0QpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICAgICAgY2FzZSBERUJfT046CisgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgZGVibG9nID0gZGVib3BuKCJkZWJ1Zy5sb2ciLCAwKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gZGVibG9nID8gMSA6IDApOworI2Vsc2UKKyAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBkZWJ1ZyBsb2cgZmVhdHVyZSBub3QgZW5hYmxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgY2FzZSBERUJfU0VTOgorICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgICAgIHNldGRlYnNlcygxKTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisjaWZuZGVmIE5PWEZFUgorICAgICAgY2FzZSBYWURFTEE6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBERUxBWSAqLworICAgICAgICB5ID0gY21udW0oIk51bWJlciBvZiBzZWNvbmRzIGJlZm9yZSBzdGFydGluZyB0byBzZW5kIiwKKyAgICAgICAgICAgICAgICAgICI1IiwxMCwmeCx4eHN0cmluZyk7CisgICAgICAgIGlmICh4IDwgMCkgeCA9IDA7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0bnVtKCZja2RlbGF5LHgseSw5OTkpKTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoICh4eCkgeworI2lmZGVmIENLX1RBUEkKKyAgICAgIGNhc2UgWFlUQVBJOgorICAgICAgICByZXR1cm4oc2V0dGFwaSgpKTsKKyNlbmRpZiAvKiBDS19UQVBJICovCisjaWZuZGVmIE5PRElBTAorICAgICAgY2FzZSBYWURJQUw6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBNT0RFTSBvciBTRVQgRElBTCAqLworICAgICAgICByZXR1cm4oc2V0ZGlhbCgtMSkpOworICAgICAgY2FzZSBYWU1PRE06CisgICAgICAgIHJldHVybihzZXRtb2RlbSgpKTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAvKiBub3QgaW1wbGVtZW50ZWQgeWV0ICovCisgICAgICBjYXNlIFhZQU5TV0VSOiAgICAgICAgICAgICAgICAgICAgLyogU0VUIEFOU1dFUiAqLworICAgICAgICByZXR1cm4oc2V0YW5zd2VyKCkpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworI2lmbmRlZiBOT0xPQ0FMCisgICAgICBjYXNlIFhZRFVQTDogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIERVUExFWCAqLworICAgICAgICBpZiAoKHkgPSBjbWtleShkcHh0YWIsMiwiIiwiZnVsbCIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGR1cGxleCA9IHk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgWFlMQ0xFOiAgICAgICAgICAgICAgICAgICAgICAvKiBMT0NBTC1FQ0hPICg9IERVUExFWCkgKi8KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSBzZXRvbigmZHVwbGV4KSk7CisKKyAgICAgIGNhc2UgWFlFU0M6ICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgRVNDQVBFICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0Y2MoY2tpdG9hKERGRVNDKSwmZXNjYXBlKSk7CisjZW5kaWYgLyogTk9MT0NBTCAqLworCisgICAgICBjYXNlIFhZRVhJVDogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIEVYSVQgKi8KKyAgICAgICAgaWYgKCh6ID0gY21rZXkoeGl0dGFiLG5leGl0LCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgc3dpdGNoICh6KSB7CisgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgLyogU1RBVFVTICovCisgICAgICAgICAgICB5ID0gY21udW0oIkVYSVQgc3RhdHVzIGNvZGUiLCIiLDEwLCZ4LHh4c3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0bnVtKCZ4aXRzdGEseCx5LC0xKSk7CisgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgLyogV0FSTklORyAqLworICAgICAgICAgICAgaWYgKCh6ID0gY21rZXkoeGl0d3RhYixuZXhpdHcsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgc2V0ZXhpdHdhcm4oeik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBzZXRvbigmZXhpdG9uY2xvc2UpOworI2lmZGVmIFRDUFNPQ0tFVAorICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHRuX2V4aXQgPSBleGl0b25jbG9zZTsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzKTsKKyAgICAgICAgICBjYXNlIDM6IHsKKyAgICAgICAgICAgICAgZXh0ZXJuIGludCBleGl0aGFuZ3VwOworICAgICAgICAgICAgICByZXR1cm4oKHN1Y2Nlc3MgPSBzZXRvbigmZXhpdGhhbmd1cCkpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0gLyogRW5kIG9mIFNFVCBFWElUIHN3aXRjaCgpICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHh4KSB7CisKKyAgICAgIGNhc2UgWFlGSUxFOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgRklMRSAqLworICAgICAgICByZXR1cm4oc2V0ZmlsKHJtc2ZsZykpOworCisgICAgICBjYXNlIFhZRkxPVzogeyAgICAgICAgICAgICAgICAgICAgLyogRkxPVy1DT05UUk9MICovCisgICAgICAgICAgZXh0ZXJuIGludCBjeGZsb3dbXTsKKyAgICAgICAgICBzdHJ1Y3QgRkRCIGsxLCBrMjsKKyAgICAgICAgICBpbnQgdG5jb21wb3J0ID0gMDsKKyAgICAgICAgICBjaGFyICogbTsKKworI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgICBpZiAobmV0d29yayAmJiBpc3RuY29tcG9ydCgpKQorICAgICAgICAgICAgdG5jb21wb3J0ID0gMTsKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisKKyAgICAgICAgICBpZiAodG5jb21wb3J0KSB7CisgICAgICAgICAgICAgIG0gPSAiRmxvdyBjb250cm9sIHR5cGUsIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXAorICAgZHRyL2NkICAgIGR0ci9jdHMgICBrZWVwICAgIG5vbmUgICAgcnRzL2N0cyAgIHhvbi94b2ZmXG5cCisgb3IgY29ubmVjdGlvbiB0eXBlIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIEFsbCB0aGlzIGlzIGJlY2F1c2UgY2hhaW5lZCBGREIncyBkb24ndCBnaXZlIGNoYWluZWQgaGVscCB5ZXQgKi8KKyAgICAgICAgICAgICAgbSA9CisjaWZkZWYgUGxhbjkKKyNpZmRlZiBDS19SVFNDVFMKKyAgICAgICAgICAgIkZsb3cgY29udHJvbCB0eXBlLCBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblwKKyAgIGtlZXAgICBub25lICAgIHJ0cy9jdHNcblwKKyBvciBjb25uZWN0aW9uIHR5cGUiLAorI2Vsc2UKKyAgICAgICAgICAgIkZsb3cgY29udHJvbCB0eXBlLCBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblwKKyAgIGtlZXAgICBub25lXG5cCisgb3IgY29ubmVjdGlvbiB0eXBlIjsKKyNlbmRpZiAvKiBDS19SVFNDVFMgKi8KKyNlbHNlCisjaWZkZWYgQ0tfUlRTQ1RTCisjaWZkZWYgQ0tfRFRSQ0QKKyNpZmRlZiBDS19EVFJDVFMKKyAgICAgICAgICAgIkZsb3cgY29udHJvbCB0eXBlLCBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblwKKyAgIGR0ci9jZCAgICBkdHIvY3RzICAga2VlcCAgICBub25lICAgIHJ0cy9jdHMgICB4b24veG9mZlxuXAorIG9yIGNvbm5lY3Rpb24gdHlwZSI7CisjZWxzZSAvKiBDS19EVFJDVFMgKi8KKyAgICAgICAgICAgIkZsb3cgY29udHJvbCB0eXBlLCBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblwKKyAgIGR0ci9jZCAgICBrZWVwICAgIG5vbmUgICAgcnRzL2N0cyAgIHhvbi94b2ZmXG5cCisgICAgICAgICAgICBvciBjb25uZWN0aW9uIHR5cGUiOworI2VuZGlmIC8qIENLX0RUUkNUUyAqLworI2Vsc2UgLyogQ0tfRFRSQ0QgKi8KKyNpZmRlZiBDS19EVFJDVFMKKyAgICAgICAgICAgIkZsb3cgY29udHJvbCB0eXBlLCBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblwKKyAgIGR0ci9jdHMgICBrZWVwICAgbm9uZSAgICBydHMvY3RzICAgeG9uL3hvZmZcblwKKyBvciBjb25uZWN0aW9uIHR5cGUiOworI2Vsc2UgLyogQ0tfRFRSQ1RTICovCisgICAgICAgICAgICJGbG93IGNvbnRyb2wgdHlwZSwgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cCisgICBrZWVwICAgbm9uZSAgICBydHMvY3RzICAgeG9uL3hvZmZcblwKKyBvciBjb25uZWN0aW9uIHR5cGUiOworI2VuZGlmIC8qIENLX0RUUkNUUyAqLworI2VuZGlmIC8qIENLX0RUUkNEICovCisjZWxzZQorICAgICAgICAgICAiRmxvdyBjb250cm9sIHR5cGUsIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXAorICAga2VlcCAgIG5vbmUgICAgeG9uL3hvZmZcblwKKyBvciBjb25uZWN0aW9uIHR5cGUiOworI2VuZGlmIC8qIENLX1JUU0NUUyAqLworI2VuZGlmIC8qIFBsYW45ICovCisgICAgICAgICAgfQorICAgICAgICAgIGNtZmRiaSgmazEsX0NNS0VZLG0sIiIsIiIsbmN4dHlwZXN3LCA0LCB4eHN0cmluZywgY3h0eXBlc3csICZrMik7CisgICAgICAgICAgY21mZGJpKCZrMiwKKyAgICAgICAgICAgICAgICAgX0NNS0VZLAorICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICIiLAorI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgICAgICAgICAgKHRuY29tcG9ydCA/IG50bmZsbyA6IG5mbG8pLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgbmZsbywKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgIHh4c3RyaW5nLAorI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgICAgICAgICAgKHRuY29tcG9ydCA/IHRuZmxvdGFiIDogZmxvdGFiKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgIGZsb3RhYiwKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisgICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICB4ID0gY21mZGIoJmsxKTsKKyAgICAgICAgICBpZiAoeCA8IDApIHsgICAgICAgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgICBpZiAoeCA9PSAtMiB8fCB4ID09IC05KQorICAgICAgICAgICAgICAgIHByaW50ZigiP05vIGtleXdvcmRzIG9yIHN3aXRjaGVzIG1hdGNoOiBcIiVzXCJcbiIsYXRtYnVmKTsKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIH0KKyAgICAgICAgICB6ID0gY21yZXN1bHQubnJlc3VsdDsgICAgICAgICAvKiBLZXl3b3JkIHZhbHVlICovCisgICAgICAgICAgaWYgKGNtcmVzdWx0LmZkYmFkZHIgPT0gJmsyKSB7IC8qIEZsb3ctY29udHJvbCB0eXBlIGtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSAgICAvKiBTZXQgaXQgaW1tZWRpYXRlbHkgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgIGZsb3cgPSB6OworICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJzZXQgZmxvdyIsIiIsZmxvdyk7CisjaWZkZWYgQ0tfU1BFRUQKKyAgICAgICAgICAgICAgaWYgKGZsb3cgPT0gRkxPX1hPTlgpICAgICAvKiBYb24vWG9mZiBmb3JjZXMgcHJlZml4aW5nICovCisgICAgICAgICAgICAgICAgY3RscFtYT05dID0gY3RscFtYT0ZGXSA9IGN0bHBbWE9OKzEyOF0gPSBjdGxwW1hPRkYrMTI4XSA9IDE7CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKyAgICAgICAgICAgICAgYXV0b2Zsb3cgPSAoZmxvdyA9PSBGTE9fQVVUTyk7CisgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7ICAgICAgLyogRG9uZSAqLworICAgICAgICAgIH0KKyAgICAgICAgICBkZWJ1ZyhGMTAxLCJzZXQgZmxvdyAvYmxhaCAxIiwiIix6KTsgLyogU0VUIEZMT1cgL2Zvci13aGF0ICovCisgICAgICAgICAgaWYgKCh5ID0gY21rZXkoZmxvdGFiLG5mbG8sIkZsb3cgY29udHJvbCB0eXBlIiwibm9uZSIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIGRlYnVnKEYxMDEsInNldCBmbG93IC9ibGFoIDIiLCIiLHkpOworICAgICAgICAgIGlmICh5ID09IEZMT19BVVRPKSB7CisgICAgICAgICAgICAgIHByaW50ZigKKyAgIj9Tb3JyeSwgXCJhdXRvbWF0aWNcIiBjYW4gbm90IGJlIGFzc2lnbmVkIHRvIGEgY29ubmVjdGlvbiB0eXBlLlxuIik7CisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgfSBlbHNlIGlmICh6ID49IDAgJiYgeiA8PSBDWFRfTUFYKQorICAgICAgICAgICAgY3hmbG93W3pdID0geTsKKyAgICAgICAgICBkZWJ1ZyhGMTAxLCJzZXQgZmxvdyIsIiIsZmxvdyk7CisgICAgICAgICAgZGVidWcoRjEwMSwic2V0IGZsb3cgYXV0b2Zsb3ciLCIiLGF1dG9mbG93KTsKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorCisgICAgICBjYXNlIFhZSEFORDogICAgICAgICAgICAgICAgICAgICAgLyogSEFORFNIQUtFICovCisgICAgICAgIGlmICgoeSA9IGNta2V5KGhzaHRhYixuaHNoLCIiLCJub25lIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAoeSA9PSA5OTgpIHsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtbnVtKCJBU0NJSSB2YWx1ZSIsIiIsMTAsJnkseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIGlmICgoeSA8IDEpIHx8ICgoeSA+IDMxKSAmJiAoeSAhPSAxMjcpKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0NoYXJhY3RlciBtdXN0IGJlIGluIEFTQ0lJIGNvbnRyb2wgcmFuZ2VcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIHR1cm4gPSAoeSA+IDAxMjcpID8gMCA6IDE7CisgICAgICAgIHR1cm5jaCA9IHk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyNpZm5kZWYgTk9TUEwKKyAgICAgIGNhc2UgWFlNQUNSOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgTUFDUk8gKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkoc21hY3RhYiwyLCIiLCIiLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHN3aXRjaCAoeSkgeworICAgICAgICAgIGNhc2UgMDogcmV0dXJuKHN1Y2Nlc3MgPSBzZXRvbigmbWVjaG8pKTsKKyAgICAgICAgICBjYXNlIDE6IHJldHVybihzdWNjZXNzID0gc2V0b24oJm1lcnJvcltjbWRsdmxdKSk7CisgICAgICAgICAgZGVmYXVsdDogcmV0dXJuKC0yKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICAgIGNhc2UgWFlNU0dTOgorI2lmZGVmIFZNUworICAgICAgICBpZiAoKHogPSBjbWtleShvbm9mZiwyLCIiLCIiLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeik7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICB2bXNfbXNncyA9IHo7CisgICAgICAgIHByaW50ZigiU29ycnksIFNFVCBNRVNTQUdFUyBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyNlbmRpZiAvKiBWTVMgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoeHgpIHsKKworICAgICAgY2FzZSBYWVBBUkk6ICAgICAgICAgICAgICAgICAgICAgIC8qIFBBUklUWSAqLworICAgICAgICBpZiAoKHkgPSBjbWtleShwYXJ0YmwsbnBhciwiIiwibm9uZSIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworCisgICAgICAgIC8qIElmIHBhcml0eSBub3Qgbm9uZSwgdGhlbiB3ZSBhbHNvIHdhbnQgOHRoLWJpdCBwcmVmaXhpbmcgKi8KKworI2lmZGVmIEhXUEFSSVRZCisgICAgICAgIGlmICh5ID09ICdIJykgeyAgICAgICAgICAgICAgICAgLyogSGFyZHdhcmUgKi8KKyAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KGh3cGFydGJsLG5od3BhciwiIiwiZXZlbiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgfQorI2VuZGlmIC8qIEhXUEFSSVRZICovCisKKyAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgIHJldHVybih6KTsKKworI2lmZGVmIEhXUEFSSVRZCisgICAgICAgIGlmICh5ID09ICdIJykgeyAgICAgICAgICAgICAgICAgLyogOCBkYXRhIGJpdHMgcGx1cyBoYXJkd2FyZSBwYXJpdHkgKi8KKyAgICAgICAgICAgIHBhcml0eSA9IDA7CisjaWZuZGVmIE5PWEZFUgorICAgICAgICAgICAgZWJxZmxnID0gMDsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICAgICAgICAgIGh3cGFyaXR5ID0geDsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiA3IGRhdGEgYml0cyArIHNvZnR3YXJlIHBhcml0eSAqLworICAgICAgICAgICAgaHdwYXJpdHkgPSAwOworI2VuZGlmIC8qIEhXUEFSSVRZICovCisgICAgICAgICAgICBwYXJpdHkgPSB5OworI2lmbmRlZiBOT1hGRVIKKyAgICAgICAgICAgIGVicWZsZyA9IChwYXJpdHkpID8gMSA6IDA7CisjZW5kaWYgLyogTk9YRkVSICovCisjaWZkZWYgSFdQQVJJVFkKKyAgICAgICAgfQorI2VuZGlmIC8qIEhXUEFSSVRZICovCisKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgIGlmIChuZXR3b3JrICYmIGlzdG5jb21wb3J0KCkpCisgICAgICAgICAgdG5zZXR0aW5ncyhwYXJpdHksIDApOworI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisjaWZuZGVmIE5PRlJJTExTCisgICAgICBjYXNlIFhZUFJPTTogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFBST01QVCAqLworLyoKKyAgTm90ZTogeHhzdHJpbmcgbm90IGludm9rZWQgaGVyZS4gIEluc3RlYWQsIGl0IGlzIGludm9rZWQgZXZlcnkgdGltZSB0aGUKKyAgcHJvbXB0IGlzIGlzc3VlZC4gIFRoaXMgYWxsb3dzIHRoZSBwcm9tcHQgc3RyaW5nIHRvIGNvbnRhaW4gdmFyaWFibGVzCisgIHRoYXQgY2FuIGNoYW5nZSwgbGlrZSBcdihkaXIpLCBcdih0aW1lKSwgZXRjLgorKi8KKyAgICAgICAgY2ttYWttc2cobGluZSwgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IG1pZ2h0IGhhdmUgdHJhaWxpbmcgc3BhY2UgKi8KKyAgICAgICAgICAgICAgICAgTElOQlVGU0laLAorICAgICAgICAgICAgICAgICAieyIsCisgICAgICAgICAgICAgICAgIGluc2VydmVyID8gaWtwcm9tcHQgOiBja3Byb21wdCwKKyAgICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGlmICgoeCA9IGNtdHh0KCJQcm9ncmFtJ3MgY29tbWFuZCBwcm9tcHQiLGxpbmUsJnMsTlVMTCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIHMgPSBicnN0cmlwKHMpOyAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIGVuY2xvc2luZyBicmFjZXMsIGlmIGFueSAqLworICAgICAgICBjbXNldHAocyk7ICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgcHJvbXB0ICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgWFlSRVRSOiAgICAgICAgICAgICAgICAgICAgICAvKiBSRVRSWTogcGVyLXBhY2tldCByZXRyeSBsaW1pdCAqLworICAgICAgICB5ID0gY21udW0oIk1heGltdW0gcmV0cmllcyBwZXIgcGFja2V0IiwiMTAiLDEwLCZ4LHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKHggPCAwKSB4ID0gMDsKKyAgICAgICAgaWYgKCh4ID0gc2V0bnVtKCZtYXh0cnkseCx5LDk5OSkpIDwgMCkgcmV0dXJuKHgpOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgaWYgKG1heHRyeSA8PSB3c2xvdHIpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1JldHJ5IGxpbWl0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHdpbmRvdyBzaXplXG4iKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIGlmIChybXNmbGcpIHsKKyAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsICI0MDMiLCBja2l0b2EobWF4dHJ5KSwgIiIpOworICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgIH0gZWxzZSByZXR1cm4oc3VjY2VzcyA9IHgpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PU0VSVkVSCisgICAgICBjYXNlIFhZU0VSVjogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFNFUlZFUiBpdGVtcyAqLworICAgICAgICBpZiAoKHkgPSBjbWtleShzcnZ0YWIsbnNydnQsIiIsIiIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgY2FzZSBYWVNFUkk6CisgICAgICAgICAgICBpZiAoKHkgPSBjbW51bSgiTnVtYmVyIG9mIHNlY29uZHMsIG9yIDAgZm9yIG5vIGlkbGUgdGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiMCIsMTAsJngseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih5KTsKKyNpZm5kZWYgT1MyCisgICAgICAgICAgICBzcnZ0aW0gPSAwOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgc3J2aWRsID0geDsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgY2FzZSBYWVNFUlQ6CisgICAgICAgICAgICBpZiAoKHkgPSBjbW51bSgiSW50ZXJ2YWwgZm9yIHNlcnZlciBOQUtzLCAwID0gbm9uZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBja2l0b2EoRFNSVlRJTSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwmeCwgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAgICAiXG4/U3BlY2lmeSBhIHBvc2l0aXZlIG51bWJlciwgb3IgMCBmb3Igbm8gc2VydmVyIE5BS3NcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsICI0MDQiLCBja2l0b2EoeCksICIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisjaWZuZGVmIE9TMgorICAgICAgICAgICAgICAgIHNydmlkbCA9IDA7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgc3J2dGltID0geDsgICAgICAgICAgICAgLyogU2V0IHRoZSBzZXJ2ZXIgdGltZW91dCB2YXJpYWJsZSAqLworICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBYWVNFUkQ6ICAgICAgICAgICAgICAgICAgLyogU0VSVkVSIERJU1BMQVkgKi8KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJnNydmRpcykpOyAvKiBPTiBvciBPRkYuLi4gKi8KKworI2lmbmRlZiBOT1NQTAorICAgICAgICAgIGNhc2UgWFlTRVJQOiAgICAgICAgICAgICAgICAgIC8qIFNFUlZFUiBHRVQtUEFUSCAqLworICAgICAgICAgICAgcmV0dXJuKHBhcnNkaXIoMikpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICAgICAgICBjYXNlIFhZU0VSTDogICAgICAgICAgICAgICAgICAvKiBTRVJWRVIgTE9HSU4gKi8KKyAgICAgICAgICAgIHJldHVybihja2xvZ2luKCkpOworCisgICAgICAgICAgY2FzZSBYWVNFUkM6ICAgICAgICAgICAgICAgICAgLyogU0VSVkVSIENELU1FU1NBR0UgKi8KKyAgICAgICAgICAgIHggPSBybXNmbGcgPworICAgICAgICAgICAgICBjbWtleShvbm9mZiwyLCIiLCIiLHh4c3RyaW5nKSA6CisgICAgICAgICAgICAgICAgY21rZXkoY2Rtc2csMywiIiwiIix4eHN0cmluZyk7CisgICAgICAgICAgICBpZiAoeCA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIGlmICh4ID09IDIpIHsgICAgICAgICAgICAgICAvKiBDRC1NRVNTQUdFIEZJTEUgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHggPSBjbXR4dCgiTmFtZSBvZiBmaWxlIiwiIiwmcyxOVUxMKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgIGlmICghKnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHNydmNkbXNnID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWFrZXN0cigmY2Rtc2dzdHIscyk7CisgICAgICAgICAgICAgICAgbWFrZWxpc3QoY2Rtc2dzdHIsY2Rtc2dmaWxlLDgpOworICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApICAgICAgLyogQ0QtTUVTU0FHRSBPTi9PRkYgKi8KKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsICI0MjAiLCB4ID8gIjEiIDogIjAiLCAiIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh4ID4gMCkKKyAgICAgICAgICAgICAgICAgIHNydmNkbXNnIHw9IDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc3J2Y2Rtc2cgJj0gMjsKKyAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgWFlTRVJLOiAgICAgICAgICAgICAgICAgIC8qIFNFUlZFUiBLRUVQQUxJVkUgKi8KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJnNydnBpbmcpKTsgLyogT04gb3IgT0ZGLi4uICovCisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCisgICAgfQorCisgICAgc3dpdGNoICh4eCkgeworI2lmZGVmIFVOSVgKKyNpZm5kZWYgTk9KQworICAgICAgY2FzZSBYWVNVU1A6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBTVVNQRU5EICovCisgICAgICAgIHNldG9uKCZ4c3VzcGVuZCk7CQkvKiBvbiBvciBvZmYuLi4gKi8KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyNlbmRpZiAvKiBOT0pDICovCisjZW5kaWYgLyogVU5JWCAqLworCisgICAgICBjYXNlIFhZVEFLRTogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFRBS0UgKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkodGFrdGFiLDQsIiIsIiIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgY2FzZSAwOiByZXR1cm4oc3VjY2VzcyA9IHNldG9uKCZ0ZWNobykpOworI2lmbmRlZiBOT1NQTAorICAgICAgICAgIGNhc2UgMTogcmV0dXJuKHN1Y2Nlc3MgPSBzZXRvbigmdGFrZXJyW2NtZGx2bF0pKTsKKyNlbHNlCisgICAgICAgICAgY2FzZSAxOiByZXR1cm4oc3VjY2VzcyA9IHNldG9uKCZ0YWtlcnJbdGxldmVsXSkpOworI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgY2FzZSAyOiB0ZWNobyA9IDA7IHJldHVybihzdWNjZXNzID0gMSk7IC8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggKi8KKyAgICAgICAgICBjYXNlIDM6IHRlY2hvID0gMTsgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsgLyogTVMtRE9TIEtlcm1pdCAqLworICAgICAgICAgIGRlZmF1bHQ6IHJldHVybigtMik7CisgICAgICAgIH0KKworI2lmbmRlZiBOT1NDUklQVAorICAgICAgY2FzZSBYWVNDUkk6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBTQ1JJUFQgKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkoc2NydGFiLDEsIiIsImVjaG8iLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHN3aXRjaCAoeSkgeworICAgICAgICAgIGNhc2UgMDogcmV0dXJuKHN1Y2Nlc3MgPSBzZXRvbigmc2VjaG8pKTsKKyAgICAgICAgICBkZWZhdWx0OiByZXR1cm4oLTIpOworICAgICAgICB9CisjZW5kaWYgLyogTk9TQ1JJUFQgKi8KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjaWZuZGVmIE5PTE9DQUwKKyAgICBzd2l0Y2ggKHh4KSB7CisgICAgICBjYXNlIFhZVEVSTTogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFRFUk1JTkFMICovCisgICAgICAgIHggPSBzZXR0cm0oKTsKKyAgICAgICAgc3VjY2VzcyA9ICh4ID4gMCkgPyAxIDogMDsKKyAgICAgICAgcmV0dXJuKHgpOworCisjaWZkZWYgTlQKKyAgICAgIGNhc2UgWFlXSU45NTogICAgICAgICAgICAgICAgICAgICAvKiBTRVQgV0lOOTUgd29ya2Fyb3VuZHMgKi8KKyAgICAgICAgeCA9IHNldHdpbjk1KCk7CisgICAgICAgIHN1Y2Nlc3MgPSAoeCA+IDAgPyAxIDogMCk7CisgICAgICAgIHJldHVybih4KTsKKyNlbmRpZiAvKiBOVCAqLworCisjaWZkZWYgT1MyCisgICAgICBjYXNlIFhZRExSOiAgICAgICAgICAgICAgICAgICAgICAgLyogU0VUIERJQUxFUiB3b3JrYXJvdW5kcyAqLworICAgICAgICB4ID0gc2V0ZGlhbGVyKCk7CisgICAgICAgIHN1Y2Nlc3MgPSAoeCA+IDAgPyAxIDogMCk7CisgICAgICAgIHJldHVybih4KTsKKworICAgICAgY2FzZSBYWVRJVExFOiAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBUSVRMRSBvZiB3aW5kb3cgKi8KKyAgICAgICAgeCA9IHNldHRpdGxlKCk7CisgICAgICAgIHN1Y2Nlc3MgPSAoeCA+IDAgPyAxIDogMCk7CisgICAgICAgIHJldHVybih4KTsKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIE9TMk1PVVNFCisgICAgICBjYXNlIFhZTU9VU0U6ICAgICAgICAgICAgICAgICAgICAgLyogU0VUIE1PVVNFICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0bW91KCkpOworI2VuZGlmIC8qIE9TMk1PVVNFICovCisKKyAgICAgIGNhc2UgWFlCRUxMOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgQkVMTCAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHNldGJlbGwoKSk7CisKKyNpZmRlZiBPUzIKKyAgICAgIGNhc2UgWFlQUlRZOgorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHNldHBydHkoKSApOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYgLyogTk9MT0NBTCAqLworCisgICAgc3dpdGNoICh4eCkgeworCisvKiBTRVQgU0VORC9SRUNFSVZFIHByb3RvY29sIHBhcmFtZXRlcnMuICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgICBjYXNlIFhZUkVDVjoKKyAgICAgIGNhc2UgWFlTRU5EOgorICAgICAgICByZXR1cm4oc2V0c3IoeHgscm1zZmxnKSk7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9MT0NBTAorICAgICAgY2FzZSBYWVNFU1M6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFU1NJT04tTE9HICovCisgICAgICAgIGlmICgoeCA9IGNta2V5KHNmdHRhYixuc2Z0dGFiLCJ0eXBlIG9mIGZpbGUiLAorI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICAiYmluYXJ5IiwKKyNlbHNlIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIsCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICApIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmICh4ID09IDk5OSkgeyAgICAgICAgICAgICAgICAgLyogVElNRVNUQU1QRUQtVEVYVCAqLworICAgICAgICAgICAgc2Vzc2Z0ID0gWFlGVF9UOyAgICAgICAgICAgIC8qIEltcGxpZXMgdGV4dCAqLworICAgICAgICAgICAgc2xvZ3RzID0gMTsgICAgICAgICAgICAgICAgIC8qIGFuZCB0aW1lc3RhbXBzICovCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQSByZWd1bGFyIHR5cGUgKi8KKyAgICAgICAgICAgIHNlc3NmdCA9IHg7ICAgICAgICAgICAgICAgICAvKiBUaGUgdHlwZSAqLworICAgICAgICAgICAgc2xvZ3RzID0gMDsgICAgICAgICAgICAgICAgIC8qIE5vIHRpbWVzdGFtcGVzICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgY2FzZSBYWVNQRUU6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBTUEVFRCAqLworICAgICAgICBscCA9IGxpbmU7CisgICAgICAgIGlmIChsb2NhbCAmJiAhbmV0d29yaykgeworICAgICAgICAgIGNrbWFrbXNnKGxwLAorICAgICAgICAgICAgICAgICAgIExJTkJVRlNJWiwKKyAgICAgICAgICAgICAgICAgICAiVHJhbnNtaXNzaW9uIHJhdGUgZm9yICIsCisgICAgICAgICAgICAgICAgICAgdHRuYW1lLAorICAgICAgICAgICAgICAgICAgICIgKGJpdHMgcGVyIHNlY29uZCkiLAorICAgICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNrc3RybmNweShscCwKKyAgICAgICAgICAgICAgICAgICAgIlNlcmlhbC1wb3J0IHNwZWVkIChiaXRzIHBlciBzZWNvbmQpIiwKKyAgICAgICAgICAgICAgICAgICAgTElOQlVGU0laCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgenogPSAtMUw7CisKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgIGlmIChuZXR3b3JrICYmIGlzdG5jb21wb3J0KCkpCisgICAgICAgICAgeCA9IGNta2V5KHRuc3BkdGFiLG50bnNwZCxsaW5lLCIiLHh4c3RyaW5nKTsKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyAgICAgICAgICB4ID0gY21rZXkoc3BkdGFiLG5zcGQsbGluZSwiIix4eHN0cmluZyk7CisgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgaWYgKHggPT0gLTMpIHByaW50ZigiP3ZhbHVlIHJlcXVpcmVkXG4iKTsKKyNpZmRlZiBVU0VUQ1NFVFNQRUVECisgICAgICAgICAgICAvKiBJbiB0aGlzIGNhc2UsIGFueSBudW1iZXIgY2FuIGJlIHRyaWVkICovCisgICAgICAgICAgICAvKiBUaGVyZSdzIGEgcGFyc2UgZXJyb3IgbWVzc2FnZSBidXQgdGhlIHJlcXVlc3Qgc3RpbGwgZ29lcyB0aHJ1ICovCisgICAgICAgICAgICBpZiAocmRpZ2l0cyhhdG1idWYpKQorICAgICAgICAgICAgICB6eiA9IGF0b2woYXRtYnVmKTsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBVU0VUQ1NFVFNQRUVEICovCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyNpZmRlZiBJS1NECisgICAgICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICAgICAgcHJpbnRmKCI/U29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgaWYgKCFsb2NhbCkgeworICAgICAgICAgICAgcHJpbnRmKCI/U0VUIFNQRUVEIGhhcyBubyBlZmZlY3Qgd2l0aG91dCBwcmlvciBTRVQgTElORVxuIik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICB9IGVsc2UgaWYgKG5ldHdvcmsKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgICAgICAgICAgICAgJiYgIWlzdG5jb21wb3J0KCkKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBwcmludGYoIlxuP1NwZWVkIGNhbm5vdCBiZSBzZXQgZm9yIG5ldHdvcmsgY29ubmVjdGlvbnNcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorCisvKgorICBOb3RlOiBUaGlzIHdheSBvZiBoYW5kbGluZyBzcGVlZHMgaXMgbm90IDE2LWJpdCBzYWZlIGZvciBzcGVlZHMgZ3JlYXRlcgorICB0aGFuIDIzMDQwMC4gIFRoZSBhcmd1bWVudCB0byB0dHNzcGQoKSBzaG91bGQgaGF2ZSBiZWVuIGEgbG9uZy4KKyovCisjaWZkZWYgVVNFVENTRVRTUEVFRAorICAgICAgICBpZiAoenogPiAtMUwpCisgICAgICAgICAgeCA9IHp6IC8gMTBMOworI2VuZGlmIC8qIFVTRVRDU0VUU1BFRUQgKi8KKyAgICAgICAgenogPSAobG9uZykgeCAqIDEwTDsKKyAgICAgICAgaWYgKHp6ID09IDEzMEwpIHp6ID0gMTM0TDsKKyAgICAgICAgaWYgKHp6ID09IDcwTCkgenogPSA3NUw7ICAgICAgICAvKiAoc2VlIHNwZHRhYltdIGRlZmluaXRpb24pICovCisgICAgICAgIGlmICh0dHNzcGQoeCkgPCAwKSAgeyAgICAgICAgICAgLyogQ2FsbCB0dHNzcGQgd2l0aCBjcHMsIG5vdCBicHMhICovCisgICAgICAgICAgICBwcmludGYoIj9VbnN1cHBvcnRlZCBsaW5lIHNwZWVkIC0gJWxkXG4iLHp6KTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgQ0tfVEFQSQorICAgICAgICAgICAgaWYgKCF0dHRhcGkgfHwgdGFwaXBhc3MpCisgICAgICAgICAgICAgIHNwZWVkID0gdHRnc3BkKCk7ICAgICAgICAgLyogUmVhZCBpdCBiYWNrICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHNwZWVkID0geno7CisjZWxzZSAvKiBDS19UQVBJICovCisgICAgICAgICAgICBzcGVlZCA9IHR0Z3NwZCgpOyAgICAgICAgICAgLyogUmVhZCBpdCBiYWNrICovCisjZW5kaWYgLyogQ0tfVEFQSSAqLworICAgICAgICAgICAgaWYgKHNwZWVkICE9IHp6KSAgeyAgICAgICAgIC8qIENhbGwgdHRzc3BkIHdpdGggY3BzLCBub3QgYnBzISAqLworICAgICAgICAgICAgICAgIHByaW50ZigiP1NFVCBTUEVFRCBmYWlscywgc3BlZWQgaXMgJWxkXG4iLHNwZWVkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBmbGFnICYmICF4Y21kc3JjKSB7CisgICAgICAgICAgICAgICAgaWYgKHNwZWVkID09IDg4ODApCisgICAgICAgICAgICAgICAgICBwcmludGYoIiVzLCA3NS8xMjAwIGJwc1xuIix0dG5hbWUpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNwZWVkID09IDEzNCkKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMsIDEzNC41IGJwc1xuIix0dG5hbWUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMsICVsZCBicHNcbiIsdHRuYW1lLHNwZWVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgICBjYXNlIFhZWEZFUjogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFRSQU5TRkVSICovCisgICAgICAgIGlmICgoeSA9IGNta2V5KHJtc2ZsZyA/IHJ0c3RhYiA6IHRzdGFiLCAvKiAob3IgUkVNT1RFIFNFVCBUUkFOU0ZFUikgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcm1zZmxnID8gbnJ0cyA6IG50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIiIsImNoYXJhY3Rlci1zZXQiLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHN3aXRjaCAoeSkgeworI2lmZGVmIFhGUkNBTgorICAgICAgICAgIGNhc2UgWFlYX0NBTjogICAgICAgICAgICAgICAgIC8qIENBTkNFTExBVElPTiAqLworICAgICAgICAgICAgaWYgKCh6ID0gY21rZXkob25vZmYsMiwiIiwiIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHopOworICAgICAgICAgICAgaWYgKHogPT0gMCkgeyAgICAgICAgICAgICAgIC8qIE9GRiAqLworICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgIHhmcmNhbiA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtbnVtKCJBU0NJSSBjb2RlIGZvciBjYW5jZWxsYXRpb24gY2hhcmFjdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMyIsMTAsJngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgaWYgKHggPiAzMSAmJiB4ICE9IDEyNykgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIkNhbmNlbCBjaGFyYWN0ZXIgbXVzdCBiZSAwLTMxIG9yIDEyN1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtbnVtKCJIb3cgbWFueSByZXF1aXJlZCB0byBjYXVzZSBjYW5jZWxsYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyIiwxMCwmeiwgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgaWYgKHogPCAyKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiTnVtYmVyIG11c3QgYmUgMiBvciBncmVhdGVyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgeGZyY2FuID0gMTsgICAgICAgICAgICAgLyogQ0FOQ0VMTEFUSU9OIE9OICovCisgICAgICAgICAgICAgICAgeGZyY2hyID0geDsgICAgICAgICAgICAgLyogVXNpbmcgdGhpcyBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgICB4ZnJudW0gPSB6OyAgICAgICAgICAgICAvKiBOZWVkaW5nIHRoaXMgbWFueSBvZiB0aGVtICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworI2VuZGlmIC8qIFhGUkNBTiAqLworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgICAgICBjYXNlIFhZWF9DU0U6ICAgICAgICAgICAgICAgICAvKiBDSEFSQUNURVItU0VUICovCisgICAgICAgICAgICBpZiAoKHkgPSBjbWtleSh0Y3N0YWIsbnRjcywiIiwidHJhbnNwYXJlbnQiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgICAgIGlmIChybXNmbGcpIHsKKyAgICAgICAgICAgICAgICBzc3RhdGUgPSBzZXRnZW4oJ1MnLCAiNDA1IiwgdGNzaW5mb1t5XS5kZXNpZ25hdG9yLCAiIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgc19jc2V0LCBmY2hhcnNldCwgYXhjc2V0W10sIHRjc19zYXZlOworICAgICAgICAgICAgICAgIHRzbGV2ZWwgPSAoeSA9PSBUQ19UUkFOU1ApID8gMCA6IDE7IC8qIHRyYW5zZmVyIHN5bnRheCBsZXZlbCAqLworCQl4ZnJ4bGEgPSB0c2xldmVsOworICAgICAgICAgICAgICAgIHRjaGFyc2V0ID0geTsgICAgICAgICAgIC8qIHRyYW5zZmVyIGNoYXJhY3RlciBzZXQgKi8KKyAgICAgICAgICAgICAgICAvKiBTRU5EIENIQVJBQ1RFUi1TRVQgQVVUTyAqLworICAgICAgICAgICAgICAgIGlmICh0c2xldmVsID4gMCAmJiBzX2NzZXQgPT0gWE1PREVfQSkKKyAgICAgICAgICAgICAgICAgIGlmICh5ID4gLTEgJiYgeSA8PSBNQVhUQ1NFVFMpCisgICAgICAgICAgICAgICAgICAgIGlmIChheGNzZXRbeV0gPiAtMSAmJiBheGNzZXRbeV0gPiBNQVhGQ1NFVFMpCisgICAgICAgICAgICAgICAgICAgICAgZmNoYXJzZXQgPSBheGNzZXRbeV07IC8qIEF1dG8tcGljayBmaWxlIGNoYXJzZXQgKi8KKyAgICAgICAgICAgICAgICBzZXR4bGF0eXBlKHRjaGFyc2V0LGZjaGFyc2V0KTsgLyogVHJhbnNsYXRpb24gdHlwZSAqLworCQl0Y3Nfc2F2ZSA9IC0xOworICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisgICAgICAgICAgY2FzZSBYWVhfTFNIOiAgICAgICAgICAgICAgICAgLyogTE9DS0lORy1TSElGVCAqLworICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkobHN0YWIsbmxzLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgICAgbHNjYXByID0gKHkgPT0gMSkgPyAxIDogMDsgIC8qIE9OOiByZXF1ZXN0ZWQgPSAxICovCisgICAgICAgICAgICBsc2NhcHUgPSAoeSA9PSAyKSA/IDIgOiAwOyAgLyogRk9SQ0VEOiAgdXNlZCA9IDEgKi8KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyNpZmRlZiBDS19YWVoKKyAgICAgICAgICBjYXNlIFhZWF9QUk86ICAgICAgICAgICAgICAgICAvKiBQcm90b2NvbCAqLworI2lmbmRlZiBPUzIKKyAgICAgICAgICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBvbmx5IEtlcm1pdCBwcm90b2NvbCBpcyBhdmFpbGFibGVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICByZXR1cm4oc2V0cHJvdG8oKSk7CisjZW5kaWYgLyogQ0tfWFlaICovCisKKyAgICAgICAgICBjYXNlIFhZWF9NT0Q6ICAgICAgICAgICAgICAgICAvKiBNb2RlICovCisgICAgICAgICAgICBpZiAoKHkgPSBjbWtleSh4ZnJtdGFiLDIsIiIsImF1dG9tYXRpYyIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsICI0MTAiLCB5ID09IFhNT0RFX0EgPyAiMCIgOiAiMSIsICIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oKGludClzc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ194ZmVybW9kZSA9IHk7CisgICAgICAgICAgICB4ZmVybW9kZSA9IHk7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgICBjYXNlIFhZWF9ESVM6ICAgICAgICAgICAgICAgICAvKiBEaXNwbGF5ICovCisgICAgICAgICAgICByZXR1cm4oZG94ZGlzKDEpKTsJCS8qIDEgPT0gS2VybWl0ICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisgICAgICAgICAgY2FzZSBYWVhfU0xPOiAgICAgICAgICAgICAgICAgLyogU2xvdy1zdGFydCAqLworICAgICAgICAgICAgcmV0dXJuKHNldG9uKCZzbG9zdGFydCkpOworCisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgY2FzZSBYWVhfQ1JDOiAgICAgICAgICAgICAgICAgLyogQ1JDICovCisgICAgICAgICAgICByZXR1cm4oc2V0b24oJmRvY3JjKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworICAgICAgICAgIGNhc2UgWFlYX0JFTDogICAgICAgICAgICAgICAgIC8qIEJlbGwgKi8KKyAgICAgICAgICAgIHJldHVybihzZXRvbigmeGZyYmVsKSk7CisKKyNpZmRlZiBQSVBFU0VORAorICAgICAgICAgIGNhc2UgWFlYX1BJUDogICAgICAgICAgICAgICAgIC8qIFBpcGVzICovCisjaWZuZGVmIE5PUFVTSAorICAgICAgICAgICAgaWYgKG5vcHVzaCkgeworI2VuZGlmIC8qIE5PUFVTSCAqLworICAgICAgICAgICAgICAgIHByaW50ZigiU29ycnksIGFjY2VzcyB0byBwaXBlcyBpcyBkaXNhYmxlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyNpZm5kZWYgTk9QVVNICisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyAgICAgICAgICAgICAgcmV0dXJuKHNldG9uKCZ1c2VwaXBlcykpOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyAgICAgICAgICBjYXNlIFhZWF9JTlQ6ICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHRpb24gKi8KKyAgICAgICAgICAgIHJldHVybihzZXRvbigmeGZyaW50KSk7CisKKyAgICAgICAgICBjYXNlIFhZWF9YTEE6CisgICAgICAgICAgICByZXR1cm4oc2V0b24oJnhmcnhsYSkpOyAgICAgLyogVHJhbnNsYXRpb24gKi8KKworICAgICAgICAgIGNhc2UgWFlYX01TRzogeworICAgICAgICAgICAgICBleHRlcm4gY2hhciAqIHhmcm1zZzsKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY210eHQoIlByb21wdCBzdHJpbmciLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgaWYgKCEqcykgcyA9IE5VTEw7CisgICAgICAgICAgICAgIG1ha2VzdHIoJnhmcm1zZyxzKTsKKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworCSAgfQorCSAgY2FzZSBYWVhfUlBUOiB7CisJICAgICAgZXh0ZXJuIGludCB3aGVyZWZsZzsKKwkgICAgICByZXR1cm4oc2V0b24oJndoZXJlZmxnKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisjZW5kaWYgLyogTk9YRkVSICovCisgICAgfQorCisgICAgc3dpdGNoICh4eCkgeworCisjaWZuZGVmIE5PWE1JVAorICAgICAgY2FzZSBYWVhNSVQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBUUkFOU01JVCAqLworICAgICAgICByZXR1cm4oc2V0eG1pdCgpKTsKKyNlbmRpZiAvKiBOT1hNSVQgKi8KKworI2lmbmRlZiBOT1hGRVIKKyNpZm5kZWYgTk9DU0VUUworICAgICAgY2FzZSBYWVVOQ1M6ICAgICAgICAgICAgICAgICAgICAgIC8qIFVOS05PV04tQ0hBUkFDVEVSLVNFVCAqLworICAgICAgICBpZiAoKHkgPSBjbWtleShpZmR0YWIsMiwiIiwiZGlzY2FyZCIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIHVua2NzID0geTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9QVVNICisjaWZkZWYgVU5JWAorICAgICAgY2FzZSBYWVdJTEQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTERDQVJELUVYUEFOU0lPTiAqLworICAgICAgICBpZiAoKHkgPSBjbWtleSh3aWxkdGFiLDIsCisgICAgICAgICAgICAgICAgICAgICAgICJXaG8gZXhwYW5kcyB3aWxkY2FyZHMiLCJrZXJtaXQiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgaWYgKCh6ID0gY21rZXkod2RvdHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIndoZXRoZXIgdG8gbWF0Y2ggZmlsZW5hbWVzIHRoYXQgc3RhcnQgd2l0aCBcIi5cIiIsCisgICAgICAgICAgICAgICAgICAgICAgICIvbm8tbWF0Y2gtZG90LWZpbGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpCisgICAgICAgICAgICAgKSA8IDApCisgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgaWYgKG5vcHVzaCkgeworICAgICAgICAgICAgaWYgKHkgPiAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJTaGVsbCBleHBhbnNpb24gaXMgZGlzYWJsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2lsZHhwYW5kID0geTsKKyAgICAgICAgbWF0Y2hkb3QgPSB6OworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgWFlXSU5EOiAgICAgICAgICAgICAgICAgICAgICAvKiBXSU5ET1ctU0xPVFMgKi8KKyAgICAgICAgaWYgKHByb3RvY29sID09IFBST1RPX0spIHsKKyAgICAgICAgICAgIHkgPSBjbW51bSgiV2luZG93IHNpemUgZm9yIEtlcm1pdCBwcm90b2NvbCwgMSB0byAzMiIsCisgICAgICAgICAgICAgICAgICAgICAgIjEiLCAxMCwgJngsIHh4c3RyaW5nKTsKKyAgICAgICAgICAgIHkgPSBzZXRudW0oJnoseCx5LE1BWFdTKTsgICAvKiA9PSAzMiAqLworICAgICAgICB9CisjaWZkZWYgQ0tfWFlaCisgICAgICAgIGVsc2UgaWYgKHByb3RvY29sID09IFBST1RPX1opIHsKKyAgICAgICAgICAgIHkgPSBjbW51bSgiV2luZG93IHNpemUgZm9yIFpNT0RFTSBwcm90b2NvbCwgMCB0byA2NTUzNSIsCisgICAgICAgICAgICAgICAgICAgICAgIjAiLCAxMCwgJngsIHh4c3RyaW5nKTsKKyAgICAgICAgICAgIHkgPSBzZXRudW0oJnoseCx5LDY1NTM1KTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX1hZWiAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHkgPSBjbW51bSgiV2luZG93IHNpemUgZm9yIGN1cnJlbnQgcHJvdG9jb2wiLAorICAgICAgICAgICAgICAgICAgICAgICIiLCAxMCwgJngsIHh4c3RyaW5nKTsKKyAgICAgICAgICAgIHkgPSBzZXRudW0oJnoseCx5LDY1NDcyKTsgICAvKiBEb2Vzbid0IG1hdHRlciAtIHdlIHdvbid0IHVzZSBpdCAqLworICAgICAgICB9CisgICAgICAgIGlmICh5IDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAocHJvdG9jb2wgPT0gUFJPVE9fSykgeworICAgICAgICAgICAgaWYgKHogPCAxKQorICAgICAgICAgICAgICB6ID0gMTsKKyAgICAgICAgfQorI2lmZGVmIENLX1hZWgorICAgICAgICBlbHNlIGlmIChwcm90b2NvbCA9PSBQUk9UT19aKSB7CisgICAgICAgICAgICAvKiBabW9kZW0gd2luZG93aW5nIGlzIGNsb3NlciB0byBLZXJtaXQgcGFja2V0IGxlbmd0aCAqLworICAgICAgICAgICAgLyogdGhhbiBLZXJtaXQgd2luZG93IHNpemUuICBJZiBXaW5kb3cgc2l6ZSBpcyB6ZXJvICAgKi8KKyAgICAgICAgICAgIC8qIGFuIGVuZCBvZiBmcmFtZSBhbmQgQ1JDIGlzIHNlbnQgb25seSBhdCB0aGUgZW5kIG9mICovCisgICAgICAgICAgICAvKiB0aGUgZmlsZSAoZGVmYXVsdCkuICBPdGhlcndpc2UsIGFuIEVuZCBvZiBGcmFtZSAgICAqLworICAgICAgICAgICAgLyogYW5kIENSQyBhcmUgc2VudCBhZnRlciBXaW5kb3cgU2l6ZSBudW1iZXIgb2YgYnl0ZXMgKi8KKyAgICAgICAgICAgIGlmICh6IDwgMCkgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHdpbmRvd2luZyAgKi8KKyAgICAgICAgICAgICAgeiA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIj9TRVQgV0lORE9XIGRvZXMgbm90IGFwcGx5IHRvICVzIHByb3RvY29sXG4iLAorICAgICAgICAgICAgICAgICAgIHB0YWJbcHJvdG9jb2xdLnBfbmFtZQorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS19YWVogKi8KKworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgLyogVGhpcyBpcyB0YWtlbiBjYXJlIG9mIGF1dG9tYXRpY2FsbHkgbm93IGluIHByb3RvY29sIG5lZ290aWF0aW9uICovCisgICAgICAgIGlmIChtYXh0cnkgPCB6KSB7CisgICAgICAgICAgICBwcmludGYoIj9XaW5kb3cgc2xvdHMgbXVzdCBiZSBsZXNzIHRoYW4gcmV0cnkgbGltaXRcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgaWYgKHByb3RvY29sID09IFBST1RPX0sgJiYgcm1zZmxnKSB7IC8qIFNldCByZW1vdGUgd2luZG93IHNpemUgKi8KKyAgICAgICAgICAgIHdzbG90ciA9IHo7ICAgICAgICAgICAgICAgICAvKiBTZXQgbG9jYWwgd2luZG93IHNpemUgdG9vICovCisgICAgICAgICAgICBwdGFiW3Byb3RvY29sXS53aW5zaXplID0gd3Nsb3RyOworICAgICAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdTJywgIjQwNiIsIGNraXRvYSh6KSwgIiIpOworICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgd3Nsb3RyID0gejsgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgcmVxdWVzdGVkIHdpbmRvdyBzaXplIGhlcmUgKi8KKyAgICAgICAgcHRhYltwcm90b2NvbF0ud2luc2l6ZSA9IHdzbG90cjsgLyogYW5kIGluIHByb3RvY29sLXNwZWNpZmljIHRhYmxlICovCisgICAgICAgIGlmIChwcm90b2NvbCA9PSBQUk9UT19LKSB7ICAgICAgLyogQW5kIGZvciBLZXJtaXQgb25seS4uLiAqLworICAgICAgICAgICAgc3djYXByID0gKHdzbG90ciA+IDEpID8gMSA6IDA7IC8qIHNldCB3aW5kb3cgYml0IGluIGNhcGFzIHdvcmQgKi8KKyAgICAgICAgICAgIGlmICh3c2xvdHIgPiAxKSB7ICAgICAgICAgICAvKiBXaW5kb3cgc2l6ZSA+IDE/ICovCisgICAgICAgICAgICAgICAgLyogTWF5YmUgYWRqdXN0IHBhY2tldCBzaXplICovCisgICAgICAgICAgICAgICAgeSA9IGFkanBrbCh1cnBzaXosd3Nsb3RyLGJpZ3Jic2l6KTsKKyAgICAgICAgICAgICAgICBpZiAoeSAhPSB1cnBzaXopIHsgICAgICAvKiBEaWQgaXQgY2hhbmdlPyAqLworICAgICAgICAgICAgICAgICAgICB1cnBzaXogPSB5OworICAgICAgICAgICAgICAgICAgICBpZiAobXNnZmxnKQorICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyIgQWRqdXN0aW5nIHJlY2VpdmUgcGFja2V0LWxlbmd0aCB0byAlZCBmb3IgJWQgd2luZG93IHNsb3RzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cnBzaXosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzbG90cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgIH0KKworICAgIHN3aXRjaCAoeHgpIHsKKworI2lmbmRlZiBOT1NQTAorICAgICAgY2FzZSBYWU9VVFA6ICAgICAgICAgICAgICAgICAgICAgIC8qIE9VVFBVVCBjb21tYW5kIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkob3V0cHRhYixub3V0cHRhYiwiT1VUUFVUIGNvbW1hbmQgcGFyYW1ldGVyIiwicGFjaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBzd2l0Y2goeSkgeyAgICAgICAgICAgICAgICAgICAgIC8qIFdoaWNoIHBhcmFtZXRlciAqLworICAgICAgICAgIGNhc2UgT1VUX1BBQzogICAgICAgICAgICAgICAgIC8qIFBBQ0lORyAqLworICAgICAgICAgICAgeSA9IGNtbnVtKCJNaWxsaXNlY29uZHMgdG8gcGF1c2UgYmV0d2VlbiBlYWNoIE9VVFBVVCBjaGFyYWN0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICIxMDAiLCAxMCwmeCx4eHN0cmluZyk7CisgICAgICAgICAgICB5ID0gc2V0bnVtKCZ6LHgseSwxNjM4Myk7ICAgLyogVmVyaWZ5IGFuZCBnZXQgY29uZmlybWF0aW9uICovCisgICAgICAgICAgICBpZiAoeSA8IDApIHJldHVybih5KTsKKyAgICAgICAgICAgIGlmICh6IDwgMCkgeiA9IDA7ICAgICAgICAgICAvKiAoc2F2ZSBzb21lIHNwYWNlKSAqLworICAgICAgICAgICAgcGFjaW5nID0gejsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgY2FzZSBPVVRfRVNDOiAgICAgICAgICAgICAgICAgLyogU3BlY2lhbC1lc2NhcGVzICovCisgICAgICAgICAgICByZXR1cm4oc2V0b24oJm91dGVzYykpOworICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIChzaG91bGRuJ3QgaGFwcGVuKSAqLworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBDS19TUEVFRAorICAgICAgY2FzZSBYWVFDVEw6IHsKKyAgICAgICAgICBzaG9ydCAqcDsKKyAgICAgICAgICBpbnQgeno7CisgICAgICAgICAgaWYgKCh6ID0gY21rZXkoY3RsdGFiLDIsICJjb250cm9sLWNoYXJhY3RlciBwcmVmaXhpbmcgb3B0aW9uIiwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgICAvKiBNYWtlIHNwYWNlIGZvciBhIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBwcmVmaXhpbmcgdGFibGUgKi8KKworICAgICAgICAgIHAgPSAoc2hvcnQgKiltYWxsb2MoMjU2ICogc2l6ZW9mKHNob3J0KSk7CisgICAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICAgIHByaW50ZigiP0ludGVybmFsIGVycm9yIC0gbWFsbG9jIGZhaWx1cmVcbiIpOworICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHBbaV0gPSBjdGxwW2ldOyAvKiBDb3B5IGN1cnJlbnQgdGFibGUgKi8KKworICAgICAgICAgIHN3aXRjaCAoeikgeworICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgIC8qIFVOUFJFRklYRUQgY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAvKiBQUkVGSVhFRCBjb250cm9sIGNoYXJhY3RlciAqLworICAgICAgICAgICAgICB3aGlsZSAoMSkgeyAgICAgICAgICAgICAgIC8qIENvbGxlY3QgYSBsaXN0IG9mIG51bWJlcnMgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICAgIHhfaWZudW0gPSAxOyAgICAgICAgICAvKiBUdXJuIG9mZiBjb21wbGFpbnRzIGZyb20gZXZhbCgpICovCisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtbnVtKCh6ID09IDApID8KKyJcbiBOdW1lcmljIEFTQ0lJIHZhbHVlIG9mIGNvbnRyb2wgY2hhcmFjdGVyIHRoYXQgbmVlZHMgTk8gcHJlZml4LFxuXAorIG9yIHRoZSB3b3JkIFwiYWxsXCIsIG9yIGNhcnJpYWdlIHJldHVybiB0byBjb21wbGV0ZSB0aGUgbGlzdCIgOgorIlxuIE51bWVyaWMgQVNDSUkgdmFsdWUgb2YgY29udHJvbCBjaGFyYWN0ZXIgdGhhdCBNVVNUIEJFIHByZWZpeGVkLFxuXAorIG9yIHRoZSB3b3JkIFwiYWxsXCIsIG9yIGNhcnJpYWdlIHJldHVybiB0byBjb21wbGV0ZSB0aGUgbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwxMCwmeSx4eHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgPCAwKSB7CisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgICAgICAgICAgICAgeF9pZm51bSA9IDA7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGlmICh4ID09IC0yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwKSB7IGZyZWUoKGNoYXIgKilwKTsgcCA9IE5VTEw7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiU0VUIENPTlRST0wgYXRtYnVmIixhdG1idWYsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2tzdHJjbXAoYXRtYnVmLCJhbGwiLDMsMCkgfHwgLyogIkFMTCIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFja3N0cmNtcChhdG1idWYsImFsIiwyLDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2tzdHJjbXAoYXRtYnVmLCJhIiwxLDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIC8qIEdldCBjb25maXJtYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworCQkJICAgICAgcHJlZml4aW5nID0geiA/IFBYX0FMTCA6IFBYX05PTjsKKwkJCSAgICAgIHNldHByZWZpeChwcmVmaXhpbmcpOworCQkJICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsJLyogTm90IG51bWJlciwgbm90IEFMTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj9QbGVhc2Ugc3BlY2lmeSBhIG51bWJlciBvciB0aGUgd29yZCBBTExcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwKSBmcmVlKChjaGFyICopcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgICAgICAgICB4X2lmbnVtID0gMDsKKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmZGVmIFVOUFJFRklYWkVSTworICAgICAgICAgICAgICAgICAgenogPSAwOworI2Vsc2UKKyNpZm5kZWYgT1MyCisgICAgICAgICAgICAgICAgICB6eiA9IDEgLSB6OworI2Vsc2UKKyAgICAgICAgICAgICAgICAgIHp6ID0gMDsgICAgICAgICAgICAgICAvKiBBbGxvdyAwIChidXQgb25seSBmb3IgWm1vZGVtKSAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFVOUFJFRklYWkVSTyAqLworCisgICAgICAgICAgICAvKiBwcmludGYoInggPSAlZCwgeSA9ICVkLCB6ID0gJWQsIHp6ID0gJWRcbiIsIHgseSx6LHp6KTsgKi8KKworICAgICAgICAgICAgICAgICAgaWYgKCh5ID4gIDMxICYmIHkgPCAxMjcpIHx8IC8qIEEgc3BlY2lmaWMgbnVtZXJpYyB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICh5ID4gMTU5ICYmIHkgPCAyNTUpIHx8IC8qIENoZWNrIHRoYXQgaXQgaXMgYSB2YWxpZCAqLworICAgICAgICAgICAgICAgICAgICAgICh5IDwgenopIHx8ICAgICAgIC8qIGNvbnRyb2wgY29kZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAoeSA+IDI1NSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9WYWx1ZXMgYWxsb3dlZCBhcmU6ICVkLTMxLCAxMjctMTU5LCAyNTVcbiIsenopOworICAgICAgICAgICAgICAgICAgICAgIGlmIChwKSBmcmVlKChjaGFyICopcCk7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHggPSB5ICYgMTI3OyAgICAgICAgICAvKiBHZXQgNy1iaXQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgIGlmICh6ID09IDApIHsgICAgICAgICAvKiBJZiB0aGV5IGFyZSBzYXlpbmcgaXQgaXMgc2FmZS4uLiAqLworICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGZsb3cgY29udHJvbCBpcyBYb24vWG9mZiAqLworICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGZsb3cgPT0gRkxPX1hPTlgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYT04gJiBYT0ZGIGNoYXJzIG5vdCBzYWZlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKHggPT0gWE9OIHx8IHggPT0gWE9GRikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnZmxnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3JyeSwgbm90IHdoaWxlIFhvbi9Yb2ZmIGlzIGluIGVmZmVjdC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCkgZnJlZSgoY2hhciAqKXApOworICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBUTkNPREUKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXR3b3JrICYmIElTX1RFTE5FVCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHkgPT0gQ1IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSB5ID09ICh1bnNpZ25lZCkgMjU1KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnZmxnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiU29ycnksIG5vdCBvbiBhIFRFTE5FVCBjb25uZWN0aW9uLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwKSBmcmVlKChjaGFyICopcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIFROQ09ERSAqLworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgcFt5XSA9IChjaGFyKSB6OyAgICAgIC8qIEFsbCBPSywgc2V0IGZsYWcgKi8KKyAgICAgICAgICAgICAgfSAvKiBFbmQgb2Ygd2hpbGUgbG9vcCAqLworLyoKKyAgR2V0IGhlcmUgb25seSBpZiB0aGV5IGhhdmUgbWFkZSBubyBtaXN0YWtlcy4gIENvcHkgdGVtcG9yYXJ5IHRhYmxlIGJhY2sgdG8KKyAgcGVybWFuZW50IG9uZSwgdGhlbiBmcmVlIHRlbXBvcmFyeSB0YWJsZSBhbmQgcmV0dXJuIHN1Y2Nlc3NmdWxseS4KKyovCisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgY3RscFtpXSA9IHBbaV07CisgICAgICAgICAgICAgIGlmIChwKSBmcmVlKChjaGFyICopcCk7CisgICAgICAgICAgICAgIGlmICh6ID4gMCkgY2xlYXJycSA9IDA7ICAgLyogMTk5IChzZWUgU0VUIFBSRUZJWElORykgKi8KKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgfQorICAgICAgfQorI2VuZGlmIC8qIENLX1NQRUVEICovCisgICAgfQorCisgICAgc3dpdGNoICh4eCkgeworCisjaWZuZGVmIE5PWEZFUgorICAgICAgY2FzZSBYWVJFUFQ6CisgICAgICAgIGlmICgoeSA9IGNta2V5KHJwdHRhYiwyLAorICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0LWNvdW50IGNvbXByZXNzaW9uIHBhcmFtZXRlciIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBzd2l0Y2goeSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gc2V0b24oJnJwdGVuYSkpOyAvKiBSRVBFQVQgQ09VTlRTID0gT04sIE9GRiAqLworICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgIC8qIFJFUEVBVCBNSU5JTlVNIG51bWJlciAqLworICAgICAgICAgICAgcHJpbnRmKCIobm90IGltcGxlbWVudGVkIHlldCwgbm90aGluZyBoYXBwZW5zKVxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgIC8qIFJFUEVBVCBQUkVGSVggY2hhciAqLworICAgICAgICAgICAgaWYgKCh4ID0gY21udW0oIkFTQ0lJIHZhbHVlIiwiIiwxMCwmeix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgICAgICBpZiAoKHogPiAzMiAmJiB6IDwgNjMpIHx8ICh6ID4gOTUgJiYgeiA8IDEyNykpIHsKKyAgICAgICAgICAgICAgICBpZiAoeSA9PSAxKSBycHRtaW4gPSAoQ0hBUikgejsgZWxzZSBteXJwdHEgPSAoQ0hBUikgejsKKyAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9JbGxlZ2FsIHZhbHVlIGZvciBwcmVmaXggY2hhcmFjdGVyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICAgIGNhc2UgWFlBTFJNOiB7CisjaWZuZGVmIENPTU1FTlQKKyAgICAgICAgICBpbnQgeXk7CisgICAgICAgICAgbG9uZyB6ejsKKyAgICAgICAgICB6eiA9IC0xTDsKKyAgICAgICAgICB5eSA9IHhfaWZudW07CisgICAgICAgICAgeF9pZm51bSA9IDE7ICAgICAgICAgICAgICAgICAgLyogVHVybiBvZmYgaW50ZXJuYWwgY29tcGxhaW50cyAqLworICAgICAgICAgIHkgPSBjbW51bSgiU2Vjb25kcyBmcm9tIG5vdywgb3IgdGltZSBvZiBkYXkgYXMgaGg6bW06c3MiLAorICAgICAgICAgICAgICAgICAgICAiMCIgLDEwLCAmeCwgeHhzdHJpbmcpOworICAgICAgICAgIHhfaWZudW0gPSB5eTsKKyAgICAgICAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgICAgICAgaWYgKHkgPT0gLTIpIHsgICAgICAgICAgICAvKiBJbnZhbGlkIG51bWJlciBvciBleHByZXNzaW9uICovCisgICAgICAgICAgICAgICAgICB6eiA9IHRvZDJzZWMoYXRtYnVmKTsgLyogQ29udmVydCB0byBzZWNzIHNpbmNlIG1pZG5pZ2h0ICovCisgICAgICAgICAgICAgICAgICBpZiAoenogPCAwTCkgeworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP051bWJlciwgZXhwcmVzc2lvbiwgb3IgdGltZSBvZiBkYXkgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbm93WzMyXTsgICAgIC8qIEN1cnJlbnQgdGltZSAqLworICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnA7CisgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0bm93OworICAgICAgICAgICAgICAgICAgICAgIHAgPSBub3c7CisgICAgICAgICAgICAgICAgICAgICAgenRpbWUoJnApOworICAgICAgICAgICAgICAgICAgICAgIHRub3cgPSBhdG9sKHArMTEpICogMzYwMEwgKworICAgICAgICAgICAgICAgICAgICAgICAgYXRvbChwKzE0KSAqIDYwTCArIGF0b2wocCsxNyk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHp6IDwgdG5vdykgICAgLyogVXNlcidzIHRpbWUgYmVmb3JlIG5vdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgenogKz0gODY0MDBMOyAgIC8qIFNvIG1ha2UgaXQgdG9tb3Jyb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICB6eiAtPSB0bm93OyAgICAgICAvKiBTZWNvbmRzIGZyb20gbm93LiAqLworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgICBwcmludGYoIj9BbGFybSB0aW1lIGlzIGluIHRoZSBwYXN0LlxuIik7CisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgIGlmICh6eiA+IC0xTCkgeyAgICAgICAgICAgICAgIC8qIFRpbWUgb2YgZGF5IGdpdmVuPyAqLworICAgICAgICAgICAgICB4ID0geno7CisgICAgICAgICAgICAgIGlmICh6eiAhPSAobG9uZykgeCkgeworICAgICAgICAgICAgICAgICAgcHJpbnRmKAorIlNvcnJ5LCBhcml0aG1ldGljIG92ZXJmbG93IC0gaGg6bW06c3Mgbm90IHVzYWJsZSBvbiB0aGlzIHBsYXRmb3JtLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybihzZXRhbGFybSgobG9uZyl4KSk7CisgICAgICB9CisjZWxzZQorLyoKKyAgVGhpcyBpcyB0byBhbGxvdyBsb25nIHZhbHVlcyB3aGVyZSBpbnQgYW5kIGxvbmcgYXJlIG5vdCB0aGUgc2FtZSwgZS5nLgorICBvbiAxNi1iaXQgc3lzdGVtcy4gIEJ1dCBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCBpdC4KKyovCisgICAgICAgIGlmICgoeSA9IGNtdHh0KCJzZWNvbmRzIGZyb20gbm93IiwgIjAiLCAmcywgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAocmRpZ2l0cyhzKSkgeworICAgICAgICAgICAgcmV0dXJuKHNldGFsYXJtKGF0b2wocykpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiJXMgLSBub3QgYSBudW1iZXJcbiIscyk7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgICBjYXNlIFhZUFJPVE86CisgICAgICAgIHJldHVybihzZXRwcm90bygpKTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworLyoKKyAgQy1LZXJtaXQgdW5wcmVmaXhlcyBjb250cm9sIGNoYXJhY3RlcnMgYXV0b21hdGljYWxseSBvbiBuZXR3b3JrIGNvbm5lY3Rpb25zCisgIGlmIENMRUFSLUNIQU5ORUwgaXMgT04sIHdoaWNoIGl0IGlzIGJ5IGRlZmF1bHQuICBCdXQgbm90IGFsbCBuZXR3b3JrCisgIGNvbm5lY3Rpb25zIGFyZSB0cmFuc3BhcmVudCB0byBhbGwgY29udHJvbCBjaGFyYWN0ZXJzLiAgRm9yIGV4YW1wbGUsIHRoZQorICBERUMtMjAsIGV2ZW4gd2hlbiB5b3UgVEVMTkVUIHRvIGl0LCBpcyBzZW5zaXRpdmUgdG8gQ3RybC1PIGFuZCBDdHJsLVQuCisgIElmIHlvdSB0ZWxsIEMtS2VybWl0IHRvIFNFVCBDT05UUk9MIFBSRUZJWCAxNSBhbmQvb3IgMjAsIGl0IGRvZXNuJ3QgaGVscAorICBiZWNhdXNlIENMRUFSLUNIQU5ORUwgaXMgc3RpbGwgaW4gZWZmZWN0LiAgSWYgdGhlIHVzZXIgZ29lcyB0byB0aGUgdHJvdWJsZQorICB0byBzZXQgdXAgc29tZSBwcmVmaXhpbmcsIHRoZW4gS2VybWl0IHNob3VsZCBkbyB3aGF0IHRoZSB1c2VyIHNhaWQuICBJbgorICBDLUtlcm1pdCA3LjEgQWxwaGEuMDMgd2UgY2hhbmdlIHRoZSBjb2RlIHRvIHNldCBjbGVhcnJxIHRvIDAgaWYgdGhlIHVzZXIKKyAgZ2l2ZXMgYSBTRVQgUFJFRklYSU5HIG9yIFNFVCBDT05UUk9MIFBSRUZJWCBjb21tYW5kLgorKi8KKworI2lmZGVmIENLX1NQRUVECisgICAgICBjYXNlIFhZUFJFRklYOiB7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgIGV4dGVybiBpbnQgY2xlYXJycTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgaWYgKCh6ID0gY21rZXkocGZ4dGFiLCA0LCAiY29udHJvbC1jaGFyYWN0ZXIgcHJlZml4aW5nIG9wdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgIGNsZWFycnEgPSAwOyAgICAgICAgICAgICAgICAgIC8qIDE5OSAqLworICAgICAgICAgIHNldHByZWZpeCh6KTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgaWYgKGhpbnRzICYmICh6ID09IFBYX0FMTCB8fCB6ID09IFBYX0NBVSkgJiYgY2xlYXJycSkgeworICAgICAgICBwcmludGYoIkhpbnQ6IFVzZSBTRVQgQ0xFQVItQ0hBTk5FTCBPRkYgdG8gZGlzYWJsZSBuZWdvdGlhdGlvbiBvZlxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgU0VUIFBSRUZJWElORyBOT05FIGR1cmluZyBmaWxlIHRyYW5zZmVycyBvbiByZWxpYWJsZVxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgY29ubmVjdGlvbnMuXG4iKTsKKyAgICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICB9CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKworI2lmbmRlZiBOT1NQTAorICAgICAgY2FzZSBYWUxPR0lOOgorICAgICAgICBpZiAoKHogPSBjbWtleShsb2dpbnRhYiwgMywgInZhbHVlIGZvciBsb2dpbiBzY3JpcHQiLCJ1c2VyaWQiLAorICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgIHggPSBjbWRncXVvKCk7CisgICAgICAgIGlmICh6ID09IExPR0lfUFNXKQorICAgICAgICAgIGNtZHNxdW8oMCk7CisgICAgICAgIGlmICgoeSA9IGNtdHh0KCJ0ZXh0IiwiIiwgJnMsIE5VTEwpKSA8IDApIHsKKyAgICAgICAgICAgIGNtZHNxdW8oeCk7CisgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIH0KKyAgICAgICAgY21kc3F1byh4KTsKKyNpZmRlZiBJS1NECisgICAgICAgIGlmIChpbnNlcnZlcikKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgcyA9IGJyc3RyaXAocyk7CisgICAgICAgIGlmICgoaW50KXN0cmxlbihzKSA+IDYzKSB7CisgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCB0b28gbG9uZ1xuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCh6KSB7CisgICAgICAgICAgY2FzZSBMT0dJX1VJRDoKKyAgICAgICAgICAgIGNrc3RybmNweSh1aWRidWYscyxVSURCVUZMRU4pOworICAgICAgICAgICAgc2xfdWlkX3NhdmVkID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgTE9HSV9QU1c6CisgICAgICAgICAgICBja3N0cm5jcHkocHdidWYscyxQV0JVRkwpOworICAgICAgICAgICAgaWYgKHB3YnVmWzBdKSB7CisgICAgICAgICAgICAgICAgcHdmbGcgPSAxOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgIHB3Y3J5cHQgPSAxOworI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgICAgICAgcHdjcnlwdCA9IDA7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIExPR0lfUFJNOgorICAgICAgICAgICAgY2tzdHJuY3B5KHBybWJ1ZixzLFBXQlVGTCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIH0KKworICAgIHN3aXRjaCAoeHgpIHsKKworICAgICAgY2FzZSBYWVNUQVJUVVA6CisgICAgICAgIGlmICgoeSA9IGNta2V5KGlmZHRhYiwyLCIiLCJkaXNjYXJkIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgRGVsZXRlU3RhcnR1cEZpbGUgPSAoeSAhPSAwKSA/IDAgOiAxOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICBjYXNlIFhZVE1QRElSOgorICAgICAgICB4ID0gY21kaXIoIk5hbWUgb2YgdGVtcG9yYXJ5IGRpcmVjdG9yeSIsIiIsJnMseHhzdHJpbmcpOworICAgICAgICBpZiAoeCA9PSAtMykKKyAgICAgICAgICBzID0gIiI7CisgICAgICAgIGVsc2UgaWYgKHggPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIG1ha2VzdHIoJnRlbXBkaXIscyk7CisgICAgICAgIHJldHVybih0ZW1wZGlyID8gMSA6IDApOworCisjaWZuZGVmIE5PWEZFUgorICAgICAgY2FzZSBYWURFU1Q6ICAgICAgICAgICAgICAgICAgICAgIC8qIERFU1RJTkFUSU9OICovCisgICAgICAgIHJldHVybihzZXRkZXN0KCkpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PUFVTSAorI2lmbmRlZiBOT0ZSSUxMUworCisvKiBFZGl0b3IsIEJyb3dzZXIsIGFuZCBGVFAgQ2xpZW50ICovCisKKyAgICAgIGNhc2UgWFlFRElUOiAgICAgICAgICAgICAgICAgICAgICAvKiBFRElUT1IgKi8KKyNpZmRlZiBJS1NECisgICAgICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICAgICAgcHJpbnRmKCI/U29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBDS19BUEMKKyAgICAgICAgLyogRG9uJ3QgbGV0IHRoaXMgYmUgc2V0IHJlbW90ZWx5ICovCisgICAgICAgIGlmIChhcGNhY3RpdmUgPT0gQVBDX0xPQ0FMIHx8CisgICAgICAgICAgICAoYXBjYWN0aXZlID09IEFQQ19SRU1PVEUgJiYgIShhcGNzdGF0dXMgJiBBUENfVU5DSCkpKQorICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogQ0tfQVBDICovCisKKyNpZmRlZiBPUzJPUlVOSVgKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAqcCA9IGdldGVudigiUEFUSCIpOworICAgICAgICAgICAgY2hhciAqZTsKKyAgICAgICAgICAgIGUgPSBlZGl0b3JbMF0gPyAoY2hhciAqKSBlZGl0b3IgOiBnZXRlbnYoIkVESVRPUiIpOworICAgICAgICAgICAgaWYgKCFlKSBlID0gIiI7CisgICAgICAgICAgICBpZiAocCkKKyAgICAgICAgICAgICAgeCA9IGNtaWZpcCgiTmFtZSBvZiBwcmVmZXJyZWQgZWRpdG9yIixlLCZzLCZ5LDAscCx4eHN0cmluZyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHggPSBjbWlmaSgiRnVsbCBwYXRoIG9mIHByZWZlcnJlZCBlZGl0b3IiLGUsJnMsJnkseHhzdHJpbmcpOworICAgICAgICAgICAgaWYgKHggPCAwICYmIHggIT0gLTMpCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgfQorI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAgICAgaWYgKCh5ID0gY210eHQoIkRDTCBjb21tYW5kIGZvciBlZGl0aW5nIiwgImVkaXQiLCAmcywgTlVMTCkpIDwgMCkgeworICAgICAgICAgICAgaWYgKHggIT0gLTMpCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKCh4ID0gY21pZmkoIkZ1bGwgcGF0aCBvZiBwcmVmZXJyZWQgZWRpdG9yIiwiIiwmcywmeSx4eHN0cmluZykpPDApIHsKKyAgICAgICAgICAgIGlmICh4ICE9IC0zKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyNpZmRlZiBWTVMKKyAgICAgICAgY2tzdHJuY3B5KGVkaXRvcixzLENLTUFYUEFUSCk7CisgICAgICAgIGVkaXRvcHRzWzBdID0gTlVMOworI2Vsc2UKKyAgICAgICAgaWYgKHkgIT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCI/QSBzaW5nbGUgZmlsZSBwbGVhc2VcbiIpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgICAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgICAgIGlmICgoeCA9IGNtdHh0KCJlZGl0b3IgY29tbWFuZC1saW5lIG9wdGlvbnMiLCIiLCZzLE5VTEwpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBja3N0cm5jcHkodG1wYnVmLHMsVE1QQlVGU0laKTsKKyAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeik7CisgICAgICAgIGlmIChsaW5lWzBdKSB7CisgICAgICAgICAgICB6Zm5xZnAobGluZSxDS01BWFBBVEgsZWRpdG9yKTsKKyAgICAgICAgICAgIGNrc3RybmNweShlZGl0b3B0cyx0bXBidWYsMTI4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVkaXRvclswXSA9IE5VTDsKKyAgICAgICAgICAgIGVkaXRvcHRzWzBdID0gTlVMOworICAgICAgICB9CisjZW5kaWYgLyogVk1TICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyNpZm5kZWYgTk9GVFAKKyNpZm5kZWYgU1lTRlRQCisjaWZkZWYgVENQU09DS0VUCisgICAgICBjYXNlIFhZRlRQWDoKKyAgICAgICAgcmV0dXJuKGRvc2V0ZnRwKCkpOyAgICAgICAgICAgICAvKiBTRVQgRlRQICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogU1lTRlRQICovCisjZW5kaWYgLyogTk9GVFAgKi8KKworI2lmZGVmIEJST1dTRVIKKyNpZm5kZWYgTk9GVFAKKyNpZmRlZiBTWVNGVFAKKyAgICAgIGNhc2UgWFlGVFA6ICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgRlRQLUNMSUVOVCAqLworI2VuZGlmIC8qIFNZU0ZUUCAqLworI2VuZGlmIC8qIE5PRlRQICovCisgICAgICBjYXNlIFhZQlJPV1NFOiAgICAgICAgICAgICAgICAgICAgLyogU0VUIEJST1dTRVIgKi8KKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAqcCA9IGdldGVudigiUEFUSCIpOworICAgICAgICAgICAgY2hhciAqYXBwID0gKGNoYXIgKikgYnJvd3NlciwgKm9wdHMgPSAoY2hhciAqKSBicm93c29wdHM7CisjaWZuZGVmIE5PRlRQCisjaWZkZWYgU1lTRlRQCisgICAgICAgICAgICBleHRlcm4gY2hhciBmdHBhcHBbXSwgZnRwb3B0c1tdOworICAgICAgICAgICAgaWYgKHh4ID09IFhZRlRQKSB7CisgICAgICAgICAgICAgICAgYXBwID0gKGNoYXIgKilmdHBhcHA7CisgICAgICAgICAgICAgICAgb3B0cyA9IChjaGFyICopZnRwb3B0czsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBTWVNGVFAgKi8KKyNlbmRpZiAvKiBOT0ZUUCAqLworI2lmZGVmIElLU0QKKyAgICAgICAgICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBDS19BUEMKKyAgICAgICAgICAgIC8qIERvbid0IGxldCB0aGlzIGJlIHNldCByZW1vdGVseSAqLworICAgICAgICAgICAgaWYgKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwgfHwKKyAgICAgICAgICAgICAgICAoYXBjYWN0aXZlID09IEFQQ19SRU1PVEUgJiYgIShhcGNzdGF0dXMgJiBBUENfVU5DSCkpKQorICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIENLX0FQQyAqLworI2lmZGVmIE9TMk9SVU5JWAorICAgICAgICAgICAgaWYgKHApCisgICAgICAgICAgICAgIHggPSBjbWlmaXAoeHggPT0gWFlCUk9XU0UgPworICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lIG9mIHByZWZlcnJlZCBicm93c2VyIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWUgb2YgcHJlZmVycmVkIGZ0cCBjbGllbnQiLAorI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICAgIHh4ID09IFhZRlRQID8gImZ0cC5leGUiIDogIiIKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgeHggPT0gWFlGVFAgPyAiZnRwIiA6ICIiCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgLCZzLCZ5LDAscCx4eHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHggPSBjbWlmaSh4eCA9PSBYWUJST1dTRSA/CisgICAgICAgICAgICAgICAgICAgICAgICAiRnVsbCBwYXRoIG9mIHByZWZlcnJlZCBicm93c2VyIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiRnVsbCBwYXRoIG9mIHByZWZlcnJlZCBmdHAgY2xpZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIiLCZzLCZ5LHh4c3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKHggPCAwICYmIHggIT0gLTMpCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyNlbHNlCisjaWZkZWYgVk1TCisgICAgICAgICAgICBpZiAoKHggPSBjbXR4dCgiRENMIGNvbW1hbmQgdG8gc3RhcnQgeW91ciBwcmVmZXJyZWQgV2ViIGJyb3dzZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICZzLCBOVUxMKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHggIT0gLTMpCisgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgaWYgKCh4ID0gY21pZmkoIkZ1bGwgcGF0aCBvZiBwcmVmZXJyZWQgYnJvd3NlciIsIiIsJnMsJnkseHhzdHJpbmcpCisgICAgICAgICAgICAgICAgICkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHggIT0gLTMpCisgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyT1JVTklYICovCisjaWZkZWYgVk1TCisgICAgICAgICAgICBja3N0cm5jcHkoYXBwLHMsQ0tNQVhQQVRIKTsKKyAgICAgICAgICAgICpvcHRzID0gTlVMOworI2Vsc2UKKyAgICAgICAgICAgIGlmICh5ICE9IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9BIHNpbmdsZSBmaWxlIHBsZWFzZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtdHh0KHh4ID09IFhZQlJPV1NFID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJicm93c2VyIGNvbW1hbmQtbGluZSBvcHRpb25zIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnRwIGNsaWVudCBjb21tYW5kLWxpbmUgb3B0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwmcyxOVUxMKQorICAgICAgICAgICAgICAgICApIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgY2tzdHJuY3B5KHRtcGJ1ZixzLFRNUEJVRlNJWik7CisgICAgICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgICAgIGlmIChsaW5lWzBdKSB7CisgICAgICAgICAgICAgICAgemZucWZwKGxpbmUsQ0tNQVhQQVRILGFwcCk7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KG9wdHMsIHRtcGJ1ZiwgMTI4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmFwcCA9IE5VTDsKKyAgICAgICAgICAgICAgICAqb3B0cyA9IE5VTDsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBWTVMgKi8KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBCUk9XU0VSICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworI2lmZGVmIENLX0NUUkxaCisgICAgICBjYXNlIFhZRU9GOiB7ICAgICAgICAgICAgICAgICAgICAgLyogU0VUIEVPRiAqLworICAgICAgICAgIGV4dGVybiBpbnQgZW9mbWV0aG9kOyBleHRlcm4gc3RydWN0IGtleXRhYiBlb2Z0YWJbXTsKKyAgICAgICAgICBpZiAoKHggPSBjbWtleShlb2Z0YWIsMywiZW5kLW9mLWZpbGUgZGV0ZWN0aW9uIG1ldGhvZCIsIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgIGVvZm1ldGhvZCA9IHg7CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBDS19DVFJMWiAqLworCisjaWZkZWYgU0VTTElNSVQKKyAgICAgIGNhc2UgWFlMSU1JVDogeyAgLyogU2Vzc2lvbi1MaW1pdCAobGVuZ3RoIG9mIHNlc3Npb24gaW4gc2Vjb25kcykgKi8KKyAgICAgICAgICBleHRlcm4gaW50IHNlc2xpbWl0OworI2lmZGVmIE9TMgorICAgICAgICAgIGV4dGVybiBpbnQgZG93bmxvYWRlZDsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICB5ID0gY21udW0oIk1heGltdW0gbGVuZ3RoIG9mIHNlc3Npb24sIHNlY29uZHMiLCIwIiwxMCwmeCx4eHN0cmluZyk7CisgICAgICAgICAgaWYgKGluc2VydmVyICYmCisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICAgICAgaWtzZGNmCisjZWxzZQorICAgICAgICAgICAgICAxCisjZW5kaWYgLyogSUtTRENPTkYgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgIHx8IGRvd25sb2FkZWQKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgIGlmICgoeiA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuKHNldG51bSgmc2VzbGltaXQseCx5LDg2NDAwKSk7CisgICAgICB9CisjZW5kaWYgLyogU0VTTElNSVQgKi8KKworICAgICAgY2FzZSBYWVJFTFk6IHsgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBSRUxJQUJMRSAqLworICAgICAgICAgIGlmICgoeCA9IGNta2V5KG9vYXRhYiwzLCIiLCJhdXRvbWF0aWMiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgIHJlbGlhYmxlID0geDsKKyAgICAgICAgICBzZXRyZWxpYWJsZSA9ICh4ICE9IFNFVF9BVVRPKTsKKyAgICAgICAgICBkZWJ1ZyhGMTAxLCJTRVQgUkVMSUFCTEUgcmVsaWFibGUiLCIiLHJlbGlhYmxlKTsKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorCisjaWZkZWYgU1RSRUFNSU5HCisgICAgICBjYXNlIFhZU1RSRUFNOiB7ICAgICAgICAgICAgICAgICAgLyogU0VUIFNUUkVBTUlORyAqLworICAgICAgICAgIGV4dGVybiBpbnQgc3RyZWFtcnE7CisgICAgICAgICAgaWYgKCh4ID0gY21rZXkob29hdGFiLDMsIiIsImF1dG9tYXRpYyIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgICAgc3RyZWFtcnEgPSB4OworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICB9CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisKKyNpZmRlZiBDS1NZU0xPRworICAgICAgY2FzZSBYWVNZU0w6IHsKKyAgICAgICAgICBpZiAoKHggPSBjbWtleShzeXNsb2d0YWIsbnN5c2xvZywiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyNpZmRlZiBJS1NECisgICAgICAgICAgaWYgKGluc2VydmVyICYmCisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICAgICAgaWtzZGNmCisjZWxzZQorICAgICAgICAgICAgICAxCisjZW5kaWYgLyogSUtTRENPTkYgKi8KKyAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxuIik7CisgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBDS19BUEMKKyAgICAgICAgICAvKiBEb24ndCBsZXQgdGhpcyBiZSBzZXQgcmVtb3RlbHkgKi8KKyAgICAgICAgICBpZiAoYXBjYWN0aXZlID09IEFQQ19MT0NBTCB8fAorICAgICAgICAgICAgICAoYXBjYWN0aXZlID09IEFQQ19SRU1PVEUgJiYgIShhcGNzdGF0dXMgJiBBUENfVU5DSCkpKQorICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKyAgICAgICAgICBja3hzeXNsb2cgPSB4OworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKworI2lmZGVmIFRMT0cKKyAgICAgIGNhc2UgWFlUTE9HOiB7ICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVFJBTlNBQ1RJT04tTE9HICovCisgICAgICAgICAgZXh0ZXJuIGludCB0bG9nc2VwOworICAgICAgICAgIGlmICgoeCA9IGNta2V5KHZidGFiLG52YiwiIiwidmVyYm9zZSIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgaWYgKHggPT0gMCkgeworICAgICAgICAgICAgICBpZiAoKHkgPSBjbXR4dCgiZmllbGQgc2VwYXJhdG9yIiwiLCIsJnMsTlVMTCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgICBzID0gYnJzdHJpcChzKTsKKyAgICAgICAgICAgICAgaWYgKCpzKSB7CisgICAgICAgICAgICAgICAgICBpZiAoc1sxXSkgeworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0Egc2luZ2xlIGNoYXJhY3RlciwgcGxlYXNlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCpzID49ICcwJyAmJiAqcyA8PSAnOScpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcyA+PSAnQScgJiYgKnMgPD0gJ1onKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnMgPj0gJ2EnICYmICpzIDw9ICd6JykpIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9BIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyLCBwbGVhc2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRsb2dzZXAgPSAqczsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgIH0KKyNpZmRlZiBJS1NECisgICAgICAgICAgaWYgKGluc2VydmVyICYmIGlzZ3Vlc3QpIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCI/U29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgICB9CisjZW5kaWYgLyogSUtTRCAqLworI2lmZGVmIENLX0FQQworICAgICAgICAgIC8qIERvbid0IGxldCB0aGlzIGJlIHNldCByZW1vdGVseSAqLworICAgICAgICAgIGlmIChhcGNhY3RpdmUgPT0gQVBDX0xPQ0FMIHx8CisgICAgICAgICAgICAgIChhcGNhY3RpdmUgPT0gQVBDX1JFTU9URSAmJiAhKGFwY3N0YXR1cyAmIEFQQ19VTkNIKSkpCisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIENLX0FQQyAqLworICAgICAgICAgIHRsb2dmbXQgPSB4OworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICB9CisjZW5kaWYgLyogVExPRyAqLworCisgICAgICBjYXNlIFhZQ0xFQVI6IHsgICAgICAgICAgICAgICAgICAgLyogU0VUIENMRUFSQ0hBTk5FTCAqLworICAgICAgICAgIGlmICgoeCA9IGNta2V5KG9vYXRhYiwzLCIiLCJhdXRvbWF0aWMiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgIGNsZWFycnEgPSB4OworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICB9CisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgICAgY2FzZSBYWUFVVEg6IHsgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBBVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX0tFUkJFUk9TCisgICAgICAgICAgaW50IGt2ID0gMDsKKyAgICAgICAgICBleHRlcm4gc3RydWN0IGtyYl9vcF9kYXRhIGtyYl9vcDsKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworICAgICAgICAgIGNoYXIgKiBwID0gTlVMTDsKKyAgICAgICAgICBpZiAoKHggPQorICAgICAgICAgICAgICAgY21rZXkoc2V0YXV0aCxuc2V0YXV0aCwiYXV0aGVudGljYXRpb24gdHlwZSIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgc3dpdGNoICh4KSB7CisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAgICAgICAgIGNhc2UgQVVUSF9LUkI0OiBrdiA9IDQ7IGJyZWFrOyAvKiBEb24ndCBhc3N1bWUgdmFsdWVzIGFyZSBzYW1lICovCisgICAgICAgICAgICBjYXNlIEFVVEhfS1JCNToga3YgPSA1OyBicmVhazsKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2lmZGVmIENLX1NSUAorICAgICAgICAgICAgY2FzZSBBVVRIX1NSUDogYnJlYWs7CisjZW5kaWYgLyogQ0tfU1JQICovCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICBjYXNlIEFVVEhfU1NMOgorICAgICAgICAgICAgY2FzZSBBVVRIX1RMUzoKKyAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBwcmludGYoIj9BdXRob3JpemF0aW9uIHR5cGUgbm90IHN1cHBvcnRlZCB5ZXQgLSBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICBhdG1idWYpOworICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgIH0KKyNpZmRlZiBJS1NECisgICAgICAgICAgaWYgKGluc2VydmVyICYmCisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICAgICAgaWtzZGNmCisjZWxzZQorICAgICAgICAgICAgICAxCisjZW5kaWYgLyogSUtTRENPTkYgKi8KKyAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgY29tbWFuZCBkaXNhYmxlZC5cbiIpOworICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisjaWZkZWYgQ0tfQVBDCisgICAgICAgICAgLyogRG9uJ3QgbGV0IHRoaXMgYmUgc2V0IHJlbW90ZWx5ICovCisgICAgICAgICAgaWYgKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwgfHwKKyAgICAgICAgICAgICAgYXBjYWN0aXZlID09IEFQQ19SRU1PVEUgJiYgIShhcGNzdGF0dXMgJiBBUENfVU5DSCkpIHsKKyAgICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIENLX0FQQyAqLworCisgICAgICAgICAgc3dpdGNoKHgpIHsKKyNpZmRlZiBDS19LRVJCRVJPUworICAgICAgICAgICAgY2FzZSBBVVRIX0tSQjQ6CisgICAgICAgICAgICBjYXNlIEFVVEhfS1JCNTogeworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KGt2ID09IDQgPyBrNHRhYiA6IGs1dGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt2ID09IDQgPyBuazR0YWIgOiBuazV0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktlcmJlcm9zIHBhcmFtZXRlciIsIiIseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzID0gIiI7CisgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisjaWZkZWYgS1JCNAorICAgICAgICAgICAgICAgICAgY2FzZSBYWUtSQkRCRzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGt2ID09IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IHNldG9uKCZrNGRlYnVnKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisjaWZkZWYgTlQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrX2tyYjRfZGVidWcoazRkZWJ1Zyk7CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogS1JCNCAqLworICAgICAgICAgICAgICAgICAgY2FzZSBYWUtSQkxJRjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21udW0oIlRHVCBsaWZldGltZSIsIjYwMCIsMTAsJnoseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlLUkJQUkU6CisgICAgICAgICAgICAgICAgICAgIGlmIChrdiA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBzZXRvbigma3JiNF9kX3ByZWF1dGgpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFhZS1JCSU5TOgorICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbXR4dCgiSW5zdGFuY2UgbmFtZSIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlLUkJGV0Q6CisgICAgICAgICAgICAgICAgICAgIGlmIChrdiA9PSA1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBzZXRvbigma3JiNV9kX2ZvcndhcmRhYmxlKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBYWUtSQlBSWDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGt2ID09IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IHNldG9uKCZrcmI1X2RfcHJveGlhYmxlKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBYWUtSQlJOVzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21udW0oIlRHVCByZW5ld2FibGUgbGlmZXRpbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMCIsMTAsJnoseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlLUkJBRFI6CisgICAgICAgICAgICAgICAgICAgIGlmIChrdiA9PSA1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBzZXRvbigma3JiNV9jaGVja2FkZHJzKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBzZXRvbigma3JiNF9jaGVja2FkZHJzKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFhZS1JCTkFEOgorICAgICAgICAgICAgICAgICAgICBpZiAoa3YgPT0gNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gc2V0b24oJmtyYjVfZF9ub19hZGRyZXNzZXMpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlLUkJBREQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChrdiA9PSA1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogdG1wYWRkcnNbS1JCNV9OVU1fT0ZfQUREUlNdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEtSQjVfTlVNX09GX0FERFJTOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGFkZHJzW2ldID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21mbGQoIkxpc3Qgb2YgSVAgYWRkcmVzc2VzIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWFrZWxpc3Qocyx0bXBhZGRycyxLUkI1X05VTV9PRl9BRERSUyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgS1JCNV9OVU1fT0ZfQUREUlM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wYWRkcnNbaV0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHRtcGFkZHJzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA8IEtSQjVfTlVNX09GX0FERFJTICYmIHRtcGFkZHJzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5ldF9hZGRyKHRtcGFkZHJzW2ldKSA9PSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW52YWxpZCBpcCBhZGRyZXNzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGFkZHJzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEtSQjVfTlVNX09GX0FERFJTOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXBhZGRyc1tpXSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHRtcGFkZHJzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPCBLUkI1X05VTV9PRl9BRERSUyAmJiBrcmI1X2RfYWRkcnNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrcmI1X2RfYWRkcnNbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGtyYjVfZF9hZGRyc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9kX2FkZHJzW2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPCBLUkI1X05VTV9PRl9BRERSUyAmJiB0bXBhZGRyc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9kX2FkZHJzW2ldID0gdG1wYWRkcnNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wYWRkcnNbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9kX2FkZHJzW2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlLUkJHRVQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChrdiA9PSA1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBzZXRvbigma3JiNV9hdXRvZ2V0KSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBzZXRvbigma3JiNF9hdXRvZ2V0KSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFhZS1JCREVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoKHogPSBjbWtleShrZGVzdGFiLG5rZGVzdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXV0byBEZXN0cm95IFRpY2tldHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV2ZXIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFhZS1JCUFI6CisgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtdHh0KCJVc2VyIElEIix1aWRidWYsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlLUkJSTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gY210eHQoIk5hbWUgb2YgcmVhbG0iLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFhZS1JCS1RCOgorICAgICAgICAgICAgICAgICAgICB5ID0gY21pZmkoIkZpbGVuYW1lIiwiIiwmcywmeix4eHN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh5ICE9IC0zKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGlmICh5IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgICAgIGlmICh6KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/V2lsZGNhcmRzIG5vdCBhbGxvd2VkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFhZS1JCQ0M6CisgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtb2ZpKCJGaWxlbmFtZSIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlLUkJTUlY6CisgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtdHh0KCJOYW1lIG9mIHNlcnZpY2UgdG8gdXNlIGluIHRpY2tldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrdiA9PSA0ID8gInJjbWQiIDogImhvc3QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBYWUtSQks1SzQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChrdiA9PSA1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBzZXRvbigma3JiNV9kX2dldGs0KSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBYWUtSQlBSTTogICAgICAgIC8qIFByb21wdCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKHogPSBjbWtleShrcmJwcm10YWIsMiwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtdHh0KCh6ID09IEtSQl9QV19QUk0pID8KKyAgIlRleHQgb2YgcHJvbXB0O1xubWF5IGNvbnRhaW4gXCIlc1wiIHRvIGJlIHJlcGxhY2VkIGJ5IHByaW5jaXBhbCBuYW1lIiA6CisgICJUZXh0IG9mIHByb21wdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKyAgICAgICAgICAgICAgICBzID0gbGluZTsKKyAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisjaWZkZWYgSUtTRAorICAgICAgICAgICAgICAgIGlmIChpbnNlcnZlciAmJgorI2lmZGVmIElLU0RDT05GCisgICAgICAgICAgICAgICAgICAgIGlrc2RjZgorI2Vsc2UgLyogSUtTRENPTkYgKi8KKyAgICAgICAgICAgICAgICAgICAgMQorI2VuZGlmIC8qIElLU0RDT05GICovCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7ICAgICAgICAgICAgLyogQ29weSB2YWx1ZSB0byByaWdodCBwbGFjZSAqLworICAgICAgICAgICAgICAgICAgY2FzZSBYWUtSQkxJRjogICAgICAgIC8qIExpZmV0aW1lICovCisgICAgICAgICAgICAgICAgICAgIGlmIChrdiA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgIGtyYjRfZF9saWZldGltZSA9IHo7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBrcmI1X2RfbGlmZXRpbWUgPSB6OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlLUkJSTlc6CisgICAgICAgICAgICAgICAgICAgIGlmIChrdiA9PSA1KQorICAgICAgICAgICAgICAgICAgICAgIGtyYjVfZF9yZW5ld2FibGUgPSB6OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlLUkJQUjogICAgICAgICAvKiBQcmluY2lwYWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcyA9IGJyc3RyaXAocyk7CS8qIFN0cmlwIGJyYWNlcyBhcm91bmQuICovCisgICAgICAgICAgICAgICAgICAgIGlmIChrdiA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmtyYjRfZF9wcmluY2lwYWwscyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZrcmI1X2RfcHJpbmNpcGFsLHMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlLUkJJTlM6ICAgICAgICAvKiBJbnN0YW5jZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoa3YgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZrcmI0X2RfaW5zdGFuY2Uscyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZrcmI1X2RfaW5zdGFuY2Uscyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBYWUtSQlJMOiAgICAgICAgIC8qIFJlYWxtICovCisgICAgICAgICAgICAgICAgICAgIGlmIChrdiA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmtyYjRfZF9yZWFsbSxzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmtyYjVfZF9yZWFsbSxzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFhZS1JCS1RCOiAgICAgICAgLyogS2V5IFRhYmxlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChrdiA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJms0X2tleXRhYixzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJms1X2tleXRhYixzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFhZS1JCQ0M6ICAgICAgICAgLyogQ3JlZGVudGlhbHMgY2FjaGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigma3JiNV9kX2NjLHMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlLUkJTUlY6ICAgICAgICAvKiBTZXJ2aWNlIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGt2ID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigma3JiNF9kX3NydixzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmtyYjVfZF9zcnYscyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBYWUtSQkRFTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGt2ID09IDUpCisgICAgICAgICAgICAgICAgICAgICAga3JiNV9hdXRvZGVsID0gejsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGtyYjRfYXV0b2RlbCA9IHo7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBYWUtSQlBSTTogICAgICAgIC8qIFByb21wdCAqLworICAgICAgICAgICAgICAgICAgICBpZiAocyA9PSAiIikgcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGlmIChzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gYnJzdHJpcChzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09ICIiKSBzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHopIHsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtSQl9QV19QUk06IHsgLyogUGFzc3dvcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHR3byAlIGZpZWxkcyBhbmQgJSBtdXN0IGZvbGxvd2VkIGJ5ICdzJy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksbixsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbiA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNbaV0gPT0gJyUnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNbaSsxXSAhPSAnJScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNbaSsxXSAhPSAncycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25seSAlJXMgZmllbGRzIGFyZSBwZXJtaXR0ZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrbiA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgdHdvICUlcyBmaWVsZHMgYXJlIHBlcm1pdHRlZC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGt2ID09IDUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmazVwd3Byb21wdCxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJms0cHdwcm9tcHQscyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtSQl9QUl9QUk06IHsgLyogUHJpbmNpcGFsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gJSBmaWVsZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNbaV0gPT0gJyUnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNbaSsxXSAhPSAnJScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlJSBmaWVsZHMgYXJlIG5vdCB1c2VkIGluIHRoaXMgY29tbWFuZC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGt2ID09IDUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmazVwcnByb21wdCxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJms0cHJwcm9tcHQscyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2lmZGVmIENLX1NSUAorICAgICAgICAgICAgY2FzZSBBVVRIX1NSUDogeworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KHNycHRhYiwgbnNycHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1JQIHBhcmFtZXRlciIsIiIseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzID0gIiI7CisgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFhZU1JQUFJNOiAgICAgICAgLyogUHJvbXB0ICovCisgICAgICAgICAgICAgICAgICAgIGlmICgoeiA9IGNta2V5KHNycHBybXRhYiwxLCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gY210eHQoCisgICJUZXh0IG9mIHByb21wdDtcbm1heSBjb250YWluIG9uZSBcIiVzXCIgdG8gYmUgcmVwbGFjZWQgYnkgdGhlIHVzZXJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICAgICAgICAgIHMgPSBsaW5lOworICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHgpIHsgICAgICAgICAgICAvKiBDb3B5IHZhbHVlIHRvIHJpZ2h0IHBsYWNlICovCisgICAgICAgICAgICAgICAgICBjYXNlIFhZU1JQUFJNOiAgICAgICAgLyogUHJvbXB0ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzID09ICIiKSBzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBicnN0cmlwKHMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT0gIiIpIHMgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoeikgeworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1JQX1BXX1BSTTogeyAvKiBQYXNzd29yZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayAlcyBmaWVsZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksbixsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbiA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNbaV0gPT0gJyUnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNbaSsxXSAhPSAnJScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNbaSsxXSAhPSAncycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmx5ICUlcyBmaWVsZHMgYXJlIHBlcm1pdHRlZC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytuID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgb25lICUlcyBmaWVsZCBpcyBwZXJtaXR0ZWQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNycHB3cHJvbXB0LHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1JQICovCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICBjYXNlIEFVVEhfU1NMOgorICAgICAgICAgICAgY2FzZSBBVVRIX1RMUzogeworICAgICAgICAgICAgICAgIGlmICgoeiA9IGNta2V5KHNzbHRhYiwgbnNzbHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh4ID09IEFVVEhfU1NMID8gIlNTTCBwYXJhbWV0ZXIiIDogIlRMUyBwYXJhbWV0ZXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICAgICAgICAgIHMgPSAiIjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHopIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlTU0xSQ0ZMOiAgICAgICAvKiBTU0wvVExTIFJTQSBDZXJ0cyBmaWxlICovCisgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMUkNDRjogICAgICAgLyogU1NML1RMUyBSU0EgQ2VydHMgQ2hhaW4gZmlsZSAqLworICAgICAgICAgICAgICAgICAgY2FzZSBYWVNTTFJLRkw6ICAgICAgIC8qIFNTTC9UTFMgUlNBIEtleSBGaWxlICovCisgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMRENGTDogICAgICAgLyogU1NML1RMUyBEU0EgQ2VydHMgZmlsZSAqLworICAgICAgICAgICAgICAgICAgY2FzZSBYWVNTTERDQ0Y6ICAgICAgIC8qIFNTTC9UTFMgRFNBIENlcnRzIENoYWluIGZpbGUgKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlTU0xES0ZMOiAgICAgICAvKiBTU0wvVExTIERIIEtleSBGaWxlICovCisgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMRFBGTDogICAgICAgLyogU1NML1RMUyBESCBQYXJhbSBGaWxlICovCisgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMQ1JMOiAgICAgICAgLyogU1NML1RMUyBDUkwgRmlsZSAqLworICAgICAgICAgICAgICAgICAgY2FzZSBYWVNTTFZSRkY6ICAgICAgIC8qIFNTTC9UTFMgVmVyaWZ5IEZpbGUgKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlTU0xSTkQ6ICAgICAgICAvKiBTU0wvVExTIFJhbmRvbSBGaWxlICovCisgICAgICAgICAgICAgICAgICAgIHkgPSBjbWlmaSgiRmlsZW5hbWUiLCIiLCZzLCZ4LHh4c3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHkgIT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9XaWxkY2FyZHMgbm90IGFsbG93ZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICAgICAgICAgICAgICBzID0gbGluZTsKKyAgICAgICAgICAgICAgICAgICAgcyA9IGJyc3RyaXAocyk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoeikgeworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWFlTU0xSQ0ZMOiAgIC8qIFNTTC9UTFMgUlNBIENlcnRzIGZpbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc1swXSAmJiBzc2xfcnNhX2NlcnRfZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoc3NsX3JzYV9jZXJ0X2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9yc2FfY2VydF9maWxlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc1swXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzbF9yc2FfY2VydF9maWxlLHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3NsX3JzYV9rZXlfZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzbF9yc2Ffa2V5X2ZpbGUscyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMUkNDRjogICAvKiBTU0wvVExTIFJTQSBDZXJ0cyBDaGFpbiBmaWxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc1swXSAmJiBzc2xfcnNhX2NlcnRfY2hhaW5fZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShzc2xfcnNhX2NlcnRfY2hhaW5fZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfcnNhX2NlcnRfY2hhaW5fZmlsZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc1swXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NsX3JzYV9jZXJ0X2NoYWluX2ZpbGUscyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYWVNTTFJLRkw6ICAgLyogU1NML1RMUyBSU0EgS2V5IEZpbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc1swXSAmJiBzc2xfcnNhX2tleV9maWxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShzc2xfcnNhX2tleV9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfcnNhX2tleV9maWxlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc1swXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzbF9yc2Ffa2V5X2ZpbGUscyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMRENGTDogICAvKiBTU0wvVExTIERTQSBDZXJ0cyBmaWxlICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNbMF0gJiYgc3NsX2RzYV9jZXJ0X2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHNzbF9kc2FfY2VydF9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfZHNhX2NlcnRfZmlsZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2xfZHNhX2NlcnRfZmlsZSxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNzbF9kaF9rZXlfZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzbF9kaF9rZXlfZmlsZSxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWFlTU0xEQ0NGOiAgIC8qIFNTTC9UTFMgRFNBIENlcnRzIENoYWluIGZpbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzWzBdICYmIHNzbF9kc2FfY2VydF9jaGFpbl9maWxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHNzbF9kc2FfY2VydF9jaGFpbl9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9kc2FfY2VydF9jaGFpbl9maWxlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzWzBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2xfZHNhX2NlcnRfY2hhaW5fZmlsZSxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMREtGTDogICAvKiBTU0wvVExTIERIIEtleSBGaWxlICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNbMF0gJiYgc3NsX2RoX2tleV9maWxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShzc2xfZGhfa2V5X2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9kaF9rZXlfZmlsZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2xfZGhfa2V5X2ZpbGUscyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMRFBGTDogICAvKiBTU0wvVExTIERIIFBhcmFtIEZpbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc1swXSAmJiBzc2xfZGhfcGFyYW1fZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoc3NsX2RoX3BhcmFtX2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9kaF9wYXJhbV9maWxlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc1swXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzbF9kaF9wYXJhbV9maWxlLHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYWVNTTENSTDogICAgLyogU1NML1RMUyBDUkwgRmlsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzWzBdICYmIHNzbF9jcmxfZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoc3NsX2NybF9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfY3JsX2ZpbGUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzWzBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NsX2NybF9maWxlLHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYWVNTTFZSRkY6ICAgLyogU1NML1RMUyBWZXJpZnkgRmlsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzWzBdICYmIHNzbF92ZXJpZnlfZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoc3NsX3ZlcmlmeV9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyaWZ5X2ZpbGUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzWzBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NsX3ZlcmlmeV9maWxlLHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYWVNTTFJORDogICAgLyogU1NML1RMUyBSYW5kb20gRmlsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzWzBdICYmIHNzbF9ybmRfZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoc3NsX3JuZF9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfcm5kX2ZpbGUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzWzBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NsX3JuZF9maWxlLHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlTU0xDUkxEOgorICAgICAgICAgICAgICAgICAgY2FzZSBYWVNTTFZSRkQ6IHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqIGQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBpZiAoeiA9PSBYWVNTTFZSRkQpCisgICAgICAgICAgICAgICAgICAgICAgZD0gZ2V0ZW52KCJTU0xfQ0VSVF9ESVIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21kaXIoIkRpcmVjdG9yeSIsZCwmcyx4eHN0cmluZykpIDwgMCkKKwkJICAgICAgaWYgKHkgIT0gLTMpCisJCQlyZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKyAgICAgICAgICAgICAgICAgICAgcyA9IGxpbmU7CisgICAgICAgICAgICAgICAgICAgIHMgPSBicnN0cmlwKHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goeikgeworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWFlTU0xDUkxEOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzWzBdICYmIHNzbF9jcmxfZGlyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShzc2xfY3JsX2Rpcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX2NybF9kaXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzWzBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NsX2NybF9kaXIscyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMVlJGRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc1swXSAmJiBzc2xfdmVyaWZ5X2RpcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoc3NsX3ZlcmlmeV9kaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJpZnlfZGlyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc1swXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzbF92ZXJpZnlfZGlyLHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMQ09LOiAgICAgICAgLyogU1NML1RMUyBDZXJ0cy1PayBmbGFnICovCisgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IHNldG9uKCZzc2xfY2VydHNva19mbGFnKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMREJHOiAgICAgICAgICAgICAgICAvKiBTU0wvVExTIERlYnVnIGZsYWcgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gc2V0b24oJnNzbF9kZWJ1Z19mbGFnKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMT046ICAgICAgICAgLyogU1NML1RMUyBPbmx5IGZsYWcgKi8KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIX1NTTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IHNldG9uKCZzc2xfb25seV9mbGFnKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVVEhfVExTOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gc2V0b24oJnRsc19vbmx5X2ZsYWcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBYWVNTTFZSQjogICAgICAgIC8qIFNTTC9UTFMgVmVyYm9zZSBmbGFnICovCisgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IHNldG9uKCZzc2xfdmVyYm9zZV9mbGFnKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFhZU1NMVlJGOiAgICAgICAgLyogU1NML1RMUyBWZXJpZnkgZmxhZyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKHggPSBjbWtleShzc2x2ZXJ0YWIsIG5zc2x2ZXJ0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTU0wvVExTIHZlcmlmeSBtb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlZXItY2VydCIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICBzc2xfdmVyaWZ5X2ZsYWcgPSB4OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgWFlTU0xEVU06CisgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IHNldG9uKCZzc2xfZHVtbXlfZmxhZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBYWVNTTENMOiB7ICAgICAgICAgICAgICAgLyogU1NML1RMUyBDaXBoZXIgTGlzdCAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGNvZGUgaXMgdXNlZCB0byBnZW5lcmF0ZSBhIGNvbG9uIGRlbGltaXRlZCAqLworICAgICAgICAgICAgICAgICAgICAgIC8qIGxpc3Qgb2YgdGhlIGNpcGhlcnMgY3VycmVudGx5IGluIHVzZSB0byBiZSB1c2VkICovCisgICAgICAgICAgICAgICAgICAgICAgLyogYXMgdGhlIGRlZmF1bHQgZm9yIGNtdHh0KCkuICBIb3dldmVyLCBhIGJldHRlciAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IGlzIHNpbXBseSB0aGUgbWFnaWMga2V5d29yZCAiQUxMIi4gICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIENIQVIgZGVmWzEwMjRdID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHNzbF9jb24gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSICogcCA9IE5VTEwsICpxID0gZGVmOworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgbGVuOworCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gKENIQVIgKikgU1NMX2dldF9jaXBoZXJfbGlzdChzc2xfY29uLGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4ocCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocStsZW4rMSA+PSBkZWYrMTAyNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gJzonOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHEscCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxICs9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHAgPSBnZXRlbnYoIlNTTF9DSVBIRVIiKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIXApCisgICAgICAgICAgICAgICAgICAgICAgICBwID0gIkFMTCI7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gY210eHQoCisgICAgICAgICAgICAgICAgICAgICJDb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBjaXBoZXJzIG9yIEFMTCAoY2FzZS1zZW5zaXRpdmUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NsX2NpcGhlcl9saXN0LHMpOworICAgICAgICAgICAgICAgICAgICAgIGlmIChzc2xfY29uID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX2xpYnJhcnlfaW5pdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfY3R4ID0gKFNTTF9DVFggKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ1RYX25ldygoU1NMX01FVEhPRCAqKVRMU3YxX21ldGhvZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNzbF9jdHggIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfY29uPSAoU1NMICopIFNTTF9uZXcoc3NsX2N0eCk7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGlmIChzc2xfY29uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9zZXRfY2lwaGVyX2xpc3Qoc3NsX2Nvbixzc2xfY2lwaGVyX2xpc3QpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworCisjaWZuZGVmIE5PU1BMCisgICAgICBjYXNlIFhZRlVOQzoKKyAgICAgICAgaWYgKCh4ID0gY21rZXkoZnVuY3RhYixuZnVuY3RhYiwiIiwiZGlhZ25vc3RpY3MiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgY2FzZSBGVU5DX0RJOiByZXR1cm4oc2V0b24oJmZuZGlhZ3MpKTsKKyAgICAgICAgICBjYXNlIEZVTkNfRVI6IHJldHVybihzZXRvbigmZm5lcnJvcikpOworICAgICAgICAgIGRlZmF1bHQ6ICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICAgIGNhc2UgWFlTTEVFUDogICAgICAgICAgICAgICAgICAgICAvKiBTRVQgU0xFRVAgLyBQQVVTRSAqLworICAgICAgICBpZiAoKHggPSBjbWtleShzbGVlcHRhYiwxLCIiLCJjYW5jZWxsYXRpb24iLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgcmV0dXJuKHNldG9uKCZzbGVlcGNhbikpOworCisgICAgICBjYXNlIFhZQ0Q6ICAgICAgICAgICAgICAgICAgICAgICAgLyogU0VUIENEICovCisgICAgICAgIGlmICgoeCA9IGNta2V5KGNkdGFiLG5jZHRhYiwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIHN3aXRjaCAoeCkgeworCSAgY2FzZSBYWUNEX0g6IHsJCS8qIFNFVCBDRCBIT01FICovCisJICAgICAgZXh0ZXJuIGNoYXIgKiBteWhvbWU7CisJICAgICAgaWYgKCh5ID0gY21kaXIoIkRpcmVjdG9yeSBuYW1lIix6aG9tZSgpLCZzLHh4c3RyaW5nKSkgPCAwKQorCQlyZXR1cm4oeSk7CisJICAgICAgbWFrZXN0cigmbXlob21lLHMpOworCSAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisJICB9CisgICAgICAgICAgY2FzZSBYWUNEX006ICAgICAgICAgICAgICAgICAgLyogU0VUIENEIE1FU1NBR0UgKi8KKyAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KGNkbXNnLG5jZG1zZywiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKHggPT0gMikgeyAgICAgICAgICAgICAgIC8qIENEIE1FU1NBR0UgRklMRSAqLworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtdHh0KCJOYW1lIG9mIGZpbGUiLCIiLCZzLE5VTEwpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgICAgaWYgKCEqcykgeworICAgICAgICAgICAgICAgICAgICBzID0gTlVMTDsKKyNpZm5kZWYgTk9YRkVSCisgICAgICAgICAgICAgICAgICAgIHNydmNkbXNnID0gMDsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWFrZXN0cigmY2Rtc2dzdHIscyk7CisgICAgICAgICAgICAgICAgbWFrZWxpc3QoY2Rtc2dzdHIsY2Rtc2dmaWxlLDgpOworICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOyAvKiBDRC1NRVNTQUdFIE9OL09GRiAqLworI2lmbmRlZiBOT1hGRVIKKyAgICAgICAgICAgIGlmICh4ID4gMCkKKyAgICAgICAgICAgICAgc3J2Y2Rtc2cgfD0gMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgc3J2Y2Rtc2cgJj0gMTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgICAgICBjYXNlIFhZQ0RfUDogeyAgICAgICAgICAgICAgICAvKiBTRVQgQ0QgUEFUSCAqLworICAgICAgICAgICAgICBleHRlcm4gY2hhciAqIGNrY2RwYXRoOworICAgICAgICAgICAgICBpZiAoKHggPSBjbXR4dCgiQ0QgUEFUSCBzdHJpbmciLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgbWFrZXN0cigmY2tjZHBhdGgscyk7CisgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIFNUT1BCSVRTCisgICAgICBjYXNlIFhZU1RPUDogICAgICAgICAgICAgICAgICAgICAgLyogU1RPUC1CSVRTICovCisgICAgICAgIGlmICgoeCA9IGNta2V5KHN0b3B0YmwsMiwiU3RvcCBiaXRzIGZvciBzZXJpYWwgZGV2aWNlIiwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoeCA+IDAgJiYgeCA8IDMpIHsKKyAgICAgICAgICAgIHN0b3BiaXRzID0geDsKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgICAgICAgICBpZiAobmV0d29yayAmJiBpc3RuY29tcG9ydCgpKSB7CisgICAgICAgICAgICAgICAgdG5zZXR0aW5ncygtMSwgeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisjaWZkZWYgSFdQQVJJVFkKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZWxzZSAvKiBIV1BBUklUWSAqLworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyNlbmRpZiAvKiBIV1BBUklUWSAqLworICAgICAgICB9IGVsc2UKKyAgICAgICAgICByZXR1cm4oLTIpOworI2VuZGlmIC8qIFNUT1BCSVRTICovCisKKyAgICAgIGNhc2UgWFlESVNDOiB7CisgICAgICAgICAgZXh0ZXJuIGludCBjbHNvbmRpc2M7CisgICAgICAgICAgcmV0dXJuKHNldG9uKCZjbHNvbmRpc2MpKTsKKyAgICAgIH0KKworICAgICAgY2FzZSBYWVNFUklBTDogeworICAgICAgICAgIC8qIGNoYXIgYzsgKi8KKyAgICAgICAgICBleHRlcm4gaW50IGNtYXNrOworICAgICAgICAgIGlmICgoeCA9IGNta2V5KHNlcnRibCxuc2VydGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJpYWwgZGV2aWNlIGNoYXJhY3RlciBzaXplLCBwYXJpdHksIGFuZCBzdG9wIGJpdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICI4TjEiLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICBja3N0cm5jcHkobGluZSxhdG1idWYsTElOQlVGU0laKTsgLyogQXNzb2NpYXRlZCBrZXl3b3JkIHN0cmluZyAqLworICAgICAgICAgIHMgPSBsaW5lOworICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICBja3N0cm5jcHkobGluZSxzZXJuYW1beF0sTElOQlVGU0laKTsKKyAgICAgICAgICBzID0gbGluZTsKKyAgICAgICAgICBpZiAoc1swXSAhPSAnOCcgJiYgc1swXSAhPSAnNycpIC8qIENoYXIgc2l6ZSAqLworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB6ID0gc1swXSAtICcwJzsKKyAgICAgICAgICBpZiAoaXN1cHBlcihzWzFdKSkgICAgICAgICAgICAvKiBQYXJpdHkgKi8KKyAgICAgICAgICAgIHNbMV0gPSB0b2xvd2VyKHNbMV0pOworICAgICAgICAgIGlmIChzWzJdICE9ICcxJyAmJiBzWzJdICE9ICcyJykgLyogU3RvcCBiaXRzICovCisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0b3BiaXRzID0gc1syXSAtICcwJzsKKyAgICAgICAgICBpZiAoeiA9PSA4KSB7ICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgKyBwYXJpdHkgKG9yIG5vdCkgKi8KKyAgICAgICAgICAgICAgcGFyaXR5ID0gMDsgICAgICAgICAgICAgICAvKiBTZXQgcGFyaXR5ICovCisgICAgICAgICAgICAgIGh3cGFyaXR5ID0gKHNbMV0gPT0gJ24nKSA/IDAgOiBzWzFdOworICAgICAgICAgICAgICBzZXRjbWFzayg4KTsgICAgICAgICAgICAgIC8qIEFsc28gc2V0IFRFUk0gQllURVNJWkUgdG8gOCAqLworICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIDcgYml0cyBwbHVzIHBhcml0eSAqLworICAgICAgICAgICAgICBwYXJpdHkgPSAoc1sxXSA9PSAnbicpID8gMCA6IHNbMV07CisgICAgICAgICAgICAgIGh3cGFyaXR5ID0gMDsKKyAgICAgICAgICAgICAgc2V0Y21hc2soNyk7ICAgICAgICAgICAgICAvKiBBbHNvIHNldCBURVJNIEJZVEVTSVpFIHRvIDcgKi8KKyAgICAgICAgICB9CisjaWZkZWYgVE5fQ09NUE9SVAorICAgICAgICAgIGlmIChuZXR3b3JrICYmICFpc3RuY29tcG9ydCgpKQorICAgICAgICAgICAgdG5zZXR0aW5ncyhwYXJpdHksIHN0b3BiaXRzKTsKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOyAgICAgICAgICAvKiBmcm9tIFNFVCBTRVJJQUwgKi8KKyAgICAgIH0KKworICAgICAgY2FzZSBYWU9QVFM6IHsgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBPUFRJT05TICovCisgICAgICAgICAgZXh0ZXJuIGludCBzZXRkaXJvcHRzKCk7CisgICAgICAgICAgZXh0ZXJuIGludCBzZXR0eXBvcHRzKCk7CisjaWZkZWYgQ0tQVVJHRQorICAgICAgICAgIGV4dGVybiBpbnQgc2V0cHVyZ29wdHMoKTsKKyNlbmRpZiAvKiBDS1BVUkdFICovCisgICAgICAgICAgaWYgKCh4ID0gY21rZXkob3B0c3RhYixub3B0c3RhYiwiZm9yIGNvbW1hbmQiLCIiLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICBzd2l0Y2ggKHgpIHsKKyNpZm5kZWYgTk9GUklMTFMKKyAgICAgICAgICAgIGNhc2UgWFhERUw6CisgICAgICAgICAgICAgIHJldHVybihzZXRkZWxvcHRzKCkpOworI2VuZGlmIC8qIE5PRlJJTExTICovCisgICAgICAgICAgICBjYXNlIFhYRElSOgorICAgICAgICAgICAgICByZXR1cm4oc2V0ZGlyb3B0cygpKTsKKyAgICAgICAgICAgIGNhc2UgWFhUWVA6CisgICAgICAgICAgICAgIHJldHVybihzZXR0eXBvcHRzKCkpOworI2lmZGVmIENLUFVSR0UKKyAgICAgICAgICAgIGNhc2UgWFhQVVJHRToKKyAgICAgICAgICAgICAgcmV0dXJuKHNldHB1cmdvcHRzKCkpOworI2VuZGlmIC8qIENLUFVSR0UgKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgfQorICAgICAgfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZm5kZWYgTk9YRkVSCisgICAgICBjYXNlIFhZUThGTEc6IHsKKyAgICAgICAgICBleHRlcm4gaW50IHE4ZmxhZzsKKyAgICAgICAgICByZXR1cm4oc2V0b24oJnE4ZmxhZykpOworICAgICAgfQorICAgICAgY2FzZSBYWVRJTUVSOiB7CisgICAgICAgICAgZXh0ZXJuIGludCBhc2t0aW1lcjsKKyAgICAgICAgICB5ID0gY21udW0oIlRpbWUgbGltaXQgZm9yIEFTSyBjb21tYW5kLCBzZWNvbmRzIiwiMCIsMTAsJngseHhzdHJpbmcpOworI2lmZGVmIFFOWDE2CisgICAgICAgICAgcmV0dXJuKHNldG51bSgmYXNrdGltZXIseCx5LDMyNzY3KSk7CisjZWxzZQorICAgICAgICAgIHJldHVybihzZXRudW0oJmFza3RpbWVyLHgseSw4NjQwMCkpOworI2VuZGlmIC8qIFFOWDE2ICovCisgICAgICB9CisgICAgICBjYXNlIFhZRkFDS0I6IHsKKyAgICAgICAgICBleHRlcm4gaW50IGZhY2tidWc7CisgICAgICAgICAgcmV0dXJuKHNldG9uKCZmYWNrYnVnKSk7CisgICAgICB9CisjZW5kaWYgLyogTk9YRkVSICovCisKKyAgICAgIGNhc2UgWFlISU5UUzoKKyAgICAgICAgcmV0dXJuKHNldG9uKCZoaW50cykpOworCisjaWZuZGVmIE5PU1BMCisgICAgICBjYXNlIFhZRVZBTDogeworICAgICAgICAgIGV4dGVybiBpbnQgb2xkZXZhbDsKKyAgICAgICAgICBpZiAoKHggPSBjbWtleShvbGRuZXcsMiwiIiwiIiwgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgIG9sZGV2YWwgPSB4OworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgWFlGQUNLUDogeworICAgICAgICAgIGV4dGVybiBpbnQgZmFja3BhdGg7CisgICAgICAgICAgcmV0dXJuKHNldG9uKCZmYWNrcGF0aCkpOworICAgICAgfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisgICAgICBjYXNlIFhZUU5YUEw6IHsKKyAgICAgICAgICBleHRlcm4gaW50IHFueHBvcnRsb2NrOworICAgICAgICAgIHJldHVybihzZXRvbigmcW54cG9ydGxvY2spKTsKKyAgICAgIH0KKworI2lmbmRlZiBOT0NNREwKKyNpZmRlZiBJS1NECisgICAgICBjYXNlIFhZSUtTOiB7CisgICAgICAgICAgaW50IHNldGlrcygpOworICAgICAgICAgIHJldHVybihzZXRpa3MoKSk7CisgICAgICB9CisjZW5kaWYgLyogSUtTRCAqLworI2VuZGlmIC8qIE5PQ01ETCAqLworCisjaWZkZWYgQ0tST09UCisgICAgICBjYXNlIFhZUk9PVDoKKyAgICAgICAgcmV0dXJuKGRvY2hyb290KCkpOworI2VuZGlmIC8qIENLUk9PVCAqLworCisjaWZuZGVmIE5PU1BMCisjaWZuZGVmIE5PU0VYUAorICAgICAgY2FzZSBYWVNFWFA6IHsKKyAgICAgICAgICBpZiAoKHggPSBjbWtleShzZXhwdGFiLDIsIiIsIiIsIHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIHN3aXRjaCAoeCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICBpZiAoKHggPSBjbWtleShvb2F0YWIsMywiIiwiYXV0b21hdGljIiwgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICBzZXhwZWNobyA9IHg7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiB7CisgICAgICAgICAgICAgICAgaW50IGksIHh4OworICAgICAgICAgICAgICAgIHh4ID0gc2V4cG1heGRlcDsKKyAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbW51bSgiTWF4aW11bSByZWN1cnNpb24gZGVwdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMDAwIiwxMCwmeCx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICB6ID0gc2V0bnVtKCZzZXhwbWF4ZGVwLHgseSwtMSk7CisgICAgICAgICAgICAgICAgaWYgKHogPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICAgICAgICAgIGlmIChzeHJlc3VsdCkgeyAgICAgICAgIC8qIEZyZWUgb2xkIHN0YWNrIGlmIGFsbG9jYXRlZCAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgeHg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoc3hyZXN1bHRbaV0pIGZyZWUoc3hyZXN1bHRbaV0pOworICAgICAgICAgICAgICAgICAgICBmcmVlKChjaGFyICopc3hyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3hybGVuKSBmcmVlKChjaGFyICopc3hybGVuKTsKKyAgICAgICAgICAgICAgICAgICAgc3hyZXN1bHQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBzeHJsZW4gPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBOT1NFWFBMICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIE5FV0ZUUAorICAgICAgY2FzZSBYWUdQUjogeworICAgICAgICAgIGV4dGVybiBzdHJ1Y3Qga2V5dGFiIGdwcnRhYltdOworICAgICAgICAgIGV4dGVybiBpbnQgZnRwZ2V0OworICAgICAgICAgIGlmICgoeCA9IGNta2V5KGdwcnRhYiwzLCIiLCJrZXJtaXQiLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgZnRwZ2V0ID0geDsKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorI2VuZGlmIC8qIE5FV0ZUUCAqLworCisjaWZkZWYgQU5ZU1NICisgICAgICBjYXNlIFhZU1NIOgorICAgICAgICByZXR1cm4oZG9zZXRzc2goKSk7CisjZW5kaWYgLyogQU5ZU0hIICovCisKKyNpZmRlZiBTRlRQX0JVSUxUSU4KKyAgICAgIGNhc2UgWFlTRlRQOgorICAgICAgICByZXR1cm4oZG9zZXRzZnRwKCkpOworI2VuZGlmIC8qIFNGVFBfQlVJTFRJTiAqLworCisjaWZkZWYgTE9DVVMKKyAgICAgIGNhc2UgWFlMT0NVUzoKKyAgICAgICAgICBpZiAoKHggPSBjbWtleShsb2N1c3RhYixubG9jdXN0YWIsIiIsCisjaWZkZWYgS1VJCisJCQkgImFzayIKKyNlbHNlCisJCQkgImF1dG8iCisjZW5kaWYgLyogS1VJICovCisJCQkgLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICBpZiAoeCA9PSAyIHx8IHggPT0gMykgewkvKiBBVVRPIG9yIEFTSyAqLworICAgICAgICAgICAgICBzZXRhdXRvbG9jdXMoeCAtIDEpOwkvKiBUd28gZm9ybXMgb2YgYXV0b21hdGljIGxvY3VzaW5nICovCisJICAgICAgLyogc2V0bG9jdXMoMSwwKTsgKi8gICAgICAvKiB3ZSdyZSBub3QgY2hhbmdpbmcgdGhlIGxvY3VzIGhlcmUgKi8KKyAgICAgICAgICB9IGVsc2UgewkJCS8qIExPQ0FMIG9yIFJFTU9URSAqLworICAgICAgICAgICAgICBzZXRhdXRvbG9jdXMoMCk7CQkvKiBObyBhdXRvbWF0aWMgTG9jdXMgY2hhbmdpbmcgKi8KKyAgICAgICAgICAgICAgc2V0bG9jdXMoeCwwKTsJCS8qIFNldCBMb2N1cyBhcyByZXF1ZXN0ZWQgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyNlbmRpZiAvKiBMT0NVUyAqLworCisjaWZkZWYgS1VJCisgICAgICBjYXNlIFhZR1VJOgorICAgICAgICByZXR1cm4oc2V0Z3VpKCkpOworI2VuZGlmIC8qIEtVSSAqLworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgICBwcmludGYoIk5vdCBpbXBsZW1lbnRlZCAtICVzXG4iLGNtZGJ1Zik7CisgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgIH0KK30KKworLyoKKyAgSCBVIFAgTyBLICAtLSAgSXMgSGFuZ3VwIE9LPworCisgIElzc3VlcyBhIHdhcm5pbmcgYW5kIGdldHMgT0sgZnJvbSB1c2VyIGRlcGVuZGluZyBvbiB3aGV0aGVyIGEgY29ubmVjdGlvbgorICBzZWVtcyB0byBiZSBvcGVuIGFuZCB3aGF0IHRoZSBTRVQgRVhJVCBXQVJOSU5HIHNldHRpbmcgaXMuICBSZXR1cm5zOgorICAgIDAgaWYgbm90IE9LIHRvIGhhbmcgdXAgb3IgZXhpdCAoaS5lLiB1c2VyIHNhaWQgTm8pOworICAgIG5vbnplcm8gaWYgT0suCisgIEFyZ3VtZW50IHggaXMgdXNlZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBFWElUIGNvbW1hbmQgZnJvbSBTRVQgTElORSAvIEhPU1QuCisqLworaW50CitodXBvayh4KSBpbnQgeDsgeyAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJucyAxIGlmIE9LLCAwIGlmIG5vdCBPSyAqLworICAgIGludCB5LCB6ID0gMTsKKyAgICBleHRlcm4gaW50IGV4aXRoYW5ndXA7CisjaWZkZWYgVk1TCisgICAgZXh0ZXJuIGludCBiYXRjaDsKKworICAgIGlmIChiYXRjaCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHdhcm5pbmdzIGluIGJhdGNoICovCisgICAgICByZXR1cm4oMSk7CisjZWxzZQorI2lmZGVmIFVOSVgKKyAgICBpZiAoYmFja2dyZCkgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyB3YXJuaW5ncyBpbiBiYWNrZ3JvdW5kICovCisgICAgICByZXR1cm4oMSk7CisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIFZNUyAqLworCisjaWZuZGVmIEs5NUcKKyAgICBkZWJ1ZyhGMTAxLCJodXBvayBsb2NhbCIsIiIsbG9jYWwpOworCisgICAgaWYgKCFsb2NhbCkgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gd2FybmluZ3MgaW4gcmVtb3RlIG1vZGUgKi8KKyAgICAgIHJldHVybigxKTsKKyNlbmRpZiAvKiBLOTVHICovCisKKyAgICBpZiAoeCA9PSAwICYmIGV4aXRoYW5ndXAgPT0gMCkgICAgICAvKiBFWElUIGFuZCBFWElUIEhBTkdVUCBpcyBPRkYgKi8KKyAgICAgIHJldHVybigxKTsKKworICAgIGRlYnVnKEYxMDEsImh1cG9rIHgiLCIiLHgpOworICAgIGRlYnVnKEYxMDEsImh1cG9rIHhpdHdhcm4iLCIiLHhpdHdhcm4pOworICAgIGRlYnVnKEYxMDEsImh1cG9rIG5ldHdvcmsiLCIiLG5ldHdvcmspOworICAgIGRlYnVnKEYxMDEsImh1cG9rIGhhdmVsaW5lIiwiIixoYXZlbGluZSk7CisKKyAgICBpZiAoKGxvY2FsICYmIHhpdHdhcm4pIHx8ICAgICAgICAgICAvKiBJcyBhIGNvbm5lY3Rpb24gb3Blbj8gKi8KKyAgICAgICAgKCF4ICYmIHhpdHdhcm4gPT0gMikpIHsgICAgICAgICAvKiBPciBBbHdheXMgZ2l2ZSB3YXJuaW5nIG9uIEVYSVQgKi8KKyAgICAgICAgaW50IG5lZWR3YXJuID0gMDsKKyAgICAgICAgY2hhciB3YXJuaW5nWzI1Nl07CisKKyAgICAgICAgaWYgKG5ldHdvcmspIHsKKyAgICAgICAgICAgIGlmICh0dGNoaygpID49IDApCisgICAgICAgICAgICAgIG5lZWR3YXJuID0gMTsKKyAgICAgICAgICAgIC8qIEEgY29ubmVjdGlvbiBzZWVtcyB0byBiZSBvcGVuIGJ1dCBpdCBjYW4ndCBwb3NzaWJseSBiZSAqLworICAgICAgICAgICAgaWYgKCFoYXZlbGluZSkKKyAgICAgICAgICAgICAgbmVlZHdhcm4gPSAwOworICAgICAgICAgICAgaWYgKG5lZWR3YXJuKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcCh0dG5hbWUsIioiKSkKKyAgICAgICAgICAgICAgICAgICAgY2ttYWttc2cod2FybmluZywyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEEgbmV0d29yayBjb25uZWN0aW9uIHRvICIsdHRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtaWdodCBzdGlsbCBiZSBhY3RpdmUuXG4iLE5VTEwpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh3YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICIgQW4gaW5jb21pbmcgbmV0d29yayBjb25uZWN0aW9uIG1pZ2h0IHN0aWxsIGJlIGFjdGl2ZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1Nik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VyaWFsIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgIGlmIChjYXJyaWVyID09IENBUl9PRkYpICAgICAvKiBTRVQgQ0FSUklFUiBPRkYgKi8KKyAgICAgICAgICAgICAgbmVlZHdhcm4gPSAwOyAgICAgICAgICAgICAvKiBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IGNhcnJpZXIuICovCisgICAgICAgICAgICBlbHNlIGlmICgoeSA9IHR0Z21kbSgpKSA+PSAwKSAvKiBlbHNlLCBnZXQgbW9kZW0gc2lnbmFscyAqLworICAgICAgICAgICAgICBuZWVkd2FybiA9ICh5ICYgQk1fRENEKTsgIC8qIENoZWNrIGZvciBjYXJyaWVyICovCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgY2FuJ3QgZ2V0IG1vZGVtIHNpZ25hbHMuLi4gKi8KKyAgICAgICAgICAgICAgbmVlZHdhcm4gPSAodHRjaGsoKSA+PSAwKTsKKyAgICAgICAgICAgIC8qIEEgY29ubmVjdGlvbiBzZWVtcyB0byBiZSBvcGVuIGJ1dCBpdCBjYW4ndCBwb3NzaWJseSBiZSAqLworICAgICAgICAgICAgaWYgKCFoYXZlbGluZSB8fCAhZXhpdGhhbmd1cCkKKyAgICAgICAgICAgICAgbmVlZHdhcm4gPSAwOworICAgICAgICAgICAgaWYgKG5lZWR3YXJuKQorICAgICAgICAgICAgICAgIGNrbWFrbXNnKHdhcm5pbmcsMjU2LAorICAgICAgICAgICAgICAgICAgICAgIiBBIHNlcmlhbCBjb25uZWN0aW9uIG1pZ2h0IHN0aWxsIGJlIGFjdGl2ZSBvbiAiLAorICAgICAgICAgICAgICAgICAgICAgdHRuYW1lLCIuXG4iLE5VTEwpOworICAgICAgICB9CisKKy8qIElmIGEgd2FybmluZyB3YXMgaXNzdWVkLCBnZXQgdXNlcidzIHBlcm1pc3Npb24gdG8gRVhJVC4gKi8KKworICAgICAgICBpZiAobmVlZHdhcm4gfHwgKCF4ICYmIHhpdHdhcm4gPT0gMgorI2lmbmRlZiBLOTVHCisJCQkmJiBsb2NhbAorI2VuZGlmIC8qIEs5NUcgKi8KKwkJCSApKSB7CisjaWZkZWYgQ09NTUVOVAorCSAgICBwcmludGYoIiVzIix3YXJuaW5nKTsKKyAgICAgICAgICAgIHogPSBnZXR5ZXNubyh4ID8gIk9LIHRvIGNsb3NlPyAiIDogIk9LIHRvIGV4aXQ/ICIsMCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJodXBvayBnZXR5ZXNubyIsIiIseik7CisgICAgICAgICAgICBpZiAoeiA8IC0zKSB6ID0gMDsKKyNlbHNlCisJICAgIHogPSB1cV9vayh3YXJuaW5nLAorCQkgICAgICB4ID8gIk9LIHRvIGNsb3NlPyAiIDogIk9LIHRvIGV4aXQ/ICIsCisJCSAgICAgIDMsCisJCSAgICAgIE5VTEwsCisJCSAgICAgIDAKKwkJICAgICAgKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImh1cG9rIHVxX29rIiwiIix6KTsKKwkgICAgaWYgKHogPCAwKSB6ID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKHopOworfQorCisjaWZuZGVmIE5PU0hPVworVk9JRAorc2hvY3RsKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNIT1cgQ09OVFJPTC1QUkVGSVhJTkcgKi8KKyNpZmRlZiBDS19TUEVFRAorICAgIGludCBpOworI2lmZGVmIE9TMgorICAgIGludCB6ZXJvOworI2VuZGlmIC8qIE9TMiAqLworICAgIHByaW50ZigKKyJcbmNvbnRyb2wgcXVvdGUgPSAlZCwgYXBwbGllZCB0byAoMCA9IHVucHJlZml4ZWQsIDEgPSBwcmVmaXhlZCk6XG5cbiIsCisgICAgICAgICAgIG15Y3RscSk7CisjaWZkZWYgT1MyCisjaWZuZGVmIFVOUFJFRklYWkVSTworICAgIHplcm8gPSBjdGxwWzBdOworICAgIGlmIChwcm90b2NvbCA9PSBQUk9UT19LKSAgICAgICAgICAgIC8qIFplcm8gY2FuJ3QgYmUgdW5wcmVmaXhlZCAqLworICAgICAgY3RscFswXSA9IDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBLZXJtaXQgKi8KKyNlbmRpZiAvKiBVTlBSRUZJWFpFUk8gKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBwcmludGYoIiAgJTNkOiAlZCAgICUzZDogJWQgIixpLGN0bHBbaV0sIGkrMTYsIGN0bHBbaSsxNl0pOworICAgICAgICBpZiAoaSA9PSAxNSkKKyAgICAgICAgICBwcmludGYoIiAgMTI3OiAlZCIsY3RscFsxMjddKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZigiICAgICAgICAiKTsKKyAgICAgICAgcHJpbnRmKCIgICUzZDogJWQgICAlM2Q6ICVkICIsaSsxMjgsY3RscFtpKzEyOF0sIGkrMTQ0LCBjdGxwW2krMTQ0XSk7CisgICAgICAgIGlmIChpID09IDE1KSAgcHJpbnRmKCIgIDI1NTogJWQiLGN0bHBbMjU1XSk7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworI2lmbmRlZiBVTlBSRUZJWFpFUk8KKyNpZmRlZiBPUzIKKyAgICBjdGxwWzBdID0gemVybzsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBVTlBSRUZJWFpFUk8gKi8KKworI2VuZGlmIC8qIENLX1NQRUVEICovCit9CisKKyNpZm5kZWYgTk9YRkVSCitWT0lECitzaG9kYmwoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0hPVyBET1VCTEUvSUdOT1JFICovCisjaWZkZWYgQ0tYWENIQVIKKyAgICBpbnQgaSwgbiA9IDA7CisgICAgcHJpbnRmKCJcblNFVCBTRU5EIERPVUJMRSBjaGFyYWN0ZXJzOlxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKSB7CisgICAgICAgIGlmIChkYmx0W2ldICYgMikgeworICAgICAgICAgICAgbisrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobiA9PSAwKQorICAgICAgcHJpbnRmKCIgKG5vbmUpIik7CisgICAgbiA9IDA7CisgICAgcHJpbnRmKCJcblNFVCBSRUNFSVZFIElHTk9SRSBjaGFyYWN0ZXJzOlxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKSB7CisgICAgICAgIGlmIChkYmx0W2ldICYgMSkgeworICAgICAgICAgICAgbisrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobiA9PSAwKQorICAgICAgcHJpbnRmKCIgKG5vbmUpIik7CisgICAgcHJpbnRmKCJcblxuIik7CisjZW5kaWYgLyogQ0tYWENIQVIgKi8KK30KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNlbmRpZiAvKiBOT1NIT1cgKi8KKworI2lmbmRlZiBOT1BVU0gKKyNpZmRlZiBDS19SRVhYCisvKgorICBSZXh4IGNvbW1hbmQuICBOb3RlLCB0aGlzIGlzIG5vdCBPUy8yLXNwZWNpZmljLCBiZWNhdXNlIFJleHggYWxzbyBydW5zCisgIG9uIG90aGVyIHN5c3RlbXMgd2hlcmUgQy1LZXJtaXQgYWxzbyBydW5zLCBsaWtlIHRoZSBBbWlnYS4KKyovCisjZGVmaW5lIFJFWEJVRkwgMTAwICAgICAgICAgICAgICAgICAgICAgLyogQ2hhbmdlIHRoaXMgaWYgbmVjY2Vzc2FyeSAqLworY2hhciByZXh4YnVmW1JFWEJVRkxdID0geyAnXDAnIH07ICAgICAgIC8qIFJleHgncyByZXR1cm4gdmFsdWUgKHN0cmluZykgKi8KKworaW50Citkb3JleHgoKSB7CisgICAgaW50IHgsIHk7CisgICAgY2hhciAqcmV4eGNtZDsKKworICAgICAgICBpZiAoKHggPSBjbXR4dCgiUmV4eCBjb21tYW5kIiwiIiwmcmV4eGNtZCx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisKKyNpZmRlZiBJS1NECisgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgIHByaW50ZigiP1NvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICB9CisjZW5kaWYgLyogSUtTRCAqLworI2lmZGVmIENLX0FQQworICAgIC8qIERvbid0IGxldCB0aGlzIGJlIHNldCByZW1vdGVseSAqLworICAgIGlmIChhcGNhY3RpdmUgPT0gQVBDX0xPQ0FMIHx8CisgICAgICAgIGFwY2FjdGl2ZSA9PSBBUENfUkVNT1RFICYmICEoYXBjc3RhdHVzICYgQVBDX1VOQ0gpKQorICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKworICAgICAgICBja3N0cm5jcHkobGluZSxyZXh4Y21kLExJTkJVRlNJWik7CisgICAgICAgIHJleHhjbWQgPSBsaW5lOworI2lmZGVmIE9TMgorICAgICAgICByZXR1cm4ob3MycmV4eChyZXh4Y21kLHJleHhidWYsUkVYQlVGTCkpOworI2Vsc2UgLyogIU9TMiAqLworICAgICAgICBwcmludGYoIlNvcnJ5LCBub3RoaW5nIGhhcHBlbnMuXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyNlbmRpZiAvKiBPUzIgKi8KK30KKyNlbmRpZiAvKiBDS19SRVhYICovCisjZW5kaWYgLyogTk9QVVNIICovCisjZWxzZSAgLyogTk9JQ1AgKi8KK1ZPSUQKK2RvbG9nZW5kKCkgeworICAgIC8qIER1bW15IHdyaXRlIHJlY29yZCB0byBjb25uZWN0aW9uIGxvZyAqLworfQorI2VuZGlmIC8qIE5PSUNQICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2t1dXM0LmMgYi9ja2VybWl0LTguMC4yMTEvY2t1dXM0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3ZGUxNQotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja3V1czQuYwpAQCAtMCwwICsxLDE0MDkxIEBACisjaW5jbHVkZSAiY2tjc3ltLmgiCisKKy8qICBDIEsgVSBVIFMgNCAtLSAgIlVzZXIgSW50ZXJmYWNlIiBmb3IgQy1LZXJtaXQsIHBhcnQgNCAgKi8KKworLyoKKyAgQXV0aG9yczoKKyAgICBGcmFuayBkYSBDcnV6IDxmZGNAY29sdW1iaWEuZWR1PiwKKyAgICAgIFRoZSBLZXJtaXQgUHJvamVjdCwgQ29sdW1iaWEgVW5pdmVyc2l0eSwgTmV3IFlvcmsgQ2l0eQorICAgIEplZmZyZXkgRSBBbHRtYW4gPGphbHRtYW5Ac2VjdXJlLWVuZHBvaW50cy5jb20+CisgICAgICBTZWN1cmUgRW5kcG9pbnRzIEluYy4sIE5ldyBZb3JrIENpdHkKKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorKi8KKworLyoKKyAgRmlsZSBja3V1czQuYyAtLSBGdW5jdGlvbnMgbW92ZWQgZnJvbSBvdGhlciBja3V1cyouYyBtb2R1bGVzIHRvIGV2ZW4KKyAgb3V0IHRoZWlyIHNpemVzLgorKi8KKyNpbmNsdWRlICJja2NkZWIuaCIKKyNpbmNsdWRlICJja2Nhc2MuaCIKKyNpbmNsdWRlICJja2NrZXIuaCIKKyNpbmNsdWRlICJja2NuZXQuaCIgICAgICAgICAgICAgICAgICAgICAvKiBOZXR3b3JrIHN5bWJvbHMgKi8KKyNpbmNsdWRlICJja3V1c3IuaCIKKyNpbmNsdWRlICJja3V2ZXIuaCIKKyNpbmNsdWRlICJja2N4bGEuaCIgICAgICAgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXIgc2V0cyAqLworCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyNpbmNsdWRlICJja3VhdGguaCIKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX1NTTAorI2luY2x1ZGUgImNrX3NzbC5oIgorI2VuZGlmIC8qIENLX1NTTCAqLworCisjaWZkZWYgVk1TCisjaW5jbHVkZSA8ZXJybm8uaD4gICAgICAgICAgICAgICAgICAgICAgLyogRm9yIFx2KGVycm5vKSAqLworZXh0ZXJuIGNoYXIgKiBja3Ztc2VycnN0cih1bnNpZ25lZCBsb25nKTsKKyNpZm5kZWYgT0xEX1ZNUworI2luY2x1ZGUgPGxpYiRyb3V0aW5lcy5oPiAgICAgICAgICAgICAgIC8qIE5vdCBmb3IgVkFYIEMgMi40ICovCisjZWxzZQorI2luY2x1ZGUgPGxpYmRlZi5oPgorI2VuZGlmIC8qIE9MRF9WTVMgKi8KK19QUk9UT1RZUChpbnQgdm1zdHR5ZmQsICh2b2lkKSApOworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgT1MyCisjaWZuZGVmIE5UCisjZGVmaW5lIElOQ0xfTk9QTQorI2RlZmluZSBJTkNMX1ZJTyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZWRlZCBmb3IgY2tvY29uLmggKi8KKyNpbmNsdWRlIDxvczIuaD4KKyN1bmRlZiBDT01NRU5UCisjZWxzZQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx0YXBpLmg+CisjaW5jbHVkZSAiY2tudGFwLmgiCisjZGVmaW5lIEFQSVJFVCBVTE9ORworI2VuZGlmIC8qIE5UICovCisjaW5jbHVkZSAiY2tvY29uLmgiCisjaW5jbHVkZSAiY2tvZXRjLmgiCitpbnQgU3RhcnRlZEZyb21EaWFsZXIgPSAwOworSFdORCBod25kRGlhbGVyID0gMDsKK0xPTkcgS2VybWl0RGlhbGVySUQgPSAwOworI2lmZGVmIHB1dGNoYXIKKyN1bmRlZiBwdXRjaGFyCisjZW5kaWYgLyogcHV0Y2hhciAqLworI2RlZmluZSBwdXRjaGFyKHgpIGNvbm9jKHgpCisjaWZkZWYgQ0tfUElECisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2VuZGlmIC8qIENLX1BJRCAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgS1VJCitleHRlcm4gc3RydWN0IGtleXRhYiAqIHRlcm1fZm9udDsKK2V4dGVybiBpbnQgbnRlcm1mb250LCB0dF9mb250LCB0dF9mb250X3NpemU7CisjZW5kaWYgLyogS1VJICovCisKK2V4dGVybiB4eF9zdHJwIHh4c3RyaW5nOworCisjaWZkZWYgREVDX1RDUElQCisjaW5jbHVkZSA8ZGVzY3JpcD4KKyNpbmNsdWRlIDxkdmlkZWY+CisjaW5jbHVkZSA8ZGNkZWY+CisjZW5kaWYgLyogREVDX1RDUElQICovCisKKyNpZmRlZiBGTkZMT0FUCisjaW5jbHVkZSA8bWF0aC5oPiAgICAgICAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmctcG9pbnQgZnVuY3Rpb25zICovCisjZW5kaWYgLyogRk5GTE9BVCAqLworCitleHRlcm4gaW50IHF1aWV0LCBuZXR3b3JrLCB4aXRzdGEsIGVzY2FwZSwgbm9wdXNoLCB4ZmVyc3RhdCwKKyAgZXhpdG9uY2xvc2UsIHRuX2V4aXQsIHR0bnByb3RvLCBhdXRvZGwsIGZsb3csIGJ5dGVvcmRlciwgd2hhdCwgbGFzdHhmZXI7CisKK2V4dGVybiBpbnQgZmlsZXBlZWssIG5zY2FuZmlsZSwgbWFrZXN0cmxlbjsKK2V4dGVybiBjaGFyICoga19pbmZvX2RpcjsKKworI2lmbmRlZiBNQUMKKyNpZm5kZWYgQU1JR0EKK2V4dGVybiBpbnQgdHR5ZmQ7CisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogQU1JR0EgKi8KKworI2lmZGVmIFROQ09ERQorZXh0ZXJuIGludCB0bl9ubG0sIHRuX2JfbmxtLCB0bl9iX3hmZXIsIHRuX3NiX2J1ZzsKK2V4dGVybiBpbnQgdG5fcmVtX2VjaG87CitleHRlcm4gaW50IHRuX2JfbWV1LCB0bl9iX3VtZSwgdG5fYXV0aF9rcmI1X2Rlc19idWc7CisjZW5kaWYgLyogVE5DT0RFICovCisKK2NoYXIgKiB4ZmVyZmlsZSA9IE5VTEw7CitpbnQgeGZlcmxvZyA9IDA7CisKK2V4dGVybiBpbnQgbG9jYWwsIHhhcmdjLCBzdGF5ZmxnLCByY2ZsYWcsIGJnc2V0LCBiYWNrZ3JkLCBjZmlsZWYsCisgIGluc2VydmVyLCBzcnZjZG1zZywgc3VjY2VzczsKKworI2lmZGVmIFZNUworZXh0ZXJuIGludCBiYXRjaDsKKyNlbmRpZiAvKiBWTVMgKi8KKworZXh0ZXJuIGNoYXIgY21kZmlsW10sICp2ZXJzaW8sICpja3hzeXMsICoqeGFyZ3Y7CisjaWZkZWYgREVCVUcKK2V4dGVybiBjaGFyIGRlYmZpbFtdOyAgICAgICAgICAgICAgICAgICAvKiBEZWJ1ZyBsb2cgZmlsZSBuYW1lICovCitleHRlcm4gaW50IGRlYnRpbTsKKyNlbmRpZiAvKiBERUJVRyAqLworCitleHRlcm4gaW50IG5vaW5pdDsKKworc3RhdGljIGNoYXIgbmRhdGJ1ZlsxMF07CisKK2NoYXIgKm1vbnRoc1tdID0geworICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgorfTsKKworY2hhciAqCit6em5kYXRlKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJucyB0b2RheSdzIGRhdGUgYXMgeXl5eW1tZGQgKi8KKyAgICBjaGFyICogcCA9IE5VTEw7CisgICAgaW50IHg7CisKKy8qIFdBUk5JTkcgLSBUaGlzIHdpbGwgZmFpbCBpZiBhc2N0aW1lKCkgcmV0dXJucyBub24tRW5nbGlzaCBtb250aCBuYW1lcyAqLworCisgICAgenRpbWUoJnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0ICJhc2N0aW1lIiBzdHJpbmcgKi8KKyAgICBpZiAocCA9PSBOVUxMIHx8ICpwID09IE5VTCkgcmV0dXJuKCIiKTsKKyAgICBmb3IgKHggPSAyMDsgeCA8IDI0OyB4KyspICAgICAgICAgICAvKiB5eXl5ICovCisgICAgICBuZGF0YnVmW3ggLSAyMF0gPSBwW3hdOworICAgIG5kYXRidWZbNl0gPSAoY2hhcikgKChwWzhdID09ICcgJykgPyAnMCcgOiBwWzhdKTsKKyAgICBuZGF0YnVmWzddID0gcFs5XTsgICAgICAgICAgICAgICAgICAvKiBkZCAqLworICAgIGZvciAoeCA9IDA7IHggPCAxMjsgeCsrKSAgICAgICAgICAgIC8qIG1tICovCisgICAgICBpZiAoIXN0cm5jbXAocCs0LG1vbnRoc1t4XSwzKSkgYnJlYWs7CisgICAgaWYgKHggPT0gMTIpIHsKKyAgICAgICAgbmRhdGJ1Zls0XSA9IG5kYXRidWZbNV0gPSAnPyc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgeCsrOworICAgICAgICBuZGF0YnVmWzRdID0gKGNoYXIpICgoeCA8IDEwKSA/ICcwJyA6ICcxJyk7CisgICAgICAgIG5kYXRidWZbNV0gPSAoY2hhcikgKCh4ICUgMTApICsgNDgpOworICAgIH0KKyAgICBuZGF0YnVmWzhdID0gTlVMOworICAgIGRlYnVnKEYxMTAsInp6bmRhdGUgcmV0dXJuIixuZGF0YnVmLDApOworICAgIHJldHVybigoY2hhciAqKW5kYXRidWYpOworfQorCisjaWZkZWYgRENNREJVRgorZXh0ZXJuIHN0cnVjdCBjbWRwdHIgKmNtZHN0azsKK2V4dGVybiBjaGFyICpsaW5lLCAqdG1wYnVmOworI2Vsc2UKK2V4dGVybiBzdHJ1Y3QgY21kcHRyIGNtZHN0a1tdOworZXh0ZXJuIGNoYXIgbGluZVtdLCB0bXBidWZbXTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisKKyNpZmRlZiBPUzIKK2V4dGVybiBjaGFyIGV4ZWRpcltdOworI2Vsc2UKK2V4dGVybiBjaGFyICogZXhlZGlyOworI2VuZGlmIC8qIE9TMiAqLworCitleHRlcm4gaW50IG5ldHR5cGU7CisKKyNpZm5kZWYgTk9JQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb3N0IG9mIHRoaXMgZmlsZS4uLiAqLworI2lmZGVmIENLTE9HRElBTAorZXh0ZXJuIGNoYXIgZGlhZmlsW107CisjZW5kaWYgLyogQ0tMT0dESUFMICovCisKKyNpZm5kZWYgQU1JR0EKKyNpZm5kZWYgTUFDCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogQU1JR0EgKi8KKworI2lmZGVmIFNUUkFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0cmF0dXMgQ29tcHV0ZXIsIEluYy4gIFZPUyAqLworI2lmZGVmIHB1dGNoYXIKKyN1bmRlZiBwdXRjaGFyCisjZW5kaWYgLyogcHV0Y2hhciAqLworI2RlZmluZSBwdXRjaGFyKHgpIGNvbm9jKHgpCisjaWZkZWYgZ2V0Y2hhcgorI3VuZGVmIGdldGNoYXIKKyNlbmRpZiAvKiBnZXRjaGFyICovCisjZGVmaW5lIGdldGNoYXIoeCkgY29uaW5jKDApCisjZW5kaWYgLyogU1RSQVRVUyAqLworCisKKyNpZmRlZiBBTllYMjUKK2V4dGVybiBpbnQgcmV2Y2FsbCwgY2xvc2dyLCBjdWRhdGE7CitpbnQgeDI1dmVyOworZXh0ZXJuIGNoYXIgdWRhdGFbXTsKKyNpZm5kZWYgSUJNWDI1CitleHRlcm4gaW50IG5wYWR4MzsKK2V4dGVybiBDSEFSIHBhZHBhcm1zW107CitleHRlcm4gc3RydWN0IGtleXRhYiBwYWR4M3RhYltdOworI2VuZGlmIC8qICFJQk1YMjUgKi8KKyNpZmRlZiBJQk1YMjUKKy8qIGdsb2JhbCB2YXJpYWJsZXMgb25seSBhdmFpbGFibGUgZm9yIElCTSBYLjI1IC0gcG9zc2libHkgaW50ZXJlc3RpbmcgZm9yCisgKiBvdGhlciBpbXBsZW1lbnRhdGlvbnMKKyAqLworZXh0ZXJuIHgyNWFkZHJfdCBsb2NhbF9udWE7CitleHRlcm4geDI1YWRkcl90IHJlbW90ZV9udWE7CisjZW5kaWYgLyogSUJNWDI1ICovCisjZW5kaWYgLyogQU5ZWDI1ICovCisKKyNpZmRlZiBORVRDT05OCisjaWZuZGVmIE5PRElBTAorZXh0ZXJuIGludCBubmV0ZGlyOworZXh0ZXJuIGNoYXIgKm5ldGRpcltdOworI2VuZGlmIC8qIE5PRElBTCAqLworZXh0ZXJuIGNoYXIgaXBhZGRyW107CisKKyNpZmRlZiBDS19ORVRCSU9TCitleHRlcm4gdW5zaWduZWQgc2hvcnQgbmV0Ymlvc0F2YWlsOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgTmV0YmV1aUFQSTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIE5ldEJpb3NOYW1lW107CitleHRlcm4gdW5zaWduZWQgY2hhciBOZXRCaW9zQWRhcHRlcjsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIE5ldEJpb3NMU047CisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworCisjaWZkZWYgVENQU09DS0VUCitleHRlcm4gY2hhciBteWlwYWRkcltdOworZXh0ZXJuIGludCB0Y3BfcmRuczsKKyNpZmRlZiBDS19ETlNfU1JWCitleHRlcm4gaW50IHRjcF9kbnNfc3J2OworI2VuZGlmIC8qIENLX0ROU19TUlYgKi8KK2V4dGVybiBjaGFyICogdGNwX2FkZHJlc3M7CisjaWZuZGVmIE5PSFRUUAorZXh0ZXJuIGNoYXIgKiB0Y3BfaHR0cF9wcm94eTsKKyNlbmRpZiAvKiBOT0hUVFAgKi8KKyNpZmRlZiBOVAorI2lmZGVmIENLX1NPQ0tTCitleHRlcm4gY2hhciAqIHRjcF9zb2Nrc19zdnI7CisjaWZkZWYgQ0tfU09DS1NfTlMKK2V4dGVybiBjaGFyICogdGNwX3NvY2tzX25zOworI2VuZGlmIC8qIENLX1NPQ0tTX05TICovCisjZW5kaWYgLyogQ0tfU09DS1MgKi8KKyNlbmRpZiAvKiBOVCAqLworCisjaWZuZGVmIE5PVENQT1BUUworI2lmZGVmIFNPTF9TT0NLRVQKKyNpZmRlZiBTT19MSU5HRVIKK2V4dGVybiBpbnQgdGNwX2xpbmdlcjsKK2V4dGVybiBpbnQgdGNwX2xpbmdlcl90bW87CisjZW5kaWYgLyogU09fTElOR0VSICovCisjaWZkZWYgU09fRE9OVFJPVVRFCitleHRlcm4gaW50IHRjcF9kb250cm91dGU7CisjZW5kaWYgLyogU09fRE9OVFJPVVRFICovCisjaWZkZWYgVENQX05PREVMQVkKK2V4dGVybiBpbnQgdGNwX25vZGVsYXk7CisjZW5kaWYgLyogVENQX05PREVMQVkgKi8KKyNpZmRlZiBTT19TTkRCVUYKK2V4dGVybiBpbnQgdGNwX3NlbmRidWY7CisjZW5kaWYgLyogU09fU05EQlVGICovCisjaWZkZWYgU09fUkNWQlVGCitleHRlcm4gaW50IHRjcF9yZWN2YnVmOworI2VuZGlmIC8qIFNPX1JDVkJVRiAqLworI2lmZGVmIFNPX0tFRVBBTElWRQorZXh0ZXJuIGludCB0Y3Bfa2VlcGFsaXZlOworI2VuZGlmIC8qIFNPX0tFRVBBTElWRSAqLworI2VuZGlmIC8qIFNPTF9TT0NLRVQgKi8KKyNlbmRpZiAvKiBOT1RDUE9QVFMgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisKK2V4dGVybiBjaGFyICogZmxvbmFtZVtdOworCisjaWZuZGVmIE5PU1BMCitleHRlcm4gaW50IGZuZGlhZ3M7ICAgICAgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gZGlhZ25vc3RpY3Mgb24vb2ZmICovCitleHRlcm4gaW50IGRpdmJ5emVybzsKK2ludCBpc3BhdHRlcm4gPSAwOworaW50IGlzam9pbiA9IDA7CisjaWZkZWYgQ0tfQVBDCitleHRlcm4gaW50IGFwY2FjdGl2ZTsgICAgICAgICAgICAgICAgICAgLyogTm9uemVybyA9IEFQQyBjb21tYW5kIHdhcyByZWMnZCAqLworZXh0ZXJuIGludCBhcGNzdGF0dXM7ICAgICAgICAgICAgICAgICAgIC8qIEFyZSBBUEMgY29tbWFuZHMgYmVpbmcgcHJvY2Vzc2VkPyAqLworI2lmZGVmIERDTURCVUYKK2V4dGVybiBjaGFyICphcGNidWY7ICAgICAgICAgICAgICAgICAgICAvKiBBUEMgY29tbWFuZCBidWZmZXIgKi8KKyNlbHNlCitleHRlcm4gY2hhciBhcGNidWZbXTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisjZW5kaWYgLyogQ0tfQVBDICovCisKK2V4dGVybiBjaGFyIGV2YWxidWZbXTsgICAgICAgICAgICAgICAgICAvKiBFVkFMVUFURSByZXN1bHQgKi8KK2V4dGVybiBjaGFyIHVpZGJ1ZltdLCBwd2J1ZltdLCBwcm1idWZbXTsKK19QUk9UT1RZUCggc3RhdGljIGNoYXIgKiBmbmV2YWwsIChjaGFyICosIGNoYXIgKiBbXSwgaW50LCBjaGFyICogKSApOworX1BST1RPVFlQKCBzdGF0aWMgVk9JRCBteWZsc2gsICh2b2lkKSApOworX1BST1RPVFlQKCBzdGF0aWMgY2hhciAqIGdldGlwLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgZGVsdGEyc2VjLCAoY2hhciAqLCBsb25nICopICk7CisKKyNpZmRlZiBORVdGVFAKK19QUk9UT1RZUCggY2hhciAqIGZ0cF9jcGxfbW9kZSwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGNoYXIgKiBmdHBfZHBsX21vZGUsICh2b2lkKSApOworX1BST1RPVFlQKCBjaGFyICogZnRwX2F1dGh0eXBlLCAodm9pZCkgKTsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKworI2lmbmRlZiBOT0hUVFAKK19QUk9UT1RZUCggY2hhciAqIGh0dHBfaG9zdCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBodHRwX2lzY29ubmVjdGVkLCAodm9pZCkgKTsKK19QUk9UT1RZUCggY2hhciAqIGh0dHBfc2VjdXJpdHksICh2b2lkKSApOworI2VuZGlmIC8qIE5PSFRUUCAqLworCisjaWZuZGVmIE5PU0VYUAorX1BST1RPVFlQKCBjaGFyICogZG9zZXhwLCAoY2hhciAqKSApOworaW50IGZzZXhwZmxhZyA9IDA7CisjZW5kaWYgLyogTk9TRVhQICovCisKK3N0YXRpYyBjaGFyIGhleGRpZ2l0c1sxNl0gPSB7CisgICAgJzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCdBJywnQicsJ0MnLCdEJywnRScsJ0YnCit9OworZXh0ZXJuIGNoYXIgKiB0ZW1wZGlyOworCisjaWZkZWYgQ0tfUkVYWAorZXh0ZXJuIGNoYXIgcmV4eGJ1ZltdOworI2VuZGlmIC8qIENLX1JFWFggKi8KKworZXh0ZXJuIGludCB0ZmxpbmVbXTsKKworLyogVGhlc2UgbmVlZCB0byBiZSBpbnRlcm5hdGlvbmFsaXplZC4uLiAqLworCitzdGF0aWMKK2NoYXIgKndrZGF5c1tdID0geworICAgICJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiCit9OworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBPUzIKK2V4dGVybiBjaGFyIHN0YXJ0dXBkaXJbXSwgaW5pZGlyW107CisjZWxzZQorI2lmZGVmIFZNU09SVU5JWAorZXh0ZXJuIGNoYXIgc3RhcnR1cGRpcltdOworI2VuZGlmIC8qIFZNU09SVU5JWCAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgT1MyCitfUFJPVE9UWVAgKGludCBvczJnZXRjcCwgKHZvaWQpICk7CisjaWZkZWYgVENQU09DS0VUCitleHRlcm4gY2hhciB0Y3BuYW1lW107CisjZW5kaWYgLyogVENQU09DS0VUICovCitleHRlcm4gaW50IHRjcF9hdmFpbDsKKyNpZmRlZiBERUNORVQKK2V4dGVybiBpbnQgZG5ldF9hdmFpbDsKKyNlbmRpZiAvKiBERUNORVQgKi8KKyNpZmRlZiBTVVBFUkxBVAorZXh0ZXJuIGludCBzbGF0X2F2YWlsOworI2VuZGlmIC8qIFNVUEVSTEFUICovCisKKyNpZm5kZWYgTk9URVJNCitleHRlcm4gaW50IHR0X3R5cGUsIG1heF90dDsKK2V4dGVybiBzdHJ1Y3QgdHRfaW5mb19yZWMgdHRfaW5mb1tdOworI2VuZGlmIC8qIE5PVEVSTSAqLworZXh0ZXJuIGludCB0dF9yb3dzW10sIHR0X2NvbHNbXTsKKyNlbHNlIC8qIE9TMiAqLworZXh0ZXJuIGludCB0dF9yb3dzLCB0dF9jb2xzOworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgQ0tfVEFQSQorZXh0ZXJuIGludCB0dHRhcGk7CitleHRlcm4gaW50IHRhcGlwYXNzOworZXh0ZXJuIHN0cnVjdCBrZXl0YWIgKiB0YXBpbGluZXRhYjsKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiICogX3RhcGlsaW5ldGFiOworZXh0ZXJuIGludCBudGFwaWxpbmU7CisjZW5kaWYgLyogQ0tfVEFQSSAqLworCitleHRlcm4gc3RydWN0IGtleXRhYiBjb2x4dGFiW107CitleHRlcm4gaW50IG5jb2x4OworCitleHRlcm4gY2hhciB0dG5hbWVbXSwgKnppbnB0ciwgKmtlcm1yYzsKK2V4dGVybiBjaGFyIGluaWRpcltdOworCitleHRlcm4gaW50IGFjdGl2ZWNtZCwgcmVtb25seSwgY21kX3Jvd3MsIGNtZF9jb2xzLCBwYXJpdHksIHNlc2xvZywKKyAgc2Vzc2Z0LCBzb3NpLCBod3Bhcml0eSwgdHNlY3MsIHhhcmdzLCB6aW5jbnQsIHRsZXZlbCwgaW5zaWxlbmNlLCBjbWRtc2ssCisgIHRpbWludCwgdGltZWYsIGluYnVmc2l6ZSwgZGlhbG9nLCBiaW5hcnksIGNhcnJpZXIsIGNkdGltbywgY21hc2ssIGR1cGxleCwKKyAgZm1hc2ssIGluZWNobywgbm1hYywgdHVybmNoLCB0dXJuLCBrYmNoYXI7CisKKyNpZm5kZWYgTk9YRkVSCitleHRlcm4gQ0hBUiBlb2wsICBteXBhZGMsIG15c3RjaCwgcGFkY2gsIHNlb2wsIHN0Y2hyLCAqIGVwa3Rtc2csIGZlb2w7CitleHRlcm4gY2hhciAqY2tzeXNpZDsKK2V4dGVybiBzdHJ1Y3QgY2tfcCBwdGFiW107CitleHRlcm4gaW50CisgIHByb3RvY29sLCBwcmVmaXhpbmcsIHhmcmJlbCwgeGZyY2FuLCB4ZnJpbnQsIHhmcmNociwgeGZybnVtLCBwa3RwYXVzLAorICBsc2NhcHIsIGxzY2FwdSwgeGZlcm1vZGUsIGRlc3QsIHNsb3N0YXJ0LCBtYXhycHMsIG1heHNwcywgbWF4dHJ5LCBteXBhZG4sCisgIG5wYWQsIHBrdHRpbSwgYmlncmJzaXosIGJpZ3Nic2l6LCBrZWVwLCBhdGNhcHIsIGF1dG9wYXIsIGJjdHIsIGJjdHUsCisgIGNydW5jaGVkLCBja2RlbGF5LCBlYnEsIGVicWZsZywgcGt0bG9nLCByZXRyYW5zLCBycGFja2V0cywgcnB0ZmxnLCBycHRxLAorICBydGltbywgc3BhY2tldHMsIHNwc2l6LCBzcHNpemYsIHNwc2l6ciwgdGltZW91dHMsIGZuY2FjdCwgZm5jbnYsIHVycHNpeiwKKyAgd21heCwgd3Nsb3RuLCB3c2xvdHIsIGZkaXNwbGEsIHNwbWF4LCBmbnJwYXRoLCBmbnNwYXRoLCBjcmMxNjsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIE9TMgorZXh0ZXJuIGludCB6eHBuOworZXh0ZXJuIGludCB2aWV3b25seTsKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBOT1hGRVIKKyNpZmRlZiBHRlRJTUVSCitleHRlcm4gQ0tGTE9BVCBmcHRzZWNzLCBmcHhmc2VjczsKKyNlbmRpZiAvKiBHRlRJTUVSICovCitleHRlcm4gbG9uZyB4ZnNlY3MsIHRmY3BzOworCisjaWZkZWYgQ0tfVE1QRElSCitleHRlcm4gY2hhciAqZGxkaXI7CisjZW5kaWYgLyogQ0tfVE1QRElSICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBSRUNVUlNJVkUKK2V4dGVybiBpbnQgcmVjdXJzaXZlOworI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworCisjaWZkZWYgVk1TCisgIGV4dGVybiBpbnQgZnJlY2w7CisjZW5kaWYgLyogVk1TICovCisKK2V4dGVybiBsb25nCisgIGZmYywgZmlsY250LCBycHRuLCBzcGVlZCwgdGZjLCB0bGNpLCB0bGNvLCBjY3UsIGNjcCwgdmVybnVtLCB4dmVybnVtOworCisjaWZuZGVmIE5PU1BMCitleHRlcm4gY2hhciBmc3BlY1tdLCBteWhvc3RbXTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCitleHRlcm4gY2hhciAqdGZuYW1bXTsgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBmaWxlIG5hbWVzICovCisKK2V4dGVybiBjaGFyIHBrdGZpbFtdLCAgICAgICAgICAgICAgICAgICAvKiBQYWNrZXQgbG9nIGZpbGUgbmFtZSAqLworI2lmZGVmIFRMT0cKKyAgdHJhZmlsW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2FjdGlvbiBsb2cgZmlsZSBuYW1lICovCisjZW5kaWYgLyogVExPRyAqLworICBzZXNmaWxbXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlc3Npb24gbG9nIGZpbGUgbmFtZSAqLworCisjaWZuZGVmIE5PWE1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVFJBTlNNSVQgY29tbWFuZCB2YXJpYWJsZXMgKi8KK2V4dGVybiBjaGFyIHhtaXRidWZbXTsKK2V4dGVybiBpbnQgeG1pdGYsIHhtaXRsLCB4bWl0eCwgeG1pdHMsIHhtaXR3LCB4bWl0dDsKKyNlbmRpZiAvKiBOT1hNSVQgKi8KKworZXh0ZXJuIGludCBjbWRsdmw7CisKKyNpZm5kZWYgTk9TUEwKKy8qIFNjcmlwdCBwcm9ncmFtbWluZyBsYW5ndWFnZSBpdGVtcyAqLworZXh0ZXJuIGNoYXIgKiphX3B0cltdOyAgICAgICAgICAgICAgICAgIC8qIEFycmF5cyAqLworZXh0ZXJuIGludCBhX2RpbVtdOworc3RhdGljIGNoYXIgKiBpbnBtYXRjaCA9IE5VTEw7CisjaWZkZWYgQ0tGTE9BVAorY2hhciAqIGlucHNjYWxlID0gTlVMTDsKKyNlbmRpZgkvKiBDS0ZMT0FUICovCitleHRlcm4gY2hhciAqIGlucGJ1ZiwgaW5jaGFyW107ICAgICAgICAgLyogQnVmZmVycyBmb3IgSU5QVVQgYW5kIFJFSU5QVVQgKi8KK2V4dGVybiBjaGFyICppbnBicDsgICAgICAgICAgICAgICAgICAgICAvKiBBbmQgcG9pbnRlciB0byBzYW1lICovCitzdGF0aWMgY2hhciAqcjMgPSAoY2hhciAqKTA7CitleHRlcm4gaW50IGluY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyogSU5QVVQgY2hhcmFjdGVyIGNvdW50ICovCitleHRlcm4gaW50IG1fZm91bmQ7ICAgICAgICAgICAgICAgICAgICAgLyogTUlOUFVUIHJlc3VsdCAqLworZXh0ZXJuIGludCBtYWNsdmw7ICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIGludm9jYXRpb24gbGV2ZWwgKi8KK2V4dGVybiBzdHJ1Y3QgbXRhYiAqbWFjdGFiOyAgICAgICAgICAgICAvKiBNYWNybyB0YWJsZSAqLworZXh0ZXJuIGNoYXIgKm1ydmFsW107CitleHRlcm4gaW50IG1hY2FyZ2NbXSwgdG9wYXJnYzsKKworI2lmZGVmIENPTU1FTlQKK2V4dGVybiBjaGFyICptX2xpbmVbXTsKK2V4dGVybiBjaGFyICp0b3BsaW5lOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworZXh0ZXJuIGNoYXIgKm1fYXJnW01BQ0xFVkVMXVsxMF07IC8qIFlvdSBoYXZlIHRvIHB1dCBpbiB0aGUgZGltZW5zaW9ucyAqLworZXh0ZXJuIGNoYXIgKmdfdmFyW0dWQVJTXTsgICAgICAgIC8qIGZvciBleHRlcm5hbCAyLWRpbWVuc2lvbmFsIGFycmF5cy4gKi8KKyNpZmRlZiBEQ01EQlVGCitleHRlcm4gaW50ICpjb3VudCwgKmlucGNhczsKKyNlbHNlCitleHRlcm4gaW50IGNvdW50W10sIGlucGNhc1tdOworI2VuZGlmIC8qIERDTURCVUYgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZkZWYgVU5JWAorZXh0ZXJuIGludCBoYXNsb2NrOyAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBVVUNQIGxvY2tzICovCitleHRlcm4gY2hhciBmbGZuYW1bXTsKKyNpZm5kZWYgVVNFVFRZTE9DSworZXh0ZXJuIGNoYXIgbG9jazJbXTsKKyNlbmRpZiAvKiBVU0VUVFlMT0NLICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZkZWYgT1MyT1JVTklYCitleHRlcm4gaW50IG1heG5hbSwgbWF4cGF0aDsgICAgICAgICAgICAgLyogTG9uZ2VzdCBuYW1lLCBwYXRoIGxlbmd0aCAqLworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworCitleHRlcm4gaW50IG1kbXR5cCwgbWRtc2F2OworCisjaWZuZGVmIE5PRElBTAorLyogRElBTC1yZWxhdGVkIHZhcmlhYmxlcyAqLworZXh0ZXJuIGNoYXIgbW9kZW1tc2dbXTsKK2V4dGVybiBNRE1JTkYgKm1vZGVtcFtdOyAgICAgICAgICAgICAgICAvKiBQb2ludGVycyB0byBtb2RlbSBpbmZvIHN0cnVjdHMgKi8KK2V4dGVybiBpbnQgbm1kbSwgZGlhbGhuZywgZGlhbHRtbywgZGlhbGtzcCwgZGlhbGRweSwgZGlhbHNydCwgZGlhbHN0YTsKK2V4dGVybiBpbnQgZGlhbHJ0ciwgZGlhbGludCwgZGlhbHJzdHIsIGRpYWxjb24sIGRpYWxjcSwgZGlhbGZsZDsKK2V4dGVybiBpbnQgbWRtc3BkLCBkaWFsZWMsIGRpYWxkYywgZGlhbG10aCwgZGlhbG1hdXRvLCBkaWFsZXNjOworZXh0ZXJuIGNoYXIgKmRpYWxudW0sICAgKmRpYWxpbmksICAqZGlhbGRpcltdLCAqZGlhbGNtZCwgICpkaWFsbnByLAorICpkaWFsZGNvbiwgKmRpYWxkY29mZiwgKmRpYWxlY29uLCAqZGlhbGVjb2ZmLCAqZGlhbGhjbWQsICpkaWFsbGFjLAorICpkaWFsaHdmYywgKmRpYWxzd2ZjLCAgKmRpYWxub2ZjLCAqZGlhbHB1bHNlLCAqZGlhbHRvbmUsICpkaWFsbmFtZSwKKyAqZGlhbGFhb24sICpkaWFsYWFvZmYsICpkaWFsbWFjOworZXh0ZXJuIGNoYXIgKmRpYWxsY2MsICAgKmRpYWxpeHAsICAqZGlhbGl4cywgICAqZGlhbGxkcCwgICpkaWFsbGRzLAorICpkaWFscHhpLCAgKmRpYWxweG8sICAgKmRpYWxzZngsICAqZGlhbHRmcDsKK2V4dGVybiBjaGFyICpkaWFsbGNwLCAgICpkaWFsbGNzOworZXh0ZXJuIGludCBudG9sbGZyZWUsIG5kaWFscHh4LCBubG9jYWxhYzsKK2V4dGVybiBjaGFyICpkaWFsdGZjW10sICpkaWFsbGNhY1tdLCAqZGlhbHB4eFtdLCAqbWF0Y2hweHg7CitleHRlcm4gaW50IG5kaWFscHVjYywgbmRpYWx0b2NjOworZXh0ZXJuIGNoYXIgKmRpYWx0b2NjW10sICpkaWFscHVjY1tdOworZXh0ZXJuIGludCBuZGlhbGRpciwgZGlhbGNuZiwgZGlhbGN2dCwgZGlhbGlkdCwgZGlhbHBhY2U7CitleHRlcm4gbG9uZyBkaWFsbWF4LCBkaWFsY2FwYXM7CisKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIG1kbXRhYltdOworCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgQVJHQlVGU0laIDgxOTEKKyNlbHNlCisjZGVmaW5lIEFSR0JVRlNJWiAxMDIzCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKworI2lmZGVmIEJJR0JVRk9LCitleHRlcm4gY2hhciAqIGRpYWxtc2dbXTsKKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworCisjZW5kaWYgLyogTk9ESUFMICovCisKKyNpZm5kZWYgTk9DU0VUUworLyogVHJhbnNsYXRpb24gc3R1ZmYgKi8KK2V4dGVybiBpbnQgZmNoYXJzZXQsIHRjaGFyc2V0LCB0c2xldmVsLCBsYW5ndWFnZSwgbmxuZywgdGNzciwgdGNzbDsKK2V4dGVybiBpbnQgZGNzZXQ3LCBkY3NldDg7CitleHRlcm4gc3RydWN0IGtleXRhYiBsbmd0YWJbXTsKK2V4dGVybiBzdHJ1Y3QgY3NpbmZvIGZjc2luZm9bXSwgdGNzaW5mb1tdOworZXh0ZXJuIHN0cnVjdCBsYW5naW5mbyBsYW5nc1tdOworI2lmZGVmIENLX0FOU0lDCitleHRlcm4gQ0hBUiAoKnhsc1tNQVhUQ1NFVFMrMV1bTUFYRkNTRVRTKzFdKShDSEFSKTsgLyogQ2hhcmFjdGVyIHNldCAqLworZXh0ZXJuIENIQVIgKCp4bHJbTUFYVENTRVRTKzFdW01BWEZDU0VUUysxXSkoQ0hBUik7IC8qIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyAqLworI2Vsc2UKK2V4dGVybiBDSEFSICgqeGxzW01BWFRDU0VUUysxXVtNQVhGQ1NFVFMrMV0pKCk7IC8qIENoYXJhY3RlciBzZXQgKi8KK2V4dGVybiBDSEFSICgqeGxyW01BWFRDU0VUUysxXVtNQVhGQ1NFVFMrMV0pKCk7IC8qIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucy4gKi8KKyNlbmRpZiAvKiBDS19BTlNJQyAqLworI2lmZGVmIFVOSUNPREUKKyAgICBleHRlcm4gaW50IHVjc2JvbSwgdWNzb3JkZXI7CisjZW5kaWYgLyogVU5JQ09ERSAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmbmRlZiBOT1NQTAorLyogQnVpbHQtaW4gdmFyaWFibGUgbmFtZXMsIG1heGltdW0gbGVuZ3RoIFZOQU1MICgyMCBjaGFyYWN0ZXJzKSAqLworCitzdHJ1Y3Qga2V5dGFiIHZhcnRhYltdID0geworICAgIHsgIl9saW5lIiwgICAgIFZOX1RGTE4sICBDTV9JTlZ9LCAgIC8qIDE5MiAqLworI2lmZGVmIE9TMgorICAgIHsgIl9yZWduYW1lIiwgIFZOX1JFR04sICBDTV9JTlZ9LCAgIC8qIDEuMS4xMiAqLworICAgIHsgIl9yZWdvcmciLCAgIFZOX1JFR08sICBDTV9JTlZ9LCAgIC8qIDEuMS4xMiAqLworICAgIHsgIl9yZWdudW0iLCAgIFZOX1JFR1MsICBDTV9JTlZ9LCAgIC8qIDEuMS4xMiAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIHsgImFwY2FjdGl2ZSIsIFZOX0FQQywgICBDTV9JTlZ9LCAgIC8qIDE5MiAqLworI2lmZGVmIE5UCisgICAgeyAiYXBwZGF0YSIsICAgVk5fQVBQREFUQSwgMH0sICAgICAgLyogMjAxICovCisjZW5kaWYgLyogTlQgKi8KKyAgICB7ICJhcmdjIiwgICAgICBWTl9BUkdDLCAgMH0sCisgICAgeyAiYXJncyIsICAgICAgVk5fQVJHUywgIDB9LAorICAgIHsgImF1dGhuYW1lIiwgIFZOX0FVVEhOLCAwfSwgICAgICAgIC8qIDE5NiAqLworICAgIHsgImF1dGhzdGF0ZSIsIFZOX0FVVEhTLCAwfSwgICAgICAgIC8qIDE5NSAqLworICAgIHsgImF1dGh0eXBlIiwgIFZOX0FVVEhULCAwfSwgICAgICAgIC8qIDE5NSAqLworICAgIHsgImJsb2NrY2hlY2siLFZOX0JMSywgICAwfSwgICAgICAgIC8qIDE5NSAqLworI2lmZGVmIEJST1dTRVIKKyAgICB7ICJicm93c2VyIiwgICBWTl9CUk9XU1IsMH0sICAgICAgICAvKiAxOTMgKi8KKyAgICB7ICJicm93c29wdHMiLCBWTl9CUk9QVCwgMH0sICAgICAgICAvKiAxOTMgKi8KKyAgICB7ICJicm93c3VybCIsICBWTl9VUkwsICAgMH0sICAgICAgICAvKiAxOTMgKi8KKyAgICB7ICJidWlsZGlkIiwgICBWTl9CVUlMRCwgMH0sICAgICAgICAvKiAxOTkgKi8KKyNlbmRpZiAvKiBCUk9XU0VSICovCisgICAgeyAiYnl0ZW9yZGVyIiwgVk5fQllURSwgIDB9LCAgICAgICAgLyogMTk1ICovCisjaWZuZGVmIE5PQ1NFVFMKKyAgICB7ICJjaGFyc2V0IiwgICBWTl9DU0VULCAgMH0sICAgICAgICAvKiAxOTIgKi8KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgeyAiY21kYnVmc2l6ZSIsVk5fQ01EQkwsIDB9LCAgICAgICAgLyogMTk1ICovCisgICAgeyAiY21kZmlsZSIsICAgVk5fQ01ERiwgIDB9LAorICAgIHsgImNtZGxldmVsIiwgIFZOX0NNREwsICAwfSwKKyAgICB7ICJjbWRzb3VyY2UiLCBWTl9DTURTLCAgMH0sCisgICAgeyAiY29scyIsICAgICAgVk5fQ09MUywgIDB9LCAgICAgICAgLyogMTkwICovCisjaWZkZWYgTlQKKyAgICB7ICJjb21tb24iLCAgICBWTl9DT01NT04sIDB9LCAgICAgICAvKiAyMDEgKi8KKyNlbmRpZiAvKiBOVCAqLworICAgIHsgImNvbm5lY3Rpb24iLFZOX0NPTk4sICAwfSwgICAgICAgIC8qIDE5MCAqLworICAgIHsgImNvdW50IiwgICAgIFZOX0NPVU4sICAwfSwKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAiY3BzIiwgICAgICAgVk5fQ1BTLCAgIDB9LCAgICAgICAgLyogMTkwICovCisjZW5kaWYgLyogTk9YRkVSICovCisgICAgeyAiY3B1IiwgICAgICAgVk5fQ1BVLCAgIDB9LAorI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJjcmMxNiIsICAgICBWTl9DUkMxNiwgMH0sICAgICAgICAvKiAxOTIgKi8KKyAgICB7ICJjdHR5IiwgICAgICBWTl9UVFlOQU0sMH0sICAgICAgICAvKiAxOTYgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNpZm5kZWYgTk9MT0dESUFMCisjaWZuZGVmIE5PTE9DQUwKKyAgICB7ICJjeF90aW1lIiwgICBWTl9DWFRJTUUsMH0sICAgICAgICAvKiAxOTUgKi8KKyAgICB7ICJjeF9zdGF0dXMiLCBWTl9DWF9TVEEsMH0sICAgICAgICAvKiAxOTkgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjZW5kaWYgLyogTk9MT0dESUFMICovCisjaWZuZGVmIE5PRElBTAorICAgIHsgImQkYWMiLCAgICAgIFZOX0RfQUMsICAwfSwgICAgICAgIC8qIDE5MiAqLworICAgIHsgImQkY2MiLCAgICAgIFZOX0RfQ0MsICAwfSwgICAgICAgIC8qIDE5MiAqLworICAgIHsgImQkaXAiLCAgICAgIFZOX0RfSVAsICAwfSwgICAgICAgIC8qIDE5MiAqLworICAgIHsgImQkbGMiLCAgICAgIFZOX0RfTENQLCAwfSwgICAgICAgIC8qIDE5MyAqLworICAgIHsgImQkbGNwIiwgICAgIFZOX0RfTENQLCBDTV9JTlZ9LCAgIC8qIDE5MyAqLworICAgIHsgImQkbHAiLCAgICAgIFZOX0RfTFAsICAwfSwgICAgICAgIC8qIDE5MiAqLworICAgIHsgImQkcHgiLCAgICAgIFZOX0RfUFhYLCAwfSwgICAgICAgIC8qIDE5NSAqLworICAgIHsgImQkcHh4IiwgICAgIFZOX0RfUFhYLCBDTV9JTlZ9LCAgIC8qIDE5NSAqLworI2VuZGlmIC8qIE5PRElBTCAqLworICAgIHsgImRhdGUiLCAgICAgIFZOX0RBVEUsICAwfSwKKyAgICB7ICJkYXkiLCAgICAgICBWTl9EQVksICAgMH0sCisjaWZkZWYgTlQKKyAgICB7ICJkZXNrdG9wIiwgICBWTl9ERVNLVE9QLCAwfSwgICAgIC8qIDIwMSAqLworI2VuZGlmIC8qIE5UICovCisjaWZuZGVmIE5PRElBTAorICAgIHsgImRpYWxjb3VudCIsIFZOX0RSVFIsICAwfSwgICAgICAgIC8qIDE5NSAqLworICAgIHsgImRpYWxudW1iZXIiLFZOX0ROVU0sICAwfSwgICAgICAgIC8qIDE5MiAqLworICAgIHsgImRpYWxyZXN1bHQiLFZOX01ETVNHLCAwfSwgICAgICAgIC8qIDE5MiAqLworICAgIHsgImRpYWxzdGF0dXMiLFZOX0RJQUwsICAwfSwgICAgICAgIC8qIDE5MCAqLworICAgIHsgImRpYWxzdWZmaXgiLFZOX1BEU0ZYLCAwfSwgICAgICAgIC8qIDE5MyAqLworICAgIHsgImRpYWx0eXBlIiwgIFZOX0RUWVBFLCAwfSwgICAgICAgIC8qIDE5MyAqLworI2VuZGlmIC8qIE5PRElBTCAqLworICAgIHsgImRpcmVjdG9yeSIsIFZOX0RJUkUsICAwfSwKKyNpZm5kZWYgTk9ESUFMCisgICAgeyAiZG1faGYiLCAgICAgVk5fRE1fSEYsIDB9LCAgICAgICAgLyogMTk5ICovCisgICAgeyAiZG1fbHAiLCAgICAgVk5fRE1fTFAsIDB9LCAgICAgICAgLyogMTk1ICovCisgICAgeyAiZG1fc3AiLCAgICAgVk5fRE1fU1AsIDB9LCAgICAgICAgLyogMTk1ICovCisgICAgeyAiZG1fcGQiLCAgICAgVk5fRE1fUEQsIDB9LCAgICAgICAgLyogMTk1ICovCisgICAgeyAiZG1fdGQiLCAgICAgVk5fRE1fVEQsIDB9LCAgICAgICAgLyogMTk1ICovCisgICAgeyAiZG1fd2EiLCAgICAgVk5fRE1fV0EsIDB9LCAgICAgICAgLyogMTk1ICovCisgICAgeyAiZG1fd2IiLCAgICAgVk5fRE1fV0IsIDB9LCAgICAgICAgLyogMTk5ICovCisgICAgeyAiZG1fd2QiLCAgICAgVk5fRE1fV0QsIDB9LCAgICAgICAgLyogMTk1ICovCisgICAgeyAiZG1fcmMiLCAgICAgVk5fRE1fUkMsIDB9LCAgICAgICAgLyogMTk1ICovCisjZW5kaWYgLyogTk9ESUFMICovCisjaWZuZGVmIE5PWEZFUgorICAgIHsgImRvd25sb2FkIiwgIFZOX0RMRElSLCAwfSwgICAgICAgIC8qIDE5MiAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgIHsgImVkaXRvciIsICAgIFZOX0VESVRPUiwwfSwKKyAgICB7ICJlZGl0ZmlsZSIsICBWTl9FREZJTEUsMH0sCisgICAgeyAiZWRpdG9wdHMiLCAgVk5fRURPUFQsIDB9LAorICAgIHsgImVycm5vIiwgICAgIFZOX0VSUk5PLCAwfSwgICAgICAgIC8qIDE5MiAqLworICAgIHsgImVycnN0cmluZyIsIFZOX0VSU1RSLCAwfSwgICAgICAgIC8qIDE5MiAqLworICAgIHsgImVzY2FwZSIsICAgIFZOX0VTQywgICAwfSwgICAgICAgIC8qIDE5MyAqLworICAgIHsgImV2YWx1YXRlIiwgIFZOX0VWQUwsICAwfSwgICAgICAgIC8qIDE5MCAqLworI2lmZGVmIE9TMk9SVU5JWAorICAgIHsgImV4ZWRpciIsICAgIFZOX0VYRURJUiwwfSwgICAgICAgIC8qIDE5MiAqLworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworICAgIHsgImV4aXRzdGF0dXMiLFZOX0VYSVQsICAwfSwKKyNpZmRlZiBDS0NIQU5ORUxJTworICAgIHsgImZfY291bnQiLCAgIFZOX0ZDT1UsICAwfSwgICAgICAgIC8qIDE5NSAqLworICAgIHsgImZfZXJyb3IiLCAgIFZOX0ZFUlIsICAwfSwgICAgICAgIC8qIDE5NSAqLworICAgIHsgImZfbWF4IiwgICAgIFZOX0ZNQVgsICAwfSwgICAgICAgIC8qIDE5NSAqLworICAgIHsgImZpbGVlcnJvciIsIFZOX0ZFUlIsICBDTV9JTlZ9LCAgIC8qIDE5NSAqLworICAgIHsgImZpbGVtYXgiLCAgIFZOX0ZFUlIsICBDTV9JTlZ9LCAgIC8qIDE5NSAqLworI2VuZGlmIC8qIENLQ0hBTk5FTElPICovCisgICAgeyAiZmlsZW5hbWUiLCAgVk5fRk5BTSwgIDB9LCAgICAgICAgLyogMTkzICovCisgICAgeyAiZmlsZW51bWJlciIsVk5fRk5VTSwgIDB9LCAgICAgICAgLyogMTkzICovCisgICAgeyAiZmlsZXNwZWMiLCAgVk5fRklMRSwgIDB9LAorICAgIHsgImZzaXplIiwgICAgIFZOX0ZGQywgICAwfSwgICAgICAgIC8qIDE5MCAqLworI2lmZGVmIEdGVElNRVIKKyAgICB7ICJmdGltZSIsICAgICBWTl9GVElNRSwgMH0sICAgICAgICAvKiAxOTkgKi8KKyNlbHNlCisgICAgeyAiZnRpbWUiLCAgICAgVk5fTlRJTSwgIENNX0lOVn0sCisjZW5kaWYgLyogR0ZUSU1FUiAqLworI2lmbmRlZiBOT0ZUUAorI2lmbmRlZiBTWVNGVFAKKyAgICB7ICJmdHBfY29kZSIsICAgICAgICAgVk5fRlRQX0MsIDB9LCAvKiAxOTkgKi8KKyAgICB7ICJmdHBfY3BsIiwgICAgICAgICAgVk5fRlRQX0IsIDB9LCAvKiAxOTkgKi8KKyAgICB7ICJmdHBfY29ubmVjdGVkIiwgICAgVk5fRlRQX1gsIDB9LCAvKiAxOTkgKi8KKyAgICB7ICJmdHBfZHBsIiwgICAgICAgICAgVk5fRlRQX0QsIDB9LCAvKiAxOTkgKi8KKyAgICB7ICJmdHBfZ2V0cHV0cmVtb3RlIiwgVk5fRlRQX0csIDB9LCAvKiAxOTkgKi8KKyAgICB7ICJmdHBfaG9zdCIsICAgICAgICAgVk5fRlRQX0gsIDB9LCAvKiAxOTkgKi8KKyAgICB7ICJmdHBfbG9nZ2VkaW4iLCAgICAgVk5fRlRQX0wsIDB9LCAvKiAxOTkgKi8KKyAgICB7ICJmdHBfbWVzc2FnZSIsICAgICAgVk5fRlRQX00sIDB9LCAvKiAxOTkgKi8KKyAgICB7ICJmdHBfbXNnIiwgICAgICAgICAgVk5fRlRQX00sIENNX0lOVn0sIC8qIDE5OSAqLworICAgIHsgImZ0cF9zZWN1cml0eSIsICAgICBWTl9GVFBfWiwgMH0sIC8qIDE5OSAqLworICAgIHsgImZ0cF9zZXJ2ZXIiLCAgICAgICBWTl9GVFBfUywgMH0sIC8qIDE5OSAqLworI2VuZGlmIC8qIFNZU0ZUUCAqLworI2VuZGlmIC8qIE5PRlRQICovCisgICAgeyAiZnR5cGUiLCAgICAgVk5fTU9ERSwgIDB9LCAgICAgICAgLyogMTkwICovCisjaWZkZWYgS1VJCisgICAgeyAiZ3VpX2ZvbnRuYW1lIiwgVk5fR1VJX0ZOTSwgMH0sCS8qIDIwNSAqLworICAgIHsgImd1aV9mb250c2l6ZSIsIFZOX0dVSV9GU1osIDB9LAkvKiAyMDUgKi8KKyAgICB7ICJndWlfcnVubW9kZSIsIFZOX0dVSV9SVU4sIDB9LCAgICAvKiAyMDUgKi8KKyAgICB7ICJndWlfeHBvcyIsICAgIFZOX0dVSV9YUCwgIDB9LCAgICAvKiAyMDUgKi8KKyAgICB7ICJndWlfeHJlcyIsICAgIFZOX0dVSV9YUiwgIDB9LCAgICAvKiAyMDUgKi8KKyAgICB7ICJndWlfeXBvcyIsICAgIFZOX0dVSV9ZUCwgIDB9LCAgICAvKiAyMDUgKi8KKyAgICB7ICJndWlfeXJlcyIsICAgIFZOX0dVSV9ZUiwgIDB9LCAgICAvKiAyMDUgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICB7ICJoZXJhbGQiLCAgICBWTl9IRVJBTEQsIDB9LAorICAgIHsgImhvbWUiLCAgICAgIFZOX0hPTUUsICAgMH0sCisgICAgeyAiaG9zdCIsICAgICAgVk5fSE9TVCwgICAwfSwKKyAgICB7ICJob3VyIiwgICAgICBWTl9IT1VSLCAgIDB9LCAgICAgICAvKiAyMDAgKi8KKyNpZm5kZWYgTk9IVFRQCisgICAgeyAiaHR0cF9jb2RlIiwgICAgICBWTl9IVFRQX0MsIDB9LCAgLyogMTk5ICovCisgICAgeyAiaHR0cF9jb25uZWN0ZWQiLCBWTl9IVFRQX04sIDB9LCAgLyogMTk5ICovCisgICAgeyAiaHR0cF9ob3N0IiwgICAgICBWTl9IVFRQX0gsIDB9LCAgLyogMTk5ICovCisgICAgeyAiaHR0cF9tZXNzYWdlIiwgICBWTl9IVFRQX00sIDB9LCAgLyogMTk5ICovCisgICAgeyAiaHR0cF9zZWN1cml0eSIsICBWTl9IVFRQX1MsIDB9LCAgLyogMTk5ICovCisjZW5kaWYgLyogTk9IVFRQICovCisgICAgeyAiaHdwYXJpdHkiLCAgVk5fSFdQQVIsIDB9LCAgICAgICAgLyogMTk1ICovCisgICAgeyAiaW5wdXQiLCAgICAgVk5fSUJVRiwgIDB9LAorICAgIHsgImluY2hhciIsICAgIFZOX0lDSFIsICAwfSwKKyAgICB7ICJpbmNvdW50IiwgICBWTl9JQ05ULCAgMH0sCisgICAgeyAiaW5pZGlyIiwgICAgVk5fSU5JLCAgIDB9LCAgICAgICAgLyogMTkyICovCisgICAgeyAiaW5tYXRjaCIsICAgVk5fTUFUQ0gsIDB9LCAgICAgICAgLyogMTk2ICovCisgICAgeyAiaW5zY2FsZSIsICAgVk5fSVNDQUxFLDB9LCAgICAgICAgLyogMjEwICovCisgICAgeyAiaW5zdGF0dXMiLCAgVk5fSVNUQVQsIDB9LCAgICAgICAgLyogMTkyICovCisgICAgeyAiaW50aW1lIiwgICAgVk5fSU5USU1FLDB9LCAgICAgICAgLyogMTkzICovCisgICAgeyAiaW53YWl0IiwgICAgVk5fSU5UTU8sIDB9LCAgICAgICAgLyogMTk1ICovCisgICAgeyAiaXAiLCAgICAgICAgVk5fSVBBRERSLCBDTV9BQlJ8Q01fSU5WfSwKKyAgICB7ICJpcGFkZHJlc3MiLCBWTl9JUEFERFIsMH0sICAgICAgICAvKiAxOTIgKi8KKyAgICB7ICJpcHJvbXB0IiwgICBWTl9QUk9NUFQsMH0sICAgICAgICAvKiAxOTkgKi8KKyAgICB7ICJrYmNoYXIiLCAgICBWTl9LQkNIQVIsMH0sICAgICAgICAvKiAxOTYgKi8KKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgIHsgImtleWJvYXJkIiwgIFZOX0tFWUIsICAwfSwKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICB7ICJrcmI0ZXJybXNnIiwgICAgVk5fSzRFTVNHLDB9LAorICAgIHsgImtyYjRlcnJubyIsICAgICBWTl9LNEVOTywgMH0sCisgICAgeyAia3JiNHByaW5jaXBhbCIsIFZOX0s0UFJOLCAwfSwKKyAgICB7ICJrcmI0cmVhbG0iLCAgICAgVk5fSzRSTE0sIDB9LAorICAgIHsgImtyYjRzZXJ2aWNlIiwgICBWTl9LNFNSViwgMH0sCisgICAgeyAia3JiNWNjIiwgICAgICAgIFZOX0s1Q0MsICAwfSwKKyAgICB7ICJrcmI1ZXJybXNnIiwgICAgVk5fSzVFTVNHLDB9LAorICAgIHsgImtyYjVlcnJubyIsICAgICBWTl9LNUVOTywgMH0sCisgICAgeyAia3JiNXByaW5jaXBhbCIsIFZOX0s1UFJOLCAwfSwKKyAgICB7ICJrcmI1cmVhbG0iLCAgICAgVk5fSzVSTE0sIDB9LAorICAgIHsgImtyYjVzZXJ2aWNlIiwgICBWTl9LNVNSViwgMH0sCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyAgICB7ICJsaW5lIiwgICAgICBWTl9MSU5FLCAgMH0sCisgICAgeyAibG9jYWwiLCAgICAgVk5fTENMLCAgIDB9LAorI2lmZGVmIFVOSVgKKyAgICB7ICJsb2NrZGlyIiwgICBWTl9MQ0tESVIsMH0sICAgICAgICAvKiAxOTUgKi8KKyAgICB7ICJsb2NrcGlkIiwgICBWTl9MQ0tQSUQsMH0sICAgICAgICAvKiAxOTUgKi8KKyNlbmRpZiAvKiBVTklYICovCisgICAgeyAibG9nX2Nvbm5lY3Rpb24iLCBWTl9MT0dfQ09OLCAwfSwgLyogMjA2ICovCisgICAgeyAibG9nX2RlYnVnIiwgVk5fTE9HX0RFQiwgMH0sICAgICAgLyogMjA2ICovCisgICAgeyAibG9nX3BhY2tldCIsIFZOX0xPR19QS1QsIDB9LCAgICAgLyogMjA2ICovCisgICAgeyAibG9nX3Nlc3Npb24iLCBWTl9MT0dfU0VTLCAwfSwgICAgLyogMjA2ICovCisgICAgeyAibG9nX3RyYW5zYWN0aW9uIiwgVk5fTE9HX1RSQSwgMH0sLyogMjA2ICovCisgICAgeyAibWFjbGV2ZWwiLCAgVk5fTUFDTFZMLDB9LCAgICAgICAgLyogMTk1ICovCisgICAgeyAibWFjcm8iLCAgICAgVk5fTUFDLCAgIDB9LAorI2lmZGVmIEZORkxPQVQKKyAgICB7ICJtYXRoX2UiLCAgICBWTl9NQV9FLCAgMH0sICAgICAgICAvKiAxOTUgKi8KKyAgICB7ICJtYXRoX3BpIiwgICBWTl9NQV9QSSwgMH0sICAgICAgICAvKiAxOTUgKi8KKyAgICB7ICJtYXRoX3ByZWNpc2lvbiIsIFZOX01BX1BSLCAwfSwgICAvKiAxOTUgKi8KKyNlbmRpZiAvKiBGTkZMT0FUICovCisgICAgeyAibWlucHV0IiwgICAgVk5fTUlOUCwgIDB9LCAgICAgICAgLyogMTkyICovCisgICAgeyAibW9kZWwiLCAgICAgVk5fTU9ETCwgIDB9LCAgICAgICAgLyogMTkzICovCisgICAgeyAibW9kZW0iLCAgICAgVk5fTURNLCAgIDB9LAorI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgeyAibW91c2VjdXJ4IiwgVk5fTU9VX1gsIDB9LCAgICAgICAgLyogSzk1IDEuMS4xNCAqLworICAgIHsgIm1vdXNlY3VyeSIsIFZOX01PVV9ZLCAwfSwgICAgICAgIC8qIEs5NSAxLjEuMTQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZuZGVmIE5PRElBTAorICAgIHsgIm1fYWFfb2ZmIiwgIFZOX01fQUFYLCAwfSwgICAgICAgIC8qIGFsbCAxOTIuLi4gKi8KKyAgICB7ICJtX2FhX29uIiwgICBWTl9NX0FBTywgMH0sCisgICAgeyAibV9kY19vZmYiLCAgVk5fTV9EQ1gsIDB9LAorICAgIHsgIm1fZGNfb24iLCAgIFZOX01fRENPLCAwfSwKKyAgICB7ICJtX2RpYWwiLCAgICBWTl9NX0RDTSwgMH0sCisgICAgeyAibV9lY19vZmYiLCAgVk5fTV9FQ1gsIDB9LAorICAgIHsgIm1fZWNfb24iLCAgIFZOX01fRUNPLCAwfSwKKyAgICB7ICJtX2ZjX2h3IiwgICBWTl9NX0hXRiwgMH0sCisgICAgeyAibV9mY19ubyIsICAgVk5fTV9ORkMsIDB9LAorICAgIHsgIm1fZmNfc3ciLCAgIFZOX01fU1dGLCAwfSwKKyAgICB7ICJtX2h1cCIsICAgICBWTl9NX0hVUCwgMH0sCisgICAgeyAibV9pbml0IiwgICAgVk5fTV9JTkksIDB9LAorICAgIHsgIm1fbmFtZSIsICAgIFZOX01fTkFNLCAwfSwgICAgICAgIC8qIDE5NSAqLworICAgIHsgIm1fcHVsc2UiLCAgIFZOX01fUERNLCAwfSwKKyAgICB7ICJtX3NpZ19jZCIsICBWTl9NU19DRCwgMH0sICAgICAgICAvKiAxOTUgKi8KKyAgICB7ICJtX3NpZ19jdHMiLCBWTl9NU19DVFMsMH0sICAgICAgICAvKiAxOTUgKi8KKyAgICB7ICJtX3NpZ19kc3IiLCBWTl9NU19EU1IsMH0sICAgICAgICAvKiAxOTUgKi8KKyAgICB7ICJtX3NpZ19kdHIiLCBWTl9NU19EVFIsMH0sICAgICAgICAvKiAxOTUgKi8KKyAgICB7ICJtX3NpZ19yaSIsICBWTl9NU19SSSwgMH0sICAgICAgICAvKiAxOTUgKi8KKyAgICB7ICJtX3NpZ19ydHMiLCBWTl9NU19SVFMsMH0sICAgICAgICAvKiAxOTUgKi8KKyAgICB7ICJtX3RvbmUiLCAgICBWTl9NX1RETSwgMH0sCisjZW5kaWYgLyogTk9ESUFMICovCisgICAgeyAibmFtZSIsICAgICAgVk5fTkFNRSwgIDB9LAorICAgIHsgIm5kYXRlIiwgICAgIFZOX05EQVQsICAwfSwKKyAgICB7ICJuZGF5IiwgICAgICBWTl9OREFZLCAgMH0sCisgICAgeyAibmV3bGluZSIsICAgVk5fTkVXTCwgIDB9LAorICAgIHsgIm50aW1lIiwgICAgIFZOX05USU0sICAwfSwKKyAgICB7ICJvc25hbWUiLCAgICBWTl9PU05BTSwgMH0sICAgICAgICAvKiAxOTMgKi8KKyAgICB7ICJvc3JlbGVhc2UiLCBWTl9PU1JFTCwgMH0sICAgICAgICAvKiAxOTMgKi8KKyAgICB7ICJvc3ZlcnNpb24iLCBWTl9PU1ZFUiwgMH0sICAgICAgICAvKiAxOTMgKi8KKyNpZm5kZWYgTk9YRkVSCisgICAgeyAicGFja2V0bGVuIiwgVk5fUlBTSVosIDB9LCAgICAgICAgLyogMTkyICovCisjZW5kaWYgLyogTk9YRkVSICovCisgICAgeyAicGFyaXR5IiwgICAgVk5fUFJUWSwgIDB9LCAgICAgICAgLyogMTkwICovCisgICAgeyAicGFzc3dvcmQiLCAgVk5fUFdELCAgIENNX0lOVn0sICAgLyogMTkyICovCisjaWZkZWYgTlQKKyAgICB7ICJwZXJzb25hbCIsICBWTl9QRVJTT05BTCwgMH0sICAgICAvKiAyMDEgKi8KKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIFBFWElUU1RBVAorICAgIHsgInBleGl0c3RhdCIsIFZOX1BFWElULCAwfSwgICAgICAgIC8qIDE5MyAqLworI2VuZGlmIC8qIFBFWElUU1RBVCAqLworI2lmZGVmIENLX1BJRAorICAgIHsgInBpZCIsICAgICAgIFZOX1BJRCwgICAwfSwgICAgICAgIC8qIDE5MyAqLworI2VuZGlmIC8qIENLX1BJRCAqLworICAgIHsgInBsYXRmb3JtIiwgIFZOX1NZU1YsICAwfSwKKyAgICB7ICJwcmludGVyIiwgICBWTl9QUklOVCwgMH0sICAgICAgICAvKiAxOTMgKi8KKyAgICB7ICJwcm9ncmFtIiwgICBWTl9QUk9HLCAgMH0sCisgICAgeyAicHJvbXB0IiwgICAgVk5fUFJNLCAgIENNX0lOVn0sICAgLyogMTkyICovCisjaWZuZGVmIE5PWEZFUgorICAgIHsgInByb3RvY29sIiwgIFZOX1BST1RPLCAwfSwgICAgICAgIC8qIDE5MiAqLworICAgIHsgInBfOGJpdCIsICAgIFZOX1BfOEJJVCwwfSwgICAgICAgIC8qIDE5MyAqLworICAgIHsgInBfY3RsIiwgICAgIFZOX1BfQ1RMLCAwfSwgICAgICAgIC8qIDE5MyAqLworICAgIHsgInBfcnB0IiwgICAgIFZOX1BfUlBULCAwfSwgICAgICAgIC8qIDE5MyAqLworICAgIHsgInF1ZXJ5IiwgICAgIFZOX1FVRSwgICAwfSwgICAgICAgIC8qIDE5MCAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgIHsgInJldHVybiIsICAgIFZOX1JFVCwgICAwfSwKKyNpZmRlZiBDS19SRVhYCisgICAgeyAicmV4eCIsICAgICAgVk5fUkVYWCwgIDB9LCAgICAgICAgLyogMTkwICovCisjZW5kaWYgLyogQ0tfUkVYWCAqLworI2lmZGVmIFROX0NPTVBPUlQKKyAgICB7ICJyZmMyMjE3X3NpZ25hdHVyZSIsIFZOX1ROQ19TSUcsIDB9LCAvKiAyMDEgKi8KKyAgICB7ICJyZmMyNzE3X3NpZ25hdHVyZSIsIFZOX1ROQ19TSUcsIENNX0lOVn0sIC8qIDIwMiAqLworI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyAgICB7ICJyb3dzIiwgICAgICBWTl9ST1dTLCAgMH0sICAgICAgICAvKiAxOTAgKi8KKyNpZm5kZWYgTk9TRVhQCisgICAgeyAic2RlcHRoIiwgICAgVk5fTFNFWFAsMH0sICAgICAgICAgLyogMTk5ICovCisjZW5kaWYgLyogTk9TRVhQICovCisgICAgeyAic2VjdXJlIiwgICAgVk5fU0VDVVJFLCAwfSwgICAgICAgLyogMTk5ICovCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICB7ICJzZWxlY3QiLCAgICBWTl9TRUxDVCwgMH0sICAgICAgICAvKiAxOTIgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgeyAic2VuZGxpc3QiLCAgVk5fU05ETCwgIDB9LAorICAgIHsgInNlcmlhbCIsICAgIFZOX1NFUklBTCwwfSwgICAgICAgIC8qIDE5NSAqLworICAgIHsgInNldGxpbmVtc2ciLFZOX1NMTVNHLCAwfSwgICAgICAgIC8qIDE5NSAqLworI2lmbmRlZiBOT1NFWFAKKyAgICB7ICJzZXhwcmVzc2lvbiIsVk5fU0VYUCwgMH0sICAgICAgICAvKiAxOTkgKi8KKyNlbmRpZiAvKiBOT1NFWFAgKi8KKyAgICB7ICJzcGVlZCIsICAgICBWTl9TUEVFLCAgMH0sCisjaWZkZWYgT1MyCisgICAgeyAic3BhY2UiLCAgICAgVk5fU1BBLCAgIDB9LAorICAgIHsgInN0YXJ0dXAiLCAgIFZOX1NUQVIsICAwfSwgICAgICAgIC8qIDE5MCAqLworI2Vsc2UKKyNpZmRlZiBVTklYCisgICAgeyAic3RhcnR1cCIsICAgVk5fU1RBUiwgIDB9LCAgICAgICAgLyogMTkzICovCisjZWxzZQorI2lmZGVmIFZNUworICAgIHsgInN0YXJ0dXAiLCAgIFZOX1NUQVIsICAwfSwgICAgICAgIC8qIDE5MyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB7ICJzdGF0dXMiLCAgICBWTl9TVUNDLCAgMH0sCisjaWZuZGVmIE5PU0VYUAorICAgIHsgInN2YWx1ZSIsICAgIFZOX1ZTRVhQLCAwfSwgICAgICAgIC8qIDE5OSAqLworI2VuZGlmIC8qIE5PU0VYUCAqLworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJzeXNpZCIsICAgICBWTl9TWVNJLCAgMH0sCisjZW5kaWYgLyogTk9YRkVSICovCisgICAgeyAic3lzdGVtIiwgICAgVk5fU1lTVCwgIDB9LAorICAgIHsgInRlcm1pbmFsIiwgIFZOX1RUWVAsICAwfSwKKyNpZmRlZiBPUzIKKyNpZm5kZWYgTk9LVkVSQlMKKyAgICB7ICJ0ZXJta2V5IiwgICBWTl9UUk1LLCAgQ01fSU5WfSwgICAvKiAxOTIgKi8KKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIHsgInRlc3QiLCAgICAgIFZOX1RFU1QsICAwfSwgICAgICAgIC8qIDE5MyAqLworICAgIHsgInRleHRkaXIiLCAgIFZOX1RYVERJUiwwfSwgICAgICAgIC8qIDE5NSAqLworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJ0ZnNpemUiLCAgICBWTl9URkMsICAgMH0sCisgICAgeyAidGZ0aW1lIiwgICAgVk5fVEZUSU0sIDB9LCAgICAgICAgLyogMTk1ICovCisjZW5kaWYgLyogTk9YRkVSICovCisgICAgeyAidGltZSIsICAgICAgVk5fVElNRSwgIDB9LAorICAgIHsgInRpbWVzdGFtcCIsIFZOX05PVywgICAwfSwgICAgICAgIC8qIDIwMCAqLworICAgIHsgInRtcGRpciIsICAgIFZOX1RFTVAsICAwfSwgICAgICAgIC8qIDE5MiAqLworI2lmZGVmIENLX1RSSUdHRVIKKyAgICB7ICJ0cmlnZ2VyIiwgICBWTl9UUklHLCAgMH0sICAgICAgICAvKiAxOTMgKi8KKyNlbmRpZiAvKiBDS19UUklHR0VSICovCisjaWZkZWYgQ0tfVFRZRkQKKyAgICB7ICJ0dHlmZCIsICAgICBWTl9UVFlGLCAgMH0sCisjZW5kaWYgLyogQ0tfVFRZRkQgKi8KKyAgICB7ICJ0eV9sbiIsICAgICBWTl9UWV9MTiwgMH0sICAgICAgICAvKiAxOTUgKi8KKyAgICB7ICJ0eV9sYyIsICAgICBWTl9UWV9MQywgMH0sICAgICAgICAvKiAxOTUgKi8KKyAgICB7ICJ0eV9sbSIsICAgICBWTl9UWV9MTSwgMH0sICAgICAgICAvKiAxOTUgKi8KKyNpZmRlZiBCUk9XU0VSCisgICAgeyAidXJsIiwgICAgICAgVk5fVVJMLCAgIENNX0lOVn0sICAgLyogMTkzICovCisjZW5kaWYgLyogQlJPV1NFUiAqLworICAgIHsgInVzZXJpZCIsICAgIFZOX1VJRCwgICAwfSwgICAgICAgIC8qIDE5MiAqLworICAgIHsgInZlcnNpb24iLCAgIFZOX1ZFUlMsICAwfSwKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAid2luZG93IiwgICAgVk5fV0lORE8sIDB9LCAgICAgICAgLyogMTkyICovCisjZW5kaWYgLyogTk9YRkVSICovCisjaWZkZWYgSUJNWDI1CisgICAgeyAieDI1bG9jYWxfbnVhIiwgVk5fWDI1TEEsIDB9LCAgICAgLyogMTkzICovCisgICAgeyAieDI1cmVtb3RlX251YSIsIFZOX1gyNVJBLCAwfSwgICAgLyogMTkzICovCisjZW5kaWYgLyogSUJNWDI1ICovCisjaWZkZWYgQ0tfU1NMCisgICAgeyAieDUwOV9pc3N1ZXIiLCAgVk5fWDUwOV9JLCAwfSwKKyAgICB7ICJ4NTA5X3N1YmplY3QiLCBWTl9YNTA5X1MsIDB9LAorI2VuZGlmIC8qIENLX1NTTCAqLworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJ4ZmVyc3RhdHVzIixWTl9YRlNUQVQsMH0sICAgICAgICAvKiAxOTMgKi8KKyAgICB7ICJ4ZmVybXNnIiwgICBWTl9YRk1TRywgMH0sICAgICAgICAvKiAxOTMgKi8KKyAgICB7ICJ4ZmVyX2JhZHBhY2tldHMiLCBWTl9YRl9CQywgMH0sICAvKiAxOTUgKi8KKyAgICB7ICJ4ZmVyX3RpbWVvdXRzIiwgICBWTl9YRl9UTSwgMH0sICAvKiAxOTUgKi8KKyAgICB7ICJ4ZmVyX3JldHJhbnNtaXRzIixWTl9YRl9SWCwgMH0sICAvKiAxOTUgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICB7ICJ4cHJvZ3JhbSIsICBWTl9YUFJPRywgMH0sICAgICAgICAvKiAxOTMgKi8KKyAgICB7ICJ4dmVyc2lvbiIsICBWTl9YVk5VTSwgMH0gICAgICAgICAvKiAxOTIgKi8KK307CitpbnQgbnZhcnMgPSAoc2l6ZW9mKHZhcnRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9TUEwKK3N0cnVjdCBrZXl0YWIgZm5jdGFiW10gPSB7ICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBuYW1lcyAqLworI2lmZGVmIE9TMgorICAgIHsgIi5vb3giLCAgICAgICBGTl9PT1gsIENNX0lOVn0sICAgIC8qIC4uLiAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgQ0tDSEFOTkVMSU8KKyAgICB7ICJfZW9mIiwgICAgICAgRk5fRkVPRiwgICAwfSwKKyAgICB7ICJfZXJybXNnIiwgICAgRk5fRkVSTVNHLCAwfSwKKyAgICB7ICJfZ2V0YmxvY2siLCAgRk5fRkdCTEssICAwfSwKKyAgICB7ICJfZ2V0Y2hhciIsICAgRk5fRkdDSEFSLCAwfSwKKyAgICB7ICJfZ2V0bGluZSIsICAgRk5fRkdMSU5FLCAwfSwKKyAgICB7ICJfaGFuZGxlIiwgICAgRk5fRklMTk8sICAwfSwKKyAgICB7ICJfbGluZSIsICAgICAgRk5fTkxJTkUsICAwfSwKKyAgICB7ICJfcG9zIiwgICAgICAgRk5fRlBPUywgICAwfSwKKyAgICB7ICJfcHV0YmxvY2siLCAgRk5fRlBCTEssICAwfSwKKyAgICB7ICJfcHV0Y2hhciIsICAgRk5fRlBDSEFSLCAwfSwKKyAgICB7ICJfcHV0bGluZSIsICAgRk5fRlBMSU5FLCAwfSwKKyAgICB7ICJfc3RhdHVzIiwgICAgRk5fRlNUQVQsICAwfSwKKyNlbmRpZiAvKiBDS0NIQU5ORUxJTyAqLworCisgICAgeyAiYWFjb252ZXJ0IiwgIEZOX0FBRFVNUCwgMH0sICAgICAgLyogQXNzb2NpYXRpdmUgQXJyYXkgY29udmVyc2lvbiAqLworICAgIHsgImFic29sdXRlIiwgICBGTl9BQlMsICAwfSwgICAgICAgIC8qIEFic29sdXRlIHZhbHVlICovCisjaWZkZWYgVENQU09DS0VUCisgICAgeyAiYWRkcjJuYW1lIiwgIEZOX0hTVEFERCxDTV9JTlZ9LCAgLyogSVAgQWRkcmVzcyB0byBIb3N0bmFtZSAqLworICAgIHsgImFkZHJ0b25hbWUiLCBGTl9IU1RBREQsQ01fSU5WfSwgIC8qIElQIEFkZHJlc3MgdG8gSG9zdG5hbWUgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyAgICB7ICJhcnJheWxvb2siLCAgRk5fQUxPT0ssMH0sICAgICAgICAvKiBBcnJheSBsb29rdXAgKi8KKyAgICB7ICJiNjRkZWNvZGUiLCAgRk5fRk1CNjQsMH0sICAgICAgICAvKiBCYXNlLTY0IGNvbnZlcnNpb24gKi8KKyAgICB7ICJiNjRlbmNvZGUiLCAgRk5fVE9CNjQsMH0sICAgICAgICAvKiAuLi4gKi8KKyAgICB7ICJiYXNlbmFtZSIsICAgRk5fQlNOLCAgMH0sICAgICAgICAvKiBCYXNlbmFtZSAqLworICAgIHsgImJyZWFrIiwgICAgICBGTl9CUkssICAwfSwgICAgICAgIC8qIEJyZWFrIChhcyBpbiBTbm9ib2wpICovCisgICAgeyAiY2EiLCAgICAgICAgIEZOX0NBUCwgIENNX0lOVnxDTV9BQlJ9LCAvKiBBYmJyZXZpYXRpb24gZm9yIGNhcGl0YWJsaXplICovCisgICAgeyAiY2FwIiwgICAgICAgIEZOX0NBUCwgIENNX0lOVnxDTV9BQlJ9LCAvKiBBYmJyZXZpYXRpb24gZm9yIGNhcGl0YWJsaXplICovCisgICAgeyAiY2FwaXRhbGl6ZSIsIEZOX0NBUCwgIDB9LCAgICAgICAgLyogRmlyc3QgTGV0dGVyIC0+IHVwcGVyY2FzZSAqLworICAgIHsgImNhcHMiLCAgICAgICBGTl9DQVAsICBDTV9JTlZ9LCAgIC8qIGRpdHRvICovCisgICAgeyAiY2hhcmFjdGVyIiwgIEZOX0NIUiwgIDB9LCAgICAgICAgLyogQ2hhcmFjdGVyIGZyb20gY29kZSAqLworICAgIHsgImNoZWNrc3VtIiwgICBGTl9DSEssICAwfSwgICAgICAgIC8qIENoZWNrc3VtICovCisgICAgeyAiY21kc3RhY2siLCAgIEZOX0NNRFNUSywwfSwgICAgICAgLyogQ29tbWFuZCBzdGFjayAqLworICAgIHsgImNtcGRhdGVzIiwgICBGTl9DTVBEQVRFLDB9LCAgICAgIC8qIENvbXBhcmUgZGF0ZXMgKi8KKyAgICB7ICJjb2RlIiwgICAgICAgRk5fQ09ELCAgMH0sICAgICAgICAvKiBDb2RlIGZyb20gY2hhcmFjdGVyICovCisjaWZuZGVmIE5PUFVTSAorICAgIHsgImNvbW1hbmQiLCAgICBGTl9DTUQsICAwfSwgICAgICAgIC8qIE91dHB1dCBmcm9tIGEgY29tbWFuZCAqLworI2VuZGlmIC8qIE5PUFVTSCAqLworICAgIHsgImNvbnRlbnRzIiwgICBGTl9DT04sICAwfSwgICAgICAgIC8qIERlZmluaXRpb24gKGNvbnRlbnRzKSBvZiB2YXJpYWJsZSAqLworICAgIHsgImNyYzE2IiwgICAgICBGTl9DUkMsICAwfSwgICAgICAgIC8qIENSQy0xNiAqLworI2lmZGVmIE9TMgorICAgIHsgImNyeXB0IiwgICAgICBGTl9DUlksIENNX0lOVn0sCisjZW5kaWYgLyogT1MyICovCisgICAgeyAiY3Z0ZGF0ZSIsICAgIEZOX0RUSU0sIDB9LCAgICAgICAgLyogQ29udmVydCBmcmVlIGRhdGUvdGltZSB0byBzdGQgKi8KKyNpZmRlZiBaRkNEQVQKKyAgICB7ICJkYXRlIiwgICAgICAgRk5fRkQsICAgMH0sICAgICAgICAvKiBGaWxlIG1vZGlmaWNhdGlvbi9jcmVhdGlvbiBkYXRlICovCisjZW5kaWYgLyogWkZDREFUICovCisgICAgeyAiZGF5IiwgICAgICAgIEZOX0RBWSwgIDB9LCAgICAgICAgLyogRGF5IG9mIHdlZWsgKi8KKyAgICB7ICJkYXlvZnllYXIiLCAgRk5fSkRBVEUsMH0sICAgICAgICAvKiBEYXRlIHRvIERheSBvZiBZZWFyICovCisgICAgeyAiZGVmaW5pdGlvbiIsIEZOX0RFRiwgIDB9LCAgICAgICAgLyogUmV0dXJuIGRlZmluaXRpb24gb2YgZ2l2ZW4gbWFjcm8gKi8KKyAgICB7ICJkZWx0YTJzZWNzIiwgRk5fREVMU0VDLCAwfSwgICAgICAvKiBEZWx0YSB0aW1lIHRvIHNlY29uZHMgKi8KKyAgICB7ICJkZWx0YXRvc2VjcyIsIEZOX0RFTFNFQywgQ01fSU5WfSwgLyogRGVsdGEgdGltZSB0byBzZWNvbmRzICovCisjaWZuZGVmIE5PRElBTAorICAgIHsgImRpYWxjb252ZXJ0IixGTl9QTkNWVCwwfSwgICAgICAgIC8qIENvbnZlcnQgcG9ydGFibGUgcGhvbmUgbnVtYmVyICovCisjZW5kaWYgLyogTk9ESUFMICovCisgICAgeyAiZGlmZmRhdGVzIiwgIEZOX0RJRkRBVEUsMH0sICAgICAgLyogRGlmZmVyZW5jZSBvZiB0d28gZGF0ZS10aW1lcyAqLworICAgIHsgImRpbWVuc2lvbiIsICBGTl9ESU0sICAwfSwgICAgICAgIC8qIERpbWVuc2lvbiBvZiBhcnJheSAqLworICAgIHsgImRpcmVjdG9yaWVzIixGTl9ESVIsICAwfSwgICAgICAgIC8qIExpc3Qgb2YgZGlyZWN0b3JpZXMgKi8KKyAgICB7ICJkaXJuYW1lIiwgICAgRk5fRE5BTSwgMH0sICAgICAgICAvKiBEaXJlY3RvcnkgcGFydCBvZiBmaWxlbmFtZSAqLworICAgIHsgImRvczJ1bml4cGF0aCIsRk5fUENfRFUsIH0sICAgICAgIC8qIERPUyB0byBVTklYIHBhdGggKi8KKyAgICB7ICJkb3N0b3VuaXhwYXRoIixGTl9QQ19EVSwgQ01fSU5WfSwgLyogRE9TIHRvIFVOSVggcGF0aCAqLworICAgIHsgImRveSIsICAgICAgICBGTl9KREFURSxDTV9JTlZ9LCAgIC8qIERhdGUgdG8gRGF5IG9mIFllYXIgKi8KKyAgICB7ICJkb3kyZGF0ZSIsICAgRk5fREFURUosMH0sICAgICAgICAvKiBEYXkgb2YgWWVhciB0byBkYXRlICovCisgICAgeyAiZG95dG9kYXRlIiwgIEZOX0RBVEVKLENNX0lOVn0sICAgLyogRGF5IG9mIFllYXIgdG8gZGF0ZSAqLworI2lmZGVmIEZOX0VSUk1TRworICAgIHsgImVycnN0cmluZyIsICBGTl9FUlJNU0csMH0sICAgICAgIC8qIEVycm9yIGNvZGUgdG8gbWVzc2FnZSAqLworI2VuZGlmIC8qIEZOX0VSUk1TRyAqLworICAgIHsgImV2YWx1YXRlIiwgICBGTl9FVkEsICAwfSwgICAgICAgIC8qIEV2YWx1YXRlIGdpdmVuIGFyaXRoIGV4cHJlc3Npb24gKi8KKyAgICB7ICJleGVjdXRlIiwgICAgRk5fRVhFLCAgMH0sICAgICAgICAvKiBFeGVjdXRlIGdpdmVuIG1hY3JvICovCisgICAgeyAiZmlsZXMiLCAgICAgIEZOX0ZDLCAgIDB9LCAgICAgICAgLyogRmlsZSBjb3VudCAqLworI2lmZGVmIEZORkxPQVQKKyAgICB7ICJmcGFic29sdXRlIiwgRk5fRlBBQlMsIDB9LCAgICAgICAvKiBGbG9hdGluZy1wb2ludCBhYnNvbHV0ZSB2YWx1ZSAqLworICAgIHsgImZwYWRkIiwgICAgICBGTl9GUEFERCwgMH0sICAgICAgIC8qIEZQIGFkZCAqLworICAgIHsgImZwY29zaW5lIiwgICBGTl9GUENPUywgMH0sICAgICAgIC8qIEZQIGNvc2luZSAqLworICAgIHsgImZwZGl2aWRlIiwgICBGTl9GUERJViwgMH0sICAgICAgIC8qIEZQIGRpdmlkZSAqLworICAgIHsgImZwZXhwIiwgICAgICBGTl9GUEVYUCwgMH0sICAgICAgIC8qIEZQIGUgdG8gdGhlIHggKi8KKyAgICB7ICJmcGludCIsICAgICAgRk5fRlBJTlQsIDB9LCAgICAgICAvKiBGUCB0byBpbnRlZ2VyICovCisgICAgeyAiZnBsb2cxMCIsICAgIEZOX0ZQTE9HLCAwfSwgICAgICAgLyogRlAgYmFzZS0xMCBsb2dhcml0aG0gKi8KKyAgICB7ICJmcGxvZ24iLCAgICAgRk5fRlBMTiwgIDB9LCAgICAgICAvKiBGUCBuYXR1cmFsIGxvZ2FyaXRobSAqLworICAgIHsgImZwbWF4aW11bSIsICBGTl9GUE1BWCwgMH0sICAgICAgIC8qIEZQIG1heGludW0gKi8KKyAgICB7ICJmcG1pbmltdW0iLCAgRk5fRlBNSU4sIDB9LCAgICAgICAvKiBGUCBtaW5pbnVtICovCisgICAgeyAiZnBtb2R1bHVzIiwgIEZOX0ZQTU9ELCAwfSwgICAgICAgLyogRlAgbW9kdWx1cyAqLworICAgIHsgImZwbXVsdGlwbHkiLCBGTl9GUE1VTCwgMH0sICAgICAgIC8qIEZQIG11bHRpcGx5ICovCisgICAgeyAiZnByYWlzZSIsICAgIEZOX0ZQUE9XLCAwfSwgICAgICAgLyogRlAgcmFpc2UgdG8gYSBwb3dlciAqLworICAgIHsgImZwcm91bmQiLCAgICBGTl9GUFJPVSwgMH0sICAgICAgIC8qIEZQIHJvdW5kICovCisgICAgeyAiZnBzaW5lIiwgICAgIEZOX0ZQU0lOLCAwfSwgICAgICAgLyogRlAgc2luZSAqLworICAgIHsgImZwc3FydCIsICAgICBGTl9GUFNRUiwgMH0sICAgICAgIC8qIEZQIHNxdWFyZSByb290ICovCisgICAgeyAiZnBzdWJ0cmFjdCIsIEZOX0ZQU1VCLCAwfSwgICAgICAgLyogRlAgc3VidHJhY3QgKi8KKyAgICB7ICJmcHRhbmdlbnQiLCAgRk5fRlBUQU4sIDB9LCAgICAgICAvKiBGUCB0YW5nZW50ICovCisjZW5kaWYgLyogRk5GTE9BVCAqLworICAgIHsgImhleDJpcCIsICAgICBGTl9IRVgySVAsMH0sICAgICAgIC8qIEhleCB0byBJUCBhZGRyZXNzICovCisgICAgeyAiaGV4dG9pcCIsICAgIEZOX0hFWDJJUCxDTV9JTlZ9LCAgLyogSGV4IHRvIElQIGFkZHJlc3MgKi8KKyAgICB7ICJoZXgybiIsICAgICAgRk5fSEVYMk4sIENNX0lOVn0sICAvKiBIZXggdG8gZGVjaW1hbCBudW1iZXIgKi8KKyAgICB7ICJoZXhpZnkiLCAgICAgRk5fSEVYLCAgIDB9LCAgICAgICAvKiBIZXhpZnkgKHN0cmluZykgKi8KKyAgICB7ICJpbmRleCIsICAgICAgRk5fSU5ELCAgIDB9LCAgICAgICAvKiBJbmRleCAoc3RyaW5nIHNlYXJjaCkgKi8KKyAgICB7ICJpcDJoZXgiLCAgICAgRk5fSVAySEVYLDB9LCAgICAgICAvKiBJUCBhZGRyZXNzIHRvIGhleCAqLworICAgIHsgImlwdG9oZXgiLCAgICBGTl9JUDJIRVgsQ01fSU5WfSwgIC8qIElQIGFkZHJlc3MgdG8gaGV4ICovCisgICAgeyAiaXBhZGRyZXNzIiwgIEZOX0lQQSwgICAwfSwgICAgICAgLyogRmluZCBhbmQgcmV0dXJuIElQIGFkZHJlc3MgKi8KKyAgICB7ICJqZGF0ZSIsICAgICAgRk5fSkRBVEUsIENNX0lOVn0sICAvKiBEYXRlIHRvIERheSBvZiBZZWFyICovCisgICAgeyAiam9pbiIsICAgICAgIEZOX0pPSU4sICAwfSwgICAgICAgLyogSm9pbiBhcnJheSBlbGVtZW50cyAqLworICAgIHsgImtleXdvcmR2YWx1ZSIsICBGTl9LV1ZBTCwgMH0sICAgIC8qIEtleXdvcmQ9VmFsdWUgKi8KKyNpZmRlZiBDS19LRVJCRVJPUworICAgIHsgImtyYmZsYWdzIiwgICAgICBGTl9LUkJfRkcsIDB9LCAgIC8qIEtlcmJlcm9zIGZ1bmN0aW9ucyAqLworICAgIHsgImtyYmlzdmFsaWQiLCAgICBGTl9LUkJfSVYsIDB9LAorICAgIHsgImtyYm5leHR0aWNrZXQiLCBGTl9LUkJfTlgsIDB9LAorICAgIHsgImtyYnRpY2tldHMiLCAgICBGTl9LUkJfVEssIDB9LAorICAgIHsgImtyYnRpbWVsZWZ0IiwgICBGTl9LUkJfVFQsIDB9LAorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisgICAgeyAibGVmdCIsICAgICAgIEZOX0xFRiwgIDB9LCAgICAgICAgLyogTGVmdG1vc3QgbiBjaGFyYWN0ZXJzIG9mIHN0cmluZyAqLworICAgIHsgImxlbmd0aCIsICAgICBGTl9MRU4sICAwfSwgICAgICAgIC8qIFJldHVybiBsZW5ndGggb2YgYXJndW1lbnQgKi8KKyAgICB7ICJsaXRlcmFsIiwgICAgRk5fTElULCAgMH0sICAgICAgICAvKiBSZXR1cm4gYXJndW1lbnQgbGl0ZXJhbGx5ICovCisjaWZkZWYgTlQKKyAgICB7ICJsb25ncGF0aG5hbWUiLEZOX0xOQU1FLDB9LAkvKiBHZXRMb25nUGF0aE5hbWUoKSAqLworI2Vsc2UKKyAgICB7ICJsb25ncGF0aG5hbWUiLEZOX0ZGTixDTV9JTlZ9LAorI2VuZGlmIC8qIE5UICovCisgICAgeyAibG9wIiwgICAgICAgIEZOX1NUTCwgIDB9LCAgICAgICAgLyogTG9wICovCisgICAgeyAibG93ZXIiLCAgICAgIEZOX0xPVywgIDB9LCAgICAgICAgLyogUmV0dXJuIGxvd2VyY2FzZWQgYXJndW1lbnQgKi8KKyAgICB7ICJscGFkIiwgICAgICAgRk5fTFBBLCAgMH0sICAgICAgICAvKiBSZXR1cm4gbGVmdC1wYWRkZWQgYXJndW1lbnQgKi8KKyAgICB7ICJsdHJpbSIsICAgICAgRk5fTFRSLCAgMH0sICAgICAgICAvKiBMZWZ0LVRyaW0gKi8KKyAgICB7ICJtYXhpbXVtIiwgICAgRk5fTUFYLCAgMH0sICAgICAgICAvKiBSZXR1cm4gbWF4aW11bSBvZiB0d28gYXJndW1lbnRzICovCisgICAgeyAibWluaW11bSIsICAgIEZOX01JTiwgIDB9LCAgICAgICAgLyogUmV0dXJuIG1pbmltdW0gb2YgdHdvIGFyZ3VtZW50cyAqLworICAgIHsgIm1qZCIsICAgICAgICBGTl9NSkQsICAwfSwgICAgICAgIC8qIERhdGUgdG8gTW9kaWZpZWQgSnVsaWFuIERhdGUgKi8KKyAgICB7ICJtamQyZGF0ZSIsICAgRk5fTUpEMiwgMH0sICAgICAgICAvKiBNSkQgdG8gRGF0ZSAqLworICAgIHsgIm1qZHRvZGF0ZSIsICBGTl9NSkQyLCBDTV9JTlZ9LCAgIC8qIE1KRCB0byBEYXRlICovCisgICAgeyAibW9kdWx1cyIsICAgIEZOX01PRCwgIDB9LCAgICAgICAgLyogUmV0dXJuIG1vZHVsdXMgb2YgdHdvIGFyZ3VtZW50cyAqLworI2lmZGVmIENPTU1FTlQKKyAgICB7ICJtc2xlZXAiLCAgICAgRk5fTVNMRUVQLDB9LCAgICAgICAvKiBTbGVlcCBmb3IgbiBtaWxsaXNlY29uZHMgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgeyAibjJoZXgiLCAgICAgIEZOXzJIRVgsIENNX0lOVn0sICAgLyogTnVtYmVyIHRvIGhleCAqLworICAgIHsgIm4yb2N0YWwiLCAgICBGTl8yT0NULCBDTV9JTlZ9LCAgIC8qIE51bWJlciB0byBvY3RhbCAqLworICAgIHsgIm4ydGltZSIsICAgICBGTl9OMlRJTSwwfSwgICAgICAgIC8qIE51bWJlciB0byBoaDptbTpzcyAqLworI2lmZGVmIFRDUFNPQ0tFVAorICAgIHsgIm5hbWUyYWRkciIsICBGTl9IU1ROQU0sQ01fSU5WfSwgIC8qIEhvc3RuYW1lIHRvIElQIEFkZHJlc3MgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyAgICB7ICJuZGF5IiwgICAgICAgRk5fTkRBWSwgMH0sICAgICAgICAvKiBOdW1lcmljIGRheSBvZiB3ZWVrICovCisgICAgeyAibmV4dGZpbGUiLCAgIEZOX0ZJTCwgIDB9LCAgICAgICAgLyogTmV4dCBmaWxlIGluIGxpc3QgKi8KKyAgICB7ICJudGltZSIsICAgICAgRk5fTlRJTSwgMH0sICAgICAgICAvKiBUaW1lIHRvIHNlY29uZHMgc2luY2UgbWlkbmlnaHQgKi8KKyAgICB7ICJudG9oZXgiLCAgICAgRk5fMkhFWCwgQ01fSU5WfSwgICAvKiBOdW1iZXIgdG8gaGV4ICovCisgICAgeyAibnRvb2N0YWwiLCAgIEZOXzJPQ1QsIENNX0lOVn0sICAgLyogTnVtYmVyIHRvIG9jdGFsICovCisgICAgeyAibnRvdGltZSIsICAgIEZOX04yVElNLENNX0lOVn0sICAgLyogTnVtYmVyIHRvIGhoOm1tOnNzICovCisgICAgeyAib2N0Mm4iLCAgICAgIEZOX09DVDJOLENNX0lOVn0sICAgLyogT2N0YWwgdG8gZGVjaW1hbCBudW1iZXIgKi8KKyAgICB7ICJvY3R0b24iLCAgICAgRk5fT0NUMk4sQ01fSU5WfSwgICAvKiBPY3RhbCB0byBkZWNpbWFsIG51bWJlciAqLworICAgIHsgInBhdGhuYW1lIiwgICBGTl9GRk4sICAwfSwgICAgICAgIC8qIEZ1bGwgZmlsZSBuYW1lICovCisgICAgeyAicGF0dGVybiIsICAgIEZOX1BBVFRFUk4sIDB9LCAgICAgLyogUGF0dGVybiAoZm9yIElOUFVUKSAqLworI2lmZGVmIENLX1BFUk1TCisgICAgeyAicGVybWlzc2lvbnMiLEZOX1BFUk0sIDB9LCAgICAgICAgLyogUGVybWlzc2lvbnMgb2YgZmlsZSAqLworI2Vsc2UKKyAgICB7ICJwZXJtaXNzaW9ucyIsRk5fUEVSTSwgQ01fSU5WfSwgICAvKiBQZXJtaXNzaW9ucyBvZiBmaWxlICovCisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKyAgICB7ICJyYWRpeCIsICAgICAgRk5fUkFESVgsMH0sICAgICAgICAvKiBSYWRpeCBjb252ZXJzaW9uICovCisjaWZuZGVmIE5PUkFORE9NCisgICAgeyAicmFuZG9tIiwgICAgIEZOX1JBTkQsIDB9LCAgICAgICAgLyogUmFuZG9tIG51bWJlciAqLworI2VuZGlmIC8qIE5PUkFORE9NICovCisjaWZuZGVmIE5PUFVTSAorICAgIHsgInJhd2NvbW1hbmQiLCBGTl9SQVcsICAwfSwgICAgICAgIC8qIE91dHB1dCBmcm9tIGEgY29tbWFuZCAocmF3KSAqLworI2VuZGlmIC8qIE5PUFVTSCAqLworI2lmZGVmIFJFQ1VSU0lWRQorICAgIHsgInJkaXJlY3RvcmllcyIsIEZOX1JESVIsIDB9LCAgICAgIC8qIFJlY3Vyc2l2ZSBkaXJlY3RvcnkgbGlzdCAqLworICAgIHsgInJmaWxlcyIsICAgICAgIEZOX1JGSUwsIDB9LCAgICAgIC8qIFJlY3Vyc2l2ZSBmaWxlIGxpc3QgKi8KKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICB7ICJyZXAiLCAgICAgICAgRk5fUkVQLCBDTV9JTlZ8Q01fQUJSfSwKKyAgICB7ICJyZXBlYXQiLCAgICAgRk5fUkVQLCAgMH0sICAgICAgICAvKiBSZXBlYXQgYXJndW1lbnQgZ2l2ZW4gIyBvZiB0aW1lcyAqLworICAgIHsgInJlcGxhY2UiLCAgICBGTl9SUEwsICAwfSwgICAgICAgIC8qIFJlcGxhY2UgY2hhcmFjdGVycyBpbiBzdHJpbmcgKi8KKyAgICB7ICJyZXZlcnNlIiwgICAgRk5fUkVWLCAgMH0sICAgICAgICAvKiBSZXZlcnNlIHRoZSBhcmd1bWVudCBzdHJpbmcgKi8KKyAgICB7ICJyaWdodCIsICAgICAgRk5fUklHLCAgMH0sICAgICAgICAvKiBSaWdodG1vc3QgbiBjaGFyYWN0ZXJzIG9mIHN0cmluZyAqLworICAgIHsgInJpbmRleCIsICAgICBGTl9SSVgsICAwfSwgICAgICAgIC8qIFJpZ2h0IGluZGV4ICovCisgICAgeyAicnBhZCIsICAgICAgIEZOX1JQQSwgIDB9LCAgICAgICAgLyogUmlnaHQtcGFkIHRoZSBhcmd1bWVudCAqLworICAgIHsgInJzZWFyY2giLCAgICBGTl9SU0VBUkNILCAwfSwgICAgIC8qIFItTCBTZWFyY2ggZm9yIHBhdHRlcm4gaW4gc3RyaW5nICovCisjaWZkZWYgT1MyCisgICAgeyAic2NybmN1cngiLCAgIEZOX1NDUk5fQ1gsICAwfSwgICAgLyogU2NyZWVuIEN1cnNvciBYIFBvcyAqLworICAgIHsgInNjcm5jdXJ5IiwgICBGTl9TQ1JOX0NZLCAgMH0sICAgIC8qIFNjcmVlbiBDdXJzb3IgWSBQb3MgKi8KKyAgICB7ICJzY3Juc3RyIiwgICAgRk5fU0NSTl9TVFIsIDB9LCAgICAvKiBTY3JlZW4gU3RyaW5nICovCisjZW5kaWYgLyogT1MyICovCisgICAgeyAic2VhcmNoIiwgICAgIEZOX1NFQVJDSCwgMH0sICAgICAgLyogTC1SIFNlYXJjaCBmb3IgcGF0dGVybiBpbiBzdHJpbmcgKi8KKyNpZm5kZWYgTk9TRVhQCisgICAgeyAic2V4cHJlc3Npb24iLEZOX1NFWFAsIDB9LCAgICAgICAgLyogUy1FeHByZXNzaW9uICovCisjZW5kaWYgLyogTk9TRVhQICovCisjaWZkZWYgTlQKKyAgICB7ICJzaG9ydHBhdGhuYW1lIixGTl9TTkFNRSwwfSwJLyogR2V0U2hvcnRQYXRoTmFtZSgpICovCisjZWxzZQorICAgIHsgInNob3J0cGF0aG5hbWUiLEZOX0ZGTixDTV9JTlZ9LAorI2VuZGlmIC8qIE5UICovCisgICAgeyAic2l6ZSIsICAgICAgIEZOX0ZTLCAgIDB9LCAgICAgICAgLyogRmlsZSBzaXplICovCisjaWZkZWYgQ09NTUVOVAorICAgIHsgInNsZWVwIiwgICAgICBGTl9TTEVFUCwwfSwgICAgICAgIC8qIFNsZWVwIGZvciBuIHNlY29uZHMgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgeyAic3BhbiIsICAgICAgIEZOX1NQTiwgIDB9LCAgICAgICAgLyogU3BhbiAtIGxpa2UgU25vYm9sICovCisgICAgeyAic3BsaXQiLCAgICAgIEZOX1NQTElULDB9LCAgICAgICAgLyogU3BsaXQgc3RyaW5nIGludG8gd29yZHMgKi8KKyAgICB7ICJzdHJpcGIiLCAgICAgRk5fU1RCLCAgMH0sICAgICAgICAvKiBTdHJpcCBlbmNsb3NpbmcgYnJhY2VzL2JyYWNrZXRzICovCisgICAgeyAic3RyaXBuIiwgICAgIEZOX1NUTiwgIDB9LCAgICAgICAgLyogU3RyaXAgbiBjaGFycyAqLworICAgIHsgInN0cmlweCIsICAgICBGTl9TVFgsICAwfSwgICAgICAgIC8qIFN0cmlwIHN1ZmZpeCAqLworICAgIHsgInN1IiwgICAgICAgICBGTl9TVUIsICBDTV9JTlZ8Q01fQUJSfSwKKyAgICB7ICJzdWIiLCAgICAgICAgRk5fU1VCLCAgQ01fSU5WfENNX0FCUn0sCisgICAgeyAic3VicyIsICAgICAgIEZOX1NVQiwgIENNX0lOVnxDTV9BQlJ9LAorICAgIHsgInN1YnN0IiwgICAgICBGTl9TVUIsICBDTV9JTlZ8Q01fQUJSfSwKKyAgICB7ICJzdWJzdGl0dXRlIiwgRk5fU1VCU1QsMH0sICAgICAgICAvKiBTdWJzdGl0dXRlIGNoYXJzICovCisgICAgeyAic3Vic3RyaW5nIiwgIEZOX1NVQiwgIDB9LCAgICAgICAgLyogRXh0cmFjdCBzdWJzdHJpbmcgZnJvbSBhcmd1bWVudCAqLworICAgIHsgInRhYmxlbG9vayIsICBGTl9UTE9PSywwfSwgICAgICAgIC8qIFRhYmxlIGxvb2t1cCAqLworICAgIHsgInRpbWUiLCAgICAgICBGTl9USU1FLCAwfSwgICAgICAgIC8qIEZyZWUtZm9ybWF0IHRpbWUgdG8gaGg6bW06c3MgKi8KKyAgICB7ICJ0b2Qyc2VjcyIsICAgRk5fTlRJTSwgQ01fSU5WfSwgICAvKiBUaW1lLW9mLWRheS10by1zZWNzLXNpbmNlLW1pZG5pdGUgKi8KKyAgICB7ICJ0b2R0b3NlY3MiLCAgRk5fTlRJTSwgQ01fSU5WfSwgICAvKiBUaW1lLW9mLWRheS10by1zZWNzLXNpbmNlLW1pZG5pdGUgKi8KKyAgICB7ICJ0cmltIiwgICAgICAgRk5fVFJNLCAgMH0sICAgICAgICAvKiBUcmltICovCisgICAgeyAidW5oZXhpZnkiLCAgIEZOX1VOSCwgIDB9LCAgICAgICAgLyogVW5oZXhpZnkgKi8KKyAgICB7ICJ1bml4MmRvc3BhdGgiLEZOX1BDX1VELCAwfSwgICAgICAvKiBVTklYIHRvIERPUyBwYXRoICovCisgICAgeyAidW5peHRvZG9zcGF0aCIsRk5fUENfVUQsIENNX0lOVn0sIC8qIFVOSVggdG8gRE9TIHBhdGggKi8KKyAgICB7ICJ1bnRhYmlmeSIsICAgRk5fVU5UQUIsMH0sICAgICAgICAvKiBVbnRhYmlmeSAqLworICAgIHsgInVwcGVyIiwgICAgICBGTl9VUFAsICAwfSwgICAgICAgIC8qIFJldHVybiB1cHBlcmNhc2VkIGFyZ3VtZW50ICovCisgICAgeyAidXRjZGF0ZSIsICAgIEZOX1RPR01ULDB9LCAgICAgICAgLyogRGF0ZS10aW1lIHRvIFVUQyAoR01UKSAqLworICAgIHsgInZlcmlmeSIsICAgICBGTl9WRVIsICAwfSwgICAgICAgIC8qIFZlcmlmeSAqLworICAgIHsgIndvcmQiLCAgICAgICBGTl9XT1JELCAwfSwgICAgICAgIC8qIEV4dHJhY3QgYSB3b3JkICovCisgICAgeyAiIiwgMCwgMH0KK307CitpbnQgbmZ1bmNzID0gKHNpemVvZihmbmN0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT1NQTCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBmb3IgZXhwYW5zaW9uIG9mICovCisjaWZkZWYgQklHQlVGT0sgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbHQtaW4gdmFyaWFibGVzLiAqLworI2RlZmluZSBWVkJVRkwgMTAyNAorI2Vsc2UKKyNkZWZpbmUgVlZCVUZMIDI1NgorI2VuZGlmIC8qIEJJR0JVRk9LICovCitjaGFyIHZ2YnVmW1ZWQlVGTCsxXTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCitzdHJ1Y3Qga2V5dGFiIGRpc3B0YltdID0geyAgICAgICAgICAgICAgLyogTG9nIGZpbGUgZGlzcG9zaXRpb24gKi8KKyAgICB7ICJhcHBlbmQiLCAgICAxLCAgMH0sCisgICAgeyAibmV3IiwgICAgICAgMCwgIDB9Cit9OworCisjaWZkZWYgQ0tGTE9BVAorCisvKiBJIE4gSSBUIEYgTCBPIEEgVCAgLS0gIERlZHVjZSBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gYnkgaW5zcGVjdGlvbiAqLworCitpbnQgZnBfcm91bmRpbmcgPSAwOyAgICAgICAgICAgICAgICAvKiBOb256ZXJvIGlmIHByaW50ZigiJWYiKSByb3VuZHMgKi8KK2ludCBmcF9kaWdpdHMgPSAwOyAgICAgICAgICAgICAgICAgIC8qIERpZ2l0cyBvZiBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gKi8KKworI2lmZGVmIENPTU1FTlQKKy8qIEZvciBsb29raW5nIGF0IGludGVybmFsIGZsb2F0aW5nLXBvaW50IHJlcHJlc2VudGF0aW9ucyAqLworc3RhdGljIGNoYXIgZnBfeGJ1ZlsxMjhdOworc3RhdGljIGNoYXIgKgordG9oZXgocywgbikgQ0hBUiAqIHM7IGludCBuOyB7CisgICAgaW50IHg7CisgICAgY2hhciAqIHAgPSBmcF94YnVmOworICAgIHdoaWxlIChuLS0gPiAwKSB7CisgICAgICAgIHggPSAoKnMgPj4gNCkgJiAweDBmOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRzW3hdOworICAgICAgICB4ID0gKnMrKyAmIDB4MGY7CisgICAgICAgICpwKysgPSBoZXhkaWdpdHNbeF07CisgICAgfQorICAgICpwID0gTlVMOworICAgIHJldHVybigoY2hhciAqKWZwX3hidWYpOworfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworY2hhciBtYXRoX3BpW10gPSAiMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1IjsKK2NoYXIgbWF0aF9lW10gPSAgIjIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNyI7CisKK1ZPSUQKK2luaXRmbG9hdCgpIHsKKyAgICBjaGFyICogYnVmID0gTlVMTDsKKyAgICBpbnQgaSwgeCwgeTsKKy8qCisgIFdlIG1hbGxvYyBhIGJpZyB0ZW1wb3JhcnkgYnVmZmVyIGZvciBzcHJpbnRmKCkgdG8gbWluaW1pemUgbGlrZWxpaG9vZCBvZgorICAoYW5kIGRhbWFnZSBmcm9tKSBzcHJpbnRmIGJ1ZmZlciBvdmVyZmxvd3MuICBJbiBhbnkgY2FzZSwgdGhlIG9ubHkgd2F5IHRoaXMKKyAgY291bGQgaGFwcGVuIHdvdWxkIGJlIGlmIHNwcmludGYoKSBpdHNlbGYgaGFkIGJ1Z3MsIHNpbmNlIHRoZSBmb3JtYXQKKyAgZGVzY3JpcHRvciBzYXlzIHRvIGN1dCBpdCBvZmYgYXQgMjUwIGRlY2ltYWwgcGxhY2VzLgorKi8KKyAgICBpZiAoKGJ1ZiA9IChjaGFyICopbWFsbG9jKDQwOTYpKSkgeworICAgICAgICBzcHJpbnRmKGJ1ZiwiJTAuMjUwZiIsKDEwLjAgLyAzLjApKTsKKyAgICAgICAgZm9yIChpID0gMjsgaSA8IDI1MCAmJiBidWZbaV0gPT0gJzMnOyBpKyspIDsKKyAgICAgICAgeCA9IGkgLSAxOworICAgICAgICBkZWJ1ZyhGMTExLCJpbml0ZmxvYXQgMTAuMC8zLjAiLGJ1Zix4KTsKKyAgICAgICAgc3ByaW50ZihidWYsIiUwLjI1MGYiLCg0LjAgLyA5LjApKTsKKyAgICAgICAgZm9yIChpID0gMjsgaSA8IDI1MCAmJiBidWZbaV0gPT0gJzQnOyBpKyspIDsKKyAgICAgICAgeSA9IGkgLSAxOworICAgICAgICBkZWJ1ZyhGMTExLCJpbml0ZmxvYXQgNC4wLzkuMCIsYnVmLHkpOworICAgICAgICBmcF9kaWdpdHMgPSAoeCA8IHkpID8geCA6IHk7CisgICAgICAgIGlmIChmcF9kaWdpdHMgPCBzaXplb2YobWF0aF9waSkgLSAxKSB7CisgICAgICAgICAgICBtYXRoX3BpW2ZwX2RpZ2l0cysxXSA9IE5VTDsKKyAgICAgICAgICAgIG1hdGhfZVtmcF9kaWdpdHMrMV0gPSBOVUw7CisgICAgICAgIH0KKyAgICAgICAgc3ByaW50ZihidWYsIiUwLjZmIiwoNy4wIC8gOS4wKSk7CisgICAgICAgIGlmIChidWZbN10gPT0gJzgnKSBmcF9yb3VuZGluZyA9IDE7CisgICAgICAgIGRlYnVnKEYxMTEsImluaXRmbG9hdCA3LjAvOS4wIixidWYsZnBfcm91bmRpbmcpOworICAgICAgICBkZWJ1ZyhGMTAxLCJpbml0ZmxvYXQgcHJlY2lzaW9uIiwiIixmcF9kaWdpdHMpOworICAgICAgICBmcmVlKGJ1Zik7CisgICAgfQorfQorI2VuZGlmIC8qIENLRkxPQVQgKi8KKworLyoKKyAgUCBSIEUgUyBDIEEgTiAtLSBBIHF1aWNrIGxvb2sgdGhyb3VnaCB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yCisgIGl0ZW1zIHRoYXQgbXVzdCBiZSBoYW5kbGVkIGJlZm9yZSB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZSBpcyBleGVjdXRlZC4KKyovCisjaWZkZWYgTlQKK2V4dGVybiBpbnQgU3RhcnRlZEZyb21EaWFsZXI7CisjZW5kaWYgLyogTlQgKi8KKyNpZmRlZiBPUzIKK2V4dGVybiBpbnQgazk1c3RkaW87Cit1bnNpZ25lZCBsb25nIHN0YXJ0ZmxhZ3MgPSAwTDsKKyNlbmRpZiAvKiBPUzIgKi8KKworc3RhdGljIGNoYXIgKgorZmluZGlucGF0aChhcmcpIGNoYXIgKiBhcmc7IHsKKyNpZmRlZiBPUzIKKyAgICBjaGFyICogc2NyaXB0ZW52LCAqIGtleW1hcGVudjsKKyAgICBpbnQgbGVuOworI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIERDTURCVUYKKyAgICBleHRlcm4gY2hhciAqIGNtZGJ1ZjsKKyNlbHNlCisgICAgZXh0ZXJuIGNoYXIgY21kYnVmW107CisjZW5kaWYgLyogRENNREJVRiAqLworICAgIGNoYXIgdGFrZXBhdGhbNDA5Nl07CisgICAgY2hhciAqIHM7CisgICAgaW50IHgsIHo7CisKKyAgICAvKiBTZXQgdXAgc2VhcmNoIHBhdGguLi4gKi8KKyNpZmRlZiBPUzIKKyAgICBjaGFyICogYXBwZGF0YTAgPSBOVUxMLCAqYXBwZGF0YTEgPSBOVUxMOworI2lmZGVmIE5UCisgICAgc2NyaXB0ZW52ID0gZ2V0ZW52KCJLOTVTQ1JJUFRTIik7CisgICAga2V5bWFwZW52ID0gZ2V0ZW52KCJLOTVLRVlNQVBTIik7CisgICAgbWFrZXN0cigmYXBwZGF0YTAsKGNoYXIgKilHZXRBcHBEYXRhKDApKTsKKyAgICBtYWtlc3RyKCZhcHBkYXRhMSwoY2hhciAqKUdldEFwcERhdGEoMSkpOworI2Vsc2UgLyogTlQgKi8KKyAgICBzY3JpcHRlbnYgPSBnZXRlbnYoIksyU0NSSVBUUyIpOworICAgIGtleW1hcGVudiA9IGdldGVudigiSzJLRVlNQVBTIik7CisjZW5kaWYgLyogTlQgKi8KKyAgICBpZiAoIXNjcmlwdGVudikKKyAgICAgIHNjcmlwdGVudiA9IGdldGVudigiQ0tfU0NSSVBUUyIpOworICAgIGlmICghc2NyaXB0ZW52KQorICAgICAgc2NyaXB0ZW52ID0gIiI7CisgICAgaWYgKCFrZXltYXBlbnYpCisgICAgICBrZXltYXBlbnYgPSBnZXRlbnYoIkNLX0tFWU1BUFMiKTsKKyAgICBpZiAoIWtleW1hcGVudikKKyAgICAgIGtleW1hcGVudiA9ICIiOworCisgICAgZGVidWcoRjExMCwic3RhcnR1cGRpciIsc3RhcnR1cGRpciwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJjb21tb24gYXBwZGF0YSBkaXJlY3RvcnkiLGFwcGRhdGExLDApOworICAgIGRlYnVnKEYxMTAsImFwcGRhdGEgZGlyZWN0b3J5IixhcHBkYXRhMCwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJpbmlkaXIiLGluaWRpciwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJob21lIix6aG9tZSgpLDApOworICAgIGRlYnVnKEYxMTAsImV4ZWRpciIsZXhlZGlyLDApOworCisgICAgbGVuID0gc3RybGVuKHNjcmlwdGVudikgKyBzdHJsZW4oa2V5bWFwZW52KSArIDMqc3RybGVuKHN0YXJ0dXBkaXIpCisgICAgICAgICsgMypzdHJsZW4oaW5pZGlyKSArIDMqc3RybGVuKHpob21lKCkpICsgMypzdHJsZW4oZXhlZGlyKQorICAgICAgICArIChhcHBkYXRhMCA/IDMqc3RybGVuKGFwcGRhdGEwKSA6IDApIAorICAgICAgICArIChhcHBkYXRhMSA/IDMqc3RybGVuKGFwcGRhdGExKSA6IDApCisgICAgICAgICsgNipzdHJsZW4oIlNDUklQVFMvIikgKyA2KnN0cmxlbigiS0VZTUFQUy8iKSArIDE2OworCisgICAgaWYgKGxlbiA+PSA0MDk2KSB7ICAgICAgICAgICAgICAgICAgLyogU0FGRSAobGVuZ3RoIGlzIGNoZWNrZWQpICovCisgICAgICAgIHRha2VwYXRoWzBdID0gJ1wwJzsKKyAgICAgICAgZGVidWcoRjExMSwiZmluZGlucGF0aCBlcnJvciAtIHBhdGggbGVuZ3RoIHRvbyBsb25nIiwibGVuIixsZW4pOworICAgIH0gZWxzZQorICAgICAgc3ByaW50Zih0YWtlcGF0aCwKKyAgICAgICAgICAgICAgLyogc2VtaWNvbG9uLXNlcGFyYXRlZCBwYXRoIGxpc3QgKi8KKyAgICAiJXMlcyVzJXMlczslcyVzOyVzJXM7JXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXM7JXMlczslcyVzOyVzOyVzJXM7JXMlcyIsCisgICAgICAgICAgICAgIHNjcmlwdGVudiwKKyAgICAgICAgICAgICAgKHNjcmlwdGVudlswXSAmJiBzY3JpcHRlbnZbc3RybGVuKHNjcmlwdGVudiktMV09PSc7Jyk/IiI6IjsiLAorICAgICAgICAgICAgICBrZXltYXBlbnYsCisgICAgICAgICAgICAgIChrZXltYXBlbnZbMF0gJiYga2V5bWFwZW52W3N0cmxlbihrZXltYXBlbnYpLTFdPT0nOycpPyIiOiI7IiwKKyAgICAgICAgICAgICAgc3RhcnR1cGRpciwKKyAgICAgICAgICAgICAgc3RhcnR1cGRpciwgIlNDUklQVFMvIiwKKyAgICAgICAgICAgICAgc3RhcnR1cGRpciwgIktFWU1BUFMvIiwKKyAgICAgICAgICAgICAgYXBwZGF0YTEgPyBhcHBkYXRhMSA6ICIiLCAKKyAgICAgICAgICAgICAgYXBwZGF0YTEgPyAiS2VybWl0IDk1OyIgOiAiIiwKKyAgICAgICAgICAgICAgYXBwZGF0YTEgPyBhcHBkYXRhMSA6ICIiLAorICAgICAgICAgICAgICBhcHBkYXRhMSA/ICJLZXJtaXQgOTUvU0NSSVBUUy87IiA6ICIiLAorICAgICAgICAgICAgICBhcHBkYXRhMSA/IGFwcGRhdGExIDogIiIsCisgICAgICAgICAgICAgIGFwcGRhdGExID8gIktlcm1pdCA5NS9LRVlNQVBTLzsiIDogIiIsCisgICAgICAgICAgICAgIGFwcGRhdGEwID8gYXBwZGF0YTAgOiAiIiwKKyAgICAgICAgICAgICAgYXBwZGF0YTAgPyAiS2VybWl0IDk1OyIgOiAiIiwKKyAgICAgICAgICAgICAgYXBwZGF0YTAgPyBhcHBkYXRhMCA6ICIiLAorICAgICAgICAgICAgICBhcHBkYXRhMCA/ICJLZXJtaXQgOTUvU0NSSVBUUy87IiA6ICIiLAorICAgICAgICAgICAgICBhcHBkYXRhMCA/IGFwcGRhdGEwIDogIiIsCisgICAgICAgICAgICAgIGFwcGRhdGEwID8gIktlcm1pdCA5NS9LRVlNQVBTLzsiIDogIiIsCisgICAgICAgICAgICAgIGluaWRpciwKKyAgICAgICAgICAgICAgaW5pZGlyLCAiU0NSSVBUUy8iLAorICAgICAgICAgICAgICBpbmlkaXIsICJLRVlNQVBTLyIsCisgICAgICAgICAgICAgIHpob21lKCksCisgICAgICAgICAgICAgIHpob21lKCksICJTQ1JJUFRTLyIsCisgICAgICAgICAgICAgIHpob21lKCksICJLRVlNQVBTLyIsCisgICAgICAgICAgICAgIGV4ZWRpciwKKyAgICAgICAgICAgICAgZXhlZGlyLCAiU0NSSVBUUy8iLAorICAgICAgICAgICAgICBleGVkaXIsICJLRVlNQVBTLyIKKyAgICAgICAgICAgICAgKTsKKyAgICBkZWJ1ZyhGMTEwLCJmaW5kaW5wYXRoIHRha2VwYXRoIix0YWtlcGF0aCwwKTsKKyNpZmRlZiBOVAorICAgIG1ha2VzdHIoJmFwcGRhdGEwLE5VTEwpOworICAgIG1ha2VzdHIoJmFwcGRhdGExLE5VTEwpOworI2VuZGlmIC8qIE5UICovCisjZWxzZSAvKiBub3QgT1MyICovCisjaWZuZGVmIE5PU1BMCisgICAgeiA9IDEwMjQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9vayBpbiBob21lIGRpcmVjdG9yeSAqLworICAgIHMgPSB0YWtlcGF0aDsKKyAgICB6enN0cmluZygiXFx2KGhvbWUpIiwmcywmeik7CisjZWxzZQorICAgIHRha2VwYXRoWzBdID0gJ1wwJzsKKyNlbmRpZiAvKiBOT1NQTCAqLworI2VuZGlmIC8qIE9TMiAqLworLyoKKyAgQWxsIHRoZSBsb2dpYyBmb3Igc2VhcmNoaW5nIHRoZSB0YWtlIHBhdGggaXMgaW4gdGhlIGNvbW1hbmQgcGFyc2VyLgorICBTbyBldmVuIHRob3VnaCB3ZSBhcmVuJ3QgcGFyc2luZyBjb21tYW5kcywgd2UgaW5pdGlhbGl6ZSBhbmQgY2FsbCB0aGUKKyAgcGFyc2VyIGZyb20gaGVyZSwgd2l0aCB0aGUgcHVycG9ydGVkIGZpbGVuYW1lIHN0dWZmZWQgaW50byB0aGUgY29tbWFuZAorICBidWZmZXIsIGZvbGxvd2VkIGJ5IHNvbWUgY2FycmlhZ2UgcmV0dXJucyB0byBtYWtlIHRoZSBwYXJzZXIgcmV0dXJuLgorICBJZiB0aGUgZmlsZSBpcyBub3QgZm91bmQsIG9yIG90aGVyd2lzZSBub3QgYWNjZXNzaWJsZSwgdGhlIHBhcnNlciBwcmludHMKKyAgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZSwgYW5kIHRoZW4gd2UganVzdCBleGl0LgorKi8KKyAgICBjbWRpbmkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBjb21tYW5kIGJ1ZmZlcnMgZXRjICovCisgICAgY21pbmkoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGVtICovCisgICAgLyogU3R1ZmYgZmlsZW5hbWUgaW50byBjb21tYW5kIGJ1ZiB3aXRoIGJyYWNlcyBpbiBjYXNlIG9mIHNwYWNlcyAqLworICAgIGNrbWFrbXNnKGNtZGJ1ZixDTURCTCwieyIsYXJnLCJ9IixOVUxMKTsKKyAgICBkZWJ1ZyhGMTEwLCJmaW5kaW5wYXRoIGNtZGJ1ZiIsY21kYnVmLDApOworICAgIGNrc3RybmNhdChjbWRidWYsIlxyXHIiLENNREJMKTsgICAgIC8qIEFuZCBzb21lIGNhcnJpYWdlIHJldHVybnMgKi8KKyAgICBpZiAoY21pZmlwKCIiLCIiLCZzLCZ4LDAsdGFrZXBhdGgseHhzdHJpbmcpIDwgMCkKKyAgICAgIHJldHVybihOVUxMKTsKKyAgICBjbXJlcygpOworICAgIHJldHVybihzKTsKK30KKworc3RhdGljIGludCB0cl9pbnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgaWYgVFJBTlNNSVQgaW50ZXJydXB0ZWQgKi8KKworI2lmbmRlZiBNQUMKK1NJR1RZUAorI2lmZGVmIENLX0FOU0lDCit0cnRyYXAoaW50IGZvbykgICAgICAgICAgICAgICAgICAgICAgICAgLyogVFJBTlNNSVQgaW50ZXJydXB0IHRyYXAgKi8KKyNlbHNlCit0cnRyYXAoZm9vKSBpbnQgZm9vOyAgICAgICAgICAgICAgICAgICAgLyogVFJBTlNNSVQgaW50ZXJydXB0IHRyYXAgKi8KKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdHJ0cmFwICovIHsKKyNpZmRlZiBfX0VNWF9fCisgICAgc2lnbmFsKFNJR0lOVCwgU0lHX0FDSyk7CisjZW5kaWYKKyAgICB0cl9pbnQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoTmVlZCBhcmcgZm9yIEFOU0kgQykgKi8KKyAgICBTSUdSRVRVUk47Cit9CisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKworI2lmZGVmIFVOSVgKK1ZPSUQKK2dldGV4ZWRpcigpIHsKKyAgICBleHRlcm4gY2hhciAqIHhhcmcwOworICAgIGxvbmcgeHg7CisgIC8qCisgICAgVW5peCBwcm92aWRlcyBubyBzdGFuZGFyZCBzZXJ2aWNlIGZvciB0aGlzLiAgV2UgbG9vayBpbiBhcmd2WzBdLCBhbmQgaWYKKyAgICB3ZSdyZSBsdWNreSB0aGVyZSdzIGEgZnVsbCBwYXRobmFtZS4gIElmIG5vdCB3ZSBkbyBhIFBBVEggc2VhcmNoLgorICAqLworICAgIGlmIChja3N0cmNocih4YXJnMCwnLycpKSB7ICAgICAgICAgIC8qIEdsb2JhbCBjb3B5IG9mIGFyZ3ZbMF0gKi8KKyAgICAgICAgaW50IGksIGs7CisgICAgICAgIGNoYXIgKiBwID0gTlVMTDsKKyAgICAgICAgaWYgKChrID0gY2tzdHJuY3B5KHRtcGJ1Zix4YXJnMCxUTVBCVUZTSVotMikpID4gMCkgeworICAgICAgICAgICAgcCA9IHRtcGJ1ZjsKKyAgICAgICAgICAgIC8qIENvbnZlcnQgdG8gZnVsbHkgcXVhbGlmaWVkIHBhdGhuYW1lICovCisgICAgICAgICAgICBpZiAodG1wYnVmWzBdKSBpZiAodG1wYnVmWzBdICE9ICcvJykgeworICAgICAgICAgICAgICAgIGxpbmVbMF0gPSBOVUw7CisgICAgICAgICAgICAgICAgemZucWZwKHRtcGJ1ZixMSU5CVUZTSVotMiwoY2hhciAqKWxpbmUpOworICAgICAgICAgICAgICAgIGlmIChsaW5lWzBdKQorICAgICAgICAgICAgICAgICAgcCA9IGxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4eCA9IHpjaGtpKHApOworICAgICAgICAgICAgaWYgKHh4ID4gLTEpIHsJCS8qIElzIHRoZSByZXN1bHQgYW4gZXhpc3RpbmcgZmlsZT8gKi8KKyAgICAgICAgICAgICAgICBrID0gc3RybGVuKHApOworICAgICAgICAgICAgICAgIGZvciAoaSA9IGstMTsgaSA+IDA7IGktLSkgeyAvKiBZZXMsIHN0cmlwIG5hbWUgcGFydCAqLworICAgICAgICAgICAgICAgICAgICBpZiAocFtpXSA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgay0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwW2krMV0gPSBOVUw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkgICAgbWFrZXN0cigmZXhlZGlyLHApOwkJLyogU2F2ZSB0aGUgcmVzdWx0ICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFleGVkaXIgJiYgeGFyZzApIHsgICAgICAgICAgICAgLyogTm90IGZvdW5kPyAqLworICAgICAgICBjaGFyICogcDsKKyAgICAgICAgcCA9IGdldGVudigiUEFUSCIpOyAgICAgICAgICAgICAvKiBTZWFyY2ggdGhlIFBBVEggKi8KKyAgICAgICAgaWYgKHApIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBvbmUuLi4gKi8KKyAgICAgICAgICAgIGNoYXIgKiBxLCAqIFBBVEggPSBOVUxMOworICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICBtYWtlc3RyKCZQQVRILHApOyAgICAgICAgICAgLyogUG9rZWFibGUgY29weSBvZiBQQVRIIHN0cmluZyAqLworICAgICAgICAgICAgaWYgKFBBVEgpIHsgICAgICAgICAgICAgICAgIC8qIElmIG1hbGxvYyBzdWNjZWVkZWQuLi4gKi8KKyAgICAgICAgICAgICAgICBwID0gUEFUSDsKKyAgICAgICAgICAgICAgICB3aGlsZSAocCAmJiAqcCkgeyAgICAgICAgLyogTG9vcCB0aHJvdWdoIHNlZ21lbnRzICovCisgICAgICAgICAgICAgICAgICAgIHEgPSBja3N0cmNocihwLCc6Jyk7IC8qIEVuZCBvZiB0aGlzIHNlZ21lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHEgPT0gcCkgeyAgICAgICAvKiBOdWxsIFBBVEggc2VnbWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcCsrOyAgICAgICAgICAgIC8qIFNraXAgb3ZlciBjb2xvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHEpICAgICAgICAgICAgICAvKiBJZiBub3QgYXQgZW5kIG9mIFBBVEggc3RyaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IE5VTDsgICAgICAgLyogemVybyBvdXQgdGhlIGNvbG9uICovCisgICAgICAgICAgICAgICAgICAgIGlmICgoayA9IGNrc3RybmNweSh0bXBidWYscCxUTVBCVUZTSVopKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXBidWZbay0xXSAhPSAnLycpIHsgLyogQ29weSB0aGlzIFBBVEggc2VnbWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGJ1ZltrKytdID0gJy8nOyAgICAvKiBBcHBlbmQgJy8nIGlmIG5lZWRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGJ1ZltrXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFwcGVuZCB0aGUgYXJndlswXSB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNrc3RybmNweSgmdG1wYnVmW2tdLHhhcmcwLFRNUEJVRlNJWikgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpjaGtpKHRtcGJ1ZikgPiAtMSkgeyAvKiBGaWxlIGV4aXN0cz8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wYnVmW2tdID0gTlVMOyAgICAgIC8qIFllcywgd2UncmUgZG9uZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Zm5xZnAodG1wYnVmLExJTkJVRlNJWiwoY2hhciAqKWxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZleGVkaXIsbGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBwID0gcTsgICAgICAgICAgICAgIC8qIE5vdCBmb3VuZCwgZ28gdG8gbmV4dCBzZWdtZW50ICAqLworICAgICAgICAgICAgICAgIH0gLyogd2hpbGUgKi8KKyAgICAgICAgICAgICAgICBmcmVlKFBBVEgpOyAgICAgICAgICAgICAvKiBGcmVlIFBBVEggY29weSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZXhlZGlyKSB7ICAgICAgICAgICAgICAgICAgLyogU3RpbGwgbm90aGluZz8gKi8KKyAgICAgICAgICAgIGlmICh6Y2hraSh4YXJnMCkgPiAtMSkgeyAgICAvKiBNYXliZSBpdCdzIGluIHRoZSBjdXJyZW50IGRpciAqLworICAgICAgICAgICAgICAgIHpmbnFmcCh6Z3RkaXIoKSxMSU5CVUZTSVosKGNoYXIgKilsaW5lKTsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZleGVkaXIsbGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFleGVkaXIpIHsgICAgICAgICAgICAgICAgICAgICAgLyogU3RpbGwgbm90aGluZz8gKi8KKyAgICAgICAgbWFrZXN0cigmZXhlZGlyLCIvIik7ICAgICAgICAgICAvKiBGYWtlIGl0IHdpdGggd2l0aCByb290LiAqLworICAgIH0KK30KKyNlbmRpZiAvKiBVTklYICovCisKK2ludCBhcmdfeCA9IDA7CitzdGF0aWMgaW50IHhfcHJlc2NhbiA9IDA7CisKKy8qCisgIFRoZSBhcmd1bWVudCB5IG9uY2UgbWVhbnQgc29tZXRoaW5nIGJ1dCBJIGNhbid0IGltYWdpbmUgd2hhdCBzbyBub3cKKyAgaXQncyBpZ25vcmVkLiAgKFByaW9yIHRvIDIyIEF1ZyA5OCwgcHJlc2NhbigpIHdhcyBjYWxsZWQgdHdpY2UgYnkgbWFpbigpLAorICBhbmQgdGhlIGFyZyBkaWZmZXJlbnRpYXRlZCB0aGUgdHdvIGNhbGxzLiAgQnV0IHRoaXMgY2F1c2VkIGFsbCBzb3J0cyBvZgorICBwcm9ibGVtcyAmIGNvbmZ1c2lvbiwgc28gSSBjb21tZW50ZWQgb3V0IHRoZSBzZWNvbmQgY2FsbC4gIFRoaXMgaXNzdWUgbWlnaHQKKyAgbmVlZCB0byBiZSByZXZpc2l0ZWQuKQorKi8KK1ZPSUQKK3ByZXNjYW4oZHVtbXkpIGludCBkdW1teTsgeyAgICAgICAgICAgICAvKiBBcmcgaXMgaWdub3JlZC4gKi8KKyAgICBleHRlcm4gaW50IGhvd2NhbGxlZDsKKyAgICBpbnQgeWFyZ2M7IGNoYXIgKip5YXJndjsKKyAgICBjaGFyIHg7CisgICAgY2hhciAqeXAsICp5eTsKKyNpZmRlZiBERUJVRworICAgIGludCBkZWJjb3VudCA9IDA7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICBpbnQgejsKKworICAgIGlmICh4X3ByZXNjYW4pICAgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgcnVuIG9uY2UgKi8KKyAgICAgIHJldHVybjsKKyAgICB4X3ByZXNjYW4gPSAxOworCisgICAgeWFyZ2MgPSB4YXJnYzsgICAgICAgICAgICAgICAgICAgICAgLyogTWFrZSBjb3B5IG9mIGFyZyB2ZWN0b3IgKi8KKyAgICB5YXJndiA9IHhhcmd2OworCisjaWZuZGVmIE5PSUNQCisjaWZkZWYgRENNREJVRgorICAgIGlmICgha2VybXJjKQorICAgICAgaWYgKCEoa2VybXJjID0gKGNoYXIgKikgbWFsbG9jKEtFUk1SQ0wrMSkpKQorICAgICAgICBmYXRhbCgicHJlc2Nhbjogbm8gbWVtb3J5IGZvciBrZXJtcmMiKTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisgICAgY2tzdHJuY3B5KGtlcm1yYyxLRVJNUkMsS0VSTVJDTCk7ICAgLyogRGVmYXVsdCBpbml0IGZpbGUgbmFtZSAqLworI2VuZGlmIC8qIE5PSUNQICovCisKKworI2lmZGVmIElLU0QKKyAgICBpZiAoaG93Y2FsbGVkID09IElfQU1fSUtTRCkgICAgICAgICAvKiBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSBkYWVtb24gKi8KKyAgICAgIGluc2VydmVyID0gMTsgICAgICAgICAgICAgICAgICAgICAvKiAoU2VlIGluc2VydmVyIHNlY3Rpb24gb2YgY2tjbWFpKSAqLworI2VuZGlmIC8qIElLU0QgKi8KKworLyogQ29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIEtlcm1pdCAqLworCisjaWZuZGVmIE5PQ01ETAorICAgIGlmICh5YXJnYyA+IDEKKyAgICAgICAgJiYgKnlhcmd2WzFdICE9ICctJworICAgICAgICAmJiAoeWFyZ3ZbMV1bMF0gIT0gJz0nKQorI2lmZGVmIEtFUkJBTkcKKyAgICAgICAgJiYgKHlhcmd2WzFdWzBdICE9ICcrJykKKyNlbmRpZiAvKiBLRVJCQU5HICovCisjaWZkZWYgSUtTRAorICAgICAgICAmJiAoaG93Y2FsbGVkICE9IElfQU1fSUtTRCkKKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZW5hbWUgYXMgMXN0IGFyZ3VtZW50ICovCisjaWZuZGVmIE5PSUNQCisgICAgICAgIGNoYXIgKnM7CisjZW5kaWYgLyogTk9JQ1AgKi8KKyNpZm5kZWYgTk9VUkwKKyAgICAgICAgZXh0ZXJuIGludCBoYXZldXJsOworICAgICAgICBleHRlcm4gc3RydWN0IHVybGRhdGEgZ191cmw7CisgICAgICAgIGlmICh1cmxwYXJzZSh5YXJndlsxXSwmZ191cmwpKSB7CisgICAgICAgICAgICBpZiAoIWNrc3RyY21wKGdfdXJsLnN2YywiZnRwIiwtMSwwKSB8fAorICAgICAgICAgICAgICAgICFja3N0cmNtcChnX3VybC5zdmMsImZ0cHMiLC0xLDApKSB7CisgICAgICAgICAgICAgICAgaGF2ZXVybCA9IDE7CisgICAgICAgICAgICAgICAgaG93Y2FsbGVkID0gSV9BTV9GVFA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFja3N0cmNtcChnX3VybC5zdmMsInRlbG5ldCIsLTEsMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIWNrc3RyY21wKGdfdXJsLnN2YywidGVsbmV0cyIsLTEsMCkpIHsKKyAgICAgICAgICAgICAgICBoYXZldXJsID0gMTsKKyAgICAgICAgICAgICAgICBob3djYWxsZWQgPSBJX0FNX1RFTE5FVDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNrc3RyY21wKGdfdXJsLnN2Yywic3NoIiwtMSwwKSkgeworICAgICAgICAgICAgICAgIGhhdmV1cmwgPSAxOworICAgICAgICAgICAgICAgIGhvd2NhbGxlZCA9IElfQU1fU1NIOworICAgICAgICAgICAgfSBlbHNlIGlmICghY2tzdHJjbXAoZ191cmwuc3ZjLCJpa3NkIiwtMSwwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAhY2tzdHJjbXAoZ191cmwuc3ZjLCJrZXJtaXQiLC0xLDApKSB7CisgICAgICAgICAgICAgICAgaGF2ZXVybCA9IDE7CisgICAgICAgICAgICAgICAgaG93Y2FsbGVkID0gSV9BTV9LRVJNSVQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFja3N0cmNtcChnX3VybC5zdmMsImh0dHAiLC0xLDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICFja3N0cmNtcChnX3VybC5zdmMsImh0dHBzIiwtMSwwKSkgeworICAgICAgICAgICAgICAgIGhhdmV1cmwgPSAxOworICAgICAgICAgICAgICAgIGhvd2NhbGxlZCA9IElfQU1fSFRUUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXZldXJsKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKC0teWFyZ2MgPiAwKSB7ICAgLyogR28gdGhyb3VnaCBjb21tYW5kLWxpbmUgYXJncyAqLworICAgICAgICAgICAgICAgICAgICB5YXJndisrOyAgICAgICAgICAgIC8qIGxvb2tpbmcgZm9yIC1ZIGFuZCAtZCAqLworICAgICAgICAgICAgICAgICAgICB5cCA9ICp5YXJndisxOworICAgICAgICAgICAgICAgICAgICBpZiAoKip5YXJndiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSAqKCp5YXJndisxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisjaWZuZGVmIE5PSUNQCisJCQkgICAgICBjYXNlICcrJzoKKwkJCSAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG94YXJnKHlhcmd2LDEpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWwoIkV4dGVuZGVkIGFyZ3VtZW50IGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXAgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTk9JQ1AgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1knOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2luaXQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2luaXQgPSAxOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZmxhZ3MgfD0gMjsgICAgLyogTm8gbmV0d29yayBETExzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRmbGFncyB8PSA0OyAgICAvKiBObyBUQVBJIERMTHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGZsYWdzIHw9IDg7ICAgIC8qIE5vIFNlY3VyaXR5IERMTHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGZsYWdzIHw9IDE2OyAgIC8qIE5vIFptb2RlbSBETExzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRmbGFncyB8PSAzMjsgICAvKiBTdGRpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZmxhZ3MgfD0gNjQ7ICAgLyogU3Rkb3V0ICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzogLyogPSBTRVQgREVCVUcgT04gKi8KKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGViY291bnQrKyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidGltID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWJsb2cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVibG9nID0gZGVib3BuKCJkZWJ1Zy5sb2ciLDApOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHlwKzEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsKCJpbnZhbGlkIGFyZ3VtZW50IGJ1bmRsaW5nIGFmdGVyIC1XIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlhcmd2KyssIHlhcmdjLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5YXJnYyA8IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWwoIldpbmRvdyBoYW5kbGUgbWlzc2luZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod25kRGlhbGVyID0gKEhXTkQpIGF0b2woKnlhcmd2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZEZyb21EaWFsZXIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YXJndisrLCB5YXJnYy0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXJtaXREaWFsZXJJRCA9IGF0b2woKnlhcmd2KSA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnIyc6IC8qIEs5NSBpbml0aWFsaXphdGlvbiBvcHRpb25zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHlwKzEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlhcmd2KyssIHlhcmdjLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5YXJnYyA8IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWwoIi0jIGFyZ3VtZW50IG1pc3NpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRmbGFncyB8PSBhdG9sKCp5YXJndik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXlwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICorK3lwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBhZnRlciB0aGlzIHBvaW50IG5vbi1LZXJtaXQgcGVyc29uYWxpdGllcyBtdXN0IHJldHVybiAqLworICAgICAgICBzd2l0Y2ggKGhvd2NhbGxlZCkgeworCSAgY2FzZSBJX0FNX0tFUk1JVDoKKwkgIGNhc2UgSV9BTV9JS1NEOgorCSAgY2FzZSBJX0FNX1NTSFNVQjoKKyAgICAgICAgICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PVVJMICovCisKKyNpZm5kZWYgTk9JQ1AKKyAgICAgICAgLyogSWYgaXQgaXMgbm90IGEgVVJMIHRoYXQgd2UgcmVjb2duaXplLCB0cnkgdG8gdHJlYXQgaXQgYXMgYSBmaWxlICovCisKKyAgICAgICAgaWYgKCFpc2Fic29sdXRlKHlhcmd2WzFdKSkgICAgICAvKiBJZiBub3QgYWJzb2x1dGUgKi8KKyAgICAgICAgICBzID0gZmluZGlucGF0aCh5YXJndlsxXSk7ICAgICAvKiBMb29rIGluIFBBVEggKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgIHMgPSB5YXJndlsxXTsKKyAgICAgICAgaWYgKCFzKQorICAgICAgICAgIGRvZXhpdChCQURfRVhJVCx4aXRzdGEpOworICAgICAgICB6Zm5xZnAocyxDS01BWFBBVEgsY21kZmlsKTsgICAgIC8qIEluIGNhc2Ugb2YgQ0QgaW4gZmlsZSAqLworICAgICAgICB5YXJnYyAtPSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgcGFzdCB0aGUgZmlsZW5hbWUgKi8KKyAgICAgICAgeWFyZ3YgKz0gMTsgICAgICAgICAgICAgICAgICAgICAvKiBPdGhlcndpc2Ugd2UnbGwgZ2V0IGFuIGVycm9yICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKyAgICB9CisKKyNpZm5kZWYgTk9DTURMCisjaWZkZWYgTkVXRlRQCisgICAgaWYgKGhvd2NhbGxlZCA9PSBJX0FNX0ZUUCkgeyAgICAgICAgLyogS2VybWl0J3MgRlRQIGNsaWVudCBwZXJzb25hbGl0eSAqLworICAgICAgICB3aGlsZSAoLS15YXJnYyA+IDApIHsgICAgICAgICAgIC8qIEdvIHRocm91Z2ggY29tbWFuZC1saW5lIGFyZ3MgKi8KKyAgICAgICAgICAgIHlhcmd2Kys7ICAgICAgICAgICAgICAgICAgICAvKiBsb29raW5nIGZvciAtWSBhbmQgLWQgKi8KKyAgICAgICAgICAgIHlwID0gKnlhcmd2KzE7CisgICAgICAgICAgICBpZiAoKip5YXJndiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICB4ID0gKigqeWFyZ3YrMSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHgpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisjaWZuZGVmIE5PSUNQCisJCSAgICAgIGNhc2UgJysnOgorCQkgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb3hhcmcoeWFyZ3YsMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWwoIkV4dGVuZGVkIGFyZ3VtZW50IGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB5cCA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTk9JQ1AgKi8KKyAgICAgICAgICAgICAgICAgICAgICBjYXNlICdZJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vaW5pdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgICAgICAgICBub2luaXQgPSAxOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRmbGFncyB8PSAyOyAgICAvKiBObyBuZXR3b3JrIERMTHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZmxhZ3MgfD0gNDsgICAgLyogTm8gVEFQSSBETExzICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGZsYWdzIHw9IDg7ICAgIC8qIE5vIFNlY3VyaXR5IERMTHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZmxhZ3MgfD0gMTY7ICAgLyogTm8gWm1vZGVtIERMTHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZmxhZ3MgfD0gMzI7ICAgLyogU3RkaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZmxhZ3MgfD0gNjQ7ICAgLyogU3Rkb3V0ICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzogICAgICAgICAgICAgLyogPSBTRVQgREVCVUcgT04gKi8KKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYmNvdW50KysgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ0aW0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWJsb2cpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYmxvZyA9IGRlYm9wbigiZGVidWcubG9nIiwwKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKih5cCsxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWwoImludmFsaWQgYXJndW1lbnQgYnVuZGxpbmcgYWZ0ZXIgLVciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHlhcmd2KyssIHlhcmdjLS07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeWFyZ2MgPCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbCgiV2luZG93IGhhbmRsZSBtaXNzaW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICBod25kRGlhbGVyID0gKEhXTkQpIGF0b2woKnlhcmd2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZWRGcm9tRGlhbGVyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHlhcmd2KyssIHlhcmdjLS07CisgICAgICAgICAgICAgICAgICAgICAgICBLZXJtaXREaWFsZXJJRCA9IGF0b2woKnlhcmd2KSA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlICcjJzogICAgICAgICAvKiBLOTUgaW5pdGlhbGl6YXRpb24gb3B0aW9ucyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCooeXArMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgeWFyZ3YrKywgeWFyZ2MtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5YXJnYyA8IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsKCItIyBhcmd1bWVudCBtaXNzaW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGZsYWdzIHw9IGF0b2woKnlhcmd2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgheXApCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIHggPSAqKyt5cDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBORVdGVFAgKi8KKyNlbmRpZiAvKiBOT0NNREwgKi8KKworICAgIHdoaWxlICgtLXlhcmdjID4gMCkgeyAgICAgICAgICAgICAgIC8qIEdvIHRocm91Z2ggY29tbWFuZC1saW5lIGFyZ3MgKi8KKyAgICAgICAgeWFyZ3YrKzsKKyAgICAgICAgeXAgPSAqeWFyZ3YrMTsgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIGZvciBidW5kbGVkIGFyZ3MgKi8KKyAgICAgICAgaWYgKCoqeWFyZ3YgPT0gJz0nKSAgICAgICAgICAgICAvKiBTYW1lIHJ1bGVzIGFzIGNtZGxpbigpLi4uICovCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWJ1ZyhGMTEwLCJwcmVzY2FuICp5YXJndiIsKnlhcmd2LDApOworCisjaWZuZGVmIE5PSUNQCisjaWZkZWYgS0VSQkFORworICAgICAgICB5eSA9ICp5YXJndjsKKyAgICAgICAgaWYgKCFzdHJjbXAoeXksIisiKSB8fCAoKnl5ID09ICcrJyAmJiAqKHl5KzEpIDwgKGNoYXIpMzMpKSB7CisgICAgICAgICAgICBjaGFyICogczsKKyAgICAgICAgICAgIHlhcmd2Kys7CisgICAgICAgICAgICBub2luaXQgPSAxOworICAgICAgICAgICAgaWYgKCEqeWFyZ3YpCisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNmaWxlZiA9IDE7CisgICAgICAgICAgICBzID0gZmluZGlucGF0aCgqeWFyZ3YpOworICAgICAgICAgICAgaWYgKHMpIHsKKyAgICAgICAgICAgICAgICB6Zm5xZnAocyxDS01BWFBBVEgsY21kZmlsKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgZG9leGl0KEJBRF9FWElULHhpdHN0YSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBLRVJCQU5HICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKyAgICAgICAgaWYgKCFzdHJjbXAoKnlhcmd2LCItLSIpKSAgICAgICAvKiBnZXRvcHQoKSBjb25mb3JtYW5jZSAqLworICAgICAgICAgIHJldHVybjsKKyNpZmRlZiBWTVMKKyAgICAgICAgZWxzZSBpZiAoKip5YXJndiA9PSAnLycpCisgICAgICAgICAgY29udGludWU7CisjZW5kaWYgLyogVk1TICovCisgICAgICAgIGVsc2UgaWYgKCoqeWFyZ3YgPT0gJy0nKSB7ICAgICAgLyogR290IGFuIG9wdGlvbiAoYmVnaW5zIHdpdGggZGFzaCkgKi8KKyAgICAgICAgICAgIHggPSAqKCp5YXJndisxKTsgICAgICAgICAgICAvKiBHZXQgb3B0aW9uIGxldHRlciAqLworICAgICAgICAgICAgd2hpbGUgKHgpIHsgICAgICAgICAgICAgICAgIC8qIEFsbG93IGZvciBidW5kbGVkIG9wdGlvbnMgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMDAwLCJwcmVzY2FuIGFyZyIsIiIseCk7CisgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisjaWZuZGVmIE5PSUNQCisgICAgICAgICAgICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgICAgICBpZiAoZG94YXJnKHlhcmd2LDEpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWwoIkV4dGVuZGVkIGFyZ3VtZW50IGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyNpZm5kZWYgQ09NTUVOVAkJCQkvKiBKZWZmIDI4IEFwciAyMDAzICovCisgICAgICAgICAgICAgICAgICAgIHlwID0gTlVMTDsJCS8qIChub3QgIiIpICovCisjZWxzZQorICAgICAgICAgICAgICAgICAgICB5YXJndisrLCB5YXJnYy0tOworICAgICAgICAgICAgICAgICAgICB5cCA9ICp5YXJndjsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PSUNQICovCisKKyAgICAgICAgICAgICAgICAgIGNhc2UgJzcnOiAgICAgICAgICAgICAvKiBVbmRvY3VtZW50ZWQuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgc3N0ZWxuZXQgPSAxOyAgICAgICAvKiAoYmVjYXVzZSBpdCBkb2Vzbid0IHdvcmspICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIElLU0QKKyAgICAgICAgICAgICAgICAgIGNhc2UgJ0EnOiB7CisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHA7CisgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ2ZXIgPSAxOyAgICAgLyogRmxhZyB0aGF0IHdlIGFyZSBkb2luZyB0aGlzICovCisgICAgICAgICAgICAgICAgICAgICAgc3J2Y2Rtc2cgPSAyOyAgICAgLyogUHJlc2V0IHRoaXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAvKiBTZWUgaW5zZXJ2ZXIgc2VjdGlvbiBvZiBja2NtYWkuYyBmb3IgbW9yZSBzZXR0aW5ncyAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHlwKzEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsKCJpbnZhbGlkIGFyZ3VtZW50IGJ1bmRsaW5nIGFmdGVyIC1BIik7CisgICAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIE5UCisgICAgICAgICAgICAgICAgICAgICAgLyogU3VwcG9ydCBmb3IgUHJhZ21hIFN5c3RlbXMgVGVsbmV0L1Rlcm1pbmFsIFNlcnZlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICBwID0gZ2V0ZW52KCJQUkFHTUFTWVNfSU5FVERfU09DSyIpOworICAgICAgICAgICAgICAgICAgICAgIGlmIChwICYmIGF0b2kocCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICB0dG5hbWVbMF0gPSAnJCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweSgmdHRuYW1lWzFdLHAsVFROQU1MRU4tMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgICAgICAgICAgIHlhcmd2KyssIHlhcmdjLS07CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHlhcmdjIDwgMSB8fCAqKnlhcmd2ID09ICctJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbCgiLUEgYXJndW1lbnQgbWlzc2luZyIpOworICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHR0bmFtZVswXSA9ICckJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KCZ0dG5hbWVbMV0sKnlhcmd2LFRUTkFNTEVOLTEpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgIGNhc2UgJ1cnOgorICAgICAgICAgICAgICAgICAgICBpZiAoKih5cCsxKSkKKyAgICAgICAgICAgICAgICAgICAgICBmYXRhbCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyBhZnRlciAtVyIpOworICAgICAgICAgICAgICAgICAgICB5YXJndisrLCB5YXJnYy0tOworICAgICAgICAgICAgICAgICAgICBpZiAoeWFyZ2MgPCAxKQorICAgICAgICAgICAgICAgICAgICAgIGZhdGFsKCJXaW5kb3cgaGFuZGxlIG1pc3NpbmciKTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgIGlmIChkdW1teSkgeworICAgICAgICAgICAgICAgICAgICAgICAgeWFyZ3YrKywgeWFyZ2MtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGh3bmREaWFsZXIgPSAoSFdORCkgYXRvbCgqeWFyZ3YpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZEZyb21EaWFsZXIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgeWFyZ3YrKywgeWFyZ2MtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtlcm1pdERpYWxlcklEID0gYXRvbCgqeWFyZ3YpIDsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICBjYXNlICcjJzogICAgICAgICAgICAgLyogSzk1IGluaXRpYWxpemF0aW9uIG9wdGlvbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCooeXArMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsKCJpbnZhbGlkIGFyZ3VtZW50IGJ1bmRsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeWFyZ3YrKywgeWFyZ2MtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHlhcmdjIDwgMSkKKyAgICAgICAgICAgICAgICAgICAgICBmYXRhbCgiLSMgYXJndW1lbnQgbWlzc2luZyIpOworICAgICAgICAgICAgICAgICAgICBzdGFydGZsYWdzIHw9IGF0b2woKnlhcmd2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICAgIGNhc2UgJ00nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTXkgVXNlciBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIGlmICgqKHlwKzEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHlhcmd2KyssIHlhcmdjLS07CisgICAgICAgICAgICAgICAgICAgIGlmICgoeWFyZ2MgPCAxKSB8fCAoKip5YXJndiA9PSAnLScpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbCgibWlzc2luZyB1c2VybmFtZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoaW50KXN0cmxlbigqeWFyZ3YpID4gVUlEQlVGTEVOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbCgidXNlcm5hbWUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIENPTU1FTlQKKy8qCisgIFRoaXMgY2FuJ3Qgd29yay4gIHVpZGJ1ZiBpcyBvdmVyd3JpdHRlbiBpbiBzeXNpbml0KCkgd2hpY2ggaGFzIHlldCB0byBiZQorICBjYWxsZWQuICBUaGlzIGNhbm5vdCBiZSBzZXQgaW4gcHJlc2NhbigpLgorKi8KKyNpZmRlZiBJS1NECisgICAgICAgICAgICAgICAgICAgIGlmICghaW5zZXJ2ZXIpCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh1aWRidWYsKnlhcmd2LFVJREJVRkxFTik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgICAgICAgICAgY2FzZSAnUic6ICAgICAgICAgICAgIC8qIFJlbW90ZS1vbmx5IGFkdmlzb3J5ICovCisjaWZkZWYgQ0tfSUZSTworICAgICAgICAgICAgICAgICAgICByZW1vbmx5ID0gMTsKKyNlbmRpZiAvKiBDS19JRlJPICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6ICAgICAgICAgICAgIC8qIFNUQVkgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RheWZsZyA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgICAgIG5vaW5pdCA9IDE7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZmxhZ3MgfD0gMjsgICAgLyogTm8gbmV0d29yayBETExzICovCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZmxhZ3MgfD0gNDsgICAgLyogTm8gVEFQSSBETExzICovCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZmxhZ3MgfD0gODsgICAgLyogTm8gU2VjdXJpdHkgRExMcyAqLworICAgICAgICAgICAgICAgICAgICBzdGFydGZsYWdzIHw9IDE2OyAgIC8qIE5vIFptb2RlbSBETExzICovCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZmxhZ3MgfD0gMzI7ICAgLyogU3RkaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgc3RhcnRmbGFncyB8PSA2NDsgICAvKiBTdGRvdXQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZuZGVmIE5PSUNQCisgICAgICAgICAgICAgICAgICBjYXNlICdZJzogICAgICAgICAgICAgLyogTm8gaW5pdCBmaWxlICovCisgICAgICAgICAgICAgICAgICAgIG5vaW5pdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PSUNQICovCisgICAgICAgICAgICAgICAgICBjYXNlICdkJzogICAgICAgICAgICAgLyogPSBTRVQgREVCVUcgT04gKi8KKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgICAgICBpZiAoZGViY291bnQrKyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgZGVidGltID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWJsb2cpCisgICAgICAgICAgICAgICAgICAgICAgZGVibG9nID0gZGVib3BuKCJkZWJ1Zy5sb2ciLDApOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICBjYXNlICd4JzogICAgICAgICAgICAgLyogU2VydmVyICovCisgICAgICAgICAgICAgICAgICAgIGFyZ194ID0gMTsgICAgICAgICAgLyogTm90ZSBpbiBhZHZhbmNlICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2lmbmRlZiBOT0lDUAorICAgICAgICAgICAgICAgICAgY2FzZSAneSc6ICAgICAgICAgICAgIC8qIEFsdGVybmF0aXZlIGluaXQgZmlsZSAqLworICAgICAgICAgICAgICAgICAgICBub2luaXQgPSAwOworICAgICAgICAgICAgICAgICAgICB5YXJndisrLCB5YXJnYy0tOworICAgICAgICAgICAgICAgICAgICBpZiAoeWFyZ2MgPCAxKSBmYXRhbCgibWlzc2luZyBuYW1lIGluIC15Iik7CisgICAgICAgICAgICAgICAgICAgIC8qIFJlcGxhY2UgaW5pdCBmaWxlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGtlcm1yYywqeWFyZ3YsS0VSTVJDTCk7CisgICAgICAgICAgICAgICAgICAgIHJjZmxhZyA9IDE7ICAgICAgICAgLyogRmxhZyB0aGF0IHRoaXMgaGFzIGJlZW4gZG9uZSAqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJwcmVzY2FuIGtlcm1yYyIsa2VybXJjLHJjZmxhZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PSUNQICovCisgICAgICAgICAgICAgICAgICBjYXNlICd6JzogICAgICAgICAgICAgLyogPSBTRVQgQkFDS0dST1VORCBPRkYgKi8KKyAgICAgICAgICAgICAgICAgICAgYmdzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICBiYWNrZ3JkID0gMDsKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSAwOworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgY2FzZSAnQic6ICAgICAgICAgICAgIC8qIEZvcmNlIGJhY2tncm91bmQgKGJhdGNoKSAqLworICAgICAgICAgICAgICAgICAgICBiZ3NldCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJhY2tncmQgPSAxOworI2lmZGVmIFZNUworICAgICAgICAgICAgICAgICAgICBiYXRjaCA9IDE7CisjZW5kaWYgLyogVk1TICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgQ0tfTkVUQklPUworICAgICAgICAgICAgICAgICAgY2FzZSAnTic6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHlhcmd2KyssIHlhcmdjLS07CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oKnlhcmd2KSAhPSAxIHx8ICgqeWFyZ3YpWzBdID09ICdYJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldEJpb3NBZGFwdGVyID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBhdG9pKCp5YXJndik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPj0gMCAmJiBuIDw9IDkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRCaW9zQWRhcHRlciA9IG47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0Qmlvc0FkYXB0ZXIgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19ORVRCSU9TICovCisgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF5cCkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHggPSAqKyt5cDsgICAgICAgICAgICAgIC8qIFNlZSBpZiBvcHRpb25zIGFyZSBidW5kbGVkICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTk9DTURMICovCit9CisKKy8qICBHIEUgVCBUIEMgUyAgLS0gIEdldCBUcmFuc2ZlciAoSW50ZXJtZWRpYXRlKSBDaGFyYWN0ZXIgU2V0ICAqLworCisvKgorICBHaXZlbiB0d28gZmlsZSBjaGFyYWN0ZXIgc2V0cywgdGhpcyByb3V0aW5lIHBpY2tzIG91dCB0aGUgYXBwcm9wcmlhdGUKKyAgInRyYW5zZmVyIiBjaGFyYWN0ZXIgc2V0IHRvIHVzZSBmb3IgdHJhbnNsYXRpbmcgYmV0d2VlbiB0aGVtLgorICBUaGUgdHJhbnNmZXIgY2hhcmFjdGVyIHNldCBudW1iZXIgaXMgcmV0dXJuZWQuCisKKyAgVHJhbnNsYXRpb24gYmV0d2VlbiB0d28gZmlsZSBjaGFyYWN0ZXIgc2V0cyBpcyBkb25lLCBmb3IgZXhhbXBsZSwKKyAgYnkgdGhlIENPTk5FQ1QsIFRSQU5TTUlULCBhbmQgVFJBTlNMQVRFIGNvbW1hbmRzLgorCisgIFRyYW5zbGF0aW9uIGJldHdlZW4gS2FuamkgY2hhcmFjdGVyIHNldHMgaXMgbm90IHlldCBzdXBwb3J0ZWQuCisqLworaW50CitnZXR0Y3MoY3MxLGNzMikgaW50IGNzMSwgY3MyOyB7CisjaWZkZWYgTk9DU0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gY2hhcmFjdGVyLXNldCBzdXBwb3J0ICovCisgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc28gbm8gdHJhbnNsYXRpb24gKi8KKyNlbHNlCisgICAgaW50IHRjcyA9IFRDX1RSQU5TUDsKKyNpZmRlZiBLQU5KSQorLyogS2Fuamkgbm90IHN1cHBvcnRlZCB5ZXQgKi8KKyAgICBpZiAoZmNzaW5mb1tjczFdLmFscGhhYmV0ID09IEFMX0pBUEFOIHx8CisgICAgICAgIGZjc2luZm9bY3MyXS5hbHBoYWJldCA9PSBBTF9KQVBBTiApCisgICAgICB0Y3MgPSBUQ19UUkFOU1A7CisgICAgZWxzZQorI2VuZGlmIC8qIEtBTkpJICovCisjaWZkZWYgQ1lSSUxMSUMKKy8qCisgIEkgY2FuJ3QgcmVtZW1iZXIgd2h5IHdlIGRvbid0IHRlc3QgYm90aCBzZXRzIGhlcmUsIGJ1dCBJIHRoaW5rIHRoZXJlCisgIG11c3QgaGF2ZSBiZWVuIGEgcmVhc29uLi4uCisqLworICAgICAgaWYgKGZjc2luZm9bY3MyXS5hbHBoYWJldCA9PSBBTF9DWVJJTCkKKyAgICAgICAgdGNzID0gVENfQ1lSSUxMOworICAgICAgZWxzZQorI2VuZGlmIC8qIENZUklMTElDICovCisjaWZkZWYgSEVCUkVXCisgICAgICAgICAgaWYgKGZjc2luZm9bY3MxXS5hbHBoYWJldCA9PSBBTF9IRUJSRVcgfHwKKyAgICAgICAgICAgICAgZmNzaW5mb1tjczJdLmFscGhhYmV0ID09IEFMX0hFQlJFVyApCisgICAgICAgICAgICB0Y3MgPSBUQ19IRUJSRVc7CisgICAgICAgICAgZWxzZQorI2VuZGlmIC8qIEhFQlJFVyAqLworI2lmZGVmIEdSRUVLCisgICAgICAgICAgaWYgKGZjc2luZm9bY3MxXS5hbHBoYWJldCA9PSBBTF9HUkVFSyB8fAorICAgICAgICAgICAgICBmY3NpbmZvW2NzMl0uYWxwaGFiZXQgPT0gQUxfR1JFRUsgKQorICAgICAgICAgICAgdGNzID0gVENfR1JFRUs7CisgICAgICAgICAgZWxzZQorI2VuZGlmIC8qIEdSRUVLICovCisKKyAgICAgICAgICAgIC8qIFJvbWFuIHNldHMgLi4uICovCisKKyNpZmRlZiBMQVRJTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFYXN0IEV1cm9wZWFuICovCisgICAgICAgIGlmIChjczEgPT0gRkNfMkxBVElOICB8fCBjczIgPT0gRkNfMkxBVElOIHx8IC8qIExhdGluLTIgKi8KKyAgICAgICAgICAgIGNzMSA9PSBGQ19DUDg1MiAgIHx8IGNzMiA9PSBGQ19DUDg1MiAgfHwgLyogQ1A4NTIgKi8KKyAgICAgICAgICAgIGNzMSA9PSBGQ19DUDEyNTAgIHx8IGNzMiA9PSBGQ19DUDEyNTAgfHwgLyogV2luZG93cyBMYXRpbi0yICovCisgICAgICAgICAgICBjczEgPT0gRkNfTUFaT1ZJQSB8fCBjczIgPT0gRkNfTUFaT1ZJQSkgIC8qIFBvbGlzaCBNYXpvdmlhICovCisgICAgICAgICAgdGNzID0gVENfMkxBVElOOworICAgICAgICBlbHNlCisjZW5kaWYgLyogTEFUSU4yICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VzdCBFdXJvcGVhbiBFdXJvLWF3YXJlICovCisgICAgICAgICAgaWYgKGNzMSA9PSBGQ19DUDg1OCB8fCBjczEgPT0gRkNfOUxBVElOIHx8CisgICAgICAgICAgICAgIGNzMiA9PSBGQ19DUDg1OCB8fCBjczIgPT0gRkNfOUxBVElOKQorICAgICAgICAgICAgdGNzID0gVENfOUxBVElOOworICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyYWRpdGlvbmFsIFdlc3QgRXVyb3BlYW4gKi8KKyAgICAgICAgICAgIHRjcyA9IFRDXzFMQVRJTjsKKyAgICByZXR1cm4odGNzKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCit9CisKKyNpZm5kZWYgTk9MT0NBTAorLyogIEQgTyBDIE8gTiBFIEMgVCAgLS0gIERvIHRoZSBjb25uZWN0IGNvbW1hbmQgICovCisvKgorICBxID0gMCBtZWFucyBpc3N1ZSBub3JtYWwgaW5mb3JtYXRpb25hbCBtZXNzYWdlIGFib3V0IGhvdyB0byBnZXQgYmFjaywgZXRjLgorICBxICE9IDAgbWVhbnMgdG8gc2tpcCB0aGUgbWVzc2FnZS4KKyovCisKK2ludAorZG9jb25lY3QocSxhc3luYykgaW50IHEsIGFzeW5jOyB7CisgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGNvZGUgKi8KKyNpZmRlZiBDS19BVVRPREwKKyAgICBleHRlcm4gQ0hBUiBrc2J1ZltdOworI2VuZGlmIC8qIENLX0FVVE9ETCAqLworI2lmbmRlZiBOT0tWRVJCUyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtleWJvYXJkIG1hY3JvIG1hdGVyaWFsICovCisgICAgZXh0ZXJuIGludCBrZXltYWMsIGtleW1hY3g7CisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKyAgICBleHRlcm4gaW50IGp1c3RvbmUsIGFkbF9lcnI7CisgICAgaW50IHFzYXZlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIHJlbWVtYmVyaW5nICJxdWlldCIgdmFsdWUgKi8KKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IHRlcm1faW87CisgICAgZXh0ZXJuIGludCBkaXNwbGF5X2RlbW87CisgICAgaW50IHRlcm1faW9fc2F2ZTsKKyNpZmRlZiBLVUkKKyAgICBleHRlcm4gaW50IGt1aV9hc3luYzsKKyNlbmRpZiAvKiBLVUkgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpbnQgaXNfdG4gPSAwOworCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICBpZiAoIXF1aWV0KQorICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBJS1NEIGNhbm5vdCBDT05ORUNULlxyXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgaXNfdG4gPQorI2lmZGVmIFROQ09ERQorICAgICAgKGxvY2FsICYmIG5ldHdvcmsgJiYgSVNfVEVMTkVUKCkpIHx8ICghbG9jYWwgJiYgc3N0ZWxuZXQpCisjZWxzZQorICAgICAgICAwCisjZW5kaWYgLyogVE5DT0RFICovCisgICAgICAgICAgOworLyoKKyAgU2F2aW5nLCBjaGFuZ2luZywgYW5kIHJlc3RvcmluZyB0aGUgZ2xvYmFsICJxdWlldCIgdmFyaWFibGUgYXJvdW5kIGNhbGxzCisgIHRvIGNvbmVjdCgpIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgdmVyYm9zZSBDT05ORUNUIG1lc3NhZ2UgaXMgcHJpbnRlZCBpcworICBvYnZpb3VzbHkgbGVzcyBlbGVnYW50IHRoYW4gcGFzc2luZyBhIHBhcmFtZXRlciB0byBjb25lY3QoKSwgYnV0IHdlIGRvIGl0CisgIHRoaXMgd2F5IHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNoYW5nZSBhbGwgb2YgdGhlIGNrP2Nvbi5jIG1vZHVsZXMuICBOT1RFOgorICBpdCBpcyBpbXBvcnRhbnQgdG8gcmVzdG9yZSB0aGUgdmFsdWUgaW1tZWRpYXRlbHkgdXBvbiByZXR1cm4gaW4gY2FzZSB0aGVyZQorICBpcyBhbiBhdXRvZG93bmxvYWQgb3IgQVBDLgorKi8KKyAgICBxc2F2ZSA9IHF1aWV0OyAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIGl0ICovCisgICAgaWYgKCFxdWlldCAmJiBxID4gLTEpCisgICAgICBxdWlldCA9IHE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlIGFyZ3VtZW50IHRlbXBvcmFyaWx5ICovCisgICAgY29ucmVzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHV0IGNvbnNvbGUgYmFjayB0byBub3JtYWwgKi8KKyAgICBkZWJ1ZyhGMTAxLCJkb2NvbmVjdCBqdXN0b25lIDEiLCIiLGp1c3RvbmUpOworI2lmZGVmIENLX0FVVE9ETAorICAgIGtzYnVmWzBdID0gTlVMOyAgICAgICAgICAgICAgICAgICAgIC8qIEF1dG9kb3dubG9hZCBwYWNrZXQgYnVmZmVyICovCisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisjaWZkZWYgT1MyCisgICAgZGlzcGxheV9kZW1vID0gMTsgICAgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgdG8gZGlzcGxheSBkZW1vICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgaWYgKGlzX3RuICYmIFRFTE9QVF9VKFRFTE9QVF9LRVJNSVQpICYmIHR0Y2hrKCkgPj0gMAorI2lmZGVmIE9TMgorICAgICAgICYmICF2aWV3b25seQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICApIHsKKyAgICAgICAgLyogSWYgdGhlIHJlbW90ZSBzaWRlIGlzIGluIGEgc3RhdGUgb2YgSUtTIFNUQVJULVNFUlZFUiAgICAqLworICAgICAgICAvKiB3ZSByZXF1ZXN0IHRoYXQgdGhlIHN0YXRlIGJlIGNoYW5nZWQuICBXZSB3aWxsIGRldGVjdCAgICovCisgICAgICAgIC8qIGEgZmFpbHVyZSB0byBhZGhlcmUgdG8gdGhlIHJlcXVlc3Qgd2hlbiB3ZSBjYWxsIHR0aW5jKCkgKi8KKyAgICAgICAgaWYgKCFpa3Nfd2FpdChLRVJNSVRfUkVRX1NUT1AsMCkgJiYgIXRjcF9pbmNvbWluZykgeworICAgICAgICAgICAgaWYgKCFxdWlldCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXHJcbkVudGVyIENsaWVudC9TZXJ2ZXIgTW9kZS4uLiAgVXNlOlxyXG5cclxuIik7CisgICAgICAgICAgICAgICAgcHJpbnRmKAorIiBSRU1PVEUgTE9HSU4gPHVzZXI+IDxwYXNzd29yZD4gdG8gbG9nIGluIHRvIHRoZSBzZXJ2ZXIgaWYgbmVjZXNzYXJ5LlxyXG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiBTRU5EIGFuZCBHRVQgZm9yIGZpbGUgdHJhbnNmZXIuXHJcbiIpOworICAgICAgICAgICAgICAgIHByaW50ZigiIFJFTU9URSBjb21tYW5kcyBmb3IgZmlsZSBtYW5hZ2VtZW50LlxyXG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiBGSU5JU0ggdG8gdGVybWluYXRlIENsaWVudC9TZXJ2ZXIgbW9kZS5cclxuIik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgQllFIHRvIHRlcm1pbmF0ZSBhbmQgY2xvc2UgY29ubmVjdGlvbi5cclxuIik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgUkVNT1RFIEhFTFAgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXHJcblxyXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1aWV0ID0gcXNhdmU7CisgICAgICAgICAgICByZXR1cm4oMCk7ICAgICAgLyogRmFpbHVyZSAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyogTGV0IG91ciBwZWVyIGtub3cgb3VyIHN0YXRlLiAqLworI2lmZGVmIENLX0FVVE9ETAorICAgIGlmIChpc190biAmJiBURUxPUFRfTUUoVEVMT1BUX0tFUk1JVCkKKyNpZmRlZiBPUzIKKyAgICAgICAgJiYgIXZpZXdvbmx5CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICApIHsKKyAgICAgICAgaWYgKGF1dG9kbCAmJiAhVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9zdGFydCkgeworICAgICAgICAgICAgdG5fc2lrcyhLRVJNSVRfU1RBUlQpOyAgICAgIC8qIFNlbmQgS2VybWl0LVNlcnZlciBTdGFydCAqLworICAgICAgICB9IGVsc2UgaWYgKCFhdXRvZGwgJiYgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9zdGFydCkgeworICAgICAgICAgICAgdG5fc2lrcyhLRVJNSVRfU1RPUCk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZSAvKiBDS19BVVRPREwgKi8KKyAgICBpZiAoaXNfdG4gJiYgVEVMT1BUX01FKFRFTE9QVF9LRVJNSVQpICYmCisJVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9zdGFydCkKKyAgICAgICAgdG5fc2lrcyhLRVJNSVRfU1RPUCk7CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCisgICAgZGVidWcoRjEwMSwiZG9jb25lY3QgZmxvdyIsIiIsZmxvdyk7CisjaWZkZWYgT1MyCisgICAgZGVidWcoRjEwMSwiZG9jb25lY3QgYXN5bmMiLCIiLGFzeW5jKTsKKyNpZmRlZiBLVUkKKyAgICBpZiAoa3VpX2FzeW5jKQorICAgICAgYXN5bmMgPSAxOzsKKyNlbmRpZiAvKiBLVUkgKi8KKyAgICB4ID0gY29uZWN0KGFzeW5jKTsgICAgICAgICAgICAgICAgICAvKiBDb25uZWN0IHRoZSBmaXJzdCB0aW1lICovCisjZWxzZSAvKiBPUzIgKi8KKyAgICB4ID0gY29uZWN0KCk7CisjZW5kaWYgLyogT1MyICovCisgICAgZGVib2sgPSAxOworCisjaWZkZWYgSUtTX09QVElPTgorICAgIGlmIChURUxPUFRfVShURUxPUFRfS0VSTUlUKSAmJgorICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQgJiYKKyAgICAgICAgIXRjcF9pbmNvbWluZyAmJiAhcXVpZXQgJiYgdHRjaGsoKSA+PSAwCisgICAgICAgICkgeworICAgICAgICBwcmludGYoIlxyXG5FbnRlciBDbGllbnQvU2VydmVyIE1vZGUuLi4gIFVzZTpcclxuXHJcbiIpOworICAgICAgICBwcmludGYoCisiIFJFTU9URSBMT0dJTiA8dXNlcj4gPHBhc3N3b3JkPiB0byBsb2cgaW4gdG8gdGhlIHNlcnZlciBpZiBuZWNlc3NhcnkuXHJcbiIpOworICAgICAgICBwcmludGYoIiBTRU5EIGFuZCBHRVQgZm9yIGZpbGUgdHJhbnNmZXIuXHJcbiIpOworICAgICAgICBwcmludGYoIiBSRU1PVEUgY29tbWFuZHMgZm9yIGZpbGUgbWFuYWdlbWVudC5cclxuIik7CisgICAgICAgIHByaW50ZigiIEZJTklTSCB0byB0ZXJtaW5hdGUgQ2xpZW50L1NlcnZlciBtb2RlLlxyXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgQllFIHRvIHRlcm1pbmF0ZSBhbmQgY2xvc2UgY29ubmVjdGlvbi5cclxuIik7CisgICAgICAgIHByaW50ZigiIFJFTU9URSBIRUxQIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxyXG5cclxuIik7CisgICAgfQorI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKworICAgIHF1aWV0ID0gcXNhdmU7ICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgInF1aWV0IiB2YWx1ZSAqLworICAgIGRlYnVnKEYxMDEsImRvY29uZWN0IGp1c3RvbmUgMiIsIiIsanVzdG9uZSk7CisKKyNpZmRlZiBORVRDT05OCisgICAgaWYgKG5ldHdvcmsgJiYgdG5fZXhpdCAmJiB0dGNoaygpIDwgMCkKKyAgICAgIGRvZXhpdChHT09EX0VYSVQseGl0c3RhKTsgICAgICAgICAvKiBFeGl0IHdpdGggZ29vZCBzdGF0dXMgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisKKyNpZmRlZiBPUzJPUlVOSVgKKyAgICAvKiBFeGl0IG9uIGRpc2Nvbm5lY3QgaWYgdGhlIHBvcnQgaXMgbm90IG9wZW4gb3IgY2FycmllciBkZXRlY3QgKi8KKyAgICBpZiAoZXhpdG9uY2xvc2UgJiYgKHR0Y2hrKCkgPCAwKSkKKyAgICAgIGRvZXhpdChHT09EX0VYSVQseGl0c3RhKTsKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKworI2lmZGVmIENLQ09OSU5UQjRDQgorICAgIC8qIFRoZSBvcmRlciBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gSFAtVVggOC4wMC4gKi8KKyAgICAvKiBUaGUgb3RoZXIgb3JkZXIgbWFrZXMgaXQgdGhpbmsgaXQncyBpbiB0aGUgYmFja2dyb3VuZCB3aGVuIGl0ICovCisgICAgLyogcmV0dXJucyBmcm9tIENPTk5FQ1QgKEFwciAxOTk5KS4gKi8KKyAgICBzZXRpbnQoKTsKKyAgICBjb25jYigoY2hhcillc2NhcGUpOyAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIGNvbnNvbGUgZm9yIGNvbW1hbmRzICovCisjZWxzZQorICAgIC8qIFRoaXMgaXMgaG93IGl0IGhhcyBhbHdheXMgYmVlbiBzbyBiZXR0ZXIgbGVhdmUgaXQgKi8KKyAgICAvKiB0aGlzIHdheSBmb3IgYWxsIG5vbi1IUC1VWC04LjAwIGJ1aWxkcy4gKi8KKyAgICBjb25jYigoY2hhcillc2NhcGUpOyAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIGNvbnNvbGUgZm9yIGNvbW1hbmRzICovCisgICAgc2V0aW50KCk7CisjZW5kaWYgLyogQ0tDT05JTlRCNENCICovCisKKyNpZmRlZiBPUzIKKyAgICBpZiAoIWFzeW5jKSB7CisgICAgICAgIHRlcm1faW9fc2F2ZSA9IHRlcm1faW87ICAgICAgICAgLyogRGlzYWJsZSBJL08gYnkgZW11bGF0b3IgKi8KKyAgICAgICAgdGVybV9pbyA9IDA7CisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBDS19BUEMKKy8qCisgIElmIGFuIEFQQyBjb21tYW5kIHdhcyByZWNlaXZlZCBkdXJpbmcgQ09OTkVDVCBtb2RlLCB3ZSBkZWZpbmUgaXQgbm93CisgIGFzIGEgbWFjcm8sIGV4ZWN1dGUgdGhlIG1hY3JvLCBhbmQgdGhlbiByZXR1cm4gdG8gQ09OTkVDVCBtb2RlLgorICBXZSBkbyB0aGlzIGluIGEgV0hJTEUgbG9vcCBpbiBjYXNlIGFkZGl0aW9uYWwgQVBDcyBjb21lIGR1cmluZyBzdWJzZXF1ZW50CisgIENPTk5FQ1Qgc2Vzc2lvbnMuCisqLworICAgICAgICBkZWJ1ZyhGMTAxLCJkb2NvbmVjdCBhcGNhY3RpdmUiLCIiLGFwY2FjdGl2ZSk7CisgICAgICAgIGRlYnVnKEYxMDEsImRvY29uZWN0IHN1Y2Nlc3MiLCIiLHN1Y2Nlc3MpOworCisgICAgICAgIHdoaWxlICh4ID4gMCAmJiAoYXBjYWN0aXZlID09IEFQQ19MT0NBTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIChhcGNhY3RpdmUgPT0gQVBDX1JFTU9URSAmJiBhcGNzdGF0dXMgIT0gQVBDX09GRikpKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkb2NvbmVjdCBqdXN0b25lIDMiLCIiLGp1c3RvbmUpOworICAgICAgICAgICAgaWYgKG1sb29rKG1hY3RhYiwiX2FwY19jb21tYW5kcyIsbm1hYykgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJkb2NvbmVjdCBhYm91dCB0byBleGVjdXRlIEFQQyIsYXBjYnVmLDApOworICAgICAgICAgICAgICAgIGRvbWFjKCJfYXBjX2NvbW1hbmRzIixhcGNidWYsY21kc3RrW2NtZGx2bF0uY2NmbGdzfENGX0FQQyk7CisgICAgICAgICAgICAgICAgZGVsbWFjKCJfYXBjX2NvbW1hbmRzIiwxKTsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJkb2NvbmVjdCBBUEMgaW4gcHJvZ3Jlc3MiLCIiLDApOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkb2NvbmVjdCBhcGNhY3RpdmUgYWZ0ZXIgZG9tYWMiLCIiLGFwY2FjdGl2ZSk7CisgICAgICAgICAgICBpZiAoIWFwY2FjdGl2ZSkgeyAgICAgICAgICAgICAgIC8qIEluIGNhc2UgQ0xFQVIgQVBDIHdhcyBpbiBBUEMgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkb2NvbmVjdCBxdWl0IEFQQyBsb29wOiBhcGNhY3RpdmUiLCIiLGFwY2FjdGl2ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBBbHNvIGRvbid0IHJlY29ubmVjdCBpZiBhdXRvZG93bmxvYWQgZmFpbGVkIC0gdmVyeSBjb25mdXNpbmchICovCisgICAgICAgICAgICAvKiBMZXQgdGhlbSB2aWV3IHRoZSBsb2NhbCBzY3JlZW4gdG8gc2VlIHdoYXQgaGFwcGVuZWQuIC0gZmRjICovCisKKyAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIGNvbmRpdGlvbmFsLiAgSWYgc29tZW9uZSBpcyByZWx5aW5nIG9uIHRoZSAqLworICAgICAgICAgICAgLyogY29ubmVjdCBtb2RlIGF1dG9kb3dubG9hZCBmb3IgdGhlIGtlcm1pdCBzZXJ2ZXIgdG8gdXNlIHdpdGggKi8KKyAgICAgICAgICAgIC8qIGEgcmVtb3RlbHkgZXhlY3V0ZWQgc2NyaXB0IHdlIHNob3VsZCBiZSBhYmxlIHRvIHJldHVybiB0byAqLworICAgICAgICAgICAgLyogY29ubmVjdCBtb2RlIG9uIHRoZSBmYWlsdXJlLiAgV2hhdCB3ZSByZWFsbHkgbmVlZCB0byBkbyBpcyAqLworICAgICAgICAgICAgLyogcmVwb3J0IHRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyIGFuZCB0aGVuIHJldHVybiB0byBDT05ORUNULiAqLworICAgICAgICAgICAgLyogSW4gdW5peCB0aGlzIHdvdWxkIHNpbXBseSBiZSBhIHByaW50ZigpLCBidXQgaW4gSzk1IGl0IGNvdWxkICovCisgICAgICAgICAgICAvKiB1c2UgYSBwb3B1cCBkaWFsb2cgdG8gcmVwb3J0IHRoZSBzdGF0dXMuIC0gSmVmZiAqLworCisjaWZuZGVmIE5PWEZFUgorICAgICAgICAgICAgZGVidWcoRjEwMSwiZG9jb25lY3QgeGZlcnN0YXQiLCIiLHhmZXJzdGF0KTsKKyAgICAgICAgICAgIGlmIChhcGNhY3RpdmUgPT0gQVBDX0xPQ0FMICYmICF4ZmVyc3RhdCAmJiBhZGxfZXJyICE9IDApIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkb2NvbmVjdCBxdWl0IEFQQyBsb29wOiB4ZmVyc3RhdCIsIiIseGZlcnN0YXQpOworICAgICAgICAgICAgICAgIGFwY2FjdGl2ZSA9IEFQQ19JTkFDVElWRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIG1zbGVlcCgyNTApOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwiZG9jb25lY3QganVzdG9uZSA0IiwiIixqdXN0b25lKTsKKyAgICAgICAgICAgIHFzYXZlID0gcXVpZXQ7ICAgICAgICAgICAgICAvKiBEbyB0aGlzIGFnYWluLi4uICovCisgICAgICAgICAgICBpZiAoIXF1aWV0ICYmIHEgPiAtMSkKKyAgICAgICAgICAgICAgcXVpZXQgPSBxOworI2lmZGVmIENLX0FVVE9ETAorICAgICAgICAgICAga3NidWZbMF0gPSBOVUw7CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisjaWZkZWYgSUtTX09QVElPTgorI2lmZGVmIENLX0FVVE9ETAorICAgICAgICAgICAgaWYgKGlzX3RuICYmCisgICAgICAgICAgICAgICAgVEVMT1BUX01FKFRFTE9QVF9LRVJNSVQpICYmCisgICAgICAgICAgICAgICAgIVRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQgJiYKKyAgICAgICAgICAgICAgICBhdXRvZGwKKyNpZmRlZiBDS19BUEMKKyAgICAgICAgICAgICAgICAmJiAhYXBjYWN0aXZlCisjZW5kaWYgLyogQ0tfQVBDICovCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgJiYgIXZpZXdvbmx5CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgdG5fc2lrcyhLRVJNSVRfU1RBUlQpOyAgLyogU2VuZCBLZXJtaXQtU2VydmVyIFN0YXJ0ICovCisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisjZW5kaWYgLyogSUtTX09QVElPTiAqLworI2lmbmRlZiBPUzIKKyAgICAgICAgICAgIHggPSBjb25lY3QoKTsgICAgICAgICAgICAgICAvKiBSZS1DT05ORUNULiAqLworI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgICB4ID0gY29uZWN0KDApOworICAgICAgICAgICAgdGVybV9pbyA9IHRlcm1faW9fc2F2ZTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIGRlYm9rID0gMTsKKyAgICAgICAgICAgIHF1aWV0ID0gcXNhdmU7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkb2NvbmVjdCBqdXN0b25lIDUiLCIiLGp1c3RvbmUpOworI2lmZGVmIE5FVENPTk4KKyAgICAgICAgICAgIGlmIChuZXR3b3JrICYmIHR0Y2hrKCkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHRuX2V4aXQgfHwgZXhpdG9uY2xvc2UpCisgICAgICAgICAgICAgICAgICBkb2V4aXQoR09PRF9FWElULHhpdHN0YSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogTkVUQ09OTiAqLworCisjaWZkZWYgT1MyT1JVTklYCisgICAgICAgICAgICAvKiBJZiBjb25uZWN0aW9uIGRyb3BwZWQgKi8KKyAgICAgICAgICAgIGlmICh0dGNoaygpIDwgMCkgeworICAgICAgICAgICAgICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7ICAgIC8qIFJlc3RvcmUgY29uc29sZS4gKi8KKyAgICAgICAgICAgICAgICBpZiAoZXhpdG9uY2xvc2UpCisgICAgICAgICAgICAgICAgICBkb2V4aXQoR09PRF9FWElULHhpdHN0YSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogT1MyT1JVTklYICovCisgICAgICAgIH0gLyogTG9vcCBiYWNrIGZvciBtb3JlLiAqLworI2VuZGlmIC8qIENLX0FQQyAqLworCisjaWZuZGVmIE5PS1ZFUkJTCisgICAgICAgIGlmICgoa2V5bWFjID4gMCkgJiYgKGtleW1hY3ggPiAtMSkpIHsgLyogRXhlY3V0aW5nIGEga2V5Ym9hcmQgbWFjcm8/ICovCisgICAgICAgICAgICAvKiBTZXQgdXAgdGhlIG1hY3JvIGFuZCByZXR1cm4gKi8KKyAgICAgICAgICAgIC8qIERvIG5vdCBjbGVhciB0aGUga2V5bWFjIGZsYWcgKi8KKyNpZmRlZiBPUzIKKwkgICAgdGVybV9pbyA9IHRlcm1faW9fc2F2ZTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIHJldHVybihkb2RvKGtleW1hY3gsTlVMTCxDRl9LTUFDfGNtZHN0a1tjbWRsdmxdLmNjZmxncykpOworICAgICAgICB9CisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgdGVybV9pbyA9IHRlcm1faW9fc2F2ZTsKKyAgICB9IC8qIGlmICghYXN5bmMpICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBDS0NPTklOVEI0Q0IKKyAgICAvKiBUaGUgb3JkZXIgbWFrZXMgYSBkaWZmZXJlbmNlIGluIEhQLVVYIDguMDAuICovCisgICAgLyogVGhlIG90aGVyIG9yZGVyIG1ha2VzIGl0IHRoaW5rIGl0J3MgaW4gdGhlIGJhY2tncm91bmQgd2hlbiBpdCAqLworICAgIC8qIHJldHVybnMgZnJvbSBDT05ORUNUIChBcHIgMTk5OSkuICovCisgICAgc2V0aW50KCk7CisgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBjb25zb2xlIGZvciBjb21tYW5kcyAqLworI2Vsc2UKKyAgICAvKiBUaGlzIGlzIGhvdyBpdCBoYXMgYWx3YXlzIGJlZW4gc28gYmV0dGVyIGxlYXZlIGl0ICovCisgICAgLyogdGhpcyB3YXkgZm9yIGFsbCBub24tSFAtVVgtOC4wMCBidWlsZHMuICovCisgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBjb25zb2xlIGZvciBjb21tYW5kcyAqLworICAgIHNldGludCgpOworI2VuZGlmIC8qIENLQ09OSU5UQjRDQiAqLworI2lmZGVmIE9TMgorICAgIGlmICghYXN5bmMpCisjZW5kaWYgLyogT1MyICovCisgICAgICB3aGF0ID0gV19DT01NQU5EOyAgICAgICAgICAgICAgICAgLyogQmFjayBpbiBjb21tYW5kIG1vZGUuICovCisgICAgcmV0dXJuKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uZS4gKi8KK30KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZm5kZWYgTk9JQ1AKKyNpZmRlZiBDT01NRU5UCisvKgorICBJdCBzZWVtZWQgdGhhdCB0aGlzIHdhcyBuZWVkZWQgZm9yIE9TLzIsIGluIHdoaWNoIFx2KGNtZGZpbGUpIGFuZCBvdGhlcgorICBmaWxlLW9yaWVudGVkIHZhcmlhYmxlcyBvciBmdW5jdGlvbnMgY2FuIHJldHVybiBmaWxlbmFtZXMgY29udGFpbmluZworICBiYWNrc2xhc2hlcywgd2hpY2ggYXJlIHN1YnNlcXVlbnRseSBpbnRlcnByZXRlZCBhcyBxdW90ZXMgcmF0aGVyIHRoYW4KKyAgZGlyZWN0b3J5IHNlcGFyYXRvcnMgKGUuZy4gc2VlIGNvbW1lbnRlZCBzZWN0aW9uIGZvciBWTl9DTURGIGJlbG93KS4KKyAgQnV0IHRoZSBwcm9ibGVtIGNhbid0IGJlIGN1cmVkIGF0IHRoaXMgbGV2ZWwuICBFeGFtcGxlOgorCisgICAgdHlwZSBcdihjbWRmaWxlKQorCisgIFdpdGhvdXQgZG91YmxpbmcsIHRoZSBmaWxlbmFtZSBpcyBwYXJzZWQgY29ycmVjdGx5LCBidXQgdGhlbiB3aGVuIHBhc3NlZAorICB0byBVTklYICdjYXQnIHRocm91Z2ggdGhlIHNoZWxsLCB0aGUgYmFja3NsYXNoIGlzIHJlbW92ZWQsIGFuZCB0aGVuIGNhdAorICBjYW4ndCBvcGVuIHRoZSBmaWxlLiAgV2l0aCBkb3VibGluZywgdGhlIGZpbGVuYW1lIGlzIG5vdCBwYXJzZWQgY29ycmVjdGx5CisgIGFuZCB0aGUgVFlQRSBjb21tYW5kIGZhaWxzIGltbWVkaWF0ZWx5IHdpdGggYSAiZmlsZSBub3QgZm91bmQiIGVycm9yLgorKi8KKy8qCisgIFV0aWxpdHkgcm91dGluZSB0byBkb3VibGUgYWxsIGJhY2tzbGFzaGVzIGluIGEgc3RyaW5nLgorICBzMSBpcyBwb2ludGVyIHRvIHNvdXJjZSBzdHJpbmcsIHMyIGlzIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gc3RyaW5nLAorICBuIGlzIGxlbmd0aCBvZiBkZXN0aW5hdGlvbiBzdHJpbmcsIGJvdGggTlVMLXRlcm1pbmF0ZWQuCisgIFJldHVybnMgMCBpZiBPSywgLTEgaWYgbm90IE9LIChkZXN0aW5hdGlvbiBzdHJpbmcgdG9vIHNob3J0KS4KKyovCitpbnQKK2RibGJzKHMxLHMyLG4pIGNoYXIgKnMxLCAqczI7IGludCBuOyB7CisgICAgaW50IGkgPSAwOworICAgIHdoaWxlICgqczEpIHsKKyAgICAgICAgaWYgKCpzMSA9PSAnXFwnKSB7CisgICAgICAgICAgICBpZiAoKytpID4gbikgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICpzMisrID0gJ1xcJzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKytpID4gbikgcmV0dXJuKC0xKTsKKyAgICAgICAgKnMyKysgPSAqczErKzsKKyAgICB9CisgICAgKnMyID0gTlVMOworICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBDT01NRU5UICovCisKK2NoYXIgKgorZ21kbXR5cCgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBtb2RlbSB0eXBlICovCisjaWZuZGVmIE5PRElBTAorICAgIGludCBpLCB4OworCisgICAgZGVidWcoRjExMSwiZ21kbXR5cCIsIm1kbXR5cCIsbWRtdHlwKTsKKyAgICBkZWJ1ZyhGMTExLCJnbWRtdHlwIiwibWRtc2F2IixtZG1zYXYpOworCisgICAgeCA9IG1kbXR5cDsKKyAgICBpZiAoeCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIG9mIG5ldHdvcmsgZGlhbGluZyAqLworICAgICAgeCA9IG1kbXNhdjsKKyAgICBpZiAoeCA8IDEpCisgICAgICByZXR1cm4oIm5vbmUiKTsKKyAgICBlbHNlCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbm1kbTsgaSsrKQorICAgICAgICBpZiAoKG1kbXRhYltpXS5rd3ZhbCA9PSB4KSAmJiAobWRtdGFiW2ldLmZsZ3MgPT0gMCkpCisgICAgICAgICAgcmV0dXJuKG1kbXRhYltpXS5rd2QpOworI2VuZGlmIC8qIE5PRElBTCAqLworICAgIHJldHVybigibm9uZSIpOworfQorCisjaWZuZGVmIE5PWE1JVAorI2lmbmRlZiBOT0xPQ0FMCisvKiAgVCBSIEEgTiBTIE0gSSBUICAtLSAgUmF3IHVwbG9hZCAgKi8KKworLyogIE9iZXkgY3VycmVudCBsaW5lLCBkdXBsZXgsIHBhcml0eSwgZmxvdywgdGV4dC9iaW5hcnkgc2V0dGluZ3MuICovCisvKiAgUmV0dXJucyAwIHVwb24gYXBwYXJlbnQgc3VjY2VzcywgMSBvbiBvYnZpb3VzIGZhaWx1cmUuICAqLworCisvKioqCisgVGhpbmdzIHRvIGFkZDoKKyAuIE1ha2UgYm90aCB0ZXh0IGFuZCBiaW5hcnkgbW9kZSBvYmV5IHNldCBmaWxlIGJ5dGVzaXplLgorIC4gTWF5YmUgYWxsb3cgdXNlciB0byBzcGVjaWZ5IHRlcm1pbmF0b3JzIG90aGVyIHRoYW4gQ1I/CisgLiBNYXliZSBhbGxvdyB1c2VyIHRvIHNwZWNpZnkgcHJvbXB0cyBvdGhlciB0aGFuIHNpbmdsZSBjaGFyYWN0ZXJzPworIC4gTWFrZSBTVEFUSVNUSUNTIGFsc28gd29yayBmb3IgVFJBTlNNSVQuCisgLiBJZiBUUkFOU01JVCBpcyBkb25lIHdpdGhvdXQgZWNobywgbWFrZSBzb21lIGtpbmQgb2YgKG9wdGlvbmFsKSBkaXNwbGF5LgorIC4gTWFrZSB0aGUgc2FtZSBvcHRpbWl6YXRpb24gZm9yIGJpbmFyeS1tb2RlIHRyYW5zbWl0IHRoYXQgd2FzIGRvbmUgZm9yCisgICB0ZXh0LW1vZGUgKGluIHRoZSBuby1lY2hvIC8gbm8tcHJvbXB0IC8gbm8tcGF1c2UgY2FzZSkuCisqKiovCisKKy8qICBUIFIgQSBOIFMgTSBJIFQgIC0tICBSYXcgdXBsb2FkICAqLworCisvKiAgcyBpcyB0aGUgZmlsZW5hbWUsIHQgaXMgdGhlIHR1cm5hcm91bmQgKHByb21wdCkgY2hhcmFjdGVyICAqLworCisvKgorICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJ1ZmZlci4KKyAgTXVzdCBiZSBsZXNzIHRoYW4gTElOQlVGU0laCisqLworI2lmZGVmIE9TMgorI2RlZmluZSBYTUJVRlMgNDA5NiAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggWFlabW9kZW0gKi8KKyNlbHNlIC8qIE9TMiAqLworI2RlZmluZSBYTUJVRlMgMTAyNAorI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgVE5DT0RFCisjaWZuZGVmIElBQworI2RlZmluZSBJQUMgMjU1CisjZW5kaWYgLyogSUFDICovCisjZW5kaWYgLyogVE5DT0RFICovCisKKyNkZWZpbmUgT1VUWEJVRlNJWiAxNQorc3RhdGljIENIQVIgaW54YnVmW09VVFhCVUZTSVorMV07ICAgICAgIC8qIEhvc3QtdG8tc2NyZWVuIGV4cGFuc2lvbiBidWZmZXIgKi8KK3N0YXRpYyBpbnQgaW54Y291bnQgPSAwOyAgICAgICAgICAgICAgICAvKiBhbmQgY291bnQgKi8KK3N0YXRpYyBDSEFSIG91dHhidWZbT1VUWEJVRlNJWisxXTsgICAgICAvKiBLZXlib2FyZC10by1ob3N0IGV4cGFuc2lvbiBidWYgKi8KK3N0YXRpYyBpbnQgb3V0eGNvdW50ID0gMDsgICAgICAgICAgICAgICAvKiBhbmQgY291bnQgKi8KKworLyogIFQgUiBBIE4gUyBNIEkgVCAgLS0gIFVuZ3VhcmRlZCBub24tcHJvdG9jb2wgZmlsZSB0cmFuc21pc3Npb24gICovCisvKgorICBDYWxsIHdpdGg6CisgICAgY2hhciAqIHM6ICAgTmFtZSBvZiBmaWxlIHRvIHRyYW5zbWl0LgorICAgIGNoYXIgdDogICAgIFR1cm5hcm91bmQgY2hhciBmb3IgdGV4dC1tb2RlIHRyYW5zbWlzc2lvbiAobm9ybWFsbHkgTEYpLgorICAgIGludCB4bGF0ZTogIG5vbnplcm8gPSBjaGFyc2V0IHRyYW5zbGF0aW9uIGZvciB0ZXh0LW1vZGUgeGZlciwgMCA9IHNraXAuCisgICAgaW50IGJpbmFyeTogbm9uemVybyA9IHRyYW5zbWl0IGluIGJpbmFyeSBtb2RlLCAwID0gaW4gdGV4dCBtb2RlLgorKi8KKyNkZWZpbmUgWEJCVUZTSVogMjUyICAgICAgICAgICAgICAgICAgICAvKiBGb3IgYmluYXJ5IGJsYXN0aW5nICovCitzdGF0aWMgQ0hBUiB4YmJ1ZltYQkJVRlNJWis0XTsKKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3RyYW5zbWl0KGNoYXIgKiBzLCBjaGFyIHQsIGludCB4bGF0ZSwgaW50IGJpbmFyeSwgaW50IHh4ZWNobykKKyNlbHNlCit0cmFuc21pdChzLHQseGxhdGUsYmluYXJ5LHh4ZWNobykgY2hhciAqczsgY2hhciB0OyBpbnQgeGxhdGUsIGJpbmFyeSwgeHhlY2hvOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0cmFuc21pdCAqLyB7CisjaWZkZWYgTUFDCisgICAgZXh0ZXJuIGNoYXIgc3N0YXRlOworICAgIGludCBjb3VudCA9IDEwMDsKKyNlbHNlCisgICAgaW50IGNvdW50ID0gMDsKKyNpZmRlZiBPUzIKKyNpZmRlZiBOVAorICAgIFNJR1RZUCAoKiBvbGRzaWcpKGludCk7ICAgICAgICAgICAgIC8qIEZvciBzYXZpbmcgb2xkIGludGVycnVwdCB0cmFwLiAqLworI2Vsc2UgLyogTlQgKi8KKyAgICBTSUdUWVAgKCogdm9sYXRpbGUgb2xkc2lnKShpbnQpOworI2VuZGlmIC8qIE5UICovCisKKyNlbHNlIC8qIE9TMiAqLworICAgIFNJR1RZUCAoKiBvbGRzaWcpKCk7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTUFDICovCisgICAgaW50IGVvZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mIEZpbGUgZmxhZyAqLworICAgIGludCBlb2wgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBMaW5lIGZsYWcgKi8KKyAgICBpbnQgcmMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gY29kZS4gMD1mYWlsLCAxPXN1Y2NlZWQuICovCisgICAgaW50IG15ZmxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9jYWwgY29weSBvZiBnbG9iYWwgZmxvdy4uLiAqLworICAgIGludCBpc190biA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIERvIFRlbG5ldCBuZWdvdGlhdGlvbnMgKi8KKyAgICBpbnQgeGJ1ZnNpeiA9IFhNQlVGUzsgICAgICAgICAgICAgICAvKiBTaXplIG9mIFRSQU5TTUlUIGJ1ZmZlciAqLworICAgIGludCB4LCB5LCBjLCBpOyAgICAgICAgICAgICAgICAgICAgIC8qIEludCB3b3JrZXJzLi4uICovCisgICAgaW50IGNvbnRyb2wgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogRWNobyBsb29wIGNvbnRyb2wgKi8KKyAgICBsb25nIG5ieXRlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIGJ5dGUgY291bnQgKi8KKyAgICBsb25nIHp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb25nIHdvcmtlciAqLworICAgIGNoYXIgKnA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoYXIgKiB3b3JrZXIgKi8KKworI2lmZGVmIFBJUEVTRU5ECisgICAgZXh0ZXJuIGludCBwaXBlc2VuZDsKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICBpbnQgdGNzID0gVENfVFJBTlNQOyAgICAgICAgICAgICAgICAvKiBJbnRlcm1lZGlhdGUgKHhmZXIpIGNoYXIgc2V0ICovCisgICAgaW50IGxhbmdzdiA9IExfVVNBU0NJSTsgICAgICAgICAgICAgLyogU2F2ZSBjdXJyZW50IGxhbmd1YWdlICovCisgICAgaW50IHVuaWNvZGUgPSAwOworICAgIGludCB0Y3NzaXplID0gMDsKKworI2lmZGVmIENLX0FOU0lDIC8qIEFOU0kgQyBwcm90b3R5cGVzLi4uICovCisgICAgQ0hBUiAoKnN4bykoQ0hBUik7CisgICAgQ0hBUiAoKnJ4bykoQ0hBUik7CisgICAgQ0hBUiAoKnN4aSkoQ0hBUik7CisgICAgQ0hBUiAoKnJ4aSkoQ0hBUik7CisjZWxzZSAvKiBOb3QgQU5TSSBDLi4uICovCisgICAgQ0hBUiAoKnN4bykoKTsKKyAgICBDSEFSICgqcnhvKSgpOworICAgIENIQVIgKCpzeGkpKCk7CisgICAgQ0hBUiAoKnJ4aSkoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworI2lmZGVmIFVOSUNPREUKKyAgICB1bmlvbiBja19zaG9ydCB1YzsKKyAgICBpbnQgYm9tb3JkZXIgPSAwOworI2lmZGVmIENLX0FOU0lDCisgICAgZXh0ZXJuIGludCAoKnhsX3VmY1tNQVhGQ1NFVFMrMV0pKFVTSE9SVCk7ICAvKiBVbmljb2RlIHRvIEZDUyAqLworICAgIGV4dGVybiBVU0hPUlQgKCp4bF9mY3VbTUFYRkNTRVRTKzFdKShDSEFSKTsgLyogRkNTIHRvIFVuaWNvZGUgKi8KKyAgICBleHRlcm4gaW50ICgqeHVmKShVU0hPUlQpOworICAgIGV4dGVybiBVU0hPUlQgKCp4ZnUpKENIQVIpOworI2Vsc2UKKyAgICBleHRlcm4gaW50ICgqeGxfdWZjW01BWEZDU0VUUysxXSkoKTsKKyAgICBleHRlcm4gVVNIT1JUICgqeGxfZmN1W01BWEZDU0VUUysxXSkoKTsKKyAgICBleHRlcm4gaW50ICgqeHVmKSgpOworICAgIGV4dGVybiBVU0hPUlQgKCp4ZnUpKCk7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyNlbmRpZiAvKiBVTklDT0RFICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCisgICAgZGVidWcoRjEwMSwieG1pdCB0IiwiIix0KTsKKyAgICBkZWJ1ZyhGMTAxLCJ4bWl0IHhsYXRlIiwiIix4bGF0ZSk7CisgICAgZGVidWcoRjEwMSwieG1pdCBiaW5hcnkiLCIiLGJpbmFyeSk7CisKKyNpZmRlZiBQSVBFU0VORAorICAgIGlmIChwaXBlc2VuZCkgeworICAgICAgICBpZiAobm9wdXNoKSByZXR1cm4oLTIpOworICAgICAgICBpZiAoenhjbWQoWklGSUxFLHMpIDwgMSkgeworICAgICAgICAgICAgcHJpbnRmKCI/Q2FuJ3Qgc3RhcnQgY29tbWFuZDogJXNcbiIscyk7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworICAgIGlmICh6b3BlbmkoWklGSUxFLHMpID09IDApIHsgICAgICAgIC8qIE9wZW4gdGhlIGZpbGUgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKyAgICAgICAgcHJpbnRmKCI/Q2FuJ3Qgb3BlbiBmaWxlICVzXG4iLHMpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIHggPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9wZW4gdGhlIGNvbW11bmljYXRpb24gY2hhbm5lbCAqLworICAgIGlmICh0dG9wZW4odHRuYW1lLCZ4LG1kbXR5cCxjZHRpbW8pIDwgMCkgeyAgLyogKG5vIGhhcm0gaWYgYWxyZWFkeSBvcGVuKSAqLworICAgICAgICBwcmludGYoIkNhbid0IG9wZW4gZGV2aWNlICVzXG4iLHR0bmFtZSk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgenogPSB4ID8gc3BlZWQgOiAtMUw7CisgICAgaWYgKGJpbmFyeSkgeyAgICAgICAgICAgICAgICAgICAgICAgLyogQmluYXJ5IGZpbGUgdHJhbnNtaXNzaW9uICovCisgICAgICAgIG15ZmxvdyA9IChmbG93ID09IEZMT19YT05YKSA/IEZMT19OT05FIDogZmxvdzsKKworICAgICAgICBpZiAodHR2dCh6eixteWZsb3cpIDwgMCkgeyAgICAgIC8qIFNvIG5vIFhvbi9Yb2ZmISAqLworICAgICAgICAgICAgcHJpbnRmKCJDYW4ndCBjb25kaXRpb24gbGluZVxuIik7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAodHRwa3QoenosZmxvdyxwYXJpdHkpIDwgMCkgeyAvKiBQdXQgdGhlIGxpbmUgaW4gInBhY2tldCBtb2RlIiAqLworICAgICAgICAgICAgcHJpbnRmKCJDYW4ndCBjb25kaXRpb24gbGluZVxuIik7IC8qIHNvIFhvbi9Yb2ZmIHdpbGwgd29yaywgZXRjLiAqLworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgfQorICAgIGlzX3RuID0KKyNpZmRlZiBUTkNPREUKKyAgICAgIChsb2NhbCAmJiBuZXR3b3JrICYmIElTX1RFTE5FVCgpKSB8fCAoIWxvY2FsICYmIHNzdGVsbmV0KQorI2Vsc2UKKyAgICAgICAgMAorI2VuZGlmIC8qIFROQ09ERSAqLworICAgICAgICAgIDsKKworI2lmbmRlZiBOT0NTRVRTCisvKiBTZXQgdXAgY2hhcmFjdGVyIHNldCB0cmFuc2xhdGlvbnMgKi8KKworICAgIHRjcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUcmFuc2ZlciIgb3IgIk90aGVyIiBjaGFyc2V0ICovCisgICAgc3hvID0gcnhvID0gTlVMTDsgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBieXRlLXRvLWJ5dGUgZnVuY3Rpb25zICovCisgICAgc3hpID0gcnhpID0gTlVMTDsKKyAgICB1bmljb2RlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBc3N1bWUgVW5pY29kZSB3b24ndCBiZSBpbnZvbHZlZCAqLworICAgIGlmICghYmluYXJ5ICYmIHhsYXRlKSB7ICAgICAgICAgICAgIC8qIFNldCB1cCBjaGFyc2V0IHRyYW5zbGF0aW9ucyAqLworLyoKKyAgSW4gdGhlIFNFTkRJTkcgZGlyZWN0aW9uLCB3ZSBhcmUgY29udmVydGluZyBmcm9tIHRoZSBsb2NhbCBmaWxlJ3MKKyAgY2hhcmFjdGVyLXNldCAoZmNoYXJzZXQpIHRvIHRoZSByZW1vdGUgdGVybWluYWwgY2hhcnNldCAodGNzcikuICBJbiB0aGUKKyAgUkVDRUlWSU5HIGRpcmVjdGlvbiAoZWNob2luZykgd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSB0aGUgcmVtb3RlIGVuZCBvZiB0aGUKKyAgdGVybWluYWwgY2hhcnNldCAodGNzcikgdG8gaXRzIGxvY2FsIGVuZCAodGNzbCksIHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseQorICB0aGUgc2FtZSBhcyB0aGUgZmlsZSBjaGFyYWN0ZXItc2V0LiAgRXNwZWNpYWxseSB3aGVuIHRoZSBmaWxlIGNoYXJhY3RlcgorICBzZXQgaXMgVUNTLTIsIHdoaWNoIGlzIG5vdCBhIHZhbGlkIHRlcm1pbmFsIGNoYXJhY3RlciBzZXQuICBUaGUgdmFyaW91cworICBjb21iaW5hdGlvbnMgYXJlIHJlcHJlc2VudGVkIGluIHRoaXMgdGFibGU6CisKKyAgRkNTID0gRmlsZSBDaGFyYWN0ZXIgU2V0CisgIFJDUyA9IFJlbW90ZSBUZXJtaW5hbCBDaGFyYWN0ZXIgU2V0CisgIENDUyA9IENvbnNvbGUgKExvY2FsIFRlcm1pbmFsKSBDaGFyYWN0ZXIgU2V0CisKKyAgIDggICA0ICAgMiAgIDEKKyAgRkNTIEZDUyBSQ1MgQ0NTCisgIFVDUyBVVEYgVVRGIFVURgorICAgMCAgIDAgICAwICAgMCAgID0gICAwICAgPSAgIE5vIHRyYW5zbGF0aW9uCisgICAwICAgMCAgIDAgICAxICAgPSAgIDEgICA9ICAgRkNTIC0+IFJDUywgRWNobyBSQ1MgLT4gVVRGCisgICAwICAgMCAgIDEgICAwICAgPSAgIDIgICA9ICAgRkNTIC0+IFVURiwgRWNobyBVVEYgLT4gQ0NTCisgICAwICAgMCAgIDEgICAxICAgPSAgIDMgICA9ICAgRkNTIC0+IFVURiwgRWNobyBubyB0cmFuc2xhdGlvbgorCisgICAwICAgMSAgIDAgICAwICAgPSAgIDQgICA9ICAgVVRGIC0+IFJDUywgRWNobyBSQ1MgLT4gQ0NTCisgICAwICAgMSAgIDAgICAxICAgPSAgIDUgICA9ICAgVVRGIC0+IFJDUywgRWNobyBSQ1MgLT4gVVRGCisgICAwICAgMSAgIDEgICAwICAgPSAgIDYgICA9ICAgVVRGIC0+IFVURiwgRWNobyBVVEYgLT4gQ0NTCisgICAwICAgMSAgIDEgICAxICAgPSAgIDcgICA9ICAgTm8gdHJhbnNsYXRpb24KKworICAgMSAgIDAgICAwICAgMCAgID0gICA4ICAgPSAgIFVDUyAtPiBSQ1MsIEVjaG8gUkNTIC0+IENDUworICAgMSAgIDAgICAwICAgMSAgID0gICA5ICAgPSAgIFVDUyAtPiBSQ1MsIEVjaG8gUkNTIC0+IFVURgorICAgMSAgIDAgICAxICAgMCAgID0gIDEwICAgPSAgIFVDUyAtPiBVVEYsIEVjaG8gVVRGIC0+IENDUworICAgMSAgIDAgICAxICAgMSAgID0gIDExICAgPSAgIFVDUyAtPiBVVEYsIEVjaG8gbm8gdHJhbnNsYXRpb24KKyovCisjaWZkZWYgVU5JQ09ERQorICAgICAgICB4ZnUgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgIC8qIFVuaWNvZGUgdHJhbnNsYXRpb24gZnVuY3Rpb25zICovCisgICAgICAgIHh1ZiA9IE5VTEw7CisgICAgICAgIGJvbW9yZGVyID0gdWNzb3JkZXI7ICAgICAgICAgICAgLyogVUNTLTIgYnl0ZSBvcmRlciAqLworCisgICAgICAgIGlmIChmY2hhcnNldCA9PSBGQ19VQ1MyKSAgICAgICAgLyogRmlsZSBjaGFyc2V0IGlzIFVDUy0yICovCisgICAgICAgICAgdW5pY29kZSB8PSA4OworICAgICAgICBlbHNlIGlmIChmY2hhcnNldCA9PSBGQ19VVEY4KSAgIC8qIEZpbGUgY2hhcnNldCBpcyBVVEYtOCAqLworICAgICAgICAgIHVuaWNvZGUgfD0gNDsKKyAgICAgICAgaWYgKHRjc3IgPT0gRkNfVVRGOCkgICAgICAgICAgICAvKiBSZW1vdGUgdGVybSBjaGFyc2V0IGlzIFVURi04ICovCisgICAgICAgICAgdW5pY29kZSB8PSAyOworICAgICAgICBpZiAodGNzbCA9PSBGQ19VVEY4KSAgICAgICAgICAgIC8qIExvY2FsIHRlcm0gY2hhcnNldCBpcyBVVEYtOCAqLworICAgICAgICAgIHVuaWNvZGUgfD0gMTsKKyNlbmRpZiAvKiBVTklDT0RFICovCisvKgorICBXaGVuIFVuaWNvZGUgbm90IGludm9sdmVkIC0tIFRDUyBpcyB0aGUgaW50ZXJtZWRpYXRlICh4ZmVyKSBzZXQsIGFuZDoKKyAgc3hvID0gRmlsZS10by1JbnRlcm1lZGlhdGUgY2hhcnNldCBmdW5jdGlvbgorICByeG8gPSBJbnRlcm1lZGlhdGUtdG8tUmVtb3RlLVRlcm1pbmFsIGNoYXJzZXQgZnVuY3Rpb24KKyAgc3hpID0gUmVtb3RlLVRlcm1pbmFsLXRvLUludGVybWVkaWF0ZQorICByeGkgPSBJbnRlcm1lZGlhdGUtdG8tTG9jYWwtVGVybWluYWwKKyovCisgICAgICAgIHRjcyA9IGdldHRjcyh0Y3NyLGZjaGFyc2V0KTsgICAgLyogR2V0IGludGVybWVkaWF0ZSBzZXQuICovCisgICAgICAgIHN4byA9IHhsc1t0Y3NdW2ZjaGFyc2V0XTsgICAgICAgLyogdHJhbnNsYXRpb24gZnVuY3Rpb24gKi8KKyAgICAgICAgcnhvID0geGxyW3Rjc11bdGNzcl07ICAgICAgICAgICAvKiBwb2ludGVycyBmb3Igb3V0cHV0IGZ1bmN0aW9ucyAqLworICAgICAgICBzeGkgPSB4bHNbdGNzXVt0Y3NyXTsgICAgICAgICAgIC8qIGFuZCBmb3IgaW5wdXQgZnVuY3Rpb25zLiAqLworICAgICAgICByeGkgPSB4bHJbdGNzXVt0Y3NsXTsKKy8qCisgIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB1bmljb2RlIG5vbnplcm8gaWYgVW5pY29kZSBpcyBpbnZvbHZlZCBpbiB0aGUKKyAgY29udmVyc2lvbiwgYW5kIHRvIDAgaWYgaXQgaXMgbm90LgorICBUaGUgZm9sbG93aW5nIGlzIHRvIHByZXZlbnQgdXNlIG9mIHptc3R1ZmYoKSBhbmQgemRzdHVmZigpIGJ5IHRyYW5zbGF0aW9uCisgIGZ1bmN0aW9ucyAoc3R1ZmZpbmcgd29ya3Mgd2l0aCBmaWxlIGkvbywgbm90IHdpdGggY29tbXVuaWNhdGlvbiBpL28pLgorKi8KKyAgICAgICAgbGFuZ3N2ID0gbGFuZ3VhZ2U7ICAgICAgICAgICAgICAvKiBTYXZlIGN1cnJlbnQgU0VUIExBTkdVQUdFICovCisgICAgICAgIGxhbmd1YWdlID0gTF9VU0FTQ0lJOyAgICAgICAgICAgLyogTm8gbGFuZ3VhZ2Utc3BlY2lmaWMgdHJhbnNsYXRpb25zICovCisgICAgfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworICAgIGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJlZ2lubmluZyBvZiBidWZmZXIuICovCisjaWZuZGVmIE1BQworI2lmbmRlZiBBTUlHQQorICAgIG9sZHNpZyA9IHNpZ25hbChTSUdJTlQsIHRydHJhcCk7ICAgIC8qIFNhdmUgY3VycmVudCBpbnRlcnJ1cHQgdHJhcC4gKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworI2VuZGlmIC8qIE1BQyAqLworICAgIHRyX2ludCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhdmUgbm90IGJlZW4gaW50ZXJydXB0ZWQgKHlldCkuICovCisgICAgcmMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGNvZGUgcHJlc3VtZWQgZ29vZC4gKi8KKyNpZmRlZiBWTVMKKyAgICBjb25yZXMoKTsKKyNlbmRpZiAvKiBWTVMgKi8KKworI2lmbmRlZiBOT0NTRVRTCisgICAgZGVidWcoRjEwMSwiWE1JVCB1bmljb2RlIiwiIix1bmljb2RlKTsKKyNpZmRlZiBVTklDT0RFCisgICAgZGVidWcoRjEwMSwiWE1JVCBib21vcmRlciIsIiIsYm9tb3JkZXIpOworI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyAgICBjID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsIGNvbmRpdGlvbiAqLworICAgIHdoaWxlIChjID4gLTEgJiYgIWVvZikgeyAgICAgICAgICAgIC8qIExvb3AgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIGZpbGUgKi8KKyAgICAgICAgZW9sID0gMDsKKyNpZmRlZiBNQUMKKyAgICAgICAgLyoKKyAgICAgICAgICogSXQgaXMgZXhwZW5zaXZlIHRvIHJ1biB0aGUgbWluaXBhcnNlciBzbyBkb24ndCBkbyBpdCBmb3IKKyAgICAgICAgICogZXZlcnkgY2hhcmFjdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKC0tY291bnQgPCAwKSB7CisgICAgICAgICAgICBjb3VudCA9IDEwMDsKKyAgICAgICAgICAgIG1pbmlwYXJzZXIoMSk7CisgICAgICAgICAgICBpZiAoc3N0YXRlID09ICdhJykgeworICAgICAgICAgICAgICAgIHNzdGF0ZSA9ICdcMCc7CisgICAgICAgICAgICAgICAgZ290byB4bWl0ZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2Vsc2UgLyogTm90IE1BQyAqLworICAgICAgICBpZiAodHJfaW50KSB7ICAgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdGVkPyAqLworICAgICAgICAgICAgcHJpbnRmKCJeQy4uLlxuIik7ICAgICAgICAgIC8qIFByaW50IG1lc3NhZ2UgKi8KKyAgICAgICAgICAgIGdvdG8geG1pdGZhaWw7CisgICAgICAgIH0KKyNlbmRpZiAvKiBNQUMgKi8KKyAgICAgICAgYyA9IHptaW5jaGFyKCk7ICAgICAgICAgICAgICAgICAvKiBHZXQgYSBmaWxlIGNoYXJhY3RlciAqLworI2lmZGVmIENPTU1FTlQKKy8qIHRvbyBtdWNoICovCisjaWZkZWYgREVCVUcKKyAgICAgICAgaWYgKGRlYmxvZykgeworICAgICAgICAgICAgaWYgKGMgPCAwKQorICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJYTUlUIHptaW5jaGFyIiwiIixjKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZGVidWcoRjAwMCwiWE1JVCB6bWluY2hhciIsIiIsYyk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgaWYgKGMgPCAtMSkgeyAgICAgICAgICAgICAgICAgICAvKiBPdGhlciBlcnJvciAqLworICAgICAgICAgICAgcHJpbnRmKCI/VFJBTlNNSVQgZmlsZSByZWFkIGVycm9yOiAlc1xuIixja19lcnJzdHIoKSk7CisgICAgICAgICAgICBnb3RvIHhtaXRmYWlsOworICAgICAgICB9IGVsc2UgaWYgKGMgPiAtMSkgeworICAgICAgICAgICAgbmJ5dGVzKys7CisgICAgICAgICAgICBjICY9IGZtYXNrOyAgICAgICAgICAgICAgICAgLyogQXBwbHkgU0VUIEZJTEUgQllURVNJWkUgbWFzayAqLworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGVvZiA9IDE7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJYTUlUIGVvZiIsIiIsZW9mKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmluYXJ5KSB7ICAgICAgICAgICAgICAgICAgIC8qIEJpbmFyeS4uLiAqLworICAgICAgICAgICAgaWYgKGMgPT0gLTEpIHsgICAgICAgICAgICAgIC8qIElmIEVPRiAqLworICAgICAgICAgICAgICAgIHJjID0gMTsgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBlb2YgPSAxOworICAgICAgICAgICAgICAgIGdvdG8geG1pdGV4aXQ7ICAgICAgICAgIC8qIERvbmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgheG1pdHcgJiYgIXh4ZWNobykgeyAgICAvKiBTcGVjaWFsICJibGFzdCIgbW9kZSAqLworICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSBYQkJVRlNJWikgeyAvKiBGaWxlIGlucHV0IGJ1ZmZlciBmdWxsLi4uICovCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB0dG9sKHhiYnVmLGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5IDwgMCkgeyAgICAvKiB0cnkgdG8gc2VuZCBpdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9UUkFOU01JVCBvdXRwdXQgZXJyb3I6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja19lcnJzdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiWE1JVCBiaW5hcnkgdHRvbCBlcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tfZXJyc3RyKCksZXJybm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5IDwgMCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAtPSB5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeGJidWZbY291bnQrK10gPSBjOworI2lmZGVmIFROQ09ERQorICAgICAgICAgICAgICAgIGlmIChjID09IElBQyAmJiBpc190bikgIC8qIFRlbG5ldCBJQUMgKi8KKyAgICAgICAgICAgICAgICAgIHhiYnVmW2NvdW50KytdID0gSUFDOyAvKiBtdXN0IGJlIGRvdWJsZWQgKi8KKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0dG9jKGRvcGFyKChjaGFyKSBjKSkgPCAwKSB7IC8qIGVsc2UganVzdCBzZW5kIHRoZSBjaGFyICovCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/Q2FuJ3QgdHJhbnNtaXQgY2hhcmFjdGVyXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIHhtaXRmYWlsOworICAgICAgICAgICAgfQorI2lmZGVmIFROQ09ERQorICAgICAgICAgICAgaWYgKGMgPT0gSUFDICYmIGlzX3RuKSAgICAgIC8qIFF1b3RlIFRlbG5ldCBJQUMgKi8KKyAgICAgICAgICAgICAgdHRvYygoY2hhcilJQUMpOworI2VuZGlmIC8qIFROQ09ERSAqLworCisgICAgICAgICAgICBpZiAoeG1pdHcpICAgICAgICAgICAgICAgICAgLyogUGF1c2UgaWYgcmVxdWVzdGVkICovCisgICAgICAgICAgICAgIG1zbGVlcCh4bWl0dyk7CisKKyAgICAgICAgICAgIGlmICh4eGVjaG8pIHsgICAgICAgICAgICAgICAvKiBTRVQgVFJBTlNNSVQgRUNITyBPTj8gKi8KKyAgICAgICAgICAgICAgICBpZiAoZHVwbGV4KSB7ICAgICAgICAgICAvKiBZZXMsIGZvciBoYWxmIGR1cGxleCAqLworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgIC8qIEVjaG8gdG8gZW11bGF0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0d3J0YnVmKChVU0hPUlQpKGMgJiBjbWRtc2spKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjb25vYygoY2hhcikoYyAmIGNtZG1zaykpIDwgMCkgLyogZWNobyBsb2NhbGx5LiAqLworICAgICAgICAgICAgICAgICAgICAgIGdvdG8geG1pdGZhaWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogRm9yIGZ1bGwgZHVwbGV4LCAqLworICAgICAgICAgICAgICAgICAgICBpbnQgaSwgbjsgICAgICAgICAgIC8qIGRpc3BsYXkgd2hhdGV2ZXIgaXMgdGhlcmUuICovCisgICAgICAgICAgICAgICAgICAgIG4gPSB0dGNoaygpOyAgICAgICAgLyogU2VlIGhvdyBtYW55IGNoYXJzIGFyZSB3YWl0aW5nICovCisgICAgICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgeyAgICAgICAgLyogQ29ubmVjdGlvbiBkcm9wcGVkPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/Q29ubmVjdGlvbiBsb3N0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8geG1pdGZhaWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeyAvKiBSZWFkIGFuZCBlY2hvIHRoYXQgbWFueS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSB0dGluYyh4bWl0dCk7IC8qIFRpbWVkIHJlYWQganVzdCBpbiBjYXNlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPiAtMSkgeyAgIC8qIElmIG5vIHRpbWVvdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyaXR5KSB4ICY9IDB4N2Y7IC8qIGRpc3BsYXkgdGhlIGNoYXIsICovCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFY2hvIHRvIGVtdWxhdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0d3J0YnVmKChVU0hPUlQpeCk7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25vYygoY2hhcikoeCAmIGNtZG1zaykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9PdXRwdXQgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHhtaXRmYWlsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA9PSAtMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ29ubmVjdGlvbiBjbG9zZWQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGNsb3MoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB4bWl0ZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2Vzc2lvbiBMaW1pdCBleGNlZWRlZCAtIGNsb3NpbmcgY29ubmVjdGlvbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGNsb3MoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB4bWl0ZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/Q29tbXVuaWNhdGlvbnMgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8geG1pdGZhaWw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgdHRmbHVpKCk7ICAgICAgICAgICAgLyogTm90IGVjaG9pbmcsIGp1c3QgZmx1c2ggaW5wdXQuICovCisKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUZXh0IG1vZGUsIGxpbmUgYXQgYSB0aW1lLiAqLworI2lmZGVmIFVOSUNPREUKKyAgICAgICAgICAgIGlmIChmY2hhcnNldCA9PSBGQ19VQ1MyICYmIHhsYXRlKSB7IC8qIFNwZWNpYWwgZm9yIFVDUy0yICovCisgICAgICAgICAgICAgICAgY2hhciB4YnVmWzhdOworICAgICAgICAgICAgICAgIHggPSAxIC0gKG5ieXRlcyAmIDEpOyAgIC8qIE9kZCBvciBldmVuIGJ5dGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAwKSAgICAgICAgICAgICAvKiBOb3RlOiAxID0gdGhlIDFzdCwgMCA9IDJuZCwgZXRjICovCisgICAgICAgICAgICAgICAgICB1Yy54X3Nob3J0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoYm9tb3JkZXIpICAgICAgICAgICAvKiBMaXR0bGUgRW5kaWFuICovCisgICAgICAgICAgICAgICAgICB4ID0gMSAtIHg7ICAgICAgICAgICAgLyogU2F2ZSBieXRlIGluIGFwcHJvcHJpYXRlIGhhbGYgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJYTUlUIFVDUzIgeCIsIiIseCk7CisgICAgICAgICAgICAgICAgdWMueF9jaGFyW3hdID0gKENIQVIpIChjICYgMHhmZik7CisgICAgICAgICAgICAgICAgaWYgKG5ieXRlcyAmIDEpICAgICAgICAgLyogRmlyc3QgYnl0ZSwgZ28gYmFjayBmb3IgbmV4dCAqLworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKG5ieXRlcyA9PSAyKSB7ICAgICAgLyogVUNTLTIgQnl0ZSBPcmRlciBNYXJrICovCisgICAgICAgICAgICAgICAgICAgIGlmICh1Yy54X3Nob3J0ID09IChVU0hPUlQpIDB4ZmVmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiWE1JVCBVQ1MyIEJPTSBGRUZGIiwiIixib21vcmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1Yy54X3Nob3J0ID09IChVU0hPUlQpIDB4ZmZmZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9tb3JkZXIgPSAxIC0gYm9tb3JkZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJYTUlUIFVDUzIgQk9NIEZGRkUgKHN3YXApIiwiIixib21vcmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcHJpbnRmKHhidWYsIiUwNFgiLHVjLnhfc2hvcnQpOyAvKiBTQUZFICovCisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiWE1JVCBVQ1MyIix4YnVmLHVjLnhfc2hvcnQpOworICAgICAgICAgICAgICAgIGlmIChuYnl0ZXMgJiAxKSAgICAgICAgIC8qIFNwZWNpYWwgZW9sIHRlc3QgZm9yIFVDUy0yICovCisgICAgICAgICAgICAgICAgICBpZiAodWMueF9zaG9ydCA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgICBlb2wgPSAxOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgICAgICBpZiAodWMueF9zaG9ydCA9PSAweDIwMjggfHwgdWMueF9zaG9ydCA9PSAweDIwMjkpCisgICAgICAgICAgICAgICAgICAgIGVvbCA9IDE7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogVU5JQ09ERSAqLworICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7ICAgICAgICAgIC8qIE5vcm1hbCBlb2wgdGVzdCBvdGhlcndpc2UgKi8KKyAgICAgICAgICAgICAgICAgIGVvbCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW9sKSB7ICAgICAgICAgICAgICAgICAgLyogRW5kIG9mIGxpbmU/ICovCisgICAgICAgICAgICAgICAgaW50IHN0dWZmID0gLTE7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiWE1JVCBlb2wgbGVuZ3RoIiwiIixpKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7ICAgICAgICAgICAvKiBCbGFuayBsaW5lPyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoeG1pdGYpICAgICAgICAgIC8qIFllcywgaW5zZXJ0IGZpbGwgaWYgYXNrZWQuICovCisgICAgICAgICAgICAgICAgICAgICAgbGluZVtpKytdID0gZG9wYXIoKGNoYXIpIHhtaXRmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCB8fCAoKGNoYXIpIGxpbmVbaS0xXSkgIT0gKChjaGFyKSBkb3BhcihDUikpKQorICAgICAgICAgICAgICAgICAgbGluZVtpKytdID0gZG9wYXIoQ1IpOyAvKiBUZXJtaW5hdGUgaXQgd2l0aCBDUiAqLworICAgICAgICAgICAgICAgIGlmICh4bWl0bCkgeworICAgICAgICAgICAgICAgICAgICBzdHVmZiA9IExGOworI2lmZGVmIFROQ09ERQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNfdG4gJiYgKHRuX25sbSAhPSBUTkxfQ1IpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRFTE5FVCBORVdMSU5FIE9OL09GRi9SQVcgKi8KKyAgICAgICAgICAgICAgICAgICAgc3R1ZmYgPSAodG5fbmxtID09IFROTF9DUkxGKSA/IExGIDogTlVMOworI2VuZGlmIC8qIFROQ09ERSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3R1ZmYgPiAtMSkKKyAgICAgICAgICAgICAgICAgIGxpbmVbaSsrXSA9IGRvcGFyKChjaGFyKXN0dWZmKTsKKyAgICAgICAgICAgICAgICBsaW5lW2ldID0gTlVMOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIlhNSVQgZW9sIGxpbmUiLGxpbmUsaSk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyAhPSAtMSkgeyAgICAgICAvKiBOb3QgYSBuZXdsaW5lLCByZWd1bGFyIGNoYXJhY3RlciAqLworICAgICAgICAgICAgICAgIGludCBrLCB4OworICAgICAgICAgICAgICAgIG91dHhidWZbMF0gPSBjOyAgICAgICAgIC8qIEluIGNhc2Ugb2Ygbm8gdHJhbnNsYXRpb24gKi8KKyAgICAgICAgICAgICAgICBvdXR4Y291bnQgPSAxOyAgICAgICAgICAvKiBBc3N1bWUgcmVzdWx0IGlzIG9uZSBieXRlICovCisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHVuaWNvZGUpIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAvKiBObyBVbmljb2RlIGludm9sdmVkICovCisgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIGlmICh4bGF0ZSkgeyAgICAgICAgLyogSWYgbm90IC9UUkFOU1BBUkVOVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9jYWwtdG8taW50ZXJtZWRpYXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3hvKSBjID0gKCpzeG8pKChjaGFyKWMpOworICAgICAgICAgICAgICAgICAgICAgICAgLyogSW50ZXJtZWRpYXRlLXRvLXJlbW90ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ4bykgYyA9ICgqcnhvKSgoY2hhciljKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHhidWZbMF0gPSBjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFVOSUNPREUKKyAgICAgICAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAvKiBMb2NhbCBieXRlIHRvIFVURi04ICovCisgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIHhmdSA9IHhsX2ZjdVtmY2hhcnNldF07CisgICAgICAgICAgICAgICAgICAgIHRjc3NpemUgPSBmY3NpbmZvW2ZjaGFyc2V0XS5zaXplOworICAgICAgICAgICAgICAgICAgICBvdXR4Y291bnQgPQorICAgICAgICAgICAgICAgICAgICAgIGJfdG9fdSgoQ0hBUiljLG91dHhidWYsT1VUWEJVRlNJWix0Y3NzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgLyogTG9jYWwgVVRGLTggdG8gcmVtb3RlIGJ5dGUgKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgeHVmID0geGxfdWZjW3Rjc3JdOworICAgICAgICAgICAgICAgICAgICB4ID0gdV90b19iKChDSEFSKWMpOyAvKiBDb252ZXJ0IHRvIGJ5dGUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPT0gLTEpIHsgICAgICAvKiBJZiBtb3JlIGlucHV0IGJ5dGVzIG5lZWRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgIC8qIGdvIGJhY2sgYW5kIGdldCB0aGVtICovCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA9PSAtMikgeyAvKiBMUyBvciBQUyAoc2hvdWxkbid0IGhhcHBlbikgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHhidWZbMF0gPSBDUjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4ID09IC05KSB7IC8qIFVURi04IGVycm9yICovCisgICAgICAgICAgICAgICAgICAgICAgICBvdXR4YnVmWzBdID0gJz8nOyAvKiBJbnNlcnQgZXJyb3IgY2hhciAqLworICAgICAgICAgICAgICAgICAgICAgICAgb3V0eGJ1ZlsxXSA9IHVfdG9fYjIoKTsgLyogSW5zZXJ0IG5leHQgY2hhciAqLworICAgICAgICAgICAgICAgICAgICAgICAgb3V0eGNvdW50ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHhidWZbMF0gPSAgICAvKiBPdGhlcndpc2Ugc3RvcmUgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkoeCAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSA2OiAgICAgICAgICAgICAgIC8qIFVURi04IHRvIFVURi04ICovCisgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSA4OiAgICAgICAgICAgICAgIC8qIFVDUy0yIHRvIGJ5dGUgKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgeHVmID0geGxfdWZjW3Rjc3JdOworICAgICAgICAgICAgICAgICAgICBvdXR4YnVmWzBdID0gKCp4dWYpKHVjLnhfc2hvcnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICBjYXNlIDExOiB7ICAgICAgICAgICAgLyogVUNTLTIgdG8gVVRGLTggKi8KKyAgICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgICBDSEFSICogYnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICB4ID0gdWNzMl90b191dGY4KHVjLnhfc2hvcnQsJmJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHhidWZbMF0gPSAweGZmOyAvKiAoPSBVK0ZGRkQpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHhidWZbMV0gPSAweGJkOworICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHhidWZbal0gPSBidWZbal07CisgICAgICAgICAgICAgICAgICAgICAgb3V0eGNvdW50ID0geDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBVTklDT0RFICovCisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICAgICAgICAgICAgICBvdXR4YnVmW291dHhjb3VudF0gPSBOVUw7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiWE1JVCBvdXR4YnVmIixvdXR4YnVmLG91dHhjb3VudCk7CisvKgorICBOb3cgdGhlIGlucHV0IGNoYXJhY3RlciAoMSBvciBtb3JlIGJ5dGVzKSBpcyB0cmFuc2xhdGVkIGludG8gdGhlIG91dHB1dAorICBleHBhbnNpb24gYnVmZmVyICgxIG9yIG1vcmUgYnl0ZXMpOyBvdXR4Y291bnQgPSBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkIHRvCisgIHRoZSBUUkFOU01JVCBsaW5lIGJ1ZmZlciwgd2hpY2ggd2UgZG8gaGVyZSwgdGFraW5nIGNhcmUgb2YgcGFyaXR5LCBTSS9TTworICBwcm9jZXNzaW5nLCBhbmQgcXVvdGluZyBUZWxuZXQgSUFDcy4KKyovCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG91dHhjb3VudDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBvdXR4YnVmW2tdOworICAgICAgICAgICAgICAgICAgICBpZiAoeG1pdHMgJiYgcGFyaXR5ICYmIChjICYgMDIwMCkpIHsgLyogSWYgc2hpZnRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVbaSsrXSA9IGRvcGFyKFNPKTsgLyogbmVlZHMgdG8gYmUgZG9uZSwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVbaSsrXSA9IGRvcGFyKChjaGFyKWMpOyAvKiBkbyBpdCBoZXJlLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgbGluZVtpKytdID0gZG9wYXIoU0kpOyAvKiBjcnVkZWx5LiAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZVtpKytdID0gZG9wYXIoKGNoYXIpYyk7CisjaWZkZWYgVE5DT0RFCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSBJQUMgJiYgaXNfdG4pCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVbaSsrXSA9IElBQzsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKy8qCisgIFNlbmQgY2hhcmFjdGVycyBpZiBidWZmZXIgZnVsbCwgb3IgYXQgZW5kIG9mIGxpbmUsIG9yIGF0IGVuZCBvZiBmaWxlLgorICAoRW5kIG9mIGxpbmUgb25seSBpZiBlY2hvaW5nLCB3YWl0aW5nIGZvciBhIHByb21wdCwgb3IgcGF1c2luZy4pCisqLworICAgICAgICAgICAgZGVidWcoRjAwMCwiWE1JVCBjIixja2l0b2EoaSksYyk7CisgICAgICAgICAgICBpZiAoaSA+PSB4YnVmc2l6IHx8IGVvZiB8fCAoZW9sICYmICh4eGVjaG8gfHwgeG1pdHcgfHwgdCkpKSB7CisgICAgICAgICAgICAgICAgcCA9IGxpbmU7CisgICAgICAgICAgICAgICAgbGluZVtpXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwidHJhbnNtaXQgYnVmIixwLGkpOworICAgICAgICAgICAgICAgIGlmICh0dG9sKChDSEFSICopcCxpKSA8IDApIHsgLyogdHJ5IHRvIHNlbmQgaXQuICovCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RSQU5TTUlUIG91dHB1dCBlcnJvcjogJXNcbiIsY2tfZXJyc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpID0gMDsgICAgICAgICAgICAgICAgICAvKiBSZXNldCBidWZmZXIgcG9pbnRlci4gKi8KKy8qCisgIE5vdyB3ZSBoYW5kbGUgdGhlIGVjaG8uICBJZiB0aGUgdXNlciB3YW50cyB0byBzZWUgaXQsIG9yIGlmIHdlIGhhdmUgdG8KKyAgd2FpdCBmb3IgdGhlIHR1cm5hcm91bmQgY2hhcmFjdGVyLCB0LiAgSWYgdGhlIGVjaG8gaXMgYmVpbmcgZGlzcGxheWVkLAorICBhbmQgdGVybWluYWwgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiBpcyByZXF1aXJlZCwgd2UgZG8gaXQgaGVyZS4KKyovCisgICAgICAgICAgICAgICAgaWYgKGR1cGxleCAmJiB4eGVjaG8pIHsgIC8qIElmIGxvY2FsIGVjaG8sIGVjaG8gaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcml0eSB8fCBjbWRtc2sgPT0gMHg3ZikgeyAvKiBTdHJpcCBoaSBiaXRzICovCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzcyA9IGxpbmU7ICAgICAgICAgICAgIC8qIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcyAmPSAweDdmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgIC8qIEVjaG8gdG8gZW11bGF0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnNzID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHR3cnRidWYoKFVTSE9SVCkqc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjb25vbGwocCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgIGdvdG8geG1pdGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh4bWl0dykgICAgICAgICAgICAgIC8qIFNsZWVwIFRSQU5TTUlUIFBBVVNFIGludGVydmFsICovCisgICAgICAgICAgICAgICAgICBtc2xlZXAoeG1pdHcpOworCisgICAgICAgICAgICAgICAgY29udHJvbCA9IDA7ICAgICAgICAgICAgLyogUmVhZGJhY2sgbG9vcCBjb250cm9sICovCisgICAgICAgICAgICAgICAgaWYgKHQgIT0gMCAmJiBlb2wpICAgICAgLyogVFJBTlNNSVQgUFJPTVBUIGdpdmVuIGFuZCBhdCBFT0wgKi8KKyAgICAgICAgICAgICAgICAgIGNvbnRyb2wgfD0gMTsKKyAgICAgICAgICAgICAgICBpZiAoeHhlY2hvICYmICFkdXBsZXgpICAgLyogRWNobyBkZXNpcmVkIGFuZCBpcyByZW1vdGUgKi8KKyAgICAgICAgICAgICAgICAgIGNvbnRyb2wgfD0gMjsKKworICAgICAgICAgICAgICAgIGlmIChjb250cm9sKSB7ICAgICAgICAgIC8qIERvIHRoaXMgaWYgcmVhZGluZyBiYWNrIHRoZSBlY2hvICovCisgICAgICAgICAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sICYgMSkgeyAvKiBUZXJtaW5hdGlvbiBjcml0ZXJpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PSB0KSAgICAvKiBmb3IgdHVybmFyb3VuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wgJiAyKSB7IC8qIEFuZCBmb3IgZWNob2luZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobiA9IHR0Y2hrKCkpIDwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh4ID0gdHRpbmMoeG1pdHQpKSA8IDApIHsgLyogUmVhZCB3aXRoIHRpbWVvdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgLTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ29ubmVjdGlvbiBjbG9zZWQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRjbG9zKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHhtaXRmYWlsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAtMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlc3Npb24gTGltaXQgZXhjZWVkZWQgLSBjbG9zaW5nIGNvbm5lY3Rpb24uXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGNsb3MoMSk7IC8qIGZ1bGwgdGhydS4uLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHhtaXRmYWlsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/VGltZW91dFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8geG1pdGZhaWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPiAtMSAmJiAoY29udHJvbCAmIDIpKSB7IC8qIEVjaG8gYW55IGVjaG9lcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICY9IDB4N2Y7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHg7CisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHR3cnRidWYoKFVTSE9SVCl4KTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW54YnVmWzBdID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnhjb3VudCA9IDE7CisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHVuaWNvZGUgJiAzKSB7IC8qIFJlbW90ZSBiaXRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN4aSkgYyA9ICgqc3hpKSgoQ0hBUiljKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeGkpIGMgPSAoKnJ4aSkoKENIQVIpYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnhidWZbMF0gPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFVOSUNPREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogICAvKiBSZW1vdGUgQnl0ZSB0byBsb2NhbCBVVEYtOCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZnUgPSB4bF9mY3VbdGNzcl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjc3NpemUgPSBmY3NpbmZvW3Rjc3JdLnNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlueGNvdW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX3RvX3UoKENIQVIpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW54YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVRYQlVGU0laLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3NzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgIC8qIFJlbW90ZSBVVEYtOCB0byBsb2NhbCBCeXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh1ZiA9IHhsX3VmY1t0Y3NsXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHVfdG9fYigoQ0hBUiljKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnhidWZbMF0gPSAodW5zaWduZWQpKHggJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6ICAgLyogVVRGLTggdG8gVVRGLTggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogVU5JQ09ERSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW54YnVmW2lueGNvdW50XSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29ueG8oaW54Y291bnQsKGNoYXIgKilpbnhidWYpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8geG1pdGZhaWw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAvKiBOb3QgZWNob2luZyAqLworICAgICAgICAgICAgICAgICAgdHRmbHVpKCk7ICAgICAgICAgICAgIC8qIEp1c3QgZmx1c2ggaW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICB9IC8qIEVuZCBvZiBidWZmZXItZHVtcGluZyBibG9jayAqLworICAgICAgICB9IC8qIEVuZCBvZiB0ZXh0IG1vZGUgKi8KKyAgICAgICAgaWYgKGVvZikgeworICAgICAgICAgICAgcmMgPSAxOworICAgICAgICAgICAgZ290byB4bWl0ZXhpdDsKKyAgICAgICAgfQorICAgIH0gLyogRW5kIG9mIGNoYXJhY3Rlci1yZWFkaW5nIGxvb3AgKi8KKworICB4bWl0ZmFpbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhaWx1cmUgZXhpdCBwb2ludCAqLworICAgIHJjID0gMDsKKworICB4bWl0ZXhpdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdlbmVyYWwgZXhpdCBwb2ludCAqLworICAgIGlmIChyYyA+IDApIHsKKyAgICAgICAgaWYgKGJpbmFyeSAmJiAheG1pdHcgJiYgIXh4ZWNobykgeyAvKiAiYmxhc3RpbmciPyAqLworICAgICAgICAgICAgd2hpbGUgKGNvdW50ID4gMCkgeyAgICAgICAgICAgIC8qIFBhcnRpYWwgYnVmZmVyIHN0aWxsIHRvIGdvPyAqLworICAgICAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgICAgICB5ID0gdHRvbCh4YmJ1Zixjb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKHkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RSQU5TTUlUIG91dHB1dCBlcnJvcjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBja19lcnJzdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIlhNSVQgYmluYXJ5IGVvZiB0dG9sIGVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2tfZXJyc3RyKCksZXJybm8pOworICAgICAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb3VudCAtPSB5OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFiaW5hcnkgJiYgKnhtaXRidWYpIHsgLyogQW55dGhpbmcgdG8gc2VuZCBhdCBFT0Y/ICovCisgICAgICAgICAgICBwID0geG1pdGJ1ZjsgICAgICAgICAgICAgICAgLyogWWVzLCBwb2ludCB0byBzdHJpbmcuICovCisgICAgICAgICAgICB3aGlsZSAoKnApICAgICAgICAgICAgICAgICAgLyogU2VuZCBpdC4gKi8KKyAgICAgICAgICAgICAgdHRvYyhkb3BhcigqcCsrKSk7ICAgICAgICAvKiBEb24ndCB3b3JyeSBhYm91dCBlY2hvIGhlcmUuICovCisgICAgICAgIH0KKyAgICB9CisKKyNpZm5kZWYgQU1JR0EKKyNpZm5kZWYgTUFDCisgICAgc2lnbmFsKFNJR0lOVCxvbGRzaWcpOyAgICAgICAgICAgICAgLyogUHV0IG9sZCBzaWduYWwgYWN0aW9uIGJhY2suICovCisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogQU1JR0EgKi8KKyNpZmRlZiBWTVMKKyAgICBjb25jYihlc2NhcGUpOyAgICAgICAgICAgICAgICAgICAgICAvKiBQdXQgdGVybWluYWwgYmFjaywgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyAgICB6Y2xvc2UoWklGSUxFKTsgICAgICAgICAgICAgICAgICAgICAvKiBDbG9zZSBmaWxlLCAqLworI2lmbmRlZiBOT0NTRVRTCisgICAgbGFuZ3VhZ2UgPSBsYW5nc3Y7ICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBsYW5ndWFnZSwgKi8KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgdHRyZXMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHRlcm1pbmFsIG1vZGVzLCAqLworICAgIHJldHVybihyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXR1cm4gc3VjY2Vzc2Z1bGx5LiAqLworfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNlbmRpZiAvKiBOT1hNSVQgKi8KKworI2lmbmRlZiBOT0NTRVRTCisKK19QUk9UT1RZUCggQ0hBUiAoKnN4eCksIChDSEFSKSApOyAgICAgICAvKiBMb2NhbCB0cmFuc2xhdGlvbiBmdW5jdGlvbiAqLworX1BST1RPVFlQKCBDSEFSICgqcnh4KSwgKENIQVIpICk7ICAgICAgIC8qIExvY2FsIHRyYW5zbGF0aW9uIGZ1bmN0aW9uICovCitfUFJPVE9UWVAoIENIQVIgemwxYXMsIChDSEFSKSApOyAgICAgICAgLyogTGF0aW4tMSB0byBhc2NpaSAqLworX1BST1RPVFlQKCBDSEFSIHhsMWFzLCAoQ0hBUikgKTsgICAgICAgIC8qIGRpdHRvICovCisKKy8qICBYIEwgQSBUIEUgIC0tICBUcmFuc2xhdGUgYSBsb2NhbCBmaWxlIGZyb20gb25lIGNoYXJhY3RlciBzZXQgdG8gYW5vdGhlciAqLworCisvKgorICBUcmFuc2xhdGVzIGlucHV0IGZpbGUgKGZpbikgZnJvbSBjaGFyYWN0ZXIgc2V0IGNzaW4gdG8gY2hhcmFjdGVyIHNldCBjc291dAorICBhbmQgcHV0cyB0aGUgcmVzdWx0IGluIHRoZSBvdXRwdXQgZmlsZSAoZm91dCkuICBUaGUgdHdvIGNoYXJhY3RlciBzZXRzIGFyZQorICBmaWxlIGNoYXJhY3RlciBzZXRzIGZyb20gZmNzdGFiLgorKi8KKworaW50Cit4bGF0ZShmaW4sIGZvdXQsIGNzaW4sIGNzb3V0KSBjaGFyICpmaW4sICpmb3V0OyBpbnQgY3NpbiwgY3NvdXQ7IHsKKworI2lmbmRlZiBNQUMKKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IGs5NXN0ZG91dDsKKyAgICBleHRlcm4gaW50IHdoZXJleFtdLCB3aGVyZXlbXTsKKyAgICBleHRlcm4gdW5zaWduZWQgY2hhciBjb2xvcmNtZDsKKyNpZmRlZiBOVAorICAgIFNJR1RZUCAoKiBvbGRzaWcpKGludCk7ICAgICAgICAgICAgIC8qIEZvciBzYXZpbmcgb2xkIGludGVycnVwdCB0cmFwLiAqLworI2Vsc2UgLyogTlQgKi8KKyAgICBTSUdUWVAgKCogdm9sYXRpbGUgb2xkc2lnKShpbnQpOyAgICAvKiBGb3Igc2F2aW5nIG9sZCBpbnRlcnJ1cHQgdHJhcC4gKi8KKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UgLyogT1MyICovCisgICAgU0lHVFlQICgqIG9sZHNpZykoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyNpZmRlZiBDS19BTlNJQworICAgIGludCAoKmZuKShjaGFyKTsgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBmdW5jdGlvbiBwb2ludGVyICovCisjZWxzZQorICAgIGludCAoKmZuKSgpOworI2VuZGlmIC8qIENLX0FOU0lDICovCisgICAgZXh0ZXJuIGludCB4bGF0eXBlOworICAgIGludCBmaWxlY29kZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgZm9yIG91dHB1dCBmaWxlICovCisgICAgaW50IHNjcm5mbGcgPSAwOworCisgICAgaW50IHogPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGNvZGUuICovCisgICAgaW50IHgsIGMsIGMyOyAgICAgICAgICAgICAgICAgICAgICAgLyogV29ya2VycyAqLworI2lmbmRlZiBVTklDT0RFCisgICAgaW50IHRjczsKKyNlbmRpZiAvKiBVTklDT0RFICovCisKKyAgICBmZmMgPSAwTDsKKworICAgIGlmICh6b3BlbmkoWklGSUxFLGZpbikgPT0gMCkgeyAgICAgIC8qIE9wZW4gdGhlIGZpbGUgdG8gYmUgdHJhbnNsYXRlZCAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgLyogQW4gZXJyb3IgbWVzc2FnZSB3YXMgYWxyZWFkeSBwcmludGVkIGJ5IHpvcGVuaSgpICovCisgICAgICAgIHByaW50ZigiP0Nhbid0IG9wZW4gaW5wdXQgZmlsZSAlc1xuIixmaW4pOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNpZmRlZiBNQUMKKy8qCisgIElmIHVzZXIgc3BlY2lmaWVkIG5vIG91dHB1dCBmaWxlLCBpdCBnb2VzIHRvIHRoZSBzY3JlZW4uICBGb3IgdGhlIE1hYywKKyAgdGhpcyBtdXN0IGJlIGRvbmUgYSBzcGVjaWFsIHdheSAocmVzdWx0IGdvZXMgdG8gYSBuZXcgd2luZG93KTsgdGhlIE1hYworICBkb2Vzbid0IGhhdmUgYSAiY29udHJvbGxpbmcgdGVybWluYWwiIGRldmljZSBuYW1lLgorKi8KKyAgICBmaWxlY29kZSA9ICFzdHJjbXAoZm91dCxDVFROQU0pID8gWkNURVJNIDogWk9GSUxFOworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICBmaWxlY29kZSA9ICFzdHJjbXAoZm91dCxDVFROQU0pID8gWkNURVJNIDogWk1GSUxFOworI2Vsc2UKKyNpZmRlZiBPUzIKKyAgICBmaWxlY29kZSA9ICghc3RyaWNtcChmb3V0LCJjb24iKSB8fCAhc3RyaWNtcChmb3V0LCJjb246IikpID8KKyAgICAgICAgWkNURVJNIDogWk1GSUxFOworICAgIGlmICgoZmlsZWNvZGUgPT0gWkNURVJNKSAmJiAhazk1c3Rkb3V0ICYmICFpbnNlcnZlcikKKyAgICAgICAgY3NvdXQgPSBGQ19VQ1MyOworI2Vsc2UgLyogT1MyICovCisgICAgZmlsZWNvZGUgPSBaT0ZJTEU7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogTUFDICovCisgICAgaWYgKHpvcGVubyhmaWxlY29kZSxmb3V0LE5VTEwsTlVMTCkgPT0gMCkgeyAvKiBBbmQgdGhlIG91dHB1dCBmaWxlICovCisgICAgICAgIHByaW50ZigiP0Nhbid0IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsZm91dCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjaWZuZGVmIEFNSUdBCisjaWZuZGVmIE1BQworICAgIG9sZHNpZyA9IHNpZ25hbChTSUdJTlQsIHRydHJhcCk7ICAgIC8qIFNhdmUgY3VycmVudCBpbnRlcnJ1cHQgdHJhcC4gKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworCisgICAgc2NybmZsZyA9IChmaWxlY29kZSA9PSBaQ1RFUk0pOyAgICAgLyogU2V0IG91dHB1dCBmdW5jdGlvbiAqLworICAgIGlmIChzY3JuZmxnKQorICAgICAgZm4gPSBOVUxMOworICAgIGVsc2UgaWYgKGZpbGVjb2RlID09IFpNRklMRSkKKyAgICAgIGZuID0gcHV0bWZpbDsKKyAgICBlbHNlCisgICAgICBmbiA9IHB1dGZpbDsKKworICAgIHRyX2ludCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhdmUgbm90IGJlZW4gaW50ZXJydXB0ZWQgKHlldCkuICovCisgICAgeiA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGNvZGUgcHJlc3VtZWQgZ29vZC4gKi8KKworICAgIGlmICghc2NybmZsZyAmJiAhcXVpZXQpCisgICAgICBwcmludGYoIiAlcyAoJXMpID0+ICVzICglcylcbiIsICAgLyogU2F5IHdoYXQgd2UncmUgZG9pbmcuICovCisgICAgICAgICAgICAgZmluLCBmY3NpbmZvW2NzaW5dLmtleXdvcmQsCisgICAgICAgICAgICAgZm91dCxmY3NpbmZvW2Nzb3V0XS5rZXl3b3JkCisgICAgICAgICAgICAgKTsKKworI2lmbmRlZiBVTklDT0RFCisvKgorICBOb24tVW5pY29kZSBwaWNrcyB0aGUgIm1vc3QgYXBwcm9wcmlhdGUiIHRyYW5zZmVyIGNoYXJhY3RlciBzZXQgYXMgdGhlCisgIGludGVybWVkaWF0ZSBzZXQsIHdoaWNoIHJlc3VsdHMgaW4gbG9zcyBvZiBhbnkgY2hhcmFjdGVycyB0aGF0IHRoZSBzb3VyY2UKKyAgYW5kIHRhcmdldCBzZXRzIGhhdmUgaW4gY29tbW9uLCBidXQgYXJlIGxhY2tpbmcgZnJvbSB0aGUgaW50ZXJtZWRpYXRlIHNldC4KKyovCisjaWZkZWYgS0FOSkkKKyAgICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBKYXBhbmVzZS4uLiAqLworCisgICAgaWYgKGZjc2luZm9bY3Npbl0uYWxwaGFiZXQgPT0gQUxfSkFQQU4gfHwKKyAgICAgICAgIGZjc2luZm9bY3NvdXRdLmFscGhhYmV0ID09IEFMX0pBUEFOKSB7CisgICAgICAgIFVTSE9SVCBldTsKKyAgICAgICAgaW50IGMsIHgsIHk7CisKKyAgICAgICAgeHBuYnl0ZSgtMSwwLDAsTlVMTCk7ICAgICAgICAgICAvKiBSZXNldCBvdXRwdXQgbWFjaGluZSAqLworICAgICAgICB4bGF0eXBlID0gWExBX0pBUEFOOworCisgICAgICAgIHdoaWxlICgoYyA9IHhnbmJ5dGUoRkNfSkVVQyxjc2luLE5VTEwpKSA+IC0xKSB7IC8qIEdldCBhbiBFVUMgYnl0ZSAqLworICAgICAgICAgICAgaWYgKHRyX2ludCkgeyAgICAgICAgICAgICAgIC8qIEludGVycnVwdGVkPyAqLworICAgICAgICAgICAgICAgIHByaW50ZigiXkMuLi5cbiIpOyAgICAgIC8qIFByaW50IG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgICB6ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNlbmQgRVVDIGJ5dGUgdG8gb3V0cHV0IG1hY2hpbmUgKi8KKyAgICAgICAgICAgIGlmICgoeCA9IHhwbmJ5dGUoYyxUQ19KRVVDLGNzb3V0LGZuKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgeiA9IC0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdvdG8geHhsYXRlOworICAgIH0KKyNlbmRpZiAvKiBLQU5KSSAqLworCisgICAgLyogUmVndWxhciBieXRld2lzZSBjb252ZXJzaW9uLi4uICovCisKKyAgICB0Y3MgPSBnZXR0Y3MoY3Npbixjc291dCk7ICAgICAgICAgICAvKiBHZXQgaW50ZXJtZWRpYXRlIHNldC4gKi8KKyAgICBpZiAoY3NpbiA9PSBjc291dCkgeyAgICAgICAgICAgICAgICAvKiBJbnB1dCBhbmQgb3V0cHV0IHNldHMgdGhlIHNhbWU/ICovCisgICAgICAgIHN4eCA9IHJ4eCA9IE5VTEw7ICAgICAgICAgICAgICAgLyogSWYgc28sIG5vIHRyYW5zbGF0aW9uLiAqLworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSwgc2V0IHVwICovCisgICAgICAgIGlmICh0Y3MgPCAwIHx8IHRjcyA+IE1BWFRDU0VUUyB8fAorICAgICAgICAgICAgY3NpbiA8IDAgfHwgY3NpbiA+IE1BWEZDU0VUUyB8fAorICAgICAgICAgICAgY3NvdXQgPCAwIHx8IGNzb3V0ID4gTUFYRkNTRVRTKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJYTEFURSBjc2V0cyBvdXQgb2YgcmFuZ2UiLCIiLDApOworICAgICAgICAgICAgc3h4ID0gcnh4ID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN4eCA9IHhsc1t0Y3NdW2NzaW5dOyAgICAgICAvKiB0cmFuc2xhdGlvbiBmdW5jdGlvbiAqLworICAgICAgICAgICAgcnh4ID0geGxyW3Rjc11bY3NvdXRdOyAgICAgIC8qIHBvaW50ZXJzLiAqLworICAgICAgICAgICAgaWYgKHJ4eCA9PSB6bDFhcykgcnh4ID0geGwxYXM7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKChjID0gem1pbmNoYXIoKSkgIT0gLTEpIHsgLyogTG9vcCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gZmlsZSAqLworICAgICAgICBpZiAodHJfaW50KSB7ICAgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdGVkPyAqLworICAgICAgICAgICAgcHJpbnRmKCJeQy4uLlxuIik7ICAgICAgICAgIC8qIFByaW50IG1lc3NhZ2UgKi8KKyAgICAgICAgICAgIHogPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN4eCkgYyA9ICgqc3h4KSgoQ0hBUiljKTsgICAvKiBGcm9tIGZjczEgdG8gdGNzICovCisgICAgICAgIGlmIChyeHgpIGMgPSAoKnJ4eCkoKENIQVIpYyk7ICAgLyogZnJvbSB0Y3MgdG8gZmNzMiAqLworICAgICAgICBpZiAoemNob3V0KGZpbGVjb2RlLChjaGFyKWMpIDwgMCkgeyAvKiBPdXRwdXQgeGxhdGVkIGNoYXJhY3RlciAqLworICAgICAgICAgICAgeiA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZ290byB4eGxhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uZS4gKi8KKworI2Vsc2UgIC8qIFVOSUNPREUgKi8KKy8qCisgICBVc2UgVW5pY29kZSBhcyB0aGUgaW50ZXJtZWRpYXRlIGNoYXJhY3RlciBzZXQuICBJdCdzIHNpbXBsZSBhbmQgZ2l2ZXMKKyAgIGxpdHRsZSBvciBubyBsb3NzLCBidXQgdGhlIG92ZXJoZWFkIGlzIGEgYml0IGhpZ2hlci4KKyovCisgICAgaW5pdHhsYXRlKGNzaW4sY3NvdXQpOyAgICAgICAgICAgICAgLyogU2V0IHVwIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyAqLworCisgICAgaWYgKHhsYXR5cGUgPT0gWExBX05PTkUpIHsKKyAgICAgICAgd2hpbGUgKChjID0gem1pbmNoYXIoKSkgIT0gLTEpIHsgLyogTG9vcCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gZmlsZSAqLworICAgICAgICAgICAgaWYgKHRyX2ludCkgeyAgICAgICAgICAgICAgIC8qIEludGVycnVwdGVkPyAqLworICAgICAgICAgICAgICAgIHByaW50ZigiXkMuLi5cbiIpOyAgICAgIC8qIFByaW50IG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgICB6ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh6Y2hvdXQoZmlsZWNvZGUsKGNoYXIpYykgPCAwKSB7IC8qIE91dHB1dCB4bGF0ZWQgY2hhcmFjdGVyICovCisgICAgICAgICAgICAgICAgeiA9IC0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdvdG8geHhsYXRlOyAgICAgICAgICAgICAgICAgICAgLyogRG9uZS4gKi8KKyAgICB9CisKKworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgaWYgKGNzb3V0ID09IEZDX1VDUzIgJiYgICAgICAgICAgICAgLyogd2UncmUgdHJhbnNsYXRpbmcgdG8gVUNTLTIgKi8KKyAgICAgICAgZmlsZWNvZGUgPT0gWkNURVJNICYmICAgICAgICAgICAvKiBmb3IgdGhlIHJlYWwgc2NyZWVuLi4uICovCisgICAgICAgICFrOTVzdGRvdXQgJiYgIWluc2VydmVyCisgICAgICAgICkgeworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBVU0hPUlQgdWNzMjsKKyAgICAgICAgICAgIFVDSEFSICBieXRlc1syXTsKKyAgICAgICAgfSBvdXRwdXQ7CisKKyAgICAgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAvKiBJbiB0aGlzIGNhc2Ugd2UgZ28gdHdvLWJ5LXR3by4gKi8KKyAgICAgICAgICAgIGlmICgoYyA9IHhnbmJ5dGUoRkNfVUNTMixjc2luLE5VTEwpKSA8IDApCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgb3V0cHV0LmJ5dGVzWzBdID0gYzsKKyAgICAgICAgICAgIGlmICgoYyA9IHhnbmJ5dGUoRkNfVUNTMixjc2luLE5VTEwpKSA8IDApCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgb3V0cHV0LmJ5dGVzWzFdID0gYzsKKworICAgICAgICAgICAgaWYgKHRyX2ludCkgeyAgICAgICAgICAgICAgIC8qIEludGVycnVwdGVkPyAqLworICAgICAgICAgICAgICAgIHByaW50ZigiXkMuLi5cbiIpOyAgICAgIC8qIFByaW50IG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgICB6ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVnNjcm5XcnRVQ1MyU3RyQXR0KFZDTUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC51Y3MyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmV5W1ZDTURdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJleFtWQ01EXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JjbWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfSBlbHNlCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisgICAgICAvKiBHZW5lcmFsIGNhc2U6IEdldCBuZXh0IGJ5dGUgdHJhbnNsYXRlZCBmcm9tIGZjcyB0byBVQ1MtMiAqLworCisjaWZkZWYgQ09NTUVOVAorICAgICAgd2hpbGUgKChjID0geGduYnl0ZShGQ19VQ1MyLGNzaW4sTlVMTCkpID4gLTEgJiYKKyAgICAgICAgICAgICAgKGMyID0geGduYnl0ZShGQ19VQ1MyLGNzaW4sTlVMTCkpID4gLTEpIHsKKyAgICAgICAgICBleHRlcm4gaW50IGZpbGVvcmRlcjsKKworICAgICAgICAgIGlmICh0cl9pbnQpIHsgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdGVkPyAqLworICAgICAgICAgICAgICBwcmludGYoIl5DLi4uXG4iKTsgICAgICAgIC8qIFByaW50IG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgeiA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWJ1ZyhGMDAxLCJYTEFURSBjIiwiIixjKTsKKyAgICAgICAgICBkZWJ1ZyhGMDAxLCJYTEFURSBjMiIsIiIsYzIpOworCisgICAgICAgICAgLyogQW5kIHRoZW4gc2VuZCBVQ1MtMiBieXRlIHRvIHRyYW5zbGF0ZS1hbmQtb3V0cHV0IG1hY2hpbmUgKi8KKworICAgICAgICAgIGlmICgoeCA9IHhwbmJ5dGUoZmlsZW9yZGVyP2MyOmMsVENfVUNTMixjc291dCxmbikpIDwgMCkgeworICAgICAgICAgICAgICB6ID0gLTE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKHggPSB4cG5ieXRlKGZpbGVvcmRlcj9jOmMyLFRDX1VDUzIsY3NvdXQsZm4pKSA8IDApIHsKKyAgICAgICAgICAgICAgeiA9IC0xOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICB9CisjZWxzZQorICAgIHdoaWxlICgoYyA9IHhnbmJ5dGUoRkNfVUNTMixjc2luLE5VTEwpKSA+IC0xKSB7CisgICAgICAgICAgaWYgKHRyX2ludCkgeyAgICAgICAgICAgICAgICAgLyogSW50ZXJydXB0ZWQ/ICovCisgICAgICAgICAgICAgIHByaW50ZigiXkMuLi5cbiIpOyAgICAgICAgLyogUHJpbnQgbWVzc2FnZSAqLworICAgICAgICAgICAgICB6ID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoeCA9IHhwbmJ5dGUoYyxUQ19VQ1MyLGNzb3V0LGZuKSkgPCAwKSB7CisgICAgICAgICAgICAgIHogPSAtMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2VuZGlmIC8qIFVOSUNPREUgKi8KKworICB4eGxhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1vbiBleGl0IHBvaW50ICovCisKKyNpZm5kZWYgQU1JR0EKKyNpZm5kZWYgTUFDCisgICAgc2lnbmFsKFNJR0lOVCxvbGRzaWcpOyAgICAgICAgICAgICAgLyogUHV0IG9sZCBzaWduYWwgYWN0aW9uIGJhY2suICovCisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogQU1JR0EgKi8KKyAgICB0cl9pbnQgPSAwOworICAgIGlmICh6IDwgMCkgeworICAgICAgICBpZiAoeiA9PSAtMSkKKyAgICAgICAgICBwcmludGYoIj9GaWxlIG91dHB1dCBlcnJvcjogJXNcbiIsY2tfZXJyc3RyKCkpOworICAgICAgICB6ID0gMDsKKyAgICB9CisgICAgemNsb3NlKFpJRklMRSk7ICAgICAgICAgICAgICAgICAgICAgLyogQ2xvc2UgZmlsZXMgKi8KKyAgICB6Y2xvc2UoZmlsZWNvZGUpOyAgICAgICAgICAgICAgICAgICAvKiAuLi4gKi8KKyAgICByZXR1cm4oc3VjY2VzcyA9IHopOyAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIHN0YXR1cy4gKi8KK30KKworaW50Citkb3hsYXRlKCkgeworI2lmZGVmIE9TMk9OTFkKKyAgICBleHRlcm4gaW50IHR0X2ZvbnQ7CisjZW5kaWYgLyogT1MyT05MWSAqLworI2lmZGVmIFVOSVgKKyAgICBleHRlcm4gY2hhciAqKiBtdGNoczsgICAgICAgICAgICAgICAvKiB6eHBhbmQoKSBmaWxlIGxpc3QgKi8KKyNlbmRpZiAvKiBVTklYICovCisgICAgZXh0ZXJuIGludCBuZmlsYzsKKyAgICBleHRlcm4gc3RydWN0IGtleXRhYiBmY3N0YWJbXTsKKyAgICBpbnQgeCwgeSwgaW5jcywgb3V0Y3MsIG11bHRpcGxlID0gMCwgd2lsZCA9IDAsIGZjID0gMCwgbGVuID0gMDsKKyAgICBpbnQgb2Zpc2RpciA9IDA7CisgICAgY2hhciAqIHMsICogdG9jcyA9ICIiOworCisgICAgaWYgKCh4ID0gY21pZmkoIkZpbGUocykgdG8gdHJhbnNsYXRlIiwiIiwmcywmd2lsZCx4eHN0cmluZykpIDwgMCkgeworICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgcHJpbnRmKCI/TmFtZSBvZiBhbiBleGlzdGluZyBmaWxlXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHJldHVybih4KTsKKyAgICB9CisgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOyAgICAgICAgLyogU2F2ZSBjb3B5IG9mIHN0cmluZyBqdXN0IHBhcnNlZC4gKi8KKworICAgIGlmICgoaW5jcyA9IGNta2V5KGZjc3RhYixuZmlsYywiZnJvbSBjaGFyYWN0ZXItc2V0IiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybihpbmNzKTsKKworI2lmZGVmIE9TMgorICAgIGlmIChpc3VuaWNvZGUoKSkKKyAgICAgIHRvY3MgPSAidWNzMiI7CisgICAgZWxzZQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgdG9jcyA9IGdldGRjc2V0KCk7CisKKyAgICBpZiAoKG91dGNzID0gY21rZXkoZmNzdGFiLG5maWxjLCJ0byBjaGFyYWN0ZXItc2V0Iix0b2NzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKG91dGNzKTsKKyAgICBpZiAoKHggPSBjbW9maSgib3V0cHV0IGZpbGUiLENUVE5BTSwmcyx4eHN0cmluZykpIDwgMCkgcmV0dXJuKHgpOworICAgIGlmICh4ID4gMSkKKyAgICAgIG9maXNkaXIgPSAxOworCisgICAgbGVuID0gY2tzdHJuY3B5KHRtcGJ1ZixzLFRNUEJVRlNJWik7CisgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7ICAgLyogQ29uZmlybSB0aGUgY29tbWFuZCAqLworCisgICAgaWYgKGxlbiA8IDEpCisgICAgICByZXR1cm4oLTIpOworCisgICAgaWYgKG9maXNkaXIpCisgICAgICBtdWx0aXBsZSA9IDI7CisgICAgZWxzZSBpZiAod2lsZCkgeworICAgICAgICBpZiAoaXNkaXIodG1wYnVmKSkKKyAgICAgICAgICBtdWx0aXBsZSA9IDI7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodG1wYnVmLENUVE5BTSkpCisgICAgICAgICAgbXVsdGlwbGUgPSAxOworI2lmZGVmIE9TMgorICAgICAgICBlbHNlIGlmICghc3RyaWNtcCh0bXBidWYsImNvbiIpIHx8ICFzdHJpY21wKHRtcGJ1ZiwiY29uOiIpKQorICAgICAgICAgIG11bHRpcGxlID0gMTsKKyNlbHNlCisjaWZkZWYgVU5JWE9ST1NLCisgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKHRtcGJ1ZiwiL2Rldi8iLDQpKQorICAgICAgICAgIG11bHRpcGxlID0gMTsKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgaWYgKCFtdWx0aXBsZSkgeworICAgICAgICAgICAgcHJpbnRmKCI/QSBzaW5nbGUgZmlsZSBwbGVhc2VcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW11bHRpcGxlKSB7ICAgICAgICAgICAgICAgICAgICAvKiBKdXN0IG9uZSBmaWxlICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0geGxhdGUobGluZSx0bXBidWYsaW5jcyxvdXRjcykpOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zbGF0ZSBtdWx0aXBsZSBmaWxlcyAqLworICAgICAgICBjaGFyIGRpcmJ1ZltDS01BWFBBVEgrNF07CisgICAgICAgIGludCBrOworI2lmbmRlZiBaWFJFV0lORAorICAgICAgICBpbnQgZmxhZ3MgPSBaWF9GSUxPTkxZOworI2VuZGlmIC8qIFpYUkVXSU5EICovCisKKyAgICAgICAgaWYgKG11bHRpcGxlID09IDIpIHsgICAgICAgICAgICAvKiBUYXJnZXQgaXMgYSBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgIGsgPSBja3N0cm5jcHkoZGlyYnVmLHRtcGJ1ZixDS01BWFBBVEgrMSkgLSAxOworICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oLTIpOworI2lmZGVmIE9TMk9SVU5JWAorICAgICAgICAgICAgaWYgKGRpcmJ1ZltrXSAhPSAnLycpIHsKKyAgICAgICAgICAgICAgICBkaXJidWZbaysxXSA9ICcvJzsKKyAgICAgICAgICAgICAgICBkaXJidWZbaysyXSA9IE5VTDsKKyAgICAgICAgICAgIH0KKyNlbHNlCisjaWZkZWYgT1NLCisgICAgICAgICAgICBpZiAoZGlyYnVmW2tdICE9ICcvJykgeworICAgICAgICAgICAgICAgIGRpcmJ1ZltrKzFdID0gJy8nOworICAgICAgICAgICAgICAgIGRpcmJ1ZltrKzJdID0gTlVMOworICAgICAgICAgICAgfQorI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgIGlmIChja21hdGNoKCIqLkRJUjsxIixzLDAsMCkpCisgICAgICAgICAgICAgIGsgPSBjdnRkaXIodG1wYnVmLGRpcmJ1ZixUTVBCVUZTSVopOworICAgICAgICAgICAgaWYgKGRpcmJ1ZltrXSAhPSAnXScgJiYKKyAgICAgICAgICAgICAgICBkaXJidWZba10gIT0gJz4nICYmCisgICAgICAgICAgICAgICAgZGlyYnVmW2tdICE9ICc6JykKKyAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgICAgIGlmIChkaXJidWZba10gIT0gJzonKSB7CisgICAgICAgICAgICAgICAgZGlyYnVmW2srMV0gPSAnOic7CisgICAgICAgICAgICAgICAgZGlyYnVmW2srMl0gPSBOVUw7CisgICAgICAgICAgICB9CisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKyAgICAgICAgICAgIGlmIChkaXJidWZba10gIT0gJz4nKSB7CisgICAgICAgICAgICAgICAgZGlyYnVmW2srMV0gPSAnPic7CisgICAgICAgICAgICAgICAgZGlyYnVmW2srMl0gPSBOVUw7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1NLICovCisjZW5kaWYgLyogT1MyT1JVTklYICovCisgICAgICAgIH0KKworI2lmZGVmIFpYUkVXSU5ECisgICAgICAgIGZjID0genhyZXdpbmQoKTsgICAgICAgICAgICAgICAgLyogUmV3aW5kIHRoZSBmaWxlIGxpc3QgKi8KKyNlbHNlCisgICAgICAgIGlmIChtYXRjaGRvdCkgIGZsYWdzIHw9IFpYX01BVENIRE9UOworICAgICAgICBmYyA9IG56eHBhbmQobGluZSxmbGFncyk7CisjZW5kaWYgLyogWlhSRVdJTkQgKi8KKworICAgICAgICBpZiAoZmMgPCAxKSB7CisgICAgICAgICAgICBwcmludGYoIj9XaWxkY2FyZCBleHBhbnNpb24gZXJyb3JcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorI2lmZGVmIFVOSVgKKyAgICAgICAgc2hfc29ydChtdGNocyxOVUxMLGZjLDAsMCxmaWxlY2FzZSk7IC8qIFNvcnQgdGhlIGZpbGUgbGlzdCAqLworI2VuZGlmIC8qIFVOSVggKi8KKworICAgICAgICB3aGlsZSAoMSkgeyAgICAgICAgICAgICAgICAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgZmlsZXMgKi8KKyAgICAgICAgICAgIHpuZXh0KGxpbmUpOworICAgICAgICAgICAgaWYgKCFsaW5lWzBdKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChtdWx0aXBsZSA9PSAyKQorICAgICAgICAgICAgICBja21ha21zZyh0bXBidWYsVE1QQlVGU0laLGRpcmJ1ZixsaW5lLE5VTEwsTlVMTCk7CisgICAgICAgICAgICBpZiAoeGxhdGUobGluZSx0bXBidWYsaW5jcyxvdXRjcykgPCAxKQorICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCitzdGF0aWMgY2hhciBob21wdGhidWZbQ0tNQVhQQVRIKzFdOworCitjaGFyICoKK2hvbWVwYXRoKCkgeworICAgIGludCB4OworICAgIGV4dGVybiBjaGFyICogbXlob21lOworICAgIGNoYXIgKiBoOworCisgICAgaCA9IG15aG9tZSA/IG15aG9tZSA6IHpob21lKCk7CisgICAgaG9tcHRoYnVmWzBdID0gTlVMOworI2lmZGVmIFVOSVhPUk9TSworICAgIHggPSBja3N0cm5jcHkoaG9tcHRoYnVmLGgsQ0tNQVhQQVRIKzEpOworICAgIGlmICh4IDw9IDApIHsKKyAgICAgICAgaG9tcHRoYnVmWzBdID0gJy8nOworICAgICAgICBob21wdGhidWZbMV0gPSBOVUw7CisgICAgfSBlbHNlIGlmICh4IDwgQ0tNQVhQQVRIIC0gMiAmJiBob21wdGhidWZbeC0xXSAhPSAnLycpIHsKKyAgICAgICAgaG9tcHRoYnVmW3hdID0gJy8nOworICAgICAgICBob21wdGhidWZbeCsxXSA9IE5VTDsKKyAgICB9CisgICAgcmV0dXJuKGhvbXB0aGJ1Zik7CisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKyAgICBpZiAoc3RybGVuKGgpIDwgQ0tNQVhQQVRIKQorICAgICAgc3ByaW50Zihob21wdGhidWYsIiVzPiIsaCk7CS8qIFNBRkUgKi8KKyAgICByZXR1cm4oaG9tcHRoYnVmKTsKKyNlbHNlCisgICAgcmV0dXJuKGgpOworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KK30KKworLyogIEQgTyBMIE8gRyAgLS0gIERvIHRoZSBsb2cgY29tbWFuZCAgKi8KKworaW50Citkb2xvZyh4KSBpbnQgeDsgeworICAgIGludCB5LCBkaXNwOyBjaGFyICpzID0gTlVMTCwgKiBwID0gTlVMTCwgKiBxID0gTlVMTDsKKyAgICBleHRlcm4gaW50IGlzZ3Vlc3Q7CisjaWZkZWYgWkZOUUZQCisgICAgc3RydWN0IHpmbmZwICogZm5wOworI2VuZGlmIC8qIFpGTlFGUCAqLworCisgICAgaWYgKGlzZ3Vlc3QpIHsKKyAgICAgICAgcHJpbnRmKCI/QW5vbnltb3VzIGxvZyBjcmVhdGlvbiBub3QgYWxsb3dlZFxuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIHN3aXRjaCAoeCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdoaWNoIGxvZy4uLiAqLworCisjaWZkZWYgREVCVUcKKyAgICAgIGNhc2UgTE9HRDoKKyAgICAgICAgcSA9ICJkZWJ1Zy5sb2ciOworICAgICAgICB5ID0gY21vZmkoIk5hbWUgb2YgZGVidWdnaW5nIGxvZyBmaWxlIixxLCZzLHh4c3RyaW5nKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogREVCVUcgKi8KKworICAgICAgY2FzZSBMT0dQOgorICAgICAgICBxID0gInBhY2tldC5sb2ciOworICAgICAgICB5ID0gY21vZmkoIk5hbWUgb2YgcGFja2V0IGxvZyBmaWxlIixxLCZzLHh4c3RyaW5nKTsKKyAgICAgICAgYnJlYWs7CisKKyNpZm5kZWYgTk9MT0NBTAorICAgICAgY2FzZSBMT0dTOgorICAgICAgICBxID0gInNlc3Npb24ubG9nIjsKKyAgICAgICAgeSA9IGNtb2ZpKCJOYW1lIG9mIHNlc3Npb24gbG9nIGZpbGUiLHEsJnMseHhzdHJpbmcpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBUTE9HCisgICAgICBjYXNlIExPR1Q6CisgICAgICAgIHEgPSAidHJhbnNhY3QubG9nIjsKKyAgICAgICAgeSA9IGNtb2ZpKCJOYW1lIG9mIHRyYW5zYWN0aW9uIGxvZyBmaWxlIixxLCZzLHh4c3RyaW5nKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogVExPRyAqLworCisjaWZkZWYgQ0tMT0dESUFMCisgICAgICBjYXNlIExPR006IHsKKyAgICAgICAgICBpbnQgbSwgbjsKKyAgICAgICAgICBjaGFyIG15cGF0aFtDS01BWFBBVEgrMV07CisgICAgICAgICAgcSA9IENYTE9HRklMRTsKKyAgICAgICAgICBtID0gY2tzdHJuY3B5KG15cGF0aCxob21lcGF0aCgpLENLTUFYUEFUSCk7CisgICAgICAgICAgbiA9IHN0cmxlbihDWExPR0ZJTEUpOworICAgICAgICAgIGlmIChtICsgbiA8IENLTUFYUEFUSCkKKyAgICAgICAgICAgIGNrc3RybmNhdChteXBhdGgsQ1hMT0dGSUxFLENLTUFYUEFUSCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgY2tzdHJuY3B5KG15cGF0aCxDWExPR0ZJTEUsQ0tNQVhQQVRIKTsKKyAgICAgICAgICB5ID0gY21vZmkoIk5hbWUgb2YgY29ubmVjdGlvbiBsb2cgZmlsZSIsbXlwYXRoLCZzLHh4c3RyaW5nKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyNlbmRpZiAvKiBDS0xPR0RJQUwgKi8KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJcbj9Vbmtub3duIGxvZyBkZXNpZ25hdG9yIC0gJWRcbiIseCk7CisgICAgICAgIHJldHVybigtMik7CisgICAgfQorICAgIGlmICh5IDwgMCkgcmV0dXJuKHkpOworICAgIGlmICh5ID09IDIpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZXkgZ2F2ZSBhIGRpcmVjdG9yeSBuYW1lICovCisgICAgICAgIGludCBrOworICAgICAgICBjaGFyICogZHMgPSAiLyI7CisgICAgICAgIGsgPSBzdHJsZW4ocyk7CisgICAgICAgIGlmIChrID4gMCAmJiBzW2stMV0gPT0gJy8nKSBkcyA9ICIiOworICAgICAgICBja21ha21zZyh0bXBidWYsVE1QQlVGU0laLHMsZHMscSxOVUxMKTsKKyAgICAgICAgcyA9IHRtcGJ1ZjsKKyAgICB9CisjaWZkZWYgWkZOUUZQCisjaWZkZWYgT1MyT1JVTklYCisgICAgaWYgKCpzICE9ICd8JykgICAgICAgICAgICAgICAgICAgICAgLyogQWxsb3cgZm9yIHBpcGVzICovCisjZWxzZQorI2lmZGVmIE9TSworICAgIGlmICgqcyAhPSAnfCcpCisjZW5kaWYgLyogT1NLICovCisjZW5kaWYgLyogT1MyT1JVTklYICovCisgICAgICBpZiAoKGZucCA9IHpmbnFmcChzLFRNUEJVRlNJWiAtIDEsdG1wYnVmKSkpIHsKKyAgICAgICAgICBpZiAoZm5wLT5mcGF0aCkKKyAgICAgICAgICAgIGlmICgoaW50KSBzdHJsZW4oZm5wLT5mcGF0aCkgPiAwKQorICAgICAgICAgICAgICBzID0gZm5wLT5mcGF0aDsKKyAgICAgIH0gLyogZWxzZSBpZiBlcnJvciBrZWVwIG9yaWdpbmFsIHN0cmluZyAqLworI2VuZGlmIC8qIFpGTlFGUCAqLworCisgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgIHMgPSBsaW5lOworI2lmZGVmIE1BQworICAgIHkgPSAwOworI2Vsc2UKKworICAgIHAgPSAibmV3IjsKKyNpZmRlZiBUTE9HCisgICAgaWYgKCh4ID09IExPR1QgJiYgdGxvZ2ZtdCA9PSAyKSB8fCB4ID09IExPR00pCisgICAgICBwID0gImFwcGVuZCI7CisjZW5kaWYgLyogVExPRyAqLworCisgICAgaWYgKCh5ID0gY21rZXkoZGlzcHRiLDIsIkRpc3Bvc2l0aW9uIixwLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHkpOworI2VuZGlmIC8qIE1BQyAqLworICAgIGRpc3AgPSB5OworICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworCisgICAgc3dpdGNoICh4KSB7CisKKyNpZmRlZiBERUJVRworICAgICAgY2FzZSBMT0dEOgorICAgICAgICByZXR1cm4oZGVibG9nID0gZGVib3BuKHMsZGlzcCkpOworI2VuZGlmIC8qIERFQlVHICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgICBjYXNlIExPR1A6CisgICAgICAgIHJldHVybihwa3Rsb2cgPSBwa3RvcG4ocyxkaXNwKSk7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9MT0NBTAorICAgICAgY2FzZSBMT0dTOgorICAgICAgICBzZXRzZXNsb2coc2Vzb3BuKHMsZGlzcCkpOworICAgICAgICByZXR1cm4oc2VzbG9nKTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBUTE9HCisgICAgICBjYXNlIExPR1Q6CisgICAgICAgIHJldHVybih0cmFsb2cgPSB0cmFvcG4ocyxkaXNwKSk7CisjZW5kaWYgLyogVExPRyAqLworCisjaWZkZWYgQ0tMT0dESUFMCisgICAgICBjYXNlIExPR006CisgICAgICAgIHJldHVybihkaWFsb2cgPSBkaWFvcG4ocyxkaXNwLDApKTsKKyNlbmRpZiAvKiBDS0xPR0RJQUwgKi8KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9Cit9CisKKyNpZm5kZWYgTk9YRkVSCitpbnQKK3BrdG9wbihzLGRpc3ApIGNoYXIgKnM7IGludCBkaXNwOyB7CisgICAgc3RhdGljIHN0cnVjdCBmaWxpbmZvIHh4OworCisgICAgaWYgKCFzKQorICAgICAgcyA9ICIiOworICAgIGlmICghKnMpCisgICAgICByZXR1cm4oMCk7CisKKyAgICBkZWJ1ZyhGMTExLCJwa3RvcG4iLHMsZGlzcCk7CisKKyAgICB6Y2xvc2UoWlBGSUxFKTsKKworI2lmZGVmIE9TMk9SVU5JWAorICAgIGlmIChzWzBdID09ICd8JykgeyAgICAgICAgICAgICAgICAgIC8qIFBpcGUgKi8KKyAgICAgICAgY2hhciAqIHAgPSBzICsgMTsKKyAgICAgICAgZGVidWcoRjExMCwicGt0b3BuIHAiLHAsMCk7CisgICAgICAgIHdoaWxlICgqcCkgeworICAgICAgICAgICAgaWYgKCpwICE9ICcgJykKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTEwLCJwa3RvcG4gcGlwZSIscCwwKTsKKyAgICAgICAgcGt0bG9nID0genhjbWQoWlBGSUxFLHApOworICAgICAgICBkZWJ1ZyhGMTAxLCJwa3RvcG4gc2VzbG9nIiwiIixzZXNsb2cpOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgKi8KKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyAgICAgICAgaWYgKGRpc3ApIHsKKyAgICAgICAgICAgIHh4LmJzID0gMDsgeHguY3MgPSAwOyB4eC5ybCA9IDA7IHh4Lm9yZyA9IDA7IHh4LmNjID0gMDsKKyAgICAgICAgICAgIHh4LnR5cCA9IDA7IHh4LmRzcCA9IFhZRlpfQTsgeHgub3Nfc3BlY2lmaWMgPSAiIjsKKyAgICAgICAgICAgIHh4LmxibG9wdHMgPSAwOworICAgICAgICAgICAgcGt0bG9nID0gem9wZW5vKFpQRklMRSxzLE5VTEwsJnh4KTsKKyAgICAgICAgfSBlbHNlIHBrdGxvZyA9IHpvcGVubyhaUEZJTEUscyxOVUxMLE5VTEwpOworICAgICAgICBpZiAoIXBrdGxvZykKKyAgICAgICAgICBwcmludGYoIj8lcyAtICVzXG4iLHMsY2tfZXJyc3RyKCkpOworI2lmZGVmIE9TMk9SVU5JWAorICAgIH0KKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyAgICBpZiAocGt0bG9nID4gMCkKKyAgICAgIGNrc3RybmNweShwa3RmaWwscyxDS01BWFBBVEgrMSk7CisgICAgZWxzZQorICAgICAgKnBrdGZpbCA9ICdcMCc7CisgICAgcmV0dXJuKHBrdGxvZyk7Cit9CisjZW5kaWYgLyogTk9YRkVSICovCisKK2ludAordHJhb3BuKHMsZGlzcCkgY2hhciAqczsgaW50IGRpc3A7IHsKKyNpZmRlZiBUTE9HCisgICAgc3RhdGljIHN0cnVjdCBmaWxpbmZvIHh4OworCisgICAgaWYgKCFzKQorICAgICAgcyA9ICIiOworICAgIGlmICghKnMpCisgICAgICByZXR1cm4oMCk7CisKKyAgICBkZWJ1ZyhGMTExLCJ0cmFvcG4iLHMsZGlzcCk7CisgICAgZGVidWcoRjEwMSwidHJhb3BuIHRsb2dmbXQiLCIiLHRsb2dmbXQpOworCisgICAgemNsb3NlKFpURklMRSk7CisKKyNpZmRlZiBPUzJPUlVOSVgKKyAgICBpZiAodGxvZ2ZtdCA9PSAyKSB7ICAgICAgICAgICAgICAgICAvKiBGVFAgZm9ybWF0IGlzIHNwZWNpYWwuLi4gKi8KKyAgICAgICAgVk9JRCBkb2lrbG9nKCk7CisgICAgICAgIGlmICghZGlzcCkgICAgICAgICAgICAgICAgICAgICAgLyogQXBwZW5kPyAqLworICAgICAgICAgIGlmICh6Y2hraShzKSA+IC0xKSAgICAgICAgICAgIC8qIE5vIC0gZG9lcyBmaWxlIGV4aXN0PyAqLworICAgICAgICAgICAgKFZPSUQpIHpkZWxldChzKTsgICAgICAgICAgIC8qIFllcyAtIGRlbGV0ZSBpdC4gKi8KKyAgICAgICAgeGZlcmxvZyA9IDE7CisgICAgICAgIGNrc3RybmNweSh0cmFmaWwscyxDS01BWFBBVEgpOworICAgICAgICBtYWtlc3RyKCZ4ZmVyZmlsZSxzKTsKKyAgICAgICAgZG9pa2xvZygpOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorICAgIGlmIChzWzBdID09ICd8JykgeyAgICAgICAgICAgICAgICAgIC8qIFBpcGUgKi8KKyAgICAgICAgY2hhciAqIHAgPSBzICsgMTsKKyAgICAgICAgZGVidWcoRjExMCwidHJhb3BuIHAiLHAsMCk7CisgICAgICAgIHdoaWxlICgqcCkgeworICAgICAgICAgICAgaWYgKCpwICE9ICcgJykKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTEwLCJ0cmFvcG4gcGlwZSIscCwwKTsKKyAgICAgICAgdHJhbG9nID0genhjbWQoWlRGSUxFLHApOworICAgICAgICBkZWJ1ZyhGMTAxLCJ0cmFvcG4gdHJhbG9nIiwiIix0cmFsb2cpOworICAgIH0KKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKworICAgIGlmIChzWzBdICE9ICd8JykgeyAgICAgICAgICAgICAgICAgIC8qIEZpbGUgKi8KKyAgICAgICAgaWYgKGRpc3ApIHsKKyAgICAgICAgICAgIHh4LmJzID0gMDsgeHguY3MgPSAwOyB4eC5ybCA9IDA7IHh4Lm9yZyA9IDA7IHh4LmNjID0gMDsKKyAgICAgICAgICAgIHh4LnR5cCA9IDA7IHh4LmRzcCA9IFhZRlpfQTsgeHgub3Nfc3BlY2lmaWMgPSAiIjsKKyAgICAgICAgICAgIHh4LmxibG9wdHMgPSAwOworICAgICAgICAgICAgdHJhbG9nID0gem9wZW5vKFpURklMRSxzLE5VTEwsJnh4KTsKKyAgICAgICAgfSBlbHNlIHRyYWxvZyA9IHpvcGVubyhaVEZJTEUscyxOVUxMLE5VTEwpOworICAgIH0KKyAgICBpZiAoIXRyYWxvZykKKyAgICAgIHByaW50ZigiPyVzIC0gJXNcbiIscyxja19lcnJzdHIoKSk7CisgICAgaWYgKHRyYWxvZyA+IDAgJiYgdGxvZ2ZtdCA+IDApIHsKKyAgICAgICAgY2tzdHJuY3B5KHRyYWZpbCxzLENLTUFYUEFUSCk7CisgICAgICAgIHRsb2coRjExMCwiVHJhbnNhY3Rpb24gTG9nOiIsdmVyc2lvLDBMKTsKKyNpZm5kZWYgTUFDCisgICAgICAgIHRsb2coRjEwMCxja3hzeXMsIiIsMEwpOworI2VuZGlmIC8qIE1BQyAqLworICAgICAgICB6dGltZSgmcyk7CisgICAgICAgIHRsb2coRjEwMCxzLCIiLDBMKTsKKyAgICB9IGVsc2UKKyAgICAgICp0cmFmaWwgPSAnXDAnOworICAgIHJldHVybih0cmFsb2cpOworI2Vsc2UKKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogVExPRyAqLworfQorCisjaWZuZGVmIE5PTE9DQUwKK2ludAorc2Vzb3BuKHMsZGlzcCkgY2hhciAqIHM7IGludCBkaXNwOyB7CisgICAgc3RhdGljIHN0cnVjdCBmaWxpbmZvIHh4OworICAgIGV4dGVybiBpbnQgdHNzdGF0ZTsKKworICAgIHRzc3RhdGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlc3Npb24gbG9nIHRpbWVzdGFtcCBzdGF0ZSAqLworCisgICAgaWYgKCFzKQorICAgICAgcyA9ICIiOworICAgIGlmICghKnMpCisgICAgICByZXR1cm4oMCk7CisKKyAgICBkZWJ1ZyhGMTExLCJzZXNvcG4iLHMsZGlzcCk7CisKKyAgICB6Y2xvc2UoWlNGSUxFKTsKKworI2lmZGVmIE9TMk9SVU5JWAorICAgIGlmIChzWzBdID09ICd8JykgeyAgICAgICAgICAgICAgICAgIC8qIFBpcGUgKi8KKyAgICAgICAgY2hhciAqIHAgPSBzICsgMTsKKyAgICAgICAgZGVidWcoRjExMCwic2Vzb3BuIHAiLHAsMCk7CisgICAgICAgIHdoaWxlICgqcCkgeworICAgICAgICAgICAgaWYgKCpwICE9ICcgJykKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTEwLCJzZXNvcG4gcGlwZSIscCwwKTsKKyAgICAgICAgc2V0c2VzbG9nKHp4Y21kKFpTRklMRSxwKSk7CisgICAgICAgIGRlYnVnKEYxMDEsInNlc29wbiBzZXNsb2ciLCIiLHNlc2xvZyk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSAqLworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworICAgICAgICBpZiAoZGlzcCkgeworICAgICAgICAgICAgeHguYnMgPSAwOyB4eC5jcyA9IDA7IHh4LnJsID0gMDsgeHgub3JnID0gMDsgeHguY2MgPSAwOworICAgICAgICAgICAgeHgudHlwID0gMDsgeHguZHNwID0gWFlGWl9BOyB4eC5vc19zcGVjaWZpYyA9ICIiOworICAgICAgICAgICAgeHgubGJsb3B0cyA9IDA7CisgICAgICAgICAgICBzZXRzZXNsb2coem9wZW5vKFpTRklMRSxzLE5VTEwsJnh4KSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHNldHNlc2xvZyh6b3Blbm8oWlNGSUxFLHMsTlVMTCxOVUxMKSk7CisgICAgICAgIGlmICghc2VzbG9nKQorICAgICAgICAgIHByaW50ZigiPyVzIC0gJXNcbiIscyxja19lcnJzdHIoKSk7CisjaWZkZWYgT1MyT1JVTklYCisgICAgfQorI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworICAgIGlmIChzZXNsb2cgPiAwKQorICAgICAgY2tzdHJuY3B5KHNlc2ZpbCxzLENLTUFYUEFUSCsxKTsKKyAgICBlbHNlCisgICAgICAqc2VzZmlsID0gJ1wwJzsKKyAgICByZXR1cm4oc2VzbG9nKTsKK30KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKworaW50CitkZWJvcG4ocyxkaXNwKSBjaGFyICpzOyBpbnQgZGlzcDsgeworI2lmZGVmIERFQlVHCisjaWZkZWYgQ0tfVVRTTkFNRQorICAgIGV4dGVybiBjaGFyIHVubV9tY2hbXSwgdW5tX25hbVtdLCB1bm1fcmVsW10sIHVubV92ZXJbXSwgdW5tX21vZFtdOworI2VuZGlmIC8qIENLX1VUU05BTUUgKi8KKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gY2hhciBja3hzeXN0ZW1bXTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBjaGFyICp0cDsKKyAgICBzdGF0aWMgc3RydWN0IGZpbGluZm8geHg7CisKKyAgICBpZiAoIXMpCisgICAgICBzID0gIiI7CisgICAgaWYgKCEqcykKKyAgICAgIHJldHVybigwKTsKKworICAgIHpjbG9zZShaREZJTEUpOworCisjaWZkZWYgT1MyT1JVTklYCisgICAgaWYgKHNbMF0gPT0gJ3wnKSB7ICAgICAgICAgICAgICAgICAgLyogUGlwZSAqLworICAgICAgICBjaGFyICogcCA9IHMgKyAxOworICAgICAgICBkZWJ1ZyhGMTEwLCJkZWJvcG4gcCIscCwwKTsKKyAgICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgICAgICBpZiAoKnAgIT0gJyAnKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTAsImRlYm9wbiBwaXBlIixwLDApOworICAgICAgICBkZWJsb2cgPSB6eGNtZChaREZJTEUscCk7CisgICAgICAgIGRlYnVnKEYxMDEsImRlYm9wbiBkZWJsb2ciLCIiLGRlYmxvZyk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSAqLworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworICAgICAgICBpZiAoZGlzcCkgeworICAgICAgICAgICAgeHguYnMgPSAwOyB4eC5jcyA9IDA7IHh4LnJsID0gMDsgeHgub3JnID0gMDsgeHguY2MgPSAwOworICAgICAgICAgICAgeHgudHlwID0gMDsgeHguZHNwID0gWFlGWl9BOyB4eC5vc19zcGVjaWZpYyA9ICIiOworICAgICAgICAgICAgeHgubGJsb3B0cyA9IDA7CisgICAgICAgICAgICBkZWJsb2cgPSB6b3Blbm8oWkRGSUxFLHMsTlVMTCwmeHgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBkZWJsb2cgPSB6b3Blbm8oWkRGSUxFLHMsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKCFkZWJsb2cpCisgICAgICAgICAgcHJpbnRmKCI/JXMgLSAlc1xuIixzLGNrX2VycnN0cigpKTsKKyNpZmRlZiBPUzJPUlVOSVgKKyAgICB9CisjZW5kaWYgLyogT1MyT1JVTklYICovCisgICAgaWYgKGRlYmxvZyA+IDApIHsKKyAgICAgICAgY2tzdHJuY3B5KGRlYmZpbCxzLENLTUFYUEFUSCsxKTsKKyAgICAgICAgZGVidWcoRjExMCwiRGVidWcgTG9nICIsdmVyc2lvLDApOworI2lmbmRlZiBNQUMKKyNpZmRlZiBPUzIKKyAgICAgICAgZGVidWcoRjExMCxja3hzeXMsY2t4c3lzdGVtLDApOworI2Vsc2UgLyogT1MyICovCisgICAgICAgIGRlYnVnKEYxMDAsY2t4c3lzLCIiLDApOworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE1BQyAqLworI2lmZGVmIENLX1VUU05BTUUKKyAgICAgICAgaWYgKHVubV9tY2hbMF0pIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInVuYW1lIG1hY2hpbmUiLHVubV9tY2gsMCk7CisgICAgICAgICAgICBpZiAodW5tX21vZFswXSkKKyAgICAgICAgICAgICAgZGVidWcoRjExMCwidW5hbWUgbW9kZWwgICIsdW5tX21vZCwwKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInVuYW1lIHN5c25hbWUiLHVubV9uYW0sMCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ1bmFtZSByZWxlYXNlIix1bm1fcmVsLDApOworICAgICAgICAgICAgZGVidWcoRjExMCwidW5hbWUgdmVyc2lvbiIsdW5tX3ZlciwwKTsKKyAgICAgICAgfQorI2lmZGVmIEtUQVJHRVQKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAqIHM7ICAgICAgICAgICAgICAgICAgIC8qIE1ha2VmaWxlIHRhcmdldCAqLworICAgICAgICAgICAgcyA9IEtUQVJHRVQ7CisgICAgICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgICAgIGlmICghKnMpIHMgPSAiKHVua25vd24pIjsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImJ1aWxkIHRhcmdldCIscywwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtUQVJHRVQgKi8KKyAgICAgICAgZGVibG9nID0gMDsKKyAgICAgICAgenRpbWUoJnRwKTsKKyAgICAgICAgZGVibG9nID0gMTsKKyAgICAgICAgZGVidWcoRjEwMCx0cCwiIiwwKTsKKyNlbmRpZiAvKiBVVFNOQU1FICovCisgICAgICAgIGRlYnVnKEYxMDEsImJ5dGVvcmRlciIsIiIsYnl0ZW9yZGVyKTsKKyNpZm5kZWYgTk9JQ1AKKyNpZm5kZWYgTk9MT0NBTAorICAgICAgICBpZiAobG9jYWwpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsIkFjdGl2ZSBjb25uZWN0aW9uOiAiLHR0bmFtZSwwKTsKKyAgICAgICAgICAgIGlmICghbmV0d29yaykgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsIlNwZWVkIiwiIixzcGVlZCk7CisgICAgICAgICAgICAgICAgaWYgKGh3cGFyaXR5KQorICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiUGFyaXR5W2hhcmR3YXJlXSIscGFybmFtKChjaGFyKWh3cGFyaXR5KSwwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJQYXJpdHkiLHBhcm5hbSgoY2hhcilwYXJpdHkpLDApOworICAgICAgICAgICAgICAgIGRlYmxvZyA9IDA7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiTW9kZW0iLGdtZG10eXAoKSwwKTsKKyAgICAgICAgICAgICAgICBkZWJsb2cgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVidWcoRjExMCwiQWN0aXZlIGNvbm5lY3Rpb246ICIsIm5vbmUiLDApOworICAgICAgICB9CisjZW5kaWYgLyogTk9MT0NBTCAqLworI2VuZGlmIC8qIE5PSUNQICovCisgICAgfSBlbHNlICpkZWJmaWwgPSAnXDAnOworICAgIHJldHVybihkZWJsb2cpOworI2Vsc2UKKyAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogTUFDICovCit9CisKKworLyogIEMgSyBEIEEgVCBFICAtLSAgUmV0dXJucyBjdXJyZW50IGRhdGUvdGltZSBpbiBzdGFuZGFyZCBmb3JtYXQgICovCisKK3N0YXRpYyBjaGFyIG5vd2J1ZlsxOF07CisKK2NoYXIgKgorY2tkYXRlKCkgeworICAgIGV4dGVybiBzdHJ1Y3Qga2V5dGFiIGNtb250aHNbXTsKKyAgICBpbnQgeDsKKyAgICBjaGFyICogdDsgICAgICAgICAgICAgICAgICAgLyogU3Vic3RpdHV0ZSB0b2RheSdzIGRhdGUgKi8KKyAgICBjaGFyIGRidWZbMzJdOworICAgIHp0aW1lKCZ0KTsKKworLyogIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMyAqLworLyogIFNhdCBKdWwgIDQgMTI6MTY6NDMgMTk5OCAqLworCisgICAgY2tzdHJuY3B5KGRidWYsdCwzMik7CisgICAgdCA9IGRidWY7CisgICAgZGVidWcoRjExMCwiY2tkYXRlIGRidWYiLGRidWYsMCk7CisgICAgbm93YnVmWzBdID0gdFsyMF07CisgICAgbm93YnVmWzFdID0gdFsyMV07CisgICAgbm93YnVmWzJdID0gdFsyMl07CisgICAgbm93YnVmWzNdID0gdFsyM107CisKKyAgICBub3didWZbNF0gPSBOVUw7CisgICAgZGVidWcoRjExMCwiY2tkYXRlIG5vd2J1ZiIsbm93YnVmLDApOworCisgICAgdFs3XSA9IE5VTDsKKyAgICBpZiAoKHggPSBsb29rdXAoY21vbnRocyx0KzQsMTIsTlVMTCkpIDwgMCkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJja2RhdGUgYmFkIG1vbnRoIix0LDApOworICAgICAgICByZXR1cm4oIjxCQURfTU9OVEg+Iik7CisgICAgfQorICAgIHNwcmludGYobm93YnVmKzQsIiUwMmQiLHgpOyAgICAgICAgIC8qIFNBRkUgKi8KKyAgICBub3didWZbNl0gPSAodFs4XSA9PSBTUCkgPyAnMCcgOiB0WzhdOworICAgIG5vd2J1Zls3XSA9IHRbOV07CisgICAgbm93YnVmWzhdID0gJyAnOworCisgICAgbm93YnVmWzldID0gTlVMOworICAgIGRlYnVnKEYxMTAsImNrZGF0ZSBub3didWYiLG5vd2J1ZiwwKTsKKworICAgIGZvciAoeCA9IDExOyB4IDwgMTk7IHgrKykgbm93YnVmW3gtMl0gPSB0W3hdOworICAgIG5vd2J1ZlsxN10gPSBOVUw7CisgICAgZGVidWcoRjExMCwiY2tkYXRlIG5vd2J1ZiIsbm93YnVmLDApOworCisgICAgcmV0dXJuKChjaGFyICopbm93YnVmKTsKK30KKworI2lmbmRlZiBOT0lDUAorI2lmZGVmIENLTE9HRElBTAorCisvKgorICBmYyA9IDAgZm9yIGluaXRpYWwgb3BlbiwgbWVhbmluZyBvcGVuLCB0aGVuIGNsb3NlIGltbWVkaWF0ZWx5LgorICBmYyA+IDAgZm9yIHN1YnNlcXVlbnQgb3BlbnMsIG1lYW5pbmcgb3BlbiBmb3IgdXNlLCBsZWF2ZSBvcGVuLgorKi8KK2ludAorZGlhb3BuKHMsZGlzcCxmYykgY2hhciAqczsgaW50IGRpc3AsIGZjOyB7CisgICAgc3RhdGljIHN0cnVjdCBmaWxpbmZvIHh4OworCisgICAgaWYgKCFzKQorICAgICAgcyA9ICIiOworICAgIGlmICghKnMpCisgICAgICByZXR1cm4oMCk7CisKKyAgICBkZWJ1ZyhGMTEwLCJkaWFvcG4gbG9nIixzLDApOworICAgIGRlYnVnKEYxMDEsImRpYW9wbiBmYyIscyxmYyk7CisgICAgZGVidWcoRjEwMSwiZGlhb3BuIGRpc3AgMSIscyxkaXNwKTsKKyAgICBpZiAoZmMpIGRpc3AgPSAxOyAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSBhcHBlbmQgaWYgb3BlbiBmb3IgdXNlICovCisgICAgZGVidWcoRjEwMSwiZGlhb3BuIGRpc3AgMiIscyxkaXNwKTsKKworICAgIHpjbG9zZShaRElGSUwpOyAgICAgICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgYSBsb2cgd2FzIGFscmVhZHkgb3BlbiAqLworCisjaWZkZWYgT1MyT1JVTklYCisgICAgaWYgKHNbMF0gPT0gJ3wnKSB7ICAgICAgICAgICAgICAgICAgLyogUGlwZSAqLworICAgICAgICBjaGFyICogcCA9IHMgKyAxOworICAgICAgICBkZWJ1ZyhGMTEwLCJkaWFvcG4gcCIscCwwKTsKKyAgICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgICAgICBpZiAoKnAgIT0gJyAnKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTAsImRpYW9wbiBwaXBlIixwLDApOworICAgICAgICBkaWFsb2cgPSB6eGNtZChaRElGSUwscCk7CisgICAgICAgIGRlYnVnKEYxMDEsImRpYW9wbiBkaWFsb2ciLCIiLGRpYWxvZyk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSAqLworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworICAgICAgICBpZiAoZGlzcCkgeworICAgICAgICAgICAgeHguYnMgPSAwOyB4eC5jcyA9IDA7IHh4LnJsID0gMDsgeHgub3JnID0gMDsgeHguY2MgPSAwOworICAgICAgICAgICAgeHgudHlwID0gMDsgeHguZHNwID0gWFlGWl9BOyB4eC5vc19zcGVjaWZpYyA9ICIiOworICAgICAgICAgICAgeHgubGJsb3B0cyA9IDA7CisgICAgICAgICAgICBkaWFsb2cgPSB6b3Blbm8oWkRJRklMLHMsTlVMTCwmeHgpOworICAgICAgICB9IGVsc2UgZGlhbG9nID0gem9wZW5vKFpESUZJTCxzLE5VTEwsTlVMTCk7CisgICAgICAgIGlmICghZGlhbG9nKQorICAgICAgICAgIHByaW50ZigiPyVzIC0gJXNcbiIscyxja19lcnJzdHIoKSk7CisjaWZkZWYgT1MyT1JVTklYCisgICAgfQorI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworICAgIGlmIChkaWFsb2cgPiAwKQorICAgICAgY2tzdHJuY3B5KGRpYWZpbCxzLENLTUFYUEFUSCsxKTsKKyAgICBlbHNlCisgICAgICAqZGlhZmlsID0gJ1wwJzsKKyAgICBpZiAoZmMgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsIG9wZW4gKi8KKyAgICAgIHpjbG9zZShaRElGSUwpOyAgICAgICAgICAgICAgICAgICAvKiBjbG9zZSBpdCAqLworICAgIHJldHVybihkaWFsb2cpOworfQorI2VuZGlmIC8qIENLTE9HRElBTCAqLworCisjaWZuZGVmIE5PU0hPVworCisvKiAgU0hPVyBjb21tYW5kIHJvdXRpbmVzICovCisKK2NoYXIgKgorc2hveG0oKSB7CisgICAgY2hhciAqIHM7CisgICAgc3dpdGNoIChiaW5hcnkpIHsKKyAgICAgIGNhc2UgWFlGVF9UOiBzID0gInRleHQiOyAgICAgICAgIGJyZWFrOworI2lmZGVmIFZNUworICAgICAgY2FzZSBYWUZUX0I6IHMgPSAiYmluYXJ5IGZpeGVkIjsgYnJlYWs7CisgICAgICBjYXNlIFhZRlRfSTogcyA9ICJpbWFnZSI7ICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWFlGVF9MOiBzID0gImxhYmVsZWQiOyAgICAgIGJyZWFrOworICAgICAgY2FzZSBYWUZUX1U6IHMgPSAiYmluYXJ5IHVuZGVmIjsgYnJlYWs7CisjZWxzZQorI2lmZGVmIE1BQworICAgICAgY2FzZSBYWUZUX0I6IHMgPSAiYmluYXJ5IjsgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhZRlRfTTogcyA9ICJtYWNiaW5hcnkiOyAgICBicmVhazsKKyNlbHNlCisgICAgICBjYXNlIFhZRlRfQjogcyA9ICJiaW5hcnkiOyAgICAgICBicmVhazsKKyNpZmRlZiBDS19MQUJFTEVECisgICAgICBjYXNlIFhZRlRfTDogcyA9ICJsYWJlbGVkIjsgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogVk1TICovCisgICAgICBkZWZhdWx0OiBzID0gInVua25vd24iOyBicmVhazsKKyAgICB9CisgICAgcmV0dXJuKHMpOworfQorCisjaWZuZGVmIE5PWEZFUgorVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNIT1cgVFJBTlNGRVIgKi8KK3Nob3hmZXIoKSB7CisgICAgZXh0ZXJuIGludCBkb2NyYywgdXNlcGlwZXMsIHhmcnhsYSwgd2hlcmVmbGc7CisgICAgZXh0ZXJuIGNoYXIgKiB4ZnJtc2c7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiIFRyYW5zZmVyIEJlbGw6ICVzXG4iLHNob3dvZmYoeGZyYmVsKSk7CisgICAgcHJpbnRmKCIgVHJhbnNmZXIgSW50ZXJydXB0aW9uOiAlc1xuIixzaG93b2ZmKHhmcmludCkpOworICAgIHByaW50ZigiIFRyYW5zZmVyIENhbmNlbGxhdGlvbjogJXNcbiIsc2hvd29mZih4ZnJjYW4pKTsKKyNpZm5kZWYgTk9DU0VUUworICAgIHByaW50ZigiIFRyYW5zZmVyIFRyYW5zbGF0aW9uOiAgJXNcbiIsc2hvd29mZih4ZnJ4bGEpKTsKKyAgICBwcmludGYoIiBUcmFuc2ZlciBDaGFyYWN0ZXItc2V0OiAiKTsKKyAgICBpZiAodGNoYXJzZXQgPT0gVENfVFJBTlNQKQorICAgICAgcHJpbnRmKCJUcmFuc3BhcmVudFxuIik7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCIlc1xuIix0Y3NpbmZvW3RjaGFyc2V0XS5rZXl3b3JkKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgcHJpbnRmKCIgVHJhbnNmZXIgQ1JDLWNhbGN1bGF0aW9uOiAlc1xuIixzaG93b2ZmKGRvY3JjKSk7CisgICAgcHJpbnRmKCIgVHJhbnNmZXIgRGlzcGxheTogIik7CisgICAgc3dpdGNoIChmZGlzcGxhKSB7CisgICAgICBjYXNlIFhZRkRfTjogcHJpbnRmKCIlc1xuIiwibm9uZSIpOyBicmVhazsKKyAgICAgIGNhc2UgWFlGRF9SOiBwcmludGYoIiVzXG4iLCJzZXJpYWwiKTsgYnJlYWs7CisgICAgICBjYXNlIFhZRkRfQzogcHJpbnRmKCIlc1xuIiwiZnVsbHNjcmVlbiIpOyBicmVhazsKKyAgICAgIGNhc2UgWFlGRF9TOiBwcmludGYoIiVzXG4iLCJjcnQiKTsgYnJlYWs7CisgICAgICBjYXNlIFhZRkRfQjogcHJpbnRmKCIlc1xuIiwiYnJpZWYiKTsgYnJlYWs7CisgICAgICBjYXNlIFhZRkRfRzogcHJpbnRmKCIlc1xuIiwiZ3VpIik7IGJyZWFrOworICAgIH0KKyAgICBwcmludGYoIiBUcmFuc2ZlciBNZXNzYWdlOiAlc1xuIiwgeGZybXNnID8geGZybXNnIDogIihub25lKSIpOworICAgIHByaW50ZigiIFRyYW5zZmVyIExvY2tpbmctc2hpZnQ6ICIpOworICAgIGlmIChsc2NhcHUgPT0gMikgeworICAgICAgICBwcmludGYoImZvcmNlZCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMiLCAobHNjYXByID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOworICAgICAgICBpZiAobHNjYXByKSBwcmludGYoIiwlcyVzIiwgKGxzY2FwdSA/ICIgIiA6ICIgbm90ICIpLCAidXNlZCIpOworICAgIH0KKyAgICBwcmludGYoIlxuIFRyYW5zZmVyIE1vZGU6ICVzXG4iLAorICAgICAgICAgICB4ZmVybW9kZSA9PSBYTU9ERV9BID8KKyAgICAgICAgICAgImF1dG9tYXRpYyIgOgorICAgICAgICAgICAibWFudWFsIgorICAgICAgICAgICApOworICAgIHByaW50ZigiIFRyYW5zZmVyIFBpcGVzOiAlc1xuIiwgc2hvd29mZih1c2VwaXBlcykpOworICAgIHByaW50ZigiIFRyYW5zZmVyIFByb3RvY29sOiAlc1xuIixwdGFiW3Byb3RvY29sXS5wX25hbWUpOworICAgIHByaW50ZigiIFRyYW5zZmVyIFJlcG9ydDogJXNcbiIsc2hvd29mZih3aGVyZWZsZykpOworICAgIHByaW50ZigiIFRyYW5zZmVyIFNsb3ctc3RhcnQ6ICVzXG4iLHNob3dvZmYoc2xvc3RhcnQpKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisjZW5kaWYgLyogTk9YRkVSICovCisKK1ZPSUQKK3Nob2Zsb3coKSB7CisgICAgaW50IGksIHg7CisgICAgZXh0ZXJuIGludCBjeGZsb3dbXSwgY3h0eXBlLCBuY3huYW1lLCBuZmxvbmFtZSwgYXV0b2Zsb3c7CisgICAgZXh0ZXJuIGNoYXIgKiBjeG5hbWVbXTsKKyAgICBwcmludGYoIlxuQ29ubmVjdGlvbiB0eXBlOiAgICAgICAgJXNcbiIsY3huYW1lW2N4dHlwZV0pOworICAgIGlmIChhdXRvZmxvdykgeworICAgICAgICBwcmludGYoIkN1cnJlbnQgZmxvdy1jb250cm9sOiAgICVzXG4iLCBmbG9uYW1lW2N4Zmxvd1tjeHR5cGVdXSk7CisgICAgICAgIHByaW50ZigiU3dpdGNoZXMgYXV0b21hdGljYWxseTogeWVzXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIkN1cnJlbnQgZmxvdy1jb250cm9sOiAgICVzXG4iLCBmbG9uYW1lW2Zsb3ddKTsKKyAgICAgICAgcHJpbnRmKCJTd2l0Y2hlcyBhdXRvbWF0aWNhbGx5OiBub1xuIik7CisgICAgfQorICAgIHByaW50ZigiXG5EZWZhdWx0cyBieSBjb25uZWN0aW9uIHR5cGU6XG4iKTsKKyAgICBkZWJ1ZyhGMTExLCJzaG9mbG93IGN4dHlwZSIsY3huYW1lW2N4dHlwZV0sY3h0eXBlKTsKKyAgICBkZWJ1ZyhGMTAxLCJzaG9mbG93IGZsb3ciLCIiLGZsb3cpOworICAgIGZvciAoaSA9IDA7IGkgPCBuY3huYW1lOyBpKyspIHsKKyNpZmRlZiBOT0xPQ0FMCisgICAgICAgIGlmIChpID4gMCkgYnJlYWs7CisjZW5kaWYgLyogTk9MT0NBTCAqLworI2lmbmRlZiBORVRDT05OCisgICAgICAgIGlmIChpID4gMikgYnJlYWs7CisjZW5kaWYgLyogTkVUQ09OTiAqLworI2lmbmRlZiBERUNORVQKKyAgICAgICAgaWYgKGkgPT0gQ1hUX0RFQ05FVCkgY29udGludWU7CisjZW5kaWYgLyogREVDTkVUICovCisjaWZuZGVmIERFQ05FVAorI2lmbmRlZiBTVVBFUkxBVAorICAgICAgICBpZiAoaSA9PSBDWFRfTEFUKSBjb250aW51ZTsKKyNlbmRpZiAvKiBTVVBFUkxBVCAqLworI2VuZGlmIC8qIERFQ05FVCAqLworI2lmbmRlZiBDS19ORVRCSU9TCisgICAgICAgIGlmIChpID09IENYVF9ORVRCSU9TKSBjb250aW51ZTsKKyNlbmRpZiAvKiBDS19ORVRCSU9TICovCisjaWZuZGVmIE5QSVBFCisgICAgICAgIGlmIChpID09IENYVF9OUElQRSkgY29udGludWU7CisjZW5kaWYgLyogTlBJUEUgKi8KKyNpZm5kZWYgTkVUQ01ECisgICAgICAgIGlmIChpID09IENYVF9QSVBFKSBjb250aW51ZTsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZm5kZWYgQU5ZWDI1CisgICAgICAgIGlmIChpID09IENYVF9YMjUpIGNvbnRpbnVlOworI2VuZGlmIC8qIEFOWVgyNSAqLworICAgICAgICB4ID0gY3hmbG93W2ldOworICAgICAgICBkZWJ1ZyhGMTAxLCJzaG9mbG93IHgiLCIiLHgpOworICAgICAgICBpZiAoeCA8IG5mbG9uYW1lKQorICAgICAgICAgIHByaW50ZigiICAlLTE0czogJXNcbiIsY3huYW1lW2ldLGZsb25hbWVbeF0pOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCIgICUtMTRzOiAoJWQpXG4iLGN4bmFtZVtpXSx4KTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworfQorCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBBTllYMjUKK2ludAorc2hveDI1KG4pIGludCBuOyB7CisgICAgaWYgKG5ldHR5cGUgPT0gTkVUX1NYMjUpIHsKKyAgICAgICAgcHJpbnRmKCJTdW5MaW5rIFguMjUgViVkLiVkIix4MjV2ZXIgLyAxMCx4MjV2ZXIgJSAxMCk7CisgICAgICAgIGlmICh0dG5wcm90byA9PSBOUF9YMykgcHJpbnRmKCIsIFBBRCBYLjMsIFguMjgsIFguMjkgcHJvdG9jb2wsIik7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisgICAgICAgIHByaW50ZigiIFJldmVyc2UgY2hhcmdlIGNhbGwgJXMiLAorICAgICAgICAgICAgICAgcmV2Y2FsbCA/ICJzZWxlY3RlZCIgOiAibm90IHNlbGVjdGVkIik7CisgICAgICAgIHByaW50ZiAoIiwgQ2xvc2VkIHVzZXIgZ3JvdXAgIik7CisgICAgICAgIGlmIChjbG9zZ3IgPiAtMSkKKyAgICAgICAgICBwcmludGYgKCIlZCIsY2xvc2dyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZiAoIm5vdCBzZWxlY3RlZCIpOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgICAgICBwcmludGYoIiBDYWxsIHVzZXIgZGF0YSAlcy5cbiIsIGN1ZGF0YSA/IHVkYXRhIDogIm5vdCBzZWxlY3RlZCIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyAgICB9IGVsc2UgaWYgKG5ldHR5cGUgPT0gTkVUX1ZYMjUpIHsKKyAgICAgICAgaWYgKHR0bnByb3RvID09IE5QX1gzKSBwcmludGYoIiwgUEFEIFguMywgWC4yOCwgWC4yOSBwcm90b2NvbCwiKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyAgICAgICAgcHJpbnRmKCIgUmV2ZXJzZSBjaGFyZ2UgY2FsbCAlcyIsCisgICAgICAgICAgICAgICByZXZjYWxsID8gInNlbGVjdGVkIiA6ICJub3Qgc2VsZWN0ZWQiKTsKKyAgICAgICAgcHJpbnRmICgiLCBDbG9zZWQgdXNlciBncm91cCBbdW5zdXBwb3J0ZWRdIik7CisgICAgICAgIGlmIChjbG9zZ3IgPiAtMSkKKyAgICAgICAgICBwcmludGYgKCIlZCIsY2xvc2dyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZiAoIm5vdCBzZWxlY3RlZCIpOworICAgICAgICBwcmludGYgKCIsIik7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisgICAgICAgIHByaW50ZigiIENhbGwgdXNlciBkYXRhICVzLlxuIiwgY3VkYXRhID8gdWRhdGEgOiAibm90IHNlbGVjdGVkIik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgIH0gZWxzZSBpZiAobmV0dHlwZSA9PSBORVRfSVgyNSkgeworICAgICAgICBwcmludGYoIkFJWCBOUEkgWC4yNVxuIik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgICAgICBwcmludGYoIlxuIFJldmVyc2UgY2hhcmdlIGNhbGwgJXMiLAorICAgICAgICAgICAgICAgcmV2Y2FsbCA/ICJzZWxlY3RlZCIgOiAibm90IHNlbGVjdGVkIik7CisgICAgICAgIHByaW50ZiAoIiwgQ2xvc2VkIHVzZXIgZ3JvdXAgW3Vuc3VwcG9ydGVkXSIpOworICAgICAgICBpZiAoY2xvc2dyID4gLTEpCisgICAgICAgICAgcHJpbnRmICgiJWQiLGNsb3Nncik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYgKCJub3Qgc2VsZWN0ZWQiKTsKKyAgICAgICAgcHJpbnRmICgiLCIpOworICAgICAgICBwcmludGYoIlxuIENhbGwgdXNlciBkYXRhICVzLlxuIiwgY3VkYXRhID8gdWRhdGEgOiAibm90IHNlbGVjdGVkIik7CisgICAgfQorICAgIHJldHVybihuKTsKK30KKworI2lmbmRlZiBJQk1YMjUKK2ludAorc2hvcGFkKG4pIGludCBuOyB7CisgICAgaW50IGk7CisgICAgcHJpbnRmKCJcblguMyBQQUQgUGFyYW1ldGVyczpcbiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBucGFkeDM7IGkrKykgeworICAgICAgICBwcmludGYoIiBbJWRdICVzICVkXG4iLHBhZHgzdGFiW2ldLmt3dmFsLHBhZHgzdGFiW2ldLmt3ZCwKKyAgICAgICAgICAgICAgIHBhZHBhcm1zW3BhZHgzdGFiW2ldLmt3dmFsXSk7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgIH0KKyAgICByZXR1cm4obik7Cit9CisjZW5kaWYgLyogSUJNWDI1ICovCisjZW5kaWYgLyogQU5ZWDI1ICovCisKK1ZPSUQKK3Nob3BhcmMoKSB7CisgICAgZXh0ZXJuIGludCByZWxpYWJsZSwgc3RvcGJpdHMsIGNsc29uZGlzYzsKKyAgICBpbnQgaTsgY2hhciAqczsKKyAgICBsb25nIHp6OworCisjaWZkZWYgTkVXRlRQCisgICAgaWYgKGZ0cGlzY29ubmVjdGVkKCkpIHsKKyAgICAgICAgc2hvZnRwKDEpOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorI2VuZGlmIC8qIE5FV0ZUUCAqLworCisgICAgcHJpbnRmKCJDb21tdW5pY2F0aW9ucyBQYXJhbWV0ZXJzOlxuIik7CisKKyAgICBpZiAobmV0d29yaworI2lmZGVmIElLU0QKKyAgICAgICAgIHx8IGluc2VydmVyCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgKSB7CisgICAgICAgIHByaW50ZigiIE5ldHdvcmsgSG9zdDogJXMlcyIsdHRuYW1lLAorICAgICAgICAgICAgICAgKHJlbGlhYmxlID09IFNFVF9PTiB8fCAocmVsaWFibGUgPT0gU0VUX0FVVE8gJiYgIWxvY2FsKQorI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgICAgICAgICYmICFpc3RuY29tcG9ydCgpCisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworI2lmZGVmIElLU0QKKyAgICAgICAgICAgICAgIHx8IGluc2VydmVyCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgICAgICAgKSA/ICIgKHJlbGlhYmxlKSIgOiAiIik7CisjaWZkZWYgVE5fQ09NUE9SVAorICAgICAgICBpZiAoaXN0bmNvbXBvcnQoKSkgeworICAgICAgICAgICAgaW50IG1vZGVtc3RhdGU7CisgICAgICAgICAgICBjaGFyICogb2Zsb3csICogaWZsb3cgPSAiIiwgKiBwYXJpdHksICogc3RvcHNpemUsICogc2lnbmF0dXJlOworICAgICAgICAgICAgaW50IGJhdWQgPSB0bmNfZ2V0X2JhdWQoKTsKKworICAgICAgICAgICAgc3dpdGNoICh0bmNfZ2V0X29mbG93KCkpIHsKKyAgICAgICAgICAgICAgY2FzZSBUTkNfQ1RMX09GTE9XX05PTkU6CisgICAgICAgICAgICAgICAgb2Zsb3cgPSAibm9uZSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVE5DX0NUTF9PRkxPV19YT05fWE9GRjoKKyAgICAgICAgICAgICAgICBvZmxvdyA9ICJ4b24veG9mZiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVE5DX0NUTF9PRkxPV19SVFNfQ1RTOgorICAgICAgICAgICAgICAgIG9mbG93ID0gInJ0cy9jdHMiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFROQ19DVExfT0ZMT1dfRENEOgorICAgICAgICAgICAgICAgIG9mbG93ID0gImRjZCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVE5DX0NUTF9PRkxPV19EU1I6CisgICAgICAgICAgICAgICAgb2Zsb3cgPSAiZHNyIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBvZmxvdyA9ICIodW5rbm93bikiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoICh0bmNfZ2V0X2lmbG93KCkpIHsKKyAgICAgICAgICAgICAgY2FzZSBUTkNfQ1RMX0lGTE9XX05PTkU6CisgICAgICAgICAgICAgICAgaWZsb3cgPSAibm9uZSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVE5DX0NUTF9JRkxPV19YT05fWE9GRjoKKyAgICAgICAgICAgICAgICBpZmxvdyA9ICJ4b24veG9mZiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVE5DX0NUTF9JRkxPV19SVFNfQ1RTOgorICAgICAgICAgICAgICAgIGlmbG93ID0gInJ0cy9jdHMiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFROQ19DVExfSUZMT1dfRFRSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmbG93ID0gb2Zsb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHRuY19nZXRfcGFyaXR5KCkpIHsKKyAgICAgICAgICAgICAgY2FzZSBUTkNfUEFSX05PTkU6CisgICAgICAgICAgICAgICAgcGFyaXR5ID0gIm5vbmUiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFROQ19QQVJfT0REOgorICAgICAgICAgICAgICAgIHBhcml0eSA9ICJvZGQiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFROQ19QQVJfRVZFTjoKKyAgICAgICAgICAgICAgICBwYXJpdHkgPSAiZXZlbiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVE5DX1BBUl9NQVJLOgorICAgICAgICAgICAgICAgIHBhcml0eSA9ICJtYXJrIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBUTkNfUEFSX1NQQUNFOgorICAgICAgICAgICAgICAgIHBhcml0eSA9ICJzcGFjZSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcGFyaXR5ID0gIih1bmtub3duKSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHRuY19nZXRfc3RvcHNpemUoKSkgeworICAgICAgICAgICAgICBjYXNlIFROQ19TQl8xOgorICAgICAgICAgICAgICAgIHN0b3BzaXplID0gIjEiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFROQ19TQl8xXzU6CisgICAgICAgICAgICAgICAgc3RvcHNpemUgPSAiMS41IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBUTkNfU0JfMjoKKyAgICAgICAgICAgICAgICBzdG9wc2l6ZSA9ICIyIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdG9wc2l6ZSA9ICIodW5rbm93bikiOworICAgICAgICAgICAgfQorCSAgICBzaWduYXR1cmUgPSAoY2hhciAqKXRuY19nZXRfc2lnbmF0dXJlKCk7CisgICAgICAgICAgICBwcmludGYoIlxuICBTaWduYXR1cmUgICAgICAgICAgICA6ICVzXG4iLHNpZ25hdHVyZT9zaWduYXR1cmU6IiIpOworICAgICAgICAgICAgaWYgKGJhdWQgPD0gMCkKKyAgICAgICAgICAgICAgcHJpbnRmKCIgIFNwZWVkICAgICAgICAgICAgICAgIDogKHVua25vd24pXG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCIgIFNwZWVkICAgICAgICAgICAgICAgIDogJWRcbiIsIGJhdWQpOworICAgICAgICAgICAgcHJpbnRmKCIgIE91dGJvdW5kIEZsb3cgQ29udHJvbDogJXNcbiIsIG9mbG93KTsKKyAgICAgICAgICAgIHByaW50ZigiICBJbmJvdW5kIEZsb3cgQ29udHJvbCA6ICVzXG4iLCBpZmxvdyk7CisgICAgICAgICAgICBwcmludGYoIiAgUGFyaXR5ICAgICAgICAgICAgICAgOiAlc1xuIiwgcGFyaXR5KTsKKyAgICAgICAgICAgIHByaW50ZigiICBEYXRhIFNpemUgICAgICAgICAgICA6ICVkXG4iLCB0bmNfZ2V0X2RhdGFzaXplKCkpOworICAgICAgICAgICAgcHJpbnRmKCIgIFN0b3AgQml0cyAgICAgICAgICAgIDogJXNcbiIsIHN0b3BzaXplKTsKKyAgICAgICAgICAgIHByaW50ZigiICBEVFIgU2lnbmFsICAgICAgICAgICA6ICVkXG4iLCB0bmNfZ2V0X2R0cl9zdGF0ZSgpKTsKKyAgICAgICAgICAgIHByaW50ZigiICBSVFMgU2lnbmFsICAgICAgICAgICA6ICVkXG4iLCB0bmNfZ2V0X3J0c19zdGF0ZSgpKTsKKyAgICAgICAgICAgIHByaW50ZigiICBNb2RlbSBTdGF0ZTpcbiIpOworICAgICAgICAgICAgbW9kZW1zdGF0ZSA9IHRuY19nZXRfbXMoKTsKKyAgICAgICAgICAgIGlmIChtb2RlbXN0YXRlICYgVE5DX01TX0VER0VfUklORykKKyAgICAgICAgICAgICAgcHJpbnRmKCIgICAgVHJhaWxpbmcgRWRnZSBSaW5nIERldGVjdG9yIE9uXG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCIgICAgVHJhaWxpbmcgRWRnZSBSaW5nIERldGVjdG9yIE9mZlxuIik7CisgICAgICAgICAgICBpZiAobW9kZW1zdGF0ZSAmIFROQ19NU19DVFNfU0lHKQorICAgICAgICAgICAgICBwcmludGYoIiAgICBDVFMgU2lnbmFsIE9uXG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCIgICAgQ1RTIFNpZ25hbCBPZmZcbiIpOworICAgICAgICAgICAgaWYgKG1vZGVtc3RhdGUgJiBUTkNfTVNfRFNSX1NJRykKKyAgICAgICAgICAgICAgcHJpbnRmKCIgICAgRFNSIFNpZ25hbCBPblxuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ZigiICAgIERTUiBTaWduYWwgT2ZmXG4iKTsKKyAgICAgICAgICAgIGlmIChtb2RlbXN0YXRlICYgVE5DX01TX1JJX1NJRykKKyAgICAgICAgICAgICAgcHJpbnRmKCIgICAgUmluZyBJbmRpY2F0b3IgT25cbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwcmludGYoIiAgICBSaW5nIEluZGljYXRvciBPZmZcbiIpOworICAgICAgICAgICAgaWYgKG1vZGVtc3RhdGUgJiBUTkNfTVNfUkxTRF9TSUcpCisgICAgICAgICAgICAgIHByaW50ZigiICAgIFJMU0QgKENEKSBTaWduYWwgT25cbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwcmludGYoIiAgICBSTFNEIChDRCkgU2lnbmFsIE9mZlxuIik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisgICAgfSBlbHNlIHsKKworICAgICAgICBwcmludGYoIiAlczogJXMlcywgc3BlZWQ6ICIsCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAiUG9ydCIsCisjZWxzZQorICAgICAgICAgICAgICAgIkxpbmUiLAorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgdHRuYW1lLAorI2lmZGVmIENLX1RUWUZECisgICAgICAgICAgICAgICAobG9jYWwgJiYKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgICAgICB2bXN0dHlmZCgpIDwgMAorI2Vsc2UKKyAgICAgICAgICAgICAgICB0dHlmZCA9PSAtMQorI2VuZGlmIC8qIFZNUyAqLworICAgICAgICAgICAgICAgICkgPworICAgICAgICAgICAgICAgICAiIChjbG9zZWQpIiA6CisgICAgICAgICAgICAgICAgICAgKHJlbGlhYmxlID09IFNFVF9PTiA/ICIgKHJlbGlhYmxlKSIgOiAiIikKKyNlbHNlCisgICAgICAgICAgICAgICAiIgorI2VuZGlmIC8qIENLX1RUWUZEICovCisgICAgICAgICAgICAgICApOworICAgICAgICBpZiAoCisjaWZkZWYgQ0tfVFRZRkQKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgIHZtc3R0eWZkKCkgPCAwCisjZWxzZQorICAgICAgICAgICAgdHR5ZmQgPT0gLTEKKyNlbmRpZiAvKiBWTVMgKi8KKyAgICAgICAgICAgIHx8CisjZW5kaWYgLyogQ0tfVFRZRkQgKi8KKyAgICAgICAgICAgICh6eiA9IHR0Z3NwZCgpKSA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZigidW5rbm93biIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHNwZWVkID09IDg4ODApIHByaW50ZigiNzUvMTIwMCIpOworICAgICAgICAgICAgZWxzZSBpZiAoc3BlZWQgPT0gMTM0KSBwcmludGYoIjEzNC41Iik7CisgICAgICAgICAgICBlbHNlIHByaW50ZigiJWxkIix6eik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5ldHdvcmsKKyNpZmRlZiBJS1NECisgICAgICAgICB8fCBpbnNlcnZlcgorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgICkKKyAgICAgIHByaW50ZigiXG4gTW9kZTogIik7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCIsIG1vZGU6ICIpOworICAgIGlmIChsb2NhbCkgcHJpbnRmKCJsb2NhbCIpOyBlbHNlIHByaW50ZigicmVtb3RlIik7CisgICAgaWYgKG5ldHdvcmsgPT0gMAorI2lmZGVmIElLU0QKKyAgICAgICAgICYmICFpbnNlcnZlcgorI2VuZGlmLyogSUtTRCAqLworICAgICAgICAgKSB7CisjaWZkZWYgQ0tfVEFQSQorICAgICAgICBpZiAodHR0YXBpICYmICF0YXBpcGFzcyApCisgICAgICAgICAgcHJpbnRmKCIsIG1vZGVtOiAlcyIsIlRBUEkiKTsKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIENLX1RBUEkgKi8KKyAgICAgICAgcHJpbnRmKCIsIG1vZGVtOiAlcyIsZ21kbXR5cCgpKTsKKyAgICB9IGVsc2UgeworI2lmZGVmIE5FVENPTk4KKyAgICAgICBpZiAobmV0dHlwZSA9PSBORVRfVENQQSkgcHJpbnRmKCIsIFRDUC9JUCIpOworICAgICAgIGlmIChuZXR0eXBlID09IE5FVF9UQ1BCKSBwcmludGYoIiwgVENQL0lQIik7CisgICAgICAgaWYgKG5ldHR5cGUgPT0gTkVUX0RFQykgeworICAgICAgICAgICBpZiAodHRucHJvdG8gPT0gTlBfTEFUKSBwcmludGYoIiwgREVDbmV0IExBVCIpOworICAgICAgICAgICBlbHNlIGlmICggdHRucHJvdG8gPT0gTlBfQ1RFUk0gKSBwcmludGYoIiwgREVDbmV0IENURVJNIik7CisgICAgICAgICAgIGVsc2UgcHJpbnRmKCIsIERFQ25ldCIpOworICAgICAgIH0KKyAgICAgICBpZiAobmV0dHlwZSA9PSBORVRfU0xBVCkgcHJpbnRmKCIsIE1lcmlkaWFuIFRlY2hub2xvZ2llcycgU3VwZXJMQVQiKTsKKyNpZmRlZiBORVRGSUxFCisgICAgICAgaWYgKG5ldHR5cGUgPT0gTkVUX0ZJTEUpIHByaW50ZigiLCBsb2NhbCBmaWxlIik7CisjZW5kaWYgLyogTkVURklMRSAqLworI2lmZGVmIE5FVENNRAorICAgICAgIGlmIChuZXR0eXBlID09IE5FVF9DTUQpIHByaW50ZigiLCBwaXBlIik7CisjZW5kaWYgLyogTkVUQ01EICovCisjaWZkZWYgTkVUUFRZCisgICAgICAgaWYgKG5ldHR5cGUgPT0gTkVUX1BUWSkgcHJpbnRmKCIsIHBzZXVkb3Rlcm1pbmFsIik7CisjZW5kaWYgLyogTkVUUFRZICovCisjaWZkZWYgTkVURExMCisgICAgICAgaWYgKG5ldHR5cGUgPT0gTkVUX0RMTCkgcHJpbnRmKCIsIGR5bmFtaWMgbG9hZCBsaWJyYXJ5Iik7CisjZW5kaWYgLyogTkVURExMICovCisgICAgICAgaWYgKG5ldHR5cGUgPT0gTkVUX1BJUEUpIHByaW50ZigiLCBOYW1lZCBQaXBlcyIpOworI2lmZGVmIFNTSEJVSUxUSU4KKyAgICAgICBpZiAobmV0dHlwZSA9PSBORVRfU1NIKQorICAgICAgICAgcHJpbnRmKCIsIFNlY3VyZSBTaGVsbCBwcm90b2NvbCAoU0VDVVJFKSIpOworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKyNpZmRlZiBBTllYMjUKKyAgICAgICBpZiAoc2hveDI1KDApIDwgMCkgcmV0dXJuOworI2VuZGlmIC8qIEFOWVgyNSAqLworICAgICAgIGlmIChJU19URUxORVQoKSkgeworICAgICAgICAgICBwcmludGYoIiwgdGVsbmV0IHByb3RvY29sIik7CisgICAgICAgICAgIGlmICgwCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgICAgfHwgY2tfdG5fZW5jcnlwdGluZygpICYmIGNrX3RuX2RlY3J5cHRpbmcoKQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgIHx8IHRsc19hY3RpdmVfZmxhZyB8fCBzc2xfYWN0aXZlX2ZsYWcKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICBwcmludGYoIiAoU0VDVVJFKSIpOworICAgICAgIH0KKyNpZmRlZiBSTE9HQ09ERQorICAgICAgIGVsc2UgaWYgKHR0bnByb3RvID09IE5QX1JMT0dJTiB8fCB0dG5wcm90byA9PSBOUF9LNExPR0lOIHx8CisgICAgICAgICAgICAgICAgdHRucHJvdG8gPT0gTlBfSzVMT0dJTikKKyAgICAgICAgIHByaW50ZigiLCBybG9naW4gcHJvdG9jb2wiKTsKKyAgICAgICBlbHNlIGlmICh0dG5wcm90byA9PSBOUF9FSzRMT0dJTiB8fCB0dG5wcm90byA9PSBOUF9FSzVMT0dJTikKKyAgICAgICAgIHByaW50ZigiLCBybG9naW4gcHJvdG9jb2wgKFNFQ1VSRSkiKTsKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgS1JCNQorICAgICAgIGVsc2UgaWYgKHR0bnByb3RvID09IE5QX0s1VTJVKQorICAgICAgICAgcHJpbnRmKCIsIEtlcmJlcm9zIDUgVXNlciB0byBVc2VyIHByb3RvY29sIChTRUNVUkUpIik7CisjZW5kaWYgLyogS1JCNSAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisgICAgaWYgKGh3cGFyaXR5ICYmIGxvY2FsICYmICFuZXR3b3JrKQorICAgICAgcyA9IHBhcm5hbSgoY2hhcilod3Bhcml0eSk7CisgICAgZWxzZQorICAgICAgcyA9IHBhcm5hbSgoY2hhcilwYXJpdHkpOworICAgIHByaW50ZigiIFBhcml0eTogJXMlcyIsaHdwYXJpdHkgPyAiaGFyZHdhcmUgIiA6ICIiLCBzKTsKKyNpZm5kZWYgTk9MT0NBTAorICAgIGlmIChsb2NhbCAmJiAhbmV0d29yaykgeworICAgICAgICBpbnQgc2I7CisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgYyA9IHNbMF07CisgICAgICAgIGlmIChpc2xvd2VyKGMpKSBjID0gdG91cHBlcihjKTsKKyAgICAgICAgc2IgPSBzdG9wYml0czsKKyAgICAgICAgaWYgKHNiIDwgMSkgeworICAgICAgICAgICAgc2IgPSAoc3BlZWQgPiAwICYmIHNwZWVkIDw9IDExMEwpID8gMiA6IDE7CisgICAgICAgICAgICBwcmludGYoIiwgc3RvcC1iaXRzOiAoZGVmYXVsdCkiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiLCBzdG9wLWJpdHM6ICVkIixzYik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGh3cGFyaXR5KQorICAgICAgICAgIHByaW50ZigiICg4JWMlZCkiLGMsc2IpOworICAgICAgICBlbHNlIGlmIChwYXJpdHkpCisgICAgICAgICAgcHJpbnRmKCIgKDclYyVkKSIsYyxzYik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoIiAoOE4lZCkiLHNiKTsKKyAgICAgICAgcHJpbnRmKCJcbiBEIik7CisgICAgfSBlbHNlCisgICAgICBwcmludGYoIiwgZCIpOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworICAgIHByaW50ZigidXBsZXg6ICVzLCAiLCBkdXBsZXggPyAiaGFsZiIgOiAiZnVsbCIpOworICAgIGRlYnVnKEYxMDEsInNob3BhcnAgZmxvdyIsIiIsZmxvdyk7CisgICAgcHJpbnRmKCJmbG93OiAlcyIsIGZsb25hbWVbZmxvd10pOworICAgIHByaW50ZigiLCBoYW5kc2hha2U6ICIpOworICAgIGlmICh0dXJuKSBwcmludGYoIiVkXG4iLHR1cm5jaCk7IGVsc2UgcHJpbnRmKCJub25lXG4iKTsKKyNpZmRlZiBDT01NRU5UCisgICAgaWYgKGxvY2FsICYmICFuZXR3b3JrKSB7ICAgICAgICAgICAgLyogU0VUIENBUlJJRVItV0FUQ0ggKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIGlmIChjYXJyaWVyID09IENBUl9PRkYpIHMgPSAib2ZmIjsKKyAgICAgICAgZWxzZSBpZiAoY2FycmllciA9PSBDQVJfT04pIHMgPSAib24iOworICAgICAgICBlbHNlIGlmIChjYXJyaWVyID09IENBUl9BVVQpIHMgPSAiYXV0byI7CisgICAgICAgIGVsc2UgcyA9ICJ1bmtub3duIjsKKyAgICAgICAgcHJpbnRmKCIgQ2Fycmllci13YXRjaDogJXMiLCBzKTsKKyAgICAgICAgaWYgKGNhcnJpZXIgPT0gQ0FSX09OKSB7CisgICAgICAgICAgICBpZiAoY2R0aW1vKSBwcmludGYoIiwgdGltZW91dDogJWQgc2VjIiwgY2R0aW1vKTsKKyAgICAgICAgICAgIGVsc2UgcHJpbnRmKCIsIHRpbWVvdXQ6IG5vbmUiKTsKKyAgICAgICAgfQorI2lmZGVmIENPTU1FTlQKKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHByaW50ZigiLCBjbG9zZS1vbi1kaXNjb25uZWN0OiAlc1xuIixzaG93b2ZmKGNsc29uZGlzYykpOworCisjaWZkZWYgVU5JWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVVVDUCBsb2NrZmlsZSwgVU5JWCBvbmx5ICovCisgICAgaWYgKGxvY2FsKSB7CisjaWZuZGVmIE5PVVVDUAorICAgICAgICBpZiAoIW5ldHdvcmsgJiYgaGFzbG9jayAmJiAqZmxmbmFtKQorICAgICAgICAgIHByaW50ZigiIExvY2tmaWxlOiAlcyIsZmxmbmFtKTsKKyNpZm5kZWYgVVNFVFRZTE9DSworICAgICAgICBpZiAoIW5ldHdvcmsgJiYgaGFzbG9jayAmJiBsb2NrMlswXSkKKyAgICAgICAgICBwcmludGYoIlxuIFNlY29uZGFyeSBsb2NrZmlsZTogJXMiLGxvY2syKTsKKyNlbmRpZiAvKiBVU0VUVFlMT0NLICovCisjZWxzZQorI2lmZGVmIFFOWAorICAgICAgICB7CisgICAgICAgICAgICBleHRlcm4gaW50IHFueHBvcnRsb2NrLCBxbnhvcGVuY291bnQoKTsKKyAgICAgICAgICAgIGlmIChsb2NhbCkKKyAgICAgICAgICAgICAgcHJpbnRmKCIgUW54LXBvcnQtbG9jazogJXMsIE9wZW4gY291bnQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHNob3dvZmYocW54cG9ydGxvY2spLAorICAgICAgICAgICAgICAgICAgICAgcW54b3BlbmNvdW50KCkKKyAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ZigiIFFueC1wb3J0LWxvY2s6ICVzIiwgc2hvd29mZihxbnhwb3J0bG9jaykpOworICAgICAgICB9CisjZW5kaWYgLyogUU5YICovCisjZW5kaWYgLyogTk9VVUNQICovCisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyICogcywgKiB0dGdsY2tkaXIoKTsKKyAgICAgICAgcyA9IHR0Z2xja2RpcigpOworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgcHJpbnRmKCIgTG9ja2ZpbGUgZGlyZWN0b3J5OiAlc1xuIiwgKnMgPyBzIDogIihub25lKSIpOworICAgIH0KKyNlbmRpZiAvKiBVTklYICovCisjaWZuZGVmIE1BQ09TWAorICAgIGlmICghbG9jYWwpIHsKKyAgICAgICAgcHJpbnRmKCIgVHlwaWNhbCBwb3J0IGRldmljZSBuYW1lOiAlc1xuIix0dGd0cG4oKSk7CisgICAgfQorI2VuZGlmCS8qIE1BQ09TWCAqLworICAgIGlmIChsb2NhbCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaSA9IHBhcml0eSA/IDcgOiA4OworICAgICAgICBpZiAoaSA9PSA4KSBpID0gKGNtYXNrID09IDAxNzcpID8gNyA6IDg7CisgICAgICAgIHByaW50ZigiIFRlcm1pbmFsIGJ5dGVzaXplOiAlZCwiLGkpOworICAgICAgICBwcmludGYoIiBlc2NhcGUgY2hhcmFjdGVyOiAlZCAoXiVjKVxuIixlc2NhcGUsY3RsKGVzY2FwZSkpOworICAgIH0KK30KKworaW50CitzaG90Y3AobikgaW50IG47IHsKKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICBpZiAobmV0dHlwZSA9PSBORVRfVENQQSB8fCBuZXR0eXBlID09IE5FVF9UQ1BCKSB7CisgICAgICAgIHByaW50ZigiU0VUIFRDUCBwYXJhbWV0ZXJzOlxuIik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgICAgICBwcmludGYoIiBSZXZlcnNlIEROUyBsb29rdXA6ICVzXG4iLCBzaG93b29hKHRjcF9yZG5zKSk7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisKKyNpZmRlZiBDS19ETlNfU1JWCisgICAgICAgIHByaW50ZigiIEROUyBTZXJ2aWNlIFJlY29yZHMgbG9va3VwOiAlc1xuIiwgc2hvd29vYSh0Y3BfZG5zX3NydikpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIENLX0ROU19TUlYgKi8KKworI2lmbmRlZiBOT1RDUE9QVFMKKyNpZmRlZiBTT0xfU09DS0VUCisjaWZkZWYgU09fS0VFUEFMSVZFCisgICAgICAgIHByaW50ZigiIEtlZXBhbGl2ZTogJXNcbiIsIHNob3dvZmYodGNwX2tlZXBhbGl2ZSkpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIFNPX0tFRVBBTElWRSAqLworCisjaWZkZWYgU09fTElOR0VSCisgICAgICAgIHByaW50ZigiIExpbmdlcjogJXMiLCB0Y3BfbGluZ2VyID8gIm9uLCAiIDogIm9mZlxuIiApOworICAgICAgICBpZiAodGNwX2xpbmdlcikgeworICAgICAgICAgICAgaWYgKHRjcF9saW5nZXJfdG1vKQorICAgICAgICAgICAgICBwcmludGYoIiVkIHggMTAgbWlsbGlzZWNvbmRzXG4iLHRjcF9saW5nZXJfdG1vKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCJubyB0aW1lb3V0XG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIFNPX0xJTkdFUiAqLworCisjaWZkZWYgU09fRE9OVFJPVVRFCisgICAgICAgIHByaW50ZigiIERvbnRSb3V0ZTogJXNcbiIsIHRjcF9kb250cm91dGUgPyAib24iIDogIm9mZiIgKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyNlbmRpZiAvKiBTT19ET05UUk9VVEUgKi8KKworI2lmZGVmIFRDUF9OT0RFTEFZCisgICAgICAgIHByaW50ZigiIE5vZGVsYXk6ICVzXG4iLCBzaG93b2ZmKHRjcF9ub2RlbGF5KSk7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogVENQX05PREVMQVkgKi8KKworI2lmZGVmIFNPX1NOREJVRgorICAgICAgICBpZiAodGNwX3NlbmRidWYgPD0gMCkKKyAgICAgICAgICBwcmludGYoIiBTZW5kIGJ1ZmZlcjogKGRlZmF1bHQgc2l6ZSlcbiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCIgU2VuZCBidWZmZXI6ICVkIGJ5dGVzXG4iLCB0Y3Bfc2VuZGJ1Zik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogU09fU05EQlVGICovCisjaWZkZWYgU09fUkNWQlVGCisgICAgICAgIGlmICh0Y3BfcmVjdmJ1ZiA8PSAwKQorICAgICAgICAgIHByaW50ZigiIFJlY2VpdmUgYnVmZmVyOiAoZGVmYXVsdCBzaXplKVxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoIiBSZWNlaXZlIGJ1ZmZlcjogJWQgYnl0ZXNcbiIsIHRjcF9yZWN2YnVmKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyNlbmRpZiAvKiBTT19SQ1ZCVUYgKi8KKyNlbmRpZiAvKiBTT0xfU09DS0VUICovCisjZW5kaWYgLyogTk9UQ1BPUFRTICovCisgICAgICAgIHByaW50ZigiIGFkZHJlc3M6ICVzXG4iLHRjcF9hZGRyZXNzID8gdGNwX2FkZHJlc3MgOiAiKG5vbmUpIik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworI2lmbmRlZiBOT0hUVFAKKyAgICAgICAgcHJpbnRmKCIgaHR0cC1wcm94eTogJXNcbiIsdGNwX2h0dHBfcHJveHkgPyB0Y3BfaHR0cF9wcm94eSA6ICIobm9uZSkiKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogTk9IVFRQICovCisjaWZkZWYgTlQKKyNpZmRlZiBDS19TT0NLUworICAgICAgICBwcmludGYoIiBzb2Nrcy1zZXJ2ZXI6ICVzXG4iLHRjcF9zb2Nrc19zdnIgPyB0Y3Bfc29ja3Nfc3ZyIDogIihub25lKSIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyNpZmRlZiBDS19TT0NLU19OUworICAgICAgICBwcmludGYoIiBzb2Nrcy1uYW1lLXNlcnZlcjogJXNcbiIsCisgICAgICAgICAgICAgICB0Y3Bfc29ja3NfbnMgPyB0Y3Bfc29ja3NfbnMgOiAiKG5vbmUpIik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIENLX1NPQ0tTX05TICovCisjZW5kaWYgLyogQ0tfU09DS1MgKi8KKyNlbmRpZiAvKiBOVCAqLworICAgIH0KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyAgICByZXR1cm4obik7Cit9CisKKyNpZmRlZiBUTkNPREUKK2ludAorc2hvdG9wdChuKSBpbnQgbjsgeworICAgIGludCBvcHQ7CisKKyAgICBwcmludGYoIiUtMjFzICUxMnMgJTEycyAlMTJzICUxMnNcblxuIiwKKyAgICAgICAgICAgIlRlbG5ldCBPcHRpb24iLCJNZSAoY2xpZW50KSIsIlUgKGNsaWVudCkiLAorICAgICAgICAgICAiTWUgKHNlcnZlcikiLCJVIChzZXJ2ZXIpIik7CisgICAgbiArPSAyOworICAgIGlmIChuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKworICAgIGZvciAoIG9wdCA9IFRFTE9QVF9GSVJTVDsgb3B0IDw9IFRFTE9QVF9MQVNUOyBvcHQrKykgeworICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgIGNhc2UgVEVMT1BUX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgIGNhc2UgVEVMT1BUX0VOQ1JZUFRJT046CisgICAgICAgICAgY2FzZSBURUxPUFRfVFRZUEU6CisgICAgICAgICAgY2FzZSBURUxPUFRfTkFXUzoKKyAgICAgICAgICBjYXNlIFRFTE9QVF9CSU5BUlk6CisgICAgICAgICAgY2FzZSBURUxPUFRfTkVXRU5WSVJPTjoKKyAgICAgICAgICBjYXNlIFRFTE9QVF9TTkRMT0M6CisgICAgICAgICAgY2FzZSBURUxPUFRfWERJU1BMT0M6CisgICAgICAgICAgY2FzZSBURUxPUFRfU0dBOgorICAgICAgICAgIGNhc2UgVEVMT1BUX0VDSE86CisgICAgICAgICAgY2FzZSBURUxPUFRfS0VSTUlUOgorICAgICAgICAgIGNhc2UgVEVMT1BUX1NUQVJUX1RMUzoKKyAgICAgICAgICBjYXNlIFRFTE9QVF9GT1JXQVJEX1g6CisgICAgICAgICAgY2FzZSBURUxPUFRfQ09NUE9SVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIiUwM2QgJS0xN3MgIiwKKyAgICAgICAgICAgICAgIG9wdCwgVEVMT1BUKG9wdCkKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIHByaW50ZigiJTEycyAlMTJzICIsCisgICAgICAgICAgICAgICBURUxPUFRfTU9ERShURUxPUFRfREVGX0NfTUVfTU9ERShvcHQpKSwKKyAgICAgICAgICAgICAgIFRFTE9QVF9NT0RFKFRFTE9QVF9ERUZfQ19VX01PREUob3B0KSkKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIHByaW50ZigiJTEycyAlMTJzXG4iLAorICAgICAgICAgICAgICAgVEVMT1BUX01PREUoVEVMT1BUX0RFRl9TX01FX01PREUob3B0KSksCisgICAgICAgICAgICAgICBURUxPUFRfTU9ERShURUxPUFRfREVGX1NfVV9NT0RFKG9wdCkpCisgICAgICAgICAgICAgICApOworCisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgICAgICBpZiAoc3N0ZWxuZXQpCisgICAgICAgICAgcHJpbnRmKCIlMjFzICUxMnMgJTEycyAlMTJzICUxMnNcbiIsCisgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgIChURUxPUFRfTUUob3B0KT8iV0lMTCI6IldPTlQiKSwKKyAgICAgICAgICAgICAgICAgKFRFTE9QVF9VKG9wdCk/IkRPIjoiRE9OVCIpCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoIiUyMXMgJTEycyAlMTJzICUxMnMgJTEyc1xuIiwKKyAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgIChURUxPUFRfTUUob3B0KT8iV0lMTCI6IldPTlQiKSwKKyAgICAgICAgICAgICAgICAgKFRFTE9QVF9VKG9wdCk/IkRPIjoiRE9OVCIpLAorICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgIiIKKyAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisgICAgfQorICAgIHJldHVybihuKTsKK30KKworaW50CitzaG90ZWwobikgaW50IG47IHsKKyAgICBleHRlcm4gaW50IHRuX2R1cGxleDsKKyNpZmRlZiBDS19FTlZJUk9OTUVOVAorICAgIGV4dGVybiBpbnQgdG5fZW52X2ZsZzsKKyAgICBleHRlcm4gY2hhciB0bl9lbnZfYWNjdFtdOworICAgIGV4dGVybiBjaGFyIHRuX2Vudl9qb2JbXTsKKyAgICBleHRlcm4gY2hhciB0bl9lbnZfcHJudFtdOworICAgIGV4dGVybiBjaGFyIHRuX2Vudl9zeXNbXTsKKyAgICBleHRlcm4gY2hhciAqIHRuX2Vudl91c2VydmFyWzhdWzJdOworICAgIGludCB4OworI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisjaWZkZWYgQ0tfU05ETE9DCisgICAgZXh0ZXJuIGNoYXIgKiB0bl9sb2M7CisjZW5kaWYgLyogQ0tfU05ETE9DICovCisgICAgcHJpbnRmKCJTRVQgVEVMTkVUIHBhcmFtZXRlcnM6XG4gZWNobzogJXNcbiBOVlQgbmV3bGluZS1tb2RlOiAiLAorICAgICAgICAgICB0bl9kdXBsZXggPyAibG9jYWwiIDogInJlbW90ZSIpOworICAgIHN3aXRjaCAodG5fbmxtKSB7CisgICAgICBjYXNlIFROTF9DUk5VTDogcHJpbnRmKCIlc1xuIiwib2ZmIChjci1udWwpIik7IGJyZWFrOworICAgICAgY2FzZSBUTkxfQ1JMRjogIHByaW50ZigiJXNcbiIsIm9uIChjci1sZikiKTsgYnJlYWs7CisgICAgICBjYXNlIFROTF9DUjogICAgcHJpbnRmKCIlc1xuIiwicmF3IChjcikiKTsgYnJlYWs7CisgICAgICBjYXNlIFROTF9MRjogICAgcHJpbnRmKCIlc1xuIiwiKGxmKSIpOyBicmVhazsKKyAgICB9CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICB7CisgICAgICAgIGludCB0eXBlID0gY2tfdG5fYXV0aGVudGljYXRlZCgpOworICAgICAgICBwcmludGYoIiBhdXRoZW50aWNhdGlvbjogIik7CisgICAgICAgIHN3aXRjaCAoc3N0ZWxuZXQgPworICAgICAgICAgICAgICAgIFRFTE9QVF9VX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA6CisgICAgICAgICAgICAgICAgIFRFTE9QVF9NRV9NT0RFKFRFTE9QVF9BVVRIRU5USUNBVElPTikKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICBjYXNlIFROX05HX0FDOiBwcmludGYoICJhY2NlcHRlZCAiICk7IGJyZWFrOworICAgICAgICAgIGNhc2UgVE5fTkdfUkY6IHByaW50ZiggInJlZnVzZWQgICIgKTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTl9OR19SUTogcHJpbnRmKCAicmVxdWVzdGVkIik7IGJyZWFrOworICAgICAgICAgIGNhc2UgVE5fTkdfTVU6IHByaW50ZiggInJlcXVpcmVkICIpOyBicmVhazsKKyAgICAgICAgfQorCisjaWZkZWYgQ0tfU1NMCisgICAgICAgIGlmICgoc3NsX2FjdGl2ZV9mbGFnIHx8IHRsc19hY3RpdmVfZmxhZykgJiYKKyAgICAgICAgICAgICBja190bl9hdXRoX3ZhbGlkKCkgPT0gQVVUSF9WQUxJRCAmJgorICAgICAgICAgICAgICghVEVMT1BUX1UoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSB8fAorICAgICAgICAgICAgICAgdHlwZSA9PSBBVVRIVFlQRV9OVUxMIHx8CisgICAgICAgICAgICAgICB0eXBlID09IEFVVEhUWVBFX0FVVE8pKQorICAgICAgICAgICAgcHJpbnRmKCIgICBpbiB1c2U6IFguNTA5IGNlcnRpZmljYXRlXG4iKTsKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgIHByaW50ZigiICAgaW4gdXNlOiAlc1xuIixBVVRIVFlQRV9OQU1FKHR5cGUpKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisgICAgICAgIGlmIChmb3J3YXJkX2ZsYWcpCisgICAgICAgICAgcHJpbnRmKCIgIGNyZWRlbnRpYWxzIGZvcndhcmRpbmcgcmVxdWVzdGVkICVzXG4iLAorICAgICAgICAgICAgICAgICBmb3J3YXJkZWRfdGlja2V0cyA/ICJhbmQgY29tcGxldGVkIiA6CisgICAgICAgICAgICAgICAgICJidXQgbm90IGNvbXBsZXRlZCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCIgIGNyZWRlbnRpYWxzIGZvcndhcmRpbmcgZGlzYWJsZWRcbiIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyAgICB9CisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgeworICAgICAgICBpbnQgaSx4OworICAgICAgICBpbnQgZV90eXBlID0gY2tfdG5fZW5jcnlwdGluZygpOworICAgICAgICBpbnQgZF90eXBlID0gY2tfdG5fZGVjcnlwdGluZygpOworICAgICAgICBjaGFyICogZV9zdHIgPSBOVUxMLCAqIGRfc3RyID0gTlVMTDsKKyAgICAgICAgc3RhdGljIHN0cnVjdCBrZXl0YWIgKiB0bmV0YmwgPSBOVUxMOworICAgICAgICBzdGF0aWMgaW50IG50bmV0YmwgPSAwOworCisgICAgICAgIHggPSBja19nZXRfY3J5cHRfdGFibGUoJnRuZXRibCwmbnRuZXRibCk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG50bmV0Ymw7IGkrKykgeworICAgICAgICAgICAgaWYgKGVfdHlwZSA9PSB0bmV0YmxbaV0ua3d2YWwpCisgICAgICAgICAgICAgIGVfc3RyID0gdG5ldGJsW2ldLmt3ZDsKKyAgICAgICAgICAgIGlmIChkX3R5cGUgPT0gdG5ldGJsW2ldLmt3dmFsKQorICAgICAgICAgICAgICBkX3N0ciA9IHRuZXRibFtpXS5rd2Q7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCIgZW5jcnlwdGlvbjogIik7CisgICAgICAgIHN3aXRjaCAoVEVMT1BUX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pKSB7CisgICAgICAgICAgLyogVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB0byByZXBvcnQgYm90aCBNRSBhbmQgVSBtb2RlcyAqLworICAgICAgICAgIGNhc2UgVE5fTkdfQUM6IHByaW50ZiggImFjY2VwdGVkICIgKTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTl9OR19SRjogcHJpbnRmKCAicmVmdXNlZCAgIiApOyBicmVhazsKKyAgICAgICAgICBjYXNlIFROX05HX1JROiBwcmludGYoICJyZXF1ZXN0ZWQiKTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTl9OR19NVTogcHJpbnRmKCAicmVxdWlyZWQgIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiICAgICAgIGluIHVzZTogIik7CisgICAgICAgIHN3aXRjaCAoKGVfdHlwZSA/IDEgOiAwKSB8IChkX3R5cGUgPyAyIDogMCkpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBwcmludGYoInBsYWluIHRleHQgaW4gYm90aCBkaXJlY3Rpb25zIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBwcmludGYoIiVzIG91dHB1dCwgcGxhaW4gdGV4dCBpbnB1dCIsZV9zdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcHJpbnRmKCJwbGFpbiB0ZXh0IG91dHB1dCwgJXMgaW5wdXQiLGRfc3RyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHByaW50ZigiJXMgb3V0cHV0LCAlcyBpbnB1dCIsZV9zdHIsZF9zdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyAgICB9CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmIElLU19PUFRJT04KKyAgICBwcmludGYoIiBrZXJtaXQ6ICIpOworICAgIHN3aXRjaCAoVEVMT1BUX1VfTU9ERShURUxPUFRfS0VSTUlUKSkgeworICAgICAgY2FzZSBUTl9OR19BQzogcHJpbnRmKCAidSwgYWNjZXB0ZWQ7ICAiICk7IGJyZWFrOworICAgICAgY2FzZSBUTl9OR19SRjogcHJpbnRmKCAidSwgcmVmdXNlZDsgICAiICk7IGJyZWFrOworICAgICAgY2FzZSBUTl9OR19SUTogcHJpbnRmKCAidSwgcmVxdWVzdGVkOyAiKTsgYnJlYWs7CisgICAgICBjYXNlIFROX05HX01VOiBwcmludGYoICJ1LCByZXF1aXJlZDsgICIpOyBicmVhazsKKyAgICB9CisgICAgc3dpdGNoIChURUxPUFRfTUVfTU9ERShURUxPUFRfS0VSTUlUKSkgeworICAgICAgY2FzZSBUTl9OR19BQzogcHJpbnRmKCAibWUsIGFjY2VwdGVkOyAgIiApOyBicmVhazsKKyAgICAgIGNhc2UgVE5fTkdfUkY6IHByaW50ZiggIm1lLCByZWZ1c2VkOyAgICIgKTsgYnJlYWs7CisgICAgICBjYXNlIFROX05HX1JROiBwcmludGYoICJtZSwgcmVxdWVzdGVkOyAiKTsgYnJlYWs7CisgICAgICBjYXNlIFROX05HX01VOiBwcmludGYoICJtZSwgcmVxdWlyZWQ7ICAiKTsgYnJlYWs7CisgICAgfQorICAgIGlmIChURUxPUFRfVShURUxPUFRfS0VSTUlUKSkKKyAgICAgIHByaW50ZigiIHUsICVzIiwKKyAgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQgPworICAgICAgICAgICAgICJzdGFydGVkIiA6CisgICAgICAgICAgICAgInN0b3BwZWQiCisgICAgICAgICAgICAgKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIiB1LCBuL2EiKTsKKyAgICBpZiAoVEVMT1BUX01FKFRFTE9QVF9LRVJNSVQpKQorICAgICAgcHJpbnRmKCIgbWUsICVzOyIsCisgICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9zdGFydCA/CisgICAgICAgICAgICAgInN0YXJ0ZWQiIDoKKyAgICAgICAgICAgICAic3RvcHBlZCIKKyAgICAgICAgICAgICApOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiIG1lLCBuL2E7Iik7CisgICAgcHJpbnRmKCJcbiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKyAgICBwcmludGYoIiBCSU5BUlkgbmV3bGluZS1tb2RlOiAiKTsKKyAgICBzd2l0Y2ggKHRuX2JfbmxtKSB7CisgICAgICBjYXNlIFROTF9DUk5VTDogcHJpbnRmKCIlc1xuIiwib2ZmIChjci1udWwpIik7IGJyZWFrOworICAgICAgY2FzZSBUTkxfQ1JMRjogIHByaW50ZigiJXNcbiIsIm9uIChjci1sZikiKTsgYnJlYWs7CisgICAgICBjYXNlIFROTF9DUjogICAgcHJpbnRmKCIlc1xuIiwicmF3IChjcikiKTsgYnJlYWs7CisgICAgICBjYXNlIFROTF9MRjogICAgcHJpbnRmKCIlc1xuIiwiKGxmKSIpOyBicmVhazsKKyAgICB9CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgYmluYXJ5LW1vZGU6ICIpOworICAgIHN3aXRjaCAoVEVMT1BUX1VfTU9ERShURUxPUFRfQklOQVJZKSkgeworICAgICAgY2FzZSBUTl9OR19BQzogcHJpbnRmKCAidSwgYWNjZXB0ZWQ7ICAiICk7IGJyZWFrOworICAgICAgY2FzZSBUTl9OR19SRjogcHJpbnRmKCAidSwgcmVmdXNlZDsgICAiICk7IGJyZWFrOworICAgICAgY2FzZSBUTl9OR19SUTogcHJpbnRmKCAidSwgcmVxdWVzdGVkOyAiKTsgYnJlYWs7CisgICAgICBjYXNlIFROX05HX01VOiBwcmludGYoICJ1LCByZXF1aXJlZDsgICIpOyBicmVhazsKKyAgICB9CisgICAgc3dpdGNoIChURUxPUFRfTUVfTU9ERShURUxPUFRfQklOQVJZKSkgeworICAgICAgY2FzZSBUTl9OR19BQzogcHJpbnRmKCAibWUsIGFjY2VwdGVkOyAiICk7IGJyZWFrIDsKKyAgICAgIGNhc2UgVE5fTkdfUkY6IHByaW50ZiggIm1lLCByZWZ1c2VkOyAiICk7IGJyZWFrOworICAgICAgY2FzZSBUTl9OR19SUTogcHJpbnRmKCAibWUsIHJlcXVlc3RlZDsgIik7IGJyZWFrOworICAgICAgY2FzZSBUTl9OR19NVTogcHJpbnRmKCAibWUsIHJlcXVpcmVkOyAgIik7IGJyZWFrOworICAgIH0KKyAgICBwcmludGYoInUsICVzOyBtZSwgJXNcbiIsCisgICAgICAgICAgIFRFTE9QVF9VKFRFTE9QVF9CSU5BUlkpID8gIkJJTkFSWSIgOiAiTlZUIiwKKyAgICAgICAgICAgVEVMT1BUX01FKFRFTE9QVF9CSU5BUlkpID8gIkJJTkFSWSIgOiAiTlZUIgorICAgICAgICAgICApOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiIGJpbmFyeS10cmFuc2Zlci1tb2RlOiAlc1xuIixzaG93b2ZmKHRuX2JfeGZlcikpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiIGJ1ZyBiaW5hcnktbWUtbWVhbnMtdS10b286ICVzXG4iLHNob3dvZmYodG5fYl9tZXUpKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoIiBidWcgYmluYXJ5LXUtbWVhbnMtbWUtdG9vOiAlc1xuIixzaG93b2ZmKHRuX2JfdW1lKSk7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgYnVnIHNiLWltcGxpZXMtd2lsbC1kbzogJXNcbiIsc2hvd29mZih0bl9zYl9idWcpKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoIiBidWcgYXV0aC1rcmI1LWRlczogJXNcbiIsc2hvd29mZih0bl9hdXRoX2tyYjVfZGVzX2J1ZykpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiIHRlcm1pbmFsLXR5cGU6ICIpOworICAgIGlmICh0bl90ZXJtKSB7CisgICAgICAgIHByaW50ZigiJXNcbiIsdG5fdGVybSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciAqcDsKKyNpZmRlZiBPUzIKKyAgICAgICAgcCA9ICh0dF90eXBlID49IDAgJiYgdHRfdHlwZSA8PSBtYXhfdHQpID8KKyAgICAgICAgICB0dF9pbmZvW3R0X3R5cGVdLnhfbmFtZSA6CisgICAgICAgICAgICAiVU5LTk9XTiI7CisjZWxzZQorICAgICAgICBwID0gZ2V0ZW52KCJURVJNIik7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIGlmIChwKQorICAgICAgICAgIHByaW50Zigibm9uZSAoJXMgd2lsbCBiZSB1c2VkKVxuIixwKTsKKyAgICAgICAgZWxzZSBwcmludGYoIm5vbmVcbiIpOworICAgIH0KKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyNpZmRlZiBDS19FTlZJUk9OTUVOVAorICAgIHByaW50ZigiIGVudmlyb25tZW50OiAlc1xuIiwgc2hvd29mZih0bl9lbnZfZmxnKSk7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgICBBQ0NPVU5UOiAlc1xuIix0bl9lbnZfYWNjdCk7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgICBESVNQTEFZOiAlc1xuIiwoY2hhciAqKXRuX2dldF9kaXNwbGF5KCkgPworICAgICAgICAgICAgKGNoYXIgKil0bl9nZXRfZGlzcGxheSgpIDogIiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiICAgSk9CICAgIDogJXNcbiIsdG5fZW52X2pvYik7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgICBQUklOVEVSOiAlc1xuIix0bl9lbnZfcHJudCk7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisjaWZuZGVmIE5PU1BMCisgICAgcHJpbnRmKCIgICBVU0VSICAgOiAlc1xuIix1aWRidWYpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIE5PU1BMICovCisgICAgcHJpbnRmKCIgICBTWVNURU0gOiAlc1xuIix0bl9lbnZfc3lzKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7CisgICAgICAgIGlmICh0bl9lbnZfdXNlcnZhclt4XVswXSAmJiB0bl9lbnZfdXNlcnZhclt4XVsxXSkgeworICAgICAgICAgICAgcHJpbnRmKCIgICAlLTdzOiAlc1xuIix0bl9lbnZfdXNlcnZhclt4XVswXSwKKyAgICAgICAgICAgICAgICAgICB0bl9lbnZfdXNlcnZhclt4XVsxXSk7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBDS19FTlZJUk9OTUVOVCAqLworI2lmZGVmIENLX1NORExPQworICAgIHByaW50ZigiICBMT0NBVElPTjogJXNcbiIsIHRuX2xvYyA/IHRuX2xvYyA6ICIiKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyNlbmRpZiAvKiBDS19TTkRMT0MgKi8KKyNpZmRlZiBDS19GT1JXQVJEX1gKKyAgICBwcmludGYoIiAuWGF1dGhvcml0eS1maWxlOiAlc1xuIiwgKGNoYXIgKilYYXVGaWxlTmFtZSgpID8KKyAgICAgICAgICAgIChjaGFyICopWGF1RmlsZU5hbWUoKSA6ICIobm9uZSkiKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyNlbmRpZiAvKiBDS19GT1JXQVJEX1ggKi8KKyAgICByZXR1cm4obik7Cit9CisjZW5kaWYgLyogVE5DT0RFICovCisKKyNpZmRlZiBDS19ORVRCSU9TCitzdGF0aWMgaW50CitzaG9uYihuKSBpbnQgbjsgeworICAgIHByaW50ZigiTkVUQklPUyBwYXJhbWV0ZXJzOlxuIik7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigtMSk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgQVBJICAgICAgIDogJXNcbiIsCisgICAgICAgICAgIE5ldGJldWlBUEkgPworICAgICAgICAgICAiTkVUQVBJLkRMTCAtIElCTSBFeHRlbmRlZCBTZXJ2aWNlcyBvciBOb3ZlbGwgTmV0d2FyZSBSZXF1ZXN0ZXIiCisgICAgICAgICAgIDogIkFDU05FVEIuRExMIC0gSUJNIE5ldHdvcmsgVHJhbnNwb3J0IFNlcnZpY2VzLzIiICkgOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiIExvY2FsIE5hbWU6IFslc11cbiIsIE5ldEJpb3NOYW1lKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoIiBBZGFwdGVyICAgOiAlZFxuIiwgTmV0Qmlvc0FkYXB0ZXIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOyBlbHNlIG4gPSAwOworICAgIGlmIChOZXRCaW9zTFNOID4gMHhGRikgeworICAgICAgICBwcmludGYoIiBTZXNzaW9uICAgOiAlZFxuIiwgTmV0Qmlvc0xTTik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIgU2Vzc2lvbiAgIDogbm9uZSBhY3RpdmVcbiIpOworICAgIH0KKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgZWxzZSBuID0gMDsKKyAgICByZXR1cm4obik7Cit9CisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworCisjaWZuZGVmIE5PTkVUCitpbnQKK3Nob25ldCgpIHsKKworI2lmbmRlZiBORVRDT05OCisgICAgcHJpbnRmKCJcbk5vIG5ldHdvcmtzIGFyZSBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIEMtS2VybWl0XG4iKTsKKworI2Vsc2UKKyNpZmRlZiBOT0xPQ0FMCisgICAgcHJpbnRmKCJcbk5vIG5ldHdvcmtzIGFyZSBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIEMtS2VybWl0XG4iKTsKKworI2Vsc2UgLyogcmVzdCBvZiB0aGlzIHJvdXRpbmUgKi8KKworICAgIGludCBpLCBuID0gNDsKKworI2lmbmRlZiBOT0RJQUwKKyAgICBpZiAobm5ldGRpciA8PSAxKSB7CisgICAgICAgIHByaW50ZigiXG5OZXR3b3JrIGRpcmVjdG9yeTogJXNcbiIsbmV0ZGlyWzBdID8gbmV0ZGlyWzBdIDogIihub25lKSIpOworICAgICAgICBuKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHByaW50ZigiXG5OZXR3b3JrIGRpcmVjdG9yaWVzOlxuIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBubmV0ZGlyOyBpKyspIHsKKyAgICAgICAgICAgIHByaW50ZigiJTJkLiAlc1xuIixpLG5ldGRpcltpXSk7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIE5PRElBTCAqLworCisjaWZkZWYgU1NIQ01ECisgICAgeworICAgICAgICBleHRlcm4gY2hhciAqIHNzaGNtZDsKKyAgICAgICAgcHJpbnRmKCJTU0ggQ09NTUFORDogJXNcbiIsc3NoY21kID8gc3NoY21kIDogInNzaCAtZSBub25lIik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgfQorI2VuZGlmIC8qIFNTSENNRCAqLworCisjaWZkZWYgT1MyCisgICAgcHJpbnRmKCJcbk5ldHdvcmsgYXZhaWxhYmlsaXR5OlxuIik7CisjZWxzZQorICAgIHByaW50ZigiXG5TdXBwb3J0ZWQgbmV0d29ya3M6XG4iKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworCisjaWZkZWYgVk1TCisKKyNpZmRlZiBUQ1BXQVJFCisgICAgcHJpbnRmKCIgUHJvY2VzcyBTb2Z0d2FyZSBDb3Jwb3JhdGlvbiBUQ1B3YXJlIGZvciBPcGVuVk1TIik7CisjZWxzZQorI2lmZGVmIE1VTFRJTkVUCisgICAgcHJpbnRmKCIgVEdWIE11bHRpTmV0IFRDUC9JUCIpOworI2Vsc2UKKyNpZmRlZiBXSU5UQ1AKKyAgICBwcmludGYoIiBXT0xMT05HT05HIFdJTi9UQ1AiKTsKKyNlbHNlCisjaWZkZWYgREVDX1RDUElQCisgICAgeworICAgICAgICBzdGF0aWMgJERFU0NSSVBUT1IodGNwX2Rlc2MsIl9UQ1AwOiIpOworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBsb25nIGRldmNsYXNzOworICAgICAgICBzdGF0aWMgaW50IGl0bWNvZCA9IERWSSRfREVWQ0xBU1M7CisKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIHN0YXR1cyA9IExJQiRHRVREVkkoJml0bWNvZCwgMCwgJnRjcF9kZXNjLCAmZGV2Y2xhc3MpOworI2Vsc2UKKyAgICAgICAgLyogTWFydGluIFppbnNlciA5Lzk2ICovCisgICAgICAgIHN0YXR1cyA9IGxpYiRnZXRkdmkoJml0bWNvZCwgMCwgJnRjcF9kZXNjLCAmZGV2Y2xhc3MpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgaWYgKChzdGF0dXMgJiAxKSAmJiAoZGV2Y2xhc3MgPT0gREMkX1NDT00pKQorICAgICAgICAgIHByaW50ZigiIFByb2Nlc3MgU29mdHdhcmUgQ29ycG9yYXRpb24gVENQd2FyZSBmb3IgT3BlblZNUyIpOworICAgICAgICBlbHNlCisjaWZkZWYgVUNYNTAKKyAgICAgICAgICBwcmludGYoIiBERUMgVENQL0lQIFNlcnZpY2VzIGZvciAoT3BlbilWTVMgNS4wIik7CisjZWxzZQorICAgICAgICAgIHByaW50ZigiIERFQyBUQ1AvSVAgU2VydmljZXMgZm9yIChPcGVuKVZNUyIpOworI2VuZGlmIC8qIFVDWDUwICovCisgICAgfQorI2Vsc2UKKyNpZmRlZiBDTVVfVENQSVAKKyAgICBwcmludGYoIiBDTVUtT3BlblZNUy9JUCIpOworI2Vsc2UKKyAgICBwcmludGYoIiBOb25lIik7CisjZW5kaWYgLyogQ01VX1RDUElQICovCisjZW5kaWYgLyogREVDX1RDUElQICovCisjZW5kaWYgLyogV0lOVENQICovCisjZW5kaWYgLyogTVVMVElORVQgKi8KKyNlbmRpZiAvKiBUQ1BXQVJFICovCisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyNpZmRlZiBUTkNPREUKKyAgICBwcmludGYoIiwgVEVMTkVUIHByb3RvY29sXG5cbiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgbiA9IHNob3RlbChuKTsKKyAgICBpZiAobiA8IDApIHJldHVybigwKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIFROQ09ERSAqLworICAgIHByaW50ZigiXG4iKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiXG4iKTsKKyAgICBuID0gc2hvdGNwKCsrbik7CisgICAgaWYgKG4gPCAwKSByZXR1cm4oMCk7CisjZWxzZSAvKiBOb3QgVk1TICovCisKKyNpZmRlZiBTVU5YMjUKKyAgICBwcmludGYoIiBTdW5MaW5rIFguMjVcbiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogU1VOWDI1ICovCisKKyNpZmRlZiBTVFJBVFVTWDI1CisgICAgcHJpbnRmKCIgU3RyYXR1cyBWT1MgWC4yNVxuIik7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyNlbmRpZiAvKiBTVFJBVFVTWDI1ICovCisKKyNpZmRlZiBJQk1YMjUKKyAgICBwcmludGYoIiBJQk0gQUlYIFguMjVcbiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogSUJNWDI1ICovCisKKyNpZmRlZiBIUFgyNQorICAgIHByaW50ZigiIEhQLVVYIFguMjVcbiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogSFBYMjUgKi8KKworI2lmZGVmIFNTSEJVSUxUSU4KKyAgICBpZiAoY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpKQorICAgICAgICBwcmludGYoIiBTU0ggVjEgYW5kIFYyIHByb3RvY29sc1xuIik7CisgICAgZWxzZQorICAgICAgICBwcmludGYoIiBTU0ggVjEgYW5kIFYyIHByb3RvY29scyAtIG5vdCBhdmFpbGFibGVcbiIpOworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKworI2lmZGVmIERFQ05FVAorI2lmZGVmIE9TMgorI2lmZGVmIE5UCisgICAgaWYgKGRuZXRfYXZhaWwpCisgICAgICBwcmludGYoIiBERUNuZXQsIExBVCBhbmQgQ1RFUk0gcHJvdG9jb2xzXG4iKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIiBERUNuZXQsIExBVCBhbmQgQ1RFUk0gcHJvdG9jb2xzIC0gbm90IGF2YWlsYWJsZVxuIik7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyNlbHNlIC8qIE5UICovCisgICAgaWYgKGRuZXRfYXZhaWwpCisgICAgICBwcmludGYoIiBERUNuZXQsIExBVCBwcm90b2NvbFxuIik7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCIgREVDbmV0LCBMQVQgcHJvdG9jb2wgLSBub3QgYXZhaWxhYmxlXG4iKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIE5UICovCisjZWxzZQorICAgIHByaW50ZigiIERFQ25ldFxuIik7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBERUNORVQgKi8KKworI2lmZGVmIE5QSVBFCisgICAgcHJpbnRmKCIgTmFtZWQgUGlwZXNcbiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogTlBJUEUgKi8KKworI2lmZGVmIENLX05FVEJJT1MKKyAgICBpZiAobmV0Ymlvc0F2YWlsKQorICAgICAgcHJpbnRmKCIgTkVUQklPU1xuIik7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCIgTkVUQklPUyAtIG5vdCBhdmFpbGFibGVcbiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworCisjaWZkZWYgU1VQRVJMQVQKKyAgICBpZiAoc2xhdF9hdmFpbCkKKyAgICAgIHByaW50ZigiIFN1cGVyTEFUXG4iKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIiBTdXBlckxBVCAtIG5vdCBhdmFpbGFibGVcbiIpIDsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIFNVUEVSTEFUICovCisKKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICBpZiAoCisjaWZkZWYgT1MyCisgICAgICAgIHRjcF9hdmFpbAorI2Vsc2UKKyAgICAgICAgMQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICApIHsKKyAgICAgICAgY2hhciBpcGFkZHJbMTZdOworCisgICAgICAgIGlmIChnZXRsb2NhbGlwYWRkcnMoaXBhZGRyLDE2LDApIDwgMCkgeworI2lmZGVmIE9TMk9OTFkKKyAgICAgICAgICAgIHByaW50ZigiIFRDUC9JUCB2aWEgJXNcbiIsIHRjcG5hbWUpOworI2Vsc2UKKyAgICAgICAgICAgIHByaW50ZigiIFRDUC9JUFxuIik7CisjZW5kaWYgLyogT1MyT05MWSAqLworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBpID0gMTsKKyNpZmRlZiBPUzJPTkxZCisgICAgICAgICAgcHJpbnRmKCIgVENQL0lQIFslMTZzXSB2aWEgJXNcbiIsIGlwYWRkciwgdGNwbmFtZSk7CisjZWxzZQorICAgICAgICAgIHByaW50ZigiIFRDUC9JUCBbJTE2c11cbiIsaXBhZGRyKTsKKyNlbmRpZiAvKiBPUzJPTkxZICovCisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworCisgICAgICAgICAgICB3aGlsZSAoZ2V0bG9jYWxpcGFkZHJzKGlwYWRkciwxNixpKyspID49IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgICAgWyUxNnNdXG4iLGlwYWRkcik7CisgICAgICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobmV0dHlwZSA9PSBORVRfVENQQikgeworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgbiA9IHNob3RjcCgrK24pOworICAgICAgICAgICAgaWYgKG4gPCAwKSByZXR1cm4oMCk7CisjaWZkZWYgVE5DT0RFCisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICBuID0gc2hvdGVsKCsrbik7CisgICAgICAgICAgICBpZiAobiA8IDApIHJldHVybigwKTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgIH0KKyNpZmRlZiBPUzIKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiBUQ1AvSVAgLSBub3QgYXZhaWxhYmxlJXNcbiIsdGNwbmFtZVswXSA/IHRjcG5hbWUgOiAiIiApOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIE9TMiAqLworICAgIH0KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworI2lmZGVmIENLX05FVEJJT1MKKyAgICBpZiAobmV0Ymlvc0F2YWlsICYmIG5ldHR5cGUgPT0gTkVUX0JJT1MpIHsKKyAgICAgICBwcmludGYoIlxuIikgOworICAgICAgIGlmICgobiA9IHNob25iKCsrbikpIDwgMCkgcmV0dXJuKDApOworICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgfQorI2VuZGlmIC8qIENLX05FVEJJT1MgKi8KKworI2VuZGlmIC8qIFZNUyAqLworCisgICAgcHJpbnRmKCJcbkFjdGl2ZSBuZXR3b3JrIGNvbm5lY3Rpb246XG4iKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworCisgICAgaWYgKG5ldHdvcmspIHsKKyAgICAgICAgcHJpbnRmKCIgSG9zdDogJXMiLHR0bmFtZSk7CisgICAgICAgIGlmICgobmV0dHlwZSA9PSBORVRfVENQQSB8fCBuZXR0eXBlID09IE5FVF9UQ1BCKSAmJiAqaXBhZGRyKQorICAgICAgICAgIHByaW50ZigiIFslc10iLGlwYWRkcik7CisgICAgfSBlbHNlCisgICAgICBwcmludGYoIiBIb3N0OiBub25lIik7CisgICAgcHJpbnRmKCIsIHZpYTogIik7CisgICAgaWYgKG5ldHR5cGUgPT0gTkVUX1RDUEEgfHwgbmV0dHlwZSA9PSBORVRfVENQQikKKyAgICAgIHByaW50ZigidGNwL2lwXG4iKTsKKyAgICBlbHNlIGlmIChuZXR0eXBlID09IE5FVF9TWDI1KQorICAgICAgcHJpbnRmKCJTdW5MaW5rIFguMjVcbiIpOworICAgIGVsc2UgaWYgKG5ldHR5cGUgPT0gTkVUX1ZYMjUpCisgICAgICBwcmludGYoIlN0cmF0dXMgVk9TIFguMjVcbiIpOworICAgIGVsc2UgaWYgKG5ldHR5cGUgPT0gTkVUX0lYMjUpCisgICAgICBwcmludGYoIklCTSBBSVggWC4yNVxuIik7CisgICAgZWxzZSBpZiAobmV0dHlwZSA9PSBORVRfSFgyNSkKKyAgICAgIHByaW50ZigiSFAtVVggWC4yNVxuIik7CisgICAgZWxzZSBpZiAobmV0dHlwZSA9PSBORVRfREVDKSB7CisgICAgICAgIGlmICggdHRucHJvdG8gPT0gTlBfTEFUICkKKyAgICAgICAgICBwcmludGYoIkRFQ25ldCBMQVRcbiIpOworICAgICAgICBlbHNlIGlmICggdHRucHJvdG8gPT0gTlBfQ1RFUk0gKQorICAgICAgICAgIHByaW50ZigiREVDbmV0IENURVJNXG4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZigiREVDbmV0XG4iKTsKKyAgICB9IGVsc2UgaWYgKG5ldHR5cGUgPT0gTkVUX1BJUEUpCisgICAgICBwcmludGYoIk5hbWVkIFBpcGVzXG4iKTsKKyAgICBlbHNlIGlmIChuZXR0eXBlID09IE5FVF9CSU9TKQorICAgICAgcHJpbnRmKCJOZXRCSU9TXG4iKTsKKyAgICBlbHNlIGlmIChuZXR0eXBlID09IE5FVF9TTEFUKQorICAgICAgcHJpbnRmKCJTdXBlckxBVFxuIik7CisKKyNpZmRlZiBORVRGSUxFCisgICAgZWxzZSBpZiAoIG5ldHR5cGUgPT0gTkVUX0ZJTEUgKQorICAgICAgcHJpbnRmKCJsb2NhbCBmaWxlXG4iKTsKKyNlbmRpZiAvKiBORVRGSUxFICovCisjaWZkZWYgTkVUQ01ECisgICAgZWxzZSBpZiAoIG5ldHR5cGUgPT0gTkVUX0NNRCApCisgICAgICBwcmludGYoInBpcGVcbiIpOworI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorICAgIGVsc2UgaWYgKCBuZXR0eXBlID09IE5FVF9QVFkgKQorICAgICAgICBwcmludGYoInBzZXVkb3Rlcm1pbmFsXG4iKTsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKyNpZmRlZiBORVRETEwKKyAgICBlbHNlIGlmICggbmV0dHlwZSA9PSBORVRfRExMICkKKyAgICAgIHByaW50ZigiZHluYW1pYyBsaW5rIGxpYnJhcnlcbiIpOworI2VuZGlmIC8qIE5FVERMTCAqLworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisKKyNpZmRlZiBBTllYMjUKKyAgICBpZiAoKG5ldHR5cGUgPT0gTkVUX1NYMjUpIHx8CisgICAgICAgIChuZXR0eXBlID09IE5FVF9WWDI1KSB8fAorICAgICAgICAobmV0dHlwZSA9PSBORVRfSVgyNSkpCisgICAgICBpZiAoKG4gPSBzaG94MjUobikpIDwgMCkgcmV0dXJuKDApOworI2VuZGlmIC8qIEFOWVgyNSAqLworCisjaWZkZWYgU1NIQlVJTFRJTgorICAgIGlmIChuZXR0eXBlID09IE5FVF9TU0gpIHsKKyAgICAgICAgcHJpbnRmKCJTZWN1cmUgU2hlbGwgcHJvdG9jb2xcbiIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgIH0KKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisKKyAgICBpZiAobmV0dHlwZSA9PSBORVRfVENQQSB8fCBuZXR0eXBlID09IE5FVF9UQ1BCKSB7CisjaWZkZWYgUkxPR0NPREUKKyAgICAgICAgaWYgKHR0bnByb3RvID09IE5QX1JMT0dJTikgeworICAgICAgICAgICAgcHJpbnRmKCIgTE9HSU4gKHJsb2dpbikgcHJvdG9jb2xcbiIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgfQorI2lmZGVmIENLX0tFUkJFUk9TCisgICAgICAgIGVsc2UgaWYgKHR0bnByb3RvID09IE5QX0s0TE9HSU4pIHsKKyAgICAgICAgICAgIHByaW50ZigiIEtlcmJlcm9zIDQgTE9HSU4gKGtsb2dpbikgcHJvdG9jb2xcbiIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0dG5wcm90byA9PSBOUF9FSzRMT0dJTikgeworICAgICAgICAgICAgcHJpbnRmKCIgRW5jcnlwdGVkIEtlcmJlcm9zIDQgTE9HSU4gKGVrbG9naW4pIHByb3RvY29sXG4iKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHRucHJvdG8gPT0gTlBfSzVMT0dJTikgeworICAgICAgICAgICAgcHJpbnRmKCIgS2VyYmVyb3MgNSBMT0dJTiAoa2xvZ2luKSBwcm90b2NvbFxuIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR0bnByb3RvID09IE5QX0VLNUxPR0lOKSB7CisgICAgICAgICAgICBwcmludGYoIiBFbmNyeXB0ZWQgS2VyYmVyb3MgNSBMT0dJTiAoZWtsb2dpbikgcHJvdG9jb2xcbiIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBDS19LRVJCRVJPUworICAgICAgICBpZiAodHRucHJvdG8gPT0gTlBfSzVVMlUpIHsKKyAgICAgICAgICAgIHByaW50ZigiIEtlcmJlcm9zIDUgVXNlciB0byBVc2VyIHByb3RvY29sXG4iKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCisjaWZkZWYgVE5DT0RFCisgICAgICAgIGlmIChJU19URUxORVQoKSkgeworICAgICAgICAgICAgcHJpbnRmKCIgVEVMTkVUIHByb3RvY29sXG4iKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBFY2hvaW5nIGlzIGN1cnJlbnRseSAlc1xuIixkdXBsZXggPyAibG9jYWwiIDogInJlbW90ZSIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgfQorI2VuZGlmIC8qIFROQ09ERSAqLworICAgICAgICBpZiAodHRucHJvdG8gPT0gTlBfVENQUkFXKSB7CisgICAgICAgICAgICBwcmludGYoIiBSYXcgVENQIHNvY2tldFxuIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICB9CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBOT05FVCAqLworCisjaWZuZGVmIE5PRElBTAorVk9JRAorc2hvZGlhbCgpIHsKKyAgICBpZiAobWRtdHlwID49IDAgfHwgbG9jYWwgIT0gMCkgZG9zaG9kaWFsKCk7Cit9CisKK1ZPSUQKK3Nob2RzKHMpIGNoYXIgKnM7IHsgICAgICAgICAgICAgICAgICAgICAvKiBTaG93IGEgZGlhbC1yZWxhdGVkIHN0cmluZyAqLworICAgIGNoYXIgYzsKKyAgICBpZiAocyA9PSBOVUxMIHx8ICEoKnMpKSB7ICAgICAgICAgICAvKiBFbXB0eT8gKi8KKyAgICAgICAgcHJpbnRmKCIobm9uZSlcbiIpOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBlbXB0eS4gKi8KKyAgICAgICAgd2hpbGUgKChjID0gKnMrKykpICAgICAgICAgICAgICAvKiBDYW4gY29udGFpbiBjb250cm9scyAqLworICAgICAgICAgIGlmIChjID09ICdcXCcpICAgICAgICAgICAgICAgIC8qIGEgYmFja3NsYXNoICovCisgICAgICAgICAgICBwcmludGYoIlxcXFwiKTsKKyAgICAgICAgICBlbHNlIGlmIChjID4gMzEgJiYgYyA8IDEyNykgeworICAgICAgICAgICAgICBwdXRjaGFyKGMpOworICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJcXHslZH0iLGMpOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorfQorCitpbnQKK2Rvc2hvZGlhbCgpIHsKKworICAgIGludCBpLCBuID0gMjsKKworICAgIHByaW50ZigiIERpYWwgc3RhdHVzOiAgJWQiLCBkaWFsc3RhKTsKKworI2lmZGVmIEJJR0JVRk9LCisgICAgaWYgKGRpYWxzdGEgPiA5MCkKKyAgICAgIHByaW50ZigiID0gVW5rbm93biBlcnJvciIpOworICAgIGVsc2UgaWYgKGRpYWxzdGEgPCAwKQorICAgICAgcHJpbnRmKCIgPSAobm9uZSkiKTsKKyAgICBlbHNlIGlmIChkaWFsc3RhIDwgMzUgJiYgZGlhbG1zZ1tkaWFsc3RhXSkKKyAgICAgIHByaW50ZigiID0gJXMiLCBkaWFsbXNnW2RpYWxzdGFdKTsKKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworICAgIG4rKzsKKyAgICBpZiAobmRpYWxkaXIgPD0gMSkgeworICAgICAgICBwcmludGYoIlxuIERpYWwgZGlyZWN0b3J5OiAlc1xuIixkaWFsZGlyWzBdID8gZGlhbGRpclswXSA6ICIobm9uZSkiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgcHJpbnRmKCJcbiBEaWFsIGRpcmVjdG9yaWVzOlxuIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZGlhbGRpcjsgaSsrKQorICAgICAgICAgIHByaW50ZigiJTJkLiAlc1xuIixpKzEsZGlhbGRpcltpXSk7CisgICAgICAgIG4gKz0gbmRpYWxkaXI7CisgICAgfQorICAgIHByaW50ZigiIERpYWwgbWV0aG9kOiAgIik7CisgICAgaWYgICAgICAoZGlhbG1hdXRvKSAgICAgICAgIHByaW50ZigiYXV0byAgICIpOworICAgIGVsc2UgaWYgKGRpYWxtdGggPT0gWFlETV9EKSBwcmludGYoImRlZmF1bHQiKTsKKyAgICBlbHNlIGlmIChkaWFsbXRoID09IFhZRE1fUCkgcHJpbnRmKCJwdWxzZSAgIik7CisgICAgZWxzZSBpZiAoZGlhbG10aCA9PSBYWURNX1QpIHByaW50ZigidG9uZSAgICIpOworICAgIHByaW50ZigiICAgICAgICAgRGlhbCBzb3J0OiAlc1xuIixkaWFsc3J0ID8gIm9uIiA6ICJvZmYiKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiIERpYWwgaGFuZ3VwOiAgJXMgICAgICAgICAgICAgRGlhbCBkaXNwbGF5OiAlc1xuIiwKKyAgICAgICAgICAgZGlhbGhuZyA/ICJvbiAiIDogIm9mZiIsIGRpYWxkcHkgPyAib24iIDogIm9mZiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgaWYgKGRpYWxydHIgPiAwKSB7CisgICAgICAgIHByaW50ZigiIERpYWwgcmV0cmllczogJS0xMmQgICAgRGlhbCBpbnRlcnZhbDogJWRcbiIsCisgICAgICAgICAgICAgICBkaWFscnRyLCBkaWFsaW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiBEaWFsIHJldHJpZXM6IChhdXRvKSAgICAgICAgICBEaWFsIGludGVydmFsOiAlZFxuIiwgZGlhbGludCk7CisgICAgfQorICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgRGlhbCB0aW1lb3V0OiAiKTsKKyNpZmRlZiBDS19UQVBJCisgICAgaWYgKHR0dGFwaSAmJiAhdGFwaXBhc3MpCisgICAgICAgIHByaW50ZigiKHRhcGkpIik7CisgICAgZWxzZQorI2VuZGlmIC8qIENLX1RBUEkgKi8KKyAgICBpZiAoZGlhbHRtbyA+IDApCisgICAgICBwcmludGYoIiU0ZCBzZWMiLCBkaWFsdG1vKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIjAgKGF1dG8pIik7CisgICAgcHJpbnRmKCIgICAgICAgIFJlZGlhbCBudW1iZXI6ICVzXG4iLGRpYWxudW0gPyBkaWFsbnVtIDogIihub25lKSIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgRGlhbCBjb25maXJtYXRpb246ICVzICAgICAgICBEaWFsIGNvbnZlcnQtZGlyZWN0b3J5OiAlc1xuIiwKKyAgICAgICAgICAgZGlhbGNuZiA/ICJvbiAiIDogIm9mZiIsCisgICAgICAgICAgIGRpYWxjdnQgPyAoKGRpYWxjdnQgPT0gMSkgPyAib24iIDogImFzayIpIDogIm9mZiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgRGlhbCBpZ25vcmUtZGlhbHRvbmU6ICVzIiwgZGlhbGlkdCA/ICJvbiAiIDogIm9mZiIpOworICAgIHByaW50ZigiICAgICBEaWFsIHBhY2luZzogJWRcbiIsZGlhbHBhY2UpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKAorIiBEaWFsIHByZWZpeDogICAgICAgICAgICAgICAgICAlc1xuIiwgZGlhbG5wciA/IGRpYWxucHIgOiAiKG5vbmUpIik7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoCisiIERpYWwgc3VmZml4OiAgICAgICAgICAgICAgICAgICVzXG4iLCBkaWFsc2Z4ID8gZGlhbHNmeCA6ICIobm9uZSkiKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigKKyIgRGlhbCBjb3VudHJ5LWNvZGU6ICAgICAgICAgICAgJS0xMnMiLCBkaWFsbGNjID8gZGlhbGxjYyA6ICIobm9uZSkiKTsKKyAgICBwcmludGYoIkRpYWwgY29ubmVjdDogICVzIiwgZGlhbGNvbiA/ICgoZGlhbGNvbiA9PSAxKSA/ICJvbiIgOiAiYXV0byIpCisgICAgICAgICAgIDogIm9mZiIpOworICAgIGlmIChkaWFsY29uICE9IENBUl9PRkYpCisgICAgICBwcmludGYoIiAlcyIsIGRpYWxjcSA/ICJxdWlldCIgOiAidmVyYm9zZSIpOworICAgIHByaW50ZigKKyJcbiBEaWFsIGFyZWEtY29kZTogICAgICAgICAgICAgICAlLTEycyIsIGRpYWxsYWMgPyBkaWFsbGFjIDogIihub25lKSIpOworICAgIG4rKzsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiRGlhbCByZXN0cmljdDogIik7CisgICAgaWYgKGRpYWxyc3RyID09IDUpIHByaW50ZigiaW50ZXJuYXRpb25hbFxuIik7CisgICAgZWxzZSBpZiAoZGlhbHJzdHIgPT0gNCkgcHJpbnRmKCJsb25nLWRpc3RhbmNlXG4iKTsKKyAgICBlbHNlIGlmIChkaWFscnN0ciA9PSAyKSBwcmludGYoImxvY2FsXG4iKTsKKyAgICBlbHNlIGlmIChkaWFscnN0ciA9PSA2KSBwcmludGYoIm5vbmVcbiIpOworICAgIGVsc2UgcHJpbnRmKCI/XG4iKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiIERpYWwgbGMtYXJlYS1jb2RlczogICAgICAgICAgICIpOworICAgIGlmIChubG9jYWxhYyA9PSAwKQorICAgICAgcHJpbnRmKCIobm9uZSkiKTsKKyAgICBlbHNlCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbmxvY2FsYWM7IGkrKykKKyAgICAgICAgcHJpbnRmKCIlcyAiLCBkaWFsbGNhY1tpXSk7CisgICAgcHJpbnRmKAorIlxuIERpYWwgbGMtcHJlZml4OiAgICAgICAgICAgICAgICVzXG4iLCBkaWFsbGNwID8gZGlhbGxjcCA6ICIobm9uZSkiKTsKKyAgICBuKys7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoCisiIERpYWwgbGMtc3VmZml4OiAgICAgICAgICAgICAgICVzXG4iLCBkaWFsbGNzID8gZGlhbGxjcyA6ICIobm9uZSkiKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigKKyIgRGlhbCBsZC1wcmVmaXg6ICAgICAgICAgICAgICAgJXNcbiIsIGRpYWxsZHAgPyBkaWFsbGRwIDogIihub25lKSIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKAorIiBEaWFsIGxkLXN1ZmZpeDogICAgICAgICAgICAgICAlc1xuIiwgZGlhbGxkcyA/IGRpYWxsZHMgOiAiKG5vbmUpIik7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoCisiIERpYWwgZm9yY2UtbG9uZy1kaXN0YW5jZSAgICAgICVzXG4iLCBzaG93b2ZmKGRpYWxmbGQpKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigKKyIgRGlhbCBpbnRsLXByZWZpeDogICAgICAgICAgICAgJXNcbiIsIGRpYWxpeHAgPyBkaWFsaXhwIDogIihub25lKSIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKAorIiBEaWFsIGludGwtc3VmZml4OiAgICAgICAgICAgICAlc1xuIiwgZGlhbGl4cyA/IGRpYWxpeHMgOiAiKG5vbmUpIik7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoCisiIERpYWwgdG9sbC1mcmVlLWFyZWEtY29kZTogICAgICIpOworICAgIGlmIChudG9sbGZyZWUgPT0gMCkKKyAgICAgIHByaW50ZigiKG5vbmUpIik7CisgICAgZWxzZQorICAgICAgZm9yIChpID0gMDsgaSA8IG50b2xsZnJlZTsgaSsrKQorICAgICAgICBwcmludGYoIiVzICIsIGRpYWx0ZmNbaV0pOworICAgIHByaW50ZigiXG4iKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworCisgICAgcHJpbnRmKAorIiBEaWFsIHB1bHNlLWNvdW50cmllczogICAgICAgICAiKTsKKyAgICBpZiAobmRpYWxwdWNjID09IDApCisgICAgICBwcmludGYoIihub25lKSIpOworICAgIGVsc2UKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuZGlhbHB1Y2M7IGkrKykKKyAgICAgICAgcHJpbnRmKCIlcyAiLCBkaWFscHVjY1tpXSk7CisgICAgcHJpbnRmKCJcbiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisKKyAgICBwcmludGYoCisiIERpYWwgdG9uZS1jb3VudHJpZXM6ICAgICAgICAgICIpOworICAgIGlmIChuZGlhbHRvY2MgPT0gMCkKKyAgICAgIHByaW50ZigiKG5vbmUpIik7CisgICAgZWxzZQorICAgICAgZm9yIChpID0gMDsgaSA8IG5kaWFsdG9jYzsgaSsrKQorICAgICAgICBwcmludGYoIiVzICIsIGRpYWx0b2NjW2ldKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKworICAgIHByaW50ZigKKwkiIERpYWwgdG9sbC1mcmVlLXByZWZpeDogICAgICAgICVzXG4iLAorCWRpYWx0ZnAgPyBkaWFsdGZwIDoKKwkoZGlhbGxkcCA/IGRpYWxsZHAgOiAiKG5vbmUpIikKKwkpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgRGlhbCBwYngtZXhjaGFuZ2U6ICAgICAgICAgICAgIik7CisgICAgaWYgKG5kaWFscHh4ID09IDApCisgICAgICBwcmludGYoIihub25lKSIpOworICAgIGVsc2UKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuZGlhbHB4eDsgaSsrKQorICAgICAgICBwcmludGYoIiVzICIsIGRpYWxweHhbaV0pOworICAgIHByaW50ZigiXG4iKTsKKworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKAorIiBEaWFsIHBieC1pbnNpZGUtcHJlZml4OiAgICAgICAlc1xuIiwgZGlhbHB4aSA/IGRpYWxweGkgOiAiKG5vbmUpIik7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoCisiIERpYWwgcGJ4LW91dHNpZGUtcHJlZml4OiAgICAgICVzXG4iLCBkaWFscHhvID8gZGlhbHB4byA6ICIobm9uZSkiKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigKKyIgRGlhbCBtYWNybzogICAgICAgICAgICAgICAgICAgJXNcbiIsIGRpYWxtYWMgPyBkaWFsbWFjIDogIihub25lKSIpOworICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKy8qICBTaG93IEZpbGUgUGFyYW1ldGVycyAqLworCitzdGF0aWMgY2hhciAqCitwYXRodmFsKHgpIGludCB4OyB7CisgICAgc3dpdGNoICh4KSB7CisgICAgICBjYXNlIFBBVEhfT0ZGOiAgcmV0dXJuKCJvZmYiKTsKKyAgICAgIGNhc2UgUEFUSF9BQlM6ICByZXR1cm4oImFic29sdXRlIik7CisgICAgICBjYXNlIFBBVEhfUkVMOiAgcmV0dXJuKCJyZWxhdGl2ZSIpOworICAgICAgY2FzZSBQQVRIX0FVVE86IHJldHVybigiYXV0byIpOworICAgICAgZGVmYXVsdDogcmV0dXJuKCJ1bmtub3duIik7CisgICAgfQorfQorCitWT0lECitzaG9maWwoKSB7CisgICAgY2hhciAqczsgaW50IGkgPSAwLCBuID0gMTsKKyAgICBleHRlcm4gY2hhciAqIGlmZG5hbVtdOworI2lmZGVmIFVOSVgKKyAgICBleHRlcm4gaW50IHdpbGR4cGFuZDsKKyNlbmRpZiAvKiBVTklYICovCisgICAgZXh0ZXJuIGNoYXIgKiBzbmRfbW92ZSwgKiBzbmRfcmVuYW1lLCAqIHJjdl9tb3ZlLCAqIHJjdl9yZW5hbWU7CisjaWZkZWYgUEFUVEVSTlMKKyAgICBleHRlcm4gaW50IHBhdHRlcm5zOworI2VuZGlmIC8qIFBBVFRFUk5TICovCisgICAgZXh0ZXJuIGNoYXIgKiByZnNwZWMsICogc2ZzcGVjOworI2lmZGVmIFVOSVgKKyAgICBleHRlcm4gaW50IHpvYnVmc2l6ZSwgem9mYnVmZmVyLCB6b2ZibG9jazsKKyNlbmRpZiAvKiBVTklYICovCisjaWZkZWYgQ0tfQ1RSTFoKKyAgICBleHRlcm4gaW50IGVvZm1ldGhvZDsKKyNlbmRpZiAvKiBDS19DVFJMWiAqLworCisgICAgcHJpbnRmKCJcbiIpOworCisjaWZkZWYgVk1TCisgICAgcHJpbnRmKCIgRmlsZSByZWNvcmQtTGVuZ3RoOiAgICAgICU1ZFxuIixmcmVjbCk7CisgICAgbisrOworI2VuZGlmIC8qIFZNUyAqLworCisjaWZuZGVmIE5PWEZFUgorICAgIHByaW50ZigiIFRyYW5zZmVyIG1vZGU6ICAgICAgICAgICAlc1xuIiwKKyAgICAgICAgICAgeGZlcm1vZGUgPT0gWE1PREVfQSA/CisgICAgICAgICAgICJhdXRvbWF0aWMiIDoKKyAgICAgICAgICAgIm1hbnVhbCIKKyAgICAgICAgICAgKTsKKyAgICBuKys7CisjaWZkZWYgUEFUVEVSTlMKKyAgICBwcmludGYoIiBGaWxlIHBhdHRlcm5zOiAgICAgICAgICAgJXMiLCBzaG93b29hKHBhdHRlcm5zKSk7CisgICAgaWYgKHhmZXJtb2RlID09IFhNT0RFX00gJiYgcGF0dGVybnMpCisgICAgICBwcmludGYoIiAoYnV0IGRpc2FibGVkIGJ5IFRSQU5TRkVSLU1PREUgTUFOVUFMKSIpOworICAgIGVsc2UgaWYgKHBhdHRlcm5zKQorICAgICAgcHJpbnRmKCIgKFNIT1cgUEFUVEVSTlMgZm9yIGxpc3QpIik7CisgICAgcHJpbnRmKCJcbiIpOworICAgIG4rKzsKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworICAgIGlmIChmaWxlcGVlaykKKyAgICAgIHByaW50ZigiIEZpbGUgc2NhbjogICAgICAgICAgICAgICBvbiAlZFxuIiwgbnNjYW5maWxlKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIiBGaWxlIHNjYW46ICAgICAgICAgICAgICAgb2ZmXG4iKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIG4gPSAwOworICAgIGlmICh4ZmVybW9kZSA9PSBYTU9ERV9BKQorICAgICAgcHJpbnRmKCIgRGVmYXVsdCBmaWxlIHR5cGU6ICAgICAgICVzXG4iLHNob3htKCkpOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiIEZpbGUgdHlwZTogICAgICAgICAgICAgICAlc1xuIixzaG94bSgpKTsKKyAgICBuKys7CisgICAgaWYgKGZuY252ID09IFhZRk5fTCkKKyAgICAgIHMgPSAibGl0ZXJhbCI7CisgICAgZWxzZSBpZiAoZm5jbnYgPT0gWFlGTl9DKQorICAgICAgcyA9ICJjb252ZXJ0ZWQiOworICAgIGVsc2UKKyAgICAgIHMgPSAiKHVua25vd24pIjsKKyAgICBwcmludGYoIiBGaWxlIG5hbWVzOiAgICAgICAgICAgICAgJXNcbiIscyk7CisgICAgbisrOworICAgIHByaW50ZigiIFNlbmQgcGF0aG5hbWVzOiAgICAgICAgICAlc1xuIiwgcGF0aHZhbChmbnNwYXRoKSk7CisgICAgbisrOworICAgIHByaW50ZigiIFJlY2VpdmUgcGF0aG5hbWVzOiAgICAgICAlc1xuIiwgcGF0aHZhbChmbnJwYXRoKSk7CisgICAgbisrOworI2lmZGVmIFVOSVhPUk9TSworICAgIHByaW50ZigiIE1hdGNoIGRvdCBmaWxlczogICAgICAgICAlc1xuIiwgbWF0Y2hkb3QgPyAieWVzIiA6ICJubyIpOworICAgIG4rKzsKKyNpZmRlZiBVTklYCisgICAgcHJpbnRmKCIgV2lsZGNhcmQtZXhwYW5zaW9uOiAgICAgICVzXG4iLCB3aWxkeHBhbmQgPyAic2hlbGwiIDogImtlcm1pdCIpOworICAgIG4rKzsKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogVU5JWE9ST1NLICovCisgICAgcHJpbnRmKCIgRmlsZSBjb2xsaXNpb246ICAgICAgICAgICIpOworICAgIGZvciAoaSA9IDA7IGkgPCBuY29seDsgaSsrKQorICAgICAgaWYgKGNvbHh0YWJbaV0ua3d2YWwgPT0gZm5jYWN0KSBicmVhazsKKyAgICBwcmludGYoIiVzXG4iLCAoaSA9PSBuY29seCkgPyAidW5rbm93biIgOiBjb2x4dGFiW2ldLmt3ZCk7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoIiBGaWxlIGRlc3RpbmF0aW9uOiAgICAgICAgJXNcbiIsCisgICAgICAgICAgIChkZXN0ID09IERFU1RfRCkgPyAiZGlzayIgOgorICAgICAgICAgICAoKGRlc3QgPT0gREVTVF9TKSA/ICJzY3JlZW4iIDoKKyAgICAgICAgICAgICgoZGVzdCA9PSBERVNUX04pID8gIm5vd2hlcmUiIDoKKyAgICAgICAgICAgICJwcmludGVyIikpCisgICAgICAgICAgICk7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKyAgICBzID0gKGtlZXAgPj0gMCAmJiBrZWVwIDw9IDIpID8gaWZkbmFtW2tlZXBdIDogImtlZXAiOworICAgIHByaW50ZigiIEZpbGUgaW5jb21wbGV0ZTogICAgICAgICAlc1xuIixzKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiIEZpbGUgYnl0ZXNpemU6ICAgICAgICAgICAlZFxuIiwoZm1hc2sgPT0gMDE3NykgPyA3IDogOCk7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKyNpZm5kZWYgTk9DU0VUUworICAgIHByaW50ZigiIEZpbGUgY2hhcmFjdGVyLXNldDogICAgICAlc1xuIixmY3NpbmZvW2ZjaGFyc2V0XS5rZXl3b3JkKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiIEZpbGUgZGVmYXVsdCA3LWJpdDogICAgICAlc1xuIixmY3NpbmZvW2Rjc2V0N10ua2V5d29yZCk7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoIiBGaWxlIGRlZmF1bHQgOC1iaXQ6ICAgICAgJXNcbiIsZmNzaW5mb1tkY3NldDhdLmtleXdvcmQpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbiA9IDA7CisjaWZkZWYgVU5JQ09ERQorICAgIHByaW50ZigiIEZpbGUgVUNTIGJvbTogICAgICAgICAgICAlc1xuIixzaG93b2ZmKHVjc2JvbSkpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgRmlsZSBVQ1MgYnl0ZS1vcmRlcjogICAgICVzLWVuZGlhblxuIiwKKyAgICAgICAgICAgdWNzb3JkZXIgPyAibGl0dGxlIiA6ICJiaWciKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiIENvbXB1dGVyIGJ5dGVvcmRlcjogICAgICAlcy1lbmRpYW5cbiIsCisgICAgICAgICAgIGJ5dGVvcmRlciA/ICJsaXR0bGUiIDogImJpZyIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogVU5JQ09ERSAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworICAgIHByaW50ZigiIEZpbGUgZW5kLW9mLWxpbmU6ICAgICAgICAiKTsKKyAgICBpID0gZmVvbDsKKyAgICBzd2l0Y2ggKGZlb2wpIHsKKyAgICAgIGNhc2UgWFlGQV9DOiBwcmludGYoIiVzXG4iLCJjciIpOyBicmVhazsKKyAgICAgIGNhc2UgWFlGQV9MOiBwcmludGYoIiVzXG4iLCJsZiIpOyBicmVhazsKKyAgICAgIGNhc2UgWFlGQV8yOiBwcmludGYoIiVzXG4iLCJjcmxmIik7IGJyZWFrOworICAgICAgZGVmYXVsdDogcHJpbnRmKCIlZFxuIixpKTsKKyAgICB9CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIENLX0NUUkxaCisgICAgcHJpbnRmKCIgRmlsZSBlb2Y6ICAgICAgICAgICAgICAgICVzXG4iLCBlb2ZtZXRob2QgPyAiY3RybC16IiA6ICJsZW5ndGgiKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIENLX0NUUkxaICovCisjaWZuZGVmIE5PWEZFUgorI2lmZGVmIENLX1RNUERJUgorICAgIHByaW50ZigiIEZpbGUgZG93bmxvYWQtZGlyZWN0b3J5OiAlc1xuIiwgZGxkaXIgPyBkbGRpciA6ICIobm9uZSkiKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIG4gPSAwOworI2lmZGVmIENPTU1FTlQKKyAgICBpID0gMjU2OworICAgIHMgPSBsaW5lOworICAgIHp6c3RyaW5nKCJcXHYodG1wZGlyKSIsJnMsJmkpOworICAgIHByaW50ZigiIFRlbXBvcmFyeSBkaXJlY3Rvcnk6ICAgICAlc1xuIiwgbGluZSk7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogQ0tfVE1QRElSICovCisjaWZkZWYgVk1TCisgICAgeworICAgICAgICBleHRlcm4gaW50IHZtc3N2ZXJzaW9ucywgdm1zcnZlcnNpb25zOworICAgICAgICBwcmludGYoIiBTZW5kIHZlcnNpb24tbnVtYmVyczogICAgJXNcbiIsc2hvd29mZih2bXNzdmVyc2lvbnMpKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKyAgICAgICAgcHJpbnRmKCIgUmVjZWl2ZSB2ZXJzaW9uLW51bWJlcnM6ICVzXG4iLHNob3dvZmYodm1zcnZlcnNpb25zKSk7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbiA9IDA7CisgICAgfQorI2VuZGlmIC8qIFZNUyAqLworICAgIHByaW50ZigiIFNlbmQgbW92ZS10bzogICAgICAgICAgICAlc1xuIiwKKyAgICAgICAgICAgc25kX21vdmUgPyBzbmRfbW92ZSA6ICIobm9uZSkiKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiIFNlbmQgcmVuYW1lLXRvOiAgICAgICAgICAlc1xuIiwKKyAgICAgICAgICAgc25kX3JlbmFtZSA/IHNuZF9yZW5hbWUgOiAiKG5vbmUpIik7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoIiBSZWNlaXZlIG1vdmUtdG86ICAgICAgICAgJXNcbiIsCisgICAgICAgICAgIHJjdl9tb3ZlID8gcmN2X21vdmUgOiAiKG5vbmUpIik7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoIiBSZWNlaXZlIHJlbmFtZS10bzogICAgICAgJXNcbiIsCisgICAgICAgICAgIHJjdl9yZW5hbWUgPyByY3ZfcmVuYW1lIDogIihub25lKSIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogTk9YRkVSICovCisjaWZkZWYgS0VSTVJDCisgICAgcHJpbnRmKCIgSW5pdGlhbGl6YXRpb24gZmlsZTogICAgICVzXG4iLCBub2luaXQgPyAiKG5vbmUpIiA6CisjaWZkZWYgQ0tfU1lTSU5JCisgICAgICAgICAgIENLX1NZU0lOSQorI2Vsc2UKKyAgICAgICAgICAga2VybXJjCisjZW5kaWYgLyogQ0tfU1lTSU5JICovCisgICAgICAgICAgICk7CisjZW5kaWYgLyogS0VSTVJDICovCisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKworICAgIGlmIChrX2luZm9fZGlyKSB7CisgICAgICAgIHByaW50ZigiIEtlcm1pdCBkb2MgZmlsZXM6ICAgICAgICAlc1xuIiwga19pbmZvX2Rpcik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbiA9IDA7CisgICAgfQorCisjaWZkZWYgQ0tST09UCisgICAgcyA9IHpnZXRyb290KCk7CisgICAgcHJpbnRmKCIgUm9vdCBzZXQ6ICAgICAgICAgICAgICAgICVzXG4iLCBzID8gcyA6ICIobm9uZSkiKTsKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworI2lmZGVmIFVOSVgKKyAgICBwcmludGYoIiBEaXNrIG91dHB1dCBidWZmZXI6ICAgICAgJWQgKHdyaXRlcyBhcmUgJXMsICVzKVxuIiwKKyAgICAgICAgICAgem9idWZzaXplLAorICAgICAgICAgICB6b2ZidWZmZXIgPyAiYnVmZmVyZWQiIDogInVuYnVmZmVyZWQiLAorICAgICAgICAgICB6b2ZibG9jayA/ICJibG9ja2luZyIgOiAibm9uYmxvY2tpbmciCisgICAgICAgICAgICk7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKyNpZmRlZiBEWU5BTUlDCisgICAgcHJpbnRmKCIgU3RyaW5nc3BhY2U6ICAgICAgICAgICAgICVkXG4iLCB6c2V0ZmlsKDAsMikpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgTGlzdHNpemU6ICAgICAgICAgICAgICAgICVkXG4iLCB6c2V0ZmlsKDAsNCkpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogRFlOQU1JQyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBPUzJPUlVOSVgKKyAgICBwcmludGYoIiBMb25nZXN0IGZpbGVuYW1lOiAgICAgICAgJWRcbiIsIG1heG5hbSk7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoIiBMb25nZXN0IHBhdGhuYW1lOiAgICAgICAgJWRcbiIsIG1heHBhdGgpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogT1MyT1JVTklYICovCisKKyAgICBwcmludGYoIiBMYXN0IGZpbGUgc2VudDogICAgICAgICAgJXNcbiIsIHNmc3BlYyA/IHNmc3BlYyA6ICIobm9uZSkiKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiIExhc3QgZmlsZSByZWNlaXZlZDogICAgICAlc1xuIiwgcmZzcGVjID8gcmZzcGVjIDogIihub25lKSIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCJcbiBBbHNvIHNlZTpcbiIpOworICAgIG4rKzsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiIFNIT1cgUFJPVE9DT0wsIFNIT1cgWEZFUiIpOworI2lmZGVmIENLX0xBQkVMRUQKKyAgICBwcmludGYoIiwgU0hPVyBMQUJFTEVEIik7CisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworI2lmZGVmIFBBVFRFUk5TCisgICAgcHJpbnRmKCIsIFNIT1cgUEFUVEVSTlMiKTsKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworI2lmZGVmIFNUUkVBTUlORworICAgIHByaW50ZigiLCBTSE9XIFNUUkVBTUlORyIpOworI2VuZGlmIC8qIFNUUkVBTUlORyAqLworI2lmbmRlZiBOT0NTRVRTCisgICAgcHJpbnRmKCIsIFNIT1cgQ0hBUkFDVEVSLVNFVFMiKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgcHJpbnRmKCJcblxuIik7Cit9CisKKyNpZm5kZWYgTk9YRkVSCitWT0lECitzaG9wYXJwKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvdG9jb2wgKi8KKyAgICBleHRlcm4gaW50IGRvY3JjLCBza2lwYnVwOworICAgIGNoYXIgKnM7CisKKyNpZmRlZiBDS19USU1FUlMKKyAgICBleHRlcm4gaW50IHJ0dGZsZzsKKyNlbmRpZiAvKiBDS19USU1FUlMgKi8KKworICAgIHByaW50ZigiUHJvdG9jb2w6ICVzXG4iLHB0YWJbcHJvdG9jb2xdLnBfbmFtZSk7CisKKyAgICBpZiAocHJvdG9jb2wgPT0gUFJPVE9fSykgeworICAgICAgICBwcmludGYoIlxuUHJvdG9jb2wgUGFyYW1ldGVyczogICBTZW5kICAgIFJlY2VpdmUiKTsKKyAgICAgICAgaWYgKHRpbWVmKQorICAgICAgICAgIHByaW50ZigiXG4gVGltZW91dCAodXNlZD0lMmQpOiU3ZColOGQgIiwgdGltaW50LCBydGltbywgcGt0dGltKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZigiXG4gVGltZW91dCAodXNlZD0lMmQpOiU3ZCU5ZCAiLCAgdGltaW50LCBydGltbywgcGt0dGltKTsKKyNpZmRlZiBYRlJDQU4KKyAgICAgICAgcHJpbnRmKCIgICAgICAgQ2FuY2VsbGF0aW9uOiAgICAlcyIsc2hvd29mZih4ZnJjYW4pKTsKKyAgICAgICAgaWYgKHhmcmNhbikKKyAgICAgICAgICBwcmludGYoIiAlZCAlZCIsIHhmcmNociwgeGZybnVtKTsKKyNlbmRpZiAvKiBYRlJDQU4gKi8KKyAgICAgICAgcHJpbnRmKCJcbiBQYWRkaW5nOiAgICAgICUxMWQlOWQiLCBucGFkLCAgIG15cGFkbik7CisgICAgICAgIGlmIChiY3RyID09IDQpCisgICAgICAgICAgcHJpbnRmKCIgICAgICAgIEJsb2NrIENoZWNrOiBibGFuay1mcmVlLTJcbiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCIgICAgICAgIEJsb2NrIENoZWNrOiAlNmRcbiIsYmN0cik7CisgICAgICAgIHByaW50ZiggICIgUGFkIENoYXJhY3RlcjolMTFkJTlkIiwgcGFkY2gsICBteXBhZGMpOworICAgICAgICBwcmludGYoIiAgICAgICAgRGVsYXk6ICAgICAgICU2ZFxuIixja2RlbGF5KTsKKyAgICAgICAgcHJpbnRmKCAgIiBQYXVzZTogICAgICAgICUxMWQlOWQiLCBwa3RwYXVzLCBwa3RwYXVzKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgIEF0dHJpYnV0ZXM6ICAgICAgJXNcbiIsc2hvd29mZihhdGNhcHIpKTsKKyAgICAgICAgcHJpbnRmKCAgIiBQYWNrZXQgU3RhcnQ6ICUxMWQlOWQiLCBteXN0Y2gsIHN0Y2hyKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgIE1heCBSZXRyaWVzOiAlNmQlc1xuIiwKKyAgICAgICAgICAgICAgIG1heHRyeSwKKyAgICAgICAgICAgICAgIChtYXh0cnkgPT0gMCkgPyAiICh1bmxpbWl0ZWQpIiA6ICIiCisgICAgICAgICAgICAgICApOworICAgICAgICBwcmludGYoICAiIFBhY2tldCBFbmQ6ICAgJTExZCU5ZCIsIHNlb2wsICAgZW9sKTsKKyAgICAgICAgaWYgKGVicWZsZykKKyAgICAgICAgICBwcmludGYoIiAgICAgICAgOHRoLUJpdCBQcmVmaXg6ICclYyciLGVicSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoIiAgICAgICAgOHRoLUJpdCBQcmVmaXg6ICgnJWMnIGJ1dCBub3QgdXNlZCkiLGVicSk7CisgICAgICAgIHByaW50ZiggICJcbiBQYWNrZXQgTGVuZ3RoOiUxMWQgIiwgc3BtYXgpOworICAgICAgICBwcmludGYoIiU4ZCAgICAgIiwgIHVycHNpeik7CisgICAgICAgIGlmIChycHRmbGcpCisgICAgICAgICAgcHJpbnRmKCIgICBSZXBlYXQgUHJlZml4OiAgJyVjJyIscnB0cSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoIiAgIFJlcGVhdCBQcmVmaXg6ICAoJyVjJyBidXQgbm90IHVzZWQpIixycHRxKTsKKyAgICAgICAgcHJpbnRmKCAgIlxuIE1heGltdW0gTGVuZ3RoOiAlOWQlOWQiLCBtYXhzcHMsIG1heHJwcyk7CisgICAgICAgIHByaW50ZigiICAgICAgICBXaW5kb3cgU2l6ZTolN2Qgc2V0LCAlZCB1c2VkXG4iLHdzbG90cix3bWF4KTsKKyAgICAgICAgcHJpbnRmKCAgICAiIEJ1ZmZlciBTaXplOiAgJTExZCU5ZCIsIGJpZ3Nic2l6LCBiaWdyYnNpeik7CisgICAgICAgIHByaW50ZigiICAgICAgICBMb2NraW5nLVNoaWZ0OiAgICAiKTsKKyAgICAgICAgaWYgKGxzY2FwdSA9PSAyKSB7CisgICAgICAgICAgICBwcmludGYoImZvcmNlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlcyIsIChsc2NhcHIgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSk7CisgICAgICAgICAgICBpZiAobHNjYXByKSBwcmludGYoIiwlcyVzIiwgKGxzY2FwdSA/ICIgIiA6ICIgbm90ICIpLCAidXNlZCIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXG5cbiIpOworCisgICAgICAgIGlmICghKHMgPSBwdGFiW3Byb3RvY29sXS5oX2JfaW5pdCkpIHMgPSAiIjsKKyAgICAgICAgcHJpbnRmKCIgQXV0by11cGxvYWQgY29tbWFuZCAoYmluYXJ5KTogIik7CisgICAgICAgIGlmICgqcykgeworICAgICAgICAgICAgc2hvc3RyZGVmKChDSEFSICopcyk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIihub25lKVxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEocyA9IHB0YWJbcHJvdG9jb2xdLmhfdF9pbml0KSkgcyA9ICIiOworICAgICAgICBwcmludGYoIiBBdXRvLXVwbG9hZCBjb21tYW5kICh0ZXh0KTogICAiKTsKKyAgICAgICAgaWYgKCpzKSB7CisgICAgICAgICAgICBzaG9zdHJkZWYoKENIQVIgKilzKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiKG5vbmUpXG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShzID0gcHRhYltwcm90b2NvbF0uaF94X2luaXQpKSBzID0gIiI7CisgICAgICAgIHByaW50ZigiIEF1dG8tc2VydmVyIGNvbW1hbmQ6ICAgICAgICAgICIpOworICAgICAgICBpZiAoKnMpIHsKKyAgICAgICAgICAgIHNob3N0cmRlZigoQ0hBUiAqKXMpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIobm9uZSlcbiIpOworICAgICAgICB9CisgICAgICAgIHRtcGJ1ZlswXSA9IE5VTDsKKyNpZmRlZiBDS19USU1FUlMKKyAgICAgICAgaWYgKHJ0dGZsZykgeworICAgICAgICAgICAgZXh0ZXJuIGludCBtaW50aW1lLCBtYXh0aW1lOworICAgICAgICAgICAgc3ByaW50Zih0bXBidWYsIiBQYWNrZXQgdGltZW91dHM6IGR5bmFtaWMgJWQ6JWQiLCAvKiBTQUZFICovCisgICAgICAgICAgICAgICAgICAgIG1pbnRpbWUsCisgICAgICAgICAgICAgICAgICAgIG1heHRpbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3ByaW50Zih0bXBidWYsIiBQYWNrZXQgdGltZW91dHM6IGZpeGVkIik7IC8qIFNBRkUgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIENLX1RJTUVSUyAqLworICAgICAgICBpZiAodG1wYnVmWzBdKQorICAgICAgICAgIHByaW50ZigiJS0zMXMiLHRtcGJ1Zik7CisgICAgICAgIHByaW50ZigiU2VuZCBiYWNrdXA6ICVzXG4iLHNob3dvZmYoIXNraXBidXApKTsKKworICAgICAgICBwcmludGYoIiBUcmFuc2ZlciBtb2RlOiAgICVzIiwgeGZlcm1vZGUgPT0gWE1PREVfQSA/CisgICAgICAgICAgICAgICAiYXV0b21hdGljICAgIiA6CisgICAgICAgICAgICAgICAibWFudWFsICAgICAgIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcHJpbnRmKCIgVHJhbnNmZXIgc2xvdy1zdGFydDogJXMsIGNyYzogJXNcbiIsCisgICAgICAgICAgICAgICBzaG93b2ZmKHNsb3N0YXJ0KSwKKyAgICAgICAgICAgICAgIHNob3dvZmYoZG9jcmMpCisgICAgICAgICAgICAgICApOworI2lmZGVmIFBJUEVTRU5ECisgICAgICAgIHsKKyAgICAgICAgICAgIGV4dGVybiBpbnQgdXNlcGlwZXM7CisgICAgICAgICAgICBwcmludGYoIiBUcmFuc2ZlciBwaXBlczogICVzICAgICAgICAgIix1c2VwaXBlcyA/ICJvbiAiIDogIm9mZiIpOworICAgICAgICB9CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyNpZm5kZWYgTk9DU0VUUworICAgICAgICBwcmludGYoIiBUcmFuc2ZlciBjaGFyYWN0ZXItc2V0OiAiKTsKKyAgICAgICAgaWYgKHRjaGFyc2V0ID09IFRDX1RSQU5TUCkKKyAgICAgICAgICBwcmludGYoInRyYW5zcGFyZW50XG4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZigiJXNcbiIsIHRjc2luZm9bdGNoYXJzZXRdLmtleXdvcmQgKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisjaWZkZWYgUElQRVNFTkQKKyAgICAgICAgeworICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBzbmRmaWx0ZXIsICogcmN2ZmlsdGVyOworICAgICAgICAgICAgcHJpbnRmKCIgU2VuZCBmaWx0ZXI6ICAgICAlc1xuIiwgc25kZmlsdGVyID8gc25kZmlsdGVyIDogIihub25lKSIpOworICAgICAgICAgICAgcHJpbnRmKCIgUmVjZWl2ZSBmaWx0ZXI6ICAlc1xuIiwgcmN2ZmlsdGVyID8gcmN2ZmlsdGVyIDogIihub25lKSIpOworICAgICAgICB9CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyAgICAgICAgcHJpbnRmKCJcbkFsc28gc2VlOlxuIik7CisgICAgICAgIHByaW50ZigiIFNIT1cgRklMRSwgU0hPVyBYRkVSIik7CisKKyNpZmRlZiBDS19MQUJFTEVECisgICAgICAgIHByaW50ZigiLCBTSE9XIExBQkVMRUQiKTsKKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisjaWZkZWYgUEFUVEVSTlMKKyAgICAgICAgcHJpbnRmKCIsIFNIT1cgUEFUVEVSTlMiKTsKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworI2lmZGVmIFNUUkVBTUlORworICAgICAgICBwcmludGYoIiwgU0hPVyBTVFJFQU1JTkciKTsKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKyNpZm5kZWYgTk9DU0VUUworICAgICAgICBwcmludGYoIiwgU0hPVyBDSEFSQUNURVItU0VUUyIpOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICB9CisKKyNpZmRlZiBDS19YWVoKKyNpZmRlZiBYWVpfSU5URVJOQUwKKyAgICBpZiAocHJvdG9jb2wgIT0gUFJPVE9fSykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IHg7CisgICAgICAgIHByaW50ZigiIEZpbGUgdHlwZTogJXNcbiIsIGJpbmFyeSA/ICJiaW5hcnkiIDogInRleHQiKTsKKyAgICAgICAgaWYgKHByb3RvY29sID09IFBST1RPX1opIHsgICAgICAgICAgICAgIC8qIFptb2RlbSAqLworICAgICAgICAgICAgcHJpbnRmKCIgV2luZG93IHNpemU6ICAgIik7CisgICAgICAgICAgICBpZiAocHRhYltwcm90b2NvbF0ud2luc2l6ZSA8IDEpCisgICAgICAgICAgICAgIHByaW50Zigibm9uZVxuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ZigiJWRcbiIsd3Nsb3RyKTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICBwcmludGYoIiBQYWNrZXQgKGZyYW1lKSBsZW5ndGg6ICIpOworICAgICAgICAgICAgaWYgKHB0YWJbcHJvdG9jb2xdLnNwa3RsZW4gPCAwKQorICAgICAgICAgICAgICBwcmludGYoIm5vbmVcbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwcmludGYoIiVkXG4iLHNwbWF4KTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocHRhYltwcm90b2NvbF0uc3BrdGxlbiA+PSAxMDAwKQorICAgICAgICAgICAgICBwcmludGYoIiAxSyBwYWNrZXRzXG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCIgMTI4LWJ5dGUgcGFja2V0c1xuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCIgUGF0aG5hbWUgc3RyaXBwaW5nIHdoZW4gc2VuZGluZzogICAlc1xuIiwKKyAgICAgICAgICAgICAgIHNob3dvZmYocHRhYltwcm90b2NvbF0uZm5zcCkKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIHByaW50ZigiIFBhdGhuYW1lIHN0cmlwcGluZyB3aGVuIHJlY2VpdmluZzogJXNcbiIsCisgICAgICAgICAgICAgICBzaG93b2ZmKHB0YWJbcHJvdG9jb2xdLmZucnApCisgICAgICAgICAgICAgICApOworICAgICAgICBwcmludGYoIiBGaWxlbmFtZSBjb2xsaXNpb24gYWN0aW9uOiAgICAgICAgICIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmNvbHg7IGkrKykKKyAgICAgICAgICBpZiAoY29seHRhYltpXS5rd3ZhbCA9PSBmbmNhY3QpIGJyZWFrOworICAgICAgICBwcmludGYoIiUtMTJzIiwgKGkgPT0gbmNvbHgpID8gInVua25vd24iIDogY29seHRhYltpXS5rd2QpOworCisgICAgICAgIHByaW50ZigiXG4gRXNjYXBlIGNvbnRyb2wgY2hhcmFjdGVyczogICAgICAgICAgIik7CisgICAgICAgIHggPSBwdGFiW3Byb3RvY29sXS5wcmVmaXg7CisgICAgICAgIGlmICh4ID09IFBYX0FMTCkKKyAgICAgICAgICBwcmludGYoImFsbFxuIik7CisgICAgICAgIGVsc2UgaWYgKHggPT0gUFhfQ0FVIHx8IHg9PVBYX1dJTCkKKyAgICAgICAgICBwcmludGYoIm1pbmltYWxcbiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCJub25lXG4iKTsKKyAgICAgICAgaWYgKCEocyA9IHB0YWJbcHJvdG9jb2xdLmhfYl9pbml0KSkKKyAgICAgICAgICBzID0gIiI7CisgICAgICAgIHByaW50ZigiIEF1dG9yZWNlaXZlIGNvbW1hbmQgKGJpbmFyeSk6ICVzXG4iLCAqcyA/IHMgOiAiKG5vbmUpIik7CisgICAgICAgIGlmICghKHMgPSBwdGFiW3Byb3RvY29sXS5oX3RfaW5pdCkpCisgICAgICAgICAgcyA9ICIiOworICAgICAgICBwcmludGYoIiBBdXRvcmVjZWl2ZSBjb21tYW5kICh0ZXh0KTogICAlc1xuIiwgKnMgPyBzIDogIihub25lKSIpOworICAgIH0KKyNlbHNlCisgICAgaWYgKHByb3RvY29sICE9IFBST1RPX0spIHsKKyAgICAgICAgcHJpbnRmKCJcbkV4ZWN1dGVkIGJ5IGV4dGVybmFsIGNvbW1hbmRzOlxuXG4iKTsKKyAgICAgICAgcyA9IHB0YWJbcHJvdG9jb2xdLnBfYl9zY21kOworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgcHJpbnRmKCIgU0VORCBjb21tYW5kIChiaW5hcnkpOiAgICAgICAgJXNcbiIsICpzID8gcyA6ICIobm9uZSkiKTsKKyAgICAgICAgcyA9IHB0YWJbcHJvdG9jb2xdLnBfdF9zY21kOworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgcHJpbnRmKCIgU0VORCBjb21tYW5kICh0ZXh0KTogICAgICAgICAgJXNcbiIsICpzID8gcyA6ICIobm9uZSkiKTsKKyAgICAgICAgcyA9IHB0YWJbcHJvdG9jb2xdLnBfYl9yY21kOworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgcHJpbnRmKCIgUkVDRUlWRSBjb21tYW5kIChiaW5hcnkpOiAgICAgJXNcbiIsICpzID8gcyA6ICIobm9uZSkiKTsKKyAgICAgICAgcyA9IHB0YWJbcHJvdG9jb2xdLnBfdF9yY21kOworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgcHJpbnRmKCIgUkVDRUlWRSBjb21tYW5kICh0ZXh0KTogICAgICAgJXNcbiIsICpzID8gcyA6ICIobm9uZSkiKTsKKyAgICAgICAgcyA9IHB0YWJbcHJvdG9jb2xdLmhfYl9pbml0OworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgcHJpbnRmKCIgQXV0b3JlY2VpdmUgY29tbWFuZCAoYmluYXJ5KTogJXNcbiIsICpzID8gcyA6ICIobm9uZSkiKTsKKyAgICAgICAgcyA9IHB0YWJbcHJvdG9jb2xdLmhfdF9pbml0OworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgcHJpbnRmKCIgQXV0b3JlY2VpdmUgY29tbWFuZCAodGV4dCk6ICAgJXNcbiIsICpzID8gcyA6ICIobm9uZSkiKTsKKyAgICB9CisjZW5kaWYgLyogWFlaX0lOVEVSTkFMICovCisjZW5kaWYgLyogQ0tfWFlaICovCit9CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9DU0VUUworLyogQ2hhcmFjdGVyLXNldCBpdGVtcyAqLworCitleHRlcm4gaW50IHNfY3NldCwgcl9jc2V0LCBheGNzZXRbXSwgYWZjc2V0W107CitleHRlcm4gc3RydWN0IGtleXRhYiB4ZnJtdGFiW107CisKK1ZPSUQKK3Nob3BhcmwoKSB7CisjaWZkZWYgQ09NTUVOVAorICAgIGludCBpOworLyogTWlzbGVhZGluZy4uLiAqLworICAgIHByaW50ZigiXG5BdmFpbGFibGUgTGFuZ3VhZ2VzOlxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWExBTkc7IGkrKykgeworICAgICAgICBwcmludGYoIiAlc1xuIixsYW5nc1tpXS5kZXNjcmlwdGlvbik7CisgICAgfQorI2Vsc2UKKyAgICBwcmludGYoIlxuTGFuZ3VhZ2Utc3BlY2lmaWMgdHJhbnNsYXRpb24gcnVsZXM6ICVzXG4iLAorICAgICAgICAgICBsYW5ndWFnZSA9PSBMX1VTQVNDSUkgPyAibm9uZSIgOiBsYW5nc1tsYW5ndWFnZV0uZGVzY3JpcHRpb24pOworICAgIHNob2NoYXJzZXQoKTsKKyAgICBwcmludGYoIlxuXG4iKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCit9CisKK1ZPSUQKK3Nob2NoYXJzZXQoKSB7CisgICAgaW50IHg7CisjaWZkZWYgQ09NTUVOVAorICAgIGNoYXIgKiBzID0gIlVua25vd24iOworICAgIGV4dGVybiBpbnQgeGxhdHlwZTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgZXh0ZXJuIGludCB4ZnJ4bGE7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyAgICBkZWJ1ZyhGMTAxLCJTSE9XIEZJTEUgQ0hBUiIsIiIsZmNoYXJzZXQpOworICAgIHByaW50ZigiXG4iKTsKKyNpZm5kZWYgTk9YRkVSCisgICAgcHJpbnRmKCIgVHJhbnNmZXIgVHJhbnNsYXRpb246ICVzXG4iLCBzaG93b2ZmKHhmcnhsYSkpOworICAgIGlmICgheGZyeGxhKSB7CisgICAgICAgIHByaW50ZigKKyAgICAgICIgQmVjYXVzZSB0cmFuc2ZlciB0cmFuc2xhdGlvbiBpcyBvZmYsIHRoZSBmb2xsb3dpbmcgYXJlIGlnbm9yZWQ6XG5cbiIpOworICAgIH0KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICBwcmludGYoIiBGaWxlIENoYXJhY3Rlci1TZXQ6ICVzICglcyksICIsCisgICAgICAgICAgIGZjc2luZm9bZmNoYXJzZXRdLmtleXdvcmQsCisgICAgICAgICAgIGZjc2luZm9bZmNoYXJzZXRdLm5hbWUKKyAgICAgICAgICAgKTsKKyAgICBpZiAoKHggPSBmY3NpbmZvW2ZjaGFyc2V0XS5zaXplKSA9PSAxMjgpCisgICAgICBwcmludGYoIjctYml0Iik7CisgICAgZWxzZSBpZiAoeCA9PSAyNTYpCisgICAgICBwcmludGYoIjgtYml0Iik7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJtdWx0aWJ5dGUiKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCIgRmlsZSBTY2FuOiAlc1xuIixzaG93b2ZmKGZpbGVwZWVrKSk7CisgICAgcHJpbnRmKCIgICBEZWZhdWx0IDdiaXQtQ2hhcmFjdGVyLVNldDogJXNcbiIsZmNzaW5mb1tkY3NldDddLmtleXdvcmQpOworICAgIHByaW50ZigiICAgRGVmYXVsdCA4Yml0LUNoYXJhY3Rlci1TZXQ6ICVzXG4iLGZjc2luZm9bZGNzZXQ4XS5rZXl3b3JkKTsKKyAgICBwcmludGYoIiBUcmFuc2ZlciBDaGFyYWN0ZXItU2V0Iik7CisjaWZkZWYgQ09NTUVOVAorICAgIGlmICh0c2xldmVsID09IFRTX0wyKQorICAgICAgcHJpbnRmKCI6IChpbnRlcm5hdGlvbmFsKSIpOworICAgIGVsc2UKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgaWYgKHRjaGFyc2V0ID09IFRDX1RSQU5TUCkKKyAgICAgIHByaW50ZigiOiBUcmFuc3BhcmVudCIpOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiOiAlcyAoJXMpIix0Y3NpbmZvW3RjaGFyc2V0XS5rZXl3b3JkLCB0Y3NpbmZvW3RjaGFyc2V0XS5uYW1lKTsKKyAgICBwcmludGYoIlxuIik7CisjaWZkZWYgQ09NTUVOVAorICAgIHN3aXRjaCAoeGxhdHlwZSkgeworICAgICAgY2FzZSBYTEFfTk9ORTogcyA9ICJOb25lIjsgYnJlYWs7CisgICAgICBjYXNlIFhMQV9CWVRFOiBzID0gIkJ5dGUiOyBicmVhazsKKyAgICAgIGNhc2UgWExBX0pBUEFOOiBzID0gIkphcGFuZXNlIjsgYnJlYWs7CisgICAgICBjYXNlIFhMQV9VTklDT0RFOiBzID0gIlVuaWNvZGUiOyBicmVhazsKKyAgICB9CisgICAgcHJpbnRmKCJcbiBUcmFuc2xhdGlvbiB0eXBlOiAlc1xuIixzKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgcHJpbnRmKCIgU0VORCBjaGFyYWN0ZXItc2V0LXNlbGVjdGlvbjogJXNcbiIseGZybXRhYltzX2NzZXRdLmt3ZCk7CisgICAgcHJpbnRmKCIgUkVDRUlWRSBjaGFyYWN0ZXItc2V0LXNlbGVjdGlvbjogJXNcbiIseGZybXRhYltyX2NzZXRdLmt3ZCk7CisgICAgaWYgKHNfY3NldCA9PSBYTU9ERV9BIHx8IHJfY3NldCA9PSBYTU9ERV9BKQorICAgICAgcHJpbnRmKAorICAgICAgIiAoVXNlIFNIT1cgQVNTT0NJQVRJT05TIHRvIGxpc3QgYXV0b21hdGljIGNoYXJhY3Rlci1zZXQgc2VsZWN0aW9ucy4pXG4iCisgICAgICAgICAgICAgKTsKK30KKworVk9JRAorc2hvd2Fzc29jKCkgeworICAgIGludCBpLCBrLCBuID0gNDsKKyAgICBjaGFyICogczsKKyAgICBwcmludGYoIlxuRm9yIGluY29taW5nIGZpbGVzOlxuXG4iKTsKKyAgICBwcmludGYoIlRyYW5zZmVyIENoYXJhY3Rlci1TZXQgICBGaWxlIENoYXJhY3Rlci1TZXRcbiIpOworICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYVENTRVRTOyBpKyspIHsKKyAgICAgICAgayA9IGF4Y3NldFtpXTsKKyAgICAgICAgaWYgKGsgPCAwIHx8IGsgPiBNQVhGQ1NFVFMpCisgICAgICAgICAgcyA9ICIobm9uZSkiOworICAgICAgICBlbHNlCisgICAgICAgICAgcyA9IGZjc2luZm9ba10ua2V5d29yZDsKKyAgICAgICAgaWYgKCFzKSBzID0gIiI7CisgICAgICAgIGlmICghKnMpIHMgPSAiKG5vbmUpIjsKKyAgICAgICAgcHJpbnRmKCIgJS0yNXMlc1xuIix0Y3NpbmZvW2ldLmtleXdvcmQscyk7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbiA9IDA7CisgICAgfQorICAgIHByaW50ZigiXG5Gb3Igb3V0Ym91bmQgZmlsZXM6XG5cbiIpOworICAgIG4gKz0gMjsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiRmlsZSBDaGFyYWN0ZXItU2V0ICAgICAgIFRyYW5zZmVyIENoYXJhY3Rlci1TZXRcbiIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbiA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8PSBNQVhGQ1NFVFM7IGkrKykgeworICAgICAgICBrID0gYWZjc2V0W2ldOworICAgICAgICBpZiAoayA8IDAgfHwgayA+IE1BWFRDU0VUUykKKyAgICAgICAgICBzID0gIihub25lKSI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzID0gdGNzaW5mb1trXS5rZXl3b3JkOworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgaWYgKCEqcykgcyA9ICIobm9uZSkiOworICAgICAgICBwcmludGYoIiAlLTI1cyVzXG4iLGZjc2luZm9baV0ua2V5d29yZCxzKTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBuID0gMDsKKyAgICB9Cit9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCitWT0lECitzaG9wYXIoKSB7CisgICAgcHJpbnRmKCJTaG93IHdoYXQ/ICAoVHlwZSBcInNob3cgP1wiIGZvciBhIGxpc3Qgb2YgcG9zc2liaWxpdGllcy4pXG4iKTsKK30KKyNlbmRpZiAvKiBOT1NIT1cgKi8KKworI2lmbmRlZiBOT1hGRVIKKy8qICBEIE8gUyBUIEEgVCAgLS0gIERpc3BsYXkgZmlsZSB0cmFuc2ZlciBzdGF0aXN0aWNzLiAgKi8KKworaW50Citkb3N0YXQoYnJpZWYpIGludCBicmllZjsgeworICAgIGV4dGVybiBsb25nIGZpbHJlaiwgcGVha2NwczsKKyAgICBleHRlcm4gaW50IGxhc3RzcG1heCwgc3RyZWFtZWQsIGNsZWFyZWQsIHN0cmVhbW9rOworICAgIGV4dGVybiBjaGFyIHdob2FyZXVbXTsKKyAgICBpbnQgbiA9IDAsIGZ0cCA9IDA7CisgICAgZXh0ZXJuIGludCBkb2NyYywgaW50ZXJydXB0ZWQsIGZhdGFsaW87CisKKyAgICBmdHAgPSBsYXN0eGZlciAmIFdfRlRQOworCisjaWZkZWYgQ0tfVFRHV1NJWgorI2lmZGVmIE9TMgorICAgIGlmICh0dF9jb2xzW1ZURVJNXSA8IDAgfHwgdHRfcm93c1tWVEVSTV0gPCAwKQorICAgICAgdHRnd3NpeigpOworI2Vsc2UgLyogT1MyICovCisgICAgaWYgKHR0Z3dzaXooKSA+IDApIHsKKyAgICAgICAgaWYgKHR0X3Jvd3MgPiAwICYmIHR0X2NvbHMgPiAwKSB7CisgICAgICAgICAgICBjbWRfcm93cyA9IHR0X3Jvd3M7CisgICAgICAgICAgICBjbWRfY29scyA9IHR0X2NvbHM7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworCisgICAgZGVidWcoRjEwMSwiZG9zdGF0IHhmZXJzdGF0IiwiIix4ZmVyc3RhdCk7CisgICAgaWYgKHhmZXJzdGF0IDwgMCkgeworICAgICAgICBwcmludGYoIiBObyBmaWxlIHRyYW5zZmVycyB5ZXQuXG4iKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKyAgICBuID0gMDsKKyAgICBpZiAoYnJpZWYpIHsgcHJpbnRmKCJcbiIpOyBuKys7IH07CisgICAgcHJpbnRmKCIgcHJvdG9jb2wgICAgICAgICAgICAgICA6ICVzXG4iLAorICAgICAgICAgICBmdHAgPyAiZnRwIiA6IHB0YWJbcHJvdG9jb2xdLnBfbmFtZSk7CisgICAgbisrOworICAgIHByaW50ZigiIHN0YXR1cyAgICAgICAgICAgICAgICAgOiAiKTsKKyAgICBpZiAoeGZlcnN0YXQpIHByaW50ZigiU1VDQ0VTU1xuIik7CisgICAgZWxzZSBpZiAoaW50ZXJydXB0ZWQpIHByaW50ZigiRkFJTFVSRSAoaW50ZXJydXB0ZWQpXG4iKTsKKyAgICBlbHNlIGlmIChmYXRhbGlvKSBwcmludGYoIkZBSUxVUkUgKGkvbyBlcnJvcilcbiIpOworICAgIGVsc2UgcHJpbnRmKCJGQUlMVVJFXG4iKTsKKyNpZm5kZWYgWFlaX0lOVEVSTkFMCisgICAgaWYgKCFmdHAgJiYgcHJvdG9jb2wgIT0gUFJPVE9fSykgeworICAgICAgICBwcmludGYoIlxuIGV4dGVybmFsIHByb3RvY29sIHN0YXRpc3RpY3Mgbm90IGF2YWlsYWJsZVxuIik7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisjZW5kaWYgLyogWFlaX0lOVEVSTkFMICovCisgICAgbisrOworICAgIGlmICghZnRwKSB7CisgICAgICAgIGlmICgheGZlcnN0YXQgPiAwKSB7CisgICAgICAgICAgICBpZiAoZG9jcmMpCisgICAgICAgICAgICAgIHByaW50ZigiIGNyYy0xNiBvZiBmaWxlKHMpICAgICAgOiAlbGRcbiIsIGNyYzE2KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCIgY3JjLTE2IG9mIGZpbGUocykgICAgICA6IChkaXNhYmxlZClcbiIpOworICAgICAgICAgICAgbisrOworICAgICAgICB9CisgICAgICAgIGlmICgheGZlcnN0YXQgJiYgKmVwa3Rtc2cpIHsKKyAgICAgICAgICAgIHByaW50ZigiIHJlYXNvbiAgICAgICAgICAgICAgICAgOiAlc1xuIiwgZXBrdG1zZyk7CisgICAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFicmllZikgeworI2lmZGVmIE5FV0ZUUAorICAgICAgICBpZiAoZnRwKSB7CisgICAgICAgICAgICBleHRlcm4gY2hhciBmdHBfc3J2dHlwW107CisgICAgICAgICAgICBwcmludGYoIiByZW1vdGUgc3lzdGVtIHR5cGUgICAgIDogJXNcbiIsZnRwX3NydnR5cCk7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIE5FV0ZUUCAqLworICAgICAgICAgIGlmICh3aG9hcmV1WzBdKSB7CisgICAgICAgICAgICBwcmludGYoIiByZW1vdGUgc3lzdGVtIHR5cGUgICAgIDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgZ2V0c3lzaWQoKGNoYXIgKil3aG9hcmV1KSk7CisgICAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCIgZmlsZXMgdHJhbnNmZXJyZWQgICAgICA6ICVsZFxuIixmaWxjbnQgLSBmaWxyZWopOworICAgICAgICBpZiAoIWZ0cCkKKyAgICAgICAgICBwcmludGYoIiBmaWxlcyBub3QgdHJhbnNmZXJyZWQgIDogJWxkXG4iLGZpbHJlaik7CisgICAgICAgIHByaW50ZigiIGNoYXJhY3RlcnMgbGFzdCBmaWxlICAgOiAlbGRcbiIsZmZjKTsKKyAgICAgICAgcHJpbnRmKCIgdG90YWwgZmlsZSBjaGFyYWN0ZXJzICA6ICVsZFxuIix0ZmMpOworICAgICAgICBuICs9IGZ0cCA/IDMgOiA0OworICAgICAgICBpZiAoIWZ0cCkgeworICAgICAgICAgICAgcHJpbnRmKCIgY29tbXVuaWNhdGlvbiBsaW5lIGluICA6ICVsZFxuIix0bGNpKTsKKyAgICAgICAgICAgIHByaW50ZigiIGNvbW11bmljYXRpb24gbGluZSBvdXQgOiAlbGRcbiIsdGxjbyk7CisgICAgICAgICAgICBwcmludGYoIiBwYWNrZXRzIHNlbnQgICAgICAgICAgIDogJWRcbiIsIHNwYWNrZXRzKTsKKyAgICAgICAgICAgIHByaW50ZigiIHBhY2tldHMgcmVjZWl2ZWQgICAgICAgOiAlZFxuIiwgcnBhY2tldHMpOworICAgICAgICAgICAgbiArPSA0OworICAgICAgICB9CisgICAgfQorICAgIGlmIChmdHApIGdvdG8gZG90aW1lczsKKworICAgIHByaW50ZigiIGRhbWFnZWQgcGFja2V0cyByZWMnZCAgOiAlZFxuIiwgY3J1bmNoZWQpOworICAgIHByaW50ZigiIHRpbWVvdXRzICAgICAgICAgICAgICAgOiAlZFxuIiwgdGltZW91dHMpOworICAgIHByaW50ZigiIHJldHJhbnNtaXNzaW9ucyAgICAgICAgOiAlZFxuIiwgcmV0cmFucyk7CisgICAgbiArPSAzOworCisgICAgaWYgKCFicmllZikgeworICAgICAgICBpZiAoZmlsY250ID4gMCkgeworICAgICAgICAgICAgcHJpbnRmKCIgcGFyaXR5ICAgICAgICAgICAgICAgICA6ICVzIixwYXJuYW0oKGNoYXIpcGFyaXR5KSk7CisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICBpZiAoYXV0b3BhcikgeyBwcmludGYoIiAoZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkiKTsgbisrOyB9CisgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgICJcbiBjb250cm9sIGNoYXJhY3RlcnMgICAgIDogJWxkIHByZWZpeGVkLCAlbGQgdW5wcmVmaXhlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBjY3AsIGNjdSk7CisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICBwcmludGYoIiA4dGggYml0IHByZWZpeGluZyAgICAgIDogIik7CisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICBpZiAoZWJxZmxnKSBwcmludGYoInllcyBbJWNdXG4iLGVicSk7IGVsc2UgcHJpbnRmKCJub1xuIik7CisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICBwcmludGYoIiBsb2NraW5nIHNoaWZ0cyAgICAgICAgIDogJXNcbiIsIGxzY2FwdSA/ICJ5ZXMiIDogIm5vIik7CisgICAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIG4gPSAwOyB9CisgICAgaWYgKHN0cmVhbWVkID4gMCkKKyAgICAgIHByaW50ZigiIHdpbmRvdyBzbG90cyB1c2VkICAgICAgOiAoc3RyZWFtaW5nKVxuIik7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCIgd2luZG93IHNsb3RzIHVzZWQgICAgICA6ICVkIG9mICVkXG4iLCB3bWF4LCB3c2xvdHIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBuID0gMDsgfQorICAgIHByaW50ZigiIHJlbGlhYmxlOiAgICAgICAgICAgICAgOiAlcyVzXG4iLAorICAgICAgICAgICBzdHJlYW1vayA/ICIiIDogIm5vdCAiLCAibmVnb3RpYXRlZCIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBuID0gMDsgfQorICAgIHByaW50ZigiIGNsZWFyY2hhbm5lbDogICAgICAgICAgOiAlcyVzXG4iLAorICAgICAgICAgICBjbGVhcmVkICA/ICIiIDogIm5vdCAiLCAibmVnb3RpYXRlZCIpOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBuID0gMDsgfQorCisgICAgaWYgKCFicmllZikgeworICAgICAgICBwcmludGYoIiBwYWNrZXQgbGVuZ3RoICAgICAgICAgIDogJWQgKHNlbmQpLCAlZCAocmVjZWl2ZSlcbiIsCisgICAgICAgICAgICAgICBsYXN0c3BtYXgsIHVycHNpeik7CisgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBuID0gMDsgfQorICAgICAgICBwcmludGYoIiBjb21wcmVzc2lvbiAgICAgICAgICAgIDogIik7CisgICAgICAgIGlmIChycHRmbGcpCisgICAgICAgICAgcHJpbnRmKCJ5ZXMgWyVjXSAoJWxkKVxuIiwoY2hhcikgcnB0cSxycHRuKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50Zigibm9cbiIpOworICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbiA9IDA7IH0KKyAgICAgICAgaWYgKGJjdHUgPT0gNCkKKyAgICAgICAgICBwcmludGYoIiBibG9jayBjaGVjayB0eXBlIHVzZWQgIDogYmxhbmstZnJlZS0yXG4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZigiIGJsb2NrIGNoZWNrIHR5cGUgdXNlZCAgOiAlZFxuIixiY3R1KTsKKyAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIG4gPSAwOyB9CisgICAgfQorCisgIGRvdGltZXM6CisKKyNpZmRlZiBHRlRJTUVSCisjaWZkZWYgQ09NTUVOVAorICAgIHByaW50ZigiIGVsYXBzZWQgdGltZSAgICAgICAgICAgOiAlMC4zZiBzZWMsICVzXG4iLCBmcHRzZWNzLGhobW1zcyh0c2VjcykpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBwcmludGYoIiBlbGFwc2VkIHRpbWUgICAgICAgICAgIDogJXMgKCUwLjNmIHNlYylcbiIsCisgICAgICAgICAgIGhobW1zcygobG9uZykoZnB0c2VjcyArIDAuNSkpLGZwdHNlY3MpOworI2Vsc2UKKyNpZmRlZiBDT01NRU5UCisgICAgcHJpbnRmKCIgZWxhcHNlZCB0aW1lICAgICAgICAgICA6ICVzICglZCBzZWMpXG4iLGhobW1zcyh0c2VjcyksdHNlY3MpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBwcmludGYoIiBlbGFwc2VkIHRpbWUgICAgICAgICAgIDogJWQgc2VjLCAlc1xuIix0c2VjcyxoaG1tc3ModHNlY3MpKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIG4gPSAwOyB9CisgICAgaWYgKCFmdHAgJiYgbG9jYWwgJiYgIW5ldHdvcmsgJiYgIWJyaWVmKSB7CisgICAgICAgIGlmIChzcGVlZCA8PSAwTCkgc3BlZWQgPSB0dGdzcGQoKTsKKyAgICAgICAgaWYgKHNwZWVkID4gMEwpIHsKKyAgICAgICAgICAgIGlmIChzcGVlZCA9PSA4ODgwKQorICAgICAgICAgICAgICBwcmludGYoIiB0cmFuc21pc3Npb24gcmF0ZSAgICAgIDogNzUvMTIwMCBicHNcbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwcmludGYoIiB0cmFuc21pc3Npb24gcmF0ZSAgICAgIDogJWxkIGJwc1xuIixzcGVlZCk7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbiA9IDA7IH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZ0cCAmJiBsb2NhbCAmJiAhbmV0d29yayAmJiAgICAvKiBPbmx5IG1ha2VzIHNlbnNlIGZvciAqLworICAgICAgICBtZG10eXAgPT0gMCAmJiAgICAgICAgICAgICAgICAgIC8qIGRpcmVjdCBzZXJpYWwgY29ubmVjdGlvbnMgKi8KKyAgICAgICAgc3BlZWQgPiA5OUwgJiYgICAgICAgICAgICAgICAgICAvKiB3aGVuIHdlIHJlYWxseSBrbm93IHRoZSBzcGVlZCAqLworICAgICAgICBzcGVlZCAhPSA4ODgwTAorICAgICAgICApIHsKKyAgICAgICAgaW50IGVmZjsKKyAgICAgICAgZWZmID0gKCgodGZjcHMgKiAxMDBMKSAvIChzcGVlZCAvIDEwMEwpKSArIDVMKSAvIDEwTDsKKyAgICAgICAgcHJpbnRmKCIgZWZmZWN0aXZlIGRhdGEgcmF0ZSAgICA6ICVsZCBjcHMgKCVkJSUpXG4iLHRmY3BzLGVmZik7CisgICAgfSBlbHNlCisgICAgICBwcmludGYoIiBlZmZlY3RpdmUgZGF0YSByYXRlICAgIDogJWxkIGNwc1xuIiwgdGZjcHMpOworICAgIGlmICghZnRwICYmIHBlYWtjcHMgPiAwTCAmJiBwZWFrY3BzID4gdGZjcHMpCisgICAgICBwcmludGYoIiBwZWFrIGRhdGEgcmF0ZSAgICAgICAgIDogJWxkIGNwc1xuIiwgcGVha2Nwcyk7CisgICAgaWYgKGJyaWVmKQorICAgICAgcHJpbnRmKCJcblVzZSBTVEFUSVNUSUNTIC9WRVJCT1NFIGZvciBncmVhdGVyIGRldGFpbC5cblxuIik7CisgICAgcmV0dXJuKDEpOworfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PU1BMCisKKy8qIFRoZSBJTlBVVCBjb21tYW5kICovCisKKy8qCisgIE5PVEU6IEFuIElOUFVUIHRpbWVvdXQgb2YgMCBtZWFucyB0byBwZXJmb3JtIGEgbm9uYmxvY2tpbmcgcmVhZCBvZiB0aGUKKyAgbWF0ZXJpYWwgdGhhdCBoYXMgYWxyZWFkeSBhcnJpdmVkIGFuZCBpcyB3YWl0aW5nIHRvIGJlIHJlYWQsIGFuZCBwZXJmb3JtCisgIG1hdGNoZXMgYWdhaW5zdCBpdCwgd2l0aG91dCBkb2luZyBhbnkgZnVydGhlciByZWFkcy4gIEl0IHNob3VsZCBzdWNjZWVkCisgIG9yIGZhaWwgaW5zdGFudGFuZW91c2x5LgorKi8KKworLyogT3V0cHV0IGJ1ZmZlcmluZyBmb3IgImRvaW5wdXQiICovCisKKyNpZmRlZiBwZHAxMQorI2RlZmluZSBNQVhCVVJTVCAxNiAgICAgICAgICAgICAvKiBNYXhpbXVtIHNpemUgb2YgaW5wdXQgYnVyc3QgKi8KKyNlbHNlCisjZGVmaW5lIE1BWEJVUlNUIDEwMjQKKyNlbmRpZiAvKiBwZHAxMSAqLworI2lmZGVmIE9TSworc3RhdGljIENIQVIgKmNvbmJ1ZjsgICAgICAgICAgICAvKiBCdWZmZXIgdG8gaG9sZCBvdXRwdXQgZm9yIGNvbnNvbGUgKi8KKyNlbHNlCitzdGF0aWMgQ0hBUiBjb25idWZbTUFYQlVSU1RdOyAgIC8qIEJ1ZmZlciB0byBob2xkIG91dHB1dCBmb3IgY29uc29sZSAqLworI2VuZGlmIC8qIE9TSyAqLworc3RhdGljIGludCBjb25jbnQgPSAwOyAgICAgICAgICAvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyBidWZmZXJlZCAqLworI2lmZGVmIE9TSworc3RhdGljIENIQVIgKnNlc2J1ZjsgICAgICAgICAgICAvKiBCdWZmZXIgdG8gaG9sZCBvdXRwdXQgZm9yIHNlc3Npb24gbG9nICovCisjZWxzZQorc3RhdGljIENIQVIgc2VzYnVmW01BWEJVUlNUXTsgICAvKiBCdWZmZXIgdG8gaG9sZCBvdXRwdXQgZm9yIHNlc3Npb24gbG9nICovCisjZW5kaWYgLyogT1NLICovCitzdGF0aWMgaW50IHNlc2NudCA9IDA7ICAgICAgICAgIC8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIGJ1ZmZlcmVkICovCisKK2V4dGVybiBpbnQgZGVic2VzOyAgICAgICAgICAgICAgICAgICAgICAvKiBURVJNSU5BTCBERUJVRyBPTi9PRkYgKi8KKworc3RhdGljIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsdXNoIElOUFVUIGVjaG9pbmcgKi8KK215ZmxzaCgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgc2Vzc2lvbiBsb2cgb3V0cHV0LiAqLworICAgIGlmIChjb25jbnQgPiAwKSB7CisgICAgICAgIGlmIChkZWJzZXMpIHsgICAgICAgICAgICAgICAgICAgLyogVGVybWluYWwgZGVidWdnaW5nPyAqLworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uY250OyBpKyspCisgICAgICAgICAgICAgIGNvbm9sKGRiY2hyKGNvbmJ1ZltpXSkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBjb254byhjb25jbnQsIChjaGFyICopIGNvbmJ1Zik7CisgICAgICAgIGNvbmNudCA9IDA7CisgICAgfQorICAgIGlmIChzZXNjbnQgPiAwKSB7CisgICAgICAgIGxvZ3N0cigoY2hhciAqKSBzZXNidWYsIHNlc2NudCk7CisgICAgICAgIHNlc2NudCA9IDA7CisgICAgfQorfQorCisvKiBFeGVjdXRlIHRoZSBJTlBVVCBhbmQgTUlOUFVUIGNvbW1hbmRzICovCisKK2ludCBpbnN0YXR1cyA9IC0xOworbG9uZyBpbmV0aW1lID0gLTFMOworaW50IGlud2FpdCA9IDA7CisKKy8qIEZvciByZXR1cm5pbmcgdGhlIGlucHV0IHNlcXVlbmNlIHRoYXQgbWF0Y2hlZCAqLworCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgTUFUQ0hCVUZTSVogODE5MQorI2Vsc2UKKyNkZWZpbmUgTUFUQ0hCVUZTSVogMTAyMworI2VuZGlmIC8qIEJJR0JVRk9LICovCitzdGF0aWMgY2hhciAqIG1hdGNoYnVmID0gTlVMTDsKK3N0YXRpYyBpbnQgbWF0Y2hpbmRleCA9IDA7CisvKgorICB0aW1vID0gSG93IGxvbmcgdG8gd2FpdDoKKyAgICAgICAgIDwgMCA9IFdhaXQgZm9yZXZlcgorICAgICAgICAgICAwID0gRG9uJ3Qgd2FpdAorICAgICAgICAgPiAwID0gV2FpdCB0aGlzIG1hbnkgc2Vjb25kcworICBtcyAgID0gQXJyYXkgb2Ygc3RyaW5ncyB0byB3YWl0IGZvci4KKyAgbXAgICA9IEFycmF5IG9mIGZsYWdzLgorICAgICAgICAgSWYgbXBbaV0gPT0gMCwgbXNbaV0gaXMgbGl0ZXJhbCwgZWxzZSBpdCdzIGEgcGF0dGVybi4KKyAgZmxhZ3MgPSBmb3Igbm93LCAxIG9yIDAuICBJZiAxLCB0aGVuIGRvbid0IG1hdGNoIGFueXRoaW5nLgorKi8KK2ludAorZG9pbnB1dCh0aW1vLG1zLG1wLGZsYWdzKSBpbnQgdGltbzsgY2hhciAqbXNbXTsgaW50IG1wW107IGludCBmbGFnczsgeworICAgIGV4dGVybiBpbnQgaW5pbnRyOworI2lmZGVmIENLX0FVVE9ETAorICAgIGV4dGVybiBpbnQgaW5hdXRvZGw7CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisgICAgaW50IHgsIHksIGksIHQsIHJ0LCBpY24sIGFueWNoYXIsIG1pW01JTlBNQVhdOworI2lmZGVmIEdGVElNRVIKKyAgICBDS0ZMT0FUIGZwdCA9IDAuMDsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgaW50IG5vbWF0Y2ggPSAwOworICAgIGludCBsYXN0Y2hhciA9IDA7CisgICAgaW50IHdhaXRpbmcgPSAwOworICAgIGludCBpbWFzayA9IDA7CisgICAgY2hhciBjaCwgKnhwLCAqczsKKyAgICBDSEFSIGM7CisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IHRlcm1faW87CisgICAgaW50IHRlcm1faW9fc2F2ZTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZkZWYgVE5DT0RFCisgICAgc3RhdGljIGludCBjciA9IDA7CisjZW5kaWYgLyogVE5DT0RFICovCisgICAgaW50IGlzX3RuID0gMDsKKyAgICBpbnQgd3JhcHBlZCA9IDA7CisjaWZkZWYgU1NIQlVJTFRJTgorICAgIGV4dGVybiBpbnQgc3NoX2NhczsKKyAgICBleHRlcm4gY2hhciAqIHNzaF9jbWQ7CisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworCisjZGVmaW5lIENLX0JVUlNUCisvKgorICBUaGlzIGVuYWJsZXMgdGhlIElOUFVUIHNwZWVkdXAgY29kZSwgd2hpY2ggZGVwZW5kcyBvbiB0dGNoaygpIHJldHVybmluZworICBhY2N1cmF0ZSBpbmZvcm1hdGlvbi4gIElmIElOUFVUIGZhaWxzIHdpdGggdGhpcyBjb2RlIGVuYWJsZWQsIGNoYW5nZSB0aGUKKyAgYWJvdmUgIiNkZWZpbmUiIHRvICIjdW5kZWYiLgorKi8KKyNpZmRlZiBDS19CVVJTVAorICAgIGludCBidXJzdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIENoYXJzIHJlbWFpbmluZyBpbiBpbnB1dCBidXJzdCAqLworI2VuZGlmIC8qIENLX0JVUlNUICovCisKKyAgICBpbWFzayA9IGNtYXNrOworICAgIGlmIChwYXJpdHkpIGltYXNrID0gMHg3ZjsKKyAgICBpbndhaXQgPSB0aW1vOyAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgXHYoaW53YWl0KSAqLworICAgIG5vbWF0Y2ggPSBmbGFncyAmIDE7CisgICAgbWFrZXN0cigmaW5wbWF0Y2gsTlVMTCk7CisKKyAgICBpZiAoIW1hdGNoYnVmKSB7CisgICAgICAgIG1hdGNoYnVmID0gbWFsbG9jKE1BVENIQlVGU0laKzEpOworICAgICAgICBtYXRjaGJ1ZlswXSA9IE5VTDsKKyAgICB9CisgICAgbWF0Y2hpbmRleCA9IDA7CisKKyAgICBpc190biA9CisjaWZkZWYgVE5DT0RFCisgICAgICAgIChsb2NhbCAmJiBuZXR3b3JrICYmIElTX1RFTE5FVCgpKSB8fCAoIWxvY2FsICYmIHNzdGVsbmV0KQorI2Vsc2UKKyAgICAgICAgIDAKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICAgICAgICA7CisKKyAgICBpbnN0YXR1cyA9IElOUF9JRTsgICAgICAgICAgICAgICAgICAvKiAzID0gaW50ZXJuYWwgZXJyb3IgKi8KKyAgICBrYmNoYXIgPSAwOworCisjaWZkZWYgT1NLCisgICAgaWYgKGNvbmJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIGlmICgoY29uYnVmID0gKENIQVIgKiltYWxsb2MoTUFYQlVSU1QqMikpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgICAgICBzZXNidWYgPSBjb25idWYgKyBNQVhCVVJTVDsKKyAgICB9CisjZW5kaWYgLyogT1NLICovCisKKyNpZm5kZWYgTk9MT0NBTAorICAgIGlmIChsb2NhbCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIGxvY2FsIG1vZGUuLi4gKi8KKyAgICAgICAgaWYgKCh3YWl0aW5nID0gdHRjaGsoKSkgPCAwKSB7ICAvKiBjaGVjayB0aGF0IGNvbm5lY3Rpb24gaXMgb3BlbiAqLworCSAgICBpZiAoIXF1aWV0KSB7CisJCWlmICgoIW5ldHdvcmsgCisjaWZkZWYgVE5fQ09NUE9SVAorCQkgICAgICB8fCBpc3RuY29tcG9ydCgpCisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworCQkgICAgICApICYmIGNhcnJpZXIgIT0gQ0FSX09GRikKKwkJICAgIHByaW50ZigiP0NhcnJpZXIgZGV0ZWN0IGZhaWx1cmUgb24gJXMuXG4iLCB0dG5hbWUpOworCQllbHNlCisJCSAgICBwcmludGYoIj9Db25uZWN0aW9uICVzICVzIGlzIG5vdCBvcGVuLlxuIiwKKwkJICAgICAgIG5ldHdvcmsgPyAidG8iIDogIm9uIiwKKwkJICAgICAgIHR0bmFtZQorCQkgICAgICAgKTsKKwkgICAgfQorICAgICAgICAgICAgaW5zdGF0dXMgPSBJTlBfSU87CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjEwMSwiZG9pbnB1dCB3YWl0aW5nIiwiIix3YWl0aW5nKTsKKyAgICAgICAgeSA9IHR0dnQoc3BlZWQsZmxvdyk7ICAgICAgICAgICAvKiBQdXQgbGluZSBpbiAidHR2dCIgbW9kZSAqLworICAgICAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiP0lOUFVUIGluaXRpYWxpemF0aW9uIGVycm9yXG4iKTsKKyAgICAgICAgICAgIGluc3RhdHVzID0gSU5QX0lPOworICAgICAgICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgIC8qIFdhdGNoIG91dCBmb3IgZmFpbHVyZS4gKi8KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgaWYgKCBuZXR3b3JrICYmIG5ldHR5cGUgPT0gTkVUX1NTSCAmJiBzc2hfY2FzICYmIHNzaF9jbWQgJiYgCisgICAgICAgICAhKHN0cmNtcChzc2hfY21kLCJrZXJtaXQiKSAmJiBzdHJjbXAoc3NoX2NtZCwic2Z0cCIpKSkgeworICAgICAgICBpZiAoIXF1aWV0KQorCSAgcHJpbnRmKCI/U1NIIFN1YnN5c3RlbSBhY3RpdmU6ICVzXG4iLCBzc2hfY21kKTsKKyAgICAgICAgaW5zdGF0dXMgPSBJTlBfSUtTOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKworICAgIGRlYnVnKEYxMTEsImRvaW5wdXQgbXNbMF0iLG1zWzBdLHdhaXRpbmcpOworCisgICAgaWYgKCFtc1swXSkgeyAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgd2Ugd2VyZSBwYXNzZWQgYSBOVUxMIHBvaW50ZXIgKi8KKyAgICAgICAgYW55Y2hhciA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiAgLi4uICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgeSA9IChpbnQpc3RybGVuKG1zWzBdKTsgICAgICAgICAvKiBPciBpZiBzZWFyY2ggc3RyaW5nIGlzIGVtcHR5ICovCisgICAgICAgIGFueWNoYXIgPSAoeSA8IDEpOyAgICAgICAgICAgICAgLyogYW55IGlucHV0IGNoYXJhY3RlciB3aWxsIGRvLiAqLworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiAxKSBhbnljaGFyID0gMDsJCS8qIERvbid0IG1hdGNoIGFueXRoaW5nICovCisKKyAgICBpZiAoIWFueWNoYXIgJiYgd2FpdGluZyA9PSAwICYmIHRpbW8gPT0gMCkKKyAgICAgIHJldHVybigwKTsKKworCisjaWZuZGVmIE5PREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisgICAgICAgIGNoYXIgeGJ1ZlsyNF07CisgICAgICAgIGRlYnVnKEYxMDEsImRvaW5wdXQgYW55Y2hhciIsIiIsYW55Y2hhcik7CisgICAgICAgIGRlYnVnKEYxMDEsImRvaW5wdXQgdGltbyIsIiIsdGltbyk7CisgICAgICAgIGRlYnVnKEYxMDEsImRvaW5wdXQgZWNobyIsIiIsaW5lY2hvKTsKKyAgICAgICAgZGVidWcoRjEwMSwiZG9pbnB1dCBidXJzdCIsIiIsYnVyc3QpOworICAgICAgICB5ID0gLTE7CisgICAgICAgIHdoaWxlIChtc1srK3ldKSB7CisgICAgICAgICAgICBzcHJpbnRmKHhidWYsImRvaW5wdXQgc3RyaW5nICUyZCIseSk7IC8qIFNBRkUgKDI0KSAqLworICAgICAgICAgICAgZGVidWcoRjExMSx4YnVmLG1zW3ldLG1wW3ldKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBOT0RFQlVHICovCisKKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgaWYgKGlzX3RuKSB7CisgICAgICAgIC8qIElmIHRoZSByZW1vdGUgc2lkZSBpcyBpbiBhIHN0YXRlIG9mIElLUyBTVEFSVC1TRVJWRVIgICAgKi8KKyAgICAgICAgLyogd2UgcmVxdWVzdCB0aGF0IHRoZSBzdGF0ZSBiZSBjaGFuZ2VkLiAgV2Ugd2lsbCBkZXRlY3QgICAqLworICAgICAgICAvKiBhIGZhaWx1cmUgdG8gYWRoZXJlIHRvIHRoZSByZXF1ZXN0IHdoZW4gd2UgY2FsbCB0dGluYygpICovCisgICAgICAgIGlmIChURUxPUFRfVShURUxPUFRfS0VSTUlUKSAmJgorICAgICAgICAgICAgVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC51X3N0YXJ0KQorICAgICAgICAgIGlrc193YWl0KEtFUk1JVF9SRVFfU1RPUCwwKTsgIC8qIFNlbmQgUmVxdWVzdC1TdG9wICovCisjaWZkZWYgQ0tfQVVUT0RMCisgICAgICAgIC8qIElmIHdlIGFyZSBwcm9jZXNzaW5nIHBhY2tldHMgZHVyaW5nIElOUFVUIGFuZCB3ZSBoYXZlIG5vdCAqLworICAgICAgICAvKiBzZW50IGEgU1RBUlQgbWVzc2FnZSwgZG8gc28gbm93LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKGluYXV0b2RsICYmIFRFTE9QVF9NRShURUxPUFRfS0VSTUlUKSAmJgorCQkJIVRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQpIHsKKyAgICAgICAgICAgIHRuX3Npa3MoS0VSTUlUX1NUQVJUKTsgICAgICAvKiBTZW5kIEtlcm1pdC1TZXJ2ZXIgU3RhcnQgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIENLX0FVVE9ETCAqLworICAgIH0KKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisgICAgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGNvZGUsIGFzc3VtZSBmYWlsdXJlICovCisgICAgaW5zdGF0dXMgPSBJTlBfVE87ICAgICAgICAgICAgICAgICAgLyogU3RhdHVzLCBhc3N1bWUgdGltZW91dCAqLworCisgICAgZm9yICh5ID0gMDsgeSA8IE1JTlBNQVg7IHkrKykKKyAgICAgIG1pW3ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdHJpbmcgcGF0dGVybiBtYXRjaCBwb3NpdGlvbiAqLworCisgICAgaWYgKCFpbnBjYXNbY21kbHZsXSkgeyAgICAgICAgICAgICAgLyogSU5QVVQgQ0FTRSA9IElHTk9SRT8gICovCisgICAgICAgIHkgPSAtMTsKKworICAgICAgICB3aGlsZSAoKHhwID0gbXNbKyt5XSkpIHsKKyAgICAgICAgICAgIHdoaWxlICgqeHApIHsgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHRvIGxvd2VyY2FzZSAqLworICAgICAgICAgICAgICAgIGlmIChpc3VwcGVyKCp4cCkpICp4cCA9IChjaGFyKSB0b2xvd2VyKCp4cCk7CisgICAgICAgICAgICAgICAgeHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBydGltZXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0aW1lci4gKi8KKyNpZmRlZiBHRlRJTUVSCisgICAgcmZ0aW1lcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmctcG9pbnQgdGltZXIgdG9vLiAqLworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyAgICBpbmV0aW1lID0gLTFMOyAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGVsYXBzZWQgdGltZS4gKi8KKyAgICB0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIG5vdyBpcyAwLiAqLworICAgIG1fZm91bmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgdG8gdGltZWQtb3V0ICovCisgICAgaW5jb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIGNvdW50ZXIgKi8KKyAgICBydCA9ICh0aW1vID09IDApID8gMCA6IDE7ICAgICAgICAgICAvKiBDaGFyYWN0ZXItcmVhZCB0aW1lb3V0IGludGVydmFsICovCisKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgIHRlcm1faW9fc2F2ZSA9IHRlcm1faW87ICAgICAgICAgICAgIC8qIERpc2FibGUgSS9PIGJ5IGVtdWxhdG9yICovCisgICAgdGVybV9pbyA9IDA7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyLWdldHRpbmcgbG9vcCAqLworI2lmZGVmIENLX0FQQworICAgICAgICAvKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW4gQXV0b2Rvd24gb3Igb3RoZXIgQVBDIGNvbW1hbmQgKi8KKyAgICAgICAgaWYgKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwgfHwKKyAgICAgICAgICAgIChhcGNhY3RpdmUgPT0gQVBDX1JFTU9URSAmJiBhcGNzdGF0dXMgIT0gQVBDX09GRikpIHsKKyAgICAgICAgICAgIGlmIChtbG9vayhtYWN0YWIsIl9hcGNfY29tbWFuZHMiLG5tYWMpID09IC0xKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZG9pbnB1dCBhYm91dCB0byBleGVjdXRlIEFQQyIsYXBjYnVmLDApOworICAgICAgICAgICAgICAgIGRvbWFjKCJfYXBjX2NvbW1hbmRzIixhcGNidWYsY21kc3RrW2NtZGx2bF0uY2NmbGdzfENGX0FQQyk7CisgICAgICAgICAgICAgICAgZGVsbWFjKCJfYXBjX2NvbW1hbmRzIiwxKTsKKyAgICAgICAgICAgICAgICBhcGNhY3RpdmUgPSBBUENfSU5BQ1RJVkU7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiZG9pbnB1dCBBUEMgaW4gcHJvZ3Jlc3MiLCIiLDApOworI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS19BUEMgKi8KKworICAgICAgICBpZiAodGltbyA9PSAwICYmIHdhaXRpbmcgPCAxKSB7IC8qIFNwZWNpYWwgZXhpdCBjcml0ZXJpb24gKi8KKyAgICAgICAgICAgIGluc3RhdHVzID0gSU5QX1RPOyAgICAgICAgICAvKiBmb3IgdGltZW91dCA9PSAwICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jYWwpIHsgICAgICAgICAgICAgICAgICAgIC8qIE9uZSBjYXNlIGZvciBsb2NhbCAqLworICAgICAgICAgICAgeSA9IHR0aW5jKHJ0KTsgICAgICAgICAgICAgIC8qIEdldCBjaGFyYWN0ZXIgZnJvbSBjb21tIGRldmljZSAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwiZG9pbnB1dCB0dGluYyhydCkgcmV0dXJucyIsIiIseSk7CisgICAgICAgICAgICBpZiAoeSA8IC0xKSB7ICAgICAgICAgICAgICAgLyogQ29ubmVjdGlvbiBmYWlsZWQuICovCisgICAgICAgICAgICAgICAgaW5zdGF0dXMgPSBJTlBfSU87ICAgICAgLyogU3RhdHVzID0gaS9vIGVycm9yICovCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICB0ZXJtX2lvID0gdGVybV9pb19zYXZlOworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHkpIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgLTI6ICAgICAgICAgICAgICAvKiBDb25uZWN0aW9uIGxvc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsICYmICFuZXR3b3JrICYmIGNhcnJpZXIgIT0gQ0FSX09GRikgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9sb2dlbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ29ubmVjdGlvbiBjbG9zZWQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0Y2xvcygxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgLTM6CisgICAgICAgICAgICAgICAgICAgIGRvbG9nZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiU2Vzc2lvbiBMaW1pdCBleGNlZWRlZCAtIGNsb3NpbmcgY29ubmVjdGlvbi5cbiIpOworICAgICAgICAgICAgICAgICAgICB0dGNsb3MoMSk7CisgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZG9pbnB1dCBDb25uZWN0aW9uIGZhaWxlZCIsInJldHVybmluZyAwIix5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5pbnRyKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZG9pbnB1dCIsImluaW50ciIsaW5pbnRyKTsKKyAgICAgICAgICAgICAgICBpZiAoKGljbiA9IGNvbmNoaygpKSA+IDApIHsgLyogSW50ZXJydXB0ZWQgZnJvbSBrZXlib2FyZD8gKi8KKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiaW5wdXQgaW50ZXJydXB0ZWQgZnJvbSBrZXlib2FyZCIsIiIsaWNuKTsKKyAgICAgICAgICAgICAgICAgICAga2JjaGFyID0gY29uaW5jKDApOworICAgICAgICAgICAgICAgICAgICBpZiAoa2JjaGFyID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgtLWljbiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJkb2lucHV0IiwiYWJzb3JiaW5nIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25pbmMoMCk7ICAgICAgLyogWWVzLCBhYnNvcmIgd2hhdCB3YXMgdHlwZWQuICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YXR1cyA9IElOUF9VSTsgIC8qIEZhaWwgYW5kIHJlbWVtYmVyIHdoeS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFub3RoZXIgZm9yIHJlbW90ZSAqLworICAgICAgICAgICAgeSA9IGNvbmluYyhydCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkb2lucHV0IGNvbmluYyhydCkgcmV0dXJucyIsIiIseSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHkgPiAtMSkgeyAgICAgICAgICAgICAgICAgICAvKiBBIGNoYXJhY3RlciBhcnJpdmVkICovCisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJkb2lucHV0IiwiYSBjaGFyYWN0ZXIgYXJyaXZlZCIseSk7CisgICAgICAgICAgICBpZiAodGltbyA9PSAwKQorICAgICAgICAgICAgICB3YWl0aW5nLS07CisjaWZuZGVmIE9TMgorI2RlZmluZSBUTl9OT0xPCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgTk9MT0NBTAorI2RlZmluZSBUTl9OT0xPCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZkZWYgVE5fTk9MTworICAgICAgICAgICAgZGVidWcoRjEwMCwiZG9pbnB1dCBUTl9OT0xPIiwiIiwwKTsKKyNpZmRlZiBUTkNPREUKKyAgICAgICAgICAgIC8qIENoZWNrIGZvciB0ZWxuZXQgcHJvdG9jb2wgbmVnb3RpYXRpb24gKi8KKyAgICAgICAgICAgIGlmIChpc190bikgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoeSAmIDB4ZmYpIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgSUFDOgorICAgICAgICAgICAgICAgICAgICBjciA9IDA7CisgICAgICAgICAgICAgICAgICAgIG15ZmxzaCgpOyAgIC8qIEJyZWFrIGZyb20gaW5wdXQgYnVyc3QgZm9yIHRuX2Rvb3AoKSAqLworI2lmZGVmIENLX0JVUlNUCisgICAgICAgICAgICAgICAgICAgIGJ1cnN0ID0gMDsKKyNlbmRpZiAvKiBDS19CVVJTVCAqLworICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIC09IDI7ICAgICAgIC8qIChub3QgbmVjZXNzYXJpbHkuLi4pICovCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodG5fZG9vcCgoQ0hBUikoeSAmIDB4ZmYpLGR1cGxleCx0dGluYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IGR1cGxleCA9IDA7IGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogZHVwbGV4ID0gMTsgY29udGludWU7CisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0LnVfc3RhcnQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRjcF9pbmNvbWluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhdHVzID0gSU5QX0lLUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoCisgIiBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSBpbiBTRVJWRVIgbW9kZS5cbiBQbGVhc2UgdXNlIFJFTU9URSBjb21tYW5kcy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6ICAgICAgICAgICAvKiBURUxORVQgRE8gTE9HT1VUIHJlY2VpdmVkICovCisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGNhc2UgQ1I6CisgICAgICAgICAgICAgICAgICAgIGNyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIE5VTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFURUxPUFRfVShURUxPUFRfQklOQVJZKSAmJiBjcikgeworICAgICAgICAgICAgICAgICAgICAgICAgY3IgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY3IgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGNyID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogSSdtIGVjaG9pbmcgcmVtb3RlIGNoYXJzICovCisgICAgICAgICAgICAgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfRUNITykgJiYgdG5fcmVtX2VjaG8pCisgICAgICAgICAgICAgICAgICB0dG9jKChjaGFyKXkpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIFROQ09ERSAqLworI2lmZGVmIENLX0FVVE9ETAorICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGZpbGUgdHJhbnNmZXIgcGFja2V0cyAqLworICAgICAgICAgICAgaWYgKGluYXV0b2RsKSBhdXRvZG93bih5KTsKKyNlbmRpZiAvKiBDS19BVVRPREwgKi8KKyNlbHNlICAvKiBUTl9OT0xPICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJkb2lucHV0ICFUTl9OT0xPIiwiIiwwKTsKKyNpZmRlZiBUTkNPREUKKyAgICAgICAgICAgIC8qIENoZWNrIGZvciB0ZWxuZXQgcHJvdG9jb2wgbmVnb3RpYXRpb24gKi8KKyAgICAgICAgICAgIGlmIChpc190bikgeworICAgICAgICAgICAgICAgIGludCB0eDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHkgJiAweGZmKSB7CisgICAgICAgICAgICAgICAgICBjYXNlIElBQzoKKyAgICAgICAgICAgICAgICAgICAgbXlmbHNoKCk7ICAgLyogQnJlYWsgZnJvbSBpbnB1dCBidXJzdCBmb3IgdG5fZG9vcCgpICovCisjaWZkZWYgQ0tfQlVSU1QKKyAgICAgICAgICAgICAgICAgICAgYnVyc3QgPSAwOworI2VuZGlmIC8qIENLX0JVUlNUICovCisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICAgICAgICAgICAgICB0eCA9IHNjcmlwdHdydGJ1ZigoVVNIT1JUKXkpOworICAgICAgICAgICAgICAgICAgICBpZiAodHggPT0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRFTE9QVF9VKFRFTE9QVF9LRVJNSVQpICYmIAorCQkJICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQudV9zdGFydCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0Y3BfaW5jb21pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YXR1cyA9IElOUF9JS1M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAiIEludGVybmV0IEtlcm1pdCBTZXJ2aWNlIGluIFNFUlZFUiBtb2RlLlxuIFBsZWFzZSB1c2UgUkVNT1RFIGNvbW1hbmRzLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR4ID09IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRFTE5FVCBETyBMT0dPVVQgcmVjZWl2ZWQgKi8KKworICAgICAgICAgICAgICAgICAgICB9CisjZWxzZSAvKiBJS1NfT1BUSU9OICovCisgICAgICAgICAgICAgICAgICAgIC8qIEhhbmRsZXMgVGVsbmV0IG5lZ290aWF0aW9ucyAqLworICAgICAgICAgICAgICAgICAgICB0eCA9IHNjcmlwdHdydGJ1ZigoVVNIT1JUKXkpOworICAgICAgICAgICAgICAgICAgICBpZiAodHggPT0gNikgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogVEVMTkVUIERPIExPR09VVCByZWNlaXZlZCAqLworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIC09IDI7ICAgICAgIC8qIChub3QgbmVjZXNzYXJpbHkuLi4pICovCisgICAgICAgICAgICAgICAgICAgIGNyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAvKiBhbmQgYXV0b2Rvd25sb2FkIGNoZWNrICovCisgICAgICAgICAgICAgICAgICBjYXNlIENSOgorICAgICAgICAgICAgICAgICAgICBjciA9IDE7CisgICAgICAgICAgICAgICAgICAgIHR4ID0gc2NyaXB0d3J0YnVmKChVU0hPUlQpeSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eCA9PSA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBURUxORVQgRE8gTE9HT1VUIHJlY2VpdmVkICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIE5VTDoKKyAgICAgICAgICAgICAgICAgICAgY3IgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoIVRFTE9QVF9VKFRFTE9QVF9CSU5BUlkpICYmIGNyKQorICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB0eCA9IHNjcmlwdHdydGJ1ZigoVVNIT1JUKXkpOworICAgICAgICAgICAgICAgICAgICBpZiAodHggPT0gNikgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogVEVMTkVUIERPIExPR09VVCByZWNlaXZlZCAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgY3IgPSAwOworICAgICAgICAgICAgICAgICAgICB0eCA9IHNjcmlwdHdydGJ1ZigoVVNIT1JUKXkpOworICAgICAgICAgICAgICAgICAgICBpZiAodHggPT0gNikgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogVEVMTkVUIERPIExPR09VVCByZWNlaXZlZCAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEknbSBlY2hvaW5nIHJlbW90ZSBjaGFycyAqLworICAgICAgICAgICAgICAgIGlmIChURUxPUFRfTUUoVEVMT1BUX0VDSE8pICYmIHRuX3JlbV9lY2hvKQorICAgICAgICAgICAgICAgICAgdHRvYygoQ0hBUil5KTsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFROQ09ERSAqLworICAgICAgICAgICAgICAvKiBIYW5kbGVzIHRlcm1pbmFsIGVtdWxhdGlvbiByZXNwb25zZXMgKi8KKyAgICAgICAgICAgICAgc2NyaXB0d3J0YnVmKChVU0hPUlQpeSk7CisjZW5kaWYgLyogVE5fTk9MTyAqLworCisgICAgICAgICAgICAvKiBSZWFsIGlucHV0IGNoYXJhY3RlciB0byBiZSBjaGVja2VkICovCisKKyNpZmRlZiBDS19CVVJTVAorICAgICAgICAgICAgYnVyc3QtLTsgICAgICAgICAgICAgICAgICAgIC8qIE9uZSBsZXNzIGNoYXJhY3RlciB3YWl0aW5nICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkb2lucHV0IGJ1cnN0IiwiIixidXJzdCk7CisjZW5kaWYgLyogQ0tfQlVSU1QgKi8KKyAgICAgICAgICAgIGMgPSAoQ0hBUikgKGltYXNrICYgKENIQVIpIHkpOyAvKiBNYXNrIG9mZiBhbnkgcGFyaXR5ICovCisgICAgICAgICAgICBpbmNoYXJbMF0gPSBjOyAgICAgICAgICAgICAgLyogUmVtZW1iZXIgY2hhcmFjdGVyIGZvciBcdihpbmNoYXIpICovCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIENLX0JVUlNUCisgICAgICAgICAgICAvKiBVcGRhdGUgImxhc3RjaGFyIiB0aW1lIG9ubHkgb25jZSBkdXJpbmcgaW5wdXQgYnVyc3QgKi8KKyAgICAgICAgICAgIGlmIChidXJzdCA8PSAwKQorI2VuZGlmIC8qIENLX0JVUlNUICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICBsYXN0Y2hhciA9IGd0aW1lcigpOyAgICAgIC8qIFJlbWVtYmVyIHdoZW4gaXQgY2FtZSAqLworCisgICAgICAgICAgICBpZiAoYyA9PSAnXDAnKSB7ICAgICAgICAgICAgLyogTlVMLCB3ZSBjYW4ndCB1c2UgaXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoYW55Y2hhcikgeyAgICAgICAgICAvKiBFeGNlcHQgaWYgYW55IGNoYXJhY3RlciB3aWxsIGRvPyAqLworICAgICAgICAgICAgICAgICAgICB4ID0gMTsgICAgICAgICAgICAgIC8qIFllcywgZG9uZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgaW5jb3VudCA9IDE7ICAgICAgICAvKiBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IGFuZCBvbmx5LiAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgZ290byByZWZpbGw7ICAgICAvKiBPdGhlcndpc2UgY29udGludWUgSU5QVVR0aW5nICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAqaW5wYnArKyA9IGM7ICAgICAgICAgICAgICAgLyogU3RvcmUgY2hhciBpbiBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgICAgIGluY291bnQrKzsgICAgICAgICAgICAgICAgICAvKiBDb3VudCBpdCBmb3IgXHYoaW5jb3VudCkgKi8KKworICAgICAgICAgICAgLyogRG9uJ3QgTlVMLXRlcm1pbmF0ZSBoZXJlIC0gaXQncyBhIGNpcmN1bGFyIGJ1ZmZlci4gKi8KKworICAgICAgICAgICAgaWYgKGlucGJwID49IGlucGJ1ZiArIGluYnVmc2l6ZSkgeyAvKiBUaW1lIHRvIHdyYXAgYXJvdW5kPyAqLworICAgICAgICAgICAgICAgIHdyYXBwZWQrKzsKKyAgICAgICAgICAgICAgICAqaW5wYnAgPSBOVUwgOyAgICAgICAgICAvKiBNYWtlIGl0IG51bGwtdGVybWluYXRlZCAqLworICAgICAgICAgICAgICAgIGlucGJwID0gaW5wYnVmOyAgICAgICAgIC8qIFllcy4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXRjaGJ1ZikgeworICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZGV4IDwgTUFUQ0hCVUZTSVopIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hidWZbbWF0Y2hpbmRleCsrXSA9IGM7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoYnVmW21hdGNoaW5kZXhdID0gTlVMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNpZmRlZiBNQUMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBleHRlcm4gY2hhciAqdHRlcm13OyAgICAvKiBmYWtlIHBvaW50ZXIgY2FzdCAqLworICAgICAgICAgICAgICAgIGlmIChpbmVjaG8pIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0Y2hhcih0dGVybXcsIGMpOyAvKiBlY2hvIHRvIHRlcm1pbmFsIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1pZ2h0IGJlIHRvbyBtdWNoIG92ZXJoZWFkIHRvIGRvIGhlcmUgPyAqLworICAgICAgICAgICAgICAgICAgICB1cGRhdGVjb21tYW5kKHR0ZXJtdyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2Vsc2UgLyogTm90IE1BQyAqLworICAgICAgICAgICAgaWYgKGluZWNobykgeyAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBjb25zb2xlIG91dHB1dCAqLworICAgICAgICAgICAgICAgIGNvbmJ1Zltjb25jbnQrK10gPSBjOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIE1BQyAqLworI2lmbmRlZiBPUzIKKyAgICAgICAgICAgIGlmIChzZXNsb2cpIHsKKyNpZmRlZiBVTklYCisgICAgICAgICAgICAgICAgaWYgKHNlc3NmdCAhPSAwIHx8IGMgIT0gJ1xyJykKKyNlbHNlCisjaWZkZWYgT1NLCisgICAgICAgICAgICAgICAgaWYgKHNlc3NmdCAhPSAwIHx8IGMgIT0gJ1wwMTInKQorI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyAgICAgICAgICAgICAgICAgIHNlc2J1ZltzZXNjbnQrK10gPSBjOyAvKiBCdWZmZXIgc2Vzc2lvbiBsb2cgb3V0cHV0ICovCisgICAgICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICBpZiAoYW55Y2hhcikgeyAgICAgICAgICAgICAgLyogQW55IGNoYXJhY3RlciB3aWxsIGRvPyAqLworICAgICAgICAgICAgICAgIHggPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpbnBjYXNbY21kbHZsXSkgeyAgICAgIC8qIElnbm9yZSBhbHBoYWJldGljIGNhc2U/ICovCisgICAgICAgICAgICAgICAgaWYgKGlzdXBwZXIoYykpICAgICAgICAgLyogWWVzLCBjb252ZXJ0IGlucHV0IGNoYXIgdG8gbG93ZXIgKi8KKyAgICAgICAgICAgICAgICAgIGMgPSAoQ0hBUikgdG9sb3dlcihjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKEYwMDAsImRvaW5wdXQgY2hhciIsIiIsYyk7CisKKyAgICAgICAgICAgIC8qIEhlcmUgaXMgdGhlIG1hdGNoaW5nIHNlY3Rpb24gKi8KKworICAgICAgICAgICAgeSA9IC0xOyAgICAgICAgICAgICAgICAgICAgIC8qIExvb3AgdGhydSBzZWFyY2ggc3RyaW5ncyAqLworICAgICAgICAgICAgd2hpbGUgKCFub21hdGNoICYmIChzID0gbXNbKyt5XSkpIHsJLyogLi4uYXMgbWFueSBhcyB3ZSBoYXZlLiAqLworICAgICAgICAgICAgICAgIGlmIChtcFt5XSkgeyAgICAgICAgICAgIC8qIFBhdHRlcm4gbWF0Y2g/ICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBncm9zcyBidXQgaXQgd29ya3MuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogV2UgY291bGQganVzdCBhcyBlYXNpbHkgaGF2ZSBwcmVwZW5kZWQgJyonIHRvIHRoZSAgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogcGF0dGVybiBhbmQgc2tpcHBlZCB0aGUgbG9vcCwgZXhjZXB0IHRoZW4gd2Ugd291bGQgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogbm90IGhhdmUgYW55IHdheSB0byBpZGVudGlmeSB0aGUgbWF0Y2hpbmcgc3RyaW5nLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1hdGNoaW5kZXg7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNrbWF0Y2gocywmbWF0Y2hidWZbal0sMSwxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5kZXggPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh4ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIC8qIEp1bHkgMjAwMSAtIGNrbWF0Y2goKSByZXR1cm5zIG1hdGNoIHBvc2l0aW9uLiAqLworICAgICAgICAgICAgICAgICAgICAvKiBJdCB3b3JrcyBhbmQgaXQncyBub3QgZ3Jvc3MuICovCisJCSAgICAvKiAoNCA9IGZsb2F0aW5nIHBhdHRlcm4pICovCisgICAgICAgICAgICAgICAgICAgIHggPSBja21hdGNoKHMsbWF0Y2hidWYsaW5wY2FzW2NtZGx2bF0sMSs0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGluZGV4ID0geCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBMaXRlcmFsIG1hdGNoLiAqLworICAgICAgICAgICAgICAgIGkgPSBtaVt5XTsgICAgICAgICAgICAgIC8qIE1hdGNoLXBvc2l0aW9uIGluIHNlYXJjaCBzdHJpbmcuICovCisgICAgICAgICAgICAgICAgZGVidWcoRjAwMCwiY29tcGFyZSBjaGFyIiwiIiwoQ0hBUilzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAoQ0hBUikgc1tpXSkgeyAvKiBDaGVjayBmb3IgbWF0Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAvKiBHb3Qgb25lLCBnbyB0byBuZXh0IGNoYXJhY3RlciAqLworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIERvbid0IGhhdmUgYSBtYXRjaCAqLworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gaTsgaSA+IDA7ICkgeyAvKiBCYWNrIHVwIGluIHNlYXJjaCBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGktLTsgLyogKERvIHRoaXMgaGVyZSB0byBwcmV2ZW50IGNvbXBpbGVyIGZvdWx1cCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc3Vic3RyaW5nIHRoYXQgbWF0Y2hlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gKENIQVIpIHNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAocywmc1tqLWldLGkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsgICAgICAgICAgLyogYyBhY3R1YWxseSBtYXRjaGVzIC0tIGNmayAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChDSEFSKSBzW2ldID09IChDSEFSKSAnXDAnKSB7IC8qIE1hdGNoZWQgdG8gZW5kPyAqLworICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkobWF0Y2hidWYsbXNbeV0sTUFUQ0hCVUZTSVopOworICAgICAgICAgICAgICAgICAgICBtYXRjaGluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgeCA9IDE7ICAgICAgICAgICAgICAvKiBZZXMsICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogZG9uZS4gKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWlbeV0gPSBpOyAgICAgICAgICAgICAgLyogTm8sIHJlbWVtYmVyIG1hdGNoLXBvc2l0aW9uICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeCA9PSAxKSB7ICAgICAgICAgICAgICAgLyogU2V0IFx2KG1pbnB1dCkgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgbV9mb3VuZCA9IHkgKyAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisjaWZkZWYgQ0tfQlVSU1QKKyAgICAgICAgZWxzZSBpZiAoeSA8PSAtMSAmJiBidXJzdCA+IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImRvaW5wdXQgKHk8PS0xJiZidXJzdD4wKSIsImJ1cnN0IixidXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYSB0aW1vIG9jY3VycmVkIHNvIHRoZXJlIGNhbid0ICAgKi8KKyAgICAgICAgICAgIGJ1cnN0ID0gMDsgICAgICAgICAgICAgICAgICAvKiBiZSBkYXRhIHdhaXRpbmc7IG11c3QgY2hlY2sgdGltbyAqLworICAgICAgICB9CisgICAgICByZWZpbGw6CisgICAgICAgIGlmIChidXJzdCA8PSAwKSB7ICAgICAgICAgICAgICAgLyogTm8gYnVmZmVyZWQgY2hhcnMgcmVtYWluaW5nLi4uICovCisgICAgICAgICAgICBteWZsc2goKTsgICAgICAgICAgICAgICAgICAgLyogRmx1c2ggYnVmZmVyZWQgb3V0cHV0ICovCisgICAgICAgICAgICBpZiAobG9jYWwpIHsgICAgICAgICAgICAgICAgLyogR2V0IHNpemUgb2YgbmV4dCBpbnB1dCBidXJzdCAqLworICAgICAgICAgICAgICAgIGJ1cnN0ID0gdHRjaGsoKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVyc3QgPCAwKSB7ICAgICAgICAvKiB0dGNoaygpIHNheXMgY29ubmVjdGlvbiBpcyBjbG9zZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgaW5zdGF0dXMgPSBJTlBfSU87ICAvKiBTdGF0dXMgPSBpL28gZXJyb3IgKi8KKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICB0ZXJtX2lvID0gdGVybV9pb19zYXZlOworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworCQkgICAgaWYgKCghbmV0d29yayAKKyNpZmRlZiBUTl9DT01QT1JUCisJCSAgICAgICAgIHx8IGlzdG5jb21wb3J0KCkKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisJCQkgKSAmJiBjYXJyaWVyICE9IENBUl9PRkYpIHsKKwkvKiBUaGUgdGVzdCBpcyB3cml0dGVuIHRoaXMgd2F5IGJlY2F1c2UgdGhlIE1pY3Jvc29mdCBjb21waWxlcgorCSAqIGlzIHByb2R1Y2luZyBiYWQgY29kZSBpZiB3cml0dGVuOgorCSAqCisJICogIGlmIChuZXR3b3JrICYmICghaXN0bmNvbXBvcnQoKSB8fCBjYXJyaWVyID09IENBUl9PRkYpICkKKwkgKi8KKwkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCSBwcmludGYoIkZhdGFsIGVycm9yIC0gZGlzY29ubmVjdGVkLlxuIik7CisJCQkgdHRjbG9zKDEpOworCQkJIGJyZWFrOworCQkgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluaW50cikgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGljbiA9IGNvbmNoaygpKSA+IDApIHsgLyogSW50ZXJydXB0IGZyb20ga2V5Ym9hcmQ/ICovCisgICAgICAgICAgICAgICAgICAgICAgICBrYmNoYXIgPSBjb25pbmMoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJpbnB1dCBpbnRlcnJ1cHRlZCBmcm9tIGtleWJvYXJkIiwiIixpY24pOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0taWNuID4gMCkgY29uaW5jKDApOyAvKiBZZXMsIGFic29yYiBjaGFycy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBBbmQgZmFpbC4gKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVyc3QgPSBjb25jaGsoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImRvaW5wdXQgYnVyc3QiLCIiLGJ1cnN0KTsKKyAgICAgICAgICAgIC8qIFByZXZlbnQgb3ZlcmZsb3cgb2YgImNvbmJ1ZiIgYW5kICJzZXNidWYiICovCisgICAgICAgICAgICBpZiAoYnVyc3QgPiBNQVhCVVJTVCkKKyAgICAgICAgICAgICAgYnVyc3QgPSBNQVhCVVJTVDsKKworICAgICAgICAgICAgLyogRGlkIG5vdCBtYXRjaCwgdGltZXIgZXhjZWVkZWQ/ICovCisgICAgICAgICAgICB0ID0gZ3RpbWVyKCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJkb2lucHV0IGd0aW1lciIsImJ1cnN0Iix0KTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImRvaW5wdXQgdGltbyIsIiIsdGltbyk7CisgICAgICAgICAgICBpZiAoKHQgPj0gdGltbykgJiYgKHRpbW8gPiAwKSkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbHNlIGlmIChpbnNpbGVuY2UgPiAwICYmICh0IC0gbGFzdGNoYXIpID4gaW5zaWxlbmNlKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImRvaW5wdXQgKGJ1cnN0ID4gMCkiLCJidXJzdCIsYnVyc3QpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBteWZsc2goKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsdXNoIGJ1ZmZlcmVkIG91dHB1dCAqLworICAgICAgICAvKiBEaWQgbm90IG1hdGNoLCB0aW1lciBleGNlZWRlZD8gKi8KKyAgICAgICAgdCA9IGd0aW1lcigpOworICAgICAgICBkZWJ1ZyhGMTExLCJkb2lucHV0IGd0aW1lciIsIm5vIGJ1cnN0Iix0KTsKKyAgICAgICAgZGVidWcoRjEwMSwiZG9pbnB1dCB0aW1vIiwiIix0aW1vKTsKKyAgICAgICAgaWYgKCh0ID49IHRpbW8pICYmICh0aW1vID4gLTEpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlIGlmIChpbnNpbGVuY2UgPiAwICYmICh0IC0gbGFzdGNoYXIpID4gaW5zaWxlbmNlKQorICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX0JVUlNUICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RpbGwgaGF2ZSB0aW1lIGxlZnQsIGNvbnRpbnVlLiAqLworICAgIGlmIChub21hdGNoKSB4ID0gMTsJCQkvKiBTdWNjZWVkIGlmIG5vbWF0Y2ggYW5kIHRpbWVkIG91dC4gKi8KKyAgICBteWZsc2goKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbHVzaCBidWZmZXJlZCBvdXRwdXQuICovCisgICAgaWYgKHggPiAwICYmICFub21hdGNoKQorICAgICAgaW5zdGF0dXMgPSAwOworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgdGVybV9pbyA9IHRlcm1faW9fc2F2ZTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIElLU19PUFRJT04KKyNpZmRlZiBDS19BVVRPREwKKyAgICBpZiAoaXNfdG4gJiYgVEVMT1BUX01FKFRFTE9QVF9LRVJNSVQpICYmIGluYXV0b2RsKSB7CisgICAgICAgIHRuX3Npa3MoS0VSTUlUX1NUT1ApOyAgICAgICAgICAgLyogU2VuZCBLZXJtaXQtU2VydmVyIFN0b3AgKi8KKyAgICB9CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisjZW5kaWYgLyogSUtTX09QVElPTiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIEdGVElNRVIKKyAgICBmcHQgPSBnZnRpbWVyKCk7ICAgICAgICAgICAgICAgICAgICAvKiBHZXQgZWxhcHNlZCB0aW1lICovCisKKy8qIElmIGEgbG9uZyBpcyAzMiBiaXRzLCBpdCB3b3VsZCB0YWtlIGFib3V0IDUwIGRheXMgZm9yIHRoaXMgdG8gb3ZlcmZsb3cuICovCisKKyAgICBpbmV0aW1lID0gKGludCkoZnB0ICogKENLRkxPQVQpMTAwMC4wKTsKKyNlbHNlCisgICAgaW5ldGltZSA9IChpbnQpKGd0aW1lcigpICogMTAwMCk7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisgICAgaWYgKCFub21hdGNoKQorICAgICAgbWFrZXN0cigmaW5wbWF0Y2gsJm1hdGNoYnVmW21hdGNoaW5kZXhdKTsgLyogXHYoaW5tYXRjaCkgKi8KKyAgICByZXR1cm4oeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdGhlIHJldHVybiBjb2RlLiAqLworfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9TUEwKKy8qIFJFSU5QVVQgQ29tbWFuZCAqLworCisvKgorICBOb3RlLCB0aGUgdGltZW91dCBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIGJ1dCBpZ25vcmVkLiAgU3ludGF4IGlzIGNvbXBhdGlibGUKKyAgd2l0aCBNUy1ET1MgS2VybWl0IGV4Y2VwdCB0aW1lb3V0IGNhbid0IGJlIG9taXR0ZWQuICBUaGlzIGZ1bmN0aW9uIG9ubHkKKyAgbG9va3MgYXQgdGhlIGNoYXJhY3RlcnMgYWxyZWFkeSByZWNlaXZlZCBhbmQgZG9lcyBub3QgcmVhZCBhbnkgbmV3CisgIGNoYXJhY3RlcnMgZnJvbSB0aGUgY29ubmVjdGlvbi4KKyovCitpbnQKK2RvcmVpbnAodGltbyxzLHBhdCkgaW50IHRpbW87IGNoYXIgKnM7IGludCBwYXQ7IHsKKyAgICBpbnQgeCwgeSwgaTsKKyAgICBjaGFyICp4eCwgKnhwLCAqeHEgPSAoY2hhciAqKTA7CisgICAgQ0hBUiBjOworCisgICAgaWYgKCFzKSBzID0gIiI7CisgICAgZGVidWcoRjEwMSwiZG9yZWlucHV0IHBhdCIsIiIscGF0KTsKKworICAgIHkgPSAoaW50KXN0cmxlbihzKTsKKyAgICBkZWJ1ZyhGMTExLCJkb3JlaW5wdXQgc2VhcmNoIixzLHkpOworCisgICAgaWYgKHkgPiBpbmJ1ZnNpemUpIHsgICAgICAgICAgICAgICAgLyogSWYgc2VhcmNoIHN0cmluZyBsb25nZXIgdGhhbiAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJkb3JlaW5wdXQgaW5idWZzaXplIiwiIixpbmJ1ZnNpemUpOworICAgICAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IGJ1ZmZlciwgZmFpbC4gKi8KKyAgICB9CisgICAgbWFrZXN0cigmaW5wbWF0Y2gsTlVMTCk7CisgICAgaWYgKCFtYXRjaGJ1ZikKKyAgICAgIG1hdGNoYnVmID0gbWFsbG9jKE1BVENIQlVGU0laKzEpOworICAgIG1hdGNoaW5kZXggPSAwOworCisgICAgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGNvZGUsIGFzc3VtZSBmYWlsdXJlICovCisgICAgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RyaW5nIHBhdHRlcm4gbWF0Y2ggcG9zaXRpb24gKi8KKworICAgIGlmICghaW5wY2FzW2NtZGx2bF0pIHsgICAgICAgICAgICAgIC8qIElOUFVUIENBU0UgPSBJR05PUkU/ICAqLworICAgICAgICB4cCA9IG1hbGxvYyh5KzIpOyAgICAgICAgICAgICAgIC8qIE1ha2UgYSBzZXBhcmF0ZSBjb3B5IG9mIHRoZSAqLworICAgICAgICBpZiAoIXhwKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNlYXJjaCBzdHJpbmcuICovCisgICAgICAgICAgICBwcmludGYoIj9tYWxsb2MgZXJyb3IgNlxuIik7CisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIH0gZWxzZSB4cSA9IHhwOyAgICAgICAgICAgICAgICAgLyogS2VlcCBwb2ludGVyIHRvIGJlZ2lubmluZy4gKi8KKyAgICAgICAgd2hpbGUgKCpzKSB7ICAgICAgICAgICAgICAgICAgICAvKiBZZXMsIGNvbnZlcnQgdG8gbG93ZXJjYXNlICovCisgICAgICAgICAgICAqeHAgPSAqczsKKyAgICAgICAgICAgIGlmIChpc3VwcGVyKCp4cCkpICp4cCA9IChjaGFyKSB0b2xvd2VyKCp4cCk7CisgICAgICAgICAgICB4cCsrOyBzKys7CisgICAgICAgIH0KKyAgICAgICAgKnhwID0gTlVMOyAgICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hdGUgaXQhICovCisgICAgICAgIHMgPSB4cTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW92ZSBzZWFyY2ggcG9pbnRlciB0byBpdC4gKi8KKyAgICB9CisgICAgeHggPSAqaW5wYnAgPyBpbnBicCA6IGlucGJ1ZjsgICAgICAgLyogQ3VycmVudCBJTlBVVCBidWZmZXIgcG9pbnRlciAqLworICAgIGRvIHsKKyAgICAgICAgYyA9ICp4eCsrOyAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgbmV4dCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgaWYgKCFjKSBicmVhazsKKyAgICAgICAgaWYgKHh4ID49IGlucGJ1ZiArIGluYnVmc2l6ZSkgICAvKiBXcmFwIGFyb3VuZCBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgICB4eCA9IGlucGJ1ZjsKKyAgICAgICAgaWYgKCFpbnBjYXNbY21kbHZsXSkgeyAgICAgICAgICAvKiBJZ25vcmUgYWxwaGFiZXRpYyBjYXNlPyAqLworICAgICAgICAgICAgaWYgKGlzdXBwZXIoYykpIGMgPSAoQ0hBUikgdG9sb3dlcihjKTsgLyogWWVzICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhdCkgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBpZiAobWF0Y2hidWYpIHsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmRleCA8IE1BVENIQlVGU0laKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoYnVmW21hdGNoaW5kZXgrK10gPSBjOworICAgICAgICAgICAgICAgICAgICBtYXRjaGJ1ZlttYXRjaGluZGV4XSA9IE5VTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1hdGNoaW5kZXg7IGorKykgeyAvKiBHcm9zcyBidXQgZWZmZWN0aXZlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChja21hdGNoKHMsJm1hdGNoYnVmW2pdLDEsMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsIkdPVCBJVCIsIiIsaik7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGluZGV4ID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeCA+IDApCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjAwMCwiZG9yZWlucCBjaGFyIiwiIixjKTsKKyAgICAgICAgZGVidWcoRjAwMCwiY29tcGFyZSBjaGFyIiwiIiwoQ0hBUikgc1tpXSk7CisgICAgICAgIGlmICgoKGNoYXIpIGMpID09ICgoY2hhcikgc1tpXSkpIHsgLyogQ2hlY2sgZm9yIG1hdGNoICovCisgICAgICAgICAgICBpKys7ICAgICAgICAgICAgICAgICAgICAgICAgLyogR290IG9uZSwgZ28gdG8gbmV4dCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBoYXZlIGEgbWF0Y2ggKi8KKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgZm9yIChqID0gaTsgaSA+IDA7ICkgeyAgICAgIC8qIFtqcnNdIHNlYXJjaCBiYWNrd2FyZHMgZm9yIGl0ICAqLworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICBpZiAoKChjaGFyKSBjKSA9PSAoKGNoYXIpIHNbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChzLCZzW2otaV0saSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtqcnNdIG9yIHJldHVybiB0byB6ZXJvIGZyb20gLTEgKi8KKyAgICAgICAgaWYgKHNbaV0gPT0gJ1wwJykgeyAgICAgICAgICAgICAvKiBNYXRjaGVkIGFsbCB0aGUgd2F5IHRvIGVuZD8gKi8KKyAgICAgICAgICAgIGNrc3RybmNweShtYXRjaGJ1ZixzLE1BVENIQlVGU0laKTsKKyAgICAgICAgICAgIG1hdGNoaW5kZXggPSAwOworICAgICAgICAgICAgeCA9IDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIFllcywgKi8KKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAvKiBkb25lLiAqLworICAgICAgICB9CisgICAgfSB3aGlsZSAoeHggIT0gaW5wYnAgJiYgeCA8IDEpOyAgICAgLyogVW50aWwgYmFjayB3aGVyZSB3ZSBzdGFydGVkLiAqLworCisgICAgaWYgKCFpbnBjYXNbY21kbHZsXSkgaWYgKHhxKSBmcmVlKHhxKTsgLyogRnJlZSB0aGlzIGlmIGl0IHdhcyBtYWxsb2MnZC4gKi8KKyAgICBtYWtlc3RyKCZpbnBtYXRjaCwmbWF0Y2hidWZbbWF0Y2hpbmRleF0pOyAvKiBcdihpbm1hdGNoKSAqLworICAgIHJldHVybih4KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBzZWFyY2ggcmVzdWx0LiAqLworfQorCisvKiAgWCBYIFMgVCBSIEkgTiBHICAtLSAgSW50ZXJwcmV0IHN0cmluZ3MgY29udGFpbmluZyBiYWNrc2xhc2ggZXNjYXBlcyAgKi8KKy8qICBaIFogUyBUIFIgSSBOIEcgIC0tICAobmV3IG5hbWUuLi4pICAqLworLyoKKyBDb3BpZXMgcmVzdWx0IHRvIG5ldyBzdHJpbmcuCisgIHN0cmlwcyBlbmNsb3NpbmcgYnJhY2VzIG9yIGRvdWJsZXF1b3Rlcy4KKyAgaW50ZXJwcmV0cyBiYWNrc2xhc2ggZXNjYXBlcy4KKyAgcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZmFpbHVyZS4KKyAgdHJpZXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIE1TLURPUyBLZXJtaXQuCisKKyBTeW50YXggb2YgaW5wdXQgc3RyaW5nOgorICBzdHJpbmcgPSBjaGFycyB8ICJjaGFycyIgfCB7Y2hhcnN9CisgIGNoYXJzID0gKGMqZSopKgorICB3aGVyZSBjID0gYW55IHByaW50YWJsZSBjaGFyYWN0ZXIsIGFzY2lpIDMyLTEyNgorICBhbmQgZSA9IGEgYmFja3NsYXNoIGVzY2FwZQorICBhbmQgKiBtZWFucyAwIG9yIG1vcmUgcmVwZXRpdGlvbnMgb2YgcHJlY2VkaW5nIHF1YW50aXR5CisgIGJhY2tzbGFzaCBlc2NhcGUgPSBcb3BlcmFuZAorICBvcGVyYW5kID0ge251bWJlcn0gfCBudW1iZXIgfCBmbmFtZShvcGVyYW5kKSB8IHYobmFtZSkgfCAkKG5hbWUpIHwgbShuYW1lKQorICBudW1iZXIgPSBbcl1uW25bbl1dXSwgaS5lLiBhbiBvcHRpb25hbCByYWRpeCBjb2RlIGZvbGxvd2VkIGJ5IDEtMyBkaWdpdHMKKyAgcmFkaXggY29kZSBpcyBvTyAob2N0YWwpLCB4WCAoaGV4KSwgZEQgb3Igbm9uZSAoZGVjaW1hbCkgKHNlZSB4eGVzYygpKS4KKyovCisKKyNpZm5kZWYgTk9GUklMTFMKK2ludAoreXlzdHJpbmcocyxzMikgY2hhciAqczsgY2hhciAqKnMyOyB7ICAgIC8qIFJldmVyc2UgYSBzdHJpbmcgKi8KKyAgICBpbnQgeDsKKyAgICBzdGF0aWMgY2hhciAqbmV3OworICAgIG5ldyA9ICpzMjsKKyAgICBpZiAoIXMgfHwgIW5ldykgcmV0dXJuKC0xKTsgICAgICAgICAvKiBXYXRjaCBvdXQgZm9yIG51bGwgcG9pbnRlcnMuICovCisgICAgaWYgKCh4ID0gKGludClzdHJsZW4ocykpID09IDApIHsgICAgLyogUmVjdXJzaW9uIGRvbmUuICovCisgICAgICAgICpuZXcgPSAnXDAnOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIHgtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSwgY2FsbCBzZWxmICovCisgICAgKm5ldysrID0gc1t4XTsgICAgICAgICAgICAgICAgICAgICAgLyogdG8gcmV2ZXJzZSByZXN0IG9mIHN0cmluZy4gKi8KKyAgICBzW3hdID0gMDsKKyAgICByZXR1cm4oeXlzdHJpbmcocywmbmV3KSk7Cit9CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworc3RhdGljIGNoYXIgaXBhYnVmWzE2XSA9IHsgTlVMIH07ICAgICAgIC8qIElQIGFkZHJlc3MgYnVmZmVyICovCisKK3N0YXRpYyBjaGFyICoKK2dldGlwKHMpIGNoYXIgKnM7IHsKKyAgICBjaGFyIGM9TlVMOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXb3JrZXJzLi4uICovCisgICAgaW50IGk9MCwgcD0wLCBkPTA7CisgICAgaW50IHN0YXRlID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogU3RhdGUgb2YgMi1zdGF0ZSBGU0EgKi8KKworICAgIHdoaWxlICgoYyA9ICpzKyspKSB7CisgICAgICAgIHN3aXRjaChzdGF0ZSkgeworICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgZmlyc3QgZGlnaXQgKi8KKyAgICAgICAgICAgIGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyIGluZGV4ICovCisgICAgICAgICAgICBpcGFidWZbaV0gPSBOVUw7ICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICBwID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogUGVyaW9kIGNvdW50ZXIgKi8KKyAgICAgICAgICAgIGQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBEaWdpdCBjb3VudGVyICovCisgICAgICAgICAgICBpZiAoaXNkaWdpdChjKSkgeyAgICAgICAgICAgLyogSGF2ZSBmaXJzdCBkaWdpdCAqLworICAgICAgICAgICAgICAgIGQgPSAxOyAgICAgICAgICAgICAgICAgIC8qIENvdW50IGl0ICovCisgICAgICAgICAgICAgICAgaXBhYnVmW2krK10gPSBjOyAgICAgICAgLyogQ29weSBpdCAqLworICAgICAgICAgICAgICAgIHN0YXRlID0gMTsgICAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAvKiBJbiBudW1lcmljIGZpZWxkICovCisgICAgICAgICAgICBpZiAoaXNkaWdpdChjKSkgeyAgICAgICAgICAgLyogSGF2ZSBkaWdpdCAqLworICAgICAgICAgICAgICAgIGlmICgrK2QgPiAzKSAgICAgICAgICAgIC8qIFRvbyBtYW55ICovCisgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7ICAgICAgICAgICAgLyogU3RhcnQgb3ZlciAqLworICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIC8qIE5vdCB0b28gbWFueSAqLworICAgICAgICAgICAgICAgICAgaXBhYnVmW2krK10gPSBjOyAgICAgIC8qIEtlZXAgaXQgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnLicgJiYgcCA8IDMpIHsgLyogSGF2ZSBhIHBlcmlvZCAqLworICAgICAgICAgICAgICAgIHArKzsgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IGl0ICovCisgICAgICAgICAgICAgICAgaWYgKGQgPT0gMCkgICAgICAgICAgICAgLyogTm90IHByZWNlZGVkIGJ5IGEgZGlnaXQgKi8KKyAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDsgICAgICAgICAgICAvKiBTdGFydCBvdmVyICovCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgLyogT0sgKi8KKyAgICAgICAgICAgICAgICAgIGlwYWJ1ZltpKytdID0gYzsgICAgICAvKiBLZWVwIGl0ICovCisgICAgICAgICAgICAgICAgZCA9IDA7ICAgICAgICAgICAgICAgICAgLyogUmVzZXQgZGlnaXQgY291bnRlciAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChwID09IDMgJiYgZCA+IDApIHsgLyogTm90IHBhcnQgb2YgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgIGlwYWJ1ZltpXSA9IE5VTDsgICAgICAgIC8qIElmIHdlIGhhdmUgZnVsbCBJUCBhZGRyZXNzICovCisgICAgICAgICAgICAgICAgcmV0dXJuKChjaGFyICopaXBhYnVmKTsgLyogUmV0dXJuIGl0ICovCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlICovCisgICAgICAgICAgICAgICAgc3RhdGUgPSAwOyAgICAgICAgICAgICAgLyogU3RhcnQgb3ZlciAqLworICAgICAgICAgICAgICAgIGlwYWJ1ZlswXSA9IE5VTDsgICAgICAgIC8qIChpbiBjYXNlIG5vIG1vcmUgY2hhcnMgbGVmdCkgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhbGwgdGhydSBhdCBlbmQgb2Ygc3RyaW5nICovCisgICAgaXBhYnVmW2ldID0gTlVMOyAgICAgICAgICAgICAgICAgICAgLyogTWF5YmUgd2UgaGF2ZSBvbmUgKi8KKyAgICByZXR1cm4oKHAgPT0gMyAmJiBkID4gMCkgPyAoY2hhciAqKWlwYWJ1ZiA6ICIiKTsKK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCisvKiBEYXRlIFJvdXRpbmVzICovCisKKy8qIFogSiBEIEEgVCBFICAtLSAgQ29udmVydCB5eXl5bW1kZCBkYXRlIHRvIERheSBvZiBZZWFyICovCisKK3N0YXRpYyBpbnQgamRheXNbMTJdID0geyAgMCwzMSw1OSw5MCwxMjAsMTUxLDE4MSwyMTIsMjQzLDI3MywzMDQsMzM0IH07CitzdGF0aWMgaW50IGxkYXlzWzEyXSA9IHsgIDAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNSB9Oworc3RhdGljIGNoYXIgempkYnVmWzEyXSA9IHsgTlVMLCBOVUwgfTsKKy8qCisgIERlaW5kZSwgbmUgaW4gcG9zdGVydW0gYSBYSUkga2FsZW5kYXMgYXByaWxpcyBhZXF1aW5vY3RpdW0gcmVjZWRhdCwKKyAgc3RhdHVpbXVzIGJpc3NleHR1bSBxdWFydG8gcXVvcXVlIGFubm8gKHV0aSBtb3MgZXN0KSBjb250aW51YXJpIGRlYmVyZSwKKyAgcHJhZXRlcnF1YW0gaW4gY2VudGVzaW1pcyBhbm5pczsgcXVpLCBxdWFtdmlzIGJpc3NleHRpbGVzIGFudGVhIHNlbXBlcgorICBmdWVyaW50LCBxdWFsZW0gZXRpYW0gZXNzZSB2b2x1bXVzIGFubnVtIE1EQywgcG9zdCBldW0gdGFtZW4gcXVpIGRlaW5jZXBzCisgIGNvbnNlcXVlbnR1ciBjZW50ZXNpbWkgbm9uIG9tbmVzIGJpc3NleHRpbGVzIHNpbnQsIHNlZCBpbiBxdWFkcmluZ2VudGlzCisgIHF1aWJ1c3F1ZSBhbm5pcyBwcmltaSBxdWlxdWUgdHJlcyBjZW50ZXNpbWkgc2luZSBiaXNzZXh0byB0cmFuc2lnYW50dXIsCisgIHF1YXJ0dXMgdmVybyBxdWlzcXVlIGNlbnRlc2ltdXMgYmlzc2V4dGlsaXMgc2l0LCBpdGEgdXQgYW5udXMgTURDQywgTURDQ0MsCisgIE1EQ0NDQyBiaXNzZXh0aWxlcyBub24gc2ludC4gQW5ubyB2ZXJvIE1NLCBtb3JlIGNvbnN1ZXRvIGRpZXMgYmlzc2V4dHVzCisgIGludGVyY2FsZXR1ciwgZmVicnVhcmlvIGRpZXMgWFhJWCBjb250aW5lbnRlLCBpZGVtcXVlIG9yZG8gaW50ZXJtaXR0ZW5kaQorICBpbnRlcmNhbGFuZGlxdWUgYmlzc2V4dHVtIGRpZW0gaW4gcXVhZHJpbmdlbnRpcyBxdWlidXNxdWUgYW5uaXMgcGVycGV0dW8KKyAgY29uc2VydmV0dXIuICAtIEdyZWdvcml1cyBYSUlJLCBBbm5vIERvbWluaSBNRExYWFhJSS4KKyovCitjaGFyICoKK3pqZGF0ZShkYXRlKSBjaGFyICogZGF0ZTsgeyAgICAgICAgICAgICAvKiBkYXRlID0geXl5eW1tZGQgKi8KKyAgICBjaGFyIHllYXJbNV07CisgICAgY2hhciBtb250aFszXTsKKyAgICBjaGFyIGRheVszXTsKKyAgICBpbnQgZCwgbSwgeCwgeTsKKyAgICBpbnQgbGVhcGRheSwgajsKKyAgICBjaGFyICogdGltZSA9IE5VTEw7CisKKyAgICBpZiAoIWRhdGUpIGRhdGUgPSAiIjsgICAgICAgICAgICAgICAvKiBWYWxpZGF0ZSBhcmcgKi8KKyAgICB4ID0gc3RybGVuKGRhdGUpOworICAgIGlmICh4IDwgMSkgcmV0dXJuKCIwIik7CisgICAgaWYgKHggPCA4KSByZXR1cm4oIi0xIik7CisgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgIGlmICghaXNkaWdpdChkYXRlW3hdKSkKKyAgICAgICAgcmV0dXJuKCItMSIpOworCisgICAgaWYgKGRhdGVbOF0pIGlmIChkYXRlWzldKQorICAgICAgdGltZSA9IGRhdGUgKyA5OworCisgICAgeWVhclswXSA9IGRhdGVbMF07ICAgICAgICAgICAgICAgICAgLyogSXNvbGF0ZSB5ZWFyICovCisgICAgeWVhclsxXSA9IGRhdGVbMV07CisgICAgeWVhclsyXSA9IGRhdGVbMl07CisgICAgeWVhclszXSA9IGRhdGVbM107CisgICAgeWVhcls0XSA9ICdcMCc7CisKKyAgICBtb250aFswXSA9IGRhdGVbNF07ICAgICAgICAgICAgICAgICAvKiBNb250aCAqLworICAgIG1vbnRoWzFdID0gZGF0ZVs1XTsKKyAgICBtb250aFsyXSA9ICdcMCc7OworCisgICAgZGF5WzBdID0gZGF0ZVs2XTsgICAgICAgICAgICAgICAgICAgLyogQW5kIGRheSAqLworICAgIGRheVsxXSA9IGRhdGVbN107CisgICAgZGF5WzJdID0gJ1wwJzsKKworICAgIGxlYXBkYXkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzc3VtZSBubyBsZWFwIGRheSAqLworICAgIHkgPSBhdG9pKHllYXIpOworICAgIG0gPSBhdG9pKG1vbnRoKTsKKyAgICBkID0gYXRvaShkYXkpOworICAgIGlmIChtID4gMikgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIExlYXAgZGF5IGJlZm9yZSBNYXJjaCAqLworICAgICAgICBpZiAoeSAlIDQgPT0gMCkgeyAgICAgICAgICAgICAgIC8qIElmIHllYXIgaXMgZGl2aXNpYmxlIGJ5IDQgKi8KKyAgICAgICAgICAgIGxlYXBkYXkgPSAxOyAgICAgICAgICAgICAgICAvKiBJdCdzIGEgTGVhcCB5ZWFyICovCisgICAgICAgICAgICBpZiAoeSAlIDEwMCA9PSAwKSB7ICAgICAgICAgLyogRXhjZXB0IGlmIGRpdmlzaWJsZSBieSAxMDAgKi8KKyAgICAgICAgICAgICAgICBpZiAoeSAlIDQwMCAhPSAwKSAgICAgICAvKiBidXQgbm90IGJ5IDQwMCAqLworICAgICAgICAgICAgICAgICAgbGVhcGRheSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaiA9IGpkYXlzW20gLSAxXSArIGQgKyBsZWFwZGF5OyAgICAgLyogRGF5IG9mIHllYXIgKi8KKyAgICBpZiAodGltZSkKKyAgICAgIHNwcmludGYoempkYnVmLCIlMDRkJTAzZCAlcyIseSxqLHRpbWUpOyAvKiBTQUZFICovCisgICAgZWxzZQorICAgICAgc3ByaW50Zih6amRidWYsIiUwNGQlMDNkIix5LGopOyAgIC8qIFNBRkUgKi8KKyAgICByZXR1cm4oKGNoYXIgKil6amRidWYpOworfQorCitzdGF0aWMgY2hhciBqemRidWZbMzJdOworCisvKiBKIFogRCBBIFQgRSAgLS0gIENvbnZlcnQgRGF5IG9mIFllYXIgdG8geXl5eWRkbW0gZGF0ZSAqLworCitjaGFyICoKK2p6ZGF0ZShkYXRlKSBjaGFyICogZGF0ZTsgeyAgICAgICAgICAgICAvKiBkYXRlID0geXl5eWRkZCAqLworICAgIGNoYXIgeWVhcls1XTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpdGggb3B0aW9uYWwgdGltZSAqLworICAgIGNoYXIgZGF5WzRdOworICAgIGNoYXIgKiB0aW1lID0gTlVMTCwgKiBwOworICAgIGludCBkLCBtLCB4LCB5OworICAgIGludCBsZWFwZGF5LCBqOworICAgIGludCAqIHp6OworCisgICAgaWYgKCFkYXRlKSBkYXRlID0gIiI7ICAgICAgICAgICAgICAgLyogVmFsaWRhdGUgYXJnICovCisgICAgeCA9IHN0cmxlbihkYXRlKTsKKworICAgIGRlYnVnKEYxMTEsImp6ZGF0ZSBsZW4iLGRhdGUseCk7CisKKyAgICBpZiAoeCA8IDEpIHJldHVybigiMCIpOworICAgIGlmICh4IDwgNykgcmV0dXJuKCItMSIpOworICAgIGlmICh4ID4gOCkgdGltZSA9IGRhdGUgKyA4OworCisgICAgZm9yICh4ID0gMDsgeCA8IDc7IHgrKykKKyAgICAgIGlmICghaXNkaWdpdChkYXRlW3hdKSkKKyAgICAgICAgcmV0dXJuKCItMSIpOworCisgICAgeWVhclswXSA9IGRhdGVbMF07ICAgICAgICAgICAgICAgICAgLyogSXNvbGF0ZSB5ZWFyICovCisgICAgeWVhclsxXSA9IGRhdGVbMV07CisgICAgeWVhclsyXSA9IGRhdGVbMl07CisgICAgeWVhclszXSA9IGRhdGVbM107CisgICAgeWVhcls0XSA9ICdcMCc7CisKKyAgICBkZWJ1ZyhGMTEwLCJqemRhdGUgeWVhciIseWVhciwwKTsKKworICAgIGRheVswXSA9IGRhdGVbNF07ICAgICAgICAgICAgICAgICAgIC8qIEFuZCBkYXkgKi8KKyAgICBkYXlbMV0gPSBkYXRlWzVdOworICAgIGRheVsyXSA9IGRhdGVbNl07CisgICAgZGF5WzNdID0gJ1wwJzsKKworICAgIGRlYnVnKEYxMTAsImp6ZGF0ZSBkYXkiLGRheSwwKTsKKworICAgIGogPSBhdG9pKGRheSk7CisgICAgaWYgKGogPiAzNjYpCisgICAgICByZXR1cm4oIi0xIik7CisKKyAgICBsZWFwZGF5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBc3N1bWUgbm8gbGVhcCBkYXkgKi8KKyAgICB5ID0gYXRvaSh5ZWFyKTsKKyAgICBpZiAoeSAlIDQgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAvKiBJZiB5ZWFyIGlzIGRpdmlzaWJsZSBieSA0ICovCisgICAgICAgIGxlYXBkYXkgPSAxOyAgICAgICAgICAgICAgICAgICAgLyogSXQncyBhIExlYXAgeWVhciAqLworICAgICAgICBpZiAoeSAlIDEwMCA9PSAwKSB7ICAgICAgICAgICAgIC8qIEV4Y2VwdCBpZiBkaXZpc2libGUgYnkgMTAwICovCisgICAgICAgICAgICBpZiAoeSAlIDQwMCAhPSAwKSAgICAgICAgICAgLyogYnV0IG5vdCBieSA0MDAgKi8KKyAgICAgICAgICAgICAgbGVhcGRheSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVidWcoRjEwMSwianpkYXRlIGxlYXBkYXkiLCIiLGxlYXBkYXkpOworICAgIHp6ID0gbGVhcGRheSA/IGxkYXlzIDogamRheXM7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgMTE7IHgrKykKKyAgICAgIGlmIChqID4genpbeF0gJiYgaiA8PSB6elt4KzFdKQorICAgICAgICBicmVhazsKKyAgICBtID0geCArIDE7CisKKyAgICBkZWJ1ZyhGMTAxLCJqemRhdGUgbSIsIiIsbSk7CisKKyAgICBkID0gaiAtIHp6W3hdOworCisgICAgZGVidWcoRjEwMSwianpkYXRlIGQiLCIiLGQpOworCisgICAgaWYgKHRpbWUpCisgICAgICBzcHJpbnRmKGp6ZGJ1ZiwiJTA0ZCUwMmQlMDJkICVzIix5LG0sZCx0aW1lKTsgLyogU0FGRSAqLworICAgIGVsc2UKKyAgICAgIHNwcmludGYoanpkYnVmLCIlMDRkJTAyZCUwMmQiLHksbSxkKTsgLyogU0FGRSAqLworCisgICAgZGVidWcoRjEwMSwianpkYXRlIGp6ZGJ1ZiIsanpkYnVmLDApOworCisgICAgcCA9IGNrY3Z0ZGF0ZSgoY2hhciAqKWp6ZGJ1ZiwgMCk7ICAgLyogQ29udmVydCB0byBzdGFuZGFyZCBmb3JtICovCisgICAgY2tzdHJuY3B5KGp6ZGJ1ZixwLDMyKTsKKyAgICBpZiAoIXRpbWUpIGp6ZGJ1Zls4XSA9IE5VTDsgICAgICAgICAvKiBSZW1vdmUgdGltZSBpZiBub3Qgd2FudGVkICovCisgICAgcmV0dXJuKChjaGFyICopanpkYnVmKTsKK30KKworLyogTSBKIEQgIC0tICBNb2RpZmllZCBKdWxpYW4gRGF0ZSAqLworLyoKKyAgQ2FsbCB3aXRoOgorICAgIFN0YW5kYXJkLWZvcm1hdCBkYXRlLXRpbWUgc3RyaW5nOiB5eXl5bW1kZFsgaGg6bW06c3NdLgorICAgIFRoZSB0aW1lLCBpZiBhbnksIGlzIGlnbm9yZWQuCisKKyAgUmV0dXJuczoKKyAgICAtMUwgb24gZXJyb3IsIG90aGVyd2lzZToKKyAgICBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgMTcgTm92IDE4NTggYXMgYSB3aG9sZSBudW1iZXI6CisgICAgMTYgTm92IDE4NTggPSAtMSwgMTcgTm92IDE4NTggPSAwLCAxOCBOb3YgMTg1OCA9IDEsIDE5IE5vdiAxODU4ID0gMiwgLi4uCisKKyAgVGhlIE1vZGlmaWVkIEp1bGlhbiBEYXRlIGlzIGRlZmluZWQgYnkgdGhlIEludGVybmF0aW9uYWwgQXN0cm9ub21pY2FsCisgIFVuaW9uIGFzIHRoZSB0cnVlIEp1bGlhbiBkYXRlIG1pbnVzIDI0MDAwMDAuNSBkYXlzLiAgVGhlIHRydWUgSnVsaWFuCisgIGRhdGUgaXMgdGhlIG51bWJlciBkYXlzIHNpbmNlIHNpbmNlIG5vb24gb2YgMSBKYW51YXJ5IDQ3MTMgQkNFIG9mIHRoZQorICBKdWxpYW4gcHJvbGVwdGljIGNhbGVuZGFyLiAgQ29udmVyc2lvbnMgYmV0d2VlbiBjYWxlbmRhciBkYXRlcyBhbmQKKyAgSnVsaWFuIGRhdGVzLCBob3dldmVyLCBhc3N1bWUgR3JlZ29yaWFuIGRhdGluZy4KKyovCitsb25nCittamQoZGF0ZSkgY2hhciAqIGRhdGU7IHsKKyAgICBjaGFyIHllYXJbNV07CisgICAgY2hhciBtb250aFszXTsKKyAgICBjaGFyIGRheVszXTsKKyAgICBpbnQgeCwgYSwgZCwgbSwgeTsKKyAgICBsb25nIHo7CisKKyAgICBpZiAoIWRhdGUpIGRhdGUgPSAiIjsgICAgICAgICAgICAgICAvKiBWYWxpZGF0ZSBhcmcgKi8KKyAgICB4ID0gc3RybGVuKGRhdGUpOworICAgIGlmICh4IDwgMSkgcmV0dXJuKDBMKTsKKyAgICBpZiAoeCA8IDgpIHJldHVybigtMUwpOworICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICBpZiAoIWlzZGlnaXQoZGF0ZVt4XSkpCisgICAgICAgIHJldHVybigtMUwpOworCisgICAgeWVhclswXSA9IGRhdGVbMF07ICAgICAgICAgICAgICAgICAgLyogSXNvbGF0ZSB5ZWFyICovCisgICAgeWVhclsxXSA9IGRhdGVbMV07CisgICAgeWVhclsyXSA9IGRhdGVbMl07CisgICAgeWVhclszXSA9IGRhdGVbM107CisgICAgeWVhcls0XSA9ICdcMCc7CisKKyAgICBtb250aFswXSA9IGRhdGVbNF07ICAgICAgICAgICAgICAgICAvKiBNb250aCAqLworICAgIG1vbnRoWzFdID0gZGF0ZVs1XTsKKyAgICBtb250aFsyXSA9ICdcMCc7OworICAgIG0gPSBhdG9pKG1vbnRoKTsKKworICAgIGRheVswXSA9IGRhdGVbNl07ICAgICAgICAgICAgICAgICAgIC8qIEFuZCBkYXkgKi8KKyAgICBkYXlbMV0gPSBkYXRlWzddOworICAgIGRheVsyXSA9ICdcMCc7CisgICAgZCA9IGF0b2koZGF5KTsKKworICAgIGEgPSAoMTQtbSkvMTI7ICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0cnVlIEp1bGlhbiBkYXRlICovCisgICAgeSA9IGF0b2koeWVhcikgKyA0ODAwIC0gYTsKKyAgICBtID0gbSArIDEyICogYSAtIDM7CisgICAgeiA9IGQgKyAobG9uZykoMzA2Km0rNSkvMTAgKyAobG9uZykoeSozNjUpICsgeS80IC0geS8xMDAgKyB5LzQwMCAtIDMyMDQ1TDsKKworICAgIHogLT0gMjQwMDAwMUw7ICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgSkQgdG8gTUpEICovCisKKyAgICByZXR1cm4oeik7Cit9CisKK3N0YXRpYyBjaGFyIG1qZDJkYnVmWzMyXTsKKworLyogIE0gSiBEIDIgRCBBIFQgRSAgLS0gIENvbnZlcnRzIE1KRCB0byB5eXl5bW1kZCAgKi8KKworY2hhciAqCisjaWZkZWYgQ0tfQU5TSUMKK21qZDJkYXRlKGxvbmcgbWpkKQorI2Vsc2UKK21qZDJkYXRlKG1qZCkgbG9uZyBtamQ7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIG1qZDJkYXRlICovIHsKKyAgICBsb25nIGpkLCBsLCBuOworICAgIGludCBkLCBtLCB5OworICAgIGpkID0gKGxvbmcpKG1qZCArIDI0MDAwMDFMKTsKKyAgICBsID0gamQgKyA2ODU2OTsKKyAgICBuID0gNCAqIGwgLyAxNDYwOTdMOworICAgIGwgPSBsIC0gKDE0NjA5NyAqIG4gKyAzKSAvIDQ7CisgICAgeSA9IDQwMDAgKiAobCArIDEpIC8gMTQ2MTAwMUw7CisgICAgbCA9IGwgLSAxNDYxICogeSAvIDQgKyAzMTsKKyAgICBtID0gODAgKiBsIC8gMjQ0NzsKKyAgICBkID0gbCAtIDI0NDcgKiBtIC8gODA7CisgICAgbCA9IG0gLyAxMTsKKyAgICBtID0gbSArIDIgLSAxMiAqIGw7CisgICAgeSA9IDEwMCAqIChuIC0gNDkpICsgeSArIGw7CisgICAgc3ByaW50ZihtamQyZGJ1ZiwiJTA0ZCUwMmQlMDJkIix5LG0sZCk7IC8qIFNBRkUgKi8KKyAgICByZXR1cm4oKGNoYXIgKiltamQyZGJ1Zik7Cit9CisKKyNpZm5kZWYgTk9TUEwKK3N0YXRpYyBjaGFyICoqIGZsaXN0ID0gKGNoYXIgKiopIE5VTEw7ICAvKiBGaWxlIGxpc3QgZm9yIFxmbmV4dGZpbGUoKSAqLworc3RhdGljIGludCBmbGlzdG4gPSAwOyAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpdGVtcyBpbiBmaWxlIGxpc3QgKi8KKworLyoKKyAgVGhlIGZ1bmN0aW9uIHJldHVybi12YWx1ZSBidWZmZXIgbXVzdCBiZSBnbG9iYWwsIHNpbmNlIGZuZXZhbCgpIHJldHVybnMgYQorICBwb2ludGVyIHRvIGl0LiAgZm5ldmFsKCkgaXMgY2FsbGVkIG9ubHkgYnkgenpzdHJpbmcoKSwgd2hpY2ggYWx3YXlzIGNvcGllcworICB0aGUgcmVzdWx0IG91dCBvZiB0aGlzIGJ1ZmZlciB0byBzb21ld2hlcmUgZWxzZSwgc28gaXQncyBPSyB0byBoYXZlIG9ubHkKKyAgb25lIGJ1ZmZlciBmb3IgdGhpcyBpbiBtb3N0IGNhc2VzLiAgSG93ZXZlciwgc2luY2UgZnVuY3Rpb24gY2FsbHMgY2FuIGJlCisgIG5lc3RlZCAtLSBlLmcuIGZ1bmN0aW9ucyB3aG9zZSBhcmd1bWVudHMgYXJlIGZ1bmN0aW9ucywgb3IgcmVjdXJzaXZlCisgIGZ1bmN0aW9ucywgYXQgc29tZSBwb2ludCB3ZSBzaG91bGQgY29udmVydCB0aGlzIHRvIGFuIGFycmF5IG9mIGJ1ZmZlcnMsCisgIGluZGV4ZWQgYnkgZnVuY3Rpb24gZGVwdGggKHdoaWNoIG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUKKyAgImRlcHRoIiB2YXJpYWJsZSkuICBBbHNvLCBzaW5jZSBmdW5jdGlvbiByZXN1bHRzIGFyZSBwb3RlbnRpYWxseSBxdWl0ZSBiaWcsCisgIHdlJ2QgbmVlZCB0byBhbGxvY2F0ZSBhbmQgZGVhbGxvY2F0ZSBkeW5hbWljYWxseSBhcyB3ZSBkZXNjZW5kIGFuZCBhc2NlbmQKKyAgZnVuY3Rpb24gZGVwdGguICBMZWZ0IGZvciBhIGZ1dHVyZSByZWxlYXNlLi4uCisqLworY2hhciBmbnZhbFtGTlZBTEwrMl07ICAgICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIHJldHVybiB2YWx1ZSAgKi8KK3N0YXRpYyBpbnQgZm5kZXB0aCA9IDA7ICAgICAgICAgICAgICAgICAvKiAod2UgZG9uJ3QgYWN0dWFsbHkgdXNlIHRoaXMgeWV0KSAqLworaW50IGZuc3VjY2VzcyA9IDE7CitleHRlcm4gaW50IGZuZXJyb3I7CisKKy8qIGYgcCBmIG8gciBtIGEgdCAgLS0gIEZsb2F0aW5nLXBvaW50IG51bWJlciBuaWNlbHkgZm9ybWF0dGVkLiAgKi8KKy8qCisgICBSZXR1cm5zIHJlc3VsdHMgZnJvbSBhIGNpcmN1bGFyIDFLIGJ1ZmZlci4KKyAgIERvbid0IGNvdW50IG9uIHRvbyBtYW55IHJlc3VsdHMgcmVtYWluaW5nIGF2YWlsYWJsZSBhdCBvbmNlOyBpdCBjb3VsZAorICAgYmUgYW55d2hlcmUgZnJvbSA1IHRvIG1heWJlIDEwMCwgZGVwZW5kaW5nIG9uIHRoZSBzaXplcyBvZiB0aGUgcmVzdWx0cy4KKyovCisjaWZkZWYgQ0tGTE9BVAorI2RlZmluZSBGUEZNVFNJWiAxMDI0CitzdGF0aWMgY2hhciBmcGZtdGJ1ZltGUEZNVFNJWl0gPSB7IE5VTCwgTlVMIH07CitzdGF0aWMgaW50IGZwZmJ1ZnBvcyA9IDA7ICAgICAgICAgICAgICAgLyogKHdoeSB3YXMgdGhpcyBjaGFyIGJlZm9yZT8pICovCisKK2NoYXIgKgorZnBmb3JtYXQoZnByZXN1bHQscGxhY2VzLHJvdW5kKSBDS0ZMT0FUIGZwcmVzdWx0OyBpbnQgcGxhY2VzLCByb3VuZDsgeworICAgIGNoYXIgZmJ1ZlsxNl07ICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBjcmVhdGluZyBwcmludGYgZm9ybWF0ICovCisgICAgaW50IG5pbmVzID0gMCwgc2lnbiA9IDAsIHgsIHksIGksIGosIHNpemUgPSAwOworICAgIGNoYXIgKiBidWY7CisgICAgQ0tGTE9BVCBmdG1wOworCisgICAgeCA9IHBsYWNlcyA/IHBsYWNlcyA6IChmcF9kaWdpdHMgPyBmcF9kaWdpdHMgOiA2KTsKKworICAgIGRlYnVnKEYxMDEsImZwZm9ybWF0IGZwcmVzdWx0IiwiIixmcHJlc3VsdCk7CisgICAgZGVidWcoRjEwMSwiZnBmb3JtYXQgcGxhY2VzIiwiIixwbGFjZXMpOworICAgIGRlYnVnKEYxMDEsImZwZm9ybWF0IGZwZmJ1ZnBvcyAxIiwiIixmcGZidWZwb3MpOworCisgICAgZnRtcCA9IGZwcmVzdWx0OworICAgIGlmIChmdG1wIDwgMC4wKSBmdG1wID0gMC4wIC0gZnByZXN1bHQ7CisKKyNpZmRlZiBGTkZMT0FUCisgICAgaWYgKCFmcF9yb3VuZGluZyAmJiAgICAgICAgICAgICAgICAgLyogSWYgcHJpbnRmIGRvZXNuJ3Qgcm91bmQsICovCisgICAgICAgIChwbGFjZXMgPiAwIHx8ICAgICAgICAgICAgICAgICAgLyogcm91bmQgcmVzdWx0IHRvIGRlY2ltYWwgcGxhY2VzLiAqLworICAgICAgICAgKHBsYWNlcyA9PSAwICYmIHJvdW5kKSkpCisgICAgICBmcHJlc3VsdCArPSAoMC41IC8gcG93KDEwLjAsKENLRkxPQVQpcGxhY2VzKSk7CisgICAgeSA9IChmdG1wID09IDAuMCkgPyAxIDogKGludClsb2cxMChmdG1wKTsKKyAgICBzaXplID0geSArIHggKyAzOyAgICAgICAgICAgICAgICAgICAvKiBFc3RpbWF0ZWQgbGVuZ3RoIG9mIHJlc3VsdCAqLworICAgIGlmIChmcHJlc3VsdCA8IDAuMCkgc2l6ZSsrOworI2Vsc2UKKyAgICBzaXplID0gMjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyB3YXkgdG8gZXN0aW1hdGUsIGJlIGdlbmVyb3VzICovCisjZW5kaWYgLyogRk5GTE9BVCAqLworCisgICAgZGVidWcoRjEwMSwiZnBmb3JtYXQgc2l6ZSIsIiIsc2l6ZSk7CisKKyAgICBpZiAoZnBmYnVmcG9zID4gKEZQRk1UU0laIC0gc2l6ZSkpICAvKiBXcmFwIGFyb3VuZCBpZiBuZWNlc3NhcnkgKi8KKyAgICAgIGZwZmJ1ZnBvcyA9IDA7CisgICAgZGVidWcoRjEwMSwiZnBmb3JtYXQgZnBmYnVmcG9zIDEiLCIiLGZwZmJ1ZnBvcyk7CisKKyAgICBidWYgPSAmZnBmbXRidWZbZnBmYnVmcG9zXTsKKworICAgIGlmIChwbGFjZXMgPiAwKSB7ICAgICAgICAgICAgICAgICAgIC8qIElmIHBsYWNlcyBzcGVjaWZpZWQgKi8KKyAgICAgICAgLyogdXNlIHNwZWNpZmllZCBwbGFjZXMgdG8gd3JpdGUgZ2l2ZW4gbnVtYmVyIG9mIGRpZ2l0cyAqLworICAgICAgICBzcHJpbnRmKGZidWYsIiUlMC4lZGYiLHBsYWNlcyk7IC8qIFNBRkUgKi8KKyAgICAgICAgc3ByaW50ZihidWYsZmJ1ZixmcHJlc3VsdCk7ICAgICAvKiBTQUZFICovCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlLi4uICovCisgICAgICAgIC8qIEdvIGZvciBtYXggcHJlY2lzaW9uICovCisgICAgICAgIHNwcmludGYoZmJ1ZiwiJSUwLiVkZiIsZnBfZGlnaXRzKTsgLyogU0FGRSAqLworICAgICAgICBzcHJpbnRmKGJ1ZixmYnVmLGZwcmVzdWx0KTsgICAgIC8qIFNBRkUgKi8KKyAgICB9CisgICAgaWYgKGJ1ZlswXSA9PSAnLScpIHNpZ24gPSAxOworICAgIGRlYnVnKEYxMTEsImZwcmVzdWx0IDEgZXJybm8iLGJ1ZixlcnJubyk7IC8qIENoZWNrIGZvciBvdmVyL3VuZGVyZmxvdyAqLworICAgIGRlYnVnKEYxMTEsImZwcmVzdWx0IDEgZnBmYnVmcG9zIixidWYsZnBmYnVmcG9zKTsKKyAgICAvKiBHaXZlIHJlcXVlc3RlZCBkZWNpbWFsIHBsYWNlcyAqLworICAgIGZvciAoaSA9IHNpZ247IGkgPCBGUEZNVFNJWiAmJiBidWZbaV07IGkrKykgeworICAgICAgICBpZiAoYnVmW2ldID09ICcuJykgICAgICAgICAgICAgIC8qIEZpcnN0IGZpbmQgdGhlIGRlY2ltYWwgcG9pbnQgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZSBpZiAoaSA+IGZwX2RpZ2l0cyArIHNpZ24gLSAxKSAvKiByZXBsYWNpbmcgZ2FyYmFnZSAqLworICAgICAgICAgIGJ1ZltpXSA9ICcwJzsgICAgICAgICAgICAgICAgIC8qIGRpZ2l0cyB3aXRoIDAuLi4gKi8KKyAgICB9CisgICAgaWYgKGJ1ZltpXSA9PSAnLicpIHsgICAgICAgICAgICAgICAgLyogSGF2ZSBkZWNpbWFsIHBvaW50ICovCisgICAgICAgIGludCBnb3RlbmQgPSAwOworICAgICAgICAvKiBwbGFjZXMgPCAwIHNvIHRydW5jYXRlIGZyYWN0aW9uICovCisgICAgICAgIGlmIChwbGFjZXMgPCAwIHx8IChwbGFjZXMgPT0gMCAmJiByb3VuZCkpIHsKKyAgICAgICAgICAgIGJ1ZltpXSA9IE5VTDsKKyAgICAgICAgfSBlbHNlIGlmIChwbGFjZXMgPiAwKSB7ICAgICAgICAvKiBkID4gMCBzbyB0aGlzIG1hbnkgZGVjaW1hbCBwbGFjZXMgKi8KKyAgICAgICAgICAgIGkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBkaWdpdCBhZnRlciBkZWNpbWFsICovCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGxhY2VzOyBqKyspIHsgLyogVHJ1bmNhdGUgYWZ0ZXIgZCBkZWNpbWFsICovCisgICAgICAgICAgICAgICAgaWYgKCFidWZbaitpXSkgICAgICAgIC8qIHBsYWNlcyBvciBleHRlbmQgdG8gZCAgKi8KKyAgICAgICAgICAgICAgICAgIGdvdGVuZCA9IDE7ICAgICAgICAgICAgICAvKiBkZWNpbWFsIHBsYWNlcy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoZ290ZW5kIHx8IGoraStzaWduID4gZnBfZGlnaXRzKQorICAgICAgICAgICAgICAgICAgYnVmW2oraV0gPSAnMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZbaitpXSA9IE5VTDsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBwbGFjZXMgPT0gMCBzbyBEbyBUaGUgUmlnaHQgVGhpbmcgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IChpbnQpc3RybGVuKGJ1ZikgLSAxOyBqID4gaSsxOyBqLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoKGogLSBzaWduKSA+IGZwX2RpZ2l0cykKKyAgICAgICAgICAgICAgICAgIGJ1ZltqXSA9ICcwJzsKKyAgICAgICAgICAgICAgICBpZiAoYnVmW2pdID09ICcwJykKKyAgICAgICAgICAgICAgICAgIGJ1ZltqXSA9IE5VTDsgLyogU3RyaXAgdXNlbGVzcyB0cmFpbGluZyAwJ3MuICovCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZnBmbXRidWZbRlBGTVRTSVotMV0gPSBOVUw7CisgICAgaiA9IHN0cmxlbihidWYpOworICAgIHNpZ24gPSAwOworICAgIGZvciAoaSA9IGotMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaWYgKGJ1ZltpXSA9PSAnOScpCisgICAgICAgICAgbmluZXMrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBEbyBzb21ldGhpbmcgYWJvdXQgeHgueHg5OTk5OTk5OS4uLiAqLworICAgIGlmIChuaW5lcyA+IDUpIHsKKyAgICAgICAgaWYgKGlzZGlnaXQoYnVmW2ldKSAmJiBpIDwgRlBGTVRTSVogLSAyKSB7CisgICAgICAgICAgICBidWZbaV0gPSBidWZbaV0gKyAxOworICAgICAgICAgICAgYnVmW2krMV0gPSAnMCc7CisgICAgICAgICAgICBidWZbaSsyXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzdHJuY21wKGJ1ZiwiLTAuMCIsRlBGTVRTSVopKQorICAgICAgY2tzdHJuY3B5KGJ1ZiwiMC4wIixGUEZNVFNJWik7CisgICAgZnBmYnVmcG9zICs9IChpbnQpc3RybGVuKGJ1ZikgKyAxOworICAgIHJldHVybigoY2hhciAqKWJ1Zik7Cit9CisjZW5kaWYgLyogQ0tGTE9BVCAqLworCitzdGF0aWMgVk9JRAorZXZhbGVycihmbikgY2hhciAqIGZuOyB7CisgICAgaWYgKGZuZGlhZ3MpIHsKKyAgICAgICAgaWYgKGRpdmJ5emVybykKKyAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsIjxFUlJPUjpESVZJREVfQllfWkVSTzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICBlbHNlCisgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLCI8RVJST1I6QVJHX05PVF9OVU1FUklDOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgfQorfQorCitjaGFyICoKK2Rva3d2YWwocyxzZXApIGNoYXIgKiBzLCBzZXA7IHsKKyAgICBjaGFyIGMgPSAnXDAnLCAqIHAsICoga3cgPSBOVUxMLCAqIHZwID0gTlVMTDsKKyAgICBpbnQgeDsKKyAgICBpZiAoIXMpIHJldHVybigiMCIpOworICAgIGlmICghKnMpIHJldHVybigiMCIpOworICAgIGRlYnVnKEYxMTAsImt3dmFsIGFyZyIscywwKTsKKyAgICBkZWJ1ZyhGMTEwLCJrd3ZhbCBzZXAiLGNrY3RvYShzZXApLDApOworICAgIHAgPSAoY2hhciAqKW1hbGxvYygoaW50KXN0cmxlbihzKSsxKTsKKyAgICBpZiAoIXApIHJldHVybigiMCIpOworICAgIHN0cmNweShwLHMpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNBRkUgKi8KKyAgICBzID0gcDsKKyAgICB3aGlsZSAoKnMgPCAnIScgJiYgKnMgPiAnXDAnKSAgICAgICAvKiBHZXQgZmlyc3Qgbm9uYmxhbmsgKi8KKyAgICAgIHMrKzsKKyAgICBpZiAoISpzKSByZXR1cm4oIjAiKTsKKyAgICBpZiAoKnMgPT0gc2VwKSByZXR1cm4oIjAiKTsKKyAgICBrdyA9IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBLZXl3b3JkICovCisgICAgd2hpbGUgKCpzID4gJyAnKSB7CisgICAgICAgIGlmICgqcyA9PSBzZXApIHsgICAgICAgICAgICAgICAgLyoga2V5d29yZD0uLi4gKi8KKyAgICAgICAgICAgIGMgPSAqczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHMrKzsKKyAgICB9CisgICAgKnMrKyA9IE5VTDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVybWluYXRlIGtleXdvcmQgKi8KKyAgICB3aGlsZSAoKnMgPCAnIScgJiYgKnMgPiAnXDAnKSAgICAgICAvKiBTa2lwIGJsYW5rcyAqLworICAgICAgcysrOworICAgIGlmICghYyAmJiAqcyA9PSBzZXApIHsKKyAgICAgICAgYyA9ICpzKys7ICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXZlIHNlcGFyYXRvciAqLworICAgICAgICB3aGlsZSAoKnMgPCAnIScgJiYgKnMgPiAnXDAnKSAgIC8qIFNraXAgYmxhbmtzICovCisgICAgICAgICAgcysrOworICAgIH0KKyAgICBpZiAoYykgeworICAgICAgICB2cCA9IHM7CisgICAgICAgIHdoaWxlICgqcyA+ICcgJykgICAgICAgICAgICAgICAgLyogU2tpcCB0byBlbmQgKi8KKyAgICAgICAgICBzKys7CisgICAgICAgICpzID0gTlVMOyAgICAgICAgICAgICAgICAgICAgICAgLyogVGVybWluYXRlIHZhbHVlICovCisgICAgfQorICAgIGRlYnVnKEYxMTAsImt3dmFsIGMiLGNrY3RvYShjKSwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJrd3ZhbCBrZXl3b3JkIixrdywwKTsKKyAgICBkZWJ1ZyhGMTEwLCJrd3ZhbCB2YWx1ZSIsdnAsMCk7CisgICAgeCA9IGMgPyBhZGRtYWMoa3csdnApIDogLTE7CisgICAgZnJlZShwKTsKKyAgICByZXR1cm4oKHggPCAwKSA/ICIwIiA6ICIxIik7Cit9CisKK3N0YXRpYyBpbnQKK2lzYWFycmF5KHMpIGNoYXIgKiBzOyB7CQkJLyogSXMgcyBhbiBhc3NvY2lhdGl2ZSBhcnJheSBlbGVtZW50ICovCisgICAgaW50IHN0YXRlID0gMDsKKyAgICBDSEFSIGM7CisgICAgaWYgKCFzKSByZXR1cm4oMCk7CisgICAgd2hpbGUgKChjID0gKnMrKykpIHsKKwlpZiAoIWlzcHJpbnQoYykpIHsKKwkgICAgcmV0dXJuKDApOworCX0gZWxzZSBpZiAoYyA9PSAnPCcpIHsKKwkgICAgaWYgKHN0YXRlICE9IDApCisJICAgICAgcmV0dXJuKDApOworCSAgICBzdGF0ZSA9IDE7CisJfSBlbHNlIGlmIChjID09ICc+JykgeworCSAgICByZXR1cm4oKHN0YXRlICE9IDEgfHwgKnMpID8gMCA6IDEpOworCX0KKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCitzdGF0aWMgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXZhbHVhdGUgYnVpbHRpbiBmdW5jdGlvbnMgKi8KK2ZuZXZhbChmbixhcmdwLGFyZ24seHApIGNoYXIgKmZuLCAqYXJncFtdOyBpbnQgYXJnbjsgY2hhciAqIHhwOyB7CisgICAgaW50IGk9MCwgaj0wLCBrPTAsIGxlbjE9MCwgbGVuMj0wLCBsZW4zPTAsIG49MCwgdD0wLCB4PTAsIHk9MDsKKyAgICBpbnQgY3gsIGZhaWxlZCA9IDA7ICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gY29kZSwgMCA9IG9rICovCisgICAgbG9uZyB6ID0gMEw7CisgICAgY2hhciAqYnBbRk5BUkdTICsgMV07ICAgICAgICAgICAgICAgLyogUG9pbnRlcnMgdG8gbWFsbG9jJ2Qgc3RyaW5ncyAqLworICAgIGNoYXIgYyA9IE5VTDsKKyAgICBjaGFyICpwID0gTlVMTCwgKnMgPSBOVUxMOworICAgIGNoYXIgKnZhbDEgPSBOVUxMLCAqdmFsMiA9IE5VTEw7ICAgIC8qIFBvaW50ZXJzIHRvIG51bWVyaWMgc3RyaW5nIHZhbHVlcyAqLworCisjaWZkZWYgUkVDVVJTSVZFCisgICAgaW50IHJzYXZlID0gcmVjdXJzaXZlOworI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworI2lmZGVmIE9TMgorICAgIGludCB6c2F2ZSA9IHp4cG47CisjZW5kaWYgLyogT1MyICovCisKKyAgICBpZiAoIWZuKSBmbiA9ICIiOyAgICAgICAgICAgICAgICAgICAvKiBQcm90ZWN0IGFnYWluc3QgbnVsbCBwb2ludGVycyAqLworICAgIGlmICghKmZuKSByZXR1cm4oIiIpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZOQVJHUzsgaSsrKSAgICAgICAgLyogSW5pdGlhbGl6ZSBhcmd1bWVudCBwb2ludGVycyAqLworICAgICAgYnBbaV0gPSBOVUxMOworLyoKKyAgSU1QT1JUQU5UOiBOb3RlIHRoYXQgYXJnbiBpcyBub3QgYW4gYWNjdXJhdGUgY291bnQgb2YgdGhlIG51bWJlciBvZgorICBhcmd1bWVudHMuICBXZSBjYW4ndCByZWFsbHkgdGVsbCBpZiBhbiBhcmd1bWVudCBpcyBudWxsIHVudGlsIGFmdGVyIHdlCisgIGV4ZWN1dGUgdGhlIGNvZGUgYmVsb3cuICBTbyBhcmduIGlzIHJlYWxseSB0aGUgbWF4aW11bSBudW1iZXIgb2YgYXJndW1lbnRzCisgIHdlIG1pZ2h0IGhhdmUuICBBcmduIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgMSwgZXZlbiBpZiB0aGUgZnVuY3Rpb24gaXMKKyAgY2FsbGVkIHdpdGggZW1wdHkgcGFyZW50aGVzZXMgKGJ1dCBkb24ndCBjb3VudCBvbiBpdCkuCisqLworICAgIGRlYnVnKEYxMTEsImZuZXZhbCIsZm4sYXJnbik7CisgICAgZGVidWcoRjExMCwiZm5ldmFsIixhcmdwWzBdLDApOworICAgIGlmIChhcmduID4gRk5BUkdTKSAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgZXhjZXNzIGFyZ3VtZW50cyAqLworICAgICAgYXJnbiA9IEZOQVJHUzsKKworICAgIGZuZGVwdGgrKzsKKyAgICBkZWJ1ZyhGMTAxLCJmbmV2YWwgZm5kZXB0aCIsIiIsZm5kZXB0aCk7CisgICAgcCA9IGZudmFsOworICAgIGZudmFsWzBdID0gTlVMOworICAgIHkgPSBsb29rdXAoZm5jdGFiLGZuLG5mdW5jcywmeCk7ICAgIC8qIExvb2sgdXAgdGhlIGZ1bmN0aW9uIG5hbWUgKi8KKyAgICBjeCA9IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCZWNhdXNlIHkgaXMgdG9vIGdlbmVyaWMuLi4gKi8KKyAgICBpZiAoY3ggPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGZvdW5kICovCisgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgIGlmIChmbmRpYWdzKSB7ICAgICAgICAgICAgICAgICAgLyogRlVOQ1RJT04gRElBR05PU1RJQyBPTiAqLworICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICB4ID0gc3RybGVuKGZuKTsKKyAgICAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgc3ByaW50ZidzIGFyZSBzYWZlICovCisgICAgICAgICAgICBzd2l0Y2ggKGN4KSB7CisgICAgICAgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICAgICAgaWYgKHggKyAzMiA8IEZOVkFMTCkKKyAgICAgICAgICAgICAgICAgIHNwcmludGYoZm52YWwsIjxFUlJPUjpOT19TVUNIX0ZVTkNUSU9OOlxcZiVzKCk+Iixmbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc3ByaW50ZihmbnZhbCwiPEVSUk9SOk5PX1NVQ0hfRlVOQ1RJT04+Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgLTI6CisgICAgICAgICAgICAgICAgaWYgKHggKyAyNiA8IEZOVkFMTCkKKyAgICAgICAgICAgICAgICAgIHNwcmludGYoZm52YWwsIjxFUlJPUjpOQU1FX0FNQklHVU9VUzpcXGYlcygpPiIsZm4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHNwcmludGYoZm52YWwsIjxFUlJPUjpOQU1FX0FNQklHVU9VUz4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAtMzoKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCI8RVJST1I6RlVOQ1RJT05fTkFNRV9NSVNTSU5HOlxcZigpPiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmICh4ICsgMjYgPCBGTlZBTEwpCisgICAgICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCI8RVJST1I6TE9PS1VQX0ZBSUxVUkU6XFxmJXMoKT4iLGZuKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCI8RVJST1I6TE9PS1VQX0ZBSUxVUkU+Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ290byBmbmVuZDsgICAgICAgICAgICAgICAgICAgICAvKiBBbHdheXMgbGVhdmUgdmlhIGNvbW1vbiBleGl0ICovCisgICAgfQorICAgIGZuID0gZm5jdGFiW3hdLmt3ZDsgICAgICAgICAgICAgICAgIC8qIEZ1bGwgbmFtZSBvZiBmdW5jdGlvbiAqLworCisgICAgaWYgKGFyZ24gPCAwKSB7CisgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgc3ByaW50ZihmbnZhbCwiPEVSUk9SOk1JU1NJTkdfQVJHOlxcZiVzKCk+Iixmbik7CisgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgfQorICAgIGlmIChjeCA9PSBGTl9MSVQpIHsgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwoYXJnMSkgKi8KKyAgICAgICAgZGVidWcoRjAxMCwiZmxpdCIseHAsMCk7CisgICAgICAgIHAgPSB4cCA/IHhwIDogIiI7ICAgICAgICAgICAgICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byBhcmcgaXRzZWxmICovCisgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgfQorCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisgICAgICAgIGludCBqOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXJnbjsgaisrKQorICAgICAgICAgIGRlYnVnKEYxMTEsImZuZXZhbCBhcmciLGFyZ3Bbal0saik7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgZm9yIChqID0gYXJnbi0xOyBqID49IDA7IGotLSkgeyAgICAgLyogVW5jb3VudCBlbXB0eSB0cmFpbGluZyBhcmdzICovCisgICAgICAgIGlmICghYXJncFtqXSkKKyAgICAgICAgICBhcmduLS07CisgICAgICAgIGVsc2UgaWYgKCEqKGFyZ3Bbal0pKQorICAgICAgICAgIGFyZ24tLTsKKyAgICAgICAgZWxzZSBicmVhazsKKyAgICB9CisgICAgZGVidWcoRjExMSwiZm5ldmFsIGFyZ24iLGZuLGFyZ24pOworLyoKKyAgXGZsaXRlcmFsKCkgYW5kIFxmY29udGVudHMoKSBhcmUgc3BlY2lhbCBmdW5jdGlvbnMgdGhhdCBkbyBub3QgZXZhbHVhdGUKKyAgdGhlaXIgYXJndW1lbnRzLCBhbmQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5IGhlcmUuICBBZnRlciB0aGVzZSBjb21lIHRoZQorICBmdW5jdGlvbnMgd2hvc2UgYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgaW4gdGhlIG5vcm1hbCB3YXkuCisqLworI2lmZGVmIENPTU1FTlQKKyAgICAvKiAobW92ZWQgdXApICovCisgICAgaWYgKGN4ID09IEZOX0xJVCkgeyAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbChhcmcxKSAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJmbGl0Iix4cCwwKTsKKyAgICAgICAgcCA9IHhwID8geHAgOiAiIjsgICAgICAgICAgICAgICAvKiBSZXR1cm4gYSBwb2ludGVyIHRvIGFyZyBpdHNlbGYgKi8KKyAgICAgICAgZ290byBmbmVuZDsKKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIGlmIChjeCA9PSBGTl9DT04pIHsgICAgICAgICAgICAgICAgIC8qIENvbnRlbnRzIG9mIHZhcmlhYmxlLCB1bmV4cGFuZGVkLiAqLworICAgICAgICBjaGFyIGM7CisgICAgICAgIGlmICghKHAgPSBhcmdwWzBdKSB8fCAhKnApIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgc3ByaW50ZihmbnZhbCwiPEVSUk9SOk1JU1NJTkdfQVJHOlxcZmNvbnRlbnRzKCk+Iik7CisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisgICAgICAgIHAgPSBicnN0cmlwKHApOworICAgICAgICBpZiAoKnAgPT0gQ01EUSkgcCsrOworICAgICAgICBpZiAoKGMgPSAqcCkgPT0gJyUnKSB7ICAgICAgICAgIC8qIFNjYWxhciB2YXJpYWJsZS4gKi8KKyAgICAgICAgICAgIGMgPSAqKytwOyAgICAgICAgICAgICAgICAgICAvKiBHZXQgSUQgY2hhcmFjdGVyLiAqLworICAgICAgICAgICAgcCA9ICIiOyAgICAgICAgICAgICAgICAgICAgIC8qIEFzc3VtZSBkZWZpbml0aW9uIGlzIGVtcHR5ICovCisgICAgICAgICAgICBpZiAoIWMpIHsgICAgICAgICAgICAgICAgICAgLyogRG91YmxlIHBhcmFub2lhICovCisgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCI8RVJST1I6QVJHX0JBRF9WQVJJQUJMRTpcXGZjb250ZW50cygpPiIpOworICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsgLyogRGlnaXQgZm9yIG1hY3JvIGFyZyAqLworICAgICAgICAgICAgICAgIGlmIChtYWNsdmwgPCAwKSAgICAgICAgIC8qIERpZ2l0IHZhcmlhYmxlcyBhcmUgZ2xvYmFsICovCisgICAgICAgICAgICAgICAgICBwID0gZ192YXJbY107ICAgICAgICAgLyogaWYgbm8gbWFjcm8gaXMgYWN0aXZlICovCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlICovCisgICAgICAgICAgICAgICAgICBwID0gbV9hcmdbbWFjbHZsXVtjIC0gJzAnXTsgLyogdGhleSdyZSBvbiB0aGUgc3RhY2sgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnKicpIHsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgcCA9IChtYWNsdmwgPiAtMSkgPyBtX2xpbmVbbWFjbHZsXSA6IHRvcGxpbmU7CisgICAgICAgICAgICAgICAgaWYgKCFwKSBwID0gIiI7CisjZWxzZQorICAgICAgICAgICAgICAgIGludCBueCA9IEZOVkFMTDsKKyAgICAgICAgICAgICAgICBjaGFyICogc3ggPSBmbnZhbDsKKyAgICAgICAgICAgICAgICBwID0gZm52YWw7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgIGlmIChjbWRzcmMoKSA9PSAwICYmIHRvcGxpbmUpCisgICAgICAgICAgICAgICAgICBwID0gdG9wbGluZTsKKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgaWYgKHp6c3RyaW5nKCJcXGZqb2luKCZfW10seyB9LDEpIiwmc3gsJm54KSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCI8RVJST1I6T1ZFUkZMT1c6XFxmY29udGVudHMoKT4iKTsKKwkJICAgIGRlYnVnKEYxMTAsInp6c3RyaW5nIGZjb250ZW50cyhcXCUqKSIscCwwKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaXN1cHBlcihjKSkgYyAtPSAoJ2EnLSdBJyk7CisgICAgICAgICAgICAgICAgcCA9IGdfdmFyW2NdOyAgICAgICAgICAgLyogTGV0dGVyIGZvciBnbG9iYWwgdmFyaWFibGUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcCkgcCA9ICIiOworICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICcmJykgeyAgICAgICAgICAvKiBBcnJheSByZWZlcmVuY2UuICovCisgICAgICAgICAgICBpbnQgdmJpLCBkOworICAgICAgICAgICAgaWYgKGFycmF5bmFtKHAsJnZiaSwmZCkgPCAwKSB7IC8qIEdldCBuYW1lIGFuZCBzdWJzY3JpcHQgKi8KKyAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICAgIHNwcmludGYoZm52YWwsIjxFUlJPUjpBUkdfQkFEX0FSUkFZOlxcZmNvbnRlbnRzKCk+Iik7CisgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGthcnJheSh2YmksZCkgPiAwKSB7ICAvKiBBcnJheSBpcyBkZWNsYXJlZD8gKi8KKyAgICAgICAgICAgICAgICB2YmkgLT0gQVJSQVlCQVNFOyAgICAgICAvKiBDb252ZXJ0IG5hbWUgdG8gaW5kZXggKi8KKyAgICAgICAgICAgICAgICBpZiAoYV9kaW1bdmJpXSA+PSBkKSB7ICAvKiBJZiBzdWJzY3JpcHQgaW4gcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgY2hhciAqKmFwOworICAgICAgICAgICAgICAgICAgICBhcCA9IGFfcHRyW3ZiaV07ICAgIC8qIGdldCBkYXRhIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFwKSB7ICAgICAgICAgICAvKiBhbmQgaWYgdGhlcmUgaXMgb25lICovCisgICAgICAgICAgICAgICAgICAgICAgICBwID0gYXBbZF07CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICAgIHNwcmludGYoZm52YWwsIjxFUlJPUjpBUkdfTk9UX0FSUkFZOlxcZmNvbnRlbnRzKCk+Iik7CisgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgc3ByaW50ZihmbnZhbCwiPEVSUk9SOkFSR19OT1RfVkFSSUFCTEU6XFxmY29udGVudHMoKT4iKTsKKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcCA9IGZudmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCByZXN1bHQgcG9pbnRlciAqLworICAgIGZudmFsWzBdID0gTlVMOyAgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgcmVzdWx0ID0gZW1wdHkgc3RyaW5nICovCisKKworICAgIGZvciAoaSA9IDA7IGkgPCBhcmduOyBpKyspIHsgICAgICAgIC8qIExvb3AgdG8gZXhwYW5kIGVhY2ggYXJndW1lbnQgKi8KKyAgICAgICAgbiA9IE1BWEFSR0xFTjsgICAgICAgICAgICAgICAgICAvKiBBbGxvdyBwbGVudHkgb2Ygc3BhY2UgKi8KKyAgICAgICAgYnBbaV0gPSBzID0gbWFsbG9jKG4rMSk7ICAgICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBhcmd1bWVudCAqLworICAgICAgICBpZiAoYnBbaV0gPT0gTlVMTCkgeyAgICAgICAgICAgIC8qIEhhbmRsZSBmYWlsdXJlIHRvIGdldCBzcGFjZSAqLworICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsIjxFUlJPUjpNQUxMT0NfRkFJTFVSRTpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgfQorICAgICAgICBwID0gYXJncFtpXSA/IGFyZ3BbaV0gOiAiIjsgICAgIC8qIFBvaW50IHRvIHRoaXMgYXJndW1lbnQgKi8KKworLyoKKyAgVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgZnJvbSB0aGUgb3JpZ2luYWwgYXJndW1lbnQsIGJlZm9yZQorICBldmFsdWF0aW9uLiAgVGhpcyBjb2RlIG5ldyB0byBlZGl0IDE4NC4gIEZpeGVkIGluIGVkaXQgMTk5IHRvIHRyaW0KKyAgYmxhbmtzIEJFRk9SRSBzdHJpcHBpbmcgYnJhY2VzLgorCisqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgeCwgajsKKyAgICAgICAgICAgIHggPSBzdHJsZW4ocCk7CisgICAgICAgICAgICBqID0geCAtIDE7ICAgICAgICAgICAgICAgICAgLyogVHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisgICAgICAgICAgICB3aGlsZSAoaiA+IDAgJiYgKCoocCArIGopID09IFNQIHx8ICoocCArIGopID09IEhUKSkKKyAgICAgICAgICAgICAgKihwICsgai0tKSA9IE5VTDsKKyAgICAgICAgICAgIHdoaWxlICgqcCA9PSBTUCB8fCAqcCA9PSBIVCkgLyogU3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCisgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIHggPSBzdHJsZW4ocCk7CisgICAgICAgICAgICBpZiAoKnAgPT0gJ3snICYmICoocCt4LTEpID09ICd9JykgeyAvKiBOT1cgc3RyaXAgYnJhY2VzICovCisgICAgICAgICAgICAgICAgcFt4LTFdID0gTlVMOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICB4IC09IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworLyogTm93IGV2YWx1YXRlIHRoZSBhcmd1bWVudCAqLworCisgICAgICAgIGRlYnVnKEYxMTEsImZuZXZhbCBjYWxsaW5nIHp6c3RyaW5nIixwLG4pOworICAgICAgICB0ID0genpzdHJpbmcocCwmcywmbik7ICAgICAgICAgIC8qIEV4cGFuZCBhcmcgaW50byBuZXcgc3BhY2UgKi8KKyAgICAgICAgZGVidWcoRjEwMSwiZm5ldmFsIHp6c3RyaW5nIiwiIix0KTsKKyAgICAgICAgZGVidWcoRjEwMSwiZm5ldmFsIHp6c3RyaW5nIiwiIixuKTsKKyAgICAgICAgaWYgKHQgPCAwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJmbmV2YWwgenpzdHJpbmcgZmFpbHMsIGFyZyIsIiIsaSk7CisgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpIHsKKyAgICAgICAgICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfVE9PX0xPTkc6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19FVkFMX0ZBSUxVUkU6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjExMSwiZm5ldmFsIGFyZyIsYnBbaV0saSk7CisgICAgfQorCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisgICAgICAgIGludCBqOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXJnbjsgaisrKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJmbmV2YWwgYXJnIHBvc3QgZXZhbCIsYXJncFtqXSxqKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImZuZXZhbCBldmFsdWF0ZWQgYXJnIixicFtqXSxqKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworLyoKKyAgRnJvbSB0aGlzIHBvaW50IG9uLCBicFswLi5hcmduLTFdIGFyZSBub3QgTlVMTCBhbmQgYWxsIG11c3QgYmUgZnJlZWQKKyAgYmVmb3JlIHJldHVybmluZy4KKyovCisgICAgaWYgKGFyZ24gPCAxKSB7ICAgICAgICAgICAgICAgICAgICAgLyogQ2F0Y2ggcmVxdWlyZWQgYXJncyBtaXNzaW5nICovCisgICAgICAgIHN3aXRjaCAoY3gpIHsKKyAgICAgICAgICBjYXNlIEZOX0RFRjoKKyAgICAgICAgICBjYXNlIEZOX0VWQToKKyAgICAgICAgICBjYXNlIEZOX0VYRToKKyAgICAgICAgICBjYXNlIEZOX0NIUjoKKyAgICAgICAgICBjYXNlIEZOX0NPRDoKKyAgICAgICAgICBjYXNlIEZOX01BWDoKKyAgICAgICAgICBjYXNlIEZOX01JTjoKKyAgICAgICAgICBjYXNlIEZOX01PRDoKKyAgICAgICAgICBjYXNlIEZOX0ZEOgorICAgICAgICAgIGNhc2UgRk5fRlM6CisgICAgICAgICAgY2FzZSBGTl9UT0Q6CisgICAgICAgICAgY2FzZSBGTl9GRk46CisgICAgICAgICAgY2FzZSBGTl9CU046CisgICAgICAgICAgY2FzZSBGTl9SQVc6CisgICAgICAgICAgY2FzZSBGTl9DTUQ6CisgICAgICAgICAgY2FzZSBGTl8ySEVYOgorICAgICAgICAgIGNhc2UgRk5fMk9DVDoKKyAgICAgICAgICBjYXNlIEZOX0ROQU06CisjaWZkZWYgRk5fRVJSTVNHCisgICAgICAgICAgY2FzZSBGTl9FUlJNU0c6CisjZW5kaWYgLyogRk5fRVJSTVNHICovCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAgICAgICBjYXNlIEZOX0tSQl9USzoKKyAgICAgICAgICBjYXNlIEZOX0tSQl9OWDoKKyAgICAgICAgICBjYXNlIEZOX0tSQl9JVjoKKyAgICAgICAgICBjYXNlIEZOX0tSQl9UVDoKKyAgICAgICAgICBjYXNlIEZOX0tSQl9GRzoKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworICAgICAgICAgIGNhc2UgRk5fTUpEMjoKKyAgICAgICAgICBjYXNlIEZOX04yVElNOgorICAgICAgICAgIGNhc2UgRk5fRElNOgorICAgICAgICAgIGNhc2UgRk5fREFURUo6CisgICAgICAgICAgY2FzZSBGTl9QTkNWVDoKKyAgICAgICAgICBjYXNlIEZOX1BFUk06CisgICAgICAgICAgY2FzZSBGTl9BTE9PSzoKKyAgICAgICAgICBjYXNlIEZOX1RMT09LOgorICAgICAgICAgIGNhc2UgRk5fQUJTOgorICAgICAgICAgIGNhc2UgRk5fQUFEVU1QOgorICAgICAgICAgIGNhc2UgRk5fSk9JTjoKKyNpZmRlZiBDS0ZMT0FUCisgICAgICAgICAgY2FzZSBGTl9GUEFCUzoKKyAgICAgICAgICBjYXNlIEZOX0ZQRVhQOgorICAgICAgICAgIGNhc2UgRk5fRlBMT0c6CisgICAgICAgICAgY2FzZSBGTl9GUExOOgorICAgICAgICAgIGNhc2UgRk5fRlBNT0Q6CisgICAgICAgICAgY2FzZSBGTl9GUFNRUjoKKyAgICAgICAgICBjYXNlIEZOX0ZQQUREOgorICAgICAgICAgIGNhc2UgRk5fRlBESVY6CisgICAgICAgICAgY2FzZSBGTl9GUE1VTDoKKyAgICAgICAgICBjYXNlIEZOX0ZQUE9XOgorICAgICAgICAgIGNhc2UgRk5fRlBTVUI6CisgICAgICAgICAgY2FzZSBGTl9GUElOVDoKKyAgICAgICAgICBjYXNlIEZOX0ZQUk9VOgorICAgICAgICAgIGNhc2UgRk5fRlBTSU46CisgICAgICAgICAgY2FzZSBGTl9GUENPUzoKKyAgICAgICAgICBjYXNlIEZOX0ZQVEFOOgorI2VuZGlmIC8qIENLRkxPQVQgKi8KKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICAgICAgICBjYXNlIEZOX0hTVEFERDoKKyAgICAgICAgICBjYXNlIEZOX0hTVE5BTToKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyAgICAgICAgICBjYXNlIEZOX0RFTFNFQzoKKyAgICAgICAgICBjYXNlIEZOX0tXVkFMOgorI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICBjYXNlIEZOX1NMRUVQOgorICAgICAgICAgIGNhc2UgRk5fTVNMRUVQOgorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBOVAorICAgICAgICAgIGNhc2UgRk5fU05BTUU6CisgICAgICAgICAgY2FzZSBGTl9MTkFNRToKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsIjxFUlJPUjpNSVNTSU5HX0FSRzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwID0gZm52YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0aGVzZSBhZ2Fpbi4gKi8KKyAgICBmbnZhbFswXSA9IE5VTDsKKworICAgIHN3aXRjaCAoY3gpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIGZ1bmN0aW9uIG9uIGV4cGFuZGVkIGFyZ3MuICovCisjaWZkZWYgVENQU09DS0VUCisgICAgICBjYXNlIEZOX0hTVEFERDoKKyAgICAgICAgcCA9IGNrYWRkcjJuYW1lKGJwWzBdKTsKKyAgICAgICAgZ290byBmbmVuZDsKKyAgICAgIGNhc2UgRk5fSFNUTkFNOgorICAgICAgICBwID0gY2tuYW1lMmFkZHIoYnBbMF0pOworICAgICAgICBnb3RvIGZuZW5kOworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCisgICAgICBjYXNlIEZOX0RFRjogICAgICAgICAgICAgICAgICAgICAgLyogXGZkZWZpbml0aW9uKGFyZzEpICovCisgICAgICAgIGsgPSBpc2FhcnJheShicFswXSkgPworCSAgICBteHhsb29rKG1hY3RhYixicFswXSxubWFjKSA6CisJCW14bG9vayhtYWN0YWIsYnBbMF0sbm1hYyk7CisgICAgICAgIHAgPSAoayA+IC0xKSA/IG1hY3RhYltrXS5tdmFsIDogIiI7CisgICAgICAgIGdvdG8gZm5lbmQ7CisKKyAgICAgIGNhc2UgRk5fRVZBOiAgICAgICAgICAgICAgICAgICAgICAvKiBcZmV2YWx1YXRlKGFyZzEpICovCisgICAgICAgIHAgPSAqKGJwWzBdKSA/IGV2YWx4KGJwWzBdKSA6ICIiOworICAgICAgICBpZiAoISpwICYmIGZuZGlhZ3MpIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgICBldmFsZXJyKGZuKTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGZuZW5kOworCisgICAgICBjYXNlIEZOX0VYRTogICAgICAgICAgICAgICAgICAgICAgLyogXGZleGVjdXRlKGFyZzEpICovCisgICAgICAgIGogPSAoaW50KXN0cmxlbihzID0gYnBbMF0pOyAgICAgLyogTGVuZ3RoIG9mIG1hY3JvIGludm9jYXRpb24gKi8KKyAgICAgICAgcCA9ICIiOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHJldHVybiB2YWx1ZSB0byBudWxsICovCisgICAgICAgIGlmIChqKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlcmUgaXMgYSBtYWNybyB0byBleGVjdXRlICovCisgICAgICAgICAgICB3aGlsZSAoKnMgPT0gU1ApIHMrKyxqLS07ICAgLyogc3RyaXAgbGVhZGluZyBzcGFjZXMgKi8KKyAgICAgICAgICAgIHAgPSBzOyAgICAgICAgICAgICAgICAgICAgICAvKiByZW1lbWJlciBiZWdpbm5pbmcgb2YgbWFjcm8gbmFtZSAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeyAgIC8qIGZpbmQgZW5kIG9mIG1hY3JvIG5hbWUgKi8KKyAgICAgICAgICAgICAgICBpZiAoKnMgPT0gU1ApCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnMgPT0gU1ApICAgICAgIHsgICAgICAgLyogaWYgdGhlcmUgd2FzIGEgc3BhY2UgYWZ0ZXIgKi8KKyAgICAgICAgICAgICAgICAqcysrID0gTlVMOyAgICAgICAgICAgICAvKiB0ZXJtaW5hdGUgdGhlIG1hY3JvIG5hbWUgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoKnMgPT0gU1ApIHMrKzsgICAvKiBza2lwIHBhc3QgYW55IGV4dHJhIHNwYWNlcyAqLworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIHMgPSAiIjsgICAgICAgICAgICAgICAgICAgLyogbWF5YmUgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cyAqLworICAgICAgICAgICAgaWYgKHAgJiYgKnApIHsKKyAgICAgICAgICAgICAgICBrID0gbWxvb2sobWFjdGFiLHAsbm1hYyk7IC8qIExvb2sgdXAgdGhlIG1hY3JvIG5hbWUgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJmZXhlYyBtbG9vayIscCxrKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBrID0gLTE7CisgICAgICAgICAgICBpZiAoayA8IDApIHsKKyAgICAgICAgICAgICAgICBjaGFyICogcDIgPSBwOworICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgY2ttYWt4bXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOk5PX1NVQ0hfTUFDUk86XFxmIixmbiwiKCIscDIsIik+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgfQorLyoKKyAgVGhpcyBpcyBqdXN0IGEgV0VFIGJpdCBkYW5nZXJvdXMgYmVjYXVzZSB3ZSBhcmUgY29weWluZyB1cCB0byA5IGFyZ3VtZW50cworICBpbnRvIHRoZSBzcGFjZSByZXNlcnZlZCBmb3Igb25lLiAgSXQgd29uJ3Qgb3ZlcnJ1biB0aGUgYnVmZmVyLCBidXQgaWYgdGhlcmUKKyAgYXJlIGxvdHMgb2YgbG9uZyBhcmd1bWVudHMgd2UgbWlnaHQgbG9zZSBzb21lLiAgVGhlIG90aGVyIHByb2JsZW0gaXMgdGhhdCBpZgorICB0aGUgbWFjcm8gaGFzIG1vcmUgdGhhbiAzIGFyZ3VtZW50cywgdGhlIDR0aCB0aHJvdWdoIGxhc3QgYXJlIGFsbAorICBjb25jYXRlbmF0ZWQgb250byB0aGUgdGhpcmQuICAoVGhlIHdvcmthcm91bmQgaXMgdG8gdXNlIHNwYWNlcyByYXRoZXIgdGhhbgorICBjb21tYXMgdG8gc2VwYXJhdGUgdGhlbS4pICBMZWF2aW5nIGl0IGxpa2UgdGhpcyB0byBhdm9pZCBoYXZpbmcgdG8gYWxsb2NhdGUKKyAgdG9ucyBtb3JlIGJ1ZmZlcnMuCisqLworICAgICAgICAgICAgaWYgKGFyZ24gPiAxKSB7ICAgICAgICAgICAgIC8qIENvbW1hcyB1c2VkIGluc3RlYWQgb2Ygc3BhY2VzICovCisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IGJwWzBdOyAgICAgICAgLyogUmV1c2UgdGhpcyBzcGFjZSAqLworICAgICAgICAgICAgICAgICpwID0gTlVMOyAgICAgICAgICAgICAgIC8qIE1ha2UgaW50byBkb2RvKCkgYXJnIGxpc3QgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYXJnbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQocCxicFtpXSxNQVhBUkdMRU4pOworICAgICAgICAgICAgICAgICAgICBzdHJuY2F0KHAsIiAiLE1BWEFSR0xFTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMgPSBicFswXTsgICAgICAgICAgICAgIC8qIFBvaW50IHRvIG5ldyBsaXN0ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwID0gIiI7ICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSByZXR1cm4gdmFsdWUgKi8KKyAgICAgICAgICAgIGlmIChrID49IDApIHsgICAgICAgICAgICAgICAvKiBJZiBtYWNybyBmb3VuZCBpbiB0YWJsZSAqLworICAgICAgICAgICAgICAgIC8qIEdvIHNldCBpdCB1cCAobGlrZSBETyBjbWQpICovCisgICAgICAgICAgICAgICAgaWYgKChqID0gZG9kbyhrLHMsY21kc3RrW2NtZGx2bF0uY2NmbGdzKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbXB1c2goKSA+IC0xKSB7IC8qIFB1c2ggY29tbWFuZCBwYXJzZXIgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgaWZjOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlmY3NhdiA9IGlmYzsgLyogUHVzaCBJRiBjb25kaXRpb24gb24gc3RhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBwYXJzZXIoMSk7ICAvKiBDYWxsIHBhcnNlciB0byBleGVjdXRlIHRoZSBtYWNybyAqLworICAgICAgICAgICAgICAgICAgICAgICAgY21wb3AoKTsgICAgICAgIC8qIFBvcCBjb21tYW5kIHBhcnNlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWZjID0gaWZjc2F2OyAgIC8qIFJlc3RvcmUgSUYgY29uZGl0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9PSAwKSB7ICAgLyogTm8gZXJyb3JzLCBpZ25vcmUgYWN0aW9uIGNtZHMuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IG1ydmFsW21hY2x2bCsxXTsgLyogSWYgT0ssIHNldCByZXR1cm4gdmFsdWUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgcCA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgIC8qIENhbid0IHB1c2ggYW55IG1vcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsInp6c3RyaW5nIGZuZXZhbCBmZXhlYyBmYWlsdXJlIiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4/XFxmZXhlYygpIHRvbyBkZWVwbHkgbmVzdGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbXBvcCgpID4gLTEpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTEwLCJ6enN0cmluZyBmbmV2YWwgZmV4ZWN1dGUgZmluYWwgcCIscCwwKTsKKyAgICAgICAgZ290byBmbmVuZDsKKworI2lmZGVmIFJFQ1VSU0lWRQorICAgICAgY2FzZSBGTl9SRElSOiAgICAgICAgICAgICAgICAgICAgIC8qIFxmcmRpci4uKCkgLSBSZWN1cnNpdmUgZGlyIGNvdW50ICovCisgICAgICBjYXNlIEZOX1JGSUw6ICAgICAgICAgICAgICAgICAgICAgLyogXGZyZmlsZXMoKSAtIFJlY3Vyc2l2ZSBmaWxlIGNvdW50ICovCisgICAgICAgIC8qIHJlY3Vyc2l2ZSA9IDI7ICovICAgICAgICAgICAgLyogZmFsbCB0aHJ1Li4uICovCisjZW5kaWYgLyogUkVDVVJTSVZFICovCisgICAgICBjYXNlIEZOX0ZDOiAgICAgICAgICAgICAgICAgICAgICAgLyogXGZmaWxlcygpIC0gRmlsZSBjb3VudC4gKi8KKyAgICAgIGNhc2UgRk5fRElSOiB7ICAgICAgICAgICAgICAgICAgICAvKiBcZmZkaXIuKCkgLSBEaXJlY3RvcnkgY291bnQuICovCisgICAgICAgICAgY2hhciBhYnVmWzE2XSwgKnM7CisgICAgICAgICAgY2hhciAqKiBhcCA9IE5VTEw7CisgICAgICAgICAgaW50IHgsIHhmbGFncyA9IDA7CisgICAgICAgICAgaWYgKG1hdGNoZG90KQorICAgICAgICAgICAgeGZsYWdzIHw9IFpYX01BVENIRE9UOworICAgICAgICAgIGlmIChjeCA9PSBGTl9SRElSIHx8IGN4ID09IEZOX1JGSUwpIHsKKyAgICAgICAgICAgICAgeGZsYWdzIHw9IFpYX1JFQ1VSU0U7CisjaWZkZWYgQ0tTWU1MSU5LCisgICAgICAgICAgICAgIC8qIFJlY3Vyc2l2ZSAtIGRvbid0IGZvbGxvdyBzeW1saW5rcyAqLworICAgICAgICAgICAgICB4ZmxhZ3MgfD0gWlhfTk9MSU5LUzsKKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgZmFpbGVkID0gMDsKKyAgICAgICAgICBpZiAoYXJnbiA8IDEpIHsKKyAgICAgICAgICAgICAgcCA9ICIwIjsKKyAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGN4ID09IEZOX0RJUiB8fCBjeCA9PSBGTl9SRElSKSB7IC8qIE9ubHkgbGlzdCBkaXJlY3RvcmllcyAqLworICAgICAgICAgICAgICB4ZmxhZ3MgfD0gWlhfRElST05MWTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgenhwbiA9IDE7ICAgICAgICAgICAgICAgICAvKiBVc2UgdGhlIGFsdGVybmF0ZSBsaXN0ICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogTGlzdCBvbmx5IGZpbGVzICovCisgICAgICAgICAgICAgIHhmbGFncyB8PSBaWF9GSUxPTkxZOworI2lmZGVmIE9TMgorICAgICAgICAgICAgICB6eHBuID0gMTsgICAgICAgICAgICAgICAgIC8qIFVzZSB0aGUgYWx0ZXJuYXRlIGxpc3QgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCooYnBbMF0pKSB7CisgICAgICAgICAgICAgIGsgPSBuenhwYW5kKGJwWzBdLHhmbGFncyk7CisgICAgICAgICAgICAgIGlmIChrIDwgMCkgayA9IDA7CisgICAgICAgICAgICAgIHNwcmludGYoZm52YWwsIiVkIixrKTsgICAgLyogU0FGRSAqLworICAgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwID0gIjAiOworCisgICAgICAgICAgaWYgKGFyZ24gPiAxKSB7ICAgICAgICAgICAgICAgLyogQXNzaWduIGxpc3QgdG8gYXJyYXkgKi8KKyAgICAgICAgICAgICAgZm52YWxbMF0gPSBOVUw7ICAgICAgICAgICAvKiBJbml0aWFsIHJldHVybiB2YWx1ZSAqLworICAgICAgICAgICAgICBja3N0cm5jcHkoYWJ1ZixicFsxXSwxNik7IC8qIEdldCBhcnJheSByZWZlcmVuY2UgKi8KKyAgICAgICAgICAgICAgcyA9IGFidWY7CisgICAgICAgICAgICAgIGlmICgqcyA9PSBDTURRKSBzKys7CisgICAgICAgICAgICAgIGZhaWxlZCA9IDE7ICAgICAgICAgICAgICAgLyogQXNzdW1lIGl0J3MgYmFkICovCisgICAgICAgICAgICAgIHAgPSBmbnZhbDsgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gcmVzdWx0ICovCisgICAgICAgICAgICAgIGlmIChmbmRpYWdzKSAgICAgICAgICAgICAgLyogRGVmYXVsdCBpcyB0aGlzIGVycm9yIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfQkFEX0FSUkFZOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgIGlmIChzWzBdICE9ICcmJykgICAgICAgICAgLyogIkFkZHJlc3MiIG9mIGFycmF5ICovCisgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgaWYgKHNbMl0pCisgICAgICAgICAgICAgICAgaWYgKHNbMl0gIT0gJ1snIHx8IHNbM10gIT0gJ10nKQorICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgaWYgKHNbMV0gPj0gNjQgJiYgc1sxXSA8IDkxKSAvKiBDb252ZXJ0IHVwcGVyIHRvIGxvd2VyICovCisgICAgICAgICAgICAgICAgc1sxXSArPSAzMjsKKyAgICAgICAgICAgICAgaWYgKCh4ID0gZGNsYXJyYXkoc1sxXSxrKSkgPCAwKSAvKiBGaWxlIGxpc3QgcGx1cyBjb3VudCAqLworICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgIGZhaWxlZCA9IDA7ICAgICAgICAgICAgICAgLyogVW5zZXQgZmFpbHVyZSBmbGFnICovCisgICAgICAgICAgICAgIGFwID0gYV9wdHJbeF07ICAgICAgICAgICAgLyogUG9pbnQgdG8gYXJyYXkgd2UganVzdCBkZWNsYXJlZCAqLworICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCIlZCIsayk7ICAgIC8qIFNBRkUgKi8KKyAgICAgICAgICB9CisjaWZkZWYgT1MyCisgICAgICAgICAgaWYgKGFwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogV2UgYXJlIG1ha2luZyBhbiBhcnJheSAqLworICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgY2hhciB0bXBbMTZdOworICAgICAgICAgICAgICBhcFswXSA9IE5VTEw7ICAgICAgICAgICAgIC8qIENvbnRhaW5pbmcgbnVtYmVyIG9mIGZpbGVzICAgICovCisgICAgICAgICAgICAgIG1ha2VzdHIoJihhcFswXSksY2tpdG9hKGspKTsKKworICAgICAgICAgICAgICBja3N0cm5jcHkodG1wLGZudmFsLDE2KTsgIC8qIFNhdmUgcmV0dXJuIHZhbHVlICovCisKKyAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBrOyBpKyspIHsgLyogRmlsbCBpdCAqLworICAgICAgICAgICAgICAgICAgYXBbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgem5leHQoZm52YWwpOyAgICAgICAgIC8qIE5leHQgZmlsZW5hbWUgKi8KKyAgICAgICAgICAgICAgICAgIGlmICghKmZudmFsKSAgICAgICAgICAvKiBObyBtb3JlLCBkb25lICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogSW4gY2FzZSBhIHByZW1hdHVyZSBlbmQgKi8KKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJihhcFtpXSksZm52YWwpOworICAgICAgICAgICAgICB9CisjaWZkZWYgWlhSRVdJTkQKKyAgICAgICAgICAgICAgayA9IHp4cmV3aW5kKCk7ICAgICAgICAgICAvKiBSZXNldCB0aGUgZmlsZSBleHBhbnNpb24gKi8KKyNlbHNlCisgICAgICAgICAgICAgIGsgPSBuenhwYW5kKGJwWzBdLHhmbGFncyk7CisjZW5kaWYgLyogWlhSRVdJTkQgKi8KKyAgICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLHRtcCxGTlZBTEwpOyAvKiBSZXN0b3JlIHJldHVybiB2YWx1ZSAqLworICAgICAgICAgIH0KKyNlbHNlIC8qIE9TMiAqLworICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1ha2UgY29waWVzIG9mIHRoZSBsaXN0ICovCisgICAgICAgICAgICAgIGludCBpOyBjaGFyIHRtcFsxNl07CisgICAgICAgICAgICAgIGlmIChmbGlzdCkgeyAgICAgICAgICAgICAgLyogRnJlZSBvbGQgZmlsZSBsaXN0LCBpZiBhbnkgKi8KKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGZsaXN0W2ldOyBpKyspIHsgLyogYW5kIGVhY2ggc3RyaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgZnJlZShmbGlzdFtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgZmxpc3RbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZnJlZSgoY2hhciAqKWZsaXN0KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBja3N0cm5jcHkodG1wLGZudmFsLDE2KTsgIC8qIFNhdmUgb3VyIHJldHVybiB2YWx1ZSAqLworICAgICAgICAgICAgICBmbGlzdCA9IChjaGFyICoqKSBtYWxsb2MoKGsrMSkgKiBzaXplb2YoY2hhciAqKSk7IC8qIE5ldyBhcnJheSAqLworICAgICAgICAgICAgICBpZiAoZmxpc3QpIHsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gazsgaSsrKSB7IC8qIEZpbGwgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICBmbGlzdFtpXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgem5leHQoZm52YWwpOyAgICAgLyogTmV4dCBmaWxlbmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgIGlmICghKmZudmFsKSAgICAgIC8qIE5vIG1vcmUsIGRvbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJihmbGlzdFtpXSksZm52YWwpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKGFwKSB7ICAgICAgICAgICAgIC8qIElmIGFycmF5IHBvaW50ZXIgZ2l2ZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBhcFswXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmKGFwWzBdKSxja2l0b2EoaykpOworICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspIHsgLyogQ29weSBmaWxlIGxpc3QgdG8gYXJyYXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXBbaSsxXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJihhcFtpKzFdKSxmbGlzdFtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNrc3RybmNweShmbnZhbCx0bXAsRk5WQUxMKTsgLyogUmVzdG9yZSByZXR1cm4gdmFsdWUgKi8KKyAgICAgICAgICAgICAgZmxpc3RuID0gMDsgICAgICAgICAgICAgICAvKiBSZXNldCBnbG9iYWwgbGlzdCBwb2ludGVyICovCisgICAgICAgICAgfQorI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIFJFQ1VSU0lWRQorICAgICAgICAgIHJlY3Vyc2l2ZSA9IHJzYXZlOworI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworI2lmZGVmIE9TMgorICAgICAgICAgIHp4cG4gPSB6c2F2ZTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgIH0KKyAgICAgIGdvdG8gZm5lbmQ7CisKKyAgICAgIGNhc2UgRk5fRklMOiAgICAgICAgICAgICAgICAgICAgICAvKiBcZm5leHRmaWxlKCkgLSBOZXh0IGZpbGUgaW4gbGlzdC4gKi8KKyAgICAgICAgcCA9IGZudmFsOyAgICAgICAgICAgICAgICAgICAgICAvKiAobm8gYXJncykgKi8KKyAgICAgICAgKnAgPSBOVUw7CisjaWZkZWYgT1MyCisgICAgICAgIHp4cG4gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgLyogT1MvMiAtIHVzZSB0aGUgYWx0ZXJuYXRlIGxpc3QgKi8KKyAgICAgICAgem5leHQocCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsIHN5c3RlbS1kZXBlbmRlbnQgZnVuY3Rpb24gKi8KKyAgICAgICAgenhwbiA9IHpzYXZlOyAgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIGxpc3QgKi8KKyNlbHNlCisgICAgICAgIGlmIChmbGlzdCkgICAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJzLCB1c2Ugb3VyIG93biBsaXN0LiAqLworICAgICAgICAgIGlmIChmbGlzdFtmbGlzdG5dKQorICAgICAgICAgICAgcCA9IGZsaXN0W2ZsaXN0bisrXTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgZ290byBmbmVuZDsKKworICAgIH0gLyogQnJlYWsgdXAgYmlnIHN3aXRjaC4uLiAqLworCisgICAgc3dpdGNoIChjeCkgeworICAgICAgY2FzZSBGTl9JTkQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmaW5kZXgoczEsczIsc3RhcnQpICovCisgICAgICBjYXNlIEZOX1JJWDogICAgICAgICAgICAgICAgICAgICAgLyogXGZyaW5kZXgoczEsczIsc3RhcnQpICovCisgICAgICBjYXNlIEZOX1NFQVJDSDogICAgICAgICAgICAgICAgICAgLyogXGZzZWFyY2gocGF0LHN0cmluZyxzdGFydCkgKi8KKyAgICAgIGNhc2UgRk5fUlNFQVJDSDogeyAgICAgICAgICAgICAgICAvKiBcZnJzZWFyY2gocGF0LHN0cmluZyxzdGFydCkgKi8KKyAgICAgICAgaW50IGkgPSAwLCByaWdodCA9IDAsIHNlYXJjaCA9IDA7CisgICAgICAgIHJpZ2h0ID0gKGN4ID09IEZOX1JJWCB8fCBjeCA9PSBGTl9SU0VBUkNIKTsKKyAgICAgICAgc2VhcmNoID0gKGN4ID09IEZOX1NFQVJDSCB8fCBjeCA9PSBGTl9SU0VBUkNIKTsKKyAgICAgICAgcCA9ICIwIjsKKyAgICAgICAgaWYgKGFyZ24gPiAxKSB7ICAgICAgICAgICAgICAgICAvKiBPbmx5IHdvcmtzIGlmIHdlIGhhdmUgMiBvciAzIGFyZ3MgKi8KKyAgICAgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgICAgICBjaGFyICogcGF0ID0gTlVMTDsKKyAgICAgICAgICAgIGxlbjEgPSAoaW50KXN0cmxlbihwYXQgPSBicFswXSk7IC8qIGxlbmd0aCBvZiBzdHJpbmcgdG8gbG9vayBmb3IgKi8KKyAgICAgICAgICAgIGxlbjIgPSAoaW50KXN0cmxlbihzID0gYnBbMV0pOyAvKiBsZW5ndGggb2Ygc3RyaW5nIHRvIGxvb2sgaW4gKi8KKyAgICAgICAgICAgIGlmIChsZW4xIDwgMSB8fCBsZW4yIDwgMSkgICAvKiBXYXRjaCBvdXQgZm9yIGVtcHR5IHN0cmluZ3MgKi8KKyAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgIHN0YXJ0ID0gcmlnaHQgPyAtMSA6IDA7ICAgICAvKiBEZWZhdWx0IHN0YXJ0aW5nIHBvc2l0aW9uICovCisgICAgICAgICAgICBpZiAoYXJnbiA+IDIpIHsKKyAgICAgICAgICAgICAgICB2YWwxID0gKihicFsyXSkgPyBldmFseChicFsyXSkgOiAiMSI7CisgICAgICAgICAgICAgICAgaWYgKGNoa251bSh2YWwxKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgdDsKKyAgICAgICAgICAgICAgICAgICAgdCA9IGF0b2kodmFsMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghc2VhcmNoKSB7ICAgICAgLyogSW5kZXggb3IgUmluZGV4ICovCisgICAgICAgICAgICAgICAgICAgICAgICBqID0gbGVuMiAtIGxlbjE7IC8qIExlbmd0aCBkaWZmZXJlbmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICB0LS07ICAgICAgICAgICAgIC8qIENvbnZlcnQgcG9zaXRpb24gdG8gMC1iYXNlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPCAwKSB0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmlnaHQgJiYgc3RhcnQgPCAwKSBzdGFydCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgLyogU2VhcmNoIG9yIFJzZWFyY2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPCAwKSB0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyaWdodCkgeyAgICAvKiBSaWdodCB0byBsZWZ0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPiBsZW4yKSB0ID0gbGVuMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGxlbjIgLSB0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gbGVuMiAtIHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1t4XSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAvKiBMZWZ0IHRvIHJpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSB0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IGxlbjIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZXZhbGVycihmbik7CisgICAgICAgICAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VhcmNoKSB7ICAgICAgICAgICAgICAgLyogXGZzZWFyY2goKSBvciBcZnJzZWFyY2goKSAqLworICAgICAgICAgICAgICAgIGlmIChyaWdodCAmJiBwYXRbMF0gPT0gJ14nKSB7CisgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSBsZW4yIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgaSA+PSAwICYmICFja21hdGNoKHBhdCxzK2ksaW5wY2FzW2NtZGx2bF0sMSs0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpLS0pIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCAwKSBpID0gMDsgZWxzZSBpKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaSA9IGNrbWF0Y2gocGF0LCZzW3N0YXJ0XSxpbnBjYXNbY21kbHZsXSwxKzQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPiAwKSBpICs9IHN0YXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaSA9IGNraW5kZXgocGF0LGJwWzFdLHN0YXJ0LHJpZ2h0LGlucGNhc1tjbWRsdmxdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZm52YWwsIiVkIixpKTsgICAgICAvKiBTQUZFICovCisgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgIH0KKyAgICAgICAgZ290byBmbmVuZDsKKyAgICAgIH0KKworICAgICAgY2FzZSBGTl9SUEw6ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmcmVwbGFjZShzMSxzMixzMykgKi8KKyAgICAgIC8qCisgICAgICAgIHMgPSBicFswXSA9IHNvdXJjZSBzdHJpbmcKKyAgICAgICAgICAgIGJwWzFdID0gbWF0Y2ggc3RyaW5nCisgICAgICAgICAgICBicFsyXSA9IHJlcGxhY2VtZW50IHN0cmluZworICAgICAgICAgICAgYnBbM10gPSB3aGljaCBvY2N1cnJlbmNlIChkZWZhdWx0ID0gYWxsKTsKKyAgICAgICAgcCA9IGZudmFsID0gZGVzdGluYXRpb24gKHJlc3VsdCkgc3RyaW5nCisgICAgICAqLworICAgICAgICBpZiAoYXJnbiA8IDEpICAgICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgKi8KKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICBpZiAoYXJnbiA8IDIpIHsgICAgICAgICAgICAgICAgIC8qIE9ubHkgd29ya3MgaWYgd2UgaGF2ZSAyIG9yIDMgYXJncyAqLworICAgICAgICAgICAgY2tzdHJuY3B5KHAsYnBbMF0sRk5WQUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBvY2N1ciA9IDAsIHh4ID0gMCwgajI7CisgICAgICAgICAgICBsZW4xID0gKGludClzdHJsZW4oYnBbMF0pOyAgLyogbGVuZ3RoIG9mIHN0cmluZyB0byBsb29rIGluICovCisgICAgICAgICAgICBsZW4yID0gKGludClzdHJsZW4oYnBbMV0pOyAgLyogbGVuZ3RoIG9mIHN0cmluZyB0byBsb29rIGZvciAqLworICAgICAgICAgICAgbGVuMyA9IChhcmduIDwgMykgPyAwIDogKGludClzdHJsZW4oYnBbMl0pOyAvKiBMZW4gb2YgcmVwbGFjZW1udCAqLworICAgICAgICAgICAgaiA9IGxlbjEgLSBsZW4yICsgMTsKKyAgICAgICAgICAgIGoyID0gajsKKyAgICAgICAgICAgIGlmIChhcmduID4gMykgeworICAgICAgICAgICAgICAgIGlmIChjaGtudW0oYnBbM10pKSB7CisgICAgICAgICAgICAgICAgICAgIG9jY3VyID0gYXRvaShicFszXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QVJHX05PVF9OVU1FUklDOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgYXJncyBvdXQgb2Ygd2hhY2suLi4gKi8KKyAgICAgICAgICAgIGlmIChqIDwgMSB8fCBsZW4xID09IDAgfHwgbGVuMiA9PSAwKSB7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHAsYnBbMF0sRk5WQUxMKTsgLyoganVzdCByZXR1cm4gb3JpZ2luYWwgc3RyaW5nICovCisgICAgICAgICAgICAgICAgcFtGTlZBTExdID0gTlVMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmFnYWluOgorICAgICAgICAgICAgICAgIHMgPSBicFswXTsgICAgICAgICAgICAgIC8qIFBvaW50IHRvIGJlZ2lubmluZyBvZiBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoai0tID4gMCkgeyAgICAgICAvKiBGb3IgZWFjaCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFja3N0cmNtcChicFsxXSxzLGxlbjIsaW5wY2FzW2NtZGx2bF0pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAob2NjdXIgPT0gMCB8fCBvY2N1ciA9PSArK3h4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbjMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkocCxicFsyXSxGTlZBTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gbGVuMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gbGVuMjsgICAgICAvKiBhbmQgc2tpcCBwYXN0IGl0LiAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgIC8qIE5vLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9ICpzKys7ICAgIC8qIGp1c3QgY29weSB0aGlzIGNoYXJhY3RlciAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpwID0gTlVMOworICAgICAgICAgICAgICAgIHdoaWxlICgoKnArKyA9ICpzKyspKTsKKyAgICAgICAgICAgICAgICBpZiAob2NjdXIgPCAwKSB7ICAgICAgICAvKiBjaGVhcC4uLiAqLworICAgICAgICAgICAgICAgICAgICBvY2N1ciA9IHh4ICsgb2NjdXIgKyAxOworICAgICAgICAgICAgICAgICAgICB4eCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGoyOworICAgICAgICAgICAgICAgICAgICBpZiAob2NjdXIgPiAwKQorICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmFnYWluOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwID0gZm52YWw7CisgICAgICAgIGdvdG8gZm5lbmQ7CisKKyAgICAgIGNhc2UgRk5fQ0hSOiAgICAgICAgICAgICAgICAgICAgICAvKiBcZmNoYXJhY3RlcihhcmcxKSAqLworICAgICAgICB2YWwxID0gKihicFswXSkgPyBldmFseChicFswXSkgOiAiIjsKKyAgICAgICAgaWYgKGNoa251bSh2YWwxKSkgeyAgICAgICAgICAgICAvKiBNdXN0IGJlIG51bWVyaWMgKi8KKyAgICAgICAgICAgIGkgPSBhdG9pKHZhbDEpOworICAgICAgICAgICAgaWYgKGkgPj0gMCAmJiBpIDwgMjU2KSB7ICAgIC8qIE11c3QgYmUgYW4gOC1iaXQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgICAgICAgKnArKyA9IChjaGFyKSBpOworICAgICAgICAgICAgICAgICpwID0gTlVMOworICAgICAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QVJHX09VVF9PRl9SQU5HRTpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgIGV2YWxlcnIoZm4pOworICAgICAgICB9CisgICAgICAgIGdvdG8gZm5lbmQ7CisKKyAgICAgIGNhc2UgRk5fQ09EOiAgICAgICAgICAgICAgICAgICAgICAvKiBcZmNvZGUoY2hhcikgKi8KKyAgICAgICAgaWYgKChpbnQpc3RybGVuKGJwWzBdKSA+IDApIHsKKyAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgIGkgPSAqYnBbMF07CisgICAgICAgICAgICBzcHJpbnRmKHAsIiVkIiwoaSAmIDB4ZmYpKTsgLyogU0FGRSAqLworICAgICAgICB9IGVsc2UgcCA9ICIwIjsJCQkvKiBDYW4ndCBoYXBwZW4gKi8KKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9MRU46ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmbGVuZ3RoKGFyZzEpICovCisgICAgICAgIGlmIChhcmduID4gMCkgeworICAgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgICAgc3ByaW50ZihwLCIlZCIsKGludClzdHJsZW4oYnBbMF0pKTsgLyogU0FGRSAqLworICAgICAgICB9IGVsc2UgcCA9ICIwIjsKKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9MT1c6ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmbG93ZXIoYXJnMSkgKi8KKyAgICAgICAgcyA9IGJwWzBdID8gYnBbMF0gOiAiIjsKKyAgICAgICAgcCA9IGZudmFsOworICAgICAgICB3aGlsZSAoKnMpIHsKKyAgICAgICAgICAgIGlmIChpc3VwcGVyKCpzKSkKKyAgICAgICAgICAgICAgKnAgPSAoY2hhcikgdG9sb3dlcigqcyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICpwID0gKnM7CisgICAgICAgICAgICBwKys7IHMrKzsKKyAgICAgICAgfQorICAgICAgICAqcCA9IE5VTDsKKyAgICAgICAgcCA9IGZudmFsOworICAgICAgICBnb3RvIGZuZW5kOworCisgICAgICBjYXNlIEZOX01BWDogICAgICAgICAgICAgICAgICAgICAgLyogXGZtYXgoYXJnMSxhcmcyKSAqLworICAgICAgY2FzZSBGTl9NSU46ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmbWluKGFyZzEsYXJnMikgKi8KKyAgICAgIGNhc2UgRk5fTU9EOiAgICAgICAgICAgICAgICAgICAgICAvKiBcZm1vZChhcmcxLGFyZzIpICovCisgICAgICAgIHZhbDEgPSAqKGJwWzBdKSA/IGV2YWx4KGJwWzBdKSA6ICIiOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgLyogTm8gbG9uZ2VyIG5lY2Vzc2FyeSBiZWNhdXNlIGV2YWx4KCkgbm8gbG9uZ2VyIG92ZXJ3cml0ZXMgaXRzICovCisgICAgICAgIC8qIHJlc3VsdCBldmVyeSB0aW1lIGl0J3MgY2FsbGVkICgyMDAwLzA5LzIzKS4gKi8KKyAgICAgICAgZnJlZShicFswXSk7CisgICAgICAgIGJwWzBdID0gTlVMTDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIGlmIChhcmduID4gMSkgeworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIC8qIERpdHRvLi4uICovCisgICAgICAgICAgICBicFswXSA9IG1hbGxvYygoaW50KXN0cmxlbih2YWwxKSsxKTsKKyAgICAgICAgICAgIGlmIChicFswXSkKKyAgICAgICAgICAgICAgc3RyY3B5KGJwWzBdLHZhbDEpOyAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICB2YWwxID0gYnBbMF07CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgdmFsMiA9ICooYnBbMV0pID8gZXZhbHgoYnBbMV0pIDogIiI7CisgICAgICAgICAgICBpZiAoY2hrbnVtKHZhbDEpICYmIGNoa251bSh2YWwyKSkgeworICAgICAgICAgICAgICAgIGkgPSBhdG9pKHZhbDEpOworICAgICAgICAgICAgICAgIGogPSBhdG9pKHZhbDIpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoeSkgeworICAgICAgICAgICAgICAgICAgY2FzZSBGTl9NQVg6CisgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgaSkgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBGTl9NSU46CisgICAgICAgICAgICAgICAgICAgIGlmIChqID4gaSkgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBGTl9NT0Q6CisgICAgICAgICAgICAgICAgICAgIGlmIChqID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkRJVklERV9CWV9aRVJPOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZudmFsWzBdID0gTlVMOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgaiA9IGkgJSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgICAgICAgc3ByaW50ZihwLCIlZCIsaik7ICAgICAgLyogU0FGRSAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICAgIGV2YWxlcnIoZm4pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgcCA9IHZhbDE7CisgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgfSAvKiBCcmVhayB1cCBiaWcgc3dpdGNoLi4uICovCisKKyAgICBzd2l0Y2ggKHkpIHsKKyAgICAgIGNhc2UgRk5fU1VCOiAgICAgICAgICAgICAgICAgICAgICAvKiBcZnN1YnN0cihhcmcxLGFyZzIsYXJnMykgKi8KKyAgICAgIGNhc2UgRk5fUklHOiAgICAgICAgICAgICAgICAgICAgICAvKiBcZnJpZ2h0KGFyZzEsYXJnMikgKi8KKyAgICAgIGNhc2UgRk5fTEVGOiAgICAgICAgICAgICAgICAgICAgICAvKiBcZmxlZnQoYXJnMSxhcmcyKSAqLworICAgICAgICBpZiAoYXJnbiA8IDEpCisgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgdmFsMSA9ICIiOworICAgICAgICBpZiAoYXJnbiA+IDEpCisgICAgICAgICAgaWYgKCooYnBbMV0pKQorICAgICAgICAgICAgdmFsMSA9ICBldmFseChicFsxXSk7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICBpZiAoYnBbMV0pIGZyZWUoYnBbMV0pOyAgICAgICAgIC8qIEhhdmUgdG8gY29weSB0aGlzICovCisgICAgICAgIGJwWzFdID0gbWFsbG9jKChpbnQpc3RybGVuKHZhbDEpKzEpOworICAgICAgICBpZiAoIWJwWzFdKSB7CisgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpIHsKKyAgICAgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6TUFMTE9DX0ZBSUxVUkU6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KGJwWzFdLHZhbDEpOyAgICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgIHZhbDEgPSBicFsxXTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIHZhbDIgPSAiIjsKKyAgICAgICAgaWYgKGFyZ24gPiAyKQorICAgICAgICAgIGlmICgqKGJwWzJdKSkKKyAgICAgICAgICAgIHZhbDIgPSBldmFseChicFsyXSk7CisgICAgICAgIGlmICgKKyAgICAgICAgICAgICgoYXJnbiA+IDEpICYmIChpbnQpc3RybGVuKHZhbDEpICYmICFyZGlnaXRzKHZhbDEpKSB8fAorICAgICAgICAgICAgKChjeCA9PSBGTl9TVUIpICYmCisgICAgICAgICAgICAgICgoYXJnbiA+IDIpICYmIChpbnQpc3RybGVuKHZhbDIpICYmICFyZGlnaXRzKHZhbDIpKSkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgIGV2YWxlcnIoZm4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGx4OworICAgICAgICAgICAgcCA9IGZudmFsOyAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gcmVzdWx0ICovCisgICAgICAgICAgICBseCA9IHN0cmxlbihicFswXSk7ICAgICAgICAgLyogbGVuZ3RoIG9mIGFyZzEgKi8KKyAgICAgICAgICAgIGlmIChjeCA9PSBGTl9TVUIpIHsgICAgICAgICAvKiBzdWJzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICBrID0gKGFyZ24gPiAyKSA/IGF0b2kodmFsMikgOiBNQVhBUkdMRU47IC8qIGxlbmd0aCAqLworICAgICAgICAgICAgICAgIGogPSAoYXJnbiA+IDEpID8gYXRvaSh2YWwxKSA6IDE7IC8qIHN0YXJ0IHBvcyBmb3Igc3Vic3RyICovCisgICAgICAgICAgICB9IGVsc2UgaWYgKGN4ID09IEZOX0xFRikgeyAgLyogbGVmdCAqLworICAgICAgICAgICAgICAgIGsgPSAoYXJnbiA+IDEpID8gYXRvaSh2YWwxKSA6IGx4OworICAgICAgICAgICAgICAgIGogPSAxOworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0ICovCisgICAgICAgICAgICAgICAgayA9IChhcmduID4gMSkgPyBhdG9pKHZhbDEpIDogbHg7IC8qIGxlbmd0aCAqLworICAgICAgICAgICAgICAgIGogPSBseCAtIGsgKyAxOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IHBvcyBmb3IgcmlnaHQgKi8KKyAgICAgICAgICAgICAgICBpZiAoaiA8IDEpIGogPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGsgPiAwICYmIGogPD0gbHgpIHsgICAgICAgICAgICAgIC8qIGlmIHN0YXJ0IHBvcyBpbiByYW5nZSAqLworICAgICAgICAgICAgICAgIHMgPSBicFswXStqLTE7ICAgICAgICAgICAgICAgICAgIC8qIHBvaW50IHRvIHNvdXJjZSBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGspICYmICgqcCsrID0gKnMrKyk7IGkrKykgOyAgLyogY29weSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnAgPSBOVUw7ICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmF0ZSB0aGUgcmVzdWx0ICovCisgICAgICAgICAgICBwID0gZm52YWw7ICAgICAgICAgICAgICAgICAgLyogYW5kIHBvaW50IHRvIGl0LiAqLworICAgICAgICB9CisgICAgICAgIGdvdG8gZm5lbmQ7CisKKyAgICAgIGNhc2UgRk5fVVBQOiAgICAgICAgICAgICAgICAgICAgICAvKiBcZnVwcGVyKGFyZzEpICovCisgICAgICAgIHMgPSBicFswXSA/IGJwWzBdIDogIiI7CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgd2hpbGUgKCpzKSB7CisgICAgICAgICAgICBpZiAoaXNsb3dlcigqcykpCisgICAgICAgICAgICAgICpwID0gKGNoYXIpIHRvdXBwZXIoKnMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAqcCA9ICpzOworICAgICAgICAgICAgcCsrOyBzKys7CisgICAgICAgIH0KKyAgICAgICAgKnAgPSBOVUw7CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9SRVA6ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmcmVwZWF0KHRleHQsbnVtYmVyKSAqLworICAgICAgICBpZiAoYXJnbiA8IDEpCisgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgdmFsMSA9ICIxIjsKKyAgICAgICAgaWYgKGFyZ24gPiAxKQorICAgICAgICAgIGlmICgqKGJwWzFdKSkKKyAgICAgICAgICAgIHZhbDEgPSBldmFseChicFsxXSk7CisgICAgICAgIGlmIChjaGtudW0odmFsMSkpIHsgICAgICAgICAgICAgLyogUmVwZWF0IGNvdW50ICovCisgICAgICAgICAgICBuID0gYXRvaSh2YWwxKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIlNVTkRBWSBmcmVwZWF0IG4iLHZhbDEsbik7CisgICAgICAgICAgICBpZiAobiA+IDApIHsgICAgICAgICAgICAgICAgLyogTWFrZSBuIGNvcGllcyAqLworICAgICAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgICAgICAqcCA9ICdcMCc7CisgICAgICAgICAgICAgICAgayA9IChpbnQpc3RybGVuKGJwWzBdKTsgLyogTWFrZSBzdXJlIHN0cmluZyBoYXMgc29tZSBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJTVU5EQVkgZnJlcGVhdCBrIiwiIixrKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJTVU5EQVkgZnJlcGVhdCBGTlZBTEwiLCIiLEZOVkFMTCk7CisgICAgICAgICAgICAgICAgaWYgKGsgKiBuID49IEZOVkFMTCkgeyAgLyogQnV0IG5vdCB0b28gbXVjaC4uLiAqLworICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpSRVNVTFRfVE9PX0xPTkc6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGZudmFsWzBdID0gTlVMOworICAgICAgICAgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChrID4gMCkgeyAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIHNvbWV0aGluZyB0byBjb3B5ICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsgLyogQ29weSBsb29wICovCisgICAgICAgICAgICAgICAgICAgICAgICBzID0gYnBbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgazsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwIC0gZm52YWwpID49IEZOVkFMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAvKiBzaG91bGRuJ3QgaGFwcGVuLi4uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9ICpzKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKnAgPSBOVUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgIGV2YWxlcnIoZm4pOworICAgICAgICB9CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgZ290byBmbmVuZDsKKworI2lmbmRlZiBOT0ZSSUxMUworICAgICAgY2FzZSBGTl9SRVY6ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmcmV2ZXJzZSgpICovCisgICAgICAgIGlmIChhcmduIDwgMSkKKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB5eXN0cmluZyhicFswXSwmcCk7CisgICAgICAgIGdvdG8gZm5lbmQ7CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworICAgICAgY2FzZSBGTl9SUEE6ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmcnBhZCgpIGFuZCBcZmxwYWQoKSAqLworICAgICAgY2FzZSBGTl9MUEE6CisgICAgICAgIGlmIChhcmduIDwgMSkKKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB2YWwxID0gIiI7CisgICAgICAgIGlmIChhcmduID4gMSkKKyAgICAgICAgICBpZiAoKihicFsxXSkpCisgICAgICAgICAgICB2YWwxID0gZXZhbHgoYnBbMV0pOworICAgICAgICBpZiAoYXJnbiA9PSAxKSB7ICAgICAgICAgICAgICAgIC8qIElmIGEgbnVtYmVyIHdhc24ndCBnaXZlbiAqLworICAgICAgICAgICAgcCA9IGZudmFsOyAgICAgICAgICAgICAgICAgIC8qIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KKyAgICAgICAgICAgIGNrc3RybmNweShwLGJwWzBdLEZOVkFMTCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnbiA+IDEgJiYgICEqdmFsMSkgeworICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgIGV2YWxlcnIoZm4pOworICAgICAgICB9IGVsc2UgLyogaWYgKGNoa251bSh2YWwxKSkgKi8geyAvKiBSZXBlYXQgY291bnQgKi8KKyAgICAgICAgICAgIGNoYXIgcGM7CisgICAgICAgICAgICBuID0gYXRvaSh2YWwxKTsKKyAgICAgICAgICAgIGlmIChuID49IDApIHsKKyAgICAgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgICAgICAgayA9IChpbnQpc3RybGVuKGJwWzBdKTsgLyogTGVuZ3RoIG9mIHN0cmluZyB0byBiZSBwYWRkZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAoayA+PSBuKSB7ICAgICAgICAgICAvKiBJdCdzIGFscmVhZHkgbG9uZyBlbm91Z2ggKi8KKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHAsYnBbMF0sRk5WQUxMKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobiArIGsgPD0gRk5WQUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYyA9IChjaGFyKSAoKGFyZ24gPCAzKSA/IFNQIDogKmJwWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGMpIHBjID0gU1A7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3ggPT0gRk5fUlBBKSB7IC8qIFJQQUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KHAsYnBbMF0sayk7IC8qIChsZWF2ZSBpdCBsaWtlIHRoaXMpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFtrXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gazsgaSA8IG47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAvKiBMUEFEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAtPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweShwLGJwWzBdLGspOyAvKiAobGVhdmUgaXQgbGlrZSB0aGlzKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBba10gPSBOVUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICpwID0gTlVMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwID0gZm52YWw7CisgICAgICAgIGdvdG8gZm5lbmQ7CisKKyNpZmRlZiBaRkNEQVQKKyAgICAgIGNhc2UgRk5fRkQ6ICAgICAgICAgICAgICAgICAgICAgICAvKiBcZmRhdGUoZmlsZW5hbWUpICovCisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgcyA9IHpmY2RhdChicFswXSk7CisgICAgICAgIGlmICghcykgcyA9ICIiOworICAgICAgICBpZiAoISpzKSB7CisgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwiPEVSUk9SOkZJTEVfTk9UX0ZPVU5EOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisgICAgICAgIGNrc3RybmNweShmbnZhbCxzLEZOVkFMTCk7CisjZW5kaWYgLyogWkZDREFUICovCisgICAgICAgIGdvdG8gZm5lbmQ7CisKKyAgICB9IC8qIEJyZWFrIHVwIGJpZyBzd2l0Y2guLi4gKi8KKworICAgIHN3aXRjaCAoeSkgeworICAgICAgY2FzZSBGTl9GUzogICAgICAgICAgICAgICAgICAgICAgIC8qIFxmc2l6ZShmaWxlbmFtZSkgKi8KKyAgICAgICAgcCA9IGZudmFsOworICAgICAgICB6ID0gemNoa2koYnBbMF0pOworICAgICAgICBpZiAoeiA8IDApIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICBpZiAoZm5kaWFncykgeworICAgICAgICAgICAgICAgIGlmICh6ID09IC0xKQorICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpGSUxFX05PVF9GT1VORDpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHogPT0gLTIpCisgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkZJTEVfTk9UX1JFQURBQkxFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoeiA9PSAtMykKKyAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6RklMRV9OT1RfQUNDRVNTSUJMRTpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6RklMRV9FUlJPUjpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgfQorICAgICAgICBzcHJpbnRmKGZudmFsLCIlbGQiLHopOyAgICAgICAgIC8qIFNBRkUgKi8KKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9WRVI6ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmdmVyaWZ5KCkgKi8KKwlwID0gIi0xIjsKKwlpZiAoYXJnbiA9PSAxKQkJCS8qIE5vIHNlY29uZCBhcmcgKi8KKwkgIGdvdG8gZm5lbmQ7CisJZWxzZSBpZiAoIWJwWzFdKQkJLyogT3Igc2Vjb25kIGFyZyBudWxsICovCisJICBnb3RvIGZuZW5kOworCWVsc2UgaWYgKCEqKGJwWzFdKSkJCS8qIG9yIGVtcHR5LiAqLworCSAgZ290byBmbmVuZDsKKyAgICAgICAgcCA9ICIwIjsKKyAgICAgICAgaWYgKGFyZ24gPiAxKSB7ICAgICAgICAgICAgICAgICAvKiBPbmx5IHdvcmtzIGlmIHdlIGhhdmUgMiBvciAzIGFyZ3MgKi8KKyAgICAgICAgICAgIGludCBzdGFydDsKKyAgICAgICAgICAgIGNoYXIgKnMyLCBjaDEsIGNoMjsKKyAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGlmIChhcmduID4gMikgeyAgICAgICAgICAgICAvKiBTdGFydGluZyBwb3NpdGlvbiBzcGVjaWZpZWQgKi8KKyAgICAgICAgICAgICAgICB2YWwxID0gKihicFsyXSkgPyBldmFseChicFsyXSkgOiAiMCI7CisgICAgICAgICAgICAgICAgaWYgKGNoa251bSh2YWwxKSkgeworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGF0b2kodmFsMSkgLyogLSAxICovOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA+IChpbnQpc3RybGVuKGJwWzFdKSkKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIHZlcmZpbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBldmFsZXJyKGZuKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpID0gc3RhcnQ7CisgICAgICAgICAgICBwID0gIjAiOworICAgICAgICAgICAgZm9yIChzID0gYnBbMV0gKyBzdGFydDsgKnM7IHMrKyxpKyspIHsKKyAgICAgICAgICAgICAgICBjaDEgPSAqczsKKyAgICAgICAgICAgICAgICBpZiAoIWlucGNhc1tjbWRsdmxdKSBpZiAoaXNsb3dlcihjaDEpKSBjaDEgPSB0b3VwcGVyKGNoMSk7CisgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChzMiA9IGJwWzBdOyAqczI7IHMyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2gyID0gKnMyOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlucGNhc1tjbWRsdmxdKSBpZiAoaXNsb3dlcihjaDIpKSBjaDIgPSB0b3VwcGVyKGNoMik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaDEgPT0gY2gyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBqID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihmbnZhbCwiJWQiLGkrMSk7IC8qIFNBRkUgKi8KKyAgICAgICAgICAgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIHZlcmZpbjoKKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9JUEE6ICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgYW5kIHJldHVybiBJUCBhZGRyZXNzICovCisgICAgICAgIGlmIChhcmduID4gMCkgeyAgICAgICAgICAgICAgICAgLyogaW4gYXJndW1lbnQgc3RyaW5nLiAqLworICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGlmIChhcmduID4gMSkgeyAgICAgICAgICAgICAvKiBTdGFydGluZyBwb3NpdGlvbiBzcGVjaWZpZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAoY2hrbnVtKGJwWzFdKSkgeworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGF0b2koYnBbMV0pIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19OT1RfTlVNRVJJQzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAgPSBnZXRpcChicFswXStzdGFydCk7CisgICAgICAgIH0gZWxzZSBwID0gIiI7CisgICAgICAgIGdvdG8gZm5lbmQ7CisKKyNpZmRlZiBPUzIKKyAgICAgIGNhc2UgRk5fQ1JZOgorICAgICAgICBwID0gIiI7CisgICAgICAgIGlmIChhcmduID4gMCkgeworICAgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgICAgY2tzdHJuY3B5KHAsYnBbMF0sRk5WQUxMKTsKKyAgICAgICAgICAgIGNrX2VuY3J5cHQocCk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9PT1g6CisgICAgICAgIHAgPSAiIjsKKyAgICAgICAgaWYgKGFyZ24gPiAwKQorICAgICAgICAgIHAgPSAoY2hhciAqKSBja19vb3goYnBbMF0sIChhcmduID4gMSkgPyBicFsxXSA6ICIiKTsKKyAgICAgICAgZ290byBmbmVuZDsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgICAgY2FzZSBGTl9IRVg6ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmaGV4aWZ5KGFyZzEpICovCisgICAgICAgIGlmIChhcmduIDwgMSkKKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICBpZiAoKGludClzdHJsZW4oYnBbMF0pIDwgKEZOVkFMTCAvIDIpKSB7CisgICAgICAgICAgICBzID0gYnBbMF07CisgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgICB3aGlsZSAoKnMpIHsKKyAgICAgICAgICAgICAgICB4ID0gKCpzID4+IDQpICYgMHgwZjsKKyAgICAgICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRzW3hdOworICAgICAgICAgICAgICAgIHggPSAqcysrICYgMHgwZjsKKyAgICAgICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRzW3hdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnAgPSBOVUw7CisgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgIH0KKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9VTlRBQjoJCQkvKiBcZnVudGFiKGFyZzEpICovCisJaWYgKGFyZ24gPCAxKQorCSAgZ290byBmbmVuZDsKKwlpZiAoKGludClzdHJsZW4oYnBbMF0pIDwgKEZOVkFMTCAqIDIpKSB7CisJICAgIHMgPSBicFswXTsKKwkgICAgcCA9IGZudmFsOworCSAgICBpZiAodW50YWJpZnkoYnBbMF0scCxGTlZBTEwpIDwgMCkgeworCQlmYWlsZWQgPSAxOworCQlpZiAoZm5kaWFncykKKwkJICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisJCQkgICAiPEVSUk9SOk9WRVJGTE9XOlxcZiIsZm4sIigpPiIsTlVMTCk7CisJICAgIH0KKwkgICAgZ290byBmbmVuZDsKKwl9CisKKyAgICAgIGNhc2UgRk5fVU5IOiB7ICAgICAgICAgICAgICAgICAgICAvKiBcZnVuaGV4KGFyZzEpICovCisgICAgICAgICAgaW50IGNbMl0sIGk7CisgICAgICAgICAgaWYgKGFyZ24gPCAxKQorICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICBpZiAoKGludClzdHJsZW4oYnBbMF0pIDwgKEZOVkFMTCAqIDIpKSB7CisgICAgICAgICAgICAgIHMgPSBicFswXTsKKyAgICAgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgICAgICB3aGlsZSAoKnMpIHsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICBjW2ldID0gKnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNbaV0pIHsgcCA9ICIiOyBnb3RvIHVuaGV4ZmluOyB9CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzbG93ZXIoY1tpXSkpIGNbaV0gPSB0b3VwcGVyKGNbaV0pOworICAgICAgICAgICAgICAgICAgICAgIGlmIChjW2ldID49ICcwJyAmJiBjW2ldIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjW2ldIC09IDB4MzA7CisgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjW2ldID49ICdBJyAmJiBjW2ldIDw9ICdGJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjW2ldIC09IDB4Mzc7CisgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QVJHX09VVF9PRl9SQU5HRTpcXGYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoKT4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICpwKysgPSAoKGNbMF0gPDwgNCkgJiAweGYwKSB8IChjWzFdICYgMHgwZik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKnAgPSBOVUw7CisgICAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICB9CisgICAgICAgIHVuaGV4ZmluOgorICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICB9CisKKyAgICAgIGNhc2UgRk5fQlJLOiB7ICAgICAgICAgICAgICAgICAgICAvKiBcZmJyZWFrKCkgKi8KKyAgICAgICAgICBjaGFyICogYzsgICAgICAgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXJzIHRvIGJyZWFrIG9uICovCisgICAgICAgICAgY2hhciBjMiwgczI7CisgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgICBpbnQgZG9uZSA9IDA7CisgICAgICAgICAgaWYgKGFyZ24gPCAxKQorICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICBpZiAoYXJnbiA+IDIpIHsKKyAgICAgICAgICAgICAgcyA9IGJwWzJdID8gYnBbMl0gOiAiMCI7CisgICAgICAgICAgICAgIGlmIChjaGtudW0ocykpIHsKKyAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gYXRvaShzKTsKKyAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA+IChpbnQpc3RybGVuKGJwWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBicmtmaW47CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfTk9UX05VTUVSSUM6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcyA9IGJwWzBdICsgc3RhcnQ7ICAgICAgICAgICAgLyogU291cmNlIHBvaW50ZXIgKi8KKworICAgICAgICAgIHdoaWxlICgqcyAmJiAhZG9uZSkgeworICAgICAgICAgICAgICBzMiA9ICpzOworICAgICAgICAgICAgICBpZiAoIWlucGNhc1tjbWRsdmxdICYmIGlzbG93ZXIoczIpKSBzMiA9IHRvdXBwZXIoczIpOworICAgICAgICAgICAgICBjID0gYnBbMV0gPyBicFsxXSA6ICIiOyAgIC8qIENoYXJhY3RlciB0byBicmVhayBvbiAqLworICAgICAgICAgICAgICB3aGlsZSAoKmMpIHsKKyAgICAgICAgICAgICAgICAgIGMyID0gKmM7CisgICAgICAgICAgICAgICAgICBpZiAoIWlucGNhc1tjbWRsdmxdICYmIGlzbG93ZXIoYzIpKSBjMiA9IHRvdXBwZXIoYzIpOworICAgICAgICAgICAgICAgICAgaWYgKGMyID09IHMyKSB7CisgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBjKys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKGRvbmUpIGJyZWFrOworICAgICAgICAgICAgICAqcCsrID0gKnMrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgKnAgPSBOVUw7ICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYXRlIHRoZSByZXN1bHQgKi8KKyAgICAgICAgICBwID0gZm52YWw7ICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcG9pbnQgdG8gaXQuICovCisgICAgICAgIGJya2ZpbjoKKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgfQorCisgICAgICBjYXNlIEZOX1NQTjogeyAgICAgICAgICAgICAgICAgICAgLyogXGZzcGFuKCkgKi8KKyAgICAgICAgICBjaGFyICpxOworICAgICAgICAgIGNoYXIgYzEsIGMyOworICAgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgICAgaWYgKGFyZ24gPCAxKQorICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICBpZiAoYXJnbiA+IDIpIHsgICAgICAgICAgICAgICAvKiBTdGFydGluZyBwb3NpdGlvbiAqLworICAgICAgICAgICAgICBzID0gYnBbMl0gPyBicFsyXSA6ICIwIjsKKyAgICAgICAgICAgICAgaWYgKGNoa251bShzKSkgeworICAgICAgICAgICAgICAgICAgc3RhcnQgPSBhdG9pKHMpOworICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QVJHX05PVF9OVU1FUklDOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHMgPSBicFswXSArIHN0YXJ0OyAgICAgICAgICAgIC8qIFNvdXJjZSBwb2ludGVyICovCisgICAgICAgICAgaWYgKGFyZ24gPiAxICYmCisgICAgICAgICAgICAgIChpbnQpc3RybGVuKGJwWzFdKSA+IDAgJiYKKyAgICAgICAgICAgICAgc3RhcnQgPD0gKGludClzdHJsZW4oYnBbMF0pKSB7CisgICAgICAgICAgICAgIHdoaWxlICgqcykgeyAgICAgICAgICAgICAgLyogTG9vcCB0aHJ1IHNvdXJjZSBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICAgIHEgPSBicFsxXTsgICAgICAgICAgICAvKiBTcGFuIHN0cmluZyAqLworICAgICAgICAgICAgICAgICAgYzEgPSAqczsKKyAgICAgICAgICAgICAgICAgIGlmICghaW5wY2FzW2NtZGx2bF0pCisgICAgICAgICAgICAgICAgICAgIGlmIChpc2xvd2VyKGMxKSkgYzEgPSB0b3VwcGVyKGMxKTsKKyAgICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgICAgd2hpbGUgKChjMiA9ICpxKyspKSB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnBjYXNbY21kbHZsXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc2xvd2VyKGMyKSkgYzIgPSB0b3VwcGVyKGMyKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoYzEgPT0gYzIpIHsgeCA9IDE7IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBpZiAoIXgpIGJyZWFrOworICAgICAgICAgICAgICAgICAgKnArKyA9ICpzKys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKnAgPSBOVUw7ICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hdGUgYW5kIHJldHVybiB0aGUgcmVzdWx0ICovCisgICAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICB9CisgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgIH0KKyAgICB9IC8qIEJyZWFrIHVwIGJpZyBzd2l0Y2guLi4gKi8KKworICAgIHN3aXRjaCAoeSkgeworICAgICAgY2FzZSBGTl9UUk06ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmdHJpbShzMVssczJdKSAqLworICAgICAgY2FzZSBGTl9MVFI6ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmbHRyaW0oczFbLHMyXSkgKi8KKyAgICAgICAgaWYgKGFyZ24gPCAxKQorICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIGlmICgobGVuMSA9IChpbnQpc3RybGVuKGJwWzBdKSkgPiAwKSB7CisgICAgICAgICAgICBpZiAobGVuMSA+IEZOVkFMTCkKKyAgICAgICAgICAgICAgbGVuMSA9IEZOVkFMTDsKKyAgICAgICAgICAgIHMgPSAiIFx0XHJcbiI7CisgICAgICAgICAgICBpZiAoYXJnbiA+IDEpICAgICAgICAgICAgICAgLyogVHJpbSBsaXN0IGdpdmVuICovCisgICAgICAgICAgICAgIHMgPSBicFsxXTsKKyAgICAgICAgICAgIGxlbjIgPSAoaW50KXN0cmxlbihzKTsKKyAgICAgICAgICAgIGlmIChsZW4yIDwgMSkgeyAgICAgICAgICAgICAvKiBvciBub3QuLi4gKi8KKyAgICAgICAgICAgICAgICBzID0gIiBcdFxyXG4iOyAgICAgICAgICAvKiBEZWZhdWx0IGlzIHRvIHRyaW0gd2hpdGVzcGFjZSAqLworICAgICAgICAgICAgICAgIGxlbjIgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN4ID09IEZOX1RSTSkgeyAgICAgICAgIC8qIFRyaW0gZnJvbSByaWdodCAqLworICAgICAgICAgICAgICAgIGNoYXIgKiBxLCBwMiwgcTI7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLGJwWzBdLEZOVkFMTCk7IC8qIENvcHkgc3RyaW5nIHRvIG91dHB1dCAqLworICAgICAgICAgICAgICAgIHAgPSBmbnZhbCArIGxlbjEgLSAxOyAgIC8qIFBvaW50IHRvIGxhc3QgY2hhcmFjdGVyICovCisKKyAgICAgICAgICAgICAgICB3aGlsZSAocCA+PSAoY2hhciAqKWZudmFsKSB7IC8qIEdvIGJhY2t3YXJkcyAqLworICAgICAgICAgICAgICAgICAgICBxID0gczsgICAgICAgICAgICAgIC8qIFBvaW50IHRvIHRyaW0gbGlzdCAqLworICAgICAgICAgICAgICAgICAgICBwMiA9ICpwOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlucGNhc1tjbWRsdmxdKQorICAgICAgICAgICAgICAgICAgICAgIGlmIChpc2xvd2VyKHAyKSkgcDIgPSB0b3VwcGVyKHAyKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpxKSB7ICAgICAgICAvKiBJcyB0aGlzIGNoYXIgaW4gdHJpbSBsaXN0PyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcTIgPSAqcTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wY2FzW2NtZGx2bF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc2xvd2VyKHEyKSkgcTIgPSB0b3VwcGVyKHEyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwMiA9PSBxMikgeyAvKiBZZXMsIG51bGwgaXQgb3V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnAgPSBOVUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBxKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEqcSkgICAgICAgICAgICAvKiBUcmltIGxpc3QgZXhoYXVzdGVkICovCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgLyogU28gd2UncmUgZG9uZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgcC0tOyAgICAgICAgICAgICAgICAvKiBFbHNlIGtlZXAgdHJpbW1pbmcgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogVHJpbSBmcm9tIGxlZnQgKi8KKyAgICAgICAgICAgICAgICBjaGFyICogcSwgcDIsIHEyOworICAgICAgICAgICAgICAgIHAgPSBicFswXTsgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgIHdoaWxlICgqcCkgeworICAgICAgICAgICAgICAgICAgICBwMiA9ICpwOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlucGNhc1tjbWRsdmxdKQorICAgICAgICAgICAgICAgICAgICAgIGlmIChpc2xvd2VyKHAyKSkgcDIgPSB0b3VwcGVyKHAyKTsKKyAgICAgICAgICAgICAgICAgICAgcSA9IHM7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqcSkgeyAgICAgICAgLyogSXMgdGhpcyBjaGFyIGluIHRyaW0gbGlzdD8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHEyID0gKnE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucGNhc1tjbWRsdmxdKQorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNsb3dlcihxMikpIHEyID0gdG91cHBlcihxMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocDIgPT0gcTIpIHsgLyogWWVzLCBwb2ludCBwYXN0IGl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCsrOyAgICAgICAgLyogYW5kIHRyeSBuZXh0IHNvdXJjZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHErKzsgICAgICAgICAgICAvKiBObywgdHJ5IG5leHQgdHJpbSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoISpxKSAgICAgICAgICAgIC8qIFRyaW0gbGlzdCBleGhhdXN0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAvKiBTbyB3ZSdyZSBkb25lLiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBja3N0cm5jcHkoZm52YWwscCxGTlZBTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICB9IGVsc2UgcCA9ICIiOworICAgICAgICBnb3RvIGZuZW5kOworCisgICAgICBjYXNlIEZOX0NBUDogICAgICAgICAgICAgICAgICAgICAgLyogXGZjYXBpdGFsaXplKGFyZzEpICovCisgICAgICAgIGlmIChhcmduIDwgMSkKKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICBzID0gYnBbMF07CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgeCA9IDA7CisgICAgICAgIHdoaWxlICgoYyA9ICpzKyspKSB7CisgICAgICAgICAgICBpZiAoaXNhbHBoYShjKSkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc2xvd2VyKGMpKQorICAgICAgICAgICAgICAgICAgICAgIGMgPSB0b3VwcGVyKGMpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXN1cHBlcihjKSkKKyAgICAgICAgICAgICAgICAgIGMgPSB0b2xvd2VyKGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnArKyA9IGM7CisgICAgICAgIH0KKyAgICAgICAgKnAgPSBOVUw7CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgZ290byBmbmVuZDsKKworI2lmZGVmIENPTU1FTlQKKyAgICAgIGNhc2UgRk5fVE9EOiAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIG9mIGRheSB0byBzZWNzIHNpbmNlIG1pZG5pdGUgKi8KKyAgICAgICAgc3ByaW50ZihmbnZhbCwiJWxkIix0b2Qyc2VjKGJwWzBdKSk7IC8qIFNBRkUgKi8KKyAgICAgICAgZ290byBmbmVuZDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAgIGNhc2UgRk5fRkZOOiAgICAgICAgICAgICAgICAgICAgICAvKiBGdWxsIHBhdGhuYW1lIG9mIGZpbGUgKi8KKyAgICAgICAgemZucWZwKGJwWzBdLEZOVkFMTCxwKTsKKyAgICAgICAgaWYgKCFwKSBwID0gIiI7CisgICAgICAgIGdvdG8gZm5lbmQ7CisKKyAgICAgIGNhc2UgRk5fQ0hLOiB7ICAgICAgICAgICAgICAgICAgICAvKiBcZmNoZWNrc3VtKCkgKi8KKyAgICAgICAgICBsb25nIGNoayA9IDA7CisgICAgICAgICAgcCA9IChhcmduID4gMCkgPyBicFswXSA6ICIiOworICAgICAgICAgIHdoaWxlICgqcCkgY2hrICs9ICpwKys7CisgICAgICAgICAgc3ByaW50ZihmbnZhbCwiJWx1IixjaGspOyAgICAgLyogU0FGRSAqLworICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgfQorCisjaWZuZGVmIE5PWEZFUgorICAgICAgY2FzZSBGTl9DUkM6ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmY3JjMTYoKSAqLworICAgICAgICBpZiAoYXJnbiA+IDApCisgICAgICAgICAgc3ByaW50ZihmbnZhbCwiJXUiLCAgICAgICAgICAgLyogU0FGRSAqLworICAgICAgICAgICAgICAgICAgY2hrMygoQ0hBUiAqKWJwWzBdLChpbnQpc3RybGVuKGJwWzBdKSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgcCA9ICIwIjsKKyAgICAgICAgZ290byBmbmVuZDsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworICAgICAgY2FzZSBGTl9CU046ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmYmFzZW5hbWUoKSAqLworICAgICAgICB6c3RyaXAoYnBbMF0sJnApOworICAgICAgICBnb3RvIGZuZW5kOworCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICAgIGNhc2UgRk5fU0NSTl9DWDogICAgICAgICAgICAgICAgICAvKiBcZnNjcm5jdXJ4KCkgKi8KKyAgICAgICAgcCA9IGZudmFsOworICAgICAgICBzcHJpbnRmKHAsIiVkIiwoaW50KVZzY3JuR2V0Q3VyUG9zKFZURVJNKS0+eCk7IC8qIFNBRkUgKi8KKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9TQ1JOX0NZOiAgICAgICAgICAgICAgICAgIC8qIFxmc2NybmN1cnkoKSAqLworICAgICAgICBwID0gZm52YWw7CisgICAgICAgIHNwcmludGYocCwiJWQiLChpbnQpVnNjcm5HZXRDdXJQb3MoVlRFUk0pLT55KTsgLyogU0FGRSAqLworICAgICAgICBnb3RvIGZuZW5kOworCisgICAgICBjYXNlIEZOX1NDUk5fU1RSOiB7ICAgICAgICAgICAgICAgLyogXGZzY3Juc3RyKCkgKi8KKyAgICAgICAgICB2aWRlb2xpbmUgKiBsaW5lID0gTlVMTDsKKyAgICAgICAgICB2aW9jZWxsICogY2VsbHMgPSBOVUxMOworICAgICAgICAgIGludCByb3cgPSAwLCBjb2wgPSAwLCBsZW4gPSAwOworICAgICAgICAgIC8qIE5PVEU6IE9uIFVuaWNvZGUgc3lzdGVtcywgdGhlIHNjcmVlbiBjb250ZW50cyBhcmUgc3RvcmVkIGluICovCisgICAgICAgICAgLyogaW4gVW5pY29kZS4gIFRoZXJlZm9yZSwgd2Ugc2hvdWxkIHJlYWxseSBiZSBwZXJmb3JtaW5nIGEgICAgKi8KKyAgICAgICAgICAvKiBjb252ZXJzaW9uIHRvIHRoZSBsb2NhbCBjaGFyYWN0ZXIgc2V0LiAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgLyogNi8xOC8yMDAwIC0gYWRkZWQgdGhlIHRyYW5zbGF0aW9uIHRvIGxjcyAqLworCisgICAgICAgICAgaWYgKGJwWzBdID09IE5VTEwgfHwgYnBbMF1bMF0gPT0gJ1wwJykgeworICAgICAgICAgICAgICByb3cgPSAwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChjaGtudW0oYnBbMF0pKSB7CisgICAgICAgICAgICAgICAgICByb3cgPSBhdG9pKGJwWzBdKTsKKyAgICAgICAgICAgICAgICAgIGlmIChyb3cgPCAwKQorICAgICAgICAgICAgICAgICAgICByb3cgPSAwOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QVJHX05PVF9OVU1FUklDOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGxpbmUgPSBWc2NybkdldExpbmVGcm9tVG9wKCBWVEVSTSwgKFVTSE9SVCkgcm93ICk7CisgICAgICAgICAgaWYgKGxpbmUgIT0gTlVMTCkgeworICAgICAgICAgICAgICBpZiAoYnBbMV0gPT0gTlVMTCB8fCBicFsxXVswXSA9PSAnXDAnKQorICAgICAgICAgICAgICAgIGNvbCA9IDA7CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgaWYgKGNoa251bShicFswXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBhdG9pKGJwWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sIDwgMCB8fCBjb2wgPj0gbGluZS0+d2lkdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSAwOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfTk9UX05VTUVSSUM6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChicFsyXSA9PSBOVUxMIHx8IGJwWzJdWzBdID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICAgIGxlbiA9IGxpbmUtPndpZHRoIC0gKGNvbCsxKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGlmICghY2hrbnVtKGJwWzJdKSkgeworICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19OT1RfTlVNRVJJQzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBsZW4gPSBhdG9pKGJwWzJdKTsKKyAgICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwIHx8IGxlbiA+IGxpbmUtPndpZHRoKQorICAgICAgICAgICAgICAgICAgICBsZW4gPSBsaW5lLT53aWR0aDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjZWxscyA9IGxpbmUtPmNlbGxzOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgIGludCBwb3MgPSBpICsgY29sOworICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IGxpbmUtPndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzdW5pY29kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZm52YWxbaV0gPSAoQ0hBUikgdXRvbHhsYXQoY2VsbHNbcG9zXS5jKTsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBmbnZhbFtpXSA9IChDSEFSKSAoY2VsbHNbcG9zXS5jICYgMHhGRik7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGZudmFsW2ldID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBmbnZhbFtpXSA9IFNQOworICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZudmFsW2ldID0gU1A7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZm52YWxbaV0gPSAnXDAnOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZudmFsWzBdID0gJ1wwJzsKKyAgICAgICAgICB9CisgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICB9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZuZGVmIE5PUFVTSAorICAgICAgY2FzZSBGTl9SQVc6ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmcmF3Y29tbWFuZCgpICovCisgICAgICBjYXNlIEZOX0NNRDogeyAgICAgICAgICAgICAgICAgICAgLyogXGZjb21tYW5kKCkgKi8KKyAgICAgICAgICBpbnQgeCwgYywgbiA9IEZOVkFMTDsKKyAgICAgICAgICB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21wbGV0aW9uIGZsYWcgKi8KKy8qCisgIFpJRklMRSBjYW4gYmUgc2FmZWx5IHVzZWQgYmVjYXVzZSB3ZSBjYW4ndCBwb3NzaWJseSBiZSB0cmFuc2ZlcnJpbmcgYSBmaWxlCisgIHdoaWxlIGV4ZWN1dGluZyB0aGlzIGZ1bmN0aW9uLgorKi8KKyAgICAgICAgICBpZiAoIW5vcHVzaCAmJiB6eGNtZChaSUZJTEUsYnBbMF0pID4gMCkgeyAvKiBPcGVuIHRoZSBjb21tYW5kICovCisgICAgICAgICAgICAgIHdoaWxlIChuLS0gPiAtMSkgeyAgICAgICAgLyogUmVhZCBmcm9tIGl0ICovCisgICAgICAgICAgICAgICAgICBpZiAoKGMgPSB6bWluY2hhcigpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICB4ID0gMTsgICAgICAgICAgICAgLyogRU9GIC0gc2V0IGNvbXBsZXRpb24gZmxhZyAqLworICAgICAgICAgICAgICAgICAgICAgIGlmIChjeCA9PSBGTl9DTUQpIHsgLyogSWYgbm90ICJyYXdjb21tYW5kIiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBwLS07ICAgICAgICAgICAvKiByZW1vdmUgdHJhaWxpbmcgbmV3bGluZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpwID09IENSIHx8ICpwID09IExGKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAqcCA9IE5VTDsgICAgICAgICAvKiBUZXJtaW5hdGUgdGhlIHN0cmluZyAqLworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgc3RpbGwgcnVubmluZyAqLworICAgICAgICAgICAgICAgICAgICAqcCsrID0gYzsgICAgICAgICAgIC8qIENvcHkgdGhlIGJ5dGVzICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgemNsb3NlKFpJRklMRSk7ICAgICAgICAgICAvKiBDbG9zZSB0aGUgY29tbWFuZCAqLworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBSZXR1cm4gbnVsbCBzdHJpbmcgaWYgY29tbWFuZCdzIG91dHB1dCB3YXMgdG9vIGxvbmcuICovCisgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgIGlmICgheCkgeworICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpSRVNVTFRfVE9PX0xPTkc6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgIH0KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyAgICB9IC8qIEJyZWFrIHVwIGJpZyBzd2l0Y2guLi4gKi8KKworICAgIHN3aXRjaCAoeSkgeworICAgICAgY2FzZSBGTl9TVFg6ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmc3RyaXB4KHN0cmluZyxjKSAqLworICAgICAgICBpZiAoIShzID0gYnBbMF0pKSAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIHN0cmluZyAqLworICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIGMgPSAnLic7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIHRvIHN0cmlwIGZyb20gKi8KKyAgICAgICAgaWYgKGFyZ24gPiAxKSBpZiAoKmJwWzFdKSBjID0gKmJwWzFdOworICAgICAgICBuID0gY2tzdHJuY3B5KGZudmFsLGJwWzBdLEZOVkFMTCk7CisgICAgICAgIHdoaWxlICgtLW4gPj0gMCkgeworICAgICAgICAgICAgaWYgKGZudmFsW25dID09IGMpIHsKKyAgICAgICAgICAgICAgICBmbnZhbFtuXSA9IE5VTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwID0gZm52YWw7CisgICAgICAgIGdvdG8gZm5lbmQ7CisKKyAgICAgIGNhc2UgRk5fU1RMOiAgICAgICAgICAgICAgICAgICAgICAvKiBcZmxvcChzdHJpbmcsYykgKi8KKyAgICAgICAgaWYgKCEocyA9IGJwWzBdKSkgICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgYSBzdHJpbmcgKi8KKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICBjID0gJy4nOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoYXJhY3RlciB0byBzdHJpcCB0byAqLworICAgICAgICBpZiAoYXJnbiA+IDEpIGlmICgqYnBbMV0pIGMgPSAqYnBbMV07CisgICAgICAgIHggPSAwOworICAgICAgICB3aGlsZSAoKnMrKykgeworICAgICAgICAgICAgaWYgKCoocy0xKSA9PSBjKSB7CisgICAgICAgICAgICAgICAgeCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4KSBzID0gYnBbMF07CisgICAgICAgIGNrc3RybmNweShmbnZhbCxzLEZOVkFMTCk7CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9TVE46ICAgICAgICAgICAgICAgICAgICAgIC8qIFxmc3RyaXBuKHN0cmluZyxuKSAqLworICAgICAgICBpZiAoYXJnbiA8IDEpICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBuIGNoYXJzIGZyb20gcmlnaHQgKi8KKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB2YWwxID0gIjAiOworICAgICAgICBpZiAoYXJnbiA+IDEpCisgICAgICAgICAgaWYgKCooYnBbMV0pKQorICAgICAgICAgICAgdmFsMSA9IGV2YWx4KGJwWzFdKTsKKyAgICAgICAgaWYgKCFjaGtudW0odmFsMSkpIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICBldmFsZXJyKGZuKTsKKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIH0KKyAgICAgICAgbiA9IGF0b2kodmFsMSk7CisgICAgICAgIGlmIChuIDwgMCkgbiA9IDA7CisgICAgICAgIGsgPSAoaW50KXN0cmxlbihzID0gYnBbMF0pIC0gbjsKKyAgICAgICAgaWYgKGsgPCAwKSBrID0gMDsKKyAgICAgICAgcCA9IGZudmFsOworICAgICAgICB3aGlsZSAoay0tID4gMCkKKyAgICAgICAgICAqcCsrID0gKnMrKzsKKyAgICAgICAgKnAgPSBOVUw7CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9TVEI6IHsgICAgICAgICAgICAgICAgICAgIC8qIFxmc3RyaXBiKHN0cmluZyxjKSAqLworICAgICAgICAgIGNoYXIgYzIgPSBOVUw7CisgICAgICAgICAgaW50IGksIGsgPSAwOworICAgICAgICAgIGNoYXIgKiBncl9vcG4gPSAiXCJ7JyhbPCI7ICAgIC8qIEdyb3VwIG9wZW4gYnJhY2tldHMgKi8KKyAgICAgICAgICBjaGFyICogZ3JfY2xzID0gIlwifScpXT4iOyAgICAvKiBHcm91cCBjbG9zZSBicmFja2V0cyAqLworCisgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgICpwID0gTlVMOworICAgICAgICAgIGlmICghKHMgPSBicFswXSkpICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIHN0cmluZyAqLworICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICBpZiAoKHggPSBzdHJsZW4ocykpIDwgMSkKKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgYyA9IE5VTDsgICAgICAgICAgICAgICAgICAgICAgLyogQnJhY2UvYnJhY2tldCBraW5kICovCisgICAgICAgICAgaWYgKGFyZ24gPiAxKSB7CisgICAgICAgICAgICAgIGlmICgqYnBbMV0pIHsKKyAgICAgICAgICAgICAgICAgIGlmIChjaGtudW0oYnBbMV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgayA9IGF0b2koYnBbMV0pOworICAgICAgICAgICAgICAgICAgICAgIGlmIChrIDwgMCkgayA9IDYzOworICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsgJiAoMTw8aSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzWzBdID09IGdyX29wbltpXSAmJiBzW3gtMV0gPT0gZ3JfY2xzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLHMrMSxGTlZBTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZudmFsW3gtMl0gPSBOVUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkoZm52YWwscyxGTlZBTEwpOyAvKiBObyBtYXRjaCAqLworICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYyA9ICpicFsxXTsKKyAgICAgICAgICBpZiAoIWMpIGMgPSBzWzBdOworICAgICAgICAgIGlmIChhcmduID4gMikgaWYgKCpicFsyXSkgYzIgPSAqYnBbMl07CisgICAgICAgICAgaWYgKCpzID09IGMpIHsKKyAgICAgICAgICAgICAgaWYgKCFjMikgeworICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJygnOiBjMiA9ICcpJzsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1snOiBjMiA9ICddJzsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOiBjMiA9ICd9JzsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJzwnOiBjMiA9ICc+JzsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJyInOiBjMiA9ICciJzsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6ICBjMiA9IDM5OyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgOTY6ICBjMiA9IDM5OyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ24gPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjMiA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweShmbnZhbCxzLHgpOyAvKiBMZWF2ZSBpdCBsaWtlIHRoaXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm52YWxbeF0gPSBOVUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzW3gtMV0gPT0gYzIpIHsKKyAgICAgICAgICAgICAgICAgIHN0cm5jcHkoZm52YWwscysxLHgtMik7IC8qIExlYXZlIGl0IGxpa2UgdGhpcyAqLworICAgICAgICAgICAgICAgICAgZm52YWxbeC0yXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgc3RybmNweShmbnZhbCxzLHgpOworICAgICAgICAgIGZudmFsW3hdID0gTlVMOworICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICB9CisKKyAgICAgIGNhc2UgRk5fMkhFWDogICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgdG8gaGV4ICovCisgICAgICBjYXNlIEZOXzJPQ1Q6ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIHRvIG9jdGFsICovCisgICAgICAgIHZhbDEgPSBldmFseChicFswXSk7CisgICAgICAgIGlmICghKnZhbDEpIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICBldmFsZXJyKGZuKTsKKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIH0KKyAgICAgICAgc3ByaW50ZihmbnZhbCwgY3ggPT0gRk5fMkhFWCA/ICIlbHgiIDogIiVsbyIsIGF0b2wodmFsMSkpOyAvKiBTQUZFICovCisgICAgICAgIGlmIChjeCA9PSBGTl8ySEVYICYmIChpbnQpKHN0cmxlbihmbnZhbCkmMSkpCisgICAgICAgICAgc3ByaW50ZihmbnZhbCwiMCVseCIsYXRvbCh2YWwxKSk7IC8qIFNBRkUgKi8KKyAgICAgICAgcCA9IGZudmFsOworICAgICAgICBnb3RvIGZuZW5kOworCisgICAgICBjYXNlIEZOX0ROQU06IHsgICAgICAgICAgICAgICAgICAgLyogRGlyZWN0b3J5IHBhcnQgb2YgZmlsZSBuYW1lICovCisgICAgICAgICAgY2hhciAqczsKKyAgICAgICAgICB6Zm5xZnAoYnBbMF0sRk5WQUxMLHApOyAgICAgICAvKiBHZXQgZnVsbCBuYW1lICovCisgICAgICAgICAgaWYgKCFpc2RpcihwKSkgeyAgICAgICAgICAgICAgLyogSXMgaXQgYWxyZWFkeSBhIGRpcmVjdG9yeT8gKi8KKyAgICAgICAgICAgICAgenN0cmlwKHAsJnMpOyAgICAgICAgICAgICAvKiBObyBnZXQgYmFzZW5hbWUgKi8KKyAgICAgICAgICAgICAgaWYgKCpzKSB7CisgICAgICAgICAgICAgICAgICB4ID0gY2tpbmRleChzLHAsMCwwLDApOyAvKiBQb3Mgb2YgbGF0dGVyIGluIGZvcm1lciAqLworICAgICAgICAgICAgICAgICAgaWYgKHggPiAwKSBwW3gtMV0gPSBOVUw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFwKSBwID0gIiI7CisgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgIH0KKworI2lmbmRlZiBOT1JBTkRPTQorICAgICAgY2FzZSBGTl9SQU5EOiAgICAgICAgICAgICAgICAgICAgIC8qIFJhbmRvbSBudW1iZXIgKi8KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgaWYgKFJBTkRfYnl0ZXMoKHVuc2lnbmVkIGNoYXIgKikmayxzaXplb2YoaykpIDwgMCkKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICBrID0gcmFuZCgpOworICAgICAgICB4ID0gMDsKKyAgICAgICAgaWYgKGFyZ24gPiAwKSB7CisgICAgICAgICAgICBpZiAoIWNoa251bShicFswXSkpIHsKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfTk9UX05VTUVSSUM6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeCA9IGF0b2koYnBbMF0pOworICAgICAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgICAgICBzcHJpbnRmKGZudmFsLCIlZCIsICh4ID4gMCAmJiBrID4gMCkgfHwgKHggPCAwICYmIGsgPCAwKSA/IGsgJSB4IDogCisgICAgICAgICAgICAgICAgKHggPT0gMCA/IDAgOiAoMCAtIChrICUgKC14KSkpKSk7CisjZWxzZQorICAgICAgICBkZWJ1ZyhGMTExLCJyYW5kIixja2l0b2EoeCksayk7CisjaWZkZWYgU1VOT1M0CisvKiBUaGlzIGlzIHJlYWxseSBzdHJhbmdlIGJ1dCBvbiBTdW5PUywgaWYgd2UgYXJlIHJlcXVlc3RpbmcgcmFuZG9tIG51bWJlcnMgKi8KKy8qIGJldHdlZW4gMCBhbmQgNCBvciBsZXNzLCB0aGV5IGFsd2F5cyBjb21lIG91dCBpbiBzZXF1ZW5jZTogMCAxIDIgMyAwIDEgMiAqLworLyogU2hpZnRpbmcgdGhlIHJlc3VsdCBvZiByYW5kKCkgaW4gdGhpcyBjYXNlIGdpdmVzIGEgbW9yZSByYW5kb20gcmVzdWx0LiAgICovCisgICAgICAgIGlmICh4IDwgNSkKKyAgICAgICAgICBrID0gayA+PiA1OworI2VuZGlmIC8qIFNVTk9TNCAqLworICAgICAgICBpZiAoKHggPiAwICYmIGsgPiAwKSB8fCAoeCA8IDAgJiYgayA8IDApKQorICAgICAgICAgIHggPSBrICUgeDsKKyAgICAgICAgZWxzZSBpZiAoeCA9PSAwKQorICAgICAgICAgIHggPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgeCA9IDAgLSAoayAlICgteCkpOworICAgICAgICBkZWJ1ZyhGMTAxLCJyYW5kIHgiLCIiLHgpOworICAgICAgICBzcHJpbnRmKGZudmFsLCIlZCIsIHgpOyAgICAgICAgIC8qIFNBRkUgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgZ290byBmbmVuZDsKKyNlbmRpZiAvKiBOT1JBTkRPTSAqLworICAgIH0gLyogQnJlYWsgdXAgYmlnIHN3aXRjaC4uLiAqLworCisgICAgc3dpdGNoICh5KSB7CisgICAgICBjYXNlIEZOX1NQTElUOiAgICAgICAgICAgICAgICAgICAgLyogXGZzcGxpdChzMSxhLHMyLHMzLG1hc2spICovCisgICAgICBjYXNlIEZOX1dPUkQ6IHsgICAgICAgICAgICAgICAgICAgLyogXGZ3b3JkKHMxLG4sczIsczMsbWFzaykgKi8KKyAgICAgICAgICBpbnQgd29yZG51bSA9IDA7CisgICAgICAgICAgaW50IHNwbGl0dGluZyA9IDA7CisgICAgICAgICAgaW50IHg7CisgICAgICAgICAgaW50IGFycmF5ID0gMDsKKyAgICAgICAgICBpbnQgZ3JvdXBpbmcgPSAwOworICAgICAgICAgIGludCBub2NvbGxhcHNlID0gMDsKKyAgICAgICAgICBjaGFyICogc2VwID0gIiI7CisgICAgICAgICAgY2hhciAqIG5vdHNlcCA9ICIiOworICAgICAgICAgIGNoYXIgKiBicDAgPSBOVUxMOworICAgICAgICAgIGNoYXIgKiBicDEgPSBOVUxMOworICAgICAgICAgIGNoYXIgICBhYnVmWzE2XTsKKyAgICAgICAgICBzdHJ1Y3Qgc3RyaW5nYXJyYXkgKiBxID0gTlVMTDsKKworICAgICAgICAgIHNwbGl0dGluZyA9IChjeCA9PSBGTl9TUExJVCk7IC8qIE91ciBqb2IgKi8KKworICAgICAgICAgIGZudmFsWzBdID0gc3BsaXR0aW5nID8gJzAnIDogTlVMOyAvKiBJbml0aWFsIHJldHVybiB2YWx1ZSAqLworICAgICAgICAgIGZudmFsWzFdID0gTlVMOworICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICBicDAgPSBicFswXTsgICAgICAgICAgICAgICAgICAvKiBTb3VyY2Ugc3RyaW5nICovCisgICAgICAgICAgaWYgKCFicDApIGJwMCA9ICIiOworICAgICAgICAgIGRlYnVnKEYxMTEsImZzcGxpdCBicFswXSIsYnAwLGFyZ24pOworICAgICAgICAgIGlmIChhcmduIDwgMSB8fCAhKmJwMCkgICAgICAgIC8qIElmIG5vbmUsIHJldHVybiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICBnb3RvIGZuZW5kOworCisgICAgICAgICAgYnAxID0gYnBbMV07ICAgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24tZGVwZW5kZW50IGFyZyAqLworICAgICAgICAgIGlmICghYnAxKSBicDEgPSAiIjsgICAgICAgICAgIC8qIChhcnJheSBvciBudW1iZXIpICovCisgICAgICAgICAgZGVidWcoRjExMCwiZnNwbGl0IGJwWzFdIixicDEsMCk7CisgICAgICAgICAgaWYgKGJwWzVdKSB7CisgICAgICAgICAgICAgIGlmICghY2hrbnVtKGJwWzVdKSkgeworICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QVJHX05PVF9OVU1FUklDOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHggPSBhdG9pKGJwWzVdKTsKKyAgICAgICAgICAgICAgbm9jb2xsYXBzZSA9IHg7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghc3BsaXR0aW5nKSB7ICAgICAgICAgICAgIC8qIFxmd29yZCgpOiBuID0gZGVzaXJlZCB3b3JkIG51bWJlciAqLworICAgICAgICAgICAgICB2YWwxID0gIjEiOyAgICAgICAgICAgICAgIC8qIERlZmF1bHQgaXMgZmlyc3Qgd29yZCAqLworICAgICAgICAgICAgICBpZiAoYXJnbiA+IDEpICAgICAgICAgICAgIC8qIFdvcmQgbnVtYmVyIHN1cHBsaWVkICovCisgICAgICAgICAgICAgICAgaWYgKCpicDEpCisgICAgICAgICAgICAgICAgICB2YWwxID0gZXZhbHgoYnAxKTsKKyAgICAgICAgICAgICAgaWYgKCFjaGtudW0odmFsMSkpIHsKKyAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19OT1RfTlVNRVJJQzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBuID0gYXRvaSh2YWwxKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ24gPiAxICYmICpicDEpIHsgLyogXGZzcGxpdCgpOiBuID0gd29yZCBjb3VudCAqLworICAgICAgICAgICAgICBja3N0cm5jcHkoYWJ1ZixicDEsMTYpOyAgIC8qIEdldCBhcnJheSByZWZlcmVuY2UgKi8KKyAgICAgICAgICAgICAgZGVidWcoRjExMCwiZnNwbGl0IGFidWYgMSIsYWJ1ZiwwKTsKKyAgICAgICAgICAgICAgZmFpbGVkID0gMTsgICAgICAgICAgICAgICAvKiBBc3N1bWUgaXQncyBiYWQgKi8KKyAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpICAgICAgICAgICAgICAvKiBEZWZhdWx0IGlzIHRoaXMgZXJyb3IgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19CQURfQVJSQVk6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgaWYgKGFidWZbMF0gIT0gJyYnKSAgICAgICAvKiAiQWRkcmVzcyIgb2YgYXJyYXkgKi8KKyAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOyAgICAgICAgICAgICAvKiBJdCdzIGJhZCAqLworICAgICAgICAgICAgICBpZiAoYWJ1ZlsyXSkgeyAgICAgICAgICAgIC8qIENoZWNrIGZvciBicmFja2V0cyAqLworICAgICAgICAgICAgICAgICAgaWYgKGFidWZbMl0gIT0gJ1snIHx8IGFidWZbM10gIT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsgICAgICAgLyogQmFkICovCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZGVidWcoRjExMCwiZnNwbGl0IGFidWYgMiIsYWJ1ZiwwKTsKKyAgICAgICAgICAgICAgaWYgKGFidWZbMV0gPiA2NCAmJiBhYnVmWzFdIDwgOTEpIC8qIENvbnZlcnQgdXBwZXIgdG8gbG93ZXIgKi8KKyAgICAgICAgICAgICAgICBhYnVmWzFdICs9IDMyOworICAgICAgICAgICAgICBpZiAoYWJ1ZlsxXSA8IDk3IHx8IGFidWZbMV0gPiAxMjIpIHsgLyogQ2hlY2sgZm9yIGEteiAqLworICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmc3BsaXQgYWJ1ZiAzIixhYnVmLDApOworICAgICAgICAgICAgICBhcnJheSA9IDE7CisgICAgICAgICAgICAgIGZudmFsWzBdID0gTlVMOyAgICAgICAgICAgLyogTm8gZXJyb3IsIGVyYXNlIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgZmFpbGVkID0gMDsgICAgICAgICAgICAgICAvKiBVbnNldCBmYWlsdXJlIGZsYWcgKi8KKyAgICAgICAgICAgICAgbiA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHdvcmQgY291bnRlciAqLworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoYXJnbiA+IDIpICAgICAgICAgICAgICAgICAvKiBIYXZlIGJyZWFrIHNldD8gKi8KKyAgICAgICAgICAgIHNlcCA9IGJwWzJdOworICAgICAgICAgIGRlYnVnKEYxMTEsImZzcGxpdCBzZXAiLHNlcCxhcmduKTsKKyAgICAgICAgICBpZiAoYXJnbiA+IDMpICAgICAgICAgICAgICAgICAvKiBIYXZlIGluY2x1ZGUgc2V0PyAqLworICAgICAgICAgICAgbm90c2VwID0gYnBbM107CisgICAgICAgICAgZGVidWcoRjExMSwiZnNwbGl0IG5vdHNlcCIsbm90c2VwLGFyZ24pOworICAgICAgICAgIGlmIChhcmduID4gNCkgeyAgICAgICAgICAgICAgIC8qIEhhdmUgZ3JvdXBpbmcgc2V0PyAqLworICAgICAgICAgICAgICBjaGFyICogYnA0ID0gYnBbNF07CisgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImZzcGxpdCBicDQiLGJwNCxhcmduKTsKKyAgICAgICAgICAgICAgaWYgKCFicDQpIGJwNCA9ICIwIjsKKyAgICAgICAgICAgICAgaWYgKCEqYnA0KSBicDQgPSAiMCI7CisgICAgICAgICAgICAgIGlmIChjaGtudW0oYnA0KSkgeworICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcgPSBhdG9pKGJwNCk7CisgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBpbmcgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nID0gMTI3OworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QVJHX05PVF9OVU1FUklDOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8qIEFyZ3MgcGFyc2VkLCBub3cgZG8gdGhlIHdvcmsgKi8KKworICAgICAgICAgIGRlYnVnKEYxMTEsImZzcGxpdCBicDAiLGJwMCxuKTsKKyAgICAgICAgICBxID0gY2tzcGxpdChzcGxpdHRpbmcsbixicDAsc2VwLG5vdHNlcCxncm91cGluZywwLG5vY29sbGFwc2UpOworCisgICAgICAgICAgd29yZG51bSA9IHEgPyBxLT5hX3NpemUgOiAtMTsgLyogQ2hlY2sgcmVzdWx0ICovCisgICAgICAgICAgaWYgKHdvcmRudW0gPCAwKSB7CisgICAgICAgICAgICAgIGZhaWxlZCA9IDE7ICAgICAgICAgICAgICAgLyogRmFpbHVyZSAqLworICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmRudW0gPT0gLTEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOk1BTExPQ19GQUlMVVJFOlxcZiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6VE9PX01BTllfV09SRFM6XFxmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiKCk+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNwbGl0dGluZykgeyAgICAgICAgICAgICAgLyogXGZzcGxpdCgpIHJlc3VsdCAqLworICAgICAgICAgICAgICBja3N0cm5jcHkoZm52YWwsY2tpdG9hKHdvcmRudW0pLEZOVkFMTCk7CisgICAgICAgICAgICAgIGlmIChhcnJheSkgeyAgICAgICAgICAgICAgLyogQXJyYXkgd2FzIG5vdCBkZWNsYXJlZC4gKi8KKyAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgaWYgKCh4ID0gZGNsYXJyYXkoYWJ1ZlsxXSx3b3JkbnVtKSkgPCAwKSB7IC8qIERlY2xhcmUgaXQuICovCisgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6TUFMTE9DX0ZBSUxVUkU6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSB3b3JkbnVtOyBpKyspIHsgLyogQ29weSByZXN1bHRzICovCisgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmKGFfcHRyW3hdW2ldKSxxLT5hX2hlYWRbaV0pOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYV9wdHJbeF1bMF0gPSBOVUxMOyAgIC8qIEFycmF5IGlzIDEtYmFzZWQgKi8KKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJihhX3B0clt4XVswXSksZm52YWwpOyAvKiBFbGVtZW50ID0gc2l6ZSAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogXGZ3b3JkKCkgcmVzdWx0ICovCisgICAgICAgICAgICAgIGNoYXIgKiBzOworICAgICAgICAgICAgICBzID0gcS0+YV9oZWFkWzFdOworICAgICAgICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLHMsRk5WQUxMKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ290byBmbmVuZDsgICAgICAgICAgICAgICAgICAgLyogRG9uZSAqLworICAgICAgfQorCisgICAgfSAvKiBCcmVhayB1cCBiaWcgc3dpdGNoLi4uICovCisKKyAgICBzd2l0Y2ggKHkpIHsKKworI2lmZGVmIENLX0tFUkJFUk9TCisgICAgICBjYXNlIEZOX0tSQl9USzogICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgdGlja2V0cyAqLworICAgICAgY2FzZSBGTl9LUkJfTlg6ICAgICAgICAgICAgICAgICAgIC8qIEtlcmJlcm9zIG5leHQgdGlja2V0ICovCisgICAgICBjYXNlIEZOX0tSQl9JVjogICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgdGlja2V0IGlzIHZhbGlkICovCisgICAgICBjYXNlIEZOX0tSQl9GRzogICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgVGlja2V0IGZsYWdzICovCisgICAgICBjYXNlIEZOX0tSQl9UVDogeyAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgdGlja2V0IHRpbWUgKi8KKyAgICAgICAgICBpbnQga3YgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBLZXJiZXJvcyB2ZXJzaW9uICovCisgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgIGNoYXIgKiBzID0gTlVMTDsKKyAgICAgICAgICBpZiAocmRpZ2l0cyhicFswXSkpIHsKKyAgICAgICAgICAgICAga3YgPSBhdG9pKGJwWzBdKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfTk9UX05VTUVSSUM6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGt2ICE9IDQgJiYga3YgIT0gNSkgeworICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfT1VUX09GX1JBTkdFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoY3ggPT0gRk5fS1JCX0lWIHx8IGN4ID09IEZOX0tSQl9UVCB8fCBjeCA9PSBGTl9LUkJfRkcpICYmCisgICAgICAgICAgICAgICBhcmduIDwgMikgeworICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsIjxFUlJPUjpNSVNTSU5HX0FSRzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgIH0KKyAgICAgICAgICBzd2l0Y2ggKHkpIHsKKyAgICAgICAgICAgIGNhc2UgRk5fS1JCX1RLOiAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgS2VyYmVyb3MgdGlja2V0cyAqLworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgICAgICAgICAgIHN3aXRjaCAoa3YpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICBuID0gY2tfa3JiNF9nZXRfdGt0cygpOworICAgICAgICAgICAgICAgICAgc3ByaW50ZihmbnZhbCwgIiVkIiwgKG4gPj0gMCkgPyBuIDogMCk7IC8qIFNBRkUgKi8KKyAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgICAgY2FzZSA1OiB7CisgICAgICAgICAgICAgICAgICAgIGV4dGVybiBjaGFyICoga3JiNV9kX2NjOworICAgICAgICAgICAgICAgICAgICBuID0gY2tfa3JiNV9nZXRfdGt0cyhrcmI1X2RfY2MpOworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCAiJWQiLCAobiA+PSAwKSA/IG4gOiAwKTsgLyogU0FGRSAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgc3ByaW50ZihmbnZhbCwiJWQiLDApOyAgICAvKiBTQUZFICovCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyAgICAgICAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgICAgICAgY2FzZSBGTl9LUkJfTlg6ICAgICAgICAgICAgIC8qIEtlcmJlcm9zIG5leHQgdGlja2V0ICovCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICAgICAgICAgICAgc3dpdGNoIChrdikgeworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgIHMgPSBja19rcmI0X2dldF9uZXh0X3RrdCgpOworICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLCBzID8gcyA6ICIiLEZOVkFMTCk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgIHMgPSBja19rcmI1X2dldF9uZXh0X3RrdCgpOworICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLCBzID8gcyA6ICIiLEZOVkFMTCk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCJrJWQgbmV4dC10aWNrZXQtc3RyaW5nIixrdik7IC8qIFNBRkUgKi8KKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworICAgICAgICAgICAgICBnb3RvIGZuZW5kOworCisgICAgICAgICAgICBjYXNlIEZOX0tSQl9JVjogICAgICAgICAgICAgLyogS2VyYmVyb3MgdGlja2V0IGlzIHZhbGlkICovCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICAgICAgICAgICAgLyogUmV0dXJuIDEgaWYgdmFsaWQsIDAgaWYgbm90ICovCisgICAgICAgICAgICAgIHN3aXRjaCAoa3YpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICBuID0gY2tfa3JiNF90a3RfaXN2YWxpZChicFsxXSk7CisgICAgICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCAiJWQiLCBuID4gMCA/IDEgOiAwKTsgLyogU0FWRSAqLworICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgICBjYXNlIDU6IHsKKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBrcmI1X2RfY2M7CisgICAgICAgICAgICAgICAgICAgIG4gPSBja19rcmI1X3RrdF9pc3ZhbGlkKGtyYjVfZF9jYyxicFsxXSk7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZm52YWwsIiVkIiwgbiA+IDAgPyAxIDogMCk7IC8qIFNBRkUgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgIHNwcmludGYoZm52YWwsIiVkIiwwKTsgICAgLyogU0FGRSAqLworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisKKyAgICAgICAgICAgIGNhc2UgRk5fS1JCX1RUOiAgICAgICAgICAgICAvKiBLZXJiZXJvcyB0aWNrZXQgdGltZSAqLworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgICAgICAgICAgIHN3aXRjaCAoa3YpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICBuID0gY2tfa3JiNF90a3RfdGltZShicFsxXSk7CisgICAgICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCIlZCIsIG4gPj0gMCA/IG4gOiAwKTsgLyogU0FGRSAqLworICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgICBjYXNlIDU6IHsKKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBrcmI1X2RfY2M7CisgICAgICAgICAgICAgICAgICAgIG4gPSBja19rcmI1X3RrdF90aW1lKGtyYjVfZF9jYyxicFsxXSk7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZm52YWwsIiVkIiwgbiA+PSAwID8gbiA6IDApOyAvKiBTQUZFICovCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICBja3N0cm5jcHkoZm52YWwsIjYwMCIsRk5WQUxMKTsgLyogU29tZSB0aW1lICovCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyAgICAgICAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgICAgICAgY2FzZSBGTl9LUkJfRkc6ICAgICAgICAgICAgIC8qIEtlcmJlcm9zIHRpY2tldCBmbGFncyAqLworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgICAgICAgICAgIHN3aXRjaCAoa3YpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICBmbnZhbFswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgIGNhc2UgNTogeworICAgICAgICAgICAgICAgICAgICBleHRlcm4gY2hhciAqIGtyYjVfZF9jYzsKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLGNrX2tyYjVfdGt0X2ZsYWdzKGtyYjVfZF9jYyxicFsxXSksRk5WQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgIGZudmFsWzBdID0gJ1wwJzsKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgIH0KKyAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgIH0KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCisjaWZkZWYgRk5fRVJSTVNHCisgICAgICBjYXNlIEZOX0VSUk1TRzoKKyAgICAgICAgaWYgKHJkaWdpdHMoYnBbMF0pKSB7CisgICAgICAgICAgICBrID0gYXRvaShicFswXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLCI8RVJST1I6QVJHX05PVF9OVU1FUklDOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisjaWZkZWYgVk1TCisgICAgICAgIGNrc3RybmNweShmbnZhbCxja3Ztc2VycnN0cihrKSxGTlZBTEwpOworI2Vsc2UKKyAgICAgICAgeCA9IGVycm5vOworICAgICAgICBlcnJubyA9IGs7CisgICAgICAgIGNrc3RybmNweShmbnZhbCxja19lcnJzdHIoKSxGTlZBTEwpOworICAgICAgICBlcnJubyA9IHg7CisjZW5kaWYgLyogVk1TICovCisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgZ290byBmbmVuZDsKKyNlbmRpZiAvKiBGTl9FUlJNU0cgKi8KKworICAgICAgY2FzZSBGTl9ESU06IHsKKyAgICAgICAgICBpbnQgbWF4OworICAgICAgICAgIGNoYXIgYWJ1ZlsxNl0sICpzOworICAgICAgICAgIGZudmFsWzBdID0gTlVMOyAgICAgICAgICAgICAgIC8qIEluaXRpYWwgcmV0dXJuIHZhbHVlICovCisgICAgICAgICAgY2tzdHJuY3B5KGFidWYsYnBbMF0sMTYpOyAgICAgLyogR2V0IGFycmF5IHJlZmVyZW5jZSAqLworICAgICAgICAgIHMgPSBhYnVmOworICAgICAgICAgIGlmICgqcyA9PSBDTURRKSBzKys7CisgICAgICAgICAgZmFpbGVkID0gMTsgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIGl0J3MgYmFkICovCisgICAgICAgICAgcCA9IGZudmFsOyAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gcmVzdWx0ICovCisgICAgICAgICAgaWYgKGZuZGlhZ3MpICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBpcyB0aGlzIGVycm9yIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwiPEVSUk9SOkFSR19CQURfQVJSQVk6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICBpZiAoc1swXSAhPSAnJicpIHsgICAgICAgICAgICAvKiAiQWRkcmVzcyIgb2YgYXJyYXkgKi8KKyAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNbMl0pIHsKKyAgICAgICAgICAgICAgaWYgKHNbMl0gIT0gJ1snIHx8IHNbM10gIT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzWzFdID49IDY0ICYmIHNbMV0gPCA5MSkgIC8qIENvbnZlcnQgdXBwZXIgdG8gbG93ZXIgKi8KKyAgICAgICAgICAgIHNbMV0gKz0gMzI7CisgICAgICAgICAgaWYgKHNbMV0gPCA5NSB8fCBzWzFdID4gMTIyKSB7IC8qIENoZWNrIGZvciBhLXogKi8KKyAgICAgICAgICAgICAgZ290byBmbmVuZDsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhZCAqLworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKG1heCA9IGNoa2FycmF5KHNbMV0sMSkpIDwgMSkKKyAgICAgICAgICAgIG1heCA9IDA7CisgICAgICAgICAgZmFpbGVkID0gMDsgICAgICAgICAgICAgICAgICAgLyogVW5zZXQgZmFpbHVyZSBmbGFnICovCisgICAgICAgICAgc3ByaW50ZihmbnZhbCwiJWQiLG1heCk7ICAgICAgLyogU0FGRSAqLworICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICB9CisKKyAgICB9IC8qIEJyZWFrIHVwIGJpZyBzd2l0Y2guLi4gKi8KKworICAgIHN3aXRjaCAoeSkgeworICAgICAgY2FzZSBGTl9KREFURToKKyAgICAgICAgaWYgKGFyZ24gPCAxKSAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBudW1iZXIgb2YgYXJncyAqLworICAgICAgICAgIHAgPSBja2RhdGUoKTsgICAgICAgICAgICAgICAgIC8qIE5vbmUsIGdldCB0b2RheSdzIGRhdGUtdGltZSAqLworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvbWUgKi8KKyAgICAgICAgICBwID0gYnBbMF07ICAgICAgICAgICAgICAgICAgICAvKiBVc2UgZmlyc3QgKi8KKyAgICAgICAgcCA9IGNrY3Z0ZGF0ZShwLDApOyAgICAgICAgICAgICAvKiBDb252ZXJ0IHRvIHN0YW5kYXJkIGZvcm0gKi8KKyAgICAgICAgY2tzdHJuY3B5KGZudmFsLHpqZGF0ZShwKSxGTlZBTEwpOyAvKiBDb252ZXJ0IHRvIEp1bGlhbiAqLworICAgICAgICBwID0gZm52YWw7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIHJlc3VsdCAqLworICAgICAgICBmYWlsZWQgPSAwOworICAgICAgICBpZiAoKnAgPT0gJy0nKSB7CisgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgaXMgdGhpcyBlcnJvciBtZXNzYWdlICovCisgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwiPEVSUk9SOkFSR19CQURfREFURTpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICB9CisgICAgICAgIGdvdG8gZm5lbmQ7CisKKyAgICAgIGNhc2UgRk5fREFURUo6CisgICAgICAgIGNrc3RybmNweShmbnZhbCxqemRhdGUoYnBbMF0pLEZOVkFMTCk7IC8qIENvbnZlcnQgdG8geXl5eTxkYXlvZnllYXI+ICovCisgICAgICAgIHAgPSBmbnZhbDsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gcmVzdWx0ICovCisgICAgICAgIGZhaWxlZCA9IDA7CisgICAgICAgIGlmICgqcCA9PSAnLScpIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICBpZiAoZm5kaWFncykgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBpcyB0aGlzIGVycm9yIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLCI8RVJST1I6QVJHX0JBRF9EQVRFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9EVElNOiAgICAgICAgICAgICAgICAgICAgIC8qIFxmY3Z0ZGF0ZSgpICovCisgICAgICBjYXNlIEZOX1RJTUU6ICAgICAgICAgICAgICAgICAgICAgLyogRnJlZS1mb3JtYXQgdGltZSB0byBoaDptbTpzcyAqLworICAgICAgY2FzZSBGTl9OVElNOiAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWUgdG8gc2VjIHNpbmNlIG1pZG5pZ2h0ICovCisgICAgICAgIHMgPSAoYXJnbiA+IDApID8gYnBbMF0gOiAiIjsKKyAgICAgICAgaWYgKCFzKSBzID0gIiI7CisgICAgICAgIGlmICghKnMpCisgICAgICAgICAgcCA9IGNrZGF0ZSgpOyAgICAgICAgICAgICAgICAgLyogTm9uZSwgZ2V0IHRvZGF5J3MgZGF0ZSAqLworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvbWUgKi8KKyAgICAgICAgICBwID0gYnBbMF07ICAgICAgICAgICAgICAgICAgICAvKiBVc2UgZmlyc3QgKi8KKyAgICAgICAgcCA9IGNrY3Z0ZGF0ZShwLDIpOyAgICAgICAgICAgICAvKiBDb252ZXJ0IHRvIHN0YW5kYXJkIGZvcm0gKi8KKyAgICAgICAgaWYgKCpwID09ICc8JykgeworICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgIGlmIChmbmRpYWdzKSAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IGlzIHRoaXMgZXJyb3IgbWVzc2FnZSAqLworICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QVJHX0JBRF9EQVRFX09SX1RJTUU6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZ24gPiAxKSB7CisgICAgICAgICAgICBzID0gYnBbMV07CisgICAgICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgICAgIGlmICghKnMpIHMgPSAiMCI7CisgICAgICAgICAgICBpZiAoIWNoa251bShzKSkgeworICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19OT1RfTlVNRVJJQzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeCA9IGF0b2kocyk7CisgICAgICAgICAgICBpZiAoeCkgcCA9IHNodWZmbGVkYXRlKHAseCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN4ID09IEZOX1RJTUUpIHsKKyAgICAgICAgICAgIHAgKz0gOTsKKyAgICAgICAgfSBlbHNlIGlmIChjeCA9PSBGTl9OVElNKSB7CisgICAgICAgICAgICBsb25nIHNlYyA9IDBMOworICAgICAgICAgICAgcFsxMV0gPSBOVUw7CisgICAgICAgICAgICBwWzE0XSA9IE5VTDsKKyAgICAgICAgICAgIHNlYyA9IGF0b2wocCs5KSAqIDM2MDBMICsgYXRvbChwKzEyKSAqIDYwTCArIGF0b2wocCsxNSk7CisgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCIlbGQiLHNlYyk7ICAgLyogU0FGRSAqLworICAgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICB9CisgICAgICAgIGdvdG8gZm5lbmQ7CisKKyAgICAgIGNhc2UgRk5fTUpEOiAgICAgICAgICAgICAgICAgICAgICAvKiBNb2RpZmllZCBKdWxpYW4gRGF0ZSAqLworICAgICAgICBpZiAoYXJnbiA8IDEpICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIG51bWJlciBvZiBhcmdzICovCisgICAgICAgICAgcCA9IHp6bmRhdGUoKTsgICAgICAgICAgICAgICAgLyogTm9uZSwgZ2V0IHRvZGF5J3MgZGF0ZS10aW1lICovCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU29tZSAqLworICAgICAgICAgIHAgPSBicFswXTsgICAgICAgICAgICAgICAgICAgIC8qIFVzZSBmaXJzdCAqLworICAgICAgICBwID0gY2tjdnRkYXRlKHAsMCk7ICAgICAgICAgICAgIC8qIENvbnZlcnQgdG8gc3RhbmRhcmQgZm9ybSAqLworICAgICAgICBpZiAoKnAgPT0gJy0nKSB7CisgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgaXMgdGhpcyBlcnJvciBtZXNzYWdlICovCisgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwiPEVSUk9SOkFSR19CQURfREFURTpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgfQorICAgICAgICAvKiBDb252ZXJ0IHRvIG1vZGlmaWVkIEp1bGlhbiBkYXRlICovCisgICAgICAgIHNwcmludGYoZm52YWwsIiVsZCIsbWpkKHApKTsgICAgLyogU0FGRSAqLworICAgICAgICBwID0gZm52YWw7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIHJlc3VsdCAqLworICAgICAgICBnb3RvIGZuZW5kOworCisgICAgICBjYXNlIEZOX01KRDI6IHsKKyAgICAgICAgICBsb25nIGsgPSAwTDsKKyAgICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgICAgcCA9IGV2YWx4KGJwWzBdKTsKKyAgICAgICAgICBpZiAoKnAgPT0gJy0nKSB7CisgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgbiA9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghcmRpZ2l0cyhwKSkgeworICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICBldmFsZXJyKGZuKTsKKyAgICAgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGsgPSBhdG9sKHApOworICAgICAgICAgICAgICBpZiAobikgayA9IC1rOworICAgICAgICAgIH0KKyAgICAgICAgICBja3N0cm5jcHkoZm52YWwsbWpkMmRhdGUoayksRk5WQUxMKTsgLyogQ29udmVydCB0byBEYXRlICovCisgICAgICAgICAgcCA9IGZudmFsOyAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gcmVzdWx0ICovCisgICAgICAgICAgZmFpbGVkID0gMDsKKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgfQorCisjaWZuZGVmIE5PRElBTAorICAgICAgY2FzZSBGTl9QTkNWVDogeyAgICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgcGhvbmUgbnVtYmVyICovCisgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBwbmN2dCgpOworICAgICAgICAgIGZhaWxlZCA9IDA7CisgICAgICAgICAgcCA9IHBuY3Z0KGJwWzBdKTsKKyAgICAgICAgICBpZiAoIXApIHAgPSAiIjsKKyAgICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgaXMgdGhpcyBlcnJvciBtZXNzYWdlICovCisgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfQkFEX1BIT05FTlVNOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBmbmVuZDsKKyAgICAgIH0KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworICAgICAgY2FzZSBGTl9EQVk6CisgICAgICBjYXNlIEZOX05EQVk6CisgICAgICAgIGlmIChhcmduIDwgMSkgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgbnVtYmVyIG9mIGFyZ3MgKi8KKyAgICAgICAgICBwID0genpuZGF0ZSgpOyAgICAgICAgICAgICAgICAvKiBOb25lLCBnZXQgdG9kYXkncyBkYXRlLXRpbWUgKi8KKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb21lICovCisgICAgICAgICAgcCA9IGJwWzBdOyAgICAgICAgICAgICAgICAgICAgLyogVXNlIGZpcnN0ICovCisgICAgICAgIHAgPSBja2N2dGRhdGUocCwwKTsgICAgICAgICAgICAgLyogQ29udmVydCB0byBzdGFuZGFyZCBmb3JtICovCisgICAgICAgIGlmICgqcCA9PSAnLScpIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICBpZiAoZm5kaWFncykgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBpcyB0aGlzIGVycm9yIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLCI8RVJST1I6QVJHX0JBRF9EQVRFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisgICAgICAgIGZhaWxlZCA9IDA7CisgICAgICAgIHogPSBtamQocCk7ICAgICAgICAgICAgICAgICAgICAgLyogQ29udmVydCB0byBtb2RpZmllZCBKdWxpYW4gZGF0ZSAqLworICAgICAgICB6ID0geiAlIDdMOworICAgICAgICBpZiAoeiA8IDApIHsKKyAgICAgICAgICAgIHogPSAwIC0gejsKKyAgICAgICAgICAgIGsgPSA2IC0gKChpbnQpeiArIDMpICUgNzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGsgPSAoKGludCl6ICsgMykgJSA3OwkvKiBEYXkgb2Ygd2VlayAqLworICAgICAgICB9CisgICAgICAgIHAgPSBmbnZhbDsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gcmVzdWx0ICovCisgICAgICAgIGlmIChjeCA9PSBGTl9OREFZKQorICAgICAgICAgIHNwcmludGYoZm52YWwsIiVkIixrKTsgICAgICAgIC8qIFNBRkUgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgIGNrc3RybmNweShmbnZhbCx3a2RheXNba10sRk5WQUxMKTsKKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9OMlRJTTogeyAgICAgICAgICAgICAgICAgIC8qIFNlYyBzaW5jZSBtaWRuaWdodCB0byBoaDptbTpzcyAqLworICAgICAgICAgIGxvbmcgayA9IDBMOworICAgICAgICAgIGludCBuID0gMCwgaGgsIG1tLCBzczsKKyAgICAgICAgICBjaGFyICogcyA9IGJwWzBdOworICAgICAgICAgIGlmIChhcmduIDwgMSkgICAgICAgICAgICAgICAgIC8qIElmIG5vIGFyZyBzdWJzdGl0dXRlIDAgKi8KKyAgICAgICAgICAgIHMgPSAiMCI7CisgICAgICAgICAgcCA9IGV2YWx4KHMpOyAgICAgICAgICAgICAgICAgLyogRXZhbHVhdGUgZXhwcmVzc2lvbiBzaWxlbnRseSAqLworICAgICAgICAgIGlmICgqcCA9PSAnLScpIHsgICAgICAgICAgICAgIC8qIENoZWNrIHJlc3VsdCBmb3IgbWludXMgc2lnbiAqLworICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgIG4gPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIXJkaWdpdHMocCkpIHsgLyogQ2hlY2sgZm9yIG51bWVyaWMgKi8KKyAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19OT1RfTlVNRVJJQzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgayA9IGF0b2wocCk7CisgICAgICAgICAgICAgIGlmIChuKSBrID0gLWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChrIDwgMCkgeyAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBuZWdhdGl2ZSAqLworICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfT1VUX09GX1JBTkdFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgaGggPSBrIC8gMzYwMEw7ICAgICAgICAgICAgICAgLyogSGF2ZSBwb3NpdGl2ZSBudW1iZXIgKi8KKyAgICAgICAgICBtbSA9IChrICUgMzYwMEwpIC8gNjBMOyAgICAgICAvKiBicmVhayBpdCBkb3duLi4uICovCisgICAgICAgICAgc3MgPSAoKGsgJSAzNjAwTCkgJSA2MEwpOworCisgICAgICAgICAgc3ByaW50ZihmbnZhbCwiJTAyZDolMDJkOiUwMmQiLGhoLG1tLHNzKTsgLyogU0FGRSAqLworICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICBmYWlsZWQgPSAwOworICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICB9CisKKyAgICAgIGNhc2UgRk5fUEVSTTogeyAgICAgICAgICAgICAgICAgICAvKiBGaWxlIHBlcm1pc3Npb25zICovCisgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgIHogPSB6Y2hraShicFswXSk7CisgICAgICAgICAgaWYgKHogPCAwKSB7CisgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgIGlmIChmbmRpYWdzKSB7CisgICAgICAgICAgICAgICAgICBpZiAoeiA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkZJTEVfTk9UX0ZPVU5EOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmICh6ID09IC0yKQorICAgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6RklMRV9OT1RfUkVBREFCTEU6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHogPT0gLTMpCisgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpGSUxFX05PVF9BQ0NFU1NJQkxFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpGSUxFX0VSUk9SOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICB9CisjaWZkZWYgQ0tfUEVSTVMKKyAgICAgICAgICBja3N0cm5jcHkoZm52YWwsemlwZXJtKGJwWzBdKSxGTlZBTEwpOworI2Vsc2UKKyAgICAgICAgICBja3N0cm5jcHkoZm52YWwsIih1bmtub3duKSIsRk5WQUxMKTsKKyNlbmRpZiAvKiBDS19QRVJNUyAqLworICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICB9CisgICAgICBjYXNlIEZOX1RMT09LOiAgICAgICAgICAgICAgICAgICAgLyogdGFibGVsb29rKCkgKi8KKyAgICAgIGNhc2UgRk5fQUxPT0s6IHsgICAgICAgICAgICAgICAgICAvKiBhcnJheWxvb2soKSAqLworICAgICAgICAgIGludCBpLCB4LCBoaSwgbG8sIG1heCwgY21kbGVuOworICAgICAgICAgIGNoYXIgYWJ1ZlsxNl0sICpzLCAqcGF0OworICAgICAgICAgIGNoYXIga3didWZbMjU2XTsKKyAgICAgICAgICBjaGFyIGRlbGltID0gJzonOworICAgICAgICAgIGZhaWxlZCA9IDE7ICAgICAgICAgICAgICAgICAgIC8qIEFzc3VtZSBmYWlsdXJlICovCisgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLCItMSIsRk5WQUxMKTsKKyAgICAgICAgICBwYXQgPSBicFswXTsgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBzZWFyY2ggcGF0dGVybiAqLworICAgICAgICAgIGlmICghcGF0KSBwYXQgPSAiIjsgICAgICAgICAgIC8qIFdhdGNoIG91dCBmb3IgTlVMTCBwb2ludGVyICovCisgICAgICAgICAgY21kbGVuID0gc3RybGVuKHBhdCk7ICAgICAgICAgLyogR2V0IHBhdHRlcm4gbGVuZ3RoICovCisgICAgICAgICAgaWYgKGFyZ24gPCAyIC8qIHx8IGNtZGxlbiA8IDEgKi8gKSB7IC8qIE5lZWQgdHdvIGFyZ3MgKi8KKyAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLCI8RVJST1I6TUlTU0lOR19BUkc6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgY2tzdHJuY3B5KGFidWYsYnBbMV0sMTYpOyAgICAgLyogR2V0IGFycmF5IHJlZmVyZW5jZSAqLworICAgICAgICAgIGlmIChhcmduID4gMikKKyAgICAgICAgICAgIGRlbGltID0gKihicFsyXSk7CisgICAgICAgICAgcyA9IGFidWY7CisgICAgICAgICAgaWYgKCh4ID0gYXJyYXlib3VuZHMocywmbG8sJmhpKSkgPCAwKSB7IC8qIEdldCBpbmRleCBhbmQgYm91bmRzICovCisgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLCI8RVJST1I6QVJHX0JBRF9BUlJBWTpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgIH0KKyAgICAgICAgICBwID0gZm52YWw7ICAgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byByZXN1bHQgKi8KKyAgICAgICAgICBtYXggPSBhX2RpbVt4XTsgICAgICAgICAgICAgICAvKiBTaXplIG9mIGFycmF5ICovCisgICAgICAgICAgaWYgKGxvIDwgMCkgbG8gPSAwOyAgICAgICAgICAgLyogVXNlIGdpdmVuIHJhbmdlIGlmIGFueSAqLworICAgICAgICAgIGlmIChsbyA+IG1heCkgbG8gPSBtYXg7CisgICAgICAgICAgaWYgKGhpIDwgMCkgaGkgPSBtYXg7CisgICAgICAgICAgaWYgKGhpID4gbWF4KSBoaSA9IG1heDsKKyAgICAgICAgICBmYWlsZWQgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBVbnNldCBmYWlsdXJlIGZsYWcgKi8KKyAgICAgICAgICBpZiAobWF4IDwgMSkKKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAga3didWZbMjU1XSA9IE5VTDsKKyAgICAgICAgICBmb3IgKGkgPSBsbzsgaSA8PSBoaTsgaSsrKSB7CisgICAgICAgICAgICAgIGlmICghYV9wdHJbeF1baV0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIGlmIChjeCA9PSBGTl9BTE9PSykgeworICAgICAgICAgICAgICAgICAgaWYgKGNrbWF0Y2gocGF0LGFfcHRyW3hdW2ldLGlucGNhc1tjbWRsdmxdLDErNCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCIlZCIsaSk7IC8qIFNBRkUgKi8KKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN4ID09IEZOX1RMT09LKSB7CisgICAgICAgICAgICAgICAgICBjaGFyICogYWE7CisgICAgICAgICAgICAgICAgICBpbnQgaiA9IDAsIHYgPSAwLCBsZW47CisgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBoaSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBhYSA9IGFfcHRyW3hdW2ldOyAgICAgLyogUG9pbnQgdG8gdGhpcyBhcnJheSBlbGVtZW50ICovCisgICAgICAgICAgICAgICAgICBpZiAoIWFhKSBhYSA9ICIiOworICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCAyNTQgJiYgKmFhKSB7IC8qIElzb2xhdGUga2V5d29yZCAqLworICAgICAgICAgICAgICAgICAgICAgIGlmICgqYWEgPT0gZGVsaW0pCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBrd2J1ZltqKytdID0gKmFhKys7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBrd2J1ZltqXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgIGxlbiA9IGo7CisgICAgICAgICAgICAgICAgICB2ID0gMDsKKyAgICAgICAgICAgICAgICAgIGlmICgobGVuID09IGNtZGxlbiAmJiAhY2tzdHJjbXAoa3didWYscGF0LGxlbiwwKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAoKHYgPSAhY2tzdHJjbXAoa3didWYscGF0LGNtZGxlbiwwKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJjbXAoYV9wdHJbeF1baSsxXSxwYXQsY21kbGVuLDApKSkgeworICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZm52YWwsIiVkIixpKTsgLyogU0FGRSAqLworICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBpZiAodikgeyAgICAgICAgICAgICAgLyogQW1iaWd1b3VzICovCisgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLCItMiIsRk5WQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjeCA9PSBGTl9UTE9PSykgeyAgICAgICAgIC8qIHRhYmxlbG9vaygpIGxhc3QgZWxlbWVudCAqLworICAgICAgICAgICAgICBja3N0cm5jcHkoZm52YWwsIi0xIixGTlZBTEwpOworICAgICAgICAgICAgICBpZiAoIWNrc3RyY21wKGFfcHRyW3hdW2hpXSxwYXQsY21kbGVuLDApKQorICAgICAgICAgICAgICAgIHNwcmludGYoZm52YWwsIiVkIixoaSk7IC8qIFNBRkUgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk5fVE9CNjQ6ICAgICAgICAgICAgICAgICAgICAvKiBCYXNlLTY0IGNvbnZlcnNpb24gKi8KKyAgICAgIGNhc2UgRk5fRk1CNjQ6CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgKnAgPSBOVUw7CisgICAgICAgIGlmIChhcmduIDwgMSkKKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICBpZiAoY3ggPT0gRk5fVE9CNjQpIHsKKyAgICAgICAgICAgIHggPSBiOHRvYjY0KGJwWzBdLC0xLGZudmFsLEZOVkFMTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4ID0gc3RybGVuKGJwWzBdKTsKKyAgICAgICAgICAgIGlmICh4ICUgNCkgeyAgICAgICAgICAgICAgICAvKiBsZW5ndGggbXVzdCBiZSBtdWx0aXBsZSBvZiA0ICovCisgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfSU5DT01QTEVURTpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiNjR0b2I4KE5VTEwsMCxOVUxMLDApOyAgICAgLyogUmVzZXQgKi8KKyAgICAgICAgICAgIHggPSBiNjR0b2I4KGJwWzBdLC0xLGZudmFsLEZOVkFMTCk7CisgICAgICAgICAgICBiNjR0b2I4KE5VTEwsMCxOVUxMLDApOyAgICAgLyogUmVzZXQgYWdhaW4gKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICBpZiAoZm5kaWFncykgeworICAgICAgICAgICAgICAgIGNoYXIgKiBtID0gIklOVEVSTkFMX0VSUk9SIjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHgpIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgLTE6IG0gPSAiQVJHX1RPT19MT05HIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIC0yOiBtID0gIkFSR19PVVRfT0ZfUkFOR0UiOyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNrbWFrbXNnKGZudmFsLEZOVkFMTCwiPEVSUk9SOiIsbSwiXFxmIixmbikgPiAwKQorICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KGZudmFsLCIoKT4iLEZOVkFMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgY2FzZSBGTl9BQlM6IHsKKyAgICAgICAgICBjaGFyICogczsKKyAgICAgICAgICBzID0gYnBbMF07CisgICAgICAgICAgaWYgKCpzID09ICctJyB8fCAqcyA9PSAnKycpCisgICAgICAgICAgICBzKys7CisgICAgICAgICAgaWYgKCFyZGlnaXRzKHMpKSB7CisgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19OT1RfTlVNRVJJQzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgIH0KKyAgICAgICAgICBja3N0cm5jcHkoZm52YWwscyxGTlZBTEwpOworICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICB9CisKKyAgICAgIGNhc2UgRk5fQUFEVU1QOiB7CisgICAgICAgICAgY2hhciBhYnVmWzE2XSwgKnMgPSBOVUxMLCAqKmFwID0gTlVMTCwgKip2cCA9IE5VTEw7CisgICAgICAgICAgY2hhciBwYXR0ZXJuW1ZOQU1MXTsKKyAgICAgICAgICBpbnQgc2xlbiwgaSwgaiwgaywgZmlyc3QgPSAtMTsKKyAgICAgICAgICBleHRlcm4gaW50IHhkZWxtYWMoKTsKKyAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgaWYgKGFyZ24gPCAyKSB7CisgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwiPEVSUk9SOk1JU1NJTkdfQVJHMjpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWJ1ZyhGMTAxLCJhYWNvbnZlcnQgYXJnbiIsIiIsYXJnbik7CisgICAgICAgICAgcyA9IGJwWzBdOworICAgICAgICAgIHNsZW4gPSBzdHJsZW4ocyk7CisKKyAgICAgICAgICAvKiBDb3VudCBlbGVtZW50cyBzbyB3ZSBjYW4gY3JlYXRlIHRoZSBhcnJheSAqLworCisgICAgICAgICAgY2ttYWttc2cocGF0dGVybixWTkFNTCxzLCI8Kj4iLE5VTEwsTlVMTCk7CisgICAgICAgICAgZm9yIChrID0gMCwgaSA9IDA7IGkgPCBubWFjOyBpKyspIHsKKyAgICAgICAgICAgICAgaWYgKGNrbWF0Y2gocGF0dGVybixtYWN0YWJbaV0ua3dkLDAsMSkpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCA8IDApICAgICAgICAvKiBSZW1lbWJlciBsb2NhdGlvbiBvZiBmaXJzdCBtYXRjaCAqLworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGk7CisgICAgICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZGVidWcoRjEwMSwiYWFjb252ZXJ0IG1hdGNoZXMiLCIiLGspOworICAgICAgICAgIGRlYnVnKEYxMDEsImFhY29udmVydCBmaXJzdCIsIiIsZmlyc3QpOworICAgICAgICAgIGZudmFsWzBdID0gTlVMOyAgICAgICAgICAgICAgIC8qIEluaXRpYWwgcmV0dXJuIHZhbHVlICovCisgICAgICAgICAgY2tzdHJuY3B5KGFidWYsYnBbMV0sMTYpOyAgICAgLyogR2V0IGFycmF5IHJlZmVyZW5jZSAqLworICAgICAgICAgIHMgPSBhYnVmOworICAgICAgICAgIGlmICgqcyA9PSBDTURRKSBzKys7CisgICAgICAgICAgcCA9IGZudmFsOyAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gcmVzdWx0ICovCisgICAgICAgICAgaWYgKGZuZGlhZ3MpICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBpcyB0aGlzIGVycm9yIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwiPEVSUk9SOkFSR19CQURfQVJSQVk6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICBpZiAoc1swXSAhPSAnJicpICAgICAgICAgICAgICAvKiBBZGRyZXNzIG9mIGFycmF5ICovCisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgIGlmIChzWzJdKQorICAgICAgICAgICAgaWYgKHNbMl0gIT0gJ1snIHx8IHNbM10gIT0gJ10nKQorICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgIGlmIChzWzFdID49IDY0ICYmIHNbMV0gPCA5MSkgIC8qIENvbnZlcnQgdXBwZXIgdG8gbG93ZXIgKi8KKyAgICAgICAgICAgIHNbMV0gKz0gMzI7CisgICAgICAgICAgaWYgKCh4ID0gZGNsYXJyYXkoc1sxXSxrKSkgPCAwKSAvKiBEZWNsYXJlIGFycmF5IHRvIHNpemUgKi8KKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgYXAgPSBhX3B0clt4XTsgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gYXJyYXkgd2UganVzdCBkZWNsYXJlZCAqLworICAgICAgICAgIGRlYnVnKEYxMTEsImFhY29udmVydCBhcnJheSAxIixhYnVmLGFwKTsKKyAgICAgICAgICBhYnVmWzBdID0gTlVMOworICAgICAgICAgIGlmIChhcmduID4gMikgeworICAgICAgICAgICAgICBja3N0cm5jcHkoYWJ1ZixicFsyXSwxNik7IC8qIEdldCB2YWx1ZSBhcnJheSByZWZlcmVuY2UgKi8KKyAgICAgICAgICAgICAgcyA9IGFidWY7CisgICAgICAgICAgICAgIGlmICgqcyA9PSBDTURRKSBzKys7CisgICAgICAgICAgICAgIGlmIChzWzBdICE9ICcmJykgICAgICAgICAgLyogQWRkcmVzcyBvZiBhcnJheSAqLworICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgIGlmIChzWzJdKQorICAgICAgICAgICAgICAgIGlmIChzWzJdICE9ICdbJyB8fCBzWzNdICE9ICddJykKKyAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgIGlmIChzWzFdID49IDY0ICYmIHNbMV0gPCA5MSkgLyogQ29udmVydCB1cHBlciB0byBsb3dlciAqLworICAgICAgICAgICAgICAgIHNbMV0gKz0gMzI7CisgICAgICAgICAgICAgIGlmICgoeCA9IGRjbGFycmF5KHNbMV0saykpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICB2cCA9IGFfcHRyW3hdOyAgICAgICAgICAgIC8qIFBvaW50IHRvIGFycmF5IHdlIGp1c3QgZGVjbGFyZWQgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgZGVidWcoRjExMSwiYWFjb252ZXJ0IGFycmF5IDIiLGFidWYsdnApOworICAgICAgICAgIG1ha2VzdHIoJmFwWzBdLGNraXRvYShrKSk7CisgICAgICAgICAgaWYgKHZwKSBtYWtlc3RyKCZ2cFswXSxja2l0b2EoaykpOworICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsIjxFUlJPUjpBU1NPQ0lBVElWRV9BUlJBWTpcXGYiLGZuLCIoKT4iLE5VTEwpOworCisgICAgICAgICAgLyogQ29weSBtYWNybyBpbmRleCAmIHZhbHVlIHRvIHRoZSBhcnJheXMgYW5kIHRoZW4gcmVtb3ZlIHRoZSAqLworICAgICAgICAgIC8qIG1hY3JvLCBzbyB0aGUgJ2ZpcnN0JyBwb2ludGVyIGtlZXBzIGluZGljYXRpbmcgdGhlIG5leHQgb25lLiAqLworICAgICAgICAgIC8qIFdlIGNvdWxkIGNvbWJpbmUgdGhlIGluaXRpYWwgY291bnRpbmcgbG9vcCB3aXRoIHRoaXMgb25lIGJ1dCAqLworICAgICAgICAgIC8qIHRoZW4gaXQgd291bGQgYmUgaGFyZGVyIHRvIGNyZWF0ZSB0aGUgYXJyYXkgYW5kIGFueXdheSB0aGlzICovCisgICAgICAgICAgLyogZnVuY3Rpb24gaXMgcGxlbnR5IGZhc3QgYXMgaXQgaXMuICovCisKKyAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IGs7ICkgeworICAgICAgICAgICAgICBpZiAoIWNrbWF0Y2gocGF0dGVybixtYWN0YWJbZmlyc3RdLmt3ZCwwLDEpKSB7CisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJhYWNvbnZlcnQgb2RkYmFsbCIsbWFjdGFiW2ZpcnN0XS5rd2QsZmlyc3QpOworICAgICAgICAgICAgICAgICAgZmlyc3QrKzsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNrc3RybmNweSh0bXBidWYsbWFjdGFiW2ZpcnN0XS5rd2QsVE1QQlVGU0laKTsgLyogTWFjcm8gbmFtZSAqLworICAgICAgICAgICAgICBzID0gdG1wYnVmOyAgICAgICAgICAgICAgICAgICAgICAgLyogTWFrZSB3cml0ZWFibGUgY29weSAqLworICAgICAgICAgICAgICBzICs9IHNsZW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogSXNvbGF0ZSAiaW5kZXgiICovCisgICAgICAgICAgICAgIGogPSBzdHJsZW4ocykgLSAxOworICAgICAgICAgICAgICBpZiAoKnMgIT0gJzwnIHx8ICoocytqKSAhPSAnPicpIHsgLyogQ2hlY2sgc3ludGF4ICovCisgICAgICAgICAgICAgICAgICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImFhY29udmVydCBFUlJPUiIsbWFjdGFiW2ZpcnN0XS5rd2QsZmlyc3QpOworICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqKHMraikgPSBOVUw7ICAgICAgICAgICAgIC8qIFJlbW92ZSBmaW5hbCAnPicgKi8KKyAgICAgICAgICAgICAgZGVidWcoRjExMSwiYWFjb252ZXJ0IixzKzEsaSk7CisgICAgICAgICAgICAgIG1ha2VzdHIoJihhcFtpXSkscysxKTsgICAgLyogU2V0IGZpcnN0IGFycmF5IHRvIGluZGV4ICovCisgICAgICAgICAgICAgIGlmICh2cCkKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCYodnBbaV0pLG1hY3RhYltmaXJzdF0ubXZhbCk7IC8qIDJuZCB0byB2YWx1ZSAqLworICAgICAgICAgICAgICBpZiAoeGRlbG1hYyhmaXJzdCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgc3ByaW50ZihmbnZhbCwiJWQiLGspOyAgICAgICAgLyogU0FGRSAqLworICAgICAgICAgIHAgPSBmbnZhbDsgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBzaXplIG9mIGFycmF5ICovCisgICAgICAgICAgZGVidWcoRjExMCwiYWFjb252ZXJ0IHJldHVybiIscCwwKTsKKyAgICAgICAgICBmYWlsZWQgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBVbnNldCBmYWlsdXJlIGZsYWcgKi8KKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgfQorCisgICAgfSAvKiBFbmQgb2Ygc3dpdGNoKCkgKi8KKworI2lmZGVmIEZORkxPQVQKKy8qCisgIEZsb2F0aW5nLXBvaW50IGZ1bmN0aW9ucy4gIFRvIGJlIGluY2x1ZGVkIG9ubHkgaWYgRk5GTE9BVCBpcyBkZWZpbmVkLCB3aGljaAorICBzaG91bGQgaGFwcGVuIG9ubHkgaWYgQ0tGTE9BVCBpcyBhbHNvIGRlZmluZWQsIGFuZCBpZiB0aGUgbWF0aCBsaWJyYXJ5IGlzCisgIGxpbmtlZCBpbi4gIEV2ZW4gdGhlbiwgd2UgbWlnaHQgaGF2ZSBmbG9hdC12cy1kb3VibGUgY29uZnVzaW9uIGFzIHdlbGwgYXMKKyAgY29uZnVzaW9uIGFib3V0IHdoYXQgdGhlIGZpbmFsICIlZiIgZm9ybWF0IGVmZmVjdG9yIGlzIHN1cHBvc2VkIHRvIHJlZmVyZW5jZQorICAoMzIgYml0cywgNjQgYml0cywgZXRjKS4gIEV4cGVjdCB0cm91YmxlIGlmIENLRkxPQVQgZG9lcyBub3QgbWF0Y2ggdGhlIGRhdGEKKyAgdHlwZSBvZiBtYXRoIGxpYnJhcnkgZnVuY3Rpb25zIG9yIGFyZ3MuCisqLworICAgIGlmIChjeCA9PSBGTl9GUEFCUyB8fCAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nLXBvaW50IGZ1bmN0aW9ucyAqLworICAgICAgICBjeCA9PSBGTl9GUEFERCB8fAorICAgICAgICBjeCA9PSBGTl9GUERJViB8fAorICAgICAgICBjeCA9PSBGTl9GUEVYUCB8fAorICAgICAgICBjeCA9PSBGTl9GUExPRyB8fAorICAgICAgICBjeCA9PSBGTl9GUExOICB8fAorICAgICAgICBjeCA9PSBGTl9GUE1PRCB8fAorICAgICAgICBjeCA9PSBGTl9GUE1BWCB8fAorICAgICAgICBjeCA9PSBGTl9GUE1JTiB8fAorICAgICAgICBjeCA9PSBGTl9GUE1VTCB8fAorICAgICAgICBjeCA9PSBGTl9GUFBPVyB8fAorICAgICAgICBjeCA9PSBGTl9GUFNRUiB8fAorICAgICAgICBjeCA9PSBGTl9GUElOVCB8fAorICAgICAgICBjeCA9PSBGTl9GUFNVQiB8fAorICAgICAgICBjeCA9PSBGTl9GUFJPVSB8fAorICAgICAgICBjeCA9PSBGTl9GUFNJTiB8fAorICAgICAgICBjeCA9PSBGTl9GUENPUyB8fAorICAgICAgICBjeCA9PSBGTl9GUFRBTikgeworICAgICAgICBDS0ZMT0FUIGZhcmdbMl0sIGZwcmVzdWx0ID0gMC4wOworICAgICAgICBjaGFyIGZwYnVmWzY0XSwgKiBicDA7CisgICAgICAgIGRvdWJsZSBkdW1teTsKKyAgICAgICAgLyogaW50IHNpZ24gPSAwOyAqLworICAgICAgICBpbnQgaSwgaiwgcGxhY2VzID0gMDsKKyAgICAgICAgaW50IGFyZ2NvdW50ID0gMTsKKworICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICBwID0gZm52YWw7CisgICAgICAgIGJwMCA9IGJwWzBdOworICAgICAgICBpZiAoIWJwMCkKKyAgICAgICAgICBicDAgPSAiMCI7CisgICAgICAgIGVsc2UgaWYgKCEqYnAwKQorICAgICAgICAgIGJwMCA9ICIwIjsKKyAgICAgICAgaWYgKCFpc2Zsb2F0KGJwMCwwKSkgeworICAgICAgICAgICAgayA9IG14bG9vayhtYWN0YWIsYnAwLG5tYWMpOworICAgICAgICAgICAgYnAwID0gKGsgPiAtMSkgPyBtYWN0YWJba10ubXZhbCA6IE5VTEw7CisgICAgICAgICAgICBpZiAoYnAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc2Zsb2F0KGJwMCwwKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfTk9UX0ZMT0FUOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjeCA9PSBGTl9GUElOVCkgeyAgICAgICAgICAgLyogRmxvYXQgdG8gaW50ICovCisgICAgICAgICAgICBmYWlsZWQgPSAwOworICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLGJwMCxGTlZBTEwpOworICAgICAgICAgICAgZm9yIChpID0gMDsgZm52YWxbaV07IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChmbnZhbFtpXSA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAgZm52YWxbaV0gPSBOVUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICh5KSB7ICAgICAgICAgICAgICAgICAgICAvKiBUaGVzZSBuZWVkIDIgYXJncyAqLworICAgICAgICAgIGNhc2UgRk5fRlBBREQ6CisgICAgICAgICAgY2FzZSBGTl9GUERJVjoKKyAgICAgICAgICBjYXNlIEZOX0ZQTU9EOgorICAgICAgICAgIGNhc2UgRk5fRlBNQVg6CisgICAgICAgICAgY2FzZSBGTl9GUE1JTjoKKyAgICAgICAgICBjYXNlIEZOX0ZQTVVMOgorICAgICAgICAgIGNhc2UgRk5fRlBQT1c6CisgICAgICAgICAgY2FzZSBGTl9GUFNVQjoKKyAgICAgICAgICAgIGFyZ2NvdW50ID0gMjsKKyAgICAgICAgfQorICAgICAgICAvKiBNaXNzaW5nIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQgYXMgMC4wICovCisKKyAgICAgICAgZGVidWcoRjExMSxmbiwiYXJnY291bnQiLGFyZ2NvdW50KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2NvdW50OyBpKyspIHsgLyogR2V0IGZsb2F0aW5nLXBvaW50IGFyZ3MgKi8KKyNpZmRlZiBERUJVRworICAgICAgICAgICAgaWYgKGRlYmxvZykgeworICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZwYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJicFsiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNraXRvYShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBicFtpXSA/IGJwW2ldIDogIihudWxsKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIl0iCisgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLGZwYnVmLCIiLDApOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICBpZiAoIWJwW2ldKSB7CisgICAgICAgICAgICAgICAgZmFyZ1tpXSA9IDAuMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoISooYnBbaV0pKSB7CisgICAgICAgICAgICAgICAgZmFyZ1tpXSA9IDAuMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzZmxvYXQoYnBbaV0sMCkpIHsKKyAgICAgICAgICAgICAgICBjaGFyICogdG1wOworICAgICAgICAgICAgICAgIGsgPSBteGxvb2sobWFjdGFiLGJwW2ldLG5tYWMpOworICAgICAgICAgICAgICAgIHRtcCA9IChrID4gLTEpID8gbWFjdGFiW2tdLm12YWwgOiBOVUxMOworICAgICAgICAgICAgICAgIGlmICh0bXApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc2Zsb2F0KHRtcCwwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfTk9UX0ZMT0FUOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmFyZ1tpXSA9IGZsb2F0dmFsOworCisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGlmIChkZWJsb2cpIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGZwYnVmLCJmYXJnWyVkXT0lZiIsaSxmYXJnW2ldKTsgLyogU0FGRSAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsZnBidWYsIiIsMCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoYnBbYXJnY291bnRdKSB7ICAgICAgICAgICAgIC8qIEdldCBkZWNpbWFsIHBsYWNlcyAqLworICAgICAgICAgICAgY2hhciAqIHM7CisgICAgICAgICAgICBzID0gYnBbYXJnY291bnRdOworICAgICAgICAgICAgaWYgKCFzKSBzID0gIiI7CisgICAgICAgICAgICBpZiAoISpzKSBzID0gIjAiOworICAgICAgICAgICAgcyA9IGV2YWx4KHMpOworICAgICAgICAgICAgaWYgKCFzKSBzID0gIiI7CisgICAgICAgICAgICBpZiAoISpzKSB7CisgICAgICAgICAgICAgICAgZXZhbGVycihmbik7CisgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBsYWNlcyA9IGF0b2kocyk7CisgICAgICAgIH0KKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBmYWlsZWQgPSAwOworICAgICAgICBzd2l0Y2ggKHkpIHsgICAgICAgICAgICAgICAgICAgIC8qIE5vdyBkbyB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uICovCisgICAgICAgICAgY2FzZSBGTl9GUEFCUzogICAgICAgICAgICAgICAgLyogRmxvYXRpbmctcG9pbnQgYWJzb2x1dGUgdmFsdWUgKi8KKyNpZm5kZWYgQ09NTUVOVAorICAgICAgICAgICAgZnByZXN1bHQgPSBmYWJzKGZhcmdbMF0pOworI2Vsc2UKKyAgICAgICAgICAgIGlmIChmYXJnWzBdIDwgMC4wKQorICAgICAgICAgICAgICBmcHJlc3VsdCA9IDAuMCAtIGZhcmdbMF07CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBGTl9GUEFERDogICAgICAgICAgICAgICAgLyogRlAgYWRkICovCisgICAgICAgICAgICBmcHJlc3VsdCA9IGZhcmdbMF0gKyBmYXJnWzFdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBGTl9GUERJVjogICAgICAgICAgICAgICAgLyogRlAgZGl2aWRlICovCisgICAgICAgICAgY2FzZSBGTl9GUE1PRDogICAgICAgICAgICAgICAgLyogRlAgbW9kdWx1cyAqLworICAgICAgICAgICAgaWYgKCFmYXJnWzFdKSB7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6RElWSURFX0JZX1pFUk86XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBmcHJlc3VsdCA9IChjeCA9PSBGTl9GUERJVikgPworICAgICAgICAgICAgICAgIChmYXJnWzBdIC8gZmFyZ1sxXSkgOgorICAgICAgICAgICAgICAgICAgZm1vZChmYXJnWzBdLGZhcmdbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBGTl9GUEVYUDogICAgICAgICAgICAgICAgLyogRlAgZSB0byB0aGUgeCAqLworICAgICAgICAgICAgZnByZXN1bHQgPSAoQ0tGTE9BVCkgZXhwKGZhcmdbMF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBGTl9GUExPRzogICAgICAgICAgICAgICAgLyogRlAgYmFzZS0xMCBsb2dhcml0aG0gKi8KKyAgICAgICAgICBjYXNlIEZOX0ZQTE46ICAgICAgICAgICAgICAgICAvKiBGUCBuYXR1cmFsIGxvZ2FyaXRobSAqLworICAgICAgICAgICAgaWYgKGZhcmdbMF0gPCAwLjApIHsKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfT1VUX09GX1JBTkdFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgZnByZXN1bHQgPSAoY3ggPT0gRk5fRlBMT0cpID8gbG9nMTAoZmFyZ1swXSkgOiBsb2coZmFyZ1swXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEZOX0ZQTVVMOiAgICAgICAgICAgICAgICAvKiBGUCBtdWx0aXBseSAqLworICAgICAgICAgICAgZnByZXN1bHQgPSBmYXJnWzBdICogZmFyZ1sxXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRk5fRlBQT1c6ICAgICAgICAgICAgICAgIC8qIEZQIHJhaXNlIHRvIGEgcG93ZXIgKi8KKyAgICAgICAgICAgIGZwcmVzdWx0ID0gbW9kZihmYXJnWzFdLCZkdW1teSk7CisgICAgICAgICAgICBpZiAoKCFmYXJnWzBdICYmIGZhcmdbMV0gPD0gMC4wKSB8fAorICAgICAgICAgICAgICAgIChmYXJnWzBdIDwgMC4wICYmIGZwcmVzdWx0KSkgeworICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19PVVRfT0ZfUkFOR0U6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBmcHJlc3VsdCA9IHBvdyhmYXJnWzBdLGZhcmdbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBGTl9GUFNRUjogICAgICAgICAgICAgICAgLyogRlAgc3F1YXJlIHJvb3QgKi8KKyAgICAgICAgICAgIGlmIChmYXJnWzBdIDwgMC4wKSB7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QVJHX09VVF9PRl9SQU5HRTpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIGZwcmVzdWx0ID0gc3FydChmYXJnWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRk5fRlBTVUI6ICAgICAgICAgICAgICAgIC8qIEZQIHN1YnRyYWN0ICovCisgICAgICAgICAgICBmcHJlc3VsdCA9IGZhcmdbMF0gLSBmYXJnWzFdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBGTl9GUFJPVTogICAgICAgICAgICAgICAgLyogRlAgcm91bmQgKi8KKyAgICAgICAgICAgIGZwcmVzdWx0ID0gZmFyZ1swXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRk5fRlBTSU46ICAgICAgICAgICAgICAgIC8qIEZQIHNpbmUgKi8KKyAgICAgICAgICAgIGZwcmVzdWx0ID0gKENLRkxPQVQpIHNpbihmYXJnWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRk5fRlBDT1M6ICAgICAgICAgICAgICAgIC8qIEZQIGNvc2luZSAqLworICAgICAgICAgICAgZnByZXN1bHQgPSAoQ0tGTE9BVCkgY29zKGZhcmdbMF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBGTl9GUFRBTjogICAgICAgICAgICAgICAgLyogRlAgdGFuZ2VudCAqLworICAgICAgICAgICAgZnByZXN1bHQgPSAoQ0tGTE9BVCkgdGFuKGZhcmdbMF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBGTl9GUE1BWDoKKyAgICAgICAgICAgIGZwcmVzdWx0ID0gKGZhcmdbMF0gPiBmYXJnWzFdKSA/IGZhcmdbMF0gOiBmYXJnWzFdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBGTl9GUE1JTjoKKyAgICAgICAgICAgIGZwcmVzdWx0ID0gKGZhcmdbMF0gPCBmYXJnWzFdKSA/IGZhcmdbMF0gOiBmYXJnWzFdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgaGVyZSB3aXRoIGZwcmVzdWx0ID0gZnVuY3Rpb24gcmVzdWx0ICovCisKKyAgICAgICAgaWYgKGVycm5vKSB7ICAgICAgICAgICAgICAgICAgICAvKiBJZiByYW5nZSBvciBkb21haW4gZXJyb3IgKi8KKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkZMT0FUSU5HLVBPSU5ULU9QOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAvKiBhbmQvb3IgYW55IG90aGVyIGtpbmQgb2YgZXJyb3IsICovCisgICAgICAgICAgZ290byBmbmVuZDsgICAgICAgICAgICAgICAgICAgLyogZmFpbC4gKi8KKyNpZm5kZWYgQ09NTUVOVAorICAgICAgICAvKiBDYWxsIHJvdXRpbmUgY29udGFpbmluZyBjb2RlIHRoYXQgd2FzIGZvcm1lcmx5IGlubGluZSAqLworICAgICAgICBja3N0cm5jcHkoZm52YWwsZnBmb3JtYXQoZnByZXN1bHQscGxhY2VzLGN4ID09IEZOX0ZQUk9VKSxGTlZBTEwpOworI2Vsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBmYnVmWzE2XTsgICAgICAgICAgICAgIC8qIEZvciBjcmVhdGluZyBwcmludGYgZm9ybWF0ICovCisgICAgICAgICAgICBpZiAoIWZwX3JvdW5kaW5nICYmICAgICAgICAgLyogSWYgcHJpbnRmIGRvZXNuJ3Qgcm91bmQsICovCisgICAgICAgICAgICAgICAgKHBsYWNlcyA+IDAgfHwgICAgICAgICAgLyogcm91bmQgcmVzdWx0IHRvIGRlY2ltYWwgcGxhY2VzLiAqLworICAgICAgICAgICAgICAgICAocGxhY2VzID09IDAgJiYgY3ggPT0gRk5fRlBST1UpKSkKKyAgICAgICAgICAgICAgZnByZXN1bHQgKz0gKDAuNSAvIHBvdygxMC4wLChDS0ZMT0FUKXBsYWNlcykpOworICAgICAgICAgICAgaWYgKHBsYWNlcyA+IDApIHsgICAgICAgICAgICAgICAgICAgLyogSWYgcGxhY2VzIHNwZWNpZmllZCAqLworICAgICAgICAgICAgICAgIC8qIHVzZSBzcGVjaWZpZWQgcGxhY2VzIHRvIHdyaXRlIGdpdmVuIG51bWJlciBvZiBkaWdpdHMgKi8KKyAgICAgICAgICAgICAgICBzcHJpbnRmKGZidWYsIiUlMC4lZGYiLHBsYWNlcyk7IC8qIFNBRkUgKi8KKyAgICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLGZidWYsZnByZXN1bHQpOyAgIC8qIFNBRkUgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZS4uLiAqLworI2lmZGVmIENPTU1FTlQKKy8qCisgIEhlcmUgd2Ugd2FudCB0byBwcmludCBleGFjdGx5IGZwX2RpZ2l0cyBzaWduaWZpY2FudCBkaWdpdHMsIG5vIG1hdHRlciB3aGljaAorICBzaWRlIG9mIHRoZSBkZWNpbWFsIHBvaW50IHRoZXkgYXJlIG9uLiAgVGhhdCBpcywgd2Ugd2FudCB3YW50IHRoZSBkZWZhdWx0CisgIGZvcm1hdCB0byBzaG93IHRoZSBtYXhpbXVtIG51bWJlciBvZiBub24tZ2FyYmFnZSBkaWdpdHMsIEFORCB3ZSB3YW50IHRoZSBsYXN0CisgIHN1Y2ggZGlnaXQgdG8gYmUgcm91bmRlZC4gIE9mIGNvdXJzZSB0aGVyZSBpcyBubyB3YXkgdG8gZG8gdGhhdCwgc2luY2UgdGhlCisgIGRpZ2l0IGFmdGVyIHRoZSBsYXN0IG5vbi1nYXJiYWdlIGRpZ2l0IGlzLCB3ZWxsLCBnYXJiYWdlLiAgU28gdGhlIGZvbGxvd2luZworICBjbGV2ZXIgcnVzZSBkb2VzIG5vIGdvb2QuCisqLworICAgICAgICAgICAgICAgIGludCBzaWduID0gMCwgbSA9IDA7CisgICAgICAgICAgICAgICAgc3ByaW50ZihmbnZhbCwiJWYiLGZwcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBpZiAoZm52YWxbMF0gPT0gJy0nKSBzaWduID0gMTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBzaWduOyBpIDwgRk5WQUxMOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzZGlnaXQoZm52YWxbaV0pKQorICAgICAgICAgICAgICAgICAgICAgIG0rKzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGQgPSBmcF9kaWdpdHMgLSBtOworICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IDEpIGQgPSAxOworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGZidWYsIiUlJWQuJWRmIixmcF9kaWdpdHMrc2lnbisxLGQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZmJ1ZiwiJSUwLiVkZiIsZnBfZGlnaXRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3ByaW50ZihmbnZhbCxmYnVmLGZwcmVzdWx0KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgLyogR28gZm9yIG1heCBwcmVjaXNpb24gKi8KKyAgICAgICAgICAgICAgICBzcHJpbnRmKGZidWYsIiUlMC4lZGYiLGZwX2RpZ2l0cyk7IC8qIFNBRkUgKi8KKyAgICAgICAgICAgICAgICBzcHJpbnRmKGZudmFsLGZidWYsZnByZXN1bHQpOyAvKiBTQUZFICovCisKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm52YWxbMF0gPT0gJy0nKSBzaWduID0gMTsKKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTExLCJmcHJlc3VsdCAxIixmbnZhbCxlcnJubyk7IC8qIENoZWNrIGZvciBvdmVyL3VuZGVyZmxvdyAqLworICAgICAgICBmb3IgKGkgPSBzaWduOyBmbnZhbFtpXTsgaSsrKSB7IC8qIEdpdmUgcmVxdWVzdGVkIGRlY2ltYWwgcGxhY2VzICovCisgICAgICAgICAgICBpZiAoZm52YWxbaV0gPT0gJy4nKSAgICAgICAgLyogRmlyc3QgZmluZCB0aGUgZGVjaW1hbCBwb2ludCAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UgaWYgKGkgPiBmcF9kaWdpdHMgKyBzaWduIC0gMSkgLyogcmVwbGFjaW5nIGdhcmJhZ2UgKi8KKyAgICAgICAgICAgICAgZm52YWxbaV0gPSAnMCc7ICAgICAgICAgICAvKiBkaWdpdHMgd2l0aCAwLi4uICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGZudmFsW2ldID09ICcuJykgeyAgICAgICAgICAvKiBIYXZlIGRlY2ltYWwgcG9pbnQgKi8KKyAgICAgICAgICAgIGludCBnb3RlbmQgPSAwOworICAgICAgICAgICAgLyogZCA8IDAgc28gdHJ1bmNhdGUgZnJhY3Rpb24gKi8KKyAgICAgICAgICAgIGlmIChwbGFjZXMgPCAwIHx8IChwbGFjZXMgPT0gMCAmJiBjeCA9PSBGTl9GUFJPVSkpIHsKKyAgICAgICAgICAgICAgICBmbnZhbFtpXSA9IE5VTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGxhY2VzID4gMCkgeyAgICAvKiBkID4gMCBzbyB0aGlzIG1hbnkgZGVjaW1hbCBwbGFjZXMgKi8KKyAgICAgICAgICAgICAgICBpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgZGlnaXQgYWZ0ZXIgZGVjaW1hbCAqLworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwbGFjZXM7IGorKykgeyAvKiBUcnVuY2F0ZSBhZnRlciBkIGRlY2ltYWwgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmbnZhbFtqK2ldKSAgICAgICAgICAgLyogcGxhY2VzIG9yIGV4dGVuZCB0byBkICAqLworICAgICAgICAgICAgICAgICAgICAgIGdvdGVuZCA9IDE7ICAgICAgICAgICAgICAvKiBkZWNpbWFsIHBsYWNlcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdvdGVuZCB8fCBqK2krc2lnbiA+IGZwX2RpZ2l0cykKKyAgICAgICAgICAgICAgICAgICAgICBmbnZhbFtqK2ldID0gJzAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbnZhbFtqK2ldID0gTlVMOworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIGQgPT0gMCBzbyBEbyBUaGUgUmlnaHQgVGhpbmcgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAoaW50KXN0cmxlbihmbnZhbCkgLSAxOyBqID4gaSsxOyBqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChqIC0gc2lnbikgPiBmcF9kaWdpdHMpCisgICAgICAgICAgICAgICAgICAgICAgZm52YWxbal0gPSAnMCc7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbnZhbFtqXSA9PSAnMCcpCisgICAgICAgICAgICAgICAgICAgICAgZm52YWxbal0gPSBOVUw7ICAgLyogU3RyaXAgdXNlbGVzcyB0cmFpbGluZyAwJ3MuICovCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIGRlYnVnKEYxMTEsImZwcmVzdWx0IDIiLGZudmFsLGVycm5vKTsKKyAgICAgICAgZ290byBmbmVuZDsKKworICAgIH0KKyNlbmRpZiAvKiBGTkZMT0FUICovCisKKyNpZmRlZiBDS0NIQU5ORUxJTworICAgIGlmIChjeCA9PSBGTl9GU1RBVCAgfHwgICAgICAgICAgICAgIC8qIEZpbGUgZnVuY3Rpb25zICovCisgICAgICAgIGN4ID09IEZOX0ZQT1MgICB8fAorICAgICAgICBjeCA9PSBGTl9GRU9GICAgfHwKKyAgICAgICAgY3ggPT0gRk5fRkdDSEFSIHx8CisgICAgICAgIGN4ID09IEZOX0ZHTElORSB8fAorICAgICAgICBjeCA9PSBGTl9GR0JMSyAgfHwKKyAgICAgICAgY3ggPT0gRk5fRlBDSEFSIHx8CisgICAgICAgIGN4ID09IEZOX0ZQTElORSB8fAorICAgICAgICBjeCA9PSBGTl9GUEJMSyAgfHwKKyAgICAgICAgY3ggPT0gRk5fTkxJTkUgIHx8CisgICAgICAgIGN4ID09IEZOX0ZFUk1TRyB8fAorICAgICAgICBjeCA9PSBGTl9GSUxOTykgeworICAgICAgICBpbnQgeCA9IDAsIHQgPSAwLCBjaGFubmVsOworICAgICAgICBsb25nIHo7CisgICAgICAgIGV4dGVybiBpbnQgel9tYXhjaGFuOworCisgICAgICAgIGZhaWxlZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIGZhaWx1cmUgKi8KKyAgICAgICAgcCA9IGZudmFsOyAgICAgICAgICAgICAgICAgICAgICAvKiB1bnRpbCB3ZSB2YWxpZGF0ZSBhcmdzICovCisgICAgICAgIGlmIChjeCA9PSBGTl9GRVJNU0cpIHsKKyAgICAgICAgICAgIGV4dGVybiBpbnQgel9lcnJvcjsKKyAgICAgICAgICAgIGlmIChhcmduIDwgMSkgeworICAgICAgICAgICAgICAgIHggPSB6X2Vycm9yOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaGtudW0oYnBbMF0pKSB7CisgICAgICAgICAgICAgICAgeCA9IGF0b2koYnBbMF0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QVJHX05PVF9OVU1FUklDOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICBmYWlsZWQgPSAwOworICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLGNrZmVycm9yKHgpLEZOVkFMTCk7CisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisgICAgICAgIGlmIChhcmduIDwgMSkgeyAgICAgICAgICAgICAgICAgLyogQWxsIGZpbGUgZnVuY3Rpb25zIG5lZWQgY2hhbm5lbCAqLworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwiPEVSUk9SOk1JU1NJTkdfQVJHOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisgICAgICAgIGlmIChyZGlnaXRzKGJwWzBdKSkgeyAgICAgICAgICAgLyogQ2hhbm5lbCBtdXN0IGJlIG51bWVyaWMgKi8KKyAgICAgICAgICAgIGNoYW5uZWwgPSBhdG9pKGJwWzBdKTsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYWlsIGlmIGl0IGlzbid0ICovCisgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19OT1RfTlVNRVJJQzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+IHpfbWF4Y2hhbikgeyAvKiBDaGVjayBjaGFubmVsIHJhbmdlICovCisgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19PVVRfT0ZfUkFOR0U6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIH0KKyAgICAgICAgeCA9IHpfZ2V0bW9kZShjaGFubmVsKTsgICAgICAgICAvKiBGaW5kIG91dCBhYm91dCB0aGUgY2hhbm5lbCAqLworCisgICAgICAgIGZhaWxlZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIHN1Y2Nlc3MgZnJvbSBoZXJlIGRvd24gKi8KKyAgICAgICAgaWYgKGN4ID09IEZOX0ZTVEFUKSB7ICAgICAgICAgICAvKiBTdGF0dXMgLyBtb2RlcyBvZiBjaGFubmVsICovCisgICAgICAgICAgICBpZiAoeCA+IC0xKQorICAgICAgICAgICAgICB4ICY9IEZNX1JXQjsgICAgICAgICAgICAgIC8qIE1hc2sgb3V0IGlycmVsZXZhbnQgYml0cyAqLworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIHRoaXMgY2FzZSBub3Qgb3BlbiBpcyBPSyAqLworICAgICAgICAgICAgICB4ID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIDAgaWYgbm90IG9wZW4sIDEtNyBpZiBvcGVuICovCisgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCIlZCIseCk7ICAgICAgLyogU0FGRSAqLworICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgfSBlbHNlIGlmICh4IDwgMSkgeyAgICAgICAgICAgICAvKiBOb3QgXGZfc3RhdHVzKCkgc28gbXVzdCBiZSBvcGVuICovCisgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwiPEVSUk9SOkZJTEVfTk9UX09QRU46XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICh5KSB7ICAgICAgICAgICAgICAgICAgICAvKiBEbyB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uICovCisgICAgICAgICAgY2FzZSBGTl9GUE9TOiAgICAgICAgICAgICAgICAgLyogR2V0IHBvc2l0aW9uICovCisgICAgICAgICAgICB6ID0gel9nZXRwb3MoY2hhbm5lbCk7CisgICAgICAgICAgICBzcHJpbnRmKGZudmFsLCIlbGQiLHopOyAgICAgLyogU0FGRSAqLworICAgICAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgICAgIGNhc2UgRk5fTkxJTkU6ICAgICAgICAgICAgICAgIC8qIEdldCBsaW5lIG51bWJlciAqLworICAgICAgICAgICAgeiA9IHpfZ2V0bGluZShjaGFubmVsKTsKKyAgICAgICAgICAgIHNwcmludGYoZm52YWwsIiVsZCIseik7ICAgICAvKiBTQUZFICovCisgICAgICAgICAgICBnb3RvIGZuZW5kOworCisgICAgICAgICAgY2FzZSBGTl9GRU9GOiAgICAgICAgICAgICAgICAgLyogQ2hlY2sgRU9GICovCisgICAgICAgICAgICB0ID0gMDsKKyAgICAgICAgICAgIGlmICh4ICYgRk1fRU9GKSB0ID0gMTsKKyAgICAgICAgICAgIHNwcmludGYoZm52YWwsIiVkIix0KTsgICAgICAvKiBTQUZFICovCisgICAgICAgICAgICBnb3RvIGZuZW5kOworCisgICAgICAgICAgY2FzZSBGTl9GSUxOTzogICAgICAgICAgICAgICAgLyogR2V0IGZpbGUgaGFuZGxlICovCisgICAgICAgICAgICB4ID0gel9nZXRmbnVtKGNoYW5uZWwpOworICAgICAgICAgICAgc3ByaW50ZihmbnZhbCwiJWQiLHgpOyAgICAgIC8qIFNBRkUgKi8KKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisKKyAgICAgICAgICBjYXNlIEZOX0ZQQkxLOiAgICAgICAgICAgICAgICAvKiBSZWFkIG9yIHdyaXRlIGJsb2NrICovCisgICAgICAgICAgY2FzZSBGTl9GR0JMSzoKKyAgICAgICAgICAgIGlmIChhcmduIDwgMikgeworICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpNSVNTSU5HX0FSRzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmRpZ2l0cyhicFsxXSkpIHsKKyAgICAgICAgICAgICAgICB0ID0gYXRvaShicFsxXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfTk9UX05VTUVSSUM6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgRk5fRkdDSEFSOiAgICAgICAgICAgICAgIC8qIFJlYWQgb3Igd3JpdGUgY2hhcmFjdGVyIG9yIGxpbmUgKi8KKyAgICAgICAgICBjYXNlIEZOX0ZQQ0hBUjoKKyAgICAgICAgICBjYXNlIEZOX0ZHTElORToKKyAgICAgICAgICBjYXNlIEZOX0ZQTElORToKKyAgICAgICAgICAgIGZudmFsWzBdID0gTlVMOworICAgICAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgICAgIGNhc2UgRk5fRkdDSEFSOiB0ID0gel9pbihjaGFubmVsLGZudmFsLEZOVkFMTCwxLDEpOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBGTl9GR0xJTkU6IHQgPSB6X2luKGNoYW5uZWwsZm52YWwsRk5WQUxMLEZOVkFMTC0xLDApOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBGTl9GR0JMSzoKKyAgICAgICAgICAgICAgICBpZiAodCA+PSBGTlZBTEwpIHQgPSBGTlZBTEwgLSAxOworICAgICAgICAgICAgICAgIHQgPSB6X2luKGNoYW5uZWwsZm52YWwsRk5WQUxMLHQsMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRk5fRlBDSEFSOiB0ID0gel9vdXQoY2hhbm5lbCxicFsxXSwxLDEpOyAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRk5fRlBMSU5FOiB0ID0gel9vdXQoY2hhbm5lbCxicFsxXSwtMSwwKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRk5fRlBCTEs6ICB0ID0gel9vdXQoY2hhbm5lbCxicFsxXSwtMSwxKTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodCA8IDApIHsgICAgICAgICAgICAgICAgLyogSGFuZGxlIHJlYWQvd3JpdGUgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzICYmIHQgIT0gRlhfRU9GKQorICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpGSUxFX0VSUk9SXyVkOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjeCA9PSBGTl9GR0NIQVIpICAgICAgICAvKiBOdWxsIHRlcm1pbmF0ZSBjaGFyICovCisgICAgICAgICAgICAgIGZudmFsWzFdID0gTlVMOworICAgICAgICAgICAgLyogV3JpdGUgKHB1dCkgZnVuY3Rpb25zIHJldHVybiBudW1lcmljIHN0YXR1cyBjb2RlICovCisgICAgICAgICAgICBpZiAoY3ggPT0gRk5fRlBDSEFSIHx8IGN4ID09IEZOX0ZQTElORSB8fCBjeCA9PSBGTl9GUEJMSykKKyAgICAgICAgICAgICAgc3ByaW50ZihmbnZhbCwiJWQiLHQpOyAgICAvKiBTQUZFICovCisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENLQ0hBTk5FTElPICovCisKKyAgICBpZiAoY3ggPT0gRk5fUEFUVEVSTikgeyAgICAgICAgICAgICAvKiBcZnBhdHRlcm4oKSAqLworICAgICAgICBpc3BhdHRlcm4gPSAxOworICAgICAgICBpZiAoYXJnbiA+IDApIHsKKyAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgIGNrc3RybmNweShmbnZhbCxicFswXSxGTlZBTEwpOworICAgICAgICB9IGVsc2UgcCA9ICIiOworICAgICAgICBnb3RvIGZuZW5kOworICAgIH0KKworICAgIGlmIChjeCA9PSBGTl9IRVgyTiB8fCBjeCA9PSBGTl9PQ1QyTikgeyAvKiBcZmhleDJuKCksIFxmb2N0Mm4oKSAqLworICAgICAgICBwID0gIjAiOworICAgICAgICBpZiAoYXJnbiA8IDEpCisgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgcCA9IGNrcmFkaXgoYnBbMF0sICgoY3ggPT0gRk5fSEVYMk4pID8gMTYgOiA4KSwgMTApOworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QVJHX09VVF9PRl9SQU5HRTpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgfQorICAgICAgICBmYWlsZWQgPSAwOworICAgICAgICBja3N0cm5jcHkoZm52YWwscCxGTlZBTEwpOworICAgICAgICBwID0gZm52YWw7CisgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgfQorCisgICAgaWYgKGN4ID09IEZOX0hFWDJJUCkgeworICAgICAgICBpbnQgY1syXSwgaXBbNF0sIGksIGs7CisgICAgICAgIHAgPSAiMCI7CisgICAgICAgIGlmIChhcmduIDwgMSkKKyAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICBzID0gYnBbMF07CisgICAgICAgIGlmICgoaW50KXN0cmxlbihzKSAhPSA4KSB7CisgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfT1VUX09GX1JBTkdFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IDg7IGsgKz0gMikgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgIGNbaV0gPSAqcysrOworICAgICAgICAgICAgICAgIGlmIChpc2xvd2VyKGNbaV0pKSBjW2ldID0gdG91cHBlcihjW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoY1tpXSA+PSAnMCcgJiYgY1tpXSA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICAgICAgY1tpXSAtPSAweDMwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY1tpXSA+PSAnQScgJiYgY1tpXSA8PSAnRicpIHsKKyAgICAgICAgICAgICAgICAgICAgY1tpXSAtPSAweDM3OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19PVVRfT0ZfUkFOR0U6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXBbay8yXSA9IGNbMF0gPDwgNCB8IGNbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKHAsIiVkLiVkLiVkLiVkIixpcFswXSxpcFsxXSxpcFsyXSxpcFszXSk7IC8qIFNBRkUgKi8KKyAgICAgICAgfQorICAgICAgICBnb3RvIGZuZW5kOworICAgIH0KKyAgICBpZiAoY3ggPT0gRk5fSVAySEVYKSB7CisgICAgICAgIGludCBpcFs0XSwgaTsKKyAgICAgICAgY2hhciAqIHE7CisgICAgICAgIHAgPSAiMDAwMDAwMDAiOworICAgICAgICBpZiAoYXJnbiA8IDEpCisgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgcyA9IGJwWzBdOworICAgICAgICBwID0gZm52YWw7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIHEgPSBja3N0cmNocihzLCcuJyk7CisgICAgICAgICAgICBpZiAocSkgeworICAgICAgICAgICAgICAgICpxKysgPSBOVUw7CisgICAgICAgICAgICAgICAgaXBbaV0gPSBhdG9pKHMpOworICAgICAgICAgICAgICAgIHMgPSBxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfT1VUX09GX1JBTkdFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpcFszXSA9IGF0b2kocyk7CisgICAgICAgIHNwcmludGYocCwiJTAyeCUwMnglMDJ4JTAyeCIsaXBbMF0saXBbMV0saXBbMl0saXBbM10pOyAvKiBTQUZFICovCisgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgfQorICAgIGlmIChjeCA9PSBGTl9SQURJWCkgeworICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICBwID0gZm52YWw7CisgICAgICAgIGlmIChhcmduIDwgMykgeworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwiPEVSUk9SOk1JU1NJTkdfQVJHOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisgICAgICAgIGlmICghcmRpZ2l0cyhicFsxXSkgfHwgIXJkaWdpdHMoYnBbMl0pKSB7CisgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19OT1RfTlVNRVJJQzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgfQorICAgICAgICBwID0gY2tyYWRpeChicFswXSxhdG9pKGJwWzFdKSxhdG9pKGJwWzJdKSk7CisgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfT1VUX09GX1JBTkdFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisgICAgICAgIGZhaWxlZCA9IDA7CisgICAgICAgIGNrc3RybmNweShmbnZhbCxwLEZOVkFMTCk7CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgZ290byBmbmVuZDsKKyAgICB9CisgICAgaWYgKGN4ID09IEZOX0pPSU4pIHsKKyAgICAgICAgaW50IGksIHgsIHksIHosIGZsYWcsIGhpLCBsbywgbWF4LCBzZXBsZW4sIGdyb3VwaW5nID0gMDsKKyAgICAgICAgY2hhciBhYnVmWzE2XSwgYywgKnMsICpxLCAqc2VwID0gTlVMTDsKKyAgICAgICAgY2hhciAqIGdyX29wbiA9ICJcInsnKFs8IjsgICAgICAvKiBHcm91cCBvcGVuIGJyYWNrZXRzICovCisgICAgICAgIGNoYXIgKiBncl9jbHMgPSAiXCJ9JyldPiI7ICAgICAgLyogR3JvdXAgY2xvc2UgYnJhY2tldHMgKi8KKyAgICAgICAgY2hhciBsYlsyXSwgcmJbMl07ICAgICAgICAgICAgICAvKiBTZWxlY3RlZCBsZWZ0IGFuZCByaWdodCBicmFja2V0cyAqLworCisgICAgICAgIGZhaWxlZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIGZhaWx1cmUgKi8KKyAgICAgICAgZm52YWxbMF0gPSBOVUw7CisgICAgICAgIGRlYnVnKEYxMDEsIkZOSk9JTiBBUkdOIiwiIixhcmduKTsKKworICAgICAgICBja3N0cm5jcHkoYWJ1ZixicFswXSwxNik7ICAgICAgIC8qIEdldCBhcnJheSByZWZlcmVuY2UgKi8KKyAgICAgICAgcyA9IGFidWY7CisgICAgICAgIGlmICgoeCA9IGFycmF5Ym91bmRzKHMsJmxvLCZoaSkpIDwgMCkgeyAgLyogR2V0IGluZGV4IGFuZCBib3VuZHMgKi8KKyAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsIjxFUlJPUjpBUkdfQkFEX0FSUkFZOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisgICAgICAgIHAgPSBmbnZhbDsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gcmVzdWx0ICovCisgICAgICAgIG1heCA9IGFfZGltW3hdOyAgICAgICAgICAgICAgICAgLyogU2l6ZSBvZiBhcnJheSAqLworICAgICAgICBpZiAobG8gPCAwKSBsbyA9IDE7ICAgICAgICAgICAgIC8qIFVzZSBnaXZlbiByYW5nZSBpZiBhbnkgKi8KKyAgICAgICAgaWYgKGxvID4gbWF4KSBsbyA9IG1heDsKKyNpZmRlZiBDT01NRU5UCisJaGkgPSBtYXg7CisjZWxzZQorLyoKKyAgVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBwcm9ibGVtIGluIHdoaWNoIHRoZSBkaW1lbnNpb24gb2YgdGhlIFwmX1tdCisgIGFycmF5IChidXQgbm90IGl0cyBjb250ZW50cykgZ3Jvd3MgdXBvbiBlbnRyeSB0byBhIFNXSVRDSCBibG9jay4gIEJ1dCB0aGlzCisgIGNvZGUgcHJldmVudHMgdGhlIGRpbWVuc2lvbiBmcm9tIGdyb3dpbmcuICBHbyBmaWd1cmUuCisqLworICAgICAgICBpZiAoaGkgPCAwKSB7CQkJLyogQm91bmRzIG5vdCBnaXZlbiAqLworICAgICAgICAgICAgaWYgKHgpCQkJLyogUmVndWxhciBhcnJheSAqLworCSAgICAgIGhpID0gbWF4OworCSAgICBlbHNlCQkJLyogQXJndW1lbnQgdmVjdG9yIGFycmF5ICovCisJICAgICAgZm9yIChoaSA9IG1heDsgaGkgPj0gbG87IGhpLS0pIHsgLyogaWdub3JlIGFueSB0cmFpbGluZyAqLworCQkgIGlmICghYV9wdHJbeF1baGldKSBjb250aW51ZTsgLyogZW1wdHkgZWxlbWVudHMgKi8KKwkJICBpZiAoISooYV9wdHJbeF1baGldKSkgY29udGludWU7CisJCSAgYnJlYWs7CisJICAgICAgfQorCX0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIGlmIChoaSA+IG1heCkgaGkgPSBtYXg7CisgICAgICAgIGZhaWxlZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogVW5zZXQgZmFpbHVyZSBmbGFnICovCisgICAgICAgIGlmIChtYXggPCAxKQorICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIHNlcCA9ICIgIjsgICAgICAgICAgICAgICAgICAgICAgLyogU2VwYXJhdG9yICovCisgICAgICAgIGlmIChhcmduID4gMSkKKyAgICAgICAgICBpZiAoYnBbMV0pCisgICAgICAgICAgICBpZiAoKmJwWzFdKQorICAgICAgICAgICAgICBzZXAgPSBicFsxXTsKKyAgICAgICAgbGJbMF0gPSBOVUw7CisgICAgICAgIHJiWzBdID0gTlVMOworICAgICAgICBsYlsxXSA9IE5VTDsKKyAgICAgICAgcmJbMV0gPSBOVUw7CisgICAgICAgIGlmIChhcmduID4gMikgeyAgICAgICAgICAgICAgICAgLyogR3JvdXBpbmc/ICovCisgICAgICAgICAgICBjaGFyICogYnAyID0gYnBbMl07CisgICAgICAgICAgICBpZiAoIWJwMikgYnAyID0gIjAiOworICAgICAgICAgICAgaWYgKCEqYnAyKSBicDIgPSAiMCI7CisgICAgICAgICAgICBpZiAoY2hrbnVtKGJwMikpIHsKKyAgICAgICAgICAgICAgICBncm91cGluZyA9IGF0b2koYnAyKTsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXBpbmcgPCAwIHx8IGdyb3VwaW5nID4gNjMpCisgICAgICAgICAgICAgICAgICBncm91cGluZyA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19OT1RfTlVNRVJJQzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ3JvdXBpbmcpIHsgICAgICAgICAgICAgLyogVGFrZSBsb3dlc3Qtb3JkZXIgb25lICovCisgICAgICAgICAgICAgICAgaW50IGosIGs7ICAgICAgICAgICAgICAgLyogYW5kIHNldCB0aGUgb3RoZXJzIHRvIDAgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNjsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGogPSAxIDw8IGs7CisgICAgICAgICAgICAgICAgICAgIGlmIChncm91cGluZyAmIGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxiWzBdID0gZ3Jfb3BuW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgcmJbMF0gPSBncl9jbHNba107CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYXJnbiA+IDMpICAgICAgICAgICAgICAgICAgIC8qIE5vbnplcm8gNHRoIGFyZyBmb3Igbm8gc2VwYXJhdG9yICovCisgICAgICAgICAgaWYgKGNoa251bShicFszXSkpCisgICAgICAgICAgICBpZiAoYXRvaShicFszXSkgPiAwKQorICAgICAgICAgICAgICBzZXAgPSBOVUxMOworICAgICAgICBpZiAoIXNlcCkgeworICAgICAgICAgICAgc2VwID0gIiI7CisgICAgICAgICAgICBzZXBsZW4gPSAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBzZXBsZW4gPSBzdHJsZW4oc2VwKTsKKyAgICAgICAgZm9yIChpID0gbG87IGkgPD0gaGk7IGkrKykgeyAgICAvKiBMb29wIHRocnUgc2VsZWN0ZWQgYXJyYXkgZWxlbWVudHMgKi8KKyAgICAgICAgICAgIHMgPSBhX3B0clt4XVtpXTsgICAgICAgICAgICAvKiBHZXQgbmV4dCBlbGVtZW50ICovCisgICAgICAgICAgICBpZiAoIXMpCisgICAgICAgICAgICAgIHMgPSAiIjsKKyAgICAgICAgICAgIGZsYWcgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgb3ZlcnJ1biBmbGFnICovCisgICAgICAgICAgICBpZiAoZ3JvdXBpbmcpIHsgICAgICAgICAgICAgLyogRG9lcyB0aGlzIGVsZW1lbnQgbmVlZCBxdW90aW5nPyAqLworICAgICAgICAgICAgICAgIHEgPSBzOyAgICAgICAgICAgICAgICAgIC8qIExvb2sgZm9yIHNwYWNlcyAqLworICAgICAgICAgICAgICAgIHdoaWxlICgoYyA9ICpxKyspKSB7IGlmIChjID09IFNQKSB7IGZsYWcrKzsgYnJlYWs7IH0gfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgeSA9IHN0cmxlbihzKTsgICAgICAgICAgICAgIC8qIEdldCBsZW5ndGggb2YgdGhpcyBlbGVtZW50ICovCisgICAgICAgICAgICBpZiAoY3ggPT0gMCAmJiBncm91cGluZykgICAgLyogSWYgZW1wdHkgaXQgbWlnaHQgbmVlZCBxdW90aW5nICovCisgICAgICAgICAgICAgIGZsYWcgPSAxOworICAgICAgICAgICAgaWYgKGZsYWcpIHsgICAgICAgICAgICAgICAgIC8qIEFkZCBncm91cGluZyBpZiBuZWVkZWQgKi8KKyAgICAgICAgICAgICAgICBjaGFyICogczIgPSBOVUxMOworICAgICAgICAgICAgICAgIHkgKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAoKHEgPSAoY2hhciAqKW1hbGxvYyh5KzEpKSkgeworICAgICAgICAgICAgICAgICAgICBja21ha21zZyhxLHkrMSwoY2hhciAqKWxiLHMsKGNoYXIgKilyYixOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmczIscSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUocSk7CisgICAgICAgICAgICAgICAgICAgIHMgPSBzMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGNoYXJzIGNvcGllZCAqLworICAgICAgICAgICAgZmxhZyA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGZsYWcgaXMgbm93IGJ1ZmZlci1vdmVycnVuIGZsYWcgKi8KKyAgICAgICAgICAgIGlmICh5ID4gMCkgICAgICAgICAgICAgICAgICAvKiBJZiB0aGlzIHN0cmluZyBpcyBub3QgZW1wdHkgKi8KKyAgICAgICAgICAgICAgeiA9IGNrc3RybmNhdChmbnZhbCxzLEZOVkFMTCk7IC8qIGNvcHkgaXQuICovCisgICAgICAgICAgICBpZiAoeiA8IHkpICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVuLiAqLworICAgICAgICAgICAgICBmbGFnKys7CisgICAgICAgICAgICBpZiAoIWZsYWcgJiYgKnNlcCAmJiBpIDwgaGkpIHsgLyogSWYgYnVmZmVyIHN0aWxsIGhhcyByb29tICovCisgICAgICAgICAgICAgICAgeiA9IGNrc3RybmNhdChmbnZhbCxzZXAsRk5WQUxMKTsgLyogY29weSBkZWxpbWl0ZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAoeiA8IHNlcGxlbikKKyAgICAgICAgICAgICAgICAgIGZsYWcrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmbGFnKSB7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6UkVTVUxUX1RPT19MT05HOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCWlzam9pbiA9IDE7CisgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgfQorICAgIGlmIChjeCA9PSBGTl9TVUJTVCkgeyAgICAgICAgICAgICAgIC8qIFxmc3Vic3RpdHV0ZSgpICovCisgICAgICAgIENIQVIgYywgKiBzLCAqIHIsICogdHBbMl0sIGJ1ZjFbMjU2XSwgYnVmMlsyNTZdLCBidWYzWzI1Nl07CisgICAgICAgIGludCBsZW4sIGksIGosIHN0YXRlID0gMCwgbG8gPSAwLCBoaSA9IDA7CisKKyAgICAgICAgZmFpbGVkID0gMDsKKyAgICAgICAgcCA9IGZudmFsOyAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN1bHQgcG9pbnRlciAqLworICAgICAgICAqcCA9IE5VTDsKKyAgICAgICAgaWYgKCFicFswXSkgICAgICAgICAgICAgICAgICAgICAvKiBObyB0YXJnZXQsIG5vIHJlc3VsdCovCisgICAgICAgICAgZ290byBmbmVuZDsKKworICAgICAgICBsZW4gPSBzdHJsZW4oYnBbMF0pOyAgICAgICAgICAgIC8qIExlbmd0aCBvZiBzb3VyY2UgKi8KKyAgICAgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIGlmIChsZW4gPiBGTlZBTEwpIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOlJFU1VMVF9UT09fTE9ORzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWJwWzFdKSB7CisgICAgICAgICAgICBja3N0cm5jcHkoYnBbMF0sZm52YWwsRk5WQUxMKTsKKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIH0KKyAgICAgICAgdHBbMF0gPSBidWYxOyAgICAgICAgICAgICAgICAgICAvKiBGb3IgczItczMgaW50ZXJwcmV0YXRpb24gbG9vcCAqLworICAgICAgICB0cFsxXSA9IGJ1ZjI7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7ICAgICAvKiBJbml0aWFsaXplIHdvcmtpbmcgYnVmZmVycyAqLworICAgICAgICAgICAgYnVmMVtpXSA9IDA7ICAgICAgICAgICAgICAgIC8qIHMyIGV4cGFuc2lvbiBidWZmZXIgKi8KKyAgICAgICAgICAgIGJ1ZjJbaV0gPSAwOyAgICAgICAgICAgICAgICAvKiBzMyBleHBhbnNpb24gYnVmZmVyICovCisgICAgICAgICAgICBidWYzW2ldID0gaTsgICAgICAgICAgICAgICAgLyogVHJhbnNsYXRpb24gdGFibGUgKi8KKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7ICAgICAgIC8qIEludGVycHJldCBzMiBhbmQgczMgKi8KKyAgICAgICAgICAgIHMgPSAoQ0hBUiAqKWJwW2krMV07ICAgICAgICAvKiBBcmcgcG9pbnRlciAqLworICAgICAgICAgICAgaWYgKCFzKSBzID0gKENIQVIgKikiIjsKKyAgICAgICAgICAgIHIgPSB0cFtpXTsgICAgICAgICAgICAgICAgICAvKiBUbyBjb25zdHJ1Y3QgaW50ZXJwcmV0ZWQgYXJnICovCisgICAgICAgICAgICBqID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJ1ZiBwb2ludGVyICovCisgICAgICAgICAgICBzdGF0ZSA9IDA7ICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbCBzdGF0ZSAqLworICAgICAgICAgICAgd2hpbGUgKGMgPSAqcysrKSB7ICAgICAgICAgIC8qIExvb3AgdGhydSBhcmcgY2hhcnMgKi8KKyAgICAgICAgICAgICAgICBpZiAoaiA+IDI1NSkgICAgICAgICAgICAvKiBPdXRwdXQgYnVmIGZ1bGwgKi8KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAvKiBOb3JtYWwgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOiAgICAgICAgLyogSGF2ZSBxdW90ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWyc6ICAgICAgICAgLyogSGF2ZSByYW5nZSBzdGFydGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAvKiBBbnl0aGluZyBlbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICByW2orK10gPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgLyogUXVvdGVkIGNoYXIgKi8KKyAgICAgICAgICAgICAgICAgICAgcltqKytdID0gYzsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAvKiBSYW5nZSBib3R0b20gKi8KKyAgICAgICAgICAgICAgICAgICAgbG8gPSBjOworICAgICAgICAgICAgICAgICAgICBzdGF0ZSsrOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAvKiBSYW5nZSBzZXBhcmF0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gJy0nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpCQURfUkFOR0U6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGUrKzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgLyogUmFuZ2UgdG9wICovCisgICAgICAgICAgICAgICAgICAgIGhpID0gYzsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUrKzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICBjYXNlIDU6ICAgICAgICAgICAgICAgLyogUmFuZ2UgZW5kICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9ICddJykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbmRpYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QkFEX1JBTkdFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IGxvOyBrIDw9IGhpICYmIGogPCAyNTU7IGsrKykgLyogRmlsbCBpbiAqLworICAgICAgICAgICAgICAgICAgICAgIHJbaisrXSA9IGs7CisgICAgICAgICAgICAgICAgICAgIGxvID0gMDsgaGkgPSAwOyAgICAgLyogUmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NiAmJiBidWYxW2ldOyBpKyspIHsgIC8qIENyZWF0ZSB0cmFuc2xhdGlvbiB0YWJsZSAqLworICAgICAgICAgICAgayA9ICh1bnNpZ25lZClidWYxW2ldOworICAgICAgICAgICAgYnVmM1trXSA9IGJ1ZjJbaV07CisgICAgICAgIH0KKyAgICAgICAgcyA9IChDSEFSICopYnBbMF07ICAgICAgICAgICAgICAvKiBQb2ludCB0byBzb3VyY2Ugc3RyaW5nICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeyAgICAgLyogVHJhbnNsYXRpb24gbG9vcCAqLworICAgICAgICAgICAgayA9ICh1bnNpZ25lZClzW2ldOyAgICAgICAgIC8qIEdldCBuZXh0IGNoYXIgKi8KKyAgICAgICAgICAgIGlmICghYnVmM1trXSkgICAgICAgICAgICAgICAvKiBSZW1vdmUgdGhpcyBjaGFyICovCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgKnArKyA9IGJ1ZjNba107ICAgICAgICAgICAgIC8qIFN1YnN0aXR1dGUgdGhpcyBjaGFyICovCisgICAgICAgIH0KKyAgICAgICAgKnAgPSBOVUw7CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgZ290byBmbmVuZDsKKyAgICB9CisKKyNpZm5kZWYgTk9TRVhQCisgICAgaWYgKGN4ID09IEZOX1NFWFApIHsgICAgICAgICAgICAgICAgLyogXGZzZXhwcmVzc2lvbihhcmcxKSAqLworICAgICAgICBjaGFyICogcDI7CisgICAgICAgIGZzZXhwZmxhZysrOworICAgICAgICBwID0gKGFyZ24gPiAwKSA/IGRvc2V4cChicFswXSkgOiAiIjsKKyAgICAgICAgZnNleHBmbGFnLS07CisgICAgICAgIHAyID0gZm52YWw7CisgICAgICAgIHdoaWxlICgoKnAyKysgPSAqcCsrKSkgOworICAgICAgICBwID0gZm52YWw7CisgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgfQorI2VuZGlmIC8qIE5PU0VYUCAqLworCisgICAgaWYgKGN4ID09IEZOX0NNRFNUSykgeyAgICAgICAgICAgICAgLyogXGZjbWRzdGFjayhuMSxuMikgKi8KKyAgICAgICAgaW50IGksIGosIGs7CisgICAgICAgIGNoYXIgKiBzOworCisgICAgICAgIGlmIChicFswXSkKKyAgICAgICAgICB2YWwxID0gKihicFswXSkgPyBldmFseChicFswXSkgOiBja2l0b2EoY21kbHZsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZhbDEgPSBja2l0b2EoY21kbHZsKTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIGZyZWUoYnBbMF0pOyAgICAgICAgICAgICAgICAgICAgLyogKGV2YWx4KCkgYWx3YXlzIHVzZXMgc2FtZSBidWZmZXIpICovCisgICAgICAgIGJwWzBdID0gTlVMTDsgICAgICAgICAgICAgICAgICAgLyogKG5vdCBhbnkgbW9yZSEpICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICBpZiAoYXJnbiA+IDEpIHsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICBtYWtlc3RyKCYoYnBbMF0pLHZhbDEpOworICAgICAgICAgICAgdmFsMSA9IGJwWzBdOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIHZhbDIgPSAqKGJwWzFdKSA/IGV2YWx4KGJwWzFdKSA6ICIwIjsKKyAgICAgICAgICAgIGlmICghKGNoa251bSh2YWwxKSAmJiBjaGtudW0odmFsMikpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVSUk9SOkFSR19OT1RfTlVNRVJJQzpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWwxID0gY2tpdG9hKGNtZGx2bCk7CisgICAgICAgICAgICB2YWwyID0gIjAiOworICAgICAgICB9CisgICAgICAgIGkgPSBhdG9pKHZhbDEpOyAgICAgICAgICAgICAgICAgLyogTGV2ZWwgKi8KKyAgICAgICAgaiA9IGF0b2kodmFsMik7ICAgICAgICAgICAgICAgICAvKiBGbGFncyAqLworICAgICAgICBpZiAoaSA8IDAgfHwgaSA+IGNtZGx2bCkgeworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfT1VUX09GX1JBTkdFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisgICAgICAgIGZhaWxlZCA9IDA7CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgayA9IGNtZHN0a1tpXS5zcmM7ICAgICAgICAgICAgICAvKiBXaGF0IChwcm9tcHQsIGZpbGUsIG1hY3JvKSAqLworICAgICAgICBpZiAoaikgeworICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLGNraXRvYShrKSxGTlZBTEwpOworICAgICAgICAgICAgZ290byBmbmVuZDsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGspIHsKKyAgICAgICAgICBjYXNlIENNRF9LQjoKKyAgICAgICAgICAgIGNrc3RybmNweShmbnZhbCwiKHByb21wdCkiLEZOVkFMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENNRF9URjoKKyAgICAgICAgICAgIHMgPSB0Zm5hbVtjbWRzdGtbaV0ubHZsXTsKKyAgICAgICAgICAgIGlmICghemZucWZwKHMsRk5WQUxMLGZudmFsKSkKKyAgICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLHMsRk5WQUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ01EX01EOgorICAgICAgICAgICAgY2tzdHJuY3B5KGZudmFsLG1fYXJnW2NtZHN0a1tpXS5sdmxdWzBdLEZOVkFMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGZuZW5kOworICAgIH0KKyNpZmRlZiBDS0ZMT0FUCisgICAgaWYgKGN4ID09IEZOX0RJRkRBVEUpIHsgICAgICAgICAgICAgLyogXGZkaWZmZGF0ZXMoZDEsZDIpICovCisgICAgICAgIGNoYXIgKiBkMSwgKiBkMjsKKyAgICAgICAgZDEgPSBicFswXSA/IGJwWzBdIDogY2tkYXRlKCk7CisgICAgICAgIGQyID0gYnBbMV0gPyBicFsxXSA6IGNrZGF0ZSgpOworICAgICAgICBwID0gKGNoYXIgKiljbWRpZmZkYXRlKGQxLGQyKTsKKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpIHsKKyAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsIjxFUlJPUjpCQURfREFURTpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnb3RvIGZuZW5kOworICAgIH0KKyNlbmRpZiAvKiBDS0ZMT0FUICovCisgICAgaWYgKGN4ID09IEZOX0NNUERBVEUpIHsgICAgICAgICAgICAgLyogXGZjbWRkYXRlcyhkMSxkMikgKi8KKyAgICAgICAgaW50IHggPSAwOworICAgICAgICBjaGFyIGQxWzE4XSwgZDJbMThdLCAqIGRwOworICAgICAgICBmYWlsZWQgPSAwOworICAgICAgICBkMVswXSA9IE5VTDsKKyAgICAgICAgZDJbMF0gPSBOVUw7CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgZHAgPSBjbWN2dGRhdGUoYnBbMF0sMSk7CisgICAgICAgIGlmIChkcCkgeworICAgICAgICAgICAgY2tzdHJuY3B5KGQxLGRwLDE4KTsKKyAgICAgICAgICAgIGlmICgoZHAgPSBjbWN2dGRhdGUoYnBbMV0sMSkpKSB7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGQyLGRwLDE4KTsKKyAgICAgICAgICAgICAgICB4ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoeCA9PSAwKSB7CisgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpCisgICAgICAgICAgICAgIGNrbWFrbXNnKGZudmFsLEZOVkFMTCwiPEVSUk9SOkJBRF9EQVRFOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4ID0gc3RyY21wKGQxLGQyKTsKKyAgICAgICAgICAgIGlmICh4ID4gMCkKKyAgICAgICAgICAgICAgeCA9IDE7CisgICAgICAgICAgICBlbHNlIGlmICh4IDwgMCkKKyAgICAgICAgICAgICAgeCA9IC0xOworICAgICAgICAgICAgc3ByaW50ZihmbnZhbCwiJWQiLHgpOworICAgICAgICB9CisgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgfQorICAgIGlmIChjeCA9PSBGTl9UT0dNVCkgeyAgICAgICAgICAgICAgIC8qIFxmdXRjZGF0ZShkMSkgKi8KKyAgICAgICAgY2hhciAqIGQxLCAqIGRwOworICAgICAgICBjaGFyIGRhdGVidWZbMzJdOworICAgICAgICBjaGFyIGQyWzMyXTsKKyAgICAgICAgcCA9IGZudmFsOworICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICBpZiAoKGRwID0gY21jdnRkYXRlKGJwWzBdLDEpKSkgeyAvKiBUaGUgZ2l2ZW4gZGF0ZSAqLworICAgICAgICAgICAgY2tzdHJuY3B5KGRhdGVidWYsZHAsMTgpOworICAgICAgICAgICAgY2tzdHJuY3B5KGQyLGRwLDE4KTsgICAgICAgIC8qIGxvY2FsIHRpbWUgKi8KKyAgICAgICAgICAgIGNrc3RybmNhdChkYXRlYnVmLCJaIiwxOSk7ICAvKiBTYW1lIHRpbWUgR01UICovCisgICAgICAgICAgICBpZiAoKGRwID0gY21jdnRkYXRlKGRhdGVidWYsMSkpKSAvKiBjb252ZXJ0ZWQgdG8gbG9jYWwgdGltZSAqLworICAgICAgICAgICAgICBja3N0cm5jcHkoZGF0ZWJ1ZixkcCwxOCk7CisgICAgICAgICAgICBpZiAoKHAgPSAoY2hhciAqKWNtZGlmZmRhdGUoZDIsZGF0ZWJ1ZikpKSB7IC8qIEdldCBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICBja3N0cm5jYXQoZDIscCwzMik7ICAgICAvKiBBcHBlbmQgb2Zmc2V0IHRvIGxvY2FsIHRpbWUgKi8KKyAgICAgICAgICAgICAgICBpZiAoKGRwID0gY21jdnRkYXRlKGQyLDEpKSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkoZm52YWwsZHAsRk5WQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZmFpbGVkICYmIGZuZGlhZ3MpCisgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLCI8RVJST1I6QkFEX0RBVEU6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgZ290byBmbmVuZDsKKyAgICB9CisgICAgaWYgKGN4ID09IEZOX0RFTFNFQykgeyAgICAgICAgICAgICAgLyogXGZkZWx0YTJzZWNzKGRlbHRhLXRpbWUpICovCisgICAgICAgIGxvbmcgc2VjczsKKyAgICAgICAgcCA9IGZudmFsOworICAgICAgICBpZiAoKHggPSBkZWx0YTJzZWMoYnBbMF0sJnNlY3MpKSA8IDApIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICBpZiAoZm5kaWFncykKKyAgICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAoeCA9PSAtMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICI8RVJST1I6QkFEX0RFTFRBX1RJTUU6XFxmIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpPVkVSRkxPVzpcXGYiLAorICAgICAgICAgICAgICAgICAgICAgICBmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIigpPiIsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgICAgIH0KKyAgICAgICAgc3ByaW50ZihwLCIlbGQiLHNlY3MpOworICAgICAgICBnb3RvIGZuZW5kOworICAgIH0KKyAgICBpZiAoY3ggPT0gRk5fUENfRFUpIHsKKyAgICAgICAgY2hhciBjLCAqIHMgPSBicFswXTsKKyAgICAgICAgaWYgKCFzKSBzID0gIiI7CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgd2hpbGUgKChjID0gKnMrKykpIHsKKyAgICAgICAgICAgIGlmIChjID09ICc6JykgeworICAgICAgICAgICAgICAgIGlmICgqcyAhPSAnXFwnKQorICAgICAgICAgICAgICAgICAgKnArKyA9ICcvJzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgKnArKyA9ICcvJzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKnArKyA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKnAgPSBOVUw7CisgICAgICAgIHAgPSBmbnZhbDsKKyAgICAgICAgZ290byBmbmVuZDsKKyAgICB9CisgICAgaWYgKGN4ID09IEZOX1BDX1VEKSB7ICAgICAgICAgICAgICAgLyogVW5peCB0byBET1MgcGF0aCAqLworICAgICAgICBjaGFyIGMsICogcyA9IGJwWzBdOworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgaWYgKCpzID09ICd+JykgeyAgICAgICAgICAgICAgICAvKiBTa2lwIGxlYWRpbmcgdGlsZGUgKi8KKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgIGlmICgqcyA9PSAnLycpCisgICAgICAgICAgICAgIHMrKzsKKyAgICAgICAgfQorICAgICAgICBwID0gZm52YWw7CisgICAgICAgIHdoaWxlICgoYyA9ICpzKyspKQorICAgICAgICAgICpwICsrID0gKGMgPT0gJy8nKSA/ICdcXCcgOiBjOworICAgICAgICAqcCA9IE5VTDsKKyAgICAgICAgcCA9IGZudmFsOworICAgICAgICBnb3RvIGZuZW5kOworICAgIH0KKyAgICBpZiAoY3ggPT0gRk5fS1dWQUwpIHsgICAgICAgICAgICAgICAvKiBLZXl3b3JkPVZhbHVlICovCisgICAgICAgIHAgPSBkb2t3dmFsKGJwWzBdLGJwWzFdPyooYnBbMV0pOic9Jyk7CisgICAgICAgIGdvdG8gZm5lbmQ7CisgICAgfQorI2lmZGVmIENPTU1FTlQKKy8qIEN1dGUgaWRlYSBidXQgZG9lc24ndCB3b3JrICovCisgICAgaWYgKGN4ID09IEZOX1NMRUVQIHx8IGN4ID09IEZOX01TTEVFUCkgeworICAgICAgICBwID0gIiI7CisgICAgICAgIGlmIChjaGtudW0oYnBbMF0pKSB7CisgICAgICAgICAgICB4ID0gYXRvaShicFswXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgaWYgKGZuZGlhZ3MpIHsKKyAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIjxFUlJPUjpBUkdfTk9UX05VTUVSSUM6XFxmIixmbiwiKCk+IixOVUxMKTsKKyAgICAgICAgICAgICAgICBwID0gZm52YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGZuZW5kOworICAgICAgICB9CisgICAgICAgIGlmIChjeCA9PSBGTl9TTEVFUCkKKyAgICAgICAgICB4ICo9IDEwMDA7CisgICAgICAgIG1zbGVlcCh4KTsKKyAgICAgICAgZ290byBmbmVuZDsKKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjaWZkZWYgTlQKKyAgICBpZiAoY3ggPT0gRk5fU05BTUUpIHsKKyAgICAgICAgR2V0U2hvcnRQYXRoTmFtZShicFswXSxmbnZhbCxGTlZBTEwpOworICAgICAgICBnb3RvIGZuZW5kOworICAgIH0KKyAgICBpZiAoY3ggPT0gRk5fTE5BTUUpIHsKKyAgICAgICAgY2tHZXRMb25nUGF0aE5hbWUoYnBbMF0sZm52YWwsRk5WQUxMKTsKKyAgICAgICAgZ290byBmbmVuZDsKKyAgICB9CisjZW5kaWYgLyogTlQgKi8KKworLyogTm90ZTogd2hlbiBhZGRpbmcgbmV3IGZ1bmN0aW9ucyByZW1lbWJlciB0byB1cGRhdGUgZG9oZnVuYyBpbiBja3V1czIuYy4gKi8KKworICAgIGZhaWxlZCA9IDE7CisgICAgaWYgKGZuZGlhZ3MpCisgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsIjxFUlJPUjpVTktOT1dOX0ZVTkNUSU9OOlxcZiIsZm4sIigpPiIsTlVMTCk7CisKKyAgZm5lbmQ6CisgICAgLyogRnJlZSB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgYWd1bWVudHMgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgYXJnbjsgaysrKSBpZiAoYnBba10pIGZyZWUoYnBba10pOworICAgIGZuZGVwdGgtLTsKKyAgICBpZiAoZmFpbGVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgZmFpbHVyZSAqLworICAgICAgICBkZWJ1ZyhGMTExLCJmbmVuZCIsZm52YWwsZXJybm8pOworICAgICAgICBpZiAoIXApIHAgPSAiIjsKKyAgICAgICAgaWYgKHBbMF0pIHsKKyAgICAgICAgICAgIC8qIEluIGNhc2UgdGhpcyB3YXNuJ3QgY2F1Z2h0IGFib3ZlLi4uICovCisgICAgICAgICAgICBrID0gc3RybGVuKHApOworICAgICAgICAgICAgaWYgKHBbMF0gIT0gJzwnICYmIHBbay0xXSAhPSAnPicpIHsKKyAgICAgICAgICAgICAgICBja21ha21zZyhmbnZhbCxGTlZBTEwsIjxFUlJPUjpCQURfQVJHOlxcZiIsZm4sIigpPiIsTlVMTCk7CisgICAgICAgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2ttYWttc2coZm52YWwsRk5WQUxMLCI8RVJST1I6VU5LTk9XTjpcXGYiLGZuLCIoKT4iLE5VTEwpOworICAgICAgICAgICAgcCA9IGZudmFsOworICAgICAgICB9CisgICAgICAgIGlmIChmbmVycm9yKSAgICAgICAgICAgICAgICAgICAgLyogU0VUIEZVTkNUSU9OIEVSUk9SIE9OICovCisgICAgICAgICAgZm5zdWNjZXNzID0gMDsgICAgICAgICAgICAgICAgLyogTWFrZSBjb21tYW5kIGZhaWwgKHNlZSBja3V1czUuYykgKi8KKyAgICAgICAgZGVidWcoRjExMSwiZm5ldmFsIGZhaWxlZCIscCxmbnN1Y2Nlc3MpOworICAgICAgICBpZiAoZm5kaWFncykgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBGVU5DVElPTiBESUFHTk9TVElDUyBPTiAqLworICAgICAgICAgIHByaW50ZigiPyVzXG4iLHApOyAgICAgICAgICAgIC8qIFByaW50IGVycm9yIG1lc3NhZ2Ugbm93LiAqLworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuKCIiKTsgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIG5vdGhpbmcuICovCisgICAgfQorICAgIHJldHVybihwKTsKK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCitzdGF0aWMgY2hhciBja3BpZGJ1ZlszMl0gPSAiPz8/PyI7CisKKyNpZmRlZiBWTVMKK19QUk9UT1RZUChsb25nIHpncGlkLCh2b2lkKSk7CisjZW5kaWYgLyogVk1TICovCisKK2NoYXIgKgorY2tnZXRwaWQoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBwaWQgYXMgc3RyaW5nICovCisjaWZkZWYgQ0tfUElECisjaWZkZWYgT1MyCisjZGVmaW5lIGdldHBpZCBfZ2V0cGlkCisgICAgdW5zaWduZWQgbG9uZyB6ejsKKyNlbHNlCisgICAgbG9uZyB6ejsKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBWTVMKKyAgICB6eiA9IHpncGlkKCk7CisjZWxzZQorICAgIHp6ID0gZ2V0cGlkKCk7CisjZW5kaWYgLyogVk1TICovCisgICAgc3ByaW50Zihja3BpZGJ1ZiwiJWxkIix6eik7ICAgICAgICAgLyogU0FGRSAqLworI2VuZGlmIC8qIENLX1BJRCAqLworICAgIHJldHVybigoY2hhciAqKWNrcGlkYnVmKTsKK30KKworI2lmbmRlZiBOT1NQTAorI2RlZmluZSBFTUJVRkxFTiAxMjggICAgICAgICAgICAgICAgICAgIC8qIEVycm9yIG1lc3NhZ2UgYnVmZmVyIGxlbmd0aCAqLworCitzdGF0aWMgY2hhciBlbWJ1ZltFTUJVRkxFTisxXTsKKworY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV2YWx1YXRlIGJ1aWx0aW4gdmFyaWFibGUgKi8KK252bG9vayhzKSBjaGFyICpzOyB7CisgICAgaW50IHgsIHksIGN4OworICAgIGxvbmcgejsKKyAgICBjaGFyICpwOworI2lmbmRlZiBOT0RJQUwKKyAgICBNRE1JTkYgKiBtOworI2VuZGlmIC8qIE5PRElBTCAqLworI2lmbmRlZiBOT0tWRVJCUyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtleWJvYXJkIG1hY3JvIG1hdGVyaWFsICovCisgICAgZXh0ZXJuIGludCBrZXltYWMsIGtleW1hY3g7CisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKyNpZmRlZiBDS19MT0dJTgorICAgIGV4dGVybiBpbnQgaXNndWVzdDsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgIGlmICghcykgcyA9ICIiOworICAgIHggPSBzdHJsZW4ocyk7CisgICAgaWYgKGZuZGlhZ3MpIHsgICAgICAgICAgICAgICAgICAgICAgLyogRlVOQ1RJT04gRElBR05PU1RJQyBPTiAqLworICAgICAgICBpZiAoeCArIDMyIDwgRU1CVUZMRU4pCisgICAgICAgICAgc3ByaW50ZihlbWJ1ZiwiPEVSUk9SOk5PX1NVQ0hfVkFSSUFCTEU6XFx2KCVzKT4iLHMpOyAvKiBTQUZFICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICBzcHJpbnRmKGVtYnVmLCI8RVJST1I6Tk9fU1VDSF9WQVJJQUJMRT4iKTsgLyogU0FGRSAqLworICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZVTkNUSU9OIERJQUdOT1NUSUMgT0ZGICovCisgICAgICBlbWJ1ZlswXSA9IE5VTDsKKyAgICB4ID0gVlZCVUZMOworICAgIHAgPSB2dmJ1ZjsKKyAgICBpZiAoenpzdHJpbmcocywmcCwmeCkgPCAwKSB7ICAgICAgICAvKiBlLmcuIGZvciBcdihcJWEpICovCisgICAgICAgIHkgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBzID0gdnZidWY7CisgICAgICAgIHkgPSBsb29rdXAodmFydGFiLHMsbnZhcnMsJngpOworICAgIH0KKyAgICBjeCA9IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB5IGlzIHRvbyBnZW5lcmljICovCisjaWZuZGVmIE5PRElBTAorICAgIG0gPSAobWRtdHlwID4gMCkgPyBtb2RlbXBbbWRtdHlwXSA6IE5VTEw7IC8qIEZvciBcdihtX3h4eCkgdmFyaWFibGVzICovCisjZW5kaWYgLyogTk9ESUFMICovCisKKyAgICBkZWJ1ZyhGMTAxLCJudmxvb2sgeSIsIiIseSk7CisKKyAgICBzd2l0Y2ggKHkpIHsKKyAgICAgIGNhc2UgVk5fQVJHQzogICAgICAgICAgICAgICAgICAgICAvKiBBUkdDICovCisgICAgICAgIHNwcmludGYodnZidWYsIiVkIixtYWNsdmwgPCAwID8gdG9wYXJnYyA6IG1hY2FyZ2NbbWFjbHZsXSk7IC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9BUkdTOiAgICAgICAgICAgICAgICAgICAgIC8qIEFSR1MgKi8KKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwiJWQiLHhhcmdzKTsgICAgICAvKiBTQUZFICovCisgICAgICAgIHJldHVybih2dmJ1Zik7CisKKyAgICAgIGNhc2UgVk5fQ09VTjogICAgICAgICAgICAgICAgICAgICAvKiBDT1VOVCAqLworICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIsY291bnRbY21kbHZsXSk7IC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9EQVRFOiAgICAgICAgICAgICAgICAgICAgIC8qIERBVEUgKi8KKyAgICAgICAgenRpbWUoJnApOyAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgImFzY3RpbWUiIHN0cmluZyAqLworICAgICAgICBpZiAocCA9PSBOVUxMIHx8ICpwID09IE5VTCkgcmV0dXJuKE5VTEwpOworICAgICAgICB2dmJ1ZlswXSA9IHBbOF07ICAgICAgICAgICAgICAgIC8qIGRkICovCisgICAgICAgIHZ2YnVmWzFdID0gcFs5XTsKKyAgICAgICAgdnZidWZbMl0gPSBTUDsKKyAgICAgICAgdnZidWZbM10gPSBwWzRdOyAgICAgICAgICAgICAgICAvKiBtbW0gKi8KKyAgICAgICAgdnZidWZbNF0gPSBwWzVdOworICAgICAgICB2dmJ1Zls1XSA9IHBbNl07CisgICAgICAgIHZ2YnVmWzZdID0gU1A7CisgICAgICAgIGZvciAoeCA9IDIwOyB4IDwgMjQ7IHgrKykgICAgICAgLyogeXl5eSAqLworICAgICAgICAgIHZ2YnVmW3ggLSAxM10gPSBwW3hdOworICAgICAgICB2dmJ1ZlsxMV0gPSBOVUw7CisgICAgICAgIHJldHVybih2dmJ1Zik7CisKKyAgICAgIGNhc2UgVk5fTkRBVDogICAgICAgICAgICAgICAgICAgICAvKiBOdW1lcmljIGRhdGUgKi8KKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLHp6bmRhdGUoKSxWVkJVRkwpOworICAgICAgICByZXR1cm4odnZidWYpOworCisgICAgICBjYXNlIFZOX0RJUkU6ICAgICAgICAgICAgICAgICAgICAgLyogRElSRUNUT1JZICovCisgICAgICAgIHMgPSB6Z3RkaXIoKTsgICAgICAgICAgICAgICAgICAgLyogR2V0IGN1cnJlbnQgZGlyZWN0b3J5ICovCisgICAgICAgIGlmICghcykKKyNpZmRlZiBVTklYT1JPU0sKKyAgICAgICAgICBzID0gIi4vIjsKKyNlbHNlCisjaWZkZWYgVk1TCisgICAgICAgICAgcyA9ICJbXSI7CisjZWxzZQorICAgICAgICAgIHMgPSAiIjsKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLHMsVlZCVUZMKTsKKyAgICAgICAgcyA9IHZ2YnVmOworI2lmZGVmIFVOSVhPUk9TSworICAgICAgICB4ID0gc3RybGVuKHMpOworICAgICAgICBpZiAoeCA8IFZWQlVGTCAtIDEpIHsKKyAgICAgICAgICAgIGlmIChzW3gtMV0gIT0gJy8nKSB7CisgICAgICAgICAgICAgICAgc1t4XSA9ICcvJzsKKyAgICAgICAgICAgICAgICBzW3grMV0gPSBOVUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyAgICAgICAgcmV0dXJuKHMpOworCisgICAgICBjYXNlIFZOX0ZJTEU6ICAgICAgICAgICAgICAgICAgICAgLyogZmlsZXNwZWMgKi8KKyAgICAgICAgcmV0dXJuKGZzcGVjKTsKKworICAgICAgY2FzZSBWTl9IT1NUOiAgICAgICAgICAgICAgICAgICAgIC8qIGhvc3QgbmFtZSAqLworICAgICAgICBpZiAoKm15aG9zdCkgeyAgICAgICAgICAgICAgICAgIC8qIElmIGtub3duICovCisgICAgICAgICAgICByZXR1cm4obXlob3N0KTsgICAgICAgICAgICAgLyogcmV0dXJuIGl0LiAqLworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSAqLworICAgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJ1bmtub3duIixWVkJVRkwpOyAvKiBqdXN0IHNheSAidW5rbm93biIgKi8KKyAgICAgICAgICAgIHJldHVybih2dmJ1Zik7CisgICAgICAgIH0KKworICAgICAgY2FzZSBWTl9TWVNUOiAgICAgICAgICAgICAgICAgICAgIC8qIFN5c3RlbSB0eXBlICovCisjaWZkZWYgVU5JWAorICAgICAgICBja3N0cm5jcHkodnZidWYsIlVOSVgiLFZWQlVGTCk7CisjZWxzZQorI2lmZGVmIFZNUworICAgICAgICBja3N0cm5jcHkodnZidWYsIlZNUyIsVlZCVUZMKTsKKyNlbHNlCisjaWZkZWYgT1NLCisgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwiT1M5LzY4SyIsVlZCVUZMKTsKKyNlbHNlCisjaWZkZWYgQU1JR0EKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJBbWlnYSIsVlZCVUZMKTsKKyNlbHNlCisjaWZkZWYgTUFDCisgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwiTWFjaW50b3NoIixWVkJVRkwpOworI2Vsc2UKKyNpZmRlZiBPUzIKKyNpZmRlZiBOVAorICAgICAgICBja3N0cm5jcHkodnZidWYsIldJTjMyIixWVkJVRkwpIDsKKyNlbHNlIC8qIE5UICovCisgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwiT1MvMiIsVlZCVUZMKTsKKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgICAgICBja3N0cm5jcHkodnZidWYsIkFPUy9WUyIsVlZCVUZMKTsKKyNlbHNlCisjaWZkZWYgR0VNRE9TCisgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwiQXRhcmlfU1QiLFZWQlVGTCk7CisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJTdHJhdHVzX1ZPUyIsVlZCVUZMKTsKKyNlbHNlCisgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwidW5rbm93biIsVlZCVUZMKTsKKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogR0VNRE9TICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9TWVNWOiAgICAgICAgICAgICAgICAgICAgIC8qIFN5c3RlbSBoZXJhbGQgKi8KKyNpZmRlZiBJS1NECisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgICAgaWYgKGluc2VydmVyICYmIGlzZ3Vlc3QpCisgICAgICAgICAgcmV0dXJuKCIiKTsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgZm9yICh4ID0geSA9IDA7IHggPCBWVkJVRkw7IHgrKykgeworICAgICAgICAgICAgaWYgKGNreHN5c1t4XSA9PSBTUCAmJiB5ID09IDApIGNvbnRpbnVlOworICAgICAgICAgICAgdnZidWZbeSsrXSA9IChjaGFyKSAoKGNreHN5c1t4XSA9PSBTUCkgPyAnXycgOiBja3hzeXNbeF0pOworICAgICAgICB9CisgICAgICAgIHZ2YnVmW3ldID0gTlVMOworICAgICAgICByZXR1cm4odnZidWYpOworICAgIH0gLyogQnJlYWsgdXAgbG9uZyBzd2l0Y2ggc3RhdGVtZW50cy4uLiAqLworCisgICAgc3dpdGNoKHkpIHsKKyAgICAgIGNhc2UgVk5fVElNRTogICAgICAgICAgICAgICAgICAgICAvKiBUSU1FLiBBc3N1bWVzIHRoYXQgenRpbWUgcmV0dXJucyAqLworICAgICAgICB6dGltZSgmcCk7ICAgICAgICAgICAgICAgICAgICAgIC8qICJUaHUgRmViICA4IDEyOjAwOjAwIDE5OTAiICovCisgICAgICAgIGlmIChwID09IE5VTEwgfHwgKnAgPT0gTlVMKSAgICAgLyogbGlrZSBhc2N0aW1lKCkhICovCisgICAgICAgICAgcmV0dXJuKCIiKTsKKyAgICAgICAgZm9yICh4ID0gMTE7IHggPCAxOTsgeCsrKSAgICAgICAvKiBjb3B5IGhoOm1tOnNzICovCisgICAgICAgICAgdnZidWZbeCAtIDExXSA9IHBbeF07ICAgICAgICAgLyogdG8gdnZidWYgKi8KKyAgICAgICAgdnZidWZbOF0gPSBOVUw7ICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hdGUgKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsgICAgICAgICAgICAgICAgICAvKiBhbmQgcmV0dXJuIGl0ICovCisKKyAgICAgIGNhc2UgVk5fTlRJTTogICAgICAgICAgICAgICAgICAgICAvKiBOdW1lcmljIHRpbWUgKi8KKyAgICAgICAgenRpbWUoJnApOyAgICAgICAgICAgICAgICAgICAgICAvKiAiVGh1IEZlYiAgOCAxMjowMDowMCAxOTkwIiAqLworICAgICAgICBpZiAocCA9PSBOVUxMIHx8ICpwID09IE5VTCkgICAgIC8qIGxpa2UgYXNjdGltZSgpISAqLworICAgICAgICAgIHJldHVybihOVUxMKTsKKyAgICAgICAgeiA9IGF0b2wocCsxMSkgKiAzNjAwTCArIGF0b2wocCsxNCkgKiA2MEwgKyBhdG9sKHArMTcpOworICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlbGQiLHopOyAgICAgICAgIC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKworI2lmZGVmIENLX1RUWUZECisgICAgICBjYXNlIFZOX1RUWUY6ICAgICAgICAgICAgICAgICAgICAgLyogVFRZIGZpbGUgZGVzY3JpcHRvciAqLworICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIsICAgICAgICAgICAgIC8qIFNBRkUgKi8KKyNpZmRlZiBWTVMKKyAgICAgICAgICAgICAgICB2bXN0dHlmZCgpCisjZWxzZQorICAgICAgICAgICAgICAgIHR0eWZkCisjZW5kaWYgLyogVk1TICovCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKyNlbmRpZiAvKiBDS19UVFlGRCAqLworCisgICAgICBjYXNlIFZOX1ZFUlM6ICAgICAgICAgICAgICAgICAgICAgLyogTnVtZXJpYyBLZXJtaXQgdmVyc2lvbiBudW1iZXIgKi8KKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwiJWxkIix2ZXJudW0pOyAgICAvKiBTQUZFICovCisgICAgICAgIHJldHVybih2dmJ1Zik7CisKKyAgICAgIGNhc2UgVk5fWFZOVU06ICAgICAgICAgICAgICAgICAgICAvKiBQcm9kdWN0LXNwZWNpZmljIHZlcnNpb24gbnVtYmVyICovCisgICAgICAgIHNwcmludGYodnZidWYsIiVsZCIseHZlcm51bSk7ICAgLyogU0FGRSAqLworICAgICAgICByZXR1cm4odnZidWYpOworCisgICAgICBjYXNlIFZOX0hPTUU6ICAgICAgICAgICAgICAgICAgICAgLyogSG9tZSBkaXJlY3RvcnkgKi8KKyAgICAgICAgcmV0dXJuKGhvbWVwYXRoKCkpOworCisgICAgICBjYXNlIFZOX0lCVUY6ICAgICAgICAgICAgICAgICAgICAgLyogSU5QVVQgYnVmZmVyICovCisgICAgICAgIHJldHVybigoY2hhciAqKWlucGJ1Zik7CisKKyAgICAgIGNhc2UgVk5fSUNIUjogICAgICAgICAgICAgICAgICAgICAvKiBJTlBVVCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgaW5jaGFyWzFdID0gTlVMOworICAgICAgICByZXR1cm4oKGNoYXIgKilpbmNoYXIpOworCisgICAgICBjYXNlIFZOX0lDTlQ6ICAgICAgICAgICAgICAgICAgICAgLyogSU5QVVQgY2hhcmFjdGVyIGNvdW50ICovCisgICAgICAgIHNwcmludGYodnZidWYsIiVkIixpbmNvdW50KTsgICAgLyogU0FGRSAqLworICAgICAgICByZXR1cm4odnZidWYpOworCisgICAgICBjYXNlIFZOX1NQRUU6IHsgICAgICAgICAgICAgICAgICAgLyogVHJhbnNtaXNzaW9uIFNQRUVEICovCisgICAgICAgICAgbG9uZyB0OworICAgICAgICAgIHQgPSB0dGdzcGQoKTsKKyAgICAgICAgICBpZiAodCA8IDBMKQorICAgICAgICAgICAgc3ByaW50Zih2dmJ1ZiwidW5rbm93biIpOyAgIC8qIFNBRkUgKi8KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlbGQiLHQpOyAgICAgLyogU0FGRSAqLworICAgICAgICAgIHJldHVybih2dmJ1Zik7CisgICAgICB9CisKKyAgICAgIGNhc2UgVk5fU1VDQzogICAgICAgICAgICAgICAgICAgICAvKiBTVUNDRVNTIGZsYWcgKi8KKyAgICAgICAgLyogTm90ZSBpbnZlcnRlZCBzZW5zZSAqLworICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIsKHN1Y2Nlc3MgPT0gMCkgPyAxIDogMCk7IC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9MSU5FOiB7ICAgICAgICAgICAgICAgICAgIC8qIExJTkUgKi8KKyNpZmRlZiBERUJVRworICAgICAgICAgIGlmIChkZWJsb2cpIHsKKyAgICAgICAgICAgICAgZGVidWcoRjExMSwiXFx2KGxpbmUpIGxvY2FsIix0dG5hbWUsbG9jYWwpOworICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJcXHYobGluZSkgaW5zZXJ2ZXIiLCIiLGluc2VydmVyKTsKKyNpZmRlZiBUTkNPREUKKyAgICAgICAgICAgICAgZGVidWcoRjExMSwiXFx2KGxpbmUpIHRjcF9pbmNvbWluZyIsIiIsdGNwX2luY29taW5nKTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyNpZmRlZiBDS19UQVBJCisgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIlxcdihsaW5lKSB0dHRhcGkiLCIiLHR0dGFwaSk7CisjZW5kaWYgLyogQ0tfVEFQSSAqLworICAgICAgICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgQ0tfVEFQSQorICAgICAgICAgIGlmICh0dHRhcGkpIHsgICAgICAgICAgICAgICAgIC8qIElmIEkgaGF2ZSBtYWRlIGEgVEFQSSBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHRoZSBUQVBJIGRldmljZSBuYW1lICovCisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudGFwaWxpbmU7IGkrKykgeworICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAodHRuYW1lLHRhcGlsaW5ldGFiW2ldLmt3ZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBwID0gX3RhcGlsaW5ldGFiW2ldLmt3ZDsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ocCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfVEFQSSAqLworI2lmbmRlZiBOT1hGRVIKKyAgICAgICAgICBpZiAoaW5zZXJ2ZXIgICAgICAgICAgICAgICAgICAvKiBJZiBJIGFtIGEgVENQIHNlcnZlciAqLworI2lmZGVmIFROQ09ERQorICAgICAgICAgICAgICB8fCB0Y3BfaW5jb21pbmcKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICAgICAgICAgICAgKQorI2lmZGVmIFRDUFNPQ0tFVAorICAgICAgICAgICAgcCA9IGNrZ2V0cGVlcigpOyAgICAgICAgICAgIC8qIHJldHVybiBwZWVyIG5hbWUgKi8KKyAgICAgICAgICBlbHNlCisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogTk9YRkVSICovCisgICAgICAgICAgaWYgKGxvY2FsKSAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIGlmIGluIGxvY2FsIG1vZGUgKi8KKyAgICAgICAgICAgIHAgPSAoY2hhciAqKSB0dG5hbWU7ICAgICAgICAvKiByZXR1cm4gU0VUIExJTkUgLyBTRVQgSE9TVCBuYW1lICovCisgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlICovCisgICAgICAgICAgICBwID0gIiI7ICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGVtcHR5IHN0cmluZyAqLworICAgICAgICAgIGlmICghcCkgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgY2tnZXRwZWVyKCkgcmV0dXJucyAqLworICAgICAgICAgICAgcCA9ICIiOyAgICAgICAgICAgICAgICAgICAgIC8qIG51bGwgcG9pbnRlci4uLiAqLworICAgICAgICAgIGRlYnVnKEYxMTAsIlxcdihsaW5lKSBwIixwLDApOworICAgICAgICAgIGlmICghKnApCisgICAgICAgICAgICBwID0gKGNoYXIgKikgdHRuYW1lOworICAgICAgICAgIHJldHVybihwKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fUFJPRzogICAgICAgICAgICAgICAgICAgICAvKiBQcm9ncmFtIG5hbWUgKi8KKyAgICAgICAgcmV0dXJuKCJDLUtlcm1pdCIpOworCisgICAgfSAvKiBCcmVhayB1cCBsb25nIHN3aXRjaCBzdGF0ZW1lbnRzLi4uICovCisKKyAgICBzd2l0Y2goeSkgeworICAgICAgY2FzZSBWTl9SRVQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlIG9mIG1vc3QgcmVjZW50IFJFVFVSTiAqLworICAgICAgICBkZWJ1ZyhGMTExLCJcXHYocmV0dXJuKSIsbXJ2YWxbbWFjbHZsKzFdLG1hY2x2bCsxKTsKKyAgICAgICAgcCA9IG1ydmFsW21hY2x2bCsxXTsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkgcCA9ICIiOworICAgICAgICByZXR1cm4ocCk7CisKKyAgICAgIGNhc2UgVk5fRkZDOiAgICAgICAgICAgICAgICAgICAgICAvKiBTaXplIG9mIG1vc3QgcmVjZW50IGZpbGUgKi8KKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwgIiVsZCIsIGZmYyk7ICAgICAvKiBTQUZFICovCisgICAgICAgIHJldHVybih2dmJ1Zik7CisKKyAgICAgIGNhc2UgVk5fVEZDOiAgICAgICAgICAgICAgICAgICAgICAvKiBTaXplIG9mIG1vc3QgcmVjZW50IGZpbGUgZ3JvdXAgKi8KKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwgIiVsZCIsIHRmYyk7ICAgICAvKiBTQUZFICovCisgICAgICAgIHJldHVybih2dmJ1Zik7CisKKyAgICAgIGNhc2UgVk5fQ1BVOiAgICAgICAgICAgICAgICAgICAgICAvKiBDUFUgdHlwZSAqLworI2lmZGVmIElLU0QKKyNpZmRlZiBDS19MT0dJTgorICAgICAgICBpZiAoaW5zZXJ2ZXIgJiYgaXNndWVzdCkKKyAgICAgICAgICByZXR1cm4oIiIpOworI2VuZGlmIC8qIENLX0xPR0lOICovCisjZW5kaWYgLyogSUtTRCAqLworI2lmZGVmIE9TMgorICAgICAgICAgeworICAgICAgICAgICAgY2hhciAqIGdldGNwdSh2b2lkKSA7CisgICAgICAgICAgICByZXR1cm4gZ2V0Y3B1KCk7CisgICAgICAgICB9CisjZWxzZSAvKiBPUzIgKi8KKyNpZmRlZiBDS0NQVQorICAgICAgICByZXR1cm4oQ0tDUFUpOyAgICAgICAgICAgICAgICAgIC8qIFRyYWRpdGlvbmFsbHksIGNvbXBpbGUtdGltZSB2YWx1ZSAqLworI2Vsc2UKKyNpZmRlZiBDS19VVFNOQU1FCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnV0IGlmIG5vbmUsIHRyeSBydW50aW1lIHZhbHVlICovCisgICAgICAgICAgICBleHRlcm4gY2hhciB1bm1fbWNoW107CisgICAgICAgICAgICByZXR1cm4oKGNoYXIgKil1bm1fbWNoKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgcmV0dXJuKCJ1bmtub3duIik7CisjZW5kaWYgLyogQ0tfVVRTTkFNRSAqLworI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogT1MyICovCisKKyAgICAgIGNhc2UgVk5fQ01ETDogICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kIGxldmVsICovCisgICAgICAgIHNwcmludGYodnZidWYsICIlZCIsIGNtZGx2bCk7ICAgLyogU0FGRSAqLworICAgICAgICByZXR1cm4odnZidWYpOworCisgICAgICBjYXNlIFZOX0RBWTogICAgICAgICAgICAgICAgICAgICAgLyogRGF5IG9mIHdlZWsgKi8KKyAgICAgICAgenRpbWUoJnApOworICAgICAgICBpZiAocCAhPSBOVUxMICYmICpwICE9IE5VTCkgICAgIC8qIHp0aW1lKCkgc3VjY2VlZGVkLiAqLworICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZixwLDQpOworICAgICAgICBlbHNlCisgICAgICAgICAgdnZidWZbMF0gPSBOVUw7ICAgICAgICAgICAgICAgLyogenRpbWUoKSBmYWlsZWQuICovCisgICAgICAgIHJldHVybih2dmJ1Zik7ICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIHdoYXQgd2UgZ290LiAqLworCisgICAgICBjYXNlIFZOX05EQVk6IHsgICAgICAgICAgICAgICAgICAgLyogTnVtZXJpYyBkYXkgb2Ygd2VlayAqLworICAgICAgICAgIGxvbmcgazsKKyAgICAgICAgICB6ID0gbWpkKHp6bmRhdGUoKSk7ICAgICAgICAgICAvKiBHZXQgbW9kaWZpZWQgSnVsaWFuIGRhdGUgKi8KKyAgICAgICAgICBrID0gKCgoaW50KSh6ICUgN0wpKSArIDMpICUgNzsgLyogR2V0IGRheSBudW1iZXIgKi8KKyAgICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlbGQiLGspOyAgICAgICAvKiBTQUZFICovCisgICAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKyAgICAgIH0KKworICAgICAgY2FzZSBWTl9MQ0w6ICAgICAgICAgICAgICAgICAgICAgIC8qIExvY2FsICh2cyByZW1vdGUpIG1vZGUgKi8KKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCBsb2NhbCA/ICIxIiA6ICIwIixWVkJVRkwpOworICAgICAgICByZXR1cm4odnZidWYpOworCisgICAgICBjYXNlIFZOX0NNRFM6ICAgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBzb3VyY2UgKi8KKyAgICAgICAgaWYgKGNtZHN0a1tjbWRsdmxdLnNyYyA9PSBDTURfS0IpCisgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJwcm9tcHQiLFZWQlVGTCk7CisgICAgICAgIGVsc2UgaWYgKGNtZHN0a1tjbWRsdmxdLnNyYyA9PSBDTURfTUQpCisgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJtYWNybyIsVlZCVUZMKTsKKyAgICAgICAgZWxzZSBpZiAoY21kc3RrW2NtZGx2bF0uc3JjID09IENNRF9URikKKyAgICAgICAgICBja3N0cm5jcHkodnZidWYsImZpbGUiLFZWQlVGTCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBja3N0cm5jcHkodnZidWYsInVua25vd24iLFZWQlVGTCk7CisgICAgICAgIHJldHVybih2dmJ1Zik7CisKKyAgICAgIGNhc2UgVk5fQ01ERjogICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbW1hbmQgZmlsZSBuYW1lICovCisjaWZkZWYgQ09NTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKHNlZSBjb21tZW50cyBhYm92ZSkgKi8KKyAgICAgICAgaWYgKHRmbmFtW3RsZXZlbF0pIHsgICAgICAgICAgICAvKiAobmVhciBkYmxicyBkZWNsYXJhdGlvbikgKi8KKyAgICAgICAgICAgIGRibGJzKHRmbmFtW3RsZXZlbF0sdnZidWYsVlZCVUZMKTsKKyAgICAgICAgICAgIHJldHVybih2dmJ1Zik7CisgICAgICAgIH0gZWxzZSByZXR1cm4oIiIpOworI2Vsc2UKKyAgICAgICAgaWYgKHRsZXZlbCA8IDApCisgICAgICAgICAgcmV0dXJuKCIiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybih0Zm5hbVt0bGV2ZWxdID8gdGZuYW1bdGxldmVsXSA6ICIiKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAgIGNhc2UgVk5fTUFDOiAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IG1hY3JvIG5hbWUgKi8KKyAgICAgICAgcmV0dXJuKChtYWNsdmwgPiAtMSkgPyBtX2FyZ1ttYWNsdmxdWzBdIDogIiIpOworCisgICAgICBjYXNlIFZOX0VYSVQ6CisgICAgICAgIHNwcmludGYodnZidWYsIiVkIix4aXRzdGEpOyAgICAgLyogU0FGRSAqLworICAgICAgICByZXR1cm4odnZidWYpOworCisgICAgfSAvKiBCcmVhayB1cCBsb25nIHN3aXRjaCBzdGF0ZW1lbnRzLi4uICovCisKKyAgICBzd2l0Y2goeSkgeworICAgICAgY2FzZSBWTl9QUlRZOiB7ICAgICAgICAgICAgICAgICAgIC8qIFBhcml0eSAqLworICAgICAgICAgIGNoYXIgKnNzOworICAgICAgICAgIHN3aXRjaCAocGFyaXR5KSB7CisgICAgICAgICAgICBjYXNlIDA6ICAgc3MgPSAibm9uZSI7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2UnOiBzcyA9ICJldmVuIjsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbSc6IHNzID0gIm1hcmsiOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdvJzogc3MgPSAib2RkIjsgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOiBzcyA9ICJzcGFjZSI7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogIHNzID0gInVua25vd24iOyBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLHNzLFZWQlVGTCk7CisgICAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKyAgICAgIH0KKworICAgICAgY2FzZSBWTl9ESUFMOgorICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIsICAgICAgICAgICAgIC8qIFNBRkUgKi8KKyNpZm5kZWYgTk9ESUFMCisgICAgICAgICAgICAgICAgZGlhbHN0YQorI2Vsc2UKKyAgICAgICAgICAgICAgICAtMQorI2VuZGlmIC8qIE5PRElBTCAqLworICAgICAgICAgICAgICAgICk7CisgICAgICAgIHJldHVybih2dmJ1Zik7CisKKyNpZmRlZiBPUzIKKyAgICAgIGNhc2UgVk5fS0VZQjoKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLGNvbmtiZygpLFZWQlVGTCk7CisgICAgICAgIHJldHVybih2dmJ1Zik7CisgICAgICBjYXNlIFZOX1NFTENUOiB7CisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgICBjb25zdCBjaGFyICogc2VsZWN0aW9uID0gR2V0U2VsZWN0aW9uKCk7CisgICAgICAgICAgcmV0dXJuKCAoY2hhciAqKSAoc2VsZWN0aW9uID8gc2VsZWN0aW9uIDogIiIgKSkgOworI2Vsc2UKKyAgICAgICAgICByZXR1cm4oIiIpOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgVk5fQ1BTOgorICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlbGQiLHRmY3BzKTsgICAgIC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworICAgICAgY2FzZSBWTl9NT0RFOiAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgdHJhbnNmZXIgbW9kZSAqLworICAgICAgICBzd2l0Y2ggKGJpbmFyeSkgeworICAgICAgICAgIGNhc2UgWFlGVF9UOiBja3N0cm5jcHkodnZidWYsInRleHQiLFZWQlVGTCk7IGJyZWFrOworICAgICAgICAgIGNhc2UgWFlGVF9COgorICAgICAgICAgIGNhc2UgWFlGVF9VOiBja3N0cm5jcHkodnZidWYsImJpbmFyeSIsVlZCVUZMKTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBYWUZUX0k6IGNrc3RybmNweSh2dmJ1ZiwiaW1hZ2UiLFZWQlVGTCk7IGJyZWFrOworICAgICAgICAgIGNhc2UgWFlGVF9MOiBja3N0cm5jcHkodnZidWYsImxhYmVsZWQiLFZWQlVGTCk7IGJyZWFrOworICAgICAgICAgIGNhc2UgWFlGVF9NOiBja3N0cm5jcHkodnZidWYsIm1hY2JpbmFyeSIsVlZCVUZMKTsgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogICAgIGNrc3RybmNweSh2dmJ1ZiwidW5rbm93biIsVlZCVUZMKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4odnZidWYpOworCisjaWZkZWYgQ0tfUkVYWAorICAgICAgY2FzZSBWTl9SRVhYOgorICAgICAgICByZXR1cm4ocmV4eGJ1Zik7CisjZW5kaWYgLyogQ0tfUkVYWCAqLworCisgICAgICBjYXNlIFZOX05FV0w6ICAgICAgICAgICAgICAgICAgICAgLyogU3lzdGVtIG5ld2xpbmUgY2hhciBvciBzZXF1ZW5jZSAqLworI2lmZGVmIFVOSVgKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJcbiIsVlZCVUZMKTsKKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJcbiIsVlZCVUZMKTsKKyNlbHNlCisjaWZkZWYgT1NLCisgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwiXDE1IixWVkJVRkwpOyAgLyogUmVtZW1iZXIsIHRoZXNlIGFyZSBvY3RhbC4uLiAqLworI2Vsc2UKKyNpZmRlZiBNQUMKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJcMTUiLFZWQlVGTCk7CisjZWxzZQorI2lmZGVmIE9TMgorICAgICAgICBja3N0cm5jcHkodnZidWYsIlwxNVwxMiIsVlZCVUZMKTsKKyNlbHNlCisjaWZkZWYgU1RSQVRVUworICAgICAgICBja3N0cm5jcHkodnZidWYsIlxuIixWVkJVRkwpOworI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJcMTVcMTIiLFZWQlVGTCk7CisjZWxzZQorI2lmZGVmIEFNSUdBCisgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwiXG4iLFZWQlVGTCk7CisjZWxzZQorI2lmZGVmIEdFTURPUworICAgICAgICBja3N0cm5jcHkodnZidWYsIlxuIixWVkJVRkwpOworI2Vsc2UKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJcbiIsVlZCVUZMKTsKKyNlbmRpZiAvKiBHRU1ET1MgKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFVOSVggKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9ST1dTOiAgICAgICAgICAgICAgICAgICAgIC8qIFJPV1MgKi8KKyAgICAgIGNhc2UgVk5fQ09MUzogICAgICAgICAgICAgICAgICAgICAvKiBDT0xTICovCisgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwoY3ggPT0gVk5fUk9XUykgPyAiMjQiIDogIjgwIixWVkJVRkwpOyAvKiBEZWZhdWx0ICovCisjaWZkZWYgQ0tfVFRHV1NJWgorI2lmZGVmIE9TMgorICAgICAgICBpZiAodHRfY29sc1tWVEVSTV0gPCAwIHx8IHR0X3Jvd3NbVlRFUk1dIDwgMCkKKyAgICAgICAgICB0dGd3c2l6KCk7CisgICAgICAgIHNwcmludGYodnZidWYsIiVkIiwgICAgICAgICAgICAgLyogU0FGRSAqLworICAgICAgICAgICAgICAgIChjeCA9PSBWTl9ST1dTKSA/IHR0X3Jvd3NbVlRFUk1dIDogdHRfY29sc1tWVEVSTV0pOworI2Vsc2UgLyogT1MyICovCisgICAgICAgIGlmICh0dGd3c2l6KCkgPiAwKSAgICAgICAgICAgICAgLyogR2V0IHdpbmRvdyBzaXplICovCisgICAgICAgICAgaWYgKHR0X2NvbHMgPiAwICYmIHR0X3Jvd3MgPiAwKSAvKiBzZXRzIHR0X3Jvd3MsIHR0X2NvbHMgKi8KKyAgICAgICAgICAgIHNwcmludGYodnZidWYsIiVkIiwgICAgICAgICAvKiBTQUZFICovCisgICAgICAgICAgICAgICAgICAgIChjeCA9PSBWTl9ST1dTKSA/IHR0X3Jvd3MgOiB0dF9jb2xzKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisgICAgICAgIHJldHVybih2dmJ1Zik7CisKKyAgICAgIGNhc2UgVk5fVFRZUDoKKyNpZmRlZiBOT1RFUk0KKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJ1bmtub3duIixWVkJVRkwpOworI2Vsc2UKKyNpZmRlZiBPUzIKKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwgIiVzIiwgICAgICAgICAgICAvKiBTQUZFICovCisgICAgICAgICAgICAgICAgKHR0X3R5cGUgPj0gMCAmJiB0dF90eXBlIDw9IG1heF90dCkgPworICAgICAgICAgICAgICAgIHR0X2luZm9bdHRfdHlwZV0ueF9uYW1lIDoKKyAgICAgICAgICAgICAgICAidW5rbm93biIKKyAgICAgICAgICAgICAgICApOworI2Vsc2UKKyNpZmRlZiBNQUMKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJ2dDMyMCIsVlZCVUZMKTsKKyNlbHNlCisgICAgICAgIHAgPSBnZXRlbnYoIlRFUk0iKTsKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLHAgPyBwIDogInVua25vd24iLFZWQlVGTCsxKTsKKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT1RFUk0gKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9NSU5QOiAgICAgICAgICAgICAgICAgICAgIC8qIE1JTlBVVCAqLworICAgICAgICBzcHJpbnRmKHZ2YnVmLCAiJWQiLCBtX2ZvdW5kKTsgIC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKyAgICB9IC8qIEJyZWFrIHVwIGxvbmcgc3dpdGNoIHN0YXRlbWVudHMuLi4gKi8KKworICAgIHN3aXRjaCh5KSB7CisgICAgICBjYXNlIFZOX0NPTk46ICAgICAgICAgICAgICAgICAgICAgLyogQ09OTkVDVElPTiAqLworICAgICAgICBpZiAoIWxvY2FsKSB7CisgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJyZW1vdGUiLFZWQlVGTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW5ldHdvcmspCisgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1Ziwic2VyaWFsIixWVkJVRkwpOworI2lmZGVmIFRDUFNPQ0tFVAorICAgICAgICAgICAgZWxzZSBpZiAobmV0dHlwZSA9PSBORVRfVENQQiB8fCBuZXR0eXBlID09IE5FVF9UQ1BBKSB7CisgICAgICAgICAgICAgICAgaWYgKHR0bnByb3RvID09IE5QX1RFTE5FVCkKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwidGNwL2lwX3RlbG5ldCIsVlZCVUZMKTsKKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0dG5wcm90byA9PSBOUF9TU0wpCisgICAgICAgICAgICAgICAgICBja3N0cm5jcHkodnZidWYsInRjcC9pcF9zc2wiLFZWQlVGTCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHRucHJvdG8gPT0gTlBfVExTKQorICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJ0Y3AvaXBfdGxzIixWVkJVRkwpOworI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwidGNwL2lwIixWVkJVRkwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2lmZGVmIFNTSEJVSUxUSU4KKyAgICAgICAgICAgIGVsc2UgaWYgKG5ldHR5cGUgPT0gTkVUX1NTSCkKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwidGNwL2lwX3NzaCIsVlZCVUZMKTsKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisjaWZkZWYgQU5ZWDI1CisgICAgICAgICAgICBlbHNlIGlmIChuZXR0eXBlID09IE5FVF9TWDI1IHx8CisgICAgICAgICAgICAgICAgICAgICBuZXR0eXBlID09IE5FVF9WWDI1IHx8CisgICAgICAgICAgICAgICAgICAgICBuZXR0eXBlID09IE5FVF9JWDI1CisgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwieC4yNSIsVlZCVUZMKTsKKyNlbmRpZiAvKiBBTllYMjUgKi8KKyNpZmRlZiBERUNORVQKKyAgICAgICAgICAgIGVsc2UgaWYgKG5ldHR5cGUgPT0gTkVUX0RFQykgeworICAgICAgICAgICAgICAgIGlmICh0dG5wcm90byA9PSBOUF9MQVQpCisgICAgICAgICAgICAgICAgICBja3N0cm5jcHkodnZidWYsImRlY25ldF9sYXQiLFZWQlVGTCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHR0bnByb3RvID09IE5QX0NURVJNICkKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwiZGVjbmV0X2N0ZXJtIixWVkJVRkwpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwiZGVjbmV0IixWVkJVRkwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIERFQ05FVCAqLworI2lmZGVmIFNVUEVSTEFUCisgICAgICAgICAgICBlbHNlIGlmIChuZXR0eXBlID09IE5FVF9TTEFUKQorICAgICAgICAgICAgICBja3N0cm5jcHkodnZidWYsInN1cGVybGF0IixWVkJVRkwpOworI2VuZGlmIC8qIFNVUEVSTEFUICovCisjaWZkZWYgTkVURklMRQorICAgICAgICAgICAgZWxzZSBpZiAobmV0dHlwZSA9PSBORVRfRklMRSkKKyAgICAgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJsb2NhbF9maWxlIixWVkJVRkwpOworI2VuZGlmIC8qIE5FVEZJTEUgKi8KKyNpZmRlZiBORVRDTUQKKyAgICAgICAgICAgIGVsc2UgaWYgKG5ldHR5cGUgPT0gTkVUX0NNRCkKKyAgICAgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJwaXBlIixWVkJVRkwpOworI2VuZGlmIC8qIE5FVENNRCAqLworI2lmZGVmIE5FVFBUWQorICAgICAgICAgICAgZWxzZSBpZiAobmV0dHlwZSA9PSBORVRfUFRZKQorICAgICAgICAgICAgICBja3N0cm5jcHkodnZidWYsInBzZXVkb3Rlcm1pbmFsIixWVkJVRkwpOworI2VuZGlmIC8qIE5FVFBUWSAqLworI2lmZGVmIE5FVERMTAorICAgICAgICAgICAgZWxzZSBpZiAobmV0dHlwZSA9PSBORVRfRExMKQorICAgICAgICAgICAgICBja3N0cm5jcHkodnZidWYsImR5bmFtaWNfbGlua19saWJyYXJ5IixWVkJVRkwpOworI2VuZGlmIC8qIE5FVERMTCAqLworCisjaWZkZWYgTlBJUEUKKyAgICAgICAgICAgIGVsc2UgaWYgKG5ldHR5cGUgPT0gTkVUX1BJUEUpCisgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwibmFtZWRfcGlwZSIsVlZCVUZMKTsKKyNlbmRpZiAvKiBOUElQRSAqLworI2lmZGVmIENLX05FVEJJT1MKKyAgICAgICAgICAgIGVsc2UgaWYgKG5ldHR5cGUgPT0gTkVUX0JJT1MpCisgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwibmV0YmlvcyIsVlZCVUZMKTsKKyNlbmRpZiAvKiBDS19ORVRCSU9TICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwidW5rbm93biIsVlZCVUZMKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4odnZidWYpOworCisjaWZuZGVmIE5PWEZFUgorICAgICAgY2FzZSBWTl9TWVNJOiAgICAgICAgICAgICAgICAgICAgIC8qIFN5c3RlbSBJRCwgS2VybWl0IGNvZGUgKi8KKyAgICAgICAgcmV0dXJuKChjaGFyICopY2tzeXNpZCk7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBPUzIKKyAgICAgIGNhc2UgVk5fU1BBOiB7CisgICAgICAgICAgdW5zaWduZWQgbG9uZyBzcGFjZSA9IHpkc2tzcGFjZSgwKTsKKyAgICAgICAgICBpZiAoc3BhY2UgPiAwICYmIHNwYWNlIDwgMTAyNCkKKyAgICAgICAgICAgIHNwcmludGYodnZidWYsIi0xIik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc3ByaW50Zih2dmJ1ZiwiJWx1IixzcGFjZSk7IC8qIFNBRkUgKi8KKyAgICAgICAgICByZXR1cm4odnZidWYpOworICAgICAgfQorI2VuZGlmIC8qIE9TMiAqLworCisjaWZuZGVmIE5PWEZFUgorICAgICAgY2FzZSBWTl9RVUU6IHsKKyAgICAgICAgICBleHRlcm4gY2hhciBxdWVyeWJ1ZltdOworICAgICAgICAgIHJldHVybihxdWVyeWJ1Zik7CisgICAgICB9CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9DU0VUUworICAgICAgY2FzZSBWTl9DU0VUOgorI2lmZGVmIE9TMgorICAgICAgICBzcHJpbnRmKHZ2YnVmLCJjcCVkIixvczJnZXRjcCgpKTsgLyogU0FGRSAqLworI2Vsc2UKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLGZjc2luZm9bZmNoYXJzZXRdLmtleXdvcmQsVlZCVUZMKzEpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICByZXR1cm4odnZidWYpOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmZGVmIE9TMgorICAgICAgY2FzZSBWTl9FWEVESVI6CisgICAgICAgIHJldHVybihleGVkaXIpOworICAgICAgY2FzZSBWTl9TVEFSOgorICAgICAgICByZXR1cm4oc3RhcnR1cGRpcik7CisjZWxzZQorICAgICAgY2FzZSBWTl9FWEVESVI6CisgICAgICAgIHJldHVybihleGVkaXIgPyBleGVkaXIgOiAiIik7CisjaWZkZWYgVk1TT1JVTklYCisgICAgICBjYXNlIFZOX1NUQVI6CisgICAgICAgIHJldHVybihzdGFydHVwZGlyKTsKKyNlbmRpZiAvKiBWTVNPUlVOSVggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworICAgICAgY2FzZSBWTl9JTkk6CisgICAgICAgIHJldHVybihpbmlkaXIpOworCisgICAgICBjYXNlIFZOX01ETToKKyAgICAgICAgcmV0dXJuKGdtZG10eXAoKSk7CisKKyAgICAgIGNhc2UgVk5fRVZBTDoKKyAgICAgICAgcmV0dXJuKGV2YWxidWYpOworCisjaWZuZGVmIE5PRElBTAorICAgICAgY2FzZSBWTl9EX0NDOiAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgQ09VTlRSWS1DT0RFICovCisgICAgICAgIHJldHVybihkaWFsbGNjID8gZGlhbGxjYyA6ICIiKTsKKworICAgICAgY2FzZSBWTl9EX0FDOiAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgQVJFQS1DT0RFICovCisgICAgICAgIHJldHVybihkaWFsbGFjID8gZGlhbGxhYyA6ICIiKTsKKworICAgICAgY2FzZSBWTl9EX0lQOiAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgSU5URVJOQVRJT05BTC1QUkVGSVggKi8KKyAgICAgICAgcmV0dXJuKGRpYWxpeHAgPyBkaWFsaXhwIDogIiIpOworCisgICAgICBjYXNlIFZOX0RfTFA6ICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBMRC1QUkVGSVggKi8KKyAgICAgICAgcmV0dXJuKGRpYWxsZHAgPyBkaWFsbGRwIDogIiIpOworCisgICAgICBjYXNlIFZOX0RfTENQOiAgICAgICAgICAgICAgICAgICAgLyogRElBTCBMT0NBTC1QUkVGSVggKi8KKyAgICAgICAgcmV0dXJuKGRpYWxsY3AgPyBkaWFsbGNwIDogIiIpOworCisgICAgICBjYXNlIFZOX0RfUFhYOiAgICAgICAgICAgICAgICAgICAgLyogRElBTCBQQlgtRVhDSEFOR0UgdGhhdCBtYXRjaGVkICovCisgICAgICAgIHJldHVybihtYXRjaHB4eCA/IG1hdGNocHh4IDogIiIpOworI2Vsc2UKKyAgICAgIGNhc2UgVk5fRF9DQzogICAgICAgICAgICAgICAgICAgICAvKiBESUFMIENPVU5UUlktQ09ERSAqLworICAgICAgY2FzZSBWTl9EX0FDOiAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgQVJFQS1DT0RFICovCisgICAgICBjYXNlIFZOX0RfSVA6ICAgICAgICAgICAgICAgICAgICAgLyogRElBTCBJTlRFUk5BVElPTkFMLVBSRUZJWCAqLworICAgICAgY2FzZSBWTl9EX0xQOiAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgTEQtUFJFRklYICovCisgICAgICBjYXNlIFZOX0RfTENQOiAgICAgICAgICAgICAgICAgICAgLyogRElBTCBMT0NBTC1QUkVGSVggKi8KKyAgICAgIGNhc2UgVk5fRF9QWFg6ICAgICAgICAgICAgICAgICAgICAvKiBESUFMIFBCWC1FWENIQU5HRSAqLworICAgICAgICByZXR1cm4oIiIpOworI2VuZGlmIC8qIE5PRElBTCAqLworICAgICAgY2FzZSBWTl9VSUQ6CisjaWZkZWYgVU5JWAorICAgICAgICB7CisgICAgICAgICAgICBleHRlcm4gY2hhciAqIHdob2FtaSgpOyAgICAgLyogRnJvbSBja3VmaW8uYy4uLiAqLworI2lmZGVmIElLU0QKKyAgICAgICAgICAgIGlmIChpbnNlcnZlcikKKyAgICAgICAgICAgICAgcmV0dXJuKChjaGFyICopdWlkYnVmKTsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgICAgICAgIGlmICh1aWRidWZbMF0pCisgICAgICAgICAgICAgICAgcmV0dXJuKChjaGFyICopdWlkYnVmKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybih3aG9hbWkoKSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHJldHVybigoY2hhciAqKXVpZGJ1Zik7CisjZW5kaWYgLyogVU5JWCAqLworICAgIH0gLyogQnJlYWsgdXAgbG9uZyBzd2l0Y2ggc3RhdGVtZW50cy4uLiAqLworCisgICAgc3dpdGNoKHkpIHsKKyAgICAgIGNhc2UgVk5fUFdEOgorI2lmZGVmIE9TMgorICAgICAgICBpZiAoYWN0aXZlY21kID09IFhYT1VUIHx8IGFjdGl2ZWNtZCA9PSBYWExOT1VUKSB7CisgICAgICAgICAgICBja3N0cm5jcHkodnZidWYscHdidWYsVlZCVUZMKTsKKyAgICAgICAgICAgIGNrX2VuY3J5cHQoKGNoYXIgKil2dmJ1Zik7CisgICAgICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgIHJldHVybigoY2hhciAqKXB3YnVmKTsKKworICAgICAgY2FzZSBWTl9QUk06CisgICAgICAgIHJldHVybigoY2hhciAqKXBybWJ1Zik7CisKKyAgICAgIGNhc2UgVk5fUFJPVE86CisjaWZkZWYgTk9YRkVSCisgICAgICAgIHJldHVybigibm9uZSIpOworI2Vsc2UKKyNpZmRlZiBDS19YWVoKKyAgICAgICAgcmV0dXJuKHB0YWJbcHJvdG9jb2xdLnBfbmFtZSk7CisjZWxzZQorICAgICAgICByZXR1cm4oImtlcm1pdCIpOworI2VuZGlmIC8qIENLX1hZWiAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PWEZFUgorI2lmZGVmIENLX1RNUERJUgorICAgICAgY2FzZSBWTl9ETERJUjoKKyAgICAgICAgcmV0dXJuKGRsZGlyID8gZGxkaXIgOiAiIik7CisjZW5kaWYgLyogQ0tfVE1QRElSICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9ESUFMCisgICAgICBjYXNlIFZOX01fSU5JOiAgICAgICAgICAgICAgICAgICAgLyogTW9kZW0gaW5pdCBzdHJpbmcgKi8KKyAgICAgICAgcmV0dXJuKGRpYWxpbmkgPyBkaWFsaW5pIDogKG0gPyBtLT53YWtlX3N0ciA6ICIiKSk7CisKKyAgICAgIGNhc2UgVk5fTV9EQ006ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBkaWFsIGNvbW1hbmQgKi8KKyAgICAgICAgcmV0dXJuKGRpYWxjbWQgPyBkaWFsY21kIDogKG0gPyBtLT5kaWFsX3N0ciA6ICIiKSk7CisKKyAgICAgIGNhc2UgVk5fTV9EQ086ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBkYXRhIGNvbXByZXNzaW9uIG9uICovCisgICAgICAgIHJldHVybihkaWFsZGNvbiA/IGRpYWxkY29uIDogKG0gPyBtLT5kY19vbl9zdHIgOiAiIikpOworCisgICAgICBjYXNlIFZOX01fRENYOiAgICAgICAgICAgICAgICAgICAgLyogTW9kZW0gZGF0YSBjb21wcmVzc2lvbiBvZmYgKi8KKyAgICAgICAgcmV0dXJuKGRpYWxkY29mZiA/IGRpYWxkY29mZiA6IChtID8gbS0+ZGNfb2ZmX3N0ciA6ICIiKSk7CisKKyAgICAgIGNhc2UgVk5fTV9FQ086ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBlcnJvciBjb3JyZWN0aW9uIG9uICovCisgICAgICAgIHJldHVybihkaWFsZWNvbiA/IGRpYWxlY29uIDogKG0gPyBtLT5lY19vbl9zdHIgOiAiIikpOworCisgICAgICBjYXNlIFZOX01fRUNYOiAgICAgICAgICAgICAgICAgICAgLyogTW9kZW0gZXJyb3IgY29ycmVjdGlvbiBvZmYgKi8KKyAgICAgICAgcmV0dXJuKGRpYWxlY29mZiA/IGRpYWxlY29mZiA6IChtID8gbS0+ZWNfb2ZmX3N0ciA6ICIiKSk7CisKKyAgICAgIGNhc2UgVk5fTV9BQU86ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBhdXRvYW5zd2VyIG9uICovCisgICAgICAgIHJldHVybihkaWFsYWFvbiA/IGRpYWxhYW9uIDogKG0gPyBtLT5hYV9vbl9zdHIgOiAiIikpOworCisgICAgICBjYXNlIFZOX01fQUFYOiAgICAgICAgICAgICAgICAgICAgLyogTW9kZW0gYXV0b2Fuc3dlciBvZmYgKi8KKyAgICAgICAgcmV0dXJuKGRpYWxhYW9mZiA/IGRpYWxhYW9mZiA6IChtID8gbS0+YWFfb2ZmX3N0ciA6ICIiKSk7CisKKyAgICAgIGNhc2UgVk5fTV9IVVA6ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBoYW5ndXAgY29tbWFuZCAqLworICAgICAgICByZXR1cm4oZGlhbGhjbWQgPyBkaWFsaGNtZCA6IChtID8gbS0+aHVwX3N0ciA6ICIiKSk7CisKKyAgICAgIGNhc2UgVk5fTV9IV0Y6ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBoYXJkd2FyZSBmbG93IGNvbW1hbmQgKi8KKyAgICAgICAgcmV0dXJuKGRpYWxod2ZjID8gZGlhbGh3ZmMgOiAobSA/IG0tPmh3ZmNfc3RyIDogIiIpKTsKKworICAgICAgY2FzZSBWTl9NX1NXRjogICAgICAgICAgICAgICAgICAgIC8qIE1vZGVtIHNvZnR3YXJlIGZsb3cgY29tbWFuZCAqLworICAgICAgICByZXR1cm4oZGlhbHN3ZmMgPyBkaWFsc3dmYyA6IChtID8gbS0+c3dmY19zdHIgOiAiIikpOworCisgICAgICBjYXNlIFZOX01fTkZDOiAgICAgICAgICAgICAgICAgICAgLyogTW9kZW0gbm8gZmxvdy1jb250cm9sIGNvbW1hbmQgKi8KKyAgICAgICAgcmV0dXJuKGRpYWxub2ZjID8gZGlhbG5vZmMgOiAobSA/IG0tPm5vZmNfc3RyIDogIiIpKTsKKworICAgICAgY2FzZSBWTl9NX1BETTogICAgICAgICAgICAgICAgICAgIC8qIE1vZGVtIHB1bHNlIGRpYWxpbmcgbW9kZSAqLworICAgICAgICByZXR1cm4oZGlhbHB1bHNlID8gZGlhbHB1bHNlIDogKG0gPyBtLT5wdWxzZSA6ICIiKSk7CisKKyAgICAgIGNhc2UgVk5fTV9URE06ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSB0b25lIGRpYWxpbmcgbW9kZSAqLworICAgICAgICByZXR1cm4oZGlhbHRvbmUgPyBkaWFsdG9uZSA6IChtID8gbS0+dG9uZSA6ICIiKSk7CisKKyAgICAgIGNhc2UgVk5fTV9OQU06ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBmdWxsIG5hbWUgKi8KKyAgICAgICAgcmV0dXJuKGRpYWxuYW1lID8gZGlhbG5hbWUgOiAobSA/IG0tPm5hbWUgOiAiIikpOworI2Vsc2UKKyAgICAgIGNhc2UgVk5fTV9JTkk6ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBpbml0IHN0cmluZyAqLworICAgICAgY2FzZSBWTl9NX0RDTTogICAgICAgICAgICAgICAgICAgIC8qIE1vZGVtIGRpYWwgY29tbWFuZCAqLworICAgICAgY2FzZSBWTl9NX0RDTzogICAgICAgICAgICAgICAgICAgIC8qIE1vZGVtIGRhdGEgY29tcHJlc3Npb24gb24gKi8KKyAgICAgIGNhc2UgVk5fTV9EQ1g6ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBkYXRhIGNvbXByZXNzaW9uIG9mZiAqLworICAgICAgY2FzZSBWTl9NX0VDTzogICAgICAgICAgICAgICAgICAgIC8qIE1vZGVtIGVycm9yIGNvcnJlY3Rpb24gb24gKi8KKyAgICAgIGNhc2UgVk5fTV9FQ1g6ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBlcnJvciBjb3JyZWN0aW9uIG9mZiAqLworICAgICAgY2FzZSBWTl9NX0FBTzogICAgICAgICAgICAgICAgICAgIC8qIE1vZGVtIGF1dG9hbnN3ZXIgb24gKi8KKyAgICAgIGNhc2UgVk5fTV9BQVg6ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBhdXRvYW5zd2VyIG9mZiAqLworICAgICAgY2FzZSBWTl9NX0hVUDogICAgICAgICAgICAgICAgICAgIC8qIE1vZGVtIGhhbmd1cCBjb21tYW5kICovCisgICAgICBjYXNlIFZOX01fSFdGOiAgICAgICAgICAgICAgICAgICAgLyogTW9kZW0gaGFyZHdhcmUgZmxvdyBjb21tYW5kICovCisgICAgICBjYXNlIFZOX01fU1dGOiAgICAgICAgICAgICAgICAgICAgLyogTW9kZW0gc29mdHdhcmUgZmxvdyBjb21tYW5kICovCisgICAgICBjYXNlIFZOX01fTkZDOiAgICAgICAgICAgICAgICAgICAgLyogTW9kZW0gbm8gZmxvdy1jb250cm9sIGNvbW1hbmQgKi8KKyAgICAgIGNhc2UgVk5fTV9QRE06ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBwdWxzZSBkaWFsaW5nIG1vZGUgKi8KKyAgICAgIGNhc2UgVk5fTV9URE06ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSB0b25lIGRpYWxpbmcgbW9kZSAqLworICAgICAgY2FzZSBWTl9NX05BTToKKyAgICAgICAgcmV0dXJuKCIiKTsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworICAgICAgY2FzZSBWTl9JU1RBVDogICAgICAgICAgICAgICAgICAgIC8qIElOUFVUIHN0YXR1cyAqLworICAgICAgICBzcHJpbnRmKHZ2YnVmLCAiJWQiLCBpbnN0YXR1cyk7IC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9URU1QOiAgICAgICAgICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBkaXJlY3RvcnkgKi8KKyAgICAgICAgaWYgKHRlbXBkaXIpIHsKKyAgICAgICAgICAgIHAgPSB0ZW1wZGlyOworICAgICAgICB9IGVsc2UgeworI2lmZGVmIE9TMgorI2lmZGVmIE5UCisgICAgICAgICAgICBwID0gZ2V0ZW52KCJLOTVUTVAiKTsKKyNlbHNlCisgICAgICAgICAgICBwID0gZ2V0ZW52KCJLMlRNUCIpOworI2VuZGlmIC8qIE5UICovCisgICAgICAgICAgICBpZiAoICFwICkKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgcCA9IGdldGVudigiQ0tfVE1QIik7CisgICAgICAgICAgICBpZiAoIXApIHAgPSBnZXRlbnYoIlRNUERJUiIpOworICAgICAgICAgICAgaWYgKCFwKSBwID0gZ2V0ZW52KCJURU1QIik7CisgICAgICAgICAgICBpZiAoIXApIHAgPSBnZXRlbnYoIlRNUCIpOworCisjaWZkZWYgT1MyT1JVTklYCisgICAgICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4ocCk7CisgICAgICAgICAgICAgICAgaWYgKHBbbGVuLTFdICE9ICcvJworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAmJiBwW2xlbi0xXSAhPSAnXFwnCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNoYXIgZm9vW0NLTUFYUEFUSF07CisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShmb28scCxDS01BWFBBVEgpOworICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQoZm9vLCIvIixDS01BWFBBVEgpOworICAgICAgICAgICAgICAgICAgICBwID0gZm9vOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorI2Vsc2UgLyogT1MyT1JVTklYICovCisgICAgICAgICAgICBpZiAoIXApCisjZW5kaWYgLyogT1MyT1JVTklYICovCisjaWZkZWYgVU5JWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3lzdGVtcyB0aGF0IGhhdmUgYSBzdGFuZGFyZCAqLworICAgICAgICAgICAgICBwID0gIi90bXAvIjsgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSBkaXJlY3RvcnkuLi4gKi8KKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgICAgICAgcCA9ICI6VE1QOiI7CisjZWxzZQorICAgICAgICAgICAgICBwID0gIiI7CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBVTklYICovCisgICAgICAgIH0KKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLHAsVlZCVUZMKTsKKyAgICAgICAgcCA9IHZ2YnVmOworCisvKiBUaGlzIG5lZWRzIGdlbmVyYWxpemluZyBmb3IgVk9TLCBBT1MvVlMsIGV0Yy4uLiAqLworCisgICAgICAgIHdoaWxlICgqcCkgeworI2lmZGVmIE9TMgorICAgICAgICAgICAgaWYgKCpwID09ICdcXCcpICpwID0gJy8nOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisjaWZuZGVmIFZNUworICAgICAgICBpZiAocCA+IHZ2YnVmKSB7CisgICAgICAgICAgICBjaGFyIGMgPSAgICAgICAgICAgICAgICAgICAgLyogRGlyZWN0b3J5IHRlcm1pbmF0aW9uIGNoYXJhY3RlciAqLworI2lmZGVmIE1BQworICAgICAgICAgICAgICAnOicKKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgICAgICAgJzonCisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKyAgICAgICAgICAgICAgJz4nCisjZWxzZQorICAgICAgICAgICAgICAnLycKKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgICAgIGlmICgqKHAtMSkgIT0gYykgeworICAgICAgICAgICAgICAgICpwKysgPSBjOworICAgICAgICAgICAgICAgICpwID0gTlVMOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogVk1TICovCisgICAgICAgIHJldHVybih2dmJ1Zik7CisgICAgfSAvKiBCcmVhayB1cCBsb25nIHN3aXRjaCBzdGF0ZW1lbnRzLi4uICovCisKKyAgICBzd2l0Y2goeSkgeworICAgICAgY2FzZSBWTl9FUlJOTzogICAgICAgICAgICAgICAgICAgIC8qIEVycm9yIG51bWJlciAqLworI2lmZGVmIFZNUworICAgICAgICB7CisgICAgICAgICAgICBleHRlcm4gaW50IHZtc19sYXN0ZXJyOworICAgICAgICAgICAgc3ByaW50Zih2dmJ1ZiwgIiVkIiwgdm1zX2xhc3RlcnIpOyAvKiBTQUZFICovCisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHNwcmludGYodnZidWYsICIlZCIsIGVycm5vKTsgICAgLyogU0FGRSAqLworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICByZXR1cm4odnZidWYpOworCisgICAgICBjYXNlIFZOX0VSU1RSOiAgICAgICAgICAgICAgICAgICAgLyogRXJyb3Igc3RyaW5nICovCisgICAgICAgIGNrc3RybmNweSh2dmJ1Zixja19lcnJzdHIoKSxWVkJVRkwpOworICAgICAgICByZXR1cm4odnZidWYpOworCisjaWZuZGVmIE5PWEZFUgorICAgICAgY2FzZSBWTl9SUFNJWjogICAgICAgICAgICAgICAgICAgIC8qIFJFQ0VJVkUgcGFja2V0LWxlbmd0aCAqLworICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIsdXJwc2l6KTsgICAgIC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9XSU5ETzogICAgICAgICAgICAgICAgICAgIC8qIFdJTkRPVyBzbG90cyAqLworICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIsd3Nsb3RyKTsgICAgIC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworICAgICAgY2FzZSBWTl9URkxOOiAgICAgICAgICAgICAgICAgICAgIC8qIFRBS0UtZmlsZSBsaW5lIG51bWJlciAqLworICAgICAgICBpZiAodGxldmVsID4gLTEpIHsKKyAgICAgICAgICAgIHNwcmludGYodnZidWYsICIlZCIsIHRmbGluZVt0bGV2ZWxdKTsgLyogU0FGRSAqLworICAgICAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcmV0dXJuKCIwIik7CisKKyAgICAgIGNhc2UgVk5fTURNU0c6ICAgICAgICAgICAgICAgICAgICAvKiBESUFMUkVTVUxUICovCisjaWZuZGVmIE5PRElBTAorICAgICAgICByZXR1cm4oKGNoYXIgKiltb2RlbW1zZyk7CisjZWxzZQorICAgICAgICByZXR1cm4oIiIpOworI2VuZGlmIC8qIE5PRElBTCAqLworCisgICAgICBjYXNlIFZOX0ROVU06ICAgICAgICAgICAgICAgICAgICAgLyogRElBTE5VTUJFUiAqLworI2lmbmRlZiBOT0RJQUwKKyAgICAgICAgcmV0dXJuKGRpYWxudW0gPyAoY2hhciAqKSBkaWFsbnVtIDogIiIpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuKCIiKTsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworICAgICAgY2FzZSBWTl9BUEM6CisgICAgICAgIHNwcmludGYodnZidWYsICIlZCIsICAgICAgICAgICAgLyogU0FGRSAqLworI2lmZGVmIENLX0FQQworICAgICAgICAgICAgICAgIGFwY2FjdGl2ZQorI2Vsc2UKKyAgICAgICAgICAgICAgICAwCisjZW5kaWYgLyogQ0tfQVBDICovCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuKChjaGFyICopdnZidWYpOworCisjaWZkZWYgT1MyCisjaWZuZGVmIE5PS1ZFUkJTCisgICAgICBjYXNlIFZOX1RSTUs6CisgICAgICAgICAgc3ByaW50Zih2dmJ1ZiwgIiVkIiwga2V5bWFjKTsgLyogU0FGRSAqLworICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworICAgICAgY2FzZSBWTl9JUEFERFI6CisjaWZkZWYgVENQU09DS0VUCisjaWZuZGVmIE9TSworICAgICAgLyogVGhpcyBkdW1wcyBjb3JlIG9uIE9TLTkgZm9yIHNvbWUgcmVhc29uLCBidXQgb25seSBpZiBleGVjdXRlZCAqLworICAgICAgLyogYmVmb3JlIHdlIGhhdmUgbWFkZSBhIFRDUCBjb25uZWN0aW9uLiAgVGhpcyBpcyBvYnZpb3VzbHkgbm90ICovCisgICAgICAvKiB0aGUgaWRlYWwgZml4LiAqLworICAgICAgICBpZiAoIW15aXBhZGRyWzBdKQorICAgICAgICAgIGdldGxvY2FsaXBhZGRyKCk7CisjZW5kaWYgLyogT1NLICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwKKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICAgICAgICAgICAgICAoY2hhciAqKW15aXBhZGRyLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAiIiwKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyAgICAgICAgICAgICAgICBWVkJVRkwpOworICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisKKyNpZm5kZWYgTk9YRkVSCisgICAgICBjYXNlIFZOX0NSQzE2OiAgICAgICAgICAgICAgICAgICAgLyogQ1JDLTE2IG9mIG1vc3QgcmVjZW50IHRyYW5zZmVyICovCisgICAgICAgIHNwcmludGYodnZidWYsIiVkIixjcmMxNik7ICAgICAgLyogU0FGRSAqLworICAgICAgICByZXR1cm4odnZidWYpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgQ0tfUElECisgICAgICBjYXNlIFZOX1BJRDoKKyNpZmRlZiBJS1NECisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgICAgaWYgKGluc2VydmVyICYmIGlzZ3Vlc3QpCisgICAgICAgICAgcmV0dXJuKCIiKTsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgcmV0dXJuKGNrZ2V0cGlkKCkpOworI2VuZGlmIC8qIENLX1BJRCAqLworCisjaWZuZGVmIE5PWEZFUgorICAgICAgY2FzZSBWTl9GTkFNOiB7ICAgICAgICAgICAgICAgICAgIC8qIFx2KGZpbGVuYW1lKSAqLworICAgICAgICAgIGV4dGVybiBjaGFyIGZpbG5hbVtdLCBvZm4xW10sICpzZnNwZWMsICpycmZzcGVjOworICAgICAgICAgIGNoYXIgKiB0bXA7CisgICAgICAgICAgc3dpdGNoICh3aGF0KSB7ICAgICAgICAgICAgICAgLyogRmlsZSB0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcyAqLworI2lmZGVmIE5FV0ZUUAorICAgICAgICAgICAgY2FzZSAoV19GVFB8V19SRUNWKToKKyAgICAgICAgICAgIGNhc2UgKFdfRlRQfFdfU0VORCk6CisgICAgICAgICAgICAgIHJldHVybigoY2hhciAqKWZpbG5hbSk7CisjZW5kaWYgLyogTkVXRlRQICovCisgICAgICAgICAgICBjYXNlIFdfUkVDVjoKKyAgICAgICAgICAgIGNhc2UgV19SRU1POgorICAgICAgICAgICAgICByZXR1cm4oKGNoYXIgKilvZm4xKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAvKiBNb3N0IHJlY2VudCBmaWxlIHRyYW5zZmVycmVkICovCisgICAgICAgICAgICAgIGlmIChmaWxuYW1bMF0pIHsgICAgICAgICAgLyogKGlmIGFueSkgKi8KKyAgICAgICAgICAgICAgICAgIHJldHVybigoY2hhciAqKWZpbG5hbSk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdHhmZXIgJiBXX1NFTkQgJiYgc2ZzcGVjKSB7CisgICAgICAgICAgICAgICAgICBpZiAoZm5zcGF0aCA9PSBQQVRIX09GRikKKyAgICAgICAgICAgICAgICAgICAgenN0cmlwKHNmc3BlYywmdG1wKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gc2ZzcGVjOworICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdHhmZXIgJiBXX1JFQ1YgJiYgcnJmc3BlYykgeworICAgICAgICAgICAgICAgICAgaWYgKGZucnBhdGggPT0gUEFUSF9PRkYpCisgICAgICAgICAgICAgICAgICAgIHpzdHJpcChycmZzcGVjLCZ0bXApOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0bXAgPSBycmZzcGVjOworICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybigiIik7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgY2FzZSBWTl9GTlVNOiAgICAgICAgICAgICAgICAgICAgIC8qIFx2KGZpbGVudW0pICovCisgICAgICAgIHNwcmludGYodnZidWYsIiVsZCIsZmlsY250KTsgICAgLyogU0FGRSAqLworICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBQRVhJVFNUQVQKKyAgICAgIGNhc2UgVk5fUEVYSVQ6IHsKKyAgICAgICAgICBleHRlcm4gaW50IHBleGl0c3RhdDsKKyAgICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIscGV4aXRzdGF0KTsgLyogU0FGRSAqLworICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBQRVhJVFNUQVQgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgVk5fUF84QklUOgorICAgICAgICB2dmJ1ZlswXSA9IHBhcml0eSA/IGVicSA6IE5VTDsKKyAgICAgICAgdnZidWZbMV0gPSBOVUw7CisgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9QX0NUTDogeworICAgICAgICAgIGV4dGVybiBDSEFSIG15Y3RscTsKKyAgICAgICAgICB2dmJ1ZlswXSA9IG15Y3RscTsKKyAgICAgICAgICB2dmJ1ZlsxXSA9IE5VTDsKKyAgICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisgICAgICB9CisgICAgICBjYXNlIFZOX1BfUlBUOiB7CisgICAgICAgICAgZXh0ZXJuIGludCBycHRlbmE7CisgICAgICAgICAgdnZidWZbMF0gPSBycHRlbmEgPyBycHRxIDogTlVMOworICAgICAgICAgIHZ2YnVmWzFdID0gTlVMOworICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIE9TMgorICAgICAgY2FzZSBWTl9SRUdOOgorICAgICAgICByZXR1cm4oZ2V0X3JlZ19uYW1lKCkpOworICAgICAgY2FzZSBWTl9SRUdPOgorICAgICAgICByZXR1cm4oZ2V0X3JlZ19jb3JwKCkpOworICAgICAgY2FzZSBWTl9SRUdTOgorICAgICAgICByZXR1cm4oZ2V0X3JlZ19zbigpKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB9IC8qIEJyZWFrIHVwIGxvbmcgc3dpdGNoIHN0YXRlbWVudHMuLi4gKi8KKworICAgIHN3aXRjaCh5KSB7CisgICAgICBjYXNlIFZOX1hQUk9HOgorI2lmZGVmIE9TMgorI2lmZGVmIE5UCisjaWZkZWYgS1VJCisgICAgICAgIHJldHVybigiSy05NUciKTsKKyNlbHNlCisgICAgICAgIHJldHVybigiSy05NSIpOworI2VuZGlmIC8qIEtVSSAqLworI2Vsc2UKKyAgICAgICAgcmV0dXJuKCJLLzIiKTsKKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UKKyAgICAgICAgcmV0dXJuKCJDLUtlcm1pdCIpOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgICBjYXNlIFZOX0VESVRPUjoKKyNpZmRlZiBOT0ZSSUxMUworICAgICAgICByZXR1cm4oIiIpOworI2Vsc2UKKyNpZmRlZiBOT1BVU0gKKyAgICAgICAgcmV0dXJuKCIiKTsKKyNlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4dGVybiBjaGFyIGVkaXRvcltdOworICAgICAgICAgICAgY2hhciAqc3M7CisgICAgICAgICAgICBpZiAoIWVkaXRvclswXSkgeworICAgICAgICAgICAgICAgIHNzID0gZ2V0ZW52KCJFRElUT1IiKTsKKyAgICAgICAgICAgICAgICBpZiAoc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGVkaXRvcixzcyxDS01BWFBBVEgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsIlxcdihlZGl0b3IpIixlZGl0b3IsMCk7CisgICAgICAgICAgICByZXR1cm4oZWRpdG9yWzBdID8gKGNoYXIgKillZGl0b3IgOiAiIik7CisgICAgICAgIH0KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisgICAgICBjYXNlIFZOX0VET1BUOgorI2lmZGVmIE5PRlJJTExTCisgICAgICAgIHJldHVybigiIik7CisjZWxzZQorI2lmZGVmIE5PUFVTSAorICAgICAgICByZXR1cm4oIiIpOworI2Vsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZXh0ZXJuIGNoYXIgZWRpdG9wdHNbXTsKKyAgICAgICAgICAgIHJldHVybihlZGl0b3B0c1swXSA/IChjaGFyICopZWRpdG9wdHMgOiAiIik7CisgICAgICAgIH0KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisgICAgICBjYXNlIFZOX0VERklMRToKKyNpZmRlZiBOT0ZSSUxMUworICAgICAgICByZXR1cm4oIiIpOworI2Vsc2UKKyNpZmRlZiBOT1BVU0gKKyAgICAgICAgcmV0dXJuKCIiKTsKKyNlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4dGVybiBjaGFyIGVkaXRmaWxlW107CisgICAgICAgICAgICByZXR1cm4oZWRpdGZpbGVbMF0gPyAoY2hhciAqKWVkaXRmaWxlIDogIiIpOworICAgICAgICB9CisjZW5kaWYgLyogTk9QVVNIICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworI2lmZGVmIEJST1dTRVIKKyAgICAgIGNhc2UgVk5fQlJPV1NSOiB7CisgICAgICAgICAgZXh0ZXJuIGNoYXIgYnJvd3NlcltdOworICAgICAgICAgIGlmICghYnJvd3NlclswXSkgeworICAgICAgICAgICAgICBzID0gZ2V0ZW52KCJCUk9XU0VSIik7CisgICAgICAgICAgICAgIGlmIChzKSBja3N0cm5jcHkoYnJvd3NlcixzLENLTUFYUEFUSCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybihicm93c2VyWzBdID8gKGNoYXIgKilicm93c2VyIDogIiIpOworICAgICAgfQorICAgICAgY2FzZSBWTl9CUk9QVDogeworICAgICAgICAgIGV4dGVybiBjaGFyIGJyb3dzb3B0c1tdOworICAgICAgICAgIHJldHVybihicm93c29wdHNbMF0gPyAoY2hhciAqKWJyb3dzb3B0cyA6ICIiKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fVVJMOiB7CisgICAgICAgICAgZXh0ZXJuIGNoYXIgYnJvd3N1cmxbXTsKKyAgICAgICAgICByZXR1cm4oYnJvd3N1cmxbMF0gPyAoY2hhciAqKWJyb3dzdXJsIDogIiIpOworICAgICAgfQorI2VuZGlmIC8qIEJST1dTRVIgKi8KKyAgICAgIGNhc2UgVk5fSEVSQUxEOgorICAgICAgICByZXR1cm4oKGNoYXIgKil2ZXJzaW8pOworCisgICAgICBjYXNlIFZOX1RFU1Q6IHsgICAgICAgICAgICAgICAgICAgLyogdGVzdCAqLworICAgICAgICAgIGV4dGVybiBjaGFyICogY2tfc190ZXN0LCAqIGNrX3NfdHZlcjsKKyAgICAgICAgICBpZiAoIWNrX3NfdGVzdCkgY2tfc190ZXN0ID0gIiI7CisgICAgICAgICAgaWYgKCFja19zX3R2ZXIpIGNrX3NfdHZlciA9ICIiOworICAgICAgICAgIGlmICgqY2tfc190ZXN0KSB7CisgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1Zixja19zX3Rlc3QsVlZCVUZMKTsKKyAgICAgICAgICAgICAgaWYgKCpja19zX3R2ZXIpIHsKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh2dmJ1ZiwiLiIsVlZCVUZMKTsKKyAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh2dmJ1Zixja19zX3R2ZXIsVlZCVUZMKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCIwIixWVkJVRkwpOworICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgVk5fWEZTVEFUOiAgICAgICAgICAgICAgICAgICAvKiB4ZmVyc3RhdHVzICovCisgICAgICAgIHggPSB4ZmVyc3RhdDsgICAgICAgICAgICAgICAgICAgLyogTGlrZSBzdWNjZXNzICovCisgICAgICAgIGlmICh4ID4gLTEpIHggPSAoeCA9PSAwKSA/IDEgOiAwOyAvKiBFeHRlcm5hbCB2YWx1ZSBpcyByZXZlcnNlZCAqLworICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIseCk7ICAgICAgICAgIC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKChjaGFyICopdnZidWYpOworCisgICAgICBjYXNlIFZOX1hGTVNHOiAgICAgICAgICAgICAgICAgICAgLyogeGZlcm1zZyAqLworICAgICAgICByZXR1cm4oKGNoYXIgKillcGt0bXNnKTsKKworI2lmbmRlZiBOT01TRU5ECisgICAgICBjYXNlIFZOX1NOREw6IHsgICAgICAgICAgICAgICAgICAgLyogc2VuZGxpc3QgKi8KKyAgICAgICAgICBleHRlcm4gaW50IGZpbGVzaW5saXN0OworICAgICAgICAgIHNwcmludGYodnZidWYsIiVkIixmaWxlc2lubGlzdCk7IC8qIFNBRkUgKi8KKyAgICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisgICAgICB9CisjZW5kaWYgLyogTk9NU0VORCAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgQ0tfVFJJR0dFUgorICAgICAgY2FzZSBWTl9UUklHOiB7CisgICAgICAgICAgZXh0ZXJuIGNoYXIgKiB0cmlnZ2VydmFsOworICAgICAgICAgIHJldHVybih0cmlnZ2VydmFsID8gdHJpZ2dlcnZhbCA6ICIiKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBDS19UUklHR0VSICovCisjaWZkZWYgT1MyTU9VU0UKKyNpZmRlZiBPUzIKKyAgICAgIGNhc2UgVk5fTU9VX1g6IHsKKyAgICAgICAgICBleHRlcm4gaW50IE1vdXNlQ3VyWDsKKyAgICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIsTW91c2VDdXJYKTsgLyogU0FGRSAqLworICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fTU9VX1k6IHsKKyAgICAgICAgICBleHRlcm4gaW50IE1vdXNlQ3VyWTsKKyAgICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIsTW91c2VDdXJZKTsgLyogU0FGRSAqLworICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBPUzJNT1VTRSAqLworICAgICAgY2FzZSBWTl9QUklOVDogeworICAgICAgICAgIGV4dGVybiBpbnQgcHJpbnRwaXBlOworICAgICAgICAgIGV4dGVybiBjaGFyICogcHJpbnRlcm5hbWU7CisjaWZkZWYgUFJJTlRTV0kKKyAgICAgICAgICBleHRlcm4gaW50IG5vcHJpbnRlcjsKKyAgICAgICAgICBpZiAobm9wcmludGVyKSByZXR1cm4oIiIpOworI2VuZGlmIC8qIFBSSU5UU1dJICovCisgICAgICAgICAgY2ttYWttc2codnZidWYsVlZCVUZMLAorICAgICAgICAgICAgICAgICAgIHByaW50cGlwZSA/ICJ8IiA6ICIiLAorICAgICAgICAgICAgICAgICAgIHByaW50ZXJuYW1lID8gcHJpbnRlcm5hbWUgOgorI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICJQUk4iLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQpIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKyAgICB9IC8qIEJyZWFrIHVwIGxvbmcgc3dpdGNoIHN0YXRlbWVudHMuLi4gKi8KKworICAgIHN3aXRjaCh5KSB7CisgICAgICBjYXNlIFZOX0VTQzogICAgICAgICAgICAgICAgICAgICAgLyogRXNjYXBlIGNoYXJhY3RlciAqLworICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIsZXNjYXBlKTsgICAgIC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKChjaGFyICopdnZidWYpOworCisgICAgICBjYXNlIFZOX0lOVElNRToKKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwiJWxkIixpbmV0aW1lKTsgICAvKiBTQUZFICovCisgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9JTlRNTzoKKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwiJWQiLGlud2FpdCk7ICAgICAvKiBTQUZFICovCisgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9TRUNVUkU6CisgICAgICAgIGlmICgwCisjaWZkZWYgU1NIQlVJTFRJTgorICAgICAgICAgICAgfHwgSVNfU1NIKCkKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgfHwgY2tfdG5fZW5jcnlwdGluZygpICYmIGNrX3RuX2RlY3J5cHRpbmcoKQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNpZmRlZiBDS19TU0wKKyAgICAgICAgICAgIHx8IHRsc19hY3RpdmVfZmxhZyB8fCBzc2xfYWN0aXZlX2ZsYWcKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICAgICAgICAgICkKKyAgICAgICAgICByZXR1cm4oIjEiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybigiMCIpOworCisgICAgICBjYXNlIFZOX0FVVEhOOgorI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4dGVybiBjaGFyIHN6VXNlck5hbWVBdXRoZW50aWNhdGVkW107CisgICAgICAgICAgICByZXR1cm4oKGNoYXIgKilzelVzZXJOYW1lQXV0aGVudGljYXRlZCk7CisgICAgICAgIH0KKyNlbHNlIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisgICAgICAgIHJldHVybigoY2hhciAqKSIiKTsKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworCisgICAgICBjYXNlIFZOX0FVVEhTOgorI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgICAgIHN3aXRjaCAoY2tfdG5fYXV0aF92YWxpZCgpKSB7CisgICAgICAgICAgY2FzZSBBVVRIX1VOS05PV046CisgICAgICAgICAgICByZXR1cm4oKGNoYXIgKikidW5rbm93biIpOworICAgICAgICAgIGNhc2UgQVVUSF9PVEhFUjoKKyAgICAgICAgICAgIHJldHVybigoY2hhciAqKSJvdGhlciIpOworICAgICAgICAgIGNhc2UgQVVUSF9VU0VSOgorICAgICAgICAgICAgcmV0dXJuKChjaGFyICopInVzZXIiKTsKKyAgICAgICAgICBjYXNlIEFVVEhfVkFMSUQ6CisgICAgICAgICAgICByZXR1cm4oKGNoYXIgKikidmFsaWQiKTsKKyAgICAgICAgICBjYXNlIEFVVEhfUkVKRUNUOgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oKGNoYXIgKikicmVqZWN0ZWQiKTsKKyAgICAgICAgfQorI2Vsc2UgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyAgICAgICAgcmV0dXJuKChjaGFyICopInJlamVjdGVkIik7CisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKworICAgICAgY2FzZSBWTl9BVVRIVDoKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorI2lmZGVmIENLX1NTTAorICAgICAgICBpZiAoKHNzbF9hY3RpdmVfZmxhZyB8fCB0bHNfYWN0aXZlX2ZsYWcpICYmCisgICAgICAgICAgICBja190bl9hdXRoX3ZhbGlkKCkgPT0gQVVUSF9WQUxJRCAmJgorICAgICAgICAgICAgKHNzdGVsbmV0ID8gKCFURUxPUFRfVShURUxPUFRfQVVUSEVOVElDQVRJT04pKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAoIVRFTE9QVF9NRShURUxPUFRfQVVUSEVOVElDQVRJT04pKSkgfHwKKyAgICAgICAgICAgICBja190bl9hdXRoZW50aWNhdGVkKCkgPT0gQVVUSFRZUEVfTlVMTCB8fAorICAgICAgICAgICAgIGNrX3RuX2F1dGhlbnRpY2F0ZWQoKSA9PSBBVVRIVFlQRV9BVVRPKQorICAgICAgICAgIHJldHVybigiWF81MDlfQ0VSVElGSUNBVEUiKTsKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgIHJldHVybihBVVRIVFlQRV9OQU1FKGNrX3RuX2F1dGhlbnRpY2F0ZWQoKSkpOworI2Vsc2UgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyAgICAgICAgcmV0dXJuKChjaGFyICopIk5VTEwiKTsKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAgIGNhc2UgVk5fSzRQUk46IHsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIGtyYjRfZF9wcmluY2lwYWw7CisgICAgICAgICAgaWYgKGtyYjRfZF9wcmluY2lwYWwpCisgICAgICAgICAgICBja3N0cm5jcHkodnZidWYsa3JiNF9kX3ByaW5jaXBhbCxWVkJVRkwrMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgKnZ2YnVmID0gTlVMOworICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fSzVQUk46IHsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIGtyYjVfZF9wcmluY2lwYWw7CisgICAgICAgICAgaWYgKGtyYjVfZF9wcmluY2lwYWwpCisgICAgICAgICAgICBja3N0cm5jcHkodnZidWYsa3JiNV9kX3ByaW5jaXBhbCxWVkJVRkwrMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgKnZ2YnVmID0gTlVMOworICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fSzRSTE06IHsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIGtyYjRfZF9yZWFsbTsKKyAgICAgICAgICBpZiAoa3JiNF9kX3JlYWxtKSB7CisgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZixrcmI0X2RfcmVhbG0sVlZCVUZMKzEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNoYXIgKiBzID0gY2tfa3JiNF9nZXRyZWFsbSgpOworICAgICAgICAgICAgICBja3N0cm5jcHkodnZidWYscyA/IHMgOiAiIixWVkJVRkwrMSk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fSzRTUlY6IHsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIGtyYjRfZF9zcnY7CisgICAgICAgICAgaWYgKGtyYjRfZF9zcnYpCisgICAgICAgICAgICBja3N0cm5jcHkodnZidWYsa3JiNF9kX3NydixWVkJVRkwrMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLCJyY21kIixWVkJVRkwpOworICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fSzVSTE06IHsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIGtyYjVfZF9yZWFsbTsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIGtyYjVfZF9jYzsKKyAgICAgICAgICBpZiAoa3JiNV9kX3JlYWxtKSB7CisgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZixrcmI1X2RfcmVhbG0sVlZCVUZMKzEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNoYXIgKiBzID0gY2tfa3JiNV9nZXRyZWFsbShrcmI1X2RfY2MpOworICAgICAgICAgICAgICBja3N0cm5jcHkodnZidWYscyxWVkJVRkwrMSk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fSzVDQzogeworICAgICAgICAgIGV4dGVybiBjaGFyICoga3JiNV9kX2NjOworICAgICAgICAgIGlmIChrcmI1X2RfY2MpCisgICAgICAgICAgICBja3N0cm5jcHkodnZidWYsa3JiNV9kX2NjLFZWQlVGTCsxKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBja3N0cm5jcHkodnZidWYsY2tfa3JiNV9nZXRfY2NfbmFtZSgpLFZWQlVGTCsxKTsKKyAgICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisgICAgICB9CisgICAgICBjYXNlIFZOX0s1U1JWOiB7CisgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBrcmI1X2Rfc3J2OworICAgICAgICAgIGlmIChrcmI1X2Rfc3J2KQorICAgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLGtyYjVfZF9zcnYsVlZCVUZMKzEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwiaG9zdCIsVlZCVUZMKTsKKyAgICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisgICAgICB9CisgICAgICBjYXNlIFZOX0s0RU5POiB7CisgICAgICAgIGV4dGVybiBjaGFyICoga3JiNF9lcnJubzsKKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwiJWQiLGtyYjRfZXJybm8pOyAvKiBTQUZFICovCisgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fSzVFTk86IHsKKyAgICAgICAgZXh0ZXJuIGNoYXIgKiBrcmI1X2Vycm5vOworICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIsa3JiNV9lcnJubyk7IC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKChjaGFyICopdnZidWYpOworICAgICAgfQorICAgICAgY2FzZSBWTl9LNEVNU0c6IHsKKyAgICAgICAgZXh0ZXJuIGNoYXIgKiBrcmI0X2Vycm1zZzsKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLGtyYjRfZXJybXNnP2tyYjRfZXJybXNnOiIiLFZWQlVGTCsxKTsKKyAgICAgICAgcmV0dXJuKChjaGFyICopdnZidWYpOworICAgICAgfQorICAgICAgY2FzZSBWTl9LNUVNU0c6IHsKKyAgICAgICAgZXh0ZXJuIGNoYXIgKiBrcmI1X2Vycm1zZzsKKyAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLGtyYjVfZXJybXNnLFZWQlVGTCsxKTsKKyAgICAgICAgcmV0dXJuKChjaGFyICopdnZidWYpOworICAgICAgfQorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisjaWZkZWYgQ0tfU1NMCisgICAgICBjYXNlIFZOX1g1MDlfUzoKKyAgICAgICAgaWYgKHNzbF9hY3RpdmVfZmxhZykKKyAgICAgICAgICBja3N0cm5jcHkodnZidWYsc3NsX2dldF9zdWJqZWN0X25hbWUoc3NsX2NvbiksVlZCVUZMKzEpOworICAgICAgICBlbHNlIGlmICh0bHNfYWN0aXZlX2ZsYWcpCisgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLHNzbF9nZXRfc3ViamVjdF9uYW1lKHRsc19jb24pLFZWQlVGTCsxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwiIixWVkJVRkwrMSk7CisgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIGNhc2UgVk5fWDUwOV9JOgorICAgICAgICBpZiAoc3NsX2FjdGl2ZV9mbGFnKQorICAgICAgICAgIGNrc3RybmNweSh2dmJ1Zixzc2xfZ2V0X2lzc3Vlcl9uYW1lKHNzbF9jb24pLFZWQlVGTCsxKTsKKyAgICAgICAgZWxzZSBpZiAodGxzX2FjdGl2ZV9mbGFnKQorICAgICAgICAgIGNrc3RybmNweSh2dmJ1Zixzc2xfZ2V0X2lzc3Vlcl9uYW1lKHRsc19jb24pLFZWQlVGTCsxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZiwiIixWVkJVRkwrMSk7CisgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgICAgY2FzZSBWTl9PU05BTToKKyNpZmRlZiBJS1NECisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgICAgaWYgKGluc2VydmVyICYmIGlzZ3Vlc3QpCisgICAgICAgICAgcmV0dXJuKCIiKTsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBDS19VVFNOQU1FCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4dGVybiBjaGFyIHVubV9uYW1bXTsKKyAgICAgICAgICAgIHJldHVybigoY2hhciAqKXVubV9uYW0pOworICAgICAgICB9CisjZWxzZQorICAgICAgICBmb3IgKHggPSB5ID0gMDsgeCA8IFZWQlVGTDsgeCsrKSB7CisgICAgICAgICAgICBpZiAoY2t4c3lzW3hdID09IFNQICYmIGN4ID09IDApIGNvbnRpbnVlOworICAgICAgICAgICAgdnZidWZbeSsrXSA9IChjaGFyKSAoKGNreHN5c1t4XSA9PSBTUCkgPyAnXycgOiBja3hzeXNbeF0pOworICAgICAgICB9CisgICAgICAgIHZ2YnVmW3ldID0gTlVMOworICAgICAgICByZXR1cm4odnZidWYpOworI2VuZGlmIC8qIENLX1VUU05BTUUgKi8KKworICAgICAgY2FzZSBWTl9PU1ZFUjogeworI2lmZGVmIENLX1VUU05BTUUKKyAgICAgICAgICBleHRlcm4gY2hhciB1bm1fdmVyW107CisjaWZkZWYgSUtTRAorI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgaWYgKGluc2VydmVyICYmIGlzZ3Vlc3QpCisgICAgICAgICAgICByZXR1cm4oIiIpOworI2VuZGlmIC8qIENLX0xPR0lOICovCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgIHJldHVybigoY2hhciAqKXVubV92ZXIpOworI2Vsc2UKKyAgICAgICAgICByZXR1cm4oIiIpOworI2VuZGlmIC8qIENLX1VUU05BTUUgKi8KKyAgICAgIH0KKworICAgICAgY2FzZSBWTl9PU1JFTDogeworI2lmZGVmIENLX1VUU05BTUUKKyAgICAgICAgICBleHRlcm4gY2hhciB1bm1fcmVsW107CisjaWZkZWYgSUtTRAorI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgaWYgKGluc2VydmVyICYmIGlzZ3Vlc3QpCisgICAgICAgICAgICByZXR1cm4oIiIpOworI2VuZGlmIC8qIENLX0xPR0lOICovCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgIHJldHVybigoY2hhciAqKXVubV9yZWwpOworI2Vsc2UKKyAgICAgICAgICByZXR1cm4oIiIpOworI2VuZGlmIC8qIENLX1VUU05BTUUgKi8KKyAgICAgIH0KKyAgICB9IC8qIEJyZWFrIHVwIGxvbmcgc3dpdGNoIHN0YXRlbWVudHMuLi4gKi8KKworICAgIHN3aXRjaCh5KSB7CisgICAgICBjYXNlIFZOX05BTUU6IHsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIG15bmFtZTsKKyAgICAgICAgICByZXR1cm4obXluYW1lKTsKKyAgICAgIH0KKworICAgICAgY2FzZSBWTl9NT0RMOiB7CisjaWZkZWYgQ0tfVVRTTkFNRQorICAgICAgICAgIGV4dGVybiBjaGFyIHVubV9tb2RbXSwgdW5tX21jaFtdOworICAgICAgICAgIGludCB5ID0gVlZCVUZMIC0gMTsKKyAgICAgICAgICBjaGFyICogcyA9IHVubV9tb2Q7CisjZW5kaWYgLyogQ0tfVVRTTkFNRSAqLworI2lmZGVmIElLU0QKKyNpZmRlZiBDS19MT0dJTgorICAgICAgICAgIGlmIChpbnNlcnZlciAmJiBpc2d1ZXN0KQorICAgICAgICAgICAgcmV0dXJuKCIiKTsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2VuZGlmIC8qIElLU0QgKi8KKworI2lmZGVmIENPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdhcyBIUFVYICovCisgICAgICAgICAgaWYgKCF1bm1fbW9kWzBdICYmICFub3B1c2gpCisgICAgICAgICAgICB6enN0cmluZygiXFxmY29tbWFuZChtb2RlbCkiLCZzLCZ5KTsKKy8qCisgICBBbm90aGVyIHBvc3NpYmlsaXR5IHdvdWxkIGJlOgorICAgICAiXFxmY29tbWFuZChrc2ggLWMgJ3doZW5jZSBtb2RlbCAxPiYtICYmIG1vZGVsIHx8IHVuYW1lIC1tJykiCisgICBCdXQgdGhhdCB3b3VsZCBkZXBlbmQgb24gaGF2aW5nIGtzaC4KKyovCisjZWxzZQorI2lmZGVmIE9TRjMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpZ2l0YWwgVU5JWCAzLjIgYW5kIGhpZ2hlci4uLiAqLworLyogTm90ZTogVWx0cml4IGhhcyAvZXRjL3NpemVyLCBidXQgaXQgaXMgbm90IHB1YmxpY2x5IGV4ZWN1dGFibGUuICovCisvKiBzaXplciAtYyBvdXRwdXRzICdjcHU6PHRhYj48dGFiPiJERUN4eHh4IicgKi8KKyAgICAgICAgICBpZiAoIXVubV9tb2RbMF0pIHsKKyAgICAgICAgICAgICAgY2hhciAqIHA7CisgICAgICAgICAgICAgIGludCBmbGFnID0gMDsKKyAgICAgICAgICAgICAgenpzdHJpbmcoIlxcZmNvbW1hbmQoL3Vzci9zYmluL3NpemVyIC1jKSIsJnMsJnkpOworICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJEVSBtb2RlbCIsdW5tX21vZCwwKTsKKyAgICAgICAgICAgICAgcyA9IHVubV9tb2Q7CisgICAgICAgICAgICAgIHAgPSB1bm1fbW9kOworICAgICAgICAgICAgICB3aGlsZSAoKnApIHsgICAgICAgICAgICAgIC8qIEV4dHJhY3QgdGhlIHBhcnQgaW4gcXVvdGVzICovCisgICAgICAgICAgICAgICAgICBpZiAoKnAgPT0gJyInKSB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAgICAgICAgICAgKnMrKyA9ICpwOworICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICpzID0gTlVMOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBPU0YzMiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIENLX1VUU05BTUUKKyAgICAgICAgICBpZiAodW5tX21vZFswXSkKKyAgICAgICAgICAgIHJldHVybigoY2hhciAqKXVubV9tb2QpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybigoY2hhciAqKXVubV9tY2gpOworI2Vsc2UKKyAgICAgICAgICByZXR1cm4oIiIpOworI2VuZGlmIC8qIENLX1VUU05BTUUgKi8KKyAgICAgIH0KKworI2lmZGVmIElCTVgyNQorICAgICAgLyogWC4yNSB2YXJpYWJsZXMgKGxvY2FsIGFuZCByZW1vdGUgYWRkcmVzcykgKi8KKyAgICAgIGNhc2UgVk5fWDI1TEE6CisgICAgICAgIGlmICghbG9jYWxfbnVhWzBdICYmICF4MjVsb2NhbF9udWEobG9jYWxfbnVhKSkKKyAgICAgICAgICAqdnZidWYgPSBOVUxMOworICAgICAgICBlbHNlCisgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLGxvY2FsX251YSxWVkJVRkwrMSk7CisgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9YMjVSQToKKyAgICAgICAgaWYgKCFyZW1vdGVfbnVhWzBdKQorICAgICAgICAgICp2dmJ1ZiA9IE5VTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBja3N0cm5jcHkodnZidWYscmVtb3RlX251YSxWVkJVRkwrMSk7CisgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyNlbmRpZiAvKiBJQk1YMjUgKi8KKworI2lmbmRlZiBOT0RJQUwKKyAgICAgIGNhc2UgVk5fUERTRlg6IHsKKyAgICAgICAgICBleHRlcm4gY2hhciBwZHNmeFtdOworICAgICAgICAgIHJldHVybigoY2hhciAqKXBkc2Z4KTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fRFRZUEU6IHsKKyAgICAgICAgICBleHRlcm4gaW50IGRpYWx0eXBlOworICAgICAgICAgIHNwcmludGYodnZidWYsIiVkIixkaWFsdHlwZSk7IC8qIFNBRkUgKi8KKyAgICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisgICAgICB9CisjZW5kaWYgLyogTk9ESUFMICovCisKKyNpZmRlZiBVTklYCisgICAgICBjYXNlIFZOX0xDS1BJRDogeworICAgICAgICAgIGV4dGVybiBjaGFyIGxvY2twaWRbXTsKKyAgICAgICAgICByZXR1cm4oKGNoYXIgKilsb2NrcGlkKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBVTklYICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgICBjYXNlIFZOX0JMSzoKKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwiJWQiLGJjdHIpOyAgICAgICAvKiBTQUZFICovCisgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9URlRJTToKKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwgICAgICAgICAgICAgICAgICAvKiBTQUZFICovCisjaWZkZWYgR0ZUSU1FUgorICAgICAgICAgICAgICAgICIlbGQiLCAobG9uZykoZnB0c2VjcyArIDAuNSkKKyNlbHNlCisgICAgICAgICAgICAgICAgIiVkIiwgdHNlY3MKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuKChjaGFyICopdnZidWYpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisgICAgICBjYXNlIFZOX0hXUEFSOgorICAgICAgY2FzZSBWTl9TRVJJQUw6IHsKKyAgICAgICAgICBpbnQgc2I7CisgICAgICAgICAgY2hhciBjLCAqIHNzOworICAgICAgICAgIGV4dGVybiBpbnQgc3RvcGJpdHM7CisgICAgICAgICAgdnZidWZbMF0gPSBOVUw7CisgICAgICAgICAgaWYgKGh3cGFyaXR5ICYmIGxvY2FsICYmICFuZXR3b3JrKQorICAgICAgICAgICAgc3MgPSBwYXJuYW0oKGNoYXIpaHdwYXJpdHkpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNzID0gcGFybmFtKChjaGFyKXBhcml0eSk7CisgICAgICAgICAgaWYgKGN4ID09IFZOX0hXUEFSKSB7CisgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1ZixzcyxWVkJVRkwpOworICAgICAgICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisgICAgICAgICAgfQorICAgICAgICAgIGMgPSBzc1swXTsKKyAgICAgICAgICBpZiAoaXNsb3dlcihjKSkgYyA9IHRvdXBwZXIoYyk7CisgICAgICAgICAgc2IgPSBzdG9wYml0czsKKyAgICAgICAgICBpZiAoc2IgPCAxKQorICAgICAgICAgICAgc2IgPSAoc3BlZWQgPiAwICYmIHNwZWVkIDw9IDExMEwpID8gMiA6IDE7CisgICAgICAgICAgaWYgKGh3cGFyaXR5KQorICAgICAgICAgICAgc3ByaW50Zih2dmJ1ZiwiIDglYyVkIixjLHNiKTsgLyogU0FGRSAqLworICAgICAgICAgIGVsc2UgaWYgKHBhcml0eSkKKyAgICAgICAgICAgIHNwcmludGYodnZidWYsIiA3JWMlZCIsYyxzYik7IC8qIFNBRkUgKi8KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzcHJpbnRmKHZ2YnVmLCIgOE4lZCIsc2IpOyAgLyogU0FGRSAqLworICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKworI2lmZGVmIFVOSVgKKyAgICAgIGNhc2UgVk5fTENLRElSOiB7CisjaWZuZGVmIE5PVVVDUAorICAgICAgICAgIGV4dGVybiBjaGFyICogdXVjcGxvY2tkaXI7CisgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLHV1Y3Bsb2NrZGlyLFZWQlVGTCk7CisgICAgICAgICAgeCA9IHN0cmxlbih2dmJ1Zik7CisgICAgICAgICAgaWYgKHggPiAwKSB7CisgICAgICAgICAgICAgIGlmICh2dmJ1Zlt4LTFdICE9ICcvJykgeworICAgICAgICAgICAgICAgICAgdnZidWZbeF0gPSAnLyc7CisgICAgICAgICAgICAgICAgICB2dmJ1Zlt4KzFdID0gTlVMOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICB2dmJ1ZlswXSA9IE5VTDsKKyNlbmRpZiAvKiBOT1VVQ1AgKi8KKyAgICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisgICAgICB9CisjZW5kaWYgLyogVU5JWCAqLworICAgIH0gLyogQnJlYWsgdXAgbG9uZyBzd2l0Y2ggc3RhdGVtZW50cy4uLiAqLworCisgICAgc3dpdGNoKHkpIHsKKyNpZm5kZWYgTk9ESUFMCisgICAgICBjYXNlIFZOX0RNX0xQOgorICAgICAgY2FzZSBWTl9ETV9TUDoKKyAgICAgIGNhc2UgVk5fRE1fUEQ6CisgICAgICBjYXNlIFZOX0RNX1REOgorICAgICAgY2FzZSBWTl9ETV9XQToKKyAgICAgIGNhc2UgVk5fRE1fV0Q6CisgICAgICBjYXNlIFZOX0RNX0hGOgorICAgICAgY2FzZSBWTl9ETV9XQjoKKyAgICAgIGNhc2UgVk5fRE1fUkM6IHsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIGdldGRtKCk7CisgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLGdldGRtKHkpLFZWQlVGTCk7CisgICAgICAgICAgcmV0dXJuKChjaGFyICopdnZidWYpOworICAgICAgfQorI2VuZGlmIC8qIE5PRElBTCAqLworCisgICAgICBjYXNlIFZOX1RZX0xOOgorICAgICAgY2FzZSBWTl9UWV9MQzogeworICAgICAgICAgIGV4dGVybiBpbnQgdHlwX2xpbmVzOworICAgICAgICAgIHNwcmludGYodnZidWYsIiVkIix0eXBfbGluZXMpOyAvKiBTQUZFICovCisgICAgICAgICAgcmV0dXJuKChjaGFyICopdnZidWYpOworICAgICAgfQorICAgICAgY2FzZSBWTl9UWV9MTTogeworICAgICAgICAgIGV4dGVybiBpbnQgdHlwX210Y2hzOworICAgICAgICAgIHNwcmludGYodnZidWYsIiVkIix0eXBfbXRjaHMpOyAvKiBTQUZFICovCisgICAgICAgICAgcmV0dXJuKChjaGFyICopdnZidWYpOworICAgICAgfQorICAgICAgY2FzZSBWTl9NQUNMVkw6CisgICAgICAgIHNwcmludGYodnZidWYsIiVkIixtYWNsdmwpOyAgICAgLyogU0FGRSAqLworICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisgICAgfSAvKiBCcmVhayB1cCBsb25nIHN3aXRjaCBzdGF0ZW1lbnRzLi4uICovCisKKyAgICBzd2l0Y2goeSkgeworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgVk5fWEZfQkM6CisgICAgICAgIHNwcmludGYodnZidWYsIiVkIixjcnVuY2hlZCk7ICAgLyogU0FGRSAqLworICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisKKyAgICAgIGNhc2UgVk5fWEZfVE06CisgICAgICAgIHNwcmludGYodnZidWYsIiVkIix0aW1lb3V0cyk7ICAgLyogU0FGRSAqLworICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisKKyAgICAgIGNhc2UgVk5fWEZfUlg6CisgICAgICAgIHNwcmludGYodnZidWYsIiVkIixyZXRyYW5zKTsgICAgLyogU0FGRSAqLworICAgICAgICByZXR1cm4oKGNoYXIgKil2dmJ1Zik7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyAgICAgIGNhc2UgVk5fTVNfQ0Q6ICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBzaWduYWxzICovCisgICAgICBjYXNlIFZOX01TX0NUUzoKKyAgICAgIGNhc2UgVk5fTVNfRFNSOgorICAgICAgY2FzZSBWTl9NU19EVFI6CisgICAgICBjYXNlIFZOX01TX1JJOgorICAgICAgY2FzZSBWTl9NU19SVFM6IHsKKyAgICAgICAgICBpbnQgeCwgeiA9IC0xOworICAgICAgICAgIHggPSB0dGdtZG0oKTsgICAgICAgICAgICAgICAgIC8qIFRyeSB0byBnZXQgdGhlbSAqLworICAgICAgICAgIGlmICh4ID4gLTEpIHsKKyAgICAgICAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgICAgICAgY2FzZSBWTl9NU19DRDogIHogPSAoeCAmIEJNX0RDRCkgPyAxIDogMDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWTl9NU19EU1I6IHogPSAoeCAmIEJNX0RTUikgPyAxIDogMDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWTl9NU19DVFM6IHogPSAoeCAmIEJNX0NUUykgPyAxIDogMDsgYnJlYWs7CisjaWZkZWYgTUFDCisgICAgICAgICAgICAgICAgY2FzZSBWTl9NU19EVFI6IHogPSAoeCAmIEJNX0RUUikgPyAxIDogMDsgYnJlYWs7CisjZWxzZQorI2lmbmRlZiBTVFJBVFVTCisgICAgICAgICAgICAgICAgY2FzZSBWTl9NU19SSTogIHogPSAoeCAmIEJNX1JORykgPyAxIDogMDsgYnJlYWs7CisjaWZuZGVmIE5UCisgICAgICAgICAgICAgICAgY2FzZSBWTl9NU19EVFI6IHogPSAoeCAmIEJNX0RUUikgPyAxIDogMDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWTl9NU19SVFM6IHogPSAoeCAmIEJNX1JUUykgPyAxIDogMDsgYnJlYWs7CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogTUFDICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgc3ByaW50Zih2dmJ1ZiwiJWQiLHopOyAgICAgICAgLyogU0FGRSAqLworICAgICAgICAgIHJldHVybigoY2hhciAqKXZ2YnVmKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fTUFUQ0g6ICAgICAgICAgICAgICAgICAgICAvKiBJTlBVVCBNQVRDSCAqLworICAgICAgICByZXR1cm4oaW5wbWF0Y2ggPyBpbnBtYXRjaCA6ICIiKTsKKworI2lmZGVmIENLRkxPQVQKKyAgICAgIGNhc2UgVk5fSVNDQUxFOgkJCS8qIElOUFVUIFNDQUxFLUZBQ1RPUiAqLworICAgICAgICByZXR1cm4oaW5wc2NhbGUgPyBpbnBzY2FsZSA6ICIxLjAiKTsKKyNlbmRpZgkvKiBDS0ZMT0FUICovCisKKyAgICAgIGNhc2UgVk5fU0xNU0c6IHsgICAgICAgICAgICAgICAgICAvKiBTRVQgTElORSAvIEhPU1QgbWVzc2FnZSAqLworICAgICAgICAgIGV4dGVybiBjaGFyICogc2xtc2c7CisgICAgICAgICAgdnZidWZbMF0gPSBOVUw7CisgICAgICAgICAgaWYgKHNsbXNnKQorICAgICAgICAgICAgY2tzdHJuY3B5KHZ2YnVmLHNsbXNnLFZWQlVGTCk7CisgICAgICAgICByZXR1cm4odnZidWYpOworICAgICAgfQorCisgICAgICBjYXNlIFZOX1RYVERJUjogICAgICAgICAgICAgICAgICAgLyogVEVYVERJUiAqLworICAgICAgICByZXR1cm4oa19pbmZvX2RpciA/IGtfaW5mb19kaXIgOiAiIik7CisKKyNpZmRlZiBGTkZMT0FUCisgICAgICBjYXNlIFZOX01BX1BJOgorICAgICAgICByZXR1cm4obWF0aF9waSk7CisKKyAgICAgIGNhc2UgVk5fTUFfRToKKyAgICAgICAgcmV0dXJuKG1hdGhfZSk7CisKKyAgICAgIGNhc2UgVk5fTUFfUFI6CisgICAgICAgIHNwcmludGYodnZidWYsIiVkIixmcF9kaWdpdHMpOyAgLyogU0FGRSAqLworICAgICAgICByZXR1cm4odnZidWYpOworI2VuZGlmIC8qIEZORkxPQVQgKi8KKworICAgICAgY2FzZSBWTl9DTURCTDoKKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwiJWQiLENNREJMKTsgICAgICAvKiBTQUZFICovCisgICAgICAgIHJldHVybih2dmJ1Zik7CisKKyNpZmRlZiBDS0NIQU5ORUxJTworICAgICAgY2FzZSBWTl9GRVJSOiB7CisgICAgICAgICAgZXh0ZXJuIGludCB6X2Vycm9yOworICAgICAgICAgIHNwcmludGYodnZidWYsIiVkIix6X2Vycm9yKTsgIC8qIFNBRkUgKi8KKyAgICAgICAgICByZXR1cm4odnZidWYpOworICAgICAgfQorICAgICAgY2FzZSBWTl9GTUFYOiB7CisgICAgICAgICAgZXh0ZXJuIGludCB6X21heGNoYW47CisgICAgICAgICAgc3ByaW50Zih2dmJ1ZiwiJWQiLHpfbWF4Y2hhbik7IC8qIFNBRkUgKi8KKyAgICAgICAgICByZXR1cm4odnZidWYpOworICAgICAgfQorICAgICAgY2FzZSBWTl9GQ09VOiB7CisgICAgICAgICAgZXh0ZXJuIGludCB6X2ZpbGNvdW50OworICAgICAgICAgIHNwcmludGYodnZidWYsIiVkIix6X2ZpbGNvdW50KTsgLyogU0FGRSAqLworICAgICAgICAgIHJldHVybih2dmJ1Zik7CisgICAgICB9CisjZW5kaWYgLyogQ0tDSEFOTkVMSU8gKi8KKworI2lmbmRlZiBOT0RJQUwKKyAgICAgIGNhc2UgVk5fRFJUUjogeworICAgICAgICAgIGV4dGVybiBpbnQgZGlhbGNvdW50OworICAgICAgICAgIHNwcmludGYodnZidWYsIiVkIixkaWFsY291bnQpOyAvKiBTQUZFICovCisgICAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworI2lmbmRlZiBOT0xPR0RJQUwKKyNpZm5kZWYgTk9MT0NBTAorICAgICAgY2FzZSBWTl9DWFRJTUU6CisgICAgICAgIHNwcmludGYodnZidWYsIiVsZCIsZG9sb2dzaG93KDApKTsgLyogU0FGRSAqLworICAgICAgICByZXR1cm4odnZidWYpOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNlbmRpZiAvKiBOT0xPR0RJQUwgKi8KKworICAgICAgY2FzZSBWTl9CWVRFOgorICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIsYnl0ZW9yZGVyKTsgIC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKworICAgICAgY2FzZSBWTl9LQkNIQVI6CisgICAgICAgIHZ2YnVmWzBdID0gTlVMOworICAgICAgICB2dmJ1ZlsxXSA9IE5VTDsKKyAgICAgICAgaWYgKGtiY2hhciA+IDApCisgICAgICAgICAgdnZidWZbMF0gPSAoa2JjaGFyICYgMHhmZik7CisgICAgICAgIHJldHVybih2dmJ1Zik7CisKKyAgICAgIGNhc2UgVk5fVFRZTkFNOiB7CisjaWZkZWYgSEFWRUNUVE5BTQorICAgICAgICAgIGV4dGVybiBjaGFyIGN0dG5hbVtdOworICAgICAgICAgIHJldHVybigoY2hhciAqKWN0dG5hbSk7CisjZWxzZQorICAgICAgICAgIHJldHVybihDVFROQU0pOworI2VuZGlmIC8qIEhBVkVDVFROQU0gKi8KKyAgICAgIH0KKworICAgICAgY2FzZSBWTl9QUk9NUFQ6CisgICAgICAgIHJldHVybihjbWdldHAoKSk7CisKKyAgICAgIGNhc2UgVk5fQlVJTEQ6IHsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIGJ1aWxkaWQ7CisgICAgICAgICAgcmV0dXJuKGJ1aWxkaWQpOworICAgICAgfQorCisjaWZuZGVmIE5PU0VYUAorICAgICAgY2FzZSBWTl9TRVhQOiB7CisgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBsYXN0c2V4cDsKKyAgICAgICAgICByZXR1cm4obGFzdHNleHAgPyBsYXN0c2V4cCA6ICIiKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fVlNFWFA6IHsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIHNleHB2YWw7CisgICAgICAgICAgcmV0dXJuKHNleHB2YWwgPyBzZXhwdmFsIDogIiIpOworICAgICAgfQorICAgICAgY2FzZSBWTl9MU0VYUDogeworICAgICAgICAgIGV4dGVybiBpbnQgc2V4cGRlcDsKKyAgICAgICAgICBja3N0cm5jcHkodnZidWYsY2tpdG9hKHNleHBkZXApLFZWQlVGTCk7CisgICAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBOT1NFWFAgKi8KKworI2lmZGVmIEdGVElNRVIKKyAgICAgIGNhc2UgVk5fRlRJTUU6IHsKKyAgICAgICAgICBDS0ZMT0FUIGY7CisgICAgICAgICAgenRpbWUoJnApOworICAgICAgICAgIGlmIChwID09IE5VTEwgfHwgKnAgPT0gTlVMKQorICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworICAgICAgICAgIHogPSBhdG9sKHArMTEpICogMzYwMEwgKyBhdG9sKHArMTQpICogNjBMICsgYXRvbChwKzE3KTsKKyAgICAgICAgICBmID0gKENLRkxPQVQpeiArICgoQ0tGTE9BVCl6dHVzZWMpIC8gMTAwMDAwMC4wOworICAgICAgICAgIHNwcmludGYodnZidWYsIiVmIixmKTsgICAgICAgIC8qIFNBRkUgKi8KKyAgICAgICAgICByZXR1cm4odnZidWYpOworICAgICAgfQorI2VuZGlmIC8qIEdGVElNRVIgKi8KKworI2lmbmRlZiBOT0hUVFAKKyAgICAgIGNhc2UgVk5fSFRUUF9DOiB7ICAgICAgICAgICAgICAgICAvKiBIVFRQIENvZGUgKi8KKyAgICAgICAgICBleHRlcm4gaW50IGh0dHBfY29kZTsKKyAgICAgICAgICByZXR1cm4oY2tpdG9hKGh0dHBfY29kZSkpOworICAgICAgfQorICAgICAgY2FzZSBWTl9IVFRQX046ICAgICAgICAgICAgICAgICAgIC8qIEhUVFAgQ29ubmVjdGVkICovCisgICAgICAgIHJldHVybiggaHR0cF9pc2Nvbm5lY3RlZCgpID8gIjEiIDogIjAiKTsKKyAgICAgIGNhc2UgVk5fSFRUUF9IOiAgICAgICAgICAgICAgICAgICAvKiBIVFRQIEhvc3QgKi8KKyAgICAgICAgcmV0dXJuKCAoY2hhciAqKWh0dHBfaG9zdCgpICk7CisgICAgICBjYXNlIFZOX0hUVFBfTTogeyAgICAgICAgICAgICAgICAgLyogSFRUUCBNZXNzYWdlICovCisgICAgICAgICAgZXh0ZXJuIGNoYXIgaHR0cF9yZXBseV9zdHJbXTsKKyAgICAgICAgICByZXR1cm4oKGNoYXIgKilodHRwX3JlcGx5X3N0cik7CisgICAgICB9CisgICAgICBjYXNlIFZOX0hUVFBfUzogICAgICAgICAgICAgICAgICAgLyogSFRUUCBTZWN1cml0eSAqLworICAgICAgICByZXR1cm4oKGNoYXIgKilodHRwX3NlY3VyaXR5KCkpOworI2VuZGlmIC8qIE5PSFRUUCAqLworCisjaWZkZWYgTkVXRlRQCisgICAgICBjYXNlIFZOX0ZUUF9COgorICAgICAgICByZXR1cm4oKGNoYXIgKilmdHBfY3BsX21vZGUoKSk7CisgICAgICBjYXNlIFZOX0ZUUF9EOgorICAgICAgICByZXR1cm4oKGNoYXIgKilmdHBfZHBsX21vZGUoKSk7CisgICAgICBjYXNlIFZOX0ZUUF9aOgorICAgICAgICByZXR1cm4oKGNoYXIgKilmdHBfYXV0aHR5cGUoKSk7CisgICAgICBjYXNlIFZOX0ZUUF9DOiB7CisgICAgICAgICAgZXh0ZXJuIGludCBmdHBjb2RlOworICAgICAgICAgIHJldHVybihja2l0b2EoZnRwY29kZSkpOworICAgICAgfQorICAgICAgY2FzZSBWTl9GVFBfTTogeworICAgICAgICAgIGV4dGVybiBjaGFyIGZ0cF9yZXBseV9zdHJbXTsKKyAgICAgICAgICBpZiAoaXNkaWdpdChmdHBfcmVwbHlfc3RyWzBdKSAmJgorICAgICAgICAgICAgICBpc2RpZ2l0KGZ0cF9yZXBseV9zdHJbMV0pICYmCisgICAgICAgICAgICAgIGlzZGlnaXQoZnRwX3JlcGx5X3N0clsyXSkgJiYKKyAgICAgICAgICAgICAgZnRwX3JlcGx5X3N0clszXSA9PSAnICcpCisgICAgICAgICAgICByZXR1cm4oJmZ0cF9yZXBseV9zdHJbNF0pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybihmdHBfcmVwbHlfc3RyKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fRlRQX1M6IHsKKyAgICAgICAgICBleHRlcm4gY2hhciBmdHBfc3J2dHlwW107CisgICAgICAgICAgcmV0dXJuKChjaGFyICopZnRwX3NydnR5cCk7CisgICAgICB9CisgICAgICBjYXNlIFZOX0ZUUF9IOiB7CisgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBmdHBfaG9zdDsKKyAgICAgICAgICByZXR1cm4oZnRwX2hvc3QgPyBmdHBfaG9zdCA6ICIiKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fRlRQX1g6IHsgICAgICAgICAgICAgICAgICAvKiBGVFAgQ29ubmVjdGVkICovCisgICAgICAgICAgZXh0ZXJuIGludCBmdHBpc2Nvbm5lY3RlZCgpOworICAgICAgICAgIHJldHVybihmdHBpc2Nvbm5lY3RlZCgpID8gIjEiIDogIjAiKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fRlRQX0w6IHsgICAgICAgICAgICAgICAgICAvKiBGVFAgTG9nZ2VkIGluICovCisgICAgICAgICAgZXh0ZXJuIGludCBmdHBpc2xvZ2dlZGluKCk7CisgICAgICAgICAgcmV0dXJuKGZ0cGlzbG9nZ2VkaW4oKSA/ICIxIiA6ICIwIik7CisgICAgICB9CisgICAgICBjYXNlIFZOX0ZUUF9HOiB7ICAgICAgICAgICAgICAgICAgLyogRlRQIEdFVC1QVVQtUkVNT1RFICovCisgICAgICAgICAgZXh0ZXJuIGludCBmdHBnZXQ7CisgICAgICAgICAgY2hhciAqIHMgPSAiIjsKKyAgICAgICAgICBzd2l0Y2ggKGZ0cGdldCkgeworICAgICAgICAgICAgY2FzZSAwOiBzID0gImtlcm1pdCI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiBzID0gImZ0cCI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBzID0gImF1dG8iOyBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuKHMpOworICAgICAgfQorI2VuZGlmIC8qIE5FV0ZUUCAqLworCisjaWZuZGVmIE5PTE9DQUwKKyAgICAgIGNhc2UgVk5fQ1hfU1RBOiB7ICAgICAgICAgICAgICAgICAvKiBDT05ORUNUIHN0YXR1cyAqLworICAgICAgICAgIGV4dGVybiBpbnQgY3hfc3RhdHVzOworICAgICAgICAgIHJldHVybihja2l0b2EoY3hfc3RhdHVzKSk7CisgICAgICB9CisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgICAgY2FzZSBWTl9OT1c6ICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVzdGFtcCAqLworICAgICAgICByZXR1cm4oY2tjdnRkYXRlKHAsMCkpOworCisgICAgICBjYXNlIFZOX0hPVVI6ICAgICAgICAgICAgICAgICAgICAgLyogSG91ciBvZiB0aGUgZGF5ICovCisgICAgICAgIHp0aW1lKCZwKTsgICAgICAgICAgICAgICAgICAgICAgLyogIlRodSBGZWIgIDggMTI6MDA6MDAgMTk5MCIgKi8KKyAgICAgICAgaWYgKCFwKSBwID0gIiI7CisgICAgICAgIGlmICghKnApIHJldHVybihwKTsKKyAgICAgICAgdnZidWZbMF0gPSBwWzExXTsKKyAgICAgICAgdnZidWZbMV0gPSBwWzEyXTsKKyAgICAgICAgdnZidWZbMl0gPSBOVUw7CisgICAgICAgIHJldHVybih2dmJ1Zik7ICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiBpdCAqLworCisgICAgICBjYXNlIFZOX0xPR19DT046CQkJLyogXHYoLi4uKSBmb3IgbG9nIGZpbGVzICovCisjaWZkZWYgQ0tMT0dESUFMCisgICAgICAgIHJldHVybihkaWFmaWwpOworI2Vsc2UgCisgICAgICAgIHJldHVybigiIik7CisjZW5kaWYKKyAgICAgIGNhc2UgVk5fTE9HX1BLVDoKKyNpZm5kZWYgTk9YRkVSCisgICAgICAgIHJldHVybihwa3RmaWwpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuKCIiKTsKKyNlbmRpZgorICAgICAgY2FzZSBWTl9MT0dfU0VTOgorI2lmbmRlZiBOT0xPQ0FMCisgICAgICAgIHJldHVybihzZXNmaWwpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuKCIiKTsKKyNlbmRpZgorICAgICAgY2FzZSBWTl9MT0dfVFJBOgorI2lmZGVmIFRMT0cKKyAgICAgICAgcmV0dXJuKHRyYWZpbCk7CisjZWxzZQorICAgICAgICByZXR1cm4oIiIpOworI2VuZGlmCisgICAgICBjYXNlIFZOX0xPR19ERUI6CisjaWZkZWYgREVCVUcKKyAgICAgICAgcmV0dXJuKGRlYmZpbCk7CisjZWxzZQorICAgICAgICByZXR1cm4oIiIpOworI2VuZGlmCisgICAgfQorCisjaWZuZGVmIE5PRElBTAorICAgIHN3aXRjaCAoeSkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxlciBJRCB2YWx1ZXMgKi8KKyAgICAgIGV4dGVybiBjaGFyCisgICAgICAgICogY2FsbGlkX2RhdGUsICogY2FsbGlkX3RpbWUsICogY2FsbGlkX25hbWUsCisgICAgICAgICogY2FsbGlkX25tYnIsICogY2FsbGlkX21lc2c7CisKKyAgICAgIGNhc2UgVk5fQ0lfREE6CisgICAgICAgIHJldHVybihjYWxsaWRfZGF0ZSA/IGNhbGxpZF9kYXRlIDogIiIpOworCisgICAgICBjYXNlIFZOX0NJX1RJOgorICAgICAgICByZXR1cm4oY2FsbGlkX3RpbWUgPyBjYWxsaWRfdGltZSA6ICIiKTsKKworICAgICAgY2FzZSBWTl9DSV9OQToKKyAgICAgICAgcmV0dXJuKGNhbGxpZF9uYW1lID8gY2FsbGlkX25hbWUgOiAiIik7CisKKyAgICAgIGNhc2UgVk5fQ0lfTlU6CisgICAgICAgIHJldHVybihjYWxsaWRfbm1iciA/IGNhbGxpZF9ubWJyIDogIiIpOworCisgICAgICBjYXNlIFZOX0NJX01FOgorICAgICAgICByZXR1cm4oY2FsbGlkX21lc2cgPyBjYWxsaWRfbWVzZyA6ICIiKTsKKworICAgIH0gLyogRW5kIG9mIHZhcmlhYmxlLW5hbWUgc3dpdGNoZXMgKi8KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworI2lmZGVmIE5UCisgICAgc3dpdGNoICh5KSB7CisgICAgICBjYXNlIFZOX1BFUlNPTkFMOgorICAgICAgICBwID0gKGNoYXIgKilHZXRQZXJzb25hbCgpOworICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgR2V0U2hvcnRQYXRoTmFtZShwLHZ2YnVmLFZWQlVGTCk7CisgICAgICAgICAgICByZXR1cm4odnZidWYpOworICAgICAgICB9CisgICAgICAgIHJldHVybigiIik7CisgICAgICBjYXNlIFZOX0RFU0tUT1A6CisgICAgICAgICAgcCA9IChjaGFyICopR2V0RGVza3RvcCgpOworICAgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICAgIEdldFNob3J0UGF0aE5hbWUocCx2dmJ1ZixWVkJVRkwpOworICAgICAgICAgICAgICByZXR1cm4odnZidWYpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4oIiIpOworICAgICAgY2FzZSBWTl9DT01NT046CisgICAgICAgIHAgPSAoY2hhciAqKUdldEFwcERhdGEoMSk7CisgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICBja21ha21zZyh2dmJ1ZixWVkJVRkwscCwiS2VybWl0IDk1LyIsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgIEdldFNob3J0UGF0aE5hbWUodnZidWYsdnZidWYsVlZCVUZMKTsKKyAgICAgICAgICAgIHJldHVybih2dmJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKCIiKTsKKyAgICAgIGNhc2UgVk5fQVBQREFUQToKKyAgICAgICAgcCA9IChjaGFyICopR2V0QXBwRGF0YSgwKTsKKyAgICAgICAgaWYgKHApIHsKKyAgICAgICAgICAgIGNrbWFrbXNnKHZ2YnVmLFZWQlVGTCxwLCJLZXJtaXQgOTUvIixOVUxMLE5VTEwpOworICAgICAgICAgICAgR2V0U2hvcnRQYXRoTmFtZSh2dmJ1Zix2dmJ1ZixWVkJVRkwpOworICAgICAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oIiIpOworICAgIH0KKyNlbmRpZiAvKiBOVCAqLworCisjaWZkZWYgVE5fQ09NUE9SVAorICAgIHN3aXRjaCAoeSkgeworICAgICAgY2FzZSBWTl9UTkNfU0lHOiB7CisgICAgICAgIHAgPSAoY2hhciAqKSB0bmNfZ2V0X3NpZ25hdHVyZSgpOworICAgICAgICBja3N0cm5jcHkodnZidWYscCA/IHAgOiAiIixWVkJVRkwpOworICAgICAgICByZXR1cm4odnZidWYpOworICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisKKyNpZmRlZiBLVUkKKyAgICBzd2l0Y2ggKHkpIHsKKyAgICAgIGNhc2UgVk5fR1VJX1JVTjogeworCSAgZXh0ZXJuIEhXTkQgZ2V0SHduZEtVSSgpOworCSAgaWYgKCBJc0ljb25pYyhnZXRId25kS1VJKCkpICkKKyAgICAgICAgICAgIHJldHVybigibWluaW1pemVkIik7CisJICBpZiAoIElzWm9vbWVkKGdldEh3bmRLVUkoKSkgKQorICAgICAgICAgICAgcmV0dXJuKCJtYXhpbWl6ZWQiKTsKKwkgIHJldHVybigicmVzdG9yZWQiKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgVk5fR1VJX1hQOgorICAgICAgICBzcHJpbnRmKHZ2YnVmLCIlZCIsZ2V0X2d1aV93aW5kb3dfcG9zX3goKSk7ICAvKiBTQUZFICovCisgICAgICAgIHJldHVybih2dmJ1Zik7CisgICAgICBjYXNlIFZOX0dVSV9ZUDoKKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwiJWQiLGdldF9ndWlfd2luZG93X3Bvc195KCkpOyAgLyogU0FGRSAqLworICAgICAgICByZXR1cm4odnZidWYpOworICAgICAgY2FzZSBWTl9HVUlfWFI6CisgICAgICAgIHNwcmludGYodnZidWYsIiVkIixHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKSk7ICAvKiBTQUZFICovCisgICAgICAgIHJldHVybih2dmJ1Zik7CisgICAgICBjYXNlIFZOX0dVSV9ZUjoKKyAgICAgICAgc3ByaW50Zih2dmJ1ZiwiJWQiLEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pKTsgIC8qIFNBRkUgKi8KKyAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKyAgICAgIGNhc2UgVk5fR1VJX0ZOTToKKyAgICAgICAgICBpZiAoIG50ZXJtZm9udCA+IDAgKSB7CisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnRlcm1mb250OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgIGlmICh0dF9mb250ID09IHRlcm1fZm9udFtpXS5rd3ZhbCkgeworICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh2dmJ1Zix0ZXJtX2ZvbnRbaV0ua3dkLFZWQlVGTCk7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHZ2YnVmKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4oIih1bmtub3duKSIpOworICAgICAgY2FzZSBWTl9HVUlfRlNaOgorICAgICAgICAgIGNrc3RybmNweSh2dmJ1Zixja2l0b2EodHRfZm9udF9zaXplLzIpLFZWQlVGTCk7CisgICAgICAgICAgaWYgKCB0dF9mb250X3NpemUgJSAyICkKKyAgICAgICAgICAgICAgY2tzdHJuY2F0KHZ2YnVmLCIuNSIsVlZCVUZMKTsKKyAgICAgICAgICByZXR1cm4odnZidWYpOworICAgIH0KKyNlbmRpZiAvKiBLVUkgKi8KKworICAgIGZuc3VjY2VzcyA9IDA7CisgICAgaWYgKGZuZXJyb3IpIHsKKyAgICAgICAgZm5zdWNjZXNzID0gMDsKKyAgICB9CisgICAgaWYgKGZuZGlhZ3MpIHsKKyAgICAgICAgaWYgKCFlbWJ1ZikKKyAgICAgICAgICBja3N0cm5jcHkoZW1idWYsIjxFUlJPUjpOT19TVUNIX1ZBUklBQkxFPiIsRU1CVUZMRU4pOworICAgICAgICBwcmludGYoIj8lc1xuIixlbWJ1Zik7CisgICAgICAgIHJldHVybigoY2hhciAqKWVtYnVmKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybigiIik7Cit9CisjZW5kaWYgLyogTk9TUEwgKi8KKworCisvKgorICBYIFggUyBUIFIgSSBOIEcgIC0tICBFeHBhbmQgdmFyaWFibGVzIGFuZCBiYWNrc2xhc2ggY29kZXMuCisKKyAgICBpbnQgeHh0c3RyaW5nKHMsJnMyLCZuKTsKKworICBFeHBhbmRzIFwgZXNjYXBlcyB2aWEgcmVjdXJzaXZlIGRlc2NlbnQuCisgIEFyZ3VtZW50IHMgaXMgYSBwb2ludGVyIHRvIHN0cmluZyB0byBleHBhbmQgKHNvdXJjZSkuCisgIEFyZ3VtZW50IHMyIGlzIHRoZSBhZGRyZXNzIG9mIHdoZXJlIHRvIHB1dCByZXN1bHQgKGRlc3RpbmF0aW9uKS4KKyAgQXJndW1lbnQgbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcgKHRvIHByZXZlbnQgb3ZlcnJ1bnMpLgorICBSZXR1cm5zIC0xIG9uIGZhaWx1cmUsIDAgb24gc3VjY2VzcywKKyAgICB3aXRoIGRlc3RpbmF0aW9uIHN0cmluZyBudWxsLXRlcm1pbmF0ZWQgYW5kIHMyIHBvaW50aW5nIHRvIHRoZQorICAgIHRlcm1pbmF0aW5nIG51bGwsIHNvIHRoYXQgc3Vic2VxdWVudCBjaGFyYWN0ZXJzIGNhbiBiZSBhZGRlZC4KKyovCisKKyNkZWZpbmUgWFhERVBMSU0gMTAwICAgICAgICAgICAgICAgICAgICAvKiBSZWN1cnNpb24gZGVwdGggbGltaXQgKi8KKy8qCisgIEluIFdpbmRvd3MgdGhlIHN0YWNrIGlzIGxpbWl0ZWQgdG8gMjU2SyBzbyBiaWcgY2hhcmFjdGVyIGFycmF5cyBsaWtlCisgIHZuYW1idWYgY2FuJ3QgYmUgb24gdGhlIHN0YWNrIGluIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgbGlrZSB6enN0cmluZygpLgorICBCdXQgdGhhdCdzIG5vIHJlYXNvbiB1c2UgbWFsbG9jKCkgaW4gVW5peCBvciBWTVMsIHdoaWNoIGRvbid0IGhhdmUKKyAgdGhpcyBraW5kIG9mIHJlc3RyaWN0aW9uLgorKi8KKyNpZmRlZiBEVk5BTUJVRgkJCQkvKiBEeW5hbWljIHZuYW1idWZbXSAqLworI3VuZGVmIERWTkFNQlVGCQkJCS8qIENsZWFuIHNsYXRlICovCisjZW5kaWYgLyogRFZOQU1CVUYgKi8KKworI2lmbmRlZiBOT1NQTAkJCQkvKiBPbmx5IGlmIFNQTCBpbmNsdWRlZCAqLworI2lmZGVmIE9TMgkJCQkvKiBPbmx5IGZvciBLOTUgKi8KKyNkZWZpbmUgRFZOQU1CVUYKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCitpbnQKK3p6c3RyaW5nKHMsczIsbikgY2hhciAqczsgY2hhciAqKnMyOyBpbnQgKm47IHsKKyAgICBpbnQgeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNoYXJhY3RlciAqLworICAgICAgICB5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdvcmtlciAqLworICAgICAgICBwcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhcmVuIGxldmVsICovCisgICAgICAgIGtwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnJhY2UgbGV2ZWwgKi8KKyAgICAgICAgYXJnbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBhcmd1bWVudCBjb3VudGVyICovCisgICAgICAgIG4yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9jYWwgY29weSBvZiBuICovCisgICAgICAgIGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXJyYXkgZGltZW5zaW9uICovCisgICAgICAgIHZiaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFyaWFibGUgaWQgKGludGVnZXIgZm9ybSkgKi8KKyAgICAgICAgYXJnbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdHJpbmcgYXJndW1lbnQgbGVuZ3RoICovCisgICAgICAgIG54OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSBvcmlnaW5hbCBsZW5ndGggKi8KKworICAgIGNoYXIgdmIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhcmlhYmxlIGlkIChjaGFyIGZvcm0pICovCisgICAgICAgICp2cCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB2YXJpYWJsZSBkZWZpbml0aW9uICovCisgICAgICAgICpuZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9jYWwgcG9pbnRlciB0byB0YXJnZXQgc3RyaW5nICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAqb2xkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgb3JpZ2luYWwgdGFyZ2V0IHBvaW50ZXIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICpwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29ya2VyICovCisgICAgICAgICpxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29ya2VyICovCisgICAgICAgICpzMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29ya2VyICovCisgICAgaW50ICB4MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29ya2VyICovCisgICAgY2hhciAqciAgPSAoY2hhciAqKTA7ICAgICAgICAgICAgICAgLyogRm9yIGhvbGRpbmcgZnVuY3Rpb24gYXJncyAqLworICAgIGNoYXIgKnIyID0gKGNoYXIgKikwOworICAgIGNoYXIgKnIzcDsKKworI2lmbmRlZiBOT1NQTAorI2lmZGVmIERWTkFNQlVGCisgICAgY2hhciAqIHZuYW1idWYgPSBOVUxMOyAgICAgICAgICAgICAgLyogQnVmZmVyIGZvciB2YXJpYWJsZS9mdW5jdGlvbiBuYW1lICovCisjZWxzZSAvKiBEVk5BTUJVRiAqLworICAgIGNoYXIgdm5hbWJ1ZltWTkFNTF07ICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBmb3IgdmFyaWFibGUvZnVuY3Rpb24gbmFtZSAqLworI2VuZGlmIC8qIERWTkFNQlVGICovCisgICAgY2hhciAqYXJncFtGTkFSR1NdOyAgICAgICAgICAgICAgICAgLyogUG9pbnRlcnMgdG8gZnVuY3Rpb24gYXJncyAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICBzdGF0aWMgaW50IGRlcHRoID0gMDsgICAgICAgICAgICAgICAvKiBDYWxsIGRlcHRoLCBhdm9pZCBvdmVyZmxvdyAqLworCisgICAgbjIgPSAqbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFrZSBsb2NhbCBjb3BpZXMgb2YgYXJncyAqLworICAgIG54ID0gbjI7CisKKyAgICBuZXcgPSAqczI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3Igb25lIGxlc3MgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKyNpZmRlZiBDT01NRU5UCisgICAgb2xkID0gbmV3OworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIGlzcGF0dGVybiA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBcZnBhdHRlcm4oKSAqLworICAgIGlzam9pbiA9IDA7CQkJCS8qIEZvciBcZmpvaW4oKSAqLworI2VuZGlmIC8qIE5PU1BMICovCisgICAgZGVwdGgrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2luayB0byBhIG5ldyBkZXB0aCAqLworICAgIGlmIChkZXB0aCA+IFhYREVQTElNKSB7ICAgICAgICAgICAgIC8qIFRvbyBkZWVwPyAqLworICAgICAgICBwcmludGYoIj9kZWZpbml0aW9uIGlzIGNpcmN1bGFyIG9yIHRvbyBkZWVwXG4iKTsKKyAgICAgICAgZGVidWcoRjEwMSwienpzdHJpbmcgZmFpbCIsIiIsZGVwdGgpOworICAgICAgICBkZXB0aCA9IDA7CisgICAgICAgICpuZXcgPSBOVUw7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGlmICghcyB8fCAhbmV3KSB7ICAgICAgICAgICAgICAgICAgIC8qIFdhdGNoIG91dCBmb3IgbnVsbCBwb2ludGVycyAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJ6enN0cmluZyBmYWlsIDIiLCIiLGRlcHRoKTsKKyAgICAgICAgaWYgKG5ldykKKyAgICAgICAgICAqbmV3ID0gTlVMOworICAgICAgICBkZXB0aCA9IDA7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIHMzID0gczsKKyAgICBhcmdsID0gMDsKKyAgICB3aGlsZSAoKnMzKyspIGFyZ2wrKzsgICAgICAgICAgICAgIC8qIEdldCBsZW5ndGggb2Ygc291cmNlIHN0cmluZyAqLworICAgIGRlYnVnKEYwMTAsInp6c3RyaW5nIGVudHJ5IixzLDApOworICAgIGlmIChhcmdsID09IDApIHsgICAgICAgICAgICAgICAgICAgIC8qIEVtcHR5IHN0cmluZyAqLworICAgICAgICBkZWJ1ZyhGMTExLCJ6enN0cmluZyBlbXB0eSBhcmciLHMsYXJnbCk7CisgICAgICAgIGRlcHRoID0gMDsKKyAgICAgICAgKm5ldyA9IE5VTDsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBpZiAoYXJnbCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAvKiBXYXRjaCBvdXQgZm9yIGdhcmJhZ2UgKi8KKyAgICAgICAgZGVidWcoRjEwMSwienpzdHJpbmcgZmFpbCAzIiwiIixkZXB0aCk7CisgICAgICAgICpuZXcgPSBOVUw7CisgICAgICAgIGRlcHRoID0gMDsKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisjaWZkZWYgRFZOQU1CVUYKKyAgICBkZWJ1ZyhGMTAwLCJ2bmFtYnVmIG1hbGxvYy4uLiIsIiIsMCk7CisgICAgdm5hbWJ1ZiA9IG1hbGxvYyhWTkFNTCk7CisgICAgaWYgKHZuYW1idWYgPT0gTlVMTCkgeworICAgICAgICBwcmludGYoIj9PdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGRlYnVnKEYxMDAsInZuYW1idWYgbWFsbG9jIG9rIiwiIiwwKTsKKyNlbmRpZiAvKiBEVk5BTUJVRiAqLworCisgICAgd2hpbGUgKCh4ID0gKnMpKSB7ICAgICAgICAgICAgICAgICAgLyogTG9vcCBmb3IgYWxsIGNoYXJhY3RlcnMgKi8KKyAgICAgICAgaWYgKHggIT0gQ01EUSkgeyAgICAgICAgICAgICAgICAvKiBJcyBpdCB0aGUgY29tbWFuZC1xdW90ZSBjaGFyPyAqLworICAgICAgICAgICAgKm5ldysrID0gKnMrKzsgICAgICAgICAgICAgIC8qIE5vLCBub3JtYWwgY2hhciwganVzdCBjb3B5ICovCisgICAgICAgICAgICBpZiAoLS1uMiA8IDApIHsgICAgICAgICAgICAgLyogYW5kIGNvdW50IGl0LCBjYXJlZnVsIG9mIG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwienpzdHJpbmcgb3ZlcmZsb3cgMSIsIiIsZGVwdGgpOworICAgICAgICAgICAgICAgIGRlcHRoID0gMDsKKyNpZmRlZiBEVk5BTUJVRgorICAgICAgICAgICAgICAgIGlmICh2bmFtYnVmKSBmcmVlKHZuYW1idWYpOworI2VuZGlmIC8qIERWTkFNQlVGICovCisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKy8qIFdlIGhhdmUgdGhlIGNvbW1hbmQtcXVvdGUgY2hhcmFjdGVyLiAqLworCisgICAgICAgIHggPSAqKHMrMSk7ICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyLiAqLworICAgICAgICBpZiAoaXN1cHBlcih4KSkgeCA9IHRvbG93ZXIoeCk7CisgICAgICAgIHN3aXRjaCAoeCkgeyAgICAgICAgICAgICAgICAgICAgLyogQWN0IGFjY29yZGluZyB0byB2YXJpYWJsZSB0eXBlICovCisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgLyogSXQncyBhIGxvbmUgYmFja3NsYXNoICovCisgICAgICAgICAgICAqbmV3KysgPSAqcysrOworICAgICAgICAgICAgaWYgKC0tbjIgPCAwKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwienpzdHJpbmcgb3ZlcmZsb3cgMiIsIiIsMCk7CisjaWZkZWYgRFZOQU1CVUYKKyAgICAgICAgICAgICAgICBpZiAodm5hbWJ1ZikgZnJlZSh2bmFtYnVmKTsKKyNlbmRpZiAvKiBEVk5BTUJVRiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICclJzogICAgICAgICAgICAgICAgICAgICAvKiBWYXJpYWJsZSAqLworICAgICAgICAgICAgcyArPSAyOyAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbGV0dGVyIG9yIGRpZ2l0ICovCisgICAgICAgICAgICB2YiA9ICpzKys7ICAgICAgICAgICAgICAgICAgLyogYW5kIG1vdmUgc291cmNlIHBvaW50ZXIgcGFzdCBpdCAqLworICAgICAgICAgICAgdnAgPSBOVUxMOyAgICAgICAgICAgICAgICAgIC8qIEFzc3VtZSBkZWZpbml0aW9uIGlzIGVtcHR5ICovCisgICAgICAgICAgICBpZiAodmIgPj0gJzAnICYmIHZiIDw9ICc5JykgeyAvKiBEaWdpdCBmb3IgbWFjcm8gYXJnICovCisgICAgICAgICAgICAgICAgaWYgKG1hY2x2bCA8IDApICAgICAgICAgLyogRGlnaXQgdmFyaWFibGVzIGFyZSBnbG9iYWwgKi8KKyAgICAgICAgICAgICAgICAgIHZwID0gZ192YXJbdmJdOyAgICAgICAvKiBpZiBubyBtYWNybyBpcyBhY3RpdmUgKi8KKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2UgKi8KKyAgICAgICAgICAgICAgICAgIHZwID0gbV9hcmdbbWFjbHZsXVt2YiAtICcwJ107IC8qIHRoZXkncmUgb24gdGhlIHN0YWNrICovCisgICAgICAgICAgICB9IGVsc2UgaWYgKHZiID09ICcqJykgeyAgICAgLyogTWFjcm8gYXJncyBzdHJpbmcgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgLyogVGhpcyBkb2Vzbid0IHRha2UgY2hhbmdlcyBpbnRvIGFjY291bnQgKi8KKyAgICAgICAgICAgICAgICB2cCA9IChtYWNsdmwgPj0gMCkgPyBtX2xpbmVbbWFjbHZsXSA6IHRvcGxpbmU7CisgICAgICAgICAgICAgICAgaWYgKCF2cCkgdnAgPSAiIjsKKyNlbHNlCisJCWNoYXIgKiBzcyA9IG5ldzsKKyAgICAgICAgICAgICAgICBpZiAoenpzdHJpbmcoIlxcZmpvaW4oJl9bXSwsMSkiLCZuZXcsJm4yKSA8IDApIHsKKyNpZmRlZiBEVk5BTUJVRgorCQkgICAgaWYgKHZuYW1idWYpIGZyZWUodm5hbWJ1Zik7CisjZW5kaWYgLyogRFZOQU1CVUYgKi8KKwkJICAgIHJldHVybigtMSk7CisJCX0KKwkJZGVidWcoRjExMCwienpzdHJpbmcgXFwlKiIsc3MsMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaXN1cHBlcih2YikpIHZiICs9ICgnYSctJ0EnKTsKKyAgICAgICAgICAgICAgICB2cCA9IGdfdmFyW3ZiXTsgICAgICAgICAvKiBMZXR0ZXIgZm9yIGdsb2JhbCB2YXJpYWJsZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF2cCkgdnAgPSAiIjsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICBpZiAodnApIHsgICAgICAgICAgICAgICAgICAgLyogSWYgZGVmaW5pdGlvbiBub3QgZW1wdHkgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgZGVidWcoRjAxMCwienpzdHJpbmcgJW4gdnAiLHZwLDApOworICAgICAgICAgICAgICAgIGlmICh6enN0cmluZyh2cCwmbmV3LCZuMikgPCAwKSB7IC8qIGNhbGwgc2VsZiB0byBldmFsdWF0ZSBpdCAqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6enN0cmluZyBmYWlsIDYiLCIiLGRlcHRoKTsKKyNpZmRlZiBEVk5BTUJVRgorICAgICAgICAgICAgICAgICAgICBpZiAodm5hbWJ1ZikgZnJlZSh2bmFtYnVmKTsKKyNlbmRpZiAvKiBEVk5BTUJVRiAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOyAgICAgICAgIC8qIFBhc3MgYWxvbmcgZmFpbHVyZSAqLworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInp6c3RyaW5nICVuIHZwIiwiKE5VTEwpIiwwKTsKKyAgICAgICAgICAgICAgICBuMiA9IG54OworICAgICAgICAgICAgICAgIG5ldyA9IG9sZDsKKyAgICAgICAgICAgICAgICAqbmV3ID0gTlVMOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJyYnOiAgICAgICAgICAgICAgICAgICAgIC8qIEFuIGFycmF5IHJlZmVyZW5jZSAqLworICAgICAgICAgICAgeCA9IGFycmF5bmFtKHMsJnZiaSwmZCk7ICAgIC8qIEdldCBuYW1lIGFuZCBzdWJzY3JpcHQgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTEsInp6c3RyaW5nIGFycmF5bmFtIixzLHgpOworICAgICAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwienpzdHJpbmcgZmFpbCA3IiwiIixkZXB0aCk7CisjaWZkZWYgRFZOQU1CVUYKKyAgICAgICAgICAgICAgICBpZiAodm5hbWJ1ZikgZnJlZSh2bmFtYnVmKTsKKyNlbmRpZiAvKiBEVk5BTUJVRiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogQnJhY2tldCBjb3VudGVyICovCisgICAgICAgICAgICB3aGlsZSAoKnMpIHsgICAgICAgICAgICAgICAgLyogQWR2YW5jZSBzb3VyY2UgcG9pbnRlci4uLiAqLworICAgICAgICAgICAgICAgIGlmICgqcyA9PSAnWycpIHBwKys7CisgICAgICAgICAgICAgICAgaWYgKCpzID09ICddJyAmJiAtLXBwID09IDApIGJyZWFrOworICAgICAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqcyA9PSAnXScpIHMrKzsgICAgICAgICAvKiAuLi5wYXN0IHRoZSBjbG9zaW5nIGJyYWNrZXQuICovCisKKyAgICAgICAgICAgIHggPSBjaGthcnJheSh2YmksZCk7ICAgICAgICAvKiBBcnJheSBpcyBkZWNsYXJlZD8gKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInp6c3RyaW5nIGNoa2FycmF5IiwiIix4KTsKKyAgICAgICAgICAgIGlmICh4ID4gMCkgeworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgICAgICBjaGFyICogczEgPSBOVUxMOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgICAgICB2YmkgLT0gQVJSQVlCQVNFOyAgICAgICAvKiBDb252ZXJ0IG5hbWUgdG8gaW5kZXggKi8KKworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgICAgICBpZiAodmJpID09IDApIHsgICAgICAgICAvKiBBcmd1bWVudCB2ZWN0b3IgYXJyYXkgKi8KKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiogdG9wYXJnLCAqKiBtX3hhcmdbXTsKKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBuX3hhcmdbXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hY2x2bCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3BhcmdjID49IGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMSA9IHRvcGFyZ1tkXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuX3hhcmdbbWFjbHZsXSA+PSBkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgczEgPSBtX3hhcmdbbWFjbHZsXVtkXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoczEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6enN0cmluZyhzMSwmbmV3LCZuMikgPCAwKSB7IC8qIGV2YWx1YXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwienpzdHJpbmcgZmFpbCA3LjUiLCIiLGRlcHRoKTsKKyNpZmRlZiBEVk5BTUJVRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2bmFtYnVmKSBmcmVlKHZuYW1idWYpOworI2VuZGlmIC8qIERWTkFNQlVGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsgLyogUGFzcyBhbG9uZyBmYWlsdXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbGQgPSBuZXc7ICovCisgICAgICAgICAgICAgICAgICAgICAgICBuMiA9IG54OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgaWYgKGFfZGltW3ZiaV0gPj0gZCkgeyAvKiBJZiBzdWJzY3JpcHQgaW4gcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgY2hhciAqKmFwOworI2lmbmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInp6c3RyaW5nIGFfcHRyW3ZiaV0iLGFfcHRyW3ZiaV0sMCk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInp6c3RyaW5nIGFfcHRyW3ZiaV1bZF0iLGFfcHRyW3ZiaV1bZF0sMCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgICBhcCA9IGFfcHRyW3ZiaV07ICAgIC8qIGdldCBkYXRhIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFwKSB7ICAgICAgICAgICAvKiBhbmQgaWYgdGhlcmUgaXMgb25lICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBbZF0pIHsgICAgLyogSWYgZGVmaW5pdGlvbiBub3QgZW1wdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ6enN0cmluZyBhcFtkXSIsYXBbZF0sZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHp6c3RyaW5nKGFwW2RdLCZuZXcsJm4yKSA8IDApIHsgLyogZXZhbHVhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwienpzdHJpbmcgZmFpbCA4IiwiIixkZXB0aCk7CisjaWZkZWYgRFZOQU1CVUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZuYW1idWYpIGZyZWUodm5hbWJ1Zik7CisjZW5kaWYgLyogRFZOQU1CVUYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsgLyogUGFzcyBhbG9uZyBmYWlsdXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogb2xkID0gbmV3OyAqLworICAgICAgICAgICAgICAgICAgICAgICAgbjIgPSBueDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwkgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICdmJzogICAgICAgICAgICAgICAgICAgICAvKiBBIGJ1aWx0aW4gZnVuY3Rpb24gKi8KKyAgICAgICAgICAgIHEgPSB2bmFtYnVmOyAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBuYW1lICovCisgICAgICAgICAgICB5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogaW50byBhIHNlcGFyYXRlIGJ1ZmZlciAqLworICAgICAgICAgICAgcyArPSAyOyAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50IHBhc3QgJ0YnICovCisgICAgICAgICAgICB3aGlsZSAoeSsrIDwgVk5BTUwpIHsKKyAgICAgICAgICAgICAgICBpZiAoKnMgPT0gJygnKSB7IHMrKzsgYnJlYWs7IH0gLyogTG9vayBmb3Igb3BlbiBwYXJlbiAqLworICAgICAgICAgICAgICAgIGlmICgoKnEgPSAqcykgPT0gTlVMKSBicmVhazsgICAvKiBvciBlbmQgb2Ygc3RyaW5nICovCisgICAgICAgICAgICAgICAgcysrOyBxKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcSA9IE5VTDsgICAgICAgICAgICAgICAgICAgLyogVGVybWluYXRlIGZ1bmN0aW9uIG5hbWUgKi8KKyAgICAgICAgICAgIGlmICh5ID49IFZOQU1MKSB7ICAgICAgICAgICAvKiBIYW5kbGUgcGF0aG9sb2dpY2FsIGNhc2UgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoKnMgJiYgKCpzICE9ICcoJykpIC8qIG9mIHZlcnkgbG9uZyBzdHJpbmcgZW50ZXJlZCAqLworICAgICAgICAgICAgICAgICAgcysrOyAgICAgICAgICAgICAgICAgICAgLyogYXMgZnVuY3Rpb24gbmFtZS4gKi8KKyAgICAgICAgICAgICAgICBpZiAoKnMgPT0gJyknKSBzKys7ICAgICAgIC8qIFNraXAgcGFzdCBpdC4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHIgPSByMiA9IG1hbGxvYyhhcmdsKzIpOyAgICAvKiBBbmQgbWFrZSBhIHBsYWNlIHRvIGNvcHkgYXJncyAqLworICAgICAgICAgICAgLyogZGVidWcoRjEwMSwienpzdHJpbmcgcjIiLCIiLHIyKTsgKi8KKyAgICAgICAgICAgIGlmICghcjIpIHsgICAgICAgICAgICAgICAgICAvKiBXYXRjaCBvdXQgZm9yIG1hbGxvYyBmYWlsdXJlICovCisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwienpzdHJpbmcgZmFpbCA5IiwiIixkZXB0aCk7CisgICAgICAgICAgICAgICAgKm5ldyA9IE5VTDsKKyAgICAgICAgICAgICAgICBkZXB0aCA9IDA7CisjaWZkZWYgRFZOQU1CVUYKKyAgICAgICAgICAgICAgICBpZiAodm5hbWJ1ZikgZnJlZSh2bmFtYnVmKTsKKyNlbmRpZiAvKiBEVk5BTUJVRiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocjMpIGZyZWUocjMpOyAvKiBBbmQgYW5vdGhlciB0byBjb3B5IGxpdGVyYWwgYXJnIHN0cmluZyAqLworICAgICAgICAgICAgcjMgPSBtYWxsb2MoYXJnbCsyKTsKKyAgICAgICAgICAgIC8qIGRlYnVnKEYxMDEsInp6c3RyaW5nIHIzIiwiIixyMyk7ICovCisgICAgICAgICAgICBpZiAoIXIzKSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwienpzdHJpbmcgZmFpbCAxMCIsIiIsZGVwdGgpOworICAgICAgICAgICAgICAgIGRlcHRoID0gMDsKKyAgICAgICAgICAgICAgICAqbmV3ID0gTlVMOworICAgICAgICAgICAgICAgIGlmIChyMikgZnJlZShyMik7CisjaWZkZWYgRFZOQU1CVUYKKyAgICAgICAgICAgICAgICBpZiAodm5hbWJ1ZikgZnJlZSh2bmFtYnVmKTsKKyNlbmRpZiAvKiBEVk5BTUJVRiAqLworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgcjNwID0gcjM7CisgICAgICAgICAgICBhcmduID0gMDsgICAgICAgICAgICAgICAgICAgLyogQXJndW1lbnQgY291bnRlciAqLworICAgICAgICAgICAgYXJncFthcmduKytdID0gcjsgICAgICAgICAgIC8qIFBvaW50IHRvIGZpcnN0IGFyZ3VtZW50ICovCisgICAgICAgICAgICB5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcGxldGlvbiBmbGFnICovCisgICAgICAgICAgICBwcCA9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogUGFyZW4gbGV2ZWwgKGFscmVhZHkgaGF2ZSBvbmUpLiAqLworICAgICAgICAgICAga3AgPSAwOworICAgICAgICAgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgIC8qIENvcHkgZWFjaCBhcmd1bWVudCwgY2hhciBieSBjaGFyLiAqLworICAgICAgICAgICAgICAgICpyM3ArKyA9ICpzOyAgICAgICAgICAgIC8qIFRoaXMgaXMgYSBsaXRlcmFsIGNvcHkgZm9yIFxmbGl0ICovCisgICAgICAgICAgICAgICAgaWYgKCEqcykgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiAoKnMgPT0gJ3snKSB7ICAgICAgICAvKiBMZWZ0IGJyYWNlICovCisgICAgICAgICAgICAgICAgICAgIGtwKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgqcyA9PSAnfScpIHsgICAgICAgIC8qIFJpZ2h0IGJyYWNlICovCisgICAgICAgICAgICAgICAgICAgIGtwLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgqcyA9PSAnKCcgJiYga3AgPD0gMCkgeyAvKiBPcGVuIHBhcmVuIG5vdCBpbiBicmFjZSAqLworICAgICAgICAgICAgICAgICAgICBwcCsrOyAgICAgICAgICAgICAgIC8qIENvdW50IGl0ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpyID0gKnM7ICAgICAgICAgICAgICAgIC8qIE5vdyBjb3B5IHJlc3VsdGluZyBieXRlICovCisgICAgICAgICAgICAgICAgaWYgKCEqcikgICAgICAgICAgICAgICAgLyogSWYgTlVMLCBkb25lLiAqLworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKCpyID09ICcpJyAmJiBrcCA8PSAwKSB7IC8qIENsb3NpbmcgcGFyZW4sIGNvdW50IGl0LiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoLS1wcCA9PSAwKSB7ICAgIC8qIEZpbmFsIG9uZT8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpyID0gTlVMOyAgICAgICAvKiBNYWtlIGl0IGEgdGVybWluYXRpbmcgbnVsbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKihyM3AgLSAxKSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMrKzsgICAgICAgICAgICAvKiBQb2ludCBwYXN0IGl0IGluIHNvdXJjZSBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAxOyAgICAgICAgICAvKiBGbGFnIHdlJ3ZlIGdvdCBhbGwgdGhlIGFyZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBEb25lIHdpdGggd2hpbGUgbG9vcCAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgqciA9PSAnLCcgJiYga3AgPD0gMCkgeyAvKiBDb21tYSAqLworICAgICAgICAgICAgICAgICAgICBpZiAocHAgPT0gMSkgeyAgICAgICAgICAvKiBJZiBub3Qgd2l0aGluICgpJ3MsICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnbiA+PSBGTkFSR1MpIHsgLyogVG9vIG1hbnkgYXJncyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMrKzsgcisrOyAgIC8qIEtlZXAgY29sbGVjdGluZyBmbGl0KCkgc3RyaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAqciA9IE5VTDsgICAgICAgICAgIC8qIE5ldyBhcmcsIHNraXAgcGFzdCBjb21tYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYXJncFthcmduKytdID0gcisxOyAvKiBJbiByYW5nZSwgcG9pbnQgdG8gbmV3IGFyZyAqLworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSBqdXN0IHNraXAgcGFzdCAgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcysrOyByKys7ICAgICAgICAgICAgICAgLyogQWR2YW5jZSBwb2ludGVycyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF5KSAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIGRpZG4ndCBmaW5kIGNsb3NpbmcgcGFyZW4gKi8KKyAgICAgICAgICAgICAgYXJnbiA9IC0xOworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBpZiAoZGVibG9nKSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZbMjRdOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInp6c3RyaW5nIGZ1bmN0aW9uIG5hbWUiLHZuYW1idWYseSk7CisgICAgICAgICAgICAgICAgZGVidWcoRjAxMCwienpzdHJpbmcgZnVuY3Rpb24gcjMiLHIzLDApOworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhcmduOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihidWYsImFyZyAlMmQgIix5KTsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjAxMCxidWYsYXJncFt5XSwwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgICAgIHZwID0gZm5ldmFsKHZuYW1idWYsYXJncCxhcmduLHIzKTsgLyogRXZhbHVhdGUgdGhlIGZ1bmN0aW9uLiAqLworICAgICAgICAgICAgaWYgKHZwKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGRlZmluaXRpb24gbm90IGVtcHR5ICovCisgICAgICAgICAgICAgICAgd2hpbGUgKCgqbmV3KysgPSAqdnArKykpIHsgLyogY29weSBpdCB0byBvdXRwdXQgc3RyaW5nICovCisgICAgICAgICAgICAgICAgICAgIGlmICgtLW4yIDwgMCkgeyAgICAgICAgLyogd2F0Y2ggb3V0IGZvciBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwienpzdHJpbmcgZmFpbCAxMiIsIiIsZGVwdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIyKSB7IGZyZWUocjIpOyByMiA9IE5VTEw7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMykgeyBmcmVlKHIzKTsgcjMgPSBOVUxMOyB9CisjaWZkZWYgRFZOQU1CVUYKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2bmFtYnVmKSBmcmVlKHZuYW1idWYpOworI2VuZGlmIC8qIERWTkFNQlVGICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ldy0tOyAgICAgICAgICAgICAgICAgIC8qIEJhY2sgdXAgb3ZlciB0ZXJtaW5hdGluZyBudWxsICovCisgICAgICAgICAgICAgICAgbjIrKzsgICAgICAgICAgICAgICAgICAgLyogdG8gYWxsb3cgZm9yIGZ1cnRoZXIgZGVwb3NpdHMuICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocjIpIHsgZnJlZShyMik7IHIyID0gTlVMTDsgfQorICAgICAgICAgICAgaWYgKHIzKSB7IGZyZWUocjMpOyByMyA9IE5VTEw7IH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJyQnOiAgICAgICAgICAgICAgICAgICAgIC8qIEFuIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAgICAgICAgY2FzZSAndic6ICAgICAgICAgICAgICAgICAgICAgLyogT3IgYSBuYW1lZCBidWlsdGluIHZhcmlhYmxlLiAqLworICAgICAgICAgIGNhc2UgJ20nOiAgICAgICAgICAgICAgICAgICAgIC8qIE9yIGEgbWFjcm8gL2xvbmcgdmFyaWFibGUgKi8KKyAgICAgICAgICBjYXNlICdzJzogICAgICAgICAgICAgICAgICAgICAvKiAxOTYgTWFjcm8gc3Vic3RyaW5nICovCisgICAgICAgICAgY2FzZSAnOic6ICAgICAgICAgICAgICAgICAgICAgLyogMTk2IFwtdmFyaWFibGUgc3Vic3RyaW5nICovCisgICAgICAgICAgICBwcCA9IDA7CisgICAgICAgICAgICBwID0gcysyOyAgICAgICAgICAgICAgICAgICAgLyogJC9WL00gbXVzdCBiZSBmb2xsb3dlZCBieSAobmFtZSkgKi8KKyAgICAgICAgICAgIGlmICgqcCAhPSAnKCcpIHsgICAgICAgICAgICAvKiBhcyBpbiBcJChIT01FKSBvciBcVihjb3VudCkgKi8KKyAgICAgICAgICAgICAgICAqbmV3KysgPSAqcysrOyAgICAgICAgICAvKiBJZiBub3QsIGp1c3QgY29weSBpdCAqLworICAgICAgICAgICAgICAgIGlmICgtLW4yIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6enN0cmluZyBvdmVyZmxvdyAzIiwiIixkZXB0aCk7CisjaWZkZWYgRFZOQU1CVUYKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZuYW1idWYpIGZyZWUodm5hbWJ1Zik7CisjZW5kaWYgLyogRFZOQU1CVUYgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcCsrOworICAgICAgICAgICAgcCsrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIDFzdCBjaGFyIG9mIG5hbWUgKi8KKyAgICAgICAgICAgIHEgPSB2bmFtYnVmOyAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBuYW1lICovCisgICAgICAgICAgICB5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogaW50byBhIHNlcGFyYXRlIGJ1ZmZlciAqLworICAgICAgICAgICAgd2hpbGUgKHkrKyA8IFZOQU1MKSB7ICAgICAgIC8qIFdhdGNoIG91dCBmb3IgbmFtZSB0b28gbG9uZyAqLworICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnKCcpIHsgICAgICAgIC8qIFBhcmVucyBjYW4gYmUgbmVzdGVkLi4uICovCisgICAgICAgICAgICAgICAgICAgIHBwKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgqcCA9PSAnKScpIHsgLyogTmFtZSBwcm9wZXJseSB0ZXJtaW5hdGVkIHdpdGggJyknICovCisgICAgICAgICAgICAgICAgICAgIHBwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChwcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwKys7ICAgICAgICAgICAgLyogTW92ZSBzb3VyY2UgcG9pbnRlciBwYXN0ICcpJyAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCgqcSA9ICpwKSA9PSBOVUwpICAgLyogU3RyaW5nIGVuZHMgYmVmb3JlICcpJyAqLworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcCsrOyBxKys7ICAgICAgICAgICAgICAgLyogQWR2YW5jZSBwb2ludGVycyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnEgPSBOVUw7ICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSB0aGUgdmFyaWFibGUgbmFtZSAqLworICAgICAgICAgICAgaWYgKHkgPj0gVk5BTUwpIHsgICAgICAgICAgIC8qIEhhbmRsZSBwYXRob2xvZ2ljYWwgY2FzZSAqLworICAgICAgICAgICAgICAgIHdoaWxlICgqcCAmJiAoKnAgIT0gJyknKSkgLyogb2YgdmVyeSBsb25nIHN0cmluZyBlbnRlcmVkICovCisgICAgICAgICAgICAgICAgICBwKys7ICAgICAgICAgICAgICAgICAgICAvKiBhcyB2YXJpYWJsZSBuYW1lLiAqLworICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnKScpIHArKzsgICAgICAgLyogU2tpcCBhaGVhZCB0byB0aGUgZW5kIG9mIGl0LiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA9IHA7ICAgICAgICAgICAgICAgICAgICAgIC8qIEFkanVzdCBnbG9iYWwgc291cmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHMzID0gdm5hbWJ1ZjsKKyAgICAgICAgICAgIHgzID0gMDsKKyAgICAgICAgICAgIHdoaWxlICgqczMrKykgeDMrKzsKKyAgICAgICAgICAgIHAgPSBtYWxsb2MoeDMgKyAxKTsgICAgICAgICAvKiBNYWtlIHRlbXBvcmFyeSBzcGFjZSAqLworICAgICAgICAgICAgaWYgKHApIHsgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIGdvdCB0aGUgc3BhY2UgKi8KKyAgICAgICAgICAgICAgICB2cCA9IHZuYW1idWY7ICAgICAgICAgICAvKiBQb2ludCB0byBvcmlnaW5hbCAqLworICAgICAgICAgICAgICAgIHN0cmNweShwLHZwKTsgICAgICAgICAgIC8qIChzYWZlKSBNYWtlIGEgY29weSBvZiBpdCAqLworICAgICAgICAgICAgICAgIHkgPSBWTkFNTDsgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBuYW1lIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIHp6c3RyaW5nKHAsJnZwLCZ5KTsgICAgIC8qIEV2YWx1YXRlIHRoZSBjb3B5ICovCisgICAgICAgICAgICAgICAgZnJlZShwKTsgICAgICAgICAgICAgICAgLyogRnJlZSB0aGUgdGVtcG9yYXJ5IHNwYWNlICovCisgICAgICAgICAgICAgICAgcCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ6enN0cmluZyB2bmFtZSIsdm5hbWJ1ZiwwKTsKKyAgICAgICAgICAgIHEgPSBOVUxMOworICAgICAgICAgICAgaWYgKHggPT0gJyQnKSB7ICAgICAgICAgICAgIC8qIExvb2sgdXAgaXRzIHZhbHVlICovCisgICAgICAgICAgICAgICAgdnAgPSBnZXRlbnYodm5hbWJ1Zik7ICAgLyogVGhpcyB3YXkgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAgICAgICAgICB9IGVsc2UgaWYgKHggPT0gJ20nIHx8IHggPT0gJ3MnIHx8IHggPT0gJzonKSB7IC8qIE1hY3JvIC8gc3Vic3RyICovCisgICAgICAgICAgICAgICAgaW50IGssIHgxID0gLTEsIHgyID0gLTE7CisgICAgICAgICAgICAgICAgayA9IHN0cmxlbih2bmFtYnVmKTsKKyAgICAgICAgICAgICAgICAvKiBccyhuYW1lW246bV0pIC0tIENvbXBhY3Qgc3Vic3RyaW5nIG5vdGF0aW9uICovCisgICAgICAgICAgICAgICAgaWYgKCh4ID09ICdzJyB8fCB4ID09ICc6JykgJiYgKGsgPiAxKSkgeyAvKiBTdWJzdHJpbmcgd2FudGVkICovCisgICAgICAgICAgICAgICAgICAgIGlmICh2bmFtYnVmW2stMV0gPT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGstMTsgaSA+IDA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2bmFtYnVmW2ldID09ICdbJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAoY2hhciAqKW1hbGxvYyhrIC0gaSArIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm93IHRoaXMgaXMgYSBkaXJ0eSB0cmljay4uLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ttYWttc2cocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGstaSs4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcJmEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZuYW1idWZbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5Ym91bmRzKHAsJngxLCZ4Mik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeDEgPCAxKSB4MSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MS0tOyAvKiBBZGp1c3QgdG8gMC1iYXNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5hbWJ1ZltpXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAnOicpIHsKKyAgICAgICAgICAgICAgICAgICAgdnAgPSB2bmFtYnVmOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCSAgICB5ID0gaXNhYXJyYXkodm5hbWJ1ZikgPworCQkJbXh4bG9vayhtYWN0YWIsdm5hbWJ1ZixubWFjKSA6CisJCQlteGxvb2sobWFjdGFiLHZuYW1idWYsbm1hYyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh5ID4gLTEpIHsJLyogR290IGRlZmluaXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHZwID0gbWFjdGFiW3ldLm12YWw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2cCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9PSAncycgfHwgeCA9PSAnOicpICYmIChrID4gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbXBhY3Qgc3Vic3RyaW5nIG5vdGF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeDIgPT0gMCkgeyAgLyogTGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnAgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4MSA+IC0xKSB7IC8qIFN0YXJ0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IHN0cmxlbih2cCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgxID4gaykgeyAgLyogSWYgaXQncyBvZmYgdGhlIGVuZCwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnAgPSBOVUxMOyAvKiByZXN1bHQgaXMgZW1wdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGsgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocSA9IG1hbGxvYyhrKzEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHEsdnApOyAvKiBzYWZlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHgyID4gLTEpICYmICgoeDEgKyB4MikgPD0gaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxW3gxK3gyXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwID0gcSt4MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgZWxzZSB2cCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHZwID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYmxvZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdnApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gc3RybGVuKHZwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBvciAqLworICAgICAgICAgICAgICAgIHZwID0gbnZsb29rKHZuYW1idWYpOyAgIC8qIHRoaXMgd2F5IGZvciBidWlsdGluIHZhcmlhYmxlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodnApIHsgICAgICAgICAgICAgICAgICAgLyogSWYgZGVmaW5pdGlvbiBub3QgZW1wdHkgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoKCpuZXcrKyA9ICp2cCsrKSkgLyogY29weSBpdCB0byBvdXRwdXQgc3RyaW5nLiAqLworICAgICAgICAgICAgICAgICAgaWYgKC0tbjIgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHEpIGZyZWUocSk7CisgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwienpzdHJpbmcgb3ZlcmZsb3cgNCIsIiIsZGVwdGgpOworI2lmZGVmIERWTkFNQlVGCisgICAgICAgICAgICAgICAgICAgICAgaWYgKHZuYW1idWYpIGZyZWUodm5hbWJ1Zik7CisjZW5kaWYgLyogRFZOQU1CVUYgKi8KKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ldy0tOyAgICAgICAgICAgICAgICAgIC8qIEJhY2sgdXAgb3ZlciB0ZXJtaW5hdGluZyBudWxsICovCisgICAgICAgICAgICAgICAgbjIrKzsgICAgICAgICAgICAgICAgICAgLyogdG8gYWxsb3cgZm9yIGZ1cnRoZXIgZGVwb3NpdHMuICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocSkgeworICAgICAgICAgICAgICAgIGZyZWUocSk7CisgICAgICAgICAgICAgICAgcSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1NQTCAqLyAgICAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgXG5ubiBldmVuIGlmIE5PU1BMLiAqLworCisjaWZuZGVmIE5PS1ZFUkJTCisgICAgICAgIGNhc2UgJ0snOgorICAgICAgICBjYXNlICdrJzogeworICAgICAgICAgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIga3ZlcmJzW107CisgICAgICAgICAgICBleHRlcm4gaW50IG5rdmVyYnM7CisjZGVmaW5lIEtfQlVGTEVOIDMwCisgICAgICAgICAgICBjaGFyIGtidWZbS19CVUZMRU4gKyAxXTsgICAgLyogS2V5IHZlcmIgbmFtZSBidWZmZXIgKi8KKyAgICAgICAgICAgIGludCB4LCB5LCB6LCBicmFjZSA9IDA7CisgICAgICAgICAgICBzICs9IDI7CisvKgorICBXZSBhc3N1bWUgdGhhdCB0aGUgdmVyYiBuYW1lIGlzIHticmFjZWR9LCBvciBpdCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlCisgIHN0cmluZywgcywgb3IgaXQgZW5kcyB3aXRoIGEgc3BhY2UsIGNvbnRyb2wgY2hhcmFjdGVyLCBvciBiYWNrc2xhc2guCisqLworICAgICAgICAgICAgcCA9IGtidWY7ICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdmVyYiBuYW1lIGludG8gbG9jYWwgYnVmZmVyICovCisgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgIGlmICgqcyA9PSAneycpICB7CisgICAgICAgICAgICAgICAgcysrOworICAgICAgICAgICAgICAgIGJyYWNlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoKHgrKyA8IEtfQlVGTEVOKSAmJiAoKnMgPiBTUCkgJiYgKCpzICE9IENNRFEpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJyYWNlICYmICpzID09ICd9JykgeworICAgICAgICAgICAgICAgICAgICBzKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcCsrID0gKnMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyYWNlID0gMDsKKyAgICAgICAgICAgICpwID0gTlVMOyAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hdGUuICovCisgICAgICAgICAgICBwID0ga2J1ZjsgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgYmFjayB0byBiZWdpbm5pbmcgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInp6c3RyaW5nIGt2ZXJiIixwLDApOworICAgICAgICAgICAgeSA9IHhsb29rdXAoa3ZlcmJzLHAsbmt2ZXJicywmeCk7IC8qIExvb2sgaXQgdXAgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInp6c3RyaW5nIGxvb2t1cCIsMCx5KTsKKyAgICAgICAgICAgIGlmICh5ID4gLTEpIHsKKyAgICAgICAgICAgICAgICBkb2t2ZXJiKFZDTUQseSk7CisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogSXMgaXQgYSBtYWNybz8gKi8KKyAgICAgICAgICAgICAgICB5ID0gbXhsb29rKG1hY3RhYixwLG5tYWMpOworICAgICAgICAgICAgICAgIGlmICh5ID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwienpzdHJpbmcgbXhsb29rIixwLHkpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHogPSBkb2RvKHksTlVMTCxjbWRzdGtbY21kbHZsXS5jY2ZsZ3MpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbXB1c2goKSA+IC0xKSB7ICAvKiBQdXNoIGNvbW1hbmQgcGFyc2VyIHN0YXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBpZmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlmY3NhdiA9IGlmYzsgLyogUHVzaCBJRiBjb25kaXRpb24gb24gc3RhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcGFyc2VyKDEpOyAgICAvKiBOZXcgcGFyc2VyIHRvIGV4ZWN1dGUgbWFjcm8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBvcCgpOyAgICAgICAgICAvKiBQb3AgY29tbWFuZCBwYXJzZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmMgPSBpZmNzYXY7ICAgICAvKiBSZXN0b3JlIElGIGNvbmRpdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5ID09IDApIHsgICAgIC8qIE5vIGVycm9ycywgaWdub3JlIGFjdGlvbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IG1ydmFsW21hY2x2bCsxXTsgLyogSWYgT0sgc2V0IHJldHVybiB2YWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgcCA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIENhbid0IHB1c2ggYW55IG1vcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6enN0cmluZyBwdXNoZWQgdG9vIGRlZXAiLCIiLGRlcHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuP0ludGVybmFsIGVycm9yOiB6enN0cmluZyBzdGFjayBvdmVyZmxvd1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbXBvcCgpID4gLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF5YmUgaXQncyBhIGJhY2tzbGFzaCBjb2RlICovCisgICAgICAgICAgeSA9IHh4ZXNjKCZzKTsgICAgICAgICAgICAgICAgLyogR28gaW50ZXJwcmV0IGl0ICovCisgICAgICAgICAgaWYgKHkgPCAwKSB7ICAgICAgICAgICAgICAgICAgLyogVXBvbiBmYWlsdXJlICovCisgICAgICAgICAgICAgICpuZXcrKyA9IChjaGFyKSB4OyAgICAgICAgLyogSnVzdCBxdW90ZSB0aGUgbmV4dCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgcyArPSAyOyAgICAgICAgICAgICAgICAgICAvKiBNb3ZlIHBhc3QgdGhlIHBhaXIgKi8KKyAgICAgICAgICAgICAgbjIgLT0gMjsKKyAgICAgICAgICAgICAgaWYgKG4yIDwgMCkgeworICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwienpzdHJpbmcgb3ZlcmZsb3cgNSIsIiIsZGVwdGgpOworI2lmZGVmIERWTkFNQlVGCisgICAgICAgICAgICAgICAgICBpZiAodm5hbWJ1ZikgZnJlZSh2bmFtYnVmKTsKKyNlbmRpZiAvKiBEVk5BTUJVRiAqLworICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgIC8qIGFuZCBnbyBiYWNrIGZvciBtb3JlICovCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgKm5ldysrID0gKGNoYXIpIHk7ICAgICAgICAvKiBlbHNlIGRlcG9zaXQgaW50ZXJwcmV0ZWQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgaWYgKC0tbjIgPCAwKSB7CisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6enN0cmluZyBvdmVyZmxvdyA2IiwiIixkZXB0aCk7CisjaWZkZWYgRFZOQU1CVUYKKyAgICAgICAgICAgICAgICAgIGlmICh2bmFtYnVmKSBmcmVlKHZuYW1idWYpOworI2VuZGlmIC8qIERWTkFNQlVGICovCisgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICpuZXcgPSBOVUw7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSB0aGUgbmV3IHN0cmluZyAqLworICAgIGRlYnVnKEYwMTAsInp6c3RyaW5nIHdoaWxlIGV4aXQiLCpzMiwwKTsKKworICAgIGRlcHRoLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkanVzdCBzdGFjayBkZXB0aCBnYXVnZSAqLworICAgICpzMiA9IG5ldzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgcmVzdWx0cyBiYWNrIGludG8gKi8KKyAgICAqbiA9IG4yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYXJndW1lbnQgYWRkcmVzc2VzICovCisgICAgZGVidWcoRjEwMSwienpzdHJpbmcgb2siLCIiLGRlcHRoKTsKKyNpZmRlZiBEVk5BTUJVRgorICAgIGlmICh2bmFtYnVmKSBmcmVlKHZuYW1idWYpOworI2VuZGlmIC8qIERWTkFNQlVGICovCisgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybi4gKi8KK30KKyNlbmRpZiAvKiBOT0lDUCAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdXVzNS5jIGIvY2tlcm1pdC04LjAuMjExL2NrdXVzNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTA2MjkKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2t1dXM1LmMKQEAgLTAsMCArMSwxMTkxMyBAQAorI2luY2x1ZGUgImNrY3N5bS5oIgorCitpbnQgeGNtZHNyYyA9IDA7CisKKyNpZmRlZiBOT0lDUAoraW50IGNtZHNyYygpIHsgcmV0dXJuKDApOyB9CisjZW5kaWYgLyogTk9JQ1AgKi8KKworLyogIEMgSyBVIFUgUyA1IC0tICAiVXNlciBJbnRlcmZhY2UiIGZvciBDLUtlcm1pdCwgcGFydCA1ICAqLworCisvKgorICBBdXRob3JzOgorICAgIEZyYW5rIGRhIENydXogPGZkY0Bjb2x1bWJpYS5lZHU+LAorICAgICAgVGhlIEtlcm1pdCBQcm9qZWN0LCBDb2x1bWJpYSBVbml2ZXJzaXR5LCBOZXcgWW9yayBDaXR5CisgICAgSmVmZnJleSBFIEFsdG1hbiA8amFsdG1hbkBzZWN1cmUtZW5kcG9pbnRzLmNvbT4KKyAgICAgIFNlY3VyZSBFbmRwb2ludHMgSW5jLiwgTmV3IFlvcmsgQ2l0eQorCisgIENvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisqLworCisvKiBJbmNsdWRlcyAqLworCisjaW5jbHVkZSAiY2tjZGViLmgiCisjaW5jbHVkZSAiY2tjYXNjLmgiCisjaW5jbHVkZSAiY2tja2VyLmgiCisjaW5jbHVkZSAiY2t1dXNyLmgiCisKKyNpZmRlZiBEQ01EQlVGCitjaGFyICpsaW5lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIGJ1ZmZlciBmb3IgYW55dGhpbmcgKi8KK2NoYXIgKnRtcGJ1ZjsKKyNlbHNlCitjaGFyIGxpbmVbTElOQlVGU0laKzFdOworY2hhciB0bXBidWZbVE1QQlVGU0laKzFdOyAgICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBidWZmZXIgKi8KKyNlbmRpZiAvKiBEQ01EQlVGICovCisKKyNpZm5kZWYgTk9JQ1AKKworI2luY2x1ZGUgImNrY25ldC5oIgorI2lmbmRlZiBOT0NTRVRTCisjaW5jbHVkZSAiY2tjeGxhLmgiCisjZW5kaWYgLyogTk9DU0VUUyAqLworI2lmZGVmIE1BQworI2luY2x1ZGUgImNrbWFzbS5oIgorI2VuZGlmIC8qIE1BQyAqLworI2lmZGVmIENLX1NTTAorI2luY2x1ZGUgImNrX3NzbC5oIgorI2VuZGlmIC8qIENLX1NTTCAqLworCisjaWZkZWYgT1MyCisjaW5jbHVkZSAiY2tvZXRjLmgiCisjaWZuZGVmIE5UCisjZGVmaW5lIElOQ0xfTk9QTQorI2RlZmluZSBJTkNMX1ZJTyAvKiBOZWVkZWQgZm9yIGNrb2Nvbi5oICovCisjaW5jbHVkZSA8b3MyLmg+CisjdW5kZWYgQ09NTUVOVAorI2Vsc2UgLyogTlQgKi8KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZGVmaW5lIFRBUElfQ1VSUkVOVF9WRVJTSU9OIDB4MDAwMTAwMDQKKyNpbmNsdWRlIDx0YXBpLmg+CisjaW5jbHVkZSA8bWN4Lmg+CisjaW5jbHVkZSAiY2tudGFwLmgiCisjZGVmaW5lIEFQSVJFVCBVTE9ORworZXh0ZXJuIGludCBEaWFsZXJIYW5kbGU7CitleHRlcm4gaW50IFN0YXJ0ZWRGcm9tRGlhbGVyOworI2VuZGlmIC8qIE5UICovCisjaW5jbHVkZSAiY2tvY29uLmgiCisjaW5jbHVkZSAiY2tva2V5LmgiCisjaWZkZWYgS1VJCisjaW5jbHVkZSAiaWt1aS5oIgorI2VuZGlmIC8qIEtVSSAqLworI2lmZGVmIHB1dGNoYXIKKyN1bmRlZiBwdXRjaGFyCisjZW5kaWYgLyogcHV0Y2hhciAqLworI2RlZmluZSBwdXRjaGFyKHgpIGNvbm9jKHgpCitleHRlcm4gaW50IGN1cnNvcl9zYXZlIDsKK2V4dGVybiBib29sIGN1cnNvcmVuYVtdIDsKKyNlbmRpZiAvKiBPUzIgKi8KKworLyogRm9yIGZvcm1hdHRlZCBzY3JlZW5zLCAibW9yZT8iIHByb21wdGluZywgZXRjLiAqLworCisjaWZkZWYgRlQxOAorI2RlZmluZSBpc3hkaWdpdChjKSBpc2RpZ2l0KGMpCisjZW5kaWYgLyogRlQxOCAqLworCisjaWZkZWYgU1RSQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RyYXR1cyBDb21wdXRlciwgSW5jLiAgVk9TICovCisjaWZkZWYgcHV0Y2hhcgorI3VuZGVmIHB1dGNoYXIKKyNlbmRpZiAvKiBwdXRjaGFyICovCisjZGVmaW5lIHB1dGNoYXIoeCkgY29ub2MoeCkKKyNpZmRlZiBnZXRjaGFyCisjdW5kZWYgZ2V0Y2hhcgorI2VuZGlmIC8qIGdldGNoYXIgKi8KKyNkZWZpbmUgZ2V0Y2hhcih4KSBjb25pbmMoMCkKKyNlbmRpZiAvKiBTVFJBVFVTICovCisKKy8qIEV4dGVybmFsIHZhcmlhYmxlcyAqLworCitleHRlcm4gaW50IGNhcnJpZXIsIGNkdGltbywgbG9jYWwsIHF1aWV0LCBiYWNrZ3JkLCBiZ3NldCwgc29zaSwgeHN1c3BlbmQsCisgIGJpbmFyeSwgZXNjYXBlLCB4YXJncywgZmxvdywgY21kbXNrLCBkdXBsZXgsIGNreGVjaCwgc2VzbG9nLCB3aGF0LAorICBpbnNlcnZlciwgZGlyYWN0aXZlLCB0bGV2ZWwsIGN3ZGYsIG5mdW5jcywgbXNnZmxnLCByZW1hcHBkLCBoaW50cywgbWRtdHlwLAorICB6aW5jbnQsIGNtYXNrLCByY2ZsYWcsIHN1Y2Nlc3MsIHhpdHN0YSwgcGZsYWcsIHRubG0sIHRuX25sbSwgeGl0d2FybiwKKyAgZGVic2VzLCB4YXNrbW9yZSwgcGFyaXR5LCBzYXZlYXNrLCB3YXNjbG9zZWQsIHdoeWNsb3NlZCwgY2RhY3RpdmUsCisgIHJjZGFjdGl2ZSwga2VlcGFsbGNoYXJzOworCisjaWZkZWYgTE9DVVMKK2V4dGVybiBpbnQgbG9jdXMsIGF1dG9sb2N1czsKKyNlbmRpZiAvKiBMT0NVUyAqLworCisjaWZuZGVmIE5PTVNFTkQKK2V4dGVybiBpbnQgYWRkbGlzdDsKKyNlbmRpZiAvKiBOT01TRU5EICovCisKKyNpZmRlZiBDS19TUEVFRAorZXh0ZXJuIGludCBwcmVmaXhpbmc7CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKworZXh0ZXJuIGludCBnX21hdGNoZG90OworCisjaWZkZWYgUkVDVVJTSVZFCitleHRlcm4gaW50IHJlY3Vyc2l2ZTsKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KK2V4dGVybiBpbnQgeGZpbGV0eXBlOworCisjaWZkZWYgSUtTRENPTkYKK2V4dGVybiBjaGFyICogaWtzZGNvbmY7CitleHRlcm4gaW50IGlrc2RjZjsKKyNlbmRpZiAvKiBJS1NEQ09ORiAqLworCisjaWZkZWYgQ0tfUkVDQUxMCitleHRlcm4gaW50IG9uX3JlY2FsbDsKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKworZXh0ZXJuIGludCBuZ2V0cGF0aCwgZXhpdG9uY2xvc2U7CitleHRlcm4gY2hhciAqIGdldHBhdGhbXTsKK2V4dGVybiBDSEFSICogZXBrdG1zZzsKKworZXh0ZXJuIGNoYXIgKiBzbmRfbW92ZTsKK2V4dGVybiBjaGFyICogc25kX3JlbmFtZTsKK2V4dGVybiBjaGFyICogcmN2X21vdmU7CitleHRlcm4gY2hhciAqIHJjdl9yZW5hbWU7CitleHRlcm4gY2hhciAqIGdfc25kX21vdmU7CitleHRlcm4gY2hhciAqIGdfc25kX3JlbmFtZTsKK2V4dGVybiBjaGFyICogZ19yY3ZfbW92ZTsKK2V4dGVybiBjaGFyICogZ19yY3ZfcmVuYW1lOworCitleHRlcm4gY2hhciAqIG5tW107CisKKyNpZmRlZiBDS19VVFNOQU1FCitleHRlcm4gY2hhciB1bm1fbWNoW107CitleHRlcm4gY2hhciB1bm1fbW9kW107CitleHRlcm4gY2hhciB1bm1fbmFtW107CitleHRlcm4gY2hhciB1bm1fcmVsW107CitleHRlcm4gY2hhciB1bm1fdmVyW107CisjZW5kaWYgLyogQ0tfVVRTTkFNRSAqLworCisjaWZuZGVmIE5PUFVTSAorI2lmbmRlZiBOT0ZSSUxMUworZXh0ZXJuIGNoYXIgZWRpdG9yW107CitleHRlcm4gY2hhciBlZGl0ZmlsZVtdOworZXh0ZXJuIGNoYXIgZWRpdG9wdHNbXTsKKyNpZmRlZiBCUk9XU0VSCitleHRlcm4gY2hhciBicm93c2VyW107CitleHRlcm4gY2hhciBicm93c29wdHNbXTsKK2V4dGVybiBjaGFyIGJyb3dzdXJsW107CisjZW5kaWYgLyogQlJPV1NFUiAqLworI2VuZGlmIC8qICBOT0ZSSUxMUyAqLworI2VuZGlmIC8qIE5PUFVTSCAqLworCisjaWZuZGVmIE5PU0VSVkVSCitleHRlcm4gY2hhciAqIHhfdXNlciwgKiB4X3Bhc3N3ZCwgKiB4X2FjY3Q7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKworI2lmZGVmIENLTE9HRElBTAorZXh0ZXJuIGludCBkaWFsb2c7CitleHRlcm4gY2hhciBkaWFmaWxbXTsKKyNlbmRpZiAvKiBDS0xPR0RJQUwgKi8KKworI2lmZGVmIENLUk9PVAorZXh0ZXJuIGludCBja3Jvb3RlcnI7CisjZW5kaWYgLyogQ0tST09UICovCisKKyNpZm5kZWYgTk9TUEwKK2V4dGVybiBpbnQgY2ZpbGVmLCB4eGRvdDsKK2V4dGVybiBjaGFyIGNtZGZpbFtdOworCitzdHJ1Y3QgbG9jYWx2YXIgKiBsb2NhbGhlYWRbQ01EU1RLTF07CitzdHJ1Y3QgbG9jYWx2YXIgKiBsb2NhbHRhaWwgPSBOVUxMOworc3RydWN0IGxvY2FsdmFyICogbG9jYWxuZXh0ID0gTlVMTDsKKworX1BST1RPVFlQKCBWT0lEIHNob3NleHAsICh2b2lkKSApOworX1BST1RPVFlQKCBzdGF0aWMgVk9JRCBzaG9pbnB1dCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBjaGFyIGdldHRvaywgICAodm9pZCkgKTsKK19QUk9UT1RZUCggc3RhdGljIFZPSUQgZmFjdG9yLCAgICh2b2lkKSApOworX1BST1RPVFlQKCBzdGF0aWMgVk9JRCB0ZXJtLCAgICAgKHZvaWQpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBWT0lEIHRlcm1wLCAgICAodm9pZCkgKTsKK19QUk9UT1RZUCggc3RhdGljIFZPSUQgZXhwcnAsICAgICh2b2lkKSApOworX1BST1RPVFlQKCBzdGF0aWMgVk9JRCBleHByLCAgICAgKHZvaWQpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBWT0lEIHNpbXBsZSwgICAodm9pZCkgKTsKK19QUk9UT1RZUCggc3RhdGljIFZPSUQgc2ltcGxlciwgICh2b2lkKSApOworX1BST1RPVFlQKCBzdGF0aWMgVk9JRCBzaW1wbGVzdCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBsb25nIHhwYXJzZSwgICAodm9pZCkgKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBOT1NIT1cKK19QUk9UT1RZUCggaW50IHNob19pa3MsICh2b2lkKSApOworI2VuZGlmIC8qIE5PU0hPVyAqLworCisjaWZkZWYgTUFDCitjaGFyICogY2twcm9tcHQgPSAiTWFjLUtlcm1pdD4iOyAgICAgICAgLyogRGVmYXVsdCBwcm9tcHQgZm9yIE1hY2ludG9zaCAqLworY2hhciAqIGlrcHJvbXB0ID0gIklLU0Q+IjsKKyNlbHNlICAvKiBOb3QgTUFDICovCisjaWZkZWYgTk9TUEwKKyNpZmRlZiBPUzIKK2NoYXIgKiBja3Byb21wdCA9ICJLLTk1PiAiOyAgICAgICAgICAgICAvKiBEZWZhdWx0IHByb21wdCBmb3IgV2luMzIgKi8KK2NoYXIgKiBpa3Byb21wdCA9ICJJS1NEPiAiOworI2Vsc2UKK2NoYXIgKiBja3Byb21wdCA9ICJDLUtlcm1pdD4iOworY2hhciAqIGlrcHJvbXB0ID0gIklLU0Q+IjsKKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UgIC8qIE5PU1BMICovCisjaWZkZWYgT1MyCisvKiBEZWZhdWx0IHByb21wdCBmb3IgT1MvMiBhbmQgV2luMzIgKi8KKyNpZmRlZiBOVAorY2hhciAqIGNrcHJvbXB0ID0gIltcXGZyZXBsYWNlKFxcZmxvbmdwYXRoKFxcdihkaXIpKSwvLFxcXFwpXSBLLTk1PiAiOworY2hhciAqIGlrcHJvbXB0ID0gIltcXGZyZXBsYWNlKFxcZmxvbmdwYXRoKFxcdihkaXIpKSwvLFxcXFwpXSBJS1NEPiAiOworI2Vsc2UgIC8qIE5UICovCitjaGFyICogY2twcm9tcHQgPSAiW1xcZnJlcGxhY2UoXFx2KGRpciksLyxcXFxcKV0gSy05NT4gIjsKK2NoYXIgKiBpa3Byb21wdCA9ICJbXFxmcmVwbGFjZShcXHYoZGlyKSwvLFxcXFwpXSBJS1NEPiAiOworI2VuZGlmIC8qIE5UICovCisjZWxzZSAgLyogT1MyICovCisjaWZkZWYgVk1TCitjaGFyICogY2twcm9tcHQgPSAiXFx2KGRpcikgQy1LZXJtaXQ+IjsgLyogRGVmYXVsdCBwcm9tcHQgVk1TICovCitjaGFyICogaWtwcm9tcHQgPSAiXFx2KGRpcikgSUtTRD4iOworI2Vsc2UKK2NoYXIgKiBja3Byb21wdCA9ICIoXFx2KGRpcikpIEMtS2VybWl0PiI7IC8qIERlZmF1bHQgcHJvbXB0IGZvciBvdGhlcnMgKi8KK2NoYXIgKiBpa3Byb21wdCA9ICIoXFx2KGRpcikpIElLU0Q+IjsKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIE5PU1BMICovCisjZW5kaWYgLyogTUFDICovCisKKyNpZm5kZWYgQ0NITUFYUEFUSAorI2RlZmluZSBDQ0hNQVhQQVRIIDI1NworI2VuZGlmIC8qIENDSE1BWFBBVEggKi8KK2NoYXIgaW5pZGlyW0NDSE1BWFBBVEhdID0geyBOVUwsIE5VTCB9OyAvKiBEaXJlY3RvcnkgSU5JIGZpbGUgZXhlY3V0ZWQgZnJvbSAqLworCisjaWZkZWYgVE5DT0RFCitleHRlcm4gaW50IHRuX2JfbmxtOyAgICAgICAgICAgICAgICAgICAgLyogVEVMTkVUIEJJTkFSWSBuZXdsaW5lIG1vZGUgKi8KKyNlbmRpZiAvKiBUTkNPREUgKi8KKworI2lmbmRlZiBOT0tWRVJCUworZXh0ZXJuIHN0cnVjdCBrZXl0YWIga3ZlcmJzW107ICAgICAgICAgIC8qIFRhYmxlIG9mIFxLdmVyYnMgKi8KK2V4dGVybiBpbnQgbmt2ZXJiczsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgXEt2ZXJicyAqLworI2VuZGlmIC8qIE5PS1ZFUkJTICovCisKKyNpZm5kZWYgTk9QVVNICitleHRlcm4gaW50IG5vcHVzaDsKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworI2lmZGVmIENLX1JFQ0FMTAorZXh0ZXJuIGludCBjbV9yZWNhbGw7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisKK2V4dGVybiBjaGFyICpjY250YWJbXTsKKworLyogUHJpbnRlciBzdHVmZiAqLworCitleHRlcm4gY2hhciAqcHJpbnRlcm5hbWU7CitleHRlcm4gaW50IHByaW50cGlwZTsKKyNpZmRlZiBCUFJJTlQKK2V4dGVybiBpbnQgcHJpbnRiaWRpLCBwcG9ydHBhcml0eSwgcHBvcnRmbG93OworZXh0ZXJuIGxvbmcgcHBvcnRzcGVlZDsKKyNlbmRpZiAvKiBCUFJJTlQgKi8KKworI2lmZGVmIE9TMgorX1BST1RPVFlQIChpbnQgb3MyZ2V0Y3AsICh2b2lkKSApOworX1BST1RPVFlQIChpbnQgb3MyZ2V0Y3BsaXN0LCAoaW50ICosIGludCkgKTsKKyNpZmRlZiBPUzJNT1VTRQorZXh0ZXJuIGludCB0dF9tb3VzZTsKKyNlbmRpZiAvKiBPUzJNT1VTRSAqLworZXh0ZXJuIGludCB0dF91cGRhdGUsIHR0X3VwZG1vZGUsIHVwZG1vZGUsIHR0X3V0Zjg7CisjaWZuZGVmIElLU0RPTkxZCitleHRlcm4gaW50IHR0X3N0YXR1c1tdOworI2VuZGlmIC8qIElLU0RPTkxZICovCisjaWZkZWYgUENGT05UUworZXh0ZXJuIHN0cnVjdCBrZXl0YWIgdGVybV9mb250W107CisjZWxzZQorI2lmZGVmIEtVSQorZXh0ZXJuIHN0cnVjdCBrZXl0YWIgKiB0ZXJtX2ZvbnQ7CisjZW5kaWYgLyogS1VJICovCisjZW5kaWYgLyogUENGT05UUyAqLworZXh0ZXJuIGludCBudGVybWZvbnQsIHR0X2ZvbnQsIHR0X2ZvbnRfc2l6ZTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGNvbG9ybm9ybWFsLCBjb2xvcnVuZGVybGluZSwgY29sb3JzdGF0dXMsCisgICAgY29sb3JoZWxwLCBjb2xvcnNlbGVjdCwgY29sb3Jib3JkZXIsIGNvbG9yZ3JhcGhpYywgY29sb3JkZWJ1ZywKKyAgICBjb2xvcnJldmVyc2UsIGNvbG9yY21kLCBjb2xvcml0YWxpYzsKK2V4dGVybiBpbnQgcHJpb3JpdHk7CitleHRlcm4gc3RydWN0IGtleXRhYiBwcnR5dGFiW107CitleHRlcm4gaW50IG5wcnR5OworY2hhciAqIGNtZG1hYyA9IE5VTEw7CisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBWTVMKK19QUk9UT1RZUCAoaW50IHprZXJtaW5pLCAoY2hhciAqLCBpbnQsIGNoYXIgKikgKTsKKyNlbmRpZiAvKiBWTVMgKi8KKworZXh0ZXJuIGxvbmcgdmVybnVtOworZXh0ZXJuIGludCBpbmVjaG8sIGluc2lsZW5jZSwgaW5idWZzaXplLCBudmFycywgaW5pbnRyOworZXh0ZXJuIGNoYXIgKnByb3R2LCAqZm5zdiwgKmNtZHYsICp1c2VydiwgKmNreHYsICpja3p2LCAqY2t6c3lzLCAqeGxhdiwKKyAqY2tuZXR2LCAqY2xjbWRzOworI2lmZGVmIE9TMgorZXh0ZXJuIGNoYXIgKmNreXY7CisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KK2V4dGVybiBjaGFyICogY2thdGh2OworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisjaWZkZWYgQ0tfU1NMCitleHRlcm4gY2hhciAqIGNrc3NsdjsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisjaWZuZGVmIENSWVBUX0RMTAorZXh0ZXJuIGNoYXIgKiBja2NycHY7CisjZW5kaWYgLyogQ1JZUFRfRExMICovCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworCisjaWZkZWYgU1NIQlVJTFRJTgorZXh0ZXJuIGNoYXIgKmNrc3NodjsKKyNpZmRlZiBTRlRQX0JVSUxUSU4KK2V4dGVybiBjaGFyICpja3NmdHB2OworI2VuZGlmIC8qIFNGVFBfQlVJTFRJTiAqLworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKworI2lmZGVmIFROQ09ERQorZXh0ZXJuIGNoYXIgKmNrdGVsdjsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyNpZm5kZWYgTk9GVFAKKyNpZm5kZWYgU1lTRlRQCitleHRlcm4gY2hhciAqIGNrZnRwdjsKKyNlbmRpZiAvKiBTWVNGVFAgKi8KKyNlbmRpZiAvKiBOT0ZUUCAqLworCitleHRlcm4gaW50IHNydmlkbDsKKworI2lmZGVmIE9TMgorZXh0ZXJuIGNoYXIgKmNrb25ldHY7CitleHRlcm4gaW50IGludGVybTsKKyNpZmRlZiBDS19ORVRCSU9TCitleHRlcm4gY2hhciAqY2tvbmJpdjsKKyNlbmRpZiAvKiBDS19ORVRCSU9TICovCisjaWZkZWYgT1MyTU9VU0UKK2V4dGVybiBjaGFyICpja29tb3V2OworI2VuZGlmIC8qIE9TMk1PVVNFICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgTk9MT0NBTAorZXh0ZXJuIGNoYXIgKmNvbm52OworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZm5kZWYgTk9ESUFMCitleHRlcm4gY2hhciAqZGlhbHY7CisjZW5kaWYgLyogTk9ESUFMICovCisjaWZuZGVmIE5PU0NSSVBUCitleHRlcm4gY2hhciAqbG9naW52OworZXh0ZXJuIGludCBzZWNobzsKKyNlbmRpZiAvKiBOT1NDUklQVCAqLworCisjaWZuZGVmIE5PRElBTAorZXh0ZXJuIGludCBubWRtLCBkaXJsaW5lOworZXh0ZXJuIHN0cnVjdCBrZXl0YWIgbWRtdGFiW107CisjZW5kaWYgLyogTk9ESUFMICovCisKK2V4dGVybiBpbnQgbmV0d29yaywgbmV0dHlwZSwgdHRucHJvdG87CisKKyNpZmRlZiBPUzIKKyNpZm5kZWYgTk9URVJNCisvKiBTRVQgVEVSTUlOQUwgaXRlbXMuLi4gKi8KK2V4dGVybiBpbnQgdHRfdHlwZSwgdHRfYXJyb3csIHR0X2tleXBhZCwgdHRfd3JhcCwgdHRfYW5zd2VyLCB0dF9zY3JzaXplW107CitleHRlcm4gaW50IHR0X2JlbGwsIHR0X3JvbGxbXSwgdHRfY3RzdG1vLCB0dF9jdXJzb3IsIHR0X3BhY2luZywgdHRfdHlwZV9tb2RlOworZXh0ZXJuIGNoYXIgYW5zd2VyYmFja1tdOworZXh0ZXJuIHN0cnVjdCB0dF9pbmZvX3JlYyB0dF9pbmZvW107ICAgIC8qIEluZGV4ZWQgYnkgdGVybWluYWwgdHlwZSAqLworZXh0ZXJuIGludCBtYXhfdHQ7CisjZW5kaWYgLyogTk9URVJNICovCisjZW5kaWYgLyogT1MyICovCisKK19QUk9UT1RZUCggVk9JRCBzaG90cm0sICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgc2hvZmVhLCAodm9pZCkgKTsKKworI2lmZGVmIE9TMgorZXh0ZXJuIGludCB0dF9yb3dzW10sIHR0X2NvbHNbXTsKKyNlbHNlIC8qIE9TMiAqLworZXh0ZXJuIGludCB0dF9yb3dzLCB0dF9jb2xzOworI2VuZGlmIC8qIE9TMiAqLworZXh0ZXJuIGludCBjbWRfcm93cywgY21kX2NvbHM7CisKKyNpZmRlZiBDS19UTVBESVIKK2V4dGVybiBpbnQgZl90bXBkaXI7ICAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3RvcnkgY2hhbmdlZCB0ZW1wb3JhcmlseSAqLworZXh0ZXJuIGNoYXIgc2F2ZGlyW107ICAgICAgICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBkaXJlY3RvcnkgKi8KKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKworI2lmbmRlZiBOT0xPQ0FMCitleHRlcm4gaW50IHR0X2NyZCwgdHRfZXNjYXBlOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmbmRlZiBOT0NTRVRTCitleHRlcm4gaW50IGxhbmd1YWdlLCBuZmlsYywgdGNzciwgdGNzbCwgdGNzX3RyYW5zcCwgZmNoYXJzZXQ7CitleHRlcm4gc3RydWN0IGtleXRhYiBmY3N0YWJbXTsKK2V4dGVybiBzdHJ1Y3QgY3NpbmZvIGZjc2luZm9bXTsKKyNpZm5kZWYgTUFDCitleHRlcm4gc3RydWN0IGtleXRhYiB0dGNzdGFiW107CisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCitleHRlcm4gbG9uZyBzcGVlZDsKKworI2lmbmRlZiBOT1hNSVQKK2V4dGVybiBpbnQgeG1pdGYsIHhtaXRsLCB4bWl0cCwgeG1pdHgsIHhtaXRzLCB4bWl0dywgeG1pdHQ7CitleHRlcm4gY2hhciB4bWl0YnVmW107CisjZW5kaWYgLyogTk9YTUlUICovCisKK2V4dGVybiBjaGFyICoqeGFyZ3YsICp2ZXJzaW8sICpja3hzeXMsICpkZnR0eSwgKmxwOworCisjaWZkZWYgRENNREJVRgorZXh0ZXJuIGNoYXIgKmNtZGJ1ZiwgKmF0bWJ1ZjsgICAgICAgICAgIC8qIENvbW1hbmQgYnVmZmVycyAqLworI2lmbmRlZiBOT1NQTAorZXh0ZXJuIGNoYXIgKnNhdmJ1ZjsgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgYnVmZmVycyAqLworI2VuZGlmIC8qIE5PU1BMICovCisjZWxzZQorZXh0ZXJuIGNoYXIgY21kYnVmW10sIGF0bWJ1ZltdOyAgICAgICAgIC8qIENvbW1hbmQgYnVmZmVycyAqLworI2lmbmRlZiBOT1NQTAorZXh0ZXJuIGNoYXIgc2F2YnVmW107ICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgYnVmZmVycyAqLworI2VuZGlmIC8qIE5PU1BMICovCisjZW5kaWYgLyogRENNREJVRiAqLworCitleHRlcm4gY2hhciB0b2t0YWJbXSwgdHRuYW1lW10sIHBzYXZlW107CitleHRlcm4gQ0hBUiBzc3RhdGUsIGZlb2w7CitleHRlcm4gaW50IGNtZmxncywgdGVjaG8sIHJlcGFycywgbmNtZDsKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIGNtZHRhYltdOworCisjaWZuZGVmIE5PU0VUS0VZCitLRVkgKmtleW1hcDsKKyNpZm5kZWYgT1MyCisjZGVmaW5lIG1hcGtleSh4KSBrZXltYXBbeF0KKyNlbmRpZiAvKiBPUzIgKi8KK01BQ1JPICptYWNyb3RhYjsKK19QUk9UT1RZUCggVk9JRCBzaG9zdHJkZWYsIChDSEFSICopICk7CisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKworZXh0ZXJuIGludCBjbWRsdmw7CisKKyNpZm5kZWYgTk9TUEwKK2V4dGVybiBzdHJ1Y3QgbXRhYiAqbWFjdGFiOworZXh0ZXJuIHN0cnVjdCBrZXl0YWIgbWFja2V5W107CitleHRlcm4gc3RydWN0IGtleXRhYiB2YXJ0YWJbXSwgZm5jdGFiW10sIGlmdGFiW107CitleHRlcm4gaW50IG1hY2x2bCwgbm1hYywgbWVjaG8sIGZuZGlhZ3MsIGZuZXJyb3IsIGZuc3VjY2VzcywgbmlmOworI2VuZGlmIC8qIE5PU1BMICovCisKK0ZJTEUgKnRmaWxlW01BWFRBS0VdOyAgICAgICAgICAgICAgICAgICAvKiBUQUtFIGZpbGUgc3RhY2sgKi8KK2NoYXIgKnRmbmFtW01BWFRBS0VdOworaW50IHRmbGluZVtNQVhUQUtFXTsKKworaW50IHRvcGNtZCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNtZHRhYiBpbmRleCBvZiBjdXJyZW50IGNvbW1hbmQgKi8KK2ludCBoYXZldG9rZW4gPSAwOworZXh0ZXJuIGludCBkYmxxdW87ICAgICAgICAgICAgICAgICAgICAgIC8qIERvdWJsZXF1b3RpbmcgZW5hYmxlZCAqLworCisjaWZkZWYgRENNREJVRiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gZmlsZXNwZWMgKi8KK2NoYXIgKmtlcm1yYyA9IE5VTEw7CisjZWxzZQorY2hhciBrZXJtcmNiW0tFUk1SQ0xdOworY2hhciAqa2VybXJjID0ga2VybXJjYjsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisKK2ludCBub2hlcmFsZCA9IDA7CitpbnQgY21fcmV0cnkgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZCByZXRyeSBlbmFibGVkICovCit4eF9zdHJwIHh4c3RyaW5nID0genpzdHJpbmc7CisKKyNpZm5kZWYgTk9YRkVSCitleHRlcm4gaW50IGRpc3BsYSwgYnllX2FjdGl2ZSwgcHJvdG9jb2wsIHBrdGxvZywgcmVtZmlsZSwgcmVtcGlwZSwgdW5rY3MsCisgIGtlZXAsIGxmX29wdHMsIGZuY252LCBwa3RwYXVzLCBhdXRvZGwsIHhmcmNhbiwgeGZyY2hyLCB4ZnJudW0sIHNydnRpbSwKKyAgc3J2ZGlzLCBxdWVyeSwgcmV0cmFucywgc3RyZWFtZWQsIHJlbGlhYmxlLCBjcnVuY2hlZCwgdGltZW91dHMsCisgIGZucnBhdGgsIGF1dG9wYXRoLCBycGFja2V0cywgc3BhY2tldHMsIGVwa3RyY3ZkLCBzcnZwaW5nOworCisjaWZkZWYgQ0tfQVVUT0RMCitleHRlcm4gaW50IGluYXV0b2RsLCBjbWRhZGw7CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisKKyNpZm5kZWYgTk9TRVJWRVIKK2V4dGVybiBpbnQgZW5fYXNnLCBlbl9jd2QsIGVuX2NweSwgZW5fZGVsLCBlbl9kaXIsIGVuX2ZpbiwgZW5fYnllLCBlbl9yZXQsCisgIGVuX2dldCwgZW5faG9zLCBlbl9xdWUsIGVuX3JlbiwgZW5fc2VuLCBlbl9zZXQsIGVuX3NwYSwgZW5fdHlwLCBlbl93aG8sCisgIGVuX21haSwgZW5fcHJpLCBlbl9ta2QsIGVuX3JtZCwgZW5feGl0LCBlbl9lbmE7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKworZXh0ZXJuIGludCBhdGNhcHIsCisgIGF0ZW5jaSwgYXRlbmNvLCBhdGRhdGksIGF0ZGF0bywgYXRsZW5pLCBhdGxlbm8sIGF0YmxraSwgYXRibGtvLAorICBhdHR5cGksIGF0dHlwbywgYXRzaWRpLCBhdHNpZG8sIGF0c3lzaSwgYXRzeXNvLCBhdGRpc2ksIGF0ZGlzbzsKKworI2lmZGVmIFNUUkFUVVMKK2V4dGVybiBpbnQgYXRmcm1pLCBhdGZybW8sIGF0Y3JlaSwgYXRjcmVvLCBhdGFjdGksIGF0YWN0bzsKKyNlbmRpZiAvKiBTVFJBVFVTICovCisKKyNpZmRlZiBDS19QRVJNUworZXh0ZXJuIGludCBhdGxwcmksIGF0bHBybywgYXRncHJpLCBhdGdwcm87CisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKworI2lmZGVmIENLX0xPR0lOCitleHRlcm4gY2hhciAqIGFub25maWxlOyAgICAgICAgICAgICAgICAgLyogQW5vbnltb3VzIGxvZ2luIGluaXQgZmlsZSAqLworZXh0ZXJuIGNoYXIgKiBhbm9ucm9vdDsgICAgICAgICAgICAgICAgIC8qIEFub255bW91cyBmaWxlLXN5c3RlbSByb290ICovCitleHRlcm4gY2hhciAqIHVzZXJmaWxlOyAgICAgICAgICAgICAgICAgLyogRm9yYmlkZGVuIHVzZXIgZmlsZSAqLworZXh0ZXJuIGludCBpc2d1ZXN0OyAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIGFub255bW91cyB1c2VyICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIERDTURCVUYKK2ludCAqeHF1aWV0ID0gTlVMTDsKKyNlbHNlCitpbnQgeHF1aWV0W0NNRFNUS0xdOworI2VuZGlmIC8qIERDTURCVUYgKi8KKworY2hhciAqIHByc3RyaW5nW0NNRFNUS0xdOworCisjaWZuZGVmIE5PU1BMCisKK2V4dGVybiBsb25nIGNrX2FsYXJtOworZXh0ZXJuIGNoYXIgYWxybV9kYXRlW10sIGFscm1fdGltZVtdOworCisvKiBMb2NhbCBkZWNsYXJhdGlvbnMgKi8KKworc3RhdGljIGludCBudWxjbWQgPSAwOyAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIG5leHQgY21kIHRvIGJlIGlnbm9yZWQgKi8KKworLyogRGVmaW5pdGlvbnMgZm9yIHByZWRlZmluZWQgbWFjcm9zICovCisKKy8qIEZpcnN0LCB0aGUgc2luZ2xlLWxpbmUgbWFjcm9zLCBpbnN0YWxsZWQgd2l0aCBhZGRtYWMoKS4uLiAqLworCisvKiBJQk0tTElORU1PREUgbWFjcm8gKi8KK2NoYXIgKm1faWJtID0gInNldCBwYXJpdHkgbWFyaywgc2V0IGR1cGwgaGFsZiwgc2V0IGhhbmRzaCB4b24sIHNldCBmbG93IG5vbmUiOworCisvKiBGQVRBTCBtYWNybyAqLworY2hhciAqbV9mYXQgPSAiaWYgZGVmIFxcJTEgZWNobyBcXCUxLCBpZiBub3QgPSBcXHYobG9jYWwpIDAgaGFuZ3VwLCBzdG9wIDEiOworCisjaWZkZWYgQ0tfU1BFRUQKKyNpZmRlZiBJUklYNjUKK2NoYXIgKm1fZmFzdCA9ICJzZXQgd2luIDMwLCBzZXQgcmVjIHBhY2sgNDAwMCwgc2V0IHByZWZpeCBjYXV0aW91cyI7CisjZWxzZQorI2lmZGVmIElSSVgKKy8qIEJlY2F1c2Ugb2YgYnVnIGluIHRlbG5ldCBzZXJ2ZXIgKi8KK2NoYXIgKm1fZmFzdCA9ICJzZXQgd2luZG93IDMwLCBzZXQgcmVjIHBhY2sgNDAwMCwgc2V0IHNlbmQgcGFjayA0MDAwLFwKKyBzZXQgcHJlZiBjYXV0aW91cyI7CisjZWxzZQorI2lmZGVmIHBkcDExCitjaGFyICptX2Zhc3QgPSAic2V0IHdpbiAzLCBzZXQgcmVjIHBhY2sgMTAyNCwgc2V0IHByZWZpeCBjYXV0aW91cyI7CisjZWxzZQorI2lmZGVmIEJJR0JVRk9LCitjaGFyICptX2Zhc3QgPSAic2V0IHdpbiAzMCwgc2V0IHJlYyBwYWNrIDQwMDAsIHNldCBwcmVmaXggY2F1dGlvdXMiOworI2Vsc2UKK2NoYXIgKm1fZmFzdCA9ICJzZXQgd2luIDQsIHNldCByZWMgcGFjayAyMjAwLCBzZXQgcHJlZml4IGNhdXRpb3VzIjsKKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworI2VuZGlmIC8qIElSSVggKi8KKyNlbmRpZiAvKiBJUklYNjUgKi8KKyNlbmRpZiAvKiBwZHAxMSAqLworI2lmZGVmIHBkcDExCitjaGFyICptX2NhdXRpb3VzID0gInNldCB3aW4gMiwgc2V0IHJlYyBwYWNrIDUxMiwgc2V0IHByZWZpeGluZyBjYXV0aW91cyI7CisjZWxzZQorY2hhciAqbV9jYXV0aW91cyA9ICJzZXQgd2luIDQsIHNldCByZWMgcGFjayAxMDAwLCBzZXQgcHJlZml4aW5nIGNhdXRpb3VzIjsKKyNlbmRpZiAvKiBwZHAxMSAqLworY2hhciAqbV9yb2J1c3QgPSAic2V0IHdpbiAxLCBzZXQgcmVjIHBhY2sgOTAsIHNldCBwcmVmaXhpbmcgYWxsLCBcCitzZXQgcmVsaWFibGUgb2ZmLCBzZXQgY2xlYXJjaGFubmVsIG9mZiI7CisjZWxzZQorI2lmZGVmIEJJR0JVRk9LCisjaWZkZWYgSVJJWDY1CitjaGFyICptX2Zhc3QgPSAic2V0IHdpbiAzMCwgc2V0IHJlYyBwYWNrIDQwMDAiOworI2Vsc2UKKyNpZmRlZiBJUklYCitjaGFyICptX2Zhc3QgPSAic2V0IHdpbiAzMCwgc2V0IHJlYyBwYWNrIDQwMDAsIHNldCBzZW5kIHBhY2sgNDAwMCI7CisjZWxzZQorY2hhciAqbV9mYXN0ID0gInNldCB3aW4gMzAsIHNldCByZWMgcGFjayA0MDAwIjsKKyNlbmRpZiAvKiBJUklYICovCisjZW5kaWYgLyogSVJJWDY1ICovCisjZWxzZSAvKiBOb3QgQklHQlVGT0sgKi8KK2NoYXIgKm1fZmFzdCA9ICJzZXQgd2luIDQsIHNldCByZWMgcGFjayAyMjAwIjsKKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworY2hhciAqbV9jYXV0aW91cyA9ICJzZXQgd2luIDQsIHNldCByZWMgcGFjayAxMDAwIjsKK2NoYXIgKm1fcm9idXN0ID0gInNldCB3aW4gMSwgc2V0IHJlYyBwYWNrIDkwLCBzZXQgcmVsaWFibGUgb2ZmIjsKKyNlbmRpZiAvKiBDS19TUEVFRCAqLworCisjaWZkZWYgVk1TCitjaGFyICptX3B1cmdlID0gInJ1biBwdXJnZSBcXCUqIjsKKyNlbmRpZiAvKiBWTVMgKi8KKworI2lmZGVmIE9TMgorY2hhciAqbV9tYW51YWwgPSAiYnJvd3NlIFxcdihleGVkaXIpZG9jcy9tYW51YWwva2VybWl0OTUuaHRtIjsKKyNlbmRpZiAvKiBPUzIgKi8KKworLyogTm93IHRoZSBtdWx0aWxpbmUgbWFjcm9zLCBkZWZpbmVkIHdpdGggYWRkbW1hYygpLi4uICovCisKKy8qIEZPUiBtYWNybyBmb3IgXCVpLXN0eWxlIGxvb3AgdmFyaWFibGVzIChzZWUgZG9mb3IoKS4uLikgKi8KKworY2hhciAqZm9yX2RlZltdID0geyAiX2Fzc2lnbiBfZm9yXFx2KGNtZGxldmVsKSB7IF9nZXRhcmdzLCIsCisiZGVmIFxcXFxcXCUxIFxcZmV2YWwoXFwlMiksOl8uLnRvcCxpZiBcXCU1IFxcXFxcXCUxIFxcJTMgZ290byBfLi5ib3QsIiwKKyJcXCU2LDpfLi5pbmMsaW5jciBcXFxcXFwlMSBcXCU0LGdvdG8gXy4udG9wLDpfLi5ib3QsX3B1dGFyZ3N9LCIsCisiZGVmIGJyZWFrIGdvdG8gXy4uYm90LCBkZWYgY29udGludWUgZ290byBfLi5pbmMsIiwKKyJkbyBfZm9yXFx2KGNtZGxldmVsKSBcXCUxIFxcJTIgXFwlMyBcXCU0IHsgXFwlNSB9LF9hc3NpZ24gX2ZvclxcdihjbWRsZXZlbCkiLAorIiJ9OworCisvKiBUaGlzIGlzIHRoZSBGT1IgbWFjcm8gd2hlbiB0aGUgbG9vcCB2YXJpYWJsZSBpcyBpdHNlbGYgYSBtYWNybyAqLworCitjaGFyICpmb3pfZGVmW10gPSB7ICJfYXNzaWduIF9mb3JcXHYoY21kbGV2ZWwpIHsgX2dldGFyZ3MsIiwKKyJkZWYgXFwlMSBcXGZldmFsKFxcJTIpLDpfLi50b3AsaWYgXFwlNSBcXCUxIFxcJTMgZ290byBfLi5ib3QsIiwKKyJcXCU2LDpfLi5pbmMsaW5jciBcXCUxIFxcJTQsZ290byBfLi50b3AsOl8uLmJvdCxfcHV0YXJnc30sIiwKKyJkZWYgYnJlYWsgZ290byBfLi5ib3QsIGRlZiBjb250aW51ZSBnb3RvIF8uLmluYywiLAorImRvIF9mb3JcXHYoY21kbGV2ZWwpIFxcJTEgXFwlMiBcXCUzIFxcJTQgeyBcXCU1IH0sX2Fzc2lnbiBfZm9yXFx2KGNtZGxldmVsKSIsCisiIn07CisKKy8qIFdISUxFIG1hY3JvICovCitjaGFyICp3aGlsX2RlZltdID0geyAiX2Fzc2lnbiBfd2hpXFx2KGNtZGxldmVsKSB7X2dldGFyZ3MsIiwKKyI6Xy4uaW5jLFxcJTEsXFwlMixnb3RvIF8uLmluYyw6Xy4uYm90LF9wdXRhcmdzfSwiLAorIl9kZWYgYnJlYWsgZ290byBfLi5ib3QsIF9kZWYgY29udGludWUgZ290byBfLi5pbmMsIiwKKyJkbyBfd2hpXFx2KGNtZGxldmVsKSxfYXNzaWduIF93aGlcXHYoY21kbGV2ZWwpIiwKKyIifTsKKworLyogU1dJVENIIG1hY3JvICovCitjaGFyICpzd19kZWZbXSA9IHsgIl9hc3NpZ24gX3N3X1xcdihjbWRsZXZlbCkge19nZXRhcmdzLCIsCisiX2ZvcndhcmQge1xcJTF9LFxcJTIsOmRlZmF1bHQsOl8uLmJvdCxfcHV0YXJnc30sX2RlZiBicmVhayBnb3RvIF8uLmJvdCwiLAorImRvIF9zd19cXHYoY21kbGV2ZWwpLF9hc3NpZ24gX3N3X1xcdihjbWRsZXZlbCkiLAorIiJ9OworCisvKiBYSUYgbWFjcm8gKi8KK2NoYXIgKnhpZl9kZWZbXSA9IHsKKyJfYXNzaWduIF9pZlxcdihjbWRsZXZlbCkge19nZXRhcmdzLFxcJTEsX3B1dGFyZ3N9LCIsCisiZG8gX2lmXFx2KGNtZGxldmVsKSxfYXNzaWduIF9pZlxcdihjbWRsZXZlbCkiLAorIiJ9OworCisvKgorICBWYXJpYWJsZXMgZGVjbGFyZWQgaGVyZSBmb3IgdXNlIGJ5IG90aGVyIGNrdXVzKi5jIG1vZHVsZXMuCisgIFNwYWNlIGlzIGFsbG9jYXRlZCBoZXJlIHRvIHNhdmUgcm9vbSBpbiBja3V1c3IuYy4KKyovCisjaWZkZWYgRENNREJVRgorc3RydWN0IGNtZHB0ciAqY21kc3RrOworaW50CisgICppZmNtZCAgPSBOVUxMLAorICAqY291bnQgID0gTlVMTCwKKyAgKmlmdGVzdCA9IE5VTEwsCisgICppbnRpbWUgPSBOVUxMLAorICAqaW5wY2FzID0gTlVMTCwKKyAgKnRha2VyciA9IE5VTEwsCisgICptZXJyb3IgPSBOVUxMOworI2Vsc2UKK3N0cnVjdCBjbWRwdHIgY21kc3RrW0NNRFNUS0xdOworaW50IGlmY21kW0NNRFNUS0xdLCBjb3VudFtDTURTVEtMXSwgaWZ0ZXN0W0NNRFNUS0xdLCBpbnRpbWVbQ01EU1RLTF0sCisgIGlucGNhc1tDTURTVEtMXSwgdGFrZXJyW0NNRFNUS0xdLCBtZXJyb3JbQ01EU1RLTF07CisjZW5kaWYgLyogRENNREJVRiAqLworCisvKiBNYWNybyBzdGFjayAqLworCisjaWZkZWYgQ09NTUVOVAorY2hhciAqdG9wbGluZSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgIC8qIFByb2dyYW0gaW52b2NhdGlvbiBhcmcgbGluZSAqLworY2hhciAqbV9saW5lW01BQ0xFVkVMXSA9IHsgTlVMTCwgTlVMTCB9OyAvKiBTdGFjayBvZiBtYWNybyBpbnZvY2F0aW9uIGxpbmVzICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCitjaGFyICoqbV94YXJnW01BQ0xFVkVMXTsgICAgICAgICAgICAgICAgLyogUG9pbnRlcnMgdG8gYXJnIHZlY3RvciBhcnJheXMgKi8KK2ludCBuX3hhcmdbTUFDTEVWRUxdOyAgICAgICAgICAgICAgICAgICAvKiBTaXplcyBvZiBhcmcgdmVjdG9yIGFycmF5cyAqLworY2hhciAqbV9hcmdbTUFDTEVWRUxdW05BUkdTXTsgICAgICAgICAgIC8qIEFyZ3Mgb2YgZWFjaCBsZXZlbCAqLworaW50IG1hY2FyZ2NbTUFDTEVWRUxdOyAgICAgICAgICAgICAgICAgIC8qIEFyZ2Mgb2YgZWFjaCBsZXZlbCAqLworY2hhciAqbWFjcFtNQUNMRVZFTF07ICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgcG9zaXRpb24gaW4gZWFjaCBtYWNybyAqLworY2hhciAqbWFjeFtNQUNMRVZFTF07ICAgICAgICAgICAgICAgICAgIC8qIEJlZ2lubmluZyBvZiBlYWNoIG1hY3JvIGRlZiAqLworY2hhciAqbXJ2YWxbTUFDTEVWRUxdOyAgICAgICAgICAgICAgICAgIC8qIFJFVFVSTiB2YWx1ZSBhdCBlYWNoIGxldmVsICovCitpbnQgbGFzdGNtZFtNQUNMRVZFTF07ICAgICAgICAgICAgICAgICAgLyogTGFzdCBjb21tYW5kIGF0IGVhY2ggbGV2ZWwgKi8KK2ludCB0b3BhcmdjID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBcmdjIGF0IHRvcCBsZXZlbCAqLworY2hhciAqKnRvcHhhcmcgPSBOVUxMOyAgICAgICAgICAgICAgICAgIC8qIEFyZ3YgYXQgdG9wIGxldmVsICovCitjaGFyICp0b3BhcmdbTUFYQVJHTElTVCsyXTsKKworLyogR2xvYmFsIFZhcmlhYmxlcyAqLworCitjaGFyICpnX3ZhcltHVkFSUysxXTsgICAgICAgICAgICAgICAgICAgLyogR2xvYmFsIFwlYS4ueiBwb2ludGVycyAqLworZXh0ZXJuIGNoYXIgdmFybmFtW107ICAgICAgICAgICAgICAgICAgIC8qIFwleCB2YXJpYWJsZSBuYW1lIGJ1ZmZlciAqLworCisvKiBBcnJheXMgLS0gRGltZW5zaW9uIG11c3QgYmUgJ3onIC0gQVJSQVlCQVNFICsgMSAqLworLyogTm90ZTogYV9saW5rW3hdIDwgMCBtZWFucyBubyBsaW5rOyA+PSAwIGlzIGEgbGluayAqLworCitjaGFyICoqYV9wdHJbMzJdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQXJyYXkgcG9pbnRlcnMsIGZvciBhcnJheXMgYS16ICovCitpbnQgYV9kaW1bMzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGltZW5zaW9ucyBmb3IgZWFjaCBhcnJheSAqLworaW50IGFfbGlua1szMl07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpbmsgKGluZGV4IG9mIGxpbmtlZC10by1hcnJheSkgKi8KKworY2hhciAqKmFhX3B0cltDTURTVEtMXVszMl07ICAgICAgICAgICAgIC8qIEFycmF5IHN0YWNrIGZvciBhdXRvbWF0aWMgYXJyYXlzICovCitpbnQgYWFfZGltW0NNRFNUS0xdWzMyXTsgICAgICAgICAgICAgICAgLyogRGltZW5zaW9ucyBmb3IgZWFjaCBhcnJheSAqLworCisvKiBJTlBVVCBjb21tYW5kIGJ1ZmZlcnMgYW5kIHZhcmlhYmxlcyAqLworCitjaGFyICogaW5wYnVmID0gTlVMTDsgICAgICAgICAgICAgICAgICAgLyogQnVmZmVyIGZvciBJTlBVVCBhbmQgUkVJTlBVVCAqLworZXh0ZXJuIGNoYXIgKiBpbnBicDsgICAgICAgICAgICAgICAgICAgIC8qIEdsb2JhbC9zdGF0aWMgcG9pbnRlciB0byBpdCAgKi8KK2NoYXIgaW5jaGFyWzJdID0geyBOVUwsIE5VTCB9OyAgICAgICAgICAvKiBMYXN0IGNoYXJhY3RlciB0aGF0IHdhcyBJTlBVVCAqLworaW50ICBpbmNvdW50ID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIElOUFVUIGNoYXJhY3RlciBjb3VudCAqLworZXh0ZXJuIGludCBpbnN0YXR1czsgICAgICAgICAgICAgICAgICAgIC8qIElOUFVUIHN0YXR1cyAqLworc3RhdGljIGNoYXIgKiBpX3RleHRbXSA9IHsgICAgICAgICAgICAgIC8qIElOUFVUIHN0YXR1cyB0ZXh0ICovCisgICAgInN1Y2Nlc3MiLCAidGltZW91dCIsICJpbnRlcnJ1cHRlZCIsICJpbnRlcm5hbCBlcnJvciIsICJpL28gZXJyb3IiCit9OworCitjaGFyIGxibGJ1ZltMQkxTSVpdOyAgICAgICAgICAgICAgICAgICAgLyogQnVmZmVyIGZvciBsYWJlbHMgKi8KKworI2Vsc2UgIC8qIE5PU1BMICovCisKK2ludCB0YWtlcnJbTUFYVEFLRV07CisjZW5kaWYgLyogTk9TUEwgKi8KKworc3RhdGljIGNoYXIgKnByZXZkaXIgPSBOVUxMOworCitpbnQgcGFjaW5nID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogT1VUUFVUIHBhY2luZyAqLworCitjaGFyICp0cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVtcG9yYXJ5IGJ1ZmZlciBwb2ludGVyICovCisKK2ludCB0aW1lbGltaXQgPSAwLCBhc2t0aW1lciA9IDA7ICAgICAgICAvKiBUaW1lcnMgZm9yIHRpbWUtbGltaXRlZCBjb21tYW5kcyAqLworCisjaWZkZWYgQ0tfQVBDICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXBwbGljYXRpb24gUHJvZ3JhbSBDb21tYW5kIChBUEMpICovCitpbnQgYXBjYWN0aXZlID0gQVBDX0lOQUNUSVZFOworaW50IGFwY3N0YXR1cyA9IEFQQ19PRkY7ICAgICAgICAgICAgICAgIC8qIE9GRiBieSBkZWZhdWx0IGV2ZXJ5d2hlcmUgKi8KKyNpZmRlZiBEQ01EQlVGCitjaGFyICphcGNidWY7CisjZWxzZQorY2hhciBhcGNidWZbQVBDQlVGTEVOXTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisjZW5kaWYgLyogQ0tfQVBDICovCisKK2V4dGVybiBjaGFyIHBrdGZpbFtdLAorI2lmZGVmIERFQlVHCisgIGRlYmZpbFtdLAorI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgVExPRworICB0cmFmaWxbXSwKKyNlbmRpZiAvKiBUTE9HICovCisgIHNlc2ZpbFtdOworCisjaWZuZGVmIE5PRlJJTExTCitleHRlcm4gaW50IHJtYWlsZiwgcnByaW50ZjsgICAgICAgICAgICAgLyogUkVNT1RFIE1BSUwgJiBQUklOVCBpdGVtcyAqLworZXh0ZXJuIGNoYXIgb3B0YnVmW107CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworZXh0ZXJuIGludCBub2luaXQ7CQkJLyogRmxhdCB0byBza2lwIGluaXQgZmlsZSAqLworCisjaWZuZGVmIE5PU1BMCitzdGF0aWMgc3RydWN0IGtleXRhYiBrY2R0YWJbXSA9IHsJLyogU3ltYm9saWMgZGlyZWN0b3J5IG5hbWVzICovCisjaWZkZWYgTlQKKyAgICB7ICJhcHBkYXRhIiwgIFZOX0FQUERBVEEsICAgMCB9LAorICAgIHsgImNvbW1vbiIsICAgVk5fQ09NTU9OLCAgICAwIH0sCisgICAgeyAiZGVza3RvcCIsICBWTl9ERVNLVE9QLCAgIDAgfSwKKyNlbmRpZiAvKiBOVCAqLworICAgIHsgImRvd25sb2FkIiwgVk5fRExESVIsICAgICAwIH0sCisjaWZkZWYgT1MyT1JVTklYCisgICAgeyAiZXhlZGlyIiwgICBWTl9FWEVESVIsICAgIDAgfSwKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyAgICB7ICJob21lIiwgICAgIFZOX0hPTUUsICAgICAgMCB9LAorICAgIHsgImluaWRpciIsICAgVk5fSU5JLCAgICAgICAwIH0sCisjaWZkZWYgVU5JWAorICAgIHsgImxvY2tkaXIiLCAgVk5fTENLRElSLCAgICAwIH0sCisjZW5kaWYgLyogVU5JWCAqLworI2lmZGVmIE5UCisgICAgeyAicGVyc29uYWwiLCBWTl9QRVJTT05BTCwgIDAgfSwKKyNlbmRpZiAvKiBOVCAqLworICAgIHsgInN0YXJ0dXAiLCAgVk5fU1RBUiwgICAgICAwIH0sCisgICAgeyAidGV4dGRpciIsICBWTl9UWFRESVIsICAgIDAgfSwKKyAgICB7ICJ0bXBkaXIiLCAgIFZOX1RFTVAsICAgICAgMCB9Cit9Oworc3RhdGljIGludCBua2NkdGFiID0gKHNpemVvZihrY2R0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PU1BMCitfUFJPVE9UWVAoIFZPSUQgZnJlZWxvY2FsLCAoaW50KSApOworX1BST1RPVFlQKCBzdGF0aWMgbG9uZyBleHBvbiwgKGxvbmcsIGxvbmcpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBsb25nIGdjZCwgKGxvbmcsIGxvbmcpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBsb25nIGZhY3QsIChsb25nKSApOworCitpbnQgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIG1hY3JvIGRhdGEgc3RydWN0dXJlcy4gKi8KK21hY2luaSgpIHsgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG1hY3RhYiBhbmQgcHJlc2V0IHRoZSBmaXJzdCBlbGVtZW50LiAqLworICAgIGludCBpOworICAgIGlmICghKG1hY3RhYiA9IChzdHJ1Y3QgbXRhYiAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBtdGFiKSAqIE1BQ19NQVgpKSkKKyAgICAgIHJldHVybigtMSk7CisgICAgbWFjdGFiWzBdLmt3ZCA9IE5VTEw7CisgICAgbWFjdGFiWzBdLm12YWwgPSBOVUxMOworICAgIG1hY3RhYlswXS5mbGdzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFDTEVWRUw7IGkrKykKKyAgICAgIGxvY2FsaGVhZFtpXSA9IE5VTEw7CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIE5PU1BMICovCisKKy8qICBDIE0gRCBTIFIgQyAgLS0gIFJldHVybnMgY3VycmVudCBjb21tYW5kIHNvdXJjZSAgKi8KKworLyogIDAgPSB0b3AgbGV2ZWwsIDEgPSBmaWxlLCAyID0gbWFjcm8sIC0xID0gZXJyb3IgKHNob3VsZG4ndCBoYXBwZW4pICovCisKKy8qCisgIEFzIG9mIDE5IEF1ZyAyMDAwIHRoaXMgcm91dGluZSBpcyBvYnNvbGV0ZS4gIFRoZSBzY2FsYXIgZ2xvYmFsIHZhcmlhYmxlCisgIHhjbWRzcmMgY2FuIGJlIGNoZWNrZWQgaW5zdGVhZCB0byBzYXZlIHRoZSBvdmVyaGVhZCBvZiBhIGZ1bmN0aW9uIGNhbGwuCisqLworaW50CitjbWRzcmMoKSB7CisjaWZkZWYgQ09NTUVOVAorICAgIHJldHVybih4Y21kc3JjKTsKKyNlbHNlCisjaWZuZGVmIE5PU1BMCisgICAgaWYgKGNtZGx2bCA9PSAwKQorICAgICAgcmV0dXJuKDApOworICAgIGVsc2UgaWYgKGNtZHN0a1tjbWRsdmxdLnNyYyA9PSBDTURfTUQpCisgICAgICByZXR1cm4oMik7CisgICAgZWxzZSBpZiAoY21kc3RrW2NtZGx2bF0uc3JjID09IENNRF9URikKKyAgICAgIHJldHVybigxKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oLTEpOworI2Vsc2UKKyAgICBpZiAodGxldmVsIDwgMCkKKyAgICAgIHJldHVybigwKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oMSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCit9CisKKy8qICBDIE0gRCBJIE4gSSAgLS0gIEluaXRpYWxpemUgdGhlIGludGVyYWN0aXZlIGNvbW1hbmQgcGFyc2VyICAqLworCitzdGF0aWMgaW50IGNtZGluaXRlZCA9IDA7ICAgICAgICAgICAgICAgLyogQ29tbWFuZCBwYXJzZXIgaW5pdGlhbGl6ZWQgKi8KK2V4dGVybiBpbnQgY21kaW50OyAgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHRzIGFyZSBhbGxvd2VkICovCisjaWZkZWYgQ0tfQVVUT0RMCitpbnQgY21kYWRsID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0b2Rvd25sb2FkICovCisjZWxzZQoraW50IGNtZGFkbCA9IDA7CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisKK2NoYXIgKiBrX2luZm9fZGlyID0gTlVMTDsgICAgICAgICAgICAgICAvKiBXaGVyZSB0byBmaW5kIHRleHQgZmlsZXMgKi8KKyNpZmRlZiBVTklYCitzdGF0aWMgY2hhciAqIHR4dGRpcltdID0geworICAgICIvdXNyL2xvY2FsL2RvYy8iLCAgICAgICAgICAgICAgICAgIC8qIExpbnV4LCBTdW5PUywgLi4uICovCisgICAgIi91c3Ivc2hhcmUvbGliLyIsICAgICAgICAgICAgICAgICAgLyogSFAtVVggMTAueHguLi4gKi8KKyAgICAiL3Vzci9zaGFyZS9kb2MvIiwgICAgICAgICAgICAgICAgICAvKiBPdGhlciBwb3NzaWJpbGl0aWVzLi4uICovCisgICAgIi91c3IvbG9jYWwvbGliLyIsICAgICAgICAgICAgICAgICAgLyogTk9URTogRWFjaCBvZiB0aGVzZSBpcyB0cmllZCAqLworICAgICIvdXNyL2xvY2FsL3NoYXJlLyIsICAgICAgICAgICAgICAgIC8qIGFzIGlzLCBhbmQgYWxzbyB3aXRoIGEga2VybWl0ICovCisgICAgIi91c3IvbG9jYWwvc2hhcmUvZG9jLyIsICAgICAgICAgICAgLyogc3ViZGlyZWN0b3J5LiAqLworICAgICIvdXNyL2xvY2FsL3NoYXJlL2xpYi8iLAorICAgICIvb3B0L2tlcm1pdC8iLCAgICAgICAgICAgICAgICAgICAgIC8qIFNvbGFyaXMgKi8KKyAgICAiL29wdC9rZXJtaXQvZG9jLyIsCisgICAgIi9vcHQvIiwKKyAgICAiL3Vzci9kb2MvIiwKKyAgICAiL2RvYy8iLAorICAgICIiCit9OworI2VuZGlmIC8qIFVOSVggKi8KKworLyoKKyAgbG9va3VwKCkgY2FjaGUgdG8gc3BlZWQgdXAgc2NyaXB0IGV4ZWN1dGlvbi4KKworICBUaGlzIGlzIGEgc3RhdGljIGNhY2hlLiAgSXRlbXMgYXJlIHN0b3JlZCBpbiBkZWNyZWFzaW5nIGZyZXF1ZW5jeSBvZgorICByZWZlcmVuY2UgYmFzZWQgb24gc3RhdGlzdGljcyBmcm9tIGEgcmFuZ2Ugb2Ygc2NyaXB0cy4gIFRoaXMgZ2l2ZXMKKyAgYmV0dGVyIHBlcmZvcm1hbmNlIHRoYW4gYSBkeW5hbWljIGNhY2hlLCB3aGljaCB3b3VsZCByZXF1aXJlIGEgbG90IG1vcmUKKyAgY29kZSBhbmQgYWxzbyB3b3VsZCByZXF1aXJlIHN5c3RlbS1kZXBlbmRlbnQgZWxlbWVudHMgaW5jbHVkaW5nIHN5c3RlbQorICBjYWxscyAoZS5nLiB0byBnZXQgc3Vic2Vjb25kIHRpbWVzIGZvciBlbnRyeSBhZ2luZykuCisqLworI2lmZGVmIFVTRV9MVUNBQ0hFICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBpbiBja3V1c3IuaCAqLworI2RlZmluZSBMVUNBQ0hFIDMyICAgICAgICAgICAgICAgICAgICAgIC8qIENoYW5nZSB0aGlzIHRvIHJlZHVjZSBjYWNoZSBzaXplICovCitpbnQgbHVzaXplID0gMDsKK2NoYXIgKiBsdWNtZFtMVUNBQ0hFXTsKK2ludCBsdXZhbFtMVUNBQ0hFXTsKK2ludCBsdWlkeFtMVUNBQ0hFXTsKK3N0cnVjdCBrZXl0YWIgKiBsdXRhYltMVUNBQ0hFXTsKKyNlbmRpZiAvKiBVU0VfTFVDQUNIRSAqLworCitzdGF0aWMgVk9JRAorbHVpbml0KCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgbG9va3VwKCkgY2FjaGUgKi8KKyAgICBpbnQgeCwgeTsKKworI2lmZGVmIFVTRV9MVUNBQ0hFCisgICAgeCA9IGxvb2t1cChjbWR0YWIsImlmIixuY21kLCZ5KTsKKyAgICBsdWNtZFtsdXNpemVdID0gImlmIjsKKyAgICBsdXZhbFtsdXNpemVdID0geDsKKyAgICBsdWlkeFtsdXNpemVdID0geTsKKyAgICBsdXRhYltsdXNpemVdID0gY21kdGFiOworICAgIGlmICgrK2x1c2l6ZSA+IExVQ0FDSEUpIHJldHVybjsKKworICAgIHggPSBsb29rdXAoaWZ0YWIsIm5vdCIsbmlmLCZ5KTsKKyAgICBsdWNtZFtsdXNpemVdID0gIm5vdCI7CisgICAgbHV2YWxbbHVzaXplXSA9IHg7CisgICAgbHVpZHhbbHVzaXplXSA9IHk7CisgICAgbHV0YWJbbHVzaXplXSA9IGlmdGFiOworICAgIGlmICgrK2x1c2l6ZSA+IExVQ0FDSEUpIHJldHVybjsKKworICAgIHggPSBsb29rdXAodmFydGFiLCJjbWRsZXZlbCIsbnZhcnMsJnkpOworICAgIGx1Y21kW2x1c2l6ZV0gPSAiY21kbGV2ZWwiOworICAgIGx1dmFsW2x1c2l6ZV0gPSB4OworICAgIGx1aWR4W2x1c2l6ZV0gPSB5OworICAgIGx1dGFiW2x1c2l6ZV0gPSB2YXJ0YWI7CisgICAgaWYgKCsrbHVzaXplID4gTFVDQUNIRSkgcmV0dXJuOworCisgICAgeCA9IGxvb2t1cChjbWR0YWIsImdvdG8iLG5jbWQsJnkpOworICAgIGx1Y21kW2x1c2l6ZV0gPSAiZ290byI7CisgICAgbHV2YWxbbHVzaXplXSA9IHg7CisgICAgbHVpZHhbbHVzaXplXSA9IHk7CisgICAgbHV0YWJbbHVzaXplXSA9IGNtZHRhYjsKKyAgICBpZiAoKytsdXNpemUgPiBMVUNBQ0hFKSByZXR1cm47CisKKyAgICB4ID0gbG9va3VwKGlmdGFiLCI+IixuaWYsJnkpOworICAgIGx1Y21kW2x1c2l6ZV0gPSAiPiI7CisgICAgbHV2YWxbbHVzaXplXSA9IHg7CisgICAgbHVpZHhbbHVzaXplXSA9IHk7CisgICAgbHV0YWJbbHVzaXplXSA9IGlmdGFiOworICAgIGlmICgrK2x1c2l6ZSA+IExVQ0FDSEUpIHJldHVybjsKKworICAgIHggPSBsb29rdXAoY21kdGFiLCJpbmNyIixuY21kLCZ5KTsKKyAgICBsdWNtZFtsdXNpemVdID0gImluY3IiOworICAgIGx1dmFsW2x1c2l6ZV0gPSB4OworICAgIGx1aWR4W2x1c2l6ZV0gPSB5OworICAgIGx1dGFiW2x1c2l6ZV0gPSBjbWR0YWI7CisgICAgaWYgKCsrbHVzaXplID4gTFVDQUNIRSkgcmV0dXJuOworCisgICAgeCA9IGxvb2t1cChjbWR0YWIsImRlZiIsbmNtZCwmeSk7CisgICAgbHVjbWRbbHVzaXplXSA9ICJkZWYiOworICAgIGx1dmFsW2x1c2l6ZV0gPSB4OworICAgIGx1aWR4W2x1c2l6ZV0gPSB5OworICAgIGx1dGFiW2x1c2l6ZV0gPSBjbWR0YWI7CisgICAgaWYgKCsrbHVzaXplID4gTFVDQUNIRSkgcmV0dXJuOworCisgICAgeCA9IGxvb2t1cChjbWR0YWIsIl9hc3NpZ24iLG5jbWQsJnkpOworICAgIGx1Y21kW2x1c2l6ZV0gPSAiX2Fzc2lnbiI7CisgICAgbHV2YWxbbHVzaXplXSA9IHg7CisgICAgbHVpZHhbbHVzaXplXSA9IHk7CisgICAgbHV0YWJbbHVzaXplXSA9IGNtZHRhYjsKKyAgICBpZiAoKytsdXNpemUgPiBMVUNBQ0hFKSByZXR1cm47CisKKyAgICB4ID0gbG9va3VwKGNtZHRhYiwiZWNobyIsbmNtZCwmeSk7CisgICAgbHVjbWRbbHVzaXplXSA9ICJlY2hvIjsKKyAgICBsdXZhbFtsdXNpemVdID0geDsKKyAgICBsdWlkeFtsdXNpemVdID0geTsKKyAgICBsdXRhYltsdXNpemVdID0gY21kdGFiOworICAgIGlmICgrK2x1c2l6ZSA+IExVQ0FDSEUpIHJldHVybjsKKworICAgIHggPSBsb29rdXAoZm5jdGFiLCJldmFsIixuZnVuY3MsJnkpOworICAgIGx1Y21kW2x1c2l6ZV0gPSAiZXZhbCI7CisgICAgbHV2YWxbbHVzaXplXSA9IHg7CisgICAgbHVpZHhbbHVzaXplXSA9IHk7CisgICAgbHV0YWJbbHVzaXplXSA9IGZuY3RhYjsKKyAgICBpZiAoKytsdXNpemUgPiBMVUNBQ0hFKSByZXR1cm47CisKKyAgICB4ID0gbG9va3VwKGZuY3RhYiwibGl0IixuZnVuY3MsJnkpOworICAgIGx1Y21kW2x1c2l6ZV0gPSAibGl0IjsKKyAgICBsdXZhbFtsdXNpemVdID0geDsKKyAgICBsdWlkeFtsdXNpemVdID0geTsKKyAgICBsdXRhYltsdXNpemVdID0gZm5jdGFiOworICAgIGlmICgrK2x1c2l6ZSA+IExVQ0FDSEUpIHJldHVybjsKKworICAgIHggPSBsb29rdXAoY21kdGFiLCJkbyIsbmNtZCwmeSk7CisgICAgbHVjbWRbbHVzaXplXSA9ICJkbyI7CisgICAgbHV2YWxbbHVzaXplXSA9IHg7CisgICAgbHVpZHhbbHVzaXplXSA9IHk7CisgICAgbHV0YWJbbHVzaXplXSA9IGNtZHRhYjsKKyAgICBpZiAoKytsdXNpemUgPiBMVUNBQ0hFKSByZXR1cm47CisKKyAgICB4ID0gbG9va3VwKGNtZHRhYiwiX2dldGFyZ3MiLG5jbWQsJnkpOworICAgIGx1Y21kW2x1c2l6ZV0gPSAiX2dldGFyZ3MiOworICAgIGx1dmFsW2x1c2l6ZV0gPSB4OworICAgIGx1aWR4W2x1c2l6ZV0gPSB5OworICAgIGx1dGFiW2x1c2l6ZV0gPSBjbWR0YWI7CisgICAgaWYgKCsrbHVzaXplID4gTFVDQUNIRSkgcmV0dXJuOworCisgICAgeCA9IGxvb2t1cChpZnRhYiwiPCIsbmlmLCZ5KTsKKyAgICBsdWNtZFtsdXNpemVdID0gIjwiOworICAgIGx1dmFsW2x1c2l6ZV0gPSB4OworICAgIGx1aWR4W2x1c2l6ZV0gPSB5OworICAgIGx1dGFiW2x1c2l6ZV0gPSBpZnRhYjsKKyAgICBpZiAoKytsdXNpemUgPiBMVUNBQ0hFKSByZXR1cm47CisKKyAgICB4ID0gbG9va3VwKGNtZHRhYiwiX3B1dGFyZ3MiLG5jbWQsJnkpOworICAgIGx1Y21kW2x1c2l6ZV0gPSAiX3B1dGFyZ3MiOworICAgIGx1dmFsW2x1c2l6ZV0gPSB4OworICAgIGx1aWR4W2x1c2l6ZV0gPSB5OworICAgIGx1dGFiW2x1c2l6ZV0gPSBjbWR0YWI7CisgICAgaWYgKCsrbHVzaXplID4gTFVDQUNIRSkgcmV0dXJuOworCisgICAgeCA9IGxvb2t1cChjbWR0YWIsImFzZyIsbmNtZCwmeSk7CisgICAgbHVjbWRbbHVzaXplXSA9ICJhc2ciOworICAgIGx1dmFsW2x1c2l6ZV0gPSB4OworICAgIGx1aWR4W2x1c2l6ZV0gPSB5OworICAgIGx1dGFiW2x1c2l6ZV0gPSBjbWR0YWI7CisgICAgaWYgKCsrbHVzaXplID4gTFVDQUNIRSkgcmV0dXJuOworCisgICAgeCA9IGxvb2t1cChjbWR0YWIsImVsc2UiLG5jbWQsJnkpOworICAgIGx1Y21kW2x1c2l6ZV0gPSAiZWxzZSI7CisgICAgbHV2YWxbbHVzaXplXSA9IHg7CisgICAgbHVpZHhbbHVzaXplXSA9IHk7CisgICAgbHV0YWJbbHVzaXplXSA9IGNtZHRhYjsKKyNlbmRpZiAvKiBVU0VfTFVDQUNIRSAqLworfQorCitWT0lECitjbWRpbmkoKSB7CisgICAgaW50IGkgPSAwLCB4ID0gMCwgeSA9IDAsIHogPSAwLCBza2lwID0gMDsKKyAgICBjaGFyICogcDsKKyNpZmRlZiBUVFNQRExJU1QKKyAgICBsb25nICogc3MgPSBOVUxMOworICAgIGV4dGVybiBpbnQgbnNwZDsKKyAgICBleHRlcm4gc3RydWN0IGtleXRhYiAqIHNwZHRhYjsKKyNlbmRpZiAvKiBUVFNQRExJU1QgKi8KKworI2lmbmRlZiBOT1NQTAorLyoKKyAgT24gc3RhY2sgdG8gYWxsb3cgcmVjdXJzaW9uIQorKi8KKyAgICBjaGFyIHZuYW1idWZbVk5BTUxdOyAgICAgICAgICAgICAgICAvKiBCdWZmZXIgZm9yIHZhcmlhYmxlIG5hbWVzICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworICAgIGlmIChjbWRpbml0ZWQpICAgICAgICAgICAgICAgICAgICAgIC8qIEFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKyAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBkbyBpdCBhZ2FpbiAqLworCisgICAgZm9yIChpID0gMDsgaSA8IENNRFNUS0w7IGkrKykgICAgICAgLyogUHJvbXB0IHN0cmluZ3MgZm9yIGVhY2ggKi8KKyAgICAgIHByc3RyaW5nW2ldID0gTlVMTDsgICAgICAgICAgICAgICAvKiBjb21tYW5kIGxldmVsICovCisKKyNpZm5kZWYgTk9DU0VUUworICAgIHAgPSBnZXRlbnYoIktfQ0hBUlNFVCIpOyAgICAgICAgICAgIC8qIFNldCBkZWZhdWx0IGZpbGUgY2hhcmFjdGVyIHNldCAqLworICAgIGlmIChwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyb20gZW52aXJvbm1lbnQgKi8KKyAgICAgICAgeCA9IGxvb2t1cChmY3N0YWIscCxuZmlsYywmeSk7CisgICAgICAgIGlmICh4ID4gLTEpCisgICAgICAgICAgZmNoYXJzZXQgPSB4OworICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyAgICBwID0gZ2V0ZW52KCJLX0lORk9fRElSRUNUT1JZIik7ICAgICAvKiBGaW5kIEtlcm1pdCBpbmZvIGRpcmVjdG9yeSAqLworICAgIGlmIChwICYmICpwICYmIHN0cmxlbihwKSA8PSBDS01BWFBBVEgpCisgICAgICBtYWtlc3RyKCZrX2luZm9fZGlyLHApOworICAgIGlmICgha19pbmZvX2RpcikgeworICAgICAgICBwID0gZ2V0ZW52KCJLX0lORk9fRElSIik7CisgICAgICAgIGlmIChwICYmICpwICYmIHN0cmxlbihwKSA8PSBDS01BWFBBVEgpCisgICAgICAgICAgbWFrZXN0cigma19pbmZvX2RpcixwKTsKKyAgICB9CisjaWZkZWYgVU5JWAorICAgIGlmIChrX2luZm9fZGlyKSB7ICAgICAgICAgICAgICAgICAgIC8qIExvb2sgZm9yIEtlcm1pdCBkb2NzIGRpcmVjdG9yeSAqLworICAgICAgICBpZiAoemNoa2koa19pbmZvX2RpcikgPT0gLTIpIHsKKyAgICAgICAgICAgIGNoYXIgeGJ1ZltDS01BWFBBVEgrMzJdLCAqcyA9ICIiOworICAgICAgICAgICAgaWYgKGNrcmNoYXIoa19pbmZvX2RpcikgIT0gJy8nKQorICAgICAgICAgICAgICBzID0gIi8iOworICAgICAgICAgICAgY2ttYWttc2coeGJ1ZixDS01BWFBBVEgrMzIsa19pbmZvX2RpcixzLCJja3Vid3IudHh0IixOVUxMKTsKKyAgICAgICAgICAgIGlmICh6Y2hraSh4YnVmKSA8IDApCisgICAgICAgICAgICAgIG1ha2VzdHIoJmtfaW5mb19kaXIsTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFrX2luZm9fZGlyKSB7CisgICAgICAgIGNoYXIgeGJ1ZltDS01BWFBBVEgrMzJdOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgKih0eHRkaXJbaV0pOyBpKyspIHsKKyAgICAgICAgICAgIGNrbWFrbXNnKHhidWYsQ0tNQVhQQVRIKzMyLHR4dGRpcltpXSwiY2t1YndyLnR4dCIsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgIGlmICh6Y2hraSh4YnVmKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZrX2luZm9fZGlyLHR4dGRpcltpXSk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwia19pbmZvX2RpciAxIixrX2luZm9fZGlyLDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2ttYWttc2coeGJ1ZixDS01BWFBBVEgrMzIsCisgICAgICAgICAgICAgICAgICAgICB0eHRkaXJbaV0sImtlcm1pdC8iLCJja3Vid3IudHh0IixOVUxMKTsKKyAgICAgICAgICAgIGlmICh6Y2hraSh4YnVmKSA+IDApIHsKKyAgICAgICAgICAgICAgICBja21ha21zZyh4YnVmLENLTUFYUEFUSCszMix0eHRkaXJbaV0sImtlcm1pdC8iLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgbWFrZXN0cigma19pbmZvX2Rpcix4YnVmKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJrX2luZm9fZGlyIDIiLGtfaW5mb19kaXIsMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBja21ha21zZyh4YnVmLENLTUFYUEFUSCszMiwKKyAgICAgICAgICAgICAgICAgICAgIHR4dGRpcltpXSwiY2tlcm1pdC8iLCJja3Vid3IudHh0IixOVUxMKTsKKyAgICAgICAgICAgIGlmICh6Y2hraSh4YnVmKSA+IDApIHsKKyAgICAgICAgICAgICAgICBja21ha21zZyh4YnVmLENLTUFYUEFUSCszMix0eHRkaXJbaV0sImNrZXJtaXQvIixOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgIG1ha2VzdHIoJmtfaW5mb19kaXIseGJ1Zik7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwia19pbmZvX2RpciAzIixrX2luZm9fZGlyLDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChrX2luZm9fZGlyKSB7ICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIGl0IGVuZHMgd2l0aCAiLyIgKi8KKyAgICAgICAgICAgIGlmIChja3JjaGFyKGtfaW5mb19kaXIpICE9ICcvJykgeworICAgICAgICAgICAgICAgIGNoYXIgeGJ1ZltDS01BWFBBVEgrMzJdOworICAgICAgICAgICAgICAgIGNrbWFrbXNnKHhidWYsQ0tNQVhQQVRIKzMyLGtfaW5mb19kaXIsIi8iLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgbWFrZXN0cigma19pbmZvX2Rpcix4YnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisjaWZkZWYgT1MyCisgICAgeworICAgICAgICBjaGFyIHhkaXJbQ0tNQVhQQVRIKzhdLCAqcyA9ICIiOworICAgICAgICBleHRlcm4gY2hhciBzdGFydHVwZGlyW107CisgICAgICAgIHhkaXJbMF0gPSBOVUw7CisgICAgICAgIGlmIChja3JjaGFyKHN0YXJ0dXBkaXIpICE9ICcvJykKKyAgICAgICAgICBzID0gIi8iOworICAgICAgICBpZiAoc3RybGVuKHMpICsgc3RybGVuKHN0YXJ0dXBkaXIpICsgNSA8IENLTUFYUEFUSCArIDggKQorICAgICAgICAgIGNrbWFrbXNnKHhkaXIsQ0tNQVhQQVRIKzgscyxzdGFydHVwZGlyLCJET0MvIixOVUxMKTsKKyAgICAgICAgbWFrZXN0cigma19pbmZvX2Rpcix4ZGlyKTsKKyAgICB9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZkZWYgVFRTUERMSVNUCisgICAgaWYgKCFzcGR0YWIgJiYgKHNzID0gdHRzcGRsaXN0KCkpKSB7IC8qIEdldCBzcGVlZCBsaXN0IGlmIG5lY2Vzc2FyeSAqLworICAgICAgICBpbnQgaiwgaywgbSA9IDAsIG47ICAgICAgICAgICAgIC8qIENyZWF0ZSBzb3J0ZWQga2V5d29yZCB0YWJsZSAqLworICAgICAgICBjaGFyIGJ1ZlsxNl07CisgICAgICAgIGNoYXIgKiBwOworICAgICAgICBpZiAoKHNwZHRhYiA9CisgICAgICAgICAgICAgKHN0cnVjdCBrZXl0YWIgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3Qga2V5dGFiKSAqIHNzWzBdKSkpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gc3NbMF07IGkrKykgeyAvKiBzc1swXSA9IG51bWJlciBvZiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgIGlmIChzc1tpXSA8IDFMKSBicmVhazsgICAgIC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgICAgICAgICAgICBidWZbMF0gPSBOVUw7ICAgICAgICAgICAgICAvKiBNYWtlIHN0cmluZyAqLworICAgICAgICAgICAgICAgIHNwcmludGYoYnVmLCIlbGQiLHNzW2ldKTsgIC8qIFNBRkUgKi8KKyAgICAgICAgICAgICAgICBpZiAoc3NbaV0gPT0gODg4MEwpCisgICAgICAgICAgICAgICAgICBja3N0cm5jcHkoYnVmLCI3NS8xMjAwIixzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgaWYgKHNzW2ldID09IDEzNEwpCisgICAgICAgICAgICAgICAgICBja3N0cm5jYXQoYnVmLCIuNSIsMTYpOworICAgICAgICAgICAgICAgIG4gPSBzdHJsZW4oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKG4gPiAwKSAmJiAocCA9IChjaGFyICopbWFsbG9jKG4rMSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtID4gMCkgeyAgICAgICAgLyogSGF2ZSBhdCBsZWFzdCBvbmUgaW4gbGlzdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgICAgIC8qIEZpbmQgc2xvdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqIDwgbSAmJiBzdHJjbXAoYnVmLHNwZHRhYltqXS5rd2QpID4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPCBtKSB7ICAgIC8qIE11c3QgaW5zZXJ0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gbS0xOyBrID49IGo7IGstLSkgeyAvKiBNb3ZlIG90aGVycyBkb3duICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZHRhYltrKzFdLmt3ZCA9IHNwZHRhYltrXS5rd2Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZHRhYltrKzFdLmZsZ3MgPSBzcGR0YWJba10uZmxnczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BkdGFiW2srMV0ua3d2YWwgPSBzcGR0YWJba10ua3d2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgIC8qIEZpcnN0IG9uZSAqLworICAgICAgICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkocCxidWYsbisxKTsgLyogQWRkIG5ldyBzcGVlZCAqLworICAgICAgICAgICAgICAgICAgICBzcGR0YWJbal0ua3dkID0gcDsKKyAgICAgICAgICAgICAgICAgICAgc3BkdGFiW2pdLmZsZ3MgPSAwOworICAgICAgICAgICAgICAgICAgICBzcGR0YWJbal0ua3d2YWwgPSAoaW50KSBzc1tpXSAvIDEwOworICAgICAgICAgICAgICAgICAgICBtKys7ICAgICAgICAgICAgICAgIC8qIENvdW50IHRoaXMgb25lICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5zcGQgPSBtOworICAgIH0KKyNlbmRpZiAvKiBUVFNQRExJU1QgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIC8qIEFsbG9jYXRlIElOUFVUIGNvbW1hbmQgYnVmZmVyICovCisgICAgaWYgKCFpbnBidWYpIHsKKyAgICAgICAgaWYgKCEoaW5wYnVmID0gKGNoYXIgKikgbWFsbG9jKElOUEJVRlNJWisxKSkpCisgICAgICAgICAgZmF0YWwoImNtZGluaTogbm8gbWVtb3J5IGZvciBJTlBVVCBidWZmZXIiKTsKKyAgICB9CisgICAgZm9yICh4ID0gMDsgeCA8IElOUEJVRlNJWjsgeCsrKSAgICAgLyogSW5pdGlhbGl6ZSBpdCAqLworICAgICAgaW5wYnVmW3hdID0gTlVMOworICAgIGlucGJwID0gaW5wYnVmOyAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgcG9pbnRlciAqLworICAgIGluYnVmc2l6ZSA9IElOUEJVRlNJWjsgICAgICAgICAgICAgIC8qIGFuZCBzaXplLiAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBEQ01EQlVGCisgICAgaWYgKGNtc2V0dXAoKSA8IDApIGZhdGFsKCJDYW4ndCBhbGxvY2F0ZSBjb21tYW5kIGJ1ZmZlcnMhIik7CisKKyNpZm5kZWYgTk9TUEwKKyAgICAvKiBBbGxvY2F0ZSBjb21tYW5kIHN0YWNrIGFsbG93aW5nIGNvbW1hbmQgcGFyc2VyIHRvIGNhbGwgaXRzZWxmICovCisKKyAgICBpZiAoIShjbWRzdGsgPSAoc3RydWN0IGNtZHB0ciAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRwdHIpKkNNRFNUS0wpKSkKKyAgICAgIGZhdGFsKCJjbWRpbmk6IG5vIG1lbW9yeSBmb3IgY21kc3RrIik7CisgICAgaWYgKCEoaWZjbWQgPSAoaW50ICopIG1hbGxvYyhzaXplb2YoaW50KSpDTURTVEtMKSkpCisgICAgICBmYXRhbCgiY21kaW5pOiBubyBtZW1vcnkgZm9yIGlmY21kIik7CisgICAgaWYgKCEoY291bnQgPSAoaW50ICopIG1hbGxvYyhzaXplb2YoaW50KSpDTURTVEtMKSkpCisgICAgICBmYXRhbCgiY21kaW5pOiBubyBtZW1vcnkgZm9yIGNvdW50Iik7CisgICAgaWYgKCEoaWZ0ZXN0ID0gKGludCAqKSBtYWxsb2Moc2l6ZW9mKGludCkqQ01EU1RLTCkpKQorICAgICAgZmF0YWwoImNtZGluaTogbm8gbWVtb3J5IGZvciBpZnRlc3QiKTsKKyAgICBpZiAoIShpbnRpbWUgPSAoaW50ICopIG1hbGxvYyhzaXplb2YoaW50KSpDTURTVEtMKSkpCisgICAgICBmYXRhbCgiY21kaW5pOiBubyBtZW1vcnkgZm9yIGludGltZSIpOworICAgIGlmICghKGlucGNhcyA9IChpbnQgKikgbWFsbG9jKHNpemVvZihpbnQpKkNNRFNUS0wpKSkKKyAgICAgIGZhdGFsKCJjbWRpbmk6IG5vIG1lbW9yeSBmb3IgaW5wY2FzIik7CisgICAgaWYgKCEodGFrZXJyID0gKGludCAqKSBtYWxsb2Moc2l6ZW9mKGludCkqQ01EU1RLTCkpKQorICAgICAgZmF0YWwoImNtZGluaTogbm8gbWVtb3J5IGZvciB0YWtlcnIiKTsKKyAgICBpZiAoIShtZXJyb3IgPSAoaW50ICopIG1hbGxvYyhzaXplb2YoaW50KSpDTURTVEtMKSkpCisgICAgICBmYXRhbCgiY21kaW5pOiBubyBtZW1vcnkgZm9yIG1lcnJvciIpOworICAgIGlmICghKHhxdWlldCA9IChpbnQgKikgbWFsbG9jKHNpemVvZihpbnQpKkNNRFNUS0wpKSkKKyAgICAgIGZhdGFsKCJjbWRpbmk6IG5vIG1lbW9yeSBmb3IgeHF1aWV0Iik7CisgICAgaWYgKCFrZXJtcmMpCisgICAgICBpZiAoIShrZXJtcmMgPSAoY2hhciAqKSBtYWxsb2MoS0VSTVJDTCsxKSkpCisgICAgICAgIGZhdGFsKCJjbWRpbmk6IG5vIG1lbW9yeSBmb3Iga2VybXJjIik7CisjaWZkZWYgQ0tfQVBDCisvKiBBcHBsaWNhdGlvbiBQcm9ncmFtIENvbW1hbmQgYnVmZmVyICovCisgICAgaWYgKCEoYXBjYnVmID0gbWFsbG9jKEFQQ0JVRkxFTiArIDEpKSkKKyAgICAgICAgZmF0YWwoImNtZGluaTogbm8gbWVtb3J5IGZvciBhcGNidWYiKTsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisvKiBsaW5lW10gYW5kIHRtcGJ1ZltdIGFyZSB0aGUgdHdvIHN0cmluZyBidWZmZXJzIHVzZWQgYnkgdGhlIGNvbW1hbmQgcGFyc2VyICovCisKKyAgICBpZiAoIShsaW5lID0gbWFsbG9jKExJTkJVRlNJWiArIDEpKSkKKyAgICAgICAgZmF0YWwoImNtZGluaTogbm8gbWVtb3J5IGZvciBsaW5lIik7CisgICAgaWYgKCEodG1wYnVmID0gbWFsbG9jKExJTkJVRlNJWiArIDEpKSkKKyAgICAgICAgZmF0YWwoImNtZGluaTogbm8gbWVtb3J5IGZvciB0bXBidWYiKTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisKKyNpZm5kZWYgTk9TUEwKKyNpZmRlZiBDS19NSU5QVVQKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIE1JTlBVVCBwb2ludGVycyAqLworICAgICAgICBpbnQgaTsKKyAgICAgICAgZXh0ZXJuIGNoYXIgKm1zW107CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNSU5QTUFYOyBpKyspCisgICAgICAgICAgbXNbaV0gPSBOVUxMOworICAgIH0KKyNlbmRpZiAvKiBDS19NSU5QVVQgKi8KKworICAgIGlmIChtYWNpbmkoKSA8IDApICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG1hY3JvIGJ1ZmZlcnMgKi8KKyAgICAgIGZhdGFsKCJDYW4ndCBhbGxvY2F0ZSBtYWNybyBidWZmZXJzISIpOworCisgICAgaWZjbWRbMF0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZC1sZXZlbCByZWxhdGVkIHZhcmlhYmxlcy4gKi8KKyAgICBpZnRlc3RbMF0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHZhcmlhYmxlcyBhdCB0b3AgbGV2ZWwgKi8KKyAgICBjb3VudFswXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBvZiBzdGFjay4uLiAqLworICAgIGludGltZVswXSA9IDA7CisgICAgaW5wY2FzWzBdID0gMDsKKyAgICB0YWtlcnJbMF0gPSAwOworICAgIG1lcnJvclswXSA9IDA7CisgICAgeHF1aWV0WzBdID0gcXVpZXQ7CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIGNtZGx2bCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGNvbW1hbmQgc3RhY2sgKi8KKyAgICB4Y21kc3JjID0gQ01EX0tCOworICAgIGNtZHN0a1tjbWRsdmxdLnNyYyA9IENNRF9LQjsgICAgICAgIC8qIFNvdXJjZSBpcyBjb25zb2xlICovCisgICAgY21kc3RrW2NtZGx2bF0ubHZsID0gMDsgICAgICAgICAgICAgLyogTGV2ZWwgaXMgMCAqLworICAgIGNtZHN0a1tjbWRsdmxdLmNjZmxncyA9IDA7ICAgICAgICAgIC8qIE5vIGZsYWdzICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworICAgIHRsZXZlbCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRha2UgZmlsZSBsZXZlbCA9IGtleWJvYXJkICovCisgICAgZm9yIChpID0gMDsgaSA8IE1BWFRBS0U7IGkrKykgICAgICAgLyogSW5pdGlhbGl6ZSBjb21tYW5kIGZpbGUgbmFtZXMgKi8KKyAgICAgIHRmbmFtW2ldID0gTlVMTDsKKworICAgIGNtc2V0cChja3Byb21wdCk7ICAgICAgICAgICAgICAgICAgIC8qIFNldCB1cCBDLUtlcm1pdCdzIHByb21wdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbid0IHNldCBJS1NEIHByb21wdCBoZXJlIHNpbmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgZG8gbm90IHlldCBrbm93IGlmIHdlIGFyZSBJS1NEICovCisjaWZuZGVmIE5PU1BMCisKKyAgICBpbml0bWFjKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIG1hY3JvIHRhYmxlICovCisKKy8qIFByZWRlZmluZSBidWlsdC1pbiBvbmUtbGluZSBtYWNyb3MgKi8KKworICAgIGFkZG1hYygiaWJtLWxpbmVtb2RlIixtX2libSk7ICAgICAgIC8qIElCTS1MSU5FTU9ERSAqLworICAgIGFkZG1hYygiZmF0YWwiLG1fZmF0KTsgICAgICAgICAgICAgIC8qIEZBVEFMIG1hY3JvICovCisgICAgeSA9IGFkZG1hYygiZmFzdCIsbV9mYXN0KTsgICAgICAgICAgLyogRkFTVCBtYWNybyAqLworICAgIGFkZG1hYygiY2F1dGlvdXMiLG1fY2F1dGlvdXMpOyAgICAgIC8qIENBVVRJT1VTIG1hY3JvICovCisgICAgYWRkbWFjKCJyb2J1c3QiLG1fcm9idXN0KTsgICAgICAgICAgLyogUk9CVVNUIG1hY3JvICovCisjaWZkZWYgT1MyCisgICAgYWRkbWFjKCJtYW51YWwiLG1fbWFudWFsKTsgICAgICAgICAgLyogTUFOVUFMIG1hY3JvICovCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgVk1TCisgICAgYWRkbWFjKCJwdXJnZSIsbV9wdXJnZSk7ICAgICAgICAgICAgLyogUFVSR0UgbWFjcm8gKi8KKyNlbmRpZiAvKiBWTVMgKi8KKworLyoKKyAgUHJlZGVmaW5lIGJ1aWx0LWluIG11bHRpbGluZSBtYWNyb3M7IHRoZXNlIGFyZSB0b3AtbGV2ZWwgY29tbWFuZHMKKyAgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW50ZXJuYWxseSBhcyBtYWNyb3MuICBOT1RFOiBXaGVuIGFkZGluZyBhIG5ldworICBvbmUgb2YgdGhlc2UsIHJlbWVtYmVyIHRvIHVwZGF0ZSB0aGUgRU5EIGFuZCBSRVRVUk4gY29tbWFuZHMgdG8KKyAgYWNjb3VudCBmb3IgaXQsIG9yIGVsc2UgRU5EIGFuZCBSRVRVUk4gZnJvbSB3aXRoaW4gaXQgd29uJ3Qgd29yayByaWdodC4KKyovCisgICAgeCA9IGFkZG1tYWMoIl9mb3J4Iixmb3JfZGVmKTsgICAgICAgLyogRk9SIG1hY3JvICovCisgICAgaWYgKHggPiAtMSkgbWFjdGFiW3hdLmZsZ3MgPSBDTV9JTlY7CisgICAgeCA9IGFkZG1tYWMoIl9mb3J6Iixmb3pfZGVmKTsgICAgICAgLyogT3RoZXIgRk9SIG1hY3JvICovCisgICAgaWYgKHggPiAtMSkgbWFjdGFiW3hdLmZsZ3MgPSBDTV9JTlY7CisgICAgeCA9IGFkZG1tYWMoIl94aWYiLHhpZl9kZWYpOyAgICAgICAgLyogWElGIG1hY3JvICovCisgICAgaWYgKHggPiAtMSkgbWFjdGFiW3hdLmZsZ3MgPSBDTV9JTlY7CisgICAgeCA9IGFkZG1tYWMoIl93aGlsZSIsd2hpbF9kZWYpOyAgICAgLyogV0hJTEUgbWFjcm8gKi8KKyAgICBpZiAoeCA+IC0xKSBtYWN0YWJbeF0uZmxncyA9IENNX0lOVjsKKyAgICB4ID0gYWRkbW1hYygiX3N3aXR4Iixzd19kZWYpOyAgICAgICAvKiBTV0lUQ0ggbWFjcm8gKi8KKyAgICBpZiAoeCA+IC0xKSBtYWN0YWJbeF0uZmxncyA9IENNX0lOVjsKKworLyogRmlsbCBpbiBjb21tYW5kLWxpbmUgYXJndW1lbnQgdmVjdG9yICovCisKKyAgICBzcHJpbnRmKHZuYW1idWYsIlxcJkBbJWRdIix4YXJncyk7ICAvKiBTQUZFICovCisgICAgaWYgKGluc2VydmVyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogQnV0IGhpZGRlbiBpbiBJS1NEICovCisgICAgICAgIHkgPSAtMTsKKyAgICAgICAgeGFyZ3MgPSAwOworICAgIH0gZWxzZQorICAgICAgeSA9IGFycmF5bmFtKHZuYW1idWYsJngsJnopOyAgICAgIC8qIGdvZXMgaW4gYXJyYXkgXCZAW10gKi8KKworICAgIHRtcGJ1ZlswXSA9IE5VTDsKKyAgICBpZiAoeSA+IC0xKSB7CisgICAgICAgIGludCBqID0gLTE7CisgICAgICAgIGludCB5eSA9IDA7CisgICAgICAgIGRjbGFycmF5KChjaGFyKXgseik7ICAgICAgICAgICAgLyogRGVjbGFyZSB0aGUgYXJyYXkgKi8KKyNpZm5kZWYgTk9UQUtFQVJHUworICAgICAgICAvKiBNYWNybyBhcmd1bWVudCB2ZWN0b3IgKi8KKyAgICAgICAgc3ByaW50Zih2bmFtYnVmLCJcXCZfWyVkXSIseik7ICAvKiBTQUZFICovCisgICAgICAgIHl5ID0gYXJyYXluYW0odm5hbWJ1ZiwmeCwmeik7ICAgLyogZ29lcyBpbiBhcnJheSBcJl9bXSAqLworICAgICAgICBpZiAoeXkgPiAtMSkgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgaXMgT0sgKi8KKyAgICAgICAgICBkY2xhcnJheSgoY2hhcil4LHopOyAgICAgICAgICAvKiBEZWNsYXJlIHRoZSBhcnJheSAqLworI2VuZGlmIC8qIE5PVEFLRUFSR1MgKi8KKyAgICAgICAgc2tpcCA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB4YXJnczsgaSsrKSB7ICAgLyogRmlsbCB0aGUgYXJyYXlzICovCisgICAgICAgICAgICBzcHJpbnRmKHZuYW1idWYsIlxcJkBbJWRdIixpKTsgLyogU0FGRSAqLworICAgICAgICAgICAgYWRkbWFjKHZuYW1idWYseGFyZ3ZbaV0pOworICAgICAgICAgICAgaWYgKGNmaWxlZiAmJiBpID09IDApCisgICAgICAgICAgICAgIGNvbnRpbnVlOworI2lmZGVmIEtFUkJBTkcKKyAgICAgICAgICAgIGlmIChza2lwKSB7CisgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgc2tpcCA9IDA7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogS0VSQkFORyAqLworICAgICAgICAgICAgaWYgKGogPCAwICYmICAgICAgICAgICAgICAgIC8qIEFzc2lnbiBpdGVtcyBhZnRlciAiPSIgb3IgIi0tIiovCisgICAgICAgICAgICAgICAgKCFzdHJjbXAoeGFyZ3ZbaV0sIj0iKSB8fCAhc3RyY21wKHhhcmd2W2ldLCItLSIpKQorICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGogPSAwOyAgICAgICAgICAgICAgICAgIC8qIHRvIFwlMS4uXCU5ICovCisjaWZkZWYgS0VSQkFORworICAgICAgICAgICAgfSBlbHNlIGlmIChqIDwgMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAoIXN0cmNtcCh4YXJndltpXSwiKyIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RybmNtcCh4YXJndltpXSwiKyAiLDIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RybmNtcCh4YXJndltpXSwiK1x0IiwyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIHNraXAgPSAxOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworI2VuZGlmIC8qIEtFUkJBTkcgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaiA+IC0xKSB7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIGlmIChqIDw9IDkpIHsKKyAgICAgICAgICAgICAgICAgICAgdm5hbWJ1ZlswXSA9ICdcXCc7CisgICAgICAgICAgICAgICAgICAgIHZuYW1idWZbMV0gPSAnJSc7CisgICAgICAgICAgICAgICAgICAgIHZuYW1idWZbMl0gPSAoY2hhcikoaisnMCcpOworICAgICAgICAgICAgICAgICAgICB2bmFtYnVmWzNdID0gTlVMOworICAgICAgICAgICAgICAgICAgICBhZGRtYWModm5hbWJ1Zix4YXJndltpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh5eSA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYywgKiBwOworICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIHAgPSB4YXJndltpXTsKKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmKHRvcGFyZ1tqXSkscCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYyA9ICpwKyspKSB7IGlmIChjID09IFNQKSB7IGZsYWcrKzsgYnJlYWs7IH0gfQorICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQodG1wYnVmLCJcIiIsVE1QQlVGU0laKTsKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRtcGJ1Zix4YXJndltpXSxUTVBCVUZTSVopOworICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQodG1wYnVmLCJcIiIsVE1QQlVGU0laKTsKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRtcGJ1ZiwiICIsVE1QQlVGU0laKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNmaWxlZikgeworICAgICAgICAgICAgYWRkbWFjKCJcXCUwIixjbWRmaWwpOworICAgICAgICAgICAgaWYgKHl5ID4gLTEpCisgICAgICAgICAgICAgIG1ha2VzdHIoJih0b3BhcmdbMF0pLGNtZGZpbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRtYWMoIlxcJTAiLHhhcmd2WzBdKTsKKyAgICAgICAgICAgIGlmICh5eSA+IC0xKQorICAgICAgICAgICAgICBtYWtlc3RyKCYodG9wYXJnWzBdKSx4YXJndlswXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHl5ID4gLTEpIHsKKyAgICAgICAgICAgIHRvcGFyZ2MgPSAoaiA8IDApID8gMSA6IGogKyAxOworICAgICAgICAgICAgdG9weGFyZyA9IHRvcGFyZzsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAvKiBUaGlzIG5lZWRzIHdvcmsgKi8KKyAgICAgICAgICAgIGlmICghY2ZpbGVmKQorICAgICAgICAgICAgICBtYWtlc3RyKCZ0b3BsaW5lLHRtcGJ1Zik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG9wYXJnYyA9IDA7CisgICAgICAgICAgICB0b3B4YXJnID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhX2RpbVswXSA9IHRvcGFyZ2MgLSAxOworICAgICAgICBhX3B0clswXSA9IHRvcHhhcmc7CisJZGVidWcoRjExMSwiYV9kaW1bMF0iLCJBIixhX2RpbVswXSk7CisgICAgfQorICAgICp2bmFtYnVmID0gTlVMOworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICBsdWluaXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGxvb2t1cCgpIGNhY2hlICovCisKKy8qIEdldCBvdXIgaG9tZSBkaXJlY3Rvcnkgbm93LiAgVGhpcyBuZWVkZWQgaW4gbG90cyBvZiBwbGFjZXMuICovCisKKyAgICBjbWRpbml0ZWQgPSAxOworfQorCisjaWZkZWYgTlQKK19QUk9UT1RZUChjaGFyICogR2V0QXBwRGF0YSwoaW50KSk7CisjZW5kaWYgLyogTlQgKi8KKworVk9JRAorZG9pbml0KCkgeworI2lmZGVmIENLUk9PVAorZXh0ZXJuIGludCBja3Jvb3RlcnI7CisjZW5kaWYgLyogQ0tST09UICovCisgICAgaW50IHggPSAwLCBvayA9IDA7CisjaWZkZWYgT1MyCisgICAgY2hhciAqIHB0ciA9IDA7CisjZW5kaWYgLyogT1MyICovCisKKyAgICBpZiAoIWNtZGluaXRlZCkKKyAgICAgIGNtZGluaSgpOworCisjaWZkZWYgTUFDCisgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjIEtlcm1pdCBoYXMgbm8gaW5pdCBmaWxlICovCisKKyNlbHNlIC8qICFNQUMgKi8KKworLyogSWYgc2tpcHBpbmcgaW5pdCBmaWxlICgnLVknIG9uIEtlcm1pdCBjb21tYW5kIGxpbmUpLCByZXR1cm4gbm93LiAqLworCisgICAgaWYgKG5vaW5pdCkgeworICAgICAgICBrZXJtcmNbMF0gPSAnXDAnOworICAgICAgICBpbmlkaXJbMF0gPSAnXDAnOworLyoKKyAgQnV0IHJldHVybmluZyBmcm9tIGhlcmUgcmVzdWx0cyBpbiBpbmlkaXJbXSBuZXZlciBiZWluZyBzZXQgdG8gYW55dGhpbmcuCisgIEluc3RlYWQgaXQgc2hvdWxkIGJlIHNldCB0byB3aGVyZXZlciB0aGUgaW5pdCBmaWxlICp3b3VsZCogaGF2ZSBiZWVuCisgIGV4ZWN1dGVkIGZyb20uICBTbyB0aGlzIGJpdCBvZiBjb2RlIHNob3VsZCBiZSByZW1vdmVkLCBhbmQgdGhlbiB3ZSBzaG91bGQKKyAgc3ByaW5rbGUgImlmIChub2luaXQpIiB0ZXN0cyB0aHJvdWdob3V0IHRoZSBmb2xsb3dpbmcgY29kZSB1bnRpbCB3ZSBoYXZlCisgIHNldCBpbmlkaXJbXSwgYW5kIHRoZW4gcmV0dXJuIHdpdGhvdXQgYWN0dWFsbHkgdGFraW5nIHRoZSBpbml0IGZpbGUuCisqLworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgT1MyCisvKgorICBUaGUgLXkgaW5pdCBmaWxlIG11c3QgYmUgZnVsbHkgc3BlY2lmaWVkIG9yIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAgS0VSTVJDIGlzIGxvb2tlZCBmb3IgdmlhIElOSVQsIERQQVRIIGFuZCBQQVRIIGluIHRoYXQgb3JkZXIuICBGaW5hbGx5LCBvdXIKKyAgb3duIGV4ZWN1dGFibGUgZmlsZSBwYXRoIGlzIHRha2VuIGFuZCB0aGUgLkVYRSBzdWZmaXggaXMgcmVwbGFjZWQgYnkgLklOSQorICBhbmQgdGhpcyBpcyB0cmllZCBhcyB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZS4KKyovCisjaWZkZWYgQ0tfTE9HSU4KKyAgICBkZWJ1ZyhGMTAxLCJkb2luaXQgaW5zZXJ2ZXIiLCIiLGluc2VydmVyKTsKKyAgICBkZWJ1ZyhGMTAxLCJkb2luaXQgaXNndWVzdCIsIiIsaXNndWVzdCk7CisgICAgZGVidWcoRjExMCwiZG9pbml0IGFub25maWxlIixhbm9uZmlsZSwwKTsKKworICAgIGlmIChpc2d1ZXN0ICYmIGFub25maWxlKSB7CisgICAgICBja3N0cm5jcHkobGluZSwgYW5vbmZpbGUsIExJTkJVRlNJWisxKTsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgICAgaWYgKHJjZmxhZykgeworICAgICAgICAgIGNrc3RybmNweShsaW5lLGtlcm1yYyxMSU5CVUZTSVorMSk7CisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgIH0gZWxzZSBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICBjaGFyICogYXBwZGF0YSA9IE5VTEw7CisjaWZkZWYgTlQKKyAgICAgICAgICBhcHBkYXRhID0gR2V0QXBwRGF0YSgxKTsKKyAgICAgICAgICBpZiAoIGFwcGRhdGEgKSB7CisgICAgICAgICAgICAgIGNrbWFrbXNnKGxpbmUsTElOQlVGU0laKzEsYXBwZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJLZXJtaXQgOTUvazk1LmluaSIsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgICAgaWYgKCB6Y2hraShsaW5lKSA8IDAgKQorICAgICAgICAgICAgICAgICAgbGluZVswXSA9ICdcMCc7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChsaW5lWzBdID09IDApIHsKKyAgICAgICAgICAgICAgYXBwZGF0YSA9IEdldEFwcERhdGEoMCk7CisgICAgICAgICAgICAgIGlmICggYXBwZGF0YSApIHsKKyAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGxpbmUsTElOQlVGU0laKzEsYXBwZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2VybWl0IDk1L2s5NS5pbmkiLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgICBpZiAoIHpjaGtpKGxpbmUpIDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgbGluZVswXSA9ICdcMCc7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICBpZiAobGluZVswXSA9PSAwKSB7CisgICAgICAgICAgICAgIGFwcGRhdGEgPSB6aG9tZSgpOworICAgICAgICAgICAgICBpZiAoIGFwcGRhdGEgKSB7CisgICAgICAgICAgICAgICAgICBja21ha21zZyhsaW5lLExJTkJVRlNJWisxLGFwcGRhdGEsCisjaWZkZWYgTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIms5NS5pbmkiLAorI2Vsc2UgLyogTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgImsyLmluaSIsCisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgICBpZiAoIHpjaGtpKGxpbmUpIDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgbGluZVswXSA9ICdcMCc7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZGVidWcoRjExMCwiZG9pbml0IGluc2VydmVyIGluaWZpbGUiLGxpbmUsMCk7CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyICogZW52ID0gMDsKKyNpZmRlZiBOVAorICAgICAgICBlbnYgPSBnZXRlbnYoIks5NS5LU0MiKTsKKyNlbHNlCisgICAgICAgIGVudiA9IGdldGVudigiSzIuS1NDIik7CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgaWYgKCFlbnYpIHsKKyNpZmRlZiBOVAorICAgICAgICAgICAgZW52ID0gZ2V0ZW52KCJLOTUuSU5JIik7CisjZWxzZQorICAgICAgICAgICAgZW52ID0gZ2V0ZW52KCJLMi5JTkkiKTsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICB9CisgICAgICAgIGlmICghZW52KQorICAgICAgICAgIGVudiA9IGdldGVudigiQ0tFUk1JVC5JTkkiKTsKKyAgICAgICAgaWYgKCFlbnYpCisgICAgICAgICAgZW52ID0gZ2V0ZW52KCJDS0VSTUlUX0lOSSIpOworICAgICAgICBsaW5lWzBdID0gJ1wwJzsKKworICAgICAgICBkZWJ1ZyhGMTEwLCJkb2luaXQgZW52IixlbnYsMCk7CisgICAgICAgIGlmIChlbnYpCisgICAgICAgICAgY2tzdHJuY3B5KGxpbmUsZW52LExJTkJVRlNJWisxKTsKKworI2lmZGVmIE5UCisgICAgICAgIGlmIChsaW5lWzBdID09IDApIHsKKyAgICAgICAgICAgIGVudiA9IEdldEFwcERhdGEoMSk7CisgICAgICAgICAgICBpZiAoIGVudiApIHsKKyAgICAgICAgICAgICAgICBja21ha21zZyhsaW5lLExJTkJVRlNJWisxLGVudiwiS2VybWl0IDk1L2s5NS5pbmkiLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKCB6Y2hraShsaW5lKSA8IDAgKQorICAgICAgICAgICAgICAgICAgICBsaW5lWzBdID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGluZVswXSA9PSAwKSB7CisgICAgICAgICAgICBlbnYgPSBHZXRBcHBEYXRhKDApOworICAgICAgICAgICAgaWYgKCBlbnYgKSB7CisgICAgICAgICAgICAgICAgY2ttYWttc2cobGluZSxMSU5CVUZTSVorMSxlbnYsIktlcm1pdCA5NS9rOTUuaW5pIixOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgIGlmICggemNoa2kobGluZSkgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgbGluZVswXSA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBOVCAqLworCisgICAgICAgIGlmIChsaW5lWzBdID09IDApIHsKKyAgICAgICAgICAgIGVudiA9IHpob21lKCk7CisgICAgICAgICAgICBpZiAoIGVudiApIHsKKyAgICAgICAgICAgICAgICBja21ha21zZyhsaW5lLExJTkJVRlNJWisxLGVudiwKKyNpZmRlZiBOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAiazk1LmluaSIsCisjZWxzZSAvKiBOVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAiazIuaW5pIiwKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgIGlmICggemNoa2kobGluZSkgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgbGluZVswXSA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobGluZVswXSA9PSAwKQorICAgICAgICAgIF9zZWFyY2hlbnYoa2VybXJjLCJJTklUIixsaW5lKTsKKyAgICAgICAgaWYgKGxpbmVbMF0gPT0gMCkKKyAgICAgICAgICBfc2VhcmNoZW52KGtlcm1yYywiRFBBVEgiLGxpbmUpOworICAgICAgICBpZiAobGluZVswXSA9PSAwKQorICAgICAgICAgIF9zZWFyY2hlbnYoa2VybXJjLCJQQVRIIixsaW5lKTsKKyAgICAgICAgaWYgKGxpbmVbMF0gPT0gMCkgeworICAgICAgICAgICAgY2hhciAqcGdtcHRyID0gR2V0TG9hZFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChwZ21wdHIgJiYgc3RybGVuKHBnbXB0cikgPCBMSU5CVUZTSVotOCkgeworICAgICAgICAgICAgICAgIGxwID0gc3RycmNocihwZ21wdHIsICdcXCcpOworICAgICAgICAgICAgICAgIGlmIChscCkgeworICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KGxpbmUsIHBnbXB0ciwgbHAgLSBwZ21wdHIpOworI2lmZGVmIE5UCisgICAgICAgICAgICAgICAgICAgIHN0cmNweShsaW5lICsgKGxwIC0gcGdtcHRyKSwgIi9rOTUuaW5pIik7CisjZWxzZSAvKiBOVCAqLworICAgICAgICAgICAgICAgICAgICBzdHJjcHkobGluZSArIChscCAtIHBnbXB0ciksICIvazIuaW5pIik7CisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBscCA9IHN0cnJjaHIocGdtcHRyLCAnLicpOworICAgICAgICAgICAgICAgICAgICBpZiAobHApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkobGluZSwgcGdtcHRyLCBscCAtIHBnbXB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkobGluZSArIChscCAtIHBnbXB0ciksICIuaW5pIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBDS1JPT1QKKyAgICBpZiAoIXppbnJvb3QobGluZSkpIHsKKyAgICAgICAgZGVidWcoRjExMCwiZG9pbml0IHNldHJvb3QgdmlvbGF0aW9uIixsaW5lLDApOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIENLUk9PVCAqLworCisgICAgZGVidWcoRjExMCwiZG9pbml0IGZvcGVuKCkiLGxpbmUsMCk7CisgICAgaWYgKCh0ZmlsZVswXSA9IGZvcGVuKGxpbmUsInIiKSkgIT0gTlVMTCkgeworICAgICAgICBvayA9IDE7CisgICAgICAgIHRsZXZlbCA9IDA7CisgICAgICAgIHRmbGluZVt0bGV2ZWxdID0gMDsKKyAgICAgICAgaWYgKHRmbmFtW3RsZXZlbF0gPSBtYWxsb2Moc3RybGVuKGxpbmUpKzEpKQorICAgICAgICAgIHN0cmNweSh0Zm5hbVt0bGV2ZWxdLGxpbmUpOyAgIC8qIHNhZmUgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgY21kbHZsKys7CisgICAgICAgIHhjbWRzcmMgPSBDTURfVEY7CisgICAgICAgIGNtZHN0a1tjbWRsdmxdLnNyYyA9IENNRF9URjsKKyAgICAgICAgY21kc3RrW2NtZGx2bF0ubHZsID0gdGxldmVsOworICAgICAgICBjbWRzdGtbY21kbHZsXS5jY2ZsZ3MgPSAwOworICAgICAgICBpZmNtZFtjbWRsdmxdID0gMDsKKyAgICAgICAgaWZ0ZXN0W2NtZGx2bF0gPSAwOworICAgICAgICBjb3VudFtjbWRsdmxdID0gIGNvdW50W2NtZGx2bC0xXTsgLyogSW5oZXJpdCBmcm9tIHByZXZpb3VzIGxldmVsICovCisgICAgICAgIGludGltZVtjbWRsdmxdID0gaW50aW1lW2NtZGx2bC0xXTsKKyAgICAgICAgaW5wY2FzW2NtZGx2bF0gPSBpbnBjYXNbY21kbHZsLTFdOworICAgICAgICB0YWtlcnJbY21kbHZsXSA9IHRha2VycltjbWRsdmwtMV07CisgICAgICAgIG1lcnJvcltjbWRsdmxdID0gbWVycm9yW2NtZGx2bC0xXTsKKyAgICAgICAgeHF1aWV0W2NtZGx2bF0gPSBxdWlldDsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJkb2luaXQgaW5pdCBmaWxlIixsaW5lLDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlYnVnKEYxMDAsImRvaW5pdCBubyBpbml0IGZpbGUiLCIiLDApOworICAgIH0KKyAgICBja3N0cm5jcHkoa2VybXJjLGxpbmUsS0VSTVJDTCk7CisgICAgZm9yIChwdHIgPSBrZXJtcmM7ICpwdHI7IHB0cisrKSAgICAgLyogQ29udmVydCBiYWNrc2xhc2hlcyB0byBzbGFzaGVzICovCisgICAgICAgaWYgKCpwdHIgPT0gJ1xcJykKKyAgICAgICAgICpwdHIgPSAnLyc7CisjZWxzZSAvKiBub3QgT1MyICovCisgICAgbHAgPSBsaW5lOworICAgIGxwWzBdID0gJ1wwJzsKKyAgICBkZWJ1ZyhGMTAxLCJkb2luaXQgcmNmbGFnIiwiIixyY2ZsYWcpOworI2lmZGVmIEdFTURPUworICAgIHprZXJtaW5pKGxpbmUsIHJjZmxhZywga2VybXJjKTsKKyNlbHNlCisjaWZkZWYgVk1TCisgICAgeworCWludCB4OworCXggPSB6a2VybWluaShsaW5lLExJTkJVRlNJWixrZXJtcmMpOworCWRlYnVnKEYxMTEsIkNVU1RPTSB6a2VybWluaSIsbGluZSx4KTsKKwlpZiAoeCA9PSAwKQorCSAgbGluZVswXSA9IE5VTDsKKyAgICB9CisjZWxzZSAvKiBub3QgVk1TICovCisjaWZkZWYgQ0tfTE9HSU4KKyAgICBkZWJ1ZyhGMTAxLCJkb2luaXQgaXNndWVzdCIsIiIsaXNndWVzdCk7CisgICAgaWYgKGlzZ3Vlc3QpCisgICAgICBja3N0cm5jcHkobHAsIGFub25maWxlID8gYW5vbmZpbGUgOiBrZXJtcmMsIExJTkJVRlNJWik7CisgICAgZWxzZQorI2VuZGlmIC8qIENLX0xPR0lOICovCisgICAgICBpZiAocmNmbGFnKSB7ICAgICAgICAgICAgICAgICAgICAgLyogSWYgaW5pdCBmaWxlIG5hbWUgZnJvbSBjbWQgbGluZSAqLworICAgICAgICAgIGNrc3RybmNweShscCxrZXJtcmMsTElOQlVGU0laKTsgLyogdXNlIGl0LCAqLworICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZS4uLiAqLworI2lmZGVmIENLX0lOSV9BICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlJ3ZlIGEgc3lzdGVtLXdpZGUgaW5pdCBmaWxlICovCisgICAgICAgICAgLyogQW5kIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgdXNlcidzLi4uICovCisgICAgICAgICAgY2tzdHJuY3B5KGxwLENLX1NZU0lOSSxLRVJNUkNMKTsgLyogVXNlIGl0ICovCisgICAgICAgICAgaWYgKHpjaGtpKGxwKSA8IDApIHsgICAgICAgICAgLyogKGlmIGl0IGV4aXN0cy4uLikgKi8KKyNlbmRpZiAvKiBDS19JTklfQSAqLworICAgICAgICAgICAgICBjaGFyICogaG9tZGlyOworICAgICAgICAgICAgICBjaGFyICogZW52ID0gMDsKKyAgICAgICAgICAgICAgbGluZVswXSA9IE5VTDsKKworICAgICAgICAgICAgICAvKiBBZGQgc3VwcG9ydCBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICAgICAgICAgICAgZW52ID0gZ2V0ZW52KCJDS0VSTUlULklOSSIpOworICAgICAgICAgICAgICBpZiAoIWVudikKKyAgICAgICAgICAgICAgICBlbnYgPSBnZXRlbnYoIkNLRVJNSVRfSU5JIik7CisgICAgICAgICAgICAgIGlmIChlbnYpCisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGxwLGVudixLRVJNUkNMKTsKKworICAgICAgICAgICAgICBpZiAobHBbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgaG9tZGlyID0gemhvbWUoKTsKKyAgICAgICAgICAgICAgICAgIGlmIChob21kaXIpIHsgICAgICAgICAvKiBIb21lIGRpcmVjdG9yeSBmb3IgaW5pdCBmaWxlLiAqLworICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShscCxob21kaXIsS0VSTVJDTCk7CisjaWZkZWYgU1RSQVRVUworICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdChscCwiPiIsS0VSTVJDTCk7LyogVk9TIGRpcnNlcCAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICBpZiAobHBbMF0gPT0gJy8nKSBja3N0cm5jYXQobHAsIi8iLEtFUk1SQ0wpOworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGNrc3RybmNhdChscCxrZXJtcmMsS0VSTVJDTCk7LyogQXBwZW5kIGRlZmF1bHQgZmlsZSBuYW1lICovCisgICAgICAgICAgICAgIH0KKyNpZmRlZiBDS19JTklfQQorICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19JTklfQSAqLworI2lmZGVmIENLX0lOSV9CICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN5c3RlbS13aWRlIGluaXQgZGVmaW5lZD8gKi8KKyAgICAgICAgICAvKiBCdXQgdXNlcidzIGluaSBmaWxlIHRha2VzIHByZWNlZGVuY2UgKi8KKyAgICAgICAgICBpZiAoemNoa2kobHApIDwgMCkgICAgICAgICAgICAvKiBJZiB1c2VyIGRvZXNuJ3QgaGF2ZSBoZXIgb3duLCAqLworICAgICAgICAgICAgY2tzdHJuY3B5KGxwLENLX1NZU0lOSSxLRVJNUkNMKTsgLyogdXNlIHN5c3RlbS13aWRlIG9uZS4gKi8KKyNlbmRpZiAvKiBDS19JTklfQiAqLworICAgICAgfQorI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIEdFTURPUyAqLworCisjaWZkZWYgQU1JR0EKKyAgICByZXFvZmYoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHJlcXVlc3RvcnMgKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworCisjaWZkZWYgVVNFX0NVU1RPTQorICAgIC8qIElmIG5vIGluaXQgZmlsZSB3YXMgZm91bmQsIGV4ZWN1dGUgdGhlIGN1c3RvbWl6YXRpb24gZmlsZSAqLworICAgIGRlYnVnKEYxMTAsIkNVU1RPTSAxIixsaW5lLDApOworICAgIGlmICghbGluZVswXSB8fCB6Y2hraShsaW5lKSA8IDApIHsKKwlpbnQgeDsKKyNpZmRlZiBPUzIKKwl4ID0gY2ttYWtlc3RyKGxpbmUsTElOQlVGU0laLEdldEFwcERhdGEoMSksIi8iLCJLOTVDVVNUT00uSU5JIixOVUxMKTsKKwlkZWJ1ZyhGMTExLCJDVVNUT00gMiIsbGluZSx4KTsKKwlpZiAoemNoa2kobGluZSkgPCAwKSB7CisJICAgIHggPSBja21ha2VzdHIobGluZSxMSU5CVUZTSVosR2V0QXBwRGF0YSgwKSwiLyIsIks5NVVTRVIuSU5JIixOVUxMKTsKKwkgICAgZGVidWcoRjExMSwiQ1VTVE9NIDMiLGxpbmUseCk7CisJfQorI2Vsc2UgIC8qIE9TMiAqLworCXggPSBja3N0cm5jcHkobGluZSx6aG9tZSgpLExJTkJVRlNJWik7CisjaWZuZGVmIFZNUworCS8qIFZNUyB6aG9tZSgpIHJldHVybnMgIlNZUyRMT0dJTjoiICovCisJaWYgKGxpbmVbeC0xXSAhPSBESVJTRVApIHsKKwkgICAgbGluZVt4KytdID0gRElSU0VQOworCSAgICBsaW5lW3hdID0gTlVMOworCX0KKyNlbmRpZiAvKiBWTVMgKi8KKwl4ID0gY2tzdHJuY2F0KGxpbmUsTVlDVVNUT00sTElOQlVGU0laKTsKKwlkZWJ1ZyhGMTExLCJDVVNUT00gNCIsbGluZSx4KTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB9CisgICAgZGVidWcoRjExMCwiQ1VTVE9NIDUiLGxpbmUsMCk7CisjZW5kaWYgLyogVVNFX0NVU1RPTSAqLworCisjaWZkZWYgQ0tST09UCisgICAgaWYgKCF6aW5yb290KGxpbmUpKSB7CisgICAgICAgIGRlYnVnKEYxMTAsImRvaW5pdCBzZXRyb290IHZpb2xhdGlvbiIsbGluZSwwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworICAgIGRlYnVnKEYxMTAsImRvaW5pdCBpbmkgZmlsZSBpcyIsbGluZSwwKTsKKyAgICBpZiAoKHRmaWxlWzBdID0gZm9wZW4obGluZSwiciIpKSAhPSBOVUxMKSB7IC8qIFRyeSB0byBvcGVuIGluaXQgZmlsZS4gKi8KKyAgICAgICAgb2sgPSAxOworICAgICAgICB0bGV2ZWwgPSAwOworICAgICAgICB0ZmxpbmVbdGxldmVsXSA9IDA7CisgICAgICAgIGlmICgodGZuYW1bdGxldmVsXSA9IG1hbGxvYyhzdHJsZW4obGluZSkrMSkpKQorICAgICAgICAgIHN0cmNweSh0Zm5hbVt0bGV2ZWxdLGxpbmUpOyAgIC8qIHNhZmUgKi8KKworICAgICAgICBja3N0cm5jcHkoa2VybXJjLGxpbmUsS0VSTVJDTCk7CisKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgY21kbHZsKys7CisgICAgICAgIGlmY21kW2NtZGx2bF0gPSAwOworICAgICAgICBpZnRlc3RbY21kbHZsXSA9IDA7CisgICAgICAgIGNvdW50W2NtZGx2bF0gPSAgY291bnRbY21kbHZsLTFdOyAvKiBJbmhlcml0IGZyb20gcHJldmlvdXMgbGV2ZWwgKi8KKyAgICAgICAgaW50aW1lW2NtZGx2bF0gPSBpbnRpbWVbY21kbHZsLTFdOworICAgICAgICBpbnBjYXNbY21kbHZsXSA9IGlucGNhc1tjbWRsdmwtMV07CisgICAgICAgIHRha2VycltjbWRsdmxdID0gdGFrZXJyW2NtZGx2bC0xXTsKKyAgICAgICAgbWVycm9yW2NtZGx2bF0gPSBtZXJyb3JbY21kbHZsLTFdOworICAgICAgICB4cXVpZXRbY21kbHZsXSA9IHF1aWV0OworICAgICAgICBkZWJ1ZyhGMTAxLCJkb2luaXQgb3BlbiBvayIsIiIsY21kbHZsKTsKKyAgICAgICAgeGNtZHNyYyA9IENNRF9URjsKKyAgICAgICAgY21kc3RrW2NtZGx2bF0uc3JjID0gQ01EX1RGOworICAgICAgICBjbWRzdGtbY21kbHZsXS5sdmwgPSB0bGV2ZWw7CisgICAgICAgIGNtZHN0a1tjbWRsdmxdLmNjZmxncyA9IDA7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICB9IGVsc2UgaWYgKHJjZmxhZykgeworICAgICAgICAvKiBQcmludCBhbiBlcnJvciBtZXNzYWdlIG9ubHkgaWYgYSBzcGVjaWZpYyBmaWxlIHdhcyBhc2tlZCBmb3IuICovCisgICAgICAgIHByaW50ZigiPyVzIC0gJXNcbiIsIGNrX2VycnN0cigpLCBsaW5lKTsKKyAgICB9CisKKyNpZmRlZiBkYXRhZ2VuZXJhbAorLyogSWYgQ0tFUk1JVC5JTkkgbm90IGZvdW5kIGluIGhvbWUgZGlyZWN0b3J5LCBsb29rIGluIHNlYXJjaGxpc3QgKi8KKyAgICBpZiAoLyogaG9tZGlyICYmICovICh0bGV2ZWwgPCAwKSkgeworICAgICAgICBja3N0cm5jcHkobHAsa2VybXJjLExJTkJVRlNJWik7CisgICAgICAgIGlmICgodGZpbGVbMF0gPSBmb3BlbihsaW5lLCJyIikpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG9rID0gMTsKKyAgICAgICAgICAgIHRsZXZlbCA9IDA7CisgICAgICAgICAgICB0ZmxpbmVbdGxldmVsXSA9IDA7CisgICAgICAgICAgICBpZiAodGZuYW1bdGxldmVsXSA9IG1hbGxvYyhzdHJsZW4obGluZSkrMSkpCisgICAgICAgICAgICAgIHN0cmNweSh0Zm5hbVt0bGV2ZWxdLGxpbmUpOyAvKiBzYWZlICovCisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgICBjbWRsdmwrKzsKKyAgICAgICAgICAgIHhjbWRzcmMgPSBDTURfVEY7CisgICAgICAgICAgICBjbWRzdGtbY21kbHZsXS5zcmMgPSBDTURfVEY7CisgICAgICAgICAgICBjbWRzdGtbY21kbHZsXS5sdmwgPSB0bGV2ZWw7CisgICAgICAgICAgICBjbWRzdGtbY21kbHZsXS5jY2ZsZ3MgPSAwOworICAgICAgICAgICAgaWZjbWRbY21kbHZsXSA9IDA7CisgICAgICAgICAgICBpZnRlc3RbY21kbHZsXSA9IDA7CisgICAgICAgICAgICBjb3VudFtjbWRsdmxdID0gIGNvdW50W2NtZGx2bC0xXTsgLyogSW5oZXJpdCBmcm9tIHByZXZpb3VzIGxldmVsICovCisgICAgICAgICAgICBpbnRpbWVbY21kbHZsXSA9IGludGltZVtjbWRsdmwtMV07CisgICAgICAgICAgICBpbnBjYXNbY21kbHZsXSA9IGlucGNhc1tjbWRsdmwtMV07CisgICAgICAgICAgICB0YWtlcnJbY21kbHZsXSA9IHRha2VycltjbWRsdmwtMV07CisgICAgICAgICAgICBtZXJyb3JbY21kbHZsXSA9IG1lcnJvcltjbWRsdmwtMV07CisgICAgICAgICAgICB4cXVpZXRbY21kbHZsXSA9IHF1aWV0OworI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKworI2lmZGVmIEFNSUdBICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFtaWdhLi4uICovCisgICAgcmVxcG9wKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSByZXF1ZXN0b3JzICovCisjZW5kaWYgLyogQU1JR0EgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKworICAgIC8qIEFzc2lnbiB2YWx1ZSB0byBpbmlkaXIgKi8KKworICAgIGlmICghb2spIHsKKyAgICAgICAgaW5pZGlyWzBdID0gTlVMOworICAgIH0gZWxzZSB7CisgICAgICAgIGNrc3RybmNweShpbmlkaXIsIGtlcm1yYywgQ0NITUFYUEFUSCk7CisgICAgICAgIHggPSBzdHJsZW4oaW5pZGlyKTsKKyAgICAgICAgaWYgKHggPiAwKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IHggLSAxOyBpID4gMDsgaS0tICkgeworICAgICAgICAgICAgICAgIGlmIChJU0RJUlNFUChpbmlkaXJbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGluaWRpcltpKzFdID0gTlVMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZmRlZiBOVAorICAgICAgICBHZXRTaG9ydFBhdGhOYW1lKGluaWRpcixpbmlkaXIsQ0NITUFYUEFUSCk7CisjZW5kaWYgLyogTlQgKi8KKyAgICB9Cit9CisKK1ZPSUQKK2RvaWtzZGluaXQoKSB7CisjaWZkZWYgQ0tfU1NMCisgICAgLyogSUtTRCBkb2Vzbid0IHJlcXVlc3QgY2xpZW50IGNlcnRzICovCisgICAgc3NsX3ZlcmlmeV9mbGFnID0gU1NMX1ZFUklGWV9OT05FOworI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgaWYgKCFjbWRpbml0ZWQpCisgICAgICBjbWRpbmkoKTsKKworI2lmZGVmIElLU0RDT05GCisjaWZkZWYgT1MyCisgICAgbGluZVswXSA9ICdcMCc7CisgICAgX3NlYXJjaGVudihpa3NkY29uZiwiSU5JVCIsbGluZSk7CisgICAgaWYgKGxpbmVbMF0gPT0gMCkKKyAgICAgIF9zZWFyY2hlbnYoaWtzZGNvbmYsIkRQQVRIIixsaW5lKTsKKyAgICBpZiAobGluZVswXSA9PSAwKQorICAgICAgX3NlYXJjaGVudihpa3NkY29uZiwiUEFUSCIsbGluZSk7CisgICAgaWYgKGxpbmVbMF0gPT0gMCkgeworICAgICAgICBjaGFyICpwZ21wdHIgPSBHZXRMb2FkUGF0aCgpOworICAgICAgICBpZiAocGdtcHRyICYmIHN0cmxlbihwZ21wdHIpIDwgTElOQlVGU0laLTgpIHsKKyAgICAgICAgICAgIGxwID0gc3RycmNocihwZ21wdHIsICdcXCcpOworICAgICAgICAgICAgaWYgKGxwKSB7CisgICAgICAgICAgICAgICAgc3RybmNweShsaW5lLCBwZ21wdHIsIGxwIC0gcGdtcHRyKTsKKyAgICAgICAgICAgICAgICBzdHJjcHkobGluZSArIChscCAtIHBnbXB0ciksICJcXCIpOworICAgICAgICAgICAgICAgIHN0cmNweShsaW5lICsgKGxwIC0gcGdtcHRyICsgMSksIGlrc2Rjb25mKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbHAgPSBzdHJyY2hyKHBnbXB0ciwgJy4nKTsKKyAgICAgICAgICAgICAgICBpZiAobHApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybmNweShsaW5lLCBwZ21wdHIsIGxwIC0gcGdtcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGxpbmUgKyAobHAgLSBwZ21wdHIpLCAiLmtzYyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJkb2lrc2Rpbml0KCkgbGluZSIsbGluZSwwKTsKKyAgICB0ZmlsZVswXSA9IGZvcGVuKGxpbmUsInIiKTsKKyNlbHNlIC8qIE9TMiAqLworICAgIHRmaWxlWzBdID0gZm9wZW4oaWtzZGNvbmYsInIiKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpZiAodGZpbGVbMF0gIT0gTlVMTCkgeworICAgICAgICB0bGV2ZWwgPSAwOworICAgICAgICB0ZmxpbmVbdGxldmVsXSA9IDA7CisjaWZkZWYgT1MyCisgICAgICAgIGlmICh0Zm5hbVt0bGV2ZWxdID0gbWFsbG9jKHN0cmxlbihsaW5lKSsxKSkKKyAgICAgICAgICBzdHJjcHkodGZuYW1bdGxldmVsXSxsaW5lKTsKKyNlbHNlIC8qIE9TMiAqLworICAgICAgICBpZiAoKHRmbmFtW3RsZXZlbF0gPSBtYWxsb2Moc3RybGVuKGlrc2Rjb25mKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHRmbmFtW3RsZXZlbF0saWtzZGNvbmYpOworI2VuZGlmIC8qIE9TMiAqLworI2lmbmRlZiBOT1NQTAorICAgICAgICBjbWRsdmwrKzsKKyAgICAgICAgeGNtZHNyYyA9IENNRF9URjsKKyAgICAgICAgY21kc3RrW2NtZGx2bF0uc3JjID0gQ01EX1RGOworICAgICAgICBjbWRzdGtbY21kbHZsXS5sdmwgPSB0bGV2ZWw7CisgICAgICAgIGNtZHN0a1tjbWRsdmxdLmNjZmxncyA9IDA7CisgICAgICAgIGlmY21kW2NtZGx2bF0gID0gMDsKKyAgICAgICAgaWZ0ZXN0W2NtZGx2bF0gPSAwOworICAgICAgICBjb3VudFtjbWRsdmxdICA9IGNvdW50W2NtZGx2bC0xXTsgLyogSW5oZXJpdCBmcm9tIHByZXZpb3VzIGxldmVsICovCisgICAgICAgIGludGltZVtjbWRsdmxdID0gaW50aW1lW2NtZGx2bC0xXTsKKyAgICAgICAgaW5wY2FzW2NtZGx2bF0gPSBpbnBjYXNbY21kbHZsLTFdOworICAgICAgICB0YWtlcnJbY21kbHZsXSA9IHRha2VycltjbWRsdmwtMV07CisgICAgICAgIG1lcnJvcltjbWRsdmxdID0gbWVycm9yW2NtZGx2bC0xXTsKKyAgICAgICAgeHF1aWV0W2NtZGx2bF0gPSBxdWlldDsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJkb2lrc2Rpbml0IGZpbGUgb2siLHRmbmFtW3RsZXZlbF0sMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVidWcoRjExMCwiZG9pa3NkaW5pdCBvcGVuIGZhaWxlZCIsdGZuYW1bdGxldmVsXSwwKTsKKyAgICB9CisjZW5kaWYgLyogSUtTRENPTkYgKi8KK30KKworI2lmbmRlZiBOT1NQTAorLyoKKyAgRyBFIFQgTiBDIE0KKworICBHZXQgbmV4dCBjb21tYW5kIGZyb20gY3VycmVudCBtYWNybyBkZWZpbml0aW9uLiAgQ29tbWFuZCBpcyBjb3BpZWQKKyAgaW50byBzdHJpbmcgcG9pbnRlZCB0byBieSBhcmd1bWVudCBzLCBtYXggbGVuZ3RoIG4uICAgUmV0dXJuczoKKyAgIDAgaWYgYSBzdHJpbmcgd2FzIGNvcGllZDsKKyAgLTEgaWYgdGhlcmUgd2FzIG5vIHN0cmluZyB0byBjb3B5LgorKi8KK2ludAorZ2V0bmNtKHMsbikgY2hhciAqczsgaW50IG47IHsKKyAgICBpbnQgeSA9IDA7CQkJCS8qIENoYXJhY3RlciBjb3VudGVyICovCisgICAgaW50IHF1b3RlID0gMDsKKyAgICBpbnQga3AgPSAwOwkJCQkvKiBCcmFjZSB1cC1kb3duIGNvdW50ZXIgKi8KKyAgICBpbnQgcHAgPSAwOwkJCQkvKiBQYXJlbnRoZXNpcyB1cC1kb3duIGNvdW50ZXIgKi8KKyNpZm5kZWYgTk9EUU1BQ1JPCisgICAgaW50IGRxID0gMDsJCQkJLyogRG91YmxlcXVvdGUgY291bnRlciAqLworI2VuZGlmIC8qIE5PRFFNQUNSTyAqLworICAgIGNoYXIgKnMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgb2YgZGVzdGluYXRpb24gcG9pbnRlciAqLworCisgICAgczIgPSBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBzdHJpbmcgcG9pbnRlcnMgKi8KKyAgICAqcyA9IE5VTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgZGVzdGluYXRpb24gYnVmZmVyICovCisKKyAgICAvKiBkZWJ1ZyhGMDEwLCJnZXRuY20gZW50cnkiLG1hY3BbbWFjbHZsXSwwKTsgKi8KKworICAgIGZvciAoeSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvb3AgZm9yIG4gYnl0ZXMgbWF4ICovCisgICAgICAgICBtYWNwW21hY2x2bF0gJiYgKm1hY3BbbWFjbHZsXSAmJiB5IDwgbjsKKyAgICAgICAgIHkrKywgcysrLCBtYWNwW21hY2x2bF0rKykgeworCisgICAgICAgICpzID0gKm1hY3BbbWFjbHZsXTsgICAgICAgICAgICAgLyogR2V0IG5leHQgY2hhciBmcm9tIG1hY3JvIGRlZiAqLworCisjaWZuZGVmIENPTU1FTlQKKy8qCisgIFRoaXMgaXMgdG8gYWxsb3cgcXVvdGluZyBvZiBwYXJlbnRoZXNlcywgY29tbWFzLCBldGMsIGluIGZ1bmN0aW9uCisgIGFyZ3VtZW50cywgYnV0IGl0IGJyZWFrcyBqdXN0IGFib3V0IGV2ZXJ5dGhpbmcgZWxzZS4gIERPTidUIFJFTU9WRSBUSElTCisgIENPTU1FTlQhICAoT3RoZXJ3aXNlIHlvdSdsbCB3aW5kIHVwIGFkZGluZyB0aGUgc2FtZSBjb2RlIGFnYWluIGFuZCBicmVha2luZworICBldmVyeXRoaW5nIGFnYWluLikgIDwtLSBUaGUgcHJlY2VkaW5nIHdhcm5pbmcgc2hvdWxkIGJlIG9ic29sZXRlIHNpbmNlIHRoZQorICBzdGF0ZW1lbnRzIGJlbG93IGhhdmUgYmVlbiBmaXhlZCwgYnV0IGluIGNhc2Ugb2YgZmlyZSwgcmVtb3ZlIHRoZSAibiIgZnJvbQorICB0aGUgPCM+aWZuZGVmIGFib3ZlLiAgTkVXIFdBUk5JTkc6IGNvZGUgYWRkZWQgMTIgQXByIDIwMDIgdG8gZXhlbXB0IHRoZQorICBvcGVuaW5nIGJyYWNlIGluIFx7bm5ufSBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgYSBxdW90ZWQgYnJhY2UuCisqLworICAgICAgICBpZiAoIXF1b3RlICYmICpzID09IENNRFEpIHsKKyAgICAgICAgICAgIHF1b3RlID0gMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChxdW90ZSkgeworCSAgICBpbnQgbm90cXVvdGUgPSAwOworICAgICAgICAgICAgcXVvdGUgPSAwOworCSAgICBpZiAoKnMgPT0gJ3snKSB7CQkvKiBDaGVjayBmb3IgXHtubm59ICg4LjAuMjAzKSAqLworCQljaGFyIGMsICogcDsKKwkJcCA9IG1hY3BbbWFjbHZsXSArIDE7CisJCXdoaWxlICgoYyA9ICpwKyspKSB7CisJCSAgICBpZiAoaXNkaWdpdChjKSkKKwkJICAgICAgY29udGludWU7CisJCSAgICBlbHNlIGlmIChjID09ICd9JykgeworCQkJbm90cXVvdGUrKzsKKwkJCWJyZWFrOworCQkgICAgfSBlbHNlIHsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgaWYgKG5vdHF1b3RlID09IDApCisJICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qCisgIEFsbG93IGJyYWNlcyBhcm91bmQgbWFjcm8gZGVmaW5pdGlvbiB0byBwcmV2ZW50IGNvbW1hcyBmcm9tIGJlaW5nIHR1cm5lZCB0bworICBlbmQtb2YtbGluZXMgYW5kIGFsc28gdHJlYXQgYW55IGNvbW1hcyB3aXRoaW4gcGFyZW5zIGFzIHRleHQgc28gdGhhdAorICBtdWx0aXBsZS1hcmd1bWVudCBmdW5jdGlvbnMgd29uJ3QgY2F1c2UgdGhlIGNvbW1hbmQgdG8gYnJlYWsgcHJlbWF0dXJlbHkuCisgIDE5IE9jdCAyMDAxOiBTaW1pbGFyIHRyZWF0bWVudCB3YXMgYWRkZWQgZm9yIGRvdWJsZXF1b3Rlcywgc28KKworICAgICBkZWZpbmUgZm9vIHsgZWNobyAib25lLCB0d28sIHRocmVlIiB9CisKKyAgd291bGQgd29yayBhcyBleHBlY3RlZC4gIFRoaXMgZG9lc24ndCBzZWVtIHRvIGhhdmUgYnJva2VuIGFueXRoaW5nIGJ1dAorICBpZiBzb21ldGhpbmcgY29tZXMgdXAgbGF0ZXIsIHJlYnVpbGQgd2l0aCBOT0RRTUFDUk8gZGVmaW5lZC4KKyovCisgICAgICAgIGlmICgqcyA9PSAneycpIGtwKys7ICAgICAgICAgICAgLyogQ291bnQgYnJhY2VzICovCisgICAgICAgIGlmICgqcyA9PSAnfScgJiYga3AgPiAwKSBrcC0tOworICAgICAgICBpZiAoKnMgPT0gJygnKSBwcCsrOyAgICAgICAgICAgIC8qIENvdW50IHBhcmVudGhlc2VzLiAqLworICAgICAgICBpZiAoKnMgPT0gJyknICYmIHBwID4gMCkgcHAtLTsKKyNpZm5kZWYgTk9EUU1BQ1JPCisjaWZuZGVmIENPTU1FTlQKKwkvKiBUb28gbWFueSBmYWxzZSBwb3NpdGl2ZXMgKi8KKwkvKiBObywgbm90IHJlYWxseSAtLSB0aGlzIGlzIGluZGVlZCB0aGUgYmVzdCB3ZSBjYW4gZG8gKi8KKwkvKiBSZXZlcnRlZCB0byB0aGlzIG1ldGhvZCBTdW4gTWF5IDExIDE4OjQzOjQ1IDIwMDMgKi8KKwlpZiAoKnMgPT0gJyInKSBkcSA9IDEgLSBkcTsgICAgIC8qIEFjY291bnQgZm9yIGRvdWJsZXF1b3RlcyAqLworI2Vsc2UgIC8qIEZyaSBBcHIgIDQgMTM6MjE6MjkgMjAwMyAqLworCS8qIFRoZSBjb2RlIGJlbG93IGJyZWFrcyB0aGUgU1dJVENIIHN0YXRlbWVudCAqLworCS8qIFRoZXJlIGlzIG5vIHdheSB0byBtYWtlIHRoaXMgd29yayAtLSBpdCB3b3VsZCByZXF1aXJlICovCisJLyogYnVpbGRpbmcgaW4gYWxsIHRoZSBrbm93bGVkZ2Ugb2YgY29tbWFuZCBwYXJzZXIuICovCisgICAgICAgIGlmIChkYmxxdW8gJiYgKCpzID09ICciJykpIHsgICAgLyogSGF2ZSBkb3VibGVxdW90ZSAqLworICAgICAgICAgICAgaWYgKGRxID09IDEpIHsJCS8qIENsb3NlIHF1b3RlIG9ubHkgaWYuLi4gKi8KKyAgICAgICAgICAgICAgICBpZiAoKCoobWFjcFttYWNsdmxdKzEpID09IFNQKSB8fCAvKiBmb2xsb3dlZCBieSBzcGFjZSBvci4uLiAqLworCQkgICAgKCEqKG1hY3BbbWFjbHZsXSsxKSkgfHwgICAgICAvKiBhdCBlbmQgb3IgLi4uICovCisJCSAgICAvKiBOZXh0IGNoYXIgaXMgY29tbWFuZCBzZXBhcmF0b3IuLi4gKi8KKwkJICAgIC8qIFN1biBNYXkgMTEgMTc6MjQ6MTIgMjAwMyAqLworCQkgICAgKGtwIDwgMSAmJiBwcCA8IDEgJiYgKCoobWFjcFttYWNsdmxdKzEpID09ICcsJykpCisJCSAgICApCQkgICAgIAorICAgICAgICAgICAgICAgICAgZHEgPSAwOwkJLyogQ2xvc2UgdGhlIHF1b3RlICovCisgICAgICAgICAgICB9IGVsc2UgaWYgKGRxID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBPcGVuIHF1b3RlIG9ubHkgaWYgYXQgYmVnaW5uaW5nIG9yIHByZWNlZGVkIGJ5IHNwYWNlICovCisgICAgICAgICAgICAgICAgaWYgKHMgPiBzMikgeworICAgICAgICAgICAgICAgICAgICBpZiAoKihzLTEpID09IFNQKQorICAgICAgICAgICAgICAgICAgICAgIGRxID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMgPT0gczIpIHsKKyAgICAgICAgICAgICAgICAgICAgICBkcSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIE5PRFFNQUNSTyAqLworICAgICAgICBpZiAoKnMgPT0gJywnICYmIHBwIDw9IDAgJiYga3AgPD0gMAorI2lmbmRlZiBOT0RRTUFDUk8KKyAgICAgICAgICAgICYmIGRxID09IDAKKyNlbmRpZiAvKiBOT0RRTUFDUk8gKi8KKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgbWFjcFttYWNsdmxdKys7ICAgICAgICAgICAgIC8qIENvbW1hIG5vdCBpbiB7fSBvciAoKSAqLworICAgICAgICAgICAgLyogZGVidWcoRjExMCwibmV4dCBjbWQiLHMsMCk7ICovCisgICAgICAgICAgICBrcCA9IHBwID0gMDsgICAgICAgICAgICAgICAgLyogc28gd2UgaGF2ZSB0aGUgbmV4dCBjb21tYW5kICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWNoZWQgZW5kLiAqLworI2lmZGVmIENPTU1FTlQKKyAgICAvKiBET04nVCBETyBUSElTIC0gSVQgQlJFQUtTIEVWRVJZVEhJTkcgKi8KKyAgICAqcyA9IE5VTDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgaWYgKCpzMiA9PSBOVUwpIHsgICAgICAgICAgICAgICAgICAgLyogSWYgbm90aGluZyB3YXMgY29waWVkLCAqLworICAgICAgICAvKiBkZWJ1ZyhGMTAwLCJYWFggZ2V0bmNtIGVvbSIsIiIsMCk7ICovCisgICAgICAgIHBvcGNsdmwoKTsgICAgICAgICAgICAgICAgICAgICAgLyogcG9wIGNvbW1hbmQgbGV2ZWwuICovCisgICAgICAgIHJldHVybigtMSk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCB0YWNrIENSIG9udG8gZW5kICovCisgICAgICAgICpzKysgPSBDUjsKKyAgICAgICAgKnMgPSAnXDAnOworICAgICAgICAvKiBkZWJ1ZyhGMTEwLCJYWFggZ2V0bmNtIE9LIixzLDApOyAqLworICAgICAgICBpZiAobWVjaG8gJiYgcGZsYWcpICAgICAgICAgICAgIC8qIElmIE1BQ1JPIEVDSE8gT04sIGVjaG8gdGhlIGNtZCAqLworICAgICAgICAgIHByaW50ZigiJXNcbiIsczIpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qICBEIE8gTSBBIEMgIC0tICBEZWZpbmUgYW5kIHRoZW4gZXhlY3V0ZSBhIG1hY3JvICovCisKK2ludAorZG9tYWMobmFtZSwgZGVmLCBmbGFncykgY2hhciAqbmFtZSwgKmRlZjsgaW50IGZsYWdzOyB7CisgICAgaW50IHgsIG07CisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IHRlcm1faW87CisgICAgaW50IHRlcm1faW9fc2F2ID0gdGVybV9pbzsKKyAgICB0ZXJtX2lvID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIFRlcm1pbmFsIEVtdWxhdG9yIEkvTyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICBtID0gbWFjbHZsOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IG1hY3JvIHN0YWNrIGxldmVsICovCisgICAgeCA9IGFkZG1hYyhuYW1lLCBkZWYpOyAgICAgICAgICAgICAgLyogRGVmaW5lIGEgbmV3IG1hY3JvICovCisgICAgaWYgKHggPiAtMSkgeyAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgc3VjY2Vzc2Z1bCwgKi8KKyAgICAgICAgZG9kbyh4LE5VTEwsZmxhZ3MpOyAgICAgICAgICAgICAvKiBzdGFydCBpdCAoaW5jcmVtZW50cyBtYWNsdmwpLiAqLworICAgICAgICB3aGlsZSAobWFjbHZsID4gbSkgeyAgICAgICAgICAgIC8qIEtlZXAgZ29pbmcgdGlsbCBkb25lIHdpdGggaXQsICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkb21hYyBsb29wIG1hY2x2bCAxIiwiIixtYWNsdmwpOworICAgICAgICAgICAgc3N0YXRlID0gKENIQVIpIHBhcnNlcigxKTsgIC8qIHBhcnNpbmcgJiBleGVjdXRpbmcgZWFjaCBjb21tYW5kLCAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwiZG9tYWMgbG9vcCBtYWNsdmwgMiIsIiIsbWFjbHZsKTsKKyAgICAgICAgICAgIGlmIChzc3RhdGUpIHByb3RvKCk7ICAgICAgICAvKiBpbmNsdWRpbmcgcHJvdG9jb2wgY29tbWFuZHMuICovCisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjEwMSwiZG9tYWMgbG9vcCBleGl0IG1hY2x2bCIsIiIsbWFjbHZsKTsKKyAgICB9CisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICB0ZXJtX2lvID0gdGVybV9pb19zYXY7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIHJldHVybihzdWNjZXNzKTsKK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCisvKgorICBHIEUgVCBOIEMgVAorCisgIEdldCBuZXh0IGNvbW1hbmQgZnJvbSBUQUtFIChjb21tYW5kKSBmaWxlLgorCisgIENhbGwgd2l0aDoKKyAgIHMgICAgIFBvaW50ZXIgdG8gYnVmZmVyIHRvIHJlYWQgaW50bworICAgbiAgICAgTGVuZ3RoIG9mIGJ1ZmZlcgorICAgZiAgICAgRmlsZSBkZXNjcmlwdG9yIG9mIGZpbGUgdG8gcmVhZCBmcm9tCisgICBmbGFnICAwID09IGtlZXAgbGluZSB0ZXJtaW5hdG9yIG9uIGFuZCBhbGxvdyBjb250aW51YXRpb24KKyAgICAgICAgIDEgPT0gZGlzY2FyZCBsaW5lIHRlcm1pbmF0b3IgYW5kIGRvbid0IGFsbG93IGNvbnRpbnVhdGlvbgorCisgIENhbGwgd2l0aCBmbGFnID09IDAgdG8gcmVhZCBhIGNvbW1hbmQgZnJvbSBhIFRBS0UgZmlsZTsKKyAgQ2FsbCB3aXRoIGZsYWcgIT0gMCB0byByZWFkIGEgbGluZSBmcm9tIGEgZGlhbGluZyBvciBuZXR3b3JrIGRpcmVjdG9yeS4KKworICBJbiBib3RoIGNhc2VzLCB0cmFpbGluZyBjb21tZW50cyBhbmQvb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcy9hcmUgc3RyaXBwZWQuCisgIElmIGZsYWcgPT0gMCwgY29udGludWVkIGxpbmVzIGFyZSBjb21iaW5lZCBpbnRvIG9uZSBsaW5lLiAgQSBjb250aW51ZWQgbGluZQorICBpcyBvbmUgdGhhdCBlbmRzIGluIGh5cGVuLCBvciBhbnkgbGluZSBpbiBhICJibG9jayIsIHdoaWNoIHN0YXJ0cyB3aXRoICJ7IgorICBhdCB0aGUgZW5kIG9mIGEgbGluZSBhbmQgZW5kcyB3aXRoIGEgbWF0Y2hpbmcgIn0iIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQorICBzdWJzZXF1ZW50IGxpbmU7IGJsb2NrcyBtYXkgYmUgbmVzdGVkLgorCisgIFJldHVybnM6CisgICAwIGlmIGEgc3RyaW5nIHdhcyBjb3BpZWQsCisgIC0xIG9uIEVPRiwKKyAgLTIgb24gbWFsbG9jIGZhaWx1cmUKKyAgLTMgaWYgbGluZSBpcyBub3QgcHJvcGVybHkgdGVybWluYXRlZAorICAtNCBpZiAocG9zc2libHkgY29udGludWVkKSBsaW5lIGlzIHRvbyBsb25nLgorKi8KK3N0YXRpYyBpbnQgbHB4bGVuID0gMDsKKworaW50CitnZXRuY3QocyxuLGYsZmxhZykgY2hhciAqczsgaW50IG47IEZJTEUgKmY7IGludCBmbGFnOyB7CisgICAgaW50IGkgPSAwLCBsZW4gPSAwLCBidWZsZW4gPSAwOworICAgIGNoYXIgYyA9IE5VTCwgY2MgPSBOVUwsIGNjbCA9IE5VTCwgY2N4ID0gTlVMLCAqczIgPSBOVUxMOworICAgIGNoYXIgKmxwID0gTlVMTCwgKmxweCA9IE5VTEwsICpscDIgPSBOVUxMLCAqbHAzID0gTlVMTCwgKmxhc3Rjb21tYSA9IE5VTEw7CisgICAgY2hhciAqIHByZXYgPSBOVUxMOworICAgIGludCBiYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2NrIGNvdW50ZXIgKi8KKworICAgIHMyID0gczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIG9yaWdpbmFsIHBvaW50ZXIgKi8KKyAgICBwcmV2ID0gczI7CisgICAgYnVmbGVuID0gbjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgb3JpZ2luYWwgYnVmZmVyIGxlbmd0aCAqLworCisgICAgaWYgKG4gPCAwKQorICAgICAgcmV0dXJuKC0yKTsKKworICAgIC8qIEFsbG9jYXRlIGEgbGluZSBidWZmZXIgb25seSBpZiB3ZSBkb24ndCBoYXZlIG9uZSB0aGF0J3MgYmlnIGVub3VnaCAqLworCisgICAgZGVidWcoRjExMSwiZ2V0bmN0Iixja2l0b2EobHB4bGVuKSxuKTsKKworICAgIGlmIChscHggJiYgKG4gPiBscHhsZW4pKSB7ICAgICAgICAgIC8qIEhhdmUgb25lIGFscmVhZHkgKi8KKyAgICAgICAgZGVidWcoRjEwMSwiZ2V0bmN0IG5ldyBidWZmZXIiLCIiLGxweGxlbik7CisgICAgICAgIGZyZWUobHB4KTsgICAgICAgICAgICAgICAgICAgICAgLyogQnV0IGl0J3Mgbm90IGJpZyBlbm91Z2ggKi8KKyAgICAgICAgbHB4ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIGN1cnJlbnQgb25lICovCisgICAgICAgIGxweGxlbiA9IDA7CisgICAgfQorICAgIGlmICghbHB4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBuZXcgb25lICovCisgICAgICAgIGlmICghKGxweCA9IChjaGFyICopIG1hbGxvYyhuKSkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImdldG5jdCBtYWxsb2MgZmFpbHVyZSIsIiIsMCk7CisgICAgICAgICAgICBwcmludGYoIj9NZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIFtnZXRuY3RdXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICAgICAgbHB4bGVuID0gbjsKKyAgICB9CisgICAgbHAyID0gbHB4OworI2lmZGVmIEtMVURHRQorICAgIC8qIE5PVEU6IE5vIGxvbmdlciB1c2VkIGFzIG9mIDE0IEF1ZyAyMDAwICovCisgICAgbHAyKys7CisjZW5kaWYgLyogS0xVREdFICovCisKKyAgICB3aGlsZSAoMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb29wIHRvIHJlYWQgbGluZXMgZnJvbSBmaWxlICovCisgICAgICAgIGRlYnVnKEYxMDEsImdldG5jdCB3aGlsZSAoMSkiLCIiLG4pOworICAgICAgICBpZiAoZmdldHMobHAyLG4sZikgPT0gTlVMTCkgeyAgIC8qIFJlYWQgYSBsaW5lIGludG8gbHAyICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJnZXRuY3QgRU9GIixzMiwwKTsgLyogRU9GICovCisgICAgICAgICAgICBmcmVlKGxweCk7ICAgICAgICAgICAgICAgICAgLyogRnJlZSB0ZW1wb3Jhcnkgc3RvcmFnZSAqLworICAgICAgICAgICAgbHB4ID0gTlVMTDsKKyAgICAgICAgICAgICpzID0gTlVMOyAgICAgICAgICAgICAgICAgICAvKiBNYWtlIGRlc3RpbmF0aW9uIGJlIGVtcHR5ICovCisgICAgICAgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGZhaWx1cmUgY29kZSAqLworICAgICAgICB9CisjaWZuZGVmIE5PRElBTAorICAgICAgICBpZiAoZmxhZykgICAgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IHRoaXMgbGluZSAqLworICAgICAgICAgIGRpcmxpbmUrKzsKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIE5PRElBTCAqLworICAgICAgICAgIHRmbGluZVt0bGV2ZWxdKys7CisgICAgICAgIGxlbiA9IHN0cmxlbihscDIpIC0gMTsgICAgICAgICAgLyogUG9zaXRpb24gb2YgbGluZSB0ZXJtaW5hdG9yICovCisgICAgICAgIGlmIChsZW4gPT0gMCAmJiBscDJbMF0gIT0gJ1xuJykgeyAvKiBMYXN0IGxpbmUgaW4gZmlsZSBoYXMgb25lIGNoYXIgKi8KKyAgICAgICAgICAgIGxwMlsrK2xlbl0gPSAnXG4nOyAgICAgICAgICAvKiB0aGF0IGlzIG5vdCBhIG5ld2xpbmUgKi8KKyAgICAgICAgICAgIGxwMltsZW5dID0gTlVMOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYwMTAsImdldG5jdCIsbHAyLDApOworICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICBsZW4gPSAwOworICAgICAgICBpZiAodGVjaG8gJiYgcGZsYWcpICAgICAgICAgICAgIC8qIElmIFRBS0UgRUNITyBPTiwgKi8KKyAgICAgICAgICBwcmludGYoIiUzZC4gJXMiLCAgICAgICAgICAgICAvKiBlY2hvIGl0IHRoaXMgbGluZS4gKi8KKyNpZm5kZWYgTk9ESUFMCisgICAgICAgICAgICAgICAgIGZsYWcgPyBkaXJsaW5lIDoKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyAgICAgICAgICAgICAgICAgdGZsaW5lW3RsZXZlbF0sCisgICAgICAgICAgICAgICAgIGxwMgorICAgICAgICAgICAgICAgICApOworICAgICAgICBscDMgPSBscDI7ICAgICAgICAgICAgICAgICAgICAgIC8qIFdvcmtpbmcgcG9pbnRlciAqLworICAgICAgICBpID0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBmaXJzdCBub253aGl0ZXNwYWNlIGNoYXJhY3RlciAqLworICAgICAgICB3aGlsZSAoaSA+IDAgJiYgKCpscDMgPT0gU1AgfHwgKmxwMyA9PSBIVCkpIHsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgIGxwMysrOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IDAgJiYgYmMgPiAwKSAgICAgICAgICAgLyogQmxhbmsgbGluZSBpbiB7Li4ufSBibG9jayAqLworICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIElzb2xhdGUsIHJlbW92ZSwgYW5kIGNoZWNrIHRlcm1pbmF0b3IgKi8KKworICAgICAgICBjID0gbHAyW2xlbl07ICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlIG9mIGxpbmUgdGVybWluYXRvciAqLworICAgICAgICAvKiBkZWJ1ZyhGMTAxLCJnZXRuY3QgdGVybWluYXRvciIsIiIsYyk7ICovCisgICAgICAgIGlmIChjIDwgTEYgfHwgYyA+IENSKSB7ICAgICAgICAgLyogSXQncyBub3QgYSB0ZXJtaW5hdG9yICovCisgICAgICAgICAgICAvKiBkZWJ1ZyhGMTExLCJnZXRuY3QgYmFkIGxpbmUiLGxwMixjKTsgKi8KKyAgICAgICAgICAgIGlmIChmZW9mKGYpICYmIGxlbiA+IDAgJiYgbGVuIDwgbikgeworICAgICAgICAgICAgICAgIC8qIEtsdWRnZSBBbGVydC4uLiAqLworICAgICAgICAgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgICAgICAgICBwcmludGYoIldBUk5JTkc6IExhc3QgbGluZSBvZiAlcyBsYWNrcyB0ZXJtaW5hdG9yXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHMyID09IGNtZGJ1ZiA/ICJjb21tYW5kIGZpbGUiIDogImRpcmVjdG9yeSBmaWxlIik7CisgICAgICAgICAgICAgICAgYyA9IGxwMlsrK2xlbl0gPSAnXG4nOyAgLyogTm8gYmlnIGRlYWwgLSBzdXBwbHkgb25lLiAqLworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIFNvbWV0aGluZydzIHdyb25nLCBmYWlsLiAqLworICAgICAgICAgICAgICAgIGZyZWUobHB4KTsKKyAgICAgICAgICAgICAgICBscHggPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybigtMyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogVHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisKKyAgICAgICAgZm9yIChpID0gbGVuIC0gMTsgaSA+IC0xICYmIGxwMltpXSA8PSBTUDsgaS0tKSAvKiBUcmltICovCisgICAgICAgICAgOworICAgICAgICAvKiBkZWJ1ZyhGMTAxLCJnZXRuY3QgaSIsIiIsaSk7ICovCisgICAgICAgIGxwMltpKzFdID0gTlVMOyAgICAgICAgICAgICAgICAgLyogVGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKyAgICAgICAgLyogZGVidWcoRjExMCwiZ2V0bmN0IGxwMiIsbHAyLDApOyAqLworICAgICAgICBscCA9IGxwMjsgICAgICAgICAgICAgICAgICAgICAgIC8qIE1ha2UgYSB3b3JraW5nIHBvaW50ZXIgKi8KKworICAgICAgICAvKiBSZW1vdmUgdHJhaWxpbmcgb3IgZnVsbC1saW5lIGNvbW1lbnQgKi8KKworICAgICAgICB3aGlsZSAoKGNjID0gKmxwKSkgeworICAgICAgICAgICAgaWYgKGNjID09ICc7JyB8fCBjYyA9PSAnIycpIHsgLyogQ29tbWVudCBpbnRyb2R1Y2VyPyAqLworICAgICAgICAgICAgICAgIGlmIChscCA9PSBscDIpIHsgICAgICAgIC8qIEZpcnN0IGNoYXIgb24gbGluZSAqLworICAgICAgICAgICAgICAgICAgICAqbHAgPSBOVUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKihscCAtIDEpID09IFNQIHx8ICoobHAgLSAxKSA9PSBIVCkgeworICAgICAgICAgICAgICAgICAgICBscC0tOworICAgICAgICAgICAgICAgICAgICAqbHAgPSBOVUw7ICAvKiBPciBwcmVjZWRlZCBieSB3aGl0ZXNwYWNlICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxwKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxwID4gbHAyKQorICAgICAgICAgIGxwLS07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2sgdXAgb3ZlciB0aGUgTlVMICovCisKKyAgICAgICAgLyogTm93IHRyaW0gYW55IHNwYWNlIHRoYXQgcHJlY2VkZWQgdGhlIGNvbW1lbnQgKi8KKworICAgICAgICB3aGlsZSAoKCpscCA9PSBTUCB8fCAqbHAgPT0gSFQpICYmIGxwID49IGxwMikgeworICAgICAgICAgICAgKmxwID0gTlVMOworICAgICAgICAgICAgaWYgKGxwIDw9IGxwMikKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBscC0tOworICAgICAgICB9CisgICAgICAgIC8qIGRlYnVnKEYxMTAsImdldG5jdCBjb21tZW50IHRyaW1tZWQiLGxwMiwwKTsgKi8KKworICAgICAgICBsZW4gPSBzdHJsZW4obHAyKTsgICAgICAgICAgICAgIC8qIExlbmd0aCBhZnRlciB0cmltbWluZyAqLworCisgICAgICAgIGlmIChuIC0gbGVuIDwgMikgeyAgICAgICAgICAgICAgLyogQ2hlY2sgcmVtYWluaW5nIHNwYWNlICovCisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJnZXRuY3QgY29tbWFuZCB0b28gbG9uZyIsczIsYnVmbGVuKTsKKyAgICAgICAgICAgIHByaW50ZigiP0xpbmUgdG9vIGxvbmcsIG1heGltdW0gbGVuZ3RoOiAlZC5cbiIsYnVmbGVuKTsKKyAgICAgICAgICAgIGZyZWUobHB4KTsKKyAgICAgICAgICAgIHJldHVybigtNCk7CisgICAgICAgIH0KKyAgICAgICAgY2NsID0gKGxlbiA+IDApID8gbHAyW2xlbi0xXSA6IDA7ICAgICAvKiBMYXN0IGNoYXJhY3RlciBpbiBsaW5lICovCisgICAgICAgIGNjeCA9IChsZW4gPiAxKSA/IGxwMltsZW4tMl0gOiAwOyAgICAgLyogUGVudWx0aW1hdGUgY2hhciBpbiBsaW5lICovCisKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIC8qIExpbmUgY29udGFpbmluZyBvbmx5IHdoaXRlc3BhY2UgYW5kICwtICovCisgICAgICAgIGlmICgobGVuID4gMSkgJiYgKGxwMyA9PSBscDIrbGVuLTIpICYmIChjY2wgPT0gJy0nKSAmJiAoY2N4ID09ICcsJykpCisgICAgICAgICAgY29udGludWU7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjaWZkZWYgS0xVREdFCisvKgorICBJZiBpdCBpcyBhIGNvbW1hbmQgYW5kIGl0IGJlZ2lucyB3aXRoIGEgdG9rZW4gKGxpa2UgISBvciAuKSB0aGF0IGlzIG5vdAorICBmb2xsb3dlZCBieSBhIHNwYWNlLCBpbnNlcnQgYSBzcGFjZSBub3c7IG90aGVyd2lzZSBjbWtleSgpIGNhbiBnZXQgbWlnaHR5CisgIGNvbmZ1c2VkLgorKi8KKyAgICAgICAgaWYgKHMgPT0gczIgJiYgIWZsYWcpIHsKKyAgICAgICAgICAgIGNoYXIgKnAgPSB0b2t0YWI7CisgICAgICAgICAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gKmxwMyAmJiAqKHArMSkgIT0gU1ApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZ2V0bmN0IHRva2VuIixwLDApOworICAgICAgICAgICAgICAgICAgICAqbHAzLS0gPSBTUDsKKyAgICAgICAgICAgICAgICAgICAgKmxwMyA9ICpwOworICAgICAgICAgICAgICAgICAgICBpZiAobHAzIDwgbHAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBscDItLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogS0xVREdFICovCisgICAgICAgIGxwID0gbHAyOworCisgICAgICAgIHdoaWxlICgoKnMrKyA9ICpscCsrKSkgICAgICAgICAgLyogQ29weSByZXN1bHQgdG8gdGFyZ2V0IGJ1ZmZlciAqLworICAgICAgICAgIG4tLTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFjY291bnRpbmcgZm9yIGxlbmd0aCAqLworICAgICAgICBzLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2sgdXAgb3ZlciB0aGUgTlVMICovCisKKyAgICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGlzIGxpbmUgaXMgY29udGludWVkICovCisKKyAgICAgICAgaWYgKGZsYWcpICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBsaW5lIGNvbnRpbnVhdGlvbiB3aGVuIGZsYWc9MSAqLworICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvIGJyZWFrIG91dCBvZiByZWFkLWxpbmVzIGxvb3AgKi8KKworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgZGVidWcoRjAwMCwiZ2V0bmN0IGZpcnN0IGNoYXIiLCIiLCpscDMpOworICAgICAgICBkZWJ1ZyhGMDAwLCJnZXRuY3QgbGFzdCBjaGFyIiwiIixjY2wpOworICAgICAgICBkZWJ1ZyhGMDAwLCJnZXRuY3QgbmV4dC10by1sYXN0IGNoYXIiLCIiLGNjeCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgICAgIGlmIChiYyA+IDAgJiYgKmxwMyA9PSAnfScpIHsgICAgLyogRmlyc3QgY2hhciBvbiBsaW5lIGlzICd9JyAqLworICAgICAgICAgICAgYmMtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVjcmVtZW50IGJsb2NrIGNvdW50ZXIgKi8KKyAgICAgICAgfQorCisgICAgICAgIGlmIChiYyA9PSAwICYmICAgICAgICAgICAgICAgICAgLyogTGluZSBpcyBjb250aW51ZWQgaWYgYmMgPiAwICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgLyogTm90IHN1cHBvcnRlZCBhcyBvZiBDLUtlcm1pdCA2LjAgKi8KKyAgICAgICAgICAgIGNjbCAhPSBDTURRICYmICAgICAgICAgICAgICAvKiBvciBsaW5lIGVuZHMgd2l0aCBDTURRICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgY2NsICE9ICctJyAgJiYgICAgICAgICAgICAgIC8qIG9yIGxpbmUgZW5kcyB3aXRoIGRhc2ggKi8KKyAgICAgICAgICAgIGNjbCAhPSAneycpICAgICAgICAgICAgICAgICAvKiBvciBsaW5lIGVuZHMgd2l0aCBvcGVuaW5nIGJyYWNlICovCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTm9uZSBvZiB0aG9zZSwgd2UncmUgZG9uZS4gKi8KKworICAgICAgICBpZiAoY2NsID09ICctJyB8fCBjY2wgPT0gJ3snKSAgIC8qIENvbnRpbnVhdGlvbiBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICBpZiAoY2N4ID09IENNRFEpICAgICAgICAgICAgICAvKiBCdXQgaXQncyBxdW90ZWQgKi8KKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAvKiBzbyBpZ25vcmUgaXQgKi8KKworICAgICAgICBpZiAoY2NsID09ICd7JykgeyAgICAgICAgICAgICAgIC8qIExhc3QgY2hhciBvbiBsaW5lIGlzICd7Jz8gKi8KKyAgICAgICAgICAgIGJjKys7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3VudCB0aGUgYmxvY2sgb3BlbmVyLiAqLworICAgICAgICB9IGVsc2UgaWYgKGNjbCA9PSAnLScpIHsgICAgICAgIC8qIEV4cGxpY2l0IGNvbnRpbnVlPyAqLworICAgICAgICAgICAgY2hhciBjLCAqIHNzOworICAgICAgICAgICAgaW50IHN0YXRlID0gMCwgbm47CisgICAgICAgICAgICBzLS07ICAgICAgICAgICAgICAgICAgICAgICAgLyogWWVzLCBiYWNrIHVwIG92ZXIgdGVybWluYXRvcnMgKi8KKyAgICAgICAgICAgIG4rKzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgb3ZlciBjb250aW51YXRpb24gY2hhcmFjdGVyICovCisgICAgICAgICAgICBubiA9IG47ICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSBjdXJyZW50IGNvdW50ICovCisgICAgICAgICAgICBzcyA9IHM7ICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHMtLTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrIHVwIG92ZXIgZGFzaCAqLworICAgICAgICAgICAgbisrOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlIDwgMiAmJiBzID49IHByZXYpIHsgLyogQ2hlY2sgZm9yICJ7LC0iICovCisgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgICAgIGMgPSAqcy0tOworICAgICAgICAgICAgICAgIGlmIChjIDw9IFNQKQorICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gJywnICYmIGMgIT0gJ3snKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgIC8qIExvb2tpbmcgZm9yIGNvbW1hICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICcsJykKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgIC8qIExvb2tpbmcgZm9yIGxlZnQgYnJhY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBzICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAqcyA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlICE9IDIpIHsgcyA9IHNzOyBuID0gbm47IH0KKyAgICAgICAgICAgICpzID0gTlVMOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vbmUgb2YgdGhvc2UgYnV0IChiYyA+IDApICovCisgICAgICAgICAgICBsYXN0Y29tbWEgPSBzOworICAgICAgICAgICAgKnMrKyA9ICcsJzsgICAgICAgICAgICAgICAgIC8qIGFuZCBpbnNlcnQgYSBjb21tYSAqLworICAgICAgICAgICAgbi0tOworICAgICAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgICAgICBkZWJ1ZyhGMTAxLCJnZXRuY3QgYmMiLCIiLGJjKTsKKyAgICAgICAgZGVidWcoRjEwMCwiZ2V0bmN0IGNvbnRpbnVlZCIsIiIsMCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgICAgICpzID0gTlVMOworICAgICAgICBwcmV2ID0gczsKKworICAgIH0gLyogcmVhZC1saW5lcyB3aGlsZSBsb29wICovCisKKyAgICBpZiAobGFzdGNvbW1hKQorICAgICAgKmxhc3Rjb21tYSA9IFNQOworICAgIGlmICghZmxhZykgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhY2sgbGluZSB0ZXJtaW5hdG9yIGJhY2sgb24gKi8KKyAgICAgICpzKysgPSBjOworICAgICpzKysgPSBOVUw7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisgICAgdW50YWIoczIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uZSwgY29udmVydCB0YWJzIHRvIHNwYWNlcyAqLworI2lmZGVmIERFQlVHCisgICAgaWYgKCFmbGFnKSB7CisgICAgICAgIGRlYnVnKEYwMTAsIkNNRChGKSIsczIsMCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgZnJlZShscHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSB0ZW1wb3Jhcnkgc3RvcmFnZSAqLworICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBzdWNjZXNzICovCit9CisKK1ZPSUQKK3Nob3N0YWNrKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEdW1wIHRoZSBjb21tYW5kIHN0YWNrICovCisgICAgaW50IGk7CisgICAgY2hhciAqcDsKKyNpZm5kZWYgTk9TUEwKKyAgICBmb3IgKGkgPSBjbWRsdmw7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgaWYgKGNtZHN0a1tpXS5zcmMgPT0gQ01EX1RGKSB7CisgICAgICAgICAgICBwID0gdGZuYW1bY21kc3RrW2ldLmx2bF07CisgICAgICAgICAgICBpZiAoemZucWZwKHAsVE1QQlVGU0laLHRtcGJ1ZikpCisgICAgICAgICAgICAgIHAgPSB0bXBidWY7CisgICAgICAgICAgICBwcmludGYoIiAlMmQuIEZpbGUgIDogJXMgKGxpbmUgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICB0ZmxpbmVbY21kc3RrW2ldLmx2bF0KKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9IGVsc2UgaWYgKGNtZHN0a1tpXS5zcmMgPT0gQ01EX01EKSB7CisgICAgICAgICAgICBjaGFyICogbTsKKyAgICAgICAgICAgIG0gPSBtX2FyZ1tjbWRzdGtbaV0ubHZsXVswXTsgLyogTmFtZSBvZiB0aGlzIG1hY3JvICovCisgICAgICAgICAgICBpZiAoaSA+IDApIHsgICAgICAgICAgICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIDItbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICBjaGFyICpzOyAgICAgICAgICAgICAgICAgLyogYnVpbHQtaW4gbWFjcm9zLi4uICovCisgICAgICAgICAgICAgICAgcyA9IG1fYXJnW2NtZHN0a1tpLTFdLmx2bF1bMF07IC8qIE5hbWUgbmV4dCBsZXZlbCB1cCAqLworICAgICAgICAgICAgICAgIGlmIChzICYmIGNtZHN0a1tpLTFdLnNyYyA9PSBDTURfTUQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAocywiX2ZvcngiKSkKKyAgICAgICAgICAgICAgICAgICAgICBtID0gIkZPUiI7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAocywiX3hpZiIpKQorICAgICAgICAgICAgICAgICAgICAgIG0gPSAiWElGIjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChzLCJfd2hpbGUiKSkKKyAgICAgICAgICAgICAgICAgICAgICBtID0gIldISUxFIjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChzLCJfc3dpdHgiKSkKKyAgICAgICAgICAgICAgICAgICAgICBtID0gIlNXSVRDSCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCIgJTJkLiBNYWNybyA6ICVzXG4iLGksbSk7CisgICAgICAgIH0gZWxzZSBpZiAoY21kc3RrW2ldLnNyYyA9PSBDTURfS0IpIHsKKyAgICAgICAgICAgIHByaW50ZigiICUyZC4gUHJvbXB0OlxuIixpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiICUyZC4gRVJST1IgOiBDb21tYW5kIHNvdXJjZSB1bmtub3duXG4iLGkpOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBmb3IgKGkgPSB0bGV2ZWw7IGkgPiAtMTsgaS0tKSB7CisgICAgICAgIHAgPSB0Zm5hbVtpXTsKKyAgICAgICAgaWYgKHpmbnFmcChwLFRNUEJVRlNJWix0bXBidWYpKQorICAgICAgICAgIHAgPSB0bXBidWY7CisgICAgICAgIHByaW50ZigiICUyZC4gRmlsZSAgOiAlcyAobGluZSAlZClcbiIsCisgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgIHRmbGluZVtpXQorICAgICAgICAgICAgICAgKTsKKyAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICBpZiAoaSA9PSAwKQorICAgICAgcHJpbnRmKCIgJTJkLiBQcm9tcHQ6ICh0b3AgbGV2ZWwpXG4iLDApOworfQorCisKKy8qICBQIEEgUiBTIEUgUiAgLS0gIFRvcC1sZXZlbCBpbnRlcmFjdGl2ZSBjb21tYW5kIHBhcnNlci4gICovCisKKy8qCisgIENhbGwgd2l0aDoKKyAgICBtID0gMCBmb3Igbm9ybWFsIGJlaGF2aW9yOiBrZWVwIHBhcnNpbmcgYW5kIGV4ZWN1dGluZyBjb21tYW5kcworICAgICAgICAgIHVudGlsIGFuIGFjdGlvbiBjb21tYW5kIGlzIHBhcnNlZCwgdGhlbiByZXR1cm4gd2l0aCBhCisgICAgICAgICAgS2VybWl0IHN0YXJ0LXN0YXRlIGFzIHRoZSB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uLgorICAgIG0gPSAxIHRvIHBhcnNlIG9ubHkgb25lIGNvbW1hbmQsIGNhbiBhbHNvIGJlIHVzZWQgdG8gY2FsbCBwYXJzZXIoKQorICAgICAgICAgIHJlY3Vyc2l2ZWx5LgorICAgIG0gPSAyIHRvIHJlYWQgYnV0IGRvIG5vdCBleGVjdXRlIG9uZSBjb21tYW5kLgorICBJbiBhbGwgY2FzZXMsIHBhcnNlcigpIHJldHVybnM6CisgICAgMCAgICAgaWYgbm8gS2VybWl0IHByb3RvY29sIGFjdGlvbiByZXF1aXJlZAorICAgID4gMCAgIHdpdGggYSBLZXJtaXQgcHJvdG9jb2wgc3RhcnQtc3RhdGUuCisgICAgPCAwICAgdXBvbiBlcnJvci4KKyovCitpbnQKK3BhcnNlcihtKSBpbnQgbTsgeworICAgIGludCB0ZmNvZGUsIHh4LCB5eSwgeno7ICAgICAgICAgICAgIC8qIFdvcmtlcnMgKi8KKyAgICBpbnQgaXNfdG4gPSAwOworICAgIGludCBjZGxvc3QgPSAwOworCisjaWZuZGVmIE5PU1BMCisgICAgaW50IGlubGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTGV2ZWwgd2Ugd2VyZSBjYWxsZWQgYXQgKi8KKyAgICBleHRlcm4gaW50IGFza2ZsYWc7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICBjaGFyICpjYnA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kIGJ1ZmZlciBwb2ludGVyICovCisjaWZkZWYgTUFDCisgICAgZXh0ZXJuIGNoYXIgKmxmaWxlczsgICAgICAgICAgICAgICAgLyogRmFrZSBleHRlcm4gY2FzdCAqLworI2VuZGlmIC8qIE1BQyAqLworICAgIGV4dGVybiBpbnQgaW50ZXJydXB0ZWQ7CisjaWZuZGVmIE5PWEZFUgorICAgIGV4dGVybiBpbnQgc25kY21kLCBnZXRjbWQsIGZhdGFsaW8sIGNsZWFycnE7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyAgICBkZWJvayA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVbmRpc2FibGUgZGVidWdnaW5nICovCisKKyNpZmRlZiBBTUlHQQorICAgIHJlcXJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgQW1pZ2FET1MgcmVxdWVzdG9ycyAqLworI2VuZGlmIC8qIEFNSUdBICovCisKKyNpZmRlZiBPUzIKKyAgICBpZiAoY3Vyc29yX3NhdmUgPiAtMSkgeyAgICAgICAgICAgICAvKiBSZXN0b3JlIGN1cnNvciBpZiBpdCB3YXMgKi8KKyAgICAgICAgY3Vyc29yZW5hW1ZDTURdID0gY3Vyc29yX3NhdmU7ICAvKiB0dXJuZWQgb2ZmIGR1cmluZyBmaWxlIHRyYW5zZmVyICovCisgICAgICAgIGN1cnNvcl9zYXZlID0gLTE7CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgSUtTREIKKyAgICBpZiAoaWtkYm9wZW4pIHNsb3RzdGF0ZSh3aGF0LCJDT01NQU5EIFBST01QVCIsIiIsIiIpOyAvKiBJS1NEIGRhdGFiYXNlICovCisjZW5kaWYgLyogSUtTREIgKi8KKworICAgIGlzX3RuID0gKGxvY2FsICYmIG5ldHdvcmsgJiYgSVNfVEVMTkVUKCkpIHx8CisgICAgICAoIWxvY2FsICYmIHNzdGVsbmV0KTsKKworICAgIGlmICgheGNtZHNyYykgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGF0IHRvcCAoaW50ZXJhY3RpdmUpIGxldmVsIC4uLiAqLworICAgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsgICAgICAgICAgICAgIC8qIHB1dCBjb25zb2xlIGluICdjYnJlYWsnIG1vZGUuICovCisKKyNpZmRlZiBDS19UTVBESVIKKy8qIElmIHdlIHdlcmUgY2QnZCB0ZW1wb3JhcmlseSB0byBhbm90aGVyIGRldmljZSBvciBkaXJlY3RvcnkgLi4uICovCisgICAgaWYgKGZfdG1wZGlyKSB7CisgICAgICAgIGludCB4OworICAgICAgICB4ID0gemNoZGlyKChjaGFyICopIHNhdmRpcik7ICAgIC8qIC4uLiByZXN0b3JlIHByZXZpb3VzIGRpcmVjdG9yeSAqLworICAgICAgICBmX3RtcGRpciA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZW1lbWJlciB3ZSBkaWQgaXQuICovCisgICAgICAgIGRlYnVnKEYxMTEsInBhcnNlciB0bXBkaXIgcmVzdG9yaW5nIixzYXZkaXIseCk7CisgICAgfQorI2VuZGlmIC8qIENLX1RNUERJUiAqLworCisjaWZuZGVmIE5PU1BMCisgICAgaW5sZXZlbCA9IGNtZGx2bDsgICAgICAgICAgIC8qIEN1cnJlbnQgbWFjcm8gbGV2ZWwgKi8KKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKyAgICAgICAgZGVidWcoRjEwMSwiJnBhcnNlciBlbnRyeSBtYWNsdmwiLCIiLG1hY2x2bCk7CisgICAgICAgIGRlYnVnKEYxMDEsIiZwYXJzZXIgZW50cnkgaW5sZXZlbCIsIiIsaW5sZXZlbCk7CisgICAgICAgIGRlYnVnKEYxMDEsIiZwYXJzZXIgZW50cnkgdGxldmVsIiwiIix0bGV2ZWwpOworICAgICAgICBkZWJ1ZyhGMTAxLCImcGFyc2VyIGVudHJ5IGNtZGx2bCIsIiIsY21kbHZsKTsKKyAgICAgICAgZGVidWcoRjEwMSwiJnBhcnNlciBlbnRyeSBtIiwiIixtKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PWEZFUgorICAgIGZ0cmVzZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGdsb2JhbCBmaWxlIHNldHRpbmdzICovCisjZW5kaWYgLyogTk9YRkVSICovCisvKgorICBzc3RhdGUgYmVjb21lcyBub256ZXJvIHdoZW4gYSBjb21tYW5kIGhhcyBiZWVuIHBhcnNlZCB0aGF0IHJlcXVpcmVzIHNvbWUKKyAgYWN0aW9uIGZyb20gdGhlIHByb3RvY29sIG1vZHVsZS4gIEFueSBub24tcHJvdG9jb2wgYWN0aW9ucywgc3VjaCBhcyBsb2NhbAorICBkaXJlY3RvcnkgbGlzdGluZyBvciB0ZXJtaW5hbCBlbXVsYXRpb24sIGFyZSBpbnZva2VkIGRpcmVjdGx5IGZyb20gYmVsb3cuCisqLworICAgIHNzdGF0ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IHdpdGggbm8gc3RhcnQgc3RhdGUuICovCisKKyNpZm5kZWYgTk9YRkVSCisjaWZuZGVmIE5PU1BMCisgICAgcXVlcnkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUVVFUlkgbm90IGFjdGl2ZSAqLworI2VuZGlmIC8qIE5PU1BMICovCisjaWZuZGVmIE5PSElOVFMKKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgaWYgKGxvY2FsICYmICFuZXR3b3JrICYmIGNhcnJpZXIgIT0gQ0FSX09GRikgeworICAgICAgICAgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgIC8qIFNlcmlhbCBjb25uZWN0aW9uICovCisgICAgICAgICAgICB4ID0gdHRnbWRtKCk7ICAgICAgICAgICAgICAgLyogd2l0aCBjYXJyaWVyIGNoZWNraW5nICovCisgICAgICAgICAgICBpZiAoeCA+IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoeCAmIEJNX0RDRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Rsb3N0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZmF0YWxpbyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworICAgICAgICBkZWJ1ZyhGMTAxLCJwYXJzZXIgdG9wIHdoYXQiLCIiLHdoYXQpOworICAgICAgICBkZWJ1ZyhGMTAxLCJwYXJzZXIgdG9wIGludGVycnVwdGVkIiwiIixpbnRlcnJ1cHRlZCk7CisgICAgICAgIGRlYnVnKEYxMDEsInBhcnNlciB0b3AgY2Rsb3N0IiwiIixjZGxvc3QpOworICAgICAgICBkZWJ1ZyhGMTAxLCJwYXJzZXIgdG9wIHNuZGNtZCIsIiIsc25kY21kKTsKKyAgICAgICAgZGVidWcoRjEwMSwicGFyc2VyIHRvcCBnZXRjbWQiLCIiLGdldGNtZCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgaWYgKGNkbG9zdCAmJiAhaW50ZXJydXB0ZWQgJiYgKHNuZGNtZCB8fCBnZXRjbWQpKSB7CisgICAgICAgIHByaW50ZigiP0Nvbm5lY3Rpb24gYnJva2VuIChjYXJyaWVyIHNpZ25hbCBsb3N0KVxuIik7CisgICAgfQorICAgIGlmIChzbmRjbWQgJiYgIXN1Y2Nlc3MgJiYgaGludHMgJiYgIWludGVycnVwdGVkICYmICFmYXRhbGlvICYmICF4Y21kc3JjKSB7CisgICAgICAgIGludCB4ID0gMCwgbiA9IDA7CisgICAgICAgIHByaW50ZigiXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKyAgICAgICAgcHJpbnRmKCJTRU5ELWNsYXNzIGNvbW1hbmQgZmFpbGVkLlxuIik7CisgICAgICAgIHByaW50ZigiIFBhY2tldHMgc2VudDogJWRcbiIsIHNwYWNrZXRzKTsKKyAgICAgICAgcHJpbnRmKCIgUmV0cmFuc21pc3Npb25zOiAlZFxuIixyZXRyYW5zKTsKKyAgICAgICAgcHJpbnRmKCIgVGltZW91dHM6ICVkXG4iLCB0aW1lb3V0cyk7CisgICAgICAgIHByaW50ZigiIERhbWFnZWQgcGFja2V0czogJWRcbiIsIGNydW5jaGVkKTsKKyAgICAgICAgaWYgKGVwa3RyY3ZkKSB7CisgICAgICAgICAgICBwcmludGYoIiBUcmFuc2ZlciBjYW5jZWxlZCBieSByZWNlaXZlci5cbiIpOworICAgICAgICAgICAgcHJpbnRmKCIgUmVjZWl2ZXIncyBtZXNzYWdlOiBcIiVzXCJcbiIsKGNoYXIgKillcGt0bXNnKTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChlcGt0bXNnKSBpZiAoKmVwa3Rtc2cpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiBGYXRhbCBLZXJtaXQgUHJvdG9jb2wgRXJyb3I6ICVzXG4iLGVwa3Rtc2cpOworICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobG9jYWwgJiYgIW5ldHdvcmsgJiYgY2FycmllciAhPSBDQVJfT0ZGKSB7CisgICAgICAgICAgICBpbnQgeHg7ICAgICAgICAgICAgICAgICAgICAgLyogU2VyaWFsIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgIHh4ID0gdHRnbWRtKCk7ICAgICAgICAgICAgICAvKiB3aXRoIGNhcnJpZXIgY2hlY2tpbmcgKi8KKyAgICAgICAgICAgIGlmICh4eCA+IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoeHggJiBCTV9EQ0QpKQorICAgICAgICAgICAgICAgICAgY2Rsb3N0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWZkZWYgVU5JWAorICAgICAgICBpZiAoZXJybm8gIT0gMCkKKyNlbmRpZiAvKiBVTklYICovCisgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYoIiBNb3N0IHJlY2VudCBsb2NhbCBPUyBlcnJvcjogXCIlc1wiXG4iLGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgICAgbisrOworICAgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKAorICAgIlxuSElOVFMuLi4gSWYgdGhlIHByZWNlZGluZyBlcnJvciBtZXNzYWdlJXMgbm90IGV4cGxhaW4gdGhlIGZhaWx1cmU6XG4iLAorICAgICAgICAgICAgICAgKG4gPiAxKSA/ICJzIGRvIiA6ICIgZG9lcyIKKyAgICAgICAgICAgICAgICk7CisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgaWYgKGxvY2FsKSB7CisgICAgICAgICAgICBpZiAocnBhY2tldHMgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiIC4gRGlkIHlvdSBzdGFydCBhIEtlcm1pdCByZWNlaXZlciBvbiB0aGUgZmFyIGVuZD9cbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgIiAuIFRyeSBjaGFuZ2luZyB0aGUgcmVtb3RlIEtlcm1pdCdzIEZMT1ctQ09OVFJPTCBzZXR0aW5nLlxuIik7CisgICAgICAgICAgICAgICAgaWYgKCFuZXR3b3JrICYmIG1kbXR5cCA+IDApCisgICAgICAgICAgICAgICAgICBpZiAoKDMgKiBjcnVuY2hlZCkgPiBzcGFja2V0cykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICIgLiBUcnkgcGxhY2luZyBhIG5ldyBjYWxsIHRvIGdldCBhIGNsZWFuZXIgY29ubmVjdGlvbi5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJwYWNrZXRzID4gMCkgeworICAgICAgICAgICAgaWYgKGZsb3cgPT0gRkxPX05PTkUpCisgICAgICAgICAgICAgcHJpbnRmKCIgLiBHaXZlIG1lIGEgU0VUIEZMT1cgWE9OL1hPRkYgY29tbWFuZCBhbmQgdHJ5IGFnYWluLlxuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgcHJpbnRmKCIgLiBHaXZlIG1lIGEgU0VUIEZMT1cgTk9ORSBjb21tYW5kIGFuZCB0cnkgYWdhaW4uXG4iKTsKKyAgICAgICAgfQorICAgICAgICB4Kys7CisjZW5kaWYgLyogTk9MT0NBTCAqLworCisgICAgICAgIGlmICgoMyAqIHRpbWVvdXRzKSA+IHNwYWNrZXRzKQorICAgICAgICAgIHByaW50ZigiIC4gQWRqdXN0IHRoZSB0aW1lb3V0IG1ldGhvZCAoc2VlIEhFTFAgU0VUIFNFTkQpLlxuIik7CisgICAgICAgIGlmICgoMyAqIHJldHJhbnMpID4gc3BhY2tldHMpCisgICAgICAgICAgcHJpbnRmKCIgLiBJbmNyZWFzZSB0aGUgcmV0cnkgbGltaXQgKHNlZSBIRUxQIFNFVCBSRVRSWSkuXG4iKTsKKworI2lmZGVmIENLX1NQRUVECisgICAgICAgIGlmIChwcmVmaXhpbmcgIT0gUFhfQUxMICYmIHJwYWNrZXRzID4gMikgeworICAgICAgICAgICAgcHJpbnRmKCIgLiBUcnkgaXQgYWdhaW4gd2l0aCBTRVQgUFJFRklYSU5HIEFMTC5cbiIpOworICAgICAgICAgICAgeCsrOworICAgICAgICB9CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKyNpZmRlZiBTVFJFQU1JTkcKKyAgICAgICAgaWYgKHN0cmVhbWVkKSB7CisgICAgICAgICAgICBwcmludGYoIiAuIFRyeSBpdCBhZ2FpbiB3aXRoIFNFVCBTVFJFQU1JTkcgT0ZGLlxuIik7CisgICAgICAgICAgICB4Kys7CisgICAgICAgIH0gZWxzZSBpZiAocmVsaWFibGUpIHsKKyAgICAgICAgICAgIHByaW50ZigiIC4gVHJ5IGl0IGFnYWluIHdpdGggU0VUIFJFTElBQkxFIE9GRi5cbiIpOworICAgICAgICAgICAgeCsrOworICAgICAgICB9CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisKKyNpZmRlZiBDS19TUEVFRAorICAgICAgICBpZiAoY2xlYXJycSA+IDAgJiYgcHJlZml4aW5nID09IFBYX05PTikgeworICAgICAgICAgICAgcHJpbnRmKCIgLiBUcnkgaXQgYWdhaW4gd2l0aCBTRVQgQ0xFQVItQ0hBTk5FTCBPRkYuXG4iKTsKKyAgICAgICAgICAgIHgrKzsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX1NQRUVEICovCisgICAgICAgIGlmICghcGFyaXR5KSB7CisgICAgICAgICAgICBwcmludGYoIiAuIFRyeSBpdCBhZ2FpbiB3aXRoIFNFVCBQQVJJVFkgU1BBQ0UuXG4iKTsKKyAgICAgICAgICAgIHgrKzsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIiAuICVzaXZlIGEgUk9CVVNUIGNvbW1hbmQgYW5kIHRyeSBhZ2Fpbi5cbiIsCisgICAgICAgICAgICAgICAoeCA+IDApID8gIkFzIGEgbGFzdCByZXNvcnQsIGciIDogIkciCisgICAgICAgICAgICAgICApOworICAgICAgICBwcmludGYoIkFsc286XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgLiBCZSBzdXJlIHRoZSBzb3VyY2UgZmlsZSBoYXMgcmVhZCBwZXJtaXNzaW9uLlxuIik7CisgICAgICAgIHByaW50ZigiIC4gQmUgc3VyZSB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBoYXMgd3JpdGUgcGVybWlzc2lvbi5cbiIpOworICAgICAgICBwcmludGYoIihVc2UgU0VUIEhJTlRTIE9GRiB0byBzdXBwcmVzcyBoaW50cy4pXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiIpOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJ0b3BjbWQiLCIiLHRvcGNtZCk7CisgICAgaWYgKGdldGNtZCAmJiAhc3VjY2VzcyAmJiBoaW50cyAmJiAhaW50ZXJydXB0ZWQgJiYgIWZhdGFsaW8gJiYgIXhjbWRzcmMpIHsKKyAgICAgICAgaW50IHggPSAwOworICAgICAgICBleHRlcm4gaW50IHVycHNpeiwgd3Nsb3RyOworICAgICAgICBwcmludGYoIlxuKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisgICAgICAgIHByaW50ZigiUkVDRUlWRS0gb3IgR0VULWNsYXNzIGNvbW1hbmQgZmFpbGVkLlxuIik7CisgICAgICAgIHByaW50ZigiIFBhY2tldHMgcmVjZWl2ZWQ6ICVkXG4iLCBycGFja2V0cyk7CisgICAgICAgIHByaW50ZigiIERhbWFnZWQgcGFja2V0czogJWRcbiIsIGNydW5jaGVkKTsKKyAgICAgICAgcHJpbnRmKCIgVGltZW91dHM6ICVkXG4iLCB0aW1lb3V0cyk7CisgICAgICAgIGlmIChycGFja2V0cyA+IDApCisgICAgICAgICAgcHJpbnRmKCIgUGFja2V0IGxlbmd0aDogJWRcbiIsIHVycHNpeik7CisgICAgICAgIGlmIChlcGt0cmN2ZCkgeworICAgICAgICAgICAgcHJpbnRmKCIgVHJhbnNmZXIgY2FuY2VsZWQgYnkgc2VuZGVyLlxuIik7CisgICAgICAgICAgICBwcmludGYoIiBTZW5kZXIncyBtZXNzYWdlOiBcIiVzXCJcbiIsKGNoYXIgKillcGt0bXNnKTsKKyAgICAgICAgfQorI2lmZGVmIFVOSVgKKyAgICAgICAgaWYgKGVycm5vICE9IDApCisjZW5kaWYgLyogVU5JWCAqLworICAgICAgICAgIHByaW50ZigiIE1vc3QgcmVjZW50IGxvY2FsIGVycm9yOiBcIiVzXCJcbiIsY2tfZXJyc3RyKCkpOworICAgICAgICBwcmludGYoCisgICAiXG5ISU5UUy4uLiBJZiB0aGUgcHJlY2VkaW5nIGVycm9yIG1lc3NhZ2UlcyBub3QgZXhwbGFpbiB0aGUgZmFpbHVyZTpcbiIsCisgICAgICAgICAgICAgICBlcGt0cmN2ZCA/ICJzIGRvIiA6ICIgZG9lcyIKKyAgICAgICAgICAgICAgICk7CisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgaWYgKGxvY2FsKSB7CisgICAgICAgICAgICBpZiAodG9wY21kID09IFhYR0VUKQorICAgICAgICAgICAgICBwcmludGYoIiAuIERpZCB5b3Ugc3RhcnQgYSBLZXJtaXQgU0VSVkVSIG9uIHRoZSBmYXIgZW5kP1xuIik7CisgICAgICAgICAgICBpZiAocnBhY2tldHMgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICh0b3BjbWQgIT0gWFhHRVQpCisgICAgICAgICAgICAgICAgICBwcmludGYoIiAuIERpZCB5b3Ugc3RhcnQgYSBLZXJtaXQgU0VORGVyIG9uIHRoZSBmYXIgZW5kP1xuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAiIC4gQ2hvb3NlIGEgZGlmZmVyZW50IEZMT1ctQ09OVFJPTCBzZXR0aW5nIGFuZCB0cnkgYWdhaW4uXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0b3BjbWQgPT0gWFhHRVQpCisgICAgICAgICAgcHJpbnRmKCIgLiBJcyB0aGUgb3RoZXIgS2VybWl0IGluIChvciBkb2VzIGl0IGhhdmUpIFNFUlZFUiBtb2RlP1xuIik7CisgICAgICAgIGlmIChycGFja2V0cyA+IDAgJiYgdXJwc2l6ID4gOTApCisgICAgICAgICAgcHJpbnRmKCIgLiBUcnkgc21hbGxlciBwYWNrZXRzIChTRVQgUkVDRUlWRSBQQUNLRVQtTEVOR1RIKS5cbiIpOworICAgICAgICBpZiAocnBhY2tldHMgPiAwICYmIHdzbG90ciA+IDEgJiYgIXN0cmVhbWVkKQorICAgICAgICAgIHByaW50ZigiIC4gVHJ5IGEgc21hbGxlciB3aW5kb3cgc2l6ZSAoU0VUIFdJTkRPVykuXG4iKTsKKyAgICAgICAgaWYgKCFsb2NhbCAmJiBycGFja2V0cyA+IDApIHsKKyAgICAgICAgICAgIGlmIChmbG93ID09IEZMT19OT05FKQorICAgICAgICAgICAgIHByaW50ZigiIC4gR2l2ZSBtZSBhIFNFVCBGTE9XIFhPTi9YT0ZGIGNvbW1hbmQgYW5kIHRyeSBhZ2Fpbi5cbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHByaW50ZigiIC4gR2l2ZSBtZSBhIFNFVCBGTE9XIE5PTkUgY29tbWFuZCBhbmQgdHJ5IGFnYWluLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgeCsrOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZmRlZiBTVFJFQU1JTkcKKyAgICAgICAgaWYgKHN0cmVhbWVkKSB7CisgICAgICAgICAgICBwcmludGYoIiAuIFRyeSBpdCBhZ2FpbiB3aXRoIFNFVCBTVFJFQU1JTkcgT0ZGLlxuIik7CisgICAgICAgICAgICB4Kys7CisgICAgICAgIH0gZWxzZSBpZiAocmVsaWFibGUgJiYgbG9jYWwpIHsKKyAgICAgICAgICAgIHByaW50ZigiIC4gVHJ5IGl0IGFnYWluIHdpdGggU0VUIFJFTElBQkxFIE9GRi5cbiIpOworICAgICAgICAgICAgeCsrOworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKyAgICAgICAgaWYgKCFwYXJpdHkpIHsKKyAgICAgICAgICAgIHByaW50ZigiIC4gVHJ5IGl0IGFnYWluIHdpdGggU0VUIFBBUklUWSBTUEFDRS5cbiIpOworICAgICAgICAgICAgeCsrOworICAgICAgICB9CisgICAgICAgIHByaW50ZigoeCA+IDApID8KKyAgICAgICAgICAgICAgICIgLiBBcyBhIGxhc3QgcmVzb3J0LCBnaXZlIGEgUk9CVVNUIGNvbW1hbmQgYW5kIHRyeSBhZ2Fpbi5cbiIgOgorICAgICAgICAgICAgICAgIiAuIEdpdmUgYSBST0JVU1QgY29tbWFuZCBhbmQgdHJ5IGFnYWluLlxuIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcHJpbnRmKCJBbHNvOlxuIik7CisgICAgICAgIHByaW50ZigiIC4gQmUgc3VyZSB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBoYXMgd3JpdGUgcGVybWlzc2lvbi5cbiIpOworICAgICAgICBwcmludGYoIiAuIFRyeSB0ZWxsaW5nIHRoZSAlcyB0byBTRVQgUFJFRklYSU5HIEFMTC5cbiIsCisgICAgICAgICAgICAgICB0b3BjbWQgPT0gWFhHRVQgPyAic2VydmVyIiA6ICJzZW5kZXIiCisgICAgICAgICAgICAgICApOworICAgICAgICBwcmludGYoIiAuIFRyeSBnaXZpbmcgYSBST0JVU1QgY29tbWFuZCB0byB0aGUgJXMuXG4iLAorICAgICAgICAgICAgICAgdG9wY21kID09IFhYR0VUID8gInNlcnZlciIgOiAic2VuZGVyIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcHJpbnRmKCIoVXNlIFNFVCBISU5UUyBPRkYgdG8gc3VwcHJlc3MgaGludHMuKVxuIik7CisgICAgICAgIHByaW50ZigiKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4iKTsKKyAgICB9CisjZW5kaWYgLyogTk9ISU5UUyAqLworICAgIGdldGNtZCA9IDA7CisgICAgc25kY21kID0gMDsKKyAgICBpbnRlcnJ1cHRlZCA9IDA7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyAgICB3aGlsZSAoc3N0YXRlID09IDApIHsgICAgICAgICAgICAgICAvKiBQYXJzZSBjbWRzIHVudGlsIGFjdGlvbiByZXF1ZXN0ZWQgKi8KKyAgICAgICAgZGVidWcoRjEwMCwicGFyc2UgdG9wIiwiIiwwKTsKKwl3aGF0ID0gV19DT01NQU5EOwkJLyogTm93IHdlJ3JlIHBhcnNpbmcgY29tbWFuZHMuICovCisJcmNkYWN0aXZlID0gMDsJCQkvKiBSRU1PVEUgQ0Qgbm90IGFjdGl2ZSAqLworCWtlZXBhbGxjaGFycyA9IDA7CQkvKiBNSU5QVVQgbm90IGFjdGl2ZSAqLworCisjaWZkZWYgT1MyCisgICAgICAgIGlmIChhcGNhY3RpdmUgPT0gQVBDX0lOQUNUSVZFKQorICAgICAgICAgIFdhaXRDb21tYW5kTW9kZVNlbSgtMSk7CisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICBpZiAoKGxvY2FsICYmCisgICAgICAgICAgICAgIXhjbWRzcmMgJiYKKyAgICAgICAgICAgICBpc190biAmJgorICAgICAgICAgICAgIFRFTE9QVF9NRShURUxPUFRfS0VSTUlUKSAmJgorICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQpIHx8CisgICAgICAgICAgICAoIWxvY2FsICYmCisgICAgICAgICAgICAgIWNtZGFkbCAmJgorICAgICAgICAgICAgIFRFTE9QVF9NRShURUxPUFRfS0VSTUlUKSAmJgorICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQpCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIHRuX3Npa3MoS0VSTUlUX1NUT1ApOworICAgICAgICB9CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCisjaWZuZGVmIE5PWEZFUgorICAgICAgICBpZiAoYXV0b3BhdGgpIHsKKyAgICAgICAgICAgIGZucnBhdGggPSBQQVRIX0FVVE87CisgICAgICAgICAgICBhdXRvcGF0aCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmVtZmlsZSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGVzZSBpbiBjYXNlIFJFTU9URSAqLworICAgICAgICByZW1hcHBkID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgd2FzIGludGVycnVwdGVkLi4uICovCisgICAgICAgIHJlbXBpcGUgPSAwOworICAgICAgICBtYWtlc3RyKCZzbmRfbW92ZSxnX3NuZF9tb3ZlKTsgIC8qIFJlc3RvcmUgdGhlc2UgKi8KKyAgICAgICAgbWFrZXN0cigmcmN2X21vdmUsZ19yY3ZfbW92ZSk7CisgICAgICAgIG1ha2VzdHIoJnNuZF9yZW5hbWUsZ19zbmRfcmVuYW1lKTsKKyAgICAgICAgbWFrZXN0cigmcmN2X3JlbmFtZSxnX3Jjdl9yZW5hbWUpOworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgICAgICB4YXNrbW9yZSA9IHNhdmVhc2s7ICAgICAgICAgICAgIC8qIFJlc3RvcmUgZ2xvYmFsIG1vcmUtcHJvbXB0aW5nICovCisgICAgICAgIGRpcmFjdGl2ZSA9IDA7CisgICAgICAgIGNkYWN0aXZlID0gMDsKKworI2lmbmRlZiBOT1NQTAorICAgICAgICBhc2tmbGFnID0gMDsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgLyogVGFrZSByZXF1ZXN0ZWQgYWN0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUgcHJldmlvdXMgY29tbWFuZCAqLworCisgICAgICAgIHNldGludCgpOworICAgICAgICBkZWJ1ZyhGMTAxLCJwYXJzZXIgdGxldmVsIiwiIix0bGV2ZWwpOworICAgICAgICBkZWJ1ZyhGMTAxLCJwYXJzZXIgY21kX3Jvd3MiLCIiLGNtZF9yb3dzKTsKKworI2lmbmRlZiBOT0xPQ0FMCisgICAgICAgIGRlYnVnKEYxMDEsInBhcnNlciB3YXNjbG9zZWQiLCIiLHdhc2Nsb3NlZCk7CisgICAgICAgIGlmICh3YXNjbG9zZWQpIHsgICAgICAgICAgICAgICAgLyogSWYgY29ubmVjdGlvbiB3YXMganVzdCBjbG9zZWQgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgIGludCBrOworICAgICAgICAgICAgayA9IG1sb29rKG1hY3RhYiwib25fY2xvc2UiLG5tYWMpOyAvKiBMb29rIHVwICJvbl9jbG9zZSIgKi8KKyAgICAgICAgICAgIGlmIChrID49IDApIHsgICAgICAgICAgICAgICAvKiBJZiBmb3VuZCwgKi8KKyAgICAgICAgICAgICAgICAvKiBwcmludGYoIk9OX0NMT1NFIENNRCBMT09QXG4iKTsgKi8KKyAgICAgICAgICAgICAgICBkb2RvKGssY2tpdG9hKHdoeWNsb3NlZCksMCk7IC8qIFNldCBpdCB1cCAqLworICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICB3aHljbG9zZWQgPSBXQ19SRU1POworICAgICAgICAgICAgd2FzY2xvc2VkID0gMDsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmbmRlZiBOT1NQTAorICAgICAgICB4eGRvdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoaXMuLi4gKi8KKworICAgICAgICBkZWJ1ZyhGMTAxLCJwYXJzZXIgc3VjY2VzcyIsIiIsc3VjY2Vzcyk7CisgICAgICAgIGlmIChzdWNjZXNzID09IDApIHsKKyAgICAgICAgICAgIGlmIChjbWRzdGtbY21kbHZsXS5zcmMgPT0gQ01EX1RGICYmIHRha2VycltjbWRsdmxdKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJDb21tYW5kIGZpbGUgdGVybWluYXRlZCBieSBlcnJvci5cbiIpOworICAgICAgICAgICAgICAgIHBvcGNsdmwoKTsKKyAgICAgICAgICAgICAgICBpZiAoY21kbHZsID09IDApIHJldHVybigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbWRzdGtbY21kbHZsXS5zcmMgPT0gQ01EX01EICYmIG1lcnJvcltjbWRsdmxdKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJDb21tYW5kIGVycm9yOiBtYWNybyB0ZXJtaW5hdGVkLlxuIik7CisgICAgICAgICAgICAgICAgcG9wY2x2bCgpOworICAgICAgICAgICAgICAgIGlmIChtICYmIChjbWRsdmwgPCBpbmxldmVsKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybigoaW50KSBzc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG51bGNtZCA9IChtID09IDIpOworICAgICAgICBkZWJ1ZyhGMTAxLCJwYXJzZXIgbnVsY21kIiwiIixudWxjbWQpOworI2Vsc2UKKyAgICAgICAgaWYgKHN1Y2Nlc3MgPT0gMCAmJiB0bGV2ZWwgPiAtMSAmJiB0YWtlcnJbdGxldmVsXSkgeworICAgICAgICAgICAgcHJpbnRmKCJDb21tYW5kIGZpbGUgdGVybWluYXRlZCBieSBlcnJvci5cbiIpOworICAgICAgICAgICAgcG9wY2x2bCgpOworICAgICAgICAgICAgY21pbmkoY2t4ZWNoKTsgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBjbWQgYnVmZmVyLiAqLworICAgICAgICAgICAgaWYgKHRsZXZlbCA8IDApICAgICAgICAgICAgIC8qIEp1c3QgcG9wcGVkIG91dCBvZiBjbWQgZmlsZXM/ICovCisgICAgICAgICAgICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgLyogRW5kIG9mIGluaXQgZmlsZSBvciB3aGF0ZXZlci4gKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBNQUMKKyAgICAgICAgLyogQ2hlY2sgZm9yIFRBS0UgaW5pdGlhdGVkIGJ5IG1lbnUuICovCisgICAgICAgIGlmICgodGxldmVsID09IC0xKSAmJiBsZmlsZXMpCisgICAgICAgICAgICBzdGFydGxmaWxlKCk7CisjZW5kaWYgLyogTUFDICovCisKKyAgICAgICAgLyogSWYgaW4gVEFLRSBmaWxlLCBjaGVjayBmb3IgRU9GICovCisjaWZuZGVmIE5PU1BMCisjaWZkZWYgTUFDCisgICAgICAgIGlmCisjZWxzZQorICAgICAgICB3aGlsZQorI2VuZGlmIC8qIE1BQyAqLworICAgICAgICAgICgoY21kc3RrW2NtZGx2bF0uc3JjID09IENNRF9URikgIC8qIElmIGVuZCBvZiB0YWtlIGZpbGUgKi8KKyAgICAgICAgICAgICAgICYmICh0bGV2ZWwgPiAtMSkKKyAgICAgICAgICAgICAgICYmIGZlb2YodGZpbGVbdGxldmVsXSkpIHsKKyAgICAgICAgICAgIHBvcGNsdmwoKTsgICAgICAgICAgICAgICAgICAvKiBwb3AgY29tbWFuZCBsZXZlbCAqLworICAgICAgICAgICAgY21pbmkoY2t4ZWNoKTsgICAgICAgICAgICAgIC8qIGFuZCBjbGVhciB0aGUgY21kIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgIGlmIChjbWRsdmwgPT0gMCkgeyAgICAgICAgICAvKiBKdXN0IHBvcHBlZCBvdXQgb2YgYWxsIGNtZCBmaWxlcz8gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAvKiBFbmQgb2YgaW5pdCBmaWxlIG9yIHdoYXRldmVyLiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisjaWZkZWYgTUFDCisgICAgICAgIG1pbmlwYXJzZXIoMSk7CisgICAgICAgIGlmIChzc3RhdGUgPT0gJ2EnKSB7ICAgICAgICAgICAgLyogaWYgY21kLS4gY2FuY2VsICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCAicGFyc2VyOiBjYW5jZWwgdGFrZSBkdWUgdG8gc3N0YXRlIiwgIiIsIHNzdGF0ZSk7CisgICAgICAgICAgICBzc3RhdGUgPSAnXDAnOworICAgICAgICAgICAgZG9zdG9wKCk7CisgICAgICAgICAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAgICAgLyogRW5kIG9mIGluaXQgZmlsZSBvciB3aGF0ZXZlci4gKi8KKyAgICAgICAgfQorI2VuZGlmIC8qICBNQUMgKi8KKworI2Vsc2UgLyogTk9TUEwgKi8KKyAgICAgICAgaWYgKCh0bGV2ZWwgPiAtMSkgJiYgZmVvZih0ZmlsZVt0bGV2ZWxdKSkgeyAvKiBJZiBlbmQgb2YgdGFrZSAqLworICAgICAgICAgICAgcG9wY2x2bCgpOyAgICAgICAgICAgICAgICAgIC8qIFBvcCB1cCBvbmUgbGV2ZWwuICovCisgICAgICAgICAgICBjbWluaShja3hlY2gpOyAgICAgICAgICAgICAgLyogYW5kIGNsZWFyIHRoZSBjbWQgYnVmZmVyLiAqLworICAgICAgICAgICAgaWYgKHRsZXZlbCA8IDApICAgICAgICAgICAgIC8qIEp1c3QgcG9wcGVkIG91dCBvZiBjbWQgZmlsZXM/ICovCisgICAgICAgICAgICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgLyogRW5kIG9mIGluaXQgZmlsZSBvciB3aGF0ZXZlci4gKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKworI2lmbmRlZiBOT1NQTAorICAgICAgICBkZWJ1ZyhGMTAxLCJwYXJzZXIgY21kbHZsIiwiIixjbWRsdmwpOworICAgICAgICBkZWJ1ZyhGMTAxLCJwYXJzZXIgY21kc3JjIiwiIixjbWRzdGtbY21kbHZsXS5zcmMpOworCisgICAgICAgIGlmIChjbWRzdGtbY21kbHZsXS5zcmMgPT0gQ01EX01EKSB7IC8qIEV4ZWN1dGluZyBhIG1hY3JvPyAqLworICAgICAgICAgICAgZGVidWcoRjEwMCwicGFyc2VyIG1hY3JvIiwiIiwwKTsKKyAgICAgICAgICAgIG1hY2x2bCA9IGNtZHN0a1tjbWRsdmxdLmx2bDsgLyogR2V0IGN1cnJlbnQgbGV2ZWwgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInBhcnNlciBtYWNsdmwiLCIiLG1hY2x2bCk7CisgICAgICAgICAgICBjYnAgPSBjbWRidWY7ICAgICAgICAgICAgICAgLyogQ29weSBuZXh0IGNtZCB0byBjb21tYW5kIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgICpjYnAgPSBOVUw7CisgICAgICAgICAgICBpZiAoKnNhdmJ1ZikgeyAgICAgICAgICAgICAgLyogSW4gY2FzZSB0aGVuLXBhcnQgb2YgJ2lmJyBjb21tYW5kICovCisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGNicCxzYXZidWYsQ01EQkwpOyAvKiB3YXMgc2F2ZWQsIHJlc3RvcmUgaXQuICovCisgICAgICAgICAgICAgICAgKnNhdmJ1ZiA9ICdcMCc7CisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRWxzZSBnZXQgbmV4dCBjbWQgZnJvbSBtYWNybyBkZWYgKi8KKyAgICAgICAgICAgICAgICBpZiAoZ2V0bmNtKGNicCxDTURCTCkgPCAwKSB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYmxvZykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwicGFyc2VyIGVuZCBvZiBtYWNybyBtIiwiIixtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsInBhcnNlciBlbmQgb2YgbWFjcm8gY21kbHZsIiwiIixjbWRsdmwpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwicGFyc2VyIGVuZCBvZiBtYWNybyBpbmxldmVsIiwiIixpbmxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIChjbWRsdmwgPCBpbmxldmVsKSkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBpZiAoIW0pICovIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKEYwMTAsIkNNRChNKSIsY21kYnVmLDApOworCisgICAgICAgIH0gZWxzZSBpZiAoY21kc3RrW2NtZGx2bF0uc3JjID09IENNRF9URikKKyNlbHNlCisgICAgICAgICAgaWYgKHRsZXZlbCA+IC0xKQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgeworI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgZGVidWcoRjExMSwicGFyc2VyIHNhdmJ1ZiIsc2F2YnVmLHRsZXZlbCk7CisgICAgICAgICAgICBpZiAoKnNhdmJ1ZikgeyAgICAgICAgICAgICAgLyogSW4gY2FzZSBUSEVOLXBhcnQgb2YgSUYgY29tbWFuZCAqLworICAgICAgICAgICAgICAgIGNrc3RybmNweShjbWRidWYsc2F2YnVmLENNREJMKTsgLyogd2FzIHNhdmVkLCByZXN0b3JlIGl0LiAqLworICAgICAgICAgICAgICAgICpzYXZidWYgPSAnXDAnOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogTk9TUEwgKi8KKworICAgICAgICAgICAgICAvKiBHZXQgbmV4dCBsaW5lIGZyb20gVEFLRSBmaWxlICovCisKKyAgICAgICAgICAgICAgaWYgKCh0ZmNvZGUgPSBnZXRuY3QoY21kYnVmLENNREJMLHRmaWxlW3RsZXZlbF0sMCkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwicGFyc2VyIHRmY29kZSIsdGZpbGVbdGxldmVsXSx0ZmNvZGUpOworICAgICAgICAgICAgICAgICAgaWYgKHRmY29kZSA8IC0xKSB7ICAgIC8qIEVycm9yICovCisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/RXJyb3IgaW4gVEFLRSBjb21tYW5kIGZpbGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGZjb2RlID09IC0yKSA/ICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaW5lIHRvbyBsb25nIG9yIGNvbnRhaW5zIE5VTCBjaGFyYWN0ZXJzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgIGRvc3RvcCgpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgIC8qIC0xIG1lYW5zIEVPRiAqLworICAgICAgICAgICAgICB9CisKKyAgICAgICAgLyogSWYgaW50ZXJhY3RpdmUsIGdldCBuZXh0IGNvbW1hbmQgZnJvbSB1c2VyLiAqLworCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlciB0eXBlcyBpdCBpbi4gKi8KKyAgICAgICAgICAgIGlmIChwZmxhZykgcHJvbXB0KHh4c3RyaW5nKTsKKyAgICAgICAgICAgIGNtaW5pKGNreGVjaCk7CisgICAgICAgIH0KKworICAgIC8qIE5vdyB3ZSBrbm93IHdoZXJlIG5leHQgY29tbWFuZCBpcyBjb21pbmcgZnJvbS4gUGFyc2UgYW5kIGV4ZWN1dGUgaXQuICovCisKKyAgICAgICAgcmVwYXJzID0gMTsgICAgICAgICAgICAgICAgICAgICAvKiAxID0gY29tbWFuZCBuZWVkcyBwYXJzaW5nICovCisjaWZuZGVmIE5PWEZFUgorICAgICAgICBkaXNwbGEgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIEFzc3VtZSBubyBmaWxlIHRyYW5zZmVyIGRpc3BsYXkgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworICAgICAgICB3aGlsZSAocmVwYXJzKSB7ICAgICAgICAgICAgICAgIC8qIFBhcnNlIHRoaXMgY21kIHVudGlsIGVudGVyZWQuICovCisKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInBhcnNlciB0b3Agb2Ygd2hpbGUgbG9vcCIsIiIsMCk7CisKKyNpZmRlZiBSRUNVUlNJVkUKKyAgICAgICAgICAgIC8qIEluIGNhc2Ugb2YgInNlbmQgL3JlY3Vyc2l2ZSAuLz88Q3RybC1VPiIgZXRjICovCisgICAgICAgICAgICByZWN1cnNpdmUgPSAwOyAgICAgICAgICAgICAgLyogVGhpcyBpcyBuZXZlciBzdGlja3kgKi8KKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICAgICAgICAgIHhmaWxldHlwZSA9IC0xOyAgICAgICAgICAgICAvKiBSZXNldCB0aGlzIGJldHdlZW4gZWFjaCBjb21tYW5kICovCisjaWZuZGVmIE5PTVNFTkQKKyAgICAgICAgICAgIGFkZGxpc3QgPSAwOworI2VuZGlmIC8qIE5PTVNFTkQgKi8KKyNpZmRlZiBDS19SRUNBTEwKKyAgICAgICAgICAgIG9uX3JlY2FsbCA9IDE7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisgICAgICAgICAgICAvKiBUaGlzIG1pZ2h0IGhhdmUgYmVlbiBjaGFuZ2VkIGJ5IGEgc3dpdGNoICovCisgICAgICAgICAgICBpZiAoZ19tYXRjaGRvdCA+IC0xKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hkb3QgPSBnX21hdGNoZG90OworICAgICAgICAgICAgICAgIGdfbWF0Y2hkb3QgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtcmVzKCk7ICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBidWZmZXIgcG9pbnRlcnMuICovCisKKyNpZmRlZiBPUzIKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAvKiB3ZSBjaGVjayB0byBzZWUgaWYgYSBtYWNybyBpcyB3YWl0aW5nIHRvIGJlIGV4ZWN1dGVkICovCisgICAgICAgICAgICAvKiBpZiBzbywgd2UgY2FsbCBkb21hYyBvbiBpdCAqLworICAgICAgICAgICAgaWYgKGNtZG1hYykgeworICAgICAgICAgICAgICAgIGNrc3RybmNweShjbWRidWYsIGNtZG1hYywgQ01EQkwpOworICAgICAgICAgICAgICAgIGZyZWUoY21kbWFjKTsKKyAgICAgICAgICAgICAgICBjbWRtYWMgPSBOVUxMOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNpZm5kZWYgTk9YRkVSCisgICAgICAgICAgICBieWVfYWN0aXZlID0gMDsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICAgICAgICAgIGhhdmV0b2tlbiA9IDA7CisgICAgICAgICAgICB4eCA9IGNta2V5MihjbWR0YWIsbmNtZCwiQ29tbWFuZCIsIiIsdG9rdGFiLHh4c3RyaW5nLDEpOworICAgICAgICAgICAgZGVidWcoRjEwMSwidG9wLWxldmVsIGNta2V5MiIsIiIseHgpOworICAgICAgICAgICAgaWYgKHh4ID09IC01KSB7CisgICAgICAgICAgICAgICAgeXkgPSBjaGt0b2sodG9rdGFiKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ0b3AtbGV2ZWwgY21rZXkgdG9rZW4iLCIiLHl5KTsKKyNpZm5kZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgIC8qIEVpdGhlciB3YXkgbWFrZXMgYWJzb2x1dGVseSBubyBkaWZmZXJlbmNlICovCisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiTk8gVU5HV09SRCIsYXRtYnVmLDApOworICAgICAgICAgICAgICAgIC8qIHVuZ3dvcmQoKTsgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiVE9LRU4gVU5HV09SRCIsYXRtYnVmLDApOworICAgICAgICAgICAgICAgIHVuZ3dvcmQoKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgc3dpdGNoICh5eSkgeworICAgICAgICAgICAgICAgICAgY2FzZSAnIyc6IHh4ID0gWFhDT007IGJyZWFrOyAvKiBDb21tZW50ICovCisgICAgICAgICAgICAgICAgICBjYXNlICc7JzogeHggPSBYWENPTTsgYnJlYWs7IC8qIENvbW1lbnQgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICAgIGNhc2UgJy4nOiB4eCA9IFhYREVGOyB4eGRvdCA9IDE7IGJyZWFrOyAvKiBBc3NpZ25tZW50ICovCisgICAgICAgICAgICAgICAgICBjYXNlICc6JzogeHggPSBYWExCTDsgYnJlYWs7IC8qIEdPVE8gbGFiZWwgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PUFVTSAorI2lmZGVmIENLX1JFRElSCisgICAgICAgICAgICAgICAgICBjYXNlICc8JzoKKyNlbmRpZiAvKiBDS19SRURJUiAqLworICAgICAgICAgICAgICAgICAgY2FzZSAnQCc6CisgICAgICAgICAgICAgICAgICBjYXNlICchJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vcHVzaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqczsgaW50IHg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHggPSBjbXR4dCgiVGV4dCB0byBiZSBpZ25vcmVkIiwiIiwmcyxOVUxMKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHh4ID0gWFhDT007CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goeXkpIHsKKyNpZmRlZiBDS19SRURJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc8JzogeHggPSBYWEZVTjsgYnJlYWs7IC8qIFJFRElSRUNUICovCisjZW5kaWYgLyogQ0tfUkVESVIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyEnOiB4eCA9IFhYU0hFOyBicmVhazsgLyogU2hlbGwgZXNjYXBlICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTk9QVVNIICovCisjaWZkZWYgQ0tfUkVDQUxMCisgICAgICAgICAgICAgICAgICBjYXNlICdeJzogeHggPSBYWFJFRE87ICBicmVhazsKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOiB4eCA9IFhYTUFDUk87IGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAnKCc6IHh4ID0gWFhTRVhQOyAgYnJlYWs7CisjZW5kaWYgLyogTk9TUEwgKi8KKworICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFxdWlldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbj9JbnZhbGlkIC0gXCIlc1wiXG4iLGNtZGJ1Zik7CisjaWZkZWYgQ09NTUVOVAorI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hY2x2bCA+IC0xICYmIHhjbWRzcmMgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJNYWNybzogJXM7ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FyZ1ttYWNsdmxdWzBdID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXJnW21hY2x2bF1bMF0gOiAiIik7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bGV2ZWwgPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ29tbWFuZCBmaWxlOiAlcywgbGluZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZuYW1bdGxldmVsXSA/IHRmbmFtW3RsZXZlbF0gOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaW5lW3RsZXZlbF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGNtZHNyYyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkNvbW1hbmQgc3RhY2s6XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9zdGFjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHh4ID0gLTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhhdmV0b2tlbiA9IDE7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiSEFWRSBUT0tFTiIsIiIseHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHh4ID4gLTEpIHsKKyAgICAgICAgICAgICAgICB0b3BjbWQgPSB4eDsgICAgICAgICAgICAvKiBUb3AtbGV2ZWwgY29tbWFuZCBpbmRleCAqLworI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgICAgIGlmIChtYWNsdmwgPiAtMSkKKyAgICAgICAgICAgICAgICAgIGxhc3RjbWRbbWFjbHZsXSA9IHh4OworI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwidG9wY21kIiwiIix0b3BjbWQpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImNtZmxncyIsIiIsY21mbGdzKTsKKyAgICAgICAgICAgIH0KKworI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgSUYuLkVMU0UgKi8KKworICAgICAgICAgICAgZGVidWcoRjEwMSwiY21kbHZsIiwiIixjbWRsdmwpOworICAgICAgICAgICAgZGVidWcoRjEwMSwiaWZjbWRbY21kbHZsXSIsIiIsaWZjbWRbY21kbHZsXSk7CisKKyAgICAgICAgICAgIGlmIChpZmNtZFtjbWRsdmxdKSAgICAgICAgICAvKiBDb3VudCBzdG10cyBhZnRlciBJRiAqLworICAgICAgICAgICAgICBpZmNtZFtjbWRsdmxdKys7CisgICAgICAgICAgICBpZiAoaWZjbWRbY21kbHZsXSA+IDIgJiYgeHggIT0gWFhFTFMgJiYgeHggIT0gWFhDT00pCisgICAgICAgICAgICAgIGlmY21kW2NtZGx2bF0gPSAwOworCisgICAgICAgICAgICAvKiBFeGVjdXRlIHRoZSBjb21tYW5kIGFuZCB0YWtlIGFjdGlvbiBiYXNlZCBvbiByZXR1cm4gY29kZS4gKi8KKworICAgICAgICAgICAgaWYgKG51bGNtZCkgeyAgICAgICAgICAgICAgIC8qIElnbm9yaW5nIHRoaXMgY29tbWFuZD8gKi8KKyAgICAgICAgICAgICAgICB4eCA9IFhYQ09NOyAgICAgICAgICAgICAvKiBNYWtlIHRoaXMgY29tbWFuZCBhIGNvbW1lbnQuICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbnN1Y2Nlc3MgPSAxOyAgICAgICAgICAgICAgLyogRm9yIGNhdGNoaW5nIFxmdW5jdGlvbigpIGVycm9ycyAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImNhbGxpbmcgZG9jbWQoKSIsIiIseHgpOworICAgICAgICAgICAgenogPSBkb2NtZCh4eCk7ICAgICAgICAgICAgIC8qIFBhcnNlIHJlc3Qgb2YgY29tbWFuZCAmIGV4ZWN1dGUuICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgIGlmIChmbmVycm9yICYmICFmbnN1Y2Nlc3MpCisgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwOworI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkb2NtZCByZXR1cm5zIiwiIix6eik7CisgICAgICAgICAgICAvKiBkZWJ1ZyhGMDExLCJjbWRidWYiLGNtZGJ1ZiwzMCk7ICovCisgICAgICAgICAgICAvKiBkZWJ1ZyhGMDExLCJhdG1idWYiLGF0bWJ1ZiwzMCk7ICovCisjaWZkZWYgTUFDCisgICAgICAgICAgICBpZiAodGxldmVsID4gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3N0YXRlID09ICdhJykgeyAgICAvKiBpZiBjbWQtLiBjYW5jZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwgInBhcnNlcjogY2FuY2VsIHRha2UsIHNzdGF0ZToiLCAiYSIsIDApOworICAgICAgICAgICAgICAgICAgICBzc3RhdGUgPSAnXDAnOworICAgICAgICAgICAgICAgICAgICBkb3N0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOyAgICAgICAgICAvKiBFbmQgb2YgaW5pdCBmaWxlIG9yIHdoYXRldmVyLiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBNQUMgKi8KKyAgICAgICAgICAgIHN3aXRjaCAoenopIHsKKyAgICAgICAgICAgICAgY2FzZSAtNDogICAgICAgICAgICAgICAgICAvKiBFT0YgKGUuZy4gb24gcmVkaXJlY3RlZCBzdGRpbikgKi8KKyAgICAgICAgICAgICAgICBkb2V4aXQoR09PRF9FWElULHhpdHN0YSk7IC8qIC4uLmV4aXQgc3VjY2Vzc2Z1bGx5ICovCisgICAgICAgICAgICAgIGNhc2UgLTE6ICAgICAgICAgICAgICAgICAgLyogUmVwYXJzZSBuZWVkZWQgKi8KKyAgICAgICAgICAgICAgICByZXBhcnMgPSAxOyAgICAgICAgICAgICAvKiBKdXN0IHNldCByZXBhcnNlIGZsYWcgYW5kLi4uICovCisgICAgICAgICAgICAgICAgY29udGludWU7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgIGNhc2UgLTc6ICAgICAgICAgICAgICAgICAgLyogVGhleSB0eXBlZCBhIGRpc2sgbGV0dGVyICovCisgICAgICAgICAgICAgICAgaWYgKCF6Y2hkaXIoKGNoYXIgKiljbWRidWYpKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcnJvcigoY2hhciAqKWNtZGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSBzdWNjZXNzID0gMTsKKyAgICAgICAgICAgICAgICByZXBhcnMgPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgIGNhc2UgLTY6ICAgICAgICAgICAgICAgICAgLyogSW52YWxpZCBjb21tYW5kIGdpdmVuIHcvbm8gYXJncyAqLworICAgICAgICAgICAgICBjYXNlIC0yOiAgICAgICAgICAgICAgICAgIC8qIEludmFsaWQgY29tbWFuZCBnaXZlbiB3L2FyZ3MgKi8KKyNpZmRlZiBDT01NRU5UCisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgZ29pbmcgdG8gYmUgcmVhbGx5IHVnbHkuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgeXkgPSBtbG9vayhtYWN0YWIsYXRtYnVmLG5tYWMpOyAvKiBMb29rIGluIG1hY3JvIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgIGlmICh5eSA+IC0xKSB7ICAgICAgICAgICAgICAgICAgLyogSWYgaXQncyB0aGVyZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHp6ID09IC0yKSB7ICAgICAgICAgICAgIC8qIGluc2VydCAiZG8iICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAgPSBtYWxsb2MoKGludClzdHJsZW4oY21kYnVmKSArIDUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/bWFsbG9jIGVycm9yIDFcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1wLCJkbyAlcyAiLGNtZGJ1Zik7IC8qIFNBRkUgKGNoZWNrZWQpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGNtZGJ1ZixtcCxDTURCTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChpbnQpc3RybGVuKGF0bWJ1ZikgKyA1KSA8IENNREJMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihjbWRidWYsImRvICVzICVjIixhdG1idWYsIENSKTsgLyogU0FGRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShjbWRidWYsImVjaG8gP1RvbyBsb25nXHIiLENNREJMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZmNtZFtjbWRsdmxdID09IDIpIC8qIFRoaXMgb25lIGRvZXNuJ3QgY291bnQhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmY21kW2NtZGx2bF0tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInN0dWZmIGNtZGJ1ZiIsY21kYnVmLHp6KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGFycyA9IDE7ICAgICAvKiBHbyBmb3IgcmVwYXJzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gY21kYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgbHAgPSBsaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgbiA9IExJTkJVRlNJWjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbWZsZ3MgPT0gMCkgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHp6c3RyaW5nKHAsJmxwLCZuKSA+IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9JbnZhbGlkOiAlc1xuIixsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/SW52YWxpZDogJXNcbiIsY21kYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfSAvKiAoZmFsbCB0aHJ1Li4uKSAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/SW52YWxpZDogJXNcbiIsY21kYnVmKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworI2Vsc2UgLyogTm90IENPTU1FTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/SW52YWxpZDogJXNcbiIsY21kYnVmKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAgICAgICAgICAgICBjYXNlIC05OiAgICAgICAgICAgICAgICAvKiBCYWQsIGVycm9yIG1lc3NhZ2UgYWxyZWFkeSBkb25lICovCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ0b3AtbGV2ZWwgY21rZXkgZmFpbGVkIixjbWRidWYsMCk7CisgICAgICAgICAgICAgICAgICAgIC8qIElmIGluIGJhY2tncm91bmQgdy8gY29tbWFuZHMgY29taW5nIHN0ZGluLCB0ZXJtaW5hdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBmbGFnID09IDAgJiYgdGxldmVsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICBmYXRhbCgiS2VybWl0IGNvbW1hbmQgZXJyb3IgaW4gYmFja2dyb3VuZCBleGVjdXRpb24iKTsKKy8qCisgIENvbW1hbmQgcmV0cnkgZmVhdHVyZSwgZWRpdCAxOTAuICBJZiB3ZSdyZSBhdCBpbnRlcmFjdGl2ZSBwcm9tcHRpbmcgbGV2ZWwsCisgIHJlcHJvbXB0IHRoZSB1c2VyIHdpdGggYXMgbXVjaCBvZiB0aGUgY29tbWFuZCBhcyBkaWRuJ3QgZmFpbC4KKyovCisjaWZkZWYgQ0tfUkVDQUxMCisgICAgICAgICAgICAgICAgICAgIGlmIChjbV9yZXRyeSAmJiAheGNtZHNyYykgeyAvKiBJZiBhdCB0b3AgbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwLCAqczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihjbWRidWYpOyAvKiBMZW5ndGggb2YgY29tbWFuZCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBtYWxsb2MobGVuICsgMSk7ICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgY29weSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHApIHsgICAgICAgICAgICAgIC8qIElmIHdlIGdvdCB0aGUgc3BhY2UgY29weSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShwLGNtZGJ1Zik7IC8qIHRoZSBjb21tYW5kIGJ1ZmZlciAoU0FGRSkuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hvcCBvZmYgZmluYWwgZmllbGQsIHRoZSBvbmUgdGhhdCBmYWlsZWQuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHAgKyBsZW4gLSAxOyAgICAgICAgICAvKiBQb2ludCB0byBlbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKnMgPT0gU1AgJiYgcyA+IHApIC8qIFRyaW0gYmxhbmtzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpzICE9IFNQICYmIHMgPiBwKSAvKiBUcmltIGxhc3QgZmllbGQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA+IHApICAgICAgICAvKiBLZWVwIHRoZSBzcGFjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcysrOyAgICAgICAgICAgIC8qIGFmdGVyIGxhc3QgZ29vZCBmaWVsZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID49IHApICAgICAgIC8qIEN1dCBvZmYgcmVtYWluZGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcyA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWluaShja3hlY2gpOyAgICAvKiBSZWluaXRpYWxpemUgdGhlIHBhcnNlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShjbWRidWYscCxDTURCTCk7IC8qIENvcHkgcmVzdWx0IGJhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHApOyAgICAgICAgICAvKiBGcmVlIHRlbXBvcmFyeSBzdG9yYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbXB0KHh4c3RyaW5nKTsgLyogUmVwcmludCB0aGUgcHJvbXB0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyIsY21kYnVmKTsgLyogUmVwcmludCBwYXJ0aWFsIGNvbW1hbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBhcnMgPSAxOyAgICAgICAgICAvKiBGb3JjZSByZXBhcnNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworICAgICAgICAgICAgICAgICAgICAgIGlmICghcXVpZXQpIHsKKyNpZmRlZiBDT01NRU5UCisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYWNsdmwgPiAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIk1hY3JvOiAlczsgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hcmdbbWFjbHZsXVswXSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXJnW21hY2x2bF1bMF0gOiAiIik7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRsZXZlbCA+IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ29tbWFuZCBmaWxlOiAlcywgbGluZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZuYW1bdGxldmVsXSA/IHRmbmFtW3RsZXZlbF0gOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaW5lW3RsZXZlbF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4Y21kc3JjID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJDb21tYW5kIHN0YWNrOlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9zdGFjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBjbWluaShja3hlY2gpOyAgICAvKiAoZmFsbCB0aHJ1KSAqLworCisgICAgICAgICAgICAgICAgY2FzZSAtMzogICAgICAgICAgICAgICAgLyogRW1wdHkgY29tbWFuZCBPSyBhdCB0b3AgbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVwYXJzID0gMDsgICAgICAgICAvKiBEb24ndCBuZWVkIHRvIHJlcGFyc2UuICovCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLyogR28gYmFjayBhbmQgZ2V0IGFub3RoZXIgY29tbWFuZC4gKi8KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgd2FzIHN1Y2Nlc3NmdWwuICovCisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsInBhcnNlciBwcmVwYXJpbmcgdG8gY29udGludWUiLCIiLG1hY2x2bCk7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwicGFyc2VyIHN1Y2Nlc3MiLCIiLHN1Y2Nlc3MpOworICAgICAgICAgICAgICAgICAgICByZXBhcnMgPSAwOyAgICAgICAgIC8qIERvbid0IG5lZWQgdG8gcmVwYXJzZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAvKiBHbyBiYWNrIGFuZCBnZXQgYW5vdGhlciBjb21tYW5kLiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmbmRlZiBOT1NQTAorICAgICAgICBkZWJ1ZyhGMTAxLCJwYXJzZXIgYnJlYWtzIG91dCBvZiB3aGlsZSBsb29wIiwiIixtYWNsdmwpOworICAgICAgICBpZiAobSAmJiAoY21kbHZsIDwgaW5sZXZlbCkpICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIH0KKworLyogR290IGFuIGFjdGlvbiBjb21tYW5kLCByZXR1cm4gc3RhcnQgc3RhdGUuICovCisKKyAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKK30KKworI2lmbmRlZiBOT1NQTAorLyoKKyAgT1VUUFVUIGNvbW1hbmQuCisgIEJ1ZmZlcmluZyBhbmQgcGFjaW5nIGFkZGVkIGJ5IEwuSS4gS2lyYnksIDVBKDE4OSksIEp1bmUgMTk5My4KKyovCisjZGVmaW5lIE9CU0laRSA4MCAgICAgICAgICAgICAgICAgICAgICAgLyogU2l6ZSBvZiBsb2NhbCBjaGFyYWN0ZXIgYnVmZmVyICovCisKK3N0YXRpYyBpbnQgb2JuOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgb2Zmc2V0IChoaWdoIHdhdGVyIG1hcmspICovCitzdGF0aWMgY2hhciBvYnVmW09CU0laRSsxXTsgICAgICAgICAgICAgLyogT1VUUFVUIGJ1ZmZlci4gKi8KK3N0YXRpYyBjaGFyICpvYnA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG91dHB1dCBidWZmZXIuICovCitfUFJPVE9UWVAoIHN0YXRpYyBpbnQgb2JvYywgKGNoYXIpICk7CitfUFJPVE9UWVAoIHN0YXRpYyBpbnQgeHhvdXQsIChjaGFyICosIGludCkgKTsKKworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCit4eG91dChjaGFyICpvYnVmLCBpbnQgb2JzaXplKQorI2Vsc2UKK3h4b3V0KG9idWYsIG9ic2l6ZSkgY2hhciAqb2J1ZjsgaW50IG9ic2l6ZTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogeHhvdXQgKi8geyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9VVFBVVCBjb21tYW5kJ3Mgb3V0cHV0IGZ1bmN0aW9uICovCisgICAgaW50IGksIHJjOworCisgICAgZGVidWcoRjEwMSwieHhvdXQgb2JzaXplIiwiIixvYnNpemUpOworICAgIGRlYnVnKEYxMDEsInh4b3V0IHBhY2luZyIsIiIscGFjaW5nKTsKKyAgICBkZWJ1ZyhGMTExLCJ4eG91dCBzdHJpbmciLG9idWYsc3RybGVuKG9idWYpKTsKKworICAgIHJjID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWwgcmV0dXJuIGNvZGUuICovCisgICAgaWYgKCFvYnVmIHx8IChvYnNpemUgPD0gMCkpICAgICAgICAgLyogTm90aGluZyB0byBvdXRwdXQuICovCisgICAgICBnb3RvIHh4b3V0X3g7ICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIHN1Y2Nlc3NmdWxseSAqLworCisgICAgcmMgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3cgYXNzdW1lIGZhaWx1cmUgKi8KKyAgICBpZiAocGFjaW5nID09IDApIHsgICAgICAgICAgICAgICAgICAgIC8qIElzIHBhY2luZyBlbmFibGVkPyAqLworICAgICAgICBpZiAoKGxvY2FsID8gICAgICAgICAgICAgICAgICAgICAgLyogTm8sIHdyaXRlIGVudGlyZSBzdHJpbmcgYXQgb25jZSAqLworICAgICAgICAgICAgIHR0b2woKENIQVIgKilvYnVmLCBvYnNpemUpIDogLyogdG8gY29tbXVuaWNhdGlvbnMgZGV2aWNlICovCisgICAgICAgICAgICAgY29ueG8ob2JzaXplLCBvYnVmKSkgICAgICAgICAvKiBvciB0byBjb25zb2xlICovCisgICAgICAgICAgICAhPSBvYnNpemUpCisgICAgICAgICAgZ290byB4eG91dF94OworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYnNpemU7IGkrKykgeyAgLyogV3JpdGUgaW5kaXZpZHVhbCBjaGFycyAqLworICAgICAgICAgICAgaWYgKChsb2NhbCA/IHR0b2Mob2J1ZltpXSkgOiBjb25vYyhvYnVmW2ldKSkgPCAwKQorICAgICAgICAgICAgICBnb3RvIHh4b3V0X3g7CisgICAgICAgICAgICBtc2xlZXAocGFjaW5nKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZHVwbGV4KSB7CisjaWZkZWYgT1MyCisgICAgICAgIGlmIChpbmVjaG8gJiYgbG9jYWwpIHsKKyNpZm5kZWYgTk9MT0NBTAorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9ic2l6ZTsgaSsrKSB7IC8qIFdyaXRlIHRvIGVtdWxhdG9yICovCisgICAgICAgICAgICAgICAgc2NyaXB0d3J0YnVmKChVU0hPUlQpb2J1ZltpXSk7IC8qIHdoaWNoIGFsc28gbG9ncyBzZXNzaW9uICovCisgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgICAgICAgICAgY29ueG8ob2JzaXplLG9idWYpOworICAgICAgICB9IGVsc2UgaWYgKHNlc2xvZykgeyAgICAgICAgICAgIC8qIG9yIGxvZyBzZXNzaW9uIGhlcmUgKi8KKyAgICAgICAgICAgIGxvZ3N0cigoY2hhciAqKSBvYnVmLCBvYnNpemUpOworICAgICAgICB9CisjZWxzZSAvKiBPUzIgKi8KKyAgICAgICAgaWYgKHNlc2xvZykgeworICAgICAgICAgICAgbG9nc3RyKChjaGFyICopIG9idWYsIG9ic2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluZWNobyAmJiBsb2NhbCkgeworICAgICAgICAgICAgY29ueG8ob2JzaXplLG9idWYpOworICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisgICAgfQorICAgIHJjID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3MgKi8KKyAgeHhvdXRfeDoKKyAgICBvYm4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBjb3VudCAqLworICAgIG9icCA9IG9idWY7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBwb2ludGVycyAqLworICAgIHJldHVybihyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBvdXIgcmV0dXJuIGNvZGUgKi8KK30KKworI2lmZGVmIENPTU1FTlQKKy8qCisgIE1hY3JvcyBmb3IgT1VUUFVUIGNvbW1hbmQgZXhlY3V0aW9uLCB0byBtYWtlIGl0IGdvIGZhc3Rlci4KKyovCisjZGVmaW5lIG9iZmxzKCkgKCh4eG91dChvYnVmLG9ibik8MCk/LTE6MCkKKyNkZWZpbmUgb2JvYyhjKSAoKCpvYnArKz0oY2hhcikoYykpLCpvYnA9MCwoKCgrK29ibik+PU9CU0laRSk/b2JmbHMoKTowKSkKKworI2Vsc2UgLyogVGhlIG1hY3JvcyBjYXVzZSBzb21lIGNvbXBpbGVycyB0byBnZW5lcmF0ZSBiYWQgY29kZS4gKi8KKworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCitvYm9jKGNoYXIgYykKKyNlbHNlCitvYm9jKGMpIGNoYXIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogb2JvYyAqLyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9VVFBVVCBjb21tYW5kJ3Mgb3V0cHV0IGZ1bmN0aW9uICovCisKKyAgICAqb2JwKysgPSBjOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXBvc2l0IGNoYXJhY3RlciAqLworICAgICpvYnAgPSBOVUw7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsdXNoIGJ1ZmZlciBpZiBpdCdzIG5vdyBmdWxsICovCisKKyAgICByZXR1cm4oKCgrK29ibikgPj0gT0JTSVpFKSA/IHh4b3V0KG9idWYsb2JuKSA6IDApOworfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworLyogIFJvdXRpbmVzIGZvciBoYW5kbGluZyBsb2NhbCB2YXJpYWJsZXMgLS0gYWxzbyBzZWUgcG9wY2x2bCgpLiAgKi8KKworVk9JRAorZnJlZWxvY2FsKG0pIGludCBtOyB7ICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgbG9jYWwgdmFyaWFibGVzICovCisgICAgc3RydWN0IGxvY2FsdmFyICogdiwgKiB0djsgICAgICAgICAgLyogYXQgbWFjcm8gbGV2ZWwgbS4uLiAqLworICAgIGRlYnVnKEYxMDEsImZyZWVsb2NhbCBsZXZlbCIsIiIsbSk7CisgICAgaWYgKG0gPCAwKSByZXR1cm47CisgICAgdiA9IGxvY2FsaGVhZFttXTsgICAgICAgICAgICAgICAgICAgLyogTGlzdCBoZWFkIGZvciBsZXZlbCBtICovCisgICAgd2hpbGUgKHYpIHsKKyAgICAgICAgaWYgKHYtPmx2X25hbWUpICAgICAgICAgICAgICAgICAvKiBWYXJpYWJsZSBuYW1lICovCisgICAgICAgICAgZnJlZSh2LT5sdl9uYW1lKTsKKyAgICAgICAgaWYgKHYtPmx2X3ZhbHVlKSAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgIGZyZWUodi0+bHZfdmFsdWUpOworICAgICAgICB0diA9IHY7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgcG9pbnRlciB0byB0aGlzIG5vZGUgKi8KKyAgICAgICAgdiA9IHYtPmx2X25leHQ7ICAgICAgICAgICAgICAgICAvKiBHZXQgbmV4dCBvbmUgKi8KKyAgICAgICAgaWYgKHR2KSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIHRoaXMgb25lICovCisgICAgICAgICAgZnJlZSgoY2hhciAqKXR2KTsKKyAgICB9CisgICAgbG9jYWxoZWFkW21dID0gKHN0cnVjdCBsb2NhbHZhciAqKSBOVUxMOyAvKiBEb25lLCBzZXQgbGlzdCBoZWFkIHRvIE5VTEwgKi8KK30KKworI2RlZmluZSBNQVhMT0NBTFZBUiA2NAorCisvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIGEgdXNlci1kZWZpbmVkIHZhcmlhYmxlICovCisKK3N0YXRpYyBjaGFyICoKK3ZhcmRlZihzLGlzYXJyYXkseDEseDIpIGNoYXIgKiBzOyBpbnQgKiBpc2FycmF5LCAqIHgxLCAqIHgyOyB7CisgICAgY2hhciAqIHA7CisgICAgY2hhciBjOworICAgICppc2FycmF5ID0gMDsKKyAgICBpZiAoIXMpIHJldHVybihOVUxMKTsKKyAgICBpZiAoISpzKSByZXR1cm4oTlVMTCk7CisgICAgcCA9IHM7CisgICAgaWYgKCpzID09IENNRFEpIHsKKyAgICAgICAgcCsrOworICAgICAgICBpZiAoISpwKQorICAgICAgICAgIHJldHVybihOVUxMKTsKKyAgICAgICAgaWYgKChjID0gKnApID09ICclJykgeyAgICAgICAgICAvKiBTY2FsYXIgdmFyaWFibGUuICovCisgICAgICAgICAgICBjID0gKisrcDsgICAgICAgICAgICAgICAgICAgLyogR2V0IElEIGNoYXJhY3Rlci4gKi8KKyAgICAgICAgICAgIHAgPSAiIjsgICAgICAgICAgICAgICAgICAgICAvKiBBc3N1bWUgZGVmaW5pdGlvbiBpcyBlbXB0eSAqLworICAgICAgICAgICAgaWYgKCFjKQorICAgICAgICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsgLyogRGlnaXQgZm9yIG1hY3JvIGFyZyAqLworICAgICAgICAgICAgICAgIGlmIChtYWNsdmwgPCAwKSAgICAgICAgIC8qIERpZ2l0IHZhcmlhYmxlcyBhcmUgZ2xvYmFsICovCisgICAgICAgICAgICAgICAgICByZXR1cm4oZ192YXJbY10pOyAgICAgLyogaWYgbm8gbWFjcm8gaXMgYWN0aXZlICovCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlICovCisgICAgICAgICAgICAgICAgICByZXR1cm4obV9hcmdbbWFjbHZsXVtjIC0gJzAnXSk7IC8qIHRoZXkncmUgb24gdGhlIHN0YWNrICovCisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzYWxwaGEoYykpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXN1cHBlcihjKSkgYyAtPSAoJ2EnLSdBJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuKGdfdmFyW2NdKTsgICAgICAgICAgIC8qIExldHRlciBmb3IgZ2xvYmFsIHZhcmlhYmxlICovCisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyYnKSB7ICAgICAgICAgIC8qIEFycmF5IHJlZmVyZW5jZS4gKi8KKyAgICAgICAgICAgIGludCB4LCB2YmksIGQ7CisgICAgICAgICAgICB4ID0gYXJyYXluYW0ocCwmdmJpLCZkKTsgICAgLyogR2V0IG5hbWUgYW5kIHN1YnNjcmlwdCAqLworICAgICAgICAgICAgaWYgKHggPiAtMSB8fCBkID09IC0xNykgeworICAgICAgICAgICAgICAgICppc2FycmF5ID0gMTsKKyAgICAgICAgICAgICAgICAqeDEgPSB2Ymk7CisgICAgICAgICAgICAgICAgKngyID0gKGQgPT0gLTE3KSA/IDAgOiBkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgICAgICAgICBpZiAoY2hrYXJyYXkodmJpLGQpID4gMCkgeyAgLyogQXJyYXkgaXMgZGVjbGFyZWQ/ICovCisgICAgICAgICAgICAgICAgdmJpIC09IEFSUkFZQkFTRTsgICAgICAgLyogQ29udmVydCBuYW1lIHRvIGluZGV4ICovCisgICAgICAgICAgICAgICAgaWYgKGFfZGltW3ZiaV0gPj0gZCkgeyAgLyogSWYgc3Vic2NyaXB0IGluIHJhbmdlICovCisgICAgICAgICAgICAgICAgICAgIGNoYXIgKiphcDsKKyAgICAgICAgICAgICAgICAgICAgYXAgPSBhX3B0clt2YmldOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oKGFwKSA/IGFwW2RdIDogTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgazsKKyAgICAgICAgayA9IG14bG9vayhtYWN0YWIscyxubWFjKTsKKyAgICAgICAgcmV0dXJuKChrID4gLTEpID8gbWFjdGFiW2tdLm12YWwgOiBOVUxMKTsKKyAgICB9Cit9CisKKworaW50CithZGRsb2NhbChwKSBjaGFyICogcDsgeworICAgIGludCB4LCB6LCBpc2FycmF5ID0gMDsKKyAgICBjaGFyICogczsKKyAgICBzdHJ1Y3QgbG9jYWx2YXIgKiB2LCAqcHJldiA9IChzdHJ1Y3QgbG9jYWx2YXIgKilOVUxMOworICAgIGV4dGVybiBpbnQgdHJhX2FzZzsgaW50IHRyYV90bXA7CisKKyAgICB0cmFfdG1wID0gdHJhX2FzZzsKKworICAgIHMgPSB2YXJkZWYocCwmaXNhcnJheSwmeCwmeik7ICAgICAgIC8qIEdldCBkZWZpbml0aW9uIG9mIHZhcmlhYmxlICovCisgICAgaWYgKGlzYXJyYXkpIHsgICAgICAgICAgICAgICAgICAgICAgLyogQXJyYXlzIGFyZSBoYW5kbGVkIHNwZWNpYWxseSAqLworICAgICAgICBwdXNoYXJyYXkoeCx6KTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICBpZiAoKHYgPSBsb2NhbGhlYWRbY21kbHZsXSkpIHsgICAgICAvKiBBbHJlYWR5IGhhdmUgc29tZSBhdCB0aGlzIGxldmVsPyAqLworICAgICAgICB3aGlsZSAodikgeyAgICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgZW5kIG9mIGxpc3QgKi8KKyAgICAgICAgICAgIHByZXYgPSB2OworICAgICAgICAgICAgdiA9IHYtPmx2X25leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgdiA9IChzdHJ1Y3QgbG9jYWx2YXIgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9jYWx2YXIpKTsKKyAgICBpZiAoIXYpIHsKKyAgICAgICAgcHJpbnRmKCI/RmFpbHVyZSB0byBhbGxvY2F0ZSBzdG9yYWdlIGZvciBsb2NhbCB2YXJpYWJsZXMiKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKCFsb2NhbGhlYWRbY21kbHZsXSkgICAgICAgICAgICAgLyogSWYgZmlyc3QsIHNldCBsaXN0IGhlYWQgKi8KKyAgICAgIGxvY2FsaGVhZFtjbWRsdmxdID0gdjsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdGhlcndpc2UgbGluayBwcmV2aW91cyB0byB0aGlzICovCisgICAgICBwcmV2LT5sdl9uZXh0ID0gdjsKKyAgICBwcmV2ID0gdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbmQgbWFrZSB0aGlzIHByZXZpb3VzICovCisgICAgdi0+bHZfbmV4dCA9IChzdHJ1Y3QgbG9jYWx2YXIgKikgTlVMTDsgLyogTm8gbmV4dCB5ZXQgKi8KKworICAgIGlmICghKHYtPmx2X25hbWUgPSAoY2hhciAqKSBtYWxsb2MoKGludCkgc3RybGVuKHApICsgMSkpKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBzdHJjcHkodi0+bHZfbmFtZSwgcCk7ICAgICAgICAgICAgICAvKiBDb3B5IG5hbWUgaW50byBuZXcgbm9kZSAoU0FGRSkgKi8KKworICAgIGlmICgqcykgeworICAgICAgICBpZiAoISh2LT5sdl92YWx1ZSA9IChjaGFyICopIG1hbGxvYygoaW50KSBzdHJsZW4ocykgKyAxKSkpCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgc3RyY3B5KHYtPmx2X3ZhbHVlLCBzKTsgICAgICAgICAvKiBDb3B5IHZhbHVlIGludG8gbmV3IG5vZGUgKFNBRkUpICovCisgICAgfSBlbHNlCisgICAgICB2LT5sdl92YWx1ZSA9IE5VTEw7CisKKyAgICB0cmFfYXNnID0gMDsKKyAgICBkZWxtYWMocCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGhlIG9yaWdpbmFsIG1hY3JvICovCisgICAgdHJhX2FzZyA9IHRyYV90bXA7CisgICAgcmV0dXJuKDApOworfQorCitpbnQKK2RvbG9jYWwoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEbyB0aGUgTE9DQUwgY29tbWFuZCAqLworICAgIGludCBpLCB4OworICAgIGNoYXIgKiBzOworICAgIGNoYXIgKiBsaXN0W01BWExPQ0FMVkFSKzJdOyAgICAgICAgIC8qIFVwIHRvIDY0IHZhcmlhYmxlcyBwZXIgbGluZSAqLworCisgICAgaWYgKCh4ID0gY210eHQoIlZhcmlhYmxlIG5hbWUocykiLCIiLCZzLE5VTEwpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisKKyAgICB4d29yZHMocyxNQVhMT0NBTFZBUixsaXN0LDApOyAgICAgICAvKiBCcmVhayB1cCBsaW5lIGludG8gIndvcmRzIiAqLworCisgICAgLyogTm90ZTogQXJyYXlzIGRvIG5vdCB1c2UgdGhlIGxvY2FsaGVhZCBsaXN0LCBidXQgaGF2ZSB0aGVpciBvd24gc3RhY2sgKi8KKworICAgIGZvciAoaSA9IDE7IGkgPCBNQVhMT0NBTFZBUiAmJiBsaXN0W2ldOyBpKyspIHsgLyogR28gdGhyb3VnaCB0aGUgbGlzdCAqLworICAgICAgICBpZiAoYWRkbG9jYWwobGlzdFtpXSkgPCAwKQorICAgICAgICAgIGdvdG8gbG9jYWxiYWQ7CisgICAgfQorICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgbG9jYWxiYWQ6CisgICAgcHJpbnRmKCI/RmFpbHVyZSB0byBhbGxvY2F0ZSBzdG9yYWdlIGZvciBsb2NhbCB2YXJpYWJsZXMiKTsKKyAgICBmcmVlbG9jYWwoY21kbHZsKTsKKyAgICByZXR1cm4oLTkpOworfQorCisvKiAgRCBPIE8gVSBUIFAgVSBUICAtLSAgUmV0dXJucyAwIG9uIGZhaWx1cmUsIDEgb24gc3VjY2VzcyAqLworCisjaWZuZGVmIE5PS1ZFUkJTCisjZGVmaW5lIEtfQlVGTEVOIDMwCisjZGVmaW5lIFNFTkRfQlVGTEVOIDI1NQorI2RlZmluZSBzZW5kYnVmZCh4KSB7IG9zZW5kYnVmW3NlbmRuZHgrK10gPSB4O1wKKyBpZiAoc2VuZG5keCA9PSBTRU5EX0JVRkxFTikge2Rvb3V0cHV0KHMsY3gpOyBzZW5kbmR4ID0gMDt9fQorI2VuZGlmIC8qIE5PS1ZFUkJTICovCisKK2ludCBvdXRlc2MgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIHNwZWNpYWwgT1VUUFVUIGVzY2FwZXMgKi8KKworaW50Citkb291dHB1dChzLCBjeCkgY2hhciAqczsgaW50IGN4OyB7CisjaWZkZWYgU1NIQlVJTFRJTgorICAgIGV4dGVybiBpbnQgc3NoX2NhczsKKyAgICBleHRlcm4gY2hhciAqIHNzaF9jbWQ7CisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworICAgIGludCB4LCB4eCwgeSwgcXVvdGU7ICAgICAgICAgICAgICAgIC8qIFdvcmtlcnMgKi8KKyAgICBpbnQgaXNfdG4gPSAwOworCisgICAgaXNfdG4gPSAobG9jYWwgJiYgbmV0d29yayAmJiBJU19URUxORVQoKSkgfHwKKyAgICAgICghbG9jYWwgJiYgc3N0ZWxuZXQpOworCisgICAgZGVidWcoRjExMSwiZG9vdXRwdXQgcyIscywoaW50KXN0cmxlbihzKSk7CisKKyAgICBpZiAobG9jYWwpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb25kaXRpb24gZXh0ZXJuYWwgbGluZSAqLworI2lmZGVmIE5PTE9DQUwKKyAgICAgICAgZ290byBvdXRlcnI7CisjZWxzZQorICAgICAgICBpZiAodHRjaGsoKSA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiP0Nvbm5lY3Rpb24gJXMgJXMgaXMgbm90IG9wZW4uXG4iLAorICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgPyAidG8iIDogIm9uIiwKKyAgICAgICAgICAgICAgICAgICB0dG5hbWUKKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgICAgIGlmICh0dHZ0KHNwZWVkLGZsb3cpIDwgMCkgeworICAgICAgICAgICAgcHJpbnRmKCI/T1VUUFVUIGluaXRpYWxpemF0aW9uIGVycm9yXG4iKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICB9CisjaWZkZWYgU1NIQlVJTFRJTgorICAgIGlmICggbmV0d29yayAmJiBuZXR0eXBlID09IE5FVF9TU0ggJiYgc3NoX2NhcyAmJiBzc2hfY21kICYmIAorICAgICAgICAgIShzdHJjbXAoc3NoX2NtZCwia2VybWl0IikgJiYgc3RyY21wKHNzaF9jbWQsInNmdHAiKSkpIHsKKyAgICAgICAgaWYgKCFxdWlldCkKKyAgICAgICAgICAgIHByaW50ZigiP1NTSCBTdWJzeXN0ZW0gYWN0aXZlOiAlc1xuIiwgc3NoX2NtZCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworCisgICAgaWYgKCFjbWRncXVvKCkpIHsgICAgICAgICAgICAgICAgICAgLyogQ09NTUFORCBRVU9USU5HIE9GRiAqLworICAgICAgICB4ID0gc3RybGVuKHMpOyAgICAgICAgICAgICAgICAgIC8qIEp1c3Qgc2VuZCB0aGUgc3RyaW5nIGxpdGVyYWxseSAqLworICAgICAgICB4eCA9IGxvY2FsID8gdHRvbCgoQ0hBUiAqKXMseCkgOiBjb254byh4LHMpOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9ICh4eCA9PSB4KSA/IDEgOiAwKTsKKyAgICB9CisgICAgcXVvdGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBiYWNrc2xhc2ggKFwpIHF1b3RlICovCisgICAgb2JuID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgY291bnQgKi8KKyAgICBvYnAgPSBvYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcG9pbnRlcnMgKi8KKworICBvdXRhZ2FpbjoKKyAgICB3aGlsZSAoKHggPSAqcysrKSkgeyAgICAgICAgICAgICAgICAvKiBMb29wIHRocm91Z2ggdGhlIHN0cmluZyAqLworICAgICAgICB5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yIGNvZGUsIDAgPSBubyBlcnJvci4gKi8KKyAgICAgICAgZGVidWcoRjAwMCwiZG9vdXRwdXQiLCIiLHgpOworICAgICAgICBpZiAocXVvdGUpIHsgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgY2hhcmFjdGVyIGlzIHF1b3RlZCAqLworI2lmbmRlZiBOT0tWRVJCUworICAgICAgICAgICBpZiAoeCA9PSAnaycgfHwgeCA9PSAnSycpIHsgIC8qIFxrIG9yIFxLICovCisgICAgICAgICAgICAgICBleHRlcm4gc3RydWN0IGtleXRhYiBrdmVyYnNbXTsKKyAgICAgICAgICAgICAgIGV4dGVybiBpbnQgbmt2ZXJiczsKKyAgICAgICAgICAgICAgIGV4dGVybiBjaGFyICoga2V5ZGVmcHRyOworICAgICAgICAgICAgICAgZXh0ZXJuIGludCBrZXltYWM7CisgICAgICAgICAgICAgICBleHRlcm4gaW50IGtleW1hY3g7CisgICAgICAgICAgICAgICBpbnQgeCwgeSwgYnJhY2UgPSAwOworICAgICAgICAgICAgICAgaW50IHBhdXNlOworICAgICAgICAgICAgICAgY2hhciAqIHAsICogYjsKKyAgICAgICAgICAgICAgIGNoYXIga2J1ZltLX0JVRkxFTiArIDFdOyAvKiBLZXkgdmVyYiBuYW1lIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgY2hhciBvc2VuZGJ1ZltTRU5EX0JVRkxFTiArMV07CisgICAgICAgICAgICAgICBpbnQgIHNlbmRuZHggPSAwOworCisgICAgICAgICAgICAgICBpZiAoeHhvdXQob2J1ZixvYm4pIDwgMCkgLyogRmx1c2ggYnVmZmVyICovCisgICAgICAgICAgICAgICAgIGdvdG8gb3V0ZXJyOworICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiT1VUUFVUIEtWRVJCIiwiIiwwKTsgLyogU2VuZCBhIEtWRVJCICovCisgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSGF2ZSBLIHZlcmI/ICovCisgICAgICAgICAgICAgICAgICAgaWYgKCEqcykgeworICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICB9CisvKgorICBXZSBhc3N1bWUgdGhhdCB0aGUgdmVyYiBuYW1lIGlzIHticmFjZWR9LCBvciBpdCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlCisgIHN0cmluZywgcywgb3IgaXQgZW5kcyB3aXRoIGEgc3BhY2UsIGNvbnRyb2wgY2hhcmFjdGVyLCBvciBiYWNrc2xhc2guCisqLworICAgICAgICAgICAgICAgICAgIHAgPSBrYnVmOyAgICAgICAgICAgIC8qIENvcHkgdmVyYiBuYW1lIGludG8gbG9jYWwgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh4KysgPCBLX0JVRkxFTikgJiYgKCpzID4gU1ApICYmICgqcyAhPSBDTURRKSkgeworICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJhY2UgJiYgKnMgPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gKnMrKzsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgaWYgKCpzICYmICFicmFjZSkgICAgLyogSWYgd2UgYnJva2UgYmVjYXVzZSBvZiBcLCBldGMsICovCisgICAgICAgICAgICAgICAgICAgICBzLS07ICAgICAgICAgICAgICAgLyogIGJhY2sgdXAgc28gd2UgZ2V0IGFub3RoZXIgbG9vay4gKi8KKyAgICAgICAgICAgICAgICAgICBicmFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgKnAgPSBOVUw7ICAgICAgICAgICAgLyogVGVybWluYXRlLiAqLworICAgICAgICAgICAgICAgICAgIHAgPSBrYnVmOyAgICAgICAgICAgIC8qIFBvaW50IGJhY2sgdG8gYmVnaW5uaW5nICovCisgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZG9vdXRwdXQga3ZlcmIiLHAsMCk7CisgICAgICAgICAgICAgICAgICAgeSA9IHhsb29rdXAoa3ZlcmJzLHAsbmt2ZXJicywmeCk7IC8qIExvb2sgaXQgdXAgKi8KKyAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkb291dHB1dCBsb29rdXAiLDAseSk7CisgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VuZG5keCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9vdXRwdXQob3NlbmRidWYsY3gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZG5keCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgZG9rdmVyYihWQ01ELHkpOworI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgIC8qIElzIGl0IGEgbWFjcm8/ICovCisgICAgICAgICAgICAgICAgICAgICAgIHkgPSBteGxvb2sobWFjdGFiLHAsbm1hYyk7CisgICAgICAgICAgICAgICAgICAgICAgIGlmICh5ID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcHVzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bWFjID0gMTsgIC8qIEZsYWcgZm9yIGtleSBtYWNybyBhY3RpdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleW1hY3ggPSB5OyAvKiBLZXkgbWFjcm8gaW5kZXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWRlZnB0ciA9IHM7IC8qIFdoZXJlIHRvIHJlc3VtZSBuZXh0IHRpbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImRvb3V0cHV0IG14bG9vayIsa2V5ZGVmcHRyLHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgcXVvdGUgPSAwOworICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIE5PS1ZFUkJTICovCisgICAgICAgICAgICAgaWYgKG91dGVzYyAmJiAoeCA9PSAnbicgfHwgeCA9PSAnTicpKSB7IC8qIFxuIG9yIFxOICovCisgICAgICAgICAgICAgICAgIGlmICh4eG91dChvYnVmLG9ibikgPCAwKSAvKiBGbHVzaCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICBnb3RvIG91dGVycjsKKyAgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiT1VUUFVUIE5VTCIsIiIsMCk7IC8qIFNlbmQgYSBOVUwgKi8KKyAgICAgICAgICAgICAgICAgaWYgKGxvY2FsKQorICAgICAgICAgICAgICAgICAgIHR0b2MoTlVMKTsKKyAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgIGNvbm9jKE5VTCk7CisgICAgICAgICAgICAgICAgIHF1b3RlID0gMDsKKyAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICB9IGVsc2UgaWYgKG91dGVzYyAmJiAoeCA9PSAnYicgfHwgeCA9PSAnQicpKSB7IC8qIFxiIG9yIFxCICovCisKKyAgICAgICAgICAgICAgICBpZiAoeHhvdXQob2J1ZixvYm4pIDwgMCkgLyogRmx1c2ggYnVmZmVyIGZpcnN0ICovCisgICAgICAgICAgICAgICAgICBnb3RvIG91dGVycjsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJPVVRQVVQgQlJFQUsiLCIiLDApOworI2lmbmRlZiBOT0xPQ0FMCisgICAgICAgICAgICAgICAgdHRzbmRiKCk7ICAgICAgICAgICAgICAgLyogU2VuZCBCUkVBSyBzaWduYWwgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgIGlmIChsb2NhbCkKKyAgICAgICAgICAgICAgICAgICB0dG9jKE5VTCk7CisgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICBjb25vYyhOVUwpOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICAgICAgICAgICAgICBxdW90ZSA9IDA7ICAgICAgICAgICAgICAvKiBUdXJuIG9mZiBxdW90ZSBmbGFnICovCisgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgLyogYW5kIG5vdCB0aGUgYiBvciBCICovCisjaWZkZWYgQ0tfTEJSSworICAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0ZXNjICYmICh4ID09ICdsJyB8fCB4ID09ICdMJykpIHsgLyogXGwgb3IgXEwgKi8KKyAgICAgICAgICAgICAgICAgaWYgKHh4b3V0KG9idWYsb2JuKSA8IDApIC8qIEZsdXNoIGJ1ZmZlciBmaXJzdCAqLworICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0ZXJyOworICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJPVVRQVVQgTG9uZyBCUkVBSyIsIiIsMCk7CisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgICAgICAgICAgdHRzbmRsYigpOyAgICAgICAgICAgICAvKiBTZW5kIExvbmcgQlJFQUsgc2lnbmFsICovCisjZWxzZQorICAgICAgICAgICAgICAgICBpZiAobG9jYWwpCisgICAgICAgICAgICAgICAgICAgdHRvYyhOVUwpOworICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgY29ub2MoTlVMKTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgICAgICAgICAgICAgIHF1b3RlID0gMDsgICAgICAgICAgICAgLyogVHVybiBvZmYgcXVvdGUgZmxhZyAqLworICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgIC8qIGFuZCBub3QgdGhlIGwgb3IgTCAqLworI2VuZGlmIC8qIENLX0xCUksgKi8KKworICAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA9PSBDTURRKSB7ICAgIC8qIEJhY2tzbGFzaCBpdHNlbGYgKi8KKyAgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiT1VUUFVUIENNRFEiLCIiLDApOworICAgICAgICAgICAgICAgICB4eCA9IG9ib2MoZG9wYXIoQ01EUSkpOyAvKiBPdXRwdXQgdGhlIGJhY2tzbGFzaC4gKi8KKyAgICAgICAgICAgICAgICAgaWYgKHh4IDwgMCkKKyAgICAgICAgICAgICAgICAgICBnb3RvIG91dGVycjsKKyAgICAgICAgICAgICAgICAgcXVvdGUgPSAwOworICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgIC8qIGlmIFwgbm90IGZvbGxvd2VkIGJ5IHNwZWNpYWwgZXNjICovCisgICAgICAgICAgICAgICAgLyogTm90ZTogQXRhcmkgU1QgY29tcGlsZXIgd29uJ3QgYWxsb3cgbWFjcm8gY2FsbCBpbiAiaWYgKCkiICovCisgICAgICAgICAgICAgICAgIHh4ID0gb2JvYyhkb3BhcihDTURRKSk7IC8qIE91dHB1dCB0aGUgYmFja3NsYXNoLiAqLworICAgICAgICAgICAgICAgICBpZiAoeHggPCAwKQorICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0ZXJyOworICAgICAgICAgICAgICAgICBxdW90ZSA9IDA7ICAgICAgICAgICAgIC8qIFR1cm4gb2ZmIHF1b3RlIGZsYWcgKi8KKyAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoeCA9PSBDTURRKSB7ICAgICAgICAgLyogVGhpcyBpcyB0aGUgcXVvdGUgY2hhcmFjdGVyICovCisgICAgICAgICAgICBxdW90ZSA9IDE7ICAgICAgICAgICAgICAgICAgLyogR28gYmFjayBhbmQgZ2V0IG5leHQgY2hhcmFjdGVyICovCisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgLyogd2hpY2ggaXMgcXVvdGVkICovCisgICAgICAgIH0KKyAgICAgICAgeHggPSBvYm9jKGRvcGFyKChjaGFyKXgpKTsgICAgICAvKiBPdXRwdXQgdGhpcyBjaGFyYWN0ZXIgKi8KKyAgICAgICAgZGVidWcoRjExMSwiZG9vdXRwdXQiLG9idWYsb2JuKTsKKyAgICAgICAgaWYgKHh4IDwgMCkKKyAgICAgICAgICBnb3RvIG91dGVycjsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIGlmIChzZXNsb2cgJiYgZHVwbGV4KSB7ICAgICAgICAgLyogTG9nIHRoZSBjaGFyYWN0ZXIgaWYgbG9nIGlzIG9uICovCisgICAgICAgICAgICBsb2djaGFyKChjaGFyKXgpOworICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBpZiAoeCA9PSAnXDAxNScpIHsgICAgICAgICAgICAgIC8qIFN0cmluZyBjb250YWlucyBjYXJyaWFnZSByZXR1cm4gKi8KKyAgICAgICAgICAgIGludCBzdHVmZiA9IC0xLCBzdHVmZjIgPSAtMTsKKyAgICAgICAgICAgIGlmICh0bmxtKSB7ICAgICAgICAgICAgICAgICAvKiBURVJNSU5BTCBORVdMSU5FIE9OICovCisgICAgICAgICAgICAgICAgc3R1ZmYgPSBMRjsgICAgICAgICAgICAgLyogU3R1ZmYgTEYgKi8KKyAgICAgICAgICAgIH0KKyNpZmRlZiBUTkNPREUKKyAgICAgICAgICAgIC8qIFRFTE5FVCBORVdMSU5FIE9OL09GRi9SQVcgKi8KKyAgICAgICAgICAgIGlmIChpc190bikgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoVEVMT1BUX01FKFRFTE9QVF9CSU5BUlkpID8gLyogTlZUIG9yIEJJTkFSWSAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG5fYl9ubG0gOgorICAgICAgICAgICAgICAgICAgICAgICAgdG5fbmxtCisgICAgICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVE5MX0NSOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVE5MX0NSTlVMOgorICAgICAgICAgICAgICAgICAgICBzdHVmZjIgPSBzdHVmZjsKKyAgICAgICAgICAgICAgICAgICAgc3R1ZmYgID0gTlVMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgVE5MX0NSTEY6CisgICAgICAgICAgICAgICAgICAgIHN0dWZmMiA9IHN0dWZmOworICAgICAgICAgICAgICAgICAgICBzdHVmZiA9IExGOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVE5DT0RFICovCisgICAgICAgICAgICBpZiAoc3R1ZmYgPiAtMSkgeyAgICAgICAgICAgLyogU3R1ZmZpbmcgYW5vdGhlciBjaGFyYWN0ZXIuLi4gKi8KKyAgICAgICAgICAgICAgICB4eCA9IG9ib2MoZG9wYXIoKENIQVIpc3R1ZmYpKTsKKyAgICAgICAgICAgICAgICBpZiAoeHggPCAwKQorICAgICAgICAgICAgICAgICAgZ290byBvdXRlcnI7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgIGlmIChzZXNsb2cgJiYgZHVwbGV4KSB7IC8qIExvZyBzdHVmZmVkIGNoYXIgaWYgYXBwcm9wcmlhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbG9nY2hhcigoY2hhcilzdHVmZik7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHVmZjIgPiAtMSkgeyAgICAgICAgICAvKiBTdHVmZmluZyBhbm90aGVyIGNoYXJhY3Rlci4uLiAqLworICAgICAgICAgICAgICAgIHh4ID0gb2JvYyhkb3BhcigoQ0hBUilzdHVmZjIpKTsKKyAgICAgICAgICAgICAgICBpZiAoeHggPCAwKQorICAgICAgICAgICAgICAgICAgZ290byBvdXRlcnI7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgIGlmIChzZXNsb2cgJiYgZHVwbGV4KSB7IC8qIExvZyBzdHVmZmVkIGNoYXIgaWYgYXBwcm9wcmlhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbG9nY2hhcigoY2hhcilzdHVmZjIpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeHhvdXQob2J1ZixvYm4pIDwgMCkgICAgLyogRmx1c2hpbmcgaXMgcmVxdWlyZWQgaGVyZSEgKi8KKyAgICAgICAgICAgICAgZ290byBvdXRlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGN4ID09IFhYTE5PVVQpIHsKKyAgICAgICAgcyA9ICJcMDE1IjsKKyAgICAgICAgY3ggPSAwOworICAgICAgICBnb3RvIG91dGFnYWluOworICAgIH0KKyAgICBpZiAocXVvdGUgPT0gMSkgICAgICAgICAgICAgICAgICAgICAvKiBTdHJpbmcgZW5kZWQgd2l0aCBiYWNrc2xhc2ggKi8KKyAgICAgIHh4ID0gb2JvYyhkb3BhcihDTURRKSk7CisKKyAgICBpZiAob2JuID4gMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiBPVVRQVVQgZG9uZSAqLworICAgICAgaWYgKHh4b3V0KG9idWYsb2JuKSA8IDApICAgICAgICAgIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgbmVjZXNzYXJ5LiAqLworICAgICAgICBnb3RvIG91dGVycjsKKyAgICByZXR1cm4oMSk7CisKK291dGVycjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPVVRQVVQgY29tbWFuZCBlcnJvciBoYW5kbGVyICovCisgICAgaWYgKG1zZ2ZsZykgcHJpbnRmKCI/T1VUUFVUIGV4ZWN1dGlvbiBlcnJvclxuIik7CisgICAgcmV0dXJuKDApOworCisvKiBSZW1vdmUgImxvY2FsIiBPVVRQVVQgbWFjcm8gZGVmaW5pbml0aW9ucyAqLworCisjaWZkZWYgQ09NTUVOVAorLyogTm8gbW9yZSBtYWNyb3MgLi4uICovCisjdW5kZWYgb2JvYworI3VuZGVmIG9iZmxzCisjZW5kaWYgLyogQ09NTUVOVCAqLworfQorI2VuZGlmIC8qIE5PU1BMICovCisKKy8qIERpc3BsYXkgdmVyc2lvbiBoZXJhbGQgYW5kIGluaXRpYWwgcHJvbXB0ICovCisKK1ZPSUQKK2hlcmFsZCgpIHsKKyAgICBpbnQgeCA9IDAsIGk7CisgICAgZXh0ZXJuIGludCBzcnZjZG1zZzsKKyAgICBleHRlcm4gY2hhciAqIGNkbXNnZmlsZVtdOworI2lmbmRlZiBOT0NNREwKKyAgICBleHRlcm4gY2hhciAqIGJhbm5lcmZpbGU7CisgICAgZGVidWcoRjExMCwiaGVyYWxkIGJhbm5lcmZpbGUiLGJhbm5lcmZpbGUsMCk7CisgICAgaWYgKGJhbm5lcmZpbGUpIHsKKyAgICAgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsKKyAgICAgICAgaWYgKGRvdHlwZShiYW5uZXJmaWxlLDEsMCwwLE5VTEwsMCxOVUxMLDAsMCxOVUxMLDApID4gMCkgeworICAgICAgICAgICAgZGVidWcoRjExMSwiaGVyYWxkIiwic3J2Y2Rtc2ciLHNydmNkbXNnKTsKKyAgICAgICAgICAgIGlmIChzcnZjZG1zZykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiaGVyYWxkIGNkbXNnZmlsZVtpXSIsY2Rtc2dmaWxlW2ldLGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoemNoa2koY2Rtc2dmaWxlW2ldKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3R5cGUoY2Rtc2dmaWxlW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhhc2ttb3JlLDAsMCxOVUxMLDAsTlVMTCwwLDAsTlVMTCwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIE5PQ01ETCAqLworCisjaWZkZWYgQ09NTUVOVAorICAgIC8qIFRoZSBmb2xsb3dpbmcgZ2VuZXJhdGVzIGJhZCBjb2RlIGluIFNDTyBjb21waWxlcnMuICovCisgICAgLyogT2JzZXJ2ZWQgaW4gYm90aCBPU1I1IGFuZCBVbml4d2FyZSAyIC0tIGFmdGVyIGV4ZWN1dGluZyB0aGlzICovCisgICAgLyogc3RhdGVtZW50IHdoZW4gYWxsIGNvbmRpdGlvbnMgYXJlIGZhbHNlLCB4IGhhcyBhIHZhbHVlIG9mIC0zMi4gKi8KKyAgICBpZiAobm9oZXJhbGQgfHwgYmdzZXQgPiAwIHx8IChiZ3NldCAhPSAwICYmIGJhY2tncmQgIT0gMCkpIHggPSAxOworI2Vsc2UKKyAgICB4ID0gMDsKKyAgICBpZiAobm9oZXJhbGQpCisgICAgICB4ID0gMTsKKyAgICBlbHNlIGlmIChiZ3NldCA+IDApCisgICAgICB4ID0gMTsKKyAgICBlbHNlIGlmIChiZ3NldCA8IDAgJiYgYmFja2dyZCA+IDApCisgICAgICB4ID0gMTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICBpZiAoeCA9PSAwKSB7CisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgcHJpbnRmKCIlcywgZm9yJXNcbiIsdmVyc2lvLGNreHN5cyk7CisjZWxzZQorI2lmZGVmIE9TSworICAgICAgICBwcmludGYoIiVzLCBmb3Ilc1xuIix2ZXJzaW8sY2t4c3lzKTsKKyNlbHNlCisgICAgICAgIHByaW50ZigiJXMsIGZvciVzXG5cciIsdmVyc2lvLGNreHN5cyk7CisjZW5kaWYgLyogT1NLICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyAgICAgICAgcHJpbnRmKCIgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LFxuIik7CisgICAgICAgIHByaW50ZigiICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLlxuIik7CisjaWZkZWYgT1MyCisgICAgICAgc2hvcmVnKCk7CisjZW5kaWYgLyogT1MyICovCisKKyAgICAgICAgaWYgKCFxdWlldCAmJiAhYmFja2dyZCkgeworI2lmZGVmIENPTU1FTlQKKy8qICJEZWZhdWx0IGZpbGUtdHJhbnNmZXIgbW9kZSBpcyBBVVRPTUFUSUMiIGlzIHVzZWxlc3MgaW5mb3JtYXRpb24uLi4gKi8KKyAgICAgICAgICAgIGNoYXIgKiBzOworICAgICAgICAgICAgZXh0ZXJuIGludCB4ZmVybW9kZTsKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgIHMgPSAiQVVUT01BVElDIjsKKyNlbHNlCisgICAgICAgICAgICBpZiAoeGZlcm1vZGUgPT0gWE1PREVfQSkgeworICAgICAgICAgICAgICAgIHMgPSAiQVVUT01BVElDIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcyA9IGdmbW9kZShiaW5hcnksMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyNlbmRpZiAvKiBWTVMgKi8KKyAgICAgICAgICAgIGlmICgqcykKKyAgICAgICAgICAgICAgcHJpbnRmKCJEZWZhdWx0IGZpbGUtdHJhbnNmZXIgbW9kZSBpcyAlc1xuIiwgcyk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJoZXJhbGQiLCJzcnZjZG1zZyIsc3J2Y2Rtc2cpOworICAgICAgICAgICAgaWYgKHNydmNkbXNnKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJoZXJhbGQgY2Rtc2dmaWxlW2ldIixjZG1zZ2ZpbGVbaV0saSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh6Y2hraShjZG1zZ2ZpbGVbaV0pID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdHlwZShjZG1zZ2ZpbGVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGFza21vcmUsMCwwLE5VTEwsMCxOVUxMLDAsMCxOVUxMLDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYoIlR5cGUgPyBvciBIRUxQIGZvciBoZWxwLlxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qICBHIEYgTSBPIEQgRSAgLS0gIEdldCBGaWxlICh0cmFuc2ZlcikgTW9kZSAgKi8KKworY2hhciAqCitnZm1vZGUoYmluYXJ5LHVwY2FzZSkgaW50IGJpbmFyeSwgdXBjYXNlOyB7CisgICAgY2hhciAqIHM7CisgICAgc3dpdGNoIChiaW5hcnkpIHsKKyAgICAgIGNhc2UgWFlGVF9UOiBzID0gdXBjYXNlID8gIlRFWFQiIDogInRleHQiOyBicmVhazsKKyNpZmRlZiBWTVMKKyAgICAgIGNhc2UgWFlGVF9COiBzID0gdXBjYXNlID8gIkJJTkFSWSBGSVhFRCIgOiAiYmluYXJ5IGZpeGVkIjsgYnJlYWs7CisgICAgICBjYXNlIFhZRlRfSTogcyA9IHVwY2FzZSA/ICJJTUFHRSIgOiAiaW1hZ2UiOyBicmVhazsKKyAgICAgIGNhc2UgWFlGVF9MOiBzID0gdXBjYXNlID8gIkxBQkVMRUQiIDogImxhYmVsZWQiOyBicmVhazsKKyAgICAgIGNhc2UgWFlGVF9VOiBzID0gdXBjYXNlID8gIkJJTkFSWSBVTkRFRiIgOiAiYmluYXJ5IHVuZGVmIjsgYnJlYWs7CisjZWxzZQorI2lmZGVmIE1BQworICAgICAgY2FzZSBYWUZUX0I6IHMgPSB1cGNhc2UgPyAiQklOQVJZIiA6ICJiaW5hcnkiOyBicmVhazsKKyAgICAgIGNhc2UgWFlGVF9NOiBzID0gdXBjYXNlID8gIk1BQ0JJTkFSWSIgOiAibWFjYmluYXJ5IjsgYnJlYWs7CisjZWxzZQorICAgICAgY2FzZSBYWUZUX0I6IHMgPSB1cGNhc2UgPyAiQklOQVJZIiA6ICJiaW5hcnkiOyBicmVhazsKKyNpZmRlZiBDS19MQUJFTEVECisgICAgICBjYXNlIFhZRlRfTDogcyA9IHVwY2FzZSA/ICJMQUJFTEVEIiA6ICJsYWJlbGVkIjsgYnJlYWs7CisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIFZNUyAqLworICAgICAgY2FzZSBYWUZUX1g6IHMgPSB1cGNhc2UgPyAiVEVORVgiIDogInRlbmV4IjsgYnJlYWs7CisgICAgICBkZWZhdWx0OiBzID0gIiI7CisgICAgfQorICAgIHJldHVybihzKTsKK30KKworI2lmbmRlZiBOT1NQTAorc3RhdGljIGludAoraXNhYShzKSBjaGFyICogczsgeyAgICAgICAgICAgICAgICAgICAgIC8qIElzIGFzc29jaWF0aXZlIGFycmF5ICovCisgICAgY2hhciBjOworICAgIGludCB4OworICAgIGlmICghcykgcyA9ICIiOworICAgIGlmICghKnMpIHJldHVybigwKTsKKyAgICBzKys7CisgICAgd2hpbGUgKChjID0gKnMrKykpIHsKKyAgICAgICAgaWYgKGMgPT0gJzwnKSB7CisgICAgICAgICAgICB4ID0gc3RybGVuKHMpOworICAgICAgICAgICAgcmV0dXJuICgoKihzK3gtMSkgPT0gJz4nKSA/IDEgOiAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qICBNIEwgTyBPIEsgIC0tICBMb29rdXAgdGhlIG1hY3JvIG5hbWUgaW4gdGhlIG1hY3JvIHRhYmxlICAqLworCisvKgorICBDYWxsIHRoaXMgd2F5OiAgdiA9IG1sb29rKHRhYmxlLHdvcmQsbik7CisKKyAgICB0YWJsZSAtIGEgJ3N0cnVjdCBtdGFiJyB0YWJsZS4KKyAgICB3b3JkICAtIHRoZSB0YXJnZXQgc3RyaW5nIHRvIGxvb2sgdXAgaW4gdGhlIHRhYmxlLgorICAgIG4gICAgIC0gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUuCisKKyAgVGhlIGtleXdvcmQgdGFibGUgbXVzdCBiZSBhcnJhbmdlZCBpbiBhc2NlbmRpbmcgYWxwaGFiZXRpY2FsIG9yZGVyLCBhbmQKKyAgYWxsIGxldHRlcnMgbXVzdCBiZSBsb3dlcmNhc2UuCisKKyAgUmV0dXJucyB0aGUgdGFibGUgaW5kZXgsIDAgb3IgZ3JlYXRlciwgaWYgdGhlIG5hbWUgd2FzIGZvdW5kLCBvcjoKKworICAgLTMgaWYgbm90aGluZyB0byBsb29rIHVwICh0YXJnZXQgd2FzIG51bGwpLAorICAgLTIgaWYgYW1iaWd1b3VzLAorICAgLTEgaWYgbm90IGZvdW5kLgorCisgIEEgbWF0Y2ggaXMgc3VjY2Vzc2Z1bCBpZiB0aGUgdGFyZ2V0IG1hdGNoZXMgYSBrZXl3b3JkIGV4YWN0bHksIG9yIGlmCisgIHRoZSB0YXJnZXQgaXMgYSBwcmVmaXggb2YgZXhhY3RseSBvbmUga2V5d29yZC4gIEl0IGlzIGFtYmlndW91cyBpZiB0aGUKKyAgdGFyZ2V0IG1hdGNoZXMgdHdvIG9yIG1vcmUga2V5d29yZHMgZnJvbSB0aGUgdGFibGUuCisqLworaW50CittbG9vayh0YWJsZSxjbWQsbikgc3RydWN0IG10YWIgdGFibGVbXTsgY2hhciAqY21kOyBpbnQgbjsgeworICAgIHJlZ2lzdGVyIGludCBpOworICAgIGludCB2LCB3LCBjbWRsZW4gPSAwOworICAgIGNoYXIgYyA9IDAsIGMxLCAqIHM7CisgICAgaWYgKCFjbWQpIGNtZCA9ICIiOworCisgICAgZm9yIChzID0gY21kOyAqczsgcysrKSBjbWRsZW4rKzsgICAgLyogKGluc3RlYWQgb2Ygc3RybGVuKSAqLworICAgIGRlYnVnKEYxMTEsIk1MT09LIixjbWQsY21kbGVuKTsKKworICAgIGMxID0gKmNtZDsKKyAgICBpZiAoaXN1cHBlcihjMSkpCisgICAgICBjMSA9IHRvbG93ZXIoYzEpOworICAgIGlmIChjbWRsZW4gPCAxKQorICAgICAgcmV0dXJuKC0zKTsKKworLyogTm90IG51bGwsIGxvb2sgaXQgdXAgKi8KKworICAgIGlmIChuIDwgMTIpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCB3b3J0aCBpdCBmb3Igc21hbGwgdGFibGVzICovCisgICAgICAgIGkgPSAwOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpbmFyeSBzZWFyY2ggZm9yIHdoZXJlIHRvIHN0YXJ0ICovCisgICAgICAgIGludCBsbyA9IDA7CisgICAgICAgIGludCBoaSA9IG47CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlIChsbysyIDwgaGkgJiYgKytjb3VudCA8IDEyKSB7CisgICAgICAgICAgICBpID0gbG8gKyAoKGhpIC0gbG8pIC8gMik7CisgICAgICAgICAgICBjID0gKih0YWJsZVtpXS5rd2QpOworICAgICAgICAgICAgaWYgKGlzdXBwZXIoYykpIGMgPSB0b2xvd2VyKGMpOworICAgICAgICAgICAgaWYgKGMgPCBjMSkgeworICAgICAgICAgICAgICAgIGxvID0gaTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGkgPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGkgPSAoYyA8IGMxKSA/IGxvKzEgOiBsbzsKKyAgICB9CisgICAgZm9yICggOyBpIDwgbi0xOyBpKyspIHsKKyAgICAgICAgcyA9IHRhYmxlW2ldLmt3ZDsKKyAgICAgICAgaWYgKCFzKSBzID0gIiI7CisgICAgICAgIGlmICghKnMpIGNvbnRpbnVlOyAgICAgICAgICAgICAgLyogRW1wdHkgdGFibGUgZW50cnkgKi8KKyAgICAgICAgYyA9ICpzOworICAgICAgICBpZiAoaXN1cHBlcihjKSkgYyA9IHRvbG93ZXIoYyk7CisgICAgICAgIGlmIChjMSAhPSBjKSBjb250aW51ZTsgICAgICAgICAgLyogRmlyc3QgY2hhciBkb2Vzbid0IG1hdGNoICovCisgICAgICAgIGlmICghY2tzdHJjbXAocyxjbWQsLTEsMCkpICAgICAgLyogSGF2ZSBleGFjdCBtYXRjaD8gKi8KKyAgICAgICAgICByZXR1cm4oaSk7CisgICAgICAgIHYgPSAhY2tzdHJjbXAocyxjbWQsY21kbGVuLDApOworICAgICAgICB3ID0gY2tzdHJjbXAodGFibGVbaSsxXS5rd2QsY21kLGNtZGxlbiwwKTsKKyAgICAgICAgaWYgKHYgJiYgdykgICAgICAgICAgICAgICAgICAgICAvKiBIYXZlIGFiYnJldmlhdGVkIG1hdGNoPyAqLworICAgICAgICAgIHJldHVybihpKTsKKyAgICAgICAgaWYgKHYpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbWJpZ3VvdXM/ICovCisgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgaWYgKHcgPiAwKSAgICAgICAgICAgICAgICAgICAgICAvKiBQYXN0IG91ciBhbHBoYWJldGljIGFyZWE/ICovCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKy8qIExhc3QgKG9yIG9ubHkpIGVsZW1lbnQgKi8KKworICAgIGlmICghY2tzdHJjbXAodGFibGVbbi0xXS5rd2QsY21kLGNtZGxlbiwwKSkKKyAgICAgIHJldHVybihuLTEpOworCisgICAgcmV0dXJuKC0xKTsKK30KKworLyogbXhsb29rIGlzIGxpa2UgbWxvb2ssIGJ1dCBhbiBleGFjdCBmdWxsLWxlbmd0aCBtYXRjaCBpcyByZXF1aXJlZCAqLworCitpbnQKK214bG9vayh0YWJsZSxjbWQsbikgY2hhciAqY21kOyBzdHJ1Y3QgbXRhYiB0YWJsZVtdOyBpbnQgbjsgeworICAgIHJlZ2lzdGVyIGludCBpOworICAgIGludCB3LCBjbWRsZW4gPSAwLCBvbmUgPSAwOworICAgIHJlZ2lzdGVyIGNoYXIgYyA9IDAsIGMxLCAqIHM7CisKKyAgICBpZiAoIWNtZCkgY21kID0gIiI7ICAgICAgICAgICAgICAgICAvKiBDaGVjayBhcmdzICovCisKKyAgICBmb3IgKHMgPSBjbWQ7ICpzOyBzKyspIGNtZGxlbisrOyAgICAvKiAoaW5zdGVhZCBvZiBzdHJsZW4pICovCisgICAgZGVidWcoRjExMSwiTVhMT09LIixjbWQsY21kbGVuKTsKKworICAgIGMxID0gKmNtZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IGNoYXIgb2Ygc3RyaW5nIHRvIGxvb2sgdXAgKi8KKyAgICBpZiAoaXN1cHBlcihjMSkpCisgICAgICBjMSA9IHRvbG93ZXIoYzEpOworICAgIGlmICghKihjbWQrMSkpICAgICAgICAgICAgICAgICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIDEtY2hhciBuYW1lcyAqLworICAgICAgb25lID0gMTsKKworICAgIGlmIChjbWRsZW4gPCAxKSAgICAgICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gbG9vayB1cCAqLworICAgICAgcmV0dXJuKC0zKTsKKworICAgIGlmIChuIDwgMTIpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCB3b3J0aCBpdCBmb3Igc21hbGwgdGFibGVzICovCisgICAgICAgIGkgPSAwOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpbmFyeSBzZWFyY2ggZm9yIHdoZXJlIHRvIHN0YXJ0ICovCisgICAgICAgIGludCBsbyA9IDA7CisgICAgICAgIGludCBoaSA9IG47CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlIChsbysyIDwgaGkgJiYgKytjb3VudCA8IDEyKSB7CisgICAgICAgICAgICBpID0gbG8gKyAoKGhpIC0gbG8pIC8gMik7CisgICAgICAgICAgICBjID0gKih0YWJsZVtpXS5rd2QpOworICAgICAgICAgICAgaWYgKGlzdXBwZXIoYykpIGMgPSB0b2xvd2VyKGMpOworICAgICAgICAgICAgaWYgKGMgPCBjMSkgeworICAgICAgICAgICAgICAgIGxvID0gaTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGkgPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGkgPSAoYyA8IGMxKSA/IGxvKzEgOiBsbzsKKyAgICB9CisgICAgZm9yICggOyBpIDwgbjsgaSsrKSB7ICAgICAgICAgICAgICAgLyogTG9vayB0aHJ1IHRhYmxlICovCisgICAgICAgIHMgPSB0YWJsZVtpXS5rd2Q7ICAgICAgICAgICAgICAgLyogVGhpcyBlbnRyeSAqLworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgaWYgKCEqcykgY29udGludWU7ICAgICAgICAgICAgICAvKiBFbXB0eSB0YWJsZSBlbnRyeSAqLworICAgICAgICBjID0gKnM7CisgICAgICAgIGlmIChpc3VwcGVyKGMpKSBjID0gdG9sb3dlcihjKTsKKyAgICAgICAgaWYgKGMxICE9IGMpIGNvbnRpbnVlOyAgICAgICAgICAvKiBGaXJzdCBjaGFyIGRvZXNuJ3QgbWF0Y2ggKi8KKyAgICAgICAgaWYgKG9uZSkgeyAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lIGlzIG9uZSBjaGFyIGxvbmcgKi8KKyAgICAgICAgICAgIGlmICghKihzKzEpKQorICAgICAgICAgICAgICByZXR1cm4oaSk7ICAgICAgICAgICAgICAgIC8qIFNvIGlzIHRhYmxlIGVudHJ5ICovCisgICAgICAgIH0KKyNpZmRlZiBDT01NRU5UCisgICAgICAgIGlmICgoKGludClzdHJsZW4ocykgPT0gY21kbGVuKSAmJgorICAgICAgICAgICAgKCFja3N0cmNtcChzLGNtZCxjbWRsZW4sMCkpKSByZXR1cm4oaSk7CisjZWxzZQorICAgICAgICB3ID0gY2tzdHJjbXAocyxjbWQsLTEsMCk7CisgICAgICAgIGlmICghdykgcmV0dXJuKGkpOworICAgICAgICBpZiAodyA+IDApIHJldHVybigtMSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIH0KKyAgICByZXR1cm4oLTEpOworfQorCisvKiBteHhsb29rIGlzIGxpa2UgbXhsb29rLCBidXQgY2FzZS1zZW5zaXRpdmUgKi8KKworaW50CitteHhsb29rKHRhYmxlLGNtZCxuKSBjaGFyICpjbWQ7IHN0cnVjdCBtdGFiIHRhYmxlW107IGludCBuOyB7CisgICAgaW50IGksIGNtZGxlbjsKKyAgICBpZiAoIWNtZCkgY21kID0gIiI7CisgICAgaWYgKCgoY21kbGVuID0gc3RybGVuKGNtZCkpIDwgMSkgfHwgKG4gPCAxKSkgcmV0dXJuKC0zKTsKKyAgICAvKiBkZWJ1ZyhGMTExLCJteHhsb29rIHRhcmdldCIsY21kLG4pOyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKCgoaW50KXN0cmxlbih0YWJsZVtpXS5rd2QpID09IGNtZGxlbikgJiYKKyAgICAgICAgICAgICghc3RybmNtcCh0YWJsZVtpXS5rd2QsY21kLGNtZGxlbikpKQorICAgICAgICAgIHJldHVybihpKTsKKyAgICB9CisgICAgcmV0dXJuKC0xKTsKK30KKworc3RhdGljIGludAordHJhY2V2YWwobmFtLCB2YWwpIGNoYXIgKiBuYW0sICogdmFsOyB7IC8qIEZvciBUUkFDRSBjb21tYW5kICovCisgICAgaWYgKHZhbCkKKyAgICAgIHByaW50ZigiPj4+ICVzOiBcIiVzXCJcbiIsIG5hbSwgdmFsKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIj4+PiAlczogKHVuZGVmKVxuIiwgbmFtKTsKKyAgICByZXR1cm4oMCk7Cit9CisKKyNpZmRlZiBVU0VfVkFSTEVOICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgdXNlZCAqLworCisvKiAgViBBIFIgTCBFIE4gIC0tICBHZXQgbGVuZ3RoIG9mIHZhcmlhYmxlJ3MgdmFsdWUuCisKKyAgR2l2ZW4gYSB2YXJpYWJsZSBuYW1lLCByZXR1cm4gdGhlIGxlbmd0aCBvZiBpdHMgZGVmaW5pdGlvbiBvciAwIGlmIHRoZQorICB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZC4gIElmIGl0IGlzIGRlZmluZWQsIHNldCBhcmd1bWVudCBzIHRvIHBvaW50IHRvIGl0cworICBkZWZpbml0aW9uLiAgT3RoZXJ3aXNlIHNldCBzIHRvIE5VTEwuCisqLworaW50Cit2YXJsZW4obmFtLHMpIGNoYXIgKm5hbTsgY2hhciAqKnM7IHsgICAgLyogTGVuZ3RoIG9mIHZhbHVlIG9mIHZhcmlhYmxlICovCisgICAgaW50IHgsIHo7CisgICAgY2hhciAqcCA9IE5VTEwsIGM7CisKKyAgICAqcyA9IE5VTEw7CisgICAgaWYgKCFuYW0pIHJldHVybigwKTsgICAgICAgICAgICAgICAgLyogV2F0Y2ggb3V0IGZvciBudWxsIHBvaW50ZXIgKi8KKyAgICBpZiAoKm5hbSA9PSBDTURRKSB7CisgICAgICAgIG5hbSsrOworICAgICAgICBpZiAoKm5hbSA9PSAnJScpIHsgICAgICAgICAgICAgIC8qIElmIGl0J3MgYSB2YXJpYWJsZSBuYW1lICovCisgICAgICAgICAgICBpZiAoIShjID0gKihuYW0rMSkpKSByZXR1cm4oMCk7IC8qIEdldCBsZXR0ZXIgb3IgZGlnaXQgKi8KKyAgICAgICAgICAgIHAgPSAoY2hhciAqKTA7ICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHZhbHVlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIGlmIChtYWNsdmwgPiAtMSAmJiBjID49ICcwJyAmJiBjIDw9ICc5JykgeyAvKiBEaWdpdD8gKi8KKyAgICAgICAgICAgICAgICBwID0gbV9hcmdbbWFjbHZsXVtjIC0gJzAnXTsgLyogUG9pbnRlciBmcm9tIG1hY3JvLWFyZyB0YWJsZSAqLworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIEl0J3MgYSBnbG9iYWwgdmFyaWFibGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoYyA8IDMzIHx8IGMgPiBHVkFSUykgcmV0dXJuKDApOworICAgICAgICAgICAgICAgIHAgPSBnX3ZhcltjXTsgICAgICAgICAgIC8qIEdldCBwb2ludGVyIGZyb20gZ2xvYmFsLXZhciB0YWJsZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCpuYW0gPT0gJyYnKSB7ICAgICAgICAgICAgICAgLyogQW4gYXJyYXkgcmVmZXJlbmNlPyAqLworICAgICAgICAgICAgY2hhciAqKnE7CisgICAgICAgICAgICBpZiAoYXJyYXluYW0obmFtLCZ4LCZ6KSA8IDApIC8qIElmIHN5bnRheCBpcyBiYWQgKi8KKyAgICAgICAgICAgICAgcmV0dXJuKC0xKTsgICAgICAgICAgICAgICAvKiByZXR1cm4gLTEuICovCisgICAgICAgICAgICB4IC09IEFSUkFZQkFTRTsgICAgICAgICAgICAgLyogQ29udmVydCBuYW1lIHRvIG51bWJlci4gKi8KKyAgICAgICAgICAgIGlmICgocSA9IGFfcHRyW3hdKSA9PSBOVUxMKSAvKiBJZiBhcnJheSBub3QgZGVjbGFyZWQsICovCisgICAgICAgICAgICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgLyogcmV0dXJuIC0yLiAqLworICAgICAgICAgICAgaWYgKHogPiBhX2RpbVt4XSkgICAgICAgICAgIC8qIElmIHN1YnNjcmlwdCBvdXQgb2YgcmFuZ2UsICovCisgICAgICAgICAgICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgLyogcmV0dXJuIC0zLiAqLworICAgICAgICAgICAgcCA9IHFbel07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyAqLworICAgICAgICB6ID0gaXNhYShuYW0pOworICAgICAgICB4ID0geiA/IG14eGxvb2sobWFjdGFiLG5hbSxubWFjKSA6IG1sb29rKG1hY3RhYixuYW0sbm1hYyk7CisgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIHAgPSBtYWN0YWJbeF0ubXZhbDsKKyAgICB9CisgICAgaWYgKHApCisgICAgICAqcyA9IHA7CisgICAgZWxzZQorICAgICAgcCA9ICIiOworICAgIHJldHVybigoaW50KXN0cmxlbihwKSk7Cit9CisjZW5kaWYgLyogVVNFX1ZBUkxFTiAqLworCisvKgorICBUaGlzIHJvdXRpbmUgaXMgZm9yIHRoZSBiZW5lZml0IG9mIHRob3NlIGNvbXBpbGVycyB0aGF0IGNhbid0IGhhbmRsZQorICBsb25nIHN0cmluZyBjb25zdGFudHMgb3IgY29udGludWVkIGxpbmVzIHdpdGhpbiB0aGVtLiAgTG9uZyBwcmVkZWZpbmVkCisgIG1hY3JvcyBsaWtlIEZPUiwgV0hJTEUsIGFuZCBYSUYgaGF2ZSB0aGVpciBjb250ZW50cyBicm9rZW4gdXAgaW50bworICBhcnJheXMgb2Ygc3RyaW5nIHBvaW50ZXJzLiAgVGhpcyByb3V0aW5lIGNvbmNhdGVuYXRlcyB0aGVtIGJhY2sgaW50byBhCisgIHNpbmdsZSBzdHJpbmcgYWdhaW4sIGFuZCB0aGVuIGNhbGxzIHRoZSByZWFsIGFkZG1hYygpIHJvdXRpbmUgdG8gZW50ZXIKKyAgdGhlIGRlZmluaXRpb24gaW50byB0aGUgbWFjcm8gdGFibGUuCisqLworaW50CithZGRtbWFjKG5hbSxzKSBjaGFyICpuYW0sICpzW107IHsgICAgICAgLyogQWRkIGEgbXVsdGlsaW5lIG1hY3JvIGRlZmluaXRpb24gKi8KKyAgICBpbnQgaSwgeCwgeTsgY2hhciAqcDsKKyAgICB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggY291bnRlciAqLworICAgIGZvciAoaSA9IDA7ICh5ID0gKGludClzdHJsZW4oc1tpXSkpID4gMDsgaSsrKSB7IC8qIEFkZCB1cCB0b3RhbCBsZW5ndGggKi8KKyAgICAgICAgZGVidWcoRjExMSwiYWRkbW1hYyBsaW5lIixzW2ldLHkpOworICAgICAgICB4ICs9IHk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsImFkZG1tYWMgbGluZXMiLCIiLGkpOworICAgIGRlYnVnKEYxMDEsImFkZG1tYWMgbG9vcCBleGl0IiwiIix5KTsKKyAgICBkZWJ1ZyhGMTExLCJhZGRtbWFjIGxlbmd0aCIsbmFtLHgpOworICAgIGlmICh4IDwgMCkgcmV0dXJuKC0xKTsKKworICAgIHAgPSBtYWxsb2MoeCsxKTsgICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhbGwgb2YgaXQuICovCisgICAgaWYgKCFwKSB7CisgICAgICAgIHByaW50ZigiP2FkZG1tYWMgbWFsbG9jIGVycm9yOiAlc1xuIixuYW0pOworICAgICAgICBkZWJ1ZyhGMTEwLCJhZGRtbWFjIG1hbGxvYyBlcnJvciIsbmFtLDApOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICAqcCA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCBvZmYgd2l0aCBudWxsIHN0cmluZy4gKi8KKyAgICBmb3IgKGkgPSAwOyAqc1tpXTsgaSsrKSAgICAgICAgICAgICAvKiBDb25jYXRlbmF0ZSB0aGVtIGFsbCB0b2dldGhlci4gKi8KKyAgICAgIGNrc3RybmNhdChwLHNbaV0seCsxKTsKKyAgICB5ID0gKGludClzdHJsZW4ocCk7ICAgICAgICAgICAgICAgICAvKiBGaW5hbCBwcmVjYXV0aW9uLiAqLworICAgIGRlYnVnKEYxMTEsImFkZG1tYWMgY29uc3RydWN0ZWQgc3RyaW5nIixwLHkpOworICAgIGlmICh5ID09IHgpIHsKKyAgICAgICAgeSA9IGFkZG1hYyhuYW0scCk7ICAgICAgICAgICAgICAvKiBBZGQgcmVzdWx0IHRvIHRoZSBtYWNybyB0YWJsZS4gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBkZWJ1ZyhGMTAwLCJhZGRtbWFjIGxlbmd0aCBtaXNtYXRjaCIsIiIsMCk7CisgICAgICAgIHByaW50ZigiXG4hYWRkbW1hYyBpbnRlcm5hbCBlcnJvciFcbiIpOworICAgICAgICB5ID0gLTE7CisgICAgfQorICAgIGZyZWUocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgdGhlIHRlbXBvcmFyeSBjb3B5LiAqLworICAgIHJldHVybih5KTsKK30KKworLyogSGVyZSBpcyB0aGUgcmVhbCBhZGRtYWMgcm91dGluZS4gKi8KKworLyogUmV0dXJucyAtMSBvbiBmYWlsdXJlLCBtYWNybyB0YWJsZSBpbmRleCA+PSAwIG9uIHN1Y2Nlc3MuICovCisKK2ludCBtdGNoYW5nZWQgPSAwOworCitpbnQKK2FkZG1hYyhuYW0sZGVmKSBjaGFyICpuYW0sICpkZWY7IHsgICAgICAvKiBBZGQgYSBtYWNybyB0byB0aGUgbWFjcm8gdGFibGUgKi8KKyAgICBpbnQgaSwgeCwgeSwgeiwgbmFtbGVuLCBkZWZsZW4sIGZsYWcgPSAwOworICAgIGludCByZXBsYWNpbmcgPSAwLCBkZWxldGluZyA9IDA7CisgICAgY2hhciAqIHAgPSBOVUxMLCBjLCAqczsKKyAgICBleHRlcm4gaW50IHRyYV9hc2c7IGludCB0cmFfdG1wOworCisgICAgaWYgKCFuYW0pIHJldHVybigtMSk7CisgICAgaWYgKCEqbmFtKSByZXR1cm4oLTEpOworCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlciAmJgorI2lmZGVmIElLU0RDT05GCisgICAgICAgIGlrc2RjZgorI2Vsc2UgLyogSUtTRENPTkYgKi8KKyAgICAgICAgMQorI2VuZGlmIC8qIElLU0RDT05GICovCisgICAgICAgICkgeworICAgICAgICBpZiAoIWNrc3RyY21wKCJvbl9leGl0IixuYW0sLTEsMCkgfHwKKyAgICAgICAgICAgICFja3N0cmNtcCgib25fbG9nb3V0IixuYW0sLTEsMCkpCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgbmFtbGVuID0gMDsKKyAgICBwID0gbmFtOworICAgIHdoaWxlICgqcCsrKSBuYW1sZW4rKzsgICAgICAgICAgICAgIC8qIChpbnN0ZWFkIG9mIHN0cmxlbikgKi8KKworICAgIHRyYV90bXAgPSB0cmFfYXNnOyAgICAgICAgICAgICAgICAgIC8qIHRyYWNlLi4uICovCisgICAgZGVidWcoRjExMSwiYWRkbWFjIG5hbSIsbmFtLG5hbWxlbik7CisgICAgaWYgKCFkZWYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2F0Y2ggb3V0IGZvciBudWxsIHBvaW50ZXIgKi8KKyAgICAgICAgZGVmbGVuID0gMDsKKyAgICAgICAgZGVidWcoRjExMSwiYWRkbWFjIGRlZiIsIihudWxsIHBvaW50ZXIpIixkZWZsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlZmxlbiA9IDA7CisgICAgICAgIHAgPSBkZWY7CisgICAgICAgIHdoaWxlICgqcCsrKSBkZWZsZW4rKzsgICAgICAgICAgLyogKGluc3RlYWQgb2Ygc3RybGVuKSAqLworICAgICAgICBkZWJ1ZyhGMDEwLCJhZGRtYWMgZGVmIixkZWYsMCk7CisgICAgfQorI2lmZGVmIFVTRV9WQVJMRU4gICAgICAgICAgICAgICAgICAgICAgIC8qIE5PVCBVU0VEICovCisgICAgLyogVGhpcyBkb2VzIG5vdCBib29zdCBwZXJmb3JtYW5jZSBtdWNoIGJlY2F1c2UgdmFybGVuKCkgZG9lcyBhIGxvdCAqLworICAgIHggPSB2YXJsZW4obmFtLCZzKTsKKyAgICBpZiAoeCA+IDAgJiYgeCA+PSBkZWZsZW4pIHsKKyAgICAgICAgc3RyY3B5KHMsZGVmKTsgICAgICAgICAgICAgICAgICAvKiBOT1QgVVNFRCAqLworICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgcCA9IHM7CisgICAgfQorI2VuZGlmIC8qIFVTRV9WQVJMRU4gKi8KKworICAgIGlmICgqbmFtID09IENNRFEpIG5hbSsrOyAgICAgICAgICAgIC8qIEJhY2tzbGFzaCBxdW90ZT8gKi8KKyAgICBpZiAoKm5hbSA9PSAnJScpIHsgICAgICAgICAgICAgICAgICAvKiBZZXMsIGlmIGl0J3MgYSB2YXJpYWJsZSBuYW1lLCAqLworICAgICAgICBpZiAoIShjID0gKihuYW0gKyAxKSkpIHJldHVybigtMSk7IC8qIFZhcmlhYmxlIG5hbWUgbGV0dGVyIG9yIGRpZ2l0ICovCisgICAgICAgIGlmICghZmxhZykgeworICAgICAgICAgICAgdHJhX2FzZyA9IDA7CisgICAgICAgICAgICBkZWxtYWMobmFtLDApOyAgICAgICAgICAgICAgLyogRGVsZXRlIGFueSBvbGQgdmFsdWUuICovCisgICAgICAgICAgICB0cmFfYXNnID0gdHJhX3RtcDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVmbGVuIDwgMSkgeyAgICAgICAgICAgICAgIC8qIE51bGwgZGVmaW5pdGlvbiAqLworICAgICAgICAgICAgcCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgIC8qIEJldHRlciBub3QgbWFsbG9jIG9yIHN0cmNweSEgKi8KKyAgICAgICAgfSBlbHNlIGlmICghZmxhZykgeyAgICAgICAgICAgICAvKiBBIHN1YnN0YW50aWFsIGRlZmluaXRpb24gKi8KKyAgICAgICAgICAgIHAgPSBtYWxsb2MoZGVmbGVuICsgMSk7ICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgaXQgKi8KKyAgICAgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP2FkZG1hYyBtYWxsb2MgZXJyb3IgMlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0gZWxzZSBzdHJjcHkocCxkZWYpOyAgICAgICAvKiBDb3B5IGRlZiBpbnRvIG5ldyBzcGFjZSAoU0FGRSkgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vdyBwIHBvaW50cyB0byB0aGUgZGVmaW5pdGlvbiwgb3IgaXMgYSBudWxsIHBvaW50ZXIgKi8KKworICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsgICAgIC8qIFwlMC05IHZhcmlhYmxlICovCisgICAgICAgICAgICBpZiAobWFjbHZsIDwgMCkgeyAgICAgICAgICAgLyogQXJlIHdlIGNhbGxpbmcgb3IgaW4gYSBtYWNybz8gKi8KKyAgICAgICAgICAgICAgICBnX3ZhcltjXSA9IHA7ICAgICAgICAgICAvKiBObywgaXQncyB0b3AgbGV2ZWwgb25lICovCisgICAgICAgICAgICAgICAgbWFrZXN0cigmKHRvcGFyZ1tjIC0gJzAnXSkscCk7IC8qIFRha2UgY2FyZSBcJl9bXSB0b28gKi8KKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBZZXMsIGl0J3MgYSBtYWNybyBhcmd1bWVudCAqLworICAgICAgICAgICAgICAgIG1fYXJnW21hY2x2bF1bYyAtICcwJ10gPSBwOyAvKiBBc3NpZ24gdGhlIHZhbHVlICovCisgICAgICAgICAgICAgICAgbWFrZXN0cigmKG1feGFyZ1ttYWNsdmxdW2MgLSAnMCddKSxwKTsgLyogQW5kIGEgY29weSBoZXJlICovCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQncyBhIFwlYS16IHZhcmlhYmxlICovCisgICAgICAgICAgICBpZiAoYyA8IDMzIHx8ICh1bnNpZ25lZCBpbnQpYyA+IEdWQVJTKSByZXR1cm4oLTEpOworICAgICAgICAgICAgaWYgKGlzdXBwZXIoYykpIGMgPSAoY2hhcikgdG9sb3dlcihjKTsKKyAgICAgICAgICAgIGdfdmFyW2NdID0gcDsgICAgICAgICAgICAgICAvKiBQdXQgcG9pbnRlciBpbiBnbG9iYWwtdmFyIHRhYmxlICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYV9hc2cpIHRyYWNldmFsKG5hbSxwKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0gZWxzZSBpZiAoKm5hbSA9PSAnJicpIHsgICAgICAgICAgIC8qIEFuIGFycmF5IHJlZmVyZW5jZT8gKi8KKyAgICAgICAgY2hhciAqKnEgPSBOVUxMOworICAgICAgICBpbnQgcmMgPSAwOworICAgICAgICBpZiAoKHkgPSBhcnJheW5hbShuYW0sJngsJnopKSA8IDApIC8qIElmIHN5bnRheCBpcyBiYWQgKi8KKyAgICAgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gLTEuICovCisgICAgICAgIGlmIChjaGthcnJheSh4LHopIDwgMCkgICAgICAgICAgLyogSWYgYXJyYXkgbm90IGRlY2xhcmVkIG9yICovCisgICAgICAgICAgcmMgPSAtMjsgICAgICAgICAgICAgICAgICAgICAgLyogc3Vic2NyaXB0IG91dCBvZiByYW5nZSwgcmV0IC0yICovCisgICAgICAgIGlmICghZmxhZykgeworICAgICAgICAgICAgdHJhX2FzZyA9IDA7CisgICAgICAgICAgICBkZWxtYWMobmFtLDApOyAgICAgICAgICAgICAgLyogRGVsZXRlIGFueSBvbGQgdmFsdWUuICovCisgICAgICAgICAgICB0cmFfYXNnID0gdHJhX3RtcDsKKyAgICAgICAgfQorICAgICAgICB4IC09IEFSUkFZQkFTRTsgICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgbmFtZSBsZXR0ZXIgdG8gaW5kZXguICovCisgICAgICAgIGlmICh4ID4gJ3onIC0gQVJSQVlCQVNFICsgMSkKKyAgICAgICAgICByYyA9IC0xOworICAgICAgICBpZiAocmMgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmICgocSA9IGFfcHRyW3hdKSA9PSBOVUxMKSAvKiBJZiBhcnJheSBub3QgZGVjbGFyZWQsICovCisgICAgICAgICAgICAgIHJldHVybigtMyk7ICAgICAgICAgICAgICAgLyogcmV0dXJuIC0zLiAqLworICAgICAgICB9CisgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgcmV0dXJuKHJjKTsKKyAgICAgICAgaWYgKCFmbGFnKSB7CisgICAgICAgICAgICBpZiAoZGVmbGVuID4gMCkgeworICAgICAgICAgICAgICAgIGlmICgocCA9IG1hbGxvYyhkZWZsZW4rMSkpID09IE5VTEwpIHsgLyogQWxsb2NhdGUgc3BhY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJhZGRtYWMgbWFjcm8gZXJyb3IgNzogJXNcbiIsbmFtKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC00KTsgICAgICAgICAvKiBmb3IgbmV3IGRlZiwgcmV0dXJuIC00IG9uIGZhaWwuICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmNweShwLGRlZik7ICAgICAgICAgIC8qIENvcHkgZGVmIGludG8gbmV3IHNwYWNlIChTQUZFKS4gKi8KKyAgICAgICAgICAgIH0gZWxzZSBwID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBxW3pdID0gcDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIHBvaW50ZXIgdG8gaXQuICovCisgICAgICAgIGlmICh4ID09IDApIHsgICAgICAgICAgICAgICAgICAgLyogQXJnIHZlY3RvciBhcnJheSAqLworICAgICAgICAgICAgaWYgKHogPj0gMCAmJiB6IDw9IDkpIHsgICAgIC8qIENvcHkgdmFsdWVzIHRvIGNvcnJlc3BvbmRpbmcgICovCisgICAgICAgICAgICAgICAgaWYgKG1hY2x2bCA8IDApIHsgICAgICAgLyogXCUxLi45IHZhcmlhYmxlcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmKHRvcGFyZ1t6XSkscCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmKG1fYXJnW21hY2x2bF1bel0pLHApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodHJhX2FzZykgdHJhY2V2YWwobmFtLHApOworICAgICAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIERvbmUuICovCisgICAgfQorCisvKiBOb3QgYSBtYWNybyBhcmd1bWVudCBvciBhIHZhcmlhYmxlLCBzbyBpdCdzIGEgbWFjcm8gZGVmaW5pdGlvbiAqLworCisjaWZkZWYgVVNFX1ZBUkxFTgorICAgIGlmIChmbGFnKSB7CisgICAgICAgIGlmICh0cmFfYXNnKSB0cmFjZXZhbChuYW0scCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX1ZBUkxFTiAqLworICAgIHggPSBpc2FhKG5hbSkgPyAgICAgICAgICAgICAgICAgICAgIC8qIElmIGl0J3MgYW4gYXNzb2NpYXRpdmUgYXJyYXkgKi8KKyAgICAgIG14eGxvb2sobWFjdGFiLG5hbSxubWFjKSA6ICAgICAgICAvKiBsb29rIGl0IHVwIHRoaXMgd2F5ICovCisgICAgICAgIG14bG9vayhtYWN0YWIsbmFtLG5tYWMpOyAgICAgICAgLyogb3RoZXJ3aXNlIHRoaXMgd2F5LiAqLworICAgIGlmICh4ID4gLTEpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGZvdW5kLi4uICovCisgICAgICAgIGlmIChkZWZsZW4gPiAwKSAgICAgICAgICAgICAgICAgLyogYW5kIGEgbmV3IGRlZmluaXRpb24gd2FzIGdpdmVuICovCisgICAgICAgICAgcmVwbGFjaW5nID0gMTsgICAgICAgICAgICAgICAgLyogd2UncmUgcmVwbGFjaW5nICovCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlICovCisgICAgICAgICAgZGVsZXRpbmcgPSAxOyAgICAgICAgICAgICAgICAgLyogd2UncmUgZGVsZXRpbmcgKi8KKyAgICB9CisgICAgaWYgKGRlbGV0aW5nKSB7ICAgICAgICAgICAgICAgICAgICAgLyogRGVsZXRpbmcuLi4gKi8KKyAgICAgICAgaWYgKGRlbG1hYyhuYW0sMCkgPCAwKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIG10Y2hhbmdlZCsrOworICAgICAgICBpZiAodHJhX2FzZykgdHJhY2V2YWwobmFtLHApOworICAgICAgICByZXR1cm4oMCk7CisgICAgfSBlbHNlIGlmIChkZWZsZW4gPCAxKSAgICAgICAgICAgICAgLyogTmV3IG1hY3JvIHdpdGggbm8gZGVmaW5pdGlvbiAqLworICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8uICovCisKKyAgICBpZiAocmVwbGFjaW5nKSB7ICAgICAgICAgICAgICAgICAgICAvKiBSZXBsYWNpbmcgYW4gZXhpc3RpbmcgbWFjcm8gKi8KKyAgICAgICAgaWYgKG1hY3RhYlt4XS5tdmFsKSB7ICAgICAgICAgICAvKiBJZiBpdCBjdXJyZW50bHkgaGFzIGEgZGVmaW5pdGlvbiwgKi8KKyAgICAgICAgICAgIGZyZWUobWFjdGFiW3hdLm12YWwpOyAgICAgICAvKiBmcmVlIGl0LiAqLworICAgICAgICAgICAgbWFjdGFiW3hdLm12YWwgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIG10Y2hhbmdlZCsrOworICAgICAgICB5ID0geDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcGxhY2VtZW50IGluZGV4LiAqLworCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkaW5nIGEgbmV3IG1hY3JvLi4uICovCisgICAgICAgIGNoYXIgYzEsIGMyOyAgICAgICAgICAgICAgICAgICAgLyogVXNlIGZhc3QgbG9va3VwIHRvIGZpbmQgdGhlICovCisgICAgICAgIGMxID0gKm5hbTsgICAgICAgICAgICAgICAgICAgICAgLyogYWxwaGFiZXRpY2FsIHNsb3QuICovCisgICAgICAgIGlmIChpc3VwcGVyKGMxKSkgYzEgPSAoY2hhcikgdG9sb3dlcihjMSk7CisKKyAgICAgICAgaWYgKG5tYWMgPCA1KSB7ICAgICAgICAgICAgICAgICAvKiBOb3Qgd29ydGggaXQgZm9yIHNtYWxsIHRhYmxlcyAqLworICAgICAgICAgICAgeSA9IDA7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgYmluYXJ5IHNlYXJjaCB0byBmaW5kICovCisgICAgICAgICAgICBpbnQgbG8gPSAwOyAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gc3RhcnQgKi8KKyAgICAgICAgICAgIGludCBoaSA9IG5tYWM7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgY2hhciBjID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChsbysyIDwgaGkgJiYgKytjb3VudCA8IDEyKSB7CisgICAgICAgICAgICAgICAgeSA9IGxvICsgKChoaSAtIGxvKSAvIDIpOworICAgICAgICAgICAgICAgIGMgPSAqKG1hY3RhYlt5XS5rd2QpOworICAgICAgICAgICAgICAgIGlmIChpc3VwcGVyKGMpKSBjID0gKGNoYXIpIHRvbG93ZXIoYyk7CisgICAgICAgICAgICAgICAgaWYgKGMgPCBjMSkgeworICAgICAgICAgICAgICAgICAgICBsbyA9IHk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGkgPSB5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHkgPSAoYyA8IGMxKSA/IGxvKzEgOiBsbzsKKyAgICAgICAgfQorICAgICAgICAvKiBOb3cgc2VhcmNoIGxpbmVhcmx5IGZyb20gc3RhcnRpbmcgbG9jYXRpb24gKi8KKyAgICAgICAgZm9yICggOyB5IDwgTUFDX01BWCAmJiBtYWN0YWJbeV0ua3dkICE9IE5VTEw7IHkrKykgeworICAgICAgICAgICAgYzIgPSAqKG1hY3RhYlt5XS5rd2QpOworICAgICAgICAgICAgaWYgKGlzdXBwZXIoYzIpKSBjMiA9IChjaGFyKSB0b2xvd2VyKGMyKTsKKyAgICAgICAgICAgIGlmIChjMSA+IGMyKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChjMSA8IGMyKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChja3N0cmNtcChuYW0sbWFjdGFiW3ldLmt3ZCwtMSwwKSA8PSAwKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoeSA9PSBNQUNfTUFYKSB7ICAgICAgICAgICAgIC8qIE1hY3JvIHRhYmxlIGlzIGZ1bGwuICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJhZGRtYWMgdGFibGUgb3ZlcmZsb3ciLCIiLHkpOworICAgICAgICAgICAgcHJpbnRmKCI/TWFjcm8gdGFibGUgb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFjdGFiW3ldLmt3ZCAhPSBOVUxMKSB7ICAgIC8qIE11c3QgaW5zZXJ0ICovCisgICAgICAgICAgICBmb3IgKGkgPSBubWFjOyBpID4geTsgaS0tKSB7IC8qIE1vdmUgdGhlIHJlc3QgZG93biBvbmUgc2xvdCAqLworICAgICAgICAgICAgICAgIG1hY3RhYltpXS5rd2QgPSBtYWN0YWJbaS0xXS5rd2Q7CisgICAgICAgICAgICAgICAgbWFjdGFiW2ldLm12YWwgPSBtYWN0YWJbaS0xXS5tdmFsOworICAgICAgICAgICAgICAgIG1hY3RhYltpXS5mbGdzID0gbWFjdGFiW2ktMV0uZmxnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtdGNoYW5nZWQrKzsKKyAgICAgICAgcCA9IG1hbGxvYyhuYW1sZW4gKyAxKTsgICAgICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgbmFtZSAqLworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIHByaW50ZigiP0FkZG1hYzogT3V0IG9mIG1lbW9yeSAtIFwiJXNcIlxuIixuYW0pOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBzdHJjcHkocCxuYW0pOyAgICAgICAgICAgICAgICAgIC8qIENvcHkgbmFtZSBpbnRvIG5ldyBzcGFjZSAoU0FGRSkgKi8KKyAgICAgICAgbWFjdGFiW3ldLmt3ZCA9IHA7ICAgICAgICAgICAgICAvKiBBZGQgcG9pbnRlciB0byB0YWJsZSAqLworICAgIH0KKyAgICBpZiAoZGVmbGVuID4gMCkgeyAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgZGVmaW5pdGlvbiAqLworICAgICAgICBwID0gbWFsbG9jKGRlZmxlbiArIDEpOyAgICAgICAgIC8qIEdldCBzcGFjZSAqLworICAgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICBwcmludGYoIj9TcGFjZSBleGhhdXN0ZWQgLSBcIiVzXCJcbiIsIG5hbSk7CisgICAgICAgICAgICBpZiAobWFjdGFiW3ldLmt3ZCkgeworICAgICAgICAgICAgICAgIGZyZWUobWFjdGFiW3ldLmt3ZCk7CisgICAgICAgICAgICAgICAgbWFjdGFiW3ldLmt3ZCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyY3B5KHAsZGVmKTsgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGRlZmluaXRpb24gKFNBRkUpICovCisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZpbml0aW9uIGlzIGVtcHR5ICovCisgICAgICAgIHAgPSBOVUxMOworICAgIH0KKyAgICBtYWN0YWJbeV0ubXZhbCA9IHA7ICAgICAgICAgICAgICAgICAvKiBNYWNybyBwb2ludHMgdG8gZGVmaW5pdGlvbiAqLworICAgIG1hY3RhYlt5XS5mbGdzID0gMDsgICAgICAgICAgICAgICAgIC8qIE5vIGZsYWdzICovCisgICAgaWYgKCFyZXBsYWNpbmcpICAgICAgICAgICAgICAgICAgICAgLyogSWYgbmV3IG1hY3JvICovCisgICAgICBubWFjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY291bnQgaXQgKi8KKyAgICBpZiAodHJhX2FzZykgdHJhY2V2YWwobmFtLHApOworICAgIHJldHVybih5KTsKK30KKworaW50Cit4ZGVsbWFjKHgpIGludCB4OyB7ICAgICAgICAgICAgICAgICAgICAgLyogRGVsZXRlIGEgbWFjcm8gZ2l2ZW4gaXRzIGluZGV4ICovCisgICAgaW50IGk7CisgICAgZXh0ZXJuIGludCB0cmFfYXNnOworICAgIGlmICh4IDwgMCkgcmV0dXJuKHgpOworICAgIGlmICh0cmFfYXNnKQorICAgICAgdHJhY2V2YWwobWFjdGFiW3hdLmt3ZCxOVUxMKTsKKworICAgIGlmIChtYWN0YWJbeF0ua3dkKSB7ICAgICAgICAgICAgICAgIC8qIEZyZWUgdGhlIHN0b3JhZ2UgZm9yIHRoZSBuYW1lICovCisgICAgICAgIGZyZWUobWFjdGFiW3hdLmt3ZCk7CisgICAgICAgIG1hY3RhYlt4XS5rd2QgPSBOVUxMOworICAgIH0KKyAgICBpZiAobWFjdGFiW3hdLm12YWwpIHsgICAgICAgICAgICAgICAvKiBhbmQgZm9yIHRoZSBkZWZpbml0aW9uICovCisgICAgICAgIGZyZWUobWFjdGFiW3hdLm12YWwpOworICAgICAgICBtYWN0YWJbeF0ubXZhbCA9IE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IHg7IGkgPCBubWFjOyBpKyspIHsgICAgICAgIC8qIE5vdyBtb3ZlIHVwIHRoZSBvdGhlcnMuICovCisgICAgICAgIG1hY3RhYltpXS5rd2QgPSBtYWN0YWJbaSsxXS5rd2Q7CisgICAgICAgIG1hY3RhYltpXS5tdmFsID0gbWFjdGFiW2krMV0ubXZhbDsKKyAgICAgICAgbWFjdGFiW2ldLmZsZ3MgPSBtYWN0YWJbaSsxXS5mbGdzOworICAgIH0KKyAgICBubWFjLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmUgbGVzcyBtYWNybyAqLworCisgICAgbWFjdGFiW25tYWNdLmt3ZCA9IE5VTEw7ICAgICAgICAgICAgLyogRGVsZXRlIGxhc3QgaXRlbSBmcm9tIHRhYmxlICovCisgICAgbWFjdGFiW25tYWNdLm12YWwgPSBOVUxMOworICAgIG1hY3RhYltubWFjXS5mbGdzID0gMDsKKyAgICBtdGNoYW5nZWQrKzsKKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorZGVsbWFjKG5hbSxleGFjdCkgY2hhciAqbmFtOyBpbnQgZXhhY3Q7IHsgLyogRGVsZXRlIHRoZSBuYW1lZCBtYWNybyAqLworICAgIGludCB4LCB6OworICAgIGNoYXIgKnAsIGM7CisgICAgZXh0ZXJuIGludCB0cmFfYXNnOworCisgICAgaWYgKCFuYW0pIHJldHVybigwKTsgICAgICAgICAgICAgICAgLyogV2F0Y2ggb3V0IGZvciBudWxsIHBvaW50ZXIgKi8KKyAgICBkZWJ1ZyhGMTEwLCJkZWxtYWMgbmFtIixuYW0sMCk7CisjaWZkZWYgSUtTRAorICAgIGlmICggaW5zZXJ2ZXIgJiYKKyNpZmRlZiBJS1NEQ09ORgorICAgICAgICBpa3NkY2YKKyNlbHNlIC8qIElLU0RDT05GICovCisgICAgICAgIDEKKyNlbmRpZiAvKiBJS1NEQ09ORiAqLworICAgICAgICApIHsKKyAgICAgICAgaWYgKCFja3N0cmNtcCgib25fZXhpdCIsbmFtLC0xLDApIHx8CisgICAgICAgICAgICAhY2tzdHJjbXAoIm9uX2xvZ291dCIsbmFtLC0xLDApKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKworICAgIGlmICgqbmFtID09IENNRFEpIG5hbSsrOworICAgIGlmICgqbmFtID09ICclJykgeyAgICAgICAgICAgICAgICAgIC8qIElmIGl0J3MgYSB2YXJpYWJsZSBuYW1lICovCisgICAgICAgIGlmICghKGMgPSAqKG5hbSsxKSkpIHJldHVybigwKTsgLyogR2V0IHZhcmlhYmxlIG5hbWUgbGV0dGVyIG9yIGRpZ2l0ICovCisgICAgICAgIHAgPSAoY2hhciAqKTA7ICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB2YWx1ZSBwb2ludGVyICovCisgICAgICAgIGlmIChtYWNsdmwgPCAwICYmIGMgPj0gJzAnICYmIGMgPD0gJzknKSB7IC8qIFRvcC1sZXZlbCBkaWdpdD8gKi8KKyAgICAgICAgICAgIHAgPSB0b3BhcmdbYyAtICcwJ107CisgICAgICAgICAgICBpZiAocCkgaWYgKHAgIT0gZ192YXJbY10pIHsKKyAgICAgICAgICAgICAgICBmcmVlKHApOworICAgICAgICAgICAgICAgIHRvcGFyZ1tjIC0gJzAnXSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwID0gZ192YXJbY107CisgICAgICAgICAgICBnX3ZhcltjXSA9IE5VTEw7ICAgICAgICAgICAgLyogWmVybyB0aGUgdGFibGUgZW50cnkgKi8KKyAgICAgICAgfSBlbHNlIGlmIChtYWNsdmwgPiAtMSAmJiBjID49ICcwJyAmJiBjIDw9ICc5JykgeyAvKiBEaWdpdD8gKi8KKyAgICAgICAgICAgIHAgPSBtX3hhcmdbbWFjbHZsXVtjIC0gJzAnXTsKKyAgICAgICAgICAgIGlmIChwKSBpZiAocCAhPSBnX3ZhcltjXSkgeworICAgICAgICAgICAgICAgIGZyZWUocCk7CisgICAgICAgICAgICAgICAgbV94YXJnW21hY2x2bF1bYyAtICcwJ10gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcCA9IG1fYXJnW21hY2x2bF1bYyAtICcwJ107IC8qIEdldCBwb2ludGVyIGZyb20gbWFjcm8tYXJnIHRhYmxlICovCisgICAgICAgICAgICBtX2FyZ1ttYWNsdmxdW2MgLSAnMCddID0gTlVMTDsgLyogWmVybyB0aGUgdGFibGUgcG9pbnRlciAqLworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0J3MgYSBnbG9iYWwgdmFyaWFibGUgKi8KKyAgICAgICAgICAgIGlmIChjIDwgMzMgfHwgKHVuc2lnbmVkIGludCljID4gR1ZBUlMpIHJldHVybigwKTsKKyAgICAgICAgICAgIHAgPSBnX3ZhcltjXTsgICAgICAgICAgICAgICAvKiBHZXQgcG9pbnRlciBmcm9tIGdsb2JhbC12YXIgdGFibGUgKi8KKyAgICAgICAgICAgIGdfdmFyW2NdID0gTlVMTDsgICAgICAgICAgICAvKiBaZXJvIHRoZSB0YWJsZSBlbnRyeSAqLworICAgICAgICB9CisgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMDEwLCJkZWxtYWMgZGVmIixwLDApOworICAgICAgICAgICAgZnJlZShwKTsgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgdGhlIHN0b3JhZ2UgKi8KKyAgICAgICAgICAgIHAgPSBOVUxMOworICAgICAgICB9IGVsc2UgZGVidWcoRjExMCwiZGVsbWFjIGRlZiIsIihudWxsIHBvaW50ZXIpIiwwKTsKKyAgICAgICAgaWYgKHRyYV9hc2cpIHRyYWNldmFsKG5hbSxOVUxMKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBpZiAoKm5hbSA9PSAnJicpIHsgICAgICAgICAgICAgICAgICAvKiBBbiBhcnJheSByZWZlcmVuY2U/ICovCisgICAgICAgIGNoYXIgKipxOworICAgICAgICBpZiAoYXJyYXluYW0obmFtLCZ4LCZ6KSA8IDApICAgIC8qIElmIHN5bnRheCBpcyBiYWQgKi8KKyAgICAgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gLTEuICovCisgICAgICAgIHggLT0gQVJSQVlCQVNFOyAgICAgICAgICAgICAgICAgLyogQ29udmVydCBuYW1lIHRvIG51bWJlci4gKi8KKyAgICAgICAgaWYgKChxID0gYV9wdHJbeF0pID09IE5VTEwpICAgICAvKiBJZiBhcnJheSBub3QgZGVjbGFyZWQsICovCisgICAgICAgICAgcmV0dXJuKC0yKTsgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIC0yLiAqLworICAgICAgICBpZiAoeiA+IGFfZGltW3hdKSAgICAgICAgICAgICAgIC8qIElmIHN1YnNjcmlwdCBvdXQgb2YgcmFuZ2UsICovCisgICAgICAgICAgcmV0dXJuKC0zKTsgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIC0zLiAqLworICAgICAgICBpZiAocVt6XSkgeyAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGFuIG9sZCB2YWx1ZSwgKi8KKyAgICAgICAgICAgIGRlYnVnKEYwMTAsImRlbG1hYyBkZWYiLHFbel0sMCk7CisgICAgICAgICAgICBpZiAoeCAhPSAwKSAgICAgICAgICAgICAgICAgLyogTWFjcm8gYXJnIHZlY3RvciBpcyBqdXN0IGEgY29weSAqLworICAgICAgICAgICAgICBmcmVlKHFbel0pOyAgICAgICAgICAgICAgIC8qIE90aGVycyBhcmUgcmVhbCBzbyBmcmVlIHRoZW0gKi8KKyAgICAgICAgICAgIHFbel0gPSBOVUxMOworICAgICAgICAgICAgaWYgKHggPT0gMCkgeyAgICAgICAgICAgICAgIC8qIEFyZyB2ZWN0b3IgYXJyYXkgKi8KKyAgICAgICAgICAgICAgICBpZiAoeiA+PSAwICYmIHogPD0gOSkgeyAvKiBDb3B5IHZhbHVlcyB0byBjb3JyZXNwb25kaW5nICAqLworICAgICAgICAgICAgICAgICAgICBpZiAobWFjbHZsIDwgMCkgeyAgIC8qIFwlMS4uOSB2YXJpYWJsZXMuICovCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCYodG9wYXJnW3pdKSxOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJihtX2FyZ1ttYWNsdmxdW3pdKSxOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0cmFfYXNnKSB0cmFjZXZhbChuYW0sTlVMTCk7CisgICAgICAgIH0gZWxzZSBkZWJ1ZyhGMDEwLCJkZWxtYWMgZGVmIiwiKG51bGwgcG9pbnRlcikiLDApOworICAgIH0KKworICAgLyogTm90IGEgdmFyaWFibGUgb3IgYW4gYXJyYXksIHNvIGl0IG11c3QgYmUgYSBtYWNyby4gKi8KKworICAgIHogPSBpc2FhKG5hbSk7CisgICAgZGVidWcoRjExMSwiZGVsbWFjIGlzYWEiLG5hbSx6KTsKKyAgICBkZWJ1ZyhGMTExLCJkZWxtYWMgZXhhY3QiLG5hbSxleGFjdCk7CisgICAgeCA9IHogPyBteHhsb29rKG1hY3RhYixuYW0sbm1hYykgOgorICAgICAgZXhhY3QgPyBteGxvb2sobWFjdGFiLG5hbSxubWFjKSA6CisgICAgICAgIG1sb29rKG1hY3RhYixuYW0sbm1hYyk7CisgICAgaWYgKHggPCAwKSB7CisgICAgICAgIGRlYnVnKEYxMTEsImRlbG1hYyBtbG9vayIsbmFtLHgpOworICAgICAgICByZXR1cm4oeCk7CisgICAgfQorICAgIHJldHVybih4ZGVsbWFjKHgpKTsKK30KKworVk9JRAoraW5pdG1hYygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXQgbWFjcm8gJiB2YXJpYWJsZSB0YWJsZXMgKi8KKyAgICBpbnQgaSwgaiwgeDsKKworICAgIG5tYWMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIG1hY3JvcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNQUNfTUFYOyBpKyspIHsgICAgIC8qIEluaXRpYWxpemUgdGhlIG1hY3JvIHRhYmxlICovCisgICAgICAgIG1hY3RhYltpXS5rd2QgPSBOVUxMOworICAgICAgICBtYWN0YWJbaV0ubXZhbCA9IE5VTEw7CisgICAgICAgIG1hY3RhYltpXS5mbGdzID0gMDsKKyAgICB9CisgICAgbXRjaGFuZ2VkKys7CisgICAgeCA9IChNQVhBUkdMSVNUICsgMSkgKiBzaXplb2YoY2hhciAqKik7CisgICAgZm9yIChpID0gMDsgaSA8IE1BQ0xFVkVMOyBpKyspIHsgICAgLyogSW5pdCB0aGUgbWFjcm8gYXJndW1lbnQgdGFibGVzICovCisgICAgICAgIG1feGFyZ1tpXSA9IChjaGFyICoqKSBtYWxsb2MoeCk7CisgICAgICAgIG1ydmFsW2ldID0gTlVMTDsgICAgICAgICAgICAgICAgLyogTWFjcm8gcmV0dXJuIHZhbHVlICovCisgICAgICAgIC8qIFBvaW50ZXIgdG8gZW50aXJlIGFyZ3VtZW50IHZlY3RvciwgbGV2ZWwgaSwgZm9yIFwmX1tdIGFycmF5ICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPD0gTUFYQVJHTElTVDsgaisrKSB7IC8qIE1hY3JvIGFyZ3VtZW50IGxpc3QgKi8KKyAgICAgICAgICAgIGlmIChqIDwgMTApICAgICAgICAgICAgICAgICAvKiBGb3IgdGhlIFwlMC4uXCU5IHZhcmlhYmxlcyAqLworICAgICAgICAgICAgICBtX2FyZ1tpXVtqXSA9IE5VTEw7ICAgICAgIC8qIFBvaW50ZXIgdG8gYXJnIGosIGxldmVsIGkuICovCisgICAgICAgICAgICBpZiAobV94YXJnW2ldKSAgICAgICAgICAgICAgLyogRm9yIFwmX1tdIC0gYWxsIGFyZ3MuICovCisgICAgICAgICAgICAgIG1feGFyZ1tpXVtqXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IEdWQVJTOyBpKyspIHsgICAgICAgLyogQW5kIHRoZSBnbG9iYWwgdmFyaWFibGVzIHRhYmxlICovCisgICAgICAgIGdfdmFyW2ldID0gTlVMTDsKKyAgICB9CisgICAgLyogQW5kIHRoZSB0YWJsZSBvZiBhcnJheXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgJ3onIC0gQVJSQVlCQVNFICsgMTsgaSsrKSB7CisgICAgICAgIGFfcHRyW2ldID0gKGNoYXIgKiopIE5VTEw7ICAgICAgLyogTnVsbCBwb2ludGVyIGZvciBlYWNoICovCisgICAgICAgIGFfZGltW2ldID0gMDsgICAgICAgICAgICAgICAgICAgLyogYW5kIGEgZGltZW5zaW9uIG9mIHplcm8gKi8KKyAgICAgICAgYV9saW5rW2ldID0gLTE7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBDTURTVEtMOyBqKyspIHsKKyAgICAgICAgICAgIGFhX3B0cltqXVtpXSA9IChjaGFyICoqKSBOVUxMOworICAgICAgICAgICAgYWFfZGltW2pdW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50Citwb3BjbHZsKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9wIGNvbW1hbmQgbGV2ZWwsIHJldHVybiBjbWRsdmwgKi8KKyAgICBleHRlcm4gaW50IHRyYV9jbWQ7CisgICAgc3RydWN0IGxvY2FsdmFyICogdjsKKyAgICBpbnQgaSwgdG9wY21kOworICAgIGRlYnVnKEYxMDEsInBvcGNsdmwgY21kbHZsIiwiIixjbWRsdmwpOworICAgIGlmIChjbWRsdmwgPiAwKSB7CisgICAgICAgIGlmICgodiA9IGxvY2FsaGVhZFtjbWRsdmxdKSkgeyAgLyogRGlkIHdlIHNhdmUgYW55IHZhcmlhYmxlcz8gKi8KKyAgICAgICAgICAgIHdoaWxlICh2KSB7ICAgICAgICAgICAgICAgICAvKiBZZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAodi0+bHZfdmFsdWUpICAgICAgICAvKiBDb3B5IG9sZCBvbmVzIGJhY2sgKi8KKyAgICAgICAgICAgICAgICAgIGFkZG1hYyh2LT5sdl9uYW1lLHYtPmx2X3ZhbHVlKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBkZWxtYWModi0+bHZfbmFtZSwxKTsKKyAgICAgICAgICAgICAgICB2ID0gdi0+bHZfbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWVsb2NhbChjbWRsdmwpOyAgICAgICAgICAvKiBGcmVlIGxvY2FsIHN0b3JhZ2UgKi8KKyAgICAgICAgfQorICAgICAgICAvKiBBdXRvbWF0aWMgYXJyYXlzIGRvIG5vdCB1c2UgdGhlIGxvY2FsaGVhZCBsaXN0ICovCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI4OyBpKyspIHsgICAgICAvKiBGcmVlIGFueSBsb2NhbCBhcnJheXMgKi8KKyAgICAgICAgICAgIGlmIChhYV9wdHJbY21kbHZsXVtpXSkgeyAvKiBEb2VzIHRoaXMgb25lIGV4aXN0PyAqLworICAgICAgICAgICAgICAgIGRjbGFycmF5KChjaGFyKShpK0FSUkFZQkFTRSksMCk7IC8qIERlc3Ryb3kgZ2xvYmFsIG9uZSAqLworICAgICAgICAgICAgICAgIGFfcHRyW2ldID0gYWFfcHRyW2NtZGx2bF1baV07CisgICAgICAgICAgICAgICAgYV9kaW1baV0gPSBhYV9kaW1bY21kbHZsXVtpXTsKKyAgICAgICAgICAgICAgICBhYV9wdHJbY21kbHZsXVtpXSA9IChjaGFyICoqKU5VTEw7CisgICAgICAgICAgICAgICAgYWFfZGltW2NtZGx2bF1baV0gPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChhYV9kaW1bY21kbHZsXVtpXSA9PSAtMjMpIHsgLyogU2VjcmV0IGNvZGUgKi8KKyAgICAgICAgICAgICAgICBkY2xhcnJheSgoY2hhcikoaStBUlJBWUJBU0UpLDApOyAvKiAoc2VlIHB1c2hhcnJheSgpKSAqLworICAgICAgICAgICAgICAgIGFhX3B0cltjbWRsdmxdW2ldID0gKGNoYXIgKiopTlVMTDsKKyAgICAgICAgICAgICAgICBhYV9kaW1bY21kbHZsXVtpXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE90aGVyd2lzZSBkbyBub3RoaW5nIC0gaXQgaXMgYSBsb2NhbCBhcnJheSB0aGF0IHdhcyBkZWNsYXJlZCAqLworICAgICAgICAgICAgLyogYXQgYSBsZXZlbCBhYm92ZSB0aGlzIG9uZSBzbyBsZWF2ZSBpdCBhbG9uZS4gKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY21kbHZsIDwgMSkgeyAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSdyZSBhbHJlYWR5IGF0IHRvcCBsZXZlbCAqLworICAgICAgICBjbWRsdmwgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3QgbWFrZSBzdXJlIGFsbCB0aGUgKi8KKyAgICAgICAgdGxldmVsID0gLTE7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFjayBwb2ludGVycyBhcmUgc2V0IHJpZ2h0ICovCisgICAgICAgIG1hY2x2bCA9IC0xOyAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiAqLworICAgIH0gZWxzZSBpZiAoY21kc3RrW2NtZGx2bF0uc3JjID09IENNRF9URikgeyAvKiBSZWFkaW5nIGZyb20gVEFLRSBmaWxlPyAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJwb3BjbHZsIHRsZXZlbCIsIiIsdGxldmVsKTsKKyAgICAgICAgaWYgKHRsZXZlbCA+IC0xKSB7ICAgICAgICAgICAgICAvKiBZZXMsICovCisgICAgICAgICAgICBmY2xvc2UodGZpbGVbdGxldmVsXSk7ICAgICAgLyogY2xvc2UgaXQgKi8KKworICAgICAgICAgICAgaWYgKHRyYV9jbWQpCisgICAgICAgICAgICAgIHByaW50ZigiWyVkXSAtRjogXCIlc1wiXG4iLGNtZGx2bCx0Zm5hbVt0bGV2ZWxdKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIkNNRCAtRiIsdGZuYW1bdGxldmVsXSxjbWRsdmwpOworICAgICAgICAgICAgaWYgKHRmbmFtW3RsZXZlbF0pIHsgICAgICAgIC8qIGZyZWUgc3RvcmFnZSBmb3IgbmFtZSAqLworICAgICAgICAgICAgICAgIGZyZWUodGZuYW1bdGxldmVsXSk7CisgICAgICAgICAgICAgICAgdGZuYW1bdGxldmVsXSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bGV2ZWwtLTsgICAgICAgICAgICAgICAgICAgLyogYW5kIHBvcCB0YWtlIGxldmVsICovCisgICAgICAgICAgICBjbWRsdmwtLTsgICAgICAgICAgICAgICAgICAgLyogYW5kIGNvbW1hbmQgbGV2ZWwgKi8KKyAgICAgICAgICAgIHF1aWV0ID0geHF1aWV0W2NtZGx2bF07CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHRsZXZlbCA9IC0xOworICAgIH0gZWxzZSBpZiAoY21kc3RrW2NtZGx2bF0uc3JjID09IENNRF9NRCkgeyAvKiBJbiBhIG1hY3JvPyAqLworICAgICAgICB0b3BjbWQgPSBsYXN0Y21kW21hY2x2bF07CisgICAgICAgIGRlYnVnKEYxMDEsInBvcGNsdmwgbWFjbHZsIiwiIixtYWNsdmwpOworICAgICAgICBpZiAobWFjbHZsID4gLTEpIHsgICAgICAgICAgICAgIC8qIFllcywgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGNoYXIgKipxOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIG1hY3BbbWFjbHZsXSA9ICIiOyAgICAgICAgICAvKiBzZXQgbWFjcm8gcG9pbnRlciB0byBudWxsIHN0cmluZyAqLworICAgICAgICAgICAgKmNtZGJ1ZiA9ICdcMCc7ICAgICAgICAgICAgIC8qIGNsZWFyIHRoZSBjb21tYW5kIGJ1ZmZlciAqLworCisgICAgICAgICAgICBpZiAoKG1hY2x2bCA+IDApICYmICAgICAgICAgLyogMiBNYXkgMTk5OSAqLworICAgICAgICAgICAgICAgIChtX2FyZ1ttYWNsdmwtMV1bMF0pICYmCisgICAgICAgICAgICAgICAgKCFzdHJuY21wKG1fYXJnW21hY2x2bC0xXVswXSwiX3hpZiIsNCkgfHwKKyAgICAgICAgICAgICAgICAgIXN0cm5jbXAobV9hcmdbbWFjbHZsLTFdWzBdLCJfZm9yIiw0KSB8fAorICAgICAgICAgICAgICAgICAhc3RybmNtcChtX2FyZ1ttYWNsdmwtMV1bMF0sIl9zd2kiLDQpIHx8CisgICAgICAgICAgICAgICAgICFzdHJuY21wKG1fYXJnW21hY2x2bC0xXVswXSwiX3doaSIsNCkpICYmCisgICAgICAgICAgICAgICAgbXJ2YWxbbWFjbHZsKzFdKSB7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmKG1ydmFsW21hY2x2bC0xXSksbXJ2YWxbbWFjbHZsKzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYWNsdmwrMSA8IE1BQ0xFVkVMKSB7CisgICAgICAgICAgICAgICAgaWYgKG1ydmFsW21hY2x2bCsxXSkgeyAgLyogRnJlZSBhbnkgZGVlcGVyIHJldHVybiB2YWx1ZXMuICovCisgICAgICAgICAgICAgICAgICAgIGZyZWUobXJ2YWxbbWFjbHZsKzFdKTsKKyAgICAgICAgICAgICAgICAgICAgbXJ2YWxbbWFjbHZsKzFdID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHJhX2NtZCkKKyAgICAgICAgICAgICAgcHJpbnRmKCJbJWRdIC1NOiBcIiVzXCJcbiIsY21kbHZsLG1fYXJnW2NtZHN0a1tjbWRsdmxdLmx2bF1bMF0pOworICAgICAgICAgICAgZGVidWcoRjExMSwiQ01EIC1NIixtX2FyZ1tjbWRzdGtbY21kbHZsXS5sdmxdWzBdLGNtZGx2bCk7CisKKyAgICAgICAgICAgIG1hY2x2bC0tOyAgICAgICAgICAgICAgICAgICAvKiBQb3AgbWFjcm8gbGV2ZWwgKi8KKyAgICAgICAgICAgIGNtZGx2bC0tOyAgICAgICAgICAgICAgICAgICAvKiBhbmQgY29tbWFuZCBsZXZlbCAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwicG9wY2x2bCBtYWMgbmV3IG1hY2x2bCIsIiIsbWFjbHZsKTsKKyAgICAgICAgICAgIGRlYnVnKEYwMTAsInBvcGNsdmwgbWFjIG1ydmFsW21hY2x2bCsxXSIsbXJ2YWxbbWFjbHZsKzJdLDApOworCisgICAgICAgICAgICBxdWlldCA9IHhxdWlldFtjbWRsdmxdOworICAgICAgICAgICAgaWYgKG1hY2x2bCA+IC0xKSB7CisgICAgICAgICAgICAgICAgYV9wdHJbMF0gPSBtX3hhcmdbbWFjbHZsXTsKKyAgICAgICAgICAgICAgICBhX2RpbVswXSA9IG5feGFyZ1ttYWNsdmxdIC0gMTsKKwkJZGVidWcoRjExMSwiYV9kaW1bMF0iLCJCIixhX2RpbVswXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFfcHRyWzBdID0gdG9weGFyZzsKKyAgICAgICAgICAgICAgICBhX2RpbVswXSA9IHRvcGFyZ2MgLSAxOworCQlkZWJ1ZyhGMTExLCJhX2RpbVswXSIsIkMiLGFfZGltWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hY2x2bCA9IC0xOworICAgICAgICB9CisjaWZuZGVmIE5PU0VYUAorICAgICAgICBkZWJ1ZyhGMTAxLCJwb3BjbHZsIHRvcGNtZCIsIiIsdG9wY21kKTsKKyAgICAgICAgaWYgKHRvcGNtZCA9PSBYWFNFWFApIHsKKyAgICAgICAgICAgIGV4dGVybiBjaGFyICogc2V4cHZhbDsKKyAgICAgICAgICAgIG1ha2VzdHIoJihtcnZhbFttYWNsdmwrMV0pLHNleHB2YWwpOworICAgICAgICB9CisjZW5kaWYgLyogTk9TRVhQICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgY21kbHZsLS07CisgICAgfQorICAgIGRlYnVnKEYxMDEsInBvcGNsdmwgY21kbHZsIiwiIixjbWRsdmwpOworICAgIGlmIChwcnN0cmluZ1tjbWRsdmxdKSB7CisgICAgICAgIGNtc2V0cChwcnN0cmluZ1tjbWRsdmxdKTsKKyAgICAgICAgbWFrZXN0cigmKHByc3RyaW5nW2NtZGx2bF0pLE5VTEwpOworICAgIH0KKyNpZm5kZWYgTUFDCisgICAgaWYgKGNtZGx2bCA8IDEgfHwgeGNtZHNyYyA9PSBDTURfS0IpIHsgLyogSWYgYXQgcHJvbXB0ICovCisgICAgICAgIHNldGludCgpOworICAgICAgICBjb25jYigoY2hhcillc2NhcGUpOyAgICAgICAgICAgIC8qIEdvIGludG8gY2JyZWFrIG1vZGUgKi8KKyAgICB9CisjZW5kaWYgLyogTUFDICovCisgICAgeGNtZHNyYyA9IGNtZHN0a1tjbWRsdmxdLnNyYzsKKyAgICBkZWJ1ZyhGMTAxLCJwb3BjbHZsIHhjbWRzcmMiLCIiLHhjbWRzcmMpOworICAgIGRlYnVnKEYxMDEsInBvcGNsdmwgdGxldmVsIiwiIix0bGV2ZWwpOworICAgIHJldHVybihjbWRsdmwgPCAxID8gMCA6IGNtZGx2bCk7ICAgIC8qIFJldHVybiBjb21tYW5kIGxldmVsICovCit9CisjZWxzZSAvKiBObyBzY3JpcHQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgKi8KK2ludCBwb3BjbHZsKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBKdXN0IGNsb3NlIGN1cnJlbnQgdGFrZSBmaWxlLiAqLworICAgIGlmICh0bGV2ZWwgPiAtMSkgeyAgICAgICAgICAgICAgICAgIC8qIGlmIGFueS4uLiAqLworICAgICAgICBpZiAodGZuYW1bdGxldmVsXSkgeworICAgICAgICAgICAgZnJlZSh0Zm5hbVt0bGV2ZWxdKTsKKyAgICAgICAgICAgIHRmbmFtW3RsZXZlbF0gPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGZjbG9zZSh0ZmlsZVt0bGV2ZWwtLV0pOworICAgIH0KKyAgICBpZiAodGxldmVsID09IC0xKSB7ICAgICAgICAgICAgICAgICAvKiBBbmQgaWYgYmFjayBhdCB0b3AgbGV2ZWwgKi8KKyAgICAgICAgc2V0aW50KCk7CisgICAgICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7ICAgICAgICAgICAgLyogYW5kIGdvIGJhY2sgaW50byBjYnJlYWsgbW9kZS4gKi8KKyAgICB9CisgICAgeGNtZHNyYyA9IHRsZXZlbCA+IC0xID8gQ01EX1RGIDogMDsKKyAgICByZXR1cm4odGxldmVsICsgMSk7Cit9CisjZW5kaWYgLyogTk9TUEwgKi8KKworCisjaWZuZGVmIE5PU1BMCitzdGF0aWMgaW50Citpc2VvbShtKSBjaGFyICogbTsgeyAgICAgICAgICAgICAgICAgICAgLyogVGVzdCBpZiBhdCBlbmQgb2YgbWFjcm8gZGVmICovCisgICAgaWYgKCFtKQorICAgICAgbSA9ICIiOworICAgIGRlYnVnKEYxMTEsImlzZW9tIixtLG1hY2x2bCk7CisgICAgd2hpbGUgKCptKSB7CisgICAgICAgIC8qIEFueXRoaW5nIGJ1dCBTcGFjZSBhbmQgQ29tbWEgbWVhbnMgbW9yZSBtYWNybyBpcyBsZWZ0ICovCisgICAgICAgIGlmICgoKm0gPiBTUCkgJiYgKCptICE9ICcsJykpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImlzZW9tIHJldHVybiIsbSwwKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgICAgICBtKys7CisgICAgfQorICAgIGRlYnVnKEYxMTEsImlzZW9tIHJldHVybiIsbSwxKTsKKyAgICByZXR1cm4oMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3RoaW5nIGxlZnQgKi8KK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCisvKiBQb3AgYWxsIGNvbW1hbmQgbGV2ZWxzIHRoYXQgY2FuIGJlIHBvcHBlZCAqLworCitpbnQKK3ByZXBvcCgpIHsKKyAgICBpZiAoY21kbHZsID4gMCkgeyAgICAgICAgICAgICAgICAgICAvKiBJZiBjb21tYW5kIGxldmVsIGlzID4gMCBhbmQuLi4gKi8KKyAgICAgICAgd2hpbGUgKAorI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgICAgKChjbWRzdGtbY21kbHZsXS5zcmMgPT0gQ01EX1RGKSAmJiAvKiBDb21tYW5kIHNvdXJjZSBpcyBmaWxlICovCisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgICAgICh0bGV2ZWwgPiAtMSkgJiYKKyAgICAgICAgICAgIGZlb2YodGZpbGVbdGxldmVsXSkpICAgICAgICAvKiBBbmQgYXQgZW5kIG9mIGZpbGUuLi4gKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgIC8qIE9yIGNvbW1hbmQgc291cmNlIGlzIG1hY3JvLi4uICovCisgICAgICAgICAgICAgICB8fCAoKGNtZHN0a1tjbWRsdmxdLnNyYyA9PSBDTURfTUQpICYmCisgICAgICAgICAgICAgICAgKG1hY2x2bCA+IC0xKSAmJgorICAgICAgICAgICAgICAgIGlzZW9tKG1hY3BbbWFjbHZsXSkpKSAgLyogYW5kIGF0IGVuZCBvZiBtYWNybywgdGhlbi4uLiAqLworI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgIHsKKyAgICAgICAgICAgICAgcG9wY2x2bCgpOyAgICAgICAgICAgICAgICAvKiBwb3AgY29tbWFuZCBsZXZlbC4gKi8KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oY21kbHZsIDwgMSA/IDAgOiBjbWRsdmwpOyAgICAvKiBSZXR1cm4gY29tbWFuZCBsZXZlbCAqLworfQorCisvKiBTVE9QIC0gZ2V0IGJhY2sgdG8gQy1LZXJtaXQgcHJvbXB0LCBubyBtYXR0ZXIgd2hlcmUgZnJvbS4gKi8KKworaW50Citkb3N0b3AoKSB7CisgICAgZXh0ZXJuIGludCBjbWRkZXA7CisgICAgd2hpbGUgKHBvcGNsdmwoKSkgOyAgICAgICAgIC8qIFBvcCBhbGwgbWFjcm9zICYgdGFrZSBmaWxlcyAqLworI2lmbmRlZiBOT1NQTAorICAgIGlmIChjbWRkZXAgPiAtMSkgICAgICAgICAgICAvKiBBbmQgYWxsIHJlY3Vyc2l2ZSBjbWQgcGtnIGludm9jYXRpb25zICovCisgICAgICB3aGlsZSAoY21wb3AoKSA+IC0xKSA7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICBjbWluaShja3hlY2gpOyAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGNvbW1hbmQgYnVmZmVyLiAqLworICAgIHJldHVybigwKTsKK30KKworLyogQ2xvc2UgdGhlIGdpdmVuIGxvZyAqLworCitpbnQKK2RvY2xzbG9nKHgpIGludCB4OyB7CisgICAgaW50IHk7CisgICAgc3dpdGNoICh4KSB7CisjaWZkZWYgREVCVUcKKyAgICAgIGNhc2UgTE9HRDoKKyAgICAgICAgaWYgKGRlYmxvZyA8PSAwKSB7CisgICAgICAgICAgICBwcmludGYoIj9EZWJ1Z2dpbmcgbG9nIHdhc24ndCBvcGVuXG4iKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTAwLCJEZWJ1ZyBMb2cgQ2xvc2VkIiwiIiwwTCk7CisgICAgICAgICpkZWJmaWwgPSAnXDAnOworICAgICAgICBkZWJsb2cgPSAwOworICAgICAgICByZXR1cm4oemNsb3NlKFpERklMRSkpOworI2VuZGlmIC8qIERFQlVHICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgICBjYXNlIExPR1A6CisgICAgICAgIGlmIChwa3Rsb2cgPD0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCI/UGFja2V0IGxvZyB3YXNuJ3Qgb3BlblxuIik7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgKnBrdGZpbCA9ICdcMCc7CisgICAgICAgIHBrdGxvZyA9IDA7CisgICAgICAgIHJldHVybih6Y2xvc2UoWlBGSUxFKSk7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9MT0NBTAorICAgICAgY2FzZSBMT0dTOgorICAgICAgICBpZiAoc2VzbG9nIDw9IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiP1Nlc3Npb24gbG9nIHdhc24ndCBvcGVuXG4iKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgICAgICAqc2VzZmlsID0gJ1wwJzsKKyAgICAgICAgc2V0c2VzbG9nKDApOworICAgICAgICByZXR1cm4oemNsb3NlKFpTRklMRSkpOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmZGVmIFRMT0cKKyAgICAgIGNhc2UgTE9HVDogeworI2lmZGVmIElLU0QKKyAgICAgICAgICBleHRlcm4gaW50IGlrbG9nb3BlbiwgeGZlcmxvZzsKKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgICAgaWYgKHRyYWxvZyA8PSAwCisjaWZkZWYgSUtTRAorICAgICAgICAgICAgICAmJiAhaWtsb2dvcGVuCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgaWYgKG1zZ2ZsZykKKyAgICAgICAgICAgICAgICBwcmludGYoIj9UcmFuc2FjdGlvbiBsb2cgd2Fzbid0IG9wZW5cbiIpOworICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgfQorI2lmZGVmIElLU0QKKyAgICAgICAgICBpZiAoaWtsb2dvcGVuICYmICFpbnNlcnZlcikgeworICAgICAgICAgICAgICBjbG9zZSh4ZmVybG9nKTsKKyAgICAgICAgICAgICAgaWtsb2dvcGVuID0gMDsKKyAgICAgICAgICB9CisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgIGlmICh0cmFsb2cpIHsKKyAgICAgICAgICAgICAgdGxvZyhGMTAwLCJUcmFuc2FjdGlvbiBMb2cgQ2xvc2VkIiwiIiwwTCk7CisgICAgICAgICAgICAgIHpjbG9zZShaVEZJTEUpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdHJhZmlsID0gJ1wwJzsKKyAgICAgICAgICB0cmFsb2cgPSAwOworICAgICAgICAgIHJldHVybigxKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBUTE9HICovCisKKyNpZmRlZiBDS0xPR0RJQUwKKyAgICAgIGNhc2UgTE9HTToKKyAgICAgICAgaWYgKGRpYWxvZyA8PSAwKSB7CisgICAgICAgICAgICBpZiAobXNnZmxnKSBwcmludGYoIj9Db25uZWN0aW9uIGxvZyB3YXNuJ3Qgb3BlblxuIik7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgKmRpYWZpbCA9ICdcMCc7CisgICAgICAgIGRpYWxvZyA9IDA7CisgICAgICAgIHJldHVybih6Y2xvc2UoWkRJRklMKSk7CisjZW5kaWYgLyogQ0tMT0dESUFMICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICAgIGNhc2UgTE9HVzogICAgICAgICAgICAgICAgICAgICAgICAvKiBXUklURSBmaWxlICovCisgICAgICBjYXNlIExPR1I6ICAgICAgICAgICAgICAgICAgICAgICAgLyogUkVBRCBmaWxlICovCisgICAgICAgIHkgPSAoeCA9PSBMT0dSKSA/IFpSRklMRSA6IFpXRklMRTsKKyAgICAgICAgaWYgKGNoa2ZuKHkpIDwgMSkgICAgICAgICAgICAgICAvKiBJZiBubyBmaWxlIHRvIGNsb3NlICovCisgICAgICAgICAgcmV0dXJuKDEpOyAgICAgICAgICAgICAgICAgICAgLyogc3VjY2VlZCBzaWxlbnRseS4gKi8KKyAgICAgICAgcmV0dXJuKHpjbG9zZSh5KSk7ICAgICAgICAgICAgICAvKiBPdGhlcndpc2UsIGNsb3NlIHRoZSBmaWxlLiAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ZigiXG4/VW5leHBlY3RlZCBsb2cgZGVzaWduYXRvciAtICVkXG4iLCB4KTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KK30KKworc3RhdGljIGludCBzbGMgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFNjcmVlbiBsaW5lIGNvdW50ICovCisKK2NoYXIgKgorc2hvd3N0cmluZyhzKSBjaGFyICogczsgeworICAgIHJldHVybihzID8gcyA6ICIobnVsbCkiKTsKK30KKworY2hhciAqCitzaG93b2ZmKHgpIGludCB4OyB7CisgICAgcmV0dXJuKHggPyAib24iIDogIm9mZiIpOworfQorCitjaGFyICoKK3Nob3dvb2EoeCkgaW50IHg7IHsKKyAgICBzd2l0Y2ggKHgpIHsKKyAgICAgIGNhc2UgU0VUX09GRjogIHJldHVybigib2ZmIik7CisgICAgICBjYXNlIFNFVF9PTjogICByZXR1cm4oIm9uIik7CisgICAgICBjYXNlIFNFVF9BVVRPOiByZXR1cm4oImF1dG9tYXRpYyIpOworICAgICAgZGVmYXVsdDogICAgICAgcmV0dXJuKCIodW5rbm93bikiKTsKKyAgICB9Cit9CisKKyNpZmRlZiBHRU1ET1MKK2lzeGRpZ2l0KGMpIGludCBjOyB7CisgICAgcmV0dXJuKGlzZGlnaXQoYykgfHwKKyAgICAgICAgICAgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSB8fAorICAgICAgICAgICAoYyA+PSAnQScgJiYgYyA8PSAnRicpKTsKK30KKyNlbmRpZiAvKiBHRU1ET1MgKi8KKworI2lmbmRlZiBOT1NFVEtFWQorI2lmZGVmIE9TMgorc3RhdGljIHN0cnVjdCBrZXl0YWIgc2hva2V5dGFiW10gPSB7ICAgIC8qIFNIT1cgS0VZIG1vZGVzICovCisgICAgImFsbCIsICAgIDEsIDAsCisgICAgIm9uZSIsICAgIDAsIDAKK307CitzdGF0aWMgaW50IG5zaG9rZXkgPSAoc2l6ZW9mKHNob2tleXRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCisjZGVmaW5lIFNIS0VZREVGIFRUX01BWCs1CitzdHJ1Y3Qga2V5dGFiIHNob2tleW10YWJbXSA9IHsKKyAgICAiYWFhIiwgICAgICAgVFRfQUFBLCAgICAgQ01fSU5WLCAgICAvKiBBbm5BcmJvciAqLworICAgICJhZG0zYSIsICAgICBUVF9BRE0zQSwgICAwLCAgICAgICAgIC8qIExTSSBBRE0tM0EgKi8KKyAgICAiYWRtNSIsICAgICAgVFRfQURNNSwgICAgMCwgICAgICAgICAvKiBMU0kgQURNLTUgKi8KKyAgICAiYWl4dGVybSIsICAgVFRfQUlYVEVSTSwgMCwgICAgICAgICAvKiBJQk0gQUlYdGVybSAqLworICAgICJhbm5hcmJvciIsICBUVF9BQUEsICAgICAwLCAgICAgICAgIC8qIEFubkFyYm9yICovCisgICAgImFuc2ktYmJzIiwgIFRUX0FOU0ksICAgIDAsICAgICAgICAgLyogQU5TSS5TWVMgKEJCUykgKi8KKyAgICAiYXQzODYiLCAgICAgVFRfQVQzODYsICAgMCwgICAgICAgICAvKiBVbml4d2FyZSBBTlNJICovCisgICAgImF2YXRhci8wKyIsIFRUX0FOU0ksICAgIDAsICAgICAgICAgLyogQVZBVEFSLzArICovCisgICAgImJhODAiLCAgICAgIFRUX0JBODAsICAgIDAsICAgICAgICAgLyogTml4ZG9yZiBCQTgwICovCisgICAgImJlIiwgICAgICAgIFRUX0JFT1MsICAgIENNX0lOVnxDTV9BQlIsCisgICAgImJlb3MtYW5zaSIsIFRUX0JFT1MsICAgIENNX0lOViwgICAgLyogQmVPUyBBTlNJICovCisgICAgImJldGVybSIsICAgIFRUX0JFT1MsICAgIDAsICAgICAgICAgLyogQmVPUyBDb25zb2xlICovCisgICAgImQyMDAiLCAgICAgIFRUX0RHMjAwLCAgIENNX0lOVnxDTV9BQlIsIC8qIERhdGEgR2VuZXJhbCBEQVNIRVIgMjAwICovCisgICAgImQyMTAiLCAgICAgIFRUX0RHMjEwLCAgIENNX0lOVnxDTV9BQlIsIC8qIERhdGEgR2VuZXJhbCBEQVNIRVIgMjEwICovCisgICAgImQyMTciLCAgICAgIFRUX0RHMjE3LCAgIENNX0lOVnxDTV9BQlIsIC8qIERhdGEgR2VuZXJhbCBEQVNIRVIgMjE3ICovCisgICAgImRlZmF1bHQiLCAgIFNIS0VZREVGLCAgIDAsCisgICAgImRnMjAwIiwgICAgIFRUX0RHMjAwLCAgIDAsICAgICAgICAgLyogRGF0YSBHZW5lcmFsIERBU0hFUiAyMDAgKi8KKyAgICAiZGcyMTAiLCAgICAgVFRfREcyMTAsICAgMCwgICAgICAgICAvKiBEYXRhIEdlbmVyYWwgREFTSEVSIDIxMCAqLworICAgICJkZzIxNyIsICAgICBUVF9ERzIxNywgICAwLCAgICAgICAgIC8qIERhdGEgR2VuZXJhbCBEQVNIRVIgMjE3ICovCisgICAgImVtYWNzIiwgICAgIFRUX0tCTV9FTUFDUywgICAwLCAgICAgLyogRW1hY3MgbW9kZSAqLworICAgICJoMTkiLCAgICAgICBUVF9IMTksICAgICBDTV9JTlYsICAgIC8qIEhlYXRoLTE5ICovCisgICAgImhlYXRoMTkiLCAgIFRUX0gxOSwgICAgIDAsICAgICAgICAgLyogSGVhdGgtMTkgKi8KKyAgICAiaGVicmV3IiwgICAgVFRfS0JNX0hFQlJFVywgMCwgICAgICAvKiBIZWJyZXcgbW9kZSAqLworICAgICJoZnQiLCAgICAgICBUVF9IRlQsICAgICAwLCAgICAgICAgIC8qIElCTSBIRlQgKi8KKyAgICAiaHAyNjIxYSIsICAgVFRfSFAyNjIxLCAgMCwgICAgICAgICAvKiBIUCAyNjIxQSAqLworICAgICJocHRlcm0iLCAgICBUVF9IUFRFUk0sICAwLCAgICAgICAgIC8qIEhQIFRFUk0gKi8KKyAgICAiaHoxNTAwIiwgICAgVFRfSFpMMTUwMCwgMCwgICAgICAgICAvKiBIYXplbHRpbmUgMTUwMCAqLworICAgICJpYm0zMTUxIiwgICBUVF9JQk0zMSwgICAwLCAgICAgICAgIC8qIElCTSAzMTAxLXh4LDMxNjEgKi8KKyAgICAibGludXgiLCAgICAgVFRfTElOVVgsICAgMCwgICAgICAgICAvKiBMaW51eCAqLworICAgICJxYW5zaSIsICAgICBUVF9RQU5TSSwgICAwLCAgICAgICAgIC8qIFFOWCBBTlNJICovCisgICAgInFueCIsICAgICAgIFRUX1FOWCwgICAgIDAsICAgICAgICAgLyogUU5YICovCisgICAgInJ1c3NpYW4iLCAgIFRUX0tCTV9SVVNTSUFOLCAwLCAgICAgLyogUnVzc2lhbiBtb2RlICovCisgICAgInNjb2Fuc2kiLCAgIFRUX1NDT0FOU0ksIDAsICAgICAgICAgLyogU0NPIEFOU0kgKi8KKyAgICAic25pLTk3ODAxIiwgVFRfOTc4MDEsICAgMCwgICAgICAgICAvKiBTaW5peCA5NzgwMSAqLworICAgICJzdW4iLCAgICAgICBUVF9TVU4sICAgICAwLCAgICAgICAgIC8qIFN1biBDb25zb2xlICovCisjaWZkZWYgT1MyUE0KKyNpZmRlZiBDT01NRU5UCisgICAgInRlazQwMTQiLCBUVF9URUs0MCwgMCwKKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogT1MyUE0gKi8KKyAgICAidHR5IiwgICAgIFRUX05PTkUsICAwLAorICAgICJ0dmk5MTArIiwgVFRfVFZJOTEwLCAwLAorICAgICJ0dmk5MjUiLCAgVFRfVFZJOTI1LCAwLAorICAgICJ0dmk5NTAiLCAgVFRfVFZJOTUwLCAwLAorICAgICJ2YzQwNCIsICAgVFRfVkM0NDA0LCAwLAorICAgICJ2YzQ0MDQiLCAgVFRfVkM0NDA0LCBDTV9JTlYsCisgICAgInZpcDc4MDkiLCBUVF9WSVA3ODA5LCAwLAorICAgICJ2dDEwMCIsICAgVFRfVlQxMDAsIDAsCisgICAgInZ0MTAyIiwgICBUVF9WVDEwMiwgMCwKKyAgICAidnQyMjAiLCAgIFRUX1ZUMjIwLCAwLAorICAgICJ2dDIyMHBjIiwgVFRfVlQyMjBQQywgMCwKKyAgICAidnQzMjAiLCAgIFRUX1ZUMzIwLCAwLAorICAgICJ2dDMyMHBjIiwgVFRfVlQzMjBQQywgMCwKKyAgICAidnQ1MiIsICAgIFRUX1ZUNTIsICAwLAorICAgICJ3cCIsICAgICAgVFRfS0JNX1dQLCAwLAorICAgICJ3eTE2MCIsICAgVFRfV1kxNjAsICAwLAorICAgICJ3eTMwIiwgICAgVFRfV1kzMCwgIDAsCisgICAgInd5MzcwIiwgICBUVF9XWTM3MCwgMCwKKyAgICAid3k1MCIsICAgIFRUX1dZNTAsICAwLAorICAgICJ3eTYwIiwgICAgVFRfV1k2MCwgIDAsCisgICAgInd5c2UzMCIsICBUVF9XWTMwLCAgQ01fSU5WLAorICAgICJ3eXNlMzcwIiwgVFRfV1kzNzAsIENNX0lOViwKKyAgICAid3lzZTUwIiwgIFRUX1dZNTAsICBDTV9JTlYsCisgICAgInd5c2U2MCIsICBUVF9XWTYwLCAgQ01fSU5WCit9OworaW50IG5zaG9rZXltID0gKHNpemVvZihzaG9rZXltdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisjZW5kaWYgLyogT1MyICovCisKK1ZPSUQKKyNpZmRlZiBPUzIKK3Nob2tleWNvZGUoYyxtKSBpbnQgYywgbTsKKyNlbHNlCitzaG9rZXljb2RlKGMpIGludCBjOworI2VuZGlmCisvKiBzaG9rZXljb2RlICovIHsKKyAgICBLRVkgY2g7CisgICAgQ0hBUiAqczsKKyNpZmRlZiBPUzIKKyAgICBpbnQgaTsKKyAgICBjb25fZXZlbnQga207CisjZWxzZSAvKiBPUzIgKi8KKyAgICBpbnQga207CisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IG1za2tleXM7CisgICAgY2hhciAqIG1zdHIgPSAiIjsKKworICAgIGlmIChjID49IEtNU0laRSkgeworICAgICAgICBibGVlcChCUF9GQUlMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbHNlIC8qIE9TMiAqLworICAgIHByaW50ZigiIEtleSBjb2RlIFxcJWQgPT4gIiwgYyk7CisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgT1MyCisgICAga20gPSBtYXBrZXkoYyk7CisKKyNpZm5kZWYgTk9LVkVSQlMKKyAgICBpZiAoSVNfS1ZFUkIoa20pKSB7ICAgICAgICAgICAgICAgICAvKiBcS3ZlcmI/ICovCisgICAgICAgIGludCBpLCBrdjsKKyAgICAgICAga3YgPSBrbSAmIH4oRl9LVkVSQik7CisgICAgICAgIHByaW50ZigiVmVyYjogIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBua3ZlcmJzOyBpKyspCisgICAgICAgICAgaWYgKGt2ZXJic1tpXS5rd3ZhbCA9PSBrdikgeworICAgICAgICAgICAgICBwcmludGYoIlxcSyVzIixrdmVyYnNbaV0ua3dkKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgfSBlbHNlCisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKyAgICAgIGlmIChJU19DU0koa20pKSB7CisgICAgICAgICAgaW50IHhrbSA9IGttICYgMHhGRjsKKyAgICAgICAgICBpZiAoeGttIDw9IDMyIHx8IHhrbSA+PSAxMjcpCisgICAgICAgICAgICBwcmludGYoIlN0cmluZzogXFx7Mjd9W1xceyVkfVxuIix4a20pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiU3RyaW5nOiBcXHsyN31bJWNcbiIseGttKTsKKyAgICAgIH0gZWxzZSBpZiAoSVNfRVNDKGttKSkgeworICAgICAgICAgIGludCB4a20gPSBrbSAmIDB4RkY7CisgICAgICAgICAgaWYgKHhrbSA8PSAzMiB8fCB4a20gPj0gMTI3KQorICAgICAgICAgICAgcHJpbnRmKCJTdHJpbmc6IFxcezI3fVxceyVkfVxuIix4a20pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiU3RyaW5nOiBcXHsyN30lY1xuIix4a20pOworICAgICAgfSBlbHNlIGlmIChtYWNyb3RhYltjXSkgeyAgICAgICAgIC8qIFNlZSBpZiB0aGVyZSdzIGEgbWFjcm8gKi8KKyAgICAgICAgICBwcmludGYoIlN0cmluZzogIik7ICAgICAgICAgICAvKiBJZiBzbywgZGlzcGxheSBpdHMgZGVmaW5pdGlvbiAqLworICAgICAgICAgIHMgPSBtYWNyb3RhYltjXTsKKyAgICAgICAgICBzaG9zdHJkZWYocyk7CisgICAgICAgICAgcHJpbnRmKCJcbiIpOworI2lmbmRlZiBOT0tWRVJCUworICAgIH0gZWxzZSBpZiAoa20gPj0gMHgxMDApIHsgICAgICAgICAgIC8qIFRoaXMgbWVhbnMgInVuZGVmaW5lZCIgKi8KKyAgICAgICAgcHJpbnRmKCJVbmRlZmluZWRcbiIpOworI2VuZGlmIC8qIE5PS1ZFUkJTICovCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gbWFjcm8sIHNob3cgc2luZ2xlIGNoYXJhY3RlciAqLworICAgICAgICBwcmludGYoIkNoYXJhY3RlcjogIik7CisgICAgICAgIGNoID0ga207CisgICAgICAgIGlmIChjaCA8IDMyIHx8IGNoID09IDEyNworI2lmZGVmIE9TMgorICAgICAgICAgICAgfHwgY2ggPiAyNTUKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZm5kZWYgTkVYVAorI2lmbmRlZiBBVVgKKyNpZm5kZWYgWEVOSVgKKyNpZm5kZWYgT1MyCisgICAgICAgICAgICB8fCAoY2ggPiAxMjcgJiYgY2ggPCAxNjApCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogWEVOSVggKi8KKyNlbmRpZiAvKiBBVVggKi8KKyNlbmRpZiAvKiBORVhUICovCisgICAgICAgICAgICApCisvKgorICBUaGVzZSB1c2VkIHRvIGJlICVkLCBidXQgZ2NjIDEuOTMgJiBsYXRlciBjb21wbGFpbiBhYm91dCB0eXBlIG1pc21hdGNoZXMuCisgICV1IGlzIHN1cHBvc2VkIHRvIGJlIHRvdGFsbHkgcG9ydGFibGUuCisqLworICAgICAgICAgIHByaW50ZigiXFwldSIsKHVuc2lnbmVkIGludCkgY2gpOworICAgICAgICBlbHNlIHByaW50ZigiJWMgXFwldSIsKENIQVIpIChjaCAmIDB4ZmYpLCh1bnNpZ25lZCBpbnQpIGNoKTsKKyAgICAgICAgaWYgKGNoID09IChLRVkpIGMpCisgICAgICAgICAgcHJpbnRmKCIgKHNlbGYsIG5vIHRyYW5zbGF0aW9uKVxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorI2Vsc2UgLyogT1MyICovCisgICAgaWYgKG0gPCAwKSB7CisgICAgICAgIGttID0gbWFwa2V5KGMpOworICAgICAgICBtc3RyID0gImRlZmF1bHQiOworICAgIH0gZWxzZSB7CisgICAgICAgIGttID0gbWFwdGVybWtleShjLG0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnNob2tleW07IGkrKykgeworICAgICAgICAgICAgaWYgKG0gPT0gc2hva2V5bXRhYltpXS5rd3ZhbCkgeworICAgICAgICAgICAgICAgIG1zdHIgPSBzaG9rZXltdGFiW2ldLmt3ZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzID0ga2V5bmFtZShjKTsKKyAgICBkZWJ1ZyhGMTExLCJzaG9rZXljb2RlIG1zdHIiLG1zdHIsbSk7CisgICAgZGVidWcoRjExMSwic2hva2V5Y29kZSBrZXluYW1lIixzLGMpOworICAgIHByaW50ZigiICVzS2V5IGNvZGUgXFwlZCAlcyAoJXMpID0+ICIsCisgICAgICAgICAgICBtc2trZXlzID8gIm1za2VybWl0ICIgOiAiIiwKKyAgICAgICAgICAgIG1za2tleXMgPyBja3RvbXNrKGMpIDogYywKKyAgICAgICAgICAgIHMgPT0gTlVMTCA/ICIiIDogcywgbXN0cik7CisKKyAgICBzd2l0Y2ggKGttLnR5cGUpIHsKKyNpZm5kZWYgTk9LVkVSQlMKKyAgICAgIGNhc2Uga3ZlcmI6IHsKKyAgICAgICAgICBpbnQgaSwga3Y7CisgICAgICAgICAga3YgPSBrbS5rdmVyYi5pZCAmIH4oRl9LVkVSQik7CisgICAgICAgICAgcHJpbnRmKCJWZXJiOiAiKTsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmt2ZXJiczsgaSsrKSB7CisgICAgICAgICAgICAgIGlmIChrdmVyYnNbaV0ua3d2YWwgPT0ga3YpIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiXFxLJXMiLGt2ZXJic1tpXS5rd2QpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorI2VuZGlmIC8qIE5PS1ZFUkJTICovCisgICAgICBjYXNlIGNzaTogeworICAgICAgICAgIGludCB4a20gPSBrbS5jc2kua2V5ICYgMHhGRjsKKyAgICAgICAgICBpZiAoeGttIDw9IDMyIHx8IHhrbSA+PSAxMjcpCisgICAgICAgICAgICBwcmludGYoIlN0cmluZzogXFx7Mjd9W1xceyVkfVxuIix4a20pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiU3RyaW5nOiBcXHsyN31bJWNcbiIseGttKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgZXNjOiB7CisgICAgICAgICAgaW50IHhrbSA9IGttLmVzYy5rZXkgJiAweEZGOworICAgICAgICAgIGlmICh4a20gPD0gMzIgfHwgeGttID49IDEyNykKKyAgICAgICAgICAgIHByaW50ZigiU3RyaW5nOiBcXHslZH1cXHslZH1cbiIsSVNERzIwMCh0dF90eXBlKT8zMDoyNyx4a20pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiU3RyaW5nOiBcXHslZH0lY1xuIixJU0RHMjAwKHR0X3R5cGUpPzMwOjI3LHhrbSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIG1hY3JvOiB7CisgICAgICAgICAgcHJpbnRmKCJTdHJpbmc6ICIpOyAgICAgICAgICAgLyogTWFjcm8sIGRpc3BsYXkgaXRzIGRlZmluaXRpb24gKi8KKyAgICAgICAgICBzaG9zdHJkZWYoa20ubWFjcm8uc3RyaW5nKTsKKyAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIGxpdGVyYWw6IHsKKyAgICAgICAgICBwcmludGYoIkxpdGVyYWwgc3RyaW5nOiAiKTsgICAvKiBMaXRlcmFsLCBkaXNwbGF5IGl0cyBkZWZpbml0aW9uICovCisgICAgICAgICAgc2hvc3RyZGVmKGttLmxpdGVyYWwuc3RyaW5nKTsKKyAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIGVycm9yOiB7CisgICAgICAgICAgaWYgKGMgPj0gMHgxMDApIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCJVbmRlZmluZWRcbiIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHByaW50ZigiQ2hhcmFjdGVyOiAiKTsKKyAgICAgICAgICAgICAgY2ggPSBjOworICAgICAgICAgICAgICBpZiAoY2ggPCAzMiB8fCBjaCA9PSAxMjcgfHwgY2ggPiAyNTUKKyNpZm5kZWYgTkVYVAorI2lmbmRlZiBBVVgKKyNpZm5kZWYgWEVOSVgKKyNpZm5kZWYgT1MyCisgICAgICAgICAgICAgICAgICAgfHwgKGNoID4gMTI3ICYmIGNoIDwgMTYwKQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFhFTklYICovCisjZW5kaWYgLyogQVVYICovCisjZW5kaWYgLyogTkVYVCAqLworICAgICAgICAgICAgICAgICAgICkKKy8qCisgIFRoZXNlIHVzZWQgdG8gYmUgJWQsIGJ1dCBnY2MgMS45MyAmIGxhdGVyIGNvbXBsYWluIGFib3V0IHR5cGUgbWlzbWF0Y2hlcy4KKyAgJXUgaXMgc3VwcG9zZWQgdG8gYmUgdG90YWxseSBwb3J0YWJsZS4KKyovCisgICAgICAgICAgICAgICAgICBwcmludGYoIlxcJXUiLCh1bnNpZ25lZCBpbnQpIGNoKTsKKyAgICAgICAgICAgICAgZWxzZSBwcmludGYoIiVjIFxcJXUiLChDSEFSKSAoY2ggJiAweGZmKSwodW5zaWduZWQgaW50KSBjaCk7CisgICAgICAgICAgICAgIHByaW50ZigiIChzZWxmLCBubyB0cmFuc2xhdGlvbilcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2Uga2V5OiB7CisgICAgICAgICAgcHJpbnRmKCJDaGFyYWN0ZXI6ICIpOworICAgICAgICAgIGNoID0ga20ua2V5LnNjYW5jb2RlOworICAgICAgICAgIGlmIChjaCA8IDMyIHx8IGNoID09IDEyNyB8fCBjaCA+IDI1NQorI2lmbmRlZiBORVhUCisjaWZuZGVmIEFVWAorI2lmbmRlZiBYRU5JWAorI2lmbmRlZiBPUzIKKyAgICAgICAgICAgICAgfHwgKGNoID4gMTI3ICYmIGNoIDwgMTYwKQorI2Vsc2UKKyAgICAgICAgICAgICAgIHx8IChjaCA+IDEyNykKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBYRU5JWCAqLworI2VuZGlmIC8qIEFVWCAqLworI2VuZGlmIC8qIE5FWFQgKi8KKyAgICAgICAgICAgICAgKQorLyoKKyAgVGhlc2UgdXNlZCB0byBiZSAlZCwgYnV0IGdjYyAxLjkzICYgbGF0ZXIgY29tcGxhaW4gYWJvdXQgdHlwZSBtaXNtYXRjaGVzLgorICAldSBpcyBzdXBwb3NlZCB0byBiZSB0b3RhbGx5IHBvcnRhYmxlLgorKi8KKyAgICAgICAgICAgIHByaW50ZigiXFwldSIsKHVuc2lnbmVkIGludCkgY2gpOworICAgICAgICAgIGVsc2UgcHJpbnRmKCIlYyBcXCV1IiwoQ0hBUikgKGNoICYgMHhmZiksKHVuc2lnbmVkIGludCkgY2gpOworICAgICAgICAgIGlmIChjaCA9PSAoS0VZKSBjKQorICAgICAgICAgICAgcHJpbnRmKCIgKHNlbGYsIG5vIHRyYW5zbGF0aW9uKVxuIik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KK30KKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworCitWT0lECitzaG9zdHJkZWYocykgQ0hBUiAqIHM7IHsKKyAgICBDSEFSIGNoOworICAgIGlmICghcykgcyA9IChDSEFSICopIiI7CisgICAgd2hpbGUgKChjaCA9ICpzKyspKSB7CisgICAgICAgIGlmIChjaCA8IDMyIHx8IGNoID09IDEyNyB8fCBjaCA9PSAyNTUKKy8qCisgIFN5c3RlbXMgd2hvc2UgbmF0aXZlIGNoYXJhY3RlciBzZXRzIGhhdmUgZ3JhcGhpYyBjaGFyYWN0ZXJzIGluIEMxLi4uCisqLworI2lmbmRlZiBORVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lWFQgKi8KKyNpZm5kZWYgQVVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNpbnRvc2ggKi8KKyNpZm5kZWYgWEVOSVggICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJQk0gUEMgKi8KKyNpZmRlZiBPUzIKKy8qCisgIEl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIgdGhlIGxvY2FsIGhvc3QgY2FuIGRpc3BsYXkgOC1iaXQgY2hhcmFjdGVyczsKKyAgdGhleSBhcmUgbm90IHBvcnRhYmxlIGFtb25nIGNoYXJhY3Rlci1zZXRzIGFuZCBmb250cy4gIFdobyBrbm93cyB3aGF0CisgIHdvdWxkIGJlIGRpc3BsYXllZC4uLgorKi8KKyAgICAgICAgICAgIHx8IChjaCA+IDEyNykKKyNlbHNlIC8qIE9TMiAqLworICAgICAgICAgICAgfHwgKGNoID4gMTI3ICYmIGNoIDwgMTYwKQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFhFTklYICovCisjZW5kaWYgLyogQVVYICovCisjZW5kaWYgLyogTkVYVCAqLworICAgICAgICAgICAgKQorICAgICAgICAgIHByaW50ZigiXFx7JWR9IixjaCk7ICAgICAgICAgIC8qIERpc3BsYXkgY29udHJvbCBjaGFyYWN0ZXJzICovCisgICAgICAgIGVsc2UgcHV0Y2hhcigoY2hhcikgY2gpOyAgICAgICAgLyogaW4gYmFja3NsYXNoIG5vdGF0aW9uICovCisgICAgfQorfQorCisjZGVmaW5lIHh4ZGlmZih2LHN5cykgc3RybmNtcCh2LHN5cyxzdHJsZW4oc3lzKSkKKworI2lmbmRlZiBOT1NIT1cKK1ZPSUQKK3Nob3ZlcigpIHsKKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gY2hhciBja3hzeXN0ZW1bXTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBleHRlcm4gY2hhciAqY2tfcGF0Y2gsICogY2tsaWJ2OworICAgIHByaW50ZigiXG5WZXJzaW9uczpcbiAlc1xuIix2ZXJzaW8pOworICAgIHByaW50ZigiIE51bWVyaWM6ICVsZFxuIix2ZXJudW0pOworI2lmZGVmIE9TMgorICAgIHByaW50ZigiIE9wZXJhdGluZyBTeXN0ZW06ICVzXG4iLCBja3hzeXN0ZW0pOworI2Vsc2UgLyogT1MyICovCisgICAgcHJpbnRmKCIgQnVpbHQgZm9yOiAlc1xuIiwgY2t4c3lzKTsKKyNpZmRlZiBDS19VVFNOQU1FCisgICAgaWYgKHVubV9uYW1bMF0pCisgICAgICBwcmludGYoIiBSdW5uaW5nIG9uOiAlcyAlcyAlcyAlc1xuIiwgdW5tX25hbSx1bm1fdmVyLHVubV9yZWwsdW5tX21jaCk7CisjZW5kaWYgLyogQ0tfVVRTTkFNRSAqLworICAgIHByaW50ZigiIFBhdGNoZXM6ICVzXG4iLCAqY2tfcGF0Y2ggPyBja19wYXRjaCA6ICIobm9uZSkiKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpZiAoeHhkaWZmKGNreHYsY2t4c3lzKSkKKyAgICAgIHByaW50ZigiICVzIGZvciVzXG4iLGNreHYsY2t4c3lzKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIiAlc1xuIixja3h2KTsKKyAgICBpZiAoeHhkaWZmKGNrenYsY2t6c3lzKSkKKyAgICAgIHByaW50ZigiICVzIGZvciVzXG4iLGNrenYsY2t6c3lzKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIiAlc1xuIixja3p2KTsKKyAgICBwcmludGYoIiAlc1xuIixja2xpYnYpOworICAgIHByaW50ZigiICVzXG4iLHByb3R2KTsKKyAgICBwcmludGYoIiAlc1xuIixmbnN2KTsKKyAgICBwcmludGYoIiAlc1xuICVzXG4iLGNtZHYsdXNlcnYpOworI2lmbmRlZiBOT0NTRVRTCisgICAgcHJpbnRmKCIgJXNcbiIseGxhdik7CisjZW5kaWYgLyogTk9DU0VUUyAqLworI2lmbmRlZiBNQUMKKyNpZm5kZWYgTk9MT0NBTAorICAgIHByaW50ZigiICVzXG4iLGNvbm52KTsKKyNpZmRlZiBPUzIKKyAgICBwcmludGYoIiAlc1xuIixja3l2KTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjZW5kaWYgLyogTUFDICovCisjaWZuZGVmIE5PRElBTAorICAgIHByaW50ZigiICVzXG4iLGRpYWx2KTsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyNpZm5kZWYgTk9TQ1JJUFQKKyAgICBwcmludGYoIiAlc1xuIixsb2dpbnYpOworI2VuZGlmIC8qIE5PU0NSSVBUICovCisjaWZkZWYgTkVUQ09OTgorICAgIHByaW50ZigiICVzXG4iLGNrbmV0dik7CisjaWZkZWYgT1MyCisgICAgcHJpbnRmKCIgJXNcbiIsY2tvbmV0dik7CisjaWZkZWYgQ0tfTkVUQklPUworICAgIHByaW50ZigiICVzXG4iLGNrb25iaXYpOworI2VuZGlmIC8qIENLX05FVEJJT1MgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisjaWZkZWYgVE5DT0RFCisgICAgcHJpbnRmKCIgJXNcbiIsY2t0ZWx2KTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyNpZmRlZiBTU0hCVUlMVElOCisgICAgcHJpbnRmKCIgJXNcbiIsY2tzc2h2KTsKKyNpZmRlZiBTRlRQX0JVSUxUSU4KKyAgICBwcmludGYoIiAlc1xuIixja3NmdHB2KTsKKyNlbmRpZiAvKiBTRlRQX0JVSUxUSU4gKi8KKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisjaWZkZWYgT1MyCisjaWZkZWYgT1MyTU9VU0UKKyAgICBwcmludGYoIiAlc1xuIixja29tb3V2KTsKKyNlbmRpZiAvKiBPUzJNT1VTRSAqLworI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIE5FV0ZUUAorICAgIHByaW50ZigiICVzXG4iLGNrZnRwdik7CisjZW5kaWYgLyogTkVXRlRQICovCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICBwcmludGYoIiAlc1xuIixja2F0aHYpOworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorI2lmZGVmIENSWVBUX0RMTAorICAgIHByaW50ZigiICVzXG4iLGNrX2NyeXB0X2RsbF92ZXJzaW9uKCkpOworI2Vsc2UgLyogQ1JZUFRfRExMICovCisgICAgcHJpbnRmKCIgJXNcbiIsY2tjcnB2KTsKKyNlbmRpZiAvKiBDUllQVF9ETEwgKi8KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjaWZkZWYgQ0tfU1NMCisgICAgcHJpbnRmKCIgJXNcbiIsY2tzc2x2KTsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICBwcmludGYoIlxuIik7Cit9CisKKyNpZmRlZiBDS19MQUJFTEVECitWT0lECitzaG9sYmwoKSB7CisjaWZkZWYgVk1TCisgICAgcHJpbnRmKCJWTVMgTGFiZWxlZCBGaWxlIEZlYXR1cmVzOlxuIik7CisgICAgcHJpbnRmKCIgYWNsICVzIChBQ0wgaW5mbyAlcylcbiIsCisgICAgICAgICAgIHNob3dvZmYobGZfb3B0cyAmIExCTF9BQ0wpLAorICAgICAgICAgICBsZl9vcHRzICYgTEJMX0FDTCA/ICJwcmVzZXJ2ZWQiIDogImRpc2NhcmRlZCIpOworICAgIHByaW50ZigiIGJhY2t1cC1kYXRlICVzIChiYWNrdXAgZGF0ZS90aW1lICVzKVxuIiwKKyAgICAgICAgICAgc2hvd29mZihsZl9vcHRzICYgTEJMX0JDSyksCisgICAgICAgICAgIGxmX29wdHMgJiBMQkxfQkNLID8gInByZXNlcnZlZCIgOiAiZGlzY2FyZGVkIik7CisgICAgcHJpbnRmKCIgbmFtZSAlcyAob3JpZ2luYWwgZmlsZW5hbWUgJXMpXG4iLAorICAgICAgICAgICBzaG93b2ZmKGxmX29wdHMgJiBMQkxfTkFNKSwKKyAgICAgICAgICAgbGZfb3B0cyAmIExCTF9OQU0gPyAicHJlc2VydmVkIiA6ICJkaXNjYXJkZWQiKTsKKyAgICBwcmludGYoIiBvd25lciAlcyAob3JpZ2luYWwgZmlsZSBvd25lciBpZCAlcylcbiIsCisgICAgICAgICAgIHNob3dvZmYobGZfb3B0cyAmIExCTF9PV04pLAorICAgICAgICAgICBsZl9vcHRzICYgTEJMX09XTiA/ICJwcmVzZXJ2ZWQiIDogImRpc2NhcmRlZCIpOworICAgIHByaW50ZigiIHBhdGggJXMgKG9yaWdpbmFsIGZpbGUncyBkaXNrOltkaXJlY3RvcnldICVzKVxuIiwKKyAgICAgICAgICAgc2hvd29mZihsZl9vcHRzICYgTEJMX1BUSCksCisgICAgICAgICAgIGxmX29wdHMgJiBMQkxfUFRIID8gInByZXNlcnZlZCIgOiAiZGlzY2FyZGVkIik7CisjZWxzZQorI2lmZGVmIE9TMgorICAgIHByaW50ZigiT1MvMiBMYWJlbGVkIEZpbGUgZmVhdHVyZXMgKGF0dHJpYnV0ZXMpOlxuIik7CisgICAgcHJpbnRmKCIgYXJjaGl2ZTogICAlc1xuIiwgc2hvd29mZihsZl9vcHRzICYgTEJMX0FSQykpOworICAgIHByaW50ZigiIGV4dGVuZGVkOiAgJXNcbiIsIHNob3dvZmYobGZfb3B0cyAmIExCTF9FWFQpKTsKKyAgICBwcmludGYoIiBoaWRkZW46ICAgICVzXG4iLCBzaG93b2ZmKGxmX29wdHMgJiBMQkxfSElEKSk7CisgICAgcHJpbnRmKCIgcmVhZC1vbmx5OiAlc1xuIiwgc2hvd29mZihsZl9vcHRzICYgTEJMX1JPICkpOworICAgIHByaW50ZigiIHN5c3RlbTogICAgJXNcbiIsIHNob3dvZmYobGZfb3B0cyAmIExCTF9TWVMpKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBWTVMgKi8KK30KKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisKK1ZPSUQKK3Nob3Rjcyhjc2wsY3NyKSBpbnQgY3NsLCBjc3I7IHsgICAgICAgICAvKiBTaG93IHRlcm1pbmFsIGNoYXJhY3RlciBzZXQgKi8KKyNpZm5kZWYgTk9DU0VUUworI2lmZGVmIE9TMgorI2lmbmRlZiBOT1RFUk0KKyAgICBleHRlcm4gc3RydWN0IF92dEcgR1s0XSwgKkdMLCAqR1I7CisgICAgZXh0ZXJuIGludCBkZWNucmNtLCBzbmlfY2hjb2RlOworICAgIGV4dGVybiBpbnQgdHRfdXRmOCwgZGVjX25yYywgZGVjX2tiZCwgZGVjX2xhbmc7CisgICAgZXh0ZXJuIHBybmNzOworCisgICAgcHJpbnRmKCIgVGVybWluYWwgY2hhcmFjdGVyLXNldHM6XG4iKTsKKyAgICBpZiAoSVM5NzgwMSh0dF90eXBlX21vZGUpKSB7CisgICAgICAgIGlmIChjbWFzayA9PSAwMzc3KQorICAgICAgICAgIHByaW50ZigiICAgICBNb2RlOiA4LWJpdCBNb2RlXG4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZigiICAgICBNb2RlOiA3LWJpdCBNb2RlXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgIENILkNPREUgaXMgJXNcbiIsc25pX2NoY29kZT8iT24iOiJPZmYiKTsKKyAgICB9IGVsc2UgaWYgKElTVlQxMDAodHRfdHlwZV9tb2RlKSkgeworICAgICAgICBpZiAoZGVjbnJjbSkKKyAgICAgICAgICBwcmludGYoIiAgICAgTW9kZTogNy1iaXQgTmF0aW9uYWwgTW9kZVxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoIiAgICAgTW9kZTogOC1iaXQgTXVsdGluYXRpb25hbCBNb2RlXG4iKTsKKyAgICB9CisgICAgaWYgKCBpc3VuaWNvZGUoKSApCisgICAgICAgIHByaW50ZigiICAgIExvY2FsOiBVbmljb2RlIGRpc3BsYXkgLyAlcyBpbnB1dFxuIiwKKyAgICAgICAgICAgICAgICBjc2wgPT0gVFhfVFJBTlNQID8gInRyYW5zcGFyZW50IiA6CisgICAgICAgICAgICAgICAgY3NsID09IFRYX1VOREVGID8gInVuZGVmaW5lZCIgOiB0eHJpbmZvW2NzbF0tPmtleXdkKTsKKyAgICBlbHNlCisgICAgICAgIHByaW50ZigiICAgIExvY2FsOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBjc2wgPT0gVFhfVFJBTlNQID8gInRyYW5zcGFyZW50IiA6CisgICAgICAgICAgICAgICAgY3NsID09IFRYX1VOREVGID8gInVuZGVmaW5lZCIgOiB0eHJpbmZvW2NzbF0tPmtleXdkKTsKKworICAgIGlmICggdHRfdXRmOCApIHsKKyAgICAgICAgcHJpbnRmKCIgICBSZW1vdGU6IFVURi04XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiAgIFJlbW90ZTogJXNHMDogJXMgKCVzKVxuIiwKKyAgICAgICAgICAgR0wgPT0gJkdbMF0gPyAiR0wtPiIgOiBHUiA9PSAmR1swXSA/ICJHUi0+IiA6ICIgICAgIiwKKyAgICAgICAgICAgdHhyaW5mb1tHWzBdLmRlc2lnbmF0aW9uXS0+a2V5d2QsCisgICAgICAgICAgIEdbMF0uZGVzaWduYXRpb24gPT0gVFhfVFJBTlNQID8gIiIgOgorICAgICAgICAgICBHWzBdLnNpemUgPT0gY3M5NCA/ICI5NCBjaGFycyIgOgorICAgICAgICAgICBHWzBdLnNpemUgPT0gY3M5NiA/ICI5NiBjaGFycyIgOiAibXVsdGktYnl0ZSIpOworICAgICAgICBwcmludGYoIiAgICAgICAgICAgJXNHMTogJXMgKCVzKVxuIiwKKyAgICAgICAgICAgR0wgPT0gJkdbMV0gPyAiR0wtPiIgOiBHUiA9PSAmR1sxXSA/ICJHUi0+IiA6ICIgICAgIiwKKyAgICAgICAgICAgdHhyaW5mb1tHWzFdLmRlc2lnbmF0aW9uXS0+a2V5d2QsCisgICAgICAgICAgIEdbMV0uZGVzaWduYXRpb24gPT0gVFhfVFJBTlNQID8gIiIgOgorICAgICAgICAgICBHWzFdLnNpemUgPT0gY3M5NCA/ICI5NCBjaGFycyIgOgorICAgICAgICAgICBHWzFdLnNpemUgPT0gY3M5NiA/ICI5NiBjaGFycyIgOiAibXVsdGktYnl0ZSIpOworICAgICAgICBwcmludGYoIiAgICAgICAgICAgJXNHMjogJXMgKCVzKVxuIiwKKyAgICAgICAgICAgR0wgPT0gJkdbMl0gPyAiR0wtPiIgOiBHUiA9PSAmR1syXSA/ICJHUi0+IiA6ICIgICAgIiwKKyAgICAgICAgICAgdHhyaW5mb1tHWzJdLmRlc2lnbmF0aW9uXS0+a2V5d2QsCisgICAgICAgICAgIEdbMl0uZGVzaWduYXRpb24gPT0gVFhfVFJBTlNQID8gIiIgOgorICAgICAgICAgICBHWzJdLnNpemUgPT0gY3M5NCA/ICI5NCBjaGFycyIgOgorICAgICAgICAgICBHWzJdLnNpemUgPT0gY3M5NiA/ICI5NiBjaGFycyIgOiAibXVsdGktYnl0ZSIpOworICAgICAgICBwcmludGYoIiAgICAgICAgICAgJXNHMzogJXMgKCVzKVxuIiwKKyAgICAgICAgICAgR0wgPT0gJkdbM10gPyAiR0wtPiIgOiBHUiA9PSAmR1szXSA/ICJHUi0+IiA6ICIgICAgIiwKKyAgICAgICAgICAgdHhyaW5mb1tHWzNdLmRlc2lnbmF0aW9uXS0+a2V5d2QsCisgICAgICAgICAgIEdbM10uZGVzaWduYXRpb24gPT0gVFhfVFJBTlNQID8gIiIgOgorICAgICAgICAgICBHWzNdLnNpemUgPT0gY3M5NCA/ICI5NCBjaGFycyIgOgorICAgICAgICAgICBHWzNdLnNpemUgPT0gY3M5NiA/ICI5NiBjaGFycyIgOiAibXVsdGktYnl0ZSIpOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCIgS2V5Ym9hcmQgY2hhcmFjdGVyLXNldHM6XG4iKTsKKyAgICBwcmludGYoIiAgIE11bHRpbmF0aW9uYWw6ICVzXG4iLHR4cmluZm9bZGVjX2tiZF0tPmtleXdkKTsKKyAgICBwcmludGYoIiAgICAgICAgTmF0aW9uYWw6ICVzXG4iLHR4cmluZm9bZGVjX25yY10tPmtleXdkKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCIgUHJpbnRlciBjaGFyYWN0ZXItc2V0OiAlc1xuIix0eHJpbmZvW3BybmNzXS0+a2V5d2QpOworI2VuZGlmIC8qIE5PVEVSTSAqLworI2Vsc2UgLyogT1MyICovCisjaWZuZGVmIE1BQworICAgIGNoYXIgKnM7CisKKyAgICBkZWJ1ZyhGMTAxLCJURVJNIExPQ0FMIENTRVQiLCIiLGNzbCk7CisgICAgZGVidWcoRjEwMSwiVEVSTSBSRU1PVEUgQ1NFVCIsIiIsY3NyKTsKKyAgICBwcmludGYoIiBUZXJtaW5hbCBjaGFyYWN0ZXItc2V0OiAiKTsKKyAgICBpZiAodGNzX3RyYW5zcCkgeyAgICAgICAgICAgICAgICAgICAvKiBObyB0cmFuc2xhdGlvbiAqLworICAgICAgICBwcmludGYoInRyYW5zcGFyZW50XG4iKTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2xhdGlvbiAqLworICAgICAgICBwcmludGYoIiVzIChyZW1vdGUpICVzIChsb2NhbClcbiIsCisgICAgICAgICAgICAgICBmY3NpbmZvW2Nzcl0ua2V5d29yZCxmY3NpbmZvW2NzbF0ua2V5d29yZCk7CisgICAgICAgIGlmIChjc3IgIT0gY3NsKSB7CisgICAgICAgICAgICBzd2l0Y2goZ2V0dGNzKGNzcixjc2wpKSB7CisgICAgICAgICAgICAgIGNhc2UgVENfVVNBU0NJSTogIHMgPSAiYXNjaWkiOyAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVENfMUxBVElOOiAgIHMgPSAibGF0aW4xLWlzbyI7ICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVENfMkxBVElOOiAgIHMgPSAibGF0aW4yLWlzbyI7ICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVENfQ1lSSUxMOiAgIHMgPSAiY3lyaWxsaWMtaXNvIjsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVENfSkVVQzogICAgIHMgPSAiamFwYW5lc2UtZXVjIjsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVENfSEVCUkVXOiAgIHMgPSAiaGVicmV3LWlzbyI7ICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVENfR1JFRUs6ICAgIHMgPSAiZ3JlZWstaXNvIjsgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVENfOUxBVElOOiAgIHMgPSAibGF0aW45LWlzbyI7ICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgIHMgPSAidHJhbnNwYXJlbnQiOyAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RyY21wKHMsZmNzaW5mb1tjc2xdLmtleXdvcmQpICYmCisgICAgICAgICAgICAgICAgc3RyY21wKHMsZmNzaW5mb1tjc3JdLmtleXdvcmQpKQorICAgICAgICAgICAgICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAodmlhICVzKVxuIixzKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0NTRVRTICovCit9CisKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorZXh0ZXJuIGNoYXIgaHRhYltdOworVk9JRAorc2hvdGFicygpIHsKKyAgICBpbnQgaSxqLGssbjsKKworICAgIHByaW50ZigiVGFiIFN0b3BzOlxuXG4iKTsKKyAgICBmb3IgKGkgPSAwLCBqID0gMSwgayA9IFZzY3JuR2V0V2lkdGgoVkNNRCk7IGkgPCBNQVhURVJNQ09MOyApIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcHJpbnRmKCIlYyIsaHRhYlsrK2ldPT0nVCc/J1QnOictJyk7CisgICAgICAgIH0gd2hpbGUgKGkgJSBrICYmIGkgPCBNQVhURVJNQ09MKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBmb3IgKCA7IGogPD0gaTsgaisrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKCBqJTEwICkgeworCSAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBwcmludGYoIiVjIixqID09IDEgPyAnMScgOiAnLicpOworICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICAgIGNhc2UgMjoKKwkgICAgICBjYXNlIDM6CisJICAgICAgY2FzZSA0OgorCSAgICAgIGNhc2UgNToKKwkgICAgICBjYXNlIDY6CisJICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIHByaW50ZigiJWMiLCcuJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisJICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIG4gPSAoaisyKS8xMDA7CisgICAgICAgICAgICAgICAgaWYgKG4pCisJCSAgcHJpbnRmKCIlZCIsbik7CisgICAgICAgICAgICAgICAgZWxzZSAKKwkJICBwcmludGYoIiVjIiwnLicpOworICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICBuID0gKGorMSklMTAwLzEwOworICAgICAgICAgICAgICAgIGlmIChuKQorCQkgIHByaW50ZigiJWQiLG4pOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGo+OTApCisJCSAgcHJpbnRmKCIwIik7CisgICAgICAgICAgICAgICAgZWxzZSAKKwkJICBwcmludGYoIiVjIiwnLicpOworICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBwcmludGYoIjAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorI2lmZGVmIENPTU1FTlQKKyAgICBmb3IgKGkgPSAxOyBpIDw9IDcwOyBpKyspCisgICAgICBwcmludGYoIiVjIixodGFiW2ldPT0nVCc/J1QnOictJyk7CisgICAgcHJpbnRmKCJcbjEuLi4uLi4uMTAuLi4uLi4uLjIwLi4uLi4uLi4zMC4uLi4uLi4uNDAuLi4uLi4uLjUwLi4uLi4uLi42MFwKKy4uLi4uLi4uNzBcblxuIik7CisgICAgZm9yICg7IGkgPD0gMTQwOyBpKyspCisgICAgICBwcmludGYoIiVjIixodGFiW2ldPT0nVCc/J1QnOictJyk7CisgICAgcHJpbnRmKCJcbi4uLi4uLi4uODAuLi4uLi4uLjkwLi4uLi4uLjEwMC4uLi4uLi4xMTAuLi4uLi4uMTIwLi4uLi4uLjEzMFwKKy4uLi4uLi4xNDBcblxuIik7CisgICAgZm9yICg7IGkgPD0gMjEwOyBpKyspCisgICAgICBwcmludGYoIiVjIixodGFiW2ldPT0nVCc/J1QnOictJyk7CisgICAgcHJpbnRmKCJcbi4uLi4uLi4xNTAuLi4uLi4uMTYwLi4uLi4uLjE3MC4uLi4uLi4xODAuLi4uLi4uMTkwLi4uLi4uLjIwMFwKKy4uLi4uLi4yMTBcblxuIik7CisgICAgZm9yICg7IGkgPD0gMjU1OyBpKyspCisgICAgICBwcmludGYoIiVjIixodGFiW2ldPT0nVCc/J1QnOictJyk7CisgICAgcHJpbnRmKCJcbi4uLi4uLi4yMjAuLi4uLi4uMjMwLi4uLi4uLjI0MC4uLi4uLi4yNTAuLjI1NVxuIik7CisjZW5kaWYKKworfQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmZGVmIE9TMk1PVVNFCitWT0lECitzaG9tb3UoKSB7CisgICAgaW50IGJ1dHRvbiwgZXZlbnQsIGlkLCBpOworICAgIGNoYXIgKiBuYW1lID0gIiI7CisKKyAgICBwcmludGYoIk1vdXNlIHNldHRpbmdzOlxuIik7CisgICAgcHJpbnRmKCIgICBCdXR0b24gQ291bnQ6ICAgJWRcbiIsbW91c2VidXR0b25jb3VudCgpKTsKKyAgICBwcmludGYoIiAgIEFjdGl2ZTogICAgICAgICAlc1xuXG4iLHNob3dvZmYodHRfbW91c2UpKTsKKworICAgIGZvciAoYnV0dG9uID0gMDsgYnV0dG9uIDwgTU1CVVRUT05NQVg7IGJ1dHRvbisrKQorICAgICAgZm9yIChldmVudCA9IDA7IGV2ZW50IDwgTU1FVkVOVFNJWkU7IGV2ZW50KyspCisgICAgICAgIGlmIChtb3VzZW1hcFtidXR0b25dW2V2ZW50XS50eXBlICE9IGVycm9yKQorICAgICAgICAgIHN3aXRjaCAobW91c2VtYXBbYnV0dG9uXVtldmVudF0udHlwZSkgeworICAgICAgICAgICAgY2FzZSBrZXk6CisgICAgICAgICAgICAgIHByaW50ZigiICAgJXMgPSBDaGFyYWN0ZXI6ICVjIFxcJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBtb3VzZW5hbWUoYnV0dG9uLGV2ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgIG1vdXNlbWFwW2J1dHRvbl1bZXZlbnRdLmtleS5zY2FuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgIG1vdXNlbWFwW2J1dHRvbl1bZXZlbnRdLmtleS5zY2FuY29kZSApOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga3ZlcmI6CisgICAgICAgICAgICAgIGlkID0gbW91c2VtYXBbYnV0dG9uXVtldmVudF0ua3ZlcmIuaWQgJiB+KEZfS1ZFUkIpOworICAgICAgICAgICAgICBpZiAoaWQgIT0gS19JR05PUkUpIHsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGk8IG5rdmVyYnM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkID09IGt2ZXJic1tpXS5rd3ZhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGt2ZXJic1tpXS5rd2Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAlcyA9IEt2ZXJiOiBcXEslc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZW5hbWUoYnV0dG9uLGV2ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbWFjcm86CisgICAgICAgICAgICAgIHByaW50ZigiICAgJXMgPSBNYWNybzogIiwKKyAgICAgICAgICAgICAgICAgICAgIG1vdXNlbmFtZShidXR0b24sZXZlbnQpICk7CisgICAgICAgICAgICAgIHNob3N0cmRlZihtb3VzZW1hcFtidXR0b25dW2V2ZW50XS5tYWNyby5zdHJpbmcpOworICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KK30KKyNlbmRpZiAvKiBPUzJNT1VTRSAqLworCisjaWZuZGVmIE5PTE9DQUwKK1ZPSUQKK3Nob3RybSgpIHsKKyAgICBjaGFyICpzOworICAgIGV4dGVybiBjaGFyICogZ2V0aWFjdCgpOworICAgIGV4dGVybiBpbnQgdHRfcHJpbnQsIGFkbF9lcnI7CisjaWZuZGVmIE5PVFJJR0dFUgorICAgIGV4dGVybiBjaGFyICogdHRfdHJpZ2dlcltdOworI2VuZGlmIC8qIE5PVFJJR0dFUiAqLworI2lmZGVmIENLVElETEUKKyAgICBleHRlcm4gY2hhciAqIHR0X2lkbGVzbmRfc3RyOworICAgIGV4dGVybiBpbnQgdHRfaWRsZXNuZF90bW87CisgICAgZXh0ZXJuIGludCB0dF9pZGxlbGltaXQsIHR0X2lkbGVhY3Q7CisjZW5kaWYgLyogQ0tUSURMRSAqLworI2lmZGVmIE9TMgorICAgIGV4dGVybiBpbnQgd3lfYXV0b3BhZ2UsIGF1dG9zY3JvbGwsIHNncmNvbG9ycywgY29sb3JyZXNldCwgdXNlcl9lcmFzZW1vZGUsCisgICAgICBkZWNzY25tLCBkZWNzY25tX3VzciwgdHRfZGlmZl91cGQsIHR0X3NlbmRkYXRhLAorICAgICAgd3lfYmxvY2tlbmQsIG1hcmdpbmJlbGwsIG1hcmdpbmJlbGxjb2wsIHR0X21vZGVjaGcsIGRndW5peDsKKyAgICBpbnQgbGluZXMgPSAwOworI2lmZGVmIEtVSQorICAgIGV4dGVybiBDS0ZMT0FUIHR0X2xpbmVzcGFjaW5nW107CisjZW5kaWYgLyogS1VJICovCisjaWZkZWYgUENGT05UUworICAgIGludCBpOworICAgIGNoYXIgKmZvbnQ7CisKKyAgICBpZiAoSXNPUzJGdWxsU2NyZWVuKCkpIHsgICAgICAgICAgICAvKiBEZXRlcm1pbmUgdGhlIGZvbnQgbmFtZSAqLworICAgICAgICBpZiAoIW9zMkxvYWRQQ0ZvbnRzKCkpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudGVybWZvbnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0dF9mb250ID09IHRlcm1fZm9udFtpXS5rd3ZhbCkgeworICAgICAgICAgICAgICAgICAgICBmb250ID0gdGVybV9mb250W2ldLmt3ZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9udCA9ICIoRExMIG5vdCBhdmFpbGFibGUpIjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvbnQgPSAgICAgIihmdWxsIHNjcmVlbiBvbmx5KSI7CisgICAgfQorI2VuZGlmIC8qIFBDRk9OVFMgKi8KKyNpZmRlZiBLVUkKKyAgICBjaGFyIGZvbnRbNjRdID0gIih1bmtub3duKSI7CisgICAgaWYgKCBudGVybWZvbnQgPiAwICkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG50ZXJtZm9udDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodHRfZm9udCA9PSB0ZXJtX2ZvbnRbaV0ua3d2YWwpIHsKKyAgICAgICAgICAgICAgICBja3N0cm5jcHkoZm9udCx0ZXJtX2ZvbnRbaV0ua3dkLDU5KTsKKyAgICAgICAgICAgICAgICBja3N0cm5jYXQoZm9udCwiICIsNjQpOworICAgICAgICAgICAgICAgIGNrc3RybmNhdChmb250LGNraXRvYSh0dF9mb250X3NpemUvMiksNjQpOworICAgICAgICAgICAgICAgIGlmICggdHRfZm9udF9zaXplICUgMiApCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdChmb250LCIuNSIsNjQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtVSSAqLworCisgICAgcHJpbnRmKCJUZXJtaW5hbCBwYXJhbWV0ZXJzOlxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIiAlMTlzOiAlMWQlLTEycyAgJTEzczogJTFkJS0xNHNcbiIsCisgICAgICAgICAgICJCeXRlc2l6ZTogQ29tbWFuZCIsCisgICAgICAgICAgIChjbWRtc2sgPT0gMDM3NykgPyA4IDogNywKKyAgICAgICAgICAgIiBiaXRzIiwiVGVybWluYWwiLAorICAgICAgICAgICAoY21hc2sgPT0gMDM3NykgPyA4IDogNywiIGJpdHMiKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIHByaW50ZigiICUxOXM6ICUtMTNzIiwiVHlwZSIsCisgICAgICAgICAgICh0dF90eXBlID49IDAgJiYgdHRfdHlwZSA8PSBtYXhfdHQpID8KKyAgICAgICAgICAgdHRfaW5mb1t0dF90eXBlXS54X25hbWUgOgorICAgICAgICAgICAidW5rbm93biIgKTsKKyAgICBpZiAodHRfdHlwZSA+PSAwICYmIHR0X3R5cGUgPD0gbWF4X3R0KQorICAgICAgaWYgKHN0cmxlbih0dF9pbmZvW3R0X3R5cGVdLnhfaWQpKQorICAgICAgICBwcmludGYoIiAgJTEzczogPEVTQz4lcyIsIklEIix0dF9pbmZvW3R0X3R5cGVdLnhfaWQpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIHByaW50ZigiICUxOXM6ICUtMTNzICAlMTNzOiAlLTE1c1xuIiwiRWNobyIsCisgICAgICAgICAgIGR1cGxleCA/ICJsb2NhbCIgOiAicmVtb3RlIiwiTG9ja2luZy1zaGlmdCIsc2hvd29mZihzb3NpKSk7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIiAlMTlzOiAlLTEzcyAgJTEzczogJS0xNXNcbiIsIk5ld2xpbmUtbW9kZSIsCisgICAgICAgICAgIHNob3dvZmYodG5sbSksIkNyLWRpc3BsYXkiLHR0X2NyZCA/ICJjcmxmIiA6ICJub3JtYWwiKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIHByaW50ZigiICUxOXM6ICUtMTNzICAlMTNzOiAlLTE1c1xuIiwiQ3Vyc29yIiwKKyAgICAgICAgICAgKHR0X2N1cnNvciA9PSAyKSA/ICJmdWxsIiA6CisgICAgICAgICAgICh0dF9jdXJzb3IgPT0gMSkgPyAiaGFsZiIgOiAidW5kZXJsaW5lIiwKKyNpZmRlZiBDS19BVVRPREwKKyAgICAgICAgICAgImF1dG9kb3dubG9hZCIsYXV0b2RsID09IFRBRF9PTiA/CisgICAgICAgICAgIChhZGxfZXJyID8gIm9uLCBlcnJvciBzdG9wIiA6ICJvbiwgZXJyb3IgY29udGludWUiKSA6IAorICAgICAgICAgICBhdXRvZGwgPT0gVEFEX0FTSyA/IAorICAgICAgICAgICAoYWRsX2VyciA/ICJhc2ssIGVycm9yIHN0b3AiIDogImFzaywgZXJyb3IgY29udGludWUiKSA6CisgICAgICAgICAgICJvZmYiCisjZWxzZSAvKiBDS19BVVRPREwgKi8KKyAgICAgICAgICAgIiIsICIiCisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisgICAgICAgICAgICk7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIiAlMTlzOiAlLTEzcyAgJTEzczogJS0xNXNcbiIsIkFycm93LWtleXMiLAorICAgICAgICAgICB0dF9hcnJvdyA/ICJhcHBsaWNhdGlvbiIgOiAiY3Vyc29yIiwKKyAgICAgICAgICAgIktleXBhZC1tb2RlIiwgdHRfa2V5cGFkID8gImFwcGxpY2F0aW9uIiA6ICJudW1lcmljIgorICAgICAgICAgICApOworCisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKworICAgIC8qIEp1c3QgdG8gbWFrZSBzdXJlIHdlIGFyZSB1c2luZyBjdXJyZW50IGluZm8gKi8KKyAgICB1cGRhbnN3ZXJiaygpOworCisgICAgLyoKKyAgICAgICBUaGlzIGxpbmUgZG9lc24ndCBlbmQgd2l0aCAnXG4nIGJlY2F1c2UgdGhlIGFuc3dlcmJhY2sgc3RyaW5nCisgICAgICAgaXMgdGVybWluYXRlZCB3aXRoIGEgbmV3bGluZQorICAgICovCisgICAgcHJpbnRmKCIgJTE5czogJS0xM3MgICUxM3M6ICUtMTVzIiwiQW5zd2VyYmFjayIsCisgICAgICAgICAgIHNob3dvZmYodHRfYW5zd2VyKSwicmVzcG9uc2UiLGFuc3dlcmJhY2spOworICAgIHN3aXRjaCAodHRfYmVsbCkgeworICAgICAgY2FzZSBYWUJfTk9ORToKKyAgICAgICAgcyA9ICJub25lIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhZQl9WSVM6CisgICAgICAgIHM9ICJ2aXNpYmxlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhZQl9BVUQgfCBYWUJfQkVFUDoKKyAgICAgICAgcz0iYmVlcCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYWUJfQVVEIHwgWFlCX1NZUzoKKyAgICAgICAgcz0ic3lzdGVtIHNvdW5kcyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcz0iKHVua25vd24pIjsKKyAgICB9CisgICAgcHJpbnRmKCIgJTE5czogJS0xM3MgICUxM3M6ICUtMTVzXG4iLCJCZWxsIixzLAorICAgICAgICAgICAiV3JhcCIsc2hvd29mZih0dF93cmFwKSk7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIiAlMTlzOiAlLTEzcyAgJTEzczogJS0xNXNcbiIsIkF1dG9wYWdlIixzaG93b2ZmKHd5X2F1dG9wYWdlKSwKKyAgICAgICAgICAgIkF1dG9zY3JvbGwiLHNob3dvZmYoYXV0b3Njcm9sbCkpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCIgJTE5czogJS0xM3MgICUxM3M6ICUtMTVzXG4iLCJTR1IgQ29sb3JzIixzaG93b2ZmKHNncmNvbG9ycyksCisgICAgICAgICAgICJFU0NbMG0gY29sb3IiLGNvbG9ycmVzZXQ/ImRlZmF1bHQtY29sb3IiOiJjdXJyZW50LWNvbG9yIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIiAlMTlzOiAlLTEzcyAgJTEzczogJS0xNXNcbiIsCisgICAgICAgICAgICAiRXJhc2UgY29sb3IiLHVzZXJfZXJhc2Vtb2RlPyJkZWZhdWx0LWNvbG9yIjoiY3VycmVudC1jb2xvciIsCisgICAgICAgICAgICJTY3JlZW4gbW9kZSIsZGVjc2NubT8icmV2ZXJzZSI6Im5vcm1hbCIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbGluZXMgPSAwOyB9CisKKyAgICBwcmludGYoIiAlMTlzOiAlLTEzZCAgJTEzczogJS0xNWRcbiIsIlRyYW5zbWl0LXRpbWVvdXQiLHR0X2N0c3RtbywKKyAgICAgICAgICAgIk91dHB1dC1wYWNpbmciLHR0X3BhY2luZyk7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKworICAgIHByaW50ZigiICUxOXM6ICUtMTNkICAlMTNzOiAlc1xuIiwiSWRsZS10aW1lb3V0Iix0dF9pZGxlbGltaXQsCisgICAgICAgICAgICJJZGxlLWFjdGlvbiIsIGdldGlhY3QoKSk7CisKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIHByaW50ZigiICUxOXM6ICUtMTNzICAlMTNzOiAlLTE1c1xuIiwiU2VuZCBkYXRhIiwKKyAgICAgICAgICBzaG93b2ZmKHR0X3NlbmRkYXRhKSwiRW5kIG9mIEJsb2NrIiwgd3lfYmxvY2tlbmQ/ImNybGYvZXR4IjoidXMvY3IiKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorI2lmbmRlZiBOT1RSSUdHRVIKKyAgICBwcmludGYoIiAlMTlzOiAlLTEzcyAgJTEzczogJWQgc2Vjb25kc1xuIiwiQXV0by1leGl0IHRyaWdnZXIiLAorICAgICAgICAgICB0dF90cmlnZ2VyWzBdLCJPdXRwdXQgcGFjaW5nIix0dF9wYWNpbmcgKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorI2VuZGlmIC8qIE5PVFJJR0dFUiAqLworICAgIHByaW50ZigiICUxOXM6ICUtMTNzICAlMTNzOiAlLTE1ZFxuIiwiTWFyZ2luIGJlbGwiLAorICAgICAgICAgICBzaG93b2ZmKG1hcmdpbmJlbGwpLCJhdCBjb2x1bW4iLCBtYXJnaW5iZWxsY29sKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIHN3aXRjaCAodHRfbW9kZWNoZykgeworICAgICAgY2FzZSBUVkNfRElTOiBzID0gImRpc2FibGVkIjsgYnJlYWs7CisgICAgICBjYXNlIFRWQ19FTkE6IHMgPSAiZW5hYmxlZCI7ICBicmVhazsKKyAgICAgIGNhc2UgVFZDX1c5NTogcyA9ICJ3aW45NS1yZXN0cmljdGVkIjsgYnJlYWs7CisgICAgICBkZWZhdWx0OiBzID0gIih1bmtub3duKSI7CisgICAgfQorICAgIHByaW50ZigiICUxOXM6ICUtMTNzICAlMTNzOiAlLTE1c1xuIiwiREcgVW5peCBtb2RlIiwKKyAgICAgICAgICAgc2hvd29mZihkZ3VuaXgpLCJWaWRlbyBjaGFuZ2UiLCBzKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorCisjaWZkZWYgQ0tfQVBDCisgICAgaWYgKGFwY3N0YXR1cyA9PSBBUENfT04pIHMgPSAib24iOworICAgIGVsc2UgaWYgKGFwY3N0YXR1cyA9PSBBUENfT0ZGKSBzID0gIm9mZiI7CisgICAgZWxzZSBpZiAoYXBjc3RhdHVzID09IEFQQ19PTnxBUENfVU5DSCkgcyA9ICJ1bmNoZWNrZWQiOworICAgIGVsc2UgaWYgKGFwY3N0YXR1cyA9PSBBUENfT058QVBDX05PSU5QKSBzID0gIm5vLWlucHV0IjsKKyAgICBlbHNlIGlmIChhcGNzdGF0dXMgPT0gQVBDX09OfEFQQ19VTkNIfEFQQ19OT0lOUCkgcyA9ICJ1bmNoZWNrZWQtbm8taW5wdXQiOworICAgIHByaW50ZigiICUxOXM6ICUtMTNzICAlMTNzOiAlLTE1c1xuIiwKKyAgICAgICAgICAgIkFQQyIsIHMsCisjaWZkZWYgUENGT05UUworICAgICAgICAgICAiRm9udCAoVkdBKSIsZm9udAorI2Vsc2UgLyogUENGT05UUyAqLworI2lmZGVmIEtVSQorICAgICAgICAgICAiRm9udCIsZm9udAorI2Vsc2UKKyAgICAgICAgICAgIkZvbnQiLCIobm90IHN1cHBvcnRlZCkiCisjZW5kaWYgLyogS1VJICovCisjZW5kaWYgLyogUENGT05UUyAqLworCisgICAgICAgICAgICk7CisjZW5kaWYgLyogQ0tfQVBDICovCisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKworI2lmZGVmIENLX1RUR1dTSVogICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnNvbGUgdGVybWluYWwgc2NyZWVuIHNpemUgKi8KKyAgICBpZiAodHRfY29sc1tWVEVSTV0gPCAwIHx8IHR0X3Jvd3NbVlRFUk1dIDwgMCkKKyAgICAgIHR0Z3dzaXooKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZ2V0IGxhdGVzdCBzaXplICovCisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworICAgIHByaW50ZigiICUxOXM6ICUtMTNkICAlMTNzOiAlLTE1ZFxuIiwiSGVpZ2h0Iix0dF9yb3dzW1ZURVJNXSwKKyAgICAgICAgICAgIldpZHRoIix0dF9jb2xzW1ZURVJNXSk7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyNpZmRlZiBLVUkKKyAgICBwcmludGYoIiAlMTlzOiAlLTEzZiAgJTEzczogJS0xNWRcbiIsIkxpbmUgc3BhY2luZyIsdHRfbGluZXNwYWNpbmdbVlRFUk1dLAorICAgICAgICAgICAiRGlzcGxheSBIZWlnaHQiLFZzY3JuR2V0RGlzcGxheUhlaWdodChWVEVSTSkpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogS1VJICovCisgICAgcHJpbnRmKCIgJTE5czogJS0xM3MgICUxM3M6ICVkIGxpbmVzXG4iLCJSb2xsLW1vZGUiLAorICAgICAgICAgIHR0X3JvbGxbVlRFUk1dPyJpbnNlcnQiOiJvdmVyd3JpdGUiLCJTY3JvbGxiYWNrIiwgdHRfc2Nyc2l6ZVtWVEVSTV0pOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbGluZXMgPSAwOyB9CisKKyAgICBpZiAodXBkbW9kZSA9PSB0dF91cGRtb2RlKQorICAgICAgaWYgKHVwZG1vZGUgPT0gVFRVX0ZBU1QpCisgICAgICAgIHMgPSAiZmFzdCAoZmFzdCkiOworICAgICAgZWxzZQorICAgICAgICBzID0gInNtb290aCAoc21vb3RoKSI7CisgICAgZWxzZQorICAgICAgaWYgKHVwZG1vZGUgPT0gVFRVX0ZBU1QpCisgICAgICAgIHMgPSAiZmFzdCAoc21vb3RoKSI7CisgICAgICBlbHNlCisgICAgICAgIHMgPSAic21vb3RoIChmYXN0KSI7CisKKyAgICBwcmludGYoIiAlMTlzOiAlLTEzcyAgJTEzczogJWQgbXNcbiIsIlNjcmVlbi11cGRhdGU6IG1vZGUiLHMsCisgICAgICAgICAgICJpbnRlcnZhbCIsdHRfdXBkYXRlKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIHByaW50ZigiICUxOXM6ICUtMTNzICAlMTNzOiAlLTE1c1xuIiwKKyAgICAgICAgICAgIlNjcmVlbi1vcHRpbWl6YXRpb24iLHNob3dvZmYodHRfZGlmZl91cGQpLAorICAgICAgICAgICAiU3RhdHVzIGxpbmUiLHNob3dvZmYodHRfc3RhdHVzW1ZURVJNXSkpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCIgJTE5czogJS0xM3MgICUxM3M6ICUtMTVzXG4iLCJEZWJ1ZyIsCisgICAgICAgICAgIHNob3dvZmYoZGVic2VzKSwiU2Vzc2lvbiBsb2ciLCBzZXNsb2c/IHNlc2ZpbCA6ICIobm9uZSkiICk7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKworICAgIC8qIERpc3BsYXkgY29sb3JzIChzaG91bGQgYmVjb21lIFNIT1cgQ09MT1JTKSAqLworICAgIHsKKyAgICAgICAgVVNIT1JUIHJvdywgY29sOworICAgICAgICBjaGFyICogY29sb3JzWzE2XSA9IHsKKyAgICAgICAgICAgICJibGFjayIsImJsdWUiLCJncmVlbiIsImN5YW4iLCJyZWQiLCJtYWdlbnRhIiwiYnJvd24iLCJsZ3JheSIsCisgICAgICAgICAgICAiZGdyYXkiLCJsYmx1ZSIsImxncmVlbiIsImxjeWFuIiwibHJlZCIsImxtYWdlbnQiLCJ5ZWxsb3ciLCJ3aGl0ZSIKKyAgICAgICAgfTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorCisgICAgICAgIHByaW50ZigiIENvbG9yOiIpOworI2lmbmRlZiBPTkVURVJNVVBECisgICAgICAgIEdldEN1clBvcygmcm93LCAmY29sKTsKKyAgICAgICAgV3J0Q2hhclN0ckF0dCgiYm9yZGVyIiwgICAgNiwgcm93LCA5LCAmY29sb3Jib3JkZXIgKTsKKyAgICAgICAgV3J0Q2hhclN0ckF0dCgiZGVidWciLCAgICAgNSwgcm93LCAxNywgJmNvbG9yZGVidWcgKTsKKyAgICAgICAgV3J0Q2hhclN0ckF0dCgiaGVscHRleHQiLCAgOCwgcm93LCAyNSwgJmNvbG9yaGVscCApOworICAgICAgICBXcnRDaGFyU3RyQXR0KCJyZXZlcnNlIiwgICA3LCByb3csIDM0LCAmY29sb3JyZXZlcnNlICk7CisgICAgICAgIFdydENoYXJTdHJBdHQoInNlbGVjdCIsICAgIDYsIHJvdywgNDIsICZjb2xvcnNlbGVjdCApOworICAgICAgICBXcnRDaGFyU3RyQXR0KCJzdGF0dXMiLCAgICA2LCByb3csIDUwLCAmY29sb3JzdGF0dXMgKTsKKyAgICAgICAgV3J0Q2hhclN0ckF0dCgidGVybWluYWwiLCAgOCwgcm93LCA1OCwgJmNvbG9ybm9ybWFsICk7CisgICAgICAgIFdydENoYXJTdHJBdHQoInVuZGVybGluZSIsIDksIHJvdywgNjcsICZjb2xvcnVuZGVybGluZSApOworI2VuZGlmIC8qIE9ORVRFUk1VUEQgKi8KKyAgICAgICAgcm93ID0gVnNjcm5HZXRDdXJQb3MoVkNNRCktPnkrMTsKKyAgICAgICAgVnNjcm5XcnRDaGFyU3RyQXR0KFZDTUQsICJib3JkZXIiLCAgICA2LCByb3csIDksICZjb2xvcmJvcmRlciApOworICAgICAgICBWc2NybldydENoYXJTdHJBdHQoVkNNRCwgImRlYnVnIiwgICAgIDUsIHJvdywgMTcsICZjb2xvcmRlYnVnICk7CisgICAgICAgIFZzY3JuV3J0Q2hhclN0ckF0dChWQ01ELCAiaGVscHRleHQiLCAgOCwgcm93LCAyNSwgJmNvbG9yaGVscCApOworICAgICAgICBWc2NybldydENoYXJTdHJBdHQoVkNNRCwgInJldmVyc2UiLCAgIDcsIHJvdywgMzQsICZjb2xvcnJldmVyc2UgKTsKKyAgICAgICAgVnNjcm5XcnRDaGFyU3RyQXR0KFZDTUQsICJzZWxlY3QiLCAgICA2LCByb3csIDQyLCAmY29sb3JzZWxlY3QgKTsKKyAgICAgICAgVnNjcm5XcnRDaGFyU3RyQXR0KFZDTUQsICJzdGF0dXMiLCAgICA2LCByb3csIDUwLCAmY29sb3JzdGF0dXMgKTsKKyAgICAgICAgVnNjcm5XcnRDaGFyU3RyQXR0KFZDTUQsICJ0ZXJtaW5hbCIsICA4LCByb3csIDU4LCAmY29sb3Jub3JtYWwgKTsKKyAgICAgICAgVnNjcm5XcnRDaGFyU3RyQXR0KFZDTUQsICJ1bmRlcmxpbmUiLCAgOSwgcm93LCA2NywgJmNvbG9ydW5kZXJsaW5lICk7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKworICAgICAgICAvKiBGb3JlZ3JvdW5kIGNvbG9yIG5hbWVzICovCisgICAgICAgIHByaW50ZigiJTZzOiAlLThzJS04cyUtOXMlLThzJS04cyUtOHMlLTlzJS05c1xuIiwiZm9yZSIsCisgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgY29sb3JzW2NvbG9yZGVidWcmMHgwRl0sCisgICAgICAgICAgICAgICAgY29sb3JzW2NvbG9yaGVscCYweDBGXSwKKyAgICAgICAgICAgICAgICBjb2xvcnNbY29sb3JyZXZlcnNlJjB4MEZdLAorICAgICAgICAgICAgICAgIGNvbG9yc1tjb2xvcnNlbGVjdCYweDBGXSwKKyAgICAgICAgICAgICAgICBjb2xvcnNbY29sb3JzdGF0dXMmMHgwRl0sCisgICAgICAgICAgICAgICAgY29sb3JzW2NvbG9ybm9ybWFsJjB4MEZdLAorICAgICAgICAgICAgICAgIGNvbG9yc1tjb2xvcnVuZGVybGluZSYweDBGXSk7CisgICAgICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbGluZXMgPSAwOyB9CisKKyAgICAgICAgLyogQmFja2dyb3VuZCBjb2xvciBuYW1lcyAqLworICAgICAgICBwcmludGYoIiU2czogJS04cyUtOHMlLTlzJS04cyUtOHMlLThzJS05cyUtOXNcbiIsImJhY2siLAorICAgICAgICAgICAgICAgIGNvbG9yc1tjb2xvcmJvcmRlcl0sCisgICAgICAgICAgICAgICAgY29sb3JzW2NvbG9yZGVidWc+PjRdLAorICAgICAgICAgICAgICAgIGNvbG9yc1tjb2xvcmhlbHA+PjRdLAorICAgICAgICAgICAgICAgIGNvbG9yc1tjb2xvcnJldmVyc2U+PjRdLAorICAgICAgICAgICAgICAgIGNvbG9yc1tjb2xvcnNlbGVjdD4+NF0sCisgICAgICAgICAgICAgICAgY29sb3JzW2NvbG9yc3RhdHVzPj40XSwKKyAgICAgICAgICAgICAgICBjb2xvcnNbY29sb3Jub3JtYWw+PjRdLAorICAgICAgICAgICAgICAgIGNvbG9yc1tjb2xvcnVuZGVybGluZT4+NF0gKTsKKyAgICAgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorICAgICAgICBwcmludGYoIiBDb2xvcjoiKTsKKyNpZm5kZWYgT05FVEVSTVVQRAorICAgICAgICBHZXRDdXJQb3MoJnJvdywgJmNvbCk7CisgICAgICAgIFdydENoYXJTdHJBdHQoImdyYXBoaWMiLCAgIDcsIHJvdywgOSwgJmNvbG9yZ3JhcGhpYyApOworICAgICAgICBXcnRDaGFyU3RyQXR0KCJjb21tYW5kIiwgICA3LCByb3csIDE3LCAmY29sb3JjbWQgKTsKKyAgICAgICAgV3J0Q2hhclN0ckF0dCgiaXRhbGljIiwgICAgNiwgcm93LCAyNiwgJmNvbG9yaXRhbGljICk7CisjZW5kaWYgLyogT05FVEVSTVVQRCAqLworICAgICAgICByb3cgPSBWc2NybkdldEN1clBvcyhWQ01EKS0+eSsxOworICAgICAgICBWc2NybldydENoYXJTdHJBdHQoVkNNRCwgImdyYXBoaWMiLCAgIDcsIHJvdywgOSwgICZjb2xvcmdyYXBoaWMgKTsKKyAgICAgICAgVnNjcm5XcnRDaGFyU3RyQXR0KFZDTUQsICJjb21tYW5kIiwgICA3LCByb3csIDE3LCAmY29sb3JjbWQgKTsKKyAgICAgICAgVnNjcm5XcnRDaGFyU3RyQXR0KFZDTUQsICJpdGFsaWMiLCAgICA2LCByb3csIDI2LCAmY29sb3JpdGFsaWMgKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorCisgICAgICAgIC8qIEZvcmVncm91bmQgY29sb3IgbmFtZXMgKi8KKyAgICAgICAgcHJpbnRmKCIlNnM6ICUtOHMlLThzJS04c1xuIiwiZm9yZSIsCisgICAgICAgICAgICAgICAgY29sb3JzW2NvbG9yZ3JhcGhpYyYweDBGXSwKKyAgICAgICAgICAgICAgICBjb2xvcnNbY29sb3JjbWQmMHgwRl0sCisgICAgICAgICAgICAgICAgY29sb3JzW2NvbG9yaXRhbGljJjB4MEZdKTsKKyAgICAgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKworICAgICAgICAvKiBCYWNrZ3JvdW5kIGNvbG9yIG5hbWVzICovCisgICAgICAgIHByaW50ZigiJTZzOiAlLThzJS04cyUtOHNcbiIsImJhY2siLAorICAgICAgICAgICAgICAgIGNvbG9yc1tjb2xvcmdyYXBoaWM+PjRdLAorICAgICAgICAgICAgICAgIGNvbG9yc1tjb2xvcmNtZD4+NF0sCisgICAgICAgICAgICAgICAgY29sb3JzW2NvbG9yaXRhbGljPj40XSk7CisgICAgICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbGluZXMgPSAwOyB9CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIHsKKyAgICAgICAgZXh0ZXJuIGludCB0cnVlYmxpbmssIHRydWVyZXZlcnNlLCB0cnVldW5kZXJsaW5lLCB0cnVlaXRhbGljOworICAgICAgICBwcmludGYoCisgICAgIiBBdHRyaWJ1dGU6ICBibGluazogJS0zcyAgcmV2ZXJzZTogJS0zcyAgdW5kZXJsaW5lOiAlLTNzIGl0YWxpYzogJS0zc1xuIiwKKyAgICAgICAgICAgICAgICB0cnVlYmxpbms/Im9uIjoib2ZmIiwgdHJ1ZXJldmVyc2U/Im9uIjoib2ZmIiwKKyAgICAgICAgICAgICAgICB0cnVldW5kZXJsaW5lPyJvbiI6Im9mZiIsIHRydWVpdGFsaWM/Im9uIjoib2ZmIik7CisgICAgICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm47IGVsc2UgbGluZXMgPSAwOyB9CisgICAgfQorICAgIHsKKyAgICAgICAgZXh0ZXJuIHZ0YXR0cmliIFdQYXR0cmliOworICAgICAgICBwcmludGYoIiBBU0NJSSBQcm90ZWN0ZWQgY2hhcnM6ICVzJXMlcyVzJXMlcyVzXG4iLAorICAgICAgICAgICAgICAgIFdQYXR0cmliLmJsaW5raW5nPyJibGluayAiOiIiLAorICAgICAgICAgICAgICAgIFdQYXR0cmliLml0YWxpYz8iaXRhbGljICI6IiIsCisgICAgICAgICAgICAgICAgV1BhdHRyaWIucmV2ZXJzZWQ/InJldmVyc2UgIjoiIiwKKyAgICAgICAgICAgICAgICBXUGF0dHJpYi51bmRlcmxpbmVkPyJ1bmRlcmxpbmUgIjoiIiwKKyAgICAgICAgICAgICAgICBXUGF0dHJpYi5ib2xkPyJib2xkICI6IiIsCisgICAgICAgICAgICAgICAgV1BhdHRyaWIuZGltPyJkaW0gIjoiIiwKKyAgICAgICAgICAgICAgICBXUGF0dHJpYi5pbnZpc2libGU/ImludmlzaWJsZSAiOiIiKTsKKyAgICAgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICB9CisKKyAgICBwcmludGYoIlxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICAoVk9JRCkgc2hvZXNjKGVzY2FwZSk7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybjsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIiBTZWUgU0hPVyBDSEFSQUNURVItU0VUUyBmb3IgY2hhcmFjdGVyLXNldCBpbmZvXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuOyBlbHNlIGxpbmVzID0gMDsgfQorCisjZWxzZSAvKiBPUzIgKi8gICAvKiBCZWdpbm5pbmcgb2YgbmV3IG5vbi1PUzIgdmVyc2lvbiAqLworCisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiVGVybWluYWwgcGFyYW1ldGVyczpcbiIpOworICAgIHByaW50ZigiICUxOXM6ICUxZCUtMTJzICAlMTNzOiAlMWQlLTE0c1xuIiwKKyAgICAgICAgICAgIkJ5dGVzaXplOiBDb21tYW5kIiwKKyAgICAgICAgICAgKGNtZG1zayA9PSAwMzc3KSA/IDggOiA3LAorICAgICAgICAgICAiIGJpdHMiLCJUZXJtaW5hbCIsCisgICAgICAgICAgIChjbWFzayA9PSAwMzc3KSA/IDggOiA3LCIgYml0cyIpOworICAgIHMgPSBnZXRlbnYoIlRFUk0iKTsKKyNpZmRlZiBYUFJJTlQKKyAgICBwcmludGYoIiAlMTlzOiAlLTEzcyAgJTEzczogJS0xNXNcbiIsCisgICAgICAgICAgICJUeXBlIiwKKyAgICAgICAgICAgcyA/IHMgOiAiKHVua25vd24pIiwKKyAgICAgICAgICAgIlByaW50IiwKKyAgICAgICAgICAgc2hvd29mZih0dF9wcmludCkKKyAgICAgICAgICAgKTsKKyNlbHNlCisgICAgcHJpbnRmKCIgJTE5czogJS0xM3NcbiIsIlR5cGUiLCBzID8gcyA6ICIodW5rbm93bikiKTsKKyNlbmRpZiAvKiBYUFJJTlQgKi8KKyAgICBwcmludGYoIiAlMTlzOiAlLTEzcyAgJTEzczogJS0xNXNcbiIsIkVjaG8iLAorICAgICAgICAgICBkdXBsZXggPyAibG9jYWwiIDogInJlbW90ZSIsIkxvY2tpbmctc2hpZnQiLHNob3dvZmYoc29zaSkpOworICAgIHByaW50ZigiICUxOXM6ICUtMTNzICAlMTNzOiAlLTE1c1xuIiwiTmV3bGluZS1tb2RlIiwKKyAgICAgICAgICAgc2hvd29mZih0bmxtKSwiQ3ItZGlzcGxheSIsdHRfY3JkID8gImNybGYiIDogIm5vcm1hbCIpOworCisjaWZkZWYgQ0tfQVBDCisgICAgaWYgKGFwY3N0YXR1cyA9PSBBUENfT04pIHMgPSAib24iOworICAgIGVsc2UgaWYgKGFwY3N0YXR1cyA9PSBBUENfT0ZGKSBzID0gIm9mZiI7CisgICAgZWxzZSBpZiAoYXBjc3RhdHVzID09IEFQQ19PTnxBUENfVU5DSCkgcyA9ICJ1bmNoZWNrZWQiOworICAgIGVsc2UgaWYgKGFwY3N0YXR1cyA9PSBBUENfT058QVBDX05PSU5QKSBzID0gIm5vLWlucHV0IjsKKyAgICBlbHNlIGlmIChhcGNzdGF0dXMgPT0gQVBDX09OfEFQQ19VTkNIfEFQQ19OT0lOUCkgcyA9ICJ1bmNoZWNrZWQtbm8taW5wdXQiOworICAgIHByaW50ZigiICUxOXM6ICUtMTNzICAlMTNzOiAlLTE1c1xuIiwKKyAgICAgICAgICAgIkFQQyIsIHMsCisjaWZkZWYgQ0tfQVVUT0RMCisgICAgICAgICAgICJBdXRvZG93bmxvYWQiLCBhdXRvZGwgPworICAgICAgICAgICAoYWRsX2VyciA/ICJvbiwgZXJyb3Igc3RvcCIgOiAib24sIGVycm9yIGNvbnRpbnVlIikgOiAib2ZmIgorI2Vsc2UKKyAgICAgICAgICAgIiIsIiIKKyNlbmRpZiAvKiBDS19BVVRPREwgKi8KKyAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKworI2lmZGVmIENLX1RUR1dTSVogICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnNvbGUgdGVybWluYWwgc2NyZWVuIHNpemUgKi8KKyAgICB0dGd3c2l6KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZ2V0IGxhdGVzdCBzaXplICovCisgICAgcHJpbnRmKCIgJTE5czogJS0xM2QgICUxM3M6ICUtMTVkXG4iLCJIZWlnaHQiLHR0X3Jvd3MsICJXaWR0aCIsIHR0X2NvbHMpOworI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKworICAgIHByaW50ZigiICUxOXM6ICUtMTNzICAlMTNzOiAlLTE1c1xuIiwiRGVidWciLAorICAgICAgICAgICBzaG93b2ZmKGRlYnNlcyksIlNlc3Npb24gbG9nIiwgc2VzbG9nPyBzZXNmaWwgOiAiKG5vbmUpIiApOworCisjaWZkZWYgQ0tUSURMRQorICAgIHByaW50ZigiICUxOXM6ICUtMTNkICAlMTNzOiAlc1xuIiwiSWRsZS10aW1lb3V0Iix0dF9pZGxlbGltaXQsCisgICAgICAgICAgICJJZGxlLWFjdGlvbiIsIGdldGlhY3QoKSk7CisjZW5kaWYgLyogQ0tUSURMRSAqLworCisjaWZuZGVmIE5PVFJJR0dFUgorICAgIHByaW50ZigiICUxOXM6ICUtMTNzXG4iLCJUcmlnZ2VyIiwKKyAgICAgICAgICAgdHRfdHJpZ2dlclswXSA/IHR0X3RyaWdnZXJbMF0gOiAiKG5vbmUpIik7CisjZW5kaWYgLyogTk9UUklHR0VSICovCisjaWZkZWYgVU5JWAorI2lmbmRlZiBOT0pDCisgICAgcHJpbnRmKCIgJTE5czogJS0xM3NcblxuIiwiU3VzcGVuZCIsIHNob3dvZmYoeHN1c3BlbmQpKTsKKyNlbmRpZiAvKiBOT0pDICovCisjZW5kaWYgLyogVU5JWCAqLworCisgICAgcHJpbnRmKCJcbiIpOworICAgIChWT0lEKSBzaG9lc2MoZXNjYXBlKTsKKyNpZm5kZWYgTk9DU0VUUworICAgIHNob3Rjcyh0Y3NsLHRjc3IpOyAgICAgICAgICAvKiBTaG93IHRlcm1pbmFsIGNoYXJhY3RlciBzZXRzICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCisjZW5kaWYgLyogT1MyICovCit9CisKK1ZPSUQKK3NobWRtbGluKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCcmllZmx5IHNob3cgbW9kZW0gJiBsaW5lICovCisjaWZuZGVmIE5PRElBTAorI2lmbmRlZiBNSU5JRElBTAorI2lmZGVmIE9MRFRCQ09ERQorICAgIGV4dGVybiBpbnQgdGJtb2RlbDsKKyAgICBfUFJPVE9UWVAoIGNoYXIgKiBndGJtb2RlbCwgKHZvaWQpICk7CisjZW5kaWYgLyogT0xEVEJDT0RFICovCisjZW5kaWYgLyogTUlOSURJQUwgKi8KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyAgICBpZiAobG9jYWwpCisjaWZkZWYgT1MyCisgICAgICBwcmludGYoIiBQb3J0OiAlcywgTW9kZW0gdHlwZTogIix0dG5hbWUpOworI2Vsc2UKKyAgICAgIHByaW50ZigiIExpbmU6ICVzLCBNb2RlbSB0eXBlOiAiLHR0bmFtZSk7CisjZW5kaWYgLyogT1MyICovCisgICAgZWxzZQorICAgICAgcHJpbnRmKAorI2lmZGVmIE9TMgorIiBDb21tdW5pY2F0aW9uIGRldmljZSBub3QgeWV0IHNlbGVjdGVkIHdpdGggU0VUIFBPUlRcbiBNb2RlbSB0eXBlOiAiCisjZWxzZQorIiBDb21tdW5pY2F0aW9uIGRldmljZSBub3QgeWV0IHNlbGVjdGVkIHdpdGggU0VUIExJTkVcbiBNb2RlbSB0eXBlOiAiCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgKTsKKyNpZm5kZWYgTk9ESUFMCisgICAgcHJpbnRmKCIlcyIsZ21kbXR5cCgpKTsKKyNpZm5kZWYgTUlOSURJQUwKKyNpZmRlZiBPTERUQkNPREUKKyAgICBpZiAodGJtb2RlbCkgcHJpbnRmKCIgKCVzKSIsZ3RibW9kZWwoKSk7IC8qIFRlbGViaXQgbW9kZWwgaW5mbyAqLworI2VuZGlmIC8qIE9MRFRCQ09ERSAqLworI2VuZGlmIC8qIE1JTklESUFMICovCisjZWxzZQorICAgIHByaW50ZigiKGRpc2FibGVkKSIpOworI2VuZGlmIC8qIE5PRElBTCAqLworfQorCisjaWZkZWYgQ0tfVEFQSQordm9pZAorc2hvdGFwaShpbnQgb3B0aW9uKSB7CisgICAgaW50IHJjPTAsayA7CisgICAgY2hhciAqcz1OVUxMOworICAgIExQREVWQ0ZHICAgICAgICBscERldkNmZyA9IE5VTEw7CisgICAgTFBDT01NQ09ORklHICAgIGxwQ29tbUNvbmZpZyA9IE5VTEw7CisgICAgTFBNT0RFTVNFVFRJTkdTIGxwTW9kZW1TZXR0aW5ncyA9IE5VTEw7CisgICAgRENCICogICAgICAgICAgIGxwRENCID0gTlVMTDsKKyAgICBleHRlcm4gc3RydWN0IGtleXRhYiAqIHRhcGlsb2N0YWI7ICAvKiBNaWNyb3NvZnQgVEFQSSBMb2NhdGlvbnMgKi8KKyAgICBleHRlcm4gaW50IG50YXBpbG9jOworICAgIGV4dGVybiBzdHJ1Y3Qga2V5dGFiICogdGFwaWxpbmV0YWI7IC8qIE1pY3Jvc29mdCBUQVBJIExpbmUgRGV2aWNlcyAqLworICAgIGV4dGVybiBpbnQgbnRhcGlsaW5lOworICAgIGV4dGVybiBpbnQgdHR0YXBpOyAgICAgICAgICAgICAgICAgIC8qIFRBUEkgaW4gdXNlICovCisgICAgZXh0ZXJuIGludCB0YXBpcGFzczsgICAgICAgICAgICAgICAgLyogVEFQSSBQYXNzdGhyb3VnaCBtb2RlICovCisgICAgZXh0ZXJuIGludCB0YXBpY29udjsgICAgICAgICAgICAgICAgLyogVEFQSSBDb252ZXJzaW9uIG1vZGUgKi8KKyAgICBleHRlcm4gaW50IHRhcGlsaWdodHM7CisgICAgZXh0ZXJuIGludCB0YXBpcHJldGVybTsKKyAgICBleHRlcm4gaW50IHRhcGlwb3N0dGVybTsKKyAgICBleHRlcm4gaW50IHRhcGltYW51YWw7CisgICAgZXh0ZXJuIGludCB0YXBpaW5hY3Rpdml0eTsKKyAgICBleHRlcm4gaW50IHRhcGlib25nOworICAgIGV4dGVybiBpbnQgdGFwaXVzZWNmZzsKKyAgICBleHRlcm4gY2hhciB0YXBpbG9jW107CisgICAgZXh0ZXJuIGludCB0YXBpbG9jaWQ7CisgICAgZXh0ZXJuIGludCBUQVBJQXZhaWw7CisKKyAgICBpZiAoIVRBUElBdmFpbCkgeworICAgICAgICBwcmludGYoIlRBUEkgU3VwcG9ydCBub3QgZW5hYmxlZFxyXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgY2FzZSAwOgorICAgICAgICBwcmludGYoIlRBUEkgU2V0dGluZ3M6XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIExpbmU6ICAgICAgICAgICAgICAgICAgICAgICVzXG4iLAorICAgICAgICAgICAgICAgdHR0YXBpID8gdHRuYW1lIDogIihub25lIGluIHVzZSkiKTsKKworICAgICAgICBja3RhcGlCdWlsZExvY2F0aW9uVGFibGUoJnRhcGlsb2N0YWIsICZudGFwaWxvYyk7CisgICAgICAgIGlmICh0YXBpbG9jaWQgPT0gLTEpCisgICAgICAgICAgdGFwaWxvY2lkID0gY2t0YXBpR2V0Q3VycmVudExvY2F0aW9uSUQoKTsKKworICAgICAgICAvKiBGaW5kIHRoZSBjdXJyZW50IHRhcGlsb2MgZW50cnkgKi8KKyAgICAgICAgLyogYW5kIHVzZSBpdCBhcyB0aGUgZGVmYXVsdC4gKi8KKyAgICAgICAgZm9yIChrID0gMDsgayA8IG50YXBpbG9jOyBrKyspIHsKKyAgICAgICAgICAgIGlmICh0YXBpbG9jdGFiW2tdLmt3dmFsID09IHRhcGlsb2NpZCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGsgPj0gMCAmJiBrIDwgbnRhcGlsb2MpCisgICAgICAgICAgcyA9IHRhcGlsb2N0YWJba10ua3dkOworICAgICAgICBlbHNlCisgICAgICAgICAgcyA9ICIodW5rbm93bikiOworICAgICAgICBwcmludGYoIiAgTG9jYXRpb246ICAgICAgICAgICAgICAgICAgJXNcbiIscyk7CisgICAgICAgIHByaW50ZigiICBNb2RlbS1kaWFsaW5nOiAgICAgICAgICAgICAlc1xuIix0YXBpcGFzcz8ib2ZmIjoib24iKTsKKyAgICAgICAgcHJpbnRmKCIgIFBob25lLW51bWJlci1jb252ZXJzaW9uczogICVzXG4iLAorICAgICAgICAgICAgICAgIHRhcGljb252PT1DS19PTj8ib24iOnRhcGljb252PT1DS19BVVRPPyJhdXRvIjoib2ZmIik7CisgICAgICAgIHByaW50ZigiICBNb2RlbS1saWdodHM6ICAgICAgICAgICAgICAlcyAlc1xuIix0YXBpbGlnaHRzPyJvbiAiOiJvZmYiLAorICAgICAgICAgICAgICAgIHRhcGlwYXNzPyIobi9hKSI6IiIpOworICAgICAgICBwcmludGYoIiAgUHJlZGlhbC10ZXJtaW5hbDogICAgICAgICAgJXMgJXNcbiIsdGFwaXByZXRlcm0/Im9uICI6Im9mZiIsCisgICAgICAgICAgICAgICAgdGFwaXBhc3M/IihuL2EpIjoiIik7CisgICAgICAgIHByaW50ZigiICBQb3N0ZGlhbC10ZXJtaW5hbDogICAgICAgICAlcyAlc1xuIix0YXBpcG9zdHRlcm0/Im9uICI6Im9mZiIsCisgICAgICAgICAgICAgICAgdGFwaXBhc3M/IihuL2EpIjoiIik7CisgICAgICAgIHByaW50ZigiICBNYW51YWwtZGlhbDogICAgICAgICAgICAgICAlcyAlc1xuIix0YXBpbWFudWFsPyJvbiAiOiJvZmYiLAorICAgICAgICAgICAgICAgIHRhcGlwYXNzPyIobi9hKSI6IiIpOworICAgICAgICBwcmludGYoIiAgSW5hY3Rpdml0eS10aW1lb3V0OiAgICAgICAgJWQgc2Vjb25kcyAlc1xuIix0YXBpaW5hY3Rpdml0eSwKKyAgICAgICAgICAgICAgICB0YXBpcGFzcz8iKG4vYSkiOiIiKTsKKyAgICAgICAgcHJpbnRmKCIgIFdhaXQtZm9yLWJvbmc6ICAgICAgICAgICAgICVkIHNlY29uZHMgJXNcbiIsdGFwaWJvbmcsCisgICAgICAgICAgICAgICAgdGFwaXBhc3M/IihuL2EpIjoiIik7CisgICAgICAgIHByaW50ZigiICBVc2Utd2luZG93cy1jb25maWd1cmF0aW9uOiAlcyAlc1xuIiwKKyAgICAgICAgICAgICAgICB0YXBpdXNlY2ZnPyJvbiAiOiJvZmYiLCB0YXBpcGFzcz8iKG4vYSkiOiIiKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworCisjaWZkZWYgQkVUQVRFU1QKKyAgICAgICAgaWYgKHRhcGlwYXNzKSB7CitwcmludGYoIkstOTUgdXNlcyB0aGUgVEFQSSBMaW5lIGluIGFuIGV4Y2x1c2l2ZSBtb2RlLiAgT3RoZXIgYXBwbGljYXRpb25zXG4iKTsKK3ByaW50ZigibWF5IG9wZW4gdGhlIGRldmljZSBidXQgbWF5IG5vdCBwbGFjZSBjYWxscyBub3IgYW5zd2VyIGNhbGxzLlxuIik7CitwcmludGYoIkRpYWxpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBLLTk1IGRpYWxpbmcgcHJvY2VkdXJlcy4gIFNFVCBNT0RFTVxuIik7CitwcmludGYoIlRZUEUgVEFQSSBhZnRlciB0aGUgU0VUIFRBUEkgTElORSBjb21tYW5kIHRvIGFjdGl2YXRlIHRoZSBtb2RlbVxuIik7CitwcmludGYoImRlZmluaXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY3RpdmUgVEFQSSBMSU5FIGRldmljZS5cblxuIik7CisKKyAgICAgICAgfSBlbHNlIHsKKworcHJpbnRmKCJLLTk1IHVzZXMgdGhlIFRBUEkgTGluZSBpbiBhIGNvb3BlcmF0aXZlIG1vZGUuICBPdGhlciBhcHBsaWNhdGlvbnNcbiIpOworcHJpbnRmKCJtYXkgb3BlbiB0aGUgZGV2aWNlLCBwbGFjZSBhbmQgYW5zd2VyIGNhbGxzLiAgRGlhbGluZyBpcyBwZXJmb3JtZWRcbiIpOworcHJpbnRmKCJieSBUQVBJLiAgSy05NSBTRVQgTU9ERU0gY29tbWFuZHMgYXJlIG5vdCB1c2VkLlxuXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YXBpY29udiA9PSBDS19PTiB8fAorICAgICAgICAgICAgdGFwaWNvbnYgPT0gQ0tfQVVUTyAmJiAhdGFwaXBhc3MpIHsKK3ByaW50ZigKKyJQaG9uZSBudW1iZXJzIGFyZSBjb252ZXJ0ZWQgZnJvbSBjYW5vbmljYWwgdG8gZGlhbGFibGUgZm9ybSBieSBUQVBJXG4iKTsKK3ByaW50ZigidXNpbmcgdGhlIGRpYWxpbmcgcnVsZXMgc3BlY2lmaWVkIGluIHRoZSBUQVBJIERpYWxpbmcgUHJvcGVydGllc1xuIik7CitwcmludGYoImRpYWxvZy5cblxuIik7CisKKyAgICAgICAgfSBlbHNlIHsKKworcHJpbnRmKAorIlBob25lIG51bWJlcnMgYXJlIGNvbnZlcnRlZCBmcm9tIGNhbm9uaWNhbCB0byBkaWFsYWJsZSBmb3JtIGJ5IEstOTVcbiIpOworcHJpbnRmKAorInVzaW5nIHRoZSBkaWFsaW5nIHJ1bGVzIHNwZWNpZmllZCB3aXRoIHRoZSBTRVQgRElBTCBjb21tYW5kcy4gIFRBUElcbiIpOworcHJpbnRmKAorIkRpYWxpbmcgUHJvcGVydGllcyBhcmUgaW1wb3J0ZWQgYXV0b21hdGljbHkgdXBvbiBzdGFydHVwIGFuZCB3aGVuZXZlclxuIik7CitwcmludGYoInRoZSBUQVBJIERpYWxpbmcgUHJvcGVydGllcyBhcmUgYWx0ZXJlZCBvciB3aGVuIHRoZSBUQVBJIExvY2F0aW9uXG4iKTsKK3ByaW50ZigiaXMgY2hhbmdlZC5cblxuIik7CisgICAgICAgIH0KKyNlbmRpZiAvKiBCRVRBVEVTVCAqLworCisgICAgICAgIGlmICh0YXBpcGFzcykgeworICAgICAgICAgICAgcHJpbnRmKCJUeXBlIFNIT1cgTU9ERU0gdG8gc2VlIE1PREVNIGNvbmZpZ3VyYXRpb24uXG4iKTsKKyAgICAgICAgICAgIGlmICh0YXBpY29udiA9PSBDS19PTikKKyAgICAgICAgICAgICAgcHJpbnRmKCJUeXBlIFNIT1cgRElBTCB0byBzZWUgRElBTC1yZWxhdGVkIGl0ZW1zLlxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodGFwaWNvbnYgPT0gQ0tfT04gfHwgdGFwaWNvbnYgPT0gQ0tfQVVUTykKKyAgICAgICAgICAgICAgcHJpbnRmKCJUeXBlIFNIT1cgRElBTCB0byBzZWUgRElBTC1yZWxhdGVkIGl0ZW1zLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIGNrdGFwaURpc3BsYXlUYXBpTG9jYXRpb25JbmZvKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICByYyA9IGNrdGFwaUdldE1vZGVtU2V0dGluZ3MoJmxwRGV2Q2ZnLCZscE1vZGVtU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxwQ29tbUNvbmZpZywmbHBEQ0IpOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIGNrdGFwaURpc3BsYXlNb2RlbVNldHRpbmdzKGxwRGV2Q2ZnLGxwTW9kZW1TZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDb21tQ29uZmlnLGxwRENCKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byByZXRyaWV2ZSBNb2RlbSBTZXR0aW5nc1xuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6IHsKKyAgICAgICAgICBIQU5ETEUgaE1vZGVtID0gR2V0TW9kZW1IYW5kbGVGcm9tTGluZSgoSExJTkUpMCk7CisgICAgICAgICAgaWYgKGhNb2RlbSkKKyAgICAgICAgICAgIERpc3BsYXlDb21tUHJvcGVydGllcyhoTW9kZW0pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiP1VuYWJsZSB0byByZXRyaWV2ZSBhIHZhbGlkIE1vZGVtIEhhbmRsZVxuIik7CisgICAgICAgICAgQ2xvc2VIYW5kbGUoaE1vZGVtKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworfQorI2VuZGlmIC8qIENLX1RBUEkgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBQQVRURVJOUworc3RhdGljIFZPSUQKK3Nob3BhdCgpIHsKKyAgICBleHRlcm4gY2hhciAqIGJpbnBhdHRlcm5zW10sICogdHh0cGF0dGVybnNbXTsKKyAgICBleHRlcm4gaW50IHBhdHRlcm5zLCBmaWxlcGVlazsKKyAgICBjaGFyICoqcCwgKnM7CisgICAgaW50IGksIGosIGssIG4sIGZsYWcsIHdpZHRoOworI2lmZGVmIENLX1RUR1dTSVoKKyAgICB0dGd3c2l6KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZ2V0IGxhdGVzdCBzaXplICovCisjaWZkZWYgT1MyCisgICAgd2lkdGggPSB0dF9jb2xzW1ZDTURdOworI2Vsc2UgLyogT1MyICovCisgICAgd2lkdGggPSB0dF9jb2xzOworI2VuZGlmIC8qIE9TMiAqLworICAgIGlmICh3aWR0aCA8IDEpCisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworICAgICAgd2lkdGggPSA4MDsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCIgU2V0IGZpbGUgdHlwZTogICAgICAgICAgICAlc1xuIixnZm1vZGUoYmluYXJ5LDEpKTsKKyAgICBwcmludGYoIiBTZXQgZmlsZSBwYXR0ZXJuczogICAgICAgICVzIiwgc2hvd29vYShwYXR0ZXJucykpOworI2lmZGVmIENLX0xBQkVMRUQKKyAgICBpZiAoYmluYXJ5ID09IFhZRlRfTCkKKyAgICAgIHByaW50ZigiIChidXQgU0VUIEZJTEUgVFlQRSBMQUJFTEVEIG92ZXJyaWRlcylcbiIpOworICAgIGVsc2UKKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisjaWZkZWYgVk1TCisgICAgaWYgKGJpbmFyeSA9PSBYWUZUX0kpCisgICAgICBwcmludGYoIiAoYnV0IFNFVCBGSUxFIFRZUEUgSU1BR0Ugb3ZlcnJpZGVzKVxuIik7CisgICAgZWxzZQorI2VuZGlmIC8qIFZNUyAqLworICAgIGlmIChmaWxlcGVlaykKKyAgICAgIHByaW50ZigiIChidXQgU0VUIEZJTEUgU0NBTiBPTiBvdmVycmlkZXMpXG4iKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCIgTWF4aW11bSBwYXR0ZXJucyBhbGxvd2VkOiAlZFxuIiwgRlRQQVRURVJOUyk7CisgICAgZm9yIChrID0gMDsgayA8IDI7IGsrKykgeyAgICAgICAgICAgLyogRm9yIGVhY2gga2luZCBvZiBwYXR0ZXIgKi8KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBpZiAoayA9PSAwKSB7ICAgICAgICAgICAgICAgICAgIC8qIGJpbmFyeS4uLiAqLworICAgICAgICAgICAgcHJpbnRmKCIgRmlsZSBiaW5hcnktcGF0dGVybnM6ICIpOworICAgICAgICAgICAgcCA9IGJpbnBhdHRlcm5zOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRleHQuLi4gKi8KKyAgICAgICAgICAgIHByaW50ZigiIEZpbGUgdGV4dC1wYXR0ZXJuczogICAiKTsKKyAgICAgICAgICAgIHAgPSB0eHRwYXR0ZXJuczsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXBbMF0pIHsKKyAgICAgICAgICAgIHByaW50ZigiKG5vbmUpXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4gIik7CisgICAgICAgICAgICBuID0gMjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGVFBBVFRFUk5TOyBpKyspIHsgLyogRm9yIGVhY2ggcGF0dGVybiAqLworICAgICAgICAgICAgICAgIGlmICghcFtpXSkgICAgICAgICAgICAgIC8qIERvbmUgKi8KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHMgPSBwW2ldOyAgICAgICAgICAgICAgIC8qIExvb2sgZm9yIGVtYmVkZGVkIHNwYWNlICovCisgICAgICAgICAgICAgICAgZm9yIChqID0gMCwgZmxhZyA9IDE7ICpzOyBzKyssIGorKykgLyogYW5kIGFsc28gZ2V0IGxlbmd0aCAqLworICAgICAgICAgICAgICAgICAgaWYgKCpzID09IFNQKQorICAgICAgICAgICAgICAgICAgICBmbGFnID0gMzsKKyAgICAgICAgICAgICAgICBuICs9IGogKyBmbGFnOyAgICAgICAgICAvKiBMZW5ndGggb2YgdGhpcyBsaW5lICovCisgICAgICAgICAgICAgICAgaWYgKG4gPj0gd2lkdGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gIik7CisgICAgICAgICAgICAgICAgICAgIG4gPSBqKzI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50ZihmbGFnID09IDMgPyAiIHslc30iIDogIiAlcyIsIHBbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPiAyKQorICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworfQorI2VuZGlmIC8qIFBBVFRFUk5TICovCisKKyNpZm5kZWYgTk9TUEwKK3N0YXRpYyBWT0lECitzaG9vdXRwdXQoKSB7CisgICAgcHJpbnRmKCIgT3V0cHV0IHBhY2luZzogICAgICAgICAgJWQgKG1pbGxpc2Vjb25kcylcbiIscGFjaW5nKTsKKyAgICBwcmludGYoIiBPdXRwdXQgc3BlY2lhbC1lc2NhcGVzOiAlc1xuIiwgc2hvd29mZihvdXRlc2MpKTsKK30KKworc3RhdGljIFZPSUQKK3Nob2lucHV0KCkgeworI2lmZGVmIENLRkxPQVQKKyAgICBleHRlcm4gY2hhciAqIGlucHNjYWxlOworI2VuZGlmCS8qIENLRkxPQVQgKi8KKworI2lmZGVmIENLX0FVVE9ETAorICAgIHByaW50ZigiIElucHV0IGF1dG9kb3dubG9hZDogICAgICVzXG4iLCBzaG93b2ZmKGluYXV0b2RsKSk7CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisgICAgcHJpbnRmKCIgSW5wdXQgY2FuY2VsbGF0aW9uOiAgICAgJXNcbiIsIHNob3dvZmYoaW5pbnRyKSk7CisgICAgcHJpbnRmKCIgSW5wdXQgY2FzZTogICAgICAgICAgICAgJXNcbiIsIGlucGNhc1tjbWRsdmxdID8KKyAgICAgICAgICAgIm9ic2VydmUiIDogImlnbm9yZSIpOworICAgIHByaW50ZigiIElucHV0IGJ1ZmZlci1sZW5ndGg6ICAgICVkXG4iLCBpbmJ1ZnNpemUpOworICAgIHByaW50ZigiIElucHV0IGVjaG86ICAgICAgICAgICAgICVzXG4iLCBzaG93b2ZmKGluZWNobykpOworICAgIHByaW50ZigiIElucHV0IHNpbGVuY2U6ICAgICAgICAgICVkIChzZWNvbmRzKVxuIiwgaW5zaWxlbmNlKTsKKyNpZmRlZiBPUzIKKyAgICBwcmludGYoIiBJbnB1dCB0ZXJtaW5hbDogICAgICAgICAlc1xuIiwgc2hvd29mZihpbnRlcm0pKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBwcmludGYoIiBJbnB1dCB0aW1lb3V0OiAgICAgICAgICAlc1xuIiwgaW50aW1lW2NtZGx2bF0gPworICAgICAgICAgICAicXVpdCIgOiAicHJvY2VlZCIpOworI2lmZGVmIENLRkxPQVQKKyAgICBwcmludGYoIiBJbnB1dCBzY2FsZS1mYWN0b3I6ICAgICAlc1xuIiwgaW5wc2NhbGUgPyBpbnBzY2FsZSA6ICIxLjAiKTsKKyNlbmRpZgkvKiBDS0ZMT0FUICovCisKKyAgICBpZiAoaW5zdGF0dXMgPCAwKQorICAgICAgcHJpbnRmKCIgTGFzdCBJTlBVVDogICAgICAgICAgICAgLTEgKElOUFVUIGNvbW1hbmQgbm90IHlldCBnaXZlbilcbiIpOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiIExhc3QgSU5QVVQ6ICAgICAgICAgICAgICVkICglcylcbiIsIGluc3RhdHVzLGlfdGV4dFtpbnN0YXR1c10pOworfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9TUEwKK2ludAorc2hvd2FycmF5KCkgeworI2lmZGVmIENPTU1FTlQKKyAgICBjaGFyICogcCwgKiBxLCAqKiBhcDsKKyAgICBpbnQgaTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgY2hhciAqczsgaW50IHggPSAwLCB5OworICAgIGludCByYW5nZVsyXTsKKworICAgIGlmICgoeSA9IGNtZmxkKCJBcnJheSBuYW1lIiwiIiwmcyxOVUxMKSkgPCAwKQorICAgICAgaWYgKHkgIT0gLTMpCisgICAgICAgIHJldHVybih5KTsKKyAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgcyA9IGxpbmU7CisgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHkpOworICAgIGlmICgqcykgeworICAgICAgICBjaGFyICoqIGFwOworICAgICAgICBpZiAoKHggPSBhcnJheWJvdW5kcyhzLCYocmFuZ2VbMF0pLCYocmFuZ2VbMV0pKSkgPCAwKSB7CisgICAgICAgICAgICBwcmludGYoIj9CYWQgYXJyYXk6ICVzXG4iLHMpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBhcCA9IGFfcHRyW3hdOworICAgICAgICBpZiAoIWFwKSB7CisgICAgICAgICAgICBwcmludGYoIkFycmF5IG5vdCBkZWNsYXJlZDogJXNcbiIsIHMpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBpLCBuLCBtYXg7CisgICAgICAgICAgICBtYXggPSAocmFuZ2VbMV0gPiAwKSA/CisgICAgICAgICAgICAgIHJhbmdlWzFdIDoKKyAgICAgICAgICAgICAgICAoKHJhbmdlWzBdID4gMCkgPyByYW5nZVswXSA6IGFfZGltW3hdKTsKKyAgICAgICAgICAgIGlmIChyYW5nZVswXSA8IDApCisgICAgICAgICAgICAgIHJhbmdlWzBdID0gMDsKKyAgICAgICAgICAgIGlmIChtYXggPiBhX2RpbVt4XSkKKyAgICAgICAgICAgICAgbWF4ID0gYV9kaW1beF07CisgICAgICAgICAgICBuID0gMTsKKyAgICAgICAgICAgIHByaW50ZigiXFwmJWNbXTogRGltZW5zaW9uID0gJWQiLGFycmF5aXRvYSh4KSxhX2RpbVt4XSk7CisgICAgICAgICAgICBpZiAoYV9saW5rW3hdID4gLTEpCisgICAgICAgICAgICAgIHByaW50ZigiIChMaW5rIHRvIFxcJiVjW10pIixhcnJheWl0b2EoYV9saW5rW3hdKSk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICBmb3IgKGkgPSByYW5nZVswXTsgaSA8PSBtYXg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhcFtpXSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUzZC4gJXNcbiIsaSxhcFtpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh4YXNrbW9yZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtZF9jb2xzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBzdHJsZW4oYXBbaV0pICsgNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gKHggJSBjbWRfY29scykgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICs9ICh4IC8gY21kX2NvbHMpICsgeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPiAoY21kX3Jvd3MgLSAzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXNrbW9yZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworICAgIC8qIEFsbCBhcnJheXMgLSBqdXN0IHNob3cgbmFtZSBhbmQgZGltZW5zaW9uICovCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgKGludCkgJ3onIC0gQVJSQVlCQVNFICsgMTsgeSsrKSB7CisgICAgICAgIGlmIChhX3B0clt5XSkgeworICAgICAgICAgICAgaWYgKHggPT0gMCkgcHJpbnRmKCJEZWNsYXJlZCBhcnJheXM6XG4iKTsKKyAgICAgICAgICAgIHggPSAxOworICAgICAgICAgICAgcHJpbnRmKCIgXFwmJWNbJWRdIiwKKyAgICAgICAgICAgICAgICAgICAoeSA9PSAxKSA/IDY0IDogeSArIEFSUkFZQkFTRSwgYV9kaW1beV0pOworICAgICAgICAgICAgaWYgKGFfbGlua1t5XSA+IC0xKQorICAgICAgICAgICAgICBwcmludGYoIiA9PiBcXCYlY1tdIixhcnJheWl0b2EoYV9saW5rW3ldKSk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4KSBwcmludGYoIiBObyBhcnJheXMgZGVjbGFyZWRcbiIpOworICAgIH0KKyAgICByZXR1cm4oMSk7Cit9CisjZW5kaWYgLyogTk9TUEwgKi8KKworaW50Citkb3Nob3coeCkgaW50IHg7IHsKKyAgICBpbnQgeSwgeiwgaTsgbG9uZyB6ejsKKyAgICBleHRlcm4gaW50IG9wdGxpbmVzOworICAgIGNoYXIgKnM7CisjaWZkZWYgT1MyCisgICAgZXh0ZXJuIGludCBvczJna3M7CisgICAgZXh0ZXJuIGludCB0dF9rYl9tb2RlOworI2VuZGlmIC8qIE9TMiAqLworICAgIGV4dGVybiBpbnQgc3J2Y2Rtc2c7CisgICAgZXh0ZXJuIGNoYXIgKiBjZG1zZ3N0ciwgKiBja2NkcGF0aDsKKworI2lmbmRlZiBOT1NFVEtFWQorICAgIGlmICh4ID09IFNIS0VZKSB7ICAgICAgICAgICAgICAgICAgIC8qIFNIT1cgS0VZICovCisgICAgICAgIGludCBjOworI2lmZGVmIE9TMgorICAgICAgICBpZiAoKHggPSBjbWtleShzaG9rZXl0YWIsbnNob2tleSwiSG93IG1hbnkga2V5cyBzaG91bGQgYmUgc2hvd24/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvbmUiLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIHN3aXRjaCAodHRfa2JfbW9kZSkgeworICAgICAgICAgIGNhc2UgS0JNX0VNOgorICAgICAgICAgICAgcyA9ICJlbWFjcyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEtCTV9IRToKKyAgICAgICAgICAgIHMgPSAiaGVicmV3IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgS0JNX1JVOgorICAgICAgICAgICAgcyA9ICJydXNzaWFuIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgS0JNX0VOOgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzID0gImRlZmF1bHQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh6ID0gY21rZXkoc2hva2V5bXRhYixuc2hva2V5bSwiV2hpY2ggZGVmaW5pdGlvbiBzaG91bGQgYmUgc2hvd24/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMseHhzdHJpbmcpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgaWYgKHogPT0gU0hLRVlERUYpCisgICAgICAgICAgeiA9IC0xOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyNpZmRlZiBJS1NECisgICAgICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICAgICAgcHJpbnRmKCJTb3JyeSwgY29tbWFuZCBkaXNhYmxlZC5cclxuIik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCisjaWZkZWYgTUFDCisgICAgICAgIHByaW50ZigiTm90IGltcGxlbWVudGVkXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworI2Vsc2UgLyogTm90IE1BQyAqLworI2lmZGVmIE9TMgorICAgICAgICBpZiAoeCkgeworICAgICAgICAgICAgY29uX2V2ZW50IGV2dDsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBLTVNJWkU7IGMrKykgeworICAgICAgICAgICAgICAgIGV2dCA9ICh6IDwgMCkgPyBtYXBrZXkoYykgOiBtYXB0ZXJta2V5KGMseik7CisgICAgICAgICAgICAgICAgaWYgKGV2dC50eXBlICE9IGVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHNob2tleWNvZGUoYyx6KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICBwcmludGYoIiBQcmVzcyBrZXk6ICIpOworI2lmZGVmIFVOSVgKKyNpZmRlZiBOT1NFVEJVRgorICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogTk9TRVRCVUYgKi8KKyNlbmRpZiAvKiBVTklYICovCisgICAgICAgICAgICBjb25iaW4oKGNoYXIpZXNjYXBlKTsgICAgICAgLyogUHV0IHRlcm1pbmFsIGluIGJpbmFyeSBtb2RlICovCisjaWZkZWYgT1MyCisgICAgICAgICAgICBvczJna3MgPSAwOyAgICAgICAgICAgICAgICAgLyogUmF3IHNjYW5jb2RlIHByb2Nlc3NpbmcgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIGMgPSBjb25na3MoMCk7ICAgICAgICAgICAgICAvKiBHZXQgY2hhcmFjdGVyIG9yIHNjYW4gY29kZSAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgb3MyZ2tzID0gMTsgICAgICAgICAgICAgICAgIC8qIENvb2tlZCBzY2FuY29kZSBwcm9jZXNzaW5nICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICBjb25jYigoY2hhcillc2NhcGUpOyAgICAgICAgLyogUmVzdG9yZSB0ZXJtaW5hbCB0byBjYnJlYWsgbW9kZSAqLworICAgICAgICAgICAgaWYgKGMgPCAwKSB7ICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBlcnJvciAqLworICAgICAgICAgICAgICAgIHByaW50ZigiP0Vycm9yIHJlYWRpbmcga2V5XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9CisjaWZuZGVmIE9TMgorLyoKKyAgRG8gTk9UIG1hc2sgd2hlbiBpdCBjYW4gYmUgYSByYXcgc2NhbiBjb2RlLCBwZXJoYXBzID4gMjU1CisqLworICAgICAgICAgICAgYyAmPSBjbWRtc2s7ICAgICAgICAgICAgICAgIC8qIEFwcGx5IGNvbW1hbmQgbWFzayAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworI2lmZGVmIE9TMgorICAgICAgICAgICAgc2hva2V5Y29kZShjLHopOworI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgICBzaG9rZXljb2RlKGMpOworI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIE9TMgorICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHJldHVybigxKTsKKyNlbmRpZiAvKiBNQUMgKi8KKyAgICB9CisjaWZuZGVmIE5PS1ZFUkJTCisgICAgaWYgKHggPT0gU0hLVkIpIHsgICAgICAgICAgICAgICAgICAgLyogU0hPVyBLVkVSQlMgKi8KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisjaWZkZWYgSUtTRAorICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgIHByaW50ZigiU29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgcHJpbnRmKCJcblRoZSBmb2xsb3dpbmcgJWQga2V5Ym9hcmQgdmVyYnMgYXJlIGF2YWlsYWJsZTpcblxuIixua3ZlcmJzKTsKKyAgICAgICAga3dkaGVscChrdmVyYnMsbmt2ZXJicywiIiwiXFxLIiwiIiwzLDApOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisjaWZkZWYgT1MyCisgICAgaWYgKHggPT0gU0hVREspIHsgICAgICAgICAgICAgICAgICAgLyogU0hPVyBVREtzICovCisgICAgICAgIGV4dGVybiB2b2lkIHNob3d1ZGsodm9pZCk7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworI2lmZGVmIElLU0QKKyAgICAgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgIHNob3d1ZGsoKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworI2VuZGlmIC8qIE5PU0VUS0VZICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICBpZiAoeCA9PSBTSE1BQykgeyAgICAgICAgICAgICAgICAgICAvKiBTSE9XIE1BQ1JPICovCisgICAgICAgIHN0cnVjdCBGREIga3csIGZsLCBjbTsKKyAgICAgICAgaW50IGksIGssIG4gPSAwLCBsZWZ0LCBmbGFnLCBjb25maXJtZWQgPSAwOworICAgICAgICBjaGFyICogcCwgKnFbNjRdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbm1hYzsgaSsrKSB7ICAgIC8qIGNvcHkgdGhlIG1hY3JvIHRhYmxlICovCisgICAgICAgICAgICBtYWNrZXlbaV0ua3dkID0gbWFjdGFiW2ldLmt3ZDsgLyogaW50byBhIHJlZ3VsYXIga2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAgbWFja2V5W2ldLmt3dmFsID0gaTsgICAgICAgIC8qIHdpdGggdmFsdWUgPSBwb2ludGVyIHRvIG1hY3JvIHRibCAqLworICAgICAgICAgICAgbWFja2V5W2ldLmZsZ3MgPSBtYWN0YWJbaV0uZmxnczsKKyAgICAgICAgfQorICAgICAgICBwID0gbGluZTsKKyAgICAgICAgbGVmdCA9IExJTkJVRlNJWjsKKyAgICAgICAgd2hpbGUgKCFjb25maXJtZWQgJiYgbiA8IDY0KSB7CisgICAgICAgICAgICBjbWZkYmkoJmt3LCAgICAgICAgICAgICAgICAgLyogRmlyc3QgRkRCIC0gbWFjcm8gdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICBfQ01LRVksICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAgICAgICAgICJNYWNybyBuYW1lIiwgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAgICAgICAgIG5tYWMsICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKyAgICAgICAgICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICAgICAgbWFja2V5LCAgICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAgICAgICAgICZmbCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY21mZGJpKCZmbCwgICAgICAgICAgICAgICAgIC8qIDJuZCBGREIgLSBzb21ldGhpbmcgbm90IGluIG1hY3RhYiAqLworICAgICAgICAgICAgICAgICAgIF9DTUZMRCwgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgLyogaGxwbXNnICovCisgICAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKyAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nLAorICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgJmNtCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNtZmRiaSgmY20sICAgICAgICAgICAgICAgICAvKiAzcmQgRkRCIC0gQ29uZmlybWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgX0NNQ0ZNLCAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgeCA9IGNtZmRiKCZrdyk7ICAgICAgICAgICAgIC8qIFBhcnNlIHNvbWV0aGluZyAqLworICAgICAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICBzID0gYXRtYnVmOyAgICAgICAgICAgICAgICAgLyogV2hhdCB0aGUgdXNlciB0eXBlZCAqLworICAgICAgICAgICAgc3dpdGNoIChjbXJlc3VsdC5mY29kZSkgeworICAgICAgICAgICAgICBjYXNlIF9DTUtFWTogICAgICAgICAgICAgIC8qIElmIGl0IHdhcyBhIGtleXdvcmQgKi8KKyAgICAgICAgICAgICAgICB5ID0gbWxvb2sobWFjdGFiLGF0bWJ1ZixubWFjKTsgLyogZ2V0IGZ1bGwgbmFtZSAqLworICAgICAgICAgICAgICAgIGlmICh5ID4gLTEpCisgICAgICAgICAgICAgICAgICBzID0gbWFjdGFiW3ldLmt3ZDsgICAgLyogKGZhbGwgdGhydSBvbiBwdXJwb3NlLi4uKSAqLworICAgICAgICAgICAgICBjYXNlIF9DTUZMRDoKKyAgICAgICAgICAgICAgICBrID0gY2tzdHJuY3B5KHAscyxsZWZ0KSArIDE7IC8qIENvcHkgcmVzdWx0IHRvIGxpc3QgKi8KKyAgICAgICAgICAgICAgICBsZWZ0IC09IGs7CisgICAgICAgICAgICAgICAgaWYgKGxlZnQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAqcCA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHFbbisrXSA9IHA7ICAgICAgICAgICAgIC8qIFBvaW50IHRvIHRoaXMgaXRlbSAqLworICAgICAgICAgICAgICAgIHAgKz0gazsgICAgICAgICAgICAgICAgIC8qIE1vdmUgYnVmZmVyIHBvaW50ZXIgcGFzdCBpdCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIF9DTUNGTTogICAgICAgICAgICAgIC8qIEVuZCBvZiBjb21tYW5kICovCisgICAgICAgICAgICAgICAgY29uZmlybWVkKys7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCJNYWNyb3M6XG4iKTsKKyAgICAgICAgICAgIHNsYyA9IDE7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgbm1hYzsgeSsrKQorICAgICAgICAgICAgICBpZiAoc2hvbWFjKG1hY3RhYlt5XS5rd2QsbWFjdGFiW3ldLm12YWwpIDwgMCkgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0KKyAgICAgICAgc2xjID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgZmxhZyA9IDA7CisgICAgICAgICAgICBzID0gcVtpXTsKKyAgICAgICAgICAgIGlmICghcykgcyA9ICIiOworICAgICAgICAgICAgaWYgKCEqcykgY29udGludWU7CisgICAgICAgICAgICBpZiAoaXN3aWxkKHMpKSB7ICAgICAgICAgICAgLyogUGF0dGVybiBtYXRjaCAqLworICAgICAgICAgICAgICAgIGZvciAoayA9IDAsIHggPSAwOyB4IDwgbm1hYzsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChja21hdGNoKHMsbWFjdGFiW3hdLmt3ZCwwLDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaG9tYWMobWFjdGFiW3hdLmt3ZCxtYWN0YWJbeF0ubXZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFrKQorICAgICAgICAgICAgICAgICAgeCA9IC0xOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIEV4YWN0IG1hdGNoICovCisgICAgICAgICAgICAgICAgeCA9IG14bG9vayhtYWN0YWIscyxubWFjKTsKKyAgICAgICAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmbGFnICYmIHggPT0gLTEpCisgICAgICAgICAgICAgIHggPSBtbG9vayhtYWN0YWIscyxubWFjKTsKKyAgICAgICAgICAgIHN3aXRjaCAoeCkgeworICAgICAgICAgICAgICBjYXNlIC0zOiAgICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gbG9vayB1cCAqLworICAgICAgICAgICAgICBjYXNlIC0xOiAgICAgICAgICAgICAgICAgIC8qIE5vdCBmb3VuZCAqLworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgLSAobm90IGRlZmluZWQpXG4iLHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIC0yOiAgICAgICAgICAgICAgICAgIC8qIEFtYmlndW91cywgbWF0Y2hlcyBtb3JlIHRoYW4gb25lICovCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAtIGFtYmlndW91c1xuIixzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAvKiBNYXRjaGVzIG9uZSBleGFjdGx5ICovCisgICAgICAgICAgICAgICAgc2hvbWFjKG1hY3RhYlt4XS5rd2QsbWFjdGFiW3hdLm12YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKworLyoKKyAgT3RoZXIgU0hPVyBjb21tYW5kcyBvbmx5IGhhdmUgdHdvIGZpZWxkcy4gIEdldCBjb21tYW5kIGNvbmZpcm1hdGlvbiBoZXJlLAorICB0aGVuIGhhbmRsZSB3aXRoIGJpZyBzd2l0Y2goKSBzdGF0ZW1lbnQuCisqLworI2lmbmRlZiBOT1NQTAorICAgIGlmICh4ICE9IFNIQlVJICYmIHggIT0gU0hBUlIpCisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgcmV0dXJuKHkpOworCisjaWZkZWYgQ09NTUVOVAorICAgIC8qIFRoaXMgcmVzdHJpY3Rpb24gaXMgdG9vIGdlbmVyYWwuICovCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlciAmJgorI2lmZGVmIENLX0xPR0lOCisgICAgICAgIGlzZ3Vlc3QKKyNlbHNlCisgICAgICAgIDAKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgICAgICApIHsKKyAgICAgICAgcHJpbnRmKCJTb3JyeSwgY29tbWFuZCBkaXNhYmxlZC5cclxuIik7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICBzd2l0Y2ggKHgpIHsKKworI2lmZGVmIEFOWVgyNQorI2lmbmRlZiBJQk1YMjUKKyAgICAgIGNhc2UgU0hQQUQ6CisgICAgICAgIHNob3BhZCgwKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogSUJNWDI1ICovCisjZW5kaWYgLyogQU5ZWDI1ICovCisKKyAgICAgIGNhc2UgU0hORVQ6CisjaWZkZWYgTk9MT0NBTAorICAgICAgICBwcmludGYoIiBObyBuZXR3b3JrIHN1cHBvcnQgaW4gdGhpcyB2ZXJzaW9uIG9mIEMtS2VybWl0LlxuIik7CisjZWxzZQorI2lmbmRlZiBORVRDT05OCisgICAgICAgIHByaW50ZigiIE5vIG5ldHdvcmsgc3VwcG9ydCBpbiB0aGlzIHZlcnNpb24gb2YgQy1LZXJtaXQuXG4iKTsKKyNlbHNlCisgICAgICAgIHNob25ldCgpOworI2VuZGlmIC8qIE5FVENPTk4gKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNIUEFSOgorICAgICAgICBzaG9wYXIoKTsKKyAgICAgICAgYnJlYWs7CisKKyNpZm5kZWYgTk9YRkVSCisgICAgICBjYXNlIFNIQVRUOgorICAgICAgICBzaG9hdHQoKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICAgIGNhc2UgU0hDT1U6CisgICAgICAgIHByaW50ZigiICVkXG4iLGNvdW50W2NtZGx2bF0pOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PU0VSVkVSCisgICAgICBjYXNlIFNIU0VSOiAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvdyBTZXJ2ZXIgKi8KKyAgICAgICAgaSA9IDA7CisjaWZuZGVmIE5PRlJJTExTCisgICAgICAgIHByaW50ZigiRnVuY3Rpb246ICAgICAgICAgIFN0YXR1czpcbiIpOworICAgICAgICBpKys7CisgICAgICAgIHByaW50ZigiIEdFVCAgICAgICAgICAgICAgICAlc1xuIixubVtlbl9nZXRdKTsKKyAgICAgICAgaSsrOworICAgICAgICBwcmludGYoIiBTRU5EICAgICAgICAgICAgICAgJXNcbiIsbm1bZW5fc2VuXSk7CisgICAgICAgIGkrKzsKKyAgICAgICAgcHJpbnRmKCIgTUFJTCAgICAgICAgICAgICAgICVzXG4iLG5tW2luc2VydmVyID8gMCA6IGVuX21haV0pOworICAgICAgICBpKys7CisgICAgICAgIHByaW50ZigiIFBSSU5UICAgICAgICAgICAgICAlc1xuIixubVtpbnNlcnZlciA/IDAgOiBlbl9wcmldKTsKKyAgICAgICAgaSsrOworI2lmbmRlZiBOT1NQTAorICAgICAgICBwcmludGYoIiBSRU1PVEUgQVNTSUdOICAgICAgJXNcbiIsbm1bZW5fYXNnXSk7CisgICAgICAgIGkrKzsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICBwcmludGYoIiBSRU1PVEUgQ0QvQ1dEICAgICAgJXNcbiIsbm1bZW5fY3dkXSk7CisgICAgICAgIGkrKzsKKyNpZmRlZiBaQ09QWQorICAgICAgICBwcmludGYoIiBSRU1PVEUgQ09QWSAgICAgICAgJXNcbiIsbm1bZW5fY3B5XSk7CisgICAgICAgIGkrKzsKKyNlbmRpZiAvKiBaQ09QWSAqLworICAgICAgICBwcmludGYoIiBSRU1PVEUgREVMRVRFICAgICAgJXNcbiIsbm1bZW5fZGVsXSk7CisgICAgICAgIHByaW50ZigiIFJFTU9URSBESVJFQ1RPUlkgICAlc1xuIixubVtlbl9kaXJdKTsKKyAgICAgICAgcHJpbnRmKCIgUkVNT1RFIEhPU1QgICAgICAgICVzXG4iLG5tW2luc2VydmVyID8gMCA6IGVuX2hvc10pOworICAgICAgICBpICs9IDM7CisjaWZuZGVmIE5PU1BMCisgICAgICAgIHByaW50ZigiIFJFTU9URSBRVUVSWSAgICAgICAlc1xuIixubVtlbl9xdWVdKTsKKyAgICAgICAgaSsrOworI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgIHByaW50ZigiIFJFTU9URSBNS0RJUiAgICAgICAlc1xuIixubVtlbl9ta2RdKTsKKyAgICAgICAgcHJpbnRmKCIgUkVNT1RFIFJNRElSICAgICAgICVzXG4iLG5tW2VuX3JtZF0pOworICAgICAgICBwcmludGYoIiBSRU1PVEUgUkVOQU1FICAgICAgJXNcbiIsbm1bZW5fcmVuXSk7CisgICAgICAgIHByaW50ZigiIFJFTU9URSBTRVQgICAgICAgICAlc1xuIixubVtlbl9zZXRdKTsKKyAgICAgICAgcHJpbnRmKCIgUkVNT1RFIFNQQUNFICAgICAgICVzXG4iLG5tW2VuX3NwYV0pOworICAgICAgICBwcmludGYoIiBSRU1PVEUgVFlQRSAgICAgICAgJXNcbiIsbm1bZW5fdHlwXSk7CisgICAgICAgIHByaW50ZigiIFJFTU9URSBXSE8gICAgICAgICAlc1xuIixubVtpbnNlcnZlciA/IDAgOiBlbl93aG9dKTsKKyAgICAgICAgcHJpbnRmKCIgQllFICAgICAgICAgICAgICAgICVzXG4iLG5tW2VuX2J5ZV0pOworICAgICAgICBwcmludGYoIiBGSU5JU0ggICAgICAgICAgICAgJXNcbiIsbm1bZW5fZmluXSk7CisgICAgICAgIHByaW50ZigiIEVYSVQgICAgICAgICAgICAgICAlc1xuIixubVtlbl94aXRdKTsKKyAgICAgICAgcHJpbnRmKCIgRU5BQkxFICAgICAgICAgICAgICVzXG4iLG5tW2VuX2VuYV0pOworICAgICAgICBpICs9IDExOworI2VuZGlmIC8qIE5PRlJJTExTICovCisgICAgICAgIGlmIChpID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgaSA9IDA7IH0KKyAgICAgICAgcHJpbnRmKCJTZXJ2ZXIgdGltZW91dDogICAgICAlZFxuIixzcnZ0aW0pOworICAgICAgICBpZiAoKytpID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgaSA9IDA7IH0KKyAgICAgICAgcHJpbnRmKCJTZXJ2ZXIgaWRsZS10aW1lb3V0OiAlZFxuIixzcnZpZGwpOworICAgICAgICBpZiAoKytpID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgaSA9IDA7IH0KKyAgICAgICAgcHJpbnRmKCJTZXJ2ZXIga2VlcGFsaXZlICAgICAlc1xuIiwgc2hvd29mZihzcnZwaW5nKSk7CisgICAgICAgIGlmICgrK2kgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBpID0gMDsgfQorICAgICAgICBwcmludGYoIlNlcnZlciBjZC1tZXNzYWdlICAgICVzXG4iLCBzaG93b2ZmKHNydmNkbXNnKSk7CisgICAgICAgIGlmIChzcnZjZG1zZyAmJiBjZG1zZ3N0cikKKyAgICAgICAgICBwcmludGYoIlNlcnZlciBjZC1tZXNzYWdlICAgICVzXG4iLCBjZG1zZ3N0cik7CisgICAgICAgIGlmICgrK2kgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBpID0gMDsgfQorICAgICAgICBwcmludGYoIlNlcnZlciBkaXNwbGF5OiAgICAgICVzXG4iLCBzaG93b2ZmKHNydmRpcykpOworICAgICAgICBpZiAoKytpID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgaSA9IDA7IH0KKyAgICAgICAgcHJpbnRmKCJTZXJ2ZXIgbG9naW46ICAgICAgICAiKTsKKyAgICAgICAgaWYgKCF4X3VzZXIpIHsKKyAgICAgICAgICAgIHByaW50ZigiKG5vbmUpXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiXCIlc1wiLCBcIiVzXCIsIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICB4X3VzZXIsCisgICAgICAgICAgICAgICAgICAgeF9wYXNzd2QgPyB4X3Bhc3N3ZCA6ICIiLAorICAgICAgICAgICAgICAgICAgIHhfYWNjdCA/IHhfYWNjdCA6ICIiCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKytpID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgaSA9IDA7IH0KKyAgICAgICAgcHJpbnRmKCJTZXJ2ZXIgZ2V0LXBhdGg6ICIpOworICAgICAgICBpZiAobmdldHBhdGggPT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCIgICAgKG5vbmUpXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBuZ2V0cGF0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldHBhdGhbeF0pIHByaW50ZigiICVkLiAlc1xuIiwgeCwgZ2V0cGF0aFt4XSk7CisgICAgICAgICAgICAgICAgaWYgKCsraSA+IChjbWRfcm93cyAtIDMpKSB7IC8qIE1vcmUgdGhhbiBhIHNjcmVlbmZ1bC4uLiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIWFza21vcmUoKSkKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworCisgICAgICBjYXNlIFNIU1RBOiAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhdHVzIG9mIGxhc3QgY29tbWFuZCAqLworICAgICAgICBwcmludGYoIiAlc1xuIiwgc3VjY2VzcyA/ICJTVUNDRVNTIiA6ICJGQUlMVVJFIik7CisgICAgICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgY2hhbmdlIGl0ICovCisKKyAgICAgIGNhc2UgU0hTVEs6IHsgICAgICAgICAgICAgICAgICAgICAvKiBTdGFjayBmb3IgTUFDIGRlYnVnZ2luZyAqLworI2lmZGVmIE1BQworICAgICAgICAgIGxvbmcgc3A7CisgICAgICAgICAgc3AgPSAtMTsKKyAgICAgICAgICBsb2FkQTAgKChjaGFyICopJnNwKTsgICAgICAgICAvKiBzZXQgZGVzdGluYXRpb24gYWRkcmVzcyAqLworICAgICAgICAgIFNQdG9hQTAoKTsgICAgICAgICAgICAgICAgICAgIC8qIG1vdmUgU1AgdG8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgICBwcmludGYoIlN0YWNrIGF0IDB4JXhcbiIsIHNwKTsKKyAgICAgICAgICBzaG93X3F1ZXVlKCk7ICAgICAgICAgICAgICAgICAvKiBtb3JlIGRlYnVnZ2luZyAqLworICAgICAgICAgIGJyZWFrOworI2Vsc2UKKyAgICAgICAgICBzaG9zdGFjaygpOworI2VuZGlmIC8qIE1BQyAqLworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgICAgY2FzZSBTSFRBQjogICAgICAgICAgICAgICAgICAgICAgIC8qIFNIT1cgVEFCUyAqLworI2lmZGVmIElLU0QKKyAgICAgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgIHNob3RhYnMoKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogT1MyICovCisKKyAgICAgIGNhc2UgU0hURVI6ICAgICAgICAgICAgICAgICAgICAgICAvKiBTSE9XIFRFUk1JTkFMICovCisjaWZkZWYgSUtTRAorICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgIHByaW50ZigiU29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgc2hvdHJtKCk7CisgICAgICAgIGJyZWFrOworCisjaWZkZWYgT1MyCisgICAgICBjYXNlIFNIVlNDUk46ICAgICAgICAgICAgICAgICAgICAgLyogU0hPVyBWaXJ0dWFsIFNjcmVlbiAtIGZvciBkZWJ1ZyAqLworICAgICAgICBzaG92c2NybigpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBPUzJNT1VTRQorICAgICAgY2FzZSBTSE1PVTogICAgICAgICAgICAgICAgICAgICAgIC8qIFNIT1cgTU9VU0UgKi8KKyNpZmRlZiBJS1NECisgICAgICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICAgICAgcHJpbnRmKCJTb3JyeSwgY29tbWFuZCBkaXNhYmxlZC5cclxuIik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICB9CisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICBzaG9tb3UoKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogT1MyTU9VU0UgKi8KKworI2lmbmRlZiBOT0ZSSUxMUworICAgICAgY2FzZSBTSFZFUjoKKyAgICAgICAgc2hvdmVyKCk7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICAgIGNhc2UgU0hCVUk6ICAgICAgICAgICAgICAgICAgICAgICAvKiBCdWlsdC1pbiB2YXJpYWJsZXMgKi8KKyAgICAgICAgaWYgKCh5ID0gY210eHQoIlZhcmlhYmxlIG5hbWUgb3IgcGF0dGVybiIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgICAgIC8qIGlmIChsaW5lWzBdKSBja3N0cm5jYXQobGluZSwiKiIsTElOQlVGU0laKTsgKi8KKworICAgICAgY2FzZSBTSEZVTjogICAgICAgICAgICAgICAgICAgICAgIC8qIG9yIGJ1aWx0LWluIGZ1bmN0aW9ucyAqLworI2lmZGVmIENLX1RUR1dTSVoKKyNpZmRlZiBPUzIKKyAgICAgICAgaWYgKHR0X2NvbHNbVlRFUk1dIDwgMCB8fCB0dF9yb3dzW1ZURVJNXSA8IDApCisgICAgICAgICAgdHRnd3NpeigpOworI2Vsc2UgLyogT1MyICovCisgICAgICAgIGlmICh0dGd3c2l6KCkgPiAwKSB7ICAgICAgICAgICAgLyogR2V0IGN1cnJlbnQgc2NyZWVuIHNpemUgKi8KKyAgICAgICAgICAgIGlmICh0dF9yb3dzID4gMCAmJiB0dF9jb2xzID4gMCkgeworICAgICAgICAgICAgICAgIGNtZF9yb3dzID0gdHRfcm93czsKKyAgICAgICAgICAgICAgICBjbWRfY29scyA9IHR0X2NvbHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisKKyAgICAgICAgaWYgKHggPT0gU0hGVU4pIHsgICAgICAgICAgICAgICAvKiBGdW5jdGlvbnMgKi8KKyAgICAgICAgICAgIHByaW50ZigiXG5UaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlOlxuXG4iKTsKKyAgICAgICAgICAgIGt3ZGhlbHAoZm5jdGFiLG5mdW5jcywiIiwiXFxGIiwiKCkiLDMsMCk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisjaWZuZGVmIE5PSEVMUAorICAgICAgICAgICAgcHJpbnRmKAorIkhFTFAgRlVOQ1RJT04gPG5hbWU+IGdpdmVzIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIG9mIHRoZSBnaXZlbiBmdW5jdGlvbi5cblxuIgorICAgICAgICAgICAgICAgICAgICk7CisjZW5kaWYgLyogTk9IRUxQICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYXJpYWJsZXMgKi8KKwkgICAgaW50IGosIGZsYWcgPSAwLCBoYXZlYXJnID0gMDsKKwkgICAgc3RydWN0IHN0cmluZ2FycmF5ICogcSA9IE5VTEw7CisJICAgIGNoYXIgKiogcHA7CisJICAgIGlmIChsaW5lWzBdKSB7CQkvKiBIYXZlIHNvbWV0aGluZyB0byBzZWFyY2ggZm9yICovCisJCWhhdmVhcmcgPSAxOwkJLyogTWF5YmUgYSBsaXN0IG9mIHRoaW5ncyAqLworCQlxID0gY2tzcGxpdCgxLDAsbGluZSxOVUxMLCJfLV4kKj9bXXt9IiwwLDAsMCk7CisJCWlmICghcSkgYnJlYWs7CisJCXBwID0gcS0+YV9oZWFkOworCSAgICB9CisJICAgIGkgPSAwOworCSAgICBmb3IgKHkgPSAwOyB5IDwgbnZhcnM7IHkrKykgeworCQlpZiAoKHZhcnRhYlt5XS5mbGdzICYgQ01fSU5WKSkKKwkJICBjb250aW51ZTsKKwkJaWYgKGhhdmVhcmcpIHsJCS8qIElmIEkgaGF2ZSBzb21ldGhpbmcgdG8gbWF0Y2ggKi8KKwkJICAgIGNoYXIgKiBzMjsKKwkJICAgIGZvciAoZmxhZyA9IDAsIGogPSAxOyBqIDw9IHEtPmFfc2l6ZSAmJiAhZmxhZzsgaisrKSB7CisJCQlzMiA9IHBwW2pdID8gcHBbal0gOiAiIjsKKyNpZmRlZiBDT01NRU5UCisvKiBUaGlzIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSBpdCdzIHdoYXQgdGhlIDQgYXJnIGRvZXMgaW4gY2ttYXRjaCgpICovCisJCQlsZW4gPSBzdHJsZW4oczIpOworCQkJaWYgKGxlbiA+IDApIHsKKwkJCSAgICBpZiAoczJbbGVuLTFdICE9ICckJykgey8qIFRvIGFsbG93IGFuY2hvcnMgKi8KKwkJCQlja21ha21zZyhsaW5lLExJTkJVRlNJWixwcFtqXSwiKiIsTlVMTCxOVUxMKTsKKwkJCQlzMiA9IGxpbmU7CisJCQkgICAgfQorCQkJfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkJCWlmIChja21hdGNoKHMyLHZhcnRhYlt5XS5rd2QsMCw0KSA+IDApIHsKKwkJCSAgICBmbGFnID0gMTsJLyogTWF0Y2hlcyAqLworCQkJICAgIGJyZWFrOworCQkJfQorCQkgICAgfQorCQkgICAgaWYgKCFmbGFnKQkJLyogRG9lc24ndCBtYXRjaCAqLworCQkgICAgICBjb250aW51ZTsKKwkJfQorCQlzID0gbnZsb29rKHZhcnRhYlt5XS5rd2QpOworCQlwcmludGYoIiBcXHYoJXMpID0gIix2YXJ0YWJbeV0ua3dkKTsKKwkJaWYgKHZhcnRhYlt5XS5rd3ZhbCA9PSBWTl9ORVdMKSB7IC8qIFx2KG5ld2xpbmUpICovCisJCSAgICB3aGlsZSAoKnMpCQkvKiBTaG93IGNvbnRyb2wgY2hhcnMgc3ltYm9saWNhbGx5ICovCisJCSAgICAgIHByaW50ZigiXFx7JWR9IiwqcysrKTsKKwkJICAgIHByaW50ZigiXG4iKTsKKwkJfSBlbHNlIGlmICh2YXJ0YWJbeV0ua3d2YWwgPT0gVk5fSUJVRiAgfHwgLyogXHYoaW5wdXQpICovCisJCQkgICB2YXJ0YWJbeV0ua3d2YWwgPT0gVk5fUVVFICAgfHwgLyogXHYocXVlcnkpICovCisjaWZkZWYgT1MyCisJCQkgICB2YXJ0YWJbeV0ua3d2YWwgPT0gVk5fU0VMQ1QgfHwgLyogXHYoc2VsZWN0KSAqLworI2VuZGlmIC8qIE9TMiAqLworCQkJICAgKHZhcnRhYlt5XS5rd3ZhbCA+PSBWTl9NX0FBQSAmJiAvKiBtb2RlbSBvbmVzICovCisJCQkgICAgdmFydGFiW3ldLmt3dmFsIDw9IFZOX01fWlpaKQorCQkJICAgKSB7CisJCSAgICBpbnQgciA9IDEyOwkJLyogVGhpcyBvbmUgY2FuIHdyYXAgYXJvdW5kICovCisJCSAgICBjaGFyIGJ1ZlsxMF07CisJCSAgICB3aGlsZSAoKnMpIHsKKwkJCWlmIChpc3ByaW50KCpzKSkgeworCQkJICAgIGJ1ZlswXSA9ICpzOworCQkJICAgIGJ1ZlsxXSA9IE5VTDsKKwkJCSAgICByKys7CisJCQl9IGVsc2UgeworCQkJICAgIHNwcmludGYoYnVmLCJcXHslZH0iLCpzKTsgLyogU0FGRSAqLworCQkJICAgIHIgKz0gKGludCkgc3RybGVuKGJ1Zik7CisJCQl9CisJCQlpZiAociA+PSBjbWRfY29scyAtIDEpIHsKKwkJCSAgICBwcmludGYoIlxuIik7CisJCQkgICAgciA9IDA7CisJCQkgICAgaSsrOworCQkJfQorCQkJcHJpbnRmKCIlcyIsYnVmKTsKKwkJCXMrKzsKKwkJICAgIH0KKwkJICAgIHByaW50ZigiXG4iKTsKKwkJfSBlbHNlCisJCSAgcHJpbnRmKCIlc1xuIixzKTsKKwkJaWYgKCsraSA+IChjbWRfcm93cyAtIDMpKSB7IC8qIE1vcmUgdGhhbiBhIHNjcmVlbmZ1bC4uLiAqLworCQkgICAgaWYgKCh5ID49IG52YXJzIC0gMSkgfHwgIWFza21vcmUoKSkKKwkJICAgICAgYnJlYWs7CisJCSAgICBlbHNlCisJCSAgICAgIGkgPSAwOworCQl9CisJICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTSFZBUjogICAgICAgICAgICAgICAgICAgICAgIC8qIEdsb2JhbCB2YXJpYWJsZXMgKi8KKyAgICAgICAgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYXJpYWJsZSBjb3VudCAqLworICAgICAgICBzbGMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNjcmVlbiBsaW5lIGNvdW50IGZvciAibW9yZT8iICovCisgICAgICAgIGZvciAoeSA9IDMzOyB5IDwgR1ZBUlM7IHkrKykKKyAgICAgICAgICBpZiAoZ192YXJbeV0pIHsKKyAgICAgICAgICAgICAgaWYgKHgrKyA9PSAwKSBwcmludGYoIkdsb2JhbCB2YXJpYWJsZXM6XG4iKTsKKyAgICAgICAgICAgICAgc3ByaW50ZihsaW5lLCIgXFwlJSVjIix5KTsgLyogU0FGRSAqLworICAgICAgICAgICAgICBpZiAoc2hvbWFjKGxpbmUsZ192YXJbeV0pIDwgMCkgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBpZiAoIXgpIHByaW50ZigiIE5vIHZhcmlhYmxlcyBkZWZpbmVkXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU0hBUkc6IHsgICAgICAgICAgICAgICAgICAgICAvKiBBcmdzICovCisgICAgICAgICAgY2hhciAqIHMxLCAqIHMyOworICAgICAgICAgIGlmIChtYWNsdmwgPiAtMSkgeworICAgICAgICAgICAgICBwcmludGYoIk1hY3JvIGFyZ3VtZW50cyBhdCBsZXZlbCAlZCAoXFx2KGFyZ2MpID0gJWQpOlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIG1hY2x2bCwKKyAgICAgICAgICAgICAgICAgICAgIG1hY2FyZ2NbbWFjbHZsXQorICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IG1hY2FyZ2NbbWFjbHZsXTsgeSsrKSB7CisgICAgICAgICAgICAgICAgICBzMSA9IG1fYXJnW21hY2x2bF1beV07CisgICAgICAgICAgICAgICAgICBpZiAoIXMxKSBzMSA9ICIoTlVMTCkiOworICAgICAgICAgICAgICAgICAgczIgPSBtX3hhcmdbbWFjbHZsXVt5XTsKKyAgICAgICAgICAgICAgICAgIGlmICghczIpIHMyID0gIihOVUxMKSI7CisgICAgICAgICAgICAgICAgICBpZiAoeSA8IDEwKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBcXCUlJWQgPSAlc1xuIix5LHMxKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgXFwmX1slZF0gPSAlc1xuIix5LHMyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHByaW50ZigiVG9wLWxldmVsIGFyZ3VtZW50cyAoXFx2KGFyZ2MpID0gJWQpOlxuIiwgdG9wYXJnYyk7CisgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCB0b3BhcmdjOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgIHMxID0gZ192YXJbeSArICcwJ107CisgICAgICAgICAgICAgICAgICBpZiAoIXMxKSBzMSA9ICIoTlVMTCkiOworICAgICAgICAgICAgICAgICAgczIgPSB0b3BhcmdbeV07CisgICAgICAgICAgICAgICAgICBpZiAoIXMyKSBzMiA9ICIoTlVMTCkiOworICAgICAgICAgICAgICAgICAgaWYgKHkgPCAxMCAmJiBnX3Zhclt5XSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgXFwlJSVkID0gJXNcbiIseSxzMSk7CisgICAgICAgICAgICAgICAgICBpZiAodG9wYXJnW3ldKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBcXCZfWyVkXSA9ICVzXG4iLHksczIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNIQVJSOiAgICAgICAgICAgICAgICAgICAgICAgLyogQXJyYXlzICovCisgICAgICAgIHJldHVybihzaG93YXJyYXkoKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgU0hQUk86ICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm90b2NvbCBwYXJhbWV0ZXJzICovCisgICAgICAgIHNob3BhcnAoKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT0xPQ0FMCisgICAgICBjYXNlIFNIQ09NOiAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgc2hvcGFyYygpOworI2lmZGVmIE9TMgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGNoYXIgKnMgPSAiKHVua25vd24pIjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucHJ0eTsgaSsrKQorICAgICAgICAgICAgICBpZiAocHJ0eXRhYltpXS5rd3ZhbCA9PSBwcmlvcml0eSkgeworICAgICAgICAgICAgICAgICAgcyA9IHBydHl0YWJbaV0ua3dkOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiIFByaW9yaXR5OiAlc1xuIiwgcyApOworICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisKKyAgICAgICAgcHJpbnRmKCJcbiIpOworI2lmZGVmIE5FVENPTk4KKyAgICAgICAgaWYgKCFuZXR3b3JrCisjaWZkZWYgSUtTRAorICAgICAgICAgICAgICYmICFpbnNlcnZlcgorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgICAgICApIHsKKyNlbmRpZiAvKiBORVRDT05OICovCisgICAgICAgICAgICBzaG9tZG0oKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyNpZmRlZiBORVRDT05OCisgICAgICAgIH0KKyNlbmRpZiAvKiBORVRDT05OICovCisKKyNpZm5kZWYgTk9ESUFMCisjaWZkZWYgSUtTRAorICAgICAgICBpZiAoICFpbnNlcnZlciApCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoIlR5cGUgU0hPVyBESUFMIHRvIHNlZSBESUFMLXJlbGF0ZWQgaXRlbXMuXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiVHlwZSBTSE9XIE1PREVNIHRvIHNlZSBtb2RlbS1yZWxhdGVkIGl0ZW1zLlxuIik7CisjaWZkZWYgQ0tfVEFQSQorICAgICAgICAgICAgcHJpbnRmKCJUeXBlIFNIT1cgVEFQSSB0byBzZWUgVEFQSS1yZWxhdGVkIGl0ZW1zLlxuIik7CisjZW5kaWYgLyogQ0tfVEFQSSAqLworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisjZW5kaWYgLyogTk9ESUFMICovCisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworICAgICAgY2FzZSBTSEZJTDogICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgcGFyYW1ldGVycyAqLworICAgICAgICBzaG9maWwoKTsKKyAgICAgICAgLyogcHJpbnRmKCJcbiIpOyAqLyAgICAgICAgICAgICAvKiAob3V0IG8nIHNwYWNlKSAqLworICAgICAgICBicmVhazsKKworI2lmbmRlZiBOT0NTRVRTCisgICAgICBjYXNlIFNITE5HOiAgICAgICAgICAgICAgICAgICAgICAgLyogTGFuZ3VhZ2VzICovCisgICAgICAgIHNob3BhcmwoKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisjaWZuZGVmIE5PU1BMCisgICAgICBjYXNlIFNIU0NSOiAgICAgICAgICAgICAgICAgICAgICAgLyogU2NyaXB0cyAqLworICAgICAgICBwcmludGYoIiBDb21tYW5kIHF1b3Rpbmc6ICAgICAgICAlc1xuIiwgc2hvd29mZihjbWRncXVvKCkpKTsKKyAgICAgICAgcHJpbnRmKCIgVGFrZSAgZWNobzogICAgICAgICAgICAgJXNcbiIsIHNob3dvZmYodGVjaG8pKTsKKyAgICAgICAgcHJpbnRmKCIgVGFrZSAgZXJyb3I6ICAgICAgICAgICAgJXNcbiIsIHNob3dvZmYodGFrZXJyW2NtZGx2bF0pKTsKKyAgICAgICAgcHJpbnRmKCIgTWFjcm8gZWNobzogICAgICAgICAgICAgJXNcbiIsIHNob3dvZmYobWVjaG8pKTsKKyAgICAgICAgcHJpbnRmKCIgTWFjcm8gZXJyb3I6ICAgICAgICAgICAgJXNcbiIsIHNob3dvZmYobWVycm9yW2NtZGx2bF0pKTsKKyAgICAgICAgcHJpbnRmKCIgUXVpZXQ6ICAgICAgICAgICAgICAgICAgJXNcbiIsIHNob3dvZmYocXVpZXQpKTsKKyAgICAgICAgcHJpbnRmKCIgRnVuY3Rpb24gZGlhZ25vc3RpY3M6ICAgJXNcbiIsIHNob3dvZmYoZm5kaWFncykpOworICAgICAgICBwcmludGYoIiBGdW5jdGlvbiBlcnJvcjogICAgICAgICAlc1xuIiwgc2hvd29mZihmbmVycm9yKSk7CisjaWZkZWYgQ0tMRUFSTgorICAgICAgICB7CisgICAgICAgICAgICBleHRlcm4gY2hhciAqIGxlYXJuZmlsZTsKKyAgICAgICAgICAgIGV4dGVybiBpbnQgbGVhcm5pbmc7CisgICAgICAgICAgICBpZiAobGVhcm5maWxlKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgTEVBUk4gZmlsZTogICAgICAgICAgICAgJXMgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbGVhcm5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICBsZWFybmluZyA/ICJPTiIgOiAiT0ZGIgorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIHByaW50ZigiIExFQVJOIGZpbGU6ICAgICAgICAgICAgIChub25lKVxuIik7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS0xFQVJOICovCisgICAgICAgIHNob2lucHV0KCk7CisgICAgICAgIHNob291dHB1dCgpOworI2lmbmRlZiBOT1NDUklQVAorICAgICAgICBwcmludGYoIiBTY3JpcHQgZWNobzogICAgICAgICAgICAlc1xuIiwgc2hvd29mZihzZWNobykpOworI2VuZGlmIC8qIE5PU0NSSVBUICovCisgICAgICAgIHByaW50ZigiIENvbW1hbmQgYnVmZmVyIGxlbmd0aDogICVkXG4iLCBDTURCTCk7CisgICAgICAgIHByaW50ZigiIEF0b20gYnVmZmVyIGxlbmd0aDogICAgICVkXG4iLCBBVE1CTCk7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9YTUlUCisgICAgICBjYXNlIFNIWE1JOgorICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIHByaW50ZigiIEZpbGUgdHlwZTogICAgICAgICAgICAgICAgICAgICAgICVzXG4iLAorICAgICAgICAgICAgICAgYmluYXJ5ID8gImJpbmFyeSIgOiAidGV4dCIpOworI2lmbmRlZiBOT0NTRVRTCisgICAgICAgIHByaW50ZigiIEZpbGUgY2hhcmFjdGVyLXNldDogICAgICAgICAgICAgICVzXG4iLAorICAgICAgICAgICAgICAgZmNzaW5mb1tmY2hhcnNldF0ua2V5d29yZCk7CisjaWZkZWYgT1MyCisgICAgICAgIGlmICggaXN1bmljb2RlKCkgKSB7CisgICAgICAgIHByaW50ZigiIFRlcm1pbmFsIENoYXJhY3RlciAocmVtb3RlKTogICAgICVzXG4iLAorICAgICAgICAgICAgICB0dF91dGY4ID8gInV0Zi04IiA6IHRjc3IgPT0gVFhfVFJBTlNQID8gInRyYW5zcGFyZW50IiA6CisgICAgICAgICAgICAgIHRjc3IgPT0gVFhfVU5ERUYgPyAidW5kZWZpbmVkIiA6IHR4cmluZm9bdGNzcl0tPmtleXdkKTsKKyAgICAgICAgcHJpbnRmKCIgVGVybWluYWwgQ2hhcmFjdGVyIChsb2NhbCk6ICAgICAgJXNcbiIsCisgICAgICAgICAgICAgIHRjc2wgPT0gVFhfVFJBTlNQID8gInRyYW5zcGFyZW50IiA6CisgICAgICAgICAgICAgIHRjc2wgPT0gVFhfVU5ERUYgPyAidW5kZWZpbmVkIiA6IHR4cmluZm9bdGNzbF0tPmtleXdkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIgVGVybWluYWwgQ2hhcmFjdGVyIChyZW1vdGUpOiAgICAgJXNcbiIsCisgICAgICAgICAgICAgIHR0X3V0ZjggPyAidXRmLTgiIDogdGNzciA9PSBUWF9UUkFOU1AgPyAidHJhbnNwYXJlbnQiIDoKKyAgICAgICAgICAgICAgdGNzciA9PSBUWF9VTkRFRiA/ICJ1bmRlZmluZWQiIDogdHhyaW5mb1t0Y3NyXS0+a2V5d2QpOworICAgICAgICBwcmludGYoIiBUZXJtaW5hbCBDaGFyYWN0ZXIgKGxvY2FsKTogICAgICAlc1xuIiwKKyAgICAgICAgICAgICAgdGNzbCA9PSBUWF9UUkFOU1AgPyAidHJhbnNwYXJlbnQiIDoKKyAgICAgICAgICAgICAgdGNzbCA9PSBUWF9VTkRFRiA/ICJ1bmRlZmluZWQiIDogdHhyaW5mb1t0Y3NsXS0+a2V5d2QpOworICAgICAgICB9CisjZWxzZSAvKiBPUzIgKi8KKyAgICAgICAgcHJpbnRmKCIgVGVybWluYWwgY2hhcmFjdGVyLXNldCAocmVtb3RlKTogJXNcbiIsCisgICAgICAgICAgICAgICBmY3NpbmZvW3Rjc3JdLmtleXdvcmQpOworICAgICAgICBwcmludGYoIiBUZXJtaW5hbCBjaGFyYWN0ZXItc2V0IChsb2NhbCk6ICAlc1xuIiwKKyAgICAgICAgICAgICAgIGZjc2luZm9bdGNzbF0ua2V5d29yZCk7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgICAgICBwcmludGYoIiBUZXJtaW5hbCBieXRlc2l6ZTogICAgICAgICAgICAgICAlZFxuIiwKKyAgICAgICAgICAgICAgIChjbWFzayA9PSAweGZmKSA/IDggOiA3KTsKKyAgICAgICAgcHJpbnRmKCIgVGVybWluYWwgZWNobzogICAgICAgICAgICAgICAgICAgJXNcbiIsCisgICAgICAgICAgICAgICBkdXBsZXggPyAibG9jYWwiIDogInJlbW90ZSIpOworICAgICAgICBwcmludGYoIiBUcmFuc21pdCBFT0Y6ICAgICAgICAgICAgICAgICAgICAiKTsKKyAgICAgICAgaWYgKCp4bWl0YnVmID09IE5VTCkgeworICAgICAgICAgICAgcHJpbnRmKCIobm9uZSlcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciAqcDsKKyAgICAgICAgICAgIHAgPSB4bWl0YnVmOworICAgICAgICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgICAgICAgICAgaWYgKCpwIDwgU1ApCisgICAgICAgICAgICAgICAgICBwcmludGYoIl4lYyIsY3RsKCpwKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlYyIsKnApOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeG1pdGYpCisgICAgICAgICAgcHJpbnRmKCIgVHJhbnNtaXQgRmlsbDogICAgICAgICAgICAgICAgICAgJWRcbiIsIHhtaXRmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZigiIFRyYW5zbWl0IEZpbGw6ICAgICAgICAgICAgICAgICAgIChub25lKVxuIik7CisgICAgICAgIHByaW50ZigiIFRyYW5zbWl0IExpbmVmZWVkOiAgICAgICAgICAgICAgICVzXG4iLHNob3dvZmYoeG1pdGwpKTsKKyAgICAgICAgaWYgKHhtaXRwKQorICAgICAgICAgIHByaW50ZigiIFRyYW5zbWl0IFByb21wdDogICAgICAgICAgICAgICAgICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgIHhtaXRwLAorICAgICAgICAgICAgICAgICBjaGFydG9zdHIoeG1pdHApCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoIiBUcmFuc21pdCBQcm9tcHQ6ICAgICAgICAgICAgICAgICAobm9uZSlcbiIpOworICAgICAgICBwcmludGYoIiBUcmFuc21pdCBFY2hvOiAgICAgICAgICAgICAgICAgICAlc1xuIiwgc2hvd29mZih4bWl0eCkpOworICAgICAgICBwcmludGYoIiBUcmFuc21pdCBMb2NraW5nLVNoaWZ0OiAgICAgICAgICAlc1xuIiwgc2hvd29mZih4bWl0cykpOworICAgICAgICBwcmludGYoIiBUcmFuc21pdCBQYXVzZTogICAgICAgICAgICAgICAgICAlZCAobWlsbGlzZWNvbmQlcylcbiIsCisgICAgICAgICAgICAgICB4bWl0dywKKyAgICAgICAgICAgICAgICh4bWl0dyA9PSAxKSA/ICIiIDogInMiCisgICAgICAgICAgICAgICApOworICAgICAgICBwcmludGYoIiBUcmFuc21pdCBUaW1lb3V0OiAgICAgICAgICAgICAgICAlZCAoc2Vjb25kJXMpXG4iLAorICAgICAgICAgICAgICAgeG1pdHQsCisgICAgICAgICAgICAgICAoeG1pdHQgPT0gMSkgPyAiIiA6ICJzIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1hNSVQgKi8KKworI2lmbmRlZiBOT0RJQUwKKyAgICAgIGNhc2UgU0hNT0Q6ICAgICAgICAgICAgICAgICAgICAgICAvKiBTSE9XIE1PREVNICovCisjaWZkZWYgSUtTRAorICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgIHByaW50ZigiU29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgc2hvbW9kZW0oKTsgICAgICAgICAgICAgICAgICAgICAvKiBTaG93IFNFVCBNT0RFTSBpdGVtcyAqLworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworI2lmbmRlZiBNQUMKKyAgICAgIGNhc2UgU0hERkxUOgorICAgICAgICBwcmludGYoIiVzXG4iLHpndGRpcigpKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTUFDICovCisKKyNpZm5kZWYgTk9MT0NBTAorICAgICAgY2FzZSBTSEVTQzoKKyNpZmRlZiBJS1NECisgICAgICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICAgICAgcHJpbnRmKCJTb3JyeSwgY29tbWFuZCBkaXNhYmxlZC5cclxuIik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICB9CisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICByZXR1cm4oc2hvZXNjKGVzY2FwZSkpOworCisjaWZuZGVmIE5PRElBTAorICAgICAgY2FzZSBTSERJQTogICAgICAgICAgICAgICAgICAgICAgIC8qIFNIT1cgRElBTCAqLworI2lmZGVmIElLU0QKKyAgICAgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgIHNobWRtbGluKCk7CisgICAgICAgIHByaW50ZigiLCBzcGVlZDogIik7CisgICAgICAgIGlmICgoenogPSB0dGdzcGQoKSkgPCAwKSB7CisgICAgICAgICAgICBwcmludGYoInVua25vd24iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh6eiA9PSA4ODgwKSBwcmludGYoIjc1LzEyMDAiKTsgZWxzZSBwcmludGYoIiVsZCIsenopOworICAgICAgICB9CisgICAgICAgIGlmIChjYXJyaWVyID09IENBUl9PRkYpIHMgPSAib2ZmIjsKKyAgICAgICAgZWxzZSBpZiAoY2FycmllciA9PSBDQVJfT04pIHMgPSAib24iOworICAgICAgICBlbHNlIGlmIChjYXJyaWVyID09IENBUl9BVVQpIHMgPSAiYXV0byI7CisgICAgICAgIGVsc2UgcyA9ICJ1bmtub3duIjsKKyAgICAgICAgcHJpbnRmKCIsIGNhcnJpZXI6ICVzIiwgcyk7CisgICAgICAgIGlmIChjYXJyaWVyID09IENBUl9PTikgeworICAgICAgICAgICAgaWYgKGNkdGltbykgcHJpbnRmKCIsIHRpbWVvdXQ6ICVkIHNlYyIsIGNkdGltbyk7CisgICAgICAgICAgICBlbHNlIHByaW50ZigiLCB0aW1lb3V0OiBub25lIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBkb3Nob2RpYWwoKTsKKyAgICAgICAgaWYgKGxvY2FsCisjaWZkZWYgTkVUQ09OTgorICAgICAgICAgICAgJiYgIW5ldHdvcmsKKyNlbmRpZiAvKiBORVRDT05OICovCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIHByaW50ZigiVHlwZSBTSE9XIE1PREVNIHRvIHNlZSBtb2RlbSBzZXR0aW5ncy5cbiIpOworI2lmZGVmIENLX1RBUEkKKyAgICAgICAgICAgIHByaW50ZigiVHlwZSBTSE9XIFRBUEkgdG8gc2VlIFRBUEktcmVsYXRlZCBpdGVtc1xuIik7CisjZW5kaWYgLyogQ0tfVEFQSSAqLworICAgICAgICAgICAgcHJpbnRmKCJUeXBlIFNIT1cgQ09NTVVOSUNBVElPTlMgdG8gc2VlIG1vZGVtIHNpZ25hbHMuXG4iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZm5kZWYgTk9YRkVSCisjaWZkZWYgQ0tfTEFCRUxFRAorICAgICAgY2FzZSBTSExCTDogICAgICAgICAgICAgICAgICAgICAgIC8qIExhYmVsZWQgZmlsZSBpbmZvICovCisgICAgICAgIHNob2xibCgpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyAgICAgIGNhc2UgU0hDU0U6ICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXIgc2V0cyAqLworI2lmZGVmIE5PQ1NFVFMKKyAgICAgICAgcHJpbnRmKAorIiBDaGFyYWN0ZXIgc2V0IHRyYW5zbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIEMtS2VybWl0XG4iKTsKKyNlbHNlCisgICAgICAgIHNob2NoYXJzZXQoKTsKKyNpZm5kZWYgTk9YRkVSCisgICAgICAgIHByaW50ZigiXG4gVW5rbm93bi1DaGFyLVNldDogJXNcbiIsCisgICAgICAgICAgICAgICB1bmtjcyA/ICJLZWVwIiA6ICJEaXNjYXJkIik7CisjZW5kaWYgLyogTk9YRkVSICovCisjaWZkZWYgT1MyCisgICAgICAgIHByaW50ZigiXG4iKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgc2hvdGNzKHRjc2wsdGNzcik7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgLyogUEMgQ29kZSBQYWdlIGluZm9ybWF0aW9uICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgY3BidWZbMTI4XTsKKyAgICAgICAgICAgIGludCBjcGxpc3RbMTZdLCBjcHM7CisgICAgICAgICAgICBpbnQgYWN0aXZlY3A7CisgICAgICAgICAgICBjcHMgPSBvczJnZXRjcGxpc3QoY3BsaXN0LCBzaXplb2YoY3BsaXN0KSk7CisKKyAgICAgICAgICAgIHNwcmludGYoY3BidWYsICAgICAgICAgICAgICAvKiBTQUZFICovCisgICAgICAgICAgICAgICAgICAgICIlM2QsJTNkLCUzZCwlM2QsJTNkLCUzZCwlM2QsJTNkLCUzZCwlM2QsJTNkLCUzZCIsCisgICAgICAgICAgICAgICAgICAgICBjcHMgPiAxID8gY3BsaXN0WzFdIDogMCwKKyAgICAgICAgICAgICAgICAgICAgIGNwcyA+IDIgPyBjcGxpc3RbMl0gOiAwLCBjcHMgPiAzID8gY3BsaXN0WzNdIDogMCwKKyAgICAgICAgICAgICAgICAgICAgIGNwcyA+IDQgPyBjcGxpc3RbNF0gOiAwLCBjcHMgPiA1ID8gY3BsaXN0WzVdIDogMCwKKyAgICAgICAgICAgICAgICAgICAgIGNwcyA+IDYgPyBjcGxpc3RbNl0gOiAwLCBjcHMgPiA3ID8gY3BsaXN0WzddIDogMCwKKyAgICAgICAgICAgICAgICAgICAgIGNwcyA+IDggPyBjcGxpc3RbOF0gOiAwLCBjcHMgPiA5ID8gY3BsaXN0WzldIDogMCwKKyAgICAgICAgICAgICAgICAgICAgIGNwcyA+IDEwID8gY3BsaXN0WzEwXSA6IDAsIGNwcyA+IDExID8gY3BsaXN0WzExXSA6IDAsCisgICAgICAgICAgICAgICAgICAgICBjcHMgPiAxMiA/IGNwbGlzdFsxMl0gOiAwCisgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgcHJpbnRmKCIgQ29kZSBQYWdlczpcbiIpOworICAgICAgICAgICAgYWN0aXZlY3AgPSBvczJnZXRjcCgpOworICAgICAgICAgICAgaWYgKCBhY3RpdmVjcCApIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCIgICAgIEFjdGl2ZTogJWRcbiIsYWN0aXZlY3ApOworICAgICAgICAgICAgICBpZiAoIWlzV2luOTUoKSkKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgQXZhaWxhYmxlOiAlc1xuIixjcGJ1Zik7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCIgICAgIEFjdGl2ZTogbi9hXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgU0hGRUE6ICAgICAgICAgICAgICAgICAgICAgICAvKiBGZWF0dXJlcyAqLworICAgICAgICBzaG9mZWEoKTsKKyAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBDS19TUEVFRAorICAgICAgY2FzZSBTSENUTDogICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wtUHJlZml4IHRhYmxlICovCisgICAgICAgIHNob2N0bCgpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19TUEVFRCAqLworCisgICAgICBjYXNlIFNIRVhJOiB7CisgICAgICAgICAgZXh0ZXJuIGludCBleGl0aGFuZ3VwOworICAgICAgICAgIHByaW50ZigiXG4gRXhpdCB3YXJuaW5nICVzXG4iLCB4aXR3YXJuID8KKyAgICAgICAgICAgICAgICAgKHhpdHdhcm4gPT0gMSA/ICJvbiIgOiAiYWx3YXlzIikgOiAib2ZmIik7CisgICAgICAgICAgcHJpbnRmKCIgRXhpdCBvbi1kaXNjb25uZWN0OiAlc1xuIiwgc2hvd29mZihleGl0b25jbG9zZSkpOworICAgICAgICAgIHByaW50ZigiIEV4aXQgaGFuZ3VwOiAlc1xuIiwgc2hvd29mZihleGl0aGFuZ3VwKSk7CisgICAgICAgICAgcHJpbnRmKCIgQ3VycmVudCBleGl0IHN0YXR1czogJWRcblxuIiwgeGl0c3RhKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgU0hQUlQ6IHsKKyNpZmRlZiBQUklOVFNXSQorICAgICAgICAgIGV4dGVybiBpbnQgcHJpbnR0aW1vLCBwcmludGVydHlwZSwgbm9wcmludGVyOworICAgICAgICAgIGV4dGVybiBjaGFyICogcHJpbnR0ZXJtLCAqIHByaW50c2VwOworI2lmZGVmIEJQUklOVAorICAgICAgICAgIGV4dGVybiBpbnQgcHJpbnRiaWRpOworI2VuZGlmIC8qIEJQUklOVCAqLworI2VuZGlmIC8qIFBSSU5UU1dJICovCisKKyNpZmRlZiBJS1NECisgICAgICAgIGlmIChpbnNlcnZlciAmJgorI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgICBpc2d1ZXN0CisjZWxzZSAvKiBDS19MT0dJTiAqLworICAgICAgICAgICAgMAorI2VuZGlmIC8qIENLX0xPR0lOICovCisgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisjaWZkZWYgUFJJTlRTV0kKKyAgICAgICAgICBpZiAobm9wcmludGVyKSB7CisgICAgICAgICAgICAgIHByaW50ZigiUHJpbnRlcjogKG5vbmUpXG5cbiIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisjZW5kaWYgLyogUFJJTlRTV0kgKi8KKworICAgICAgICAgIHByaW50ZigiUHJpbnRlcjogJXMlc1xuIiwKKworICAgICAgICAgICAgICAgICBwcmludHBpcGUgPyAifCAiIDogIiIsCisgICAgICAgICAgICAgICAgIHByaW50ZXJuYW1lID8gcHJpbnRlcm5hbWUgOgorI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAiUFJOIgorI2Vsc2UKKyAgICAgICAgICAgICAgICAgIihkZWZhdWx0KSIKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgKTsKKyNpZmRlZiBQUklOVFNXSQorI2lmZGVmIEJQUklOVAorICAgICAgICAgIGlmIChwcmludGJpZGkpIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCIgL0JJRElSRUNUSU9OQUxcbiIpOworICAgICAgICAgICAgICBpZiAocHBvcnRzcGVlZCA+IDApCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgL1NQRUVEOiVsZFxuIixwcG9ydHNwZWVkKTsKKyAgICAgICAgICAgICAgcHJpbnRmKCIgL1BBUklUWTolc1xuIixwYXJuYW0oKGNoYXIpcHBvcnRwYXJpdHkpKTsKKyAgICAgICAgICAgICAgcHJpbnRmKCIgL0ZMT1c6JXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBwcG9ydGZsb3cgPT0gRkxPX05PTkUgPyAiTk9ORSIgOgorICAgICAgICAgICAgICAgICAgICAgKHBwb3J0ZmxvdyA9PSBGTE9fUlRTQyA/ICJSVFMvQ1RTIiA6ICJYT04vWE9GRiIpCisgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcHJpbnRmKCIgL09VVFBVVC1PTkxZXG4iKTsKKyNlbmRpZiAvKiBCUFJJTlQgKi8KKyAgICAgICAgICBzd2l0Y2ggKHByaW50ZXJ0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFBSVF9OT046IHByaW50ZigiIC9OT05FXG4iKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBSVF9GSUw6IHByaW50ZigiIC9GSUxFXG4iKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBSVF9QSVA6IHByaW50ZigiIC9QSVBFXG4iKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBSVF9ET1M6IHByaW50ZigiIC9ET1MtREVWSUNFXG4iKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBSVF9XSU46IHByaW50ZigiIC9XSU5ET1dTLVFVRVVFXG4iKTsgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigiIC9USU1FT1VUOiVkXG4iLHByaW50dGltbyk7CisgICAgICAgICAgaWYgKHByaW50dGVybSkgeworICAgICAgICAgICAgICBwcmludGYoIiAvRU5ELU9GLUpPQi1TVFJJTkc6Iik7CisgICAgICAgICAgICAgIHNob3N0cmRlZihwcmludHRlcm0pOworICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwcmludGYoIiAvRU5ELU9GLUpPQi1TVFJJTkc6KG5vbmUpXG4iKTsKKyAgICAgICAgICBwcmludGYoIiAvSk9CLUhFQURFUi1GSUxFOiVzXG4iLHByaW50c2VwID8gcHJpbnRzZXAgOiAiKG5vbmUpIik7CisjZW5kaWYgLyogUFJJTlRTV0kgKi8KKyAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgU0hDTUQ6IHsKKyNpZmRlZiBET1VCTEVRVU9USU5HCisgICAgICAgICAgZXh0ZXJuIGludCBkYmxxdW87CisjZW5kaWYgLyogRE9VQkxFUVVPVElORyAqLworI2lmZGVmIENLX0FVVE9ETAorICAgICAgICAgIHByaW50ZigiIENvbW1hbmQgYXV0b2Rvd25sb2FkOiAlc1xuIixzaG93b2ZmKGNtZGFkbCkpOworI2Vsc2UKKyAgICAgICAgICBwcmludGYoIiBDb21tYW5kIGF1dG9kb3dubG9hZDogKG5vdCBhdmFpbGFibGUpXG4iKTsKKyNlbmRpZiAvKiBDS19BVVRPREwgKi8KKyAgICAgICAgICBwcmludGYoIiBDb21tYW5kIGJ5dGVzaXplOiAlZCBiaXRzXG4iLCAoY21kbXNrID09IDAzNzcpID8gOCA6IDcpOworI2lmZGVmIENLX1JFQ0FMTAorICAgICAgICAgIHByaW50ZigiIENvbW1hbmQgcmVjYWxsLWJ1ZmZlci1zaXplOiAlZFxuIixjbV9yZWNhbGwpOworI2Vsc2UKKyAgICAgICAgICBwcmludGYoIiBDb21tYW5kIHJlY2FsbC1idWZmZXIgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHZlcnNpb25cbiIpOworI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworI2lmZGVmIENLX1JFQ0FMTAorICAgICAgICAgIHByaW50ZigiIENvbW1hbmQgcmV0cnk6ICVzXG4iLHNob3dvZmYoY21fcmV0cnkpKTsKKyNlbHNlCisgICAgICAgICAgcHJpbnRmKCIgQ29tbWFuZCByZXRyeSBub3QgYXZhaWxhYmxlIGluIHRoaXMgdmVyc2lvblxuIik7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisgICAgICAgICAgcHJpbnRmKCIgQ29tbWFuZCBpbnRlcnJ1cHRpb246ICVzXG4iLCBzaG93b2ZmKGNtZGludCkpOworICAgICAgICAgIHByaW50ZigiIENvbW1hbmQgcXVvdGluZzogJXNcbiIsIHNob3dvZmYoY21kZ3F1bygpKSk7CisjaWZkZWYgRE9VQkxFUVVPVElORworICAgICAgICAgIHByaW50ZigiIENvbW1hbmQgZG91YmxlcXVvdGluZzogJXNcbiIsIHNob3dvZmYoZGJscXVvKSk7CisjZW5kaWYgLyogRE9VQkxFUVVPVElORyAqLworICAgICAgICAgIHByaW50ZigiIENvbW1hbmQgbW9yZS1wcm9tcHRpbmc6ICVzXG4iLCBzaG93b2ZmKHhhc2ttb3JlKSk7CisgICAgICAgICAgcHJpbnRmKCIgQ29tbWFuZCBoZWlnaHQ6ICVkXG4iLCBjbWRfcm93cyk7CisgICAgICAgICAgcHJpbnRmKCIgQ29tbWFuZCB3aWR0aDogICVkXG4iLCBjbWRfY29scyk7CisjaWZuZGVmIElLU0RPTkxZCisjaWZkZWYgT1MyCisgICAgICAgICAgcHJpbnRmKCIgQ29tbWFuZCBzdGF0dXNsaW5lOiAlc1xuIixzaG93b2ZmKHR0X3N0YXR1c1tWQ01EXSkpOworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIElLU0RPTkxZICovCisjaWZkZWYgTE9DVVMKKyAgICAgICAgICBwcmludGYoIiBMb2N1czogICAgICAgICAgJXMiLAorICAgICAgICAgICAgICAgICBhdXRvbG9jdXMgPyAoYXV0b2xvY3VzID09IDIgPyAiYXNrIiA6ICJhdXRvIikgOgorCQkgKGxvY3VzID8gImxvY2FsIiA6ICJyZW1vdGUiKSk7CisgICAgICAgICAgaWYgKGF1dG9sb2N1cykKKyAgICAgICAgICAgIHByaW50ZigiICglcykiLCBsb2N1cyA/ICJsb2NhbCIgOiAicmVtb3RlIik7CisgICAgICAgICAgcHJpbnRmKCJcbiIpOworI2VuZGlmIC8qIExPQ1VTICovCisgICAgICAgICAgcHJpbnRmKCIgSGludHM6ICAgICAgICAgICVzXG4iLCBzaG93b2ZmKGhpbnRzKSk7CisgICAgICAgICAgcHJpbnRmKCIgUXVpZXQ6ICAgICAgICAgICVzXG4iLCBzaG93b2ZmKHF1aWV0KSk7CisgICAgICAgICAgcHJpbnRmKCIgTWF4aW11bSBjb21tYW5kIGxlbmd0aDogJWRcbiIsIENNREJMKTsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGNoYXIgKiBzOworICAgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgICAgcHJpbnRmKCIgTWF4aW11bSBudW1iZXIgb2YgbWFjcm9zOiAlZFxuIiwgTUFDX01BWCk7CisgICAgICAgICAgICAgIHByaW50ZigiIE1hY3JvcyBkZWZpbmVkOiAlZFxuIiwgbm1hYyk7CisgICAgICAgICAgICAgIHByaW50ZigiIE1heGltdW0gbWFjcm8gZGVwdGg6ICVkXG4iLCBNQUNMRVZFTCk7CisgICAgICAgICAgICAgIHByaW50ZigiIE1heGltdW0gVEFLRSBkZXB0aDogJWRcbiIsIE1BWFRBS0UpOworICAgICAgICAgICAgICBzID0gIihub3QgZGVmaW5lZCkiOworICAgICAgICAgICAgICBrID0gbWxvb2sobWFjdGFiLCJvbl91bmtub3duX2NvbW1hbmQiLG5tYWMpOworICAgICAgICAgICAgICBpZiAoayA+IC0xKSBpZiAobWFjdGFiW2tdLm12YWwpIHMgPSBtYWN0YWJba10ubXZhbDsKKyAgICAgICAgICAgICAgcHJpbnRmKCIgT05fVU5LTk9XTl9DT01NQU5EOiAlc1xuIixzKTsKKyAgICAgICAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZmRlZiBVTklYCisjaWZuZGVmIE5PSkMKKyAgICAgICAgICBwcmludGYoIiBTdXNwZW5kOiAlc1xuIiwgc2hvd29mZih4c3VzcGVuZCkpOworI2VuZGlmIC8qIE5PSkMgKi8KKyNlbmRpZiAvKiBVTklYICovCisgICAgICAgICAgcHJpbnRmKCIgQWNjZXNzIHRvIGV4dGVybmFsIGNvbW1hbmRzIGFuZCBwcm9ncmFtcyVzIGFsbG93ZWRcbiIsCisjaWZuZGVmIE5PUFVTSAorICAgICAgICAgICAgICAgICAhbm9wdXNoID8gIiIgOgorI2VuZGlmIC8qIE5PUFVTSCAqLworICAgICAgICAgICAgICAgICAgIiBub3QiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworI2lmbmRlZiBOT1NQTAorICAgICAgY2FzZSBTSEFMUk06CisgICAgICAgIGlmIChja19hbGFybSkKKyAgICAgICAgICBwcmludGYoIkFsYXJtIGF0ICVzICVzXG4iLGFscm1fZGF0ZSxhbHJtX3RpbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCIobm8gYWxhcm0gc2V0KVxuIik7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9NU0VORAorICAgICAgY2FzZSBTSFNGTDogeworICAgICAgICAgIGV4dGVybiBzdHJ1Y3QgZmlsZWxpc3QgKiBmaWxlaGVhZDsKKyAgICAgICAgICBpZiAoIWZpbGVoZWFkKSB7CisgICAgICAgICAgICAgIHByaW50Zigic2VuZC1saXN0IGlzIGVtcHR5XG4iKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZWxpc3QgKiBmbHA7CisgICAgICAgICAgICAgIGNoYXIgKiBzOworICAgICAgICAgICAgICBmbHAgPSBmaWxlaGVhZDsKKyAgICAgICAgICAgICAgd2hpbGUgKGZscCkgeworICAgICAgICAgICAgICAgICAgcyA9IGZscC0+ZmxfYWxpYXM7CisgICAgICAgICAgICAgICAgICBpZiAoIXMpIHMgPSAiKG5vbmUpIjsKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMsIG1vZGU6ICVzLCBhbGlhczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxwLT5mbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdmbW9kZShmbHAtPmZsX21vZGUsMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcworICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICBmbHAgPSBmbHAtPmZsX25leHQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT01TRU5EICovCisKKyNpZmRlZiBDS1hYQ0hBUgorICAgICAgY2FzZSBTSERCTDoKKyAgICAgICAgc2hvZGJsKCk7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLWFhDSEFSICovCisKKyNpZm5kZWYgTk9QVVNICisjaWZuZGVmIE5PRlJJTExTCisgICAgICBjYXNlIFNIRURJVDoKKyAgICAgICAgaWYgKCFlZGl0b3JbMF0pIHsKKyAgICAgICAgICAgIHMgPSBnZXRlbnYoIkVESVRPUiIpOworICAgICAgICAgICAgaWYgKHMpIGNrc3RybmNweShlZGl0b3IscyxDS01BWFBBVEgpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXG4gZWRpdG9yOiAgJXNcbiIsIGVkaXRvclswXSA/IGVkaXRvciA6ICIobm9uZSkiKTsKKyAgICAgICAgaWYgKGVkaXRvclswXSkgeworICAgICAgICAgICAgcHJpbnRmKCIgb3B0aW9uczogJXNcbiIsIGVkaXRvcHRzWzBdID8gZWRpdG9wdHMgOiAiKG5vbmUpIik7CisgICAgICAgICAgICBwcmludGYoIiBmaWxlOiAgICAlc1xuIiwgZWRpdGZpbGVbMF0gPyBlZGl0ZmlsZSA6ICIobm9uZSkiKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIGJyZWFrOworCisjaWZkZWYgQlJPV1NFUgorICAgICAgY2FzZSBTSEJST1dTRToKKyAgICAgICAgaWYgKCFicm93c2VyWzBdKSB7CisgICAgICAgICAgICBzID0gZ2V0ZW52KCJCUk9XU0VSIik7CisgICAgICAgICAgICBpZiAocykgY2tzdHJuY3B5KGJyb3dzZXIscyxDS01BWFBBVEgpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXG4gYnJvd3NlcjogJXNcbiIsIGJyb3dzZXJbMF0gPyBicm93c2VyIDogIihub25lKSIpOworICAgICAgICBpZiAoYnJvd3NlclswXSkgeworICAgICAgICAgICAgcHJpbnRmKCIgb3B0aW9uczogJXNcbiIsIGJyb3dzb3B0c1swXSA/IGJyb3dzb3B0cyA6ICIobm9uZSkiKTsKKyAgICAgICAgICAgIHByaW50ZigiIHVybDogICAgICVzXG4iLCBicm93c3VybFswXSA/IGJyb3dzdXJsIDogIihub25lKSIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQlJPV1NFUiAqLworI2VuZGlmIC8qICBOT0ZSSUxMUyAqLworI2VuZGlmIC8qIE5PUFVTSCAqLworCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBDS19UQVBJCisgICAgICBjYXNlIFNIVEFQSTogICAgICAgICAgICAgICAgICAgICAgLyogVEFQSSBvcHRpb25zICovCisjaWZkZWYgSUtTRAorICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgIHByaW50ZigiU29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgc2hvdGFwaSgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNIVEFQSV9MOiAgICAgICAgICAgICAgICAgICAgLyogVEFQSSBMb2NhdGlvbnMgKi8KKyNpZmRlZiBJS1NECisgICAgICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICAgICAgcHJpbnRmKCJTb3JyeSwgY29tbWFuZCBkaXNhYmxlZC5cclxuIik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICB9CisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICBzaG90YXBpKDEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0hUQVBJX006ICAgICAgICAgICAgICAgICAgICAvKiBUQVBJIE1vZGVtICovCisjaWZkZWYgSUtTRAorICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgIHByaW50ZigiU29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgc2hvdGFwaSgyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNIVEFQSV9DOiAgICAgICAgICAgICAgICAgICAgLyogVEFQSSBDb21tICovCisjaWZkZWYgSUtTRAorICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgIHByaW50ZigiU29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgc2hvdGFwaSgzKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfVEFQSSAqLworCisgICAgICBjYXNlIFNIVENQOiAgICAgICAgICAgICAgICAgICAgICAgLyogU0hPVENQICovCisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgc2hvdGNwKDApOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIGJyZWFrOworCisjaWZkZWYgVE5DT0RFCisgICAgICBjYXNlIFNIVEVMOiAgICAgICAgICAgICAgICAgICAgICAgLyogVEVMTkVUICovCisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgc2hvdGVsKDApOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNIVE9QVDogICAgICAgICAgICAgICAgICAgICAgLyogVEVMTkVUIE9QVElPTlMgKi8KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBzaG90b3B0KDApOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFROQ09ERSAqLworCisjaWZkZWYgQ0tfVFJJR0dFUgorICAgICAgY2FzZSBTSFRSSUc6IHsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIHR0X3RyaWdnZXJbXSwgKiB0cmlnZ2VydmFsOworICAgICAgICAgIGludCBpOworICAgICAgICAgIGlmICghdHRfdHJpZ2dlclswXSkgeworICAgICAgICAgICAgICBwcmludGYoIiBUcmlnZ2VyczogKG5vbmUpXG4iKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBwcmludGYoIiBUcmlnZ2VyczpcbiIpOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgVFJJR0dFUlM7IGkrKykgeworICAgICAgICAgICAgICAgICAgaWYgKCF0dF90cmlnZ2VyW2ldKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiICBcIiVzXCJcbiIsdHRfdHJpZ2dlcltpXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcHJpbnRmKCIgTW9zdCByZWNlbnQgdHJpZ2dlciBlbmNvdW50ZXJlZDogIik7CisgICAgICAgICAgICAgIGlmICh0cmlnZ2VydmFsKQorICAgICAgICAgICAgICAgIHByaW50ZigiXCIlc1wiXG4iLHRyaWdnZXJ2YWwpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCIobm9uZSlcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyNlbmRpZiAvKiBDS19UUklHR0VSICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZuZGVmIE5PU1BMCisgICAgICBjYXNlIFNISU5QOgorICAgICAgICBzaG9pbnB1dCgpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgICBjYXNlIFNITE9HOiB7CisjaWZuZGVmIE1BQworI2lmZGVmIElLU0QKKyAgICAgICAgICBpZiAoaW5zZXJ2ZXIgJiYKKyNpZmRlZiBDS19MT0dJTgorICAgICAgICAgICAgICBpc2d1ZXN0CisjZWxzZSAvKiBDS19MT0dJTiAqLworICAgICAgICAgICAgICAwCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIHByaW50ZigiU29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBERUJVRworICAgICAgICAgIHByaW50ZigiXG4gRGVidWcgbG9nOiAgICAgICAlc1xuIiwgZGVibG9nID8gZGViZmlsIDogIihub25lKSIpOworI2VuZGlmIC8qIERFQlVHICovCisjaWZuZGVmIE5PWEZFUgorICAgICAgICAgIHByaW50ZigiIFBhY2tldCBsb2c6ICAgICAgJXNcbiIsICAgcGt0bG9nID8gcGt0ZmlsIDogIihub25lKSIpOworI2VuZGlmIC8qIE5PWEZFUiAqLworI2lmbmRlZiBOT0xPQ0FMCisgICAgICAgICAgcHJpbnRmKCIgU2Vzc2lvbiBsb2c6ICAgICAlc1xuIiwgICBzZXNsb2cgPyBzZXNmaWwgOiAiKG5vbmUpIik7CisjZW5kaWYgLyogTk9MT0NBTCAqLworI2lmZGVmIFRMT0cKKyAgICAgICAgICBwcmludGYoIiBUcmFuc2FjdGlvbiBsb2c6ICVzICglcylcbiIsCisgICAgICAgICAgICAgICAgICh0cmFsb2cgPyAoKnRyYWZpbCA/IHRyYWZpbCA6ICIobm9uZSkiKSA6ICIobm9uZSkiKSwKKyAgICAgICAgICAgICAgICAgKHRsb2dmbXQgPyAoKHRsb2dmbXQgPT0gMikgPyAiZnRwIiA6ICJ2ZXJib3NlIikgOiAiYnJpZWYiKQorICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIFRMT0cgKi8KKyNpZmRlZiBDS0xPR0RJQUwKKyAgICAgICAgICAgIHByaW50ZigiIENvbm5lY3Rpb24gbG9nOiAgJXNcbiIsIGRpYWxvZyA/IGRpYWZpbCA6ICIobm9uZSkiKTsKKyNlbmRpZiAvKiBDS0xPR0RJQUwgKi8KKyAgICAgICAgICBwcmludGYoIlxuIik7CisjZW5kaWYgLyogTUFDICovCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyNpZm5kZWYgTk9TUEwKKyAgICAgIGNhc2UgU0hPVVRQOiAgICAgICAgICAgICAgICAgICAgICAvKiBPVVRQVVQgKi8KKyAgICAgICAgc2hvb3V0cHV0KCk7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBQQVRURVJOUworICAgICAgY2FzZSBTSE9QQVQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIFBBVFRFUk5TICovCisgICAgICAgIHNob3BhdCgpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworCisjaWZkZWYgU1RSRUFNSU5HCisgICAgICBjYXNlIFNIT1NUUjogeyAgICAgICAgICAgICAgICAgICAgLyogU1RSRUFNSU5HICovCisgICAgICAgICAgZXh0ZXJuIGludCBzdHJlYW1ycSwgY2xlYXJycSwgY2xlYXJlZDsKKyAgICAgICAgICBleHRlcm4gbG9uZyB0ZmNwczsKKyAgICAgICAgICBkZWJ1ZyhGMTAxLCJTSE9XIFJFTElBQkxFIHJlbGlhYmxlIiwiIixyZWxpYWJsZSk7CisgICAgICAgICAgcHJpbnRmKCJcbiBSZWxpYWJsZTogICAgICVzXG4iLHNob3dvb2EocmVsaWFibGUpKTsKKyAgICAgICAgICBwcmludGYoIiBDbGVhcmNoYW5uZWw6ICVzXG4iLHNob3dvb2EoY2xlYXJycSkpOworICAgICAgICAgIHByaW50ZigiIFN0cmVhbWluZzogICAgJXNcblxuIixzaG93b29hKHN0cmVhbXJxKSk7CisgICAgICAgICAgaWYgKCghbG9jYWwgJiYgKHN0cmVhbXJxID09IFNFVF9PTikpIHx8CisgICAgICAgICAgICAgIChzdHJlYW1ycSA9PSBTRVRfQVVUTyAmJiByZWxpYWJsZSkpCisgICAgICAgICAgICBwcmludGYoIiBTdHJlYW1pbmcgd2lsbCBiZSBkb25lIGlmIHJlcXVlc3RlZC5cbiIpOworICAgICAgICAgIGVsc2UgaWYgKChzdHJlYW1ycSA9PSBTRVRfT0ZGKSB8fAorICAgICAgICAgICAgICAgICAgICgoc3RyZWFtcnEgPT0gU0VUX0FVVE8pICYmICFyZWxpYWJsZSkpCisgICAgICAgICAgICBwcmludGYoIiBTdHJlYW1pbmcgd2lsbCBub3QgYmUgcmVxdWVzdGVkIGFuZCB3aWxsIG5vdCBiZSBkb25lLlxuIik7CisgICAgICAgICAgZWxzZSBpZiAoKHN0cmVhbXJxID09IFNFVF9PTikgfHwKKyAgICAgICAgICAgICAgICAgICAoKHN0cmVhbXJxID09IFNFVF9BVVRPKSAmJiByZWxpYWJsZSkpCisgICAgICAgICAgICBwcmludGYoCisiIFN0cmVhbWluZyB3aWxsIGJlIHJlcXVlc3RlZCBhbmQgd2lsbCBiZSBkb25lIGlmIHRoZSBvdGhlciBLZXJtaXQgYWdyZWVzLlxuIik7CisgICAgICAgICAgcHJpbnRmKCIgTGFzdCB0cmFuc2ZlcjogJXNzdHJlYW1pbmclcywgJWxkIGNwcy5cbiIsCisgICAgICAgICAgICAgICAgIHN0cmVhbWVkID4gMCA/ICIiIDogIm5vICIsCisgICAgICAgICAgICAgICAgIGNsZWFyZWQgPyAiLCBjbGVhcmNoYW5uZWwiIDogIiIsCisgICAgICAgICAgICAgICAgIHRmY3BzCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorI2VuZGlmIC8qIFNUUkVBTUlORyAqLworCisgICAgICBjYXNlIFNIT0lLUzoKKyAgICAgICAgcmV0dXJuKHNob19pa3MoKSk7CisgICAgICAgIGJyZWFrOworCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICAgIGNhc2UgU0hPQVVUSDoKKyAgICAgICAgcmV0dXJuKHNob19hdXRoKDApKTsKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworCisjaWZuZGVmIE5PRlRQCisgICAgICBjYXNlIFNIT0ZUUDogeworI2lmZGVmIElLU0QKKyAgICAgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisjaWZkZWYgU1lTRlRQCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4dGVybiBjaGFyIGZ0cGFwcFtdLCBmdHBvcHRzW107CisgICAgICAgICAgICBwcmludGYoIiBmdHAtY2xpZW50OiAgJXNcbiIsIGZ0cGFwcFswXSA/IGZ0cGFwcCA6ICIobm9uZSkiKTsKKyAgICAgICAgICAgIGlmIChmdHBhcHBbMF0pCisgICAgICAgICAgICAgIHByaW50ZigiIGZ0cCBvcHRpb25zOiAlc1xuIiwgZnRwb3B0c1swXSA/IGZ0cG9wdHMgOiAiKG5vbmUpIik7CisgICAgICAgIH0KKyNlbHNlCisjaWZkZWYgTkVXRlRQCisgICAgICAgIHNob2Z0cCgwKTsKKyNlbHNlCisgICAgICAgIHByaW50ZigiKE5vIEZUUCBjbGllbnQgaW5jbHVkZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIEtlcm1pdC4pXG4iKTsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKyNlbmRpZiAvKiBTWVNGVFAgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYgLyogTk9GVFAgKi8KKworI2lmbmRlZiBOT0NNREwKKyAgICAgIGNhc2UgU0hYT1BUOiB7CisjaWZkZWYgSUtTREIKKyAgICAgICAgICBleHRlcm4gaW50IGRiZW5hYmxlZDsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIGRiZmlsZSwgKiBkYmRpcjsKKyNlbmRpZiAvKiBJS1NEQiAqLworI2lmZGVmIENLV1RNUAorICAgICAgICAgIGV4dGVybiBpbnQgY2t4d3RtcDsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIHd0bXBmaWxlOworI2VuZGlmIC8qIENLV1RNUCAqLworI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgZXh0ZXJuIGludCBja3hhbm9uLCB4ZmVybG9nLCBsb2dpbnRpbW87CisgICAgICAgICAgZXh0ZXJuIGNoYXIgKiB4ZmVyZmlsZTsKKyNpZmRlZiBVTklYCisgICAgICAgICAgZXh0ZXJuIGludCBja3hwcml2OworI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBDS19QRVJNUworICAgICAgICAgIGV4dGVybiBpbnQgY2t4cGVybXM7CisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgICAgICAgIGV4dGVybiBjaGFyICogYmFubmVyZmlsZSwgKiBoZWxwZmlsZTsKKworI2lmZGVmIElLU0QKKyAgICAgICAgICBpZiAoaW5zZXJ2ZXIgJiYKKyNpZmRlZiBDS19MT0dJTgorICAgICAgICAgICAgICBpc2d1ZXN0CisjZWxzZSAvKiBDS19MT0dJTiAqLworICAgICAgICAgICAgICAwCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgIHByaW50ZigiU29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgIGlmICghY21kaW50KQorICAgICAgICAgICAgcHJpbnRmKCIgLS1ub2ludGVycnVwdHNcbiIpOworICAgICAgICAgIHByaW50ZigiIC0tYmFubmVyZmlsZT0lc1xuIixiYW5uZXJmaWxlID8gYmFubmVyZmlsZSA6ICIobnVsbCkiKTsKKyAgICAgICAgICBwcmludGYoIiAtLWNkZmlsZTolc1xuIixjZG1zZ3N0ciA/IGNkbXNnc3RyIDogIihudWxsKSIpOworICAgICAgICAgIHByaW50ZigiIC0tY2RtZXNzYWdlOiVkXG4iLHNydmNkbXNnKTsKKyAgICAgICAgICBwcmludGYoIiAtLWhlbHBmaWxlOiVkXG4iLGhlbHBmaWxlKTsKKyAgICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisjaWZkZWYgQ0tTWVNMT0cKKyNpZmRlZiBTWVNMT0dMRVZFTAorICAgICAgICAgIHByaW50ZigiIC0tc3lzbG9nOiVkIChmb3JjZWQpXG4iLGNreHN5c2xvZyk7CisjZWxzZQorICAgICAgICAgIHByaW50ZigiIC0tc3lzbG9nOiVkXG4iLGNreHN5c2xvZyk7CisjZW5kaWYgLyogU1lTTE9HTEVWRUwgKi8KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworI2lmZGVmIENLV1RNUAorICAgICAgICAgIHByaW50ZigiIC0td3RtcGxvZzolZFxuIixja3h3dG1wKTsKKyAgICAgICAgICBwcmludGYoIiAtLXd0bXBmaWxlPSVzXG4iLHd0bXBmaWxlID8gd3RtcGZpbGUgOiAiKG51bGwpIik7CisjZW5kaWYgLyogQ0tXVE1QICovCisjaWZkZWYgSUtTRAorI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgcHJpbnRmKCIgLS1hbm9ueW1vdXM6JWRcbiIsY2t4YW5vbik7CisjaWZkZWYgVU5JWAorICAgICAgICAgIHByaW50ZigiIC0tcHJpdmlkOiVkXG4iLGNreHByaXYpOworI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBDS19QRVJNUworICAgICAgICAgIHByaW50ZigiIC0tcGVybWlzc2lvbjolMDRvXG4iLGNreHBlcm1zKTsKKyNlbmRpZiAvKiBDS19QRVJNUyAqLworICAgICAgICAgIHByaW50ZigiIC0taW5pdGZpbGU6JXNcbiIsYW5vbmZpbGUgPyBhbm9uZmlsZSA6ICIobnVsbCkiKTsKKyAgICAgICAgICBwcmludGYoIiAtLXVzZXJmaWxlOiVzXG4iLHVzZXJmaWxlID8gdXNlcmZpbGUgOiAiKG51bGwpIik7CisgICAgICAgICAgcHJpbnRmKCIgLS1yb290OiVzXG4iLGFub25yb290ID8gYW5vbnJvb3QgOiAiKG51bGwpIik7CisgICAgICAgICAgcHJpbnRmKCIgLS14ZmVybG9nPSVkXG4iLHhmZXJsb2cpOworICAgICAgICAgIHByaW50ZigiIC0teGZlcmZpbGU9JXNcbiIseGZlcmZpbGUgPyB4ZmVyZmlsZSA6ICIobnVsbCkiKTsKKyAgICAgICAgICBwcmludGYoIiAtLXRpbWVvdXQ9JWRcbiIsbG9naW50aW1vKTsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2lmZGVmIElLU0RCCisgICAgICAgICAgcHJpbnRmKCIgLS1kYXRhYmFzZT0lZFxuIixkYmVuYWJsZWQpOworICAgICAgICAgIHByaW50ZigiIC0tZGJmaWxlPSVzXG4iLGRiZmlsZSA/IGRiZmlsZSA6ICIobnVsbCkiKTsKKyAgICAgICAgICBpZiAoZGJkaXIpCisgICAgICAgICAgICBwcmludGYoIiAgIChkYiBkaXJlY3Rvcnk9WyVzXSlcbiIsZGJkaXIpOworI2VuZGlmIC8qIElLU0RCICovCisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICBwcmludGYoIiBJS1NEIGNvbmY9JXNcbiIsaWtzZGNvbmYpOworI2VuZGlmIC8qIElLU0RDT05GICovCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyNlbmRpZiAvKiBOT0NNREwgKi8KKworICAgICAgY2FzZSBTSENEOiB7CisJICBleHRlcm4gY2hhciAqIG15aG9tZTsKKwkgIHMgPSBnZXRlbnYoIkNEUEFUSCIpOworCSAgaWYgKCFzKSBzID0gIihub25lKSI7CisJICBwcmludGYoIlxuIGN1cnJlbnQgZGlyZWN0b3J5OiAgJXNcbiIsIHpndGRpcigpKTsKKwkgIHByaW50ZigiIHByZXZpb3VzIGRpcmVjdG9yeTogJXNcbiIsIHByZXZkaXIgPyBwcmV2ZGlyIDogIihub25lKSIpOworCSAgcHJpbnRmKCIgY2QgaG9tZTogICAgICAgICAgICAlc1xuIiwgaG9tZXBhdGgoKSk7CisJICBwcmludGYoIiBjZCBwYXRoOiAgICAgICAgICAgICVzXG4iLCBja2NkcGF0aCA/IGNrY2RwYXRoIDogcyk7CisJICBwcmludGYoIiBjZCBtZXNzYWdlOiAgICAgICAgICVzXG4iLCBzaG93b2ZmKHNydmNkbXNnICYgMikpOworCSAgcHJpbnRmKCIgc2VydmVyIGNkLW1lc3NhZ2U6ICAlc1xuIiwgc2hvd29mZihzcnZjZG1zZyAmIDEpKTsKKwkgIHByaW50ZigiIGNkIG1lc3NhZ2UgZmlsZTogICAgJXNcblxuIixjZG1zZ3N0ciA/IGNkbXNnc3RyIDogIihub25lKSIpOworCSAgYnJlYWs7CisgICAgICB9CisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgIGNhc2UgU0hBU1NPQzoKKyAgICAgICAgKFZPSUQpIHNob3dhc3NvYygpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyNpZmRlZiBDS0xPR0RJQUwKKyAgICAgIGNhc2UgU0hDT05OWDoKKyNpZmRlZiBORVdGVFAKKyAgICAgICAgaWYgKGZ0cGlzY29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIGV4dGVybiBjaGFyIGN4bG9nYnVmW107CisgICAgICAgICAgICBkb2xvZ3Nob3coV19GVFAgfCAxKTsKKyAgICAgICAgICAgIGlmIChjeGxvZ2J1ZlswXSkKKyAgICAgICAgICAgICAgZG9sb2dzaG93KDEpOworICAgICAgICB9IGVsc2UgeworI2VuZGlmIC8qIE5FV0ZUUCAqLworICAgICAgICAgICAgZG9sb2dzaG93KDEpOworI2lmZGVmIE5FV0ZUUAorICAgICAgICB9CisjZW5kaWYgLyogTkVXRlRQICovCisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLTE9HRElBTCAqLworCisgICAgICBjYXNlIFNIT1BUUzoKKyAgICAgICAgb3B0bGluZXMgPSAwOworI2lmbmRlZiBOT0ZSSUxMUworICAgICAgICAoVk9JRCkgc2hvd2RlbG9wdHMoKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2lmZGVmIERPTVlESVIKKyAgICAgICAgKFZPSUQpIHNob3dkaXJvcHRzKCk7CisjZW5kaWYgLyogRE9NWURJUiAqLworI2lmZGVmIENLUFVSR0UKKyAgICAgICAgKFZPSUQpIHNob3dwdXJnb3B0cygpOworI2VuZGlmIC8qIENLUFVSR0UgKi8KKyAgICAgICAgKFZPSUQpIHNob3d0eXBvcHRzKCk7CisgICAgICAgIGJyZWFrOworCisjaWZuZGVmIE5PTE9DQUwKKyAgICAgIGNhc2UgU0hPRkxPOgorICAgICAgICAoVk9JRCkgc2hvZmxvdygpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgICBjYXNlIFNIT1hGRVI6CisgICAgICAgIChWT0lEKSBzaG94ZmVyKCk7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgQ0tfUkVDQUxMCisgICAgICBjYXNlIFNISElTVE9SWToKKyAgICAgICAgKFZPSUQpIGNtaGlzdG9yeSgpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKworI2lmbmRlZiBOT1NFWFAKKyNpZm5kZWYgTk9TUEwKKyAgICAgIGNhc2UgU0hTRVhQOgorICAgICAgICAoVk9JRCkgc2hvc2V4cCgpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1NQTCAqLworI2VuZGlmIC8qIE5PU0VYUCAqLworCisjaWZkZWYgQU5ZU1NICisgICAgICBjYXNlIFNIT1NTSDoKKyAgICAgICAgKFZPSUQpIHNob3NzaCgpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBBTllTU0ggKi8KKworI2lmZGVmIEtVSQorICAgICAgY2FzZSBTSE9HVUk6CisgICAgICAgIChWT0lEKSBzaG9ndWkoKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogS1VJICovCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ZigiXG5Ob3RoaW5nIHRvIHNob3cuLi5cbiIpOworICAgICAgICByZXR1cm4oLTIpOworICAgIH0KKyAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworfQorCisjaWZuZGVmIE5PWEZFUgoraW50CitzaG9hdHQoKSB7CisgICAgcHJpbnRmKCJBdHRyaWJ1dGVzOiAlc1xuIiwgc2hvd29mZihhdGNhcHIpKTsKKyAgICBpZiAoIWF0Y2FwcikgcmV0dXJuKDApOworICAgIHByaW50ZigiIEJsb2Nrc2l6ZTogJXNcbiIsIHNob3dvZmYoYXRibGtpKSk7CisgICAgcHJpbnRmKCIgRGF0ZTogJXNcbiIsIHNob3dvZmYoYXRkYXRpKSk7CisgICAgcHJpbnRmKCIgRGlzcG9zaXRpb246ICVzXG4iLCBzaG93b2ZmKGF0ZGlzaSkpOworICAgIHByaW50ZigiIEVuY29kaW5nIChDaGFyYWN0ZXIgU2V0KTogJXNcbiIsIHNob3dvZmYoYXRlbmNpKSk7CisgICAgcHJpbnRmKCIgTGVuZ3RoOiAlc1xuIiwgc2hvd29mZihhdGxlbmkpKTsKKyAgICBwcmludGYoIiBUeXBlICh0ZXh0L2JpbmFyeSk6ICVzXG4iLCBzaG93b2ZmKGF0dHlwaSkpOworICAgIHByaW50ZigiIFN5c3RlbSBJRDogJXNcbiIsIHNob3dvZmYoYXRzaWRpKSk7CisgICAgcHJpbnRmKCIgU3lzdGVtIEluZm86ICVzXG4iLCBzaG93b2ZmKGF0c3lzaSkpOworI2lmZGVmIENLX1BFUk1TCisgICAgcHJpbnRmKCIgUGVybWlzc2lvbnMgSW46ICAlc1xuIiwgc2hvd29mZihhdGxwcmkpKTsKKyAgICBwcmludGYoIiBQZXJtaXNzaW9ucyBPdXQ6ICVzXG4iLCBzaG93b2ZmKGF0bHBybykpOworI2VuZGlmIC8qIENLX1BFUk1TICovCisjaWZkZWYgU1RSQVRVUworICAgIHByaW50ZigiIEZvcm1hdDogJXNcbiIsIHNob3dvZmYoYXRmcm1pKSk7CisgICAgcHJpbnRmKCIgQ3JlYXRvcjogJXNcbiIsIHNob3dvZmYoYXRjcmVpKSk7CisgICAgcHJpbnRmKCIgQWNjb3VudDogJXNcbiIsIHNob3dvZmYoYXRhY3RpKSk7CisjZW5kaWYgLyogU1RSQVRVUyAqLworICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1NQTAoraW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNIT1cgTUFDUk9TICovCitzaG9tYWMoczEsIHMyKSBjaGFyICpzMSwgKnMyOyB7CisgICAgaW50IHgsIG4sIHBwOworICAgIHBwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhcmVudGhlc2lzIGNvdW50ZXIgKi8KKworICAgIGRlYnVnKEYxMTAsInNob21hYyBzMSIsczEsMCk7CisgICAgZGVidWcoRjExMCwic2hvbWFjIHMyIixzMiwwKTsKKworI2lmZGVmIElLU0QKKyAgICBpZiAoIGluc2VydmVyICYmCisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgaWtzZGNmCisjZWxzZSAvKiBJS1NEQ09ORiAqLworICAgICAgICAxCisjZW5kaWYgLyogSUtTRENPTkYgKi8KKyAgICAgICAgKSB7CisgICAgICAgIGlmICghY2tzdHJjbXAoIm9uX2V4aXQiLHMxLC0xLDApIHx8CisgICAgICAgICAgICAhY2tzdHJjbXAoIm9uX2xvZ291dCIsczEsLTEsMCkpCisgICAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisKKyAgICBpZiAoIXMxKQorICAgICAgcmV0dXJuKDApOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiJXMgPSAiLHMxKTsgICAgICAgICAgICAgICAvKiBQcmludCBibGFuayBsaW5lIGFuZCBtYWNybyBuYW1lICovCisgICAgbiA9IChpbnQpc3RybGVuKHMxKSArIDQ7ICAgICAgICAgICAgLyogV2lkdGggb2YgY3VycmVudCBsaW5lICovCisgICAgaWYgKCFzMikgczIgPSAiKG5vdCBkZWZpbmVkKSI7CisKKyAgICB3aGlsZSAoKHggPSAqczIrKykpIHsgICAgICAgICAgICAgICAvKiBMb29wIHRocnUgZGVmaW5pdGlvbiAqLworICAgICAgICBpZiAoeCA9PSAnKCcpIHBwKys7ICAgICAgICAgICAgIC8qIFRyZWF0IGNvbW1hcyB3aXRoaW4gcGFyZW5zICovCisgICAgICAgIGlmICh4ID09ICcpJykgcHAtLTsgICAgICAgICAgICAgLyogYXMgb3JkaW5hcnkgdGV4dCAqLworICAgICAgICBpZiAocHAgPCAwKSBwcCA9IDA7ICAgICAgICAgICAgIC8qIE91dHNpZGUgcGFyZW5zLCAqLworICAgICAgICBpZiAoeCA9PSAnLCcgJiYgcHAgPT0gMCkgeyAgICAgIC8qIGNvbW1hIGJlY29tZXMgY29tbWEtZGFzaC1OTC4gKi8KKyAgICAgICAgICAgIHB1dGNoYXIoJywnKTsKKyAgICAgICAgICAgIHB1dGNoYXIoJy0nKTsKKyAgICAgICAgICAgIHggPSAnXG4nOworICAgICAgICB9CisgICAgICAgIGlmIChpbnNlcnZlciAmJiAoeCA9PSAnXG4nKSkgICAgLyogU2VuZCBDUiBiZWZvcmUgTEYgKi8KKyAgICAgICAgICBwdXRjaGFyKENSKTsKKyAgICAgICAgcHV0Y2hhcigoQ0hBUil4KTsgICAgICAgICAgICAgICAvKiBPdXRwdXQgdGhlIGNoYXJhY3RlciAqLworICAgICAgICBpZiAoeCA9PSAnXG4nKSB7ICAgICAgICAgICAgICAgIC8qIElmIGl0IHdhcyBhIG5ld2xpbmUgKi8KKyNpZmRlZiBVTklYCisjaWZkZWYgTk9TRVRCVUYKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmIC8qIE5PU0VUQlVGICovCisjZW5kaWYgLyogVU5JWCAqLworICAgICAgICAgICAgcHV0Y2hhcignICcpOyAgICAgICAgICAgICAgIC8qIEluZGVudCB0aGUgbmV4dCBsaW5lIDEgc3BhY2UgKi8KKyAgICAgICAgICAgIHdoaWxlKCpzMiA9PSAnICcpIHMyKys7ICAgICAvKiBza2lwIHBhc3QgbGVhZGluZyBibGFua3MgKi8KKyAgICAgICAgICAgIG4gPSAyOyAgICAgICAgICAgICAgICAgICAgICAvKiByZXN0YXJ0IHRoZSBjaGFyYWN0ZXIgY291bnRlciAqLworICAgICAgICAgICAgc2xjKys7ICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBpbmNyZW1lbnQgdGhlIGxpbmUgY291bnRlci4gKi8KKyAgICAgICAgfSBlbHNlIGlmICgrK24gPiAoY21kX2NvbHMgLSAxKSkgeyAvKiBJZiBsaW5lIGlzIHRvbyB3aWRlICovCisgICAgICAgICAgICBwdXRjaGFyKCctJyk7ICAgICAgICAgICAgICAgLyogb3V0cHV0IGEgZGFzaCAqLworICAgICAgICAgICAgaWYgKGluc2VydmVyKQorICAgICAgICAgICAgICBwdXRjaGFyKENSKTsgICAgICAgICAgICAgIC8qIGFuZCBhIGNhcnJpYWdlIHJldHVybiAqLworICAgICAgICAgICAgcHV0Y2hhcihOTCk7ICAgICAgICAgICAgICAgIC8qIGFuZCBhIG5ld2xpbmUgKi8KKyNpZmRlZiBVTklYCisjaWZkZWYgTk9TRVRCVUYKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmIC8qIE5PU0VUQlVGICovCisjZW5kaWYgLyogVU5JWCAqLworICAgICAgICAgICAgbiA9IDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXN0YXJ0IHRoZSBjaGFyIGNvdW50ZXIgKi8KKyAgICAgICAgICAgIHNsYysrOyAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgaW5jcmVtZW50IHRoZSBsaW5lIGNvdW50ZXIgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAobiA8IDMgJiYgc2xjID4gKGNtZF9yb3dzIC0gMykpIHsgLyogSWYgbmV3IGxpbmUgYW5kIHNjcmVlbiBmdWxsICovCisgICAgICAgICAgICBpZiAoIWFza21vcmUoKSkgcmV0dXJuKC0xKTsgLyogYXNrIGlmIHRoZXkgd2FudCBtb3JlLiAqLworICAgICAgICAgICAgbiA9IDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZXkgZG8sIHN0YXJ0IGEgbmV3IGxpbmUgKi8KKyAgICAgICAgICAgIHNsYyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmVzdGFydCBsaW5lIGNvdW50ZXIgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5zZXJ2ZXIpCisgICAgICBwdXRjaGFyKENSKTsKKyAgICBwdXRjaGFyKE5MKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgZGVmaW5pdGlvbiAqLworICAgIGlmICgrK3NsYyA+IChjbWRfcm93cyAtIDMpKSB7CisgICAgICAgIGlmICghYXNrbW9yZSgpKSByZXR1cm4oLTEpOworICAgICAgICBzbGMgPSAwOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogTk9TUEwgKi8KKyNlbmRpZiAvKiBOT1NIT1cgKi8KKworaW50IHhfaWZudW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIElGIE5VTUVSSUMgYWN0aXZlICovCisKKyNpZm5kZWYgTk9TUEwKKy8qIEV2YWx1YXRlIGFuIGFyaXRobWV0aWMgZXhwcmVzc2lvbi4gKi8KKy8qIENvZGUgYWRhcHRlZCBmcm9tIGV2LCBieSBIb3dpZSBLYXllIG9mIENvbHVtYmlhIFUgJiBvdGhlcnMuICovCisKK3N0YXRpYyBpbnQgeGVycm9yID0gMDsKK2ludCBkaXZieXplcm8gPSAwOworc3RhdGljIGNoYXIgKmNwOworc3RhdGljIGxvbmcgdG9rdmFsOworc3RhdGljIGNoYXIgY3VydG9rOworc3RhdGljIGxvbmcgZXhwdmFsOworCisjZGVmaW5lIExPTkdCSVRTICg4KnNpemVvZiAobG9uZykpCisjZGVmaW5lIE5VTUJFUiAnTicKKyNkZWZpbmUgTl9FT1QgJ0UnCisKKy8qCisgUmVwbGFjZW1lbnQgZm9yIHN0cmNocigpIGFuZCBpbmRleCgpLCBuZWl0aGVyIG9mIHdoaWNoIHNlZW0gdG8gYmUgdW5pdmVyc2FsLgorKi8KKworc3RhdGljIGNoYXIgKgorI2lmZGVmIENLX0FOU0lDCit3aW5kZXgoY2hhciAqIHMsIGNoYXIgYykKKyNlbHNlCit3aW5kZXgocyxjKSBjaGFyICpzLCBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB3aW5kZXggKi8geworICAgIHdoaWxlICgqcyAhPSBOVUwgJiYgKnMgIT0gYykgcysrOworICAgIGlmICgqcyA9PSBjKSByZXR1cm4ocyk7IGVsc2UgcmV0dXJuKE5VTEwpOworfQorCisKKy8qCisgZyBlIHQgdCBvIGsKKworIFJldHVybnMgdGhlIG5leHQgdG9rZW4uICBJZiB0b2tlbiBpcyBhIE5VTUJFUiwgc2V0cyB0b2t2YWwgYXBwcm9wcmlhdGVseS4KKyovCitzdGF0aWMgY2hhcgorZ2V0dG9rKCkgeworICAgIGNoYXIgdGJ1Zls4MF0gLyogLCp0cCAqLyA7ICAgICAgICAgIC8qIEJ1ZmZlciB0byBhY2N1bXVsYXRlIG51bWJlciAqLworCisgICAgd2hpbGUgKGlzc3BhY2UoKmNwKSkgICAgICAgICAgICAgICAgLyogU2tpcCBwYXN0IGxlYWRpbmcgc3BhY2VzICovCisgICAgICBjcCsrOworCisgICAgZGVidWcoRjExMCwiR0VUVE9LIixjcCwwKTsKKworICAgIHN3aXRjaCAoKmNwKSB7CisgICAgICBjYXNlICckJzogICAgICAgICAgICAgICAgICAgICAgICAgLyogPz8/ICovCisgICAgICBjYXNlICcrJzogICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkICovCisgICAgICBjYXNlICctJzogICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VidHJhY3Qgb3IgTmVnYXRlICovCisgICAgICBjYXNlICdAJzogICAgICAgICAgICAgICAgICAgICAgICAgLyogR3JlYXRlc3QgQ29tbW9uIERpdmlzb3IgKi8KKyAgICAgIGNhc2UgJyonOiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNdWx0aXBseSAqLworICAgICAgY2FzZSAnLyc6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpdmlkZSAqLworICAgICAgY2FzZSAnJSc6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vZHVsdXMgKi8KKyAgICAgIGNhc2UgJzwnOiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IHNoaWZ0ICovCisgICAgICBjYXNlICc+JzogICAgICAgICAgICAgICAgICAgICAgICAgLyogUmlnaHQgc2hpZnQgKi8KKyAgICAgIGNhc2UgJyYnOiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbmQgKi8KKyAgICAgIGNhc2UgJ3wnOiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPciAqLworICAgICAgY2FzZSAnIyc6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4Y2x1c2l2ZSBPciAqLworICAgICAgY2FzZSAnfic6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCAqLworICAgICAgY2FzZSAnXic6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4cG9uZW50ICovCisgICAgICBjYXNlICchJzogICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFjdG9yaWFsICovCisgICAgICBjYXNlICcoJzogICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFyZW5zIGZvciBncm91cGluZyAqLworICAgICAgY2FzZSAnKSc6IHJldHVybigqY3ArKyk7ICAgICAgICAgIC8qIG9wZXJhdG9yLCBqdXN0IHJldHVybiBpdCAqLworICAgICAgY2FzZSAnXG4nOgorICAgICAgY2FzZSAnXDAnOiByZXR1cm4oTl9FT1QpOyAgICAgICAgIC8qIEVuZCBvZiBsaW5lLCByZXR1cm4gdGhhdCAqLworICAgIH0KKyNpZmRlZiBDT01NRU5UCisvKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBjb2RlLCB3aGljaCBhbGxvd3Mgb25seSBpbnRlZ2VyIG51bWJlcnMuICovCisKKyAgICBpZiAoaXN4ZGlnaXQoKmNwKSkgeyAgICAgICAgICAgICAgICAvKiBEaWdpdCwgbXVzdCBiZSBhIG51bWJlciAqLworICAgICAgICBpbnQgcmFkaXggPSAxMDsgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgcmFkaXggKi8KKyAgICAgICAgZm9yICh0cCA9IHRidWY7IGlzeGRpZ2l0KCpjcCk7IGNwKyspCisgICAgICAgICAgKnRwKysgPSAoY2hhcikgKGlzdXBwZXIoKmNwKSA/IHRvbG93ZXIoKmNwKSA6ICpjcCk7CisgICAgICAgICp0cCA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG51bWJlciAqLworICAgICAgICBzd2l0Y2goaXN1cHBlcigqY3ApID8gdG9sb3dlcigqY3ApIDogKmNwKSB7IC8qIEV4YW1pbmUgYnJlYWsgY2hhciAqLworICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgIGNhc2UgJ3gnOiByYWRpeCA9IDE2OyBjcCsrOyBicmVhazsgLyogaWYgcmFkaXggc2lnbmlmaWVyLi4uICovCisgICAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgY2FzZSAncSc6IHJhZGl4ID0gODsgY3ArKzsgYnJlYWs7CisgICAgICAgICAgY2FzZSAndCc6IHJhZGl4ID0gMjsgY3ArKzsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh0cCA9IHRidWYsIHRva3ZhbCA9IDA7ICp0cCAhPSAnXDAnOyB0cCsrKSAgeworICAgICAgICAgICAgaW50IGRpZzsKKyAgICAgICAgICAgIGRpZyA9ICp0cCAtICcwJzsgICAgICAgICAgICAvKiBDb252ZXJ0IG51bWJlciAqLworICAgICAgICAgICAgaWYgKGRpZyA+IDEwKSBkaWcgLT0gJ2EnLScwJy0xMDsKKyAgICAgICAgICAgIGlmIChkaWcgPj0gcmFkaXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY21kbHZsID09IDAgJiYgIXhfaWZudW0gJiYgIXhlcnJvcikKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiP0ludmFsaWQgZGlnaXQgJyVjJyBpbiBudW1iZXJcbiIsKnRwKTsKKyAgICAgICAgICAgICAgICB4ZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIHJldHVybihOVU1CRVIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9rdmFsID0gcmFkaXgqdG9rdmFsICsgZGlnOworICAgICAgICB9CisgICAgICAgIHJldHVybihOVU1CRVIpOworICAgIH0KKyAgICBpZiAoY21kbHZsID09IDAgJiYgIXhfaWZudW0gJiYgIXhlcnJvcikKKyAgICAgIHByaW50ZigiSW52YWxpZCBjaGFyYWN0ZXIgJyVjJyBpbiBpbnB1dFxuIiwqY3ApOworICAgIHhlcnJvciA9IDE7CisgICAgY3ArKzsKKyAgICByZXR1cm4oZ2V0dG9rKCkpOworI2Vsc2UKKy8qIFRoaXMgY29kZSBhbGxvd3Mgbm9uLW51bWJlcnMgdG8gYmUgdHJlYXRlZCBhcyBtYWNybyBuYW1lcyAqLworICAgIHsKKyAgICAgICAgaW50IGksIHg7CisgICAgICAgIGNoYXIgKiBzLCAqIGNwMTsKKyAgICAgICAgY3AxID0gY3A7CisgICAgICAgIHRwID0gdGJ1ZjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDgwOyBpKyspIHsKKyAgICAgICAgICAgIC8qIExvb2sgYWhlYWQgdG8gbmV4dCBicmVhayBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIC8qIHByZXR0eSBtdWNoIGFueXRoaW5nIHRoYXQgaXMgbm90IGluIHRoZSBzd2l0Y2goKSBhYm92ZS4gKi8KKyAgICAgICAgICAgIGlmIChpc2FscGhhKCpjcCkgfHwgaXNkaWdpdCgqY3ApIHx8CisgICAgICAgICAgICAgICAgKmNwID09ICdfJyB8fCAqY3AgPT0gJzonIHx8ICpjcCA9PSAnLicgfHwKKyAgICAgICAgICAgICAgICAqY3AgPT0gJ1snIHx8ICpjcCA9PSAnXScgfHwKKyAgICAgICAgICAgICAgICAqY3AgPT0gJ3snIHx8ICpjcCA9PSAnfScKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgIHRidWZbaV0gPSAqY3ArKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPj0gODApIHsKKyAgICAgICAgICAgIHByaW50ZigiVG9vIGxvbmcgLSBcIiVzXCJcbiIsIGNwMSk7CisgICAgICAgICAgICB4ZXJyb3IgPSAxOworICAgICAgICAgICAgY3ArKzsKKyAgICAgICAgICAgIHJldHVybihnZXR0b2soKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHhlcnJvcikgcmV0dXJuKE5VTUJFUik7CisKKyAgICAgICAgdGJ1ZltpXSA9IE5VTDsKKyAgICAgICAgcyA9IHRidWY7CisgICAgICAgIGlmICghaXNkaWdpdCh0YnVmWzBdKSkgeworICAgICAgICAgICAgY2hhciAqIHMyID0gTlVMTDsKKyAgICAgICAgICAgIHggPSBteGxvb2sobWFjdGFiLHRidWYsbm1hYyk7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJnZXR0b2sgbXhsb29rIix0YnVmLHgpOworICAgICAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGNtZGx2bCA9PSAwICYmICF4X2lmbnVtICYmICF4ZXJyb3IpCisgICAgICAgICAgICAgICAgICBwcmludGYoIkJhZCBudW1iZXIgLSBcIiVzXCJcbiIsdGJ1Zik7CisgICAgICAgICAgICAgICAgeGVycm9yID0gMTsKKyAgICAgICAgICAgICAgICBjcCsrOworICAgICAgICAgICAgICAgIHJldHVybihnZXR0b2soKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzMiA9IG1hY3RhYlt4XS5tdmFsOworICAgICAgICAgICAgaWYgKCFzMikgczIgPSAiIjsKKyAgICAgICAgICAgIGlmICgqczIpIHMgPSBzMjsKKyAgICAgICAgfQorI2lmZGVmIENLRkxPQVQKKyAgICAgICAgeCA9IGlzZmxvYXQocywwKTsKKyNlbHNlCisgICAgICAgIHggPSBjaGtudW0ocyk7CisjZW5kaWYgLyogQ0tGTE9BVCAqLworICAgICAgICBpZiAoeCA+IDApIHsKKyAgICAgICAgICAgIHRva3ZhbCA9IGF0b2kocyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY21kbHZsID09IDAgJiYgIXhfaWZudW0gJiYgIXhlcnJvcikKKyAgICAgICAgICAgICAgcHJpbnRmKCJCYWQgbnVtYmVyIC0gXCIlc1wiXG4iLHRidWYpOworICAgICAgICAgICAgeGVycm9yID0gMTsKKyAgICAgICAgICAgIGNwKys7CisgICAgICAgICAgICByZXR1cm4oZ2V0dG9rKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybihOVU1CRVIpOworICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCit9CisKK3N0YXRpYyBsb25nCisjaWZkZWYgQ0tfQU5TSUMKK2V4cG9uKGxvbmcgeCwgbG9uZyB5KQorI2Vsc2UKK2V4cG9uKHgseSkgbG9uZyB4LHk7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGV4cG9uICovIHsKKyAgICBsb25nIHJlc3VsdCA9IDE7CisgICAgaW50IHNpZ24gPSAxOworICAgIGlmICh5IDwgMCkgcmV0dXJuKDApOworICAgIGlmICh4IDwgMCkgeworICAgICAgICB4ID0gLXg7CisgICAgICAgIGlmICh5ICYgMSkgc2lnbiA9IC0xOworICAgIH0KKyAgICB3aGlsZSAoeSAhPSAwKSB7CisgICAgICAgIGlmICh5ICYgMSkgcmVzdWx0ICo9IHg7CisgICAgICAgIHkgPj49IDE7CisgICAgICAgIGlmICh5ICE9IDApIHggKj0geDsKKyAgfQorICByZXR1cm4ocmVzdWx0ICogc2lnbik7Cit9CisKKy8qCisgKiBmYWN0b3IgOjo9IHNpbXBsZSB8IHNpbXBsZSBeIGZhY3RvcgorICoKKyAqLworc3RhdGljIFZPSUQKK2ZhY3RvcigpIHsKKyAgICBsb25nIG9sZHZhbDsKKyAgICBzaW1wbGUoKTsKKyAgICBpZiAoY3VydG9rID09ICdeJykgeworICAgICAgICBvbGR2YWwgPSBleHB2YWw7CisgICAgICAgIGN1cnRvayA9IGdldHRvaygpOworICAgICAgICBmYWN0b3IoKTsKKyAgICAgICAgZXhwdmFsID0gZXhwb24ob2xkdmFsLGV4cHZhbCk7CisgICAgfQorfQorCisvKgorICogdGVybXAgOjo9IE5VTEwgfCB7KiwvLCUsJn0gZmFjdG9yIHRlcm1wCisgKgorICovCitzdGF0aWMgVk9JRAordGVybXAoKSB7CisgICAgd2hpbGUgKGN1cnRvayA9PSAnKicgfHwgY3VydG9rID09ICcvJyB8fCBjdXJ0b2sgPT0gJyUnIHx8IGN1cnRvayA9PSAnJicpIHsKKyAgICAgICAgbG9uZyBvbGR2YWw7CisgICAgICAgIGNoYXIgb3A7CisgICAgICAgIG9wID0gY3VydG9rOworICAgICAgICBjdXJ0b2sgPSBnZXR0b2soKTsgICAgICAgICAgICAgIC8qIHNraXAgcGFzdCBvcGVyYXRvciAqLworICAgICAgICBvbGR2YWwgPSBleHB2YWw7CisgICAgICAgIGZhY3RvcigpOworICAgICAgICBzd2l0Y2gob3ApIHsKKyAgICAgICAgICBjYXNlICcqJzogZXhwdmFsID0gb2xkdmFsICogZXhwdmFsOyBicmVhazsKKyAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgIGlmIChleHB2YWwgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgheF9pZm51bSkKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiP0RpdmlkZSBieSB6ZXJvXG4iKTsKKyAgICAgICAgICAgICAgICB4ZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIGRpdmJ5emVybyA9IDE7CisgICAgICAgICAgICAgICAgZXhwdmFsID0gLTE7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgZXhwdmFsID0gKG9wID09ICcvJykgPyAob2xkdmFsIC8gZXhwdmFsKSA6IChvbGR2YWwgJSBleHB2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnJic6CisgICAgICAgICAgICBleHB2YWwgPSBvbGR2YWwgJiBleHB2YWw7IGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgbG9uZworI2lmZGVmIENLX0FOU0lDCitmYWN0KGxvbmcgeCkKKyNlbHNlCitmYWN0KHgpIGxvbmcgeDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogZmFjdCAqLyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhY3RvcmlhbCAqLworICAgIGxvbmcgcmVzdWx0ID0gMTsKKyAgICB3aGlsZSAoeCA+IDEpCisgICAgICByZXN1bHQgKj0geC0tOworICAgIHJldHVybihyZXN1bHQpOworfQorCisvKgorICogdGVybSA6Oj0gZmFjdG9yIHRlcm1wCisgKgorICovCitzdGF0aWMgVk9JRAordGVybSgpIHsKKyAgICBmYWN0b3IoKTsKKyAgICB0ZXJtcCgpOworfQorCitzdGF0aWMgbG9uZworI2lmZGVmIENLX0FOU0lDCitnY2QobG9uZyB4LCBsb25nIHkpCisjZWxzZQorZ2NkKHgseSkgbG9uZyB4LHk7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGdjZCAqLyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHcmVhdGVzdCBDb21tb24gRGl2aXNvciAqLworICAgIGludCBuc2hpZnQgPSAwOworICAgIGlmICh4IDwgMCkgeCA9IC14OworICAgIGlmICh5IDwgMCkgeSA9IC15OyAgICAgICAgICAgICAgICAgIC8qIHZhbGlkYXRlIGFyZ3VtZW50cyAqLworICAgIGlmICh4ID09IDAgfHwgeSA9PSAwKSByZXR1cm4oeCArIHkpOyAgICAvKiB0aGlzIGlzIGJvZ3VzICovCisKKyAgICB3aGlsZSAoISgoeCAmIDEpIHwgKHkgJiAxKSkpIHsgICAgICAvKiBnZXQgcmlkIG9mIHBvd2VycyBvZiAyICovCisgICAgICAgIG5zaGlmdCsrOworICAgICAgICB4ID4+PSAxOworICAgICAgICB5ID4+PSAxOworICAgIH0KKyAgICB3aGlsZSAoeCAhPSAxICYmIHkgIT0gMSAmJiB4ICE9IDAgJiYgeSAhPSAwKSB7CisgICAgICAgIHdoaWxlICghKHggJiAxKSkgeCA+Pj0gMTsgICAgICAgLyogZWxpbWluYXRlIHVubmVjZXNzYXJ5ICovCisgICAgICAgIHdoaWxlICghKHkgJiAxKSkgeSA+Pj0gMTsgICAgICAgLyogcG93ZXJzIG9mIDIgKi8KKyAgICAgICAgaWYgKHggPCB5KSB7ICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSB4IHRvIGJlIGxhcmdlciAqLworICAgICAgICAgICAgbG9uZyB0OworICAgICAgICAgICAgdCA9IHg7CisgICAgICAgICAgICB4ID0geTsKKyAgICAgICAgICAgIHkgPSB0OworICAgICAgICB9CisgICAgICAgIHggLT0geTsKKyAgICB9CisgICAgaWYgKHggPT0gMCB8fCB5ID09IDApIHJldHVybigoeCArIHkpIDw8IG5zaGlmdCk7IC8qIGdjZCBpcyBub24temVybyBvbmUgKi8KKyAgICBlbHNlIHJldHVybigobG9uZykgMSA8PCBuc2hpZnQpOyAgICAvKiBlbHNlIGdjZCBpcyAxICovCit9CisKKy8qCisgKiBleHBycCA6Oj0gTlVMTCB8IHsrLC0sfCwuLi59IHRlcm0gZXhwcnAKKyAqCisgKi8KK3N0YXRpYyBWT0lECitleHBycCgpIHsKKyAgICB3aGlsZSAod2luZGV4KCIrLXw8PiNAIixjdXJ0b2spICE9IE5VTEwpIHsKKyAgICAgICAgbG9uZyBvbGR2YWw7CisgICAgICAgIGNoYXIgb3A7CisgICAgICAgIG9wID0gY3VydG9rOworICAgICAgICBjdXJ0b2sgPSBnZXR0b2soKTsgICAgICAgICAgICAgIC8qIHNraXAgcGFzdCBvcGVyYXRvciAqLworICAgICAgICBvbGR2YWwgPSBleHB2YWw7CisgICAgICAgIHRlcm0oKTsKKyAgICAgICAgc3dpdGNoKG9wKSB7CisgICAgICAgICAgY2FzZSAnKycgOiBleHB2YWwgPSBvbGR2YWwgKyBleHB2YWw7IGJyZWFrOworICAgICAgICAgIGNhc2UgJy0nIDogZXhwdmFsID0gb2xkdmFsIC0gZXhwdmFsOyBicmVhazsKKyAgICAgICAgICBjYXNlICd8JyA6IGV4cHZhbCA9IG9sZHZhbCB8IGV4cHZhbDsgYnJlYWs7CisgICAgICAgICAgY2FzZSAnIycgOiBleHB2YWwgPSBvbGR2YWwgXiBleHB2YWw7IGJyZWFrOworICAgICAgICAgIGNhc2UgJ0AnIDogZXhwdmFsID0gZ2NkKG9sZHZhbCxleHB2YWwpOyBicmVhazsKKyAgICAgICAgICBjYXNlICc8JyA6IGV4cHZhbCA9IG9sZHZhbCA8PCBleHB2YWw7IGJyZWFrOworICAgICAgICAgIGNhc2UgJz4nIDogZXhwdmFsID0gb2xkdmFsID4+IGV4cHZhbDsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBleHByIDo6PSB0ZXJtIGV4cHJwCisgKgorICovCitzdGF0aWMgVk9JRAorZXhwcigpIHsKKyAgICB0ZXJtKCk7CisgICAgZXhwcnAoKTsKK30KKworc3RhdGljIGxvbmcKK3hwYXJzZSgpIHsKKyAgICBjdXJ0b2sgPSBnZXR0b2soKTsKKyAgICBleHByKCk7CisjaWZkZWYgQ09NTUVOVAorICAgIGlmIChjdXJ0b2sgPT0gJyQnKSB7CisgICAgICAgIGN1cnRvayA9IGdldHRvaygpOworICAgICAgICBpZiAoY3VydG9rICE9IE5VTUJFUikgeworICAgICAgICAgICAgaWYgKGNtZGx2bCA9PSAwICYmICF4X2lmbnVtKQorICAgICAgICAgICAgICBwcmludGYoIj9JbGxlZ2FsIHJhZGl4XG4iKTsKKyAgICAgICAgICAgIHhlcnJvciA9IDE7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgICAgY3VydG9rID0gZ2V0dG9rKCk7CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBpZiAoY3VydG9rICE9IE5fRU9UKSB7CisgICAgICAgIGlmIChjbWRsdmwgPT0gMCAmJiAheF9pZm51bSAmJiAheGVycm9yKQorICAgICAgICAgIHByaW50ZigiP0V4dHJhIGNoYXJhY3RlcnMgYWZ0ZXIgZXhwcmVzc2lvblxuIik7CisgICAgICAgIHhlcnJvciA9IDE7CisgICAgfQorICAgIHJldHVybihleHB2YWwpOworfQorCitjaGFyICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2lsZW50IGZyb250IGVuZCBmb3IgZXZhbGEoKSAqLworZXZhbHgocykgY2hhciAqczsgeworICAgIGNoYXIgKiBwOworICAgIGludCB0OworICAgIHQgPSB4X2lmbnVtOworICAgIHhfaWZudW0gPSAxOworICAgIHAgPSBldmFsYShzKTsKKyAgICB4X2lmbnVtID0gdDsKKyAgICByZXR1cm4ocCk7Cit9CisKK2NoYXIgKgorZXZhbGEocykgY2hhciAqczsgeworICAgIGxvbmcgdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWVyaWMgdmFsdWUgKi8KKyAgICBpZiAoIXMpIHJldHVybigiIik7CisgICAgeGVycm9yID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhcnQgb3V0IHdpdGggbm8gZXJyb3IgKi8KKyAgICBkaXZieXplcm8gPSAwOworICAgIGNwID0gczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1ha2UgdGhlIGFyZ3VtZW50IGdsb2JhbCAqLworICAgIHYgPSB4cGFyc2UoKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIHRoZSBzdHJpbmcgKi8KKyAgICByZXR1cm4oeGVycm9yID8gIiIgOiBja2x0b2EodikpOyAgICAvKiBSZXR1cm4gZW1wdHkgc3RyaW5nIG9uIGVycm9yICovCit9CisKKy8qCisgKiBzaW1wbGVzdCA6Oj0gTlVNQkVSIHwgKCBleHByICkKKyAqCisgKi8KK3N0YXRpYyBWT0lECitzaW1wbGVzdCgpIHsKKyAgICBjaGFyICogcDsKKyAgICBwID0gY3A7CisgICAgaWYgKGN1cnRvayA9PSBOVU1CRVIpCisgICAgICBleHB2YWwgPSB0b2t2YWw7CisgICAgZWxzZSBpZiAoY3VydG9rID09ICcoJykgeworICAgICAgICBjdXJ0b2sgPSBnZXR0b2soKTsgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBwYXJlbiAqLworICAgICAgICBleHByKCk7CisgICAgICAgIGlmIChjdXJ0b2sgIT0gJyknKSB7CisgICAgICAgICAgICBpZiAoY21kbHZsID09IDAgJiYgIXhfaWZudW0gJiYgIXhlcnJvcikKKyAgICAgICAgICAgICAgcHJpbnRmKCI/TWlzc2luZyByaWdodCBwYXJlbnRoZXNpc1xuIik7CisgICAgICAgICAgICB4ZXJyb3IgPSAxOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTAsIkdFVFRPSyBTSU1QTEVTVCAoKSIscCwwKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjbWRsdmwgPT0gMCAmJiAheF9pZm51bSAmJiAheGVycm9yKQorICAgICAgICAgIHByaW50ZigiP09wZXJhdG9yIHVuZXhwZWN0ZWRcbiIpOworICAgICAgICB4ZXJyb3IgPSAxOworICAgIH0KKyAgICBjdXJ0b2sgPSBnZXR0b2soKTsKK30KKworLyoKKyAqIHNpbXBsZXIgOjo9IHNpbXBsZXN0IHwgc2ltcGxlc3QgIQorICoKKyAqLworc3RhdGljIFZPSUQKK3NpbXBsZXIoKSB7CisgICAgc2ltcGxlc3QoKTsKKyAgICBpZiAoY3VydG9rID09ICchJykgeworICAgICAgICBjdXJ0b2sgPSBnZXR0b2soKTsKKyAgICAgICAgZXhwdmFsID0gZmFjdChleHB2YWwpOworICAgIH0KK30KKworLyoKKyAqIHNpbXBsZSA6Oj0gey0sfiwhfSBzaW1wbGVyIHwgc2ltcGxlcgorICoKKyAqLworCitzdGF0aWMgVk9JRAorc2ltcGxlKCkgeworICAgIGlmIChjdXJ0b2sgPT0gJy0nIHx8IGN1cnRvayA9PSAnficgfHwgY3VydG9rID09ICchJyB8fCBjdXJ0b2sgPT0gJysnKSB7CisgICAgICAgIGludCBvcCA9IGN1cnRvazsKKyAgICAgICAgY3VydG9rID0gZ2V0dG9rKCk7ICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgLSBzaWduICovCisgICAgICAgIHNpbXBsZXIoKTsgICAgICAgICAgICAgICAgICAgICAgLyogcGFyc2UgdGhlIGZhY3RvciBhZ2FpbiAqLworICAgICAgICBpZiAob3AgIT0gJysnKQorICAgICAgICAgIGV4cHZhbCA9IChvcCA9PSAnLScpID8gLWV4cHZhbCA6ICgob3AgPT0gJyEnKSA/ICFleHB2YWwgOiB+ZXhwdmFsKTsKKyAgICB9IGVsc2Ugc2ltcGxlcigpOworfQorCisvKiAgRCBDIEwgQSBSIFIgQSBZICAtLSAgRGVjbGFyZSBhbiBhcnJheSAgKi8KKy8qCisgIENhbGwgd2l0aDoKKyAgIGNoYXIgYSA9IHNpbmdsZSBjaGFyYWN0ZXIgZGVzaWduYXRvciBmb3IgdGhlIGFycmF5LCBlLmcuICJhIi4KKyAgIGludCAgbiA9IHNpemUgb2YgYXJyYXkuCisgIFJldHVybnM6CisgICAwIG9yIGdyZWF0ZXIgb24gc3VjY2VzcywgaGF2aW5nIGNyZWF0ZWQgdGhlIHJlcXVlc3RlZCBhcnJheSB3aXRoCisgICAgIHdpdGggbisxIGVsZW1lbnRzLCAwLi5uLiAgSWYgYW4gYXJyYXkgb2YgdGhlIHNhbWUgbmFtZSBleGlzdGVkCisgICAgIHByZXZpb3VzbHksIGl0IGlzIGRlc3Ryb3llZC4gIFRoZSBuZXcgYXJyYXkgaGFzIGFsbCBpdHMgZWxlbWVudHMKKyAgICAgaW5pdGlhbGl6ZWQgdG8gTlVMTCBwb2ludGVycy4KKyAgLTEgb24gZmFpbHVyZSAoYmVjYXVzZSAnYScgb3V0IG9mIHJhbmdlIG9yIG1hbGxvYyBmYWlsdXJlKS4KKyovCitpbnQKKyNpZmRlZiBDS19BTlNJQworZGNsYXJyYXkoY2hhciBhLCBpbnQgbikKKyNlbHNlCitkY2xhcnJheShhLG4pIGNoYXIgYTsgaW50IG47CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGRjbGFycmF5ICovIHsKKyAgICBjaGFyIGMsICoqcDsgaW50IGksIG4yLCByYzsKKworICAgIGlmIChhID4gNjMgJiYgYSA8IDkxKSBhICs9IDMyOyAgICAgIC8qIENvbnZlcnQgbGV0dGVycyB0byBsb3dlcmNhc2UgKi8KKyAgICBpZiAoYSA8IEFSUkFZQkFTRSB8fCBhID4gMTIyKSAgICAgICAvKiBWZXJpZnkgbmFtZSAqLworICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmIChuIDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGFyZyAqLworICAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAobisxIDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiBNQVhJTlQrMSB3cmFwcyBhcm91bmQgKi8KKyAgICAgIHJldHVybigtMSk7CisKKyAgICBjID0gYTsKKyAgICBhIC09IEFSUkFZQkFTRTsgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IG5hbWUgdG8gbnVtYmVyICovCisgICAgcmMgPSBhOworICAgIGlmICgocCA9IGFfcHRyW2FdKSAhPSBOVUxMKSB7ICAgICAgIC8qIERlbGV0ZSBvbGQgYXJyYXkgb2Ygc2FtZSBuYW1lICovCisgICAgICAgIGlmIChhX2xpbmtbYV0gPiAtMSkgeyAgICAgICAgICAgLyogSXMgaXQgYSBsaW5rPyAqLworICAgICAgICAgICAgaWYgKG4gPT0gMCkgeyAgICAgICAgICAgICAgIC8qIElmIHdlJ3JlIGp1c3QgZGVsZXRpbmcgaXQgKi8KKyAgICAgICAgICAgICAgICBhX3B0clthXSA9IChjaGFyICoqKSBOVUxMOyAvKiBjbGVhciBhbGwgdGhlIGluZm8uICovCisgICAgICAgICAgICAgICAgYV9kaW1bYV0gPSAwOworICAgICAgICAgICAgICAgIGFfbGlua1thXSA9IC0xOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgZGVsZXRpbmcgKi8KKyAgICAgICAgICAgIGEgPSBhX2xpbmtbYV07ICAgICAgICAgICAgICAvKiBTd2l0Y2ggdG8gbGlua2VkLXRvIGFycmF5ICovCisgICAgICAgIH0KKyAgICAgICAgbjIgPSBhX2RpbVthXTsgICAgICAgICAgICAgICAgICAvKiBSZWFsIGFycmF5ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbjI7IGkrKykgeyAgICAgLyogRmlyc3QgZGVsZXRlIGl0cyBlbGVtZW50cyAqLworICAgICAgICAgICAgaWYgKHBbaV0pIHsKKyAgICAgICAgICAgICAgICBmcmVlKHBbaV0pOworICAgICAgICAgICAgICAgIHBbaV0gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyZWUoKGNoYXIgKilhX3B0clthXSk7ICAgICAgICAgLyogVGhlbiB0aGUgZWxlbWVudCBsaXN0ICovCisgICAgICAgIGlmIChuID09IDApIHsgICAgICAgICAgICAgICAgICAgLyogSWYgdW5kZWNsYXJpbmcgdGhpcyBhcnJheS4uLiAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyMiAtIEFSUkFZQkFTRTsgaSsrKSB7IC8qIEFueSBsaW5rZWQgYXJyYXlzPyAqLworICAgICAgICAgICAgICAgIGlmIChpICE9IGEgJiYgYV9saW5rW2ldID09IGEpIHsgICAgIC8qIEZpbmQgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICBhX3B0cltpXSA9IChjaGFyICoqKSBOVUxMOyAgICAgIC8qIGFuZCByZW1vdmUgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICBhX2RpbVtpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGFfbGlua1tpXSA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhX3B0clthXSA9IChjaGFyICoqKSBOVUxMOyAgICAgIC8qIFJlbW92ZSBwb2ludGVyIHRvIGVsZW1lbnQgbGlzdCAqLworICAgICAgICBhX2RpbVthXSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIFNldCBkaW1lbnNpb24gYXQgemVyby4gKi8KKyAgICAgICAgYV9saW5rW2FdID0gLTE7ICAgICAgICAgICAgICAgICAvKiBVbnNldCBsaW5rIHdvcmQgKi8KKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAgICAgICAvKiBJZiBkaW1lbnNpb24gMCwganVzdCBkZWFsbG9jYXRlLiAqLworICAgIH0KKyAgICBwID0gKGNoYXIgKiopIG1hbGxvYygobisxKSAqIHNpemVvZihjaGFyICoqKSk7IC8qIEFsbG9jYXRlIGZvciBuZXcgYXJyYXkgKi8KKyAgICBpZiAocCA9PSBOVUxMKSByZXR1cm4oLTEpOyAgICAgICAgICAvKiBDaGVjayAqLworICAgIGFfcHRyW2FdID0gcDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgcG9pbnRlciB0byBtZW1iZXIgbGlzdCAqLworICAgIGFfZGltW2FdID0gbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgZGltZW5zaW9uICovCisgICAgZm9yIChpID0gMDsgaSA8PSBuOyBpKyspICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBtZW1iZXJzIHRvIG51bGwgKi8KKyAgICAgIHBbaV0gPSBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSAneicgLSBBUlJBWUJBU0U7IGkrKykgeyAvKiBBbnkgbGlua2VkIGFycmF5cz8gKi8KKyAgICAgICAgaWYgKGkgIT0gYSAmJiBhX2xpbmtbaV0gPT0gYSkgeyAvKiBGaW5kIGFuZCB1cGRhdGUgdGhlbSAqLworICAgICAgICAgICAgYV9wdHJbaV0gPSBwOworICAgICAgICAgICAgYV9kaW1baV0gPSBuOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybihyYyk7Cit9CisKKy8qICBYIEEgUiBSIEEgWSAgLS0gQ29udmVydCBhcnJheSBuYW1lIHRvIGFycmF5IGluZGV4ICAqLworCitpbnQKK3hhcnJheShzKSBjaGFyICogczsgeworICAgIGNoYXIgYnVmWzhdOworICAgIGludCB4OworICAgIGNoYXIgYzsKKworICAgIGlmICghcykgcyA9ICIiOworICAgIGRlYnVnKEYxMTAsInhhcnJheSIscywwKTsKKyAgICBpZiAoISpzKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICB4ID0gc3RybGVuKHMpOworCisgICAgYnVmWzBdID0gTlVMOworICAgIGJ1ZlsxXSA9IE5VTDsKKyAgICBidWZbMl0gPSBzWzBdOworICAgIGJ1ZlszXSA9ICh4ID4gMCkgPyBzWzFdIDogTlVMOworICAgIGJ1Zls0XSA9ICh4ID4gMSkgPyBzWzJdIDogTlVMOworICAgIGJ1Zls1XSA9ICh4ID4gMikgPyBzWzNdIDogTlVMOworICAgIGJ1Zls2XSA9IE5VTDsKKyAgICBzID0gYnVmKzI7CisgICAgaWYgKCpzID09ICcmJykgeworICAgICAgICBidWZbMV0gPSBDTURROworICAgICAgICBzLS07CisgICAgfSBlbHNlIGlmICgqcyAhPSBDTURRKSB7CisgICAgICAgIGJ1ZlswXSA9IENNRFE7CisgICAgICAgIGJ1ZlsxXSA9ICcmJzsKKyAgICAgICAgcyA9IGJ1ZjsKKyAgICB9CisgICAgYyA9ICoocysyKTsKKyAgICBpZiAoaXN1cHBlcihjKSkKKyAgICAgIGMgPSB0b2xvd2VyKGMpOworICAgIGlmIChjID09ICdAJykKKyAgICAgIGMgPSA5NjsKKyAgICB4ID0gKGludCljIC0gQVJSQVlCQVNFOworICAgIGlmICgqKHMrMykgPT0gJ1snKQorICAgICAgKihzKzMpID0gTlVMOworICAgIHJldHVybigoeCA8IDAgfHwgeCA+ICd6JyAtIEFSUkFZQkFTRSB8fCAqKHMrMykpID8gLTEgOiB4KTsKK30KKworLyogIEEgUiBSIEEgWSBCIE8gVSBOIEQgUyAgLS0gIFBhcnNlIGFycmF5IHNlZ21lbnQgbm90YXRpb24gXCZhW246bV0gICovCisKKy8qCisgIENhbGwgd2l0aCBzID0gYXJyYXkgcmVmZXJlbmNlLCBwbHVzIHR3byBwb2ludGVycyB0byBpbnRzLgorICBSZXR1cm5zIC0xIG9uIGVycm9yLCBvciBhcnJheSBpbmRleCwgd2l0aCB0aGUgdHdvIGludHMgc2V0IGFzIGZvbGxvd3M6CisgICBcJmFbXSAgICAgLTEsIC0xCisgICBcJmFbM10gICAgIDMsIC0xCisgICBcJmFbMzoxN10gIDMsIDE3CisgIFRoZSBhcnJheSBuZWVkIG5vdCBiZSBkZWNsYXJlZCAtLSB0aGlzIHJvdXRpbmUgaXMganVzdCBmb3IgcGFyc2luZy4KKyovCitpbnQKK2FycmF5Ym91bmRzKHMsbG8saGkpIGNoYXIgKiBzOyBpbnQgKiBsbywgKiBoaTsgeworICAgIGludCBpLCB4LCB5LCByYW5nZVsyXTsKKyAgICBjaGFyIGJ1ZlsyNTZdLCAqIHAsICogcTsKKyAgICBjaGFyICogdG1wID0gTlVMTDsKKworICAgICpsbyA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgYm91bmRzICovCisgICAgKmhpID0gLTE7CisKKyAgICBpZiAoIXMpIHMgPSAiIjsgICAgICAgICAgICAgICAgICAgICAvKiBEZWZlbnNlIGRlIG51bGwgYXJncyAqLworICAgIGlmICghKnMpCisgICAgICByZXR1cm4oLTEpOworCisgICAgeCA9IHhhcnJheShzKTsgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgYmFzaWMgc3RydWN0dXJlICovCisgICAgZGVidWcoRjExMSwiYXJyYXlib3VuZHMgeGFycmF5IixzLHgpOworCisgICAgaWYgKHggPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IE9LLCBmYWlsLiAqLworICAgICAgcmV0dXJuKC0xKTsKKyAgICByYW5nZVswXSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAvKiBJdCdzIE9LIC0tIGdldCBjb250ZW50cyAqLworICAgIHJhbmdlWzFdID0gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIG9mIHN1YnNjcmlwdCBicmFja2V0cyAqLworICAgIG1ha2VzdHIoJnRtcCxzKTsgICAgICAgICAgICAgICAgICAgIC8qIE1ha2UgYSBwb2tlYWJsZSBjb3B5ICovCisgICAgcyA9IHRtcDsKKyAgICBwID0gczsKKyAgICBmb3IgKHAgPSBzLCBxID0gTlVMTDsgKnA7IHArKykgeyAgICAvKiBGaXJzdCBmaW5kIHRoZSBicmFja2V0cyAqLworICAgICAgICBpZiAoKnAgPT0gJ1snKSB7CisgICAgICAgICAgICBxID0gcCsxOworICAgICAgICB9IGVsc2UgaWYgKCpwID09ICddJykKKyAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHEgJiYgKnAgPT0gJ10nKSB7ICAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBicmFja2V0cy4uLiAqLworICAgICAgICBpbnQgcXVpdG5vdyA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyICYmICFxdWl0bm93OyBpKyspIHsgLyogTG9vcCB0aHJ1IHRoZWlyIGNvbnRlbnRzICovCisgICAgICAgICAgICBmb3IgKHAgPSBxOyAqcDsgcCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChpID09IDAgJiYgKnAgPT0gJzonKSB8fCAqcCA9PSAnXScpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpwID09ICddJykKKyAgICAgICAgICAgICAgICAgICAgICBxdWl0bm93ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgKnAgPSBOVUw7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcSkgeyAgICAgICAgICAgLyogV2UgaGF2ZSBzb21ldGhpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyNTU7ICAgICAgICAvKiBFeHBhbmQgdmFyaWFibGVzLCBldGMuICovCisgICAgICAgICAgICAgICAgICAgICAgICBzID0gYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgenpzdHJpbmcocSwmcywmeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gZXZhbHgoYnVmKTsgLyogRXZhbHVhdGUgaXQgYXJpdGhtZXRpY2FsbHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKSBpZiAoKnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShidWYscywyNTYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGtudW0oYnVmKSkgeyAvKiBEaWQgd2UgZ2V0IGEgbnVtYmVyPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnRtcCxOVUxMKTsgLyogTm8sIGZhaWwuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAoaSA9PSAwKSA/IHArMSA6IE5VTEw7IC8qIFBvaW50IHRvIG5leHQgaWYgYW55ICovCisgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVtpXSA9IGF0b2koYnVmKTsgLyogU2V0IHRoaXMgb25lICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1ha2VzdHIoJnRtcCxOVUxMKTsgICAgICAgICAgICAgICAgIC8qIEZyZWUgdGVtcG9yYXJ5IHBva2VkIHN0cmluZyAqLworICAgICpsbyA9IHJhbmdlWzBdOyAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiB3aGF0IHdlIGdvdCAqLworICAgICpoaSA9IHJhbmdlWzFdOworICAgIGRlYnVnKEYxMDEsImFycmF5Ym91bmRzIGxvIiwiIiwqbG8pOworICAgIGRlYnVnKEYxMDEsImFycmF5Ym91bmRzIGhpIiwiIiwqaGkpOworICAgIHJldHVybih4KTsKK30KKworLyogIEEgUiBSIEEgWSBOIEEgTSAgLS0gIFBhcnNlIGFuIGFycmF5IG5hbWUgICovCisKKy8qCisgIENhbGwgd2l0aCBwb2ludGVyIHRvIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBhcnJheSByZWZlcmVuY2UuCisgIFN0cmluZyBtYXkgYmVnaW4gd2l0aCBlaXRoZXIgXCYgb3IganVzdCAmLgorICBPbiBzdWNjZXNzLAorICAgIFJldHVybnMgbGV0dGVyIElEIChhbHdheXMgbG93ZXJjYXNlKSBpbiBhcmd1bWVudCBjLAorICAgICAgd2hpY2ggY2FuIGFsc28gYmUgYWNjZW50IGdyYXZlIChgID0gOTY7ICdAJyBpcyBjb252ZXJ0ZWQgdG8gZ3JhdmUpOworICAgIERpbWVuc2lvbiBvciBzdWJzY3JpcHQgaW4gYXJndW1lbnQgbjsKKyAgICBJTVBPUlRBTlQ6IFRoZXNlIGFyZ3VtZW50cyBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIgYXMgYWRkcmVzc2VzCisgICAgb2YgaW50cyAobm90IGNoYXJzKSwgZm9yIGV4YW1wbGU6CisgICAgICBjaGFyICpzOyBpbnQgeCwgeTsKKyAgICAgIGFycmF5bmFtKHMsJngsJnkpOworICBPbiBmYWlsdXJlLCByZXR1cm5zIGEgbmVnYXRpdmUgbnVtYmVyLCB3aXRoIGFyZ3MgbiBhbmQgYyBzZXQgdG8gemVyby4KKyovCitpbnQKK2FycmF5bmFtKHNzLGMsbikgY2hhciAqc3M7IGludCAqYzsgaW50ICpuOyB7CisgICAgaW50IGksIHksIHBwLCBsZW47CisgICAgY2hhciB4OworICAgIGNoYXIgKnMsICpwLCAqc3gsICp2bnA7CisgICAgLyogT24gc3RhY2sgdG8gYWxsb3cgZm9yIHJlY3Vyc2l2ZSBjYWxscy4uLiAqLworICAgIGNoYXIgdm5idWZbQVJSQVlSRUZMRU4rMV07ICAgICAgICAgIC8qIEVudGlyZSBhcnJheSByZWZlcmVuY2UgKi8KKyAgICBjaGFyIHNzYnVmW0FSUkFZUkVGTEVOKzFdOyAgICAgICAgICAvKiBTdWJzY3JpcHQgaW4gInBsYWluIHRleHQiICovCisgICAgY2hhciBzeGJ1ZlsxNl07ICAgICAgICAgICAgICAgICAgICAgLyogRXZhbHVhdGVkIHN1YnNjcmlwdCAqLworCisgICAgKmMgPSAqbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSByZXR1cm4gdmFsdWVzICovCisgICAgbGVuID0gc3RybGVuKHNzKTsKKyAgICBmb3IgKHBwID0gMCxpID0gMDsgaSA8IGxlbjsgaSsrKSB7ICAgICAgICAgIC8qIENoZWNrIGxlbmd0aCAqLworICAgICAgICBpZiAoc3NbaV0gPT0gJ1snKSB7CisgICAgICAgICAgICBwcCsrOworICAgICAgICB9IGVsc2UgaWYgKHNzW2ldID09ICddJykgeworICAgICAgICAgICAgaWYgKC0tcHAgPT0gMCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPiBBUlJBWVJFRkxFTikgeworICAgICAgICBwcmludGYoIj9BcnJheSByZWZlcmVuY2UgdG9vIGxvbmcgLSAlc1xuIixzcyk7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGNrc3RybmNweSh2bmJ1ZixzcyxBUlJBWVJFRkxFTik7CisgICAgdm5wID0gdm5idWY7CisgICAgaWYgKHZuYnVmWzBdID09IENNRFEgJiYgdm5idWZbMV0gPT0gJyYnKSB2bnArKzsKKyAgICBpZiAoKnZucCAhPSAnJicpIHsKKyAgICAgICAgcHJpbnRmKCI/Tm90IGFuIGFycmF5IC0gJXNcbiIsdm5idWYpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICB4ID0gKih2bnAgKyAxKTsgICAgICAgICAgICAgICAgICAgICAvKiBGb2xkIGNhc2Ugb2YgYXJyYXkgbmFtZSAqLworCisgICAgLyogV2UgZG9uJ3QgdXNlIGlzdXBwZXIgJiB0b2xvd2VyIGhlcmUgb24gcHVycG9zZSBiZWNhdXNlIHRoZXNlICovCisgICAgLyogd291bGQgcHJvZHVjZSB1bmRlc2lyZWQgZWZmZWN0cyB3aXRoIGFjY2VudGVkIGxldHRlcnMuICovCisgICAgaWYgKHggPiA2MyAmJiB4IDwgOTEpIHggID0gKih2bnAgKyAxKSA9IChjaGFyKSAoeCArIDMyKTsKKyAgICBpZiAoKHggPCBBUlJBWUJBU0UpIHx8ICh4ID4gMTIyKSB8fCAoKih2bnArMikgIT0gJ1snKSkgeworICAgICAgICBpZiAobXNnZmxnKSB7CisgICAgICAgICAgICBwcmludGYoIj9JbnZhbGlkIGZvcm1hdCBmb3IgYXJyYXkgbmFtZSAtICVzXG4iLHZuYnVmKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHJldHVybigtMik7CisgICAgfQorICAgICpjID0geDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiB0aGUgYXJyYXkgbmFtZSAqLworICAgIHMgPSB2bnArMzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBkaW1lbnNpb24gKi8KKyAgICBwID0gc3NidWY7CisgICAgcHAgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnJhY2tldCBjb3VudGVyICovCisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZUkVGTEVOICYmICpzICE9IE5VTDsgaSsrKSB7IC8qIENvcHkgdXAgdG8gXSAqLworICAgICAgICBpZiAoKnMgPT0gJ1snKSBwcCsrOworICAgICAgICBpZiAoKnMgPT0gJ10nICYmIC0tcHAgPT0gMCkgYnJlYWs7CisgICAgICAgICpwKysgPSAqcysrOworICAgIH0KKyAgICBpZiAoKnMgIT0gJ10nKSB7CisgICAgICAgIHByaW50ZigiP05vIGNsb3NpbmcgYnJhY2tldCBvbiBhcnJheSBkaW1lbnNpb24gLSAlc1xuIix2bmJ1Zik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIHAtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyaW0gd2hpdGVzcGFjZSBmcm9tIGVuZCAqLworICAgIHdoaWxlICgqcCA9PSBTUCB8fCAqcCA9PSBIVCkKKyAgICAgIHAtLTsKKyAgICBwKys7CisgICAgKnAgPSBOVUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVybWluYXRlIHN1YnNjcmlwdCB3aXRoIG51bGwgKi8KKyAgICBwID0gc3NidWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBiZWdpbm5pbmcgb2Ygc3Vic2NyaXB0ICovCisgICAgd2hpbGUgKCpwID09IFNQIHx8ICpwID09IEhUKSAgICAgICAgLyogVHJpbSB3aGl0ZXNwYWNlIGZyb20gYmVnaW5uaW5nICovCisgICAgICBwKys7CisgICAgc3ggPSBzeGJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2hlcmUgdG8gcHV0IGV4cGFuZGVkIHN1YnNjcmlwdCAqLworICAgIHkgPSAxNjsKKyAgICB6enN0cmluZyhwLCZzeCwmeSk7ICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHZhcmlhYmxlcywgZXRjLiAqLworICAgIHN4ID0gc3hidWY7CisgICAgd2hpbGUgKCpzeCA9PSBTUCkgc3grKzsKKyAgICBkZWJ1ZyhGMTEwLCJhcnJheW5hbSBzeCIsIiIsc3gpOworICAgIGlmICghKnN4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVtcHR5IGJyYWNrZXRzLi4uICovCisgICAgICAgICpuID0gLTE3OyAgICAgICAgICAgICAgICAgICAgICAgLyogKFNlY3JldCBjb2RlIDotKSAqLworICAgICAgICByZXR1cm4oLTIpOworICAgIH0KKyAgICBwID0gZXZhbGEoc3gpOyAgICAgICAgICAgICAgICAgICAgICAvKiBSdW4gaXQgdGhydSBcZm5ldmFsKCkuLi4gKi8KKyAgICBpZiAocCkgaWYgKCpwKSBja3N0cm5jcHkoc3hidWYscCwxNik7IC8qIFdlIGtub3cgaXQgaGFzIHRvIGJlIGEgbnVtYmVyLiAqLworCisgICAgaWYgKCFjaGtudW0oc3hidWYpKSB7ICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIGl0J3MgYWxsIGRpZ2l0cyAqLworICAgICAgICBpZiAobXNnZmxnKSB7CisgICAgICAgICAgICBwcmludGYoIj9BcnJheSBkaW1lbnNpb24gb3Igc3Vic2NyaXB0IG1pc3Npbmcgb3Igbm90IG51bWVyaWNcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9CisgICAgaWYgKCh5ID0gYXRvaShzeGJ1ZikpIDwgMCkgeworICAgICAgICBpZiAoY21mbGdzID09IDApIHByaW50ZigiXG4iKTsKKyAgICAgICAgaWYgKG1zZ2ZsZykgeworICAgICAgICAgICAgcHJpbnRmKCI/QXJyYXkgZGltZW5zaW9uIG9yIHN1YnNjcmlwdCBub3QgcG9zaXRpdmUgb3IgemVyb1xuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICByZXR1cm4oLTIpOworICAgIH0KKyAgICAqbiA9IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdGhlIHN1YnNjcmlwdCBvciBkaW1lbnNpb24gKi8KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorY2hrYXJyYXkoYSxpKSBpbnQgYSwgaTsgeyAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIGFycmF5IGlzIGRlY2xhcmVkICovCisgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIGlmIHN1YnNjcmlwdCBpcyBpbiByYW5nZSAqLworICAgIGlmIChhID09IDY0KSBhID0gOTY7ICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgYXRzaWduIHRvIGdyYXZlIGFjY2VudCAqLworICAgIHggPSBhIC0gQVJSQVlCQVNFOyAgICAgICAgICAgICAgICAgIC8qIFZhbHVlcyBtdXN0IGJlIGluIHJhbmdlIDk1LTEyMiAqLworI2lmZGVmIENPTU1FTlQKKyAgICBpZiAoeCA9PSAwICYmIG1hY2x2bCA8IDApICAgICAgICAgICAvKiBNYWNybyBhcmcgdmVjdG9yIGJ1dCBubyBtYWNybyAqLworICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBpZiAoeCA8IDAgfHwgeCA+ICd6JyAtIEFSUkFZQkFTRSkgICAvKiBOb3QgaW4gcmFuZ2UgKi8KKyAgICAgIHJldHVybigtMik7CisgICAgaWYgKGFfcHRyW3hdID09IE5VTEwpIHJldHVybigtMSk7ICAgLyogTm90IGRlY2xhcmVkICovCisgICAgaWYgKGkgPiBhX2RpbVt4XSkgcmV0dXJuKC0yKTsgICAgICAgLyogRGVjbGFyZWQgYnV0IG91dCBvZiByYW5nZS4gKi8KKyAgICByZXR1cm4oYV9kaW1beF0pOyAgICAgICAgICAgICAgICAgICAvKiBBbGwgb2ssIHJldHVybiBkaW1lbnNpb24gKi8KK30KKworI2lmZGVmIENPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXNuJ3QgdXNlZC4gKi8KK2NoYXIgKgorYXJyYXl2YWwoYSxpKSBpbnQgYSwgaTsgeyAgICAgICAgICAgICAgIC8qIFJldHVybiB2YWx1ZSBvZiBcJmFbaV0gKi8KKyAgICBpbnQgeDsgY2hhciAqKnA7ICAgICAgICAgICAgICAgICAgICAvKiAocG9zc2libHkgTlVMTCkgKi8KKyAgICBpZiAoYSA9PSA2NCkgYSA9IDk2OyAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IGF0c2lnbiB0byBncmF2ZSBhY2NlbnQgKi8KKyAgICB4ID0gYSAtIEFSUkFZQkFTRTsgICAgICAgICAgICAgICAgICAvKiBWYWx1ZXMgbXVzdCBiZSBpbiByYW5nZSA5NS0xMjIgKi8KKyAgICBpZiAoeCA8IDAgfHwgeCA+IDI3KSByZXR1cm4oTlVMTCk7ICAvKiBOb3QgaW4gcmFuZ2UgKi8KKyAgICBpZiAoKHggPiAwKSAmJiAocCA9IGFfcHRyW3hdKSA9PSBOVUxMKSAvKiBBcnJheSBub3QgZGVjbGFyZWQgKi8KKyAgICAgIHJldHVybihOVUxMKTsKKyAgICBpZiAoaSA+IGFfZGltW3hdKSAgICAgICAgICAgICAgICAgICAvKiBTdWJzY3JpcHQgb3V0IG9mIHJhbmdlLiAqLworICAgICAgcmV0dXJuKE5VTEwpOworICAgIHJldHVybihwW2ldKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBvaywgcmV0dXJuIHBvaW50ZXIgdG8gdmFsdWUuICovCit9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisvKgorICBwdXNoYXJyYXkoKSBpcyBjYWxsZWQgd2hlbiBhbiBhcnJheSBuYW1lIGlzIGluY2x1ZGVkIGluIGEgTE9DQUwgc3RhdGVtZW50LgorICBJdCBtb3ZlcyB0aGUgcG9pbnRlcnMgZnJvbSB0aGUgZ2xvYmFsIGRlZmluaXRpb24gdG8gdGhlIHN0YWNrLCBhbmQgcmVtb3ZlcworICB0aGUgZ2xvYmFsIGRlZmluaXRpb24uICBMYXRlciwgaWYgdGhlIHNhbWUgYXJyYXkgaXMgZGVjbGFyZWQgaW4gdGhlIGxvY2FsCisgIGNvbnRleHQsIGl0IG9jY3VwaWVzIHRoZSBnbG9iYWwgZGVmaW5pdGlvbiBpbiB0aGUgbm9ybWFsIHdheS4gIEJ1dCB3aGVuCisgIHBvcGNsdmwoKSBpcyBjYWxsZWQsIGl0IHJlcGxhY2VzIHRoZSBnbG9iYWwgZGVmaW5pdGlvbiB3aXRoIHRoZSBvbmUgc2F2ZWQKKyAgaGVyZS4gIFRoZSAic2VjcmV0IGNvZGUiIGlzIHVzZWQgdG8gaW5kaWNhdGUgdG8gcG9wY2x2KCkgdGhhdCBpdCBzaG91bGQKKyAgcmVtb3ZlIHRoZSBnbG9iYWwgYXJyYXkgd2hlbiBwb3BwaW5nIHRocm91Z2ggdGhpcyBsZXZlbCAtLSBvdGhlcndpc2UgaWYgYQorICBsb2NhbCBhcnJheSB3ZXJlIGRlY2xhcmVkIHRoYXQgaGFkIG5vIGNvdW50ZXJwYXJ0IGF0IGFueSBoaWdoZXIgbGV2ZWwsIGl0CisgIHdvdWxkIG5ldmVyIGJlIGRlbGV0ZWQuICBUaGlzIGFsbG93cyBBbGdvbC1saWtlIGluaGVyaXRhbmNlIHRvIHdvcmsgYm90aAorICBvbiB0aGUgd2F5IGRvd24gYW5kIG9uIHRoZSB3YXkgYmFjayB1cC4KKyovCitpbnQKK3B1c2hhcnJheSh4LHopIGludCB4LCB6OyB7CisgICAgaW50IHk7CisgICAgZGVidWcoRjAwMCwicHVzaGFycmF5IHgiLCIiLHgpOworICAgIGRlYnVnKEYxMDEsInB1c2hhcnJheSB6IiwiIix6KTsKKyAgICB5ID0gY2hrYXJyYXkoeCx6KTsKKyAgICBkZWJ1ZyhGMTAxLCJwdXNoYXJyYXkgeSIsIiIseSk7CisgICAgeCAtPSBBUlJBWUJBU0U7ICAgICAgICAgICAgICAgICAgICAgLyogQ29udmVydCBuYW1lIGxldHRlciB0byBpbmRleC4gKi8KKyAgICBpZiAoeCA8IDAgfHwgeCA+IDI3KQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgYWFfcHRyW2NtZGx2bF1beF0gPSAoY2hhciAqKikgTlVMTDsKKyAgICAgICAgYWFfZGltW2NtZGx2bF1beF0gPSAtMjM7ICAgICAgICAvKiBTZWNyZXQgY29kZSAoc2VlIHBvcGNsdmwoKSkgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBhYV9wdHJbY21kbHZsXVt4XSA9IGFfcHRyW3hdOworICAgICAgICBhYV9kaW1bY21kbHZsXVt4XSA9IHk7CisgICAgfQorICAgIGFfcHRyW3hdID0gKGNoYXIgKiopIE5VTEw7CisgICAgYV9kaW1beF0gPSAwOworICAgIHJldHVybigwKTsKK30KKworLyogIFAgQSBSIFMgRSBWIEEgUiAgLS0gIFBhcnNlIGEgdmFyaWFibGUgbmFtZSBvciBhcnJheSByZWZlcmVuY2UuICAqLworLyoKKyBDYWxsIHdpdGg6CisgICBzICA9IHBvaW50ZXIgdG8gY2FuZGlkYXRlIHZhcmlhYmxlIG5hbWUgb3IgYXJyYXkgcmVmZXJlbmNlLgorICAgKmMgPSBhZGRyZXNzIG9mIGludGVnZXIgaW4gd2hpY2ggdG8gcmV0dXJuIHZhcmlhYmxlIElELgorICAgKmkgPSBhZGRyZXNzIG9mIGludGVnZXIgaW4gd2hpY2ggdG8gcmV0dXJuIGFycmF5IHN1YnNjcmlwdC4KKyBSZXR1cm5zOgorICAgLTI6ICBzeW50YXggZXJyb3IgaW4gdmFyaWFibGUgbmFtZSBvciBhcnJheSByZWZlcmVuY2UuCisgICAgMTogIHN1Y2Nlc3NmdWwgcGFyc2Ugb2YgYSBzaW1wbGUgdmFyaWFibGUsIHdpdGggSUQgaW4gYy4KKyAgICAyOiAgc3VjY2Vzc2Z1bCBwYXJzZSBvZiBhbiBhcnJheSByZWZlcmVuY2UsIHcvSUQgaW4gYyBhbmQgc3Vic2NyaXB0IGluIGkuCisqLworaW50CitwYXJzZXZhcihzLGMsaSkgY2hhciAqczsgaW50ICpjLCAqaTsgeworICAgIGNoYXIgKnA7CisgICAgaW50IHgseSx6OworCisgICAgcCA9IHM7CisgICAgaWYgKCpzID09IENNRFEpIHMrKzsgICAgICAgICAgICAgICAgLyogUG9pbnQgYWZ0ZXIgYmFja3NsYXNoICovCisKKyAgICBpZiAoKnMgIT0gJyUnICYmICpzICE9ICcmJykgeyAgICAgICAvKiBNYWtlIHN1cmUgaXQncyAlIG9yICYgKi8KKyAgICAgICAgcHJpbnRmKCI/Tm90IGEgdmFyaWFibGUgbmFtZSAtICVzXG4iLHApOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAoKGludClzdHJsZW4ocykgPCAyKSB7CisgICAgICAgIHByaW50ZigiP0luY29tcGxldGUgdmFyaWFibGUgbmFtZSAtICVzXG4iLHApOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAoKnMgPT0gJyUnICYmICoocysyKSAhPSAnXDAnKSB7CisgICAgICAgIHByaW50ZigiP09ubHkgb25lIGNoYXJhY3RlciBhZnRlciAnJSUnIGluIHZhcmlhYmxlIG5hbWUsIHBsZWFzZVxuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGlmICgqcyA9PSAnJicgJiYgKihzKzIpICE9ICdbJykgeworICAgICAgICBwcmludGYoIj9BcnJheSBzdWJzY3JpcHQgZXhwZWN0ZWQgLSAlc1xuIixwKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKCpzID09ICclJykgeyAgICAgICAgICAgICAgICAgICAgLyogU2ltcGxlIHZhcmlhYmxlLiAqLworICAgICAgICB5ID0gKihzKzEpOyAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB2YXJpYWJsZSBJRCBsZXR0ZXIvY2hhciAqLworICAgICAgICBpZiAoaXN1cHBlcih5KSkgeSAtPSAoJ2EnLSdBJyk7IC8qIENvbnZlcnQgdXBwZXIgdG8gbG93ZXIgY2FzZSAqLworICAgICAgICAqYyA9IHk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgcmV0dXJuIHZhbHVlcy4gKi8KKyAgICAgICAgKmkgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBhcnJheSBzdWJzY3JpcHQuICovCisgICAgICAgIHJldHVybigxKTsgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIDEgPSBzaW1wbGUgdmFyaWFibGUgKi8KKyAgICB9CisgICAgaWYgKCpzID09ICcmJykgeyAgICAgICAgICAgICAgICAgICAgLyogQXJyYXkgcmVmZXJlbmNlLiAqLworICAgICAgICB5ID0gYXJyYXluYW0ocywmeCwmeik7ICAgICAgICAgIC8qIEdvIHBhcnNlIGl0LiAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJwYXJzZXZhciBhcnJheW5hbSIsIiIseSk7CisgICAgICAgIGlmICgoeSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoeSA9PSAtMikKKyAgICAgICAgICAgICAgcmV0dXJuKHB1c2hhcnJheSh4LHopKTsKKyAgICAgICAgICAgIGlmICh5ICE9IC05KQorICAgICAgICAgICAgICBwcmludGYoIj9JbnZhbGlkIGFycmF5IHJlZmVyZW5jZSAtICVzXG4iLHApOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hrYXJyYXkoeCx6KSA8IDApIHsgICAgICAgIC8qIENoZWNrIGlmIGRlY2xhcmVkLCBldGMuICovCisgICAgICAgICAgICBwcmludGYoIj9BcnJheSBub3QgZGVjbGFyZWQgb3Igc3Vic2NyaXB0IG91dCBvZiByYW5nZVxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgICpjID0geDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGFycmF5IGxldHRlciAqLworICAgICAgICAqaSA9IHo7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBzdWJzY3JpcHQuICovCisgICAgICAgIHJldHVybigyKTsKKyAgICB9CisgICAgcmV0dXJuKC0yKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm9uZSBvZiB0aGUgYWJvdmUuICovCit9CisKKworI2RlZmluZSBWQUxOIDMyCisKKy8qIEdldCB0aGUgbnVtZXJpYyB2YWx1ZSBvZiBhIHZhcmlhYmxlICovCisvKgorICBDYWxsIHdpdGggcG9pbnRlciB0byB2YXJpYWJsZSBuYW1lLCBwb2ludGVyIHRvIGludCBmb3IgcmV0dXJuIHZhbHVlLgorICBSZXR1cm5zOgorICAgIDAgb24gc3VjY2VzcyB3aXRoIHNlY29uZCBhcmcgY29udGFpbmluZyB0aGUgdmFsdWUuCisgICAtMSBvbiBmYWlsdXJlIChiYWQgdmFyaWFibGUgc3ludGF4LCB2YXJpYWJsZSBub3QgZGVmaW5lZCBvciBub3QgbnVtZXJpYykuCisqLworaW50Cit2YXJ2YWwocyx2KSBjaGFyICpzOyBpbnQgKnY7IHsKKyAgICBjaGFyIHZhbGJ1ZltWQUxOKzFdOyAgICAgICAgICAgICAgICAvKiBzIGlzIHBvaW50ZXIgdG8gdmFyaWFibGUgbmFtZSAqLworICAgIGNoYXIgbmFtZVsyNTZdOworICAgIGNoYXIgKnA7CisgICAgaW50IHk7CisKKyAgICBpZiAoKnMgIT0gQ01EUSkgeyAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgbWFjcm8gbmFtZXMgdG9vICovCisgICAgICAgIGNrbWFrbXNnKG5hbWUsMjU2LCJcXG0oIixzLCIpIixOVUxMKTsKKyAgICAgICAgcyA9IG5hbWU7CisgICAgfQorICAgIHAgPSB2YWxidWY7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4cGFuZCB2YXJpYWJsZSBpbnRvIHZhbGJ1Zi4gKi8KKyAgICB5ID0gVkFMTjsKKyAgICBpZiAoenpzdHJpbmcocywmcCwmeSkgPCAwKSByZXR1cm4oLTEpOworICAgIHAgPSB2YWxidWY7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB2YWx1ZSBpcyBudW1lcmljICAqLworICAgIGlmICghKnApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJlIG5pY2UgLS0gbGV0IGFuIHVuZGVmaW5lZCAqLworICAgICAgICB2YWxidWZbMF0gPSAnMCc7ICAgICAgICAgICAgICAgIC8qIHZhcmlhYmxlIGJlIHRyZWF0ZWQgYXMgMC4gICAqLworICAgICAgICB2YWxidWZbMV0gPSBOVUw7CisgICAgfQorICAgIGlmIChjaGtudW0ocCkpIHsgICAgICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgbnVtZXJpYyBzdHJpbmcgdG8gaW50ICovCisgICAgICAgICp2ID0gYXRvaShwKTsgICAgICAgICAgICAgICAgICAgLyogT0sgKi8KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgT0sgKi8KKyAgICAgICAgcCA9IGV2YWxhKHApOyAgICAgICAgICAgICAgICAgICAvKiBNYXliZSBpdCdzIGFuIGV4cHJlc3Npb24gKi8KKyAgICAgICAgaWYgKCFjaGtudW0ocCkpICAgICAgICAgICAgICAgICAvKiBEaWQgaXQgZXZhbHVhdGU/ICovCisgICAgICAgICAgcmV0dXJuKC0xKTsgICAgICAgICAgICAgICAgICAgLyogTm8sIGZhaWx1cmUuICovCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWWVzLCAqLworICAgICAgICAgICp2ID0gYXRvaShwKTsgICAgICAgICAgICAgICAgIC8qIHN1Y2Nlc3MgKi8KKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisvKiBJbmNyZW1lbnQgb3IgZGVjcmVtZW50IGEgdmFyaWFibGUgKi8KKy8qIFJldHVybnMgLTEgb24gZmFpbHVyZSwgMCBvbiBzdWNjZXNzICovCisKK2ludAoraW5jdmFyKHMseCx6KSBjaGFyICpzOyBpbnQgeDsgaW50IHo7IHsgIC8qIEluY3JlbWVudCBhIG51bWVyaWMgdmFyaWFibGUgKi8KKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzIGlzIHBvaW50ZXIgdG8gdmFyaWFibGUgbmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHggaXMgYW1vdW50IHRvIGluY3JlbWVudCBieSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHogIT0gMCBtZWFucyBhZGQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB6ID0gMCBtZWFucyBzdWJ0cmFjdCAqLworICAgIGlmICh2YXJ2YWwocywmbikgPCAwKSAgICAgICAgICAgICAgIC8qIENvbnZlcnQgbnVtZXJpYyBzdHJpbmcgdG8gaW50ICovCisgICAgICByZXR1cm4oLTEpOworICAgIGlmICh6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBpdCBieSB0aGUgZ2l2ZW4gYW1vdW50ICovCisgICAgICBuICs9IHg7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3IgZGVjcmVtZW50IGFzIHJlcXVlc3RlZC4gKi8KKyAgICAgIG4gLT0geDsKKyAgICBhZGRtYWMocyxja2l0b2EobikpOyAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIG9sZCB2YXJpYWJsZSAqLworICAgIHJldHVybigwKTsKK30KKworLyogRCBPIEQgTyAgLS0gIERvIGEgbWFjcm8gKi8KKworLyoKKyAgQ2FsbCB3aXRoIHggPSBtYWNybyB0YWJsZSBpbmRleCwgcyA9IHBvaW50ZXIgdG8gYXJndW1lbnRzLgorICBSZXR1cm5zIDAgb24gZmFpbHVyZSwgMSBvbiBzdWNjZXNzLgorKi8KKworaW50Citkb2RvKHgscyxmbGFncykgaW50IHg7IGNoYXIgKnM7IGludCBmbGFnczsgeworICAgIGludCB5OworICAgIGV4dGVybiBpbnQgdHJhX2FzZywgdHJhX2NtZDsgaW50IHRyYV90bXA7CisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IHRlcm1faW87CisgICAgaW50IHRlcm1faW9fc2F2ID0gdGVybV9pbzsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyAgICBpZiAoeCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCBjYW4gaGFwcGVuISAqLworICAgICAgcmV0dXJuKC0xKTsKKworICAgIHRyYV90bXAgPSB0cmFfYXNnOworCisgICAgaWYgKCsrbWFjbHZsID49IE1BQ0xFVkVMKSB7ICAgICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgc3RvcmFnZSAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJkb2RvIG1hY2x2bCB0b28gZGVlcCIsIiIsbWFjbHZsKTsKKyAgICAgICAgLS1tYWNsdmw7CisgICAgICAgIHByaW50ZigiTWFjcm9zIG5lc3RlZCB0b28gZGVlcGx5XG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBtYWNwW21hY2x2bF0gPSBtYWN0YWJbeF0ubXZhbDsgICAgICAvKiBQb2ludCB0byB0aGUgbWFjcm8gYm9keSAqLworICAgIG1hY3hbbWFjbHZsXSA9IG1hY3RhYlt4XS5tdmFsOyAgICAgIC8qIFJlbWVtYmVyIHdoZXJlIHRoZSBiZWdpbm5pbmcgaXMgKi8KKworI2lmZGVmIENPTU1FTlQKKyAgICBtYWtlc3RyKCYobV9saW5lW21hY2x2bF0pLHMpOyAgICAgICAvKiBFbnRpcmUgYXJnIHN0cmluZyBmb3IgIlwlKiIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICBjbWRsdmwrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbnRlcmluZyBhIG5ldyBjb21tYW5kIGxldmVsICovCisgICAgaWYgKGNtZGx2bCA+PSBDTURTVEtMKSB7ICAgICAgICAgICAgLyogVG9vIG1hbnkgbWFjcm9zICsgVEFLRSBmaWxlcz8gKi8KKyAgICAgICAgZGVidWcoRjEwMSwiZG9kbyBjbWRsdmwgdG9vIGRlZXAiLCIiLGNtZGx2bCk7CisgICAgICAgIGNtZGx2bC0tOworICAgICAgICBwcmludGYoIj9UQUtFIGZpbGVzIGFuZCBETyBjb21tYW5kcyBuZXN0ZWQgdG9vIGRlZXBseVxuIik7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisgICAgICAgIGRlYnVnKEYxMTEsIkNNRCArTSIsbWFjdGFiW3hdLmt3ZCxjbWRsdmwpOworICAgICAgICBkZWJ1ZyhGMDEwLCJDTUQgLT4iLHMsMCk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyNpZmRlZiBWTVMKKyAgICBjb25yZXMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTbyBDdHJsLUMsIGV0Yywgd2lsbCB3b3JrLiAqLworI2VuZGlmIC8qIFZNUyAqLworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgdGVybV9pbyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSB0ZXJtaW5hbCBlbXVsYXRvciBJL08gKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgaWZjbWRbY21kbHZsXSA9IDA7CisgICAgaWZ0ZXN0W2NtZGx2bF0gPSAwOworICAgIGNvdW50W2NtZGx2bF0gPSBjb3VudFtjbWRsdmwtMV07ICAgIC8qIEluaGVyaXQgQ09VTlQgZnJvbSBwcmV2aW91cyBsZXZlbCAqLworICAgIGludGltZVtjbWRsdmxdID0gaW50aW1lW2NtZGx2bC0xXTsgIC8qIEluaGVyaXQgcHJldmlvdXMgSU5QVVQgVElNRU9VVCAqLworICAgIGlucGNhc1tjbWRsdmxdID0gaW5wY2FzW2NtZGx2bC0xXTsgIC8qICAgYW5kIElOUFVUIENBU0UgKi8KKyAgICB0YWtlcnJbY21kbHZsXSA9IHRha2VycltjbWRsdmwtMV07ICAvKiAgIGFuZCBUQUtFIEVSUk9SICovCisgICAgbWVycm9yW2NtZGx2bF0gPSBtZXJyb3JbY21kbHZsLTFdOyAgLyogICBhbmQgTUFDUk8gRVJST1IgKi8KKyAgICB4cXVpZXRbY21kbHZsXSA9IHF1aWV0OworICAgIHhjbWRzcmMgPSBDTURfTUQ7CisgICAgY21kc3RrW2NtZGx2bF0uc3JjID0gQ01EX01EOyAgICAgICAgLyogU2F5IHdlJ3JlIGluIGEgbWFjcm8gKi8KKyAgICBjbWRzdGtbY21kbHZsXS5sdmwgPSBtYWNsdmw7ICAgICAgICAvKiBhbmQgcmVtZW1iZXIgdGhlIG1hY3JvIGxldmVsICovCisgICAgY21kc3RrW2NtZGx2bF0uY2NmbGdzID0gZmxhZ3MgJiB+Q0ZfSU1BQzsgLyogU2V0IGZsYWdzICovCisKKyAgICAvKiBJbml0aWFsaXplIHJldHVybiB2YWx1ZSBleGNlcHQgaW4gRk9SLCBXSElMRSwgSUYsIGFuZCBTV0lUQ0ggbWFjcm9zICovCisKKyAgICBpZiAoIShmbGFncyAmIENGX0lNQUMpICYmIG1ydmFsW21hY2x2bF0pIHsKKyAgICAgICAgZnJlZShtcnZhbFttYWNsdmxdKTsKKyAgICAgICAgbXJ2YWxbbWFjbHZsXSA9IE5VTEw7CisgICAgfQorCisgICAgLyogQ2xlYXIgb2xkICUwLi4lOSBhcmd1bWVudHMgKi8KKworICAgIGFkZG1hYygiJTAiLG1hY3RhYlt4XS5rd2QpOyAgICAgICAgIC8qIERlZmluZSAlMCA9IG5hbWUgb2YgbWFjcm8gKi8KKyAgICBtYWtlc3RyKCYobV94YXJnW21hY2x2bF1bMF0pLG1hY3RhYlt4XS5rd2QpOworICAgIHZhcm5hbVswXSA9ICclJzsKKyAgICB2YXJuYW1bMl0gPSAnXDAnOworICAgIHRyYV9hc2cgPSAwOworICAgIGZvciAoeSA9IDE7IHkgPCAxMDsgeSsrKSB7ICAgICAgICAgIC8qIENsZWFyIGFyZ3MgJTEuLiU5ICovCisgICAgICAgIGlmIChtX2FyZ1ttYWNsdmxdW3ldKSB7ICAgICAgICAgLyogRG9uJ3QgY2FsbCBkZWxtYWMoKSB1bmxlc3MgKi8KKyAgICAgICAgICAgIHZhcm5hbVsxXSA9IChjaGFyKSAoeSArICcwJyk7IC8qIHdlIGhhdmUgdG8uLi4gKi8KKyAgICAgICAgICAgIGRlbG1hYyh2YXJuYW0sMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdHJhX2FzZyA9IHRyYV90bXA7CisKKy8qIEFzc2lnbiB0aGUgbmV3IGFyZ3Mgb25lIHdvcmQgcGVyIGFyZywgYWxsb3dpbmcgYnJhY2VzIHRvIGdyb3VwIHdvcmRzICovCisKKyAgICB4d29yZHMocyxNQVhBUkdMSVNULE5VTEwsMCk7CisKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgIHRlcm1faW8gPSB0ZXJtX2lvX3NhdjsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgaWYgKHRyYV9jbWQpCisgICAgICBwcmludGYoIlslZF0gK006IFwiJXNcIlxuIixjbWRsdmwsbWFjdGFiW3hdLmt3ZCk7CisgICAgcmV0dXJuKDEpOworfQorCisvKiBJbnNlcnQgImxpdGVyYWwiIHF1b3RlIGFyb3VuZCBlYWNoIGNvbW1hLXNlcGFyYXRlZCBjb21tYW5kIHRvIHByZXZlbnQgKi8KKy8qIGl0cyBwcmVtYXR1cmUgZXhwYW5zaW9uLiAgT25seSBkbyB0aGlzIGlmIG9iamVjdCBjb21tYW5kIGlzIHN1cnJvdW5kZWQgKi8KKy8qIGJ5IGJyYWNlcy4gKi8KKworc3RhdGljIGNoYXIqIGZsaXQgPSAiXFxmbGl0KCI7CisKK2ludAorbGl0Y21kKHNyYyxkZXN0LG4pIGNoYXIgKipzcmMsICoqZGVzdDsgaW50IG47IHsKKyAgICBpbnQgYmMgPSAwLCBwcCA9IDA7CisgICAgY2hhciBjLCAqcywgKmxwLCAqc3M7CisKKyAgICBzID0gKnNyYzsKKyAgICBscCA9ICpkZXN0OworCisgICAgZGVidWcoRjAxMCwibGl0Y21kIixzLDApOworCisgICAgd2hpbGUgKCpzID09IFNQKSBzKys7ICAgICAgICAgICAgICAgLyogU3RyaXAgZXh0cmEgbGVhZGluZyBzcGFjZXMgKi8KKworICAgIGlmICgqcyA9PSAneycpIHsgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0cyB3aXRoIGJyYWNlICovCisgICAgICAgIHBwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFyZW4gY291bnRlciAqLworICAgICAgICBiYyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IGxlYWRpbmcgYnJhY2UgKi8KKyAgICAgICAgKmxwKysgPSAqcysrOyAgICAgICAgICAgICAgICAgICAvKiBDb3B5IGl0ICovCisgICAgICAgIGlmICgtLW4gPCAxKSByZXR1cm4oLTEpOyAgICAgICAgLyogQ2hlY2sgc3BhY2UgKi8KKyAgICAgICAgd2hpbGUgKCpzID09IFNQKSBzKys7ICAgICAgICAgICAvKiBTdHJpcCBpbnRlcmlvciBsZWFkaW5nIHNwYWNlcyAqLworICAgICAgICBzcyA9IGZsaXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvICJcZmxpdCgiICovCisgICAgICAgIHdoaWxlICgoKmxwKysgPSAqc3MrKykpICAgICAgICAgLyogQ29weSBpdCAqLworICAgICAgICAgIGlmICgtLW4gPCAxKSAgICAgICAgICAgICAgICAgIC8qIGFuZCBjaGVjayBzcGFjZSAqLworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgbHAtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrIHVwIG92ZXIgbnVsbCAqLworCisgICAgICAgIHdoaWxlICgqcykgeyAgICAgICAgICAgICAgICAgICAgLyogR28gdGhydSByZXN0IG9mIHRleHQgKi8KKyAgICAgICAgICAgIGMgPSAqczsKKyAgICAgICAgICAgIGlmIChjID09ICd7JykgYmMrKzsgICAgICAgICAvKiBDb3VudCBicmFja2V0cyAqLworICAgICAgICAgICAgaWYgKGMgPT0gJygnKSBwcCsrOyAgICAgICAgIC8qIGFuZCBwYXJlbnMgKi8KKyAgICAgICAgICAgIGlmIChjID09ICcpJykgeyAgICAgICAgICAgICAvKiBSaWdodCBwYXJlbnRoZXNpcy4gKi8KKyAgICAgICAgICAgICAgICBwcC0tOyAgICAgICAgICAgICAgICAgICAvKiBDb3VudCBpdC4gKi8KKyAgICAgICAgICAgICAgICBpZiAocHAgPCAwKSB7ICAgICAgICAgICAvKiBBbiB1bmJhbGFuY2VkIHJpZ2h0IHBhcmVuLi4uICovCisjaWZkZWYgQ09NTUVOVAorLyoKKyAgVGhlIHByb2JsZW0gaGVyZSBpcyB0aGF0ICJceyIgYXBwZWFycyB0byBiZSBhIHF1b3RlZCBicmFjZSBhbmQgdGhlcmVmb3JlCisgIGlzbid0IGNvdW50ZWQ7IHRoZW4gdGhlICJ9IiBtYXRjaGVzIGFuIGVhcmxpZXIgb3BlbmluZyBicmFjZSwgY2F1c2luZworICAoZS5nLikgdHJ1bmNhdGlvbiBvZiBtYWNyb3MgYnkgZ2V0bmNtKCkuCisqLworICAgICAgICAgICAgICAgICAgICBpZiAobiA8IDUpICAgICAgICAgIC8qIE91dCBvZiBzcGFjZSBpbiBkZXN0IGJ1ZmZlcj8gKi8KKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTEpOyAgICAgICAvKiBJZiBzbywgZ2l2ZSB1cC4gKi8KKyAgICAgICAgICAgICAgICAgICAgKmxwKysgPSBDTURROyAgICAgICAvKiBNdXN0IGJlIHF1b3RlZCB0byBwcmV2ZW50ICovCisgICAgICAgICAgICAgICAgICAgICpscCsrID0gJ30nOyAgICAgICAgLyogcHJlbWF0dXJlIHRlcm1pbmF0aW9uIG9mICovCisgICAgICAgICAgICAgICAgICAgICpscCsrID0gJzQnOyAgICAgICAgLyogXGZsaXQoLi4uKSAqLworICAgICAgICAgICAgICAgICAgICAqbHArKyA9ICcxJzsKKyAgICAgICAgICAgICAgICAgICAgKmxwKysgPSAnfSc7CisgICAgICAgICAgICAgICAgICAgIG4gLT0gNTsKKyNlbHNlCisvKiBIZXJlIHdlIHJlbHkgb24gdGhlIGZhY3QgdGhlIFxubm4gbmV2ZXIgdGFrZXMgbW9yZSB0aGFuIDMgZGlnaXRzICovCisgICAgICAgICAgICAgICAgICAgIGlmIChuIDwgNCkgICAgICAgICAgLyogT3V0IG9mIHNwYWNlIGluIGRlc3QgYnVmZmVyPyAqLworICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7ICAgICAgIC8qIElmIHNvLCBnaXZlIHVwLiAqLworICAgICAgICAgICAgICAgICAgICAqbHArKyA9IENNRFE7ICAgICAgIC8qIE11c3QgYmUgcXVvdGVkIHRvIHByZXZlbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgKmxwKysgPSAnMCc7ICAgICAgICAvKiBwcmVtYXR1cmUgdGVybWluYXRpb24gb2YgKi8KKyAgICAgICAgICAgICAgICAgICAgKmxwKysgPSAnNCc7ICAgICAgICAvKiBcZmxpdCguLi4pICovCisgICAgICAgICAgICAgICAgICAgICpscCsrID0gJzEnOworICAgICAgICAgICAgICAgICAgICBuIC09IDQ7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgICBwcCsrOyAgICAgICAgICAgICAgIC8qIFVuY291bnQgaXQuICovCisgICAgICAgICAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gJ30nKSB7ICAgICAgICAgICAgIC8qIENsb3NpbmcgYnJhY2UuICovCisgICAgICAgICAgICAgICAgaWYgKC0tYmMgPT0gMCkgeyAgICAgICAgLyogRmluYWwgb25lPyAqLworICAgICAgICAgICAgICAgICAgICAqbHArKyA9ICcpJzsgICAgICAgIC8qIEFkZCBjbG9zaW5nIHBhcmVuIGZvciAiXGZsaXQoKSIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKC0tbiA8IDEpIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgICAgICpscCsrID0gYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKC0tbiA8IDEpIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKmxwKysgPSBjOyAgICAgICAgICAgICAgICAgIC8qIEdlbmVyYWwgY2FzZSAqLworICAgICAgICAgICAgaWYgKC0tbiA8IDEpIHJldHVybigtMSk7CisgICAgICAgICAgICBzKys7CisgICAgICAgIH0KKyAgICAgICAgKmxwID0gTlVMOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGJyYWNrZXRzIGFyb3VuZCwgKi8KKyAgICAgICAgd2hpbGUgKCgqbHArKyA9ICpzKyspKSAgICAgICAgICAvKiBqdXN0IGNvcHkuICovCisgICAgICAgICAgaWYgKC0tbiA8IDEpCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBscC0tOworICAgIH0KKyAgICAqc3JjID0gczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdXBkYXRlZCBzb3VyY2UgKi8KKyAgICAqZGVzdCA9IGxwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KKyAgICBpZiAoYmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYWlsIGlmIGJyYWNlcyB1bmJhbGFuY2VkICovCisgICAgICByZXR1cm4oLTEpOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSBzdWNjZWVkLiAqLworICAgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIE5PU1BMICovCisKKy8qIEZ1bmN0aW9ucyBtb3ZlZCBoZXJlIGZyb20gY2t1dXNyLmMgdG8gZXZlbiBvdXQgdGhlIG1vZHVsZSBzaXplcy4uLiAqLworCisvKgorICBCcmVha3MgdXAgc3RyaW5nIHMgLS0gSU4gUExBQ0UhIC0tIGludG8gYSBsaXN0IG9mIHVwIHRvIG1heCB3b3Jkcy4KKyAgUG9pbnRlcnMgdG8gZWFjaCB3b3JkIGdvIGludG8gdGhlIGFycmF5IGxpc3RbXS4KKyAgbWF4IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB3b3JkcyAocG9pbnRlcnMpLgorICBJZiBsaXN0IGlzIE5VTEwsIHRoZW4gdGhleSBhcmUgYWRkZWQgdG8gdGhlIG1hY3JvIHRhYmxlLgorICBmbGFnID0gMCBtZWFucyB0aGUgbGFzdCBmaWVsZCBpcyB0byBiZSBvbmUgd29yZCwgbGlrZSBhbGwgdGhlIG90aGVyIGZpZWxkcywKKyAgICAgICAgIHNvIGFueXRoaW5nIGFmdGVyIGl0IGlzIGRpc2NhcmRlZC4KKyAgZmxhZyA9IDEgbWVhbnMgdGhlIGxhc3QgZmllbGQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIGV2ZW4gaWYKKyAgICAgICAgIHRoZXJlIGFyZSBsb3RzIG9mIHdvcmRzIGxlZnQsIHNvIHRoZSBsYXN0IGZpZWxkIGNvbnRhaW5zIHRoZQorICAgICAgICAgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcuCisqLworVk9JRAoreHdvcmRzKHMsbWF4LGxpc3QsZmxhZykgY2hhciAqczsgaW50IG1heDsgY2hhciAqbGlzdFtdOyBpbnQgZmxhZzsgeworICAgIGNoYXIgKnA7CisgICAgaW50IGIsIGksIGssIHEsIHksIHo7CisjaWZuZGVmIE5PU1BMCisgICAgaW50IG1hY3JvOworICAgIG1hY3JvID0gKGxpc3QgPT0gTlVMTCk7CisgICAgZGVidWcoRjAxMCwieHdvcmRzIixzLDApOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBYV09SRFNERUJVRworICAgIHByaW50ZigiWFdPUkRTIHN0cmluZz0lc1xuIixzKTsKKyAgICBwcmludGYoIlhXT1JEUyBtYXg9JWRcbiIsbWF4KTsKKyNlbmRpZiAvKiBYV09SRFNERUJVRyAqLworICAgIHAgPSBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIHN0cmluZyAqLworICAgIHEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIGRvdWJsZXF1b3RlIHJlbW92YWwgKi8KKyAgICBiID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBvdXRlciBicmFjZSByZW1vdmFsICovCisgICAgayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgaW4td29yZCAqLworICAgIHkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJyYWNlIG5lc3RpbmcgbGV2ZWwgKi8KKyAgICB6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiV29yZCIgY291bnRlciwgMCB0aHJ1IG1heCAqLworCisgICAgaWYgKGxpc3QpCisgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1heDsgaSsrKSAgICAgICAgLyogSW5pdGlhbGl6ZSBwb2ludGVycyAqLworICAgICAgICBsaXN0W2ldID0gTlVMTDsKKworICAgIGlmIChmbGFnKSBtYXgtLTsKKworICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdvIHRocnUgd29yZCBsaXN0ICovCisgICAgICAgIGlmICghcyB8fCAoKnMgPT0gJ1wwJykpIHsgICAgICAgLyogTm8gbW9yZSBjaGFyYWN0ZXJzPyAqLworICAgICAgICAgICAgaWYgKGsgIT0gMCkgeyAgICAgICAgICAgICAgIC8qIFdhcyBJIGluIGEgd29yZD8gKi8KKyAgICAgICAgICAgICAgICBpZiAoeiA9PSBtYXgpIGJyZWFrOyAgICAvKiBZZXMsIG9ubHkgZ28gdXAgdG8gbWF4LiAqLworICAgICAgICAgICAgICAgIHorKzsgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IHRoaXMgd29yZC4gKi8KKyNpZmRlZiBYV09SRFNERUJVRworICAgICAgICAgICAgICAgIHByaW50ZigiMSB6KysgPSAlZFxuIiwgeik7CisjZW5kaWYgLyogWFdPUkRTREVCVUcgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICBpZiAobWFjcm8pIHsgICAgICAgICAgICAvKiBEb2luZyBtYWNybyBhcmdzICovCisgICAgICAgICAgICAgICAgICAgIGlmICh6IDwgMTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcm5hbVsxXSA9IChjaGFyKSAoeiArICcwJyk7IC8qIEFzc2lnbiBsYXN0IGFyZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWRkbWFjKHZhcm5hbSxwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoeiA8PSBtYXgpIHsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFjbHZsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkbWFjKHZhcm5hbSxwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJihtX3hhcmdbbWFjbHZsXVt6XSkscCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBOb3QgZG9pbmcgbWFjcm8gYXJncyAqLworI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICAgICAgICAgIGxpc3Rbel0gPSBwOyAgICAgICAgLyogQXNzaWduIHBvaW50ZXIuICovCisjaWZkZWYgWFdPUkRTREVCVUcKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJbMV1MSVNUWyVkXT1cIiVzXCJcbiIseixsaXN0W3pdKTsKKyNlbmRpZiAvKiBYV09SRFNERUJVRyAqLworI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIEFuZCBnZXQgb3V0LiAqLworICAgICAgICAgICAgfSBlbHNlIGJyZWFrOyAgICAgICAgICAgICAgIC8qIFdhcyBub3QgaW4gYSB3b3JkICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGsgPT0gMCAmJiAoKnMgPT0gU1AgfHwgKnMgPT0gSFQpKSB7IC8qIEVhdCBsZWFkaW5nIGJsYW5rcyAqLworICAgICAgICAgICAgcysrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAocSA9PSAwICYmICpzID09ICd7JykgeyAvKiBBbiBvcGVuaW5nIGJyYWNlICovCisgICAgICAgICAgICBpZiAoayA9PSAwICYmIHkgPT0gMCkgeyAgICAgLyogSWYgbGVhZGluZyBicmFjZSAqLworICAgICAgICAgICAgICAgIHAgPSBzKzE7ICAgICAgICAgICAgICAgIC8qIHBvaW50IHBhc3QgaXQgKi8KKyAgICAgICAgICAgICAgICBiID0gMTsgICAgICAgICAgICAgICAgICAvKiBhbmQgZmxhZyB0aGF0IHdlIGRpZCB0aGlzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBrID0gMTsgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyB0aGF0IHdlJ3JlIGluIGEgd29yZCAqLworICAgICAgICAgICAgeSsrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IHRoZSBicmFjZS4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChxID09IDAgJiYgKnMgPT0gJ30nKSB7IC8qIEEgY2xvc2luZyBicmFjZS4gKi8KKyAgICAgICAgICAgIHktLTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3VudCBpdC4gKi8KKyAgICAgICAgICAgIGlmICh5IDw9IDAgJiYgYiAhPSAwKSB7ICAgICAvKiBJZiBpdCBtYXRjaGVzIHRoZSBsZWFkaW5nIGJyYWNlICovCisgICAgICAgICAgICAgICAgY2hhciBjOworICAgICAgICAgICAgICAgIGMgPSAqKHMrMSk7CisgICAgICAgICAgICAgICAgaWYgKCFjIHx8IGMgPT0gU1AgfHwgYyA9PSBIVCkgeyAvKiBhdCBFT0wgb3IgZm9sbG93ZWQgYnkgU1AgKi8KKyAgICAgICAgICAgICAgICAgICAgKnMgPSBTUDsgICAgICAgICAgICAvKiBjaGFuZ2UgaXQgdG8gYSBzcGFjZSAqLworICAgICAgICAgICAgICAgICAgICBiID0gMDsgICAgICAgICAgICAgIC8qIGFuZCB3ZSdyZSBub3QgaW4gYnJhY2VzIGFueSBtb3JlICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmZGVmIERPVUJMRVFVT1RJTkcKKyAgICAgICAgLyogT3BlbmluZyBkb3VibGVxdW90ZSAqLworICAgICAgICB9IGVsc2UgaWYgKGsgPT0gMCAmJiBiID09IDAgJiYgKnMgPT0gJyInICYmIGRibHF1bykgeworICAgICAgICAgICAgeSsrOworICAgICAgICAgICAgcCA9IHMrMTsgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50IHBhc3QgaXQgKi8KKyAgICAgICAgICAgIHEgPSAxOyAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgZmxhZyB0aGF0IHdlIGRpZCB0aGlzICovCisgICAgICAgICAgICBrID0gMTsgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyB0aGF0IHdlJ3JlIGluIGEgd29yZCAqLworICAgICAgICAvKiBDbG9zaW5nIGRvdWJsZSBxdW90ZSAqLworICAgICAgICB9IGVsc2UgaWYgKHEgPiAwICYmIGsgPiAwICYmIGIgPT0gMCAmJiAqcyA9PSAnIicgJiYgZGJscXVvKSB7CisgICAgICAgICAgICBjaGFyIGM7CisgICAgICAgICAgICBjID0gKihzKzEpOworICAgICAgICAgICAgaWYgKCFjIHx8IGMgPT0gU1AgfHwgYyA9PSBIVCkgeyAvKiBhdCBFT0wgb3IgZm9sbG93ZWQgYnkgU1AgKi8KKyAgICAgICAgICAgICAgICB5LS07CisgICAgICAgICAgICAgICAgKnMgPSBTUDsgICAgICAgICAgICAgICAgLyogY2hhbmdlIGl0IHRvIGEgc3BhY2UgKi8KKyAgICAgICAgICAgICAgICBxID0gMDsgICAgICAgICAgICAgICAgICAvKiBhbmQgd2UncmUgbm90IGluIHF1b3RlcyBhbnkgbW9yZSAqLworICAgICAgICAgICAgfQorI2VuZGlmIC8qIERPVUJMRVFVT1RJTkcgKi8KKworICAgICAgICB9IGVsc2UgaWYgKCpzICE9IFNQICYmICpzICE9IEhUKSB7IC8qIE5vbnNwYWNlIG1lYW5zIHdlJ3JlIGluIGEgd29yZCAqLworICAgICAgICAgICAgaWYgKGsgPT0gMCkgeyAgICAgICAgICAgICAgIC8qIElmIHdlIHdlcmVuJ3QgaW4gYSB3b3JkIGJlZm9yZSwgKi8KKyAgICAgICAgICAgICAgICBwID0gczsgICAgICAgICAgICAgICAgICAvKiBNYXJrIHRoZSBiZWdpbm5pbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAoZmxhZyAmJiB6ID09IG1heCkgeyAvKiBXYW50IGxhc3Qgd29yZCB0byBiZSByZW1haW5kZXI/ICovCisgICAgICAgICAgICAgICAgICAgIHorKzsKKyNpZmRlZiBYV09SRFNERUJVRworICAgICAgICAgICAgICAgICAgICBwcmludGYoIjEgeisrID0gJWRcbiIsIHopOworI2VuZGlmIC8qIFhXT1JEU0RFQlVHICovCisgICAgICAgICAgICAgICAgICAgIGxpc3Rbel0gPSBwOyAgICAgICAgLyogWWVzLCBwb2ludCB0byBpdCAqLworI2lmZGVmIFhXT1JEU0RFQlVHCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiWzRdTElTVFslZF09XCIlc1wiXG4iLHosbGlzdFt6XSk7CisjZW5kaWYgLyogWFdPUkRTREVCVUcgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAvKiBhbmQgcXVpdCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBrID0gMTsgICAgICAgICAgICAgICAgICAvKiBTZXQgaW4td29yZCBmbGFnICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgd2UncmUgbm90IGluc2lkZSBhIGJyYWNlZCBxdWFudGl0eSwgYW5kIHdlIGFyZSBpbiBhIHdvcmQsIGFuZCAqLworICAgICAgICAvKiB3ZSBoYXZlIGhpdCB3aGl0ZXNwYWNlLCB0aGVuIHdlIGhhdmUgYSB3b3JkLiAqLworICAgICAgICBpZiAoKHkgPCAxKSAmJiAoayAhPSAwKSAmJiAoKnMgPT0gU1AgfHwgKnMgPT0gSFQpICYmICFiKSB7CisgICAgICAgICAgICBpZiAoIWZsYWcgfHwgeiA8IG1heCkgICAgICAgLyogaWYgd2UgZG9uJ3Qgd2FudCB0byBrZWVwIHJlc3QgKi8KKyAgICAgICAgICAgICAgKnMgPSAnXDAnOyAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hdGUgdGhlIGFyZyB3aXRoIG51bGwgKi8KKyAgICAgICAgICAgIGsgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBzYXkgd2UncmUgbm90IGluIGEgd29yZCBhbnkgbW9yZSAqLworICAgICAgICAgICAgeSA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGJyYWNlcyBvZmYgY2xlYW4gYWdhaW4gKi8KKyAgICAgICAgICAgIGlmICh6ID09IG1heCkgYnJlYWs7ICAgICAgICAvKiBPbmx5IGdvIHVwIHRvIG1heC4gKi8KKyAgICAgICAgICAgIHorKzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3VudCB0aGlzIGFyZyAqLworI2lmZGVmIFhXT1JEU0RFQlVHCisgICAgICAgICAgICBwcmludGYoIjEgeisrID0gJWRcbiIsIHopOworI2VuZGlmIC8qIFhXT1JEU0RFQlVHICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgIGlmIChtYWNybykgeworICAgICAgICAgICAgICAgIGlmICh6IDwgMTApIHsKKyAgICAgICAgICAgICAgICAgICAgdmFybmFtWzFdID0gKGNoYXIpICh6ICsgJzAnKTsgLyogY29tcHV0ZSBpdHMgbmFtZSAqLworICAgICAgICAgICAgICAgICAgICBhZGRtYWModmFybmFtLHApOyAgIC8qIGFkZCBpdCB0byB0aGUgbWFjcm8gdGFibGUgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHogPD0gbWF4KSB7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgICAgICBpZiAobWFjbHZsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICBhZGRtYWModmFybmFtLHApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJihtX3hhcmdbbWFjbHZsXVt6XSkscCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgICAgICAgIGxpc3Rbel0gPSBwOworI2lmZGVmIFhXT1JEU0RFQlVHCisgICAgICAgICAgICAgICAgcHJpbnRmKCJbMl1MSVNUWyVkXT1cIiVzXCJcbiIseixsaXN0W3pdKTsKKyNlbmRpZiAvKiBYV09SRFNERUJVRyAqLworI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICBwID0gcysxOworICAgICAgICB9CisgICAgICAgIHMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgcGFzdCB0aGlzIGNoYXJhY3RlciAqLworICAgIH0KKyAgICBpZiAoKHogPT0gMCkgJiYgKHkgPiAxKSkgeyAgICAgICAgICAvKiBFeHRyYSBjbG9zaW5nIGJyYWNlKHMpIGF0IGVuZCAqLworICAgICAgICB6Kys7CisjaWZuZGVmIE5PU1BMCisgICAgICAgIGlmIChtYWNybykgeworICAgICAgICAgICAgaWYgKHogPCAxMCkgeworICAgICAgICAgICAgICAgIHZhcm5hbVsxXSA9IHogKyAnMCc7ICAgIC8qIGNvbXB1dGUgaXRzIG5hbWUgKi8KKyAgICAgICAgICAgICAgICBhZGRtYWModmFybmFtLHApOyAgICAgICAvKiBBZGQgcmVzdCBvZiBsaW5lIHRvIGxhc3QgYXJnICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeiA8PSBtYXgpIHsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgaWYgKG1hY2x2bCA8IDApCisgICAgICAgICAgICAgICAgICBhZGRtYWModmFybmFtLHApOworICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICBtYWtlc3RyKCYobV94YXJnW21hY2x2bF1bel0pLHApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICBsaXN0W3pdID0gcDsKKyNpZmRlZiBYV09SRFNERUJVRworICAgICAgICAgICAgcHJpbnRmKCJbM11MSVNUWyVkXT1cIiVzXCJcbiIseixsaXN0W3pdKTsKKyNlbmRpZiAvKiBYV09SRFNERUJVRyAqLworI2lmbmRlZiBOT1NQTAorICAgICAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICB9CisjaWZuZGVmIE5PU1BMCisgICAgaWYgKG1hY3JvKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gKi8KKyAgICAgICAgaWYgKG1hY2x2bCA8IDApIHsKKyAgICAgICAgICAgIGFfZGltWzBdID0gejsgICAgICAgICAgICAgICAvKiBBcnJheSBkaW1lbnNpb24gaXMgb25lIGxlc3MgKi8KKyAgICAgICAgICAgIHRvcGFyZ2MgPSB6ICsgMTsgICAgICAgICAgICAvKiB0aGFuIFx2KGFyZ2MpICovCisJICAgIGRlYnVnKEYxMTEsImFfZGltWzBdIiwiRCIsYV9kaW1bMF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFjYXJnY1ttYWNsdmxdID0geiArIDE7ICAgIC8qIFNldCBcdihhcmdjKSB2YXJpYWJsZSAqLworICAgICAgICAgICAgbl94YXJnW21hY2x2bF0gPSB6ICsgMTsgICAgIC8qIFRoaXMgaXMgdGhlIGFjdHVhbCBudW1iZXIgKi8KKyAgICAgICAgICAgIGFfcHRyWzBdID0gbV94YXJnW21hY2x2bF07ICAvKiBQb2ludCBcJl9bXSBhdCB0aGUgYXJncyAqLworICAgICAgICAgICAgYV9kaW1bMF0gPSB6OyAgICAgICAgICAgICAgIC8qIEFuZCBnaXZlIGl0IHRoaXMgZGltZW5zaW9uICovCisJICAgIGRlYnVnKEYxMTEsImFfZGltWzBdIiwiRSIsYV9kaW1bMF0pOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgcmV0dXJuOworfQorCisjaWZuZGVmIE5PU1BMCisKKy8qICBEIE8gUyBIIEkgRiBUICAtLSAgRG8gdGhlIFNISUZUIENvbW1hbmQ7IHNoaWZ0IG1hY3JvIGFyZ3MgbGVmdCBieSBuICovCisKKy8qICBOb3RlOiBhdCBzb21lIHBvaW50IGxldCdzIGNvbnNvbGlkYXRlIG1fYXJnW11bXSBhbmQgbV94YXJnW11bXS4gKi8KKworaW50Citkb3NoaWZ0KG4pIGludCBuOyB7ICAgICAgICAgICAgICAgICAgICAgLyogbiA9IHNoaWZ0IGNvdW50ICovCisgICAgaW50IGksIHRvcCwgbGV2ZWw7CisgICAgY2hhciAvKiAqcywgKm0sICovIGJ1Zls2XTsgICAgICAgICAgLyogQnVmZmVyIHRvIGJ1aWxkIHNjYWxhciBuYW1lcyAqLworICAgIGNoYXIgKiBzeCA9IHRtcGJ1ZjsKKyAgICBpbnQgbnggPSBUTVBCVUZTSVo7CisKKyAgICBkZWJ1ZyhGMTAxLCJTSElGVCBjb3VudCIsIiIsbik7CisgICAgZGVidWcoRjEwMSwiU0hJRlQgdG9wYXJnYyIsIiIsdG9wYXJnYyk7CisKKyAgICBpZiAobiA8IDEpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGF5IGluIHJhbmdlICovCisgICAgICByZXR1cm4obiA9PSAwID8gMSA6IDApOworCisgICAgbGV2ZWwgPSBtYWNsdmw7CisgICAgdG9wID0gKGxldmVsIDwgMCkgPyB0b3BhcmdjIDogbWFjYXJnY1tsZXZlbF07CisKKyAgICBpZiAobiA+PSB0b3ApCisgICAgICBuID0gdG9wIC0gMTsKKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworICAgICAgICBkZWJ1ZyhGMTAxLCJTSElGVCBjb3VudCAyIiwiIixuKTsKKyAgICAgICAgZGVidWcoRjEwMSwiU0hJRlQgbGV2ZWwiLCIiLGxldmVsKTsKKyAgICAgICAgaWYgKGxldmVsID4gLTEpCisgICAgICAgICAgZGVidWcoRjEwMSwiU0hJRlQgbWFjYXJnY1tsZXZlbF0iLCIiLG1hY2FyZ2NbbGV2ZWxdKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKworICAgIGJ1ZlswXSA9ICdcXCc7ICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgbmFtZSB0ZW1wbGF0ZSAqLworICAgIGJ1ZlsxXSA9ICclJzsKKyAgICBidWZbMl0gPSBOVUw7CisgICAgYnVmWzNdID0gTlVMOworCisgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpKyspIHsgICAgICAgICAgLyogRnJlZSBzaGlmdGVkLW92ZXIgYXJncyAqLworICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisgICAgICAgICAgICBtYWtlc3RyKCYodG9wYXJnW2ldKSxOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1ha2VzdHIoJihtX3hhcmdbbGV2ZWxdW2ldKSxOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA8IDEwKSB7ICAgICAgICAgICAgICAgICAgIC8qIElzIHRoaXMgbmVjZXNzYXJ5PyAqLworICAgICAgICAgICAgYnVmWzJdID0gKGNoYXIpKGkrJzAnKTsKKyAgICAgICAgICAgIGRlbG1hYyhidWYsMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMTsgaSA8PSB0b3AtbjsgaSsrKSB7ICAgICAgLyogU2hpZnQgcmVtYWluaW5nIGFyZ3MgKi8KKyAgICAgICAgaWYgKGxldmVsIDwgMCkgeworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIHRvcGFyZ1tpXSA9IHRvcGFyZ1tpK25dOyAgICAvKiBGdWxsIHZlY3RvciAqLworI2Vsc2UKKyAgICAgICAgICAgIG1ha2VzdHIoJih0b3BhcmdbaV0pLHRvcGFyZ1tpK25dKTsgLyogRnVsbCB2ZWN0b3IgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICBpZiAoaSA8IDEwKSAgICAgICAgICAgICAgICAgLyogU2NhbGFycy4uLiAqLworICAgICAgICAgICAgICBtYWtlc3RyKCYoZ192YXJbaSsnMCddKSx0b3BhcmdbaStuXSk7CisgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgbV94YXJnW2xldmVsXVtpXSA9IG1feGFyZ1tsZXZlbF1baStuXTsKKyNlbHNlCisgICAgICAgICAgICBtYWtlc3RyKCYobV94YXJnW2xldmVsXVtpXSksbV94YXJnW2xldmVsXVtpK25dKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICBpZiAoaSA8IDEwKSB7CisgICAgICAgICAgICAgICAgYnVmWzJdID0gKGNoYXIpKGkrJzAnKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMDEwLCJTSElGVCBidWYiLGJ1ZiwwKTsKKyAgICAgICAgICAgICAgICBhZGRtYWMoYnVmLG1feGFyZ1tsZXZlbF1baStuXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gdG9wLW47IGkgPD0gdG9wOyBpKyspIHsgICAgLyogQ2xlYXIgbiBhcmdzIGZyb20gdGhlIGVuZCAqLworICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgdG9wYXJnW2ldID0gTlVMTDsKKyNlbHNlCisgICAgICAgICAgICBtYWtlc3RyKCYodG9wYXJnW2ldKSxOVUxMKTsKKyNlbmRpZiAvKiBDT01NRU50ICovCisgICAgICAgICAgICBpZiAoaSA8IDEwKQorICAgICAgICAgICAgICBtYWtlc3RyKCYoZ192YXJbaSsnMCddKSxOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICBtX3hhcmdbbGV2ZWxdW2ldID0gTlVMTDsKKyNlbHNlCisgICAgICAgICAgICBtYWtlc3RyKCYobV94YXJnW2xldmVsXVtpXSksTlVMTCk7CisjZW5kaWYgLyogQ09NTUVOdCAqLworICAgICAgICAgICAgaWYgKGkgPCAxMCkgeworICAgICAgICAgICAgICAgIGJ1ZlsyXSA9IChjaGFyKShpKycwJyk7CisgICAgICAgICAgICAgICAgZGVsbWFjKGJ1ZiwwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobGV2ZWwgPiAtMSkgeyAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBhcmdzICovCisgICAgICAgIG1hY2FyZ2NbbGV2ZWxdIC09IG47ICAgICAgICAgICAgLyogQWRqdXN0IGNvdW50ICovCisgICAgICAgIG5feGFyZ1ttYWNsdmxdID0gbWFjYXJnY1tsZXZlbF07IC8qIEhlcmUgdG9vICovCisgICAgICAgIGFfZGltWzBdID0gbWFjYXJnY1tsZXZlbF0gLSAxOyAgLyogQWRqdXN0IGFycmF5IGRpbWVuc2lvbiAqLworCWRlYnVnKEYxMTEsImFfZGltWzBdIiwiRiIsYV9kaW1bMF0pOworICAgICAgICB6enN0cmluZygiXFxmam9pbigmX1tdLHsgfSwxKSIsJnN4LCZueCk7IC8qIEhhbmRsZSBcJSogKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgIG1ha2VzdHIoJihtX2xpbmVbbGV2ZWxdKSx0bXBidWYpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXR0byBmb3IgdG9wIGxldmVsICovCisgICAgICAgIHRvcGFyZ2MgLT0gbjsKKyAgICAgICAgYV9kaW1bMF0gPSB0b3BhcmdjIC0gMTsKKwlkZWJ1ZyhGMTExLCJhX2RpbVswXSIsIkciLGFfZGltWzBdKTsKKyAgICAgICAgenpzdHJpbmcoIlxcZmpvaW4oJl9bXSx7IH0sMSkiLCZzeCwmbngpOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgbWFrZXN0cigmdG9wbGluZSx0bXBidWYpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB9CisgICAgcmV0dXJuKDEpOworfQorI2VuZGlmIC8qIE5PU1BMICovCisKK2ludAorZG9jZChjeCkgaW50IGN4OyB7ICAgICAgICAgICAgICAgICAgICAgIC8qIERvIHRoZSBDRCBjb21tYW5kICovCisgICAgaW50IHg7CisgICAgZXh0ZXJuIGludCBzZXJ2ZXIsIHNydmNkbXNnLCBjZGFjdGl2ZTsKKyAgICBleHRlcm4gY2hhciAqIGNkbXNnZmlsZVtdLCAqIGNrY2RwYXRoOworICAgIGNoYXIgKnMsICpwOworI2lmZGVmIE1BQworICAgIGNoYXIgdGVtcFszNF07CisjZW5kaWYgLyogTUFDICovCisjaWZkZWYgSUtTRENPTkYKK2V4dGVybiBpbnQgaWtzZGNmOworI2VuZGlmIC8qIElLU0RDT05GICovCisKKyNpZm5kZWYgTk9GUklMTFMKKyAgICBpZiAoY3ggPT0gWFhCQUNLKSB7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgY3dkZiA9IDE7CisgICAgICAgIGlmIChwcmV2ZGlyKSB7CisgICAgICAgICAgICBzID0gemd0ZGlyKCk7CisgICAgICAgICAgICBpZiAoIXpjaGRpcihwcmV2ZGlyKSkgeworICAgICAgICAgICAgICAgIGN3ZGYgPSAwOworICAgICAgICAgICAgICAgIHBlcnJvcihzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmcHJldmRpcixzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4oY3dkZik7CisgICAgfQorI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyAgICBpZiAoY3ggPT0gWFhDRFVQKSB7CisjaWZkZWYgVk1TCisgICAgICAgIHMgPSAiWy1dIjsKKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgcyA9ICJeIjsKKyNlbHNlCisgICAgICAgIHMgPSAiLi4iOworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogVk1TICovCisgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKyAgICAgICAgZ290byBnb2NkOworICAgIH0KKyNpZm5kZWYgTk9TUEwKKyAgICBpZiAoY3ggPT0gWFhLQ0QpIHsJCQkvKiBTeW1ib2xpYyAoS2VybWl0KSBDRCAqLworCWNoYXIgKiBwOworCWludCBuLCBrOworCXggPSBjbWtleShrY2R0YWIsbmtjZHRhYiwiU3ltYm9saWMgZGlyZWN0b3J5IG5hbWUiLCJob21lIix4eHN0cmluZyk7CisJaWYgKHggPCAwKQorCSAgcmV0dXJuKHgpOworCXggPSBsb29rdXAoa2NkdGFiLGF0bWJ1Zixua2NkdGFiLCZrKTsgLyogR2V0IGNvbXBsZXRlIGtleXdvcmQgKi8KKwlpZiAoeCA8IDApIHsKKwkgICAgcHJpbnRmKCI/TG9va3VwIGVycm9yXG4iKTsJLyogc2hvdWxkbid0IGhhcHBlbiAqLworCSAgICByZXR1cm4oLTkpOworCX0KKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorCSAgcmV0dXJuKHgpOworCWlmIChrID09IFZOX0hPTUUpIHsJCS8qIEhPTUU6IGFsbG93IFNFVCBIT01FIHRvIG92ZXJyaWRlICovCisJICAgIGNrc3RybmNweShsaW5lLGhvbWVwYXRoKCksTElOQlVGU0laKTsKKwl9IGVsc2UgewkJCS8qIE90aGVyIHN5bWJvbGljIG5hbWUgKi8KKwkgICAgLyogQ29udmVydCB0byB2YXJpYWJsZSBzeW50YXggKi8KKwkgICAgY2ttYWttc2codG1wYnVmLFRNUEJVRlNJWiwiXFx2KCIsa2NkdGFiW2tdLmt3ZCwiKSIsTlVMTCk7CisJICAgIHAgPSBsaW5lOwkJCS8qIEV4cGFuZCB0aGUgdmFyaWFibGUgKi8KKwkgICAgbiA9IExJTkJVRlNJWjsKKwkgICAgenpzdHJpbmcodG1wYnVmLCZwLCZuKTsKKwkgICAgaWYgKCFsaW5lWzBdKSB7CQkvKiBGYWlsIGlmIHZhcmlhYmxlIG5vdCBkZWZpbmVkICovCisJCXByaW50ZigiPyVzIC0gbm90IGRlZmluZWRcbiIsdG1wYnVmKTsKKwkJcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKwkgICAgfQorCX0KKwlzID0gbGluZTsJCQkvKiBBbGwgT0ssIGdvIHRyeSB0byBDRC4uLiAqLworCWdvdG8gZ29jZDsKKyAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKworICAgIGNkYWN0aXZlID0gMTsKKyNpZmRlZiBHRU1ET1MKKyAgICBpZiAoKHggPSBjbWRpcigiTmFtZSBvZiBsb2NhbCBkaXJlY3RvcnksIG9yIGNhcnJpYWdlIHJldHVybiIsCisgICAgICAgICAgICAgICAgICAgaG9tZXBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAmcywKKyAgICAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgKSA8IDAgKQorICAgICAgcmV0dXJuKHgpOworI2Vsc2UKKyNpZmRlZiBPUzIKKyAgICBpZiAoKHggPSBjbWRpcnAoIk5hbWUgb2YgUEMgZGlzayBhbmQvb3IgZGlyZWN0b3J5LFxuXAorICAgICAgIG9yIHByZXNzIHRoZSBFbnRlciBrZXkgZm9yIHRoZSBkZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgaG9tZXBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgJnMsCisgICAgICAgICAgICAgICAgICAgIGNrY2RwYXRoID8gY2tjZHBhdGggOiBnZXRlbnYoIkNEUEFUSCIpLAorICAgICAgICAgICAgICAgICAgICB4eHN0cmluZworICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICApIDwgMCApCisgICAgICByZXR1cm4oeCk7CisjZWxzZQorI2lmZGVmIE1BQworICAgIHggPSBja3N0cm5jcHkodGVtcCxob21lcGF0aCgpLDMyKTsKKyAgICBpZiAoeCA+IDApIGlmICh0ZW1wW3gtMV0gIT0gJzonKSB7IHRlbXBbeF0gPSAnOic7IHRlbXBbeCsxXSA9IE5VTDsgfQorICAgIGlmICgoeCA9IGNtdHh0KCJOYW1lIG9mIE1hY2ludG9zaCB2b2x1bWUgYW5kL29yIGZvbGRlcixcblwKKyBvciBwcmVzcyB0aGUgUmV0dXJuIGtleSBmb3IgdGhlIGRlc2t0b3Agb24gdGhlIGJvb3QgZGlzayIsCisgICAgICAgICAgICAgICAgICAgdGVtcCwmcywgeHhzdHJpbmcpKSA8IDAgKQorICAgICAgcmV0dXJuKHgpOworI2Vsc2UKKyAgICBpZiAoKHggPSBjbWRpcnAoIkNhcnJpYWdlIHJldHVybiBmb3IgaG9tZSBkaXJlY3RvcnksXG5cCitvciBuYW1lIG9mIGRpcmVjdG9yeSBvbiB0aGlzIGNvbXB1dGVyIiwKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgICAgICAgICAgIlNZUyRMT0dJTiIsICAgICAgICAvKiBXaXRoIG5vIGNvbG9uICovCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBob21lcGF0aCgpLAkJLyogSW4gVk1TIHRoaXMgaXMgIlNZUyRMT0dJTjoiICovCisjZW5kaWYgLyogVk1TICovCisgICAgICAgICAgICAgICAgICAgICZzLAorICAgICAgICAgICAgICAgICAgICBja2NkcGF0aCA/IGNrY2RwYXRoIDogZ2V0ZW52KCJDRFBBVEgiKSwKKyAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIEdFTURPUyAqLworICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsgICAgICAgIC8qIE1ha2UgYSBzYWZlIGNvcHkgKi8KKyAgICBzID0gbGluZTsKKyNpZmRlZiBWTVMKKyAgICBpZiAoY2ttYXRjaCgiKi5ESVI7MSQiLHMsMCwwKSkKKyAgICAgIGlmIChjdnRkaXIocyx0bXBidWYsVE1QQlVGU0laKSA+IDApCisgICAgICAgIHMgPSB0bXBidWY7CisjZW5kaWYgLyogVk1TICovCisgICAgZGVidWcoRjExMCwiZG9jZCIscywwKTsKKyNpZm5kZWYgTUFDCisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSAgICAgICAgICAgICAgLyogR2V0IGNvbmZpcm1hdGlvbiAqLworICAgICAgcmV0dXJuKHgpOworI2VuZGlmIC8qIE1BQyAqLworCisgIGdvY2Q6CisKKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgIHggPSBzdHJsZW4obGluZSk7ICAgICAgICAgICAgICAgICAgIC8qIGhvbWRpciBlbmRzIGluIGNvbG9uLCAqLworICAgIGlmICh4ID4gMSAmJiBsaW5lW3gtMV0gPT0gJzonKSAgICAgIC8qIGFuZCAiZGlyIiBkb2Vzbid0IGxpa2UgdGhhdC4uLiAqLworICAgICAgbGluZVt4LTFdID0gTlVMOworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisKKyNpZmRlZiBNQUMKKyAgICBjd2RmID0gMTsKKyAgICBpZiAoIXpjaGRpcihzKSkgeworICAgICAgICBjd2RmID0gMDsKKyAgICAgICAgaWYgKCpzICE9ICc6JykgeyAgICAgICAgICAgICAgICAvKiBJZiBpdCBmYWlsZWQsICovCisgICAgICAgICAgICBjaGFyICpwOyAgICAgICAgICAgICAgICAgICAgLyogc3VwcGx5IGxlYWRpbmcgY29sb24gKi8KKyAgICAgICAgICAgIGludCBsZW4gPSAoaW50KXN0cmxlbihzKSArIDI7CisgICAgICAgICAgICBwID0gbWFsbG9jKGxlbik7ICAgICAgICAgICAgLyogYW5kIHRyeSBhZ2Fpbi4uLiAqLworICAgICAgICAgICAgaWYgKHApIHsKKyAgICAgICAgICAgICAgICBzdHJjcHkocCwiOiIpOyAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICAgICAgc3RyY2F0KHAscyk7ICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgICAgIGlmICh6Y2hkaXIocCkpCisgICAgICAgICAgICAgICAgICBjd2RmID0gMTsKKyAgICAgICAgICAgICAgICBmcmVlKHApOworICAgICAgICAgICAgICAgIHAgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICghY3dkZikKKyAgICAgIHBlcnJvcihzKTsKKyNlbHNlCisgICAgcCA9IHpndGRpcigpOworICAgIGlmICghemNoZGlyKHMpKSB7CisgICAgICAgIGN3ZGYgPSAwOworI2lmZGVmIENLUk9PVAorICAgICAgICBpZiAoY2tyb290ZXJyKQorICAgICAgICAgIHByaW50ZigiP09mZiBsaW1pdHM6IFwiJXNcIlxuIixzKTsKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIENLUk9PVCAqLworICAgICAgICAgIHBlcnJvcihzKTsKKyAgICB9IGVsc2UgY3dkZiA9IDE7CisjZW5kaWYgLyogTUFDICovCisKKyAgICB4ID0gMDsKKyAgICBpZiAoY3dkZikgeworICAgICAgICBtYWtlc3RyKCZwcmV2ZGlyLHApOworICAgICAgICBkZWJ1ZyhGMTExLCJkb2NkIiwic3J2Y2Rtc2ciLHNydmNkbXNnKTsKKyAgICAgICAgaWYgKHNydmNkbXNnCisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICAgICYmICEoaW5zZXJ2ZXIgJiYgIWlrc2RjZikKKyNlbmRpZiAvKiBJS1NEQ09ORiAqLworICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJkb2NkIGNkbXNnZmlsZVtpXSIsY2Rtc2dmaWxlW2ldLGkpOworICAgICAgICAgICAgICAgIGlmICh6Y2hraShjZG1zZ2ZpbGVbaV0pID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGRvdHlwZShjZG1zZ2ZpbGVbaV0seGFza21vcmUsMCwwLE5VTEwsMCxOVUxMLDAsMCxOVUxMLDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisvKiB4ZG9jZDogKi8KKyAgICBpZiAoIXggJiYgc3J2Y2Rtc2cgJiYgIXNlcnZlcgorI2lmZGVmIElLU0RDT05GCisgICAgICAgICYmICEoaW5zZXJ2ZXIgJiYgIWlrc2RjZikKKyNlbmRpZiAvKiBJS1NEQ09ORiAqLworICAgICAgICAmJiAhcXVpZXQgJiYgIXhjbWRzcmMpCisgICAgICBwcmludGYoIiVzXG4iLCB6Z3RkaXIoKSk7CisKKyAgICByZXR1cm4oY3dkZik7Cit9CisKK3N0YXRpYyBpbnQgb25fY3RybGMgPSAwOworCitWT0lECitmaXhjbWQoKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZpeCBjb21tYW5kIHBhcnNlciBhZnRlciBpbnRlcnJ1cHRpb24gKi8KKyNpZm5kZWYgTk9TUEwKKyNpZm5kZWYgTk9PTkNUUkxDCisgICAgaWYgKG5tYWMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW55IG1hY3JvcyBkZWZpbmVkPyAqLworICAgICAgICBpbnQgazsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFllcyAqLworICAgICAgICBjaGFyICogcyA9ICJvbl9jdHJsYyI7ICAgICAgICAgIC8qIE5hbWUgb2YgQ3RybC1DIGhhbmRsaW5nIG1hY3JvICovCisgICAgICAgIGsgPSBtbG9vayhtYWN0YWIscyxubWFjKTsgICAgICAgLyogTG9vayBpdCB1cC4gKi8KKyAgICAgICAgaWYgKGsgPj0gMCkgeyAgICAgICAgICAgICAgICAgICAvKiBJZiBmb3VuZCwgKi8KKyAgICAgICAgICAgIGlmIChvbl9jdHJsYysrID09IDApIHsgICAgICAvKiBpZiBub3QgYWxyZWFkeSBleGVjdXRpbmcsICovCisgICAgICAgICAgICAgICAgaWYgKGRvZG8oaywiIiwwKSA+IC0xKSAgLyogc2V0IGl0IHVwLCAqLworICAgICAgICAgICAgICAgICAgcGFyc2VyKDEpOyAgICAgICAgICAgIC8qIGV4ZWN1dGUgaXQsICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxtYWMocywxKTsgICAgICAgICAgICAgICAgLyogYW5kIHVuZGVmaW5lIGl0LiAqLworICAgICAgICB9CisgICAgfQorICAgIG9uX2N0cmxjID0gMDsKKyNlbmRpZiAvKiBOT09OQ1RSTEMgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIGRvc3RvcCgpOyAgICAgICAgICAgICAgICAgICAvKiBCYWNrIHRvIHRvcCBsZXZlbCAoYWxzbyBjYWxscyBjb25pbnQoKSkuICovCisgICAgYmdjaGsoKTsgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGJhY2tncm91bmQgc3RhdHVzICovCisgICAgaWYgKCpwc2F2ZSkgeyAgICAgICAgICAgICAgIC8qIElmIG9sZCBwcm9tcHQgc2F2ZWQsICovCisgICAgICAgIGNtc2V0cChwc2F2ZSk7ICAgICAgICAgIC8qIHJlc3RvcmUgaXQuICovCisgICAgICAgICpwc2F2ZSA9IE5VTDsKKyAgICB9CisgICAgc3VjY2VzcyA9IDA7ICAgICAgICAgICAgICAgIC8qIFRlbGwgcGFyc2VyIGxhc3QgY29tbWFuZCBmYWlsZWQgKi8KK30KKworI2lmbmRlZiBOT1NIT1cgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNIT1cgRkVBVFVSRVMgKi8KKy8qCisgIE5vdGUsIHByZXNlbnRseSBvcHRsaXN0W10gaW5kZXggb3ZlcmZsb3cgaXMgbm90IGNoZWNrZWQuCisgIFRoZXJlIGlzIHBsZW50eSBvZiByb29tIChsZXNzIHRoYW4gMzYwIGVudHJpZXMgZm9yIDEwMDAgc2xvdHMpLgorICBXaGVuIHNwYWNlIHN0YXJ0cyB0byBnZXQgdGlnaHQsIGNoZWNrIGZvciBub3B0bGlzdCA+PSBOT1BUTElTVAorICBldmVyeSB0aW1lIG5vcHRsaXN0IGlzIGluY3JlbWVudGVkLgorKi8KKyNkZWZpbmUgTk9QVExJU1QgMTAyNAorc3RhdGljIGludCBub3B0bGlzdCA9IDA7CitzdGF0aWMgY2hhciAqIG9wdGxpc3RbTk9QVExJU1QrMV07CitzdGF0aWMgaW50IGhwb3MgPSAwOworCitpbnQKK3BydG9wdChsaW5lcyxzKSBpbnQgKiBsaW5lczsgY2hhciAqczsgeyAvKiBQcmludCBhbiBvcHRpb24gKi8KKyAgICBpbnQgeSwgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEb2VzIHdvcmQgd3JhcC4gKi8KKyAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICBpID0gKmxpbmVzOworICAgIGlmICghKnMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVtcHR5IGFyZ3VtZW50ICovCisgICAgICAgIGlmIChocG9zID4gMCkgeyAgICAgICAgICAgICAgICAgLyogbWVhbnMgdG8gZW5kIHRoaXMgbGluZS4gKi8KKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsgICAgICAgICAgICAgICAvKiBOb3QgbmVlZGVkIGlmIGFscmVhZHkgYXQgKi8KKyAgICAgICAgICAgIGlmICgrK2kgPiAoY21kX3Jvd3MgLSAzKSkgeyAvKiBiZWdpbm5pbmcgb2YgbmV3IGxpbmUuICovCisgICAgICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpCisgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiIpOyAgICAgICAgICAgICAgICAgICAvKiBBbmQgdGhlbiBtYWtlIGEgYmxhbmsgbGluZSAqLworICAgICAgICBpZiAoKytpID4gKGNtZF9yb3dzIC0gMykpIHsKKyAgICAgICAgICAgIGlmICghYXNrbW9yZSgpKQorICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICB9CisgICAgICAgIGhwb3MgPSAwOworICAgICAgICAqbGluZXMgPSBpOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorICAgIHkgPSAoaW50KXN0cmxlbihzKSArIDE7CisgICAgaHBvcyArPSB5OworICAgIGRlYnVnKEYxMDEsInBydG9wdCBocG9zIiwiIixocG9zKTsKKyAgICBkZWJ1ZyhGMTAxLCJwcnRvcHQgY21kX2NvbHMiLCIiLGNtZF9jb2xzKTsKKworICAgIGlmICgKKyNpZmRlZiBPUzIKKyAgICAgICAgaHBvcyA+ICgoY21kX2NvbHMgPiA0MCkgPyAoY21kX2NvbHMgLSAxKSA6IDc5KQorI2Vsc2UgLyogT1MyICovCisgICAgICAgIGhwb3MgPiAoKHR0X2NvbHMgPiA0MCkgPyAodHRfY29scyAtIDEpIDogNzkpCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICkgeworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIGlmICgrK2kgPiAoY21kX3Jvd3MgLSAzKSkgeworICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpCisgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCIgJXMiLHMpOworICAgICAgICBocG9zID0geTsKKyAgICB9IGVsc2UKKyAgICAgIHByaW50ZigiICVzIixzKTsKKyAgICAqbGluZXMgPSBpOworICAgIHJldHVybigxKTsKK30KKworc3RhdGljIFZPSUQKK2luaXRvcHRsaXN0KCkgeworICAgIGludCBpOworICAgIGlmIChub3B0bGlzdCA+IDApCisgICAgICByZXR1cm47CisgICAgZm9yIChpID0gMDsgaSA8IE5PUFRMSVNUOyBpKyspCisgICAgICBvcHRsaXN0W2ldID0gTlVMTDsKKworI2lmZGVmIE1BQworI2lmZGVmIE1QVworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTVBXIik7CisjZW5kaWYgLyogTVBXICovCisjZW5kaWYgLyogTUFDICovCisKKyNpZmRlZiBNQUMKKyNpZmRlZiBUSElOS19DCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJUSElOS19DIik7CisjZW5kaWYgLyogVEhJTktfQyAqLworI2VuZGlmIC8qIE1BQyAqLworCisjaWZkZWYgX18zODZfXworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX18zODZfXyIpOworI2VuZGlmIC8qIF9fMzg2X18gKi8KKworLyogTWVtb3J5IG1vZGVscy4uLiAqLworCisjaWZkZWYgX19GTEFUX18KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9fRkxBVF9fIik7CisjZW5kaWYgLyogX19GTEFUX18gKi8KKyNpZmRlZiBfX1NNQUxMX18KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9fU01BTExfXyIpOworI2VuZGlmIC8qIF9fU01BTExfXyAqLworI2lmZGVmIF9fTUVESVVNX18KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9fTUVESVVNX18iKTsKKyNlbmRpZiAvKiBfX01FRElVTV9fICovCisjaWZkZWYgX19DT01QQUNUX18KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9fQ09NUEFDVF9fIik7CisjZW5kaWYgLyogX19DT01QQUNUX18gKi8KKyNpZmRlZiBfX0xBUkdFX18KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9fTEFSR0VfXyIpOworI2VuZGlmIC8qIF9fTEFSR0VfXyAqLworCisjaWZkZWYgREVCVUcKKyNpZmRlZiBJRkRFQlVHCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJJRkRFQlVHIik7CisjZWxzZQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiREVCVUciKTsKKyNlbmRpZiAvKiBJRkRFQlVHICovCisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBUTE9HCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJUTE9HIik7CisjZW5kaWYgLyogVExPRyAqLworI2lmZGVmIEJJR0JVRk9LCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJCSUdCVUZPSyIpOworI2VuZGlmIC8qIEJJR0JVRk9LICovCisjaWZkZWYgSU5QQlVGU0laCisgICAgc3ByaW50ZihsaW5lLCJJTlBCVUZTSVo9JWQiLElOUEJVRlNJWik7IC8qIFNBRkUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksbGluZSk7CisjZW5kaWYgLyogSU5QQlVGU0laRSAqLworI2lmZGVmIElOQlVGU0laRQorICAgIHNwcmludGYobGluZSwiSU5CVUZTSVpFPSVkIixJTkJVRlNJWkUpOyAvKiBTQUZFICovCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLGxpbmUpOworI2VuZGlmIC8qIElOQlVGU0laRSAqLworI2lmZGVmIE9CVUZTSVpFCisgICAgc3ByaW50ZihsaW5lLCJPQlVGU0laRT0lZCIsT0JVRlNJWkUpOyAvKiBTQUZFICovCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLGxpbmUpOworI2VuZGlmIC8qIE9CVUZTSVpFICovCisjaWZkZWYgRkRfU0VUU0laRQorICAgIHNwcmludGYobGluZSwiRkRfU0VUU0laRT0lZCIsRkRfU0VUU0laRSk7IC8qIFNBRkUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksbGluZSk7CisjZW5kaWYgLyogRkRfU0VUU0laRSAqLworI2lmZGVmIFhGUkNBTgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiWEZSQ0FOIik7CisjZW5kaWYgLyogWEZSQ0FOICovCisjaWZkZWYgWFBSSU5UCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJYUFJJTlQiKTsKKyNlbmRpZiAvKiBYUFJJTlQgKi8KKyNpZmRlZiBQSVBFU0VORAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiUElQRVNFTkQiKTsKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworI2lmZGVmIENLX1NQRUVECisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS19TUEVFRCIpOworI2VuZGlmIC8qIENLX1NQRUVEICovCisjaWZkZWYgQ0tfRkFTVAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfRkFTVCIpOworI2VuZGlmIC8qIENLX0ZBU1QgKi8KKyNpZmRlZiBDS19BUEMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX0FQQyIpOworI2VuZGlmIC8qIENLX0FQQyAqLworI2lmZGVmIENLX0FVVE9ETAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfQVVUT0RMIik7CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisjaWZkZWYgQ0tfTUtESVIKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX01LRElSIik7CisjZW5kaWYgLyogQ0tfTUtESVIgKi8KKyNpZmRlZiBOT01LRElSCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT01LRElSIik7CisjZW5kaWYgLyogTk9NS0RJUiAqLworI2lmZGVmIENLX0xBQkVMRUQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX0xBQkVMRUQiKTsKKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisjaWZkZWYgTk9ESUFMCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT0RJQUwiKTsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyNpZmRlZiBNSU5JRElBTAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTUlOSURJQUwiKTsKKyNlbmRpZiAvKiBNSU5JRElBTCAqLworI2lmZGVmIFdIQVRBTUkKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIldIQVRBTUkiKTsKKyNlbmRpZiAvKiBXSEFUQU1JICovCisjaWZkZWYgRFlOQU1JQworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiRFlOQU1JQyIpOworI2VuZGlmIC8qIElGREVCVUcgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICBzcHJpbnRmKGxpbmUsIkNNRERFUD0lZCIsQ01EREVQKTsgICAvKiBTQUZFICovCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLGxpbmUpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBNQVhQQVRITEVOCisgICAgc3ByaW50ZihsaW5lLCJNQVhQQVRITEVOPSVkIixNQVhQQVRITEVOKTsgLyogU0FGRSAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKyNlbmRpZiAvKiBNQVhQQVRITEVOICovCisKKyNpZmRlZiBERVZOQU1MRU4KKyAgICBzcHJpbnRmKGxpbmUsIkRFVk5BTUxFTj0lZCIsREVWTkFNTEVOKTsgLyogU0FGRSAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKyNlbmRpZiAvKiBERVZOQU1MRU4gKi8KKworI2lmZGVmIE5PX1BBUkFNX0gKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk5PX1BBUkFNX0giKTsKKyNlbmRpZiAvKiBOT19QQVJBTV9IICovCisKKyNpZmRlZiBJTkNMX1BBUkFNX0gKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIklOQ0xfUEFSQU1fSCIpOworI2VuZGlmIC8qIElOQ0xfUEFSQU1fSCAqLworCisgICAgc3ByaW50ZihsaW5lLCJDS01BWFBBVEg9JWQiLENLTUFYUEFUSCk7IC8qIFNBRkUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksbGluZSk7CisKKyAgICBzcHJpbnRmKGxpbmUsIkNLTUFYT1BFTj0lZCIsQ0tNQVhPUEVOKTsgLyogU0FGRSAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKworICAgIHNwcmludGYobGluZSwiWl9NQVhDSEFOPSVkIixaX01BWENIQU4pOyAvKiBTQUZFICovCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLGxpbmUpOworCisjaWZkZWYgT1BFTl9NQVgKKyAgICBzcHJpbnRmKGxpbmUsIk9QRU5fTUFYPSVkIixPUEVOX01BWCk7IC8qIFNBRkUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksbGluZSk7CisjZW5kaWYgLyogT1BFTl9NQVggKi8KKworI2lmZGVmIF9QT1NJWF9PUEVOX01BWAorICAgIHNwcmludGYobGluZSwiX1BPU0lYX09QRU5fTUFYPSVkIixfUE9TSVhfT1BFTl9NQVgpOyAvKiBTQUZFICovCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLGxpbmUpOworI2VuZGlmIC8qIF9QT1NJWF9PUEVOX01BWCAqLworCisjaWZkZWYgQ0tDSEFOTkVMSU8KKyAgICB7CisgICAgICAgIGV4dGVybiBpbnQgel9tYXhjaGFuOworI2lmZGVmIFVOSVgKKyAgICAgICAgZXh0ZXJuIGludCBja21heGZpbGVzOworICAgICAgICBzcHJpbnRmKGxpbmUsImNrbWF4ZmlsZXM9JWQiLGNrbWF4ZmlsZXMpOyAvKiBTQUZFICovCisgICAgICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKyNlbmRpZiAvKiBVTklYICovCisgICAgICAgIHNwcmludGYobGluZSwiel9tYXhjaGFuPSVkIix6X21heGNoYW4pOyAvKiBTQUZFICovCisgICAgICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKyAgICB9CisjZW5kaWYgLyogQ0tDSEFOTkVMSU8gKi8KKworI2lmZGVmIEZPUEVOX01BWAorICAgIHNwcmludGYobGluZSwiRk9QRU5fTUFYPSVkIixGT1BFTl9NQVgpOyAvKiBTQUZFICovCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLGxpbmUpOworI2VuZGlmIC8qIEZPUEVOX01BWCAqLworCisjaWZkZWYgTUFYR0VUUEFUSAorICAgIHNwcmludGYobGluZSwiTUFYR0VUUEFUSD0lZCIsTUFYR0VUUEFUSCk7IC8qIFNBRkUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksbGluZSk7CisjZW5kaWYgLyogTUFYR0VUUEFUSCAqLworCisjaWZkZWYgQ01EQkwKKyAgICBzcHJpbnRmKGxpbmUsIkNNREJMPSVkIixDTURCTCk7ICAgICAvKiBTQUZFICovCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLGxpbmUpOworI2VuZGlmIC8qIENNREJMICovCisKKyNpZmRlZiBWTkFNTAorICAgIHNwcmludGYobGluZSwiVk5BTUw9JWQiLFZOQU1MKTsgICAgIC8qIFNBRkUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksbGluZSk7CisjZW5kaWYgLyogVk5BTUwgKi8KKworI2lmZGVmIEFSUkFZUkVGTEVOCisgICAgc3ByaW50ZihsaW5lLCJBUlJBWVJFRkxFTj0lZCIsQVJSQVlSRUZMRU4pOyAvKiBTQUZFICovCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLGxpbmUpOworI2VuZGlmIC8qIEFSUkFZUkVGTEVOICovCisKKyNpZmRlZiBVSURCVUZMRU4KKyAgICBzcHJpbnRmKGxpbmUsIlVJREJVRkxFTj0lZCIsVUlEQlVGTEVOKTsgLyogU0FGRSAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKyNlbmRpZiAvKiBVSURCVUZMRU4gKi8KKworI2lmZGVmIEZPUkRFUFRICisgICAgc3ByaW50ZihsaW5lLCJGT1JERVBUSD0lZCIsRk9SREVQVEgpOyAvKiBTQUZFICovCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLGxpbmUpOworI2VuZGlmIC8qIEZPUkRFUFRIICovCisKKyNpZmRlZiBNQVhUQUtFCisgICAgc3ByaW50ZihsaW5lLCJNQVhUQUtFPSVkIixNQVhUQUtFKTsgLyogU0FGRSAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKyNlbmRpZiAvKiBNQVhUQUtFICovCisKKyNpZmRlZiBNQUNMRVZFTAorICAgIHNwcmludGYobGluZSwiTUFDTEVWRUw9JWQiLE1BQ0xFVkVMKTsgLyogU0FGRSAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKyNlbmRpZiAvKiBNQUNMRVZFTCAqLworCisjaWZkZWYgTUFDX01BWAorICAgIHNwcmludGYobGluZSwiTUFDX01BWD0lZCIsTUFDX01BWCk7IC8qIFNBRkUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksbGluZSk7CisjZW5kaWYgLyogTUFDX01BWCAqLworCisjaWZkZWYgTUlOUFVUTUFYCisgICAgc3ByaW50ZihsaW5lLCJNSU5QVVRNQVg9JWQiLE1JTlBVVE1BWCk7IC8qIFNBRkUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksbGluZSk7CisjZW5kaWYgLyogTUlOUFVUTUFYICovCisKKyNpZmRlZiBNQVhXTEQKKyAgICBzcHJpbnRmKGxpbmUsIk1BWFdMRD0lZCIsTUFYV0xEKTsgLyogU0FGRSAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKyNlbHNlCisjaWZkZWYgT1MyCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJNQVhXTEQ9dW5saW1pdGVkIik7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTUFYV0xEICovCisKKyNpZmRlZiBNU0VORE1BWAorICAgIHNwcmludGYobGluZSwiTVNFTkRNQVg9JWQiLE1TRU5ETUFYKTsgLyogU0FGRSAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKyNlbmRpZiAvKiBNU0VORE1BWCAqLworCisjaWZkZWYgTUFYRERJUgorICAgIHNwcmludGYobGluZSwiTUFYRERJUj0lZCIsTUFYRERJUik7IC8qIFNBRkUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksbGluZSk7CisjZW5kaWYgLyogTUFYRERJUiAqLworCisjaWZkZWYgTUFYRE5VTVMKKyAgICBzcHJpbnRmKGxpbmUsIk1BWEROVU1TPSVkIixNQVhETlVNUyk7IC8qIFNBRkUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksbGluZSk7CisjZW5kaWYgLyogTUFYRE5VTVMgKi8KKworI2lmZGVmIFVOSVgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlVOSVgiKTsKKyNlbmRpZiAvKiBVTklYICovCisjaWZkZWYgVk1TCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJWTVMiKTsKKyNpZmRlZiBfX1ZNU19WRVIKKyAgICBzcHJpbnRmKGxpbmUsIl9fVk1TX1ZFUj0lZCIsX19WTVNfVkVSKTsgLyogU0FGRSAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKyNlbmRpZiAvKiBfX1ZNU19WRVIgKi8KKyNpZmRlZiBWTVNWNzAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlZNU1Y3MCIpOworI2VuZGlmIC8qIFZNU1Y3MCAqLworI2VuZGlmIC8qIFZNUyAqLworI2lmZGVmIE9MRF9WTVMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk9MRF9WTVMiKTsKKyNlbmRpZiAvKiBPTERfVk1TICovCisjaWZkZWYgdm1zCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJ2bXMiKTsKKyNlbmRpZiAvKiB2bXMgKi8KKyNpZmRlZiBWTVNWNjAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlZNU1Y2MCIpOworI2VuZGlmIC8qIFZNU1Y2MCAqLworI2lmZGVmIFZNU1Y4MAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiVk1TVjgwIik7CisjZW5kaWYgLyogVk1TVjgwICovCisjaWZkZWYgVk1TU0hBUkUKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlZNU1NIQVJFIik7CisjZW5kaWYgLyogVk1TU0hBUkUgKi8KKyNpZmRlZiBOT1ZNU1NIQVJFCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT1ZNU1NIQVJFIik7CisjZW5kaWYgLyogTk9WTVNTSEFSRSAqLworI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJkYXRhZ2VuZXJhbCIpOworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjaWZkZWYgYXBvbGxvCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJhcG9sbG8iKTsKKyNlbmRpZiAvKiBhcG9sbG8gKi8KKyNpZmRlZiBhZWdpcworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiYWVnaXMiKTsKKyNlbmRpZiAvKiBhZWdpcyAqLworI2lmZGVmIEE5ODYKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkE5ODYiKTsKKyNlbmRpZiAvKiBBOTg2ICovCisjaWZkZWYgQU1JR0EKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkFNSUdBIik7CisjZW5kaWYgLyogQU1JR0EgKi8KKyNpZmRlZiBDT05WRVg5CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDT05WRVg5Iik7CisjZW5kaWYgLyogQ09OVkVYOSAqLworI2lmZGVmIENPTlZFWDEwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDT05WRVgxMCIpOworI2VuZGlmIC8qIENPTlZFWDkgKi8KKyNpZmRlZiBNQUMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk1BQyIpOworI2VuZGlmIC8qIE1BQyAqLworI2lmZGVmIEFVWAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQVVYIik7CisjZW5kaWYgLyogQVVYICovCisjaWZkZWYgT1MyCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJPUzIiKTsKKyNpZmRlZiBOVAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTlQiKTsKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIE9TSworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiT1M5Iik7CisjZW5kaWYgLyogT1NLICovCisjaWZkZWYgTVNET1MKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk1TRE9TIik7CisjZW5kaWYgLyogTVNET1MgKi8KKyNpZmRlZiBESVJFTlQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkRJUkVOVCIpOworI2VuZGlmIC8qIERJUkVOVCAqLworI2lmZGVmIFNESVJFTlQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlNESVJFTlQiKTsKKyNlbmRpZiAvKiBTRElSRU5UICovCisjaWZkZWYgTkRJUgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTkRJUiIpOworI2VuZGlmIC8qIE5ESVIgKi8KKyNpZmRlZiBYTkRJUgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiWE5ESVIiKTsKKyNlbmRpZiAvKiBYTkRJUiAqLworI2lmZGVmIFNBVkVEVUlECisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTQVZFRFVJRCIpOworI2VuZGlmIC8qIFNBVkVEVUlEICovCisjaWZkZWYgUkVOQU1FCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJSRU5BTUUiKTsKKyNlbmRpZiAvKiBSRU5BTUUgKi8KKyNpZmRlZiBDS19UTVBESVIKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX1RNUERJUiIpOworI2VuZGlmIC8qIENLX1RNUERJUiAqLworI2lmZGVmIE5PQ0NUUkFQCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT0NDVFJBUCIpOworI2VuZGlmIC8qIE5PQ0NUUkFQICovCisjaWZkZWYgTk9DT1RGTUMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk5PQ09URk1DIik7CisjZW5kaWYgLyogTk9DT1RGTUMgKi8KKyNpZmRlZiBOT0ZSSUxMUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTk9GUklMTFMiKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2lmZGVmIFBBUlNFTlNFCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJQQVJTRU5TRSIpOworI2VuZGlmIC8qIFBBUlNFTlNFICovCisjaWZkZWYgVElNRUgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlRJTUVIIik7CisjZW5kaWYgLyogVElNRUggKi8KKyNpZmRlZiBOT1RJTUVICisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJUSU1FSCIpOworI2VuZGlmIC8qIE5PVElNRUggKi8KKworI2lmZGVmIFNZU1RJTUVICisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTWVNUSU1FSCIpOworI2VuZGlmIC8qIFNZU1RJTUVIICovCisjaWZkZWYgTk9TWVNUSU1FSAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU1lTVElNRUgiKTsKKyNlbmRpZiAvKiBOT1NZU1RJTUVIICovCisKKyNpZmRlZiBTWVNUSU1FQkgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlNZU1RJTUVCSCIpOworI2VuZGlmIC8qIFNZU1RJTUVCSCAqLworI2lmZGVmIE5PU1lTVElNRUJICisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTWVNUSU1FQkgiKTsKKyNlbmRpZiAvKiBOT1NZU1RJTUVCSCAqLworI2lmZGVmIFVUSU1FSAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiVVRJTUVIIik7CisjZW5kaWYgLyogVVRJTUVIICovCisjaWZkZWYgU1lTVVRJTUVICisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTWVNVVElNRUgiKTsKKyNlbmRpZiAvKiBTWVNVVElNRUggKi8KKworI2lmZGVmIENLX05FRURfU0lHCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS19ORUVEX1NJRyIpOworI2VuZGlmIC8qIENLX05FRURfU0lHICovCisjaWZkZWYgQ0tfVFRZRkQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX1RUWUZEIik7CisjZW5kaWYgLyogQ0tfVFRZRkQgKi8KKyNpZmRlZiBORVRDT05OCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJORVRDT05OIik7CisjZW5kaWYgLyogTkVUQ09OTiAqLworI2lmZGVmIFRDUFNPQ0tFVAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiVENQU09DS0VUIik7CisjaWZkZWYgTk9UQ1BPUFRTCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT1RDUE9QVFMiKTsKKyNlbmRpZiAvKiBOT1RDUE9QVFMgKi8KKyNpZmRlZiBDS19ETlNfU1JWCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS19ETlNfU1JWIik7CisjZW5kaWYgLyogQ0tfRE5TX1NSViAqLworI2lmZGVmIE5PX0ROU19TUlYKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk5PX0ROU19TUlYiKTsKKyNlbmRpZiAvKiBOT19ETlNfU1JWICovCisjaWZkZWYgQ0tHSE5MSE9TVAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tHSE5MSE9TVCIpOworI2VuZGlmIC8qIENLR0hOTEhPU1QgKi8KKyNpZmRlZiBOT0xJU1RFTgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTk9MSVNURU4iKTsKKyNlbmRpZiAvKiBOT0xJU1RFTiAqLworI2lmZGVmIFNPTF9TT0NLRVQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlNPTF9TT0NLRVQiKTsKKyNlbmRpZiAvKiBTT0xfU09DS0VUICovCisjaWZkZWYgU09fT09CSU5MSU5FCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTT19PT0JJTkxJTkUiKTsKKyNlbmRpZiAvKiBTT19PT0JJTkxORSAqLworI2lmZGVmIFNPX0RPTlRST1VURQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU09fRE9OVFJPVVRFIik7CisjZW5kaWYgLyogU09fRE9OVFJPVVRFICovCisjaWZkZWYgU09fS0VFUEFMSVZFCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTT19LRUVQQUxJVkUiKTsKKyNlbmRpZiAvKiBTT19LRUVQQUxJVkUgKi8KKyNpZmRlZiBTT19MSU5HRVIKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlNPX0xJTkdFUiIpOworI2VuZGlmIC8qIFNPX0xJTkdFUiAqLworI2lmZGVmIFRDUF9OT0RFTEFZCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJUQ1BfTk9ERUxBWSIpOworI2VuZGlmIC8qIFRDUF9OT0RFTEFZICovCisjaWZkZWYgU09fU05EQlVGCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTT19TTkRCVUYiKTsKKyNlbmRpZiAvKiBTT19TTkRCVUYgKi8KKyNpZmRlZiBTT19SQ1ZCVUYKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlNPX1JDVkJVRiIpOworI2VuZGlmIC8qIFNPX1JDVkJVRiAqLworI2lmZGVmIGhfYWRkcgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiaF9hZGRyIik7CisjZW5kaWYgLyogaF9hZGRyICovCisjaWZkZWYgSEFERFJMSVNUCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJIQUREUkxJU1QiKTsKKyNlbmRpZiAvKiBIQUREUkxJU1QgKi8KKyNpZmRlZiBDS19TT0NLUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfU09DS1MiKTsKKyNpZmRlZiBDS19TT0NLUzUKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX1NPQ0tTNSIpOworI2VuZGlmIC8qIENLX1NPQ0tTNSAqLworI2lmZGVmIENLX1NPQ0tTX05TCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS19TT0NLU19OUyIpOworI2VuZGlmIC8qIENLX1NPQ0tTX05TICovCisjZW5kaWYgLyogQ0tfU09DS1MgKi8KKyNpZmRlZiBSTE9HQ09ERQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiUkxPR0NPREUiKTsKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2lmZGVmIE5FVENNRAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTkVUQ01EIik7CisjZW5kaWYgLyogTkVUQ01EICovCisjaWZkZWYgTk9ORVRDTUQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk5PTkVUQ01EIik7CisjZW5kaWYgLyogTk9ORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk5FVFBUWSIpOworI2VuZGlmIC8qIE5FVFBUWSAqLworI2lmZGVmIENLX0VOVklST05NRU5UCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS19FTlZJUk9OTUVOVCIpOworI2VuZGlmIC8qIENLX0VOVklST05NRU5UICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisjaWZkZWYgVE5DT0RFCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJUTkNPREUiKTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyNpZmRlZiBDS19GT1JXQVJEX1gKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX0ZPUldBUkRfWCIpOworI2VuZGlmIC8qIENLX0ZPUldBUkRfWCAqLworI2lmZGVmIFROX0NPTVBPUlQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlROX0NPTVBPUlQiKTsKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisjaWZkZWYgTVVMVElORVQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk1VTFRJTkVUIik7CisjZW5kaWYgLyogTVVMVElORVQgKi8KKyNpZmRlZiBERUNfVENQSVAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkRFQ19UQ1BJUCIpOworI2VuZGlmIC8qIERFQ19UQ1BJUCAqLworI2lmZGVmIFRDUFdBUkUKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlRDUFdBUkUiKTsKKyNlbmRpZiAvKiBUQ1BXQVJFICovCisjaWZkZWYgVUNYNTAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlVDWDUwIik7CisjZW5kaWYgLyogVUNYNTAgKi8KKyNpZmRlZiBDTVVfVENQSVAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNNVV9UQ1BJUCIpOworI2VuZGlmIC8qIENNVV9UQ1BJUCAqLworI2lmZGVmIFRUTEVCVUYKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlRUTEVCVUYiKTsKKyNlbmRpZiAvKiBUVExFQlVGICovCisjaWZkZWYgTkVUTEVCVUYKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk5FVExFQlVGIik7CisjZW5kaWYgLyogTkVUTEVCVUYgKi8KKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJJS1NfT1BUSU9OIik7CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworI2lmZGVmIElLU0RCCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJJS1NEQiIpOworI2VuZGlmIC8qIElLU0RCICovCisjaWZkZWYgSUtTRENPTkYKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIklLU0RDT05GIik7CisjZW5kaWYgLyogSUtTRENPTkYgKi8KKyNpZmRlZiBDS19MT0dJTgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfTE9HSU4iKTsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2lmZGVmIENLX1BBTQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfUEFNIik7CisjZW5kaWYgLyogQ0tfUEFNICovCisjaWZkZWYgQ0tfU0hBRE9XCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS19TSEFET1ciKTsKKyNlbmRpZiAvKiBDS19TSEFET1cgKi8KKyNpZmRlZiBDT05HU1BECisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDT05HU1BEIik7CisjZW5kaWYgLyogQ09OR1NQRCAqLworI2lmZGVmIFNVTlgyNQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU1VOWDI1Iik7CisjZW5kaWYgLyogU1VOWDI1ICovCisjaWZkZWYgSUJNWDI1CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJJQk1YMjUiKTsKKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNpZmRlZiBIUFgyNQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiSFBYMjUiKTsKKyNlbmRpZiAvKiBIUFgyNSAqLworI2lmZGVmIERFQ05FVAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiREVDTkVUIik7CisjZW5kaWYgLyogREVDTkVUICovCisjaWZkZWYgU1VQRVJMQVQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlNVUEVSTEFUIik7CisjZW5kaWYgLyogU1VQRVJMQVQgKi8KKyNpZmRlZiBOUElQRQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTlBJUEUiKTsKKyNlbmRpZiAvKiBOUElQRSAqLworI2lmZGVmIENLX05FVEJJT1MKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX05FVEJJT1MiKTsKKyNlbmRpZiAvKiBDS19ORVRCSU9TICovCisjaWZkZWYgQVRUNzMwMAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQVRUNzMwMCIpOworI2VuZGlmIC8qIEFUVDczMDAgKi8KKyNpZmRlZiBBVFQ2MzAwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJBVFQ2MzAwIik7CisjZW5kaWYgLyogQVRUNjMwMCAqLworI2lmZGVmIEhEQlVVQ1AKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkhEQlVVQ1AiKTsKKyNlbmRpZiAvKiBIREJVVUNQICovCisjaWZkZWYgVVNFVFRZTE9DSworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiVVNFVFRZTE9DSyIpOworI2VuZGlmIC8qIFVTRVRUWUxPQ0sgKi8KKyNpZmRlZiBVU0VfVVVfTE9DSworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiVVNFX1VVX0xPQ0siKTsKKyNlbmRpZiAvKiBVU0VfVVVfTE9DSyAqLworI2lmZGVmIEhBVkVfQkFVREJPWQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiSEFWRV9CQVVEQk9ZIik7CisjZW5kaWYgLyogSEFWRV9CQVVEQk9ZICovCisjaWZkZWYgTk9VVUNQCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT1VVQ1AiKTsKKyNlbmRpZiAvKiBOT1VVQ1AgKi8KKyNpZmRlZiBMT05HRk4KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkxPTkdGTiIpOworI2VuZGlmIC8qIExPTkdGTiAqLworI2lmZGVmIFJEQ0hLCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJSRENISyIpOworI2VuZGlmIC8qIFJEQ0hLICovCisjaWZkZWYgU0VMRUNUCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTRUxFQ1QiKTsKKyNlbmRpZiAvKiBTRUxFQ1QgKi8KKyNpZmRlZiBVU0xFRVAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlVTTEVFUCIpOworI2VuZGlmIC8qIFVTTEVFUCAqLworI2lmZGVmIE5BUAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTkFQIik7CisjZW5kaWYgLyogTkFQICovCisjaWZkZWYgTkFQSEFDSworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTkFQSEFDSyIpOworI2VuZGlmIC8qIE5BUEhBQ0sgKi8KKyNpZmRlZiBDS19QT0xMCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS19QT0xMIik7CisjZW5kaWYgLyogQ0tfUE9MTCAqLworI2lmZGVmIE5PSUVYVEVOCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT0lFWFRFTiIpOworI2VuZGlmIC8qIE5PSUVYVEVOICovCisjaWZkZWYgRVhDRUxBTgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiRVhDRUxBTiIpOworI2VuZGlmIC8qIEVYQ0VMQU4gKi8KKyNpZmRlZiBJTlRFUkxBTgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiSU5URVJMQU4iKTsKKyNlbmRpZiAvKiBJTlRFUkxBTiAqLworI2lmZGVmIE5PRklMRUgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk5PRklMRUgiKTsKKyNlbmRpZiAvKiBOT0ZJTEVIICovCisjaWZkZWYgTk9TWVNJT0NUTEgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk5PU1lTSU9DVExIIik7CisjZW5kaWYgLyogTk9TWVNJT0NUTEggKi8KKyNpZmRlZiBEQ0xQT1BFTgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiRENMUE9QRU4iKTsKKyNlbmRpZiAvKiBEQ0xQT1BFTiAqLworI2lmZGVmIE5PU0VUQlVGCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT1NFVEJVRiIpOworI2VuZGlmIC8qIE5PU0VUQlVGICovCisjaWZkZWYgTk9YRkVSCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT1hGRVIiKTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNpZmRlZiBOT0NVUlNFUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTk9DVVJTRVMiKTsKKyNlbmRpZiAvKiBOT0NVUlNFUyAqLworI2lmZGVmIE5PU0VSVkVSCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT1NFUlZFUiIpOworI2VuZGlmIC8qIE5PU0VSVkVSICovCisjaWZkZWYgTk9QQVRURVJOUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTk9QQVRURVJOUyIpOworI2Vsc2UKKyNpZmRlZiBQQVRURVJOUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiUEFUVEVSTlMiKTsKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworI2VuZGlmIC8qIE5PUEFUVEVSTlMgKi8KKyNpZmRlZiBOT0NLRVhFQworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTk9DS0VYRUMiKTsKKyNlbHNlCisjaWZkZWYgQ0tFWEVDCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS0VYRUMiKTsKKyNlbmRpZiAvKiBDS0VYRUMgKi8KKyNlbmRpZiAvKiBOT0NLRVhFQyAqLworI2lmZGVmIE5PQVVUT0RMCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT0FVVE9ETCIpOworI2VuZGlmIC8qIE5PQVVUT0RMICovCisjaWZkZWYgTk9NU0VORAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTk9NU0VORCIpOworI2VuZGlmIC8qIE5PTVNFTkQgKi8KKyNpZmRlZiBOT0ZEWkVSTworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTk9GRFpFUk8iKTsKKyNlbmRpZiAvKiBOT0ZEWkVSTyAqLworI2lmZGVmIE5PUE9QRU4KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk5PUE9QRU4iKTsKKyNlbmRpZiAvKiBOT1BPUEVOICovCisjaWZkZWYgTk9QQVJUSUFMCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT1BBUlRJQUwiKTsKKyNlbmRpZiAvKiBOT1BBUlRJQUwgKi8KKyNpZmRlZiBOT0tWRVJCUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTk9LVkVSQlMiKTsKKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworI2lmZGVmIE5PU0VUUkVVCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT1NFVFJFVSIpOworI2VuZGlmIC8qIE5PU0VUUkVVICovCisjaWZkZWYgTENLRElSCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJMQ0tESVIiKTsKKyNlbmRpZiAvKiBMQ0tESVIgKi8KKyNpZmRlZiBBQ1VDTlRSTAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQUNVQ05UUkwiKTsKKyNlbmRpZiAvKiBBQ1VDTlRSTCAqLworI2lmZGVmIEJTRDQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkJTRDQiKTsKKyNlbmRpZiAvKiBCU0Q0ICovCisjaWZkZWYgQlNENDQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkJTRDQ0Iik7CisjZW5kaWYgLyogQlNENDQgKi8KKyNpZmRlZiBCU0Q0MQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQlNENDEiKTsKKyNlbmRpZiAvKiBCU0Q0MSAqLworI2lmZGVmIEJTRDQzCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJCU0Q0MyIpOworI2VuZGlmIC8qIEJTRDQzICovCisjaWZkZWYgQlNEMjkKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkJTRDI5Iik7CisjZW5kaWYgLyogQlNEMjkgKi8KKyNpZmRlZiBCU0RJCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJCU0RJIik7CisjZW5kaWYgLyogQlNESSAqLworI2lmZGVmIF9fYnNkaV9fCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX2JzZGlfXyIpOworI2VuZGlmIC8qIF9fYnNkaV9fICovCisjaWZkZWYgX19OZXRCU0RfXworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX19OZXRCU0RfXyIpOworI2VuZGlmIC8qIF9fTmV0QlNEX18gKi8KKyNpZmRlZiBfX09wZW5CU0RfXworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX19PcGVuQlNEX18iKTsKKyNlbmRpZiAvKiBfX09wZW5CU0RfXyAqLworI2lmZGVmIF9fRnJlZUJTRF9fCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX0ZyZWVCU0RfXyIpOworI2VuZGlmIC8qIF9fRnJlZUJTRF9fICovCisjaWZkZWYgX19saW51eF9fCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX2xpbnV4X18iKTsKKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKyNpZmRlZiBMSU5VWF9ISV9TUEQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkxJTlVYX0hJX1NQRCIpOworI2VuZGlmIC8qIExJTlVYX0hJX1NQRCAqLworI2lmZGVmIExZTlhPUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTFlOWE9TIik7CisjZW5kaWYgLyogTFlOWE9TICovCisjaWZkZWYgVjcKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlY3Iik7CisjZW5kaWYgLyogVjcgKi8KKyNpZmRlZiBBSVgzNzAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkFJWDM3MCIpOworI2VuZGlmIC8qIEFJWDM3MCAqLworI2lmZGVmIFJUQUlYCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJSVEFJWCIpOworI2VuZGlmIC8qIFJUQUlYICovCisjaWZkZWYgSFBVWAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiSFBVWCIpOworI2VuZGlmIC8qIEhQVVggKi8KKyNpZmRlZiBIUFVYUFJFNjUKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkhQVVhQUkU2NSIpOworI2VuZGlmIC8qIEhQVVhQUkU2NSAqLworI2lmZGVmIERHVVgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkRHVVgiKTsKKyNlbmRpZiAvKiBER1VYICovCisjaWZkZWYgREdVWDQzMAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiREdVWDQzMCIpOworI2VuZGlmIC8qIERHVVg0MzAgKi8KKyNpZmRlZiBER1VYNTQwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJER1VYNTQwIik7CisjZW5kaWYgLyogREdVWDU0MCAqLworI2lmZGVmIERHVVg1NDMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkRHVVg1NDMiKTsKKyNlbmRpZiAvKiBER1VYNTQzICovCisjaWZkZWYgREdVWDU0NDEwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJER1VYNTQ0MTAiKTsKKyNlbmRpZiAvKiBER1VYNTQ0MTAgKi8KKyNpZmRlZiBER1VYNTQ0MTEKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkRHVVg1NDQxMSIpOworI2VuZGlmIC8qIERHVVg1NDQxMSAqLworI2lmZGVmIHNvbnlfbmV3cworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwic29ueV9uZXdzIik7CisjZW5kaWYgLyogc29ueV9uZXdzICovCisjaWZkZWYgQ0lFCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDSUUiKTsKKyNlbmRpZiAvKiBDSUUgKi8KKyNpZmRlZiBYRU5JWAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiWEVOSVgiKTsKKyNlbmRpZiAvKiBYRU5JWCAqLworI2lmZGVmIFNDT19YRU5JWAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU0NPX1hFTklYIik7CisjZW5kaWYgLyogU0NPX1hFTklYICovCisjaWZkZWYgSVNJSUkKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIklTSUlJIik7CisjZW5kaWYgLyogSVNJSUkgKi8KKyNpZmRlZiBJMzg2SVgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkkzODZJWCIpOworI2VuZGlmIC8qIEkzODZJWCAqLworI2lmZGVmIFJUVQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiUlRVIik7CisjZW5kaWYgLyogUlRVICovCisjaWZkZWYgUFJPVlgxCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJQUk9WWDEiKTsKKyNlbmRpZiAvKiBQUk9WWDEgKi8KKyNpZmRlZiBQWVJBTUlECisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJQWVJBTUlEIik7CisjZW5kaWYgLyogUFlSQU1JRCAqLworI2lmZGVmIFRPV0VSMQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiVE9XRVIxIik7CisjZW5kaWYgLyogVE9XRVIxICovCisjaWZkZWYgVVRFSworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiVVRFSyIpOworI2VuZGlmIC8qIFVURUsgKi8KKyNpZmRlZiBaSUxPRworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiWklMT0ciKTsKKyNlbmRpZiAvKiBaSUxPRyAqLworI2lmZGVmIFRSUzE2CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJUUlMxNiIpOworI2VuZGlmIC8qIFRSUzE2ICovCisjaWZkZWYgTUlOSVgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk1JTklYIik7CisjZW5kaWYgLyogTUlOSVggKi8KKyNpZmRlZiBDNzAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkM3MCIpOworI2VuZGlmIC8qIEM3MCAqLworI2lmZGVmIEFJWFBTMgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQUlYUFMyIik7CisjZW5kaWYgLyogQUlYUFMyICovCisjaWZkZWYgQUlYUlMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkFJWFJTIik7CisjZW5kaWYgLyogQUlYUlMgKi8KKyNpZmRlZiBVVFNWCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJVVFNWIik7CisjZW5kaWYgLyogVVRTViAqLworI2lmZGVmIEFUVFNWCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJBVFRTViIpOworI2VuZGlmIC8qIEFUVFNWICovCisjaWZkZWYgU1ZSMworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU1ZSMyIpOworI2VuZGlmIC8qIFNWUjMgKi8KKyNpZmRlZiBTVlI0CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTVlI0Iik7CisjZW5kaWYgLyogU1ZSNCAqLworI2lmZGVmIERFTExfU1ZSNAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiREVMTF9TVlI0Iik7CisjZW5kaWYgLyogREVMTF9TVlI0ICovCisjaWZkZWYgSUNMX1NWUjQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIklDTF9TVlI0Iik7CisjZW5kaWYgLyogSUNMX1NWUjQgKi8KKyNpZmRlZiBPU0YKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk9TRiIpOworI2VuZGlmIC8qIE9TRiAqLworI2lmZGVmIE9TRjEKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk9TRjEiKTsKKyNlbmRpZiAvKiBPU0YxICovCisjaWZkZWYgX19PU0YKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9fT1NGIik7CisjZW5kaWYgLyogX19PU0YgKi8KKyNpZmRlZiBfX09TRl9fCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX09TRl9fIik7CisjZW5kaWYgLyogX19PU0ZfXyAqLworI2lmZGVmIF9fb3NmX18KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9fb3NmX18iKTsKKyNlbmRpZiAvKiBfX29zZl9fICovCisjaWZkZWYgX19PU0YxCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX09TRjEiKTsKKyNlbmRpZiAvKiBfX09TRjEgKi8KKyNpZmRlZiBfX09TRjFfXworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX19PU0YxX18iKTsKKyNlbmRpZiAvKiBfX09TRjFfXyAqLworI2lmZGVmIFBUWAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiUFRYIik7CisjZW5kaWYgLyogUFRYICovCisjaWZkZWYgUE9TSVgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlBPU0lYIik7CisjZW5kaWYgLyogUE9TSVggKi8KKyNpZmRlZiBCU0Q0NE9SUE9TSVgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkJTRDQ0T1JQT1NJWCIpOworI2VuZGlmIC8qIEJTRDQ0T1JQT1NJWCAqLworI2lmZGVmIFNWT1JQT1NJWAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU1ZPUlBPU0lYIik7CisjZW5kaWYgLyogU1ZPUlBPU0lYICovCisjaWZkZWYgU1ZSNE9SUE9TSVgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlNWUjRPUlBPU0lYIik7CisjZW5kaWYgLyogU1ZSNE9SUE9TSVggKi8KKyNpZmRlZiBPUzJPUlZNUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiT1MyT1JWTVMiKTsKKyNlbmRpZiAvKiBPUzJPUlZNUyAqLworI2lmZGVmIE9TMk9SVU5JWAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiT1MyT1JVTklYIik7CisjZW5kaWYgLyogT1MyT1JVTklYICovCisjaWZkZWYgVk1TT1JVTklYCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJWTVNPUlVOSVgiKTsKKyNlbmRpZiAvKiBWTVNPUlVOSVggKi8KKyNpZmRlZiBWTVM2NEJJVAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiVk1TNjRCSVQiKTsJLyogVk1TIG9uIEFscGhhIG9yIElBNjQgKi8KKyNlbmRpZiAvKiBWTVM2NEJJVCAqLworI2lmZGVmIFZNU0k2NAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiVk1TSTY0Iik7IC8qIFZNUyBvbiBJQTY0ICovCisjZW5kaWYgLyogVk1TSTY0ICovCisjaWZkZWYgX1BPU0lYX1NPVVJDRQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX1BPU0lYX1NPVVJDRSIpOworI2VuZGlmIC8qIF9QT1NJWF9TT1VSQ0UgKi8KKyNpZmRlZiBfWE9QRU5fU09VUkNFCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfWE9QRU5fU09VUkNFIik7CisjZW5kaWYKKyNpZmRlZiBfQUxMX1NPVVJDRQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX0FMTF9TT1VSQ0UiKTsKKyNlbmRpZgorI2lmZGVmIF9TVklEMworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX1NWSUQzIik7CisjZW5kaWYgLyogX1NWSUQzICovCisjaWZkZWYgUGxhbjkKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlBsYW45Iik7CisjZW5kaWYgLyogUGxhbjkgKi8KKyNpZmRlZiBTT0xBUklTCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTT0xBUklTIik7CisjaWZkZWYgU09MQVJJUzI0CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTT0xBUklTMjQiKTsKKyNlbmRpZiAvKiBTT0xBUklTMjQgKi8KKyNpZmRlZiBTT0xBUklTMjUKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlNPTEFSSVMyNSIpOworI2VuZGlmIC8qIFNPTEFSSVMyNSAqLworI2lmZGVmIFNPTEFSSVMyNgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU09MQVJJUzI2Iik7CisjZW5kaWYgLyogU09MQVJJUzI2ICovCisjaWZkZWYgU09MQVJJUzcKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlNPTEFSSVM3Iik7CisjZW5kaWYgLyogU09MQVJJUzcgKi8KKyNpZmRlZiBTT0xBUklTOAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU09MQVJJUzgiKTsKKyNlbmRpZiAvKiBTT0xBUklTOCAqLworI2VuZGlmIC8qIFNPTEFSSVMgKi8KKworI2lmZGVmIFNVTk9TNAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU1VOT1M0Iik7CisjZW5kaWYgLyogU1VOT1M0ICovCisjaWZkZWYgU1VONFM1CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTVU40UzUiKTsKKyNlbmRpZiAvKiBTVU40UzUgKi8KKyNpZmRlZiBJUklYCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJJUklYIik7CisjZW5kaWYgLyogSVJJWCAqLworI2lmZGVmIEVOQ09SRQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiRU5DT1JFIik7CisjZW5kaWYgLyogRU5DT1JFICovCisjaWZkZWYgdWx0cml4CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJ1bHRyaXgiKTsKKyNlbmRpZgorI2lmZGVmIHN4YUU1MAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwic3hhRTUwIik7CisjZW5kaWYKKyNpZmRlZiBtaXBzCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJtaXBzIik7CisjZW5kaWYKKyNpZmRlZiBNSVBTCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJNSVBTIik7CisjZW5kaWYKKyNpZmRlZiB2YXgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksInZheCIpOworI2VuZGlmCisjaWZkZWYgVkFYCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJWQVgiKTsKKyNlbmRpZgorI2lmZGVmIGFscGhhCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJhbHBoYSIpOworI2VuZGlmCisjaWZkZWYgQUxQSEEKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkFMUEhBIik7CisjZW5kaWYKKyNpZmRlZiBfX0FMUEhBCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX0FMUEhBIik7CisjZW5kaWYKKyNpZmRlZiBfX2FscGhhCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX2FscGhhIik7CisjZW5kaWYKKyNpZmRlZiBfX0FYUAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX19BWFAiKTsKKyNlbmRpZgorI2lmZGVmIEFYUAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQVhQIik7CisjZW5kaWYKKyNpZmRlZiBheHAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksImF4cCIpOworI2VuZGlmCisjaWZkZWYgX19BTFBIQV9fCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX0FMUEhBX18iKTsKKyNlbmRpZgorI2lmZGVmIF9fYWxwaGFfXworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX19hbHBoYV9fIik7CisjZW5kaWYKKyNpZmRlZiBzdW4KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksInN1biIpOworI2VuZGlmCisjaWZkZWYgc3VuMworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwic3VuMyIpOworI2VuZGlmCisjaWZkZWYgc3VuMzg2CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJzdW4zODYiKTsKKyNlbmRpZgorI2lmZGVmIF9TVU4KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9TVU4iKTsKKyNlbmRpZgorI2lmZGVmIHN1bjQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksInN1bjQiKTsKKyNlbmRpZgorI2lmZGVmIHNwYXJjCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJzcGFyYyIpOworI2VuZGlmCisjaWZkZWYgX0NSQVkKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9DUkFZIik7CisjZW5kaWYgLyogX0NSQVkgKi8KKyNpZmRlZiBORVhUMzMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk5FWFQzMyIpOworI2VuZGlmCisjaWZkZWYgTkVYVAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTkVYVCIpOworI2VuZGlmCisjaWZkZWYgTmVYVAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTmVYVCIpOworI2VuZGlmCisjaWZkZWYgTUFDSAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTUFDSCIpOworI2VuZGlmCisKKyNpZmRlZiBNQUNPU1gKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk1BQ09TWCIpOworI2VuZGlmCisjaWZkZWYgTUFDT1NYMTAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk1BQ09TWDEwIik7CisjZW5kaWYKKyNpZmRlZiBNQUNPU1gxMDMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk1BQ09TWDEwMyIpOworI2VuZGlmCisKKyNpZmRlZiBzZ2kKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksInNnaSIpOworI2VuZGlmCisjaWZkZWYgTV9TWVM1CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJNX1NZUzUiKTsKKyNlbmRpZgorI2lmZGVmIF9fU1lTVEVNX0ZJVkUKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9fU1lTVEVNX0ZJVkUiKTsKKyNlbmRpZgorI2lmZGVmIHN5c1YKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksInN5c1YiKTsKKyNlbmRpZgorI2lmZGVmIE1fWEVOSVggICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNDTyBYZW5peCBWIGFuZCBVTklYLzM4NiAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTV9YRU5JWCIpOworI2VuZGlmCisjaWZkZWYgTV9VTklYICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0NPIFVOSVggKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk1fVU5JWCIpOworI2VuZGlmCisjaWZkZWYgX01fVU5JWCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0NPIFVOSVggMy4ydjQgPSBPRFQgMi4wICovCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfTV9VTklYIik7CisjZW5kaWYKKyNpZmRlZiBDS19TQ09WNQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfU0NPVjUiKTsKKyNlbmRpZgorI2lmZGVmIFNDT19PU1I1MDQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlNDT19PU1I1MDQiKTsKKyNlbmRpZgorI2lmZGVmIE1fSUE2NAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTV9JQTY0Iik7CisjZW5kaWYKKyNpZmRlZiBfTV9JQTY0CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfTV9JQTY0Iik7CisjZW5kaWYKKyNpZmRlZiBpYTY0CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJpYTY0Iik7CisjZW5kaWYKKyNpZmRlZiBfaWE2NAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX2lhNjQiKTsKKyNlbmRpZgorI2lmZGVmIF9pYTY0XworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX2lhNjRfIik7CisjZW5kaWYKKyNpZmRlZiBfX2lhNjQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9faWE2NCIpOworI2VuZGlmCisjaWZkZWYgTV9JNjg2CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJNX0k2ODYiKTsKKyNlbmRpZgorI2lmZGVmIF9NX0k2ODYKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9NX0k2ODYiKTsKKyNlbmRpZgorI2lmZGVmIGk2ODYKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksImk2ODYiKTsKKyNlbmRpZgorI2lmZGVmIE1fSTU4NgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTV9JNTg2Iik7CisjZW5kaWYKKyNpZmRlZiBfTV9JNTg2CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfTV9JNTg2Iik7CisjZW5kaWYKKyNpZmRlZiBpNTg2CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJpNTg2Iik7CisjZW5kaWYKKyNpZmRlZiBNX0k0ODYKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk1fSTQ4NiIpOworI2VuZGlmCisjaWZkZWYgX01fSTQ4NgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX01fSTQ4NiIpOworI2VuZGlmCisjaWZkZWYgaTQ4NgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiaTQ4NiIpOworI2VuZGlmCisjaWZkZWYgTV9JMzg2CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJNX0kzODYiKTsKKyNlbmRpZgorI2lmZGVmIF9NX0kzODYKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9NX0kzODYiKTsKKyNlbmRpZgorI2lmZGVmIGkzODYKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksImkzODYiKTsKKyNlbmRpZgorI2lmZGVmIGkyODYKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksImkyODYiKTsKKyNlbmRpZgorI2lmZGVmIE1fSTI4NgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTV9JMjg2Iik7CisjZW5kaWYKKyNpZmRlZiBtYzY4MDAwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJtYzY4MDAwIik7CisjZW5kaWYKKyNpZmRlZiBtYzY4MDEwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJtYzY4MDEwIik7CisjZW5kaWYKKyNpZmRlZiBtYzY4MDIwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJtYzY4MDIwIik7CisjZW5kaWYKKyNpZmRlZiBtYzY4MDMwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJtYzY4MDMwIik7CisjZW5kaWYKKyNpZmRlZiBtYzY4MDQwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJtYzY4MDQwIik7CisjZW5kaWYKKyNpZmRlZiBNXzY4MDAwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJNXzY4MDAwIik7CisjZW5kaWYKKyNpZmRlZiBNXzY4MDEwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJNXzY4MDEwIik7CisjZW5kaWYKKyNpZmRlZiBNXzY4MDIwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJNXzY4MDIwIik7CisjZW5kaWYKKyNpZmRlZiBNXzY4MDMwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJNXzY4MDMwIik7CisjZW5kaWYKKyNpZmRlZiBNXzY4MDQwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJNXzY4MDQwIik7CisjZW5kaWYKKyNpZmRlZiBtNjhrCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJtNjhrIik7CisjZW5kaWYKKyNpZmRlZiBtODhrCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJtODhrIik7CisjZW5kaWYKKyNpZmRlZiBwZHAxMQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwicGRwMTEiKTsKKyNlbmRpZgorI2lmZGVmIGlBUFgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksImlBUFgiKTsKKyNlbmRpZgorI2lmZGVmIGhwdXgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksImhwdXgiKTsKKyNlbmRpZgorI2lmZGVmIF9faHB1eAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX19ocHV4Iik7CisjZW5kaWYKKyNpZmRlZiBfX2hwOTAwMHM4MDAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9faHA5MDAwczgwMCIpOworI2VuZGlmCisjaWZkZWYgX19ocDkwMDBzNzAwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX2hwOTAwMHM3MDAiKTsKKyNlbmRpZgorI2lmZGVmIF9faHA5MDAwczUwMAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX19ocDkwMDBzNTAwIik7CisjZW5kaWYKKyNpZmRlZiBfX2hwOTAwMHMzMDAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9faHA5MDAwczMwMCIpOworI2VuZGlmCisjaWZkZWYgX19ocDkwMDBzMjAwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX2hwOTAwMHMyMDAiKTsKKyNlbmRpZgorI2lmZGVmIEFJWAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQUlYIik7CisjZW5kaWYKKyNpZmRlZiBfQUlYRlMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9BSVhGUyIpOworI2VuZGlmCisjaWZkZWYgdTM3MAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwidTM3MCIpOworI2VuZGlmCisjaWZkZWYgdTNiCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJ1M2IiKTsKKyNlbmRpZgorI2lmZGVmIHUzYjIKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksInUzYjIiKTsKKyNlbmRpZgorI2lmZGVmIG11bHRpbWF4CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJtdWx0aW1heCIpOworI2VuZGlmCisjaWZkZWYgYmFsYW5jZQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiYmFsYW5jZSIpOworI2VuZGlmCisjaWZkZWYgaWJtcnQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksImlibXJ0Iik7CisjZW5kaWYKKyNpZmRlZiBfSUJNUlQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9JQk1SVCIpOworI2VuZGlmCisjaWZkZWYgaWJtcnM2MDAwCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJpYm1yczYwMDAiKTsKKyNlbmRpZgorI2lmZGVmIF9BSVgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9BSVgiKTsKKyNlbmRpZiAvKiBfQUlYICovCisjaWZkZWYgX0lCTVIyCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfSUJNUjIiKTsKKyNlbmRpZgorI2lmZGVmIFVOSVhXQVJFCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJVTklYV0FSRSIpOworI2VuZGlmCisjaWZkZWYgUU5YCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJRTlgiKTsKKyNpZmRlZiBfX1FOWF9fCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX1FOWF9fIik7CisjaWZkZWYgX18xNkJJVF9fCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfXzE2QklUX18iKTsKKyNlbmRpZgorI2lmZGVmIENLX1FOWDE2CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS19RTlgxNiIpOworI2VuZGlmCisjaWZkZWYgX18zMkJJVF9fCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfXzMyQklUX18iKTsKKyNlbmRpZgorI2lmZGVmIENLX1FOWDMyCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS19RTlgzMiIpOworI2VuZGlmCisjZW5kaWYgLyogX19RTlhfXyAqLworI2VuZGlmIC8qIFFOWCAqLworCisjaWZkZWYgUU5YNgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiUU5YNiIpOworI2VuZGlmIC8qIFFOWDYgKi8KKworI2lmZGVmIE5FVVRSSU5PCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJORVVUUklOTyIpOworI2VuZGlmIC8qIE5FVVRSSU5PICovCisKKyNpZmRlZiBfX1NUUklDVF9CU0RfXworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX19TVFJJQ1RfQlNEX18iKTsKKyNlbmRpZgorI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX19TVFJJQ1RfQU5TSV9fIik7CisjZW5kaWYKKyNpZmRlZiBfQU5TSV9DX1NPVVJDRQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX0FOU0lfQ19TT1VSQ0UiKTsKKyNlbmRpZgorI2lmZGVmIF9fU1REQ19fCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX1NURENfXyIpOworI2VuZGlmCisjaWZkZWYgX19ERUNDCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX0RFQ0MiKTsKKyNpZmRlZiBfX0RFQ0NfVkVSCisgICAgc3ByaW50ZihsaW5lLCJfX0RFQ0NfVkVSPSVkIixfX0RFQ0NfVkVSKTsgLyogU0FGRSAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKyNlbmRpZiAvKiBfX0RFQ0NfVkVSICovCisjZW5kaWYgLyogX19ERUNDICovCisjaWZkZWYgX19DUlRMX1ZFUgorICAgIHNwcmludGYobGluZSwiX19DUlRMX1ZFUj0lZCIsX19DUlRMX1ZFUik7IC8qIFNBRkUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksbGluZSk7CisjZW5kaWYgLyogX19DUlRMX1ZFUiAqLworI2lmZGVmIF9fR05VQ19fICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdjYyBpbiBhbnNpIG1vZGUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9fR05VQ19fIik7CisjZW5kaWYKKyNpZmRlZiBHTlVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnY2MgaW4gdHJhZGl0aW9uYWwgbW9kZSAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiR05VQyIpOworI2VuZGlmCisjaWZkZWYgX19FR0NTX18gICAgICAgICAgICAgICAgICAgICAgICAgLyogZWdjcyBpbiBhbnNpIG1vZGUgKi8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9fRUdDU19fIik7CisjZW5kaWYKKyNpZmRlZiBfX2VnY3NfXyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlZ2NzIGluIGFuc2kgbW9kZSAqLworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX19lZ2NzX18iKTsKKyNlbmRpZgorI2lmZGVmIF9fV0FUQ09NQ19fCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfX1dBVENPTUNfXyIpOworI2VuZGlmCisjaWZkZWYgQ0tfQU5TSUMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX0FOU0lDIik7CisjZW5kaWYKKyNpZmRlZiBDS19BTlNJTElCUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfQU5TSUxJQlMiKTsKKyNlbmRpZgorI2lmZGVmIENLQ09OSU5UQjRDQgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tDT05JTlRCNENCIik7CisjZW5kaWYgLyogQ0tDT05JTlRCNENCICovCisjaWZkZWYgTk9URVJNQ0FQCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT1RFUk1DQVAiKTsKKyNlbmRpZiAvKiBOT1RFUk1DQVAgKi8KKyNpZmRlZiBfX0dMSUJDX18KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIl9fR0xJQkNfXyIpOworI2VuZGlmCisjaWZkZWYgX1NDX0pPQl9DT05UUk9MCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfU0NfSk9CX0NPTlRST0wiKTsKKyNlbmRpZgorI2lmZGVmIF9QT1NJWF9KT0JfQ09OVFJPTAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX1BPU0lYX0pPQl9DT05UUk9MIik7CisjZW5kaWYKKyNpZmRlZiBTSUdfSQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU0lHX0kiKTsKKyNlbmRpZiAvKiBTSUdfSSAqLworI2lmZGVmIFNJR19WCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTSUdfViIpOworI2VuZGlmIC8qIFNJR19WICovCisjaWZkZWYgQ0tfUE9TSVhfU0lHCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS19QT1NJWF9TSUciKTsKKyNlbmRpZgorI2lmZGVmIFNWUjNKQworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU1ZSM0pDIik7CisjZW5kaWYKKyNpZmRlZiBfMzg2QlNECisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfMzg2QlNEIik7CisjZW5kaWYKKyNpZmRlZiBfQlNECisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJfQlNEIik7CisjZW5kaWYKKyNpZmRlZiBVU0VfTUVNQ1BZCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJVU0VfTUVNQ1BZIik7CisjZW5kaWYgLyogVVNFX01FTUNQWSAqLworI2lmZGVmIFVTRV9MU1RBVAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiVVNFX0xTVEFUIik7CisjZW5kaWYgLyogVVNFX0xTVEFUICovCisjaWZkZWYgVEVSTUlPWAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiVEVSTUlPWCIpOworI2VuZGlmIC8qIFRFUk1JT1ggKi8KKyNpZmRlZiBTVEVSTUlPWAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU1RFUk1JT1giKTsKKyNlbmRpZiAvKiBTVEVSTUlPWCAqLworI2lmZGVmIENLX0NVUlNFUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfQ1VSU0VTIik7CisjZW5kaWYgLyogQ0tfQ1VSU0VTICovCisjaWZkZWYgQ0tfTkVXVEVSTQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfTkVXVEVSTSIpOworI2VuZGlmIC8qIENLX05FV1RFUk0gKi8KKyNpZmRlZiBDS19XUkVGUkVTSAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfV1JFRlJFU0giKTsKKyNlbmRpZiAvKiBDS19XUkVGUkVTSCAqLworI2lmZGVmIENLX1BDVF9CQVIKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX1BDVF9CQVIiKTsKKyNlbmRpZiAvKiBDS19QQ1RfQkFSICovCisjaWZkZWYgQ0tfRFRSQ0QKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX0RUUkNEIik7CisjZW5kaWYgLyogQ0tfRFRSQ0QgKi8KKyNpZmRlZiBDS19EVFJDVFMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX0RUUkNUUyIpOworI2VuZGlmIC8qIENLX0RUUkNUUyAqLworI2lmZGVmIENLX1JUU0NUUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfUlRTQ1RTIik7CisjZW5kaWYgLyogQ0tfUlRTQ1RTICovCisjaWZkZWYgUE9TSVhfQ1JUU0NUUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiUE9TSVhfQ1JUU0NUUyIpOworI2VuZGlmIC8qIFBPU0lYX0NSVFNDVFMgKi8KKyNpZmRlZiBGSVhDUlRTQ1RTCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJGSVhDUlRTQ1RTIik7CisjZW5kaWYgLyogRklYQ1JUU0NUUyAqLworI2lmZGVmIEhXUEFSSVRZCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJIV1BBUklUWSIpOworI2VuZGlmIC8qIEhXUEFSSVRZICovCisjaWZkZWYgQ0tfU1lTSU5JCisjaWZkZWYgQ0tfSU5JX0EKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX0lOSV9BIik7CisgICAgY2ttYWttc2cobGluZSxMSU5CVUZTSVosIkNLX1NZU0lOST1cIiIsQ0tfU1lTSU5JLCJcIiIsTlVMTCk7CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLGxpbmUpOworI2Vsc2UKKyNpZmRlZiBDS19JTklfQgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfSU5JX0IiKTsKKyAgICBja21ha21zZyhsaW5lLExJTkJVRlNJWiwiQ0tfU1lTSU5JPVwiIixDS19TWVNJTkksIlwiIixOVUxMKTsKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksbGluZSk7CisjZWxzZQorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfU1lTSU5JIik7CisjZW5kaWYgLyogQ0tfSU5JX0IgKi8KKyNlbmRpZiAvKiBDS19JTklfQSAqLworI2VuZGlmIC8qIENLX0RTWVNJTkkgKi8KKyNpZmRlZiBDS19EU1lTSU5JCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS19EU1lTSU5JIik7CisjZW5kaWYgLyogQ0tfRFNZU0lOSSAqLworI2lmZGVmIENLX1RUR1dTSVoKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX1RUR1dTSVoiKTsKKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisjaWZkZWYgQ0tfTkFXUworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfTkFXUyIpOworI2VuZGlmIC8qIENLX05BV1MgKi8KKyNpZmRlZiBNRE1IVVAKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk1ETUhVUCIpOworI2VuZGlmIC8qIE1ETUhVUCAqLworI2lmZGVmIEhVUF9DTE9TRV9QT1NJWAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiSFVQX0NMT1NFX1BPU0lYIik7CisjZW5kaWYgLyogSFVQX0NMT1NFX1BPU0lYICovCisjaWZkZWYgTk9fSFVQX0NMT1NFX1BPU0lYCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT19IVVBfQ0xPU0VfUE9TSVgiKTsKKyNlbmRpZiAvKiBOT19IVVBfQ0xPU0VfUE9TSVggKi8KKyNpZmRlZiBEQ01EQlVGCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJEQ01EQlVGIik7CisjZW5kaWYgLyogRENNREJVRiAqLworI2lmZGVmIENLX1JFQ0FMTAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfUkVDQUxMIik7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisjaWZkZWYgQlJPV1NFUgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQlJPV1NFUiIpOworI2VuZGlmIC8qIEJST1dTRVIgKi8KKyNpZmRlZiBDTFNPUE4KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNMU09QTiIpOworI2VuZGlmIC8qIENMU09QTiAqLworI2lmZGVmIFNUUkFUVVMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlNUUkFUVVMiKTsKKyNlbmRpZiAvKiBTVFJBVFVTICovCisjaWZkZWYgX19WT1NfXworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiX19WT1NfXyIpOworI2VuZGlmIC8qIF9fVk9TX18gKi8KKyNpZmRlZiBTVFJBVFVTWDI1CisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTVFJBVFVTWDI1Iik7CisjZW5kaWYgLyogU1RSQVRVU1gyNSAqLworI2lmZGVmIE9TMk1PVVNFCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJPUzJNT1VTRSIpOworI2VuZGlmIC8qIE9TMk1PVVNFICovCisjaWZkZWYgQ0tfUkVYWAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tfUkVYWCIpOworI2VuZGlmIC8qIENLX1JFWFggKi8KKyNpZmRlZiBDS19USU1FUlMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX1RJTUVSUyIpOworI2VuZGlmIC8qIENLX1RJTUVSUyAqLworI2lmZGVmIFRUU1BETElTVAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiVFRTUERMSVNUIik7CisjZW5kaWYgLyogVFRTUERMSVNUICovCisjaWZkZWYgQ0tfUEVSTVMKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX1BFUk1TIik7CisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKyNpZmRlZiBDS1RVTklORworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tUVU5JTkciKTsKKyNlbmRpZiAvKiBDS1RVTklORyAqLworI2lmZGVmIE5FV0ZUUAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTkVXRlRQIik7CisjZW5kaWYgLyogTkVXRlRQICovCisjaWZkZWYgU1lTRlRQCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTWVNGVFAiKTsKKyNlbmRpZiAvKiBTWVNGVFAgKi8KKyNpZmRlZiBOT0ZUUAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiTk9GVFAiKTsKKyNlbmRpZiAvKiBOT0ZUUCAqLworI2lmZGVmIENLSFRUUAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tIVFRQIik7CisjZW5kaWYgLyogQ0tIVFRQICovCisjaWZkZWYgTk9IVFRQCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT0hUVFAiKTsKKyNlbmRpZiAvKiBOT0hUVFAgKi8KKyNpZmRlZiBDS1JPT1QKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLUk9PVCIpOworI2VuZGlmIC8qIENLUk9PVCAqLworI2lmZGVmIENLUkVBTFBBVEgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLUkVBTFBBVEgiKTsKKyNlbmRpZiAvKiBDS1JFQUxQQVRIICovCisjaWZkZWYgU1RSRUFNSU5HCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJTVFJFQU1JTkciKTsKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKyNpZmRlZiBVTlBSRUZJWFpFUk8KKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlVOUFJFRklYWkVSTyIpOworI2VuZGlmIC8qIFVOUFJFRklYWkVSTyAqLworI2lmZGVmIENLUkVHRVgKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLUkVHRVgiKTsKKyNlbmRpZiAvKiBDS1JFR0VYICovCisjaWZkZWYgWlhSRVdJTkQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIlpYUkVXSU5EIik7CisjZW5kaWYgLyogWlhSRVdJTkQgKi8KKyNpZmRlZiBDS1NZU0xPRworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiQ0tTWVNMT0ciKTsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworI2lmZGVmIFNZU0xPR0xFVkVMCisgICAgc3ByaW50ZihsaW5lLCJTWVNMT0dMRVZFTD0lZCIsU1lTTE9HTEVWRUwpOyAvKiBTQUZFICovCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLGxpbmUpOworI2VuZGlmIC8qIFNZU0xPR0xFVkVMICovCisjaWZkZWYgTk9TRVhQCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT1NFWFAiKTsKKyNlbmRpZiAvKiBOT1NFWFAgKi8KKyNpZmRlZiBDS0xFQVJOCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS0xFQVJOIik7CisjZWxzZQorI2lmZGVmIE5PTE9FQVJOCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJOT0xPRUFSTiIpOworI2VuZGlmIC8qIE5PTE9FQVJOICovCisjZW5kaWYgLyogQ0tMRUFSTiAqLworI2lmZGVmIE5PRkxPQVQKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIk5PRkxPQVQiKTsKKyNlbHNlCisjaWZkZWYgRk5GTE9BVAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiRk5GTE9BVCIpOworI2VuZGlmIC8qIEZORkxPQVQgKi8KKyNpZmRlZiBDS0ZMT0FUCisjaWZkZWYgR0ZUSU1FUgorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiR0ZUSU1FUiIpOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyNpZmRlZiBDS0ZMT0FUX1MKKyAgICBja21ha21zZyhsaW5lLExJTkJVRlNJWiwiQ0tGTE9BVD0iLENLRkxPQVRfUyxOVUxMLE5VTEwpOworICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSxsaW5lKTsKKyNlbHNlCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS0ZMT0FUIik7CisjZW5kaWYgLyogQ0tGTE9BVF9TICovCisjZW5kaWYgLyogQ0tGTE9BVCAqLworI2VuZGlmIC8qIE5PRkxPQVQgKi8KKworI2lmZGVmIFNTSAorICAgIG1ha2VzdHIoJihvcHRsaXN0W25vcHRsaXN0KytdKSwiU1NIIik7CisjZW5kaWYgLyogU1NIICovCisjaWZkZWYgTkVURExMCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJORVRETEwiKTsKKyNlbmRpZiAvKiBORVRETEwgKi8KKyNpZmRlZiBORVRGSUxFCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJORVRGSUxFIik7CisjZW5kaWYgLyogTkVURklMRSAqLworI2lmZGVmIENLX1RBUEkKKyAgICBtYWtlc3RyKCYob3B0bGlzdFtub3B0bGlzdCsrXSksIkNLX1RBUEkiKTsKKyNlbmRpZiAvKiBDS19UQVBJICovCisjaWZkZWYgQ0tfU1NMCisgICAgbWFrZXN0cigmKG9wdGxpc3Rbbm9wdGxpc3QrK10pLCJDS19TU0wiKTsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKworICAgIGRlYnVnKEYxMDEsImluaXRvcHRsaXN0IG5vcHRsaXN0IiwiIixub3B0bGlzdCk7CisgICAgc2hfc29ydChvcHRsaXN0LE5VTEwsbm9wdGxpc3QsMCwwLDApOworfQorCitpbnQKK3Nob2ZlYSgpIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgZmxhZyA9IDA7CisgICAgaW50IGxpbmVzID0gMTsKKyNpZmRlZiBGTkZMT0FUCisgICAgZXh0ZXJuIGludCBmcF9kaWdpdHMsIGZwX3JvdW5kaW5nOworI2VuZGlmIC8qIEZORkxPQVQgKi8KKyAgICBleHRlcm4gaW50IGJ5dGVvcmRlcjsKKyAgICBwcmludGYoIiVzXG4iLHZlcnNpbyk7CisgICAgaWYgKGluc2VydmVyKQorICAgICAgcmV0dXJuKDEpOworICAgIGRlYnVnKEYxMDEsInNob2ZlYSBOT1BUTElTVCIsIiIsTk9QVExJU1QpOworICAgIGluaXRvcHRsaXN0KCk7CisgICAgZGVidWcoRjEwMSwic2hvZmVhIG5vcHRsaXN0IiwiIixub3B0bGlzdCk7CisjaWZkZWYgT1MyCisjaWZkZWYgTlQKKyNpZmRlZiBfTV9BTFBIQQorICAgIHByaW50ZigiTWljcm9zb2Z0IFdpbmRvd3MgT3BlcmF0aW5nIFN5c3RlbXMgZm9yIEFscGhhIENQVXMuXG4iKTsKKyNlbHNlIC8qIF9NX0FMUEhBICovCisjaWZkZWYgX01fUFBDCisgICAgcHJpbnRmKCJNaWNyb3NvZnQgV2luZG93cyBPcGVyYXRpbmcgU3lzdGVtcyBmb3IgUG93ZXJQQyBDUFVzLlxuIik7CisjZWxzZSAvKiBfTV9QUEMgKi8KKyNpZmRlZiBfTV9NUlgwMDAKKyAgICBwcmludGYoIk1pY3Jvc29mdCBXaW5kb3dzIE9wZXJhdGluZyBTeXN0ZW1zIGZvciBNSVBTIENQVXMuXG4iKTsKKyNlbHNlIC8qIF9NX01SWDAwMCAqLworI2lmZGVmIF9NX0lYODYKKyAgICBwcmludGYoIk1pY3Jvc29mdCBXaW5kb3dzIE9wZXJhdGluZyBTeXN0ZW1zIGZvciAzMi1iaXQgSW50ZWwgQ1BVcy5cbiIpOworI2Vsc2UgLyogX01fSVg4NiAqLworICAgIFVOS05PV04gV0lORE9XUyBQTEFURk9STQorI2VuZGlmIC8qIF9NX0lYODYgKi8KKyNlbmRpZiAvKiBfTV9NUlgwMDAgKi8KKyNlbmRpZiAvKiBfTV9QUEMgKi8KKyNlbmRpZiAvKiBfTV9BTFBIQSAqLworI2Vsc2UgLyogTlQgKi8KKyNpZmRlZiBNX0kyODYKKyAgICBwcmludGYoIklCTSBPUy8yIDE2LWJpdC5cbiIpOworI2Vsc2UKKyAgICBwcmludGYoIklCTSBPUy8yIDMyLWJpdC5cbiIpOworI2VuZGlmIC8qIE1fSTI4NiAqLworI2VuZGlmIC8qIE5UICovCisgICAgbGluZXMrKzsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBwcmludGYoIlxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIk1ham9yIG9wdGlvbmFsIGZlYXR1cmVzIGluY2x1ZGVkOlxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKworI2lmZGVmIE5FVENPTk4KKyAgICBwcmludGYoIiBOZXR3b3JrIHN1cHBvcnQgKHR5cGUgU0hPVyBORVQgZm9yIGZ1cnRoZXIgaW5mbylcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjaWZkZWYgSUtTX09QVElPTgorICAgIHByaW50ZigiIFRlbG5ldCBLZXJtaXQgT3B0aW9uXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgIHByaW50ZigiIFRlbG5ldCBBdXRoZW50aWNhdGlvbiBPcHRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjaWZkZWYgQ0tfS0VSQkVST1MKKyNpZmRlZiBLUkI0CisjaWZkZWYgS1JCNQorICAgIHByaW50ZigiIEtlcmJlcm9zKFRNKSBJViBhbmQgS2VyYmVyb3MgViBhdXRoZW50aWNhdGlvblxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbHNlIC8qIEtSQjUgKi8KKyAgICBwcmludGYoIiBLZXJiZXJvcyhUTSkgSVYgYXV0aGVudGljYXRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogS1JCNSAqLworI2Vsc2UgLyogS1JCNCAqLworI2lmZGVmIEtSQjUKKyAgICBwcmludGYoIiBLZXJiZXJvcyhUTSkgViBhdXRoZW50aWNhdGlvblxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBLUkI1ICovCisjZW5kaWYgLyogS1JCNCAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisjaWZkZWYgQ0tfU1JQCisgICAgcHJpbnRmKCIgU1JQKFRNKSAoU2VjdXJlIFJlbW90ZSBQYXNzd29yZCkgYXV0aGVudGljYXRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogQ0tfU1JQICovCisjaWZkZWYgQ0tfU1NMCisgICAgcHJpbnRmKCIgU2VjdXJlIFNvY2tldHMgTGF5ZXIgKFNTTClcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCIgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIFNTSEJVSUxUSU4KKyAgICBwcmludGYoIiBTZWN1cmUgU2hlbGwgKFNTSCkgW2ludGVybmFsXVxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisjaWZkZWYgU1NIQ01ECisgICAgcHJpbnRmKCIgU2VjdXJlIFNoZWxsIChTU0gpIFtleHRlcm5hbF1cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogU1NIQ01EICovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIHByaW50ZigiIFRlbG5ldCBFbmNyeXB0aW9uIE9wdGlvblxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNpZmRlZiBDS19ERVMKKyAgICBwcmludGYoIiBUZWxuZXQgREVTIEVuY3J5cHRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogQ0tfREVTICovCisjaWZkZWYgQ0tfQ0FTVAorICAgIHByaW50ZigiIFRlbG5ldCBDQVNUIEVuY3J5cHRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogQ0tfQ0FTVCAqLworI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgS1JCNQorI2lmZGVmIEFMTE9XX0tSQl8zREVTX0VOQ1JZUFQKKyAgICBwcmludGYoIiBLZXJiZXJvcyAzREVTL0FFUyBUZWxuZXQgRW5jcnlwdGlvblxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBBTExPV19LUkJfM0RFU19FTkNSWVBUICovCisjZW5kaWYgLyogS1JCNSAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisjaWZkZWYgQ0tfRk9SV0FSRF9YCisgICAgcHJpbnRmKCIgWCBXaW5kb3dzIGZvcndhcmRpbmdcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogQ0tfRk9SV0FSRF9YICovCisjaWZkZWYgVE5fQ09NUE9SVAorICAgIHByaW50ZigiIFRlbG5ldCBSZW1vdGUgQ29tIFBvcnQgQ29udHJvbCBPcHRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworI2lmZGVmIENLX1NPQ0tTCisjaWZkZWYgQ0tfU09DS1M1CisgICAgcHJpbnRmKCIgU09DS1MgNVxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbHNlIC8qIENLX1NPQ0tTNSAqLworICAgIHByaW50ZigiIFNPQ0tTIDRcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogQ0tfU09DS1M1ICovCisjZW5kaWYgLyogQ0tfU09DS1MgKi8KKyNpZmRlZiBORVdGVFAKKyAgICBwcmludGYoIiBCdWlsdC1pbiBGVFAgY2xpZW50XG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorI2VuZGlmIC8qIE5FV0ZUUCAqLworI2lmZGVmIENLSFRUUAorICAgIHByaW50ZigiIEJ1aWx0LWluIEhUVFAgY2xpZW50XG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorI2VuZGlmIC8qIENLSFRUUCAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmZGVmIENLX1JUU0NUUworICAgIHByaW50ZigiIEhhcmR3YXJlIGZsb3cgY29udHJvbFxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBDS19SVFNDVFMgKi8KKworI2lmZGVmIENLX1hZWgorI2lmZGVmIFhZWl9JTlRFUk5BTAorICAgIHByaW50ZigiIEJ1aWx0LWluIFhZWk1PREVNIHByb3RvY29sc1xuIik7CisjZWxzZQorICAgIHByaW50ZigiIEV4dGVybmFsIFhZWk1PREVNIHByb3RvY29sIHN1cHBvcnRcbiIpOworI2VuZGlmIC8qIFhZWl9JTlRFUk5BTCAqLworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogQ0tfWFlaICovCisKKyNpZm5kZWYgTk9DU0VUUworICAgIHByaW50ZigiIExhdGluLTEgKFdlc3QgRXVyb3BlYW4pIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjaWZkZWYgTEFUSU4yCisgICAgcHJpbnRmKCIgTGF0aW4tMiAoRWFzdCBFdXJvcGVhbikgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvblxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBMQVRJTjIgKi8KKyNpZmRlZiBDWVJJTExJQworICAgIHByaW50ZigiIEN5cmlsbGljIChSdXNzaWFuLCBVa3JhaW5pYW4sIGV0YykgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvblxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBDWVJJTExJQyAqLworI2lmZGVmIEdSRUVLCisgICAgcHJpbnRmKCIgR3JlZWsgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvblxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBHUkVFSyAqLworI2lmZGVmIEhFQlJFVworICAgIHByaW50ZigiIEhlYnJldyBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorI2VuZGlmIC8qIEhFQlJFVyAqLworI2lmZGVmIEtBTkpJCisgICAgcHJpbnRmKCIgSmFwYW5lc2UgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvblxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBLQU5KSSAqLworI2lmZGVmIFVOSUNPREUKKyAgICBwcmludGYoIiBVbmljb2RlIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogVU5JQ09ERSAqLworI2lmZGVmIENLT1VOSQorICAgIGlmIChpc3VuaWNvZGUoKSkKKyAgICAgIHByaW50ZigiIFVuaWNvZGUgc3VwcG9ydCBmb3IgSVNPLTIwMjIgVGVybWluYWwgRW11bGF0aW9uXG4iKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIiBVbmljb2RlIHRyYW5zbGF0aW9uIGZvciBUZXJtaW5hbCBDaGFyYWN0ZXItU2V0c1xuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBDS09VTkkgKi8KKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyNpZmRlZiBORVRQVFkKKyAgICBwcmludGYoIiBQc2V1ZG90ZXJtaW5hbCBjb250cm9sXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorI2VuZGlmIC8qIE5FVFBUWSAqLworCisjaWZkZWYgQ0tfUkVESVIKKyAgICBwcmludGYoIiBSRURJUkVDVCBjb21tYW5kXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorI2VuZGlmIC8qIENLX1JFRElSICovCisKKyNpZmRlZiBDS19SRVNFTkQKKyAgICBwcmludGYoIiBSRVNFTkQgY29tbWFuZFxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBDS19SRVNFTkQgKi8KKworI2lmbmRlZiBOT1hGRVIKKyNpZmRlZiBDS19DVVJTRVMKKyAgICBwcmludGYoIiBGdWxsc2NyZWVuIGZpbGUgdHJhbnNmZXIgZGlzcGxheVxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBDS19DVVJTRVMgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIENLX1NQRUVECisgICAgcHJpbnRmKCIgQ29udHJvbC1jaGFyYWN0ZXIgdW5wcmVmaXhpbmdcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKworI2lmZGVmIFNUUkVBTUlORworICAgIHByaW50ZigiIFN0cmVhbWluZ1xuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKworI2lmZGVmIENLX0FVVE9ETAorICAgIHByaW50ZigiIEF1dG9kb3dubG9hZFxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBDS19BVVRPREwgKi8KKworI2lmZGVmIE9TMk1PVVNFCisgICAgcHJpbnRmKCIgTW91c2Ugc3VwcG9ydFxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBPUzJNT1VTRSAqLworCisjaWZkZWYgQ0tfUkVYWAorICAgIHByaW50ZigiIFJFWFggc2NyaXB0IGxhbmd1YWdlIGludGVyZmFjZVxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBDS19SRVhYICovCisKKyNpZmRlZiBJS1NECisjaWZkZWYgQ0tfTE9HSU4KKyAgICBwcmludGYoIiBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSB3aXRoIHVzZXIgbG9naW4gc3VwcG9ydFxuIik7CisjZWxzZSAvKiBDS19MT0dJTiAqLworICAgIHByaW50ZigiIEludGVybmV0IEtlcm1pdCBTZXJ2aWNlIHdpdGhvdXQgdXNlciBsb2dpbiBzdXBwb3J0XG4iKTsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgcHJpbnRmKCJcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCJNYWpvciBvcHRpb25hbCBmZWF0dXJlcyBub3QgaW5jbHVkZWQ6XG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorCisjaWZkZWYgTk9YRkVSCisgICAgcHJpbnRmKCIgTm8gZmlsZS10cmFuc2ZlciBwcm90b2NvbHNcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZWxzZQorI2lmbmRlZiBDS19DVVJTRVMKKyNpZm5kZWYgTUFDCisgICAgcHJpbnRmKCIgTm8gZnVsbHNjcmVlbiBmaWxlIHRyYW5zZmVyIGRpc3BsYXlcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogTUFDICovCisjZW5kaWYgLyogQ0tfQ1VSU0VTICovCisKKyNpZmRlZiBOT1NFUlZFUgorICAgIHByaW50ZigiIE5vIHNlcnZlciBtb2RlXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIE5PU0VSVkVSICovCisKKyNpZm5kZWYgQ0tfU1BFRUQKKyAgICBwcmludGYoIiBObyBjb250cm9sLWNoYXJhY3RlciB1bnByZWZpeGluZ1xuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBDS19TUEVFRCAqLworCisjaWZuZGVmIFNUUkVBTUlORworICAgIHByaW50ZigiIE5vIHN0cmVhbWluZ1xuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKworI2lmbmRlZiBDS19BVVRPREwKKyAgICBwcmludGYoIiBObyBhdXRvZG93bmxvYWRcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogQ0tfQVVUT0RMICovCisKKyNpZm5kZWYgQ0tfWFlaCisgICAgcHJpbnRmKCIgTm8gYnVpbHQtaW4gWFlaTU9ERU0gcHJvdG9jb2xzXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIENLX1hZWiAqLworCisjaWZkZWYgTk9UTE9HCisgICAgcHJpbnRmKCIgTm8gdHJhbnNhY3Rpb24gbG9nXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIE5PVExPRyAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgTk9ERUJVRworICAgIHByaW50ZigiIE5vIGRlYnVnZ2luZ1xuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBOT0RFQlVHICovCisKKyNpZmRlZiBOT0hFTFAKKyAgICBwcmludGYoIiBObyBidWlsdC1pbiBoZWxwXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIE5PSEVMUCAqLworCisjaWZkZWYgTk9MT0NBTAorICAgIHByaW50ZigiIE5vIG1ha2luZyBjb25uZWN0aW9uc1xuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbHNlCisjaWZuZGVmIE5FVENPTk4KKyAgICBwcmludGYoIiBObyBuZXR3b3JrIHN1cHBvcnRcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZWxzZSAvKiBORVRDT05OICovCisjaWZuZGVmIElLU19PUFRJT04KKyAgICBwcmludGYoIiBObyBUZWxuZXQgS2VybWl0IE9wdGlvblxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworCisjaWZkZWYgTk9TU0gKKyAgICBwcmludGYoIiBObyBTZWN1cmUgU2hlbGwgKFNTSClcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogTk9TU0ggKi8KKyNpZm5kZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICBwcmludGYoIiBObyBLZXJiZXJvcyhUTSkgYXV0aGVudGljYXRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCIgTm8gU1JQKFRNKSAoU2VjdXJlIFJlbW90ZSBQYXNzd29yZCkgcHJvdG9jb2xcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCIgTm8gU2VjdXJlIFNvY2tldHMgTGF5ZXIgKFNTTCkgcHJvdG9jb2xcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCIgTm8gVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIHByb3RvY29sXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIHByaW50ZigiIE5vIGVuY3J5cHRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZWxzZSAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmbmRlZiBDS19LRVJCRVJPUworICAgIHByaW50ZigiIE5vIEtlcmJlcm9zKFRNKSBhdXRoZW50aWNhdGlvblxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbHNlIC8qIENLX0tFUkJFUk9TICovCisjaWZuZGVmIEtSQjQKKyAgICBwcmludGYoIiBObyBLZXJiZXJvcyhUTSkgSVYgYXV0aGVudGljYXRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogS1JCNCAqLworI2lmbmRlZiBLUkI1CisgICAgcHJpbnRmKCIgTm8gS2VyYmVyb3MoVE0pIFYgYXV0aGVudGljYXRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogS1JCNSAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisjaWZuZGVmIENLX1NSUAorICAgIHByaW50ZigiIE5vIFNSUChUTSkgKFNlY3VyZSBSZW1vdGUgUGFzc3dvcmQpIGF1dGhlbnRpY2F0aW9uXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIENLX1NSUCAqLworI2lmbmRlZiBDS19TU0wKKyAgICBwcmludGYoIiBObyBTZWN1cmUgU29ja2V0cyBMYXllciAoU1NMKSBwcm90b2NvbFxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIiBObyBUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkgKFRMUykgcHJvdG9jb2xcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogQ0tfU1NMICovCisjaWZuZGVmIENLX0VOQ1JZUFRJT04KKyAgICBwcmludGYoIiBObyBUZWxuZXQgRW5jcnlwdGlvbiBPcHRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZWxzZSAvKiBDS19FTkNSWVBUSU9OICovCisjaWZuZGVmIE9TMgorI2lmbmRlZiBDS19ERVMKKyAgICBwcmludGYoIiBObyBUZWxuZXQgREVTIGVuY3J5cHRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogQ0tfREVTICovCisjaWZuZGVmIENLX0NBU1QKKyAgICBwcmludGYoIiBObyBUZWxuZXQgQ0FTVCBlbmNyeXB0aW9uXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIENLX0NBU1QgKi8KKyNpZmRlZiBDS19LRVJCRVJPUworI2lmZGVmIEtSQjUKKyNpZm5kZWYgQUxMT1dfS1JCXzNERVNfRU5DUllQVAorICAgIHByaW50ZigiIE5vIEtlcmJlcm9zIDNERVMvQUVTIFRlbG5ldCBFbmNyeXB0aW9uXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorI2VuZGlmIC8qIEFMTE9XX0tSQl8zREVTX0VOQ1JZUFQgKi8KKyNlbmRpZiAvKiBLUkI1ICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyNpZm5kZWYgQ0tfRk9SV0FSRF9YCisgICAgcHJpbnRmKCIgTm8gWCBXaW5kb3dzIGZvcndhcmRpbmdcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogQ0tfRk9SV0FSRF9YICovCisjaWZuZGVmIFROX0NPTVBPUlQKKyAgICBwcmludGYoIiBObyBUZWxuZXQgUmVtb3RlIENvbSBQb3J0IENvbnRyb2wgT3B0aW9uXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyNpZm5kZWYgQ0tfU09DS1MKKyAgICBwcmludGYoIiBObyBTT0NLU1xuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBDS19TT0NLUyAqLworI2lmbmRlZiBORVdGVFAKKyAgICBwcmludGYoIiBObyBidWlsdC1pbiBGVFAgY2xpZW50XG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorI2VuZGlmIC8qIE5FV0ZUUCAqLworI2lmZGVmIE5PSFRUUAorICAgIHByaW50ZigiIE5vIGJ1aWx0LWluIEhUVFAgY2xpZW50XG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorI2VuZGlmIC8qIE5PSFRUUCAqLworCisjaWZkZWYgTk9ESUFMCisgICAgcHJpbnRmKCIgTm8gRElBTCBjb21tYW5kXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2Vsc2UKKyNpZmRlZiBNSU5JRElBTAorICAgIHByaW50ZigiIFN1cHBvcnQgZm9yIG1vc3QgbW9kZW0gdHlwZXMgZXhjbHVkZWRcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogTUlOSURJQUwgKi8KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZm5kZWYgQ0tfUlRTQ1RTCisjaWZuZGVmIE1BQworICAgIHByaW50ZigiIE5vIGhhcmR3YXJlIGZsb3cgY29udHJvbFxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBDS19SVFNDVFMgKi8KKworI2lmZGVmIE5PWE1JVAorICAgIHByaW50ZigiIE5vIFRSQU5TTUlUIGNvbW1hbmRcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogTk9YTUlUICovCisKKyNpZmRlZiBOT1NDUklQVAorICAgIHByaW50ZigiIE5vIFNDUklQVCBjb21tYW5kXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIE5PU0NSSVBUICovCisKKyNpZmRlZiBOT1NQTAorICAgIHByaW50ZigiIE5vIHNjcmlwdCBwcm9ncmFtbWluZyBmZWF0dXJlc1xuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZkZWYgTk9DU0VUUworICAgIHByaW50ZigiIE5vIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZWxzZQorCisjaWZuZGVmIExBVElOMgorICAgIHByaW50ZigiIE5vIExhdGluLTIgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvblxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBMQVRJTjIgKi8KKworI2lmZGVmIE5PR1JFRUsKKyAgICBwcmludGYoIiBObyBHcmVlayBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIE5PR1JFRUsgKi8KKworI2lmZGVmIE5PSEVCUkVXCisgICAgcHJpbnRmKCIgTm8gSGVicmV3IGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogTk9IRUJSRVcgKi8KKworI2lmZGVmIE5PVU5JQ09ERQorICAgIHByaW50ZigiIE5vIFVuaWNvZGUgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvblxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBOT1VOSUNPREUgKi8KKworI2lmZGVmIE5PQ1lSSUwKKyAgICBwcmludGYoIiBObyBDeXJpbGxpYyBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIE5PQ1lSSUwgKi8KKworI2lmbmRlZiBLQU5KSQorICAgIHByaW50ZigiIE5vIEthbmppIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb25cbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogS0FOSkkgKi8KKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyNpZmRlZiBOT0NNREwKKyAgICBwcmludGYoIiBObyBjb21tYW5kLWxpbmUgYXJndW1lbnRzXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIE5PQ01ETCAqLworCisjaWZkZWYgTk9QVVNICisgICAgcHJpbnRmKCIgTm8gZXNjYXBlIHRvIHN5c3RlbVxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworI2lmZGVmIE5PSkMKKyNpZmRlZiBVTklYCisgICAgcHJpbnRmKCIgTm8gVU5JWCBqb2IgY29udHJvbFxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogTk9KQyAqLworCisjaWZkZWYgTk9TRVRLRVkKKyAgICBwcmludGYoIiBObyBTRVQgS0VZIGNvbW1hbmRcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKworI2lmbmRlZiBDS19SRURJUgorICAgIHByaW50ZigiIE5vIFJFRElSRUNUIG9yIFBJUEUgY29tbWFuZFxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBDS19SRURJUiAqLworCisjaWZkZWYgVU5JWAorI2lmbmRlZiBORVRQVFkKKyAgICBwcmludGYoIiBObyBwc2V1ZG90ZXJtaW5hbCBjb250cm9sXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIE5FVFBUWSAqLworI2VuZGlmIC8qIFVOSVggKi8KKworI2lmbmRlZiBDS19SRVNFTkQKKyAgICBwcmludGYoIiBObyBSRVNFTkQgY29tbWFuZFxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBDS19SRVNFTkQgKi8KKworI2lmZGVmIE9TMgorI2lmZGVmIF9fMzJCSVRfXworI2lmbmRlZiBPUzJNT1VTRQorICAgIHByaW50ZigiIE5vIE1vdXNlIHN1cHBvcnRcbiIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgZmxhZyA9IDE7CisjZW5kaWYgLyogX18zMkJJVF9fICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogT1MyTU9VU0UgKi8KKworI2lmZGVmIE9TMgorI2lmbmRlZiBOVAorI2lmbmRlZiBDS19SRVhYCisgICAgcHJpbnRmKCIgTm8gUkVYWCBzY3JpcHQgbGFuZ3VhZ2UgaW50ZXJmYWNlXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIGZsYWcgPSAxOworI2VuZGlmIC8qIENLX1JFWFggKi8KKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZuZGVmIElLU0QKKyAgICBwcmludGYoIiBObyBJbnRlcm5ldCBLZXJtaXQgU2VydmljZVxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBmbGFnID0gMTsKKyNlbmRpZiAvKiBJS1NEICovCisKKyAgICBpZiAoZmxhZyA9PSAwKSB7CisgICAgICAgIHByaW50ZigiIE5vbmVcbiIpOworICAgICAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykKKyAgICAgICAgICB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorCisjaWZkZWYgQ0tfVVRTTkFNRQorICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCJIb3N0IGluZm86XG4iKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIHByaW50ZigiIE1hY2hpbmU6ICAgICVzXG4iLHVubV9tY2hbMF0gPyB1bm1fbWNoIDogIih1bmtub3duKSIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCIgTW9kZWw6ICAgICAgJXNcbiIsdW5tX21vZFswXSA/IHVubV9tb2QgOiAiKHVua25vd24pIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIiBPUzogICAgICAgICAlc1xuIix1bm1fbmFtWzBdID8gdW5tX25hbSA6ICIodW5rbm93bikiKTsKKyAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeyBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsgfQorICAgIHByaW50ZigiIE9TIFJlbGVhc2U6ICVzXG4iLHVubV9yZWxbMF0gPyB1bm1fcmVsIDogIih1bmtub3duKSIpOworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisgICAgcHJpbnRmKCIgT1MgVmVyc2lvbjogJXNcbiIsdW5tX3ZlclswXSA/IHVubV92ZXIgOiAiKHVua25vd24pIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyAgICBwcmludGYoIlxuIik7CisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKyNlbmRpZiAvKiBDS19VVFNOQU1FICovCisKKy8qCisgIFByaW50IGNvbXBpbGUtdGltZSAoLUQpIG9wdGlvbnMsIGFzIHdlbGwgYXMgQyBwcmVwcm9jZXNzb3IKKyAgcHJlZGVmaW5lZCBzeW1ib2xzIHRoYXQgbWlnaHQgYWZmZWN0IHVzLi4uCisqLworI2lmZGVmIEtUQVJHRVQKKyAgICB7CisgICAgICAgIGNoYXIgKiBzOyAgICAgICAgICAgICAgICAgICAgICAgLyogTWFrZWZpbGUgdGFyZ2V0ICovCisgICAgICAgIHMgPSBLVEFSR0VUOworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgaWYgKCEqcykgcyA9ICIodW5rbm93bikiOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7CisgICAgICAgICAgICBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDEpOyBlbHNlIGxpbmVzID0gMDsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlRhcmdldDogJXNcbiIsIHMpOworICAgICAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeworICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS1RBUkdFVCAqLworCisjaWZkZWYgX19WRVJTSU9OX18KKyNpZmRlZiBfX0dOVUNfXworICAgIHByaW50ZigiR0NDIHZlcnNpb246ICVzXG4iLCBfX1ZFUlNJT05fXyk7CisjZWxzZQorICAgIHByaW50ZigiQ29tcGlsZXIgdmVyc2lvbjogJXNcbiIsIF9fVkVSU0lPTl9fKTsKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7IGlmICghYXNrbW9yZSgpKSByZXR1cm4oMSk7IGVsc2UgbGluZXMgPSAwOyB9CisjZW5kaWYgLyogX19WRVJTSU9OX18gKi8KKworI2lmZGVmIF9fREFURV9fICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdOVSBhbmQgb3RoZXIgQU5TSSAqLworI2lmZGVmIF9fVElNRV9fCisgICAgcHJpbnRmKCJDb21waWxlZCAlcyAlcywgb3B0aW9uczpcbiIsIF9fREFURV9fLCBfX1RJTUVfXyk7CisjZWxzZQorICAgIHByaW50ZigiQ29tcGlsZWQgJXMsIG9wdGlvbnM6XG4iLCBfX0RBVEVfXyk7CisjZW5kaWYgLyogX19USU1FX18gKi8KKyNlbHNlIC8qICFfX0RBVEVfXyAqLworICAgIHByaW50ZigiQ29tcGlsZXIgb3B0aW9uczpcbiIpOworI2VuZGlmIC8qIF9fREFURV9fICovCisgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsgaWYgKCFhc2ttb3JlKCkpIHJldHVybigxKTsgZWxzZSBsaW5lcyA9IDA7IH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBub3B0bGlzdDsgaSsrKSAgICAgIC8qIFByaW50IHNvcnRlZCBvcHRpb24gbGlzdCAqLworICAgICAgaWYgKCFwcnRvcHQoJmxpbmVzLG9wdGxpc3RbaV0pKQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAoIXBydG9wdCgmbGluZXMsIiIpKSByZXR1cm4oMCk7ICAvKiBTdGFydCBhIG5ldyBzZWN0aW9uICovCisKKy8qIFNpemVzIG9mIGRhdGEgdHlwZXMgKi8KKworICAgIGNrbWFrbXNnKGxpbmUsCisgICAgICAgICAgICAgTElOQlVGU0laLAorICAgICAgICAgICAgICJieXRlIG9yZGVyOiAiLAorICAgICAgICAgICAgIGJ5dGVvcmRlciA/ICJsaXR0bGUiIDogImJpZyIsCisgICAgICAgICAgICAgIiBlbmRpYW4iLAorICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICApOworICAgIGlmICghcHJ0b3B0KCZsaW5lcyxsaW5lKSkgcmV0dXJuKDApOworICAgIGlmICghcHJ0b3B0KCZsaW5lcywiIikpIHJldHVybigwKTsgIC8qIFN0YXJ0IGEgbmV3IHNlY3Rpb24gKi8KKyAgICBzcHJpbnRmKGxpbmUsInNpemVvZnM6IGludD0lbGQiLHNpemVvZihpbnQpKTsgLyogU0FGRSAqLworICAgIGlmICghcHJ0b3B0KCZsaW5lcyxsaW5lKSkgcmV0dXJuKDApOworICAgIHNwcmludGYobGluZSwibG9uZz0lbGQiLHNpemVvZihsb25nKSk7IC8qIFNBRkUgKi8KKyAgICBpZiAoIXBydG9wdCgmbGluZXMsbGluZSkpIHJldHVybigwKTsKKyAgICBzcHJpbnRmKGxpbmUsInNob3J0PSVsZCIsc2l6ZW9mKHNob3J0KSk7IC8qIFNBRkUgKi8KKyAgICBpZiAoIXBydG9wdCgmbGluZXMsbGluZSkpIHJldHVybigwKTsKKyAgICBzcHJpbnRmKGxpbmUsImNoYXI9JWxkIixzaXplb2YoY2hhcikpOyAvKiBTQUZFICovCisgICAgaWYgKCFwcnRvcHQoJmxpbmVzLGxpbmUpKSByZXR1cm4oMCk7CisgICAgc3ByaW50ZihsaW5lLCJjaGFyKj0lbGQiLHNpemVvZihjaGFyICopKTsgLyogU0FGRSAqLworICAgIGlmICghcHJ0b3B0KCZsaW5lcyxsaW5lKSkgcmV0dXJuKDApOworI2lmZGVmIExPTkdfTUFYCisgICAgc3ByaW50ZihsaW5lLCJMT05HX01BWD0lZCIsTE9OR19NQVgpOyAvKiBTQUZFICovCisjZW5kaWYgLyogTE9OR19NQVggKi8KKyNpZmRlZiBDS0ZMT0FUCisgICAgc3ByaW50ZihsaW5lLCJmbG9hdD0lbGQiLHNpemVvZihmbG9hdCkpOyAvKiBTQUZFICovCisgICAgaWYgKCFwcnRvcHQoJmxpbmVzLGxpbmUpKSByZXR1cm4oMCk7CisgICAgc3ByaW50ZihsaW5lLCJkb3VibGU9JWxkIixzaXplb2YoZG91YmxlKSk7IC8qIFNBRkUgKi8KKyAgICBpZiAoIXBydG9wdCgmbGluZXMsbGluZSkpIHJldHVybigwKTsKKyNpZmRlZiBGTkZMT0FUCisgICAgaWYgKCFwcnRvcHQoJmxpbmVzLCIiKSkgcmV0dXJuKDApOyAgLyogU3RhcnQgYSBuZXcgc2VjdGlvbiAqLworICAgIGlmICghcHJ0b3B0KCZsaW5lcywiZmxvYXRpbmctcG9pbnQ6IikpIHJldHVybigwKTsKKyAgICBzcHJpbnRmKGxpbmUsInByZWNpc2lvbj0lZCIsZnBfZGlnaXRzKTsgLyogU0FGRSAqLworICAgIGlmICghcHJ0b3B0KCZsaW5lcyxsaW5lKSkgcmV0dXJuKDApOworICAgIHNwcmludGYobGluZSwicm91bmRpbmc9JWQiLGZwX3JvdW5kaW5nKTsgLyogU0FGRSAqLworICAgIGlmICghcHJ0b3B0KCZsaW5lcyxsaW5lKSkgcmV0dXJuKDApOworI2VuZGlmIC8qIEZORkxPQVQgKi8KKyNlbmRpZiAvKiBDS0ZMT0FUICovCisKKyAgICBwcnRvcHQoJmxpbmVzLCIiKTsKKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogTk9TSE9XICovCisjZW5kaWYgLyogTk9JQ1AgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja3V1czYuYyBiL2NrZXJtaXQtOC4wLjIxMS9ja3V1czYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGNkODI4Ci0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrdXVzNi5jCkBAIC0wLDAgKzEsMTA4NzggQEAKKyNpbmNsdWRlICJja2NzeW0uaCIKKyNpZm5kZWYgTk9JQ1AKKworLyogIEMgSyBVIFUgUyA2IC0tICAiVXNlciBJbnRlcmZhY2UiIGZvciBVbml4IEtlcm1pdCAoUGFydCA2KSAgKi8KKworLyoKKyAgQXV0aG9yczoKKyAgICBGcmFuayBkYSBDcnV6IDxmZGNAY29sdW1iaWEuZWR1PiwKKyAgICAgIFRoZSBLZXJtaXQgUHJvamVjdCwgQ29sdW1iaWEgVW5pdmVyc2l0eSwgTmV3IFlvcmsgQ2l0eQorICAgIEplZmZyZXkgRSBBbHRtYW4gPGphbHRtYW5Ac2VjdXJlLWVuZHBvaW50cy5jb20+CisgICAgICBTZWN1cmUgRW5kcG9pbnRzIEluYy4sIE5ldyBZb3JrIENpdHkKKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorKi8KKworLyogSW5jbHVkZXMgKi8KKworI2luY2x1ZGUgImNrY2RlYi5oIgorI2luY2x1ZGUgImNrY2FzYy5oIgorI2luY2x1ZGUgImNrY2tlci5oIgorI2luY2x1ZGUgImNrdXVzci5oIgorI2luY2x1ZGUgImNrY3hsYS5oIgorI2luY2x1ZGUgImNrY25ldC5oIiAgICAgICAgICAgICAgICAgICAgIC8qIE5ldHdvcmsgc3ltYm9scyAqLworI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaWZkZWYgVk1TCisjaWZuZGVmIFRDUFNPQ0tFVAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogVk1TICovCisKKyNpZmRlZiBkYXRhZ2VuZXJhbAorI2RlZmluZSBmZ2V0cyhzdHJpbmdidWYsbWF4LGZkKSBkZ19mZ2V0cyhzdHJpbmdidWYsbWF4LGZkKQorI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisKKyNpZmRlZiBRTlg2CisjZGVmaW5lIHJlYWRibG9jayBrcmVhZGJsb2NrCisjZW5kaWYgLyogUU5YNiAqLworCisvKiBFeHRlcm5hbCBLZXJtaXQgVmFyaWFibGVzLCBzZWUgY2ttYWluLmMgZm9yIGRlc2NyaXB0aW9uLiAqLworCitleHRlcm4geHhfc3RycCB4eHN0cmluZzsKKworZXh0ZXJuIGludCBsb2NhbCwgeGl0c3RhLCBiaW5hcnksIHBhcml0eSwgZXNjYXBlLCBmbG93LCBjbWRfcm93cywgdHVybiwKKyAgdHVybmNoLCBkdXBsZXgsIGNreGVjaCwgc2VzbG9nLCBkZmxvYywgY25mbGcsIHRsZXZlbCwgcGZsYWcsIG1zZ2ZsZywgbWRtdHlwLAorICB6aW5jbnQsIHF1aWV0LCByZXBhcnMsIHRlY2hvLCBuZXR3b3JrLCBuenhvcHRzLCB3aGF0LCBmaWxlcGVlaywgcmVjdXJzaXZlOworCitleHRlcm4gaW50IHhhc2ttb3JlLCB0dF9yb3dzLCB0dF9jb2xzLCBjbWRfY29scywgZ19tYXRjaGRvdCwgZGlyYWN0aXZlLAorICB4Y21kc3JjLCBuc2NhbmZpbGUsIHJlbGlhYmxlLCBub2xpbmtzOworCisjaWZkZWYgVk1TT1JVTklYCitleHRlcm4gaW50IHpnZnNfZGlyLCB6Z2ZzX2xpbms7CisjZW5kaWYgLyogVk1TT1JVTklYICovCisKKyNpZmRlZiBDS19JRlJPCisgIGV4dGVybiBpbnQgcmVtb25seTsKKyNlbmRpZiAvKiBDS19JRlJPICovCisKKyNpZmRlZiBPUzIKK2V4dGVybiBpbnQgU3RhcnRlZEZyb21EaWFsZXIgOworZXh0ZXJuIGludCB2bW9kZTsKK2V4dGVybiBpbnQgazk1c3Rkb3V0OworI2lmbmRlZiBOVAorI2RlZmluZSBJTkNMX05PUE0KKyNkZWZpbmUgSU5DTF9WSU8gICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkZWQgZm9yIGNrb2Nvbi5oICovCisjaW5jbHVkZSA8b3MyLmg+CisjdW5kZWYgQ09NTUVOVAorI2Vsc2UKKyNkZWZpbmUgQVBJUkVUIFVMT05HCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHRhcGkuaD4KKyNpbmNsdWRlICJja250YXAuaCIKKyNlbmRpZiAvKiBOVCAqLworI2luY2x1ZGUgImNrb2Nvbi5oIgorI2VuZGlmIC8qIE9TMiAqLworCitleHRlcm4gbG9uZyB2ZXJudW0sIHNwZWVkOworZXh0ZXJuIGNoYXIgKnZlcnNpbywgKnByb3R2LCAqY2t4diwgKmNrenYsICpmbnN2LCAqY29ubnYsICpkZnR0eSwgKmNtZHY7CitleHRlcm4gY2hhciAqZGlhbHYsICpsb2dpbnYsICpmb3JfZGVmW10sICp3aGlsX2RlZltdLCAqeGlmX2RlZltdLCAqc3dfZGVmW107CitleHRlcm4gY2hhciAqZm96X2RlZltdOworZXh0ZXJuIGNoYXIgKmNreHN5cywgKmNrenN5czsKKyNpZm5kZWYgT1MyCitleHRlcm4gY2hhciAqRElSQ01EOworI2lmbmRlZiBVTklYCitleHRlcm4gY2hhciAqREVMQ01EOworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBPUzIgKi8KK2V4dGVybiBjaGFyIHR0bmFtZVtdLCBmaWxuYW1bXTsKK2V4dGVybiBDSEFSIHNzdGF0ZSwgZmVvbDsKK2V4dGVybiBjaGFyICp6aW5wdHI7CisKKyNpZmRlZiBVTklYCitleHRlcm4gY2hhciAqKiBtdGNoczsgICAgICAgICAgICAgICAgICAgLyogenhwYW5kKCkgZmlsZSBsaXN0ICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZuZGVmIE5PWEZFUgorZXh0ZXJuIGludCBvb3B0cywgb21vZGUsIG9uYW1lLCBvcGF0aDsgIC8qIE8tUGFja2V0IG9wdGlvbnMgKi8KKworZXh0ZXJuIGludCBzdGRpbmYsIHNuZHNyYywgc2l6ZSwgcnBzaXosIHVycHNpeiwgZm5jbnYsIGZucnBhdGgsIGRpc3BsYSwKKyAgc3Rkb3VmLCBpc2d1ZXN0LCBwa3Rsb2csIG5maWxzLCBrZWVwLCBtYXhycHMsIGZibGtzaXosIGZyZWNsLCBmcmVjZm0sCisgIGF0Y2FwciwgYXRkaXNvLCBzcHNpemYsIHNwc2l6LCBzcHNpenIsIHNwbWF4LCB3c2xvdHIsIHByZWZpeGluZywKKyAgZm5jYWN0LCBmbnNwYXRoLCBucHJvdG9zLCBnX3Byb3RvLCBnX3VycHNpeiwgZ19zcHNpemYsCisgIGdfc3BzaXosIGdfc3BzaXpyLCBnX3NwbWF4LCBnX3dzbG90ciwgZ19wcmVmaXhpbmcsIGdfZm5jYWN0LCBnX2ZuY252LAorICBnX2Zuc3BhdGgsIGdfZm5ycGF0aCwgeGZyeGxhLCBnX3hmcnhsYTsKKworZXh0ZXJuIGNoYXIgKmNtYXJnLCAqY21hcmcyOworCisjaWZuZGVmIE5PTVNFTkQgICAgICAgICAgICAgICAgICAgICAgICAgLyogTXVsdGlwbGUgU0VORCAqLworZXh0ZXJuIGNoYXIgKm1zZmlsZXNbXTsKKyNlbmRpZiAvKiBOT01TRU5EICovCitleHRlcm4gY2hhciBmc3BlY1tdOyAgICAgICAgICAgICAgICAgICAgLyogTW9zdCByZWNlbnQgZmlsZXNwZWMgKi8KK2V4dGVybiBpbnQgZnNwZWNsZW47CisKKyNpZmRlZiBDS19UTVBESVIKK2V4dGVybiBpbnQgZl90bXBkaXI7ICAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3RvcnkgY2hhbmdlZCB0ZW1wb3JhcmlseSAqLworZXh0ZXJuIGNoYXIgc2F2ZGlyW107ICAgICAgICAgICAgICAgICAgIC8qIEZvciBzYXZpbmcgY3VycmVudCBkaXJlY3RvcnkgKi8KKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKworZXh0ZXJuIHN0cnVjdCBrZXl0YWIgcHJvdG9zW107ICAgICAgICAgIC8qIEZpbGUgdHJhbnNmZXIgcHJvdG9jb2xzICovCitleHRlcm4gc3RydWN0IGNrX3AgcHRhYltOUFJPVE9TXTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIERDTURCVUYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlY2xhcmF0aW9ucyBmcm9tIGNtZCBwYWNrYWdlICovCitleHRlcm4gY2hhciAqY21kYnVmLCAqYXRtYnVmOyAgICAgICAgICAgLyogQ29tbWFuZCBidWZmZXJzICovCisjZWxzZQorZXh0ZXJuIGNoYXIgY21kYnVmW10sIGF0bWJ1ZltdOyAgICAgICAgIC8qIENvbW1hbmQgYnVmZmVycyAqLworI2VuZGlmIC8qIERDTURCVUYgKi8KKworZXh0ZXJuIGludCBub3B1c2g7CisKKyNpZm5kZWYgTk9TUEwKK2ludCBhc2tmbGFnID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBU0stY2xhc3MgY29tbWFuZCBhY3RpdmUgKi8KK2V4dGVybiBjaGFyICoqYV9wdHJbXTsKK2V4dGVybiBpbnQgYV9kaW1bXTsKK2V4dGVybiBjaGFyICoqbV94YXJnW107CitleHRlcm4gaW50IG5feGFyZ1tdOworZXh0ZXJuIHN0cnVjdCBtdGFiICptYWN0YWI7CitleHRlcm4gaW50IG5tYWM7CitleHRlcm4gbG9uZyBja19hbGFybTsKK2V4dGVybiBjaGFyIGFscm1fZGF0ZVtdLCBhbHJtX3RpbWVbXTsKK2V4dGVybiBpbnQgeF9pZm51bTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCitleHRlcm4gaW50IGluc2VydmVyOyAgICAgICAgICAgICAgICAgICAgLyogSSBhbSBJS1NEICovCitleHRlcm4gaW50IGJhY2tncmQ7ICAgICAgICAgICAgICAgICAgICAgLyogS2VybWl0IGV4ZWN1dGluZyBpbiBiYWNrZ3JvdW5kICovCitleHRlcm4gY2hhciBwc2F2ZVtdOyAgICAgICAgICAgICAgICAgICAgLyogRm9yIHNhdmluZyAmIHJlc3RvcmluZyBwcm9tcHQgKi8KK2V4dGVybiBjaGFyICp0cDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUZW1wb3JhcnkgYnVmZmVyICovCisKK2ludCByZWFkYmxvY2sgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAvKiBSRUFEIGJ1ZmZlciBzaXplICovCitDSEFSICogcmVhZGJ1ZiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byByZWFkIGJ1ZmZlciAqLworaW50IHJlYWRzaXplID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBjaGFycyBhY3R1YWxseSByZWFkICovCitpbnQgZ2V0Y21kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogR0VULWNsYXNzIGNvbW1hbmQgd2FzIGdpdmVuICovCisKK2V4dGVybiBpbnQgemNoa29kLCB6Y2hraWQ7CisKK3N0cnVjdCBrZXl0YWIgZGVsdGFiW10gPSB7ICAgICAgICAgICAgICAvKiBERUxFVEUgQ29tbWFuZCBPcHRpb25zICovCisgICAgeyAiL2FsbCIsICAgICAgICAgICBERUxfQUxMLCAgQ01fSU5WIH0sCisgICAgeyAiL2FmdGVyIiwgICAgICAgICBERUxfQUZULCAgQ01fQVJHIH0sCisgICAgeyAiL2FzayIsICAgICAgICAgICBERUxfQVNLLCAgMCB9LAorICAgIHsgIi9iZWZvcmUiLCAgICAgICAgREVMX0JFRiwgIENNX0FSRyB9LAorICAgIHsgIi9kaXJlY3RvcmllcyIsICAgREVMX0RJUiwgIDAgfSwKKyAgICB7ICIvZG90ZmlsZXMiLCAgICAgIERFTF9ET1QsICAwIH0sCisgICAgeyAiL2V4Y2VwdCIsICAgICAgICBERUxfRVhDLCAgQ01fQVJHIH0sCisgICAgeyAiL2hlYWRpbmciLCAgICAgICBERUxfSERHLCAgMCB9LAorICAgIHsgIi9sIiwgICAgICAgICAgICAgREVMX0xJUywgIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICIvbGFyZ2VyLXRoYW4iLCAgIERFTF9MQVIsICBDTV9BUkcgfSwKKyAgICB7ICIvbGlzdCIsICAgICAgICAgIERFTF9MSVMsICAwIH0sCisgICAgeyAiL2xvZyIsICAgICAgICAgICBERUxfTElTLCAgQ01fSU5WIH0sCisgICAgeyAiL25vYXNrIiwgICAgICAgICBERUxfTkFTLCAgMCB9LAorICAgIHsgIi9ub2RvdGZpbGVzIiwgICAgREVMX05PRCwgIDAgfSwKKyAgICB7ICIvbm9oZWFkaW5nIiwgICAgIERFTF9OT0gsICAwIH0sCisgICAgeyAiL25vbCIsICAgICAgICAgICBERUxfTk9MLCAgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgIi9ub2xpc3QiLCAgICAgICAgREVMX05PTCwgIDAgfSwKKyAgICB7ICIvbm9sb2ciLCAgICAgICAgIERFTF9OT0wsICBDTV9JTlYgfSwKKyAgICB7ICIvbm9wYWdlIiwgICAgICAgIERFTF9OT1AsICAwIH0sCisgICAgeyAiL25vdC1hZnRlciIsICAgICBERUxfTkFGLCAgQ01fQVJHIH0sCisgICAgeyAiL25vdC1iZWZvcmUiLCAgICBERUxfTkJGLCAgQ01fQVJHIH0sCisgICAgeyAiL25vdC1zaW5jZSIsICAgICBERUxfTkFGLCAgQ01fSU5WfENNX0FSRyB9LAorICAgIHsgIi9wYWdlIiwgICAgICAgICAgREVMX1BBRywgIDAgfSwKKyAgICB7ICIvcXVpZXQiLCAgICAgICAgIERFTF9RVUksICBDTV9JTlYgfSwKKyAgICB7ICIvcmVjdXJzaXZlIiwgICAgIERFTF9SRUMsICAwIH0sCisgICAgeyAiL3NpbXVsYXRlIiwgICAgICBERUxfU0lNLCAgMCB9LAorICAgIHsgIi9zaW5jZSIsICAgICAgICAgREVMX0FGVCwgIENNX0FSR3xDTV9JTlYgfSwKKyAgICB7ICIvc21hbGxlci10aGFuIiwgIERFTF9TTUEsICBDTV9BUkcgfSwKKyAgICB7ICIvc3VtbWFyeSIsICAgICAgIERFTF9TVU0sICAwIH0sCisgICAgeyAiL3RyZWUiLCAgICAgICAgICBERUxfQUxMLCAgMCB9LAorICAgIHsgIi90eXBlIiwgICAgICAgICAgREVMX1RZUCwgIENNX0FSRyB9LAorICAgIHsgIi92ZXJib3NlIiwgICAgICAgREVMX1ZSQiwgIENNX0lOViB9Cit9OworaW50IG5kZWx0YWIgPSBzaXplb2YoZGVsdGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYik7CisKKy8qIC9RVUlFVC0vVkVSQk9TRSAoL0xJU1QtL05PTElTVCkgKC9MT0ctL05PTE9HKSB0YWJsZSAqLworCitzdHJ1Y3Qga2V5dGFiIHF2c3d0YWJbXSA9IHsKKyAgICB7ICIvbCIsICAgICAgICAgICBERUxfTElTLCAgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgIi9saXN0IiwgICAgICAgIERFTF9MSVMsICAwIH0sCisgICAgeyAiL2xvZyIsICAgICAgICAgREVMX0xJUywgIENNX0lOViB9LAorICAgIHsgIi9ub2wiLCAgICAgICAgIERFTF9OT0wsICBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiL25vbGlzdCIsICAgICAgREVMX05PTCwgIDAgfSwKKyAgICB7ICIvbm9sb2ciLCAgICAgICBERUxfTk9MLCAgQ01fSU5WIH0sCisgICAgeyAiL3F1aWV0IiwgICAgICAgREVMX1FVSSwgIENNX0lOViB9LAorICAgIHsgIi92ZXJib3NlIiwgICAgIERFTF9WUkIsICBDTV9JTlYgfQorfTsKK2ludCBucXZzd3RhYiA9IHNpemVvZihxdnN3dGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYik7CisKK3N0cnVjdCBrZXl0YWIgY29weXRhYltdID0geworICAgIHsgIi9hcHBlbmQiLCAgICAgIDk5OCwgICAgICAwIH0sCisjaWZuZGVmIE5PU1BMCisgICAgeyAiL2Zyb21iNjQiLCAgICAgOTk3LCAgICAgIDAgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHsgIi9sIiwgICAgICAgICAgIERFTF9MSVMsICBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiL2xpc3QiLCAgICAgICAgREVMX0xJUywgIDAgfSwKKyAgICB7ICIvbG9nIiwgICAgICAgICBERUxfTElTLCAgQ01fSU5WIH0sCisgICAgeyAiL25vbCIsICAgICAgICAgREVMX05PTCwgIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICIvbm9saXN0IiwgICAgICBERUxfTk9MLCAgMCB9LAorICAgIHsgIi9ub2xvZyIsICAgICAgIERFTF9OT0wsICBDTV9JTlYgfSwKKyAgICB7ICIvcXVpZXQiLCAgICAgICBERUxfUVVJLCAgQ01fSU5WIH0sCisgICAgeyAiL3N3YXAtYnl0ZXMiLCAgOTk5LCAgICAgIDAgfSwKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICIvdG9iNjQiLCAgICAgICA5OTYsICAgICAgMCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisgICAgeyAiL3ZlcmJvc2UiLCAgICAgREVMX1ZSQiwgIENNX0lOViB9Cit9OworaW50IG5jb3B5dGFiID0gc2l6ZW9mKGNvcHl0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKTsKKworI2lmbmRlZiBOT1hGRVIKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGdldHRhYltdID0geyAgICAgICAvKiBHRVQgb3B0aW9ucyAqLworICAgIHsgIi9hcy1uYW1lIiwgICAgICAgICBTTkRfQVNOLCBDTV9BUkcgfSwKKyAgICB7ICIvYmluYXJ5IiwgICAgICAgICAgU05EX0JJTiwgMCB9LAorI2lmZGVmIENBTElCUkFURQorICAgIHsgIi9jYWxpYnJhdGUiLCAgICAgICBTTkRfQ0FMLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBDQUxJQlJBVEUgKi8KKyNpZmRlZiBQSVBFU0VORAorICAgIHsgIi9jb21tYW5kIiwgICAgICAgICBTTkRfQ01ELCBDTV9QU0ggfSwKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworICAgIHsgIi9kZWxldGUiLCAgICAgICAgICBTTkRfREVMLCAwIH0sCisgICAgeyAiL2V4Y2VwdCIsICAgICAgICAgIFNORF9FWEMsIENNX0FSRyB9LAorICAgIHsgIi9maWxlbmFtZXMiLCAgICAgICBTTkRfTkFNLCBDTV9BUkcgfSwKKyNpZmRlZiBQSVBFU0VORAorICAgIHsgIi9maWx0ZXIiLCAgICAgICAgICBTTkRfRkxULCBDTV9BUkd8Q01fUFNIIH0sCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyNpZmRlZiBWTVMKKyAgICB7ICIvaW1hZ2UiLCAgICAgICAgICAgU05EX0lNRywgMCB9LAorICAgIHsgIi9sYWJlbGVkIiwgICAgICAgICBTTkRfTEJMLCAwIH0sCisjZWxzZQorICAgIHsgIi9pbWFnZSIsICAgICAgICAgICBTTkRfQklOLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBWTVMgKi8KKyNpZmRlZiBDS19UTVBESVIKKyAgICB7ICIvbW92ZS10byIsICAgICAgICAgU05EX01PViwgQ01fQVJHIH0sCisjZW5kaWYgLyogQ0tfVE1QRElSICovCisgICAgeyAiL3BhdGhuYW1lcyIsICAgICAgIFNORF9QVEgsIENNX0FSRyB9LAorICAgIHsgIi9waXBlcyIsICAgICAgICAgICBTTkRfUElQLCBDTV9BUkd8Q01fUFNIIH0sCisgICAgeyAiL3F1aWV0IiwgICAgICAgICAgIFNORF9TSEgsIDAgfSwKKyNpZmRlZiBDS19SRVNFTkQKKyAgICB7ICIvcmVjb3ZlciIsICAgICAgICAgU05EX1JFUywgMCB9LAorI2VuZGlmIC8qIENLX1JFU0VORCAqLworICAgIHsgIi9yZWN1cnNpdmUiLCAgICAgICBTTkRfUkVDLCAwIH0sCisgICAgeyAiL3JlbmFtZS10byIsICAgICAgIFNORF9SRU4sIENNX0FSRyB9LAorI2lmZGVmIENPTU1FTlQKKyAgICB7ICIvc21hbGxlci10aGFuIiwgICAgU05EX1NNQSwgQ01fQVJHIH0sCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHsgIi9zdWJkaXJlY3RvcmllcyIsICBTTkRfUkVDLCBDTV9JTlYgfSwKKyAgICB7ICIvdGV4dCIsICAgICAgICAgICAgU05EX1RYVCwgMCB9LAorICAgIHsgIi90cmFuc3BhcmVudCIsICAgICBTTkRfWFBBLCAwIH0KK307CisjZGVmaW5lIE5HRVRUQUIgc2l6ZW9mKGdldHRhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpCitzdGF0aWMgaW50IG5nZXR0YWIgPSBOR0VUVEFCOworCitzdGF0aWMgc3RydWN0IGtleXRhYiByY3Z0YWJbXSA9IHsgICAgICAgLyogUkVDRUlWRSBvcHRpb25zICovCisgICAgeyAiL2FzLW5hbWUiLCAgICAgICAgIFNORF9BU04sIENNX0FSRyB9LAorICAgIHsgIi9iaW5hcnkiLCAgICAgICAgICBTTkRfQklOLCAwIH0sCisjaWZkZWYgQ0FMSUJSQVRFCisgICAgeyAiL2NhbGlicmF0ZSIsICAgICAgIFNORF9DQUwsIENNX0lOViB9LAorI2VuZGlmIC8qIENBTElCUkFURSAqLworI2lmZGVmIFBJUEVTRU5ECisgICAgeyAiL2NvbW1hbmQiLCAgICAgICAgIFNORF9DTUQsIENNX1BTSCB9LAorI2VuZGlmIC8qIFBJUEVTRU5EICovCisgICAgeyAiL2V4Y2VwdCIsICAgICAgICAgIFNORF9FWEMsIENNX0FSRyB9LAorICAgIHsgIi9maWxlbmFtZXMiLCAgICAgICBTTkRfTkFNLCBDTV9BUkcgfSwKKyNpZmRlZiBQSVBFU0VORAorICAgIHsgIi9maWx0ZXIiLCAgICAgICAgICBTTkRfRkxULCBDTV9BUkd8Q01fUFNIIH0sCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyNpZmRlZiBWTVMKKyAgICB7ICIvaW1hZ2UiLCAgICAgICAgICAgU05EX0lNRywgMCB9LAorICAgIHsgIi9sYWJlbGVkIiwgICAgICAgICBTTkRfTEJMLCAwIH0sCisjZWxzZQorICAgIHsgIi9pbWFnZSIsICAgICAgICAgICBTTkRfQklOLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBWTVMgKi8KKyNpZmRlZiBDS19UTVBESVIKKyAgICB7ICIvbW92ZS10byIsICAgICAgICAgU05EX01PViwgQ01fQVJHIH0sCisjZW5kaWYgLyogQ0tfVE1QRElSICovCisgICAgeyAiL3BhdGhuYW1lcyIsICAgICAgIFNORF9QVEgsIENNX0FSRyB9LAorICAgIHsgIi9waXBlcyIsICAgICAgICAgICBTTkRfUElQLCBDTV9BUkd8Q01fUFNIIH0sCisjaWZkZWYgQ0tfWFlaCisgICAgeyAiL3Byb3RvY29sIiwgICAgICAgIFNORF9QUk8sIENNX0FSRyB9LAorI2Vsc2UKKyAgICB7ICIvcHJvdG9jb2wiLCAgICAgICAgU05EX1BSTywgQ01fQVJHfENNX0lOViB9LAorI2VuZGlmIC8qIENLX1hZWiAqLworICAgIHsgIi9xdWlldCIsICAgICAgICAgICBTTkRfU0hILCAwIH0sCisgICAgeyAiL3JlY3Vyc2l2ZSIsICAgICAgIFNORF9SRUMsIDAgfSwKKyAgICB7ICIvcmVuYW1lLXRvIiwgICAgICAgU05EX1JFTiwgQ01fQVJHIH0sCisgICAgeyAiL3RleHQiLCAgICAgICAgICAgIFNORF9UWFQsIDAgfSwKKyAgICB7ICIvdHJhbnNwYXJlbnQiLCAgICAgU05EX1hQQSwgMCB9Cit9OworI2RlZmluZSBOUkNWVEFCIHNpemVvZihyY3Z0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKQorc3RhdGljIGludCBucmN2dGFiID0gTlJDVlRBQjsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworLyogV0FJVCB0YWJsZSAqLworCisjZGVmaW5lIFdBSVRfRklMIDk5NworI2RlZmluZSBXQUlUX01ETSA5OTgKKworc3RydWN0IGtleXRhYiB3YWl0dGFiW10gPSB7CisgICAgeyAiY2QiLCAgICAgICAgICAgIEJNX0RDRCwgICBDTV9JTlYgfSwgLyogKENhcnJpZXIgRGV0ZWN0KSAqLworICAgIHsgImN0cyIsICAgICAgICAgICBCTV9DVFMsICAgQ01fSU5WIH0sIC8qIChDbGVhciBUbyBTZW5kKSAgKi8KKyAgICB7ICJkc3IiLCAgICAgICAgICAgQk1fRFNSLCAgIENNX0lOViB9LCAvKiAoRGF0YSBTZXQgUmVhZHkpICovCisgICAgeyAiZmlsZSIsICAgICAgICAgIFdBSVRfRklMLCAwIH0sICAgICAgLyogTmV3IGNhdGVnb3J5IHNlbGVjdG9yIGtleXdvcmRzICovCisgICAgeyAibW9kZW0tc2lnbmFscyIsIFdBSVRfTURNLCAwIH0sICAgICAgLyogLi4uICovCisgICAgeyAicmkiLCAgICAgICAgICAgIEJNX1JORywgICBDTV9JTlYgfSAgLyogKFJpbmcgSW5kaWNhdG9yKSAqLworfTsKK2ludCBud2FpdHRhYiA9IChzaXplb2Yod2FpdHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCisvKiBNb2RlbSBzaWduYWwgdGFibGUgKi8KKworc3RydWN0IGtleXRhYiBtc3RhYltdID0geworICAgIHsgImNkIiwgICAgQk1fRENELCAwIH0sICAgICAgICAgICAgIC8qIENhcnJpZXIgRGV0ZWN0ICovCisgICAgeyAiY3RzIiwgICBCTV9DVFMsIDAgfSwgICAgICAgICAgICAgLyogQ2xlYXIgVG8gU2VuZCAgKi8KKyAgICB7ICJkc3IiLCAgIEJNX0RTUiwgMCB9LCAgICAgICAgICAgICAvKiBEYXRhIFNldCBSZWFkeSAqLworICAgIHsgInJpIiwgICAgQk1fUk5HLCAwIH0gICAgICAgICAgICAgIC8qIFJpbmcgSW5kaWNhdG9yICovCit9OworaW50IG5tcyA9IChzaXplb2YobXN0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2RlZmluZSBXRl9NT0QgMQorI2RlZmluZSBXRl9ERUwgMgorI2RlZmluZSBXRl9DUkUgMworCitzdHJ1Y3Qga2V5dGFiIHdmc3dpW10gPSB7ICAgICAgICAgICAgICAgLyogV0FJVCBGSUxFIHN3aXRjaGVzICovCisgICAgeyAiY3JlYXRpb24iLCAgICAgV0ZfQ1JFLCAwIH0sICAgICAgLyogV2FpdCBmb3IgZmlsZSB0byBiZSBjcmVhdGVkICovCisgICAgeyAiZGVsZXRpb24iLCAgICAgV0ZfREVMLCAwIH0sICAgICAgLyogV2FpdCBmb3IgZmlsZSB0byBiZSBkZWxldGVkICovCisgICAgeyAibW9kaWZpY2F0aW9uIiwgV0ZfTU9ELCAwIH0gICAgICAgLyogV2FpdCBmb3IgZmlsZSB0byBiZSBtb2RpZmllZCAqLworfTsKK2ludCBud2Zzd2kgPSAoc2l6ZW9mKHdmc3dpKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKKyNpZm5kZWYgTk9TUEwKK3N0cnVjdCBrZXl0YWIgYXNndGFiW10gPSB7ICAgICAgICAgICAgICAvKiBBc3NpZ25tZW50IG9wZXJhdG9ycyBmb3IgIi4iICovCisgICAgeyAiOjo9IiwgMiwgMCB9LCAgICAgICAgICAgICAgICAgICAgLyogQVNTSUdOIGFuZCBFVkFMVUFURSAqLworICAgIHsgIjo9IiwgIDEsIDAgfSwgICAgICAgICAgICAgICAgICAgIC8qIEFTU0lHTiAqLworICAgIHsgIj0iLCAgIDAsIDAgfSAgICAgICAgICAgICAgICAgICAgIC8qIERFRklORSAqLworfTsKK2ludCBuYXNndGFiID0gKHNpemVvZihhc2d0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RydWN0IGtleXRhYiBvcG50YWJbXSA9IHsKKyNpZm5kZWYgTk9QVVNICisgICAgeyAiIXJlYWQiLCAgT1BOX1BJX1IsIENNX0lOViB9LAorICAgIHsgIiF3cml0ZSIsIE9QTl9QSV9XLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyAgICB7ICJhcHBlbmQiLCBPUE5fRklfQSwgMCB9LAorICAgIHsgImhvc3QiLCAgIE9QTl9ORVQsICAwIH0sCisjaWZkZWYgT1MyCisgICAgeyAibGluZSIsICAgT1BOX1NFUiwgIENNX0lOViB9LAorICAgIHsgInBvcnQiLCAgIE9QTl9TRVIsICAwIH0sCisjZWxzZQorICAgIHsgImxpbmUiLCAgIE9QTl9TRVIsICAwIH0sCisgICAgeyAicG9ydCIsICAgT1BOX1NFUiwgIENNX0lOViB9LAorI2VuZGlmIC8qIE9TMiAqLworICAgIHsgInJlYWQiLCAgIE9QTl9GSV9SLCAwIH0sCisgICAgeyAid3JpdGUiLCAgT1BOX0ZJX1csIDAgfQorfTsKK2ludCBub3BuID0gKHNpemVvZihvcG50YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworLyogSUYgY29uZGl0aW9ucyAqLworCisjZGVmaW5lICBYWElGQ08gMCAgICAgICAvKiBJRiBDT1VOVCAqLworI2RlZmluZSAgWFhJRkVSIDEgICAgICAgLyogSUYgRVJST1JMRVZFTCAqLworI2RlZmluZSAgWFhJRkVYIDIgICAgICAgLyogSUYgRVhJU1QgKi8KKyNkZWZpbmUgIFhYSUZGQSAzICAgICAgIC8qIElGIEZBSUxVUkUgKi8KKyNkZWZpbmUgIFhYSUZTVSA0ICAgICAgIC8qIElGIFNVQ0NFU1MgKi8KKyNkZWZpbmUgIFhYSUZOTyA1ICAgICAgIC8qIElGIE5PVCAqLworI2RlZmluZSAgWFhJRkRFIDYgICAgICAgLyogSUYgREVGSU5FRCAqLworI2RlZmluZSAgWFhJRkVRIDcgICAgICAgLyogSUYgRVFVQUwgKHN0cmluZ3MpICovCisjZGVmaW5lICBYWElGQUUgOCAgICAgICAvKiBJRiA9IChudW1iZXJzKSAqLworI2RlZmluZSAgWFhJRkxUIDkgICAgICAgLyogSUYgPCAobnVtYmVycykgKi8KKyNkZWZpbmUgIFhYSUZHVCAxMCAgICAgIC8qIElGID4gKG51bWJlcnMpICovCisjZGVmaW5lICBYWElGTEwgMTEgICAgICAvKiBJRiBMZXhpY2FsbHkgTGVzcyBUaGFuIChzdHJpbmdzKSAqLworI2RlZmluZSAgWFhJRkxHIDEyICAgICAgLyogSUYgTGV4aWNhbGx5IEdyZWF0ZXIgVGhhbiAoc3RyaW5ncykgKi8KKyNkZWZpbmUgIFhYSUZFTyAxMyAgICAgIC8qIElGIEVPRiAoUkVBRCBmaWxlKSAqLworI2RlZmluZSAgWFhJRkJHIDE0ICAgICAgLyogSUYgQkFDS0dST1VORCAqLworI2RlZmluZSAgWFhJRk5VIDE1ICAgICAgLyogSUYgTlVNRVJJQyAqLworI2RlZmluZSAgWFhJRkZHIDE2ICAgICAgLyogSUYgRk9SRUdST1VORCAqLworI2RlZmluZSAgWFhJRkRJIDE3ICAgICAgLyogSUYgRElSRUNUT1JZICovCisjZGVmaW5lICBYWElGTkUgMTggICAgICAvKiBJRiBORVdFUiAqLworI2RlZmluZSAgWFhJRlJPIDE5ICAgICAgLyogSUYgUkVNT1RFLU9OTFkgKi8KKyNkZWZpbmUgIFhYSUZBTCAyMCAgICAgIC8qIElGIEFMQVJNICovCisjZGVmaW5lICBYWElGU0QgMjEgICAgICAvKiBJRiBTVEFSVEVELUZST00tRElBTEVSICovCisjZGVmaW5lICBYWElGVFIgMjIgICAgICAvKiBJRiBUUlVFICovCisjZGVmaW5lICBYWElGTlQgMjMgICAgICAvKiBJRiBGQUxTRSAqLworI2RlZmluZSAgWFhJRlRNIDI0ICAgICAgLyogSUYgVEVSTUlOQUwtTUFDUk8gKi8KKyNkZWZpbmUgIFhYSUZFTSAyNSAgICAgIC8qIElGIEVNVUxBVElPTiAqLworI2RlZmluZSAgWFhJRk9QIDI2ICAgICAgLyogSUYgT1BFTiAqLworI2RlZmluZSAgWFhJRkxFIDI3ICAgICAgLyogSUYgPD0gKi8KKyNkZWZpbmUgIFhYSUZHRSAyOCAgICAgIC8qIElGID49ICovCisjZGVmaW5lICBYWElGSVAgMjkgICAgICAvKiBJRiBJTlBBVEggKi8KKyNkZWZpbmUgIFhYSUZUQSAzMCAgICAgIC8qIElGIFRBUEkgKi8KKyNkZWZpbmUgIFhYSUZNQSAzMSAgICAgIC8qIElGIE1BVENIICovCisjZGVmaW5lICBYWElGRkwgMzIgICAgICAvKiBJRiBGTEFHICovCisjZGVmaW5lICBYWElGQUIgMzMgICAgICAvKiBJRiBBQlNPTFVURSAqLworI2RlZmluZSAgWFhJRkFWIDM0ICAgICAgLyogSUYgQVZBSUxBQkxFICovCisjZGVmaW5lICBYWElGQVQgMzUgICAgICAvKiBJRiBBU0tUSU1FT1VUICovCisjZGVmaW5lICBYWElGUkQgMzYgICAgICAvKiBJRiBSRUFEQUJMRSAqLworI2RlZmluZSAgWFhJRldSIDM3ICAgICAgLyogSUYgV1JJVEVBQkxFICovCisjZGVmaW5lICBYWElGQU4gMzggICAgICAvKiBJRiAuLi4gQU5EIC4uLiAqLworI2RlZmluZSAgWFhJRk9SIDM5ICAgICAgLyogSUYgLi4uIE9SIC4uLiAqLworI2RlZmluZSAgWFhJRkxQIDQwICAgICAgLyogSUYgbGVmdCBwYXJlbnRoZXNpcyAqLworI2RlZmluZSAgWFhJRlJQIDQxICAgICAgLyogSUYgcmlnaHQgcGFyZW50aGVzaXMgKi8KKyNkZWZpbmUgIFhYSUZOUSA0MiAgICAgIC8qIElGICE9ICg9PSAiTk9UID0iKSAqLworI2RlZmluZSAgWFhJRlFVIDQzICAgICAgLyogSUYgUVVJRVQgKi8KKyNkZWZpbmUgIFhYSUZDSyA0NCAgICAgIC8qIElGIEMtS0VSTUlUICovCisjZGVmaW5lICBYWElGSzkgNDUgICAgICAvKiBJRiBLLTk1ICovCisjZGVmaW5lICBYWElGTVMgNDYgICAgICAvKiBJRiBNUy1LRVJNSVQgKi8KKyNkZWZpbmUgIFhYSUZXSSA0NyAgICAgIC8qIElGIFdJTEQgKi8KKyNkZWZpbmUgIFhYSUZMTyA0OCAgICAgIC8qIElGIExPQ0FMICovCisjZGVmaW5lICBYWElGQ00gNDkgICAgICAvKiBJRiBDT01NQU5EICovCisjZGVmaW5lICBYWElGRlAgNTAgICAgICAvKiBJRiBGTE9BVCAqLworI2RlZmluZSAgWFhJRklLIDUxICAgICAgLyogSUYgSUtTICovCisjZGVmaW5lICBYWElGS0IgNTIgICAgICAvKiBJRiBLQkhJVCAqLworI2RlZmluZSAgWFhJRktHIDUzICAgICAgLyogSUYgS0VSQkFORyAqLworI2RlZmluZSAgWFhJRlZFIDU0ICAgICAgLyogSUYgVkVSU0lPTiAqLworI2RlZmluZSAgWFhJRkRDIDU1ICAgICAgLyogSUYgREVDTEFSRUQgKi8KKyNkZWZpbmUgIFhYSUZHVSA1NiAgICAgIC8qIElGIEdVSSAqLworCitzdHJ1Y3Qga2V5dGFiIGlmdGFiW10gPSB7ICAgICAgICAgICAgICAgLyogSUYgY29tbWFuZHMgKi8KKyAgICB7ICIhIiwgICAgICAgICAgWFhJRk5PLCAwIH0sCisgICAgeyAiIT0iLCAgICAgICAgIFhYSUZOUSwgMCB9LAorICAgIHsgIiYmIiwgICAgICAgICBYWElGQU4sIDAgfSwKKyAgICB7ICIoIiwgICAgICAgICAgWFhJRkxQLCAwIH0sCisgICAgeyAiKSIsICAgICAgICAgIFhYSUZSUCwgMCB9LAorICAgIHsgIjwiLCAgICAgICAgICBYWElGTFQsIDAgfSwKKyAgICB7ICI8PSIsICAgICAgICAgWFhJRkxFLCAwIH0sCisgICAgeyAiPSIsICAgICAgICAgIFhYSUZBRSwgMCB9LAorICAgIHsgIj09IiwgICAgICAgICBYWElGQUUsIENNX0lOViB9LAorICAgIHsgIj4iLCAgICAgICAgICBYWElGR1QsIDAgfSwKKyAgICB7ICI+PSIsICAgICAgICAgWFhJRkdFLCAwIH0sCisgICAgeyAiYWJzb2x1dGUiLCAgIFhYSUZBQiwgMCB9LAorICAgIHsgImFsYXJtIiwgICAgICBYWElGQUwsIDAgfSwKKyAgICB7ICJhbmQiLCAgICAgICAgWFhJRkFOLCAwIH0sCisgICAgeyAiYXNrdGltZW91dCIsIFhYSUZBVCwgMCB9LAorICAgIHsgImF2YWlsYWJsZSIsICBYWElGQVYsIDAgfSwKKyAgICB7ICJiYWNrZ3JvdW5kIiwgWFhJRkJHLCAwIH0sCisgICAgeyAiYy1rZXJtaXQiLCAgIFhYSUZDSywgMCB9LAorICAgIHsgImNvbW1hbmQiLCAgICBYWElGQ00sIDAgfSwKKyAgICB7ICJjb3VudCIsICAgICAgWFhJRkNPLCAwIH0sCisgICAgeyAiZGNsIiwgICAgICAgIFhYSUZEQywgQ01fSU5WIH0sCisgICAgeyAiZGVjbGFyZWQiLCAgIFhYSUZEQywgMCB9LAorICAgIHsgImRlZmluZWQiLCAgICBYWElGREUsIDAgfSwKKyNpZmRlZiBDS19UTVBESVIKKyAgICB7ICJkaXJlY3RvcnkiLCAgWFhJRkRJLCAwIH0sCisjZW5kaWYgLyogQ0tfVE1QRElSICovCisgICAgeyAiZW11bGF0aW9uIiwgIFhYSUZFTSwgMCB9LAorI2lmZGVmIENPTU1FTlQKKyAgICB7ICJlb2YiLCAgICAgICAgWFhJRkVPLCAwIH0sCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHsgImVxdWFsIiwgICAgICBYWElGRVEsIDAgfSwKKyAgICB7ICJlcnJvciIsICAgICAgWFhJRkZBLCBDTV9JTlYgfSwKKyAgICB7ICJleGlzdCIsICAgICAgWFhJRkVYLCAwIH0sCisgICAgeyAiZmFpbHVyZSIsICAgIFhYSUZGQSwgMCB9LAorICAgIHsgImZhbHNlIiwgICAgICBYWElGTlQsIDAgfSwKKyAgICB7ICJmbGFnIiwgICAgICAgWFhJRkZMLCAwIH0sCisjaWZkZWYgQ0tGTE9BVAorICAgIHsgImZsb2F0IiwgICAgICBYWElGRlAsIDAgfSwKKyNlbmRpZiAvKiBDS0ZMT0FUICovCisgICAgeyAiZm9yZWdyb3VuZCIsIFhYSUZGRywgMCB9LAorI2lmZGVmIE9TMgorICAgIHsgImd1aSIsICAgICAgICBYWElGR1UsIDAgfSwKKyNlbHNlCisgICAgeyAiZ3VpIiwgICAgICAgIFhYSUZHVSwgQ01fSU5WIH0sCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgSUtTRAorICAgIHsgImlrc2QiLCAgICAgICBYWElGSUssIDAgfSwKKyNlbHNlCisgICAgeyAiaWtzZCIsICAgICAgIFhYSUZJSywgQ01fSU5WIH0sCisjZW5kaWYgLyogSUtTRCAqLworICAgIHsgImludGVnZXIiLCAgICBYWElGTlUsIENNX0lOViB9LAorICAgIHsgImstOTUiLCAgICAgICBYWElGSzksIDAgfSwKKyAgICB7ICJrYmhpdCIsICAgICAgWFhJRktCLCAwIH0sCisjaWZkZWYgVU5JWAorICAgIHsgImtlcmJhbmciLCAgICBYWElGS0csIDAgfSwKKyNlbHNlCisgICAgeyAia2VyYmFuZyIsICAgIFhYSUZLRywgQ01fSU5WIH0sCisjZW5kaWYgLyogVU5JWCAqLworICAgIHsgImxndCIsICAgICAgICBYWElGTEcsIDAgfSwKKyAgICB7ICJsbHQiLCAgICAgICAgWFhJRkxMLCAwIH0sCisgICAgeyAibG9jYWwiLCAgICAgIFhYSUZMTywgMCB9LAorICAgIHsgIm1hdGNoIiwgICAgICBYWElGTUEsIDAgfSwKKyAgICB7ICJtcy1rZXJtaXQiLCAgWFhJRk1TLCBDTV9JTlYgfSwKKyNpZmRlZiBaRkNEQVQKKyAgICB7ICJuZXdlciIsICAgICAgWFhJRk5FLCAwIH0sCisjZW5kaWYgLyogWkZDREFUICovCisgICAgeyAibm90IiwgICAgICAgIFhYSUZOTywgMCB9LAorICAgIHsgIm51bWVyaWMiLCAgICBYWElGTlUsIDAgfSwKKyAgICB7ICJvayIsICAgICAgICAgWFhJRlNVLCBDTV9JTlYgfSwKKyAgICB7ICJvcGVuIiwgICAgICAgWFhJRk9QLCAwIH0sCisgICAgeyAib3IiLCAgICAgICAgIFhYSUZPUiwgMCB9LAorICAgIHsgInF1aWV0IiwgICAgICBYWElGUVUsIDAgfSwKKyAgICB7ICJyZWFkYWJsZSIsICAgWFhJRlJELCAwIH0sCisgICAgeyAicmVtb3RlLW9ubHkiLFhYSUZSTywgMCB9LAorICAgIHsgInN0YXJ0ZWQtZnJvbS1kaWFsZXIiLFhYSUZTRCwgQ01fSU5WIH0sCisgICAgeyAic3VjY2VzcyIsICAgIFhYSUZTVSwgMCB9LAorICAgIHsgInRhcGkiLCAgICAgICBYWElGVEEsIDAgfSwKKyNpZmRlZiBPUzIKKyAgICB7ICJ0ZXJtaW5hbC1tYWNybyIsIFhYSUZUTSwgMCB9LAorI2Vsc2UKKyAgICB7ICJ0ZXJtaW5hbC1tYWNybyIsIFhYSUZUTSwgQ01fSU5WIH0sCisjZW5kaWYgLyogT1MyICovCisgICAgeyAidHJ1ZSIsICAgICAgIFhYSUZUUiwgMCB9LAorICAgIHsgInZlcnNpb24iLCAgICBYWElGVkUsIDAgfSwKKyAgICB7ICJ3aWxkIiwgICAgICAgWFhJRldJLCAwIH0sCisgICAgeyAid3JpdGVhYmxlIiwgIFhYSUZXUiwgMCB9LAorICAgIHsgInx8IiwgICAgICAgICBYWElGT1IsIDAgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitpbnQgbmlmID0gKHNpemVvZihpZnRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RydWN0IGtleXRhYiBpb3RhYltdID0geyAgICAgICAgICAgICAgIC8qIEtleXdvcmRzIGZvciBJRiBPUEVOICovCisgICAgeyAiIXJlYWQtZmlsZSIsICAgICAgWlJGSUxFLCBDTV9JTlYgfSwKKyAgICB7ICIhd3JpdGUtZmlsZSIsICAgICBaV0ZJTEUsIENNX0lOViB9LAorICAgIHsgImFwcGVuZC1maWxlIiwgICAgIFpXRklMRSwgQ01fSU5WIH0sCisgICAgeyAiY29ubmVjdGlvbiIsICAgICAgODg4OCwgICAwIH0sCisjaWZkZWYgQ0tMT0dESUFMCisgICAgeyAiY3gtbG9nIiwgICAgICAgICAgNzc3NywgICAwIH0sCisjZW5kaWYgLyogQ0tMT0dESUFMICovCisgICAgeyAiZGVidWctbG9nIiwgICAgICAgWkRGSUxFLCAwIH0sCisgICAgeyAiZXJyb3IiLCAgICAgICAgICAgOTk5OSwgICAwIH0sCisgICAgeyAicGFja2V0LWxvZyIsICAgICAgWlBGSUxFLCAwIH0sCisgICAgeyAicmVhZC1maWxlIiwgICAgICAgWlJGSUxFLCAwIH0sCisgICAgeyAic2NyZWVuIiwgICAgICAgICAgWlNURElPLCAwIH0sCisgICAgeyAic2Vzc2lvbi1sb2ciLCAgICAgWlNGSUxFLCAwIH0sCisgICAgeyAidHJhbnNhY3Rpb24tbG9nIiwgWlRGSUxFLCAwIH0sCisgICAgeyAid3JpdGUtZmlsZSIsICAgICAgWldGSUxFLCAwIH0KK307CitpbnQgbmlvdCA9IChzaXplb2YoaW90YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisvKiBWYXJpYWJsZXMgYW5kIHByb3RvdHlwZXMgKi8KKworI2lmZGVmIE5FVENPTk4KK2V4dGVybiBpbnQgbm5ldGRpcjsgICAgICAgICAgICAgICAgICAgICAvKiBIb3cgbWFueSBuZXR3b3JrIGRpcmVjdG9yaWVzICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworI2lmZGVmIENLX1NFQ1VSSVRZCitfUFJPVE9UWVAoaW50IGNrX2tyYjRfaXNfaW5zdGFsbGVkLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IGNrX2tyYjVfaXNfaW5zdGFsbGVkLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IGNrX250bG1faXNfaW5zdGFsbGVkLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IGNrX3NycF9pc19pbnN0YWxsZWQsKHZvaWQpKTsKK19QUk9UT1RZUChpbnQgY2tfc3NsZWF5X2lzX2luc3RhbGxlZCwodm9pZCkpOworX1BST1RPVFlQKGludCBja19zc2hfaXNfaW5zdGFsbGVkLCh2b2lkKSk7CitfUFJPVE9UWVAoaW50IGNrX2NyeXB0X2lzX2luc3RhbGxlZCwodm9pZCkpOworI2Vsc2UKKyNkZWZpbmUgY2tfa3JiNF9pc19pbnN0YWxsZWQoKSAoMCkKKyNkZWZpbmUgY2tfa3JiNV9pc19pbnN0YWxsZWQoKSAoMCkKKyNkZWZpbmUgY2tfbnRsbV9pc19pbnN0YWxsZWQoKSAoMCkKKyNkZWZpbmUgY2tfc3JwX2lzX2luc3RhbGxlZCgpICgwKQorI2RlZmluZSBja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkgKDApCisjZGVmaW5lIGNrX3NzaF9pc19pbnN0YWxsZWQoKSAoMCkKKyNkZWZpbmUgY2tfY3J5cHRfaXNfaW5zdGFsbGVkKCkgKDApCisjZW5kaWYgLyogQ0tfU0VDVVJJVFkgKi8KKworI2RlZmluZSBBVl9LUkI0ICAgMQorI2RlZmluZSBBVl9LUkI1ICAgMgorI2RlZmluZSBBVl9OVExNICAgMworI2RlZmluZSBBVl9TUlAgICAgNAorI2RlZmluZSBBVl9TU0wgICAgNQorI2RlZmluZSBBVl9DUllQVE8gNgorI2RlZmluZSBBVl9TU0ggICAgNworCitzdHJ1Y3Qga2V5dGFiIGF2YWlsdGFiW10gPSB7ICAgICAgICAgICAgIC8qIEF2YWlsYWJsZSBhdXRoZW50aWNhdGlvbiB0eXBlcyAqLworICAgIHsgImNyeXB0byIsICAgICBBVl9DUllQVE8sIENNX0lOViB9LCAvKiBhbmQgZW5jcnlwdGlvbiAqLworICAgIHsgImVuY3J5cHRpb24iLCBBVl9DUllQVE8sIDAgfSwKKyAgICB7ICJrNCIsICAgICAgICAgQVZfS1JCNCwgICBDTV9JTlYgfSwKKyAgICB7ICJrNSIsICAgICAgICAgQVZfS1JCNSwgICBDTV9JTlYgfSwKKyAgICB7ICJrZXJiZXJvczQiLCAgQVZfS1JCNCwgICAwIH0sCisgICAgeyAia2VyYmVyb3M1IiwgIEFWX0tSQjUsICAgMCB9LAorICAgIHsgImtyYjQiLCAgICAgICBBVl9LUkI0LCAgIENNX0lOViB9LAorICAgIHsgImtyYjUiLCAgICAgICBBVl9LUkI1LCAgIENNX0lOViB9LAorICAgIHsgIm50bG0iLCAgICAgICBBVl9OVExNLCAgIDAgfSwKKyAgICB7ICJzcnAiLCAgICAgICAgQVZfU1JQLCAgICAwIH0sCisgICAgeyAic3NoIiwgICAgICAgIEFWX1NTSCwgICAgMCB9LAorICAgIHsgInNzbCIsICAgICAgICBBVl9TU0wsICAgIDAgfSwKKyAgICB7ICJ0bHMiLCAgICAgICAgQVZfU1NMLCAgICAwIH0sCisgICAgeyAiIiwgICAgICAgICAgIDAsICAgICAgICAgMCB9Cit9OworaW50IGF2YWlsdGFibiA9IHNpemVvZihhdmFpbHRhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpLTE7CisKKyNpZm5kZWYgTk9ESUFMCitfUFJPVE9UWVAoc3RhdGljIGludCBkZGN2dCwgKGNoYXIgKiwgRklMRSAqLCBpbnQpICk7CitfUFJPVE9UWVAoc3RhdGljIGludCBkbmN2dCwgKGludCwgaW50LCBpbnQsIGludCkgKTsKK19QUk9UT1RZUChjaGFyICogZ2V0ZG5hbWUsICh2b2lkKSApOworCitzdGF0aWMgaW50IHBhcnRpYWwgID0gMDsgICAgICAgICAgICAgICAgLyogRm9yIHBhcnRpYWwgZGlhbCAqLworc3RhdGljIGNoYXIgKmRzY29weSA9IE5VTEw7CitpbnQgZGlhbHR5cGUgPSAtMTsKKworY2hhciAqZGlhbG51bSA9IChjaGFyICopMDsgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIERJQUwgbnVtYmVyIGZvciBSRURJQUwgKi8KK2ludCBkaXJsaW5lID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWFsIGRpcmVjdG9yeSBsaW5lIG51bWJlciAqLworZXh0ZXJuIGNoYXIgKiBkaWFsZGlyW107ICAgICAgICAgICAgICAgIC8qIERpYWwgZGlyZWN0b3J5IGZpbGUgbmFtZXMgKi8KK2V4dGVybiBpbnQgZGlhbGRweTsgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIERJU1BMQVkgb24vb2ZmICovCitleHRlcm4gaW50IG5kaWFsZGlyOyAgICAgICAgICAgICAgICAgICAgLyogSG93IG1hbnkgZGlhbCBkaXJlY3RvcmllcyAqLworZXh0ZXJuIGludCBudG9sbGZyZWU7ICAgICAgICAgICAgICAgICAgIC8qIFRvbGwtZnJlZSBjYWxsIGluZm8gKi8KK2V4dGVybiBpbnQgbmRpYWxweHg7ICAgICAgICAgICAgICAgICAgICAvKiBMaXN0IG9mIFBCWCBleGNoYW5nZXMgKi8KK2V4dGVybiBjaGFyICpkaWFsdGZjW107CitjaGFyICogbWF0Y2hweHggPSBOVUxMOyAgICAgICAgICAgICAgICAgLyogUEJYIGV4Y2hhbmdlIHRoYXQgbWF0Y2hlZCAqLworZXh0ZXJuIGludCBubG9jYWxhYzsgICAgICAgICAgICAgICAgICAgIC8qIExvY2FsIGFyZWEtY29kZSBsaXN0ICovCitleHRlcm4gY2hhciAqIGRpYWxsY2FjW107CitleHRlcm4gaW50IHR0dGFwaTsKKyNpZmRlZiBDS19UQVBJCitleHRlcm4gaW50IHRhcGljb252OyAgICAgICAgICAgICAgICAgICAgLyogVEFQSSBDb252ZXJzaW9ucyAqLworZXh0ZXJuIGludCB0YXBpcGFzczsgICAgICAgICAgICAgICAgICAgIC8qIFRBUEkgUGFzc3Rocm91Z2ggKi8KKyNlbmRpZiAvKiBDS19UQVBJICovCitleHRlcm4gaW50IGRpYWxhdG1vOworZXh0ZXJuIGNoYXIgKiBkaWFsbnByLCAqIGRpYWxzZng7CitleHRlcm4gY2hhciAqIGRpYWxpeHAsICogZGlhbGl4cywgKiBkaWFsbWFjOworZXh0ZXJuIGNoYXIgKiBkaWFsbGRwLCAqIGRpYWxsZHMsICogZGlhbHRmcDsKK2V4dGVybiBjaGFyICogZGlhbHB4aSwgKiBkaWFscHhvLCAqIGRpYWxsYWM7CitleHRlcm4gY2hhciAqIGRpYWxsY3AsICogZGlhbGxjcywgKiBkaWFsbGNjOworZXh0ZXJuIGNoYXIgKiBkaWFscHh4W107CisKK2V4dGVybiBpbnQgZGlhbGNuZjsgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIENPTkZJUk1BVElPTiAqLworaW50IGRpYWxmbGQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgRk9SQ0UtTE9ORy1ESVNUQU5DRSAqLworaW50IGRpYWxzcnQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgU09SVCBPTiAqLworaW50IGRpYWxyc3RyID0gNjsgICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgUkVTVFJJQ1RJT04gKi8KK2ludCBkaWFsdGVzdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIFRFU1QgKi8KK2ludCBkaWFsY291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBcdihkaWFsY291bnQpICovCisKK2V4dGVybiBpbnQgZGlhbHN0YTsgICAgICAgICAgICAgICAgICAgICAvKiBEaWFsIHN0YXR1cyAqLworaW50IGRpYWxydHIgPSAtMSwgICAgICAgICAgICAgICAgICAgICAgIC8qIERpYWwgcmV0cmllcyAqLworICAgIGRpYWxpbnQgPSAxMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIERpYWwgcmV0cnkgaW50ZXJ2YWwgKi8KK2V4dGVybiBsb25nIGRpYWxjYXBhczsgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBjYXBhYmlsaXRpZXMgKi8KK2V4dGVybiBpbnQgZGlhbGN2dDsgICAgICAgICAgICAgICAgICAgICAvKiBESUFMIENPTlZFUlQtRElSRUNUT1JZICovCisjZW5kaWYgLyogTk9ESUFMICovCisKKyNpZm5kZWYgTk9TUEwKKyNkZWZpbmUgSUZDT05ETEVOIDI1NgoraW50IGlmYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElGIGNhc2UgKi8KKyAgICBub3QgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBJRiBOT1QgKi8KKyAgICBpZmFyZ3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3VudCBvZiBJRiBjb25kaXRpb24gd29yZHMgKi8KK2NoYXIgaWZjb25kW0lGQ09ORExFTl07ICAgICAgICAgICAgICAgICAvKiBJRiBjb25kaXRpb24gdGV4dCAqLworY2hhciAqaWZjcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gSUYgY29uZGl0aW9uIHRleHQgKi8KKyNpZmRlZiBEQ01EQlVGCitleHRlcm4gaW50CisgKmlmY21kLCAgKmNvdW50LCAgKmlmdGVzdCwgKmludGltZSwKKyAqaW5wY2FzLCAqdGFrZXJyLCAqbWVycm9yLCAqeHF1aWV0OworI2Vsc2UKK2V4dGVybiBpbnQgaWZjbWRbXTsgICAgICAgICAgICAgICAgICAgICAvKiBMYXN0IGNvbW1hbmQgd2FzIElGICovCitleHRlcm4gaW50IGlmdGVzdFtdOyAgICAgICAgICAgICAgICAgICAgLyogTGFzdCBJRiB3YXMgdHJ1ZSAqLworZXh0ZXJuIGludCBjb3VudFtdOyAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBJRiBDT1VOVCwgb25lIGZvciBlYWNoIGNtZGx2bCAqLworZXh0ZXJuIGludCBpbnRpbWVbXTsgICAgICAgICAgICAgICAgICAgIC8qIERpdHRvIGZvciBvdGhlciBzdGFja2FibGVzLi4uICovCitleHRlcm4gaW50IGlucGNhc1tdOworZXh0ZXJuIGludCB0YWtlcnJbXTsKK2V4dGVybiBpbnQgbWVycm9yW107CitleHRlcm4gaW50IHhxdWlldFtdOworI2VuZGlmIC8qIERDTURCVUYgKi8KKyNlbHNlCitleHRlcm4gaW50IHRha2VycltdOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBEQ01EQlVGCitleHRlcm4gY2hhciAqbGluZTsgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIGJ1ZmZlciBmb3IgYW55dGhpbmcgKi8KK2V4dGVybiBjaGFyICp0bXBidWY7CisjZWxzZQorZXh0ZXJuIGNoYXIgbGluZVtdLCB0bXBidWZbXTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCitleHRlcm4gY2hhciAqbHA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBsaW5lIGJ1ZmZlciAqLworCitpbnQgY3dkZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1dEIGhhcyBiZWVuIGRvbmUgKi8KKworLyogRmxhZ3MgZm9yIEVOQUJMRS9ESVNBQkxFICovCitleHRlcm4gaW50IGVuX2N3ZCwgZW5fY3B5LCBlbl9kZWwsIGVuX2RpciwgZW5fZmluLAorICAgZW5fZ2V0LCBlbl9ob3MsIGVuX3JlbiwgZW5fc2VuLCBlbl9zZXQsIGVuX3NwYSwgZW5fdHlwLCBlbl93aG8sIGVuX2J5ZSwKKyAgIGVuX2FzZywgZW5fcXVlLCBlbl9yZXQsIGVuX21haSwgZW5fcHJpLCBlbl9ta2QsIGVuX3JtZCwgZW5feGl0LCBlbl9lbmE7CisKK2V4dGVybiBGSUxFICp0ZmlsZVtdOyAgICAgICAgICAgICAgICAgICAvKiBGaWxlIHBvaW50ZXJzIGZvciBUQUtFIGNvbW1hbmQgKi8KK2V4dGVybiBjaGFyICp0Zm5hbVtdOyAgICAgICAgICAgICAgICAgICAvKiBOYW1lcyBvZiBUQUtFIGZpbGVzICovCitleHRlcm4gaW50IHRmbGluZVtdOyAgICAgICAgICAgICAgICAgICAgLyogVEFLRS1maWxlIGxpbmUgbnVtYmVyICovCisKK2V4dGVybiBpbnQgc3VjY2VzczsgICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kIHN1Y2Nlc3MvZmFpbHVyZSBmbGFnICovCitleHRlcm4gaW50IGNtZGx2bDsgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBwb3NpdGlvbiBpbiBjb21tYW5kIHN0YWNrICovCisKKyNpZm5kZWYgTk9TUEwKK2V4dGVybiBpbnQgbWFjbHZsOyAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyB0byBleGVjdXRlICovCitleHRlcm4gY2hhciAqbWFjeFtdOyAgICAgICAgICAgICAgICAgICAgLyogSW5kZXggb2YgY3VycmVudCBtYWNybyAqLworZXh0ZXJuIGNoYXIgKm1ydmFsW107ICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIHJldHVybiB2YWx1ZSAqLworZXh0ZXJuIGNoYXIgKm1hY3BbXTsgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbWFjcm8gKi8KK2V4dGVybiBpbnQgbWFjYXJnY1tdOyAgICAgICAgICAgICAgICAgICAvKiBBUkdDIGZyb20gbWFjcm8gaW52b2NhdGlvbiAqLworCisjaWZkZWYgQ09NTUVOVAorZXh0ZXJuIGNoYXIgKm1fbGluZVtdOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworZXh0ZXJuIGNoYXIgKm1fYXJnW01BQ0xFVkVMXVtOQVJHU107ICAgIC8qIFN0YWNrIG9mIG1hY3JvIGFyZ3VtZW50cyAqLworZXh0ZXJuIGNoYXIgKmdfdmFyW107ICAgICAgICAgICAgICAgICAgIC8qIEdsb2JhbCB2YXJpYWJsZXMgJWEsICViLCBldGMgKi8KKworI2lmZGVmIERDTURCVUYKK2V4dGVybiBzdHJ1Y3QgY21kcHRyICpjbWRzdGs7ICAgICAgICAgICAvKiBUaGUgY29tbWFuZCBzdGFjayBpdHNlbGYgKi8KKyNlbHNlCitleHRlcm4gc3RydWN0IGNtZHB0ciBjbWRzdGtbXTsgICAgICAgICAgLyogVGhlIGNvbW1hbmQgc3RhY2sgaXRzZWxmICovCisjZW5kaWYgLyogRENNREJVRiAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyNkZWZpbmUgeHN5c3RlbShzKSB6c3lzY21kKHMpCisKK3N0YXRpYyBpbnQgeCwgeSwgeiA9IDA7CitzdGF0aWMgY2hhciAqcywgKnA7CisKKyNpZmRlZiBPUzIKK19QUk9UT1RZUCggaW50IG9zMnNldHRpdGxlLCAoY2hhciAqLCBpbnQpICk7CisjZW5kaWYgLyogT1MyICovCisKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIHllc25vW10sIG9ub2ZmW10sIGZudGFiW107CitleHRlcm4gaW50IG55ZXNubywgbmZudGFiOworCisjaWZuZGVmIE5PU1BMCisKKy8qIERvIHRoZSBBU0ssIEFTS1EsIEdFVE9LLCBhbmQgUkVBRCBjb21tYW5kcyAqLworCitpbnQgYXNrdGltZWRvdXQgPSAwOworCisjZGVmaW5lIEFTS19QVVAgMQorI2RlZmluZSBBU0tfVE1PIDIKKyNkZWZpbmUgQVNLX0dVSSAzCisjZGVmaW5lIEFTS19RVUkgNAorI2RlZmluZSBBU0tfREVGIDUKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgYXNrdGFiW10gPSB7CisgICAgeyAgIi9kZWZhdWx0IiwgQVNLX0RFRiwgQ01fQVJHIH0sCisgICAgeyAgIi9ndWkiLCAgICAgQVNLX0dVSSwgICAgICAKKyNpZmRlZiBLVUkKKyAgICAgICAgICAgMAorI2Vsc2UgLyogS1VJICovCisgICAgICAgICAgIENNX0lOVgorI2VuZGlmIC8qIEtVSSAqLworICAgIH0sCisgICAgeyAiL3BvcHVwIiwgICAgQVNLX1BVUCwgICAKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgMAorI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgIENNX0lOVgorI2VuZGlmIC8qIE9TMiAqLworICAgIH0sCisgICAgeyAiL3F1aWV0IiwgICAgQVNLX1FVSSwgMCB9LAorICAgIHsgIi90aW1lb3V0IiwgIEFTS19UTU8sIENNX0FSRyB9LAorICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmFza3RhYiA9IHNpemVvZihhc2t0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKS0xOworCitpbnQKK2RvYXNrKGN4KSBpbnQgY3g7IHsKKyAgICBleHRlcm4gaW50IGNtZmxncywgYXNrdGltZXIsIHRpbWVsaW1pdDsKKyNpZmRlZiBDS19SRUNBTEwKKyAgICBleHRlcm4gaW50IG9uX3JlY2FsbDsKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyAgICBpbnQgcG9wdXBmbGcgPSAwOworICAgIGludCBndWlmbGcgPSAwOworICAgIGludCBub21zZyA9IDA7CisgICAgaW50IG15dGltZXIgPSAwOworI2lmZGVmIENLX0FQQworICAgIGV4dGVybiBpbnQgYXBjYWN0aXZlLCBhcGNzdGF0dXM7CisjZW5kaWYgLyogQ0tfQVBDICovCisKKyAgICBjaGFyIGRmYnVmWzEwMjRdOwkJCS8qIEJ1ZmZlciBmb3IgZGVmYXVsdCBhbnN3ZXIgKi8KKyAgICBjaGFyICogZGZhbnN3ZXIgPSBOVUxMOwkJLyogUG9pbnRlciB0byBpdCAqLworCisgICAgY2hhciB2bmFtYnVmW1ZOQU1MKzFdOyAgICAgICAgICAgICAgLyogQnVmZmVyIGZvciB2YXJpYWJsZSBuYW1lcyAqLworICAgIGNoYXIgKnZucCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gc2FtZSAqLworICAgIAorICAgIGRmYnVmWzBdID0gTlVMOworICAgIHZuYW1idWZbMF0gPSBOVUw7CisKKyNpZmRlZiBDS19BUEMKKyAgICBpZiAoIGFwY2FjdGl2ZSAhPSBBUENfSU5BQ1RJVkUgJiYgKGFwY3N0YXR1cyAmIEFQQ19OT0lOUCkgKSB7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgfQorI2VuZGlmIC8qIENLX0FQQyAqLworCisgICAgbXl0aW1lciA9IGFza3RpbWVyOyAgICAgICAgICAgICAgICAgLyogSW5oZXJpdCBnbG9iYWwgQVNLIHRpbWVyICovCisKKyAgICBpZiAoY3ggPT0gWFhBU0sgfHwgY3ggPT0gWFhBU0tRKSB7CisgICAgICAgIHN0cnVjdCBGREIgc3csIGZsOworICAgICAgICBpbnQgZ2V0dmFsOworICAgICAgICBjaGFyIGM7CisgICAgICAgIGlmIChjeCA9PSBYWEFTS1EpICAgICAgICAgICAgICAgLyogRG9uJ3QgbG9nIEFTS1EgcmVzcG9uc2UgKi8KKyAgICAgICAgICBkZWJvayA9IDA7CisgICAgICAgIGNtZmRiaSgmc3csICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgRkRCIC0gY29tbWFuZCBzd2l0Y2hlcyAqLworICAgICAgICAgICAgICAgX0NNS0VZLCAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICAgICAiVmFyaWFibGUgbmFtZSBvciBzd2l0Y2giLAorICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAgICAgbmFza3RhYiwgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKyAgICAgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICBhc2t0YWIsICAgICAgICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAgICAgJmZsICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKyAgICAgICAgICAgICAgICk7CisgICAgICAgIGNtZmRiaSgmZmwsICAgICAgICAgICAgICAgICAgICAgLyogQW55dGhpbmcgdGhhdCBkb2Vzbid0IG1hdGNoICovCisgICAgICAgICAgICAgICBfQ01GTEQsICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgICAgICAgICAgLyogUGFyc2UgMCBvciBtb3JlIHN3aXRjaGVzICovCisgICAgICAgICAgICB4ID0gY21mZGIoJnN3KTsgICAgICAgICAgICAgLyogUGFyc2Ugc29tZXRoaW5nICovCisgICAgICAgICAgICBpZiAoeCA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIGlmIChjbXJlc3VsdC5mY29kZSAhPSBfQ01LRVkpIC8qIEJyZWFrIG91dCBpZiBub3QgYSBzd2l0Y2ggKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjID0gY21nYnJrKCk7CisgICAgICAgICAgICBpZiAoKGdldHZhbCA9IChjID09ICc6JyB8fCBjID09ICc9JykpICYmICEoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZ2V0dmFsICYmIChjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoY21yZXN1bHQubnJlc3VsdCkgeworCSAgICAgIGNhc2UgQVNLX1FVSToKKwkJbm9tc2cgPSAxOworCQlicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBBU0tfUFVQOgorICAgICAgICAgICAgICAgIHBvcHVwZmxnID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwkgICAgICBjYXNlIEFTS19HVUk6CisJCWd1aWZsZyA9IDE7CisJCWJyZWFrOworICAgICAgICAgICAgICBjYXNlIEFTS19UTU86IHsKKyAgICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtbnVtKCJzZWNvbmRzIiwiMSIsMTAsJngseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgICBteXRpbWVyID0geDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNhc2UgQVNLX0RFRjogeworICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21mbGQoIlRleHQgdG8gc3VwcGx5IGlmIHJlcGx5IGlzIGVtcHR5IiwKKwkJCQkgIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKwkJICBja3N0cm5jcHkoZGZidWYscywxMDI0KTsKKwkJICBkZmFuc3dlciA9IGRmYnVmOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuKC0yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBIYXZlIHZhcmlhYmxlIG5hbWUsIG1ha2UgY29weS4gKi8KKyAgICAgICAgY2tzdHJuY3B5KHZuYW1idWYsY21yZXN1bHQuc3Jlc3VsdCxWTkFNTCk7CisgICAgICAgIHZucCA9IHZuYW1idWY7CisgICAgICAgIGlmICh2bmFtYnVmWzBdID09IENNRFEgJiYKKyAgICAgICAgICAgICh2bmFtYnVmWzFdID09ICclJyB8fCB2bmFtYnVmWzFdID09ICcmJykpCisgICAgICAgICAgdm5wKys7CisgICAgICAgIHkgPSAwOworICAgICAgICBpZiAoKnZucCA9PSAnJScgfHwgKnZucCA9PSAnJicpIHsKKyAgICAgICAgICAgIGlmICgoeSA9IHBhcnNldmFyKHZucCwmeCwmeikpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjeCAhPSBYWEdPSyAmJiBjeCAhPSBYWFJEQkwpIHsgLyogR2V0IHZhcmlhYmxlIG5hbWUgKi8KKyAgICAgICAgaWYgKCh5ID0gY21mbGQoIlZhcmlhYmxlIG5hbWUiLCIiLCZzLE5VTEwpKSA8IDApIHsKKyAgICAgICAgICAgIGlmICh5ID09IC0zKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VmFyaWFibGUgbmFtZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0gZWxzZSByZXR1cm4oeSk7CisgICAgICAgIH0KKyAgICAgICAgY2tzdHJuY3B5KHZuYW1idWYscyxWTkFNTCk7ICAgICAvKiBNYWtlIGEgY29weS4gKi8KKyAgICAgICAgdm5wID0gdm5hbWJ1ZjsKKyAgICAgICAgaWYgKHZuYW1idWZbMF0gPT0gQ01EUSAmJgorICAgICAgICAgICAgKHZuYW1idWZbMV0gPT0gJyUnIHx8IHZuYW1idWZbMV0gPT0gJyYnKSkKKyAgICAgICAgICB2bnArKzsKKyAgICAgICAgeSA9IDA7CisgICAgICAgIGlmICgqdm5wID09ICclJyB8fCAqdm5wID09ICcmJykgeworICAgICAgICAgICAgaWYgKCh5ID0gcGFyc2V2YXIodm5wLCZ4LCZ6KSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGN4ID09IFhYUkVBIHx8IGN4ID09IFhYUkRCTCkgeyAgLyogUkVBRCBvciBSRUFEQkxPQ0sgY29tbWFuZCAqLworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApICAgICAgICAgIC8qIEdldCBjb25maXJtYXRpb24gKi8KKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmIChjaGtmbihaUkZJTEUpIDwgMSkgeyAgICAgICAgLyogRmlsZSBvcGVuPyAqLworICAgICAgICAgICAgcHJpbnRmKCI/UmVhZCBmaWxlIG5vdCBvcGVuXG4iKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEocyA9IChjaGFyICopcmVhZGJ1ZikpIHsgICAgICAgICAgIC8qIFdoZXJlIHRvIHJlYWQgaW50by4gKi8KKyAgICAgICAgICAgIHByaW50ZigiP09vcHMsIG5vIFJFQUQgYnVmZmVyIVxuIik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICB9CisgICAgICAgIHkgPSB6c2lubChaUkZJTEUsIHMsIHJlYWRibG9jayk7IC8qIFJlYWQgYSBsaW5lLiAqLworICAgICAgICBkZWJ1ZyhGMTExLCJyZWFkIHpzaW5sIixzLHkpOworICAgICAgICBpZiAoeSA8IDApIHsgICAgICAgICAgICAgICAgICAgIC8qIE9uIEVPRiBvciBvdGhlciBlcnJvciwgKi8KKyAgICAgICAgICAgIHpjbG9zZShaUkZJTEUpOyAgICAgICAgICAgICAvKiBjbG9zZSB0aGUgZmlsZSwgKi8KKyAgICAgICAgICAgIGRlbG1hYyh2bnAsMCk7ICAgICAgICAgICAgICAvKiBkZWxldGUgdGhlIHZhcmlhYmxlLCAqLworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsgICAgICAgIC8qIGFuZCByZXR1cm4gZmFpbHVyZS4gKi8KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIHdhcyBPSy4gKi8KKyAgICAgICAgICAgIHJlYWRzaXplID0gKGludCkgc3RybGVuKHMpOworICAgICAgICAgICAgc3VjY2VzcyA9IChhZGRtYWModm5wLHMpIDwgMCA/IDAgOiAxKTsgLyogRGVmaW5lIHZhcmlhYmxlICovCisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJyZWFkIGFkZG1hYyIsdm5wLHN1Y2Nlc3MpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MpOyAgICAgICAgICAgIC8qIFJldHVybiBzdWNjZXNzLiAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyogQVNLLCBBU0tRLCBHRVRPSywgb3IgR0VUQyAqLworCisgICAgaWYgKGN4ID09IFhYR09LKSB7CQkJLyogR0VUT0sgY2FuIHRha2Ugc3dpdGNoZXMgKi8KKyAgICAgICAgc3RydWN0IEZEQiBzdywgZmw7CisgICAgICAgIGludCBnZXR2YWw7CisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgY21mZGJpKCZzdywgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBGREIgLSBjb21tYW5kIHN3aXRjaGVzICovCisgICAgICAgICAgICAgICBfQ01LRVksICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgICAgICJWYXJpYWJsZSBuYW1lIG9yIHF1ZXN0aW9uIHByb21wdCIsCisgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgICAgICBuYXNrdGFiLCAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworICAgICAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgIGFza3RhYiwgICAgICAgICAgICAgICAgICAvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgICAgICAgICAmZmwgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICAgICAgKTsKKyAgICAgICAgY21mZGJpKCZmbCwgICAgICAgICAgICAgICAgICAgICAvKiBBbnl0aGluZyB0aGF0IGRvZXNuJ3QgbWF0Y2ggKi8KKyAgICAgICAgICAgICAgIF9DTVRYVCwgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKyAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAvKiBQYXJzZSAwIG9yIG1vcmUgc3dpdGNoZXMgKi8KKyAgICAgICAgICAgIHggPSBjbWZkYigmc3cpOyAgICAgICAgICAgICAvKiBQYXJzZSBzb21ldGhpbmcgKi8KKyAgICAgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkgLyogQnJlYWsgb3V0IGlmIG5vdCBhIHN3aXRjaCAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGMgPSBjbWdicmsoKTsKKyAgICAgICAgICAgIGlmICgoZ2V0dmFsID0gKGMgPT0gJzonIHx8IGMgPT0gJz0nKSkgJiYgIShjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFnZXR2YWwgJiYgKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChjbXJlc3VsdC5ucmVzdWx0KSB7CisgICAgICAgICAgICAgIGNhc2UgQVNLX1BVUDoKKyAgICAgICAgICAgICAgICBwb3B1cGZsZyA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisJICAgICAgY2FzZSBBU0tfR1VJOgorCQlndWlmbGcgPSAxOworCQlicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBBU0tfVE1POiB7CisgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbW51bSgic2Vjb25kcyIsIjEiLDEwLCZ4LHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICBpZiAoeCA8IDApCisgICAgICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgICAgbXl0aW1lciA9IHg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjYXNlIEFTS19ERUY6IHsKKyAgICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtZmxkKCJUZXh0IHRvIHN1cHBseSBpZiByZXBseSBpcyBlbXB0eSIsCisJCQkJICIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisJCSAgY2tzdHJuY3B5KGRmYnVmLHMsMTAyNCk7CisJCSAgZGZhbnN3ZXIgPSBkZmJ1ZjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisJICAgICAgY2FzZSBBU0tfUVVJOgorCQlub21zZyA9IDE7CisJCWJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4oLTIpOworICAgICAgICAgICAgfQorCX0KKwlwID0gY21yZXN1bHQuc3Jlc3VsdDsKKyAgICB9IGVsc2UKKyAgICAgIGlmICgoeSA9IGNtdHh0KAorIlByb21wdCxcblwKKyBlbmNsb3NlIGluIHsgYnJhY2VzIH0gb3IgXCIgcXVvdGVzIFwiIHRvIHByZXNlcnZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG5cCisgc3BhY2VzLCBwcmVjZWRlIHF1ZXN0aW9uIG1hcmsgd2l0aCBiYWNrc2xhc2ggKFxcKS4iLAorICAgICAgICAgICAgICAgICAgICIiLCZwLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICByZXR1cm4oeSk7CisKKyAgICBpZiAoIXApIHAgPSAiIjsKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgIGlmIChwb3B1cGZsZykgeyAgICAgICAgICAgICAgICAgICAgIC8qIFBvcHVwIHJlcXVlc3RlZCAqLworICAgICAgICBpbnQgbGVuID0gLTE7CisgICAgICAgIGNrc3RybmNweSh0bXBidWYsYnJzdHJpcChwKSxUTVBCVUZTSVopOworICAgICAgICBwID0gdG1wYnVmOworICAgICAgICBpZiAoY3ggPT0gWFhBU0sgfHwgY3ggPT0gWFhBU0tRKSB7CisgICAgICAgICAgICBpZiAoY3ggPT0gWFhBU0spCisgICAgICAgICAgICAgIGxlbiA9IHBvcHVwX3JlYWR0ZXh0KHZtb2RlLE5VTEwscCxsaW5lLExJTkJVRlNJWixteXRpbWVyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgbGVuID0gcG9wdXBfcmVhZHBhc3Modm1vZGUsTlVMTCxwLGxpbmUsTElOQlVGU0laLG15dGltZXIpOworICAgICAgICAgICAgYXNrdGltZWRvdXQgPSAoIGxlbiA8IDAgJiYgbXl0aW1lciApOworICAgICAgICB9IGVsc2UgaWYgKGN4ID09IFhYR09LKSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCBHRVRPSyAvUE9QVVAgbm90IGltcGxlbWVudGVkIHlldFxuIik7CisJICAgIHRpbWVsaW1pdCA9IDA7CisJICAgIHJldHVybigtOSk7CisJfQorICAgICAgICBpZiAobGVuID49IDApIHsKKwkgICAgeSA9IGFkZG1hYyh2bnAsKGNoYXIgKilsaW5lKTsgLyogQWRkIGl0IHRvIHRoZSBtYWNybyB0YWJsZS4gKi8KKyAgICAgICAgfSBlbHNlIGlmICggYXNrdGltZWRvdXQgJiYgZGZhbnN3ZXIgKSB7CisgICAgICAgICAgICB5ID0gYWRkbWFjKHZucCxkZmFuc3dlcik7CSAgICAvKiBBZGQgaXQgdG8gdGhlIG1hY3JvIHRhYmxlLiAqLworICAgICAgICAgICAgYXNrdGltZWRvdXQgPSAwOworICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgfQorICAgICAgICB0aW1lbGltaXQgPSAwOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9ICgobGVuID49IDApICYmICh5ID49IDApKSAmJiAhYXNrdGltZWRvdXQpOworICAgIH0KKyNpZmRlZiBLVUkKKyAgICBpZiAoZ3VpZmxnKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHVUkgcmVxdWVzdGVkICovCisgICAgICAgIGludCByYywgbjsKKwljaGFyICogczE7CisJczEgPSB0bXBidWY7CisJbiA9IFRNUEJVRlNJWi0xOworCXp6c3RyaW5nKGJyc3RyaXAocCksJnMxLCZuKTsKKyAgICAgICAgcCA9IHRtcGJ1ZjsKKyAgICAgICAgaWYgKGN4ID09IFhYQVNLIHx8IGN4ID09IFhYQVNLUSkgeworICAgICAgICAgICAgcmMgPSBndWlfdHh0X2RpYWxvZyhOVUxMLHAsKGN4ID09IFhYQVNLKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSxMSU5CVUZTSVosZGZhbnN3ZXIsbXl0aW1lcik7CisgICAgICAgICAgICBhc2t0aW1lZG91dCA9IChyYyA9PSAtMSAmJiBteXRpbWVyKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSAxKSB7CisgICAgICAgICAgICAgICAgeSA9IGFkZG1hYyh2bnAsKGNoYXIgKilsaW5lKTsgLyogQWRkIGl0IHRvIHRoZSBtYWNybyB0YWJsZS4gKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIGFza3RpbWVkb3V0ICYmIGRmYW5zd2VyICkgeworICAgICAgICAgICAgICAgIHkgPSBhZGRtYWModm5wLGRmYW5zd2VyKTsgLyogQWRkIGRlZmF1bHQgdG8gbWFjcm8gdGFibGUuICovCisgICAgICAgICAgICAgICAgYXNrdGltZWRvdXQgPSAwOworICAgICAgICAgICAgICAgIHJjID0gMTsKKyAgICAgICAgICAgIH0KKwkgICAgdGltZWxpbWl0ID0gMDsKKwkgICAgcmV0dXJuKHN1Y2Nlc3MgPSAocmMgPT0gMSAmJiAoeSA+PSAwKSkgJiYgIWFza3RpbWVkb3V0KTsKKwl9IGVsc2UgaWYgKGN4ID09IFhYR09LKSB7CisJICAgIGludCB4OworCSAgICB4ID0gbG9va3VwKHllc25vLGRmYW5zd2VyLG55ZXNubyxOVUxMKTsKKwkgICAgaWYgKHggIT0gMSkgeCA9IDI7CisJICAgIHJjID0gdXFfb2soTlVMTCwgcCwgMywgTlVMTCwgeCk7CisJICAgIHJldHVybihzdWNjZXNzID0gKHJjID09IDEpKTsKKwl9CisgICAgfQorI2VuZGlmIC8qIEtVSSAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7ICAgICAgICAgICAgICAgIC8qIEVudGVyIENCUkVBSyBtb2RlICovCisgICAgY21zYXZwKHBzYXZlLFBST01QVEwpOyAgICAgICAgICAgICAgLyogU2F2ZSBvbGQgcHJvbXB0ICovCisgICAgY21zZXRwKGJyc3RyaXAocCkpOyAgICAgICAgICAgICAgICAgLyogTWFrZSBuZXcgcHJvbXB0ICovCityZXByb21wdDoKKyAgICBpZiAoY3ggPT0gWFhBU0tRKSB7ICAgICAgICAgICAgICAgICAvKiBGb3IgQVNLUSwgKi8KKyAgICAgICAgY21pbmkoMCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBuby1lY2hvIG1vZGUuICovCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIG90aGVycywgcmVndWxhciBlY2hvaW5nLiAqLworICAgICAgICBjbWluaShja3hlY2gpOworICAgIH0KKyAgICBhc2tmbGFnID0gMTsKKyAgICB4ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIG1lYW5zIHRvIHJlcGFyc2UuICovCisgICAgY21mbGdzID0gMDsKKyAgICBpZiAocGZsYWcpCisgICAgICBwcm9tcHQoeHhzdHJpbmcpOyAgICAgICAgICAgICAgICAgLyogSXNzdWUgcHJvbXB0LiAqLworCisgICAgYXNrdGltZWRvdXQgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogSGFuZGxlIHRpbWVkIHJlc3BvbnNlcy4gKi8KKyAgICB0aW1lbGltaXQgPSBteXRpbWVyOworcmVwYXJzZToKKyAgICBjbXJlcygpOworICAgIGlmIChjeCA9PSBYWEdPSykgeyAgICAgICAgICAgICAgICAgIC8qIEdFVE9LICovCisjaWZkZWYgQ0tfUkVDQUxMCisgICAgICAgIG9uX3JlY2FsbCA9IDA7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisgICAgICAgIGFza2ZsYWcgPSAwOworCS8qIEdFVE9LIHVzZXMga2V5d29yZCB0YWJsZSAqLworICAgICAgICB4ID0gY21rZXkoeWVzbm8sbnllc25vLCIiLGRmYW5zd2VyLHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKHggPCAwKSB7ICAgICAgICAgICAgICAgICAgICAvKiBQYXJzZSBlcnJvciAqLworICAgICAgICAgICAgaWYgKHggPT0gLTEwKSB7CisJCWNoYXIgKiBkczsKKwkJZHMgPSBkZmFuc3dlciA/IGRmYW5zd2VyIDogIk5vIjsKKwkJaWYgKCFub21zZykKKwkJICBwcmludGYoIj9UaW1lZCBvdXQsIGFzc3VtaW5nIFwiJXNcIiIsZHMpOworCQlwcmludGYoIlxuIik7CisgICAgICAgICAgICAgICAgYXNrdGltZWRvdXQgPSAxOworCQl4ID0gbG9va3VwKHllc25vLGRzLG55ZXNubyxOVUxMKTsKKwkJaWYgKHggIT0gMSkgeCA9IDA7CisgICAgICAgICAgICAgICAgZ290byBnb2tkb25lOworICAgICAgICAgICAgfSBlbHNlIGlmICh4ID09IC0zKSB7ICAgICAgIC8qIE5vIGFuc3dlcj8gKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIlBsZWFzZSByZXNwb25kIFllcyBvciBOb1xuIik7IC8qIE1ha2UgdGhlbSBhbnN3ZXIgKi8KKyAgICAgICAgICAgICAgICBjbWluaShja3hlY2gpOworICAgICAgICAgICAgICAgIGdvdG8gcmVwcm9tcHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJlcGFyc2U7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgZ290byByZXByb21wdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY21jZm0oKSA8IDApICAgICAgICAgICAgICAgIC8qIEdldCBjb25maXJtYXRpb24gKi8KKyAgICAgICAgICBnb3RvIHJlcGFyc2U7CisgIGdva2RvbmU6CisgICAgICAgIGFza2ZsYWcgPSAwOworICAgICAgICBjbXNldHAocHNhdmUpOyAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgcHJvbXB0ICovCisjaWZkZWYgVk1TCisgICAgICAgIGlmIChjbWRsdmwgPiAwKSAgICAgICAgICAgICAgICAgLyogSW4gVk1TIGFuZCBub3QgYXQgdG9wIGxldmVsLCAqLworICAgICAgICAgIGNvbnJlcygpOyAgICAgICAgICAgICAgICAgICAgIC8qICByZXN0b3JlIGNvbnNvbGUgYWdhaW4uICovCisjZW5kaWYgLyogVk1TICovCisgICAgICAgIHRpbWVsaW1pdCA9IDA7CisgICAgICAgIHJldHVybih4KTsgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIHN1Y2Nlc3Mgb3IgZmFpbHVyZSAqLworICAgIH0gZWxzZSBpZiAoY3ggPT0gWFhHRVRDICAgICAgICAgICAgIC8qIEdFVEMgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgIHx8IGN4ID09IFhYR0VUSyAgICAgICAgICAvKiBvciBHRVRLRVlDT0RFICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICApIHsgICAgICAgICAgICAgICAgICAgICAgLyogR0VUQyAqLworICAgICAgICBjaGFyIHRtcFsxNl07CisgICAgICAgIGNvbmJpbigoY2hhcillc2NhcGUpOyAgICAgICAgICAgLyogUHV0IGtleWJvYXJkIGluIHJhdyBtb2RlICovCisjaWZuZGVmIE5PU0VUS0VZCisjaWZkZWYgT1MyCisgICAgICAgIGlmIChjeCA9PSBYWEdFVEspIHsgICAgICAgICAgICAgLyogR0VUS0VZQ09ERSAqLworICAgICAgICAgICAgZXh0ZXJuIGludCBvczJna3M7CisgICAgICAgICAgICBpbnQgdDsKKyAgICAgICAgICAgIHQgPSBvczJna3M7ICAgICAgICAgICAgICAgICAvKiBUdXJuIG9mZiBrdmVyYiByZWNvZ25pdGlvbiAqLworICAgICAgICAgICAgb3MyZ2tzID0gMDsKKyAgICAgICAgICAgIHggPSBjb25na3ModGltZWxpbWl0KTsgICAgICAvKiBSZWFkIGEga2V5IGV2ZW50LCBibG9ja2luZyAqLworICAgICAgICAgICAgb3MyZ2tzID0gdDsgICAgICAgICAgICAgICAgIC8qIFB1dCBiYWNrIGt2ZXJiIHJlY29nbml0aW9uICovCisgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR0VUQyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PU0VUS0VZICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIkdFVEMgY29uY2hrIiwiIixjb25jaGsoKSk7CisgICAgICAgICAgICB4ID0gY29uaW5jKHRpbWVsaW1pdCk7ICAgICAgLyogSnVzdCByZWFkIG9uZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIkdFVEMgY29uaW5jIiwiIix4KTsKKyAgICAgICAgfQorICAgICAgICBjb25jYigoY2hhcillc2NhcGUpOyAgICAgICAgICAgIC8qIFB1dCBrZXlib2FyZCBiYWNrIGluIGNicmVhayBtb2RlICovCisgICAgICAgIGlmICh4ID4gLTEpIHsKKyAgICAgICAgICAgIGlmICh4Y21kc3JjID09IDApCisgICAgICAgICAgICAgIHByaW50ZigiXHJcbiIpOworI2lmZGVmIE9TMgorICAgICAgICAgICAgaWYgKGN4ID09IFhYR0VUSykgeyAgICAgICAgIC8qIEdFVEtFWUNPREUgKi8KKyAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwiJWQiLHgpOyAgICAvKiBTQUZFICovCisgICAgICAgICAgICB9IGVsc2UgeworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgIHRtcFswXSA9IChjaGFyKSAoeCAmIDB4ZmYpOworICAgICAgICAgICAgICAgIHRtcFsxXSA9IE5VTDsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgIHkgPSBhZGRtYWModm5wLHRtcCk7ICAgICAgICAvKiBBZGQgaXQgdG8gdGhlIG1hY3JvIHRhYmxlLiAqLworICAgICAgICAgICAgZGVidWcoRjExMSwiZ2V0Yy9nZXRrIGFkZG1hYyIsdm5wLHkpOworICAgICAgICB9IGVsc2UgeSA9IC0xOworICAgICAgICBjbXNldHAocHNhdmUpOyAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgb2xkIHByb21wdC4gKi8KKyAgICAgICAgaWYgKHggPCAtMSkgeworICAgICAgICAgICAgYXNrdGltZWRvdXQgPSAxOworICAgICAgICAgICAgaWYgKCFxdWlldCAmJiAhbm9tc2cpCisgICAgICAgICAgICAgIHByaW50ZigiP1RpbWVkIG91dCIpOworCSAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgdGltZWxpbWl0ID0gMDsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAoKHkgPCAwID8gMCA6IDEpICYmIChhc2t0aW1lZG91dCA9PSAwKSkpOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFTSyBvciBBU0tRICovCisjaWZkZWYgQ0tfUkVDQUxMCisgICAgICAgIG9uX3JlY2FsbCA9IDA7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisgICAgICAgIHkgPSBjbWRncXVvKCk7ICAgICAgICAgICAgICAgICAgLyogR2V0IGN1cnJlbnQgcXVvdGluZyAqLworICAgICAgICBjbWRzcXVvKDApOyAgICAgICAgICAgICAgICAgICAgIC8qIFR1cm4gb2ZmIHF1b3RpbmcgKi8KKyAgICAgICAgd2hpbGUgKHggPT0gLTEpIHsgICAgICAgICAgICAgICAvKiBQcm9tcHQgdGlsbCB0aGV5IGFuc3dlciAqLworICAgICAgICAgICAgeCA9IGNtdHh0KCJQbGVhc2UgcmVzcG9uZC4iLGRmYW5zd2VyLCZzLE5VTEwpOworICAgICAgICAgICAgZGVidWcoRjExMSwiQVNLIGNtdHh0IixzLHgpOworICAgICAgICAgICAgY21yZXMoKTsKKyAgICAgICAgfQorICAgICAgICBjbWRzcXVvKHkpOyAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgcHJldmlvdXMgcXVvdGluZyAqLworICAgICAgICBpZiAoY3ggPT0gWFhBU0tRKSAgICAgICAgICAgICAgIC8qIEFTS1EgbXVzdCBlY2hvIENSTEYgaGVyZSAqLworICAgICAgICAgIHByaW50ZigiXHJcbiIpOworCWlmICh4ID09IC0xMCAmJiBkZmFuc3dlcikgewkvKiBEb24ndCBmYWlsIG9uIHRpbWVvdXQgaWYgKi8KKwkgICAgcyA9IGRmYW5zd2VyOwkJLyogYSBkZWZhdWx0IHdhcyBzcGVjaWZpZWQgKi8KKwkgICAgYXNrdGltZWRvdXQgPSAwOwkJLyogYW5kIGRvbid0IGZhaWwgKi8KKwkgICAgeCA9IDA7CisJfQorICAgICAgICBpZiAoeCA8IDApIHsgICAgICAgICAgICAgICAgICAgIC8qIElmIGNtdHh0IHBhcnNlIGVycm9yLCAqLworICAgICAgICAgICAgY21zZXRwKHBzYXZlKTsgICAgICAgICAgICAgIC8qIHJlc3RvcmUgb3JpZ2luYWwgcHJvbXB0ICovCisjaWZkZWYgVk1TCisgICAgICAgICAgICBpZiAoY21kbHZsID4gMCkgICAgICAgICAgICAgLyogSW4gVk1TIGFuZCBub3QgYXQgdG9wIGxldmVsLCAqLworICAgICAgICAgICAgICBjb25yZXMoKTsgICAgICAgICAgICAgICAgIC8qICByZXN0b3JlIGNvbnNvbGUgYWdhaW4uICovCisjZW5kaWYgLyogVk1TICovCisgICAgICAgICAgICBpZiAoeCA9PSAtMTApIHsJCS8qIFRpbWVkIG91dCB3aXRoIG5vIHJlc3BvbnNlICovCisJCWlmICghbm9tc2cpCisJCSAgcHJpbnRmKCI/VGltZWQgb3V0Iik7CisJCXByaW50ZigiXG4iKTsKKyAgICAgICAgICAgICAgICBhc2t0aW1lZG91dCA9IDE7CisJCWlmIChkZmFuc3dlcikJCS8qIFN1cHBseSBkZWZhdWx0IGFuc3dlciBpZiBhbnkgKi8KKwkJICBzID0gZGZhbnN3ZXI7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHggPSAwOwkvKiAod2FzICJ4ID0gLTk7IikgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVsaW1pdCA9IDA7CisgICAgICAgICAgICByZXR1cm4oeCk7ICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiBjbXR4dCdzIGVycm9yIGNvZGUuICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzIHx8ICpzID09IE5VTCkgewkJLyogSWYgdXNlciB0eXBlZCBhIGJhcmUgQ1IsICovCisgICAgICAgICAgICBjbXNldHAocHNhdmUpOyAgICAgICAgICAgICAgLyogUmVzdG9yZSBvbGQgcHJvbXB0LCAqLworICAgICAgICAgICAgZGVsbWFjKHZucCwwKTsgICAgICAgICAgICAgIC8qIGRlbGV0ZSB2YXJpYWJsZSBpZiBpdCBleGlzdHMsICovCisjaWZkZWYgVk1TCisgICAgICAgICAgICBpZiAoY21kbHZsID4gMCkgICAgICAgICAgICAgLyogSW4gVk1TIGFuZCBub3QgYXQgdG9wIGxldmVsLCAqLworICAgICAgICAgICAgICBjb25yZXMoKTsgICAgICAgICAgICAgICAgIC8qICByZXN0b3JlIGNvbnNvbGUgYWdhaW4uICovCisjZW5kaWYgLyogVk1TICovCisgICAgICAgICAgICB0aW1lbGltaXQgPSAwOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsgICAgICAgIC8qIGFuZCByZXR1cm4uICovCisgICAgICAgIH0KKyAgICAgICAgeSA9IGFkZG1hYyh2bnAscyk7ICAgICAgICAgICAgICAvKiBBZGQgaXQgdG8gdGhlIG1hY3JvIHRhYmxlLiAqLworICAgICAgICBkZWJ1ZyhGMTExLCJhc2sgYWRkbWFjIix2bnAseSk7CisgICAgICAgIGNtc2V0cChwc2F2ZSk7ICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBvbGQgcHJvbXB0LiAqLworI2lmZGVmIFZNUworICAgICAgICBpZiAoY21kbHZsID4gMCkgICAgICAgICAgICAgICAgIC8qIEluIFZNUyBhbmQgbm90IGF0IHRvcCBsZXZlbCwgKi8KKyAgICAgICAgICBjb25yZXMoKTsgICAgICAgICAgICAgICAgICAgICAvKiAgcmVzdG9yZSBjb25zb2xlIGFnYWluLiAqLworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICB0aW1lbGltaXQgPSAwOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9ICh5IDwgMCA/IDAgOiAxKSAmJiAoYXNrdGltZWRvdXQgPT0gMCkpOworICAgIH0KK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PU1BMCitpbnQKK2RvaW5jcihjeCkgaW50IGN4OyB7ICAgICAgICAgICAgICAgICAgICAvKiBJTkNSRU1FTlQsIERFQ1JFTUVOVCAqLworICAgIGNoYXIgdm5hbWJ1ZltWTkFNTCsxXTsgICAgICAgICAgICAgIC8qIEJ1ZmZlciBmb3IgdmFyaWFibGUgbmFtZXMgKi8KKyAgICBpbnQgZXZhbCA9IDA7CisgICAgZXZhbCA9IChjeCA9PSBYWF9ERUNSIHx8IGN4ID09IFhYX0lOQ1IpOworCisgICAgaWYgKCh5ID0gY21mbGQoIlZhcmlhYmxlIG5hbWUiLCIiLCZzLCBldmFsID8geHhzdHJpbmcgOiBOVUxMKSkgPCAwKSB7CisgICAgICAgIGlmICh5ID09IC0zKSB7CisgICAgICAgICAgICBwcmludGYoIj9WYXJpYWJsZSBuYW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0gZWxzZSByZXR1cm4oeSk7CisgICAgfQorICAgIGNrc3RybmNweSh2bmFtYnVmLHMsVk5BTUwpOworICAgIGlmICgoeSA9IGNtbnVtKCJieSBhbW91bnQiLCIxIiwxMCwmeCx4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih5KTsKKyAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICByZXR1cm4oeSk7CisKKyAgICB6ID0gKGN4ID09IFhYX0lOQ1IgfHwgY3ggPT0gWFhJTkMpID8gMSA6IDA7IC8qIEluY3JlbWVudCBvciBkZWNyZW1lbnQ/ICovCisKKyAgICBpZiAoaW5jdmFyKHZuYW1idWYseCx6KSA8IDApIHsKKyAgICAgICAgcHJpbnRmKCI/VmFyaWFibGUgJXMgbm90IGRlZmluZWQgb3Igbm90IG51bWVyaWNcbiIsdm5hbWJ1Zik7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgfQorICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisKKy8qIFVzZWQgYnkgZG91bmRlZigpICovCitzdGF0aWMgaW50Cit4eHVuZGVmKHMsdmVyYm9zZSxzaW11bGF0ZSkgY2hhciAqIHM7IGludCB2ZXJib3NlLCBzaW11bGF0ZTsgeworICAgIGludCByYyA9IDA7CisgICAgaWYgKCFzKSByZXR1cm4oMCk7CisgICAgaWYgKCpzID09IENNRFEgJiYgKihzKzEpID09ICclJykgeworICAgICAgICBjaGFyIGMgPSAqKHMrMiksICogcCA9IE5VTEw7CisgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgaWYgKG1hY2x2bCA8IDApCisgICAgICAgICAgICAgIHAgPSBnX3ZhcltjXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcCA9IG1fYXJnW21hY2x2bF1bYyAtICcwJ107CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaXN1cHBlcihjKSkgYyArPSAoJ2EnLSdBJyk7CisgICAgICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCisgICAgICAgICAgICAgIHAgPSBnX3ZhcltjXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXApIHJldHVybigtMSk7CisgICAgfQorICAgIGlmICh2ZXJib3NlKQorICAgICAgcHJpbnRmKCIgJXMgIixzKTsKKyAgICBpZiAoc2ltdWxhdGUpIHsKKyAgICAgICAgcHJpbnRmKCIoU0VMRUNURUQpXG4iKTsKKyAgICB9IGVsc2UgaWYgKCh4ID0gZGVsbWFjKHMsMSkpID4gLTEpIHsgLyogRnVsbCBuYW1lIHJlcXVpcmVkICovCisgICAgICAgIHJjID0gMTsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHByaW50ZigiKE9LKVxuIik7CisgICAgfSBlbHNlIGlmICh2ZXJib3NlKQorICAgICAgcHJpbnRmKCIoRkFJTEVEKVxuIik7CisgICAgcmV0dXJuKHJjKTsKK30KKworLyogRG8gdGhlIChfKURFRklORSwgKF8pQVNTSUdOLCBhbmQgVU5ERUZJTkUgY29tbWFuZHMgKi8KKworI2RlZmluZSBVTkRfTUFUIDEKKyNkZWZpbmUgVU5EX1ZSQiAyCisjZGVmaW5lIFVORF9FWEMgMworI2RlZmluZSBVTkRfU0lNIDMKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgdW5kZWZzd2lbXSA9IHsKKyAgICB7ICIvbGlzdCIsICAgICBVTkRfVlJCLCAwIH0sCisjaWZkZWYgQ09NTUVOVAorICAgIHsgIi9leGNlcHQiLCAgIFVORF9FWEMsIENNX0FSRyB9LAorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB7ICIvbWF0Y2hpbmciLCBVTkRfTUFULCAwIH0sCisgICAgeyAiL3NpbXVsYXRlIiwgVU5EX1NJTSwgMCB9LAorICAgIHsgIi92ZXJib3NlIiwgIFVORF9WUkIsIENNX0lOViB9Cit9Oworc3RhdGljIGludCBudW5kZWZzd2kgPSBzaXplb2YodW5kZWZzd2kpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpOworCisjZGVmaW5lIFVOREVGTUFYIDY0CitzdGF0aWMgY2hhciAqKiB1bmRlZmxpc3QgPSBOVUxMOworaW50Citkb3VuZGVmKGN4KSBpbnQgY3g7IHsgICAgICAgICAgICAgICAgICAgLyogVU5ERUYsIF9VTkRFRiAqLworICAgIGludCBpLCBqLCBuLCByYyA9IDAsIGFycmF5bXNnID0gMDsKKyAgICBpbnQgZG9tYXRjaCA9IDAsIHZlcmJvc2UgPSAwLCBlcnJvcnMgPSAwLCBzaW11bGF0ZSA9IDAsIGZsYWcgPSAwOworICAgIGNoYXIgKnZucCwgdm5idWZbNF07CisjaWZkZWYgQ09NTUVOVAorICAgIGNoYXIgKmV4Y2VwdCA9IE5VTEw7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHN0cnVjdCBGREIgc3csIGZsOworICAgIGludCBnZXR2YWw7CisgICAgY2hhciBjOworCisgICAgaWYgKCF1bmRlZmxpc3QpIHsgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgbGlzdCBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgdW5kZWZsaXN0ID0gKGNoYXIgKiopbWFsbG9jKFVOREVGTUFYICogc2l6ZW9mKGNoYXIgKikpOworICAgICAgICBpZiAoIXVuZGVmbGlzdCkgeworICAgICAgICAgICAgcHJpbnRmKCI/TWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBVTkRFRk1BWDsgaSsrKQorICAgICAgICAgIHVuZGVmbGlzdFtpXSA9IE5VTEw7CisgICAgfQorICAgIGNtZmRiaSgmc3csICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IEZEQiAtIGNvbW1hbmQgc3dpdGNoZXMgKi8KKyAgICAgICAgICAgX0NNS0VZLCAgICAgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAiVmFyaWFibGUgbmFtZSBvciBzd2l0Y2giLAorICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICBudW5kZWZzd2ksICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgIHVuZGVmc3dpLCAgICAgICAgICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAmZmwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKyAgICAgICAgICAgKTsKKyAgICBjbWZkYmkoJmZsLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbnl0aGluZyB0aGF0IGRvZXNuJ3QgbWF0Y2ggKi8KKyAgICAgICAgICAgX0NNRkxELCAgICAgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKyAgICAgICAgICAgKGN4ID09IFhYVU5ERUYpID8gTlVMTCA6IHh4c3RyaW5nLAorICAgICAgICAgICBOVUxMLAorICAgICAgICAgICBOVUxMCisgICAgICAgICAgICk7CisgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFyc2UgMCBvciBtb3JlIHN3aXRjaGVzICovCisgICAgICAgIHggPSBjbWZkYigmc3cpOyAgICAgICAgICAgICAgICAgLyogUGFyc2Ugc29tZXRoaW5nICovCisgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmIChjbXJlc3VsdC5mY29kZSAhPSBfQ01LRVkpICAgLyogQnJlYWsgb3V0IGlmIG5vdCBhIHN3aXRjaCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjID0gY21nYnJrKCk7CisgICAgICAgIGlmICgoZ2V0dmFsID0gKGMgPT0gJzonIHx8IGMgPT0gJz0nKSkgJiYgIShjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIGRvZXMgbm90IHRha2UgYW4gYXJndW1lbnRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNtcmVzdWx0Lm5yZXN1bHQpIHsKKyAgICAgICAgICBjYXNlIFVORF9NQVQ6IGRvbWF0Y2ggID0gMTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBVTkRfU0lNOiBzaW11bGF0ZSA9IDE7IC8qIGZhbGwgdGhydSBvbiBwdXJwb3NlICovCisgICAgICAgICAgY2FzZSBVTkRfVlJCOiB2ZXJib3NlICA9IDE7IGJyZWFrOworCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgIGNhc2UgVU5EX0VYQzoKKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKCJQYXR0ZXJuIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1BhdHRlcm4gcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYWtlc3RyKCZleGNlcHQsY21yZXN1bHQuc3Jlc3VsdCk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBuID0gMDsKKyAgICBtYWtlc3RyKCYodW5kZWZsaXN0W24rK10pLGNtcmVzdWx0LnNyZXN1bHQpOworICAgIGZvciAoaSA9IDE7IGkgPCBVTkRFRk1BWDsgaSsrKSB7CisgICAgICAgIHggPSBjbWZsZCgiTWFjcm8gb3IgdmFyaWFibGUgbmFtZSIsIiIsJnMsCisgICAgICAgICAgICAgICAgICAoKGN4ID09IFhYVU5ERUYpID8gTlVMTCA6IHh4c3RyaW5nKQorICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoeSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgfQorICAgICAgICBtYWtlc3RyKCYodW5kZWZsaXN0W24rK10pLHMpOworICAgIH0KKyAgICAvKiBOb3cgd2UgaGF2ZSBhIGxpc3Qgb2YgbiB2YXJpYWJsZXMgb3IgcGF0dGVybnMgdG8gdW5kZWZpbmUgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZmxhZyA9IDA7CisgICAgICAgIGlmICghKHZucCA9IHVuZGVmbGlzdFtpXSkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICh2bnBbMF0gPT0gQ01EUSAmJiAodm5wWzFdID09ICclJyB8fCB2bnBbMV0gPT0gJyYnKSkgeworICAgICAgICAgICAgZmxhZysrOworICAgICAgICAgICAgdm5wKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkb21hdGNoKSB7ICAgICAgICAgICAgICAgICAvKiBQYXR0ZXJuIG1hdGNoIG5vdCByZXF1ZXN0ZWQgKi8KKyAgICAgICAgICAgIGlmIChmbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKCh5ID0gcGFyc2V2YXIodm5wLCZ4LCZ6KSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHZucC0tOworICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkgcHJpbnRmKCIgJXMuLi5lcnJvclxuIix2bnApOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdm5wLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4ID0geHh1bmRlZih2bnAsdmVyYm9zZSxzaW11bGF0ZSk7CisgICAgICAgICAgICBpZiAoeCA+IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKCF4ICYmICFzaW11bGF0ZSkgZXJyb3JzKys7CisgICAgICAgICAgICAgICAgcmMgKz0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8qIFBhdHRlcm4gbWF0Y2ggcmVxdWVzdGVkICovCisKKyAgICAgICAgaWYgKCFmbGFnKSB7ICAgICAgICAgICAgICAgICAgICAvKiBJdCdzIGEgbWFjcm8gKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBubWFjOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2ttYXRjaCh2bnAsbWFjdGFiW2pdLmt3ZCwwLDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSB4eHVuZGVmKG1hY3RhYltqXS5rd2QsdmVyYm9zZSxzaW11bGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjICs9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXgpIGVycm9ycysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghc2ltdWxhdGUpCisgICAgICAgICAgICAgICAgICAgICAgai0tOyAgICAgICAgICAgICAgLyogQmVjYXVzZSBtYWN0YWIgc2hpZnRlZCB1cCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2bnBbMF0gPT0gJyUnKSB7ICAgICAvKiBJdCdzIGEgXCV4IHZhcmlhYmxlICovCisgICAgICAgICAgICB2bmJ1ZlswXSA9IENNRFE7CisgICAgICAgICAgICB2bmJ1ZlsxXSA9ICclJzsKKyAgICAgICAgICAgIHZuYnVmWzNdID0gTlVMOworICAgICAgICAgICAgZm9yIChqID0gJzAnOyBqIDw9ICd6JzsgaisrKSB7IC8qIDAuLjkgYS4ueiAqLworICAgICAgICAgICAgICAgIHZuYnVmWzJdID0gajsKKyAgICAgICAgICAgICAgICBpZiAoY2ttYXRjaCh2bnAsJnZuYnVmWzFdLDAsMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IHh4dW5kZWYodm5idWYsdmVyYm9zZSxzaW11bGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgheCkgZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICByYyArPSB4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09ICc5JykgaiA9IChpbnQpJ2EnIC0gMTsgLyogOSAtPiBhICovCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodm5wWzBdID09ICcmJykgeworICAgICAgICAgICAgaWYgKCFhcnJheW1zZyAmJiAhcXVpZXQpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9VTkRFRklORSAvTUFUQ0ggY2FuJ3QgYmUgdXNlZCB3aXRoIGFycmF5cy5cbiIpOworICAgICAgICAgICAgICAgIHByaW50ZigiKFR5cGUgSEVMUCBBUlJBWSB0byBzZWUgb3RoZXIgbWV0aG9kcy4pXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFycmF5bXNnKys7CisgICAgICAgICAgICBlcnJvcnMrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodmVyYm9zZSkKKyAgICAgIHByaW50ZigidW5kZWZpbmVkOiAlZCwgZXJyb3JzOiAlZFxuIixyYyxlcnJvcnMpOworCisgICAgZm9yIChpID0gMDsgaSA8IFVOREVGTUFYOyBpKyspIHsgICAgLyogQ2hlY2sgdGhlbSBhbGwgKi8KKyAgICAgICAgaWYgKHVuZGVmbGlzdFtpXSkgeyAgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIHdlcmUgaW50ZXJydXB0ZWQgKi8KKyAgICAgICAgICAgIGZyZWUodW5kZWZsaXN0W2ldKTsgICAgICAgICAvKiBwcmV2aW91c2x5Li4uICovCisgICAgICAgICAgICB1bmRlZmxpc3RbaV0gPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybihzdWNjZXNzID0gKGVycm9ycyA9PSAwKSA/IDEgOiAwKTsKK30KKworaW50Citkb2RlZihjeCkgaW50IGN4OyB7CisgICAgZXh0ZXJuIGludCB4eGRvdDsKKyAgICBleHRlcm4gY2hhciBwcHZuYW1idWZbXTsKKyAgICBpbnQgZG9ldmFsID0gMDsKKyAgICBjaGFyIHZuYW1idWZbVk5BTUwrMV07ICAgICAgICAgICAgICAvKiBCdWZmZXIgZm9yIHZhcmlhYmxlIG5hbWVzICovCisgICAgY2hhciAqdm5wOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBzYW1lICovCisgICAgaW50IGssIG15ZG90OworICAgIG15ZG90ID0geHhkb3Q7ICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgKi8KKyAgICB4eGRvdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcmVzZXQgKi8KKy8qCisgIEluIGNhc2Ugd2UgZ290IGhlcmUgZnJvbSBhIGNvbW1hbmQgdGhhdCBiZWdpbnMgbGlrZSAiLlwlYSIsIGNta2V5KCkgaGFzCisgIGFscmVhZHkgZXZhbHVhdGVkIFwlYSwgYnV0IHdlIGRvbid0IHdhbnQgdGhhdCwgc28gd2UgcmV0cmlldmUgdGhlIHZhcmlhYmxlCisgIG5hbWUgZnJvbSBhIHNwZWNpYWwgcHJlLWV2YWx1YXRpb24gYnVmZmVyIGluIHRoZSBjb21tYW5kIG1vZHVsZSwgYW5kIHdlCisgIHVuZG8gdGhlICJ1bmdldCB3b3JkIiB0aGF0IHdvdWxkIGJlIGRvbmUgYmVjYXVzZSBvZiB0aGUgdG9rZW4sIGJlY2F1c2UgaWYKKyAgdGhlIHZhcmlhYmxlIHdhcyBkZWZpbmVkLCBpdCB3aWxsIHVuZ2V0IGl0cyB2YWx1ZSByYXRoZXIgdGhhbiBpdHMgbmFtZS4KKyovCisgICAgcyA9IE5VTEw7CisKKyAgICBpZiAobXlkb3QgJiYgcHB2bmFtYnVmWzBdID09ICcuJyAmJiBwcHZuYW1idWZbMV0pIHsKKyAgICAgICAgcyA9IHBwdm5hbWJ1ZisxOworICAgICAgICB1bnVuZ3coKTsKKyAgICB9CisgICAgaWYgKCFzKSB7CisgICAgICAgIGlmIChjeCA9PSBYWERGWCB8fCBjeCA9PSBYWEFTWCkKKyAgICAgICAgICAvKiBFdmFsdWF0ZSB2YXJpYWJsZSBuYW1lICovCisgICAgICAgICAgeSA9IGNtZmxkKCJNYWNybyBvciB2YXJpYWJsZSBuYW1lIiwiIiwmcyx4eHN0cmluZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAvKiBEb24ndCBldmFsdWF0ZSB0aGUgdmFyaWFibGUgbmFtZSAqLworICAgICAgICAgIHkgPSBjbWZsZCgiTWFjcm8gb3IgdmFyaWFibGUgbmFtZSIsIiIsJnMsTlVMTCk7CisgICAgICAgIGlmICh5IDwgMCkgeworICAgICAgICAgICAgaWYgKHkgPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9WYXJpYWJsZSBuYW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfSBlbHNlIHJldHVybih5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBrID0gc3RybGVuKHMpOworICAgIGlmIChrID4gVk5BTUwpIHsKKyAgICAgICAgcHJpbnRmKCI/TmFtZSB0b28gbG9uZzogXCIlc1wiXG4iLHMpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICBja3N0cm5jcHkodm5hbWJ1ZixzLFZOQU1MKTsKKyAgICB2bmFtYnVmW1ZOQU1MXSA9IE5VTDsKKyAgICB2bnAgPSB2bmFtYnVmOworICAgIGlmICh2bmFtYnVmWzBdID09IENNRFEgJiYgKHZuYW1idWZbMV0gPT0gJyUnIHx8IHZuYW1idWZbMV0gPT0gJyYnKSkgdm5wKys7CisgICAgaWYgKCp2bnAgPT0gJyUnIHx8ICp2bnAgPT0gJyYnKSB7CisgICAgICAgIGlmICgoeSA9IHBhcnNldmFyKHZucCwmeCwmeikpIDwgMCkgcmV0dXJuKHkpOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgaWYgKGN4ID09IFhYVU5ERUYpIHsgICAgICAgICAgICAvKiBVbmRlZmluZSAqLworICAgICAgICAgICAgaWYgKCh5ID0gY210eHQoIlRleHQgdG8gYmUgaWdub3JlZCIsIiIsJnMsTlVMTCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgZGVsbWFjKHZucCwwKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIGRlYnVnKEYxMDEsImRvZGVmIHBhcnNldmFyIHgiLCIiLHgpOworICAgICAgICBpZiAobXlkb3QpIHsKKyAgICAgICAgICAgIGlmICgoZG9ldmFsID0gY21rZXkoYXNndGFiLG5hc2d0YWIsIm9wZXJhdG9yIiwiPSIsTlVMTCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKGRvZXZhbCk7CisgICAgICAgICAgICBpZiAoZG9ldmFsID4gMCkgICAgICAgICAgICAgLyogVHlwZSBvZiBhc3NpZ25tZW50ICovCisgICAgICAgICAgICAgIGN4ID0gWFhBU1M7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHkgPT0gMSkgeyAgICAgICAgICAgICAgICAgICAvKiBTaW1wbGUgdmFyaWFibGUgKi8KKyAgICAgICAgICAgIGlmICgoeSA9IGNtdHh0KCJEZWZpbml0aW9uIG9mIHZhcmlhYmxlIiwiIiwmcyxOVUxMKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICBzID0gYnJzdHJpcChzKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInh4ZGVmIHZhciBuYW1lIix2bnAsMCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ4eGRlZiB2YXIgZGVmIixzLDApOworICAgICAgICB9IGVsc2UgaWYgKHkgPT0gMikgeyAgICAgICAgICAgIC8qIEFycmF5IGVsZW1lbnQgKi8KKyAgICAgICAgICAgIGlmICgoeSA9IGFycmF5bmFtKHZucCwmeCwmeikpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKHggPT0gOTYpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9Bcmd1bWVudCB2ZWN0b3IgYXJyYXkgaXMgcmVhZC1vbmx5XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoa2FycmF5KHgseikgPCAwKSByZXR1cm4oLTIpOworICAgICAgICAgICAgaWYgKCh5ID0gY210eHQoIkRlZmluaXRpb24gb2YgYXJyYXkgZWxlbWVudCIsIiIsJnMsTlVMTCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgZGVidWcoRjExMCwieHhkZWYgYXJyYXkgcmVmIix2bnAsMCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ4eGRlZiBhcnJheSBkZWYiLHMsMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgaWYgKGN4ID09IFhYVU5ERUYpIHsgICAgICAgICAgICAvKiBVbmRlZmluZSAqLworICAgICAgICAgICAgaWYgKCh5ID0gY210eHQoIlRleHQgdG8gYmUgaWdub3JlZCIsIiIsJnMsTlVMTCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgZGVsbWFjKHZucCwwKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIGlmIChteWRvdCkgeworICAgICAgICAgICAgaWYgKChkb2V2YWwgPSBjbWtleShhc2d0YWIsbmFzZ3RhYiwib3BlcmF0b3IiLCI9IixOVUxMKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oZG9ldmFsKTsKKyAgICAgICAgICAgIGlmIChkb2V2YWwgPiAwKQorICAgICAgICAgICAgICBjeCA9IFhYQVNTOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtdHh0KCJEZWZpbml0aW9uIG9mIG1hY3JvIiwiIiwmcyxOVUxMKSkgPCAwKSByZXR1cm4oeSk7CisjaWZkZWYgREVCVUcKKyAgICAgICAgaWYgKGRlYmxvZykgeworICAgICAgICAgICAgZGVidWcoRjExMCwieHhkZWYgbWFjcm8gbmFtZSIsdm5wLDApOworICAgICAgICAgICAgZGVidWcoRjAxMCwieHhkZWYgbWFjcm8gZGVmIixzLDApOworICAgICAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICAgICAgcyA9IGJyc3RyaXAocyk7CisgICAgfQorICAgIGlmICgqcyA9PSBOVUwpIHsgICAgICAgICAgICAgICAgICAgIC8qIE5vIGFyZyBnaXZlbiwgdW5kZWZpbmUgKi8KKyAgICAgICAgZGVsbWFjKHZucCwxKTsgICAgICAgICAgICAgICAgICAvKiBzaWxlbnRseS4uLiAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOyAgICAgICAgICAgIC8qIGV2ZW4gaWYgaXQgZG9lc24ndCBleGlzdC4uLiAqLworICAgIH0KKyAgICAvKiBEZWZpbmluZyBhIG5ldyBtYWNybyBvciB2YXJpYWJsZSAqLworCisgICAgaWYgKGN4ID09IFhYQVNTIHx8IGN4ID09IFhYQVNYKSB7ICAgLyogQVNTSUdOIHJhdGhlciB0aGFuIERFRklORT8gKi8KKyAgICAgICAgaW50IHQ7CisgICAgICAgIHQgPSBMSU5CVUZTSVotMTsKKyAgICAgICAgbHAgPSBsaW5lOyAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBzbywgZXhwYW5kIGl0cyB2YWx1ZSBub3cgKi8KKyAgICAgICAgenpzdHJpbmcocywmbHAsJnQpOworICAgICAgICBzID0gbGluZTsKKyAgICB9CisgICAgaWYgKGRvZXZhbCA9PSAyKSB7ICAgICAgICAgICAgICAgICAgLyogQXJpdGhtZXRpYyBldmFsdWF0aW9uIHdhbnRlZCB0b28/ICovCisgICAgICAgIGNrc3RybmNweShsaW5lLGV2YWxhKHMpLExJTkJVRlNJWik7CisgICAgICAgIGxpbmVbTElOQlVGU0laXSA9IE5VTDsKKyAgICB9CisgICAgLyogZGVidWcoRjExMSwiY2FsbGluZyBhZGRtYWMiLHMsKGludClzdHJsZW4ocykpOyAqLworCisgICAgeSA9IGFkZG1hYyh2bnAscyk7ICAgICAgICAgICAgICAgICAgLyogQWRkIGl0IHRvIHRoZSBhcHByb3ByaWF0ZSB0YWJsZS4gKi8KKyAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgcHJpbnRmKCI/JXMgZmFpbGVkXG4iLChjeCA9PSBYWEFTUyB8fCBjeCA9PSBYWEFTWCkgPworICAgICAgICAgICAgICAgIkFTU0lHTiIgOiAiREVGSU5FIik7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgfSBlbHNlIGlmIChjeCA9PSBYWEFTWCB8fCBjeCA9PSBYWERGWCkgLyogRm9yIF9BU0cgb3IgX0RFRiwgKi8KKyAgICAgIHJldHVybigxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBjaGFuZ2Ugc3VjY2VzcyB2YXJpYWJsZSAqLworICAgIGVsc2UKKyAgICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisjZW5kaWYgLyogTk9TUEwgKi8KKworCisjaWZuZGVmIE5PRElBTAorLyoKKyAgIEwgVSBEIEkgQSBMICAtLSAgTG9va3VwIHVwIGRpYWxpbmcgZGlyZWN0b3J5IGVudHJ5LgorCisgICBDYWxsIHdpdGggc3RyaW5nIHRvIGxvb2sgdXAgYW5kIGZpbGUgZGVzY3JpcHRvciBvZiBvcGVuIGRpYWxpbmcgZGlyZWN0b3J5CisgICBmaWxlLiAgT24gc3VjY2VzcywgcmV0dXJucyBudW1iZXIgb2YgbWF0Y2hlcyBmb3VuZCwgd2l0aCBudW1iZXJzIHN0b3JlZAorICAgaW4gYW4gYXJyYXkgYWNjZXNzaWJsZSB2aWEgZ2V0ZG51bSgpLgorKi8KK3N0YXRpYyBjaGFyICpkbl9wW01BWEROVU1TICsgMV07ICAgICAgICAvKiBEaWFsIE51bWJlciBwb2ludGVycyAqLworc3RhdGljIGNoYXIgKmRuX3AyW01BWEROVU1TICsgMV07ICAgICAgIC8qIENvbnZlcnRlZCBkaWFsIG51bWJlciBwb2ludGVycyAqLworc3RhdGljIGludCBkbl94W01BWEROVU1TICsgMV07ICAgICAgICAgIC8qIFR5cGUgb2YgY2FsbCAqLworc3RhdGljIGludCBkbmNvdW50ID0gMDsKK2NoYXIgKiBkX25hbWUgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAvKiBEaWFsIG5hbWUgcG9pbnRlciAqLworCitjaGFyICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IGRpYWwgZGlyZWN0b3J5IGVudHJ5IG5hbWUgKi8KK2dldGRuYW1lKCkgeworICAgIHJldHVybihkX25hbWUgPyBkX25hbWUgOiAiIik7Cit9CisKK2NoYXIgKgorZ2V0ZG51bShuKSBpbnQgbjsgeyAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBkaWFsIG51bWJlciBuIGZyb20gZGlyZWN0b3J5ICovCisgICAgaWYgKG4gPCAwIHx8IG4gPiBkbmNvdW50IHx8IG4gPiBNQVhETlVNUykKKyAgICAgIHJldHVybigiIik7CisgICAgZWxzZQorICAgICAgcmV0dXJuKGRuX3Bbbl0pOworfQorCitjaGFyICogICAgICAgICAgICAgICAgICAvKiBDaGVjayBhcmVhIGNvZGUgZm9yIHNwdXJpb3VzIGxlYWRpbmcgZGlnaXQgKi8KK2Noa19hYyhpLGJ1ZikgaW50IGk7IGNoYXIgYnVmW107IHsKKyAgICBjaGFyICpwOworICAgIGlmICghYnVmKQorICAgICAgcmV0dXJuKCIiKTsKKyAgICBwID0gKGNoYXIgKikgYnVmOyAgICAgICAgICAgICAgICAgICAvKiBDb3VudHJ5IHdlIGFyZSBjYWxsaW5nOiAqLworICAgIGlmIChpID09ICA0NCB8fCAgICAgICAgICAgICAgICAgICAgIC8qIFVLICovCisgICAgICAgIGkgPT0gIDQ5IHx8ICAgICAgICAgICAgICAgICAgICAgLyogR2VybWFueSAqLworICAgICAgICBpID09ICAzOSB8fCAgICAgICAgICAgICAgICAgICAgIC8qIEl0YWx5ICovCisgICAgICAgIGkgPT0gIDMxIHx8ICAgICAgICAgICAgICAgICAgICAgLyogTmV0aGVybGFuZHMgKi8KKyAgICAgICAgaSA9PSAzNTEgfHwgICAgICAgICAgICAgICAgICAgICAvKiBQb3J0dWdhbCAqLworICAgICAgICBpID09ICA1NSB8fCAgICAgICAgICAgICAgICAgICAgIC8qIEJyYXppbCAqLworICAgICAgICBpID09IDk3MiB8fCAgICAgICAgICAgICAgICAgICAgIC8qIElzcmFlbCAqLworICAgICAgICBpID09ICA0MSB8fCAgICAgICAgICAgICAgICAgICAgIC8qIFN3aXR6ZXJsYW5kICovCisgICAgICAgIGkgPT0gIDQzIHx8ICAgICAgICAgICAgICAgICAgICAgLyogQXVzdHJpYSAqLworICAgICAgICBpID09ICA0MiB8fCAgICAgICAgICAgICAgICAgICAgIC8qIEN6ZWNoIFJlcHVibGljICovCisgICAgICAgIGkgPT0gIDM2IHx8ICAgICAgICAgICAgICAgICAgICAgLyogSHVuZ2FyeSAqLworICAgICAgICBpID09ICAzMCB8fCAgICAgICAgICAgICAgICAgICAgIC8qIEdyZWVjZSAqLworICAgICAgICBpID09IDM1MiB8fCAgICAgICAgICAgICAgICAgICAgIC8qIEx1eGVtYm91cmcgKi8KKyAgICAgICAgaSA9PSAgNDggfHwgICAgICAgICAgICAgICAgICAgICAvKiBQb2xhbmQgKi8KKyAgICAgICAgaSA9PSAgMjcgfHwgICAgICAgICAgICAgICAgICAgICAvKiBTb3V0aCBBZnJpY2EgKi8KKyAgICAgICAgaSA9PSAgMzMgfHwgICAgICAgICAgICAgICAgICAgICAvKiBGcmFuY2UgKGFzIG9mIDE5OTcpICovCisgICAgICAgIGkgPT0gIDM1OCAgICAgICAgICAgICAgICAgICAgICAgLyogRmlubGFuZCAoZGl0dG8pICovCisgICAgICAgICkgeworICAgICAgICBpZiAoYnVmWzBdID09ICcwJykKKyAgICAgICAgICBwKys7CisgICAgfQorICAgIHJldHVybihwKTsKK30KKworLyogQ2FsbCBJcyBMb25nIERpc3RhbmNlIC0tIEV4cGFuZCB0aGlzIHRvIGNvdmVyIDEwLWRpZ2l0IGxvY2FsIGRpYWxpbmcgZXRjICovCisvKgorICAgc3JjICA9IGFyZWEgY29kZSBvZiBjYWxsZXIKKyAgIGRlc3QgPSBhcmVhIGNvZGUgb2YgY2FsbGVlCisgICBSZXR1cm5zOgorICAgICAwIGlmIGNhbGwgaXMgbG9jYWwKKyAgICAgMSBpZiBjYWxsIGlzIGxvbmcgZGlzdGFuY2UKKyAgICAgMiBpZiBjYWxsIGlzIGxvY2FsIGJ1dCBhcmVhIGNvZGUgbXVzdCBiZSBkaWFsZWQgYW55d2F5CisqLworc3RhdGljIGludAorY2FsbGlzbGQoc3JjLCBkZXN0KSBjaGFyICogc3JjLCAqIGRlc3Q7IHsKKyAgICBpbnQgaTsKKyAgICBpZiAoZGlhbGZsZCkgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSBsb25nIGRpc3RhbmNlPyAqLworICAgICAgcmV0dXJuKDEpOworICAgIGlmICghc3RyY21wKHNyYyxkZXN0KSkgeyAgICAgICAgICAgIC8qIEFyZWEgY29kZXMgYXJlIHRoZSBzYW1lICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBubG9jYWxhYzsgaSsrKSAgLyogSXMgQUMgaW4gdGhlIGxjLWFyZWEtY29kZXMgbGlzdD8gKi8KKyAgICAgICAgICBpZiAoIXN0cmNtcChzcmMsZGlhbGxjYWNbaV0pKQorICAgICAgICAgICAgcmV0dXJuKDIpOyAgICAgICAgICAgICAgICAgIC8qIFllcyBzbyBtdXN0IGJlIGRpYWxlZCAqLworICAgICAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHNvIGRvbid0IGRpYWwgaXQuICovCisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBubG9jYWxhYzsgaSsrKSAgICAgIC8qIEFDcyBub3QgdGhlIHNhbWUgc28gbG9vayBpbiBsaXN0ICovCisgICAgICBpZiAoIXN0cmNtcChkZXN0LGRpYWxsY2FjW2ldKSkgICAgLyogTWF0Y2ggKi8KKyAgICAgICAgcmV0dXJuKDIpOyAgICAgICAgICAgICAgICAgICAgICAvKiBTbyBsb2NhbCBjYWxsIHdpdGggYXJlYSBjb2RlICovCisgICAgcmV0dXJuKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGxvY2FsIHNvIGxvbmctZGlzdGFuY2UgKi8KK30KKworY2hhciBwZHNmeFs2NF0gPSB7IE5VTCwgTlVMIH07CisKKyNpZm5kZWYgTk9TUEwKK3N0YXRpYyBjaGFyICoKK3hkaWFsKHMpIGNoYXIgKnM7IHsgICAgICAgICAgICAgICAgICAgICAvKiBSdW4gZGlhbCBzdHJpbmcgdGhydSBtYWNybyAqLworICAgIGludCB4LCBtOworICAgIGlmICghZGlhbG1hYykgICAgICAgICAgICAgICAgICAgICAgIC8qIERpYWwgbWFjcm8gbmFtZSBnaXZlbj8gKi8KKyAgICAgIHJldHVybihOVUxMKTsKKyAgICBpZiAoKHggPSBteGxvb2sobWFjdGFiLGRpYWxtYWMsbm1hYykpIDwgMCkgLyogSXMgdGhlIG1hY3JvIGRlZmluZWQ/ICovCisgICAgICByZXR1cm4oTlVMTCk7CisgICAgbSA9IG1hY2x2bDsKKyAgICB4ID0gZG9kbyh4LHMsMCk7ICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdXAgdGhlIG1hY3JvICovCisgICAgaWYgKHggPiAwKSB7CisgICAgICAgIHdoaWxlIChtYWNsdmwgPiBtKSAgICAgICAgICAgICAgLyogRXhlY3V0ZSB0aGUgcGFyc2VyICovCisgICAgICAgICAgcGFyc2VyKDEpOworICAgICAgICByZXR1cm4obXJ2YWxbbWFjbHZsKzFdKTsgICAgICAgIC8qIFJldHVybiB0aGUgcmVzdWx0ICovCisgICAgfQorICAgIHJldHVybihOVUxMKTsKK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCitzdGF0aWMgaW50CitkbmN2dChrLGN4LCBwcmVmaXgsIHN1ZmZpeCkKKyAgICBpbnQgaywgY3gsIHByZWZpeCwgc3VmZml4OyB7ICAgICAgICAvKiBEaWFsIE51bWJlciBDb252ZXJ0ICovCisgICAgaW50IGksIGosIG4sIHdoYXQ7ICAgICAgICAgICAgICAgICAgLyogY3ggaXMgdG9wLWxldmVsIGNvbW1hbmQgaW5kZXggKi8KKyAgICBjaGFyICpzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVmaXggLSBhZGQgcHJlZml4ZXM/ICovCisgICAgY2hhciAqcCwgKnAyLCAqcHhvOyAgICAgICAgICAgICAgICAgLyogc3VmZml4IC0gYWRkIHN1ZmZpeGVzPyAqLworICAgIGNoYXIgKmxhYzsKKyAgICBjaGFyICpucHI7CisgICAgY2hhciAqc2Z4OworICAgIC8qIGNoYXIgKnBzZng7ICovCisgICAgY2hhciBjY2J1ZlsxMjhdOworICAgIGludCBjYzsKKyAgICBjaGFyIGFjYnVmWzI0XTsKKyAgICBjaGFyICphY3B0cjsKKyAgICBjaGFyIG91dGJ1ZlsyNTZdOworLyoKKyAgRmlyc3QgcGFzcyBmb3Igc3RyaWN0IChwdW5jdHVhdGlvbi1iYXNlZCkgaW50ZXJwcmV0YXRpb24uCisgIElmIGl0IGZhaWxzLCB3ZSB0cnkgdGhlIGxvb3NlciAobGVuZ3RoLWJhc2VkKSBvbmUuCisqLworICAgIGRpYWx0eXBlID0gLTE7CisgICAgd2hhdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBvZiBjYWxsICovCisgICAgcyA9IGRuX3Bba107ICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIHRvIGJlIGNvbnZlcnRlZC4gKi8KKyAgICBkZWJ1ZyhGMTExLCJkbmN2dCIscyxrKTsKKyAgICBpZiAoZG5fcDJba10pIHsKKyAgICAgICAgZnJlZShkbl9wMltrXSk7CisgICAgICAgIGRuX3AyW2tdID0gTlVMTDsKKyAgICB9CisgICAgaWYgKCFzKSB7CisgICAgICAgIHByaW50ZigiRXJyb3IgLSBObyBwaG9uZSBudW1iZXIgdG8gY29udmVydFxuIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIGlmICgoaW50KXN0cmxlbihzKSA+IDIwMCkgeworICAgICAgICBja3N0cm5jcHkob3V0YnVmLHMsNDApOworICAgICAgICBwcmludGYoIj9Ub28gbG9uZzogXCIlcy4uLlwiXG4iLG91dGJ1Zik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIG5wciA9IChwcmVmaXggJiYgZGlhbG5wcikgPyBkaWFsbnByIDogIiI7CisgICAgc2Z4ID0gKHN1ZmZpeCAmJiBkaWFsc2Z4KSA/IGRpYWxzZnggOiAiIjsKKyAgICAvKiBpZiAocGFydGlhbCkgcHNmeCA9IGRpYWxzZnggPyBkaWFsc2Z4IDogIiI7ICovCisgICAgcHhvID0gKHByZWZpeCAmJiBkaWFscHhvKSA/IGRpYWxweG8gOiAiIjsKKyAgICBsYWMgPSBkaWFsbGFjID8gZGlhbGxhYyA6ICIiOyAgICAgICAvKiBMb2NhbCBhcmVhIGNvZGUgKi8KKworICAgIG91dGJ1ZlswXSA9IE5VTDsgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgY29udmVyc2lvbiBidWZmZXIgKi8KKyAgICBzcyA9IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZW1lbWJlciBvcmlnaW5hbCBzdHJpbmcgKi8KKworICAgIGlmICgqcyAhPSAnKycpIHsgICAgICAgICAgICAgICAgICAgIC8qIExpdGVyYWwgbnVtYmVyICovCisgICAgICAgIGRuX3hba10gPSBETl9VTks7ICAgICAgICAgICAgICAgLyogU29ydCBrZXkgaXMgInVua25vd24iLiAqLworICAgICAgICBja21ha21zZyhvdXRidWYsMjU2LCAgICAgICAgICAgIC8qIFNhbmR3aWNoIGl0IGJldHdlZW4gKi8KKyAgICAgICAgICAgICAgICAgcHhvLG5wcixzLHNmeCAgICAgICAgICAvKiBESUFMIFBSRUZJWCBhbmQgU1VGRklYICovCisgICAgICAgICAgICAgICAgKTsKKyNpZmRlZiBDS19UQVBJCisgICAgICAgIGlmICh0dHRhcGkgJiYgICAgICAgICAgICAgICAgICAgLyogVEFQSSBkb2VzIGl0cyBvd24gY29udmVyc2lvbnMgKi8KKyAgICAgICAgICAgICF0YXBpcGFzcyAmJiAgICAgICAgICAgICAgICAvKiBpZiBub3QgaW4gcGFzc3RocnUgbW9kZSAqLworICAgICAgICAgICAgdGFwaWNvbnYgPT0gQ0tfQVVUTyB8fCAgICAgIC8qIGFuZCBUQVBJIGNvbnZlcnNpb25zIGFyZSBBVVRPICovCisgICAgICAgICAgICB0YXBpY29udiA9PSBDS19PTiAgICAgICAgICAgLyogT1IgaWYgVEFQSSBjb252ZXJzaW9ucyBhcmUgT04gKi8KKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgY2hhciAqIHAgPSBOVUxMOworICAgICAgICAgICAgZGlhbHR5cGUgPSAtMjsKKyAgICAgICAgICAgIGlmICghY2t0YXBpQ29udmVydFBob25lTnVtYmVyKGRuX3Bba10sICZwKSkKKyAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIG1ha2VzdHIoJmRuX3AyW2tdLCBwKTsKKyAgICAgICAgICAgIGlmIChwKSBmcmVlKHApOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS19UQVBJICovCisgICAgICAgICAgbWFrZXN0cigmZG5fcDJba10sIG91dGJ1Zik7ICAgLyogTm90IFRBUEkgKi8KKyAgICAgICAgZGlhbHR5cGUgPSB3aGF0OworICAgICAgICByZXR1cm4oMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIERvbmUuICovCisgICAgfQorICAgIGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvcnRhYmxlIG51bWJlciAqLworICAgIHMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpcHRvZSBwYXN0IHRoZSBwbHVzIHNpZ24gKi8KKyAgICBjY2J1ZlswXSA9IE5VTDsgICAgICAgICAgICAgICAgICAgICAvKiBEbyBjb3VudHJ5IGNvZGUgZmlyc3QgKi8KKworICAgIGlmICghZGlhbGxjYykgeyAgICAgICAgICAgICAgICAgICAgIC8qIERvIHdlIGtub3cgb3VyIG93bj8gKi8KKyAgICAgICAgaWYgKGN4ICE9IFhYTE9PSykKKyAgICAgICAgICBwcmludGYoIkVycm9yIC0gcHJpb3IgU0VUIERJQUwgQ09VTlRSWS1DT0RFIGNvbW1hbmQgcmVxdWlyZWRcbiIpOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qIFBhcnNlIHRoZSBudW1iZXIgKi8KKworICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgY291bnRyeSBjb2RlICovCisgICAgICAgIHdoaWxlICgqcyA9PSBIVCB8fCAqcyA9PSBTUCkKKyAgICAgICAgICBzKys7CisgICAgICAgIGlmICghcykgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGluIHN0YW5kYXJkIGZvcm1hdCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoKnMgPT0gJygnKSB7ICAgICAgICAgICAgICAgIC8qIEJlZ2lubmluZyBvZiBhcmVhIGNvZGUgICovCisgICAgICAgICAgICBzKys7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2tpcCBwYXN0IHBhcmVudGhlc2lzICAgKi8KKyAgICAgICAgICAgIGNjYnVmW2ldID0gTlVMOyAgICAgICAgICAgICAvKiBFbmQgb2YgY291bnRyeSBjb2RlICovCisgICAgICAgICAgICBpZiAoIXMpIHsgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGVuZCBvZiBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIC0gcGhvbmUgbnVtYmVyIGVuZHMgcHJlbWF0dXJlbHk6IFwiJXNcIlxuIixzcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbGxlY3QgY291bnRyeSBjb2RlICovCisgICAgICAgICAgICBpZiAoaXNkaWdpdCgqcykpCisgICAgICAgICAgICAgIGNjYnVmW2krK10gPSAqczsgICAgICAgICAgLyogY29weSB0aGlzIGNoYXJhY3RlciAqLworICAgICAgICAgICAgcysrOworICAgICAgICAgICAgaWYgKCEqcyB8fCBpID4gMTI3KSAgICAgICAgIC8qIHdhdGNoIG91dCBmb3IgbWVtb3J5IGxlYWsgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgY2MgPSBhdG9pKGNjYnVmKTsgICAgICAgICAgICAgICAgICAgLyogTnVtZXJpYyB2ZXJzaW9uIG9mIGNvdW50cnkgY29kZSAqLworCisgICAgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm93IGdldCBhcmVhIGNvZGUgKi8KKyAgICBhY2J1ZlswXSA9IE5VTDsgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGFyZWEtY29kZSBidWZmZXIgKi8KKyAgICBhY3B0ciA9IGFjYnVmOyAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcG9pbnRlci4gKi8KKyAgICB3aGlsZSAoMSkgeworICAgICAgICB3aGlsZSAoKnMgPT0gSFQgfHwgKnMgPT0gU1ApICAgIC8qIElnbm9yZSB3aGl0ZXNwYWNlICovCisgICAgICAgICAgcysrOworICAgICAgICBpZiAoIXMpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0cmluZyBmaW5pc2hlZCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoKnMgPT0gJyknKSB7ICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBhcmVhIGNvZGUgICovCisgICAgICAgICAgICBzKys7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2tpcCBwYXN0IHBhcmVudGhlc2lzICAgKi8KKyAgICAgICAgICAgIGFjYnVmW2ldID0gTlVMOyAgICAgICAgICAgICAvKiBUZXJtaW5hdGUgYXJlYS1jb2RlIGJ1ZmZlciAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFydCBvZiBhcmVhIGNvZGUgKi8KKyAgICAgICAgICAgIGlmIChpc2RpZ2l0KCpzKSkgICAgICAgICAgICAvKiBJZiBpdCdzIGEgZGlnaXQsICovCisgICAgICAgICAgICAgIGFjYnVmW2krK10gPSAqczsgICAgICAgICAgLyogY29weSB0aGlzIGNoYXJhY3RlciAqLworICAgICAgICAgICAgcysrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIG5leHQgKi8KKyAgICAgICAgICAgIGlmICghKnMgfHwgaSA+IDIzKSAgICAgICAgICAvKiBXYXRjaCBvdXQgZm9yIG92ZXJmbG93ICovCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisvKgorICAgSGVyZSB3ZSBzdHJpcCBhbnkgbGVhZGluZyAwIGZvciBjb3VudHJpZXMgdGhhdCB3ZSBrbm93IGhhdmUKKyAgIDAgYXMgYSBsb25nLWRpc3RhbmNlIHByZWZpeCBhbmQgZG8gbm90IGhhdmUgYW55IGFyZWEgY29kZXMgdGhhdAorICAgc3RhcnQgd2l0aCAwIChmb3JtZXJseSBhbHNvIGRpdHRvIGZvciAiOSIgaW4gRmlubGFuZC4uLikKKyovCisgICAgaSA9IGF0b2koY2NidWYpOworICAgIGFjcHRyID0gY2hrX2FjKGksYWNidWYpOworCisgICAgd2hpbGUgKCpzID09IEhUIHx8ICpzID09IFNQKSAgICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlICovCisgICAgICBzKys7CisKKy8qIHByaW50ZigiUz1bJXNdLCBBQ1BUUj1bJXNdXG4iLHMsYWNwdHIpOyAqLworCisgICAgaWYgKCpzICYmICphY3B0cikgeyAgICAgICAgICAgICAgICAgLyogQXJlYSBjb2RlIHdhcyBkZWxpbWl0ZWQgKi8KKworICAgICAgICB3aGlsZSAoKnMgPT0gJy0nIHx8ICpzID09ICcuJykgIC8qIFNraXAgcGFzdCBncmF0dWl0aW91cyBwdW5jdHVhdGlvbiAqLworICAgICAgICAgIHMrKzsKKyAgICAgICAgaWYgKCEqcykgcy0tOyAgICAgICAgICAgICAgICAgICAvKiBCdXQgbm90IHRvIGVuZCBvZiBzdHJpbmcgKi8KKworICAgICAgICBpZiAoc3RyY21wKGRpYWxsY2MsY2NidWYpKSB7ICAgIC8qIE91dCBvZiBjb3VudHJ5PyAqLworICAgICAgICAgICAgaWYgKCFkaWFsaXhwKSB7ICAgICAgICAgICAgIC8qIE5lZWQgaW50bC1wcmVmaXggKi8KKyAgICAgICAgICAgICAgICBpZiAoY3ggIT0gWFhMT09LKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvciAtIE5vIGludGVybmF0aW9uYWwgZGlhbGluZyBwcmVmaXggZGVmaW5lZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoYXQgPSBkbl94W2tdID0gRE5fSU5UTDsKKyAgICAgICAgICAgIHAgID0gKHByZWZpeCAmJiBkaWFsaXhwKSA/IGRpYWxpeHAgOiAiIjsgLyogSW50bC1wcmVmaXggKi8KKyAgICAgICAgICAgIHAyID0gKHN1ZmZpeCAmJiBkaWFsaXhzKSA/IGRpYWxpeHMgOiAiIjsgLyogSW50bC1zdWZmaXggKi8KKworICAgICAgICAgICAgLyogRm9ybSB0aGUgZmluYWwgcGhvbmUgbnVtYmVyICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgc3ByaW50ZihwZHNmeCwiJXMlcyIscDIsc2Z4KTsgLyogVU5TQUZFICovCisgICAgICAgICAgICBzcHJpbnRmKG91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgIiVzJXMlcyVzJXMlcyVzJXMiLAorICAgICAgICAgICAgICAgICAgICBweG8sbnByLHAsY2NidWYsYWNwdHIscyxwMixzZngKKyAgICAgICAgICAgICAgICAgICAgKTsKKyNlbHNlCisgICAgICAgICAgICBja21ha21zZyhwZHNmeCw2NCxwMixzZngsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgIGNrbWFreG1zZyhvdXRidWYsMjU2LHB4byxucHIscCxjY2J1ZixhY3B0cixzLHAyLHNmeCwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAgICAgfSBlbHNlIGlmICgoeCA9IGNhbGxpc2xkKGxhYyxhY3B0cikpID49IDEpIHsgLyogSW4tY291bnRyeSBMRCAqLworICAgICAgICAgICAgaWYgKCFkaWFsbGFjICYmIGN4ICE9IFhYTE9PSykgeyAvKiBEb24ndCBrbm93IG15IG93biBhcmVhIGNvZGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoY2MgPT0gMSkKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiV0FSTklORyAtIFByaW9yIFNFVCBESUFMIEFSRUEtQ09ERSBuZWVkZWRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHggPT0gMikgeyAgICAgICAgICAgICAgIC8qIExvY2FsIGNhbGwgd2l0aCBhcmVhIGNvZGUgKi8KKyAgICAgICAgICAgICAgICB3aGF0ID0gZG5feFtrXSA9IEROX0xPQ0FMOyAgICAgIC8qIExvY2FsLWNhbGwgKi8KKyAgICAgICAgICAgICAgICBwICA9IChwcmVmaXggJiYgZGlhbGxjcCkgPyBkaWFsbGNwIDogIiI7IC8qIGxvY2FsLXByZWZpeCAqLworICAgICAgICAgICAgICAgIHAyID0gKHN1ZmZpeCAmJiBkaWFsbGNzKSA/IGRpYWxsY3MgOiAiIjsgLyogbG9jYWwtc3VmZml4ICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoYXQgPSBkbl94W2tdID0gRE5fTE9ORzsgICAgICAgLyogTG9uZy1kaXN0YW5jZSAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudG9sbGZyZWU7IGkrKykgeyAvKiBCdXQgdG9sbC1mcmVlIHRvbz8gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoYWNwdHIsZGlhbHRmY1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQgPSBkbl94W2tdID0gRE5fRlJFRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IEROX0ZSRUUpIHsgIC8qIFRvbGwtZnJlZSBjYWxsICovCisgICAgICAgICAgICAgICAgICAgIHAgPSAocHJlZml4ICYmIGRpYWx0ZnApID8gZGlhbHRmcCA6CisgICAgICAgICAgICAgICAgICAgICAgICAoKHByZWZpeCAmJiBkaWFsbGRwKSA/IGRpYWxsZHAgOiAiIik7CisgICAgICAgICAgICAgICAgICAgIHAyID0gIiI7ICAgICAgICAgICAgLyogbm8gc3VmZml4ICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3JtYWwgbG9uZyBkaXN0YW5jZSAqLworICAgICAgICAgICAgICAgICAgICBwICA9IChwcmVmaXggJiYgZGlhbGxkcCkgPyBkaWFsbGRwIDogIiI7IC8qIGxkLXByZWZpeCAqLworICAgICAgICAgICAgICAgICAgICBwMiA9IChzdWZmaXggJiYgZGlhbGxkcykgPyBkaWFsbGRzIDogIiI7IC8qIGxkLXN1ZmZpeCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEZvcm0gdGhlIG51bWJlciB0byBiZSBkaWFsZWQgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICBzcHJpbnRmKG91dGJ1ZiwiJXMlcyVzJXMlcyVzJXMiLAorICAgICAgICAgICAgICAgICAgICBweG8sbnByLHAsYWNwdHIscyxwMixzZngKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHNwcmludGYocGRzZngsIiVzJXMiLHAyLHNmeCk7CisjZWxzZQorICAgICAgICAgICAgY2ttYWt4bXNnKG91dGJ1ZiwyNTYsCisgICAgICAgICAgICAgICAgICAgICAgcHhvLG5wcixwLGFjcHRyLHMscDIsc2Z4LAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgICAgICBja21ha21zZyhwZHNmeCw2NCxwMixzZngsTlVMTCxOVUxMKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtZSBjb3VudHJ5LCBzYW1lIGFyZWEgY29kZSAqLworICAgICAgICAgICAgd2hhdCA9IGRuX3hba10gPSBETl9MT0NBTDsgIC8qIFNvIGl0J3MgYSBsb2NhbCBjYWxsLiAqLworICAgICAgICAgICAgaWYgKCFwcmVmaXggfHwgIShkaWFscHhvIHx8IG5kaWFscHh4KSkgeyAvKiBOb3QgZGlhbGluZyBmcm9tIFBCWCAqLworICAgICAgICAgICAgICAgIHAgID0gKHByZWZpeCAmJiBkaWFsbGNwKSA/IGRpYWxsY3AgOiAiIjsgLyogbG9jYWwtcHJlZml4ICovCisgICAgICAgICAgICAgICAgcDIgPSAoc3VmZml4ICYmIGRpYWxsY3MpID8gZGlhbGxjcyA6ICIiOyAvKiBsb2NhbC1zdWZmaXggKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgaWYgKHggPT0gMikKKyAgICAgICAgICAgICAgICAgIHNwcmludGYob3V0YnVmLCIlcyVzJXMlcyVzJXMiLG5wcixwLGFjcHRyLHMscDIsc2Z4KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBzcHJpbnRmKG91dGJ1ZiwiJXMlcyVzJXMlcyIsbnByLHAscyxwMixzZngpOworICAgICAgICAgICAgICAgIHNwcmludGYocGRzZngsIiVzJXMiLHAyLHNmeCk7CisjZWxzZQorICAgICAgICAgICAgICAgIGlmICh4ID09IDIpCisgICAgICAgICAgICAgICAgICBja21ha3htc2cob3V0YnVmLDI1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBucHIscCxhY3B0cixzLHAyLHNmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgY2ttYWt4bXNnKG91dGJ1ZiwyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnByLHAscyxwMixzZngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgY2ttYWttc2cocGRzZngsNjQscDIsc2Z4LE5VTEwsTlVMTCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRGlhbGluZyBmcm9tIGEgUEJYIGFuZCBub3QgVEFQSSAqLworICAgICAgICAgICAgICAgIGlmIChuZGlhbHB4eCkgeyAgICAgICAgIC8qIElzIGl0IGludGVybmFsPyAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgICAgICAgICAgaSA9IChpbnQpIHN0cmxlbihkaWFscHh4KTsKKyAgICAgICAgICAgICAgICAgICAgaiA9IChpbnQpIHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IC0xOworICAgICAgICAgICAgICAgICAgICBpZiAoaiA+IGkpCisgICAgICAgICAgICAgICAgICAgICAgeCA9IGNrc3RyY21wKGRpYWxweHgscyxpLDApOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgaW50IGt4OworICAgICAgICAgICAgICAgICAgICB4ID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGogPSAoaW50KSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoa3ggPSAwOyBreCA8IG5kaWFscHh4OyBreCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gKGludCkgc3RybGVuKGRpYWxweHhba3hdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID4gaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoeCA9IGNrc3RyY21wKGRpYWxweHhba3hdLHMsaSwwKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgIGlmICgheCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIGljcCwgYnVmWzMyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJm1hdGNocHh4LGRpYWxweHhba3hdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImRuY3Z0IG1hdGNocHh4IixtYXRjaHB4eCxreCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGF0ID0gZG5feFtreF0gPSBETl9JTlRFUk47ICAgLyogSW50ZXJuYWwgY2FsbC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybmFsLWNhbGwgcHJlZml4ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpY3AgPSBkaWFscHhpOworI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGljcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqaWNwID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjLCAqYnA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKihpY3ArMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3VwcGVyKGMpKSBjID0gdG9sb3dlcihjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ3YnIHx8IGMgPT0gJ2YnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gMzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6c3RyaW5nKGljcCwmYnAsJm4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNwID0gYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICAgICAgICAgICAgICBwID0gKHByZWZpeCAmJiBpY3ApID8gaWNwIDogIiI7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihvdXRidWYsIiVzJXMlcyVzIixucHIscCxzLHNmeCk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY2ttYWttc2cob3V0YnVmLDI1NixucHIscCxzLHNmeCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgIC8qIEV4dGVybmFsIGxvY2FsIGNhbGwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsLXByZWZpeCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcCAgPSAocHJlZml4ICYmIGRpYWxsY3ApID8gZGlhbGxjcCA6ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9jYWwtc3VmZml4ICovCisgICAgICAgICAgICAgICAgICAgICAgICBwMiA9IChwcmVmaXggJiYgZGlhbGxjcykgPyBkaWFsbGNzIDogIiI7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihvdXRidWYsIiVzJXMlcyVzJXMlcyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFscHhvID8gZGlhbHB4byA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wcixwLGFjcHRyLHMscDIsc2Z4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihvdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzJXMlcyVzJXMlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbHB4byA/IGRpYWxweG8gOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucHIscCxzLHAyLHNmeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2ttYWt4bXNnKG91dGJ1ZiwgMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFscHhvID8gZGlhbHB4byA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucHIscCxhY3B0cixzLHAyLHNmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2ttYWt4bXNnKG91dGJ1ZiwgMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbHB4byA/IGRpYWxweG8gOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wcixwLHMscDIsc2Z4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXJlYSBjb2RlIHdhcyBub3QgZGVsaW1pdGVkICovCisKKyAgICAgICAgY2hhciB4YnVmWzI1Nl07ICAgICAgICAgICAgICAgICAvKiBDb21wYXJpc29uIGJhc2VkIG9ubHkgb24gbGVuZ3RoICovCisgICAgICAgIGNoYXIgeWJ1ZlsyNTZdOworICAgICAgICBpbnQgeCwgajsKKworICAgICAgICBzID0gc3M7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoISpzKSBicmVhazsKKyAgICAgICAgICAgIHdoaWxlICghaXNkaWdpdCgqcykpIHsgICAgICAvKiBQYXkgYXR0ZW50aW9uIG9ubHkgdG8gZGlnaXRzICovCisgICAgICAgICAgICAgICAgcysrOworICAgICAgICAgICAgICAgIGlmICghKnMpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeGJ1ZltpXSA9ICpzKys7CisgICAgICAgIH0KKyAgICAgICAgeGJ1ZltpXSA9IE5VTDsKKworICAgICAgICB4ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzc3VtZSBMRCAqLworICAgICAgICBuID0gMDsKKyAgICAgICAgaWYgKCFkaWFsZmxkKSB7ICAgICAgICAgICAgICAgICAvKiBJZiBMRCBub3QgZm9yY2VkICovCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmxvY2FsYWM7IGorKykgeyAvKiBjaGVjayBsb2NhbCBBQyBsaXN0PyAqLworICAgICAgICAgICAgICAgIGNrbWFrbXNnKHlidWYsMjU2LGRpYWxsY2MsZGlhbGxjYWNbal0sTlVMTCxOVUxMKTsKKyAgICAgICAgICAgICAgICBuID0gKGludCkgc3RybGVuKHlidWYpOworICAgICAgICAgICAgICAgIGlmIChuID4gMCAmJiAhY2tzdHJjbXAoeGJ1Zix5YnVmLG4sMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IDI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh4ID09IDEpIHsgICAgICAgICAgICAgICAvKiBPciBleGFjdCBtYXRjaCB3aXRoIGxvY2FsIENDK0FDPyAqLworICAgICAgICAgICAgICAgIGNrbWFrbXNnKHlidWYsMjU2LGRpYWxsY2MsbGFjLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgbiA9IChpbnQpIHN0cmxlbih5YnVmKTsKKyAgICAgICAgICAgICAgICBpZiAobiA+IDAgJiYgIWNrc3RyY21wKHhidWYseWJ1ZixuLDApKQorICAgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHggPT0gMCB8fCB4ID09IDIpIHsgICAgICAgICAvKiBMb2NhbCBjYWxsICovCisgICAgICAgICAgICBpbnQgeHgsa3g7ICAgICAgICAgICAgICAgICAgLyogQmVnaW4gMSBEZWMgMjAwMS4uLiAqLworICAgICAgICAgICAgLyogQWNjb3VudCBmb3IgUEJYIGludGVybmFsIGNhbGxzICovCisgICAgICAgICAgICBpZiAobmRpYWxweHgpIHsKKyAgICAgICAgICAgICAgICB4eCA9IC0xOworICAgICAgICAgICAgICAgIGogPSAoaW50KSBzdHJsZW4oeWJ1Zik7CisgICAgICAgICAgICAgICAgZm9yIChreCA9IDA7IGt4IDwgbmRpYWxweHg7IGt4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaSA9IChpbnQpIHN0cmxlbihkaWFscHh4W2t4XSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChqID49IGkpCisgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoeHggPSBja3N0cmNtcChkaWFscHh4W2t4XSwmeGJ1ZltqXSxpLDApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgheHgpIHsKKyAgICAgICAgICAgICAgICBjaGFyICogaWNwLCBidWZbMzJdOworICAgICAgICAgICAgICAgIG1ha2VzdHIoJm1hdGNocHh4LGRpYWxweHhba3hdKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJkbmN2dCBtYXRjaHB4eCIsbWF0Y2hweHgsa3gpOworICAgICAgICAgICAgICAgIHdoYXQgPSBkbl94W2t4XSA9IEROX0lOVEVSTjsgLyogSW50ZXJuYWwgY2FsbC4gKi8KKyAgICAgICAgICAgICAgICBzID0geGJ1ZiArIGogKyBpOworICAgICAgICAgICAgICAgIGljcCA9IGRpYWxweGk7ICAgICAgICAgIC8qIEludGVybmFsLWNhbGwgcHJlZml4ICovCisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgICAgICAgaWYgKGljcCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKmljcCA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMsICpicDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICooaWNwKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzdXBwZXIoYykpIGMgPSB0b2xvd2VyKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ3YnIHx8IGMgPT0gJ2YnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwID0gYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6c3RyaW5nKGljcCwmYnAsJm4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljcCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgICAgICAgIHAgPSAocHJlZml4ICYmIGljcCkgPyBpY3AgOiAiIjsKKyAgICAgICAgICAgICAgICBja21ha21zZyhvdXRidWYsMjU2LG5wcixwLHMsc2Z4KTsKKyAgICAgICAgICAgICAgICAvKiBFbmQgMSBEZWMgMjAwMS4uLiAqLworCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogTm90IFBCWCBpbnRlcm5hbCAqLworCisgICAgICAgICAgICAgICAgZG5feFtrXSA9IEROX0xPQ0FMOworICAgICAgICAgICAgICAgIHAgPSAocHJlZml4ICYmIGRpYWxsY3ApID8gZGlhbGxjcCA6ICIiOworICAgICAgICAgICAgICAgIHAyID0gKHN1ZmZpeCAmJiBkaWFsbGNzKSA/IGRpYWxsY3MgOiAiIjsKKyAgICAgICAgICAgICAgICBzID0gKGNoYXIgKikgKHhidWYgKyAoKHggPT0gMCkgPyBuIDogKGludClzdHJsZW4oZGlhbGxjYykpKTsKKyAgICAgICAgICAgICAgICBja21ha3htc2cob3V0YnVmLDI1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHhvLG5wcixwLHMscDIsc2Z4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgY2ttYWttc2cocGRzZngsNjQscDIsc2Z4LE5VTEwsTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGxvY2FsICovCisgICAgICAgICAgICBuID0gY2tzdHJuY3B5KHlidWYsZGlhbGxjYywyNTYpOworICAgICAgICAgICAgaWYgKG4gPiAwICYmICFja3N0cmNtcCh4YnVmLHlidWYsbiwwKSkgeyAvKiBMb25nIGRpc3RhbmNlICovCisgICAgICAgICAgICAgICAgZG5feFtrXSA9IEROX0xPTkc7CisgICAgICAgICAgICAgICAgcCA9IChwcmVmaXggJiYgZGlhbGxkcCkgPyBkaWFsbGRwIDogIiI7CisgICAgICAgICAgICAgICAgcDIgPSAoc3VmZml4ICYmIGRpYWxsZHMpID8gZGlhbGxkcyA6ICIiOworICAgICAgICAgICAgICAgIHMgPSB4YnVmICsgbjsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKnMgPT0gJy0nIHx8ICpzID09ICcuJykKKyAgICAgICAgICAgICAgICAgIHMrKzsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgc3ByaW50ZihvdXRidWYsIiVzJXMlcyVzJXMlcyIscHhvLG5wcixwLHMscDIsc2Z4KTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHBkc2Z4LCIlcyVzIixwMixzZngpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBja21ha3htc2cob3V0YnVmLDI1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHhvLG5wcixwLHMscDIsc2Z4LAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgICAgICBja21ha21zZyhwZHNmeCw2NCxwMixzZngsTlVMTCxOVUxMKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRuX3hba10gPSBETl9JTlRMOyAgICAgIC8qIEludGVybmF0aW9uYWwgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWRpYWxpeHApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN4ICE9IFhYTE9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgLSBObyBpbnRlcm5hdGlvbmFsIGRpYWxpbmcgcHJlZml4IGRlZmluZWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwID0gKHByZWZpeCAmJiBkaWFsaXhwKSA/IGRpYWxpeHAgOiAiIjsKKyAgICAgICAgICAgICAgICBwMiA9IChzdWZmaXggJiYgZGlhbGl4cykgPyBkaWFsaXhzIDogIiI7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgIHNwcmludGYob3V0YnVmLCIlcyVzJXMlcyVzJXMiLHB4byxucHIscCx4YnVmLHAyLHNmeCk7CisgICAgICAgICAgICAgICAgc3ByaW50ZihwZHNmeCwiJXMlcyIscDIsc2Z4KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgY2ttYWt4bXNnKG91dGJ1ZiwyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB4byxucHIscCx4YnVmLHAyLHNmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgIGNrbWFrbXNnKHBkc2Z4LDY0LHAyLHNmeCxOVUxMLE5VTEwpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBDS19UQVBJCisgICAgaWYgKHR0dGFwaSAmJiAgICAgICAgICAgICAgICAgICAgICAgLyogVEFQSSBwZXJmb3JtcyB0aGUgY29udmVyc2lvbnMgKi8KKyAgICAgICAgIXRhcGlwYXNzICYmCisgICAgICAgIHRhcGljb252ID09IENLX0FVVE8gfHwKKyAgICAgICAgdGFwaWNvbnYgPT0gQ0tfT04KKyAgICAgICAgKSB7CisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBkaWFsdHlwZSA9IC0yOworICAgICAgICBpZiAoIWNrdGFwaUNvbnZlcnRQaG9uZU51bWJlcihkbl9wW2tdLCZwKSkKKyAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBtYWtlc3RyKCZkbl9wMltrXSwgcCk7CisgICAgICAgIGlmIChwKSBmcmVlKHApOworICAgICAgICByZXR1cm4oMCk7CisgICAgfSBlbHNlIHsKKyNlbmRpZiAvKiBDS19UQVBJICovCisgICAgICAgIG1ha2VzdHIoJmRuX3AyW2tdLCBvdXRidWYpOworI2lmZGVmIENLX1RBUEkKKyAgICB9CisjZW5kaWYgLyogQ0tfVEFQSSAqLworICAgIGRpYWx0eXBlID0gd2hhdDsKKyAgICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQKK2RkY3Z0KHMsIGYsIG4pIGNoYXIgKiBzOyBGSUxFICogZjsgaW50IG47IHsgLyogRGlhbCBEaXJlY3RvcnkgQ29udmVydCAqLworICAgIGNoYXIgbGluZWJ1ZlsxMDI0XSwgKnMyOyAgICAgICAgICAgIC8qIEJ1ZmZlcnMgYW5kIHBvaW50ZXJzICovCisjaWZkZWYgVk1TCisgICAgY2hhciAqIHRlbXAgPSBOVUxMOworI2VuZGlmIC8qIFZNUyAqLworICAgIGNoYXIgKmluZm9bOF07ICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXJzIHRvIHdvcmRzIGZyb20gZW50cnkgKi8KKyAgICBGSUxFICogZjIgPSBOVUxMOworICAgIGludCB4LCByYzsKKyAgICByYyA9IC0xOworCisgICAgZGVidWcoRjExMCwiZGRjdnQgZmlsZSIscywwKTsKKworICAgIGlmICghcyB8fCAhZikgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGZpbGVuYW1lIG9yIGZpbGUgKi8KKyAgICAgIHJldHVybigtMSk7CisgICAgaWYgKCEqcykKKworICAgIGZjbG9zZShmKTsKKyAgICB6bmV3bihzLCZzMik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzMiA9IGFkZHJlc3Mgb2Ygc3RhdGljIGJ1ZmZlciAqLworICAgIGRlYnVnKEYxMTAsImRkY3Z0IG5ld25hbWUiLHMyLDApOworCisjaWZkZWYgVk1TCisgICAgLyogSW4gVk1TLCB6bmV3bigpIHJldHVybnMgdGhlIHNhbWUgZmlsZSBuYW1lIHdpdGggYSBuZXcgdmVyc2lvbiBudW1iZXIgKi8KKyAgICBtYWtlc3RyKCZ0ZW1wLHMpOyAgICAgICAgICAgICAgICAgICAvKiBTd2FwIC0gb3RoZXJ3aXNlIHRoZSBuZXcgKi8KKyAgICBzID0gczI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uIGhhcyB0aGUgb2xkZXIgdmVyc2lvbiAqLworICAgIHMyID0gdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlci4uLiAqLworICAgIGRlYnVnKEYxMTAsImRkY3Z0IGFmdGVyIHN3YXAgcyIscywwKTsKKyAgICBkZWJ1ZyhGMTEwLCJkZGN2dCBhZnRlciBzd2FwIHMyIixzMiwwKTsKKyAgICBtYWtlc3RyKCYoZGlhbGRpcltuXSkscyk7ICAgICAgICAgICAvKiBOZXcgZmlsZSBnZXRzIG5ldyB2ZXJzaW9uIG51bWJlciAqLworICAgIGRlYnVnKEYxMTAsImRkY3Z0IGFmdGVyIG1ha2VzdHIgczIiLHMyLDApOworICAgIGRlYnVnKEYxMTEsImRkY3Z0IGRpYWxkaXJbbl0iLGRpYWxkaXJbbl0sbik7CisjZWxzZQorICAgIGlmICh6cmVuYW1lKHMsczIpIDwgMCkgeyAgICAgICAgICAgIC8qIE5vdCBWTVMgLSByZW5hbWUgb2xkIGZpbGUgKi8KKyAgICAgICAgcGVycm9yKHMyKTsgICAgICAgICAgICAgICAgICAgICAvKiB0byBuZXcgKHdpZXJkKSBuYW1lLiAqLworICAgICAgICBnb3RvIGRkZXhpdDsKKyAgICB9CisjZW5kaWYgLyogVk1TICovCisgICAgZGVidWcoRjExMCwiZGRjdnQgczIgKG9sZCkiLHMyLDApOworICAgIGlmICgoZiA9IGZvcGVuKHMyLCJyIikpID09IE5VTEwpIHsgIC8qIFJlb3BlbiBvbGQgZmlsZSB3aXRoIHdpZXJkIG5hbWUgKi8KKyAgICAgICAgZGVidWcoRjExMCwiZGRjdnQgczIgb3BlbiBlcnJvciIsY2tfZXJyc3RyKCksMCk7CisgICAgICAgIGRpcmxpbmUgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogKG9yIGluIFZNUywgb2xkIHZlcnNpb24pICovCisgICAgICAgIHBlcnJvcihzMik7CisgICAgICAgIGdvdG8gZGRleGl0OworICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJkZGN2dCBmb3BlbihzMikgT0siLHMyLDApOworCisgICAgZGVidWcoRjExMCwiZGRjdnQgcyAobmV3KSIscywwKTsKKyAgICBpZiAoKGYyID0gZm9wZW4ocywidyIpKSA9PSBOVUxMKSB7ICAvKiBDcmVhdGUgbmV3IGZpbGUgd2l0aCBvbGQgbmFtZSAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJkZGN2dCBzIG9wZW4gZXJyb3IiLGNrX2VycnN0cigpLDApOworICAgICAgICBwZXJyb3Iocyk7ICAgICAgICAgICAgICAgICAgICAgIC8qIChvciBpbiBWTVMsIG5ldyB2ZXJzaW9uKSAqLworICAgICAgICBnb3RvIGRkZXhpdDsKKyAgICB9CisgICAgZGVidWcoRjExMCwiZGRjdnQgZm9wZW4ocykgT0siLHMsMCk7CisKKyAgICBwcmludGYoIlxuU2F2aW5nIG9sZCBkaXJlY3RvcnkgYXMgJXMuXG5Db252ZXJ0aW5nICVzLi4uIixzMixzKTsKKyAgICBmcHJpbnRmKGYyLCI7ICVzIC0gS2VybWl0IGRpYWxpbmcgZGlyZWN0b3J5XG4iLCBzKTsKKyAgICBmcHJpbnRmKGYyLCIlLTE2cyAlLTIwcyA7ICU1cyAlLTZzIDsgJXNcbiIsCisgICAgICAgICAgICAgICAiOyBOYW1lIiwiTnVtYmVyIiwiU3BlZWQiLCJQYXJpdHkiLCJDb21tZW50IgorICAgICAgICAgICAgICAgKTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGxpbmVidWZbMF0gPSBOVUw7ICAgICAgICAgICAgICAgLyogUmVhZCBhIGxpbmUgKi8KKyAgICAgICAgaWYgKGZnZXRzKGxpbmVidWYsMTAyMyxmKSA9PSBOVUxMKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWJ1ZyhGMTEwLCJkZGN2dCBsaW5lYnVmIixsaW5lYnVmLDApOworICAgICAgICBpZiAoIWxpbmVidWZbMF0pIHsgICAgICAgICAgICAgIC8qIEVtcHR5IGxpbmUgKi8KKyAgICAgICAgICAgIGZwcmludGYoZjIsIlxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB4ID0gKGludCkgc3RybGVuKGxpbmVidWYpOyAgICAgIC8qIFN0cmlwIGxpbmUgdGVybWluYXRvciwgKi8KKyAgICAgICAgd2hpbGUgKHgtLSA+IDApIHsgICAgICAgICAgICAgICAvKiBpZiBhbnkuICovCisgICAgICAgICAgICBpZiAobGluZWJ1Zlt4XSA8PSBTUCkKKyAgICAgICAgICAgICAgbGluZWJ1Zlt4XSA9IE5VTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgeHdvcmRzKGxpbmVidWYsNSxpbmZvLDEpOyAgICAgICAvKiBQYXJzZSBpdCB0aGUgb2xkIHdheSAqLworICAgICAgICBmb3IgKHggPSAxOyB4IDwgNjsgeCsrKQorICAgICAgICAgIGlmICghaW5mb1t4XSkgaW5mb1t4XSA9ICIiOworICAgICAgICBmcHJpbnRmKGYyLCIlLTE2cyAlLTIwcyA7ICU1cyAlLTZzICVzXG4iLAorICAgICAgICAgICAgICAgaW5mb1sxXSxpbmZvWzJdLGluZm9bM10saW5mb1s0XSxpbmZvWzVdCisgICAgICAgICAgICAgICApOworICAgIH0KKyAgICBwcmludGYoIiBPS1xuXG4iKTsKKyAgICByYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzICovCisgIGRkZXhpdDoKKyAgICBpZiAoZikgZmNsb3NlKGYpOworICAgIGlmIChmMikgZmNsb3NlKGYyKTsKKyNpZmRlZiBWTVMKKyAgICBpZiAodGVtcCkgZnJlZSh0ZW1wKTsKKyNlbmRpZiAvKiBWTVMgKi8KKyAgICByZXR1cm4ocmMpOworfQorCitpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcyA9IG5hbWUgdG8gbG9vayB1cCAgICovCisjaWZkZWYgQ0tfQU5TSUMgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3ggPSBpbmRleCBvZiBjb21tYW5kICovCitsdWRpYWwoY2hhciAqcywgaW50IGN4KSAgICAgICAgICAgICAgICAgLyogKERJQUwsIExPT0tVUCwgZXRjKSAgICovCisjZWxzZQorbHVkaWFsKHMsIGN4KSBjaGFyICpzOyBpbnQgY3g7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGx1ZGlhbCAqLyB7CisKKyAgICBpbnQgZGQsIG4xLCBuMiwgbjMsIGksIGosIHQ7ICAgICAgICAvKiBXb3JrZXJzICovCisgICAgaW50IG9sZGRpciwgbmV3ZGlyLCBvbGRlbnRyeSwgbmV3ZW50cnk7CisgICAgaW50IHBhc3MgPSAwOworICAgIGludCBvbGRmbGcgPSAwOworICAgIGludCBhbWJpZ3VvdXMgPSAwOyAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIGxvb2t1cCB3YXMgYW1iaWd1b3VzICovCisgICAgY2hhciAqaW5mb1s3XTsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlcnMgdG8gd29yZHMgZnJvbSBlbnRyeSAqLworICAgIGNoYXIgKnBwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gZWxlbWVudCBvZiBhcnJheSAqLworICAgIEZJTEUgKiBmOworICAgIGNoYXIgKmxpbmU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgaW5wdXQgYnVmZmVyICovCisKKy8qICNkZWZpbmUgTFVERUJVRyAqLworCisjaWZkZWYgTFVERUJVRworaW50IHp6ID0gMTsKKyNlbmRpZiAvKiBMVURFQlVHICovCisKKyAgICBpZiAoIXMgfHwgbmRpYWxkaXIgPCAxKSAgICAgICAgICAgICAvKiBWYWxpZGF0ZSBhcmd1bWVudHMgKi8KKyAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAoKG4xID0gKGludCkgc3RybGVuKHMpKSA8IDEpICAgICAvKiBMZW5ndGggb2Ygc3RyaW5nIHRvIGxvb2sgdXAgKi8KKyAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAoIShsaW5lID0gbWFsbG9jKDEwMjQpKSkgICAgICAgICAvKiBBbGxvY2F0ZSBpbnB1dCBidWZmZXIgKi8KKyAgICAgIHJldHVybigtMSk7CisKKyNpZmRlZiBMVURFQlVHCitpZiAoenopIHByaW50ZigiTFVESUFMIDEgc1slc10sIG4xPSVkXG4iLHMsbjEpOworI2VuZGlmIC8qIExVREVCVUcgKi8KKworICAgIHBhc3MgPSAwOworICBsdV9hZ2FpbjoKKyAgICBmID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWFsIGRpcmVjdG9yeSBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgICB0ID0gZG5jb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBEaWFsLW51bWJlciBtYXRjaCBjb3VudCAqLworICAgIGRkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpcmVjdG9yeSBjb3VudGVyICovCisgICAgb2xkZGlyID0gMDsKKyAgICBuZXdkaXIgPSAwOworLyoKKyAgV2UgbmVlZCB0byByZWNvZ25pemUgYm90aCBvbGQtIGFuZCBuZXctc3R5bGUgZGlyZWN0b3JpZXMuCisgIEJ1dCB3ZSBjYW4ndCBhbGxvdyBvbGQtc3R5bGUgYW5kIG5ldy1zdHlsZSBlbnRyaWVzIGluIHRoZSBzYW1lCisgIGRpcmVjdG9yeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIGZvciBzdXJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgYW4gb2xkLXN0eWxlIGVudHJ5IGxpa2UgdGhpczoKKworICAgIGZvbyAgNTU1MTIxMiAgOTYwMAorCisgIGFuZCBhIG5ldy1zdHlsZSBsaXRlcmFsIGVudHJ5IGxpa2UgdGhpczoKKworICAgIGZvbyAgNTU1IDk2MDAKKworICBJLmUuIGlzIHRoZSAiOTYwMCIgYSBzcGVlZCwgb3IgcGFydCBvZiB0aGUgcGhvbmUgbnVtYmVyPworKi8KKyAgICB3aGlsZSAoMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBtYWtlIG9uZSBwYXNzICovCisgICAgICAgIGlmICghZikgeyAgICAgICAgICAgICAgICAgICAgICAgLyogRGlyZWN0b3J5IG5vdCBvcGVuICovCisgICAgICAgICAgICBpZiAoZGQgPj0gbmRpYWxkaXIpICAgICAgICAgLyogTm8gZGlyZWN0b3JpZXMgbGVmdD8gKi8KKyAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAvKiBEb25lLiAqLworICAgICAgICAgICAgZGVidWcoRjExMSwibHVkaWFsIGRpYWxkaXJbZGRdIixkaWFsZGlyW2RkXSxkZCk7CisgICAgICAgICAgICBpZiAoKGYgPSBmb3BlbihkaWFsZGlyW2RkXSwiciIpKSA9PSBOVUxMKSB7IC8qIE9wZW4gaXQgKi8KKyAgICAgICAgICAgICAgICBwZXJyb3IoZGlhbGRpcltkZF0pOyAgICAvKiBDYW4ndCwgcHJpbnQgbWVzc2FnZSBzYXlpbmcgd2h5ICovCisgICAgICAgICAgICAgICAgaWYgKGxpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRkKys7ICAgICAgICAgICAgICAgICAgIC8qIEdvIG9uIHRvIG5leHQgb25lLCBpZiBhbnkuLi4gKi8KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpcmxpbmUgPSAwOyAgICAgICAgICAgICAgICAvKiBEaXJlY3RvcnkgZmlsZSBsaW5lIG51bWJlciAqLworICAgICAgICAgICAgaWYgKGRpYWxkcHkgJiYgIXBhc3MpCisgICAgICAgICAgICAgIHByaW50ZigiT3BlbmluZzogJXMuLi5cbiIsZGlhbGRpcltkZF0pOworICAgICAgICAgICAgZGQrKzsKKyAgICAgICAgICAgIGlmICghb2xkZmxnKSBvbGRkaXIgPSAwOworICAgICAgICAgICAgbmV3ZGlyID0gMDsKKyAgICAgICAgfQorICAgICAgICBvbGRlbnRyeSA9IDA7CisgICAgICAgIG5ld2VudHJ5ID0gMDsKKyAgICAgICAgbGluZVswXSA9IE5VTDsKKyAgICAgICAgaWYgKGdldG5jdChsaW5lLDEwMjMsZiwxKSA8IDApIHsgLyogUmVhZCBhIGxpbmUgKi8KKyAgICAgICAgICAgIGlmIChmKSB7ICAgICAgICAgICAgICAgICAgICAvKiBmIGNhbiBiZSBjbG9iYmVyZWQhICovCisgICAgICAgICAgICAgICAgZmNsb3NlKGYpOyAgICAgICAgICAgICAgLyogQ2xvc2UgdGhlIGZpbGUgKi8KKyAgICAgICAgICAgICAgICBmID0gTlVMTDsgICAgICAgICAgICAgICAvKiBJbmRpY2F0ZSBuZXh0IG9uZSBuZWVkcyBvcGVuaW5nICovCisgICAgICAgICAgICAgICAgb2xkZmxnID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICghbGluZVswXSkgICAgICAgICAgICAgICAgICAgLyogRW1wdHkgbGluZSAqLworICAgICAgICAgIGNvbnRpbnVlOworI2lmZGVmIExVREVCVUcKK2lmICh6eikgcHJpbnRmKCJMVURJQUwgMiBzWyVzXVxuIixzKTsKKyNlbmRpZiAvKiBMVURFQlVHICovCisKKyAgICAgICAgLyogTWFrZSBhIGNvcHkgYW5kIHBhcnNlIGl0IHRoZSBvbGQgd2F5ICovCisgICAgICAgIC8qIEEgY29weSBpcyBuZWVkZWQgYmVjYXVzZSB4d29yZHMoKSBwb2tlcyBOVUxzIGludG8gdGhlIHN0cmluZyAqLworCisgICAgICAgIGlmICgocHAgPSBtYWxsb2MoKGludClzdHJsZW4obGluZSkgKyAxKSkpIHsKKyAgICAgICAgICAgIHN0cmNweShwcCxsaW5lKTsgICAgICAgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICB4d29yZHMocHAsNSxpbmZvLDApOyAgICAgICAgLyogUGFyc2UgaXQgdGhlIG9sZCB3YXkgKi8KKworI2lmZGVmIExVREVCVUcKK2lmICh6eikgcHJpbnRmKCJMVURJQUwgMyBzWyVzXVxuIixzKTsKKyNlbmRpZiAvKiBMVURFQlVHICovCisKKyAgICAgICAgICAgIGlmICghaW5mb1sxXSkKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoKmluZm9bMV0gPT0gJzsnKSB7ICAgICAgLyogSWYgZnVsbC1saW5lIGNvbW1lbnQsICovCisgICAgICAgICAgICAgICAgbmV3ZGlyID0gMTsgICAgICAgICAgICAgLyogKG9ubHkgbmV3IGRpcmVjdG9yaWVzIGhhdmUgdGhlbSkgKi8KKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAvKiBrZWVwIHJlYWRpbmcuICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWluZm9bMl0pCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCppbmZvWzJdID09ICcrJykKKyAgICAgICAgICAgICAgbmV3ZW50cnkgPSAxOworICAgICAgICAgICAgaWYgKGluZm9bNF0pIHsKKyAgICAgICAgICAgICAgICBpZiAoKCppbmZvWzRdID09ICc9JykgfHwKKyAgICAgICAgICAgICAgICAgICAgIWNrc3RyY21wKGluZm9bNF0sIm5vbmUiLCA0LDApIHx8CisgICAgICAgICAgICAgICAgICAgICFja3N0cmNtcChpbmZvWzRdLCJldmVuIiwgNCwwKSB8fAorICAgICAgICAgICAgICAgICAgICAhY2tzdHJjbXAoaW5mb1s0XSwic3BhY2UiLDUsMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIWNrc3RyY21wKGluZm9bNF0sIm1hcmsiLCA0LDApIHx8CisgICAgICAgICAgICAgICAgICAgICFja3N0cmNtcChpbmZvWzRdLCJvZGQiLCAgMywwKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICBvbGRlbnRyeSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBwKSB7CisgICAgICAgICAgICBmcmVlKHBwKTsKKyAgICAgICAgICAgIHBwID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGNvbnNpc3RlbmN5ICovCisKKyAgICAgICAgaWYgKChvbGRlbnRyeSB8fCBvbGRkaXIpICYmIChuZXdlbnRyeSB8fCBuZXdkaXIpKSB7CisgICAgICAgICAgICBwcmludGYoCisiXG5FUlJPUjogWW91IHNlZW0gdG8gaGF2ZSBvbGQtIGFuZCBuZXctZm9ybWF0IGVudHJpZXMgbWl4ZWQgaW4geW91clxuIik7CisgICAgICAgICAgICBwcmludGYoCisiZGlhbGluZyBkaXJlY3RvcnkuICBZb3UnbGwgaGF2ZSB0byBlZGl0IGl0IGJ5IGhhbmQgdG8gY29udmVydCBpdCB0byB0aGVcbiIpOworI2lmbmRlZiBOT0hFTFAKKyAgICAgICAgICAgIHByaW50ZigibmV3IGZvcm1hdC4gIFR5cGUgSEVMUCBESUFMIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLlxuXG4iKTsKKyNlbHNlCisgICAgICAgICAgICBwcmludGYoIm5ldyBmb3JtYXQuXG5cbiIpOworI2VuZGlmIC8qIE5PSEVMUCAqLworICAgICAgICAgICAgaWYgKGxpbmUpIHsKKyAgICAgICAgICAgICAgICBmcmVlKGxpbmUpOworICAgICAgICAgICAgICAgIGxpbmUgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9sZGRpciAmJiBvbGRlbnRyeSkgeworICAgICAgICAgICAgaW50IGNvbnZlcnQgPSAwOworICAgICAgICAgICAgb2xkZGlyID0gMTsKKyAgICAgICAgICAgIGlmIChkaWFsY3Z0ID09IDIpIHsgICAgICAgICAvKiAyID09IEFTSyAqLworICAgICAgICAgICAgICAgIHNwcmludGYodG1wYnVmLAorIldBUk5JTkc6IE9sZC1zdHlsZSBkaWFsaW5nIGRpcmVjdG9yeSBkZXRlY3RlZDpcbiVzIiwgbGluZSk7CisJCWNvbnZlcnQgPSB1cV9vayh0bXBidWYsCisJCQkJIlNoYWxsIEkgY29udmVydCBpdCBmb3IgeW91PyAiLDMsTlVMTCwwKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBjb252ZXJ0ID0gZGlhbGN2dDsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0KSB7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwibHVkaWFsIGNhbGxpbmcgZGRjdnQiLGRpYWxkaXJbZGQtMV0sZGQpOworICAgICAgICAgICAgICAgIGlmIChkZGN2dChkaWFsZGlyW2RkLTFdLGYsZGQtMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImx1ZGlhbCBkZGN2dCBmYWlsZWQiLGRpYWxkaXJbZGQtMV0sZGQpOworICAgICAgICAgICAgICAgICAgICBvbGRmbGcgPSAxOworICAgICAgICAgICAgICAgICAgICBwcmludGYoCisiICBTb3JyeSwgY2FuJ3QgY29udmVydC4iKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorIiAgV2lsbCBpZ25vcmUgc3BlZWQgYW5kIHBhcml0eSBmaWVsZHMsIGNvbnRpbnVpbmcuLi5cblxuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkZGlyID0gbmV3ZGlyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwibHVkaWFsIGRkY3Z0IG9rIixkaWFsZGlyW2RkLTFdLGRkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGQtLTsKKyAgICAgICAgICAgICAgICBmID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGRpYWxjdnQgPT0gMikKKyAgICAgICAgICAgICAgICAgIHByaW50ZigKKyIgIE9LLCB3aWxsIGlnbm9yZSBzcGVlZCBhbmQgcGFyaXR5IGZpZWxkcywgY29udGludWluZy4uLlxuXG4iKTsKKyAgICAgICAgICAgICAgICBvbGRkaXIgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZmRlZiBMVURFQlVHCitpZiAoenopIHByaW50ZigiTFVESUFMIFhYIHNbJXNdLCBuMT0lZFxuIixzLG4xKTsKKyNlbmRpZiAvKiBMVURFQlVHICovCisKKyAgICAgICAgLyogTm93IHBhcnNlIGFnYWluIGZvciByZWFsICovCisKKyAgICAgICAgaWYgKG9sZGVudHJ5KSAgICAgICAgICAgICAgICAgICAvKiBQYXJzZSBpdCB0aGUgb2xkIHdheSAqLworICAgICAgICAgIHh3b3JkcyhsaW5lLDUsaW5mbywwKTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYXJzZSBpdCB0aGUgbmV3IHdheSAqLworICAgICAgICAgIHh3b3JkcyhsaW5lLDIsaW5mbywxKTsKKworI2lmZGVmIExVREVCVUcKK2lmICh6eikgcHJpbnRmKCJMVURJQUwgWVkgc1slc10sIG4xPSVkXG4iLHMsbjEpOworaWYgKHp6KSBwcmludGYoIiVzIFslc11cbiIsaW5mb1sxXSxpbmZvWzJdKTsKKyNlbmRpZiAvKiBMVURFQlVHICovCisKKyAgICAgICAgaWYgKGluZm9bMV0pIHsgICAgICAgICAgICAgICAgICAvKiBGaXJzdCB3b3JkIGlzIGVudHJ5IG5hbWUgKi8KKyAgICAgICAgICAgIGlmICgobjMgPSAoaW50KSBzdHJsZW4oaW5mb1sxXSkpIDwgMSkgLyogSXRzIGxlbmd0aCAqLworICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgIC8qIElmIG5vIGZpcnN0IHdvcmQsIGtlZXAgcmVhZGluZy4gKi8KKyAgICAgICAgICAgIGlmIChuMyA8IG4xKSAgICAgICAgICAgICAgICAvKiBTZWFyY2ggbmFtZSBpcyBsb25nZXIgKi8KKyAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAvKiBDYW4ndCBwb3NzaWJseSBtYXRjaCAqLworICAgICAgICAgICAgaWYgKGFtYmlndW91cyAmJiBuMyAhPSBuMSkKKyAgICAgICAgICAgICAgY29udGludWU7CisKKyNpZmRlZiBMVURFQlVHCitpZiAoenopIHByaW50ZigiTUFUQ0hJTkc6IFslc10gWyVzXSwgbjE9JWRcbiIscyxpbmZvWzFdLG4xKTsKKyNlbmRpZiAvKiBMVURFQlVHICovCisKKyAgICAgICAgICAgIGlmIChja3N0cmNtcChzLGluZm9bMV0sbjEsMCkpIC8qIENhc2VsZXNzIHN0cmluZyBjb21wYXJpc29uICovCisgICAgICAgICAgICAgIGNvbnRpbnVlOworCisjaWZkZWYgTFVERUJVRworaWYgKHp6KSBwcmludGYoIk1BVENIIE9LOiBbJXNdIFslc10sIG4xPSVkXG4iLHMsaW5mb1sxXSxuMSk7CisjZW5kaWYgLyogTFVERUJVRyAqLworCisgICAgICAgICAgICBpZiAoIWluZm9bMl0pICAgICAgICAgICAgICAgLyogTm8gcGhvbmUgbnVtYmVyIGdpdmVuICovCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKChuMiA9IChpbnQpIHN0cmxlbihpbmZvWzJdKSkgPCAxKSAvKiBMZW5ndGggb2YgcGhvbmUgbnVtYmVyICovCisgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgLyogSWdub3JlIGVtcHR5IHBob25lIG51bWJlcnMgKi8KKworICAgICAgICAgICAgLyogR290IG9uZSAqLworCisgICAgICAgICAgICBpZiAoIShwcCA9IChjaGFyICopbWFsbG9jKG4yICsgMSkpKSB7IC8qIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIGl0ICovCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/aW50ZXJuYWwgZXJyb3IgLSBsdWRpYWwgbWFsbG9jIDFcbiIpOworICAgICAgICAgICAgICAgIGlmIChsaW5lKSB7CisgICAgICAgICAgICAgICAgICAgIGZyZWUobGluZSk7CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkbmNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyY3B5KHBwLGluZm9bMl0pOyAgICAgICAgIC8qIHNhZmUgKi8KKworICAgICAgICAgICAgaWYgKGRuY291bnQgPiBNQVhETlVNUykgeworICAgICAgICAgICAgICAgIHByaW50ZigiV2FybmluZzogJWQgbWF0Y2hlcyBmb3VuZCwgJWQgbWF4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBkbmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICBNQVhETlVNUworICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGRuY291bnQgPSBNQVhETlVNUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRuX3BbZG5jb3VudCsrXSA9IHBwOyAgICAgICAvKiBBZGQgcG9pbnRlciB0byBhcnJheS4gKi8KKyAgICAgICAgICAgIGlmIChkbmNvdW50ID09IDEpIHsgICAgICAgICAvKiBGaXJzdCBvbmUuLi4gKi8KKyAgICAgICAgICAgICAgICBpZiAoZF9uYW1lKSBmcmVlKGRfbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKCEoZF9uYW1lID0gKGNoYXIgKiltYWxsb2MobjMgKyAxKSkpIHsgLyogU2F2ZSBpdHMgbmFtZSAqLworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9pbnRlcm5hbCBlcnJvciAtIGx1ZGlhbCBtYWxsb2MgMlxuIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZG5jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHQgPSBuMzsgICAgICAgICAgICAgICAgIC8qIEFuZCBpdHMgbGVuZ3RoICovCisgICAgICAgICAgICAgICAgc3RyY3B5KGRfbmFtZSxpbmZvWzFdKTsgLyogc2FmZSAqLworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIFNlY29uZCBvciBzdWJzZXF1ZW50IG9uZSAqLworCisjaWZkZWYgTFVERUJVRworICAgICAgICAgICAgICAgIGlmICh6eikKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiZF9uYW1lPVslc10saW5mb1sxXT0lcyx0PVslZF1cbiIsZF9uYW1lLGluZm9bMV0sdCk7CisjZW5kaWYgLyogTFVERUJVRyAqLworCisgICAgICAgICAgICAgICAgaWYgKChpbnQpIHN0cmxlbihpbmZvWzFdKSA9PSB0KSAvKiBMZW5ndGhzIGNvbXBhcmUgKi8KKyAgICAgICAgICAgICAgICAgIGlmICghY2tzdHJjbXAoZF9uYW1lLGluZm9bMV0sdCwwKSkgLyogQ2FzZWxlc3MgY29tcGFyZSBPSyAqLworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8qIE5hbWUgZ2l2ZW4gYnkgdXNlciBtYXRjaGVzIGVudHJpZXMgd2l0aCBkaWZmZXJlbnQgbmFtZXMgKi8KKworICAgICAgICAgICAgICAgIGlmIChhbWJpZ3VvdXMpICAgICAgICAgIC8qIEJlZW4gaGVyZSBiZWZvcmUgKi8KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgYW1iaWd1b3VzID0gMTsgICAgICAgICAgLyogTm93IGFuIGV4YWN0IG1hdGNoIGlzIHJlcXVpcmVkICovCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGRuY291bnQ7IGorKykgeyAvKiBDbGVhbiBvdXQgcHJldmlvdXMgbGlzdCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZG5fcFtqXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShkbl9wW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRuX3Bbal0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhc3MrKzsgICAgICAgICAgICAgICAgIC8qIFNlY29uZCBwYXNzLi4uICovCisgICAgICAgICAgICAgICAgZ290byBsdV9hZ2FpbjsgICAgICAgICAgLyogRG8gaXQgYWxsIG92ZXIgYWdhaW4uICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGxpbmUpIGZyZWUobGluZSk7CisgICAgaWYgKGRuY291bnQgPT0gMCAmJiBhbWJpZ3VvdXMpIHsKKyAgICAgICAgcHJpbnRmKCIgTG9va3VwOiBcIiVzXCIgLSBhbWJpZ3VvdXMlc1xuIiwKKyAgICAgICAgICAgICAgIHMsCisgICAgICAgICAgICAgICBjeCA9PSBYWExPT0sgPyAiIiA6ICIgLSBkaWFsaW5nIHNraXBwZWQiCisgICAgICAgICAgICAgICApOworICAgICAgICByZXR1cm4oLTIpOworICAgIH0KKyAgICByZXR1cm4oZG5jb3VudCk7Cit9CisKK2NoYXIgKgorcG5jdnQocykgY2hhciAqczsgeyAgICAgICAgICAgICAgICAgICAgIC8qIFBob25lIG51bWJlciBjb252ZXJzaW9uICovCisgICAgY2hhciAqcCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgLyogKGp1c3QgYSB3cmFwcGVyIGZvciBkbmN2dCgpICovCisgICAgY2hhciAqcSA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgcG5idWZbMTI4XTsKKyAgICBtYWtlc3RyKCZwLGRuX3BbMF0pOyAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZXNlIGluIGNhc2UgdGhleSBhcmUgKi8KKyAgICBtYWtlc3RyKCZxLGRuX3AyWzBdKTsgICAgICAgICAgICAgICAvKiBiZWluZyB1c2VkICovCisgICAgbWFrZXN0cigmZG5fcFswXSxzKTsgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgYXJndW1lbnQgc3RyaW5nIHRvIGhlcmUgKi8KKyAgICBkbmN2dCgwLFhYTE9PSywxLDEpOyAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IGl0ICovCisgICAgaWYgKCFkbl9wMlswXSkgICAgICAgICAgICAgICAgICAgICAgLyogUHV0IHJlc3VsdCB3aGVyZSBjYW4gcmV0dXJuIGl0ICovCisgICAgICBwbmJ1ZlswXSA9IE5VTDsKKyAgICBlbHNlCisgICAgICBja3N0cm5jcHkocG5idWYsZG5fcDJbMF0sMTI3KTsKKyAgICBtYWtlc3RyKCZkbl9wWzBdLHApOyAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIHRoZXNlICovCisgICAgbWFrZXN0cigmZG5fcDJbMF0scSk7CisgICAgbWFrZXN0cigmcCxOVUxMKTsgICAgICAgICAgICAgICAgICAgLyogRnJlZSB0aGVzZSAqLworICAgIG1ha2VzdHIoJnEsTlVMTCk7CisgICAgcmV0dXJuKChjaGFyICopcG5idWYpOworfQorCitpbnQKK2RvZGlhbChjeCkgaW50IGN4OyB7ICAgICAgICAgICAgICAgICAgICAvKiBESUFMIG9yIFJFRElBTCAqLworICAgIGludCBpID0gMCwgeCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIFdvcmtlcnMgKi8KKyAgICBpbnQgc3Bhcml0eSA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBGb3Igc2F2aW5nIGdsb2JhbCBwYXJpdHkgdmFsdWUgKi8KKyAgICBpbnQgcHJldmlvdXMgPSAwOworICAgIGludCBsZW4gPSAwOworICAgIGludCBsaXRlcmFsID0gMDsKKyAgICBpbnQgZmxvd3NhdmU7CisgICAgaW50IGx1Zm91bmQgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogRGlkIGFueSBsb29rdXAgc3VjY2VlZD8gKi8KKyAgICBpbnQgcHJlZml4ID0gMTsKKyAgICBpbnQgcG9zdGZpeCA9IDE7CisgICAgaW50IHdhc2FscGhhID0gMDsKKyAgICBpbnQgeHJlZGlhbCA9IDA7CisgICAgaW50IGJyYWNlcyA9IDA7CisKKyAgICBjaGFyICpwID0gTlVMTCwgKnMzID0gTlVMTCwgKiBzYXYgPSBOVUxMOworICAgIGludCBqID0gMCwgdCA9IDAsIG4gPSAwOworICAgIGludCB4cmV0cmllcywgeGxjYzsKKworICAgIGRlYnVnKEYxMDEsImRvZGlhbCBjeCIsIiIsY3gpOworICAgIGRlYnVnKEYxMTEsImRvZGlhbCBkaWFsbGNjIixkaWFsbGNjLGRpYWxsY2MpOworCisgICAgeHJldHJpZXMgPSBkaWFscnRyOyAgICAgICAgICAgICAgICAgLyogSWYgcmV0cmllcyBub3Qgc2V0LCAqLworICAgIGlmIChkaWFsbGNjKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNob29zZSBkZWZhdWx0IGJhc2VkIG9uICovCisgICAgICAgIHhsY2MgPSBhdG9pKGRpYWxsY2MpOyAgICAgICAgICAgLyogbG9jYWwgY291bnRyeSBjb2RlLiAqLworICAgICAgICBpZiAoeHJldHJpZXMgPCAwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHhsY2MpIHsKKyAgICAgICAgICAgICAgY2FzZSAxOiB4cmV0cmllcyA9IDEwOyBicmVhazsgLyogTm8gcmVzdHJpY3Rpb25zIGluIE5BTlAgKi8KKyAgICAgICAgICAgICAgICAvKiBBZGQgb3RoZXIgY291bnRyeSBjb2RlcyBoZXJlICovCisgICAgICAgICAgICAgICAgLyogdGhhdCBhcmUga25vd24gdG8gaGF2ZSBubyByZXN0cmljdGlvbnMgb24gcmVkaWFsaW5nLiAqLworICAgICAgICAgICAgICBkZWZhdWx0OiB4cmV0cmllcyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGN4ID09IFhYUERJQSkgeyAgICAgICAgICAgICAgICAgLyogU2hvcnRjdXQuLi4gKi8KKyAgICAgICAgY3ggPSBYWERJQUw7CisgICAgICAgIHBhcnRpYWwgPSAxOworICAgICAgICBkZWJ1ZyhGMTAwLCJQRElBTCBzZXRzIHBhcnRpYWw9MSIsIiIsMCk7CisgICAgICAgIHBvc3RmaXggPSAwOyAgICAgICAgICAgICAgICAgICAgLyogRG8gbm90IGFkZCBwb3N0Zml4ICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFydGlhbCA9IDA7CisgICAgICAgIGRlYnVnKEYxMDAsIkRJQUwgc2V0cyBwYXJ0aWFsPTAiLCIiLDApOworICAgIH0KKyAgICBwcmV2aW91cyA9IGRpYWxzdGE7ICAgICAgICAgICAgICAgICAvKiBTdGF0dXMgb2YgcHJldmlvdXMgY2FsbCwgaWYgYW55ICovCisgICAgaWYgKHByZXZpb3VzID09IERJQV9QQVJUKSB7CisgICAgICAgIHByZWZpeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogZG8gbm90IGFkZCBwcmVmaXggKi8KKyAgICB9CisgICAgcyA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB1c2VyJ3MgZGlhbCBzdHJpbmcgKi8KKyAgICBpZiAoY3ggPT0gWFhSRUQpIHsgICAgICAgICAgICAgICAgICAvKiBSRURJQUwgb3IuLi4gKi8KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICB9IGVsc2UgaWYgKGN4ID09IFhYQU5TVykgeyAgICAgICAgICAvKiBBTlNXRVIgb3IgLi4uICovCisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJ0aW1lb3V0IChzZWNvbmRzKSIsIjAiLDEwLCZ4LHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgZGlhbGF0bW8gPSB4OworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERJQUwgb3IgTE9PS1VQICovCisgICAgICAgIGlmIChuZGlhbGRpciA+IDApCisgICAgICAgICAgczMgPSAiTnVtYmVyIHRvIGRpYWwgb3IgZW50cnkgZnJvbSBkaWFsIGRpcmVjdG9yeSI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzMyA9ICJOdW1iZXIgdG8gZGlhbCI7CisgICAgICAgIGlmICgoeCA9IGNtdHh0KHMzLCBkaWFsbnVtID8gZGlhbG51bSA6ICIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKHMpIHsKKyAgICAgICAgICAgIGxlbiA9IChpbnQpIHN0cmxlbihzKTsKKyAgICAgICAgICAgIGNrc3RybmNweSh0bXBidWYscyxUTVBCVUZTSVopOyAvKiBTYXZlIGxpdGVyYWwgY29weSAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7ICAgICAgICAgICAgICAvKiBTdHJpcCBvdXRlciBicmFjZXMgaWYgZ2l2ZW4gKi8KKyAgICAgICAgICAgICAgICBpZiAoKnMgPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzW2xlbi0xXSA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNbbGVuLTFdID0gTlVMOworICAgICAgICAgICAgICAgICAgICAgICAgcysrOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgcyA9IGJyc3RyaXAocyk7ICAgICAgICAgICAgIC8qIFN0cmlwIG91dGVyIGJyYWNlcyBvciBxdW90ZXMgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3ggIT0gWFhMT09LKSB7ICAgICAgICAgICAgICAgICAvKiBOb3QgTE9PS1VQICovCisjaWZkZWYgSUtTRAorICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgIHByaW50ZigiU29ycnksIGRpYWxpbmcgaXMgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBDS19UQVBJCisgICAgICAgIGlmICh0dHRhcGkgJiYgIXRhcGlwYXNzKSB7CisgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2tpcCB0aGUgbW9kZW0gdGVzdCBpZiBUQVBJICovCisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENLX1RBUEkgKi8KKyAgICAgICAgaWYgKG1kbXR5cCA8IDEgJiYgIWRpYWx0ZXN0KSB7CisgICAgICAgICAgICBpZiAobmV0d29yaworI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgICAgICAgICAgJiYgIWlzdG5jb21wb3J0KCkKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgcHJpbnRmKCJQbGVhc2UgU0VUIEhPU1QgZmlyc3QsIGFuZCB0aGVuIFNFVCBNT0RFTSBUWVBFXG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCJTb3JyeSwgeW91IG11c3QgU0VUIE1PREVNIFRZUEUgZmlyc3RcbiIpOworICAgICAgICAgICAgZGlhbHN0YSA9IERJQV9OT01POworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWxvY2FsICYmICFkaWFsdGVzdCkgeworICAgICAgICAgICAgcHJpbnRmKCJTb3JyeSwgeW91IG11c3QgU0VUICVzIG9yIFNFVCBIT1NUIGZpcnN0XG4iLAorI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICJQT1JUIgorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAiTElORSIKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgZGlhbHN0YSA9IERJQV9OT0xJOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCFuZXR3b3JrIAorI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgICAgICAgfHwgaXN0bmNvbXBvcnQoKQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyAgICAgICAgICAgICAgKSAmJiAhZGlhbHRlc3QgJiYKKyNpZmRlZiBDS19UQVBJCisgICAgICAgICAgICAgIXR0dGFwaSAmJgorI2VuZGlmIC8qIENLX1RBUEkgKi8KKyAgICAgICAgICAgIChzcGVlZCA8IDBMKQorI2lmZGVmIFVOSVgKKyAgICAgICAgICAgICYmIChzdHJjbXAodHRuYW1lLCIvZGV2L251bGwiKSkKKyNlbHNlCisjaWZkZWYgT1NLCisgICAgICAgICAgICAmJiAoc3RyY21wKHR0bmFtZSwiL25pbCIpKQorI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIFVOSVggKi8KKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgcHJpbnRmKCJcblNvcnJ5LCB5b3UgbXVzdCBTRVQgU1BFRUQgZmlyc3RcbiIpOworICAgICAgICAgICAgZGlhbHN0YSA9IERJQV9OT1NQOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY3ggIT0gWFhBTlNXKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhETlVNUzsgaisrKSB7IC8qIEluaXRpYWxpemUgZGlhbC1udW1iZXIgbGlzdCAqLworICAgICAgICAgICAgaWYgKCFkaWFsbnVtKSB7ICAgICAgICAgICAgIC8qIEZpcnN0IHRpbWUgZGlhbGluZyAqLworICAgICAgICAgICAgICAgIGRuX3Bbal0gPSBOVUxMOyAgICAgICAgIC8qIGluaXRpYWxpemUgYWxsIHBvaW50ZXJzLiAqLworICAgICAgICAgICAgICAgIGRuX3AyW2pdID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZG5fcFtqXSkgeyAgICAgICAvKiBOb3QgdGhlIGZpcnN0IHRpbWUsICovCisgICAgICAgICAgICAgICAgZnJlZShkbl9wW2pdKTsgICAgICAgICAgLyogZnJlZSBwcmV2aW91cywgaWYgYW55LCAqLworICAgICAgICAgICAgICAgIGRuX3Bbal0gPSBOVUxMOyAgICAgICAgIC8qIHRoZW4gc2V0IHRvIE5VTEwuICovCisgICAgICAgICAgICAgICAgaWYgKGRuX3AyW2pdKQorICAgICAgICAgICAgICAgICAgZnJlZShkbl9wMltqXSk7CisgICAgICAgICAgICAgICAgZG5fcDJbal0gPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIGJyZWFrOyAgICAgICAgICAgICAgIC8qIEFscmVhZHkgTlVMTCAqLworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICBzID0gTlVMTDsKKyAgICAgICAgaWYgKCFzKQorICAgICAgICAgIHMgPSBkaWFsbnVtOworICAgICAgICBpZiAoIXMpIHsKKyAgICAgICAgICAgIGlmIChjeCA9PSBYWExPT0spCisgICAgICAgICAgICAgIHByaW50ZigiP0xvb2t1cCB3aGF0P1xuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIChjeCA9PSBYWFJFRCkgPworICAgICAgICAgICAgICAgICAgICI/Tm8gRElBTCBjb21tYW5kIGdpdmVuIHlldCIgOgorICAgICAgICAgICAgICAgICAgICI/WW91IG11c3Qgc3BlY2lmeSBhIG51bWJlciB0byBkaWFsIgorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisKKyAgICAvKiBOb3cgd2UgaGF2ZSB0aGUgInJhdyIgZGlhbCBvciBsb29rdXAgc3RyaW5nIGFuZCBzIGlzIG5vdCBOVUxMICovCisKKyAgICAgICAgbWFrZXN0cigmZHNjb3B5LHMpOyAgICAgICAgICAgICAvKiBQdXQgaXQgaW4gYSBzYWZlIHBsYWNlICovCisgICAgICAgIHMgPSBkc2NvcHk7CisgICAgICAgIG4gPSAwOworCisgICAgICAgIGRlYnVnKEYxMTEsImRvZGlhbCIscyxuZGlhbGRpcik7CisKKyAgICAgICAgd2FzYWxwaGEgPSAwOworICAgICAgICBpZiAoaXNhbHBoYSgqcykpIHsKKyAgICAgICAgICAgIHdhc2FscGhhID0gMTsKKyAgICAgICAgICAgIGlmIChuZGlhbGRpciA+IDApIHsgICAgICAgICAvKiBEbyB3ZSBoYXZlIGEgZGlhbGluZyBkaXJlY3Rvcnk/ICovCisgICAgICAgICAgICAgICAgbiA9IGx1ZGlhbChzLGN4KTsgICAgICAgLyogTG9vayB1cCB3aGF0IHRoZSB1c2VyIHR5cGVkICovCisgICAgICAgICAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiIExvb2t1cDogXCIlc1wiIC0gbm90IGZvdW5kJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjeCA9PSBYWExPT0sgPyAiIiA6ICIgLSBkaWFsaW5nIGFzIGdpdmVuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImRvZGlhbCIscyxuKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCAmJiBjeCAhPSBYWExPT0spIHsgLyogRXJyb3Igb3V0IGlmIHRoZXkgd2FudGVkIHRvIGRpYWwgKi8KKyAgICAgICAgICAgICAgICBpZiAobiA9PSAtMSkgICAgICAgICAgICAvKiAtMiBtZWFucyBsdWRpYWwgYWxyZWFkeSBnYXZlIG1zZyAqLworICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgTG9va3VwOiBmYXRhbCBlcnJvciAtIGRpYWxpbmcgc2tpcHBlZFxuIik7CisgICAgICAgICAgICAgICAgZGlhbHN0YSA9IERJQV9ESVI7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuID4gMCkgICAgICAgICAgICAgICAgICAvKiBBIHN1Y2Nlc3NmdWwgbG9va3VwICovCisgICAgICAgICAgICAgIGx1Zm91bmQgPSAxOworICAgICAgICB9IGVsc2UgaWYgKCpzID09ICc9JykgeyAgICAgICAgIC8qIElmIG51bWJlciBzdGFydHMgd2l0aCA9IHNpZ24gKi8KKyAgICAgICAgICAgIHMrKzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHJpcCBpdCAqLworICAgICAgICAgICAgbGl0ZXJhbCA9IDE7ICAgICAgICAgICAgICAgIC8qIHJlbWVtYmVyIHRoaXMgKi8KKyAgICAgICAgICAgIHdoaWxlICgqcyA9PSBTUCkgcysrOyAgICAgICAvKiBhbmQgdGhlbiBhbHNvIGFueSBsZWFkaW5nIHNwYWNlcyAqLworICAgICAgICB9IGVsc2UgaWYgKHRtcGJ1ZlswXSA9PSAneycgJiYgdG1wYnVmWzFdID09ICd7JykgeworICAgICAgICAgICAgbWFrZWxpc3QodG1wYnVmLGRuX3AsTUFYRE5VTVMpOworICAgICAgICAgICAgbWFrZXN0cigmZHNjb3B5LHRtcGJ1Zik7CisgICAgICAgICAgICBzID0gdG1wYnVmOworICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IE1BWEROVU1TOyBuKyspIC8qIChoYXZlIHRvIGNvdW50IGhvdyBtYW55KSAqLworICAgICAgICAgICAgICBpZiAoIWRuX3Bbbl0pIGJyZWFrOworICAgICAgICAgICAgYnJhY2VzID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3ggPT0gWFhMT09LICYmICF3YXNhbHBoYSAmJiAhYnJhY2VzKSB7CisgICAgICAgICAgICAvKiBXZSd2ZSBiZWVuIHRvbGQgdG8gbG9va3VwIGEgbnVtYmVyIG9yIGEgcXVvdGVkIG5hbWUgKi8KKyAgICAgICAgICAgIGNoYXIgKnA7CisgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgICAgIHAgPSBsaXRlcmFsID8gcyA6IHBuY3Z0KGRzY29weSk7CisgICAgICAgICAgICBpZiAoIXApIHAgPSAiIjsKKyAgICAgICAgICAgIGlmICgqcCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgID0+ICVzXG4iLCBkc2NvcHksIHApOworICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0JhZCBwaG9uZSBudW1iZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogU2F2ZSBESUFMIG9yIHN1Y2Nlc3NmdWwgTE9PS1VQIHN0cmluZyBmb3IgZnV0dXJlIERJQUwgb3IgUkVESUFMICovCisgICAgICAgIC8qIEJ1dCBkb24ndCBzYXZlIHBpZWNlcyBvZiBwYXJ0aWFsIGRpYWwgLi4uICovCisKKyAgICAgICAgZGVidWcoRjEwMSwiRElBTCBzYXZlIGRpYWxudW0gcGFydGlhbCIsIiIscGFydGlhbCk7CisgICAgICAgIGRlYnVnKEYxMDEsIkRJQUwgc2F2ZSBkaWFsbnVtIHByZXZpb3VzIiwiIixwcmV2aW91cyk7CisgICAgICAgIGlmICgoY3ggPT0gWFhESUFMICYmIHBhcnRpYWwgPT0gMCAmJiBwcmV2aW91cyAhPSBESUFfUEFSVCkgfHwKKyAgICAgICAgICAgIChjeCA9PSBYWExPT0sgJiYgbiA+IDApKSB7CisgICAgICAgICAgICBtYWtlc3RyKCZkaWFsbnVtLGRzY29weSk7CisgICAgICAgICAgICBpZiAoIXF1aWV0ICYmIGRzY29weSAmJiAhZGlhbG51bSkKKyAgICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HIC0gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZTogcmVkaWFsIG51bWJlclxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICBpZiAoIXF1aWV0ICYmICFiYWNrZ3JkICYmICFicmFjZXMgLyogJiYgZGlhbGRweSAqLyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChkX25hbWUscykpCisgICAgICAgICAgICAgICAgICBwcmludGYoIiBMb29rdXA6IFwiJXNcIiAtIGV4YWN0IG1hdGNoXG4iLHMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiIExvb2t1cDogXCIlc1wiIC0gdW5pcXVlbHkgbWF0Y2hlcyBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChjeCA9PSBYWExPT0spIHx8CisgICAgICAgICAgICAgICAgKChuID4gMSkgJiYgIXF1aWV0ICYmICFiYWNrZ3JkIC8qICYmIGRpYWxkcHkgKi8gKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiICVkIHRlbGVwaG9uZSBudW1iZXIlc2ZvdW5kIGZvciBcIiVzXCIlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgKG4gPT0gMSkgPyAiICIgOiAicyAiLAorICAgICAgICAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICAgICAgICAobiA+IDApID8gIjoiIDogIi4iCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgczMgPSBnZXRkbmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeyAgIC8qIENvbnZlcnQgKi8KKyAgICAgICAgICAgICAgICBkbl94W2ldID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKGRuY3Z0KGksY3gscHJlZml4LHBvc3RmaXgpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3ggIT0gWFhMT09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWFsc3RhID0gRElBX0RJUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGlhbHNydCAmJiBuID4gMSkgeyAgICAgLyogU29ydCBpbnRvIG9wdGltYWwgb3JkZXIgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbi0xOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gaSsxOyBqIDwgbjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG5feFtqXSA8IGRuX3hbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZG5feFtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbl94W2pdID0gZG5feFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbl94W2ldID0gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gZG5fcFtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbl9wW2pdID0gZG5fcFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbl9wW2ldID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gZG5fcDJbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5fcDJbal0gPSBkbl9wMltpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbl9wMltpXSA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGN4ID09IFhYTE9PSykgfHwKKyAgICAgICAgICAgICAgICAoKG4gPiAxKSAmJiAhcXVpZXQgJiYgIWJhY2tncmQgLyogJiYgZGlhbGRweSAqLyApKSB7CisgICAgICAgICAgICAgICAgaW50IG5uID0gbjsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICBjaGFyICogcDsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgICAgICAgIGlmIChjeCAhPSBYWExPT0spCisgICAgICAgICAgICAgICAgICBpZiAobiA+IDEyKSBubiA9IDEyOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBubjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJTNkLiAlLTEycyAgJS0yMHMgPT4gICUtMjBzICAoJWQpXG4iLGkrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMzLCBkbl9wW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5fcDJbaV0gPyBkbl9wMltpXSA6ICIocHJvY2Vzc2luZyBmYWlsZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRuX3hbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjeCAhPSBYWExPT0sgJiYgbiAhPSBubikKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiQW5kICVkIG1vcmUuLi5cbiIsIG4gLSBubik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7ICAgICAgICAgICAgLyogTm90IGZvdW5kIGluIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgbWFrZXN0cigmKGRuX3BbMF0pLGxpdGVyYWwgPyBzIDogZHNjb3B5KTsKKyAgICAgICAgICAgIG1ha2VzdHIoJmRfbmFtZSxsaXRlcmFsID8gcyA6IGRzY29weSk7CisgICAgICAgICAgICBkbmNvdW50ID0gMTsKKyAgICAgICAgICAgIG4gPSAxOworICAgICAgICAgICAgaWYgKGRuY3Z0KDAsY3gscHJlZml4LHBvc3RmaXgpIDwgMCkgeyAvKiBJbiBjYXNlIHRoZXkgdHlwZWQgYSAqLworICAgICAgICAgICAgICAgIGRpYWxzdGEgPSBESUFfRElSOyAgICAgIC8qIHBvcnRhYmxlLWZvcm1hdCBudW1iZXIgLi4uICovCisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWZuZGVmIE5PTkVUCisjaWZkZWYgTkVUQ09OTgorICAgICAgICAvKiBJdCdzIG5vdCBnb29kIHRoYXQgdGhlIG5ldHdvcmtzIGRpcmVjdG9yeSBkZXBlbmRzIG9uIE5PVC1OT0RJQUwuLiAqLworICAgICAgICBpZiAoY3ggPT0gWFhMT09LICYmIGRzY29weSkgeyAgIC8qIE5ldHdvcmtzIGhlcmUgdG9vLi4uICovCisgICAgICAgICAgICBleHRlcm4gY2hhciAqbmhfcFtdLCAqbmhfcDJbXSwgKm5fbmFtZTsKKyAgICAgICAgICAgIGV4dGVybiBjaGFyICpuaF9weFs0XVtNQVhETlVNUysxXTsKKyAgICAgICAgICAgIG4gPSAtMTsKKyAgICAgICAgICAgIGlmIChubmV0ZGlyID4gMCkgeyAgICAgICAgICAvKiBEbyB3ZSBoYXZlIGEgbmV0d29yayBkaXJlY3Rvcnk/ICovCisgICAgICAgICAgICAgICAgZGlybGluZSA9IDA7CisgICAgICAgICAgICAgICAgbiA9IGx1bmV0KGRzY29weSk7ICAgICAgLyogTG9vayB1cCB3aGF0IHRoZSB1c2VyIHR5cGVkICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiA+IC0xKSB7CisgICAgICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICAgICAgaWYgKG4gPiAwKSAgICAgICAgICAgICAgLyogQSBzdWNjZXNzZnVsIGxvb2t1cCAqLworICAgICAgICAgICAgICAgICAgbHVmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGN4ID09IFhYTE9PSyAmJiBuID09IDApCisgICAgICAgICAgICAgICAgICBwcmludGYoIiBMb29rdXA6IFwiJXNcIiAtIG5vdCBmb3VuZFxuIixkc2NvcHkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgJWQgbmV0d29yayBlbnRyJXMgZm91bmQgZm9yIFwiJXNcIiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGN4ID09IFhYTE9PSyA/ICIgTG9va3VwOiIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuLAorICAgICAgICAgICAgICAgICAgICAgICAgIChuID09IDEpID8gInkiIDogImllcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHNjb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgIChuID4gMCkgPyAiOiIgOiAiLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJTNkLiAlLTEycyA9PiAlLTlzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrMSxuX25hbWUsbmhfcDJbaV0sbmhfcFtpXSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuaF9weFtrXVtpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICVzIixuaF9weFtrXVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIE5FVENPTk4gKi8KKyNlbmRpZiAvKiBOT05FVCAqLworICAgICAgICBpZiAoY3ggPT0gWFhMT09LKQorICAgICAgICAgIHJldHVybihzdWNjZXNzID0gbHVmb3VuZCk7CisgICAgfSAvKiBjeCAhPSBYWEFOU1cgKi8KKworI2lmZGVmIFZNUworICAgIGNvbnJlcygpOyAgICAgICAgICAgICAgICAgICAvKiBTbyBDdHJsLUMvWSB3aWxsIHdvcmsgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKy8qCisgIFNvbWUgbW9kZW1zIGRvIG5vdCByZWFjdCB3ZWxsIHRvIHBhcml0eS4gIEFsc28sIGlmIHdlIGFyZSBkaWFsaW5nIHRocm91Z2ggYQorICBUQ1AvSVAgVEVMTkVUIG1vZGVtIHNlcnZlciwgcGFyaXR5IGNhbiBiZSBmYXRhbGx5IG1pc2ludGVycHJldGVkIGFzIFRFTE5FVAorICBuZWdvdGlhdGlvbnMuCisKKyAgVGhpcyBzaG91bGQgd29yayBldmVuIGlmIHRoZSB1c2VyIGludGVycnVwdHMgdGhlIERJQUwgY29tbWFuZCwgYmVjYXVzZSB0aGUKKyAgRElBTCBtb2R1bGUgaGFzIGl0cyBvd24gaW50ZXJydXB0IGhhbmRsZXIuICBCVVQuLi4gaWYsIGZvciBzb21lIHJlYXNvbiwgYQorICBkaWFsaW5nIGRldmljZSBhY3R1YWxseSAqcmVxdWlyZXMqIHBhcml0eSAoZS5nLiBDQ0lUVCBWLjI1YmlzIHNheXMgdGhhdCBldmVuCisgIHBhcml0eSBzaG91bGQgYmUgdXNlZCksIHRoaXMgbWlnaHQgcHJldmVudCBzdWNjZXNzZnVsIGRpYWxpbmcuICBGb3IgdGhhdAorICByZWFzb24sIHdlIGRvbid0IGRvIHRoaXMgZm9yIFYuMjViaXMgbW9kZW1zLgorKi8KKyAgICBzcGFyaXR5ID0gcGFyaXR5OyAgICAgICAgICAgICAgICAgICAvKiBTYXZlIGN1cnJlbnQgcGFyaXR5ICovCisgICAgaWYgKChkaWFsY2FwYXMgJiBDS0RfVjI1KSA9PSAwKSAgICAgLyogSWYgbm90IFYuMjViaXMuLi4gICovCisgICAgICBwYXJpdHkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHBhcml0eSB0byBOT05FICovCisKKyAgICBmbG93c2F2ZSA9IGZsb3c7CisvKgorICBUaGVzZSBtb2RlbXMgdXNlIHNvbWUga2luZCBvZiBzY3Jld3kgZmxvdyBjb250cm9sIHdoaWxlIGluIGNvbW1hbmQgbW9kZSwKKyAgYW5kIGRvIG5vdCBwcmVzZW50IENUUyBhcyB0aGV5IHNob3VsZC4gIFNvIGlmIFJUUy9DVFMgaXMgc2V0IChvciBldmVuIGlmCisgIGl0IGlzbid0KSBkaXNhYmxlIGZsb3cgY29udHJvbCBkdXJpbmcgZGlhbGluZy4KKyovCisjaWZuZGVmIE1JTklESUFMCisgICAgaWYgKG1kbXR5cCA9PSBuX0FUVDE5MTAgfHwgbWRtdHlwID09IG5fQVRUMTkwMCkgeworICAgICAgICBmbG93ID0gRkxPX05PTkU7ICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgbm90IGVub3VnaCAqLworI2lmZGVmIENLX1RUU0VURkxPVworICAgICAgICB0dHNldGZsb3coRkxPX05PTkUpOyAgICAgICAgICAgIC8qIFJlYWxseSB0dXJuIGl0IG9mZiAqLworI2VuZGlmIC8qIENLX1RUU0VURkxPVyAqLworICAgIH0KKyNlbmRpZiAvKiBNSU5JRElBTCAqLworICAgIGlmICghbmV0d29yaworI2lmZGVmIFROX0NPTVBPUlQKKyAgICAgICAgfHwgaXN0bmNvbXBvcnQoKQorI2VuZGlmIC8qIFROX0NPTVBPUlQgKi8KKyAgICAgICAgICkgeworICAgICAgICBpbnQgeDsKKyAgICAgICAgaWYgKCh4ID0gdHRnbWRtKCkpID4gLTEpIHsKKyAgICAgICAgICAgIGlmICgheCAmJiBtc2dmbGcpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoCisiV0FSTklORyAtIE5vIG1vZGVtIHNpZ25hbHMgZGV0ZWN0ZWQuICBJcyB5b3VyIG1vZGVtIHR1cm5lZCBvbj8gIElmIG5vdCxcblwKK3VzZSBDdHJsLUMgdG8gaW50ZXJydXB0IGRpYWxpbmcsIHR1cm4gb24geW91ciBtb2RlbSwgdGhlbiAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGN4ID09IFhYQU5TVyA/CisgICAgICAgICAgICAgICAgICAgICAgICJBTlNXRVIgYWdhaW4iIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIlJFRElBTCIKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmbG93ID09IEZMT19SVFNDKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoeCAmIEJNX0NUUykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZ2ZsZykKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoCisiV0FSTklORyAtIFNFVCBGTE9XIFJUUy9DVFMgaXMgaW4gZWZmZWN0IGJ1dCBtb2RlbSdzIENUUyBzaWduYWwgaXMgb2ZmLlxuXAorRGlzYWJsaW5nIGZsb3cgY29udHJvbCB0ZW1wb3JhcmlseSAlcy4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ggPT0gWFhBTlNXID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoaWxlIHdhaXRpbmcgZm9yIGNhbGwiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1cmluZyBkaWFsaW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBmbG93ID0gRkxPX05PTkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChjeCA9PSBYWEFOU1cpIHsgICAgICAgICAgICAgICAgIC8qIEFOU1dFUiAqLworICAgICAgICBzdWNjZXNzID0gY2tkaWFsKCIiLDAsMCwxLDApOworICAgICAgICBnb3RvIGRpYWxmaW47CisgICAgfQorCisvKiBFZGl0IDE5MiBhZGRzIHRoZSBhYmlsaXR5IHRvIGRpYWwgcmVwZWF0ZWRseS4gKi8KKworICAgIGkgPSAwOworICAgIGRpYWxjb3VudCA9IDA7CisgICAgZG8geworICAgICAgICBpZiAoaSA+IDApIHByaW50ZigiXG5EaWFsIGF0dGVtcHQgJWQgb2YgJWQuLi5cbiIsIGkrMSwgeHJldHJpZXMpOworICAgICAgICBkaWFsY291bnQgPSBpKzE7CisgICAgICAgIHN1Y2Nlc3MgPSAwOworICAgICAgICAvKiBBbmQgdGhlIGFiaWxpdHkgdG8gZGlhbCBhbHRlcm5hdGUgbnVtYmVycy4gKi8KKyAgICAgICAgLyogTG9vcCB0byBkaWFsIGVhY2ggaW4gYSBsaXN0IG9mIG51bWJlcnMgZm9yIHRoZSBzYW1lIG5hbWUuLi4gKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG4gJiYgIXN1Y2Nlc3M7IGorKykgeyAvKiB1bnRpbCBvbmUgYW5zd2Vycy4gKi8KKyAgICAgICAgICAgIHMgPSBkbl9wMltqXTsgICAgICAgICAgICAgICAvKiBOZXh0IG51bWJlciBpbiBsaXN0ICovCisgICAgICAgICAgICBpZiAoZG5feFtqXSA+PSBkaWFscnN0cikgeyAgLyogRGlhbCByZXN0cmljdGlvbiAqLworICAgICAgICAgICAgICAgIHByaW50ZigiUmVzdHJpY3RlZDogJXMsIHNraXBwaW5nLi4uXG4iLGRuX3Bbal0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeHJlZGlhbCA9IChpID09IDAgJiYgaiA9PSAwKSA/IDAgOiAxOworICAgICAgICAgICAgaWYgKCFzKSBzID0gZG5fcFtqXTsKKworI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgc2F2ID0gczsKKyAgICAgICAgICAgIHAgPSB4ZGlhbChzKTsgICAgICAgICAgICAgICAvKiBBcHBseSBESUFMIG1hY3JvIG5vdyAqLworICAgICAgICAgICAgaWYgKHApIHMgPSBwOworI2VuZGlmIC8qIE5PU1BMICovCisKKwkgICAgLyogRGlhbCBjb25maXJtYXRpb24gKi8KKwkgICAgLyogTk9URTogdGhlIHVxX3h4eCgpIGNhbGxzIGFsbG93IGZvciBhIEdVSSBkaWFsb2cgKi8KKworICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBkaWFsY25mKSB7CisJCWNoYXIgbXNnYnVmWzEyOF07CisJCWNrbWFrbXNnKG1zZ2J1ZiwxMjgsIkRpYWxpbmcgIixzLE5VTEwsTlVMTCk7CisJCXggPSB1cV9vayhtc2didWYsIklzIHRoaXMgbnVtYmVyIGNvcnJlY3Q/ICIsMyxOVUxMLDApOworICAgICAgICAgICAgICAgIGlmICgheCkgeworCisjaWZuZGVmIENPTU1FTlQKKwkJICAgIHggPSB1cV90eHQoCQkvKiBBbGxvdyBHVUkgZGlhbG9nICovCisjaWZkZWYgT1MyCisiIFBsZWFzZSBlbnRlciB0aGUgY29ycmVjdCBudW1iZXIsXHJcbiBvciBwcmVzcyBFbnRlciB0byBza2lwLiIsCisjZWxzZQorIiBQbGVhc2UgZW50ZXIgdGhlIGNvcnJlY3QgbnVtYmVyLFxyXG4gb3IgcHJlc3MgUmV0dXJuIHRvIHNraXAuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3JyZWN0ZWQgcGhvbmUgbnVtYmVyOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisJCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICBhdG1idWYsCisJCQkgICAgICAgQVRNQkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1VRX1RJTUVPVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCQkgICAgaWYgKHggJiYgYXRtYnVmWzBdKSB7IC8qIFRoZXkgZ2F2ZSBhIG5ldyBvbmUgKi8KKwkJCXMgPSBhdG1idWY7CisJCQltYWtlc3RyKCYoZG5fcDJbal0pLCBzKTsKKwkJICAgIH0JCQkKKworI2Vsc2UgIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIENLX1JFQ0FMTAorICAgICAgICAgICAgICAgICAgICBleHRlcm4gaW50IG9uX3JlY2FsbDsKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyAgICAgICAgICAgICAgICAgICAgY21zYXZwKHBzYXZlLFBST01QVEwpOworICAgICAgICAgICAgICAgICAgICBjbXNldHAoCisjaWZkZWYgT1MyCisiIFBsZWFzZSBlbnRlciB0aGUgY29ycmVjdCBudW1iZXIsXHJcbiBvciBwcmVzcyBFbnRlciB0byBza2lwOiAiCisjZWxzZQorIiBQbGVhc2UgZW50ZXIgdGhlIGNvcnJlY3QgbnVtYmVyLFxyXG4gb3IgcHJlc3MgUmV0dXJuIHRvIHNraXA6ICIKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIGNtaW5pKGNreGVjaCk7CisgICAgICAgICAgICAgICAgICAgIHggPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBmbGFnKSBwcm9tcHQoTlVMTCk7CisjaWZkZWYgQ0tfUkVDQUxMCisgICAgICAgICAgICAgICAgICAgIG9uX3JlY2FsbCA9IDA7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisgICAgICAgICAgICAgICAgICAgIHkgPSBjbWRncXVvKCk7CisgICAgICAgICAgICAgICAgICAgIGNtZHNxdW8oMCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGNtdHh0KCJDb3JyZWN0ZWQgcGhvbmUgbnVtYmVyIiwiIiwmcyxOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtcmVzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbnQpIHN0cmxlbihzKSA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtc2V0cChwc2F2ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCYoZG5fcDJbal0pLCBzKTsKKyAgICAgICAgICAgICAgICAgICAgY21kc3F1byh5KTsKKyAgICAgICAgICAgICAgICAgICAgY21zZXRwKHBzYXZlKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRpYWx0ZXN0KSB7ICAgICAgICAgICAgIC8qIEp1c3QgdGVzdGluZyAqLworICAgICAgICAgICAgICAgIGlmIChpICsgaiA9PSAwKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblRFU1RJTkcuLi5cbiIpOworICAgICAgICAgICAgICAgIGlmIChkaWFsbWFjKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgTnVtYmVyOiBcIiVzXCIgPT4gXCIlc1wiXG4iLHNhdixzKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBwcmludGYoIiBOdW1iZXI6IFwiJXNcIlxuIixzKTsKKyAgICAgICAgICAgICAgICBkaWFsc3RhID0gRElBX0JVU1k7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoYXQgfD0gV19ESUFMSU5HOworICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBja2RpYWwocyxpLGoscGFydGlhbCA/IDMgOiAwLCB4cmVkaWFsKTsgLyogRGlhbCBpdCAqLworICAgICAgICAgICAgICAgIHdoYXQgJj0gfihXX0RJQUxJTkcpOworICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbHN0YSA8IDggfHwgIC8qIEJyZWFrIG91dCBpZiB1bnJlY292ZXJhYmxlIGVycm9yICovCisgICAgICAgICAgICAgICAgICAgICAgICBkaWFsc3RhICA9PSBESUFfSU5UUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZGlhbHN0YSAgPT0gRElBX0VSUiAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID09IERJQV9QQVJUCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzdWNjZXNzKSAgICAgICAgICAgICAgICAgICAgLyogU3VjY2VlZGVkLCBsZWF2ZSB0aGUgb3V0ZXIgbG9vcCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoZGlhbHN0YSA8IDggfHwgICAgICAgICAgICAgIC8qIEJyZWFrIG91dCBpZiB1bnJlY292ZXJhYmxlIGVycm9yICovCisgICAgICAgICAgICBkaWFsc3RhID09IERJQV9JTlRSIHx8ICAgICAgLyogSW50ZXJydXB0ZWQgKi8KKyAgICAgICAgICAgIGRpYWxzdGEgPT0gRElBX05PRFQgfHwgICAgICAvKiBObyBkaWFsdG9uZSAqLworICAgICAgICAgICAgZGlhbHN0YSA9PSBESUFfTk9BQyB8fCAgICAgIC8qIEFjY2VzcyBmb3JiaWRkZW4gKi8KKyAgICAgICAgICAgIGRpYWxzdGEgPT0gRElBX0JMQ0sgfHwgICAgICAvKiBCbGFja2xpc3RlZCAqLworICAgICAgICAgICAgZGlhbHN0YSA9PSBESUFfRElSICB8fCAgICAgIC8qIERpYWxpbmcgZGlyZWN0b3J5IGVycm9yICovCisgICAgICAgICAgICBkaWFsc3RhID09IERJQV9FUlIgIHx8ICAgICAgLyogTW9kZW0gY29tbWFuZCBlcnJvciAqLworICAgICAgICAgICAgcHJldmlvdXMgPT0gRElBX1BBUlQpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmICgrK2kgPj0geHJldHJpZXMpICAgICAgICAgICAgLyogQnJlYWsgb3V0IGlmIHRvbyBtYW55IHRyaWVzICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmICghYmFja2dyZCAmJiAhcXVpZXQpIHsKKyAgICAgICAgICAgIGlmIChkaWFsaW50ID4gNSkKKyAgICAgICAgICAgICAgcHJpbnRmKAorIlxuV2lsbCByZWRpYWwgaW4gJWQgc2Vjb25kJXMtIHByZXNzIGFueSBrZXkgdG8gcmVkaWFsIGltbWVkaWF0ZWx5LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGRpYWxpbnQsCisgICAgICAgICAgICAgICAgICAgICBkaWFsaW50ID09IDEgPyAiICIgOiAicyAiCisgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgcHJpbnRmKCJDdHJsLUMgdG8gY2FuY2VsLi4uXG4iKTsKKyAgICAgICAgfQorICAgICAgICB4ID0gZGlhbGludDsgICAgICAgICAgICAgICAgICAgIC8qIFJlZGlhbCBpbnRlcnZhbCAqLworICAgICAgICB3aGlsZSAoeC0tID4gMCkgeworICAgICAgICAgICAgaWYgKCh5ID0gY29uY2hrKCkpID4gMCkgeyAgIC8qIERpZCB0aGV5IHR5cGUgc29tZXRoaW5nPyAqLworICAgICAgICAgICAgICAgIHdoaWxlICh5LS0pIGNvbmluYygwKTsgIC8qIFllcywgYWJzb3JiIGl0ICovCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogQW5kIHdha2UgdXAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwKDEpOyAgICAgICAgICAgICAgICAgICAvKiBObyBpbnRlcnJ1cHQsIHNsZWVwIGEgc2VjICovCisgICAgICAgIH0KKyAgICB9IHdoaWxlICghc3VjY2Vzcyk7CisKKyAgZGlhbGZpbjoKKworICAgIGlmIChjeCAhPSBYWExPT0spIHsKKyAgICAgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICAgIGJsZWVwKChzaG9ydCkgQlBfRkFJTCk7CisgICAgICAgIGVsc2UgaWYgKCFxdWlldCkKKyAgICAgICAgICBibGVlcCgoc2hvcnQpIEJQX05PVEUpOworI2lmZGVmIE9TMgorICAgICAgICBzZXRpbnQoKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpeCBPUy8yIGludGVycnVwdHMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgaWYgKHNwYXJpdHkgPiAtMSkKKyAgICAgICAgICBwYXJpdHkgPSBzcGFyaXR5OyAgICAgICAgICAgICAvKiBSZXN0b3JlIHBhcml0eSBpZiB3ZSBzYXZlZCBpdCAqLworICAgICAgICBmbG93ID0gZmxvd3NhdmU7CisjaWZkZWYgT1MyCisgICAgICAgIHR0cmVzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBESUFMIGRldmljZSAqLworI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIFZNUworICAgICAgICBjb25jYigoY2hhcillc2NhcGUpOyAgICAgICAgICAgIC8qIFJlc3RvcmUgY29uc29sZSAqLworI2VuZGlmIC8qIFZNUyAqLworI2lmZGVmIE9TMgorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBzZXNzaW9uIHRpdGxlICovCisgICAgICAgICAgICBjaGFyICogcCwgbmFtZVs3Ml07ICAgICAgICAgLyogaW4gd2luZG93IGxpc3QuICovCisgICAgICAgICAgICBjaGFyICogcTsKKyAgICAgICAgICAgIGlmIChjeCA9PSBYWEFOU1cpIHsKKyAgICAgICAgICAgICAgICBxID0gIkluY29taW5nIGNhbGwiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZF9uYW1lKQorICAgICAgICAgICAgICAgICAgcSA9IGRfbmFtZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChkaWFsbnVtKQorICAgICAgICAgICAgICAgICAgcSA9IGRpYWxudW07CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHRuYW1lWzBdKQorICAgICAgICAgICAgICAgICAgcSA9IHR0bmFtZTsKKyAgICAgICAgICAgICAgICBlbHNlIHEgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAgPSBuYW1lOworICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICBzdHJuY3B5KG5hbWUscSw0OCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKCpwKSB7ICAgICAgICAgICAgLyogVXBwZXJjYXNlIGl0IGZvciBlbXBoYXNpcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzbG93ZXIoKnApKQorICAgICAgICAgICAgICAgICAgICAgICpwID0gdG91cHBlcigqcCk7CisgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgbmFtZVswXSA9IE5VTCA7CisgICAgICAgICAgICBvczJzZXR0aXRsZSgoY2hhciAqKSBuYW1lLCBUUlVFKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIE9TMiAqLworICAgIH0KKyAgICBpZiAoY3ggIT0gWFhMT09LKSB7CisgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICBpZiAocmVsaWFibGUgPT0gU0VUX0FVVE8pIHsgLyogSXQncyBub3QgYSByZWxpYWJsZSBjb25uZWN0aW9uLiAqLworICAgICAgICAgICAgICAgIHJlbGlhYmxlID0gU0VUX09GRjsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkb2RpYWwgcmVsaWFibGUiLCIiLHJlbGlhYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyNpZm5kZWYgTk9ISU5UUworICAgICAgICAgICAgZXh0ZXJuIGludCBoaW50czsKKyAgICAgICAgICAgIGlmIChoaW50cyAmJiAhcXVpZXQgJiYgZGlhbHN0YSAhPSA5KSB7IC8qIDkgPT0gVXNlciBpbnRlcnJ1cHRlZCAqLworICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgZGlhbG1odSwgZGlhbGhuZywgZGlhbGRweTsKKyAgICAgICAgICAgICAgICBleHRlcm4gY2hhciAqIGRpYWxtc2dbXTsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJESUFMLWNsYXNzIGNvbW1hbmQgZmFpbGVkLlxuIik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJNb2RlbSB0eXBlOiAgJXNcbiIsIGdtZG10eXAoKSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJEZXZpY2U6ICAgICAgJXNcbiIsIHR0bmFtZSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJTcGVlZDogICAgICAgJWxkXG4iLCBzcGVlZCk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJEaWFsIHN0YXR1czogJWQiLGRpYWxzdGEpOworICAgICAgICAgICAgICAgIGlmIChkaWFsc3RhIDwgMzUgJiYgZGlhbG1zZ1tkaWFsc3RhXSkKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiIFslc10iLGRpYWxtc2dbZGlhbHN0YV0pOworICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlhbHN0YSA9PSBESUFfVElNTyB8fAorICAgICAgICAgICAgICAgICAgICBkaWFsc3RhID09IERJQV9OUkRZIHx8CisgICAgICAgICAgICAgICAgICAgKGRpYWxzdGEgPiAxMyAmJiBkaWFsc3RhICE9IERJQV9CVVNZICYmIGRpYWxzdGEgIT0gRElBX05PQU4pCisgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRpYWxzdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIERJQV9USU1POgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorIiAuIFNFVCBESUFMIFRJTUVPVVQgdG8gYSBncmVhdGVyIHZhbHVlIGFuZCB0cnkgYWdhaW4uXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElBX05SU1A6CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESUFfTlJEWToKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIERJQV9OT0lOOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorIiAuIElzIHRoZSBtb2RlbSB0dXJuZWQgb24/XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyIgLiBBcmUgeW91IHVzaW5nIHRoZSByaWdodCBjb21tdW5pY2F0aW9uIHBvcnQ/XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElBX05PRFQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoCisiIC4gSXMgdGhlIG1vZGVtIGNvbm5lY3RlZCB0byB0aGUgdGVsZXBob25lIGxpbmU/XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobWRtdHlwID09IG5fR0VORVJJQykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorIiAuIFBsZWFzZSBjaG9vc2UgYSBzcGVjaWZpYyBtb2RlbSB0eXBlIHdpdGggU0VUIE1PREVNIFRZUEUgYW5kIHRyeSBhZ2Fpbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorIiAgICBTRVQgTU9ERU0gVFlQRSA/IHRvIHNlZSB0aGUgbGlzdCBvZiBrbm93biBtb2RlbSB0eXBlcy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorIiAuIEFyZSB5b3Ugc3VyZSB5b3UgaGF2ZSBjaG9zZW4gdGhlIGFwcHJvcHJpYXRlIG1vZGVtIHR5cGU/XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3BlZWQgPiAxOTIwMEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyIgLiBNYXliZSB0aGUgaW50ZXJmYWNlIHNwZWVkICglbGQpIGlzIHRvbyBmYXN0OlxuIiwgc3BlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorIiAgICBTRVQgU1BFRUQgdG8gYSBsb3dlciBzcGVlZCBhbmQgdHJ5IGFnYWluLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoCisiICAgIFNFVCBTUEVFRCA/IHRvIHNlZSB0aGUgbGlzdCBvZiB2YWxpZCBzcGVlZHMuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbGhuZykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxtaHUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyIgLiBTRVQgTU9ERU0gSEFOR1VQLU1FVEhPRCBSUzIzMiBhbmQgdHJ5IGFnYWluLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorIiAuIFNFVCBNT0RFTSBIQU5HVVAtTUVUSE9EIE1PREVNLUNPTU1BTkQgYW5kIHRyeSBhZ2Fpbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoCisiIC4gSWYgdGhhdCBkb2Vzbid0IHdvcmssIHRyeSBhZ2FpbiB3aXRoIFNFVCBESUFMIEhBTkdVUCBPRkYuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyIgLiBHaXZlIGEgSEFOR1VQIG9yIFNFVCBESUFMIEhBTkdVUCBPTiBjb21tYW5kIGFuZCB0cnkgYWdhaW4uXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWRpYWxkcHkpCisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorIiAuIFVzZSBTRVQgRElBTCBESVNQTEFZIE9OIHRvIHdhdGNoIHRoZSBkaWFsb2cgYmV0d2VlbiBLZXJtaXQgYW5kIG1vZGVtLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyNpZm5kZWYgTk9TSE9XCisgICAgICAgICAgICAgICAgcHJpbnRmKAorIiAuIFNIT1cgQ09NTVVOSUNBVElPTlMsIFNIT1cgTU9ERU0sIFNIT1cgRElBTCB0byBzZWUgY3VycmVudCBzZXR0aW5ncy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBOT1NIT1cgKi8KKworI2lmbmRlZiBOT0hFTFAKKyAgICAgICAgICAgICAgICBwcmludGYoCisiIC4gSEVMUCBTRVQgTU9ERU0sIEhFTFAgU0VUIERJQUwsIGFuZCBIRUxQIERJQUwgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iCisgICAgICAgICAgICAgICAgICAgICAgICk7CisjZW5kaWYgLyogTk9IRUxQICovCisgICAgICAgICAgICAgICAgcHJpbnRmKCIoVXNlIFNFVCBISU5UUyBPRkYgdG8gc3VwcHJlc3MgZnV0dXJlIGhpbnRzLilcbiIpOworICAgICAgICAgICAgICAgIHByaW50ZigiKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4iKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT0hJTlRTICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKHN1Y2Nlc3MpOworfQorI2VuZGlmIC8qIE5PRElBTCAqLworCisvKiAgRCBPIFQgWSBQIEUgIC0tICBUeXBlIChkaXNwbGF5KSBhIGZpbGUgd2l0aCB2YXJpb3VzIG9wdGlvbnMuLi4gICovCisKKyNpZmRlZiBCSUdCVUZPSworI2RlZmluZSBUWVBCVUZMIDE2Mzg0CisjZWxzZQorI2RlZmluZSBUWVBCVUZMIDI1NgorI2VuZGlmIC8qIEJJR0JVRk9LICovCisKK2ludCB0eXBfbGluZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBcdih0eV9sbikgKi8KK2ludCB0eXBfbXRjaHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBcdih0eV9sbSkgKi8KK3N0YXRpYyBpbnQgdHlwX2ludCA9IDA7ICAgICAgICAgICAgICAgICAvKiBGbGFnIGlmIFRZUEUgaW50ZXJydXB0ZWQgKi8KKworI2lmZGVmIFVOSUNPREUKK2V4dGVybiBpbnQgZmNoYXJzZXQsIGZpbGVvcmRlciwgYnl0ZW9yZGVyLCB1Y3NvcmRlcjsKKyNkZWZpbmUgVFlQWEJVRkwgVFlQQlVGTCtUWVBCVUZMK1RZUEJVRkwrNAorc3RhdGljIGNoYXIgKiBtcCA9IE5VTEw7CitzdGF0aWMgY2hhciAqIG1idWYgPSBOVUxMOworc3RhdGljIGxvbmcgeG4gPSAwTDsKKworc3RhdGljIGludAorI2lmZGVmIENLX0FOU0lDCitzdG9yZWNoYXIoY2hhciBjKQorI2Vsc2UKK3N0b3JlY2hhcihjKSBjaGFyIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpZiAoIW1wKSByZXR1cm4oLTEpOworICAgIGlmICgrK3huID4gVFlQWEJVRkwpCisgICAgICByZXR1cm4oLTEpOworICAgIGRlYnVnKEYxMTEsInN0b3JlY2hhciB4biIsY2tpdG9hKChpbnQpYykseG4pOworICAgICptcCsrID0gYzsKKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogVU5JQ09ERSAqLworCitzdGF0aWMgRklMRSAqIG9mcCA9IE5VTEw7ICAgICAgICAgICAgICAgLyogRm9yIC9PVVRQVVQ6IGZpbGUgKi8KKworc3RhdGljIGludAordHlwZWxpbmUoYnVmLGxlbixvdXRjcyxvZnApIGNoYXIgKiBidWY7IGludCBsZW4sIG91dGNzOyBGSUxFICogb2ZwOyB7CisgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICBkZWJ1ZyhGMDExLCJ0eXBlbGluZSBidWYiLGJ1ZixsZW4pOworICAgIC8qIGRlYnVnKEYxMDEsInR5cGVsaW5lIG91dGNzIiwiIixvdXRjcyk7ICovCisKKyNpZmRlZiBPUzIKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIFVOSUNPREUKKyAgICAvKiBJbiBLOTUgb25seSwgdGhlIGJ1ZmZlciBpcyBndWFyYW50ZWVkIHRvIGJlIGluIFVDUy0yIGlmIG91dGNzID49IDAuICovCisgICAgLyogTGVuIGlzIGl0cyBsZW5ndGggaW4gYnl0ZXMuICBUaGVyZSBpcyBubyBsaW5lIHRlcm1pbmF0b3IuICovCisgICAgLyogb3V0Y3MgaXMgdGhlIGZpbGUgY2hhcmFjdGVyLXNldCBudW1iZXIgKEZDX3h4eCkgb2YgdGhlIHRhcmdldCBzZXQgKi8KKyAgICAvKiB0aGF0IHdhcyByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuICovCisgICAgaWYgKCFpbnNlcnZlciAmJiAhazk1c3Rkb3V0KSB7CisgICAgICAgIGV4dGVybiBpbnQgd2hlcmV4W10sIHdoZXJleVtdOworICAgICAgICBleHRlcm4gdW5zaWduZWQgY2hhciBjb2xvcmNtZDsKKworICAgICAgICBWc2NybldydFVDUzJTdHJBdHQoIFZDTUQsICh1bnNpZ25lZCBzaG9ydCAqKWJ1ZiwgbGVuLzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZXlbVkNNRF0sIHdoZXJleFtWQ01EXSwgJmNvbG9yY21kKTsKKyAgICAgICAgcHJpbnRmKCJcclxuIik7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogVU5JQ09ERSAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworLyogSW4gVW5peCwgVk1TLCBldGMsIHRoZSBsaW5lIGhhcyBhbHJlYWR5IGJlZW4gY29udmVydGVkIHRvIHRoZSBkZXNpcmVkICAqLworLyogY2hhcmFjdGVyLXNldCwgaWYgb25lIHdhcyBnaXZlbi4gIE9SLi4uIG9uIGFsbCBwbGF0Zm9ybXMsIGluY2x1ZGluZyBpbiAqLworLyogSzk1LCB3ZSBkb24ndCBrbm93IHRoZSBjaGFyYWN0ZXIgc2V0LiAgSW4gZWl0aGVyIGNhc2Ugd2UgZHVtcCB0aGUgbGluZSAqLworLyogYnl0ZSBieSBieXRlIGluIGNhc2UgaXQgY29udGFpbnMgTlVMcyAocHJpbnRmKCkgd291bGQgdHJ1bmNhdGUpLiAqLworCisjaWZkZWYgQ09NTUVOVAorICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgIHB1dGNoYXIoYnVmW2ldKTsKKyNlbHNlCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGlmIChvZnAgPT0gc3Rkb3V0KSB7CisgICAgICAgICAgICBwdXRjaGFyKGJ1ZltpXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdXRjKGJ1ZltpXSxvZnApOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpIHsKKyNpZmRlZiBVTklDT0RFCisgICAgICAgIGlmIChvdXRjcyA9PSBGQ19VQ1MyKSB7CisgICAgICAgICAgICBpZiAob2ZwID09IHN0ZG91dCkgeworICAgICAgICAgICAgICAgIHB1dGNoYXIoTlVMKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHV0YyhOVUwsb2ZwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyAgICAgICAgaWYgKG9mcCA9PSBzdGRvdXQpIHsKKyAgICAgICAgICAgIHB1dGNoYXIoJ1xyJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdXRjKCdccicsb2ZwKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisjaWZkZWYgVU5JQ09ERQorICAgIGlmIChvdXRjcyA9PSBGQ19VQ1MyKSB7CisgICAgICAgIGlmIChvZnAgPT0gc3Rkb3V0KSB7CisgICAgICAgICAgICBwdXRjaGFyKE5VTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdXRjKE5VTCxvZnApOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyAgICBpZiAob2ZwID09IHN0ZG91dCkgeworICAgICAgICBwdXRjaGFyKCdcbicpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB1dGMoJ1xuJyxvZnApOworICAgIH0KKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdHJhbnNsYXRlZCBsaW5lICovCit0eXBlZ2V0bGluZShpbmNzLCBvdXRjcywgYnVmLCBuKSBpbnQgaW5jcywgb3V0Y3MsIG47IGNoYXIgKiBidWY7IHsKKyAgICBpbnQgeCA9IDAsIGMwLCBjMSwgbGVuID0gMCwgY291bnQgPSAwLCBlb2YgPSAwLCB4bGF0ZSA9IDA7CisjaWZkZWYgVU5JQ09ERQorICAgIGludCB4eG4gPSAtMTsKKyAgICBpbnQgeXluID0gLTk7CisgICAgeG4gPSAwTDsKKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZyAmJiB0eXBfbGluZXMgPT0gMCkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJ0eXBlZ2V0bGluZSBpbmNzIiwiIixpbmNzKTsKKyAgICAgICAgZGVidWcoRjEwMSwidHlwZWdldGxpbmUgb3V0Y3MiLCIiLG91dGNzKTsKKyAgICAgICAgZGVidWcoRjEwMSwidHlwZWdldGxpbmUgZmVvbCIsIiIsZmVvbCk7CisgICAgICAgIGRlYnVnKEYxMDEsInR5cGVnZXRsaW5lIGJ5dGVvcmRlciIsIiIsYnl0ZW9yZGVyKTsKKyAgICAgICAgZGVidWcoRjEwMSwidHlwZWdldGxpbmUgdWNzb3JkZXIgIiwiIix1Y3NvcmRlcik7CisgICAgICAgIGRlYnVnKEYxMTEsInR5cGVnZXRsaW5lIGZpbGVvcmRlciIsIjEiLGZpbGVvcmRlcik7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyAgICBpZiAoaW5jcyA8IDApICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG91bGRuJ3QgaGFwcGVuICovCisgICAgICByZXR1cm4oLTIpOworCisgICAgaWYgKG91dGNzID09IC0xKSAgICAgICAgICAgICAgICAgICAgLyogQ2FuIGhhcHBlbiAqLworICAgICAgb3V0Y3MgPSBpbmNzOworCisgICAgaWYgKGluY3MgIT0gb3V0Y3MgfHwgaW5jcyA9PSBGQ19VQ1MyKSB7IC8qIFNlZSBpZiB3ZSBzaG91bGQgdHJhbnNsYXRlICovCisgICAgICAgIHhsYXRlID0gMTsKKyAgICAgICAgaWYgKCFtYnVmKSB7ICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBidWZmZXIgaWYgbm90IGFsbG9jYXRlZCAqLworICAgICAgICAgICAgbWJ1ZiA9IChjaGFyICopbWFsbG9jKFRZUFhCVUZMKzEpOyAvKiB5ZXQgKi8KKyAgICAgICAgICAgIGlmICghbWJ1ZikgeworICAgICAgICAgICAgICAgIHByaW50ZigiV0FSTklORzogVHJhbnNsYXRpb24gYnVmZmVyIGFsbG9jYXRpb24gZmFpbHVyZS5cbiIpOworICAgICAgICAgICAgICAgIHByaW50ZigiVHJhbnNsYXRpb24gd2lsbCBiZSBza2lwcGVkLi4uXG4iKTsKKyAgICAgICAgICAgICAgICB4bGF0ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHhsYXRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNsYXRpbmcuLi4gKi8KKyAgICAgICAgbXAgPSBtYnVmOyAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB3b3JraW5nIGJ1ZmZlciBwb2ludGVyICovCisvKgorICBIZXJlIHdlIGNhbGwgeGduYnl0ZSgpIGluIGEgbG9vcCwgaGF2aW5nIGl0IHJldHVybiBVQ1MtMiBieXRlcy4gIEluIEs5NSwgd2UKKyAgdXNlIFVDUy0yIGRpcmVjdGx5LiAgRWxzZXdoZXJlLCB3ZSBmZWVkIHRoZSBVQ1MtMiBieXRlcyBpbnRvIHhwbmJ5dGUoKSB0bworICBjb252ZXJ0IHRoZW0gdG8gdGhlIGRlc2lyZWQgdGFyZ2V0IGNoYXJhY3RlciBzZXQuICBCdXQgc2luY2Ugd2UgYXJlIHVzaW5nCisgIFVDUy0yLCB3ZSBoYXZlIHNldmVyYWwgc291cmNlcyBmb3IgY29uZnVzaW9uOiAoMSkgeGduYnl0ZSgpIG1pZ2h0IHJldHVybiBpbgorICBMRSBvciBCRSBieXRlIG9yZGVyLCB3aXRoIG5vIGV4cGxpY2l0IGluZGljYXRpb24gb2Ygd2hhdCB0aGUgb3JkZXIgaXM7IGJ1dAorICAoMikgeHBuYnl0ZSgpIHdhbnRzIEJFOyBidXQgKDMpIFdpbmRvd3Mgd2FudHMgTEUuCisqLworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgaWYgKHR5cF9pbnQpICAgICAgICAgICAgICAgIC8qIFF1aXQgaWYgaW50ZXJydXB0ZWQgKi8KKyAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgYzAgPSB4Z25ieXRlKEZDX1VDUzIsaW5jcyxOVUxMKTsgLyogQ29udmVydCB0byBVQ1MtMiAqLworICAgICAgICAgICAgZGVidWcoRjAwMCwidHlwZWdldGxpbmUgYzAiLCIiLGMwKTsKKyAgICAgICAgICAgIGlmIChjMCA8IDApIHsgICAgICAgICAgICAgICAvKiBFT0YgKi8KKyAgICAgICAgICAgICAgICBlb2YrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMxID0geGduYnl0ZShGQ19VQ1MyLGluY3MsTlVMTCk7IC8qIENvbnZlcnQgdG8gVUNTLTIgKi8KKyAgICAgICAgICAgIGRlYnVnKEYwMDAsInR5cGVnZXRsaW5lIGMxIiwiIixjMSk7CisgICAgICAgICAgICBpZiAoYzEgPCAwKSB7ICAgICAgICAgICAgICAgLyogRU9GICovCisgICAgICAgICAgICAgICAgZW9mKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGlmIChkZWJsb2cgJiYgdHlwX2xpbmVzID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgLyogQ2hlY2sgZmlsZW9yZGVyIGFmdGVyIEJPTSAqLworICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwidHlwZWdldGxpbmUgZmlsZW9yZGVyIiwiMiIsZmlsZW9yZGVyKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgQ09NTUVOVAorLyogTm93IHdlIGhhdmUgdGhlIHR3byBVQ1MtMiBieXRlcy4gIFdoaWNoIG9yZGVyIGFyZSB0aGV5IGluPyAqLworCisgICAgICAgICAgICBpZiAoZmlsZW9yZGVyID4gMCkgeyAgICAgICAgLyogTGl0dGxlIEVuZGlhbiAqLworICAgICAgICAgICAgICAgIGludCB0OyAgICAgICAgICAgICAgICAgIC8qIFNvIHN3YXAgdGhlbSAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsInR5cGVnZXRsaW5lIHN3YXBwaW5nIiwiIiwwKTsKKyAgICAgICAgICAgICAgICB0ID0gYzE7CisgICAgICAgICAgICAgICAgYzEgPSBjMDsKKyAgICAgICAgICAgICAgICBjMCA9IHQ7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgaWYgKGMwID09IDAgJiYgYzEgPT0gMHgwRCkgIC8qIE5vdyBzZWUgaWYgd2UgaGF2ZSBFT0wgKi8KKyAgICAgICAgICAgICAgeXluID0geG47CisKKyAgICAgICAgICAgIGlmIChjMCA9PSAwICYmIGMxID09IDB4MEEpICAvKiBOb3cgc2VlIGlmIHdlIGhhdmUgRU9MICovCisgICAgICAgICAgICAgIHh4biA9IHhuOworCisgICAgICAgICAgICBjb3VudCsrOyAgICAgICAgICAgICAgICAgICAgLyogQ291bnQgYnl0ZSAqLworCisvKiBHaXZlIHRoZSB0d28gYnl0ZXMgdG8geHBuYnl0ZSgpIGluIEJFIG9yZGVyICovCisKKyAgICAgICAgICAgIGlmICgoeCA9IHhwbmJ5dGUoYzAsVENfVUNTMixvdXRjcyxzdG9yZWNoYXIpKSA8IDApIHJldHVybigtMSk7CisgICAgICAgICAgICBpZiAoKHggPSB4cG5ieXRlKGMxLFRDX1VDUzIsb3V0Y3Msc3RvcmVjaGFyKSkgPCAwKSByZXR1cm4oLTEpOworCisgICAgICAgICAgICBpZiAoeHhuID4gLTEpIHsgICAgICAgICAgICAgLyogSGF2ZSBlbmQgb2YgbGluZT8gKi8KKyAgICAgICAgICAgICAgICB4biA9IHh4bjsKKyAgICAgICAgICAgICAgICBpZiAoeXluID09IHh4biAtIDIpICAgICAvKiBBZGp1c3QgZm9yIENSTEYgKi8KKyAgICAgICAgICAgICAgICAgIHhuID0geXluOworICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIEFuZCBicmVhayBvdXQgb2YgbG9vcC4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtYnVmW3huXSA9IE5VTDsKKyAgICAgICAgaWYgKHhuID4gbikgICAgICAgICAgICAgICAgICAgICAvKiBDYW4gdHJ1bmNhdGUgaGVyZS4uLiAqLworICAgICAgICAgIHhuID0gbjsKKyAgICAgICAgbWVtY3B5KGJ1ZixtYnVmLHhuKTsKKyAgICAgICAgZGVidWcoRjAxMSwidHlwZWdldGxpbmUgeGxhdGUiLGJ1Zix4bik7CisgICAgICAgIHJldHVybigoZW9mICYmICh4biA9PSAwKSkgPyAtMSA6IHhuKTsKKyAgICB9CisjZW5kaWYgLyogVU5JQ09ERSAqLworI2lmZGVmIENPTU1FTlQKKyAgICAvKiBXZSBjYW4ndCB1c2UgdGhpcyBiZWNhdXNlLCBzdHVwaWRseSwgenNpbmwoKSBkb2Vzbid0IHJldHVybiBhIGxlbmd0aC4gKi8KKyAgICAvKiBJdCBjb3VsZCBiZSBjaGFuZ2VkIGJ1dCB0aGVuIHdlJ2QgaGF2ZSB0byBjaGFuZ2UgYWxsIGNrP2Zpby5jIG1vZHVsZXMgKi8KKyAgICB4ID0genNpbmwoWklGSUxFLGJ1ZixuKTsKKyNlbHNlCisgICAgLyogU28gaW5zdGVhZCwgd2UgY29weSB6c2lubCgpIHRvIGhlcmUuLi4gKi8KKyAgICAvKiBCdXQgbm90ZTogVGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBoYW5kbGUgVUNTLTIgYWxpZ25tZW50IHByb3Blcmx5OyAgKi8KKyAgICAvKiB0aGF0J3Mgd2hhdCB0aGUgY29kZSBpbiB0aGUgZmlyc3Qgc2VjdGlvbiBvZiB0aGlzIHJvdXRpbmUgaXMgZm9yLiAqLworICAgIC8qIEJ1dCBpdCBkb2VzIHRvbGVyYXRlIGZpbGVzIHRoYXQgY29udGFpbiBOVUxzLiAqLworICAgIHsKKyAgICAgICAgaW50IGE7CisgICAgICAgIGNoYXIgKnM7CisKKyAgICAgICAgcyA9IGJ1ZjsKKyAgICAgICAgYSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNoYXJhY3Rlciwgbm9uZSB5ZXQuICovCisgICAgICAgIGRlYnVnKEYxMDEsInR5cGVnZXRsaW5lIHpzaW5sIHNpbXVsYXRpb24iLCIiLG4pOworICAgICAgICB3aGlsZSAobi0tKSB7ICAgICAgICAgICAgICAgICAgIC8qIFVwIHRvIGdpdmVuIGxlbmd0aCAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIGludCBvbGQgPSAwOworICAgICAgICAgICAgaWYgKGZlb2wpICAgICAgICAgICAgICAgICAgIC8qIFByZXZpb3VzIGNoYXJhY3RlciAqLworICAgICAgICAgICAgICBvbGQgPSBhOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIGlmICh6Y2hpbihaSUZJTEUsJmEpIDwgMCkgeyAvKiBSZWFkIGEgY2hhcmFjdGVyIGZyb20gdGhlIGZpbGUgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ0eXBlZ2V0bGluZSB6Y2hpbiBmYWlsIiwiIixjb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICB4ID0gLTE7ICAgICAgICAgICAgICAgLyogRU9GIG9yIG90aGVyIGVycm9yICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIGlmIChmZW9sKSB7ICAgICAgICAgICAgICAgICAvKiBTaW5nbGUtY2hhcmFjdGVyIGxpbmUgdGVybWluYXRvciAqLworICAgICAgICAgICAgICAgIGlmIChhID09IGZlb2wpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBDUkxGIGxpbmUgdGVybWluYXRvciAqLworI2lmZGVmIENPTU1FTlQKKy8qIERlYnVnIGxvZyBzaG93cyB0aGF0IGluIFdpbmRvd3MsIDxDUj48TEY+IGlzIHJldHVybmVkIGFzIDxMRj4uICovCisvKiBBcHBhcmVudGx5IHdlJ3JlIG5vdCByZWFkaW5nIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlLiAqLworCisgICAgICAgICAgICAgICAgaWYgKGEgPT0gJ1wwMTUnKSAgICAgICAgLyogQ1IsIGdldCBuZXh0IGNoYXJhY3RlciAqLworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKG9sZCA9PSAnXDAxNScpIHsgICAgLyogUHJldmlvdXMgY2hhcmFjdGVyIHdhcyBDUiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAnXDAxMicpIHsgIC8qIFRoaXMgb25lIGlzIExGLCBzbyB3ZSBoYXZlIGEgbGluZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgLyogTm90IExGLCBkZXBvc2l0IENSICovCisgICAgICAgICAgICAgICAgICAgICAgICAqcysrID0gJ1wwMTUnOworICAgICAgICAgICAgICAgICAgICAgICAgbi0tOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIGlmIChhID09IExGKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzW2xlbl0gPT0gQ1IpIHsgLyogVGhpcyBwcm9iYWJseSB3b24ndCBoYXBwZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNbbGVuXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcyA9IGE7ICAgICAgICAgICAgICAgICAgICAgLyogRGVwb3NpdCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgIGxlbisrOworICAgICAgICB9CisgICAgICAgICpzID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgLyogVGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHJldHVybih4IDwgMCA/IC0xIDogbGVuKTsKK30KKworCisjaWZuZGVmIE1BQworU0lHVFlQCisjaWZkZWYgQ0tfQU5TSUMKK3R5dHJhcChpbnQgZm9vKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUWVBFIGludGVycnVwdCB0cmFwICovCisjZWxzZQordHl0cmFwKGZvbykgaW50IGZvbzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogdHl0cmFwICovIHsKKyNpZmRlZiBfX0VNWF9fCisgICAgc2lnbmFsKFNJR0lOVCwgU0lHX0FDSyk7CisjZW5kaWYKKyAgICBkZWJ1ZyhGMTAwLCJ0eXBlIHR5dHJhcCBTSUdJTlQiLCIiLDApOworICAgIHR5cF9pbnQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIChOZWVkIGFyZyBmb3IgQU5TSSBDKSAqLworICAgIFNJR1JFVFVSTjsKK30KKyNlbmRpZiAvKiBNQUMgKi8KKworaW50Citkb3R5cGUoZmlsZSwgcGFnaW5nLCBmaXJzdCwgaGVhZCwgcGF0LCB3aWR0aCwgcHJlZml4LCBpbmNzLCBvdXRjcywgb3V0ZmlsZSwgeikKKyAgICBjaGFyICogZmlsZSwgKiBwYXQsICogcHJlZml4OyBpbnQgcGFnaW5nLCBmaXJzdCwgaGVhZCwgd2lkdGgsIGluY3MsIG91dGNzOworICAgIGNoYXIgKiBvdXRmaWxlOyBpbnQgejsKKy8qIGRvdHlwZSAqLyB7CisgICAgZXh0ZXJuIGxvbmcgZmZjOworICAgIGNoYXIgYnVmW1RZUEJVRkwrMl07CisgICAgY2hhciAqIHMgPSBOVUxMOworICAgIGludCByYyA9IDEsIGxpbmVzID0gMCwgdWNzMiA9IDA7CisgICAgY2hhciAqKiB0YWlsID0gTlVMTDsKKyAgICBpbnQgKiB0bGVuID0gTlVMTDsKKyAgICBpbnQgdGFpbGluZyA9IDAsIGNvdW50aW5nID0gMDsKKyAgICBpbnQgeCwgYywgbiwgaSwgaiwgayA9IDA7CisgICAgaW50IG51bWJlciA9IDAsIHNhdmUsIGxlbiwgcGZ4bGVuID0gMCwgZXZhbHBmeCA9IDE7CisjaWZkZWYgVU5JQ09ERQorICAgIGludCB1Y3Nib21fc2F2OworICAgIGV4dGVybiBpbnQgdWNzYm9tOworI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNpZmRlZiBOVAorICAgIGludCBndWkgPSAwOworI2VuZGlmIC8qIE5UICovCisKKyNpZm5kZWYgTUFDCisjaWZkZWYgT1MyCisjaWZkZWYgTlQKKyAgICBTSUdUWVAgKCogb2xkc2lnKShpbnQpOyAgICAgICAgICAgICAvKiBGb3Igc2F2aW5nIG9sZCBpbnRlcnJ1cHQgdHJhcC4gKi8KKyNlbHNlIC8qIE5UICovCisgICAgU0lHVFlQICgqIHZvbGF0aWxlIG9sZHNpZykoaW50KTsKKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UgLyogT1MyICovCisgICAgU0lHVFlQICgqIG9sZHNpZykoKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKworI2lmZGVmIEtVSQorICAgIGlmIChvdXRmaWxlID09IChjaGFyICopMSkgeworICAgICAgICBndWkgPSAxOworICAgICAgICBvdXRmaWxlID0gIiI7CisgICAgfQorI2VuZGlmIC8qIEtVSSAqLworCisgICAgaWYgKCFmaWxlKSBmaWxlID0gIiI7CisgICAgaWYgKCEqZmlsZSkgcmV0dXJuKC0yKTsKKworICAgIGlmIChvZnAgIT0gc3Rkb3V0KSB7ICAgICAgICAgICAgICAgIC8qIEluIGNhc2Ugb2YgcHJldmlvdXMgaW50ZXJydXB0aW9uICovCisgICAgICAgIGlmIChvZnApIGZjbG9zZShvZnApOworICAgICAgICBvZnAgPSBzdGRvdXQ7CisgICAgfQorICAgIGlmICghb3V0ZmlsZSkgb3V0ZmlsZSA9ICIiOworICAgIGlmIChvdXRmaWxlWzBdKSB7CisgICAgICAgIG9mcCA9IGZvcGVuKG91dGZpbGUsInciKTsgICAgICAgLyogT3BlbiBvdXRwdXQgZmlsZSAqLworICAgICAgICBpZiAoIW9mcCkgeworICAgICAgICAgICAgcHJpbnRmKCI/Q2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSAlczogJXNcbiIsb3V0ZmlsZSxja19lcnJzdHIoKSk7CisgICAgICAgICAgICBvZnAgPSBzdGRvdXQ7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgfQorICAgIG51bWJlciA9IHo7CisgICAgaWYgKG51bWJlciAmJiBwcmVmaXgpIHByZWZpeCA9IE5VTEw7CisKKyNpZmRlZiBVTklDT0RFCisgICAgdWNzYm9tX3NhdiA9IHVjc2JvbTsgICAgICAgICAgICAgICAgLyogV2UgYXJlIG5vdCBjcmVhdGluZyBhIGZpbGUgKi8KKyAgICB1Y3Nib20gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEbyBub3QgdXNlIEJPTSBieXRlcyAqLworI2VuZGlmIC8qIFVOSUNPREUgKi8KKworICAgIHR5cF9pbnQgPSAwOworCisgICAgc2F2ZSA9IGJpbmFyeTsgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSBmaWxlIHR5cGUgKi8KKworICAgIGRlYnVnKEYxMDEsImRvdHlwZSBpbmNzIiwiIixpbmNzKTsKKyAgICBkZWJ1ZyhGMTAxLCJkb3R5cGUgb3V0Y3MiLCIiLG91dGNzKTsKKworI2lmZGVmIFVOSUNPREUKKyAgICBkZWJ1ZyhGMTExLCJkb3R5cGUgZmlsZW9yZGVyIiwiQSIsZmlsZW9yZGVyKTsKKyNpZmRlZiBPUzIKKyAgICBpZiAoIWluc2VydmVyICYmICFrOTVzdGRvdXQpCisgICAgICBvdXRjcyA9IEZDX1VDUzI7CisjZW5kaWYgLyogT1MyICovCisKKyAgICBpZiAob3V0Y3MgPT0gRkNfVUNTMikgICAgICAgICAgICAgICAvKiBPdXRwdXQgaXMgVUNTLTI/ICovCisgICAgICB1Y3MyID0gMTsKKyAgICBpZiAoZmlsZW9yZGVyIDwgMCkKKyAgICAgIGZpbGVvcmRlciA9IHVjc29yZGVyOworICAgIGRlYnVnKEYxMTEsImRvdHlwZSBmaWxlb3JkZXIiLCJCIixmaWxlb3JkZXIpOworI2VuZGlmIC8qIFVOSUNPREUgKi8KKworI2lmZGVmIENLX1RUR1dTSVoKKyNpZmRlZiBPUzIKKyAgICB0dGdjd3N6KCk7CisjZWxzZSAvKiBPUzIgKi8KKyAgICAvKiBDaGVjayB3aGV0aGVyIHdpbmRvdyBzaXplIGNoYW5nZWQgKi8KKyAgICBpZiAodHRnd3NpeigpID4gMCkgeworICAgICAgICBpZiAodHRfcm93cyA+IDAgJiYgdHRfY29scyA+IDApIHsKKyAgICAgICAgICAgIGNtZF9yb3dzID0gdHRfcm93czsKKyAgICAgICAgICAgIGNtZF9jb2xzID0gdHRfY29sczsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImRvdHlwZSBjbWRfcm93cyIsIiIsY21kX3Jvd3MpOworICAgICAgICAgICAgZGVidWcoRjEwMSwiZG90eXBlIGNtZF9jb2xzIiwiIixjbWRfY29scyk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworCisgICAgaWYgKHByZWZpeCkKKyAgICAgIHBmeGxlbiA9IHN0cmxlbihwcmVmaXgpOworCisgICAgaWYgKHBhZ2luZyA8IDApIHsgICAgICAgICAgICAgICAgICAgLyogQ291bnQgb25seSwgZG9uJ3QgcHJpbnQgKi8KKyAgICAgICAgY291bnRpbmcgPSAxOworICAgICAgICBwcmVmaXggPSBOVUxMOworICAgICAgICB3aWR0aCA9IDA7CisgICAgICAgIHBhZ2luZyA9IDA7CisgICAgfQorICAgIGlmICh1Y3MyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENydWRlLi4uICovCisgICAgICB3aWR0aCAqPSAyOworCisjaWZkZWYgT1MyCisgICAgaWYgKCpmaWxlKSB7CisgICAgICAgIGNrc3RybmNweShidWYsIGZpbGUsIFRZUEJVRkwpOyAgLyogQ2hhbmdlIC8gdG8gXC4gKi8KKyAgICAgICAgcCA9IGJ1ZjsKKyAgICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgICAgICBpZiAoKnAgPT0gJy8nKSAqcCA9ICdcXCc7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICAgICAgZmlsZSA9IGJ1ZjsKKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IDA7CisgICAgICAgIGdvdG8geGRvdHlwZTsKKyAgICB9CisjZW5kaWYgLyogT1MyICovCisKKyAgICBpZiAoemNoa2koZmlsZSkgPT0gLTIpIHsgICAgICAgICAgICAvKiBJdCdzIGEgZGlyZWN0b3J5ICovCisgICAgICAgIGRlYnVnKEYxMTEsImRvdHlwZSB6Y2hraSBmYWlsdXJlIixmaWxlLC0yKTsKKyAgICAgICAgaWYgKHhjbWRzcmMgPT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCI/Tm90IGEgcmVndWxhciBmaWxlOiBcIiVzXCJcbiIsZmlsZSk7CisgICAgICAgICAgICByYyA9IC05OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICByYyA9IDA7CisgICAgICAgIGdvdG8geGRvdHlwZTsKKyAgICB9CisgICAgaWYgKCF6b3BlbmkoWklGSUxFLCBmaWxlKSkgeyAgICAgICAgLyogTm90IGEgZGlyZWN0b3J5LCBvcGVuIGl0ICovCisgICAgICAgIGRlYnVnKEYxMTEsImRvdHlwZSB6b3BlbmkgZmFpbHVyZSIsZmlsZSwwKTsKKyAgICAgICAgaWYgKHhjbWRzcmMgPT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCI/Q2FuJ3Qgb3BlbiBmaWxlOiBcIiVzXCJcbiIsZmlsZSk7CisgICAgICAgICAgICByYyA9IC05OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICByYyA9IDA7CisgICAgICAgIGdvdG8geGRvdHlwZTsKKyAgICB9CisKKyNpZm5kZWYgQU1JR0EKKyNpZm5kZWYgTUFDCisgICAgZXJybm8gPSAwOworICAgIG9sZHNpZyA9IHNpZ25hbChTSUdJTlQsIHR5dHJhcCk7ICAgIC8qIFNhdmUgY3VycmVudCBpbnRlcnJ1cHQgdHJhcC4gKi8KKyAgICBkZWJ1ZyhGMTExLCJ0eXBlIFNJR0lOVCB0cmFwIHNldCIsY2tpdG9hKGVycm5vKSxvbGRzaWcpOworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIEFNSUdBICovCisKKyAgICBpZiAocGFnaW5nID4gLTEpICAgICAgICAgICAgICAgICAgICAvKiBNb3JlLXByb21wdGluZyAqLworICAgICAgeGFza21vcmUgPSBwYWdpbmc7CisKKyAgICBiaW5hcnkgPSAwOworCisgICAgaWYgKGhlYWQgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogInRhaWwiIHdhcyByZXF1ZXN0ZWQgKi8KKyAgICAgICAgdGFpbGluZyA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBTZXQgZmxhZyAqLworICAgICAgICBoZWFkID0gMCAtIGhlYWQ7ICAgICAgICAgICAgICAgIC8qIEdldCBhYnNvbHV0ZSBudW1iZXIgb2YgbGluZXMgKi8KKyAgICAgICAgaWYgKCFjb3VudGluZykgeworICAgICAgICAgICAgdGFpbCA9IChjaGFyICoqKSBtYWxsb2MoaGVhZCAqIHNpemVvZihjaGFyICopKTsgLyogQWxsb2NhdGUgbGlzdCAqLworICAgICAgICAgICAgaWYgKCF0YWlsKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/TWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisgICAgICAgICAgICAgICAgZ290byB4ZG90eXBlOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bGVuID0gKGludCAqKSBtYWxsb2MoaGVhZCAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgICAgIGlmICghdGxlbikgeworICAgICAgICAgICAgICAgIHByaW50ZigiP01lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworICAgICAgICAgICAgICAgIGdvdG8geGRvdHlwZTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlYWQ7IGkrKykgeyAvKiBJbml0aWFsaXplIGVhY2ggcG9pbnRlciBpbiBsaXN0LiAqLworICAgICAgICAgICAgICAgIHRhaWxbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgIHRsZW5baV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHR5cF9saW5lcyA9IDA7CisgICAgdHlwX210Y2hzID0gMDsKKworI2lmZGVmIFVOSUNPREUKKyAgICBpZiAob3V0Y3MgPiAtMSAmJiAoaW5jcyAhPSBvdXRjcyB8fCBpbmNzID09IEZDX1VDUzIpKSB7IC8qIFRyYW5zbGF0aW5nPyAqLworICAgICAgICBmZmMgPSAwTDsKKyAgICAgICAgaW5pdHhsYXRlKGluY3Msb3V0Y3MpOyAgICAgICAgICAvKiBTZXQgdXAgdHJhbnNsYXRpb24gZnVuY3Rpb25zICovCisgICAgfSBlbHNlCisjZW5kaWYgLyogVU5JQ09ERSAqLworICAgICAgb3V0Y3MgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lYW5zIHdlIGRvbid0IGtub3cgdGhlIGNoYXJzZXQgKi8KKworICAgIGRlYnVnKEYxMDEsImRvdHlwZSBmZmMiLCIiLGZmYyk7CisgICAgZGVidWcoRjEwMSwiZG90eXBlIG91dGNzIDIiLCIiLG91dGNzKTsKKyNpZmRlZiBVTklDT0RFCisgICAgZGVidWcoRjExMSwiZG90eXBlIGZpbGVvcmRlciIsIkMiLGZpbGVvcmRlcik7CisjZW5kaWYgLyogVU5JQ09ERSAqLworCisgICAgLyogQWxsb3cgdGhlIGJ1ZmZlciB0byBjb250YWluIE5VTHMgKi8KKworICAgIGZvciAobiA9IGZpcnN0OworICAgICAgICAgKGxlbiA9IHR5cGVnZXRsaW5lKGluY3Msb3V0Y3MsYnVmLFRZUEJVRkwpKSA+IC0xOworICAgICAgICAgbGluZXMrKworICAgICAgICAgKSB7CisgICAgICAgIGRlYnVnKEYwMTEsImRvdHlwZSBsaW5lIixidWYsbGVuKTsKKyNpZm5kZWYgTUFDCisgICAgICAgIGlmICh0eXBfaW50KSB7ICAgICAgICAgICAgICAgICAgLyogSW50ZXJydXB0ZWQ/ICovCisgICAgICAgICAgICB0eXBfaW50ID0gMDsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInR5cGUgaW50ZXJydXB0ZWQgbGluZSIsIiIsbGluZXMpOworICAgICAgICAgICAgcHJpbnRmKCJeQy4uLlxuIik7ICAgICAgICAgIC8qIFByaW50IG1lc3NhZ2UgKi8KKyAgICAgICAgICAgIGlmIChvZnAgIT0gc3Rkb3V0KSB7ICAgICAgICAvKiBDbG9zZSBhbnkgb3V0cHV0IGZpbGUgKi8KKyAgICAgICAgICAgICAgICBpZiAob2ZwKSBmY2xvc2Uob2ZwKTsKKyAgICAgICAgICAgICAgICBvZnAgPSBzdGRvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIHh4ZG90eXBlOworICAgICAgICB9CisjZW5kaWYgLyogTUFDICovCisgICAgICAgIHR5cF9saW5lcysrOyAgICAgICAgICAgICAgICAgICAgLyogRm9yIFx2KHR5X2xuKSAqLworICAgICAgICBpZiAocGF0KSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hdGNoaW5nPyAqLworICAgICAgICAgIGlmICghY2ttYXRjaChwYXQsYnVmLDEsMSs0KSkgIC8qIExpbmUgbWF0Y2hlcyBwYXR0ZXJuPyAqLworICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgIC8qIE5vLCBza2lwIGl0ICovCisgICAgICAgIHR5cF9tdGNocysrOworCisgICAgICAgIGlmIChoZWFkID4gMCAmJiAhdGFpbGluZyAmJiBsaW5lcyA9PSBoZWFkKSAvKiBIYW5kbGUgL0hFQUQ6biAqLworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGJ1ZltUWVBCVUZMKzFdID0gTlVMOyAgICAgICAgICAgLyogSnVzdCBpbiBjYXNlLi4uICovCisgICAgICAgIGlmIChwcmVmaXgpIHsgICAgICAgICAgICAgICAgICAgLyogQWRkIHNwZWNpZmllZCBwcmVmaXggdG8gZWFjaCBsaW5lICovCisgICAgICAgICAgICBjaGFyIHBidWZbNjRdOworICAgICAgICAgICAgY2hhciAqIHBwOworICAgICAgICAgICAgcHAgPSBwcmVmaXg7CisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgICBpZiAoZXZhbHBmeCkgeyAgICAgICAgICAgICAgLyogUHJlZml4IGlzIGEgdmFyaWFibGU/ICovCisgICAgICAgICAgICAgICAgaW50IG4gPSA2MzsgICAgICAgICAgICAgLyogTWF5YmUgLSBldmFsdWF0ZSBpdCBhbmQgc2VlICovCisgICAgICAgICAgICAgICAgY2hhciAqIHAgPSBwYnVmOworICAgICAgICAgICAgICAgIHp6c3RyaW5nKHByZWZpeCwmcCwmbik7IC8qIElmIHRoZXJlIGlzIG5vIGNoYW5nZSAqLworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHByZWZpeCxwYnVmKSkgeyAvKiBpdCdzIG5vdCBhIHZhcmlhYmxlICovCisgICAgICAgICAgICAgICAgICAgIGV2YWxwZnggPSAwOyAgICAgICAgLyogU28gZG9uJ3QgZG8gdGhpcyBhZ2Fpbi4gKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBJdCB3YXMgYSB2YXJpYWJsZSAqLworICAgICAgICAgICAgICAgICAgICBwcCA9IHBidWY7ICAgICAgICAgIC8qIFNvIHN1YnN0aXR1dGUgaXRzIHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgIHBmeGxlbiA9IDYzIC0gbjsgICAgLyogYW5kIGdldCBpdHMgbmV3IGxlbmd0aCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgICAgaWYgKGxlbiArIHBmeGxlbiArIDIgPCBUWVBCVUZMKSB7CisgICAgICAgICAgICAgICAgLyogU2hpZnQgcmlnaHQgdG8gbWFrZSByb29tIGZvciBwcmVmaXggKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilsaW5lK3BmeGxlbiwoY2hhciAqKWJ1ZixsZW4pOworICAgICAgICAgICAgICAgIGxzZXQoKGNoYXIgKilsaW5lLHBwLHBmeGxlbixTUCk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZG90eXBlIHByZWZpeCIsbGluZSxwZnhsZW4pOworICAgICAgICAgICAgICAgIGxlbiArPSBwZnhsZW47CisgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopYnVmLChjaGFyICopbGluZSxsZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG51bWJlcikgeyAgICAgICAgICAgIC8qIExpbmUgbnVtYmVycyAqLworICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICBzcHJpbnRmKGxpbmUsIiU0ZC4gIix0eXBfbGluZXMpOworICAgICAgICAgICAgeCA9IHN0cmxlbihsaW5lKTsKKyAgICAgICAgICAgIGxlbiArPSB4OworICAgICAgICAgICAgaWYgKGxlbiA8IExJTkJVRlNJWikgeworICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSZsaW5lW3hdLChjaGFyICopYnVmLGxlbik7CisgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopYnVmLChjaGFyICopbGluZSxsZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh3aWR0aCA+IDAgJiYgd2lkdGggPD0gVFlQQlVGTCkgeyAvKiBUcnVuY2F0ZSBhdCBnaXZlbiB3aWR0aC4gKi8KKyAgICAgICAgICAgIGNoYXIgKiBvYnVmID0gbGluZTsgICAgICAgICAvKiBCdXQgdG8gZG8gdGhhdCBmaXJzdCB3ZSBtdXN0ICovCisgICAgICAgICAgICBpbnQgaSxrLHo7ICAgICAgICAgICAgICAgICAgLyogZXhwYW5kIHRhYnM7IGFzc3VtZSBldmVyeSA4IGNvbHMuICovCisgICAgICAgICAgICBsaW5lWzBdID0gTlVMOworICAgICAgICAgICAgZm9yIChpID0gMCwgayA9IDA7IGkgPCB3aWR0aDsgaysrKSB7IC8qIENoYXJhY3RlciBsb29wLi4uICovCisgICAgICAgICAgICAgICAgaWYgKCFidWZba10pICAgICAgICAgICAgLyogTm8gbW9yZSBjaGFycyBpbiB0aGlzIGxpbmUsIGRvbmUuICovCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoYnVmW2tdICE9ICdcdCcpIHsgICAvKiBJZiBpdCdzIG5vdCBhIHRhYiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBMSU5CVUZTSVopIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBvYnVmW2krK10gPSBidWZba107IC8qIGFuZCB0aGVuIGRlcG9zaXQgaXQuICovCisgICAgICAgICAgICAgICAgICAgIG9idWZbaV0gPSBOVUw7ICAgICAgLyogS2VlcCBpdCBudWxsLXRlcm1pbmF0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHogPSA4IC0gKGkgJSA4KTsgICAgICAgIC8qIEl0J3MgYSB0YWIsIGV4cGFuZCBpdC4gKi8KKyAgICAgICAgICAgICAgICBpZiAoeiA9PSAwKSB6ID0gODsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgeiAmJiBpIDwgTElOQlVGU0laOyBqKyspIHsKKyNpZmRlZiBVTklDT0RFCisgICAgICAgICAgICAgICAgICAgIGlmICh1Y3MyICYmICF1Y3NvcmRlcikKKyAgICAgICAgICAgICAgICAgICAgICBvYnVmW2krK10gPSBOVUw7CisjZW5kaWYgLyogVU5JQ09ERSAqLworICAgICAgICAgICAgICAgICAgICBvYnVmW2krK10gPSAnICc7CisjaWZkZWYgVU5JQ09ERQorICAgICAgICAgICAgICAgICAgICBpZiAodWNzMiAmJiB1Y3NvcmRlcikKKyAgICAgICAgICAgICAgICAgICAgICBvYnVmW2krK10gPSBOVUw7CisjZW5kaWYgLyogVU5JQ09ERSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvYnVmW2krK10gPSBOVUw7CisgICAgICAgICAgICAgICAgb2J1ZltpXSA9IE5VTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9idWZbd2lkdGhdID0gTlVMOyAgICAgICAgICAvKiBOb3cgdHJ1bmNhdGUgYXQgZ2l2ZW4gd2lkdGguICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgLyogVGhpcyBkb2Vzbid0IHdvcmsgZm9yIFVDUy0yIGJlY2F1c2UgaXQgY29udGFpbnMgTlVMcyAqLworICAgICAgICAgICAgY2tzdHJuY3B5KGJ1ZixvYnVmLFRZUEJVRkwpOyAvKiBhbmQgY29weSBpdCBiYWNrIChhZ2Fpbj8pICovCisjZWxzZQorICAgICAgICAgICAgbWVtY3B5KChjaGFyICopYnVmLChjaGFyICopb2J1ZixpKTsgLyogQ29weSBpdCBiYWNrICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgbGVuID0gKGkgPiB3aWR0aCkgPyB3aWR0aCA6IGk7IC8qIFNwYXJlIHVzIGFub3RoZXIgc3RybGVuKCkuLi4gKi8KKyAgICAgICAgfQorICAgICAgICBpZiAodGFpbGluZykgeyAgICAgICAgICAgICAgICAgIC8qIElmIC9UQUlMOm4uLi4gKi8KKyAgICAgICAgICAgIGsgPSBsaW5lcyAlIGhlYWQ7ICAgICAgICAgICAvKiBzYXZlIHRoaXMgbGluZSBpbiBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgICAgIGlmICghY291bnRpbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAodGFpbFtrXSkgZnJlZSh0YWlsW2tdKTsKKyAgICAgICAgICAgICAgICB0YWlsW2tdID0gbWFsbG9jKGxlbisyKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRhaWxba10pIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/TWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8geGRvdHlwZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KHRhaWxba10sYnVmLGxlbik7CisgICAgICAgICAgICAgICAgdGxlbltrXSA9IGxlbjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnRpbmcpICAgICAgICAgICAgICAgICAgIC8qIElmIG9ubHkgY291bnRpbmcgKi8KKyAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAvKiB3ZSdyZSBkb25lIHdpdGggdGhpcyBsaW5lICovCisKKyAgICAgICAgaWYgKHBhZ2luZykgeyAgICAgICAgICAgICAgICAgICAvKiBEaXNwbGF5aW5nIHRoaXMgbGluZS4uLiAqLworICAgICAgICAgICAgaW50IHU7CisgICAgICAgICAgICB1ID0gbGVuOyAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIGluIEJZVEVTICovCisgICAgICAgICAgICBpZiAodWNzMikgICAgICAgICAgICAgICAgICAgLyogSWYgb3V0cHV0dGluZyBpbiBVQ1MtMiAqLworICAgICAgICAgICAgICB1IC89IDI7ICAgICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgbGVuZ3RoIHRvIENIQVJBQ1RFUlMgKi8KKyAgICAgICAgICAgIHggPSAodSAvIGNtZF9jb2xzKSArIDE7ICAgICAvKiBDcnVkZWx5IGFsbG93IGZvciB3cmFwICovCisgICAgICAgICAgICBpZiAoY21kX3Jvd3MgPiAwICYmIGNtZF9jb2xzID4gMCkKKyAgICAgICAgICAgICAgbiArPSB4OyAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGFzc3VtZXMgdGVybWluYWwgd2lsbCB3cmFwICovCisgICAgICAgIH0KKyNpZmRlZiBLVUkKKyAgICAgICAgaWYgKCBndWkgKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICogdWNoID0gKHVuc2lnbmVkIHNob3J0ICopYnVmOworICAgICAgICAgICAgZm9yICggaT0wOyBpPGxlbi8yOyBpKyspCisgICAgICAgICAgICAgICAgZ3VpX3RleHRfcG9wdXBfYXBwZW5kKHVjaFtpXSk7CisJCQlndWlfdGV4dF9wb3B1cF9hcHBlbmQoQ1IpOworCQkJZ3VpX3RleHRfcG9wdXBfYXBwZW5kKExGKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtVSSAqLworICAgICAgICB0eXBlbGluZShidWYsbGVuLG91dGNzLG9mcCk7ICAgIC8qIFByaW50IGxpbmUsIGxlbmd0aCBiYXNlZCAqLworI2lmZGVmIENLX1RUR1dTSVoKKyAgICAgICAgZGVidWcoRjEwMSwiZG90eXBlIG4iLCIiLG4pOworICAgICAgICBpZiAocGFnaW5nID4gMCAmJiBvZnAgPT0gc3Rkb3V0KSB7IC8qIFBhdXNlIGF0IGVuZCBvZiBzY3JlZW4gKi8KKyAgICAgICAgICAgIGlmIChjbWRfcm93cyA+IDAgJiYgY21kX2NvbHMgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG4gPiBjbWRfcm93cyAtIDMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpCisgICAgICAgICAgICAgICAgICAgICAgZ290byB4ZG90eXBlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgbiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworICAgIH0KKworICB4ZG90eXBlOgorICAgIGlmIChjb3VudGluZykgeworICAgICAgICBmcHJpbnRmKG9mcCwKKyAgICAgICAgICAgICAgICAiJXM6ICVkIGxpbmUlc1xuIixmaWxlLHR5cF9saW5lcyx0eXBfbGluZXMgPT0gMSA/ICIiIDogInMiKTsKKyAgICAgICAgaWYgKHBhdCkKKyAgICAgICAgICBmcHJpbnRmKG9mcCwKKyAgICAgICAgICAgICAgICAgICIlczogJWQgbWF0Y2glc1xuIixwYXQsdHlwX210Y2hzLHR5cF9tdGNocyA9PSAxID8gIiIgOiAiZXMiKTsKKyAgICAgICAgZ290byB4eGRvdHlwZTsKKyAgICB9CisgICAgaWYgKHRhaWxpbmcgJiYgdGFpbCkgeyAgICAgICAgICAgICAgLyogVHlwaW5nIHRhaWwgb2YgZmlsZT8gKi8KKyAgICAgICAgaWYgKGxpbmVzIDwgaGVhZCkgeyAgICAgICAgICAgICAvKiBZZXMsIHNob3cgdGhlIGxpbmVzIHdlIHNhdmVkICovCisgICAgICAgICAgICBrID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogU2hvdyBhbGwgbGluZXMgKi8KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb3JlIGxpbmVzIHRoYW4gdGFpbCBudW1iZXIgKi8KKyAgICAgICAgICAgIGxpbmVzID0gazsgICAgICAgICAgICAgICAgICAvKiBMYXN0IGxpbmUgdG8gc2hvdyAqLworICAgICAgICAgICAgaysrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IGxpbmUgdG8gc2hvdyAqLworICAgICAgICAgICAgaWYgKGsgPj0gaGVhZCkKKyAgICAgICAgICAgICAgayA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbiA9IGZpcnN0OyAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgbGluZSBjb3VudGVyICovCisgICAgICAgIGZvciAoaSA9IGsgOzsgaSsrKSB7ICAgICAgICAgICAgLyogTG9vcCB0aHJ1IGNpcmN1bGFyIGJ1ZmZlciAqLworI2lmbmRlZiBNQUMKKyAgICAgICAgICAgIGlmICh0eXBfaW50KSB7ICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHRlZD8gKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIl5DLi4uXG4iKTsgICAgICAvKiBQcmludCBtZXNzYWdlICovCisgICAgICAgICAgICAgICAgZ290byB4eGRvdHlwZTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBNQUMgKi8KKyAgICAgICAgICAgIGogPSBpICUgaGVhZDsgICAgICAgICAgICAgICAvKiBJbmRleCBvZiB0aGlzIGxpbmUgKi8KKyAgICAgICAgICAgIHMgPSB0YWlsW2pdOyAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBsaW5lIHRvIGRpc3BsYXkgKi8KKyAgICAgICAgICAgIGlmICghcykgICAgICAgICAgICAgICAgICAgICAvKiAoc2hvdWxkbid0IGhhcHBlbi4uLikgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocGFnaW5nKSB7ICAgICAgICAgICAgICAgLyogQ3J1ZGVseSBhbGxvdyBmb3IgbGluZSB3cmFwICovCisgICAgICAgICAgICAgICAgeCA9IHRsZW5bal07CisgICAgICAgICAgICAgICAgaWYgKHVjczIpIHggLz0gMjsKKyAgICAgICAgICAgICAgICB4ID0geCAvIGNtZF9jb2xzICsgMTsKKyAgICAgICAgICAgICAgICBpZiAoY21kX3Jvd3MgPiAwICYmIGNtZF9jb2xzID4gMCkKKyAgICAgICAgICAgICAgICAgIG4gKz0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGVsaW5lKHMsdGxlbltqXSxvdXRjcyxvZnApOyAvKiBEaXNwbGF5IHRoaXMgbGluZSAqLworICAgICAgICAgICAgaWYgKHBhZ2luZyAmJiBvZnAgPT0gc3Rkb3V0KSB7IC8qIFBhdXNlIGF0IGVuZCBvZiBzY3JlZW4gKi8KKyAgICAgICAgICAgICAgICBpZiAoY21kX3Jvd3MgPiAwICYmIGNtZF9jb2xzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobiA+IGNtZF9yb3dzIC0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhaWxbal0gPSBOVUxMOworICAgICAgICAgICAgZnJlZShzKTsgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgdGhlIGxpbmUgKi8KKyAgICAgICAgICAgIGlmIChpICUgaGVhZCA9PSBsaW5lcykgICAgICAvKiBXaGVuIHRvIHN0b3AgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZnJlZSgoY2hhciAqKXRhaWwpOyAgICAgICAgICAgICAvKiBGcmVlIHRoZSBsaXN0ICovCisgICAgICAgIHRhaWwgPSBOVUxMOworICAgICAgICBpZiAodGxlbikgZnJlZSgoY2hhciAqKXRsZW4pOworICAgICAgICB0bGVuID0gTlVMTDsKKyAgICB9CisKKy8qIENvbWUgaGVyZSB3aGVuIGZpbmlzaGVkIG9yIG9uIFNJR0lOVCAqLworCisgIHh4ZG90eXBlOgorI2lmbmRlZiBBTUlHQQorI2lmbmRlZiBNQUMKKyAgICBzaWduYWwoU0lHSU5ULG9sZHNpZyk7ICAgICAgICAgICAgICAvKiBQdXQgb2xkIHNpZ25hbCBhY3Rpb24gYmFjay4gKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworICAgIGlmICh0YWlsaW5nICYmIHRhaWwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlYWQ7IGkrKykgeyAgICAvKiBGcmVlIGVhY2ggbGluZS4gKi8KKyAgICAgICAgICAgIGlmICh0YWlsW2ldKQorICAgICAgICAgICAgICBmcmVlKHRhaWxbaV0pOworICAgICAgICB9CisgICAgICAgIGZyZWUoKGNoYXIgKil0YWlsKTsgICAgICAgICAgICAgLyogRnJlZSBsaXN0IHBvaW50ZXIgKi8KKyAgICAgICAgaWYgKHRsZW4pCisgICAgICAgICAgZnJlZSgoY2hhciAqKXRsZW4pOworICAgIH0KKyAgICB4ID0gemNsb3NlKFpJRklMRSk7ICAgICAgICAgICAgICAgICAvKiBEb25lLCBjbG9zZSB0aGUgaW5wdXQgZmlsZSAqLworICAgIGlmIChvZnAgIT0gc3Rkb3V0KSB7ICAgICAgICAgICAgICAgIC8qIENsb3NlIGFueSBvdXRwdXQgZmlsZSAqLworICAgICAgICBpZiAob2ZwKSBmY2xvc2Uob2ZwKTsKKyAgICAgICAgb2ZwID0gc3Rkb3V0OworICAgIH0KKyAgICBiaW5hcnkgPSBzYXZlOyAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIHRleHQvYmluYXJ5IG1vZGUgKi8KKyNpZmRlZiBVTklDT0RFCisgICAgdWNzYm9tID0gdWNzYm9tX3NhdjsgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBCT00gdXNhZ2UgKi8KKyNlbmRpZiAvKiBVTklDT0RFICovCisKKyNpZmRlZiBLVUkKKyAgICBpZiAoIGd1aSApCisgICAgICAgIGd1aV90ZXh0X3BvcHVwX3dhaXQoLTEpOyAgICAgICAgLyogV2FpdCBmb3IgdXNlciB0byBjbG9zZSB0aGUgZGlhbG9nICovCisjZW5kaWYgLyogS1VJICovCisgICAgcmV0dXJuKHJjKTsKK30KKworLyogR1JFUCBjb21tYW5kICovCisKKyNkZWZpbmUgR1JFUF9DQVNFICAwICAgICAgICAgICAgICAgICAgICAvKiAvQ0FTRSAqLworI2RlZmluZSBHUkVQX0NPVU4gIDEgICAgICAgICAgICAgICAgICAgIC8qIC9DT1VOVCAqLworI2RlZmluZSBHUkVQX0RPVEYgIDIgICAgICAgICAgICAgICAgICAgIC8qIC9ET1RGSUxFUyAqLworI2RlZmluZSBHUkVQX05BTUUgIDMgICAgICAgICAgICAgICAgICAgIC8qIC9OQU1FT05MWSAqLworI2RlZmluZSBHUkVQX05PQksgIDQgICAgICAgICAgICAgICAgICAgIC8qIC9OT0JBQ0tVUCAqLworI2RlZmluZSBHUkVQX05PRE8gIDUgICAgICAgICAgICAgICAgICAgIC8qIC9OT0RPVEZJTEVTICovCisjZGVmaW5lIEdSRVBfTk9MSSAgNiAgICAgICAgICAgICAgICAgICAgLyogL05PTElTVCAqLworI2RlZmluZSBHUkVQX05PTUEgIDcgICAgICAgICAgICAgICAgICAgIC8qIC9JTlZFUlQgPSAvTk9NQVRDSCAqLworI2RlZmluZSBHUkVQX05PUEEgIDggICAgICAgICAgICAgICAgICAgIC8qIC9OT1BBR0UgKi8KKyNkZWZpbmUgR1JFUF9OVU1TICA5ICAgICAgICAgICAgICAgICAgICAvKiAvTElORU5VTUJFUlMgKi8KKyNkZWZpbmUgR1JFUF9QQUdFIDEwICAgICAgICAgICAgICAgICAgICAvKiAvUEFHRSAqLworI2RlZmluZSBHUkVQX1JFQ1UgMTEgICAgICAgICAgICAgICAgICAgIC8qIC9SRUNVUlNJVkUgKi8KKyNkZWZpbmUgR1JFUF9UWVBFIDEyICAgICAgICAgICAgICAgICAgICAvKiAvVFlQRTogKi8KKyNkZWZpbmUgR1JFUF9PVVRQIDEzICAgICAgICAgICAgICAgICAgICAvKiAvT1VUUFVURklMRTogKi8KKworc3RhdGljIHN0cnVjdCBrZXl0YWIgZ3JlcHRhYltdID0geworICAgIHsgIi9jb3VudCIsICAgICAgICBHUkVQX0NPVU4sIENNX0FSRyB9LAorICAgIHsgIi9kb3RmaWxlcyIsICAgICBHUkVQX0RPVEYsIDAgfSwKKyAgICB7ICIvbGluZW51bWJlcnMiLCAgR1JFUF9OVU1TLCAwIH0sCisgICAgeyAiL25hbWVvbmx5IiwgICAgIEdSRVBfTkFNRSwgMCB9LAorICAgIHsgIi9ub2JhY2t1cGZpbGVzIixHUkVQX05PQkssIDAgfSwKKyAgICB7ICIvbm9jYXNlIiwgICAgICAgR1JFUF9DQVNFLCAwIH0sCisgICAgeyAiL25vZG90ZmlsZXMiLCAgIEdSRVBfTk9ETywgMCB9LAorICAgIHsgIi9ub2xpc3QiLCAgICAgICBHUkVQX05PTEksIDAgfSwKKyAgICB7ICIvbm9tYXRjaCIsICAgICAgR1JFUF9OT01BLCAwIH0sCisgICAgeyAiL25vcGFnZSIsICAgICAgIEdSRVBfTk9QQSwgMCB9LAorICAgIHsgIi9vdXRwdXQiLCAgICAgICBHUkVQX09VVFAsIENNX0FSRyB9LAorICAgIHsgIi9wYWdlIiwgICAgICAgICBHUkVQX1BBR0UsIDAgfSwKKyAgICB7ICIvcXVpZXQiLCAgICAgICAgR1JFUF9OT0xJLCBDTV9JTlYgfSwKKyNpZmRlZiBSRUNVUlNJVkUKKyAgICB7ICIvcmVjdXJzaXZlIiwgICAgR1JFUF9SRUNVLCAwIH0sCisjZW5kaWYgLyogUkVDVVJTSVZFICovCisgICAgeyAiL3R5cGUiLCAgICAgICAgIEdSRVBfVFlQRSwgQ01fQVJHIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuZ3JlcHRhYiA9ICBzaXplb2YoZ3JlcHRhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpLTE7CisKK2ludAorZG9ncmVwKCkgeworICAgIGludCBtYXRjaCwgeCwgeSwgZmMsIGdldHZhbCwgbWMgPSAwLCBjb3VudCA9IDAsIGJpZ2NvdW50ID0gMDsKKyAgICBpbnQgZmxpbmUgPSAwLCBzbGluZSA9IDAsIHdpbGQgPSAwLCBsZW4gPSAwOworICAgIGludCB4bW9kZSA9IC0xLCBzY2FuID0gMDsKKyAgICBjaGFyIGMsIG5hbWVbQ0tNQVhQQVRIKzFdLCBvdXRmaWxlW0NLTUFYUEFUSCsxXSwgKnAsICpzLCAqY3YgPSBOVUxMOworICAgIEZJTEUgKiBmcCA9IE5VTEw7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTd2l0Y2ggdmFsdWVzIGFuZCBkZWZhdWx0cyAqLworICAgICAgZ3JfY291biA9IDAsCisgICAgICBncl9uYW1lID0gMCwKKyAgICAgIGdyX25vYmsgPSAwLAorICAgICAgZ3JfY2FzZSA9IDEsCisgICAgICBncl9ub2xpID0gMCwKKyAgICAgIGdyX25vbWEgPSAwLAorICAgICAgZ3JfbnVtcyA9IDAsCisgICAgICBncl9wYWdlID0geGFza21vcmU7CisKKyAgICBzdHJ1Y3QgRkRCIHN3LCBmbDsKKworICAgIGdfbWF0Y2hkb3QgPSBtYXRjaGRvdDsgICAgICAgICAgICAgIC8qIFNhdmUgZ2xvYmFsIG1hdGNoZG90IHNldHRpbmcgKi8KKyAgICBvdXRmaWxlWzBdID0gTlVMOworCisgICAgaWYgKG9mcCAhPSBzdGRvdXQpIHsgICAgICAgICAgICAgICAgLyogSW4gY2FzZSBvZiBwcmV2aW91cyBpbnRlcnJ1cHRpb24gKi8KKyAgICAgICAgaWYgKG9mcCkgZmNsb3NlKG9mcCk7CisgICAgICAgIG9mcCA9IHN0ZG91dDsKKyAgICB9CisgICAgY21mZGJpKCZzdywgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgRkRCIC0gY29tbWFuZCBzd2l0Y2hlcyAqLworICAgICAgICAgICBfQ01LRVksICAgICAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICJTdHJpbmcgb3IgcGF0dGVybiB0byBzZWFyY2ggZm9yLCBvciBzd2l0Y2giLAorICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICBuZ3JlcHRhYiwgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgIGdyZXB0YWIsICAgICAgICAgICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAmZmwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKyAgICAgICAgICAgKTsKKyAgICBjbWZkYmkoJmZsLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbnl0aGluZyB0aGF0IGRvZXNuJ3QgbWF0Y2ggKi8KKyAgICAgICAgICAgX0NNRkxELCAgICAgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsCQkJLyogeHhzdHJpbmcgKi8KKyAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgTlVMTAorICAgICAgICAgICApOworICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIDAgb3IgbW9yZSBzd2l0Y2hlcyAqLworICAgICAgICB4ID0gY21mZGIoJnN3KTsgICAgICAgICAgICAgICAgIC8qIFBhcnNlIHNvbWV0aGluZyAqLworICAgICAgICBpZiAoeCA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoY21yZXN1bHQuZmNvZGUgIT0gX0NNS0VZKSAgIC8qIEJyZWFrIG91dCBpZiBub3QgYSBzd2l0Y2ggKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgYyA9IGNtZ2JyaygpOworICAgICAgICBpZiAoKGdldHZhbCA9IChjID09ICc6JyB8fCBjID09ICc9JykpICYmICEoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjbXJlc3VsdC5ucmVzdWx0ICE9IEdSRVBfQ09VTikgJiYgIWdldHZhbCAmJgorICAgICAgICAgICAgKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNtcmVzdWx0Lm5yZXN1bHQpIHsKKyAgICAgICAgICBjYXNlIEdSRVBfQ09VTjogeworICAgICAgICAgICAgICBncl9jb3VuKys7CisgICAgICAgICAgICAgIGlmIChnZXR2YWwpIHsKKyAgICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKCJWYXJpYWJsZSBmb3IgcmVzdWx0IiwiIiwmcyxOVUxMKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZjdixzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBHUkVQX0NBU0U6IGdyX2Nhc2U9MDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBHUkVQX05BTUU6IGdyX25hbWUrKzsgZ3Jfbm9saT0wOyBicmVhazsKKyAgICAgICAgICBjYXNlIEdSRVBfTk9CSzogZ3Jfbm9iaysrOyBicmVhazsKKyAgICAgICAgICBjYXNlIEdSRVBfTk9MSTogZ3Jfbm9saSsrOyBncl9uYW1lPTA7IGdyX251bXM9MDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBHUkVQX05PTUE6IGdyX25vbWErKzsgYnJlYWs7CisgICAgICAgICAgY2FzZSBHUkVQX05PUEE6IGdyX3BhZ2U9MDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBHUkVQX05VTVM6IGdyX251bXMrKzsgZ3Jfbm9saT0wOyBicmVhazsKKyAgICAgICAgICBjYXNlIEdSRVBfUEFHRTogZ3JfcGFnZSsrOyBncl9ub2xpPTA7IGJyZWFrOworICAgICAgICAgIGNhc2UgR1JFUF9OT0RPOgorICAgICAgICAgICAgbWF0Y2hkb3QgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHUkVQX0RPVEY6CisgICAgICAgICAgICBtYXRjaGRvdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBSRUNVUlNJVkUKKyAgICAgICAgICBjYXNlIEdSRVBfUkVDVToKKyAgICAgICAgICAgIHJlY3Vyc2l2ZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICAgICAgICBjYXNlIEdSRVBfVFlQRTogeworICAgICAgICAgICAgICBleHRlcm4gc3RydWN0IGtleXRhYiB0eHRiaW5bXTsKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkodHh0YmluLDMsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICBpZiAoeCA9PSAyKSB7ICAgICAgICAgICAgIC8qIEFMTCAqLworICAgICAgICAgICAgICAgICAgeG1vZGUgPSAtMTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAvKiBURVhUIG9yIEJJTkFSWSBvbmx5ICovCisgICAgICAgICAgICAgICAgICB4bW9kZSA9IHg7CisgICAgICAgICAgICAgICAgICBzY2FuID0gMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBHUkVQX09VVFA6ICAgICAgICAgICAgICAgLyogU2VuZCBvdXRwdXQgdG8gZmlsZSAqLworICAgICAgICAgICAgaWYgKCh4ID0gY21vZmkoIkZpbGUgZm9yIEdSRVAnZCBsaW5lcyIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIGNrc3RybmNweShvdXRmaWxlLHMsQ0tNQVhQQVRIKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvdXRmaWxlWzBdKSB7CisgICAgICAgIG9mcCA9IGZvcGVuKG91dGZpbGUsInciKTsgICAgICAgLyogT3BlbiBvdXRwdXQgZmlsZSAqLworICAgICAgICBpZiAoIW9mcCkgeworICAgICAgICAgICAgcHJpbnRmKCI/Q2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSAlczogJXNcbiIsb3V0ZmlsZSxja19lcnJzdHIoKSk7CisgICAgICAgICAgICBvZnAgPSBzdGRvdXQ7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIGdyX3BhZ2UgPSAwOworICAgIH0KKyAgICBzID0gY21yZXN1bHQuc3Jlc3VsdDsKKyAgICBzID0gYnJzdHJpcChzKTsgICAgICAgICAgICAgICAgICAgICAvKiBTdHJpcCBicmFjZXMgZnJvbSBwYXR0ZXJuICovCisgICAgaWYgKCEqcykgeworICAgICAgICBwcmludGYoIj9QYXR0ZXJuIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgY2tzdHJuY3B5KHRtcGJ1ZixzLFRNUEJVRlNJWik7ICAgICAgLyogU2F2ZSBwYXR0ZXJuICovCisgICAgaWYgKCh4ID0gY21pZmkoIkZpbGUocykgdG8gc2VhcmNoIiwiIiwmcywmd2lsZCx4eHN0cmluZykpIDwgMCkgeworICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgcHJpbnRmKCI/RmlsZSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oeCk7CisgICAgfQorICAgIHMgPSBicnN0cmlwKHMpOyAgICAgICAgICAgICAgICAgICAgIC8qIFN0cmlwIGJyYWNlcyBmcm9tIGZpbGVuYW1lICovCisjaWZuZGVmIFpYUkVXSU5ECisgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworI2VuZGlmIC8qIFpYUkVXSU5EICovCisgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHkpOworCisgICAgaWYgKGdyX3BhZ2UgPiAtMSkKKyAgICAgIHhhc2ttb3JlID0gZ3JfcGFnZTsgICAgICAgICAgICAgICAvKiBQYWdpbmcuLi4gKi8KKworICAgIHAgPSB0bXBidWY7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIHBhdHRlcm4gKi8KKyNpZmRlZiBDT01NRU5UCisvKiBOb3cgdGhpcyBpcyBkb25lIGluIGNrbWF0Y2ggKi8KKyAgICBpZiAoKnAgPT0gJ14nKSB7ICAgICAgICAgICAgICAgICAgICAvKiAnXicgYW5jaG9ycyBwYXR0ZXJuIHRvIGJlZ2lubmluZyAqLworICAgICAgICBwKys7CisgICAgfSBlbHNlIGlmICgqcCAhPSAnKicpIHsgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIHByZXBlbmQgaW1wbGllZCAnKicgKi8KKyAgICAgICAgdG1wYnVmWzBdID0gJyonOworICAgICAgICBwID0gdG1wYnVmOworICAgIH0KKyAgICB4ID0gc3RybGVuKHApOyAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgbGVuZ3RoIG9mIHJlc3VsdCAqLworICAgIGlmICh4ID4gMCAmJiB4IDwgVE1QQlVGU0laKSB7ICAgICAgIC8qICckJyBhdCBlbmQgYW5jaG9ycyBwYXR0ZXJuIHRvIGVuZCAqLworICAgICAgICBpZiAocFt4LTFdID09ICckJykgeworICAgICAgICAgICAgcFt4LTFdID0gTlVMOworICAgICAgICB9IGVsc2UgaWYgKHBbeC0xXSAhPSAnKicpIHsKKyAgICAgICAgICAgIHBbeF0gPSAnKic7CisgICAgICAgICAgICBwW3grMV0gPSBOVUw7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIGRlYnVnKEYxMTEsImdyZXAgcGF0IixwLHgpOworCisjaWZkZWYgWlhSRVdJTkQKKyAgICBmYyA9IHp4cmV3aW5kKCk7ICAgICAgICAgICAgICAgICAgICAvKiBSZXdpbmQgdGhlIGZpbGUgbGlzdCAqLworI2Vsc2UKKyAgICB7CisgICAgICAgIGludCBmbGFncyA9IFpYX0ZJTE9OTFk7ICAgICAgICAgLyogRXhwYW5kIGZpbGUgbGlzdCAqLworICAgICAgICBpZiAobWF0Y2hkb3QpICBmbGFncyB8PSBaWF9NQVRDSERPVDsKKyAgICAgICAgaWYgKHJlY3Vyc2l2ZSkgZmxhZ3MgfD0gWlhfUkVDVVJTRTsKKyAgICAgICAgZmMgPSBuenhwYW5kKGxpbmUsZmxhZ3MpOworICAgIH0KKyNlbmRpZiAvKiBaWFJFV0lORCAqLworI2lmZGVmIFVOSVgKKyAgICBzaF9zb3J0KG10Y2hzLE5VTEwsZmMsMCwwLGZpbGVjYXNlKTsKKyNlbmRpZiAvKiBVTklYICovCisKKyAgICBkZWJ1ZyhGMTAxLCJncmVwIGNtZF9yb3dzIiwiIixjbWRfcm93cyk7CisgICAgZGVidWcoRjEwMSwiZ3JlcCBjbWRfY29scyIsIiIsY21kX2NvbHMpOworCisgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9vcCBmb3IgZWFjaCBmaWxlICovCisgICAgICAgIHpuZXh0KG5hbWUpOyAgICAgICAgICAgICAgICAgICAgLyogR2V0IG5leHQgZmlsZSAqLworICAgICAgICBpZiAoIW5hbWVbMF0pICAgICAgICAgICAgICAgICAgIC8qIE5vIG1vcmUsIGRvbmUgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGdyX25vYmspICAgICAgICAgICAgICAgICAgICAvKiBTa2lwcGluZyBiYWNrdXAgZmlsZXM/ICovCisgICAgICAgICAgaWYgKGNrbWF0Y2goIiouflsxLTldKn4iLG5hbWUsMSwxKSkgLyogQmFja3VwIGZpbGU/ICovCisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgLyogWWVzLCBza2lwICovCisgICAgICAgIGlmIChzY2FuKSB7ICAgICAgICAgICAgICAgICAgICAgLyogL1RZUEU6IGdpdmVuPyAqLworICAgICAgICAgICAgc3dpdGNoIChzY2FuZmlsZShuYW1lLCZ5LG5zY2FuZmlsZSkpIHsgLyogWWVzLCBzY2FuIHRoZSBmaWxlICovCisgICAgICAgICAgICAgIGNhc2UgRlRfQklOOgorICAgICAgICAgICAgICAgIGlmICh4bW9kZSAhPSAxKQorICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRlRfVEVYVDoKKyAgICAgICAgICAgICAgY2FzZSBGVF83QklUOgorICAgICAgICAgICAgICBjYXNlIEZUXzhCSVQ6CisjaWZkZWYgVU5JQ09ERQorICAgICAgICAgICAgICBjYXNlIEZUX1VURjg6CisgICAgICAgICAgICAgIGNhc2UgRlRfVUNTMjoKKyNlbmRpZiAvKiBVTklDT0RFICovCisgICAgICAgICAgICAgICAgaWYgKHhtb2RlICE9IDApCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcCA9IGZvcGVuKG5hbWUsInIiKTsgICAgICAgICAgIC8qIE9wZW4gKi8KKyAgICAgICAgaWYgKCFmcCkgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYW4ndCAqLworICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgKi8KKyAgICAgICAgY291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRjaCBjb3VudCwgdGhpcyBmaWxlICovCisgICAgICAgIGZsaW5lID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogTGluZSBjb3VudCwgdGhpcyBmaWxlICovCisgICAgICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgICAgICAgICAgLyogTG9vcCBmb3IgZWFjaCBsaW5lICovCisgICAgICAgICAgICBpZiAoZmdldHMobGluZSxMSU5CVUZTSVosZnApID09IE5VTEwpIHsgLyogR2V0IG5leHQgbGluZSAqLworICAgICAgICAgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgICAgICAgICAgZnAgPSBOVUxMOworCQlkZWJ1ZyhGMTAwLCJHUkVQIEVPRiIsIiIsMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbGluZSsrOyAgICAgICAgICAgICAgICAgICAgLyogQ291bnQgdGhpcyBsaW5lICovCisgICAgICAgICAgICBsaW5lW0xJTkJVRlNJWl0gPSBOVUw7ICAgICAgLyogTWFrZSBzdXJlIGl0J3MgdGVybWluYXRlZCAqLworCSAgICBkZWJ1ZyhGMTExLCJHUkVQIixsaW5lLGZsaW5lKTsKKyAgICAgICAgICAgIGxlbiA9IChpbnQpc3RybGVuKGxpbmUpOyAgICAvKiBHZXQgbGVuZ3RoICovCisgICAgICAgICAgICB3aGlsZSAobGVuID4gMCAmJiAobGluZVtsZW4tMV0gPT0gJ1xuJyB8fCBsaW5lW2xlbi0xXSA9PSAnXHInKSkKKyAgICAgICAgICAgICAgbGluZVstLWxlbl0gPSBOVUw7ICAgICAgICAvKiBDaG9wIG9mZiB0ZXJtaW5hdG9ycyAqLworICAgICAgICAgICAgbWF0Y2ggPSBja21hdGNoKHAsbGluZSxncl9jYXNlLDErNCk7IC8qIE1hdGNoIGFnYWluc3QgcGF0dGVybiAqLworICAgICAgICAgICAgaWYgKGdyX25vbWEpICAgICAgICAgICAgICAgIC8qIEludmVydCBtYXRjaCBzZW5zZSBpZiByZXF1ZXN0ZWQgKi8KKyAgICAgICAgICAgICAgbWF0Y2ggPSAhbWF0Y2g7CisgICAgICAgICAgICBpZiAobWF0Y2gpIHsgICAgICAgICAgICAgICAgLyogSGF2ZSBhIG1hdGNoaW5nIGxpbmUgKi8KKyAgICAgICAgICAgICAgICBtYysrOyAgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBtYXRjaCBjb3VudCAqLworICAgICAgICAgICAgICAgIGNvdW50Kys7ICAgICAgICAgICAgICAgIC8qIE1hdGNoIGNvdW50IHRoaXMgZmlsZSAqLworICAgICAgICAgICAgICAgIGlmIChncl9uYW1lKSB7ICAgICAgICAgIC8qIERvbid0IGNhcmUgaG93IG1hbnkgbGluZXMgbWF0Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAvKiBDbG9zZSB0aGUgZmlsZSAqLworICAgICAgICAgICAgICAgICAgICBmcCA9IE5VTEw7ICAgICAgICAgIC8qIGFuZCBxdWl0IHRoZSBsaW5lLXJlYWRpbmcgbG9vcC4gKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChncl9jb3VuIHx8IGdyX25vbGkpIC8qIE5vdCBsaXN0aW5nIGVhY2ggbGluZSAqLworICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgIC8qIHNvIGRvbid0IHByaW50IGFueXRoaW5nIG5vdy4gKi8KKyAgICAgICAgICAgICAgICBpZiAod2lsZCkgewkJLyogSWYgc2VhcmNoaW5nIG11bHRpcGxlIGZpbGVzICovCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYob2ZwLCIlczoiLG5hbWUpOyAvKiBwcmludCBmaWxlbmFtZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgbGVuICs9IChpbnQpc3RybGVuKG5hbWUpICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdyX251bXMpIHsgICAgICAgICAgLyogSWYgbGluZSBudW1iZXJzIHdhbnRlZCAqLworICAgICAgICAgICAgICAgICAgICBjaGFyIG5idWZbMzJdOworICAgICAgICAgICAgICAgICAgICBsZW4gKz0gY2ttYWttc2cobmJ1ZiwzMixja2l0b2EoZmxpbmUpLCI6IixOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG9mcCwiJXMiLG5idWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY21kX3Jvd3MgPiAwICYmIGNtZF9jb2xzID4gMCkKKyAgICAgICAgICAgICAgICAgIHNsaW5lICs9IChsZW4gLyBjbWRfY29scykgKyAxOworICAgICAgICAgICAgICAgIGZwcmludGYob2ZwLCIlc1xuIixsaW5lKTsgLyogUHJpbnQgdGhlIGxpbmUuICovCisgICAgICAgICAgICAgICAgaWYgKHNsaW5lID4gY21kX3Jvd3MgLSAzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYXNrbW9yZSgpKSBnb3RvIHhncmVwOyBlbHNlIHNsaW5lID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFncl9ub2xpKSB7CQkJLyogSWYgbm90IG5vdCBsaXN0aW5nLi4uICovCisgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgIGlmIChncl9jb3VuKSB7ICAgICAgICAgICAgICAvKiBTaG93IG1hdGNoIGNvdW50IG9ubHkgKi8KKyAgICAgICAgICAgICAgICBmcHJpbnRmKG9mcCwiJXM6JWRcbiIsbmFtZSxjb3VudCk7CisgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgfSBlbHNlIGlmIChncl9uYW1lICYmIGNvdW50ID4gMCkgeyAvKiBTaG93IG5hbWUgb25seSAqLworICAgICAgICAgICAgICAgIGZwcmludGYob2ZwLCIlc1xuIixuYW1lKTsKKyAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKytzbGluZSA+IGNtZF9yb3dzIC0gMykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWFza21vcmUoKSkgZ290byB4Z3JlcDsgZWxzZSBzbGluZSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJpZ2NvdW50ICs9IGNvdW50OyAgICAgICAgICAgICAgLyogT3ZlcmFsbCBjb3VudCAqLworICAgIH0KKyAgeGdyZXA6CisjaWZuZGVmIE5PU1BMCisgICAgaWYgKGdyX2NvdW4gJiYgY3YpIHsgICAgICAgICAgICAgICAgLyogL0NPVU5UOmJsYWggKi8KKyAgICAgICAgYWRkbWFjKGN2LGNraXRvYShiaWdjb3VudCkpOyAgICAvKiBzZXQgdGhlIHZhcmlhYmxlICovCisgICAgICAgIG1ha2VzdHIoJmN2LE5VTEwpOyAgICAgICAgICAgICAgLyogZnJlZSB0aGlzICovCisgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgaWYgKGZwKSBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgLyogY2xvc2UgaW5wdXQgZmlsZSBpZiBzdGlsbCBvcGVuICovCisgICAgaWYgKG9mcCAhPSBzdGRvdXQpIHsgICAgICAgICAgICAgICAgLyogQ2xvc2UgYW55IG91dHB1dCBmaWxlICovCisgICAgICAgIGlmIChvZnApIGZjbG9zZShvZnApOworICAgICAgICBvZnAgPSBzdGRvdXQ7CisgICAgfQorICAgIHJldHVybihzdWNjZXNzID0gbWMgPyAxIDogMCk7Cit9CisKKy8qIFN5c3RlbS1pbmRlcGVuZGVudCBkaXJlY3RvcnkgKi8KKworc3RhdGljIGNoYXIgKiogZGlybGlzdCA9IE5VTEw7CitzdGF0aWMgaW50IG5kaXJsaXN0ID0gMDsKKworc3RhdGljIFZPSUQKK2ZyZWVkaXJsaXN0KCkgeworICAgIGlmIChkaXJsaXN0KSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmRpcmxpc3Q7IGkrKykgeworICAgICAgICAgICAgaWYgKGRpcmxpc3RbaV0pCisgICAgICAgICAgICAgIGZyZWUoZGlybGlzdFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZSgoY2hhciAqKWRpcmxpc3QpOworICAgICAgICBkaXJsaXN0ID0gTlVMTDsKKyAgICB9CisgICAgbmRpcmxpc3QgPSAwOworfQorCitzdGF0aWMgc3RydWN0IGtleXRhYiBkaXJzd3RhYltdID0geyAgICAgLyogRElSRUNUT1JZIGNvbW1hbmQgc3dpdGNoZXMgKi8KKyAgICB7ICIvYWZ0ZXIiLCAgICAgICBESVJfQUZULCBDTV9BUkcgfSwKKyAgICB7ICIvYWxsIiwgICAgICAgICBESVJfQUxMLCAwIH0sCisjaWZuZGVmIE5PU1BMCisgICAgeyAiL2FycmF5IiwgICAgICAgRElSX0FSUiwgQ01fQVJHIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICB7ICIvYXNjZW5kaW5nIiwgICBESVJfQVNDLCAwIH0sCisgICAgeyAiL2JhY2t1cCIsICAgICAgRElSX0JVUCwgMCB9LAorICAgIHsgIi9iZWZvcmUiLCAgICAgIERJUl9CRUYsIENNX0FSRyB9LAorICAgIHsgIi9icmllZiIsICAgICAgIERJUl9CUkYsIDAgfSwKKyAgICB7ICIvZGVzY2VuZGluZyIsICBESVJfRFNDLCBDTV9JTlYgfSwKKyAgICB7ICIvZGlyZWN0b3JpZXMiLCBESVJfRElSLCAwIH0sCisgICAgeyAiL2RvdGZpbGVzIiwgICAgRElSX0RPVCwgMCB9LAorICAgIHsgIi9lbmdsaXNoZGF0ZSIsIERJUl9EQVQsIDAgfSwKKyAgICB7ICIvZXhjZXB0IiwgICAgICBESVJfRVhDLCBDTV9BUkcgfSwKKyAgICB7ICIvZmlsZXMiLCAgICAgICBESVJfRklMLCAwIH0sCisgICAgeyAiL2hlYWRpbmciLCAgICAgRElSX0hERywgMCB9LAorICAgIHsgIi9pc29kYXRlIiwgICAgIERJUl9JU08sIDAgfSwKKyAgICB7ICIvbGFyZ2VyLXRoYW4iLCBESVJfTEFSLCBDTV9BUkcgfSwKKyNpZmRlZiBDS1NZTUxJTksKKyAgICB7ICIvZm9sbG93bGlua3MiLCBESVJfTE5LLCAwIH0sCisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisgICAgeyAiL21lc3NhZ2UiLCAgICAgRElSX01TRywgQ01fQVJHIH0sCisgICAgeyAiL25vYmFja3VwZmlsZXMiLERJUl9OT0IsIDAgfSwKKyAgICB7ICIvbm9kb3RmaWxlcyIsICBESVJfTk9ELCAwIH0sCisjaWZkZWYgQ0tTWU1MSU5LCisgICAgeyAiL25vZm9sbG93bGlua3MiLERJUl9OTEssIDAgfSwKKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKyAgICB7ICIvbm9oZWFkaW5nIiwgICBESVJfTk9ILCAwIH0sCisgICAgeyAiL25vbWVzc2FnZSIsICAgRElSX05PTSwgMCB9LAorI2lmZGVmIENLX1RUR1dTSVoKKyAgICB7ICIvbm9wYWdlIiwgICAgICBESVJfTk9QLCAwIH0sCisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworI2lmZGVmIFJFQ1VSU0lWRQorICAgIHsgIi9ub3JlY3Vyc2l2ZSIsIERJUl9OT1IsIDAgfSwKKyNlbHNlCisjaWZkZWYgVk1TCisgICAgeyAiL25vcmVjdXJzaXZlIiwgRElSX05PUiwgMCB9LAorI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgIHsgIi9ub3JlY3Vyc2l2ZSIsIERJUl9OT1IsIDAgfSwKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworICAgIHsgIi9ub3NvcnQiLCAgICAgIERJUl9OT1MsIDAgfSwKKyAgICB7ICIvbm90LWFmdGVyIiwgICBESVJfTkFGLCBDTV9BUkcgfSwKKyAgICB7ICIvbm90LWJlZm9yZSIsICBESVJfTkJGLCBDTV9BUkcgfSwKKyAgICB7ICIvbm90LXNpbmNlIiwgICBESVJfTkFGLCBDTV9JTlZ8Q01fQVJHIH0sCisgICAgeyAiL25veGZlcm1vZGUiLCAgRElSX05PVCwgMCB9LAorICAgIHsgIi9vdXRwdXQiLCAgICAgIERJUl9PVVQsIENNX0FSRyB9LAorI2lmZGVmIENLX1RUR1dTSVoKKyAgICB7ICIvcGFnZSIsICAgICAgICBESVJfUEFHLCAwIH0sCisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworI2lmZGVmIFJFQ1VSU0lWRQorICAgIHsgIi9yZWN1cnNpdmUiLCAgIERJUl9SRUMsIDAgfSwKKyNlbHNlCisjaWZkZWYgVk1TCisgICAgeyAiL3JlY3Vyc2l2ZSIsICAgRElSX1JFQywgMCB9LAorI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgIHsgIi9yZWN1cnNpdmUiLCAgIERJUl9SRUMsIDAgfSwKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworICAgIHsgIi9yZXZlcnNlIiwgICAgIERJUl9EU0MsIDAgfSwKKyAgICB7ICIvc2luY2UiLCAgICAgICBESVJfQUZULCBDTV9BUkd8Q01fSU5WIH0sCisgICAgeyAiL3NtYWxsZXItdGhhbiIsRElSX1NNQSwgQ01fQVJHIH0sCisgICAgeyAiL3NvcnQiLCAgICAgICAgRElSX1NSVCwgQ01fQVJHIH0sCisgICAgeyAiL3N1bW1hcnkiLCAgICAgRElSX1NVTSwgMCB9LAorICAgIHsgIi90eXBlIiwgICAgICAgIERJUl9CSU4sIENNX0FSRyB9LAorICAgIHsgIi94ZmVybW9kZSIsICAgIERJUl9UWVAsIDAgfSwKKyAgICB7ICIvdmVyYm9zZSIsICAgICBESVJfVlJCLCAwIH0sCisgICAgeyAiIiwwLDAgfQorfTsKK3N0YXRpYyBpbnQgbmRpcnN3dGFiID0gKHNpemVvZihkaXJzd3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgZGlyc29ydFtdID0geyAgICAgIC8qIERJUkVDVE9SWSAvU09SVDogb3B0aW9ucyAqLworICAgIHsgImRhdGUiLCAgICAgICAgIERJUlNfRFQsIDAgfSwKKyAgICB7ICJuYW1lIiwgICAgICAgICBESVJTX05NLCAwIH0sCisgICAgeyAic2l6ZSIsICAgICAgICAgRElSU19TWiwgMCB9Cit9Oworc3RhdGljIGludCBuZGlyc29ydCA9IChzaXplb2YoZGlyc29ydCkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdGF0aWMgaW50IGRpcl9kYXRlID0gLTE7ICAgICAgICAgICAgICAgLyogT3B0aW9uIGRlZmF1bHRzICgtMSBtZWFucyBub25lKSAqLworc3RhdGljIGludCBkaXJfcGFnZSA9IC0xOworc3RhdGljIGludCBkaXJfdmVyYiA9ICAxOworc3RhdGljIGludCBkaXJfbXNnICA9IC0xOworI2lmZGVmIFZNUworc3RhdGljIGludCBkaXJfc29ydCA9IC0xOyAgICAgICAgICAgICAgIC8qIE5hbWVzIGFyZSBhbHJlYWR5IHNvcnRlZCBpbiBWTVMgKi8KK3N0YXRpYyBpbnQgZGlyX3J2cnMgPSAtMTsKKyNlbHNlCitzdGF0aWMgaW50IGRpcl9zb3J0ID0gIDE7ICAgICAgICAgICAgICAgLyogU29ydCBieSBkZWZhdWx0ICovCitzdGF0aWMgaW50IGRpcl9ydnJzID0gIDA7ICAgICAgICAgICAgICAgLyogTm90IGluIHJldmVyc2UgKi8KKyNlbmRpZiAvKiBWTVMgKi8KK3N0YXRpYyBpbnQgZGlyX3NrZXkgPSBESVJTX05NOyAgICAgICAgICAvKiBCeSBuYW1lICovCisjaWZkZWYgUkVDVVJTSVZFCitzdGF0aWMgaW50IGRpcl9yZWN1ID0gLTE7CisjZW5kaWYgLyogUkVDVVJTSVZFICovCitzdGF0aWMgaW50IGRpcl9tb2RlID0gLTE7CitzdGF0aWMgaW50IGRpcl9zaG93ID0gLTE7ICAgICAgICAgICAgICAgLyogU2hvdyBhbGwgZmlsZXMgYnkgZGVmYXVsdCAqLworaW50IGRpcl9kb3RzID0gIC0xOwkJCS8qIEV4Y2VwdCBkb3QgZmlsZXMgKi8KK2ludCBkaXJfYmFjayA9ICAxOworaW50IGRpcl9oZWFkID0gIDA7CitzdGF0aWMgY2hhciAqIGRpcm1zZyA9IE5VTEw7CitzdGF0aWMgaW50IGRpcm1zZ2xlbiA9IDA7CisKKyNpZm5kZWYgTk9TSE9XCitWT0lECitzaG93ZGlyb3B0cygpIHsKKyAgICBpbnQgeCA9IDA7CisgICAgZXh0ZXJuIGludCBvcHRsaW5lczsKKyAgICBwcnRvcHQoJm9wdGxpbmVzLCJESVJFQ1RPUlkiKTsKKyAgICBpZiAoZGlyX3Nob3cgPiAwKSB7CisgICAgICAgIHBydG9wdCgmb3B0bGluZXMsKGRpcl9zaG93ID09IDEpID8gIi9GSUxFUyIgOgorICAgICAgICAgICAgICAgKChkaXJfc2hvdyA9PSAyKSA/ICIvRElSRUNUT1JJRVMiIDogIi9BTEwiKSk7CisgICAgICAgIHgrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBwcnRvcHQoJm9wdGxpbmVzLCIvQUxMIik7CisgICAgICAgIHgrKzsKKyAgICB9CisgICAgaWYgKGRpcl92ZXJiID4gLTEpIHsKKyAgICAgICAgcHJ0b3B0KCZvcHRsaW5lcyxkaXJfdmVyYiA/ICIvVkVSQk9TRSIgOiAiL0JSSUVGIik7CisgICAgICAgIHgrKzsKKyAgICB9CisgICAgaWYgKGRpcl9wYWdlID4gLTEpIHsKKyAgICAgICAgcHJ0b3B0KCZvcHRsaW5lcyxkaXJfcGFnZSA/ICIvUEFHRSIgOiAiL05PUEFHRSIpOworICAgICAgICB4Kys7CisgICAgfQorICAgIGlmIChkaXJfZGF0ZSA+IC0xKSB7CisgICAgICAgIHBydG9wdCgmb3B0bGluZXMsZGlyX2RhdGUgPyAiL0VOR0xJU0hEQVRFIiA6ICIvSVNPREFURSIpOworICAgICAgICB4Kys7CisgICAgfQorICAgIGlmIChkaXJfZG90cyA+IC0xKSB7CisgICAgICAgIHBydG9wdCgmb3B0bGluZXMsZGlyX2RvdHMgPyAiL0RPVEZJTEVTIiA6ICIvTk9ET1RGSUxFUyIpOworICAgICAgICB4Kys7CisgICAgfQorICAgIGlmIChkaXJfYmFjayA+IC0xKSB7CisgICAgICAgIHBydG9wdCgmb3B0bGluZXMsZGlyX2JhY2sgPyAiL0JBQ0tVUCIgOiAiL05PQkFDS1VQIik7CisgICAgICAgIHgrKzsKKyAgICB9CisgICAgaWYgKGRpcl9oZWFkID4gLTEpIHsKKyAgICAgICAgcHJ0b3B0KCZvcHRsaW5lcyxkaXJfaGVhZCA/ICIvSEVBRElORyIgOiAiL05PSEVBRElORyIpOworICAgICAgICB4Kys7CisgICAgfQorI2lmZGVmIFJFQ1VSU0lWRQorICAgIGlmIChkaXJfcmVjdSA+IC0xKSB7CisgICAgICAgIHBydG9wdCgmb3B0bGluZXMsZGlyX3JlY3UgPyAiL1JFQ1VSU0lWRSIgOiAiL05PUkVDVVJTSVZFIik7CisgICAgICAgIHgrKzsKKyAgICB9CisjZW5kaWYgLyogUkVDVVJTSVZFICovCisgICAgaWYgKGRpcl9tb2RlID4gLTEpIHsKKyAgICAgICAgcHJ0b3B0KCZvcHRsaW5lcyxkaXJfbW9kZSA/ICIvWEZFUk1PREUiIDogIi9OT1hGRVJNT0RFIik7CisgICAgICAgIHgrKzsKKyAgICB9CisgICAgaWYgKGRpcl9zb3J0ID09IDApIHsKKyAgICAgICAgeCsrOworICAgICAgICBwcnRvcHQoJm9wdGxpbmVzLCIvTk9TT1JUICIpOworICAgIH0gZWxzZSBpZiAoZGlyX3NvcnQgPiAwKSB7CisgICAgICAgIHgrKzsKKyAgICAgICAgaWYgKGRpcl9za2V5ID09IERJUlNfTk0pIHMgPSAiL1NPUlQ6TkFNRSI7CisgICAgICAgIGVsc2UgaWYgKGRpcl9za2V5ID09IERJUlNfU1opIHMgPSAiL1NPUlQ6U0laRSI7CisgICAgICAgIGVsc2UgaWYgKGRpcl9za2V5ID09IERJUlNfRFQpIHMgPSAiL1NPUlQ6REFURSI7CisgICAgICAgIHBydG9wdCgmb3B0bGluZXMscyk7CisgICAgfQorICAgIGlmIChkaXJfcnZycyA+IC0xKSB7CisgICAgICAgIHBydG9wdCgmb3B0bGluZXMsZGlyX3J2cnMgPyAiL1JFVkVSU0UiIDogIi9BU0NFTkRJTkciKTsKKyAgICAgICAgeCsrOworICAgIH0KKyAgICBpZiAoZGlyX21zZyA+IC0xKSB7CisgICAgICAgIGlmIChkaXJfbXNnID09IDApIHsKKyAgICAgICAgICAgIHBydG9wdCgmb3B0bGluZXMsIi9OT01FU1NBR0UiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNrbWFrbXNnKHRtcGJ1ZixUTVBCVUZTSVosIi9NRVNTQUdFOnsiLGRpcm1zZywifSIsTlVMTCk7CisgICAgICAgICAgICBwcnRvcHQoJm9wdGxpbmVzLHRtcGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgeCsrOworICAgIH0KKyAgICBpZiAoIXgpIHBydG9wdCgmb3B0bGluZXMsIihubyBvcHRpb25zIHNldCkiKTsKKyAgICBwcnRvcHQoJm9wdGxpbmVzLCIiKTsKK30KKyNlbmRpZiAvKiBOT1NIT1cgKi8KKworaW50CitzZXRkaXJvcHRzKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IERJUkVDVE9SWSBvcHRpb24gZGVmYXVsdHMgKi8KKyAgICBpbnQgeGIgPSAtMSwgeHYgPSAtMSwgeHAgPSAtMSwgeGQgPSAtMSwgeGggPSAtMSwgeGYgPSAtMTsKKyAgICBpbnQgeGsgPSAtMSwgeHIgPSAtMSwgeHMgPSAtMSwgeHggPSAtMSwgeG0gPSAtMSwgeGEgPSAtMSwgeGcgPSAtMTsKKyAgICBpbnQgZ2V0dmFsOworICAgIGNoYXIgYzsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoKHkgPSBjbXN3aShkaXJzd3RhYixuZGlyc3d0YWIsIlN3aXRjaCIsIiIseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgIGlmICh5ID09IC0zKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICB9CisgICAgICAgIGMgPSBjbWdicmsoKTsKKyAgICAgICAgaWYgKChnZXR2YWwgPSAoYyA9PSAnOicgfHwgYyA9PSAnPScpKSAmJiAhKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIGlmICghZ2V0dmFsICYmIChjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgY2FzZSBESVJfQlJGOiB4diA9IDA7IGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX1ZSQjogeHYgPSAxOyBicmVhazsKKyAgICAgICAgICBjYXNlIERJUl9QQUc6IHhwID0gMTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfTk9QOiB4cCA9IDA7IGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX0lTTzogeGQgPSAwOyBicmVhazsKKyAgICAgICAgICBjYXNlIERJUl9EQVQ6IHhkID0gMTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfSERHOiB4aCA9IDE7IGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX05PSDogeGggPSAwOyBicmVhazsKKyAgICAgICAgICBjYXNlIERJUl9ET1Q6IHhmID0gMTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfTk9EOiB4ZiA9IDA7IGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX0FMTDogeGEgPSAzOyBicmVhazsKKyAgICAgICAgICBjYXNlIERJUl9ESVI6IHhhID0gMjsgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfRklMOiB4YSA9IDE7IGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX1NSVDoKKyAgICAgICAgICAgIHggPSBESVJTX05NOworICAgICAgICAgICAgaWYgKGdldHZhbCkKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkoZGlyc29ydCxuZGlyc29ydCwiU29ydCBrZXkiLCJuYW1lIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICB4ayA9IHg7CisgICAgICAgICAgICB4cyA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERJUl9OT1M6IHhzID0gMDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfQVNDOiB4eCA9IDA7IGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX0RTQzogeHggPSAxOyBicmVhazsKKyAgICAgICAgICBjYXNlIERJUl9SRUM6IHhyID0gMTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfTk9SOiB4ciA9IDA7IGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX1RZUDogeG0gPSAxOyBicmVhazsKKyAgICAgICAgICBjYXNlIERJUl9OT1Q6IHhtID0gMDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfQlVQOiB4YiA9IDE7IGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX05PQjogeGIgPSAwOyBicmVhazsKKyAgICAgICAgICBjYXNlIERJUl9OT006IHhnID0gMDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfTVNHOgorICAgICAgICAgICAgaWYgKGdldHZhbCkKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21mbGQoIk1lc3NhZ2UgdG8gYXBwZW5kIHRvIGVhY2ggbGluZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIHhnID0gMTsKKyAgICAgICAgICAgIGNrc3RybmNweSh0bXBidWYsYnJzdHJpcChzKSxUTVBCVUZTSVopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZigiP1RoaXMgb3B0aW9uIGNhbiBub3QgYmUgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSAgICAgICAgICAgICAgLyogR2V0IGNvbmZpcm1hdGlvbiAqLworICAgICAgcmV0dXJuKHgpOworICAgIGlmICh4diA+IC0xKSBkaXJfdmVyYiA9IHh2OyAgICAgICAgIC8qIENvbmZpcm1lZCwgc2F2ZSBkZWZhdWx0cyAqLworICAgIGlmICh4cCA+IC0xKSBkaXJfcGFnZSA9IHhwOworICAgIGlmICh4ZCA+IC0xKSBkaXJfZGF0ZSA9IHhkOworICAgIGlmICh4aCA+IC0xKSBkaXJfaGVhZCA9IHhoOworICAgIGlmICh4cyA+IC0xKSBkaXJfc29ydCA9IHhzOworICAgIGlmICh4ayA+IC0xKSBkaXJfc2tleSA9IHhrOworICAgIGlmICh4eCA+IC0xKSBkaXJfcnZycyA9IHh4OworICAgIGlmICh4ZiA+IC0xKSBkaXJfZG90cyA9IHhmOworICAgIGlmICh4YSA+IC0xKSBkaXJfc2hvdyA9IHhhOworICAgIGlmICh4bSA+IC0xKSBkaXJfbW9kZSA9IHhtOworICAgIGlmICh4YiA+IC0xKSBkaXJfYmFjayA9IHhiOworI2lmZGVmIFJFQ1VSU0lWRQorICAgIGlmICh4ciA+IC0xKSBkaXJfcmVjdSA9IHhyOworI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworICAgIGlmICh4ZyA+IC0xKSBkaXJfbXNnICA9IHhnOworICAgIGlmICh4ZyA+IDApCisgICAgICBtYWtlc3RyKCZkaXJtc2csdG1wYnVmKTsKKyAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworfQorCitpbnQKK2RvbXlkaXIoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlcm5hbCBESVJFQ1RPUlkgY29tbWFuZCAqLworICAgIGV4dGVybiBjaGFyICptb250aHNbXTsKKyNpZmRlZiBWTVMKKyAgICBfUFJPVE9UWVAoIGNoYXIgKiB6cmVsbmFtZSwgKGNoYXIgKixjaGFyICopICk7CisgICAgY2hhciAqIGNkcCA9IE5VTEw7CisjZW5kaWYgLyogVk1TICovCisKKyAgICBjaGFyIG5hbWVbQ0tNQVhQQVRIKzFdLCBvdXRmaWxlW0NLTUFYUEFUSCsxXSwgKnAgPSBOVUxMLCBjID0gTlVMOworICAgIGNoYXIgbGluZWJ1ZltDS01BWFBBVEgrMjU2XTsKKyAgICBjaGFyICogbXN0ciA9IE5VTEwsICogZHN0ciA9IE5VTEwsICogczIgPSBOVUxMOworICAgIGxvbmcgbGVuID0gMCwgbmRpcnMgPSAwLCBuZmlsZXMgPSAwLCBuYnl0ZXMgPSAwLCBubWF0Y2hlcyA9IDA7CisgICAgaW50IHZlcmJvc2UgPSAwLCB3aWxkID0gMCwgcGFnZSA9IDAsIG4gPSAwLCBlbmdkYXRlID0gMCwgc3VtbWFyeSA9IDA7CisgICAgaW50IGhlYWRpbmcgPSAwLCB4c29ydCA9IDAsIHJldmVyc2UgPSAwLCBzb3J0YnkgPSAwLCBtc2cgPSAwOworICAgIGludCBrLCBpID0gMCwgeCA9IDAsIG54ID0gMCwgc2tleSA9IDAsIGRsZW4gPSAwLCBpdHNhZGlyID0gMDsKKyAgICBpbnQgc2hvdyA9IDMsIHhmZXJtb2QgPSAwLCBiYWNrdXAgPSAxLCByYyA9IDAsIGdldHZhbCA9IDA7CisgICAgaW50IGZzID0gMDsKKyAgICBpbnQgbXVsdGlwbGUgPSAwOworICAgIGludCBjbWlmbjEgPSAxLCBjbWlmbjIgPSAwOworICAgIGxvbmcgbWluc2l6ZSA9IC0xTCwgbWF4c2l6ZSA9IC0xTDsKKyAgICBzdHJ1Y3QgRkRCIHN3LCBmaSwgZmw7CisgICAgY2hhciBkYnVmWzMyXSwgeGJ1ZlszMl07CisKKyNpZm5kZWYgTk9TUEwKKyAgICBjaGFyIGFycmF5ID0gTlVMOworICAgIGNoYXIgKiogYXAgPSBOVUxMOworI2VuZGlmIC8qIE5PU1BMICovCisgICAgY2hhcgorICAgICAgKiBkaXJfYWZ0ID0gTlVMTCwKKyAgICAgICogZGlyX2JlZiA9IE5VTEwsCisgICAgICAqIGRpcl9uYWYgPSBOVUxMLAorICAgICAgKiBkaXJfbmJmID0gTlVMTCwKKyAgICAgICogZGlyX2V4YyA9IE5VTEw7CisgICAgY2hhciAqIHhsaXN0WzE2XTsKKworICAgIGdfbWF0Y2hkb3QgPSBtYXRjaGRvdDsgICAgICAgICAgICAgIC8qIFNhdmUgZ2xvYmFsIG1hdGNoZG90IHNldHRpbmcgKi8KKyAgICBub2xpbmtzID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaXQgc2hvdWxkIGFscmVhZHkgYmUgMikgKi8KKyAgICBvdXRmaWxlWzBdID0gTlVMOyAgICAgICAgICAgICAgICAgICAvKiBObyBvdXRwdXQgZmlsZSB5ZXQgKi8KKworICAgIGlmIChvZnAgIT0gc3Rkb3V0KSB7ICAgICAgICAgICAgICAgIC8qIEluIGNhc2Ugb2YgcHJldmlvdXMgaW50ZXJydXB0aW9uICovCisgICAgICAgIGlmIChvZnApIGZjbG9zZShvZnApOworICAgICAgICBvZnAgPSBzdGRvdXQ7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB4bGlzdFtpXSA9IE5VTEw7CisKKyAgICBuYW1lWzBdID0gTlVMOworICAgIGZyZWVkaXJsaXN0KCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIEluIGNhc2Ugbm90IGZyZWVkIGxhc3QgdGltZSAqLworICAgIHBhZ2UgICAgICA9IGRpcl9wYWdlID4gLTEgPyBkaXJfcGFnZSA6IHhhc2ttb3JlOyAvKiBTZXQgb3B0aW9uIGRlZmF1bHRzICovCisgICAgZW5nZGF0ZSAgID0gZGlyX2RhdGUgPiAtMSA/IGRpcl9kYXRlIDogMDsKKyAgICB2ZXJib3NlICAgPSBkaXJfdmVyYiA+IC0xID8gZGlyX3ZlcmIgOiAxOworICAgIGhlYWRpbmcgICA9IGRpcl9oZWFkID4gLTEgPyBkaXJfaGVhZCA6IDA7CisgICAgeHNvcnQgICAgID0gZGlyX3NvcnQgPiAtMSA/IGRpcl9zb3J0IDogMDsKKyAgICBzb3J0YnkgICAgPSBkaXJfc2tleSA+IC0xID8gZGlyX3NrZXkgOiAwOworICAgIHJldmVyc2UgICA9IGRpcl9ydnJzID4gLTEgPyBkaXJfcnZycyA6IDA7CisgICAgbXNnICAgICAgID0gZGlyX21zZyAgPiAtMSA/IGRpcl9tc2cgIDogMDsKKyNpZmRlZiBVTklYT1JPU0sKKyAgICBpZiAoZGlyX2RvdHMgPiAtMSkgbWF0Y2hkb3QgPSBkaXJfZG90czsKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyAgICB4ZmVybW9kICAgPSBkaXJfbW9kZSA+IC0xID8gZGlyX21vZGUgOiAwOworICAgIGJhY2t1cCAgICA9IGRpcl9iYWNrID4gLTEgPyBkaXJfYmFjayA6IDE7CisjaWZkZWYgUkVDVVJTSVZFCisgICAgcmVjdXJzaXZlID0gZGlyX3JlY3UgPiAtMSA/IGRpcl9yZWN1IDogMDsKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICBzaG93ICAgICAgPSBkaXJfc2hvdyA+IC0xID8gZGlyX3Nob3cgOiAzOworCisjaWZkZWYgQ0tfVFRHV1NJWgorI2lmZGVmIE9TMgorICAgIHR0Z2N3c3ooKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNjcmVlbiBsZW5ndGggZm9yIG1vcmUtcHJvbXB0aW5nICovCisjZWxzZSAvKiBPUzIgKi8KKyAgICAvKiBDaGVjayB3aGV0aGVyIHdpbmRvdyBzaXplIGNoYW5nZWQgKi8KKyAgICBpZiAodHRnd3NpeigpID4gMCkgeworICAgICAgICBpZiAodHRfcm93cyA+IDAgJiYgdHRfY29scyA+IDApIHsKKyAgICAgICAgICAgIGNtZF9yb3dzID0gdHRfcm93czsKKyAgICAgICAgICAgIGNtZF9jb2xzID0gdHRfY29sczsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisKKyAgICBkaXJhY3RpdmUgPSAxOworICAgIGNtaWZuMSA9IG5vbGlua3MgfCAxOyAgICAgICAgICAgICAgIC8qIDEgPSBmaWxlcyBvciBkaXJlY3RvcmllcyAqLworICAgIGNtaWZuMiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgPSBub3QgZGlyZWN0b3JpZXMgb25seSAqLworCisgIGFnYWluOgorCisgICAgY21mZGJpKCZzdywgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgRkRCIC0gY29tbWFuZCBzd2l0Y2hlcyAqLworICAgICAgICAgICBfQ01LRVksICAgICAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICJFbnRlciBvciBSZXR1cm4gdG8gY29uZmlybSB0aGUgY29tbWFuZCwgb3JcblwKKyBmaWxlIHNwZWNpZmljYXRpb24sIG9yIHN3aXRjaCIsCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIG5kaXJzd3RhYiwgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgZGlyc3d0YWIsICAgICAgICAgICAgICAgICAgICAvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgICAgICZmaSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICApOworICAgIGNtZmRiaSgmZmksICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDJuZCBGREIgLSBmaWxlc3BlYyB0byBtYXRjaCAqLworICAgICAgICAgICBfQ01JRkksICAgICAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICJGaWxlIHNwZWNpZmljYXRpb24iLCAgICAgICAgLyogaGxwbXNnICovCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgICAgIisiLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IGZpbGVzcGVjIGlzIHdpbGRjYXJkICovCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhhdCBtYXRjaGVzIGFsbCBmaWxlcy4uLiAqLworI2lmZGVmIFZNUworICAgICAgICAgICAiKi4qIiwKKyNlbHNlCisgICAgICAgICAgICIqIiwKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIGNtaWZuMSwKKyAgICAgICAgICAgY21pZm4yLCAgICAgICAgICAgICAgICAgICAgICAvKiAxID0gb25seSBkaXJzOyAwIGZpbGVzIG9yIGRpcnMgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsCisgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICZmbAorICAgICAgICAgICApOworICAgIGNtZmRiaSgmZmwsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFueXRoaW5nIHRoYXQgZG9lc24ndCBtYXRjaCAqLworICAgICAgICAgICBfQ01GTEQsICAgICAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGxwbXNnICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworICAgICAgICAgICB4eHN0cmluZywKKyAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgTlVMTAorICAgICAgICAgICApOworICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIDAgb3IgbW9yZSBzd2l0Y2hlcyAqLworICAgICAgICB4ID0gY21mZGIoJnN3KTsgICAgICAgICAgICAgICAgIC8qIFBhcnNlIHNvbWV0aGluZyAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJkb215ZGlyIGNtZmRiIiwiIix4KTsKKyAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkgICAvKiBCcmVhayBvdXQgaWYgbm90IGEgc3dpdGNoICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGMgPSBjbWdicmsoKTsKKyAgICAgICAgaWYgKChnZXR2YWwgPSAoYyA9PSAnOicgfHwgYyA9PSAnPScpKSAmJiAhKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIGlmICghZ2V0dmFsICYmIChjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChrID0gY21yZXN1bHQubnJlc3VsdCkgeworICAgICAgICAgIGNhc2UgRElSX0JSRjogdmVyYm9zZSA9IDA7IGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX1ZSQjogdmVyYm9zZSA9IDE7IGJyZWFrOworI2lmZGVmIENLX1RUR1dTSVoKKyAgICAgICAgICBjYXNlIERJUl9QQUc6IHBhZ2UgPSAxOyAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERJUl9OT1A6IHBhZ2UgPSAwOyAgICBicmVhazsKKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisgICAgICAgICAgY2FzZSBESVJfSVNPOiBlbmdkYXRlID0gMDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfREFUOiBlbmdkYXRlID0gMTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfSERHOiBoZWFkaW5nID0gMTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfTk9IOiBoZWFkaW5nID0gMDsgYnJlYWs7CisjaWZkZWYgVU5JWE9ST1NLCisgICAgICAgICAgY2FzZSBESVJfRE9UOiBtYXRjaGRvdCA9IDE7IGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX05PRDogbWF0Y2hkb3QgPSAwOyBicmVhazsKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyAgICAgICAgICBjYXNlIERJUl9BTEw6CisgICAgICAgICAgICBzaG93ID0gMzsKKyAgICAgICAgICAgIGNtaWZuMSB8PSAxOworICAgICAgICAgICAgY21pZm4yID0gMDsKKyAgICAgICAgICAgIGdvdG8gYWdhaW47CisgICAgICAgICAgY2FzZSBESVJfRElSOgorICAgICAgICAgICAgc2hvdyA9IDI7CisgICAgICAgICAgICBjbWlmbjEgfD0gMTsKKyAgICAgICAgICAgIGNtaWZuMiA9IDE7CisgICAgICAgICAgICBnb3RvIGFnYWluOworICAgICAgICAgIGNhc2UgRElSX0ZJTDoKKyAgICAgICAgICAgIHNob3cgPSAxOworICAgICAgICAgICAgY21pZm4xICY9IH4oMSk7CisgICAgICAgICAgICBjbWlmbjIgPSAwOworICAgICAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICBjYXNlIERJUl9TUlQ6CisgICAgICAgICAgICB4ID0gRElSU19OTTsKKyAgICAgICAgICAgIGlmIChjID09ICc6JyB8fCBjID09ICc9JykKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkoZGlyc29ydCxuZGlyc29ydCwiU29ydCBrZXkiLCJuYW1lIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICB4c29ydCA9IDE7CisgICAgICAgICAgICBzb3J0YnkgPSB4OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIERJUl9CVVA6IGJhY2t1cCAgPSAxOyBmcysrOyAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX05PQjogYmFja3VwICA9IDA7IGZzKys7ICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIERJUl9OT1M6IHhzb3J0ID0gMDsgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX0FTQzogcmV2ZXJzZSA9IDA7ICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfRFNDOiByZXZlcnNlID0gMTsgICBicmVhazsKKyNpZmRlZiBSRUNVUlNJVkUKKyAgICAgICAgICBjYXNlIERJUl9SRUM6IHJlY3Vyc2l2ZSA9IDE7IGRpcmFjdGl2ZSA9IDE7IGJyZWFrOworICAgICAgICAgIGNhc2UgRElSX05PUjogcmVjdXJzaXZlID0gMDsgZGlyYWN0aXZlID0gMDsgYnJlYWs7CisjZW5kaWYgLyogUkVDVVJTSVZFICovCisgICAgICAgICAgY2FzZSBESVJfVFlQOiB4ZmVybW9kID0gMTsgICBicmVhazsKKyAgICAgICAgICBjYXNlIERJUl9OT1Q6IHhmZXJtb2QgPSAwOyAgIGJyZWFrOworCisjaWZkZWYgQ0tTWU1MSU5LCisgICAgICAgICAgY2FzZSBESVJfTE5LOiAgICAgICAgICAgICAgICAgLyogRm9sbG93IGxpbmtzICovCisgICAgICAgICAgICBub2xpbmtzID0gMDsKKyAgICAgICAgICAgIGNtaWZuMSAmPSB+KDIpOworICAgICAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICBjYXNlIERJUl9OTEs6ICAgICAgICAgICAgICAgICAvKiBEb24ndCBmb2xsb3cgbGlua3MgKi8KKyAgICAgICAgICAgIG5vbGlua3MgPSAyOworICAgICAgICAgICAgY21pZm4xICY9IH4oMik7CisgICAgICAgICAgICBnb3RvIGFnYWluOworI2VuZGlmIC8qIENLU1lNTElOSyAqLworCisgICAgICAgICAgY2FzZSBESVJfTk9NOiBtc2cgICAgID0gMDsgICBicmVhazsKKyAgICAgICAgICBjYXNlIERJUl9NU0c6CisgICAgICAgICAgICBpZiAoYyA9PSAnOicgfHwgYyA9PSAnPScpCisgICAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKCJNZXNzYWdlIHRvIGFwcGVuZCB0byBlYWNoIGxpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICBtc2cgPSAxOworICAgICAgICAgICAgY2tzdHJuY3B5KHRtcGJ1ZixicnN0cmlwKHMpLFRNUEJVRlNJWik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgRElSX1NNQToKKyAgICAgICAgICBjYXNlIERJUl9MQVI6CisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbW51bSgiRmlsZSBzaXplIGluIGJ5dGVzIiwiMCIsMTAsJnkseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIGZzKys7CisgICAgICAgICAgICBzaG93ID0gMTsKKyAgICAgICAgICAgIHN3aXRjaCAoY21yZXN1bHQubnJlc3VsdCkgeworICAgICAgICAgICAgICBjYXNlIERJUl9TTUE6IG1pbnNpemUgPSB5OyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBESVJfTEFSOiBtYXhzaXplID0geTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworI2lmbmRlZiBOT1NQTAorICAgICAgICAgIGNhc2UgRElSX0FSUjoKKyAgICAgICAgICAgIGlmIChjICE9ICc6JyAmJiBjICE9ICc9JykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0FycmF5IG5hbWUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiQXJyYXkgbmFtZSAoYSBzaW5nbGUgbGV0dGVyIHdpbGwgZG8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICApKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9BcnJheSBuYW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKnMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9BcnJheSBuYW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgczIgPSBzOworICAgICAgICAgICAgaWYgKCpzID09IENNRFEpIHMrKzsKKyAgICAgICAgICAgIGlmICgqcyA9PSAnJicpIHMrKzsKKyAgICAgICAgICAgIGlmICghaXNhbHBoYSgqcykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9CYWQgYXJyYXkgbmFtZSAtIFwiJXNcIlxuIixzMik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFycmF5ID0gKnMrKzsKKyAgICAgICAgICAgIGlmIChpc3VwcGVyKGFycmF5KSkgYXJyYXkgPSB0b2xvd2VyKGFycmF5KTsKKyAgICAgICAgICAgIGlmICgqcyAmJiAoKnMgIT0gJ1snIHx8ICoocysxKSAhPSAnXScpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/QmFkIGFycmF5IG5hbWUgLSBcIiVzXCJcbiIsczIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgIGNhc2UgRElSX0FGVDoKKyAgICAgICAgICBjYXNlIERJUl9CRUY6CisgICAgICAgICAgY2FzZSBESVJfTkFGOgorICAgICAgICAgIGNhc2UgRElSX05CRjoKKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtZGF0ZSgiRmlsZS10aW1lIiwiIiwmcywwLHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/RGF0ZS10aW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSAtOTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgIHJjID0geDsKKyAgICAgICAgICAgICAgICBnb3RvIHhkb215ZGlyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnMrKzsKKyAgICAgICAgICAgIHN3aXRjaCAoaykgeworICAgICAgICAgICAgICBjYXNlIERJUl9BRlQ6IG1ha2VzdHIoJmRpcl9hZnQscyk7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIERJUl9CRUY6IG1ha2VzdHIoJmRpcl9iZWYscyk7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIERJUl9OQUY6IG1ha2VzdHIoJmRpcl9uYWYscyk7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIERJUl9OQkY6IG1ha2VzdHIoJmRpcl9uYmYscyk7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJfRVhDOgorICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgaWYgKCh4ID0gY21mbGQoIlBhdHRlcm4iLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/UGF0dGVybiByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJjID0gLTk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICByYyA9IHg7CisgICAgICAgICAgICAgICAgZ290byB4ZG9teWRpcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZzKys7CisgICAgICAgICAgICBtYWtlc3RyKCZkaXJfZXhjLHMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIERJUl9TVU06CisgICAgICAgICAgICBzdW1tYXJ5ID0gMTsgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIERJUl9CSU46IHsKKyAgICAgICAgICAgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgdHh0YmluW107CisgICAgICAgICAgICAgIGV4dGVybiBpbnQgeGZpbGV0eXBlOworICAgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KHR4dGJpbiwzLCIiLCJhbGwiLHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICByYyA9IHg7CisgICAgICAgICAgICAgICAgICBnb3RvIHhkb215ZGlyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICh4ID09IDIpIHsKKyAgICAgICAgICAgICAgICAgIHhmaWxldHlwZSA9IC0xOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgeGZpbGV0eXBlID0geDsKKyAgICAgICAgICAgICAgICAgIGZzID0gMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBESVJfT1VUOgorICAgICAgICAgICAgaWYgKCh4ID0gY21vZmkoIkZpbGUgZm9yIGRpcmVjdG9yeSBsaXN0aW5nIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgY2tzdHJuY3B5KG91dGZpbGUscyxDS01BWFBBVEgrMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgbm90IGltcGxlbWVudGVkIHlldCAtIFwiJXNcIlxuIiwgYXRtYnVmKTsKKyAgICAgICAgICAgIGdvdG8geGRvbXlkaXI7CisgICAgICAgIH0KKyAgICB9CisgICAgY2tzdHJuY3B5KGxpbmUsY21yZXN1bHQuc3Jlc3VsdCxMSU5CVUZTSVopOyAvKiBTYWZlIGNvcHkgb2YgZmlsZXNwZWMgKi8KKworLyogXl5eIFNUQVJUIE1VTFRJUExFICovCisgICAgCisgICAgd2hpbGUgKDEpIHsKKwl4ID0gY21mbGQoIkFub3RoZXIgZmlsZXNwZWMgb3IgRW50ZXIiLCIiLCZzLHh4c3RyaW5nKTsKKwlpZiAoeCA9PSAtMykKKwkgIGJyZWFrOworCWlmICh4IDwgMCkKKwkgIHJldHVybih4KTsKKwlja3N0cm5jYXQobGluZSwiLCIsTElOQlVGU0laKTsKKwlja3N0cm5jYXQobGluZSxzLExJTkJVRlNJWik7CisJbXVsdGlwbGUrKzsKKyAgICB9CisgICAgY2ttYWttc2codG1wYnVmLFRNUEJVRlNJWiwieyIsbGluZSwifSIsTlVMTCk7CisgICAgY2tzdHJuY3B5KGxpbmUsdG1wYnVmLExJTkJVRlNJWik7CisgICAgY21yZXN1bHQubnJlc3VsdCA9IDE7CisgICAgY21yZXN1bHQuZmNvZGUgPSBfQ01JRkk7CisKKy8qIF5eXiBFTkQgTVVMVElQTEUgKi8KKworICAgIHMgPSBsaW5lOworCisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSAgICAgICAgICAgICAgLyogR2V0IGNvbmZpcm1hdGlvbiAqLworICAgICAgcmV0dXJuKHgpOworICAgIGlmIChjbXJlc3VsdC5mY29kZSAhPSBfQ01JRkkpIHsgICAgIC8qIE5vdGhpbmcgbWF0Y2hlZCAqLworICAgICAgICBjaGFyICogbTsKKyAgICAgICAgaWYgKCpzID09ICcvJykKKyNpZmRlZiBVTklYT1JPU0sKKyAgICAgICAgICBtID0gImRvZXMgbm90IG1hdGNoIHN3aXRjaCBvciBuYW1lIG9mIGFjY2Vzc2libGUgZmlsZSI7CisjZWxzZQorI2lmZGVmIE9TMgorICAgICAgICAgIG0gPSAiZG9lcyBub3QgbWF0Y2ggc3dpdGNoIG9yIG5hbWUgb2YgYWNjZXNzaWJsZSBmaWxlIjsKKyNlbHNlCisgICAgICAgICAgbSA9ICJubyBzd2l0Y2hlcyBtYXRjaCI7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVU5JWE9ST1NYICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICBtID0gIm5vdCBmb3VuZCBvciBub3QgYWNjZXNzaWJsZSI7CisgICAgICAgIHByaW50ZigiXCIlc1wiIC0gJXNcbiIscyxtKTsKKyAgICAgICAgcmMgPSAtOTsKKyAgICAgICAgZ290byB4ZG9teWRpcjsKKyAgICB9CisgICAgd2lsZCA9IGNtcmVzdWx0Lm5yZXN1bHQ7ICAgICAgICAgICAgLyogV2lsZGNhcmQgd2FzIGdpdmVuPyAqLworICAgIGRlYnVnKEYxMTEsImRvbXlkaXIgY21pZmkyIixzLHdpbGQpOworCisgICAgaWYgKG91dGZpbGVbMF0pIHsKKyAgICAgICAgb2ZwID0gZm9wZW4ob3V0ZmlsZSwidyIpOyAgICAgICAvKiBPcGVuIG91dHB1dCBmaWxlICovCisgICAgICAgIGlmICghb2ZwKSB7CisgICAgICAgICAgICBwcmludGYoIj9DYW4ndCBvcGVuIG91dHB1dCBmaWxlICVzOiAlc1xuIixvdXRmaWxlLGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgIG9mcCA9IHN0ZG91dDsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgcGFnZSA9IDA7CisgICAgfQorCisjaWZkZWYgT1MyCisgICAgaWYgKCF3aWxkKSB7CisgICAgICAgIGlmICh6Y2hraShzKSA9PSAtMikgeyAgICAgICAgICAgLyogRm91bmQgYSBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgIHAgPSBzICsgKGludClzdHJsZW4ocykgLSAxOyAvKiBZZXMgKi8KKyAgICAgICAgICAgIGlmICgqcCA9PSAnXFwnIHx8ICpwID09ICcvJykKKyAgICAgICAgICAgICAgc3RyY2F0KHMsICIqIik7CisgICAgICAgICAgICBlbHNlIGlmICgqcCA9PSAnOicpCisgICAgICAgICAgICAgIHN0cmNhdChzLCAiLi8qIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHN0cmNhdChzLCAiLyoiKTsKKyAgICAgICAgICAgIHdpbGQgPSAxOyAgICAgICAgICAgICAgICAgICAvKiBOb3cgaXQncyB3aWxkICovCisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIGlmICghd2lsZCkgaWYgKGlzZGlyKHMpKSB7ICAgICAgICAgIC8qIElzIGl0IGEgZGlyZWN0b3J5PyAqLworICAgICAgICBwID0gcyArIChpbnQpc3RybGVuKHMpIC0gMTsgICAgIC8qIFllcyAqLworI2lmZGVmIFZNUworICAgICAgICB7CisgICAgICAgICAgICAvKiBDb252ZXJ0IGZyb20gRk9PLkRJUjsxIHRvIFt4LkZPT10gaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICBjaGFyIGJ1ZltDS01BWFBBVEgrMV07CisgICAgICAgICAgICBkZWJ1ZyhGMDAwLCJkb215ZGlyIGRpcmVjdG9yeSAwIixzLCpwKTsKKyAgICAgICAgICAgIGlmIChjdnRkaXIocyxidWYsQ0tNQVhQQVRIKSA+IDApCisgICAgICAgICAgICAgIGNrc3RybmNweShsaW5lLGJ1ZixMSU5CVUZTSVopOworICAgICAgICB9CisjZW5kaWYgLyogVk1TICovCisgICAgICAgIGRlYnVnKEYwMDAsImRvbXlkaXIgZGlyZWN0b3J5IDEiLHMsKnApOworI2lmZGVmIFZNUworICAgICAgICBpZiAoKnAgPT0gJ10nIHx8ICpwID09ICc+JyB8fCAqcCA9PSAnOicpCisgICAgICAgICAgc3RyY2F0KHMsICIqLioiKTsKKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgaWYgKCpwID09ICc6JykKKyAgICAgICAgICBzdHJjYXQocywgIisiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHN0cmNhdChzLCAiOisiKTsKKyNlbHNlCisjaWZkZWYgU1RSQVRVUworICAgICAgICBpZiAoKnAgPT0gJz4nKQorICAgICAgICAgIHN0cmNhdChzLCAiKiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgc3RyY2F0KHMsICI+KiIpOworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICB3aWxkID0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdyBpdCdzIHdpbGQgKi8KKyAgICAgICAgZGVidWcoRjAwMCwiZG9teWRpciBkaXJlY3RvcnkgMiIscywqcCk7CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgWlhSRVdJTkQKKy8qIGNtaWZpKCkgYWxyZWFkeSBjYWxsZWQgbnp4cGFuZCBzbyB3ZSBjYW4ganVzdCByZS11c2UgdGhlIHNhbWUgbGlzdC4gKi8KKyAgICBpZiAoIW11bHRpcGxlKSB7CisJeCA9IHp4cmV3aW5kKCk7CQkJLyogUmV3aW5kIHRoZSBsaXN0ICovCisJZGVidWcoRjExMSwiZG9teWRpciB6eHJld2luZCIscyx4KTsKKyAgICB9IGVsc2UgeworI2VuZGlmIC8qIFpYUkVXSU5EICovCisJbnp4b3B0cyA9IChzaG93ID09IFpYX0RJUk9OTFkpID8gWlhfRElST05MWSA6CisJICAoc2hvdyA9PSBaWF9GSUxPTkxZID8gWlhfRklMT05MWSA6IDApOworCWlmIChtYXRjaGRvdCkgIG56eG9wdHMgfD0gWlhfTUFUQ0hET1Q7CisJaWYgKHJlY3Vyc2l2ZSkgbnp4b3B0cyB8PSBaWF9SRUNVUlNFOworCXggPSBuenhwYW5kKHMsbnp4b3B0cyk7ICAgICAgICAgICAgIC8qIEV4cGFuZCBmaWxlIGxpc3QgKi8KKwlkZWJ1ZyhGMTExLCJkb215ZGlyIG56eHBhbmQiLHMseCk7CisjaWZkZWYgWlhSRVdJTkQKKyAgICB9CisjZW5kaWYgLyogWlhSRVdJTkQgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIGlmIChhcnJheSkgeworICAgICAgICBpbnQgbiwgeHg7CisgICAgICAgIG4gPSAoeCA8IDApID8gMCA6IHg7CisgICAgICAgIGlmICgoeHggPSBkY2xhcnJheShhcnJheSxuKSkgPCAwKSB7CisgICAgICAgICAgICBwcmludGYoIj9BcnJheSBkZWNsYXJhdGlvbiBmYWlsdXJlXG4iKTsKKyAgICAgICAgICAgIHJjID0gLTk7CisgICAgICAgICAgICBnb3RvIHhkb215ZGlyOworICAgICAgICB9CisgICAgICAgIGFycmF5ID0geHg7CisgICAgICAgIGFwID0gYV9wdHJbYXJyYXldOworICAgICAgICBpZiAobiA8IDEpIHsKKyAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgIGdvdG8geGRvbXlkaXI7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgaWYgKHggPCAxKSB7CisjaWZkZWYgQ0tST09UCisgICAgICAgICAgZXh0ZXJuIGludCBja3Jvb3RlcnI7CisgICAgICAgICAgaWYgKGNrcm9vdGVycikKKyAgICAgICAgICAgIHByaW50ZigiP09mZiBsaW1pdHM6ICVzXG4iLHMpOworICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKyAgICAgICAgICAgIGlmICh4ID09IDAgJiYgaXNkaXIocykpCisgICAgICAgICAgICAgIHByaW50ZigiP0VtcHR5IGRpcmVjdG9yeSAtIFwiJXNcIlxuIiwgcyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ZigiPyVzICVzIG1hdGNoIC0gXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgKHggPT0gMCkgPyAiTm8iIDogIlRvbyBtYW55IiwKKyAgICAgICAgICAgICAgICAgICAgIChzaG93ID09IDIpID8gImRpcmVjdG9yaWVzIiA6ICJmaWxlcyIsCisgICAgICAgICAgICAgICAgICAgICBzCisgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgIHJjID0gLTk7CisgICAgICAgICAgZ290byB4ZG9teWRpcjsKKyAgICB9CisgICAgbnggPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgaG93IG1hbnkgZmlsZXMgKi8KKworICAgIGlmIChtc2cpIHsKKyAgICAgICAgbWFrZXN0cigmZGlybXNnLHRtcGJ1Zik7CisgICAgICAgIGRpcm1zZ2xlbiA9IHN0cmxlbih0bXBidWYpOworICAgIH0KKworI2lmZGVmIFZNUworICAgIGNkcCA9IHpndGRpcigpOyAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBjdXJyZW50IGRpcmVjdG9yeSAqLworICAgIGRlYnVnKEYxMTAsImRvbXlkaXIgVk1TIHpndGRpciIsY2RwLDApOworI2VuZGlmIC8qIFZNUyAqLworCisgICAgaWYgKHhzb3J0ICYmIHZlcmJvc2UpIHsgICAgICAgICAgICAgLyogSWYgc29ydGluZywgYWxsb2NhdGUgc3BhY2UgKi8KKyAgICAgICAgaWYgKCEoZGlybGlzdCA9IChjaGFyICoqKSBtYWxsb2MoKHggKyAxKSAqIHNpemVvZihjaGFyICoqKSkpKSB7CisgICAgICAgICAgICBpZiAoIXF1aWV0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIqIFdhcm5pbmc6IEZhaWx1cmUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzb3J0aW5nLlxuIik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIqIFdpbGwgcHJvY2VlZCB3aXRob3V0IHNvcnRpbmcuLi5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeHNvcnQgPSAwOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMDEsImRvbXlkaXIgc29ydCBtYWxsb2MiLCIiLHhzb3J0KTsKKyAgICB9CisKKyAgICAvKiBEaXNwbGF5IHRoZSBsaXN0aW5nICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICBpZiAoYXJyYXkpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yaW5nIGluc3RlYWQgb2YgcHJpbnRpbmcgKi8KKyAgICAgIGhlYWRpbmcgPSAwOworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICBpZiAoaGVhZGluZykgeyAgICAgICAgICAgICAgICAgICAgICAvKiBJZiAvSEVBRElORyBwcmludCBoZWFkaW5nICovCisgICAgICAgIHpmbnFmcChzLFRNUEJVRlNJWix0bXBidWYpOworICAgICAgICBmcHJpbnRmKG9mcCwiXG5EaXJlY3Rvcnkgb2YgJXNcblxuIix0bXBidWYpOworICAgICAgICBuICs9IDM7CisgICAgfQorICAgIGlmIChwYWdlID4gLTEpICAgICAgICAgICAgICAgICAgICAgIC8qIFBhZ2luZyAqLworICAgICAgeGFza21vcmUgPSBwYWdlOworCisgICAgaWYgKCF2ZXJib3NlKSB7ICAgICAgICAgICAgICAgICAgICAgLyogL0JSSUVGICovCisgICAgICAgIGlmIChvdXRmaWxlWzBdKSB7ICAgICAgICAgICAgICAgLyogVG8gZmlsZSAgKi8KKyAgICAgICAgICAgIGludCBrID0gMDsKKyAgICAgICAgICAgIHpuZXh0KG5hbWUpOworICAgICAgICAgICAgd2hpbGUgKG5hbWVbMF0pIHsgICAgICAgICAgIC8qIE9uZSBsaW5lIHBlciBmaWxlICovCisgICAgICAgICAgICAgICAgaysrOworICAgICAgICAgICAgICAgIGlmIChmcykgaWYgKGZpbGVzZWxlY3QobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9hZnQsZGlyX2JlZixkaXJfbmFmLGRpcl9uYmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaXplLG1heHNpemUsIWJhY2t1cCwxNix4bGlzdCkgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgIHpuZXh0KG5hbWUpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnByaW50ZihvZnAsIiVzXG4iLG5hbWUpOworICAgICAgICAgICAgICAgIHpuZXh0KG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhlYWRpbmcpCisgICAgICAgICAgICAgIGZwcmludGYob2ZwLCJGaWxlczogJWRcblxuIixrKTsKKyAgICAgICAgICAgIHJjID0gMTsKKyAgICAgICAgICAgIGdvdG8geGRvbXlkaXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYyA9IGZpbGhlbHAoeCwiIiwiIixuLDApOworICAgICAgICAgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgICAgICAgZ290byB4ZG9teWRpcjsKKyAgICAgICAgICAgIGlmIChoZWFkaW5nICYmIHJjID4gMCkKKyAgICAgICAgICAgICAgZnByaW50ZihvZnAsIkZpbGVzOiAlZFxuXG4iLHgpOyAvKiAoTWlnaHQgc2Nyb2xsIGEgbGluZSBvciAyKSAqLworICAgICAgICAgICAgcmMgPSAxOworICAgICAgICAgICAgZ290byB4ZG9teWRpcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBuZGlycyA9IG5maWxlcyA9IG5ieXRlcyA9IDBMOyAgICAgICAvKiBJbml0aWFsaXplIGNvdW50ZXJzICovCisKKyAgICBpZiAoZGlyX2V4YykgICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXZlIGV4Y2VwdGlvbiBsaXN0PyAqLworICAgICAgbWFrZWxpc3QoZGlyX2V4Yyx4bGlzdCwxNik7CS8qIFllcywgY29udmVydCB0byBhcnJheSAqLworCisgICAgZGlyYWN0aXZlID0gMTsKKyAgICB6bmV4dChuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgbmV4dCBmaWxlICovCisgICAgd2hpbGUgKG5hbWVbMF0pIHsgICAgICAgICAgICAgICAgICAgLyogTG9vcCBmb3IgZWFjaCBmaWxlICovCisgICAgICAgIGlmIChmcykgaWYgKGZpbGVzZWxlY3QobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGlyX2FmdCxkaXJfYmVmLGRpcl9uYWYsZGlyX25iZiwKKyAgICAgICAgICAgICAgICAgICAgICAgbWluc2l6ZSxtYXhzaXplLCFiYWNrdXAsMTYseGxpc3QpIDwgMSkgeworICAgICAgICAgICAgem5leHQobmFtZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSB6Z2V0ZnMobmFtZSk7ICAgICAgICAgICAgIC8qIEdldCBmaWxlIGxlbmd0aCAqLworICAgICAgICBkZWJ1ZyhGMTExLCJkb215ZGlyIHpnZXRmcyIsbmFtZSxsZW4pOworI2lmZGVmIFZNU09SVU5JWAorICAgICAgICBpdHNhZGlyID0gemdmc19kaXI7ICAgICAgICAgICAgIC8qIFNlZSBpZiBpdCdzIGEgZGlyZWN0b3J5ICovCisjZWxzZQorICAgICAgICBpdHNhZGlyID0gKGxlbiA9PSAtMiB8fCBpc2RpcihuYW1lKSk7CisjZW5kaWYgLyogVk1TT1VOSVggKi8KKyAgICAgICAgZGVidWcoRjExMSwiZG9teWRpciBpdHNhZGlyIixuYW1lLGl0c2FkaXIpOworICAgICAgICBpZiAoKGl0c2FkaXIgJiYgKHNob3cgPT0gMSkpIHx8ICghaXRzYWRpciAmJiAoc2hvdyA9PSAyKSkpIHsKKyAgICAgICAgICAgIHpuZXh0KG5hbWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLyogR2V0IGhlcmUgd2hlbiB3ZSBrbm93IHdlIGhhdmUgc2VsZWN0ZWQgdGhpcyBmaWxlICovCisKKyAgICAgICAgbm1hdGNoZXMgKys7CisgICAgICAgIGlmIChpdHNhZGlyKSB7ICAgICAgICAgICAgICAgICAgLyogQWNjdW11bGF0ZSB0b3RhbHMgZm9yIHN1bW1hcnkgKi8KKyAgICAgICAgICAgIG5kaXJzKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZmlsZXMrKzsKKyAgICAgICAgICAgIG5ieXRlcyArPSBsZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1bW1hcnkpIHsgICAgICAgICAgICAgICAgICAvKiBTdW1tYXJ5IG9ubHksIG5vIGRldGFpbCAqLworICAgICAgICAgICAgem5leHQobmFtZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2lmbmRlZiBOT1NQTAorICAgICAgICBpZiAoYXJyYXkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImRvbXlkaXIgYXJyYXkiLG5hbWUsbmZpbGVzKTsKKyAgICAgICAgICAgIGlmIChhcCkKKyAgICAgICAgICAgICAgbWFrZXN0cigmKGFwW25tYXRjaGVzXSksbmFtZSk7CisgICAgICAgICAgICB6bmV4dChuYW1lKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKworLyoKKyAgTk9URTogVGhlIHNwcmludGYncyBpbiB0aGlzIHJvdXRpbmUgc2hvdWxkIGJlIHNhZmUuICBUaGV5IGludm9sdmUKKyAgcGVybWlzc2lvbiBzdHJpbmdzLCBkYXRlL3RpbWUgc3RyaW5ncywgYW5kIGZpbGVuYW1lcywgYWxsIG9mIHdoaWNoIGhhdmUKKyAga25vd24gbWF4aW11bSBsZW5ndGhzOyBub25lIG9mIHRoZXNlIGl0ZW1zIGlzIGlucHV0IGZyb20gdXNlcnMuICBUaGUKKyAgZGVzdGluYXRpb24gYnVmZmVycyBhcmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgbWF4aW11bSBzaXplcyBmb3IgYW55IGFuZAorICBhbGwgaXRlbXMuCisqLworICAgICAgICBkc3RyID0gemZjZGF0KG5hbWUpOyAgICAgICAgICAgIC8qIEdldCBtb2RpZmljYXRpb24gZGF0ZS90aW1lICovCisgICAgICAgIGRlYnVnKEYxMTEsImRvbXlkaXIgemNmZGF0Iixkc3RyLDApOworICAgICAgICBpZiAoIWRzdHIpIGRzdHIgPSAiIjsKKyAgICAgICAgeworLyoKKyAgTm90ZSB0aGF0IHpmY2RhdCgpIGFsd2F5cyByZXR1cm5zICIiIG9yIHl5eXltbWRkIGhoOm1tOnNzLCBzbyBhbnkgd2FybmluZ3MKKyAgYWJvdXQgcG9zc2libGUgb3V0LW9mLWJvdW5kcyBkc3RyW10gYXJyYXkgcmVmcyBkbyBub3QgYXBwbHkuICBUaGlzIGJsb2NrIG9mCisgIGNvZGUgaXMgdG8gc3RpZmxlIHRoZSB3YXJuaW5ncyBhbmQgYWxzbyBhbGxvd3MgZm9yIGFueSBvdXQtb2Ytc3BlYworICB6ZmNkYXQoKSBpbXBsZW1lbnRhdGlvbnMuCisqLworICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICBjaGFyICogcCA9ICIwMDAwMDAwMCAwMDowMDowMCI7CisgICAgICAgICAgICB4ID0gY2tzdHJuY3B5KHhidWYsZHN0ciwzMik7CisgICAgICAgICAgICBpZiAoeCA8IDE3KSBja3N0cm5jcHkoJnhidWZbeF0scCt4LDMyLXgpOworICAgICAgICAgICAgZHN0ciA9IHhidWY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuZ2RhdGUpIHsgICAgICAgICAgICAgICAgICAvKiBFbmdsaXNoIGRhdGUgcmVxdWVzdGVkPyAqLworICAgICAgICAgICAgc2hvcnQgbW9udGgsIGRheSwgeWVhciwgaG91ciwgbWludXRlLCBzZWNvbmRzOworICAgICAgICAgICAgbW9udGggPSAoZHN0cls0XS00OCkqMTAgKyAoZHN0cls1XS00OCk7CisgICAgICAgICAgICBtc3RyICA9IChtb250aCA+IDAgJiYgbW9udGggPD0gMTIpID8gbW9udGhzW21vbnRoLTFdIDogInh4eCI7CisgICAgICAgICAgICBkYXkgICA9IChkc3RyWzZdLTQ4KSoxMCArIChkc3RyWzddLTQ4KTsKKyAgICAgICAgICAgIHllYXIgID0gKCgoZHN0clswXS00OCkqMTAgKworICAgICAgICAgICAgICAgICAgICAgIChkc3RyWzFdLTQ4KSkqMTAgKworICAgICAgICAgICAgICAgICAgICAgIChkc3RyWzJdLTQ4KSkqMTAgKworICAgICAgICAgICAgICAgICAgICAgIChkc3RyWzNdLTQ4KTsKKyAgICAgICAgICAgIGhvdXIgID0gKGRzdHJbOV0tNDgpKjEwICsgKGRzdHJbMTBdLTQ4KTsKKyAgICAgICAgICAgIG1pbnV0ZSA9IChkc3RyWzEyXS00OCkqMTAgKyAoZHN0clsxM10tNDgpOworICAgICAgICAgICAgc2Vjb25kcyA9IChkc3RyWzE1XS00OCkqMTAgKyAoZHN0clsxNl0tNDgpOworICAgICAgICAgICAgc3ByaW50ZihkYnVmLCAgICAgICAgICAgICAgIC8qIFNBRkUgKi8KKyAgICAgICAgICAgICAgICAgICAgIiUyZC0lcy0lNGQgJTAyZDolMDJkOiUwMmQiLAorICAgICAgICAgICAgICAgICAgICBkYXksbXN0cix5ZWFyLGhvdXIsbWludXRlLHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGRzdHIgPSBkYnVmOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElTTyBkYXRlICovCisgICAgICAgICAgICBkYnVmWzBdID0gZHN0clswXTsgICAgICAgICAgLyogeXl5eSAqLworICAgICAgICAgICAgZGJ1ZlsxXSA9IGRzdHJbMV07CisgICAgICAgICAgICBkYnVmWzJdID0gZHN0clsyXTsKKyAgICAgICAgICAgIGRidWZbM10gPSBkc3RyWzNdOworICAgICAgICAgICAgZGJ1Zls0XSA9ICctJzsKKyAgICAgICAgICAgIGRidWZbNV0gPSBkc3RyWzRdOyAgICAgICAgICAvKiBtbSAobnVtZXJpYykgKi8KKyAgICAgICAgICAgIGRidWZbNl0gPSBkc3RyWzVdOworICAgICAgICAgICAgZGJ1Zls3XSA9ICctJzsKKyAgICAgICAgICAgIGRidWZbOF0gPSBkc3RyWzZdOyAgICAgICAgICAvKiBkZCAqLworICAgICAgICAgICAgZGJ1Zls5XSA9IGRzdHJbN107CisgICAgICAgICAgICBzdHJjcHkoZGJ1ZisxMCxkc3RyKzgpOyAgICAgLyogaGg6bW06c3MgKi8KKyAgICAgICAgICAgIGRzdHIgPSBkYnVmOworICAgICAgICB9CisgICAgICAgIGRsZW4gPSBzdHJsZW4oZGJ1Zik7ICAgICAgICAgICAgLyogTGVuZ3RoIG9mIGRhdGUgKi8KKyAgICAgICAgbmFtZVtDS01BWFBBVEhdID0gTlVMOworI2lmZGVmIENLX1BFUk1TCisjaWZkZWYgVk1TT1JVTklYCisgICAgICAgIHAgPSB6aXBlcm0obmFtZSk7ICAgICAgICAgICAgICAgLyogR2V0IHBlcm1pc3Npb25zICovCisgICAgICAgIGRlYnVnKEYxMTAsInppcGVybSBwZXJtcyIscCwwKTsKKyNlbHNlCisgICAgICAgIHAgPSB6Z3Blcm0obmFtZSk7CisgICAgICAgIGRlYnVnKEYxMTAsInpncGVybSBwZXJtcyIscCwwKTsKKyNlbmRpZiAvKiBWTVNPUlVOSVggKi8KKyNlbHNlCisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBkZWJ1ZyhGMTEwLCJOVUxMIHBlcm1zIixwLDApOworI2VuZGlmIC8qIENLX1BFUk1TICovCisKKyNpZmRlZiBWTVMKKyAgICAgICAgLyogR2V0IHJlbGF0aXZlIG5hbWUgdG8gc2F2ZSBzcGFjZSAtLSBWTVMgZnVsbG5hbWVzIGFyZSBsb25nLi4uICovCisgICAgICAgIGNrc3RybmNweShuYW1lLHpyZWxuYW1lKG5hbWUsY2RwKSxDS01BWFBBVEgpOworI2VuZGlmIC8qIFZNUyAqLworCisgICAgICAgIGlmIChpdHNhZGlyICYmIGxlbiA8IDApIHsgICAgICAgLyogRGlyZWN0b3J5ICovCisjaWZkZWYgVk1TCisgICAgICAgICAgICBzcHJpbnRmKGxpbmVidWYsIiUtMjJzJS0xMHMgICVzICAlcyIscCwiPERJUj4iLGRzdHIsbmFtZSk7CisjZWxzZQorICAgICAgICAgICAgaWYgKHApCisgICAgICAgICAgICAgIHNwcmludGYobGluZWJ1ZiwiJTEwcyUtMTBzICAlcyAgJXMiLHAsIjxESVI+Iixkc3RyLG5hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBzcHJpbnRmKGxpbmVidWYsIiUtMTBzICAlcyAgJXMiLCAiPERJUj4iLCBkc3RyLCBuYW1lKTsKKyNlbmRpZiAvKiBWTVMgKi8KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWd1bGFyIGZpbGUgKi8KKyNpZmRlZiBWTVMKKyAgICAgICAgICAgIHNwcmludGYobGluZWJ1ZiwiJS0yMnMlMTBsZCAgJXMgICVzIiwgcCwgbGVuLCBkc3RyLCBuYW1lKTsKKyNlbHNlCisgICAgICAgICAgICBpZiAocCkKKyAgICAgICAgICAgICAgc3ByaW50ZihsaW5lYnVmLCIlMTBzJTEwbGQgICVzICAlcyIsIHAsIGxlbiwgZHN0ciwgbmFtZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHNwcmludGYobGluZWJ1ZiwiJTEwbGQgICVzICAlcyIsIGxlbiwgZHN0ciwgbmFtZSk7CisjZW5kaWYgLyogVk1TICovCisgICAgICAgIH0KKyNpZmRlZiBVTklYCisjaWZkZWYgQ0tTWU1MSU5LCisgICAgICAgIGlmICh6Z2ZzX2xpbmspIHsKKyAgICAgICAgICAgIGludCBuLCBtOworICAgICAgICAgICAgZXh0ZXJuIGNoYXIgbGlua25hbWVbXTsKKyAgICAgICAgICAgIG4gPSBzdHJsZW4obGluZWJ1Zik7CisgICAgICAgICAgICBtID0gc3RybGVuKGxpbmtuYW1lKSArIG47CisgICAgICAgICAgICBpZiAobSA8IENLTUFYUEFUSCArIDU4KQorICAgICAgICAgICAgICBzdHJjcHkobGluZWJ1ZituLCAiIC0+ICIpOyAvKiBzYWZlIChjaGVja2VkKSAqLworICAgICAgICAgICAgaWYgKG0gKyA0IDwgQ0tNQVhQQVRIIC0gNTgpCisgICAgICAgICAgICAgIHN0cmNweShsaW5lYnVmK24rNCwgbGlua25hbWUpOyAvKiBzYWZlIChjaGVja2VkKSAqLworICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKyNlbmRpZiAvKiBVTklYICovCisgICAgICAgIGlmICh4ZmVybW9kKSB7ICAgICAgICAgICAgICAgICAgLyogU2hvdyB0cmFuc2ZlciBtb2RlICovCisgICAgICAgICAgICBpbnQgaSwgeCwgeTsKKyAgICAgICAgICAgIGNoYXIgKiBzID0gIiI7CisgICAgICAgICAgICB5ID0gLTE7CisgICAgICAgICAgICB4ID0gc2NhbmZpbGUobmFtZSwmeSxuc2NhbmZpbGUpOworICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgIGNhc2UgRlRfVEVYVDogcyA9ICIgKFQpIjsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRlRfN0JJVDogcyA9ICIgKFQpKDdCSVQpIjsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRlRfOEJJVDogcyA9ICIgKFQpKDhCSVQpIjsgYnJlYWs7CisjaWZkZWYgVU5JQ09ERQorICAgICAgICAgICAgICBjYXNlIEZUX1VURjg6IHMgPSAiIChUKShVVEY4KSI7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEZUX1VDUzI6CisgICAgICAgICAgICAgICAgcyA9IHkgPyAiIChUKShVQ1MyTEUpIiA6ICIgKFQpKFVDUzJCRSkiOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFVOSUNPREUgKi8KKyAgICAgICAgICAgICAgY2FzZSBGVF9CSU46ICBzID0gIiAoQikiOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKnMpIHsKKyAgICAgICAgICAgICAgICBzID0gYmluYXJ5ID8gIiAoQikiIDogIiAoVCkiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpzKSB7CisgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAgICAgbiA9IHN0cmxlbihsaW5lYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAobiArIDQgPCBDS01BWFBBVEggLSA1OCkKKyAgICAgICAgICAgICAgICAgIHN0cmNweShsaW5lYnVmK24sIHMpOyAvKiBzYWZlIChjaGVja2VkKSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtc2cgJiYgZGlybXNnKSB7CisgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgIG4gPSBzdHJsZW4obGluZWJ1Zik7CisgICAgICAgICAgICBpZiAobiArIGRpcm1zZ2xlbiArIDIgPCBDS01BWFBBVEgpCisgICAgICAgICAgICAgIHNwcmludGYoKGNoYXIgKikobGluZWJ1ZituKSwiICVzIiwgZGlybXNnKTsgLyogU0FGRSAqLworICAgICAgICB9CisgICAgICAgIGlmICh4c29ydCkgeyAgICAgICAgICAgICAgICAgICAgLyogU29ydGluZyAtIHNhdmUgbGluZSAqLworICAgICAgICAgICAgaSA9IHN0cmxlbihsaW5lYnVmKTsKKyAgICAgICAgICAgIGlmICgobmRpcmxpc3QgPj0gbngpIHx8CisgICAgICAgICAgICAgICAgIShkaXJsaXN0W25kaXJsaXN0XSA9IChjaGFyICopbWFsbG9jKGkrMSkpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/TWVtb3J5IGFsbG9jYXRpb24gZXJyb3IgLSB0cnkgL05PU09SVFxuIik7CisgICAgICAgICAgICAgICAgcmMgPSAtOTsKKyAgICAgICAgICAgICAgICBnb3RvIHhkb215ZGlyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyY3B5KGRpcmxpc3RbbmRpcmxpc3RdLGxpbmVidWYpOyAvKiBzYWZlICovCisgICAgICAgICAgICBuZGlybGlzdCsrOworICAgICAgICB9CisgICAgICAgIHpuZXh0KG5hbWUpOyAgICAgICAgICAgICAgICAgICAgLyogUGVlayBhaGVhZCB0byBuZXh0IGZpbGUgKi8KKworICAgICAgICBpZiAoIXhzb3J0KSB7CisgICAgICAgICAgICBmcHJpbnRmKG9mcCwiJXNcbiIsbGluZWJ1Zik7CisgICAgICAgICAgICBpZiAocGFnZSAmJiAobmFtZVswXSB8fCBoZWFkaW5nKSkgeyAvKiBJZiAvUEFHRSAqLworICAgICAgICAgICAgICAgIGlmIChjbWRfY29scyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHggPSBzdHJsZW4obGluZWJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGludCB5OworICAgICAgICAgICAgICAgICAgICB5ID0gKHggJSBjbWRfY29scykgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgbiArPSB4IC8gY21kX2NvbHMgKyB5OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ0tfVFRHV1NJWgorICAgICAgICAgICAgICAgIGlmIChuID4gKGNtZF9yb3dzIC0gMykpIHsgLyogRG8gbW9yZS1wcm9tcHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8geGRvbXlkaXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjaWZuZGVmIE5PU1BMCisgICAgaWYgKGFycmF5KSB7CisgICAgICAgIGlmIChhcCkKKyAgICAgICAgICBtYWtlc3RyKCYoYXBbMF0pLGNraXRvYShubWF0Y2hlcykpOworICAgICAgICByYyA9IDE7CisgICAgICAgIGdvdG8geGRvbXlkaXI7CisgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisgICAgaWYgKHhzb3J0KSB7CisgICAgICAgIHNrZXkgPSAwOworI2lmZGVmIFZNUworICAgICAgICBzd2l0Y2ggKHNvcnRieSkgeworICAgICAgICAgIGNhc2UgRElSU19OTTogc2tleSA9IGRsZW4gKyAzNTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBESVJTX0RUOiBza2V5ID0gMzM7IGJyZWFrOworICAgICAgICAgIGNhc2UgRElSU19TWjogc2tleSA9IDIxOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgc3dpdGNoIChzb3J0YnkpIHsKKyAgICAgICAgICAgICAgY2FzZSBESVJTX05NOiBza2V5ID0gZGxlbiArIDI0OyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBESVJTX0RUOiBza2V5ID0gMjI7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIERJUlNfU1o6IHNrZXkgPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc29ydGJ5KSB7CisgICAgICAgICAgICAgIGNhc2UgRElSU19OTTogc2tleSA9IGRsZW4gKyAxNDsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRElSU19EVDogc2tleSA9IDEyOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBESVJTX1NaOiBza2V5ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIFZNUyAqLworICAgICAgICBzaF9zb3J0KGRpcmxpc3QsTlVMTCxuZGlybGlzdCxza2V5LHJldmVyc2UsZmlsZWNhc2UpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmRpcmxpc3Q7IGkrKykgeworICAgICAgICAgICAgZnByaW50ZihvZnAsIiVzXG4iLGRpcmxpc3RbaV0pOworICAgICAgICAgICAgaWYgKHBhZ2UgJiYgKGkgPCBuZGlybGlzdCAtMSB8fCBoZWFkaW5nKSkgeyAvKiBJZiAvUEFHRSAqLworICAgICAgICAgICAgICAgIGlmIChjbWRfY29scyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHggPSBzdHJsZW4oZGlybGlzdFtpXSk7CisgICAgICAgICAgICAgICAgICAgIGludCB5OworICAgICAgICAgICAgICAgICAgICB5ID0gKHggJSBjbWRfY29scykgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgbiArPSAoKGludClzdHJsZW4oZGlybGlzdFtpXSkgLyBjbWRfY29scykgKyB5OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ0tfVFRHV1NJWgorICAgICAgICAgICAgICAgIGlmIChuID4gKGNtZF9yb3dzIC0gMykpIHsgLyogRG8gbW9yZS1wcm9tcHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8geGRvbXlkaXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGVhZGluZyB8fCBzdW1tYXJ5KSB7CisjaWZkZWYgQ0tGTE9BVAorICAgICAgICBDS0ZMT0FUIGdtOworI2VuZGlmIC8qIENLRkxPQVQgKi8KKyAgICAgICAgZnByaW50ZihvZnAsIlxuJWxkIGRpcmVjdG9yJXMsICVsZCBmaWxlJXMsICVsZCBieXRlJXMiLAorICAgICAgICAgICAgICAgbmRpcnMsCisgICAgICAgICAgICAgICAobmRpcnMgPT0gMSkgPyAieSIgOiAiaWVzIiwKKyAgICAgICAgICAgICAgIG5maWxlcywKKyAgICAgICAgICAgICAgIChuZmlsZXMgPT0gMSkgPyAiIiA6ICJzIiwKKyAgICAgICAgICAgICAgIG5ieXRlcywKKyAgICAgICAgICAgICAgIChuYnl0ZXMgPT0gMSkgPyAiIiA6ICJzIgorICAgICAgICAgICAgICAgKTsKKyNpZmRlZiBDS0ZMT0FUCisgICAgICAgIGdtID0gKChDS0ZMT0FUKSBuYnl0ZXMgKSAvIDEwMDAwMDAuMDsKKyAgICAgICAgaWYgKGdtID4gMTAwMC4wKQorICAgICAgICAgIGZwcmludGYob2ZwLCIgKCUwLjJmR0IpIiwoZ20gLyAxMDAwLjApKTsKKyAgICAgICAgZWxzZSBpZiAoZ20gPj0gMC4wMSkKKyAgICAgICAgICBmcHJpbnRmKG9mcCwiICglMC4yZk1CKSIsZ20pOworI2VuZGlmIC8qIENLRkxPQUQgKi8KKyAgICAgICAgZnByaW50ZihvZnAsIlxuXG4iKTsKKyAgICB9CisgIHhkb215ZGlyOgorICAgIGlmIChnX21hdGNoZG90ID4gLTEpIHsKKyAgICAgICAgbWF0Y2hkb3QgPSBnX21hdGNoZG90OyAgICAgICAgICAvKiBSZXN0b3JlIHRoZXNlLi4uICovCisgICAgICAgIGdfbWF0Y2hkb3QgPSAtMTsKKyAgICB9CisgICAgZnJlZWRpcmxpc3QoKTsKKyAgICBpZiAob2ZwICE9IHN0ZG91dCkgeyAgICAgICAgICAgICAgICAvKiBDbG9zZSBhbnkgb3V0cHV0IGZpbGUgKi8KKyAgICAgICAgaWYgKG9mcCkgZmNsb3NlKG9mcCk7CisgICAgICAgIG9mcCA9IHN0ZG91dDsKKyAgICB9CisgICAgaWYgKHJjID4gMCkKKyAgICAgIHN1Y2Nlc3MgPSAxOworICAgIHJldHVybihyYyk7Cit9CisKK2ludAorZG9kaXIoY3gpIGludCBjeDsgeyAgICAgICAgICAgICAgICAgICAgIC8qIERvIHRoZSBESVJFQ1RPUlkgY29tbWFuZCAqLworICAgIGNoYXIgKmRjICwgKm1zZzsKKworI2lmZGVmIE9TMgorICAgIHJldHVybihkb215ZGlyKCkpOworI2Vsc2UgLyogT1MyICovCisgICAgaWYgKG5vcHVzaAorI2lmZGVmIERPTVlESVIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ1aWxkcyB0aGF0IGRvbXlkaXIoKSBieSBkZWZhdWx0ICovCisgICAgICAgIHx8IChjeCA9PSBYWERJUiB8fCBjeCA9PSBYWExESVIpCisjZW5kaWYgLyogRE9NWURJUiAqLworICAgICAgICApCisgICAgICByZXR1cm4oZG9teWRpcigpKTsgICAgICAgICAgICAgICAgLyogQnVpbHQtaW4gZGlyZWN0b3J5IGNvbW1hbmQgKi8KKworICAgIC8qIFVzZSB0aGUgc3lzdGVtJ3MgZGlyZWN0b3J5IGNvbW1hbmQuICovCisKKyAgICBtc2cgPSAoY3ggPT0gWFhMUykgPworICAgICAgIkFyZ3VtZW50cyBmb3IgbHMiIDoKKyAgICAgICAgIkRpcmVjdG9yeSBhbmQvb3IgZmlsZSBzcGVjaWZpY2F0aW9uIjsKKyAgICBpZiAoKHggPSBjbXR4dChtc2csIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisKKyAgICBja3N0cm5jcHkodG1wYnVmLHMsVE1QQlVGU0laKTsgICAgICAvKiBDb3B5IHRoZSBmaWxlc3BlYyAqLworICAgIHMgPSB0bXBidWY7CisKKyAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKworICAgIGxwID0gbGluZTsKKyAgICBpZiAoIShkYyA9IGdldGVudigiQ0tfRElSIikpKQorICAgICAgZGMgPSBESVJDTUQ7CisgICAgY2ttYWttc2cobHAsTElOQlVGU0laLGRjLCIgIixzLE5VTEwpOworICAgIGRlYnVnKEYxMTAsIkRJUiIsbGluZSwwKTsKKyNpZmRlZiBWTVMKKyAgICBjb25yZXMoKTsKKyNlbmRpZiAvKiBWTVMgKi8KKyAgICB4ID0genNoY21kKGxpbmUpOworI2lmZGVmIFZNUworICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7CisjZW5kaWYgLyogVk1TICovCisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAoeCA8IDEpID8gMCA6IDEpOworI2VuZGlmIC8qIE9TMiAqLworfQorCisjaWZuZGVmIE5PU0VSVkVSCisjaWZuZGVmIE5PRlJJTExTCisvKiBEbyB0aGUgRU5BQkxFIGFuZCBESVNBQkxFIGNvbW1hbmRzICovCisKK2ludAorZG9lbmFibGUoeSx4KSBpbnQgeSwgeDsgeworI2lmZGVmIENLX0xPR0lOCisgICAgaWYgKGlzZ3Vlc3QpICAgICAgICAgICAgICAgICAgICAgICAgLyogSUtTRDogRG9uJ3QgbGV0IGd1ZXN0cyAqLworICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuYWJsZSBhbnl0aGluZyB0aGF0J3MgZGlzYWJsZWQgKi8KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgIHN3aXRjaCAoeCkgeworICAgICAgY2FzZSBFTl9BTEw6CisgICAgICAgIGVuX2N3ZCA9IGVuX2NweSA9IGVuX2RlbCA9IGVuX2RpciA9IGVuX2ZpbiA9IGVuX2dldCA9IHk7CisgICAgICAgIGVuX3JlbiA9IGVuX3NlbiA9IGVuX3NldCA9IGVuX3NwYSA9IGVuX3R5cCA9IGVuX3JldCA9IHk7CisgICAgICAgIGlmICghaW5zZXJ2ZXIpCisgICAgICAgICAgZW5fd2hvID0gZW5fbWFpID0gZW5fcHJpID0geTsKKyAgICAgICAgZW5fbWtkID0gZW5fcm1kID0geTsKKyAgICAgICAgZW5feGl0ID0geTsKKyNpZm5kZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgZW5fYnllID0geTsKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2lmbmRlZiBOT1BVU0gKKyAgICAgICAgaWYgKCFub3B1c2ggJiYgIWluc2VydmVyKQorICAgICAgICAgIGVuX2hvcyA9IHk7CisjZW5kaWYgLyogTk9QVVNIICovCisjaWZuZGVmIE5PU1BMCisgICAgICAgIGVuX2FzZyA9IGVuX3F1ZSA9IHk7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRU5fQllFOgorI2lmbmRlZiBkYXRhZ2VuZXJhbAorLyoKKyAgSW4gRGF0YSBHZW5lcmFsIEFPUy9WUyBLZXJtaXQgY2FuJ3QgbG9nIG91dCBpdHMgc3VwZXJpb3IgcHJvY2Vzcy4KKyovCisgICAgICAgIGVuX2J5ZSA9IHk7CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX0NQWToKKyAgICAgICAgZW5fY3B5ID0geTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX0NXRDoKKyAgICAgICAgZW5fY3dkID0geTsKKyNpZmRlZiBJS1NECisgICAgICAgIGlmIChpbnNlcnZlciAmJiB5ID09IDApIHsKKyAgICAgICAgICAgIGZucnBhdGggPSBQQVRIX09GRjsKKyAgICAgICAgICAgIGZuc3BhdGggPSBQQVRIX09GRjsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX0RFTDogICAgICAgICAgICAgICAgICAgICAgLyogRGVsZXRpbmcgb2YgZmlsZXMgKi8KKyAgICAgICAgZW5fZGVsID0geTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX0RJUjoKKyAgICAgICAgZW5fZGlyID0geTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX0ZJTjoKKyAgICAgICAgZW5fZmluID0geTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX0dFVDoKKyAgICAgICAgZW5fZ2V0ID0geTsKKyAgICAgICAgYnJlYWs7CisjaWZuZGVmIE5PUFVTSAorICAgICAgY2FzZSBFTl9IT1M6CisgICAgICAgIGlmICghbm9wdXNoKQorICAgICAgICAgZW5faG9zID0geTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTk9QVVNIICovCisgICAgICBjYXNlIEVOX1JFTjoKKyAgICAgICAgZW5fcmVuID0geTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX1NFTjoKKyAgICAgICAgZW5fc2VuID0geTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX1NFVDoKKyAgICAgICAgZW5fc2V0ID0geTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX1NQQToKKyAgICAgICAgZW5fc3BhID0geTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX1RZUDoKKyAgICAgICAgZW5fdHlwID0geTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX1dITzoKKyAgICAgICAgZW5fd2hvID0geTsKKyAgICAgICAgYnJlYWs7CisjaWZuZGVmIE5PU1BMCisgICAgICBjYXNlIEVOX0FTRzoKKyAgICAgICAgZW5fYXNnID0geTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX1FVRToKKyAgICAgICAgZW5fcXVlID0geTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgIGNhc2UgRU5fUkVUOgorICAgICAgICBlbl9kZWwgPSB5OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU5fTUFJOgorI2lmZGVmIENLX0xPR0lOCisgICAgICAgIGlmIChpc2d1ZXN0ICYmIHkpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBub3QgdmFsaWQgZm9yIGd1ZXN0c1xuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICAgICAgZW5fbWFpID0geTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEVOX1BSSToKKyNpZmRlZiBDS19MT0dJTgorICAgICAgICBpZiAoaXNndWVzdCAmJiB5KSB7CisgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgbm90IHZhbGlkIGZvciBndWVzdHNcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX0xPR0lOICovCisgICAgICAgIGVuX3ByaSA9IHk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFTl9NS0Q6CisgICAgICAgIGVuX21rZCA9IHk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFTl9STUQ6CisgICAgICAgIGVuX3JtZCA9IHk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFTl9YSVQ6CisgICAgICAgIGVuX3hpdCA9IHk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFTl9FTkE6CisgICAgICAgIGlmICgoKHkgJiAxKSAmJiAhKGVuX2VuYSAmIDEpKSB8fAorICAgICAgICAgICAgKCh5ICYgMikgJiYgIShlbl9lbmEgJiAyKSkpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBESVNBQkxFIEVOQUJMRSBjYW4gbm90IGJlIHVuZG9uZVxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW5fZW5hID0geTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4oLTIpOworICAgIH0KKyAgICByZXR1cm4oMSk7Cit9CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworCisjaWZuZGVmIE5PRlJJTExTCisKK3N0YXRpYyBpbnQgZGVsX2xpcyA9IDA7CitzdGF0aWMgaW50IGRlbF9kb3QgPSAwOworc3RhdGljIGludCBkZWxfaGRnID0gMDsKK3N0YXRpYyBpbnQgZGVsX3BhZyA9IC0xOworc3RhdGljIGludCBkZWxfYXNrID0gMDsKKworI2lmbmRlZiBOT1NIT1cKK1ZPSUQKK3Nob3dkZWxvcHRzKCkgeworICAgIGludCB4ID0gMDsKKyAgICBleHRlcm4gaW50IG9wdGxpbmVzOworICAgIHBydG9wdCgmb3B0bGluZXMsIiIpOworICAgIHBydG9wdCgmb3B0bGluZXMsIkRFTEVURSIpOworICAgIGlmIChkZWxfYXNrID4gLTEpIHsKKyAgICAgICAgcHJ0b3B0KCZvcHRsaW5lcywgZGVsX2FzayA/ICIvQVNLIiA6ICIvTk9BU0siKTsKKyAgICAgICAgeCsrOworICAgIH0KKyNpZmRlZiBVTklYT1JPU0sKKyAgICBpZiAoZGVsX2RvdCA+IC0xKSB7CisgICAgICAgIHBydG9wdCgmb3B0bGluZXMsIGRlbF9kb3QgPyAiL0RPVEZJTEVTIiA6ICIvTk9ET1RGSUxFUyIpOworICAgICAgICB4Kys7CisgICAgfQorI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworICAgIGlmIChkZWxfbGlzID4gLTEpIHsKKyAgICAgICAgcHJ0b3B0KCZvcHRsaW5lcywgZGVsX2xpcyA/ICIvTElTVCIgOiAiL05PTElTVCIpOworICAgICAgICB4Kys7CisgICAgfQorICAgIGlmIChkZWxfaGRnID4gLTEpIHsKKyAgICAgICAgcHJ0b3B0KCZvcHRsaW5lcywgZGVsX2hkZyA/ICIvSEVBRElORyIgOiAiL05PSEVBRElORyIpOworICAgICAgICB4Kys7CisgICAgfQorI2lmbmRlZiBDS19UVEdXU0laCisgICAgaWYgKGRlbF9wYWcgPiAtMSkgeworICAgICAgICBwcnRvcHQoJm9wdGxpbmVzLCBkZWxfcGFnID8gIi9QQUdFIiA6ICIvTk9QQUdFIik7CisgICAgICAgIHgrKzsKKyAgICB9CisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworICAgIGlmICgheCkgcHJ0b3B0KCZvcHRsaW5lcywiKG5vIG9wdGlvbnMgc2V0KSIpOworICAgIHBydG9wdCgmb3B0bGluZXMsIiIpOworfQorI2VuZGlmIC8qIE5PU0hPVyAqLworCisKK2ludAorc2V0ZGVsb3B0cygpIHsKKyAgICBpbnQgeF9saXMgPSAtMSwgeF9wYWcgPSAtMSwgeF9kb3QgPSAtMSwgeF9oZGcgPSAtMSwgeF9hc2sgPSAtMTsKKyAgICBpbnQgZ2V0dmFsID0gMDsKKyAgICBjaGFyIGM7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCh5ID0gY21zd2koZGVsdGFiLG5kZWx0YWIsIlN3aXRjaCIsIiIseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgIGlmICh5ID09IC0zKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICB9CisgICAgICAgIGMgPSBjbWdicmsoKTsKKyAgICAgICAgaWYgKChnZXR2YWwgPSAoYyA9PSAnOicgfHwgYyA9PSAnPScpKSAmJiAhKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIGlmICghZ2V0dmFsICYmIChjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgY2FzZSBERUxfRE9UOgorICAgICAgICAgICAgeF9kb3QgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBERUxfTk9EOgorICAgICAgICAgICAgeF9kb3QgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBERUxfSERHOgorICAgICAgICAgICAgeF9oZGcgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBERUxfTElTOgorICAgICAgICAgICAgeF9saXMgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBERUxfTk9MOgorICAgICAgICAgICAgeF9saXMgPSAwOworICAgICAgICAgICAgYnJlYWs7CisjaWZuZGVmIENLX1RUR1dTSVoKKyAgICAgICAgICBjYXNlIERFTF9QQUc6CisgICAgICAgICAgICB4X3BhZyA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERFTF9OT1A6CisgICAgICAgICAgICB4X3BhZyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisgICAgICAgICAgY2FzZSBERUxfUVVJOgorICAgICAgICAgICAgeF9saXMgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBERUxfVlJCOgorICAgICAgICAgICAgeF9saXMgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBERUxfQVNLOgorICAgICAgICAgICAgeF9hc2sgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBERUxfTkFTOgorICAgICAgICAgICAgeF9hc2sgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCB0aGlzIG9wdGlvbiBjYW4gbm90IGJlIHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgfQorICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgICAgICAgICAgICAgIC8qIEdldCBjb25maXJtYXRpb24gKi8KKyAgICAgIHJldHVybih4KTsKKyAgICBpZiAoeF9wYWcgPiAtMSkgZGVsX3BhZyA9IHhfcGFnOworICAgIGlmICh4X2RvdCA+IC0xKSBkZWxfZG90ID0geF9kb3Q7CisgICAgaWYgKHhfaGRnID4gLTEpIGRlbF9oZGcgPSB4X2hkZzsKKyAgICBpZiAoeF9saXMgPiAtMSkgZGVsX2xpcyA9IHhfbGlzOworICAgIGlmICh4X2FzayA+IC0xKSBkZWxfYXNrID0geF9hc2s7CisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKK30KKworI2lmZGVmIE9TMgorc3RhdGljIGNoYXIgKiogeG10Y2hzID0gTlVMTDsKK3N0YXRpYyBpbnQgeG10Y2huID0gMDsKKyNlbmRpZiAvKiBPUzIgKi8KKworaW50Citkb2RlbCgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogREVMRVRFICovCisgICAgaW50IGksIGosIGssIHg7CisgICAgaW50IGZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVlZCB0byBjYWxsIGZpbGVzZWxlY3QoKSAqLworICAgIGludCBsZW4gPSAwOworICAgIGludCBiYWQgPSAwOworICAgIGludCBnZXR2YWwgPSAwLCBhc2tpbmcgPSAwOworICAgIGludCBzaW11bGF0ZSA9IDAsIHJjID0gMDsKKyAgICBsb25nIG1pbnNpemUgPSAtMUwsIG1heHNpemUgPSAtMUw7CisgICAgaW50IGhhdmVuYW1lID0gMCwgY29uZmlybWVkID0gMDsKKyAgICBpbnQgcWZsYWcgPSAwOworICAgIGludCBzdW1tYXJ5ID0gMDsKKyAgICBpbnQgZGVsZGlycyA9IDA7CisgICAgaW50IGRlbHRyZWUgPSAwOworICAgIGludCBpdHNhZGlyID0gMDsKKyAgICBpbnQgYXJnaXNkaXIgPSAwOworICAgIGludCB4bW9kZSA9IC0xLCBzY2FuID0gMCwgc2tpcCA9IDA7CisjaWZkZWYgQ09NTUVOVAorICAgIGludCBwYXNzID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgY2hhciBjOworICAgIGNoYXIgKiBkZWxkZWYgPSAiIjsKKyAgICBjaGFyIHNhZmVidWZbQ0tNQVhQQVRIKzFdOworICAgIHN0cnVjdCBGREIgc3csIGZpLCBmbDsKKyAgICBjaGFyCisgICAgICAqIGRlbF9hZnQgPSBOVUxMLAorICAgICAgKiBkZWxfYmVmID0gTlVMTCwKKyAgICAgICogZGVsX25hZiA9IE5VTEwsCisgICAgICAqIGRlbF9uYmYgPSBOVUxMLAorICAgICAgKiBkZWxfZXhjID0gTlVMTDsKKyAgICBpbnQKKyAgICAgIHhfbGlzID0gMCwKKyAgICAgIC8qIHhfZG90ID0gLTEsICovCisgICAgICB4X2hkZyA9IDA7CisKKyAgICBjaGFyICogZHhsaXN0WzhdOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgZHhsaXN0W2ldID0gTlVMTDsKKworICAgIGdfbWF0Y2hkb3QgPSBtYXRjaGRvdDsKKworICAgIGlmIChkZWxfbGlzID4gLTEpIHhfbGlzICAgID0gZGVsX2xpczsKKyAgICBpZiAoZGVsX2RvdCA+IC0xKSBtYXRjaGRvdCA9IGRlbF9kb3Q7CisgICAgaWYgKGRlbF9oZGcgPiAtMSkgeF9oZGcgICAgPSBkZWxfaGRnOworICAgIGlmIChkZWxfcGFnID4gLTEpIHhhc2ttb3JlID0gZGVsX3BhZzsKKyAgICBpZiAoZGVsX2FzayA+IC0xKSBhc2tpbmcgICA9IGRlbF9hc2s7CisKKyAgICBkaXJhY3RpdmUgPSAxOworICAgIG5vbGlua3MgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ5IGRlZmF1bHQgZG9uJ3QgZm9sbG93IGxpbmtzICovCisKKyAgICBjbWZkYmkoJnN3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBGREIgLSBjb21tYW5kIHN3aXRjaGVzICovCisgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIkZpbGUgc3BlY2lmaWNhdGlvbjtcbiBvciBzd2l0Y2giLAorICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICBuZGVsdGFiLCAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgIGRlbHRhYiwgICAgICAgICAgICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAmZmkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKyAgICAgICAgICAgKTsKKyAgICBjbWZkYmkoJmZsLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbnl0aGluZyB0aGF0IGRvZXNuJ3QgbWF0Y2ggKi8KKyAgICAgICAgICAgX0NNRkxELCAgICAgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsCisgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgKTsKKyAgYWdhaW46CisgICAgY21mZGJpKCZmaSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogMm5kIEZEQiAtIGZpbGUgdG8gZGVsZXRlICovCisgICAgICAgICAgIF9DTUlGSSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIkZpbGUocykgdG8gZGVsZXRlIiwgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgZGVsZGVmLCAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgbm9saW5rcyB8IGRlbGRpcnMsICAgICAgICAgICAvKiAwID0gZmlsZXMsIDEgPSBmaWxlcyBvciBkaXJzICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSA9IGRpcnMgb25seSAqLworICAgICAgICAgICB4eHN0cmluZywKKyAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgJmZsCisgICAgICAgICAgICk7CisgICAgd2hpbGUgKCFoYXZlbmFtZSAmJiAhY29uZmlybWVkKSB7CisgICAgICAgIHggPSBjbWZkYigmc3cpOyAgICAgICAgICAgICAgICAgLyogUGFyc2Ugc29tZXRoaW5nICovCisgICAgICAgIGlmICh4IDwgMCkgeyAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgIGlmICh4ID09IC0zKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICh4ID09IC0yIHx8IHggPT0gLTkpCisgICAgICAgICAgICAgIHByaW50ZigiP0RvZXMgbm90IG1hdGNoIHN3aXRjaCBvciBmaWxlbmFtZTogXCIlc1wiXG4iLGF0bWJ1Zik7CisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkgICAvKiBCcmVhayBvdXQgaWYgbm90IGEgc3dpdGNoICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGMgPSBjbWdicmsoKTsgICAgICAgICAgICAgICAgICAgLyogR2V0IGJyZWFrIGNoYXJhY3RlciAqLworICAgICAgICBpZiAoKGdldHZhbCA9IChjID09ICc6JyB8fCBjID09ICc9JykpICYmICEoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgIHJjID0gLTk7CisgICAgICAgICAgICBnb3RvIHhkZWxldGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnZXR2YWwgJiYgKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworICAgICAgICAgICAgcmMgPSAtOTsKKyAgICAgICAgICAgIGdvdG8geGRlbGV0ZTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGsgPSBjbXJlc3VsdC5ucmVzdWx0KSB7CisgICAgICAgICAgY2FzZSBERUxfQUZUOgorICAgICAgICAgIGNhc2UgREVMX0JFRjoKKyAgICAgICAgICBjYXNlIERFTF9OQUY6CisgICAgICAgICAgY2FzZSBERUxfTkJGOgorICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgaWYgKCh4ID0gY21kYXRlKCJGaWxlLXRpbWUiLCIiLCZzLDAseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9EYXRlLXRpbWUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICByYyA9IHg7CisgICAgICAgICAgICAgICAgZ290byB4ZGVsZXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnMrKzsKKyAgICAgICAgICAgIGRlbHRyZWUgPSAwOworICAgICAgICAgICAgc3dpdGNoIChrKSB7CisgICAgICAgICAgICAgIGNhc2UgREVMX0FGVDogbWFrZXN0cigmZGVsX2FmdCxzKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgREVMX0JFRjogbWFrZXN0cigmZGVsX2JlZixzKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgREVMX05BRjogbWFrZXN0cigmZGVsX25hZixzKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgREVMX05CRjogbWFrZXN0cigmZGVsX25iZixzKTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERFTF9ET1Q6CisgICAgICAgICAgICBtYXRjaGRvdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERFTF9OT0Q6CisgICAgICAgICAgICBtYXRjaGRvdCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERFTF9BTEw6CisgICAgICAgICAgICBmcyA9IDA7CisjaWZkZWYgVk1TCisgICAgICAgICAgICBkZWxkZWYgPSAiKi4qIjsgICAgICAgICAgICAgLyogVU5JWCwgV2luZG93cywgT1MvMiAqLworI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgICAgICAgICAgZGVsZGVmID0gIisiOyAgICAgICAgICAgICAgIC8qIEFPUy9WUyAqLworI2Vsc2UKKyAgICAgICAgICAgIGRlbGRlZiA9ICIqIjsgICAgICAgICAgICAgICAvKiBVTklYLCBXaW5kb3dzLCBPUy8yLCBWTVMuLi4gKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICAgICAgZGVsdHJlZSA9IDE7CisgICAgICAgICAgICBub2xpbmtzID0gMjsKKyAgICAgICAgICAgIG1hdGNoZG90ID0gMTsKKyAgICAgICAgICAgIHJlY3Vyc2l2ZSA9IDE7ICAgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggcHVycG9zZWx5Li4uICovCisgICAgICAgICAgY2FzZSBERUxfRElSOgorICAgICAgICAgICAgZGVsZGlycyA9IDE7CisgICAgICAgICAgICBnb3RvIGFnYWluOworICAgICAgICAgIGNhc2UgREVMX0VYQzoKKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKCJQYXR0ZXJuIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1BhdHRlcm4gcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICByYyA9IHg7CisgICAgICAgICAgICAgICAgZ290byB4ZGVsZXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnMrKzsKKyAgICAgICAgICAgIGRlbHRyZWUgPSAwOworICAgICAgICAgICAgbWFrZXN0cigmZGVsX2V4YyxzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgREVMX0hERzoKKyAgICAgICAgICAgIHhfaGRnID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFJFQ1VSU0lWRQorICAgICAgICAgIGNhc2UgREVMX1JFQzoKKyAgICAgICAgICAgIHJlY3Vyc2l2ZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICAgICAgICBjYXNlIERFTF9MSVM6CisgICAgICAgICAgICB4X2xpcyA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERFTF9TVU06CisgICAgICAgICAgICBzdW1tYXJ5ID0gMTsKKyAgICAgICAgICAgIHhfbGlzID0gMDsKKyAgICAgICAgICAgIHhfaGRnID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgREVMX05PTDoKKyAgICAgICAgICAgIHhfbGlzID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworI2lmbmRlZiBDS19UVEdXU0laCisgICAgICAgICAgY2FzZSBERUxfUEFHOgorICAgICAgICAgICAgeGFza21vcmUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBERUxfTk9QOgorICAgICAgICAgICAgeGFza21vcmUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworICAgICAgICAgIGNhc2UgREVMX1FVSToKKyAgICAgICAgICAgIHFmbGFnID0gMTsKKyAgICAgICAgICAgIHhfbGlzID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgREVMX1ZSQjoKKyAgICAgICAgICAgIHhfbGlzID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBERUxfU01BOgorICAgICAgICAgIGNhc2UgREVMX0xBUjoKKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtbnVtKCJGaWxlIHNpemUgaW4gYnl0ZXMiLCIwIiwxMCwmeSx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgZnMrKzsKKyAgICAgICAgICAgIGRlbHRyZWUgPSAwOworICAgICAgICAgICAgc3dpdGNoIChjbXJlc3VsdC5ucmVzdWx0KSB7CisgICAgICAgICAgICAgIGNhc2UgREVMX1NNQTogbWluc2l6ZSA9IHk7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIERFTF9MQVI6IG1heHNpemUgPSB5OyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBERUxfU0lNOgorICAgICAgICAgICAgc2ltdWxhdGUgPSAxOworICAgICAgICAgICAgeF9saXMgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBERUxfQVNLOgorICAgICAgICAgICAgYXNraW5nID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgREVMX05BUzoKKyAgICAgICAgICAgIGFza2luZyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERFTF9UWVA6IHsKKyAgICAgICAgICAgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgdHh0YmluW107CisgICAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkodHh0YmluLDMsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICBpZiAoeCA9PSAyKSB7ICAgICAgICAgICAgIC8qIEFMTCAqLworICAgICAgICAgICAgICAgICAgeG1vZGUgPSAtMTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAvKiBURVhUIG9yIEJJTkFSWSBvbmx5ICovCisgICAgICAgICAgICAgICAgICB4bW9kZSA9IHg7CisgICAgICAgICAgICAgICAgICBzY2FuID0gMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZigiP05vdCBpbXBsZW1lbnRlZCB5ZXQgLSBcIiVzXCJcbiIsYXRtYnVmKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHFmbGFnICYmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01GTEQpKSB7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgIH0KKyAgICBpZiAoY21yZXN1bHQuZmNvZGUgIT0gX0NNSUZJKSB7CisgICAgICAgIGlmICgqYXRtYnVmKSB7CisJICAgIGludCB4OworICAgICAgICAgICAgaWYgKGlzd2lsZChhdG1idWYpICYmIG56eHBhbmQoYXRtYnVmLG56eG9wdHMpID09IDApCisgICAgICAgICAgICAgIHByaW50ZigiP05vIGZpbGVzIG1hdGNoOiAlc1xuIixhdG1idWYpOworICAgICAgICAgICAgZWxzZSBpZiAoKHggPSB6Y2hraShhdG1idWYpKSA9PSAtMSkKKwkgICAgICBwcmludGYoIj9GaWxlIG5vdCBmb3VuZDogJXNcbiIsYXRtYnVmKTsKKwkgICAgZWxzZSBpZiAoeCA9PSAtMikKKwkgICAgICBwcmludGYoIj9Ob3QgYSByZWd1bGFyIGZpbGU6ICVzXG4iLGF0bWJ1Zik7CisJICAgIGVsc2UKKyAgICAgICAgICAgICAgLyogcHJpbnRmKCI/Tm90IGEgZGVsZXRhYmxlIGZpbGU6ICVzXG4iLGF0bWJ1Zik7ICovCisgICAgICAgICAgICAgIGdvdG8gdHJ5YW55d2F5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCI/QSBmaWxlIHNwZWNpZmljYXRpb24gaXMgcmVxdWlyZWRcbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICB0cnlhbnl3YXk6CisgICAgY2tzdHJuY3B5KHRtcGJ1ZixjbXJlc3VsdC5zcmVzdWx0LFRNUEJVRlNJWik7IC8qIFNhZmUgY29weSBvZiBmaWxlc3BlYyAqLworICAgIGlmIChkZWxkaXJzKSB7CisgICAgICAgIGNrc3RybmNweShzYWZlYnVmLGNtcmVzdWx0LnNyZXN1bHQsQ0tNQVhQQVRIKTsKKyNpZmRlZiBWTVNPUlVOSVgKKyAgICAgICAgbGVuID0gemdldGZzKHRtcGJ1Zik7ICAgICAgICAgICAvKiBJcyBpdCBhIGRpcmVjdG9yeSBuYW1lPyAqLworICAgICAgICBhcmdpc2RpciA9IHpnZnNfZGlyOyAgICAgICAgICAgIC8qIFRoZW4gYmVjYXVzZSBvZiBob3cgenhwYW5kKCkgKi8KKyAgICAgICAgaWYgKGFyZ2lzZGlyICYmIHpnZnNfbGluaykgICAgICAvKiB3b3Jrcywgd2UgaGF2ZSB0byBhZGQgaXQgdG8gKi8KKyAgICAgICAgICBhcmdpc2RpciA9IDA7ICAgICAgICAgICAgICAgICAvKiB0aGUgbGlzdC4gKi8KKyAgICAgICAgaWYgKGl0c2FkaXIpCisgICAgICAgICAgbGVuID0gLTI7CisjZWxzZQorICAgICAgICBsZW4gPSB6Y2hraSh0bXBidWYpOworICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICBhcmdpc2RpciA9IGlzZGlyKHRtcGJ1Zik7CisjZW5kaWYgLyogVk1TT1JVTklYICovCisgICAgfQorICAgIGRlYnVnKEYxMTAsIkRFTEVURSBmaWxlIix0bXBidWYsMCk7CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworCisjaWZkZWYgSUtTRAorI2lmZGVmIENLX0xPR0lOCisgICAgaWYgKGluc2VydmVyICYmIGlzZ3Vlc3QpIHsKKyAgICAgICAgcHJpbnRmKCI/U29ycnksIERFTEVURSB1bmF2YWlsYWJsZSB0byBndWVzdHNcbiIpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2VuZGlmIC8qIElLU0QgKi8KKworI2lmbmRlZiBPUzJPUlVOSVgKKyAgICBpZiAoc2ltdWxhdGUpIHsKKyAgICAgICAgcHJpbnRmKCI/U29ycnksIC9TSU1VTEFURSBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybVxuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworCisjaWZkZWYgQ09NTUVOVAorICAgIC8qIChub3QgbmVlZGVkKSAqLworICAgIGlmICghaXN3aWxkKHRtcGJ1ZikpIHsKKyAgICAgICAgY2hhciAqbTsKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICB4ID0gemNoa2kodG1wYnVmKTsKKyAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHgpIHsKKyAgICAgICAgICAgICAgY2FzZSAtMjogbSA9ICJOb3QgYSByZWd1bGFyIGZpbGUiOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAtMTogbSA9ICJGaWxlIG5vdCBmb3VuZCBvciBub3QgYWNjZXNzaWJsZSI7IGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OiBtID0gZXJybm8gPyBja19lcnJzdHIoKSA6ICJDYW4ndCBkZWxldGUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCI/JXM6IFwiJXNcIlxuIixtLHRtcGJ1Zik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIG1ha2VsaXN0KGRlbF9leGMsZHhsaXN0LDgpOworCisvKiB0bXBidWZbXSBoYXMgdGhlIG5hbWUgLSBub3cgZG8gYW55IG5lZWRlZCBjb252ZXJzaW9ucyBvbiBpdCAqLworCisjaWZkZWYgT1MyCisgICAgeyAgIC8qIExvd2VyIGxldmVsIGZ1bmN0aW9ucyBjaGFuZ2UgLyB0byBcLCBub3QgZ29vZCBmb3IgQ01ELkVYRS4gKi8KKyAgICAgICAgY2hhciAqcCA9IHRtcGJ1ZjsKKyAgICAgICAgd2hpbGUgKCpwKSB7ICAgICAgICAgICAgICAgICAgICAvKiBDaGFuZ2UgdGhlbSBiYWNrIHRvIFwgKi8KKyAgICAgICAgICAgIGlmICgqcCA9PSAnLycpICpwID0gJ1xcJzsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIFZNUworICAgIGlmIChpc3dpbGQodG1wYnVmKSkgeworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgLyogRG9lcyBub3QgaGFuZGxlICcuJyBhcyB2ZXJzaW9uIHNlcGFyYXRvciAqLworICAgICAgICBjaGFyICpwID0gdG1wYnVmOworICAgICAgICB4ID0gMDsKKyAgICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgICAgICBpZiAoKnAgPT0gJzsnKSB7CisgICAgICAgICAgICAgICAgeCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgIGlmICgheCkgY2tzdHJuY2F0KHRtcGJ1ZiwiOyoiLFRNUEJVRlNJWik7CisjZWxzZQorICAgICAgICBqID0gMDsgeCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGZvciBlbmRfZG90IGFuZCBudW1iZXIgb2YgZG90cyAqLworICAgICAgICBpID0gc3RybGVuKHRtcGJ1Zik7CisgICAgICAgIGlmICh0bXBidWZbaV0gPT0gJzsnKSB7CisgICAgICAgICAgICBja3N0cm5jYXQodG1wYnVmLCIwIixUTVBCVUZTSVopOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHRtcGJ1ZltpLS1dID09ICcuJykKKyAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaWYgKHRtcGJ1ZltpXSA9PSAnOycgfHwgdG1wYnVmW2ldID09ICc6JyB8fAorICAgICAgICAgICAgICAgICAgICB0bXBidWZbaV0gPT0gJ10nIHx8IHRtcGJ1ZltpXSA9PSAnPicpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0bXBidWZbaV0gPT0gJy4nKQorICAgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRtcGJ1ZltpXSAhPSAnOycpIHsgICAgIC8qIGRvdCBtYXkgaGF2ZSBiZWVuIHVzZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAoaikgeyAgICAgICAgICAgICAgICAvKiBsYXN0IGNoYXIgaXMgZG90ICovCisgICAgICAgICAgICAgICAgICBpZiAoeCkgICAgICAgICAgICAgICAgLyogc2Vjb25kIGlzIHZlcnNpb24gc2VwYXJhdG9yICovCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bXBidWYsIjAiLFRNUEJVRlNJWik7CisgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgLyogJ2Zvby4nICovCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bXBidWYsIjswIixUTVBCVUZTSVopOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA9PSAxKSAgICAgIC8qIGxhY2tpbmcgYSB2ZXJzaW9uIHNlcGFyYXRvciAqLworICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHRtcGJ1ZiwiOzAiLFRNUEJVRlNJWik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoeCA9PSAwKSAgICAgICAgLyogeCA9PSAyIGhhcyBhIHZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0bXBidWYsIi4qOzAiLFRNUEJVRlNJWik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfQorI2VuZGlmIC8qIFZNUyAqLworCisgICAgZGVidWcoRjExMCwiZG9kZWwgdG1wYnVmIix0bXBidWYsMCk7IC8qIEZpbGVuYW1lICovCisKKyNpZm5kZWYgT1MyT1JVTklYICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBidWlsdC1pbiBERUxFVEUgY29kZS4uLiAqLworICAgIC8qIENvbnN0cnVjdCBzeXN0ZW0gY29tbWFuZC4gKi8KKyAgICBja21ha21zZyhsaW5lLExJTkJVRlNJWixERUxDTUQsIiAiLHRtcGJ1ZixOVUxMKTsKKyNlbHNlCisjaWZkZWYgVk1TCisgICAgaWYgKGFza2luZykgeyAgICAgICAgICAgICAgICAgICAgICAgLyogTWF5YmUgb3ZlcndyaXRlIGluIFZNUyAqLworICAgICAgICBpZiAoeF9saXMpICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIG9wdGlvbnMgYXJlIG5lZWRlZC4uLiAqLworICAgICAgICAgIGNrbWFrbXNnKGxpbmUsTElOQlVGU0laLERFTENNRCwiIC9jb25maXJtL2xvZyAiLHRtcGJ1ZixOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNrbWFrbXNnKGxpbmUsTElOQlVGU0laLERFTENNRCwiIC9jb25maXJtICIsdG1wYnVmLE5VTEwpOworICAgIH0gZWxzZSBpZiAoeF9saXMpCisgICAgICBja21ha21zZyhsaW5lLExJTkJVRlNJWixERUxDTUQsIiAvbG9nICIsdG1wYnVmLE5VTEwpOworICAgIGNvbnJlcygpOworI2VuZGlmIC8qIFZNUyAqLworCisgICAgZGVidWcoRjExMCwiZG9kZWwgbGluZSIsbGluZSwwKTsKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKworI2lmZGVmIE1BQworICAgIHN1Y2Nlc3MgPSAoemRlbGV0KHRtcGJ1ZikgPT0gMCk7CisKKyNlbHNlICAvKiAhTUFDIC4uLiAqLworCisjaWZkZWYgT1MyT1JVTklYCisgICAgeworICAgICAgICBpbnQgZmlsZXNwYWNlID0gMDsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgaW50IGxpbmVzID0gMDsKKyAgICAgICAgaW50IG4gPSAwOworCisgICAgICAgIHMgPSB0bXBidWY7CisKKyNpZmRlZiBDS19UVEdXU0laCisjaWZkZWYgT1MyCisgICAgICAgIHR0Z2N3c3ooKTsKKyNlbHNlIC8qIE9TMiAqLworICAgICAgICAvKiBDaGVjayB3aGV0aGVyIHdpbmRvdyBzaXplIGNoYW5nZWQgKi8KKyAgICAgICAgaWYgKHR0Z3dzaXooKSA+IDApIHsKKyAgICAgICAgICAgIGlmICh0dF9yb3dzID4gMCAmJiB0dF9jb2xzID4gMCkgeworICAgICAgICAgICAgICAgIGNtZF9yb3dzID0gdHRfcm93czsKKyAgICAgICAgICAgICAgICBjbWRfY29scyA9IHR0X2NvbHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisKKyAgICAgICAgaWYgKHhfaGRnID4gMCAmJiAhc3VtbWFyeSkgeworICAgICAgICAgICAgcHJpbnRmKCJEZWxldGluZyAlcy4uLiVzXG4iLCBzLCBzaW11bGF0ZSA/ICIgKFNJTVVMQVRJT04pIiA6ICIiKTsKKyAgICAgICAgICAgIG4gKz0gMjsKKyAgICAgICAgfQorI2lmZGVmIFpYUkVXSU5ECisgICAgICAgIHogPSB6eHJld2luZCgpOyAgICAgICAgICAgICAgICAgLyogUmV3aW5kIGZpbGUgbGlzdCAqLworI2Vsc2UKKyAgICAgICAgaWYgKCFkZWxkaXJzKQorICAgICAgICAgIG56eG9wdHMgPSBaWF9GSUxPTkxZOworICAgICAgICBpZiAocmVjdXJzaXZlKSBuenhvcHRzIHw9IFpYX1JFQ1VSU0U7CisgICAgICAgIGlmIChtYXRjaGRvdCkgIG56eG9wdHMgfD0gWlhfTUFUQ0hET1Q7CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgeiA9IG56eHBhbmQocyxuenhvcHRzKTsgICAgICAgICAvKiBFeHBhbmQgZmlsZSBsaXN0ICovCisjZW5kaWYgLyogWlhSRVdJTkQgKi8KKyAgICAgICAgZGVidWcoRjExMSwiZG9kZWwiLHMseik7CisKKyAgICAgICAgLyogSWYgZGVsZXRpbmcgZGlyZWN0b3JpZXMsIHNvcnQgaW4gcmV2ZXJzZSBvcmRlciAqLworICAgICAgICAvKiBzbyB3ZSBkZWxldGUgdGhlIGZpbGVzIGZpcnN0LCB0aGVuIHRoZSBkaXJlY3RvcnkuICovCisKKyNpZmRlZiBPUzIKKyAgICAgICAgLyogSW4gSzk1LCB3ZSBoYXZlIG5vIG10Y2hzIGFycmF5LCBub3IgYW55IGNvbnRyb2wgb3ZlciAqLworICAgICAgICAvKiB0aGUgb3JkZXIgaW4gd2hpY2ggem5leHQoKSByZXR1cm5zIGZpbGVuYW1lcywgc28gd2UgICovCisgICAgICAgIC8qIG11c3QgY29weSB0aGUgYXJyYXkgYW5kIHNvcnQgaXQuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaWYgKHhtdGNocykgeyAgICAgICAgICAgICAgIC8qIEZyZWUgcHJldmlvdXMgbGlzdCBpbiBjYXNlICovCisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiZG9kZWwgZnJlZWluZyBwcmV2aW91cyBsaXN0IiwiIix4bXRjaG4pOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB4bXRjaG47IGkrKykgLyogaXQgd2Fzbid0IGZyZWVkIGxhc3QgdGltZS4gKi8KKyAgICAgICAgICAgICAgICAgIGlmICh4bXRjaHNbaV0pCisgICAgICAgICAgICAgICAgICAgIGZyZWUoeG10Y2hzW2ldKTsKKyAgICAgICAgICAgICAgICBmcmVlKHhtdGNocyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4bXRjaG4gPSAwOworICAgICAgICAgICAgeG10Y2hzID0gKGNoYXIgKiopbWFsbG9jKHogKiAoc2l6ZW9mKGNoYXIgKiopKSk7IC8qIE1ha2UgbmV3IG9uZSAqLworICAgICAgICAgICAgaWYgKCF4bXRjaHMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9NZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHo7IGkrKykgeworICAgICAgICAgICAgICAgIHhtdGNoc1tpXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgem5leHQodG1wYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoISp0bXBidWYpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCYoeG10Y2hzW2ldKSx0bXBidWYpOworICAgICAgICAgICAgICAgIGlmICgheG10Y2hzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP01lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworICAgICAgICAgICAgICAgICAgICB4bXRjaG4gPSBpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSAtOTsKKyAgICAgICAgICAgICAgICAgICAgZ290byB4ZGVsZXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBkZWJ1ZyhGMTExLCJkb2RlbCBhZGQiLHhtdGNoc1tpXSxpKTsgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHhtdGNobiA9IGk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkb2RlbCB4bXRjaG4iLCIiLHhtdGNobik7CisgICAgICAgICAgICBzaF9zb3J0KHhtdGNocyxOVUxMLHosMCxkZWxkaXJzLDApOworICAgICAgICB9CisjZWxzZQorI2lmZGVmIFVOSVgKKyAgICAgICAgc2hfc29ydChtdGNocyxOVUxMLHosMCxkZWxkaXJzLGZpbGVjYXNlKTsKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogT1MyICovCisKKyAgICAgICAgaWYgKHogPiAwKSB7CisgICAgICAgICAgICBpbnQgaTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGludCBpeCA9IDA7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICBzdWNjZXNzID0gMTsKKyAgICAgICAgICAgIGlmICh4X2hkZyA+IDApCisgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKworICAgICAgICAgICAgd2hpbGUgKAorI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgIGl4IDwgeG10Y2huCisjZWxzZQorICAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICApIHsgICAgICAgICAgICAgICAgICAvKiBMb29wIGZvciBhbGwgZmlsZXMgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICBja3N0cm5jcHkodG1wYnVmLHhtdGNoc1tpeCsrXSxUTVBCVUZTSVopOworI2Vsc2UKKyAgICAgICAgICAgICAgICB6bmV4dCh0bXBidWYpOyAgICAgICAgICAvKiBHZXQgbmV4dCBmaWxlICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgaWYgKCEqdG1wYnVmKSB7ICAgICAgICAgLyogTm8gbW9yZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZGlycyAmJiByZWN1cnNpdmUgJiYgYXJnaXNkaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh0bXBidWYsc2FmZWJ1ZixUTVBCVUZTSVopOworICAgICAgICAgICAgICAgICAgICAgICAgYXJnaXNkaXIgPSAwOyAgIC8qIChvbmx5IGRvIHRoaXMgb25jZSkgKi8KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNraXAgPSAwOworICAgICAgICAgICAgICAgIGlmICghZGVsdHJlZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnMpCisgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzZWxlY3QodG1wYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbF9hZnQsZGVsX2JlZixkZWxfbmFmLGRlbF9uYmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2l6ZSxtYXhzaXplLDAsOCxkeGxpc3QpIDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwKys7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXNraXAgJiYgc2NhbiAmJiBpdHNhZGlyKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFza2lwICYmIHNjYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNjYW5maWxlKHRtcGJ1ZiwmeSxuc2NhbmZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGVF9CSU46CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1vZGUgIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGVF9URVhUOgorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlRfN0JJVDoKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZUXzhCSVQ6CisjaWZkZWYgVU5JQ09ERQorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlRfVVRGODoKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZUX1VDUzI6CisjZW5kaWYgLyogVU5JQ09ERSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhtb2RlICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXArKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXNraXAgJiYgYXNraW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgICAgICAgICBja21ha21zZyhsaW5lLExJTkJVRlNJWiwiIERlbGV0ZSAiLHRtcGJ1ZiwiPyAiLE5VTEwpOworICAgICAgICAgICAgICAgICAgICB4ID0gZ2V0eWVzbm8obGluZSwzKTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBjb250aW51ZTsgICAgICAgICAgIC8qIG5vICovCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiBicmVhazsgICAgICAgICAgICAgIC8qIHllcyAqLworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogZ290byB4ZGVsZXRlOyAgICAgICAvKiBxdWl0ICovCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiBhc2tpbmcgPSAwOyBicmVhazsgIC8qIGdvICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgVk1TT1JVTklYCisgICAgICAgICAgICAgICAgbGVuID0gemdldGZzKHRtcGJ1Zik7ICAgLyogR2V0IGxlbmd0aCBhbmQgYWNjZXNzaWJpbGl0eSAqLworICAgICAgICAgICAgICAgIGl0c2FkaXIgPSB6Z2ZzX2RpcjsKKyAgICAgICAgICAgICAgICBpZiAoaXRzYWRpciAmJiB6Z2ZzX2xpbmspIHsgLyogVHJlYXQgbGlua3MgdG8gZGlyZWN0b3JpZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgaXRzYWRpciA9IDA7ICAgICAgICAvKiBhcyByZWd1bGFyIGZpbGVzICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzY2FuKSAgICAgICAgICAgLyogQnV0IG5vdCBpZiAvVFlQRTogd2FzIGdpdmVuICovCisgICAgICAgICAgICAgICAgICAgICAgc2tpcCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXRzYWRpcikgICAgICAgICAgICAvKiAoZW11bGF0ZSBub24tVW5peCBjb2RlKSAqLworICAgICAgICAgICAgICAgICAgbGVuID0gLTI7CisjZWxzZQorICAgICAgICAgICAgICAgIGxlbiA9IHpjaGtpKHRtcGJ1Zik7ICAgIC8qIEdldCBhY2Nlc3NpYmlsaXR5ICovCisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApICAgICAgICAgICAgLyogU2VlIGlmIGl0J3MgYSBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgICAgICAgIGl0c2FkaXIgPSBpc2Rpcih0bXBidWYpOworI2VuZGlmIC8qIFZNU09SVU5JWCAqLworCisgICAgICAgICAgICAgICAgaWYgKHNraXApIHsKKyNpZmRlZiBDT01NRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUb28gdmVyYm9zZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoeF9saXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcysrOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMgKFNLSVBQRUQpXG4iLHRtcGJ1Zik7CisjaWZkZWYgQ0tfVFRHV1NJWgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpIGdvdG8geGRlbGV0ZTsgZWxzZSBuID0gMDsKKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIkRFTEVURSBsZW4iLHRtcGJ1ZixsZW4pOworICAgICAgICAgICAgICAgIGlmIChzaW11bGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBmaWxlc3BhY2UgKz0gbGVuOworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoeF9saXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcysrOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMgKFNFTEVDVEVEKVxuIix0bXBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4eDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eCA9IGFza21vcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXh4KSBnb3RvIHhkZWxldGU7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA+PSAwIHx8ICFpdHNhZGlyKSB7IC8qIFJlZ3VsYXIgZmlsZSAqLworICAgICAgICAgICAgICAgICAgICB6ZGVsZXQodG1wYnVmKTsgICAgICAgICAgICAgICAgLyogb3Igc3ltbGluaywgZXRjLi4uICovCisgICAgICAgICAgICAgICAgICAgIGlmICh6Y2hraSh0bXBidWYpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNwYWNlICs9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeF9saXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAlcyAoT0spXG4iLHRtcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXNrbW9yZSgpKSBnb3RvIHhkZWxldGU7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhfbGlzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMgKEZBSUxFRDogJXMpXG4iLHRtcGJ1Zixja19lcnJzdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXNrbW9yZSgpKSBnb3RvIHhkZWxldGU7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKC8qIHBhc3MgPiAwICYmICovIGRlbGRpcnMgJiYgaXRzYWRpcikgeworICAgICAgICAgICAgICAgICAgICAvKiBJdCdzIGEgZGlyZWN0b3J5ICovCisgICAgICAgICAgICAgICAgICAgIGlmICh6cm1kaXIodG1wYnVmKSA+IC0xKSB7IC8qIE9ubHkgd29ya3MgaWYgZW1wdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeF9saXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAlcyAoT0spXG4iLHRtcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXNrbW9yZSgpKSBnb3RvIHhkZWxldGU7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4X2xpcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICVzIChGQUlMRUQ6ICVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja19lcnJzdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXNrbW9yZSgpKSBnb3RvIHhkZWxldGU7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHhfbGlzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBsaW5lcysrOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNkaXIodG1wYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAlcyAoRkFJTEVEOiBkaXJlY3RvcnkpXG4iLHRtcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAlcyAoRkFJTEVEOiBub3QgYSByZWd1bGFyIGZpbGUpXG4iLHRtcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpCisgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpIGdvdG8geGRlbGV0ZTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeF9oZGcgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmVzID4gMCkKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKQorICAgICAgICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpIGdvdG8geGRlbGV0ZTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVkIGZpbGUlcyAlc2RlbGV0ZWQsICVkIGJ5dGUlcyAlc2ZyZWVkJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAhPSAxID8gInMiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpbXVsYXRlID8gIndvdWxkIGJlICIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlc3BhY2UgIT0gMSA/ICJzIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICBzaW11bGF0ZSA/ICJ3b3VsZCBiZSAiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpbXVsYXRlID8gIiAobWF5YmUpIiA6ICIiCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXhfbGlzICYmICFzdWNjZXNzICYmICFxdWlldCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0RFTEVURSBmYWlsZWQgZm9yICVkIGZpbGUlcyBcCisodXNlIERFTEVURSAvTElTVCB0byBzZWUgZGV0YWlscylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGJhZCwgYmFkID09IDEgPyAiIiA6ICJzIgorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHhfbGlzID4gMCkgeworICAgICAgICAgICAgaWYgKGVycm5vKQorICAgICAgICAgICAgICBwcmludGYoIj8lczogJXNcbiIsY2tfZXJyc3RyKCksIHRtcGJ1Zik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ZigiP0Nhbid0IGRlbGV0ZTogJXNcbiIsdG1wYnVmKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlIC8qIE9TMk9SVU5JWCAqLworI2lmbmRlZiBWTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVycyAtIGxldCB0aGUgc3lzdGVtIGRvIGl0LiAqLworICAgIHhzeXN0ZW0obGluZSk7CisgICAgeCA9IG56eHBhbmQodG1wYnVmLG56eG9wdHMpOworICAgIHN1Y2Nlc3MgPSAoeCA+IDApID8gMCA6IDE7CisgICAgaWYgKHhfaGRnID4gMCkKKyAgICAgIHByaW50ZigiJXMgLSAlc2RlbGV0ZWRcbiIsIHRtcGJ1Ziwgc3VjY2VzcyA/ICIiIDogIm5vdCAiKTsKKyNlbHNlCisgICAgaWYgKGFza2luZykKKyAgICAgIHByaW50ZigiXG4iKTsKKyAgICB4ID0geHN5c3RlbShsaW5lKTsgICAgICAgICAgICAgICAgICAvKiB6c2hjbWQgcmV0dXJucyAxIGZvciBzdWNjZXNzICovCisgICAgc3VjY2VzcyA9ICh4ID4gMCkgPyAxIDogMDsKKyAgICBpZiAoeF9oZGcgPiAwICYmICFhc2tpbmcpCisgICAgICBwcmludGYoIiVzIC0gJXNkZWxldGVkXG4iLCB0bXBidWYsIHN1Y2Nlc3MgPyAiIiA6ICJub3QgIik7CisgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyAgeGRlbGV0ZToKKyAgICBpZiAoZ19tYXRjaGRvdCA+IC0xKSB7CisgICAgICAgIG1hdGNoZG90ID0gZ19tYXRjaGRvdDsgICAgICAgICAgLyogUmVzdG9yZSB0aGVzZS4uLiAqLworICAgICAgICBnX21hdGNoZG90ID0gLTE7CisgICAgfQorI2lmZGVmIE9TMgorICAgIGlmICh4bXRjaHMpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGRlYnVnKEYxMDEsImRvZGVsIGZyZWVpbmcgbGlzdCIsIiIseG10Y2huKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHhtdGNobjsgaSsrKQorICAgICAgICAgIGlmICh4bXRjaHNbaV0pIGZyZWUoeG10Y2hzW2ldKTsKKyAgICAgICAgZnJlZSh4bXRjaHMpOworICAgICAgICB4bXRjaHMgPSBOVUxMOworICAgICAgICB4bXRjaG4gPSAwOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBkZWJ1ZyhGMTAxLCJkb2RlbCByZXN1bHQiLCIiLHJjKTsKKyAgICByZXR1cm4oKHJjIDwgMCkgPyByYyA6IHN1Y2Nlc3MpOworfQorI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyNpZm5kZWYgTk9TUEwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgRUxTRSBjb21tYW5kICovCitfUFJPVE9UWVAoIFZPSUQgcHVzaHFjbWQsIChjaGFyICopICk7CisKK2ludAorZG9lbHNlKCkgeworICAgIGlmICghaWZjbWRbY21kbHZsXSkgeworICAgICAgICBwcmludGYoIj9FTFNFIGRvZXNuJ3QgZm9sbG93IElGXG4iKTsKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9CisjaWZkZWYgQ09NTUVOVAorLyoKKyAgV3JvbmcuICBUaGlzIHByZXZlbnRzIElGLi5FTFNFIElGLi4uRUxTRSBJRi4uLkVMU0UgSUYuLi5FTFNFLi4uCisgIGZyb20gd29ya2luZy4KKyovCisgICAgaWZjbWRbY21kbHZsXSA9IDA7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIGlmICghaWZ0ZXN0W2NtZGx2bF0pIHsgICAgICAgICAgICAgIC8qIElmIElGIHdhcyBmYWxzZSBkbyBFTFNFIHBhcnQgKi8KKyAgICAgICAgaWYgKG1hY2x2bCA+IC0xIHx8IHRsZXZlbCA+IC0xKSB7IC8qIEluIG1hY3JvIG9yIGNvbW1hbmQgZmlsZSAqLworICAgICAgICAgICAgZGVidWcoRjEwMCwiZG9lbHNlIHB1c2hpbmciLCIiLDApOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIHB1c2hjbWQoTlVMTCk7ICAgICAgICAgICAgICAvKiBzYXZlIHJlc3Qgb2YgY29tbWFuZC4gKi8KKyNlbHNlCisgICAgICAgICAgICAvKiBUaGlzIGZpeGVzIGNlcnRhaW4gb2JzY3VyZSBwcm9ibGVtcyAqLworICAgICAgICAgICAgLyogYnV0IGJyZWFrcyBtYW55IG90aGVyIGNvbnN0cnVjdGlvbnMgdGhhdCBtdXN0IHdvcmsuICovCisgICAgICAgICAgICBwdXNocWNtZChOVUxMKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgaW50ZXJhY3RpdmUsICovCisgICAgICAgICAgICBjbWluaShja3hlY2gpOyAgICAgICAgICAgICAgLyoganVzdCBzdGFydCBhIG5ldyBjb21tYW5kICovCisgICAgICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAgICAgICAgLyogKGxpa2UgaW4gTVMtRE9TIEtlcm1pdCkgKi8KKyAgICAgICAgICAgIGlmIChwZmxhZykgcHJvbXB0KHh4c3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbmRpdGlvbiBpcyBmYWxzZSAqLworICAgICAgICBpZiAoKHkgPSBjbXR4dCgiY29tbWFuZCB0byBiZSBpZ25vcmVkIiwiIiwmcyxOVUxMKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsgICAgICAgICAgICAgICAgICAgIC8qIEdvYmJsZSB1cCByZXN0IG9mIGxpbmUgKi8KKyAgICB9CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9TUEwKK2ludAorZG9zd2l0Y2goKSB7CisgICAgY2hhciAqbHAsICphcDsgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gYXJndW1lbnQgcG9pbnRlciAqLworICAgIGludCBsZW4gPSAwLCB4LCB5LCBwcCA9IDA7CisgICAgY2hhciBicmJ1ZlszXTsKKworICAgIC8qIEdldCB2YXJpYWJsZSBuYW1lICovCisKKyAgICB0bXBidWZbMF0gPSBOVUw7CisgICAgYnJidWZbMF0gPSAneyc7CisgICAgYnJidWZbMV0gPSAnfSc7CisgICAgYnJidWZbMl0gPSBOVUw7CisKKyAgICB5ID0gY21mbGQoIlZhcmlhYmxlIG5hbWUiLCIiLCZzLHh4c3RyaW5nKTsKKyAgICBkZWJ1ZyhGMTExLCJkb3N3aXRjaCBjbWZsZCIscyx5KTsKKyAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgaWYgKHkgPT0gLTMpCQkJLyogQmVjYXVzZSBicnN0cmlwKCkgd3JpdGVzICovCisgICAgICAgICAgcyA9IGJyYnVmOwkJCS8qIGludG8gaXRzIGFyZ3VtZW50LiAqLworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuKHkpOworICAgIH0KKyAgICBkZWJ1ZyhGMTEwLCJkb3N3aXRjaCBBIixzLDApOworICAgIGlmICghc3RyY21wKHMsIigiKSkgeworICAgICAgICBwcCsrOworICAgICAgICBpZiAoKHkgPSBjbWZsZCgiVmFyaWFibGUgbmFtZSIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgIGlmICh5ID09IC0zKQorICAgICAgICAgICAgICBzID0gYnJidWY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJldHVybih5KTsKKwkgICAgZGVidWcoRjExMCwiZG9zd2l0Y2ggQiIscywwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBsZW4gPSBja3N0cm5jcHkodG1wYnVmLGJyc3RyaXAocyksVE1QQlVGU0laKTsKKyAgICBpZiAodG1wYnVmWzBdID09IENNRFEpIHsKKyAgICAgICAgaWYgKGNoa3ZhcihzKSA8IDEpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1ZhcmlhYmxlIG5hbWUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocHAgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBvcGVuIHBhcmVuIGdpdmVuIHBhcnNlIGNsb3NpbmcgKi8KKyAgICAgICAgaWYgKCh5ID0gY21mbGQoIkNsb3NpbmcgcGFyZW50aGVzaXMiLCIiLCZzLE5VTEwpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoc3RyY21wKGF0bWJ1ZiwiKSIpKSB7CisgICAgICAgICAgICBwcmludGYoIj9DbG9zaW5nIHBhcmVudGhlc2lzIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbHAgPSBsaW5lOworICAgIHggPSBja3N0cm5jcHkobHAsIl9zd2l0eCAiLExJTkJVRlNJWik7IC8qIF9zd2l0eCArIHNwYWNlICovCisgICAgbHAgKz0geDsKKyAgICBhcCA9IGxwOworICAgIGRlYnVnKEYwMTAsIlNXSVRDSCBhIixsaW5lLDApOworCisjaWZkZWYgQ09NTUVOVAorICAgIHggPSBja21ha21zZyhscCxMSU5CVUZTSVoteCx0bXBidWYsIiAiLE5VTEwsTlVMTCk7IC8qIHZhcmlhYmxlIG5hbWUgKyBTUCAqLworI2Vsc2UKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2YXJpYWJsZSBuYW1lICsgU1AgKi8KKyAgICAgICAgY2hhciAqIHAgPSB0bXBidWY7CisJaWYgKGxlbiA+IDApIHsKKwkgICAgaWYgKHRtcGJ1ZlswXSA9PSAnKCcgJiYgdG1wYnVmW2xlbi0xXSA9PSAnKScpIHsKKwkJdG1wYnVmW2xlbi0xXSA9IE5VTDsKKwkJcCsrOworCSAgICB9CisgICAgICAgIH0KKyAgICAgICAgeCA9IGNrbWFrbXNnKGxwLExJTkJVRlNJWi14LCJ7IixicnN0cmlwKHApLCJ9IiwiICIpOworICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgZGVidWcoRjAxMCwiU1dJVENIIGIiLGxpbmUsMCk7CisgICAgbHAgKz0geDsKKworICAgIC8qIEdldCBib2R5ICovCisKKyAgICBpZiAoKHkgPSBjbXR4dCgic2VyaWVzIG9mIGNhc2VzIiwiIiwmcyxOVUxMKSkgPCAwKSByZXR1cm4oeSk7CisgICAgaWYgKCh5ID0gKGludClzdHJsZW4ocykpIDwgMSkgcmV0dXJuKC0yKTsKKyAgICBpZiAoc1swXSAhPSAneycgJiYgc1t5LTFdICE9ICd9JykgeyAvKiBTdXBwbHkgYnJhY2VzIGlmIG1pc3NpbmcgKi8KKyAgICAgICAgY2ttYWttc2codG1wYnVmLFRNUEJVRlNJWiwieyAiLHMsIiB9IixOVUxMKTsKKyAgICAgICAgcyA9IHRtcGJ1ZjsKKyAgICB9CisgICAgaWYgKGxpdGNtZCgmcywmbHAsKExJTkJVRlNJWiAtIChscCAtIChjaGFyICopbGluZSkgLSAyKSkgPCAwKSB7CisgICAgICAgIHByaW50ZigiP1VuYmFsYW5jZWQgYnJhY2VzXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBkZWJ1ZyhGMDEwLCJTV0lUQ0ggYyIsbGluZSwwKTsKKworICAgIHggPSBtbG9vayhtYWN0YWIsIl9zd2l0eCIsbm1hYyk7ICAgIC8qIExvb2sgdXAgU1dJVENIIG1hY3JvIGRlZmluaXRpb24gKi8KKyAgICBpZiAoeCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgdGhlcmU/ICovCisgICAgICAgIGFkZG1tYWMoIl9zd2l0eCIsc3dfZGVmKTsgICAgICAgLyogUHV0IGl0IGJhY2suICovCisgICAgICAgIGlmICgoeCA9IG1sb29rKG1hY3RhYiwiX3N3aXR4IixubWFjKSkgPCAwKSB7IC8qIExvb2sgaXQgdXAgYWdhaW4uICovCisgICAgICAgICAgICBwcmludGYoIj9TV0lUQ0ggbWFjcm8gZGVmaW5pdGlvbiBnb25lIVxuIik7IC8qIFNob3VsZG4ndCBoYXBwZW4uICovCisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICB9CisgICAgfQorICAgIGRlYnVnKEYwMTAsIlNXSVRDSCBjb21tYW5kIixsaW5lLDApOyAvKiBFeGVjdXRlIHRoZSBTV0lUQ0ggbWFjcm8uICovCisgICAgc3VjY2VzcyA9IGRvZG8oeCxhcCxjbWRzdGtbY21kbHZsXS5jY2ZsZ3MgfCBDRl9JTUFDKTsKKyAgICBkZWJ1ZyhGMTAxLCJTV0lUQ0ggc3RhdHVzIiwiIixzdWNjZXNzKTsKKyAgICByZXR1cm4oc3VjY2Vzcyk7Cit9CisKK2ludAorZG9mb3IoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBGT1IgY29tbWFuZC4gKi8KKyAgICBpbnQgaSwgZngsIGZ5LCBmejsgICAgICAgICAgICAgICAgICAvKiBsb29wIHZhcmlhYmxlcyAqLworICAgIGNoYXIgKmFwLCAqZGk7ICAgICAgICAgICAgICAgICAgICAgIC8qIG1hY3JvIGFyZ3VtZW50IHBvaW50ZXIgKi8KKyAgICBpbnQgcHAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYXJlbiBsZXZlbCAqLworICAgIGludCBtdXN0cXVvdGUgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBpZiAoKHkgPSBjbWZsZCgiVmFyaWFibGUgbmFtZSIsIiIsJnMsTlVMTCkpIDwgMCkgeworICAgICAgICAgICAgaWYgKHkgPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9WYXJpYWJsZSBuYW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKHMsIigiKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcHArKzsKKyAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgIGlmICgoeSA9IHBhcnNldmFyKHMsJngsJnopKSA8IDApICAgIC8qIENoZWNrIHZhcmlhYmxlLiAqLworICAgICAgcmV0dXJuKHkpOworI2Vsc2UKKyAgICBpZiAoKnMgPT0gQ01EUSkgICAgICAgICAgICAgICAgICAgICAvKiBJZiBsb29wIHZhcmlhYmxlIHN0YXJ0cyB3aXRoICovCisgICAgICBtdXN0cXVvdGUrKzsgICAgICAgICAgICAgICAgICAgICAgLyogYmFja3NsYXNoLCBtdXN0cXVvdGUgaXMgPiAwLiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIGxwID0gbGluZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ1aWxkIGEgY29weSBvZiB0aGUgY29tbWFuZCAqLworICAgIGNrc3RybmNweShscCwiX2ZvcnggIixMSU5CVUZTSVopOworICAgIGxwICs9IChpbnQpc3RybGVuKGxpbmUpOyAgICAgICAgICAgIC8qICJfZm9yIiBtYWNyby4gKi8KKyAgICBhcCA9IGxwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHBvaW50ZXIgdG8gbWFjcm8gYXJncy4gKi8KKworICAgIGlmICgqcyA9PSBDTURRKSBzKys7ICAgICAgICAgICAgICAgIC8qIFNraXAgcGFzdCBiYWNrc2xhc2ggaWYgYW55LiAqLworICAgIHdoaWxlICgoKmxwKysgPSAqcysrKSkgOyAgICAgICAgICAgIC8qIGNvcHkgaXQgKi8KKyAgICBscC0tOyAqbHArKyA9IFNQOyAgICAgICAgICAgICAgICAgICAvKiBhZGQgYSBzcGFjZSAqLworCisgICAgaWYgKCh5ID0gY21udW0oImluaXRpYWwgdmFsdWUiLCIiLDEwLCZmeCx4eHN0cmluZykpIDwgMCkgeworICAgICAgICBpZiAoeSA9PSAtMykgcmV0dXJuKC0yKTsKKyAgICAgICAgZWxzZSByZXR1cm4oeSk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsImRvZm9yIGZ4IiwiIixmeCk7CisgICAgcyA9IGF0bWJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgYXRvbSBidWZmZXIgKi8KKworICAgIGlmICgoaW50KXN0cmxlbihzKSA8IDEpIGdvdG8gYmFkZm9yOworLyoKKyAgSW4gZWRpdCAxOTIsIHdlIGNoYW5nZSB0aGUgbG9vcCB2YXJpYWJsZXMgdG8gYmUgZXZhbHVhdGVkIGF0IGxvb3AgZW50cnksCisgIG5vdCBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcC4gIFRoaXMgd2FzIHJlcXVpcmVkIGluIG9yZGVyIHRvIGFsbG93CisgIFx2KGFyZ2MpIHRvIGJlIHVzZWQgYXMgYSBsb29wIHZhcmlhYmxlLCBvciBpbiBhIGxvb3AtdmFyaWFibGUgZXhwcmVzc2lvbi4KKyAgVGh1cywgd2UgY2FuJ3QgaGF2ZSBGT1IgbG9vcHMgdGhhdCBtb2RpZnkgdGhlaXIgb3duIGV4aXQgY29uZGl0aW9ucyBieQorICBjaGFuZ2luZyB0aGUgZmluYWwgdmFsdWUgb3IgdGhlIGluY3JlbWVudC4gIFRoZSBwcm9ibGVtIHdpdGggXHYoYXJnYykgd2FzCisgIHRoYXQgaXQgaXMgb24gdGhlIG1hY3JvIHN0YWNrOyBhZnRlciBlbnRyeSBpbnRvIHRoZSBfZm9yeCBtYWNybywgaXQgaXMgYXQKKyAgdGhlIHdyb25nIHBsYWNlLgorKi8KKyAgICBzcHJpbnRmKHRtcGJ1ZiwiJWQiLGZ4KTsgICAgICAgICAgICAvKiAoU0FGRSkgU3Vic3RpdHV0ZSBhY3R1YWwgdmFsdWUgKi8KKyAgICBzID0gdG1wYnVmOworICAgIHdoaWxlICgoKmxwKysgPSAqcysrKSkgOyAgICAgICAgICAgIC8qICh3aGF0IHRoZXkgYWN0dWFsbHkgdHlwZWQpICovCisgICAgbHAtLTsgKmxwKysgPSBTUDsKKyNpZmRlZiBERUJVRworICAgICpscCA9IE5VTDsKKyAgICBkZWJ1ZyhGMTEwLCJGT1IgQSIsbGluZSwwKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgaWYgKCh5ID0gY21udW0oImZpbmFsIHZhbHVlIiwiIiwxMCwmZnkseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgaWYgKHkgPT0gLTMpIHJldHVybigtMik7CisgICAgICAgIGVsc2UgcmV0dXJuKHkpOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJkb2ZvciBmeSIsIiIsZnkpOworICAgIHMgPSBhdG1idWY7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbWUgZGVhbCAqLworICAgIGlmICgoaW50KXN0cmxlbihzKSA8IDEpCisgICAgICBnb3RvIGJhZGZvcjsKKworICAgIHNwcmludGYodG1wYnVmLCIlZCIsZnkpOyAgICAgICAgICAgIC8qIFNBRkUgKi8KKyAgICBzID0gdG1wYnVmOworICAgIHdoaWxlICgoKmxwKysgPSAqcysrKSkgOworICAgIGxwLS07CisgICAgKmxwKysgPSBTUDsKKyNpZmRlZiBERUJVRworICAgICpscCA9IE5VTDsKKyAgICBkZWJ1ZyhGMTEwLCJGT1IgQiIsbGluZSwwKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgeF9pZm51bSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IG9yIHBhcmVudGhlc2lzICovCisgICAgZGkgPSAoZnggPCBmeSkgPyAiMSIgOiAiLTEiOyAgICAgICAgLyogRGVmYXVsdCBpbmNyZW1lbnQgKi8KKyAgICBpZiAoKHkgPSBjbW51bSgiaW5jcmVtZW50IixkaSwxMCwmZnoseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgZGVidWcoRjExMSwiZG9mb3IgaW5jcmVtZW50IixhdG1idWYseSk7CisgICAgICAgIHhfaWZudW0gPSAwOworICAgICAgICBpZiAoeSA9PSAtMykgeyAgICAgICAgICAgICAgICAgIC8qIFByZW1hdHVyZSB0ZXJtaW5hdGlvbiAqLworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfSBlbHNlIGlmICh5ID09IC0yKSB7ICAgICAgICAgICAvKiBNYXliZSBjbG9zaW5nIHBhcmVuICovCisgICAgICAgICAgICBpZiAoIXN0cmNtcChhdG1idWYsIikiKSkgeworICAgICAgICAgICAgICAgIHBwLS07ICAgICAgICAgICAgICAgICAgIC8qIENvdW50IGl0ICovCisgICAgICAgICAgICAgICAgcyA9IGRpOyAgICAgICAgICAgICAgICAgLyogc3VwcGx5IGRlZmF1bHQgaW50ZXJ2YWwgKi8KKyAgICAgICAgICAgICAgICBmeiA9IGF0b2kocyk7CisgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGNsb3NpbmcgcGFyZW4sIGludmFsaWQgKi8KKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVyIGVycm9yICovCisgICAgICAgICAgcmV0dXJuKHkpOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciAqLworICAgICAgICB4X2lmbnVtID0gMDsKKyAgICAgICAgZGVidWcoRjEwMSwiZG9mb3IgZnoiLCIiLGZ6KTsKKyAgICAgICAgcyA9IGF0bWJ1ZjsgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgaXQgKi8KKyAgICB9CisgICAgaWYgKChpbnQpc3RybGVuKHMpIDwgMSkKKyAgICAgIGdvdG8gYmFkZm9yOworCisgICAgc3ByaW50Zih0bXBidWYsIiVkIixmeik7ICAgICAgICAgICAgLyogKFNBRkUpIFNhbWUgZGVhbCAqLworICAgIHMgPSB0bXBidWY7CisgICAgd2hpbGUgKCgqbHArKyA9ICpzKyspKSA7CisgICAgbHAtLTsgKmxwKysgPSBTUDsKKworI2lmZGVmIERFQlVHCisgICAgKmxwID0gTlVMOworICAgIGRlYnVnKEYxMTAsIkZPUiBDIixsaW5lLDApOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgICAvKiBJbnNlcnQgdGhlIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24gb3BlcmF0b3IgKi8KKyAgICBpZiAoZnogPCAwKQorICAgICAgKmxwKysgPSAnPCc7CisgICAgZWxzZQorICAgICAgKmxwKysgPSAnPic7CisgICAgKmxwKysgPSBTUDsKKworI2lmZGVmIERFQlVHCisgICAgKmxwID0gTlVMOworICAgIGRlYnVnKEYxMTAsIkZPUiBEIixsaW5lLDApOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgICBpZiAocHAgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBvcGVuIHBhcmVuIGdpdmVuIHBhcnNlIGNsb3NpbmcgKi8KKyAgICAgICAgaWYgKCh5ID0gY21mbGQoIkNsb3NpbmcgcGFyZW50aGVzaXMiLCIiLCZzLE5VTEwpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoc3RyY21wKGF0bWJ1ZiwiKSIpKSB7CisgICAgICAgICAgICBwcmludGYoIj9DbG9zaW5nIHBhcmVudGhlc2lzIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCh5ID0gY210eHQoIkNvbW1hbmQgdG8gZXhlY3V0ZSIsIiIsJnMsTlVMTCkpIDwgMCkgcmV0dXJuKHkpOworICAgIGlmICgoeSA9IChpbnQpc3RybGVuKHMpKSA8IDEpIHJldHVybigtMik7CisgICAgaWYgKHNbMF0gIT0gJ3snICYmIHNbeS0xXSAhPSAnfScpIHsgLyogU3VwcGx5IGJyYWNlcyBpZiBtaXNzaW5nICovCisgICAgICAgIGNrbWFrbXNnKHRtcGJ1ZixUTVBCVUZTSVosInsgIixzLCIgfSIsTlVMTCk7CisgICAgICAgIHMgPSB0bXBidWY7CisgICAgfQorICAgIGlmIChsaXRjbWQoJnMsJmxwLChMSU5CVUZTSVogLSAobHAgLSAoY2hhciAqKWxpbmUpIC0gMikpIDwgMCkgeworICAgICAgICBwcmludGYoIj9VbmJhbGFuY2VkIGJyYWNlc1xuIik7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICAqbHAgPSBOVUw7CisgICAgZGVidWcoRjExMCwiRk9SIEUiLGxpbmUsMCk7CisjZW5kaWYgLyogREVCVUcgKi8KKworI2lmZGVmIENPTU1FTlQKKy8qIFRvbyBzdHJpY3QgKi8KKyAgICBpZiAoZnogPT0gMCkgeworICAgICAgICBwcmludGYoIj9aZXJvIGluY3JlbWVudCBub3QgYWxsb3dlZFxuIik7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworLyoKKyAgSW4gdmVyc2lvbiA4LjAgd2UgZGVjaWRlZCB0byBhbGxvdyBtYWNybyBuYW1lcyBhbnlwbGFjZSBhIG51bWVyaWMtdmFsZWQKKyAgdmFyaWFibGUgY291bGQgYXBwZWFyLiAgQnV0IHRoaXMgY2F1c2VkIHRyb3VibGUgZm9yIHRoZSBGT1IgbG9vcHMgYmVjYXVzZQorICB0aGUgcXVvdGluZyBpbiBmb3JfZGVmW10gYXNzdW1lZCBhIFwlaS1zdHlsZSBsb29wIHZhcmlhYmxlLiAgV2UgYWNjb3VudAorICBmb3IgdGhpcyBoZXJlIGluIHRoZSBpZiAobXVzdHF1b3RlKS4uLmVsc2UgbG9naWMgYnkgaW52b2tpbmcgc2VwYXJhdGUKKyAgRk9SIG1hY3JvIGRlZmluaXRpb25zIGluIHRoZSB0d28gY2FzZXMuCisqLworICAgIGlmIChtdXN0cXVvdGUpIHsgICAgICAgICAgICAgICAgICAgIC8qIFwlaS1zdHlsZSBsb29wIHZhcmlhYmxlICovCisgICAgICAgIHggPSBtbG9vayhtYWN0YWIsIl9mb3J4IixubWFjKTsgLyogTG9vayB1cCBGT1IgbWFjcm8gZGVmaW5pdGlvbiAqLworICAgICAgICBpZiAoeCA8IDApIHsgICAgICAgICAgICAgICAgICAgIC8qIE5vdCB0aGVyZT8gKi8KKyAgICAgICAgICAgIGFkZG1tYWMoIl9mb3J4Iixmb3JfZGVmKTsgICAvKiBQdXQgaXQgYmFjay4gKi8KKyAgICAgICAgICAgIGlmICgoeCA9IG1sb29rKG1hY3RhYiwiX2ZvcngiLG5tYWMpKSA8IDApIHsgLyogTG9vayBpdCB1cCBhZ2Fpbi4gKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIj9GT1IgbWFjcm8gZGVmaW5pdGlvbiBnb25lIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvb3AgdmFyaWFibGUgaXMgYSBtYWNybyAqLworICAgICAgICB4ID0gbWxvb2sobWFjdGFiLCJfZm9yeiIsbm1hYyk7CisgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgYWRkbW1hYygiX2ZvcnoiLGZvel9kZWYpOworICAgICAgICAgICAgaWYgKCh4ID0gbWxvb2sobWFjdGFiLCJfZm9yeiIsbm1hYykpIDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0ZPUiBtYWNybyBkZWZpbml0aW9uIGdvbmUhXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRlYnVnKEYwMTAsIkZPUiBjb21tYW5kIixsaW5lLDApOyAgIC8qIEV4ZWN1dGUgdGhlIEZPUiBtYWNyby4gKi8KKyAgICByZXR1cm4oc3VjY2VzcyA9IGRvZG8oeCxhcCxjbWRzdGtbY21kbHZsXS5jY2ZsZ3MgfCBDRl9JTUFDKSk7CisKK2JhZGZvcjoKKyAgICBwcmludGYoIj9JbmNvbXBsZXRlIEZPUiBjb21tYW5kXG4iKTsKKyAgICByZXR1cm4oLTIpOworfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9GUklMTFMKKy8qIERvIHRoZSBCVUcgY29tbWFuZCAqLworCitpbnQKK2RvYnVnKCkgeworICAgIGludCBuOworICAgIGNoYXIgKiBzID0gIiI7CisgICAgZXh0ZXJuIGNoYXIgKiBrX2luZm9fZGlyOworCisgICAgaWYgKGtfaW5mb19kaXIpCisgICAgICBzID0ga19pbmZvX2RpcjsKKworI2lmZGVmIENPTU1FTlQKKyAgICBwcmludGYoIlxuJXMsJXNcbiBOdW1lcmljOiAlbGQiLHZlcnNpbyxja3hzeXMsdmVybnVtKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgcHJpbnRmKAorIlxuQmVmb3JlIHJlcXVlc3RpbmcgdGVjaG5pY2FsIHN1cHBvcnQgZnJvbSBDb2x1bWJpYSBVLiwgcGxlYXNlIGNvbnN1bHQ6XG5cbiIKKyAgICAgICAgICAgKTsKKyAgICBuID0gNzsKKyNpZmRlZiBPUzIKKyAgICBwcmludGYoIiAuIFlvdXIgXCJLZXJtaXQgOTVcIiB1c2VyIG1hbnVhbCAodXNlIHRoZSBNQU5VQUwgY29tbWFuZCkuXG4iKTsKKyAgICBwcmludGYoIiAuIFRoZSB0ZWNobmljYWwgcmVmZXJlbmNlIG1hbnVhbCwgXCJVc2luZyBDLUtlcm1pdFwiLlxuIik7CisgICAgbiArPSAyOworI2Vsc2UKKyAgICBwcmludGYoIiAuIFRoZSBib29rIFwiVXNpbmcgQy1LZXJtaXRcIiAodHlwZSBIRUxQIGZvciBtb3JlIGluZm8pLlxuIik7CisgICAgbiArPSAxOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgcHJpbnRmKCIgLiBZb3VyIG93biBvcmdhbml6YXRpb24ncyBzdXBwb3J0IHN0YWZmLCBpZiBhbnkuXG4iKTsKKyAgICBwcmludGYoCisiIC4gVGhlIGNvbXAucHJvdG9jb2xzLmtlcm1pdC5taXNjIG5ld3Nncm91cC5cbiIpOworICAgIHByaW50ZigKKyIgLiBUaGUgS2VybWl0IHN1cHBvcnQgd2Vic2l0ZSwgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3N1cHBvcnQuaHRtbCBcbiIKKyAgICAgICAgICAgKTsKKyAgICBwcmludGYoCisKKyIgLiBUaGUgS2VybWl0IEZBUSwgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L25ld2ZhcS5odG1sIFxuIik7CisjaWZkZWYgT1MyCisgICAgcHJpbnRmKAorIiAuIFRoZSBLZXJtaXQgOTUgRkFRLCBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvazk1ZmFxLmh0bWwgXG4iKTsKKyAgICBuKys7CisjZW5kaWYgLyogT1MyICovCisKKyAgICBwcmludGYoCisiIC4gVGhlIEMtS2VybWl0IEZBUSwgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZmFxLmh0bWwgXG4iKTsKKyAgICBuICs9IDQ7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoIlxuXAorSWYgeW91IHN0aWxsIG5lZWQgaGVscCBvciBoYXZlIGEgYnVnIHRvIHJlcG9ydCBhZnRlciBjb25zdWx0aW5nIHRoZXNlIHNvdXJjZXMsIgorICAgICAgICAgICApOworICAgIHByaW50ZigiXG5zZW5kIGUtbWFpbCB0bzpcblxuIik7CisgICAgbiArPSAyOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCIgIG1haWx0bzprZXJtaXQtc3VwcG9ydEBjb2x1bWJpYS5lZHVcblxuIik7CisgICAgbiArPSAxOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgcHJpbnRmKCJPciBjb250YWN0IHVzIGJ5IHBvc3Q6XG5cbiIpOworICAgIHByaW50ZigKKyIgIEtlcm1pdCwgQ29sdW1iaWEgVW5pdmVyc2l0eSwgNjEyIFcgMTE1IFN0cmVldCwgTmV3IFlvcmsgTlkgIDEwMDI1LCBVU0FcblxuIgorICAgICAgICAgICApOworICAgIG4gKz0gMTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigiT3IgYnkgZmF4IGF0ICsxICgyMTIpIDY2Mi02NDQyLlxuXG4iKTsKKyAgICBuICs9IDE7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyNpZmRlZiBDT01NRU5UCisgICAgcHJpbnRmKCJUZWxlcGhvbmUgc3VwcG9ydCBpcyBhdmFpbGFibGUgdG9vOlxuXG4iKTsKKyAgICBuICs9IDE7CisgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICBwcmludGYoCisgICAgIiAgKzEgKDIxMikgODU0LTUxMjYsIGZyb20gYW55d2hlcmUsICQyNS4wMCBVU0QgcGVyIGNhbGwsIE1DL1Zpc2FcblxuIik7CisgICAgbiArPSAxOworICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2lmbmRlZiBOT1NIT1cKKyNpZm5kZWYgTk9GUklMTFMKKyAgICBwcmludGYoCisiQmVmb3JlIHJlcG9ydGluZyBwcm9ibGVtcywgcGxlYXNlIHVzZSB0aGUgU0hPVyBGRUFUVVJFUyBjb21tYW5kXG4iKTsKKyAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgIHByaW50ZigKKyJ0byBnZXQgZGV0YWlsZWQgcHJvZ3JhbSB2ZXJzaW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLlxuXG4iKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2VuZGlmIC8qIE5PU0hPVyAqLworICAgIHJldHVybigxKTsKK30KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisjaWZuZGVmIE5PU1BMCisKKy8qICBUIE8gRCAyIFMgRSBDICAtLSAgQ29udmVydCB0aW1lIG9mIGRheSBhcyBoaDptbTpzcyB0byBzZWNzIHNpbmNlIG1pZG5pdGUgKi8KKy8qCisgIENhbGwgd2l0aCBhIHN0cmluZyBoaDptbSBvciBoaDptbTpzcy4KKyAgUmV0dXJucyBhIDAgdG8gODY0MDAgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyovCitsb25nCit0b2Qyc2VjKHQpIGNoYXIgKiB0OyB7CisgICAgbG9uZyB0MjsKKyAgICBsb25nIGhoID0gMEwsIG1tID0gMEwsIHNzID0gMEw7CisKKyAgICBpZiAoIXQpIHQgPSAiIjsKKyAgICBpZiAoISp0KQorICAgICAgcmV0dXJuKC0zTCk7CisgICAgZGVidWcoRjExMCwidG9kMnNlYyIsdCwwKTsKKworICAgIGlmIChpc2RpZ2l0KCp0KSkgICAgICAgICAgICAgICAgICAgIC8qIEdldCBob3VycyBmcm9tIGFyZ3VtZW50ICovCisgICAgICBoaCA9ICp0KysgLSAnMCc7CisgICAgZWxzZQorICAgICAgcmV0dXJuKC0xTCk7CisgICAgaWYgKGlzZGlnaXQoKnQpKQorICAgICAgaGggPSBoaCAqIDEwICsgKnQrKyAtICcwJzsKKyNpZmRlZiBDT01NRU5UCisgICAgaWYgKGhoID4gMjRMKQorICAgICAgcmV0dXJuKC0xTCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIGlmICgqdCA9PSAnOicpCisgICAgICB0Kys7CisgICAgZWxzZSBpZiAoISp0KQorICAgICAgZ290byB4dG9kMnNlYzsKKyAgICBlbHNlCisgICAgICByZXR1cm4oLTFMKTsKKworICAgIGlmIChpc2RpZ2l0KCp0KSkgICAgICAgICAgICAgICAgICAgIC8qIE1pbnV0ZXMgKi8KKyAgICAgIG1tID0gKnQrKyAtICcwJzsKKyAgICBlbHNlCisgICAgICByZXR1cm4oLTFMKTsKKyAgICBpZiAoaXNkaWdpdCgqdCkpCisgICAgICBtbSA9IG1tICogMTAgKyAqdCsrIC0gJzAnOworICAgIGlmIChtbSA+IDYwTCkKKyAgICAgIHJldHVybigtMUwpOworICAgIGlmICgqdCA9PSAnOicpCisgICAgICB0Kys7CisgICAgZWxzZSBpZiAoISp0KQorICAgICAgZ290byB4dG9kMnNlYzsKKyAgICBlbHNlCisgICAgICByZXR1cm4oLTFMKTsKKworICAgIGlmIChpc2RpZ2l0KCp0KSkgICAgICAgICAgICAgICAgICAgIC8qIFNlY29uZHMgKi8KKyAgICAgIHNzID0gKnQrKyAtICcwJzsKKyAgICBlbHNlCisgICAgICByZXR1cm4oLTFMKTsKKyAgICBpZiAoaXNkaWdpdCgqdCkpCisgICAgICBzcyA9IHNzICogMTAgKyAqdCsrIC0gJzAnOworICAgIGlmIChzcyA+IDYwTCkKKyAgICAgIHJldHVybigtMUwpOworCisgICAgaWYgKCp0ID4gMzIpICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gdHJhaWxpbmcganVuayBhbGxvd2VkICovCisgICAgICByZXR1cm4oLTFMKTsKKworICB4dG9kMnNlYzoKKworICAgIHQyID0gaGggKiAzNjAwTCArIG1tICogNjBMICsgc3M7ICAgIC8qIFNlY29uZHMgc2luY2UgbWlkbmlnaHQgZnJvbSBhcmcgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ0b2Qyc2VjIHQyIiwiIix0Mik7CisKKyAgICByZXR1cm4odDIpOworfQorCitpbnQgd2FpdGludGVydmFsID0gMTsKKworI2lmZGVmIE9MRFdBSVQKKyN1bmRlZiBPTERXQUlUCisjZW5kaWYgLyogT0xEV0FJVCAqLworCitpbnQga2JjaGFyID0gTlVMOworCitpbnQKK2RvcGF1cyhjeCkgaW50IGN4OyB7CisgICAgbG9uZyB6ejsKKyAgICBleHRlcm4gaW50IHNsZWVwY2FuOworCisjaWZkZWYgT0xEV0FJVAorICAgIHp6ID0gLTFMOworICAgIHhfaWZudW0gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR1cm4gb2ZmIGludGVybmFsIGNvbXBsYWludHMgKi8KKyAgICBpZiAoY3ggPT0gWFhXQUkpCisgICAgICB5ID0gY21udW0oInNlY29uZHMgdG8gd2FpdCwgb3IgdGltZSBvZiBkYXkgaGg6bW06c3MiLCIxIiwxMCwmeCx4eHN0cmluZyk7CisgICAgZWxzZSBpZiAoY3ggPT0gWFhQQVUpCisgICAgICB5ID0gY21udW0oInNlY29uZHMgdG8gcGF1c2UsIG9yIHRpbWUgb2YgZGF5IGhoOm1tOnNzIiwKKyAgICAgICAgICAgICAgICAiMSIsMTAsJngseHhzdHJpbmcpOworICAgIGVsc2UKKyAgICAgIHkgPSBjbW51bSgibWlsbGlzZWNvbmRzIHRvIHNsZWVwLCBvciB0aW1lIG9mIGRheSBoaDptbTpzcyIsCisgICAgICAgICAgICAgICAgIjEwMCIsMTAsJngseHhzdHJpbmcpOworICAgIHhfaWZudW0gPSAwOworICAgIGlmICh5IDwgMCkgeworICAgICAgICBpZiAoeSA9PSAtMikgeyAgICAgICAgICAgICAgICAgIC8qIEludmFsaWQgbnVtYmVyIG9yIGV4cHJlc3Npb24gKi8KKyAgICAgICAgICAgIGNoYXIgKnAgPSB0bXBidWY7ICAgICAgICAgICAvKiBSZXRyaWV2ZSBzdHJpbmcgZnJvbSBhdG1idWYgKi8KKyAgICAgICAgICAgIGludCBuID0gVE1QQlVGU0laOworICAgICAgICAgICAgKnAgPSBOVUw7CisgICAgICAgICAgICB6enN0cmluZyhhdG1idWYsJnAsJm4pOyAgICAgLyogRXZhbHVhdGUgaW4gY2FzZSBpdCdzIGEgdmFyaWFibGUgKi8KKyAgICAgICAgICAgIHp6ID0gdG9kMnNlYyh0bXBidWYpOyAgICAgICAvKiBDb252ZXJ0IHRvIHNlY3Mgc2luY2UgbWlkbmlnaHQgKi8KKyAgICAgICAgICAgIGlmICh6eiA8IDBMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/TnVtYmVyLCBleHByZXNzaW9uLCBvciB0aW1lIG9mIGRheSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhciBub3dbMzJdOyAgICAgICAgICAgLyogQ3VycmVudCB0aW1lICovCisgICAgICAgICAgICAgICAgY2hhciAqcDsKKyAgICAgICAgICAgICAgICBsb25nIHRub3c7CisgICAgICAgICAgICAgICAgcCA9IG5vdzsKKyAgICAgICAgICAgICAgICB6dGltZSgmcCk7CisgICAgICAgICAgICAgICAgdG5vdyA9IGF0b2wocCsxMSkgKiAzNjAwTCArIGF0b2wocCsxNCkgKiA2MEwgKyBhdG9sKHArMTcpOworICAgICAgICAgICAgICAgIGlmICh6eiA8IHRub3cpICAgICAgICAgIC8qIFVzZXIncyB0aW1lIGJlZm9yZSBub3cgKi8KKyAgICAgICAgICAgICAgICAgIHp6ICs9IDg2NDAwTDsgICAgICAgICAvKiBTbyBtYWtlIGl0IHRvbW9ycm93ICovCisgICAgICAgICAgICAgICAgenogLT0gdG5vdzsgICAgICAgICAgICAgLyogU2Vjb25kcyBmcm9tIG5vdy4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcmV0dXJuKHkpOworICAgIH0KKyAgICBpZiAoeCA8IDApIHggPSAwOworICAgIHN3aXRjaCAoY3gpIHsKKyAgICAgIGNhc2UgWFhQQVU6ICAgICAgICAgICAgICAgICAgICAgICAvKiBQQVVTRSAqLworICAgICAgY2FzZSBYWE1TTDogICAgICAgICAgICAgICAgICAgICAgIC8qIE1TTEVFUCAqLworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhYV0FJOiAgICAgICAgICAgICAgICAgICAgICAgLyogV0FJVCAqLworICAgICAgICB6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vZGVtIHNpZ25hbCBtYXNrICovCisgICAgICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCB6ZXJvIG9yIG1vcmUgc2lnbmFsIG5hbWVzICovCisgICAgICAgICAgICB5ID0gY21rZXkobXN0YWIsbm1zLCJtb2RlbSBzaWduYWwiLCIiLHh4c3RyaW5nKTsKKyAgICAgICAgICAgIGlmICh5ID09IC0zKSBicmVhazsgICAgICAgICAvKiAtMyBtZWFucyB0aGV5IHR5cGVkIENSICovCisgICAgICAgICAgICBpZiAoeSA8IDApIHJldHVybih5KTsgICAgICAgLyogT3RoZXIgbmVnYXRpdmVzIGFyZSBlcnJvcnMgKi8KKyAgICAgICAgICAgIHogfD0geTsgICAgICAgICAgICAgICAgICAgICAvKiBPUiB0aGUgYml0IGludG8gdGhlIHNpZ25hbCBtYXNrICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvdWxkbid0IGhhcHBlbiAqLworICAgICAgICByZXR1cm4oLTIpOworICAgIH0KKworLyogQ29tbWFuZCBpcyBlbnRlcmVkLCBub3cgZG8gaXQuICovCisKKyAgICBpZiAoenogPiAtMUwpIHsgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIG9mIGRheSBnaXZlbj8gKi8KKyAgICAgICAgeCA9IHp6OworICAgICAgICBpZiAoenogIT0gKGxvbmcpIHgpIHsKKyAgICAgICAgICAgIHByaW50ZigKKyJTb3JyeSwgYXJpdGhtZXRpYyBvdmVyZmxvdyAtIGhoOm1tOnNzIG5vdCB1c2FibGUgb24gdGhpcyBwbGF0Zm9ybS5cbiIKKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY3ggPT0gWFhNU0wpIHsgICAgICAgICAgICAgICAgICAvKiBNaWxsaXNlY29uZCBzbGVlcCAqLworICAgICAgICBtc2xlZXAoenogPCAwID8geCA6IHggKiAxMDAwKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisgICAgaWYgKGN4ID09IFhYUEFVICYmICFzbGVlcGNhbikgeyAgICAgLyogU0xFRVAgQ0FOQ0VMTEFUSU9OIGlzIE9GRiAqLworICAgICAgICBzbGVlcCh4KTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisKKyAgICAvKiBXQUlULCBvciBlbHNlIFNMRUVQIHdpdGggY2FuY2VsbGF0aW9uIGFsbG93ZWQuLi4gKi8KKworICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNsZWVwIGxvb3AgKi8KKyAgICAgICAgaW50IG1kbXNpZzsKKyAgICAgICAgaWYgKHNsZWVwY2FuKSB7ICAgICAgICAgICAgICAgICAvKiBLZXlib2FyZCBjYW5jZWxsYXRpb24gYWxsb3dlZD8gKi8KKyAgICAgICAgICAgIGlmICh5ID0gY29uY2hrKCkpIHsgICAgICAgICAvKiBEaWQgdGhleSB0eXBlIHNvbWV0aGluZz8gKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgd2hpbGUgKHktLSkgY29uaW5jKDApOyAgLyogWWVzLCBnb2JibGUgaXQgYWxsIHVwICovCisjZWxzZQorICAgICAgICAgICAgICAgIC8qIFRoZXJlIGlzIGEgZGViYXRlIG92ZXIgd2hldGhlciBQQVVTRSBzaG91bGQgYWJzb3JiICAgICovCisgICAgICAgICAgICAgICAgLyogaXRzIGNhbmNlbGxpbmcgY2hhcmFjdGVyKHMpLiAgVGhlcmUgYXJlIHNldmVyYWwgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKiByZWFzb25zIHdoeSBpdCBzaG91bGQgZ29iYmxlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXI6ICAqLworICAgICAgICAgICAgICAgIC8qICgxKSBNUy1ET1MgS2VybWl0IGRvZXMgaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyogKDIpIGlmIG5vdCwgc3Vic2VxdWVudCBQQVVTRSBjb21tYW5kcyB3aWxsIHRlcm1pbmF0ZSAgKi8KKyAgICAgICAgICAgICAgICAvKiAgICAgaW1tZWRpYXRlbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIC8qICgzKSBpZiBub3QsIHN1YnNlcXVlbnQgQVNLIGNvbW1hbmRzIHdpbGwgdXNlIGl0IGFzICAgICovCisgICAgICAgICAgICAgICAgLyogICAgIHZhbGlkIGlucHV0LiAgSWYgXDEzLCB0aGVuIGl0IHdpbGwgZ2V0IG5vIGlucHV0ICAgKi8KKyAgICAgICAgICAgICAgICAvKiAoNCkgaWYgbm90LCB0aGVuIHRoZSBjaGFyYWN0ZXIgYXBwZWFycyBvbiB0aGUgY29tbWFuZCAqLworICAgICAgICAgICAgICAgIC8qICAgICBsaW5lIGFmdGVyIGFsbCBlbmNsb3NpbmcgbWFjcm9zIGFyZSBjb21wbGV0ZS4gICAgICovCisgICAgICAgICAgICAgICAga2JjaGFyID0gY29uaW5jKDApOyAgICAgLyogR29iYmxlIG9uZSB1cCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAvKiBBbmQgcXVpdCBQQVVTaW5nIG9yIFdBSVRpbmcgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY3ggPT0gWFhXQUkpIHsgICAgICAgICAgICAgIC8qIFdBSVQgKHogPT0gbW9kZW0gc2lnbmFsIG1hc2spICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJXQUlUIHgiLCIiLHgpOworICAgICAgICAgICAgaWYgKHogPiAwKSB7ICAgICAgICAgICAgICAgIC8qIExvb2tpbmcgZm9yIGFueSBtb2RlbSBzaWduYWxzPyAqLworICAgICAgICAgICAgICAgIG1kbXNpZyA9IHR0Z21kbSgpOyAgICAgIC8qIFllcywgZ2V0IHRoZW0gKi8KKyAgICAgICAgICAgICAgICBpZiAobWRtc2lnIDwgMCkgICAgICAgICAvKiBGYWlsZWQgKi8KKyAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgICAgICAgaWYgKChtZG1zaWcgJiB6KSA9PSB6KSAgLyogR290IHdoYXQgd2Ugd2FudGVkPyAqLworICAgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsgIC8qIFN1Y2NlZWQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh4ID09IDApICAgICAgICAgICAgICAgICAvKiBXQUlUIDAgYW5kIGRpZG4ndCBnZXQgb3VyIHNpZ25hbHMgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2xlZXAoMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBpbnRlcnJ1cHQsIHNsZWVwIG9uZSBzZWNvbmQgKi8KKyAgICB9IHdoaWxlICgtLXggPiAwKTsKKworICAgIGlmIChjeCA9PSBYWFdBSSkgICAgICAgICAgICAgICAgICAgIC8qIElmIFdBSVQgYW5kIGxvb3AgZXhoYXVzdGVkICovCisgICAgICBzdWNjZXNzID0gKHogPT0gMCk7ICAgICAgICAgICAgICAgLyogRmFpbC4gKi8KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgKi8KKyAgICAgIHN1Y2Nlc3MgPSAoeCA9PSAwKTsgICAgICAgICAgICAgICAvKiBTZXQgU1VDQ0VTUy9GQUlMVVJFIGZvciBQQVVTRS4gKi8KKyAgICByZXR1cm4oc3VjY2Vzcyk7CisKKyNlbHNlICAvKiBOZXcgY29kZSB1c2VzIGNoYWluZWQgRkRCcyBhbmQgYWxsb3dzIEZJTEUgd2FpdHMuLi4gKi8KKworICAgIGNoYXIgKiBtID0gIiI7ICAgICAgICAgICAgICAgICAgICAgIC8qIEhlbHAgbWVzc2FnZSAqLworICAgIHN0cnVjdCBGREIgbnUsIGZsOyAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIGZ1bmN0aW9uIGRlc2NyaXB0b3IgYmxvY2tzICovCisgICAgaW50IGZpbGV3YWl0ID0gMDsKKyAgICBpbnQgbWRtc2lnID0gMCwgZnMgPSAwOworICAgIGNoYXIgZmlsZWRhdGVbMzJdOworCisgICAga2JjaGFyID0gMDsKKworICAgIHN3aXRjaCAoY3gpIHsKKyAgICAgIGNhc2UgWFhXQUk6IG0gPSAic2Vjb25kcyB0byB3YWl0LCBvciB0aW1lIG9mIGRheSBoaDptbTpzcyI7IGJyZWFrOworICAgICAgY2FzZSBYWFBBVTogbSA9ICJzZWNvbmRzIHRvIHBhdXNlLCBvciB0aW1lIG9mIGRheSBoaDptbTpzcyI7IGJyZWFrOworICAgICAgY2FzZSBYWE1TTDogbSA9ICJtaWxsaXNlY29uZHMgdG8gc2xlZXAsIG9yIHRpbWUgb2YgZGF5IGhoOm1tOnNzIjsgYnJlYWs7CisgICAgfQorICAgIHp6ID0gLTFMOworICAgIGNtZmRiaSgmbnUsCisgICAgICAgICAgIF9DTU5VTSwgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyICovCisgICAgICAgICAgIG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGVscCBtZXNzYWdlICovCisgICAgICAgICAgIChjeCA9PSBYWE1TTCkgPyAiMTAwIiA6ICIxIiwgLyogRGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE4vQSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE4vQSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE4vQSAqLworICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBOL0EgKi8KKyAgICAgICAgICAgJmZsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXh0ICovCisgICAgICAgICAgICk7CisgICAgY21mZGJpKCZmbCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGltZSBvZiBkYXkgKi8KKyAgICAgICAgICAgX0NNRkxELCAgICAgICAgICAgICAgICAgICAgICAvKiBGaWVsZCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzaW5nIGZ1bmMgKi8KKyAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBOL0EgKi8KKyAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBuZXh0ICovCisgICAgICAgICAgICk7CisgICAgeCA9IGNtZmRiKCZudSk7ICAgICAgICAgICAgICAgICAgICAgLyogUGFyc2UgYSBudW1iZXIgb3IgYSBmaWVsZCAqLworICAgIGlmICh4IDwgMCkgeworICAgICAgICBpZiAoeCA9PSAtMykKKyAgICAgICAgICB4ID0gLTI7CisgICAgICAgIHJldHVybih4KTsKKyAgICB9CisgICAgc3dpdGNoIChjbXJlc3VsdC5mY29kZSkgeworICAgICAgY2FzZSBfQ01OVU06ICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciAqLworICAgICAgICB4ID0gY21yZXN1bHQubnJlc3VsdDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIF9DTUZMRDogICAgICAgICAgICAgICAgICAgICAgLyogRmllbGQgKi8KKyAgICAgICAgenogPSB0b2Qyc2VjKGNtcmVzdWx0LnNyZXN1bHQpOyAvKiBDb252ZXJ0IHRvIHNlY3Mgc2luY2UgbWlkbmlnaHQgKi8KKyAgICAgICAgaWYgKHp6IDwgMEwpIHsKKyAgICAgICAgICAgIHByaW50ZigiP051bWJlciwgZXhwcmVzc2lvbiwgb3IgdGltZSBvZiBkYXkgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgbm93WzMyXTsgICAgICAgICAgICAgICAvKiBDdXJyZW50IHRpbWUgKi8KKyAgICAgICAgICAgIGNoYXIgKnA7CisgICAgICAgICAgICBsb25nIHRub3c7CisgICAgICAgICAgICBwID0gbm93OworICAgICAgICAgICAgenRpbWUoJnApOworICAgICAgICAgICAgdG5vdyA9IGF0b2wocCsxMSkgKiAzNjAwTCArIGF0b2wocCsxNCkgKiA2MEwgKyBhdG9sKHArMTcpOworICAgICAgICAgICAgaWYgKHp6IDwgdG5vdykgICAgICAgICAgICAgIC8qIFVzZXIncyB0aW1lIGJlZm9yZSBub3cgKi8KKyAgICAgICAgICAgICAgenogKz0gODY0MDBMOyAgICAgICAgICAgICAvKiBTbyBtYWtlIGl0IHRvbW9ycm93ICovCisgICAgICAgICAgICB6eiAtPSB0bm93OyAgICAgICAgIC8qIFNlY29uZHMgZnJvbSBub3cuICovCisgICAgICAgIH0KKyAgICB9CisgICAgZGVidWcoRjEwMSwiUEFVU0UvV0FJVC9NU0xFRVAgenoiLCIiLHp6KTsKKyAgICBzd2l0Y2ggKGN4KSB7CisgICAgICBjYXNlIFhYUEFVOiAgICAgICAgICAgICAgICAgICAgICAgLyogUEFVU0UgKi8KKyAgICAgIGNhc2UgWFhNU0w6ICAgICAgICAgICAgICAgICAgICAgICAvKiBNU0xFRVAgKi8KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYWFdBSTogICAgICAgICAgICAgICAgICAgICAgIC8qIFdBSVQgKi8KKyAgICAgICAgeiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb2RlbSBzaWduYWwgbWFzayAqLworICAgICAgICB5ID0gY21rZXkod2FpdHRhYixud2FpdHRhYiwiIiwiIix4eHN0cmluZyk7CisgICAgICAgIGlmICh5IDwgMCkgeworICAgICAgICAgICAgaWYgKHkgPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICB9CisgICAgICAgIGlmICh5ID09IFdBSVRfRklMKSB7ICAgICAgICAgICAgLyogRklMRSAqLworICAgICAgICAgICAgaW50IHdpbGQgPSAwOworICAgICAgICAgICAgaWYgKCh6ID0gY21rZXkod2Zzd2ksbndmc3dpLCJldmVudCIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgICAgIGZpbGV3YWl0ID0gejsKKyAgICAgICAgICAgIGlmIChmaWxld2FpdCA9PSBXRl9NT0QgfHwgZmlsZXdhaXQgPT0gV0ZfREVMKQorICAgICAgICAgICAgICB6ID0gY21pZmkoIkZpbGVuYW1lIiwiIiwmcywmd2lsZCx4eHN0cmluZyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHogPSBjbWZsZCgiRmlsZW5hbWUiLCIiLCZzLHh4c3RyaW5nKTsKKyAgICAgICAgICAgIGlmICh6IDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICAgICAgaWYgKHdpbGQgfHwgKChmaWxld2FpdCA9PSBXRl9DUkUpICYmIGlzd2lsZChzKSkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9XaWxkY2FyZHMgbm90IHZhbGlkIGhlcmVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBja3N0cm5jcHkodG1wYnVmLHMsVE1QQlVGU0laKTsKKyAgICAgICAgICAgIGlmICgoeiA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoeSAhPSBXQUlUX01ETSkgeyAgICAgLyogQSBtb2RlbSBzaWduYWwgKi8KKyAgICAgICAgICAgIHogfD0geTsgICAgICAgICAgICAgICAgICAgICAvKiBPUiB0aGUgYml0IGludG8gdGhlIHNpZ25hbCBtYXNrICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaWxld2FpdCkgeyAgICAgICAgICAgICAgICAvKiBNb2RlbSBzaWduYWxzLi4uICovCisgICAgICAgICAgICB3aGlsZSAoMSkgeyAgICAgICAgICAgICAgICAgLyogR2V0IHplcm8gb3IgbW9yZSBzaWduYWwgbmFtZXMgKi8KKyAgICAgICAgICAgICAgICB5ID0gY21rZXkobXN0YWIsbm1zLCJtb2RlbSBzaWduYWwiLCIiLHh4c3RyaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAoeSA9PSAtMykgYnJlYWs7ICAgICAvKiAtMyBtZWFucyB0aGV5IHR5cGVkIENSICovCisgICAgICAgICAgICAgICAgaWYgKHkgPCAwKSByZXR1cm4oeSk7ICAgLyogT3RoZXIgbmVnYXRpdmVzIGFyZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB6IHw9IHk7ICAgICAgICAgICAgICAgICAvKiBPUiB0aGUgYml0IGludG8gdGhlIHNpZ25hbCBtYXNrICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG91bGRuJ3QgaGFwcGVuICovCisgICAgICAgIHJldHVybigtMik7CisgICAgfSAvKiBzd2l0Y2ggKGN4KSAqLworCisvKiBDb21tYW5kIGlzIGVudGVyZWQsIG5vdyBkbyBpdC4gKi8KKworICAgIGlmICh6eiA+IC0xTCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWUgb2YgZGF5IGdpdmVuPyAqLworICAgICAgICB4ID0geno7CisgICAgICAgIGlmICh6eiAhPSAobG9uZykgeCkgeworICAgICAgICAgICAgcHJpbnRmKAorIlNvcnJ5LCBhcml0aG1ldGljIG92ZXJmbG93IC0gaGg6bW06c3Mgbm90IHVzYWJsZSBvbiB0aGlzIHBsYXRmb3JtLlxuIgorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzbGVlcGNhbikKKyAgICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7ICAgICAgICAgICAgICAvKiBFbnN1cmUgc2luZ2xlLWNoYXIgd2FrZXVwICovCisKKyAgICBpZiAoY3ggPT0gWFhNU0wpIHsgICAgICAgICAgICAgICAgICAvKiBNaWxsaXNlY29uZCBzbGVlcCAqLworICAgICAgICBtc2xlZXAoenogPCAwID8geCA6IHggKiAxMDAwKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisgICAgaWYgKGN4ID09IFhYUEFVICYmICFzbGVlcGNhbikgeyAgICAgLyogU0xFRVAgQ0FOQ0VMTEFUSU9OIGlzIE9GRiAqLworICAgICAgICBzbGVlcCh4KTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisgICAgaWYgKGZpbGV3YWl0KSB7ICAgICAgICAgICAgICAgICAgICAgLyogRklMRS4uLiAqLworICAgICAgICBmcyA9IHpjaGtpKHRtcGJ1Zik7ICAgICAgICAgICAgIC8qIENoZWNrIGlmIGZpbGUgZXhpc3RzICovCisgICAgICAgIHN3aXRjaCAoZmlsZXdhaXQpIHsKKyAgICAgICAgICBjYXNlIFdGX0RFTDoKKyAgICAgICAgICAgIGlmIChmcyA9PSAtMSkKKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgV0ZfTU9EOgorICAgICAgICAgICAgaWYgKGZzID09IC0xKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/RmlsZSBkb2VzIG5vdCBleGl0OiAlc1xuIix0bXBidWYpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzID0gemZjZGF0KHRtcGJ1Zik7ICAgICAgICAgLyogR2V0IGN1cnJlbnQgbW9kaWZpY2F0aW9uIGRhdGUgKi8KKyAgICAgICAgICAgIGlmICghcykgcyA9ICIiOworICAgICAgICAgICAgaWYgKGNrc3RybmNweShmaWxlZGF0ZSxzLDMyKSAhPSAxNykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0Nhbid0IGdldCBtb2RpZmljYXRpb24gdGltZTogJXNcbiIsdG1wYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBXRl9DUkU6CisgICAgICAgICAgICBpZiAoZnMgPiAtMSkKKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvbGxpbmcgbG9vcCAqLworICAgICAgICBpZiAoc2xlZXBjYW4pIHsgICAgICAgICAgICAgICAgIC8qIEtleWJvYXJkIGNhbmNlbGxhdGlvbiBhbGxvd2VkPyAqLworICAgICAgICAgICAgaWYgKCh5ID0gY29uY2hrKCkpID4gMCkgeyAgIC8qIERpZCB0aGV5IHR5cGUgc29tZXRoaW5nPyAqLworICAgICAgICAgICAgICAgIGtiY2hhciA9IGNvbmluYygwKTsgICAgIC8qIFllcywgZ2V0IGZpcnN0IGNoYXIgdGhleSB0eXBlZCAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYwMDAsIldBSVQga2JjaGFyIiwiIixrYmNoYXIpOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgICAgICB3aGlsZSAoLS15ID4gMCkgICAgICAgICAvKiBHb2JibGUgdGhlIHJlc3QgdXAgKi8KKyAgICAgICAgICAgICAgICAgIGNvbmluYygwKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsgICAgLyogQW5kIHF1aXQgUEFVU2luZyBvciBXQUlUaW5nICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGV3YWl0ID09IDApIHsKKyAgICAgICAgICAgIGlmIChjeCA9PSBYWFdBSSkgeyAgICAgICAgICAvKiBXQUlUIGZvciBtb2RlbSBzaWduYWxzICovCisgICAgICAgICAgICAgICAgaWYgKHogIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtZG1zaWcgPSB0dGdtZG0oKTsgIC8qIEdldCB0aGVtLiAqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJXQUlUIHR0Z21kbSIsIiIsbWRtc2lnKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1kbXNpZyA8IDApICAgICAvKiBGYWlsdXJlIHRvIGdldCB0aGVtPyAqLworICAgICAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7IC8qIEZhaWwuICovCisgICAgICAgICAgICAgICAgICAgIGlmICgobWRtc2lnICYgeikgPT0geikgLyogR290IGRlc2lyZWQgb25lcz8gKi8KKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOyAvKiBTdWNjZWVkLiAqLworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA9PSAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGSUxFLi4uICovCisgICAgICAgICAgICBmcyA9IHpjaGtpKHRtcGJ1Zik7ICAgICAgICAgLyogR2V0IGZpbGUgc3RhdHVzICovCisgICAgICAgICAgICBpZiAoZmlsZXdhaXQgPT0gV0ZfTU9EKSB7ICAgLyogV2FpdCBmb3IgbW9kaWZpY2F0aW9uICovCisgICAgICAgICAgICAgICAgaWYgKGZzID09IC0xKSAgICAgICAgICAgLyogRmFpbHVyZSB0byBnZXQgc3RhdHVzICovCisgICAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOyAgLyogc28gV0FJVCBmYWlscy4gKi8KKyAgICAgICAgICAgICAgICBzID0gemZjZGF0KHRtcGJ1Zik7ICAgICAvKiBHZXQgY3VycmVudCBtb2RpZmljYXRpb24gdGltZSAqLworICAgICAgICAgICAgICAgIGlmICghcykgcyA9ICIiOyAgICAgICAgIC8qIEFuZCBjb21wYXJlIHdpdGggdGhlIHRpbWUgKi8KKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHMsZmlsZWRhdGUpKSAvKiB3aGVuIHRoZSBXQUlUIHN0YXJ0ZWQgKi8KKyAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGV3YWl0ID09IFdGX0RFTCkgeyAvKiBXYWl0IGZvciBkZWxldGlvbiAqLworICAgICAgICAgICAgICAgIGlmIChmcyA9PSAtMSkgICAgICAgICAgIC8qIElmIGZpbGUgZG9lc24ndCBleGlzdCwgKi8KKyAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7ICAvKiBzdWNjZWVkLiAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxld2FpdCA9PSBXRl9DUkUpIHsgLyogV2FpdCBmb3IgY3JlYXRpb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoZnMgIT0gLTEpICAgICAgICAgICAvKiBJZiBmaWxlIGV4aXN0cyAqLworICAgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsgIC8qIHN1Y2NlZWQuICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHggPCAxKSAgICAgICAgICAgICAgICAgICAgICAvKiBTTEVFUC9XQUlUL1BBVVNFIDAgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgc2xlZXAod2FpdGludGVydmFsKTsgICAgICAgICAgICAvKiBObyBpbnRlcnJ1cHQsIHNsZWVwICovCisgICAgICAgIHggLT0gd2FpdGludGVydmFsOyAgICAgICAgICAgICAgLyogRGVkdWN0IHNsZWVwIHRpbWUgKi8KKyAgICB9IHdoaWxlICh4ID4gMCk7CisKKyAgICBpZiAoY3ggPT0gWFhXQUkpICAgICAgICAgICAgICAgICAgICAvKiBXQUlUIHRpbWUgZXhwaXJlZCAqLworICAgICAgc3VjY2VzcyA9ICh6ID09IDApOyAgICAgICAgICAgICAgIC8qIFN1Y2NlZWQgaWYgbm8gbW9kZW0gc2lnbmFscyAqLworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBTTEVFUCBvciBQQVVTRSwgc3VjY2VzcyAqLworICAgICAgc3VjY2VzcyA9ICh4ID09IDApOyAgICAgICAgICAgICAgIC8qIGRlcGVuZHMgb24gd2hldGhlciBpdCB3YXMgKi8KKyAgICByZXR1cm4oc3VjY2Vzcyk7ICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcnJ1cHRlZCBmcm9tIHRoZSBrZXlib2FyZC4gKi8KKyNlbmRpZiAvKiBPTERXQUlUICovCit9CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIE9TMk9SVU5JWAorX1BST1RPVFlQKGludCB6Y21wZm4sKGNoYXIgKiwgY2hhciAqKSk7CisjZW5kaWYgLyogT1MyT1JVTklYICovCisKKyNpZm5kZWYgTk9GUklMTFMKKyNpZmRlZiBOVAoraW50IAorZG9saW5rKCkgeworICAgIC8qIFBhcnNlIGEgZmlsZSBvciBhIGRpcmVjdG9yeSBuYW1lICovCisgICAgaW50IGksIHgsIHosIGxpc3RpbmcgPSAwLCBoYXZlbmFtZSA9IDAsIHdpbGQgPSAwLCByYyA9IDE7CisgICAgc3RydWN0IEZEQiBzdywgZmk7CisKKyAgICBjbWZkYmkoJnN3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAybmQgRkRCIC0gb3B0aW9uYWwgL1BBR0Ugc3dpdGNoICovCisgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIkZpbGVuYW1lIG9yIHN3aXRjaCIsICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgbnF2c3d0YWIsICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKyAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICBxdnN3dGFiLCAgICAgICAgICAgICAgICAgICAgIC8qIEtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgICAgJmZpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICk7CisKKyAgICBjbWZkYmkoJmZpLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxc3QgRkRCIC0gZmlsZSB0byB0eXBlICovCisgICAgICAgICAgIF9DTUlGSSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisgICAgICAgICAgIHh4c3RyaW5nLAorICAgICAgICAgICBOVUxMLAorICAgICAgICAgICBOVUxMCisgICAgICAgICAgICk7CisKKyAgICB3aGlsZSAoIWhhdmVuYW1lKSB7CisgICAgICAgIHggPSBjbWZkYigmc3cpOyAgICAgICAgICAgICAgICAgLyogUGFyc2Ugc29tZXRoaW5nICovCisgICAgICAgIGlmICh4IDwgMCkgICAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIHN3aXRjaCAoY21yZXN1bHQuZmNvZGUpIHsKKyAgICAgICAgICBjYXNlIF9DTUtFWToKKyAgICAgICAgICAgIHN3aXRjaCAoY21yZXN1bHQubnJlc3VsdCkgeworICAgICAgICAgICAgICBjYXNlIERFTF9MSVM6CisgICAgICAgICAgICAgIGNhc2UgREVMX1ZSQjoKKyAgICAgICAgICAgICAgICBsaXN0aW5nID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBERUxfTk9MOgorICAgICAgICAgICAgICBjYXNlIERFTF9RVUk6CisgICAgICAgICAgICAgICAgbGlzdGluZyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIF9DTUlGSToKKyAgICAgICAgICAgIHMgPSBjbXJlc3VsdC5zcmVzdWx0OworICAgICAgICAgICAgaGF2ZW5hbWUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICB9CisgICAgd2lsZCA9IGNtcmVzdWx0Lm5yZXN1bHQ7ICAgICAgICAgICAgLyogU291cmNlIHNwZWNpZmljYXRpb24gd2lsZD8gKi8KKworICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsgICAgICAgIC8qIE1ha2UgYSBzYWZlIGNvcHkgb2Ygc291cmNlIG5hbWUgKi8KKyAgICBzID0gbGluZTsKKworICAgIGlmICghd2lsZCkKKyAgICAgIHdpbGQgPSBpc3dpbGQobGluZSk7CisKKyAgICBwID0gdG1wYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQbGFjZSBmb3IgbmV3IG5hbWUgKi8KKyAgICBpZiAoKHggPSBjbW9maSh3aWxkID8gIlRhcmdldCBkaXJlY3RvcnkiIDogIk5ldyBuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAiIiwmcyx4eHN0cmluZykpIDwgMCkgeyAvKiBHZXQgbmV3IG5hbWUgKi8KKyAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgIHByaW50ZigiPyVzIHJlcXVpcmVkXG4iLCB3aWxkID8gIlRhcmdldCBkaXJlY3RvcnkiIDogIk5ldyBuYW1lIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9IGVsc2UgcmV0dXJuKHgpOworICAgIH0KKyAgICBja3N0cm5jcHkocCxzLFRNUEJVRlNJWik7ICAgICAgICAgICAvKiBNYWtlIGEgc2FmZSBjb3B5IG9mIHRoZSBuZXcgbmFtZSAqLworICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworCisgICAgaWYgKCF3aWxkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSnVzdCBvbmUgKi8KKyAgICAgICAgaWYgKGxpc3RpbmcpIHByaW50ZigiJXMgPT4gJXMgIixsaW5lLHApOworICAgICAgICBpZiAoemxpbmsobGluZSxwKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChsaXN0aW5nKSBwcmludGYoIihGQUlMRUQ6ICVzXG4iLGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsaXN0aW5nKSBwcmludGYoIihPSylcbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybihzdWNjZXNzID0gcmMpOworICAgIH0KKyAgICBpZiAoIWlzZGlyKHApKSB7ICAgICAgICAgICAgICAgICAgICAvKiBNdWx0aXBsZSAqLworICAgICAgICBwcmludGYoICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRhcmdldCBpcyBub3QgYSBkaXJlY3RvcnkgKi8KKyI/TXVsdGlwbGUgc291cmNlIGZpbGVzIG5vdCBhbGxvd2VkIGlmIHRhcmdldCBpcyBub3QgYSBkaXJlY3RvcnkuXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3cgZnVsbCBwYXRoIG9mIHRhcmdldCAqLworICAgICAgICBjaGFyIGJ1ZltDS01BWFBBVEhdOyAgICAgICAgICAgIC8qICh0b28gbXVjaCkgKi8KKyAgICAgICAgaWYgKHpmbnFmcChwLENLTUFYUEFUSCxidWYpKQorICAgICAgICAgIGNrc3RybmNweSh0bXBidWYsYnVmLFRNUEJVRlNJWik7CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIFZNUworICAgIGNvbnJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExldCBDdHJsLUMgd29yay4gKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyAgICBkZWJ1ZyhGMTEwLCJkb2xpbmsgbGluZSIsbGluZSwwKTsKKworI2lmZGVmIFpYUkVXSU5ECisgICAgeiA9IHp4cmV3aW5kKCk7ICAgICAgICAgICAgICAgICAgICAgLyogUmV3aW5kIGZpbGUgbGlzdCAqLworI2Vsc2UKKyAgICB6ID0gbnp4cGFuZChzLDApOyAgICAgICAgICAgICAgICAgICAvKiBFeHBhbmQgZmlsZSBsaXN0ICovCisjZW5kaWYgLyogWlhSRVdJTkQgKi8KKyAgICBkZWJ1ZyhGMTExLCJkb2xpbmsgcCIscCx6KTsKKworI2lmZGVmIFVOSVgKKyAgICBpZiAod2lsZCAmJiB6ID4gMSkKKyAgICAgIHNoX3NvcnQobXRjaHMsTlVMTCx6LDAsMCxmaWxlY2FzZSk7IC8qIEFscGhhYmV0aXplIHRoZSBmaWxlbmFtZSBsaXN0ICovCisjZW5kaWYgLyogVU5JWCAqLworCisgICAgd2hpbGUgKHotLSA+IDApIHsKKyAgICAgICAgaWYgKCEoeiA9PSAwICYmICF3aWxkKSkKKyAgICAgICAgICB6bmV4dChsaW5lKTsKKyAgICAgICAgaWYgKCFsaW5lWzBdKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAobGlzdGluZykgcHJpbnRmKCIlcyA9PiAlcyAiLGxpbmUscCk7CisgICAgICAgIGlmICh6bGluayhsaW5lLHApIDwgMCkgeworICAgICAgICAgICAgaWYgKGxpc3RpbmcpIHByaW50ZigiKEZBSUxFRDogJXNcbiIsY2tfZXJyc3RyKCkpOworICAgICAgICAgICAgcmMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxpc3RpbmcpIHByaW50ZigiKE9LKVxuIik7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgVk1TCisgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsKKyNlbmRpZiAvKiBWTVMgKi8KKyAgICByZXR1cm4oc3VjY2VzcyA9IHJjKTsKK30KKyNlbmRpZiAvKiBOVCAqLworCisjaWZkZWYgWkNPUFkKK2ludAorZG9jb3B5KCkgeworICAgIGludCBpLCB4LCBsaXN0aW5nID0gMCwgbm9saXN0ID0gMCwgaGF2ZW5hbWUgPSAwOworICAgIHN0cnVjdCBGREIgc3csIGZpOworICAgIGludCB0YXJnZXRpc2RpciA9IDA7CisgICAgaW50IHRhcmdldGxlbiA9IDA7CisgICAgaW50IHN3YXBwaW5nID0gMDsKKyAgICBpbnQgYXBwZW5kaW5nID0gMDsKKyAgICBpbnQgZnJvbWI2NCA9IDA7CisgICAgaW50IHRvYjY0ID0gMDsKKyAgICBpbnQgd2lsZCA9IDA7CisgICAgaW50IHJjID0gMTsKKworICAgIGNtZmRiaSgmc3csICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDJuZCBGREIgLSBvcHRpb25hbCAvUEFHRSBzd2l0Y2ggKi8KKyAgICAgICAgICAgX0NNS0VZLCAgICAgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAiRmlsZW5hbWUgb3Igc3dpdGNoIiwgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICBuY29weXRhYiwgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgIGNvcHl0YWIsICAgICAgICAgICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAmZmkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKyAgICAgICAgICAgKTsKKyAgICBjbWZkYmkoJmZpLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxc3QgRkRCIC0gZmlsZSB0byB0eXBlICovCisgICAgICAgICAgIF9DTUlGSSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisgICAgICAgICAgIHh4c3RyaW5nLAorICAgICAgICAgICBOVUxMLAorICAgICAgICAgICBOVUxMCisgICAgICAgICAgICk7CisKKyAgICB3aGlsZSAoIWhhdmVuYW1lKSB7CisgICAgICAgIHggPSBjbWZkYigmc3cpOyAgICAgICAgICAgICAgICAgLyogUGFyc2Ugc29tZXRoaW5nICovCisgICAgICAgIGlmICh4IDwgMCkgICAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIHN3aXRjaCAoY21yZXN1bHQuZmNvZGUpIHsKKyAgICAgICAgICBjYXNlIF9DTUtFWToKKyAgICAgICAgICAgIHN3aXRjaCAoY21yZXN1bHQubnJlc3VsdCkgeworICAgICAgICAgICAgICBjYXNlIERFTF9MSVM6CisgICAgICAgICAgICAgIGNhc2UgREVMX1ZSQjoKKwkJbm9saXN0ID0gMDsKKyAgICAgICAgICAgICAgICBsaXN0aW5nID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBERUxfTk9MOgorICAgICAgICAgICAgICBjYXNlIERFTF9RVUk6CisJCW5vbGlzdCA9IDE7CisgICAgICAgICAgICAgICAgbGlzdGluZyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgOTk5OgorICAgICAgICAgICAgICAgIHN3YXBwaW5nID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA5OTg6CisgICAgICAgICAgICAgICAgYXBwZW5kaW5nID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgY2FzZSA5OTc6CisgICAgICAgICAgICAgICAgZnJvbWI2NCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgOTk2OgorICAgICAgICAgICAgICAgIHRvYjY0ID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBfQ01JRkk6CisgICAgICAgICAgICBzID0gY21yZXN1bHQuc3Jlc3VsdDsKKyAgICAgICAgICAgIGhhdmVuYW1lID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgfQorICAgIHdpbGQgPSBjbXJlc3VsdC5ucmVzdWx0OworICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsgICAgICAgIC8qIE1ha2UgYSBzYWZlIGNvcHkgb2Ygc291cmNlIG5hbWUgKi8KKyAgICBzID0gbGluZTsKKyAgICBwID0gdG1wYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQbGFjZSBmb3IgbmV3IG5hbWUgKi8KKworICAgIC8qIEdldCBkZXN0aW5hdGlvbiBuYW1lICovCisgICAgaWYgKCh4ID0gY21vZmkoImRlc3RpbmF0aW9uIG5hbWUgYW5kL29yIGRpcmVjdG9yeSIsCisjaWZkZWYgVU5JWAorICAgICAgICAgICAgICAgICAgICIuIgorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAiIgorI2VuZGlmIC8qIFVOSVggKi8KKyAgICAgICAgICAgICAgICAgICAsJnMseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgIHByaW50ZigiP05hbWUgZm9yIGRlc3RpbmF0aW9uIGZpbGUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfSBlbHNlIHJldHVybih4KTsKKyAgICB9CisgICAgY2tzdHJuY3B5KHAscyxUTVBCVUZTSVopOyAgICAgICAgICAgLyogU2FmZSBjb3B5IG9mIGRlc3RpbmF0aW9uIG5hbWUgKi8KKyAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICBpZiAoYXBwZW5kaW5nICYmIHN3YXBwaW5nKSB7CisgICAgICAgIHByaW50ZigiP1NvcnJ5LCAvQVBQRU5EIGFuZCAvU1dBUCBjb25mbGljdFxuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorI2lmZGVmIENPTU1FTlQKKy8qCisgIFRoaXMgdW5yZWFzb25hYmx5IHByZXZlbnRlZCAiQ09QWSAvQVBQRU5EICouKiBiaWZpbGUiIGZyb20gY29uY2F0ZW5hdGluZworICBhIGJ1bmNoIG9mIGZpbGVzIGludG8gb25lIGJpZyBmaWxlLgorKi8KKyAgICBpZiAoYXBwZW5kaW5nICYmIHdpbGQpIHsKKyAgICAgICAgcHJpbnRmKCI/U29ycnksIC9BUFBFTkQgY2FuIGJlIHVzZWQgb25seSB3aXRoIHNpbmdsZSBmaWxlc1xuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB0YXJnZXRpc2RpciA9IGlzZGlyKHApOworICAgIHggPSBzdHJsZW4ocCk7CisgICAgaWYgKHRhcmdldGlzZGlyKSB7CisjaWZkZWYgVU5JWE9ST1NLCisgICAgICAgIGlmIChwW3gtMV0gIT0gJy8nKSB7CisgICAgICAgICAgICBja3N0cm5jYXQocCwiLyIsVE1QQlVGU0laKTsKKyAgICAgICAgICAgIHgrKzsKKyAgICAgICAgfQorI2Vsc2UKKyNpZmRlZiBPUzIKKyAgICAgICAgaWYgKHBbeC0xXSAhPSAnLycpIHsKKyAgICAgICAgICAgIGNrc3RybmNhdChwLCIvIixUTVBCVUZTSVopOworICAgICAgICAgICAgeCsrOworICAgICAgICB9CisjZWxzZQorI2lmZGVmIFNUUkFUVVMKKyAgICAgICAgaWYgKHBbeC0xXSAhPSAnPicpIHsKKyAgICAgICAgICAgIGNrc3RybmNhdChwLCI+IixUTVBCVUZTSVopOworICAgICAgICAgICAgeCsrOworICAgICAgICB9CisjZWxzZQorI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgICAgIGlmIChwW3gtMV0gIT0gJzonKSB7CisgICAgICAgICAgICBja3N0cm5jYXQocCwiOiIsVE1QQlVGU0laKTsKKyAgICAgICAgICAgIHgrKzsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKHBbeC0xXSAhPSAnLycpIHsKKyAgICAgICAgICAgIGNrc3RybmNhdChwLCIvIixUTVBCVUZTSVopOworICAgICAgICAgICAgeCsrOworICAgICAgICB9CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVU5JWE9ST1NLICovCisgICAgfQorICAgIHRhcmdldGxlbiA9IHg7CisKKyAgICBpZiAoIWFwcGVuZGluZykgewkJCS8qIElmIC9BUFBFTkQgbm90IGdpdmVuICovCisJaWYgKHdpbGQgJiYgIXRhcmdldGlzZGlyKSB7CS8qIE5vIHdpbGRjYXJkcyBhbGxvd2VkICovCisJICAgIHByaW50ZigJCQkvKiBpZiB0YXJnZXQgaXMgbm90IGEgZGlyZWN0b3J5ICovCisiP011bHRpcGxlIHNvdXJjZSBmaWxlcyBub3QgYWxsb3dlZCBpZiB0YXJnZXQgaXMgbm90IGEgZGlyZWN0b3J5LlxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorICAgIH0KKworI2lmZGVmIFZNUworICAgIGNvbnJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExldCBDdHJsLUMgd29yay4gKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyAgICBkZWJ1ZyhGMTEwLCJkb2NvcHkgbGluZSIsbGluZSwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJkb2NvcHkgcCIscCwwKTsKKworI2lmZGVmIFpYUkVXSU5ECisgICAgeiA9IHp4cmV3aW5kKCk7ICAgICAgICAgICAgICAgICAgICAgLyogUmV3aW5kIGZpbGUgbGlzdCAqLworI2Vsc2UKKyAgICB6ID0gbnp4cGFuZChzLDApOyAgICAgICAgICAgICAgICAgICAvKiBFeHBhbmQgZmlsZSBsaXN0ICovCisjZW5kaWYgLyogWlhSRVdJTkQgKi8KKworI2lmZGVmIFVOSVgKKyAgICBpZiAod2lsZCkKKyAgICAgIHNoX3NvcnQobXRjaHMsTlVMTCx6LDAsMCxmaWxlY2FzZSk7IC8qIEFscGhhYmV0aXplIHRoZSBmaWxlbmFtZSBsaXN0ICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZkZWYgSUtTRAorICAgIGlmICghdGFyZ2V0aXNkaXIgJiYgemNoa2kocCkgPiAtMSkgeyAvKiBEZXN0aW5hdGlvbiBmaWxlIGV4aXN0cz8gKi8KKyAgICAgICAgaWYgKGluc2VydmVyICYmICghRU5BQkxFRChlbl9kZWwpCisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc2d1ZXN0CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICApKSB7CisgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgb3ZlcndyaXRpbmcgZXhpc3RpbmcgZmlsZXMgaXMgZGlzYWJsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisKKyAgICBpZiAodG9iNjQgJiYgZnJvbWI2NCkgeyAgICAgICAgICAgICAvKiBUbyBhbmQgZnJvbSBCNjQgPSBubyBjb252ZXJzaW9uICovCisgICAgICAgIHRvYjY0ID0gMDsKKyAgICAgICAgZnJvbWI2NCA9IDA7CisgICAgfQorICAgIGRlYnVnKEYxMTAsIkNPUFkgZGVzdCIscCwwKTsKKworICAgIHdoaWxlICh6ID4gMCkgeworCisgICAgICAgIHpuZXh0KGxpbmUpOworICAgICAgICBpZiAoIWxpbmVbMF0pCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBlcnJubyAqLworCisgICAgICAgIGlmIChsaXN0aW5nKSBwcmludGYoIiVzID0+ICVzICIsbGluZSxwKTsKKworICAgICAgICAvKiBTdHJhaWdodCBjb3B5ICovCisgICAgICAgIGlmICghc3dhcHBpbmcgJiYgIWFwcGVuZGluZyAmJiAhZnJvbWI2NCAmJiAhdG9iNjQpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsIkNPUFkgemNvcHkiLGxpbmUsMCk7CisKKyAgICAgICAgICAgIGlmICgoeCA9IHpjb3B5KGxpbmUscCkpIDwgMCkgeyAvKiBMZXQgemNvcHkoKSBkbyBpdC4gKi8KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHgpIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgLTI6CisJCSAgICBpZiAobGlzdGluZykKKwkJICAgICAgcHJpbnRmKCIoRkFJTEVEOiBOb3QgYSByZWd1bGFyIGZpbGUpXG4iKTsKKwkJICAgIGVsc2UgaWYgKCFub2xpc3QpCisJCSAgICAgIHByaW50ZigiP05vdCBhIHJlZ3VsYXIgZmlsZSAtICVzXG4iLGxpbmUpOworICAgICAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAtMzoKKwkJICAgIGlmIChsaXN0aW5nKQorCQkgICAgICBwcmludGYoIihGQUlMRUQ6IE5vdCBmb3VuZCBvciBub3QgYWNjZXNzaWJsZSlcbiIpOworCQkgICAgZWxzZSBpZiAoIW5vbGlzdCkKKwkJICAgICAgcHJpbnRmKCI/Tm90IGZvdW5kIG9yIG5vdCBhY2Nlc3NpYmxlIC0gJXNcbiIsbGluZSk7CisgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIC00OgorCQkgICAgaWYgKGxpc3RpbmcpCisJCSAgICAgIHByaW50ZigiKEZBSUxFRDogUGVybWlzc2lvbiBkZW5pZWQpXG4iKTsKKwkJICAgIGVsc2UgaWYgKCFub2xpc3QpCisJCSAgICAgIHByaW50ZigiP1Blcm1pc3Npb24gZGVuaWVkIC0gJXNcbiIsbGluZSk7CisgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIC01OgorCQkgICAgaWYgKGxpc3RpbmcpCisJCSAgICAgIHByaW50ZigiKFNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIHRoZSBzYW1lIGZpbGUpXG4iKTsKKwkJICAgIGVsc2UgaWYgKCFub2xpc3QpCisJCSAgICAgIHByaW50ZigKKwkJCSAgIj9Tb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSB0aGUgc2FtZSBmaWxlIC0gJXNcbiIsCisJCQkgIGxpbmUKKwkJCSAgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIC02OgorCQkgICAgaWYgKGxpc3RpbmcpCisJCSAgICAgIHByaW50ZigiKEZBSUxFRDogSW5wdXQvT3V0cHV0IGVycm9yKVxuIik7CisJCSAgICBlbHNlIGlmICghbm9saXN0KQorCQkgICAgICBwcmludGYoIj9JbnB1dC9PdXRwdXQgZXJyb3IgLSAlc1xuIixsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgLTc6CisJCSAgICBpZiAobGlzdGluZykKKwkJICAgICAgcHJpbnRmKCIoRkFJTEVEOiAlcyAtICVzKVxuIixwLGNrX2VycnN0cigpKTsKKwkJICAgIGVsc2UgaWYgKCFub2xpc3QpCisJCSAgICAgIHByaW50ZigiPyVzIC0gJXNcbiIsY2tfZXJyc3RyKCkscCk7CisgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorCQkgICAgaWYgKGxpc3RpbmcpCisJCSAgICAgIHByaW50ZigiKEZBSUxFRDogJXMpXG4iLGNrX2VycnN0cigpKTsKKwkJICAgIGVsc2UgaWYgKCFub2xpc3QpCisJCSAgICAgIHByaW50ZigiPyVzXG4iLGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RpbmcpIHByaW50ZigiKE9LKVxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTcGVjaWFsIG9wdGlvbnMgKi8KKworICAgICAgICAgICAgaW50IHByZXYsIHksIHggPSAwOyAgICAgICAgIC8qIFZhcmlhYmxlcyBuZWVkZWQgZm9yIHRoZW0gKi8KKyAgICAgICAgICAgIGludCBpLCB0OworICAgICAgICAgICAgY2hhciBpYnVmWzEwMF07CisgICAgICAgICAgICBjaGFyIG9idWZbMjAwXTsKKyAgICAgICAgICAgIEZJTEUgKiBpbiA9IE5VTEw7CisgICAgICAgICAgICBGSUxFICogb3V0ID0gTlVMTDsKKworICAgICAgICAgICAgaWYgKChpbiA9IGZvcGVuKGxpbmUsInIiKSkgPT0gTlVMTCkgeyAvKiBPcGVuIGlucHV0IGZpbGUgKi8KKyAgICAgICAgICAgICAgICBpZiAobGlzdGluZykKKwkJICBwcmludGYoIihGQUlMRUQ6ICVzKVxuIixja19lcnJzdHIoKSk7CisJCWVsc2UgaWYgKCFub2xpc3QpCisJCSAgcHJpbnRmKCI/JXMgLSAlcylcbiIsY2tfZXJyc3RyKCksbGluZSk7CisgICAgICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRhcmdldGlzZGlyKSB7ICAgICAgICAgIC8qIFRhcmdldCBpcyBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgICAgICBjaGFyICogYnVmID0gTlVMTDsgICAgICAvKiBzbyBhcHBlbmQgdGhpcyBmaWxlbmFtZSB0byBpdCAqLworICAgICAgICAgICAgICAgIHpzdHJpcChsaW5lLCZidWYpOworICAgICAgICAgICAgICAgIHBbdGFyZ2V0bGVuXSA9IE5VTDsKKyAgICAgICAgICAgICAgICBpZiAoYnVmKQorICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHAsYnVmLFRNUEJVRlNJWik7CisgICAgICAgICAgICB9CisjaWZkZWYgT1MyT1JVTklYCisgICAgICAgICAgICBpZiAoemNtcGZuKGxpbmUscCkpIHsgICAgICAgLyogSW5wdXQgYW5kIG91dHB1dCBhcmUgc2FtZSBmaWxlPyAqLworICAgICAgICAgICAgICAgIGlmIChsaXN0aW5nKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCIoRkFJTEVEOiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGlkZW50aWNhbClcbiIpOworCQllbHNlIGlmICghbm9saXN0KQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/U291cmNlIGFuZCBkZXN0aW5hdGlvbiBpZGVudGljYWwgLSAlc1xuIiwgbGluZSk7IAorICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyAgICAgICAgICAgIGlmICgob3V0ID0gZm9wZW4ocCwgKGFwcGVuZGluZyA/ICJhIiA6ICJ3IikpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZmNsb3NlKGluKTsKKyAgICAgICAgICAgICAgICBpZiAobGlzdGluZykKKwkJICBwcmludGYoIihGQUlMRUQ6ICVzIC0gJXMpXG4iLHAsY2tfZXJyc3RyKCkpOworCQllbHNlIGlmICghbm9saXN0KQorCQkgIHByaW50ZigiPyVzIC0gJXNcbiIscCxja19lcnJzdHIoKSk7CisgICAgICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgaWYgKHRvYjY0KSB7ICAgICAgICAgICAgICAgIC8qIENvbnZlcnRpbmcgdG8gQmFzZS02NCAqLworCisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiQ09QWSB0b2I2NCIsbGluZSwwKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgIC8qIExvb3AuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IHg7CisgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9IGZyZWFkKGlidWYsMSw1NCxpbikpIDwgMSkgeyAvKiBFT0YgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIihPSylcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgJSAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIoRkFJTEVEOiBQaGFzZSBlcnJvciBhdCAlZClcbiIscHJldik7CisJCQllbHNlIGlmICghbm9saXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9QaGFzZSBlcnJvciBhdCAlZFxuIixwcmV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzd2FwcGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggJiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIihGQUlMRUQ6IFN3YXAgZXJyb3IpXG4iKTsKKwkJCSAgICBlbHNlIGlmICghbm9saXN0KQorCQkJICAgICAgcHJpbnRmKCI/U3dhcCBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHg7IGkrPTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gaWJ1ZltpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYnVmW2ldID0gaWJ1ZltpKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlidWZbaSsxXSA9IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gYjh0b2I2NChpYnVmLHgsb2J1ZiwxODApKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIihGQUlMRUQ6IEVuY29kaW5nIGVycm9yKVxuIik7CisJCQllbHNlIGlmICghbm9saXN0KQorCQkJICBwcmludGYoIj9FbmNvZGluZyBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dCwiJXNcbiIsb2J1Zik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGZyb21iNjQpIHsgICAgICAgLyogQ29udmVydGluZyBmcm9tIEJhc2UgNjQgKi8KKworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsIkNPUFkgZnJvbWI2NCIsbGluZSwwKTsKKworICAgICAgICAgICAgICAgIGlmICgob3V0ID0gZm9wZW4ocCxhcHBlbmRpbmcgPyAiYSIgOiAidyIpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShpbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0aW5nKQorCQkgICAgICBwcmludGYoIihGQUlMRUQ6ICVzIC0gJXMpXG4iLHAsY2tfZXJyc3RyKCkpOworCQkgICAgZWxzZSBpZiAoIW5vbGlzdCkKKwkJICAgICAgcHJpbnRmKCI/JXMgLSAlc1xuIixwLGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeCA9IDE7CisgICAgICAgICAgICAgICAgd2hpbGUgKHgpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGZyZWFkKGlidWYsMSw4MCxpbik7CisgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IGI2NHRvYjgoaWJ1Zix4LG9idWYsODApKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIihGQUlMRUQ6IERlY29kaW5nIGVycm9yKVxuIik7CisJCQllbHNlIGlmICghbm9saXN0KQorCQkJICBwcmludGYoIj9EZWNvZGluZyBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3dhcHBpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ICYgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIoRkFJTEVEOiBTd2FwIGVycm9yKVxuIik7CisJCQkgICAgZWxzZSBpZiAoIW5vbGlzdCkKKwkJCSAgICAgIHByaW50ZigiP1N3YXAgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB5OyBpKz0yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG9idWZbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2J1ZltpXSA9IG9idWZbaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnVmW2krMV0gPSB0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh5ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ3cml0ZShvYnVmLDEseSxvdXQpIDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIoRkFJTEVEOiAlcyAtICVzKVxuIixwLGNrX2VycnN0cigpKTsKKwkJCSAgICBlbHNlIGlmICghbm9saXN0KQorCQkJICAgICAgcHJpbnRmKCI/JXMgLSAlc1xuIixwLGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICAgICAgICAgIGlmIChzd2FwcGluZykgeyAgICAgICAgICAgICAvKiBTd2FwcGluZyBieXRlcyAqLworCisgICAgICAgICAgICAgICAgQ0hBUiBjWzNdOworICAgICAgICAgICAgICAgIGNbMl0gPSBOVUw7CisKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJDT1BZIHN3YXBwaW5nIixsaW5lLDApOworCisgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGZyZWFkKChjaGFyICopYywxLDIsaW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIihPSylcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjWzFdID0gY1swXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNbMF0gPSBOVUw7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihXQVJOSU5HOiBPZGQgYnl0ZSBjb3VudCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGlzdGluZykgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChmcHJpbnRmKG91dCwiJWMlYyIsY1sxXSxjWzBdKSA9PSBFT0YpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIihGQUlMRUQ6ICVzIC0gJXMpXG4iLHAsY2tfZXJyc3RyKCkpOworCQkJZWxzZSBpZiAoIW5vbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/JXMgLSAlc1xuIixwLGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGFwcGVuZGluZykgeyAgICAgLyogQXBwZW5kaW5nIHRvIHRhcmdldCBmaWxlICovCisKKyAgICAgICAgICAgICAgICBjaGFyIGM7CisKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJDT1BZIGFwcGVuZGluZyIsbGluZSwwKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSBmcmVhZCgmYywxLDEsaW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIihPSylcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZ3cml0ZSgmYywxLDEsb3V0KSA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIihGQUlMRUQ6ICVzIC0gJXMpXG4iLHAsY2tfZXJyc3RyKCkpOworCQkJZWxzZSBpZiAoIW5vbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/JXMgLSAlc1xuIixwLGNrX2VycnN0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dCkgZmNsb3NlKG91dCk7CisgICAgICAgICAgICBpZiAoaW4pIGZjbG9zZShpbik7CisgICAgICAgIH0KKyNpZmRlZiBWTVNPUlVOSVgKKyAgICAgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsKKyNlbmRpZiAvKiBWTVNPUlVOSVggKi8KKyAgICB9CisgICAgaWYgKHJjID4gLTEpIHN1Y2Nlc3MgPSByYzsKKyAgICByZXR1cm4ocmMpOworfQorI2VuZGlmIC8qIFpDT1BZICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworI2lmbmRlZiBOT1JFTkFNRQorI2lmbmRlZiBOT0ZSSUxMUworI2lmZGVmIFpSRU5BTUUKK2ludAorZG9yZW5hbSgpIHsKKyAgICAvKiBQYXJzZSBhIGZpbGUgb3IgYSBkaXJlY3RvcnkgbmFtZSAqLworICAgIGludCBpLCB4LCB6LCBsaXN0aW5nID0gMCwgaGF2ZW5hbWUgPSAwLCB3aWxkID0gMCwgcmMgPSAxOworICAgIGludCBub2xpc3QgPSAwOworICAgIHN0cnVjdCBGREIgc3csIGZpOworCisgICAgY21mZGJpKCZzdywgICAgICAgICAgICAgICAgICAgICAgICAgLyogMm5kIEZEQiAtIG9wdGlvbmFsIC9QQUdFIHN3aXRjaCAqLworICAgICAgICAgICBfQ01LRVksICAgICAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICJGaWxlbmFtZSBvciBzd2l0Y2giLCAgICAgICAgLyogaGxwbXNnICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIG5xdnN3dGFiLCAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgcXZzd3RhYiwgICAgICAgICAgICAgICAgICAgICAvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgICAgICZmaSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICApOworCisgICAgY21mZGJpKCZmaSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogMXN0IEZEQiAtIGZpbGUgdG8gdHlwZSAqLworICAgICAgICAgICBfQ01JRkksICAgICAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGxwbXNnICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworICAgICAgICAgICB4eHN0cmluZywKKyAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgTlVMTAorICAgICAgICAgICApOworCisgICAgd2hpbGUgKCFoYXZlbmFtZSkgeworICAgICAgICB4ID0gY21mZGIoJnN3KTsgICAgICAgICAgICAgICAgIC8qIFBhcnNlIHNvbWV0aGluZyAqLworICAgICAgICBpZiAoeCA8IDApICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBzd2l0Y2ggKGNtcmVzdWx0LmZjb2RlKSB7CisgICAgICAgICAgY2FzZSBfQ01LRVk6CisgICAgICAgICAgICBzd2l0Y2ggKGNtcmVzdWx0Lm5yZXN1bHQpIHsKKyAgICAgICAgICAgICAgY2FzZSBERUxfTElTOgorICAgICAgICAgICAgICBjYXNlIERFTF9WUkI6CisgICAgICAgICAgICAgICAgbGlzdGluZyA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgREVMX05PTDoKKyAgICAgICAgICAgICAgY2FzZSBERUxfUVVJOgorCQlub2xpc3QgPSAxOworICAgICAgICAgICAgICAgIGxpc3RpbmcgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBfQ01JRkk6CisgICAgICAgICAgICBzID0gY21yZXN1bHQuc3Jlc3VsdDsKKyAgICAgICAgICAgIGhhdmVuYW1lID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgfQorICAgIHdpbGQgPSBjbXJlc3VsdC5ucmVzdWx0OyAgICAgICAgICAgIC8qIFNvdXJjZSBzcGVjaWZpY2F0aW9uIHdpbGQ/ICovCisKKyAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7ICAgICAgICAvKiBNYWtlIGEgc2FmZSBjb3B5IG9mIHNvdXJjZSBuYW1lICovCisgICAgcyA9IGxpbmU7CisKKyAgICBpZiAoIXdpbGQpCisgICAgICB3aWxkID0gaXN3aWxkKGxpbmUpOworCisgICAgcCA9IHRtcGJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGxhY2UgZm9yIG5ldyBuYW1lICovCisgICAgaWYgKCh4ID0gY21vZmkod2lsZCA/ICJUYXJnZXQgZGlyZWN0b3J5IiA6ICJOZXcgbmFtZSIsCisgICAgICAgICAgICAgICAgICAgIiIsJnMseHhzdHJpbmcpKSA8IDApIHsgLyogR2V0IG5ldyBuYW1lICovCisgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICBwcmludGYoIj8lcyByZXF1aXJlZFxuIiwgd2lsZCA/ICJUYXJnZXQgZGlyZWN0b3J5IiA6ICJOZXcgbmFtZSIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfSBlbHNlIHJldHVybih4KTsKKyAgICB9CisgICAgY2tzdHJuY3B5KHAscyxUTVBCVUZTSVopOyAgICAgICAgICAgLyogTWFrZSBhIHNhZmUgY29weSBvZiB0aGUgbmV3IG5hbWUgKi8KKyAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKworICAgIGlmICghd2lsZCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEp1c3Qgb25lICovCisgICAgICAgIGlmIChsaXN0aW5nKSBwcmludGYoIiVzID0+ICVzICIsbGluZSxwKTsKKyAgICAgICAgaWYgKHpyZW5hbWUobGluZSxwKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChsaXN0aW5nKQorCSAgICAgIHByaW50ZigiKEZBSUxFRDogJXMpXG4iLGNrX2VycnN0cigpKTsKKwkgICAgZWxzZSBpZiAoIW5vbGlzdCkKKwkgICAgICBwcmludGYoIj8lc1xuIixja19lcnJzdHIoKSk7CisgICAgICAgICAgICByYyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobGlzdGluZykgcHJpbnRmKCIoT0spXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHJjKTsKKyAgICB9CisgICAgaWYgKCFpc2RpcihwKSkgeyAgICAgICAgICAgICAgICAgICAgLyogTXVsdGlwbGUgKi8KKyAgICAgICAgcHJpbnRmKCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0YXJnZXQgaXMgbm90IGEgZGlyZWN0b3J5ICovCisiP011bHRpcGxlIHNvdXJjZSBmaWxlcyBub3QgYWxsb3dlZCBpZiB0YXJnZXQgaXMgbm90IGEgZGlyZWN0b3J5LlxuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorI2lmZGVmIENPTU1FTlQKKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG93IGZ1bGwgcGF0aCBvZiB0YXJnZXQgKi8KKyAgICAgICAgY2hhciBidWZbQ0tNQVhQQVRIXTsgICAgICAgICAgICAvKiAodG9vIG11Y2gpICovCisgICAgICAgIGlmICh6Zm5xZnAocCxDS01BWFBBVEgsYnVmKSkKKyAgICAgICAgICBja3N0cm5jcHkodG1wYnVmLGJ1ZixUTVBCVUZTSVopOworICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBWTVMKKyAgICBjb25yZXMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZXQgQ3RybC1DIHdvcmsuICovCisjZW5kaWYgLyogVk1TICovCisgICAgZGVidWcoRjExMCwiZG9yZW5hbWUgbGluZSIsbGluZSwwKTsKKworI2lmZGVmIFpYUkVXSU5ECisgICAgeiA9IHp4cmV3aW5kKCk7ICAgICAgICAgICAgICAgICAgICAgLyogUmV3aW5kIGZpbGUgbGlzdCAqLworI2Vsc2UKKyAgICB6ID0gbnp4cGFuZChzLDApOyAgICAgICAgICAgICAgICAgICAvKiBFeHBhbmQgZmlsZSBsaXN0ICovCisjZW5kaWYgLyogWlhSRVdJTkQgKi8KKyAgICBkZWJ1ZyhGMTExLCJkb3JlbmFtZSBwIixwLHopOworCisjaWZkZWYgVU5JWAorICAgIGlmICh3aWxkICYmIHogPiAxKQorICAgICAgc2hfc29ydChtdGNocyxOVUxMLHosMCwwLGZpbGVjYXNlKTsgLyogQWxwaGFiZXRpemUgdGhlIGZpbGVuYW1lIGxpc3QgKi8KKyNlbmRpZiAvKiBVTklYICovCisKKy8qCisgIE5vdGU6IENPUFksIFJFTkFNRSwgREVMRVRFIGFuZCBzaW1pbGFyIGNvbW1hbmRzIHNob3VsZCBoYXZlIG9wdGlvbnMgdG8KKyAgc3RvcCBvciBwcm9jZWVkIHdoZW4gdGhleSBhcmUgb3BlcmF0aW5nIG9uIG11bHRpcGxlIGZpbGVzIGFuZCB0aGUgb3BlcmF0aW9uCisgIGZhaWxzLgorKi8KKyAgICB3aGlsZSAoei0tID4gMCkgeworICAgICAgICBpZiAoISh6ID09IDAgJiYgIXdpbGQpKQorICAgICAgICAgIHpuZXh0KGxpbmUpOworICAgICAgICBpZiAoIWxpbmVbMF0pCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChsaXN0aW5nKSBwcmludGYoIiVzID0+ICVzICIsbGluZSxwKTsKKyAgICAgICAgaWYgKHpyZW5hbWUobGluZSxwKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChsaXN0aW5nKQorCSAgICAgIHByaW50ZigiKEZBSUxFRDogJXMpXG4iLGNrX2VycnN0cigpKTsKKwkgICAgZWxzZSBpZiAoIW5vbGlzdCkKKwkgICAgICBwcmludGYoIj8lcyAtICVzXG4iLGNrX2VycnN0cigpLGxpbmUpOworICAgICAgICAgICAgcmMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxpc3RpbmcpIHByaW50ZigiKE9LKVxuIik7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgVk1TCisgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsKKyNlbmRpZiAvKiBWTVMgKi8KKyAgICByZXR1cm4oc3VjY2VzcyA9IHJjKTsKK30KKyNlbmRpZiAvKiBaUkVOQU1FICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyNlbmRpZiAvKiBOT1JFTkFNRSAqLworCisjaWZuZGVmIE5PU1BMCisKKy8qIERvIHRoZSBSRVRVUk4gY29tbWFuZCAqLworCitpbnQKK2RvcmV0dXJuKHMpIGNoYXIgKnM7IHsKKyAgICBpbnQgeDsKKyAgICBleHRlcm4gaW50IHRyYV9hc2c7CisgICAgY2hhciAqIGxpbmUsICogbHA7CisKKyAgICBpZiAoY21kbHZsIDwgMSkgeworICAgICAgICBwcmludGYoIlxuP0Nhbid0IHJldHVybiBmcm9tIGxldmVsICVkXG4iLG1hY2x2bCk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgfQorICAgIGxpbmUgPSBtYWxsb2MoTElOQlVGU0laKTsKKyAgICBpZiAobGluZSA9PSBOVUxMKQorICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICBscCA9IGxpbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHBhbmQgcmV0dXJuIHZhbHVlIG5vdyAqLworICAgIHggPSBMSU5CVUZTSVotMTsKKyAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICBkZWJ1ZyhGMTEwLCJSRVRVUk4gcyIscywwKTsKKyAgICBpZiAoenpzdHJpbmcocywmbHAsJngpID4gLTEpIHsKKyAgICAgICAgcyA9IGxpbmU7CisgICAgICAgIGRlYnVnKEYxMTAsIlJFVFVSTiB6enN0cmluZyIscywwKTsKKyAgICB9CisKKyAgICAvKiBQb3AgZnJvbSBhbGwgRk9SL1dISUxFL1NXSVRDSC9YSUZzICovCisgICAgd2hpbGUgKChtYWNsdmwgPiAwKSAmJgorICAgICAgICAgICAobV9hcmdbbWFjbHZsLTFdWzBdKSAmJgorICAgICAgICAgICAoY21kc3RrW2NtZGx2bF0uc3JjID09IENNRF9NRCkgJiYKKyAgICAgICAgICAgKCFzdHJuY21wKG1fYXJnW21hY2x2bC0xXVswXSwiX3hpZiIsNCkgfHwKKyAgICAgICAgICAgICFzdHJuY21wKG1fYXJnW21hY2x2bC0xXVswXSwiX2ZvciIsNCkgfHwKKyAgICAgICAgICAgICFzdHJuY21wKG1fYXJnW21hY2x2bC0xXVswXSwiX3N3aSIsNCkgfHwKKyAgICAgICAgICAgICFzdHJuY21wKG1fYXJnW21hY2x2bC0xXVswXSwiX3doaSIsNCkpKSB7CisgICAgICAgIGRlYnVnKEYxMTEsIlJFVFVSTiBJRi9GT1IvV0hJL1NXSSBwb3AiLG1fYXJnW21hY2x2bC0xXVswXSxtYWNsdmwpOworICAgICAgICBkb2d0YShYWFBUQSk7ICAgICAgICAgICAgICAgICAgIC8qIFB1dCBhcmdzIGJhY2sgKi8KKyAgICAgICAgcG9wY2x2bCgpOyAgICAgICAgICAgICAgICAgICAgICAvKiBQb3AgdXAgdHdvIGxldmVscyAqLworICAgICAgICBwb3BjbHZsKCk7CisgICAgfQorICAgIGlmICh0cmFfYXNnKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRyYWNpbmcgc2hvdyByZXR1cm4gdmFsdWUgKi8KKyAgICAgICAgaWYgKCpzKQorICAgICAgICAgIHByaW50ZigiPDw8ICVzOiBcIiVzXCJcbiIsIG1fYXJnW21hY2x2bF1bMF0sIHMpOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCI8PDwgJXM6IChudWxsKVxuIiwgbV9hcmdbbWFjbHZsXVswXSk7CisgICAgfQorICAgIHBvcGNsdmwoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvcCBmcm9tIGVuY2xvc2luZyBUQUtFIG9yIG1hY3JvICovCisgICAgZGVidWcoRjExMSwiUkVUVVJOIHRvbGV2ZWwiLHMsbWFjbHZsKTsKKyAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICBpZiAoISpzKSBzID0gTlVMTDsKKyAgICBtYWtlc3RyKCYobXJ2YWxbbWFjbHZsKzFdKSxzKTsgICAgICAvKiBTZXQgdGhlIFJFVFVSTiB2YWx1ZSAqLworICAgIGZyZWUobGluZSk7CisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsgICAgICAgICAgICAgICAgLyogTWFjcm8gc3VjY2VlZHMgaWYgd2UgUkVUVVJOICovCit9CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT1NQTAorLyogRG8gdGhlIE9QRU4gY29tbWFuZCAqLworCitpbnQKK2Rvb3BlbigpICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPUEVOIHsgYXBwZW5kLCByZWFkLCB3cml0ZSB9ICovCisgICAgaW50IHgsIHksIHogPSAwOyBjaGFyICpzOworICAgIHN0YXRpYyBzdHJ1Y3QgZmlsaW5mbyBmY2I7ICAgICAgICAgIC8qIChtdXN0IGJlIHN0YXRpYykgKi8KKyAgICBpZiAoKHggPSBjbWtleShvcG50YWIsbm9wbiwibW9kZSIsIiIseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgIHByaW50ZigiP01vZGUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfSBlbHNlIHJldHVybih4KTsKKyAgICB9CisgICAgc3dpdGNoICh4KSB7CisgICAgICBjYXNlIE9QTl9GSV9SOiAgICAgICAgICAgICAgICAgICAgLyogT2xkIGZpbGUgKFJFQUQpICovCisgICAgICAgIGlmIChjaGtmbihaUkZJTEUpID4gMCkgeworICAgICAgICAgICAgcHJpbnRmKCI/UmVhZCBmaWxlIGFscmVhZHkgb3BlblxuIik7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgICAgIGlmICgoeiA9IGNtaWZpKCJGaWxlIHRvIHJlYWQiLCIiLCZzLCZ5LHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoeiA9PSAtMykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0lucHV0IGZpbGVuYW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfSBlbHNlIHJldHVybih6KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gd2lsZGNhcmRzIGFsbG93ZWQgKi8KKyAgICAgICAgICAgIHByaW50ZigiXG4/UGxlYXNlIHNwZWNpZnkgYSBzaW5nbGUgZmlsZVxuIik7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKyAgICAgICAgaWYgKChpbnQpc3RybGVuKGxpbmUpIDwgMSkgcmV0dXJuKC0yKTsKKyAgICAgICAgaWYgKCh6ID0gY21udW0oImJ1ZmZlciBzaXplIiwiNDA5NiIsMTAsJnkseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICBpZiAoeSA8IDEpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1Bvc2l0aXZlIG51bWJlciByZXF1aXJlZFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIGlmICgoeiA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHopOworICAgICAgICByZWFkYmxvY2sgPSB5OworICAgICAgICBpZiAocmVhZGJ1ZikKKyAgICAgICAgICBmcmVlKChjaGFyICopcmVhZGJ1Zik7CisgICAgICAgIGlmICghKHJlYWRidWYgPSAoQ0hBUiAqKSBtYWxsb2MocmVhZGJsb2NrKzEpKSkgeworICAgICAgICAgICAgcHJpbnRmKCI/Q2FuJ3QgYWxsb2NhdGUgcmVhZCBidWZmZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHpvcGVuaShaUkZJTEUsbGluZSkpOworCisjaWZuZGVmIE1BQworI2lmbmRlZiBOT1BVU0gKKyAgICAgIGNhc2UgT1BOX1BJX1I6ICAgICAgICAgICAgICAgICAgICAvKiBQaXBlL1Byb2Nlc3MgKCFSRUFEKSAqLworICAgICAgICBpZiAobm9wdXNoKSB7CisgICAgICAgICAgICBwcmludGYoIj9SZWFkIGZyb20gcGlwZSBkaXNhYmxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2Vzcz0wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hrZm4oWlJGSUxFKSA+IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiP1JlYWQgZmlsZSBhbHJlYWR5IG9wZW5cbiIpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHkgPSBjbXR4dCgiU3lzdGVtIGNvbW1hbmQgdG8gcmVhZCBmcm9tIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgaWYgKHkgPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9Db21tYW5kIG5hbWUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9IGVsc2UgcmV0dXJuKHkpOworICAgICAgICB9CisgICAgICAgIGNrc3RybmNweShsaW5lLGJyc3RyaXAocyksTElOQlVGU0laKTsKKyAgICAgICAgaWYgKCFsaW5lWzBdKSByZXR1cm4oLTIpOworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgaWYgKCFyZWFkYnVmKSB7CisgICAgICAgICAgICBpZiAoIShyZWFkYnVmID0gKENIQVIgKikgbWFsbG9jKHJlYWRibG9jaysxKSkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9DYW4ndCBhbGxvY2F0ZSByZWFkIGJ1ZmZlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHp4Y21kKFpSRklMRSxsaW5lKSk7CisKKyAgICAgIGNhc2UgT1BOX1BJX1c6ICAgICAgICAgICAgICAgICAgICAvKiBXcml0ZSB0byBwaXBlICovCisgICAgICAgIGlmIChub3B1c2gpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1dyaXRlIHRvIHBpcGUgZGlzYWJsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3M9MCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoa2ZuKFpXRklMRSkgPiAwKSB7CisgICAgICAgICAgICBwcmludGYoIj9Xcml0ZSBmaWxlIGFscmVhZHkgb3BlblxuIik7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtdHh0KCJTeXN0ZW0gY29tbWFuZCB0byB3cml0ZSB0byIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgIGlmICh5ID09IC0zKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/Q29tbWFuZCBuYW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfSBlbHNlIHJldHVybih5KTsKKyAgICAgICAgfQorICAgICAgICBja3N0cm5jcHkobGluZSxicnN0cmlwKHMpLExJTkJVRlNJWik7CisgICAgICAgIGlmICghbGluZVswXSkgcmV0dXJuKC0yKTsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHN1Y2Nlc3MgPSB6eGNtZChaV0ZJTEUsbGluZSk7CisgICAgICAgIGlmICghc3VjY2VzcyAmJiBtc2dmbGcpCisgICAgICAgICAgcHJpbnRmKCJDYW4ndCBvcGVuIHByb2Nlc3MgZm9yIHdyaXRpbmc6ICVzXG4iLGxpbmUpOworICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisjZW5kaWYgLyogTk9QVVNIICovCisjZW5kaWYgLyogTUFDICovCisKKyAgICAgIGNhc2UgT1BOX0ZJX1c6ICAgICAgICAgICAgICAgICAgICAvKiBOZXcgZmlsZSAoV1JJVEUpICovCisgICAgICBjYXNlIE9QTl9GSV9BOiAgICAgICAgICAgICAgICAgICAgLyogKEFQUEVORCkgKi8KKyAgICAgICAgaWYgKCh6ID0gY21vZmkoIk5hbWUgb2YgbG9jYWwgZmlsZSB0byBjcmVhdGUiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoeiA9PSAtMykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0ZpbGVuYW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfSBlbHNlIHJldHVybih6KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeiA9PSAyKSB7CisgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgJXMgaXMgYSBkaXJlY3RvcnkgbmFtZVxuIixzKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoa2ZuKFpXRklMRSkgPiAwKSB7CisgICAgICAgICAgICBwcmludGYoIj9Xcml0ZS9BcHBlbmQgZmlsZSBhbHJlYWR5IG9wZW5cbiIpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgICAgICBmY2IuYnMgPSBmY2IuY3MgPSBmY2IucmwgPSBmY2IuZm10ID0gZmNiLm9yZyA9IGZjYi5jYyA9IGZjYi50eXAgPSAwOworICAgICAgICBmY2IubGJsb3B0cyA9IDA7CisgICAgICAgIGZjYi5kc3AgPSAoeCA9PSBPUE5fRklfVykgPyBYWUZaX04gOiBYWUZaX0E7IC8qIENyZWF0ZSBvciBBcHBlbmQgKi8KKyAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICBpZiAoKGludClzdHJsZW4obGluZSkgPCAxKSByZXR1cm4oLTIpOworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSB6b3Blbm8oWldGSUxFLGxpbmUsTlVMTCwmZmNiKSk7CisKKyNpZm5kZWYgTk9MT0NBTAorICAgICAgY2FzZSBPUE5fU0VSOiAgICAgICAgICAgICAgICAgICAgIC8qIE9QRU4gUE9SVCBvciBMSU5FICovCisgICAgICBjYXNlIE9QTl9ORVQ6IHsgICAgICAgICAgICAgICAgICAgLyogT1BFTiBIT1NUICovCisgICAgICAgICAgZXh0ZXJuIGludCBkaWRzZXRsaW4sIHR0bnByb3RvOworICAgICAgICAgIGlmICh4ID09IE9QTl9ORVQpIHsKKyAgICAgICAgICAgICAgeiA9IHR0bnByb3RvOworICAgICAgICAgICAgICB0dG5wcm90byA9IE5QX05PTkU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoeSA9IHNldGxpbigoeCA9PSBPUE5fU0VSKSA/IFhZTElORSA6IFhZSE9TVCwgMSwgMCkpIDwgMCkgeworICAgICAgICAgICAgICBpZiAoeCA9PSBPUE5fTkVUKQorICAgICAgICAgICAgICAgIHR0bnByb3RvID0gejsKKyAgICAgICAgICAgICAgc3VjY2VzcyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGRpZHNldGxpbisrOworICAgICAgICAgIHJldHVybih5KTsKKyAgICAgIH0KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ZigiP05vdCBpbXBsZW1lbnRlZCIpOworICAgICAgICByZXR1cm4oLTIpOworICAgIH0KK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PWEZFUgorLyogIEQgTyBYIEcgRSBUICAtLSAgR0VUIGNvbW1hbmQgcGFyc2VyIHdpdGggc3dpdGNoZXMgICovCisKKyNpZmRlZiBDS19MQUJFTEVECitpbnQgZ19sZl9vcHRzID0gLTE7CitleHRlcm4gaW50IGxmX29wdHM7CisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworCitpbnQKK2RveGdldChjeCkgaW50IGN4OyB7CisgICAgZXh0ZXJuIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXh0ZXJuYWwgdmFyaWFibGVzIHdlIG5lZWQgKi8KKyNpZmRlZiBSRUNVUlNJVkUKKyAgICAgIHJlY3Vyc2l2ZSwKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICAgIHhmZXJtb2RlLCBmZGlzcGxhLCBwcm90b2NvbCwgdXNlcGlwZXMsCisgICAgICBnX2JpbmFyeSwgZ194ZmVybW9kZSwgZ19kaXNwbGEsIGdfcnBhdGgsIGdfdXNlcGlwZXM7CisgICAgZXh0ZXJuIGNoYXIgKiByY3ZfbW92ZTsgICAgICAgICAgICAgLyogRGlyZWN0b3J5IHRvIG1vdmUgbmV3IGZpbGVzIHRvICovCisgICAgZXh0ZXJuIGNoYXIgKiByY3ZfcmVuYW1lOyAgICAgICAgICAgLyogV2hhdCB0byByZW5hbWUgbmV3IGZpbGVzIHRvICovCisgICAgZXh0ZXJuIGNoYXIgKiByY3ZleGNlcHRbXTsgICAgICAgICAgLyogUkVDRUlWRSAvIEdFVCBleGNlcHRpb24gbGlzdCAqLworICAgIGludCBvcGt0ICA9ICAwOyAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIE8tUGFja2V0IG5lZWRlZCAqLworCisjaWZkZWYgUElQRVNFTkQKKyAgICBleHRlcm4gaW50IHBpcGVzZW5kOworICAgIGV4dGVybiBjaGFyICogcmN2ZmlsdGVyOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgcnBhdGh0YWJbXTsKKyAgICBleHRlcm4gaW50IG5ycGF0aHRhYjsKKyAgICBleHRlcm4gbG9uZyBjYWxpYnJhdGU7CisgICAgaW50IGFzbmFtZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgaGF2ZSBhcy1uYW1lICovCisgICAgaW50IGtvbmx5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogS2VybWl0LW9ubHkgZnVuY3Rpb24gKi8KKyAgICBpbnQgYywgaSwgbiwgY29uZmlybWVkID0gMDsgICAgICAgICAvKiBXb3JrZXJzICovCisgICAgaW50IGdldHZhbCA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogV2hldGhlciB0byBnZXQgc3dpdGNoIHZhbHVlICovCisgICAgaW50IHJjdmNtZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogV2hldGhlciBpdCBpcyB0aGUgUkVDRUlWRSBjb21tYW5kICovCisgICAgaW50IG1nZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogV2hldGhlciBpdCBpcyB0aGUgTUdFVCBjb21tYW5kICovCisgICAgc3RydWN0IHN0cmluZ2ludCB7ICAgICAgICAgICAgICAgICAgLyogVGVtcG9yYXJ5IGFycmF5IGZvciBzd2l0Y2ggdmFsdWVzICovCisgICAgICAgIGNoYXIgKiBzdmFsOworICAgICAgICBpbnQgaXZhbDsKKyAgICB9IHB2W1NORF9NQVgrMV07CisgICAgc3RydWN0IEZEQiBzdywgZmwsIGNtOyAgICAgICAgICAgICAgLyogRkRCcyBmb3IgZWFjaCBwYXJzZSBmdW5jdGlvbiAqLworICAgIGNoYXIgKiBjbWRzdHIgPSAidGhpcyBjb21tYW5kIjsKKworI2lmZGVmIE5FV0ZUUAorICAgIGlmIChjeCA9PSBYWEdFVCB8fCBjeCA9PSBYWFJFR0VUIHx8IGN4ID09IFhYTUdFVCB8fCBjeCA9PSBYWFJFVFIpIHsKKyAgICAgICAgZXh0ZXJuIGludCBmdHBnZXQ7CisgICAgICAgIGV4dGVybiBpbnQgZnRwaXNvcGVuKCk7CisgICAgICAgIGlmICgoZnRwZ2V0ID09IDEpIHx8ICgoZnRwZ2V0ID09IDIpICYmIGZ0cGlzb3BlbigpKSkKKyAgICAgICAgICByZXR1cm4oZG9mdHBnZXQoY3gsMCkpOworICAgIH0KKyNlbmRpZiAvKiBORVdGVFAgKi8KKworICAgIGRlYnVnKEYxMDEsInhnZXQgY3giLCIiLGN4KTsKKworICAgIG9vcHRzID0gLTE7CisgICAgb21vZGUgPSAtMTsKKworICAgIGZvciAoaSA9IDA7IGkgPD0gU05EX01BWDsgaSsrKSB7ICAgIC8qIEluaXRpYWxpemUgc3dpdGNoIHZhbHVlcyAqLworICAgICAgICBwdltpXS5zdmFsID0gTlVMTDsKKyAgICAgICAgcHZbaV0uaXZhbCA9IC0xOworICAgIH0KKyAgICAvKiBQcmVzZXQgc3dpdGNoIHZhbHVlcyBiYXNlZCBvbiB0b3AtbGV2ZWwgY29tbWFuZCB0aGF0IGNhbGxlZCB1cyAqLworCisgICAgc3dpdGNoIChjeCkgeworICAgICAgY2FzZSBYWFJFQzogICAgICAgICAgICAgICAgICAgICAgIC8qIFJFQ0VJVkUgKi8KKyAgICAgICAgY21kc3RyID0gIlJFQ0VJVkUiOworICAgICAgICByY3ZjbWQgPSAxOyBicmVhazsKKyAgICAgIGNhc2UgWFhHRVQ6ICAgICAgICAgICAgICAgICAgICAgICAvKiBHRVQgKi8KKyAgICAgICAgY21kc3RyID0gIkdFVCI7CisgICAgICAgIGtvbmx5ID0gMTsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgQ0tfUkVTRU5ECisgICAgICBjYXNlIFhYUkVHRVQ6ICAgICAgICAgICAgICAgICAgICAgLyogUkVHRVQgKi8KKyAgICAgICAgY21kc3RyID0gIlJFR0VUIjsKKyAgICAgICAga29ubHkgPSAxOworICAgICAgICBwdltTTkRfQklOXS5pdmFsID0gMTsgICAgICAgICAgIC8qIEltcGxpZXMgL0JJTkFSWSAqLworICAgICAgICBwdltTTkRfUkVTXS5pdmFsID0gMTsgYnJlYWs7CisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisgICAgICBjYXNlIFhYUkVUUjogICAgICAgICAgICAgICAgICAgICAgLyogUkVUUklFVkUgKi8KKyAgICAgICAgY21kc3RyID0gIlJFVFJJRVZFIjsKKyAgICAgICAga29ubHkgPSAxOworICAgICAgICBwdltTTkRfREVMXS5pdmFsID0gMTsgYnJlYWs7CisjaWZkZWYgUElQRVNFTkQKKyAgICAgIGNhc2UgWFhDUkVDOiAgICAgICAgICAgICAgICAgICAgICAvKiBDUkVDRUlWRSAqLworICAgICAgICBjbWRzdHIgPSAiQ1JFQ0VJVkUiOworICAgICAgICBrb25seSA9IDE7CisgICAgICAgIHJjdmNtZCA9IDE7CisgICAgICAgIHB2W1NORF9DTURdLml2YWwgPSAxOyBicmVhazsKKyAgICAgIGNhc2UgWFhDR0VUOiAgICAgICAgICAgICAgICAgICAgICAvKiBDR0VUICovCisgICAgICAgIGNtZHN0ciA9ICJDR0VUIjsKKyAgICAgICAga29ubHkgPSAxOworICAgICAgICBwdltTTkRfQ01EXS5pdmFsID0gMTsgYnJlYWs7CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyNpZm5kZWYgTk9NR0VUCisgICAgICBjYXNlIFhYTUdFVDogICAgICAgICAgICAgICAgICAgICAgLyogTUdFVCAqLworICAgICAgICBjbWRzdHIgPSAiTUdFVCI7CisgICAgICAgIGtvbmx5ID0gMTsKKyAgICAgICAgbWdldCA9IDE7IGJyZWFrOworI2VuZGlmIC8qIE5PTUdFVCAqLworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ4Z2V0IHJjdmNtZCIsY21kc3RyLHJjdmNtZCk7CisgICAgZGVidWcoRjEwMSwieGdldCBrb25seSIsIiIsa29ubHkpOworCisjaWZkZWYgQ0tfWFlaCisgICAgaWYgKCFyY3ZjbWQgJiYgcHJvdG9jb2wgIT0gUFJPVE9fSykgeworICAgICAgICBwcmludGYoIj9Tb3JyeSwgJXMgd29ya3Mgb25seSB3aXRoIEtlcm1pdCBwcm90b2NvbFxuIixjbWRzdHIpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyNlbmRpZiAvKiBDS19YWVogKi8KKworICAgIC8qIFNldCB1cCBjaGFpbmVkIHBhcnNlIGZ1bmN0aW9ucy4uLiAqLworCisgICAgY21mZGJpKCZzdywgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgRkRCIC0gY29tbWFuZCBzd2l0Y2hlcyAqLworICAgICAgICAgICBfQ01LRVksICAgICAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgIHJjdmNtZCA/CisgICAgICAgICAgICJPcHRpb25hbCBuYW1lL3RlbXBsYXRlIHRvIHN0b3JlIGluY29taW5nIGZpbGVzIHVuZGVyLCBvciBzd2l0Y2giIDoKKyAgICAgICAgICAgIlJlbW90ZSBmaWxlbmFtZSwgb3Igc3dpdGNoIiwgLyogaGxwbXNnICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIHJjdmNtZCA/IG5yY3Z0YWIgOiBuZ2V0dGFiLCAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgcmN2Y21kID8gcmN2dGFiIDogZ2V0dGFiLCAgICAvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgICAgICZmbCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICApOworICAgIGlmIChyY3ZjbWQgfHwgbWdldCkgICAgICAgICAgICAgICAgIC8qIFJFQ0VJVkUgb3IgTUdFVCAqLworICAgICAgY21mZGJpKCZmbCwKKyAgICAgICAgICAgX0NNVFhULCAgICAgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICByY3ZjbWQgPyAgICAgICAgICAgICAgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAgICJPdXRwdXQgZmlsZW5hbWUgb3IgQ29tbWFuZCIgOiAvKiBPdXRwdXQgZmlsZW5hbWUgKi8KKyAgICAgICAgICAgICAiRmlsZShzKSB0byBHRVQiLCAgICAgICAgICAgICAgLyogRmlsZXMgd2UgYXJlIGFza2luZyBmb3IgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisjaWZkZWYgQ0tfWFlaCisgICAgICAgICAgIChwcm90b2NvbCA9PSBQUk9UT19YIHx8IHByb3RvY29sID09IFBST1RPX1hDKSA/CisgICAgICAgICAgICAgeHhzdHJpbmcgOgorICAgICAgICAgICAgIChyY3ZjbWQgPyAoeHhfc3RycCkwICA6IHh4c3RyaW5nKQorI2Vsc2UKKyAgICAgICAgICAgcmN2Y21kID8gKHh4X3N0cnApMCAgOiB4eHN0cmluZyAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisjZW5kaWYgLyogQ0tfWFlaICovCisgICAgICAgICAgICAgLAorICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAmY20KKyAgICAgICAgICAgKTsKKyAgICBlbHNlCisgICAgICBjbWZkYmkoJmZsLCAgICAgICAgICAgICAgICAgICAgICAgLyogUmVtb3RlIGZpbGVuYW1lIG9yIGNvbW1hbmQgKi8KKyAgICAgICAgICAgX0NNRkxELCAgICAgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAiUmVtb3RlIGZpbGVuYW1lIiwgICAgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsCisgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICZjbQorICAgICAgICAgICApOworICAgIGNtZmRiaSgmY20sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbmZpcm1hdGlvbiAqLworICAgICAgICAgICBfQ01DRk0sICAgICAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGxwbXNnICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworICAgICAgICAgICBOVUxMLAorICAgICAgICAgICBOVUxMLAorICAgICAgICAgICBOVUxMCisgICAgICAgICAgICk7CisKKyAgICAvKiAoU2VlIGRveHNlbmQoKSBmb3IgZnVsbGVyIGNvbW1lbnRhcnkpICovCisKKyAgICB3aGlsZSAoMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYXJzZSAwIG9yIG1vcmUgc3dpdGNoZXMgKi8KKyAgICAgICAgeCA9IGNtZmRiKCZzdyk7ICAgICAgICAgICAgICAgICAvKiBQYXJzZSBzb21ldGhpbmcgKi8KKyAgICAgICAgZGVidWcoRjEwMSwieGdldCBjbWZkYiIsIiIseCk7CisgICAgICAgIGlmICh4IDwgMCkgICAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICBnb3RvIHhnZXR4OyAgICAgICAgICAgICAgICAgICAvKiBvciByZXBhcnNlIG5lZWRlZCAqLworICAgICAgICBpZiAoY21yZXN1bHQuZmNvZGUgIT0gX0NNS0VZKSAgIC8qIEJyZWFrIG91dCBpZiBub3QgYSBzd2l0Y2ggKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgYyA9IGNtZ2JyaygpOyAgICAgICAgICAgICAgICAgICAvKiBHZXQgYnJlYWsgY2hhcmFjdGVyICovCisgICAgICAgIGlmICgoZ2V0dmFsID0gKGMgPT0gJzonIHx8IGMgPT0gJz0nKSkgJiYgIShjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIGRvZXMgbm90IHRha2UgYW4gYXJndW1lbnRcbiIpOworICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdldHZhbCAmJiAoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICB9CisgICAgICAgIG4gPSBjbXJlc3VsdC5ucmVzdWx0OyAgICAgICAgICAgLyogTnVtZXJpYyByZXN1bHQgPSBzd2l0Y2ggdmFsdWUgKi8KKyAgICAgICAgZGVidWcoRjEwMSwieGdldCBzd2l0Y2giLCIiLG4pOworCisgICAgICAgIHN3aXRjaCAobikgeyAgICAgICAgICAgICAgICAgICAgLyogUHJvY2VzcyB0aGUgc3dpdGNoICovCisjaWZkZWYgUElQRVNFTkQKKyAgICAgICAgICBjYXNlIFNORF9DTUQ6ICAgICAgICAgICAgICAgICAvKiBUaGVzZSB0YWtlIG5vIGFyZ3MgKi8KKyAgICAgICAgICAgIGlmIChub3B1c2gpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgc3lzdGVtIGNvbW1hbmQgYWNjZXNzIGlzIGRpc2FibGVkXG4iKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmN2ZmlsdGVyKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKAorIj9Tb3JyeSwgbm8gR0VUIC9DT01NQU5EIHdoZW4gUkVDRUlWRSBGSUxURVIgc2VsZWN0ZWRcbiIpOworICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJjdmNtZCkKKyAgICAgICAgICAgICAgc3cuaGxwbXNnID0gIkNvbW1hbmQsIG9yIHN3aXRjaCI7IC8qIENoYW5nZSBoZWxwIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgIC8qIEZhbGwgdGhydS4uLiAqLworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyAgICAgICAgICBjYXNlIFNORF9SRUM6ICAgICAgICAgICAgICAgICAvKiAvUkVDVVJTSVZFICovCisgICAgICAgICAgICBwdltTTkRfUFRIXS5pdmFsID0gUEFUSF9SRUw7IC8qIEltcGxpZXMgcmVsYXRpdmUgcGF0aG5hbWVzICovCisgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsgICAgICAgICAgICAgLyogU2V0IHRoZSByZWN1cnNpdmUgZmxhZyAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFNORF9SRVM6ICAgICAgICAgICAgICAgICAvKiAvUkVDT1ZFUiAqLworICAgICAgICAgICAgcHZbU05EX0JJTl0uaXZhbCA9IDE7ICAgICAgIC8qIEltcGxpZXMgL0JJTkFSWSAqLworICAgICAgICAgICAgcHZbbl0uaXZhbCA9IDE7ICAgICAgICAgICAgIC8qIFNldCB0aGUgcmVzZW5kIGZsYWcgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfREVMOiAgICAgICAgICAgICAgICAgLyogL0RFTEVURSAqLworICAgICAgICAgIGNhc2UgU05EX1NISDogICAgICAgICAgICAgICAgIC8qIC9RVUlFVCAqLworICAgICAgICAgIGNhc2UgU05EX0NBTDogICAgICAgICAgICAgICAgIC8qIC9DQUxJQlJBVEUgKi8KKyAgICAgICAgICBjYXNlIFNORF9YUEE6ICAgICAgICAgICAgICAgICAvKiAvVFJBTlNQQVJFTlQgKi8KKyAgICAgICAgICAgIHB2W25dLml2YWwgPSAxOyAgICAgICAgICAgICAvKiBKdXN0IHNldCB0aGUgYXBwcm9wcmlhdGUgZmxhZyAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFNORF9QSVA6ICAgICAgICAgICAgICAgICAvKiAvUElQRVM6e09OLE9GRn0gKi8KKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSB7CisgICAgICAgICAgICAgICAgcHZbbl0uaXZhbCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHggPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICBpZiAoIW5vcHVzaCkKKyAgICAgICAgICAgICAgcHZbbl0uaXZhbCA9IHg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIC8qIEZpbGUgdHJhbnNmZXIgbW9kZXMgLSBlYWNoIHVuZG9lcyB0aGUgb3RoZXJzICovCisKKyAgICAgICAgICBjYXNlIFNORF9CSU46ICAgICAgICAgICAgICAgICAvKiBCaW5hcnkgKi8KKyAgICAgICAgICBjYXNlIFNORF9UWFQ6ICAgICAgICAgICAgICAgICAvKiBUZXh0ICovCisgICAgICAgICAgY2FzZSBTTkRfSU1HOiAgICAgICAgICAgICAgICAgLyogSW1hZ2UgKi8KKyAgICAgICAgICBjYXNlIFNORF9MQkw6ICAgICAgICAgICAgICAgICAvKiBMYWJlbGVkICovCisgICAgICAgICAgICBwdltTTkRfQklOXS5pdmFsID0gMDsgICAgICAgLyogVW5zZXQgYWxsICovCisgICAgICAgICAgICBwdltTTkRfVFhUXS5pdmFsID0gMDsKKyAgICAgICAgICAgIHB2W1NORF9JTUddLml2YWwgPSAwOworICAgICAgICAgICAgcHZbU05EX0xCTF0uaXZhbCA9IDA7CisgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsgICAgICAgICAgICAgLyogU2V0IHRoZSByZXF1ZXN0ZWQgb25lICovCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgU05EX0VYQzogICAgICAgICAgICAgICAgIC8qIEV4Y2x1ZGVzICovCisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiUGF0dGVybiIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9QYXR0ZXJuIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB2W25dLnN2YWwpIGZyZWUocHZbbl0uc3ZhbCk7CisgICAgICAgICAgICB5ID0gc3RybGVuKHMpOworICAgICAgICAgICAgaWYgKHkgPiAyNTYpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9QYXR0ZXJuIHRvbyBsb25nIC0gMjU2IG1heFxuIik7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdltuXS5zdmFsID0gbWFsbG9jKHkrMSk7CisgICAgICAgICAgICBpZiAocHZbbl0uc3ZhbCkgeworICAgICAgICAgICAgICAgIHN0cmNweShwdltuXS5zdmFsLHMpOyAgIC8qIHNhZmUgKi8KKyAgICAgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZCAqLworICAgICAgICAgIGNhc2UgU05EX1BSSTogICAgICAgICAgICAgICAgIC8qIEdFVCB0byBwcmludGVyICovCisgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsKKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKCJQcmludCBvcHRpb25zIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgICAgIHB2W25dLnN2YWwgPSBtYWxsb2MoKGludClzdHJsZW4ocykrMSk7CisgICAgICAgICAgICBpZiAocHZbbl0uc3ZhbCkKKyAgICAgICAgICAgICAgc3RyY3B5KHB2W25dLnN2YWwscyk7ICAgICAvKiBzYWZlICovCisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAgICAgICBjYXNlIFNORF9NT1Y6ICAgICAgICAgICAgICAgICAvKiBNT1ZFIGFmdGVyICovCisgICAgICAgICAgY2FzZSBTTkRfUkVOOiAgICAgICAgICAgICAgICAgLyogUkVOQU1FIGFmdGVyICovCisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWZsZChuID09IFNORF9NT1YgPworICAgICAgICAgICAiZGV2aWNlIGFuZC9vciBkaXJlY3RvcnkgZm9yIHNvdXJjZSBmaWxlIGFmdGVyIHNlbmRpbmciIDoKKyAgICAgICAgICAgIm5ldyBuYW1lIGZvciBzb3VyY2UgZmlsZSBhZnRlciBzZW5kaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuID09IFNORF9NT1YgPyB4eHN0cmluZyA6IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICkpIDwgMCkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIG4gPT0gU05EX01PViA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiP0Rlc3RpbmF0aW9uIHJlcXVpcmVkIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiP05ldyBuYW1lIHJlcXVpcmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB2W25dLnN2YWwpIHsKKyAgICAgICAgICAgICAgICBmcmVlKHB2W25dLnN2YWwpOworICAgICAgICAgICAgICAgIHB2W25dLnN2YWwgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA9IGJyc3RyaXAocyk7CisgICAgICAgICAgICB5ID0gc3RybGVuKHMpOworICAgICAgICAgICAgaWYgKHkgPiAwKSB7CisgICAgICAgICAgICAgICAgcHZbbl0uc3ZhbCA9IG1hbGxvYyh5KzEpOworICAgICAgICAgICAgICAgIGlmIChwdltuXS5zdmFsKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShwdltuXS5zdmFsLHMpOyAvKiBzYWZlICovCisgICAgICAgICAgICAgICAgICAgIHB2W25dLml2YWwgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfQVNOOiAgICAgICAgICAgICAgICAgLyogQXMtbmFtZSAqLworICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgaWYgKG1nZXQpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgYXMtbmFtZSBub3QgYWxsb3dlZCB3aXRoIE1HRVRcbiIpOworICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh4ID0gY21mbGQoIk5hbWUgdG8gc3RvcmUgaXQgdW5kZXIiLCIiLCZzLE5VTEwpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICBzID0gYnJzdHJpcChzKTsKKyAgICAgICAgICAgIGlmICgoeSA9IHN0cmxlbihzKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHB2W25dLnN2YWwpIGZyZWUocHZbbl0uc3ZhbCk7CisgICAgICAgICAgICAgICAgcHZbbl0uc3ZhbCA9IG1hbGxvYyh5KzEpOworICAgICAgICAgICAgICAgIGlmIChwdltuXS5zdmFsKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShwdltuXS5zdmFsLHMpOyAvKiBzYWZlICovCisgICAgICAgICAgICAgICAgICAgIHB2W25dLml2YWwgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgUElQRVNFTkQKKyAgICAgICAgICBjYXNlIFNORF9GTFQ6ICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInhnZXQgL2ZpbHRlciBnZXR2YWwiLCIiLGdldHZhbCk7CisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiRmlsdGVyIHByb2dyYW0gdG8gcmVjZWl2ZSB0aHJvdWdoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCZzLE5VTEwpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykKKyAgICAgICAgICAgICAgICAgIHMgPSAiIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpzKSBzID0gYnJzdHJpcChzKTsKKyAgICAgICAgICAgIHkgPSBzdHJsZW4ocyk7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgeTsgeCsrKSB7ICAgLyogTWFrZSBzdXJlIHRoZXkgaW5jbHVkZWQgIlx2KC4uLikiICovCisgICAgICAgICAgICAgICAgaWYgKHNbeF0gIT0gJ1xcJykgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHNbeCsxXSA9PSAndicpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHggPT0geSkgeworICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICAgICAiP0ZpbHRlciBtdXN0IGNvbnRhaW4gYSByZXBsYWNlbWVudCB2YXJpYWJsZSBmb3IgZmlsZW5hbWUuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdltuXS5pdmFsID0gMTsKKyAgICAgICAgICAgIGlmIChwdltuXS5zdmFsKSB7CisgICAgICAgICAgICAgICAgZnJlZShwdltuXS5zdmFsKTsKKyAgICAgICAgICAgICAgICBwdltuXS5zdmFsID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoeSA9IHN0cmxlbihzKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKChwdltuXS5zdmFsID0gbWFsbG9jKHkrMSkpKQorICAgICAgICAgICAgICAgICAgc3RyY3B5KHB2W25dLnN2YWwscyk7IC8qIHNhZmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyAgICAgICAgICBjYXNlIFNORF9QVEg6ICAgICAgICAgICAgICAgICAvKiBQYXRobmFtZXMgKi8KKyAgICAgICAgICAgIGlmICghZ2V0dmFsKSB7CisgICAgICAgICAgICAgICAgcHZbbl0uaXZhbCA9IFBBVEhfUkVMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkocnBhdGh0YWIsbnJwYXRodGFiLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICBwdltuXS5pdmFsID0geDsgICAgICAgICAgICAgLyogRGl0dG8gKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfTkFNOiAgICAgICAgICAgICAgICAgLyogRmlsZW5hbWVzICovCisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWtleShmbnRhYixuZm50YWIsIiIsImNvbnZlcnRlZCIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICBwdltuXS5pdmFsID0geDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBTTkRfUFJPOiAgICAgICAgICAgICAgICAgLyogUHJvdG9jb2wgdG8gdXNlICovCisgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKHggPSBjbWtleShwcm90b3MsbnByb3RvcywiRmlsZS10cmFuc2ZlciBwcm90b2NvbCIsIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IC0zKQorICAgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKEYxMTEsInhnZXQgL3Byb3RvIixhdG1idWYseCk7CisgICAgICAgICAgICBwdltuXS5pdmFsID0geDsKKyAgICAgICAgICAgIGlmIChrb25seSAmJiB4ICE9IFBST1RPX0spIHsKKyAgICAgICAgICAgICAgICBwcmludGYoCisiP1NvcnJ5LCB0aGlzIGNvbW1hbmQgd29ya3Mgb25seSB3aXRoIEtlcm1pdCBwcm90b2NvbFxuIgorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCI/VW5leHBlY3RlZCBzd2l0Y2ggdmFsdWUgLSAlZFxuIixjbXJlc3VsdC5ucmVzdWx0KTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVidWcoRjEwMSwieGdldCBjbXJlc3VsdCBmY29kZSIsIiIsY21yZXN1bHQuZmNvZGUpOworCisgICAgY21hcmcgPSBsaW5lOyAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBzdHJpbmcgcG9pbnRlcnMgKi8KKyAgICBjbWFyZzIgPSB0bXBidWY7CisgICAgYXNuYW1lID0gMDsKKyAgICBsaW5lWzBdID0gTlVMOyAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgYnVmZmVycy4gKi8KKyAgICB0bXBidWZbMF0gPSBOVUw7CisKKyAgICBzd2l0Y2ggKGNtcmVzdWx0LmZjb2RlKSB7ICAgICAgICAgICAvKiBIb3cgZGlkIHdlIGdldCBvdXQgb2Ygc3dpdGNoIGxvb3AgKi8KKyAgICAgIGNhc2UgX0NNRkxEOiAgICAgICAgICAgICAgICAgICAgICAvKiAoMykgUmVtb3RlIGZpbGVzcGVjICovCisgICAgICAgIGNrc3RybmNweShsaW5lLGNtcmVzdWx0LnNyZXN1bHQsTElOQlVGU0laKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIF9DTVRYVDogICAgICAgICAgICAgICAgICAgICAgLyogKDQpIEFzLW5hbWUgKi8KKyAgICAgICAgaWYgKHJjdmNtZCkgeworICAgICAgICAgICAgY2tzdHJuY3B5KHRtcGJ1ZixjbXJlc3VsdC5zcmVzdWx0LFRNUEJVRlNJWik7CisgICAgICAgICAgICBpZiAoKGludClzdHJsZW4odG1wYnVmKSA+IDApCisgICAgICAgICAgICAgIGFzbmFtZSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBja3N0cm5jcHkobGluZSxjbXJlc3VsdC5zcmVzdWx0LExJTkJVRlNJWik7CisgICAgICAgIH0KKyAgICAgIGNhc2UgX0NNQ0ZNOiAgICAgICAgICAgICAgICAgICAgICAvKiAoNikgQ29uZmlybWF0aW9uICovCisgICAgICAgIGNvbmZpcm1lZCA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCI/VW5leHBlY3RlZCBmdW5jdGlvbiBjb2RlOiAlZFxuIixjbXJlc3VsdC5mY29kZSk7CisgICAgICAgIHggPSAtOTsKKyAgICAgICAgZ290byB4Z2V0eDsKKyAgICB9CisgICAgZGVidWcoRjExMCwieGdldCBzdHJpbmciLGNtYXJnLDApOworICAgIGRlYnVnKEYxMDEsInhnZXQgY29uZmlybWVkIiwiIixjb25maXJtZWQpOworCisgICAgY21hcmcgPSBicnN0cmlwKGNtYXJnKTsgICAgICAgICAgICAgLyogU3RyaXAgYW55IGJyYWNlcyAqLworCisgICAgaWYgKCFjb25maXJtZWQpIHsgICAgICAgICAgICAgICAgICAgLyogQ1Igbm90IHR5cGVkIHlldCwgZ2V0IG1vcmUgZmllbGRzICovCisgICAgICAgIGlmIChwdltTTkRfQ01EXS5pdmFsID4gMCkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwieGdldCBjYWxsaW5nIGNtdHh0IiwiIiwwKTsKKyAgICAgICAgICAgIHggPSBjbXR4dCgiTG9jYWwgY29tbWFuZCB0byBwaXBlIGludG8iLCIiLCZzLE5VTEwpOworICAgICAgICAgICAgaWYgKHggPCAwICYmIHggIT0gLTMpIGdvdG8geGdldHg7CisgICAgICAgICAgICBpZiAoeCAhPSAtMykgeworICAgICAgICAgICAgICAgIGNrc3RybmNweSh0bXBidWYscyxUTVBCVUZTSVopOworICAgICAgICAgICAgICAgIGFzbmFtZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXJjdmNtZCkgeworI2lmZGVmIFZNUworICAgICAgICAgICAgLyogY21vZmkoKSBmYWlscyBpZiB5b3UgZ2l2ZSBpdCBhIGRpcmVjdG9yeSBuYW1lICovCisgICAgICAgICAgICB4ID0gY21mbGQoIk5hbWUgb3IgZGlyZWN0b3J5IGZvciBpbmNvbWluZyBmaWxlIiwiIiwmcyxOVUxMKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsInhnZXQgY21mbGQiLHMseCk7CisjZWxzZQorICAgICAgICAgICAgeCA9IGNtb2ZpKCJOYW1lIG9yIGRpcmVjdG9yeSBmb3IgaW5jb21pbmcgZmlsZSIsIiIsJnMsTlVMTCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJ4Z2V0IGNtb2ZpIixzLHgpOworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICAgICAgaWYgKHggPCAwICYmIHggIT0gLTMpIGdvdG8geGdldHg7CisgICAgICAgICAgICBpZiAoeCAhPSAtMykgeworICAgICAgICAgICAgICAgIGNrc3RybmNweSh0bXBidWYscyxUTVBCVUZTSVopOworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgZ290byB4Z2V0eDsKKyAgICAgICAgICAgICAgICBhc25hbWUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIEFycml2ZSBoZXJlIHdpdGggY21hcmcgYW5kIGNtYXJnMiBhbGwgc2V0ICovCisKKyAgICBkZWJ1ZyhGMTExLCJ4Z2V0IGFzbmFtZSIsY21hcmcyLGFzbmFtZSk7CisgICAgaWYgKCFhc25hbWUpIHsKKyAgICAgICAgaWYgKHB2W1NORF9BU05dLnN2YWwpCisgICAgICAgICAgY2tzdHJuY3B5KHRtcGJ1ZixwdltTTkRfQVNOXS5zdmFsLFRNUEJVRlNJWik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB0bXBidWZbMF0gPSBOVUw7CisgICAgfQorICAgIGNtYXJnMiA9IGJyc3RyaXAoY21hcmcyKTsgICAgICAgICAgIC8qIFN0cmlwIG91dGVyIGJyYWNlcyBpZiBhbnkuICovCisgICAgZGVidWcoRjExMCwieGdldCBjbWFyZyIsY21hcmcsMCk7CisgICAgZGVidWcoRjExMCwieGdldCBjbWFyZzIiLGNtYXJnMiwwKTsKKworICAgIGlmICghKmNtYXJnICYmCisgICAgICAgIChjeCA9PSBYWEdFVCB8fCBjeCA9PSBYWFJFR0VUIHx8IGN4ID09IFhYQ0dFVCB8fCBjeCA9PSBYWE1HRVQpKSB7CisgICAgICAgIHByaW50ZigiP0EgcmVtb3RlIGZpbGUgc3BlY2lmaWNhdGlvbiBpcyByZXF1aXJlZFxuIik7CisgICAgICAgIHggPSAtOTsKKyAgICAgICAgZ290byB4Z2V0eDsKKyAgICB9CisjaWZkZWYgUElQRVNFTkQKKyAgICBpZiAocHZbU05EX0NNRF0uaXZhbCA+IDApIHsgICAgICAgICAvKiAvQ09NTUFORCBzZXRzIHBpcGVzZW5kIGZsYWcgKi8KKyAgICAgICAgeCA9IC05OworICAgICAgICBpZiAoISpjbWFyZzIpIHsKKyAgICAgICAgICAgIHByaW50ZigiP0NvbW1hbmQgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgfSBlbHNlIGlmIChub3B1c2gpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBzeXN0ZW0gY29tbWFuZCBhY2Nlc3MgaXMgZGlzYWJsZWRcbiIpOworICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgfSBlbHNlIGlmIChyY3ZmaWx0ZXIpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBubyBHRVQgL0NPTU1BTkQgd2hpbGUgUkVDRUlWRSBGSUxURVIgc2VsZWN0ZWRcbiIpOworICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcGlwZXNlbmQgPSAxOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJ4Z2V0IC9DT01NQU5EIHBpcGVzZW5kIiwiIixwaXBlc2VuZCk7CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKworI2lmZGVmIENLX1JFU0VORAorICAgIGlmIChwdltTTkRfUkVTXS5pdmFsID4gMCkgeyAgICAgICAgIC8qIFJFR0VUIG9yIEdFVCAvUkVDT1ZFUiAqLworI2lmZGVmIFJFQ1VSU0lWRQorICAgICAgICBpZiAocHZbU05EX1JFQ10uaXZhbCA+IDApIHsgICAgIC8qIFJFQ1VSU0lWRSAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIHByaW50ZigiP1Vuc3VwcG9ydGVkIG9wdGlvbiBjb21iaW5hdGlvbjogL1JFQ09WRVIgL1JFQ1VSU0lWRVxuIik7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhnZXR4OworI2Vsc2UKKyAgICAgICAgICAgIG9wa3QgPSAxOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworICAgICAgICBpZiAocHZbU05EX0RFTF0uaXZhbCA+IDApIHsgICAgIC8qIC9ERUxFVEUgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICBwcmludGYoIj9VbnN1cHBvcnRlZCBvcHRpb24gY29tYmluYXRpb246IC9SRUNPVkVSIC9ERUxFVEVcbiIpOworICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgZ290byB4Z2V0eDsKKyNlbHNlCisgICAgICAgICAgICBvcGt0ID0gMTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisKKyAgICBpZiAocHZbU05EX0VYQ10uaXZhbCA+IDApICAgICAgICAgICAvKiAvRVhDRVBUICovCisgICAgICBtYWtlbGlzdChwdltTTkRfRVhDXS5zdmFsLHJjdmV4Y2VwdCxOU05ERVhDRVBUKTsKKworI2lmZGVmIElLU19PUFRJT04KKyAgICBpZiAoIXJjdmNtZAorI2lmZGVmIENLX1hZWgorICAgICAgICAgJiYgcHJvdG9jb2wgPT0gUFJPVE9fSworI2VuZGlmIC8qIENLX1hZWiAqLworICAgICAgICAgKSB7CisgICAgICAgIGlmICghaWtzX3dhaXQoS0VSTUlUX1JFUV9TVEFSVCwxKSkgeworICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAiP0EgS2VybWl0IFNlcnZlciBpcyBub3QgYXZhaWxhYmxlIHRvIHByb2Nlc3MgdGhpcyBjb21tYW5kXG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsgICAgICAgICAgICAgICAgICAgICAvKiBjb3JyZWN0IHRoZSByZXR1cm4gY29kZSAqLworICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisKKyNpZmRlZiBDS19YWVoKKyAgICB7CisgICAgICAgIGludCBwbywgcGc7ICAgICAgICAgICAgICAgICAgICAgLyogKGZvciBjbGFyaXR5KSAqLworICAgICAgICBwbyA9IHB2W1NORF9QUk9dLml2YWw7ICAgICAgICAgIC8qIC9QUk9UT0NPTCBvcHRpb24gKi8KKyAgICAgICAgcGcgPSBwcm90b2NvbDsgICAgICAgICAgICAgICAgICAvKiBQcm90b2NvbCBnbG9iYWwgICovCisgICAgICAgIGlmICgocmN2Y21kICYmICEqY21hcmcyKSAmJiAgICAgLyogSWYgbm8gYXMtbmFtZSB3YXMgZ2l2ZW4gKi8KKyAgICAgICAgICAgIC8qIGFuZCAvUFJPVE9DT0wgaXMgWE1PREVNIG9yIGdsb2JhbCBwcm90b2NvbCBpcyBYTU9ERU0uLi4gKi8KKyAgICAgICAgICAgICgocG8gPCAgMCAmJiAocGcgPT0gUFJPVE9fWCB8fCBwZyA9PSBQUk9UT19YQykpIHx8CisgICAgICAgICAgICAgKHBvID4gLTEgJiYgKHBvID09IFBST1RPX1ggfHwgcG8gPT0gUFJPVE9fWEMpKSkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgcHJpbnRmKAorIlNvcnJ5LCB5b3UgbXVzdCBzcGVjaWZ5IGEgbmFtZSB3aGVuIHJlY2VpdmluZyBhIGZpbGUgd2l0aCBYTU9ERU0gcHJvdG9jb2xcbiIKKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBDS19YWVogKi8KKworI2lmZGVmIFJFQ1VSU0lWRQorICAgIGlmIChwdltTTkRfUkVDXS5pdmFsID4gMCkgeyAgICAgICAgIC8qIFJFQ1VSU0lWRSAqLworICAgICAgICByZWN1cnNpdmUgPSAxOworICAgICAgICBwdltTTkRfUFRIXS5pdmFsID0gUEFUSF9SRUw7ICAgIC8qIEltcGxpZXMgcmVsYXRpdmUgcGF0aG5hbWVzIHRvbyAqLworICAgIH0KKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKworICAgIGlmIChwdltTTkRfUElQXS5pdmFsID4gLTEpIHsKKyAgICAgICAgZ191c2VwaXBlcyA9IHVzZXBpcGVzOworICAgICAgICB1c2VwaXBlcyA9IHB2W1NORF9QSVBdLml2YWw7CisgICAgfQorCisgICAgLyogU2F2ZSBnbG9iYWwgcHJvdG9jb2wgcGFyYW1ldGVycyAqLworCisgICAgZ19wcm90byA9IHByb3RvY29sOworI2lmZGVmIENLX0xBQkVMRUQKKyAgICBnX2xmX29wdHMgPSBsZl9vcHRzOyAgICAgICAgICAgICAgICAvKiBTYXZlIGxhYmVsZWQgdHJhbnNmZXIgb3B0aW9ucyAqLworI2VuZGlmIC8qIENLX0xBQkVMRUQgKi8KKyAgICBnX3VycHNpeiA9IHVycHNpejsgICAgICAgICAgICAgICAgICAvKiBSZWNlaXZlIHBhY2tldCBsZW5ndGggKi8KKyAgICBnX3Nwc2l6ZiA9IHNwc2l6ZjsgICAgICAgICAgICAgICAgICAvKiBTZW5kIHBhY2tldCBsZW5ndGggZmxhZyAqLworICAgIGdfc3BzaXogPSBzcHNpejsgICAgICAgICAgICAgICAgICAgIC8qIFNlbmQgcGFja2V0IGxlbmd0aCAqLworICAgIGdfc3BzaXpyID0gc3BzaXpyOyAgICAgICAgICAgICAgICAgIC8qIGV0YyBldGMgKi8KKyAgICBnX3NwbWF4ID0gc3BtYXg7CisgICAgZ193c2xvdHIgPSB3c2xvdHI7CisgICAgZ19wcmVmaXhpbmcgPSBwcmVmaXhpbmc7CisgICAgZ19mbmNhY3QgPSBmbmNhY3Q7CisgICAgZ19mbmNudiA9IGZuY252OworICAgIGdfZm5zcGF0aCA9IGZuc3BhdGg7CisgICAgZ19mbnJwYXRoID0gZm5ycGF0aDsKKyAgICBnX3hmcnhsYSA9IHhmcnhsYTsKKworICAgIGlmIChwdltTTkRfUFJPXS5pdmFsID4gLTEpIHsgICAgICAgIC8qIENoYW5nZSBhY2NvcmRpbmcgdG8gc3dpdGNoICovCisgICAgICAgIHByb3RvY29sID0gcHZbU05EX1BST10uaXZhbDsKKyAgICAgICAgaWYgKHB0YWJbcHJvdG9jb2xdLnJwa3RsZW4gPiAtMSkgICAvKiBjb3BpZWQgZnJvbSBpbml0cHJvdG8oKSAqLworICAgICAgICAgICAgdXJwc2l6ID0gcHRhYltwcm90b2NvbF0ucnBrdGxlbjsKKyAgICAgICAgaWYgKHB0YWJbcHJvdG9jb2xdLnNwa3RmbGcgPiAtMSkKKyAgICAgICAgICAgIHNwc2l6ZiA9IHB0YWJbcHJvdG9jb2xdLnNwa3RmbGc7CisgICAgICAgIGlmIChwdGFiW3Byb3RvY29sXS5zcGt0bGVuID4gLTEpIHsKKyAgICAgICAgICAgIHNwc2l6ID0gcHRhYltwcm90b2NvbF0uc3BrdGxlbjsKKyAgICAgICAgICAgIGlmIChzcHNpemYpCisgICAgICAgICAgICAgICAgc3BzaXpyID0gc3BtYXggPSBzcHNpejsKKyAgICAgICAgfQorICAgICAgICBpZiAocHRhYltwcm90b2NvbF0ud2luc2l6ZSA+IC0xKQorICAgICAgICAgICAgd3Nsb3RyID0gcHRhYltwcm90b2NvbF0ud2luc2l6ZTsKKyAgICAgICAgaWYgKHB0YWJbcHJvdG9jb2xdLnByZWZpeCA+IC0xKQorICAgICAgICAgICAgcHJlZml4aW5nID0gcHRhYltwcm90b2NvbF0ucHJlZml4OworICAgICAgICBpZiAocHRhYltwcm90b2NvbF0uZm5jYSA+IC0xKQorICAgICAgICAgICAgZm5jYWN0ICA9IHB0YWJbcHJvdG9jb2xdLmZuY2E7CisgICAgICAgIGlmIChwdGFiW3Byb3RvY29sXS5mbmNuID4gLTEpCisgICAgICAgICAgICBmbmNudiAgID0gcHRhYltwcm90b2NvbF0uZm5jbjsKKyAgICAgICAgaWYgKHB0YWJbcHJvdG9jb2xdLmZuc3AgPiAtMSkKKyAgICAgICAgICAgIGZuc3BhdGggPSBwdGFiW3Byb3RvY29sXS5mbnNwOworICAgICAgICBpZiAocHRhYltwcm90b2NvbF0uZm5ycCA+IC0xKQorICAgICAgICAgICAgZm5ycGF0aCA9IHB0YWJbcHJvdG9jb2xdLmZucnA7CisgICAgfQorICAgIGRlYnVnKEYxMDEsInhnZXQgcHJvdG9jb2wiLCIiLHByb3RvY29sKTsKKyAgICBkZWJ1ZyhGMTExLCJ4Z2V0IGNtYXJnMiIsY21hcmcyLHhmZXJtb2RlKTsKKworICAgIGdfeGZlcm1vZGUgPSB4ZmVybW9kZTsKKyAgICBnX2JpbmFyeSA9IGJpbmFyeTsKKyAgICBpZiAocHZbU05EX0JJTl0uaXZhbCA+IDApIHsgICAgICAgICAvKiBDaGFuZ2UgYWNjb3JkaW5nIHRvIHN3aXRjaCAqLworICAgICAgICB4ZmVybW9kZSA9IFhNT0RFX007CisgICAgICAgIGJpbmFyeSA9IFhZRlRfQjsgICAgICAgICAgICAgICAgLyogRklMRSBUWVBFIEJJTkFSWSAqLworICAgICAgICBvbW9kZSA9IEdNT0RfQklOOyAgICAgICAgICAgICAgIC8qIE8tUGFja2V0IG1vZGUgKi8KKyAgICAgICAgZGVidWcoRjEwMSwiZG94Z2V0IC9CSU5BUlkgeGZlcm1vZGUiLCIiLHhmZXJtb2RlKTsKKyAgICB9IGVsc2UgaWYgKHB2W1NORF9UWFRdLml2YWwgPiAwKSB7ICAvKiBEaXR0byBmb3IgL1RFWFQgKi8KKyAgICAgICAgeGZlcm1vZGUgPSBYTU9ERV9NOworICAgICAgICBiaW5hcnkgPSBYWUZUX1Q7CisgICAgICAgIG9tb2RlID0gR01PRF9UWFQ7CisgICAgICAgIGRlYnVnKEYxMDEsImRveGdldCAvVEVYVCB4ZmVybW9kZSIsIiIseGZlcm1vZGUpOworICAgIH0gZWxzZSBpZiAocHZbU05EX0lNR10uaXZhbCA+IDApIHsKKyAgICAgICAgeGZlcm1vZGUgPSBYTU9ERV9NOworI2lmZGVmIFZNUworICAgICAgICBiaW5hcnkgPSBYWUZUX0k7CisjZWxzZQorICAgICAgICBiaW5hcnkgPSBYWUZUX0I7CisjZW5kaWYgLyogVk1TICovCisgICAgICAgIG9tb2RlID0gR01PRF9UWFQ7CisgICAgICAgIGRlYnVnKEYxMDEsImRveGdldCAvSU1BR0UgeGZlcm1vZGUiLCIiLHhmZXJtb2RlKTsKKyAgICB9CisjaWZkZWYgQ0tfTEFCRUxFRAorICAgIGVsc2UgaWYgKHB2W1NORF9MQkxdLml2YWwgPiAwKSB7CisgICAgICAgIHhmZXJtb2RlID0gWE1PREVfTTsKKyAgICAgICAgYmluYXJ5ID0gWFlGVF9MOworICAgICAgICBvbW9kZSA9IEdNT0RfTEJMOworICAgICAgICBkZWJ1ZyhGMTAxLCJkb3hnZXQgL0xBQkVMRUQgeGZlcm1vZGUiLCIiLHhmZXJtb2RlKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworICAgIGRlYnVnKEYxMDEsInhnZXQgYmluYXJ5IiwiIixiaW5hcnkpOworICAgIGRlYnVnKEYxMDEsInhnZXQgb21vZGUiLCIiLG9tb2RlKTsKKworICAgIGlmIChwdltTTkRfWFBBXS5pdmFsID4gMCkgICAgICAgICAgIC8qIC9UUkFOU1BBUkVOVCAqLworICAgICAgeGZyeGxhID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IHRyYW5zbGF0ZSBjaGFyYWN0ZXIgc2V0cyAqLworCisjaWZkZWYgUElQRVNFTkQKKyAgICBpZiAocHZbU05EX0ZMVF0uaXZhbCA+IDApCisgICAgICBtYWtlc3RyKCZyY3ZmaWx0ZXIscHZbU05EX0ZMVF0uc3ZhbCk7CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKworI2lmZGVmIENLX1RNUERJUgorICAgIGlmIChwdltTTkRfTU9WXS5pdmFsID4gMCkgeworICAgICAgICBpbnQgbGVuOworICAgICAgICBjaGFyICogcCA9IHB2W1NORF9NT1ZdLnN2YWw7CisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgICAgaWYgKGlzZ3Vlc3QpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCAvTU9WRS1UTyBub3QgYXZhaWxhYmxlIHRvIGd1ZXN0c1xuIik7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICB9CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICAgICAgbGVuID0gc3RybGVuKHApOworICAgICAgICBpZiAoIWlzZGlyKHApKSB7ICAgICAgICAgICAgICAgIC8qIENoZWNrIGRpcmVjdG9yeSAqLworI2lmZGVmIENLX01LRElSCisgICAgICAgICAgICBjaGFyICogcyA9IE5VTEw7CisgICAgICAgICAgICBzID0gKGNoYXIgKiltYWxsb2MobGVuICsgNCk7CisgICAgICAgICAgICBpZiAocykgeworICAgICAgICAgICAgICAgIHN0cmNweShzLHApOyAgICAgICAgICAgIC8qIHNhZmUgKi8KKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgICAgICAgICAgICAgIGlmIChzW2xlbi0xXSAhPSAnOicpIHsgc1tsZW4rK10gPSAnOic7IHNbbGVuXSA9IE5VTDsgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICBpZiAoc1tsZW4tMV0gIT0gJy8nKSB7IHNbbGVuKytdID0gJy8nOyBzW2xlbl0gPSBOVUw7IH0KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworICAgICAgICAgICAgICAgIHNbbGVuKytdID0gJ1gnOworICAgICAgICAgICAgICAgIHNbbGVuXSA9IE5VTDsKKyAgICAgICAgICAgICAgICB4ID0gem1rZGlyKHMpOworICAgICAgICAgICAgICAgIGZyZWUocyk7CisgICAgICAgICAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0Nhbid0IGNyZWF0ZSBcIiVzXCJcbiIscCk7CisgICAgICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgcHJpbnRmKCI/RGlyZWN0b3J5IFwiJXNcIiBub3QgZm91bmRcbiIscCk7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhnZXR4OworI2VuZGlmIC8qIENLX01LRElSICovCisgICAgICAgIH0KKyAgICAgICAgemZucWZwKHAsTElOQlVGU0laLGxpbmUpOworICAgICAgICBtYWtlc3RyKCZyY3ZfbW92ZSxsaW5lKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfVE1QRElSICovCisKKyAgICBpZiAocHZbU05EX1JFTl0uaXZhbCA+IDApIHsgICAgICAgICAvKiAvUkVOQU1FLVRPOm5hbWUgKi8KKyAgICAgICAgY2hhciAqIHAgPSBwdltTTkRfUkVOXS5zdmFsOworI2lmZGVmIENLX0xPR0lOCisgICAgICAgIGlmIChpc2d1ZXN0KSB7CisgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgL1JFTkFNRS1UTyBub3QgYXZhaWxhYmxlIHRvIGd1ZXN0c1xuIik7CisgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICBnb3RvIHhnZXR4OworICAgICAgICB9CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICAgICAgaWYgKCFwKSBwID0gIiI7CisgICAgICAgIGlmICghKnApIHsKKyAgICAgICAgICAgIHByaW50ZigiP05ldyBuYW1lIHJlcXVpcmVkIGZvciAvUkVOQU1FXG4iKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgIH0KKyAgICAgICAgcCA9IGJyc3RyaXAocCk7CisgICAgICAgIG1ha2VzdHIoJnJjdl9yZW5hbWUscCk7CisgICAgICAgIGRlYnVnKEYxMTAsInhnZXQgcmN2X3JlbmFtZSIsIiIsMCk7CisgICAgfQorCisjaWZkZWYgQ0FMSUJSQVRFCisgICAgaWYgKHB2W1NORF9DQUxdLml2YWwgPiAwKQorICAgICAgY2FsaWJyYXRlID0gMUw7CisjZW5kaWYgLyogQ0FMSUJSQVRFICovCisgICAgZ19kaXNwbGEgPSBmZGlzcGxhOworICAgIGlmIChwdltTTkRfU0hIXS5pdmFsID4gMCkKKyAgICAgIGZkaXNwbGEgPSAwOworICAgIGRlYnVnKEYxMDEsInhnZXQgZGlzcGxheSIsIiIsZmRpc3BsYSk7CisKKyAgICBpZiAocHZbU05EX05BTV0uaXZhbCA+IC0xKSB7ICAgICAgICAvKiAvRklMRU5BTUVTICovCisgICAgICAgIGdfZm5jbnYgPSBmbmNudjsgICAgICAgICAgICAgICAgLyogU2F2ZSBnbG9iYWwgdmFsdWUgKi8KKyAgICAgICAgZm5jbnYgPSBwdltTTkRfTkFNXS5pdmFsOworICAgICAgICBkZWJ1ZyhGMTAxLCJ4c2VuZCBmbmNudiIsIiIsZm5jbnYpOworICAgICAgICAvKiBXZSBzaG91bGQgYWxzbyBoYW5kbGUgTyBwYWNrZXQgZmlsZW5hbWUgb3B0aW9uIGhlcmUgKi8KKyAgICAgICAgLyogYnV0IHdlIGRvbid0IHJlYWxseSBuZWVkIHRvIHNpbmNlIFdIQVRBTUkgYWxyZWFkeSBoYW5kbGVzIGl0ICovCisgICAgfQorICAgIGlmIChwdltTTkRfUFRIXS5pdmFsID4gLTEpIHsgICAgICAgIC8qIFBBVEhOQU1FUyAqLworICAgICAgICBnX3JwYXRoID0gZm5ycGF0aDsgICAgICAgICAgICAgIC8qIFNhdmUgZ2xvYmFsIHZhbHVlcyAqLworICAgICAgICBmbnJwYXRoID0gcHZbU05EX1BUSF0uaXZhbDsKKyAgICAgICAgZGVidWcoRjEwMSwieHNlbmQgZm5ycGF0aCIsIiIsZm5ycGF0aCk7CisjaWZuZGVmIE5aTFRPUgorICAgICAgICBpZiAoZm5ycGF0aCAhPSBQQVRIX09GRikgeworICAgICAgICAgICAgZ19mbmNudiA9IGZuY252OworICAgICAgICAgICAgZm5jbnYgPSBYWUZOX0w7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ4c2VuZCBmbmNudiIsIiIsZm5jbnYpOworICAgICAgICB9CisgICAgICAgIC8qIFdlIHNob3VsZCBhbHNvIGhhbmRsZSBPIHBhY2tldCBwYXRobmFtZSBvcHRpb24gaGVyZSAqLworICAgICAgICAvKiBidXQgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdG8gc2luY2UgV0hBVEFNSSBhbHJlYWR5IGhhbmRsZXMgaXQgKi8KKyNlbmRpZiAvKiBOWkxUT1IgKi8KKyAgICB9CisKKyAgICAvKiBTZXQgcHJvdG9jb2wgc3RhcnQgc3RhdGUgKi8KKworICAgIGlmIChvcGt0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4dGVuZGVkIEdFVCBPcHRpb25zKi8KKyAgICAgICAgc3N0YXRlID0gKENIQVIpICdvJzsKKyAgICAgICAgb29wdHMgPSAwOworICAgICAgICBpZiAocHZbU05EX0RFTF0uaXZhbCA+IDApIG9vcHRzIHw9IEdPUFRfREVMOyAvKiBHRVQgL0RFTEVURSAqLworICAgICAgICBpZiAocHZbU05EX1JFU10uaXZhbCA+IDApIG9vcHRzIHw9IEdPUFRfUkVTOyAvKiBHRVQgL1JFQ09WRVIgKi8KKyAgICAgICAgaWYgKHB2W1NORF9SRUNdLml2YWwgPiAwKSBvb3B0cyB8PSBHT1BUX1JFQzsgLyogR0VUIC9SRUNVUlNJVkUgKi8KKyAgICB9IGVsc2UgaWYgKHJjdmNtZCkKKyAgICAgIHNzdGF0ZSA9IChDSEFSKSAndic7ICAgICAgICAgICAgICAvKiBSRUNFSVZFIG9yIENSRUNFSVZFICovCisgICAgZWxzZSBpZiAocHZbU05EX0RFTF0uaXZhbCA+IDApCisgICAgICBzc3RhdGUgPSAoQ0hBUikgJ2gnOyAgICAgICAgICAgICAgLyogR0VUIC9ERUxFVEUgKD0gUkVUUklFVkUpICovCisgICAgZWxzZSBpZiAocHZbU05EX1JFU10uaXZhbCA+IDApCisgICAgICBzc3RhdGUgPSAoQ0hBUikgJ2onOyAgICAgICAgICAgICAgLyogR0VUIC9SRUNPVkVSICg9IFJFR0VUKSAqLworICAgIGVsc2UKKyAgICAgIHNzdGF0ZSA9IChDSEFSKSAncic7ICAgICAgICAgICAgICAvKiBSZWd1bGFyIEdFVCAqLworICAgIGdldGNtZCA9IDE7CisgICAgZGVidWcoRjAwMCwieGdldCBzc3RhdGUiLCIiLHNzdGF0ZSk7CisjaWZkZWYgTUFDCisgICAgd2hhdCA9IFdfUkVDVjsKKyAgICBzY3JjcmVhdGUoKTsKKyNlbmRpZiAvKiBNQUMgKi8KKyAgICBpZiAobG9jYWwpIHsKKyAgICAgICAgaWYgKHB2W1NORF9TSEhdLml2YWwgIT0gMCkKKyAgICAgICAgICBkaXNwbGEgPSAxOworICAgICAgICB0dGZsdWkoKTsKKyAgICB9CisgICAgeCA9IDA7CisjaWZkZWYgUElQRVNFTkQKKyAgICBpZiAocGlwZXNlbmQpCisgICAgICBnb3RvIHhnZXR4OworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyNpZmRlZiBDS19UTVBESVIKKy8qCisgIGNtYXJnMiBpcyBhbHNvIGFsbG93ZWQgdG8gYmUgYSBkZXZpY2Ugb3IgZGlyZWN0b3J5IG5hbWU7CisgIGV2ZW4gdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnkgdGhhdCBkb2Vzbid0IGV4aXN0LgorKi8KKyAgICB5ID0gc3RybGVuKGNtYXJnMik7CisgICAgZGVidWcoRjExMSwieGdldCBzdHJsZW4oY21hcmcyKSIsY21hcmcyLHkpOworICAgIGlmICgoeSA+IDApICYmCisjaWZkZWYgT1MyCisgICAgICAgICgoaXNhbHBoYShjbWFyZzJbMF0pICYmCisgICAgICAgICBjbWFyZzJbMV0gPT0gJzonICYmCisgICAgICAgICBjbWFyZzJbMl0gPT0gTlVMKSB8fAorICAgICAgICAoY21hcmdbeS0xXSA9PSAnLycgfHwgY21hcmdbeS0xXSA9PSAnXFwnKSB8fAorICAgICAgICBpc2RpcihjbWFyZzIpKQorI2Vsc2UKKyNpZmRlZiBVTklYT1JPU0sKKyAgICAgICAgKGNtYXJnMlt5LTFdID09ICcvJyB8fCBpc2RpcihjbWFyZzIpKQorI2Vsc2UKKyNpZmRlZiBWTVMKKyAgICAgICAgKGNtYXJnMlt5LTFdID09ICddJyB8fCBjbWFyZzJbeS0xXSA9PSAnPicgfHwgaXNkaXIoY21hcmcyKSkKKyNlbHNlCisjaWZkZWYgU1RSQVRVUworICAgICAgICAoY21hcmcyW3ktMV0gPT0gJz4nIHx8IGlzZGlyKGNtYXJnMikpCisjZWxzZQorI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgICAgIChjbWFyZzJbeS0xXSA9PSAnOicgfHwgY21hcmdbMF0gPT0gJzonIHx8IGlzZGlyKGNtYXJnMikpCisjZWxzZQorICAgICAgICBpc2RpcihjbWFyZzIpCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogVU5JWE9ST1NLICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJkb3hnZXQgUkVDRUlWRSBjbWFyZzIgZGlzayBvciBkaXIiLGNtYXJnMiwwKTsKKyAgICAgICAgaWYgKCFmX3RtcGRpcikgeworICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICBzID0gemd0ZGlyKCk7CisgICAgICAgICAgICBpZiAocykgeworICAgICAgICAgICAgICAgIGNrc3RybmNweShzYXZkaXIscyxUTVBESVJMRU4pOyAvKiByZW1lbWJlciBvbGQgZGlzay9kaXIgKi8KKyAgICAgICAgICAgICAgICBmX3RtcGRpciA9IDE7ICAgLyogYW5kIHRoYXQgd2UgZGlkIHRoaXMgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/Q2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgICAgICAgICBjbWFyZzIgPSAiIjsKKyAgICAgICAgICAgICAgICBmX3RtcGRpciA9IDA7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geGdldHg7CisgICAgICAgICAgICB9CisjaWZkZWYgQ0tfTUtESVIKKyAgICAgICAgICAgIHggPSB6Y2hraShjbWFyZzIpOyAgICAgICAgICAvKiBEb2VzIGFzLW5hbWUgZXhpc3Q/ICovCisgICAgICAgICAgICBpZiAoeCA9PSAtMSkgeyAgICAgICAgICAgICAgLyogRG9lc24ndCBleGlzdCAqLworICAgICAgICAgICAgICAgIGNoYXIgKiBwID0gTlVMTDsgICAgICAgIC8qIFRyeSB0byBjcmVhdGUgaXQgKi8KKyAgICAgICAgICAgICAgICB4ID0gc3RybGVuKGNtYXJnMik7CisgICAgICAgICAgICAgICAgaWYgKChwID0gKGNoYXIgKiltYWxsb2MoeCs0KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihwLCIlcyVzIixjbWFyZzIsIngueCIpOyAvKiBTQUZFIChwcmVjaGVja2VkKSAqLworICAgICAgICAgICAgICAgICAgICB4ID0gem1rZGlyKHApOworICAgICAgICAgICAgICAgICAgICBmcmVlKHApOworICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0Nhbid0IGNyZWF0ZSAlc1xuIixjbWFyZzIpOworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19NS0RJUiAqLworICAgICAgICAgICAgaWYgKCF6Y2hkaXIoY21hcmcyKSkgeyAgICAgIC8qIGNoYW5nZSB0byBnaXZlbiBkaXNrL2RpcmVjdG9yeSwgKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIj9DYW4ndCBhY2Nlc3MgJXNcbiIsY21hcmcyKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgZ290byB4Z2V0eDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtYXJnMiA9ICIiOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENLX1RNUERJUiAqLworCisgICAgY2tzdHJuY3B5KGZzcGVjLGNtYXJnLENLTUFYUEFUSCk7ICAgLyogTm90ZSAtIHRoaXMgaXMgYSBSRU1PVEUgZmlsZXNwZWMgKi8KKyAgICBkZWJ1ZyhGMTExLCJ4Z2V0IGZzcGVjIixmc3BlYyxmc3BlY2xlbik7CisgICAgZGVidWcoRjExMCwieGdldCBjbWFyZzIiLGNtYXJnMiwwKTsKKworICB4Z2V0eDoKKyAgICBmb3IgKGkgPSAwOyBpIDwgU05EX01BWDsgaSsrKQorICAgICAgaWYgKHB2W2ldLnN2YWwpCisgICAgICAgIGZyZWUocHZbaV0uc3ZhbCk7CisgICAgcmV0dXJuKHgpOworfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PU1BMCisKKy8qCisgIEQgTyBHIFQgQSAgLS0gIERvIF9HRVRBUkdTIG9yIF9QVVRBUkdTIENvbW1hbmQuCisKKyAgVXNlZCBieSBYSUYsIEZPUiwgV0hJTEUsIGFuZCBTV0lUQ0gsIGVhY2ggb2Ygd2hpY2ggYXJlIGltcGxlbWVudGVkIGFzCisgIDItbGV2ZWwgbWFjcm9zOyB0aGUgZmlyc3QgbGV2ZWwgZGVmaW5lcyB0aGUgbWFjcm8sIHRoZSBzZWNvbmQgcnVucyBpdC4KKyAgVGhpcyByb3V0aW5lIGhpZGVzIHRoZSBmYWN0IHRoYXQgdGhleSBhcmUgbWFjcm9zIGJ5IGltcG9ydGluZyB0aGUKKyAgbWFjcm8gYXJndW1lbnRzIChpZiBhbnkpIGZyb20gdHdvIGxldmVscyB1cCwgdG8gbWFrZSB0aGVtIGF2YWlsYWJsZQorICBpbiB0aGUgSUYsIEZPUiwgU1dJVENILCBhbmQgV0hJTEUgY29tbWFuZHMgdGhlbXNlbHZlczsgZm9yIGV4YW1wbGUgYXMKKyAgbG9vcCBpbmRpY2VzLCBldGMsIGFuZCB3aXRoaW4gdGhlIElGL0ZPUi9XSElMRS9TV0lUQ0ggYm9keSBpdHNlbGYuCisgIF9QVVRBUkdTIGlzIGluIGNhc2Ugd2UgY2hhbmdlZCBhbnkgb2YgdGhlc2UgdmFyaWFibGVzIG9yIHVzZWQgU0hJRlQKKyAgb24gdGhlbSwgc28gdGhlIG5ldyB2YWx1ZXMgd29uJ3QgYmUgbG9zdCBhcyB3ZSBwb3AgdXAgdGhlIHN0YWNrLgorKi8KK2ludAorZG9ndGEoY3gpIGludCBjeDsgeworICAgIGludCBpLCBuOworICAgIGNoYXIgYywgKnAsICBtYnVmWzRdOworICAgIGV4dGVybiBpbnQgdG9wYXJnYywgY21kaW50OworICAgIGV4dGVybiBjaGFyICoqIHRvcHhhcmc7CisKKyAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICByZXR1cm4oeSk7CisgICAgZGVidWcoRjEwMSwiZG9ndGEgY3giLCIiLGN4KTsKKyAgICBkZWJ1ZyhGMTAxLCJkb2d0YSBtYWNsdmwiLCIiLG1hY2x2bCk7CisgICAgaWYgKGN4ID09IFhYR1RBKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImRvZ3RhIF9HRVRBUkdTIG1hY2x2bCIsIiIsbWFjbHZsKTsKKyAgICB9IGVsc2UgaWYgKGN4ID09IFhYUFRBKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImRvZ3RhIF9QVVRBUkdTIG1hY2x2bCIsIiIsbWFjbHZsKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4oLTIpOworICAgIH0KKyAgICBpZiAobWFjbHZsIDwgMSkKKyAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisKKyAgICAvKiBNYWtlIG5ldyBjb3BpZXMgb2YgbWFjcm8gYXJndW1lbnRzIC8lMC4uOSAqLworCisgICAgbWJ1ZlswXSA9ICclJzsgbWJ1ZlsxXSA9ICcwJzsgbWJ1ZlsyXSA9IE5VTDsgLyogQXJndW1lbnQgbmFtZSBidWYgKi8KKworICAgIGlmIChjeCA9PSBYWFBUQSkgeyAgICAgICAgICAgICAgICAgIC8qIEdvIE5PSU5UIGJlY2F1c2UgX1BVVEFSR1MgKi8KKyAgICAgICAgaWYgKGNtZGludCkgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3JhcmlseSBjaGFuZ2VzIG1hY2x2bC4gKi8KKyAgICAgICAgICBjb25ub2koKTsgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHRzIE9GRi4gKi8KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsgICAgICAgICAgLyogRm9yIGFsbCBhcmdzICovCisgICAgICAgIGMgPSAoY2hhcikgKGkgKyAnMCcpOyAgICAgICAgICAgLyogTWFrZSBuYW1lICovCisgICAgICAgIG1idWZbMV0gPSAoY2hhcikgYzsgICAgICAgICAgICAgLyogSW5zZXJ0IGRpZ2l0ICovCisgICAgICAgIGlmIChjeCA9PSBYWEdUQSkgeyAgICAgICAgICAgICAgLyogR2V0IGFyZyBmcm9tIGxldmVsLW1pbnVzLTIgKi8KKyAgICAgICAgICAgIGlmIChtYWNsdmwgPT0gMSkgcCA9IGdfdmFyW2NdOyAvKiBJZiBhdCBsZXZlbCAxIHVzZSBnbG9iYWxzIDAuLjkgKi8KKyAgICAgICAgICAgIGVsc2UgcCA9IG1fYXJnW21hY2x2bC0yXVtpXTsgICAvKiBPdGhlcndpc2UgdGhleSdyZSBvbiB0aGUgc3RhY2sgKi8KKyAgICAgICAgICAgIGFkZG1hYyhtYnVmLHApOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIGlmIChtYWNsdmwgPiAxKQorICAgICAgICAgICAgICBtYWtlc3RyKCYobV9saW5lW21hY2x2bF0pLG1fbGluZVttYWNsdmwtMl0pOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgfSBlbHNlIGlmIChjeCA9PSBYWFBUQSkgeyAgICAgICAvKiBQdXQgYXJncyBsZXZlbCsyICovCisgICAgICAgICAgICBtYWNsdmwgLT0gMjsgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBncm9zcywgaXQncyBiZWNhdXNlIHdlJ3JlICovCisgICAgICAgICAgICBhZGRtYWMobWJ1ZixtX2FyZ1ttYWNsdmwrMl1baV0pOyAvKiBhZGRpbmcgbWFjcm9zIHR3byBsZXZlbHMgdXAgKi8KKyAgICAgICAgICAgIG1hY2x2bCArPSAyOyAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBhZGRtYWMoKSB1c2VzIG1hY2x2bC4gKi8KKyAgICAgICAgICAgIGNvdW50W2NtZGx2bCAtIDJdICA9IGNvdW50W2NtZGx2bF07CisgICAgICAgICAgICBpbnRpbWVbY21kbHZsIC0gMl0gPSBpbnRpbWVbY21kbHZsXTsKKyAgICAgICAgICAgIGlucGNhc1tjbWRsdmwgLSAyXSA9IGlucGNhc1tjbWRsdmxdOworICAgICAgICAgICAgdGFrZXJyW2NtZGx2bCAtIDJdID0gdGFrZXJyW2NtZGx2bF07CisgICAgICAgICAgICBtZXJyb3JbY21kbHZsIC0gMl0gPSBtZXJyb3JbY21kbHZsXTsKKyAgICAgICAgICAgIHhxdWlldFtjbWRsdmwgLSAyXSA9IHhxdWlldFtjbWRsdmxdOworICAgICAgICB9IGVsc2UgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsgICAgIC8qIEJhZCBjYWxsIHRvIHRoaXMgcm91dGluZSAqLworICAgIH0KKyAgICBpZiAoY3ggPT0gWFhQVEEpIHsgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIGludGVycnVwdHMgaWYgd2UgKi8KKyAgICAgICAgaWYgKGNtZGludCkgICAgICAgICAgICAgICAgICAgICAvKiB0dXJuZWQgdGhlbSBvZmYgYWJvdmUuICovCisgICAgICAgICAgY29uaW50KHRyYXAsc3RwdHJhcCk7CisgICAgfQorICAgIC8qIE5vdyB0YWtlIGNhcmUgb2YgdGhlIGFyZ3VtZW50IHZlY3RvciBhcnJheSBcJl9bXSwgXHYocmV0dXJuKSwgKi8KKyAgICAvKiBhbmQgXHYoYXJnYykgYnkganVzdCBjb3B5aW5nIHRoZSBwb2ludGVycy4gKi8KKworICAgIGlmIChjeCA9PSBYWEdUQSkgeyAgICAgICAgICAgICAgICAgIC8qIEdFVEFSR1MgZnJvbSAyIGxldmVscyB1cCAqLworICAgICAgICBpZiAobWFjbHZsID09IDEpIHsKKyAgICAgICAgICAgIGFfcHRyWzBdID0gdG9weGFyZzsgICAgICAgICAvKiBcJl9bXSBhcnJheSAqLworICAgICAgICAgICAgYV9kaW1bMF0gPSB0b3BhcmdjIC0gMTsgICAgIC8qIERpbWVuc2lvbiBkb2Vzbid0IGluY2x1ZGUgWzBdICovCisgICAgICAgICAgICBtX3hhcmdbbWFjbHZsXSA9IHRvcHhhcmc7CisgICAgICAgICAgICBuX3hhcmdbbWFjbHZsXSA9IHRvcGFyZ2M7ICAgLyogQnV0IFx2KGFyZ2MpIGRvZXMgaW5jbHVkZSBcJTAgKi8KKyAgICAgICAgICAgIG1hY2FyZ2NbbWFjbHZsXSA9IHRvcGFyZ2M7CisgICAgICAgICAgICBtYWtlc3RyKCYobXJ2YWxbbWFjbHZsKzFdKSxtcnZhbFswXSk7IC8qIChzZWUgdm5sb29rKCkpICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhX3B0clswXSA9IG1feGFyZ1ttYWNsdmwtMl07CisgICAgICAgICAgICBhX2RpbVswXSA9IG5feGFyZ1ttYWNsdmwtMl07CisgICAgICAgICAgICBtX3hhcmdbbWFjbHZsXSA9IG1feGFyZ1ttYWNsdmwtMl07CisgICAgICAgICAgICBuX3hhcmdbbWFjbHZsXSA9IG5feGFyZ1ttYWNsdmwtMl07CisgICAgICAgICAgICBtYWNhcmdjW21hY2x2bF0gPSBuX3hhcmdbbWFjbHZsLTJdOworICAgICAgICAgICAgbWFrZXN0cigmKG1ydmFsW21hY2x2bCsxXSksbXJ2YWxbbWFjbHZsLTFdKTsgLyogKHNlZSB2bmxvb2soKSkgKi8KKworICAgICAgICB9CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFVUQVJHUyAyIGxldmVscyB1cCAqLworICAgICAgICBpZiAobWFjbHZsID4gMSkgeworICAgICAgICAgICAgYV9wdHJbMF0gPSBtX3hhcmdbbWFjbHZsXTsKKyAgICAgICAgICAgIG1feGFyZ1ttYWNsdmwtMl0gPSBtX3hhcmdbbWFjbHZsXTsKKyAgICAgICAgICAgIGFfZGltWzBdID0gbl94YXJnW21hY2x2bF07CisgICAgICAgICAgICBuX3hhcmdbbWFjbHZsLTJdID0gbl94YXJnW21hY2x2bF07CisgICAgICAgICAgICBtYWNhcmdjW21hY2x2bC0yXSA9IG5feGFyZ1ttYWNsdmxdOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybigxKTsgICAgICAgICAgICAgICAgICAvKiBJbnRlcm5hbCBjb21tYW5kIC0gZG9uJ3QgY2hhbmdlIHN1Y2Nlc3MgKi8KK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PU1BMCisvKgorICBEbyB0aGUgR09UTyBhbmQgW19dRk9SV0FSRCBjb21tYW5kcy4KKyAgcyA9IExhYmVsIHRvIHNlYXJjaCBmb3IsIGN4ID0gZnVuY3Rpb24gY29kZTogWFhHT1RPLCBYWEZXRCwgb3IgWFhYRldELgorKi8KKyNpZmRlZiBCSUdCVUZPSworI2RlZmluZSBMQkxNQVhMRU4gMjU1ICAgICAgICAgICAgICAgICAgIC8qIE1heCBsYWJlbCBsZW5ndGggKi8KKyNlbHNlCisjZGVmaW5lIExCTE1BWExFTiA2MworI2VuZGlmIC8qIEJJR0JVRk9LICovCisKK2ludAorZG9nb3RvKHMsIGN4KSBjaGFyICpzOyBpbnQgY3g7IHsKKyAgICBpbnQgaSwgaiwgeCwgeSwgeiwgYmM7CisgICAgaW50IGVtcHR5ID0gMCwgc3RvcGZsZyA9IDA7CisgICAgY2hhciAqIGNtZDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSBvZiB0aGlzIGNvbW1hbmQgKi8KKyAgICBjaGFyIHRtcGxibFtMQkxNQVhMRU4rMV0sICpscDsgICAgICAvKiBDdXJyZW50IGxhYmVsIGZyb20gY29tbWFuZCBzdHJlYW0gKi8KKyAgICBjaGFyIHRtcDJbTEJMTUFYTEVOKzFdOyAgICAgICAgICAgICAvKiBTV0lUQ0ggbGFiZWwgY29udmVyc2lvbiBidWZmZXIgKi8KKyAgICBjaGFyIHRtcDNbTEJMTUFYTEVOKzFdOyAgICAgICAgICAgICAvKiBUYXJnZXQgbGFiZWwgKi8KKworICAgIHN0b3BmbGcgPSAoY3ggPT0gWFhYRldEKTsgICAgICAgICAgIC8qIF9GT1JXQVJEICh1c2VkIGluIFNXSVRDSCkgKi8KKyAgICBiYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCcmFjZSBjb3VudGVyICovCisKKyAgICBjbWQgPSAoY3ggPT0gWFhHT1RPKSA/ICJHT1RPIiA6ICgoY3ggPT0gWFhGV0QpID8gIkZPUldBUkQiIDogIl9GT1JXQVJEIik7CisgICAgaWYgKCFzKSBzID0gIiI7CisgICAgaWYgKCEqcykgZW1wdHkgPSAxOworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisgICAgICAgIGRlYnVnKEYxMTEsIkdPVE8gY29tbWFuZCIsY21kLGN4KTsKKyAgICAgICAgZGVidWcoRjEwMSwiR09UTyBjbWRsdmwiLCIiLGNtZGx2bCk7CisgICAgICAgIGRlYnVnKEYxMDEsIkdPVE8gbWFjbHZsIiwiIixtYWNsdmwpOworICAgICAgICBkZWJ1ZyhGMTAxLCJHT1RPIHRsZXZlbCIsIiIsdGxldmVsKTsKKyAgICAgICAgZGVidWcoRjExMSwiR09UTyB0YXJnZXQiLHMsZW1wdHkpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgIGRlYnVnKEYxMTAsY21kLHMsMCk7CisgICAgY2tzdHJuY3B5KHRtcDMrMSxzLExCTE1BWExFTi0xKTsKKyAgICBzID0gdG1wMysxOworICAgIGlmICgqcyAhPSAnOicpIHsgICAgICAgICAgICAgICAgICAgIC8qIE1ha2UgY29weSBvZiBsYWJlbCAqLworICAgICAgICB0bXAzWzBdID0gJzonOyAgICAgICAgICAgICAgICAgIC8qIGd1YXJhbnRlZWQgdG8gc3RhcnQgd2l0aCAiOiIgKi8KKyAgICAgICAgcy0tOworICAgIH0KKyAgICBpZiAoIXN0b3BmbGcgJiYgIWVtcHR5KSB7CisgICAgICAgIGlmIChzWzFdID09ICcuJyB8fCBzWzFdID09IFNQIHx8IHNbMV0gPT0gTlVMKSB7CisgICAgICAgICAgICBwcmludGYoIj9CYWQgbGFiZWwgc3ludGF4IC0gJyVzJ1xuIixzKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNtZGx2bCA9PSAwKSB7CisgICAgICAgIHByaW50ZigiP1NvcnJ5LCAlcyBvbmx5IHdvcmtzIGluIGEgY29tbWFuZCBmaWxlIG9yIG1hY3JvXG4iLGNtZCk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgfQorICAgIHkgPSBzdHJsZW4ocyk7ICAgICAgICAgICAgICAgICAgICAgIC8qIHkgPSBsZW5ndGggb2YgdGFyZ2V0IGxhYmVsICovCisgICAgZGVidWcoRjExMSxjbWQscyx5KTsKKworICAgIHdoaWxlIChjbWRsdmwgPiAwKSB7ICAgICAgICAgICAgICAgIC8qIEFzIGxvbmcgYXMgbm90IGF0IHRvcCBsZXZlbC4uLiAqLworICAgICAgICBpZiAoY21kc3RrW2NtZGx2bF0uc3JjID09IENNRF9NRCkgeyAvKiBHT1RPIGluc2lkZSBtYWNybyAqLworICAgICAgICAgICAgaW50IGksIG0sIGZsYWc7CisgICAgICAgICAgICBjaGFyICp4cCwgKnRwOworCisgICAgICAgICAgICAvKiBHT1RPOiByZXdpbmQgdGhlIG1hY3JvOyBGT1JXQVJEOiBzdGFydCBhdCBjdXJyZW50IHBvc2l0aW9uICovCisKKyAgICAgICAgICAgIGxwID0gKGN4ID09IFhYR09UTykgPyBtYWN4W21hY2x2bF0gOiBtYWNwW21hY2x2bF07CisgICAgICAgICAgICBtID0gKGludClzdHJsZW4obHApIC0geSArIDE7CisgICAgICAgICAgICBkZWJ1ZyhGMDEwLCJHT1RPIGluIG1hY3JvIixscCwwKTsKKworICAgICAgICAgICAgZmxhZyA9IDE7ICAgICAgICAgICAgICAgICAgIC8qIGZsYWcgZm9yIHZhbGlkIGxhYmVsIHBvc2l0aW9uICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgaSsrLGxwKyspIHsgLyogc2VhcmNoIGZvciBsYWJlbCBpbiBtYWNybyBib2R5ICovCisgICAgICAgICAgICAgICAgaWYgKCpscCA9PSAneycpICAgICAgICAgLyogQnV0IG9ubHkgYXQgdGhpcyBsZXZlbCAqLworICAgICAgICAgICAgICAgICAgYmMrKzsgICAgICAgICAgICAgICAgIC8qIEFueXRoaW5nIGluc2lkZSBicmFjZXMgaXMgb2ZmICovCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKmxwID09ICd9JykgICAgLyogbGltaXRzLiAqLworICAgICAgICAgICAgICAgICAgYmMtLTsKKyAgICAgICAgICAgICAgICBpZiAoc3RvcGZsZyAmJiBiYyA+IDApICAvKiBUaGlzIGlzIGdvb2QgZm9yIFNXSVRDSCAqLworICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgIC8qIGJ1dCBpbnRlcmZlcmVzIHdpdGggV0hJTEUsIGV0Yy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoKmxwID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmbGFnKSB7ICAgICAgICAgICAgIC8qIElmIGluIHZhbGlkIGxhYmVsIHBvc2l0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmICgqbHAgPT0gU1ApICAgICAgLyogZWF0IGxlYWRpbmcgc3BhY2VzICovCisgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmICgqbHAgIT0gJzonKSB7ICAgLyogTG9vayBmb3IgbGFiZWwgaW50cm9kdWNlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDA7ICAgICAgIC8qIHRoaXMgaXNuJ3QgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAvKiBrZWVwIGxvb2tpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZsYWcpICAgICAgICAgICAgICAvKiBXZSBkb24ndCBoYXZlIGEgbGFiZWwgKi8KKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAvKiAgc28ga2VlcCBsb29raW5nLi4uICovCisgICAgICAgICAgICAgICAgeHAgPSBscDsgdHAgPSB0bXBsYmw7ICAgLyogQ29weSB0aGUgbGFiZWwgZnJvbSB0aGUgbWFjcm8gKi8KKyAgICAgICAgICAgICAgICBqID0gMDsgICAgICAgICAgICAgICAgICAvKiB0byBtYWtlIGl0IG51bGwtdGVybWluYXRlZCAqLworICAgICAgICAgICAgICAgIHdoaWxlICgoKnRwID0gKnhwKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaisrID4gTEJMTUFYTEVOKSAvKiBqID0gbGVuZ3RoIG9mIHdvcmQgZnJvbSBtYWNybyAqLworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgICAgICAgICAgaWYgKCp0cCA8IDMzIHx8ICp0cCA9PSAnLCcpIC8qIExvb2sgZm9yIGVuZCBvZiB3b3JkICovCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiAoISp0cCB8fCAqdHAgPT0gJywnKSAgICAgLyogTG9vayBmb3IgZW5kIG9mIHdvcmQgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgdHArKywgeHArKzsgICAgLyogTmV4dCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnRwID0gTlVMOyAgICAgICAgICAgICAgLyogSW4gY2FzZSB3ZSBzdG9wcGVkIGVhcmx5ICovCisgICAgICAgICAgICAgICAgLyogTm93IGRvIGNhc2VsZXNzIHN0cmluZyBjb21wYXJpc29uLCB1c2luZyBsb25nZXN0IGxlbmd0aCAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIm1hY3JvIEdPVE8gbGFiZWwiLHMseSk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwibWFjcm8gdGFyZ2V0IGxhYmVsIix0bXBsYmwsaik7CisgICAgICAgICAgICAgICAgaWYgKHN0b3BmbGcpIHsgICAgICAgICAgLyogQWxsb3cgdmFyaWFibGVzIGFzIFNXSVRDSCBsYWJlbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgaW50IG4gPSBMQkxNQVhMRU4gLSAxOworICAgICAgICAgICAgICAgICAgICBjaGFyICogcCA9IHRtcDI7CisgICAgICAgICAgICAgICAgICAgIHp6c3RyaW5nKHRtcGxibCwmcCwmbik7CisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh0bXBsYmwsdG1wMixMQkxNQVhMRU4pOworICAgICAgICAgICAgICAgICAgICB0bXAyWzQ5XSA9IE5VTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiR09UTyBzIixzLHkpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsIkdPVE8gdG1wbGJsIix0bXBsYmwsaik7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiR09UTyBlbXB0eSIsY2tpdG9hKHN0b3BmbGcpLGVtcHR5KTsKKworICAgICAgICAgICAgICAgIGlmIChlbXB0eSkgewkJICAgLyogRW1wdHkgdGFyZ2V0ICovCisJCSAgICB6ID0gKCFzdHJjbXAocywiOiIpICYmIC8qIFN0cmluZyBpcyBlbXB0eSAqLworCQkJIC8qIGFuZCBMYWJlbCBpcyAiOiIgb3IgIjoqIi4uLiAqLworCQkJICghc3RyY21wKHRtcGxibCwiOiIpIHx8ICFzdHJjbXAodG1wbGJsLCI6KiIpKSkKKwkJCT8gMCA6IDE7CisJCSAgICBkZWJ1ZyhGMTExLCJHT1RPIiwiQSIseik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdG9wZmxnKSB7CisgICAgICAgICAgICAgICAgICAgIHogPSBja21hdGNoKHRtcGxibCxzLGlucGNhc1tjbWRsdmxdLDEpID8gMCA6IDE7CisJCSAgICBkZWJ1ZyhGMTExLCJHT1RPIiwiQiIseik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeiA9IChzdG9wZmxnICYmIGlucGNhc1tjbWRsdmxdKSA/CisgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKHMsdG1wbGJsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBja3N0cmNtcChzLHRtcGxibCwoeSA+IGopID8geSA6IGosIDApOworCQkgICAgZGVidWcoRjExMSwiR09UTyIsIkMiLHopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXopIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdG9wZmxnICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIWNrc3RyY21wKCI6ZGVmYXVsdCIsdG1wbGJsLCg4ID4gaikgPyA4IDogaiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiR09UTyBERUZBVUxUIiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjExMSwiR09UTyBtYWNybyBpIixjbWQsaSk7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJHT1RPIG1hY3JvIG0iLGNtZCxtKTsKKyAgICAgICAgICAgIGlmIChpID49IG0pIHsgICAgICAgICAgICAgICAvKiBEaWRuJ3QgZmluZCB0aGUgbGFiZWwgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJHT1RPIGZhaWxlZCBjbWRsdmwiLCIiLGNtZGx2bCk7CisjaWZkZWYgQ09NTUVOVAorCQkvKiBNT1ZFRCBUTyBBRlRFUiBQT1BDTFZMIEFCT1VUIDIwIExJTkVTIERPV04gNSBBVUcgMjAwMiAqLworCQkgICBpZiAoc3RvcGZsZykKKyAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgaWYgKChtYWNsdmwgPiAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAobV9hcmdbbWFjbHZsLTFdWzBdKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAoY21kc3RrW2NtZGx2bF0uc3JjID09IENNRF9NRCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKCFzdHJuY21wKG1fYXJnW21hY2x2bC0xXVswXSwiX3hpZiIsNCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICFzdHJuY21wKG1fYXJnW21hY2x2bC0xXVswXSwiX2ZvciIsNCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICFzdHJuY21wKG1fYXJnW21hY2x2bC0xXVswXSwiX3N3aSIsNCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICFzdHJuY21wKG1fYXJnW21hY2x2bC0xXVswXSwiX3doaSIsNCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGRvZ3RhKFhYUFRBKTsgICAgICAgLyogUmVzdG9yZSBhcmdzICovCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsIkdPVE8gaW4gWElGL0ZPUi9XSEkvU1dJIHBvcHBpbmciLCIiLGNtZGx2bCk7CisgICAgICAgICAgICAgICAgICAgIHBvcGNsdmwoKTsgICAgICAgICAgLyogUG9wIGFuIGV4dHJhIGxldmVsICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsIkdPVE8gcG9wcGluZyIsIiIsY21kbHZsKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBvcGNsdmwoKSkgeyAgICAgICAvKiBwb3AgdXAgdG8gbmV4dCBoaWdoZXIgbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/TGFiZWwgJyVzJyBub3QgZm91bmRcbiIscyk7IC8qIGlmIG5vbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOyAgICAgICAgICAvKiBRdWl0ICovCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdG9wZmxnKSB7CS8qIFNXSVRDSCBubyBjYXNlIGxhYmVsIG1hdGNoICovCisJCSAgICByZXR1cm4oMCk7CQkvKiBhbmQgbm8gREVGQVVMVCBsYWJsZS4gKi8KKwkJfSBlbHNlIHsKKwkJICAgIGNvbnRpbnVlOyAgICAgICAgLyogb3RoZXJ3aXNlIGxvb2sgYWdhaW4gKi8KKwkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjExMCwiR09UTyBmb3VuZCBtYWNybyBsYWJlbCIsdG1wbGJsLDApOworICAgICAgICAgICAgbWFjcFttYWNsdmxdID0gbHA7ICAgICAgICAgIC8qIHNldCBtYWNybyBidWZmZXIgcG9pbnRlciAqLworICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICB9IGVsc2UgaWYgKGNtZHN0a1tjbWRsdmxdLnNyYyA9PSBDTURfVEYpIHsKKyAgICAgICAgICAgIHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBHT1RPIGlzc3VlZCBpbiB0YWtlIGZpbGUgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIkdPVE8gaW4gVEFLRSBmaWxlIixjbWQsY3gpOworICAgICAgICAgICAgaWYgKGN4ID09IFhYR09UTykgeyAgICAgICAgIC8qIElmIEdPVE8sIGJ1dCBub3QgRk9SV0FSRCwgKi8KKyAgICAgICAgICAgICAgICByZXdpbmQodGZpbGVbdGxldmVsXSk7ICAvKiBzZWFyY2ggZmlsZSBmcm9tIGJlZ2lubmluZyAqLworICAgICAgICAgICAgICAgIHRmbGluZVt0bGV2ZWxdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICghIGZlb2YodGZpbGVbdGxldmVsXSkpIHsKKyNpZmRlZiBDT01NRU5UCisvKiBUaGlzIGlzIHdyb25nIC0gaXQgbGV0cyB1cyBqdW1wIHRvIGxhYmVscyBpbnNpZGUgaW5mZXJpb3IgYmxvY2tzICovCisgICAgICAgICAgICAgICAgdGZsaW5lW3RsZXZlbF0rKzsKKyAgICAgICAgICAgICAgICBpZiAoZmdldHMobGluZSxMSU5CVUZTSVosdGZpbGVbdGxldmVsXSkgPT0gTlVMTCkgLyogR2V0IGxpbmUgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgaWYgKGdldG5jdChsaW5lLExJTkJVRlNJWix0ZmlsZVt0bGV2ZWxdLDApIDwgMCkKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgLyogSWYgbm8gbW9yZSwgZG9uZSwgbGFiZWwgbm90IGZvdW5kICovCisgICAgICAgICAgICAgICAgbHAgPSBsaW5lOyAgICAgICAgICAgICAgLyogR290IGxpbmUgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoKmxwID09IFNQIHx8ICpscCA9PSBIVCkKKyAgICAgICAgICAgICAgICAgIGxwKys7ICAgICAgICAgICAgICAgICAvKiBTdHJpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKyAgICAgICAgICAgICAgICBpZiAoKmxwICE9ICc6JykgY29udGludWU7IC8qIENoZWNrIGZvciBsYWJlbCBpbnRyb2R1Y2VyICovCisgICAgICAgICAgICAgICAgd2hpbGUgKCoobHArMSkgPT0gU1ApIHsgLyogUmVtb3ZlIHNwYWNlIGJldHdlZW4gOiBhbmQgbmFtZSAqLworICAgICAgICAgICAgICAgICAgICAqKGxwKzEpID0gJzonOworICAgICAgICAgICAgICAgICAgICBscCsrOyAgICAgICAgICAgICAgIC8qIFN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cCA9IGxwOyAgICAgICAgICAgICAgICAvKiBHZXQgZW5kIG9mIHdvcmQgKi8KKyAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKnRwKSB7ICAgICAgICAgICAvKiBBbmQgbnVsbC10ZXJtaW5hdGUgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCp0cCA8IDMzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqdHAgPSBOVUw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHRwKyssIGorKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFja3N0cmNtcChscCxzLCh5ID4gaikgPyB5IDogaiwwKSkgeyAvKiBDYXNlbGVzcyBjb21wYXJlICovCisgICAgICAgICAgICAgICAgICAgIHggPSAxOyAgICAgICAgICAgICAgLyogR290IGl0ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogZG9uZS4gKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0b3BmbGcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICFja3N0cmNtcCgiOmRlZmF1bHQiLHRtcGxibCwoOCA+IGopID8gOCA6IGosMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh4ID09IDApIHsgICAgICAgICAgICAgICAvKiBJZiBub3QgZm91bmQsIHByaW50IG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJHT1RPIGZhaWxlZCBhdCBjbWRsdmwiLCIiLGNtZGx2bCk7CisgICAgICAgICAgICAgICAgaWYgKHN0b3BmbGcpCisgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICAgICAgaWYgKCFwb3BjbHZsKCkpIHsgICAgICAgLyogcG9wIHVwIHRvIG5leHQgaGlnaGVyIGxldmVsICovCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0xhYmVsICclcycgbm90IGZvdW5kXG4iLHMpOyAvKiBpZiBub25lICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsgICAgICAgICAgLyogcXVpdCAqLworICAgICAgICAgICAgICAgIH0gZWxzZSBjb250aW51ZTsgICAgICAgIC8qIG90aGVyd2lzZSBsb29rIGFnYWluICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oeCk7ICAgICAgICAgICAgICAgICAgLyogU2VuZCBiYWNrIHJldHVybiBjb2RlICovCisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRmKCI/U3RhY2sgcHJvYmxlbSBpbiBHT1RPICVzXG4iLHMpOyAvKiBTaG91bGRuJ3Qgc2VlIHRoaXMgKi8KKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogTk9TUEwgKi8KKworLyogRmluaXNoIHBhcnNpbmcgYW5kIGRvIHRoZSBJRiwgWElGLCBhbmQgV0hJTEUgY29tbWFuZHMgKi8KKworI2lmbmRlZiBOT1NQTAorCisvKiAgQyBIIEsgViBBIFIgIC0tICBDaGVjayAoaWYgaXQncyBhKSBWYXJpYWJsZSAgKi8KKworCisjaWZkZWYgT0xEQ0hLVkFSCisvKgorICBDcnVkZSBhbmQgZGlzZ3VzdGluZywgYnV0IG5lZWRlZCBmb3IgT1MvMiwgRE9TLCBhbmQgV2luZG93cywgd2hlcmUgZmlsZW5hbWVzCisgIGhhdmUgYmFja3NsYXNoZXMgaW4gdGhlbS4gIEhvdyBkbyB3ZSBrbm93IGlmIGEgYmFja3NsYXNoIGluIGEgZmlsZW5hbWUgaXMgYQorICBkaXJlY3Rvcnkgc2VwYXJhdG9yLCBvciBpZiBpdCdzIGEgS2VybWl0IGJhY2tzbGFzaD8gIFRoaXMgcm91dGluZSBkb2VzIGEKKyAgcm91Z2ggc3ludGF4IGNoZWNrIG9mIHRoZSBuZXh0IGZldyBjaGFyYWN0ZXJzIGFuZCBpZiBpdCBsb29rcyBsaWtlIGl0IE1JR0hUCisgIGJlIGEgdmFyaWFibGUsIHRoZW4gaXQgdHJpZXMgdG8gZXZhbHVhdGUgaXQsIGFuZCBpZiB0aGUgcmVzdWx0IGlzIG5vdCBlbXB0eSwKKyAgd2Ugc2F5IGl0J3MgYSB2YXJpYWJsZSwgYWx0aG91Z2ggc29tZXRpbWVzIGl0IG1pZ2h0IG5vdCBiZSAtLSBzb21lIGNhc2VzIGFyZQorICB0cnVseSBhbWJpZ3VvdXMuICBGb3IgZXhhbXBsZSB0aGVyZSBtaWdodCBhIERPUyBkaXJlY3RvcnkgY2FsbGVkIFwlYSwgYW5kCisgIHdlIGFsc28gaGF2ZSBhIHZhcmlhYmxlIHdpdGggdGhlIHNhbWUgbmFtZS4gIFRoaXMgaXMgYWxsIGZvciB0aGUgc2FrZSBvZiBub3QKKyAgaGF2aW5nIHRvIHRlbGwgUEMgdXNlcnMgdGhhdCB0aGV5IGhhdmUgdG8gZG91YmxlIGFsbCBiYWNrc2xhc2hlcyBpbiBmaWxlCisgIGFuZCBkaXJlY3RvcnkgbmFtZXMuCisqLworI2Vsc2UKKy8qCisgIFNvbWV3aGF0IGxlc3MgY3J1ZGUgJiBkaXNndXN0aW5nLiAgVGhlIHByZXZpb3VzIG1ldGhvZCB3YXMgbm9uZGV0ZXJtaW5pc3RpYworICBhbmQgKHdvcnNlKSBpdCBpbnRlcmZlcmVkIHdpdGggbWFjcm8gYXJndW1lbnQgcGFzc2luZy4gIFNvIG5vdyB3ZSBvbmx5CisgIGNoZWNrIHRoZSBzeW50YXggb2YgYmFja3NsYXNoLWl0ZW1zIHRvIHNlZSBpZiB0aGV5IGFyZSB2YXJpYWJsZXMsIGJ1dCB3ZQorICBkbyBOT1QgY2hlY2sgdGhlaXIgdmFsdWVzLgorKi8KKyNlbmRpZiAvKiBPTERDSEtWQVIgKi8KKy8qCisgIENhbGwgd2l0aCBhIHN0cmluZyBwb2ludGVyIHBvaW50aW5nIGF0IHRoZSBiYWNrc2xhc2ggb2YgdGhlIHB1cnBvcnRlZAorICB2YXJpYWJsZS4gIFJldHVybnMgMSBpZiBpdCBoYXMgdGhlIHN5bnRheCBvZiBhIHZhcmlhYmxlLCAwIGlmIG5vdC4KKyovCitpbnQKK2Noa3ZhcihzKSBjaGFyICpzOyB7CisgICAgaW50IHogPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGNvZGUgLSBhc3N1bWUgZmFpbHVyZS4gKi8KKyAgICBpZiAoIXMpIHMgPSAiIjsgICAgICAgICAgICAgICAgICAgICAvKiBXYXRjaCBvdXIgZm9yIG51bGwgcG9pbnRlcnMuICovCisgICAgaWYgKCEqcykgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgLyogRW1wdHkgYXJnIHNvIG5vdCBhIHZhcmlhYmxlLiAqLworICAgIGlmICgqcyA9PSBDTURRKSB7ICAgICAgICAgICAgICAgICAgIC8qIE9iamVjdCBiZWdpbnMgd2l0aCBiYWNrc2xhc2guICovCisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgYyA9IHNbMV07ICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXIgZm9sbG93aW5nIGJhY2tzbGFzaC4gKi8KKyAgICAgICAgaWYgKGMpIHsKKyAgICAgICAgICAgIGludCB0ID0gMDsKKyAgICAgICAgICAgIGlmIChjID09IENNRFEpICAgICAgICAgICAgICAvKiBRdW90ZWQgYmFja3NsYXNoICovCisgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIGMgPSAoY2hhcikgKGlzbG93ZXIoYykgPyB0b3VwcGVyKGMpIDogYyk7IC8qIE90aGVyd2lzZS4uLiAqLworICAgICAgICAgICAgaWYgKGMgPT0gJyUnKSB7ICAgICAgICAgICAgIC8qIFNpbXBsZSB2YXJpYWJsZSAqLworI2lmZGVmIE9MRENIS1ZBUgorICAgICAgICAgICAgICAgIHQgPSAxOworI2Vsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisjZW5kaWYgLyogT0xEQ0hLVkFSICovCisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyYnKSB7ICAgICAgLyogQXJyYXkgKi8KKyAgICAgICAgICAgICAgICBpZiAoIXNbMl0pIHJldHVybigwKTsKKyAgICAgICAgICAgICAgICBpZiAoc1szXSA9PSAnWycpCisgICAgICAgICAgICAgICAgICB0ID0gY2tpbmRleCgiXSIscyw0LDAsMSk7CisjaWZuZGVmIE9MRENIS1ZBUgorICAgICAgICAgICAgICAgIHJldHVybigodCA+IDApID8gMSA6IDApOworI2VuZGlmIC8qIE9MRENIS1ZBUiAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICckJyB8fCAgICAgIC8qIEVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJ1YnIHx8ICAgICAgLyogQnVpbHQtaW4gdmFyaWFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnTScpIHsgICAgICAvKiBNYWNybyBuYW1lICovCisgICAgICAgICAgICAgICAgdCA9IChzWzJdID09ICcoJyk7CisjaWZuZGVmIE9MRENIS1ZBUgorICAgICAgICAgICAgICAgIHJldHVybigodCA+IDApID8gMSA6IDApOworI2VuZGlmIC8qIE9MRENIS1ZBUiAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdGJykgeyAgICAgIC8qIEZ1bmN0aW9uIHJlZmVyZW5jZSAqLworICAgICAgICAgICAgICAgIC8qIERvbid0IGFjdHVhbGx5IGNhbGwgaXQgLSBpdCBtaWdodCBoYXZlIHNpZGUgZWZmZWN0cyAqLworICAgICAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNraW5kZXgoIigiLHMsMywwLDEpKSkgLyogSnVzdCBjaGVjayBzeW50YXggKi8KKyAgICAgICAgICAgICAgICAgIGlmICgoeCA9IGNraW5kZXgoIikiLHMseCwwLDEpKSkKKyAgICAgICAgICAgICAgICAgICAgeiA9IDE7CisgICAgICAgICAgICAgICAgLyogSW5zZXJ0IGEgYmV0dGVyIHN5bnRheCBjaGVjayBoZXJlIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgfQorI2lmZGVmIE9MRENIS1ZBUgorICAgICAgICAgICAgaWYgKHQpIHsKKyAgICAgICAgICAgICAgICB0ID0gMjU1OyAgICAgICAgICAgICAgICAvKiBUaGlzIGxldHMgdXMgdGVzdCBcdih4eHgpICovCisgICAgICAgICAgICAgICAgbHAgPSBsaW5lOyAgICAgICAgICAgICAgLyogYW5kIGV2ZW4gXGYuLi4oeHh4KSAqLworICAgICAgICAgICAgICAgIHp6c3RyaW5nKHMsJmxwLCZ0KTsgICAgIC8qIEV2YWx1YXRlIGl0LCB3aGF0ZXZlciBpdCBpcy4gKi8KKyAgICAgICAgICAgICAgICB0ID0gc3RybGVuKGxpbmUpOyAgICAgICAvKiBHZXQgaXRzIGxlbmd0aC4gKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJjaGt2YXIiLGxpbmUsdCk7CisgICAgICAgICAgICAgICAgeiA9IHQgPiAwOyAgICAgICAgICAgICAgLyogSWYgbGVuZ3RoID4gMCwgaXQncyBkZWZpbmVkICovCisgICAgICAgICAgICB9CisjZW5kaWYgLyogT0xEQ0hLVkFSICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKHopOworfQorCisvKiAgQiBPIE8gTCBFIFggUCAgLS0gIEV2YWx1YXRlIGEgQm9vbGVhbiBleHByZXNzaW9uICAqLworCisjZGVmaW5lIEJPT0xMRU4gMTAyNAorc3RhdGljIGNoYXIgYm9vbHZhbFtCT09MTEVOXTsKKworaW50Citib29sZXhwKGN4KSBpbnQgY3g7IHsKKyAgICBpbnQgeCwgeSwgejsgY2hhciAqcywgKnA7CisgICAgaW50IHBhcmVucyA9IDAsIHBjb3VudCA9IDAsIGVjb3VudCA9IDA7CisgICAgY2hhciAqcSwgKmJ4OworICAgIHN0cnVjdCBGREIga3csIG51OworI2lmZGVmIEZORkxPQVQKKyAgICBzdHJ1Y3QgRkRCIGZsOworICAgIENLRkxPQVQgZjEgPSAwLjAsIGYyID0gMC4wOworICAgIGludCBmMWZsYWcgPSAwLCBmMmZsYWcgPSAwOworI2VuZGlmIC8qIEZORkxPQVQgKi8KKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IGtleW1hYzsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIG5vdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIHdoZXRoZXIgIk5PVCIgd2FzIHNlZW4gKi8KKyAgICB6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsIElGIGNvbmRpdGlvbiAqLworICAgIGlmYXJncyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IG9mIElGIGNvbmRpdGlvbiB3b3JkcyAqLworICAgIGJ4ID0gYm9vbHZhbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgYm9vbGVhbiB2YWx1ZSAqLworICAgICpieCA9IE5VTDsKKworICBpZmFnYWluOgorICAgIGNtZmRiaSgma3csICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IEZEQiAtIGNvbW1hbmQgc3dpdGNoZXMgKi8KKyAgICAgICAgICAgX0NNS0VZLCAgICAgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAiTnVtYmVyLCBudW1lcmljLXZhbHVlZCB2YXJpYWJsZSwgQm9vbGVhbiBleHByZXNzaW9uLCBvciBrZXl3b3JkIiwKKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgbmlmLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IHNpbGVudCAqLworICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgaWZ0YWIsICAgICAgICAgICAgICAgICAgICAgICAvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgICAgICZudSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICApOworICAgIGNtZmRiaSgmbnUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDJuZCBGREIgLSBBbiBpbnRlZ2VyICovCisgICAgICAgICAgIF9DTU5VTSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgMCwKKyAgICAgICAgICAgMCwKKyAgICAgICAgICAgeHhzdHJpbmcsCisgICAgICAgICAgIE5VTEwsCisjaWZkZWYgRk5GTE9BVAorICAgICAgICAgICAmZmwKKyNlbHNlCisgICAgICAgICAgIE5VTEwKKyNlbmRpZiAvKiBGTkZMT0FUICovCisgICAgICAgICAgICk7CisjaWZkZWYgRk5GTE9BVAorICAgIGNtZmRiaSgmZmwsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEgZmxvYXRpbmctcG9pbnQgbnVtYmVyICovCisgICAgICAgICAgIF9DTUZMRCwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisgICAgICAgICAgIHh4c3RyaW5nLAorICAgICAgICAgICBOVUxMLAorICAgICAgICAgICBOVUxMCisgICAgICAgICAgICk7CisjZW5kaWYgLyogRk5GTE9BVCAqLworICAgIHggPSBjbWZkYigma3cpOyAgICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIGEga2V5d29yZCBvciBhIG51bWJlciAqLworICAgIGRlYnVnKEYxMTEsImJvb2x2YWwgY21mZGIiLCIiLHgpOworICAgIGlmICh4IDwgMCkgeworICAgICAgICBpZiAoeCA9PSAtMykKKyAgICAgICAgICB4ID0gLTI7CisgICAgICAgIHJldHVybih4KTsKKyAgICB9CisgICAgZGVidWcoRjExMSwiYm9vbHZhbCBzd2l0Y2giLCIiLGNtcmVzdWx0LmZjb2RlKTsKKyAgICBzd2l0Y2ggKGNtcmVzdWx0LmZjb2RlKSB7ICAgICAgICAgICAvKiBXaGF0IGRpZCB3ZSBnZXQ/ICovCisjaWZkZWYgRk5GTE9BVAorICAgICAgY2FzZSBfQ01GTEQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIEEgImZpZWxkIiAqLworICAgICAgICBpZiAoaXNmbG9hdChjbXJlc3VsdC5zcmVzdWx0LDApKSB7IC8qIEEgZmxvYXRpbmctcG9pbnQgbnVtYmVyPyAqLworICAgICAgICAgICAgZjEgPSBmbG9hdHZhbDsgICAgICAgICAgICAgIC8qIFllcywgZ2V0IGl0cyB2YWx1ZSAqLworICAgICAgICAgICAgZjFmbGFnID0gMTsgICAgICAgICAgICAgICAgIC8qIHJlbWVtYmVyIHdlIGRpZCB0aGlzICovCisgICAgICAgICAgICBpZmMgPSA5OTk5OyAgICAgICAgICAgICAgICAgLyogU2V0IHNwZWNpYWwgImlmLWNvZGUiICovCisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHJldHVybigtMik7CisjZW5kaWYgLyogRk5GTE9BVCAqLworICAgICAgY2FzZSBfQ01OVU06ICAgICAgICAgICAgICAgICAgICAgIC8qIEEgbnVtYmVyLi4uICovCisgICAgICAgIGlmYyA9IDk5OTk7ICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHNwZWNpYWwgImlmLWNvZGUiICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBfQ01LRVk6ICAgICAgICAgICAgICAgICAgICAgIC8qIEEga2V5d29yZCAqLworICAgICAgICBpZmMgPSBjbXJlc3VsdC5ucmVzdWx0OyAgICAgICAgIC8qIEdldCBpZi1jb2RlICovCisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9CisgICAgc3dpdGNoIChpZmMpIHsgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHogPSAxIGZvciB0cnVlLCAwIGZvciBmYWxzZSAqLworICAgICAgY2FzZSA5OTk5OiAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciAqLworI2lmZGVmIEZORkxPQVQKKyAgICAgICAgaWYgKGYxZmxhZykgeworICAgICAgICAgICAgeiA9IChmMSA9PSAwLjApID8gMCA6IDE7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIEZORkxPQVQgKi8KKyAgICAgICAgeiA9IChjbXJlc3VsdC5ucmVzdWx0ID09IDApID8gMCA6IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYWElGTFA6ICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgcGFyZW4gKi8KKyAgICAgICAgaWYgKHBjb3VudCA9PSAwICYmIGlmYXJncyA+IDApCisgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgcGFyZW5zID0gMTsKKyAgICAgICAgcGNvdW50Kys7CisgICAgICAgIGlmYXJncysrOworICAgICAgICAqYngrKyA9ICcoJzsKKyAgICAgICAgZ290byBpZmFnYWluOworICAgICAgY2FzZSBYWElGUlA6ICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IHBhcmVuICovCisgICAgICAgIGlmICghcGFyZW5zKQorICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIGlmICgtLXBjb3VudCA8IDApCisgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgaWZhcmdzKys7CisgICAgICAgICpieCsrID0gJyknOworICAgICAgICAqYnggPSBOVUw7CisgICAgICAgIGlmIChwY291bnQgPT0gMCkKKyAgICAgICAgICBnb3RvIGlmZW5kOworICAgICAgICBnb3RvIGlmYWdhaW47CisgICAgICBjYXNlIFhYSUZBTjogICAgICAgICAgICAgICAgICAgICAgLyogQU5EICgmJikgKi8KKyAgICAgICAgaWZhcmdzKys7CisgICAgICAgIGlmICghZWNvdW50KQorICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICpieCsrID0gJyYnOworICAgICAgICBnb3RvIGlmYWdhaW47CisgICAgICBjYXNlIFhYSUZPUjogICAgICAgICAgICAgICAgICAgICAgLyogT1IgKHx8KSAqLworICAgICAgICBpZmFyZ3MrKzsKKyAgICAgICAgaWYgKCFlY291bnQpCisgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgKmJ4KysgPSAnfCc7CisgICAgICAgIGdvdG8gaWZhZ2FpbjsKKyAgICAgIGNhc2UgWFhJRk5POiAgICAgICAgICAgICAgICAgICAgICAvKiBJRiBOT1QgWyBOT1QgWyBOT1QgLi4uIF0gXSAqLworICAgICAgICBpZiAoYnggPiBib29sdmFsKSB7ICAgICAgICAgICAgIC8qIGV2YWxhKCkgZG9lc24ndCBsaWtlIGNhc2NhZGVkICovCisgICAgICAgICAgICBpZiAoKihieC0xKSA9PSAnIScpIHsgICAgICAgLyogdW5hcnkgb3BlcmF0b3JzLi4uICovCisgICAgICAgICAgICAgICAgKihieC0xKSA9IE5VTDsgICAgICAgICAgLyogU28gaGVyZSwgdHdvIHdyb25ncyBtYWtlIGEgcmlnaHQuICovCisgICAgICAgICAgICAgICAgYngtLTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ4KysgPSAnISc7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYngrKyA9ICchJzsKKyAgICAgICAgfQorICAgICAgICBpZmFyZ3MrKzsKKyAgICAgICAgZ290byBpZmFnYWluOworICAgICAgY2FzZSBYWElGVFI6ICAgICAgICAgICAgICAgICAgICAgIC8qIElGIFRSVUUgKi8KKyAgICAgICAgeiA9IDE7CisgICAgICAgIGRlYnVnKEYxMDEsImlmIHRydWUiLCIiLHopOworICAgICAgICBpZmFyZ3MgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhYSUZOVDogICAgICAgICAgICAgICAgICAgICAgLyogSUYgRkFMU0UgKi8KKyAgICAgICAgeiA9IDA7CisgICAgICAgIGRlYnVnKEYxMDEsImlmIHRydWUiLCIiLHopOworICAgICAgICBpZmFyZ3MgKz0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhYSUZTVTogICAgICAgICAgICAgICAgICAgICAgLyogSUYgU1VDQ0VTUyAqLworICAgICAgICB6ID0gKCBzdWNjZXNzICE9IDAgKSA/IDEgOiAwOworICAgICAgICBkZWJ1ZyhGMTAxLCJpZiBzdWNjZXNzIiwiIix6KTsKKyAgICAgICAgaWZhcmdzICs9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYWElGRkE6ICAgICAgICAgICAgICAgICAgICAgIC8qIElGIEZBSUxVUkUgKi8KKyAgICAgICAgeiA9ICggc3VjY2VzcyA9PSAwICkgPyAxIDogMDsKKyAgICAgICAgZGVidWcoRjEwMSwiaWYgZmFpbHVyZSIsIiIseik7CisgICAgICAgIGlmYXJncyArPSAxOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYWElGREU6ICAgICAgICAgICAgICAgICAgICAgIC8qIElGIERFRklORUQgKi8KKyAgICAgICAgaWYgKCh4ID0gY21mbGQoIk1hY3JvIG9yIHZhcmlhYmxlIG5hbWUiLCIiLCZzLE5VTEwpKSA8IDApCisgICAgICAgICAgcmV0dXJuKCh4ID09IC0zKSA/IC0yIDogeCk7CisKKyAgICAgICAgaWYgKCpzID09IENNRFEpIHsKKyAgICAgICAgICAgIGNoYXIgKiBscDsKKyAgICAgICAgICAgIGNoYXIgbGluZVsyNTZdOworICAgICAgICAgICAgaW50IHQsIHg7CisgICAgICAgICAgICBpZiAoKihzKzEpID09ICdmJyB8fCAqKHMrMSkgPT0gJ0YnKSB7IC8qIEJ1aWx0LWluIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgZm5jdGFiW107CisgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBuZnVuY3M7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmUscysyLDI1Nik7CisgICAgICAgICAgICAgICAgaWYgKGxpbmVbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgbHAgPSBja3N0cmNocihsaW5lLCcoJyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChscCkgKmxwID0gTlVMOworICAgICAgICAgICAgICAgICAgICB4ID0gbG9va3VwKGZuY3RhYixsaW5lLG5mdW5jcywmdCk7CisgICAgICAgICAgICAgICAgICAgIHogPSB4ID4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImlmIGRlZmluZWQgZnVuY3Rpb24iLGxpbmUseik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCoocysxKSA9PSAndicgfHwgKihzKzEpID09ICdWJykgeyAvKiA4LjAuMjAwICovCisgICAgICAgICAgICAgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgdmFydGFiW107CisgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBudmFyczsKKyAgICAgICAgICAgICAgICB6ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoKihzKzIpID09ICcoJykgeworICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkobGluZSxzKzMsMjU2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwID0gY2tzdHJjaHIobGluZSwnKScpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxwKSAqbHAgPSBOVUw7CisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gbG9va3VwKHZhcnRhYixsaW5lLG52YXJzLCZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHogPSB4ID4gLTE7CisJCQlpZiAoeikgewkvKiA4LjAuMjAzICovCisJCQkgICAgaW50IHQ7CS8qIEl0IG11c3QgaGF2ZSBhIHZhbHVlIHRvIHN1Y2NlZWQgKi8KKwkJCSAgICB0ID0gMjU1OwkvKiBhcyBpbiBDLUtlcm1pdCA2LjAgYW5kIDcuMCAqLworCQkJICAgIGxwID0gbGluZTsJLyogKHRoaXMgd2FzIGJyb2tlbiBpbiA4LjAuMjAwLTIwMSkgKi8KKwkJCSAgICB6enN0cmluZyhzLCZscCwmdCk7CisJCQkgICAgdCA9IHN0cmxlbihsaW5lKTsKKwkJCSAgICB6ID0gbGluZVswXSA/IDEgOiAwOworCQkJfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImlmIGRlZmluZWQgdmFyaWFibGUiLGxpbmUseik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHogPSBjaGt2YXIocyk7ICAgICAgICAgIC8qIFN0YXJ0cyB3aXRoIGJhY2tzbGFzaCAqLworICAgICAgICAgICAgICAgIGlmICh6ID4gMCkgeyAgICAgICAgICAgIC8qIFllcy4uLiAqLworICAgICAgICAgICAgICAgICAgICB0ID0gMjU1OyAgICAgICAgICAgIC8qIHRoYW4gYnVmZmVyIHNvIGlmIHp6c3RyaW5nIGZhaWxzICAqLworICAgICAgICAgICAgICAgICAgICBscCA9IGxpbmU7ICAgICAgICAgIC8qIGNoZWNrIGZvciB0aGF0IC0tIG92ZXJmbG93IG1lYW5zICovCisgICAgICAgICAgICAgICAgICAgIGxpbmVbMF0gPSBOVUw7ICAgICAgLyogdGhlIHF1YW50aXR5IGlzIGRlZmluZWQuICovCisgICAgICAgICAgICAgICAgICAgIHggPSB6enN0cmluZyhzLCZscCwmdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoeCA8IDAgJiYgdCAhPSAyNTUpIHx8ICFsaW5lWzBdKQorICAgICAgICAgICAgICAgICAgICAgIHogPSAwOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJpZiBkZWZpbmVkIHp6c3RyaW5nIixsaW5lLHopOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJpZiBkZWZpbmVkIHp6c3RyaW5nIHQiLCIiLHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHogPSAobXhsb29rKG1hY3RhYixzLG5tYWMpID4gLTEpOyAvKiBMb29rIGZvciBleGFjdCBtYXRjaCAqLworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTEsImlmIGRlZmluZWQgZmluYWwiLHMseik7CisgICAgICAgIGlmYXJncyArPSAyOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYWElGREM6IHsgICAgICAgICAgICAgICAgICAgIC8qIElGIERFQ0xBUkVEICovCisgICAgICAgICAgY2hhciAqIGxwOworICAgICAgICAgIGNoYXIgbGluZVszMl07CisgICAgICAgICAgaW50IGosIGssIHQsIHg7CisgICAgICAgICAgaWYgKCh4ID0gY21mbGQoIkFycmF5IG5hbWUiLCIiLCZzLE5VTEwpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oKHggPT0gLTMpID8gLTIgOiB4KTsKKyAgICAgICAgICBpZiAoKnMgPT0gQ01EUSkgeworICAgICAgICAgICAgICBpZiAoKihzKzEpICE9ICcmJykgeworICAgICAgICAgICAgICAgICAgdCA9IDMxOworICAgICAgICAgICAgICAgICAgbHAgPSBsaW5lOworICAgICAgICAgICAgICAgICAgbGluZVswXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgIHggPSB6enN0cmluZyhzLCZscCwmdCk7CisgICAgICAgICAgICAgICAgICBzID0gbGluZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICB6ID0gMDsKKyAgICAgICAgICBpZiAoKHggPSBhcnJheWJvdW5kcyhzLCZqLCZrKSkgPiAtMSkgeworICAgICAgICAgICAgICBpZiAoYV9wdHJbeF0pIHsKKyAgICAgICAgICAgICAgICAgIGlmIChqIDwgMSkKKyAgICAgICAgICAgICAgICAgICAgeiA9IDE7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqIDw9IGFfZGltW3hdKQorICAgICAgICAgICAgICAgICAgICB6ID0gMTsKKyAgICAgICAgICAgICAgICAgIGlmICh6ID09IDEgJiYgayA+IGFfZGltW3hdKQorICAgICAgICAgICAgICAgICAgICB6ID0gMDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgWFhJRkJHOiAgICAgICAgICAgICAgICAgICAgICAvKiBJRiBCQUNLR1JPVU5EICovCisgICAgICBjYXNlIFhYSUZGRzogICAgICAgICAgICAgICAgICAgICAgLyogSUYgRk9SRUdST1VORCAqLworICAgICAgICBiZ2NoaygpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGJhY2tncm91bmQgc3RhdHVzICovCisgICAgICAgIGlmIChpZmMgPT0gWFhJRkZHKSAgICAgICAgICAgICAgLyogRm9yZWdyb3VuZCAqLworICAgICAgICAgIHogPSBwZmxhZyA/IDEgOiAwOworICAgICAgICBlbHNlIHogPSBwZmxhZyA/IDAgOiAxOyAgICAgICAgIC8qIEJhY2tncm91bmQgKi8KKyAgICAgICAgaWZhcmdzICs9IDE7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhYSUZDTzogICAgICAgICAgICAgICAgICAgICAgLyogSUYgQ09VTlQgKi8KKyAgICAgICAgeiA9ICggLS1jb3VudFtjbWRsdmxdID4gMCApOworICAgICAgICBpZiAoY3ggPT0gWFhXSEkpIGNvdW50W2NtZGx2bF0gKz0gMjsgLyogRG9uJ3QgYXNrLi4uICovCisgICAgICAgIGRlYnVnKEYxMDEsImlmIGNvdW50IiwiIix6KTsKKyAgICAgICAgaWZhcmdzICs9IDE7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhYSUZFWDogICAgICAgICAgICAgICAgICAgICAgLyogSUYgRVhJU1QgKi8KKyNpZmRlZiBDS19UTVBESVIKKyAgICAgIGNhc2UgWFhJRkRJOiAgICAgICAgICAgICAgICAgICAgICAvKiBJRiBESVJFQ1RPUlkgKi8KKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKyAgICAgIGNhc2UgWFhJRkFCOiAgICAgICAgICAgICAgICAgICAgICAvKiBJRiBBQlNPTFVURSAqLworICAgICAgICBpZiAoKHggPSBjbWZsZCgKKyAgICAgICAgICAgICAgICAgICAgICAgKChpZmMgPT0gWFhJRkRJKSA/ICJEaXJlY3RvcnkgbmFtZSIgOiAiRmlsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAiIiwmcywKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAvKiBUaGlzIGFsbG93cyBcJ3MgaW4gZmlsZW5hbWVzICovCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICAgICApKSA8IDApIHsKKyAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBjbWZsZ3M7CisgICAgICAgICAgICAgICAgaWYgKGNtZmxncyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0ZpbGUgb3IgZGlyZWN0b3J5IG5hbWUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSByZXR1cm4oeCk7CisgICAgICAgIH0KKyAgICAgICAgcyA9IGJyc3RyaXAocyk7CisgICAgICAgIGlmIChpZmMgPT0gWFhJRkFCKSB7CisgICAgICAgICAgICB6ID0gaXNhYnNvbHV0ZShzKTsKKyAgICAgICAgfSBlbHNlIGlmIChpZmMgPT0gWFhJRkVYKSB7CisgICAgICAgICAgICB6ID0gKHpnZXRmcyhzKSA+IC0xTCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJpZiBleGlzdCAxIiwiIix6KTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGlmICgheikgeyAgICAgICAgICAgICAgICAgICAvKiBGaWxlIG5vdCBmb3VuZC4gKi8KKyAgICAgICAgICAgICAgICBpbnQgdDsgICAgICAgICAgICAgICAgICAvKiBUcnkgZXhwYW5kaW5nIHZhcmlhYmxlcyAqLworICAgICAgICAgICAgICAgIHQgPSBMSU5CVUZTSVotMTsgICAgICAgIC8qIGFuZCBsb29raW5nIGFnYWluLiAqLworICAgICAgICAgICAgICAgIGxwID0gbGluZTsKKyAgICAgICAgICAgICAgICB6enN0cmluZyhzLCZscCwmdCk7CisgICAgICAgICAgICAgICAgcyA9IGxpbmU7CisgICAgICAgICAgICAgICAgeiA9ICggemNoa2kocykgPiAtMUwgKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJpZiBleGlzdCAyIiwiIix6KTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBDS19UTVBESVIKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgIHogPSAoemNoa2kocykgPT0gLTIpCisjZWxzZQorLyogQmVjYXVzZSB0aGlzIGRvZXNuJ3QgY2F0Y2ggJERJU0sxOltGT09dQkxBSC5ESVI7MSAqLworICAgICAgICAgICAgeiA9IGlzZGlyKHMpCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgIHx8IChpc2FscGhhKHNbMF0pICYmIHNbMV0gPT0gJzonICYmIHNbMl0gPT0gTlVMKQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICAgICAgICA7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJpZiBkaXJlY3RvcnkgMSIsIiIseik7CisKKyAgICAgICAgICAgIGlmICgheikgewkJCS8qIEZpbGUgbm90IGZvdW5kLiAqLworICAgICAgICAgICAgICAgIGludCB0OyAgICAgICAgICAgICAgICAgIC8qIFRyeSBleHBhbmRpbmcgdmFyaWFibGVzICovCisgICAgICAgICAgICAgICAgdCA9IExJTkJVRlNJWi0xOyAgICAgICAgLyogYW5kIGxvb2tpbmcgYWdhaW4uICovCisgICAgICAgICAgICAgICAgbHAgPSBsaW5lOworICAgICAgICAgICAgICAgIHp6c3RyaW5nKHMsJmxwLCZ0KTsKKyAgICAgICAgICAgICAgICBzID0gbGluZTsKKyAgICAgICAgICAgICAgICB6ID0gaXNkaXIocykKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgIHx8IChpc2FscGhhKHNbMF0pICYmIHNbMV0gPT0gJzonICYmIHNbMl0gPT0gTlVMKQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiaWYgZGlyZWN0b3J5IDIiLCIiLHopOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX1RNUERJUiAqLworICAgICAgICB9CisgICAgICAgIGlmYXJncyArPSAyOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYWElGRVE6ICAgICAgICAgICAgICAgICAgICAgIC8qIElGIEVRVUFMIChzdHJpbmcgY29tcGFyaXNvbikgKi8KKyAgICAgIGNhc2UgWFhJRkxMOiAgICAgICAgICAgICAgICAgICAgICAvKiBJRiBMZXhpY2FsbHkgTGVzcyBUaGFuICovCisgICAgICBjYXNlIFhYSUZMRzogICAgICAgICAgICAgICAgICAgICAgLyogSWYgTGV4aWNhbGx5IEdyZWF0ZXIgVGhhbiAqLworICAgICAgICBpZiAoKHggPSBjbWZsZCgiZmlyc3Qgd29yZCBvciB2YXJpYWJsZSBuYW1lIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9UZXh0IHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfSBlbHNlIHJldHVybih4KTsKKyAgICAgICAgfQorICAgICAgICBzID0gYnJzdHJpcChzKTsgICAgICAgICAgICAgICAgIC8qIFN0cmlwIGJyYWNlcyAqLworICAgICAgICB4ID0gKGludClzdHJsZW4ocyk7CisgICAgICAgIGlmICh4ID4gTElOQlVGU0laLTEpIHsKKyAgICAgICAgICAgIHByaW50ZigiP0lGOiBzdHJpbmdzIHRvbyBsb25nXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICAgICAgbHAgPSBsaW5lOyAgICAgICAgICAgICAgICAgICAgICAvKiBscCBwb2ludHMgdG8gZmlyc3Qgc3RyaW5nICovCisgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKyAgICAgICAgaWYgKCh5ID0gY21mbGQoInNlY29uZCB3b3JkIG9yIHZhcmlhYmxlIG5hbWUiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoeSA9PSAtMykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1RleHQgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9IGVsc2UgcmV0dXJuKHkpOworICAgICAgICB9CisgICAgICAgIHMgPSBicnN0cmlwKHMpOworICAgICAgICB5ID0gKGludClzdHJsZW4ocyk7CisgICAgICAgIGlmICh4ICsgeSArIDIgPiBMSU5CVUZTSVopIHsKKyAgICAgICAgICAgIHByaW50ZigiP0lGOiBzdHJpbmdzIHRvbyBsb25nXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICAgICAgdHAgPSBscCArIHggKyAyOyAgICAgICAgICAgICAgICAvKiB0cCBwb2ludHMgdG8gc2Vjb25kIHN0cmluZyAqLworICAgICAgICBzdHJjcHkodHAscyk7ICAgICAgICAgICAgICAgICAgIC8qIHNhZmUgKGNoZWNrZWQpICovCisgICAgICAgIHggPSBja3N0cmNtcChscCx0cCwtMSxpbnBjYXNbY21kbHZsXSk7IC8qIFVzZSBsb25nZXN0IGxlbmd0aCAqLworICAgICAgICBzd2l0Y2ggKGlmYykgeworICAgICAgICAgIGNhc2UgWFhJRkVROiAgICAgICAgICAgICAgICAgIC8qIElGIEVRVUFMIChzdHJpbmcgY29tcGFyaXNvbikgKi8KKyAgICAgICAgICAgIHogPSAoeCA9PSAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgWFhJRkxMOiAgICAgICAgICAgICAgICAgIC8qIElGIExleGljYWxseSBMZXNzIFRoYW4gKi8KKyAgICAgICAgICAgIHogPSAoeCA8IDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBYWElGTEc6ICAgICAgICAgICAgICAgICAgLyogSWYgTGV4aWNhbGx5IEdyZWF0ZXIgVGhhbiAqLworICAgICAgICAgICAgeiA9ICh4ID4gMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTAxLCJJRiBFUSByZXN1bHQiLCIiLHopOworICAgICAgICBpZmFyZ3MgKz0gMzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgWFhJRlZFOiAgICAgICAgICAgICAgICAgICAgICAvKiBJRiBWRVJTSU9OICovCisgICAgICBjYXNlIFhYSUZBRTogICAgICAgICAgICAgICAgICAgICAgLyogSUYgKGFyaXRobWV0aWNhbGx5KSA9ICovCisgICAgICBjYXNlIFhYSUZOUTogICAgICAgICAgICAgICAgICAgICAgLyogSUYgIT0gKG5vdCBhcml0aG1ldGljYWxseSBlcXVhbCkgKi8KKyAgICAgIGNhc2UgWFhJRkxUOiAgICAgICAgICAgICAgICAgICAgICAvKiBJRiA8ICAqLworICAgICAgY2FzZSBYWElGTEU6ICAgICAgICAgICAgICAgICAgICAgIC8qIElGIDw9ICovCisgICAgICBjYXNlIFhYSUZHRTogICAgICAgICAgICAgICAgICAgICAgLyogSUYgPj0gKi8KKyAgICAgIGNhc2UgWFhJRkdUOiB7ICAgICAgICAgICAgICAgICAgICAvKiBJRiA+ICAqLworCisgICAgICAgIC8qIFJlYWxseSBzaG91bGQgdXNlIGxvbmdzIGhlcmUuLi4gKi8KKyAgICAgICAgLyogQnV0IGNtbnVtIHBhcnNlcyBpbnRzLiAqLworICAgICAgICBpbnQgeHgsIG4xID0gMCwgbjIgPSAwOworICAgICAgICBpZiAoaWZjID09IFhYSUZWRSkgeworICAgICAgICAgICAgbjEgPSAoaW50KSB2ZXJudW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4ID0gY21mbGQoImZpcnN0IG51bWJlciBvciB2YXJpYWJsZSBuYW1lIiwiIiwmcyx4eHN0cmluZyk7CisgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1F1YW50aXR5IHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHggPCAwKSByZXR1cm4oeCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ4eGlmZ3QgY21mbGQiLCIiLHgpOworICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICAgICAgbHAgPSBicnN0cmlwKGxpbmUpOworICAgICAgICAgICAgZGVidWcoRjExMCwieHhpZmd0IGV4cDEiLGxwLDApOworCisvKiBUaGUgZm9sbG93aW5nIGJpdCBpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBNUy1ET1MgS2VybWl0ICovCisKKyAgICAgICAgICAgIGlmICghY2tzdHJjbXAobHAsImNvdW50Iiw1LDApKSB7CisgICAgICAgICAgICAgICAgbjEgPSBjb3VudFtjbWRsdmxdOworICAgICAgICAgICAgfSBlbHNlIGlmICghY2tzdHJjbXAobHAsInZlcnNpb24iLDcsMCkpIHsKKyAgICAgICAgICAgICAgICBuMSA9IChpbnQpIHZlcm51bTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNrc3RyY21wKGxwLCJhcmdjIiw0LDApKSB7CisgICAgICAgICAgICAgICAgbjEgPSAoaW50KSBtYWNhcmdjW21hY2x2bF07CisgICAgICAgICAgICB9IGVsc2UgeworCisvKiBFbmQgb2YgY29tcGF0aWJpbGl0eSBiaXQgKi8KKworI2lmZGVmIEZORkxPQVQKKyAgICAgICAgICAgICAgICBpZiAoaXNmbG9hdChscCwwKSA+IDEpIHsgLyogQWxsb3cgZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgZjEgPSBmbG9hdHZhbDsKKyAgICAgICAgICAgICAgICAgICAgZjFmbGFnID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBGTkZMT0FUICovCisgICAgICAgICAgICAgICAgICBpZiAoY2hrbnVtKGxwKSkgeworICAgICAgICAgICAgICAgICAgICAgIG4xID0gYXRvaShscCk7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGFyaXRobWV0aWMgZXhwcmVzc2lvbiAqLworICAgICAgICAgICAgICAgICAgICAgIHEgPSBldmFsYShscCk7ICAgIC8qIGNtbnVtKCkgZG9lcyB0aGlzIGJ1dCAuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hrbnVtKHEpKSAgICAvKiB3ZSdyZSBub3QgdXNpbmcgY21udW0oKS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG4xID0gYXRvaShxKTsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHkgPSBjbWZsZCgibnVtYmVyIG9yIHZhcmlhYmxlIG5hbWUiLCIiLCZzLHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKHkgPT0gLTMpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1F1YW50aXR5IHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHMgPSBicnN0cmlwKHMpOworICAgICAgICBpZiAoISpzKSByZXR1cm4oLTIpOworICAgICAgICBpZiAoaWZjID09IFhYSUZWRSkgeworICAgICAgICAgICAgdHAgPSBsaW5lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeCA9IChpbnQpc3RybGVuKGxwKTsKKyAgICAgICAgICAgIHRwID0gbGluZSArIHggKyAyOworICAgICAgICB9CisgICAgICAgIGNrc3RybmNweSh0cCxzLExJTkJVRlNJWi14LTIpOworICAgICAgICBkZWJ1ZyhGMTEwLCJ4eGlmZ3QgZXhwMiIsdHAsMCk7CisgICAgICAgIGlmICghY2tzdHJjbXAodHAsImNvdW50Iiw1LDApKSB7CisgICAgICAgICAgICBuMiA9IGNvdW50W2NtZGx2bF07CisgICAgICAgIH0gZWxzZSBpZiAoIWNrc3RyY21wKHRwLCJ2ZXJzaW9uIiw3LDApKSB7CisgICAgICAgICAgICBuMiA9IChpbnQpIHZlcm51bTsKKyAgICAgICAgfSBlbHNlIGlmICghY2tzdHJjbXAodHAsImFyZ2MiLDQsMCkpIHsKKyAgICAgICAgICAgIG4yID0gKGludCkgbWFjYXJnY1ttYWNsdmxdOworICAgICAgICB9IGVsc2UgeworI2lmZGVmIEZORkxPQVQKKyAgICAgICAgICAgIGlmIChpc2Zsb2F0KHRwLDApID4gMSkgeworICAgICAgICAgICAgICAgIGYyID0gZmxvYXR2YWw7CisgICAgICAgICAgICAgICAgZjJmbGFnID0gMTsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIEZORkxPQVQgKi8KKyAgICAgICAgICAgIGlmIChjaGtudW0odHApKSB7CisgICAgICAgICAgICAgICAgbjIgPSBhdG9pKHRwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcSA9IGV2YWxhKHRwKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hrbnVtKHEpKQorICAgICAgICAgICAgICAgICAgbjIgPSBhdG9pKHEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeHggPSAoaWZjID09IFhYSUZWRSkgPyBYWElGR0UgOiBpZmM7CisKKyNpZmRlZiBGTkZMT0FUCisgICAgICAgIGlmIChmMWZsYWcgJiYgIWYyZmxhZykgeworICAgICAgICAgICAgZjIgPSAoQ0tGTE9BVCluMjsKKyAgICAgICAgICAgIGYyZmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGYyZmxhZyAmJiAhZjFmbGFnKQorICAgICAgICAgIGYxID0gKENLRkxPQVQpbjE7CisgICAgICAgIGlmIChmMWZsYWcpCisgICAgICAgICAgeiA9ICgoZjEgPCAgZjIgJiYgeHggPT0gWFhJRkxUKQorICAgICAgICAgICAgICAgfHwgKGYxICE9IGYyICYmIHh4ID09IFhYSUZOUSkKKyAgICAgICAgICAgICAgIHx8IChmMSA8PSBmMiAmJiB4eCA9PSBYWElGTEUpCisgICAgICAgICAgICAgICB8fCAoZjEgPT0gZjIgJiYgeHggPT0gWFhJRkFFKQorICAgICAgICAgICAgICAgfHwgKGYxID49IGYyICYmIHh4ID09IFhYSUZHRSkKKyAgICAgICAgICAgICAgIHx8IChmMSA+ICBmMiAmJiB4eCA9PSBYWElGR1QpKTsKKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEZORkxPQVQgKi8KKyAgICAgICAgICB6ID0gKChuMSA8ICBuMiAmJiB4eCA9PSBYWElGTFQpCisgICAgICAgICAgICAgICB8fCAobjEgIT0gbjIgJiYgeHggPT0gWFhJRk5RKQorICAgICAgICAgICAgICAgfHwgKG4xIDw9IG4yICYmIHh4ID09IFhYSUZMRSkKKyAgICAgICAgICAgICAgIHx8IChuMSA9PSBuMiAmJiB4eCA9PSBYWElGQUUpCisgICAgICAgICAgICAgICB8fCAobjEgPj0gbjIgJiYgeHggPT0gWFhJRkdFKQorICAgICAgICAgICAgICAgfHwgKG4xID4gIG4yICYmIHh4ID09IFhYSUZHVCkpOworICAgICAgICBkZWJ1ZyhGMTAxLCJ4eGlmZ2UgeiIsIiIseik7CisgICAgICAgIGlmIChpZmMgPT0gWFhJRlZFKQorICAgICAgICAgIGlmYXJncyArPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgaWZhcmdzICs9IDM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIFhYSUZOVTogICAgICAgICAgICAgICAgICAgICAgLyogSUYgTlVNRVJJQyAqLworICAgICAgICB4ID0gY21mbGQoInZhcmlhYmxlIG5hbWUgb3IgY29uc3RhbnQiLCIiLCZzLE5VTEwpOworICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgZXh0ZXJuIGludCBjbWZsZ3M7CisgICAgICAgICAgICBpZiAoY21mbGdzID09IDEpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9RdWFudGl0eSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh4IDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIHggPSBMSU5CVUZTSVotMTsKKyAgICAgICAgbHAgPSBsaW5lOworICAgICAgICB6enN0cmluZyhzLCZscCwmeCk7CisgICAgICAgIGxwID0gbGluZTsKKyAgICAgICAgZGVidWcoRjExMCwieHhpZm51IHF1YW50aXR5IixscCwwKTsKKyAgICAgICAgeiA9IGNoa251bShscCk7CisjaWZkZWYgQ09NTUVOVAorLyoKKyAgVGhpcyB3b3JrcywgYnV0IGl0J3Mgbm90IHdpc2UgLS0gSUYgTlVNRVJJQyBpcyBtb3N0bHkgdXNlZCB0byBzZWUgaWYgYQorICBzdHJpbmcgcmVhbGx5IGRvZXMgY29udGFpbiBvbmx5IG51bWVyaWMgY2hhcmFjdGVycy4gIElmIHRoZXkgd2FudCB0byBmb3JjZQorICBldmFsdWF0aW9uLCB0aGV5IGNhbiB1c2UgXGZldmFsKCkgb24gdGhlIGFyZ3VtZW50IHN0cmluZy4KKyovCisgICAgICAgIGlmICgheikgeyAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGEgbnVtYmVyICovCisgICAgICAgICAgICB4X2lmbnVtID0gMTsgICAgICAgICAgICAgICAgLyogQXZvaWQgImV2YWwiIGVycm9yIG1lc3NhZ2VzICovCisgICAgICAgICAgICBxID0gZXZhbGEobHApOyAgICAgICAgICAgICAgLyogTWF5YmUgaXQncyBhbiBleHByZXNzaW9uICovCisgICAgICAgICAgICB6ID0gY2hrbnVtKHEpOyAgICAgICAgICAgICAgLyogdGhhdCBldmFsdWF0ZXMgdG8gYSBudW1iZXIgKi8KKyAgICAgICAgICAgIHhfaWZudW0gPSAwOyAgICAgICAgICAgICAgICAvKiBQdXQgZXZhbCBtZXNzYWdlcyBiYWNrIHRvIG5vcm1hbCAqLworICAgICAgICAgICAgaWYgKHopIGRlYnVnKEYxMTAsInh4aWZudSBleHAiLGxwLDApOworICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJ4eGlmbnUgY2hrbnVtIiwiIix6KTsKKyAgICAgICAgaWZhcmdzICs9IDI7CisgICAgICAgIGJyZWFrOworCisjaWZkZWYgWkZDREFUCisgICAgICBjYXNlIFhYSUZORTogeyAgICAgICAgICAgICAgICAgICAgLyogSUYgTkVXRVIgKi8KKyAgICAgICAgY2hhciBkMVsyMF0sICogZDI7ICAgICAgICAgICAgICAvKiBCdWZmZXJzIGZvciAyIGRhdGVzICovCisgICAgICAgIGlmICgoeiA9IGNtaWZpKCJGaXJzdCBmaWxlIiwiIiwmcywmeSx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgIGNrc3RybmNweShkMSx6ZmNkYXQocyksMjApOworICAgICAgICBpZiAoKHogPSBjbWlmaSgiU2Vjb25kIGZpbGUiLCIiLCZzLCZ5LHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgZDIgPSB6ZmNkYXQocyk7CisgICAgICAgIGlmICgoaW50KXN0cmxlbihkMSkgIT0gMTcgfHwgKGludClzdHJsZW4oZDIpICE9IDE3KSB7CisgICAgICAgICAgICBwcmludGYoIj9GYWlsdXJlIHRvIGdldCBmaWxlIGRhdGVcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTEwLCJ4eGlmbmV3ZXIgZDEiLGQxLDApOworICAgICAgICBkZWJ1ZyhGMTEwLCJ4eGlmbmV3ZXIgZDIiLGQyLDApOworICAgICAgICB6ID0gKHN0cmNtcChkMSxkMikgPiAwKSA/IDEgOiAwOworICAgICAgICBkZWJ1ZyhGMTAxLCJ4eGlmbmV3ZXIiLCIiLHopOworICAgICAgICBpZmFyZ3MgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYgLyogWkZDREFUICovCisKKyNpZmRlZiBDS19JRlJPCisgICAgICBjYXNlIFhYSUZSTzogICAgICAgICAgICAgICAgICAgICAgLyogUkVNT1RFLU9OTFkgYWR2aXNvcnkgKi8KKyAgICAgICAgaWZhcmdzKys7CisjaWZkZWYgTk9MT0NBTAorICAgICAgICB6ID0gMTsKKyNlbHNlCisgICAgICAgIHogPSByZW1vbmx5OworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfSUZSTyAqLworCisgICAgICBjYXNlIFhYSUZBTDogICAgICAgICAgICAgICAgICAgICAgLyogQUxBUk0gKi8KKyAgICAgICAgaWZhcmdzKys7CisgICAgICAgIGRlYnVnKEYxMDEsIklGIEFMQVJNIGNrX2FsYXJtIiwiIixja19hbGFybSk7CisgICAgICAgIGRlYnVnKEYxMTAsIklGIEFMQVJNIGFscm1fZGF0ZSIsYWxybV9kYXRlLDApOworICAgICAgICBkZWJ1ZyhGMTEwLCJJRiBBTEFSTSBhbHJtX3RpbWUiLGFscm1fdGltZSwwKTsKKworICAgICAgICBpZiAoY2tfYWxhcm0gPCAxTCB8fCBhbHJtX2RhdGVbMF0gPCAnMCcgfHwgYWxybV90aW1lWzBdIDwgJzAnKSB7CisgICAgICAgICAgICB6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogQUxBUk0gbm90IFNFVCAqLworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNvIElGIEFMQVJNIGZhaWxzICovCisgICAgICAgIH0KKyAgICAgICAgLyogR2V0IGN1cnJlbnQgZGF0ZSBhbmQgdGltZSAqLworICAgICAgICBja3N0cm5jcHkodG1wYnVmLGNrY3Z0ZGF0ZSgiIiwxKSxUTVBCVUZTSVopOworICAgICAgICBzID0gdG1wYnVmOworICAgICAgICBzWzhdID0gTlVMOworICAgICAgICB6ID0gKGludCkgc3RybmNtcCh0bXBidWYsYWxybV9kYXRlLDgpOyAvKiBDb21wYXJlIGRhdGVzICovCisgICAgICAgIGRlYnVnKEYxMDEsIklGIEFMQVJNIGRhdGUgeiIsIiIseik7CisgICAgICAgIGlmICh6ID09IDApIHsgICAgICAgICAgICAgICAgICAgLyogRGF0ZXMgYXJlIHRoZSBzYW1lICovCisgICAgICAgICAgICAvKiBDb21wYXJlIHRpbWVzICovCisgICAgICAgICAgICB6ID0gKHRvZDJzZWModG1wYnVmKzkpID49IGF0b2woYWxybV90aW1lKSkgPyAxIDogLTE7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJJRiBBTEFSTSB0aW1lIHoiLCIiLHopOworICAgICAgICB9CisgICAgICAgIHRtcGJ1ZlswXSA9IE5VTDsgICAgICAgICAgICAgICAgLyogeiA+PSAwIGlmIGFsYXJtIGlzIHBhc3NlZCAqLworICAgICAgICB6ID0gKCh6ID49IDApID8gMSA6IDApOyAgICAgICAgIC8qIHogPCAgMCBvdGhlcndpc2UgKi8KKyAgICAgICAgZGVidWcoRjEwMSwiSUYgQUxBUk0gZmluYWwgeiIsIiIseik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhYSUZPUDogICAgICAgICAgICAgICAgICAgICAgLyogSUYgT1BFTiAqLworICAgICAgICBpZiAoKHggPSBjbWtleShpb3RhYixuaW90LCJmaWxlIG9yIGxvZyIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoeCA9PSA5OTk5IHx8IHggPT0gWlNURElPKSB7CisgICAgICAgICAgICBiZ2NoaygpOyAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgYmFja2dyb3VuZCBzdGF0dXMgKi8KKyAgICAgICAgICAgIHogPSBwZmxhZyA/IDEgOiAwOworICAgICAgICB9IGVsc2UgaWYgKHggPT0gODg4OCkgeworICAgICAgICAgICAgeiA9IGxvY2FsID8gdHRjaGsoKSA+IC0xIDogMDsKKyNpZmRlZiBDS0xPR0RJQUwKKyAgICAgICAgfSBlbHNlIGlmICh4ID09IDc3NzcpIHsKKyAgICAgICAgICAgIGV4dGVybiBpbnQgZGlhbG9nOworICAgICAgICAgICAgeiA9IGRpYWxvZyA/IDEgOiAwOworI2VuZGlmIC8qIENLTE9HRElBTCAqLworICAgICAgICB9IGVsc2UKKyAgICAgICAgICB6ID0gKGNoa2ZuKHgpID4gMCkgPyAxIDogMDsKKyAgICAgICAgaWZhcmdzICs9IDE7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhYSUZTRDogICAgICAgICAgICAgICAgICAgICAgLyogU3RhcnRlZC1Gcm9tLURpYWxlciAqLworI2lmZGVmIE9TMgorICAgICAgICB6ID0gU3RhcnRlZEZyb21EaWFsZXI7CisjZWxzZQorICAgICAgICB6ID0gMDsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgWFhJRlRNOiAgICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hbC1NYWNybyAqLworI2lmZGVmIE9TMgorICAgICAgICB6ID0gY21kc3RrW2NtZGx2bF0uY2NmbGdzICYgQ0ZfS01BQzsKKyNlbHNlCisgICAgICAgIHogPSAwOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYWElGRU06ICAgICAgICAgICAgICAgICAgICAgIC8qIEVtdWxhdGlvbiBpcyBhY3RpdmUgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgeiA9IDE7CisjZWxzZQorICAgICAgICB6ID0gMDsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgWFhJRklLOiAgICAgICAgICAgICAgICAgICAgICAvKiBSdW5uaW5nIGFzIElLU0Q/ICovCisgICAgICAgIHogPSBpbnNlcnZlcjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgWFhJRlRBOiAgICAgICAgICAgICAgICAgICAgICAvKiBDb25uZWN0aW9uIGlzIFRBUEkgKi8KKyAgICAgICAgeiA9IDA7CisjaWZuZGVmIE5PRElBTAorI2lmZGVmIENLX1RBUEkKKyAgICAgICAgaWYgKGxvY2FsICYmICFuZXR3b3JrICYmIHR0dGFwaSkKKyAgICAgICAgICB6ID0gMTsKKyNlbmRpZiAvKiBDS19UQVBJICovCisjZW5kaWYgLyogTk9ESUFMICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhYSUZNQTogICAgICAgICAgICAgICAgICAgICAgLyogSUYgTUFUQ0ggKi8KKyAgICAgICAgeCA9IGNtZmxkKCJTdHJpbmcgb3IgdmFyaWFibGUiLCIiLCZzLHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgIGV4dGVybiBpbnQgY21mbGdzOworICAgICAgICAgICAgaWYgKGNtZmxncyA9PSAxKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/U3RyaW5nIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHggPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICBzID0gYnJzdHJpcChsaW5lKTsKKyAgICAgICAgZGVidWcoRjExMCwieHhpZm1hIHN0cmluZyIsbGluZSwwKTsKKyAgICAgICAgeCA9IGNtZmxkKCJQYXR0ZXJuIiwiIiwmcCx4eHN0cmluZyk7CisgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICBleHRlcm4gaW50IGNtZmxnczsKKyAgICAgICAgICAgIGlmIChjbWZsZ3MgPT0gMSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1BhdHRlcm4gcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoeCA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBja3N0cm5jcHkodG1wYnVmLHAsVE1QQlVGU0laKTsKKyAgICAgICAgcCA9IGJyc3RyaXAodG1wYnVmKTsKKyAgICAgICAgZGVidWcoRjExMCwieHhpZm1hIHBhdHRlcm4iLHRtcGJ1ZiwwKTsKKyAgICAgICAgeiA9IGNrbWF0Y2gocCxzLGlucGNhc1tjbWRsdmxdLDEpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYWElGRkw6IHsgICAgICAgICAgICAgICAgICAgIC8qIElGIEZMQUcgKi8KKyAgICAgICAgICBleHRlcm4gaW50IG9vZmxhZzsKKyAgICAgICAgICB6ID0gb29mbGFnOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBYWElGQVY6IHsgICAgICAgICAgICAgICAgICAgIC8qIElGIEFWQUlMQUJMRSAqLworICAgICAgICAgIGlmICgoeCA9IGNta2V5KGF2YWlsdGFiLGF2YWlsdGFibiwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICBzd2l0Y2ggKHgpIHsKKyAgICAgICAgICAgIGNhc2UgQVZfS1JCNDoKKyAgICAgICAgICAgICAgeiA9IGNrX2tyYjRfaXNfaW5zdGFsbGVkKCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9LUkI1OgorICAgICAgICAgICAgICB6ID0gY2tfa3JiNV9pc19pbnN0YWxsZWQoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1NSUDoKKyAgICAgICAgICAgICAgeiA9IGNrX3NycF9pc19pbnN0YWxsZWQoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1NTTDoKKyAgICAgICAgICAgICAgeiA9IGNrX3NzbGVheV9pc19pbnN0YWxsZWQoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX05UTE06CisgICAgICAgICAgICAgIHogPSBja19udGxtX2lzX2luc3RhbGxlZCgpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfQ1JZUFRPOgorICAgICAgICAgICAgICB6ID0gY2tfY3J5cHRfaXNfaW5zdGFsbGVkKCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9TU0g6CisgICAgICAgICAgICAgIHogPSBja19zc2hfaXNfaW5zdGFsbGVkKCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgeiA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBYWElGQVQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIElGIEFTS1RJTUVPVVQgKi8KKyAgICAgICAgeiA9IGFza3RpbWVkb3V0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYWElGUkQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIElGIFJFQURBQkxFICovCisgICAgICBjYXNlIFhYSUZXUjogICAgICAgICAgICAgICAgICAgICAgLyogSUYgV1JJVEVBQkxFICovCisgICAgICAgIGlmICgoeCA9IGNtZmxkKCJGaWxlIG9yIGRpcmVjdG9yeSBuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICZzLAorI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgIC8qIFRoaXMgYWxsb3dzIFwncyBpbiBmaWxlbmFtZXMgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgICAgICkpIDwgMCkgeworICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBleHRlcm4gaW50IGNtZmxnczsKKyAgICAgICAgICAgICAgICBpZiAoY21mbGdzID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/RmlsZSBvciBkaXJlY3RvcnkgbmFtZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHJldHVybih4KTsKKyAgICAgICAgfQorICAgICAgICBzID0gYnJzdHJpcChzKTsKKy8qCisgIHpjaGtbaW9dKCkgZG8gbm90IGRvIHdoYXQgd2Ugd2FudCBoZXJlIGZvciBkaXJlY3Rvcmllcywgc28gd2Ugc2V0CisgIGEgZ2xvYmFsIGZsYWcgdGVsbGluZyBpdCB0byBiZWhhdmUgc3BlY2lhbGx5IGluIHRoaXMgY2FzZS4gIE90aGV3aXNlCisgIHdlJ2QgaGF2ZSB0byBjaGFuZ2UgdGhlIEFQSSBhbmQgY2hhbmdlIGFsbCBjaz9maW8uYyBtb2R1bGVzIGFjY29yZGluZ2x5LgorKi8KKyAgICAgICAgeSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnktYWdhaW4gY29udHJvbCAqLworI2lmZGVmIE9TMgorICBpZnJkYWdhaW46CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIGlmIChpZmMgPT0gWFhJRlJEKSB7ICAgICAgICAgICAgLyogSUYgUkVBREFCTEUgKi8KKyAgICAgICAgICAgIHpjaGtpZCA9IDE7CisgICAgICAgICAgICB6ID0gemNoa2kocykgPiAtMTsKKyAgICAgICAgICAgIHpjaGtpZCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoaWZjID09IFhYSUZXUikgeyAgICAgLyogSUYgV1JJVEVBQkxFICovCisgICAgICAgICAgICB6Y2hrb2QgPSAxOworICAgICAgICAgICAgeiA9IHpjaGtvKHMpID4gLTE7CisgICAgICAgICAgICB6Y2hrb2QgPSAwOworICAgICAgICB9CisjaWZkZWYgT1MyCisgICAgICAgIGlmICgheiAmJiAheSkgeyAgICAgICAgICAgICAgICAgLyogRmlsZSBub3QgZm91bmQuICovCisgICAgICAgICAgICBpbnQgdDsgICAgICAgICAgICAgICAgICAgICAgLyogVHJ5IGV4cGFuZGluZyB2YXJpYWJsZXMgKi8KKyAgICAgICAgICAgIHQgPSBMSU5CVUZTSVotMTsgICAgICAgICAgICAvKiBhbmQgbG9va2luZyBhZ2Fpbi4gKi8KKyAgICAgICAgICAgIGxwID0gbGluZTsKKyAgICAgICAgICAgIHp6c3RyaW5nKHMsJmxwLCZ0KTsKKyAgICAgICAgICAgIHMgPSBsaW5lOworICAgICAgICAgICAgeiA9IHpjaGtvKHMpID4gLTE7CisgICAgICAgICAgICB5Kys7CisgICAgICAgICAgICBnb3RvIGlmcmRhZ2FpbjsKKyAgICAgICAgfQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICBpZmFyZ3MgKz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhYSUZRVTogICAgICAgICAgICAgICAgICAgICAgLyogSUYgUVVJRVQgKi8KKyAgICAgICAgeiA9IHF1aWV0ID8gMSA6IDA7CisgICAgICAgIGRlYnVnKEYxMDEsImlmIHF1aWV0IiwiIix6KTsKKyAgICAgICAgaWZhcmdzICs9IDE7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhYSUZXSTogICAgICAgICAgICAgICAgICAgICAgLyogV0lMRCAqLworICAgICAgICBpZiAoKHggPSBjbWZsZCgiRmlsZSBzcGVjaWZpY2F0aW9uIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICB6ID0gaXN3aWxkKHMpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYWElGQ0s6ICAgICAgICAgICAgICAgICAgICAgIC8qIEMtS0VSTUlUICovCisjaWZkZWYgT1MyCisgICAgICAgIHogPSAwOworI2Vsc2UKKyAgICAgICAgeiA9IDE7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhYSUZLOTogICAgICAgICAgICAgICAgICAgICAgLyogSy05NSAqLworI2lmZGVmIE9TMgorICAgICAgICB6ID0gMTsKKyNlbHNlCisgICAgICAgIHogPSAwOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYWElGR1U6ICAgICAgICAgICAgICAgICAgICAgIC8qIEdVSSAqLworI2lmZGVmIEtVSQorICAgICAgICB6ID0gMTsKKyNlbHNlCisgICAgICAgIHogPSAwOworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYWElGTVM6ICAgICAgICAgICAgICAgICAgICAgIC8qIE1TLUtFUk1JVCAqLworICAgICAgICB6ID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgWFhJRkxPOiAgICAgICAgICAgICAgICAgICAgICAvKiBJRiBMT0NBTCAqLworICAgICAgICB6ID0gbG9jYWwgPyAxIDogMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgWFhJRkNNOiB7ICAgICAgICAgICAgICAgICAgICAvKiBJRiBDT01NQU5EICovCisgICAgICAgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgY21kdGFiW107CisgICAgICAgICAgZXh0ZXJuIGludCBuY21kOworICAgICAgICAgIGlmICgoeCA9IGNtZmxkKCJXb3JkIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICB6ID0gbG9va3VwKGNtZHRhYixzLG5jbWQsJnkpOworICAgICAgICAgIHogPSAoeiA9PSAtMiB8fCB6ID4gLTEpID8gMSA6IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisjaWZkZWYgQ0tGTE9BVAorICAgICAgY2FzZSBYWElGRlA6ICAgICAgICAgICAgICAgICAgICAgIC8qIElGIEZMT0FUICovCisgICAgICAgIGlmICgoeCA9IGNtZmxkKCJOdW1iZXIiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIGlmICh4ICE9IC0zKSAgICAgICAgICAgICAgICAgIC8qIGUuZy4gZW1wdHkgdmFyaWFibGUgKi8KKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgeiA9IGlzZmxvYXQocywwKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tGTE9BVCAqLworCisgICAgICBjYXNlIFhYSUZLQjogICAgICAgICAgICAgICAgICAgICAgLyogS0JISVQgKi8KKyAgICAgICAgeiA9IGNvbmNoaygpOworICAgICAgICBpZiAoeiA8IDApIHogPSAwOworICAgICAgICBpZiAoeiA+IDEpIHogPSAxOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYWElGS0c6IHsgICAgICAgICAgICAgICAgICAgIC8qIEtFUkJBTkcgKi8KKyAgICAgICAgICBleHRlcm4gaW50IGNmaWxlZjsKKyAgICAgICAgICB6ID0gKHhjbWRzcmMgPT0gMCkgPyAwIDogY2ZpbGVmOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvdWxkbid0IGhhcHBlbiAqLworICAgICAgICByZXR1cm4oLTIpOworICAgIH0gLyogZW5kIG9mIHN3aXRjaCAqLworCisgICAgaWYgKHopCisgICAgICAqYngrKyA9ICcxJzsKKyAgICBlbHNlCisgICAgICAqYngrKyA9ICcwJzsKKyAgICAqYnggPSBOVUw7CisgICAgaWYgKGJ4ID4gYm9vbHZhbCArIEJPT0xMRU4gLSAyKSB7CisgICAgICAgIHByaW50ZigiP0Jvb2xlYW4gZXhwcmVzc2lvbiB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICBlY291bnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHByZXNzaW9uIGNvdW50ZXIgKi8KKyAgICBkZWJ1ZyhGMTAxLCJib29sZXhwIHBhcmVucyIsIiIscGFyZW5zKTsKKyAgICBkZWJ1ZyhGMTAxLCJib29sZXhwIHBjb3VudCIsIiIscGNvdW50KTsKKyAgICBpZiAocGFyZW5zICYmIHBjb3VudCA+IDApCisgICAgICBnb3RvIGlmYWdhaW47CisKKyAgaWZlbmQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtb3JlIC0gZG9uZSAqLworICAgICpieCA9IE5VTDsKKyAgICB6ID0gYXRvaShldmFseChib29sdmFsKSk7CisgICAgZGVidWcoRjExMSwiYm9vbGV4cCBib29sdmFsIixib29sdmFsLHopOworICAgIHJldHVybih6KTsKK30KKworLyogIEQgTyBJIEYgIC0tICBEbyB0aGUgSUYgY29tbWFuZCAgKi8KKworaW50Citkb2lmKGN4KSBpbnQgY3g7IHsKKyAgICBpbnQgeCwgeSwgejsgY2hhciAqcywgKnA7CisgICAgY2hhciAqcTsKKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IGtleW1hYzsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIGRlYnVnKEYxMDEsImRvaWYgY3giLCIiLGN4KTsKKworICAgIHogPSBib29sZXhwKGN4KTsgICAgICAgICAgICAgICAgICAgIC8qIEV2YWx1YXRlIHRoZSBjb25kaXRpb24ocykgKi8KKyAgICBkZWJ1ZyhGMDEwLCJkb2lmIGNtZGJ1ZiIsY21kYnVmLDApOworICAgIGRlYnVnKEYxMDEsImRvaWYgYm9vbGV4cCIsIiIseik7CisgICAgaWYgKHogPCAwKQorICAgICAgcmV0dXJuKHopOworCisgICAgaWYgKGN4ID09IFhYSUYpIHsgICAgICAgICAgICAgICAgICAgLyogQWxsb3cgSUYgdG8gaGF2ZSBYSUYgc2VtYW50aWNzLiAqLworICAgICAgICBjaGFyICogcDsKKyAgICAgICAgcCA9IGNtcGVlaygpOworICAgICAgICBpZiAoIXApIHAgPSAiIjsKKyAgICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgICAgICBpZiAoKnAgPT0gU1AgfHwgKnAgPT0gSFQpCisgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpwID09ICd7JykKKyAgICAgICAgICBjeCA9IFhYSUZYOworICAgIH0KKyAgICBzd2l0Y2ggKGN4KSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXBhcmF0ZSBoYW5kbGluZyBmb3IgSUYgYW5kIFhJRiAqLworCisgICAgICBjYXNlIFhYQVNTRVI6ICAgICAgICAgICAgICAgICAgICAgLyogQW5kIEFTU0VSVCAqLworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHopOworCisgICAgICBjYXNlIFhYSUY6ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBJRi4uLiAqLworICAgICAgICBpZmNtZFtjbWRsdmxdID0gMTsgICAgICAgICAgICAgIC8qIFdlIGp1c3QgY29tcGxldGVkIGFuIElGIGNvbW1hbmQgKi8KKyAgICAgICAgZGVidWcoRjEwMSwiZG9pZiBjb25kaXRpb24iLCIiLHopOworICAgICAgICBpZiAoeikgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbmRpdGlvbiBpcyB0cnVlICovCisgICAgICAgICAgICBpZnRlc3RbY21kbHZsXSA9IDE7ICAgICAgICAgLyogUmVtZW1iZXIgdGhhdCBJRiBzdWNjZWVkZWQgKi8KKyAgICAgICAgICAgIGlmIChtYWNsdmwgPiAtMSkgeyAgICAgICAgICAvKiBJbiBtYWNybywgKi8KKyAgICAgICAgICAgICAgICBwdXNoY21kKE5VTEwpOyAgICAgICAgICAvKiBzYXZlIHJlc3Qgb2YgY29tbWFuZC4gKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGxldmVsID4gLTEpIHsgICAvKiBJbiB0YWtlIGZpbGUsICovCisgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwgImRvaWY6IHB1c2hpbmcgY29tbWFuZCIsICIiLCAwKTsKKyAgICAgICAgICAgICAgICBwdXNoY21kKE5VTEwpOyAgICAgICAgICAvKiBzYXZlIHJlc3Qgb2YgY29tbWFuZC4gKi8KKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBJZiBpbnRlcmFjdGl2ZSwgKi8KKyAgICAgICAgICAgICAgICBjbWluaShja3hlY2gpOyAgICAgICAgICAvKiBqdXN0IHN0YXJ0IGEgbmV3IGNvbW1hbmQgKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAgICAvKiAobGlrZSBpbiBNUy1ET1MgS2VybWl0KSAqLworICAgICAgICAgICAgICAgIGlmIChwZmxhZykgcHJvbXB0KHh4c3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb25kaXRpb24gaXMgZmFsc2UgKi8KKyAgICAgICAgICAgIGlmdGVzdFtjbWRsdmxdID0gMDsgICAgICAgICAvKiBSZW1lbWJlciBjb21tYW5kIGZhaWxlZC4gKi8KKyAgICAgICAgICAgIGlmICgoeSA9IGNtdHh0KCJjb21tYW5kIHRvIGJlIGlnbm9yZWQiLCIiLCZzLE5VTEwpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih5KTsgICAgICAgICAgICAgICAgLyogR29iYmxlIHVwIHJlc3Qgb2YgbGluZSAqLworICAgICAgICB9CisgICAgICAgIHJldHVybigwKTsKKworICAgICAgY2FzZSBYWElGWDogeyAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgWElGIChFeHRlbmRlZCBJRikgKi8KKyAgICAgICAgICBjaGFyICpwOworICAgICAgICAgIGNoYXIgZVs1XTsKKyAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICBpZiAoKHkgPSBjbXR4dCgiT2JqZWN0IGNvbW1hbmQiLCIiLCZzLE5VTEwpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeSk7ICAgICAgICAgICAgICAgICAgLyogR2V0IG9iamVjdCBjb21tYW5kLiAqLworICAgICAgICAgIHAgPSBzOworICAgICAgICAgIGxwID0gbGluZTsKKyAgICAgICAgICBkZWJ1ZyhGMTEwLCJkb2lmIFRIRU4gcGFydCIscywtNTQpOworICAgICAgICAgIGlmIChsaXRjbWQoJnAsJmxwLExJTkJVRlNJWiAtIDEpIDwgMCkgeyAvKiBRdW90ZSBUSEVOLXBhcnQgKi8KKyAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVidWcoRjExMSwiZG9pZiBUSEVOIHBhcnQgMiIsbGluZSx6KTsKKworICAgICAgICAgIHdoaWxlICgqcCA9PSBTUCkgcCsrOyAgICAgICAgIC8qIFN0cmlwIHRyYWlsaW5nIHNwYWNlcyAqLworICAgICAgICAgIGlmY21kW2NtZGx2bF0gPSAwOyAgICAgICAgICAgIC8qIEFzc3VtZSBFTFNFIHBhcnQgaW4gc2FtZSBsaW5lICovCisgICAgICAgICAgaWZ0ZXN0W2NtZGx2bF0gPSB6ID8gMSA6IDA7CisgICAgICAgICAgaWYgKCpwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogQXQgZW5kPyAqLworICAgICAgICAgICAgICBpZiAoIXopIHsgICAgICAgICAgICAgICAgIC8qIE5vLCB1c2UgRUxTRS1wYXJ0LCBpZiBhbnkgKi8KKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIGVbaV0gPSAqcCsrOworICAgICAgICAgICAgICAgICAgaWYgKGNrc3RyY21wKGUsImVsc2UiLDQsMCkpIC8qIFNlZSBpZiB3ZSBoYXZlIGFuIEVMU0UgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0yKTsgICAgICAgICAvKiBTb21ldGhpbmcgZWxzZSAtIGVycm9yLiAqLworICAgICAgICAgICAgICAgICAgZGVidWcoRjAxMCwiZG9pZiBFTFNFIGxpbmUgMSIscCwwKTsKKyAgICAgICAgICAgICAgICAgIHdoaWxlICgqcCA9PSBTUCkgcCsrOyAvKiBTa2lwIHNwYWNlcyAqLworICAgICAgICAgICAgICAgICAgaWYgKCpwICE9ICd7JykgeyAgICAgIC8qIEJyYWNlIEVMU0UgcGFydCBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgICAgICAgICAgICAgICBja21ha21zZyh0bXBidWYsVE1QQlVGU0laLCJ7IixwLCIgfSIsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgcCA9IHRtcGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMDEwLCJkb2lmIEVMU0UgbGluZSAyIixwLDApOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgbHAgPSBsaW5lOyAgICAgICAgICAgIC8qIFdyaXRlIG92ZXIgVEhFTiBwYXJ0Li4uICovCisgICAgICAgICAgICAgICAgICAqbHAgPSBOVUw7ICAgICAgICAgICAgLyogd2l0aCBFTFNFIHBhcnQuICovCisgICAgICAgICAgICAgICAgICBpZiAobGl0Y21kKCZwLCZscCxMSU5CVUZTSVogLSAyKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgd2hpbGUgKCpwID09IFNQKSBwKys7IC8qIFN0cmlwIHRyYWlsaW5nIHNwYWNlcyAqLworICAgICAgICAgICAgICAgICAgaWYgKCpwKSByZXR1cm4oLTIpOyAgIC8qIFNob3VsZCBiZSBub3RoaW5nIGhlcmUuICovCisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMDEwLCJkb2lmIEVMU0UgbGluZSAzIixsaW5lLDApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogQXQgZW5kLCB0cmVhdCBsaWtlIGFuIElGIGNvbW1hbmQgKi8KKyAgICAgICAgICAgICAgaWYgKCF6KSBsaW5lWzBdID0gTlVMOyAgICAvKiBDb25kaXRpb24gbm90IHRydWUgYW5kIG5vIEVMU0UgKi8KKyAgICAgICAgICAgICAgaWZjbWRbY21kbHZsXSA9IDE7ICAgICAgICAvKiBBbGxvdyBFTFNFIG9uIG5leHQgbGluZSAqLworICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJJRiBjb25kaXRpb24iLCIiLHopOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobGluZVswXSkgeworICAgICAgICAgICAgICB4ID0gbWxvb2sobWFjdGFiLCJfeGlmIixubWFjKTsgLyogR2V0IGluZGV4IG9mICJfeGlmIiBtYWNyby4gKi8KKyAgICAgICAgICAgICAgaWYgKHggPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCB0aGVyZT8gKi8KKyAgICAgICAgICAgICAgICAgIGFkZG1tYWMoIl94aWYiLHhpZl9kZWYpOyAgICAgIC8qIFB1dCBpdCBiYWNrLiAqLworICAgICAgICAgICAgICAgICAgaWYgKG1sb29rKG1hY3RhYiwiX3hpZiIsbm1hYykgPCAwKSB7IC8qIExvb2sgaXQgdXAgYWdhaW4uICovCisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/WElGIG1hY3JvIGdvbmUhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGRvZG8oeCxsaW5lLGNtZHN0a1tjbWRsdmxdLmNjZmxncyB8IENGX0lNQUMpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4oMCk7CisgICAgICB9CisgICAgICBjYXNlIFhYV0hJOiB7ICAgICAgICAgICAgICAgICAgICAgLyogV0hJTEUgQ29tbWFuZCAqLworICAgICAgICAgIHAgPSBjbWRidWY7ICAgICAgICAgICAgICAgICAgIC8qIENhcHR1cmUgSUYgY29uZGl0aW9uICovCisgICAgICAgICAgaWZjb25kWzBdID0gTlVMOyAgICAgICAgICAgICAgLyogZnJvbSBjb21tYW5kIGJ1ZmZlciAqLworICAgICAgICAgIHdoaWxlICgqcCA9PSBTUCkgcCsrOworICAgICAgICAgIHdoaWxlICgqcCAhPSBTUCkgcCsrOworICAgICAgICAgIGlmY3AgPSBpZmNvbmQ7CisgICAgICAgICAgaWZjcCArPSBja3N0cm5jcHkoaWZjcCwieyBcXGZsaXQoaWYgKCBub3QgIixJRkNPTkRMRU4pOworI2lmZGVmIENPTU1FTlQKKy8qCisgIFRoaXMgZG9lc24ndCB3b3JrIGJlY2F1c2UgaXQgYnJlYWtzIG9uIHRoZSBmaXJzdCBsZWZ0IGJyYWNlLCB3aGljaCBkb2VzCisgIG5vdCBuZWNlc3NhcmlseSBzdGFydCB0aGUgY29tbWFuZCBsaXN0LCBlLmcuICJ3aGlsZSBlcXVhbCBcJWEge1wzNX0iLgorKi8KKyAgICAgICAgICB3aGlsZSAoKnAgIT0gJ3snICYmICpwICE9IE5VTCkgKmlmY3ArKyA9ICpwKys7CisgICAgICAgICAgcCA9ICIgKSBnb3RvIF8uLmJvdCkgfSAiOworICAgICAgICAgIHdoaWxlICgqaWZjcCsrID0gKnArKykgOworI2Vsc2UKKy8qCisgIFRoZSBjb21tYW5kIHBhcnNlciBzZXRzIGNtYnB0ciB0byB0aGUgc3BvdCB3aGVyZSBpdCBsZWZ0IG9mZiBwYXJzaW5nIGluCisgIHRoZSBjb21tYW5kIGJ1ZmZlci4KKyovCisgICAgICAgICAgeworICAgICAgICAgICAgICBleHRlcm4gY2hhciAqIGNtYnB0cjsKKyAgICAgICAgICAgICAgaWYgKGNtYnB0cikgeworICAgICAgICAgICAgICAgICAgd2hpbGUgKHAgPCBjbWJwdHIgJiYgKnAgIT0gTlVMKQorICAgICAgICAgICAgICAgICAgICAqaWZjcCsrID0gKnArKzsKKyAgICAgICAgICAgICAgICAgIHAgPSAiICkgZ290byBfLi5ib3QpIH0gIjsKKyAgICAgICAgICAgICAgICAgIHdoaWxlICgoKmlmY3ArKyA9ICpwKyspKSA7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBwcmludGYoIj9JbnRlcm5hbCBlcnJvciBwYXJzaW5nIFdISUxFIGNvbmRpdGlvblxuIik7CisgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgICAgICAgIGRlYnVnKEYxMTAsIldISUxFIGNtZCIsaWZjb25kLDApOworCisgICAgICAgICAgaWYgKCh5ID0gY210eHQoIk9iamVjdCBjb21tYW5kIiwiIiwmcyxOVUxMKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHkpOyAgICAgICAgICAgICAgICAgIC8qIEdldCBvYmplY3QgY29tbWFuZC4gKi8KKyAgICAgICAgICBwID0gczsKKyAgICAgICAgICBscCA9IGxpbmU7CisgICAgICAgICAgaWYgKGxpdGNtZCgmcCwmbHAsTElOQlVGU0laIC0gMikgPCAwKSB7IC8qIFF1b3RlIG9iamVjdCBjb21tYW5kICovCisgICAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgICAgfQorICAgICAgICAgIGRlYnVnKEYxMDEsIldISUxFIGJvZHkiLGxpbmUsLTU0KTsKKyAgICAgICAgICBpZiAobGluZVswXSkgeworICAgICAgICAgICAgICBjaGFyICpwOworICAgICAgICAgICAgICB4ID0gbWxvb2sobWFjdGFiLCJfd2hpbGUiLG5tYWMpOyAvKiBpbmRleCBvZiAiX3doaWxlIiBtYWNyby4gKi8KKyAgICAgICAgICAgICAgaWYgKHggPCAwKSB7ICAgICAgICAgICAgICAvKiBOb3QgdGhlcmU/ICovCisgICAgICAgICAgICAgICAgICBhZGRtbWFjKCJfd2hpbGUiLHdoaWxfZGVmKTsgLyogUHV0IGl0IGJhY2suICovCisgICAgICAgICAgICAgICAgICBpZiAobWxvb2sobWFjdGFiLCJfd2hpbGUiLG5tYWMpIDwgMCkgeyAvKiBMb29rIGl0IHVwIGFnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/V0hJTEUgbWFjcm8gZGVmaW5pdGlvbiBnb25lIVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBwID0gbWFsbG9jKChpbnQpc3RybGVuKGlmY29uZCkgKyAoaW50KXN0cmxlbihsaW5lKSArIDIpOworICAgICAgICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgICAgICAgc3RyY3B5KHAsaWZjb25kKTsgICAgIC8qIHNhZmUgKHByZWNoZWNrZWQpICovCisgICAgICAgICAgICAgICAgICBzdHJjYXQocCxsaW5lKTsgICAgICAgLyogc2FmZSAocHJlY2hlY2tlZCkgKi8KKyAgICAgICAgICAgICAgICAgIGRlYnVnKEYwMTAsIldISUxFIGRvZG8iLHAsMCk7CisgICAgICAgICAgICAgICAgICBkb2RvKHgscCxjbWRzdGtbY21kbHZsXS5jY2ZsZ3MgfCBDRl9JTUFDKTsKKyAgICAgICAgICAgICAgICAgIGZyZWUocCk7CisgICAgICAgICAgICAgICAgICBwID0gTlVMTDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiP0Nhbid0IGFsbG9jYXRlIHN0b3JhZ2UgZm9yIFdISUxFIGNvbW1hbmQiKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuKDApOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9Cit9CisjZW5kaWYgLyogTk9TUEwgKi8KKworLyogU2V0IHVwIGEgVEFLRSBjb21tYW5kIGZpbGUgKi8KKworaW50Citkb3Rha2UocykgY2hhciAqczsgeworI2lmbmRlZiBOT1NQTAorICAgIGV4dGVybiBpbnQgdHJhX2NtZDsKKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgZXh0ZXJuIGludCB0ZXJtX2lvOworICAgIGludCB0ZXJtX2lvX3NhdiA9IHRlcm1faW87CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIGludCBzbGVuOworCisgICAgZGVidWcoRjExMCwiZG90YWtlIixzLDApOworICAgIGlmICghcykgcyA9ICIiOworICAgIGlmICghKnMpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgc2xlbiA9IHN0cmxlbihzKTsKKyAgICBkZWJ1ZyhGMTAxLCJkb3Rha2UgbGVuIiwiIixzbGVuKTsKKworICAgIGlmICgodGZpbGVbKyt0bGV2ZWxdID0gZm9wZW4ocywiciIpKSA9PSBOVUxMKSB7CisgICAgICAgIHBlcnJvcihzKTsKKyAgICAgICAgZGVidWcoRjExMCwiZG90YWtlIGZhaWwiLHMsMCk7CisgICAgICAgIHRsZXZlbC0tOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHRmbGluZVt0bGV2ZWxdID0gMDsgICAgICAgICAgICAgLyogTGluZSBjb3VudGVyICovCisjaWZkZWYgVk1TCisgICAgICAgIGNvbnJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgLyogU28gQ3RybC1DIHdpbGwgd29yayAqLworI2VuZGlmIC8qIFZNUyAqLworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgICAgIHRlcm1faW8gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBUZXJtaW5hbCBFbXVsYXRvciBJL08gKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZuZGVmIE5PU1BMCisgICAgICAgIGNtZGx2bCsrOyAgICAgICAgICAgICAgICAgICAgICAgLyogRW50ZXJpbmcgYSBuZXcgY29tbWFuZCBsZXZlbCAqLworICAgICAgICBkZWJ1ZyhGMTExLCJDTUQgK0YiLHMsY21kbHZsKTsKKyAgICAgICAgZGVidWcoRjEwMSwiZG90YWtlIGNtZGx2bCIsIiIsY21kbHZsKTsKKyAgICAgICAgZGVidWcoRjEwMSwiZG90YWtlIHRsZXZlbCIsIiIsdGxldmVsKTsKKyAgICAgICAgaWYgKGNtZGx2bCA+IENNRFNUS0wpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsImRvdGFrZSBzdGFjayBvdmVyZmxvdyIsIiIsMCk7CisgICAgICAgICAgICBjbWRsdmwtLTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIkNNRCotRiIscyxjbWRsdmwpOworICAgICAgICAgICAgZmNsb3NlKHRmaWxlW3RsZXZlbC0tXSk7CisgICAgICAgICAgICBwcmludGYoIj9UQUtFIGZpbGVzIGFuZC9vciBETyBjb21tYW5kcyBuZXN0ZWQgdG9vIGRlZXBseVxuIik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICB9CisgICAgICAgIGlmICh0Zm5hbVt0bGV2ZWxdKSB7ICAgICAgICAgICAgLyogQ29weSB0aGUgZmlsZW5hbWUgKi8KKyAgICAgICAgICAgIGZyZWUodGZuYW1bdGxldmVsXSk7CisgICAgICAgICAgICB0Zm5hbVt0bGV2ZWxdID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHRmbmFtW3RsZXZlbF0gPSBtYWxsb2Moc3RybGVuKHMpICsgMSkpKSB7CisgICAgICAgICAgICBzdHJjcHkodGZuYW1bdGxldmVsXSxzKTsgICAgLyogc2FmZSAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCI/TWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICB9CisgICAgICAgIGlmY21kW2NtZGx2bF0gPSAwOyAgICAgICAgICAgICAgLyogU2V0IHZhcmlhYmxlcyBmb3IgdGhpcyBjbWQgZmlsZSAqLworICAgICAgICBpZnRlc3RbY21kbHZsXSA9IDA7CisgICAgICAgIGNvdW50W2NtZGx2bF0gID0gY291bnRbY21kbHZsLTFdOyAgLyogSW5oZXJpdCB0aGlzICovCisgICAgICAgIGludGltZVtjbWRsdmxdID0gaW50aW1lW2NtZGx2bC0xXTsgLyogSW5oZXJpdCB0aGlzICovCisgICAgICAgIGlucGNhc1tjbWRsdmxdID0gaW5wY2FzW2NtZGx2bC0xXTsgLyogSW5oZXJpdCB0aGlzICovCisgICAgICAgIHRha2VycltjbWRsdmxdID0gdGFrZXJyW2NtZGx2bC0xXTsgLyogSW5oZXJpdCB0aGlzICovCisgICAgICAgIG1lcnJvcltjbWRsdmxdID0gbWVycm9yW2NtZGx2bC0xXTsgLyogSW5oZXJpdCB0aGlzICovCisgICAgICAgIHhxdWlldFtjbWRsdmxdID0gcXVpZXQ7CisgICAgICAgIHhjbWRzcmMgPSBDTURfVEY7CisgICAgICAgIGNtZHN0a1tjbWRsdmxdLnNyYyA9IENNRF9URjsgICAgLyogU2F5IHdlJ3JlIGluIGEgVEFLRSBmaWxlICovCisgICAgICAgIGNtZHN0a1tjbWRsdmxdLmx2bCA9IHRsZXZlbDsgICAgLyogbmVzdGVkIGF0IHRoaXMgbGV2ZWwgKi8KKyAgICAgICAgY21kc3RrW2NtZGx2bF0uY2NmbGdzID0gY21kc3RrW2NtZGx2bC0xXS5jY2ZsZ3M7CisjZWxzZQorICAgICAgICB0YWtlcnJbdGxldmVsXSA9IHRha2Vyclt0bGV2ZWwtMV07IC8qIEluaGVyaXQgdGhpcyAqLworI2VuZGlmIC8qIE5PU1BMICovCisgICAgfQorI2lmbmRlZiBOT1NQTAorICAgIGlmICh0cmFfY21kKQorICAgICAgcHJpbnRmKCJbJWRdICtGOiBcIiVzXCJcbiIsY21kbHZsLHMpOworI2VuZGlmIC8qIE5PU1BMICovCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICB0ZXJtX2lvID0gdGVybV9pb19zYXY7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIHJldHVybigxKTsKK30KKyNlbmRpZiAvKiBOT0lDUCAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdXVzNy5jIGIvY2tlcm1pdC04LjAuMjExL2NrdXVzNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjhlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2t1dXM3LmMKQEAgLTAsMCArMSwxNDkzMyBAQAorI2luY2x1ZGUgImNrY3N5bS5oIgorCisvKiAgQyBLIFUgVSBTIDcgLS0gICJVc2VyIEludGVyZmFjZSIgZm9yIEMtS2VybWl0LCBwYXJ0IDcgICovCisKKy8qCisgIEF1dGhvcnM6CisgICAgRnJhbmsgZGEgQ3J1eiA8ZmRjQGNvbHVtYmlhLmVkdT4sCisgICAgICBUaGUgS2VybWl0IFByb2plY3QsIENvbHVtYmlhIFVuaXZlcnNpdHksIE5ldyBZb3JrIENpdHkKKyAgICBKZWZmcmV5IEUgQWx0bWFuIDxqYWx0bWFuQHNlY3VyZS1lbmRwb2ludHMuY29tPgorICAgICAgU2VjdXJlIEVuZHBvaW50cyBJbmMuLCBOZXcgWW9yayBDaXR5CisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisKKy8qCisgIFRoaXMgZmlsZSBjcmVhdGVkIGZyb20gcGFydHMgb2YgY2t1dXMzLmMsIHdoaWNoIGJlY2FtZSB0b28gYmlnIGZvcgorICBNYXJrIFdpbGxpYW1zIENvaGVyZW50IGNvbXBpbGVyIHRvIGhhbmRsZS4KKyovCisKKy8qCisgIERlZmluaXRpb25zIGhlcmUgc3VwZXJzZWRlIHRob3NlIGZyb20gc3lzdGVtIGluY2x1ZGUgZmlsZXMuCisqLworI2luY2x1ZGUgImNrY2RlYi5oIiAgICAgICAgICAgICAgICAgICAgIC8qIERlYnVnZ2luZyAmIGNvbXBpbGVyIHRoaW5ncyAqLworI2luY2x1ZGUgImNrY2FzYy5oIiAgICAgICAgICAgICAgICAgICAgIC8qIEFTQ0lJIGNoYXJhY3RlciBzeW1ib2xzICovCisjaW5jbHVkZSAiY2tja2VyLmgiICAgICAgICAgICAgICAgICAgICAgLyogS2VybWl0IGFwcGxpY2F0aW9uIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiY2tjeGxhLmgiICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIHNldCB0cmFuc2xhdGlvbiAqLworI2luY2x1ZGUgImNrY25ldC5oIiAgICAgICAgICAgICAgICAgICAgIC8qIE5ldHdvcmsgc3ltYm9scyAqLworI2luY2x1ZGUgImNrdXVzci5oIiAgICAgICAgICAgICAgICAgICAgIC8qIFVzZXIgaW50ZXJmYWNlIHN5bWJvbHMgKi8KKyNpbmNsdWRlICJja3VjbWQuaCIKKyNpbmNsdWRlICJja2NsaWIuaCIKKworI2lmZGVmIFZNUworI2lmbmRlZiBUQ1BTT0NLRVQKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgT1MyCisjaWZuZGVmIE5UCisjZGVmaW5lIElOQ0xfTk9QTQorI2RlZmluZSBJTkNMX1ZJTyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZWRlZCBmb3IgY2tvY29uLmggKi8KKyNkZWZpbmUgSU5DTF9ET1NNT0RVTEVNR1IKKyNpbmNsdWRlIDxvczIuaD4KKyN1bmRlZiBDT01NRU5UCisjZWxzZSAvKiBOVCAqLworI2RlZmluZSBBUElSRVQgVUxPTkcKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8dGFwaS5oPgorI2luY2x1ZGUgImNrbndpbi5oIgorI2luY2x1ZGUgImNrbnRhcC5oIgorI2VuZGlmIC8qIE5UICovCisjaW5jbHVkZSAiY2tvd2luLmgiCisjaW5jbHVkZSAiY2tvY29uLmgiCisjaW5jbHVkZSAiY2tvZGlyLmgiCisjaWZkZWYgT1MyTU9VU0UKKyNpbmNsdWRlICJja29rZXkuaCIKKyNlbmRpZiAvKiBPUzJNT1VTRSAqLworI2lmZGVmIEtVSQorI2luY2x1ZGUgImlrdWkuaCIKKyNlbmRpZiAvKiBLVUkgKi8KKyNpZmRlZiBwdXRjaGFyCisjdW5kZWYgcHV0Y2hhcgorI2VuZGlmIC8qIHB1dGNoYXIgKi8KKyNkZWZpbmUgcHV0Y2hhcih4KSBjb25vYyh4KQorZXh0ZXJuIGludCBtc2trZXlzOworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyNpbmNsdWRlICJja3VhdGguaCIKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX1NTTAorI2luY2x1ZGUgImNrX3NzbC5oIgorI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIFNTSEJVSUxUSU4KKyNpbmNsdWRlICJja29zc2guaCIKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisjaWZkZWYgU1RSQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RyYXR1cyBDb21wdXRlciwgSW5jLiAgVk9TICovCisjaWZkZWYgcHV0Y2hhcgorI3VuZGVmIHB1dGNoYXIKKyNlbmRpZiAvKiBwdXRjaGFyICovCisjZGVmaW5lIHB1dGNoYXIoeCkgY29ub2MoeCkKKyNpZmRlZiBnZXRjaGFyCisjdW5kZWYgZ2V0Y2hhcgorI2VuZGlmIC8qIGdldGNoYXIgKi8KKyNkZWZpbmUgZ2V0Y2hhcih4KSBjb25pbmMoMCkKKyNlbmRpZiAvKiBTVFJBVFVTICovCisKK2NoYXIgKiBzbG1zZyA9IE5VTEw7CisKK3N0YXRpYyBpbnQgeCwgeSA9IDAsIHo7CitzdGF0aWMgY2hhciAqczsKKworZXh0ZXJuIENIQVIgZmVvbDsKK2V4dGVybiBpbnQgZ19tYXRjaGRvdCwgaGludHMsIHhjbWRzcmMsIHJjZGFjdGl2ZTsKKworZXh0ZXJuIGNoYXIgKiBrX2luZm9fZGlyOworCisjaWZuZGVmIE5PU1BMCitleHRlcm4gaW50IG5tYWM7CitleHRlcm4gc3RydWN0IG10YWIgKm1hY3RhYjsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PWEZFUgorI2lmZGVmIENLX1NQRUVECitleHRlcm4gc2hvcnQgY3RscFtdOyAgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbC1jaGFyIHByZWZpeGluZyB0YWJsZSAqLworI2VuZGlmIC8qIENLX1NQRUVEICovCisKKyNpZmRlZiBQSVBFU0VORAorZXh0ZXJuIGNoYXIgKiBzbmRmaWx0ZXIsICogZ19zZmlsdGVyOworZXh0ZXJuIGNoYXIgKiByY3ZmaWx0ZXIsICogZ19yZmlsdGVyOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKK2V4dGVybiBjaGFyICogc25kX21vdmU7CitleHRlcm4gY2hhciAqIHNuZF9yZW5hbWU7CitleHRlcm4gY2hhciAqIGdfc25kX21vdmU7CitleHRlcm4gY2hhciAqIGdfc25kX3JlbmFtZTsKK2V4dGVybiBjaGFyICogcmN2X21vdmU7CitleHRlcm4gY2hhciAqIHJjdl9yZW5hbWU7CitleHRlcm4gY2hhciAqIGdfcmN2X21vdmU7CitleHRlcm4gY2hhciAqIGdfcmN2X3JlbmFtZTsKKworI2lmZGVmIFBBVFRFUk5TCitleHRlcm4gY2hhciAqYmlucGF0dGVybnNbXSwgKnR4dHBhdHRlcm5zW107CitleHRlcm4gaW50IHBhdHRlcm5zOworI2VuZGlmIC8qIFBBVFRFUk5TICovCisKK2V4dGVybiBjaGFyICogcmVtZGVzdDsKKyNpZmRlZiBDS19UTVBESVIKK2NoYXIgKiBkbGRpciA9IE5VTEw7CisjZW5kaWYgLyogQ0tfVE1QRElSICovCisKK2V4dGVybiBzdHJ1Y3QgY2tfcCBwdGFiW107CisKK2V4dGVybiBpbnQgcHJvdG9jb2wsIHJlbWZpbGUsIHJlbXBpcGUsIHJlbWFwcGQsIHJlbGlhYmxlLCB4cmVsaWFibGUsIGZtYXNrLAorICBmbmNudiwgZnJlY2wsIG1heHJwcywgd3Nsb3RyLCBiaWdzYnNpeiwgYmlncmJzaXosIHVycHNpeiwgcnBzaXosIHNwc2l6LAorICBiY3RyLCBucGFkLCB0aW1lZiwgdGltaW50LCBzcHNpenIsIHNwc2l6ZiwgbWF4c3BzLCBzcG1heCwgbmZpbHMsIGRpc3BsYSwKKyAgYXRjYXByLCBwa3R0aW0sIHJ0aW1vLCBmbmNhY3QsIG15cGFkbiwgZmRpc3BsYSwgZl9zYXZlLCBwa3RwYXVzLCBzZXRyZWxpYWJsZSwKKyAgZm5ycGF0aCwgZm5zcGF0aCwgYXRlbmNpLCBhdGVuY28sIGF0ZGF0aSwgYXRkYXRvLCBhdGxlbmksIGF0bGVubywgYXRibGtpLAorICBhdGJsa28sIGF0dHlwaSwgYXR0eXBvLCBhdHNpZGksIGF0c2lkbywgYXRzeXNpLCBhdHN5c28sIGF0ZGlzaSwgYXRkaXNvOworCitleHRlcm4gaW50IHN0YXRoYWNrOworCitleHRlcm4gaW50IGF0ZnJtaSwgYXRmcm1vOworI2lmZGVmIFNUUkFUVVMKK2V4dGVybiBpbnQgYXRjcmVpLCBhdGNyZW8sIGF0YWN0aSwgYXRhY3RvOworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNpZmRlZiBDS19QRVJNUworZXh0ZXJuIGludCBhdGxwcmksIGF0bHBybywgYXRncHJpLCBhdGdwcm87CisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKworZXh0ZXJuIENIQVIKKyAgc3N0YXRlLCBlb2wsIHNlb2wsIHN0Y2hyLCBteXN0Y2gsIG15cGFkYywgcGFkY2gsIGN0bHEsIG15Y3RscTsKKworI2lmZGVmIElLU0QKK2V4dGVybiBpbnQgaW5zZXJ2ZXI7CisjaWZkZWYgSUtTRENPTkYKK2V4dGVybiBpbnQgaWtzZGNmOworI2VuZGlmIC8qIElLU0RDT05GICovCisjZW5kaWYgLyogSUtTRCAqLworCitleHRlcm4gY2hhciAqY21hcmcsICpjbWFyZzI7CisKKyNpZm5kZWYgTk9GUklMTFMKK2V4dGVybiBjaGFyIG9wdGJ1ZltdOyAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgZm9yIE1BSUwgb3IgUFJJTlQgb3B0aW9ucyAqLworZXh0ZXJuIGludCBycHJpbnRmOyAgICAgICAgICAgICAgICAgICAgIC8qIFJFTU9URSBQUklOVCBmbGFnICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIENLX1RSSUdHRVIKK2V4dGVybiBjaGFyICogdHRfdHJpZ2dlcltdOworI2VuZGlmIC8qIENLX1RSSUdHRVIgKi8KKworZXh0ZXJuIGludCB0Y3NfdHJhbnNwOworI2lmZGVmIFBDVEVSTQorZXh0ZXJuIGludCB0dF9wY3Rlcm07CisjZW5kaWYgLyogUENURVJNICovCisjaWZkZWYgTlQKK2V4dGVybiBpbnQgdHRfdnRudDsKKyNlbmRpZiAvKiBOVCAqLworCisjaWZkZWYgU1NIQlVJTFRJTgoraW50IHNsX3NzaF94ZncgPSAwOworaW50IHNsX3NzaF94Zndfc2F2ZWQgPSAwOworaW50IHNsX3NzaF92ZXIgPSAwOworaW50IHNsX3NzaF92ZXJfc2F2ZWQgPSAwOworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCitleHRlcm4gaW50IGF1dGhfdHlwZV91c2VyW107CitpbnQgc2xfYXV0aF90eXBlX3VzZXJbQVVUSFRZUExTVFNaXSA9IHtBVVRIVFlQRV9OVUxMLCBBVVRIVFlQRV9OVUxMfTsKK2ludCBzbF9hdXRoX3NhdmVkID0gMDsKK2ludCBzbF90b3B0X2Ffc3UgPSAwOworaW50IHNsX3RvcHRfYV9zX3NhdmVkID0gMDsKK2ludCBzbF90b3B0X2FfY20gPSAwOworaW50IHNsX3RvcHRfYV9jX3NhdmVkID0gMDsKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX0VOQ1JZUFRJT04KK2V4dGVybiBpbnQgY3hfdHlwZTsKK2ludCBzbF9jeF90eXBlID0gMDsKK2ludCBzbF9jeF9zYXZlZCA9IDA7CitpbnQgc2xfdG9wdF9lX3N1ID0gMDsKK2ludCBzbF90b3B0X2Vfc20gPSAwOworaW50IHNsX3RvcHRfZV9zX3NhdmVkID0gMDsKK2ludCBzbF90b3B0X2VfY3UgPSAwOworaW50IHNsX3RvcHRfZV9jbSA9IDA7CitpbnQgc2xfdG9wdF9lX2Nfc2F2ZWQgPSAwOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KK2V4dGVybiBjaGFyIHVpZGJ1ZltdOworc3RhdGljIGludCB1aWRmbGFnID0gMDsKK2NoYXIgc2xfdWlkYnVmW1VJREJVRkxFTl0gPSB7IE5VTCwgTlVMIH07CitpbnQgIHNsX3VpZF9zYXZlZCA9IDA7CisjaWZkZWYgVE5DT0RFCitpbnQgIHNsX3RuX3dhaXQgPSAwOworaW50ICBzbF90bl9zYXZlZCA9IDA7CisjZW5kaWYgLyogVE5DT0RFICovCisKKyNpZmRlZiBUTkNPREUKK2V4dGVybiBpbnQgdG5fd2FpdF9mbGc7CisjZW5kaWYgLyogVE5DT0RFICovCisKK1ZPSUQKK3NscmVzdG9yKCkgeworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgaW50IHg7CisgICAgaWYgKHNsX2F1dGhfc2F2ZWQpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IEFVVEhUWVBMU1RTWjsgeCsrKQorICAgICAgICAgIGF1dGhfdHlwZV91c2VyW3hdID0gc2xfYXV0aF90eXBlX3VzZXJbeF07CisgICAgICAgIHNsX2F1dGhfc2F2ZWQgPSAwOworICAgIH0KKyAgICBpZiAoc2xfdG9wdF9hX3Nfc2F2ZWQpIHsKKyAgICAgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID0gc2xfdG9wdF9hX3N1OworICAgICAgICBzbF90b3B0X2Ffc19zYXZlZCA9IDA7CisgICAgfQorICAgIGlmIChzbF90b3B0X2FfY19zYXZlZCkgeworICAgICAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID0gc2xfdG9wdF9hX2NtOworICAgICAgICBzbF90b3B0X2FfY19zYXZlZCA9IDA7CisgICAgfQorI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIGlmIChzbF9jeF9zYXZlZCkgeworICAgICAgICBjeF90eXBlID0gc2xfY3hfdHlwZTsKKyAgICAgICAgc2xfY3hfc2F2ZWQgPSAwOworICAgIH0KKyAgICBpZiAoc2xfdG9wdF9lX3Nfc2F2ZWQpIHsKKyAgICAgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgID0gc2xfdG9wdF9lX3N1OworICAgICAgICBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBzbF90b3B0X2Vfc207CisgICAgICAgIHNsX3RvcHRfZV9zX3NhdmVkID0gMDsKKyAgICB9CisgICAgaWYgKHNsX3RvcHRfZV9jX3NhdmVkKSB7CisgICAgICAgIFRFTE9QVF9ERUZfQ19VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pICA9IHNsX3RvcHRfZV9jdTsKKyAgICAgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gc2xfdG9wdF9lX2NtOworICAgICAgICBzbF90b3B0X2VfY19zYXZlZCA9IDA7CisgICAgfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICBpZiAoc2xfdWlkX3NhdmVkKSB7CisgICAgICAgIGNrc3RybmNweSh1aWRidWYsc2xfdWlkYnVmLFVJREJVRkxFTik7CisgICAgICAgIHNsX3VpZF9zYXZlZCA9IDA7CisgICAgfQorI2lmZGVmIFROQ09ERQorICAgIGlmIChzbF90bl9zYXZlZCkgeworICAgICAgICB0bl93YWl0X2ZsZyA9IHNsX3RuX3dhaXQ7CisgICAgICAgIHNsX3RuX3NhdmVkID0gMDsKKyAgICB9CisjZW5kaWYgLyogVE5DT0RFICovCisjaWZkZWYgU1NIQlVJTFRJTgorICAgIGlmIChzbF9zc2hfeGZ3X3NhdmVkKSB7CisgICAgICAgIHNzaF94ZncgPSBzbF9zc2hfeGZ3OworICAgICAgICBzbF9zc2hfeGZ3X3NhdmVkID0gMDsKKyAgICB9CisgICAgaWYgKHNsX3NzaF92ZXJfc2F2ZWQpIHsKKyAgICAgICAgc3NoX3ZlciA9IHNsX3NzaF92ZXI7CisgICAgICAgIHNsX3NzaF92ZXJfc2F2ZWQgPSAwOworICAgIH0KKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCit9CisKK2ludCBvbGRwbGV4ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBEdXBsZXggaG9sZGVyIGFyb3VuZCBuZXR3b3JrICovCisKKyNpZm5kZWYgTk9JQ1AKKyNpZmRlZiBMT0NVUworZXh0ZXJuIGludCBsb2N1cywgYXV0b2xvY3VzOworI2VuZGlmIC8qIExPQ1VTICovCisjaWZuZGVmIE5PRElBTAorZXh0ZXJuIGludCBkaWFsc3RhOworI2VuZGlmIC8qIE5PRElBTCAqLworCisvKiBOb3RlOiBnY2MgLVdhbGwgd2FudHMgYnJhY2VzIGFyb3VuZCBlYWNoIGtleXdvcmQgdGFibGUgZW50cnkuICovCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHBzbHRhYltdID0geyAgICAgICAvKiBTRVQgTElORS9QT1JUIGNvbW1hbmQgb3B0aW9ucyAqLworICAgIHsgIi9jb25uZWN0IiwgU0xfQ05YLCAwIH0sCisjaWZkZWYgT1MyT1JWTVMKKyAgICB7ICIvbm9zaGFyZSIsIFNMX05TSCwgMCB9LAorI2VuZGlmIC8qIE9TMk9SVk1TICovCisgICAgeyAiL3NlcnZlciIsICBTTF9TUlYsIDAgfSwKKyNpZmRlZiBPUzJPUlZNUworICAgIHsgIi9zaGFyZSIsICAgU0xfU0hSLCAwIH0sCisjZW5kaWYgLyogT1MyT1JWTVMgKi8KKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5wc2x0YWIgPSBzaXplb2YocHNsdGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYikgLSAxOworCisjaWZkZWYgTkVUQ09OTgorc3RhdGljIHN0cnVjdCBrZXl0YWIgc2h0YWJbXSA9IHsgICAgICAgIC8qIFNFVCBIT1NUIGNvbW1hbmQgb3B0aW9ucyAqLworI2lmZGVmIE5FVENNRAorICAgIC8qIChDT01NQU5EIGlzIGFsc28gYSBuZXR3b3JrIHR5cGUpICovCisgICAgeyAiL2NvbW1hbmQiLCAgICAgIFNMX0NNRCwgICAgQ01fSU5WIH0sCisjZW5kaWYgLyogTkVUQ01EICovCisgICAgeyAiL2Nvbm5lY3QiLCAgICAgIFNMX0NOWCwgICAgMCB9LAorICAgIHsgIi9uZXR3b3JrLXR5cGUiLCBTTF9ORVQsICAgIENNX0FSRyB9LAorICAgIHsgIi9ub3dhaXQiLCAgICAgICBTTF9OT1dBSVQsIDAgfSwKKyNpZm5kZWYgTk9TUEwKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgIHsgIi9wYXNzd29yZCIsICAgICBTTF9QU1csICAgIENNX0FSRyB9LAorI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZmRlZiBORVRDTUQKKyAgICB7ICIvcGlwZSIsICAgICAgICAgU0xfQ01ELCAgICAwIH0sCisjZW5kaWYgLyogTkVUQ01EICovCisjaWZkZWYgTkVUUFRZCisgICAgeyAiL3B0eSIsICAgICAgICAgIFNMX1BUWSwgICAgMCB9LAorI2VuZGlmIC8qIE5FVFBUWSAqLworICAgIHsgIi9zZXJ2ZXIiLCAgICAgICBTTF9TUlYsICAgIDAgfSwKKyAgICB7ICIvdGltZW91dCIsICAgICAgU0xfVE1PLCAgICBDTV9BUkcgfSwKKyAgICB7ICIvdXNlcmlkIiwgICAgICAgU0xfVUlELCAgICBDTV9BUkcgfSwKKyAgICB7ICIvd2FpdCIsICAgICAgICAgU0xfV0FJVCwgICAwIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuc2h0YWIgPSBzaXplb2Yoc2h0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKSAtIDE7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHNodGVsdGFiW10gPSB7ICAgICAvKiBURUxORVQgY29tbWFuZCBvcHRpb25zICovCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICB7ICIvYXV0aCIsICAgICAgICAgU0xfQVVUSCwgICBDTV9BUkcgfSwKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICB7ICIvZW5jcnlwdCIsICAgICAgU0xfRU5DLCAgICBDTV9BUkcgfSwKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgeyAiL25vd2FpdCIsICAgICAgIFNMX05PV0FJVCwgMCB9LAorI2lmbmRlZiBOT1NQTAorI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgeyAiL3Bhc3N3b3JkIiwgICAgIFNMX1BTVywgICAgQ01fQVJHIH0sCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHsgIi90aW1lb3V0IiwgICAgICBTTF9UTU8sICAgIENNX0FSRyB9LAorICAgIHsgIi91c2VyaWQiLCAgICAgICBTTF9VSUQsICAgIENNX0FSRyB9LAorICAgIHsgIi93YWl0IiwgICAgICAgICBTTF9XQUlULCAgIDAgfSwKKyAgICB7ICIiLCAwICwwIH0KK307CitzdGF0aWMgaW50IG5zaHRlbHRhYiA9IHNpemVvZihzaHRlbHRhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpIC0gMTsKKworI2lmZGVmIFJMT0dDT0RFCitzdGF0aWMgc3RydWN0IGtleXRhYiBzaHJsZ3RhYltdID0geyAgICAgLyogU0VUIEhPU1QgUkxPR0lOIGNvbW1hbmQgb3B0aW9ucyAqLworI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgIHsgIi9lbmNyeXB0IiwgICAgICBTTF9FTkMsIDAgfSwKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgeyAiL2s0IiwgICAgICAgICAgIFNMX0tSQjQsIENNX0lOViB9LAorICAgIHsgIi9rNSIsICAgICAgICAgICBTTF9LUkI1LCBDTV9JTlYgfSwKKyAgICB7ICIva2VyYmVyb3M0IiwgICAgU0xfS1JCNCwgMCB9LAorICAgIHsgIi9rZXJiZXJvczUiLCAgICBTTF9LUkI1LCAwIH0sCisgICAgeyAiL2tlcmJlcm9zX2l2IiwgIFNMX0tSQjQsIENNX0lOViB9LAorICAgIHsgIi9rZXJiZXJvc192IiwgICBTTF9LUkI1LCBDTV9JTlYgfSwKKyAgICB7ICIva3JiNCIsICAgICAgICAgU0xfS1JCNCwgQ01fSU5WIH0sCisgICAgeyAiL2tyYjUiLCAgICAgICAgIFNMX0tSQjUsIENNX0lOViB9LAorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisgICAgeyAiIiwgMCAsMCB9Cit9Oworc3RhdGljIGludCBuc2hybGd0YWIgPSBzaXplb2Yoc2hybGd0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKS0xOworI2VuZGlmIC8qIFJMT0dDT0RFICovCisKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIG5ldGNtZFtdOworZXh0ZXJuIGludCBubmV0czsKKyNpZm5kZWYgTk9ESUFMCitleHRlcm4gaW50IGRpcmxpbmU7CitleHRlcm4gaW50IG5uZXRkaXI7ICAgICAgICAgICAgICAgICAgICAgLyogTmV0d29yayBzZXJ2aWNlcyBkaXJlY3RvcnkgKi8KK2V4dGVybiBjaGFyICpuZXRkaXJbXTsKK19QUk9UT1RZUCggVk9JRCBuZHJlc2V0LCAodm9pZCkgKTsKK2NoYXIgKm5oX3BbTUFYRE5VTVMgKyAxXTsgICAgICAgICAgICAgICAvKiBOZXR3b3JrIGRpcmVjdG9yeSBlbnRyeSBwb2ludGVycyAqLworY2hhciAqbmhfcDJbTUFYRE5VTVMgKyAxXTsgICAgICAgICAgICAgIC8qIE5ldHdvcmsgZGlyZWN0b3J5IGVudHJ5IG5ldHR5cGUgKi8KK2NoYXIgKm5oX3B4WzRdW01BWEROVU1TICsgMV07ICAgICAgICAgICAvKiBOZXR3b3JrLXNwZWNpZmljIHN0dWZmLi4uICovCisjZW5kaWYgLyogTk9ESUFMICovCitpbnQgbmhjb3VudCA9IDA7CitpbnQgbmRpbml0ZWQgPSAwOworY2hhciAqIG5fbmFtZSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgIC8qIE5ldHdvcmsgbmFtZSBwb2ludGVyICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworCitfUFJPVE9UWVAoaW50IHJlbXR4dCwgKGNoYXIgKiopICk7CitfUFJPVE9UWVAoVk9JRCBybXNnLCAodm9pZCkgKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IHJlbWNmbSwgKHZvaWQpICk7CisKK2V4dGVybiBpbnQgbm9wdXNoOworCitpbnQgbWRtc2F2ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSBtb2RlbSB0eXBlIGFyb3VuZCBuZXR3b3JrICovCitleHRlcm4gaW50IGlzZ3Vlc3Q7ICAgICAgICAgICAgICAgICAgICAgLyogR2xvYmFsIGZsYWcgZm9yIGFub255bW91cyBsb2dpbiAqLworCitleHRlcm4geHhfc3RycCB4eHN0cmluZzsKKworZXh0ZXJuIGludCBzdWNjZXNzLCBiaW5hcnksIGJfc2F2ZSwgY2t3YXJuLCBtc2dmbGcsIHF1aWV0LCBjbWFzaywgcGZsYWcsIGxvY2FsLAorICBuZXR0eXBlLCBlc2NhcGUsIG1kbXR5cCwgZHVwbGV4LCBkZmxvYywgbmV0d29yaywgY2R0aW1vLCBhdXRvZmxvdywgdG5sbSwKKyAgc29zaSwgdGxldmVsLCBsZl9vcHRzLCBiYWNrZ3JkLCBmbG93LCBkZWJzZXMsIHBhcml0eSwgdHRucHJvdG8sIGNreGVjaCwKKyAgeF9pZm51bSwgY21mbGdzLCBoYXZlbGluZSwgY3h0eXBlLCBjeGZsb3dbXSwgbWFjbHZsOworCisjaWZkZWYgRENNREJVRgorZXh0ZXJuIHN0cnVjdCBjbWRwdHIgKmNtZHN0azsgICAgICAgICAgIC8qIFRoZSBjb21tYW5kIHN0YWNrIGl0c2VsZiAqLworI2Vsc2UKK2V4dGVybiBzdHJ1Y3QgY21kcHRyIGNtZHN0a1tdOyAgICAgICAgICAvKiBUaGUgY29tbWFuZCBzdGFjayBpdHNlbGYgKi8KKyNlbmRpZiAvKiBEQ01EQlVGICovCitleHRlcm4gRklMRSAqIHRmaWxlW107CitleHRlcm4gY2hhciAqIG1hY3BbXTsKKworZXh0ZXJuIGNoYXIgcHNhdmVbXTsgICAgICAgICAgICAgICAgICAgIC8qIEZvciBzYXZpbmcgJiByZXN0b3JpbmcgcHJvbXB0ICovCitleHRlcm4gaW50IHNwcm1sZW4sIHJwcm1sZW47CisKKyNpZmRlZiBPUzIKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHN0cm1rZXl0YWJbXSA9IHsKKyAgICB7ICJjbGVhciIsICAgMCwgMCB9LAorICAgIHsgImRlZmF1bHQiLCAxLCAwIH0KK307CitzdGF0aWMgaW50IG5zdHJta2V5dGFiID0gc2l6ZW9mKHN0cm1rZXl0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgc3RybXN3aXRhYltdID0geworICAgIHsgIi9saXRlcmFsIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuc3RybXN3aXRhYiA9IHNpemVvZihzdHJtc3dpdGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYik7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIG5vcm1yZXZbXSA9IHsKKyAgICB7ICJkYXJrLWRpc3BsYXkiLCAwLCAwIH0sCisgICAgeyAibGlnaHQtZGlzcGxheSIsIDEsIDAgfSwKKyAgICB7ICJub3JtYWwiLCAgIDAsIDAgfSwKKyAgICB7ICJyZXZlcnNlIiwgIDEsIDAgfQorfTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgcHJubXRhYltdID0geworICAgIHsgImF1dG8iLCAxLCAwIH0sCisgICAgeyAiY29weSIsIDIsIDAgfSwKKyAgICB7ICJvZmYiLCAgMCwgMCB9LAorICAgIHsgIm9uIiwgICAxLCBDTV9JTlYgfSwgICAgICAgICAgICAgIC8qIENvbXBhdGliaWxpdHkgd2l0aCBYUFJJTlQgdmVyc2lvbiAqLworICAgIHsgInVzZXIiLCAzLCAwIH0sCisgICAgeyAidHJhbnNwYXJlbnQiLCAzLCBDTV9JTlYgfSAgICAgICAgLyogbm90IHJlYWxseSB0cmFuc3BhcmVudCAqLworfTsKK3N0YXRpYyBpbnQgbnBybm10YWIgPSBzaXplb2YocHJubXRhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpOworCitleHRlcm4gaW50IHR0X2RpZmZfdXBkOworCisjaWZkZWYgTlQKKyNkZWZpbmUgc3RyaWNtcCBfc3RyaWNtcAorZXh0ZXJuIGludCB0dF9hdHRyX2J1ZzsKKyNlbmRpZiAvKiBOVCAqLworZXh0ZXJuIGludCB0dF9yb3dzW10sIHR0X2NvbHNbXTsKK2V4dGVybiBpbnQgdHRfY29sc191c3I7CitleHRlcm4gaW50IHR0X3N6Y2huZ1tWTlVNXTsKK2ludCB0dF9tb2RlY2hnID0gVFZDX0VOQTsKK2V4dGVybiBpbnQgdHRfdXJsX2hpbGl0ZSwgdHRfdXJsX2hpbGl0ZV9hdHRyOworZXh0ZXJuIHN0cnVjdCBfdnRHIEdbNF07CitleHRlcm4gaW50IHByaW9yaXR5OworZXh0ZXJuIGJvb2wgc2VuZF9jMTsKK2ludCBzZW5kX2MxX3VzciA9IEZBTFNFOworZXh0ZXJuIGludCBzZ3Jjb2xvcnM7CitleHRlcm4gaW50IG1hcmdpbmJlbGwsIG1hcmdpbmJlbGxjb2w7CitleHRlcm4gaW50IGF1dG9zY3JvbGwsIHd5X2F1dG9wYWdlOworZXh0ZXJuIGludCB0dF9zYWM7CitleHRlcm4gaW50IGRlY19ucmMsIGRlY19sYW5nLCBkZWNfa2JkOworI2Vsc2UgLyogT1MyICovCitleHRlcm4gaW50IHR0X3Jvd3MsIHR0X2NvbHM7CisjZW5kaWYgLyogIE9TMiAqLworCitleHRlcm4gaW50IHR0X2VzY2FwZTsKK2V4dGVybiBsb25nIHNwZWVkOworCitleHRlcm4gY2hhciAqZGZ0dHk7CisKK2V4dGVybiBjaGFyICp0cCwgKmxwOyAgICAgICAgICAgICAgICAgICAvKiBUZW1wb3JhcnkgYnVmZmVyICYgcG9pbnRlcnMgKi8KK2V4dGVybiBjaGFyIHR0bmFtZVtdOworCisjaWZkZWYgQ0tfVEFQSQoraW50IHR0dGFwaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIExpbmUgVEFQST8gKi8KK3N0cnVjdCBrZXl0YWIgKiB0YXBpbGluZXRhYiA9IE5VTEw7CitzdHJ1Y3Qga2V5dGFiICogX3RhcGlsaW5ldGFiID0gTlVMTDsKK2ludCBudGFwaWxpbmUgPSAwOworI2VuZGlmIC8qIENLX1RBUEkgKi8KKworI2lmZGVmIE5FVENPTk4gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldHdvcmsgaXRlbXMgKi8KKworI2lmZGVmIEFOWVgyNQorZXh0ZXJuIGludCByZXZjYWxsLCBjbG9zZ3IsIGN1ZGF0YSwgbngyNTsKK2V4dGVybiBjaGFyIHVkYXRhW107CitleHRlcm4gc3RydWN0IGtleXRhYiB4MjV0YWJbXTsKKyNpZm5kZWYgSUJNWDI1CitleHRlcm4gaW50IG5wYWR4MzsKK2V4dGVybiBDSEFSIHBhZHBhcm1zW107CitleHRlcm4gc3RydWN0IGtleXRhYiBwYWR4M3RhYltdOworI2VuZGlmIC8qIElCTVgyNSAqLworI2VuZGlmIC8qIEFOWVgyNSAqLworCisjaWZkZWYgT1MyCitleHRlcm4gYm9vbCB0dHNoYXJlOworI2lmbmRlZiBOVAorZXh0ZXJuIGJvb2wgdHRzbGlwLHR0cHBwOworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgTlBJUEUKK2V4dGVybiBjaGFyIHBpcGVuYW1lW107CisjZW5kaWYgLyogTlBJUEUgKi8KKworI2lmZGVmIFRDUFNPQ0tFVAorc3RhdGljIHN0cnVjdCBrZXl0YWIgdGNwcmF3dGFiW10gPSB7ICAgIC8qIFNFVCBIT1NUIG9wdGlvbnMgKi8KKyAgICB7ICIvZGVmYXVsdCIsICAgIE5QX0RFRkFVTFQsICAgIENNX0lOViB9LAorI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisjaWZkZWYgQ0tfS0VSQkVST1MKKyNpZmRlZiBSTE9HQ09ERQorICAgIHsgIi9lazRsb2dpbiIsICAgIE5QX0VLNExPR0lOLCAgICAwIH0sCisgICAgeyAiL2VrNWxvZ2luIiwgICAgTlBfRUs1TE9HSU4sICAgIDAgfSwKKyAgICB7ICIvazRsb2dpbiIsICAgICBOUF9LNExPR0lOLCAgICAgMCB9LAorICAgIHsgIi9rNWxvZ2luIiwgICAgIE5QX0s1TE9HSU4sICAgICAwIH0sCisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNpZmRlZiBLUkI1X1UyVQorICAgIHsgIi9rNXVzZXIydXNlciIsIE5QX0s1VTJVLCAgICAgICAwIH0sCisjZW5kaWYgLyogS1JCNV9VMlUgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisgICAgeyAiL25vLXRlbG5ldC1pbml0IiwgTlBfTk9ORSwgICAwIH0sCisgICAgeyAiL25vbmUiLCAgICAgICBOUF9OT05FLCAgIENNX0lOViB9LAorICAgIHsgIi9yYXctc29ja2V0IiwgTlBfVENQUkFXLCAwIH0sCisjaWZkZWYgUkxPR0NPREUKKyAgICB7ICIvcmxvZ2luIiwgICAgIE5QX1JMT0dJTiwgMCB9LAorI2VuZGlmIC8qIFJMT0dDT0RFICovCisjaWZkZWYgQ0tfU1NMCisgICAgeyAiL3NzbCIsICAgICAgICBOUF9TU0wsICAgIDAgfSwKKyAgICB7ICIvc3NsLXRlbG5ldCIsIE5QX1NTTF9URUxORVQsIDAgfSwKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyAgICB7ICIvdGVsbmV0IiwgICAgIE5QX1RFTE5FVCwgMCB9LAorI2lmZGVmIENLX1NTTAorICAgIHsgIi90bHMiLCAgICAgICAgTlBfVExTLCAgICAwIH0sCisgICAgeyAiL3Rscy10ZWxuZXQiLCBOUF9UTFNfVEVMTkVULCAwIH0sCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBudGNwcmF3ID0gKHNpemVvZih0Y3ByYXd0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKKyNpZmRlZiBSTE9HQ09ERQorX1BST1RPVFlQKCBpbnQgcmxvZ19uYXdzLCAodm9pZCkgKTsKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCisjaWZkZWYgU1VQRVJMQVQKK2V4dGVybiBjaGFyIHNsYXRfcHdkWzE4XTsKKyNlbmRpZiAvKiBTVVBFUkxBVCAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmZGVmIENPTU1FTlQKKyNpZm5kZWYgTk9TRVRLRVkKK2V4dGVybiBLRVkgKmtleW1hcDsKKyNpZm5kZWYgT1MyCisjZGVmaW5lIG1hcGtleSh4KSBrZXltYXBbeF0KKyNlbmRpZiAvKiBPUzIgKi8KK2V4dGVybiBNQUNSTyAqbWFjcm90YWI7CisjaWZuZGVmIE5PS1ZFUkJTCitleHRlcm4gc3RydWN0IGtleXRhYiBrdmVyYnNbXTsKK2V4dGVybiBpbnQgbmt2ZXJiczsKKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworI2VuZGlmIC8qIE5PU0VUS0VZICovCisjZWxzZQorI2lmbmRlZiBOT1NFVEtFWQorZXh0ZXJuIEtFWSAqa2V5bWFwOworZXh0ZXJuIE1BQ1JPICptYWNyb3RhYjsKKyNpZm5kZWYgTk9LVkVSQlMKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIGt2ZXJic1tdOworZXh0ZXJuIGludCBua3ZlcmJzOworI2VuZGlmIC8qIE5PS1ZFUkJTICovCisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBPUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBVVRPRE9XTkxPQUQgcGFyYW1ldGVycyAqLworZXh0ZXJuIGludCAgICBhZGxfa21vZGUsIGFkbF96bW9kZTsgICAgIC8qIE1hdGNoIFBhY2tldCB0byBzaWduYWwgZG93bmxvYWQgKi8KK2V4dGVybiBjaGFyICogYWRsX2tzdHI7ICAgICAgICAgICAgICAgICAvKiBLRVJNSVQgRG93bmxvYWQgU3RyaW5nICovCitleHRlcm4gY2hhciAqIGFkbF96c3RyOyAgICAgICAgICAgICAgICAgLyogWk1PREVNIERvd25sb2FkIFN0cmluZyAqLworZXh0ZXJuIGludCBhZGxfa2MwLCBhZGxfemMwOyAgICAgICAgICAgIC8qIFByb2Nlc3MgQURMIEMwcyBpbiBlbXVsYXRpb24gKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworLyogS2V5d29yZCB0YWJsZXMgLi4uICovCisKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIG9ub2ZmW10sIHJsdGFiW107CitleHRlcm4gaW50IG5ybHQ7CisKKyNpZm5kZWYgTk9DU0VUUworc3RhdGljIHN0cnVjdCBrZXl0YWIgZmRmbHRhYltdID0geworICAgIHsgIjdiaXQtY2hhcmFjdGVyLXNldCIsIDcsIDAgfSwKKyAgICB7ICI4Yml0LWNoYXJhY3Rlci1zZXQiLCA4LCAwIH0KK307CitzdGF0aWMgaW50IG5mZGZsdCA9IChzaXplb2YoZmRmbHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworLyogU0VUIEZJTEUgcGFyYW1ldGVycyAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBmaWx0YWJbXSA9IHsKKyNpZm5kZWYgTk9YRkVSCisjaWZkZWYgUEFUVEVSTlMKKyAgICB7ICJiaW5hcnktcGF0dGVybnMiLCAgIFhZRklCUCwgIDAgfSwKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworICAgIHsgImJ5dGVzaXplIiwgICAgICAgICBYWUZJTFMsICAgMCB9LAorI2lmbmRlZiBOT0NTRVRTCisgICAgeyAiY2hhcmFjdGVyLXNldCIsICAgIFhZRklMQywgICAwIH0sCisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgIHsgImNvbGxpc2lvbiIsICAgICAgICBYWUZJTFgsICAgMCB9LAorICAgIHsgImRlZmF1bHQiLCAgICAgICAgICBYWUZfREZMVCwgMCB9LAorICAgIHsgImRlc3RpbmF0aW9uIiwgICAgICBYWUZJTFksICAgMCB9LAorICAgIHsgImRpc3BsYXkiLCAgICAgICAgICBYWUZJTEQsICAgQ01fSU5WIH0sCisjaWZkZWYgQ0tfVE1QRElSCisgICAgeyAiZG93bmxvYWQtZGlyZWN0b3J5IiwgWFlGSUxHLCAwIH0sCisjZW5kaWYgLyogQ0tfVE1QRElSICovCisjZW5kaWYgLyogTk9YRkVSICovCisgICAgeyAiZW5kLW9mLWxpbmUiLCAgICAgIFhZRklMQSwgICAwIH0sCisgICAgeyAiZW9sIiwgICAgICAgICAgICAgIFhZRklMQSwgICBDTV9JTlYgfSwKKyNpZmRlZiBDS19DVFJMWgorICAgIHsgImVvZiIsICAgICAgICAgICAgICBYWUZJTFYsICAgMCB9LAorI2VuZGlmIC8qIENLX0NUUkxaICovCisjaWZuZGVmIE5PWEZFUgorICAgIHsgImZhc3Rsb29rdXBzIiwgICAgICA5OTk3LCAgICAgQ01fSU5WIH0sCisgICAgeyAiaW5jb21wbGV0ZSIsICAgICAgIFhZRklMSSwgICAwIH0sCisjaWZuZGVmIGRhdGFnZW5lcmFsCisgICAgeyAiaW5zcGVjdGlvbiIsICAgICAgIFhZRl9JTlNQLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2lmZGVmIENLX0xBQkVMRUQKKyAgICB7ICJsYWJlbCIsICAgICAgICAgICAgWFlGSUxMLCAwIH0sCisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworCisjaWZkZWYgVU5JWAorI2lmZGVmIERZTkFNSUMKKyAgICB7ICJsaXN0c2l6ZSIsICAgICAgICAgWFlGX0xTSVosIDAgfSwKKyNlbmRpZiAvKiBEWU5BTUlDICovCisjZW5kaWYgLyogVU5JWCAqLworCisgICAgeyAibmFtZXMiLCAgICAgICAgICAgIFhZRklMTiwgMCB9LAorI2lmZGVmIFVOSVgKKyAgICB7ICJvdXRwdXQiLCAgICAgICAgICAgWFlGSUxILCAwIH0sCisjZW5kaWYgLyogVU5JWCAqLworI2lmZGVmIFBBVFRFUk5TCisgICAgeyAicGF0dGVybnMiLCAgICAgICAgIFhZRklQQSwgMCB9LAorI2VuZGlmIC8qIFBBVFRFUk5TICovCisjaWZkZWYgQ09NTUVOVCAvKiBOb3QgaW1wbGVtZW50ZWQgKGJ1dCBzZWUgQ0hNT0QpICovCisgICAgeyAicGVybWlzc2lvbnMiLCAgICAgIFhZRl9QUk0sIENNX0lOViB9LAorICAgIHsgInByb3RlY3Rpb24iLCAgICAgICBYWUZfUFJNLCAwIH0sCisjZW5kaWYgLyogQ09NTUVOdCAqLworI2lmZGVmIFZNUworICAgIHsgInJlY29yZC1sZW5ndGgiLCAgICBYWUZJTFIsIDAgfSwKKyNlbmRpZiAvKiBWTVMgKi8KKyNpZm5kZWYgZGF0YWdlbmVyYWwKKyAgICB7ICJzY2FuIiwgICAgICAgICAgICAgWFlGX0lOU1AsIDAgfSwKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworCisjaWZkZWYgVU5JWAorI2lmZGVmIERZTkFNSUMKKyAgICB7ICJzdHJpbmdzcGFjZSIsICAgICAgWFlGX1NTUEEsIDAgfSwKKyNlbmRpZiAvKiBEWU5BTUlDICovCisjZW5kaWYgLyogVU5JWCAqLworCisjaWZkZWYgUEFUVEVSTlMKKyAgICB7ICJ0IiwgICAgICAgICAgICAgICAgWFlGSUxULCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAidGV4dC1wYXR0ZXJucyIsICAgIFhZRklUUCwgMCB9LAorI2VuZGlmIC8qIFBBVFRFUk5TICovCisjZW5kaWYgLyogTk9YRkVSICovCisgICAgeyAidHlwZSIsICAgICAgICAgICAgIFhZRklMVCwgMCB9LAorI2lmZGVmIFVOSUNPREUKKyAgICB7ICJ1Y3MiLCAgICAgICAgICAgICAgWFlGSUxVLCAwIH0sCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJ3YXJuaW5nIiwgICAgICAgICAgWFlGSUxXLCBDTV9JTlYgfQorI2VuZGlmIC8qIE5PWEZFUiAqLworfTsKK3N0YXRpYyBpbnQgbmZpbHAgPSAoc2l6ZW9mKGZpbHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdHJ1Y3Qga2V5dGFiIHBhdGh0YWJbXSA9IHsKKyAgICB7ICJhYnNvbHV0ZSIsICBQQVRIX0FCUywgIDAgICAgICB9LAorICAgIHsgIm5vbmUiLCAgICAgIFBBVEhfT0ZGLCAgQ01fSU5WIH0sCisgICAgeyAib2ZmIiwgICAgICAgUEFUSF9PRkYsICAwICAgICAgfSwKKyAgICB7ICJvbiIsICAgICAgICBQQVRIX0FCUywgIENNX0lOViB9LAorICAgIHsgInJlbGF0aXZlIiwgIFBBVEhfUkVMLCAgMCAgICAgIH0KK307CitpbnQgbnBhdGh0YWIgPSAoc2l6ZW9mKHBhdGh0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RydWN0IGtleXRhYiBycGF0aHRhYltdID0geworICAgIHsgImFic29sdXRlIiwgIFBBVEhfQUJTLCAgMCAgICAgIH0sCisgICAgeyAiYXV0byIsICAgICAgUEFUSF9BVVRPLCAwICAgICAgfSwKKyAgICB7ICJub25lIiwgICAgICBQQVRIX09GRiwgIENNX0lOViB9LAorICAgIHsgIm9mZiIsICAgICAgIFBBVEhfT0ZGLCAgMCAgICAgIH0sCisgICAgeyAib24iLCAgICAgICAgUEFUSF9BQlMsICBDTV9JTlYgfSwKKyAgICB7ICJyZWxhdGl2ZSIsICBQQVRIX1JFTCwgIDAgICAgICB9Cit9OworaW50IG5ycGF0aHRhYiA9IChzaXplb2YocnBhdGh0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2lmZGVmIENLX0NUUkxaCitzdHJ1Y3Qga2V5dGFiIGVvZnRhYltdID0geyAgICAgICAgICAgICAgLyogRU9GIGRldGVjdGlvbiBtZXRob2QgKi8KKyAgICB7ICJjdHJsLXoiLCAgICAgICAgICAxLCAwICAgICAgfSwKKyAgICB7ICJsZW5ndGgiLCAgICAgICAgICAwLCAwICAgICAgfSwKKyAgICB7ICJub2N0cmwteiIsICAgICAgICAwLCBDTV9JTlYgfQorfTsKKyNlbmRpZiAvKiBDS19DVFJMWiAqLworCitzdHJ1Y3Qga2V5dGFiIGZ0dGFiW10gPSB7ICAgICAgICAgICAgICAgLyogRmlsZSB0eXBlcyBmb3IgU0VUIEZJTEUgVFlQRSAqLworICAgIHsgImFzY2lpIiwgICAgIFhZRlRfVCwgQ01fSU5WIH0sCisjaWZkZWYgVk1TCisgICAgeyAiYiIsICAgICAgICAgWFlGVF9CLCBDTV9JTlZ8Q01fQUJSIH0sCisjZW5kaWYgLyogVk1TICovCisgICAgeyAiYmluYXJ5IiwgICAgWFlGVF9CLCAwIH0sCisjaWZkZWYgVk1TCisgICAgeyAiYmxvY2siLCAgICAgWFlGVF9JLCBDTV9JTlYgfSwKKyAgICB7ICJpbWFnZSIsICAgICBYWUZUX0ksIDAgfSwKKyNlbmRpZiAvKiBWTVMgKi8KKyNpZmRlZiBDS19MQUJFTEVECisgICAgeyAibGFiZWxlZCIsICAgWFlGVF9MLCAwIH0sCisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworI2lmZGVmIE1BQworICAgIHsgIm1hY2JpbmFyeSIsIFhZRlRfTSwgMCB9LAorI2VuZGlmIC8qIE1BQyAqLworICAgIHsgInRleHQiLCAgICAgIFhZRlRfVCwgMCB9Cit9OworaW50IG5mdHR5cCA9IChzaXplb2YoZnR0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgcmZ0dGFiW10gPSB7ICAgICAgIC8qIEZpbGUgdHlwZXMgZm9yIFJFTU9URSBTRVQgRklMRSAqLworICAgIHsgImFzY2lpIiwgICAgIFhZRlRfVCwgQ01fSU5WIH0sCisgICAgeyAiYmluYXJ5IiwgICAgWFlGVF9CLCAwIH0sCisjaWZkZWYgVk1TCisgICAgeyAibGFiZWxlZCIsICAgWFlGVF9MLCAwIH0sCisjZWxzZQorI2lmZGVmIE9TMgorICAgIHsgImxhYmVsZWQiLCAgIFhZRlRfTCwgMCB9LAorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFZNUyAqLworICAgIHsgInRleHQiLCAgICAgIFhZRlRfVCwgMCB9Cit9Oworc3RhdGljIGludCBucmZ0dHlwID0gKHNpemVvZihyZnR0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2lmZGVmIE9TMk9SVU5JWAorI2RlZmluZSBaT0ZfQkxLICAwCisjZGVmaW5lIFpPRl9OQkxLIDEKKyNkZWZpbmUgWk9GX0JVRiAgMgorI2RlZmluZSBaT0ZfTkJVRiAzCitzdGF0aWMgc3RydWN0IGtleXRhYiB6b2Z0YWJbXSA9IHsKKyAgICB7ICJibG9ja2luZyIsICAgIFpPRl9CTEssICAwIH0sCisgICAgeyAiYnVmZmVyZWQiLCAgICBaT0ZfQlVGLCAgMCB9LAorICAgIHsgIm5vbmJsb2NraW5nIiwgWk9GX05CTEssIDAgfSwKKyAgICB7ICJ1bmJ1ZmZlcmVkIiwgIFpPRl9OQlVGLCAwIH0KK307CitzdGF0aWMgaW50IG56b2Z0YWIgPSAoc2l6ZW9mKHpvZnRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworCitleHRlcm4gaW50IHF1ZXJ5OyAgICAgICAgICAgICAgICAgICAgICAgLyogR2xvYmFsIGZsYWcgZm9yIFFVRVJZIGFjdGl2ZSAqLworCisjaWZuZGVmIE5PU1BMCisjaWZuZGVmIE5PWEZFUgorc3RhdGljIHN0cnVjdCBrZXl0YWIgdmFydHlwW10gPSB7ICAgICAgIC8qIFZhcmlhYmxlIHR5cGVzIGZvciBSRU1PVEUgUVVFUlkgKi8KKyAgICB7ICJnbG9iYWwiLCAgIChpbnQpICdHJywgQ01fSU5WIH0sCisgICAgeyAia2VybWl0IiwgICAoaW50KSAnSycsIDAgfSwKKyAgICB7ICJzeXN0ZW0iLCAgIChpbnQpICdTJywgMCB9LAorICAgIHsgInVzZXIiLCAgICAgKGludCkgJ0cnLCAwIH0KK307CitzdGF0aWMgaW50IG52YXJ0eXAgPSAoc2l6ZW9mKHZhcnR5cCkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworI2VuZGlmIC8qIE5PWEZFUiAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBDS19USU1FUlMKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHRpbW90YWJbXSA9IHsgICAgICAvKiBUaW1lciB0eXBlcyAqLworICAgIHsgImR5bmFtaWMiLCAxLCAwIH0sCisgICAgeyAiZml4ZWQiLCAgIDAsIDAgfQorfTsKKyNlbmRpZiAvKiBDS19USU1FUlMgKi8KKworI2lmZGVmIERDTURCVUYKK2V4dGVybiBjaGFyICphdHhidWYsICphdG1idWY7ICAgICAgICAgICAvKiBBdG9tIGJ1ZmZlciAqLworZXh0ZXJuIGNoYXIgKmNtZGJ1ZjsgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgYnVmZmVyICovCitleHRlcm4gY2hhciAqbGluZSwgKnRtcGJ1ZjsgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIGJ1ZmZlcnMgZm9yIGFueXRoaW5nICovCitleHRlcm4gaW50ICppbnRpbWU7ICAgICAgICAgICAgICAgICAgICAgLyogSU5QVVQgVElNRU9VVCAqLworCisjZWxzZSAgLyogTm90IERDTURCVUYgLi4uICovCisKK2V4dGVybiBjaGFyIGF0eGJ1ZltdLCBhdG1idWZbXTsgICAgICAgICAvKiBBdG9tIGJ1ZmZlciAqLworZXh0ZXJuIGNoYXIgY21kYnVmW107ICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgYnVmZmVyICovCitleHRlcm4gY2hhciBsaW5lW10sIHRtcGJ1ZltdOyAgICAgICAgICAgLyogQ2hhcmFjdGVyIGJ1ZmZlciBmb3IgYW55dGhpbmcgKi8KK2V4dGVybiBpbnQgaW50aW1lW107CisKKyNlbmRpZiAvKiBEQ01EQlVGICovCisKKyNpZm5kZWYgTk9DU0VUUworZXh0ZXJuIHN0cnVjdCBrZXl0YWIgZmNzdGFiW107ICAgICAgICAgIC8qIEZvciBTRVQgRklMRSBDSEFSQUNURVItU0VUICovCitleHRlcm4gc3RydWN0IGNzaW5mbyBmY3NpbmZvW107ICAgICAgICAgLyogRmlsZSBjaGFyYWN0ZXIgc2V0IGluZm8uICovCitleHRlcm4gc3RydWN0IGtleXRhYiB0dGNzdGFiW107CitleHRlcm4gaW50IG5maWxjLCBmY2hhcnNldCwgdGNoYXJzZXQsIG50ZXJtYywgdGNzciwgdGNzbCwgZGNzZXQ3LCBkY3NldDg7CisjaWZkZWYgQ0tPVU5JCitleHRlcm4gaW50IHR0X3V0Zjg7CisjZW5kaWYgLyogQ0tPVU5JICovCisjaWZkZWYgT1MyCitfUFJPVE9UWVAoIGludCBvczJzZXRjcCwgKGludCkgKTsKK19QUk9UT1RZUCggaW50IG9zMmdldGNwLCAodm9pZCkgKTsKK19QUk9UT1RZUCggdm9pZCBvczJkZWJ1Z29mZiwgKHZvaWQpICk7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworCitleHRlcm4gaW50IGNtZGx2bDsgICAgICAgICAgICAgICAgICAgICAgLyogT3ZlcmFsbCBjb21tYW5kIGxldmVsICovCisKKyNpZm5kZWYgTk9TUEwKKyNpZmRlZiBEQ01EQlVGCitleHRlcm4gaW50ICppbnBjYXM7ICAgICAgICAgICAgICAgICAgICAgLyogSU5QVVQgQ0FTRSBzZXR0aW5nIG9uIGNtZCBzdGFjayAqLworI2Vsc2UKK2V4dGVybiBpbnQgaW5wY2FzW107CisjZW5kaWYgLyogRENNREJVRiAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBDS19DVVJTRVMKKyNpZm5kZWYgVk1TCitfUFJPVE9UWVAoaW50IHRnZXRlbnQsKGNoYXIgKiwgY2hhciAqKSk7CisjZWxzZQorI2lmZGVmIF9fREVDQworX1BST1RPVFlQKGludCB0Z2V0ZW50LChjaGFyICosIGNoYXIgKikpOworI2VuZGlmIC8qIF9fREVDQyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIENLX0NVUlNFUyAqLworCisjaWZuZGVmIE5PWE1JVAorI2RlZmluZSBYTUlURiAwICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBUUkFOU01JVCB2YWx1ZXMgKi8KKyNkZWZpbmUgWE1JVEwgMSAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoTG9jYWwgdG8gdGhpcyBtb2R1bGUpICovCisjZGVmaW5lIFhNSVRQIDIKKyNkZWZpbmUgWE1JVEUgMworI2RlZmluZSBYTUlUWCA0CisjZGVmaW5lIFhNSVRTIDUKKyNkZWZpbmUgWE1JVFcgNgorI2RlZmluZSBYTUlUVCA3CisKKyNkZWZpbmUgWE1CVUZMIDUwCitleHRlcm4gaW50IHhtaXRmLCB4bWl0bCwgeG1pdHAsIHhtaXR4LCB4bWl0cywgeG1pdHcsIHhtaXR0OworY2hhciB4bWl0YnVmW1hNQlVGTCsxXSA9IHsgTlVMIH07ICAgICAgIC8qIFRSQU5TTUlUIGVvZiBzdHJpbmcgKi8KKworc3RydWN0IGtleXRhYiB4bWl0YWJbXSA9IHsgICAgICAgICAgICAgIC8qIFNFVCBUUkFOU01JVCAqLworICAgIHsgImVjaG8iLCAgICAgICAgICBYTUlUWCwgMCB9LAorICAgIHsgImVvZiIsICAgICAgICAgICBYTUlURSwgMCB9LAorICAgIHsgImZpbGwiLCAgICAgICAgICBYTUlURiwgMCB9LAorICAgIHsgImxpbmVmZWVkIiwgICAgICBYTUlUTCwgMCB9LAorICAgIHsgImxvY2tpbmctc2hpZnQiLCBYTUlUUywgMCB9LAorICAgIHsgInBhdXNlIiwgICAgICAgICBYTUlUVywgMCB9LAorICAgIHsgInByb21wdCIsICAgICAgICBYTUlUUCwgMCB9LAorICAgIHsgInRpbWVvdXQiLCAgICAgICBYTUlUVCwgMCB9Cit9OworaW50IG54bWl0ID0gKHNpemVvZih4bWl0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKyNlbmRpZiAvKiBOT1hNSVQgKi8KKworLyogRm9yIFNFVCBGSUxFIENPTExJU0lPTiAqLworLyogU29tZSBvZiB0aGUgZm9sbG93aW5nIG1heSBiZSBwb3NzaWJsZSBmb3Igc29tZSBDLUtlcm1pdCBpbXBsZW1lbnRhdGlvbnMgKi8KKy8qIGJ1dCBub3Qgb3RoZXJzLiAgVGhvc2UgdGhhdCBhcmUgbm90IHBvc3NpYmxlIGZvciB5b3VyIGltcGxlbWVudGF0aW9uICovCisvKiBzaG91bGQgYmUgaWZkZWYnZCBvdXQuICovCisKK3N0cnVjdCBrZXl0YWIgY29seHRhYltdID0geyAvKiBTRVQgRklMRSBDT0xMSVNJT04gb3B0aW9ucyAqLworI2lmbmRlZiBNQUMKKyAgICB7ICJhcHBlbmQiLCAgICBYWUZYX0EsIDAgfSwgICAgICAgICAvKiBhcHBlbmQgdG8gb2xkIGZpbGUgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgeyAiYXNrIiwgICAgICAgWFlGWF9RLCAwIH0sICAgICAgICAgLyogYXNrIHdoYXQgdG8gZG8gKG5vdCBpbXBsZW1lbnRlZCkgKi8KKyNlbmRpZgorICAgIHsgImJhY2t1cCIsICAgIFhZRlhfQiwgMCB9LCAgICAgICAgIC8qIHJlbmFtZSBvbGQgZmlsZSAqLworI2lmbmRlZiBNQUMKKyAgICAvKiBUaGlzIGNyYXNoZXMgTWFjIEtlcm1pdC4gKi8KKyAgICB7ICJkaXNjYXJkIiwgICBYWUZYX0QsIDAgfSwgICAgICAgICAvKiBkb24ndCBhY2NlcHQgbmV3IGZpbGUgKi8KKyAgICB7ICJuby1zdXBlcnNlZGUiLCBYWUZYX0QsIENNX0lOViB9LCAvKiBkaXR0byAoTVNLIGNvbXBhdGliaWxpdHkpICovCisjZW5kaWYgLyogTUFDICovCisgICAgeyAib3ZlcndyaXRlIiwgWFlGWF9YLCAwIH0sICAgICAgICAgLyogb3ZlcndyaXRlIHRoZSBvbGQgZmlsZSAqLworICAgIHsgInJlbmFtZSIsICAgIFhZRlhfUiwgMCB9LCAgICAgICAgIC8qIHJlbmFtZSB0aGUgaW5jb21pbmcgZmlsZSAqLworI2lmbmRlZiBNQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgY3Jhc2hlcyBNYWMgS2VybWl0LiAqLworICAgIHsgInVwZGF0ZSIsICAgIFhZRlhfVSwgMCB9LCAgICAgICAgIC8qIHJlcGxhY2UgaWYgbmV3ZXIgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyAgICB7ICIiLCAwLCAwIH0KK307CitpbnQgbmNvbHggPSAoc2l6ZW9mKGNvbHh0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHJmaWx0YWJbXSA9IHsgICAgICAvKiBmb3IgUkVNT1RFIFNFVCBGSUxFICovCisjaWZuZGVmIE5PQ1NFVFMKKyAgICB7ICJjaGFyYWN0ZXItc2V0IiwgWFlGSUxDLCAwIH0sCisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgIHsgImNvbGxpc2lvbiIsICAgICBYWUZJTFgsIDAgfSwKKyAgICB7ICJpbmNvbXBsZXRlIiwgICAgWFlGSUxJLCAwIH0sCisgICAgeyAibmFtZXMiLCAgICAgICAgIFhZRklMTiwgMCB9LAorICAgIHsgInJlY29yZC1sZW5ndGgiLCBYWUZJTFIsIDAgfSwKKyAgICB7ICJ0eXBlIiwgICAgICAgICAgWFlGSUxULCAwIH0KK307CitpbnQgbnJmaWxwID0gKHNpemVvZihyZmlsdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgZW9sdGFiW10gPSB7ICAgICAgICAgICAgICAvKiBGaWxlIGVvZiBkZWxpbWl0ZXJzICovCisgICAgeyAiY3IiLCAgICAgICAgWFlGQV9DLCAwIH0sCisgICAgeyAiY3JsZiIsICAgICAgWFlGQV8yLCAwIH0sCisgICAgeyAibGYiLCAgICAgICAgWFlGQV9MLCAwIH0KK307CitzdGF0aWMgaW50IG5lb2x0YWIgPSAoc2l6ZW9mKGVvbHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdHJ1Y3Qga2V5dGFiIGZudGFiW10gPSB7ICAgICAgICAgICAgICAgLyogRmlsZSBuYW1pbmcgKi8KKyAgICB7ICJjb252ZXJ0ZWQiLCBYWUZOX0MsIDAgICAgICB9LAorICAgIHsgImxpdGVyYWwiLCAgIFhZRk5fTCwgMCAgICAgIH0sCisgICAgeyAic3RhbmRhcmQiLCAgWFlGTl9DLCBDTV9JTlYgfQorfTsKK2ludCBuZm50YWIgPSAoc2l6ZW9mKGZudGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKKyNpZm5kZWYgTk9MT0NBTAorLyogVGVybWluYWwgcGFyYW1ldGVycyB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBrZXl0YWIgdHJtdGFiW10gPSB7CisjaWZkZWYgT1MyCisgICAgeyAiYW5zd2VyYmFjayIsICAgIFhZVEFOUywgICAgMCB9LAorI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIENLX0FQQworICAgIHsgImFwYyIsICAgICAgICAgICBYWVRBUEMsICAgIDAgfSwKKyNlbmRpZiAvKiBDS19BUEMgKi8KKyNpZmRlZiBPUzIKKyAgICB7ICJhcnJvdy1rZXlzIiwgICAgWFlUQVJSLCAgICAwIH0sCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgTlQKKyAgICB7ICJhdCIsICAgICAgICAgICAgWFlUQVRUUiwgICBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiYXR0IiwgICAgICAgICAgIFhZVEFUVFIsICAgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgImF0dHIiLCAgICAgICAgICBYWVRBVFRSLCAgIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJhdHRyLWJ1ZyIsICAgICAgWFlUQVRUQlVHLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIE9TMgorICAgIHsgImF0dHJpYnV0ZSIsICAgICBYWVRBVFRSLCAgIDAgfSwKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBDS19BUEMKKyNpZmRlZiBDS19BVVRPREwKKyAgIHsgImF1dG9kb3dubG9hZCIsICAgWFlUQVVUT0RMLCAwLCB9LAorI2VuZGlmIC8qIENLX0FVVE9ETCAqLworI2VuZGlmIC8qIENLX0FQQyAqLworI2lmZGVmIE9TMgorICAgIHsgImF1dG9wYWdlIiwgICAgICBYWVRBUEFHRSwgIDAgfSwKKyAgICB7ICJhdXRvc2Nyb2xsIiwgICAgWFlUQVNDUkwsICAwIH0sCisgICAgeyAiYmVsbCIsICAgICAgICAgIFhZVEJFTCwgICAgQ01fSU5WIH0sCisjZW5kaWYgLyogT1MyICovCisgICAgeyAiYnl0ZXNpemUiLCAgICAgIFhZVEJZVCwgICAgMCB9LAorI2lmbmRlZiBOT0NTRVRTCisgICAgeyAiY2hhcmFjdGVyLXNldCIsIFhZVENTLCAgICAgMCB9LAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyNpZmRlZiBPUzIKKyAgICB7ICJjb2RlLXBhZ2UiLCAgICAgWFlUQ1BHLCAgICAwIH0sCisgICAgeyAiY29sb3IiLCAgICAgICAgIFhZVENPTCwgICAgMCB9LAorICAgIHsgImNvbnRyb2xzIiwgICAgICBYWVRDVFJMLCAgIDAgfSwKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB7ICJjci1kaXNwbGF5IiwgICAgWFlUQ1JELCAgICAwIH0sCisjaWZkZWYgT1MyCisgICAgeyAiY3Vyc29yIiwgICAgICAgIFhZVENVUiwgICAgMCB9LAorI2VuZGlmIC8qIE9TMiAqLworICAgIHsgImRlYnVnIiwgICAgICAgICBYWVRERUIsICAgIDAgfSwKKyNpZmRlZiBPUzIKKyAgICB7ICJkZy11bml4LW1vZGUiLCAgWFlUVU5YLCAgICAwIH0sCisjZW5kaWYgLyogT1MyICovCisgICAgeyAiZWNobyIsICAgICAgICAgIFhZVEVDLCAgICAgMCB9LAorICAgIHsgImVzY2FwZS1jaGFyYWN0ZXIiLCBYWVRFU0MsIDAgfSwKKyNpZmRlZiBPUzIKKyNpZmRlZiBQQ0ZPTlRTCisgICAgeyAiZm9udCIsICAgICAgICAgIFhZVEZPTiwgICAgMCB9LAorI2Vsc2UKKyNpZmRlZiBLVUkKKyAgICB7ICJmb250IiwgICAgICAgICAgWFlURk9OLCAgICAwIH0sCisjZW5kaWYgLyogS1VJICovCisjZW5kaWYgLyogUENGT05UUyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIHsgImhlaWdodCIsICAgICAgICBYWVRISUcsICAgIDAgfSwKKyNpZmRlZiBDS1RJRExFCisgICAgeyAiaWRsZS1hY3Rpb24iLCAgIFhZVElBQ1QsICAgMCB9LAorICAgIHsgImlkbGUtbGltaXQiLCAgICBYWVRJVE1PLCAgIENNX0lOViB9LAorICAgIHsgImlkbGUtc2VuZCIsICAgICBYWVRJRExFLCAgIENNX0lOViB9LAorICAgIHsgImlkbGUtdGltZW91dCIsICBYWVRJVE1PLCAgIDAgfSwKKyNlbmRpZiAvKiBDS1RJRExFICovCisjaWZkZWYgT1MyCisjaWZuZGVmIE5PQ1NFVFMKKyAgICB7ICJrYmQtZm9sbG93cy1nbC9nciIsIFhZVEtCREdMLCAwIH0sCisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgIHsgImtleSIsICAgICAgICAgICBYWVRLRVksICAgIDAgfSwKKyAgICB7ICJrZXlib2FyZC1tb2RlIiwgWFlUS0JNT0QsICAwIH0sCisgICAgeyAia2V5cGFkLW1vZGUiLCAgIFhZVEtQRCwgICAgMCB9LAorI2VuZGlmIC8qIE9TMiAqLworI2lmbmRlZiBOT0NTRVRTCisjaWZkZWYgT1MyCisjaWZuZGVmIEtVSQorICAgIHsgImxpbmUtc3BhY2luZyIsICBYWVRMU1AsICAgIENNX0lOViB9LAorICAgIHsgImxvY2FsLWNoYXJhY3Rlci1zZXQiLCBYWVRMQ1MsICAwIH0sCisjZWxzZQorICAgIHsgImxpbmUtc3BhY2luZyIsICBYWVRMU1AsICAgIDAgfSwKKyAgICB7ICJsb2NhbC1jaGFyYWN0ZXItc2V0IiwgWFlUTENTLCAgQ01fSU5WIH0sCisjZW5kaWYgLyogS1VJICovCisjZWxzZQorICAgIHsgImxvY2FsLWNoYXJhY3Rlci1zZXQiLCBYWVRMQ1MsICBDTV9JTlYgfSwKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgeyAibG9ja2luZy1zaGlmdCIsIFhZVFNPLCAgICAgMCB9LAorI2lmZGVmIE9TMgorICAgIHsgIm1hcmdpbi1iZWxsIiwgICBYWVRNQkVMLCAgIDAgfSwKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBPUzJNT1VTRQorICAgIHsgIm1vdXNlIiwgICAgICAgICBYWVRNT1UsICAgIENNX0lOViB9LAorI2VuZGlmIC8qIE9TMk1PVVNFICovCisgICAgeyAibmV3bGluZS1tb2RlIiwgIFhZVE5MLCAgICAgMCB9LAorI2lmZGVmIE9TMgorICAgIHsgIm91dHB1dC1wYWNpbmciLCBYWVRQQUMsICAgIDAgfSwKKyNpZmRlZiBQQ1RFUk0KKyAgICB7ICJwY3Rlcm0iLCAgICAgICAgWFlUUENURVJNLCAwIH0sCisjZW5kaWYgLyogUENURVJNICovCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgT1MyT1JVTklYCisgICAgeyAicHJpbnQiLCAgICAgICAgIFhZVFBSTiwgICAgMCB9LAorI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworI2lmbmRlZiBOT0NTRVRTCisjaWZkZWYgT1MyCisgICAgeyAicmVtb3RlLWNoYXJhY3Rlci1zZXQiLCBYWVRSQ1MsICAwIH0sCisjZWxzZQorICAgIHsgInJlbW90ZS1jaGFyYWN0ZXItc2V0IiwgWFlUUkNTLCAgQ01fSU5WIH0sCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworI2lmZGVmIE9TMgorICAgIHsgInJvbGwtbW9kZSIsICAgICAgIFhZVFJPTCwgMCB9LAorICAgIHsgInMiLCAgICAgICAgICAgICAgIFhZVFVQRCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgInNjIiwgICAgICAgICAgICAgIFhZVFVQRCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgInNjciIsICAgICAgICAgICAgIFhZVFVQRCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgInNjcmVlIiwgICAgICAgICAgIFhZVFVQRCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgInNjcmVlbiIsICAgICAgICAgIFhZVFVQRCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgInNjcmVlbi0iLCAgICAgICAgIFhZVFVQRCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgInNjcmVlbi1tb2RlIiwgICAgIFhZVFNDTk0sICAgMCB9LAorICAgIHsgInNjcmVlbi1vcHRpbWl6ZSIsIFhZVE9QVEksICAgMCB9LAorICAgIHsgInNjcmVlbi11cGRhdGUiLCAgIFhZVFVQRCwgICAgMCB9LAorICAgIHsgInNjcm9sbGJhY2siLCAgICAgIFhZU0NSUywgICAgMCB9LAorICAgIHsgInNlbmQtZGF0YSIsICAgICAgICAgWFlUU0VORCwgMCB9LAorICAgIHsgInNlbmQtZW5kLW9mLWJsb2NrIiwgWFlUU0VPQiwgMCB9LAorICAgIHsgInNnci1jb2xvcnMiLCAgICAgICAgICAgIFhZVFNHUkMsICAwIH0sCisgICAgeyAic25pLWNoLmNvZGUiLCAgICAgICAgICAgWFlUU05JQ0MsIDAgfSwKKyAgICB7ICJzbmktZmlybXdhcmUtdmVyc2lvbnMiLCBYWVRTTklGViwgMCB9LAorICAgIHsgInNuaS1sYW5ndWFnZSIsICAgICAgICAgIFhZVFZUTE5HLCAwIH0sCisgICAgeyAic25pLXBhZ2Vtb2RlIiwgICAgICAgICAgWFlUU05JUE0sIENNX0lOViB9LAorICAgIHsgInNuaS1zY3JvbGxtb2RlIiwgICAgICAgICAgICAgIFhZVFNOSVNNLCBDTV9JTlYgfSwKKyAgICB7ICJzcGFjaW5nLWF0dHJpYnV0ZS1jaGFyYWN0ZXIiLCBYWVRTQUMsICAgQ01fSU5WIH0sCisgICAgeyAic3RhdHVzbGluZSIsICAgICAgICAgICAgICAgICAgWFlUU1RBVCwgIDAgfSwKKyAgICB7ICJ0cmEiLCAgICAgICAgICAgICAgICAgICAgICAgICBYWVRDVFMsICAgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgInRyYW5zbWl0LXRpbWVvdXQiLCAgICAgICAgICAgIFhZVENUUywgICAwIH0sCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBPUzJPUlVOSVgKKyAgICB7ICJ0cmFuc3BhcmVudC1wcmludCIsIFhZVFBSTiwgICBDTV9JTlYgfSwKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKworI2lmZGVmIENLX1RSSUdHRVIKKyAgICB7ICJ0cmlnZ2VyIiwgICAgICAgICAgIFhZVFJJR0dFUiwwIH0sCisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworI2lmZGVmIE9TMgorICAgIHsgInR5cGUiLCAgICAgICAgICAgICAgWFlUVFlQLCAgIDAgfSwKKyNlbHNlCisgICAgeyAidHlwZSIsICAgICAgICAgICAgICBYWVRUWVAsICAgQ01fSU5WIH0sCisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgTk9DU0VUUworI2lmZGVmIFVOSUNPREUKKyNpZmRlZiBDS09VTkkKKyAgICB7ICJ1bmljb2RlIiwgICAgICAgICAgIFhZVFVOSSwgICBDTV9JTlYgfSwKKyNlbmRpZiAvKiBDS09VTkkgKi8KKyNlbmRpZiAvKiBVTklDT0RFICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworI2lmZGVmIE9TMgorICAgIHsgInVuaXgtbW9kZSIsICAgICAgICAgWFlUVU5YLCAgIENNX0lOViB9LAorICAgIHsgInVybC1oaWdobGlnaHQiLCAgICAgWFlUVVJMSEksIDAgfSwKKyNpZmRlZiBOVAorICAgIHsgInZpZGVvLWNoYW5nZSIsICAgICAgWFlUVkNILCAgIDAgfSwKKyNlbmRpZiAvKiBOVCAqLworICAgIHsgInZ0LWxhbmd1YWdlIiwgICAgICAgWFlUVlRMTkcsIDAgfSwKKyAgICB7ICJ2dC1ucmMtbW9kZSIsICAgICAgIFhZVFZUTlJDLCAwIH0sCisjZW5kaWYgLyogT1MyICovCisgICAgeyAid2lkdGgiLCAgICAgICAgICAgICBYWVRXSUQsICAgMCB9LAorI2lmZGVmIE9TMgorICAgIHsgIndyYXAiLCAgICAgICAgICAgICAgWFlUV1JQLCAgIDAgfSwKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB7ICIiLCAwLCAwIH0KK307CitpbnQgbnRybSA9IChzaXplb2YodHJtdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCisjaWZkZWYgT1MyCitzdHJ1Y3Qga2V5dGFiIHRlcm1jdHJsW10gPSB7ICAgIC8qIFNFVCBURVJNIENPTlRST0xTICovCisgICAgeyAiNyIsICAgICAgNywgMCB9LAorICAgIHsgIjgiLCAgICAgIDgsIDAgfQorfTsKK2ludCBudGVybWN0cmwgPSAoc2l6ZW9mKHRlcm1jdHJsKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgY3Vyb250YWJbXSA9IHsgICAgLyogU0VUIFRFUk0gQ1VSU09SICovCisjaWZkZWYgS1VJCisgICAgeyAibm9ibGluayIsIDIsIDAgfSwKKyNlbHNlCisgICAgeyAibm9ibGluayIsIDIsIENNX0lOViB9LAorI2VuZGlmIC8qIEtVSSAqLworICAgIHsgIm9mZiIsICAgICAwLCAwIH0sCisgICAgeyAib24iLCAgICAgIDEsIDAgfQorfTsKK2ludCBuY3Vyb24gPSAoc2l6ZW9mKGN1cm9udGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgcm9sbHRhYltdID0geyAgIC8qIFNldCBURVJNIFJvbGwgT3B0aW9ucyAqLworICAgIHsgImluc2VydCIsICAgIFRUUl9JTlNFUlQsIDAgICAgICB9LAorICAgIHsgImtleXN0cm9rZXMiLFRUUl9LRVlTLCAgIDAgICAgICB9LAorICAgIHsgIm9mZiIsICAgICAgIFRUUl9PVkVSLCAgIENNX0lOViB9LAorICAgIHsgIm9uIiwgICAgICAgIFRUUl9JTlNFUlQsIENNX0lOViB9LAorICAgIHsgIm92ZXJ3cml0ZSIsIFRUUl9PVkVSLCAgIDAgICAgICB9Cit9OworaW50IG5yb2xsID0gKHNpemVvZihyb2xsdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgcm9sbGtleXRhYltdID0gewkJLyogU2V0IFRFUk0gUk9MTCBLRVlTVFJPS0VTICovCisgICAgeyAiaWdub3JlIiwgICAgICAgICAgICBUVFJLX0lHTiwgMCB9LAorICAgIHsgInJlc3RvcmUtYW5kLXNlbmQiLCAgVFRSS19SU1QsIDAgfSwKKyAgICB7ICJzZW5kIiwgICAgICAgICAgICAgIFRUUktfU05ELCAwIH0KK307CitpbnQgbnJvbGxrZXkgPSAoc2l6ZW9mKHJvbGxrZXl0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2RlZmluZSBUVF9HUl9BTEwgNAorI2RlZmluZSBUVF9HUl9HMCAgMAorI2RlZmluZSBUVF9HUl9HMSAgMQorI2RlZmluZSBUVF9HUl9HMiAgMgorI2RlZmluZSBUVF9HUl9HMyAgMworI2RlZmluZSBUVF9HUl9LQkQgNAorc3RydWN0IGtleXRhYiBncmFwaHNldHRhYltdID0geyAgLyogREVDIFZUIEdyYXBoaWMgU2V0cyAqLworICAgIHsgImFsbCIsICAgICAgVFRfR1JfQUxMLCAwIH0sCisgICAgeyAiZzAiLCAgICAgICBUVF9HUl9HMCwgIDAgfSwKKyAgICB7ICJnMSIsICAgICAgIFRUX0dSX0cxLCAgMCB9LAorICAgIHsgImcyIiwgICAgICAgVFRfR1JfRzIsICAwIH0sCisgICAgeyAiZzMiLCAgICAgICBUVF9HUl9HMywgIDAgfSwKKyAgICB7ICJrZXlib2FyZCIsIFRUX0dSX0tCRCwgMCB9Cit9OworaW50IG5ncmFwaHNldCA9IChzaXplb2YoZ3JhcGhzZXR0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKyNlbmRpZiAvKiBPUzIgKi8KKworc3RydWN0IGtleXRhYiBhZGx0YWJbXSA9IHsgICAgICAgICAgICAgIC8qIEF1dG9kb3dubG9hZCBPcHRpb25zICovCisgICAgeyAiYXNrIiwgICAgIFRBRF9BU0ssIDAgfSwKKyAgICB7ICJlcnJvciIsICAgVEFEX0VSUiwgMCB9LAorI2lmZGVmIE9TMgorICAgIHsgImtlcm1pdCIsICBUQURfSywgICAwIH0sCisjZW5kaWYgLyogT1MyICovCisgICAgeyAib2ZmIiwgICAgIFRBRF9PRkYsIDAgfSwKKyAgICB7ICJvbiIsICAgICAgVEFEX09OLCAgMCB9LAorI2lmZGVmIE9TMgorICAgIHsgInptb2RlbSIsICBUQURfWiwgICAwIH0sCisjZW5kaWYgLyogT1MyICovCisgICAgeyAiIiwgMCwgMCB9Cit9OworaW50IG5hZGx0YWIgPSAoc2l6ZW9mKGFkbHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RydWN0IGtleXRhYiBhZGxlcnJ0YWJbXSA9IHsgICAgICAgICAgIC8qIEF1dG9kb3dubG9hZCBFcnJvciBPcHRpb25zICovCisgICAgeyAiY29udGludWUiLCAwLCAwIH0sCisgICAgeyAiZ28iLCAgICAgICAwLCBDTV9JTlYgfSwKKyAgICB7ICJzdG9wIiwgICAgIDEsIDAgfQorfTsKK2ludCBuYWRsZXJydGFiID0gKHNpemVvZihhZGxlcnJ0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2lmZGVmIE9TMgorc3RydWN0IGtleXRhYiBhZGx4dGFiW10gPSB7ICAgICAgICAgICAgIC8qIEF1dG9kb3dubG9hZCBPcHRpb25zICovCisgICAgeyAiYzAtY29uZmxpY3RzIiwgICAgIFRBRF9YX0MwLCAgICAgMCB9LAorICAgIHsgImRldGVjdGlvbi1tZXRob2QiLCBUQURfWF9ERVRFQ1QsIDAgfSwKKyAgICB7ICJzdHJpbmciLCAgICAgICAgICAgVEFEX1hfU1RSLCAgICAwIH0KK307CitpbnQgbmFkbHh0YWIgPSAoc2l6ZW9mKGFkbHh0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RydWN0IGtleXRhYiBhZGxkdGFiW10gPSB7ICAgICAgICAgICAgIC8qIEF1dG8tZGwgRGV0ZWN0aW9uIE1ldGhvZHMgKi8KKyAgICB7ICJwYWNrZXQiLCAgICAgICAgICAgQURMX1BBQ0ssICAgICAwIH0sCisgICAgeyAic3RyaW5nIiwgICAgICAgICAgIEFETF9TVFIsICAgICAgMCB9Cit9OworaW50IG5hZGxkdGFiID0gKHNpemVvZihhZGxkdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgYWRsYzB0YWJbXSA9IHsgICAgICAgICAgICAvKiBBdXRvLWRsIERldGVjdGlvbiBNZXRob2RzICovCisgICAgeyAiaWdub3JlZC1ieS1lbXVsYXRvciIsICAgIDAsICAgICAgMCB9LAorICAgIHsgInByb2Nlc3NlZC1ieS1lbXVsYXRvciIsICAxLCAgICAgIDAgfQorfTsKK2ludCBuYWRsYzB0YWIgPSAoc2l6ZW9mKGFkbGMwdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKKyNpZm5kZWYgTk9DU0VUUworc3RydWN0IGtleXRhYiB2dGxhbmd0YWJbXSA9IHsKKyAgICB7ICJiZWxnaWFuIiwgICAgICAgIFZUTF9CRUxHSUFOICwgMCB9LAorICAgIHsgImJyaXRpc2giLCAgICAgICAgVlRMX0JSSVRJU0ggLCAwIH0sCisgICAgeyAiY2FuYWRpYW4iLCAgICAgICBWVExfQ0FOQURJQU4sIDAgfSwKKyAgICB7ICJjemVjaCIsICAgICAgICAgIFZUTF9DWkVDSCAgICwgMCB9LAorICAgIHsgImRhbmlzaCIsICAgICAgICAgVlRMX0RBTklTSCAgLCAwIH0sCisgICAgeyAiZHV0Y2giLCAgICAgICAgICBWVExfRFVUQ0ggICAsIDAgfSwKKyAgICB7ICJmaW5uaXNoIiwgICAgICAgIFZUTF9GSU5OSVNIICwgMCB9LAorICAgIHsgImZyZW5jaCIsICAgICAgICAgVlRMX0ZSRU5DSCAgLCAwIH0sCisgICAgeyAiZnJlbmNoLWNhbmFkaWFuIixWVExfRlJfQ0FOICAsIDAgfSwKKyAgICB7ICJnZXJtYW4iLCAgICAgICAgIFZUTF9HRVJNQU4gICwgMCB9LAorICAgIHsgImdyZWVrIiwgICAgICAgICAgVlRMX0dSRUVLICAgLCAwIH0sCisgICAgeyAiaGVicmV3IiwgICAgICAgICBWVExfSEVCUkVXICAsIDAgfSwKKyAgICB7ICJodW5nYXJpYW4iLCAgICAgIFZUTF9IVU5HQVJJQSwgMCB9LAorICAgIHsgIml0YWxpYW4iLCAgICAgICAgVlRMX0lUQUxJQU4gLCAwIH0sCisgICAgeyAibGF0aW4tYW1lcmljYW4iLCBWVExfTEFUSU5fQU0sIDAgfSwKKyAgICB7ICJub3J0aC1hbWVyaWNhbiIsIFZUTF9OT1JUSF9BTSwgMCB9LAorICAgIHsgIm5vcndlZ2lhbiIsICAgICAgVlRMX05PUldFR0lBLCAwIH0sCisgICAgeyAicG9saXNoIiwgICAgICAgICBWVExfUE9MSVNIICAsIDAgfSwKKyAgICB7ICJwb3J0dWdlc2UiLCAgICAgIFZUTF9QT1JUVUdFUywgMCB9LAorICAgIHsgInJvbWFuaWFuIiwgICAgICAgVlRMX1JPTUFOSUFOLCAwIH0sCisgICAgeyAicnVzc2lhbiIsICAgICAgICBWVExfUlVTU0lBTiAsIDAgfSwKKyAgICB7ICJzY3MiLCAgICAgICAgICAgIFZUTF9TQ1MgICAgICwgQ01fSU5WIH0sCisgICAgeyAic2xvdmFrIiwgICAgICAgICBWVExfU0xPVkFLICAsIDAgfSwKKyAgICB7ICJzcGFuaXNoIiwgICAgICAgIFZUTF9TUEFOSVNIICwgMCB9LAorICAgIHsgInN3ZWRpc2giLCAgICAgICAgVlRMX1NXRURJU0ggLCAwIH0sCisgICAgeyAic3dpc3MtZnJlbmNoIiwgICBWVExfU1dfRlIgICAsIDAgfSwKKyAgICB7ICJzd2lzcy1nZXJtYW4iLCAgIFZUTF9TV19HUiAgICwgMCB9LAorICAgIHsgInR1cmtpc2gtZiIsICAgICAgVlRMX1RVUktfRiAgLCBDTV9JTlYgfSwKKyAgICB7ICJ0dXJraXNoLXEiLCAgICAgIFZUTF9UVVJLX1EgICwgQ01fSU5WIH0KK307CitpbnQgbnZ0bGFuZ3RhYiA9IChzaXplb2YodnRsYW5ndGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisjZW5kaWYgLyogTk9DU0VUUyAqLworI2VuZGlmIC8qIE9TMiAqLworCitzdHJ1Y3Qga2V5dGFiIGNyZHRhYltdID0geyAgICAgICAgICAgICAgLyogQ2FycmlhZ2UtcmV0dXJuIGRpc3BsYXkgKi8KKyAgICB7ICJjcmxmIiwgICAgICAgIDEsIDAgfSwKKyAgICB7ICJub3JtYWwiLCAgICAgIDAsIDAgfQorfTsKK2V4dGVybiBpbnQgdHRfY3JkOyAgICAgICAgICAgICAgICAgICAgICAvKiBDYXJyaWFnZS1yZXR1cm4gZGlzcGxheSB2YXJpYWJsZSAqLworCisjaWZkZWYgQ0tfQVBDCitleHRlcm4gaW50IGFwY3N0YXR1cywgYXBjYWN0aXZlOworc3RhdGljIHN0cnVjdCBrZXl0YWIgYXBjdGFiW10gPSB7ICAgICAgIC8qIFRlcm1pbmFsIEFQQyBwYXJhbWV0ZXJzICovCisgICAgeyAgIm5vLWlucHV0IiwgQVBDX09OfEFQQ19OT0lOUCwwIH0sCisgICAgeyAib2ZmIiwgICAgICAgQVBDX09GRiwgIDAgfSwKKyAgICB7ICJvbiIsICAgICAgICBBUENfT04sICAgMCB9LAorICAgIHsgInVuY2hlY2tlZCIsIEFQQ19PTnxBUENfVU5DSCwgMCB9LAorICAgIHsgInVuY2hlY2tlZC1uby1pbnB1dCIsIEFQQ19PTnxBUENfTk9JTlB8QVBDX1VOQ0gsIDAgfQorfTsKK2ludCBuYXBjdGFiID0gKHNpemVvZihhcGN0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKK2V4dGVybiBpbnQgYXV0b2RsLCBhZGxfZXJyLCBhZGxfYXNrOworCitzdHJ1Y3Qga2V5dGFiIGJlbHRhYltdID0geyAgICAgICAgICAgICAgLyogVGVybWluYWwgYmVsbCBtb2RlICovCisjaWZkZWYgT1MyCisgICAgeyAiYXVkaWJsZSIsIFhZQl9BVUQsICAwIH0sCisgICAgeyAibm9uZSIsICAgIFhZQl9OT05FLCAwIH0sCisjZWxzZQorICAgIHsgImF1ZGlibGUiLCBYWUJfQVVELCAgQ01fSU5WIH0sCisgICAgeyAibm9uZSIsICAgIFhZQl9OT05FLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBPUzIKKyAgICB7ICJvZmYiLCAgICAgWFlCX05PTkUsIENNX0lOViB9LAorICAgIHsgIm9uIiwgICAgICBYWUJfQVVELCAgQ01fSU5WIH0sCisjZWxzZQorICAgIHsgIm9mZiIsICAgICBYWUJfTk9ORSwgMCB9LAorICAgIHsgIm9uIiwgICAgICBYWUJfQVVELCAgMCB9LAorI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIE9TMgorICAgIHsgInZpc2libGUiLCBYWUJfVklTLCAgMCB9LAorI2VuZGlmIC8qIE9TMiAqLworICAgIHsgIiIsIDAsIDAgfQorfTsKK2ludCBuYmVsdGFiID0gc2l6ZW9mKGJlbHRhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpIC0gMTsKKworaW50IHR0X3VuaWNvZGUgPSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSBVbmljb2RlIGlmIHBvc3NpYmxlICovCisjaWZkZWYgQ0tUSURMRQoraW50IHR0X2lkbGVzbmRfdG1vID0gMDsgICAgICAgICAgICAgICAgIC8qIElkbGUgU2VuZCBUaW1lb3V0LCBkaXNhYmxlZCAqLworY2hhciAqIHR0X2lkbGVzbmRfc3RyID0gTlVMTDsgICAgICAgICAgIC8qIElkbGUgU2VuZCBTdHJpbmcsIG5vbmUgKi8KK2NoYXIgKiB0dF9pZGxlc3RyID0gTlVMTDsKK2V4dGVybiBpbnQgdHRfaWRsZWFjdCwgdHRfaWRsZWxpbWl0OworI2VuZGlmIC8qIENLVElETEUgKi8KKworI2lmZGVmIE9TMgorI2lmbmRlZiBOT0xPQ0FMCisvKgorICBPUy8yIHNlcmlhbCBjb21tdW5pY2F0aW9uIGRldmljZXMuCisqLworc3RydWN0IGtleXRhYiBvczJkZXZ0YWJbXSA9IHsKKyAgICB7ICIxIiwgICAgMSwgQ01fSU5WIH0sICAgICAgICAgICAgICAgICAgICAgIC8qIEludmlzaWJsZSBzeW5vbnltcywgbGlrZSAqLworICAgIHsgIjIiLCAgICAyLCBDTV9JTlYgfSwgICAgICAgICAgICAgICAgICAgICAgLyogInNldCBwb3J0IDEiICovCisgICAgeyAiMyIsICAgIDMsIENNX0lOViB9LAorICAgIHsgIjQiLCAgICA0LCBDTV9JTlYgfSwKKyAgICB7ICI1IiwgICAgNSwgQ01fSU5WIH0sCisgICAgeyAiNiIsICAgIDYsIENNX0lOViB9LAorICAgIHsgIjciLCAgICA3LCBDTV9JTlYgfSwKKyAgICB7ICI4IiwgICAgOCwgQ01fSU5WIH0sCisgICAgeyAiY29tMSIsIDEsIDAgfSwgICAgICAgICAgICAgICAgICAgLyogUmVhbCBkZXZpY2UgbmFtZXMgKi8KKyAgICB7ICJjb20yIiwgMiwgMCB9LAorICAgIHsgImNvbTMiLCAzLCAwIH0sCisgICAgeyAiY29tNCIsIDQsIDAgfSwKKyAgICB7ICJjb201IiwgNSwgMCB9LAorICAgIHsgImNvbTYiLCA2LCAwIH0sCisgICAgeyAiY29tNyIsIDcsIDAgfSwKKyAgICB7ICJjb204IiwgOCwgMCB9LAorI2lmZGVmIE9TMk9OTFkKKyAgICB7ICJzbGlwY29tMSIsIDEsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciB1c2Ugd2l0aCBTTElQIGRyaXZlciAqLworICAgIHsgInNsaXBjb20yIiwgMiwgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcmVkIGFjY2VzcyAqLworICAgIHsgInNsaXBjb20zIiwgMywgMCB9LAorICAgIHsgInNsaXBjb200IiwgNCwgMCB9LAorICAgIHsgInNsaXBjb201IiwgNSwgMCB9LAorICAgIHsgInNsaXBjb202IiwgNiwgMCB9LAorICAgIHsgInNsaXBjb203IiwgNywgMCB9LAorICAgIHsgInNsaXBjb204IiwgOCwgMCB9LAorICAgIHsgInBwcGNvbTEiLCAxLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIHVzZSB3aXRoIFBQUCBkcml2ZXIgKi8KKyAgICB7ICJwcHBjb20yIiwgMiwgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYXJlZCBhY2Nlc3MgKi8KKyAgICB7ICJwcHBjb20zIiwgMywgMCB9LAorICAgIHsgInBwcGNvbTQiLCA0LCAwIH0sCisgICAgeyAicHBwY29tNSIsIDUsIDAgfSwKKyAgICB7ICJwcHBjb202IiwgNiwgMCB9LAorICAgIHsgInBwcGNvbTciLCA3LCAwIH0sCisgICAgeyAicHBwY29tOCIsIDgsIDAgfQorI2VuZGlmIC8qIE9TMk9OTFkgKi8KK307CitpbnQgbm9zMmRldiA9IChzaXplb2Yob3MyZGV2dGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCisjaWZkZWYgT1MyT05MWQorc3RydWN0IGtleXRhYiBvczJwcHB0YWJbXSA9IHsKKyAgICB7ICIwIiwgICAgMCwgQ01fSU5WIH0sCisgICAgeyAiMSIsICAgIDEsIENNX0lOViB9LCAgICAgICAgICAgICAgICAgICAgICAvKiBJbnZpc2libGUgc3lub255bXMsIGxpa2UgKi8KKyAgICB7ICIyIiwgICAgMiwgQ01fSU5WIH0sICAgICAgICAgICAgICAgICAgICAgIC8qICJzZXQgcG9ydCAxIiAqLworICAgIHsgIjMiLCAgICAzLCBDTV9JTlYgfSwKKyAgICB7ICI0IiwgICAgNCwgQ01fSU5WIH0sCisgICAgeyAiNSIsICAgIDUsIENNX0lOViB9LAorICAgIHsgIjYiLCAgICA2LCBDTV9JTlYgfSwKKyAgICB7ICI3IiwgICAgNywgQ01fSU5WIH0sCisgICAgeyAiOCIsICAgIDgsIENNX0lOViB9LAorICAgIHsgIjkiLCAgICA5LCBDTV9JTlYgfSwKKyAgICB7ICJwcHAwIiwgMCwgMCB9LAorICAgIHsgInBwcDEiLCAxLCAwIH0sICAgICAgICAgICAgICAgICAgIC8qIEZvciB1c2Ugd2l0aCBQUFAgZHJpdmVyICovCisgICAgeyAicHBwMiIsIDIsIDAgfSwgICAgICAgICAgICAgICAgICAgLyogc2hhcmVkIGFjY2VzcyAqLworICAgIHsgInBwcDMiLCAzLCAwIH0sCisgICAgeyAicHBwNCIsIDQsIDAgfSwKKyAgICB7ICJwcHA1IiwgNSwgMCB9LAorICAgIHsgInBwcDYiLCA2LCAwIH0sCisgICAgeyAicHBwNyIsIDcsIDAgfSwKKyAgICB7ICJwcHA4IiwgOCwgMCB9LAorICAgIHsgInBwcDkiLCA5LCAwIH0KK307CitpbnQgbm9zMnBwcCA9IChzaXplb2Yob3MycHBwdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisjZW5kaWYgLyogT1MyT05MWSAqLworCisvKgorICBUZXJtaW5hbCBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCBieSBTRVQgY29tbWFuZHMuCisgIFVzZWQgYnkgdGhlIGNrP2Nvbi5jIHRlcm1pbmFsIGVtdWxhdG9yIGNvZGUuCisgIEZvciBub3csIG9ubHkgdXNlZCBmb3IgI2lmZGVmIE9TMi4gIFNob3VsZCBhZGQgdGhlc2UgZm9yIE1hY2ludG9zaC4KKyovCitpbnQgdHRfYXJyb3cgPSBUVEtfTk9STTsgICAgICAgICAgICAgICAgLyogQXJyb3cga2V5IG1vZGU6IG5vcm1hbCAoY3Vyc29yKSAqLworaW50IHR0X2tleXBhZCA9IFRUS19OT1JNOyAgICAgICAgICAgICAgIC8qIEtleXBhZCBtb2RlOiBub3JtYWwgKG51bWVyaWMpICovCitpbnQgdHRfc2hpZnRfa2V5cGFkID0gMDsgICAgICAgICAgICAgICAgLyogS2V5cGFkIFNoaWZ0IG1vZGU6IE9mZiAqLworaW50IHR0X3dyYXAgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmFsIHdyYXAsIDEgPSBPbiAqLworaW50IHR0X3R5cGUgPSBUVF9WVDMyMDsgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmFsIHR5cGUsIGluaXRpYWxseSBWVDMyMCAqLworaW50IHR0X3R5cGVfbW9kZSA9IFRUX1ZUMzIwOyAgICAgICAgICAgIC8qIFRlcm1pbmFsIHR5cGUgc2V0IGJ5IGhvc3QgY29tbWFuZCAqLworaW50IHR0X2N1cnNvciA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmFsIGN1cnNvciwgMCA9IFVuZGVybGluZSAqLworaW50IHR0X2N1cnNvcl91c3IgPSAwOyAgICAgICAgICAgICAgICAgIC8qIFVzZXJzIFRlcm1pbmFsIGN1cnNvciB0eXBlICovCitpbnQgdHRfY3Vyc29yZW5hX3VzciA9IDE7ICAgICAgICAgICAgICAgLyogVXNlcnMgVGVybWluYWwgY3Vyc29yIGVuYWJsZWQgKi8KK2ludCB0dF9jdXJzb3JfYmxpbmsgPSAxOyAgICAgICAgICAgICAgICAvKiBUZXJtaW5hbCBDdXJzb3IgQmxpbmsgKi8KK2ludCB0dF9hbnN3ZXIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hbCBhbnN3ZXJiYWNrIChkaXNhYmxlZCkgKi8KK2ludCB0dF9zY3JzaXplW1ZOVU1dID0gezUxMiw1MTIsNTEyLDF9OyAvKiBUZXJtaW5hbCBzY3JvbGxiYWNrIGJ1ZmZlciBzaXplICovCitpbnQgdHRfcm9sbFtWTlVNXSA9IHsxLDEsMSwxfTsgICAgICAgICAgLyogVGVybWluYWwgcm9sbCAob24pICovCitpbnQgdHRfcmtleXNbVk5VTV0gPSB7MSwxLDEsMX07CQkvKiBUZXJtaW5hbCByb2xsIGtleXMgKHNlbmQpICovCitpbnQgdHRfcGFjaW5nID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogVGVybWluYWwgb3V0cHV0LXBhY2luZyAobm9uZSkgKi8KK2ludCB0dF9jdHN0bW8gPSAxNTsgICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hbCB0cmFuc21pdC10aW1lb3V0ICovCitpbnQgdHRfY29kZXBhZ2UgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogVGVybWluYWwgY29kZS1wYWdlICovCitpbnQgdHRfdXBkYXRlID0gMTAwOyAgICAgICAgICAgICAgICAgICAgLyogVGVybWluYWwgc2NyZWVuLXVwZGF0ZSBpbnRlcnZhbCAqLworaW50IHR0X3VwZG1vZGUgPSBUVFVfRkFTVDsgICAgICAgICAgICAgIC8qIFRlcm1pbmFsIHNjcmVlbi11cGRhdGUgbW9kZSBGQVNUICovCitleHRlcm4gaW50IHVwZG1vZGU7CisjaWZuZGVmIEtVSQoraW50IHR0X3N0YXR1c1tWTlVNXSA9IHsxLDEsMCwwfTsgICAgICAgIC8qIFRlcm1pbmFsIHN0YXR1cyBsaW5lIGRpc3BsYXllZCAqLworaW50IHR0X3N0YXR1c191c3JbVk5VTV0gPSB7MSwxLDAsMH07CisjZWxzZSAgLyogS1VJICovCitleHRlcm4gQ0tGTE9BVCBmbG9hdHZhbDsKK0NLRkxPQVQgdHRfbGluZXNwYWNpbmdbVk5VTV0gPSB7MS4wLDEuMCwxLjAsMS4wfTsKKyNpZmRlZiBLOTVHCitpbnQgdHRfc3RhdHVzW1ZOVU1dID0gezEsMSwwLDB9OyAgICAgICAgLyogVGVybWluYWwgc3RhdHVzIGxpbmUgZGlzcGxheWVkICovCitpbnQgdHRfc3RhdHVzX3VzcltWTlVNXSA9IHsxLDEsMCwwfTsKKyNlbHNlIC8qIEs5NUcgKi8KK2ludCB0dF9zdGF0dXNbVk5VTV0gPSB7MCwwLDAsMH07ICAgICAgICAvKiBUZXJtaW5hbCBzdGF0dXMgbGluZSBkaXNwbGF5ZWQgKi8KK2ludCB0dF9zdGF0dXNfdXNyW1ZOVU1dID0gezAsMCwwLDB9OworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KK2ludCB0dF9zZW5kZGF0YSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBMZXQgaG9zdCByZWFkIHRlcm1pbmFsIGRhdGEgKi8KK2V4dGVybiBpbnQgd3lfYmxvY2tlbmQ7ICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hbCBTZW5kIERhdGEgRU9CIHR5cGUgKi8KK2ludCB0dF9oaWRhdHRyID0gMTsgICAgICAgICAgICAgICAgICAgICAvKiBBdHRyaWJ1dGVzIGFyZSBoaWRkZW4gKi8KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY29sb3Jub3JtYWwsIGNvbG9yc2VsZWN0LAorY29sb3J1bmRlcmxpbmUsIGNvbG9yc3RhdHVzLCBjb2xvcmhlbHAsIGNvbG9yYm9yZGVyLAorY29sb3JncmFwaGljLCBjb2xvcmRlYnVnLCBjb2xvcnJldmVyc2UsIGNvbG9yaXRhbGljOworCitleHRlcm4gaW50IHRydWVibGluaywgdHJ1ZXVuZGVybGluZSwgdHJ1ZXJldmVyc2UsIHRydWVpdGFsaWMsIHRydWVkaW07CisKK2V4dGVybiBpbnQgYmdpLCBmZ2k7CitleHRlcm4gaW50IHNjcm5pbml0aWFsaXplZFtdOworCitzdHJ1Y3Qga2V5dGFiIGF1ZGlibGV0YWJbXSA9IHsgICAgICAgICAgLyogVGVybWluYWwgQmVsbCBBdWRpYmxlIG1vZGUgKi8KKyAgICB7ICJiZWVwIiwgICAgICAgICAgWFlCX0JFRVAsIDAgfSwgICAvKiBWYWx1ZXMgT1JkIHdpdGggYmVsbCBtb2RlICovCisgICAgeyAic3lzdGVtLXNvdW5kcyIsIFhZQl9TWVMsICAwIH0KK307CitpbnQgbmF1ZGlibGV0YWIgPSBzaXplb2YoYXVkaWJsZXRhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpOworCitzdHJ1Y3Qga2V5dGFiIGFrbXRhYltdID0geyAgICAgICAgICAgICAgLyogQXJyb3cga2V5IG1vZGUgKi8KKyAgICB7ICJhcHBsaWNhdGlvbiIsIFRUS19BUFBMLCAwIH0sCisgICAgeyAiY3Vyc29yIiwgICAgICBUVEtfTk9STSwgMCB9Cit9Oworc3RydWN0IGtleXRhYiBrcG10YWJbXSA9IHsgICAgICAgICAgICAgIC8qIEtleXBhZCBtb2RlICovCisgICAgeyAiYXBwbGljYXRpb24iLCBUVEtfQVBQTCwgMCB9LAorICAgIHsgIm51bWVyaWMiLCAgICAgVFRLX05PUk0sIDAgfQorfTsKKworc3RydWN0IGtleXRhYiB0dGNvbG1vZGV0YWJbXSA9IHsKKyAgICB7ICJjdXJyZW50LWNvbG9yIiwgMCwgMCB9LAorICAgIHsgImRlZmF1bHQtY29sb3IiLCAxLCAwIH0KK307CitpbnQgbmNvbG1vZGUgPSBzaXplb2YodHRjb2xtb2RldGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYik7CisKKyNkZWZpbmUgVFRDT0xOT1IgIDAKKyNkZWZpbmUgVFRDT0xSRVYgIDEKKyNkZWZpbmUgVFRDT0xVTkQgIDIKKyNkZWZpbmUgVFRDT0xTVEEgIDMKKyNkZWZpbmUgVFRDT0xITFAgIDQKKyNkZWZpbmUgVFRDT0xCT1IgIDUKKyNkZWZpbmUgVFRDT0xTRUwgIDYKKyNkZWZpbmUgVFRDT0xERUIgIDcKKyNkZWZpbmUgVFRDT0xHUlAgIDgKKyNkZWZpbmUgVFRDT0xJVEEgIDkKKyNkZWZpbmUgVFRDT0xSRVMgIDEwCisjZGVmaW5lIFRUQ09MRVJBICAxMQorCitzdHJ1Y3Qga2V5dGFiIHR0eWNvbHRhYltdID0geyAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hbCBTY3JlZW4gY29sb3JpbmcgKi8KKyAgICB7ICJib3JkZXIiLCAgICAgICAgICAgICBUVENPTEJPUiwgMCB9LCAgICAgIC8qIFNjcmVlbiBib3JkZXIgY29sb3IgKi8KKyAgICB7ICJkZWJ1Zy10ZXJtaW5hbCIsICAgICBUVENPTERFQiwgMCB9LCAgICAgIC8qIERlYnVnIGNvbG9yICovCisgICAgeyAiZXJhc2UiLCAgICAgICAgICAgICAgVFRDT0xFUkEsIDAgfSwgICAgICAvKiBFcmFzZSBtb2RlICovCisgICAgeyAiZ3JhcGhpYyIsICAgICAgICAgICAgVFRDT0xHUlAsIDAgfSwgICAgICAvKiBHcmFwaGljIENvbG9yICovCisgICAgeyAiaGVscC10ZXh0IiwgICAgICAgICAgVFRDT0xITFAsIDAgfSwgICAgICAvKiBIZWxwIHNjcmVlbnMgKi8KKyAgICB7ICJpdGFsaWMiLCAgICAgICAgICAgICBUVENPTElUQSwgMCB9LCAgICAgIC8qIEl0YWxpYyBDb2xvciAqLworICAgIHsgIm5vcm1hbCIsICAgICAgICAgICAgIFRUQ09MTk9SLCBDTV9JTlYgfSwgLyogTm9ybWFsIHNjcmVlbiB0ZXh0ICovCisgICAgeyAicmVzZXQtb24tZXNjWzBtIiwgICAgVFRDT0xSRVMsIDAgfSwgICAgICAvKiBSZXNldCBvbiBFU0MgWyAwIG0gKi8KKyAgICB7ICJyZXZlcnNlLXZpZGVvIiwgICAgICBUVENPTFJFViwgMCB9LCAgICAgIC8qIFJldmVyc2UgdmlkZW8gKi8KKyAgICB7ICJzdGF0dXMtbGluZSIsICAgICAgICBUVENPTFNUQSwgMCB9LCAgICAgIC8qIFN0YXR1cyBsaW5lICovCisgICAgeyAic2VsZWN0aW9uIiwgICAgICAgICAgVFRDT0xTRUwsIDAgfSwgICAgICAvKiBTZWxlY3Rpb24gY29sb3IgKi8KKyAgICB7ICJ0ZXJtaW5hbC1zY3JlZW4iLCAgICBUVENPTE5PUiwgMCB9LCAgICAgIC8qIEJldHRlciBuYW1lIHRoYW4gIm5vcm1hbCIgKi8KKyAgICB7ICJ1bmRlcmxpbmVkLXRleHQiLCAgICBUVENPTFVORCwgMCB9ICAgICAgIC8qIFVuZGVybGluZWQgdGV4dCAqLworfTsKK2ludCBuY29sb3JzID0gKHNpemVvZih0dHljb2x0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2RlZmluZSBUVEFUVE5PUiAgMAorI2RlZmluZSBUVEFUVEJMSSAgMQorI2RlZmluZSBUVEFUVFJFViAgMgorI2RlZmluZSBUVEFUVFVORCAgMworI2RlZmluZSBUVEFUVFBSTyAgNAorI2RlZmluZSBUVEFUVEJMRCAgNQorI2RlZmluZSBUVEFUVERJTSAgNgorI2RlZmluZSBUVEFUVElOViAgNworI2RlZmluZSBUVEFUVElUQSAgOAorI2RlZmluZSBUVEFUVERPTkUgOQorCitzdHJ1Y3Qga2V5dGFiIHR0eWF0dHJ0YWJbXSA9IHsKKyAgICB7ICJibGluayIsICAgICBUVEFUVEJMSSwgMCB9LAorICAgIHsgImRpbSIsICAgICAgIFRUQVRURElNLCAwIH0sCisgICAgeyAiaXRhbGljIiwgICAgVFRBVFRJVEEsIDAgfSwKKyAgICB7ICJwcm90ZWN0ZWQiLCBUVEFUVFBSTywgMCB9LAorICAgIHsgInJldmVyc2UiLCAgIFRUQVRUUkVWLCAwIH0sCisgICAgeyAidW5kZXJsaW5lIiwgVFRBVFRVTkQsIDAgfQorfTsKK2ludCBuYXR0cmliID0gKHNpemVvZih0dHlhdHRydGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgdHR5cHJvdGFiW10gPSB7CisgICAgeyAiYmxpbmsiLCAgICAgICBUVEFUVEJMSSwgIDAgfSwKKyAgICB7ICJib2xkIiwgICAgICAgIFRUQVRUQkxELCAgMCB9LAorICAgIHsgImRpbSIsICAgICAgICAgVFRBVFRESU0sICAwIH0sCisgICAgeyAiZG9uZSIsICAgICAgICBUVEFUVERPTkUsIENNX0lOViB9LAorICAgIHsgImludmlzaWJsZSIsICAgVFRBVFRJTlYsICAwIH0sCisgICAgeyAiaXRhbGljIiwgICAgICBUVEFUVElUQSwgIDAgfSwKKyAgICB7ICJub3JtYWwiLCAgICAgIFRUQVRUTk9SLCAgMCB9LAorICAgIHsgInJldmVyc2UiLCAgICAgVFRBVFRSRVYsICAwIH0sCisgICAgeyAidW5kZXJsaW5lZCIsICBUVEFUVFVORCwgIDAgfQorCit9OworaW50IG5wcm90ZWN0ID0gKHNpemVvZih0dHlwcm90YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworc3RydWN0IGtleXRhYiB0dHlzZW9idGFiW10gPSB7CisgICAgeyAiY3JsZl9ldHgiLCAgMSwgMCB9LAorICAgIHsgInVzX2NyIiwgICAgIDAsIDAgfQorfTsKKworc3RydWN0IGtleXRhYiB0dHljbHJ0YWJbXSA9IHsgICAgICAgICAgIC8qIENvbG9ycyAqLworICAgIHsgImJsYWNrIiwgICAgICAgICAwLCAwICAgICAgfSwKKyAgICB7ICJibHVlIiwgICAgICAgICAgMSwgMCAgICAgIH0sCisgICAgeyAiYnJvd24iLCAgICAgICAgIDYsIDAgICAgICB9LAorICAgIHsgImN5YW4iLCAgICAgICAgICAzLCAwICAgICAgfSwKKyAgICB7ICJkYXJrZ3JheSIsICAgICAgOCwgQ01fSU5WIH0sCisgICAgeyAiZGdyYXkiLCAgICAgICAgIDgsIDAgICAgICB9LAorICAgIHsgImdyZWVuIiwgICAgICAgICAyLCAwICAgICAgfSwKKyAgICB7ICJsYmx1ZSIsICAgICAgICAgOSwgQ01fSU5WIH0sCisgICAgeyAibGN5YW4iLCAgICAgICAgMTEsIENNX0lOViB9LAorICAgIHsgImxncmF5IiwgICAgICAgICA3LCBDTV9JTlYgfSwKKyAgICB7ICJsZ3JlZW4iLCAgICAgICAxMCwgQ01fSU5WIH0sCisgICAgeyAibGlnaHRibHVlIiwgICAgIDksIDAgICAgICB9LAorICAgIHsgImxpZ2h0Y3lhbiIsICAgIDExLCAwICAgICAgfSwKKyAgICB7ICJsaWdodGdyYXkiLCAgICAgNywgMCAgICAgIH0sCisgICAgeyAibGlnaHRncmVlbiIsICAgMTAsIDAgICAgICB9LAorICAgIHsgImxpZ2h0bWFnZW50YSIsIDEzLCAwICAgICAgfSwKKyAgICB7ICJsaWdodHJlZCIsICAgICAxMiwgMCAgICAgIH0sCisgICAgeyAibG1hZ2VudGEiLCAgICAgMTMsIENNX0lOViB9LAorICAgIHsgImxyZWQiLCAgICAgICAgIDEyLCBDTV9JTlYgfSwKKyAgICB7ICJtYWdlbnRhIiwgICAgICAgNSwgMCAgICAgIH0sCisgICAgeyAicmVkIiwgICAgICAgICAgIDQsIDAgICAgICB9LAorICAgIHsgIndoaXRlIiwgICAgICAgIDE1LCAwICAgICAgfSwKKyAgICB7ICJ5ZWxsb3ciLCAgICAgICAxNCwgMCAgICAgIH0KK307CitpbnQgbmNscnMgPSAoc2l6ZW9mICh0dHljbHJ0YWIpIC8gc2l6ZW9mIChzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgdHR5Y3VydGFiW10gPSB7CisgICAgeyAiZnVsbCIsICAgICAgICBUVENfQkxPQ0ssIDAgfSwKKyAgICB7ICJoYWxmIiwgICAgICAgIFRUQ19IQUxGLCAgMCB9LAorICAgIHsgInVuZGVybGluZSIsICAgVFRDX1VMSU5FLCAwIH0KK307CitpbnQgbmN1cnNvcnMgPSAzOworCitzdHJ1Y3Qga2V5dGFiIHR0eXB0YWJbXSA9IHsKKyAgICB7ICJhYWEiLCAgICAgIFRUX0FBQSwgICAgIENNX0lOViB9LCAgICAgLyogQW5uQXJib3IgKi8KKyAgICB7ICJhZG0zYSIsICAgIFRUX0FETTNBLCAgIDAgfSwgICAgICAgICAgLyogTFNJIEFETS0zQSAqLworICAgIHsgImFkbTUiLCAgICAgVFRfQURNNSwgICAgMCB9LCAgICAgICAgICAvKiBMU0kgQURNLTUgKi8KKyAgICB7ICJhaXh0ZXJtIiwgIFRUX0FJWFRFUk0sIDAgfSwgICAgICAgICAgLyogSUJNIEFJWHRlcm0gKi8KKyAgICB7ICJhbm5hcmJvciIsIFRUX0FBQSwgICAgIDAgfSwgICAgICAgICAgLyogQW5uQXJib3IgKi8KKyAgICB7ICJhbnNpLWJicyIsIFRUX0FOU0ksICAgIDAgfSwgICAgICAgICAgLyogQU5TSS5TWVMgKEJCUykgKi8KKyAgICB7ICJhdDM4NiIsICAgIFRUX0FUMzg2LCAgIDAgfSwgICAgICAgICAgLyogVW5peHdhcmUgQU5TSSAqLworICAgIHsgImF2YXRhci8wKyIsVFRfQU5TSSwgICAgMCB9LCAgICAgICAgICAvKiBBVkFUQVIvMCsgKi8KKyAgICB7ICJiYTgwIiwgICAgIFRUX0JBODAsICAgIDAgfSwgICAgICAgICAgLyogTml4ZG9yZiBCQTgwICovCisgICAgeyAiYmUiLCAgICAgICBUVF9CRU9TLCAgICBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiYmVvcy1hbnNpIixUVF9CRU9TLCAgICBDTV9JTlYgfSwgICAgIC8qIEJlT1MgQU5TSSAqLworICAgIHsgImJldGVybSIsICAgVFRfQkVPUywgICAgMCB9LCAgICAgICAgICAvKiBCZU9TIFRlcm1pbmFsIChhcyBvZiBQUjIgKSAqLworICAgIHsgImQyMDAiLCAgICAgVFRfREcyMDAsICAgQ01fSU5WfENNX0FCUiB9LCAvKiBEYXRhIEdlbmVyYWwgREFTSEVSIDIwMCAqLworICAgIHsgImQyMTAiLCAgICAgVFRfREcyMTAsICAgQ01fSU5WfENNX0FCUiB9LCAvKiBEYXRhIEdlbmVyYWwgREFTSEVSIDIxMCAqLworICAgIHsgImQyMTciLCAgICAgVFRfREcyMTcsICAgQ01fSU5WfENNX0FCUiB9LCAvKiBEYXRhIEdlbmVyYWwgREFTSEVSIDIxNyAqLworICAgIHsgImRnMjAwIiwgICAgVFRfREcyMDAsICAgMCB9LCAgICAgICAgICAvKiBEYXRhIEdlbmVyYWwgREFTSEVSIDIwMCAqLworICAgIHsgImRnMjEwIiwgICAgVFRfREcyMTAsICAgMCB9LCAgICAgICAgICAvKiBEYXRhIEdlbmVyYWwgREFTSEVSIDIxMCAqLworICAgIHsgImRnMjE3IiwgICAgVFRfREcyMTcsICAgMCB9LCAgICAgICAgICAvKiBEYXRhIEdlbmVyYWwgREFTSEVSIDIxNyAqLworICAgIHsgImgxNTAwIiwgICAgVFRfSFpMMTUwMCwgQ01fSU5WIH0sICAgICAvKiBIYXplbHRpbmUgMTUwMCAqLworICAgIHsgImgxOSIsICAgICAgVFRfSDE5LCAgICAgQ01fSU5WIH0sICAgICAvKiBIZWF0aC0xOSAqLworICAgIHsgImhlYXRoMTkiLCAgVFRfSDE5LCAgICAgMCB9LCAgICAgICAgICAvKiBIZWF0aC0xOSAqLworICAgIHsgImhmdCIsICAgICAgVFRfSEZULCAgICAgMCB9LCAgICAgICAgICAvKiBJQk0gSGlnaCBGdW5jdGlvbiBUZXJtaW5hbCAqLworICAgIHsgImhwMjYyMWEiLCAgVFRfSFAyNjIxLCAgMCB9LCAgICAgICAgICAvKiBIUCAyNjIxQSAqLworICAgIHsgImhwdGVybSIsICAgVFRfSFBURVJNLCAgMCB9LCAgICAgICAgICAvKiBIUCBURVJNICovCisgICAgeyAiaHoxNTAwIiwgICBUVF9IWkwxNTAwLCAwIH0sICAgICAgICAgIC8qIEhhemVsdGluZSAxNTAwICovCisgICAgeyAiaWJtMzE1MSIsICBUVF9JQk0zMSwgICAwIH0sICAgICAgICAgIC8qIElCTSAzMTAxLXh4LDMxNjEgKi8KKyAgICB7ICJsaW51eCIsICAgIFRUX0xJTlVYLCAgIDAgfSwgICAgICAgICAgLyogTGludXggKi8KKyAgICB7ICJxYW5zaSIsICAgIFRUX1FBTlNJLCAgIDAgfSwgICAgICAgICAgLyogUU5YIEFOU0kgKi8KKyAgICB7ICJxbngiLCAgICAgIFRUX1FOWCwgICAgIDAgfSwgICAgICAgICAgLyogUU5YIENvbnNvbGUgKi8KKyAgICB7ICJzY29hbnNpIiwgIFRUX1NDT0FOU0ksIDAgfSwgICAgICAgICAgLyogU0NPIEFOU0kgKi8KKyAgICB7ICJzbmktOTc4MDEiLFRUXzk3ODAxLCAgIDAgfSwgICAgICAgICAgLyogU05JIDk3ODAxICovCisgICAgeyAic3VuIiwgICAgICBUVF9TVU4sICAgICAwIH0sICAgICAgICAgIC8qIFNVTiBDb25zb2xlICovCisvKgorICBUaGUgaWRlYSBvZiBOT05FIGlzIHRvIGxldCB0aGUgY29uc29sZSBkcml2ZXIgaGFuZGxlIHRoZSBlc2NhcGUgc2VxdWVuY2VzLAorICB3aGljaCwgaW4gdGhlb3J5IGF0IGxlYXN0LCB3b3VsZCBnaXZlIG5vdCBvbmx5IEFOU0kgZW11bGF0aW9uLCBidXQgYWxzbyBhbnkKKyAgb3RoZXIga2luZCBvZiBlbXVsYXRpb24gdGhhdCBtaWdodCBiZSBwcm92aWRlZCBieSBhbHRlcm5hdGl2ZSBjb25zb2xlCisgIGRyaXZlcnMsIGlmIGFueSBleGlzdGVkLgorCisgIEZvciB0aGlzIHRvIHdvcmssIGNrb2Nvbi5jIHdvdWxkIG5lZWQgdG8gYmUgbW9kaWZpZWQgdG8gbWFrZSBoaWdoZXItbGV2ZWwKKyAgY2FsbHMsIGxpa2UgVmlvV3J0VFRZKCksIERvc1dyaXRlKCksIG9yIChzaW1wbHkpIHdyaXRlKCksIHJhdGhlciB0aGFuCisgIFZpb1dydCpDZWxsKCkgYW5kIHNpbWlsYXIsIGFuZCBpdCB3b3VsZCBhbHNvIGhhdmUgdG8gZ2l2ZSB1cCBpdHMgcm9sbGJhY2sKKyAgZmVhdHVyZSwgYW5kIGl0cyBzdGF0dXMgbGluZSBhbmQgaGVscCBzY3JlZW5zIHdvdWxkIGFsc28gaGF2ZSB0byBiZQorICBmb3Jnb3R0ZW4gb3IgZWxzZSBkb25lIGluIGFuIEFOU0kgd2F5LgorCisgIEFzIG1hdHRlcnMgc3RhbmQsIHdlIGFscmVhZHkgaGF2ZSBwZXJmZWN0bHkgZ29vZCBBTlNJIGVtdWxhdGlvbiBidWlsdCBpbiwKKyAgYW5kIHRoZXJlIGFyZSBubyBhbHRlcm5hdGl2ZSBjb25zb2xlIGRyaXZlcnMgYXZhaWxhYmxlLCBzbyB0aGVyZSBpcyBubyBwb2ludAorICBpbiBoYXZpbmcgYSB0ZXJtaW5hbCB0eXBlIG9mIE5PTkUsIHNvIGl0IGlzIGNvbW1lbnRlZCBvdXQuICBIb3dldmVyLCBzaG91bGQKKyAgeW91IHVuY29tbWVudCBpdCwgaXQgd2lsbCB3b3JrIGxpa2UgYSAiZ2xhc3MgdHR5IiAtLSBubyBlc2NhcGUgc2VxdWVuY2UKKyAgaW50ZXJwcmV0YXRpb24gYXQgYWxsOyBzb21ld2hhdCBzaW1pbGFyIHRvIGRlYnVnIG1vZGUsIGV4Y2VwdCB3aXRob3V0IHRoZQorICBkZWJ1Z2dpbmcgKG5vIGhpZ2hsaWdodGluZyBvZiBjb250cm9sIGNoYXJzIG9yIGVzY2FwZSBzZXF1ZW5jZXMpOyBoZWxwCisgIHNjcmVlbnMsIHN0YXR1cyBsaW5lLCBhbmQgcm9sbGJhY2sgd2lsbCBzdGlsbCB3b3JrLgorKi8KKyNpZmRlZiBPUzJQTQorI2lmZGVmIENPTU1FTlQKKyAgICB7ICJ0ZWs0MDE0IiwgVFRfVEVLNDAsICAwIH0sCisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIE9TMlBNICovCisgICAgeyAidHR5IiwgICAgIFRUX05PTkUsICAgMCB9LAorICAgIHsgInR2aTkxMCsiLCBUVF9UVkk5MTAsIDAgfSwKKyAgICB7ICJ0dmk5MjUiLCAgVFRfVFZJOTI1LCAwIH0sCisgICAgeyAidHZpOTUwIiwgIFRUX1RWSTk1MCwgMCB9LAorICAgIHsgInZjNDA0IiwgICBUVF9WQzQ0MDQsIDAgfSwKKyAgICB7ICJ2YzQ0MDQiLCAgVFRfVkM0NDA0LCBDTV9JTlYgfSwKKyAgICB7ICJ2aXA3ODA5IiwgVFRfVklQNzgwOSwwIH0sCisgICAgeyAidnQxMDAiLCAgIFRUX1ZUMTAwLCAgMCB9LAorICAgIHsgInZ0MTAyIiwgICBUVF9WVDEwMiwgIDAgfSwKKyAgICB7ICJ2dDIyMCIsICAgVFRfVlQyMjAsICAwIH0sCisgICAgeyAidnQyMjBwYyIsIFRUX1ZUMjIwUEMsMCB9LAorICAgIHsgInZ0MzIwIiwgICBUVF9WVDMyMCwgIDAgfSwKKyAgICB7ICJ2dDMyMHBjIiwgVFRfVlQzMjBQQywwIH0sCisgICAgeyAidnQ1MiIsICAgIFRUX1ZUNTIsICAgMCB9LAorI2lmZGVmIE5UCisgICAgeyAidnRudCIsICAgIFRUX1ZUTlQsICAgMCB9LAorI2Vsc2UgLyogTlQgKi8KKyAgICB7ICJ2dG50IiwgICAgVFRfVlROVCwgIENNX0lOViB9LAorI2VuZGlmIC8qIE5UICovCisgICAgeyAid3kxNjAiLCAgIFRUX1dZMTYwLCAgMCB9LAorICAgIHsgInd5MzAiLCAgICBUVF9XWTMwLCAgIDAgfSwKKyAgICB7ICJ3eTM3MCIsICAgVFRfV1kzNzAsICAwIH0sCisgICAgeyAid3k1MCIsICAgIFRUX1dZNTAsICAgMCB9LAorICAgIHsgInd5NjAiLCAgICBUVF9XWTYwLCAgIDAgfSwKKyAgICB7ICJ3eXNlMzAiLCAgVFRfV1kzMCwgICBDTV9JTlYgfSwKKyAgICB7ICJ3eXNlMzcwIiwgVFRfV1kzNzAsICBDTV9JTlYgfSwKKyAgICB7ICJ3eXNlNTAiLCAgVFRfV1k1MCwgICBDTV9JTlYgfSwKKyAgICB7ICJ3eXNlNjAiLCAgVFRfV1k2MCwgICBDTV9JTlYgfQorfTsKK2ludCBudHR5cCA9IChzaXplb2YodHR5cHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdHJ1Y3Qga2V5dGFiIHR0a2V5dGFiW10gPSB7CisgICAgeyAiYWFhIiwgICAgICAgVFRfQUFBLCAgICAgICAgQ01fSU5WIH0sICAgICAgICAvKiBBbm5BcmJvciAqLworICAgIHsgImFkbTNhIiwgICAgIFRUX0FETTNBLCAgICAgIDAgfSwgICAgICAgICAgICAgLyogTFNJIEFETS0zQSAqLworICAgIHsgImFkbTUiLCAgICAgIFRUX0FETTUsICAgICAgIDAgfSwgICAgICAgICAgICAgLyogTFNJIEFETS01ICovCisgICAgeyAiYWl4dGVybSIsICAgVFRfQUlYVEVSTSwgICAgMCB9LCAgICAgICAgICAgICAvKiBJQk0gQUlYdGVybSAqLworICAgIHsgImFubmFyYm9yIiwgIFRUX0FBQSwgICAgICAgIDAgfSwgICAgICAgICAgICAgLyogQW5uQXJib3IgKi8KKyAgICB7ICJhbnNpLWJicyIsICBUVF9BTlNJLCAgICAgICAwIH0sICAgICAgICAgICAgIC8qIEFOU0kuU1lTIChCQlMpICovCisgICAgeyAiYXQzODYiLCAgICAgVFRfQVQzODYsICAgICAgMCB9LCAgICAgICAgICAgICAvKiBVbml4d2FyZSBBTlNJICovCisgICAgeyAiYXZhdGFyLzArIiwgVFRfQU5TSSwgICAgICAgMCB9LCAgICAgICAgICAgICAvKiBBVkFUQVIvMCsgKi8KKyAgICB7ICJiYTgwIiwgICAgICBUVF9CQTgwLCAgICAgICAwIH0sICAgICAgICAgICAgIC8qIE5peGRvcmYgQkE4MCAqLworICAgIHsgImJlIiwgICAgICAgIFRUX0JFT1MsICAgICAgIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJiZW9zLWFuc2kiLCBUVF9CRU9TLCAgICAgICBDTV9JTlYgfSwgICAgICAgIC8qIEJlT1MgQU5TSSAqLworICAgIHsgImJldGVybSIsICAgIFRUX0JFT1MsICAgICAgIDAgfSwgICAgICAgICAgICAgLyogQmVPUyBUZXJtaW5hbCAoRFIyKSAqLworICAgIHsgImQyMDAiLCAgICAgIFRUX0RHMjAwLCAgICAgIENNX0lOVnxDTV9BQlIgfSwgLyogREcgREFTSEVSIDIwMCAqLworICAgIHsgImQyMTAiLCAgICAgIFRUX0RHMjEwLCAgICAgIENNX0lOVnxDTV9BQlIgfSwgLyogREcgREFTSEVSIDIxMCAqLworICAgIHsgImQyMTciLCAgICAgIFRUX0RHMjE3LCAgICAgIENNX0lOVnxDTV9BQlIgfSwgLyogREcgREFTSEVSIDIxNyAqLworICAgIHsgImRnMjAwIiwgICAgIFRUX0RHMjAwLCAgICAgIDAgfSwgICAgICAgICAgICAgLyogREcgREFTSEVSIDIwMCAqLworICAgIHsgImRnMjEwIiwgICAgIFRUX0RHMjEwLCAgICAgIDAgfSwgICAgICAgICAgICAgLyogREcgREFTSEVSIDIxMCAqLworICAgIHsgImRnMjE3IiwgICAgIFRUX0RHMjE3LCAgICAgIDAgfSwgICAgICAgICAgICAgLyogREcgREFTSEVSIDIxNyAqLworICAgIHsgImVtYWNzIiwgICAgIFRUX0tCTV9FTUFDUywgIDAgfSwgICAgICAgICAgICAgLyogRW1hY3MgbW9kZSAqLworICAgIHsgImgxOSIsICAgICAgIFRUX0gxOSwgICAgICAgIENNX0lOViB9LCAgICAgICAgLyogSGVhdGgtMTkgKi8KKyAgICB7ICJoZWF0aDE5IiwgICBUVF9IMTksICAgICAgICAwIH0sICAgICAgICAgICAgIC8qIEhlYXRoLTE5ICovCisgICAgeyAiaGVicmV3IiwgICAgVFRfS0JNX0hFQlJFVywgMCB9LCAgICAgICAgICAgICAvKiBIZWJyZXcgbW9kZSAqLworICAgIHsgImhmdCIsICAgICAgIFRUX0hGVCwgICAgICAgIDAgfSwgICAgICAgICAgICAgLyogSUJNIEhpZ2ggRnVuY3Rpb24gVGVybSAqLworICAgIHsgImhwMjYyMWEiLCAgIFRUX0hQMjYyMSwgICAgIDAgfSwgICAgICAgICAgICAgLyogSFAgMjYyMUEgKi8KKyAgICB7ICJocHRlcm0iLCAgICBUVF9IUFRFUk0sICAgICAwIH0sICAgICAgICAgICAgIC8qIEhQIFRFUk0gKi8KKyAgICB7ICJoejE1MDAiLCAgICBUVF9IWkwxNTAwLCAgICAwIH0sICAgICAgICAgICAgIC8qIEhhemVsdGluZSAxNTAwICovCisgICAgeyAiaWJtMzE1MSIsICAgVFRfSUJNMzEsICAgICAgMCB9LCAgICAgICAgICAgICAvKiBJQk0gMzEwMS14eCwzMTYxICovCisgICAgeyAibGludXgiLCAgICAgVFRfTElOVVgsICAgICAgMCB9LCAgICAgICAgICAgICAvKiBMaW51eCAqLworICAgIHsgInFhbnNpIiwgICAgIFRUX1FBTlNJLCAgICAgIDAgfSwgICAgICAgICAgICAgLyogUU5YIEFOU0kgKi8KKyAgICB7ICJxbngiLCAgICAgICBUVF9RTlgsICAgICAgICAwIH0sICAgICAgICAgICAgIC8qIFFOWCAqLworICAgIHsgInJ1c3NpYW4iLCAgIFRUX0tCTV9SVVNTSUFOLDAgfSwgICAgICAgICAgICAgLyogUnVzc2lhbiBtb2RlICovCisgICAgeyAic2NvYW5zaSIsICAgVFRfU0NPQU5TSSwgICAgMCB9LCAgICAgICAgICAgICAvKiBTQ08gQU5TSSAqLworICAgIHsgInNuaS05NzgwMSIsIFRUXzk3ODAxLCAgICAgIDAgfSwgICAgICAgICAgICAgLyogU05JIDk3ODAxICovCisgICAgeyAic3VuIiwgICAgICAgVFRfU1VOLCAgICAgICAgMCB9LCAgICAgICAgICAgICAvKiBTVU4gQ29uc29sZSAqLworI2lmZGVmIE9TMlBNCisjaWZkZWYgQ09NTUVOVAorICAgIHsgInRlazQwMTQiLCAgIFRUX1RFSzQwLCAgICAgIDAgfSwKKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogT1MyUE0gKi8KKyAgICB7ICJ0dHkiLCAgICAgICBUVF9OT05FLCAgICAgICAwIH0sCisgICAgeyAidHZpOTEwKyIsICAgVFRfVFZJOTEwLCAgICAgMCB9LAorICAgIHsgInR2aTkyNSIsICAgIFRUX1RWSTkyNSwgICAgIDAgfSwKKyAgICB7ICJ0dmk5NTAiLCAgICBUVF9UVkk5NTAsICAgICAwIH0sCisgICAgeyAidmM0MDQiLCAgICAgVFRfVkM0NDA0LCAgICAgMCB9LAorICAgIHsgInZjNDQwNCIsICAgIFRUX1ZDNDQwNCwgICAgIENNX0lOViB9LAorICAgIHsgInZpcDc4MDkiLCAgIFRUX1ZJUDc4MDksICAgIDAgfSwKKyAgICB7ICJ2dDEwMCIsICAgICBUVF9WVDEwMCwgICAgICAwIH0sCisgICAgeyAidnQxMDIiLCAgICAgVFRfVlQxMDIsICAgICAgMCB9LAorICAgIHsgInZ0MjIwIiwgICAgIFRUX1ZUMjIwLCAgICAgIDAgfSwKKyAgICB7ICJ2dDIyMHBjIiwgICBUVF9WVDIyMFBDLCAgICAwIH0sCisgICAgeyAidnQzMjAiLCAgICAgVFRfVlQzMjAsICAgICAgMCB9LAorICAgIHsgInZ0MzIwcGMiLCAgIFRUX1ZUMzIwUEMsICAgIDAgfSwKKyAgICB7ICJ2dDUyIiwgICAgICBUVF9WVDUyLCAgICAgICAwIH0sCisgICAgeyAidnRudCIsICAgICAgVFRfVlROVCwgICAgICAgQ01fSU5WIH0sCisgICAgeyAid3AiLCAgICAgICAgVFRfS0JNX1dQLCAgICAgMCB9LCAgICAgICAgICAgICAvKiBXb3JkIFBlcmZlY3QgbW9kZSAqLworICAgIHsgInd5MTYwIiwgICAgIFRUX1dZMTYwLCAgICAgIDAgfSwKKyAgICB7ICJ3eTMwIiwgICAgICBUVF9XWTMwLCAgICAgICAwIH0sCisgICAgeyAid3kzNzAiLCAgICAgVFRfV1kzNzAsICAgICAgMCB9LAorICAgIHsgInd5NTAiLCAgICAgIFRUX1dZNTAsICAgICAgIDAgfSwKKyAgICB7ICJ3eTYwIiwgICAgICBUVF9XWTYwLCAgICAgICAwIH0sCisgICAgeyAid3lzZTMwIiwgICAgVFRfV1kzMCwgICAgICAgQ01fSU5WIH0sCisgICAgeyAid3lzZTM3MCIsICAgVFRfV1kzNzAsICAgICAgQ01fSU5WIH0sCisgICAgeyAid3lzZTUwIiwgICAgVFRfV1k1MCwgICAgICAgQ01fSU5WIH0sCisgICAgeyAid3lzZTYwIiwgICAgVFRfV1k2MCwgICAgICAgQ01fSU5WIH0KK307CitpbnQgbnR0a2V5ID0gKHNpemVvZih0dGtleXRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCisjaWZuZGVmIE5PU0VUS0VZCitzdHJ1Y3Qga2V5dGFiIGtibW9kdGFiW10gPSB7CisgICAgeyAiZW1hY3MiLCAgIEtCTV9FTSwgMCAgICAgIH0sCisgICAgeyAiZW5nbGlzaCIsIEtCTV9FTiwgQ01fSU5WIH0sCisgICAgeyAiaGVicmV3IiwgIEtCTV9IRSwgMCAgICAgIH0sCisgICAgeyAibm9ybWFsIiwgIEtCTV9FTiwgMCAgICAgIH0sCisgICAgeyAibm9uZSIsICAgIEtCTV9FTiwgQ01fSU5WIH0sCisgICAgeyAicnVzc2lhbiIsIEtCTV9SVSwgMCAgICAgIH0sCisgICAgeyAid3AiLCAgICAgIEtCTV9XUCwgMCAgICAgIH0KK307CitpbnQgbmtibW9kdGFiID0gKHNpemVvZihrYm1vZHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworI2VuZGlmIC8qIE5PU0VUS0VZICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCitpbnQgdHRfaW5wYWNpbmcgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQtcGFjaW5nIChub25lKSAqLworCitzdHJ1Y3Qga2V5dGFiIHBydHl0YWJbXSA9IHsgLyogT1MvMiBQcmlvcml0eSBMZXZlbHMgKi8KKyAgICB7ICJmb3JlZ3JvdW5kLXNlcnZlciIsIFhZUF9TUlYsIDAgICAgICAgfSwKKyAgICB7ICJpZGxlIiwgICAgICAgICAgICAgIFhZUF9JRExFLCBDTV9JTlYgfSwKKyAgICB7ICJyZWd1bGFyIiwgICAgICAgICAgIFhZUF9SRUcsIDAgICAgICAgfSwKKyAgICB7ICJ0aW1lLWNyaXRpY2FsIiwgICAgIFhZUF9SVFAsIDAgICAgICAgfQorfTsKK2ludCBucHJ0eSA9IChzaXplb2YocHJ0eXRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgTlQKK3N0cnVjdCBrZXl0YWIgd2luOTV0YWJbXSA9IHsgLyogV2luOTUgd29yay1hcm91bmRzICovCisgICAgeyAiOC4zLWZpbGVuYW1lcyIsICAgICAgICAgWFlXOF8zLCAgICAwIH0sCisgICAgeyAiYWx0LWdyIiwgICAgICAgICAgICAgICAgWFlXQUdSLCAgICAwIH0sCisgICAgeyAiaG9yaXpvbnRhbC1zY2FuLWxpbmUtc3Vic3RpdHV0aW9ucyIsIFhZV0hTTCwgMCB9LAorICAgIHsgImtleWJvYXJkLXRyYW5zbGF0aW9uIiwgIFhZV0tFWSwgICAgMCB9LAorICAgIHsgImx1Y2lkYS1zdWJzdGl0dXRpb25zIiwgIFhZV0xVQywgICAgMCB9LAorICAgIHsgIm92ZXJsYXBwZWQtaW8iLCAgICAgICAgIFhZV09JTywgICAgMCB9LAorICAgIHsgInBvcHVwcyIsICAgICAgICAgICAgICAgIFhZV1BPUFVQLCAgMCB9LAorICAgIHsgInNlbGVjdC1idWciLCAgICAgICAgICAgIFhZV1NFTEVDVCwgMCB9Cit9OworaW50IG53aW45NSA9IChzaXplb2Yod2luOTV0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKyNlbmRpZiAvKiBOVCAqLworCisjaWZkZWYgT1MyTU9VU0UKK2V4dGVybiBpbnQgd2lkZXJlc3VsdDsKK2ludCB0dF9tb3VzZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hbCBtb3VzZSBvbi9vZmYgKi8KKworc3RydWN0IGtleXRhYiBtb3VzZXRhYltdID0geyAgICAgICAgICAgIC8qIE1vdXNlIGl0ZW1zICovCisgICAgeyAiYWN0aXZhdGUiLCBYWU1fT04sICAgICAwIH0sCisgICAgeyAiYnV0dG9uIiwgICBYWU1fQlVUVE9OLCAwIH0sCisgICAgeyAiY2xlYXIiLCAgICBYWU1fQ0xFQVIsICAwIH0sCisgICAgeyAiZGVidWciLCAgICBYWU1fREVCVUcsICAwIH0KK307CitpbnQgbm10YWIgPSAoc2l6ZW9mKG1vdXNldGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdHJ1Y3Qga2V5dGFiIG1vdXNlYnV0dG9udGFiW10gPSB7ICAgICAgLyogZXZlbnQgYnV0dG9uICovCisgICAgeyAiMSIsICAgICAgICAgICAgIFhZTV9CMSwgMCB9LAorICAgIHsgIjIiLCAgICAgICAgICAgICBYWU1fQjIsIDAgfSwKKyAgICB7ICIzIiwgICAgICAgICAgICAgWFlNX0IzLCAwIH0sCisgICAgeyAib25lIiwgICAgICAgICAgIFhZTV9CMSwgQ01fSU5WIH0sCisgICAgeyAidGhyZWUiLCAgICAgICAgIFhZTV9CMywgQ01fSU5WIH0sCisgICAgeyAidHdvIiwgICAgICAgICAgIFhZTV9CMiwgQ01fSU5WIH0KK307CitpbnQgbm1idGFiID0gKHNpemVvZihtb3VzZWJ1dHRvbnRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdHJ1Y3Qga2V5dGFiIG1vdXNlbW9kdGFiW10gPSB7ICAgICAgICAgLyogZXZlbnQgYnV0dG9uIGtleSBtb2RpZmllciAqLworICAgIHsgImFsdCIsICAgICAgICAgICAgICBYWU1fQUxULCAgIDAgfSwKKyAgICB7ICJhbHQtc2hpZnQiLCAgICAgICAgWFlNX1NISUZUfFhZTV9BTFQsIDAgfSwKKyAgICB7ICJjdHJsIiwgICAgICAgICAgICAgWFlNX0NUUkwsICAwIH0sCisgICAgeyAiY3RybC1hbHQiLCAgICAgICAgIFhZTV9DVFJMfFhZTV9BTFQsIDAgfSwKKyAgICB7ICJjdHJsLWFsdC1zaGlmdCIsICAgWFlNX0NUUkx8WFlNX1NISUZUfFhZTV9BTFQsIDAgfSwKKyAgICB7ICJjdHJsLXNoaWZ0IiwgICAgICAgWFlNX0NUUkx8WFlNX1NISUZULCAwIH0sCisgICAgeyAibm9uZSIsICAgICAgICAgICAgIDAsIDAgfSwKKyAgICB7ICJzaGlmdCIsICAgICAgICAgICAgWFlNX1NISUZULCAwIH0KK307CitpbnQgbm1tdGFiID0gKHNpemVvZihtb3VzZW1vZHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdHJ1Y3Qga2V5dGFiIG1jbGlja3RhYltdID0geyAgICAgICAgICAgLyogZXZlbnQgYnV0dG9uIGNsaWNrIG1vZGlmaWVyICovCisgICAgeyAiY2xpY2siLCAgICAgICAgWFlNX0MxLCAgIDAgfSwKKyAgICB7ICJkcmFnIiwgICAgICAgICBYWU1fRFJBRywgMCB9LAorICAgIHsgImRvdWJsZS1jbGljayIsIFhZTV9DMiwgICAwIH0KK307CitpbnQgbm1jdGFiID0gKHNpemVvZihtY2xpY2t0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2lmbmRlZiBOT0tWRVJCUworZXh0ZXJuIGludCBua3ZlcmJzOworZXh0ZXJuIHN0cnVjdCBrZXl0YWIga3ZlcmJzW107CisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKyNlbmRpZiAvKiBPUzJNT1VTRSAqLworCisvKiAjaWZkZWYgVk1TICovCitzdHJ1Y3Qga2V5dGFiIGZidGFiW10gPSB7ICAgICAgICAgICAgICAgLyogQmluYXJ5IHJlY29yZCB0eXBlcyBmb3IgVk1TICovCisgICAgeyAiZml4ZWQiLCAgICAgWFlGVF9CLCAwIH0sICAgICAgICAgLyogRml4ZWQgaXMgbm9ybWFsIGZvciBiaW5hcnkgKi8KKyAgICB7ICJ1bmRlZmluZWQiLCBYWUZUX1UsIDAgfSAgICAgICAgICAvKiBVbmRlZmluZWQgaWYgdGhleSBhc2sgZm9yIGl0ICovCit9OworaW50IG5mYnR5cCA9IChzaXplb2YoZmJ0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKy8qICNlbmRpZiAqLworCisjaWZkZWYgVk1TCitzdHJ1Y3Qga2V5dGFiIGxibHRhYltdID0geyAgICAgICAgICAgICAgLyogTGFiZWxlZCBGaWxlIGluZm8gKi8KKyAgICB7ICJhY2wiLCAgICAgICAgIExCTF9BQ0wsIDAgfSwKKyAgICB7ICJiYWNrdXAtZGF0ZSIsIExCTF9CQ0ssIDAgfSwKKyAgICB7ICJuYW1lIiwgICAgICAgIExCTF9OQU0sIDAgfSwKKyAgICB7ICJvd25lciIsICAgICAgIExCTF9PV04sIDAgfSwKKyAgICB7ICJwYXRoIiwgICAgICAgIExCTF9QVEgsIDAgfQorfTsKK2ludCBubGJscCA9IChzaXplb2YobGJsdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisjZWxzZQorI2lmZGVmIE9TMgorc3RydWN0IGtleXRhYiBsYmx0YWJbXSA9IHsgICAgICAgICAgICAgIC8qIExhYmVsZWQgRmlsZSBpbmZvICovCisgICAgeyAiYXJjaGl2ZSIsICAgTEJMX0FSQywgMCB9LAorICAgIHsgImV4dGVuZGVkIiwgIExCTF9FWFQsIDAgfSwKKyAgICB7ICJoaWRkZW4iLCAgICBMQkxfSElELCAwIH0sCisgICAgeyAicmVhZC1vbmx5IiwgTEJMX1JPLCAgMCB9LAorICAgIHsgInN5c3RlbSIsICAgIExCTF9TWVMsIDAgfQorfTsKK2ludCBubGJscCA9IChzaXplb2YobGJsdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogVk1TICovCisKKyNpZmRlZiBDS19DVVJTRVMKKyNpZmRlZiBDS19QQ1RfQkFSCitzdGF0aWMgc3RydWN0IGtleXRhYiBmZGZ0YWJbXSA9IHsgICAgICAgLyogU0VUIEZJTEUgRElTUExBWSBGVUxMIG9wdGlvbnMgKi8KKyAgICB7ICJ0aGVybW9tZXRlciIsICAgIDEsIDAsIH0sCisgICAgeyAibm8tdGhlcm1vbWV0ZXIiLCAwLCAwICB9Cit9OworZXh0ZXJuIGludCB0aGVybW9tZXRlcjsKKyNlbmRpZiAvKiBDS19QQ1RfQkFSICovCisjZW5kaWYgLyogQ0tfQ1VSU0VTICovCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGZkdGFiW10gPSB7ICAgICAgICAvKiBTRVQgRklMRSBESVNQTEFZIG9wdGlvbnMgKi8KKyNpZmRlZiBNQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNpbnRvc2ggKi8KKyAgICB7ICJmdWxsc2NyZWVuIiwgWFlGRF9SLCAgICAgIDAgfSwgICAvKiBGdWxsLXNjcmVlbiBidXQgbm90IGN1cnNlcyAqLworICAgIHsgIm5vbmUiLCAgICAgICBYWUZEX04sICAgICAgMCB9LAorICAgIHsgIm9mZiIsICAgICAgICBYWUZEX04sIENNX0lOViB9LAorICAgIHsgIm9uIiwgICAgICAgICBYWUZEX1IsIENNX0lOViB9LAorICAgIHsgInF1aWV0IiwgICAgICBYWUZEX04sIENNX0lOViB9LAorI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBNYWMgKi8KKyAgICB7ICJicmllZiIsIFhZRkRfQiwgMCB9LCAgICAgICAgICAgICAvKiBCcmllZiAqLworICAgIHsgImNydCIsIFhZRkRfUywgMCB9LCAgICAgICAgICAgICAgIC8qIENSVCBkaXNwbGF5ICovCisjaWZkZWYgQ0tfQ1VSU0VTCisjaWZkZWYgQ09NTUVOVAorICAgIHsgImN1cnNlcyIsICAgICBYWUZEX0MsICBDTV9JTlYgfSwgIC8qIEZ1bGwtc2NyZWVuLCBjdXJzZXMgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgeyAiZnVsbHNjcmVlbiIsIFhZRkRfQywgIDAgfSwgICAgICAgLyogRnVsbC1zY3JlZW4sIHdoYXRldmVyIHRoZSBtZXRob2QgKi8KKyNlbmRpZiAvKiBDS19DVVJTRVMgKi8KKyNpZmRlZiBLVUkKKyAgICB7ICJndWkiLCAgICBYWUZEX0csIDAgfSwgICAgICAgICAgICAvKiBHVUkgKi8KKyNlbmRpZiAvKiBLVUkgKi8gICAgICAgIAorICAgIHsgIm5vbmUiLCAgIFhZRkRfTiwgMCAgICAgIH0sICAgICAgIC8qIE5vIGRpc3BsYXkgKi8KKyAgICB7ICJvZmYiLCAgICBYWUZEX04sIENNX0lOViB9LCAgICAgICAvKiBEaXR0byAqLworICAgIHsgIm9uIiwgICAgIFhZRkRfUiwgQ01fSU5WIH0sICAgICAgIC8qIE9uID0gU2VyaWFsICovCisgICAgeyAicXVpZXQiLCAgWFlGRF9OLCBDTV9JTlYgfSwgICAgICAgLyogTm8gZGlzcGxheSAqLworICAgIHsgInNlcmlhbCIsIFhZRkRfUiwgMCAgICAgIH0sICAgICAgIC8qIFNlcmlhbCAqLworI2VuZGlmIC8qIE1BQyAqLworICAgIHsgIiIsIDAsIDAgfQorfTsKK2ludCBuZmR0YWIgPSAoc2l6ZW9mKGZkdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCitzdHJ1Y3Qga2V5dGFiIHJzcnRhYltdID0geyAgICAgICAgICAgICAgLyogRm9yIFJFTU9URSBTRVQgUkVDRUlWRSAqLworICAgIHsgInBhY2tldC1sZW5ndGgiLCBYWUxFTiwgIDAgfSwKKyAgICB7ICJ0aW1lb3V0IiwgICAgICAgWFlUSU1PLCAwIH0KK307CitpbnQgbnJzcnRhYiA9IChzaXplb2YocnNydGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKKy8qIFNlbmQvUmVjZWl2ZSBQYXJhbWV0ZXJzICovCisKK3N0cnVjdCBrZXl0YWIgc3J0YWJbXSA9IHsKKyAgICB7ICJiYWNrdXAiLCBYWUJVUCwgMCB9LAorI2lmbmRlZiBOT0NTRVRTCisgICAgeyAiY2hhcmFjdGVyLXNldC1zZWxlY3Rpb24iLCBYWUNTRVQsIDAgfSwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgeyAiY29udHJvbC1wcmVmaXgiLCBYWVFDVEwsIDAgfSwKKyNpZmRlZiBDS1hYQ0hBUgorICAgIHsgImRvdWJsZS1jaGFyYWN0ZXIiLCBYWURCTCwgMCB9LAorI2VuZGlmIC8qIENLWFhDSEFSICovCisgICAgeyAiZW5kLW9mLXBhY2tldCIsIFhZRU9MLCAwIH0sCisjaWZkZWYgUElQRVNFTkQKKyAgICB7ICJmaWx0ZXIiLCBYWUZMVFIsIDAgfSwKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworI2lmZGVmIENLWFhDSEFSCisgICAgeyAiaWdub3JlLWNoYXJhY3RlciIsIFhZSUdOLCAwIH0sCisjZW5kaWYgLyogQ0tYWENIQVIgKi8KKyAgICB7ICJpLXBhY2tldHMiLCA5OTMsIDAgfSwKKyAgICB7ICJtb3ZlLXRvIiwgWFlNT1ZFLCAwIH0sCisgICAgeyAibmVnb3RpYXRpb24tc3RyaW5nLW1heC1sZW5ndGgiLCBYWUlOSUwsIENNX0lOViB9LAorICAgIHsgInBhY2tldC1sZW5ndGgiLCBYWUxFTiwgMCB9LAorICAgIHsgInBhZC1jaGFyYWN0ZXIiLCBYWVBBREMsIDAgfSwKKyAgICB7ICJwYWRkaW5nIiwgWFlOUEFELCAwIH0sCisgICAgeyAicGF0aG5hbWVzIiwgWFlGUEFUSCwgMCB9LAorICAgIHsgInBhdXNlIiwgWFlQQVVTLCAwIH0sCisjaWZkZWYgQ0tfUEVSTVMKKyAgICB7ICJwZXJtaXNzaW9ucyIsIDk5NCwgMH0sCQkvKiAyMDYgKi8KKyNlbmRpZiAvKiBDS19QRVJNUyAqLworICAgIHsgInF1b3RlIiwgWFlRQ1RMLCBDTV9JTlYgfSwgICAgICAgIC8qID0gQ09OVFJPTC1QUkVGSVggKi8KKyAgICB7ICJyZW5hbWUtdG8iLCBYWVJFTkFNRSwgMCB9LAorICAgIHsgInN0YXJ0LW9mLXBhY2tldCIsIFhZTUFSSywgMCB9LAorICAgIHsgInRpbWVvdXQiLCBYWVRJTU8sIDAgfSwKKyNpZmRlZiBWTVMKKyAgICB7ICJ2ZXJzaW9uLW51bWJlcnMiLCA4ODcsIDAgfSwgICAgICAvKiBWTVMgdmVyc2lvbiBudW1iZXJzICovCisjZW5kaWYgLyogVk1TICovCisgICAgeyAiIiwgMCwgMCB9Cit9OworaW50IG5zcnRhYiA9IChzaXplb2Yoc3J0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKKyNpZmRlZiBVTklDT0RFCisjZGVmaW5lIFVDU19CT00gMQorI2RlZmluZSBVQ1NfQllUIDIKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHVjc3RhYltdID0geworICAgIHsgImJvbSIsICAgICAgICBVQ1NfQk9NLCAwIH0sCisgICAgeyAiYnl0ZS1vcmRlciIsIFVDU19CWVQsIDAgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitpbnQgbnVjc3RhYiA9IChzaXplb2YodWNzdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBib3RhYltdID0geworICAgIHsgImJpZy1lbmRpYW4iLCAgICAwLCAwIH0sCisgICAgeyAibGl0dGxlLWVuZGlhbiIsIDEsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmJvdGFiID0gMjsKKyNlbmRpZiAvKiBVTklDT0RFICovCisKKy8qIFJFTU9URSBTRVQgKi8KKworc3RydWN0IGtleXRhYiBybXN0YWJbXSA9IHsKKyAgICB7ICJhdHRyaWJ1dGVzIiwgIFhZQVRUUiwgMCAgICAgIH0sCisgICAgeyAiYmxvY2stY2hlY2siLCBYWUNIS1QsIDAgICAgICB9LAorICAgIHsgImZpbGUiLCAgICAgICAgWFlGSUxFLCAwICAgICAgfSwKKyAgICB7ICJpbmNvbXBsZXRlIiwgIFhZSUZELCAgQ01fSU5WIH0sICAvKiA9IFJFTU9URSBTRVQgRklMRSBJTkNPTVBMRVRFICovCisgICAgeyAibWF0Y2giLCAgICAgICBYWU1BVENILDAgICAgICB9LAorICAgIHsgInJlY2VpdmUiLCAgICAgWFlSRUNWLCAwICAgICAgfSwKKyAgICB7ICJyZXRyeSIsICAgICAgIFhZUkVUUiwgMCAgICAgIH0sCisgICAgeyAic2VydmVyIiwgICAgICBYWVNFUlYsIDAgICAgICB9LAorICAgIHsgInRyYW5zZmVyIiwgICAgWFlYRkVSLCAwICAgICAgfSwKKyAgICB7ICJ3aW5kb3ciLCAgICAgIFhZV0lORCwgMCAgICAgIH0sCisgICAgeyAieGZlciIsICAgICAgICBYWVhGRVIsIENNX0lOViB9Cit9OworaW50IG5ybXMgPSAoc2l6ZW9mKHJtc3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdHJ1Y3Qga2V5dGFiIGF0dHJ0YWJbXSA9IHsKKyNpZmRlZiBTVFJBVFVTCisgICAgeyAiYWNjb3VudCIsICAgICAgIEFUX0FDQ1QsIDAgfSwKKyNlbmRpZiAvKiBTVFJBVFVTICovCisgICAgeyAiYWxsIiwgICAgICAgICAgIEFUX1hBTEwsIDAgfSwKKyNpZmRlZiBDT01NRU5UCisgICAgeyAiYmxvY2tzaXplIiwgICAgIEFUX0JMS1MsIDAgfSwgICAgLyogKG5vdCB1c2VkKSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZm5kZWYgTk9DU0VUUworICAgIHsgImNoYXJhY3Rlci1zZXQiLCBBVF9FTkNPLCAwIH0sCisjZW5kaWYgLyogTk9DU0VUUyAqLworI2lmZGVmIFNUUkFUVVMKKyAgICB7ICJjcmVhdG9yIiwgICAgICAgQVRfQ1JFQSwgMCB9LAorI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyAgICB7ICJkYXRlIiwgICAgICAgICAgQVRfREFURSwgMCB9LAorICAgIHsgImRpc3Bvc2l0aW9uIiwgICBBVF9ESVNQLCAwIH0sCisgICAgeyAiZW5jb2RpbmciLCAgICAgIEFUX0VOQ08sIENNX0lOViB9LAorICAgIHsgImZvcm1hdCIsICAgICAgICBBVF9SRUNGLCBDTV9JTlYgfSwKKyAgICB7ICJsZW5ndGgiLCAgICAgICAgQVRfTEVOSywgMCB9LAorICAgIHsgIm9mZiIsICAgICAgICAgICBBVF9BTExOLCAwIH0sCisgICAgeyAib24iLCAgICAgICAgICAgIEFUX0FMTFksIDAgfSwKKyNpZmRlZiBDT01NRU5UCisgICAgeyAib3Mtc3BlY2lmaWMiLCAgIEFUX1NZU1AsIDAgfSwgICAgLyogKG5vdCB1c2VkIGJ5IFVOSVggb3IgVk1TKSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBDS19QRVJNUworICAgIHsgInByb3RlY3Rpb24iLCAgICBBVF9MUFJPLCAwIH0sCisgICAgeyAicGVybWlzc2lvbnMiLCAgIEFUX0xQUk8sIENNX0lOViB9LAorI2VuZGlmIC8qIENLX1BFUk1TICovCisgICAgeyAicmVjb3JkLWZvcm1hdCIsIEFUX1JFQ0YsIDAgfSwKKyAgICB7ICJzeXN0ZW0taWQiLCAgICAgQVRfU1lTSSwgMCB9LAorICAgIHsgInR5cGUiLCAgICAgICAgICBBVF9GVFlQLCAwIH0KK307CitpbnQgbmF0ciA9IChzaXplb2YoYXR0cnRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOyAvKiBob3cgbWFueSBhdHRyaWJ1dGVzICovCisKKyNpZmRlZiBDS1RJRExFCitzdHJ1Y3Qga2V5dGFiIGlkbGFjdHNbXSA9IHsKKyAgICB7ICJleGl0IiwgICAgICAgSURMRV9FWElULCAwIH0sCisgICAgeyAiaGFuZ3VwIiwgICAgIElETEVfSEFORywgMCB9LAorICAgIHsgIm91dHB1dCIsICAgICBJRExFX09VVCwgIDAgfSwKKyAgICB7ICJyZXR1cm4iLCAgICAgSURMRV9SRVQsICAwIH0sCisjaWZkZWYgVE5DT0RFCisgICAgeyAidGVsbmV0LW5vcCIsIElETEVfVE5PUCwgMCB9LAorICAgIHsgInRlbG5ldC1heXQiLCBJRExFX1RBWVQsIDAgfSwKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICB7ICIiLCAwLCAwIH0KK307CitpbnQgbmlkbGFjdHMgPSAoc2l6ZW9mKGlkbGFjdHMpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisjZW5kaWYgLyogQ0tUSURMRSAqLworCisjaWZuZGVmIE5PU1BMCitleHRlcm4gaW50IGluZGVmLCBpbmVjaG8sIGluc2lsZW5jZSwgaW5idWZzaXplLCBpbmF1dG9kbCwgaW5pbnRyOworI2lmZGVmIENLRkxPQVQKK2V4dGVybiBDS0ZMT0FUIGluc2NhbGU7CisjZW5kaWYJLyogQ0tGTE9BVCAqLworZXh0ZXJuIGNoYXIgKiBpbnBidWYsICogaW5wYnA7CisjaWZkZWYgT1MyCitleHRlcm4gaW50IGludGVybTsKKyNlbmRpZiAvKiBPUzIgKi8KK3N0cnVjdCBrZXl0YWIgaW5wdGFiW10gPSB7ICAgICAgICAgICAgICAvKiBTRVQgSU5QVVQgcGFyYW1ldGVycyAqLworI2lmZGVmIENLX0FVVE9ETAorICAgIHsgImF1dG9kb3dubG9hZCIsICAgIElOX0FETCwgMCB9LAorI2VuZGlmIC8qIENLX0FVVE9ETCAqLworICAgIHsgImJ1ZmZlci1sZW5ndGgiLCAgIElOX0JVRiwgMCB9LAorICAgIHsgImNhbmNlbGxhdGlvbiIsICAgIElOX0NBTiwgMCB9LAorICAgIHsgImNhc2UiLCAgICAgICAgICAgIElOX0NBUywgMCB9LAorICAgIHsgImRlZmF1bHQtdGltZW91dCIsIElOX0RFRiwgQ01fSU5WIH0sIC8qIFRoZXJlIGlzIG5vIGRlZmF1bHQgdGltZW91dCAqLworICAgIHsgImVjaG8iLCAgICAgICAgICAgIElOX0VDSCwgMCB9LAorI2lmZGVmIE9TMgorICAgIHsgInBhY2luZyIsICAgICAgICAgIElOX1BBQywgQ01fSU5WIH0sCisjZW5kaWYgLyogT1MyICovCisgICAgeyAic2NhbGUtZmFjdG9yIiwgICAgSU5fU0NBLCAwIH0sCisgICAgeyAic2lsZW5jZSIsICAgICAgICAgSU5fU0lMLCAwIH0sCisjaWZkZWYgT1MyCisgICAgeyAidGVybWluYWwiLCAgICAgICAgSU5fVFJNLCAwIH0sCisjZW5kaWYgLyogT1MyICovCisgICAgeyAidGltZW91dC1hY3Rpb24iLCAgSU5fVElNLCAwIH0KK307CitpbnQgbmlucCA9IChzaXplb2YoaW5wdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgaW50aW10W10gPSB7ICAgICAgICAgICAgICAvKiBTRVQgSU5QVVQgVElNRU9VVCBwYXJhbWV0ZXJzICovCisgICAgeyAicHJvY2VlZCIsIDAsIDAgfSwgICAgICAgICAgICAgICAgLyogMCA9IHByb2NlZWQgKi8KKyAgICB7ICJxdWl0IiwgICAgMSwgMCB9ICAgICAgICAgICAgICAgICAvKiAxID0gcXVpdCAqLworfTsKKworc3RydWN0IGtleXRhYiBpbmNhc3RbXSA9IHsgICAgICAgICAgICAgIC8qIFNFVCBJTlBVVCBDQVNFIHBhcmFtZXRlcnMgKi8KKyAgICB7ICJpZ25vcmUiLCAgMCwgMCB9LCAgICAgICAgICAgICAgICAvKiAwID0gaWdub3JlICovCisgICAgeyAib2JzZXJ2ZSIsIDEsIDAgfSAgICAgICAgICAgICAgICAgLyogMSA9IG9ic2VydmUgKi8KK307CisjZW5kaWYgLyogTk9TUEwgKi8KKworc3RydWN0IGtleXRhYiBuYWJsdGFiW10gPSB7ICAgICAgICAgICAgIC8qIEZvciBhbnkgY29tbWFuZCB0aGF0IG5lZWRzICovCisgICAgeyAiZGlzYWJsZWQiLCAwLCAwIH0sCisgICAgeyAiZW5hYmxlZCIsICAxLCAwIH0sCisgICAgeyAib2ZmIiwgICAgICAwLCBDTV9JTlYgfSwgICAgICAgICAgLyogdGhlc2Uga2V5d29yZHMuLi4gKi8KKyAgICB7ICJvbiIsICAgICAgIDEsIENNX0lOViB9Cit9OworaW50IG5uYWJsdGFiID0gc2l6ZW9mKG5hYmx0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpOworCisjaWZkZWYgT1MyCitzdHJ1Y3Qga2V5dGFiIHR2Y3RhYltdID0geyAgICAgICAgICAgICAgLyogU0VUIFRFUk0gVklERU8tQ0hBTkdFICovCisgICAgeyAiZGlzYWJsZWQiLCAgICAgVFZDX0RJUywgMCB9LAorICAgIHsgImVuYWJsZWQiLCAgICAgIFRWQ19FTkEsIDAgfSwKKyNpZmRlZiBOVAorICAgIHsgIndpbjk1LXNhZmUiLCAgIFRWQ19XOTUsIDAgfSwKKyNlbmRpZiAvKiBOVCAqLworICAgIHsgIiIsIDAsIDAgfQorfTsKK2ludCBudHZjdGFiID0gKHNpemVvZih0dmN0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKK3N0cnVjdCBrZXl0YWIgbXNrdGFiW10gPSB7IC8qIFNFVCBNUy1ET1MgS0VSTUlUIGNvbXBhdGliaWxpdGllcyAqLworI2lmZGVmIENPTU1FTlQKKyAgICB7ICJjb2xvciIsICAgIE1TS19DT0xPUiwgIDAgfSwKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgeyAia2V5Y29kZXMiLCBNU0tfS0VZUywgICAwIH0KK307CitpbnQgbm1zayA9IChzaXplb2YobXNrdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgc2NybnVwZFtdID0geyAgICAgICAgICAgICAvKiBTRVQgVEVSTUlOQUwgU0NSRUVOLVVQREFURSAqLworICAgIHsgImZhc3QiLCAgIFRUVV9GQVNULCAgIDAgfSwKKyAgICB7ICJzbW9vdGgiLCBUVFVfU01PT1RILCAwIH0KK307CitpbnQgbnNjcm51cGQgPSAoc2l6ZW9mKHNjcm51cGQpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworI2lmZGVmIFBDRk9OVFMKKy8qIFRoaXMgZGVmaW5pdGlvbiBvZiB0aGUgdGVybV9mb250W10gdGFibGUgaXMgb25seSBmb3IgICAgICovCisvKiB0aGUgT1MvMiBGdWxsIFNjcmVlbiBTZXNzaW9uIGFuZCBpcyBub3QgdXNlZCBvbiBXaW5kb3dzICovCitzdHJ1Y3Qga2V5dGFiIHRlcm1fZm9udFtdID0geyAgICAgICAgICAgLyogU0VUIFRFUk1JTkFMIEZPTlQgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgeyAiY3AxMTEiLCBUVEZfMTExLCAwIH0sCisgICAgeyAiY3AxMTIiLCBUVEZfMTEyLCAwIH0sCisgICAgeyAiY3AxMTMiLCBUVEZfMTEzLCAwIH0sCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHsgImNwNDM3IiwgVFRGXzQzNywgMCB9LAorICAgIHsgImNwODUwIiwgVFRGXzg1MCwgMCB9LAorI2lmZGVmIENPTU1FTlQKKyAgICB7ICJjcDg1MSIsIFRURl84NTEsIDAgfSwKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgeyAiY3A4NTIiLCBUVEZfODUyLCAwIH0sCisjaWZkZWYgQ09NTUVOVAorICAgIHsgImNwODUzIiwgVFRGXzg1MywgMCB9LAorICAgIHsgImNwODYwIiwgVFRGXzg2MCwgMCB9LAorICAgIHsgImNwODYxIiwgVFRGXzg2MSwgMCB9LAorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB7ICJjcDg2MiIsIFRURl84NjIsIDAgfSwKKyNpZmRlZiBDT01NRU5UCisgICAgeyAiY3A4NjMiLCBUVEZfODYzLCAwIH0sCisgICAgeyAiY3A4NjQiLCBUVEZfODY0LCAwIH0sCisgICAgeyAiY3A4NjUiLCBUVEZfODY1LCAwIH0sCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHsgImNwODY2IiwgVFRGXzg2NiwgMCB9LAorI2lmZGVmIENPTU1FTlQKKyAgICB7ICJjcDg4MCIsIFRURl84ODAsIDAgfSwKKyAgICB7ICJjcDg4MSIsIFRURl84ODEsIDAgfSwKKyAgICB7ICJjcDg4MiIsIFRURl84ODIsIDAgfSwKKyAgICB7ICJjcDg4MyIsIFRURl84ODMsIDAgfSwKKyAgICB7ICJjcDg4NCIsIFRURl84ODQsIDAgfSwKKyAgICB7ICJjcDg4NSIsIFRURl84ODUsIDAgfSwKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgeyAiZGVmYXVsdCIsVFRGX1JPTSwwIH0KK307CitpbnQgbnRlcm1mb250ID0gKHNpemVvZih0ZXJtX2ZvbnQpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKK2ludCB0dF9mb250ID0gVFRGX1JPTTsgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hbCBzY3JlZW4gZm9udCAqLworI2Vsc2UgLyogUENGT05UUyAqLworI2lmZGVmIE5UCisjaWZkZWYgS1VJCitzdHJ1Y3Qga2V5dGFiICogdGVybV9mb250ID0gTlVMTDsKK3N0cnVjdCBrZXl0YWIgKiBfdGVybV9mb250ID0gTlVMTDsKK2NoYXIgKiB0dF9mYWNlbmFtZSA9IE5VTEw7CitpbnQgbnRlcm1mb250ID0gMDsKK2ludCB0dF9mb250ID0gMDsKK2ludCB0dF9mb250X3NpemUgPSAwOworI2VuZGlmIC8qIEtVSSAqLworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogUENGT05UUyAqLworCitzdHJ1Y3Qga2V5dGFiIGFuYmt0YWJbXSA9IHsgICAgICAgICAgICAgLyogRm9yIGFueSBjb21tYW5kIHRoYXQgbmVlZHMgKi8KKyAgICB7ICJtZXNzYWdlIiwgMiwgMCB9LCAgICAgICAgICAgICAgICAvKiB0aGVzZSBrZXl3b3Jkcy4uLiAqLworICAgIHsgIm9mZiIsICAgICAwLCAwIH0sCisgICAgeyAib24iLCAgICAgIDEsIDAgfSwKKyAgICB7ICJ1bnNhZmUtbWVzc2FnMCIsIDk5LCBDTV9JTlYgfSwKKyAgICB7ICJ1bnNhZmUtbWVzc2FnZSIsIDMsICBDTV9JTlYgfQorfTsKK2ludCBuYW5zYmsgPSAoc2l6ZW9mKGFuYmt0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKworaW50IHdpbjk1X3BvcHVwID0gMTsKKyNpZmRlZiBOVAorI2lmZGVmIEtVSQoraW50IHdpbjk1bHVjaWRhID0gMDsKK2ludCB3aW45NWhzbCA9IDE7CisjZWxzZSAvKiBLVUkgKi8KK2ludCB3aW45NWx1Y2lkYSA9IDE7CitpbnQgd2luOTVoc2wgPSAxOworI2VuZGlmIC8qIEtVSSAqLworI2Vsc2UgLyogTlQgKi8KK2ludCB3aW45NWx1Y2lkYSA9IDA7CitpbnQgd2luOTVoc2wgPSAxOworI2VuZGlmIC8qIE5UICovCisjaWZkZWYgTlQKK2ludCB3aW45NWFsdGdyICA9IDA7CitleHRlcm4gaW50IHdpbjk1c2VsZWN0YnVnOworZXh0ZXJuIGludCB3aW45NV84XzM7CisKKyNpZmRlZiBDT01NRU5UCitleHRlcm4gQ0hBUiAoKnhscltNQVhUQ1NFVFMrMV1bTUFYRkNTRVRTKzFdKShDSEFSKTsKK2V4dGVybiBzdHJ1Y3Qga2V5dGFiIHRjc3RhYltdOworZXh0ZXJuIGludCBudGNzOworI2VuZGlmIC8qIENPTU1FTlQgKi8KK2V4dGVybiBpbnQgbWF4b3csIG1heG93X3Vzcjsgb3d3YWl0OyAgICAvKiBPdmVybGFwcGVkIEkvTyB2YXJpYWJsZXMgKi8KKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIE9TMiAqLworCisKKy8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYnJva2VuIG91dCBvZiBkb3BybSgpIHRvIGdpdmUgY29tcGlsZXJzIGEgYnJlYWsuICovCisKKy8qICBTIEUgVCBPIE4gIC0tICBQYXJzZSBvbi9vZmYgKGRlZmF1bHQgb24pLCBzZXQgcGFyYW1ldGVyIHRvIHJlc3VsdCAgKi8KKworaW50CitzZXRvbihwcm0pIGludCAqcHJtOyB7CisgICAgaW50IHgsIHk7CisgICAgaWYgKCh5ID0gY21rZXkob25vZmYsMiwiIiwib24iLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgKnBybSA9IHk7CisgICAgcmV0dXJuKDEpOworfQorCisvKiAgUyBFIFQgTyBOIEEgVSBUIE8gLS0gIFBhcnNlIG9uL29mZi9hdXRvIChkZWZhdWx0IGF1dG8pICYgc2V0IHJlc3VsdCAqLworCitzdHJ1Y3Qga2V5dGFiIG9ub2ZmYXV0W10gPSB7CisgICAgeyAiYXV0byIsIFNFVF9BVVRPLCAwIH0sICAgICAgICAgICAgLyogMiAqLworICAgIHsgIm9mZiIsICBTRVRfT0ZGLCAgMCB9LCAgICAgICAgICAgIC8qIDAgKi8KKyAgICB7ICJvbiIsICAgU0VUX09OLCAgIDAgfSAgICAgICAgICAgICAvKiAxICovCit9OworCitpbnQKK3NldG9uYXV0KHBybSkgaW50ICpwcm07IHsKKyAgICBpbnQgeCwgeTsKKyAgICBpZiAoKHkgPSBjbWtleShvbm9mZmF1dCwzLCIiLCJhdXRvIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICpwcm0gPSB5OworICAgIHJldHVybigxKTsKK30KKworLyogIFMgRSBUIE4gVSBNICAtLSAgU2V0IHBhcmFtZXRlciB0byByZXN1bHQgb2YgY21udW0oKSBwYXJzZS4gICovCisvKgorIENhbGwgd2l0aCBwb2ludGVyIHRvIGludGVnZXIgdmFyaWFibGUgdG8gYmUgc2V0LAorICAgeCA9IG51bWJlciBmcm9tIGNudW0gcGFyc2UsIHkgPSByZXR1cm4gY29kZSBmcm9tIGNtbnVtLAorICAgbWF4ID0gbWF4aW11bSB2YWx1ZSB0byBhY2NlcHQsIC0xIGlmIG5vIG1heGltdW0uCisgUmV0dXJucyAtOSBvbiBmYWlsdXJlLCBhZnRlciBwcmludGluZyBhIG1lc3NhZ2UsIG9yIDEgb24gc3VjY2Vzcy4KKyovCitpbnQKK3NldG51bShwcm0seCx5LG1heCkgaW50IHgsIHksICpwcm0sIG1heDsgeworICAgIGRlYnVnKEYxMDEsInNldG51bSIsIiIseSk7CisgICAgaWYgKHkgPT0gLTMpIHsKKyAgICAgICAgcHJpbnRmKCJcbj9WYWx1ZSByZXF1aXJlZFxuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGlmICh5ID09IC0yKSB7CisgICAgICAgIHByaW50ZigiJXM/Tm90IGEgbnVtYmVyOiAlc1xuIixjbWZsZ3MgPT0gMSA/ICIiIDogIlxuIiwgYXR4YnVmKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKHkgPCAwKSByZXR1cm4oeSk7CisgICAgaWYgKG1heCA+IC0xICYmIHggPiBtYXgpIHsKKyAgICAgICAgcHJpbnRmKCI/U29ycnksICVkIGlzIHRoZSBtYXhpbXVtXG4iLG1heCk7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICpwcm0gPSB4OworICAgIHJldHVybigxKTsKK30KKworLyogIFMgRSBUIEMgQyAgLS0gIFNldCBwYXJhbWV0ZXIgdmFyIHRvIGFuIEFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVyIHZhbHVlLiAgKi8KKy8qCisgIFBhcnNlcyBhIG51bWJlciwgb3IgYSBsaXRlcmFsIGNvbnRyb2wgY2hhcmFjdGVyLCBvciBhIGNhcmV0ICheKSBmb2xsb3dlZAorICBieSBhbiBBU0NJSSBjaGFyYWN0ZXIgd2hvc2UgdmFsdWUgaXMgNjMtOTUgb3IgOTctMTIyLCB0aGVuIGdldHMgY29uZmlybWF0aW9uLAorICB0aGVuIHNldHMgdGhlIHBhcmFtZXRlciB0byB0aGUgY29kZSB2YWx1ZSBvZiB0aGUgY2hhcmFjdGVyIGdpdmVuLiAgSWYgdGhlcmUKKyAgYXJlIGFueSBwYXJzZSBlcnJvcnMsIHRoZXkgYXJlIHJldHVybmVkLCBvdGhlcndpc2Ugb24gc3VjY2VzcyAxIGlzIHJldHVybmVkLgorKi8KK2ludAorc2V0Y2MoZGZsdCx2YXIpIGNoYXIgKmRmbHQ7IGludCAqdmFyOyB7CisgICAgaW50IHgsIHk7CisgICAgdW5zaWduZWQgaW50IGM7CisgICAgY2hhciAqaGxwbXNnID0gIkNvbnRyb2wgY2hhcmFjdGVyLFxuXAorIG51bWVyaWMgQVNDSUkgdmFsdWUsXG5cCisgb3IgaW4gXlggbm90YXRpb24sXG5cCisgb3IgcHJlY2VkZWQgYnkgYSBiYWNrc2xhc2ggYW5kIGVudGVyZWQgbGl0ZXJhbGx5IjsKKworICAgIC8qIFRoaXMgaXMgYSBoYWNrIHRvIHR1cm4gb2ZmIGNvbXBsYWludHMgZnJvbSBleHByZXNzaW9uIGV2YWx1YXRvci4gKi8KKyAgICB4X2lmbnVtID0gMTsKKyAgICB5ID0gY21udW0oaGxwbXNnLCBkZmx0LCAxMCwgJngsIHh4c3RyaW5nKTsgLyogUGFyc2UgYSBudW1iZXIgKi8KKyAgICB4X2lmbnVtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsb3cgY29tcGxhaW50cyBhZ2FpbiAqLworICAgIGlmICh5IDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIGZhaWxlZCAqLworICAgICAgICBpZiAoeSAhPSAtMikgICAgICAgICAgICAgICAgICAgIC8qIFJlcGFyc2UgbmVlZGVkIG9yIHNvbWVzdWNoICovCisgICAgICAgICAgcmV0dXJuKHkpOyAgICAgICAgICAgICAgICAgICAgLyogUGFzcyBmYWlsdXJlIGJhY2sgdXAgdGhlIGNoYWluICovCisgICAgfQorICAgIC8qIFJlYWwgY29udHJvbCBjaGFyYWN0ZXIgb3IgbGl0ZXJhbCA4LWJpdCBjaGFyYWN0ZXIuLi4gKi8KKworICAgIGZvciAoYyA9IHN0cmxlbihhdG1idWYpIC0gMTsgYyA+IDA7IGMtLSkgLyogVHJpbSAqLworICAgICAgaWYgKGF0bWJ1ZltjXSA9PSBTUCkgYXRtYnVmW2NdID0gTlVMOworCisgICAgaWYgKHkgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQgd2FzIG5vdCBhIG51bWJlciAqLworICAgICAgICBpZiAoKChjID0gYXRtYnVmWzBdKSkgJiYgIWF0bWJ1ZlsxXSkgeyAvKiBMaXRlcmFsIGNoYXJhY3Rlcj8gKi8KKyAgICAgICAgICAgIGMgJj0gMHhmZjsKKyAgICAgICAgICAgIGlmICgoKGMgPiAzMSkgJiYgKGMgPCAxMjcpKSB8fCAoYyA+IDI1NSkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuPyVkOiBPdXQgb2YgcmFuZ2UgLSBtdXN0IGJlIDAtMzEgb3IgMTI3LTI1NVxuIixjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApICAvKiBDb25maXJtICovCisgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgKnZhciA9IGM7ICAgICAgICAgICAgICAgLyogU2V0IHRoZSB2YXJpYWJsZSAqLworICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhdG1idWZbMF0gPT0gJ14nICYmICFhdG1idWZbMl0pIHsgLyogT3IgXlggbm90YXRpb24/ICovCisgICAgICAgICAgICBjID0gYXRtYnVmWzFdOworICAgICAgICAgICAgaWYgKGlzbG93ZXIoKGNoYXIpIGMpKSAgICAgIC8qIFVwcGVyY2FzZSBsb3dlcmNhc2UgbGV0dGVycyAqLworICAgICAgICAgICAgICBjID0gdG91cHBlcihjKTsKKyAgICAgICAgICAgIGlmIChjID4gNjIgJiYgYyA8IDk2KSB7ICAgICAvKiBDaGVjayByYW5nZSAqLworICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAqdmFyID0gY3RsKGMpOyAgICAgICAgICAvKiBPSyAqLworICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/Tm90IGEgY29udHJvbCBjaGFyYWN0ZXIgLSAlc1xuIiwgYXRtYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvbWV0aGluZyBpbGxlZ2FsIHdhcyB0eXBlZCAqLworICAgICAgICAgICAgcHJpbnRmKCI/SW52YWxpZCAtICVzXG4iLCBhdG1idWYpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKCh4ID4gMzEpICYmICh4IDwgMTI3KSkgfHwgKHggPiAyNTUpKSB7IC8qIFRoZXkgdHlwZWQgYSBudW1iZXIgKi8KKyAgICAgICAgcHJpbnRmKCJcbj8lZDogT3V0IG9mIHJhbmdlIC0gbXVzdCBiZSAwLTMxIG9yIDEyNy0yNTVcbiIseCk7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgICAgICAgICAgICAgIC8qIEluIHJhbmdlLCBjb25maXJtICovCisgICAgICByZXR1cm4oeSk7CisgICAgKnZhciA9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHZhcmlhYmxlICovCisgICAgcmV0dXJuKDEpOworfQorCisjaWZuZGVmIE5PU1BMICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIFNPUlQgY29tbWFuZC4uLiAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBzcnRzd3RhYltdID0geyAgICAgLyogU09SVCBjb21tYW5kIHN3aXRjaGVzICovCisgICAgeyAiL2Nhc2UiLCAgICBTUlRfQ0FTLCBDTV9BUkcgfSwKKyAgICB7ICIva2V5IiwgICAgIFNSVF9LRVksIENNX0FSRyB9LAorICAgIHsgIi9udW1lcmljIiwgU1JUX05VTSwgMCB9LAorICAgIHsgIi9yYW5nZSIsICAgU1JUX1JORywgQ01fQVJHIH0sCisgICAgeyAiL3JldmVyc2UiLCBTUlRfUkVWLCAwIH0KK307CitzdGF0aWMgaW50IG5zcnRzd3RhYiA9IHNpemVvZihzcnRzd3RhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpOworCitleHRlcm4gY2hhciAqKmFfcHRyW107ICAgICAgICAgICAgICAgICAgLyogQXJyYXkgcG9pbnRlcnMgKi8KK2V4dGVybiBpbnQgYV9kaW1bXTsgICAgICAgICAgICAgICAgICAgICAvKiBBcnJheSBkaW1lbnNpb25zICovCisKK2ludAorZG9zb3J0KCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIHRoZSBTT1JUIGNvbW1hbmQgKi8KKyAgICBjaGFyIGMsICpwID0gTlVMTCwgKiogYXAsICoqIHhwID0gTlVMTDsKKyAgICBzdHJ1Y3QgRkRCIHN3LCBmbCwgY207CisgICAgaW50IGhpLCBsbzsKKyAgICBpbnQgeG4gPSAwLCB4ciA9IC0xLCB4ayA9IC0xLCB4YyA9IC0xLCB4cyA9IDA7CisgICAgaW50IGdldHZhbCA9IDAsIHJhbmdlWzJdLCBjb25maXJtZWQgPSAwOworCisgICAgY21mZGJpKCZzdywgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgRkRCIC0gY29tbWFuZCBzd2l0Y2hlcyAqLworICAgICAgICAgICBfQ01LRVksICAgICAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICJBcnJheSBuYW1lIG9yIHN3aXRjaCIsCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIG5zcnRzd3RhYiwgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgc3J0c3d0YWIsICAgICAgICAgICAgICAgICAgICAvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgICAgICZmbCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICApOworICAgIGNtZmRiaSgmZmwsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFueXRoaW5nIHRoYXQgZG9lc24ndCBtYXRjaCAqLworICAgICAgICAgICBfQ01GTEQsICAgICAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICJBcnJheSBuYW1lIiwgICAgICAgICAgICAgICAgLyogaGxwbXNnICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworICAgICAgICAgICBOVUxMLAorICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAmY20KKyAgICAgICAgICAgKTsKKyAgICBjbWZkYmkoJmNtLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPciBwcmVtYXR1cmUgY29uZmlybWF0aW9uICovCisgICAgICAgICAgIF9DTUNGTSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgKTsKKworICAgIHJhbmdlWzBdID0gLTE7CisgICAgcmFuZ2VbMV0gPSAtMTsKKworICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIDAgb3IgbW9yZSBzd2l0Y2hlcyAqLworICAgICAgICB4ID0gY21mZGIoJnN3KTsKKyAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkgICAvKiBCcmVhayBvdXQgaWYgbm90IGEgc3dpdGNoICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGMgPSBjbWdicmsoKTsKKyAgICAgICAgZ2V0dmFsID0gKGMgPT0gJzonIHx8IGMgPT0gJz0nKTsKKyAgICAgICAgaWYgKGdldHZhbCAmJiAhKGNtcmVzdWx0LmtmbGFncyAmIENNX0FSRykpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIGRvZXMgbm90IHRha2UgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjbXJlc3VsdC5ucmVzdWx0KSB7CisgICAgICAgICAgY2FzZSBTUlRfUkVWOgorICAgICAgICAgICAgeHIgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBTUlRfS0VZOgorICAgICAgICAgICAgaWYgKGdldHZhbCkgeworICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtbnVtKCJDb2x1bW4gZm9yIGNvbXBhcmlzb24gKDEtYmFzZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSIsMTAsJngseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgeGsgPSB4IC0gMTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICB4ayA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFNSVF9DQVM6CisgICAgICAgICAgICBpZiAoZ2V0dmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkob25vZmYsMiwiIiwib24iLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgIHhjID0geTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICB4YyA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFNSVF9STkc6ICAgICAgICAgICAgICAgICAvKiAvUkFOR0UgKi8KKyAgICAgICAgICAgIGlmIChnZXR2YWwpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlszMl07CisgICAgICAgICAgICAgICAgY2hhciBidWYyWzE2XTsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBjaGFyICogcCwgKiBxOworICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtZmxkKCJsb3c6aGlnaCBlbGVtZW50IiwiMSIsJnMsTlVMTCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICBzID0gYnJzdHJpcChzKTsKKyAgICAgICAgICAgICAgICBja3N0cm5jcHkoYnVmLHMsMzIpOworICAgICAgICAgICAgICAgIHAgPSBidWY7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgKnAgJiYgaSA8IDI7IGkrKykgeyAvKiBHZXQgbG93IGFuZCBoaWdoICovCisgICAgICAgICAgICAgICAgICAgIHEgPSBwOyAgICAgICAgICAgICAgLyogU3RhcnQgb2YgdGhpcyBwaWVjZSAqLworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKnApIHsgICAgICAgIC8qIEZpbmQgZW5kIG9mIHRoaXMgcGllY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnOicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcCA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeSA9IDE1OyAgICAgICAgICAgICAvKiBFdmFsdWF0ZSB0aGlzIHBpZWNlICovCisgICAgICAgICAgICAgICAgICAgIHMgPSBidWYyOworICAgICAgICAgICAgICAgICAgICB6enN0cmluZyhxLCZzLCZ5KTsKKyAgICAgICAgICAgICAgICAgICAgcyA9IGV2YWx4KGJ1ZjIpOworICAgICAgICAgICAgICAgICAgICBpZiAocykgaWYgKCpzKSBja3N0cm5jcHkoYnVmMixzLDE2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZGlnaXRzKGJ1ZjIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9Ob3QgbnVtZXJpYzogJXNcbiIsYnVmMik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJhbmdlW2ldID0gYXRvaShidWYyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFNSVF9OVU06ICAgICAgICAgICAgICAgICAvKiAvTlVNRVJJQyAqLworICAgICAgICAgICAgeG4gPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoIChjbXJlc3VsdC5mY29kZSkgeworICAgICAgY2FzZSBfQ01DRk06CisgICAgICAgIGNvbmZpcm1lZCA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBfQ01GTEQ6CisgICAgICAgIGNrc3RybmNweShsaW5lLGNtcmVzdWx0LnNyZXN1bHQsTElOQlVGU0laKTsgLyogU2FmZSBjb3B5IG9mIG5hbWUgKi8KKyAgICAgICAgcyA9IGxpbmU7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCI/VW5leHBlY3RlZCBmdW5jdGlvbiBjb2RlOiAlZFxuIixjbXJlc3VsdC5mY29kZSk7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGlmIChjb25maXJtZWQpIHsKKyAgICAgICAgcHJpbnRmKCI/QXJyYXkgbmFtZSByZXF1aXJlZFxuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGNrbWFrbXNnKHRtcGJ1ZixUTVBCVUZTSVosCisgICAgICAgICAgICAgIlNlY29uZCBhcnJheSB0byBzb3J0IGFjY29yZGluZyB0byAiLHMsTlVMTCxOVUxMKTsKKyAgICBpZiAoKHggPSBjbWZsZCh0bXBidWYsIiIsJnAsTlVMTCkpIDwgMCkKKyAgICAgIGlmICh4ICE9IC0zKQorICAgICAgICByZXR1cm4oeCk7CisgICAgdG1wYnVmWzBdID0gTlVMOworICAgIGNrc3RybmNweSh0bXBidWYscCxUTVBCVUZTSVopOworICAgIHAgPSB0bXBidWY7CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSAgICAgICAgICAgICAgLyogR2V0IGNvbmZpcm1hdGlvbiAqLworICAgICAgcmV0dXJuKHgpOworCisgICAgeCA9IGFycmF5Ym91bmRzKHMsJmxvLCZoaSk7ICAgICAgICAgLyogR2V0IGFycmF5IGluZGV4ICYgYm91bmRzICovCisgICAgaWYgKHggPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgKi8KKyAgICAgICAgcHJpbnRmKCI/QmFkIGFycmF5IG5hbWU6ICVzXG4iLHMpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAobG8gPiAtMSkgcmFuZ2VbMF0gPSBsbzsgICAgICAgICAvKiBTZXQgcmFuZ2UgKi8KKyAgICBpZiAoaGkgPiAtMSkgcmFuZ2VbMV0gPSBoaTsKKyAgICBhcCA9IGFfcHRyW3hdOyAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgcG9pbnRlciB0byBhcnJheSBlbGVtZW50IGxpc3QgKi8KKyAgICBpZiAoIWFwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayAqLworICAgICAgICBwcmludGYoIj9BcnJheSBub3QgZGVjbGFyZWQ6ICVzXG4iLCBzKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKHJhbmdlWzBdIDwgMCkgICAgICAgICAgICAgICAgICAgLyogU3RhcnRpbmcgZWxlbWVudCAqLworICAgICAgcmFuZ2VbMF0gPSAxOworICAgIGlmIChyYW5nZVsxXSA8IDApICAgICAgICAgICAgICAgICAgIC8qIEZpbmFsIGVsZW1lbnQgKi8KKyAgICAgIHJhbmdlWzFdID0gYV9kaW1beF07CisgICAgaWYgKHJhbmdlWzFdID4gYV9kaW1beF0pIHsKKyAgICAgICAgcHJpbnRmKCI/cmFuZ2UgJWQ6JWQgZXhjZWVkcyBhcnJheSBkaW1lbnNpb24gJWRcbiIsCisgICAgICAgICAgICAgICByYW5nZVswXSxyYW5nZVsxXSxhX2RpbVt4XQorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgYXAgKz0gcmFuZ2VbMF07CisgICAgeHMgPSByYW5nZVsxXSAtIHJhbmdlWzBdICsgMTsgICAgICAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNvcnQgKi8KKyAgICBpZiAoeHMgPCAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayAqLworICAgICAgICBwcmludGYoIj9CYWQgcmFuZ2U6ICVkOiVkXG4iLHJhbmdlWzBdLHJhbmdlWzFdKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKHhrIDwgMCkgeGsgPSAwOyAgICAgICAgICAgICAgICAgLyogS2V5IHBvc2l0aW9uICovCisgICAgaWYgKHhyIDwgMCkgeHIgPSAwOyAgICAgICAgICAgICAgICAgLyogUmV2ZXJzZSBmbGFnICovCisgICAgaWYgKHhuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtZXJpYyBmbGFnICovCisgICAgICB4YyA9IDI7CisgICAgZWxzZSBpZiAoeGMgPCAwKSAgICAgICAgICAgICAgICAgICAgLyogTm90IG51bWVyaWMgKi8KKyAgICAgIHhjID0gaW5wY2FzW2NtZGx2bF07ICAgICAgICAgICAgICAvKiBzbyBhbHBoYSBjYXNlIG9wdGlvbiAqLworCisgICAgaWYgKCpwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFyYWxsZWwgYXJyYXkgZ2l2ZW4/ICovCisgICAgICAgIHkgPSB4YXJyYXkocCk7ICAgICAgICAgICAgICAgICAgLyogWWVzLCBnZXQgaXRzIGluZGV4LiAqLworICAgICAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiP0JhZCBhcnJheSBuYW1lOiAlc1xuIiwgcCk7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIGlmICh5ICE9IHgpIHsgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIDIgYXJyYXlzIGFyZSBkaWZmZXJlbnQgICovCisgICAgICAgICAgICB4cCA9IGFfcHRyW3ldOyAgICAgICAgICAgICAgLyogUG9pbnRlciB0byAybmQgYXJyYXkgZWxlbWVudCBsaXN0ICovCisgICAgICAgICAgICBpZiAoIXhwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/QXJyYXkgbm90IGRlY2xhcmVkOiAlc1xuIiwgcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhX2RpbVt5XSA8IHJhbmdlWzFdKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/QXJyYXkgJXMgc21hbGxlciB0aGFuICVzXG4iLCBwLCBzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeHAgKz0gcmFuZ2VbMF07ICAgICAgICAgICAgIC8qIFNldCBiYXNlIHRvIHNhbWUgYXMgMXN0IGFycmF5ICovCisgICAgICAgIH0KKyAgICB9CisgICAgc2hfc29ydChhcCx4cCx4cyx4ayx4cix4Yyk7ICAgICAgICAgLyogU29ydCB0aGUgYXJyYXkocykgKi8KKyAgICByZXR1cm4oc3VjY2VzcyA9IDEpOyAgICAgICAgICAgICAgICAvKiBBbHdheXMgc3VjY2VlZHMgKi8KK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBwdXJndGFiW10gPSB7ICAgICAgLyogUFVSR0UgY29tbWFuZCBzd2l0Y2hlcyAqLworICAgIHsgIi9hZnRlciIsICAgICAgICBQVV9BRlQsICBDTV9BUkcgfSwKKyAgICB7ICIvYXNrIiwgICAgICAgICAgUFVfQVNLLCAgMCB9LAorICAgIHsgIi9iZWZvcmUiLCAgICAgICBQVV9CRUYsICBDTV9BUkcgfSwKKyAgICB7ICIvZGVsZXRlIiwgICAgICAgUFVfREVMRSwgQ01fSU5WIH0sCisjaWZkZWYgVU5JWE9ST1NLCisgICAgeyAiL2RvdGZpbGVzIiwgICAgIFBVX0RPVCwgIDAgfSwKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyAgICB7ICIvZXhjZXB0IiwgICAgICAgUFVfRVhDLCAgQ01fQVJHIH0sCisgICAgeyAiL2hlYWRpbmciLCAgICAgIFBVX0hERywgIDAgfSwKKyAgICB7ICIva2VlcCIsICAgICAgICAgUFVfS0VFUCwgQ01fQVJHIH0sCisgICAgeyAiL2xhcmdlci10aGFuIiwgIFBVX0xBUiwgIENNX0FSRyB9LAorICAgIHsgIi9saXN0IiwgICAgICAgICBQVV9MSVNULCAwIH0sCisgICAgeyAiL2xvZyIsICAgICAgICAgIFBVX0xJU1QsIENNX0lOViB9LAorICAgIHsgIi9ub2FzayIsICAgICAgICBQVV9OQVNLLCAwIH0sCisgICAgeyAiL25vZGVsZXRlIiwgICAgIFBVX05PREUsIENNX0lOViB9LAorI2lmZGVmIFVOSVhPUk9TSworICAgIHsgIi9ub2RvdGZpbGVzIiwgICBQVV9OT0RPVCwwIH0sCisjZW5kaWYgLyogVU5JWE9ST1NLICovCisgICAgeyAiL25vaGVhZGluZyIsICAgIFBVX05PSCwgIDAgfSwKKyAgICB7ICIvbm9sIiwgICAgICAgICAgUFVfTk9MSSwgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgIi9ub2xpc3QiLCAgICAgICBQVV9OT0xJLCAwIH0sCisgICAgeyAiL25vbG9nIiwgICAgICAgIFBVX05PTEksIENNX0lOViB9LAorI2lmZGVmIENLX1RUR1dTSVoKKyAgICB7ICIvbm9wYWdlIiwgICAgICAgUFVfTk9QQSwgMCB9LAorI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKyAgICB7ICIvbm90LWFmdGVyIiwgICAgUFVfTkFGLCAgQ01fQVJHIH0sCisgICAgeyAiL25vdC1iZWZvcmUiLCAgIFBVX05CRiwgIENNX0FSRyB9LAorICAgIHsgIi9ub3Qtc2luY2UiLCAgICBQVV9OQUYsICBDTV9JTlZ8Q01fQVJHIH0sCisjaWZkZWYgQ0tfVFRHV1NJWgorICAgIHsgIi9wYWdlIiwgICAgICAgICBQVV9QQUdFLCAwIH0sCisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworICAgIHsgIi9xdWlldCIsICAgICAgICBQVV9RVUlFLCBDTV9JTlYgfSwKKyNpZmRlZiBSRUNVUlNJVkUKKyAgICB7ICIvcmVjdXJzaXZlIiwgICAgUFVfUkVDVSwgMCB9LAorI2VuZGlmIC8qIFJFQ1VSU0lWRSAqLworICAgIHsgIi9zaW5jZSIsICAgICAgICBQVV9BRlQsICBDTV9BUkd8Q01fSU5WIH0sCisgICAgeyAiL3NpbXVsYXRlIiwgICAgIFBVX05PREUsIDAgfSwKKyAgICB7ICIvc21hbGxlci10aGFuIiwgUFVfU01BLCAgQ01fQVJHIH0sCisgICAgeyAiL3ZlcmJvc2UiLCAgICAgIFBVX1ZFUkIsIENNX0lOViB9Cit9Oworc3RhdGljIGludCBucHVyZ3RhYiA9IHNpemVvZihwdXJndGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYik7CisKKworCisKKworaW50Citia3VwbnVtKHMsaSkgY2hhciAqIHM7IGludCAqaTsgeworICAgIGludCBrID0gMCwgcG9zID0gMDsKKyAgICBjaGFyICogcCA9IE5VTEwsICpxOworICAgICppID0gcG9zOworICAgIGlmICghcykgcyA9ICIiOworICAgIGlmICghKnMpCisgICAgICByZXR1cm4oLTEpOworICAgIGlmICgoayA9IHN0cmxlbihzKSkgPCA1KQorICAgICAgcmV0dXJuKC0xKTsKKworICAgIGlmIChzW2stMV0gIT0gJ34nKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBwb3MgPSBrIC0gMjsKKyAgICBxID0gcyArIHBvczsKKyAgICB3aGlsZSAocSA+PSBzICYmIGlzZGlnaXQoKnEpKSB7CisgICAgICAgIHAgPSBxLS07CisgICAgICAgIHBvcy0tOworICAgIH0KKyAgICBpZiAoIXApCisgICAgICByZXR1cm4oLTEpOworICAgIGlmIChxIDwgcysyKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAoKnEgIT0gJ34nIHx8ICoocS0xKSAhPSAnLicpCisgICAgICByZXR1cm4oLTEpOworICAgIHBvcy0tOworICAgICppID0gcG9zOworICAgIGRlYnVnKEYxMTEsImJrdXBudW0iLHMrcG9zLHBvcyk7CisgICAgcmV0dXJuKGF0b2kocCkpOworfQorCisjaWZkZWYgQ0tQVVJHRQorLyogUHJlc2VudGx5IG9ubHkgZm9yIFVOSVggYmVjYXVzZSB3ZSBuZWVkIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIGZpbGUgYXJyYXkuICovCisvKiBOb3QgbmVlZGVkIGZvciBWTVMgYW55d2F5LCBiZWNhdXNlIHdlIGRvbid0IG1ha2UgYmFja3VwIGZpbGVzIHRoZXJlLiAqLworCisjZGVmaW5lIE1BWEtFRVAgMzIgICAgICAgICAgICAgICAgICAgICAgLyogQmlnZ2VzdCAvS0VFUDogdmFsdWUgKi8KKworc3RhdGljIGludAorICBwdV9rZWVwID0gMCwgcHVfbGlzdCA9IDAsIHB1X2RvdCA9IDAsIHB1X2FzayA9IDAsIHB1X2hkZyA9IDA7CisKKyNpZmRlZiBDS19UVEdXU0laCitzdGF0aWMgaW50IHB1X3BhZ2UgPSAtMTsKKyNlbHNlCitzdGF0aWMgaW50IHB1X3BhZ2UgPSAwOworI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKworI2lmbmRlZiBOT1NIT1cKK1ZPSUQKK3Nob3dwdXJnb3B0cygpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSE9XIFBVUkdFIGNvbW1hbmQgb3B0aW9ucyAqLworICAgIGludCB4ID0gMDsKKyAgICBleHRlcm4gaW50IG9wdGxpbmVzOworICAgIHBydG9wdCgmb3B0bGluZXMsIlBVUkdFIik7CisgICAgaWYgKHB1X2FzayA+IC0xKSB7CisgICAgICAgIHgrKzsKKyAgICAgICAgcHJ0b3B0KCZvcHRsaW5lcywgcHVfYXNrID8gIi9BU0siIDogIi9OT0FTSyIpOworICAgIH0KKyNpZmRlZiBVTklYT1JPU0sKKyAgICBpZiAocHVfZG90ID4gLTEpIHsKKyAgICAgICAgeCsrOworICAgICAgICBwcnRvcHQoJm9wdGxpbmVzLCBwdV9kb3QgPyAiL0RPVEZJTEVTIiA6ICIvTk9ET1RGSUxFUyIpOworICAgIH0KKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyAgICBpZiAocHVfa2VlcCA+IC0xKSB7CisgICAgICAgIHgrKzsKKyAgICAgICAgY2ttYWttc2codG1wYnVmLFRNUEJVRlNJWiwiL0tFRVA6Iixja2l0b2EocHVfa2VlcCksTlVMTCxOVUxMKTsKKyAgICAgICAgcHJ0b3B0KCZvcHRsaW5lcyx0bXBidWYpOworICAgIH0KKyAgICBpZiAocHVfbGlzdCA+IC0xKSB7CisgICAgICAgIHgrKzsKKyAgICAgICAgcHJ0b3B0KCZvcHRsaW5lcywgcHVfbGlzdCA/ICIvTElTVCIgOiAiL05PTElTVCIpOworICAgIH0KKyAgICBpZiAocHVfaGRnID4gLTEpIHsKKyAgICAgICAgeCsrOworICAgICAgICBwcnRvcHQoJm9wdGxpbmVzLCBwdV9oZGcgPyAiL0hFQURJTkciIDogIi9OT0hFQURJTkciKTsKKyAgICB9CisjaWZkZWYgQ0tfVFRHV1NJWgorICAgIGlmIChwdV9wYWdlID4gLTEpIHsKKyAgICAgICAgeCsrOworICAgICAgICBwcnRvcHQoJm9wdGxpbmVzLCBwdV9wYWdlID8gIi9QQUdFIiA6ICIvTk9QQUdFIik7CisgICAgfQorI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKyAgICBpZiAoIXgpIHBydG9wdCgmb3B0bGluZXMsIihubyBvcHRpb25zIHNldCkiKTsKKyAgICBwcnRvcHQoJm9wdGxpbmVzLCIiKTsKK30KKyNlbmRpZiAvKiBOT1NIT1cgKi8KKworaW50CitzZXRwdXJnb3B0cygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IFBVUkdFIGNvbW1hbmQgb3B0aW9ucyAqLworICAgIGludCBjLCB6LCBnZXR2YWwgPSAwOworICAgIGludAorICAgICAgeF9rZWVwICA9IC0xLCB4X2xpc3QgPSAtMSwgeF9wYWdlID0gLTEsCisgICAgICB4X2hkZyAgID0gLTEsIHhfYXNrICA9IC0xLCB4X2RvdCAgPSAtMTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICgoeSA9IGNtc3dpKHB1cmd0YWIsbnB1cmd0YWIsIlN3aXRjaCIsIiIseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgIGlmICh5ID09IC0zKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICB9CisgICAgICAgIGMgPSBjbWdicmsoKTsKKyAgICAgICAgaWYgKChnZXR2YWwgPSAoYyA9PSAnOicgfHwgYyA9PSAnPScpKSAmJiAhKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIGlmICghZ2V0dmFsICYmIChjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgY2FzZSBQVV9LRUVQOgorICAgICAgICAgICAgeiA9IDE7CisgICAgICAgICAgICBpZiAoYyA9PSAnOicgfHwgYyA9PSAnPScpCisgICAgICAgICAgICAgIGlmICgoeSA9IGNtbnVtKCJIb3cgbWFueSBiYWNrdXAgZmlsZXMgdG8ga2VlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIiwxMCwmeix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICBpZiAoeiA8IDAgfHwgeiA+IE1BWEtFRVApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9QbGVhc2Ugc3BlY2lmeSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBNQVhLRUVQCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHhfa2VlcCA9IHo7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFBVX0xJU1Q6CisgICAgICAgICAgY2FzZSBQVV9WRVJCOgorICAgICAgICAgICAgeF9saXN0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgUFVfUVVJRToKKyAgICAgICAgICBjYXNlIFBVX05PTEk6CisgICAgICAgICAgICB4X2xpc3QgPSAwOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgQ0tfVFRHV1NJWgorICAgICAgICAgIGNhc2UgUFVfUEFHRToKKyAgICAgICAgICAgIHhfcGFnZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFBVX05PUEE6CisgICAgICAgICAgICB4X3BhZ2UgPSAwOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworICAgICAgICAgIGNhc2UgUFVfSERHOgorICAgICAgICAgICAgeF9oZGcgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBQVV9OT0g6CisgICAgICAgICAgICB4X2hkZyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFBVX0FTSzoKKyAgICAgICAgICAgIHhfYXNrID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgUFVfTkFTSzoKKyAgICAgICAgICAgIHhfYXNrID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFVOSVhPUk9TSworICAgICAgICAgIGNhc2UgUFVfRE9UOgorICAgICAgICAgICAgeF9kb3QgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBQVV9OT0RPVDoKKyAgICAgICAgICAgIHhfZG90ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoIj9UaGlzIG9wdGlvbiBjYW4gbm90IGJlIHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgfQorICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgICAgICAgICAgICAgIC8qIEdldCBjb25maXJtYXRpb24gKi8KKyAgICAgIHJldHVybih4KTsKKyAgICBpZiAoeF9rZWVwID4gLTEpICAgICAgICAgICAgICAgICAgICAvKiBTZXQgUFVSR0UgZGVmYXVsdHMuICovCisgICAgICBwdV9rZWVwID0geF9rZWVwOworICAgIGlmICh4X2xpc3QgPiAtMSkKKyAgICAgIHB1X2xpc3QgPSB4X2xpc3Q7CisjaWZkZWYgQ0tfVFRHV1NJWgorICAgIGlmICh4X3BhZ2UgPiAtMSkKKyAgICAgIHB1X3BhZ2UgPSB4X3BhZ2U7CisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworICAgIGlmICh4X2hkZyA+IC0xKQorICAgICAgcHVfaGRnID0geF9oZGc7CisgICAgaWYgKHhfYXNrID4gLTEpCisgICAgICBwdV9hc2sgPSB4X2FzazsKKyAgICBpZiAoeF9kb3QgPiAtMSkKKyAgICAgIHB1X2RvdCA9IHhfZG90OworICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisKK2ludAorZG9wdXJnZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIHRoZSBQVVJHRSBjb21tYW5kICovCisgICAgZXh0ZXJuIGNoYXIgKiogbXRjaHM7CisgICAgZXh0ZXJuIGludCB4YXNrbW9yZSwgY21kX3Jvd3MsIHJlY3Vyc2l2ZTsKKyAgICBpbnQgc2ltdWxhdGUgPSAwLCBhc2tpbmcgPSAwOworICAgIGludCBsaXN0aW5nID0gMCwgcGFnaW5nID0gLTEsIGxpbmVzID0gMCwgZGVsZXRpbmcgPSAxLCBlcnJvcnMgPSAwOworICAgIHN0cnVjdCBGREIgc3csIHNmLCBjbTsKKyAgICBpbnQgZywgaSwgaiwgaywgbSA9IDAsIG4sIHgsIHksIHosIGRvbmUgPSAwLCBjb3VudCA9IDAsIGZsYWdzID0gMDsKKyAgICBpbnQgdG9rZWVwID0gMCwgZ2V0dmFsID0gMCwgaGF2ZW5hbWUgPSAwLCBjb25maXJtZWQgPSAwOworICAgIGludCB4eFtNQVhLRUVQKzFdOyAgICAgICAgICAgICAgICAgIC8qIEFycmF5IG9mIG51bWJlcnMgdG8ga2VlcCAqLworICAgIGludCBtaW4gPSAtMTsKKyAgICBpbnQgeF9oZGcgPSAwLCBmcyA9IDAsIHJjID0gMDsKKyAgICBsb25nIG1pbnNpemUgPSAtMUwsIG1heHNpemUgPSAtMUw7CisgICAgY2hhciBuYW1lYnVmW0NLTUFYUEFUSCs0XTsKKyAgICBjaGFyIGJhc2VidWZbQ0tNQVhQQVRIKzRdOworICAgIGNoYXIKKyAgICAgICogcHVfYWZ0ID0gTlVMTCwKKyAgICAgICogcHVfYmVmID0gTlVMTCwKKyAgICAgICogcHVfbmFmID0gTlVMTCwKKyAgICAgICogcHVfbmJmID0gTlVMTCwKKyAgICAgICogcHVfZXhjID0gTlVMTDsKKyAgICBjaGFyICogcHhsaXN0WzhdOyAgICAgICAgICAgICAgICAgICAvKiBFeGNlcHRpb24gbGlzdCAqLworCisgICAgaWYgKHB1X2tlZXAgPiAtMSkgICAgICAgICAgICAgICAgICAgLyogU2V0IFBVUkdFIGRlZmF1bHRzLiAqLworICAgICAgdG9rZWVwID0gcHVfa2VlcDsKKyAgICBpZiAocHVfbGlzdCA+IC0xKQorICAgICAgbGlzdGluZyA9IHB1X2xpc3Q7CisjaWZkZWYgQ0tfVFRHV1NJWgorICAgIGlmIChwdV9wYWdlID4gLTEpCisgICAgICBwYWdpbmcgPSBwdV9wYWdlOworI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKworICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYS0VFUDsgaSsrKSAgICAgIC8qIENsZWFyIHRoaXMgbnVtYmVyIGJ1ZmZlciAqLworICAgICAgeHhbaV0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlc2UuLi4gKi8KKyAgICAgIHB4bGlzdFtpXSA9IE5VTEw7CisKKyAgICBnX21hdGNoZG90ID0gbWF0Y2hkb3Q7ICAgICAgICAgICAgICAvKiBTYXZlIHRoZXNlLi4uICovCisKKyAgICBjbWZkYmkoJnN3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxc3QgRkRCIC0gUFVSR0Ugc3dpdGNoZXMgKi8KKyAgICAgICAgICAgX0NNS0VZLCAgICAgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAiRmlsZW5hbWUgb3Igc3dpdGNoIiwgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICBucHVyZ3RhYiwgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKyAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgIHB1cmd0YWIsICAgICAgICAgICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAmc2YgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKyAgICAgICAgICAgKTsKKyAgICBjbWZkYmkoJnNmLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAybmQgRkRCIC0gZmlsZXNwZWMgdG8gcHVyZ2UgKi8KKyAgICAgICAgICAgX0NNSUZJLCAgICAgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAiIiwKKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisgICAgICAgICAgIHh4c3RyaW5nLAorICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAmY20KKyAgICAgICAgICAgKTsKKyAgICBjbWZkYmkoJmNtLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPciBwcmVtYXR1cmUgY29uZmlybWF0aW9uICovCisgICAgICAgICAgIF9DTUNGTSwgICAgICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgKTsKKworICAgIHdoaWxlICghaGF2ZW5hbWUgJiYgIWNvbmZpcm1lZCkgeworICAgICAgICB4ID0gY21mZGIoJnN3KTsgICAgICAgICAgICAgICAgIC8qIFBhcnNlIHNvbWV0aGluZyAqLworICAgICAgICBpZiAoeCA8IDApIHsgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICByYyA9IHg7CisgICAgICAgICAgICBnb3RvIHhwdXJnZTsKKyAgICAgICAgfSBlbHNlIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01LRVkpIHsKKyAgICAgICAgICAgIGNoYXIgYzsKKyAgICAgICAgICAgIGMgPSBjbWdicmsoKTsKKyAgICAgICAgICAgIGlmICgoZ2V0dmFsID0gKGMgPT0gJzonIHx8IGMgPT0gJz0nKSkgJiYgIShjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgICAgICByYyA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geHB1cmdlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFnZXR2YWwgJiYgKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgICAgICByYyA9IC05OworICAgICAgICAgICAgICAgIGdvdG8geHB1cmdlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChrID0gY21yZXN1bHQubnJlc3VsdCkgeworICAgICAgICAgICAgICBjYXNlIFBVX0tFRVA6CisgICAgICAgICAgICAgICAgeiA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJzonIHx8IGMgPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtbnVtKCJIb3cgbWFueSBiYWNrdXAgZmlsZXMgdG8ga2VlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIiwxMCwmeix4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSB5OworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB4cHVyZ2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHogPCAwIHx8IHogPiBNQVhLRUVQKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1BsZWFzZSBzcGVjaWZ5IGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhLRUVQCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICByYyA9IC05OworICAgICAgICAgICAgICAgICAgICBnb3RvIHhwdXJnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9rZWVwID0gejsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBQVV9MSVNUOgorICAgICAgICAgICAgICAgIGxpc3RpbmcgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFBVX05PTEk6CisgICAgICAgICAgICAgICAgbGlzdGluZyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgQ0tfVFRHV1NJWgorICAgICAgICAgICAgICBjYXNlIFBVX1BBR0U6CisgICAgICAgICAgICAgICAgcGFnaW5nID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBQVV9OT1BBOgorICAgICAgICAgICAgICAgIHBhZ2luZyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworICAgICAgICAgICAgICBjYXNlIFBVX0RFTEU6CisgICAgICAgICAgICAgICAgZGVsZXRpbmcgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFBVX05PREU6CisgICAgICAgICAgICAgICAgZGVsZXRpbmcgPSAwOworICAgICAgICAgICAgICAgIHNpbXVsYXRlID0gMTsKKyAgICAgICAgICAgICAgICBsaXN0aW5nID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBQVV9BU0s6CisgICAgICAgICAgICAgICAgYXNraW5nID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBQVV9OQVNLOgorICAgICAgICAgICAgICAgIGFza2luZyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgUFVfQUZUOgorICAgICAgICAgICAgICBjYXNlIFBVX0JFRjoKKyAgICAgICAgICAgICAgY2FzZSBQVV9OQUY6CisgICAgICAgICAgICAgIGNhc2UgUFVfTkJGOgorICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtZGF0ZSgiRmlsZS10aW1lIiwiIiwmcywwLHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9EYXRlLXRpbWUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtOTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgcmMgPSB4OworICAgICAgICAgICAgICAgICAgICBnb3RvIHhwdXJnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnMrKzsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGspIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgUFVfQUZUOiBtYWtlc3RyKCZwdV9hZnQscyk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBQVV9CRUY6IG1ha2VzdHIoJnB1X2JlZixzKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFBVX05BRjogbWFrZXN0cigmcHVfbmFmLHMpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgUFVfTkJGOiBtYWtlc3RyKCZwdV9uYmYscyk7IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBQVV9TTUE6CisgICAgICAgICAgICAgIGNhc2UgUFVfTEFSOgorICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtbnVtKCJGaWxlIHNpemUgaW4gYnl0ZXMiLCIwIiwxMCwmeSx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByYyA9IHg7CisgICAgICAgICAgICAgICAgICAgIGdvdG8geHB1cmdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcysrOworICAgICAgICAgICAgICAgIHN3aXRjaCAoY21yZXN1bHQubnJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgY2FzZSBQVV9TTUE6IG1pbnNpemUgPSB5OyBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgUFVfTEFSOiBtYXhzaXplID0geTsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFBVX0RPVDoKKyAgICAgICAgICAgICAgICBtYXRjaGRvdCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgUFVfTk9ET1Q6CisgICAgICAgICAgICAgICAgbWF0Y2hkb3QgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFBVX0VYQzoKKyAgICAgICAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiUGF0dGVybiIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1BhdHRlcm4gcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtOTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgcmMgPSB4OworICAgICAgICAgICAgICAgICAgICBnb3RvIHhwdXJnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnMrKzsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZwdV9leGMscyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgUFVfSERHOgorICAgICAgICAgICAgICAgIHhfaGRnID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBSRUNVUlNJVkUKKyAgICAgICAgICAgICAgY2FzZSBQVV9SRUNVOiAgICAgICAgICAgICAvKiAvUkVDVVJTSVZFICovCisgICAgICAgICAgICAgICAgcmVjdXJzaXZlID0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmludGYoIj9Ob3QgaW1wbGVtZW50ZWQgeWV0IC0gXCIlc1wiXG4iLGF0bWJ1Zik7CisgICAgICAgICAgICAgICAgcmMgPSAtOTsKKyAgICAgICAgICAgICAgICBnb3RvIHhwdXJnZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01JRkkpIHsKKyAgICAgICAgICAgIGhhdmVuYW1lID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01DRk0pIHsKKyAgICAgICAgICAgIGNvbmZpcm1lZCA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYyA9IC0yOworICAgICAgICAgICAgZ290byB4cHVyZ2U7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhdmVuYW1lKSB7CisjaWZkZWYgQ0tSRUdFWAorICAgICAgICBja21ha21zZyhsaW5lLExJTkJVRlNJWixjbXJlc3VsdC5zcmVzdWx0LCIuflsxLTldKn4iLE5VTEwsTlVMTCk7CisjZWxzZQorICAgICAgICBja21ha21zZyhsaW5lLExJTkJVRlNJWixjbXJlc3VsdC5zcmVzdWx0LCIufip+IixOVUxMLE5VTEwpOworI2VuZGlmIC8qIENLUkVHRVggKi8KKyAgICB9IGVsc2UgeworI2lmZGVmIENLUkVHRVgKKyAgICAgICAgY2tzdHJuY3B5KGxpbmUsIiouflsxLTldKn4iLExJTkJVRlNJWik7CisjZWxzZQorICAgICAgICBja3N0cm5jcHkobGluZSwiKi5+Kn4iLExJTkJVRlNJWik7CisjZW5kaWYgLyogQ0tSRUdFWCAqLworICAgIH0KKyAgICBpZiAoIWNvbmZpcm1lZCkgeworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHsKKyAgICAgICAgICAgIHJjID0geDsKKyAgICAgICAgICAgIGdvdG8geHB1cmdlOworICAgICAgICB9CisgICAgfQorICAgIC8qIFBhcnNlIGZpbmlzaGVkIC0gbm93IGFjdGlvbiAqLworCisjaWZkZWYgQ0tfTE9HSU4KKyAgICBpZiAoaXNndWVzdCkgeworICAgICAgICBwcmludGYoIj9GaWxlIGRlbGV0aW9uIGJ5IGd1ZXN0cyBub3QgcGVybWl0dGVkLlxuIik7CisgICAgICAgIHJjID0gLTk7CisgICAgICAgIGdvdG8geHB1cmdlOworICAgIH0KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCisjaWZkZWYgQ0tfVFRHV1NJWgorICAgIGlmIChwYWdpbmcgPCAwKSAgICAgICAgICAgICAgICAgICAgIC8qIC9bTk9dUEFHRSBub3QgZ2l2ZW4gKi8KKyAgICAgIHBhZ2luZyA9IHhhc2ttb3JlOyAgICAgICAgICAgICAgICAvKiBzbyB1c2UgcHJldmFpbGluZyAqLworI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKworICAgIGxpbmVzID0gMDsKKyAgICBpZiAoeF9oZGcgPiAwKSB7CisgICAgICAgIHByaW50ZigiUHVyZ2luZyAlcywga2VlcGluZyAlZC4uLiVzXG4iLAorICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgIHRva2VlcCwKKyAgICAgICAgICAgICAgIHNpbXVsYXRlID8gIiAoU0lNVUxBVElPTikiIDogIiIpOworICAgICAgICBsaW5lcyArPSAyOworICAgIH0KKyAgICBmbGFncyA9IFpYX0ZJTE9OTFk7CisgICAgaWYgKHJlY3Vyc2l2ZSkgZmxhZ3MgfD0gWlhfUkVDVVJTRTsKKyAgICBuID0gbnp4cGFuZChsaW5lLGZsYWdzKTsgICAgICAgICAgICAvKiBHZXQgbGlzdCBvZiBiYWNrdXAgZmlsZXMgKi8KKyAgICBpZiAodG9rZWVwIDwgMSkgeyAgICAgICAgICAgICAgICAgICAvKiBEZWxldGluZyBhbGwgb2YgdGhlbS4uLiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZnMpIGlmIChmaWxlc2VsZWN0KG10Y2hzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdV9hZnQscHVfYmVmLHB1X25hZixwdV9uYmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNpemUsbWF4c2l6ZSwwLDgscHhsaXN0KSA8IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAobGlzdGluZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMgKFNLSVBQRUQpXG4iLG10Y2hzW2ldKTsKKyNpZmRlZiBDS19UVEdXU0laCisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmcpCisgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrbGluZXMgPiBjbWRfcm93cyAtIDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpIGdvdG8geHB1cmdlOyBlbHNlIGxpbmVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhc2tpbmcpIHsKKyAgICAgICAgICAgICAgICBpbnQgeDsKKyAgICAgICAgICAgICAgICBja21ha21zZyh0bXBidWYsVE1QQlVGU0laLCIgRGVsZXRlICIsbXRjaHNbaV0sIj8iLE5VTEwpOworICAgICAgICAgICAgICAgIHggPSBnZXR5ZXNubyh0bXBidWYsMSk7CisgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIDA6IGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgY2FzZSAxOiBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMjogZ290byB4cHVyZ2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgeCA9IGRlbGV0aW5nID8gemRlbGV0KG10Y2hzW2ldKSA6IDA7CisgICAgICAgICAgICBpZiAoeCA+IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RpbmcpCisgICAgICAgICAgICAgICAgICBwcmludGYoIiAlcyAoJXMpXG4iLCBtdGNoc1tpXSxkZWxldGluZyA/ICJPSyIgOiAiU0VMRUNURUQiKTsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMrKzsKKyAgICAgICAgICAgICAgICBpZiAobGlzdGluZykKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiICVzIChGQUlMRUQpXG4iLCBtdGNoc1tpXSk7CisgICAgICAgICAgICB9CisjaWZkZWYgQ0tfVFRHV1NJWgorICAgICAgICAgICAgaWYgKGxpc3RpbmcgJiYgcGFnaW5nKQorICAgICAgICAgICAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeworICAgICAgICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpIGdvdG8geHB1cmdlOyBlbHNlIGxpbmVzID0gMDsKKyAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKyAgICAgICAgfQorICAgICAgICBnb3RvIHhwdXJnZTsKKyAgICB9CisgICAgaWYgKG4gPCB0b2tlZXApIHsgICAgICAgICAgICAgICAgICAgLyogTm90IGRlbGV0aW5nIGFueSAqLworICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIGlmIChsaXN0aW5nKQorICAgICAgICAgIHByaW50ZigiIE1hdGNoZXMgPSAlZDogTm90IGVub3VnaCB0byBwdXJnZS5cbiIpOworICAgICAgICBnb3RvIHhwdXJnZTsKKyAgICB9CisKKyAgICAvKiBHZW5lcmFsIGNhc2UgLSBkZWxldGUgc29tZSBidXQgbm90IG90aGVycyAqLworCisgICAgc2hfc29ydChtdGNocyxOVUxMLG4sMCwwLGZpbGVjYXNlKTsgLyogQWxwaGFiZXRpemUgdGhlIGxpc3QgKEVTU0VOVElBTCkgKi8KKworICAgIGcgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIGN1cnJlbnQgZ3JvdXAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7ICAgICAgICAgICAvKiBHbyB0aHJ1IHNvcnRlZCBmaWxlIGxpc3QgKi8KKyAgICAgICAgeCA9IHpuZXh0KG5hbWVidWYpOyAgICAgICAgICAgICAvKiBHZXQgbmV4dCBmaWxlICovCisgICAgICAgIGlmICh4IDwgMSB8fCAhbmFtZWJ1ZlswXSB8fCBpID09IG4gLSAxKSAvKiBObyBtb3JlPyAqLworICAgICAgICAgIGRvbmUgPSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6ICdkb25lJyBtdXN0IGJlIDAgb3IgMSBvbmx5ICovCisgICAgICAgIGlmIChmcykgaWYgKGZpbGVzZWxlY3QobmFtZWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdV9hZnQscHVfYmVmLHB1X25hZixwdV9uYmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2l6ZSxtYXhzaXplLDAsOCxweGxpc3QpIDwgMSkgeworICAgICAgICAgICAgaWYgKGxpc3RpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMgKFNLSVBQRUQpXG4iLG5hbWVidWYpOworICAgICAgICAgICAgICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKQorICAgICAgICAgICAgICAgICAgaWYgKCFhc2ttb3JlKCkpIGdvdG8geHB1cmdlOyBlbHNlIGxpbmVzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICh4ID4gMCkKKyAgICAgICAgICBpZiAoKG0gPSBia3VwbnVtKG5hbWVidWYsJnopKSA8IDApIC8qIFRoaXMgZmlsZSdzIGJhY2t1cCBudW1iZXIuICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHRva2VlcDsgaisrKSB7ICAvKiBJbnNlcnQgaW4gbGlzdC4gKi8KKyAgICAgICAgICAgIGlmIChtID4geHhbal0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSB0b2tlZXAgLSAxOyBrID4gajsgay0tKQorICAgICAgICAgICAgICAgICAgeHhba10gPSB4eFtrLTFdOworICAgICAgICAgICAgICAgIHh4W2pdID0gbTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBOZXcgZ3JvdXA/ICovCisgICAgICAgIGlmIChkb25lIHx8IChpID4gMCAmJiBja3N0cmNtcChuYW1lYnVmLGJhc2VidWYseiwxKSkpIHsKKyAgICAgICAgICAgIGlmIChpICsgZG9uZSAtIGcgPiB0b2tlZXApIHsgLyogRG8gd2UgaGF2ZSBlbm91Z2ggdG8gcHVyZ2U/ICovCisgICAgICAgICAgICAgICAgbWluID0geHhbdG9rZWVwLTFdOyAgICAgLyogWWVzLCBsb3dlc3QgYmFja3VwIG51bWJlciB0byBrZWVwICovCisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiZG9wdXJnZSBncm91cCIsYmFzZWJ1ZixtaW4pOworICAgICAgICAgICAgICAgIGZvciAoaiA9IGc7IGogPCBpICsgZG9uZTsgaisrKSB7IC8qIEdvIHRocm91Z2ggdGhpcyBncm91cCAqLworICAgICAgICAgICAgICAgICAgICB4ID0gYmt1cG51bShtdGNoc1tqXSwmeik7ICAgIC8qIEdldCBmaWxlIGJhY2t1cCBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPiAwICYmIHggPCBtaW4pIHsgICAgICAvKiBCZWxvdyBtaW5pbXVtPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGRlbGV0aW5nID8gemRlbGV0KG10Y2hzW2pdKSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDApIGVycm9ycysrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICVzICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdGNoc1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCA8IDApID8gIkVSUk9SIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlbGV0aW5nID8gIkRFTEVURUQiIDogIlNFTEVDVEVEIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaXN0aW5nKSAvKiBOb3QgYmVsb3cgbWluaW11bSAtIGtlZXAgdGhpcyBvbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAlcyAoS0VQVClcbiIsbXRjaHNbal0pOworI2lmZGVmIENLX1RUR1dTSVoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RpbmcgJiYgcGFnaW5nKQorICAgICAgICAgICAgICAgICAgICAgIGlmICgrK2xpbmVzID4gY21kX3Jvd3MgLSAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXNrbW9yZSgpKSBnb3RvIHhwdXJnZTsgZWxzZSBsaW5lcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxpc3RpbmcgJiYgcGFnaW5nKSB7IC8qIE5vdCBlbm91Z2ggdG8gcHVyZ2UgKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIiAlcy5+Kn4gKEtFUFQpXG4iLGJhc2VidWYpOworI2lmZGVmIENLX1RUR1dTSVoKKyAgICAgICAgICAgICAgICBpZiAoKytsaW5lcyA+IGNtZF9yb3dzIC0gMykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWFza21vcmUoKSkgZ290byB4cHVyZ2U7IGVsc2UgbGluZXMgPSAwOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdG9rZWVwOyBqKyspIC8qIENsZWFyIHRoZSBiYWNrdXAgbnVtYmVyIGxpc3QgKi8KKyAgICAgICAgICAgICAgeHhbal0gPSAwOworICAgICAgICAgICAgZyA9IGk7ICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBncm91cCBwb2ludGVyICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbmUpICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtb3JlIGZpbGVzLCBkb25lLiAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBzdHJuY3B5KGJhc2VidWYsbmFtZWJ1Zix6KTsgICAgIC8qIFNldCBiYXNlbmFtZSBvZiB0aGlzIGZpbGUgKi8KKyAgICAgICAgYmFzZWJ1Zlt6XSA9IE5VTDsKKyAgICB9CisgIHhwdXJnZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbW9uIGV4aXQgcG9pbnQgKi8KKyAgICBpZiAoZ19tYXRjaGRvdCA+IC0xKSB7CisgICAgICAgIG1hdGNoZG90ID0gZ19tYXRjaGRvdDsgICAgICAgICAgLyogUmVzdG9yZSB0aGVzZS4uLiAqLworICAgICAgICBnX21hdGNoZG90ID0gLTE7CisgICAgfQorICAgIGlmIChyYyA8IDApIHJldHVybihyYyk7ICAgICAgICAgICAgIC8qIFBhcnNlIGVycm9yICovCisgICAgaWYgKHhfaGRnKQorICAgICAgcHJpbnRmKCJGaWxlcyBwdXJnZWQ6ICVkJXNcbiIsCisgICAgICAgICAgICAgY291bnQsCisgICAgICAgICAgICAgZGVsZXRpbmcgPyAiIiA6ICIgKG5vdCByZWFsbHkpIgorICAgICAgICAgICAgICk7CisgICAgcmV0dXJuKHN1Y2Nlc3MgPSBjb3VudCA+IDAgPyAxIDogKGVycm9ycyA+IDApID8gMCA6IDEpOworfQorI2VuZGlmIC8qIENLUFVSR0UgKi8KKworI2lmbmRlZiBOT1hGRVIKKyNpZm5kZWYgTk9MT0NBTAoraW50Citkb3hkaXMod2hpY2gpIGludCB3aGljaDsgewkJLyogMSA9IEtlcm1pdCwgMiA9IEZUUCAqLworICAgIGV4dGVybiBpbnQgbm9sb2NhbDsKKyAgICBpbnQgeCwgeSA9IDAsIHo7CisjaWZkZWYgTkVXRlRQCisgICAgZXh0ZXJuIGludCBmdHBfZGlzOworI2VuZGlmIC8qIE5FV0ZUUCAqLworCisjaWZkZWYgQ09NTUVOVAorICAgIGNoYXIgKnM7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgaWYgKCh4ID0gY21rZXkoZmR0YWIsbmZkdGFiLCJmaWxlIHRyYW5zZmVyIGRpc3BsYXkgc3R5bGUiLCIiLAorICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworI2lmZGVmIENLX1BDVF9CQVIKKyAgICBpZiAoKHkgPSBjbWtleShmZGZ0YWIsMiwiIiwidGhlcm1vbWV0ZXIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHkpOworI2VuZGlmIC8qIENLX1BDVF9CQVIgKi8KKyAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApIHJldHVybih6KTsKKyNpZmRlZiBDS19DVVJTRVMKKyAgICBpZiAoeCA9PSBYWUZEX0MpIHsgICAgICAgICAgICAgICAgICAvKiBGVUxMU0NSRUVOICovCisjaWZkZWYgQ09NTUVOVAorI2lmbmRlZiBNWUNVUlNFUworICAgICAgICBleHRlcm4gY2hhciAqIHRybWJ1ZjsgICAgICAgICAgIC8qIFJlYWwgY3Vyc2VzICovCisgICAgICAgIGludCB6OworI2VuZGlmIC8qIE1ZQ1VSU0VTICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgICAgIGlmIChub2xvY2FsKSAgICAgICAgICAgICAgICAgICAgLyogTm90aGluZyB0byBkbyBpbiB0aGlzIGNhc2UgKi8KKwkgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyNpZmRlZiBDT01NRU5UCisjaWZuZGVmIE1ZQ1VSU0VTCisjaWZuZGVmIFZNUworICAgICAgICBzID0gZ2V0ZW52KCJURVJNIik7CisgICAgICAgIGRlYnVnKEYxMTAsImRveGRpcyBURVJNIixzLDApOworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgZnhkaW5pdCh4KTsKKyAgICAgICAgaWYgKCpzICYmIHRybWJ1ZikgeyAgICAgICAgICAgICAvKiBEb24ndCBjYWxsIHRnZXRlbnQgKi8KKyAgICAgICAgICAgIHogPSB0Z2V0ZW50KHRybWJ1ZixzKTsgICAgICAvKiBpZiB0cm1idWYgbm90IGFsbG9jYXRlZCAqLworICAgICAgICAgICAgZGVidWcoRjExMSwiZG94ZGlzIHRnZXRlbnQiLHMseik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6ID0gMDsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImRveGRpcyB0Z2V0ZW50IHNraXBwZWQiLHMsMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHogPCAxKSB7CisgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCB0ZXJtaW5hbCB0eXBlIHVua25vd246IFwiJXNcIlxuIixzKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBNWUNVUlNFUyAqLworI2Vsc2UKKyAgICAgICAgZnhkaW5pdCh4KTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBDS19QQ1RfQkFSCisgICAgICAgIHRoZXJtb21ldGVyID0geTsKKyNlbmRpZiAvKiBDS19QQ1RfQkFSICovCisKKyAgICAgICAgbGluZVswXSA9ICdcMCc7ICAgICAgICAgICAgICAgICAvKiAoV2hhdCdzIHRoaXMgZm9yPykgKi8KKyAgICB9CisjZW5kaWYgLyogQ0tfQ1VSU0VTICovCisgICAgaWYgKHdoaWNoID09IDEpCQkJLyogSXQncyBPSy4gKi8KKyAgICAgIGZkaXNwbGEgPSB4OworI2lmZGVmIE5FV0ZUUAorICAgIGVsc2UKKyAgICAgIGZ0cF9kaXMgPSB4OworI2VuZGlmIC8qIE5FV0ZUUCAqLworICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisjZW5kaWYgLyogTk9MT0NBTCAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCitpbnQKK3NldGZpbChybXNmbGcpIGludCBybXNmbGc7IHsKKyNpZmRlZiBDT01NRU5UCisgICAgZXh0ZXJuIGludCBlbl9kZWw7CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2lmbmRlZiBOT1hGRVIKKyAgICBpZiAocm1zZmxnKSB7CisgICAgICAgIGlmICgoeSA9IGNta2V5KHJmaWx0YWIsbnJmaWxwLCJSZW1vdGUgZmlsZSBwYXJhbWV0ZXIiLCIiLAorICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgaWYgKHkgPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9SZW1vdGUgZmlsZSBwYXJhbWV0ZXIgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9IGVsc2UgcmV0dXJuKHkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkoZmlsdGFiLG5maWxwLCJGaWxlIHBhcmFtZXRlciIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworI2lmbmRlZiBOT1hGRVIKKyAgICB9CisjZW5kaWYgLyogTk9YRkVSICovCisgICAgc3dpdGNoICh5KSB7CisjaWZkZWYgQ09NTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IG5lZWRlZCAqLworICAgICAgY2FzZSBYWUZJTEI6ICAgICAgICAgICAgICAgICAgICAgIC8qIEJsb2Nrc2l6ZSAqLworICAgICAgICBpZiAoKHkgPSBjbW51bSgiZmlsZSBibG9jayBzaXplIixja2l0b2EoREJMS1NJWiksMTAsJnoseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdTJywgIjMxMSIsIGNraXRvYSh6KSwgIiIpOworICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYmxrc2l6ID0gejsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgICBjYXNlIFhZRklMUzogICAgICAgICAgICAgICAgICAgICAgLyogQnl0ZSBzaXplICovCisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJmaWxlIGJ5dGUgc2l6ZSAoNyBvciA4KSIsIjgiLDEwLCZ6LHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgaWYgKHogIT0gNyAmJiB6ICE9IDgpIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4/VGhlIGNob2ljZXMgYXJlIDcgYW5kIDhcbiIpOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAoeiA9PSA3KSBmbWFzayA9IDAxNzc7CisgICAgICAgIGVsc2UgaWYgKHogPT0gOCkgZm1hc2sgPSAwMzc3OworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgIGNhc2UgWFlGSUxDOiB7ICAgICAgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXIgc2V0ICovCisgICAgICAgICAgY2hhciAqIGNzZXRuYW1lID0gTlVMTDsKKyAgICAgICAgICBleHRlcm4gaW50CisgICAgICAgICAgICByX2NzZXQsIHNfY3NldCwgYWZjc2V0W107ICAgLyogU0VORCBDSEFSQUNURVItU0VUIEFVVE8gb3IgTUFOVUFMICovCisKKyAgICAgICAgICBzdHJ1Y3QgRkRCIGt3LCBmbDsKKyAgICAgICAgICBjbWZkYmkoJmt3LCAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBGREIgLSBjb21tYW5kIHN3aXRjaGVzICovCisgICAgICAgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgICAgICAgcm1zZmxnID8gInNlcnZlciBjaGFyYWN0ZXItc2V0IG5hbWUiIDogIiIsICAvKiBoZWxwICovCisgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgICAgICAgIG5maWxjLCAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDAgPSBrZXl3b3JkICovCisgICAgICAgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICBmY3N0YWIsICAgICAgICAgICAgICAgIC8qIEtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgcm1zZmxnID8gJmZsIDogTlVMTCAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICk7CisgICAgICAgICAgY21mZGJpKCZmbCwgICAgICAgICAgICAgICAgICAgLyogQW55dGhpbmcgdGhhdCBkb2Vzbid0IG1hdGNoICovCisgICAgICAgICAgICAgICAgIF9DTUZMRCwgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisgICAgICAgICAgICAgICAgIHh4c3RyaW5nLAorICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgaWYgKCh4ID0gY21mZGIoJmt3KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01LRVkpIHsKKyAgICAgICAgICAgICAgeCA9IGNtcmVzdWx0Lm5yZXN1bHQ7CisgICAgICAgICAgICAgIGNzZXRuYW1lID0gZmNzaW5mb1t4XS5rZXl3b3JkOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNrc3RybmNweShsaW5lLGNtcmVzdWx0LnNyZXN1bHQsTElOQlVGU0laKTsKKyAgICAgICAgICAgICAgY3NldG5hbWUgPSBsaW5lOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgICBpZiAocm1zZmxnKSB7CisgICAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsICIzMjAiLCBjc2V0bmFtZSwgIiIpOworICAgICAgICAgICAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmNoYXJzZXQgPSB4OworICAgICAgICAgIGlmIChzX2NzZXQgPT0gWE1PREVfQSkgICAgICAgIC8qIElmIFNFTkQgQ0hBUkFDVEVSLVNFVCBpcyBBVVRPICovCisgICAgICAgICAgICBpZiAoeCA+IC0xICYmIHggPD0gTUFYRkNTRVRTKQorICAgICAgICAgICAgICBpZiAoYWZjc2V0W3hdID4gLTEgJiYgYWZjc2V0W3hdIDw9IE1BWFRDU0VUUykKKyAgICAgICAgICAgICAgICB0Y2hhcnNldCA9IGFmY3NldFt4XTsgLyogUGljayBjb3JyZXNwb25kaW5nIHhmZXIgY2hhcnNldCAqLworICAgICAgICAgIHNldHhsYXR5cGUodGNoYXJzZXQsZmNoYXJzZXQpOyAvKiBUcmFuc2xhdGlvbiB0eXBlICovCisgICAgICAgICAgLyogSWYgSSBzYXkgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCBibGFoLCBJIHdhbnQgdG8gYmUgYmxhaCEgKi8KKyAgICAgICAgICByX2NzZXQgPSBYTU9ERV9NOyAgICAgICAgICAgICAvKiBEb24ndCBzd2l0Y2ggaW5jb21pbmcgc2V0ISAqLworICAgICAgICAgIHggPSBmY3NpbmZvW2ZjaGFyc2V0XS5zaXplOyAgIC8qIEFsc28gc2V0IGRlZmF1bHQgeC1iaXQgY2hhcnNldCAqLworICAgICAgICAgIGlmICh4ID09IDEyOCkgICAgICAgICAgICAgICAgIC8qIDctYml0Li4uICovCisgICAgICAgICAgICBkY3NldDcgPSBmY2hhcnNldDsKKyAgICAgICAgICBlbHNlIGlmICh4ID09IDI1NikgICAgICAgICAgICAvKiA4LWJpdC4uLiAqLworICAgICAgICAgICAgZGNzZXQ4ID0gZmNoYXJzZXQ7CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyNpZm5kZWYgTk9MT0NBTAorICAgICAgY2FzZSBYWUZJTEQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIERpc3BsYXkgKi8KKyAgICAgICAgcmV0dXJuKGRveGRpcygxKSk7CQkvKiAxID09IGtlcm1pdCAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworICAgICAgY2FzZSBYWUZJTEE6ICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZC1vZi1saW5lICovCisjaWZkZWYgTkxDSEFSCisgICAgICAgIHMgPSAiIjsKKyAgICAgICAgaWYgKE5MQ0hBUiA9PSAwMTUpCisgICAgICAgICAgcyA9ICJjciI7CisgICAgICAgIGVsc2UgaWYgKE5MQ0hBUiA9PSAwMTIpCisgICAgICAgICAgcyA9ICJsZiI7CisgICAgICAgIGlmICgoeCA9IGNta2V5KGVvbHRhYiwgbmVvbHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsIHRleHQtZmlsZSBsaW5lIHRlcm1pbmF0b3IiLHMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworI2Vsc2UKKyAgICAgICAgaWYgKCh4ID0gY21rZXkoZW9sdGFiLCBuZW9sdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAibG9jYWwgdGV4dC1maWxlIGxpbmUgdGVybWluYXRvciIsImNybGYiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyNlbmRpZiAvKiBOTENIQVIgKi8KKyAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeik7CisgICAgICAgIGZlb2wgPSAoQ0hBUikgeDsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgWFlGSUxOOiAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lcyAqLworICAgICAgICBpZiAoKHggPSBjbWtleShmbnRhYixuZm50YWIsImhvdyB0byBoYW5kbGUgZmlsZW5hbWVzIiwiY29udmVydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdTJywgIjMwMSIsIGNraXRvYSgxIC0geCksICIiKTsKKyAgICAgICAgICAgIHJldHVybigoaW50KSBzc3RhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHRhYltwcm90b2NvbF0uZm5jbiA9IHg7ICAgIC8qIFNldCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIGZuY252ID0geDsgICAgICAgICAgICAgICAgICAvKiBTZXQgdmFyaWFibGUgKi8KKyAgICAgICAgICAgIGZfc2F2ZSA9IHg7ICAgICAgICAgICAgICAgICAvKiBBbmQgc2V0ICJwZXJtYW5lbnQiIHZhcmlhYmxlICovCisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICB9CisKKyAgICAgIGNhc2UgWFlGSUxSOiAgICAgICAgICAgICAgICAgICAgICAvKiBSZWNvcmQgbGVuZ3RoICovCisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJmaWxlIHJlY29yZCBsZW5ndGgiLAorICAgICAgICAgICAgICAgICAgICAgICBja2l0b2EoRExSRUNMKSwxMCwmeix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICBpZiAocm1zZmxnKSB7CisgICAgICAgICAgICBzc3RhdGUgPSBzZXRnZW4oJ1MnLCAiMzEyIiwgY2tpdG9hKHopLCAiIik7CisgICAgICAgICAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyZWNsID0gejsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgIH0KKworI2lmZGVmIENPTU1FTlQKKyAgICAgIGNhc2UgWFlGSUxPOiAgICAgICAgICAgICAgICAgICAgICAvKiBPcmdhbml6YXRpb24gKi8KKyAgICAgICAgaWYgKCh4ID0gY21rZXkoZm9yZ3RhYixuZm9yZywiZmlsZSBvcmdhbml6YXRpb24iLCJzZXF1ZW50aWFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdTJywgIjMxNCIsIGNraXRvYSh4KSwgIiIpOworICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3JnID0geDsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBDT01NRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgbmVlZGVkICovCisgICAgICBjYXNlIFhZRklMRjogICAgICAgICAgICAgICAgICAgICAgLyogRm9ybWF0ICovCisgICAgICAgIGlmICgoeCA9IGNta2V5KGZyZWN0YWIsbmZyZWMsImZpbGUgcmVjb3JkIGZvcm1hdCIsInN0cmVhbSIsCisgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGlmIChybXNmbGcpIHsKKyAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsICIzMTMiLCBja2l0b2EoeCksICIiKTsKKyAgICAgICAgICAgIHJldHVybigoaW50KSBzc3RhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJlY2ZtID0geDsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBDT01NRU5UCisgICAgICBjYXNlIFhZRklMUDogICAgICAgICAgICAgICAgICAgICAgLyogUHJpbnRlciBjYXJyaWFnZSBjb250cm9sICovCisgICAgICAgIGlmICgoeCA9IGNta2V5KGZjY3RhYixuZmNjLCJmaWxlIGNhcnJpYWdlIGNvbnRyb2wiLCJuZXdsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdTJywgIjMxNSIsIGNraXRvYSh4KSwgIiIpOworICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmY2N0cmwgPSB4OworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworICAgICAgY2FzZSBYWUZJTFQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgKi8KKyAgICAgICAgaWYgKCh4ID0gY21rZXkocm1zZmxnID8gcmZ0dGFiICA6IGZ0dGFiLAorICAgICAgICAgICAgICAgICAgICAgICBybXNmbGcgPyBucmZ0dHlwIDogbmZ0dHlwLAorICAgICAgICAgICAgICAgICAgICAgICAidHlwZSBvZiBmaWxlIHRyYW5zZmVyIiwidGV4dCIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworCisjaWZkZWYgVk1TCisgICAgICAgIC8qIEFsbG93IFZNUyB1c2VycyB0byBjaG9vc2UgcmVjb3JkIGZvcm1hdCBmb3IgYmluYXJ5IGZpbGVzICovCisgICAgICAgIGlmICgoeCA9PSBYWUZUX0IpICYmIChybXNmbGcgPT0gMCkpIHsKKyAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KGZidGFiLG5mYnR5cCwiVk1TIHJlY29yZCBmb3JtYXQiLCJmaXhlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICB9CisjZW5kaWYgLyogVk1TICovCisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBiaW5hcnkgPSB4OworICAgICAgICBiX3NhdmUgPSB4OworI2lmZGVmIE1BQworICAgICAgICAodm9pZCkgbWFjX3NldGZpbGRmbGcoYmluYXJ5KTsKKyNlbmRpZiAvKiBNQUMgKi8KKyNpZm5kZWYgTk9YRkVSCisgICAgICAgIGlmIChybXNmbGcpIHsKKyAgICAgICAgICAgIC8qIEFsbG93IGZvciBMQUJFTEVEIGluIFZNUyAmIE9TLzIgKi8KKyAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsICIzMDAiLCBja2l0b2EoeCksICIiKTsKKyAgICAgICAgICAgIHJldHVybigoaW50KSBzc3RhdGUpOworICAgICAgICB9IGVsc2UgeworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyNpZm5kZWYgTk9YRkVSCisgICAgICAgIH0KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgWFlGSUxYOiAgICAgICAgICAgICAgICAgICAgICAvKiBDb2xsaXNpb24gQWN0aW9uICovCisgICAgICAgIGlmICgoeCA9IGNta2V5KGNvbHh0YWIsbmNvbHgsIkZpbGVuYW1lIGNvbGxpc2lvbiBhY3Rpb24iLCJiYWNrdXAiLAorICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworI2lmZGVmIENLX0xPR0lOCisgICAgICAgIGlmIChpc2d1ZXN0KSB7CisgICAgICAgICAgICAvKiBEb24ndCBsZXQgZ3Vlc3RzIGNoYW5nZSBleGlzdGluZyBmaWxlcyAqLworICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBjb21tYW5kIG5vdCB2YWxpZCBmb3IgZ3Vlc3RzXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgLyogTm90IGFwcHJvcHJpYXRlIC0gRElTQUJMRSBERUxFVEUgb25seSByZWZlcnMgdG8gc2VydmVyICovCisgICAgICAgIGlmICgoeCA9PSBYWUZYX1ggfHwgeCA9PSBYWUZYX0IgfHwgeCA9PSBYWUZYX1UgfHwgeCA9PSBYWUZYX0EpICYmCisgICAgICAgICAgICAoIUVOQUJMRUQoZW5fZGVsKSkpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCBmaWxlIGRlbGV0aW9uIGlzIGRpc2FibGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBmbmNhY3QgPSB4OworICAgICAgICBwdGFiW3Byb3RvY29sXS5mbmNhID0geDsKKyAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdTJywgIjMwMiIsIGNraXRvYShmbmNhY3QpLCAiIik7CisgICAgICAgICAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChmbmNhY3QgPT0gWFlGWF9SKSBja3dhcm4gPSAxOyAvKiBGSUxFIFdBUk5JTkcgaW1wbGljYXRpb25zICovCisgICAgICAgICAgICBpZiAoZm5jYWN0ID09IFhZRlhfWCkgY2t3YXJuID0gMDsgLyogLi4uICovCisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICB9CisKKyAgICAgIGNhc2UgWFlGSUxXOiAgICAgICAgICAgICAgICAgICAgICAvKiBXYXJuaW5nL1dyaXRlLVByb3RlY3QgKi8KKyAgICAgICAgaWYgKCh4ID0gc2V0b24oJmNrd2FybikpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICBpZiAoY2t3YXJuKQorICAgICAgICAgIGZuY2FjdCA9IFhZRlhfUjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZuY2FjdCA9IFhZRlhfWDsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworI2lmZGVmIENLX0xBQkVMRUQKKyAgICAgIGNhc2UgWFlGSUxMOiAgICAgICAgICAgICAgICAgICAgICAvKiBMQUJFTEVEIEZJTEUgcGFyYW1ldGVycyAqLworICAgICAgICBpZiAoKHggPSBjbWtleShsYmx0YWIsbmxibHAsIkxhYmVsZWQgZmlsZSBmZWF0dXJlIiwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKHN1Y2Nlc3MgPSBzZXRvbigmeSkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisgICAgICAgIGlmICh5KSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IG9yIHJlc2V0IHRoZSBzZWxlY3RlZCBiaXQgKi8KKyAgICAgICAgICBsZl9vcHRzIHw9IHg7ICAgICAgICAgICAgICAgICAvKiBpbiB0aGUgb3B0aW9ucyBiaXRtYXNrLiAqLworICAgICAgICBlbHNlCisgICAgICAgICAgbGZfb3B0cyAmPSB+eDsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MpOworI2VuZGlmIC8qIENLX0xBQkVMRUQgKi8KKworICAgICAgY2FzZSBYWUZJTEk6IHsgICAgICAgICAgICAgICAgICAgIC8qIElOQ09NUExFVEUgKi8KKyAgICAgICAgICBleHRlcm4gc3RydWN0IGtleXRhYiBpZmRhdGFiW107CisgICAgICAgICAgZXh0ZXJuIGludCBrZWVwOworICAgICAgICAgIGlmICgoeSA9IGNta2V5KGlmZGF0YWIsMywiIiwiYXV0byIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgICBpZiAocm1zZmxnKSB7CisgICAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzEwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPT0gMCA/ICIwIiA6ICh5ID09IDEgPyAiMSIgOiAiMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgIHJldHVybigoaW50KSBzc3RhdGUpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGtlZXAgPSB5OworICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgIH0KKyAgICAgIH0KKworI2lmZGVmIENLX1RNUERJUgorICAgICAgY2FzZSBYWUZJTEc6IHsgICAgICAgICAgICAgICAgICAgIC8qIERvd25sb2FkIGRpcmVjdG9yeSAqLworICAgICAgICAgIGludCB4OworICAgICAgICAgIGNoYXIgKnM7CisjaWZkZWYgWkZOUUZQCisgICAgICAgICAgc3RydWN0IHpmbmZwICogZm5wOworI2VuZGlmIC8qIFpGTlFGUCAqLworI2lmZGVmIE1BQworICAgICAgICAgIGNoYXIgdGVtcFszNF07CisjZW5kaWYgLyogTUFDICovCisKKyNpZmRlZiBHRU1ET1MKKyAgICAgICAgICBpZiAoKHggPSBjbWRpcigiTmFtZSBvZiBsb2NhbCBkaXJlY3RvcnksIG9yIGNhcnJpYWdlIHJldHVybiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiIsJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIDwgMCApIHsKKyAgICAgICAgICAgICAgaWYgKHggIT0gLTMpCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIH0KKyNlbHNlCisjaWZkZWYgT1MyCisgICAgICAgICAgaWYgKCh4ID0gY21kaXIoIk5hbWUgb2YgUEMgZGlzayBhbmQvb3IgZGlyZWN0b3J5LFxuXAorICAgICAgIG9yIHByZXNzIHRoZSBFbnRlciBrZXkgdG8gdXNlIGN1cnJlbnQgZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIiwmcyx4eHN0cmluZykpIDwgMCApIHsKKyAgICAgICAgICAgICAgaWYgKHggIT0gLTMpCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIH0KKyNlbHNlCisjaWZkZWYgTUFDCisgICAgICAgICAgeCA9IGNrc3RybmNweSh0ZW1wLHpob21lKCksMzIpOworICAgICAgICAgIGlmICh4ID4gMCkgaWYgKHRlbXBbeC0xXSAhPSAnOicpIHsgdGVtcFt4XSA9ICc6JzsgdGVtcFt4KzFdID0gTlVMOyB9CisgICAgICAgICAgaWYgKCh4ID0gY210eHQoIk5hbWUgb2YgTWFjaW50b3NoIHZvbHVtZSBhbmQvb3IgZm9sZGVyLFxuXAorIG9yIHByZXNzIHRoZSBSZXR1cm4ga2V5IGZvciB0aGUgZGVza3RvcCBvbiB0aGUgYm9vdCBkaXNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCZzLCB4eHN0cmluZykpIDwgMCApCisgICAgICAgICAgICByZXR1cm4oeCk7CisjZWxzZQorICAgICAgICAgIGlmICgoeCA9IGNtZGlyKCJOYW1lIG9mIGxvY2FsIGRpcmVjdG9yeSwgb3IgY2FycmlhZ2UgcmV0dXJuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgJnMsIHh4c3RyaW5nKSkgPCAwICkgeworICAgICAgICAgICAgICBpZiAoeCAhPSAtMykKKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIEdFTURPUyAqLworICAgICAgICAgIGRlYnVnKEYxMTAsImRvd25sb2FkIGRpciIscywwKTsKKworI2lmbmRlZiBNQUMKKyAgICAgICAgICBpZiAoeCA9PSAyKSB7CisgICAgICAgICAgICAgIHByaW50ZigiP1dpbGRjYXJkcyBub3QgYWxsb3dlZCBpbiBkaXJlY3RvcnkgbmFtZVxuIik7CisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIE1BQyAqLworCisjaWZkZWYgWkZOUUZQCisgICAgICAgICAgaWYgKChmbnAgPSB6Zm5xZnAocyxUTVBCVUZTSVogLSAxLHRtcGJ1ZikpKSB7CisgICAgICAgICAgICAgIGlmIChmbnAtPmZwYXRoKQorICAgICAgICAgICAgICAgIGlmICgoaW50KSBzdHJsZW4oZm5wLT5mcGF0aCkgPiAwKQorICAgICAgICAgICAgICAgICAgcyA9IGZucC0+ZnBhdGg7CisgICAgICAgICAgfQorICAgICAgICAgIGRlYnVnKEYxMTAsImRvd25sb2FkIHpmbnFmcCIscywwKTsKKyNlbmRpZiAvKiBaRk5RRlAgKi8KKworICAgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsgIC8qIE1ha2UgYSBzYWZlIGNvcHkgKi8KKyNpZm5kZWYgTUFDCisgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSAgICAgICAgLyogR2V0IGNvbmZpcm1hdGlvbiAqLworICAgICAgICAgICAgcmV0dXJuKHgpOworI2VuZGlmIC8qIE1BQyAqLworCisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgICAgaWYgKGlzZ3Vlc3QpIHsKKyAgICAgICAgICAgIC8qIERvbid0IGxldCBndWVzdHMgY2hhbmdlIGV4aXN0aW5nIGZpbGVzICovCisgICAgICAgICAgICBwcmludGYoIj9UaGlzIGNvbW1hbmQgbm90IHZhbGlkIGZvciBndWVzdHNcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX0xPR0lOICovCisgICAgICAgICAgeCA9IHN0cmxlbihzKTsKKworICAgICAgICAgIGlmICh4KSB7CisjaWZkZWYgZGF0YWdlbmVyYWwJCQkvKiBBT1MvVlMgKi8KKyAgICAgICAgICAgICAgaWYgKHNbeC0xXSA9PSAnOicpICAgICAgICAvKiBob21kaXIgZW5kcyBpbiBjb2xvbiwgKi8KKyAgICAgICAgICAgICAgICBzW3gtMV0gPSBOVUw7ICAgICAgICAgICAvKiBhbmQgImRpciIgZG9lc24ndCBsaWtlIHRoYXQuLi4gKi8KKyNlbHNlCisjaWZkZWYgT1MyT1JVTklYCQkJLyogVW5peCBvciBLLTk1Li4uICovCisJICAgICAgaWYgKCh4IDwgKExJTkJVRlNJWiAtIDIpKSAmJiAvKiBBZGQgdHJhaWxpbmcgZGlyc2VwICovCisJCSAgKHNbeC0xXSAhPSAnLycpKSB7CS8qIGlmIG5vbmUgcHJlc2VudC4gICovCisJCSAgc1t4XSA9ICcvJzsJCS8qIE5vdGUgdGhhdCBXaW5kb3dzIHBhdGggaGFzICovCisJCSAgc1t4KzFdID0gTlVMOwkJLyogYmVlbiBjYW5vbmljYWxpemVkIHRvIGZvcndhcmQgKi8KKwkgICAgICB9ICAgICAgICAgICAgICAgIAkJLyogc2xhc2hlcyBhdCB0aGlzIHBvaW50LiAqLworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisgICAgICAgICAgICAgIG1ha2VzdHIoJmRsZGlyLHMpOworICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbWFrZXN0cigmZGxkaXIsTlVMTCk7ICAgICAgIC8qIGRsZGlyIGlzIE5VTEwgd2hlbiBub3QgYXNzaWduZWQgKi8KKworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICB9CisjZW5kaWYgLyogQ0tfVE1QRElSICovCisgICAgICBjYXNlIFhZRklMWToKKyAgICAgICAgcmV0dXJuKHNldGRlc3QoKSk7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBDS19DVFJMWgorICAgICAgY2FzZSBYWUZJTFY6IHsgICAgICAgICAgICAgICAgICAgIC8qIEVPRiAqLworICAgICAgICAgIGV4dGVybiBpbnQgZW9mbWV0aG9kOworICAgICAgICAgIGlmICgoeCA9IGNta2V5KGVvZnRhYiwzLCJlbmQtb2YtZmlsZSBkZXRlY3Rpb24gbWV0aG9kIiwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgZW9mbWV0aG9kID0geDsKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorI2VuZGlmIC8qIENLX0NUUkxaICovCisKKyNpZm5kZWYgTk9YRkVSCisjaWZkZWYgVU5JWAorICAgICAgY2FzZSBYWUZJTEg6IHsgICAgICAgICAgICAgICAgICAgIC8qIE9VVFBVVCAqLworICAgICAgICAgIGV4dGVybiBpbnQgem9mYnVmZmVyLCB6b2J1ZnNpemUsIHpvZmJsb2NrOworI2lmZGVmIERZTkFNSUMKKyAgICAgICAgICBleHRlcm4gY2hhciAqIHpvdXRidWZmZXI7CisjZW5kaWYgLyogRFlOQU1JQyAqLworCisgICAgICAgICAgaWYgKCh4ID0gY21rZXkoem9mdGFiLG56b2Z0YWIsIm91dHB1dCBmaWxlIHdyaXRpbmcgbWV0aG9kIiwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICBpZiAoeCA9PSBaT0ZfQlVGIHx8IHggPT0gWk9GX05CVUYpIHsKKyAgICAgICAgICAgICAgaWYgKCh5ID0gY21udW0oIm91dHB1dCBidWZmZXIgc2l6ZSIsIjMyNzY4IiwxMCwmeix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgIGlmICh6IDwgMSkgeworICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/QmFkIHNpemUgLSAlZFxuIiwgeik7CisgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgIHN3aXRjaCAoeCkgeworICAgICAgICAgICAgY2FzZSBaT0ZfQlVGOgorICAgICAgICAgICAgY2FzZSBaT0ZfTkJVRjoKKyAgICAgICAgICAgICAgem9mYnVmZmVyID0gKHggPT0gWk9GX0JVRik7CisgICAgICAgICAgICAgIHpvYnVmc2l6ZSA9IHo7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBaT0ZfQkxLOgorICAgICAgICAgICAgY2FzZSBaT0ZfTkJMSzoKKyAgICAgICAgICAgICAgem9mYmxvY2sgPSAoeCA9PSBaT0ZfQkxLKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorI2lmZGVmIERZTkFNSUMKKyAgICAgICAgICBpZiAoem91dGJ1ZmZlcikgZnJlZSh6b3V0YnVmZmVyKTsKKyAgICAgICAgICBpZiAoISh6b3V0YnVmZmVyID0gKGNoYXIgKiltYWxsb2MoeikpKSB7CisgICAgICAgICAgICAgIHByaW50ZigiTUVNT1JZIEFMTE9DQVRJT04gRVJST1IgLSBGQVRBTFxuIik7CisgICAgICAgICAgICAgIGRvZXhpdChCQURfRVhJVCwtMSk7CisgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB6b2J1ZnNpemUgPSB6OworI2Vsc2UKKyAgICAgICAgICBpZiAoeiA8PSBPQlVGU0laRSkgeworICAgICAgICAgICAgICB6b2J1ZnNpemUgPSB6OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCAlZCBpcyB0b28gYmlnIC0gJWQgaXMgdGhlIG1heGltdW1cbiIseixPQlVGU0laRSk7CisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIERZTkFNSUMgKi8KKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorI2VuZGlmIC8qIFVOSVggKi8KKworI2lmZGVmIFBBVFRFUk5TCisgICAgICBjYXNlIFhZRklCUDogICAgICAgICAgICAgICAgICAgICAgLyogQklOQVJZLVBBVFRFUk4gKi8KKyAgICAgIGNhc2UgWFlGSVRQOiB7ICAgICAgICAgICAgICAgICAgICAvKiBURVhULVBBVFRFUk4gKi8KKyAgICAgICAgICBjaGFyICogdG1wW0ZUUEFUVEVSTlNdOworICAgICAgICAgIGludCBpLCBuID0gMDsKKyAgICAgICAgICB3aGlsZSAobiA8IEZUUEFUVEVSTlMpIHsKKyAgICAgICAgICAgICAgdG1wW25dID0gTlVMTDsKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY21mbGQoIlBhdHRlcm4iLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgICAgICAgICAgIHMgPSBicnN0cmlwKGxpbmUpOworICAgICAgICAgICAgICBtYWtlc3RyKCYodG1wW24rK10pLHMpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoeCA9PSAtMykgeCA9IGNtY2ZtKCk7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBuOyBpKyspIHsKKyAgICAgICAgICAgICAgaWYgKHggPiAtMSkgeworICAgICAgICAgICAgICAgICAgaWYgKHkgPT0gWFlGSUJQKQorICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCYoYmlucGF0dGVybnNbaV0pLHRtcFtpXSk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJih0eHRwYXR0ZXJuc1tpXSksdG1wW2ldKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBmcmVlKHRtcFtpXSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh5ID09IFhZRklCUCkgICAgICAgICAgICAgIC8qIE51bGwtdGVybWluYXRlIHRoZSBsaXN0ICovCisgICAgICAgICAgICBtYWtlc3RyKCYoYmlucGF0dGVybnNbaV0pLE5VTEwpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1ha2VzdHIoJih0eHRwYXR0ZXJuc1tpXSksTlVMTCk7CisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgfQorCisgICAgICBjYXNlIFhZRklQQTogICAgICAgICAgICAgICAgICAgICAgLyogUEFUVEVSTlMgKi8KKyAgICAgICAgaWYgKCh4ID0gc2V0b25hdXQoJnBhdHRlcm5zKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgVU5JQ09ERQorICAgICAgY2FzZSBYWUZJTFU6IHsgICAgICAgICAgICAgICAgICAgIC8qIFVDUyAqLworICAgICAgICAgIGV4dGVybiBpbnQgdWNzb3JkZXIsIHVjc2JvbSwgYnl0ZW9yZGVyOworICAgICAgICAgIGlmICgoeCA9IGNta2V5KHVjc3RhYixudWNzdGFiLCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIHN3aXRjaCAoeCkgeworICAgICAgICAgICAgY2FzZSBVQ1NfQllUOgorICAgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShib3RhYixuYm90YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCeXRlIG9yZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZW9yZGVyID8gImxpdHRsZS1lbmRpYW4iIDogImJpZy1lbmRpYW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICB1Y3NvcmRlciA9IHk7CisgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICBjYXNlIFVDU19CT006CisgICAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgIHVjc2JvbSA9IHk7CisgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZiAvKiBVTklDT0RFICovCisKKyNpZm5kZWYgZGF0YWdlbmVyYWwKKyAgICAgIGNhc2UgWFlGX0lOU1A6IHsgICAgICAgICAgICAgICAgICAvKiBTQ0FOIChJTlNQRUNUSU9OKSAqLworICAgICAgICAgIGV4dGVybiBpbnQgZmlsZXBlZWssIG5zY2FuZmlsZTsKKyAgICAgICAgICBpZiAoKHggPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgaWYgKHkpIHsKKyAgICAgICAgICAgICAgaWYgKCh5ID0gY21udW0oIkhvdyBtdWNoIHRvIHNjYW4iLGNraXRvYShTQ0FORklMRUJVRiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCZ6LHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHkpOworI2lmZGVmIFZNUworICAgICAgICAgIGZpbGVwZWVrID0gMDsKKyAgICAgICAgICBuc2NhbmZpbGUgPSAwOworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisjZWxzZQorICAgICAgICAgIGZpbGVwZWVrID0geDsKKyAgICAgICAgICBuc2NhbmZpbGUgPSB6OworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZW5kaWYgLyogVk1TICovCisgICAgICB9CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKworICAgICAgY2FzZSBYWUZfREZMVDoKKyAgICAgICAgeSA9IDA7CisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgICAgaWYgKCh5ID0gY21rZXkoZmRmbHRhYixuZmRmbHQsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoeSA9PSA3IHx8IHkgPT0gOCkgeworICAgICAgICAgICAgaWYgKHkgPT0gNykKKyAgICAgICAgICAgICAgcyA9IGZjc2luZm9bZGNzZXQ3XS5rZXl3b3JkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBzID0gZmNzaW5mb1tkY3NldDhdLmtleXdvcmQ7CisgICAgICAgICAgICBpZiAoKHggPSBjbWtleShmY3N0YWIsbmZpbGMsImNoYXJhY3Rlci1zZXQiLHMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgfQorICAgICAgICBja3N0cm5jcHkobGluZSxmY3NpbmZvW3hdLmtleXdvcmQsTElOQlVGU0laKTsKKyAgICAgICAgcyA9IGxpbmU7CisjZW5kaWYgLyogTk9DU0VUUyAqLworICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICBzd2l0Y2ggKHkpIHsKKyNpZm5kZWYgTk9DU0VUUworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGlmIChmY3NpbmZvW3hdLnNpemUgIT0gMTI4KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAtIE5vdCBhIDctYml0IHNldFxuIixzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGNzZXQ3ID0geDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGlmIChmY3NpbmZvW3hdLnNpemUgIT0gMjU2KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAtIE5vdCBhbiA4LWJpdCBzZXRcbiIscyk7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRjc2V0OCA9IHg7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworI2lmbmRlZiBOT1hGRVIKKyAgICAgIGNhc2UgOTk5NzogICAgICAgICAgICAgICAgICAgICAgICAvKiBGQVNUTE9PS1VQUyAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHNldG9uKCZzdGF0aGFjaykpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgVU5JWAorI2lmZGVmIERZTkFNSUMKKyAgICAgIGNhc2UgWFlGX0xTSVo6IHsgICAgICAgICAgICAgICAgICAvKiBMSVNUU0laRSAqLworICAgICAgICAgIGludCB6ejsKKyAgICAgICAgICB5ID0gY21udW0oIk1heGltdW0gbnVtYmVyIG9mIGZpbGVuYW1lcyIsIiIsMTAsJngseHhzdHJpbmcpOworICAgICAgICAgIGlmICgoeCA9IHNldG51bSgmenoseCx5LC0xKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIGlmICh6c2V0ZmlsKHp6LDMpIDwgMCkgeworICAgICAgICAgICAgICBwcmludGYoIj9NZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgWFlGX1NTUEE6IHsgICAgICAgICAgICAgICAgICAvKiBTVFJJTkdTUEFDRSAqLworICAgICAgICAgIGludCB6ejsKKyAgICAgICAgICB5ID0gY21udW0oIk51bWJlciBvZiBjaGFyYWN0ZXJzIGZvciBmaWxlbmFtZSBsaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgIiIsMTAsJngseHhzdHJpbmcpOworICAgICAgICAgIGlmICgoeCA9IHNldG51bSgmenoseCx5LC0xKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIGlmICh6c2V0ZmlsKHp6LDEpIDwgMCkgeworICAgICAgICAgICAgICBwcmludGYoIj9NZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIH0KKworI2VuZGlmIC8qIERZTkFNSUMgKi8KKyNlbmRpZiAvKiBVTklYICovCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ZigiP3VuZXhwZWN0ZWQgZmlsZSBwYXJhbWV0ZXJcbiIpOworICAgICAgICByZXR1cm4oLTIpOworICAgIH0KK30KKworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisvKiBNUy1ET1MgS0VSTUlUIGNvbXBhdGliaWxpdHkgbW9kZXMgKi8KK2ludAorc2V0bXNrKCkgeworICAgIGlmICgoeSA9IGNta2V5KG1za3RhYixubXNrLCJNUy1ET1MgS2VybWl0IGNvbXBhdGliaWxpdHkgbW9kZSIsCisgICAgICAgICAgICAgICAgICAgICJrZXljb2RlcyIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKworICAgIHN3aXRjaCAoIHkgKSB7CisjaWZkZWYgQ09NTUVOVAorICAgICAgY2FzZSBNU0tfQ09MT1I6CisgICAgICAgIHJldHVybihzZXRvbigmbXNrY29sb3JzKSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgY2FzZSBNU0tfS0VZUzoKKyAgICAgICAgcmV0dXJuKHNldG9uKCZtc2trZXlzKSk7CisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvdWxkbid0IGdldCBoZXJlLiAqLworICAgICAgICByZXR1cm4oLTIpOworICAgIH0KK30KKyNlbmRpZiAvKiBPUzIgKi8KKworaW50CitzZXR0cm10eXAoKSB7CisjaWZkZWYgT1MyCisjaWZkZWYgVE5DT0RFCisgICAgZXh0ZXJuIGludCB0dG51bTsgICAgICAgICAgICAgICAgICAgIC8qIExhc3QgVGVsbmV0IFRlcm1pbmFsIFR5cGUgc2VudCAqLworICAgIGV4dGVybiBpbnQgdHRudW1lbmQ7ICAgICAgICAgICAgICAgICAvKiBIYXMgZW5kIG9mIGxpc3QgYmVlbiBmb3VuZCAqLworI2VuZGlmIC8qIFROQ09ERSAqLworICAgIGlmICgoeCA9IGNta2V5KHR0eXB0YWIsbnR0eXAsIiIsInZ0MzIwIix4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih4KTsKKyAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICByZXR1cm4oeSk7CisgICAgc2V0dGVybXR5cGUoeCwxKTsKKyNpZmRlZiBUTkNPREUKKyAgICAvKiBTbyB3ZSBzZW5kIHRoZSBjb3JyZWN0IHRlcm1pbmFsIG5hbWUgdG8gdGhlIGhvc3QgaWYgaXQgYXNrcyBmb3IgaXQgKi8KKyAgICB0dG51bSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMYXN0IFRlbG5ldCBUZXJtaW5hbCBUeXBlIHNlbnQgKi8KKyAgICB0dG51bWVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgbGlzdCBub3QgZm91bmQgKi8KKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworI2Vsc2UgIC8qIE5vdCBPUzIgKi8KKyAgICBwcmludGYoCisiXG4gU29ycnksIHRoaXMgdmVyc2lvbiBvZiBDLUtlcm1pdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBTRVQgVEVSTUlOQUwgVFlQRVxuIik7CisgICAgcHJpbnRmKAorIiBjb21tYW5kLiAgVHlwZSBcImhlbHAgc2V0IHRlcm1pbmFsXCIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uXG4iKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICByZXR1cm4oc3VjY2VzcyA9IDApOworfQorCisjaWZkZWYgQ0tUSURMRQorc3RhdGljIGNoYXIgaWFjdGJ1ZlsxMzJdOworCitjaGFyICoKK2dldGlhY3QoKSB7CisgICAgc3dpdGNoICh0dF9pZGxlYWN0KSB7CisgICAgICBjYXNlIElETEVfUkVUOiAgcmV0dXJuKCJyZXR1cm4iKTsKKyAgICAgIGNhc2UgSURMRV9FWElUOiByZXR1cm4oImV4aXQiKTsKKyAgICAgIGNhc2UgSURMRV9IQU5HOiByZXR1cm4oImhhbmd1cCIpOworI2lmZGVmIFROQ09ERQorICAgICAgY2FzZSBJRExFX1ROT1A6IHJldHVybigiVGVsbmV0IE5PUCIpOworICAgICAgY2FzZSBJRExFX1RBWVQ6IHJldHVybigiVGVsbmV0IEFZVCIpOworI2VuZGlmIC8qIFROQ09ERSAqLworCisgICAgICBjYXNlIElETEVfT1VUOiB7CisgICAgICAgICAgaW50IGMsIGssIG47CisgICAgICAgICAgY2hhciAqIHAsICogcSwgKiB0OworICAgICAgICAgIGsgPSBja3N0cm5jcHkoaWFjdGJ1Ziwib3V0cHV0ICIsMTMyKTsKKyAgICAgICAgICBuID0gazsKKyAgICAgICAgICBxID0gJmlhY3RidWZba107CisgICAgICAgICAgcCA9IHR0X2lkbGVzdHI7CisgICAgICAgICAgaWYgKCFwKSBwID0gIiI7CisgICAgICAgICAgaWYgKCEqcCkgcmV0dXJuKCJvdXRwdXQgKG5vdGhpbmcpIik7CisgICAgICAgICAgd2hpbGUgKChjID0gKnArKykgJiYgbiA8IDEzMSkgeworICAgICAgICAgICAgICBjICY9IDB4ZmY7CisgICAgICAgICAgICAgIGlmIChjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChuID4gMTMwKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICpxKysgPSAnXFwnOworICAgICAgICAgICAgICAgICAgKnErKyA9ICdcXCc7CisgICAgICAgICAgICAgICAgICAqcSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgIG4gKz0gMjsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYyA+IDMxICYmIGMgPCAxMjcpIHx8IGMgPiAxNTkpIHsKKyAgICAgICAgICAgICAgICAgICpxKysgPSBjOworICAgICAgICAgICAgICAgICAgKnEgPSBOVUw7CisgICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBpZiAobiA+ICgxMzEgLSA2KSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBzcHJpbnRmKHEsIlxceyVkfSIsYyk7CisgICAgICAgICAgICAgICAgICBrID0gc3RybGVuKHEpOworICAgICAgICAgICAgICAgICAgcSArPSBrOworICAgICAgICAgICAgICAgICAgbiArPSBrOworICAgICAgICAgICAgICAgICAgKnEgPSBOVUw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgKnEgPSBOVUw7CisjaWZkZWYgT1MyCisgICAgICAgICAgayA9IHR0X2NvbHNbVlRFUk1dOworI2Vsc2UKKyAgICAgICAgICBrID0gdHRfY29sczsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICBpZiAobiA+IGsgLSA1MikgeworICAgICAgICAgICAgICBuID0gayAtIDUyOworICAgICAgICAgICAgICBpYWN0YnVmW24tMl0gPSAnLic7CisgICAgICAgICAgICAgIGlhY3RidWZbbi0xXSA9ICcuJzsKKyAgICAgICAgICAgICAgaWFjdGJ1ZltuXSA9IE5VTDsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuKGlhY3RidWYpOworICAgICAgfQorICAgICAgZGVmYXVsdDogcmV0dXJuKCJ1bmtub3duIik7CisgICAgfQorfQorI2VuZGlmIC8qIENLVElETEUgKi8KKworI2lmbmRlZiBOT0NTRVRTCitWT0lECitzZXRsY2xjaGFyc2V0KHgpIGludCB4OyB7CisgICAgaW50IGk7CisgICAgdGNzbCA9IHk7ICAgICAgICAgICAgICAgICAgIC8qIExvY2FsIGNoYXJhY3RlciBzZXQgKi8KKyNpZmRlZiBPUzIKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIEdbaV0uaW5pdCA9IFRSVUU7CisgICAgICAgIHggPSBHW2ldLmRlc2lnbmF0aW9uOworICAgICAgICBHW2ldLmMxID0gKHggIT0gdGNzbCkgJiYgY3NfaXNfc3RkKHgpOworICAgICAgICB4ID0gR1tpXS5kZWZfZGVzaWduYXRpb247CisgICAgICAgIEdbaV0uZGVmX2MxID0gKHggIT0gdGNzbCkgJiYgY3NfaXNfc3RkKHgpOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KK30KKworVk9JRAorc2V0cmVtY2hhcnNldCh4LCB6KSBpbnQgeCwgejsgeworICAgIGludCBpOworCisjaWZkZWYgS1VJCisgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9URVJNX1JFTUNIQVJTRVQsIChsb25nKSB4LCAobG9uZykgeiApIDsKKyNlbmRpZiAvKiBLVUkgKi8KKyNpZmRlZiBVTklDT0RFCisgICAgaWYgKHggPT0gVFhfVFJBTlNQKQorI2Vsc2UgLyogVU5JQ09ERSAqLworICAgIGlmICh4ID09IEZDX1RSQU5TUCkKKyNlbmRpZiAvKiBVTklDT0RFICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRSQU5TUEFSRU5UPyAqLworI2lmbmRlZiBPUzIKKyAgICAgICAgdGNzciA9IHRjc2w7ICAgICAgICAgICAgLyogTWFrZSBib3RoIHNldHMgdGhlIHNhbWUgKi8KKyNlbHNlIC8qIE9TMiAqLworI2lmZGVmIENLT1VOSQorICAgICAgICB0dF91dGY4ID0gMDsgICAgICAgICAgICAvKiBUdXJuIG9mZiBVVEY4IGZsYWcgKi8KKyAgICAgICAgdGNzciA9IHRjc2wgPSBkZWNfa2JkID0gVFhfVFJBTlNQOyAvKiBObyB0cmFuc2xhdGlvbiAqLworICAgICAgICB0Y3NfdHJhbnNwID0gMTsKKworICAgICAgICBpZiAoIWNzX2lzX25yYyh0Y3NsKSkgeworICAgICAgICAgICAgR1swXS5kZWZfZGVzaWduYXRpb24gPSBHWzBdLmRlc2lnbmF0aW9uID0gVFhfQVNDSUk7CisgICAgICAgICAgICBHWzBdLmluaXQgPSBUUlVFOworICAgICAgICAgICAgR1swXS5kZWZfYzEgPSBHWzBdLmMxID0gRkFMU0U7CisgICAgICAgICAgICBHWzBdLnNpemUgPSBjczk0OworICAgICAgICAgICAgR1swXS5uYXRpb25hbCA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IGNzX2lzX25yYyh0Y3NsKSA/IDAgOiAxOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBHW2ldLmRlZl9kZXNpZ25hdGlvbiA9IEdbaV0uZGVzaWduYXRpb24gPSB0Y3NsOworICAgICAgICAgICAgR1tpXS5pbml0ID0gVFJVRTsKKyAgICAgICAgICAgIEdbaV0uZGVmX2MxID0gR1tpXS5jMSA9IEZBTFNFOworICAgICAgICAgICAgc3dpdGNoIChjc19zaXplKEdbaV0uZGVzaWduYXRpb24pKSB7IC8qIDk0LCA5Niwgb3IgMTI4ICovCisgICAgICAgICAgICBjYXNlIDEyODoKKyAgICAgICAgICAgIGNhc2UgOTY6CisgICAgICAgICAgICAgICAgR1tpXS5zaXplID0gR1tpXS5kZWZfc2l6ZSA9IGNzOTY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk0OgorICAgICAgICAgICAgICAgIEdbaV0uc2l6ZSA9IEdbaV0uZGVmX3NpemUgPSBjczk0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBHW2ldLnNpemUgPSBHW2ldLmRlZl9zaXplID0gY3NtYjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEdbaV0ubmF0aW9uYWwgPSBjc19pc19ucmMoeCk7CisgICAgICAgIH0KKyNlbHNlIC8qIENLT1VOSSAqLworICAgICAgICB0Y3NyID0gdGNzbDsgICAgICAgICAgICAvKiBNYWtlIGJvdGggc2V0cyB0aGUgc2FtZSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBHW2ldLmRlZl9kZXNpZ25hdGlvbiA9IEdbaV0uZGVzaWduYXRpb24gPSBGQ19UUkFOU1A7CisgICAgICAgICAgICBHW2ldLmluaXQgPSBGQUxTRTsKKyAgICAgICAgICAgIEdbaV0uc2l6ZSA9IEdbaV0uZGVmX3NpemUgPSBjczk2OworICAgICAgICAgICAgR1tpXS5jMSA9IEdbaV0uZGVmX2MxID0gRkFMU0U7CisgICAgICAgICAgICBHW2ldLnJ0b2kgPSBOVUxMOworICAgICAgICAgICAgR1tpXS5pdG9sID0gTlVMTDsKKyAgICAgICAgICAgIEdbaV0ubHRvaSA9IE5VTEw7CisgICAgICAgICAgICBHW2ldLml0b3IgPSBOVUxMOworICAgICAgICAgICAgR1tpXS5uYXRpb25hbCA9IEZBTFNFOworICAgICAgICB9CisjZW5kaWYgLyogQ0tPVU5JICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWZkZWYgT1MyCisjaWZkZWYgQ0tPVU5JCisgICAgZWxzZSBpZiAoeCA9PSBUWF9VVEY4KSB7CisgICAgICAgIHRjc190cmFuc3AgPSAwOworICAgICAgICB0dF91dGY4ID0gMTsgICAgICAgICAgICAvKiBUdXJuIGl0IG9uIGlmIHdlIGFyZSBVVEY4ICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogQ0tPVU5JICovCisgICAgZWxzZSB7CisgICAgICAgIHRjc190cmFuc3AgPSAwOworICAgICAgICB0Y3NyID0geDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbW90ZSBjaGFyYWN0ZXIgc2V0ICovCisjaWZkZWYgQ0tPVU5JCisgICAgICAgIHR0X3V0ZjggPSAwOyAgICAgICAgICAgICAgICAgICAgLyogVHVybiBvZmYgVVRGOCBmbGFnICovCisjZW5kaWYgLyogQ0tPVU5JICovCisKKyAgICAgICAgaWYgKHogPT0gVFRfR1JfQUxMKSB7CisgICAgICAgICAgICBpbnQgaTsKKyNpZmRlZiBVTklDT0RFCisgICAgICAgICAgICBkZWNfa2JkID0geDsKKyNlbmRpZiAvKiBVTklDT0RFICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgR1tpXS5pbml0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBpZiAoIGkgPT0gMCAmJiAhY3NfaXNfbnJjKHgpICkgeworICAgICAgICAgICAgICAgICAgICBHWzBdLmRlc2lnbmF0aW9uID0gR1swXS5kZWZfZGVzaWduYXRpb24gPSBGQ19VU0FTQ0lJOworICAgICAgICAgICAgICAgICAgICBHWzBdLnNpemUgPSBHWzBdLmRlZl9zaXplID0gY3M5NDsKKyAgICAgICAgICAgICAgICAgICAgR1swXS5uYXRpb25hbCA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgR1tpXS5kZWZfZGVzaWduYXRpb24gPSBHW2ldLmRlc2lnbmF0aW9uID0geDsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjc19zaXplKHgpKSB7ICAgICAgIC8qIDk0LCA5Niwgb3IgMTI4ICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDk2OgorICAgICAgICAgICAgICAgICAgICAgICAgR1tpXS5zaXplID0gR1tpXS5kZWZfc2l6ZSA9IGNzOTY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA5NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEdbaV0uc2l6ZSA9IEdbaV0uZGVmX3NpemUgPSBjczk0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBHW2ldLnNpemUgPSBHW2ldLmRlZl9zaXplID0gY3NtYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEdbaV0ubmF0aW9uYWwgPSBjc19pc19ucmMoeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEdbaV0uYzEgPSBHW2ldLmRlZl9jMSA9IHggIT0gdGNzbCAmJiBjc19pc19zdGQoeCk7CisgICAgICAgICAgICB9CisjaWZkZWYgVU5JQ09ERQorICAgICAgICB9IGVsc2UgaWYgKHogPT0gVFRfR1JfS0JEKSB7ICAgIC8qIEtleWJvYXJkIG9ubHkgKi8KKyAgICAgICAgICAgIGRlY19rYmQgPSB4OworI2VuZGlmIC8qIFVOSUNPREUgKi8KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTcGVjaWZpYyBHbiAqLworICAgICAgICAgICAgR1t6XS5kZWZfZGVzaWduYXRpb24gPSBHW3pdLmRlc2lnbmF0aW9uID0geDsKKyAgICAgICAgICAgIEdbel0uaW5pdCA9IFRSVUU7CisgICAgICAgICAgICBzd2l0Y2ggKGNzX3NpemUoeCkpIHsgICAgICAgLyogOTQsIDk2LCBvciAxMjggKi8KKyAgICAgICAgICAgIGNhc2UgMTI4OgorICAgICAgICAgICAgY2FzZSA5NjoKKyAgICAgICAgICAgICAgICBHW3pdLnNpemUgPSBHW3pdLmRlZl9zaXplID0gY3M5NjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTQ6CisgICAgICAgICAgICAgICAgR1t6XS5zaXplID0gR1t6XS5kZWZfc2l6ZSA9IGNzOTQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEdbel0uc2l6ZSA9IEdbel0uZGVmX3NpemUgPSBjc21iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgR1t6XS5jMSA9IEdbel0uZGVmX2MxID0geCAhPSB0Y3NsICYmIGNzX2lzX3N0ZCh4KTsKKyAgICAgICAgICAgIEdbel0ubmF0aW9uYWwgPSBjc19pc19ucmMoeCk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZSAvKiBub3QgT1MyICovCisgICAgdGNzciA9IHg7ICAgICAgICAgICAgICAgICAgIC8qIFJlbW90ZSBjaGFyYWN0ZXIgc2V0ICovCisjZW5kaWYgLyogT1MyICovCit9CisjZW5kaWYgLyogTk9DU0VUUyAqLworCitWT0lECitzZXRjbWFzayh4KSBpbnQgeDsgeworICAgIGlmICh4ID09IDcpIHsKKyAgICAgICAgY21hc2sgPSAwMTc3OworICAgIH0gZWxzZSBpZiAoeCA9PSA4KSB7CisgICAgICAgIGNtYXNrID0gMDM3NzsKKyAgICAgICAgcGFyaXR5ID0gMDsKKyAgICB9CisjaWZkZWYgS1VJICAgICAgCisgICAgS3VpU2V0UHJvcGVydHkoS1VJX1RFUk1fQ01BU0sseCwwKTsKKyNlbmRpZiAvKiBLVUkgKi8KK30KKworI2lmZGVmIENLX0FVVE9ETAorVk9JRAorc2V0YXV0b2RsKHgseSkgaW50IHgseTsgeworICAgIGF1dG9kbCA9IHg7CisgICAgYWRsX2FzayA9IHk7CisjaWZkZWYgS1VJICAgICAgCisgICAgS3VpU2V0UHJvcGVydHkoS1VJX1RFUk1fQVVUT0RPV05MT0FELHg/KHk/MjoxKTowLDApOworI2VuZGlmIC8qIEtVSSAqLworfQorI2VuZGlmIC8qIENLX0FVVE9ETCAqLworCisjaWZkZWYgT1MyCitWT0lECitzZXR1cmxobChpbnQgeCkgeworICAgIHR0X3VybF9oaWxpdGUgPSB4OworI2lmZGVmIEtVSSAgICAgIAorICAgIEt1aVNldFByb3BlcnR5KEtVSV9URVJNX1VSTF9ISUdITElHSFQseCwwKTsKKyNlbmRpZiAvKiBLVUkgKi8KK30KKworVk9JRAorc2V0YXByaW50KGludCB4KSB7CisgICAgZXh0ZXJuIGludCBhcHJpbnQ7CisgICAgYXByaW50ID0geDsKKyNpZmRlZiBLVUkKKyAgICBLdWlTZXRQcm9wZXJ0eShLVUlfVEVSTV9QUklOVEVSQ09QWSx4LDApOworI2VuZGlmIC8qIEtVSSAqLworfQorI2VuZGlmIC8qIE9TMiAqLworCitpbnQKK3NldHRybSgpIHsKKyAgICBpbnQgaSA9IDA7CisjaWZkZWYgT1MyCisgICAgZXh0ZXJuIGludCBjb2xvcnJlc2V0LCB1c2VyX2VyYXNlbW9kZTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpZiAoKHkgPSBjbWtleSh0cm10YWIsbnRybSwiIiwgIiIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyNpZmRlZiBNQUMKKyAgICBwcmludGYoIlxuP1NvcnJ5LCBub3QgaW1wbGVtZW50ZWQgeWV0LiAgUGxlYXNlIHVzZSB0aGUgU2V0dGluZ3MgbWVudS5cbiIpOworICAgIHJldHVybigtOSk7CisjZWxzZQorI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHByaW50ZigiP1NvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgc3dpdGNoICh5KSB7CisgICAgICBjYXNlIFhZVEJZVDogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFRFUk1JTkFMIEJZVEVTSVpFICovCisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJieXRlc2l6ZSBmb3IgdGVybWluYWwgY29ubmVjdGlvbiIsIjgiLDEwLCZ4LAorICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmICh4ICE9IDcgJiYgeCAhPSA4KSB7CisgICAgICAgICAgICBwcmludGYoIlxuP1RoZSBjaG9pY2VzIGFyZSA3IGFuZCA4XG4iKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHNldGNtYXNrKHgpOworI2lmZGVmIE9TMgorICAgICAgICBpZiAoSVM5NzgwMSh0dF90eXBlX21vZGUpKQorICAgICAgICAgIFNOSV9iaXRtb2RlKHgpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICBjYXNlIFhZVFNPOiAgICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFRFUk1JTkFMIExPQ0tJTkctU0hJRlQgKi8KKyAgICAgICAgcmV0dXJuKHNldG9uKCZzb3NpKSk7CisKKyAgICAgIGNhc2UgWFlUTkw6ICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTUlOQUwgTkVXTElORS1NT0RFICovCisgICAgICAgIHJldHVybihzZXRvbigmdG5sbSkpOworCisjaWZkZWYgT1MyCisgICAgICBjYXNlIFhZVENPTDoKKyAgICAgICAgaWYgKCh4ID0gY21rZXkodHR5Y29sdGFiLG5jb2xvcnMsIiIsInRlcm1pbmFsIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGVsc2UgaWYgKHggPT0gVFRDT0xSRVMpIHsKKyAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KHR0Y29sbW9kZXRhYixuY29sbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCJkZWZhdWx0LWNvbG9yIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgICAgICBjb2xvcnJlc2V0ID0geTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgIH0gZWxzZSBpZiAoeCA9PSBUVENPTEVSQSkgeworICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkodHRjb2xtb2RldGFiLG5jb2xtb2RlLCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImN1cnJlbnQtY29sb3IiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgICAgIHVzZXJfZXJhc2Vtb2RlID0geTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzPTEpOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHBhcnNlIGVycm9yICovCisgICAgICAgICAgICBpbnQgZmcgPSAwLCBiZyA9IDA7CisgICAgICAgICAgICBmZyA9IGNta2V5KHR0eWNscnRhYiwgbmNscnMsCisgICAgICAgICAgICAgICAgICAgICAgICh4ID09IFRUQ09MQk9SID8KKyAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciBmb3Igc2NyZWVuIGJvcmRlciIgOgorICAgICAgICAgICAgICAgICAgICAgICAgImZvcmVncm91bmQgY29sb3IgYW5kIHRoZW4gYmFja2dyb3VuZCBjb2xvciIpLAorICAgICAgICAgICAgICAgICAgICAgICAibGdyYXkiLCB4eHN0cmluZyk7CisgICAgICAgICAgICBpZiAoZmcgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oZmcpOworICAgICAgICAgICAgaWYgKHggIT0gVFRDT0xCT1IpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJnID0gY21rZXkodHR5Y2xydGFiLG5jbHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZCBjb2xvciIsImJsdWUiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKGJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgIGNhc2UgVFRDT0xOT1I6CisgICAgICAgICAgICAgICAgY29sb3Jub3JtYWwgPSBmZyB8IGJnIDw8IDQ7CisgICAgICAgICAgICAgICAgZmdpID0gZmcgJiAweDA4OworICAgICAgICAgICAgICAgIGJnaSA9IGJnICYgMHgwODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBUVENPTFJFVjoKKyAgICAgICAgICAgICAgICBjb2xvcnJldmVyc2UgPSBmZyB8IGJnIDw8IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVFRDT0xJVEE6CisgICAgICAgICAgICAgICAgY29sb3JpdGFsaWMgPSBmZyB8IGJnIDw8IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVFRDT0xVTkQ6CisgICAgICAgICAgICAgICAgY29sb3J1bmRlcmxpbmUgPSBmZyB8IGJnIDw8IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVFRDT0xHUlA6CisgICAgICAgICAgICAgICAgY29sb3JncmFwaGljID0gZmcgfCBiZyA8PCA0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFRUQ09MREVCOgorICAgICAgICAgICAgICAgIGNvbG9yZGVidWcgPSBmZyB8IGJnIDw8IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVFRDT0xTVEE6CisgICAgICAgICAgICAgICAgY29sb3JzdGF0dXMgPSBmZyB8IGJnIDw8IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVFRDT0xITFA6CisgICAgICAgICAgICAgICAgY29sb3JoZWxwID0gZmcgfCBiZyA8PCA0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFRUQ09MQk9SOgorICAgICAgICAgICAgICAgIGNvbG9yYm9yZGVyID0gZmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVFRDT0xTRUw6CisgICAgICAgICAgICAgICAgY29sb3JzZWxlY3QgPSBmZyB8IGJnIDw8IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAtIGludmFsaWRcbiIsY21kYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NybmluaXRpYWxpemVkW1ZURVJNXSA9IDA7CisgICAgICAgICAgICBWc2NybkluaXQoVlRFUk0pOworICAgICAgICB9CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgWFlUQ1VSOiB7ICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTUlOQUwgQ1VSU09SICovCisgICAgICAgICAgZXh0ZXJuIGludCBjdXJzb3JlbmFbXTsKKyAgICAgICAgICBleHRlcm4gaW50IGN1cnNvcm9uW10gOyAgICAgICAvKiBDdXJzb3Igc3RhdGUgb24vb2ZmICAgICAgICovCisgICAgICAgICAgaWYgKCh4ID0gY21rZXkodHR5Y3VydGFiLG5jdXJzb3JzLCIiLCJ1bmRlcmxpbmUiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIGlmICgoeiA9IGNta2V5KGN1cm9udGFiLG5jdXJvbiwiIiwib24iLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgIHR0X2N1cnNvciA9IHR0X2N1cnNvcl91c3IgPSB4OworICAgICAgICAgIGlmICggeiA9PSAyICkgeworICAgICAgICAgICAgICBjdXJzb3JlbmFbVlRFUk1dID0gdHRfY3Vyc29yZW5hX3VzciA9IDE7CisgICAgICAgICAgICAgIHR0X2N1cnNvcl9ibGluayA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY3Vyc29yZW5hW1ZURVJNXSA9IHR0X2N1cnNvcmVuYV91c3IgPSB6Oy8qIHR1cm4gY3Vyc29yIG9uL29mZiAqLworICAgICAgICAgICAgICB0dF9jdXJzb3JfYmxpbmsgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBjdXJzb3JvbltWVEVSTV0gPSBGQUxTRTsgLyogRm9yY2UgbmV3Y3Vyc29yIHRvIHJlc3RvcmUgdGhlIGN1cnNvciAqLworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICB9CisjZW5kaWYgLyogT1MyICovCisKKyAgICAgIGNhc2UgWFlUVFlQOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTUlOQUwgVFlQRSAqLworICAgICAgICByZXR1cm4oc2V0dHJtdHlwKCkpOworCisjaWZkZWYgT1MyCisgICAgICBjYXNlIFhZVEFSUjogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFRFUk1JTkFMIEFSUk9XLUtFWVMgKi8KKyAgICAgICAgaWYgKCh4ID0gY21rZXkoYWttdGFiLDIsIiIsIiIseHhzdHJpbmcpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHR0X2Fycm93ID0geDsgICAgICAgICAgICAgICAgICAgLyogVFRLX05PUk0gLyBUVEtfQVBQTDsgc2VlIGNrdXVzci5oICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgWFlUS1BEOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTUlOQUwgS0VZUEFELU1PREUgKi8KKyAgICAgICAgaWYgKCh4ID0gY21rZXkoa3BtdGFiLDIsIiIsIiIseHhzdHJpbmcpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHR0X2tleXBhZCA9IHg7ICAgICAgICAgICAgICAgICAgLyogVFRLX05PUk0gLyBUVEtfQVBQTDsgc2VlIGNrdXVzci5oICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgWFlUVU5YOiB7ICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTSBVTklYLU1PREUgKERHKSAqLworICAgICAgICBleHRlcm4gaW50IGRndW5peCxkZ3VuaXhfdXNyOworICAgICAgICB4ID0gc2V0b24oJmRndW5peCk7CisgICAgICAgIGRndW5peF91c3IgPSBkZ3VuaXg7CisgICAgICAgIHJldHVybih4KTsKKyAgICAgIH0KKyAgICAgIGNhc2UgWFlUS0JNT0Q6IHsgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTSBLRVlCT0FSRCBNT0RFICovCisgICAgICAgICAgZXh0ZXJuIGludCB0dF9rYl9tb2RlOworICAgICAgICAgIGlmICgoeCA9IGNta2V5KGtibW9kdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5rYm1vZHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibm9ybWFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3BlY2lhbCBrZXlib2FyZCBtb2RlIGZvciB0ZXJtaW5hbCBlbXVsYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nKQorICAgICAgICAgICAgICAgKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgICAgdHRfa2JfbW9kZSA9IHg7CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIH0KKworICAgICAgY2FzZSBYWVRXUlA6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBURVJNSU5BTCBXUkFQICovCisgICAgICAgIHJldHVybihzZXRvbigmdHRfd3JhcCkpOworCisgICAgICBjYXNlIFhZU0NSUzoKKyAgICAgICAgaWYgKCh5ID0gY21udW0oIkNPTk5FQ1Qgc2Nyb2xsYmFjayBidWZmZXIgc2l6ZSwgbGluZXMiLCIyMDAwIiwxMCwmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAvKiBUaGUgbWF4IG51bWJlciBvZiBsaW5lcyBpcyB0aGUgUkFNICAqLworICAgICAgICAvKiB3ZSBjYW4gYWN0dWFsbHkgZGVkaWNhdGUgdG8gYSAgICAgICAqLworICAgICAgICAvKiBzY3JvbGxiYWNrIGJ1ZmZlciBnaXZlbiB0aGUgbWF4aW11bSAqLworICAgICAgICAvKiBwcm9jZXNzIG1lbW9yeSBzcGFjZSBvZiA1MTJNQiAgICAgICAqLworICAgICAgICBpZiAoeCA8IDI1NiB8fCB4ID4gMjAwMDAwMEwpIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4/VGhlIHNpemUgbXVzdCBiZSBiZXR3ZWVuIDI1NiBhbmQgMiwwMDAsMDAwLlxuIik7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICB0dF9zY3JzaXplW1ZURVJNXSA9IHg7CisgICAgICAgIFZzY3JuSW5pdChWVEVSTSk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgTk9DU0VUUworICAgICAgY2FzZSBYWVRDUzogeyAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBURVJNSU5BTCBDSEFSQUNURVItU0VUICovCisgICAgICAgIGludCBlb2w7CisgICAgICAgICAgLyogc2V0IHRlcm1pbmFsIGNoYXJhY3Rlci1zZXQgPHJlbW90ZT4gPGxvY2FsPiAqLworICAgICAgICBpZiAoKHggPSBjbWtleSgKKyNpZmRlZiBDS09VTkkKKyAgICAgICAgICAgICAgICAgICAgICAgdHhydGFiLG50eHJ0YWIsCisjZWxzZSAgLyogQ0tPVU5JICovCisgICAgICAgICAgICAgICAgICAgICAgIHR0Y3N0YWIsbnRlcm1jLAorI2VuZGlmIC8qIENLT1VOSSAqLworICAgICAgICAgICAgICAgICAgICAgICAicmVtb3RlIHRlcm1pbmFsIGNoYXJhY3Rlci1zZXQiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKworI2lmZGVmIFVOSUNPREUKKyAgICAgICAgaWYgKHggPT0gVFhfVFJBTlNQCisjaWZkZWYgQ0tPVU5JCisgICAgICAgICAgICB8fCB4ID09IFRYX1VURjgKKyNlbmRpZiAvKiBDS09VTkkgKi8KKyAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgICAgLyogQ29uZmlybSB0aGUgY29tbWFuZCAqLworICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworI2lmZGVmIE9TMgorICAgICAgICAgICAgaWYgKCBpc3VuaWNvZGUoKSAmJiB4ID09IFRYX1RSQU5TUCApIHsKKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgaW4gdW5pY29kZSBkaXNwbGF5IG1vZGUgdGhlbiB0cmFuc3BhcmVudAorICAgICAgICAgICAgICAgICAqIG9ubHkgYWZmZWN0cyB0aGUgb3V0cHV0IGRpcmVjdGlvbi4gIFdlIG5lZWQgdG8ga25vdworICAgICAgICAgICAgICAgICAqIHRoZSBhY3R1YWwgcmVtb3RlIGNoYXJhY3RlciBzZXQgaW4gb3JkZXIgdG8gcGVyZm9ybQorICAgICAgICAgICAgICAgICAqIHRoZSB0Y3NyIC0+IHVjczIgdHJhbnNsYXRpb24gZm9yIGRpc3BsYXkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgeCA9IHkgPSB0Y3NsOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgeSA9IHg7CisgICAgICAgIH0KKyNlbHNlIC8qIFVOSUNPREUgKi8KKyAgICAgICAgaWYgKHggPT0gRkNfVFJBTlNQKSB7CisgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApICAgICAgLyogQ29uZmlybSB0aGUgY29tbWFuZCAqLworICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgIHkgPSB4OworICAgICAgICB9CisjZW5kaWYgLyogVU5JQ09ERSAqLworCisgICAgICAgIC8qIE5vdCB0cmFuc3BhcmVudCBvciBVVEY4LCBzbyBnZXQgbG9jYWwgc2V0IHRvIHRyYW5zbGF0ZSBpdCBpbnRvICovCisgICAgICAgIHMgPSAiIjsKKyNpZmRlZiBPUzIKKyAgICAgICAgeSA9IG9zMmdldGNwKCk7ICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IGlzIGN1cnJlbnQgY29kZSBwYWdlICovCisgICAgICAgIHN3aXRjaCAoeSkgeworICAgICAgICAgIGNhc2UgNDM3OiBzID0gImNwNDM3IjsgYnJlYWs7CisgICAgICAgICAgY2FzZSA4NTA6IHMgPSAiY3A4NTAiOyBicmVhazsKKyAgICAgICAgICBjYXNlIDg1MjogcyA9ICJjcDg1MiI7IGJyZWFrOworICAgICAgICAgIGNhc2UgODU3OiBzID0gImNwODU3IjsgYnJlYWs7CisgICAgICAgICAgY2FzZSA4NTg6IHMgPSAiY3A4NTgiOyBicmVhazsKKyAgICAgICAgICBjYXNlIDg2MjogcyA9ICJjcDg2MiI7IGJyZWFrOworICAgICAgICAgIGNhc2UgODY2OiBzID0gImNwODY2IjsgYnJlYWs7CisgICAgICAgICAgY2FzZSA4Njk6IHMgPSAiY3A4NjkiOyBicmVhazsKKyAgICAgICAgICBjYXNlIDEyNTA6IHMgPSAiY3AxMjUwIjsgYnJlYWs7CisgICAgICAgICAgY2FzZSAxMjUxOiBzID0gImNwMTI1MSI7IGJyZWFrOworICAgICAgICAgIGNhc2UgMTI1MjogcyA9ICJjcDEyNTIiOyBicmVhazsKKyAgICAgICAgICBjYXNlIDEyNTM6IHMgPSAiY3AxMjUzIjsgYnJlYWs7CisgICAgICAgICAgY2FzZSAxMjU0OiBzID0gImNwMTI1NCI7IGJyZWFrOworICAgICAgICAgIGNhc2UgMTI1NTogcyA9ICJjcDEyNTUiOyBicmVhazsKKyAgICAgICAgICBjYXNlIDEyNTY6IHMgPSAiY3AxMjU2IjsgYnJlYWs7CisgICAgICAgICAgY2FzZSAxMjU3OiBzID0gImNwMTI1NyI7IGJyZWFrOworICAgICAgICAgIGNhc2UgMTI1ODogcyA9ICJjcDEyNTgiOyBicmVhazsKKyAgICAgICAgfQorI2lmZGVmIFBDRk9OVFMKKy8qCisgICBJZiB0aGUgdXNlciBoYXMgbG9hZGVkIGEgZm9udCB3aXRoIFNFVCBURVJNSU5BTCBGT05UIHRoZW4gd2Ugd2FudAorICAgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGNvZGUgcGFnZSB0byB0aGUgZm9udCB0aGF0IHdhcyBsb2FkZWQuCisqLworICAgICAgICBpZiAodHRfZm9udCAhPSBUVEZfUk9NKSB7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgbnRlcm1mb250OyB5KysgKSB7CisgICAgICAgICAgICAgICAgaWYgKHRlcm1fZm9udFt5XS5rd3ZhbCA9PSB0dF9mb250KSB7CisgICAgICAgICAgICAgICAgICAgIHMgPSB0ZXJtX2ZvbnRbeV0ua3dkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBQQ0ZPTlRTICovCisjZWxzZSAgLyogTm90IEs5NS4uLiAqLworICAgICAgICBzID0gZmNzaW5mb1tmY2hhcnNldF0ua2V5d29yZDsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgICAgICBpZiAoKHkgPSBjbWtleSgKKyNpZmRlZiBDS09VTkkKKyAgICAgICAgICAgICAgICAgICAgICAgdHhydGFiLG50eHJ0YWIsCisjZWxzZSAvKiBDS09VTkkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgdHRjc3RhYixudGVybWMsCisjZW5kaWYgLyogQ0tPVU5JICovCisgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbCBjaGFyYWN0ZXItc2V0IixzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKworI2lmZGVmIFVOSUNPREUKKyAgICAgICAgaWYgKHkgPT0gVFhfVVRGOCkgeworICAgICAgICAgICAgcHJpbnRmKCI/VVRGOCBtYXkgbm90IGJlIHVzZWQgYXMgYSBsb2NhbCBjaGFyYWN0ZXIgc2V0LlxyXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBVTklDT0RFICovCisjaWZkZWYgT1MyCisgICAgICAgIGlmICgoeiA9IGNta2V5KGdyYXBoc2V0dGFiLG5ncmFwaHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIkRFQyBWVCBpbnRlcm1lZGlhdGUgZ3JhcGhpYyBzZXQiLCJhbGwiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHopOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICBpZiAoKGVvbCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybihlb2wpOyAvKiBDb25maXJtIHRoZSBjb21tYW5kICovCisKKyAgICAgICAgLyogRW5kIG9mIGNvbW1hbmQgcGFyc2luZyAtIGFjdGlvbnMgYmVnaW4gKi8KKyAgICAgICAgc2V0bGNsY2hhcnNldCh5KTsKKyAgICAgICAgc2V0cmVtY2hhcnNldCh4LHopOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmbmRlZiBOT0NTRVRTCisgICAgICBjYXNlIFhZVExDUzogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFRFUk1JTkFMIExPQ0FMLUNIQVJBQ1RFUi1TRVQgKi8KKyAgICAgICAgLyogc2V0IHRlcm1pbmFsIGNoYXJhY3Rlci1zZXQgPGxvY2FsPiAqLworICAgICAgICBzID0gZ2V0ZGNzZXQoKTsgICAgICAgICAgICAgICAgIC8qIEdldCBkaXNwbGF5IGNoYXJhY3Rlci1zZXQgbmFtZSAqLworICAgICAgICBpZiAoKHkgPSBjbWtleSgKKyNpZmRlZiBDS09VTkkKKyAgICAgICAgICAgICAgICAgICAgICAgdHhydGFiLG50eHJ0YWIsCisjZWxzZSAvKiBDS09VTkkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgZmNzdGFiLG5maWxjLAorI2VuZGlmIC8qIENLT1VOSSAqLworICAgICAgICAgICAgICAgICAgICAgICAibG9jYWwgY2hhcmFjdGVyLXNldCIscyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisKKyNpZmRlZiBVTklDT0RFCisgICAgICAgICAgaWYgKHkgPT0gVFhfVVRGOCkgeworICAgICAgICAgICAgICBwcmludGYoIj9VVEY4IG1heSBub3QgYmUgdXNlZCBhcyBhIGxvY2FsIGNoYXJhY3RlciBzZXQuXHJcbiIpOworICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBVTklDT0RFICovCisgICAgICAgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeik7IC8qIENvbmZpcm0gdGhlIGNvbW1hbmQgKi8KKworICAgICAgICAgIC8qIEVuZCBvZiBjb21tYW5kIHBhcnNpbmcgLSBhY3Rpb24gYmVnaW5zICovCisKKyAgICAgICAgc2V0bGNsY2hhcnNldCh5KTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyNpZm5kZWYgTk9DU0VUUworI2lmZGVmIFVOSUNPREUKKyAgICAgIGNhc2UgWFlUVU5JOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTUlOQUwgVU5JQ09ERSAqLworICAgICAgICByZXR1cm4oc2V0b24oJnR0X3VuaWNvZGUpKTsKKyNlbmRpZiAvKiBVTklDT0RFICovCisKKyAgICAgIGNhc2UgWFlUUkNTOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTUlOQUwgUkVNT1RFLUNIQVJBQ1RFUi1TRVQgKi8KKyAgICAgICAgLyogc2V0IHRlcm1pbmFsIGNoYXJhY3Rlci1zZXQgPHJlbW90ZT4gPEdyYXBoaWMtc2V0PiAqLworICAgICAgICBpZiAoKHggPSBjbWtleSgKKyNpZmRlZiBDS09VTkkKKyAgICAgICAgICAgICAgICB0eHJ0YWIsIG50eHJ0YWIsCisjZWxzZSAvKiBDS09VTkkgKi8KKyAgICAgICAgICAgICAgICB0dGNzdGFiLG50ZXJtYywKKyNlbmRpZiAvKiBDS09VTkkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgInJlbW90ZSB0ZXJtaW5hbCBjaGFyYWN0ZXItc2V0IiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisKKyNpZmRlZiBVTklDT0RFCisgICAgICAgIGlmICh4ID09IFRYX1RSQU5TUAorI2lmZGVmIENLT1VOSQorICAgICAgICAgICAgfHwgeCA9PSBUWF9VVEY4CisjZW5kaWYgLyogQ0tPVU5JICovCisgICAgICAgICAgICkgeworICAgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApICAgIC8qIENvbmZpcm0gdGhlIGNvbW1hbmQgKi8KKyAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgIGlmICggaXN1bmljb2RlKCkgJiYgeCA9PSBUWF9UUkFOU1AgKSB7CisgICAgICAgICAgICAgICAgLyogSWYgd2UgYXJlIGluIHVuaWNvZGUgZGlzcGxheSBtb2RlIHRoZW4gdHJhbnNwYXJlbnQKKyAgICAgICAgICAgICAgICAgKiBvbmx5IGFmZmVjdHMgdGhlIG91dHB1dCBkaXJlY3Rpb24uICBXZSBuZWVkIHRvIGtub3cKKyAgICAgICAgICAgICAgICAgKiB0aGUgYWN0dWFsIHJlbW90ZSBjaGFyYWN0ZXIgc2V0IGluIG9yZGVyIHRvIHBlcmZvcm0KKyAgICAgICAgICAgICAgICAgKiB0aGUgdGNzciAtPiB1Y3MyIHRyYW5zbGF0aW9uIGZvciBkaXNwbGF5LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHggPSB0Y3NsOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICB9CisjZWxzZSAvKiBVTklDT0RFICovCisgICAgICAgIGlmICh4ID09IEZDX1RSQU5TUCkgeworICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgICAgICAgIC8qIENvbmZpcm0gdGhlIGNvbW1hbmQgKi8KKyAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyAgICAgICAgZWxzZSB7CisjaWZkZWYgT1MyCisgICAgICAgICAgaWYgKCh6ID0gY21rZXkoZ3JhcGhzZXR0YWIsbmdyYXBoc2V0LAorICAgICAgICAgICAgICAgICAgICAgICJERUMgVlQgaW50ZXJtZWRpYXRlIGdyYXBoaWMgc2V0IiwiYWxsIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih6KTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApICAgICAgICAvKiBDb25maXJtIHRoZSBjb21tYW5kICovCisgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIH0KKyAgICAgICAgLyogQ29tbWFuZCBwYXJzaW5nIGVuZHMgaGVyZSAqLworCisgICAgICAgIHNldHJlbWNoYXJzZXQoeCx6KTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyAgICAgIGNhc2UgWFlURUM6ICAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTUlOQUwgRUNITyAqLworICAgICAgICBpZiAoKHggPSBjbWtleShybHRhYixucmx0LCJ3aGljaCBzaWRlIGVjaG9zIGR1cmluZyBDT05ORUNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgInJlbW90ZSIsIHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworI2lmZGVmIE5FVENPTk4KKyAgICAgICAgb2xkcGxleCA9IHg7CisjZW5kaWYgLyogTkVUQ09OTiAqLworICAgICAgICBkdXBsZXggPSB4OworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICBjYXNlIFhZVEVTQzogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFRFUk0gRVNDICovCisgICAgICAgIGlmICgoeCA9IGNta2V5KG5hYmx0YWIsbm5hYmx0YWIsIiIsImVuYWJsZWQiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHR0X2VzY2FwZSA9IHg7CisgICAgICAgIHJldHVybigxKTsKKworICAgICAgY2FzZSBYWVRDUkQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBURVJNSU5BTCBDUi1ESVNQTEFZICovCisgICAgICAgIGlmICgoeCA9IGNta2V5KGNyZHRhYiwyLCIiLCAibm9ybWFsIiwgeHhzdHJpbmcpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHR0X2NyZCA9IHg7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyNpZmRlZiBPUzIKKyAgICAgIGNhc2UgWFlUQU5TOiB7ICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTUlOQUwgQU5TV0VSQkFDSyAqLworLyoKKyAgTk9URTogV2UgbGV0IHRoZW0gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBhbnN3ZXJiYWNrIHNlcXVlbmNlLCBidXQgd2UKKyAgZG8gTk9UIGxldCB0aGVtIGNoYW5nZSBpdCwgYW5kIHdlIGRlZmluaXRlbHkgZG8gbm90IGxldCB0aGUgaG9zdCBzZXQgaXQuCisgIFRoaXMgaXMgYSBzZWN1cml0eSBmZWF0dXJlLgorCisgIEFzIG9mIDEuMS44IHdlIGFsbG93IHRoZSBTRVQgVEVSTSBBTlNXRVJCQUNLIE1FU1NBR0UgPHN0cmluZz4gdG8gYmUKKyAgdXNlZCBqdXN0IGFzIE1TLURPUyBLZXJtaXQgZG9lcy4gIEMwIGFuZCBDMSBjb250cm9scyBhcyB3ZWxsIGFzIERFTAorICBhcmUgbm90IGFsbG93ZWQgdG8gYmUgdXNlZCBhcyBjaGFyYWN0ZXJzLiAgVGhleSBhcmUgdHJhbnNsYXRlZCB0bworICB1bmRlcnNjb3JlLiAgVGhpcyBtYXkgbm90IGJlIHNldCBieSBBUEMuCisqLworICAgICAgICAgIGlmICgoeCA9IGNta2V5KGFuYmt0YWIsbmFuc2JrLCIiLCAib2ZmIiwgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgaWYgKHggPCAyKSB7CisgICAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgIHR0X2Fuc3dlciA9IHg7CisgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgfSBlbHNlIGlmICggeCA9PSAyIHx8IHggPT0gMykgeworICAgICAgICAgICAgICBpbnQgbGVuID0gMDsKKyAgICAgICAgICAgICAgZXh0ZXJuIGludCBzYWZlYW5zd2VyYms7CisgICAgICAgICAgICAgIGV4dGVybiBjaGFyIHVzZXJhbnN3ZXJia1tdOworICAgICAgICAgICAgICBpZiAoKHkgPSBjbXR4dCgiQW5zd2VyYmFjayBleHRlbnNpb24iLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgaWYgKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwgfHwKKyAgICAgICAgICAgICAgICAgIChhcGNhY3RpdmUgPT0gQVBDX1JFTU9URSAmJiAhKGFwY3N0YXR1cyAmIEFQQ19VTkNIKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHMpOworICAgICAgICAgICAgICBpZiAoeCA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAvKiBTYWZlIEFuc3dlcmJhY2sncyBkb24ndCBoYXZlIEMwL0MxIGNoYXJzICovCisgICAgICAgICAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgbGVuOyB6KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNbel0gJiAweDdGKSA8PSBTUCB8fCAoc1t6XSAmIDB4N0YpID09IERFTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJhbnN3ZXJia1t6XSA9ICdfJzsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VyYW5zd2VyYmtbel0gPSBzW3pdOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgdXNlcmFuc3dlcmJrW3pdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgIHNhZmVhbnN3ZXJiayA9IDEgOyAgICAvKiBUUlVFICovCisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBja3N0cm5jcHkodXNlcmFuc3dlcmJrLHMsNjApOyAvKiAoc2VlIGNrb2Nvbi5jKSAqLworICAgICAgICAgICAgICAgICAgc2FmZWFuc3dlcmJrID0gMDsgICAgIC8qIEZBTFNFICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdXBkYW5zd2VyYmsoKTsKKyAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICB9CisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBDS19BUEMKKyAgICAgIGNhc2UgWFlUQVBDOgorICAgICAgICBpZiAoKHkgPSBjbWtleShhcGN0YWIsbmFwY3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uIHByb2dyYW0gY29tbWFuZCBleGVjdXRpb24iLCIiLAorICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmIChhcGNhY3RpdmUgPT0gQVBDX0xPQ0FMIHx8CisgICAgICAgICAgICAoYXBjYWN0aXZlID09IEFQQ19SRU1PVEUgJiYgIShhcGNzdGF0dXMgJiBBUENfVU5DSCkpKQorICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGFwY3N0YXR1cyA9IHk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyNpZmRlZiBDS19BVVRPREwKKyAgICAgIGNhc2UgWFlUQVVUT0RMOiAgICAgICAgICAgICAgICAgICAvKiBBVVRPRE9XTkxPQUQgKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkoYWRsdGFiLG5hZGx0YWIsIkF1dG8tZG93bmxvYWQgb3B0aW9ucyIsIiIsCisgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgY2FzZSBUQURfT046CisgICAgICAgICAgY2FzZSBUQURfT0ZGOgorICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICBzZXRhdXRvZGwoeSwwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVEFEX0FTSzoKKyAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgc2V0YXV0b2RsKFRBRF9PTiwxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVEFEX0VSUjoKKyAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KGFkbGVycnRhYixuYWRsZXJydGFiLCIiLCIiLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICBhZGxfZXJyID0geTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIE9TMgorICAgICAgICAgIGNhc2UgVEFEX0s6CisgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShhZGx4dGFiLG5hZGx4dGFiLCIiLCIiLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgICAgIGNhc2UgVEFEX1hfQzA6CisgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkoYWRsYzB0YWIsbmFkbGMwdGFiLCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzZWQtYnktZW11bGF0b3IiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICBhZGxfa2MwID0geTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBUQURfWF9ERVRFQ1Q6CisgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkoYWRsZHRhYixuYWRsZHRhYiwiIiwicGFja2V0Iix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgICAgYWRsX2ttb2RlID0geTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBUQURfWF9TVFI6CisgICAgICAgICAgICAgICAgaWYgKCh5ID0gY210eHQoIktlcm1pdCBzdGFydCBzdHJpbmciLCJLRVJNSVQgUkVBRFkgVE8gU0VORC4uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgZnJlZShhZGxfa3N0cik7CisgICAgICAgICAgICAgICAgYWRsX2tzdHIgPSBzdHJkdXAocyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgVEFEX1o6CisgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShhZGx4dGFiLG5hZGx4dGFiLCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICBzd2l0Y2ggKHkpIHsKKyAgICAgICAgICAgICAgY2FzZSBUQURfWF9DMDoKKyAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShhZGxjMHRhYixuYWRsYzB0YWIsIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NlZC1ieS1lbXVsYXRvciIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgIGFkbF96YzAgPSB5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFRBRF9YX0RFVEVDVDoKKyAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShhZGxkdGFiLG5hZGxkdGFiLCIiLCJwYWNrZXQiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICBhZGxfem1vZGUgPSB5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFRBRF9YX1NUUjoKKyAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbXR4dCgiIiwicnpcXHsxM30iLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgIGZyZWUoYWRsX3pzdHIpOworICAgICAgICAgICAgICAgIGFkbF96c3RyID0gc3RyZHVwKHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworI2VuZGlmIC8qIENLX0FVVE9ETCAqLworI2VuZGlmIC8qIENLX0FQQyAqLworCisjaWZkZWYgT1MyCisgICAgICBjYXNlIFhZVEJFTDoKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSBzZXRiZWxsKCkpOworCisgICAgICBjYXNlIFhZVE1CRUw6ICAgICAgICAgICAgICAgICAgICAgLyogTUFSR0lOLUJFTEwgKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkob25vZmYsMiwiIiwib24iLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGlmICh5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogT04gKi8KKyAgICAgICAgICAgIGlmICgoeiA9IGNtbnVtKCJDb2x1bW4gYXQgd2hpY2ggdG8gc2V0IG1hcmdpbiBiZWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICI3MiIsMTAsJngseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgbWFyZ2luYmVsbCA9IHk7CisgICAgICAgIG1hcmdpbmJlbGxjb2wgPSB4OworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgQ0tUSURMRQorICAgICAgY2FzZSBYWVRJRExFOiAgICAgICAgICAgICAgICAgICAgIC8qIElETEUtU0VORCAqLworICAgICAgY2FzZSBYWVRJVE1POiAgICAgICAgICAgICAgICAgICAgIC8qIElETEUtVElNRU9VVCAqLworICAgICAgICBpZiAoKHogPSBjbW51bSgic2Vjb25kcyBvZiBpZGxlIHRpbWUgdG8gd2FpdCwgb3IgMCB0byBkaXNhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIjAiLDEwLCZ4LHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih6KTsKKyAgICAgICAgaWYgKHkgPT0gWFlUSURMRSkgeworICAgICAgICAgICAgaWYgKCh5ID0gY210eHQoInN0cmluZyB0byBzZW5kLCBtYXkgY29udGFpbiBrdmVyYnMgYW5kIHZhcmlhYmxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFx2KG5ld2xpbmUpIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgdHRfaWRsZXNuZF90bW8gPSB4OyAgICAgICAgIC8qIChvbGQpICovCisgICAgICAgICAgICB0dF9pZGxlbGltaXQgPSB4OyAgICAgICAgICAgLyogKG5ldykgKi8KKyAgICAgICAgICAgIG1ha2VzdHIoJnR0X2lkbGVzdHIsYnJzdHJpcChzKSk7IC8qIChuZXcpICovCisgICAgICAgICAgICB0dF9pZGxlc25kX3N0ciA9IHR0X2lkbGVzdHI7IC8qIChvbGQpICovCisgICAgICAgICAgICB0dF9pZGxlYWN0ID0gSURMRV9PVVQ7ICAgICAgLyogKG5ldykgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgdHRfaWRsZWxpbWl0ID0geDsKKyAgICAgICAgfQorI2lmZGVmIE9TMgorICAgICAgICBwdXRlcnJvcihWVEVSTSk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgWFlUSUFDVDogeyAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTSBJRExFLUFDVElPTiAqLworICAgICAgICAgIGlmICgoeSA9IGNta2V5KGlkbGFjdHMsbmlkbGFjdHMsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgaWYgKHkgPT0gSURMRV9PVVQpIHsKKyAgICAgICAgICAgICAgaWYgKCh4ID0gY210eHQoInN0cmluZyB0byBzZW5kLCBtYXkgY29udGFpbiBrdmVyYnMgYW5kIHZhcmlhYmxlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiXFx2KG5ld2xpbmUpIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgIG1ha2VzdHIoJnR0X2lkbGVzdHIsYnJzdHJpcChzKSk7IC8qIChuZXcpICovCisgICAgICAgICAgICAgIHR0X2lkbGVzbmRfc3RyID0gdHRfaWRsZXN0cjsgLyogKG9sZCkgKi8KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIH0KKyAgICAgICAgICB0dF9pZGxlYWN0ID0geTsKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorI2VuZGlmIC8qIENLVElETEUgKi8KKworICAgICAgY2FzZSBYWVRERUI6ICAgICAgICAgICAgICAgICAgICAgIC8qIFRFUk1JTkFMIERFQlVHICovCisgICAgICAgIHkgPSBzZXRvbigmeCk7ICAgICAgICAgICAgICAgICAgLyogR28gcGFyc2UgT04gb3IgT0ZGICovCisgICAgICAgIGlmICh5ID4gMCkgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBzdWNjZWVkZWQ/ICovCisgICAgICAgICAgc2V0ZGVic2VzKHgpOworICAgICAgICByZXR1cm4oeSk7CisKKyNpZmRlZiBPUzIKKyAgICAgIGNhc2UgWFlUQVNDUkw6ICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTUlOQUwgQVVUT1NDUk9MTCAqLworICAgICAgICAgIHkgPSBzZXRvbigmYXV0b3Njcm9sbCk7CisgICAgICAgICAgcmV0dXJuKHkpOworCisgICAgICBjYXNlIFhZVEFQQUdFOiAgICAgICAgICAgICAgICAgICAgLyogU0VUIFRFUk1JTkFMIEFVVE9QQUdFICovCisgICAgICAgICAgeSA9IHNldG9uKCZ3eV9hdXRvcGFnZSk7CisgICAgICAgICAgcmV0dXJuKHkpOworCisgICAgICBjYXNlIFhZVFJPTDogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFRFUk1JTkFMIFJPTEwgKi8KKyAgICAgICAgaWYgKCh5ID0gY21rZXkocm9sbHRhYixucm9sbCwic2Nyb2xsYmFjayBtb2RlIiwiaW5zZXJ0Iix4eHN0cmluZykpPDApCisJICByZXR1cm4oeSk7CisJaWYgKHkgPT0gVFRSX0tFWVMpIHsKKwkgICAgaWYgKCh4ID0gY21rZXkocm9sbGtleXRhYixucm9sbGtleSwiIiwic2VuZCIseHhzdHJpbmcpKTwwKQorCSAgICAgIHJldHVybih4KTsKKwkgICAgaWYgKCh6ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeik7CisJICAgIHR0X3JrZXlzW1ZURVJNXSA9IHg7CisJfSBlbHNlIHsKKwkgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisJICAgIHR0X3JvbGxbVlRFUk1dID0geTsKKwl9CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgWFlUQ1RTOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgVEVSTUlOQUwgVFJBTlNNSVQtVElNRU9VVCAqLworICAgICAgICB5ID0gY21udW0oIk1heGltdW0gc2Vjb25kcyB0byBhbGxvdyBDVFMgb2ZmIGR1cmluZyBDT05ORUNUIiwKKyAgICAgICAgICAgICAgICAgICI1IiwxMCwmeCx4eHN0cmluZyk7CisgICAgICAgIHJldHVybihzZXRudW0oJnR0X2N0c3Rtbyx4LHksMTAwMDApKTsKKworICAgICAgY2FzZSBYWVRDUEc6IHsgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBURVJNSU5BTCBDT0RFLVBBR0UgKi8KKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBjcCA9IC0xOworICAgICAgICB5ID0gY21udW0oIlBDIGNvZGUgcGFnZSB0byB1c2UgZHVyaW5nIHRlcm1pbmFsIGVtdWxhdGlvbiIsCisgICAgICAgICAgICAgICAgICBja2l0b2Eob3MyZ2V0Y3AoKSksMTAsJngseHhzdHJpbmcpOworICAgICAgICBpZiAoKHggPSBzZXRudW0oJmNwLHgseSwxMTAwMCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICBpZiAob3Myc2V0Y3AoY3ApICE9IDEpIHsKKyNpZmRlZiBOVAorICAgICAgICAgICAgaWYgKGlzV2luOTUoKSkKKyAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICAiU29ycnksIFdpbmRvd3MgOTUgZG9lcyBub3Qgc3VwcG9ydCBjb2RlIHBhZ2Ugc3dpdGNoaW5nXG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgICJTb3JyeSwgJWQgaXMgbm90IGEgdmFsaWQgY29kZSBwYWdlIGZvciB0aGlzIHN5c3RlbS5cbiIsY3ApOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgIC8qIEZvcmNlIHRoZSB0ZXJtaW5hbCBjaGFyYWN0ZXItc2V0cyBjb252ZXJzaW9ucyB0byBiZSB1cGRhdGVkICovCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgICBHW2ldLmluaXQgPSBUUlVFOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorCisgICAgICBjYXNlIFhZVFBBQzogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFRFUk1JTkFMIE9VVFBVVC1QQUNJTkcgKi8KKyAgICAgICAgeSA9IGNtbnVtKAorICAgICAgICAgICAiUGF1c2UgYmV0d2VlbiBzZW5kaW5nIGVhY2ggY2hhcmFjdGVyIGR1cmluZyBDT05ORUNULCBtaWxsaXNlY29uZHMiLAorICAgICAgICAgICAgICAgICAgIi0xIiwxMCwmeCx4eHN0cmluZyk7CisgICAgICAgIHJldHVybihzZXRudW0oJnR0X3BhY2luZyx4LHksMTAwMDApKTsKKworI2lmZGVmIE9TMk1PVVNFCisgICAgICBjYXNlIFhZVE1PVTogeyAgICAgICAgICAgICAgICAgICAgLyogU0VUIFRFUk1JTkFMIE1PVVNFICovCisgICAgICAgICAgaW50IG9sZF9tb3UgPSB0dF9tb3VzZTsKKyAgICAgICAgICBpZiAoKHggPSBzZXRvbigmdHRfbW91c2UpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgaWYgKHR0X21vdXNlICE9IG9sZF9tb3UpCisgICAgICAgICAgICBpZiAodHRfbW91c2UpCisgICAgICAgICAgICAgIG9zMl9tb3VzZW9uKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG9zMl9tb3VzZW9mZigpOworICAgICAgICAgIHJldHVybigxKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBPUzJNT1VTRSAqLworI2VuZGlmIC8qIE9TMiAqLworCisgICAgICBjYXNlIFhZVFdJRDogeworICAgICAgICAgIGlmICgoeSA9IGNtbnVtKAorI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgb2YgY29sdW1ucyBpbiBkaXNwbGF5IHdpbmRvdyBkdXJpbmcgQ09OTkVDVCIsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgb2YgY29sdW1ucyBvbiB5b3VyIHNjcmVlbiIsCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIjgwIiwxMCwmeCx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IG9zMl9zZXR0ZXJtd2lkdGgoeCkpOworI2Vsc2UgIC8qIE5vdCBPUy8yICovCisgICAgICAgICAgdHRfY29scyA9IHg7CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgIH0KKworICAgICAgY2FzZSBYWVRISUc6CisgICAgICAgIGlmICgoeSA9IGNtbnVtKAorI2lmZGVmIE9TMgorICJudW1iZXIgb2Ygcm93cyBpbiBkaXNwbGF5IHdpbmRvdyBkdXJpbmcgQ09OTkVDVCwgbm90IGluY2x1ZGluZyBzdGF0dXMgbGluZSIsCisgdHRfc3RhdHVzW1ZURVJNXT8iMjQiOiIyNSIsCisjZWxzZQorICIyNCIsIm51bWJlciBvZiByb3dzIG9uIHlvdXIgc2NyZWVuIiwKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgMTAsJngseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKworI2lmZGVmIE9TMgorICAgICAgICByZXR1cm4gKHN1Y2Nlc3MgPSBvczJfc2V0dGVybWhlaWdodCh4KSk7CisjZWxzZSAgLyogTm90IE9TLzIgKi8KKyAgICAgICAgdHRfcm93cyA9IHg7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBPUzIKKyAgICAgIGNhc2UgWFlUUFJOOiB7ICAgICAgICAgICAgICAgICAgICAvKiBQcmludCBNb2RlICovCisgICAgICAgICAgZXh0ZXJuIGJvb2wgeHByaW50LCBhcHJpbnQsIGNwcmludCwgdXByaW50OworICAgICAgICAgIGlmICgoeSA9IGNta2V5KHBybm10YWIsbnBybm10YWIsIiIsIm9mZiIsIHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgIGlmIChjcHJpbnQgfHwgdXByaW50IHx8IGFwcmludCB8fCB4cHJpbnQpCisgICAgICAgICAgICAgICAgcHJpbnRlcm9mZigpOworICAgICAgICAgICAgICBjcHJpbnQgPSB4cHJpbnQgPSB1cHJpbnQgPSAwOworICAgICAgICAgICAgICBzZXRhcHJpbnQoMCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICBpZiAoIShjcHJpbnQgfHwgdXByaW50IHx8IGFwcmludCB8fCB4cHJpbnQpKQorICAgICAgICAgICAgICAgIHByaW50ZXJvbigpOworICAgICAgICAgICAgICBzZXRhcHJpbnQoMSk7CisgICAgICAgICAgICAgIGNwcmludCA9IHhwcmludCA9IHVwcmludCA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICBpZiAoIShjcHJpbnQgfHwgdXByaW50IHx8IGFwcmludCB8fCB4cHJpbnQpKQorICAgICAgICAgICAgICAgIHByaW50ZXJvbigpOworICAgICAgICAgICAgICBjcHJpbnQgPSAxOworICAgICAgICAgICAgICBzZXRhcHJpbnQoMCk7CisJICAgICAgeHByaW50ID0gdXByaW50ID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgIGlmICghKGNwcmludCB8fCB1cHJpbnQgfHwgYXByaW50IHx8IHhwcmludCkpCisgICAgICAgICAgICAgICAgcHJpbnRlcm9uKCk7CisgICAgICAgICAgICAgIHVwcmludCA9IDE7CisgICAgICAgICAgICAgIHNldGFwcmludCgwKTsKKyAgICAgICAgICAgICAgeHByaW50ID0gY3ByaW50ID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybigxKTsKKyAgICAgIH0KKyNlbHNlCisjaWZkZWYgWFBSSU5UCisgICAgICBjYXNlIFhZVFBSTjogeworICAgICAgICAgIGV4dGVybiBpbnQgdHRfcHJpbnQ7CisgICAgICAgICAgaWYgKCh4ID0gc2V0b24oJnR0X3ByaW50KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICB9CisjZW5kaWYgLyogWFBSSU5UICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBPUzIKKyAgICAgIGNhc2UgWFlUU0NOTTogeworICAgICAgICAgIGV4dGVybiBpbnQgZGVjc2NubSwgZGVjc2NubV91c3I7CisgICAgICAgICAgaWYgKCh5ID0gY21rZXkobm9ybXJldiw0LCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3Njbm1fdXNyPyJyZXZlcnNlIjoibm9ybWFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykKKyAgICAgICAgICAgICAgICkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgIGRlY3Njbm1fdXNyID0geTsKKyAgICAgICAgICBpZiAoZGVjc2NubSAhPSBkZWNzY25tX3VzcikKKyAgICAgICAgICAgIGZsaXBzY3JlZW4oVlRFUk0pOworICAgICAgICAgIHJldHVybigxKTsKKyAgICB9CisgICAgY2FzZSBYWVRPUFRJOgorICAgICAgICBpZiAoKHkgPSBjbWtleShvbm9mZiwyLCIiLHR0X2RpZmZfdXBkPyJvbiI6Im9mZiIsCisgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgdHRfZGlmZl91cGQgPSB5OworICAgICAgICByZXR1cm4oMSk7CisgICAgY2FzZSBYWVRVUEQ6IHsKKyAgICAgICAgaW50IG1vZGUsIGRlbGF5OworICAgICAgICBpZiAoKG1vZGUgPSBjbWtleShzY3JudXBkLG5zY3JudXBkLCIiLCJmYXN0Iix4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuKG1vZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeSA9IGNtbnVtKAorICAgICAgICAgICAgIlBhdXNlIGJldHdlZW4gRkFTVCBzY3JlZW4gdXBkYXRlcyBpbiBDT05ORUNUIG1vZGUsIG1pbGxpc2Vjb25kcyIsCisgICAgICAgICAgICAgICAgICAgICAgIjEwMCIsMTAsJngseHhzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKHggPCAwIHx8IHggPiAxMDAwICkgeworICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICJcbj9UaGUgdXBkYXRlIHJhdGUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMDAgbWlsbGlzZWNvbmRzLlxuIgorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKworICAgICAgICAgICAgdXBkbW9kZSA9IHR0X3VwZG1vZGUgPSBtb2RlOworICAgICAgICAgICAgcmV0dXJuKHNldG51bSgmdHRfdXBkYXRlLHgseSwxMDAwMCkpOworICAgICAgICB9CisgICAgfQorICAgIGNhc2UgWFlUQ1RSTDoKKyAgICAgICAgICBpZiAoKHggPSBjbWtleSh0ZXJtY3RybCxudGVybWN0cmwsIiIsIjciLHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgIHN3aXRjaCAoIHggKSB7CisgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgIHNlbmRfYzEgPSBzZW5kX2MxX3VzciA9IFRSVUU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgc2VuZF9jMSA9IHNlbmRfYzFfdXNyID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IFRSVUUpOworICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgUENGT05UUworICAgICAgY2FzZSBYWVRGT046CisgICAgICAgIGlmICggIUlzT1MyRnVsbFNjcmVlbigpICkgeworICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAiXG4/U0VUIFRFUk1JTkFMIEZPTlQgaXMgb25seSBzdXBwb3J0ZWQgaW4gRnVsbCBTY3JlZW4gc2Vzc2lvbnMuXG4iKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh4ID0gY21rZXkodGVybV9mb250LG50ZXJtZm9udCwiIiwiZGVmYXVsdCIseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKCAhb3MyTG9hZFBDRm9udHMoKSApIHsKKyAgICAgICAgICAgICAgICB0dF9mb250ID0geDsKKyAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IFRSVUUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoCisgICAgICAiXG4/UENGT05UUy5ETEwgaXMgbm90IGF2YWlsYWJsZSBpbiBDS0VSTUlUIGV4ZWN1dGFibGUgZGlyZWN0b3J5LlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSBGQUxTRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZWxzZSAvKiBQQ0ZPTlRTICovCisjaWZkZWYgTlQKKyNpZmRlZiBLVUkKKyAgICBjYXNlIFhZVEZPTjoKKyAgICAgICAgcmV0dXJuKHNldGd1aWZvbnQoKSk7ICAgICAgICAgICAvKiBja3V1czMuYyAqLworI2VuZGlmIC8qIEtVSSAqLworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogUENGT05UUyAqLworCisgICAgICBjYXNlIFhZVFZDSDogeworICAgICAgICAgIGV4dGVybiBpbnQgcGhlaWdodCwgbWFyZ2luYm90LCBjbWRfcm93cywgY21kX2NvbHM7CisgICAgICAgICAgaWYgKCh4ID0gY21rZXkodHZjdGFiLG50dmN0YWIsIiIsaXNXaW45NSgpPyJ3aW45NS1zYWZlIjoiZW5hYmxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisjaWZuZGVmIEtVSQorICAgICAgICAgIGlmICh4ICE9IHR0X21vZGVjaGcpIHsKKyAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgICAgY2FzZSBUVkNfRElTOgorICAgICAgICAgICAgICAgICAgLyogV2hlbiBkaXNhYmxlZCB0aGUgaGVpZ2h0cyBvZiBhbGwgb2YgdGhlIHZpcnR1YWwgc2NyZWVucyAqLworICAgICAgICAgICAgICAgICAgLyogbXVzdCBiZSBlcXVhbCB0byB0aGUgcGh5c2ljYWwgaGVpZ2h0IG9mIHRoZSBjb25zb2xlICAgICAqLworICAgICAgICAgICAgICAgICAgLyogd2luZG93IGFuZCBtYXkgbm90IGJlIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgLyogVGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cgbWF5IG5vdCBiZSBhbHRlcmVkLiAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgdHRfbW9kZWNoZyA9IFRWQ19FTkE7ICAgICAgICAgICAgICAgICAvKiBUZW1wb3JhcnkgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChtYXJnaW5ib3QgPiBwaGVpZ2h0LSh0dF9zdGF0dXNbVlRFUk1dPzE6MCkpCisgICAgICAgICAgICAgICAgICAgIG1hcmdpbmJvdCA9IHBoZWlnaHQtKHR0X3N0YXR1c1tWVEVSTV0/MTowKTsKKyAgICAgICAgICAgICAgICAgIHR0X3N6Y2huZ1tWQ01EXSA9IDEgOworICAgICAgICAgICAgICAgICAgdHRfcm93c1tWQ01EXSA9IHBoZWlnaHQ7CisgICAgICAgICAgICAgICAgICBWc2NybkluaXQoVkNNRCk7CisgICAgICAgICAgICAgICAgICBTZXRDb2xzKFZDTUQpOworICAgICAgICAgICAgICAgICAgY21kX3Jvd3MgPSB5OworCisgICAgICAgICAgICAgICAgICB0dF9zemNobmdbVlRFUk1dID0gMiA7CisgICAgICAgICAgICAgICAgICB0dF9yb3dzW1ZURVJNXSA9IHBoZWlnaHQgLSAodHRfc3RhdHVzW1ZURVJNXT8xOjApOworICAgICAgICAgICAgICAgICAgVnNjcm5Jbml0KFZURVJNKTsKKworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRWQ19FTkE6CisgICAgICAgICAgICAgICAgICAvKiBXaGVuIGVuYWJsZWQgdGhlIHBoeXNpY2FsIGhlaWdodCBvZiB0aGUgY29uc29sZSB3aW5kb3dzICovCisgICAgICAgICAgICAgICAgICAvKiBzaG91bGQgYmUgYWRqdXN0ZWQgdG8gdGhlIGhlaWdodCBvZiB0aGUgdmlydHVhbCBzY3JlZW4gICovCisgICAgICAgICAgICAgICAgICAvKiBUaGUgd2lkdGggbWF5IGJlIHNldCB0byBhbnl0aGluZy4gICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIFRWQ19XOTU6CisgICAgICAgICAgICAgICAgICAvKiBXaW45NS1zYWZlIG1vZGUgYWxsb3dzIHRoZSBwaHlzaWNhbCBoZWlnaHQgdG8gY2hhbmdlICAgICovCisgICAgICAgICAgICAgICAgICAvKiBidXQgcmVzdHJpY3RzIGl0IHRvIGEgd2lkdGggb2YgODAgYW5kIGEgaGVpZ2h0IGVxdWFsIHRvICovCisgICAgICAgICAgICAgICAgICAvKiAyNSwgNDMsIG9yIDUwLiAgTXVzdCBiZSBhZGp1c3RlZCBub3cuICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAvKiBUaGUgdmlydHVhbCBoZWlnaHRzIG11c3QgYmUgZXF1YWwgdG8gdGhlIGFib3ZlLiAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBpZiAocGhlaWdodCAhPSAyNSAmJiBwaGVpZ2h0ICE9IDQzICYmIHBoZWlnaHQgIT0gNTApIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAocGhlaWdodCA8IDI1KQorICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDI1OworICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBoZWlnaHQgPCA0MykKKyAgICAgICAgICAgICAgICAgICAgICAgIHkgPSA0MzsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB5ID0gNTA7CisgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeSA9IHBoZWlnaHQ7CisKKyAgICAgICAgICAgICAgICAgIHR0X21vZGVjaGcgPSBUVkNfRU5BOyAvKiBUZW1wb3JhcnkgKi8KKworICAgICAgICAgICAgICAgICAgdHRfc3pjaG5nW1ZDTURdID0gMTsKKyAgICAgICAgICAgICAgICAgIHR0X3Jvd3NbVkNNRF0gPSB5OworICAgICAgICAgICAgICAgICAgdHRfY29sc1tWQ01EXSA9IDgwOworICAgICAgICAgICAgICAgICAgVnNjcm5Jbml0KFZDTUQpOworICAgICAgICAgICAgICAgICAgU2V0Q29scyhWQ01EKTsKKyAgICAgICAgICAgICAgICAgIGNtZF9yb3dzID0geTsKKyAgICAgICAgICAgICAgICAgIGNtZF9jb2xzID0gODA7CisKKyAgICAgICAgICAgICAgICAgIG1hcmdpbmJvdCA9IHktKHR0X3N0YXR1c1tWVEVSTV0/MTowKTsKKyAgICAgICAgICAgICAgICAgIHR0X3N6Y2huZ1tWVEVSTV0gPSAyOworICAgICAgICAgICAgICAgICAgdHRfcm93c1tWVEVSTV0gPSB5IC0gKHR0X3N0YXR1c1tWVEVSTV0/MTowKTsKKyAgICAgICAgICAgICAgICAgIHR0X2NvbHNbVlRFUk1dID0gODA7CisgICAgICAgICAgICAgICAgICBWc2NybkluaXQoVlRFUk0pOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdHRfbW9kZWNoZyA9IHg7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZWxzZQorICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogS1VJICovCisgICAgICB9CisgICAgICBjYXNlIFhZVFNUQVQ6IHsKKyAgICAgICAgICBleHRlcm4gaW50IG1hcmdpbmJvdDsKKyAgICAgICAgICBpZiAoKHkgPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgICBpZiAoeSAhPSB0dF9zdGF0dXNbVlRFUk1dIHx8IHkgIT0gdHRfc3RhdHVzX3VzcltWVEVSTV0pIHsKKyAgICAgICAgICAgICAgLyogTWlnaHQgbmVlZCB0byBmaXh1cCB0aGUgbWFyZ2lucyAqLworICAgICAgICAgICAgICBpZiAoIG1hcmdpbmJvdCA9PSBWc2NybkdldEhlaWdodChWVEVSTSktKHR0X3N0YXR1c1tWVEVSTV0/MTowKSApCisgICAgICAgICAgICAgICAgaWYgKHkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFyZ2luYm90LS07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWFyZ2luYm90Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB0dF9zdGF0dXNfdXNyW1ZURVJNXSA9IHR0X3N0YXR1c1tWVEVSTV0gPSB5OworICAgICAgICAgICAgICBpZiAoeSkgeworICAgICAgICAgICAgICAgICAgICB0dF9zemNobmdbVlRFUk1dID0gMjsKKyAgICAgICAgICAgICAgICAgICAgdHRfcm93c1tWVEVSTV0tLTsKKyAgICAgICAgICAgICAgICAgICAgVnNjcm5Jbml0KFZURVJNKTsgIC8qIEhlaWdodCBzZXQgaGVyZSAqLworI2lmZGVmIFROQ09ERQorICAgICAgICAgICAgICAgICAgICBpZiAoVEVMT1BUX01FKFRFTE9QVF9OQVdTKSkKKyAgICAgICAgICAgICAgICAgICAgICB0bl9zbmF3cygpOworI2VuZGlmIC8qIFROQ09ERSAqLworI2lmZGVmIFJMT0dDT0RFCisgICAgICAgICAgICAgICAgICAgIGlmIChURUxPUFRfTUUoVEVMT1BUX05BV1MpKQorICAgICAgICAgICAgICAgICAgICAgIHJsb2dfbmF3cygpOworI2VuZGlmIC8qIFJMT0dDT0RFICovCisjaWZkZWYgU1NIQlVJTFRJTgorICAgICAgICAgICAgICAgICAgICBpZiAoVEVMT1BUX01FKFRFTE9QVF9OQVdTKSkKKyAgICAgICAgICAgICAgICAgICAgICBzc2hfc25hd3MoKTsKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICB0dF9zemNobmdbVlRFUk1dID0gMTsKKyAgICAgICAgICAgICAgICAgIHR0X3Jvd3NbVlRFUk1dKys7CisgICAgICAgICAgICAgICAgICBWc2NybkluaXQoVlRFUk0pOyAgICAgLyogSGVpZ2h0IHNldCBoZXJlICovCisjaWZkZWYgVE5DT0RFCisgICAgICAgICAgICAgICAgICBpZiAoVEVMT1BUX01FKFRFTE9QVF9OQVdTKSkKKyAgICAgICAgICAgICAgICAgICAgdG5fc25hd3MoKTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyNpZmRlZiBSTE9HQ09ERQorICAgICAgICAgICAgICAgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfTkFXUykpCisgICAgICAgICAgICAgICAgICAgIHJsb2dfbmF3cygpOworI2VuZGlmIC8qIFJMT0dDT0RFICovCisjaWZkZWYgU1NIQlVJTFRJTgorICAgICAgICAgICAgICAgICAgaWYgKFRFTE9QVF9NRShURUxPUFRfTkFXUykpCisgICAgICAgICAgICAgICAgICAgIHNzaF9zbmF3cygpOworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4oMSk7CisgICAgICB9CisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBOVAorICAgICAgY2FzZSBYWVRBVFRCVUc6CisgICAgICAgIGlmICgoeSA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgdHRfYXR0cl9idWcgPSB5OworICAgICAgICByZXR1cm4oMSk7CisjZW5kaWYgLyogTlQgKi8KKworI2lmZGVmIE9TMgorICAgICAgY2FzZSBYWVRTR1JDOgorICAgICAgICBpZiAoKHkgPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIHNncmNvbG9ycyA9IHk7CisgICAgICAgIHJldHVybigxKTsKKworICAgICAgY2FzZSBYWVRTRU5EOgorICAgICAgICAgIGlmICgoeSA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgIHR0X3NlbmRkYXRhID0geTsKKyAgICAgICAgICByZXR1cm4oMSk7CisKKyAgICAgIGNhc2UgWFlUU0VPQjoKKyAgICAgICAgICBpZiAoKHkgPSBjbWtleSh0dHlzZW9idGFiLDIsIiIsInVzX2NyIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgIHd5X2Jsb2NrZW5kID0geTsKKyAgICAgICAgICByZXR1cm4oMSk7CisKKyAgICAgIGNhc2UgWFlUVVJMSEk6IHsKKyAgICAgICAgICBpbnQgZG9uZSA9IDAsIGF0dHIgPSBWVF9DSEFSX0FUVFJfTk9STUFMOworCisgICAgICAgICAgaWYgKCh4ID0gY21rZXkob25vZmYsMiwiIiwib24iLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIGlmICh4KSB7CisgICAgICAgICAgICAgIHogPSAwOworICAgICAgICAgICAgICB3aGlsZSAoIWRvbmUpIHsKKyAgICAgICAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KHR0eXByb3RhYixucHJvdGVjdCwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHo/ImRvbmUiOiJyZXZlcnNlIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgc3dpdGNoICh5KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFRBVFRET05FOgorICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUQVRUQkxJOgorICAgICAgICAgICAgICAgICAgICAgIGF0dHIgfD0gVlRfQ0hBUl9BVFRSX0JMSU5LOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUQVRUUkVWOgorICAgICAgICAgICAgICAgICAgICAgIGF0dHIgfD0gVlRfQ0hBUl9BVFRSX1JFVkVSU0U7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFRBVFRJVEE6CisgICAgICAgICAgICAgICAgICAgICAgYXR0ciB8PSBWVF9DSEFSX0FUVFJfSVRBTElDOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUQVRUVU5EOgorICAgICAgICAgICAgICAgICAgICAgIGF0dHIgfD0gVlRfQ0hBUl9BVFRSX1VOREVSTElORTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVEFUVEJMRDoKKyAgICAgICAgICAgICAgICAgICAgICBhdHRyIHw9IFZUX0NIQVJfQVRUUl9CT0xEOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUQVRURElNOgorICAgICAgICAgICAgICAgICAgICAgIGF0dHIgfD0gVlRfQ0hBUl9BVFRSX0RJTTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVEFUVElOVjoKKyAgICAgICAgICAgICAgICAgICAgICBhdHRyIHw9IFZUX0NIQVJfQVRUUl9JTlZJU0lCTEU7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFRBVFROT1I6CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB6ID0gMTsgICAgICAgICAgICAgICAgLyogT25lIGF0dHJpYnV0ZSBoYXMgYmVlbiBjaG9zZW4gKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgICBzZXR1cmxobCh4KTsKKyAgICAgICAgICBpZiAoeCkKKyAgICAgICAgICAgIHR0X3VybF9oaWxpdGVfYXR0ciA9IGF0dHI7CisgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgfQorICAgICAgY2FzZSBYWVRBVFRSOgorICAgICAgICBpZiAoKHggPSBjbWtleSh0dHlhdHRydGFiLG5hdHRyaWIsIiIsInVuZGVybGluZSIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBzd2l0Y2ggKHgpIHsKKyAgICAgICAgICBjYXNlIFRUQVRUQkxJOgorICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkob25vZmYsMiwiIiwib24iLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgICAgIHRydWVibGluayA9IHk7CisjaWZuZGVmIEtVSQorICAgICAgICAgICAgaWYgKCAhdHJ1ZWJsaW5rICYmIHRydWV1bmRlcmxpbmUgKSB7CisgICAgICAgICAgICAgICAgdHJ1ZXVuZGVybGluZSA9IDA7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiBVbmRlcmxpbmUgYmVpbmcgc2ltdWxhdGVkIGJ5IGNvbG9yLlxuIik7CisgICAgICAgICAgICB9CisKKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBUVEFUVERJTToKKyAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgICAgICB0cnVlZGltID0geTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBUVEFUVFJFVjoKKyAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgICAgICB0cnVlcmV2ZXJzZSA9IHk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgVFRBVFRVTkQ6CisgICAgICAgICAgICBpZiAoKHkgPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgICAgdHJ1ZXVuZGVybGluZSA9IHk7CisjaWZuZGVmIEtVSQorICAgICAgICAgICAgaWYgKCF0cnVlYmxpbmsgJiYgdHJ1ZXVuZGVybGluZSkgeworICAgICAgICAgICAgICAgIHRydWVibGluayA9IDE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiBUcnVlIGJsaW5rIG1vZGUgaXMgYWN0aXZlLlxuIik7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogS1VJICovCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgVFRBVFRJVEE6CisgICAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgICAgICAgdHJ1ZWl0YWxpYyA9IHk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgVFRBVFRQUk86IHsgICAgICAvKiBTZXQgZGVmYXVsdCBQcm90ZWN0ZWQgQ2hhcmFjdGVyIGF0dHJpYnV0ZSAqLworICAgICAgICAgICAgICBleHRlcm4gdnRhdHRyaWIgV1BhdHRyaWI7ICAgIC8qIGN1cnJlbnQgV1AgTW9kZSBBdHRyaWIgKi8KKyAgICAgICAgICAgICAgZXh0ZXJuIHZ0YXR0cmliIGRlZldQYXR0cmliOyAvKiBkZWZhdWx0IFdQIE1vZGUgQXR0cmliICovCisgICAgICAgICAgICAgIHZ0YXR0cmliIHdwYSA9IHswLDAsMCwwLDAsMSwwLDAsMCwwLDB9OyAgIC8qIFByb3RlY3RlZCAqLworICAgICAgICAgICAgICBpbnQgZG9uZSA9IDA7CisKKyAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgIHdoaWxlICghZG9uZSkgeworICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkodHR5cHJvdGFiLG5wcm90ZWN0LCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeD8iZG9uZSI6ImRpbSIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAoeSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUQVRUTk9SOgorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUQVRUQkxJOiAgICAgIC8qIEJsaW5raW5nIGRvZXNuJ3Qgd29yayAqLworICAgICAgICAgICAgICAgICAgICAgIHdwYS5ibGlua2luZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFRBVFRSRVY6CisgICAgICAgICAgICAgICAgICAgICAgd3BhLnJldmVyc2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVEFUVElUQToKKyAgICAgICAgICAgICAgICAgICAgICB3cGEuaXRhbGljID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVEFUVFVORDoKKyAgICAgICAgICAgICAgICAgICAgICB3cGEudW5kZXJsaW5lZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFRBVFRCTEQ6CisgICAgICAgICAgICAgICAgICAgICAgd3BhLmJvbGQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUQVRURElNOgorICAgICAgICAgICAgICAgICAgICAgIHdwYS5kaW0gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUQVRUSU5WOgorICAgICAgICAgICAgICAgICAgICAgIHdwYS5pbnZpc2libGUgPSBUUlVFIDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVEFUVERPTkU6CisgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB4ID0gMTsgICAgICAgICAgICAgICAgLyogT25lIGF0dHJpYnV0ZSBoYXMgYmVlbiBjaG9zZW4gKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgICAgICAgV1BhdHRyaWIgPSBkZWZXUGF0dHJpYiA9IHdwYTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybigxKTsKKworICAgICAgY2FzZSBYWVRLRVk6IHsgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBURVJNSU5BTCBLRVkgKi8KKyAgICAgICAgICBpbnQgdCwgeCwgeTsKKyAgICAgICAgICBpbnQgY2xlYXIgPSAwLCBkZWZsdCA9IDA7CisgICAgICAgICAgaW50IGNvbmZpcm1lZCA9IDA7CisgICAgICAgICAgaW50IGZsYWcgPSAwOworICAgICAgICAgIGludCBrYyA9IC0xOyAgICAgICAgICAgICAgICAgIC8qIEtleSBjb2RlICovCisgICAgICAgICAgaW50IGxpdHN0ciA9IDA7ICAgICAgICAgICAgICAgLyogTGl0ZXJhbCBTdHJpbmc/ICovCisgICAgICAgICAgY2hhciAqcyA9IE5VTEw7ICAgICAgICAgICAgICAgLyogS2V5IGJpbmRpbmcgKi8KKyNpZm5kZWYgTk9LVkVSQlMKKyAgICAgICAgICBjaGFyICpwID0gTlVMTDsgICAgICAgICAgICAgICAvKiBXb3JrZXIgKi8KKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworICAgICAgICAgIGNvbl9ldmVudCBkZWZldnQ7CisgICAgICAgICAgZXh0ZXJuIGludCBvczJna3M7CisgICAgICAgICAgZXh0ZXJuIGludCBtc2trZXlzOworICAgICAgICAgIGV4dGVybiBpbnQgaW5pdHZpazsKKyAgICAgICAgICBzdHJ1Y3QgRkRCIGt3LHN3LG51LGNtOworCisgICAgICAgICAgZGVmZXZ0LnR5cGUgPSBlcnJvcjsKKworICAgICAgICAgIGlmICgodCA9IGNta2V5KHR0a2V5dGFiLG50dGtleSwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih0KTsKKyAgICAgICAgICBjbWZkYmkoJm51LCAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBGREIgLSBjb21tYW5kIHN3aXRjaGVzICovCisgICAgICAgICAgICAgICAgIF9DTU5VTSwgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgICAgICAgIi9saXRlcmFsLCBrZXljb2RlLCBvciBhY3Rpb24iLAorICAgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiByYWRpeCAqLworICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiAwICovCisgICAgICAgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIEtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgJnN3ICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgICAgICAgLyogICovCisgICAgICAgICAgY21mZGJpKCZzdywgICAgICAgICAgICAgICAgICAgLyogU2Vjb25kIEZEQiAtIHN3aXRjaGVzICovCisgICAgICAgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgICAgICAgIG5zdHJtc3dpdGFiLCAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisgICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworICAgICAgICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgc3RybXN3aXRhYiwgICAgICAgICAgICAvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgICAgICAgICAgICZrdyAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICAgICAgICApOworICAgICAgICAgIGNtZmRiaSgma3csICAgICAgICAgICAgICAgICAgIC8qIFRoaXJkIEZEQiAtIGNvbW1hbmQgc3dpdGNoZXMgKi8KKyAgICAgICAgICAgICAgICAgX0NNS0VZLCAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAgICAgICAiL2xpdGVyYWwsIGtleWNvZGUsIG9yIGFjdGlvbiIsCisgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgICAgICAgIG5zdHJta2V5dGFiLCAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKyAgICAgICAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICAgIHN0cm1rZXl0YWIsICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAgICAgICAmY20gICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKyAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICBjbWZkYmkoJmNtLCAgICAgICAgICAgICAgICAgICAvKiBGaW5hbCBGREIgLSBDb25maXJtYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgX0NNQ0ZNLCAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKyAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisgICAgICAgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIEtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgd2hpbGUgKGtjIDwgMCkgeworICAgICAgICAgICAgICB4ID0gY21mZGIoJm51KTsgICAgICAgICAgIC8qIFBhcnNlIHNvbWV0aGluZyAqLworICAgICAgICAgICAgICBpZiAoeCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworCisgICAgICAgICAgICAgIHN3aXRjaCAoY21yZXN1bHQuZmNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIF9DTUNGTToKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiIFByZXNzIGtleSB0byBiZSBkZWZpbmVkOiAiKTsKKyAgICAgICAgICAgICAgICAgIGNvbmJpbigoY2hhcillc2NhcGUpOyAvKiBQdXQgdGVybWluYWwgaW4gYmluYXJ5IG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgIG9zMmdrcyA9IDA7ICAgICAgICAgICAvKiBUdXJuIG9mZiBLdmVyYiBwcmVwcm9jZXNzaW5nICovCisgICAgICAgICAgICAgICAgICBrYyA9IGNvbmdrcygwKTsgICAgICAgLyogR2V0IGNoYXJhY3RlciBvciBzY2FuIGNvZGUgKi8KKyAgICAgICAgICAgICAgICAgIG9zMmdrcyA9IDE7ICAgICAgICAgICAvKiBUdXJuIG9uIEt2ZXJiIHByZXByb2Nlc3NpbmcgKi8KKyAgICAgICAgICAgICAgICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7ICAvKiBSZXN0b3JlIHRlcm1pbmFsIHRvIGNicmVhayBtb2RlICovCisgICAgICAgICAgICAgICAgICBpZiAoa2MgPCAwKSB7ICAgICAgICAgLyogQ2hlY2sgZm9yIGVycm9yICovCisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/RXJyb3IgcmVhZGluZyBrZXlcbiIpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHNob2tleWNvZGUoa2MsdCk7ICAgICAvKiBTaG93IGN1cnJlbnQgZGVmaW5pdGlvbiAqLworICAgICAgICAgICAgICAgICAgZmxhZyA9IDE7ICAgICAgICAgICAgIC8qIFJlbWVtYmVyIGl0J3MgYSBtdWx0aWxpbmUgY29tbWFuZCAqLworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBfQ01OVU06CisgICAgICAgICAgICAgICAgICBrYyA9IGNtcmVzdWx0Lm5yZXN1bHQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIF9DTUtFWToKKyAgICAgICAgICAgICAgICAgIGlmIChjbXJlc3VsdC5mZGJhZGRyID09ICZzdykgeyAvKiBTd2l0Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICBpZiAoY21yZXN1bHQubnJlc3VsdCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbGl0c3RyID0gMTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21yZXN1bHQuZmRiYWRkciA9PSAma3cpIHsgLyogS2V5d29yZCAqLworICAgICAgICAgICAgICAgICAgICAgIGlmIChjbXJlc3VsdC5ucmVzdWx0ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjbGVhciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmbHQgPSAxOworICAgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXIpCisgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmtleW1hcCh0KTsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRrZXltYXAodCk7CisgICAgICAgICAgICAgICAgICAgICAgaW5pdHZpayA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgLyogTm9ybWFsIFNFVCBURVJNSU5BTCBLRVkgPHRlcm1pbmFsPiA8c2NhbmNvZGU+IDx2YWx1ZT4gY29tbWFuZC4uLiAqLworCisgICAgICAgICAgaWYgKG1za2tleXMpCisgICAgICAgICAgICBrYyA9IG1za3RvY2soa2MpOworCisgICAgICAgICAgaWYgKGtjIDwgMCB8fCBrYyA+PSBLTVNJWkUpIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCI/a2V5IGNvZGUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICVkXG4iLCBLTVNJWkUgLSAxKTsKKyAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGtjID09IGVzY2FwZSkgeworICAgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCAlZCBpcyB0aGUgQ09OTkVDVC1tb2RlIGVzY2FwZSBjaGFyYWN0ZXJcbiIsa2MpOworICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgIH0KKyAgICAgICAgICB3aWRlcmVzdWx0ID0gLTE7CisgICAgICAgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgICAgICAgY21zYXZwKHBzYXZlLFBST01QVEwpOworICAgICAgICAgICAgICBjbXNldHAoIiBFbnRlciBuZXcgZGVmaW5pdGlvbjogIik7CisgICAgICAgICAgICAgIGNtaW5pKGNreGVjaCk7CisgICAgICAgICAgfQorICAgICAgICBkZWZfYWdhaW46CisgICAgICAgICAgaWYgKGZsYWcpIHByb21wdChOVUxMKTsKKyAgICAgICAgICBpZiAoKHkgPSBjbXR4dCgia2V5IGRlZmluaXRpb24sXG5cCisgb3IgQ3RybC1DIHRvIGNhbmNlbCB0aGlzIGNvbW1hbmQsXG5cCisgb3IgRW50ZXIgdG8gcmVzdG9yZSBkZWZhdWx0IGRlZmluaXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICIiLCZzLE5VTEwpKSA8IDApIHsKKyAgICAgICAgICAgICAgaWYgKGZsYWcpICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgcGFyc2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgZ290byBkZWZfYWdhaW47CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgfQorICAgICAgICAgIHMgPSBicnN0cmlwKHMpOworI2lmbmRlZiBOT0tWRVJCUworICAgICAgICAgIHAgPSBzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhpcyBwbGFjZSAqLworI2VuZGlmIC8qIE5PS1ZFUkJTICovCisvKgorICBJZiB0aGUgZGVmaW5pdGlvbiBpbmNsdWRlZCBhbnkgXEt2ZXJicywgcXVvdGUgdGhlIGJhY2tzbGFzaCBzbyB0aGUgXEt2ZXJiCisgIHdpbGwgc3RpbGwgYmUgaW4gdGhlIGRlZmluaXRpb24gd2hlbiB0aGUga2V5IGlzIHByZXNzZWQuICBXZSBkb24ndCBkbyB0aGlzCisgIGluIHp6c3RyaW5nKCksIGJlY2F1c2UgXEt2ZXJicyBhcmUgdmFsaWQgb25seSBpbiB0aGlzIGNvbnRleHQgYW5kIG5vd2hlcmUKKyAgZWxzZS4KKworICBXZSB1c2UgdGhpcyBjb2RlIGFjdGl2ZSBmb3IgYWxsIHZlcnNpb25zIHRoYXQgc3VwcG9ydCBTRVQgS0VZLCBldmVuIGlmIHRoZXkKKyAgZG9uJ3Qgc3VwcG9ydCBcS3ZlcmJzLCBiZWNhdXNlIG90aGVyd2lzZSBcSyB3b3VsZCBiZWhhdmUgZGlmZmVyZW50bHkgZm9yCisgIGRpZmZlcmVudCB2ZXJzaW9ucy4KKyovCisgICAgICAgICAgZm9yICh4ID0gMCwgeSA9IDA7IHNbeF07IHgrKywgeSsrKSB7IC8qIENvbnZlcnQgXEsgdG8gXFxLICovCisgICAgICAgICAgICAgIGlmICgoeCA+IDApICYmCisgICAgICAgICAgICAgICAgICAoc1t4XSA9PSAnSycgfHwgc1t4XSA9PSAnaycpCisgICAgICAgICAgICAgICAgICApIHsgICAgICAgICAgICAgICAgICAgLyogSGF2ZSBLICovCisKKyAgICAgICAgICAgICAgICAgIGlmICgoeCA9PSAxICYmIHNbeC0xXSA9PSBDTURRKSB8fAorICAgICAgICAgICAgICAgICAgICAgICh4ID4gMSAmJiBzW3gtMV0gPT0gQ01EUSAmJiBzW3gtMl0gIT0gQ01EUSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBsaW5lW3krK10gPSBDTURROyAvKiBNYWtlIGl0IFxcSyAqLworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKHggPiAxICYmIHNbeC0xXSA9PSAneycgJiYgc1t4LTJdID09IENNRFEpIHsKKyAgICAgICAgICAgICAgICAgICAgICBsaW5lW3ktMV0gPSBDTURROyAvKiBIYXZlIFx7SyAqLworICAgICAgICAgICAgICAgICAgICAgIGxpbmVbeSsrXSA9ICd7JzsgIC8qIE1ha2UgaXQgXFx7SyAqLworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGxpbmVbeV0gPSBzW3hdOworICAgICAgICAgIH0KKyAgICAgICAgICBsaW5lW3krK10gPSBOVUw7ICAgICAgICAgICAgICAvKiBUZXJtaW5hdGUgKi8KKyAgICAgICAgICBzID0gbGluZSArIHkgKyAxOyAgICAgICAgICAgICAvKiBQb2ludCB0byBhZnRlciBpdCAqLworICAgICAgICAgIHggPSBMSU5CVUZTSVogLSAoaW50KSBzdHJsZW4obGluZSkgLSAxOyAvKiBHZXQgcmVtYWluaW5nIHNwYWNlICovCisgICAgICAgICAgaWYgKCh4IDwgKExJTkJVRlNJWiAvIDIpKSB8fAorICAgICAgICAgICAgICAoenpzdHJpbmcobGluZSwgJnMsICZ4KSA8IDApKSB7IC8qIEV4cGFuZCB2YXJpYWJsZXMsIGV0Yy4gKi8KKyAgICAgICAgICAgICAgcHJpbnRmKCI/S2V5IGRlZmluaXRpb24gdG9vIGxvbmdcbiIpOworICAgICAgICAgICAgICBpZiAoZmxhZykgY21zZXRwKHBzYXZlKTsKKyAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICB9CisgICAgICAgICAgcyA9IGxpbmUgKyB5ICsgMTsgICAgICAgICAgICAgLyogUG9pbnQgdG8gcmVzdWx0LiAqLworCisjaWZuZGVmIE5PS1ZFUkJTCisvKgorICBTcGVjaWFsIGNhc2U6IHNlZSBpZiB0aGUgZGVmaW5pdGlvbiBzdGFydHMgd2l0aCBhIFxLdmVyYi4KKyAgSWYgaXQgZG9lcywgcG9pbnQgdG8gaXQgd2l0aCBwLCBvdGhlcndpc2Ugc2V0IHAgdG8gTlVMTC4KKyovCisgICAgICAgICAgcCA9IHM7CisgICAgICAgICAgaWYgKCpwKysgPT0gQ01EUSkgeworICAgICAgICAgICAgICBpZiAoKnAgPT0gJ3snKSBwKys7CisgICAgICAgICAgICAgIHAgPSAoKnAgPT0gJ2snIHx8ICpwID09ICdLJykgPyBwICsgMSA6IE5VTEw7CisgICAgICAgICAgfQorI2VuZGlmIC8qIE5PS1ZFUkJTICovCisKKyAgICAgICAgICBzd2l0Y2ggKHN0cmxlbihzKSkgeyAgICAgICAgICAvKiBBY3Rpb24gZGVwZW5kcyBvbiBsZW5ndGggKi8KKyAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciBpbmRpdmlkdWFsIGtleSBkZWYgKi8KKyAgICAgICAgICAgICAgZGVsZXRla2V5bWFwKHQsa2MpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgaWYgKCFsaXRzdHIpIHsKKyAgICAgICAgICAgICAgICAgIGRlZmV2dC50eXBlID0ga2V5OyAgICAvKiBTaW5nbGUgY2hhcmFjdGVyICovCisgICAgICAgICAgICAgICAgICBkZWZldnQua2V5LnNjYW5jb2RlID0gKnM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIC8qIENoYXJhY3RlciBzdHJpbmcgKi8KKyNpZm5kZWYgTk9LVkVSQlMKKyAgICAgICAgICAgICAgaWYgKHApIHsKKyAgICAgICAgICAgICAgICAgIHkgPSB4bG9va3VwKGt2ZXJicyxwLG5rdmVyYnMsJngpOyAvKiBMb29rIGl0IHVwICovCisgICAgICAgICAgICAgICAgICAvKiBOZWVkIGV4YWN0IG1hdGNoICovCisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJzZXQga2V5IGt2ZXJiIGxvb2t1cCIsMCx5KTsKKyAgICAgICAgICAgICAgICAgIGlmICh5ID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICBkZWZldnQudHlwZSA9IGt2ZXJiOworICAgICAgICAgICAgICAgICAgICAgIGRlZmV2dC5rdmVyYi5pZCA9IHk7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworICAgICAgICAgICAgICBpZiAobGl0c3RyKSB7CisgICAgICAgICAgICAgICAgICBkZWZldnQudHlwZSA9IGxpdGVyYWw7CisgICAgICAgICAgICAgICAgICBkZWZldnQubGl0ZXJhbC5zdHJpbmcgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHMpKzEpOworICAgICAgICAgICAgICAgICAgaWYgKGRlZmV2dC5saXRlcmFsLnN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGRlZmV2dC5saXRlcmFsLnN0cmluZywgcyk7IC8qIHNhZmUgKi8KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGRlZmV2dC50eXBlID0gbWFjcm87CisgICAgICAgICAgICAgICAgICBkZWZldnQubWFjcm8uc3RyaW5nID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihzKSsxKTsKKyAgICAgICAgICAgICAgICAgIGlmIChkZWZldnQubWFjcm8uc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICBzdHJjcHkoZGVmZXZ0Lm1hY3JvLnN0cmluZywgcyk7IC8qIHNhZmUgKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaW5zZXJ0a2V5bWFwKHQsIGtjLCBkZWZldnQpOworICAgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICAgY21zZXRwKHBzYXZlKTsKKyAgICAgICAgICBpbml0dmlrID0gMTsgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgVklLIHRhYmxlICovCisgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgfQorCisjaWZkZWYgUENURVJNCisgICAgICBjYXNlIFhZVFBDVEVSTTogICAgICAgICAgICAgICAgICAgLyogUENURVJNIEtleWJvYXJkIE1vZGUgKi8KKyAgICAgICAgaWYgKCh4ID0gc2V0b24oJnR0X3BjdGVybSkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworI2VuZGlmIC8qIFBDVEVSTSAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgQ0tfVFJJR0dFUgorICAgICAgY2FzZSBYWVRSSUdHRVI6CisgICAgICAgIGlmICgoeSA9IGNtdHh0KCJTdHJpbmcgdG8gdHJpZ2dlciBhdXRvbWF0aWMgcmV0dXJuIHRvIGNvbW1hbmQgbW9kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgbWFrZWxpc3Qocyx0dF90cmlnZ2VyLFRSSUdHRVJTKTsKKyAgICAgICAgcmV0dXJuKDEpOworI2VuZGlmIC8qIENLX1RSSUdHRVIgKi8KKworI2lmZGVmIE9TMgorICAgICAgY2FzZSBYWVRTQUM6CisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJBU0NJSSB2YWx1ZSB0byB1c2UgZm9yIHNwYWNpbmcgYXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICIzMiIsMTAsJngseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgdHRfc2FjID0geDsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgY2FzZSBYWVRLQkRHTDogeyAgICAgIC8qIFNFVCBURVJNIEtCRC1GT0xMT1dTLUdML0dSICovCisgICAgICAgICAgZXh0ZXJuIGludCB0dF9rYl9nbGdyOyAgICAgICAgLyogZnJvbSBja29jbzMuYyAqLworICAgICAgICAgIGlmICgoeCA9IHNldG9uKCZ0dF9rYl9nbGdyKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIH0KKyNpZm5kZWYgTk9DU0VUUworICAgICAgY2FzZSBYWVRWVExORzogICAgICAgIC8qIFNFVCBURVJNIERFQy1MQU5HVUFHRSAqLworICAgICAgICBpZiAoKHkgPSBjbWtleSh2dGxhbmd0YWIsbnZ0bGFuZ3RhYiwiVlQgbGFuZ3VhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICBJUzk3ODAxKHR0X3R5cGVfbW9kZSk/Imdlcm1hbiI6Im5vcnRoLWFtZXJpY2FuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKworICAgICAgICAvKiBBIHJlYWwgVlQgdGVybWluYWwgd291bGQgdXNlIHRoZSBsYW5ndWFnZSB0byBzZXQgdGhlICAgKi8KKyAgICAgICAgLyogZGVmYXVsdCBrZXlib2FyZCBsYW5ndWFnZSBmb3IgYm90aCA4LWJpdCBtdWx0aW5hdGlvbmFsICovCisgICAgICAgIC8qIGFuZCA3LWJpdCBuYXRpb25hbCBtb2Rlcy4gIEZvciA4LWJpdCBtb2RlIGl0IHdvdWxkICAgICAqLworICAgICAgICAvKiBzZXQgdGhlIHRlcm1pbmFsIGNoYXJhY3Rlci1zZXQgdG8gdGhlIElTTyBzZXQgaWYgaXQgICAgKi8KKyAgICAgICAgLyogaXMgbm90IGFscmVhZHkgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIExhdGluLTEgY2FuIGJlIHJlcGxhY2VkIGJ5IERFQyBNdWx0aW5hdGlvbmFsICAgICAgICAgICAqLworICAgICAgICBzd2l0Y2ggKHkpIHsKKyAgICAgICAgICBjYXNlIFZUTF9OT1JUSF9BTTogIC8qIE5vcnRoIEFtZXJpY2FuICovCisgICAgICAgICAgICAvKiBNdWx0aW5hdGlvbmFsOiBMYXRpbi0xICAgKi8KKyAgICAgICAgICAgIC8qIE5hdGlvbmFsOiAgICAgIFVTX0FTQ0lJICAqLworICAgICAgICAgICAgZGVjX2xhbmcgPSB5OworICAgICAgICAgICAgZGVjX25yYyA9IFRYX0FTQ0lJOworICAgICAgICAgICAgZGVjX2tiZCA9IFRYXzg4NTlfMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVlRMX0JSSVRJU0ggOgorICAgICAgICAgICAgLyogTXVsdGluYXRpb25hbDogTGF0aW4tMSAgICovCisgICAgICAgICAgICAvKiBOYXRpb25hbDogICAgICBVS19BU0NJSSAgKi8KKyAgICAgICAgICAgIGRlY19sYW5nID0geTsKKyAgICAgICAgICAgIGRlY19ucmMgPSBUWF9CUklUSVNIOworICAgICAgICAgICAgZGVjX2tiZCA9IFRYXzg4NTlfMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVlRMX0ZSRU5DSCAgOgorICAgICAgICAgIGNhc2UgVlRMX0JFTEdJQU4gOgorICAgICAgICAgIGNhc2UgVlRMX0NBTkFESUFOOgorICAgICAgICAgICAgLyogTXVsdGluYXRpb25hbDogTGF0aW4tMSAgICovCisgICAgICAgICAgICAvKiBOYXRpb25hbDogICAgICBGUl9BU0NJSSAgKi8KKyAgICAgICAgICAgIGRlY19sYW5nID0geTsKKyAgICAgICAgICAgIGRlY19ucmMgPSBUWF9GUkVOQ0g7CisgICAgICAgICAgICBkZWNfa2JkID0gVFhfODg1OV8xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBWVExfRlJfQ0FOICA6CisgICAgICAgICAgICAvKiBNdWx0aW5hdGlvbmFsOiBMYXRpbi0xICAgKi8KKyAgICAgICAgICAgIC8qIE5hdGlvbmFsOiAgICAgIEZDX0FTQ0lJICAqLworICAgICAgICAgICAgZGVjX2xhbmcgPSB5OworICAgICAgICAgICAgZGVjX25yYyA9IFRYX0NOX0ZSRU5DSDsKKyAgICAgICAgICAgIGRlY19rYmQgPSBUWF84ODU5XzE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFZUTF9EQU5JU0ggIDoKKyAgICAgICAgICBjYXNlIFZUTF9OT1JXRUdJQToKKyAgICAgICAgICAgIC8qIE11bHRpbmF0aW9uYWw6IExhdGluLTEgICAqLworICAgICAgICAgICAgLyogTmF0aW9uYWw6ICAgICAgTk9fQVNDSUkgICovCisgICAgICAgICAgICBkZWNfbGFuZyA9IHk7CisgICAgICAgICAgICBkZWNfbnJjID0gVFhfTk9SV0VHSUFOOworICAgICAgICAgICAgZGVjX2tiZCA9IFRYXzg4NTlfMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVlRMX0ZJTk5JU0ggOgorICAgICAgICAgICAgLyogTXVsdGluYXRpb25hbDogTGF0aW4tMSAgICovCisgICAgICAgICAgICAvKiBOYXRpb25hbDogICAgICBGSV9BU0NJSSAgKi8KKyAgICAgICAgICAgIGRlY19sYW5nID0geTsKKyAgICAgICAgICAgIGRlY19ucmMgPSBUWF9GSU5OSVNIOworICAgICAgICAgICAgZGVjX2tiZCA9IFRYXzg4NTlfMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVlRMX0dFUk1BTiAgOgorICAgICAgICAgICAgLyogTXVsdGluYXRpb25hbDogTGF0aW4tMSAgICovCisgICAgICAgICAgICAvKiBOYXRpb25hbDogICAgICBHUl9BU0NJSSAgKi8KKyAgICAgICAgICAgIGRlY19sYW5nID0geTsKKyAgICAgICAgICAgIGRlY19ucmMgPSBUWF9HRVJNQU47CisgICAgICAgICAgICBkZWNfa2JkID0gVFhfODg1OV8xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBWVExfRFVUQ0ggICA6CisgICAgICAgICAgICAvKiBNdWx0aW5hdGlvbmFsOiBMYXRpbi0xICAgKi8KKyAgICAgICAgICAgIC8qIE5hdGlvbmFsOiAgICAgIERVX0FTQ0lJICAqLworICAgICAgICAgICAgZGVjX2xhbmcgPSB5OworICAgICAgICAgICAgZGVjX25yYyA9IFRYX0RVVENIOworICAgICAgICAgICAgZGVjX2tiZCA9IFRYXzg4NTlfMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVlRMX0lUQUxJQU4gOgorICAgICAgICAgICAgLyogTXVsdGluYXRpb25hbDogTGF0aW4tMSAgICovCisgICAgICAgICAgICAvKiBOYXRpb25hbDogICAgICBJVF9BU0NJSSAgKi8KKyAgICAgICAgICAgIGRlY19sYW5nID0geTsKKyAgICAgICAgICAgIGRlY19ucmMgPSBUWF9JVEFMSUFOOworICAgICAgICAgICAgZGVjX2tiZCA9IFRYXzg4NTlfMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVlRMX1NXX0ZSICAgOgorICAgICAgICAgIGNhc2UgVlRMX1NXX0dSICAgOgorICAgICAgICAgICAgLyogTXVsdGluYXRpb25hbDogTGF0aW4tMSAgICovCisgICAgICAgICAgICAvKiBOYXRpb25hbDogICAgICBDSF9BU0NJSSAgKi8KKyAgICAgICAgICAgIGRlY19sYW5nID0geTsKKyAgICAgICAgICAgIGRlY19ucmMgPSBUWF9TV0lTUzsKKyAgICAgICAgICAgIGRlY19rYmQgPSBUWF84ODU5XzE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFZUTF9TV0VESVNIIDoKKyAgICAgICAgICAgIC8qIE11bHRpbmF0aW9uYWw6IExhdGluLTEgICAqLworICAgICAgICAgICAgLyogTmF0aW9uYWw6ICAgICAgU1dfQVNDSUkgICovCisgICAgICAgICAgICBkZWNfbGFuZyA9IHk7CisgICAgICAgICAgICBkZWNfbnJjID0gVFhfU1dFRElTSDsKKyAgICAgICAgICAgIGRlY19rYmQgPSBUWF84ODU5XzE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFZUTF9TUEFOSVNIIDoKKyAgICAgICAgICAgIC8qIE11bHRpbmF0aW9uYWw6IExhdGluLTEgICAqLworICAgICAgICAgICAgLyogTmF0aW9uYWw6ICAgICAgU1BfQVNDSUkgICovCisgICAgICAgICAgICBkZWNfbGFuZyA9IHk7CisgICAgICAgICAgICBkZWNfbnJjID0gVFhfU1BBTklTSDsKKyAgICAgICAgICAgIGRlY19rYmQgPSBUWF84ODU5XzE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFZUTF9QT1JUVUdFUzoKKyAgICAgICAgICAgIC8qIE11bHRpbmF0aW9uYWw6IExhdGluLTEgICAqLworICAgICAgICAgICAgLyogTmF0aW9uYWw6ICAgICAgUG9ydHVnZXNlIEFTQ0lJICAqLworICAgICAgICAgICAgZGVjX2xhbmcgPSB5OworICAgICAgICAgICAgZGVjX25yYyA9IFRYX1BPUlRVR1VFU0U7CisgICAgICAgICAgICBkZWNfa2JkID0gVFhfODg1OV8xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBWVExfSEVCUkVXICA6CisgICAgICAgICAgICAvKiBNdWx0aW5hdGlvbmFsOiBMYXRpbi1IZWJyZXcgLyBERUMtSGVicmV3ICAqLworICAgICAgICAgICAgLyogTmF0aW9uYWw6ICAgICAgREVDIDctYml0IEhlYnJldyAgKi8KKyAgICAgICAgICAgIGRlY19sYW5nID0geTsKKyAgICAgICAgICAgIGRlY19ucmMgPSBUWF9IRTc7CisgICAgICAgICAgICBkZWNfa2JkID0gVFhfODg1OV84OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBWVExfR1JFRUsgICA6CisgICAgICAgICAgICAvKiBNdWx0aW5hdGlvbmFsOiBMYXRpbi1HcmVlayAvIERFQy1HcmVlayAgICovCisgICAgICAgICAgICAvKiBOYXRpb25hbDogICAgICBERUMgR3JlZWsgTlJDICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBpcyBFTE9UOTI3IGVxdWl2YWxlbnQgdG8gREVDIEdyZWVrPz8/PyAgICovCisgICAgICAgICAgICBkZWNfbGFuZyA9IHk7CisgICAgICAgICAgICBkZWNfbnJjID0gVFhfRUxPVDkyNzsKKyAgICAgICAgICAgIGRlY19rYmQgPSBUWF84ODU5Xzc7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgY2FzZSBWVExfVFVSS19RICA6CisgICAgICAgICAgY2FzZSBWVExfVFVSS19GICA6CisgICAgICAgICAgICAvKiBNdWx0aW5hdGlvbmFsOiBMYXRpbi1UdXJraXNoIC8gREVDLVR1cmtpc2ggICAqLworICAgICAgICAgICAgLyogTmF0aW9uYWw6ICAgICAgREVDIDctYml0IFR1cmtpc2ggICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICBjYXNlIFZUTF9IVU5HQVJJQToKKyAgICAgICAgICAgIC8qIE11bHRpbmF0aW9uYWw6IExhdGluLTIgICAqLworICAgICAgICAgICAgLyogTmF0aW9uYWw6ICAgICAgbm8gbmF0aW9uYWwgbW9kZSAgKi8KKyAgICAgICAgICAgIGRlY19sYW5nID0geTsKKyAgICAgICAgICAgIGRlY19ucmMgPSBUWF9IVU5HQVJJQU47CisgICAgICAgICAgICBkZWNfa2JkID0gVFhfODg1OV8yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBWVExfU0xPVkFLICA6CisgICAgICAgICAgY2FzZSBWVExfQ1pFQ0ggICA6CisgICAgICAgICAgY2FzZSBWVExfUE9MSVNIICA6CisgICAgICAgICAgY2FzZSBWVExfUk9NQU5JQU46CisgICAgICAgICAgICAvKiBNdWx0aW5hdGlvbmFsOiBMYXRpbi0yICAgKi8KKyAgICAgICAgICAgIC8qIE5hdGlvbmFsOiAgICAgIG5vIG5hdGlvbmFsIG1vZGUgICovCisgICAgICAgICAgICBkZWNfbGFuZyA9IHk7CisgICAgICAgICAgICBkZWNfbnJjID0gVFhfQVNDSUk7CisgICAgICAgICAgICBkZWNfa2JkID0gVFhfODg1OV8yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBWVExfUlVTU0lBTiA6CisgICAgICAgICAgICAvKiBNdWx0aW5hdGlvbmFsOiBMYXRpbi1DeXJpbGxpYyAvIEtPSS04ICAgKi8KKyAgICAgICAgICAgIC8qIE5hdGlvbmFsOiAgICAgIERFQyBSdXNzaWFuIE5SQyAgKi8KKyAgICAgICAgICAgIGRlY19sYW5nID0geTsKKyAgICAgICAgICAgIGRlY19ucmMgPSBUWF9LT0k3OworICAgICAgICAgICAgZGVjX2tiZCA9IFRYXzg4NTlfNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVlRMX0xBVElOX0FNOgorICAgICAgICAgICAgLyogTXVsdGluYXRpb25hbDogbm90IGxpc3RlZCBpbiB0YWJsZSAgICovCisgICAgICAgICAgICAvKiBOYXRpb25hbDogICAgICBub3QgbGlzdGVkIGluIHRhYmxlICAqLworICAgICAgICAgICAgZGVjX2xhbmcgPSB5OworICAgICAgICAgICAgZGVjX25yYyA9IFRYX0FTQ0lJOworICAgICAgICAgICAgZGVjX2tiZCA9IFRYXzg4NTlfMTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICBjYXNlIFZUTF9TQ1MgICAgIDoKKyAgICAgICAgICAgIC8qIE11bHRpbmF0aW9uYWw6IExhdGluLTIgICAqLworICAgICAgICAgICAgLyogTmF0aW9uYWw6ICAgICAgU0NTIE5SQyAgICovCisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKElTOTc4MDEodHRfdHlwZV9tb2RlKSkgeworICAgICAgICAgICAgU05JX2JpdG1vZGUoY21hc2sgPT0gMDM3NyA/IDggOiA3KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworICAgICAgY2FzZSBYWVRWVE5SQzogeyAgICAgICAgICAgICAgICAgIC8qIFNFVCBURVJNIERFQy1OUkMtTU9ERSAqLworICAgICAgICAgIGV4dGVybiBpbnQgZGVjbnJjbV91c3IsIGRlY25yY207ICAgICAgICAvKiBmcm9tIGNrb2NvMy5jICovCisgICAgICAgICAgaWYgKCh4ID0gc2V0b24oJmRlY25yY21fdXNyKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIGRlY25yY20gPSBkZWNucmNtX3VzcjsKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorICAgICAgY2FzZSBYWVRTTklQTTogeyAgICAgICAgICAgICAgICAgIC8qIFNFVCBURVJNIFNOSS1QQUdFTU9ERSAqLworICAgICAgICAgIGV4dGVybiBpbnQgc25pX3BhZ2Vtb2RlLCBzbmlfcGFnZW1vZGVfdXNyOworICAgICAgICAgIGlmICgoeSA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgIHNuaV9wYWdlbW9kZV91c3IgPSBzbmlfcGFnZW1vZGUgPSB5OworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICB9CisgICAgICBjYXNlIFhZVFNOSVNNOiB7ICAgICAgICAgICAgICAgICAgLyogU0VUIFRFUk0gU05JLVNDUk9MTE1PREUgKi8KKyAgICAgICAgICBleHRlcm4gaW50IHNuaV9zY3JvbGxfbW9kZSwgc25pX3Njcm9sbF9tb2RlX3VzcjsKKyAgICAgICAgICBpZiAoKHkgPSBjbWtleShvbm9mZiwyLCIiLCJvbiIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgICBzbmlfc2Nyb2xsX21vZGVfdXNyID0gc25pX3Njcm9sbF9tb2RlID0geTsKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorICAgICAgY2FzZSBYWVRTTklDQzogeyAgLyogU0VUIFRFUk0gU05JLUNILkNPREUgKi8KKyAgICAgICAgICBleHRlcm4gaW50IHNuaV9jaGNvZGVfdXNyOworICAgICAgICAgIGlmICgoeSA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgIHNuaV9jaGNvZGVfdXNyID0geTsKKyAgICAgICAgICBTTklfY2hjb2RlKHkpOworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICB9CisgICAgICBjYXNlIFhZVFNOSUZWOiB7ICAvKiBTRVQgVEVSTSBTTkktRklSTVdBUkUtVkVSU0lPTlMgKi8KKyAgICAgICAgICBleHRlcm4gQ0hBUiBzbmlfa2JkX2Zpcm13YXJlW10sIHNuaV90ZXJtX2Zpcm13YXJlW107CisgICAgICAgICAgQ0hBUiBrYmRbN10sdGVybVs3XTsKKworICAgICAgICAgIGlmICgoeCA9IGNtZmxkKCJLZXlib2FyZCBGaXJtd2FyZSBWZXJzaW9uIixzbmlfa2JkX2Zpcm13YXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICBpZiAoKGludClzdHJsZW4ocykgIT0gNikgeworICAgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSAtIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIG11c3QgYmUgNiBkaWdpdHMgbG9uZ1xuIik7CisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgaWYgKCFpc2RpZ2l0KHNbaV0pKSB7CisgICBwcmludGYoIj9Tb3JyeSAtIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIGNhbiBvbmx5IGNvbnRhaW4gZGlnaXRzIFswLTldXG4iKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgY2tzdHJuY3B5KGtiZCxzLDcpOworCisgICAgICAgICAgaWYgKCh4ID0gY21mbGQoIlRlcm1pbmFsIEZpcm13YXJlIFZlcnNpb24iLHNuaV90ZXJtX2Zpcm13YXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzLCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICBpZiAoKGludClzdHJsZW4ocykgIT0gNikgeworICAgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSAtIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIG11c3QgYmUgNiBkaWdpdHMgbG9uZ1xuIik7CisgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgaWYgKCFpc2RpZ2l0KHNbaV0pKSB7CisgICBwcmludGYoIj9Tb3JyeSAtIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIGNhbiBvbmx5IGNvbnRhaW4gZGlnaXRzIFswLTldXG4iKTsKKyAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGNrc3RybmNweSh0ZXJtLHMsNyk7CisgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisKKyAgICAgICAgICBja3N0cm5jcHkoc25pX2tiZF9maXJtd2FyZSxrYmQsNyk7CisgICAgICAgICAgY2tzdHJuY3B5KHNuaV90ZXJtX2Zpcm13YXJlLHRlcm0sNyk7CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisKKyAgICBjYXNlIFhZVExTUDogeyAgICAgICAgICAgICAgLyogU0VUIFRFUk0gTElORS1TUEFDSU5HICovCisgICAgICAgIGlmICgoeCA9IGNtZmxkKCJMaW5lIFNwYWNpbmciLCIxIiwmcywgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoaXNmbG9hdChzLDApIDwgMSkgewkJLyogKHNldHMgZmxvYXR2YWwpICovCisgICAgICAgICAgICBwcmludGYoIj9JbnRlZ2VyIG9yIGZsb2F0aW5nLXBvaW50IG51bWJlciByZXF1aXJlZFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIGlmIChmbG9hdHZhbCA8IDEuMCB8fCBmbG9hdHZhbCA+IDMuMCkgeworICAgICAgICAgICAgcHJpbnRmKCI/VmFsdWUgbXVzdCB3aXRoaW4gdGhlIHJhbmdlIDEuMCBhbmQgMy4wIChpbmNsdXNpdmUpXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisjaWZkZWYgS1VJCisgICAgICAgIHR0X2xpbmVzcGFjaW5nW1ZDTURdID0gdHRfbGluZXNwYWNpbmdbVlRFUk1dID0gZmxvYXR2YWw7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZWxzZSAvKiBLVUkgKi8KKyAgICAgICAgcHJpbnRmKCI/U29ycnksIExpbmUtc3BhY2luZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBLOTVHLkVYRS5cbiIpOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIEtVSSAqLworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKworICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3VsZG4ndCBnZXQgaGVyZS4gKi8KKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9CisjZW5kaWYgLyogTUFDICovCisjaWZkZWYgQ09NTUVOVAorICAgIC8qCisgICAgICBUaGlzIHdhcyBzdXBwb3NlZCB0byBzaHV0IHVwIHBpY2t5IGNvbXBpbGVycyBidXQgaW5zdGVhZCBpdCBtYWtlcworICAgICAgbW9zdCBjb21waWxlcnMgY29tcGxhaW4gYWJvdXQgInN0YXRlbWVudCBub3QgcmVhY2hlZCIuCisgICAgKi8KKyAgICByZXR1cm4oLTIpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBPUzIKK3JldHVybigtMik7CisjZW5kaWYgLyogT1MyICovCit9CisKKyNpZmRlZiBPUzIKK2ludAorc2V0dGl0bGUodm9pZCkgeworICAgIGV4dGVybiBjaGFyIHVzZXJ0aXRsZVtdOworICAgIGlmICgoeSA9IGNtdHh0KCJ0aXRsZSB0ZXh0IiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih5KTsKKyNpZmRlZiBJS1NECisgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgIHByaW50ZigiP1NvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICB9CisjZW5kaWYgLyogSUtTRCAqLworICAgIHMgPSBicnN0cmlwKHMpOworICAgIGNrc3RybmNweSh1c2VydGl0bGUscyw2NCk7CisgICAgb3Myc2V0dGl0bGUoIiIsMSk7CisgICAgcmV0dXJuKDEpOworfQorCitzdGF0aWMgc3RydWN0IGtleXRhYiBkaWFsZXJ0YWJbXSA9IHsgICAgLyogSzk1IERpYWxlciB0eXBlcyAqLworICAgICJiYWNrc3BhY2UiLCAgICAgICAgMCwgMCwKKyAgICAiZW50ZXIiLCAgICAgICAgICAgIDEsIDAKK307CitzdGF0aWMgaW50IG5kaWFsZXIgPSAyOworCitpbnQKK3NldGRpYWxlcih2b2lkKSB7CisgICAgaW50IHQsIHgsIHk7CisgICAgaW50IGNsZWFyID0gMCwgZGVmbHQgPSAwOworICAgIGludCBrYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtleSBjb2RlICovCisgICAgY2hhciAqcyA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgLyogS2V5IGJpbmRpbmcgKi8KKyNpZm5kZWYgTk9LVkVSQlMKKyAgICBjaGFyICpwID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAvKiBXb3JrZXIgKi8KKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworICAgIGNvbl9ldmVudCBkZWZldnQ7CisgICAgZXh0ZXJuIGludCBvczJna3M7CisgICAgZXh0ZXJuIGludCBtc2trZXlzOworICAgIGV4dGVybiBpbnQgaW5pdHZpazsKKworICAgIGRlZmV2dC50eXBlID0gZXJyb3I7CisKKyAgICBpZiAoKCB4ID0gY21rZXkoZGlhbGVydGFiLCBuZGlhbGVyLAorICAgICAgICAgICAgICAgICAgICAiS2VybWl0LTk1IGRpYWxlciB3b3JrLWFyb3VuZHMiLAorICAgICAgICAgICAgICAgICAgICAiIiwgeHhzdHJpbmcpKSA8IDAgKQorICAgICAgcmV0dXJuKHgpOworICAgIHN3aXRjaCAoeCkgeworICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2tzcGFjZSAqLworICAgICAgICBrYyA9IDI2NDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW50ZXIgKi8KKyAgICAgICAga2MgPSAyNjk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJJbGxlZ2FsIHZhbHVlIGluIHNldGRpYWxlcigpXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKCh5ID0gY210eHQoIktleSBkZWZpbml0aW9uIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih5KTsKKworI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgcHJpbnRmKCI/U29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisgICAgcyA9IGJyc3RyaXAocyk7CisjaWZuZGVmIE5PS1ZFUkJTCisgICAgcCA9IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGlzIHBsYWNlICovCisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKy8qCisgIElmIHRoZSBkZWZpbml0aW9uIGluY2x1ZGVkIGFueSBcS3ZlcmJzLCBxdW90ZSB0aGUgYmFja3NsYXNoIHNvIHRoZSBcS3ZlcmIKKyAgd2lsbCBzdGlsbCBiZSBpbiB0aGUgZGVmaW5pdGlvbiB3aGVuIHRoZSBrZXkgaXMgcHJlc3NlZC4gIFdlIGRvbid0IGRvIHRoaXMKKyAgaW4genpzdHJpbmcoKSwgYmVjYXVzZSBcS3ZlcmJzIGFyZSB2YWxpZCBvbmx5IGluIHRoaXMgY29udGV4dCBhbmQgbm93aGVyZQorICBlbHNlLgorCisgIFdlIHVzZSB0aGlzIGNvZGUgYWN0aXZlIGZvciBhbGwgdmVyc2lvbnMgdGhhdCBzdXBwb3J0IFNFVCBLRVksIGV2ZW4gaWYgdGhleQorICBkb24ndCBzdXBwb3J0IFxLdmVyYnMsIGJlY2F1c2Ugb3RoZXJ3aXNlIFxLIHdvdWxkIGJlaGF2ZSBkaWZmZXJlbnRseSBmb3IKKyAgZGlmZmVyZW50IHZlcnNpb25zLgorKi8KKyAgICBmb3IgKHggPSAwLCB5ID0gMDsgc1t4XTsgeCsrLCB5KyspIHsgLyogQ29udmVydCBcSyB0byBcXEsgKi8KKyAgICAgICAgaWYgKCh4ID4gMCkgJiYKKyAgICAgICAgICAgIChzW3hdID09ICdLJyB8fCBzW3hdID09ICdrJykKKyAgICAgICAgICAgICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXZlIEsgKi8KKworICAgICAgICAgICAgaWYgKCh4ID09IDEgJiYgc1t4LTFdID09IENNRFEpIHx8CisgICAgICAgICAgICAgICAgKHggPiAxICYmIHNbeC0xXSA9PSBDTURRICYmIHNbeC0yXSAhPSBDTURRKSkgeworICAgICAgICAgICAgICAgIGxpbmVbeSsrXSA9IENNRFE7ICAgICAgIC8qIE1ha2UgaXQgXFxLICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeCA+IDEgJiYgc1t4LTFdID09ICd7JyAmJiBzW3gtMl0gPT0gQ01EUSkgeworICAgICAgICAgICAgICAgIGxpbmVbeS0xXSA9IENNRFE7ICAgICAgIC8qIEhhdmUgXHtLICovCisgICAgICAgICAgICAgICAgbGluZVt5KytdID0gJ3snOyAgICAgICAgLyogTWFrZSBpdCBcXHtLICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGluZVt5XSA9IHNbeF07CisgICAgfQorICAgIGxpbmVbeSsrXSA9IE5VTDsgICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSAqLworICAgIHMgPSBsaW5lICsgeSArIDE7ICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIGFmdGVyIGl0ICovCisgICAgeCA9IExJTkJVRlNJWiAtIChpbnQpIHN0cmxlbihsaW5lKSAtIDE7IC8qIENhbGN1bGF0ZSByZW1haW5pbmcgc3BhY2UgKi8KKyAgICBpZiAoKHggPCAoTElOQlVGU0laIC8gMikpIHx8CisgICAgICAgICh6enN0cmluZyhsaW5lLCAmcywgJngpIDwgMCkpIHsgLyogRXhwYW5kIHZhcmlhYmxlcywgZXRjLiAqLworICAgICAgICBwcmludGYoIj9LZXkgZGVmaW5pdGlvbiB0b28gbG9uZ1xuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIHMgPSBsaW5lICsgeSArIDE7ICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIHJlc3VsdC4gKi8KKworI2lmbmRlZiBOT0tWRVJCUworLyoKKyAgU3BlY2lhbCBjYXNlOiBzZWUgaWYgdGhlIGRlZmluaXRpb24gc3RhcnRzIHdpdGggYSBcS3ZlcmIuCisgIElmIGl0IGRvZXMsIHBvaW50IHRvIGl0IHdpdGggcCwgb3RoZXJ3aXNlIHNldCBwIHRvIE5VTEwuCisqLworICAgIHAgPSBzOworICAgIGlmICgqcCsrID09IENNRFEpIHsKKyAgICAgICAgaWYgKCpwID09ICd7JykgcCsrOworICAgICAgICBwID0gKCpwID09ICdrJyB8fCAqcCA9PSAnSycpID8gcCArIDEgOiBOVUxMOworICAgIH0KKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworCisgICAgLyogQ2xlYXIgdGhlIGRlZmluaXRpb24gZm9yIFNFVCBLRVkgKi8KKyAgICBpZiAobWFjcm90YWJba2NdKSB7ICAgICAgICAgICAgICAgICAvKiBQb3NzaWJseSBmcmVlIG9sZCBtYWNybyBmcm9tIGtleS4gKi8KKyAgICAgICAgZnJlZSgoY2hhciAqKW1hY3JvdGFiW2tjXSk7CisgICAgICAgIG1hY3JvdGFiW2tjXSA9IE5VTEw7CisgICAgfQorICAgIGtleW1hcFtrY10gPSAoS0VZKSBrYzsKKworICAgIC8qIE5vdyByZXByb2dyYW0gdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGFsbCB0ZXJtaW5hbCB0eXBlcyAqLworICAgIC8qIHJlbWVtYmVyIHRvIHRyZWF0IFd5c2UgYW5kIFRlbGV2aWRlbyB0ZXJtaW5hbHMgc3BlY2lhbCAqLworICAgIC8qIGJlY2F1c2Ugb2YgdGhlaXIgdXNlIG9mIEt2ZXJicyBmb3IgQmFja3NwYWNlIGFuZCBFbnRlciAqLworICAgIGZvciAodCA9IDA7IHQgPD0gVFRfTUFYOyB0KyspIHsKKyAgICAgICAgaWYgKCBJU0RHMjAwKHQpICYmIGtjID09IDI2NCkgeworICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiB1ZGtma2V5c1tdIDsKKyAgICAgICAgICAgIGlmIChrYyA9PSAyNjQpIHsgICAgICAgICAgICAvKiBcS2RnYnMgKi8KKyAgICAgICAgICAgICAgICBpZiAodWRrZmtleXNbODNdKQorICAgICAgICAgICAgICAgICAgZnJlZSh1ZGtma2V5c1s4M10pOworICAgICAgICAgICAgICAgIHVka2ZrZXlzWzgzXSA9IHN0cmR1cChzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChJU1dZU0UodCkgfHwgSVNUVkkodCkpIHsKKyAgICAgICAgICAgIGV4dGVybiBjaGFyICogdWRrZmtleXNbXSA7CisgICAgICAgICAgICBpZiAoa2MgPT0gMjY0KSB7ICAgICAgICAgICAgLyogXEt3eWJzIG9yIFxLdHZpYnMgKi8KKyAgICAgICAgICAgICAgICBpZiAodWRrZmtleXNbMzJdKQorICAgICAgICAgICAgICAgICAgZnJlZSh1ZGtma2V5c1szMl0pOworICAgICAgICAgICAgICAgIHVka2ZrZXlzWzMyXSA9IHN0cmR1cChzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChrYyA9PSAyNjkpIHsgICAgICAgICAgICAvKiBcS3d5ZW50ZXIgYW5kIFxLd3lyZXR1cm4gKi8KKyAgICAgICAgICAgICAgICBpZiAodWRrZmtleXNbMzldKSAgICAgICAvKiBcS3R2aWVudGVyIGFuZCBcS3R2aXJldHVybiAqLworICAgICAgICAgICAgICAgICAgZnJlZSh1ZGtma2V5c1szOV0pOworICAgICAgICAgICAgICAgIHVka2ZrZXlzWzM5XSA9IHN0cmR1cChzKTsKKyAgICAgICAgICAgICAgICBpZiAodWRrZmtleXNbNDldKQorICAgICAgICAgICAgICAgICAgZnJlZSh1ZGtma2V5c1s0OV0pOworICAgICAgICAgICAgICAgIHVka2ZrZXlzWzQ5XSA9IHN0cmR1cChzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RybGVuKHMpKSB7ICAgICAgICAvKiBBY3Rpb24gZGVwZW5kcyBvbiBsZW5ndGggKi8KKyAgICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAvKiBDbGVhciBpbmRpdmlkdWFsIGtleSBkZWYgKi8KKyAgICAgICAgICAgICAgICBkZWxldGVrZXltYXAodCxrYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBkZWZldnQudHlwZSA9IGtleTsgICAgICAvKiBTaW5nbGUgY2hhcmFjdGVyICovCisgICAgICAgICAgICAgICAgZGVmZXZ0LmtleS5zY2FuY29kZSA9ICpzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIC8qIENoYXJhY3RlciBzdHJpbmcgKi8KKyNpZm5kZWYgTk9LVkVSQlMKKyAgICAgICAgICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgICAgICAgICB5ID0geGxvb2t1cChrdmVyYnMscCxua3ZlcmJzLCZ4KTsgLyogTG9vayBpdCB1cCAqLworICAgICAgICAgICAgICAgICAgICAvKiBFeGFjdCBtYXRjaCByZXEnZCAqLworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJzZXQga2V5IGt2ZXJiIGxvb2t1cCIsMCx5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXZ0LnR5cGUgPSBrdmVyYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmV2dC5rdmVyYi5pZCA9IHk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworICAgICAgICAgICAgICAgIGRlZmV2dC50eXBlID0gbWFjcm87CisgICAgICAgICAgICAgICAgZGVmZXZ0Lm1hY3JvLnN0cmluZyA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4ocykrMSk7CisgICAgICAgICAgICAgICAgaWYgKGRlZmV2dC5tYWNyby5zdHJpbmcpCisgICAgICAgICAgICAgICAgICBzdHJjcHkoZGVmZXZ0Lm1hY3JvLnN0cmluZywgcyk7IC8qIHNhZmUgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc2VydGtleW1hcCggdCwga2MsIGRlZmV2dCApIDsKKyAgICAgICAgICAgIGluaXR2aWsgPSAxOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgVklLIHRhYmxlICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKDEpOworfQorI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgTlQKK2ludAorc2V0d2luOTUoIHZvaWQgKSB7CisgICAgaW50IHgsIHksIHo7CisKKyAgICBpZiAoKCB5ID0gY21rZXkod2luOTV0YWIsIG53aW45NSwKKyAgICAgICAgICAgICAgICAgICAgIldpbmRvd3MgOTUgc3BlY2lmaWMgd29yay1hcm91bmRzIiwKKyAgICAgICAgICAgICAgICAgICAgImtleWJvYXJkLXRyYW5zbGF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDAgKQorICAgICAgICByZXR1cm4gKHkpOworICAgIHN3aXRjaCAoeSkgeworICAgICAgY2FzZSBYWVdQT1BVUDoKKyAgICAgICAgaWYgKCh5ID0gY21rZXkob25vZmYsMiwicG9wdXBzIGFyZSB1c2VkIHRvIHByb21wdCB0aGUgdXNlciBmb3IgZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICJvbiIseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgd2luOTVfcG9wdXAgPSB5OworICAgICAgICByZXR1cm4oMSk7CisKKyAgICAgIGNhc2UgWFlXOF8zOgorICAgICAgICBpZiAoKHkgPSBjbWtleShvbm9mZiwyLCI4LjMgRkFUIGZpbGUgbmFtZXMiLCJvZmYiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIHdpbjk1XzhfMyA9IHk7CisgICAgICAgIHJldHVybigxKTsKKworICAgICAgY2FzZSBYWVdTRUxFQ1Q6CisgICAgICAgIGlmICgoeSA9IGNta2V5KG9ub2ZmLDIsIlwic2VsZWN0KClcIiBmYWlscyBvbiB3cml0ZSIsIm9mZiIsCisgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgd2luOTVzZWxlY3RidWcgPSB5OworICAgICAgICByZXR1cm4oMSk7CisKKyAgICAgIGNhc2UgWFlXQUdSOgorICAgICAgICBpZiAoKHkgPSBjbWtleShvbm9mZiwyLCJSaWdodC1BbHQgaXMgQWx0LUdyIiwib2ZmIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICB3aW45NWFsdGdyID0geTsKKyAgICAgICAgcmV0dXJuKDEpOworCisgICAgICBjYXNlIFhZV09JTzoKKyAgICAgICAgaWYgKCh5ID0gY21rZXkob25vZmYsMiwiVXNlIE92ZXJsYXBwZWQgSS9PIiwib24iLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgaWYgKHkpIHsKKyAgICAgICAgICAgIGlmICgoeCA9IGNtbnVtKCJNYXhpbXVtIG51bWJlciBvZiBvdXRzdGFuZGluZyBJL08gcmVxdWVzdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIiwxMCwmeix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKHogPCAxIHx8IHogPiA3KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKAorIj9NYXhpbXVtIG91dHN0YW5kaW5nIEkvTyByZXF1ZXN0cyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNy5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHogPSAxOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgb3d3YWl0ID0gIXk7CisgICAgICAgIG1heG93ID0gbWF4b3dfdXNyID0gejsKKyAgICAgICAgcmV0dXJuKDEpOworCisgICAgICBjYXNlIFhZV0tFWToKKyNpZm5kZWYgQ09NTUVOVAorICAgICAgICBwcmludGYoIlxuP1wiS2V5Ym9hcmQtVHJhbnNsYXRpb25cIiBpcyBubyBsb25nZXIgcmVxdWlyZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyNlbHNlIC8qIENPTU1FTlQgKi8KKyAgICAgICAgaWYgKCggeiA9IGNta2V5KHRjc3RhYiwgbnRjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJLZXlib2FyZCBDaGFyYWN0ZXIgU2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsYXRpbjEtaXNvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybiAoeik7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisKKyAgICAgICAgd2luOTVrY3NpID0gejsKKyAgICAgICAgd2luOTVrbDIgPSAod2luOTVrY3NpID09IFRDXzJMQVRJTik7CisKKyAgICAgICAgaWYgKHdpbjk1a2NzaSA9PSBUQ19UUkFOU1ApIHsKKyAgICAgICAgICAgIHdpbjk1a2NzID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBVTklDT0RFCisgICAgICAgICAgICB3aW45NWtjcyA9IHhsclt3aW45NWtjc2ldW3R4MmZjKHRjc2wpXTsKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyAgICAgICAgICAgIHdpbjk1a2NzID0geGxyW3dpbjk1a2NzaV1bdGNzbF07CisjZW5kaWYgLyogVU5JQ09ERSAqLworICAgICAgICB9CisgICAgICAgIHJldHVybigxKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAgIGNhc2UgWFlXTFVDOgorICAgICAgICBpZiAoKHkgPSBjbWtleShvbm9mZiwyLCJVbmljb2RlLXRvLUx1Y2lkYS1Db25zb2xlIHN1YnN0aXR1dGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAib24iLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIHdpbjk1bHVjaWRhID0geTsKKyAgICAgICAgcmV0dXJuKDEpOworCisgICAgICBjYXNlIFhZV0hTTDoKKwlpZiAoKHkgPSBjbWtleShvbm9mZiwyLCJIb3Jpem9udGFsIFNjYW4gTGluZSBzdWJzdGl0dXRpb25zIiwKKwkJICAgICAgICJvbiIseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeSk7CisJaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisJd2luOTVoc2wgPSB5OworCXJldHVybigxKTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJJbGxlZ2FsIHZhbHVlIGluIHNldHdpbjk1KClcbiIpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KK30KKyNlbmRpZiAvKiBOVCAqLworCisjaWZkZWYgT1MyCitpbnQKK3NldHBydHkgKAorI2lmZGVmIENLX0FOU0lDCisgICAgdm9pZAorI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBzZXRwcnR5ICovICkgeworICAgIGludCB4LCB5LCB6OworCisgICAgaWYgKCggeSA9IGNta2V5KHBydHl0YWIsIG5wcnR5LAorICAgICAgICAgICAgICAgICAgICAicHJpb3JpdHkgbGV2ZWwgb2YgdGVybWluYWwgYW5kIGNvbW11bmljYXRpb24gdGhyZWFkcyIsCisgICAgICAgICAgICAgICAgICAgICJmb3JlZ3JvdW5kLXNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nKSkgPCAwICkKKyAgICAgIHJldHVybiAoeSk7CisKKyAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICByZXR1cm4gKHgpOworI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIgJiYKKyNpZmRlZiBJS1NEQ09ORgorICAgICAgICAgaWtzZGNmCisjZWxzZQorICAgICAgICAgMQorI2VuZGlmIC8qIElLU0RDT05GICovCisgICAgKSB7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBwcmludGYoIj9Tb3JyeSwgY29tbWFuZCBkaXNhYmxlZC5cclxuIik7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyAgICBwcmlvcml0eSA9IHk7CisgICAgcmV0dXJuKFRSVUUpOworfQorI2VuZGlmIC8qIE9TMiAqLworCitpbnQKK3NldGJlbGwoKSB7CisgICAgaW50IHksIHg7CisjaWZkZWYgT1MyCisgICAgaW50IHo7CisjZW5kaWYgLyogT1MyICovCisKKyAgICBpZiAoKHkgPSBjbWtleShiZWx0YWIsbmJlbHRhYiwKKyNpZmRlZiBPUzIKKyAgICAgICAgImhvdyBjb25zb2xlIGFuZCB0ZXJtaW5hbCBiZWxscyBzaG91bGRcbmJlIGdlbmVyYXRlZCIsICJhdWRpYmxlIiwKKyNlbHNlCisgICAgICAgICJXaGV0aGVyIEtlcm1pdCBzaG91bGQgcmluZyB0aGUgdGVybWluYWwgYmVsbCAoYmVlcCkiLCAib24iLAorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKworI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHByaW50ZigiP1NvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgc3dpdGNoICh5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU0VUIEJFTEwgKi8KKyAgICAgIGNhc2UgWFlCX05PTkU6CisjaWZkZWYgT1MyCisgICAgICBjYXNlIFhZQl9WSVM6CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisjaWZkZWYgT1MyCisgICAgICAgIHR0X2JlbGwgPSB5OworI2Vsc2UKKyAgICAgICAgdHRfYmVsbCA9IDA7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhZQl9BVUQ6CisjaWZkZWYgT1MyCisgICAgICAgIGlmICgoeCA9IGNta2V5KGF1ZGlibGV0YWIsIG5hdWRpYmxldGFiLAorICAgICAgICAgICAgICAgImhvdyBhdWRpYmxlIGNvbnNvbGUgYW5kIHRlcm1pbmFsXG5iZWxscyBzaG91bGQgYmUgZ2VuZXJhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImJlZXAiLHh4c3RyaW5nKSk8MCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeiA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgIHR0X2JlbGwgPSB5IHwgeDsKKyNlbHNlCisgICAgICAgIC8qIFRoaXMgbGV0cyBDLUtlcm1pdCBhY2NlcHQgYnV0IGlnbm9yZSB0cmFpbGluZyBLOTUga2V5d29yZHMgKi8KKyAgICAgICAgaWYgKCh4ID0gY210eHQoIkNvbmZpcm0gd2l0aCBjYXJyaWFnZSByZXR1cm4iLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgdHRfYmVsbCA9IDE7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4oMSk7Cit9CisKKyNpZmRlZiBPUzJNT1VTRQoraW50CitzZXRtb3UoCisjaWZkZWYgQ0tfQU5TSUMKKyAgICAgICB2b2lkCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyAvKiBzZXRtb3UgKi8gKSB7CisgICAgZXh0ZXJuIGludCBpbml0dmlrOworICAgIGludCBidXR0b24gPSAwLCBldmVudCA9IDA7CisgICAgY2hhciAqIHA7CisKKyAgICBpZiAoKHkgPSBjbWtleShtb3VzZXRhYixubXRhYiwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih5KTsKKworI2lmZGVmIElLU0QKKyAgICBpZiAoaW5zZXJ2ZXIpIHsKKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHByaW50ZigiP1NvcnJ5LCBjb21tYW5kIGRpc2FibGVkLlxyXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgaWYgKHkgPT0gWFlNX09OKSB7ICAgICAgICAgICAgICAgICAgLyogTU9VU0UgQUNUSVZBVElPTiAqLworICAgICAgICBpbnQgb2xkX21vdSA9IHR0X21vdXNlOworICAgICAgICBpZiAoKHggPSBzZXRvbigmdHRfbW91c2UpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICh0dF9tb3VzZSAhPSBvbGRfbW91KQorICAgICAgICAgIGlmICh0dF9tb3VzZSkKKyAgICAgICAgICAgIG9zMl9tb3VzZW9uKCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgb3MyX21vdXNlb2ZmKCk7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyAgICBpZiAoeSA9PSBYWU1fREVCVUcpIHsgICAgICAgICAgICAgICAvKiBNT1VTRSBERUJVRyAqLworICAgICAgICBleHRlcm4gaW50IE1vdXNlRGVidWc7CisgICAgICAgIGlmICgoeCA9IHNldG9uKCZNb3VzZURlYnVnKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorCisgICAgaWYgKHkgPT0gWFlNX0NMRUFSKSB7ICAgICAgICAgICAgICAgLyogUmVzZXQgTW91c2UgRGVmYXVsdHMgKi8KKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIG1vdXNlbWFwaW5pdCgtMSwtMSk7CisgICAgICAgIGluaXR2aWsgPSAxOyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIFZJSyBUYWJsZSAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKHkgIT0gWFlNX0JVVFRPTikgeyAgICAgICAgICAgICAgLyogU2hvdWxkbid0IGhhcHBlbi4gKi8KKyAgICAgICAgcHJpbnRmKCJJbnRlcm5hbCBwYXJzaW5nIGVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisKKyAgICAvKiBNT1VTRSBFVkVOVCAuLi4gKi8KKworICAgIGlmICgoYnV0dG9uID0gY21rZXkobW91c2VidXR0b250YWIsbm1idGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJ1dHRvbiBudW1iZXIiLCIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKGJ1dHRvbik7CisKKyAgICBpZiAoKHkgPSAgY21rZXkobW91c2Vtb2R0YWIsbm1tdGFiLAorICAgICAgICAgICAgICAgICAgICAiS2V5Ym9hcmQgbW9kaWZpZXIiLCJub25lIiwKKyAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeSk7CisKKyAgICBldmVudCB8PSB5OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPUiBpbiB0aGUgYml0cyAqLworCisgICAgaWYgKCh5ID0gIGNta2V5KG1jbGlja3RhYixubWN0YWIsIiIsImNsaWNrIix4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih5KTsKKworICAgIC8qIFR3byBiaXRzIGFyZSBhc3NpZ25lZCwgaWYgbmVpdGhlciBhcmUgc2V0IHRoZW4gaXQgaXMgYnV0dG9uIG9uZSAqLworCisgICAgZXZlbnQgfD0geTsgICAgICAgICAgICAgICAgIC8qIE9SIGluIHRoZSBiaXQgKi8KKworICAgIHdpZGVyZXN1bHQgPSAtMTsKKworICAgIGlmICgoeSA9IGNtdHh0KCJkZWZpbml0aW9uLFxuXAorb3IgQ3RybC1DIHRvIGNhbmNlbCB0aGlzIGNvbW1hbmQsXG5cCitvciBFbnRlciB0byByZXN0b3JlIGRlZmF1bHQgZGVmaW5pdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIiIsJnMsTlVMTCkpIDwgMCkgeworICAgICAgICByZXR1cm4oeSk7CisgICAgfQorICAgIHMgPSBicnN0cmlwKHMpOworICAgIHAgPSBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhpcyBwbGFjZSAqLworLyoKKyAgSWYgdGhlIGRlZmluaXRpb24gaW5jbHVkZWQgYW55IFxLdmVyYnMsIHF1b3RlIHRoZSBiYWNrc2xhc2ggc28gdGhlIFxLdmVyYgorICB3aWxsIHN0aWxsIGJlIGluIHRoZSBkZWZpbml0aW9uIHdoZW4gdGhlIGtleSBpcyBwcmVzc2VkLiAgV2UgZG9uJ3QgZG8gdGhpcworICBpbiB6enN0cmluZygpLCBiZWNhdXNlIFxLdmVyYnMgYXJlIHZhbGlkIG9ubHkgaW4gdGhpcyBjb250ZXh0IGFuZCBub3doZXJlCisgIGVsc2UuICBUaGlzIGNvZGUgY29waWVkIGZyb20gU0VUIEtFWSwgcS52LiBmb3IgYWRkdCdsIGNvbW1lbnRhcnkuCisqLworICAgIGZvciAoeCA9IDAsIHkgPSAwOyBzW3hdOyB4KyssIHkrKykgeyAvKiBDb252ZXJ0IFxLIHRvIFxcSyAqLworICAgICAgICBpZiAoKHggPiAwKSAmJgorICAgICAgICAgICAgKHNbeF0gPT0gJ0snIHx8IHNbeF0gPT0gJ2snKQorICAgICAgICAgICAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhdmUgSyAqLworCisgICAgICAgICAgICBpZiAoKHggPT0gMSAmJiBzW3gtMV0gPT0gQ01EUSkgfHwKKyAgICAgICAgICAgICAgICAoeCA+IDEgJiYgc1t4LTFdID09IENNRFEgJiYgc1t4LTJdICE9IENNRFEpKSB7CisgICAgICAgICAgICAgICAgbGluZVt5KytdID0gQ01EUTsgICAgICAgLyogTWFrZSBpdCBcXEsgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh4ID4gMSAmJiBzW3gtMV0gPT0gJ3snICYmIHNbeC0yXSA9PSBDTURRKSB7CisgICAgICAgICAgICAgICAgbGluZVt5LTFdID0gQ01EUTsgICAgICAgLyogSGF2ZSBce0sgKi8KKyAgICAgICAgICAgICAgICBsaW5lW3krK10gPSAneyc7ICAgICAgICAvKiBNYWtlIGl0IFxce0sgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsaW5lW3ldID0gc1t4XTsKKyAgICB9CisgICAgbGluZVt5KytdID0gTlVMOyAgICAgICAgICAgICAgICAgICAgLyogVGVybWluYXRlICovCisgICAgcyA9IGxpbmUgKyB5ICsgMTsgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gYWZ0ZXIgaXQgKi8KKyAgICB4ID0gTElOQlVGU0laIC0gKGludCkgc3RybGVuKGxpbmUpIC0gMTsgLyogQ2FsY3VsYXRlIHJlbWFpbmluZyBzcGFjZSAqLworICAgIGlmICgoeCA8IChMSU5CVUZTSVogLyAyKSkgfHwKKyAgICAgICAgKHp6c3RyaW5nKGxpbmUsICZzLCAmeCkgPCAwKSkgeyAvKiBFeHBhbmQgdmFyaWFibGVzLCBldGMuICovCisgICAgICAgIHByaW50ZigiP0tleSBkZWZpbml0aW9uIHRvbyBsb25nXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgcyA9IGxpbmUgKyB5ICsgMTsgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gcmVzdWx0LiAqLworCisjaWZuZGVmIE5PS1ZFUkJTCisvKgorICBTcGVjaWFsIGNhc2U6IHNlZSBpZiB0aGUgZGVmaW5pdGlvbiBzdGFydHMgd2l0aCBhIFxLdmVyYi4KKyAgSWYgaXQgZG9lcywgcG9pbnQgdG8gaXQgd2l0aCBwLCBvdGhlcndpc2Ugc2V0IHAgdG8gTlVMTC4KKyovCisgICAgcCA9IHM7CisgICAgaWYgKCpwKysgPT0gQ01EUSkgeworICAgICAgICBpZiAoKnAgPT0gJ3snKSBwKys7CisgICAgICAgIHAgPSAoKnAgPT0gJ2snIHx8ICpwID09ICdLJykgPyBwICsgMSA6IE5VTEw7CisgICAgfQorI2Vsc2UKKyAgICBwID0gTlVMTDsKKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworCisgICAgLyogZnJlZSB0aGUgb2xkIGRlZmluaXRpb24gaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKG1vdXNlbWFwW2J1dHRvbl1bZXZlbnRdLnR5cGUgPT0gbWFjcm8pIHsKKyAgICAgICAgZnJlZSggbW91c2VtYXBbYnV0dG9uXVtldmVudF0ubWFjcm8uc3RyaW5nKTsKKyAgICAgICAgbW91c2VtYXBbYnV0dG9uXVtldmVudF0ubWFjcm8uc3RyaW5nID0gTlVMTDsKKyAgICB9CisgICAgc3dpdGNoIChzdHJsZW4ocykpIHsgICAgICAgICAgICAgICAgLyogQWN0aW9uIGRlcGVuZHMgb24gbGVuZ3RoICovCisgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgdG8gZGVmYXVsdCBiaW5kaW5nICovCisgICAgICAgIG1vdXNlbWFwaW5pdCggYnV0dG9uLCBldmVudCApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaW5nbGUgY2hhcmFjdGVyICovCisgICAgICAgICAgICBtb3VzZW1hcFtidXR0b25dW2V2ZW50XS50eXBlID0ga2V5OworICAgICAgICBtb3VzZW1hcFtidXR0b25dW2V2ZW50XS5rZXkuc2NhbmNvZGUgPSAqczsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhcmFjdGVyIHN0cmluZyAqLworI2lmbmRlZiBOT0tWRVJCUworICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgeSA9IHhsb29rdXAoa3ZlcmJzLHAsbmt2ZXJicywmeCk7IC8qIExvb2sgaXQgdXAgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInNldCBtb3VzZSBrdmVyYiBsb29rdXAiLDAseSk7IC8qIG5lZWQgZXhhY3QgbWF0Y2ggKi8KKyAgICAgICAgICAgIGlmICh5ID4gLTEpIHsKKyAgICAgICAgICAgIC8qIEFzc2lnbiB0aGUga3ZlcmIgdG8gdGhlIGV2ZW50ICovCisgICAgICAgICAgICBtb3VzZW1hcFtidXR0b25dW2V2ZW50XS50eXBlID0ga3ZlcmI7CisgICAgICAgICAgICBtb3VzZW1hcFtidXR0b25dW2V2ZW50XS5rdmVyYi5pZCA9IEZfS1ZFUkIgfCB5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBOT0tWRVJCUyAqLworCisgICAgICAgLyogT3RoZXJ3aXNlLCBpdCdzIGEgbWFjcm8sIHNvIGFzc2lnbiB0aGUgbWFjcm8gdG8gdGhlIGV2ZW50ICovCisgICAgICAgbW91c2VtYXBbYnV0dG9uXVtldmVudF0udHlwZSA9IG1hY3JvOworICAgICAgIG1vdXNlbWFwW2J1dHRvbl1bZXZlbnRdLm1hY3JvLnN0cmluZyA9IChNQUNSTykgbWFsbG9jKHN0cmxlbihzKSsxKTsKKyAgICAgICBpZiAobW91c2VtYXBbYnV0dG9uXVtldmVudF0ubWFjcm8uc3RyaW5nKQorICAgICAgICAgc3RyY3B5KChjaGFyICopIG1vdXNlbWFwW2J1dHRvbl1bZXZlbnRdLm1hY3JvLnN0cmluZywgcyk7IC8qIHNhZmUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGluaXR2aWsgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBWSUsgVGFibGUgKi8KKyAgICBpZiAoIChidXR0b24gPT0gWFlNX0IzKSAmJiAobW91c2VidXR0b25jb3VudCgpIDwgMykgJiYgIXF1aWV0ICkKKyAgICB7CisgICAgICAgIHByaW50ZigiP1dhcm5pbmc6IHRoaXMgbWFjaGluZSBkb2VzIG5vdCBoYXZlIGEgdGhyZWUgYnV0dG9uIG1vdXNlLlxuIik7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgcmV0dXJuKDEpOworfQorI2VuZGlmIC8qIE9TMk1PVVNFICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZuZGVmIE5PWEZFUgoraW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBTRU5EL1JFQ0VJVkUgKi8KK3NldHNyKHh4LCBybXNmbGcpIGludCB4eDsgaW50IHJtc2ZsZzsgeworICAgIGlmICh4eCA9PSBYWVJFQ1YpCisgICAgICBja3N0cm5jcHkobGluZSwiUGFyYW1ldGVyIGZvciBpbmJvdW5kIHBhY2tldHMiLExJTkJVRlNJWik7CisgICAgZWxzZQorICAgICAgY2tzdHJuY3B5KGxpbmUsIlBhcmFtZXRlciBmb3Igb3V0Ym91bmQgcGFja2V0cyIsTElOQlVGU0laKTsKKworICAgIGlmIChybXNmbGcpIHsKKyAgICAgICAgaWYgKCh5ID0gY21rZXkocnNydGFiLG5yc3J0YWIsbGluZSwiIix4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgaWYgKHkgPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9SZW1vdGUgcmVjZWl2ZSBwYXJhbWV0ZXIgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9IGVsc2UgcmV0dXJuKHkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCh5ID0gY21rZXkoc3J0YWIsbnNydGFiLGxpbmUsIiIseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICB9CisgICAgc3dpdGNoICh5KSB7CisgICAgICBjYXNlIFhZUUNUTDogICAgICAgICAgICAgICAgICAgICAgLyogQ09OVFJPTC1QUkVGSVggKi8KKyAgICAgICAgaWYgKCh4ID0gY21udW0oIkFTQ0lJIHZhbHVlIG9mIGNvbnRyb2wgcHJlZml4IiwiIiwxMCwmeSx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICBpZiAoKHkgPiAzMiAmJiB5IDwgNjMpIHx8ICh5ID4gOTUgJiYgeSA8IDEyNykpIHsKKyAgICAgICAgICAgIGlmICh4eCA9PSBYWVJFQ1YpCisgICAgICAgICAgICAgIGN0bHEgPSAoQ0hBUikgeTsgICAgICAgICAgLyogUkVDRUlWRSBwcmVmaXgsIHVzZSB3aXRoIGNhdXRpb24hICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG15Y3RscSA9IChDSEFSKSB5OyAgICAgICAgLyogU0VORCBwcmVmaXgsIE9LIHRvIGNoYW5nZSAqLworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiP0lsbGVnYWwgdmFsdWUgZm9yIHByZWZpeCBjaGFyYWN0ZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorCisgICAgICBjYXNlIFhZRU9MOgorICAgICAgICBpZiAoKHkgPSBzZXRjYygiMTMiLCZ6KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoeiA+IDMxKSB7CisgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCB0aGUgbGVnYWwgdmFsdWVzIGFyZSAwLTMxXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHh4ID09IFhZUkVDVikKKyAgICAgICAgICBlb2wgPSAoQ0hBUikgejsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNlb2wgPSAoQ0hBUikgejsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSB5KTsKKworICAgICAgY2FzZSBYWUxFTjoKKyAgICAgICAgeSA9IGNtbnVtKCJNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgcGFja2V0IiwiOTAiLDEwLCZ4LAorICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpOworICAgICAgICBpZiAoeHggPT0gWFlSRUNWKSB7ICAgICAgICAgICAgIC8qIFJlY2VpdmUuLi4gKi8KKyAgICAgICAgICAgIGlmICgoeSA9IHNldG51bSgmeix4LHksbWF4cnBzKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICBpZiAocHJvdG9jb2wgIT0gUFJPVE9fSykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCB0aGlzIGNvbW1hbmQgZG9lcyBub3QgYXBwbHkgdG8gJXMgcHJvdG9jb2wuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwdGFiW3Byb3RvY29sXS5wX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIlVzZSBTRVQgU0VORCBQQUNLRVQtTEVOR1RIIGZvciBYWVpNT0RFTVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh6IDwgMTApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCAxMCBpcyB0aGUgbWluaW11bVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChybXNmbGcpIHsKKyAgICAgICAgICAgICAgICBzc3RhdGUgPSBzZXRnZW4oJ1MnLCAiNDAxIiwgY2tpdG9hKHopLCAiIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSBQUk9UT19LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh6ID4gTUFYUlApIHogPSBNQVhSUDsKKyAgICAgICAgICAgICAgICAgICAgeSA9IGFkanBrbCh6LHdzbG90cixiaWdyYnNpeik7CisgICAgICAgICAgICAgICAgICAgIGlmICh5ICE9IHopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVycHNpeiA9IHk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXhjbWRzcmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2dmbGcpIHByaW50ZigKKyIgQWRqdXN0aW5nIHJlY2VpdmUgcGFja2V0LWxlbmd0aCB0byAlZCBmb3IgJWQgd2luZG93IHNsb3RzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwgd3Nsb3RyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1cnBzaXogPSB5OworICAgICAgICAgICAgICAgICAgICBwdGFiW3Byb3RvY29sXS5ycGt0bGVuID0gdXJwc2l6OworICAgICAgICAgICAgICAgICAgICBycHNpeiA9ICAoeSA+IDk0KSA/IDk0IDogeTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworI2lmZGVmIENLX1hZWgorICAgICAgICAgICAgICAgICAgICBpZiAoKHByb3RvY29sID09IFBST1RPX1ggfHwgcHJvdG9jb2wgPT0gUFJPVE9fWEMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgeiAhPSAxMjggJiYgeiAhPSAxMDI0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlNvcnJ5LCBiYWQgcGFja2V0IGxlbmd0aCBmb3IgWE1PREVNLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlBsZWFzZSB1c2UgMTI4IG9yIDEwMjQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19YWVogKi8KKyAgICAgICAgICAgICAgICAgICAgdXJwc2l6ID0gcnBzaXogPSB6OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZW5kLi4uICovCisgICAgICAgICAgICBpZiAoKHkgPSBzZXRudW0oJnoseCx5LG1heHNwcykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgaWYgKHogPCAxMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiU29ycnksIDEwIGlzIHRoZSBtaW5pbXVtXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByb3RvY29sID09IFBST1RPX0spIHsKKyAgICAgICAgICAgICAgICBpZiAoeiA+IE1BWFNQKSB6ID0gTUFYU1A7CisgICAgICAgICAgICAgICAgc3BzaXogPSB6OyAgICAgICAgICAgICAgLyogU2V0IGl0ICovCisgICAgICAgICAgICAgICAgeSA9IGFkanBrbChzcHNpeix3c2xvdHIsYmlnc2JzaXopOworICAgICAgICAgICAgICAgIGlmICh5ICE9IHNwc2l6ICYmICF4Y21kc3JjKQorICAgICAgICAgICAgICAgICAgaWYgKG1zZ2ZsZykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJBZGp1c3RpbmcgcGFja2V0IHNpemUgdG8gJWQgZm9yICVkIHdpbmRvdyBzbG90c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHksd3Nsb3RyKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICB5ID0gejsKKyNpZmRlZiBDS19YWVoKKyAgICAgICAgICAgIGlmICgocHJvdG9jb2wgPT0gUFJPVE9fWCB8fCBwcm90b2NvbCA9PSBQUk9UT19YQykgJiYKKyAgICAgICAgICAgICAgICAgeiAhPSAxMjggJiYgeiAhPSAxMDI0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJTb3JyeSwgYmFkIHBhY2tldCBsZW5ndGggZm9yIFhNT0RFTS5cbiIpOworICAgICAgICAgICAgICAgIHByaW50ZigiUGxlYXNlIHVzZSAxMjggb3IgMTAyNC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfWFlaICovCisgICAgICAgICAgICBzcHNpeiA9IHNwbWF4ID0gc3BzaXpyID0geTsgLyogU2V0IGl0IGFuZCBmbGFnIHRoYXQgaXQgd2FzIHNldCAqLworICAgICAgICAgICAgc3BzaXpmID0gMTsgICAgICAgICAgICAgICAgIC8qIHRvIGFsbG93IG92ZXJyaWRpbmcgU2VuZC1Jbml0LiAqLworICAgICAgICAgICAgcHRhYltwcm90b2NvbF0uc3BrdGZsZyA9IHNwc2l6ZjsKKyAgICAgICAgICAgIHB0YWJbcHJvdG9jb2xdLnNwa3RsZW4gPSBzcHNpejsKKyAgICAgICAgfQorICAgICAgICBpZiAocGZsYWcgJiYgcHJvdG9jb2wgPT0gUFJPVE9fSyAmJiAheGNtZHNyYykgeworICAgICAgICAgICAgaWYgKHogPiA5NCAmJiAhcmVsaWFibGUgJiYgbXNnZmxnKSB7CisgICAgICAgICAgICAgICAgLyogcHJpbnRmKCJFeHRlbmRlZC1sZW5ndGggcGFja2V0cyByZXF1ZXN0ZWQuXG4iKTsgKi8KKyAgICAgICAgICAgICAgICBpZiAoYmN0ciA8IDIgJiYgeiA+IDIwMCkgcHJpbnRmKCJcCitSZW1lbWJlciB0byBTRVQgQkxPQ0sgMiBvciAzIGZvciBsb25nIHBhY2tldHMuXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcGVlZCA8PSAwTCkgc3BlZWQgPSB0dGdzcGQoKTsKKyNpZmRlZiBDT01NRU5UCisvKgorICBLZXJtaXQgZG9lcyB0aGlzIG5vdyBpdHNlbGYuCisqLworICAgICAgICAgICAgaWYgKHNwZWVkIDw9IDBMICYmIHogPiAyMDAgJiYgbXNnZmxnKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcCitNYWtlIHN1cmUgeW91ciB0aW1lb3V0IGludGVydmFsIGlzIGxvbmcgZW5vdWdoIGZvciAlZC1ieXRlIHBhY2tldHMuXG4iLHopOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHkpOworCisgICAgICBjYXNlIFhZTUFSSzoKKyNpZmRlZiBET09NU0RBWQorLyoKKyAgUHJpbnRhYmxlIHN0YXJ0LW9mLXBhY2tldCB3b3JrcyBmb3IgVU5JWCBhbmQgVk1TIG9ubHkhCisqLworICAgICAgICB4X2lmbnVtID0gMTsKKyAgICAgICAgeSA9IGNtbnVtKCJDb2RlIGZvciBwYWNrZXQtc3RhcnQgY2hhcmFjdGVyIiwiMSIsMTAsJngseHhzdHJpbmcpOworICAgICAgICB4X2lmbnVtID0gMDsKKyAgICAgICAgaWYgKCh5ID0gc2V0bnVtKCZ6LHgseSwxMjYpKSA8IDApIHJldHVybih5KTsKKyNlbHNlCisgICAgICAgIGlmICgoeSA9IHNldGNjKCIxIiwmeikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih5KTsKKyNlbmRpZiAvKiBET09NU0RBWSAqLworICAgICAgICBpZiAoeHggPT0gWFlSRUNWKQorICAgICAgICAgIHN0Y2hyID0gKENIQVIpIHo7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbXlzdGNoID0gKENIQVIpIHo7CisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICAgICAgLyogSWYgSUtTIG5lZ290aWF0aW9uIGluIHVzZSAgICovCisgICAgICAgICAgICBpZiAoVEVMT1BUX1UoVEVMT1BUX0tFUk1JVCkgfHwgVEVMT1BUX01FKFRFTE9QVF9LRVJNSVQpKQorICAgICAgICAgICAgICB0bl9zaWtzKEtFUk1JVF9TT1ApOyAgICAgIC8qIFJlcG9ydCBjaGFuZ2UgdG8gb3RoZXIgc2lkZSAqLworI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHkpOworCisgICAgICBjYXNlIFhZTlBBRDogICAgICAgICAgICAgICAgICAgICAgLyogUEFERElORyAqLworICAgICAgICB5ID0gY21udW0oIkhvdyBtYW55IHBhZGRpbmcgY2hhcmFjdGVycyBmb3IgaW5ib3VuZCBwYWNrZXRzIiwiMCIsMTAsJngsCisgICAgICAgICAgICAgICAgICB4eHN0cmluZyk7CisgICAgICAgIGlmICgoeSA9IHNldG51bSgmeix4LHksOTQpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgaWYgKHh4ID09IFhZUkVDVikKKyAgICAgICAgICBteXBhZG4gPSAoQ0hBUikgejsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG5wYWQgPSAoQ0hBUikgejsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSB5KTsKKworICAgICAgY2FzZSBYWVBBREM6ICAgICAgICAgICAgICAgICAgICAgIC8qIFBBRC1DSEFSQUNURVIgKi8KKyAgICAgICAgaWYgKCh5ID0gc2V0Y2MoIjAiLCZ6KSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGlmICh4eCA9PSBYWVJFQ1YpIG15cGFkYyA9IHo7IGVsc2UgcGFkY2ggPSB6OworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IHkpOworCisgICAgICBjYXNlIFhZVElNTzogICAgICAgICAgICAgICAgICAgICAgLyogVElNRU9VVCAqLworICAgICAgICBpZiAoeHggPT0gWFlSRUNWKSB7CisgICAgICAgICAgICB5ID0gY21udW0oIlBhY2tldCB0aW1lb3V0IGludGVydmFsIixja2l0b2EoVVJUSU1FKSwxMCwmeCx4eHN0cmluZyk7CisgICAgICAgICAgICBpZiAoKHkgPSBzZXRudW0oJnoseCx5LDk0KSkgPCAwKSByZXR1cm4oeSk7CisKKyAgICAgICAgICAgIGlmIChybXNmbGcpIHsgICAgICAgICAgICAgICAvKiBSRU1PVEUgU0VUIFJFQ0VJVkUgVElNRU9VVCAqLworICAgICAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsICI0MDIiLCBja2l0b2EoeiksICIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBTRVQgUkVDRUlWRSBUSU1FT1VUICovCisgICAgICAgICAgICAgICAgcGt0dGltID0gejsgICAgICAgICAgICAgLyogICBWYWx1ZSB0byBwdXQgaW4gbXkgbmVnb3RpYXRpb24gKi8KKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIHBhY2tldCBmb3Igb3RoZXIgS2VybWl0IHRvIHVzZSAqLworCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFNFTkQgVElNRU9VVCAqLworI2lmZGVmIENLX1RJTUVSUworICAgICAgICAgICAgZXh0ZXJuIGludCBydHRmbGcsIG1pbnRpbWUsIG1heHRpbWU7CisgICAgICAgICAgICBpbnQgdG1pbiA9IDAsIHRtYXggPSAwOworI2VuZGlmIC8qIENLX1RJTUVSUyAqLworICAgICAgICAgICAgeSA9IGNtbnVtKCJQYWNrZXQgdGltZW91dCBpbnRlcnZhbCIsY2tpdG9hKERNWVRJTSksMTAsJngseHhzdHJpbmcpOworICAgICAgICAgICAgaWYgKHkgPT0gLTMpIHsgICAgICAgICAgICAgIC8qIFRoZXkgY2FuY2VsbGVkIGEgcHJldmlvdXMgKi8KKyAgICAgICAgICAgICAgICB4ID0gRE1ZVElNOyAgICAgICAgICAgICAvKiBTRVQgU0VORCBjb21tYW5kLCBzbyByZXN0b3JlICovCisgICAgICAgICAgICAgICAgdGltZWYgPSAwOyAgICAgICAgICAgICAgLyogYW5kIHR1cm4gb2ZmIHRoZSBvdmVycmlkZSBmbGFnICovCisgICAgICAgICAgICAgICAgeSA9IGNtY2ZtKCk7CisgICAgICAgICAgICB9CisjaWZkZWYgQ0tfVElNRVJTCisgICAgICAgICAgICBpZiAoeSA8IDApIHJldHVybih5KTsKKyAgICAgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP091dCBvZiByYW5nZSAtICVkXG4iLHgpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHogPSBjbWtleSh0aW1vdGFiLDIsIiIsImR5bmFtaWMiLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeik7CisgICAgICAgICAgICBpZiAoeikgeworICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtbnVtKCJNaW5pbXVtIHRpbWVvdXQgdG8gYWxsb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIiwxMCwmdG1pbix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICBpZiAodG1pbiA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/T3V0IG9mIHJhbmdlIC0gJWRcbiIsdG1pbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtbnVtKCJNYXhpbXVtIHRpbWVvdXQgdG8gYWxsb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwIiwxMCwmdG1heCx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAvKiAwIG1lYW5zIGxldCBLZXJtaXQgY2hvb3NlLCA8IDAgbWVhbnMgbm8gbWF4aW11bSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICBydHRmbGcgPSB6OyAgICAgICAgICAgICAgICAgLyogUm91bmQtdHJpcCB0aW1lciBmbGFnICovCisgICAgICAgICAgICB6ID0geDsKKyNlbHNlCisgICAgICAgICAgICBpZiAoKHkgPSBzZXRudW0oJnoseCx5LDk0KSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeSk7CisjZW5kaWYgLyogQ0tfVElNRVJTICovCisgICAgICAgICAgICB0aW1lZiA9IDE7ICAgICAgICAgICAgICAgICAgLyogVHVybiBvbiB0aGUgb3ZlcnJpZGUgZmxhZyAqLworICAgICAgICAgICAgdGltaW50ID0gcnRpbW8gPSB6OyAgICAgICAgIC8qIE92ZXJyaWRlIHZhbHVlIGZvciBtZSB0byB1c2UgKi8KKyNpZmRlZiBDS19USU1FUlMKKyAgICAgICAgICAgIGlmIChydHRmbGcpIHsgICAgICAgICAgICAgICAvKiBMb3dlciBhbmQgdXBwZXIgYm91bmRzICovCisgICAgICAgICAgICAgICAgbWludGltZSA9IHRtaW47CisgICAgICAgICAgICAgICAgbWF4dGltZSA9IHRtYXg7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfVElNRVJTICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgY2FzZSBYWUZQQVRIOiAgICAgICAgICAgICAgICAgICAgIC8qIFBBVEhOQU1FUyAqLworICAgICAgICBpZiAoeHggPT0gWFlSRUNWKSB7CisgICAgICAgICAgICB5ID0gY21rZXkocnBhdGh0YWIsbnJwYXRodGFiLCIiLCJhdXRvIix4eHN0cmluZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB5ID0gY21rZXkocGF0aHRhYixucGF0aHRhYiwiIiwib2ZmIix4eHN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHkgPCAwKSByZXR1cm4oeSk7CisKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmICh4eCA9PSBYWVJFQ1YpIHsgICAgICAgICAgICAgLyogU0VUIFJFQ0VJVkUgUEFUSE5BTUVTICovCisgICAgICAgICAgICBmbnJwYXRoID0geTsKKyAgICAgICAgICAgIHB0YWJbcHJvdG9jb2xdLmZucnAgPSBmbnJwYXRoOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBTRU5EIFBBVEhOQU1FUyAqLworICAgICAgICAgICAgZm5zcGF0aCA9IHk7CisgICAgICAgICAgICBwdGFiW3Byb3RvY29sXS5mbnNwID0gZm5zcGF0aDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOyAgICAgICAgICAgIC8qIE5vdGU6IDAgPSBPTiwgMSA9IE9GRiAqLworICAgICAgICAvKiBJbiBvdGhlciB3b3JkcywgT04gPSBsZWF2ZSBwYXRobmFtZXMgT04sIE9GRiA9IHRha2UgdGhlbSBvZmYuICovCisKKyAgICAgIGNhc2UgWFlQQVVTOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgU0VORC9SRUNFSVZFIFBBVVNFICovCisgICAgICAgIHkgPSBjbW51bSgiTWlsbGlzZWNvbmRzIHRvIHBhdXNlIGJldHdlZW4gcGFja2V0cyIsIjAiLDEwLCZ4LHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKCh5ID0gc2V0bnVtKCZ6LHgseSwxNTAwMCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIHBrdHBhdXMgPSB6OworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisjaWZkZWYgQ0tYWENIQVIgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0VUIFNFTkQvUkVDRUlWRSBJR05PUkUvRE9VQkxFICovCisgICAgICBjYXNlIFhZSUdOOgorICAgICAgY2FzZSBYWURCTDogeworICAgICAgICAgIGludCBpLCB6ejsKKyAgICAgICAgICBzaG9ydCAqcDsKKyAgICAgICAgICBleHRlcm4gc2hvcnQgZGJsdFtdOworICAgICAgICAgIGV4dGVybiBpbnQgZGJsZmxhZywgaWduZmxhZzsKKworICAgICAgICAgIC8qIE1ha2Ugc3BhY2UgZm9yIGEgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIGlnbm9yZS9kb3VibGUgdGFibGUgKi8KKworICAgICAgICAgIHp6ID0geTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgaWYgKHp6ID09IFhZSUdOICYmIHh4ID09IFhZU0VORCkgeworICAgICAgICAgICAgICBibGFoIGJsYWggd2hvIGNhcmVzCisgICAgICAgICAgfQorICAgICAgICAgIGlmICh6eiA9PSBYWURCTCAmJiB4eCA9PSBYWVJFQ1YpIHsKKyAgICAgICAgICAgICAgYmxhaCBibGFoCisgICAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICBwID0gKHNob3J0ICopbWFsbG9jKDI1NiAqIHNpemVvZihzaG9ydCkpOworICAgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgICBwcmludGYoIj9JbnRlcm5hbCBlcnJvciAtIG1hbGxvYyBmYWlsdXJlXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSBwW2ldID0gZGJsdFtpXTsgLyogQ29weSBjdXJyZW50IHRhYmxlICovCisKKyAgICAgICAgICB3aGlsZSAoMSkgeyAgICAgICAgICAgICAgICAgICAvKiBDb2xsZWN0IGEgbGlzdCBvZiBudW1iZXJzICovCisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgICAgIHhfaWZudW0gPSAxOyAgICAgICAgICAgICAgLyogVHVybiBvZmYgY29tcGxhaW50cyBmcm9tIGV2YWwoKSAqLworI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICAgIGlmICgoeCA9IGNtbnVtKHp6ID09IFhZREJMID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoYXJhY3RlciB0byBkb3VibGUiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoYXJhY3RlciB0byBpZ25vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwxMCwmeSx4eHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSA8IDApIHsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICAgIHhfaWZudW0gPSAwOworI2VuZGlmIC8qIE5PU1BMICovCisgICAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgICAgICAgICAgLyogRG9uZSAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmICh4ID09IC0yKSB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHApIHsgZnJlZShwKTsgcCA9IE5VTEw7IH0KKyAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJTRVQgUy9SIERPVUJMRS9JR05PUkUgYXRtYnVmIixhdG1idWYsMCk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKCFja3N0cmNtcChhdG1idWYsIm5vbmUiLDQsMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIWNrc3RyY21wKGF0bWJ1Ziwibm9uIiwzLDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICFja3N0cmNtcChhdG1idWYsIm5vIiwyLDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICFja3N0cmNtcChhdG1idWYsIm4iLDEsMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSAvKiBHZXQgY29uZmlybWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMjU2OyB5KyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJsdFt5XSAmPSAoenogPT0gWFlEQkwpID8gMSA6IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6eiA9PSBYWURCTCkgZGJsZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6eiA9PSBYWUlHTikgaWduZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI/UGxlYXNlIHNwZWNpZnkgYSBudW1iZXIgb3IgdGhlIHdvcmQgTk9ORVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBmcmVlKHApOworICAgICAgICAgICAgICAgICAgICAgIHAgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgICB4X2lmbnVtID0gMDsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgICAgICBpZiAoeSA8IDAgfHwgeSA+IDI1NSkgeworICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/UGxlYXNlIGVudGVyIGEgY2hhcmFjdGVyIGNvZGUgaW4gcmFuZ2UgMC0yNTVcbiIpOworICAgICAgICAgICAgICAgICAgZnJlZShwKTsKKyAgICAgICAgICAgICAgICAgIHAgPSBOVUxMOworICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBwW3ldIHw9ICh6eiA9PSBYWURCTCkgPyAyIDogMTsKKyAgICAgICAgICAgICAgaWYgKHp6ID09IFhZREJMKSBkYmxmbGFnID0gMTsKKyAgICAgICAgICAgICAgaWYgKHp6ID09IFhZSUdOKSBpZ25mbGFnID0gMTsKKyAgICAgICAgICB9IC8qIEVuZCBvZiB3aGlsZSBsb29wICovCisKKyAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKy8qCisgIEdldCBoZXJlIG9ubHkgaWYgdGhleSBoYXZlIG1hZGUgbm8gbWlzdGFrZXMuICBDb3B5IHRlbXBvcmFyeSB0YWJsZSBiYWNrIHRvCisgIHBlcm1hbmVudCBvbmUsIHRoZW4gZnJlZSB0ZW1wb3JhcnkgdGFibGUgYW5kIHJldHVybiBzdWNjZXNzZnVsbHkuCisqLworICAgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgZGJsdFtpXSA9IHBbaV07CisgICAgICAgICAgICAgIGZyZWUocCk7CisgICAgICAgICAgICAgIHAgPSBOVUxMOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorI2VuZGlmIC8qIENLWFhDSEFSICovCisKKyNpZmRlZiBQSVBFU0VORAorICAgICAgY2FzZSBYWUZMVFI6IHsgICAgICAgICAgICAgICAgICAgIC8qIFNFVCB7IFNFTkQsIFJFQ0VJVkUgfSBGSUxURVIgKi8KKyAgICAgICAgICBpZiAoKHkgPSBjbXR4dCgoeHggPT0gWFlTRU5EKSA/CisgICAgICAgICAgICAgICAgIkZpbHRlciBwcm9ncmFtIGZvciBzZW5kaW5nIGZpbGVzIC1cblwKKyB1c2UgXFx2KGZpbGVuYW1lKSB0byBzdWJzdGl0dXRlIGZpbGVuYW1lIiA6CisgICAgICAgICAgICAgICAgIkZpbHRlciBwcm9ncmFtIGZvciByZWNlaXZpbmcgZmlsZXMgLVxuXAorIHVzZSBcXHYoZmlsZW5hbWUpIHRvIHN1YnN0aXR1dGUgZmlsZW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICIiLCZzLE5VTEwpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgaWYgKCEqcykgeyAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZpbmcgYSBmaWx0ZXIuLi4gKi8KKyAgICAgICAgICAgICAgaWYgKHh4ID09IFhZU0VORCAmJiBzbmRmaWx0ZXIpIHsKKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmdfc2ZpbHRlcixOVUxMKTsKKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNuZGZpbHRlcixOVUxMKTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChyY3ZmaWx0ZXIpIHsKKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJmdfcmZpbHRlcixOVUxMKTsKKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnJjdmZpbHRlcixOVUxMKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZGluZyBhIGZpbHRlci4uLiAqLworICAgICAgICAgIHMgPSBicnN0cmlwKHMpOyAgICAgICAgICAgICAgIC8qIFN0cmlwIGFueSBicmFjZXMgKi8KKyAgICAgICAgICB5ID0gc3RybGVuKHMpOworICAgICAgICAgIGlmICh4eCA9PSBYWVNFTkQpIHsgICAgICAgICAgIC8qIEZvciBTRU5EIGZpbHRlci4uLiAqLworICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgeTsgeCsrKSB7IC8qIG1ha2Ugc3VyZSB0aGV5IGluY2x1ZGVkICJcdiguLi4pIiAqLworICAgICAgICAgICAgICAgICAgaWYgKHNbeF0gIT0gJ1xcJykgY29udGludWU7CisgICAgICAgICAgICAgICAgICBpZiAoc1t4KzFdID09ICd2JykgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHggPT0geSkgeworICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAiP0ZpbHRlciBtdXN0IGNvbnRhaW4gYSByZXBsYWNlbWVudCB2YXJpYWJsZSBmb3IgZmlsZW5hbWUuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHh4ID09IFhZU0VORCkgeworICAgICAgICAgICAgICBtYWtlc3RyKCZzbmRmaWx0ZXIscyk7CisgICAgICAgICAgICAgIG1ha2VzdHIoJmdfc2ZpbHRlcixzKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBtYWtlc3RyKCZyY3ZmaWx0ZXIscyk7CisgICAgICAgICAgICAgIG1ha2VzdHIoJmdfcmZpbHRlcixzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisgICAgICBjYXNlIFhZSU5JTDoKKyAgICAgICAgeSA9IGNtbnVtKCJNYXggbGVuZ3RoIGZvciBwcm90b2NvbCBpbml0IHN0cmluZyIsIi0xIiwxMCwmeCx4eHN0cmluZyk7CisgICAgICAgIGlmICgoeSA9IHNldG51bSgmeix4LHksLTEpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoeHggPT0gWFlTRU5EKQorICAgICAgICAgIHNwcm1sZW4gPSB6OworICAgICAgICBlbHNlCisgICAgICAgICAgcnBybWxlbiA9IHo7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgOTkzOiB7CisgICAgICAgICAgZXh0ZXJuIGludCBzZW5kaXBrdHM7CisgICAgICAgICAgaWYgKHh4ID09IFhZU0VORCkgeworICAgICAgICAgICAgICBpZiAoKHggPSBzZXRvbigmc2VuZGlwa3RzKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgfQorI2lmZGVmIENLX1BFUk1TCisgICAgICBjYXNlIDk5NDoKKwlzd2l0Y2goeHgpIHsKKwkgIGNhc2UgWFlTRU5EOgorCSAgICBpZiAoKHggPSBzZXRvbigmYXRscHJvKSkgPCAwKSByZXR1cm4oeCk7CisJICAgIGF0Z3BybyA9IGF0bHBybzsKKwkgICAgcmV0dXJuKDEpOworCSAgY2FzZSBYWVJFQ1Y6CisJICAgIGlmICgoeCA9IHNldG9uKCZhdGxwcmkpKSA8IDApIHJldHVybih4KTsKKwkgICAgYXRncHJpID0gYXRscHJpOworCSAgICByZXR1cm4oMSk7CisJICBkZWZhdWx0OgorCSAgICByZXR1cm4oLTIpOworCX0KKyNlbmRpZiAvKiBDS19QRVJNUyAqLworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICAgIGNhc2UgWFlDU0VUOiB7ICAgICAgICAgICAgICAgICAgICAvKiBDSEFSQUNURVItU0VULVNFTEVDVElPTiAqLworICAgICAgICAgIGV4dGVybiBzdHJ1Y3Qga2V5dGFiIHhmcm10YWJbXTsKKyAgICAgICAgICBleHRlcm4gaW50IHJfY3NldCwgc19jc2V0OworICAgICAgICAgIGlmICgoeSA9IGNta2V5KHhmcm10YWIsMiwiIiwiYXV0b21hdGljIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgaWYgKHh4ID09IFhZU0VORCkKKyAgICAgICAgICAgIHNfY3NldCA9IHk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcl9jc2V0ID0geTsKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworICAgICAgY2FzZSBYWUJVUDoKKyAgICAgICAgaWYgKCh5ID0gY21rZXkob25vZmYsMiwiIiwib24iLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmICh4eCA9PSBYWVNFTkQpIHsKKyAgICAgICAgICAgIGV4dGVybiBpbnQgc2tpcGJ1cDsKKyAgICAgICAgICAgIHNraXBidXAgPSAoeSA9PSAwKSA/IDEgOiAwOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigKKyI/UGxlYXNlIHVzZSBTRVQgRklMRSBDT0xMSVNJT04gdG8gY2hvb3NlIHRoZSBkZXNpcmVkIGFjdGlvblxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisKKyAgICAgIGNhc2UgWFlNT1ZFOgorI2lmZGVmIENPTU1FTlQKKyAgICAgICAgeSA9IGNtZGlyKCJEaXJlY3RvcnkgdG8gbW92ZSBmaWxlKHMpIHRvIGFmdGVyIHN1Y2Nlc3NmdWwgdHJhbnNmZXIiLAorICAgICAgICAgICAgICAgICAgIiIsJnMseHhzdHJpbmcpOworI2Vsc2UKKyAgICAgICAgeSA9IGNtdHh0KCJEaXJlY3RvcnkgdG8gbW92ZSBmaWxlKHMpIHRvIGFmdGVyIHN1Y2Nlc3NmdWwgdHJhbnNmZXIiLAorCQkgICIiLCZzLHh4c3RyaW5nKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAgICAgaWYgKHkgPCAwICYmIHkgIT0gLTMpCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgICAgIHMgPSBicnN0cmlwKGxpbmUpOworCisjaWZkZWYgQ09NTUVOVAorCS8qIE9ubHkgbmVlZGVkIGZvciBjbWRpcigpICovCisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCQorCS8qIENoZWNrIGRpcmVjdG9yeSBleGlzdGVuY2UgaWYgYWJzb2x1dGUgKi8KKwkvKiBUSElTIE1FQU5TIElUIENBTidUIElOQ0xVREUgQU5ZIERFRkVSUkVEIFZBUklBQkxFUyEgKi8KKwlpZiAocykgaWYgKCpzKSB7CisJICAgIGlmIChpc2Fic29sdXRlKHMpICYmICFpc2RpcihzKSkgeworCQlwcmludGYoIj9EaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgLSAlc1xuIixzKTsKKwkJcmV0dXJuKC05KTsKKwkgICAgfQorCX0KKyAgICAgICAgaWYgKHh4ID09IFhZU0VORCkgeworICAgICAgICAgICAgaWYgKCpzKSB7CisjaWZkZWYgQ09NTUVOVAorCQkvKiBBbGxvdyBpdCB0byBiZSByZWxhdGl2ZSAqLworICAgICAgICAgICAgICAgIHpmbnFmcChzLExJTkJVRlNJWixsaW5lKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgbWFrZXN0cigmc25kX21vdmUsbGluZSk7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmZ19zbmRfbW92ZSxsaW5lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmc25kX21vdmUsTlVMTCk7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmZ19zbmRfbW92ZSxOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgqcykgeworI2lmZGVmIENPTU1FTlQKKwkJLyogQWxsb3cgaXQgdG8gYmUgcmVsYXRpdmUgKi8KKyAgICAgICAgICAgICAgICB6Zm5xZnAocyxMSU5CVUZTSVosbGluZSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgIG1ha2VzdHIoJnJjdl9tb3ZlLGxpbmUpOworICAgICAgICAgICAgICAgIG1ha2VzdHIoJmdfcmN2X21vdmUsbGluZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1ha2VzdHIoJnJjdl9tb3ZlLE5VTEwpOworICAgICAgICAgICAgICAgIG1ha2VzdHIoJmdfcmN2X21vdmUsTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgY2FzZSBYWVJFTkFNRToKKyAgICAgICAgeSA9IGNtdHh0KCJUZW1wbGF0ZSB0byByZW5hbWUgZmlsZShzKSB0byBhZnRlciBzdWNjZXNzZnVsIHRyYW5zZmVyIiwKKyAgICAgICAgICAgICAgICAgICIiLCZzLE5VTEwpOwkJLyogTk9URTogbm8geHhzdHJpbmcgKi8KKyAgICAgICAgaWYgKHkgPCAwICYmIHkgIT0gLTMpCQkvKiBFdmFsdWF0aW9uIGlzIGRlZmVycmVkICovCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgICAgIHMgPSBicnN0cmlwKGxpbmUpOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoeHggPT0gWFlTRU5EKSB7CisgICAgICAgICAgICBpZiAoKnMpIHsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZzbmRfcmVuYW1lLHMpOworICAgICAgICAgICAgICAgIG1ha2VzdHIoJmdfc25kX3JlbmFtZSxzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmc25kX3JlbmFtZSxOVUxMKTsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZnX3NuZF9yZW5hbWUsTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKnMpIHsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZyY3ZfcmVuYW1lLHMpOworICAgICAgICAgICAgICAgIG1ha2VzdHIoJmdfcmN2X3JlbmFtZSxzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmcmN2X3JlbmFtZSxOVUxMKTsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZnX3Jjdl9yZW5hbWUsTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworI2lmZGVmIFZNUworICAgICAgY2FzZSA4ODc6CQkJCS8qIFZFUlNJT04tTlVNQkVSUyAqLworICAgICAgICBpZiAoeHggPT0gWFlTRU5EKSB7CisgICAgICAgICAgICBleHRlcm4gaW50IHZtc3N2ZXJzaW9uczsKKyAgICAgICAgICAgIHJldHVybihzZXRvbigmdm1zc3ZlcnNpb25zKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleHRlcm4gaW50IHZtc3J2ZXJzaW9uczsKKyAgICAgICAgICAgIHJldHVybihzZXRvbigmdm1zcnZlcnNpb25zKSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBWTVMgKi8KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgU0VUIFNFTkQvUkVDRUlWRS4uLiAqLworfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PWE1JVAoraW50CitzZXR4bWl0KCkgeworICAgIGlmICgoeSA9IGNta2V5KHhtaXRhYixueG1pdCwiIiwiIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgIHN3aXRjaCAoeSkgeworICAgICAgY2FzZSBYTUlURTogICAgICAgICAgICAgICAgICAgICAgIC8qIEVPRiAqLworICAgICAgICB5ID0gY210eHQoIkNoYXJhY3RlcnMgdG8gc2VuZCBhdCBlbmQgb2YgZmlsZSxcblwKKyBVc2UgYmFja3NsYXNoIGNvZGVzIGZvciBjb250cm9sIGNoYXJhY3RlcnMiLCIiLCZzLHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKHkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGlmICgoaW50KXN0cmxlbihzKSA+IFhNQlVGTCkgeworICAgICAgICAgICAgcHJpbnRmKCI/VG9vIG1hbnkgY2hhcmFjdGVycywgJWQgbWF4aW11bVxuIixYTUJVRkwpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgICAgICBja3N0cm5jcHkoeG1pdGJ1ZixzLFhNQlVGTCk7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyAgICAgIGNhc2UgWE1JVEY6ICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxsICovCisgICAgICAgIHkgPSBjbW51bSgiTnVtZXJpYyBjb2RlIGZvciBibGFuay1saW5lIGZpbGwgY2hhcmFjdGVyIiwiMCIsMTAsJngsCisgICAgICAgICAgICAgICAgICB4eHN0cmluZyk7CisgICAgICAgIGlmICgoeSA9IHNldG51bSgmeix4LHksMTI3KSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIHhtaXRmID0gejsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIGNhc2UgWE1JVEw6ICAgICAgICAgICAgICAgICAgICAgICAvKiBMaW5lZmVlZCAqLworICAgICAgICByZXR1cm4oc2V0b24oJnhtaXRsKSk7CisgICAgICBjYXNlIFhNSVRTOiAgICAgICAgICAgICAgICAgICAgICAgLyogTG9ja2luZy1TaGlmdCAqLworICAgICAgICByZXR1cm4oc2V0b24oJnhtaXRzKSk7CisgICAgICBjYXNlIFhNSVRQOiAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvbXB0ICovCisgICAgICAgIHkgPSBjbW51bSgiTnVtZXJpYyBjb2RlIGZvciBob3N0J3MgcHJvbXB0IGNoYXJhY3RlciwgMCBmb3Igbm9uZSIsCisgICAgICAgICAgICAgICAgICAiMTAiLDEwLCZ4LHh4c3RyaW5nKTsKKyAgICAgICAgaWYgKCh5ID0gc2V0bnVtKCZ6LHgseSwxMjcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgeG1pdHAgPSB6OworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgY2FzZSBYTUlUWDogICAgICAgICAgICAgICAgICAgICAgIC8qIEVjaG8gKi8KKyAgICAgICAgcmV0dXJuKHNldG9uKCZ4bWl0eCkpOworICAgICAgY2FzZSBYTUlUVzogICAgICAgICAgICAgICAgICAgICAgIC8qIFBhdXNlICovCisgICAgICAgIHkgPSBjbW51bSgiTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBwYXVzZSBiZXR3ZWVuIGJpbmFyeSBjaGFyYWN0ZXJzXG5cCitvciB0ZXh0IGxpbmVzIGR1cmluZyB0cmFuc21pc3Npb24iLCIwIiwxMCwmeCx4eHN0cmluZyk7CisgICAgICAgIGlmICgoeSA9IHNldG51bSgmeix4LHksMTAwMCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICB4bWl0dyA9IHo7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICBjYXNlIFhNSVRUOiAgICAgICAgICAgICAgICAgICAgICAgLyogVGltZW91dCAqLworICAgICAgICB5ID0gY21udW0oIlNlY29uZHMgdG8gd2FpdCBmb3IgZWFjaCBjaGFyYWN0ZXIgdG8gZWNobyIsCisgICAgICAgICAgICAgICAgICAiMSIsMTAsJngseHhzdHJpbmcpOworICAgICAgICBpZiAoKHkgPSBzZXRudW0oJnoseCx5LDEwMDApKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgeG1pdHQgPSB6OworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9Cit9CisjZW5kaWYgLyogTk9YTUlUICovCisKKyNpZm5kZWYgTk9YRkVSCisvKiAgRCBPIFIgTSBUICAtLSAgRG8gYSByZW1vdGUgY29tbWFuZCAgKi8KKworVk9JRAorcm1zZygpIHsKKyAgICBpZiAocGZsYWcgJiYgIXF1aWV0ICYmIGZkaXNwbGEgIT0gWFlGRF9OKQorICAgICAgcHJpbnRmKAorI2lmZGVmIENLX05FRURfU0lHCisgICAgICAgIiBUeXBlIHlvdXIgZXNjYXBlIGNoYXJhY3RlciwgJXMsIGZvbGxvd2VkIGJ5IFggb3IgRSB0byBjYW5jZWwuXG4iLAorICAgICAgIGRiY2hyKGVzY2FwZSkKKyNlbHNlCisgICAgICAgIiBQcmVzcyB0aGUgWCBvciBFIGtleSB0byBjYW5jZWwuXG4iCisjZW5kaWYgLyogQ0tfTkVFRF9TSUcgKi8KKyAgICAgICk7Cit9CisKK3N0YXRpYyBpbnQgeHpjbWQgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBHbG9iYWwgY29weSBvZiBSRU1PVEUgY21kIGluZGV4ICovCisKKy8qICBSIEUgTSBDIEYgTSAgLS0gIENvbmZpcm0gYSBSRU1PVEUgY29tbWFuZCAgKi8KKy8qCisgIExpa2UgY21jZm0oKSwgYnV0IGFsbG93cyBmb3IgYSByZWRpcmVjdGlvbiBpbmRpY2F0b3Igb24gdGhlIGVuZCwKKyAgbGlrZSAiPiBmaWxlbmFtZSIgb3IgInwgY29tbWFuZCIuICBSZXR1cm5zIHdoYXQgY21jZm0oKSB3b3VsZCBoYXZlCisgIHJldHVybmVkOiAtMSBpZiByZXBhcnNlIG5lZWRlZCwgZXRjIGV0YyBibGFoIGJsYWguICBPbiBzdWNjZXNzLAorICByZXR1cm5zIDEgd2l0aDoKKworICAgIGNoYXIgKiByZW1kZXN0IGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgb3IgY29tbWFuZC4KKyAgICBpbnQgcmVtZmlsZSBzZXQgdG8gMSBpZiB0aGVyZSBpcyB0byBiZSBhbnkgcmVkaXJlY3Rpb24uCisgICAgaW50IHJlbWFwcGQgc2V0IHRvIDEgaWYgb3V0cHV0IGZpbGUgaXMgdG8gYmUgYXBwZW5kZWQgdG8uCisgICAgaW50IHJlbXBpcGUgc2V0IHRvIDEgaWYgcmVtZGVzdCBpcyBhIGNvbW1hbmQsIDAgaWYgaXQgaXMgYSBmaWxlLgorKi8KK3N0YXRpYyBpbnQKK3JlbWNmbSgpIHsKKyAgICBpbnQgeDsKKyAgICBjaGFyICpzOworICAgIGNoYXIgYzsKKworICAgIHJlbWZpbGUgPSAwOworICAgIHJlbXBpcGUgPSAwOworICAgIHJlbWFwcGQgPSAwOworCisgICAgaWYgKCh4ID0gY210eHQoCisgICAgICAgICAgICAgIj4gZmlsZW5hbWUsIHwgY29tbWFuZCxcblwKK29yIHR5cGUgY2FycmlhZ2UgcmV0dXJuIHRvIGNvbmZpcm0gdGhlIGNvbW1hbmQiLAorICAgICAgICAgICAgICAgICAgICIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworICAgIGlmIChyZW1kZXN0KSB7CisgICAgICAgIGZyZWUocmVtZGVzdCk7CisgICAgICAgIHJlbWRlc3QgPSBOVUxMOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJyZW1jZm0gbG9jYWwiLCIiLGxvY2FsKTsKKyAgICBkZWJ1ZyhGMTEwLCJyZW1jZm0gcyIscywwKTsKKyAgICBkZWJ1ZyhGMTAxLCJyZW1jZm0gY21kIiwiIix4emNtZCk7CisKKyAgICBpZiAoISpzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyByZWRpcmVjdGlvbiBpbmRpY2F0b3IgKi8KKyAgICAgICAgaWYgKCFsb2NhbCAmJgorICAgICAgICAgICAgKHh6Y21kID09IFhaRElSIHx8IHh6Y21kID09IFhaVFlQIHx8CisgICAgICAgICAgICAgeHpjbWQgPT0gWFpYSVQgfHwgeHpjbWQgPT0gWFpTUEEgfHwKKyAgICAgICAgICAgICB4emNtZCA9PSBYWkhMUCB8fCB4emNtZCA9PSBYWlBXRCB8fAorICAgICAgICAgICAgIHh6Y21kID09IFhaTEdJIHx8IHh6Y21kID09IFhaTEdPIHx8CisgICAgICAgICAgICAgeHpjbWQgPT0gWFpXSE8gfHwgeHpjbWQgPT0gWFpIT1MpKSB7CisgICAgICAgICAgICBwcmludGYoIj9cIiVzXCIgaGFzIG5vIGVmZmVjdCBpbiByZW1vdGUgbW9kZVxuIixjbWRidWYpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKyAgICBjID0gKnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIHNvbWV0aGluZyAqLworICAgIGlmIChjICE9ICc+JyAmJiBjICE9ICd8JykgeyAgICAgICAgIC8qIElzIGl0ID4gb3IgfCA/ICovCisgICAgICAgIHByaW50ZigiP05vdCBjb25maXJtZWRcbiIpOyAgICAgLyogTm8gKi8KKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgcysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlIHdoYXQgZm9sbG93cyAqLworICAgIGlmIChjID09ICc+JyAmJiAqcyA9PSAnPicpIHsgICAgICAgIC8qIEFsbG93IGZvciAiPj4iIHRvbyAqLworICAgICAgICBzKys7CisgICAgICAgIHJlbWFwcGQgPSAxOyAgICAgICAgICAgICAgICAgICAgLyogQXBwZW5kIHRvIG91dHB1dCBmaWxlICovCisgICAgfQorICAgIHdoaWxlICgqcyA9PSBTUCB8fCAqcyA9PSBIVCkgcysrOyAgIC8qIFN0cmlwIGludGVydmVuaW5nIHdoaXRlc3BhY2UgKi8KKyAgICBpZiAoISpzKSB7CisgICAgICAgIHByaW50ZigiPyVzIG1pc3NpbmdcbiIsIGMgPT0gJz4nID8gIkZpbGVuYW1lIiA6ICJDb21tYW5kIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGlmIChjID09ICc+JyAmJiB6Y2hrbyhzKSA8IDApIHsgICAgIC8qIENoZWNrIGFjY2Vzc2liaWxpdHkgKi8KKyAgICAgICAgcHJpbnRmKCI/QWNjZXNzIGRlbmllZCAtICVzXG4iLCBzKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgcmVtZmlsZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGdsb2JhbCByZXN1bHRzICovCisgICAgcmVtcGlwZSA9IChjID09ICd8Jyk7CisgICAgaWYgKHJlbXBpcGUKKyNpZm5kZWYgTk9QVVNICisgICAgICAgICYmIG5vcHVzaAorI2VuZGlmIC8qIE5PUFVTSCAqLworICAgICAgICApIHsKKyAgICAgICAgcHJpbnRmKCI/U29ycnksIGFjY2VzcyB0byBleHRlcm5hbCBjb21tYW5kcyBpcyBkaXNhYmxlZC5cbiIpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICBtYWtlc3RyKCZyZW1kZXN0LHMpOworI2lmbmRlZiBOT0RFQlVHCisgICAgaWYgKGRlYmxvZykgeworICAgICAgICBkZWJ1ZyhGMTAxLCJyZW1jZm0gcmVtZmlsZSIsIiIscmVtZmlsZSk7CisgICAgICAgIGRlYnVnKEYxMDEsInJlbWNmbSByZW1hcHBkIiwiIixyZW1hcHBkKTsKKyAgICAgICAgZGVidWcoRjEwMSwicmVtY2ZtIHJlbXBpcGUiLCIiLHJlbXBpcGUpOworICAgICAgICBkZWJ1ZyhGMTEwLCJyZW1jZm0gcmVtZGVzdCIscmVtZGVzdCwgMCk7CisgICAgfQorI2VuZGlmIC8qIE5PREVCVUcgKi8KKyAgICByZXR1cm4oMSk7Cit9CisKKy8qICBSIEUgTSBUIFggVCAgLS0gIExpa2UgcmVtY2ZtKCkuLi4gICovCisvKgorICAgLi4uIGJ1dCBmb3IgUkVNT1RFIGNvbW1hbmRzIHRoYXQgZW5kIHdpdGggY210eHQoKS4KKyAgIEhlcmUgd2UgbXVzdCBkZWNpcGhlciBicmFjZXMgdG8gZGlzY292ZXIgd2hldGhlciB0aGUgdHJhaWxpbmcKKyAgIHJlZGlyZWN0aW9uIGluZGljYXRvciBpcyBpbnRlbmRlZCBmb3IgbG9jYWwgdXNlLCBvciB0byBiZSBzZW50IG91dAorICAgdG8gdGhlIHNlcnZlciwgYXMgaW46CisKKyAgICAgcmVtb3RlIGhvc3QgYmxhaCBibGFoID4gZmlsZSAgICAgICAgICAgICAgICAgVGhpcyBlbmQKKyAgICAgcmVtb3RlIGhvc3QgeyBibGFoIGJsYWggfSA+IGZpbGUgICAgICAgICAgICAgVGhpcyBlbmQKKyAgICAgcmVtb3RlIGhvc3QgeyBibGFoIGJsYWggPiBmaWxlIH0gICAgICAgICAgICAgVGhhdCBlbmQKKyAgICAgcmVtb3RlIGhvc3QgeyBibGFoIGJsYWggPiBmaWxlIH0gPiBmaWxlICAgICAgQm90aCBlbmRzCisKKyAgIFBpcGVzIHRvbzoKKworICAgICByZW1vdGUgaG9zdCBibGFoIGJsYWggfCBjbWQgICAgICAgICAgICAgICAgICBUaGlzIGVuZAorICAgICByZW1vdGUgaG9zdCB7IGJsYWggYmxhaCB9IHwgY21kICAgICAgICAgICAgICBUaGlzIGVuZAorICAgICByZW1vdGUgaG9zdCB7IGJsYWggYmxhaCB8IGNtZCB9ICAgICAgICAgICAgICBUaGF0IGVuZAorICAgICByZW1vdGUgaG9zdCB7IGJsYWggYmxhaCB8IGNtZCB9IHwgY21kICAgICAgICBCb3RoIGVuZHMKKworICAgT3IgYm90aDoKKworICAgICByZW1vdGUgaG9zdCBibGFoIGJsYWggfCBjbWQgPiBmaWxlICAgICAgICAgICBUaGlzIGVuZCwgZXRjIGV0Yy4uLgorCisgICBOb3RlOiB0aGlzIHJlYWxseSBvbmx5IG1ha2VzIHNlbnNlIGZvciBSRU1PVEUgSE9TVCwgYnV0IHdoeSBiZSBwaWNreT8KKyAgIENhbGwgYWZ0ZXIgY2FsbGluZyBjbXR4dCgpLCB3aXRoIHBvaW50ZXIgdG8gc3RyaW5nIHRoYXQgY210eHQoKSBwYXJzZWQsCisgICBhcyBpbiAicmVtdHh0KCZzKTsiLgorCisgICBSZXR1cm5zOgorICAgIDEgb24gc3VjY2VzcyB3aXRoIGJyYWNlcyAmIHJlZGlyZWN0aW9uIHRoaW5ncyByZW1vdmVkICYgcG9pbnRlciB1cGRhdGVkLAorICAgLTkgb24gZmFpbHVyZSAoYmFkIGluZGlyZWN0aW9uKSwgYWZ0ZXIgcHJpbnRpbmcgZXJyb3IgbWVzc2FnZS4KKyovCitpbnQKK3JlbXR4dChwKSBjaGFyICoqIHA7IHsKKyAgICBpbnQgaSwgeCwgYnBvcywgcHBvczsKKyAgICBjaGFyIGMsICpzLCAqcTsKKworICAgIHJlbWZpbGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZ2xvYmFsIHJlc3VsdHMgKi8KKyAgICByZW1waXBlID0gMDsKKyAgICByZW1hcHBkID0gMDsKKyAgICBpZiAocmVtZGVzdCkgeworICAgICAgICBmcmVlKHJlbWRlc3QpOworICAgICAgICByZW1kZXN0ID0gTlVMTDsKKyAgICB9CisgICAgcyA9ICpwOworICAgIGlmICghcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHJlZGlyZWN0aW9uIGluZGljYXRvciAqLworICAgICAgcyA9ICIiOworICAgIGlmICghKnMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpdHRvICovCisgICAgICAgIGlmICghbG9jYWwgJiYKKyAgICAgICAgICAgICh4emNtZCA9PSBYWkRJUiB8fCB4emNtZCA9PSBYWlRZUCB8fAorICAgICAgICAgICAgIHh6Y21kID09IFhaWElUIHx8IHh6Y21kID09IFhaU1BBIHx8CisgICAgICAgICAgICAgeHpjbWQgPT0gWFpITFAgfHwgeHpjbWQgPT0gWFpQV0QgfHwKKyAgICAgICAgICAgICB4emNtZCA9PSBYWkxHSSB8fCB4emNtZCA9PSBYWkxHTyB8fAorICAgICAgICAgICAgIHh6Y21kID09IFhaV0hPIHx8IHh6Y21kID09IFhaSE9TKSkgeworICAgICAgICAgICAgcHJpbnRmKCI/XCIlc1wiIGhhcyBubyBlZmZlY3QgaW4gcmVtb3RlIG1vZGVcbiIsY21kYnVmKTsKKyAgICAgICAgICAgIGlmIChoaW50cykgeworICAgICAgICAgICAgICAgIHByaW50ZigiSGludDogVHJ5IGFnYWluIHdpdGggYW4gb3V0cHV0IHJlZGlyZWN0b3IuXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHJldHVybigxKTsKKyAgICB9CisgICAgYnBvcyA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zaXRpb24gb2YgPiAoYnJhY2tldCkgKi8KKyAgICBwcG9zID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3NpdGlvbiBvZiB8IChwaXBlKSAqLworICAgIHggPSBzdHJsZW4ocyk7ICAgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBjbXR4dCgpIHN0cmluZyAqLworCisgICAgZm9yIChpID0geC0xOyBpID49IDA7IGktLSkgeyAgICAgICAgLyogU2VhcmNoIHJpZ2h0IHRvIGxlZnQuICovCisgICAgICAgIGMgPSBzW2ldOworICAgICAgICBpZiAoYyA9PSAnfScpICAgICAgICAgICAgICAgICAgIC8qIEJyZWFrIG9uIGZpcnN0IHJpZ2h0IGJyYWNlICovCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgbG9vayBhdCBjb250ZW50cyBvZiBicmFjZXMgKi8KKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnPicpICAgICAgICAgICAgICAvKiBSZWNvcmQgcG9zaXRpb24gb2YgPiAqLworICAgICAgICAgIGJwb3MgPSBpOworICAgICAgICBlbHNlIGlmIChjID09ICd8JykgICAgICAgICAgICAgIC8qIGFuZCBvZiB8ICovCisgICAgICAgICAgcHBvcyA9IGk7CisgICAgfQorICAgIGlmIChicG9zIDwgMCAmJiBwcG9zIDwgMCkgeyAgICAgICAgIC8qIE5vIHJlZGlyZWN0b3JzLiAqLworICAgICAgICBpZiAoIWxvY2FsICYmCisgICAgICAgICAgICAoeHpjbWQgPT0gWFpESVIgfHwgeHpjbWQgPT0gWFpUWVAgfHwKKyAgICAgICAgICAgICB4emNtZCA9PSBYWlhJVCB8fCB4emNtZCA9PSBYWlNQQSB8fAorICAgICAgICAgICAgIHh6Y21kID09IFhaSExQIHx8IHh6Y21kID09IFhaUFdEIHx8CisgICAgICAgICAgICAgeHpjbWQgPT0gWFpMR0kgfHwgeHpjbWQgPT0gWFpMR08gfHwKKyAgICAgICAgICAgICB4emNtZCA9PSBYWldITyB8fCB4emNtZCA9PSBYWkhPUykpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1wiJXNcIiBoYXMgbm8gZWZmZWN0IGluIHJlbW90ZSBtb2RlXG4iLGNtZGJ1Zik7CisgICAgICAgICAgICBpZiAoaGludHMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkhpbnQ6IFRyeSBhZ2FpbiB3aXRoIGFuIG91dHB1dCByZWRpcmVjdG9yLlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIHMgPSBicnN0cmlwKHMpOyAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIG91dGVyIGJyYWNlcyBpZiBhbnkuICovCisgICAgICAgICpwID0gczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnQgdG8gcmVzdWx0ICovCisgICAgICAgIHJldHVybigxKTsgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybi4gKi8KKyAgICB9CisgICAgcmVtZmlsZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQncyB8IG9yID4gKi8KKyAgICBpID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgbGVmdG1vc3Qgc3ltYm9sICovCisgICAgaWYgKGJwb3MgPiAtMSkgICAgICAgICAgICAgICAgICAgICAgLyogQnJhY2tldCAqLworICAgICAgaSA9IGJwb3M7CisgICAgaWYgKHBwb3MgPiAtMSAmJiAocHBvcyA8IGJwb3MgfHwgYnBvcyA8IDApKSB7IC8qIG9yIHBpcGUgKi8KKyAgICAgICAgaSA9IHBwb3M7CisgICAgICAgIHJlbXBpcGUgPSAxOworICAgIH0KKyAgICBpZiAocmVtcGlwZQorI2lmbmRlZiBOT1BVU0gKKyAgICAgICAgJiYgbm9wdXNoCisjZW5kaWYgLyogTk9QVVNIICovCisgICAgICAgICkgeworICAgICAgICBwcmludGYoIj9Tb3JyeSwgYWNjZXNzIHRvIGV4dGVybmFsIGNvbW1hbmRzIGlzIGRpc2FibGVkLlxuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGMgPSBzW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgb2Ygc3ltYm9sICovCisKKyAgICBpZiAoYyA9PSAnPicgJiYgc1tpKzFdID09ICc+JykgICAgICAvKiAiPj4iIGZvciBhcHBlbmQ/ICovCisgICAgICByZW1hcHBkID0gMTsgICAgICAgICAgICAgICAgICAgICAvKiBJdCdzIG5vdCBqdXN0IGEgZmxhZyBpdCdzIGEgbnVtYmVyICovCisKKyAgICBxID0gcyArIGkgKyAxICsgcmVtYXBwZDsgICAgICAgICAgICAvKiBQb2ludCBwYXN0IHN5bWJvbCBpbiBzdHJpbmcgKi8KKyAgICB3aGlsZSAoKnEgPT0gU1AgfHwgKnEgPT0gSFQpIHErKzsgICAvKiBhbmQgYW55IGludGVydmVuaW5nIHdoaXRlc3BhY2UgKi8KKyAgICBpZiAoISpxKSB7CisgICAgICAgIHByaW50ZigiPyVzIG1pc3NpbmdcbiIsIGMgPT0gJz4nID8gIkZpbGVuYW1lIiA6ICJDb21tYW5kIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGlmIChjID09ICc+JyAmJiB6Y2hrbyhxKSA8IDApIHsgICAgIC8qIChEb2Vzbid0IHdvcmsgZm9yIHwgY21kID4gZmlsZSkgKi8KKyAgICAgICAgcHJpbnRmKCI/QWNjZXNzIGRlbmllZCAtICVzXG4iLCBxKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgbWFrZXN0cigmcmVtZGVzdCxxKTsgICAgICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcgKi8KKyAgICBxID0gcyArIGkgLSAxOyAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludCBiZWZvcmUgc3ltYm9sICovCisgICAgd2hpbGUgKHEgPiBzICYmICgqcSA9PSBTUCB8fCAqcSA9PSBIVCkpIC8qIFN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KKyAgICAgIHEtLTsKKyAgICAqKHErMSkgPSBOVUw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hdGUgdGhlIHN0cmluZy4gKi8KKyAgICBzID0gYnJzdHJpcChzKTsgICAgICAgICAgICAgICAgICAgICAvKiBSZW1vdmUgYW55IGJyYWNlcyAqLworICAgICpwID0gczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCByZXR1cm4gdmFsdWUgKi8KKworI2lmbmRlZiBOT0RFQlVHCisgICAgaWYgKGRlYmxvZykgeworICAgICAgICBkZWJ1ZyhGMTAxLCJyZW10eHQgcmVtZmlsZSIsIiIscmVtZmlsZSk7CisgICAgICAgIGRlYnVnKEYxMDEsInJlbXR4dCByZW1hcHBkIiwiIixyZW1hcHBkKTsKKyAgICAgICAgZGVidWcoRjEwMSwicmVtdHh0IHJlbXBpcGUiLCIiLHJlbXBpcGUpOworICAgICAgICBkZWJ1ZyhGMTEwLCJyZW10eHQgcmVtZGVzdCIscmVtZGVzdCwgMCk7CisgICAgICAgIGRlYnVnKEYxMTAsInJlbXR4dCBjb21tYW5kIixzLDApOworICAgIH0KKyNlbmRpZiAvKiBOT0RFQlVHICovCisKKyAgICByZXR1cm4oMSk7Cit9CisKK2ludAorcGxvZ2luKHh4KSBpbnQgeHg7IHsKKyAgICBjaGFyICpwMSA9IE5VTEwsICpwMiA9IE5VTEwsICpwMyA9IE5VTEw7CisgICAgaW50IHBzYXZlZCA9IDAsIHJjID0gMDsKKyNpZmRlZiBDS19SRUNBTEwKKyAgICBleHRlcm4gaW50IG9uX3JlY2FsbDsgICAgICAgICAgICAgICAvKiBhcm91bmQgUGFzc3dvcmQgcHJvbXB0aW5nICovCisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisgICAgZGVidWcoRjEwMSwicGxvZ2luIGxvY2FsIiwiIixsb2NhbCk7CisKKyAgICBpZiAoIWxvY2FsIHx8IChuZXR3b3JrICYmIHR0Y2hrKCkgPCAwKSkgeworICAgICAgICBwcmludGYoIj9ObyBjb25uZWN0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKCh4ID0gY21mbGQoIlVzZXIgSUQiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7IC8qIEdldCBVc2VyIElEICovCisgICAgICAgIGlmICh4ICE9IC0zKSByZXR1cm4oeCk7CisgICAgfQorICAgIHkgPSBzdHJsZW4ocyk7CisgICAgaWYgKHkgPiAwKSB7CisgICAgICAgIGlmICgocDEgPSBtYWxsb2MoeSArIDEpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBwcmludGYoIj9JbnRlcm5hbCBlcnJvcjogbWFsbG9jXG4iKTsKKyAgICAgICAgICAgIHJjID0gLTk7CisgICAgICAgICAgICBnb3RvIFhaWExHSTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgc3RyY3B5KHAxLHMpOyAgICAgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICBpZiAoKHJjID0gY21mbGQoIlBhc3N3b3JkIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICBpZiAocmMgIT0gLTMpIGdvdG8gWFpYTEdJOworICAgICAgICB5ID0gc3RybGVuKHMpOworICAgICAgICBpZiAoeSA+IDApIHsKKyAgICAgICAgICAgIGlmICgocDIgPSBtYWxsb2MoeSArIDEpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/SW50ZXJuYWwgZXJyb3I6IG1hbGxvY1xuIik7CisgICAgICAgICAgICAgICAgcmMgPSAtOTsKKyAgICAgICAgICAgICAgICBnb3RvIFhaWExHSTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBzdHJjcHkocDIscyk7ICAgICAgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgICAgIGlmICgocmMgPSBjbWZsZCgiQWNjb3VudCIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIGlmIChyYyAhPSAtMykgZ290byBYWlhMR0k7CisgICAgICAgICAgICB5ID0gc3RybGVuKHMpOworICAgICAgICAgICAgaWYgKHkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKChwMyA9IG1hbGxvYyh5ICsgMSkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/SW50ZXJuYWwgZXJyb3I6IG1hbGxvY1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJjID0gLTk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gWFpYTEdJOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgc3RyY3B5KHAzLHMpOyAgICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHJjID0gcmVtdHh0KCZzKSkgPCAwKSAgICAgICAgICAvKiBDb25maXJtICYgaGFuZGxlIHJlZGlyZWN0b3JzICovCisgICAgICBnb3RvIFhaWExHSTsKKworICAgIGlmICghcDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIFVzZXJpZCBzcGVjaWZpZWQuLi4gKi8KKyAgICAgICAgZGVib2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBsb2cgdGhpcyAqLworICAgICAgICAvKiBQcm9tcHQgZm9yIHVzZXJuYW1lLCBwYXNzd29yZCwgYW5kIGFjY291bnQgKi8KKyNpZmRlZiBDS19SRUNBTEwKKyAgICAgICAgb25fcmVjYWxsID0gMDsKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyAgICAgICAgY21zYXZwKHBzYXZlLFBST01QVEwpOyAgICAgICAgICAvKiBTYXZlIG9sZCBwcm9tcHQgKi8KKyAgICAgICAgcHNhdmVkID0gMTsKKyAgICAgICAgZGVidWcoRjExMCwiUkVNT1RFIExPR0lOIHNhdmVkIixwc2F2ZSwwKTsKKworICAgICAgICBjbXNldHAoIlVzZXJuYW1lOiAiKTsgICAgICAgICAgIC8qIE1ha2UgbmV3IHByb21wdCAqLworICAgICAgICBjb25jYigoY2hhcillc2NhcGUpOyAgICAgICAgICAgIC8qIFB1dCBjb25zb2xlIGluIGNicmVhayBtb2RlICovCisgICAgICAgIGNtaW5pKDEpOworICAgICAgICBwcm9tcHQoeHhzdHJpbmcpOworICAgICAgICByYyA9IC05OworICAgICAgICBmb3IgKHggPSAtMTsgeCA8IDA7ICkgeyAgICAgICAgIC8qIFByb21wdCB0aWxsIHRoZXkgYW5zd2VyICovCisgICAgICAgICAgICBjbXJlcygpOyAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgdGhlIHBhcnNlciAqLworICAgICAgICAgICAgeCA9IGNtdHh0KCIiLCIiLCZzLE5VTEwpOyAgIC8qIEdldCBhIGxpdGVyYWwgbGluZSBvZiB0ZXh0ICovCisgICAgICAgIH0KKyAgICAgICAgeSA9IHN0cmxlbihzKTsKKyAgICAgICAgaWYgKHkgPCAxKSB7CisgICAgICAgICAgICBwcmludGYoIj9DYW5jZWxlZFxuIik7CisgICAgICAgICAgICBnb3RvIFhaWExHSTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAxID0gbWFsbG9jKHkgKyAxKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRmKCI/SW50ZXJuYWwgZXJyb3I6IG1hbGxvY1xuIik7CisgICAgICAgICAgICBnb3RvIFhaWExHSTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgc3RyY3B5KHAxLHMpOyAgICAgICAgICAgICAgICAgLyogc2FmZSAqLworCisgICAgICAgIGNtc2V0cCgiUGFzc3dvcmQ6ICIpOyAgICAgICAgICAgLyogTWFrZSBuZXcgcHJvbXB0ICovCisgICAgICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7ICAgICAgICAgICAgLyogUHV0IGNvbnNvbGUgaW4gY2JyZWFrIG1vZGUgKi8KKyAgICAgICAgY21pbmkoMCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBlY2hvICovCisgICAgICAgIHByb21wdCh4eHN0cmluZyk7CisgICAgICAgIGRlYm9rID0gMDsKKyAgICAgICAgZm9yICh4ID0gLTE7IHggPCAwICYmIHggIT0gLTM7ICkgeyAvKiBHZXQgYW5zd2VyICovCisgICAgICAgICAgICBjbXJlcygpOyAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgdGhlIHBhcnNlciAqLworICAgICAgICAgICAgeCA9IGNtdHh0KCIiLCIiLCZzLE5VTEwpOyAgIC8qIEdldCBsaXRlcmFsIGxpbmUgb2YgdGV4dCAqLworICAgICAgICB9CisgICAgICAgIGlmICgocDIgPSBtYWxsb2MoKGludClzdHJsZW4ocykgKyAxKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRmKCI/SW50ZXJuYWwgZXJyb3I6IG1hbGxvY1xuIik7CisgICAgICAgICAgICBnb3RvIFhaWExHSTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgc3RyY3B5KHAyLHMpOyAgICAgICAgICAgICAgICAgLyogc2FmZSAqLworICAgICAgICBwcmludGYoIlxyXG4iKTsKKyAgICAgICAgaWYgKChyYyA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICBnb3RvIFhaWExHSTsKKyAgICB9CisgICAgc3N0YXRlID0gc2V0Z2VuKCdJJyxwMSxwMixwMyk7ICAgICAgLyogR2V0IGhlcmUgd2l0aCBhdCBsZWFzdCB1c2VyIElEICovCisgICAgcmMgPSAwOworCisgIFhaWExHSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbW9uIGV4aXQgcG9pbnQgKi8KKyAgICBpZiAocHNhdmVkKQorICAgICAgY21zZXRwKHBzYXZlKTsgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgb3JpZ2luYWwgcHJvbXB0ICovCisgICAgaWYgKHAzKSB7IGZyZWUocDMpOyBwMyA9IE5VTEw7IH0gICAgLyogRnJlZSBtYWxsb2MnZCBzdG9yYWdlICovCisgICAgaWYgKHAyKSB7IGZyZWUocDIpOyBwMiA9IE5VTEw7IH0KKyAgICBpZiAocDEpIHsgZnJlZShwMSk7IHAxID0gTlVMTDsgfQorICAgIGlmIChyYyA+IC0xKSB7CisgICAgICAgIGlmIChsb2NhbCAmJiByYyA+IC0xKSAgICAgICAgICAgLyogSWYgbG9jYWwsIGZsdXNoIHR0eSBpbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICB0dGZsdWkoKTsKKyAgICB9CisgICAgcmV0dXJuKHJjKTsKK30KKworI2lmZGVmIE9TMgorI2lmbmRlZiBOT0xPQ0FMCitpbnQKK2Rvcm10KHh4KSBpbnQgeHg7IHsKKyAgICBpbnQgcmMgPSAwOworICAgIGV4dGVybiBpbnQgdGVybV9pbzsKKyAgICBpbnQgdGVybV9pb19zYXYgPSB0ZXJtX2lvOworI2lmZGVmIE5FV0ZUUAorICAgIGV4dGVybiBpbnQgZnRwZ2V0LCBmdHBpc29wZW4oKTsKKyAgICBpZiAoKGZ0cGdldCA9PSAxKSB8fCAoKGZ0cGdldCA9PSAyKSAmJiBmdHBpc29wZW4oKSkpCisgICAgICByZXR1cm4oZG9mdHBybXQoeHgsMCkpOworI2VuZGlmIC8qIE5FV0ZUUCAqLworICAgIHRlcm1faW8gPSAwOworICAgIHJjID0geHhkb3JtdCh4eCk7CisgICAgdGVybV9pbyA9IHRlcm1faW9fc2F2OworICAgIHJldHVybiByYzsKK30KKworCitpbnQKK3h4ZG9ybXQoeHgpIGludCB4eDsKKyNlbHNlIC8qIE5PTE9DQUwgKi8KK2ludAorZG9ybXQoeHgpIGludCB4eDsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjZWxzZSAvKiBPUzIgKi8KK2ludAorZG9ybXQoeHgpIGludCB4eDsKKyNlbmRpZiAvKiBPUzIgKi8KK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRU1PVEUgY29tbWFuZHMgKi8KKyAgICBpbnQgeCwgeSwgcmV0Y29kZTsKKyAgICBjaGFyICpzLCBzYnVmWzUwXSwgKnMyOworCisjaWZkZWYgTkVXRlRQCisgICAgZXh0ZXJuIGludCBmdHBnZXQsIGZ0cGlzb3BlbigpOworICAgIGlmICgoZnRwZ2V0ID09IDEpIHx8ICgoZnRwZ2V0ID09IDIpICYmIGZ0cGlzb3BlbigpKSkKKyAgICAgIHJldHVybihkb2Z0cHJtdCh4eCwwKSk7CisjZW5kaWYgLyogTkVXRlRQICovCisKKyAgICByZW1maWxlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGVzZSAqLworICAgIHJlbXBpcGUgPSAwOworICAgIHJlbWFwcGQgPSAwOworCisgICAgaWYgKHh4IDwgMCkgcmV0dXJuKHh4KTsgICAgICAgICAgICAgLyogUkVNT1RFIHdoYXQ/ICovCisKKyAgICB4emNtZCA9IHh4OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIGdsb2JhbCBjb3B5IG9mIGFyZyAqLworCisgICAgaWYgKHh4ID09IFhaU0VUKSB7ICAgICAgICAgICAgICAgICAgLyogUkVNT1RFIFNFVCAqLworICAgICAgICBpZiAoKHkgPSBjbWtleShybXN0YWIsbnJtcywiIiwiIix4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgaWYgKHkgPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9QYXJhbWV0ZXIgbmFtZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0gZWxzZSByZXR1cm4oeSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKGRvcHJtKHksMSkpOworICAgIH0KKworICAgIHN3aXRjaCAoeHgpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVycy4uLiAqLworCisgICAgICBjYXNlIFhaQ0RVOgorICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgcHJpbnRmKCI/U29ycnksIFJFTU9URSBDRFVQIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKworICAgICAgY2FzZSBYWkNXRDogICAgICAgICAgICAgICAgICAgICAgIC8qIENXRCAoQ0QpICovCisgICAgICAgIGlmICgoeCA9IGNtdHh0KCJSZW1vdGUgZGlyZWN0b3J5IG5hbWUiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh4ID0gcmVtdHh0KCZzKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgZGVidWcoRjExMSwiWFpDV0Q6ICIscyx4KTsKKyAgICAgICAgKnNidWYgPSBOVUw7CisgICAgICAgIHMyID0gc2J1ZjsKKy8qCisgIFRoZSBmb2xsb3dpbmcgaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIHNpbmNlIHRoZSBkaXNhcHBlYXJhbmNlIG9mIHRoZQorICBERUNTWVNURU0tMjAgZnJvbSB0aGUgcGxhbmV0LCBubyBrbm93biBjb21wdXRlciByZXF1aXJlcyBhIHBhc3N3b3JkIGZvcgorICBjaGFuZ2luZyBkaXJlY3RvcnkuCisqLworI2lmZGVmIERJUlBXRFBSCisgICAgICAgIGlmICgqcyAhPSBOVUwpIHsgICAgICAgICAgICAgICAgLyogSWYgZGlyZWN0b3J5IG5hbWUgZ2l2ZW4sICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHBhc3N3b3JkIG9uIHNlcGFyYXRlIGxpbmUuICovCisgICAgICAgICAgICBpZiAodGxldmVsID4gLTEpIHsgICAgICAgICAgLyogRnJvbSB0YWtlIGZpbGUuLi4gKi8KKworICAgICAgICAgICAgICAgIGlmIChmZ2V0cyhzYnVmLDUwLHRmaWxlW3RsZXZlbF0pID09IE5VTEwpCisgICAgICAgICAgICAgICAgICBmYXRhbCgidGFrZSBmaWxlIGVuZHMgcHJlbWF0dXJlbHkgaW4gJ3JlbW90ZSBjd2QnIik7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiIHBzd2QgZnJvbSB0YWtlIGZpbGUiLHMyLDApOworICAgICAgICAgICAgICAgIGZvciAoeCA9IChpbnQpc3RybGVuKHNidWYpOworICAgICAgICAgICAgICAgICAgICAgeCA+IDAgJiYgKHNidWZbeC0xXSA9PSBOTCB8fCBzYnVmW3gtMV0gPT0gQ1IpOworICAgICAgICAgICAgICAgICAgICAgeC0tKQorICAgICAgICAgICAgICAgICAgc2J1Zlt4LTFdID0gJ1wwJzsKKworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gdGVybWluYWwuLi4gKi8KKworICAgICAgICAgICAgICAgIHByaW50ZigiIFBhc3N3b3JkOiAiKTsgIC8qIGdldCBhIHBhc3N3b3JkICovCisjaWZkZWYgSUtTRAorICAgICAgICAgICAgICAgIGlmICghbG9jYWwgJiYgaW5zZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGNvbmluYygwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBJS1NEICovCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICB4ID0gaXNfYV90dHkoMCkgPyBjb25pbmMoMCkgOiAvKiB3aXRoIG5vIGVjaG8gLi4uICovCisgICAgICAgICAgICAgICAgICAgIGdldGNoYXIoKTsKKyNlbHNlIC8qIE9TMiAqLworICAgICAgICAgICAgICAgIHggPSBnZXRjaGFyKCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgd2hpbGUgKCh4ICE9IE5MKSAmJiAoeCAhPSBDUikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh4ICY9IDAxNzcpID09ICc/JykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/IFBhc3N3b3JkIG9mIHJlbW90ZSBkaXJlY3RvcnlcbiBQYXNzd29yZDogIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzMiA9IHNidWY7CisgICAgICAgICAgICAgICAgICAgICAgICAqc2J1ZiA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4ID09IEVTQykgLyogTWluaSBjb21tYW5kIGxpbmUgZWRpdG9yLi4uICovCisgICAgICAgICAgICAgICAgICAgICAgYmxlZXAoQlBfV0FSTik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHggPT0gQlMgfHwgeCA9PSAwMTc3KQorICAgICAgICAgICAgICAgICAgICAgIHMyLS07CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHggPT0gMDI1KSB7ICAgICAgICAvKiBDdHJsLVUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHMyID0gc2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpzYnVmID0gTlVMOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAqczIrKyA9IHg7CisKKyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBuZXh0IGNoYXJhY3RlciAqLworI2lmZGVmIElLU0QKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NhbCAmJiBpbnNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGNvbmluYygwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogSUtTRCAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAgICB4ID0gaXNfYV90dHkoMCkgPyBjb25pbmMoMCkgOiAvKiB3aXRoIG5vIGVjaG8gLi4uICovCisgICAgICAgICAgICAgICAgICAgICAgZ2V0Y2hhcigpOworI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgIHggPSBnZXRjaGFyKCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpzMiA9IE5VTDsKKyAgICAgICAgICAgICAgICBwdXRjaGFyKCdcbicpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgczIgPSBzYnVmOworICAgICAgICB9IGVsc2UgczIgPSAiIjsKKyNlbmRpZiAvKiBESVJQV0RQUiAqLworCisgICAgICAgIGRlYnVnKEYxMTAsIiBwYXNzd29yZCIsczIsMCk7CisJcmNkYWN0aXZlID0gMTsKKyAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdDJyxzLHMyLCIiKTsKKyAgICAgICAgcmV0Y29kZSA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhaREVMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgKi8KKyAgICAgICAgaWYgKCh4ID0gY210eHQoIk5hbWUgb2YgcmVtb3RlIGZpbGUocykgdG8gZGVsZXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/TmFtZSBvZiByZW1vdGUgZmlsZShzKSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0gZWxzZSByZXR1cm4oeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh4ID0gcmVtdHh0KCZzKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKGxvY2FsKSB0dGZsdWkoKTsgICAgICAgICAgICAvKiBJZiBsb2NhbCwgZmx1c2ggdHR5IGlucHV0IGJ1ZmZlciAqLworICAgICAgICByZXRjb2RlID0gc3N0YXRlID0gcmZpbG9wKHMsJ0UnKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgWFpESVI6ICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3RvcnkgKi8KKyAgICAgICAgaWYgKCh4ID0gY210eHQoIlJlbW90ZSBkaXJlY3Rvcnkgb3IgZmlsZSBzcGVjaWZpY2F0aW9uIiwiIiwmcywKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKHggPSByZW10eHQoJnMpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAobG9jYWwpIHR0Zmx1aSgpOyAgICAgICAgICAgIC8qIElmIGxvY2FsLCBmbHVzaCB0dHkgaW5wdXQgYnVmZmVyICovCisgICAgICAgIHJtc2coKTsKKyAgICAgICAgcmV0Y29kZSA9IHNzdGF0ZSA9IHNldGdlbignRCcscywiIiwiIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhaSExQOiAgICAgICAgICAgICAgICAgICAgICAgLyogSGVscCAqLworICAgICAgICBpZiAoKHggPSByZW1jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIHNzdGF0ZSA9IHNldGdlbignSCcsIiIsIiIsIiIpOworICAgICAgICByZXRjb2RlID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgWFpIT1M6ICAgICAgICAgICAgICAgICAgICAgICAvKiBIb3N0ICovCisgICAgICAgIGlmICgoeCA9IGNtdHh0KCJDb21tYW5kIGZvciByZW1vdGUgc3lzdGVtIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeCA9IHJlbXR4dCgmcykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeSA9IChpbnQpc3RybGVuKHMpKSA8IDEpCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgICAgIGNtYXJnID0gbGluZTsKKyAgICAgICAgcm1zZygpOworICAgICAgICByZXRjb2RlID0gc3N0YXRlID0gJ2MnOworICAgICAgICBicmVhazsKKworI2lmbmRlZiBOT0ZSSUxMUworICAgICAgY2FzZSBYWktFUjoKKyAgICAgICAgaWYgKCh4ID0gY210eHQoIkNvbW1hbmQgZm9yIHJlbW90ZSBLZXJtaXQiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh4ID0gcmVtdHh0KCZzKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKChpbnQpc3RybGVuKHMpIDwgMSkgIHsKKyAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/UmVtb3RlIEtlcm1pdCBjb21tYW5kIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfSBlbHNlIHJldHVybih4KTsKKyAgICAgICAgfQorICAgICAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgICAgIGNtYXJnID0gbGluZTsKKyAgICAgICAgcmV0Y29kZSA9IHNzdGF0ZSA9ICdrJzsKKyAgICAgICAgcm1zZygpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYWkxHSTogICAgICAgICAgICAgICAgICAgICAgIC8qIExvZ2luICovCisJcmNkYWN0aXZlID0gMTsJCQkvKiBTdXBwcmVzcyAiTG9nZ2VkIGluIiBtc2cgaWYgcXVpZXQgKi8KKyAgICAgICAgcmV0dXJuKHBsb2dpbihYWFJFTSkpOworCisgICAgICBjYXNlIFhaTEdPOiB7ICAgICAgICAgICAgICAgICAgICAgLyogTG9nb3V0ICovCisgICAgICAgICAgZXh0ZXJuIGludCBieWVfYWN0aXZlOworICAgICAgICAgIGlmICgoeCA9IHJlbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgICBzc3RhdGUgPSBzZXRnZW4oJ0knLCIiLCIiLCIiKTsKKyAgICAgICAgICByZXRjb2RlID0gMDsKKyAgICAgICAgICBieWVfYWN0aXZlID0gMTsgICAgICAgICAgICAgICAvKiBDbG9zZSBjb25uZWN0aW9uIHdoZW4gZG9uZSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIFhaUFJJOiAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpbnQgKi8KKyAgICAgICAgaWYgKCFhdGRpc28gfHwgIWF0Y2FwcikgeyAgICAgICAvKiBEaXNwb3NpdGlvbiBhdHRyaWJ1dGUgb2ZmPyAqLworICAgICAgICAgICAgcHJpbnRmKCI/RGlzcG9zaXRpb24gQXR0cmlidXRlIGlzIE9mZlxuIik7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgICAgIGNtYXJnID0gIiI7CisgICAgICAgIGNtYXJnMiA9ICIiOworICAgICAgICBpZiAoKHggPSBjbWlmaSgiTG9jYWwgZmlsZShzKSB0byBwcmludCBvbiByZW1vdGUgcHJpbnRlciIsIiIsJnMsJnksCisgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP05hbWUgb2YgbG9jYWwgZmlsZShzKSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgfQorICAgICAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7ICAgIC8qIE1ha2UgYSBzYWZlIGNvcHkgb2YgZmlsZW5hbWUgKi8KKyAgICAgICAgKm9wdGJ1ZiA9IE5VTDsgICAgICAgICAgICAgICAgICAvKiBXaXBlIG91dCBhbnkgb2xkIG9wdGlvbnMgKi8KKyAgICAgICAgaWYgKCh4ID0gY210eHQoIk9wdGlvbnMgZm9yIHJlbW90ZSBwcmludCBjb21tYW5kIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoeCA9IHJlbXR4dCgmcykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgoaW50KXN0cmxlbihvcHRidWYpID4gOTQpIHsgLyogTWFrZSBzdXJlIHRoaXMgaXMgbGVnYWwgKi8KKyAgICAgICAgICAgIHByaW50ZigiP09wdGlvbiBzdHJpbmcgdG9vIGxvbmdcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBja3N0cm5jcHkob3B0YnVmLHMsT1BUQlVGTEVOKTsgIC8qIE1ha2UgYSBzYWZlIGNvcHkgb2Ygb3B0aW9ucyAqLworICAgICAgICBuZmlscyA9IC0xOyAgICAgICAgICAgICAgICAgICAgIC8qIEV4cGFuZCBmaWxlIGxpc3QgaW50ZXJuYWxseSAqLworICAgICAgICBjbWFyZyA9IGxpbmU7ICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIGZpbGUgbGlzdC4gKi8KKyAgICAgICAgcnByaW50ZiA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBSRU1PVEUgUFJJTlQgbW9kaWZpZXIgZm9yIFNFTkQgKi8KKyAgICAgICAgc3N0YXRlID0gJ3MnOyAgICAgICAgICAgICAgICAgICAvKiBTZXQgc3RhcnQgc3RhdGUgdG8gU0VORCAqLworICAgICAgICBpZiAobG9jYWwpIGRpc3BsYSA9IDE7CisgICAgICAgIHJldGNvZGUgPSAwOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisgICAgICBjYXNlIFhaU1BBOiAgICAgICAgICAgICAgICAgICAgICAgLyogU3BhY2UgKi8KKyAgICAgICAgaWYgKCh4ID0gY210eHQoIkNvbmZpcm0sIG9yIHJlbW90ZSBkaXJlY3RvcnkgbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKCh4ID0gcmVtdHh0KCZzKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgcmV0Y29kZSA9IHNzdGF0ZSA9IHNldGdlbignVScscywiIiwiIik7CisgICAgICAgIGJyZWFrOworCisjaWZuZGVmIE5PRlJJTExTCisgICAgICBjYXNlIFhaVFlQOiAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSAqLworICAgICAgICBpZiAoKHggPSBjbXR4dCgiUmVtb3RlIGZpbGUgc3BlY2lmaWNhdGlvbiIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKGludClzdHJsZW4ocykgPCAxKSB7CisgICAgICAgICAgICBwcmludGYoIj9SZW1vdGUgZmlsZW5hbWUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHggPSByZW10eHQoJnMpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBybXNnKCk7CisgICAgICAgIHJldGNvZGUgPSBzc3RhdGUgPSByZmlsb3AocywnVCcpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisjaWZuZGVmIE5PRlJJTExTCisgICAgICBjYXNlIFhaV0hPOgorICAgICAgICBpZiAoKHggPSBjbXR4dCgiUmVtb3RlIHVzZXIgbmFtZSwgb3IgY2FycmlhZ2UgcmV0dXJuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKHggPSByZW10eHQoJnMpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICByZXRjb2RlID0gc3N0YXRlID0gc2V0Z2VuKCdXJyxzLCIiLCIiKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworICAgICAgY2FzZSBYWlBXRDogICAgICAgICAgICAgICAgICAgICAgIC8qIFBXRCAqLworICAgICAgICBpZiAoKHggPSByZW1jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIHNzdGF0ZSA9IHNldGdlbignQScsIiIsIiIsIiIpOworICAgICAgICByZXRjb2RlID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyNpZm5kZWYgTk9TUEwKKyAgICAgIGNhc2UgWFpRVUU6IHsgICAgICAgICAgICAgICAgICAgICAvKiBRdWVyeSAqLworICAgICAgICAgIGNoYXIgYnVmWzJdOworICAgICAgICAgIGV4dGVybiBjaGFyIHF1ZXJ5YnVmW10sICogcWJ1ZnA7CisgICAgICAgICAgZXh0ZXJuIGludCBxYnVmbjsKKyAgICAgICAgICBpZiAoKHkgPSBjbWtleSh2YXJ0eXAsbnZhcnR5cCwiIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICBpZiAoKHggPSBjbXR4dCh5ID09ICdGJyA/ICJSZW1vdGUgZnVuY3Rpb24gaW52b2NhdGlvbiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICgnSycgPyAiUmVtb3RlIHZhcmlhYmxlIG5hbWUgb3IgZnVuY3Rpb24iOgorICAgICAgICAgICAgICAgICAgICAgICAgICJSZW1vdGUgdmFyaWFibGUgbmFtZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICh5ID09ICdLJykgPyB4eHN0cmluZyA6IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICApKSA8IDApICAgICAgICAvKiBEb24ndCBldmFsdWF0ZSAqLworICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIGlmICgoeCA9IHJlbXR4dCgmcykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICBxdWVyeSA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBRVUVSWSBpcyBhY3RpdmUgKi8KKyAgICAgICAgICBxYnVmcCA9IHF1ZXJ5YnVmOyAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHF1ZXJ5IHJlc3BvbnNlIGJ1ZmZlciAqLworICAgICAgICAgIHFidWZuID0gMDsKKyAgICAgICAgICBxdWVyeWJ1ZlswXSA9IE5VTDsKKyAgICAgICAgICBidWZbMF0gPSAoY2hhcikgKHkgJiAxMjcpOworICAgICAgICAgIGJ1ZlsxXSA9IE5VTDsKKyAgICAgICAgICByZXRjb2RlID0gc3N0YXRlID0gc2V0Z2VuKCdWJywiUSIsKGNoYXIgKilidWYscyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgWFpBU0c6IHsgICAgICAgICAgICAgICAgICAgICAvKiBBc3NpZ24gKi8KKyAgICAgICAgICBjaGFyIGJ1ZltWTkFNTF07CisgICAgICAgICAgaWYgKCh5ID0gY21mbGQoIlJlbW90ZSB2YXJpYWJsZSBuYW1lIiwiIiwmcyxOVUxMKSkgPCAwKSAvKiBObyBldmFsICovCisgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgaWYgKChpbnQpc3RybGVuKHMpID49IFZOQU1MKSB7CisgICAgICAgICAgICAgIHByaW50ZigiP1RvbyBsb25nXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2tzdHJuY3B5KGJ1ZixzLFZOQU1MKTsKKyAgICAgICAgICBpZiAoKHggPSBjbXR4dCgiQXNzaWdubWVudCBmb3IgcmVtb3RlIHZhcmlhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAiIiwmcyx4eHN0cmluZykpIDwgMCkgLyogRXZhbHVhdGUgdGhpcyBvbmUgKi8KKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICBpZiAoKHggPSByZW10eHQoJnMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisjaWZkZWYgQ09NTUVOVAorLyoKKyAgU2VydmVyIGNvbW1hbmRzIGNhbid0IGJlIGxvbmcgcGFja2V0cy4gIEluIHByaW5jaXBsZSB0aGVyZSdzIG5vIHJlYXNvbgorICB3aHkgdGhleSBzaG91bGRuJ3QgYmUsIGV4Y2VwdCB0aGF0IHdlIGRvbid0IGtub3cgYXQgdGhpcyBwb2ludCBpZiB0aGUKKyAgc2VydmVyIGlzIGNhcGFibGUgb2YgYWNjZXB0aW5nIGxvbmcgcGFja2V0cyBiZWNhdXNlIHdlIGhhdmVuJ3Qgc3RhcnRlZAorICB0aGUgcHJvdG9jb2wgeWV0LiAgSW4gcHJhY3RpY2UsIGFsbG93aW5nIGEgbG9uZyBwYWNrZXQgaGVyZSBicmVha3MgYSBsb3QKKyAgb2YgYXNzdW1wdGlvbnMsIGNhdXNlcyBidWZmZXIgb3ZlcnJ1bnMgYW5kIGNyYXNoZXMsIGV0Yy4gIFRvIGJlIGZpeGVkCisgIGxhdGVyLiAgKEJ1dCBzaW5jZSB0aGlzIGlzIGNvbW1lbnRlZCBvdXQsIGV2aWRlbnRseSBJIGZpeGVkIGl0IGxhdGVyLi4uKQorKi8KKyAgICAgICAgICBpZiAoKGludClzdHJsZW4ocykgPiA4NSkgeyAgICAvKiBBbGxvdyBmb3IgZW5jb2RpbmcgZXhwYW5zaW9uICovCisgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCB2YWx1ZSBpcyB0b28gbG9uZyAtIDg1IGNoYXJhY3RlcnMgbWF4XG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgIHJldGNvZGUgPSBzc3RhdGUgPSBzZXRnZW4oJ1YnLCJTIiwoY2hhciAqKWJ1ZixzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgICBjYXNlIFhaQ1BZOiB7ICAgICAgICAgICAgICAgICAgICAgLyogQ09QWSAqLworICAgICAgICAgIGNoYXIgYnVmW1RNUEJVRlNJWl07CisgICAgICAgICAgYnVmW1RNUEJVRlNJWi0xXSA9ICdcMCc7CisgICAgICAgICAgaWYgKCh4ID0gY21mbGQoIk5hbWUgb2YgcmVtb3RlIGZpbGUgdG8gY29weSIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiP05hbWUgb2YgcmVtb3RlIGZpbGUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIH0KKyAgICAgICAgICBja3N0cm5jcHkoYnVmLHMsVE1QQlVGU0laKTsKKyAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiTmFtZSBvZiByZW1vdGUgZGVzdGluYXRpb24gZmlsZSBvciBkaXJlY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICIiLCZzLCB4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/TmFtZSBvZiByZW1vdGUgZmlsZSBvciBkaXJlY3RvcnkgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgfSBlbHNlIHJldHVybih4KTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2tzdHJuY3B5KHRtcGJ1ZixzLFRNUEJVRlNJWik7CisgICAgICAgICAgaWYgKCh4ID0gcmVtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICBpZiAobG9jYWwpIHR0Zmx1aSgpOyAgICAgICAgICAvKiBJZiBsb2NhbCwgZmx1c2ggdHR5IGlucHV0IGJ1ZmZlciAqLworICAgICAgICAgIHJldGNvZGUgPSBzc3RhdGUgPSBzZXRnZW4oJ0snLGJ1Zix0bXBidWYsIiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBYWlJFTjogeyAgICAgICAgICAgICAgICAgICAgIC8qIFJlbmFtZSAqLworICAgICAgICAgIGNoYXIgYnVmW1RNUEJVRlNJWl07CisgICAgICAgICAgYnVmW1RNUEJVRlNJWi0xXSA9ICdcMCc7CisgICAgICAgICAgaWYgKCh4ID0gY21mbGQoIk5hbWUgb2YgcmVtb3RlIGZpbGUgdG8gcmVuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIiwmcyx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/TmFtZSBvZiByZW1vdGUgZmlsZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICB9IGVsc2UgcmV0dXJuKHgpOworICAgICAgICAgIH0KKyAgICAgICAgICBja3N0cm5jcHkoYnVmLHMsVE1QQlVGU0laKTsKKyAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiTmV3IG5hbWUgb2YgcmVtb3RlIGZpbGUiLCIiLCZzLCB4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/TmFtZSBvZiByZW1vdGUgZmlsZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICB9IGVsc2UgcmV0dXJuKHgpOworICAgICAgICAgIH0KKyAgICAgICAgICBja3N0cm5jcHkodG1wYnVmLHMsVE1QQlVGU0laKTsKKyAgICAgICAgICBpZiAoKHggPSByZW1jZm0oKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgIGlmIChsb2NhbCkgdHRmbHVpKCk7ICAgICAgICAgIC8qIElmIGxvY2FsLCBmbHVzaCBkZXZpY2UgYnVmZmVyICovCisgICAgICAgICAgcmV0Y29kZSA9IHNzdGF0ZSA9IHNldGdlbignUicsYnVmLHRtcGJ1ZiwiIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFhaTUtEOiAgICAgICAgICAgICAgICAgICAgICAgLyogbWtkaXIgKi8KKyAgICAgIGNhc2UgWFpSTUQ6ICAgICAgICAgICAgICAgICAgICAgICAvKiBybWRpciAqLworICAgICAgICBpZiAoKHggPSBjbXR4dCgoeHggPT0gWFpNS0QpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIk5hbWUgb2YgcmVtb3RlIGRpcmVjdG9yeSB0byBjcmVhdGUiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIk5hbWUgb2YgcmVtb3RlIGRpcmVjdG9yeSB0byBkZWxldGUiLAorICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgJnMsCisgICAgICAgICAgICAgICAgICAgICAgIHh4c3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICkpIDwgMCkgeworICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9OYW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfSBlbHNlIHJldHVybih4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHggPSByZW10eHQoJnMpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAobG9jYWwpIHR0Zmx1aSgpOyAgICAgICAgICAgIC8qIElmIGxvY2FsLCBmbHVzaCB0dHkgaW5wdXQgYnVmZmVyICovCisgICAgICAgIHJldGNvZGUgPSBzc3RhdGUgPSByZmlsb3AocywgKGNoYXIpKHh4ID09IFhaTUtEID8gJ20nIDogJ2QnKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhaWElUOiAgICAgICAgICAgICAgICAgICAgICAgLyogRXhpdCAqLworICAgICAgICBpZiAoKHggPSByZW1jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIHNzdGF0ZSA9IHNldGdlbignWCcsIiIsIiIsIiIpOworICAgICAgICByZXRjb2RlID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgoeCA9IHJlbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgcHJpbnRmKCI/Tm90IGltcGxlbWVudGVkIC0gJXNcbiIsY21kYnVmKTsKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9CisgICAgaWYgKGxvY2FsICYmIHJldGNvZGUgPiAtMSkgICAgICAgICAgLyogSWYgbG9jYWwsIGZsdXNoIHR0eSBpbnB1dCBidWZmZXIgKi8KKyAgICAgIHR0Zmx1aSgpOworICAgIHJldHVybihyZXRjb2RlKTsKK30KKworCisvKiAgUiBGIEkgTCBPIFAgIC0tICBSZW1vdGUgRmlsZSBPcGVyYXRpb24gICovCisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworcmZpbG9wKGNoYXIgKiBzLCBjaGFyIHQpCisjZWxzZQorcmZpbG9wKHMsdCkgY2hhciAqcywgdDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogcmZpbG9wICovIHsKKyAgICBpZiAoKnMgPT0gTlVMKSB7CisgICAgICAgIHByaW50ZigiP0ZpbGUgc3BlY2lmaWNhdGlvbiByZXF1aXJlZFxuIik7CisgICAgICAgIHJldHVybigoQ0hBUikgMCk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsInJmaWxvcCIscyx0KTsKKyAgICByZXR1cm4oc2V0Z2VuKHQscywiIiwiIikpOworfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgQU5ZWDI1CitpbnQKK3NldHgyNSgpIHsKKyAgICBpZiAoKHkgPSBjbWtleSh4MjV0YWIsbngyNSwiWC4yNSBjYWxsIG9wdGlvbnMiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHkpOworICAgIHN3aXRjaCAoeSkgeworICAgICAgY2FzZSBYWVVEQVQ6CisgICAgICAgIGlmICgoeiA9IGNta2V5KG9ub2ZmLDIsIlguMjUgY2FsbCB1c2VyIGRhdGEiLCIiLHh4c3RyaW5nKSkKKyAgICAgICAgICAgIDwgMCkgcmV0dXJuKHopOworICAgICAgICBpZiAoeiA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgICAgIGN1ZGF0YSA9IDA7ICAgICAgICAgICAgIC8qIGRpc2FibGUgY2FsbCB1c2VyIGRhdGEgKi8KKyAgICAgICAgICAgIHJldHVybiAoc3VjY2VzcyA9IDEpOworICAgICAgICB9CisgICAgICAgIGlmICgoeCA9IGNtdHh0KCJYLjI1IGNhbGwgdXNlciBkYXRhIHN0cmluZyIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKGludClzdHJsZW4ocykgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICgtMyk7CisgICAgICAgIH0gZWxzZSBpZiAoKGludClzdHJsZW4ocykgPiBNQVhDVURBVEEpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoZSBsZW5ndGggbXVzdCBiZSA+IDAgYW5kIDw9ICVkXG4iLE1BWENVREFUQSk7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBja3N0cm5jcHkodWRhdGEscyxNQVhDVURBVEEpOworICAgICAgICBjdWRhdGEgPSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIFguMjUgY2FsbCB1c2VyIGRhdGEgc3BlY2lmaWVkICovCisgICAgICAgIHJldHVybiAoc3VjY2VzcyA9IDEpOworICAgICAgY2FzZSBYWUNMT1M6CisgICAgICAgIGlmICgoeiA9IGNta2V5KG9ub2ZmLDIsIlguMjUgY2xvc2VkIHVzZXIgZ3JvdXAgY2FsbCIsIiIseHhzdHJpbmcpKQorICAgICAgICAgICAgPCAwKSByZXR1cm4oeik7CisgICAgICAgIGlmICh6ID09IDApIHsKKyAgICAgICAgICAgIGlmICgoeiA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHopOworICAgICAgICAgICAgY2xvc2dyID0gLTE7ICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgY2xvc2VkIHVzZXIgZ3JvdXAgKi8KKyAgICAgICAgICAgIHJldHVybiAoc3VjY2VzcyA9IDEpOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtbnVtKCIwIDw9IGN1ZyBpbmRleCA+PSA5OSIsIiIsMTAsJngseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoeCA8IDAgfHwgeCA+IDk5KSB7CisgICAgICAgICAgICBwcmludGYoIj9UaGUgY2hvaWNlcyBhcmUgMCA8PSBjdWcgaW5kZXggPj0gOTlcbiIpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgY2xvc2dyID0geDsgICAgICAgICAgICAgICAgICAgICAvKiBjbG9zZWQgdXNlciBncm91cCBzZWxlY3RlZCAqLworICAgICAgICByZXR1cm4gKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgY2FzZSBYWVJFVkM6CisgICAgICAgIGlmKCh6ID0gY21rZXkob25vZmYsMiwiWC4yNSByZXZlcnNlIGNoYXJnZSBjYWxsIiwiIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeik7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICByZXZjYWxsID0gejsKKyAgICAgICAgcmV0dXJuIChzdWNjZXNzID0gMSk7CisgICAgfQorfQorCisjaWZuZGVmIElCTVgyNQoraW50CitzZXRwYWRwKCkgeworICAgIGlmICgoeSA9IGNta2V5KHBhZHgzdGFiLG5wYWR4MywiUEFEIFguMyBwYXJhbWV0ZXIgbmFtZSIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeSk7CisgICAgeCA9IHk7CisgICAgc3dpdGNoICh4KSB7CisgICAgICBjYXNlIFBBRF9CUkVBS19DSEFSQUNURVI6CisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJQQUQgYnJlYWsgY2hhcmFjdGVyIHZhbHVlIiwiIiwxMCwmeix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEFEX0VTQ0FQRToKKyAgICAgICAgaWYgKCh5ID0gY21udW0oIlBBRCBlc2NhcGUiLCIiLDEwLCZ6LHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGlmICh6ICE9IDAgJiYgeiAhPSAxKSB7CisgICAgICAgICAgICBwcmludGYoIj9UaGUgY2hvaWNlcyBhcmUgMCBvciAxXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQQURfRUNITzoKKyAgICAgICAgaWYgKCh5ID0gY21udW0oIlBBRCBlY2hvIiwiIiwxMCwmeix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAoeiAhPSAwICYmIHogIT0gMSkgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhlIGNob2ljZXMgYXJlIDAgb3IgMVxuIik7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEFEX0RBVEFfRk9SV0FSRF9DSEFSOgorICAgICAgICBpZiAoKHkgPSBjbW51bSgiUEFEIGRhdGEgZm9yd2FyZCBjaGFyIiwiIiwxMCwmeix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmICh6ICE9IDAgJiYgeiAhPSAyKSB7CisgICAgICAgICAgICBwcmludGYoIj9UaGUgY2hvaWNlcyBhcmUgMCBvciAyXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQQURfREFUQV9GT1JXQVJEX1RJTUVPVVQ6CisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJQQUQgZGF0YSBmb3J3YXJkIHRpbWVvdXQiLCIiLDEwLCZ6LHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoeiA8IDAgfHwgeiA+IDI1NSkgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhlIGNob2ljZXMgYXJlIDAgb3IgMSA8PSB0aW1lb3V0IDw9IDI1NVxuIik7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEFEX0ZMT1dfQ09OVFJPTF9CWV9QQUQ6CisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJQQUQgcGFkIGZsb3cgY29udHJvbCIsIiIsMTAsJnoseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoeiAhPSAwICYmIHogIT0gMSkgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhlIGNob2ljZXMgYXJlIDAgb3IgMVxuIik7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEFEX1NVUFBSRVNTSU9OX09GX1NJR05BTFM6CisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJQQUQgc2VydmljZSIsIiIsMTAsJnoseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgaWYgKHogIT0gMCAmJiB6ICE9IDEpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoZSBjaG9pY2VzIGFyZSAwIG9yIDFcbiIpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUEFEX0JSRUFLX0FDVElPTjoKKyAgICAgICAgaWYgKCh5ID0gY21udW0oIlBBRCBicmVhayBhY3Rpb24iLCIiLDEwLCZ6LHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGlmICh6ICE9IDAgJiYgeiAhPSAxICYmIHogIT0gMiAmJiB6ICE9IDUgJiYgeiAhPSA4ICYmIHogIT0gMjEpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoZSBjaG9pY2VzIGFyZSAwLCAxLCAyLCA1LCA4IG9yIDIxXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBBRF9TVVBQUkVTU0lPTl9PRl9EQVRBOgorICAgICAgICBpZiAoKHkgPSBjbW51bSgiUEFEIGRhdGEgZGVsaXZlcnkiLCIiLDEwLCZ6LHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGlmICh6ICE9IDAgJiYgeiAhPSAxKSB7CisgICAgICAgICAgICBwcmludGYoIj9UaGUgY2hvaWNlcyBhcmUgMCBvciAxXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBBRF9QQURESU5HX0FGVEVSX0NSOgorICAgICAgICBpZiAoKHkgPSBjbW51bSgiUEFEIGNycGFkIiwiIiwxMCwmeix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAoeiA8IDAgfHwgeiA+IDcpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoZSBjaG9pY2VzIGFyZSAwIG9yIDEgPD0gY3JwYWQgPD0gN1xuIik7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQQURfTElORV9GT0xESU5HOgorICAgICAgICBpZiAoKHkgPSBjbW51bSgiUEFEIGxpbmVmb2xkIiwiIiwxMCwmeix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBpZiAoeiA8IDAgfHwgeiA+IDI1NSkgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhlIGNob2ljZXMgYXJlIDAgb3IgMSA8PSBsaW5lZm9sZCA8PSAyNTVcbiIpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUEFEX0xJTkVfU1BFRUQ6CisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJQQUQgYmF1ZHJhdGUiLCIiLDEwLCZ6LHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGlmICh6IDwgMCB8fCB6ID4gMTgpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoZSBjaG9pY2VzIGFyZSAwIDw9IGJhdWRyYXRlIDw9IDE4XG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBBRF9GTE9XX0NPTlRST0xfQllfVVNFUjoKKyAgICAgICAgaWYgKCh5ID0gY21udW0oIlBBRCB0ZXJtaW5hbCBmbG93IGNvbnRyb2wiLCIiLDEwLCZ6LHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICBpZiAoeiAhPSAwICYmIHogIT0gMSkgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhlIGNob2ljZXMgYXJlIDAgb3IgMVxuIik7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQQURfTEZfQUZURVJfQ1I6CisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJQQUQgY3JwYWQiLCIiLDEwLCZ6LHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGlmICh6IDwgMCB8fCB6ID09IDMgfHwgeiA+IDcpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoZSBjaG9pY2VzIGFyZSAwLCAxLCAyLCA0LCA1LCA2IG9yIDdcbiIpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUEFEX1BBRERJTkdfQUZURVJfTEY6CisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJQQUQgbGZwYWQiLCIiLDEwLCZ6LHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGlmICh6IDwgMCB8fCB6ID4gNykgeworICAgICAgICAgICAgcHJpbnRmKCI/VGhlIGNob2ljZXMgYXJlIDAgb3IgMSA8PSBsZnBhZCA8PSA3XG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBBRF9FRElUSU5HOgorICAgICAgICBpZiAoKHkgPSBjbW51bSgiUEFEIGVkaXQgY29udHJvbCIsIiIsMTAsJnoseHhzdHJpbmcpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgaWYgKHogIT0gMCAmJiB6ICE9IDEpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoZSBjaG9pY2VzIGFyZSAwIG9yIDFcbiIpOworICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUEFEX0NIQVJfREVMRVRFX0NIQVI6CisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJQQUQgY2hhciBkZWxldGUgY2hhciIsIiIsMTAsJnoseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmICh6IDwgMCB8fCB6ID4gMTI3KSB7CisgICAgICAgICAgICBwcmludGYoIj9UaGUgY2hvaWNlcyBhcmUgMCBvciAxIDw9IGNoYXJkZWxldGUgPD0gMTI3XG4iKTsKKyAgICAgICAgICAgIHJldHVybigtMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBBRF9CVUZGRVJfREVMRVRFX0NIQVI6CisgICAgICAgIGlmICgoeSA9IGNtbnVtKCJQQUQgYnVmZmVyIGRlbGV0ZSBjaGFyIiwiIiwxMCwmeix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgaWYgKHogPCAwIHx8IHogPiAxMjcpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1RoZSBjaG9pY2VzIGFyZSAwIG9yIDEgPD0gYnVmZmVyZGVsZXRlIDw9IDEyN1xuIik7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQQURfQlVGRkVSX0RJU1BMQVlfQ0hBUjoKKyAgICAgICAgaWYgKCh5ID0gY21udW0oIlBBRCBkaXNwbGF5IGxpbmUgY2hhciIsIiIsMTAsJnoseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgIGlmICh6IDwgMCB8fCB6ID4gMTI3KSB7CisgICAgICAgICAgICBwcmludGYoIj9UaGUgY2hvaWNlcyBhcmUgMCBvciAxIDw9IGRpc3BsYXlsaW5lIDw9IDEyN1xuIik7CisgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcGFkcGFybXNbeF0gPSB6OworICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisjZW5kaWYgLyogSUJNWDI1ICovCisjZW5kaWYgLyogQU5ZWDI1ICovCisKKyNpZm5kZWYgTk9YRkVSCitpbnQKK3NldGF0KHJtc2ZsZykgaW50IHJtc2ZsZzsgeworICAgIGludCB4eDsKKyAgICBpZiAoKHkgPSBjbWtleShhdHRydGFiLG5hdHIsIkZpbGUgQXR0cmlidXRlIHBhY2tldHMiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHkpOworICAgIGlmICh5ID09IEFUX1hBTEwpIHsgICAgICAgICAgICAgICAgIC8qIEFUVFJJQlVURVMgQUxMIE9OIG9yIEFMTCBPRkYgKi8KKyAgICAgICAgaWYgKCh6ID0gc2V0b24oJnh4KSkgPCAwKSByZXR1cm4oeik7CisgICAgICAgIGlmIChybXNmbGcpIHsKKyAgICAgICAgICAgIHByaW50ZigiU29ycnksIGNvbW1hbmQgbm90IGF2YWlsYWJsZVxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXRlbmNpID0geHg7ICAgICAgICAgICAgICAgIC8qIEVuY29kaW5nIGluICovCisgICAgICAgICAgICBhdGVuY28gPSB4eDsgICAgICAgICAgICAgICAgLyogRW5jb2Rpbmcgb3V0ICovCisgICAgICAgICAgICBhdGRhdGkgPSB4eDsgICAgICAgICAgICAgICAgLyogRGF0ZSBpbiAqLworICAgICAgICAgICAgYXRkYXRvID0geHg7ICAgICAgICAgICAgICAgIC8qIERhdGUgb3V0ICovCisgICAgICAgICAgICBhdGRpc2kgPSB4eDsgICAgICAgICAgICAgICAgLyogRGlzcG9zaXRpb24gaW4vb3V0ICovCisgICAgICAgICAgICBhdGRpc28gPSB4eDsKKyAgICAgICAgICAgIGF0bGVuaSA9IHh4OyAgICAgICAgICAgICAgICAvKiBMZW5ndGggaW4vb3V0IChib3RoIGtpbmRzKSAqLworICAgICAgICAgICAgYXRsZW5vID0geHg7CisgICAgICAgICAgICBhdGJsa2kgPSB4eDsgICAgICAgICAgICAgICAgLyogQmxvY2tzaXplIGluL291dCAqLworICAgICAgICAgICAgYXRibGtvID0geHg7CisgICAgICAgICAgICBhdHR5cGkgPSB4eDsgICAgICAgICAgICAgICAgLyogRmlsZSB0eXBlIGluL291dCAqLworICAgICAgICAgICAgYXR0eXBvID0geHg7CisgICAgICAgICAgICBhdHNpZGkgPSB4eDsgICAgICAgICAgICAgICAgLyogU3lzdGVtIElEIGluL291dCAqLworICAgICAgICAgICAgYXRzaWRvID0geHg7CisgICAgICAgICAgICBhdHN5c2kgPSB4eDsgICAgICAgICAgICAgICAgLyogU3lzdGVtLWRlcGVuZGVudCBwYXJhbXMgaW4vb3V0ICovCisgICAgICAgICAgICBhdHN5c28gPSB4eDsKKyNpZmRlZiBDS19QRVJNUyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm90ZWN0aW9uICovCisgICAgICAgICAgICBhdGxwcmkgPSB4eDsgICAgICAgICAgICAgICAgLyogTG9jYWwgaW4gKi8KKyAgICAgICAgICAgIGF0bHBybyA9IHh4OyAgICAgICAgICAgICAgICAvKiBMb2NhbCBvdXQgKi8KKyAgICAgICAgICAgIGF0Z3ByaSA9IHh4OyAgICAgICAgICAgICAgICAvKiBHZW5lcmljIGluICovCisgICAgICAgICAgICBhdGdwcm8gPSB4eDsgICAgICAgICAgICAgICAgLyogR2VuZXJpYyBvdXQgKi8KKyNlbmRpZiAvKiBDS19QRVJNUyAqLworI2lmZGVmIFNUUkFUVVMKKyAgICAgICAgICAgIGF0ZnJtaSA9IHh4OyAgICAgICAgICAgICAgICAvKiBGb3JtYXQgaW4vb3V0ICovCisgICAgICAgICAgICBhdGZybW8gPSB4eDsKKyAgICAgICAgICAgIGF0Y3JlaSA9IHh4OyAgICAgICAgICAgICAgICAvKiBDcmVhdG9yIGlkIGluL291dCAqLworICAgICAgICAgICAgYXRjcmVvID0geHg7CisgICAgICAgICAgICBhdGFjdGkgPSB4eDsgICAgICAgICAgICAgICAgLyogQWNjb3VudCBpbi9vdXQgKi8KKyAgICAgICAgICAgIGF0YWN0byA9IHh4OworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4oeik7CisgICAgfSBlbHNlIGlmICh5ID09IEFUX0FMTFkgfHwgeSA9PSBBVF9BTExOKSB7IC8qIEFUVFJJQlVURVMgT04gb3IgT0ZGICovCisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICBhdGNhcHIgPSAoeSA9PSBBVF9BTExZKSA/IDEgOiAwOworICAgICAgICBpZiAocm1zZmxnKSB7CisgICAgICAgICAgICBzc3RhdGUgPSBzZXRnZW4oJ1MnLCAiMTMyIiwgYXRjYXByID8gIjEiIDogIjAiLCAiIik7CisgICAgICAgICAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyAgICAgICAgfSBlbHNlIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgfQorICAgIC8qIE90aGVyd2lzZSwgaXQncyBhbiBpbmRpdmlkdWFsIGF0dHJpYnV0ZSB0aGF0IHdhbnRzIHR1cm5pbmcgb2ZmL29uICovCisKKyAgICBpZiAoKHogPSBjbWtleShvbm9mZiwyLCIiLCIiLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeik7CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisKKy8qIFRoZXJlIGFyZSBiZXR0ZXIgd2F5cyB0byBkbyB0aGlzLi4uICovCisvKiBUaGUgcmVhbCBwcm9ibGVtIGlzIHRoYXQgd2UncmUgbm90IHNlcGFyYXRpbmcgdGhlIGluIGFuZCBvdXQgY2FzZXMgKi8KKy8qIGFuZCBzbyB3ZSBoYXZlIHRvIGFyYml0cmFyaWx5IHBpY2sgdGhlICJpbiIgY2FzZSwgaS5lIHRlbGwgdGhlIHJlbW90ZSAqLworLyogc2VydmVyIHRvIGlnbm9yZSBpbmNvbWluZyBhdHRyaWJ1dGVzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSwgcmF0aGVyICovCisvKiB0aGFuIHRlbGxpbmcgaXQgbm90IHRvIHNlbmQgdGhlbS4gIFRoZSBwcm90b2NvbCBkb2VzIG5vdCAoeWV0KSBkZWZpbmUgKi8KKy8qIGNvZGVzIGZvciAiaW4tYW5kLW91dC1hdC10aGUtc2FtZS10aW1lIi4gKi8KKworICAgIHN3aXRjaCAoeSkgeworI2lmZGVmIENLX1BFUk1TCisvKiBXZSdyZSBsdW1waW5nIGxvY2FsIGFuZCBnZW5lcmljIHByb3RlY3Rpb24gdG9nZXRoZXIgZm9yIG5vdy4uLiAqLworICAgICAgY2FzZSBBVF9MUFJPOgorICAgICAgY2FzZSBBVF9HUFJPOgorICAgICAgICBpZiAocm1zZmxnKSB7CisgICAgICAgICAgICBzc3RhdGUgPSBzZXRnZW4oJ1MnLCAiMTQzIiwgeiA/ICIxIiA6ICIwIiwgIiIpOworICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgYXRscHJpID0gYXRscHJvID0gYXRncHJpID0gYXRncHJvID0gejsgYnJlYWs7CisjZW5kaWYgLyogQ0tfUEVSTVMgKi8KKyAgICAgIGNhc2UgQVRfRElTUDoKKyAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdTJywgIjE0MiIsIHogPyAiMSIgOiAiMCIsICIiKTsKKyAgICAgICAgICAgIHJldHVybigoaW50KSBzc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGF0ZGlzaSA9IGF0ZGlzbyA9IHo7IGJyZWFrOworICAgICAgY2FzZSBBVF9FTkNPOgorICAgICAgICBpZiAocm1zZmxnKSB7CisgICAgICAgICAgICBzc3RhdGUgPSBzZXRnZW4oJ1MnLCAiMTQxIiwgeiA/ICIxIiA6ICIwIiwgIiIpOworICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgYXRlbmNpID0gYXRlbmNvID0gejsgYnJlYWs7CisgICAgICBjYXNlIEFUX0RBVEU6CisgICAgICAgIGlmIChybXNmbGcpIHsKKyAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsICIxMzUiLCB6ID8gIjEiIDogIjAiLCAiIik7CisgICAgICAgICAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBhdGRhdGkgPSBhdGRhdG8gPSB6OyBicmVhazsKKyAgICAgIGNhc2UgQVRfTEVOQjoKKyAgICAgIGNhc2UgQVRfTEVOSzoKKyAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdTJywgIjEzMyIsIHogPyAiMSIgOiAiMCIsICIiKTsKKyAgICAgICAgICAgIHJldHVybigoaW50KSBzc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGF0bGVuaSA9IGF0bGVubyA9IHo7IGJyZWFrOworICAgICAgY2FzZSBBVF9CTEtTOgorICAgICAgICBpZiAocm1zZmxnKSB7CisgICAgICAgICAgICBzc3RhdGUgPSBzZXRnZW4oJ1MnLCAiMTM5IiwgeiA/ICIxIiA6ICIwIiwgIiIpOworICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgYXRibGtpID0gYXRibGtvID0gejsgYnJlYWs7CisgICAgICBjYXNlIEFUX0ZUWVA6CisgICAgICAgIGlmIChybXNmbGcpIHsKKyAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsICIxMzQiLCB6ID8gIjEiIDogIjAiLCAiIik7CisgICAgICAgICAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBhdHR5cGkgPSBhdHR5cG8gPSB6OyBicmVhazsKKyNpZmRlZiBTVFJBVFVTCisgICAgICBjYXNlIEFUX0NSRUE6CisgICAgICAgIGlmIChybXNmbGcpIHsKKyAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsICIxMzYiLCB6ID8gIjEiIDogIjAiLCAiIik7CisgICAgICAgICAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBhdGNyZWkgPSBhdGNyZW8gPSB6OyBicmVhazsKKyAgICAgIGNhc2UgQVRfQUNDVDoKKyAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdTJywgIjEzNyIsIHogPyAiMSIgOiAiMCIsICIiKTsKKyAgICAgICAgICAgIHJldHVybigoaW50KSBzc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGF0YWN0aSA9IGF0YWN0byA9IHo7IGJyZWFrOworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyAgICAgIGNhc2UgQVRfU1lTSToKKyAgICAgICAgaWYgKHJtc2ZsZykgeworICAgICAgICAgICAgc3N0YXRlID0gc2V0Z2VuKCdTJywgIjE0NSIsIHogPyAiMSIgOiAiMCIsICIiKTsKKyAgICAgICAgICAgIHJldHVybigoaW50KSBzc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGF0c2lkaSA9IGF0c2lkbyA9IHo7IGJyZWFrOworICAgICAgY2FzZSBBVF9SRUNGOgorICAgICAgICBpZiAocm1zZmxnKSB7CisgICAgICAgICAgICBzc3RhdGUgPSBzZXRnZW4oJ1MnLCAiMTQ2IiwgeiA/ICIxIiA6ICIwIiwgIiIpOworICAgICAgICAgICAgcmV0dXJuKChpbnQpIHNzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgYXRmcm1pID0gYXRmcm1vID0gejsgYnJlYWs7CisgICAgICBjYXNlIEFUX1NZU1A6CisgICAgICAgIGlmIChybXNmbGcpIHsKKyAgICAgICAgICAgIHNzdGF0ZSA9IHNldGdlbignUycsICIxNDciLCB6ID8gIjEiIDogIjAiLCAiIik7CisgICAgICAgICAgICByZXR1cm4oKGludCkgc3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBhdHN5c2kgPSBhdHN5c28gPSB6OyBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ZigiP05vdCBhdmFpbGFibGVcbiIpOworICAgICAgICByZXR1cm4oLTIpOworICAgIH0KKyAgICByZXR1cm4oMSk7Cit9CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9TUEwKK2ludAorc2V0aW5wKCkgeworICAgIGlmICgoeSA9IGNta2V5KGlucHRhYixuaW5wLCIiLCIiLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgc3dpdGNoICh5KSB7CisjaWZkZWYgT1MyCisgICAgICBjYXNlIElOX1BBQzogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIElOUFVUIFBBQ0lORyAqLworICAgICAgICB6ID0gY21udW0oIm1pbGxpc2Vjb25kcyIsIjAiLDEwLCZ4LHh4c3RyaW5nKTsKKyAgICAgICAgcmV0dXJuKHNldG51bSgmdHRfaW5wYWNpbmcseCx6LDEwMDApKTsKKyAgICAgIGNhc2UgSU5fVFJNOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgSU5QVVQgVEVSTUlOQUwgKi8KKyAgICAgICAgcmV0dXJuKHNldG9uKCZpbnRlcm0pKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgIGNhc2UgSU5fREVGOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgSU5QVVQgREVGQVVMVC1USU1FT1VUICovCisgICAgICAgIHogPSBjbW51bSgiUG9zaXRpdmUgbnVtYmVyIiwiIiwxMCwmeCx4eHN0cmluZyk7CisgICAgICAgIHJldHVybihzZXRudW0oJmluZGVmLHgseiw5NCkpOworI2lmZGVmIENLRkxPQVQKKyAgICAgIGNhc2UgSU5fU0NBOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgSU5QVVQgU0NBTEUtRkFDVE9SICovCisJaWYgKCh4ID0gY21mbGQoIk51bWJlciBzdWNoIGFzIDIgb3IgMC41IiwiMS4wIiwmcywgeHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeCk7CisgICAgICAgIGlmIChpc2Zsb2F0KHMsMCkpIHsJCS8qIEEgZmxvYXRpbmctcG9pbnQgbnVtYmVyPyAqLworICAgICAgICAgICAgZXh0ZXJuIGNoYXIgKiBpbnBzY2FsZTsKKwkgICAgaW5zY2FsZSA9IGZsb2F0dmFsOwkJLyogWWVzLCBnZXQgaXRzIHZhbHVlICovCisJICAgIG1ha2VzdHIoJmlucHNjYWxlLHMpOwkvKiBTYXZlIGl0IGFzIFx2KGluc2NhbGUpICovCisJICAgIHJldHVybihzdWNjZXNzID0gMSk7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuKC0yKTsKKwl9CisjZW5kaWYJLyogQ0tGTE9BVCAqLworICAgICAgY2FzZSBJTl9USU06ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBJTlBVVCBUSU1FT1VULUFDVElPTiAqLworICAgICAgICBpZiAoKHogPSBjbWtleShpbnRpbXQsMiwiIiwiIix4eHN0cmluZykpIDwgMCkgcmV0dXJuKHopOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgaW50aW1lW2NtZGx2bF0gPSB6OworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgICAgY2FzZSBJTl9DQVM6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBJTlBVVCBDQVNFICovCisgICAgICAgIGlmICgoeiA9IGNta2V5KGluY2FzdCwyLCIiLCIiLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeik7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICBpbnBjYXNbY21kbHZsXSA9IHo7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisgICAgICBjYXNlIElOX0VDSDogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIElOUFVUIEVDSE8gKi8KKyAgICAgICAgcmV0dXJuKHNldG9uKCZpbmVjaG8pKTsKKyAgICAgIGNhc2UgSU5fU0lMOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgSU5QVVQgU0lMRU5DRSAqLworICAgICAgICB6ID0gY21udW0oIlNlY29uZHMgb2YgaW5hY3Rpdml0eSBiZWZvcmUgSU5QVVQgZmFpbHMiLCIiLDEwLCZ4LAorICAgICAgICAgICAgICAgICAgeHhzdHJpbmcpOworICAgICAgICByZXR1cm4oc2V0bnVtKCZpbnNpbGVuY2UseCx6LC0xKSk7CisKKyAgICAgIGNhc2UgSU5fQlVGOiAgICAgICAgICAgICAgICAgICAgICAvKiBTRVQgSU5QVVQgQlVGRkVSLVNJWkUgKi8KKyAgICAgICAgaWYgKCh6ID0gY21udW0oIk51bWJlciBvZiBieXRlcyBpbiBJTlBVVCBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICBja2l0b2EoSU5QQlVGU0laKSwxMCwmeCwgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHopOworICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyAgICAgICAgaW5idWZzaXplID0gMDsKKyAgICAgICAgaWYgKGlucGJ1ZikgeworICAgICAgICAgICAgZnJlZShpbnBidWYpOworICAgICAgICAgICAgaW5wYnVmID0gTlVMTDsKKyAgICAgICAgICAgIGlucGJwID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShzID0gKGNoYXIgKiltYWxsb2MoeCArIDEpKSkKKyAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIGlucGJ1ZiA9IHM7CisgICAgICAgIGlucGJwID0gczsKKyAgICAgICAgaW5idWZzaXplID0geDsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8PSBpbmJ1ZnNpemU7IHgrKykKKyAgICAgICAgICBpbnBidWZbeF0gPSBOVUw7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKyNpZmRlZiBDS19BVVRPREwKKyAgICAgIGNhc2UgSU5fQURMOiAgICAgICAgICAgICAgICAgICAgICAvKiBBVVRPRE9XTkxPQUQgKi8KKyAgICAgICAgcmV0dXJuKHNldG9uKCZpbmF1dG9kbCkpOworI2VuZGlmIC8qIENLX0FVVE9ETCAqLworCisgICAgICBjYXNlIElOX0NBTjogICAgICAgICAgICAgICAgICAgICAgLyogU0VUIElOUFVUIElOVEVSUlVQVFMgKi8KKyAgICAgICAgcmV0dXJuKHNldG9uKCZpbmludHIpKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBORVRDT05OCitWT0lECituZHJlc2V0KCkgeworI2lmbmRlZiBOT0RJQUwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgZGVwZW5kcyBvbiBESUFMLi4uICovCisgICAgaW50IGk9MCwgaj0wOworICAgIGlmICghbmRpbml0ZWQpICAgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGZyZWUgZ2FyYmFnZS4uLiAqLworICAgICAgcmV0dXJuOworICAgIGZvciAoaSA9IDA7IGkgPCBuaGNvdW50OyBpKyspIHsgICAgIC8qIENsZWFuIG91dCBwcmV2aW91cyBsaXN0ICovCisgICAgICAgIGlmIChuaF9wW2ldKQorICAgICAgICAgIGZyZWUobmhfcFtpXSk7CisgICAgICAgIG5oX3BbaV0gPSBOVUxMOworICAgICAgICBpZiAobmhfcDJbaV0pCisgICAgICAgICAgZnJlZShuaF9wMltpXSk7CisgICAgICAgIG5oX3AyW2ldID0gTlVMTDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgaWYgKG5oX3B4W2pdW2ldKQorICAgICAgICAgICAgICBmcmVlKG5oX3B4W2pdW2ldKTsKKyAgICAgICAgICAgIG5oX3B4W2pdW2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBOT0RJQUwgKi8KK30KKworVk9JRAorbmRpbml0KCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldCBkaXJlY3RvcnkgcG9pbnRlcnMgKi8KKyNpZm5kZWYgTk9ESUFMICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGRlcGVuZHMgb24gRElBTC4uLiAqLworICAgIGludCBpLCBqOworICAgIGlmIChuZGluaXRlZCsrKSAgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UuICovCisgICAgICByZXR1cm47CisgICAgZm9yIChpID0gMDsgaSA8IE1BWERESVI7IGkrKykgeyAgICAgLyogSW5pdCBhbGwgcG9pbnRlcnMgdG8gTlVMTCAqLworICAgICAgICBuZXRkaXJbaV0gPSBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYRE5VTVM7IGkrKykgeworICAgICAgICBuaF9wW2ldID0gTlVMTDsKKyAgICAgICAgbmhfcDJbaV0gPSBOVUxMOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgIG5oX3B4W2pdW2ldID0gTlVMTDsKKyAgICB9CisjZW5kaWYgLyogTk9ESUFMICovCit9CisKKyNpZm5kZWYgTk9ESUFMCisjaWZkZWYgTkVUQ09OTgorVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBuZXQgZGVmYXVsdHMgZnJvbSBlbnZpcm9ubWVudCAqLworZ2V0bmV0ZW52KCkgeworICAgIGNoYXIgKnAgPSBOVUxMOworCisgICAgbWFrZXN0cigmcCxnZXRlbnYoIktfTkVUX0RJUkVDVE9SWSIpKTsgLyogRGlhbGluZyBkaXJlY3RvcmllcyAqLworICAgIGlmIChwKSB7CisgICAgICAgIGludCBpOworICAgICAgICB4d29yZHMocCxNQVhERElSLG5ldGRpciwwKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWERESVI7IGkrKykgeyAvKiBGaWxsIGluIGFueSBnYXBzLi4uICovCisgICAgICAgICAgICBpZiAoIW5ldGRpcltpKzFdKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgbmV0ZGlyW2ldID0gbmV0ZGlyW2krMV07CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJuZXRkaXJbaV0iLG5ldGRpcltpXSxpKTsKKyAgICAgICAgfQorICAgICAgICBubmV0ZGlyID0gaTsKKyAgICB9Cit9CisjZW5kaWYgLyogTkVUQ09OTiAqLworI2VuZGlmIC8qIE5PRElBTCAqLworCitpbnQKKyNpZmRlZiBDS19BTlNJQworbHVuZXQoY2hhciAqcykgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHMgPSBuYW1lIHRvIGxvb2sgdXAgICAqLworI2Vsc2UKK2x1bmV0KHMpIGNoYXIgKnM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGx1bmV0ICovIHsKKyNpZm5kZWYgTk9ESUFMICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGRlcGVuZHMgb24gRElBTC4uLiAqLworICAgIGludCBuLCBuMSwgdCwgZGQgPSAwOworICAgIGludCBhbWJpZ3VvdXMgPSAwOworICAgIEZJTEUgKiBmOworICAgIGNoYXIgKmxpbmUgPSBOVUxMOworICAgIGV4dGVybiBpbnQgZGlhbGRweTsKKyAgICBpbnQgbmV0ZHB5ID0gZGlhbGRweTsKKyAgICBjaGFyICppbmZvWzhdOworCisgICAgbmhjb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoaXMgYmVmb3JlIHJldHVybmluZyAqLworCisgICAgaWYgKCFzIHx8IG5uZXRkaXIgPCAxKSAgICAgICAgICAgICAgLyogVmFsaWRhdGUgYXJndW1lbnRzICovCisgICAgICByZXR1cm4oLTEpOworCisgICAgaWYgKGlzZGlnaXQoKnMpIHx8ICpzID09ICcqJyB8fCAqcyA9PSAnLicpCisgICAgICByZXR1cm4oMCk7CisKKyAgICBpZiAoKG4xID0gKGludCkgc3RybGVuKHMpKSA8IDEpICAgICAvKiBMZW5ndGggb2Ygc3RyaW5nIHRvIGxvb2sgdXAgKi8KKyAgICAgIHJldHVybigtMSk7CisKKyAgICBpZiAoIShsaW5lID0gbWFsbG9jKDEwMjQpKSkgICAgICAgICAvKiBBbGxvY2F0ZSBpbnB1dCBidWZmZXIgKi8KKyAgICAgIHJldHVybigtMSk7CisKKyAgbHVfYWdhaW46CisgICAgZiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV0d29yayBkaXJlY3RvcnkgZmlsZSBkZXNjcmlwdG9yICovCisgICAgdCA9IG5oY291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogTWF0Y2ggY291bnQgKi8KKyAgICBkZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3RvcnkgY291bnRlciAqLworCisgICAgZGlybGluZSA9IDA7CisgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UgbWFrZSBvbmUgcGFzcyAqLworICAgICAgICBpZiAoIWYpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIERpcmVjdG9yeSBub3Qgb3BlbiAqLworICAgICAgICAgICAgaWYgKGRkID49IG5uZXRkaXIpICAgICAgICAgIC8qIE5vIGRpcmVjdG9yaWVzIGxlZnQ/ICovCisgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLyogRG9uZS4gKi8KKyAgICAgICAgICAgIGlmICgoZiA9IGZvcGVuKG5ldGRpcltkZF0sInIiKSkgPT0gTlVMTCkgeyAvKiBPcGVuIGl0ICovCisgICAgICAgICAgICAgICAgcGVycm9yKG5ldGRpcltkZF0pOyAgICAgLyogQ2FuJ3QsIHByaW50IG1lc3NhZ2Ugc2F5aW5nIHdoeSAqLworICAgICAgICAgICAgICAgIGRkKys7CisgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgLyogQnV0IGdvIG9uIHRvIG5leHQgb25lLiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ldGRweSkKKyAgICAgICAgICAgICAgcHJpbnRmKCJPcGVuaW5nICVzLi4uXG4iLG5ldGRpcltkZF0pOworICAgICAgICAgICAgZGQrKzsKKyAgICAgICAgfQorICAgICAgICBsaW5lWzBdID0gTlVMOworICAgICAgICBpZiAoZ2V0bmN0KGxpbmUsMTAyMyxmLDEpIDwgMCkgeyAvKiBSZWFkIGEgbGluZSAqLworICAgICAgICAgICAgaWYgKGYpIHsgICAgICAgICAgICAgICAgICAgIC8qIGYgY2FuIGJlIGNsb2JiZXJlZCEgKi8KKyAgICAgICAgICAgICAgICBmY2xvc2UoZik7ICAgICAgICAgICAgICAvKiBDbG9zZSB0aGUgZmlsZSAqLworICAgICAgICAgICAgICAgIGYgPSBOVUxMOyAgICAgICAgICAgICAgIC8qIEluZGljYXRlIG5leHQgb25lIG5lZWRzIG9wZW5pbmcgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICghbGluZVswXSkgICAgICAgICAgICAgICAgICAgLyogRW1wdHkgbGluZSAqLworICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHh3b3JkcyhsaW5lLDcsaW5mbywwKTsgICAgICAgICAgLyogUGFyc2UgaXQgKi8KKworICAgICAgICBpZiAoIWluZm9bMV0gfHwgIWluZm9bMl0gfHwgIWluZm9bM10pIC8qIFJlcXVpcmVkIGZpZWxkcyAqLworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoKmluZm9bMV0gPT0gJzsnKSAgICAgICAgICAgIC8qIEZ1bGwtbGluZSBjb21tZW50ICovCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICgobiA9IChpbnQpIHN0cmxlbihpbmZvWzFdKSkgPCAxKSAvKiBMZW5ndGggb2YgbmFtZS10YWcgKi8KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKG4gPCBuMSkgICAgICAgICAgICAgICAgICAgICAvKiBTZWFyY2ggbmFtZSBpcyBsb25nZXIgKi8KKyAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAvKiBDYW4ndCBwb3NzaWJseSBtYXRjaCAqLworICAgICAgICBpZiAoYW1iaWd1b3VzICYmIG4gIT0gbjEpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChja3N0cmNtcChzLGluZm9bMV0sbjEsMCkpICAgLyogQ29tcGFyZSB1c2luZyBsZW5ndGggb2YgKi8KKyAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAvKiBzZWFyY2ggc3RyaW5nIHMuICovCisKKyAgICAgICAgLyogSGF2ZSBhIG1hdGNoICovCisKKyAgICAgICAgbWFrZXN0cigmKG5oX3Bbbmhjb3VudF0pLCBpbmZvWzNdKTsgICAgLyogYWRkcmVzcyAqLworICAgICAgICBtYWtlc3RyKCYobmhfcDJbbmhjb3VudF0pLGluZm9bMl0pOyAgICAvKiBuZXQgdHlwZSAqLworICAgICAgICBtYWtlc3RyKCYobmhfcHhbMF1bbmhjb3VudF0pLGluZm9bNF0pOyAvKiBuZXQtc3BlY2lmaWMgc3R1ZmYuLi4gKi8KKyAgICAgICAgbWFrZXN0cigmKG5oX3B4WzFdW25oY291bnRdKSxpbmZvWzVdKTsKKyAgICAgICAgbWFrZXN0cigmKG5oX3B4WzJdW25oY291bnRdKSxpbmZvWzZdKTsKKyAgICAgICAgbWFrZXN0cigmKG5oX3B4WzNdW25oY291bnRdKSxpbmZvWzddKTsKKworICAgICAgICBuaGNvdW50Kys7ICAgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IHRoaXMgbWF0Y2ggKi8KKyAgICAgICAgaWYgKG5oY291bnQgPiBNQVhETlVNUykgeyAgICAgICAvKiBXYXRjaCBvdXQgZm9yIHRvbyBtYW55ICovCisgICAgICAgICAgICBwcmludGYoIldhcm5pbmc6ICVkIG1hdGNoZXMgZm91bmQsICVkIG1heFxuIiwKKyAgICAgICAgICAgICAgICAgICBuaGNvdW50LAorICAgICAgICAgICAgICAgICAgIE1BWEROVU1TCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIG5oY291bnQgPSBNQVhETlVNUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChuaGNvdW50ID09IDEpIHsgICAgICAgICAgICAgLyogRmlyc3Qgb25lIC0gc2F2ZSBlbnRyeSBuYW1lICovCisgICAgICAgICAgICBpZiAobl9uYW1lKSB7ICAgICAgICAgICAgICAgLyogRnJlZSB0aGUgb25lIGZyb20gYmVmb3JlIGlmIGFueSAqLworICAgICAgICAgICAgICAgIGZyZWUobl9uYW1lKTsKKyAgICAgICAgICAgICAgICBuX25hbWUgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEobl9uYW1lID0gKGNoYXIgKiltYWxsb2MobiArIDEpKSkgeyAvKiBBbGxvY2F0ZSBuZXcgc3RvcmFnZSAqLworICAgICAgICAgICAgICAgIHByaW50ZigiP21lbW9yeSBhbGxvY2F0aW9uIGVycm9yIC0gbHVuZXQ6M1xuIik7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5oY291bnQgPSAwOworICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ID0gbjsgICAgICAgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgaXRzIGxlbmd0aCAqLworICAgICAgICAgICAgc3RyY3B5KG5fbmFtZSxpbmZvWzFdKTsgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWNvbmQgb3Igc3Vic2VxdWVudCBvbmUgKi8KKyAgICAgICAgICAgIGlmICgoaW50KSBzdHJsZW4oaW5mb1sxXSkgPT0gdCkgLyogTGVuZ3RocyBjb21wYXJlICovCisgICAgICAgICAgICAgIGlmICghY2tzdHJjbXAobl9uYW1lLGluZm9bMV0sdCwwKSkgLyogQ2FzZWxlc3MgY29tcGFyZSBPSyAqLworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvKiBOYW1lIGdpdmVuIGJ5IHVzZXIgbWF0Y2hlcyBlbnRyaWVzIHdpdGggZGlmZmVyZW50IG5hbWVzICovCisKKyAgICAgICAgICAgIGlmIChhbWJpZ3VvdXMpICAgICAgICAgICAgICAvKiBCZWVuIGhlcmUgYmVmb3JlICovCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBhbWJpZ3VvdXMgPSAxOyAgICAgICAgICAgICAgLyogTm93IGFuIGV4YWN0IG1hdGNoIGlzIHJlcXVpcmVkICovCisgICAgICAgICAgICBuZHJlc2V0KCk7ICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgb3V0IHByZXZpb3VzIGxpc3QgKi8KKyAgICAgICAgICAgIGdvdG8gbHVfYWdhaW47ICAgICAgICAgICAgICAvKiBEbyBpdCBhbGwgb3ZlciBhZ2Fpbi4gKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobGluZSkgeworICAgICAgICBmcmVlKGxpbmUpOworICAgICAgICBsaW5lID0gTlVMTDsKKyAgICB9CisgICAgaWYgKG5oY291bnQgPT0gMCAmJiBhbWJpZ3VvdXMpCisgICAgICBwcmludGYoIj9cIiVzXCIgLSBhbWJpZ3VvdXMgaW4gbmV0d29yayBkaXJlY3RvcnlcbiIscyk7CisjZWxzZQorICAgIG5oY291bnQgPSAwOworI2VuZGlmIC8qIE5PRElBTCAqLworICAgIHJldHVybihuaGNvdW50KTsKK30KKyNlbmRpZiAvKiBORVRDT05OICovCisKKyNpZm5kZWYgTk9MT0NBTAorLyogIEMgTCBTIEMgTyBOIE4gWCAgLS0gIENsb3NlIGNvbm5lY3Rpb24gICovCisKK2ludAorY2xzY29ubngoYXNrKSBpbnQgYXNrOyB7CisgICAgaW50IHgsIHJjID0gMDsKKyNpZmRlZiBORVdGVFAKKyAgICBleHRlcm4gaW50IGZ0cGdldCwgZnRwaXNvcGVuKCksIGZ0cGJ5ZSgpOworICAgIGlmICgoZnRwZ2V0ID09IDEpIHx8ICgoZnRwZ2V0ID09IDIpICYmICFsb2NhbCAmJiBmdHBpc29wZW4oKSkpCisgICAgICByZXR1cm4oc3VjY2VzcyA9IGZ0cGJ5ZSgpKTsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKyAgICBkZWJ1ZyhGMTAxLCJjbHNjb25ueCBsb2NhbCIsIiIsbG9jYWwpOworICAgIGlmIChsb2NhbCkgeworICAgICAgICB4ID0gYXNrID8gaHVwb2soMSkgOiAxOyAgICAgICAgIC8qIE1ha2Ugc3VyZSBpdCdzIE9LIHRvIGNsb3NlICovCisgICAgICAgIGlmICgheCkgeworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImNsc2Nvbm54IGh1cG9rIHNheXMgbm8iLCIiLHJjKTsKKyAgICAgICAgICAgIHJldHVybihyYyk7CisgICAgICAgIH0KKyAgICAgICAgdHRmbHVpKCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciBhd2F5IGJ1ZmZlcmVkIHVwIGp1bmsgKi8KKyNpZm5kZWYgTk9ESUFMCisjaWZkZWYgT1MyT05MWQorLyogRG9uJ3QgaGFuZ3VwIGEgbGluZSB0aGF0IGlzIHNoYXJlZCB3aXRoIHRoZSBTTElQIG9yIFBQUCBkcml2ZXIgKi8KKyAgICAgICAgaWYgKCF0dHNsaXAgJiYgIXR0cHBwKQorI2VuZGlmIC8qIE9TMk9OTFkgKi8KKyAgICAgICAgICBtZG1odXAoKTsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyAgICAgICAgaWYgKG5ldHdvcmsgJiYgbXNnZmxnKQorICAgICAgICAgIHByaW50ZigiIENsb3NpbmcgY29ubmVjdGlvblxuIik7CisgICAgICAgIHR0Y2xvcygwKTsgICAgICAgICAgICAgICAgICAgICAgLyogQ2xvc2Ugb2xkIGNvbm5lY3Rpb24sIGlmIGFueSAqLworICAgICAgICByYyA9IDE7CisgICAgICAgIHsKKyAgICAgICAgICAgIGV4dGVybiBpbnQgd2FzY2xvc2VkLCB3aHljbG9zZWQ7CisgICAgICAgICAgICBpZiAod2FzY2xvc2VkKSB7CisgICAgICAgICAgICAgICAgd2h5Y2xvc2VkID0gV0NfQ0xPUzsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICBpZiAobm1hYykgeyAgICAgICAgICAgICAvKiBBbnkgbWFjcm9zIGRlZmluZWQ/ICovCisgICAgICAgICAgICAgICAgICAgIGludCBrOyAgICAgICAgICAgICAgLyogWWVzICovCisgICAgICAgICAgICAgICAgICAgIC8qIHByaW50ZigiT05fQ0xPU0UgQ0xTQ09OTlhcbiIpOyAqLworICAgICAgICAgICAgICAgICAgICB3YXNjbG9zZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBrID0gbWxvb2sobWFjdGFiLCJvbl9jbG9zZSIsbm1hYyk7ICAvKiBMb29rIHRoaXMgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPj0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgZm91bmQsICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9kbyhrLGNraXRvYSh3aHljbG9zZWQpLDApID4gLTEpIC8qIHNldCBpdCB1cCwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyKDEpOyAgICAgICAgICAgICAgICAgICAgLyogYW5kIGV4ZWN1dGUgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgICAgICAgIHdoeWNsb3NlZCA9IFdDX1JFTU87CisgICAgICAgICAgICAgICAgd2FzY2xvc2VkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBWTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPciBtYXliZSAjaWZuZGVmIFVOSVg/ICovCisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVlZCB0byBkbyB0aGlzIGluIFZNUyB0byAqLworICAgICAgICB0dGNsb3MoMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgdGhlIHR0eSBjaGFubmVsIG51bWJlciAqLworICAgICAgICByYyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9idGFpbmVkIGluIHR0b3BlbigpIG9yIGVsc2UgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWJzZXF1ZW50IHR0b3BlbidzIHdvbid0IHdvcmsgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyAgICBkb2xvZ2VuZCgpOworICAgIGhhdmVsaW5lID0gMDsKKyAgICBpZiAobWRtdHlwIDwgMCkgeyAgICAgICAgICAgICAgICAgICAvKiBTd2l0Y2hpbmcgZnJvbSBuZXQgdG8gYXN5bmM/ICovCisgICAgICAgIGlmIChtZG1zYXYgPiAtMSkgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBtb2RlbSB0eXBlIGZyb20gbGFzdCAqLworICAgICAgICAgIG1kbXR5cCA9IG1kbXNhdjsgICAgICAgICAgICAgIC8qIFNFVCBNT0RFTSBjb21tYW5kLCBpZiBhbnkuICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICBtZG10eXAgPSAwOworICAgICAgICBtZG1zYXYgPSAtMTsKKyAgICB9CisgICAgaWYgKG5ldHdvcmspCisgICAgICBuZXR3b3JrID0gMDsKKyNpZmRlZiBORVRDT05OCisgICAgaWYgKG9sZHBsZXggPiAtMSkgeyAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBwcmV2aW91cyBkdXBsZXggc2V0dGluZy4gKi8KKyAgICAgICAgZHVwbGV4ID0gb2xkcGxleDsKKyAgICAgICAgb2xkcGxleCA9IC0xOworICAgIH0KKyNlbmRpZiAvKiBORVRDT05OICovCisjaWZuZGVmIE1BQworICAgIGNrc3RybmNweSh0dG5hbWUsZGZ0dHksVFROQU1MRU4pOyAgIC8qIFJlc3RvcmUgZGVmYXVsdCBjb21tdW5pY2F0aW9uICovCisjZW5kaWYgLyogTUFDICovCisgICAgbG9jYWwgPSBkZmxvYzsgICAgICAgICAgICAgICAgICAgICAgLyogZGV2aWNlIGFuZCBsb2NhbC9yZW1vdGUgc3RhdHVzICovCisgICAgaWYgKGxvY2FsKSB7CisgICAgICAgIGN4dHlwZSA9IENYVF9ESVJFQ1Q7ICAgICAgICAgICAgLyogU29tZXRoaW5nIHJlYXNvbmFibGUgKi8KKyAgICAgICAgc3BlZWQgPSB0dGdzcGQoKTsgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc3BlZWQgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBjeHR5cGUgPSBDWFRfUkVNT1RFOworICAgICAgICBzcGVlZCA9IC0xTDsKKyAgICB9CisjaWZuZGVmIE5PWEZFUgorICAgIGlmICh4cmVsaWFibGUgPiAtMSAmJiAhc2V0cmVsaWFibGUpIHsKKyAgICAgICAgcmVsaWFibGUgPSB4cmVsaWFibGU7CisgICAgICAgIGRlYnVnKEYxMDEsImNsc2Nvbm54IHJlbGlhYmxlIEEiLCIiLHJlbGlhYmxlKTsKKyAgICB9IGVsc2UgaWYgKCFzZXRyZWxpYWJsZSkgeworICAgICAgICByZWxpYWJsZSA9IFNFVF9BVVRPOworICAgICAgICBkZWJ1ZyhGMTAxLCJjbHNjb25ueCByZWxpYWJsZSBCIiwiIixyZWxpYWJsZSk7CisgICAgfQorI2VuZGlmIC8qIE5PWEZFUiAqLworICAgIHNldGZsb3coKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldmVydCBmbG93IGNvbnRyb2wgKi8KKyAgICByZXR1cm4ocmMpOworfQorCitpbnQKK2Nsc2tjb25ueCh4KSBpbnQgeDsgeyAgICAgICAgICAgICAgICAgICAvKiBDbG9zZSBLZXJtaXQgY29ubmVjdGlvbiBvbmx5ICovCisgICAgaW50IHQsIHJjOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG5vdCBGVFApICovCisjaWZkZWYgTkVXRlRQCisgICAgZXh0ZXJuIGludCBmdHBnZXQ7CisgICAgdCA9IGZ0cGdldDsKKyAgICBmdHBnZXQgPSAwOworI2VuZGlmIC8qIE5FV0ZUUCAqLworICAgIHJjID0gY2xzY29ubngoeCk7CisjaWZkZWYgTkVXRlRQCisgICAgZnRwZ2V0ID0gdDsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKyAgICByZXR1cm4ocmMpOworfQorCisvKiBNYXkgMjAwMjogc2V0bGluKCkgZGVjb21wb3NpdGlvbiBzdGFydHMgaGVyZSAuLi4gKi8KKworI2lmZGVmIE9TMgorI2RlZmluZSBTUlZCVUZTSVogUElQRU5BTUwKKyNlbHNlIC8qIE9TMiAqLworI2RlZmluZSBTUlZCVUZTSVogNjMKKyNlbmRpZiAvKiBPUzIgKi8KKyNkZWZpbmUgSE9TVE5BTUxFTiAxNSo2NQorCitpbnQgbmV0c2F2ZSA9IC0xOworc3RhdGljIGNoYXIgKiB0bXBzdHJpbmcgPSBOVUxMOworc3RhdGljIGNoYXIgKiB0bXB1c3JpZCA9IE5VTEw7CisKKyNpZmRlZiBTU0hDTUQKK2NoYXIgKiBzc2hjbWQgPSBOVUxMOworY2hhciAqIGRlZnNzaGNtZCA9ICJzc2ggLWUgbm9uZSI7CisjZWxzZQorI2lmZGVmIFNTSEJVSUxUSU4KK2NoYXIgKiBzc2hyY21kID0gTlVMTDsKK2NoYXIgKiBzc2h0bXBjbWQgPSBOVUxMOworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKyNlbmRpZiAvKiBTU0hDTUQgKi8KKworLyogYyB4IF8gZiBhIGkgbCAgLS0gIENvbW1vbiBlcnJvciBleGl0IHJvdXRpbmUgZm9yIGN4X25ldCwgY3hfbGluZSAqLworCitpbnQKK2N4X2ZhaWwobXNnLCB0ZXh0KSBpbnQgbXNnOyBjaGFyICogdGV4dDsgeworICAgIG1ha2VzdHIoJnNsbXNnLHRleHQpOwkJLyogRm9yIHRoZSByZWNvcmQgKG9yIEdVSSkgKi8KKyAgICBpZiAobXNnKQkJCQkvKiBOb3QgR1VJLCBub3QgcXVpZXQsIGV0YyAqLworICAgICAgcHJpbnRmKCI/JXNcbiIsdGV4dCk7CQkvKiBQcmludCBlcnJvciBtZXNzYWdlICovCisgICAgc2xyZXN0b3IoKTsJCQkJLyogUmVzdG9yZSBMSU5FL0hPU1QgdG8ga25vd24gc3RhdGUgKi8KKyAgICByZXR1cm4obXNnID8gLTkgOiAoc3VjY2VzcyA9IDApKTsJLyogUmV0dXJuIGFwcHJvcHJpYXRlIGNvZGUgKi8KK30KKworI2lmZGVmIE5FVENPTk4KKy8qIGMgeCBfIG4gZSB0ICAtLSAgTWFrZSBhIG5ldHdvcmsgY29ubmVjdGlvbiAqLworCisvKgorICBDYWxsIHdpdGg6CisgICAgbmV0ICAgICAgPSBuZXR3b3JrIHR5cGUKKyAgICBwcm90b2NvbCA9IHByb3RvY29sIHR5cGUKKyAgICBob3N0ICAgICA9IHN0cmluZyBwb2ludGVyIHRvIGhvc3QgbmFtZS4KKyAgICBzdmMgICAgICA9IHN0cmluZyBwb2ludGVyIHRvIHNlcnZpY2Ugb3IgcG9ydCBvbiBob3N0LgorICAgIHVzZXJuYW1lID0gdXNlcm5hbWUgZm9yIGNvbm5lY3Rpb24KKyAgICBwYXNzd29yZCA9IHBhc3N3b3JkIGZvciBjb25uZWN0aW9uCisgICAgY29tbWFuZCAgPSBjb21tYW5kIHRvIGV4ZWN1dGUKKyAgICBwYXJhbTEgICA9IFRlbG5ldDogQXV0aGVudGljYXRpb24gdHlwZQorICAgICAgICAgICAgICAgU1NIOiAgICBWZXJzaW9uCisgICAgcGFyYW0yICAgPSBUZWxuZXQ6IEVuY3J5cHRpb24gdHlwZQorICAgICAgICAgICAgICAgU1NIOiAgICBDb21tYW5kIGFzIFN1YnN5c3RlbQorICAgIHBhcmFtMyAgID0gVGVsbmV0OiAxIHRvIHdhaXQgZm9yIG5lZ290aWF0aW9ucywgMCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgIFNTSDogICAgWDExIEZvcndhcmRpbmcKKyAgICBjeCAgICAgICA9IDEgdG8gYXV0b21hdGljYWxseSBlbnRlciBDb25uZWN0IG1vZGUsIDAgb3RoZXJ3aXNlLgorICAgIHN4ICAgICAgID0gMSB0byBhdXRvbWF0aWNhbGx5IGVudGVyIFNlcnZlciBtb2RlLCAwIG90aGVyd2lzZS4KKyAgICBmbGFnICAgICA9IGlmIG5vIGhvc3QgbmFtZSBnaXZlbiwgMSA9IGNsb3NlIGN1cnJlbnQgY29ubmVjdGlvbiwgMCA9IHJlc3VtZQorICAgIGd1aSAgICAgID0gMSBpZiBjYWxsZWQgZnJvbSBHVUkgZGlhbG9nLCAwIG90aGVyd2lzZS4KKyAgUmV0dXJuczoKKyAgICAxIG9uIHN1Y2Nlc3MKKyAgICAwIG9uIGZhaWx1cmUgYW5kIG5vIG1lc3NhZ2UgcHJpbnRlZCwgc2xtc2cgc2V0IHRvIGZhaWx1cmUgbWVzc2FnZS4KKyAgIC05IG9uIGZhaWx1cmUgYW5kIG1lc3NhZ2UgcHJpbnRlZCwgZGl0dG8uCisqLworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2N4X25ldCggaW50IG5ldCwgaW50IHByb3RvY29sLCBjaGFyICogeGhvc3QsIGNoYXIgKiBzdmMsIAorICAgICAgICBjaGFyICogdXNlcm5hbWUsIGNoYXIgKiBwYXNzd29yZCwgY2hhciAqIGNvbW1hbmQsCisgICAgICAgIGludCBwYXJhbTEsIGludCBwYXJhbTIsIGludCBwYXJhbTMsIGludCBjeCwgaW50IHN4LCBpbnQgZmxhZywgaW50IGd1aSkKKyNlbHNlIC8qIENLX0FOU0lDICovCitjeF9uZXQobmV0LCBwcm90b2NvbCwgeGhvc3QsIHN2YywKKyAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQsIGNvbW1hbmQsCisgICAgICAgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgY3gsIHN4LCBmbGFnLCBndWkpCisgICAgY2hhciAqIHhob3N0LCAqIHN2YywgKiB1c2VybmFtZSwgKnBhc3N3b3JkLCAqY29tbWFuZDsgCisgICAgaW50IG5ldCwgcHJvdG9jb2wsIGN4LCBzeCwgZmxhZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgZ3VpOyAKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogY3hfbmV0ICovIHsKKworICAgIGludCBpLCBuLCB4LCBtc2c7CisgICAgaW50IF9sb2NhbCA9IC0xOworCisgICAgZXh0ZXJuIGNoYXIgcHdidWZbXSwgKiBnX3Bzd2Q7CisgICAgZXh0ZXJuIGludCBwd2ZsZywgcHdjcnlwdCwgZ19wZmxnLCBnX3BjcHQsIG5vbG9jYWw7CisKKyAgICBjaGFyIHNydmJ1ZltTUlZCVUZTSVorMV07CQkvKiBTZXJ2aWNlICovCisgICAgY2hhciBob3N0YnVmW0hPU1ROQU1MRU5dOwkJLyogSG9zdCBidWZmZXIgdG8gbWFuaXB1bGF0ZSAqLworICAgIGNoYXIgaG9zdG5hbWVbSE9TVE5BTUxFTl07CQkvKiBDb3B5IG9mIGhvc3QgcGFyYW1ldGVyICovCisgICAgY2hhciAqIGhvc3QgPSBob3N0YnVmOwkJLyogUG9pbnRlciB0byBjb3B5IG9mIGhvc3QgcGFyYW0gKi8KKworICAgIGlmICgheGhvc3QpIHhob3N0ID0gIiI7CQkvKiBXYXRjaCBvdXQgZm9yIG51bGwgcG9pbnRlcnMgKi8KKyAgICBpZiAoIXN2Yykgc3ZjID0gIiI7CisgICAgY2tzdHJuY3B5KGhvc3QseGhvc3QsSE9TVE5BTUxFTik7CS8qIEF2b2lkIGJ1ZmZlciBjb25mdXNpb24gKi8KKworICAgIGRlYnVnKEYxMTAsImN4X25ldCBob3N0Iixob3N0LDApOworICAgIGRlYnVnKEYxMTEsImN4X25ldCBzZXJ2aWNlIixzdmMsU1JWQlVGU0laKTsKKyAgICBkZWJ1ZyhGMTAxLCJjeF9uZXQgbmV0d29yayB0eXBlIiwiIixuZXQpOworCisgICAgbXNnID0gKGd1aSA9PSAwKSAmJiBtc2dmbGc7CQkvKiBXaGV0aGVyIHRvIHByaW50IG1lc3NhZ2VzICovCisKKyNpZm5kZWYgTk9ESUFMCisgICAgZGVidWcoRjEwMSwiY3hfbmV0IG5uZXRkaXIiLCIiLG5uZXRkaXIpOworICAgIHggPSAwOwkJCQkvKiBMb29rIHVwIGluIG5ldHdvcmsgZGlyZWN0b3J5ICovCisgICAgaWYgKCpob3N0ID09ICc9JykgewkJCS8qIElmIG51bWJlciBzdGFydHMgd2l0aCA9IHNpZ24gKi8KKwlob3N0Kys7CQkJCS8qIHN0cmlwIGl0ICovCisJd2hpbGUgKCpob3N0ID09IFNQKSBob3N0Kys7CS8qIGFuZCBhbnkgbGVhZGluZyBzcGFjZXMgKi8KKwlkZWJ1ZyhGMTEwLCJjeF9uZXQgaG9zdCAyIixob3N0LDApOworCW5oY291bnQgPSAwOworICAgIH0gZWxzZSBpZiAoKmhvc3QpIHsJCQkvKiBXZSB3YW50IHRvIGxvb2sgaXQgdXAuICovCisJaWYgKG5uZXRkaXIgPiAwKQkJLyogSWYgdGhlcmUgaXMgYSBkaXJlY3RvcnkuLi4gKi8KKwkgIHggPSBsdW5ldChob3N0KTsJCS8qIChzZXRzIG5oY291bnQpICovCisJZWxzZQkJCQkvKiBvdGhlcndpc2UgKi8KKwkgIG5oY291bnQgPSAwOwkJCS8qIHdlIGRpZG4ndCBmaW5kIGFueSB0aGVyZSAqLworCWlmICh4IDwgMCkJCQkvKiBJbnRlcm5hbCBlcnJvcj8gKi8KKwkgIHJldHVybihjeF9mYWlsKG1zZywiTmV0d29yayBkaXJlY3RvcnkgbG9va3VwIGVycm9yIikpOworCWRlYnVnKEYxMTEsImN4X25ldCBsdW5ldCBuaGNvdW50Iixob3N0LG5oY291bnQpOworICAgIH0KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworICAgIC8qIE5ldyBjb25uZWN0aW9uIHdhbnRlZC4gIE1ha2UgYSBjb3B5IG9mIHRoZSBob3N0IG5hbWUvYWRkcmVzcy4uLiAqLworCisgICAgaWYgKGNsc2tjb25ueCgxKSA8IDApCQkvKiBDbG9zZSBjdXJyZW50IEtlcm1pdCBjb25uZWN0aW9uICovCisgICAgICByZXR1cm4oY3hfZmFpbChtc2csIkVycm9yIGNsb3NpbmcgcHJldmlvdXMgY29ubmVjdGlvbiIpKTsKKworICAgIGlmICgqaG9zdCkgewkJCS8qIFRoZXkgZ2F2ZSBhIGhvc3RuYW1lICovCisJX2xvY2FsID0gMTsJCQkvKiBOZXR3b3JrIGNvbm5lY3Rpb24gYWx3YXlzIGxvY2FsICovCisJaWYgKG1kbXNhdiA8IDApCisJICBtZG1zYXYgPSBtZG10eXA7CQkvKiBSZW1lbWJlciBvbGQgbW9kZW0gdHlwZSAqLworCW1kbXR5cCA9IC1uZXQ7CQkJLyogU3BlY2lhbCBjb2RlIGZvciBuZXR3b3JrICovCisgICAgfSBlbHNlIHsJCQkJLyogVGhleSBqdXN0IHNhaWQgInNldCBob3N0IiAqLworCWhvc3QgPSBkZnR0eTsJCQkvKiBTbyBnbyBiYWNrIHRvIG5vcm1hbCAqLworCV9sb2NhbCA9IGRmbG9jOwkJCS8qIGRlZmF1bHQgdHR5LCBsb2NhdGlvbiwgKi8KKwlpZiAoZmxhZykgewkJCS8qIENsb3NlIGN1cnJlbnQgY29ubmVjdGlvbiAqLworCSAgICBzZXRmbG93KCk7CQkJLyogTWF5YmUgY2hhbmdlIGZsb3cgY29udHJvbCAqLworCSAgICBoYXZlbGluZSA9IDE7CQkvKiAoKiBpcyB0aGlzIHJpZ2h0PyAqKSAqLworCSAgICBkb2xvZ2VuZCgpOworI2lmbmRlZiBOT0RJQUwKKwkgICAgZGlhbHN0YSA9IERJQV9VTks7CisjZW5kaWYgLyogTk9ESUFMICovCisjaWZkZWYgTE9DVVMKKwkgICAgaWYgKGF1dG9sb2N1cykgeworCQlzZXRsb2N1cygxLDEpOworCSAgICB9CisjZW5kaWYgLyogTE9DVVMgKi8KKyAgICAgICAgICAgIC8qIFhYWCAtIElzIHRoaXMgcmlnaHQ/ICovCisJICAgIC8qIFNob3VsZCB3ZSBiZSByZXR1cm5pbmcgd2l0aG91dCBkb2luZyBhbnl0aGluZyA/ICovCisJICAgIC8qIFllcyBpdCdzIHJpZ2h0IC0tIHdlIGNsb3NlZCB0aGUgb2xkIGNvbm5lY3Rpb24ganVzdCBhYm92ZS4gKi8KKwkgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsgICAgICAgIAorCX0KKyAgICB9CisgICAgc3VjY2VzcyA9IDA7CisgICAgaWYgKGhvc3QgIT0gbGluZSkgICAgICAgICAgICAgICAgICAgLyogbGluZVtdIGlzIGEgZ2xvYmFsICovCisgICAgICBja3N0cm5jcHkobGluZSxob3N0LExJTkJVRlNJWik7CisgICAgY2tzdHJuY3B5KGhvc3RuYW1lLGhvc3QsSE9TVE5BTUxFTik7CisgICAgY2tzdHJuY3B5KHNydmJ1ZixzdmMsU1JWQlVGU0laKzEpOworCisjaWZuZGVmIE5PRElBTAorICAgIGlmICgobmhjb3VudCA+IDEpICYmIG1zZykgeworCWludCBrOworCXByaW50ZigiJWQgZW50ciVzIGZvdW5kIGZvciBcIiVzXCIlc1xuIiwKKwkgICAgICAgbmhjb3VudCwKKwkgICAgICAgKG5oY291bnQgPT0gMSkgPyAieSIgOiAiaWVzIiwKKwkgICAgICAgcywKKwkgICAgICAgKG5oY291bnQgPiAwKSA/ICI6IiA6ICIuIgorCSAgICAgICApOworCWZvciAoaSA9IDA7IGkgPCBuaGNvdW50OyBpKyspIHsKKwkJcHJpbnRmKCIlM2QuICUtMTJzID0+ICUtOXMgJXMiLAorCQkgICAgICAgaSsxLG5fbmFtZSxuaF9wMltpXSxuaF9wW2ldKTsKKwkgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeyAvKiBBbHNvIGxpc3QgbmV0LXNwZWNpZmljIGl0ZW1zICovCisJCWlmIChuaF9weFtrXVtpXSkgICAgICAvKiBmcmVlIGZvcm1hdC4uLiAqLworCQkgIHByaW50ZigiICVzIixuaF9weFtrXVtpXSk7CisJCWVsc2UKKwkJICBicmVhazsKKwkgICAgfQorCSAgICBwcmludGYoIlxuIik7CisJfQorICAgIH0KKyAgICBpZiAobmhjb3VudCA9PSAwKQorICAgICAgbiA9IDE7CisgICAgZWxzZQorICAgICAgbiA9IG5oY291bnQ7CisjZWxzZQorICAgIG4gPSAxOworICAgIG5oY291bnQgPSAwOworI2VuZGlmIC8qIE5PRElBTCAqLworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewkJLyogTG9vcCBmb3IgZWFjaCBlbnRyeSBmb3VuZCAqLworCWRlYnVnKEYxMDEsImN4X25ldCBsb29wIGkiLCIiLGkpOworI2lmbmRlZiBOT0RJQUwKKwlpZiAobmhjb3VudCA+IDApIHsJCS8qIElmIHdlIGZvdW5kIGF0IGxlYXN0IG9uZSBlbnRyeS4uLiAqLworCSAgICBja3N0cm5jcHkobGluZSxuaF9wW2ldLExJTkJVRlNJWik7IC8qIENvcHkgY3VycmVudCBlbnRyeSAqLworCSAgICBpZiAobG9va3VwKG5ldGNtZCxuaF9wMltpXSxubmV0cywmeCkgPiAtMSkgeyAvKiBOZXQgdHlwZSAqLworCQlpbnQgeHg7CisJCXh4ID0gbmV0Y21kW3hdLmt3dmFsOworCQkvKiBVc2VyIHNwZWNpZmllZCBTU0ggc28gZG9uJ3QgbGV0IG5ldCBkaXJlY3Rvcnkgb3ZlcnJpZGUgKi8KKwkJaWYgKG5ldCAhPSBORVRfU1NIIHx8IHh4ICE9IE5FVF9UQ1BCKSB7CisJCSAgICBuZXQgPSB4eDsKKwkJICAgIG1kbXR5cCAgPSAwIC0gbmV0OworCQl9CisJICAgIH0gZWxzZSB7CisJCW1ha2VzdHIoJnNsbXNnLCJOZXR3b3JrIHR5cGUgbm90IHN1cHBvcnRlZCIpOworCQlpZiAobXNnKQorCQkgIHByaW50ZigiRXJyb3IgLSBuZXR3b3JrIHR5cGUgXCIlc1wiIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkgbmhfcDJbaV0KKwkJICAgICAgICAgKTsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgc3dpdGNoIChuZXQpIHsJCS8qIE5ldC1zcGVjaWZpYyBkaXJlY3RvcnkgdGhpbmdzICovCisjaWZkZWYgU1NIQlVJTFRJTgorCSAgICAgIGNhc2UgTkVUX1NTSDoJCS8qIFNTSCAqLworICAgICAgICAgICAgICAgIC8qIEFueSBTU0ggc3BlY2lmaWMgbmV0d29yayBkaXJlY3Rvcnkgc3R1ZmY/ICovCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogTkVUX1NTSCAqLworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKworCSAgICAgIGNhc2UgTkVUX1RDUEI6IHsJCS8qIFRDUC9JUCBURUxORVQsUkxPR0lOLC4uLiAqLworI2lmZGVmIFRDUFNPQ0tFVAorCQkgIGNoYXIgKnE7CisJCSAgaW50IGZsYWcgPSAwOworCisJCSAgLyogRXh0cmFjdCAiOnNlcnZpY2UiLCBpZiBhbnksIGZyb20gaG9zdCBzdHJpbmcgKi8KKwkJICBkZWJ1ZyhGMTEwLCJjeF9uZXQgc2VydmljZSAxIixsaW5lLDApOworCQkgIGZvciAocSA9IGxpbmU7ICgqcSAhPSAnXDAnKSAmJiAoKnEgIT0gJzonKTsgcSsrKQorCQkgICAgOworCQkgIGlmICgqcSA9PSAnOicpIHsgKnErKyA9IE5VTDsgZmxhZyA9IDE7IH0KKwkJICBkZWJ1ZyhGMTExLCJjeF9uZXQgc2VydmljZSAyIixsaW5lLGZsYWcpOworCisJCSAgLyogR2V0IHNlcnZpY2UsIGlmIGFueSwgZnJvbSBkaXJlY3RvcnkgZW50cnkgKi8KKworCQkgIGlmICghKnNydmJ1ZikgeworCQkgICAgICBpZiAobmhfcHhbMF1baV0pIHsKKwkJCSAgY2tzdHJuY3B5KHNydmJ1ZixuaF9weFswXVtpXSxTUlZCVUZTSVopOworCQkJICBkZWJ1ZyhGMTEwLCJjeF9uZXQgc2VydmljZSAzIixzcnZidWYsMCk7CisJCSAgICAgIH0KKwkJICAgICAgaWYgKGZsYWcpIHsKKwkJCSAgY2tzdHJuY3B5KHNydmJ1ZixxLFNSVkJVRlNJWik7CisJCQkgIGRlYnVnKEYxMTAsImN4X25ldCBzZXJ2aWNlIDQiLHNydmJ1ZiwwKTsKKwkJICAgICAgfQorCQkgIH0KKwkJICBja3N0cm5jcHkoaG9zdG5hbWUsbGluZSxIT1NUTkFNTEVOKTsKKworCQkgIC8qIElmIHdlIGhhdmUgYSBzZXJ2aWNlLCBhcHBlbmQgdG8gaG9zdCBuYW1lL2FkZHJlc3MgKi8KKwkJICBpZiAoKnNydmJ1ZikgeworCQkgICAgICBja3N0cm5jYXQobGluZSwgIjoiLCBMSU5CVUZTSVopOworCQkgICAgICBja3N0cm5jYXQobGluZSwgc3J2YnVmLCBMSU5CVUZTSVopOworCQkgICAgICBkZWJ1ZyhGMTEwLCJjeF9uZXQgc2VydmljZSA1IixsaW5lLDApOworCQkgIH0KKyNpZmRlZiBSTE9HQ09ERQorCQkgIC8qIElmIG5vIHNlcnZpY2UgZ2l2ZW4gYnV0IGNvbW1hbmQgd2FzIFJMT0dJTiAqLworCQkgIGVsc2UgaWYgKHR0bnByb3RvID09IE5QX1JMT0dJTikgeyAvKiBhZGQgdGhpcy4uLiAqLworCQkgICAgICBja3N0cm5jYXQobGluZSwgIjpsb2dpbiIsTElOQlVGU0laKTsKKwkJICAgICAgZGVidWcoRjExMCwiY3hfbmV0IHNlcnZpY2UgNiIsbGluZSwwKTsKKwkJICB9CisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyNpZmRlZiBDS19LRVJCRVJPUworCQkgIGVsc2UgaWYgKHR0bnByb3RvID09IE5QX0s0TE9HSU4gfHwKKwkJCSAgIHR0bnByb3RvID09IE5QX0s1TE9HSU4pIHsgLyogYWRkIHRoaXMuLi4gKi8KKwkJICAgICAgY2tzdHJuY2F0KGxpbmUsICI6a2xvZ2luIixMSU5CVUZTSVopOworCQkgICAgICBkZWJ1ZyhGMTEwLCJjeF9uZXQgc2VydmljZSA3IixsaW5lLDApOworCQkgIH0KKwkJICBlbHNlIGlmICh0dG5wcm90byA9PSBOUF9FSzRMT0dJTiB8fAorCQkJICAgdHRucHJvdG8gPT0gTlBfRUs1TE9HSU4pIHsgLyogYWRkIHRoaXMuLi4gKi8KKwkJICAgICAgY2tzdHJuY2F0KGxpbmUsICI6ZWtsb2dpbiIsTElOQlVGU0laKTsKKwkJICAgICAgZGVidWcoRjExMCwiY3hfbmV0IHNlcnZpY2UgOCIsbGluZSwwKTsKKwkJICB9CisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2VuZGlmIC8qIFJMT0dDT0RFICovCisJCSAgZWxzZSB7CQkvKiBPdGhlcndpc2UsIGFkZCAiOnRlbG5ldCIuICovCisJCSAgICAgIGNrc3RybmNhdChsaW5lLCAiOnRlbG5ldCIsIExJTkJVRlNJWik7CisJCSAgICAgIGRlYnVnKEYxMTAsImN4X25ldCBzZXJ2aWNlIDkiLGxpbmUsMCk7CisJCSAgfQorCQkgIGlmICh1c2VybmFtZSkgewkvKiBUaGlzIGlzIGEgcGFyYW1ldGVyLi4uICovCisJCSAgICAgIGNrc3RybmNweSh1aWRidWYsdXNlcm5hbWUsVUlEQlVGTEVOKTsKKwkJICAgICAgdWlkZmxhZyA9IDE7CisJCSAgfQorCQkgIC8qIEZpZnRoIGZpZWxkLCBpZiBhbnksIGlzIHVzZXIgSUQgKGZvciBybG9naW4pICovCisKKwkJICBpZiAobmhfcHhbMV1baV0gJiYgIXVpZGZsYWcpCisJCSAgICBja3N0cm5jcHkodWlkYnVmLHVzZXJuYW1lLFVJREJVRkxFTik7CisjaWZkZWYgUkxPR0NPREUKKwkJICBpZiAoSVNfUkxPR0lOKCkgJiYgIXVpZGJ1ZlswXSkKKwkJICAgIHJldHVybihjeF9mYWlsKG1zZywiVXNlcm5hbWUgcmVxdWlyZWQiKSk7CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKwkJICBicmVhazsKKwkgICAgICB9CisJICAgICAgY2FzZSBORVRfUElQRToJCS8qIFBpcGUgKi8KKyNpZmRlZiBOUElQRQorCQlpZiAoIXBpcGVuYW1lWzBdKSB7IC8qIFVzZXIgZGlkbid0IGdpdmUgYSBwaXBlbmFtZSAqLworCQkgICAgaWYgKG5oX3B4WzBdW2ldKSB7IC8qIEJ1dCBkaXJlY3RvcnkgZW50cnkgaGFzIG9uZSAqLworCQkJaWYgKHN0cmNtcChwaXBlbmFtZSwiXFxwaXBlXFwiKSkgeworCQkJICAgIGNrc3RybmNweShwaXBlbmFtZSwiXFxwaXBlXFwiLExJTkJVRlNJWik7CisJCQkgICAgY2tzdHJuY2F0KHNydmJ1ZixuaF9weFswXVtpXSxQSVBFTkFNTC02KTsKKwkJCX0gZWxzZSB7CisJCQkgICAgY2tzdHJuY3B5KHBpcGVuYW1lLG5oX3B4WzBdW2ldLFBJUEVOQU1MKTsKKwkJCX0KKwkJCWRlYnVnKEYxMTAsImN4X25ldCBwaXBlbmVtZSIscGlwZW5hbWUsMCk7CisJCSAgICB9CisJCX0KKyNlbmRpZiAvKiBOUElQRSAqLworCQlicmVhazsKKworCSAgICAgIGNhc2UgTkVUX1NMQVQ6ICAgICAgICAgICAgLyogTEFUIC8gQ1RFUk0gKi8KKyNpZmRlZiBTVVBFUkxBVAorCQlpZiAoIXNsYXRfcHdkWzBdKSB7IC8qIFVzZXIgZGlkbid0IGdpdmUgYSBwYXNzd29yZCAqLworCQkgICAgaWYgKG5oX3B4WzBdW2ldKSB7IC8qIEJ1dCBkaXJlY3RvcnkgZW50cnkgaGFzIG9uZSAqLworCQkJY2tzdHJuY3B5KHNsYXRfcHdkLG5oX3B4WzBdW2ldLDE4KTsKKwkJCWRlYnVnKEYxMTAsImN4X25ldCBTdXBlckxBVCBwYXNzd29yZCIsc2xhdF9wd2QsMCk7CisJCSAgICB9CisJCX0KKyNlbmRpZiAvKiBTVVBFUkxBVCAqLworCQlicmVhazsKKworCSAgICAgIGNhc2UgTkVUX1NYMjU6ICAgICAgICAvKiBYLjI1IGtleXdvcmQgcGFyYW1ldGVycyAqLworCSAgICAgIGNhc2UgTkVUX0lYMjU6CisJICAgICAgY2FzZSBORVRfVlgyNTogeworI2lmZGVmIEFOWVgyNQorCQkgIGludCBrOyAgICAgICAgICAgIC8qIEN5Y2xlIHRocm91Z2ggdGhlIGZvdXIgZmllbGRzICovCisJCSAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworCQkgICAgICBpZiAoIW5oX3B4W2tdW2ldKSAvKiBCYWlsIG91dCBpZiBub25lIGxlZnQgKi8KKwkJCWJyZWFrOworCQkgICAgICBpZiAoIWNrc3RyY21wKG5oX3B4W2tdW2ldLCJjdWc9Iiw0LDApKSB7CisJCQkgIGNsb3NnciA9IGF0b2kobmhfcHhba11baV0rNCk7CisJCQkgIGRlYnVnKEYxMDEsIlgyNSBDVUciLCIiLGNsb3Nncik7CisJCSAgICAgIH0gZWxzZSBpZiAoIWNrc3RyY21wKG5oX3B4W2tdW2ldLCJjdWQ9Iiw0LDApKSB7CisJCQkgIGN1ZGF0YSA9IDE7CisJCQkgIGNrc3RybmNweSh1ZGF0YSxuaF9weFtrXVtpXSs0LE1BWENVREFUQSk7CisJCQkgIGRlYnVnKEYxMTAsIlgyNSBDVUQiLGN1ZGF0YSwwKTsKKwkJICAgICAgfSBlbHNlIGlmICghY2tzdHJjbXAobmhfcHhba11baV0sInJldj0iLDQsMCkpIHsKKwkJCSAgcmV2Y2FsbCA9ICFja3N0cmNtcChuaF9weFtrXVtpXSs0LCI9b24iLDMsMCk7CisJCQkgIGRlYnVnKEYxMDEsIlgyNSBSRVYiLCIiLHJldmNhbGwpOworI2lmbmRlZiBJQk1YMjUKKwkJICAgICAgfSBlbHNlIGlmICghY2tzdHJjbXAobmhfcHhba11baV0sInBhZD0iLDQsMCkpIHsKKwkJCSAgaW50IHgzcGFyLCB4M3ZhbDsKKwkJCSAgY2hhciAqczEsICpzMjsKKwkJCSAgczEgPSBzMiA9IG5oX3B4W2tdW2ldKzQ7IC8qIFBBRCBwYXJhbWV0ZXJzICovCisJCQkgIHdoaWxlICgqczIpIHsgICAgICAgICAgICAvKiBQaWNrIHRoZW0gYXBhcnQgKi8KKwkJCSAgICAgIGlmICgqczIgPT0gJzonKSB7CisJCQkJICAqczIgPSBOVUw7CisJCQkJICB4M3BhciA9IGF0b2koczEpOworCQkJCSAgczEgPSArK3MyOworCQkJCSAgY29udGludWU7CisJCQkgICAgICB9IGVsc2UgaWYgKCpzMiA9PSAnLCcpIHsKKwkJCQkgICpzMiA9IE5VTDsKKwkJCQkgIHgzdmFsID0gYXRvaShzMSk7CisJCQkJICBzMSA9ICsrczI7CisJCQkJICBkZWJ1ZyhGMTExLCJYMjUgUEFEIix4M3Bhcix4M3ZhbCk7CisJCQkJICBpZiAoeDNwYXIgPiAtMSAmJgorCQkJCSAgICAgIHgzcGFyIDw9IE1BWFBBRFBBUk1TKQorCQkJCSAgICBwYWRwYXJtc1t4M3Bhcl0gPSB4M3ZhbDsKKwkJCQkgIGNvbnRpbnVlOworCQkJICAgICAgfSBlbHNlCisJCQkJczIrKzsKKwkJCSAgfQorI2VuZGlmIC8qIElCTVgyNSAqLworCQkgICAgICB9CisJCSAgfQorI2VuZGlmIC8qIEFOWVgyNSAqLworCQkgIGJyZWFrOworCSAgICAgIH0KKwkgICAgICBkZWZhdWx0OgkJCS8qIE5vdGhpbmcgc3BlY2lhbCBmb3Igb3RoZXIgbmV0cyAqLworCQlicmVhazsKKwkgICAgfQorCX0gZWxzZQorI2VuZGlmIC8qIE5PRElBTCAqLworCXsJCQkJLyogTm8gZGlyZWN0b3J5IGVudHJpZXMgZm91bmQuICovCisJICAgIGNrc3RybmNweShsaW5lLGhvc3RuYW1lLExJTkJVRlNJWik7IC8qIFB1dCB0aGlzIGJhY2suLi4gKi8KKwkgICAgLyogSWYgdGhlIHVzZXIgZ2F2ZSBhIFRDUCBzZXJ2aWNlICovCisJICAgIGlmIChuZXQgPT0gTkVUX1RDUEIgfHwgbmV0ID09IE5FVF9TU0gpCisJICAgICAgaWYgKCpzcnZidWYpIHsJCS8qIEFwcGVuZCBpdCB0byBob3N0IG5hbWUvYWRkcmVzcyAqLworCQkgIGNrc3RybmNhdChsaW5lLCAiOiIsIExJTkJVRlNJWik7CisJCSAgY2tzdHJuY2F0KGxpbmUsIHNydmJ1ZixMSU5CVUZTSVopOworCSAgICAgIH0KKwl9CisJLyoKKwkgICBHZXQgaGVyZSB3aXRoIGhvc3QgbmFtZS9hZGRyZXNzIGFuZCBhbGwgbmV0LXNwZWNpZmljCisJICAgcGFyYW1ldGVycyBzZXQsIHJlYWR5IHRvIG9wZW4gdGhlIGNvbm5lY3Rpb24uCisJKi8KKwltZG10eXAgPSAtbmV0OwkJCS8qIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkb25lICovCisJCQkJCS8qIGFscmVhZHkgYnV0IGp1c3QgaW4gY2FzZSAuLi4gKi8KKworCWRlYnVnKEYxMTAsImN4X25ldCBuZXQgbGluZVtdIGJlZm9yZSB0dG9wZW4iLGxpbmUsMCk7CisJZGVidWcoRjEwMSwiY3hfbmV0IG5ldCBtZG10eXAgYmVmb3JlIHR0b3BlbiIsIiIsbWRtdHlwKTsKKwlkZWJ1ZyhGMTAxLCJjeF9uZXQgbmV0IHR0bnByb3RvIiwiIix0dG5wcm90byk7CisKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICAgIGlmIChuZXQgPT0gTkVUX1NTSCkgeworICAgICAgICAgICAgbWFrZXN0cigmc3NoX2hzdCxob3N0bmFtZSk7ICAgICAgICAvKiBTdGFzaCBldmVyeXRoaW5nICovCisgICAgICAgICAgICBpZiAodXNlcm5hbWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNsX3VpZF9zYXZlZCkgeworICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkoc2xfdWlkYnVmLHVpZGJ1ZixVSURCVUZMRU4pOworICAgICAgICAgICAgICAgICAgICBzbF91aWRfc2F2ZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBja3N0cm5jcHkodWlkYnVmLHVzZXJuYW1lLFVJREJVRkxFTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3J2YnVmWzBdKSB7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NoX3BydCxzcnZidWYpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NoX3BydCxOVUxMKTsKKworICAgICAgICAgICAgaWYgKGNvbW1hbmQpIHsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfY21kLGJyc3RyaXAoY29tbWFuZCkpOworICAgICAgICAgICAgICAgIHNzaF9jYXMgPSBwYXJhbTI7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfY21kLE5VTEwpOworCisgICAgICAgICAgICBpZiAocGFyYW0xID4gLTEpIHsKKyNpZm5kZWYgU1NIVEVTVAorICAgICAgICAgICAgICAgIGlmICghc2xfc3NoX3Zlcl9zYXZlZCkgeworICAgICAgICAgICAgICAgICAgICBzbF9zc2hfdmVyID0gc3NoX3ZlcjsKKyAgICAgICAgICAgICAgICAgICAgc2xfc3NoX3Zlcl9zYXZlZCA9IDE7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIFNTSFRFU1QgKi8KKyAgICAgICAgICAgICAgICBzc2hfdmVyID0gcGFyYW0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtMyA+IC0xKSB7CisjaWZuZGVmIFNTSFRFU1QKKyAgICAgICAgICAgICAgICBpZiAoIXNsX3NzaF94Zndfc2F2ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2xfc3NoX3hmdyA9IHNzaF94Znc7CisgICAgICAgICAgICAgICAgICAgIHNsX3NzaF94Zndfc2F2ZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBTU0hURVNUICovCisgICAgICAgICAgICAgICAgc3NoX3hmdyA9IHBhcmFtMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRfU1NIICovCisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworI2lmZGVmIFRDUFNPQ0tFVAorCSAgaWYgKG5ldCA9PSBORVRfVENQQikgeworICAgICAgICAgICAgc3dpdGNoIChwcm90b2NvbCkgeworI2lmZGVmIENLX1NTTAorCSAgICAgIGNhc2UgTlBfU1NMOgorICAgICAgICAgICAgICAgIHR0bnByb3RvID0gcHJvdG9jb2w7CisgICAgICAgICAgICAgICAgc3NsX29ubHlfZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgdGxzX29ubHlfZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkgICAgICBjYXNlIE5QX1RMUzoKKyAgICAgICAgICAgICAgICB0dG5wcm90byA9IHByb3RvY29sOworICAgICAgICAgICAgICAgIHNzbF9vbmx5X2ZsYWcgPSAwOworICAgICAgICAgICAgICAgIHRsc19vbmx5X2ZsYWcgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJICAgICAgY2FzZSBOUF9TU0xfVEVMTkVUOgorICAgICAgICAgICAgICAgIHR0bnByb3RvID0gTlBfVEVMTkVUOworICAgICAgICAgICAgICAgIHNzbF9vbmx5X2ZsYWcgPSAxOworICAgICAgICAgICAgICAgIHRsc19vbmx5X2ZsYWcgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJICAgICAgY2FzZSBOUF9UTFNfVEVMTkVUOgorICAgICAgICAgICAgICAgIHR0bnByb3RvID0gTlBfVEVMTkVUOworICAgICAgICAgICAgICAgIHNzbF9vbmx5X2ZsYWcgPSAwOworICAgICAgICAgICAgICAgIHRsc19vbmx5X2ZsYWcgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX1NTTCAqLworCSAgICAgIGNhc2UgTlBfTk9ORToKKwkgICAgICBjYXNlIE5QX1RDUFJBVzoKKwkgICAgICBjYXNlIE5QX1JMT0dJTjoKKwkgICAgICBjYXNlIE5QX0s0TE9HSU46CisJICAgICAgY2FzZSBOUF9LNUxPR0lOOgorCSAgICAgIGNhc2UgTlBfRUs0TE9HSU46CisJICAgICAgY2FzZSBOUF9FSzVMT0dJTjoKKwkgICAgICBjYXNlIE5QX1RFTE5FVDoKKwkgICAgICBjYXNlIE5QX0tFUk1JVDoKKwkgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHR0bnByb3RvID0gcHJvdG9jb2w7CisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICAgICAgc3NsX29ubHlfZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgdGxzX29ubHlfZmxhZyA9IDA7CisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICAgICAgICAgIGlmICgodHRucHJvdG8gPT0gTlBfVEVMTkVUIHx8IHR0bnByb3RvID09IE5QX0tFUk1JVCkgJiYKKwkJcGFyYW0xID4gLTEpIHsKKwkgICAgaWYgKCFzbF9hdXRoX3NhdmVkKSB7CisJCWludCB4OworCQlmb3IgKHggPSAwOyB4IDwgQVVUSFRZUExTVFNaOyB4KyspCisJCSAgc2xfYXV0aF90eXBlX3VzZXJbeF0gPSBhdXRoX3R5cGVfdXNlclt4XTsKKwkJc2xfYXV0aF9zYXZlZCA9IDE7CisJICAgIH0KKwkgICAgaWYgKCFzbF90b3B0X2Ffc19zYXZlZCkgeworCQlzbF90b3B0X2Ffc3UgPSBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9BVVRIRU5USUNBVElPTik7CisJCXNsX3RvcHRfYV9zX3NhdmVkID0gMTsKKwkgICAgfQorCSAgICBpZiAoIXNsX3RvcHRfYV9jX3NhdmVkKSB7CisJCXNsX3RvcHRfYV9jbSA9IFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9BVVRIRU5USUNBVElPTik7CisJCXNsX3RvcHRfYV9jX3NhdmVkID0gMTsKKwkgICAgfQorCSAgICBzd2l0Y2ggKHBhcmFtMSkgeworCSAgICAgIGNhc2UgQVVUSFRZUEVfQVVUTzoKKwkJYXV0aF90eXBlX3VzZXJbMF0gPSBBVVRIVFlQRV9BVVRPOworCQlURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9BVVRIRU5USUNBVElPTikgPSBUTl9OR19SUTsKKwkJVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9IFROX05HX1JROworCQlicmVhazsKKwkgICAgICBjYXNlIEFVVEhUWVBFX05VTEw6CisJCWF1dGhfdHlwZV91c2VyWzBdID0gQVVUSFRZUEVfTlVMTDsKKwkJVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID0gVE5fTkdfUkY7CisJCVRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9BVVRIRU5USUNBVElPTikgPSBUTl9OR19SRjsKKwkJYnJlYWs7CisjaWZkZWYgQ0tfU1JQCisJICAgICAgY2FzZSBBVVRIVFlQRV9TUlA6CisJCWF1dGhfdHlwZV91c2VyWzBdID0gQVVUSFRZUEVfU1JQOworCQlhdXRoX3R5cGVfdXNlclsxXSA9IEFVVEhUWVBFX05VTEw7CisJCVRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9IFROX05HX01VOworCQlURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID0gVE5fTkdfTVU7CisJCWJyZWFrOworI2VuZGlmIC8qIENLX1NSUCAqLworI2lmZGVmIENLX1NTTAorCSAgICAgIGNhc2UgQVVUSFRZUEVfU1NMOgorCQlhdXRoX3R5cGVfdXNlclswXSA9IEFVVEhUWVBFX1NTTDsKKwkJYXV0aF90eXBlX3VzZXJbMV0gPSBBVVRIVFlQRV9OVUxMOworCQlURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9BVVRIRU5USUNBVElPTikgPSBUTl9OR19NVTsKKwkJVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9IFROX05HX01VOworCQlicmVhazsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBOVAorCSAgICAgIGNhc2UgQVVUSFRZUEVfTlRMTToKKwkJYXV0aF90eXBlX3VzZXJbMF0gPSBBVVRIVFlQRV9OVExNOworCQlhdXRoX3R5cGVfdXNlclsxXSA9IEFVVEhUWVBFX05VTEw7CisJCVRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9IFROX05HX01VOworCQlURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID0gVE5fTkdfTVU7CisJCWJyZWFrOworI2VuZGlmIC8qIE5UICovCisjaWZkZWYgQ0tfS0VSQkVST1MKKwkgICAgICBjYXNlIEFVVEhUWVBFX0tFUkJFUk9TX1Y0OgorCQlhdXRoX3R5cGVfdXNlclswXSA9IEFVVEhUWVBFX0tFUkJFUk9TX1Y0OworCQlhdXRoX3R5cGVfdXNlclsxXSA9IEFVVEhUWVBFX05VTEw7CisJCVRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9IFROX05HX01VOworCQlURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID0gVE5fTkdfTVU7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBBVVRIVFlQRV9LRVJCRVJPU19WNToKKwkJYXV0aF90eXBlX3VzZXJbMF0gPSBBVVRIVFlQRV9LRVJCRVJPU19WNTsKKwkJYXV0aF90eXBlX3VzZXJbMV0gPSBBVVRIVFlQRV9OVUxMOworCQlURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9BVVRIRU5USUNBVElPTikgPSBUTl9OR19NVTsKKwkJVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9IFROX05HX01VOworCQlicmVhazsKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCSAgICB9CisJfQorCS8qCisJICAgSWYgdGhlIHVzZXIgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgS2VyYmVyb3MgY29ubmVjdGlvbiwKKwkgICBtYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIFRHVC4KKwkqLworCW1ha2VzdHIoJnNsbXNnLCJBdXRoZW50aWNhdGlvbiBmYWlsdXJlIik7CisJaWYgKCh0dG5wcm90byA9PSBOUF9URUxORVQgfHwgdHRucHJvdG8gPT0gTlBfS0VSTUlUKSAmJgorCSAgICAobGluZVswXSA9PSAnKicgJiYKKwkgICAgIFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9PSBUTl9OR19NVSB8fAorCSAgICAgbGluZVswXSAhPSAnKicgJiYKKwkgICAgIFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9BVVRIRU5USUNBVElPTikgPT0gVE5fTkdfTVUpCisJICAgICkgeworI2lmZGVmIENLX0tFUkJFUk9TCisJICAgIGlmICggYXV0aF90eXBlX3VzZXJbMF0gPT0gQVVUSFRZUEVfS0VSQkVST1NfVjQgKSB7CisJCWV4dGVybiBpbnQga3JiNF9hdXRvZ2V0OworCQlpZiAoIWNrX2tyYjRfaXNfaW5zdGFsbGVkKCkpCisJCSAgcmV0dXJuKGN4X2ZhaWwobXNnLAorCSAgICAgICJSZXF1aXJlZCBhdXRoZW50aWNhdGlvbiBtZXRob2QgKEtlcmJlcm9zIDQpIGlzIG5vdCBpbnN0YWxsZWQiKSk7CisjaWZkZWYgQ09NTUVOVAorCQkvKiBUaGlzIGNvZGUgcmVzdWx0cyBpbiBmYWxzZSBmYWlsdXJlcyB3aGVuIHVzaW5nICovCisJCS8qIGtlcmJlcm9zIHRvIG1hY2hpbmVzIGluIHJlYWxtcyBvdGhlciB0aGFuIHRoZSAgKi8KKwkJLyogZGVmYXVsdCBzaW5jZSB3ZSBkb24ndCBrbm93IHRoZSByZWFsbSBvZiB0aGUgICAqLworCQkvKiBvdGhlciBtYWNoaW5lIHVudGlsIHBlcmZvcm0gdGhlIHJldmVyc2UgRE5TICAgICovCisJCS8qIGxvb2t1cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJZWxzZSBpZiAobGluZVswXSAhPSAnKicgJiYgIWNrX2tyYjRfaXNfdGd0X3ZhbGlkKCkgJiYKKwkJCSAgICgha3JiNF9hdXRvZ2V0IHx8CisJCQkgICAga3JiNF9hdXRvZ2V0ICYmICFja19rcmI0X2F1dG9nZXRfVEdUKE5VTEwpKSkgeworCQkgICAgcmV0dXJuKGN4X2ZhaWwobXNnLAorCQkJICAgIktlcmJlcm9zIDQ6IFRpY2tldCBHZXR0aW5nIFRpY2tldCBub3QgdmFsaWQiKSk7CisJCX0KKyNlbmRpZiAvKiBDT01NRU5UICovCisJICAgIH0gZWxzZSBpZiAoYXV0aF90eXBlX3VzZXJbMF0gPT0gQVVUSFRZUEVfS0VSQkVST1NfVjUpIHsKKwkJZXh0ZXJuIGludCBrcmI1X2F1dG9nZXQ7CisJCWlmICghY2tfa3JiNV9pc19pbnN0YWxsZWQoKSkgeworCQkgICAgcmV0dXJuKGN4X2ZhaWwobXNnLAorCSAgICJSZXF1aXJlZCBhdXRoZW50aWNhdGlvbiBtZXRob2QgKEtlcmJlcm9zIDUpIGlzIG5vdCBpbnN0YWxsZWQiKSk7CisJCX0KKyNpZmRlZiBDT01NRU5UCisJCS8qIFRoaXMgY29kZSByZXN1bHRzIGluIGZhbHNlIGZhaWx1cmVzIHdoZW4gdXNpbmcgKi8KKwkJLyoga2VyYmVyb3MgdG8gbWFjaGluZXMgaW4gcmVhbG1zIG90aGVyIHRoYW4gdGhlICAqLworCQkvKiBkZWZhdWx0IHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIHJlYWxtIG9mIHRoZSAgICovCisJCS8qIG90aGVyIG1hY2hpbmUgdW50aWwgcGVyZm9ybSB0aGUgcmV2ZXJzZSBETlMgICAgKi8KKwkJLyogbG9va3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQllbHNlIGlmIChsaW5lWzBdICE9ICcqJyAmJiAhY2tfa3JiNV9pc190Z3RfdmFsaWQoKSAmJgorCQkJICAgKCFrcmI1X2F1dG9nZXQgfHwKKwkJCSAgICBrcmI1X2F1dG9nZXQgJiYgIWNrX2tyYjVfYXV0b2dldF9UR1QoTlVMTCkpKSB7CisJCSAgICByZXR1cm4oY3hfZmFpbChtc2csCisJCQkgIktlcmJlcm9zIDU6IFRpY2tldCBHZXR0aW5nIFRpY2tldCBub3QgdmFsaWQuIikpOworCQl9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCSAgICB9CisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyNpZmRlZiBOVAorCSAgICBpZiAoYXV0aF90eXBlX3VzZXJbMF0gPT0gQVVUSFRZUEVfTlRMTSkgeworCQlpZiAoIWNrX250bG1faXNfaW5zdGFsbGVkKCkpIHsKKwkJICAgIHJldHVybihjeF9mYWlsKG1zZywKKwkJICAgIlJlcXVpcmVkIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCAoTlRMTSkgaXMgbm90IGluc3RhbGxlZCIpKTsKKwkJfSBlbHNlIGlmIChsaW5lWzBdICE9ICcqJyAmJiAhY2tfbnRsbV9pc192YWxpZCgwKSkgeworCQkgICAgcmV0dXJuKGN4X2ZhaWwobXNnLCJOVExNOiBDcmVkZW50aWFscyBhcmUgdW5hdmFpbGFibGUuIikpOworCQl9CisJICAgIH0KKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIENLX1NTTAorCSAgICBpZiAoYXV0aF90eXBlX3VzZXJbMF0gPT0gQVVUSFRZUEVfU1NMKSB7CisJCWlmICghY2tfc3NsZWF5X2lzX2luc3RhbGxlZCgpKSB7CisJCSAgICByZXR1cm4oY3hfZmFpbChtc2csCisJCSAgICAgIlJlcXVpcmVkIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCAoU1NMKSBpcyBub3QgaW5zdGFsbGVkIikpOworCQl9CisJICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBDS19TUlAKKwkgICAgaWYgKGF1dGhfdHlwZV91c2VyWzBdID09IEFVVEhUWVBFX1NSUCkgeworCQlpZiAoIWNrX3NycF9pc19pbnN0YWxsZWQoKSkgeworCQkgICAgcmV0dXJuKGN4X2ZhaWwobXNnLAorCQkgICAgICJSZXF1aXJlZCBhdXRoZW50aWNhdGlvbiBtZXRob2QgKFNSUCkgaXMgbm90IGluc3RhbGxlZCIpKTsKKwkJfQorCSAgICB9CisjZW5kaWYgLyogQ0tfU1JQICovCisJfQorI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorCWlmICgodHRucHJvdG8gPT0gTlBfVEVMTkVUIHx8IHR0bnByb3RvID09IE5QX0tFUk1JVCkgJiYKKwkgICAgIHBhcmFtMiA+IC0xKSB7CisJICAgIGlmICghc2xfY3hfc2F2ZWQpIHsKKwkJc2xfY3hfdHlwZSA9IGN4X3R5cGU7CisJCXNsX2N4X3NhdmVkID0gMTsKKwkgICAgfQorCSAgICBpZiAoIXNsX3RvcHRfZV9zX3NhdmVkKSB7CisJCXNsX3RvcHRfZV9zdSA9IFRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pOworCQlzbF90b3B0X2Vfc20gPSBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTik7CisJCXNsX3RvcHRfZV9zX3NhdmVkID0gMTsKKwkgICAgfQorCSAgICBpZiAoIXNsX3RvcHRfZV9jX3NhdmVkKSB7CisJCXNsX3RvcHRfZV9jdSA9IFRFTE9QVF9ERUZfQ19VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pOworCQlzbF90b3B0X2VfY20gPSBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTik7CisJCXNsX3RvcHRfZV9jX3NhdmVkID0gMTsKKwkgICAgfQorCSAgICBjeF90eXBlID0gcGFyYW0yOworCSAgICBpZiAoY3hfdHlwZSA9PSBDWF9BVVRPKSB7CisJCVRFTE9QVF9ERUZfU19VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUlE7CisJCVRFTE9QVF9ERUZfU19NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JROworCQlURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JROworCQlURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SUTsKKwkgICAgfSBlbHNlIGlmIChjeF90eXBlID09IENYX05PTkUpIHsKKwkJVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19SRjsKKwkJVEVMT1BUX0RFRl9TX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisJCVRFTE9QVF9ERUZfQ19VX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfUkY7CisJCVRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX1JGOworCSAgICB9IGVsc2UgeworCQlURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9IFROX05HX01VOworCQlURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19NVTsKKwkJVEVMT1BUX0RFRl9DX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19NVTsKKwkJVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfTVU7CisJICAgIH0KKwl9CisJaWYgKHR0bnByb3RvID09IE5QX0VLNExPR0lOIHx8IHR0bnByb3RvID09IE5QX0VLNUxPR0lOIHx8CisJICAgICh0dG5wcm90byA9PSBOUF9URUxORVQgfHwgdHRucHJvdG8gPT0gTlBfS0VSTUlUKSAmJgorCSAgICAoKGxpbmVbMF0gPT0gJyonICYmCisJICAgICAgVEVMT1BUX0RFRl9TX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPT0gVE5fTkdfTVUgJiYKKwkgICAgICBURUxPUFRfREVGX1NfTUVfTU9ERShURUxPUFRfRU5DUllQVElPTikgPT0gVE5fTkdfTVUpIHx8CisJICAgICAobGluZVswXSAhPSAnKicgJiYKKwkgICAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9PSBUTl9OR19NVSAmJgorCSAgICAgIFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9FTkNSWVBUSU9OKSA9PSBUTl9OR19NVSkpCisJICAgICkgeworCSAgICBpZiAoIWNrX2NyeXB0X2lzX2luc3RhbGxlZCgpKSB7CisJCXJldHVybihjeF9mYWlsKG1zZywKKwkJICAiUmVxdWlyZWQgRW5jcnlwdGlvbiBtZXRob2RzIGFyZSBub3QgaW5zdGFsbGVkIikpOworCSAgICB9CisJfQorI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyNpZmRlZiBSTE9HQ09ERQorI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgS1JCNAorCWlmICh0dG5wcm90byA9PSBOUF9LNExPR0lOIHx8IHR0bnByb3RvID09IE5QX0VLNExPR0lOKSB7CisJICAgIGV4dGVybiBpbnQga3JiNF9hdXRvZ2V0OworCSAgICBjaGFyIHRndFsyNTZdOworCSAgICBjaGFyICogcmVhbG07CisKKwkgICAgLyogV2UgZG9uJ3QgaGF2ZSB0aGUgZnVsbCBob3N0bmFtZSBhdCB5ZXQgc28gICovCisJICAgIC8qIHdlIGRvIGEgRE5TIGxvb2t1cCBiZWZvcmUgY2FsbGluZyB0dG9wZW4oKSAqLyAKKworCSAgICByZWFsbSA9IGNrX2tyYjRfcmVhbG1vZmhvc3QoY2tnZXRmcWhvc3RuYW1lKGhvc3RuYW1lKSk7CisJICAgIGNrbWFrbXNnKHRndCwyNTYsImtyYnRndC4iLHJlYWxtLCJAIixyZWFsbSk7CisJICAgIGlmICghY2tfa3JiNF9pc19pbnN0YWxsZWQoKSkgeworCQlyZXR1cm4oY3hfZmFpbChtc2csCisJCSAiUmVxdWlyZWQgYXV0aGVudGljYXRpb24gbWV0aG9kIChLZXJiZXJvcyA0KSBpcyBub3QgaW5zdGFsbGVkIgorCQkJICAgICAgICkpOworCSAgICB9IGVsc2UgeworCQlpZiAoKGNrX2tyYjRfdGt0X2lzdmFsaWQodGd0KSA8PSAwKSAmJgorCQkgICAgKCFrcmI0X2F1dG9nZXQgfHwKKwkJICAgICBrcmI0X2F1dG9nZXQgJiYgIWNrX2tyYjRfYXV0b2dldF9UR1QocmVhbG0pKSkgeworCQkgICAgcmV0dXJuKGN4X2ZhaWwobXNnLAorCQkJICAgIktlcmJlcm9zIDQ6IFRpY2tldCBHZXR0aW5nIFRpY2tldCBub3QgdmFsaWQiKSk7CisJCX0KKwkgICAgfQorCX0KKyNlbmRpZiAvKiBLUkI0ICovCisjaWZkZWYgS1JCNQorCWlmICh0dG5wcm90byA9PSBOUF9LNUxPR0lOIHx8IHR0bnByb3RvID09IE5QX0VLNUxPR0lOIHx8CisJICAgIHR0bnByb3RvID09IE5QX0s1VTJVKQorCXsKKwkgICAgZXh0ZXJuIGludCBrcmI1X2F1dG9nZXQ7CisJICAgIGNoYXIgdGd0WzI1Nl07CisJICAgIGNoYXIgKiByZWFsbTsKKworCSAgICAvKiBNdXN0IGdldCBmdWxsIGhvc3RuYW1lIGJlZm9yZSBjYWxsaW5nIHR0b3BlbigpICovCisKKwkgICAgcmVhbG0gPSBja19rcmI1X3JlYWxtb2Zob3N0KGNrZ2V0ZnFob3N0bmFtZShob3N0bmFtZSkpOworCSAgICBja21ha21zZyh0Z3QsMjU2LCJrcmJ0Z3QvIixyZWFsbSwiQCIscmVhbG0pOworCisJICAgIGlmICghY2tfa3JiNV9pc19pbnN0YWxsZWQoKSkgeworCQlyZXR1cm4oY3hfZmFpbChtc2csCisgICAgICAgICAgICAgICAgICJSZXF1aXJlZCBhdXRoZW50aWNhdGlvbiBtZXRob2QgKEtlcmJlcm9zIDUpIG5vdCBpbnN0YWxsZWQiKSk7CisJICAgIH0gZWxzZSBpZiAoISgoY2tfa3JiNV90a3RfaXN2YWxpZChOVUxMLHRndCkgPiAwKSB8fAorCQkJICBja19rcmI1X2lzX3RndF92YWxpZCgpKSAmJgorCQkgICAgICAgKCFrcmI1X2F1dG9nZXQgfHwKKwkJCWtyYjVfYXV0b2dldCAmJiAhY2tfa3JiNV9hdXRvZ2V0X1RHVChyZWFsbSkpKSB7CisJCXJldHVybihjeF9mYWlsKG1zZywKKwkJICAgICAgICJLZXJiZXJvcyA1OiBUaWNrZXQgR2V0dGluZyBUaWNrZXQgbm90IHZhbGlkLiIpKTsKKwkgICAgfQorCX0KKyNlbmRpZiAvKiBLUkI1ICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworCisjaWZuZGVmIE5PU1BMCisjaWZkZWYgUkxPR0NPREUKKwlpZiAodXNlcm5hbWUpIHsKKwkgICAgaWYgKCFzbF91aWRfc2F2ZWQpIHsKKwkJY2tzdHJuY3B5KHNsX3VpZGJ1Zix1aWRidWYsVUlEQlVGTEVOKTsKKwkJc2xfdWlkX3NhdmVkID0gMTsKKwkgICAgfQorCSAgICBja3N0cm5jcHkodWlkYnVmLHVzZXJuYW1lLFVJREJVRkxFTik7CisJICAgIHVpZGZsYWcgPSAxOworCX0KKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworI2lmZGVmIFROQ09ERQorCWlmICghc2xfdG5fc2F2ZWQpIHsKKwkgICAgc2xfdG5fd2FpdCA9IHRuX3dhaXRfZmxnOworCSAgICBzbF90bl9zYXZlZCA9IDE7CisJfQorCXRuX3dhaXRfZmxnID0gcGFyYW0zOworI2VuZGlmIC8qIFROQ09ERSAqLworI2VuZGlmIC8qIE5PU1BMICovCisJfSAvKiBpZiAobmV0ID09IE5FVF9UQ1BCKSAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCisjaWZuZGVmIE5PU1BMCisjaWZkZWYgQ0tfU0VDVVJJVFkKKwlpZiAocGFzc3dvcmQpIHsKKwkgICAgaWYgKHBhc3N3b3JkWzBdKSB7CisJCWNrc3RybmNweShwd2J1ZixwYXNzd29yZCxQV0JVRkwrMSk7CisJCXB3ZmxnID0gMTsKKwkJcHdjcnlwdCA9IDA7CisJICAgIH0gZWxzZQorCQlwd2ZsZyA9IDA7CisJfQorI2VuZGlmIC8qIENLX1NFQ1VSSVRZICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworCS8qIFRyeSB0byBvcGVuIC0gbmV0d29yayAqLworCWNrc3RybmNweSh0dG5hbWUsbGluZSxUVE5BTUxFTik7CisJeSA9IHR0b3BlbihsaW5lLCAmX2xvY2FsLCBtZG10eXAsIDAgKTsKKworI2lmbmRlZiBOT0hUVFAKKwkvKiAgSWYgdGhlIGNvbm5lY3Rpb24gZmFpbGVkIGFuZCB3ZSBhcmUgdXNpbmcgYW4gSFRUUCBQcm94eQorCSAqICBhbmQgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgd2FzIGFuIGF1dGhlbnRpY2F0aW9uCisJICogIGVycm9yLCB0aGVuIHdlIG5lZWQgdG8gZ2l2ZSB0aGUgdXNlciB0byBhYmlsaXR5IHRvCisJICogIGVudGVyIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLCBqdXN0IGxpa2UgYSBicm93c2VyLgorCSAqCisJICogIEkgdHJpZWQgdG8gZG8gYWxsIG9mIHRoaXMgd2l0aGluIHRoZSBuZXRvcGVuKCkgY2FsbAorCSAqICBidXQgaXQgaXMgbXVjaCB0b28gbXVjaCB3b3JrLgorCSAqLworCXdoaWxlICh5IDwgMCAmJiB0Y3BfaHR0cF9wcm94eSAhPSBOVUxMICkgeworCisJICAgIGlmICh0Y3BfaHR0cF9wcm94eV9lcnJubyA9PSA0MDEgfHwKKwkJdGNwX2h0dHBfcHJveHlfZXJybm8gPT0gNDA3ICkgeworCQljaGFyIHVpZFtVSURCVUZMRU5dOworCQljaGFyIHB3ZFsyNTZdOworICAgICAgICAgICAgICAgIHN0cnVjdCB0eHRib3ggdGJbMl07CisgICAgICAgICAgICAgICAgaW50IG9rOworCisgICAgICAgICAgICAgICAgdGJbMF0udF9idWYgPSB1aWQ7CisgICAgICAgICAgICAgICAgdGJbMF0udF9sZW4gPSBVSURCVUZMRU47CisgICAgICAgICAgICAgICAgdGJbMF0udF9sYmwgPSAiUHJveHkgVXNlcmlkOiAiOworICAgICAgICAgICAgICAgIHRiWzBdLnRfZGZsdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgdGJbMF0udF9lY2hvID0gMTsKKyAgICAgICAgICAgICAgICB0YlsxXS50X2J1ZiA9IHB3ZDsKKyAgICAgICAgICAgICAgICB0YlsxXS50X2xlbiA9IDI1NjsKKyAgICAgICAgICAgICAgICB0YlsxXS50X2xibCA9ICJQcm94eSBQYXNzcGhyYXNlOiAiOworICAgICAgICAgICAgICAgIHRiWzFdLnRfZGZsdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgdGJbMV0udF9lY2hvID0gMjsKKworICAgICAgICAgICAgICAgIG9rID0gdXFfbXR4dCgiUHJveHkgU2VydmVyIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMiwgdGIpOworCisJCWlmIChvayAmJiB1aWRbMF0pIHsKKwkJICAgIGNoYXIgKiBwcm94eV91c2VyLCAqIHByb3h5X3B3ZDsKKworCQkgICAgcHJveHlfdXNlciA9IHRjcF9odHRwX3Byb3h5X3VzZXI7CisJCSAgICBwcm94eV9wd2QgID0gdGNwX2h0dHBfcHJveHlfcHdkOworCisJCSAgICB0Y3BfaHR0cF9wcm94eV91c2VyID0gdWlkOworCQkgICAgdGNwX2h0dHBfcHJveHlfcHdkID0gcHdkOworCisJCSAgICBja3N0cm5jcHkodHRuYW1lLGxpbmUsVFROQU1MRU4pOworCQkgICAgeSA9IHR0b3BlbihsaW5lLCAmX2xvY2FsLCBtZG10eXAsIDApOworCQkgICAgbWVtc2V0KHB3ZCwwLHNpemVvZihwd2QpKTsKKwkJICAgIHRjcF9odHRwX3Byb3h5X3VzZXIgPSBwcm94eV91c2VyOworCQkgICAgdGNwX2h0dHBfcHJveHlfcHdkID0gcHJveHlfcHdkOworCQl9IGVsc2UKKwkJICBicmVhazsKKwkgICAgfSBlbHNlCisJICAgICAgYnJlYWs7CisJfQorI2VuZGlmIC8qIE5PSFRUUCAqLworCWlmICh5IDwgMCkgeworCSAgICBzbHJlc3RvcigpOworCSAgICBtYWtlc3RyKCZzbG1zZywiTmV0d29yayBjb25uZWN0aW9uIGZhaWx1cmUiKTsKKyNpZmRlZiBWTVMKKwkgICAgaWYgKG1zZyAmJiBoaW50cyAmJiAheGNtZHNyYyAmJiBJU19STE9HSU4oKSkgeworCQltYWtlc3RyKCZzbG1zZywiUkxPR0lOIGZhaWx1cmUiKTsKKwkJaWYgIChzb2NrZXRfZXJybm8gPT0gRUFDQ0VTKSB7CisJCSAgICBwcmludGYoIioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCQkgICAgcHJpbnRmKAorCSAgICJIaW50OiBSTE9HSU4gcmVxdWlyZXMgcHJpdmlsZWdlcyB0byBvcGVuIGFuIG91dGJvdW5kIHBvcnQuXG4iKTsKKwkJICAgIHByaW50ZigKKwkJICAgICIoVXNlIFNFVCBISU5UUyBPRkYgdG8gc3VwcHJlc3MgZnV0dXJlIGhpbnRzLilcbiIpOworCQkgICAgcHJpbnRmKCIqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKwkJfQorCSAgICB9CisjZWxzZSAgLyogTm90IFZNUy4uLiAqLworCSAgICBpZiAoZXJybm8pIHsKKwkJaW50IHg7CisJCWRlYnVnKEYxMTEsInNldCBob3N0IGxpbmUsIGVycm5vIiwiIixlcnJubyk7CisJCW1ha2VzdHIoJnNsbXNnLGNrX2VycnN0cigpKTsKKwkJaWYgKG1zZykgeworI2lmZGVmIE9TMgorCQkgICAgcHJpbnRmKCJDYW4ndCBjb25uZWN0IHRvICVzXG4iLGxpbmUpOworI2Vsc2UgLyogT1MyICovCisjaWZkZWYgVU5JWAorCQkgICAgaWYgKGhpbnRzICYmICF4Y21kc3JjICYmIElTX1JMT0dJTigpKSB7CisJCQltYWtlc3RyKCZzbG1zZywiUkxPR0lOIGZhaWx1cmUiKTsKKwkJCXByaW50ZigiKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJCQlwcmludGYoCisJICJIaW50OiBSTE9HSU4gcmVxdWlyZXMgcHJpdmlsZWdlcyB0byBvcGVuIGFuIG91dGJvdW5kIHBvcnQuXG4iKTsKKwkJCXByaW50ZigKKwkgIihVc2UgU0VUIEhJTlRTIE9GRiB0byBzdXBwcmVzcyBmdXR1cmUgaGludHMuKVxuIik7CisJCQlwcmludGYoIioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCQkgICAgfQorI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKwkJfSBlbHNlIHByaW50ZigiQ2FuJ3QgY29ubmVjdCB0byAlc1xuIixsaW5lKTsKKwkgICAgfSBlbHNlCisjZW5kaWYgLyogVk1TICovCisJICAgICAgaWYgKG1zZykgcHJpbnRmKCJDYW4ndCBvcGVuIGNvbm5lY3Rpb24gdG8gJXNcbiIsbGluZSk7CisJICAgIGNvbnRpbnVlOworCX0gZWxzZSB7CisJICAgIHN1Y2Nlc3MgPSAxOworI2lmbmRlZiBOT0RJQUwKKwkgICAgZGlhbHN0YSA9IERJQV9VTks7CisjZW5kaWYgLyogTk9ESUFMICovCisJICAgIHN3aXRjaCAobmV0KSB7CisJICAgICAgY2FzZSBORVRfVENQQToKKwkgICAgICBjYXNlIE5FVF9UQ1BCOgorCQljeHR5cGUgPSBDWFRfVENQSVA7CisjaWZkZWYgQ09NTUVOVAorLyogVGhpcyB3b3JrcyBidXQgaXQgbWVzc2VzIHVwIGludGVyYWN0aXZlIGFub255bW91cyBsb2dpbiAqLworI2lmbmRlZiBOT1hGRVIKKyNpZmRlZiBJS1NfT1BUSU9OCisJCS8qIElmIHdlIGhhdmUgY29ubmVjdGVkIHRvIGFuIEludGVybmV0IEtlcm1pdCBzZXJ2aWNlICovCisJCS8qIGFuZCBhIC9VU0VSOiBzd2l0Y2ggd2FzIGdpdmVuLCB0aGVuIGxvZyBpbi4gKi8KKworCQlpZiAoVEVMT1BUX1UoVEVMT1BUX0tFUk1JVCkgfHwgVEVMT1BUX01FKFRFTE9QVF9LRVJNSVQpKSB7CisJCSAgICBkZWJ1ZyhGMTExLCJjeF9uZXQgSUtTRCAvVVNFUjoiLHVpZGJ1ZixoYXZldXNlcik7CisJCSAgICBpZiAoaGF2ZXVzZXIgLyogJiYgY3ggPT0gMCAqLyApIHsgLyogL1VTRVI6IGdpdmVuICovCisJCQljaGFyICogcHN3ID0gcHdidWY7IC8qIERvIHdlIGhhdmUgYSBwYXNzd29yZD8gKi8KKwkJCWlmICghKnBzdykgeyAgICAgICAgLyogTm8uLi4gKi8KKwkJCSAgICBpZiAoIXN0cmNtcCh1aWRidWYsImFub255bW91cyIpIHx8CisJCQkJIXN0cmNtcCh1aWRidWYsImZ0cCIpKSB7CisJCQkJZXh0ZXJuIGNoYXIgbXlob3N0W107CisJCQkJY2hhciAqIHUgPSAoY2hhciAqKXNsX3VpZGJ1ZjsKKwkJCQljaGFyICogaCA9IChjaGFyICopbXlob3N0OworCQkJCWlmICghKnUpIHUgPSAibm9ib2R5IjsKKwkJCQlpZiAoISpoKSBoID0gIm5vd2hlcmUiOworCQkJCWNrbWFrbXNnKHRtcGJ1ZixUTVBCVUZTSVosdSwiQCIsaCxOVUxMKTsKKwkJCQlwc3cgPSB0bXBidWY7CisJCQkJZGVidWcoRjExMCwiY3hfbmV0IElLU0QgYW5vbiIscHN3LDApOworCQkJICAgIH0gZWxzZSB7CisJCQkJcmVhZHBhc3MoIiBQYXNzd29yZDogIixwd2J1ZixQV0JVRkwpOworCQkJICAgIH0KKwkJCX0KKwkJCXNzdGF0ZSA9IHNldGdlbignSScsdWlkYnVmLHBzdywiIik7CisJCSAgICB9CisJCX0KKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisjZW5kaWYgLyogTk9YRkVSICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCQlicmVhazsKKwkgICAgICBjYXNlIE5FVF9TU0g6CisJCWN4dHlwZSA9IENYVF9TU0g7CisJCWR1cGxleCA9IDA7ICAgICAgICAgLyogUmVtb3RlIGVjaG8gKi8KKwkJYnJlYWs7CisJICAgICAgY2FzZSBORVRfU0xBVDoKKwkJY3h0eXBlID0gQ1hUX0xBVDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBORVRfU1gyNToKKwkgICAgICBjYXNlIE5FVF9JWDI1OgorCSAgICAgIGNhc2UgTkVUX0hYMjU6CisJICAgICAgY2FzZSBORVRfVlgyNToKKwkJY3h0eXBlID0gQ1hUX1gyNTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBORVRfQklPUzoKKwkJY3h0eXBlID0gQ1hUX05FVEJJT1M7CisJCWJyZWFrOworCSAgICAgIGNhc2UgTkVUX0ZJTEU6CisJICAgICAgY2FzZSBORVRfUElQRToKKwkgICAgICBjYXNlIE5FVF9DTUQ6CisJICAgICAgY2FzZSBORVRfRExMOgorCSAgICAgIGNhc2UgTkVUX1BUWToKKwkJY3h0eXBlID0gQ1hUX1BJUEU7CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CisJCWN4dHlwZSA9IENYVF9QSVBFOworCQlicmVhazsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisgICAgfSAvKiBmb3ItbG9vcCAqLworICAgIHMgPSBsaW5lOworCisgICAgZGVidWcoRjEwMSwiY3hfbmV0IHBvc3QgdHRvcGVuIHN1Y2Nlc3MiLCIiLHN1Y2Nlc3MpOworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICBsb2NhbCA9IGRmbG9jOyAgICAgICAgICAgICAgICAgIC8qIEdvIGJhY2sgdG8gbm9ybWFsICovCisjaWZuZGVmIE1BQworICAgICAgICBja3N0cm5jcHkodHRuYW1lLGRmdHR5LFRUTkFNTEVOKTsgLyogUmVzdG9yZSBkZWZhdWx0IHR0eSBuYW1lICovCisjZW5kaWYgLyogTUFDICovCisgICAgICAgIHNwZWVkID0gdHRnc3BkKCk7CisgICAgICAgIG5ldHdvcmsgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogTm8gbmV0d29yayBjb25uZWN0aW9uIGFjdGl2ZSAqLworICAgICAgICBoYXZlbGluZSA9IDA7CisgICAgICAgIGlmIChtZG10eXAgPCAwKSB7ICAgICAgICAgICAgICAgLyogU3dpdGNoaW5nIGZyb20gbmV0IHRvIGFzeW5jPyAqLworICAgICAgICAgICAgaWYgKG1kbXNhdiA+IC0xKSAgICAgICAgICAgIC8qIFJlc3RvcmUgbW9kZW0gdHlwZSBmcm9tIGxhc3QgKi8KKyAgICAgICAgICAgICAgbWRtdHlwID0gbWRtc2F2OyAgICAgICAgICAvKiBTRVQgTU9ERU0gY29tbWFuZCwgaWYgYW55LiAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBtZG10eXAgPSAwOworICAgICAgICAgICAgbWRtc2F2ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gZmFpbHVyZSAqLworICAgIH0KKyAgICBpZiAoX2xvY2FsID4gLTEpIGxvY2FsID0gX2xvY2FsOyAgICAvKiBPcGVuZWQgb2ssIHNldCBsb2NhbC9yZW1vdGUuICovCisgICAgbWFrZXN0cigmc2xtc2csTlVMTCk7CisgICAgbmV0d29yayA9IChtZG10eXAgPCAwKTsgICAgICAgICAgICAgLyogUmVtZW1iZXIgY29ubmVjdGlvbiB0eXBlLiAqLworICAgIGNrc3RybmNweSh0dG5hbWUscyxUVE5BTUxFTik7ICAgICAgIC8qIENvcHkgbmFtZSBpbnRvIHJlYWwgcGxhY2UuICovCisgICAgZGVidWcoRjExMCwiY3hfbmV0IG9rIix0dG5hbWUsMCk7CisgICAgZGVidWcoRjEwMSwiY3hfbmV0IG5ldHdvcmsiLCIiLG5ldHdvcmspOworI2lmbmRlZiBOT1hGRVIKKyAgICBpZiAoKHJlbGlhYmxlICE9IFNFVF9PRkYgfHwgIXNldHJlbGlhYmxlKSkgLyogQXNzdW1lIG5vdCByZWxpYWJsZS4gKi8KKyAgICAgIHJlbGlhYmxlID0gU0VUX09GRjsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICBpZiAoIW5ldHdvcmsgfHwgaXN0bmNvbXBvcnQoKSkJCisgICAgICBzcGVlZCA9IHR0Z3NwZCgpOyAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNwZWVkLiAqLworICAgIGRlYnVnKEYxMDEsImN4X25ldCBsb2NhbCIsIiIsbG9jYWwpOworICAgIGlmIChuZXR3b3JrKSB7CisgICAgICAgIGRlYnVnKEYxMDEsImN4X25ldCBuZXQiLCIiLG5ldCk7CisjaWZuZGVmIE5PWEZFUgorICAgICAgICAvKiBGb3JjZSBwcmVmaXhpbmcgb2YgMjU1IG9uIFRDUC9JUCBjb25uZWN0aW9ucy4uLiAqLworICAgICAgICBpZiAobmV0ID09IE5FVF9UQ1BCCisjaWZkZWYgU1NIQlVJTFRJTgorICAgICAgICAgICAgIHx8IG5ldCA9PSBORVRfU1NICisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworICAgICAgICAgICAgICkgeworICAgICAgICAgICAgZGVidWcoRjEwMSwiY3hfbmV0IHJlbGlhYmxlIEEiLCIiLHJlbGlhYmxlKTsKKyNpZmRlZiBDS19TUEVFRAorICAgICAgICAgICAgY3RscFsodW5zaWduZWQpMjU1XSA9IDE7CisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKyAgICAgICAgICAgIGlmICgocmVsaWFibGUgIT0gU0VUX09GRiB8fCAhc2V0cmVsaWFibGUpKSB7CisjaWZkZWYgVE5fQ09NUE9SVAorICAgICAgICAgICAgICAgIGlmIChpc3RuY29tcG9ydCgpKSB7ICAgIC8qIFRlbG5ldCBjb21tdW5pY2F0aW9uIHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVsaWFibGUgPSBTRVRfT0ZGOyAvKiBUcmFuc3BvcnQgaXMgbm90IHJlbGlhYmxlICovCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImN4X25ldCByZWxpYWJsZSBpc3RuY29tcG9ydCgpIiwiIiwxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZWxpYWJsZSA9IFNFVF9PTjsgIC8qIFRyYW5zcG9ydCBpcyByZWxpYWJsZSBlbmQgdG8gZW5kICovCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImN4X25ldCByZWxpYWJsZSBpc3RuY29tcG9ydCgpIiwiIiwwKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHJlbGlhYmxlID0gU0VUX09OOyAgICAgIC8qIFRyYW5zcG9ydCBpcyByZWxpYWJsZSBlbmQgdG8gZW5kICovCisjZW5kaWYgLyogaWZkZWYgVE5fQ09NUE9SVCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjEwMSwiY3hfbmV0IHJlbGlhYmxlIEIiLCIiLHJlbGlhYmxlKTsKKyAgICAgICAgfSBlbHNlIGlmIChuZXQgPT0gTkVUX1NYMjUgfHwKKyAgICAgICAgICAgICAgICAgICBuZXQgPT0gTkVUX1ZYMjUgfHwKKyAgICAgICAgICAgICAgICAgICBuZXQgPT0gTkVUX0lYMjUgfHwKKyAgICAgICAgICAgICAgICAgICBuZXQgPT0gTkVUX0hYMjUpIHsKKyAgICAgICAgICAgIGR1cGxleCA9IDE7ICAgICAgICAgICAgICAgICAvKiBMb2NhbCBlY2hvIGZvciBYLjI1ICovCisgICAgICAgICAgICBpZiAocmVsaWFibGUgIT0gU0VUX09GRiB8fCAhc2V0cmVsaWFibGUpCisgICAgICAgICAgICAgIHJlbGlhYmxlID0gU0VUX09OOyAgICAgICAgLyogVHJhbnNwb3J0IGlzIHJlbGlhYmxlIGVuZCB0byBlbmQgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIE5PWEZFUiAqLworICAgIH0KKyNpZm5kZWYgTk9YRkVSCisgICAgZGVidWcoRjEwMSwiY3hfbmV0IHJlbGlhYmxlIiwiIixyZWxpYWJsZSk7CisjZW5kaWYgLyogTk9YRkVSICovCisjaWZkZWYgT1MyCisgICAgaWYgKG1kbXR5cCA8PSAwKSAgICAgICAgICAgICAgICAgICAgLyogTmV0d29yayBvciBEaXJlY3QgQ29ubmVjdGlvbiAqLworICAgICAgRGlhbGVyU2VuZChPUFRfS0VSTUlUX0NPTk5FQ1QsIDApOworI2VuZGlmIC8qIE9TMiAqLworCisgIHhjeF9uZXQ6CisKKyAgICBzZXRmbG93KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgYXBwcm9wcmlhdGUgZmxvdyBjb250cm9sICovCisKKyAgICBoYXZlbGluZSA9IDE7CisjaWZkZWYgQ0tMT0dESUFMCisgICAgZG9sb2duZXQoKTsKKyNlbmRpZiAvKiBDS0xPR0RJQUwgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIGlmIChsb2NhbCkgeworICAgICAgICBpZiAobm1hYykgeyAgICAgICAgICAgICAgICAgICAgIC8qIEFueSBtYWNyb3MgZGVmaW5lZD8gKi8KKyAgICAgICAgICAgIGludCBrOyAgICAgICAgICAgICAgICAgICAgICAvKiBZZXMgKi8KKyAgICAgICAgICAgIGsgPSBtbG9vayhtYWN0YWIsIm9uX29wZW4iLG5tYWMpOyAgIC8qIExvb2sgdGhpcyB1cCAqLworICAgICAgICAgICAgaWYgKGsgPj0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgZm91bmQsICovCisgICAgICAgICAgICAgICAgaWYgKGRvZG8oayx0dG5hbWUsMCkgPiAtMSkgICAgICAvKiBzZXQgaXQgdXAsICovCisgICAgICAgICAgICAgICAgICBwYXJzZXIoMSk7ICAgICAgICAgICAgICAgICAgICAvKiBhbmQgZXhlY3V0ZSBpdCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICBpZiAobG9jYWwgJiYgKGN4IHx8IHN4KSkgeyAgICAgICAgICAvKiAvQ09OTkVDVCBvciAvU0VSVkVSIHN3aXRjaCBnaXZlbiAqLworICAgICAgICBpZiAoY3gpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIC9DT05ORUNUICovCisJICAgIGlmICghZ3VpKSB7CisJCS8qIENvbW1hbmQgd2FzIGNvbmZpcm1lZCBzbyB3ZSBjYW4gcHJlLXBvcCBjb21tYW5kIGxldmVsLiAgKi8KKwkJLyogVGhpcyBpcyBzbyBDT05ORUNUIG1vZHVsZSB3b24ndCB0aGluayB3ZSdyZSBleGVjdXRpbmcgYSAqLworCQkvKiBzY3JpcHQgaWYgQ09OTkVDVCB3YXMgdGhlIGZpbmFsIGNvbW1hbmQgaW4gdGhlIHNjcmlwdC4gICovCisJCWlmIChjbWRsdmwgPiAwKQorCQkgIHByZXBvcCgpOworCSAgICB9CisjaWZuZGVmIE5PRElBTAorICAgICAgICAgICAgZGlhbHN0YSA9IERJQV9VTks7CisjZW5kaWYgLyogTk9ESUFMICovCisjaWZkZWYgTE9DVVMKKyAgICAgICAgICAgIGlmIChhdXRvbG9jdXMpIHsKKwkJc2V0bG9jdXMoMSwxKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBMT0NVUyAqLworICAgICAgICAgICAgc3VjY2VzcyA9IGRvY29uZWN0KDAsIGNtZGx2bCA9PSAwID8gMSA6IDApOworICAgICAgICAgICAgaWYgKHR0Y2hrKCkgPCAwKQorICAgICAgICAgICAgICBkb2xvZ2VuZCgpOworCSAgICBkZWJ1ZyhGMTAxLCJjeF9uZXQgcG9zdCBkb2NvbmVjdCBzdWNjZXNzIiwiIixzdWNjZXNzKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzKTsKKyNpZm5kZWYgTk9YRkVSCisgICAgICAgIH0gZWxzZSBpZiAoc3gpIHsgICAgICAgICAgICAgICAgLyogL1NFUlZFUiAqLworICAgICAgICAgICAgc3N0YXRlID0gJ3gnOworI2lmZGVmIE1BQworICAgICAgICAgICAgd2hhdCA9IFdfUkVDVjsKKyAgICAgICAgICAgIHNjcmNyZWF0ZSgpOworI2VuZGlmIC8qIE1BQyAqLworICAgICAgICAgICAgaWYgKGxvY2FsKSBkaXNwbGEgPSAxOworI2lmZGVmIEFNSUdBCisgICAgICAgICAgICByZXFvZmYoKTsgICAgICAgICAgICAgICAgICAgLyogTm8gRE9TIHJlcXVlc3RvcnMgd2hpbGUgc2VydmVyICovCisjZW5kaWYgLyogQU1JR0EgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICAgICAgfQorICAgIH0KKyNpZm5kZWYgTk9ESUFMCisgICAgZGlhbHN0YSA9IERJQV9VTks7CisjZW5kaWYgLyogTk9ESUFMICovCisjaWZkZWYgTE9DVVMKKyAgICBpZiAoYXV0b2xvY3VzKSB7CisgICAgICAgIHNldGxvY3VzKDEsMSk7CisgICAgfQorI2VuZGlmIC8qIExPQ1VTICovCisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKK30KKyNlbmRpZiAvKiBORVRDT05OICovCisKKy8qIGMgeCBfIHMgZSByIGkgYSBsICAtLSAgTWFrZSBhIHNlcmlhbCBjb25uZWN0aW9uICovCisKKy8qCisgIENhbGwgd2l0aDoKKyAgICBkZXZpY2UgID0gc3RyaW5nIHBvaW50ZXIgdG8gZGV2aWNlIG5hbWUuCisgICAgY3ggICAgICA9IDEgdG8gYXV0b21hdGljYWxseSBlbnRlciBDb25uZWN0IG1vZGUsIDAgb3RoZXJ3aXNlLgorICAgIHN4ICAgICAgPSAxIHRvIGF1dG9tYXRpY2FsbHkgZW50ZXIgU2VydmVyIG1vZGUsIDAgb3RoZXJ3aXNlLgorICAgIHNociAgICAgPSAxIGlmIGRldmljZSBzaG91bGQgYmUgb3BlbmVkIGluIHNoYXJlYWJsZSBtb2RlLCAwIG90aGVyd2lzZS4KKyAgICBmbGFnICAgID0gaWYgbm8gZGV2IG5hbWUgZ2l2ZW46IDEgPSBjbG9zZSBjdXJyZW50IGNvbm5lY3Rpb24sIDAgPSByZXN1bWUuCisgICAgZ3VpICAgICA9IDEgaWYgY2FsbGVkIGZyb20gR1VJIGRpYWxvZywgMCBvdGhlcndpc2UuCisgIFJldHVybnM6CisgICAgMSBvbiBzdWNjZXNzCisgICAgMCBvbiBmYWlsdXJlIGFuZCBubyBtZXNzYWdlIHByaW50ZWQsIHNsbXNnIHNldCB0byBmYWlsdXJlIG1lc3NhZ2UuCisgICAtOSBvbiBmYWlsdXJlIGFuZCBtZXNzYWdlIHByaW50ZWQsIGRpdHRvLgorKi8KKworLyogdGhlc2UgYXJlIGJpdCBmbGFncyAqLworI2RlZmluZSBDWF9UQVBJIDEKKyNkZWZpbmUgQ1hfUFBQICAyCisjZGVmaW5lIENYX1NMSVAgNAorCitpbnQKKyNpZmRlZiBDS19BTlNJQworY3hfc2VyaWFsKGNoYXIgKmRldmljZSwgCisgICAgICAgICAgaW50IGN4LCBpbnQgc3gsIGludCBzaHIsIGludCBmbGFnLCBpbnQgZ3VpLCBpbnQgc3BlY2lhbCkKKyNlbHNlIC8qIENLX0FOU0lDICovCitjeF9zZXJpYWwoZGV2aWNlLCBjeCwgc3gsIHNociwgZmxhZywgZ3VpLCBzcGVjaWFsKQorICAgIGNoYXIgKiBkZXZpY2U7IGludCBjeCwgc3gsIHNociwgZmxhZywgZ3VpLCBzcGVjaWFsOyAKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogY3hfc2VyaWFsICovIHsKKyAgICBpbnQgaSwgbiwgeCwgeSwgbXNnOworICAgIGludCBfbG9jYWwgPSAtMTsKKyAgICBjaGFyICpzOworCisgICAgZGVidWcoRjExMCwiY3hfc2VyaWFsIGRldmljZSIsZGV2aWNlLDApOworICAgIHMgPSBkZXZpY2U7CisgICAgbXNnID0gKGd1aSA9PSAwKSAmJiBtc2dmbGc7CQkvKiBXaGV0aGVyIHRvIHByaW50IG1lc3NhZ2VzICovCisgICAgc3VjY2VzcyA9IDA7CisKKyNpZm5kZWYgTk9ESUFMCisgICAgZGlhbHN0YSA9IERJQV9VTks7CisjZW5kaWYgLyogTk9ESUFMICovCisgICAgZGVidWcoRjEwMSwiY3hfc2VyaWFsIG1kbXR5cCIsIiIsbWRtdHlwKTsKKyAgICBpZiAoY2xza2Nvbm54KDEpIDwgMCkJCS8qIENsb3NlIHRoZSBLZXJtaXQgY29ubmVjdGlvbiAqLworICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICBpZiAoKnMpIHsJCQkJLyogVGhleSBnYXZlIGEgZGV2aWNlIG5hbWUgKi8KKwlfbG9jYWwgPSAtMTsJCQkvKiBMZXQgdHRvcGVuIGRlY2lkZSBhYm91dCBpdCAqLworICAgIH0gZWxzZSB7CQkJCS8qIFRoZXkganVzdCBzYWlkICJzZXQgbGluZSIgKi8KKwlzID0gZGZ0dHk7CQkJLyogc28gZ28gYmFjayB0byBub3JtYWwgdHR5ICovCisJX2xvY2FsID0gZGZsb2M7CQkJLyogYW5kIG1vZGUuICovCisgICAgfQorI2lmZGVmIFZNUworICAgIHsKKwlleHRlcm4gaW50IG9rX3RvX3NoYXJlOworCW9rX3RvX3NoYXJlID0gc2hyOworICAgIH0KKyNlbmRpZiAvKiBWTVMgKi8KKworI2lmZGVmIE9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE11c3Qgd2FpdCB1bnRpbCBhZnRlciB0dGNsb3MoKSAqLworI2lmZGVmIE5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvIGNoYW5nZSB0aGVzZSBzZXR0aW5ncyAgICAgICAqLworI2lmZGVmIENLX1RBUEkKKyAgICB0dHRhcGkgPSBzcGVjaWFsICYgQ1hfVEFQSTsKKyNlbmRpZiAvKiBDS19UQVBJICovCisjZWxzZQorICAgIHR0c2xpcCA9IHNwZWNpYWwgJiBDWF9TTElQOworICAgIHR0cHBwICA9IHNwZWNpYWwgJiBDWF9QUFA7CisjZW5kaWYgLyogTlQgKi8KKyAgICB0dHNoYXJlID0gc2hyOwkJCS8qIFNoYXJlYWJsZSBkZXZpY2UgPyAqLworICAgIGRlYnVnKEYxMTAsIk9TMiBTRVQgUE9SVCBmaW5hbCBzIixzLCIiKTsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIC8qIE9wZW4gdGhlIG5ldyBsaW5lICovICAgICAgICAKKworICAgIGNrc3RybmNweSh0dG5hbWUscyxUVE5BTUxFTik7CisgICAgaWYgKCh5ID0gdHRvcGVuKHMsJl9sb2NhbCxtZG10eXAsY2R0aW1vKSkgPiAtMSkgeworCWN4dHlwZSA9IChtZG10eXAgPiAwKSA/IENYVF9NT0RFTSA6IENYVF9ESVJFQ1Q7CisjaWZuZGVmIE5PRElBTAorCWRpYWxzdGEgPSBESUFfVU5LOworI2lmZGVmIENLX1RBUEkKKwkvKiBpZiB0aGUgbGluZSBpcyBhIHRhcGkgZGV2aWNlLCB0aGVuIHdlIG5lZWQgdG8gYXV0by1leGVjdXRlICovCisJLyogU0VUIE1PREVNIFRZUEUgVEFQSSAtIHdoaWNoIHdlIGRvIHRoZSBlcXVpdmFsZW50IG9mIGhlcmUuICAqLworCWlmICh0dHRhcGkpIHsKKwkgICAgZXh0ZXJuIGludCB1c2VybWRtOworCSAgICB1c2VybWRtID0gMDsKKwkgICAgaW5pdG1kbSgzOCk7CQkvKiBGcm9tIGNrdWRpYS5jIG5fVEFQSSA9PSAzOCAqLworCX0KKyNlbmRpZiAvKiBDS19UQVBJICovCisjZW5kaWYgLyogTk9ESUFMICovCisJc3VjY2VzcyA9IDE7CisgICAgfSBlbHNlIHsJCQkJLyogRmFpbGVkICovCisjaWZkZWYgT1MyT05MWQorCWlmICghc3RyY21wKHMsZGZ0dHkpKSAgIC8qIERvIG5vdCBnZW5lcmF0ZSBhbiBlcnJvciB3aXRoIGRmdHR5ICovCisJICA7CisJZWxzZSBpZiAoeSA9PSAtNiAmJiB0dHNsaXApIHsKKwkgICAgbWFrZXN0cigmc2xtc2csIkNhbid0IGFjY2VzcyBTTElQIGRyaXZlciIpOworCSAgICBpZiAobXNnKSBwcmludGYoIj8lc1xuIixzbG1zZyk7CisJfSBlbHNlIGlmICh5ID09IC02ICYmIHR0cHBwKSB7CisJICAgIG1ha2VzdHIoJnNsbXNnLCJDYW4ndCBhY2Nlc3MgUFBQIGRyaXZlciIpOworCSAgICBpZiAobXNnKSBwcmludGYoIj8lc1xuIixzbG1zZyk7CisJfSBlbHNlCisjZW5kaWYgLyogT1MyT05MWSAqLworCSAgaWYgKHkgPT0gLTIpIHsKKwkgICAgICBtYWtlc3RyKCZzbG1zZywiVGltZWQgb3V0IC0gbm8gY2FycmllciIpOworCSAgICAgIGlmIChtc2cpIHsKKwkJICBwcmludGYoIj8lc1xuIixzbG1zZyk7CisJCSAgaWYgKGhpbnRzKSB7CisJCSAgICAgIHByaW50ZigiXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKwkJICAgICAgcHJpbnRmKAorCQkgICAgICAgIkhJTlQgKFVzZSBTRVQgSElOVFMgT0ZGIHRvIHN1cHByZXNzIGZ1dHVyZSBoaW50cyk6XG4iKTsKKwkJICAgICAgcHJpbnRmKAorCQkJICAiVHJ5IFNFVCBDQVJSSUVSIE9GRiBhbmQgU0VUIExJTkUgYWdhaW4sIG9yIGVsc2VcbiIpOworCQkgICAgICBwcmludGYoIlNFVCBNT0RFTSwgU0VUIExJTkUsIGFuZCB0aGVuIERJQUwuXG4iKTsKKwkJICAgICAgcHJpbnRmKCIqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiIpOworCQkgIH0KKwkgICAgICB9CisJICB9IGVsc2UgaWYgKHkgPT0gLTMpIHsKKwkgICAgICBtYWtlc3RyKCZzbG1zZywiQWNjZXNzIHRvIGxvY2sgZGVuaWVkIik7CisJICAgICAgaWYgKG1zZykgeworI2lmZGVmIFVOSVgKKwkJICBwcmludGYoCisJCSAgICJTb3JyeSwgd3JpdGUgYWNjZXNzIHRvIFVVQ1AgbG9ja2ZpbGUgZGlyZWN0b3J5IGRlbmllZC5cbiIpOworI2lmbmRlZiBOT0hJTlRTCisJCSAgaWYgKGhpbnRzKSB7CisJCSAgICAgIHByaW50ZigiXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKwkJICAgICAgcHJpbnRmKAorCQkgICAgICAgIkhJTlQgKFVzZSBTRVQgSElOVFMgT0ZGIHRvIHN1cHByZXNzIGZ1dHVyZSBoaW50cyk6XG4iKTsKKwkJICAgICAgcHJpbnRmKAorCSAgIlBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGZpbGUsICVzY2t1aW5zLnR4dCxcbiIsCisJICAgICAgICAgICAgICAgICAgICAga19pbmZvX2RpciA/IGtfaW5mb19kaXIgOiAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCQkgICAgICBwcmludGYoCisJICAib3IgdGhlIFVOSVggYXBwZW5kaXggb2YgdGhlIG1hbnVhbCwgXCJVc2luZyBDLUtlcm1pdFwiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisJCSAgICAgIHByaW50ZigKKyAgICAgICAgICAib3IgdmlzaXQgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrdWlucy5odG1sIFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCQkgICAgICBwcmludGYoIioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7CisJCSAgfQorI2VuZGlmIC8qIE5PSElOVFMgKi8KKyNlbHNlCisJCSAgcHJpbnRmKCJTb3JyeSwgYWNjZXNzIHRvIGxvY2sgZGVuaWVkOiAlc1xuIixzKTsKKyNlbmRpZiAvKiBVTklYICovCisJICAgICAgfQorCSAgfSBlbHNlIGlmICh5ID09IC00KSB7CisJICAgICAgbWFrZXN0cigmc2xtc2csIkFjY2VzcyB0byBkZXZpY2UgZGVuaWVkIik7CisJICAgICAgaWYgKG1zZykgeworCQkgIHByaW50ZigiU29ycnksIGFjY2VzcyB0byBkZXZpY2UgZGVuaWVkOiAlc1xuIixzKTsKKyNpZmRlZiBVTklYCisjaWZuZGVmIE5PSElOVFMKKwkJICBpZiAoaGludHMpIHsKKwkJICAgICAgcHJpbnRmKCJcbioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCQkgICAgICBwcmludGYoCisJCSAgICAgICJISU5UIChVc2UgU0VUIEhJTlRTIE9GRiB0byBzdXBwcmVzcyBmdXR1cmUgaGludHMpOlxuIik7CisJCSAgICAgIHByaW50ZigKKwkgICAgIlBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGZpbGUsICVzY2t1aW5zLnR4dCxcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtfaW5mb19kaXIgPyBrX2luZm9fZGlyIDogIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKwkJICAgICAgcHJpbnRmKAorCSAgICAib3IgdGhlIFVOSVggYXBwZW5kaXggb2YgdGhlIG1hbnVhbCwgXCJVc2luZyBDLUtlcm1pdFwiLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCQkgICAgICBwcmludGYoIioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7CisJCSAgfQorI2VuZGlmIC8qIE5PSElOVFMgKi8KKyNlbmRpZiAvKiBVTklYICovCisJICAgICAgfQorCSAgfSBlbHNlIGlmICh5ID09IC01KSB7CisJICAgICAgbWFrZXN0cigmc2xtc2csIkRldmljZSBpcyBpbiB1c2Ugb3IgdW5hdmFpbGFibGUiKTsKKwkgICAgICBpZiAobXNnKQorI2lmZGVmIFZNUworCQlwcmludGYoCisJCSAgIlNvcnJ5LCBkZXZpY2UgaXMgaW4gdXNlIG9yIG90aGVyd2lzZSB1bmF2YWlsYWJsZTogJXNcbiIscyk7CisjZWxzZQorCSAgICAgIHByaW50ZigiU29ycnksIGRldmljZSBpcyBpbiB1c2U6ICVzXG4iLHMpOworI2VuZGlmIC8qIFZNUyAqLworCSAgfSBlbHNlIHsJCQkvKiBPdGhlciBlcnJvci4gKi8KKwkgICAgICBtYWtlc3RyKCZzbG1zZywiRGV2aWNlIG9wZW4gZmFpbGVkIik7CisJICAgICAgaWYgKAorI2lmZGVmIFZNUworCQkgIDEKKyNlbHNlCisJCSAgZXJybm8KKyNlbmRpZiAvKiBWTVMgKi8KKwkJICApIHsKKwkJICBpbnQgeDsJCS8qIEZpbmQgYSBzYWZlLCBsb25nIGJ1ZmZlciAqLworCQkgIG1ha2VzdHIoJnNsbXNnLGNrX2VycnN0cigpKTsKKyNpZm5kZWYgVk1TCisJCSAgZGVidWcoRjExMSwiY3hfc2VyaWFsIHNlcmlhbCBlcnJubyIsc2xtc2csZXJybm8pOworI2VuZGlmIC8qIFZNUyAqLworCQkgIGlmIChtc2cpCisJCSAgICBwcmludGYoIkNvbm5lY3Rpb24gdG8gJXMgZmFpbGVkOiAlc1xuIixzLHNsbXNnKTsKKwkgICAgICB9IGVsc2UgaWYgKG1zZykKKwkJcHJpbnRmKCJTb3JyeSwgY2FuJ3Qgb3BlbiBjb25uZWN0aW9uOiAlc1xuIixzKTsKKwkgIH0KKyAgICB9CisgICAgbmV0d29yayA9IDA7CQkJLyogTm8gbmV0d29yayBjb25uZWN0aW9uIGFjdGl2ZSAqLworICAgIHNwZWVkID0gdHRnc3BkKCk7CisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIGxvY2FsID0gZGZsb2M7ICAgICAgICAgICAgICAgICAgLyogR28gYmFjayB0byBub3JtYWwgKi8KKyNpZm5kZWYgTUFDCisgICAgICAgIGNrc3RybmNweSh0dG5hbWUsZGZ0dHksVFROQU1MRU4pOyAvKiBSZXN0b3JlIGRlZmF1bHQgdHR5IG5hbWUgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKyAgICAgICAgaGF2ZWxpbmUgPSAwOworICAgICAgICBpZiAobWRtdHlwIDwgMCkgeyAgICAgICAgICAgICAgIC8qIFN3aXRjaGluZyBmcm9tIG5ldCB0byBhc3luYz8gKi8KKyAgICAgICAgICAgIGlmIChtZG1zYXYgPiAtMSkgICAgICAgICAgICAvKiBSZXN0b3JlIG1vZGVtIHR5cGUgZnJvbSBsYXN0ICovCisgICAgICAgICAgICAgIG1kbXR5cCA9IG1kbXNhdjsgICAgICAgICAgLyogU0VUIE1PREVNIGNvbW1hbmQsIGlmIGFueS4gKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgbWRtdHlwID0gMDsKKyAgICAgICAgICAgIG1kbXNhdiA9IC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybihtc2cgPyAtOSA6IDApOwkJLyogUmV0dXJuIGZhaWx1cmUgKi8KKyAgICB9CisgICAgaWYgKF9sb2NhbCA+IC0xKQorICAgICAgbG9jYWwgPSBfbG9jYWw7CQkJLyogT3BlbmVkIG9rLCBzZXQgbG9jYWwvcmVtb3RlLiAqLworICAgIG1ha2VzdHIoJnNsbXNnLE5VTEwpOwkJLyogRXJhc2UgU0VUIExJTkUgbWVzc2FnZSAqLworICAgIGNrc3RybmNweSh0dG5hbWUscyxUVE5BTUxFTik7ICAgICAgIC8qIENvcHkgbmFtZSBpbnRvIHJlYWwgcGxhY2UuICovCisgICAgZGVidWcoRjExMCwiY3hfc2VyaWFsIG9rIix0dG5hbWUsMCk7CisjaWZuZGVmIE5PWEZFUgorICAgIGlmICgocmVsaWFibGUgIT0gU0VUX09GRiB8fCAhc2V0cmVsaWFibGUpKSAvKiBBc3N1bWUgbm90IHJlbGlhYmxlLiAqLworICAgICAgcmVsaWFibGUgPSBTRVRfT0ZGOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisgIHhjeF9zZXJpYWw6CisgICAgc2V0ZmxvdygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGFwcHJvcHJpYXRlIGZsb3cgY29udHJvbCAqLworICAgIGhhdmVsaW5lID0gMTsKKyNpZmRlZiBDS0xPR0RJQUwKKyAgICAgIGRvbG9nbGluZSgpOworI2VuZGlmIC8qIENLTE9HRElBTCAqLworCisjaWZuZGVmIE5PU1BMCisgICAgaWYgKGxvY2FsKSB7CisgICAgICAgIGlmIChubWFjKSB7ICAgICAgICAgICAgICAgICAgICAgLyogQW55IG1hY3JvcyBkZWZpbmVkPyAqLworICAgICAgICAgICAgaW50IGs7ICAgICAgICAgICAgICAgICAgICAgIC8qIFllcyAqLworICAgICAgICAgICAgayA9IG1sb29rKG1hY3RhYiwib25fb3BlbiIsbm1hYyk7ICAgLyogTG9vayB0aGlzIHVwICovCisgICAgICAgICAgICBpZiAoayA+PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBmb3VuZCwgKi8KKyAgICAgICAgICAgICAgICBpZiAoZG9kbyhrLHR0bmFtZSwwKSA+IC0xKSAgICAgIC8qIHNldCBpdCB1cCwgKi8KKyAgICAgICAgICAgICAgICAgIHBhcnNlcigxKTsgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBleGVjdXRlIGl0ICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKworICAgIGlmIChsb2NhbCAmJiAoY3ggfHwgc3gpKSB7ICAgICAgICAgIC8qIC9DT05ORUNUIG9yIC9TRVJWRVIgc3dpdGNoIGdpdmVuICovCisgICAgICAgIGV4dGVybiBpbnQgY2FycmllcjsKKyAgICAgICAgaWYgKGNhcnJpZXIgIT0gQ0FSX09GRikgewkvKiBMb29raW5nIGZvciBjYXJyaWVyPyAqLworICAgICAgICAgICAgLyogT3BlbigpIHR1cm5zIG9uIERUUiAtLSB3YWl0IHVwIHRvIGEgc2Vjb25kIGZvciBDRCB0byBjb21lIHVwICovCisgICAgICAgICAgICBpbnQgaSwgeDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7ICAvKiBXQUlUIDEgQ0QuLi4gKi8KKyAgICAgICAgICAgICAgICB4ID0gdHRnbWRtKCk7CisgICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHggJiBCTV9EQ0QpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtc2xlZXAoMTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY3gpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIC9DT05ORUNUICovCisgICAgICAgICAgICAvKiBDb21tYW5kIHdhcyBjb25maXJtZWQgc28gd2UgY2FuIHByZS1wb3AgY29tbWFuZCBsZXZlbC4gKi8KKyAgICAgICAgICAgIC8qIFRoaXMgaXMgc28gQ09OTkVDVCBtb2R1bGUgd29uJ3QgdGhpbmsgd2UncmUgZXhlY3V0aW5nIGEgKi8KKyAgICAgICAgICAgIC8qIHNjcmlwdCBpZiBDT05ORUNUIHdhcyB0aGUgZmluYWwgY29tbWFuZCBpbiB0aGUgc2NyaXB0LiAqLworCisgICAgICAgICAgICBpZiAoY21kbHZsID4gMCkKKyAgICAgICAgICAgICAgcHJlcG9wKCk7CisjaWZuZGVmIE5PRElBTAorICAgICAgICAgICAgZGlhbHN0YSA9IERJQV9VTks7CisjZW5kaWYgLyogTk9ESUFMICovCisjaWZkZWYgTE9DVVMKKyAgICAgICAgICAgIGlmIChhdXRvbG9jdXMpIHsKKyAgICAgICAgICAgICAgICBzZXRsb2N1cygxLDEpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIExPQ1VTICovCisgICAgICAgICAgICBzdWNjZXNzID0gZG9jb25lY3QoMCwgY21kbHZsID09IDAgPyAxIDogMCk7CisgICAgICAgICAgICBpZiAodHRjaGsoKSA8IDApCisgICAgICAgICAgICAgIGRvbG9nZW5kKCk7CisgICAgICAgICAgICByZXR1cm4oc3VjY2Vzcyk7CisjaWZuZGVmIE5PWEZFUgorICAgICAgICB9IGVsc2UgaWYgKHN4KSB7ICAgICAgICAgICAgICAgIC8qIC9TRVJWRVIgKi8KKyAgICAgICAgICAgIHNzdGF0ZSA9ICd4JzsKKyNpZmRlZiBNQUMKKyAgICAgICAgICAgIHdoYXQgPSBXX1JFQ1Y7CisgICAgICAgICAgICBzY3JjcmVhdGUoKTsKKyNlbmRpZiAvKiBNQUMgKi8KKyAgICAgICAgICAgIGlmIChsb2NhbCkgZGlzcGxhID0gMTsKKyNpZmRlZiBBTUlHQQorICAgICAgICAgICAgcmVxb2ZmKCk7ICAgICAgICAgICAgICAgICAgIC8qIE5vIERPUyByZXF1ZXN0b3JzIHdoaWxlIHNlcnZlciAqLworI2VuZGlmIC8qIEFNSUdBICovCisjZW5kaWYgLyogTk9YRkVSICovCisgICAgICAgIH0KKyAgICB9CisjaWZuZGVmIE5PRElBTAorICAgIGRpYWxzdGEgPSBESUFfVU5LOworI2VuZGlmIC8qIE5PRElBTCAqLworI2lmZGVmIExPQ1VTCisgICAgaWYgKGF1dG9sb2N1cykgeworICAgICAgICBzZXRsb2N1cygxLDEpOworICAgIH0KKyNlbmRpZiAvKiBMT0NVUyAqLworICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisKKworLyogUyBFIFQgTCBJIE4gLS0gcGFyc2UgbmFtZSBvZiBhbmQgdGhlbiBvcGVuIGNvbW11bmljYXRpb24gZGV2aWNlLiAqLworLyoKKyAgQ2FsbCB3aXRoOgorICAgIHh4ID09IFhZTElORSBmb3IgYSBzZXJpYWwgKHR0eSkgbGluZSwgWFlIT1NUIGZvciBhIG5ldHdvcmsgaG9zdCwKKyAgICB6eiA9PSAwIG1lYW5zIGlmIHVzZXIgZG9lc24ndCBnaXZlIGEgZGV2aWNlIG5hbWUsIGNvbnRpbnVlIGN1cnJlbnQKKyAgICAgICAgICAgIGFjdGl2ZSBjb25uZWN0aW9uIChpZiBhbnkpOworICAgIHp6ICE9IDAgbWVhbnMgaWYgdXNlciBkb2Vzbid0IGdpdmUgYSBkZXZpY2UgbmFtZSwgdGhlbiBjbG9zZSB0aGUKKyAgICAgICAgICAgIGN1cnJlbnQgY29ubmVjdGlvbiBhbmQgcmVzdG9yZSB0aGUgZGVmYXVsdCBjb21tdW5pY2F0aW9uIGRldmljZS4KKyAgICBmYyA9PSAwIHRvIGp1c3QgbWFrZSB0aGUgY29ubmVjdGlvbiwgMSB0byBhbHNvIENPTk5FQ1QgKGUuZy4gInRlbG5ldCIpLgorKi8KK2ludAorc2V0bGluKHh4LCB6eiwgZmMpIAorICAgIGludCB4eCwgenosIGZjOyAKK3sKKyAgICBleHRlcm4gY2hhciBwd2J1ZltdLCAqIGdfcHN3ZDsKKyAgICBleHRlcm4gaW50IHB3ZmxnLCBwd2NyeXB0LCBnX3BmbGcsIGdfcGNwdCwgbm9sb2NhbDsKKyAgICBpbnQgd2FpdDsKKyAgICAvKiBpbnQgdG5fd2FpdF9zdjsgKi8KKyAgICBpbnQgbXluZXQ7CisgICAgaW50IF9sb2NhbCA9IC0xOworICAgIGludCBjLCBpLCBoYXZlc3dpdGNoID0gMDsKKyAgICBpbnQgaGF2ZXVzZXIgPSAwOworICAgIGludCBnZXR2YWwgPSAwOworICAgIGludCB3aWxkID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGVzcGVjIGhhcyB3aWxkY2FyZHMgKi8KKyAgICBpbnQgY3ggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb25uZWN0IGFmdGVyICovCisgICAgaW50IHN4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmVjb21lIHNlcnZlciBhZnRlciAqLworICAgIGludCBhX3R5cGUgPSAtMTsgICAgICAgICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIHR5cGUgKi8KKyAgICBpbnQgZV90eXBlID0gLTE7ICAgICAgICAgICAgICAgICAgICAvKiBUZWxuZXQgL0VOQ1JZUFQgdHlwZSAqLworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICBpbnQgZW5jcnlwdCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBFbmNyeXB0ZWQ/ICovCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgIGludCBzaHIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoYXJlIHNlcmlhbCBkZXZpY2UgKi8KKyAgICBpbnQgY29uZmlybWVkID0gMDsgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kIGhhcyBiZWVuIGVudGVyZWQgKi8KKyAgICBzdHJ1Y3QgRkRCIHN3LCB0eCwgbng7CisjaWZkZWYgT1MyCisgICAgc3RydWN0IEZEQiBmbDsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIGNoYXIgKiBzczsKKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICBpbnQgcmF3ZmxnID0gMDsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworICAgIGNoYXIgc3J2YnVmW1NSVkJVRlNJWisxXTsKKworI2lmZGVmIE9TMgorI2lmZGVmIE5UCisgICAgaW50IHh4dGFwaSA9IDA7CisjZWxzZQorICAgIGludCB4eHNsaXAgPSAwLCB4eHBwcCA9IDA7CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIGludCBkb3NzaCA9IDA7CisKKyAgICBkZWJ1ZyhGMTAxLCJzZXRsaW4gZmMiLCIiLGZjKTsKKyAgICBkZWJ1ZyhGMTAxLCJzZXRsaW4genoiLCIiLHp6KTsKKyAgICBkZWJ1ZyhGMTAxLCJzZXRsaW4geHgiLCIiLHh4KTsKKworI2lmZGVmIFNTSENNRAorICAgIGlmICh4eCA9PSBYWFNTSCkgeyAgICAgICAgICAgICAgICAgIC8qIFNTSCBiZWNvbWVzIFBUWSBTU0ggLi4uICovCisgICAgICAgIGRvc3NoID0gMTsKKyAgICAgICAgeHggPSBYWUhPU1Q7CisgICAgfQorI2VuZGlmIC8qIFNTSENNRCAqLworCisjaWZkZWYgVE5DT0RFCisgICAgLyogdG5fd2FpdF9zdiA9IHRuX3dhaXRfZmxnOyAqLworICAgIHdhaXQgPSB0bl93YWl0X2ZsZzsKKyNlbHNlCisgICAgLyogdG5fd2FpdF9zdiA9IDA7ICovCisgICAgd2FpdCA9IDA7CisjZW5kaWYgLyogVE5DT0RFICovCisKKyAgICBteW5ldCA9IG5ldHR5cGU7CisKKyAgICBpZiAobm9sb2NhbCkgeworICAgICAgICBtYWtlc3RyKCZzbG1zZywiTWFraW5nIGNvbm5lY3Rpb25zIGlzIGRpc2FibGVkIik7CisgICAgICAgIHByaW50ZigiP1NvcnJ5LCBtYWtpbmcgY29ubmVjdGlvbnMgaXMgZGlzYWJsZWRcbiIpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAobmV0c2F2ZSA+IC0xKQorICAgICAgbmV0dHlwZSA9IG5ldHNhdmU7CisKKyAgICBpZiAoZmMgIT0gMCB8fCB6eiA9PSAwKSAgICAgICAgICAgICAvKiBQcmVzZXQgL0NPTk5FQ1Qgc3dpdGNoICovCisgICAgICBjeCA9IDE7CisKKyAgICBkZWJ1ZyhGMTAxLCJzZXRsaW4gY3giLCIiLGN4KTsKKworICAgICpzcnZidWYgPSBOVUw7CisKKyAgICBsaW5lWzBdID0gTlVMOworICAgIHMgPSBsaW5lOworCisjaWZkZWYgTkVUQ09OTgorI2lmZGVmIENLX1NFQ1VSSVRZCisgICAgaWYgKHRtcHN0cmluZykKKyAgICAgICAgbWFrZXN0cigmdG1wc3RyaW5nLE5VTEwpOworI2VuZGlmIC8qIENLX1NFQ1VSSVRZICovCisgICAgaWYgKHRtcHVzcmlkKQorICAgICAgICBtYWtlc3RyKCZ0bXB1c3JpZCxOVUxMKTsKKyNlbmRpZiAvKiBORVRDT05OICovCisKKyAgICBhdXRvZmxvdyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgYXV0b21hdGljIGZsb3cgc2V0dGluZyAqLworCisgICAgaWYgKHh4ID09IFhZSE9TVCkgeyAgICAgICAgICAgICAgICAgLyogU0VUIEhPU1QgPGhvc3RuYW1lPiAqLworI2lmbmRlZiBORVRDT05OCisgICAgICAgIG1ha2VzdHIoJnNsbXNnLCJOZXR3b3JrIGNvbm5lY3Rpb25zIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcHJpbnRmKCI/JXNcbiIsc2xtc2cpOworICAgICAgICByZXR1cm4oLTkpOworI2Vsc2UgLyogTkVUQ09OTiAqLworI2lmbmRlZiBOT1BVU0gKKyAgICAgICAgaWYgKChteW5ldCA9PSBORVRfQ01EIHx8IG15bmV0ID09IE5FVF9QVFkgfHwgZG9zc2gpICYmIG5vcHVzaCkgeworICAgICAgICAgICAgbWFrZXN0cigmc2xtc2csIkFjY2VzcyB0byBleHRlcm5hbCBjb21tYW5kcyBpcyBkaXNhYmxlZCIpOworICAgICAgICAgICAgcHJpbnRmKCI/U29ycnksIGFjY2VzcyB0byBleHRlcm5hbCBjb21tYW5kcyBpcyBkaXNhYmxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisjZW5kaWYgLyogTk9QVVNIICovCisKKyNpZmRlZiBTU0hDTUQKKyAgICAgICAgaWYgKGRvc3NoKSB7ICAgICAgICAgICAgICAgICAgICAvKiBTU0ggY29ubmVjdGlvbiB2aWEgcHR5ICovCisgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgIGsgPSBja3N0cm5jcHkobGluZSwgc3NoY21kID8gc3NoY21kIDogZGVmc3NoY21kLCBMSU5CVUZTSVopOworICAgICAgICAgICAgZGVidWcoRjExMSwic2V0bGluIHNzaGNtZCAxIixsaW5lLGspOworICAgICAgICAgICAgaWYgKCh4ID0gY210eHQoIk9wdGlvbmFsIHN3aXRjaGVzIGFuZCBob3N0bmFtZSIsIiIsJnMseHhzdHJpbmcpKTwwKQorICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICBpZiAoISpzKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/U1NIIHRvIHdoZXJlP1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChrIDwgTElOQlVGU0laKSB7CisgICAgICAgICAgICAgICAgbGluZVtrKytdID0gU1A7CisgICAgICAgICAgICAgICAgbGluZVtrXSA9IE5VTDsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJzZXRsaW4gc3NoY21kIDIiLGxpbmUsayk7CisgICAgICAgICAgICB9IGlmIChrIDwgTElOQlVGU0laKSB7CisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KCZsaW5lW2tdLHMsTElOQlVGU0laLWspOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsInNldGxpbiBzc2hjbWQgMyIsbGluZSxrKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VG9vIGxvbmdcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisJICAgIHggPSBjeF9uZXQoIE5FVF9QVFksICAgICAgICAgICAgICAgIC8qIG5ldHdvcmsgdHlwZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKG5vdCB1c2VkKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgICAgICAgICAgICAgICAgICAgLyogaG9zdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogc2VydmljZSAobm90IHVzZWQpICovCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiB1c2VybmFtZSAobm90IHVzZWQpICovCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiBwYXNzd29yZCAobm90IHVzZWQpICovCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIChub3QgdXNlZCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLCAgICAgICAgICAgICAgIC8qIHBhcmFtcyAxLTMgKG5vdCB1c2VkKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgLyogY29ubmVjdCBpbW1lZGlhdGVseSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3gsICAgICAgICAgICAgICAgICAgICAgLyogc2VydmVyPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgenosICAgICAgICAgICAgICAgICAgICAgLyogY2xvc2UgY3VycmVudD8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBndWkgKi8KKwkgICAgZGVidWcoRjExMSwic2V0bGluIGN4X25ldCIsbGluZSx4KTsKKwkgICAgcmV0dXJuKHgpOworICAgICAgICB9CisjZW5kaWYgLyogU1NIQ01EICovCisKKy8qCisgIEhlcmUgd2UgcGFyc2Ugb3B0aW9uYWwgc3dpdGNoZXMgYW5kIHRoZW4gdGhlIGhvc3RuYW1lIG9yIHdoYXRldmVyLAorICB3aGljaCBkZXBlbmRzIG9uIHRoZSBuZXR3b3JrIHR5cGUuICBUaGUgdHJpY2t5IHBhcnQgaXMsIHRoZSBuZXR3b3JrIHR5cGUKKyAgY2FuIGJlIHNldCBieSBhIHN3aXRjaC4KKyovCisjaWZuZGVmIE5PU1BMCisgICAgICAgIG1ha2VzdHIoJmdfcHN3ZCxwd2J1Zik7ICAgICAgICAgLyogU2F2ZSBnbG9iYWwgcHdidWYgKi8KKyAgICAgICAgZ19wZmxnID0gcHdmbGc7ICAgICAgICAgICAgICAgICAvKiBhbmQgZmxhZyAqLworICAgICAgICBnX3BjcHQgPSBwd2NyeXB0OworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICAgICAgY29uZmlybWVkID0gMDsKKyAgICAgICAgaGF2ZXN3aXRjaCA9IDA7CisjaWZkZWYgTkVURklMRQorICAgICAgICBpZiAobXluZXQgIT0gTkVUX0ZJTEUpIHsKKyNlbmRpZiAvKiBORVRGSUxFICovCisgICAgICAgICAgICBzcyA9IChteW5ldCA9PSBORVRfQ01EIHx8IG15bmV0ID09IE5FVF9QVFkpID8KKyAgICAgICAgICAgICAgIkNvbW1hbmQsIG9yIHN3aXRjaCIgOgorICAgICAgICAgICAgICAgIChteW5ldCA9PSBORVRfVENQQSB8fCBteW5ldCA9PSBORVRfVENQQgorICAgICAgICAgICAgICAgICAgfHwgbXluZXQgPT0gTkVUX1NTSCkgPworICAgICAgICAgICAgICAgICAgIkhvc3RuYW1lLCBpcC1hZGRyZXNzLCBvciBzd2l0Y2giIDoKKyAgICAgICAgICAgICAgICAgICAgIkhvc3Qgb3Igc3dpdGNoIjsKKyAgICAgICAgICAgIGlmIChmYykgeworICAgICAgICAgICAgICAgIGlmIChteW5ldCA9PSBORVRfVENQQiAmJgorICAgICAgICAgICAgICAgICAgICAodHRucHJvdG8gPT0gTlBfVEVMTkVUIHx8IHR0bnByb3RvID09IE5QX0tFUk1JVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5zaHRlbHRhYikgeworICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZXN3aXRjaCsrOworICAgICAgICAgICAgICAgICAgICAgICAgY21mZGJpKCZzdyxfQ01LRVksc3MsIiIsIiIsbnNodGVsdGFiLDQseHhzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNodGVsdGFiLCZueCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgUkxPR0NPREUKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChteW5ldCA9PSBORVRfVENQQiAmJiB0dG5wcm90byA9PSBOUF9STE9HSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5zaHJsZ3RhYikgeworICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZXN3aXRjaCsrOworICAgICAgICAgICAgICAgICAgICAgICAgY21mZGJpKCZzdyxfQ01LRVksc3MsIiIsIiIsbnNocmxndGFiLDQseHhzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hybGd0YWIsJm54KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYXZlc3dpdGNoKys7CisgICAgICAgICAgICAgICAgY21mZGJpKCZzdyxfQ01LRVksc3MsIiIsIiIsbnNodGFiLDQseHhzdHJpbmcsc2h0YWIsJm54KTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBORVRGSUxFCisgICAgICAgIH0KKyNlbmRpZiAvKiBORVRGSUxFICovCisgICAgICAgIGlmIChteW5ldCA9PSBORVRfVENQQiB8fCBteW5ldCA9PSBORVRfU0xBVCB8fAorCSAgICBteW5ldCA9PSBORVRfU1NIICB8fCBteW5ldCA9PSBORVRfREVDKSB7CisgICAgICAgICAgICBjbWZkYmkoJm54LF9DTUZMRCwiSG9zdCIsIiIsIiIsMCwwLHh4c3RyaW5nLE5VTEwsTlVMTCk7CisjaWZkZWYgTkVURklMRQorICAgICAgICB9IGVsc2UgaWYgKG15bmV0ID09IE5FVF9GSUxFKSB7CisgICAgICAgICAgICBjbWZkYmkoJm54LF9DTUlGSSwiRmlsZW5hbWUiLCIiLCIiLDAsMCx4eHN0cmluZyxOVUxMLE5VTEwpOworI2VuZGlmIC8qIE5FVEZJTEUgKi8KKyNpZmRlZiBQVFlPUlBJUEUKKyAgICAgICAgfSBlbHNlIGlmIChteW5ldCA9PSBORVRfQ01EIHx8IG15bmV0ID09IE5FVF9QVFkpIHsKKyAgICAgICAgICAgIGNtZmRiaSgmbngsX0NNVFhULCJDb21tYW5kIiwiIiwiIiwwLDAseHhzdHJpbmcsTlVMTCxOVUxMKTsKKyNlbmRpZiAvKiBQVFlPUlBJUEUgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNtZmRiaSgmbngsX0NNVFhULCJIb3N0IiwiIiwiIiwwLDAseHhzdHJpbmcsTlVMTCxOVUxMKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgeCA9IGNtZmRiKGhhdmVzd2l0Y2ggPyAmc3cgOiAmbngpOworICAgICAgICAgICAgZGVidWcoRjEwMSwic2V0bGluIGNtZmRiIiwiIix4KTsKKyAgICAgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICAgICAgaWYgKHggIT0gLTMpCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1lZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbXJlc3VsdC5mY29kZSAhPSBfQ01LRVkpIHsgICAgLyogTm90IGEgc3dpdGNoICovCisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmUsY21yZXN1bHQuc3Jlc3VsdCxMSU5CVUZTSVopOyAvKiBTYXZlIHRoZSBkYXRhICovCisgICAgICAgICAgICAgICAgcyA9IGxpbmU7ICAgICAgICAgICAgICAgICAgICAgIC8qIHRoYXQgd2FzIHBhcnNlZC4uLiAqLworICAgICAgICAgICAgICAgIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01JRkkpIHsKKyAgICAgICAgICAgICAgICAgICAgd2lsZCA9IGNtcmVzdWx0Lm5yZXN1bHQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01UWFQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlybWVkID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogYW5kIGJyZWFrIG91dCBvZiB0aGlzIGxvb3AgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMgPSBjbWdicmsoKTsgICAgICAgICAgICAgICAvKiBIYXZlIHN3aXRjaCAtIGdldCBicmVhayBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIGdldHZhbCA9IChjID09ICc6JyB8fCBjID09ICc9Jyk7IC8qIE11c3QgcGFyc2UgYW4gYWd1bWVudD8gKi8KKyAgICAgICAgICAgIGlmIChnZXR2YWwgJiYgIShjbXJlc3VsdC5rZmxhZ3MgJiBDTV9BUkcpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggZG9lcyBub3QgdGFrZSBhcmd1bWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWdldHZhbCAmJiAoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGNtcmVzdWx0Lm5yZXN1bHQpIHsgLyogSXQncyBhIHN3aXRjaC4uICovCisgICAgICAgICAgICAgIGNhc2UgU0xfQ05YOiAgICAgICAgICAgICAgLyogL0NPTk5FQ1QgKi8KKyAgICAgICAgICAgICAgICBjeCA9IDE7CisgICAgICAgICAgICAgICAgc3ggPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFNMX1NSVjogICAgICAgICAgICAgIC8qIC9TRVJWRVIgKi8KKyAgICAgICAgICAgICAgICBjeCA9IDA7CisgICAgICAgICAgICAgICAgc3ggPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIE5FVENNRAorICAgICAgICAgICAgICBjYXNlIFNMX0NNRDogICAgICAgICAgICAgIC8qIC9DT01NQU5EICovCisgICAgICAgICAgICAgICAgbmV0c2F2ZSA9IG15bmV0OworICAgICAgICAgICAgICAgIG15bmV0ID0gTkVUX0NNRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNpZmRlZiBORVRQVFkKKyAgICAgICAgICAgICAgY2FzZSBTTF9QVFk6ICAgICAgICAgICAgICAvKiAvUFRZICovCisgICAgICAgICAgICAgICAgbmV0c2F2ZSA9IG15bmV0OworICAgICAgICAgICAgICAgIG15bmV0ID0gTkVUX1BUWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBORVRQVFkgKi8KKyAgICAgICAgICAgICAgY2FzZSBTTF9ORVQ6ICAgICAgICAgICAgICAvKiAvTkVUV09SSy1UWVBFICovCisgICAgICAgICAgICAgICAgaWYgKCh4ID0gY21rZXkobmV0Y21kLG5uZXRzLCIiLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgIG15bmV0ID0geDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIENLX1NFQ1VSSVRZCisgICAgICAgICAgICAgIGNhc2UgU0xfUFNXOiAgICAgICAgICAgICAgLyogL1BBU1NXT1JEOiAqLworICAgICAgICAgICAgICAgIGlmICghZ2V0dmFsKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVib2sgPSAwOworICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKCJQYXNzd29yZCIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnRtcHN0cmluZywiIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzID0gYnJzdHJpcChzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh4ID0gKGludClzdHJsZW4ocykpID4gUFdCVUZMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzbG1zZywiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCB0b28gbG9uZyAtIG1heCA9ICVkXG4iLFBXQlVGTCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnRtcHN0cmluZyxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfU0VDVVJJVFkgKi8KKworICAgICAgICAgICAgICBjYXNlIFNMX1VJRDogICAgICAgICAgICAgIC8qIC9VU0VSSUQ6ICovCisgICAgICAgICAgICAgICAgaWYgKCFnZXR2YWwpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoKHggPSBjbWZsZCgiVXNlcmlkIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmdG1wdXNyaWQsIiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IGJyc3RyaXAocyk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9IChpbnQpc3RybGVuKHMpKSA+IDYzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzbG1zZywiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1NvcnJ5LCB0b28gbG9uZyAtIG1heCA9ICVkXG4iLDYzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmdG1wdXNyaWQscyk7CisgICAgICAgICAgICAgICAgICAgIGhhdmV1c2VyID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorI2lmZGVmIENLX1NSUAorICAgICAgICAgICAgICBjYXNlIFNMX1NSUDoKKyAgICAgICAgICAgICAgICBhX3R5cGUgPSBBVVRIVFlQRV9TUlA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfU1JQICovCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICAgIGNhc2UgU0xfU1NMOgorICAgICAgICAgICAgICAgIGFfdHlwZSA9IEFVVEhUWVBFX1NTTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBOVAorICAgICAgICAgICAgICBjYXNlIFNMX05UTE06CisgICAgICAgICAgICAgICAgYV90eXBlID0gQVVUSFRZUEVfTlRMTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIENLX0tFUkJFUk9TCisgICAgICAgICAgICAgIGNhc2UgU0xfS1JCNDoKKyAgICAgICAgICAgICAgICBhX3R5cGUgPSBBVVRIVFlQRV9LRVJCRVJPU19WNDsKKyAgICAgICAgICAgICAgICBpZiAodHRucHJvdG8gPT0gTlBfUkxPR0lOKQorICAgICAgICAgICAgICAgICAgdHRucHJvdG8gPQorI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdCA/IE5QX0VLNExPR0lOIDoKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICAgICAgICAgICAgTlBfSzRMT0dJTjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0dG5wcm90byA9PSBOUF9LNUxPR0lOKQorICAgICAgICAgICAgICAgICAgdHRucHJvdG8gPSBOUF9LNExPR0lOOworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0dG5wcm90byA9PSBOUF9FSzVMT0dJTikKKyAgICAgICAgICAgICAgICAgIHR0bnByb3RvID0gTlBfRUs0TE9HSU47CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFNMX0tSQjU6CisgICAgICAgICAgICAgICAgYV90eXBlID0gQVVUSFRZUEVfS0VSQkVST1NfVjU7CisgICAgICAgICAgICAgICAgaWYgKHR0bnByb3RvID09IE5QX1JMT0dJTikKKyAgICAgICAgICAgICAgICAgIHR0bnByb3RvID0KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgICAgIGVuY3J5cHQgPyBOUF9FSzVMT0dJTiA6CisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworICAgICAgICAgICAgICAgICAgICAgIE5QX0s1TE9HSU47CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHRucHJvdG8gPT0gTlBfSzRMT0dJTikKKyAgICAgICAgICAgICAgICAgIHR0bnByb3RvID0gTlBfSzVMT0dJTjsKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHRucHJvdG8gPT0gTlBfRUs0TE9HSU4pCisgICAgICAgICAgICAgICAgICB0dG5wcm90byA9IE5QX0VLNUxPR0lOOworI2VuZGlmIC8qIENLX0VOQ1JZUFRJT04gKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworICAgICAgICAgICAgICBjYXNlIFNMX0FVVEg6IHsKKyAgICAgICAgICAgICAgICAgIGV4dGVybiBzdHJ1Y3Qga2V5dGFiIGF1dHlwdGFiW107CisgICAgICAgICAgICAgICAgICBleHRlcm4gaW50IG5hdXR5cDsKKyAgICAgICAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KGF1dHlwdGFiLG5hdXR5cCwidHlwZSBvZiBhdXRoZW50aWNhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0b21hdGljIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgICAgYV90eXBlID0geDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgIGNhc2UgU0xfRU5DOgorICAgICAgICAgICAgICAgIHN3aXRjaCAodHRucHJvdG8pIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgTlBfSzRMT0dJTjoKKyAgICAgICAgICAgICAgICAgICAgdHRucHJvdG8gPSBOUF9FSzRMT0dJTjsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBOUF9LNUxPR0lOOgorICAgICAgICAgICAgICAgICAgICB0dG5wcm90byA9IE5QX0VLNUxPR0lOOworICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIE5QX0tFUk1JVDoKKyAgICAgICAgICAgICAgICAgIGNhc2UgTlBfVEVMTkVUOiB7CisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHN0cnVjdCBrZXl0YWIgKiB0bmV0YmwgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgbnRuZXRibCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgeCA9IGNrX2dldF9jcnlwdF90YWJsZSgmdG5ldGJsLCZudG5ldGJsKTsKKyAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJja19nZXRfY3J5cHRfdGFibGUgeCIsIiIseCk7CisgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiY2tfZ2V0X2NyeXB0X3RhYmxlIG4iLCIiLG50bmV0YmwpOworICAgICAgICAgICAgICAgICAgICAgIGlmICh4IDwgMSB8fCAhdG5ldGJsIHx8IG50bmV0YmwgPCAxKSAvKiBEaWRuJ3QgZ2V0IGl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc2xtc2csIkludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP09vcHMsIHR5cGVzIG5vdCBsb2FkZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBpZiAoKHggPSBjbWtleSh0bmV0YmwsbnRuZXRibCwidHlwZSBvZiBlbmNyeXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0b21hdGljIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICAgICAgICBlX3R5cGUgPSB4OworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisgICAgICAgICAgICAgIGNhc2UgU0xfV0FJVDoKKyAgICAgICAgICAgICAgICB3YWl0ID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBTTF9OT1dBSVQ6CisgICAgICAgICAgICAgICAgd2FpdCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmZGVmIE5FVEZJTEUKKyAgICAgICAgaWYgKG15bmV0ID09IE5FVF9GSUxFKSB7ICAgICAgICAvKiBQYXJzZWQgYnkgY21pZmkoKSAqLworCSAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCS8qIE5lZWRzIGNvbmZpcm1hdGlvbiAqLworCSAgICAgIHJldHVybih4KTsKKwkgICAgeCA9IGN4X25ldChteW5ldCwJCS8qIG5ldHR5cGUgKi8KKwkJICAgICAgIDAsCQkvKiBwcm90b2NvbCAobm90IHVzZWQpICovCisJCSAgICAgICBsaW5lLAkJLyogaG9zdCAqLworCQkgICAgICAgIiIsCQkvKiBwb3J0ICovCisJCSAgICAgICBOVUxMLAkJLyogYWx0ZXJuYXRlIHVzZXJuYW1lICovCisJCSAgICAgICBOVUxMLAkJLyogcGFzc3dvcmQgKi8KKwkJICAgICAgIE5VTEwsCQkvKiBjb21tYW5kIHRvIGV4ZWN1dGUgKi8KKwkJICAgICAgIDAsCQkvKiBwYXJhbTEgKi8KKwkJICAgICAgIDAsCQkvKiBwYXJhbTIgKi8KKwkJICAgICAgIDAsCQkvKiBwYXJhbTMgKi8KKwkJICAgICAgIGN4LAkJLyogZW50ZXIgQ09OTkVDVCBtb2RlICovCisJCSAgICAgICBzeCwJCS8qIGVudGVyIFNFUlZFUiBtb2RlICovCisJCSAgICAgICB6eiwJCS8qIGNsb3NlIGNvbm5lY3Rpb24gaWYgb3BlbiAqLworCQkgICAgICAgMAkJLyogZ3VpICovCisJCSAgICAgICApOworICAgICAgICB9CisjZW5kaWYgLyogTkVURklMRSAqLworCisjaWZkZWYgTkVUQ01ECisgICAgICAgIGlmIChteW5ldCA9PSBORVRfQ01EIHx8IG15bmV0ID09IE5FVF9QVFkpIHsKKyAgICAgICAgICAgIGNoYXIgKnAgPSBOVUxMOworICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHggPSBjbXR4dCgiUmVzdCBvZiBjb21tYW5kIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICBpZiAoKnMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybmNhdChsaW5lLCIgIixMSU5CVUZTSVopOworICAgICAgICAgICAgICAgICAgICBzdHJuY2F0KGxpbmUscyxMSU5CVUZTSVopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzID0gbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHMgPT0gbGluZSAtIHNvIHdlIG11c3QgcHJvdGVjdCB0aGUgbGluZSBidWZmZXIgKi8KKyAgICAgICAgICAgIHMgPSBicnN0cmlwKHMpOworICAgICAgICAgICAgbWFrZXN0cigmcCxzKTsKKyAgICAgICAgICAgIGNrc3RybmNweShsaW5lLHAsTElOQlVGU0laKTsKKyAgICAgICAgICAgIG1ha2VzdHIoJnAsTlVMTCk7CisKKyAgICAgICAgICAgIHggPSBjeF9uZXQoIG15bmV0LCAgICAgICAgICAgICAgICAgIC8qIG5ldHR5cGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sIChub3QgdXNlZCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsICAgICAgICAgICAgICAgICAgIC8qIGhvc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgIC8qIHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIGFsdGVybmF0ZSB1c2VybmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogcGFzc3dvcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgdG8gZXhlY3V0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogcGFyYW0xICovCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcmFtMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgY3gsICAgICAgICAgICAgICAgICAgICAgLyogZW50ZXIgQ09OTkVDVCBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICBzeCwgICAgICAgICAgICAgICAgICAgICAvKiBlbnRlciBTRVJWRVIgbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgenosICAgICAgICAgICAgICAgICAgICAgLyogY2xvc2UgY29ubmVjdGlvbiBpZiBvcGVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAvKiBndWkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBORVRDTUQgKi8KKworI2lmZGVmIE5QSVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWVkIHBpcGUgKi8KKyAgICAgICAgaWYgKG15bmV0ID09IE5FVF9QSVBFKSB7ICAgICAgICAvKiBOZWVkcyBiYWNrc2xhc2ggdHdpZGRsaW5nICovCisgICAgICAgICAgICBpZiAobGluZVswXSkgeworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAobGluZSwiKiIpKSB7ICAgIC8qIElmIHJlbW90ZSwgYmVnaW4gd2l0aCAqLworICAgICAgICAgICAgICAgICAgICBjaGFyICogcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnAsbGluZSk7ICAgICAgCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShsaW5lLCJcXFxcIixMSU5CVUZTSVopOyAvKiBzZXJ2ZXIgbmFtZSAqLworICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQobGluZSxwLExJTkJVRlNJWik7CisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnAsTlVMTCk7ICAgICAgCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZVswXT0nXDAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBja3N0cm5jYXQobGluZSwiXFxwaXBlXFwiLCBMSU5CVUZTSVopOyAvKiBNYWtlIHBpcGUgbmFtZSAqLworICAgICAgICAgICAgICAgIGNrc3RybmNhdChsaW5lLHBpcGVuYW1lLCBMSU5CVUZTSVopOyAvKiBBZGQgbmFtZSBvZiBwaXBlICovCisKKyAgICAgICAgICAgICAgICB4ID0gY3hfbmV0KG15bmV0LAkvKiBuZXR0eXBlICovCisJCQkgICAwLAkJLyogcHJvdG9jb2wgKG5vdCB1c2VkKSAqLworCQkJICAgbGluZSwJLyogaG9zdCAqLworCQkJICAgIiIsCQkvKiBwb3J0ICovCisJCQkgICBOVUxMLAkvKiBhbHRlcm5hdGUgdXNlcm5hbWUgKi8KKwkJCSAgIE5VTEwsCS8qIHBhc3N3b3JkICovCisJCQkgICBOVUxMLAkvKiBjb21tYW5kIHRvIGV4ZWN1dGUgKi8KKwkJCSAgIDAsCQkvKiBwYXJhbTEgKi8KKwkJCSAgIDAsCQkvKiBwYXJhbTIgKi8KKwkJCSAgIDAsCQkvKiBwYXJhbTMgKi8KKwkJCSAgIGN4LAkJLyogZW50ZXIgQ09OTkVDVCBtb2RlICovCisJCQkgICBzeCwJCS8qIGVudGVyIFNFUlZFUiBtb2RlICovCisJCQkgICB6eiwJCS8qIGNsb3NlIGNvbm5lY3Rpb24gaWYgb3BlbiAqLworCQkJICAgMAkJLyogZ3VpICovCisJCQkgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogTlBJUEUgKi8KKworI2lmZGVmIFNVUEVSTEFUCisgICAgICAgIGlmIChteW5ldCA9PSBORVRfU0xBVCkgeyAgICAgICAgLyogTmVlZHMgcGFzc3dvcmQsIGV0Yy4gKi8KKyAgICAgICAgICAgIHNsYXRfcHdkWzBdID0gTlVMOyAgICAgICAgICAvKiBFcmFzZSBhbnkgcHJldmlvdXMgcGFzc3dvcmQgKi8KKyAgICAgICAgICAgIGRlYm9rID0gMDsKKyAgICAgICAgICAgIGlmICgqbGluZSkgewkJLyogSWYgdGhleSBnYXZlIGEgaG9zdCBuYW1lLi4uICovCisgICAgICAgICAgICAgICAgaWYgKCh4ID0gY21mbGQoCisgICAgICAgICAgICAgICAgICAgICAicGFzc3dvcmQsXG4gb3IgY2FycmlhZ2UgcmV0dXJuIGlmIG5vIHBhc3N3b3JkIHJlcXVpcmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpIDwgMCAmJiB4ICE9IC0zKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgIGNrc3RybmNweShzbGF0X3B3ZCxzLDE4KTsgLyogU2V0IHRoZSBwYXNzd29yZCwgaWYgYW55ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsgLyogQ29uZmlybSB0aGUgY29tbWFuZCAqLworCisgICAgICAgICAgICB4ID0gY3hfbmV0KG15bmV0LAkJLyogbmV0dHlwZSAqLworICAgICAgICAgICAgICAgICAgICAgICAwLAkJLyogcHJvdG9jb2wgKG5vdCB1c2VkKSAqLworICAgICAgICAgICAgICAgICAgICAgICBsaW5lLAkJLyogaG9zdCAqLworICAgICAgICAgICAgICAgICAgICAgICAiIiwJCS8qIHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwJCS8qIGFsdGVybmF0ZSB1c2VybmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAkJLyogcGFzc3dvcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwJCS8qIGNvbW1hbmQgdG8gZXhlY3V0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAwLAkJLyogcGFyYW0xICovCisgICAgICAgICAgICAgICAgICAgICAgIDAsCQkvKiBwYXJhbTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgMCwJCS8qIHBhcmFtMyAqLworICAgICAgICAgICAgICAgICAgICAgICBjeCwJCS8qIGVudGVyIENPTk5FQ1QgbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICBzeCwJCS8qIGVudGVyIFNFUlZFUiBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgIHp6LAkJLyogY2xvc2UgY29ubmVjdGlvbiBpZiBvcGVuICovCisgICAgICAgICAgICAgICAgICAgICAgIDAJCS8qIGd1aSAqLworICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisjZW5kaWYgLyogU1VQRVJMQVQgKi8KKworI2lmZGVmIERFQ05FVAorICAgICAgICBpZiAobXluZXQgPT0gTkVUX0RFQykgeyAgCisgICAgICAgICAgICBpZiAoIWxpbmVbMF0pIHsgICAgICAgICAgICAgICAgICAgLyogSWYgdGhleSBnYXZlIGEgaG9zdCBuYW1lLi4uICovCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/aG9zdG5hbWUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsgLyogQ29uZmlybSB0aGUgY29tbWFuZCAqLworCisgICAgICAgICAgICB4ID0gY3hfbmV0KG15bmV0LAkJLyogbmV0dHlwZSAqLworICAgICAgICAgICAgICAgICAgICAgICAwLAkJLyogcHJvdG9jb2wgKG5vdCB1c2VkKSAqLworICAgICAgICAgICAgICAgICAgICAgICBsaW5lLAkJLyogaG9zdCAqLworICAgICAgICAgICAgICAgICAgICAgICAiIiwJCS8qIHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwJCS8qIGFsdGVybmF0ZSB1c2VybmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAkJLyogcGFzc3dvcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwJCS8qIGNvbW1hbmQgdG8gZXhlY3V0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAwLAkJLyogcGFyYW0xICovCisgICAgICAgICAgICAgICAgICAgICAgIDAsCQkvKiBwYXJhbTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgMCwJCS8qIHBhcmFtMyAqLworICAgICAgICAgICAgICAgICAgICAgICBjeCwJCS8qIGVudGVyIENPTk5FQ1QgbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICBzeCwJCS8qIGVudGVyIFNFUlZFUiBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgIHp6LAkJLyogY2xvc2UgY29ubmVjdGlvbiBpZiBvcGVuICovCisgICAgICAgICAgICAgICAgICAgICAgIDAJCS8qIGd1aSAqLworICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisjZW5kaWYgLyogREVDTkVUICovCisKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICAgIGlmIChteW5ldCA9PSBORVRfU1NIKSB7CQkvKiBTU0ggY29ubmVjdGlvbiAqLworICAgICAgICAgICAgaW50IGssIGhhdmVob3N0ID0gMCwgdHJpcHMgPSAwOworICAgICAgICAgICAgaW50ICAgIHRtcHZlciA9IC0xLCB0bXB4ZncgPSAtMSwgdG1wc3NoX2NhczsKKyNpZm5kZWYgU1NIVEVTVAorICAgICAgICAgICAgZXh0ZXJuIGludCBzbF9zc2hfeGZ3LCBzbF9zc2hfeGZ3X3NhdmVkOworICAgICAgICAgICAgZXh0ZXJuIGludCBzbF9zc2hfdmVyLCBzbF9zc2hfdmVyX3NhdmVkOworI2VuZGlmIC8qIFNTSFRFU1QgKi8KKyAgICAgICAgICAgIGV4dGVybiBzdHJ1Y3Qga2V5dGFiIHNzaG9wbnN3W107CisgICAgICAgICAgICBleHRlcm4gaW50IG5zc2hvcG5zdzsKKyAgICAgICAgICAgIGV4dGVybiBjaGFyICpzc2hfdG1wY21kLCAqc3NoX3RtcHBvcnQ7CisgICAgICAgICAgICBzdHJ1Y3QgRkRCIHN3LCBrdywgZmw7CisKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNldGxpbiBTU0ggc2VydmljZSAwIixzcnZidWYsMCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzZXRsaW4gU1NIIGhvc3QgcyAyIixzLDApOworICAgICAgICAgICAgaWYgKCpzKSB7ICAgICAgICAgICAvKiBJZiB0aGV5IGdhdmUgYSBob3N0IG5hbWUuLi4gKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzZXRsaW4gU1NIIGhvc3QgcyAxIixzLDApOworICAgICAgICAgICAgICAgIGlmICgqcyA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc2xtc2csIkluY29taW5nIGNvbm5lY3Rpb25zIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAiP1NvcnJ5LCBpbmNvbWluZyBjb25uZWN0aW9ucyBub3Qgc3VwcG9ydGVkIGZvciBTU0guXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiP2hvc3RuYW1lIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBQYXJzZSBbIHBvcnQgXSBbIHN3aXRjaGVzIF0gKi8KKyAgICAgICAgICAgIGNtZmRiaSgma3csICAgICAgICAgICAgICAgICAvKiBTd2l0Y2hlcyAqLworICAgICAgICAgICAgICAgICAgICBfQ01LRVksCisgICAgICAgICAgICAgICAgICAgICJQb3J0IG51bWJlciBvciBzZXJ2aWNlIG5hbWUsXG5vciBzd2l0Y2giLAorICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgIG5zc2hvcG5zdywKKyAgICAgICAgICAgICAgICAgICAgNCwKKyAgICAgICAgICAgICAgICAgICAgeHhzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIHNzaG9wbnN3LAorICAgICAgICAgICAgICAgICAgICAmZmwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNtZmRiaSgmZmwsICAgICAgICAgICAgICAgICAvKiBQb3J0IG51bWJlciBvciBzZXJ2aWNlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgX0NNRkxELAorICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICB4eHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgdHJpcHMgPSAwOyAgICAgICAgICAgICAgICAgIC8qIEV4cGxhaW5lZCBiZWxvdyAqLworICAgICAgICAgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgIC8qIFBhcnNlIHBvcnQgYW5kIHN3aXRjaGVzICovCisgICAgICAgICAgICAgICAgeSA9IGNtZmRiKCZrdyk7ICAgICAgICAgLyogR2V0IGEgZmllbGQgKi8KKyAgICAgICAgICAgICAgICBpZiAoeSA9PSAtMykgICAgICAgICAgICAvKiBVc2VyIHR5cGVkIENSIHNvIHF1aXQgZnJvbSBsb29wICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICh5IDwgMCkgICAgICAgICAgICAgIC8qIE90aGVyIHBhcnNlIGVycm9yLCBwYXNzIGl0IGJhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoY21yZXN1bHQuZmNvZGUpIHsgLyogRmllbGQgb3IgS2V5d29yZD8gKi8KKyAgICAgICAgICAgICAgICBjYXNlIF9DTUZMRDogICAgICAgICAgICAgIC8qIEZpZWxkICovCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShzcnZidWYsY21yZXN1bHQuc3Jlc3VsdCxTUlZCVUZTSVopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIF9DTUtFWTogICAgICAgICAgICAvKiBLZXl3b3JkICovCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY21yZXN1bHQubnJlc3VsdCkgeyAvKiBXaGljaCBvbmU/ICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgU1NIU1dfUFdEOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbWdicmsoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGVib2sgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21mbGQoIlBhc3N3b3JkIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5ID09IC0zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnRtcHN0cmluZywiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGJyc3RyaXAocyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gKGludClzdHJsZW4ocykpID4gUFdCVUZMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNsbXNnLCJJbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgdG9vIGxvbmcgLSBtYXggPSAlZFxuIixQV0JVRkwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZ0bXBzdHJpbmcscyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTU0hTV19VU1I6ICAgICAgICAgICAgIC8qIC9VU0VSOiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbWdicmsoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21mbGQoIlVzZXJuYW1lIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gYnJzdHJpcChzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnRtcHVzcmlkLHMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU1NIU1dfVkVSOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh5ID0gY21udW0oIk51bWJlciIsIiIsMTAsJnoseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHogPCAxIHx8IHogPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/T3V0IG9mIHJhbmdlOiAlZFxuIix6KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wdmVyID0gejsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNTSFNXX0NNRDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTU0hTV19TVUI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBjbWZsZCgiVGV4dCIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF90bXBjbWQscyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBzc2hfY2FzID0gKGNtcmVzdWx0Lm5yZXN1bHQgPT0gU1NIU1dfU1VCKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNTSFNXX1gxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXB4ZncgPSB5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0cmlwcysrID09IDApIHsgICAgIC8qIEFmdGVyIGZpcnN0IHRpbWUgdGhyb3VnaCAqLworICAgICAgICAgICAgICAgICAgICBjbWZkYmkoJmt3LCAgICAgICAgIC8qIG9ubHkgcGFyc2Ugc3dpdGNoZXMsIG5vdCBwb3J0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DTUtFWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3dpdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3Nob3Buc3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2hvcG5zdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApICAgICAgLyogR2V0IGNvbmZpcm1hdGlvbiAqLworICAgICAgICAgICAgICAgIHJldHVybih5KTsKKworICAgICAgICAgICAgZGVidWcoRjExMCwic2V0bGluIHByZS1jeF9uZXQgbGluZSIsbGluZSwwKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsInNldGxpbiBwcmUtY3hfbmV0IHNydmJ1ZiIsc3J2YnVmLDApOworICAgICAgICAgICAgeCA9IGN4X25ldCggbXluZXQsICAgICAgICAgICAgICAgICAgLyogbmV0dHlwZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdG9jb2wgKG5vdCB1c2VkKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgICAgICAgICAgICAgICAgICAgLyogaG9zdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3J2YnVmLCAgICAgICAgICAgICAgICAgLyogcG9ydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wdXNyaWQsICAgICAgICAgICAgICAgLyogYWx0ZXJuYXRlIHVzZXJuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICB0bXBzdHJpbmcsICAgICAgICAgICAgICAvKiBwYXNzd29yZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3NoX3RtcGNtZCwgICAgICAgICAgICAgLyogY29tbWFuZCB0byBleGVjdXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICB0bXB2ZXIsICAgICAgICAgICAgICAgICAvKiBwYXJhbTEgLSBzc2ggdmVyc2lvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wc3NoX2NhcywgICAgICAgICAgICAgLyogcGFyYW0yIC0gc3NoIGNhcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcHhmdywgICAgICAgICAgICAgICAgIC8qIHBhcmFtMyAtIHNzaCB4MTFmd2QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGN4LCAgICAgICAgICAgICAgICAgICAgIC8qIGVudGVyIENPTk5FQ1QgbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3gsICAgICAgICAgICAgICAgICAgICAgLyogZW50ZXIgU0VSVkVSIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHp6LCAgICAgICAgICAgICAgICAgICAgIC8qIGNsb3NlIGNvbm5lY3Rpb24gaWYgb3BlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgLyogZ3VpICovCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKHRtcHVzcmlkKQorICAgICAgICAgICAgICAgIG1ha2VzdHIoJnRtcHVzcmlkLE5VTEwpOworICAgICAgICAgICAgaWYgKHNzaF90bXBjbWQpCisgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NoX3RtcGNtZCxOVUxMKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKworI2lmZGVmIFRDUFNPQ0tFVAorICAgICAgICBpZiAobXluZXQgPT0gTkVUX1RDUEIpIHsgICAgICAgIC8qIFRDUC9JUCBjb25uZWN0aW9uICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzZXRsaW4gc2VydmljZSAwIixzcnZidWYsMCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzZXRsaW4gaG9zdCBzIDIiLHMsMCk7CisgICAgICAgICAgICBpZiAoKnMpIHsJCQkvKiBJZiB0aGV5IGdhdmUgYSBob3N0IG5hbWUuLi4gKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzZXRsaW4gaG9zdCBzIDEiLHMsMCk7CisjaWZkZWYgTk9MSVNURU4KKyAgICAgICAgICAgICAgICBpZiAoKnMgPT0gJyonKSB7CisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNsbXNnLCJJbmNvbWluZyBjb25uZWN0aW9ucyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigKKyAgICAgIj9Tb3JyeSwgaW5jb21pbmcgY29ubmVjdGlvbnMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24gb2YgS2VybWl0LlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9MSVNURU4gKi8KKyNpZmRlZiBSTE9HQ09ERQorICAgICAgICAgICAgICAgIC8qIEFsbG93IGEgdXNlcm5hbWUgaWYgcmxvZ2luIGlzIHJlcXVlc3RlZCAqLworICAgICAgICAgICAgICAgIGlmIChteW5ldCA9PSBORVRfVENQQiAmJgorICAgICAgICAgICAgICAgICAgICAodHRucHJvdG8gPT0gTlBfUkxPR0lOIHx8IHR0bnByb3RvID09IE5QX0s1TE9HSU4gfHwKKyAgICAgICAgICAgICAgICAgICAgIHR0bnByb3RvID09IE5QX0VLNUxPR0lOIHx8IHR0bnByb3RvID09IE5QX0s0TE9HSU4gfHwKKyAgICAgICAgICAgICAgICAgICAgIHR0bnByb3RvID09IE5QX0VLNExPR0lOCisgICAgICAgICAgICAgICAgICAgICkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHk7CisgICAgICAgICAgICAgICAgICAgIHVpZGZsYWcgPSAwOworICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgImhvc3Q6c2VydmljZSIgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yICggOyAoKnMgIT0gJ1wwJykgJiYgKCpzICE9ICc6Jyk7IHMrKykgOworICAgICAgICAgICAgICAgICAgICBpZiAoKnMpIHsgICAvKiBTZXJ2aWNlLCBzYXZlIGl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAqcyA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShzcnZidWYsKytzLFNSVkJVRlNJWik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgLyogTm8gOnNlcnZpY2UsIHRoZW4gdXNlIGRlZmF1bHQuICovCisjaWZkZWYgVk1TCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR0bnByb3RvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTlBfUkxPR0lOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShzcnZidWYsIjUxMyIsU1JWQlVGU0laKTsgLyogImxvZ2luIiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5QX0s0TE9HSU46CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTlBfSzVMT0dJTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkoc3J2YnVmLCI1NDMiLFNSVkJVRlNJWik7IC8qICJrbG9naW4iICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTlBfRUs0TE9HSU46CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTlBfRUs1TE9HSU46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHNydmJ1ZiwiMjEwNSIsU1JWQlVGU0laKTsgLyogImVrbG9naW4iICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZWxzZSAvKiBWTVMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHRucHJvdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOUF9STE9HSU46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHNydmJ1ZiwibG9naW4iLFNSVkJVRlNJWik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTlBfSzRMT0dJTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOUF9LNUxPR0lOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShzcnZidWYsImtsb2dpbiIsU1JWQlVGU0laKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOUF9FSzRMT0dJTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOUF9FSzVMT0dJTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkoc3J2YnVmLCJla2xvZ2luIixTUlZCVUZTSVopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIFZNUyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB5ID0gY21mbGQoIlVzZXJpZCBvbiByZW1vdGUgc3lzdGVtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRidWYsJnMseHhzdHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPCAwICYmIHkgIT0gLTMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW50KXN0cmxlbihzKSA+IDYzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc2xtc2csIkludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJTb3JyeSwgdG9vIGxvbmdcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZ0bXB1c3JpZCxzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAvKiBURUxORVQgb3IgU0VUIEhPU1QgKi8KKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgImhvc3Q6c2VydmljZSIgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yICggOyAoKnMgIT0gJ1wwJykgJiYgKCpzICE9ICc6Jyk7IHMrKykgOworICAgICAgICAgICAgICAgICAgICBpZiAoKnMpIHsgICAvKiBTZXJ2aWNlLCBzYXZlIGl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAqcyA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShzcnZidWYsKytzLFNSVkJVRlNJWik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNvbmZpcm1lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gOnNlcnZpY2UsIGxldCB0aGVtIHR5cGUgb25lLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpsaW5lICE9ICcqJykgeyAvKiBOb3QgaW5jb21pbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXluZXQgPT0gTkVUX1RDUEIgJiYgdHRucHJvdG8gPT0gTlBfS0VSTUlUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVENQIHNlcnZpY2UgbmFtZSBvciBudW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2VybWl0Iiwmcyx4eHN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDwgMCAmJiB4ICE9IC0zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyNpZmRlZiBSTE9HQ09ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXluZXQgPT0gTkVUX1RDUEIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0bnByb3RvID09IE5QX1JMT0dJTikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHggPSBjbWZsZCgKKyAgIlRDUCBzZXJ2aWNlIG5hbWUgb3IgbnVtYmVyLFxuIG9yIGNhcnJpYWdlIHJldHVybiBmb3IgcmxvZ2luICg1MTMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZ2luIiwmcyx4eHN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDwgMCAmJiB4ICE9IC0zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorI2lmZGVmIENLX0tFUkJFUk9TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChteW5ldCA9PSBORVRfVENQQiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR0bnByb3RvID09IE5QX0s0TE9HSU4gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0bnByb3RvID09IE5QX0s1TE9HSU4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKAorICAiVENQIHNlcnZpY2UgbmFtZSBvciBudW1iZXIsXG4gb3IgY2FycmlhZ2UgcmV0dXJuIGZvciBrbG9naW4gKDU0MykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2xvZ2luIiwmcyx4eHN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDwgMCAmJiB4ICE9IC0zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG15bmV0ID09IE5FVF9UQ1BCICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHRucHJvdG8gPT0gTlBfRUs0TE9HSU4gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dG5wcm90byA9PSBOUF9FSzVMT0dJTikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh4ID0gY21mbGQoCisgICJUQ1Agc2VydmljZSBuYW1lIG9yIG51bWJlcixcbiBvciBjYXJyaWFnZSByZXR1cm4gZm9yIGVrbG9naW4gKDIxMDUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVrbG9naW4iLCZzLHh4c3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPCAwICYmIHggIT0gLTMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIG5vdCBzZXQgYSBkZWZhdWx0IHZhbHVlIGluIHRoaXMgY2FsbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB5b3UgZG8gdGhlbiBpdCB3aWxsIHByZXZlbnQgZW50cmllcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gdGhlIG5ldHdvcmsgZGlyZWN0b3J5IGZyb20gYWNjZXNzaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsdGVybmF0ZSBwb3J0cy4gICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtZmxkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVENQIHNlcnZpY2UgbmFtZSBvciBudW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwmcyx4eHN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDwgMCAmJiB4ICE9IC0zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBJbmNvbWluZyBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh4ID0gY21mbGQoIlRDUCBzZXJ2aWNlIG5hbWUgb3IgbnVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwmcyx4eHN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPCAwICYmIHggIT0gLTMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnMpICAgICAgICAgLyogSWYgdGhleSBnYXZlIGEgc2VydmljZSwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHNydmJ1ZixzLFNSVkJVRlNJWik7IC8qIGNvcHkgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsInNldGxpbiBzZXJ2aWNlIDAuNSIsc3J2YnVmLDApOworICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgUkxPR0NPREUKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICogZGVmcHJvdG87CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHRucHJvdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5QX1JMT0dJTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZnByb3RvID0gIi9ybG9naW4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOUF9LNExPR0lOOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmcHJvdG8gPSAiL2s0bG9naW4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOUF9LNUxPR0lOOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmcHJvdG8gPSAiL2s1bG9naW4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOUF9FSzRMT0dJTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZnByb3RvID0gIi9lazRsb2dpbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5QX0VLNUxPR0lOOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmcHJvdG8gPSAiL2VrNWxvZ2luIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTlBfS0VSTUlUOgorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTlBfVEVMTkVUOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmcHJvdG8gPSAiL3RlbG5ldCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmcHJvdG8gPSAiL2RlZmF1bHQiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KHRjcHJhd3RhYixudGNwcmF3LCJTd2l0Y2giLGRlZnByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT0gLTMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYXdmbGcgPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJzZXRsaW4gcHJlLWN4X25ldCBsaW5lIixsaW5lLDApOworICAgICAgICAgICAgZGVidWcoRjExMCwic2V0bGluIHByZS1jeF9uZXQgc3J2YnVmIixzcnZidWYsMCk7CisgICAgICAgICAgICB4ID0gY3hfbmV0KCBteW5ldCwgICAgICAgICAgICAgICAgICAvKiBuZXR0eXBlICovCisgICAgICAgICAgICAgICAgICAgICAgICByYXdmbGcgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsICAgICAgICAgICAgICAgICAgIC8qIGhvc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNydmJ1ZiwgICAgICAgICAgICAgICAgIC8qIHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcHVzcmlkLCAgICAgICAgICAgICAgIC8qIGFsdGVybmF0ZSB1c2VybmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wc3RyaW5nLCAgICAgICAgICAgICAgLyogcGFzc3dvcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgdG8gZXhlY3V0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYV90eXBlLCAgICAgICAgICAgICAgICAgLyogcGFyYW0xIC0gdGVsbmV0IGF1dGh0eXBlICovCisgICAgICAgICAgICAgICAgICAgICAgICBlX3R5cGUsICAgICAgICAgICAgICAgICAvKiBwYXJhbTIgLSB0ZWxuZXQgZW5jdHlwZSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQsICAgICAgICAgICAgICAgICAgIC8qIHBhcmFtMyAtIHRlbG5ldCB3YWl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjeCwgICAgICAgICAgICAgICAgICAgICAvKiBlbnRlciBDT05ORUNUIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN4LCAgICAgICAgICAgICAgICAgICAgIC8qIGVudGVyIFNFUlZFUiBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICB6eiwgICAgICAgICAgICAgICAgICAgICAvKiBjbG9zZSBjb25uZWN0aW9uIGlmIG9wZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgIC8qIGd1aSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCisjaWZkZWYgQ0tfU0VDVVJJVFkKKyAgICAgICAgaWYgKHRtcHN0cmluZykKKyAgICAgICAgICAgIG1ha2VzdHIoJnRtcHN0cmluZyxOVUxMKTsKKyNlbmRpZiAvKiBDS19TRUNVUklUWSAqLworICAgICAgICBpZiAodG1wdXNyaWQpCisgICAgICAgICAgICBtYWtlc3RyKCZ0bXB1c3JpZCxOVUxMKTsKKwlkZWJ1ZyhGMTExLCJzZXRsaW4gY3hfbmV0IixsaW5lLHgpOworCXJldHVybih4KTsKKyNlbmRpZiAvKiBORVRDT05OICovCisgICAgfQorCisvKiBTZXJpYWwgdHR5IGRldmljZSwgcG9zc2libHkgbW9kZW0sIGNvbm5lY3Rpb24uLi4gKi8KKworI2lmZGVmIE9TMgorLyoKKyAgVXNlciBjYW4gdHlwZToKKyAgICBDT00xLi5DT004ID0gUmVndWxhciBDT00gcG9ydAorICAgIDEuLjggICAgICAgPSBTeW5vbnltIGZvciBDT00xLi5DT004LCBpcyB0cmFuc2xhdGVkIHRvIENPTTEuLkNPTTgKKyAgICBfbiAgICAgICAgID0gKG4gaXMgYSBudW1iZXIpID0gb3BlbiBmaWxlIGhhbmRsZQorICAgIHN0cmluZyAgICAgPSBhbnkgdGV4dCBzdHJpbmcgPSBuYW1lIG9mIHNvbWUgb3RoZXIga2luZCBvZiBkZXZpY2UsCisgICAgICAgICAgICAgICAgIHRha2VuIGxpdGVyYWxseSwgYXMgZ2l2ZW4uCisqLworICAgIHMgPSAiQ29tbXVuaWNhdGlvbiBkZXZpY2UgbmFtZSI7CisKKyNpZmRlZiBDS19UQVBJCisgICAgaWYgKFRBUElBdmFpbCkKKyAgICAgIGNrdGFwaUJ1aWxkTGluZVRhYmxlKCZ0YXBpbGluZXRhYiwgJl90YXBpbGluZXRhYiwgJm50YXBpbGluZSk7CisgICAgaWYgKCEodGFwaWxpbmV0YWIgJiYgX3RhcGlsaW5ldGFiICYmIG50YXBpbGluZSA+IDApICYmCisJeHggPT0gWFlUQVBJX0xJTiApIHsKKwltYWtlc3RyKCZzbG1zZywiVEFQSSBkZXZpY2Ugbm90IGNvbmZpZ3VyZWQiKTsKKwlwcmludGYoIlxuTm8gVEFQSSBMaW5lIERldmljZXMgYXJlIGNvbmZpZ3VyZWQgZm9yIHRoaXMgc3lzdGVtXG4iKTsKKwlyZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAoeHggPT0gWFlUQVBJX0xJTikgewkJLyogRGVmYXVsdCAoZmlyc3QpIFRBUEkgbGluZSAqLworCXMgPSAidGFwaSI7CQkJLyogKHdoYXRldmVyIGl0IGlzKSAqLworICAgIH0gZWxzZSB7CQkJCS8qIFF1ZXJ5IHRoZSB1c2VyICovCisjZW5kaWYgLyogQ0tfVEFQSSAqLworCisvKiBOb3cgcGFyc2Ugb3B0aW9uYWwgc3dpdGNoZXMgYW5kIHRoZW4gZGV2aWNlIG5hbWUgKi8KKworCWNvbmZpcm1lZCA9IDA7CisJY21mZGJpKCZzdyxfQ01LRVksIkRldmljZSBuYW1lLCBvciBzd2l0Y2giLAorCSAgICAgICAiIiwiIixucHNsdGFiLDQseHhzdHJpbmcscHNsdGFiLCZmbCk7CisJY21mZGJpKCZmbCxfQ01GTEQsIiIsZGZ0dHksIiIsMCwwLHh4c3RyaW5nLE5VTEwsTlVMTCk7CisJd2hpbGUgKDEpIHsKKwkgICAgeCA9IGNtZmRiKCZzdyk7CisJICAgIGRlYnVnKEYxMDEsInNldGxpbiBjbWZkYiIsIiIseCk7CisJICAgIGlmICh4IDwgMCkKKwkgICAgICBpZiAoeCAhPSAtMykKKwkJcmV0dXJuKHgpOworCSAgICBpZiAoeCA9PSAtMykgeworCQlpZiAoKHggPSBjbWNmbSgpKSA8IDApIHsKKwkJICAgIHJldHVybih4KTsKKwkJfSBlbHNlIHsKKwkJICAgIGNvbmZpcm1lZCA9IDE7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJICAgIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01GTEQpIHsKKwkJcyA9IGNtcmVzdWx0LnNyZXN1bHQ7CisJCWJyZWFrOworCSAgICB9IGVsc2UgaWYgKGNtcmVzdWx0LmZjb2RlID09IF9DTUtFWSkgeworCQlzd2l0Y2ggKGNtcmVzdWx0Lm5yZXN1bHQpIHsKKwkJICBjYXNlIFNMX0NOWDoJCS8qIC9DT05ORUNUICovCisJCSAgICBjeCA9IDE7CisJCSAgICBzeCA9IDA7CisJCSAgICBicmVhazsKKwkJICBjYXNlIFNMX1NSVjoJCS8qIC9TRVJWRVIgKi8KKwkJICAgIGN4ID0gMDsKKwkJICAgIHN4ID0gMTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgU0xfU0hSOgkJLyogL1NIQVJFICovCisJCSAgICBzaHIgPSAxOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBTTF9OU0g6CQkvKiAvTk9TSEFSRSAqLworCQkgICAgc2hyID0gMDsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisjaWZkZWYgQ0tfVEFQSQorICAgIH0KKyNlbmRpZiAvKiBDS19UQVBJICovCisKKyAgICBkZWJ1ZyhGMTEwLCJPUzIgU0VUIFBPUlQgcyIscywwKTsKKyAgICB5ID0gbG9va3VwKG9zMmRldnRhYixzLG5vczJkZXYsJngpOyAvKiBMb29rIHVwIGluIGtleXdvcmQgdGFibGUgKi8KKyAgICBkZWJ1ZyhGMTAxLCJPUzIgU0VUIFBPUlQgeCIsIiIseCk7CisgICAgZGVidWcoRjEwMSwiT1MyIFNFVCBQT1JUIHkiLCIiLHkpOworICAgIGlmICgoeSA+IC0xKSAmJiAoeCA+PSAwICYmIHggPCA4KSkgeyAvKiBVc2VyIHR5cGVkIGEgZGlnaXQgMS4uOCAqLworCXMgPSBvczJkZXZ0YWJbeCs4XS5rd2Q7CQkvKiBTdWJzdGl0aXRlIGl0cyByZWFsIG5hbWUgKi8KKyNpZmRlZiBOVAorCXh4dGFwaSA9IDA7CisjZWxzZSAvKiBOVCAqLworCXh4c2xpcCA9IHh4cHBwID0gMDsKKyNlbmRpZiAvKiBOVCAqLworCWRlYnVnKEYxMTAsIk9TMiBTRVQgUE9SVCBzdWJzdCBzIixzLCIiKTsKKyNpZm5kZWYgTlQKKyAgICB9IGVsc2UgaWYgKCh5ID4tMSkgJiYgKHggPj0gMTYgJiYgeCA8IDI0KSkgeyAvKiBTTElQIGFjY2VzcyAqLworCXMgPSBvczJkZXZ0YWJbeC04XS5rd2Q7CQkvKiBTdWJzdGl0aXRlIGl0cyByZWFsIG5hbWUgKi8KKwlkZWJ1ZyhGMTEwLCJPUzIgU0VUIFBPUlQgU0xJUCBzdWJzdCBzIixzLCIiKTsKKwl4eHNsaXAgPSAxOworCXh4cHBwICA9IDA7CisgICAgfSBlbHNlIGlmICgoeSA+LTEpICYmICh4ID49IDI0ICYmIHggPCAzMikpIHsgLyogUFBQIGFjY2VzcyAqLworCXMgPSBvczJkZXZ0YWJbeC0xNl0ua3dkOwkvKiBTdWJzdGl0aXRlIGl0cyByZWFsIG5hbWUgKi8KKwlkZWJ1ZyhGMTEwLCJPUzIgU0VUIFBPUlQgUFBQIHN1YnN0IHMiLHMsIiIpOworCXh4cHBwID0gMTsKKwl4eHNsaXAgPSAwOworCWlmICgoeSA9IGNta2V5KG9zMnBwcHRhYiwKKwkJICAgICAgIG5vczJwcHAsCisJCSAgICAgICAiUFBQIGRyaXZlciBpbnRlcmZhY2UiLAorCQkgICAgICAgInBwcDAiLAorCQkgICAgICAgeHhzdHJpbmcpCisJICAgICApIDwgMCkKKwkgIHJldHVybih5KTsKKwlkZWJ1ZyhGMTAxLCJPUzIgU0VUIFBPUlQgUFBQIElOVEVSRkFDRSB5IiwiIix5KTsKKwl4eHBwcCA9ICh5ICUgMTApICsgMTsKKyNlbmRpZiAvKiBOVCAqLworICAgIH0gZWxzZSBpZiAoKnMgPT0gJ18nKSB7CQkvKiBVc2VyIHVzZWQgIl8iIHByZWZpeCAqLworCXMrKzsJCQkJLyogUmVtb3ZlIGl0ICovCisJLyogUmVzdCBtdXN0IGJlIG51bWVyaWMgKi8KKwlkZWJ1ZyhGMTEwLCJPUzIgU0VUIFBPUlQgSEFORExFIF9zdWJzdCBzIixzLDApOworCWlmICghcmRpZ2l0cyhzKSkgeworCSAgICBtYWtlc3RyKCZzbG1zZywiSW52YWxpZCBmaWxlIGhhbmRsZSIpOworCSAgICBwcmludGYoIj9JbnZhbGlkIGZvcm1hdCBmb3IgZmlsZSBoYW5kbGVcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKyNpZmRlZiBOVAorCXh4dGFwaSA9IDA7CisjZWxzZSAvKiBOVCAqLworCXh4c2xpcCA9IHh4cHBwID0gMDsKKyNlbmRpZiAvKiBOVCAqLworICAgIH0gZWxzZSB7CQkJCS8qIEEgbm9ybWFsIENPTXggcG9ydCBvciBhIHN0cmluZyAqLworCXMgPSBicnN0cmlwKHMpOwkJCS8qIFN0cmlwIGJyYWNlcyBpZiBhbnkgKi8KKyNpZmRlZiBOVAorI2lmZGVmIENLX1RBUEkKKwkvKiBXaW5kb3dzIFRBUEkgc3VwcG9ydCAtIExvb2sgdXAgaW4ga2V5d29yZCB0YWJsZSAqLworCWlmICh0YXBpbGluZXRhYiAmJiBfdGFwaWxpbmV0YWIgJiYgbnRhcGlsaW5lID4gMCkgeworCSAgICBpZiAoIWNrc3RyY21wKHMsInRhcGkiLDQsMCkpIHsKKworCQkvKiBGaW5kIG91dCB3aGF0IHRoZSBsb3dlc3QgbnVtYmVyZWQgVEFQSSBkZXZpY2UgaXMgKi8KKwkJLyogYW5kIHVzZSBpdCBhcyB0aGUgZGVmYXVsdC4gICAgICAgICAgICAgICAgICAgICAgICovCisJCWludCBqID0gOTk5OSwgayA9IC0xOworCQlmb3IgKGkgPSAwOyBpIDwgbnRhcGlsaW5lOyBpKyspIHsKKwkJICAgIGlmICh0YXBpbGluZXRhYltpXS5rd3ZhbCA8IGopIHsKKwkJCWogPSB0YXBpbGluZXRhYltpXS5rd3ZhbDsKKwkJCWsgPSBpOworCQkgICAgfQorCQl9CisJCWlmIChrID49IDApCisJCSAgcyA9IF90YXBpbGluZXRhYltrXS5rd2Q7CisJCWVsc2UKKwkJICBzID0gIiI7CisKKwkJaWYgKCh5ID0gY21rZXkoX3RhcGlsaW5ldGFiLG50YXBpbGluZSwKKwkJCSAgICAgICAiVEFQSSBkZXZpY2UgbmFtZSIscyx4eHN0cmluZykpIDwgMCkKKwkJICByZXR1cm4oeSk7CisKKwkJeHh0YXBpID0gMTsKKworCQkvKiBHZXQgdGhlIG5vbiBVbmRlcnNjb3JlZCBzdHJpbmcgKi8KKwkJZm9yIChpID0gMDsgaSA8IG50YXBpbGluZTsgaSsrICkgeworCQkgICAgaWYgKHRhcGlsaW5ldGFiW2ldLmt3dmFsID09IHkpIHsKKwkJCXMgPSB0YXBpbGluZXRhYltpXS5rd2Q7CisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2UKKwkgICAgICB4eHRhcGkgPSAwOworCX0KKyNlbmRpZiAvKiBDS19UQVBJICovCisjZWxzZSAvKiBOVCAqLworCS8qIG5vdCBPUy8yIFNMSVAgb3IgUFBQICovCisJeHhzbGlwID0geHhwcHAgPSAwOworI2VuZGlmIC8qIE5UICovCisgICAgfQorICAgIGNrc3RybmNweSh0bXBidWYscyxUTVBCVUZTSVopOwkvKiBDb3B5IHRvIGEgc2FmZSBwbGFjZSAqLworICAgIHMgPSB0bXBidWY7CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworCisjZWxzZSAvKiAhT1MyICovCisKKyAgICBjbWZkYmkoJnN3LF9DTUtFWSwiRGV2aWNlIG5hbWUsIG9yIHN3aXRjaCIsCisJICAgIiIsIiIsbnBzbHRhYiw0LHh4c3RyaW5nLHBzbHRhYiwmdHgpOworICAgIGNtZmRiaSgmdHgsX0NNVFhULCIiLGRmdHR5LCIiLDAsMCx4eHN0cmluZyxOVUxMLE5VTEwpOworICAgIHdoaWxlICghY29uZmlybWVkKSB7CisJeCA9IGNtZmRiKCZzdyk7CisJZGVidWcoRjEwMSwic2V0bGluIGNtZmRiIiwiIix4KTsKKwlpZiAoeCA8IDApCisJICBpZiAoeCAhPSAtMykKKwkgICAgcmV0dXJuKHgpOworCWlmICh4ID09IC0zKSB7CisJICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgeworCQlyZXR1cm4oeCk7CisJICAgIH0gZWxzZSB7CisJCWNvbmZpcm1lZCA9IDE7CisJCWJyZWFrOworCSAgICB9CisJfQorCXN3aXRjaCAoY21yZXN1bHQuZmNvZGUpIHsKKwkgIGNhc2UgX0NNVFhUOgorCSAgICBja3N0cm5jcHkodG1wYnVmLGNtcmVzdWx0LnNyZXN1bHQsVE1QQlVGU0laKTsKKwkgICAgcyA9IHRtcGJ1ZjsKKwkgICAgZGVidWcoRjExMCwic2V0bGluIENNVFhUIix0bXBidWYsMCk7CisJICAgIGNvbmZpcm1lZCA9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSBfQ01LRVk6CQkJLyogU3dpdGNoICovCisJICAgIGRlYnVnKEYxMDEsInNldGxpbiBDTUtFWSIsdG1wYnVmLGNtcmVzdWx0Lm5yZXN1bHQpOworCSAgICBzd2l0Y2ggKGNtcmVzdWx0Lm5yZXN1bHQpIHsKKwkgICAgICBjYXNlIFNMX0NOWDoJCS8qIC9DT05ORUNUICovCisJCWN4ID0gMTsKKwkJc3ggPSAwOworCQlicmVhazsKKwkgICAgICBjYXNlIFNMX1NSVjoJCS8qIC9TRVJWRVIgKi8KKwkJY3ggPSAwOworCQlzeCA9IDE7CisJCWJyZWFrOworI2lmZGVmIFZNUworCSAgICAgIGNhc2UgU0xfU0hSOgkJLyogL1NIQVJFICovCisJCXNociA9IDE7CisJCWJyZWFrOworCSAgICAgIGNhc2UgU0xfTlNIOgkJLyogL05PU0hBUkUgKi8KKwkJc2hyID0gMDsKKwkJYnJlYWs7CisjZW5kaWYgLyogVk1TICovCisJICAgIH0KKwkgICAgY29udGludWU7CisJICBkZWZhdWx0OgorCSAgICBkZWJ1ZyhGMTAxLCJzZXRsaW4gYmFkIGNtZmRiIHJlc3VsdCIsIiIsY21yZXN1bHQuZmNvZGUpOworCSAgICBtYWtlc3RyKCZzbG1zZywiSW50ZXJuYWwgZXJyb3IiKTsKKwkgICAgcHJpbnRmKCI/SW50ZXJuYWwgcGFyc2luZyBlcnJvclxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpZiAoIWNvbmZpcm1lZCkKKyAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKwlyZXR1cm4oeCk7CisKKyAgICBkZWJ1ZyhGMTEwLCJzZXRsaW4gcHJlLWN4X3NlcmlhbCBzIixzLDApOworICAgIGRlYnVnKEYxMTAsInNldGxpbiBwcmUtY3hfc2VyaWFsIGxpbmUiLGxpbmUsMCk7CisgICAgeCA9IGN4X3NlcmlhbChzLGN4LHN4LHNocix6eiwwLAorI2lmZGVmIE9TMgorI2lmZGVmIE5UCisgICAgICAgICAgICAgICAgICAgKHh4dGFwaSA/IENYX1RBUEkgOiAwKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAoeHhzbGlwID8gQ1hfU0xJUCA6IDApIHwgKHh4cHBwID8gQ1hfUFBQIDogMCkKKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICk7CisgICAgZGVidWcoRjExMSwic2V0bGluIGN4X3NlcmlhbCIsbGluZSx4KTsKKyAgICByZXR1cm4oeCk7Cit9CisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZkZWYgQ0tDSEFOTkVMSU8KKy8qCisgIEMtTGlicmFyeSBiYXNlZCBmaWxlLWkvbyBwYWNrYWdlIGZvciBzY3JpcHRzLiAgVGhpcyBzaG91bGQgYmUgcG9ydGFibGUgdG8KKyAgYWxsIEMtS2VybWl0IHZlcnNpb25zIHNpbmNlIGl0IHVzZXMgdGhlIHNhbWUgQVBJcyB3ZSBoYXZlIGFsd2F5cyB1c2VkIGZvcgorICBwcm9jZXNzaW5nIGNvbW1hbmQgZmlsZXMuICBUaGUgZW50aXJlIGNoYW5uZWwgaS9vIHBhY2thZ2UgaXMgY29udGFpbmVkCisgIGhlcmVpbiwgYXBhcnQgZnJvbSBzb21lIGtleXdvcmQgdGFibGUgZW50cmllcyBpbiB0aGUgbWFpbiBrZXl3b3JkIHRhYmxlCisgIGFuZCB0aGUgaGVscCB0ZXh0IGluIHRoZSBIRUxQIGNvbW1hbmQgbW9kdWxlLgorCisgIE9uIHBsYXRmb3JtcyBsaWtlIFZNUyBhbmQgVk9TLCB0aGlzIHBhY2thZ2UgaGFuZGxlcyBvbmx5IFVOSVgtc3R5bGUKKyAgc3RyZWFtIGZpbGVzLiAgSWYgZGVzaXJlZCwgaXQgY2FuIGJlIHJlcGxhY2VkIGZvciB0aG9zZSBwbGF0Zm9ybXMgYnkKKyAgPCM+aWZkZWYnaW5nIG91dCB0aGlzIGNvZGUgYW5kIGFkZGluZyB0aGUgZXF1aXZhbGVudCByZXBsYWNlbWVudCByb3V0aW5lcworICB0byB0aGUgY2s/ZmlvLmMgbW9kdWxlLCBlLmcuIGZvciBSTVMtYmFzZWQgZmlsZSBpL28gaW4gY2t2ZmlvLmMuCisqLworCisvKiBEZWZpbmUgTk9TVEFUIGlmIHRoZSA8Iz5pbmNsdWRlIGNhdXNlcyB0cm91YmxlLiAqLworCisjaWZuZGVmIE5PU1RBVAorI2lmZGVmIFZNUworI2lmZGVmIFZBWEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzIGl0IGRvZXMgaW4gVkFYIEMgKi8KKyNkZWZpbmUgTk9TVEFUCisjZW5kaWYgLyogVkFYQyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE5PU1RBVCAqLworCisjaWZuZGVmIE5PU1RBVAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYgLyogTk9TVEFUICovCisKKyNpZmRlZiBOTENIQVIKK3N0YXRpYyBpbnQgel9sdCA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgbGluZSB0ZXJtaW5hdG9yICovCisjZWxzZQorc3RhdGljIGludCB6X2x0ID0gMjsKKyNlbmRpZiAvKiBOTENIQVIgKi8KKworc3RydWN0IGNrel9maWxlIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIEMtS2VybWl0IGZpbGUgc3RydWN0ICovCisgICAgRklMRSAqIHpfZnA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkZXMgdGhlIEMtTGliIGZpbGUgc3RydWN0ICovCisgICAgdW5zaWduZWQgaW50IHpfZmxhZ3M7ICAgICAgICAgICAgICAgLyogUGx1cyBDLUtlcm1pdCBtb2RlIGZsYWdzLCAqLworICAgIGxvbmcgel9ubGluZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbGluZSBudW1iZXIgaWYga25vd24sICovCisgICAgY2hhciB6X25hbWVbQ0tNQVhQQVRIKzJdOyAgICAgICAgICAgLyogYW5kIHRoZSBmaWxlJ3MgbmFtZS4gKi8KK307CitzdGF0aWMgc3RydWN0IGNrel9maWxlICogel9maWxlID0gTlVMTDsgLyogQXJyYXkgb2YgQy1LZXJtaXQgZmlsZSBzdHJ1Y3RzICovCitzdGF0aWMgaW50IHpfaW5pdGVkID0gMDsgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgYXJyYXkgaW5pdGlhbGl6ZWQgKi8KK2ludCB6X21heGNoYW4gPSBaX01BWENIQU47ICAgICAgICAgICAgICAvKiBNYXggbnVtYmVyIG9mIEMtS2VybWl0IGNoYW5uZWxzICovCitpbnQgel9vcGVubWF4ID0gQ0tNQVhPUEVOOyAgICAgICAgICAgICAgLyogTWF4IG51bWJlciBvZiBvcGVuIGZpbGVzIG92ZXJhbGwgKi8KK2ludCB6X25vcGVuID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBIb3cgbWFueSBjaGFubmVscyBwcmVzZW50bHkgb3BlbiAqLworaW50IHpfZXJyb3IgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vc3QgcmVjZW50IGVycm9yICovCitpbnQgel9maWxjb3VudCA9IC0xOyAgICAgICAgICAgICAgICAgICAgLyogTW9zdCByZWNlbnQgRklMRSBDT1VOVCByZXN1bHQgKi8KKworI2RlZmluZSBSRF9MSU5FIDAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZJTEUgUkVBRCBvcHRpb25zICovCisjZGVmaW5lIFJEX0NIQVIgMQorI2RlZmluZSBSRF9TSVpFIDIKKyNkZWZpbmUgUkRfVFJJTSA4CQkJLyogTGlrZSBTbm9ib2wgJlRSSU0gPSAxICovCisjZGVmaW5lIFJEX1VOVEEgOQkJCS8qIFVudGFiaWZ5ICovCisKKyNkZWZpbmUgV1JfTElORSBSRF9MSU5FICAgICAgICAgICAgICAgICAvKiBGSUxFIFdSSVRFIG9wdGlvbnMgKi8KKyNkZWZpbmUgV1JfQ0hBUiBSRF9DSEFSCisjZGVmaW5lIFdSX1NJWkUgUkRfU0laRQorI2RlZmluZSBXUl9TVFJJIDMKKyNkZWZpbmUgV1JfTFBBRCA0CisjZGVmaW5lIFdSX1JQQUQgNQorCisjaWZkZWYgVU5JWAorZXh0ZXJuIGludCBja21heGZpbGVzOyAgICAgICAgICAgICAgICAgIC8qIEZpbGxlZCBpbiBieSBzeXNpbml0KCkuICovCisjZW5kaWYgLyogVU5JWCAqLworCisvKiBTZWUgY2tja2VyLmggZm9yIGVycm9yIG51bWJlcnMgKi8KKy8qIFNlZSBja2NkZWIuaCBmb3IgWl9NQVhDSEFOIGFuZCBDS01BWE9QRU4gZGVmaW5pdGlvbnMgKi8KKy8qIE5PVEU6IEZvciBWTVMgd2UgbWlnaHQgYmUgYWJsZSB0byBmaWxsIGluIGNrbWF4ZmlsZXMgKi8KKy8qIGZyb20gRklMTE0gYW5kIENIQU5ORUxDTlQgLS0gZmluZCBvdXQgYWJvdXQgdGhlc2UuLi4gKi8KKworc3RhdGljIGNoYXIgKiBmb3BuYXJnc1tdID0geyAgICAgICAgICAgIC8qIE1vZGUgY29tYmluYXRpb25zIGZvciBmb3BlbigpICovCisjaWZkZWYgQ09NTUVOVAorICAgIC8qIEFsbCBjb21iaW5hdGlvbnMgb2YgcndhICovCisgICAgIiIsICAiciIsICAidyIsICAicnciLCAgImEiLCAgInJhIiwgICJ3YSIsICAicndhIiwgLyogVGV4dCBtb2RlICovCisgICAgImIiLCAicmIiLCAid2IiLCAicndiIiwgImFiIiwgInJhYiIsICJ3YWIiLCAicndhYiIgLyogQmluYXJ5IG1vZGUgKi8KKyNlbHNlCisgICAgLyogQ29tYmluYXRpb25zIGFuZCBzeW50YXggcGVybWl0dGVkIGJ5IEMgbGlicmFyaWVzLi4uICovCisgICAgIiIsICAiciIsICAidyIsICAicisiLCAgImEiLCAgIiIsICAgImEiLCAgIiIsIC8qIFRleHQgbW9kZSAqLworI2lmZGVmIE9TMgorICAgICIiLCAgInJiIiwgIndiIiwgInIrYiIsICJhYiIsICIiLCAgICJhYiIsICIiIC8qIEJpbmFyeSBtb2RlcyBmb3IgSzk1ICovCisjZWxzZQorI2lmZGVmIFZNUworICAgICIiLCAgInJiIiwgIndiIiwgInIrYiIsICJhYiIsICIiLCAgICJhYiIsICIiIC8qIEJpbmFyeSBtb2RlcyBmb3IgVk1TICovCisjZWxzZQorICAgICIiLCAgInIiLCAgICJ3IiwgInIrIiwgICJhIiwgICIiLCAgICJhIiwgICIiIC8qIEJpbmFyeSBtb2RlcyBmb3IgVU5JWCAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KK307CitzdGF0aWMgaW50IG5mb3BuYXJncyA9IHNpemVvZihmb3BuYXJncykgLyBzaXplb2YoY2hhciAqKTsKKworY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yIG1lc3NhZ2VzICovCitja2ZlcnJvcihuKSBpbnQgbjsgeworICAgIHN3aXRjaCAobikgeworICAgICAgY2FzZSBGWF9ORVI6IHJldHVybigiTm8gZXJyb3IiKTsKKyAgICAgIGNhc2UgRlhfU1lTOiByZXR1cm4oY2tfZXJyc3RyKCkpOworICAgICAgY2FzZSBGWF9FT0Y6IHJldHVybigiRW5kIG9mIGZpbGUiKTsKKyAgICAgIGNhc2UgRlhfTk9QOiByZXR1cm4oIkZpbGUgbm90IG9wZW4iKTsKKyAgICAgIGNhc2UgRlhfQ0hOOiByZXR1cm4oIkNoYW5uZWwgb3V0IG9mIHJhbmdlIik7CisgICAgICBjYXNlIEZYX1JORzogcmV0dXJuKCJQYXJhbWV0ZXIgb3V0IG9mIHJhbmdlIik7CisgICAgICBjYXNlIEZYX05NRjogcmV0dXJuKCJUb28gbWFueSBmaWxlcyBvcGVuIik7CisgICAgICBjYXNlIEZYX0ZPUDogcmV0dXJuKCJPcGVyYXRpb24gY29uZmxpY3RzIHdpdGggT1BFTiBtb2RlIik7CisgICAgICBjYXNlIEZYX05ZSTogcmV0dXJuKCJPUEVOIG1vZGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgY2FzZSBGWF9CT006IHJldHVybigiSWxsZWdhbCBjb21iaW5hdGlvbiBvZiBPUEVOIG1vZGVzIik7CisgICAgICBjYXNlIEZYX0FDQzogcmV0dXJuKCJBY2Nlc3MgZGVuaWVkIik7CisgICAgICBjYXNlIEZYX0ZORjogcmV0dXJuKCJGaWxlIG5vdCBmb3VuZCIpOworICAgICAgY2FzZSBGWF9PRkw6IHJldHVybigiQnVmZmVyIG92ZXJmbG93Iik7CisgICAgICBjYXNlIEZYX0xOVTogcmV0dXJuKCJDdXJyZW50IGxpbmUgbnVtYmVyIHVua25vd24iKTsKKyAgICAgIGNhc2UgRlhfUk9POiByZXR1cm4oIk9mZiBsaW1pdHMiKTsKKyAgICAgIGNhc2UgRlhfVU5LOiByZXR1cm4oIk9wZXJhdGlvbiBmYWlscyAtIHJlYXNvbiB1bmtub3duIik7CisgICAgICBkZWZhdWx0OiByZXR1cm4oIkVycm9yIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKKyAgICB9Cit9CisKKy8qCisgIFogXyBPIFAgRSBOIC0tICBPcGVuIGEgZmlsZSBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlIG9mIGFjY2Vzcy4KKworICBDYWxsIHdpdGg6CisgICAgbmFtZTogIE5hbWUgb2YgZmlsZSB0byBiZSBvcGVuZWQuCisgICAgZmxhZ3M6IEFueSBjb21iaW5hdGlvbiBvZiBGTV94eHggdmFsdWVzIGV4Y2VwdCBGTV9FT0YgKGNrY2tlci5oKS4KKyAgUmV0dXJuczoKKyAgICA+PSAwIG9uIHN1Y2Nlc3M6IFRoZSBhc3NpZ25lZCBjaGFubmVsIG51bWJlcgorICAgIDwgIDAgb24gZmFpbHVyZTogQSBuZWdhdGl2ZSBGWF94eHggZXJyb3IgY29kZSAoY2tja2VyLmgpLgorKi8KK2ludAorel9vcGVuKG5hbWUsIGZsYWdzKSBjaGFyICogbmFtZTsgaW50IGZsYWdzOyB7CisgICAgaW50IGksIG47CisgICAgRklMRSAqIHQ7CisgICAgY2hhciAqIG1vZGU7CisgICAgZGVidWcoRjExMSwiel9vcGVuIixuYW1lLGZsYWdzKTsKKyAgICBpZiAoIW5hbWUpIG5hbWUgPSAiIjsgICAgICAgICAgICAgICAvKiBDaGVjayBuYW1lIGFyZ3VtZW50ICovCisgICAgaWYgKCFuYW1lWzBdKQorICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9CRk4pOworICAgIGlmIChmbGFncyAmIEZNX0NNRCkgICAgICAgICAgICAgICAgIC8qIE9wZW5pbmcgcGlwZXMgbm90IGltcGxlbWVudGVkIHlldCAqLworICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9OWUkpOyAgICAgICAgIC8qIChhbmQgbm90IHBvcnRhYmxlIGVpdGhlcikgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ6X29wZW4gbmZvcG5hcmdzIiwiIixuZm9wbmFyZ3MpOworICAgIGlmIChmbGFncyA8IDAgfHwgZmxhZ3MgPj0gbmZvcG5hcmdzKSAvKiBSYW5nZSBjaGVjayBmbGFncyAqLworICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9STkcpOworICAgIG1vZGUgPSBmb3BuYXJnc1tmbGFnc107ICAgICAgICAgICAgIC8qIEdldCBmb3BlbigpIGFyZyAqLworICAgIGRlYnVnKEYxMTEsInpfb3BlbiBmb3BlbiBhcmdzIixtb2RlLGZsYWdzKTsKKyAgICBpZiAoIW1vZGVbMF0pICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgKi8KKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfQk9NKTsKKyAgICBpZiAoIXpfaW5pdGVkKSB7ICAgICAgICAgICAgICAgICAgICAvKiBJZiBmaWxlIHN0cnVjdHMgbm90IGluaXRlZCAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJ6X29wZW4gel9tYXhjaGFuIDEiLCIiLHpfbWF4Y2hhbik7CisjaWZkZWYgVU5JWAorICAgICAgICBkZWJ1ZyhGMTAxLCJ6X29wZW4gY2ttYXhmaWxlcyIsIiIsY2ttYXhmaWxlcyk7CisgICAgICAgIGlmIChja21heGZpbGVzID4gMCkgeyAgICAgICAgICAgLyogU2V0IGluIGNrP3Rpby5jOiBzeXNpbml0KCkgKi8KKyAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgeCA9IGNrbWF4ZmlsZXMgLSBaTkZJTFMgLSA1OworICAgICAgICAgICAgaWYgKHggPiB6X21heGNoYW4pICAgICAgICAgIC8qIHN5c2NvbmYoKSB2YWx1ZSBncmVhdGVyIHRoYW4gKi8KKyAgICAgICAgICAgICAgel9tYXhjaGFuID0geDsgICAgICAgICAgICAvKiB2YWx1ZSBmcm9tIGhlYWRlciBmaWxlcy4gKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInpfb3BlbiB6X21heGNoYW4gMiIsIiIsel9tYXhjaGFuKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVOSVggKi8KKyAgICAgICAgaWYgKHpfbWF4Y2hhbiA8IFpfTUlOQ0hBTikgICAgICAvKiBBbGxvY2F0ZSBhdCBsZWFzdCB0aGlzIG1hbnkuICovCisgICAgICAgICAgel9tYXhjaGFuID0gWl9NSU5DSEFOOworICAgICAgICBkZWJ1ZyhGMTAxLCJ6X29wZW4gel9tYXhjaGFuIDMiLCIiLHpfbWF4Y2hhbik7CisgICAgICAgIC8qIE5vdGU6IFRoaXMgY291bGQgYmUgYSBwcmV0dHkgYmlnIGNodW5rIG9mIG1lbW9yeSAqLworICAgICAgICAvKiBpZiB6X21heGNoYW4gaXMgYSBiaWcgbnVtYmVyLiAgSWYgdGhpcyBiZWNvbWVzIGEgcHJvYmxlbSAqLworICAgICAgICAvKiB3ZSdsbCBuZWVkIHRvIG1hbGxvYyBhbmQgZnJlZSBlYWNoIGVsZW1lbnQgYXQgb3Blbi9jbG9zZSB0aW1lICovCisgICAgICAgIGlmICghKHpfZmlsZSA9IChzdHJ1Y3QgY2t6X2ZpbGUgKikKKyAgICAgICAgICAgICAgbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2t6X2ZpbGUpICogKHpfbWF4Y2hhbiArIDEpKSkpCisgICAgICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9OTUYpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgel9tYXhjaGFuOyBpKyspIHsKKyAgICAgICAgICAgIHpfZmlsZVtpXS56X2ZwID0gTlVMTDsKKyAgICAgICAgICAgIHpfZmlsZVtpXS56X2ZsYWdzID0gMDsKKyAgICAgICAgICAgIHpfZmlsZVtpXS56X25saW5lID0gMDsKKyAgICAgICAgICAgICooel9maWxlW2ldLnpfbmFtZSkgPSAnXDAnOworICAgICAgICB9CisgICAgICAgIHpfaW5pdGVkID0gMTsgICAgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgd2UgZGlkICovCisgICAgfQorICAgIGZvciAobiA9IC0xLCBpID0gMDsgaSA8IHpfbWF4Y2hhbjsgaSsrKSB7CisgICAgICAgIGlmICghel9maWxlW2ldLnpfZnApIHsKKyAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG4gPCAwIHx8IG4gPj0gel9tYXhjaGFuKSAgICAgICAgLyogQW55IGZyZWUgY2hhbm5lbHM/ICovCisgICAgICByZXR1cm4oel9lcnJvciA9IEZYX05NRik7ICAgICAgICAgLyogTm8sIGZhaWwuICovCisgICAgZXJybm8gPSAwOworCisgICAgel9maWxlW25dLnpfZmxhZ3MgPSAwOyAgICAgICAgICAgICAgLyogSW4gY2FzZSBvZiBmYWlsdXJlLi4uICovCisKKyAgICB0ID0gZm9wZW4obmFtZSwgbW9kZSk7ICAgICAgICAgICAgICAvKiBUcnkgdG8gb3BlbiB0aGUgZmlsZS4gKi8KKyAgICBpZiAoIXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYWlsZWQuLi4gKi8KKyAgICAgICAgZGVidWcoRjExMSwiel9vcGVuIGVycm9yIixuYW1lLGVycm5vKTsKKyNpZmRlZiBFTUZJTEUKKyAgICAgICAgaWYgKGVycm5vID09IEVNRklMRSkKKyAgICAgICAgICByZXR1cm4oel9lcnJvciA9IEZYX05NRik7CisjZW5kaWYgLyogRU1GSUxFICovCisgICAgICAgIHJldHVybih6X2Vycm9yID0gKGVycm5vID8gIEZYX1NZUyA6IEZYX1VOSykpOyAvKiBSZXR1cm4gZXJyb3IgY29kZSAqLworICAgIH0KKyNpZmRlZiBOVAorI2lmZGVmIE9fU0VRVUVOVElBTAorICAgIGlmICh0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhY2hpbmcgaGludCBmb3IgTlQgKi8KKyAgICAgIF9zZXRtb2RlKF9maWxlbm8odCksT19TRVFVRU5USUFMKTsKKyNlbmRpZiAvKiBPX1NFUVVFTlRJQUwgKi8KKyNlbmRpZiAvKiBOVCAqLworICAgIHpfbm9wZW4rKzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9wZW4sIGNvdW50IGl0LiAqLworICAgIHpfZmlsZVtuXS56X2ZwID0gdDsgICAgICAgICAgICAgICAgIC8qIFN0YXNoIHRoZSBmaWxlIHBvaW50ZXIgKi8KKyAgICB6X2ZpbGVbbl0uel9mbGFncyA9IGZsYWdzOyAgICAgICAgICAvKiBhbmQgdGhlIGZsYWdzICovCisgICAgel9lcnJvciA9IDA7CisgICAgemZucWZwKG5hbWUsQ0tNQVhQQVRILHpfZmlsZVtuXS56X25hbWUpOyAvKiBhbmQgdGhlIGZpbGUncyBmdWxsIG5hbWUgKi8KKyAgICByZXR1cm4obik7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdGhlIGNoYW5uZWwgbnVtYmVyICovCit9CisKK2ludAorel9jbG9zZShjaGFubmVsKSBpbnQgY2hhbm5lbDsgeyAgICAgICAgIC8qIENsb3NlIGZpbGUgb24gZ2l2ZW4gY2hhbm5lbCAqLworICAgIGludCB4OworICAgIEZJTEUgKiB0OworICAgIGlmICghel9pbml0ZWQpICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxlZCBiZWZvcmUgYW55IGZpbGVzIGFyZSBvcGVuPyAqLworICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9OT1ApOworICAgIGlmIChjaGFubmVsID49IHpfbWF4Y2hhbikgICAgICAgICAgIC8qIENoYW5uZWwgb3V0IG9mIHJhbmdlPyAqLworICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9DSE4pOworICAgIGlmICghKHQgPSB6X2ZpbGVbY2hhbm5lbF0uel9mcCkpICAgIC8qIENoYW5uZWwgd2Fzbid0IG9wZW4/ICovCisgICAgICByZXR1cm4oel9lcnJvciA9IEZYX05PUCk7CisgICAgZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGVycm5vIDAgdG8gZ2V0IGEgZ29vZCByZWFkaW5nICovCisgICAgeCA9IGZjbG9zZSh0KTsgICAgICAgICAgICAgICAgICAgICAgLyogVHJ5IHRvIGNsb3NlICovCisgICAgaWYgKHggPT0gRU9GKSAgICAgICAgICAgICAgICAgICAgICAgLyogT24gZmFpbHVyZSAqLworICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9TWVMpOyAgICAgICAgIC8qIGluZGljYXRlIHN5c3RlbSBlcnJvci4gKi8KKyAgICB6X25vcGVuLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbG9zZWQgT0ssIGRlY3JlbWVudCBvcGVuIGNvdW50ICovCisgICAgel9maWxlW2NoYW5uZWxdLnpfZnAgPSBOVUxMOyAgICAgICAgLyogU2V0IGZpbGUgcG9pbnRlciB0byBOVUxMICovCisgICAgel9maWxlW2NoYW5uZWxdLnpfbmxpbmUgPSAwOyAgICAgICAgLyogQ3VycmVudCBsaW5lIG51bWJlciBpcyAwICovCisgICAgel9maWxlW2NoYW5uZWxdLnpfZmxhZ3MgPSAwOyAgICAgICAgLyogU2V0IGZsYWdzIHRvIDAgKi8KKyAgICAqKHpfZmlsZVtjaGFubmVsXS56X25hbWUpID0gJ1wwJzsgICAvKiBDbGVhciBuYW1lICovCisgICAgcmV0dXJuKHpfZXJyb3IgPSAwKTsKK30KKworLyoKKyAgWiBfIE8gVSBUICAtLSAgT3V0cHV0IHN0cmluZyB0byBjaGFubmVsLgorCisgIENhbGwgd2l0aDoKKyAgICBjaGFubmVsOiAgICAgQ2hhbm5lbCBudW1iZXIgdG8gd3JpdGUgdG8uCisgICAgczogICAgICAgICAgIFN0cmluZyB0byB3cml0ZS4KKyAgICBsZW5ndGggPiAtMTogSG93IG1hbnkgY2hhcmFjdGVycyBvZiBzIHRvIHdyaXRlLgorICAgIGxlbmd0aCA8IDA6ICBXcml0ZSBlbnRpcmUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLgorICAgIGZsYWdzID09IDA6ICBTdXBwbHkgbGluZSB0ZXJtaW5hdGlvbi4KKyAgICBmbGFncyA+ICAwOiAgRG9uJ3Qgc3VwcGx5IGxpbmUgdGVybWluYXRpb24uCisgICAgZmxhZ3MgPCAgMDogIFdyaXRlICdsZW5ndGgnIE5VTCBjaGFyYWN0ZXJzLgorICBTcGVjaWFsIGNhc2U6CisgICAgSWYgZmxhZ3MgPiAtMSBhbmQgcyBpcyBlbXB0eSBvciBOVUxMIGFuZCBsZW5ndGggPT0gMSwgd3JpdGUgMSBOVUwuCisgIFJldHVybnM6CisgICAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiB0byBjaGFubmVsIG9uIHN1Y2Nlc3MsIG9yCisgICAgbmVnYXRpdmUgRlhfeHh4IGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyovCitpbnQKK3pfb3V0KGNoYW5uZWwscyxsZW5ndGgsZmxhZ3MpIGludCBjaGFubmVsLCBmbGFncywgbGVuZ3RoOyBjaGFyICogczsgeworICAgIEZJTEUgKiB0OworICAgIGludCB4LCBuOworICAgIGNoYXIgYyA9ICdcMCc7CisKKyAgICBpZiAoIXMpIHMgPSAiIjsgICAgICAgICAgICAgICAgICAgICAvKiBHdWFyZCBhZ2FpbnN0IG51bGwgcG9pbnRlciAqLworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworICAgICAgICBkZWJ1ZyhGMTExLCJ6X291dCIscyxjaGFubmVsKTsKKyAgICAgICAgZGVidWcoRjEwMSwiel9vdXQgbGVuZ3RoIiwiIixsZW5ndGgpOworICAgICAgICBkZWJ1ZyhGMTAxLCJ6X291dCBmbGFncyIsIiIsZmxhZ3MpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgIGlmICghel9pbml0ZWQpICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgaS9vIGluaXRlZD8gKi8KKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfTk9QKTsKKyAgICBpZiAoY2hhbm5lbCA+PSB6X21heGNoYW4pICAgICAgICAgICAvKiBDaGFubmVsIGluIHJhbmdlPyAqLworICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9DSE4pOworICAgIGlmICghKHQgPSB6X2ZpbGVbY2hhbm5lbF0uel9mcCkpICAgIC8qIEZpbGUgb3Blbj8gKi8KKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfTk9QKTsKKyAgICBpZiAoISgoel9maWxlW2NoYW5uZWxdLnpfZmxhZ3MpICYgKEZNX1dSSXxGTV9BUFApKSkgLyogSW4gd3JpdGUgbW9kZT8gKi8KKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfRk9QKTsKKyAgICBuID0gbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2Ygc3RyaW5nIHRvIHdyaXRlICovCisgICAgaWYgKG4gPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVnYXRpdmUgbWVhbnMgZ2V0IGl0IG91cnNlbHZlcyAqLworICAgICAgICBpZiAoZmxhZ3MgPCAwKSAgICAgICAgICAgICAgICAgIC8qIEV4Y2VwdCB3aGVuIHRvbGQgdG8gd3JpdGUgTlVMcyBpbiAqLworICAgICAgICAgIHJldHVybih6X2Vycm9yID0gRlhfUk5HKTsgICAgIC8qIHdoaWNoIGNhc2UgYXJncyBhcmUgaW5jb25zaXN0ZW50ICovCisgICAgICAgIG4gPSBzdHJsZW4ocyk7ICAgICAgICAgICAgICAgICAgLyogR2V0IGxlbmd0aCBvZiBzdHJpbmcgYXJnICovCisgICAgfQorICAgIGVycm5vID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGVycm5vICovCisgICAgZGVidWcoRjEwMSwiel9vdXQgbiIsIiIsbik7CisgICAgaWYgKGZsYWdzIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgLyogV3JpdGluZyBOVUxzLi4uICovCisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB4ID0gZndyaXRlKCZjLDEsMSx0KTsKKyAgICAgICAgICAgIGlmICh4IDwgMSkKKyAgICAgICAgICAgICAgcmV0dXJuKHpfZXJyb3IgPSAoZXJybm8gPyBGWF9TWVMgOiBGWF9VTkspKTsKKyAgICAgICAgfQorICAgICAgICB6X2ZpbGVbY2hhbm5lbF0uel9ubGluZSA9IC0xOyAgIC8qIEN1cnJlbnQgbGluZSBubyBsb25nZXIga25vd24gKi8KKyAgICAgICAgel9lcnJvciA9IDA7CisgICAgICAgIHJldHVybihpKTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXcml0aW5nIHN0cmluZyBhcmcgKi8KKyAgICAgICAgaWYgKG4gPT0gMSAmJiAhc1swXSkgICAgICAgICAgICAvKiBXcml0aW5nIG9uZSBjaGFyIGJ1dCBpdCdzIE5VTCAqLworICAgICAgICAgIHggPSBmd3JpdGUoJmMsMSwxLHQpOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdyaXRpbmcgbm9uLU5VTCBjaGFyIG9yIHN0cmluZyAqLworICAgICAgICAgIHggPSBmd3JpdGUocywxLG4sdCk7CisgICAgICAgIGRlYnVnKEYxMDEsInpfb3V0IGZ3cml0ZSIsY2tpdG9hKHgpLGVycm5vKTsKKyAgICAgICAgaWYgKHggPCBuKSAgICAgICAgICAgICAgICAgICAgICAvKiBGYWlsdXJlIHRvIHdyaXRlIHJlcXVlc3RlZCBhbW91bnQgKi8KKyAgICAgICAgICByZXR1cm4oel9lcnJvciA9IChlcnJubyA/IEZYX1NZUyA6IEZYX1VOSykpOyAvKiBSZXR1cm4gZXJyb3IgKi8KKyAgICAgICAgaWYgKGZsYWdzID09IDApIHsgICAgICAgICAgICAgICAvKiBJZiBzdXBwbHlpbmcgbGluZSB0ZXJtaW5hdGlvbiAqLworICAgICAgICAgICAgaWYgKGZ3cml0ZSgiXG4iLDEsMSx0KSkgICAgIC8qIGRvIHRoYXQgICovCisgICAgICAgICAgICAgIHggKz0gel9sdDsgICAgICAgICAgICAgICAgLyogY291bnQgdGhlIHRlcm1pbmF0b3IgKi8KKyAgICAgICAgICAgIGlmICh6X2ZpbGVbY2hhbm5lbF0uel9ubGluZSA+IC0xKSAvKiBjb3VudCB0aGlzIGxpbmUgKi8KKyAgICAgICAgICAgICAgel9maWxlW2NoYW5uZWxdLnpfbmxpbmUrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHpfZmlsZVtjaGFubmVsXS56X25saW5lID0gLTE7IC8qIEN1cnJlbnQgbGluZSBubyBsb25nZXIga25vd24gKi8KKyAgICAgICAgfQorICAgIH0KKyAgICB6X2Vycm9yID0gMDsKKyAgICByZXR1cm4oeCk7Cit9CisKKyNkZWZpbmUgWl9JTkJVRkxFTiA2NAorCisvKgorICBaIF8gSSBOICAtLSAgTXVsdGljaGFubmVsIGkvbyBmaWxlIGlucHV0IGZ1bmN0aW9uLgorCisgIENhbGwgd2l0aDoKKyAgICBjaGFubmVsIG51bWJlciB0byByZWFkIGZyb20uCisgICAgcyA9IGFkZHJlc3Mgb2YgZGVzdGluYXRpb24gYnVmZmVyLgorICAgIGJ1ZmxlbiA9IGRlc3RpbmF0aW9uIGJ1ZmZlciBsZW5ndGguCisgICAgbGVuZ3RoID0gTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQsIG11c3QgYmUgPCBidWZsZW4uCisgICAgZmxhZ3M6IDAgPSByZWFkIGEgbGluZTsgbm9uemVybyA9IHJlYWQgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcy4KKyAgUmV0dXJuczoKKyAgICBOdW1iZXIgb2YgYnl0ZXMgcmVhZCBpbnRvIGJ1ZmZlciBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgQSB0ZXJtaW5hdGluZyBOVUwgaXMgZGVwb3NpdGVkIGFmdGVyIHRoZSBsYXN0IGJ5dGUgdGhhdCB3YXMgcmVhZC4KKyovCitpbnQKK3pfaW4oY2hhbm5lbCxzLGJ1ZmxlbixsZW5ndGgsZmxhZ3MpCisgaW50IGNoYW5uZWwsIGJ1ZmxlbiwgbGVuZ3RoLCBmbGFnczsgY2hhciAqIHM7CisvKiB6X2luICovIHsKKyAgICBpbnQgaSwgaiwgeDsKKyAgICBGSUxFICogdDsKKyAgICBjaGFyICogcDsKKworICAgIGlmICghel9pbml0ZWQpICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGV2ZXJ5dGhpbmcuLi4gKi8KKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfTk9QKTsKKyAgICBpZiAoY2hhbm5lbCA+PSB6X21heGNoYW4pCisgICAgICByZXR1cm4oel9lcnJvciA9IEZYX0NITik7CisgICAgaWYgKCEodCA9IHpfZmlsZVtjaGFubmVsXS56X2ZwKSkKKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfTk9QKTsKKyAgICBpZiAoISgoel9maWxlW2NoYW5uZWxdLnpfZmxhZ3MpICYgRk1fUkVBKSkKKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfRk9QKTsKKyAgICBpZiAoIXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBkZXN0aW5hdGlvbiAqLworICAgICByZXR1cm4oel9lcnJvciA9IEZYX1JORyk7CisgICAgc1swXSA9IE5VTDsKKyAgICBpZiAobGVuZ3RoID09IDApICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIDAgYnl0ZXMgLSBlYXN5LiAqLworICAgICAgcmV0dXJuKHpfZXJyb3IgPSAwKTsKKyAgICBkZWJ1ZyhGMTAxLCJ6X2luIGNoYW5uZWwiLCIiLGNoYW5uZWwpOworICAgIGRlYnVnKEYxMDEsInpfaW4gYnVmbGVuIiwiIixidWZsZW4pOworICAgIGRlYnVnKEYxMDEsInpfaW4gbGVuZ3RoIiwiIixsZW5ndGgpOworICAgIGRlYnVnKEYxMDEsInpfaW4gZmxhZ3MiLCIiLGZsYWdzKTsKKyAgICBpZiAobGVuZ3RoIDwgMCB8fCBidWZsZW4gPCAwKSAgICAgICAvKiBDaGVjayBsZW5ndGggYXJncyAqLworICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9STkcpOworICAgIGlmIChidWZsZW4gPD0gbGVuZ3RoKQorICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9STkcpOworICAgIGVycm5vID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGVycm5vICovCisgICAgaWYgKGZsYWdzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCBibG9jayBvciBieXRlICovCisgICAgICAgIGkgPSBmcmVhZChzLDEsbGVuZ3RoLHQpOworI2lmZGVmIERFQlVHCisgICAgICAgIGlmIChkZWJsb2cpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsInpfaW4gYmxvY2siLHMsaSk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6X2luIGJsb2NrIGVycm5vIiwiIixlcnJubyk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6X2luIGJsb2NrIGZlcnJvciIsIiIsZmVycm9yKHQpKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInpfaW4gYmxvY2sgZmVvZiIsIiIsZmVvZih0KSk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICB6X2ZpbGVbY2hhbm5lbF0uel9ubGluZSA9IC0xOyAgIC8qIEN1cnJlbnQgbGluZSBubyBsb25nZXIga25vd24gKi8KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIGxpbmUgKi8KKyNpZm5kZWYgQ09NTUVOVAorICAgICAgICAvKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJlY2F1c2UgaXQncyBzaW1wbGVyIHRoYW4gdGhlIG90aGVycyAqLworICAgICAgICAvKiBhbmQgYWxzbyBtYXJnaW5hbGx5IGZhc3Rlci4gKi8KKyAgICAgICAgZGVidWcoRjEwMSwiel9pbiBnZXRjIGxvb3AiLCIiLGZ0ZWxsKHQpKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKHggPSBnZXRjKHQpKSA9PSBFT0YpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJ6X2luIGdldGMgZXJyb3IiLCIiLGZ0ZWxsKHQpKTsKKyAgICAgICAgICAgICAgICBzW2ldID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNbaV0gPSB4OworICAgICAgICAgICAgaWYgKHNbaV0gPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIHNbaV0gPSAnXDAnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTEsInpfaW4gbGluZSBieXRlIGxvb3AiLGNraXRvYShlcnJubyksaSk7CisgICAgICAgIGRlYnVnKEYxMTEsInpfaW4gbGluZSBnb3QiLHMsel9maWxlW2NoYW5uZWxdLnpfbmxpbmUpOworICAgICAgICBpZiAoel9maWxlW2NoYW5uZWxdLnpfbmxpbmUgPiAtMSkKKyAgICAgICAgICB6X2ZpbGVbY2hhbm5lbF0uel9ubGluZSsrOworI2Vsc2UKKyNpZmRlZiBDT01NRU5UMgorICAgICAgICAvKiBTdHJhaWdodGZvcndhcmQgYnV0IHN0cmxlbigpIHNsb3dzIGl0IGRvd24uICovCisgICAgICAgIHNbMF0gPSAnXDAnOworICAgICAgICBpID0gMDsKKyAgICAgICAgaWYgKGZnZXRzKHMsbGVuZ3RoLHQpKSB7CisgICAgICAgICAgICBpID0gc3RybGVuKHMpOworICAgICAgICAgICAgaWYgKGkgPiAwICYmIHNbaS0xXSA9PSAnXG4nKSBpLS07CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjExMSwiel9pbiBsaW5lIGZnZXRzIixja2l0b2EoZXJybm8pLGkpOworICAgICAgICBpZiAoel9maWxlW2NoYW5uZWxdLnpfbmxpbmUgPiAtMSkKKyAgICAgICAgICB6X2ZpbGVbY2hhbm5lbF0uel9ubGluZSsrOworI2Vsc2UKKyAgICAgICAgLyogVGhpcyBpcyBhIGRvLWl0LXlvdXJzZWxmIGZnZXRzKCkgd2l0aCBpdHMgb3duIHJlYWRhaGVhZCBhbmQgKi8KKyAgICAgICAgLyogcHV0YmFjay4gIEl0J3MgYSBiaXQgZmFzdGVyIHRoYW4gcmVhbCBmZ2V0cygpIGJ1dCBub3QgZW5vdWdoICovCisgICAgICAgIC8qIHRvIGp1c3RpZnkgdGhlIGFkZGVkIGNvbXBsZXhpdHkgb3IgdGhlIHJpc2sgb2YgdGhlIGZ0ZWxsKCkgYW5kICovCisgICAgICAgIC8qIGZzZWVrKCkgY2FsbHMgZmFpbGluZy4gKi8KKyAgICAgICAgaW50IGssIGZsYWcgPSAwOworICAgICAgICBsb25nIHBvczsKKyAgICAgICAgZm9yIChpID0gMDsgIWZsYWcgJiYgaSA8PSAobGVuZ3RoIC0gWl9JTkJVRkxFTik7IGkgKz0gWl9JTkJVRkxFTikgeworICAgICAgICAgICAgayA9ICgobGVuZ3RoIC0gaSkgPCBaX0lOQlVGTEVOKSA/IGxlbmd0aCAtIGkgOiBaX0lOQlVGTEVOOworICAgICAgICAgICAgaWYgKCh4ID0gZnJlYWQocytpLDEsayx0KSkgPCAxKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHNbaSt4XSA9ICdcMCc7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgeDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNbaStqXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgIHNbaStqXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIGZsYWcgKys7CisgICAgICAgICAgICAgICAgICAgIHBvcyA9IGZ0ZWxsKHQpOworICAgICAgICAgICAgICAgICAgICBpZiAocG9zID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyAtPSAoeCAtIGogLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBmc2Vlayh0LCBwb3MsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybih6X2Vycm9yID0gRlhfU1lTKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHpfZmlsZVtjaGFubmVsXS56X25saW5lID4gLTEpCisgICAgICAgICAgel9maWxlW2NoYW5uZWxdLnpfbmxpbmUrKzsKKyAgICAgICAgZGVidWcoRjExMSwiel9pbiBsaW5lIGNodW5rIGxvb3AiLGNraXRvYShlcnJubyksaSk7CisjZW5kaWYgLyogQ09NTUVOVDIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfQorICAgIGRlYnVnKEYxMTEsInpfaW4gaSIsY2tpdG9hKGVycm5vKSxpKTsKKyAgICBpZiAoaSA8IDApIGkgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBOVUwtdGVybWluYXRlIHJlc3VsdCAqLworICAgIHNbaV0gPSAnXDAnOworICAgIGlmIChpID4gMCkgeworICAgICAgICB6X2Vycm9yID0gMDsKKyAgICAgICAgcmV0dXJuKGkpOworICAgIH0KKyAgICBpZiAoaSA9PSAwICYmIGZlb2YodCkpICAgICAgICAgICAgICAvKiBFT0Ygb24gcmVhZGluZz8gKi8KKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfRU9GKTsgICAgICAgICAvKiBSZXR1cm4gRU9GIGNvZGUgKi8KKyAgICByZXR1cm4oZXJybm8gPyAoel9lcnJvciA9IC0xKSA6IGkpOyAvKiBSZXR1cm4gbGVuZ3RoIG9yIHN5c3RlbSBlcnJvciAqLworfQorCitpbnQKK3pfZmx1c2goY2hhbm5lbCkgaW50IGNoYW5uZWw7IHsgICAgICAgICAvKiBGbHVzaCBvdXRwdXQgY2hhbm5lbCAqLworICAgIEZJTEUgKiB0OworICAgIGludCB4OworICAgIGlmICghel9pbml0ZWQpICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ3VsYXIgY2hlY2tzICovCisgICAgICByZXR1cm4oel9lcnJvciA9IEZYX05PUCk7CisgICAgaWYgKGNoYW5uZWwgPj0gel9tYXhjaGFuKQorICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9DSE4pOworICAgIGlmICghKHQgPSB6X2ZpbGVbY2hhbm5lbF0uel9mcCkpCisgICAgICByZXR1cm4oel9lcnJvciA9IEZYX05PUCk7CisgICAgaWYgKCEoKHpfZmlsZVtjaGFubmVsXS56X2ZsYWdzKSAmIChGTV9XUkl8Rk1fQVBQKSkpIC8qIFdyaXRlIGFjY2Vzcz8gKi8KKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfRk9QKTsKKyAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBlcnJubyAqLworICAgIHggPSBmZmx1c2godCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSB0byBmbHVzaCAqLworICAgIHJldHVybih4ID8gKHpfZXJyb3IgPSBGWF9TWVMpIDogMCk7IC8qIFJldHVybiBzeXN0ZW0gZXJyb3Igb3IgMCBpZiBPSyAqLworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworel9zZWVrKGludCBjaGFubmVsLCBsb25nIHBvcykgICAgICAgICAgIC8qIE1vdmUgZmlsZSBwb2ludGVyIHRvIGJ5dGUgKi8KKyNlbHNlCit6X3NlZWsoY2hhbm5lbCxwb3MpIGludCBjaGFubmVsOyBsb25nIHBvczsgLyogKHNlZWsgdG8gZ2l2ZW4gcG9zaXRpb24pICovCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpbnQgaSwgeCA9IDAsIHJjOworICAgIEZJTEUgKiB0OworICAgIGlmICghel9pbml0ZWQpICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrLi4uICovCisgICAgICByZXR1cm4oel9lcnJvciA9IEZYX05PUCk7CisgICAgaWYgKGNoYW5uZWwgPj0gel9tYXhjaGFuKQorICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9DSE4pOworICAgIGlmICghKHQgPSB6X2ZpbGVbY2hhbm5lbF0uel9mcCkpCisgICAgICByZXR1cm4oel9lcnJvciA9IEZYX05PUCk7CisgICAgaWYgKHBvcyA8IDBMKSB7CisgICAgICAgIHggPSAyOworICAgICAgICBwb3MgPSAocG9zID09IC0yKSA/IC0xTCA6IDBMOworICAgIH0KKyAgICBlcnJubyA9IDA7CisgICAgcmMgPSBmc2Vlayh0LHBvcyx4KTsgICAgICAgICAgICAgICAgLyogVHJ5IHRvIHNlZWsgKi8KKyAgICBkZWJ1ZyhGMTExLCJ6X3NlZWsiLGNraXRvYShlcnJubykscmMpOworICAgIGlmIChyYyA8IDApICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9LPyAqLworICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9TWVMpOyAvKiBOby4gKi8KKyAgICB6X2ZpbGVbY2hhbm5lbF0uel9ubGluZSA9ICgocG9zIHx8IHgpID8gLTEgOiAwKTsKKyAgICByZXR1cm4oel9lcnJvciA9IDApOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworel9saW5lKGludCBjaGFubmVsLCBsb25nIHBvcykgICAgICAgICAgIC8qIE1vdmUgZmlsZSBwb2ludGVyIHRvIGxpbmUgKi8KKyNlbHNlCit6X2xpbmUoY2hhbm5lbCxwb3MpIGludCBjaGFubmVsOyBsb25nIHBvczsgLyogKHNlZWsgdG8gZ2l2ZW4gcG9zaXRpb24pICovCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpbnQgaSwgbGVuLCB4ID0gMDsKKyAgICBsb25nIGN1cnJlbnQgPSAwTCwgcHJldiA9IC0xTCwgb2xkID0gLTFMOworICAgIEZJTEUgKiB0OworICAgIGNoYXIgdG1wYnVmWzI1Nl07CisgICAgaWYgKCF6X2luaXRlZCkgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2suLi4gKi8KKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfTk9QKTsKKyAgICBpZiAoY2hhbm5lbCA+PSB6X21heGNoYW4pCisgICAgICByZXR1cm4oel9lcnJvciA9IEZYX0NITik7CisgICAgaWYgKCEodCA9IHpfZmlsZVtjaGFubmVsXS56X2ZwKSkKKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfTk9QKTsKKyAgICBkZWJ1ZyhGMTAxLCJ6X2xpbmUgcG9zIiwiIixwb3MpOworICAgIGlmIChwb3MgPCAwTCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIEVPRiB3YW50ZWQgKi8KKyAgICAgICAgbG9uZyBuOworICAgICAgICBuID0gel9maWxlW2NoYW5uZWxdLnpfbmxpbmU7CisgICAgICAgIGRlYnVnKEYxMDEsInpfbGluZSBuIiwiIixuKTsKKyAgICAgICAgaWYgKG4gPCAwIHx8IHBvcyA8IDApIHsKKyAgICAgICAgICAgIHJld2luZCh0KTsKKyAgICAgICAgICAgIG4gPSAwOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBjb3VsZCB0YWtlIGEgd2hpbGUuLi4gKi8KKyAgICAgICAgICAgIGlmICgoeCA9IGdldGModCkpID09IEVPRikKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoeCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gLTIpIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkID0gcHJldjsKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IGZ0ZWxsKHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWJ1ZyhGMTAxLCJ6X2xpbmUgb2xkIiwiIixvbGQpOworICAgICAgICBkZWJ1ZyhGMTAxLCJ6X2xpbmUgcHJldiIsIiIscHJldik7CisgICAgICAgIGlmIChwb3MgPT0gLTIpIHsKKyAgICAgICAgICAgIGlmICgoeCA9IHpfc2VlayhjaGFubmVsLG9sZCkpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHpfZXJyb3IgPSB4KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgbi0tOworICAgICAgICB9CisgICAgICAgIHpfZmlsZVtjaGFubmVsXS56X25saW5lID0gbjsKKyAgICAgICAgcmV0dXJuKHpfZXJyb3IgPSAwKTsKKyAgICB9CisgICAgaWYgKHBvcyA9PSAwTCkgeyAgICAgICAgICAgICAgICAgICAgLyogUmV3aW5kIHdhbnRlZCAqLworICAgICAgICB6X2ZpbGVbY2hhbm5lbF0uel9ubGluZSA9IDBMOworICAgICAgICByZXdpbmQodCk7CisgICAgICAgIGRlYnVnKEYxMDAsInpfbGluZSByZXdpbmQiLCIiLDApOworICAgICAgICByZXR1cm4oMEwpOworICAgIH0KKyAgICB0bXBidWZbMjU1XSA9IE5VTDsgICAgICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgYnVmIGlzIE5VTCB0ZXJtaW5hdGVkICovCisgICAgY3VycmVudCA9IHpfZmlsZVtjaGFubmVsXS56X25saW5lOyAgLyogQ3VycmVudCBsaW5lICovCisgICAgLyoKKyAgICAgIElmIG5lY2Vzc2FyeSB0aGUgZm9sbG93aW5nIGNvdWxkIGJlIG9wdGltaXplZCwgZS5nLiBmb3IgcG9zaXRpb25pbmcKKyAgICAgIHRvIGEgcHJldmlvdXMgbGluZSBpbiBhIGxhcmdlIGZpbGUgd2l0aG91dCBzdGFydGluZyBvdmVyLgorICAgICovCisgICAgaWYgKGN1cnJlbnQgPCAwIHx8IHBvcyA8IGN1cnJlbnQpIHsgLyogTm90IGtub3duIG9yIGJlaGluZCB1cy4uLiAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJ6X2xpbmUgcmV3aW5kaW5nIiwiIixwb3MpOworICAgICAgICBpZiAoKHggPSB6X3NlZWsoY2hhbm5lbCwgMEwpKSA8IDApIC8qIFJld2luZCAqLworICAgICAgICAgIHJldHVybih6X2Vycm9yID0geCk7CisgICAgICAgIGlmIChwb3MgPT0gMCkgICAgICAgICAgICAgICAgICAgLyogSWYgMHRoIGxpbmUgd2FudGVkIHdlJ3JlIGRvbmUgKi8KKyAgICAgICAgICByZXR1cm4oel9lcnJvciA9IDApOworICAgICAgICBjdXJyZW50ID0gMDsKKyAgICB9CisgICAgd2hpbGUgKGN1cnJlbnQgPCBwb3MpIHsgICAgICAgICAgICAgLyogU2VhcmNoIGZvciBzcGVjaWZpZWQgbGluZSAqLworICAgICAgICBpZiAoZmdldHModG1wYnVmLDI1NSx0KSkgeworICAgICAgICAgICAgbGVuID0gc3RybGVuKHRtcGJ1Zik7CisgICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0bXBidWZbbGVuLTFdID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50Kys7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiel9saW5lIHJlYWQiLGNraXRvYShsZW4pLGN1cnJlbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybih6X2Vycm9yID0gRlhfVU5LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHpfZmlsZVtjaGFubmVsXS56X25saW5lID0gLTFMOworICAgICAgICAgICAgZGVidWcoRjEwMSwiel9saW5lIHByZW1hdHVyZSBFT0YiLCIiLGN1cnJlbnQpOworICAgICAgICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9FT0YpOworICAgICAgICB9CisgICAgfQorICAgIHpfZmlsZVtjaGFubmVsXS56X25saW5lID0gY3VycmVudDsKKyAgICBkZWJ1ZyhGMTAxLCJ6X2xpbmUgcmVzdWx0IiwiIixjdXJyZW50KTsKKyAgICB6X2Vycm9yID0gMDsKKyAgICByZXR1cm4oY3VycmVudCk7Cit9CisKK2NoYXIgKgorel9nZXRuYW1lKGNoYW5uZWwpIGludCBjaGFubmVsOyB7ICAgICAgIC8qIFJldHVybiBuYW1lIG9mIGZpbGUgb24gY2hhbm5lbCAqLworICAgIEZJTEUgKiB0OworICAgIGlmICghel9pbml0ZWQpIHsKKyAgICAgICAgel9lcnJvciA9IEZYX05PUDsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBpZiAoY2hhbm5lbCA+PSB6X21heGNoYW4pIHsKKyAgICAgICAgel9lcnJvciA9IEZYX0NITjsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBpZiAoISh0ID0gel9maWxlW2NoYW5uZWxdLnpfZnApKSB7CisgICAgICAgIHpfZXJyb3IgPSBGWF9OT1A7CisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuKChjaGFyICopKHpfZmlsZVtjaGFubmVsXS56X25hbWUpKTsKK30KKworaW50Cit6X2dldG1vZGUoY2hhbm5lbCkgaW50IGNoYW5uZWw7IHsgICAgICAgLyogUmV0dXJuIE9QRU4gbW9kZXMgb2YgY2hhbm5lbCAqLworICAgIEZJTEUgKiB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgaWYgZmlsZSBub3Qgb3BlbiAqLworI2lmbmRlZiBOT1NUQVQKKyNpZmRlZiBOVAorICAgIHN0cnVjdCBfc3RhdCBzdGF0YnVmOworI2Vsc2UgLyogTlQgKi8KKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogTk9TVEFUICovCisgICAgaW50IHg7CisgICAgaWYgKCF6X2luaXRlZCkKKyAgICAgIHJldHVybigwKTsKKyAgICBpZiAoY2hhbm5lbCA+PSB6X21heGNoYW4pCisgICAgICByZXR1cm4oel9lcnJvciA9IEZYX0NITik7CisgICAgaWYgKCEodCA9IHpfZmlsZVtjaGFubmVsXS56X2ZwKSkKKyAgICAgIHJldHVybigwKTsKKyAgICB4ID0gel9maWxlW2NoYW5uZWxdLnpfZmxhZ3M7CisgICAgaWYgKGZlb2YodCkpIHsgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBtaWdodCBub3Qgd29yayBmb3IgKi8KKyAgICAgICAgeCB8PSBGTV9FT0Y7ICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgZmlsZXMgKi8KKyNpZm5kZWYgTk9TVEFUCisgICAgLyogQnV0IHRoaXMgZG9lcyBpZiB3ZSBjYW4gdXNlIGl0LiAqLworICAgIH0gZWxzZSBpZiAoc3RhdCh6X2ZpbGVbY2hhbm5lbF0uel9uYW1lLCZzdGF0YnVmKSA+IC0xKSB7CisgICAgICAgIGlmIChmdGVsbCh0KSA9PSBzdGF0YnVmLnN0X3NpemUpCisgICAgICAgICAgeCB8PSBGTV9FT0Y7CisjZW5kaWYgLyogTk9TVEFUICovCisgICAgfQorICAgIHJldHVybih4KTsKK30KKworbG9uZworel9nZXRwb3MoY2hhbm5lbCkgaW50IGNoYW5uZWw7IHsgICAgICAgIC8qIEdldCBmaWxlIHBvaW50ZXIgcG9zaXRpb24gKi8KKyAgICBGSUxFICogdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiB0aGlzIGNoYW5uZWwgKi8KKyAgICBsb25nIHg7CisgICAgaWYgKCF6X2luaXRlZCkKKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfTk9QKTsKKyAgICBpZiAoY2hhbm5lbCA+PSB6X21heGNoYW4pCisgICAgICByZXR1cm4oel9lcnJvciA9IEZYX0NITik7CisgICAgaWYgKCEodCA9IHpfZmlsZVtjaGFubmVsXS56X2ZwKSkKKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfTk9QKTsKKyAgICB4ID0gZnRlbGwodCk7CisgICAgcmV0dXJuKCh4IDwgMEwpID8gKHpfZXJyb3IgPSBGWF9TWVMpIDogeCk7Cit9CisKK2xvbmcKK3pfZ2V0bGluZShjaGFubmVsKSBpbnQgY2hhbm5lbDsgeyAgICAgICAvKiBHZXQgY3VycmVudCBsaW5lIG51bWJlciAqLworICAgIEZJTEUgKiB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIGZpbGUgb24gdGhpcyBjaGFubmVsICovCisgICAgbG9uZyByYzsKKyAgICBpZiAoIXpfaW5pdGVkKQorICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9OT1ApOworICAgIGlmIChjaGFubmVsID49IHpfbWF4Y2hhbikKKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfQ0hOKTsKKyAgICBpZiAoISh0ID0gel9maWxlW2NoYW5uZWxdLnpfZnApKQorICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9OT1ApOworICAgIGRlYnVnKEYxMDEsInpfZ2V0bGluZSIsIiIsel9maWxlW2NoYW5uZWxdLnpfbmxpbmUpOworICAgIHJjID0gel9maWxlW2NoYW5uZWxdLnpfbmxpbmU7CisgICAgcmV0dXJuKChyYyA8IDApID8gKHpfZXJyb3IgPSBGWF9MTlUpIDogcmMpOworfQorCitpbnQKK3pfZ2V0Zm51bShjaGFubmVsKSBpbnQgY2hhbm5lbDsgeyAgICAgICAvKiBHZXQgZmlsZSBudW1iZXIgLyBoYW5kbGUgKi8KKyAgICBGSUxFICogdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgZmlsZSBvbiB0aGlzIGNoYW5uZWwgKi8KKyAgICBpZiAoIXpfaW5pdGVkKQorICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9OT1ApOworICAgIGlmIChjaGFubmVsID49IHpfbWF4Y2hhbikKKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfQ0hOKTsKKyAgICBpZiAoISh0ID0gel9maWxlW2NoYW5uZWxdLnpfZnApKQorICAgICAgcmV0dXJuKHpfZXJyb3IgPSBGWF9OT1ApOworICAgIHpfZXJyb3IgPSAwOworICAgIHJldHVybihmaWxlbm8odCkpOworfQorCisvKgorICBMaW5lLW9yaWVudGVkIGNvdW50cyBhbmQgc2Vla3MgYXJlIGFzIGR1bWIgYXMgdGhleSBjYW4gYmUgYXQgdGhlIG1vbWVudC4KKyAgTGF0ZXIgd2UgY2FuIHNwZWVkIHRoZW0gdXAgYnkgYnVpbGRpbmcgbGl0dGxlIGluZGV4ZXMuCisqLworbG9uZworel9jb3VudChjaGFubmVsLCB3aGF0KSBpbnQgY2hhbm5lbCwgd2hhdDsgeyAvKiBDb3VudCBieXRlcyBvciBsaW5lcyBpbiBmaWxlICovCisgICAgRklMRSAqIHQ7CisgICAgaW50IGksIHg7CisgICAgbG9uZyBwb3MsIGNvdW50ID0gMEw7CisgICAgaWYgKCF6X2luaXRlZCkgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgc3R1ZmYuLi4gKi8KKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfTk9QKTsKKyAgICBpZiAoY2hhbm5lbCA+PSB6X21heGNoYW4pCisgICAgICByZXR1cm4oel9lcnJvciA9IEZYX0NITik7CisgICAgaWYgKCEodCA9IHpfZmlsZVtjaGFubmVsXS56X2ZwKSkKKyAgICAgIHJldHVybih6X2Vycm9yID0gRlhfTk9QKTsKKyAgICBwb3MgPSBmdGVsbCh0KTsgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIGN1cnJlbnQgZmlsZSBwb2ludGVyICovCisgICAgZXJybm8gPSAwOworICAgIHpfZXJyb3IgPSAwOworICAgIGlmICh3aGF0ID09IFJEX0NIQVIpIHsgICAgICAgICAgICAgIC8qIFNpemUgaW4gYnl0ZXMgcmVxdWVzdGVkICovCisgICAgICAgIGlmICghZnNlZWsodCwwTCwyKSkgeyAgICAgICAgICAgLyogU2VlayB0byBlbmQgKi8KKyAgICAgICAgICAgIGNvdW50ID0gZnRlbGwodCk7ICAgICAgICAgICAvKiBHZXQgZmlsZSBwb2ludGVyICovCisgICAgICAgICAgICBmc2Vlayh0LHBvcywwKTsgICAgICAgICAgICAgLyogUmVzdG9yZSBmaWxlIGZpbGUgcG9pbnRlciAqLworICAgICAgICAgICAgcmV0dXJuKGNvdW50KTsKKyAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYWxsYmFjayBpbiBjYXNlIHNlZWsgZmFpbHMgKi8KKyAgICAgICAgICByZXR1cm4oemdldGZzKHpfZmlsZVtjaGFubmVsXS56X25hbWUpKTsKKyAgICB9CisgICAgcmV3aW5kKHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGluZSBjb3VudCByZXF1ZXN0ZWQgLSByZXdpbmQuICovCisgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ291bnQgbGluZXMuICovCisgICAgICAgIGlmICgoeCA9IGdldGModCkpID09IEVPRikgICAgICAgLyogU3R1cGlkIGJ5dGUgbG9vcCAqLworICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1dCBpdCB3b3JrcyBhcyB3ZWxsIGFzIGFueXRoaW5nICovCisgICAgICAgIGlmICh4ID09ICdcbicpICAgICAgICAgICAgICAgICAgLyogZWxzZS4uLiAqLworICAgICAgICAgIGNvdW50Kys7CisgICAgfQorICAgIHggPSBmc2Vlayh0LHBvcywwKTsgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgZmlsZSBwb2ludGVyICovCisgICAgcmV0dXJuKGNvdW50KTsKK30KKworLyogVXNlciBpbnRlcmZhY2UgZm9yIGdlbmVyYWxpemVkIGNoYW5uZWwtb3JpZW50ZWQgZmlsZSBpL28gKi8KKworc3RydWN0IGtleXRhYiBmY3RhYltdID0geyAgICAgICAgICAgICAgIC8qIEZJTEUgc3ViY29tbWFuZHMgKi8KKyAgICB7ICJjbG9zZSIsICAgICAgRklMX0NMUywgMCB9LAorICAgIHsgImNvdW50IiwgICAgICBGSUxfQ09VLCAwIH0sCisgICAgeyAiZmx1c2giLCAgICAgIEZJTF9GTFUsIDAgfSwKKyAgICB7ICJsaXN0IiwgICAgICAgRklMX0xJUywgMCB9LAorICAgIHsgIm9wZW4iLCAgICAgICBGSUxfT1BOLCAwIH0sCisgICAgeyAicmVhZCIsICAgICAgIEZJTF9SRUEsIDAgfSwKKyAgICB7ICJyZXdpbmQiLCAgICAgRklMX1JFVywgMCB9LAorICAgIHsgInNlZWsiLCAgICAgICBGSUxfU0VFLCAwIH0sCisgICAgeyAic3RhdHVzIiwgICAgIEZJTF9TVEEsIDAgfSwKKyAgICB7ICJ3cml0ZSIsICAgICAgRklMX1dSSSwgMCB9Cit9OworaW50IG5mY3RhYiA9IChzaXplb2YgKGZjdGFiKSAvIHNpemVvZiAoc3RydWN0IGtleXRhYikpOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBmY3N3dGFiW10gPSB7ICAgICAgLyogT1BFTiBtb2RlcyAqLworICAgIHsgIi9hcHBlbmQiLCAgICBGTV9BUFAsICAwIH0sCisgICAgeyAiL2JpbmFyeSIsICAgIEZNX0JJTiwgIDAgfSwKKyNpZmRlZiBDT01NRU5UCisgICAgeyAiL2NvbW1hbmQiLCAgIEZNX0NNRCwgIDAgfSwgICAgICAgLyogTm90IGltcGxlbWVudGVkICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHsgIi9yZWFkIiwgICAgICBGTV9SRUEsICAwIH0sCisgICAgeyAiL3dyaXRlIiwgICAgIEZNX1dSSSwgIDAgfQorfTsKK3N0YXRpYyBpbnQgbmZjc3d0YWIgPSAoc2l6ZW9mIChmY3N3dGFiKSAvIHNpemVvZiAoc3RydWN0IGtleXRhYikpOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBmY2xrd3RhYltdID0geyAgICAgLyogQ0xPU0Ugb3B0aW9ucyAqLworICAgIHsgImFsbCIsICAgICAgICAxLCAgICAgICAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGZzZWt3dGFiW10gPSB7ICAgICAvKiBTRUVLIHN5bWJvbHMgKi8KKyAgICB7ICJlb2YiLCAgICAgICAgMSwgICAgICAgMCB9LAorICAgIHsgImxhc3QiLCAgICAgICAyLCAgICAgICAwIH0KK307CitzdGF0aWMgaW50IG5mc2Vrd3RhYiA9IChzaXplb2YgKGZzZWt3dGFiKSAvIHNpemVvZiAoc3RydWN0IGtleXRhYikpOworCisjZGVmaW5lIFNFRV9MSU5FICBSRF9MSU5FICAgICAgICAgICAgICAgLyogU0VFSyBvcHRpb25zICovCisjZGVmaW5lIFNFRV9DSEFSICBSRF9DSEFSCisjZGVmaW5lIFNFRV9SRUwgICAzCisjZGVmaW5lIFNFRV9BQlMgICA0CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGZza3N3dGFiW10gPSB7CisgICAgeyAiL2Fic29sdXRlIiwgIFNFRV9BQlMsICAwIH0sCisgICAgeyAiL2J5dGUiLCAgICAgIFNFRV9DSEFSLCAwIH0sCisgICAgeyAiL2NoYXJhY3RlciIsIFNFRV9DSEFSLCBDTV9JTlYgfSwKKyAgICB7ICIvbGluZSIsICAgICAgU0VFX0xJTkUsIDAgfSwKKyAgICB7ICIvcmVsYXRpdmUiLCAgU0VFX1JFTCwgIDAgfQorfTsKK3N0YXRpYyBpbnQgbmZza3N3dGFiID0gKHNpemVvZiAoZnNrc3d0YWIpIC8gc2l6ZW9mIChzdHJ1Y3Qga2V5dGFiKSk7CisKKyNkZWZpbmUgQ09VX0xJTkUgIFJEX0xJTkUgICAgICAgICAgICAgICAvKiBDT1VOVCBvcHRpb25zICovCisjZGVmaW5lIENPVV9DSEFSICBSRF9DSEFSCisjZGVmaW5lIENPVV9MSVMgICAzCisjZGVmaW5lIENPVV9OT0wgICA0CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGZjb3N3dGFiW10gPSB7CisgICAgeyAiL2J5dGVzIiwgICAgIENPVV9DSEFSLCAwICAgICAgfSwKKyAgICB7ICIvY2hhcmFjdGVycyIsQ09VX0NIQVIsIENNX0lOViB9LAorICAgIHsgIi9saW5lcyIsICAgICBDT1VfTElORSwgMCAgICAgIH0sCisgICAgeyAiL2xpc3QiLCAgICAgIENPVV9MSVMsICAwICAgICAgfSwKKyAgICB7ICIvbm9saXN0IiwgICAgQ09VX05PTCwgIDAgICAgICB9LAorICAgIHsgIi9xdWlldCIsICAgICBDT1VfTk9MLCAgQ01fSU5WIH0KK307CitzdGF0aWMgaW50IG5mY29zd3RhYiA9IChzaXplb2YgKGZjb3N3dGFiKSAvIHNpemVvZiAoc3RydWN0IGtleXRhYikpOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBmcmR0YWJbXSA9IHsgICAgICAgLyogUkVBRCB0eXBlcyAqLworICAgIHsgIi9ibG9jayIsICAgICBSRF9TSVpFLCBDTV9JTlZ8Q01fQVJHIH0sCisgICAgeyAiL2J5dGUiLCAgICAgIFJEX0NIQVIsIENNX0lOViB9LAorICAgIHsgIi9jaGFyYWN0ZXIiLCBSRF9DSEFSLCAwICAgICAgfSwKKyAgICB7ICIvbGluZSIsICAgICAgUkRfTElORSwgMCAgICAgIH0sCisgICAgeyAiL3NpemUiLCAgICAgIFJEX1NJWkUsIENNX0FSRyB9LAorICAgIHsgIi90cmltIiwgICAgICBSRF9UUklNLCAwICAgICAgfSwKKyAgICB7ICIvdW50YWJpZnkiLCAgUkRfVU5UQSwgMCAgICAgIH0KK307CitzdGF0aWMgaW50IG5mcmR0YWIgPSAoc2l6ZW9mIChmcmR0YWIpIC8gc2l6ZW9mIChzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGZ3cnRhYltdID0geyAgICAgICAvKiBXUklURSB0eXBlcyAqLworICAgIHsgIi9ibG9jayIsICAgICBXUl9TSVpFLCBDTV9JTlZ8Q01fQVJHIH0sCisgICAgeyAiL2J5dGUiLCAgICAgIFdSX0NIQVIsIENNX0lOViB9LAorICAgIHsgIi9jaGFyYWN0ZXIiLCBXUl9DSEFSLCAwICAgICAgfSwKKyAgICB7ICIvbGluZSIsICAgICAgV1JfTElORSwgMCAgICAgIH0sCisgICAgeyAiL2xwYWQiLCAgICAgIFdSX0xQQUQsIENNX0FSRyB9LAorICAgIHsgIi9ycGFkIiwgICAgICBXUl9SUEFELCBDTV9BUkcgfSwKKyAgICB7ICIvc2l6ZSIsICAgICAgV1JfU0laRSwgQ01fQVJHIH0sCisgICAgeyAiL3N0cmluZyIsICAgIFdSX1NUUkksIDAgICAgICB9Cit9Oworc3RhdGljIGludCBuZndydGFiID0gKHNpemVvZiAoZndydGFiKSAvIHNpemVvZiAoc3RydWN0IGtleXRhYikpOworCitzdGF0aWMgY2hhciBibGFua3NbXSA9ICJcMDQwXDA0MFwwNDBcMDQwIjsgLyogU29tZSBibGFua3MgZm9yIGZvcm1hdHRpbmcgKi8KKworaW50Citkb2ZpbGUob3ApIGludCBvcDsgeyAgICAgICAgICAgICAgICAgICAgLyogRG8gdGhlIEZJTEUgY29tbWFuZCAqLworICAgIGNoYXIgdm5hbWJ1ZltWTkFNTF07ICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBmb3IgdmFyaWFibGUgbmFtZXMgKi8KKyAgICBjaGFyICp2bnAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHNhbWUgKi8KKyAgICBjaGFyIHpmaWxuYW1bQ0tNQVhQQVRIKzJdOworICAgIGNoYXIgKiBwOworICAgIHN0cnVjdCBGREIgZmwsIHN3LCBudTsKKyAgICBsb25nIHo7CisgICAgaW50IHJzaXplLCBmaWxtb2RlID0gMCwgcmVsYXRpdmUgPSAtMSwgZW9mZmxnID0gMDsKKyAgICBpbnQgcmMsIHgsIHksIGN4LCBuLCBnZXR2YWwsIGR1bW15LCBjb25maXJtZWQsIGxpc3RpbmcgPSAtMTsKKyAgICBpbnQgY2hhcmZsYWcgPSAwLCBzaXplZmxhZyA9IDA7CisgICAgaW50IHBhZCA9IDMyLCB3cl9scGFkID0gMCwgd3JfcnBhZCA9IDAsIHJkX3RyaW0gPSAwLCByZF91bnRhYiA9IDA7CisKKyAgICBpZiAob3AgPT0gWFhGSUxFKSB7ICAgICAgICAgICAgICAgICAvKiBGSUxFIGNvbW1hbmQgd2FzIGdpdmVuICovCisgICAgICAgIC8qIEdldCBzdWJjb21tYW5kICovCisgICAgICAgIGlmICgoY3ggPSBjbWtleShmY3RhYixuZmN0YWIsIk9wZXJhdGlvbiIsIiIseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChjeCA9PSAtMykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0ZpbGUgb3BlcmF0aW9uIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oY3gpOworICAgICAgICB9CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnRoYW5kIGNvbW1hbmQgd2FzIGdpdmVuICovCisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICBjYXNlIFhYRl9DTDogY3ggPSBGSUxfQ0xTOyBicmVhazsgLyogRkNMT1NFICovCisgICAgICAgICAgY2FzZSBYWEZfRkw6IGN4ID0gRklMX0ZMVTsgYnJlYWs7IC8qIEZGTFVTSCAqLworICAgICAgICAgIGNhc2UgWFhGX0xJOiBjeCA9IEZJTF9MSVM7IGJyZWFrOyAvKiBGTElTVCAqLworICAgICAgICAgIGNhc2UgWFhGX09QOiBjeCA9IEZJTF9PUE47IGJyZWFrOyAvKiBldGMuLi4gKi8KKyAgICAgICAgICBjYXNlIFhYRl9SRTogY3ggPSBGSUxfUkVBOyBicmVhazsKKyAgICAgICAgICBjYXNlIFhYRl9SVzogY3ggPSBGSUxfUkVXOyBicmVhazsKKyAgICAgICAgICBjYXNlIFhYRl9TRTogY3ggPSBGSUxfU0VFOyBicmVhazsKKyAgICAgICAgICBjYXNlIFhYRl9TVDogY3ggPSBGSUxfU1RBOyBicmVhazsKKyAgICAgICAgICBjYXNlIFhYRl9XUjogY3ggPSBGSUxfV1JJOyBicmVhazsKKyAgICAgICAgICBjYXNlIFhYRl9DTzogY3ggPSBGSUxfQ09VOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiByZXR1cm4oLTIpOworICAgICAgICB9CisgICAgfQorICAgIHN3aXRjaCAoY3gpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIHJlcXVlc3RlZCBzdWJjb21tYW5kICovCisgICAgICBjYXNlIEZJTF9PUE46ICAgICAgICAgICAgICAgICAgICAgLyogT1BFTiAqLworICAgICAgICBjbWZkYmkoJnN3LCAgICAgICAgICAgICAgICAgICAgIC8qIFN3aXRjaGVzICovCisgICAgICAgICAgICAgICBfQ01LRVksICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgICAgICJWYXJpYWJsZSBvciBzd2l0Y2giLCAgICAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgICAgIG5mY3N3dGFiLCAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKyAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisgICAgICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgZmNzd3RhYiwgICAgICAgICAgICAgICAgIC8qIEtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgICAgICAgICZmbCAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICAgICApOworICAgICAgICBjbWZkYmkoJmZsLCAgICAgICAgICAgICAgICAgICAgIC8qIEFueXRoaW5nIHRoYXQgZG9lc24ndCBtYXRjaCAqLworICAgICAgICAgICAgICAgX0NNRkxELCAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICAgICAiVmFyaWFibGUiLCAgICAgICAgICAgICAgLyogaGxwbXNnICovCisgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICB4ID0gY21mZGIoJnN3KTsgICAgICAgICAgICAgLyogUGFyc2Ugc29tZXRoaW5nICovCisgICAgICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9WYXJpYWJsZSBuYW1lIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01GTEQpCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZSBpZiAoY21yZXN1bHQuZmNvZGUgPT0gX0NNS0VZKSB7CisgICAgICAgICAgICAgICAgY2hhciBjOworICAgICAgICAgICAgICAgIGMgPSBjbWdicmsoKTsKKyAgICAgICAgICAgICAgICBpZiAoKGdldHZhbCA9CisgICAgICAgICAgICAgICAgICAgICAoYyA9PSAnOicgfHwgYyA9PSAnPScpKSAmJiAhKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgIC8qIFVuY29tbWVudCBpZiB3ZSBhZGQgYW55IHN3aXRjaGVzIGVyZSB0aGF0IHRha2UgYXJncyAqLworICAgICAgICAgICAgICAgIGlmICghZ2V0dmFsICYmIChjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOyAgICAgICAgIC8qIChub25lIGRvLi4uKSAqLworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgZmlsbW9kZSB8PSBjbXJlc3VsdC5ucmVzdWx0OyAvKiBPUiBpbiB0aGUgZmlsZSBtb2RlICovCisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfQorICAgICAgICAvKiBOb3QgYSBzd2l0Y2ggLSBnZXQgdGhlIHN0cmluZyAqLworICAgICAgICBja3N0cm5jcHkodm5hbWJ1ZixjbXJlc3VsdC5zcmVzdWx0LFZOQU1MKTsKKyAgICAgICAgaWYgKCF2bmFtYnVmWzBdIHx8IGNoa251bSh2bmFtYnVmKSkgeyAvKiAoaWYgdGhlcmUgaXMgb25lLi4uKSAqLworICAgICAgICAgICAgcHJpbnRmKCI/VmFyaWFibGUgbmFtZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIHZucCA9IHZuYW1idWY7ICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgdmFyaWFibGUtbmFtZSBzeW50YXggKi8KKyAgICAgICAgaWYgKHZuYW1idWZbMF0gPT0gQ01EUSAmJgorICAgICAgICAgICAgKHZuYW1idWZbMV0gPT0gJyUnIHx8IHZuYW1idWZbMV0gPT0gJyYnKSkKKyAgICAgICAgICB2bnArKzsKKyAgICAgICAgeSA9IDA7CisgICAgICAgIGlmICgqdm5wID09ICclJyB8fCAqdm5wID09ICcmJykgeworICAgICAgICAgICAgaWYgKCh5ID0gcGFyc2V2YXIodm5wLCZ4LCZkdW1teSkpIDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1N5bnRheCBlcnJvciBpbiB2YXJpYWJsZSBuYW1lXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghKGZpbG1vZGUgJiBGTV9SV0EpKSAgICAgICAgLyogSWYgbm8gYWNjZXNzIG1vZGUgc3BlY2lmaWVkICovCisgICAgICAgICAgZmlsbW9kZSB8PSBGTV9SRUE7ICAgICAgICAgICAgLyogZGVmYXVsdCB0byAvUkVBRC4gKi8KKworICAgICAgICB5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdyBwYXJzZSB0aGUgZmlsZW5hbWUgKi8KKyAgICAgICAgaWYgKChmaWxtb2RlICYgRk1fUldBKSA9PSBGTV9XUkkpCisgICAgICAgICAgeCA9IGNtb2ZpKCJOYW1lIG9mIG5ldyBmaWxlIiwiIiwmcyx4eHN0cmluZyk7CisgICAgICAgIGVsc2UgaWYgKChmaWxtb2RlICYgRk1fUldBKSA9PSBGTV9SRUEpCisgICAgICAgICAgeCA9IGNtaWZpKCJOYW1lIG9mIGV4aXN0aW5nIGZpbGUiLCIiLCZzLCZ5LHh4c3RyaW5nKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB4ID0gY21pb2ZpKCJGaWxlbmFtZSIsIiIsJnMsJnkseHhzdHJpbmcpOworICAgICAgICAgICAgZGVidWcoRjEwMSwiZm9wZW4gL2FwcGVuZCB4IiwiIix4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeCA9PSAtOSkgeworICAgICAgICAgICAgaWYgKHpjaGtvKHMpIDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiQ2FuJ3QgY3JlYXRlIFwiJXNcIlxuIixzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/RmlsZW5hbWUgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeSkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHdpbGRjYXJkcyAqLworICAgICAgICAgICAgcHJpbnRmKCI/V2lsZGNhcmRzIG5vdCBhbGxvd2VkIGhlcmVcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlsbW9kZSAmIChGTV9BUFB8Rk1fV1JJKSkgeyAvKiBDaGVjayBvdXRwdXQgYWNjZXNzICovCisjaWZuZGVmIFZNUworICAgICAgICAgICAgaWYgKHpjaGtvKHMpIDwgMCkgeyAgICAgICAgICAvKiBhbmQgc2V0IGVycm9yIGNvZGUgaWYgZGVuaWVkICovCisgICAgICAgICAgICAgICAgel9lcnJvciA9IEZYX0FDQzsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9Xcml0ZSBhY2Nlc3MgZGVuaWVkIC0gXCIlc1wiXG4iLHMpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVk1TICovCisgICAgICAgIH0KKyAgICAgICAgY2tzdHJuY3B5KHpmaWxuYW0scyxDS01BWFBBVEgpOyAvKiBJcyBPSyAtIG1ha2Ugc2FmZSBjb3B5ICovCisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgICAgICAgICAgLyogR2V0IGNvbmZpcm1hdGlvbiBvZiBjb21tYW5kICovCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICBpZiAoKG4gPSB6X29wZW4oemZpbG5hbSxmaWxtb2RlKSkgPCAwKSB7CisgICAgICAgICAgICBwcmludGYoIj9PUEVOIGZhaWxlZCAtICVzOiAlc1xuIix6ZmlsbmFtLGNrZmVycm9yKG4pKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgYWRkbWFjKHZuYW1idWYsY2tpdG9hKG4pKTsgICAgICAvKiBBc3NpZ24gY2hhbm5lbCBudW1iZXIgdG8gdmFyaWFibGUgKi8KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgY2FzZSBGSUxfUkVXOiAgICAgICAgICAgICAgICAgICAgIC8qIFJFV0lORCAqLworICAgICAgICBpZiAoKHggPSBjbW51bSgiQ2hhbm5lbCBudW1iZXIiLCIiLDEwLCZuLCB4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9DaGFubmVsIG51bWJlciByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICB9CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIGlmICgocmMgPSB6X3NlZWsobiwwTCkpIDwgMCkgeworICAgICAgICAgICAgcHJpbnRmKCI/UkVXSU5EIGZhaWxlZCAtIENoYW5uZWwgJWQ6ICVzXG4iLG4sY2tmZXJyb3IocmMpKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgY2FzZSBGSUxfQ0xTOiAgICAgICAgICAgICAgICAgICAgIC8qIENMT1NFICovCisgICAgICAgICAgY21mZGJpKCZzdywgICAgICAgICAgICAgICAgICAgLyogU2Vjb25kIEZEQiAtIHN3aXRjaGVzICovCisgICAgICAgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgICAgICAgIkNoYW5uZWwgbnVtYmVyOyBvciBrZXl3b3JkIiwKKyAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKyAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisgICAgICAgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICBmY2xrd3RhYiwgICAgICAgICAgICAgIC8qIEtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgJm51ICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgY21mZGJpKCZudSwgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgRkRCIC0gY29tbWFuZCBzd2l0Y2hlcyAqLworICAgICAgICAgICAgICAgICBfQ01OVU0sICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiByYWRpeCAqLworICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiAwICovCisgICAgICAgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIEtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgICAgICAgLyogICovCisgICAgICAgIHggPSBjbWZkYigmc3cpOyAgICAgICAgICAgICAgICAgLyogUGFyc2Ugc29tZXRoaW5nICovCisgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9DaGFubmVsIG51bWJlciBvciBBTEwgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY21yZXN1bHQuZmNvZGUgPT0gX0NNTlVNKQorICAgICAgICAgIG4gPSBjbXJlc3VsdC5ucmVzdWx0OworICAgICAgICBlbHNlIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01LRVkpCisgICAgICAgICAgbiA9IC0xOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICByYyA9IDE7CisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHpfbWF4Y2hhbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgeCA9IHpfY2xvc2UoaSk7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gRlhfU1lTKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0NMT1NFIGZhaWxlZCAtIENoYW5uZWwgJWQ6ICVzXG4iLG4sY2tmZXJyb3IoeCkpOworICAgICAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4ID4gLTEpCisgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjEwMSwiRklMRSBDTE9TRSBBTEwiLCIiLGNvdW50KTsKKyAgICAgICAgfSBlbHNlIGlmICgoeCA9IHpfY2xvc2UobikpIDwgMCkgeworICAgICAgICAgICAgcHJpbnRmKCI/Q0xPU0UgZmFpbGVkIC0gQ2hhbm5lbCAlZDogJXNcbiIsbixja2ZlcnJvcih4KSk7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIHJldHVybihzdWNjZXNzID0gcmMpOworCisgICAgICBjYXNlIEZJTF9SRUE6ICAgICAgICAgICAgICAgICAgICAgLyogUkVBRCAqLworICAgICAgY2FzZSBGSUxfV1JJOiAgICAgICAgICAgICAgICAgICAgIC8qIFdSSVRFICovCisgICAgICAgIHJzaXplID0gMDsKKyAgICAgICAgY21mZGJpKCZzdywgICAgICAgICAgICAgICAgICAgICAvKiBTd2l0Y2hlcyAqLworICAgICAgICAgICAgICAgX0NNS0VZLCAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICAgICAiQ2hhbm5lbCBvciBzd2l0Y2giLCAgICAgLyogaGxwbXNnICovCisgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgICAgICAoY3ggPT0gRklMX1JFQSkgPyBuZnJkdGFiIDogbmZ3cnRhYiwKKyAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisgICAgICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgKGN4ID09IEZJTF9SRUEpID8gZnJkdGFiIDogZndydGFiLCAvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgICAgICAgICAmbnUgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICAgICAgKTsKKyAgICAgICAgY21mZGJpKCZudSwgICAgICAgICAgICAgICAgICAgICAvKiBDaGFubmVsIG51bWJlciAqLworICAgICAgICAgICAgICAgX0NNTlVNLCAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICAgICAiQ2hhbm5lbCIsCisgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHJhZGl4ICovCisgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDAgKi8KKyAgICAgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKyAgICAgICAgICAgICAgICk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHggPSBjbWZkYigmc3cpOyAgICAgICAgICAgICAvKiBQYXJzZSBzb21ldGhpbmcgKi8KKyAgICAgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP0NoYW5uZWwgbnVtYmVyIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY21yZXN1bHQuZmNvZGUgPT0gX0NNTlVNKSAvKiBDaGFubmVsIG51bWJlciAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNtcmVzdWx0LmZjb2RlID09IF9DTUtFWSkgeyAvKiBTd2l0Y2ggKi8KKyAgICAgICAgICAgICAgICBjaGFyIGM7CisgICAgICAgICAgICAgICAgYyA9IGNtZ2JyaygpOworICAgICAgICAgICAgICAgIGlmICgoZ2V0dmFsID0KKyAgICAgICAgICAgICAgICAgICAgIChjID09ICc6JyB8fCBjID09ICc9JykpICYmICEoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIGRvZXMgbm90IHRha2UgYW4gYXJndW1lbnRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWdldHZhbCAmJiAoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChjbXJlc3VsdC5ucmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICBjYXNlIFdSX0xJTkU6CisgICAgICAgICAgICAgICAgICAgIGNoYXJmbGFnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZWZsYWcgPSAwOworICAgICAgICAgICAgICAgICAgICByc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBXUl9DSEFSOgorICAgICAgICAgICAgICAgICAgICByc2l6ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGNoYXJmbGFnID0gMTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZWZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgV1JfU0laRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh4ID0gY21udW0oIkJ5dGVzIiwiIiwxMCwmcnNpemUsIHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP051bWJlciByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNoYXJmbGFnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZWZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgV1JfU1RSSToKKyAgICAgICAgICAgICAgICAgICAgcnNpemUgPSAxOworICAgICAgICAgICAgICAgICAgICBjaGFyZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIHNpemVmbGFnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIFdSX0xQQUQ6CisgICAgICAgICAgICAgICAgICBjYXNlIFdSX1JQQUQ6CisgICAgICAgICAgICAgICAgICAgIGlmICgoeCA9IGNtbnVtKCJOdW1lcmljIEFTQ0lJIGNoYXJhY3RlciB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMiIsMTAsJnBhZCwgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY21yZXN1bHQubnJlc3VsdCA9PSBXUl9MUEFEKQorICAgICAgICAgICAgICAgICAgICAgIHdyX2xwYWQgPSAxOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgd3JfcnBhZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkgIGNhc2UgUkRfVFJJTToKKwkJICAgIHJkX3RyaW0gPSAxOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBSRF9VTlRBOgorCQkgICAgcmRfdW50YWIgPSAxOworCQkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsIkZJTEUgUkVBRCByc2l6ZSAyIiwiIixyc2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyAgICAgICAgfSB3aGlsZQorICAgICAgICAgIChjbXJlc3VsdC5mY29kZSA9PSBfQ01LRVkpOworCisgICAgICAgIG4gPSBjbXJlc3VsdC5ucmVzdWx0OyAgICAgICAgICAgLyogQ2hhbm5lbCAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJGSUxFIFJFQUQvV1JJVEUgY2hhbm5lbCIsIiIsbik7CisKKyAgICAgICAgaWYgKGN4ID09IEZJTF9XUkkpIHsgICAgICAgICAgICAvKiBXUklURSAqLworICAgICAgICAgICAgaW50IGxlbiA9IDA7CisgICAgICAgICAgICBpZiAoKHggPSBjbXR4dCgiVGV4dCIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsgLyogTWFrZSBhIHNhZmUgY29weSAqLworICAgICAgICAgICAgcyA9IGxpbmU7CisgICAgICAgICAgICBzID0gYnJzdHJpcChzKTsgICAgICAgICAgICAgLyogU3RyaXAgYnJhY2VzICovCisgICAgICAgICAgICBpZiAoY2hhcmZsYWcpIHsgICAgICAgICAgICAgLyogV3JpdGUgb25lIGNoYXIgKi8KKyAgICAgICAgICAgICAgICBsZW4gPSAxOyAgICAgICAgICAgICAgICAvKiBTbyBsZW5ndGggPSAxICovCisgICAgICAgICAgICAgICAgcnNpemUgPSAxOyAgICAgICAgICAgICAgLyogRG9uJ3Qgc3VwcGx5IHRlcm1pbmF0b3IgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXNpemVmbGFnKSB7ICAgICAvKiBXcml0ZSBhIHN0cmluZyAqLworICAgICAgICAgICAgICAgIGxlbiA9IC0xOyAgICAgICAgICAgICAgIC8qIFNvIGxlbmd0aCBpcyB1bnNwZWNpZmllZCAqLworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIGEgYmxvY2sgb2YgZ2l2ZW4gc2l6ZSAqLworICAgICAgICAgICAgICAgIGludCBpLCBrLCB4eDsKKyAgICAgICAgICAgICAgICBpZiAocnNpemUgPiBUTVBCVUZTSVopIHsKKyAgICAgICAgICAgICAgICAgICAgel9lcnJvciA9IEZYX09GTDsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/QnVmZmVyIG92ZXJmbG93XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuID0gcnNpemU7ICAgICAgICAgICAgLyogcnNpemUgaXMgcmVhbGx5IGxlbmd0aCAqLworICAgICAgICAgICAgICAgIHJzaXplID0gMTsgICAgICAgICAgICAgIC8qIERvbid0IHN1cHBseSBhIHRlcm1pbmF0b3IgKi8KKyAgICAgICAgICAgICAgICB4eCA9IHN0cmxlbihzKTsgICAgICAgICAvKiBTaXplIG9mIGdpdmVuIHN0cmluZyAqLworICAgICAgICAgICAgICAgIGlmICh4eCA+PSBsZW4pIHsgICAgICAgIC8qIEJpZ2dlciBvciBlcXVhbCAqLworICAgICAgICAgICAgICAgICAgICBzW2xlbl0gPSBOVUw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3cl9scGFkKSB7ICAgLyogU21hbGxlciwgbGVmdC1wYWRkaW5nIHJlcXVlc3RlZCAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuIC0geHg7IGkrKykgLyogTXVzdCBtYWtlIGEgY29weSAqLworICAgICAgICAgICAgICAgICAgICAgIHRtcGJ1ZltpXSA9IHBhZDsKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHRtcGJ1ZitpLHMsVE1QQlVGU0laLWkpOworICAgICAgICAgICAgICAgICAgICB0bXBidWZbbGVuXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgcyA9IHRtcGJ1ZjsgICAgICAgICAvKiBSZWRpcmVjdCB3cml0ZSBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdyX3JwYWQpIHsgICAvKiBTbWFsbGVyIHdpdGggcmlnaHQtcGFkZGluZyAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSB4eDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgIHNbaV0gPSBwYWQ7CisgICAgICAgICAgICAgICAgICAgIHNbbGVuXSA9IE5VTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHJjID0gel9vdXQobixzLGxlbixyc2l6ZSkpIDwgMCkgeyAvKiBUcnkgdG8gd3JpdGUgKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIj9DaGFubmVsICVkIFdSSVRFIGVycm9yOiAlc1xuIixuLGNrZmVycm9yKHJjKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGSUxfUkVBIFJFQUQgKi8KKyAgICAgICAgICAgIGNvbmZpcm1lZCA9IDA7CisgICAgICAgICAgICB2bmFtYnVmWzBdID0gTlVMOworICAgICAgICAgICAgeCA9IGNtZmxkKCJWYXJpYWJsZSBuYW1lIiwiIiwmcyxOVUxMKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIkZJTEUgUkVBRCBjbWZsZCIscyx4KTsKKyAgICAgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IC0zIHx8ICEqcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgY29uZmlybWVkKys7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBja3N0cm5jcHkodm5hbWJ1ZixzLFZOQU1MKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsIkZJTEUgUkVBRCB2bmFtYnVmIix2bmFtYnVmLGNvbmZpcm1lZCk7CisgICAgICAgICAgICBpZiAodm5hbWJ1ZlswXSkgeyAgICAgICAgICAgLyogVmFyaWFibGUgbmFtZSBnaXZlbiwgY2hlY2sgaXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gY21jZm0oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1lZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2bnAgPSB2bmFtYnVmOworICAgICAgICAgICAgICAgIGlmICh2bmFtYnVmWzBdID09IENNRFEgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZuYW1idWZbMV0gPT0gJyUnIHx8IHZuYW1idWZbMV0gPT0gJyYnKSkKKyAgICAgICAgICAgICAgICAgIHZucCsrOworICAgICAgICAgICAgICAgIHkgPSAwOworICAgICAgICAgICAgICAgIGlmICgqdm5wID09ICclJyB8fCAqdm5wID09ICcmJykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHkgPSBwYXJzZXZhcih2bnAsJngsJmR1bW15KSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj9TeW50YXggZXJyb3IgaW4gdmFyaWFibGUgbmFtZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjExMSwiRklMRSBSRUFEIHZhcmlhYmxlIix2bmFtYnVmLGNvbmZpcm1lZCk7CisKKyAgICAgICAgICAgIGlmICghY29uZmlybWVkKQorICAgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuKHgpOworCisgICAgICAgICAgICBsaW5lWzBdID0gTlVMOyAgICAgICAgICAgICAgLyogQ2xlYXIgZGVzdGluYXRpb24gYnVmZmVyICovCisgICAgICAgICAgICBpZiAocnNpemUgPj0gTElOQlVGU0laKSAgICAgLyogRG9uJ3Qgb3ZlcnJ1biBpdCAqLworICAgICAgICAgICAgICByc2l6ZSA9IExJTkJVRlNJWiAtIDE7CisKKyAgICAgICAgICAgIGlmIChyc2l6ZSA9PSAwKSB7CQkvKiBSZWFkIGEgbGluZSAqLworCQlyYyA9IHpfaW4obixsaW5lLExJTkJVRlNJWixMSU5CVUZTSVotMSwwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisJCXJjID0gel9pbihuLGxpbmUsTElOQlVGU0laLHJzaXplLDEpOyAvKiBSZWFkIGEgYmxvY2sgKi8KKwkgICAgfQorICAgICAgICAgICAgaWYgKHJjIDwgMCkgeyAgICAgICAgICAgICAgIC8qIEVycm9yLi4uICovCisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiRklMRSBSRUFEIGVycm9yIiwiIixyYyk7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiRklMRSBSRUFEIGVycm5vIiwiIixlcnJubyk7CisgICAgICAgICAgICAgICAgaWYgKHJjID09IEZYX0VPRikgeyAgICAgLyogRU9GIC0gZmFpbCBidXQgbm8gZXJyb3IgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIE90aGVyIGVycm9yIC0gZmFpbCBhbmQgcHJpbnQgbXNnICovCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1JFQUQgZXJyb3I6ICVzXG4iLGNrZmVycm9yKHJjKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCSAgICBpZiAocnNpemUgPT0gMCkgewkJLyogRlJFQUQgL0xJTkUgcG9zdHByb2Nlc3NpbmcgKi8KKwkJaWYgKHJkX3RyaW0pIHsJCS8qIFRyaW0gKi8KKwkJICAgIGludCBpLCBrOworCQkgICAgayA9IHN0cmxlbihsaW5lKTsKKwkJICAgIGlmIChrID4gMCkgeworCQkJZm9yIChpID0gay0xOyBpID4gMDsgaS0tKSB7CisJCQkgICAgaWYgKGxpbmVbaV0gPT0gU1AgfHwgbGluZVtpXSA9PSAnXHQnKQorCQkJICAgICAgbGluZVtpXSA9IE5VTDsKKwkJCSAgICBlbHNlCisJCQkgICAgICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJfQorCQlpZiAocmRfdW50YWIpIHsJCS8qIFVudGFiaWZ5ICovCisJCSAgICBpZiAodW50YWJpZnkobGluZSx0bXBidWYsVE1QQlVGU0laKSA+IC0xKQorCQkgICAgICBja3N0cm5jcHkobGluZSx0bXBidWYsTElOQlVGU0laKTsKKwkJfQorCSAgICB9CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJGSUxFIFJFQUQgZGF0YSIsbGluZSwwKTsKKyAgICAgICAgICAgIGlmICh2bmFtYnVmWzBdKSAgICAgICAgICAgICAvKiBSZWFkIE9LIC0gSWYgdmFyaWFibGUgbmFtZSBnaXZlbiAqLworICAgICAgICAgICAgICBhZGRtYWModm5hbWJ1ZixsaW5lKTsgICAgIC8qIEFzc2lnbiByZXN1bHQgdG8gdmFyaWFibGUgKi8KKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2UgKi8KKyAgICAgICAgICAgICAgcHJpbnRmKCIlc1xuIixsaW5lKTsgICAgICAvKiBqdXN0IHByaW50IGl0ICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgY2FzZSBGSUxfU0VFOiAgICAgICAgICAgICAgICAgICAgIC8qIFNFRUsgKi8KKyAgICAgIGNhc2UgRklMX0NPVTogICAgICAgICAgICAgICAgICAgICAvKiBDT1VOVCAqLworICAgICAgICByc2l6ZSA9IFJEX0NIQVI7ICAgICAgICAgICAgICAgIC8qIERlZmF1bHRzIHRvIC9CWVRFICovCisgICAgICAgIGNtZmRiaSgmc3csICAgICAgICAgICAgICAgICAgICAgLyogU3dpdGNoZXMgKi8KKyAgICAgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAgICAgIkNoYW5uZWwgb3Igc3dpdGNoIiwgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAgICAgKChjeCA9PSBGSUxfU0VFKSA/IG5mc2tzd3RhYiA6IG5mY29zd3RhYiksCisgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworICAgICAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgICgoY3ggPT0gRklMX1NFRSkgPyBmc2tzd3RhYiA6IGZjb3N3dGFiKSwKKyAgICAgICAgICAgICAgICZudSAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICAgICApOworICAgICAgICBjbWZkYmkoJm51LCAgICAgICAgICAgICAgICAgICAgIC8qIENoYW5uZWwgbnVtYmVyICovCisgICAgICAgICAgICAgICBfQ01OVU0sICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgICAgICJDaGFubmVsIiwKKyAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogcmFkaXggKi8KKyAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogMCAqLworICAgICAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICAgICAgKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgeCA9IGNtZmRiKCZzdyk7ICAgICAgICAgICAgIC8qIFBhcnNlIHNvbWV0aGluZyAqLworICAgICAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/Q2hhbm5lbCBudW1iZXIgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01OVU0pIC8qIENoYW5uZWwgbnVtYmVyICovCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZSBpZiAoY21yZXN1bHQuZmNvZGUgPT0gX0NNS0VZKSB7IC8qIFN3aXRjaCAqLworICAgICAgICAgICAgICAgIGNoYXIgYzsKKyAgICAgICAgICAgICAgICBjID0gY21nYnJrKCk7CisgICAgICAgICAgICAgICAgaWYgKChnZXR2YWwgPQorICAgICAgICAgICAgICAgICAgICAgKGMgPT0gJzonIHx8IGMgPT0gJz0nKSkgJiYgIShjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjeCA9PSBGSUxfU0VFKSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY21yZXN1bHQubnJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VFX1JFTDogcmVsYXRpdmUgPSAxOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNFRV9BQlM6IHJlbGF0aXZlID0gMDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogcnNpemUgPSBjbXJlc3VsdC5ucmVzdWx0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjeCA9PSBGSUxfQ09VKSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY21yZXN1bHQubnJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09VX0xJUzogbGlzdGluZyA9IDE7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09VX05PTDogbGlzdGluZyA9IDA7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJzaXplID0gY21yZXN1bHQubnJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZQorICAgICAgICAgIChjbXJlc3VsdC5mY29kZSA9PSBfQ01LRVkpOworCisgICAgICAgIG4gPSBjbXJlc3VsdC5ucmVzdWx0OyAgICAgICAgICAgLyogQ2hhbm5lbCAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJGSUxFIFNFRUsvQ09VTlQgY2hhbm5lbCIsIiIsbik7CisgICAgICAgIGlmIChjeCA9PSBGSUxfQ09VKSB7CisgICAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIHpfZmlsY291bnQgPSB6X2NvdW50KG4scnNpemUpOworICAgICAgICAgICAgaWYgKHpfZmlsY291bnQgPCAwKSB7CisgICAgICAgICAgICAgICAgcmMgPSB6X2ZpbGNvdW50OworICAgICAgICAgICAgICAgIHByaW50ZigiP0NPVU5UIGVycm9yOiAlc1xuIixja2ZlcnJvcihyYykpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGlzdGluZyA8IDApCisgICAgICAgICAgICAgIGxpc3RpbmcgPSAheGNtZHNyYzsKKyAgICAgICAgICAgIGlmIChsaXN0aW5nKQorICAgICAgICAgICAgICBwcmludGYoIiAlbGQgJXMlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHpfZmlsY291bnQsCisgICAgICAgICAgICAgICAgICAgICAoKHJzaXplID09IFJEX0NIQVIpID8gImJ5dGUiIDogImxpbmUiKSwKKyAgICAgICAgICAgICAgICAgICAgICgoel9maWxjb3VudCA9PSAxTCkgPyAiIiA6ICJzIikKKyAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9ICh6X2ZpbGNvdW50ID4gLTEpID8gMSA6IDApOworICAgICAgICB9CisgICAgICAgIGNtZmRiaSgmc3csICAgICAgICAgICAgICAgICAgICAgLyogU0VFSyBzeW1ib2xpYyB0YXJnZXRzIChFT0YpICovCisgICAgICAgICAgICAgICBfQ01LRVksICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgICAgICJDaGFubmVsIG51bWJlcjtcbiBvciBrZXl3b3JkIiwKKyAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgICAgICBuZnNla3d0YWIsICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRhYmxlIHNpemUgKi8KKyAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisgICAgICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgZnNla3d0YWIsICAgICAgICAgICAgICAgIC8qIEtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgICAgICAgICZudSAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICAgICApOworICAgICAgICBjbWZkYmkoJm51LCAgICAgICAgICAgICAgICAgICAgIC8qIENoYW5uZWwgbnVtYmVyICovCisgICAgICAgICAgICAgICBfQ01OVU0sICAgICAgICAgICAgICAgICAgLyogZmNvZGUgKi8KKyAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiByYWRpeCAqLworICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiAwICovCisgICAgICAgICAgICAgICB4eHN0cmluZywgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgIC8qIEtleXdvcmQgdGFibGUgKi8KKyAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICAgICApOworICAgICAgICB4ID0gY21mZGIoJnN3KTsgICAgICAgICAgICAgICAgIC8qIFBhcnNlIHNvbWV0aGluZyAqLworICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/Q2hhbm5lbCBudW1iZXIgb3IgRU9GIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcmVzdWx0LmZjb2RlID09IF9DTU5VTSkgeworICAgICAgICAgICAgeSA9IGNtcmVzdWx0Lm5yZXN1bHQ7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJGSUxFIFNFRUsgYXRtYnVmIixhdG1idWYsMCk7CisgICAgICAgICAgICBpZiAocmVsYXRpdmUgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGN4ID09IEZJTF9TRUUgJiYgKGF0bWJ1ZlswXSA9PSAnKycgfHwgYXRtYnVmWzBdID09ICctJykpCisgICAgICAgICAgICAgICAgICByZWxhdGl2ZSA9IDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNtcmVzdWx0LmZjb2RlID09IF9DTUtFWSkgeworICAgICAgICAgICAgZW9mZmxnID0gY21yZXN1bHQubnJlc3VsdDsKKyAgICAgICAgICAgIHJlbGF0aXZlID0gMDsKKyAgICAgICAgICAgIHkgPSAwIC0gZW9mZmxnOworICAgICAgICB9CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIHogPSB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udmVydCB0byBsb25nICovCisgICAgICAgIHkgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVjeWNsZSB0aGlzICovCisgICAgICAgIHpfZmx1c2gobik7CisgICAgICAgIGRlYnVnKEYxMDEsIkZJTEUgU0VFSyByZWxhdGl2ZSIsIiIscmVsYXRpdmUpOworICAgICAgICBkZWJ1ZyhGMTAxLCJGSUxFIFNFRUsgcnNpemUiLCIiLHJzaXplKTsKKworICAgICAgICBpZiAocnNpemUgPT0gUkRfQ0hBUikgeyAgICAgICAgIC8qIFNlZWsgdG8gYnl0ZSBwb3NpdGlvbiAqLworICAgICAgICAgICAgaWYgKHJlbGF0aXZlID4gMCkgeworICAgICAgICAgICAgICAgIGxvbmcgcG9zOworICAgICAgICAgICAgICAgIHBvcyA9IHpfZ2V0cG9zKG4pOworICAgICAgICAgICAgICAgIGlmIChwb3MgPCAwTCkgeworICAgICAgICAgICAgICAgICAgICByYyA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/UmVsYXRpdmUgU0VFSyBmYWlsZWQ6ICVzXG4iLGNrZmVycm9yKHJjKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHogKz0gcG9zOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoeiA8IDAgJiYgIWVvZmZsZykgeyAvKiBOZWdhdGl2ZSBhcmcgYnV0IG5vdCByZWxhdGl2ZSAqLworICAgICAgICAgICAgICAgICAgICB5ID0gMDsgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRoaXMgd2FzIGJhZCAqLworICAgICAgICAgICAgICAgICAgICB6ID0gMDsgICAgICAgICAgICAgIC8qIGJ1dCBzdWJzdGl0dXRlIDAgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJGSUxFIFNFRUsgL0NIQVIgeiIsIiIseik7CisgICAgICAgICAgICBpZiAoeiA8IDAgJiYgIWVvZmZsZykgeworICAgICAgICAgICAgICAgIHpfZXJyb3IgPSBGWF9STkc7CisgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocmMgPSB6X3NlZWsobix6KSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHJjID09IEZYX0VPRikgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9TRUVLIC9CWVRFIGZhaWxlZCAtIENoYW5uZWwgJWQ6ICVzXG4iLG4sY2tmZXJyb3IocmMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZWsgdG8gbGluZSAqLworICAgICAgICAgICAgaWYgKHJlbGF0aXZlID4gMCkgeworICAgICAgICAgICAgICAgIGxvbmcgcG9zOworICAgICAgICAgICAgICAgIHBvcyA9IHpfZ2V0bGluZShuKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJGSUxFIFNFRUsgL0xJTkUgcG9zIiwiIixwb3MpOworICAgICAgICAgICAgICAgIGlmIChwb3MgPCAwTCkgeworICAgICAgICAgICAgICAgICAgICByYyA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/UmVsYXRpdmUgU0VFSyBmYWlsZWQ6ICVzXG4iLGNrZmVycm9yKHJjKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHogKz0gcG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVidWcoRjEwMSwiRklMRSBTRUVLIC9MSU5FIHoiLCIiLHopOworICAgICAgICAgICAgZGVidWcoRjEwMSwiRklMRSBTRUVLIC9MSU5FIGVvZmZsZyIsIiIsZW9mZmxnKTsKKyAgICAgICAgICAgIGlmICh6IDwgMCAmJiAhZW9mZmxnKSB7CisgICAgICAgICAgICAgICAgel9lcnJvciA9IEZYX1JORzsKKyAgICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChyYyA9IHpfbGluZShuLHopKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gRlhfRU9GKSByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgICAgICAgIHByaW50ZigiP1NFRUsgL0xJTkUgZmFpbGVkIC0gQ2hhbm5lbCAlZDogJXNcbiIsbixja2ZlcnJvcihyYykpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSB5KTsKKworICAgICAgY2FzZSBGSUxfTElTOiB7ICAgICAgICAgICAgICAgICAgIC8qIExJU1Qgb3BlbiBmaWxlcyAqLworI2lmZGVmIENLX1RUR1dTSVoKKyAgICAgICAgICBleHRlcm4gaW50IGNtZF9yb3dzLCBjbWRfY29sczsKKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisgICAgICAgICAgZXh0ZXJuIGludCB4YXNrbW9yZTsKKyAgICAgICAgICBpbnQgaSwgeCwgbiA9IDAsIHBhZ2luZyA9IDA7CisgICAgICAgICAgY2hhciAqIHM7CisKKyAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4oeCk7CisKKyNpZmRlZiBDS19UVEdXU0laCisgICAgICAgICAgaWYgKGNtZF9yb3dzID4gMCAmJiBjbWRfY29scyA+IDApCisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworICAgICAgICAgICAgcGFnaW5nID0geGFza21vcmU7CisKKyAgICAgICAgICBwcmludGYoIlN5c3RlbSBvcGVuIGZpbGUgbGltaXQ6ICU0ZFxuIiwgel9vcGVubWF4KTsKKyAgICAgICAgICBwcmludGYoIk1heGltdW0gZm9yIEZJTEUgT1BFTjogICU0ZFxuIiwgel9tYXhjaGFuKTsKKyAgICAgICAgICBwcmludGYoIkZpbGVzIGN1cnJlbnRseSBvcGVuOiAgICU0ZFxuXG4iLCB6X25vcGVuKTsKKyAgICAgICAgICBuID0gNDsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgel9tYXhjaGFuOyBpKyspIHsKKyAgICAgICAgICAgICAgcyA9IHpfZ2V0bmFtZShpKTsgICAgICAgICAvKiBHb3Qgb25lPyAqLworICAgICAgICAgICAgICBpZiAocykgeyAgICAgICAgICAgICAgICAgIC8qIFllcyAqLworICAgICAgICAgICAgICAgICAgY2hhciBtWzhdOworICAgICAgICAgICAgICAgICAgbVswXSA9IE5VTDsKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiJTJkLiAlcyIsaSxzKTsgLyogUHJpbnQgbmFtZSAqLworICAgICAgICAgICAgICAgICAgbisrOyAgICAgICAgICAgICAgICAgICAvKiBDb3VudCBpdCAqLworICAgICAgICAgICAgICAgICAgeCA9IHpfZ2V0bW9kZShpKTsgICAgICAvKiBHZXQgbW9kZXMgJiBwcmludCB0aGVtICovCisgICAgICAgICAgICAgICAgICBpZiAoeCA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHggJiBGTV9SRUEpIGNrc3RybmNhdChtLCJSIiw4KTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoeCAmIEZNX1dSSSkgY2tzdHJuY2F0KG0sIlciLDgpOworICAgICAgICAgICAgICAgICAgICAgIGlmICh4ICYgRk1fQVBQKSBja3N0cm5jYXQobSwiQSIsOCk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHggJiBGTV9CSU4pIGNrc3RybmNhdChtLCJCIiw4KTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAobVswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICglcykiLG0pOworICAgICAgICAgICAgICAgICAgICAgIGlmICh4ICYgRk1fRU9GKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgW0VPRl0iKTsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAlbGQiLHpfZ2V0cG9zKGkpKTsgLyogQW5kIGZpbGUgcG9zaXRpb24gdG9vICovCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisjaWZkZWYgQ0tfVFRHV1NJWgorICAgICAgICAgICAgICAgICAgaWYgKHBhZ2luZyA+IDApIHsgICAgIC8qIFBhdXNlIGF0IGVuZCBvZiBzY3JlZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBpZiAobiA+IGNtZF9yb3dzIC0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFza21vcmUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgIH0KKworICAgICAgY2FzZSBGSUxfRkxVOiAgICAgICAgICAgICAgICAgICAgIC8qIEZMVVNIICovCisgICAgICAgIGlmICgoeCA9IGNtbnVtKCJDaGFubmVsIG51bWJlciIsIiIsMTAsJm4sIHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0NoYW5uZWwgbnVtYmVyIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgaWYgKChyYyA9IHpfZmx1c2gobikpIDwgMCkgeworICAgICAgICAgICAgcHJpbnRmKCI/RkxVU0ggZmFpbGVkIC0gQ2hhbm5lbCAlZDogJXNcbiIsbixja2ZlcnJvcihyYykpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICBjYXNlIEZJTF9TVEE6ICAgICAgICAgICAgICAgICAgICAgLyogU1RBVFVTICovCisgICAgICAgIGlmICgoeCA9IGNtbnVtKCJDaGFubmVsIG51bWJlciIsIiIsMTAsJm4sIHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgICAgIHByaW50ZigiP0NoYW5uZWwgbnVtYmVyIHJlcXVpcmVkXG4iKTsKKyAgICAgICAgICAgICAgICB4ID0gLTk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgcCA9IGJsYW5rcyArIDM7ICAgICAgICAgICAgICAgICAvKiBUcmlja3kgZm9ybWF0dGluZy4uLiAqLworICAgICAgICBpZiAobiA8IDEwMDApIHAtLTsKKyAgICAgICAgaWYgKG4gPCAxMDApIHAtLTsKKyAgICAgICAgaWYgKG4gPCAxMCkgcC0tOworICAgICAgICBpZiAoKHJjID0gel9nZXRtb2RlKG4pKSA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiQ2hhbm5lbCAlZDolcyVzXG4iLG4scCxja2ZlcnJvcihyYykpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfSBlbHNlIGlmICghcmMpIHsKKyAgICAgICAgICAgIHByaW50ZigiQ2hhbm5lbCAlZDolc05vdCBvcGVuXG4iLG4scCk7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9uZyB4eDsKKyAgICAgICAgICAgIHMgPSB6X2dldG5hbWUobik7CisgICAgICAgICAgICBpZiAoIXMpIHMgPSAiKG5hbWUgdW5rbm93bikiOworICAgICAgICAgICAgcHJpbnRmKCJDaGFubmVsICVkOiVzT3BlblxuIixuLHApOworICAgICAgICAgICAgcHJpbnRmKCIgRmlsZTogICAgICAgICVzXG4gTW9kZXM6ICAgICAgIixzKTsKKyAgICAgICAgICAgIGlmIChyYyAmIEZNX1JFQSkgcHJpbnRmKCIgL1JFQUQiKTsKKyAgICAgICAgICAgIGlmIChyYyAmIEZNX1dSSSkgcHJpbnRmKCIgL1dSSVRFIik7CisgICAgICAgICAgICBpZiAocmMgJiBGTV9BUFApIHByaW50ZigiIC9BUFBFTkQiKTsKKyAgICAgICAgICAgIGlmIChyYyAmIEZNX0JJTikgcHJpbnRmKCIgL0JJTkFSWSIpOworICAgICAgICAgICAgaWYgKHJjICYgRk1fQ01EKSBwcmludGYoIiAvQ09NTUFORCIpOworICAgICAgICAgICAgaWYgKHJjICYgRk1fRU9GKSBwcmludGYoIiBbRU9GXSIpOworICAgICAgICAgICAgcHJpbnRmKCJcbiBTaXplOiAgICAgICAgJWxkXG4iLHpfY291bnQobixSRF9DSEFSKSk7CisgICAgICAgICAgICBwcmludGYoIiBBdCBieXRlOiAgICAgJWxkXG4iLHpfZ2V0cG9zKG4pKTsKKyAgICAgICAgICAgIHh4ID0gel9nZXRsaW5lKG4pOworICAgICAgICAgICAgaWYgKHh4ID4gLTEpCisgICAgICAgICAgICAgIHByaW50ZigiIEF0IGxpbmU6ICAgICAlbGRcbiIseHgpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKC0yKTsKKyAgICB9Cit9CisjZW5kaWYgLyogQ0tDSEFOTkVMSU8gKi8KKworI2lmbmRlZiBOT1NFVEtFWQorLyogU2F2ZSBLZXkgbWFwcyBhbmQgaW4gT1MvMiBNb3VzZSBtYXBzICovCitpbnQKK3NhdmtleXMobmFtZSxkaXNwKSBjaGFyICogbmFtZTsgaW50IGRpc3A7IHsKKyAgICBjaGFyICp0cDsKKyAgICBzdGF0aWMgc3RydWN0IGZpbGluZm8geHg7CisgICAgaW50IHNhdmZpbCwgaSwgaiwgazsKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKworICAgIHpjbG9zZShaTUZJTEUpOworCisgICAgaWYgKGRpc3ApIHsKKyAgICAgICAgeHguYnMgPSAwOyB4eC5jcyA9IDA7IHh4LnJsID0gMDsgeHgub3JnID0gMDsgeHguY2MgPSAwOworICAgICAgICB4eC50eXAgPSAwOyB4eC5kc3AgPSBYWUZaX0E7IHh4Lm9zX3NwZWNpZmljID0gIiI7CisgICAgICAgIHh4LmxibG9wdHMgPSAwOworICAgICAgICBzYXZmaWwgPSB6b3Blbm8oWk1GSUxFLG5hbWUsTlVMTCwmeHgpOworICAgIH0gZWxzZSBzYXZmaWwgPSB6b3Blbm8oWk1GSUxFLG5hbWUsTlVMTCxOVUxMKTsKKworICAgIGlmIChzYXZmaWwpIHsKKyNpZmRlZiBPUzIKKyAgICAgICAgenRpbWUoJnRwKTsKKyAgICAgICAgenNvdXQoWk1GSUxFLCAiOyBLZXJtaXQgOTUgU0FWRSBLRVlNQVAgZmlsZTogIik7CisgICAgICAgIHpzb3V0bChaTUZJTEUsdHApOworICAgICAgICBpZiAobXNra2V5cykgeworICAgICAgICAgICAgenNvdXRsKFpNRklMRSwKKyAgICAgICAgICJpZiBlcSBcIlxcdihwcm9ncmFtKVwiIFwiQy1LZXJtaXRcIiBzZXQgbXNrZXJtaXQga2V5Y29kZXMgb24iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHpzb3V0bChaTUZJTEUsCisgICAgICAgICAiaWYgTk9UIGVxIFwiXFx2KHByb2dyYW0pXCIgXCJDLUtlcm1pdFwiIHN0b3AgMSBDLUtlcm1pdCByZXF1aXJlZC4iKTsKKyAgICAgICAgICAgIHpzb3V0bChaTUZJTEUsInNldCBtc2tlcm1pdCBrZXljb2RlcyBvZmYiKTsKKyAgICAgICAgfQorICAgICAgICB6c291dGwoWk1GSUxFLCIiKTsKKyNlbHNlIC8qIE9TMiAqLworICAgICAgICB6dGltZSgmdHApOworICAgICAgICB6c291dChaTUZJTEUsICI7IEMtS2VybWl0IFNBVkUgS0VZTUFQIGZpbGU6ICIpOworICAgICAgICB6c291dGwoWk1GSUxFLHRwKTsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgICAgICB6c291dGwoWk1GSUxFLCI7IENsZWFyIHByZXZpb3VzIGtleWJvYXJkIG1hcHBpbmdzICIpOworICAgICAgICB6c291dGwoWk1GSUxFLCJzZXQga2V5IGNsZWFyIik7CisjaWZkZWYgT1MyCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBudHRrZXk7IGsrKykgeworICAgICAgICAgICAgaWYgKCF0dGtleXRhYltrXS5mbGdzKSB7CisgICAgICAgICAgICAgICAgY2ttYWttc2coYnVmLDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInNldCB0ZXJtaW5hbCBrZXkgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0dGtleXRhYltrXS5rd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBjbGVhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgenNvdXRsKFpNRklMRSxidWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHpzb3V0bChaTUZJTEUsIiIpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBLTVNJWkU7IGkrKykgeworICAgICAgICAgICAgaWYgKG1hY3JvdGFiW2ldKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbigoY2hhciAqKW1hY3JvdGFiW2ldKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICBja21ha21zZyhidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2V0IGtleSBcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2tpdG9hKG1za2tleXMgPyBja3RvbXNrKGkpIDogaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICApOworI2Vsc2UgLyogT1MyICovCisgICAgICAgICAgICAgICAgY2ttYWttc2coYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInNldCBrZXkgXFwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNraXRvYShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgIHpzb3V0KFpNRklMRSxidWYpOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBtYWNyb3RhYltpXVtqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDw9IFNQIHx8IGNoID49IERFTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoID09ICctJyB8fCBjaCA9PSAnLCcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9PSAneycgfHwgY2ggPT0gJ30nIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gJzsnIHx8IGNoID09ICc/JyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoID09ICcuJyB8fCBjaCA9PSAnXCcnIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gJ1xcJyB8fCBjaCA9PSAnLycgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGJ1ZiwxMDI0LCJcXHsiLGNraXRvYSgoaW50KWNoKSwifSIsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICB6c291dChaTUZJTEUsYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGJ1ZiwxMDI0LGNrY3RvYSgoY2hhciljaCksTlVMTCxOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgenNvdXQoWk1GSUxFLGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgY2ttYWttc2coYnVmLDEwMjQsIlx0OyAiLGtleW5hbWUoaSksTlVMTCxOVUxMKTsKKyAgICAgICAgICAgICAgICB6c291dGwoWk1GSUxFLGJ1Zik7CisjZWxzZQorICAgICAgICAgICAgICAgIHpzb3V0bChaTUZJTEUsIiIpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgfSBlbHNlIGlmICgga2V5bWFwW2ldICE9IGkgKSB7CisjaWZuZGVmIE5PS1ZFUkJTCisgICAgICAgICAgICAgICAgaWYgKElTX0tWRVJCKGtleW1hcFtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5rdmVyYnM7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoa3ZlcmJzW2pdLmt3dmFsID09IChrZXltYXBbaV0gJiB+Rl9LVkVSQikpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gbmt2ZXJicykgeworI2lmZGVmIE9TMgorI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoYnVmLCAic2V0IGtleSBcXCVkIFxcSyVzXHQ7ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNra2V5cyA/IGNrdG9tc2soaSkgOiBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdmVyYnNbal0ua3dkLCBrZXluYW1lKGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY2ttYWt4bXNnKGJ1ZiwgIC8qIDEyIHN0cmluZyBhcmdzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0IGtleSBcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tpdG9hKG1za2tleXMgPyBja3RvbXNrKGkpIDogaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBcXEsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt2ZXJic1tqXS5rd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0OyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleW5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgenNvdXRsKFpNRklMRSxidWYpOworI2Vsc2UKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgInNldCBrZXkgXFwlZCBcXEslcyIsIGksIGt2ZXJic1tqXS5rd2QpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGJ1ZiwxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldCBrZXkgXFwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tpdG9hKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBcXEsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3ZlcmJzW2pdLmt3ZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgICAgICB6c291dGwoWk1GSUxFLGJ1Zik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIE5PS1ZFUkJTICovCisgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgT1MyCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoYnVmLCAic2V0IGtleSBcXCVkIFxceyVkfVx0OyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2trZXlzID8gY2t0b21zayhpKSA6IGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXltYXBbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXluYW1lKGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICBja21ha3htc2coYnVmLCAgICAvKiA4IHN0cmluZyBhcmdzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXQga2V5IFxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tpdG9hKG1za2tleXMgPyBja3RvbXNrKGkpIDogaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgXFx7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tpdG9hKGtleW1hcFtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XHQ7ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleW5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgICAgenNvdXRsKFpNRklMRSxidWYpOworI2Vsc2UKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihidWYsICJzZXQga2V5IFxcJWQgXFx7JWR9IiwgaSwga2V5bWFwW2ldKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgY2ttYWt4bXNnKGJ1ZiwxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXQga2V5IFxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja2l0b2EoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBcXHsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNraXRvYShrZXltYXBbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgICAgenNvdXRsKFpNRklMRSxidWYpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjaWZkZWYgT1MyCisgICAgICAgIC8qIE9TLzIgYWxzbyBoYXMgdGhlIFNFVCBURVJNSU5BTCBLRVkgPHRlcm10eXBlPiBkZWZpbmVzICovCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBudHRrZXk7IGsrKykgeworICAgICAgICAgICAgZXh0ZXJuIHN0cnVjdCBrZXlub2RlICogdHRrZXltYXBbXTsKKyAgICAgICAgICAgIHN0cnVjdCBrZXlub2RlICogcG5vZGUgPSBOVUxMOworCisgICAgICAgICAgICBpZiAodHRrZXl0YWJba10uZmxncykgICAgICAgLyogRG9uJ3QgcHJvY2VzcyBDTV9JTlYgb3IgQ01fQUJSICovCisgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICB6c291dGwoWk1GSUxFLCIiKTsKKyAgICAgICAgICAgIGNrbWFrbXNnKGJ1ZiwxMDI0LCI7IFNFVCBURVJNSU5BTCBLRVkgIix0dGtleXRhYltrXS5rd2QsTlVMTCxOVUxMKTsKKyAgICAgICAgICAgIHpzb3V0bChaTUZJTEUsYnVmKTsKKworICAgICAgICAgICAgZm9yIChwbm9kZSA9IHR0a2V5bWFwW3R0a2V5dGFiW2tdLmt3dmFsXTsKKyAgICAgICAgICAgICAgICAgcG5vZGU7CisgICAgICAgICAgICAgICAgIHBub2RlID0gcG5vZGUtPm5leHQKKyAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwbm9kZS0+ZGVmLnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgIGNhc2Uga2V5OgorI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihidWYsICJzZXQgdGVybWluYWwga2V5ICVzIFxcJWQgXFx7JWR9XHQ7ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGtleXRhYltrXS5rd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNra2V5cyA/IGNrdG9tc2socG5vZGUtPmtleSkgOiBwbm9kZS0+a2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBub2RlLT5kZWYua2V5LnNjYW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleW5hbWUocG5vZGUtPmtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgY2ttYWt4bXNnKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0IHRlcm1pbmFsIGtleSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRrZXl0YWJba10ua3dkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja2l0b2EobXNra2V5cyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2t0b21zayhwbm9kZS0+a2V5KSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5vZGUtPmtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFxceyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja2l0b2EocG5vZGUtPmRlZi5rZXkuc2NhbmNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cdDsgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleW5hbWUocG5vZGUtPmtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgenNvdXRsKFpNRklMRSxidWYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2Uga3ZlcmI6CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBua3ZlcmJzOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgaWYgKGt2ZXJic1tqXS5rd3ZhbCA9PSAocG5vZGUtPmRlZi5rdmVyYi5pZCAmIH5GX0tWRVJCKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSBua3ZlcmJzKSB7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihidWYsICJzZXQgdGVybWluYWwga2V5ICVzIFxcJWQgXFxLJXNcdDsgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGtleXRhYltrXS5rd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1za2tleXMgPyBja3RvbXNrKHBub2RlLT5rZXkpIDogcG5vZGUtPmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3ZlcmJzW2pdLmt3ZCwga2V5bmFtZShwbm9kZS0+a2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNrbWFreG1zZyhidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0IHRlcm1pbmFsIGtleSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0a2V5dGFiW2tdLmt3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja2l0b2EobXNra2V5cyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrdG9tc2socG5vZGUtPmtleSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbm9kZS0+a2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFxcSyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3ZlcmJzW2pdLmt3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHQ7ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bmFtZShwbm9kZS0+a2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgICAgICB6c291dGwoWk1GSUxFLGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIG1hY3JvOiB7CisgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbigoY2hhciAqKXBub2RlLT5kZWYubWFjcm8uc3RyaW5nKTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihidWYsInNldCB0ZXJtaW5hbCBrZXkgJXMgXFwlZCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRrZXl0YWJba10ua3dkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNra2V5cyA/IGNrdG9tc2socG5vZGUtPmtleSkgOiBwbm9kZS0+a2V5KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgY2ttYWt4bXNnKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXQgdGVybWluYWwga2V5ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRrZXl0YWJba10ua3dkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgXFwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNraXRvYShtc2trZXlzID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2t0b21zayhwbm9kZS0+a2V5KSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBub2RlLT5rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgICB6c291dChaTUZJTEUsYnVmKTsKKworICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gcG5vZGUtPmRlZi5tYWNyby5zdHJpbmdbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8PSBTUCB8fCBjaCA+PSBERUwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9PSAnLScgfHwgY2ggPT0gJywnIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gJ3snIHx8IGNoID09ICd9JyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID09ICc7JyB8fCBjaCA9PSAnPycgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9PSAnLicgfHwgY2ggPT0gJ1wnJyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID09ICdcXCcgfHwgY2ggPT0gJy8nIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja21ha21zZyhidWYsMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXHsiLGNraXRvYSgoaW50KWNoKSwifSIsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6c291dChaTUZJTEUsYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGJ1ZiwxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tjdG9hKChjaGFyKWNoKSxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6c291dChaTUZJTEUsYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBja21ha21zZyhidWYsMTAyNCwiXHQ7ICIsa2V5bmFtZShwbm9kZS0+a2V5KSxOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgIHpzb3V0bChaTUZJTEUsYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGNhc2UgbGl0ZXJhbDogeworICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4oKGNoYXIgKilwbm9kZS0+ZGVmLmxpdGVyYWwuc3RyaW5nKTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihidWYsInNldCB0ZXJtaW5hbCBrZXkgJXMgL2xpdGVyYWwgXFwlZCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRrZXl0YWJba10ua3dkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNra2V5cyA/IGNrdG9tc2socG5vZGUtPmtleSkgOiBwbm9kZS0+a2V5KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgY2ttYWt4bXNnKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXQgdGVybWluYWwga2V5ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRrZXl0YWJba10ua3dkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgL2xpdGVyYWwgXFwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNraXRvYShtc2trZXlzID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2t0b21zayhwbm9kZS0+a2V5KSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBub2RlLT5rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgICAgenNvdXQoWk1GSUxFLGJ1Zik7CisKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHBub2RlLT5kZWYubGl0ZXJhbC5zdHJpbmdbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8PSBTUCB8fCBjaCA+PSBERUwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9PSAnLScgfHwgY2ggPT0gJywnIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gJ3snIHx8IGNoID09ICd9JyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID09ICc7JyB8fCBjaCA9PSAnPycgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9PSAnLicgfHwgY2ggPT0gJ1wnJyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID09ICdcXCcgfHwgY2ggPT0gJy8nIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja21ha21zZyhidWYsMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXHsiLGNraXRvYSgoaW50KWNoKSwifSIsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6c291dChaTUZJTEUsYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrbWFrbXNnKGJ1ZiwxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tjdG9hKChjaGFyKWNoKSxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6c291dChaTUZJTEUsYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBja21ha21zZyhidWYsMTAyNCwiXHQ7ICIsa2V5bmFtZShwbm9kZS0+a2V5KSxOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgIHpzb3V0bChaTUZJTEUsYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGNhc2UgZXNjOgorI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihidWYsCisgICAgICAgICAgICAgICAgICAgICAgICJzZXQgdGVybWluYWwga2V5ICVzIC9saXRlcmFsIFxcJWQgXFx7JWR9XFx7JWR9XHQ7ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGtleXRhYltrXS5rd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNra2V5cyA/IGNrdG9tc2socG5vZGUtPmtleSkgOiBwbm9kZS0+a2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTREcyMDAodHRrZXl0YWJba10ua3d2YWwpID8gMzAgOiAyNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbm9kZS0+ZGVmLmVzYy5rZXkgJiB+Rl9FU0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bmFtZShwbm9kZS0+a2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBja21ha3htc2coYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXQgdGVybWluYWwga2V5ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGtleXRhYltrXS5rd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC9saXRlcmFsIFxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNraXRvYShtc2trZXlzID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja3RvbXNrKHBub2RlLT5rZXkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbm9kZS0+a2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgXFx7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNraXRvYShJU0RHMjAwKHR0a2V5dGFiW2tdLmt3dmFsKSA/IDMwIDogMjcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cXHsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tpdG9hKHBub2RlLT5kZWYuZXNjLmtleSAmIH5GX0VTQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVx0OyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bmFtZShwbm9kZS0+a2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgIHpzb3V0bChaTUZJTEUsYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIGNzaToKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAic2V0IHRlcm1pbmFsIGtleSAlcyAvbGl0ZXJhbCBcXCVkIFxcezI3fVtcXHslZH1cdDsgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0a2V5dGFiW2tdLmt3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2trZXlzID8gY2t0b21zayhwbm9kZS0+a2V5KSA6IHBub2RlLT5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5vZGUtPmRlZi5jc2kua2V5ICYgfkZfQ1NJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleW5hbWUocG5vZGUtPmtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgY2ttYWt4bXNnKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0IHRlcm1pbmFsIGtleSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRrZXl0YWJba10ua3dkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAvbGl0ZXJhbCBcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja2l0b2EobXNra2V5cyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2t0b21zayhwbm9kZS0+a2V5KSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5vZGUtPmtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFxcezI3fVtcXHsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tpdG9hKHBub2RlLT5kZWYuY3NpLmtleSAmIH5GX0NTSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVx0OyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bmFtZShwbm9kZS0+a2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgICAgICAgICB6c291dGwoWk1GSUxFLGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisKKyAgICAgICAgenNvdXRsKFpNRklMRSwiIik7CisgICAgICAgIHpzb3V0bChaTUZJTEUsIjsgRW5kIik7CisgICAgICAgIHpjbG9zZShaTUZJTEUpOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgfQorfQorI2VuZGlmIC8qIE5PU0VUS0VZICovCisKKyNkZWZpbmUgU1ZfU0NSTCAwCisjZGVmaW5lIFNWX0hJU1QgMQorCisjaWZkZWYgT1MyCisjaWZuZGVmIE5PTE9DQUwKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHRybXRybW9wdFtdID0geworICAgIHsgInNjcm9sbGJhY2siLCBTVl9TQ1JMLCAwIH0KK307CisjZW5kaWYgLyogTk9MT0NBTCAqLworI2VuZGlmIC8qIE9TMiAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBjbWR0cm1vcHRbXSA9IHsKKyNpZmRlZiBDS19SRUNBTEwKKyAgICB7ICJoaXN0b3J5IiwgICAgU1ZfSElTVCwgMCB9LAorI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworI2lmZGVmIE9TMgorI2lmbmRlZiBOT0xPQ0FMCisgICAgeyAic2Nyb2xsYmFjayIsIFNWX1NDUkwsIDAgfSwKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjZW5kaWYgLyogT1MyICovCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuY21kdHJtb3B0ID0gKHNpemVvZiAoY21kdHJtb3B0KSAvIHNpemVvZiAoc3RydWN0IGtleXRhYikpIC0gMTsKKworI2lmZGVmIE9TMgorI2lmbmRlZiBOT0xPQ0FMCitfUFJPVE9UWVAoaW50IHNhdnNjcmJrLCAoaW50LCBjaGFyICosIGludCkpOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIENLX1JFQ0FMTAorX1BST1RPVFlQKGludCBzYXZoaXN0b3J5LCAoY2hhciAqLCBpbnQpKTsKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKworaW50Citkb3NhdmUoeHgpIGludCB4eDsgeworICAgIGludCB4LCB5ID0gMCwgZGlzcDsKKyAgICBjaGFyICogcyA9IE5VTEw7CisgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgZGlzcHRiW107CisjaWZkZWYgWkZOUUZQCisgICAgc3RydWN0IHpmbmZwICogZm5wOworI2VuZGlmIC8qIFpGTlFGUCAqLworCisjaWZuZGVmIE5PU0VUS0VZCisgICAgaWYgKHh4ID09IFhTS0VZKSB7ICAgICAgICAgICAgICAgICAgLyogU0FWRSBLRVlNQVAuLiAqLworICAgICAgICB6ID0gY21vZmkoIk5hbWUgb2YgS2VybWl0IGNvbW1hbmQgZmlsZSIsImtleW1hcC5rc2MiLCZzLHh4c3RyaW5nKTsKKyAgICB9IGVsc2UgeworI2VuZGlmIC8qIE5PU0VUS0VZICovCisgICAgICAgIHN3aXRjaCAoeHgpIHsKKyAgICAgICAgICBjYXNlIFhTQ01EOiAgICAgICAgICAgICAgICAgICAvKiBTQVZFIENPTU1BTkQuLiAqLworICAgICAgICAgICAgaWYgKCh5ID0gY21rZXkoY21kdHJtb3B0LCBuY21kdHJtb3B0LCAiV2hhdCB0byBzYXZlIiwKKyNpZmRlZiBPUzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY3JvbGxiYWNrIiwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlzdG9yeSIsCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgcmV0dXJuKHkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgT1MyCisjaWZuZGVmIE5PTE9DQUwKKyAgICAgICAgICBjYXNlIFhTVEVSTTogICAgICAgICAgICAgICAgICAvKiBTQVZFIFRFUk1JTkFMLi4gKi8KKyAgICAgICAgICAgIGlmICgoeSA9IGNta2V5KHRybXRybW9wdCwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIldoYXQgdG8gc2F2ZSIsInNjcm9sbGJhY2siLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjZW5kaWYgLyogT1MyICovCisgICAgICAgIH0KKyAgICAgICAgeiA9IGNtb2ZpKCJGaWxlbmFtZSIsCisgICAgICAgICAgICAgICAgICAoKHkgPT0gU1ZfU0NSTCkgPyAic2Nyb2xsYmsudHh0IiA6ICJoaXN0b3J5LnR4dCIpLAorICAgICAgICAgICAgICAgICAgJnMsCisgICAgICAgICAgICAgICAgICB4eHN0cmluZworICAgICAgICAgICAgICAgICAgKTsKKyNpZm5kZWYgTk9TRVRLRVkKKyAgICB9CisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKyAgICBpZiAoeiA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBvdXRwdXQtZmlsZSBwYXJzZSByZXN1bHRzICovCisgICAgICByZXR1cm4oeik7CisgICAgaWYgKHogPT0gMikgeworICAgICAgICBwcmludGYoIj9Tb3JyeSwgJXMgaXMgYSBkaXJlY3RvcnkgbmFtZVxuIixzKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisjaWZkZWYgWkZOUUZQCisgICAgaWYgKChmbnAgPSB6Zm5xZnAocyxUTVBCVUZTSVogLSAxLHRtcGJ1ZikpKSB7LyogQ29udmVydCB0byBmdWxsIHBhdGhuYW1lICovCisgICAgICAgIGlmIChmbnAtPmZwYXRoKQorICAgICAgICAgIGlmICgoaW50KSBzdHJsZW4oZm5wLT5mcGF0aCkgPiAwKQorICAgICAgICAgICAgcyA9IGZucC0+ZnBhdGg7CisgICAgfQorI2VuZGlmIC8qIFpGTlFGUCAqLworCisgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOyAgICAgICAgLyogTWFrZSBzYWZlIGNvcHkgb2YgcGF0aG5hbWUgKi8KKyAgICBzID0gbGluZTsKKyNpZmRlZiBNQUMKKyAgICB6ID0gMDsKKyNlbHNlCisgICAgLyogR2V0IE5FVy9BUFBFTkQgZGlzcG9zaXRpb24gKi8KKyAgICBpZiAoKHogPSBjbWtleShkaXNwdGIsMiwiRGlzcG9zaXRpb24iLCJuZXciLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHopOworI2VuZGlmIC8qIE1BQyAqLworICAgIGRpc3AgPSB6OworICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgICAgICAgICAgICAgIC8qIEdldCBjb25maXJtYXRpb24gKi8KKyAgICAgIHJldHVybih4KTsKKworICAgIHN3aXRjaCAoeHgpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIGFjdGlvbi4uICovCisjaWZuZGVmIE5PU0VUS0VZCisgICAgICBjYXNlIFhTS0VZOiAgICAgICAgICAgICAgICAgICAgICAgLyogU0FWRSBLRVlNQVAgKi8KKyAgICAgICAgcmV0dXJuIChzYXZrZXlzKHMsZGlzcCkpOworI2VuZGlmIC8qIE5PU0VUS0VZICovCisKKyAgICAgIGNhc2UgWFNDTUQ6ICAgICAgICAgICAgICAgICAgICAgICAvKiBTQVZFIENPTU1BTkQuLiAqLworI2lmZGVmIE9TMgorI2lmbmRlZiBOT0xPQ0FMCisgICAgICAgIGlmICh5ID09IFNWX1NDUkwpICAgICAgICAgICAgICAgLyogLi4gU0NST0xMQkFDSyAqLworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gc2F2c2NyYmsoVkNNRCxzLGRpc3ApKTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjZW5kaWYgLyogT1MyICovCisjaWZuZGVmIE5PUkVDQUxMCisgICAgICAgIGlmICh5ID09IFNWX0hJU1QpICAgICAgICAgICAgICAgLyogLi4gSElTVE9SWSAqLworICAgICAgICAgIHJldHVybihzdWNjZXNzID0gc2F2aGlzdG9yeShzLGRpc3ApKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTk9SRUNBTEwgKi8KKworI2lmZGVmIE9TMgorI2lmbmRlZiBOT0xPQ0FMCisgICAgICBjYXNlIFhTVEVSTTogICAgICAgICAgICAgICAgICAgICAgLyogU0FWRSBURVJNSU5BTCBTQ1JPTExCQUNLICovCisgICAgICAgIHJldHVybihzdWNjZXNzID0gc2F2c2NyYmsoVlRFUk0scyxkaXNwKSk7CisjZW5kaWYgLyogTk9MT0NBTCAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIH0KKyAgICBzdWNjZXNzID0gMDsKKyAgICByZXR1cm4oLTIpOworfQorCisvKgorICBSIEUgQSBEIFQgRSBYIFQKKworICBSZWFkIHRleHQgd2l0aCBhIGN1c3RvbSBwcm9tcHQgaW50byBnaXZlbiBidWZmZXIgdXNpbmcgY29tbWFuZCBwYXJzZXIgYnV0CisgIHdpdGggbm8gZWNob2luZyBvciBlbnRyeSBpbnRvIHJlY2FsbCBidWZmZXIuCisqLworaW50CityZWFkdGV4dChwcm1wdCwgYnVmZmVyLCBidWZzaXopIGNoYXIgKiBwcm1wdDsgY2hhciAqIGJ1ZmZlcjsgaW50IGJ1ZnNpejsgeworI2lmZGVmIENLX1JFQ0FMTAorICAgIGV4dGVybiBpbnQgb25fcmVjYWxsOyAgICAgICAgICAgICAgIC8qIEFyb3VuZCBQYXNzd29yZCBwcm9tcHRpbmcgKi8KKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyAgICBpbnQgcmM7CisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IHZtb2RlOworICAgIGV4dGVybiBpbnQgc3RhcnRmbGFnczsKKyAgICBpbnQgdm1vZGVfc2F2ID0gdm1vZGU7CisKKyAgICBpZiAoIXBybXB0KSBwcm1wdCA9ICIiOworCisgICAgaWYgKHdpbjk1X3BvcHVwICYmICEoc3RhcnRmbGFncyAmIDk2KQorI2lmZGVmIElLU0QKKyAgICAgICAgICYmICFpbnNlcnZlcgorI2VuZGlmIC8qIElLU0QgKi8KKyAgICAgICAgICkKKyAgICAgIHJldHVybihwb3B1cF9yZWFkdGV4dCh2bW9kZSxOVUxMLHBybXB0LGJ1ZmZlcixidWZzaXosMCkpOworCisgICAgaWYgKHZtb2RlID09IFZURVJNKSB7CisgICAgICAgIHZtb2RlID0gVkNNRDsKKyAgICAgICAgVnNjcm5Jc0RpcnR5KFZURVJNKTsKKyAgICAgICAgVnNjcm5Jc0RpcnR5KFZDTUQpOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBDS19SRUNBTEwKKyAgICBvbl9yZWNhbGwgPSAwOworI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworICAgIGNtc2F2cChwc2F2ZSxQUk9NUFRMKTsgICAgICAgICAgICAgIC8qIFNhdmUgb2xkIHByb21wdCAqLworICAgIGNtc2V0cChwcm1wdCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIE1ha2UgbmV3IHByb21wdCAqLworICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7ICAgICAgICAgICAgICAgIC8qIFB1dCBjb25zb2xlIGluIGNicmVhayBtb2RlICovCisgICAgY21pbmkoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIGVjaG8gbW9kZSAqLworICAgIGlmIChwZmxhZykgcHJvbXB0KHh4c3RyaW5nKTsgICAgICAgIC8qIElzc3VlIHByb21wdCBpZiBhdCB0b3AgbGV2ZWwgKi8KKyAgICBjbXJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0aGUgcGFyc2VyICovCisgICAgZm9yIChyYyA9IC0xOyByYyA8IDA7ICkgeyAgICAgICAgICAgLyogUHJvbXB0IHRpbGwgdGhleSBhbnN3ZXIgKi8KKyAgICAgICAgcmMgPSBjbXR4dCgiIiwiIiwmcyxOVUxMKTsgICAgICAvKiBHZXQgYSBsaXRlcmFsIGxpbmUgb2YgdGV4dCAqLworICAgICAgICBjbXJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBwYXJzZXIgYWdhaW4gKi8KKyAgICB9CisgICAgY2tzdHJuY3B5KGJ1ZmZlcixzLGJ1ZnNpeik7CisgICAgY21zZXRwKHBzYXZlKTsgICAgICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBvcmlnaW5hbCBwcm9tcHQgKi8KKworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgaWYgKHZtb2RlICE9IHZtb2RlX3NhdikgeworICAgICAgICB2bW9kZSA9IFZURVJNOworICAgICAgICBWc2NybklzRGlydHkoVkNNRCk7CisgICAgICAgIFZzY3JuSXNEaXJ0eShWVEVSTSk7CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogTk9JQ1AgKi8KKworLyogQSBnZW5lcmFsIGZ1bmN0aW9uIHRvIGFsbG93IGEgUGFzc3dvcmQgb3Igb3RoZXIgaW5mb3JtYXRpb24gICovCisvKiB0byBiZSByZWFkIGZyb20gdGhlIGNvbW1hbmQgcHJvbXB0IHdpdGhvdXQgaXQgZ29pbmcgaW50byAgICAgKi8KKy8qIHRoZSByZWNhbGwgYnVmZmVyIG9yIGJlaW5nIGVjaG8nZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQKK3JlYWRwYXNzKHBybXB0LCBidWZmZXIsIGJ1ZnNpeikgY2hhciAqIHBybXB0OyBjaGFyICogYnVmZmVyOyBpbnQgYnVmc2l6OyB7CisgICAgaW50IHg7CisjaWZkZWYgTk9JQ1AKKyAgICBpZiAoIXBybXB0KSBwcm1wdCA9ICIiOworICAgIHByaW50ZigiJXMiLCBwcm1wdCk7CisjaWZkZWYgQ09NTUVOVAorICAgIC8qIFNvbWUgbGlua2VycyB3b24ndCBhbGxvdyB0aGlzIGJlY2F1c2UgaXQncyB1bnNhZmUgKi8KKyAgICBnZXRzKGJ1ZmZlcik7CisjZWxzZSAgLyogQ09NTUVOVCAqLworICAgIHsKKyAgICAgICAgaW50IGMsIGk7IGNoYXIgKiBwOworICAgICAgICBwID0gYnVmZmVyOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmc2l6LTE7IGkrKykgeworICAgICAgICAgICAgaWYgKChjID0gZ2V0Y2hhcigpKSA9PSBFT0YpCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGMgPCBTUCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBidWZmZXJbaV0gPSBjOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlcltpXSA9IE5VTDsKKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHJldHVybigxKTsKKyNlbHNlICAvKiBOT0lDUCAqLworI2lmZGVmIENLX1JFQ0FMTAorICAgIGV4dGVybiBpbnQgb25fcmVjYWxsOyAgICAgICAgICAgICAgIC8qIGFyb3VuZCBQYXNzd29yZCBwcm9tcHRpbmcgKi8KKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyAgICBpbnQgcmM7CisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICBleHRlcm4gaW50IHZtb2RlOworICAgIGV4dGVybiBpbnQgc3RhcnRmbGFnczsKKyAgICBpbnQgdm1vZGVfc2F2ID0gdm1vZGU7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworI2lmZGVmIENLU1lTTE9HCisgICAgaW50IHNhdmxvZzsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgIGlmICghcHJtcHQpIHBybXB0ID0gIiI7CisjaWZuZGVmIE5PTE9DQUwKKyAgICBkZWJvayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBsb2cgKi8KKyNpZmRlZiBPUzIKKyAgICBpZiAod2luOTVfcG9wdXAgJiYgIShzdGFydGZsYWdzICYgOTYpCisjaWZkZWYgSUtTRAorICAgICAgICAgJiYgIWluc2VydmVyCisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgKSB7CisgICAgICAgIHggPSBwb3B1cF9yZWFkcGFzcyh2bW9kZSxOVUxMLHBybXB0LGJ1ZmZlcixidWZzaXosMCk7CisgICAgICAgIGRlYm9rID0gMTsKKyAgICAgICAgcmV0dXJuKHgpOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBDS1NZU0xPRworICAgIHNhdmxvZyA9IGNreHN5c2xvZzsgICAgICAgICAgICAgICAgIC8qIFNhdmUgYW5kIHR1cm4gb2ZmIHN5c2xvZ2dpbmcgKi8KKyAgICBja3hzeXNsb2cgPSAwOworI2VuZGlmIC8qIENLU1lTTE9HICovCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICBpZiAodm1vZGUgPT0gVlRFUk0pIHsKKyAgICAgICAgdm1vZGUgPSBWQ01EOworICAgICAgICBWc2NybklzRGlydHkoVlRFUk0pOworICAgICAgICBWc2NybklzRGlydHkoVkNNRCk7CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZmRlZiBDS19SRUNBTEwKKyAgICBvbl9yZWNhbGwgPSAwOworI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworICAgIGNtc2F2cChwc2F2ZSxQUk9NUFRMKTsgICAgICAgICAgICAgIC8qIFNhdmUgb2xkIHByb21wdCAqLworICAgIGNtc2V0cChwcm1wdCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIE1ha2UgbmV3IHByb21wdCAqLworICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7ICAgICAgICAgICAgICAgIC8qIFB1dCBjb25zb2xlIGluIGNicmVhayBtb2RlICovCisgICAgY21pbmkoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIG5vLWVjaG8gbW9kZSAqLworICAgIGlmIChwZmxhZykgcHJvbXB0KHh4c3RyaW5nKTsgICAgICAgIC8qIElzc3VlIHByb21wdCBpZiBhdCB0b3AgbGV2ZWwgKi8KKyAgICBjbXJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0aGUgcGFyc2VyICovCisgICAgZm9yIChyYyA9IC0xOyByYyA8IDA7ICkgeyAgICAgICAgICAgLyogUHJvbXB0IHRpbGwgdGhleSBhbnN3ZXIgKi8KKyAgICAgICAgcmMgPSBjbXR4dCgiIiwiIiwmcyxOVUxMKTsgICAgICAvKiBHZXQgYSBsaXRlcmFsIGxpbmUgb2YgdGV4dCAqLworICAgICAgICBjbXJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBwYXJzZXIgYWdhaW4gKi8KKyAgICB9CisgICAgY2tzdHJuY3B5KGJ1ZmZlcixzLGJ1ZnNpeik7CisgICAgcHJpbnRmKCJcclxuIik7ICAgICAgICAgICAgICAgICAgICAgLyogRWNobyBhIENSTEYgKi8KKyAgICBjbXNldHAocHNhdmUpOyAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIHByb21wdCAqLworICAgIGNtaW5pKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgZWNobyBtb2RlICovCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBPUzIKKyAgICBpZiAodm1vZGUgIT0gdm1vZGVfc2F2KSB7CisgICAgICAgIHZtb2RlID0gVlRFUk07CisgICAgICAgIFZzY3JuSXNEaXJ0eShWQ01EKTsKKyAgICAgICAgVnNjcm5Jc0RpcnR5KFZURVJNKTsKKyAgICB9CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworI2lmZGVmIENLU1lTTE9HCisgICAgY2t4c3lzbG9nID0gc2F2bG9nOyAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBzeXNsb2dnaW5nICovCisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyAgICBkZWJvayA9IDE7CisgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIE5PSUNQICovCit9CisKKyNpZm5kZWYgTk9JQ1AKK3N0cnVjdCBrZXl0YWIgYXV0aHRhYltdID0geyAgICAgICAgICAgICAvKiBBdmFpbGFibGUgYXV0aGVudGljYXRpb24gdHlwZXMgKi8KKyNpZmRlZiBDS19LRVJCRVJPUworICAgIHsgIms0IiwgICAgICAgIEFVVEhfS1JCNCwgQ01fSU5WIH0sCisgICAgeyAiazUiLCAgICAgICAgQVVUSF9LUkI1LCBDTV9JTlYgfSwKKyAgICB7ICJrZXJiZXJvczQiLCBBVVRIX0tSQjQsIDAgICAgICB9LAorICAgIHsgImtlcmJlcm9zNSIsIEFVVEhfS1JCNSwgMCAgICAgIH0sCisgICAgeyAia3JiNCIsICAgICAgQVVUSF9LUkI0LCBDTV9JTlYgfSwKKyAgICB7ICJrcmI1IiwgICAgICBBVVRIX0tSQjUsIENNX0lOViB9LAorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisjaWZkZWYgTlQKKyAgICB7ICJudGxtIiwgICAgICBBVVRIX05UTE0sIDAgfSwKKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIENLX1NSUAorICAgIHsgInNycCIsICAgICAgIEFVVEhfU1JQLCAgMCB9LAorI2VuZGlmIC8qIENLX1NSUCAqLworI2lmZGVmIENLX1NTTAorICAgIHsgInNzbCIsICAgICAgIEFVVEhfU1NMLCAgMCB9LAorI2VuZGlmIC8qIENLX1NTTCAqLworICAgIHsgIiIsICAgICAgICAgIDAsICAgICAgICAgMCB9Cit9OworaW50IGF1dGh0YWJuID0gc2l6ZW9mKGF1dGh0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKS0xOworCisjaWZkZWYgQ0tfS0VSQkVST1MKK3N0cnVjdCBrZXl0YWIga2VyYnRhYltdID0geyAgICAgICAgICAgICAvKiBLZXJiZXJvcyBhdXRoZW50aWNhdGlvbiB0eXBlcyAqLworICAgIHsgIms0IiwgICAgICAgIEFVVEhfS1JCNCwgQ01fSU5WIH0sCisgICAgeyAiazUiLCAgICAgICAgQVVUSF9LUkI1LCBDTV9JTlYgfSwKKyAgICB7ICJrZXJiZXJvczQiLCBBVVRIX0tSQjQsIDAgICAgICB9LAorICAgIHsgImtlcmJlcm9zNSIsIEFVVEhfS1JCNSwgMCAgICAgIH0sCisgICAgeyAia3JiNCIsICAgICAgQVVUSF9LUkI0LCBDTV9JTlYgfSwKKyAgICB7ICJrcmI1IiwgICAgICBBVVRIX0tSQjUsIENNX0lOViB9Cit9OworaW50IGtlcmJ0YWJuID0gc2l6ZW9mKGtlcmJ0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIga3JiX3NfdGJsW10gPSB7ICAgIC8qIEFVVEhFTlRJQ0FURSBjb21tYW5kIHN3aXRjaGVzOiAqLworICAgIHsgIi9jYWNoZSIsICAgS1JCX1NfQ0EsIENNX0FSRyB9Cit9Oworc3RhdGljIGludCBrcmJfc19uID0gc2l6ZW9mKGtyYl9zX3RibCkvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBrcmJfdl90YmxbXSA9IHsgICAgLyogS0VSQkVST1MgdmVyc2lvbiB2YWx1ZXM6ICovCisgICAgeyAiNCIsICAgIDQsIDAgfSwKKyAgICB7ICI1IiwgICAgNSwgMCB9LCAgICAgICAgICAgICAgICAgICAvKiAoYWRkIG90aGVycyBhcyBuZWVkZWQuLi4pICovCisgICAgeyAiYXV0byIsIDAsIDAgfSAgICAgICAgICAgICAgICAgICAgLyogTm90ZTogMCA9IGF1dG8gKi8KK307CitzdGF0aWMgaW50IGtyYl92X24gPSBzaXplb2Yoa3JiX3ZfdGJsKS9zaXplb2Yoc3RydWN0IGtleXRhYik7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGtyYl9hX3RibFtdID0geyAgICAvKiBLRVJCRVJPUyBhY3Rpb25zOiAqLworICAgIHsgImRlc3Ryb3kiLCAgICAgICAgICAgS1JCX0FfREUsIDAgfSwKKyAgICB7ICJpbml0aWFsaXplIiwgICAgICAgIEtSQl9BX0lOLCAwIH0sCisgICAgeyAibGlzdC1jcmVkZW50aWFscyIsICBLUkJfQV9MQywgMCB9Cit9Oworc3RhdGljIGludCBrcmJfYV9uID0gc2l6ZW9mKGtyYl9hX3RibCkvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBrcmI0X2lfdGJsW10gPSB7ICAgLyogS0VSQkVST1MgNCBJTklUSUFMSVpFIHN3aXRjaGVzOiAqLworICAgIHsgIi9icmllZiIsICAgICAgICAgICAgS1JCX0lfQlIsIDAgfSwgICAgICAvKiAvQlJJRUYgICAgICAgKi8KKyAgICB7ICIvaW5zdGFuY2UiLCAgICAgICAgIEtSQl9JX0lOLCBDTV9BUkcgfSwgLyogL0lOU1RBTkNFOiAgICovCisgICAgeyAiL2xpZmV0aW1lIiwgICAgICAgICBLUkJfSV9MRiwgQ01fQVJHIH0sIC8qIC9MSUZFVElNRTogICAqLworICAgIHsgIi9ub3QtcHJlYXV0aCIsICAgICAgS1JCX0lfTlBBLCAwIH0sICAgICAvKiAvTk9ULVBSRUFVVEggKi8KKyAgICB7ICIvcGFzc3dvcmQiLCAgICAgICAgIEtSQl9JX1BXLCBDTV9BUkcgfSwgLyogL1BBU1NXT1JEOiAgICovCisjaWZkZWYgT1MyCisgICAgeyAiL3BvcHVwIiwgICAgICAgICAgICBLUkJfSV9QT1AsIDAgfSwgICAgIC8qIC9QT1BVUCAgICAgICAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIHsgIi9wcmVhdXRoIiwgICAgICAgICAgS1JCX0lfUEEsIDAgfSwgICAgICAvKiAvUFJFQVVUSCAgICAgKi8KKyAgICB7ICIvcmVhbG0iLCAgICAgICAgICAgIEtSQl9JX1JMLCBDTV9BUkcgfSwgLyogL1JFQUxNOiAgICAgICovCisgICAgeyAiL3ZlcmJvc2UiLCAgICAgICAgICBLUkJfSV9WQiwgMCB9LCAgICAgIC8qIC9WRVJCT1NFICAgICAqLworICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQga3JiNF9pX24gPSBzaXplb2Yoa3JiNF9pX3RibCkvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpIC0gMTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIga3JiNV9pX3RibFtdID0geyAgIC8qIEtFUkJFUk9TIDUgSU5JVElBTElaRSBzd2l0Y2hlczogKi8KKyAgICB7ICIvYWRkcmVzc2VzIiwgICAgICAgIEtSQl9JX0FEUiwgQ01fQVJHIH0sCisgICAgeyAiL2ZvcndhcmRhYmxlIiwgICAgICBLUkJfSV9GVywgIDAgfSwgICAgICAgICAvKiAvRk9SV0FSREFCTEUgKi8KKyAgICB7ICIvaW5zdGFuY2UiLCAgICAgICAgIEtSQl9JX0lOLCBDTV9BUkcgfSwgLyogL0lOU1RBTkNFOiAgICovCisgICAgeyAiL2s0IiwgICAgICAgICAgICAgICBLUkJfSV9LNCwgIENNX0lOViB9LCAvKiAvS0VSQkVST1M0ICAgKi8KKyAgICB7ICIva2VyYmVyb3M0IiwgICAgICAgIEtSQl9JX0s0LCAgMCB9LCAgICAgIC8qIC9LRVJCRVJPUzQgICAqLworICAgIHsgIi9rcmI0IiwgICAgICAgICAgICAgS1JCX0lfSzQsICBDTV9JTlYgfSwgLyogL0tFUkJFUk9TNCAgICovCisgICAgeyAiL2xpZmV0aW1lIiwgICAgICAgICBLUkJfSV9MRiwgIENNX0FSRyB9LCAvKiAvTElGRVRJTUU6ICAgKi8KKyAgICB7ICIvbm8tYWRkcmVzc2VzIiwgICAgIEtSQl9JX05BRCwgMCB9LCAgICAgIC8qIC9OTy1BRERSRVNTRVMgKi8KKyAgICB7ICIvbm8tazQiLCAgICAgICAgICAgIEtSQl9JX05LNCwgQ01fSU5WIH0sLyogL05PLUtFUkJFUk9TNCAqLworICAgIHsgIi9uby1rZXJiZXJvczQiLCAgICAgS1JCX0lfTks0LCAwIH0sICAgICAvKiAvTk8tS0VSQkVST1M0ICovCisgICAgeyAiL25vLWtyYjQiLCAgICAgICAgICBLUkJfSV9OSzQsIENNX0lOViB9LC8qIC9OTy1LRVJCRVJPUzQgKi8KKyAgICB7ICIvbm90LWZvcndhcmRhYmxlIiwgIEtSQl9JX05GVywgMCB9LCAgICAgICAgIC8qIC9OT1QtRk9SV0FSREFCTEUgKi8KKyAgICB7ICIvbm90LXByb3hpYWJsZSIsICAgIEtSQl9JX05QUiwgMCB9LCAgICAgLyogL05PVC1QUk9YSUFCTEUgICAqLworICAgIHsgIi9wYXNzd29yZCIsICAgICAgICAgS1JCX0lfUFcsICBDTV9BUkcgfSwgLyogL1BBU1NXT1JEOiAgICovCisjaWZkZWYgT1MyCisgICAgeyAiL3BvcHVwIiwgICAgICAgICAgICBLUkJfSV9QT1AsIDAgfSwgICAgIC8qIC9QT1BVUCAgICAgICAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIHsgIi9wb3N0ZGF0ZSIsICAgICAgICAgS1JCX0lfUEQsIENNX0FSRyB9LCAvKiAvUE9TVERBVEU6ICAgKi8KKyAgICB7ICIvcHIiLCAgICAgICAgICAgICAgIEtSQl9JX1BSLCBDTV9JTlZ8Q01fQUJSIH0sIC8qIHRvIGFsbG93IGZvciAqLworICAgIHsgIi9wcm8iLCAgICAgICAgICAgICAgS1JCX0lfUFIsIENNX0lOVnxDTV9BQlIgfSwgLyogZGlmZmVyZW50IHNwZWxsaW5ncyAqLworICAgIHsgIi9wcm94IiwgICAgICAgICAgICAgS1JCX0lfUFIsIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICIvcHJveGlhYmxlIiwgICAgICAgIEtSQl9JX1BSLCAwIH0sICAgICAgLyogL1BST1hJQUJMRSAgICovCisgICAgeyAiL3Byb3h5YWJsZSIsICAgICAgICBLUkJfSV9QUiwgQ01fSU5WIH0sIC8qIC9QUk9YWUFCTEUgICAqLworICAgIHsgIi9yZWFsbSIsICAgICAgICAgICAgS1JCX0lfUkwsIENNX0FSRyB9LCAvKiAvUkVBTE06ICAgICAgKi8KKyAgICB7ICIvcmVuZXciLCAgICAgICAgICAgIEtSQl9JX1JOLCAwIH0sICAgICAgICAgIC8qIC9SRU5FVyAgICAgICAqLworICAgIHsgIi9yZW5ld2FibGUiLCAgICAgICAgS1JCX0lfUkIsIENNX0FSRyB9LCAvKiAvUkVORVdBQkxFOiAgKi8KKyAgICB7ICIvc2VydmljZSIsICAgICAgICAgIEtSQl9JX1NSLCBDTV9BUkcgfSwgLyogL1NFUlZJQ0U6ICAgICovCisgICAgeyAiL3ZhbGlkYXRlIiwgICAgICAgICBLUkJfSV9WQSwgMCB9LCAgICAgICAgICAvKiAvVkFMSURBVEUgICAgKi8KKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IGtyYjVfaV9uID0gc2l6ZW9mKGtyYjVfaV90YmwpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKSAtIDE7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGtsY3RhYltdID0geyAgICAgICAvKiBMaXN0IENyZWRlbnRpYWxzIHN3aXRjaGVzKi8KKyAgICB7ICIvYWRkcmVzc2VzIiwgIFhZS0xDQUQsIDAgfSwKKyAgICB7ICIvZW5jcnlwdGlvbiIsIFhZS0xDRU4sIDAgfSwKKyAgICB7ICIvZmxhZ3MiLCAgICAgIFhZS0xDRkwsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmtsY3RhYiA9IHNpemVvZihrbGN0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKTsKKworZXh0ZXJuIGludCBrcmJfYWN0aW9uOworZXh0ZXJuIHN0cnVjdCBrcmJfb3BfZGF0YSBrcmJfb3A7CisKK2V4dGVybiBzdHJ1Y3Qga3JiNV9saXN0X2NyZWRfZGF0YSBrcmI1X2xjOworZXh0ZXJuIHN0cnVjdCBrcmI1X2luaXRfZGF0YSBrcmI1X2luaXQ7CitleHRlcm4gY2hhciAqIGtyYjVfZF9wcmluY2lwYWw7ICAgICAgICAgLyogRGVmYXVsdCBwcmluY2lwYWwgKi8KK2V4dGVybiBjaGFyICoga3JiNV9kX2luc3RhbmNlOworZXh0ZXJuIGNoYXIgKiBrcmI1X2RfcmVhbG07ICAgICAgICAgICAgIC8qIERlZmF1bHQgcmVhbG0gKi8KK2V4dGVybiBjaGFyICoga3JiNV9kX2NjOyAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IGNyZWRlbnRpYWxzIGNhY2hlICovCitleHRlcm4gY2hhciAqIGtyYjVfZF9zcnY7ICAgICAgICAgICAgICAgLyogRGVmYXVsdCBzZXJ2aWNlIG5hbWUgKi8KK2V4dGVybiBpbnQgICAga3JiNV9kX2xpZmV0aW1lOyAgICAgICAgICAvKiBEZWZhdWx0IGxpZmV0aW1lICovCitleHRlcm4gaW50ICAgIGtyYjVfZF9mb3J3YXJkYWJsZTsKK2V4dGVybiBpbnQgICAga3JiNV9kX3Byb3hpYWJsZTsKK2V4dGVybiBpbnQgICAga3JiNV9kX3JlbmV3YWJsZTsKK2V4dGVybiBpbnQgICAga3JiNV9hdXRvZ2V0OworZXh0ZXJuIGludCAgICBrcmI1X2F1dG9kZWw7CitleHRlcm4gaW50ICAgIGtyYjVfZF9nZXRrNDsKK2V4dGVybiBpbnQgICAga3JiNV9kX25vX2FkZHJlc3NlczsKK2V4dGVybiBpbnQgICAga3JiNV9jaGVja2FkZHJzOworZXh0ZXJuIGNoYXIgKiBrcmI1X2RfYWRkcnNbXTsKK2V4dGVybiBjaGFyICogazVfa2V5dGFiOyAgICAgICAgICAgICAgICAvKiBLZXl0YWIgZmlsZSAqLworCitleHRlcm4gc3RydWN0IGtyYjRfaW5pdF9kYXRhIGtyYjRfaW5pdDsKK2V4dGVybiBjaGFyICoga3JiNF9kX3ByaW5jaXBhbDsgICAgICAgICAvKiBEZWZhdWx0IHByaW5jaXBhbCAqLworZXh0ZXJuIGNoYXIgKiBrcmI0X2RfcmVhbG07ICAgICAgICAgICAgIC8qIERlZmF1bHQgcmVhbG0gKi8KK2V4dGVybiBjaGFyICoga3JiNF9kX3NydjsgICAgICAgICAgICAgICAvKiBEZWZhdWx0IHNlcnZpY2UgbmFtZSAqLworZXh0ZXJuIGludCAgICBrcmI0X2RfbGlmZXRpbWU7ICAgICAgICAgIC8qIERlZmF1bHQgbGlmZXRpbWUgKi8KK2V4dGVybiBpbnQgICAga3JiNF9kX3ByZWF1dGg7CitleHRlcm4gY2hhciAqIGtyYjRfZF9pbnN0YW5jZTsKK2V4dGVybiBpbnQgICAga3JiNF9hdXRvZ2V0OworZXh0ZXJuIGludCAgICBrcmI0X2F1dG9kZWw7CitleHRlcm4gaW50ICAgIGtyYjRfY2hlY2thZGRyczsKK2V4dGVybiBjaGFyICogazRfa2V5dGFiOyAgICAgICAgICAgICAgICAvKiBLZXl0YWIgZmlsZSAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKyNpZm5kZWYgTk9TSE9XCitpbnQKK3Nob19pa3MoKSB7CisjaWZkZWYgSUtTRENPTkYKKyNpZmRlZiBDS19MT0dJTgorICAgIGV4dGVybiBpbnQgY2t4c3lzbG9nLCBja3h3dG1wLCBja3hhbm9uOworI2lmZGVmIFVOSVgKKyAgICBleHRlcm4gaW50IGNreHByaXY7CisjZW5kaWYgLyogVU5JWCAqLworI2lmZGVmIENLX1BFUk1TCisgICAgZXh0ZXJuIGludCBja3hwZXJtczsKKyNlbmRpZiAvKiBDS19QRVJNUyAqLworICAgIGV4dGVybiBjaGFyICogYW5vbmZpbGUsICogdXNlcmZpbGUsICogYW5vbnJvb3Q7CisjaWZkZWYgT1MyCisgICAgZXh0ZXJuIGNoYXIgKiBhbm9uYWNjdDsKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBOVAorICAgIGV4dGVybiBjaGFyICogaWtzX2RvbWFpbjsKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisjaWZkZWYgQ0tXVE1QCisgICAgZXh0ZXJuIGNoYXIgKiB3dG1wZmlsZTsKKyNlbmRpZiAvKiBDS1dUTVAgKi8KKyNpZmRlZiBJS1NEQgorICAgIGV4dGVybiBjaGFyICogZGJmaWxlOworICAgIGV4dGVybiBpbnQgZGJlbmFibGVkOworI2VuZGlmIC8qIElLU0RCICovCisjaWZkZWYgQ0tfTE9HSU4KKyAgICBleHRlcm4gaW50IGxvZ2ludGltbzsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgIGV4dGVybiBpbnQgc3J2Y2Rtc2csIHN1Y2Nlc3MsIGlrc2RjZiwgbm9pbml0LCBhcmdfeDsKKyAgICBleHRlcm4gY2hhciAqIGNkbXNnZmlsZVtdLCAqIGNkbXNnc3RyLCAqa2VybXJjOworICAgIGNoYXIgKiBiYW5uZXJmaWxlID0gTlVMTDsKKyAgICBjaGFyICogaGVscGZpbGUgPSBOVUxMOworICAgIGV4dGVybiBpbnQgeGZlcmxvZzsKKyAgICBleHRlcm4gY2hhciAqIHhmZXJmaWxlOworICAgIGludCBpOworCisgICAgaWYgKGlzZ3Vlc3QpIHsKKyAgICAgICAgcHJpbnRmKCI/Q29tbWFuZCBkaXNhYmxlZFxyXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICB9CisKKyAgICBwcmludGYoIklLUyBTZXR0aW5nc1xyXG4iKTsKKyNpZmRlZiBDS19MT0dJTgorI2lmZGVmIE9TMgorICAgIHByaW50ZigiICBBbm9ueW1vdXMgQWNjb3VudDogICAlc1xyXG4iLGFub25hY2N0P2Fub25hY2N0OiI8bm9uZT4iKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBwcmludGYoIiAgQW5vbnltb3VzIEluaXRmaWxlOiAgJXNcclxuIixhbm9uZmlsZT9hbm9uZmlsZToiPG5vbmU+Iik7CisgICAgcHJpbnRmKCIgIEFub255bW91cyBMb2dpbjogICAgICVkXHJcbiIsY2t4YW5vbik7CisgICAgcHJpbnRmKCIgIEFub255bW91cyBSb290OiAgICAgICVzXHJcbiIsYW5vbnJvb3Q/YW5vbnJvb3Q6Ijxub25lPiIpOworI2VuZGlmIC8qIENLX0xPR0lOICovCisgICAgcHJpbnRmKCIgIEJhbm5lcmZpbGU6ICAgICAgICAgICVzXHJcbiIsYmFubmVyZmlsZT9iYW5uZXJmaWxlOiI8bm9uZT4iKTsKKyAgICBwcmludGYoIiAgQ0RmaWxlOiAgICAgICAgICAgICAgJXNcclxuIixjZG1zZ2ZpbGVbMF0/Y2Rtc2dmaWxlWzBdOiI8bm9uZT4iKTsKKyAgICBmb3IgKCBpPTE7aTwxNiAmJiBjZG1zZ2ZpbGVbaV07aSsrICkKKyAgICAgICAgcHJpbnRmKCIgIENEZmlsZTogICAgICAgICAgICAgICVzXHJcbiIsY2Rtc2dmaWxlW2ldKTsKKyAgICBwcmludGYoIiAgQ0RNZXNzYWdlOiAgICAgICAgICAgJWRcclxuIixzcnZjZG1zZyk7CisjaWZkZWYgSUtTREIKKyAgICBwcmludGYoIiAgREJmaWxlOiAgICAgICAgICAgICAgJXNcclxuIixkYmZpbGU/ZGJmaWxlOiI8bm9uZT4iKTsKKyAgICBwcmludGYoIiAgREJlbmFibGVkOiAgICAgICAgICAgJWRcclxuIixkYmVuYWJsZWQpOworI2VuZGlmIC8qIElLU0RCICovCisjaWZkZWYgQ0tfTE9HSU4KKyNpZmRlZiBOVAorICAgIHByaW50ZigiICBEZWZhdWx0LWRvbWFpbjogICAgICAlc1xyXG4iLGlrc19kb21haW4/aWtzX2RvbWFpbjoiLiIpOworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICBwcmludGYoIiAgSGVscGZpbGU6ICAgICAgICAgICAgJXNcclxuIixoZWxwZmlsZT9oZWxwZmlsZToiPG5vbmU+Iik7CisgICAgcHJpbnRmKCIgIEluaXRmaWxlOiAgICAgICAgICAgICVzXHJcbiIsa2VybXJjP2tlcm1yYzoiPG5vbmU+Iik7CisgICAgcHJpbnRmKCIgIE5vLUluaXRmaWxlOiAgICAgICAgICVkXHJcbiIsbm9pbml0KTsKKyNpZmRlZiBDS19MT0dJTgorI2lmZGVmIENLX1BFUk0KKyAgICBwcmludGYoIiAgUGVybWlzc2lvbiBjb2RlOiAgICAgJTBkXHJcbiIsY2t4cGVybXMpOworI2VuZGlmIC8qIENLX1BFUk0gKi8KKyNpZmRlZiBVTklYCisgICAgcHJpbnRmKCIgIFByaXZpbGVnZWQgTG9naW46ICAgICVkXHJcbiIsY2t4cHJpdik7CisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisgICAgcHJpbnRmKCIgIFNlcnZlci1vbmx5OiAgICAgICAgICVkXHJcbiIsYXJnX3gpOworICAgIHByaW50ZigiICBTeXNsb2c6ICAgICAgICAgICAgICAlZFxyXG4iLGNreHN5c2xvZyk7CisgICAgcHJpbnRmKCIgIFRpbWVvdXQgKHNlY29uZHMpOiAgICVkXHJcbiIsbG9naW50aW1vKTsKKyAgICBwcmludGYoIiAgVXNlcmZpbGU6ICAgICAgICAgICAgJXNcclxuIix1c2VyZmlsZT91c2VyZmlsZToiPG5vbmU+Iik7CisjaWZkZWYgQ0tfTE9HSU4KKyNpZmRlZiBDS1dUTVAKKyAgICBwcmludGYoIiAgV3RtcGxvZzogICAgICAgICAgICAgJWRcclxuIixja3h3dG1wKTsKKyAgICBwcmludGYoIiAgV3RtcGZpbGU6ICAgICAgICAgICAgJXNcclxuIix3dG1wZmlsZT93dG1wZmlsZToiPG5vbmU+Iik7CisjZW5kaWYgLyogQ0tXVE1QICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICBwcmludGYoIiAgWGZlcmZpbGU6ICAgICAgICAgICAgJXNcclxuIix4ZmVyZmlsZT94ZmVyZmlsZToiPG5vbmU+Iik7CisgICAgcHJpbnRmKCIgIFhmZXJsb2c6ICAgICAgICAgICAgICVkXHJcbiIseGZlcmxvZyk7CisjZWxzZSAvKiBJS1NEQ09ORiAqLworICAgIHByaW50ZigiP05vdGhpbmcgdG8gc2hvdy5cclxuIik7CisjZW5kaWYgLyogSUtTRENPTkYgKi8KKyAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworfQorCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KK2ludAorc2hvX2F1dGgoY3gpIGludCBjeDsgeworICAgIGV4dGVybiBpbnQgYXV0aF90eXBlX3VzZXJbXSwgY21kX3Jvd3M7CisgICAgaW50IGk7CisgICAgY2hhciAqIHA7CisgICAgaW50IGt2ID0gMCwgYWxsID0gMCwgbiA9IDA7CisKKyNpZmRlZiBJS1NECisgICAgaWYgKGluc2VydmVyICYmIGlzZ3Vlc3QpIHsKKyAgICAgICAgcHJpbnRmKCI/U29ycnksIGNvbW1hbmQgZGlzYWJsZWQuXHJcbiIpOworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgIH0KKyNlbmRpZiAvKiBJS1NEICovCisgICAgaWYgKGN4KSB7CisgICAgICAgIGt2ID0gY3g7CisgICAgfSBlbHNlIGlmIChhdXRoX3R5cGVfdXNlclswXSAhPSBBVVRIVFlQRV9BVVRPKSB7CisgICAgICAgIGt2ID0gYXV0aF90eXBlX3VzZXJbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWxsID0gMTsKKyAgICAgICAga3YgPSBBVVRIVFlQRV9LRVJCRVJPU19WNDsKKyAgICB9CisgICAgd2hpbGUgKGt2KSB7CisgICAgICAgIHN3aXRjaCAoa3YpIHsKKyAgICAgICAgICBjYXNlIEFVVEhUWVBFX0tFUkJFUk9TX1Y0OgorICAgICAgICAgICAga3YgPSBhbGwgPyBBVVRIVFlQRV9LRVJCRVJPU19WNSA6IDA7CisgICAgICAgICAgICBpZiAoY2tfa3JiNF9pc19pbnN0YWxsZWQoKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiIEF1dGhlbnRpY2F0aW9uOiAgICAgIEtlcmJlcm9zIDRcbiIpOworICAgICAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiIEF1dGhlbnRpY2F0aW9uOiAgICAgIEtlcmJlcm9zIDQgKG5vdCBpbnN0YWxsZWQpXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2lmZGVmIENLX0tFUkJFUk9TCisgICAgICAgICAgICBwcmludGYoIiBLZXl0YWIgZmlsZTogICAgICAgICAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBrNF9rZXl0YWIgPyBrNF9rZXl0YWIgOiAiKG5vbmUpIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgaWYgKGtyYl9hY3Rpb24gPCAwKSB7CisgICAgICAgICAgICAgICAgcCA9ICIobm9uZSkiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSAiIiwgaSA9IDA7IGkgPCBrcmJfYV9uOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtyYl9hY3Rpb24gPT0ga3JiX2FfdGJsW2ldLmt3dmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwID0ga3JiX2FfdGJsW2ldLmt3ZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCIgQWN0aW9uOiAgICAgICAgICAgICAgJXNcbiIsIHApOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIERlZmF1bHQgbGlmZXRpbWUgICAgICVkXG4iLGtyYjRfZF9saWZldGltZSk7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgTGlmZXRpbWU6ICAgICAgICAgICAgJWQgKG1pbnV0ZXMpXG4iLGtyYjRfaW5pdC5saWZldGltZSk7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgRGVmYXVsdCBwcmVhdXRoOiAgICAgJWRcbiIsa3JiNF9kX3ByZWF1dGgpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIFByZWF1dGg6ICAgICAgICAgICAgICVkXG4iLGtyYjRfaW5pdC5wcmVhdXRoKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBEZWZhdWx0IHByaW5jaXBhbDogICBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgIGtyYjRfZF9wcmluY2lwYWwgPyBrcmI0X2RfcHJpbmNpcGFsIDogIiIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIFByaW5jaXBhbDogICAgICAgICAgIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAga3JiNF9pbml0LnByaW5jaXBhbCA/IGtyYjRfaW5pdC5wcmluY2lwYWwgOiAiIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgRGVmYXVsdCByZWFsbTogICAgICAgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICBrcmI0X2RfcmVhbG0gPyBrcmI0X2RfcmVhbG0gOiAiIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgUmVhbG06ICAgICAgICAgICAgICAgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICBrcmI0X2luaXQucmVhbG0gPyBrcmI0X2luaXQucmVhbG0gOiAiIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgRGVmYXVsdCBpbnN0YW5jZTogICAgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICBrcmI0X2RfaW5zdGFuY2UgPyBrcmI0X2RfaW5zdGFuY2UgOiAiIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgSW5zdGFuY2U6ICAgICAgICAgICAgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICBrcmI0X2luaXQuaW5zdGFuY2UgPyBrcmI0X2luaXQuaW5zdGFuY2UgOiAiIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgQXV0by1HZXQgVEdUczogICAgICAgJWRcbiIsa3JiNF9hdXRvZ2V0KTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBBdXRvLURlc3Ryb3kgVEdUczogICAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAga3JiNF9hdXRvZGVsPT1LUkJfREVMX05PPyJuZXZlciI6CisgICAgICAgICAgICAgICAgICAgIGtyYjRfYXV0b2RlbD09S1JCX0RFTF9DTD8ib24tY2xvc2UiOiJvbi1leGl0Iik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgQ2hlY2sgSVAgQWRkcmVzc2VzOiAgJWRcbiIsa3JiNF9jaGVja2FkZHJzKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgcHJpbnRmKCIgUGFzc3dvcmQ6ICAgIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAga3JiNF9pbml0LnBhc3N3b3JkICA/IGtyYjRfaW5pdC5wYXNzd29yZCAgOiAiIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVVEhUWVBFX0tFUkJFUk9TX1Y1OgorICAgICAgICAgICAga3YgPSBhbGwgPyBBVVRIVFlQRV9TU0wgOiAwOworICAgICAgICAgICAgaWYgKGNrX2tyYjVfaXNfaW5zdGFsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2tfZ3NzYXBpX2lzX2luc3RhbGxlZCgpKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBBdXRoZW50aWNhdGlvbjogICAgICBLZXJiZXJvcyA1IHBsdXMgR1NTQVBJXG4iKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIEF1dGhlbnRpY2F0aW9uOiAgICAgIEtlcmJlcm9zIDVcbiIpOworICAgICAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiIEF1dGhlbnRpY2F0aW9uOiAgICAgIEtlcmJlcm9zIDUgKG5vdCBpbnN0YWxsZWQpXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisjaWZkZWYgQ0tfS0VSQkVST1MKKyAgICAgICAgICAgIHByaW50ZigiIENhY2hlIGZpbGU6ICAgICAgICAgICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBrcmJfb3AuY2FjaGUgPyBrcmJfb3AuY2FjaGUgOiAiKG5vbmUpIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgRGVmYXVsdCBjYWNoZTogICAgICAgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGtyYjVfZF9jYyA/IGtyYjVfZF9jYyA6ICIobm9uZSkiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBLZXl0YWIgZmlsZTogICAgICAgICAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBrNV9rZXl0YWIgPyBrNV9rZXl0YWIgOiAiKG5vbmUpIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgaWYgKGtyYl9hY3Rpb24gPCAwKSB7CisgICAgICAgICAgICAgICAgcCA9ICIobm9uZSkiOworICAgICAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICAgICAgZm9yIChwID0gIiIsIGkgPSAwOyBpIDwga3JiX2FfbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChrcmJfYWN0aW9uID09IGtyYl9hX3RibFtpXS5rd3ZhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGtyYl9hX3RibFtpXS5rd2Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiIEFjdGlvbjogICAgICAgICAgICAgICVzXG4iLCBwKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisKKyAgICAgICAgICAgIHByaW50ZigiIERlZmF1bHQgZm9yd2FyZGFibGUgICVkXG4iLGtyYjVfZF9mb3J3YXJkYWJsZSk7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgRm9yd2FyZGFibGU6ICAgICAgICAgJWRcbiIsa3JiNV9pbml0LmZvcndhcmRhYmxlKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBEZWZhdWx0IGxpZmV0aW1lICAgICAlZFxuIixrcmI1X2RfbGlmZXRpbWUpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIExpZmV0aW1lOiAgICAgICAgICAgICVkIChtaW51dGVzKVxuIixrcmI1X2luaXQubGlmZXRpbWUpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIFBvc3RkYXRlOiAgICAgICAgICAgIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAga3JiNV9pbml0LnBvc3RkYXRlID8ga3JiNV9pbml0LnBvc3RkYXRlOiAiIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgRGVmYXVsdCBwcm94aWFibGU6ICAgJWRcbiIsa3JiNV9kX3Byb3hpYWJsZSk7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgUHJveGlhYmxlOiAgICAgICAgICAgJWRcbiIsa3JiNV9pbml0LnByb3hpYWJsZSk7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgUmVuZXc6ICAgICAgICAgICAgICAgJWRcbiIsa3JiNV9pbml0LnJlbmV3KTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBEZWZhdWx0IHJlbmV3YWJsZTogICAlZCAobWludXRlcylcbiIsa3JiNV9kX3JlbmV3YWJsZSk7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgUmVuZXdhYmxlOiAgICAgICAgICAgJWQgKG1pbnV0ZXMpXG4iLGtyYjVfaW5pdC5yZW5ld2FibGUpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIFNlcnZpY2U6ICAgICAgICAgICAgIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAga3JiNV9pbml0LnNlcnZpY2UgPyBrcmI1X2luaXQuc2VydmljZSA6ICIiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBWYWxpZGF0ZTogICAgICAgICAgICAlZFxuIixrcmI1X2luaXQudmFsaWRhdGUpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIERlZmF1bHQgcHJpbmNpcGFsOiAgIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAga3JiNV9kX3ByaW5jaXBhbCA/IGtyYjVfZF9wcmluY2lwYWwgOiAiIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgUHJpbmNpcGFsOiAgICAgICAgICAgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICBrcmI1X2luaXQucHJpbmNpcGFsID8ga3JiNV9pbml0LnByaW5jaXBhbCA6ICIiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBEZWZhdWx0IGluc3RhbmNlOiAgICBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgIGtyYjVfZF9pbnN0YW5jZSA/IGtyYjVfZF9pbnN0YW5jZSA6ICIiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBEZWZhdWx0IHJlYWxtOiAgICAgICBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgIGtyYjVfZF9yZWFsbSA/IGtyYjVfZF9yZWFsbSA6ICIiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBSZWFsbTogICAgICAgICAgICAgICBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgIGtyYjVfaW5pdC5yZWFsbSA/IGtyYjVfaW5pdC5yZWFsbSA6ICIiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBBdXRvLUdldCBUR1RzOiAgICAgICAlZFxuIixrcmI1X2F1dG9nZXQpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIEF1dG8tRGVzdHJveSBUR1RzOiAgICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBrcmI1X2F1dG9kZWw9PUtSQl9ERUxfTk8/Im5ldmVyIjoKKyAgICAgICAgICAgICAgICAgICAga3JiNV9hdXRvZGVsPT1LUkJfREVMX0NMPyJvbi1jbG9zZSI6Im9uLWV4aXQiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBEZWZhdWx0IGdldCBLNCBUR1RzOiAlZFxuIixrcmI1X2RfZ2V0azQpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIEdldCBLNCBUR1RzOiAlZFxuIixrcmI1X2luaXQuZ2V0azQpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIENoZWNrIElQIEFkZHJlc3NlczogICVkXG4iLGtyYjVfY2hlY2thZGRycyk7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgTm8gSVAgQWRkcmVzc2VzOiAgJWRcbiIsa3JiNV9kX25vX2FkZHJlc3Nlcyk7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgSVAtQWRkcmVzc2VzOiAgICAgICAgIik7CisgICAgICAgICAgICBpZiAoa3JiNV9pbml0LmFkZHJzICYmIGtyYjVfaW5pdC5hZGRyc1swXSkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGtyYjVfaW5pdC5hZGRyc1tpXTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpKQorICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCIpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzIixrcmI1X2luaXQuYWRkcnNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa3JiNV9kX2FkZHJzWzBdKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDtpIDwgS1JCNV9OVU1fT0ZfQUREUlMgJiYga3JiNV9kX2FkZHJzW2ldO2krKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSkKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyIsa3JiNV9kX2FkZHJzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiKHVzZSBkZWZhdWx0KSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICBwcmludGYoIiBQYXNzd29yZDogICAgICAgICAgICBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgIGtyYjVfaW5pdC5wYXNzd29yZCAgPyBrcmI1X2luaXQucGFzc3dvcmQgIDogIiIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEFVVEhUWVBFX1NTTDoKKyAgICAgICAgICAgIGt2ID0gYWxsID8gQVVUSFRZUEVfU1JQIDogMDsKKyAgICAgICAgICAgIGlmIChja19zc2xlYXlfaXNfaW5zdGFsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiBBdXRoZW50aWNhdGlvbjogICAgICBTU0wvVExTICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBTU0xlYXlfdmVyc2lvbihTU0xFQVlfVkVSU0lPTikpOworICAgICAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiIEF1dGhlbnRpY2F0aW9uOiAgICAgIFNTTC9UTFMgKG5vdCBpbnN0YWxsZWQpXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICBwcmludGYoIiBSU0EgQ2VydHMgZmlsZTogJXNcbiIsc3NsX3JzYV9jZXJ0X2ZpbGU/CisgICAgICAgICAgICAgICAgICBzc2xfcnNhX2NlcnRfZmlsZToiKG5vbmUpIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgUlNBIENlcnRzIENoYWluIGZpbGU6ICVzXG4iLHNzbF9yc2FfY2VydF9jaGFpbl9maWxlPworICAgICAgICAgICAgICAgICAgc3NsX3JzYV9jZXJ0X2NoYWluX2ZpbGU6Iihub25lKSIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIFJTQSBLZXkgZmlsZTogJXNcbiIsc3NsX3JzYV9rZXlfZmlsZT8KKyAgICAgICAgICAgICAgICAgIHNzbF9yc2Ffa2V5X2ZpbGU6Iihub25lKSIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIERTQSBDZXJ0cyBmaWxlOiAlc1xuIixzc2xfZHNhX2NlcnRfZmlsZT8KKyAgICAgICAgICAgICAgICAgIHNzbF9kc2FfY2VydF9maWxlOiIobm9uZSkiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBEU0EgQ2VydHMgQ2hhaW4gZmlsZTogJXNcbiIsc3NsX2RzYV9jZXJ0X2NoYWluX2ZpbGU/CisgICAgICAgICAgICAgICAgICBzc2xfZHNhX2NlcnRfY2hhaW5fZmlsZToiKG5vbmUpIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgREggS2V5IGZpbGU6ICVzXG4iLHNzbF9kaF9rZXlfZmlsZT8KKyAgICAgICAgICAgICAgICAgIHNzbF9kaF9rZXlfZmlsZToiKG5vbmUpIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgREggUGFyYW0gZmlsZTogJXNcbiIsc3NsX2RoX3BhcmFtX2ZpbGU/CisgICAgICAgICAgICAgICAgICBzc2xfZGhfcGFyYW1fZmlsZToiKG5vbmUpIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgQ1JMIGZpbGU6ICVzXG4iLHNzbF9jcmxfZmlsZT8KKyAgICAgICAgICAgICAgICAgIHNzbF9jcmxfZmlsZToiKG5vbmUpIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgQ1JMIGRpcjogJXNcbiIsc3NsX2NybF9kaXI/CisgICAgICAgICAgICAgICAgICAgIHNzbF9jcmxfZGlyOiIobm9uZSkiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBSYW5kb20gZmlsZTogJXNcbiIsc3NsX3JuZF9maWxlPworICAgICAgICAgICAgICAgICAgc3NsX3JuZF9maWxlOiIobm9uZSkiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBWZXJpZnkgZmlsZTogJXNcbiIsc3NsX3ZlcmlmeV9maWxlPworICAgICAgICAgICAgICAgICAgc3NsX3ZlcmlmeV9maWxlOiIobm9uZSkiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBWZXJpZnkgZGlyOiAlc1xuIixzc2xfdmVyaWZ5X2Rpcj8KKyAgICAgICAgICAgICAgICAgIHNzbF92ZXJpZnlfZGlyOiIobm9uZSkiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBDaXBoZXIgbGlzdDogJXNcbiIsc3NsX2NpcGhlcl9saXN0ID8gc3NsX2NpcGhlcl9saXN0IDogCisJCSAgICBERUZBVUxUX0NJUEhFUl9MSVNUKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBpZiAoc3NsX2NvbiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU1NMX2xpYnJhcnlfaW5pdCgpOworICAgICAgICAgICAgICAgIHNzbF9jdHggPSAoU1NMX0NUWCAqKQorICAgICAgICAgICAgICAgICAgU1NMX0NUWF9uZXcoKFNTTF9NRVRIT0QgKilUTFN2MV9tZXRob2QoKSk7CisgICAgICAgICAgICAgICAgaWYgKHNzbF9jdHggIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHNzbF9jb249IChTU0wgKikgU1NMX25ldyhzc2xfY3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzc2xfY29uICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBDSEFSICogcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwID0gKENIQVIgKikgU1NMX2dldF9jaXBoZXJfbGlzdChzc2xfY29uLGkpOworICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAlc1xuIixwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCIgQ2VydHMgT0s/ICVzXG4iLHNzbF9jZXJ0c29rX2ZsYWc/ICJ5ZXMiIDogIm5vIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCIgRGVidWcgbW9kZTogJXNcbiIsIHNzbF9kZWJ1Z19mbGFnID8gIm9uIiA6ICJvZmYiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBWZXJib3NlIG1vZGU6ICVzXG4iLCBzc2xfdmVyYm9zZV9mbGFnID8gIm9uIiA6ICJvZmYiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBWZXJpZnkgbW9kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJpZnlfZmxhZyA9PSBTU0xfVkVSSUZZX05PTkUgPyAibm9uZSIgOgorICAgICAgICAgICAgICAgICAgICBzc2xfdmVyaWZ5X2ZsYWcgPT0gU1NMX1ZFUklGWV9QRUVSID8gInBlZXItY2VydCIgOgorICAgICAgICAgICAgICAgICAgICAiZmFpbC1pZi1uby1wZWVyLWNlcnQiKTsKKyAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIiBTU0wgb25seT8gJXNcbiIsIHNzbF9vbmx5X2ZsYWcgPyAieWVzIiA6ICJubyIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiIFRMUyBvbmx5PyAlc1xuIiwgdGxzX29ubHlfZmxhZyA/ICJ5ZXMiIDogIm5vIik7CisgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworI2VuZGlmIC8qIENLX1NTTCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBBVVRIVFlQRV9OVExNOgorICAgICAgICAgICAga3YgPSAwOworICAgICAgICAgICAgaWYgKGNrX250bG1faXNfaW5zdGFsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiBBdXRoZW50aWNhdGlvbjogICAgICBOVExNXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgICAgIHByaW50ZigiIE5vIG9wdGlvbnNcbiIpOworICAgICAgICAgICAgICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiIEF1dGhlbnRpY2F0aW9uOiAgICAgIE5UTE0gKG5vdCBpbnN0YWxsZWQpXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQVVUSFRZUEVfU1JQOgorICAgICAgICAgICAga3YgPSBhbGwgPyBBVVRIVFlQRV9OVExNIDogMDsKKyAgICAgICAgICAgIGlmIChja19zcnBfaXNfaW5zdGFsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2tfa3J5cHRvX2lzX2luc3RhbGxlZCgpKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBBdXRoZW50aWNhdGlvbjogICAgICBTUlAgcGx1cyBLcnlwdG8gQVBJXG4iKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIEF1dGhlbnRpY2F0aW9uOiAgICAgIFNSUFxuIik7CisgICAgICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgICAgICBwcmludGYoIiBObyBvcHRpb25zXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiBBdXRoZW50aWNhdGlvbjogICAgICBTUlAgKG5vdCBpbnN0YWxsZWQpXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyNlbmRpZiAvKiBOT1NIT1cgKi8KKworI2lmZGVmIENLX0tFUkJFUk9TCisKKy8qICBDIFAgXyBBIFUgVCBIICAtLSAgQVVUSEVOVElDQVRFIGNvbW1hbmQgcGFyc2luZyAgKi8KKworaW50CitjcF9hdXRoKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZF9QYXJzZSBBVVRIRU5USUNBVEUgKi8KKyAgICBpbnQgYywgaSwgbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBXb3JrZXJzICovCisgICAgaW50IHJjID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGNvZGUgKi8KKyAgICBpbnQgZ2V0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYXJzaW5nIGhlbHBlcnMgKi8KKyAgICBpbnQgdG1wYXV0aCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBUZW1wb3JhcnkgYXV0aGVudGljYXRpb24gdHlwZSAqLworICAgIGludCBrdiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBLZXJiZXJvcyB2ZXJzaW9uICovCisgICAgaW50IHRtcF9hY3Rpb24gPSAtMTsgICAgICAgICAgICAgICAgLyogVGVtcG9yYXJ5IEtlcmJlcm9zIGFjdGlvbiAqLworICAgIGludCB0bXBfa2xjID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBsaXN0LWNyZWRlbnRpYWxzICovCisgICAgY2hhciB0bXBobHBbMjU2XTsgICAgICAgICAgICAgICAgICAgLyogRm9yIGJ1aWxkaW5nIGhlbHAgbWVzc2FnZSAqLworICAgIGNoYXIgKiBwOworICAgIGNoYXIgKiB0bXBwc3dkICA9IE5VTEw7ICAgICAgICAgICAgIC8qIFBhc3N3b3JkICovCisgICAgY2hhciAqIHRtcHByaW56ID0gTlVMTDsgICAgICAgICAgICAgLyogUHJpbmNpcGFsICovCisgICAgY2hhciAqIHRtcHJlYWxtID0gTlVMTDsgICAgICAgICAgICAgLyogUmVhbG0gKi8KKyAgICBjaGFyICogdG1wY2FjaGUgPSBOVUxMOyAgICAgICAgICAgICAvKiBDYWNoZSBmaWxlICovCisgICAgY2hhciAqIHRtcGluc3QgID0gTlVMTDsgICAgICAgICAgICAgLyogSzQgSW5zdGFuY2UgKi8KKyAgICBjaGFyICogdG1wYWRkcnNbS1JCNV9OVU1fT0ZfQUREUlNdOworI2lmZGVmIENLX1JFQ0FMTAorICAgIGV4dGVybiBpbnQgb25fcmVjYWxsOyAgICAgICAgICAgICAgIC8qIGFyb3VuZCBQYXNzd29yZCBwcm9tcHRpbmcgKi8KKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyAgICBzdHJ1Y3Qgc3RyaW5naW50IHsgICAgICAgICAgICAgICAgICAvKiBUZW1wb3JhcnkgYXJyYXkgZm9yIHN3aXRjaCB2YWx1ZXMgKi8KKyAgICAgICAgY2hhciAqIHN2YWw7ICAgICAgICAgICAgICAgICAgICAvKiBTdHJpbmcgdmFsdWUgKi8KKyAgICAgICAgaW50IGl2YWw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlZ2VyIHZhbHVlICovCisgICAgfSBwdltLUkJfSV9NQVgrMV07ICAgICAgICAgICAgICAgICAgLyogVGhpcyBtYW55ICovCisgICAgc3RydWN0IEZEQiBrdywgc3csIGZsOyAgICAgICAgICAgICAgLyogRkRCcyBmb3IgZWFjaCBwYXJzZSBmdW5jdGlvbiAqLworCisgICAga3JiX2FjdGlvbiA9IC0xOyAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBLZXJiZXJvcyBhY3Rpb24uICovCisgICAgdG1wX2FjdGlvbiA9IC0xOyAgICAgICAgICAgICAgICAgICAgLyogQW5kIG91ciBsb2NhbCBjb3B5LiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBLUkI1X05VTV9PRl9BRERSUzsgaSsrKQorICAgICAgdG1wYWRkcnNbaV0gPSBOVUxMOworCisgICAgaWYgKCh5ID0gY21rZXkoa2VyYnRhYixrZXJidGFibiwiYXV0aGVudGljYXRpb24gdHlwZSIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICB7CisgICAgICAgICAgaWYgKHkgPT0gLTMpCisgICAgICAgICAgICBwcmludGYoIj9BdXRoZW50aWNhdGlvbiB0eXBlIG5vdCBzcGVjaWZpZWQgLSBub3RoaW5nIGhhcHBlbnNcbiIpOworICAgICAgICAgIHJldHVybih5KTsKKyAgICAgIH0KKyAgICB0bXBhdXRoID0geTsKKyAgICBkZWJ1ZyhGMTAxLCJrZXJiZXJvcyBhdXRoZW50aWNhdGlvbiIsIiIsdG1wYXV0aCk7CisgICAgc3dpdGNoICh0bXBhdXRoKSB7CisgICAgICBjYXNlIEFVVEhfS1JCNDoga3YgPSA0OyBicmVhazsgICAgLyogRG9uJ3QgYXNzdW1lIHZhbHVlcyBhcmUgdGhlIHNhbWUgKi8KKyAgICAgIGNhc2UgQVVUSF9LUkI1OiBrdiA9IDU7IGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCI/QXV0aGVudGljYXRpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiBcIiVzXCJcbiIsYXRtYnVmKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisKKyAgICAvKiBGcm9tIGhlcmUgZG93biBpcyBLZXJiZXJvcyAqLworICAgIGluaV9rZXJiKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IEluaXQgZGF0YSB0byBkZWZhdWx0cyAqLworCisgICAgaWYgKGt2ID09IDQpIHsgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IEs0IGRlZmF1bHRzICovCisgICAgICAgIGlmIChrcmI0X2RfcmVhbG0pCisgICAgICAgICAgbWFrZXN0cigmdG1wcmVhbG0sa3JiNF9kX3JlYWxtKTsKKyAgICAgICAgaWYgKGtyYjRfZF9wcmluY2lwYWwpCisgICAgICAgICAgbWFrZXN0cigmdG1wcHJpbnosa3JiNF9kX3ByaW5jaXBhbCk7CisgICAgICAgIGlmIChrcmI0X2RfaW5zdGFuY2UpCisgICAgICAgICAgbWFrZXN0cigmdG1waW5zdCxrcmI0X2RfaW5zdGFuY2UpOworICAgIH0gZWxzZSBpZiAoa3YgPT0gNSkgeyAgICAgICAgICAgICAgIC8qIFNldCBLNSBkZWZhdWx0cyAqLworICAgICAgICBpZiAoa3JiNV9kX2NjKQorICAgICAgICAgIG1ha2VzdHIoJnRtcGNhY2hlLGtyYjVfZF9jYyk7CisgICAgICAgIGlmIChrcmI1X2RfcmVhbG0pCisgICAgICAgICAgbWFrZXN0cigmdG1wcmVhbG0sa3JiNV9kX3JlYWxtKTsKKyAgICAgICAgaWYgKGtyYjVfZF9wcmluY2lwYWwpCisgICAgICAgICAgbWFrZXN0cigmdG1wcHJpbnosa3JiNV9kX3ByaW5jaXBhbCk7CisgICAgICAgIGlmIChrcmI1X2RfaW5zdGFuY2UpCisgICAgICAgICAgbWFrZXN0cigmdG1waW5zdCxrcmI1X2RfaW5zdGFuY2UpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPD0gS1JCX0lfTUFYOyBpKyspIHsgIC8qIEluaXRpYWxpemUgc3dpdGNoIHZhbHVlcyAqLworICAgICAgICBwdltpXS5zdmFsID0gTlVMTDsgICAgICAgICAgICAgIC8qIHRvIG51bGwgcG9pbnRlcnMgKi8KKyAgICAgICAgcHZbaV0uaXZhbCA9IDA7ICAgICAgICAgICAgICAgICAvKiBhbmQgMCBpbnQgdmFsdWVzICovCisgICAgfQorCisgICAgaWYgKGt2ID09IDQpIHsgICAgICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgNCAqLworICAgICAgICBwdltLUkJfSV9MRl0uaXZhbCA9IGtyYjRfZF9saWZldGltZTsKKyAgICAgICAgcHZbS1JCX0lfUEFdLml2YWwgPSBrcmI0X2RfcHJlYXV0aDsKKworICAgICAgICBpZiAoKG4gPSBjbWtleShrcmJfYV90Ymwsa3JiX2FfbiwiS2VyYmVyb3MgNCBhY3Rpb24iLCIiLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKG4gPT0gLTMpCisgICAgICAgICAgICAgICAgcHJpbnRmKCI/QWN0aW9uIG5vdCBzcGVjaWZpZWQgLSBub3RoaW5nIGhhcHBlbnMuXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuKG4pOworICAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGt2ID09IDUpIHsgICAgICAgICAgICAgICAvKiBLZXJiZXJvcyA1ICovCisgICAgICAgIHB2W0tSQl9JX0ZXXS5pdmFsID0ga3JiNV9kX2ZvcndhcmRhYmxlOworICAgICAgICBwdltLUkJfSV9QUl0uaXZhbCA9IGtyYjVfZF9wcm94aWFibGU7CisgICAgICAgIHB2W0tSQl9JX0xGXS5pdmFsID0ga3JiNV9kX2xpZmV0aW1lOworICAgICAgICBwdltLUkJfSV9SQl0uaXZhbCA9IGtyYjVfZF9yZW5ld2FibGU7CisgICAgICAgIHB2W0tSQl9JX0s0XS5pdmFsID0ga3JiNV9kX2dldGs0OworICAgICAgICBwdltLUkJfSV9OQURdLml2YWwgPSBrcmI1X2Rfbm9fYWRkcmVzc2VzOworCisgICAgICAgIC8qIE1ha2UgaGVscCBtZXNzYWdlIHRoYXQgc2hvd3Mgc3dpdGNoZXMgYW5kIGFjdGlvbiBrZXl3b3JkcyAqLworICAgICAgICBja3N0cm5jcHkodG1waGxwLCJLZXJiZXJvcyA1IGFjdGlvbiwgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gIiwyNTYpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwga3JiX2FfbjsgaSsrKSB7CisgICAgICAgICAgICBja3N0cm5jYXQodG1waGxwLGtyYl9hX3RibFtpXS5rd2Qsc2l6ZW9mKHRtcGhscCkpOworICAgICAgICAgICAgaWYgKGkgPT0ga3JiX2FfbiAtIDEpCisgICAgICAgICAgICAgIGNrc3RybmNhdCh0bXBobHAsIlxub3Igc3dpdGNoIixzaXplb2YodG1waGxwKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGNrc3RybmNhdCh0bXBobHAsIiAgICIsc2l6ZW9mKHRtcGhscCkpOworICAgICAgICB9CisgICAgICAgIC8qIFNldCB1cCBmaXJzdCBzZXQgb2YgY2hhaW5lZCBGREIncyAqLworCisgICAgICAgIGNtZmRiaSgmc3csICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgRkRCIC0gY29tbWFuZCBzd2l0Y2hlcyAqLworICAgICAgICAgICAgICAgX0NNS0VZLCAgICAgICAgICAgICAgICAgIC8qIGZjb2RlICovCisgICAgICAgICAgICAgICB0bXBobHAsICAgICAgICAgICAgICAgICAgLyogaGxwbXNnICovCisgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCAobm9uZSkgKi8KKyAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAgICAga3JiX3NfbiwgICAgICAgICAgICAgICAgIC8qIFN3aXRjaCB0YWJsZSBzaXplICovCisgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworICAgICAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgIGtyYl9zX3RibCwgICAgICAgICAgICAgICAvKiBTd2l0Y2ggdGFibGUgKi8KKyAgICAgICAgICAgICAgICZrdyAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgICAgICAgICApOworICAgICAgICBjbWZkYmkoJmt3LCAgICAgICAgICAgICAgICAgICAgIC8qIFNlY29uZCBGREIgLSBhY3Rpb24ga2V5d29yZHMgKi8KKyAgICAgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAgICAgIktlcmJlcm9zIGFjdGlvbiIsICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgKG5vbmUpICovCisgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICAgICAgICAgIGtyYl9hX24sICAgICAgICAgICAgICAgICAvKiBTd2l0Y2ggdGFibGUgc2l6ZSAqLworICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bSBkYXRhICgwID0gTk9UIHN3aXRjaCkgKi8KKyAgICAgICAgICAgICAgIHh4c3RyaW5nLCAgICAgICAgICAgICAgICAvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICBrcmJfYV90YmwsICAgICAgICAgICAgICAgLyogS2V5d29yZCB0YWJsZSAqLworICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKG5vbmUpICovCisgICAgICAgICAgICAgICApOworCisgICAgICAgIC8qIFBhcnNlICovCisKKyAgICAgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAvKiBQYXJzZSAwIG9yIG1vcmUgc3dpdGNoZXMgKi8KKyAgICAgICAgICAgIHJjID0gY21mZGIoJnN3KTsgICAgICAgICAgICAvKiBQYXJzZSBzb21ldGhpbmcgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImtlcmJlcm9zIGNtZmRiIDEgcmMiLCIiLHJjKTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICAgICAgaWYgKHJjID09IC0zKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/QWN0aW9uIG5vdCBzcGVjaWZpZWQgLSBub3RoaW5nIGhhcHBlbnMuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4ocmMpOyAgICAgICAgICAgICAvKiBvciByZXBhcnNlIG5lZWRlZCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNtcmVzdWx0LmZkYmFkZHIgIT0gJnN3KSAvKiBCcmVhayBvdXQgaWYgbm90IGEgc3dpdGNoICovCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYyA9IGNtZ2JyaygpOyAgICAgICAgICAgICAgIC8qIEhhdmUgc3dpdGNoIC0gZ2V0IGJyZWFrIGNoYXJhY3RlciAqLworICAgICAgICAgICAgZ2V0dmFsID0gKGMgPT0gJzonIHx8IGMgPT0gJz0nKTsgLyogTXVzdCBwYXJzZSBhbiBhZ3VtZW50PyAqLworICAgICAgICAgICAgaWYgKGdldHZhbCAmJiAhKGNtcmVzdWx0LmtmbGFncyAmIENNX0FSRykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFyZ3VtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsgICAgICAgICAgICAgLyogT0sgYmVjYXVzZSBub3RoaW5nIG1hbGxvYydkIHlldCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFnZXR2YWwgJiYgKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IGNtcmVzdWx0Lm5yZXN1bHQ7ICAgICAgIC8qIE51bWVyaWMgcmVzdWx0ID0gc3dpdGNoIHZhbHVlICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJrZXJiZXJvcyBjb21tYW5kIHN3aXRjaCIsIiIsbik7CisKKyAgICAgICAgICAgIHN3aXRjaCAobikgeyAgICAgICAgICAgICAgICAvKiBIYW5kbGUgdGhlIHN3aXRjaCAqLworICAgICAgICAgICAgICBjYXNlIEtSQl9TX0NBOiAgICAgICAgICAgIC8qIC9DQUNIRTo8ZmlsZW5hbWU+ICovCisgICAgICAgICAgICAgICAgcCA9IGtyYjVfZF9jYyA/IGtyYjVfZF9jYyA6ICIiOworICAgICAgICAgICAgICAgIGlmICgoeSA9IGNtb2ZpKCJOYW1lIG9mIGNhY2hlIGZpbGUiLHAsJnMseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHkgPT0gLTMpCisgICAgICAgICAgICAgICAgICAgICAgcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1ha2VzdHIoJnRtcGNhY2hlLHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByaW50ZigiP1VuZXhwZWN0ZWQgc3dpdGNoIHZhbHVlIC0gaW50ZXJuYWwgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIHJldHVybigtOSk7ICAgICAgICAgICAgIC8qIChpZikgbm90aGluZyBtYWxsb2MnZCB5ZXQuICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcmVzdWx0LmZkYmFkZHIgIT0gJmt3KSB7ICAvKiBDaGVja2luZy4uLiAqLworICAgICAgICAgICAgcHJpbnRmKCI/VW5leHBlY3RlZCByZXN1bHQgLSBpbnRlcm5hbCBlcnJvclxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOyAgICAgICAgICAgICAgICAgLyogTm90aGluZyBtYWxsb2MnZCB5ZXQuICovCisgICAgICAgIH0KKyAgICAgICAgbiA9IGNtcmVzdWx0Lm5yZXN1bHQ7ICAgICAgICAgICAvKiBHZXQga2V5d29yZCB2YWx1ZSAqLworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiP1VuZXhwZWN0ZWQgS2VyYmVyb3MgdmVyc2lvbiAtIEludGVybmFsIGVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisgICAgZGVidWcoRjEwMSwia2VyYmVyb3MgYWN0aW9uIiwiIixuKTsKKyAgICBzd2l0Y2ggKG4pIHsKKyAgICAgIGNhc2UgS1JCX0FfSU46ICAgICAgICAgICAgICAgICAgICAvKiBJTklUSUFMSVpFICovCisgICAgICBjYXNlIEtSQl9BX0RFOiAgICAgICAgICAgICAgICAgICAgLyogREVTVFJPWSAqLworICAgICAgY2FzZSBLUkJfQV9MQzogICAgICAgICAgICAgICAgICAgIC8qIExJU1QtQ1JFREVOVElBTFMgKi8KKyAgICAgICAgdG1wX2FjdGlvbiA9IG47ICAgICAgICAgICAgICAgICAvKiBPSywgc2V0ICovCisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBPSywgcHVudC4gKi8KKyAgICAgICAgcHJpbnRmKCI/VW5leHBlY3RlZCBhY3Rpb24gLSBpbnRlcm5hbCBlcnJvclxuIik7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIGlmICh0bXBfYWN0aW9uID09IEtSQl9BX0lOKSB7ICAgICAgIC8qIEFjdGlvbiBpcyBJTklUSUFMSVpFICovCisgICAgICAgIGludCB4OworICAgICAgICBjbWZkYmkoJnN3LCAgICAgICAgICAgICAgICAgICAgIC8qIElOSVRJQUxJWkUgc3dpdGNoZXMgKi8KKyAgICAgICAgICAgICAgIF9DTUtFWSwgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAgICAgIlByaW5jaXBhbCxcbiBvciBvcHRpb25hbCBJTklUSUFMSVpFIHN3aXRjaChlcykiLCAvKiBobHBtc2cgKi8KKyAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IChub25lKSAqLworICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIHN0cmluZyBkYXRhICovCisgICAgICAgICAgICAgICBrdiA9PSA0ID8gIGtyYjRfaV9uIDoga3JiNV9pX24sIC8qIFN3aXRjaCB0YWJsZSBzaXplICovCisgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworICAgICAgICAgICAgICAgeHhzdHJpbmcsICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgIGt2ID09IDQgPyAga3JiNF9pX3RibCA6IGtyYjVfaV90YmwsICAgICAgLyogU3dpdGNoIHRhYmxlICovCisgICAgICAgICAgICAgICAmZmwgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICAgICAgICAgKTsKKyAgICAgICAgY21mZGJpKCZmbCwgICAgICAgICAgICAgICAgICAgICAvKiAzcmQgRkRCIC0gY29tbWFuZCB0byBzZW5kIGZyb20gKi8KKyAgICAgICAgICAgICAgIF9DTUZMRCwgICAgICAgICAgICAgICAgICAvKiBmY29kZSAqLworICAgICAgICAgICAgICAgIlByaW5jaXBhbCIsICAgICAgICAgICAgIC8qIGhscG1zZyAqLworICAgICAgICAgICAgICAga3YgPT0gNCA/IGtyYjRfZF9wcmluY2lwYWwgOiBrcmI1X2RfcHJpbmNpcGFsLCAvKiBwcmluY2lwYWwgKi8KKyAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKyAgICAgICAgICAgICAgIHh4c3RyaW5nLAorICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICk7CisgICAgICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgICAgICAgICAgLyogUGFyc2UgSU5JVCBzd2l0Y2hlcyBvciBwcmluY2lwYWwgKi8KKyAgICAgICAgICAgIHJjID0gY21mZGIoJnN3KTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImtlcmJlcm9zIGNtZmRiIDIgcmMiLCIiLHJjKTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gLTMpCisgICAgICAgICAgICAgICAgICBwcmludGYoIj9QcmluY2lwYWwgbmFtZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBrZXJieDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImtlcmJlcm9zIGNtZmRiIDIgZmNvZGUiLCIiLGNtcmVzdWx0LmZjb2RlKTsKKyAgICAgICAgICAgIGlmIChjbXJlc3VsdC5mY29kZSAhPSBfQ01LRVkpIC8qIE5vdCBhIHN3aXRjaCwgcXVpdCBzd2l0Y2ggbG9vcCAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGMgPSBjbWdicmsoKTsgICAgICAgICAgICAgICAvKiBTd2l0Y2ggLSBnZXQgYnJlYWsgY2hhcmFjdGVyICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJrZXJiZXJvcyBjbWZkYiAyIGNtZ2JyayIsIiIsYyk7CisgICAgICAgICAgICBnZXR2YWwgPSAoYyA9PSAnOicgfHwgYyA9PSAnPScpOworICAgICAgICAgICAgaWYgKGdldHZhbCAmJiAhKGNtcmVzdWx0LmtmbGFncyAmIENNX0FSRykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFyZ3VtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKC05KTsgICAgICAgICAgICAgLyogT0sgYmVjYXVzZSBub3RoaW5nIG1hbGxvYydkIHlldCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFnZXR2YWwgJiYgKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IGNtcmVzdWx0Lm5yZXN1bHQ7ICAgICAgIC8qIE51bWVyaWMgcmVzdWx0ID0gc3dpdGNoIHZhbHVlICovCisgICAgICAgICAgICBzd2l0Y2ggKG4pIHsKKyAgICAgICAgICAgICAgLyogVGhlc2UgZG9uJ3QgdGFrZSBhcmdzLi4uICovCisgICAgICAgICAgICAgIGNhc2UgS1JCX0lfUEE6ICAgICAgICAgICAgLyogL1BSRUFVVEggKi8KKyAgICAgICAgICAgICAgY2FzZSBLUkJfSV9GVzogICAgICAgICAgICAvKiAvRk9SV0FSREFCTEUgKi8KKyAgICAgICAgICAgICAgY2FzZSBLUkJfSV9QUjogICAgICAgICAgICAvKiAvUFJPWElBQkxFICovCisgICAgICAgICAgICAgIGNhc2UgS1JCX0lfUk46ICAgICAgICAgICAgLyogL1JFTkVXICovCisgICAgICAgICAgICAgIGNhc2UgS1JCX0lfVkE6ICAgICAgICAgICAgLyogL1ZBTElEQVRFICovCisgICAgICAgICAgICAgIGNhc2UgS1JCX0lfTlBBOiAgICAgICAgICAgLyogL05PVC1QUkVBVVRIICovCisgICAgICAgICAgICAgIGNhc2UgS1JCX0lfTkZXOiAgICAgICAgICAgLyogL05PVC1GT1JXQVJEQUJMRSAqLworICAgICAgICAgICAgICBjYXNlIEtSQl9JX05QUjogICAgICAgICAgIC8qIC9OT1QtUFJPWElBQkxFICovCisgICAgICAgICAgICAgIGNhc2UgS1JCX0lfVkI6ICAgICAgICAgICAgLyogL1ZFUkJPU0UgKi8KKyAgICAgICAgICAgICAgY2FzZSBLUkJfSV9CUjogICAgICAgICAgICAvKiAvQlJJRUYgKi8KKyAgICAgICAgICAgICAgY2FzZSBLUkJfSV9LNDogICAgICAgICAgICAvKiAvS0VSQkVST1M0ICovCisgICAgICAgICAgICAgIGNhc2UgS1JCX0lfTks0OiAgICAgICAgICAgLyogL05PLUtFUkJFUk9TNCAqLworICAgICAgICAgICAgICBjYXNlIEtSQl9JX1BPUDogICAgICAgICAgIC8qIC9QT1BVUCAqLworICAgICAgICAgICAgICBjYXNlIEtSQl9JX05BRDogICAgICAgICAgIC8qIC9OTy1BRERSRVNTRVMgKi8KKyAgICAgICAgICAgICAgICBpZiAoZ2V0dmFsKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIGRvZXMgbm90IHRha2UgYSB2YWx1ZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJjID0gLTk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8ga2VyYng7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAobikgeworICAgICAgICAgICAgICAgICAgY2FzZSBLUkJfSV9OUEE6CisgICAgICAgICAgICAgICAgICAgIHB2W0tSQl9JX1BBXS5pdmFsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIEtSQl9JX05GVzoKKyAgICAgICAgICAgICAgICAgICAgcHZbS1JCX0lfRlddLml2YWwgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgS1JCX0lfTlBSOgorICAgICAgICAgICAgICAgICAgICBwdltLUkJfSV9QUl0uaXZhbCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBLUkJfSV9WQjoKKyAgICAgICAgICAgICAgICAgICAgcHZbS1JCX0lfQlJdLml2YWwgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgS1JCX0lfTks0OgorICAgICAgICAgICAgICAgICAgICBwdltLUkJfSV9LNF0uaXZhbCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcHZbbl0uaXZhbCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyogVGhlc2UgZG8gdGFrZSBhcmd1bWVudHMgKi8KKworICAgICAgICAgICAgICBjYXNlIEtSQl9JX1JCOiAgICAgICAgICAgIC8qIC9SRU5FV0FCTEU6PG1pbnV0ZXM+ICovCisgICAgICAgICAgICAgICAgcHZbbl0uaXZhbCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICgocmMgPSBjbW51bSgiTWludXRlcyIsY2tpdG9hKGtyYjVfaW5pdC5yZW5ld2FibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwmeSwgeHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICBnb3RvIGtlcmJ4OworICAgICAgICAgICAgICAgIHB2W25dLml2YWwgPSB5OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgS1JCX0lfTEY6ICAgICAgICAgICAgLyogL0xJRkVUSU1FOjxtaW51dGVzPiAqLworICAgICAgICAgICAgICAgIHB2W25dLml2YWwgPSAwOworICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgaXMgcHJldmlvdXMgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcGJ1ZiwiJWQiLCAgICAvKiBTQUZFICovCisgICAgICAgICAgICAgICAgICAgICAgICBrdiA9PSA0ID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGtyYjRfaW5pdC5saWZldGltZSA6CisgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2luaXQubGlmZXRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICgocmMgPSBjbW51bSgiTWludXRlcyIsdG1wYnVmLDEwLCZ5LCB4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgIGdvdG8ga2VyYng7CisgICAgICAgICAgICAgICAgcHZbbl0uaXZhbCA9IHk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBLUkJfSV9QRDogICAgICAgICAgICAvKiAvUE9TVERBVEU6PHRpbWVzdGFtcD4gKi8KKyAgICAgICAgICAgICAgICBpZiAocHZbbl0uc3ZhbCkgeworICAgICAgICAgICAgICAgICAgICBmcmVlKHB2W25dLnN2YWwpOworICAgICAgICAgICAgICAgICAgICBwdltuXS5zdmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICgocmMgPSBjbWRhdGUoImRhdGUtdGltZSIsIiIsJnMsMCx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgIGdvdG8ga2VyYng7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmKHB2W25dLnN2YWwpLHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgS1JCX0lfU1I6ICAgICAgICAgICAgLyogL1NFUlZJQ0U6PG5hbWU+ICovCisgICAgICAgICAgICAgICAgaWYgKHB2W25dLnN2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwdltuXS5zdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgcHZbbl0uc3ZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoKHJjID0gY21mbGQoIlNlcnZpY2UtbmFtZSIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICBnb3RvIGtlcmJ4OworICAgICAgICAgICAgICAgIG1ha2VzdHIoJihwdltuXS5zdmFsKSxzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIEtSQl9JX1JMOiAgICAgICAgICAgIC8qIC9SRUFMTTo8bmFtZT4gKi8KKyAgICAgICAgICAgICAgICBpZiAocHZbbl0uc3ZhbCkgeworICAgICAgICAgICAgICAgICAgICBmcmVlKHB2W25dLnN2YWwpOworICAgICAgICAgICAgICAgICAgICBwdltuXS5zdmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChrdiA9PSA0KQorICAgICAgICAgICAgICAgICAgcCA9IGtyYjRfZF9yZWFsbSA/IGtyYjRfZF9yZWFsbSA6ICIiOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHAgPSBrcmI1X2RfcmVhbG0gPyBrcmI1X2RfcmVhbG0gOiAiIjsKKyAgICAgICAgICAgICAgICBpZiAoKHJjID0gY21mbGQoIlJlYWxtIixwLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgICAgICAgZ290byBrZXJieDsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCYocHZbbl0uc3ZhbCkscyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBLUkJfSV9JTjogICAgICAgICAgICAvKiAvSU5TVEFOQ0U6PG5hbWU+ICovCisgICAgICAgICAgICAgICAgaWYgKHB2W25dLnN2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwdltuXS5zdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgcHZbbl0uc3ZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoa3YgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgcCA9IGtyYjRfZF9pbnN0YW5jZSA/IGtyYjRfZF9pbnN0YW5jZSA6ICIiOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcCA9IGtyYjVfZF9pbnN0YW5jZSA/IGtyYjVfZF9pbnN0YW5jZSA6ICIiOworICAgICAgICAgICAgICAgIGlmICgocmMgPSBjbWZsZCgiSW5zdGFuY2UiLHAsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICBnb3RvIGtlcmJ4OworICAgICAgICAgICAgICAgIG1ha2VzdHIoJihwdltuXS5zdmFsKSxzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIEtSQl9JX1BXOiAgICAgICAgICAgIC8qIC9QQVNTV09SRDo8cGFzc3dvcmQ+ICovCisgICAgICAgICAgICAgICAgZGVib2sgPSAwOworICAgICAgICAgICAgICAgIGlmIChwdltuXS5zdmFsKSB7CisgICAgICAgICAgICAgICAgICAgIGZyZWUocHZbbl0uc3ZhbCk7CisgICAgICAgICAgICAgICAgICAgIHB2W25dLnN2YWwgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKChyYyA9IGNtZmxkKCJQYXNzd29yZCIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gLTMpCisgICAgICAgICAgICAgICAgICAgIGdvdG8ga2VyYng7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmKHB2W25dLnN2YWwpLHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgS1JCX0lfQURSOiAgICAgICAgICAgLyogL0FERFJFU1NFUzp7PGFkZHJlc3MtbGlzdD59ICovCisgICAgICAgICAgICAgICAgaWYgKHB2W25dLnN2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwdltuXS5zdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgcHZbbl0uc3ZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZ2V0dmFsKSBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoKHJjID0gY21mbGQoIkxpc3Qgb2YgSVAgYWRkcmVzc2VzIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgIGdvdG8ga2VyYng7CisgICAgICAgICAgICAgICAgbWFrZWxpc3Qocyx0bXBhZGRycyxLUkI1X05VTV9PRl9BRERSUyk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEtSQjVfTlVNX09GX0FERFJTICYmIHRtcGFkZHJzW2ldOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZXRfYWRkcih0bXBhZGRyc1tpXSkgPT0gMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbnZhbGlkIGlwIGFkZHJlc3M6ICVzXG4iLHRtcGFkZHJzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gLTk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGtlcmJ4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB2W0tSQl9JX05BRF0uaXZhbCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmludGYoIj9VbmV4cGVjdGVkIHN3aXRjaCB2YWx1ZSAtIGludGVybmFsIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICByYyA9IC05OworICAgICAgICAgICAgICAgIGdvdG8ga2VyYng7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUZMRCkgeworICAgICAgICAgICAgcHJpbnRmKCI/VW5leGVjdGVkIHJlc3VsdCAtIGludGVybmFsIGVycm9yXG4iKTsKKyAgICAgICAgICAgIHJjID0gLTk7CisgICAgICAgICAgICBnb3RvIGtlcmJ4OworICAgICAgICB9CisgICAgICAgIC8qIGNtcmVzdWx0LnNyZXN1bHQgbWF5IGJlIG9mIHRoZSBmb3JtIFBSSU5DSVBBTEBSRUFMTSAqLworICAgICAgICBpID0gY2tpbmRleCgiQCIsY21yZXN1bHQuc3Jlc3VsdCwwLDAsMCk7CisgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgIG1ha2VzdHIoJnRtcHJlYWxtLCZjbXJlc3VsdC5zcmVzdWx0W2ldKTsKKyAgICAgICAgICAgIGNtcmVzdWx0LnNyZXN1bHRbaS0xXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgICAgbWFrZXN0cigmdG1wcHJpbnosY21yZXN1bHQuc3Jlc3VsdCk7IC8qIFByaW5jaXBhbCAodXNlcikgKi8KKworICAgICAgICBpZiAoKHJjID0gY21jZm0oKSkgPCAwKSB7ICAgICAgIC8qIE5vdyBnZXQgY29uZmlybWF0aW9uICovCisgICAgICAgICAgICBpZiAocmMgPT0gLTMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj9QcmluY2lwYWwgbmFtZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGtlcmJ4OworICAgICAgICB9CisgICAgICAgIGlmICghdG1wcHJpbnogfHwgIXRtcHByaW56WzBdKSB7CisgICAgICAgICAgICBwcmludGYoIj9QcmluY2lwYWwgbmFtZSByZXF1aXJlZFxuIik7CisgICAgICAgICAgICBnb3RvIGtlcmJ4OworICAgICAgICB9CisgICAgICAgIGlmICghcHZbS1JCX0lfUk5dLml2YWwgJiYgIXB2W0tSQl9JX1ZBXS5pdmFsKSB7CisgICAgICAgICAgICAvKiBEb24ndCB1c2UgYSBwYXNzd29yZCBpZiBWYWxpZGF0aW5nIG9yIFJlbmV3aW5nICovCisgICAgICAgICAgICBpZiAocHZbS1JCX0lfUFddLnN2YWwpIHsgICAgLyogSWYgdGhleSBnYXZlIGEgL1BBU1NXT1JEIHN3aXRjaCAqLworICAgICAgICAgICAgICAgIG1ha2VzdHIoJnRtcHBzd2QscHZbS1JCX0lfUFddLnN2YWwpOyAvKiB1c2UgdGhpcyB2YWx1ZSAqLworICAgICAgICAgICAgfQorI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIC8qIFBhc3N3b3JkIHByb21wdGluZyBoYXMgYmVlbiBtb3ZlZCB0byBja19rcmJbNDVdX2luaXRUR1QoKSAqLworICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSBtdXN0IHByb21wdCBmb3IgaXQgKi8KKyAgICAgICAgICAgICAgICBjaGFyIHBybXB0WzgwXTsKKyAgICAgICAgICAgICAgICBpZiAocHZbS1JCX0lfUkxdLnN2YWwpCisgICAgICAgICAgICAgICAgICBzcHJpbnRmKHBybXB0LCIlc0AlcydzIFBhc3N3b3JkOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBwcmlueixwdltLUkJfSV9STF0uc3ZhbCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodG1wcmVhbG0pCisgICAgICAgICAgICAgICAgICBzcHJpbnRmKHBybXB0LCIlc0AlcydzIFBhc3N3b3JkOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBwcmlueix0bXByZWFsbSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc3ByaW50Zihwcm1wdCwiJXMncyBQYXNzd29yZDogIix0bXBwcmlueik7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgaWYgKHB2W0tSQl9JX1BPUF0uaXZhbCkgeworICAgICAgICAgICAgICAgICAgICBjaGFyIHBhc3N3ZFs4MF09IiI7CisgICAgICAgICAgICAgICAgICAgIHJlYWRwYXNzKHBybXB0LHBhc3N3ZCw4MCk7CisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnRtcHBzd2QscGFzc3dkKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBhc3N3ZCwwLDgwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICB7CisjaWZkZWYgQ0tfUkVDQUxMCisgICAgICAgICAgICAgICAgICAgIG9uX3JlY2FsbCA9IDA7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisgICAgICAgICAgICAgICAgICAgIGNtc2F2cChwc2F2ZSxQUk9NUFRMKTsgLyogU2F2ZSBvbGQgcHJvbXB0ICovCisgICAgICAgICAgICAgICAgICAgIGNtc2V0cChwcm1wdCk7ICAgICAgLyogTWFrZSBuZXcgcHJvbXB0ICovCisgICAgICAgICAgICAgICAgICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7IC8qIFB1dCBjb25zb2xlIGluIGNicmVhayBtb2RlICovCisgICAgICAgICAgICAgICAgICAgIGNtaW5pKDApOyAgICAgICAgICAgLyogYW5kIG5vLWVjaG8gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAvKiBJc3N1ZSBwcm9tcHQgaWYgYXQgdG9wIGxldmVsICovCisgICAgICAgICAgICAgICAgICAgIGlmIChwZmxhZykgcHJvbXB0KHh4c3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgY21yZXMoKTsgICAgICAgICAgICAvKiBSZXNldCB0aGUgcGFyc2VyICovCisgICAgICAgICAgICAgICAgICAgIGZvciAocmMgPSAtMTsgcmMgPCAwOyApIHsgLyogUHJvbXB0IHRpbGwgdGhleSBhbnN3ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBhIGxpdGVyYWwgbGluZSBvZiB0ZXh0ICovCisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IGNtdHh0KCIiLCIiLCZzLE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgY21yZXMoKTsgICAgICAgIC8qIFJlc2V0IHRoZSBwYXJzZXIgYWdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZ0bXBwc3dkLHMpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7ICAgICAgIC8qIEVjaG8gYSBDUkxGICovCisgICAgICAgICAgICAgICAgICAgIGNtc2V0cChwc2F2ZSk7ICAgICAgLyogUmVzdG9yZSBvcmlnaW5hbCBwcm9tcHQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIHBhc3N3b3JkICovCisgICAgICAgICAgICBpZiAodG1wcHN3ZCkKKyAgICAgICAgICAgICAgaWYgKCp0bXBwc3dkKQorICAgICAgICAgICAgICAgIHggPSAxOworICAgICAgICAgICAgaWYgKCF4KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/UGFzc3dvcmQgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8ga2VyYng7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrdiA9PSA1ICYmIHRtcF9hY3Rpb24gPT0gS1JCX0FfTEMpIHsgLyogTElTVC1DUkVERU5USUFMUyAqLworICAgICAgICB0bXBfa2xjID0gMDsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGlmICgoeCA9IGNta2V5KGtsY3RhYixua2xjdGFiLCJTd2l0Y2giLCIiLHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gLTMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyYyA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGtlcmJ4OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSB4OworICAgICAgICAgICAgICAgICAgICBnb3RvIGtlcmJ4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRtcF9rbGMgfD0geDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKHJjID0gY21jZm0oKSkgPCAwKSAgICAgIC8qIERFU1RST1ksIGp1c3QgY29uZmlybSAqLworICAgICAgICBnb3RvIGtlcmJ4OworCisvKiBEb25lIC0gTW92ZSBjb25maXJtZWQgZGF0YSB0byBmaW5hbCBsb2NhdGlvbnMgKi8KKworICAgIGtyYl9hY3Rpb24gPSB0bXBfYWN0aW9uOyAgICAgICAgICAgIC8qIEFjdGlvbiByZXF1ZXN0ZWQgKi8KKyAgICBrcmJfb3AudmVyc2lvbiA9IGt2OyAgICAgICAgICAgICAgICAvKiBLZXJiZXJvcyB2ZXJzaW9uICovCisgICAga3JiX29wLmNhY2hlID0gdG1wY2FjaGU7ICAgICAgICAgICAgLyogQ2FjaGUgZmlsZSAqLworICAgIHRtcGNhY2hlID0gTlVMTDsgICAgICAgICAgICAgICAgICAgIC8qIFNvIHdlIGRvbid0IGZyZWUgaXQgKi8KKworICAgIHN3aXRjaCAoa3JiX2FjdGlvbikgeworICAgICAgY2FzZSBLUkJfQV9JTjogICAgICAgICAgICAgICAgICAgIC8qIElOSVRJQUxJWkUgKi8KKyAgICAgICAgaWYgKGt2ID09IDUpIHsKKyAgICAgICAgICAgIGtyYjVfaW5pdC5mb3J3YXJkYWJsZSA9IHB2W0tSQl9JX0ZXXS5pdmFsOworICAgICAgICAgICAga3JiNV9pbml0LnByb3hpYWJsZSAgID0gcHZbS1JCX0lfUFJdLml2YWw7CisgICAgICAgICAgICBrcmI1X2luaXQubGlmZXRpbWUgICAgPSBwdltLUkJfSV9MRl0uaXZhbDsKKyAgICAgICAgICAgIGtyYjVfaW5pdC5yZW5ldyAgICAgICA9IHB2W0tSQl9JX1JOXS5pdmFsOworICAgICAgICAgICAga3JiNV9pbml0LnJlbmV3YWJsZSAgID0gcHZbS1JCX0lfUkJdLml2YWw7CisgICAgICAgICAgICBrcmI1X2luaXQudmFsaWRhdGUgICAgPSBwdltLUkJfSV9WQV0uaXZhbDsKKworICAgICAgICAgICAgLyogSGVyZSB3ZSBqdXN0IHJlYXNzaWduIHRoZSBwb2ludGVycyBhbmQgdGhlbiBzZXQgdGhlbSB0byBOVUxMICovCisgICAgICAgICAgICAvKiBzbyB0aGV5IHdvbid0IGJlIGZyZWVkIGJlbG93LiAqLworCisgICAgICAgICAgICBrcmI1X2luaXQucG9zdGRhdGUgPSBwdltLUkJfSV9QRF0uc3ZhbDsgcHZbS1JCX0lfUERdLnN2YWwgPSBOVUxMOworICAgICAgICAgICAga3JiNV9pbml0LnNlcnZpY2UgID0gcHZbS1JCX0lfU1JdLnN2YWw7IHB2W0tSQl9JX1NSXS5zdmFsID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChwdltLUkJfSV9STF0uc3ZhbCkgeworICAgICAgICAgICAgICAgIGtyYjVfaW5pdC5yZWFsbSAgPSBwdltLUkJfSV9STF0uc3ZhbDsgcHZbS1JCX0lfUkxdLnN2YWwgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIGlmICh0bXByZWFsbSkgeworICAgICAgICAgICAgICAgIGtyYjVfaW5pdC5yZWFsbSA9IHRtcHJlYWxtOyB0bXByZWFsbSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHZbS1JCX0lfSU5dLnN2YWwpIHsKKyAgICAgICAgICAgICAgICBrcmI1X2luaXQuaW5zdGFuY2UgPSBwdltLUkJfSV9JTl0uc3ZhbDsKKyAgICAgICAgICAgICAgICBwdltLUkJfSV9JTl0uc3ZhbCA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCB0bXBpbnN0ICkgeworICAgICAgICAgICAgICAgIGtyYjVfaW5pdC5pbnN0YW5jZSA9IHRtcGluc3Q7CisgICAgICAgICAgICAgICAgdG1waW5zdCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG1wcHJpbnopIHsKKyAgICAgICAgICAgICAgICBrcmI1X2luaXQucHJpbmNpcGFsID0gdG1wcHJpbno7CisgICAgICAgICAgICAgICAgdG1wcHJpbnogPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAga3JiNV9pbml0LnBhc3N3b3JkID0gdG1wcHN3ZDsKKyAgICAgICAgICAgIHRtcHBzd2QgPSBOVUxMOworCisgICAgICAgICAgICBrcmI1X2luaXQuZ2V0azQgPSBwdltLUkJfSV9LNF0uaXZhbDsKKyAgICAgICAgICAgIGlmIChrcmI1X2luaXQuZ2V0azQpIHsKKyAgICAgICAgICAgICAgICBrcmI0X2luaXQubGlmZXRpbWUgPSBwdltLUkJfSV9MRl0uaXZhbDsKKyAgICAgICAgICAgICAgICBpZiAoa3JiNV9pbml0LnJlYWxtKQorICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZrcmI0X2luaXQucmVhbG0sa3JiNV9pbml0LnJlYWxtKTsKKyAgICAgICAgICAgICAgICBrcmI0X2luaXQucHJlYXV0aCAgPSBrcmI0X2RfcHJlYXV0aDsKKyAgICAgICAgICAgICAgICBrcmI0X2luaXQudmVyYm9zZSAgPSBwdltLUkJfSV9CUl0uaXZhbCA/IDAgOiAxOworICAgICAgICAgICAgICAgIGlmIChrcmI1X2luaXQucHJpbmNpcGFsKQorICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZrcmI0X2luaXQucHJpbmNpcGFsLGtyYjVfaW5pdC5wcmluY2lwYWwpOworICAgICAgICAgICAgICAgIGlmIChrcmI1X2luaXQucHJpbmNpcGFsKQorICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZrcmI0X2luaXQucGFzc3dvcmQsa3JiNV9pbml0LnBhc3N3b3JkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtyYjVfaW5pdC5ub19hZGRyZXNzZXMgPSBwdltLUkJfSV9OQURdLml2YWw7CisgICAgICAgICAgICBpZiAodG1wYWRkcnNbMF0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgS1JCNV9OVU1fT0ZfQUREUlM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoa3JiNV9pbml0LmFkZHJzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGtyYjVfaW5pdC5hZGRyc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2luaXQuYWRkcnNbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGtyYjVfaW5pdC5hZGRyc1tpXSA9IHRtcGFkZHJzW2ldOworICAgICAgICAgICAgICAgICAgICB0bXBhZGRyc1tpXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGt2ID09IDQpIHsgICAgICAgICAgIC8qIFNhbWUgZGVhbCBmb3IgS2VyYmVyb3MgNCAqLworICAgICAgICAgICAga3JiNF9pbml0LmxpZmV0aW1lID0gcHZbS1JCX0lfTEZdLml2YWw7CisgICAgICAgICAgICBpZiAocHZbS1JCX0lfUkxdLnN2YWwpIHsKKyAgICAgICAgICAgICAgICBrcmI0X2luaXQucmVhbG0gID0gcHZbS1JCX0lfUkxdLnN2YWw7CisgICAgICAgICAgICAgICAgcHZbS1JCX0lfUkxdLnN2YWwgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIGlmICggdG1wcmVhbG0gKSB7CisgICAgICAgICAgICAgICAga3JiNF9pbml0LnJlYWxtICA9IHRtcHJlYWxtOworICAgICAgICAgICAgICAgIHRtcHJlYWxtID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwdltLUkJfSV9JTl0uc3ZhbCkgeworICAgICAgICAgICAgICAgIGtyYjRfaW5pdC5pbnN0YW5jZSA9IHB2W0tSQl9JX0lOXS5zdmFsOworICAgICAgICAgICAgICAgIHB2W0tSQl9JX0lOXS5zdmFsID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHRtcGluc3QgKSB7CisgICAgICAgICAgICAgICAga3JiNF9pbml0Lmluc3RhbmNlID0gdG1waW5zdDsKKyAgICAgICAgICAgICAgICB0bXBpbnN0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtyYjRfaW5pdC5wcmVhdXRoICA9IHB2W0tSQl9JX1BBXS5pdmFsOworICAgICAgICAgICAga3JiNF9pbml0LnZlcmJvc2UgID0gcHZbS1JCX0lfQlJdLml2YWwgPyAwIDogMTsKKworICAgICAgICAgICAgaWYgKHRtcHByaW56KSB7CisgICAgICAgICAgICAgICAga3JiNF9pbml0LnByaW5jaXBhbCA9IHRtcHByaW56OworICAgICAgICAgICAgICAgIHRtcHByaW56ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtyYjRfaW5pdC5wYXNzd29yZCA9IHRtcHBzd2Q7CisgICAgICAgICAgICB0bXBwc3dkID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgS1JCX0FfTEM6ICAgICAgICAgICAgICAgICAgICAvKiBMaXN0IENyZWRlbnRpYWxzICovCisgICAgICAgIGtyYjVfbGMuZW5jcnlwdGlvbiA9IHRtcF9rbGMgJiBYWUtMQ0VOOworICAgICAgICBrcmI1X2xjLmZsYWdzID0gdG1wX2tsYyAmIFhZS0xDRkw7CisgICAgICAgIGtyYjVfbGMuYWRkciAgPSB0bXBfa2xjICYgWFlLTENBRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisvKiBDb21tb24gZXhpdCAtIEZyZWUgdGVtcG9yYXJ5IHN0b3JhZ2UgKi8KKworICBrZXJieDoKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEtSQl9JX01BWDsgaSsrKSB7ICAvKiBGcmVlIG1hbGxvYydkIHN3aXRjaCBkYXRhICovCisgICAgICAgIGlmIChwdltpXS5zdmFsKQorICAgICAgICAgIGZyZWUocHZbaV0uc3ZhbCk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBLUkI1X05VTV9PRl9BRERSUzsgaSsrKSB7CisgICAgICAgIGlmICh0bXBhZGRyc1tpXSkKKyAgICAgICAgICBmcmVlKHRtcGFkZHJzW2ldKTsKKyAgICB9CisgICAgaWYgKHRtcHByaW56KSBmcmVlKHRtcHByaW56KTsgICAgICAgLyogQW5kIHRoZXNlIHRvby4gKi8KKyAgICBpZiAodG1wcHN3ZCkgIGZyZWUodG1wcHN3ZCk7CisgICAgaWYgKHRtcGNhY2hlKSBmcmVlKHRtcGNhY2hlKTsKKyAgICBpZiAodG1wcmVhbG0pIGZyZWUodG1wcmVhbG0pOworICAgIGlmICh0bXBpbnN0KSAgZnJlZSh0bXBpbnN0KTsKKworICAgIHJldHVybihyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiB0aGUgcmV0dXJuIGNvZGUgKi8KK30KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCisjaWZkZWYgQ0tfTE9HSU4KK2ludAorI2lmZGVmIENLX0FOU0lDCitja3hsb2dpbihDSEFSICogdXNlcmlkLCBDSEFSICogcGFzc3dkLCBDSEFSICogYWNjdCwgaW50IHByb21wdG9rKQorI2Vsc2UgLyogQ0tfQU5TSUMgKi8KK2NreGxvZ2luKHVzZXJpZCwgcGFzc3dkLCBhY2N0LCBwcm9tcHRvaykKKyAgQ0hBUiAqIHVzZXJpZDsgQ0hBUiAqIHBhc3N3ZDsgQ0hBUiAqIGFjY3Q7IGludCBwcm9tcHRvazsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogY2t4bG9naW4gKi8geworI2lmZGVmIENLX1JFQ0FMTAorICAgIGV4dGVybiBpbnQgb25fcmVjYWxsOyAgICAgICAgICAgICAgIC8qIGFyb3VuZCBQYXNzd29yZCBwcm9tcHRpbmcgKi8KKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyNpZmRlZiBDS19QQU0KKyAgICBleHRlcm4gaW50IGd1ZXN0OworI2VuZGlmIC8qIENLX1BBTSAqLworICAgIGludCBycHJvbXB0ID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgcHJvbXB0ICovCisjaWZkZWYgQ0tTWVNMT0cKKyAgICBpbnQgc2F2bG9nOworI2VuZGlmIC8qIENLU1lTTE9HICovCisKKyAgICBleHRlcm4gaW50IHdoYXQsIHNydmNkbXNnOworCisgICAgaW50IHggPSAwLCBvayA9IDAsIHJjID0gMDsKKyAgICBDSEFSICogX3UgPSBOVUxMLCAqIF9wID0gTlVMTCwgKiBfYSA9IE5VTEw7CisKKyAgICBkZWJ1ZyhGMTExLCJja3hsb2dpbiB1c2VyaWQiLHVzZXJpZCxwcm9tcHRvayk7CisgICAgZGVidWcoRjExMCwiY2t4bG9naW4gcGFzc3dkIixwYXNzd2QsMCk7CisKKyAgICBpc2d1ZXN0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBHbG9iYWwgImFub255bW91cyIgZmxhZyAqLworCisgICAgaWYgKCF1c2VyaWQpIHVzZXJpZCA9IChDSEFSICopIiI7CisgICAgaWYgKCFwYXNzd2QpIHBhc3N3ZCA9IChDSEFSICopIiI7CisKKyAgICBkZWJ1ZyhGMTExLCJja3hsb2dpbiB1c2VyaWQiLHVzZXJpZCx3aGF0KTsKKworI2lmZGVmIENLX1JFQ0FMTAorICAgIG9uX3JlY2FsbCA9IDA7CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisKKyNpZmRlZiBDS1NZU0xPRworICAgIHNhdmxvZyA9IGNreHN5c2xvZzsgICAgICAgICAgICAgICAgIC8qIFNhdmUgYW5kIHR1cm4gb2ZmIHN5c2xvZ2dpbmcgKi8KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworCisgICAgaWYgKCghKnVzZXJpZCB8fCAhKnBhc3N3ZCkgJiYgICAgICAgLyogTmVlZCB0byBwcm9tcHQgZm9yIG1pc3NpbmcgaW5mbyAqLworICAgICAgICBwcm9tcHRvaykgeworICAgICAgICBjbXNhdnAocHNhdmUsUFJPTVBUTCk7ICAgICAgICAgIC8qIFNhdmUgb2xkIHByb21wdCAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJja3hsb2dpbiBzYXZlZCIscHNhdmUsMCk7CisgICAgICAgIHJwcm9tcHQgPSAxOworICAgIH0KKyAgICBpZiAoISp1c2VyaWQpIHsKKyAgICAgICAgaWYgKCFwcm9tcHRvaykKKyAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIGNtc2V0cCgiVXNlcm5hbWU6ICIpOyAgICAgICAgICAgLyogTWFrZSBuZXcgcHJvbXB0ICovCisgICAgICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7ICAgICAgICAgICAgLyogUHV0IGNvbnNvbGUgaW4gY2JyZWFrIG1vZGUgKi8KKyAgICAgICAgY21pbmkoMSk7CisKKy8qIEZsdXNoIHR5cGVhaGVhZCAqLworCisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICBkZWJ1ZyhGMTAxLAorICAgICAgICAgICAgICAiY2t4bG9naW4gVEVMT1BUX1NCKFRFTE9QVF9LRVJNSVQpLmtlcm1pdC5tZV9zdGFydCIsCisgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICBURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0CisgICAgICAgICAgICAgICk7CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCisgICAgICAgIHdoaWxlICh0dGNoaygpID4gMCkgeworICAgICAgICAgICAgeCA9IHR0aW5jKDApOworICAgICAgICAgICAgZGVidWcoRjEwMSwiY2t4bG9naW4gZmx1c2ggdXNlciB4IiwiIix4KTsKKyAgICAgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICAgICAgZG9leGl0KEdPT0RfRVhJVCwwKTsgICAgICAvKiBDb25uZWN0aW9uIGxvc3QgKi8KKyNpZmRlZiBUTkNPREUKKyAgICAgICAgICAgIGlmIChzc3RlbG5ldCkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IElBQykgeworICAgICAgICAgICAgICAgICAgICB4ID0gdG5fZG9vcCgoQ0hBUikoeCAmIDB4ZmYpLGNreGVjaCx0dGluYyk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImNreGxvZ2luIHVzZXIgdG5fZG9vcCIsIiIseCk7CisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLAorICAgICAgICAgICAgICAgICAgICAgICJja3hsb2dpbiB1c2VyIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgZ290byBYQ0tYTE9HOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IGNreGVjaCA9IDE7IGJyZWFrOyAvKiBUdXJuIG9uIGVjaG9pbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IGNreGVjaCA9IDA7IGJyZWFrOyAvKiBUdXJuIG9mZiBlY2hvaW5nICovCisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgIC8qIElLUyBldmVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgIC8qIGVsc2UgZmFsbCB0aHJ1Li4uICovCisjZW5kaWYgLyogSUtTX09QVElPTiAqLworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogICAgICAgICAgICAgICAgICAgIC8qIExvZ291dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBYQ0tYTE9HOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8qIFROQ09ERSAqLworICAgICAgICB9CisgICAgICAgIGlmIChwZmxhZykgcHJvbXB0KHh4c3RyaW5nKTsgICAgLyogSXNzdWUgcHJvbXB0IGlmIGF0IHRvcCBsZXZlbCAqLworICAgICAgICBjbXJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBwYXJzZXIgKi8KKyAgICAgICAgZm9yICh4ID0gLTE7IHggPCAwOykgeyAgICAgICAgICAvKiBQcm9tcHQgdGlsbCB0aGV5IGFuc3dlciAqLworICAgICAgICAgICAgLyogR2V0IGEgbGl0ZXJhbCBsaW5lIG9mIHRleHQgKi8KKyAgICAgICAgICAgIHg9Y210eHQoIllvdXIgdXNlcm5hbWUsIG9yIFwiZnRwXCIsIG9yIFwiYW5vbnltb3VzXCIiLCIiLCZzLE5VTEwpOworICAgICAgICAgICAgaWYgKHggPT0gLTQgfHwgeCA9PSAtMTApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxyXG4lc0xvZ2luIGNhbmNlbGxlZFxuIiwKKwkJICAgICAgIHggPT0gLTEwID8gIlRpbWVkIG91dDogIiA6ICIiKTsKKyNpZmRlZiBDS1NZU0xPRworICAgICAgICAgICAgICAgIGNreHN5c2xvZyA9IHNhdmxvZzsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgICAgICAgICAgICAgIGRvZXhpdChHT09EX0VYSVQsMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3N0YXRlKSAgICAgICAgICAgICAgICAgLyogRGlkIGEgcGFja2V0IGNvbWUgaW5zdGVhZD8gKi8KKyAgICAgICAgICAgICAgZ290byBYQ0tYTE9HOworICAgICAgICAgICAgY21yZXMoKTsgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBwYXJzZXIgYWdhaW4gKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoKF91ID0gKENIQVIgKiltYWxsb2MoKGludClzdHJsZW4ocykgKyAxKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRmKCI/SW50ZXJuYWwgZXJyb3I6IG1hbGxvY1xuIik7CisgICAgICAgICAgICBnb3RvIFhDS1hMT0c7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJjcHkoKGNoYXIgKilfdSxzKTsgICAgICAgLyogc2FmZSAqLworICAgICAgICAgICAgdXNlcmlkID0gX3U7CisgICAgICAgIH0KKyAgICB9CisgICAgb2sgPSB6dnVzZXIoKGNoYXIgKil1c2VyaWQpOyAgICAgICAgLyogVmVyaWZ5IHVzZXJuYW1lICovCisgICAgZGVidWcoRjExMSwiY2t4bG9naW4genZ1c2VyIix1c2VyaWQsb2spOworCisgICAgaWYgKCEqcGFzc3dkICYmIHByb21wdG9rCisjaWZkZWYgQ0tfUEFNCisgICAgICAgICYmIGd1ZXN0CisjZW5kaWYgLyogQ0tfUEFNICovCisgICAgICAgICkgeworICAgICAgICBjaGFyIHBybXB0WzgwXTsKKworI2lmZGVmIENLU1lTTE9HCisgICAgICAgIHNhdmxvZyA9IGNreHN5c2xvZzsgICAgICAgICAgICAgLyogU2F2ZSBhbmQgdHVybiBvZmYgc3lzbG9nZ2luZyAqLworICAgICAgICBja3hzeXNsb2cgPSAwOworI2VuZGlmIC8qIENLU1lTTE9HICovCisKKy8qIEZsdXNoIHR5cGVhaGVhZCBhZ2FpbiAqLworCisgICAgICAgIHdoaWxlICh0dGNoaygpID4gMCkgeworICAgICAgICAgICAgeCA9IHR0aW5jKDApOworICAgICAgICAgICAgZGVidWcoRjEwMSwiY2t4bG9naW4gZmx1c2ggdXNlciB4IiwiIix4KTsKKyNpZmRlZiBUTkNPREUKKyAgICAgICAgICAgIGlmIChzc3RlbG5ldCkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IElBQykgeworICAgICAgICAgICAgICAgICAgICB4ID0gdG5fZG9vcCgoQ0hBUikoeCAmIDB4ZmYpLGNreGVjaCx0dGluYyk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImNreGxvZ2luIHBhc3MgdG5fZG9vcCIsIiIseCk7CisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLAorICAgICAgICAgICAgICAgICAgICAgICJja3hsb2dpbiBwYXNzIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgIFRFTE9QVF9TQihURUxPUFRfS0VSTUlUKS5rZXJtaXQubWVfc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIElLU19PUFRJT04gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgICAgICAgICAgICAgIGdvdG8gWENLWExPRzsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiBja3hlY2ggPSAxOyBicmVhazsgLyogVHVybiBvbiBlY2hvaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiBja3hlY2ggPSAwOyBicmVhazsgLyogVHVybiBvZmYgZWNob2luZyAqLworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgIC8qIElLUyBldmVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFURUxPUFRfU0IoVEVMT1BUX0tFUk1JVCkua2VybWl0Lm1lX3N0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgIC8qIGVsc2UgZmFsbCB0aHJ1Li4uICovCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiAgICAgICAgICAgICAgICAgICAgLyogTG9nb3V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIFhDS1hMT0c7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVE5DT0RFICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJjbXAoKGNoYXIgKil1c2VyaWQsImFub255bW91cyIpIHx8CisgICAgICAgICAgICAhc3RyY21wKChjaGFyICopdXNlcmlkLCJmdHAiKSkgeworICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgZ290byBYQ0tYTE9HOworICAgICAgICAgICAgY2tzdHJuY3B5KHBybXB0LCJFbnRlciBlLW1haWwgYWRkcmVzcyBhcyBQYXNzd29yZDogIiw4MCk7CisgICAgICAgIH0gZWxzZSBpZiAoKnVzZXJpZCAmJiBzdHJsZW4oKGNoYXIgKil1c2VyaWQpIDwgNjApIHsKKyNpZmRlZiBOVAorICAgICAgICAgICAgZXh0ZXJuIENIQVIgKiBwUmVmZXJlbmNlRG9tYWluTmFtZTsKKyAgICAgICAgICAgIGlmIChwUmVmZXJlbmNlRG9tYWluTmFtZSkKKyAgICAgICAgICAgICAgY2ttYWt4bXNnKHBybXB0LAorICAgICAgICAgICAgICAgICAgICAgICA4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIkVudGVyICIsCisgICAgICAgICAgICAgICAgICAgICAgIHBSZWZlcmVuY2VEb21haW5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAiXFxcXCIsCisgICAgICAgICAgICAgICAgICAgICAgIHVzZXJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIidzIFBhc3N3b3JkOiAiLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICAgICAgY2ttYWttc2cocHJtcHQsODAsIkVudGVyICIsKGNoYXIgKil1c2VyaWQsIidzIFBhc3N3b3JkOiAiLE5VTEwpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBja3N0cm5jcHkocHJtcHQsIkVudGVyIFBhc3N3b3JkOiAiLDgwKTsKKyAgICAgICAgY21zZXRwKHBybXB0KTsgICAgICAgICAgICAgICAgICAvKiBNYWtlIG5ldyBwcm9tcHQgKi8KKyAgICAgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsgICAgICAgICAgICAvKiBQdXQgY29uc29sZSBpbiBjYnJlYWsgbW9kZSAqLworICAgICAgICBpZiAoc3RyY21wKChjaGFyICopdXNlcmlkLCJhbm9ueW1vdXMiKSAmJgorICAgICAgICAgICAgc3RyY21wKChjaGFyICopdXNlcmlkLCJmdHAiKSkgeyAvKiBhbmQgaWYgbm90IGFub255bW91cyAqLworICAgICAgICAgICAgZGVib2sgPSAwOworICAgICAgICAgICAgY21pbmkoMCk7ICAgICAgICAgICAgICAgICAgIC8qIGFuZCBuby1lY2hvIG1vZGUgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNtaW5pKDEpOworICAgICAgICB9CisgICAgICAgIGlmIChwZmxhZykgcHJvbXB0KHh4c3RyaW5nKTsgICAgLyogSXNzdWUgcHJvbXB0IGlmIGF0IHRvcCBsZXZlbCAqLworICAgICAgICBjbXJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBwYXJzZXIgKi8KKyAgICAgICAgZm9yICh4ID0gLTE7IHggPCAwOykgeyAgICAgICAgICAvKiBQcm9tcHQgdGlsbCB0aGV5IGFuc3dlciAqLworICAgICAgICAgICAgeCA9IGNtdHh0KCIiLCIiLCZzLE5VTEwpOyAgIC8qIEdldCBhIGxpdGVyYWwgbGluZSBvZiB0ZXh0ICovCisgICAgICAgICAgICBpZiAoeCA9PSAtNCB8fCB4ID09IC0xMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXHJcbiVzTG9naW4gY2FuY2VsbGVkXG4iLAorCQkgICAgICAgeCA9PSAtMTAgPyAiVGltZWQgb3V0OiAiIDogIiIpOworI2lmZGVmIENLU1lTTE9HCisgICAgICAgICAgICAgICAgY2t4c3lzbG9nID0gc2F2bG9nOworI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgICAgICAgICAgZG9leGl0KEdPT0RfRVhJVCwwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzc3RhdGUpICAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIG9mIGEgS2VybWl0IHBhY2tldCAqLworICAgICAgICAgICAgICBnb3RvIFhDS1hMT0c7CisgICAgICAgICAgICBjbXJlcygpOyAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgdGhlIHBhcnNlciBhZ2FpbiAqLworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXHJcbiIpOyAgICAgICAgICAgICAgICAgLyogRWNobyBhIENSTEYgKi8KKyAgICAgICAgaWYgKChfcCA9IChDSEFSICopbWFsbG9jKChpbnQpc3RybGVuKHMpICsgMSkpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHByaW50ZigiP0ludGVybmFsIGVycm9yOiBtYWxsb2NcbiIpOworICAgICAgICAgICAgZ290byBYQ0tYTE9HOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyY3B5KChjaGFyICopX3Ascyk7ICAgICAgIC8qIHNhZmUgKi8KKyAgICAgICAgICAgIHBhc3N3ZCA9IF9wOworICAgICAgICB9CisgICAgfQorI2lmZGVmIENLX1BBTQorICAgIGVsc2UgeworICAgICAgICBjbXJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBwYXJzZXIgKi8KKworICAgICAgICAvKiBXZSByZXN0b3JlIHRoZSBwcm9tcHQgbm93IGJlY2F1c2UgdGhlIFBBTSBlbmdpbmUgd2lsbCBjYWxsICAqLworICAgICAgICAvKiByZWFkcGFzcygpIHdoaWNoIHdpbGwgb3ZlcndyaXRlIHBzYXZlLiAqLworICAgICAgICBpZiAocnByb21wdCkgeworICAgICAgICAgICAgY21zZXRwKHBzYXZlKTsgICAgICAgICAgICAgIC8qIFJlc3RvcmUgb3JpZ2luYWwgcHJvbXB0ICovCisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJja3hsb2dpbiByZXN0b3JlZCIscHNhdmUsMCk7CisgICAgICAgICAgICBycHJvbXB0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBDS19QQU0gKi8KKworI2lmZGVmIENLU1lTTE9HCisgICAgY2t4c3lzbG9nID0gc2F2bG9nOworI2VuZGlmIC8qIENLU1lTTE9HICovCisKKyAgICBpZiAob2spIHsKKyAgICAgICAgb2sgPSB6dnBhc3MoKGNoYXIgKilwYXNzd2QpOyAgICAvKiBDaGVjayBwYXNzd29yZCAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJja3hsb2dpbiB6dnBhc3MiLCIiLG9rKTsKKyAgICB9CisKKyAgICBpZiAob2sgPiAwICYmIGlzZ3Vlc3QpIHsKKyNpZm5kZWYgTk9QVVNICisgICAgICAgIG5vcHVzaCA9IDE7CisjZW5kaWYgLyogTk9QVVNIICovCisgICAgICAgIHNydmNkbXNnID0gMTsKKyAgICB9CisgICAgcmMgPSBvazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSByZXR1cm4gY29kZSAqLworICAgIGlmICgoY2hhciAqKXVpZGJ1ZiAhPSAoY2hhciAqKXVzZXJpZCkKKyAgICAgIGNrc3RybmNweSh1aWRidWYsKGNoYXIgKil1c2VyaWQsVUlEQlVGTEVOKTsgLyogUmVtZW1iZXIgdXNlcm5hbWUgKi8KKworICBYQ0tYTE9HOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1vbiBleGl0ICovCisjaWZkZWYgQ0tTWVNMT0cKKyAgICBja3hzeXNsb2cgPSBzYXZsb2c7ICAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIG9mIEdPVE8gYWJvdmUgKi8KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgIGlmIChycHJvbXB0KSB7CisgICAgICAgIGNtc2V0cChwc2F2ZSk7ICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBvcmlnaW5hbCBwcm9tcHQgKi8KKyAgICAgICAgZGVidWcoRjExMCwiY2t4bG9naW4gcmVzdG9yZWQiLHBzYXZlLDApOworICAgIH0KKyAgICBpZiAoX3UgfHwgX3AgfHwgX2EpIHsKKyAgICAgICAgaWYgKF91KSBmcmVlKF91KTsKKyAgICAgICAgaWYgKF9wKSBmcmVlKF9wKTsKKyAgICAgICAgaWYgKF9hKSBmcmVlKF9hKTsKKyAgICB9CisgICAgcmV0dXJuKHJjKTsKK30KKworaW50Citja3hsb2dvdXQoKSB7CisgICAgZG9leGl0KEdPT0RfRVhJVCwwKTsgICAgICAgICAgICAgICAgLyogZG9leGl0IGNhbGxzIHp2bG9nb3V0ICovCisgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IHJlYWNoZWQgKi8KK30KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCisjZW5kaWYgLyogTk9JQ1AgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja3V1c3IuYyBiL2NrZXJtaXQtOC4wLjIxMS9ja3V1c3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTQ1Zjg5Ci0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrdXVzci5jCkBAIC0wLDAgKzEsMTMxMjEgQEAKKyNpZmRlZiBTU0hURVNUCisjZGVmaW5lIFNTSEJVSUxUSU4KKyNlbmRpZiAvKiBTU0hURVNUICovCisKKyNpbmNsdWRlICJja2NzeW0uaCIKK2NoYXIgKnVzZXJ2ID0gIlVzZXIgSW50ZXJmYWNlIDguMC4yNzgsIDEyIE1hciAyMDA0IjsKKworLyogIEMgSyBVIFUgUyBSIC0tICAiVXNlciBJbnRlcmZhY2UiIGZvciBDLUtlcm1pdCAoUGFydCAxKSAgKi8KKworLyoKKyAgQXV0aG9yczoKKyAgICBGcmFuayBkYSBDcnV6IDxmZGNAY29sdW1iaWEuZWR1PiwKKyAgICAgIFRoZSBLZXJtaXQgUHJvamVjdCwgQ29sdW1iaWEgVW5pdmVyc2l0eSwgTmV3IFlvcmsgQ2l0eQorICAgIEplZmZyZXkgRSBBbHRtYW4gPGphbHRtYW5Ac2VjdXJlLWVuZHBvaW50cy5jb20+CisgICAgICBTZWN1cmUgRW5kcG9pbnRzIEluYy4sIE5ldyBZb3JrIENpdHkKKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorKi8KKworLyoKKyAgT3JpZ2luYWxseSB0aGUgZW50aXJlIHVzZXIgaW50ZXJmYWNlIHdhcyBpbiBvbmUgbW9kdWxlLCBja3V1c3IuYy4gIE92ZXIKKyAgdGhlIHllYXJzIGl0IGhhcyBiZWVuIHNwbGl0IGludG8gbWFueSBtb2R1bGVzOiBja3V1czIuYywgY2t1dXMzLmMsIC4uLiwKKyAgY2t1dXM3LmMuICBja3V1czIuYyBjb250YWlucyB0aGUgSEVMUCBjb21tYW5kIHBhcnNlciBhbmQgaGVscC10ZXh0IHN0cmluZ3M7CisgIGNrdXVzeS5jIGNvbnRhaW5zIHRoZSBVTklYLXN0eWxlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2U7IGNrdXVzeC5jIGNvbnRhaW5zCisgIHJvdXRpbmVzIG5lZWRlZCBieSBib3RoIHRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGFuZCB0aGUgaW50ZXJhY3RpdmUKKyAgY29tbWFuZCBwYXJzZXIuCisqLworCisvKgorICBUaGUgY2t1dXMqLmMgbW9kdWxlcyBkZXBlbmQgb24gdGhlIGV4aXN0ZW5jZSBvZiBDIGxpYnJhcnkgZmVhdHVyZXMgbGlrZQorICBmb3BlbiwgZmdldHMsIGZlb2YsIChmKXByaW50ZiwgYXJndi9hcmdjLCBldGMuICBPdGhlciBmdW5jdGlvbnMgdGhhdCBhcmUKKyAgbGlrZWx5IHRvIHZhcnkgYW1vbmcgZGlmZmVyZW50IHBsYXRmb3JtcyAtLSBsaWtlIHNldHRpbmcgdGVybWluYWwgbW9kZXMgb3IKKyAgaW50ZXJydXB0cyAtLSBhcmUgaW52b2tlZCB2aWEgY2FsbHMgdG8gZnVuY3Rpb25zIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlCisgIHN5c3RlbS0gZGVwZW5kZW50IG1vZHVsZXMsIGNrP1tmdF1pby5jLiAgVGhlIGNvbW1hbmQgbGluZSBwYXJzZXIgcHJvY2Vzc2VzCisgIGFueSBhcmd1bWVudHMgZm91bmQgb24gdGhlIGNvbW1hbmQgbGluZSwgYXMgcGFzc2VkIHRvIG1haW4oKSB2aWEgYXJndi9hcmdjLgorICBUaGUgaW50ZXJhY3RpdmUgcGFyc2VyIHVzZXMgdGhlIGZhY2lsaXRpZXMgb2YgdGhlIGNtZCBwYWNrYWdlIChkZXZlbG9wZWQgZm9yCisgIHRoaXMgcHJvZ3JhbSwgYnV0IHVzYWJsZSBieSBhbnkgcHJvZ3JhbSkuICBBbnkgY29tbWFuZCBwYXJzZXIgbWF5IGJlCisgIHN1YnN0aXR1dGVkIGZvciB0aGlzIG9uZS4gIFRoZSBvbmx5IHJlcXVpcmVtZW50cyBmb3IgdGhlIEtlcm1pdCBjb21tYW5kCisgIHBhcnNlciBhcmUgdGhlc2U6CisKKyAgLiBTZXQgcGFyYW1ldGVycyB2aWEgZ2xvYmFsIHZhcmlhYmxlcyBsaWtlIGR1cGxleCwgc3BlZWQsIHR0bmFtZSwgZXRjLiAgU2VlCisgICAgY2ttYWluLmMgZm9yIHRoZSBkZWNsYXJhdGlvbnMgYW5kIGRlc2NyaXB0aW9ucyBvZiB0aGVzZSB2YXJpYWJsZXMuCisKKyAgLiBJZiBhIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkIHdpdGhvdXQgdGhlIHVzZSBvZiBLZXJtaXQgcHJvdG9jb2wsIHRoZW4KKyAgICBleGVjdXRlIHRoZSBjb21tYW5kIGRpcmVjdGx5IGFuZCBzZXQgdGhlIHZhcmlhYmxlIHNzdGF0ZSB0byAwLiBFeGFtcGxlcworICAgIGluY2x1ZGUgJ3NldCcgY29tbWFuZHMsIGxvY2FsIGRpcmVjdG9yeSBsaXN0aW5ncywgdGhlICdjb25uZWN0JyBjb21tYW5kLgorCisgIC4gSWYgYSBjb21tYW5kIHJlcXVpcmVzIHRoZSBLZXJtaXQgcHJvdG9jb2wsIHNldCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKworICAgICBzc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBkYXRhCisgICAgICAgJ3gnIChlbnRlciBzZXJ2ZXIgbW9kZSkgICAgICAgICAgICAobm9uZSkKKyAgICAgICAncicgKHNlbmQgYSAnZ2V0JyBjb21tYW5kKSAgICAgICAgIGNtYXJnLCBjbWFyZzIKKyAgICAgICAndicgKGVudGVyIHJlY2VpdmUgbW9kZSkgICAgICAgICAgIGNtYXJnMgorICAgICAgICdnJyAoc2VuZCBhIGdlbmVyaWMgY29tbWFuZCkgICAgICAgY21hcmcKKyAgICAgICAncycgKHNlbmQgZmlsZXMpICAgICAgICAgICAgICAgICAgIG5maWxzLCBjbWFyZyAmIGNtYXJnMiBPUiBjbWxpc3QKKyAgICAgICAnYycgKHNlbmQgYSByZW1vdGUgaG9zdCBjb21tYW5kKSAgIGNtYXJnCisKKyAgICAgY21saXN0IGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHN0cmluZ3MuCisgICAgIGNtYXJnLCBjbWFyZzIgYXJlIHBvaW50ZXJzIHRvIHN0cmluZ3MuCisgICAgIG5maWxzIGlzIGFuIGludGVnZXIuCisKKyAgICAgY21hcmcgY2FuIGJlIGEgZmlsZW5hbWUgc3RyaW5nIChwb3NzaWJseSB3aWxkKSwgb3IKKwlhIHBvaW50ZXIgdG8gYSBwcmVmYWJyaWNhdGVkIGdlbmVyaWMgY29tbWFuZCBzdHJpbmcsIG9yCisJYSBwb2ludGVyIHRvIGEgaG9zdCBjb21tYW5kIHN0cmluZy4KKyAgICAgY21hcmcyIGlzIGFuICJhcy1uYW1lIiAtIHRoZSBuYW1lIHRvIHNlbmQgZmlsZShzKSB1bmRlciwgb3IKKwl0aGUgbmFtZSB1bmRlciB3aGljaCB0byBzdG9yZSBpbmNvbWluZyBmaWxlKHMpOyBtdXN0IG5vdCBiZSB3aWxkLgorCUEgbnVsbCBvciBlbXB0eSB2YWx1ZSBtZWFucyB0byB1c2UgdGhlIGZpbGUncyBvd24gbmFtZS4KKyAgICAgY21saXN0IGlzIGEgbGlzdCBvZiBmaWxlbmFtZXMsIHN1Y2ggYXMgcGFzc2VkIHZpYSBhcmd2LgorICAgICBuZmlscyBpcyBhbiBpbnRlZ2VyLCBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorICAgICAgIC0xOiBmaWxlc3BlYyAocG9zc2libHkgd2lsZCkgaW4gY21hcmcsIG11c3QgYmUgZXhwYW5kZWQgaW50ZXJuYWxseS4KKwkwOiBzZW5kIGZyb20gc3RkaW4gKHN0YW5kYXJkIGlucHV0KS4KKyAgICAgICA+MDogbnVtYmVyIG9mIGZpbGVzIHRvIHNlbmQsIGZyb20gY21saXN0LgorCisgIFRoZSBzY3JlZW4oKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgc2NyZWVuIGR1cmluZyBmaWxlIHRyYW5zZmVyLgorICBUaGUgdGxvZygpIGZ1bmN0aW9uIHdyaXRlcyB0byBhIHRyYW5zYWN0aW9uIGxvZy4KKyAgVGhlIGRlYnVnKCkgZnVuY3Rpb24gd3JpdGVzIHRvIGEgZGVidWdnaW5nIGxvZy4KKyAgVGhlIGludG1zZygpIGFuZCBjaGtpbnQoKSBmdW5jdGlvbnMgcHJvdmlkZSB0aGUgdXNlciBpL28gZm9yIGludGVycnVwdGluZworICAgIGZpbGUgdHJhbnNmZXJzLgorKi8KKworLyogSW5jbHVkZXMgKi8KKworI2lmZGVmIE1VTFRJTkVUCisjZGVmaW5lIE1VTFRJTkVUX09MRF9TVFlMRQkJLyogTGVhdmUgc2VsZWN0IHByb3RvdHlwZSB1bmRlZmluZWQgKi8KKyNlbmRpZiAvKiBNVUxUSU5FVCAqLworCisjaW5jbHVkZSAiY2tjZGViLmgiCisjaW5jbHVkZSAiY2tjYXNjLmgiCisjaW5jbHVkZSAiY2tja2VyLmgiCisjaW5jbHVkZSAiY2tjbmV0LmgiCQkJLyogTmV0d29yayBzeW1ib2xzICovCisjaW5jbHVkZSAiY2t1dXNyLmgiCisjaW5jbHVkZSAiY2tjeGxhLmgiCisKK2ludCBnX2ZuY2FjdCA9IC0xOwkJCS8qIE5lZWRlZCBmb3IgTk9JQ1AgYnVpbGRzICovCitpbnQgbm9pbml0ID0gMDsJCQkJLyogRmxhZyBmb3Igc2tpcHBpbmcgaW5pdCBmaWxlICovCitpbnQgbnNjYW5maWxlID0gU0NBTkZJTEVCVUY7CisKK2ludCByY2RhY3RpdmUgPSAwOwkJCS8qIFJDRCBhY3RpdmUgKi8KK2ludCBrZWVwYWxsY2hhcnMgPSAwOwkJCS8qIFNlZSBjbWZsZCgpICovCisKK2ludCBsb2N1cyA9IDE7CQkJCS8qIEN1cnJlbnQgTE9DVVMgaXMgTE9DQUwgKi8KKyNpZmRlZiBPUzIKK2ludCBhdXRvbG9jdXMgPSAyOwkJCS8qIEF1dG9tYXRpYyBMT0NVUyBzd2l0Y2hpbmc6IEFTSyAqLworI2Vsc2UgLyogT1MyICovCitpbnQgYXV0b2xvY3VzID0gMTsJCQkvKiBBdXRvbWF0aWMgTE9DVVMgc3dpdGNoaW5nIGVuYWJsZWQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBOT0lDUAorI2lmZGVmIENLTEVBUk4KKyNpZmRlZiBWTVMKKyNpbmNsdWRlIDx0aW1lLmg+CQkJLyogRm9yIENLTEVBUk4gKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBDS0xFQVJOICovCisjaWZkZWYgT1MyCisjaWZuZGVmIE5UCisjZGVmaW5lIElOQ0xfTk9QTQorI2RlZmluZSBJTkNMX1ZJTwkJCS8qIE5lZWRlZCBmb3IgY2tvY29uLmggKi8KKyNpbmNsdWRlIDxvczIuaD4KKyN1bmRlZiBDT01NRU5UCisjZWxzZQorI2RlZmluZSBBUElSRVQgVUxPTkcKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8dGFwaS5oPgorI2luY2x1ZGUgImNrbndpbi5oIgorI2luY2x1ZGUgImNrbnRhcC5oIgkJCS8qIENLX1RBUEkgZGVmaW5pdGlvbiAqLworI2VuZGlmIC8qIE5UICovCisjaW5jbHVkZSAiY2tvd2luLmgiCisjaW5jbHVkZSAiY2tvY29uLmgiCitleHRlcm4gaW50IHRjcF9hdmFpbDsKK2V4dGVybiBib29sIHZpZXdvbmx5OworZXh0ZXJuIGludCBrOTVzdGRvdXQ7CitleHRlcm4gaW50IHR0X3Njcm9sbDsKKyNpZm5kZWYgTk9URVJNCitleHRlcm4gdHRfc3RhdHVzW1ZOVU1dOworI2VuZGlmIC8qIE5PVEVSTSAqLworaW50IGRpc3BsYXlfZGVtbyA9IDE7CisjaW5jbHVkZSAiY2tvc3NoLmgiCisjaWZkZWYgS1VJCisjaW5jbHVkZSAiaWt1aS5oIgorI2VuZGlmIC8qIEtVSSAqLworI2VuZGlmIC8qIE9TMiAqLworCitpbnQgb3B0bGluZXMgPSAwOworaW50IGRpZHNldGxpbiA9IDA7CisKKyNpZmRlZiBORVdGVFAKK2V4dGVybiBpbnQgZnRwZ2V0LCBmdHBpc29wZW4oKSwgZG9mdHByZXMoKTsKK19QUk9UT1RZUChpbnQgZG9mdHB0eXAsKGludCkpOworI2VuZGlmIC8qIE5FV0ZUUCAqLworCisjaWZkZWYgVk1TCitleHRlcm4gaW50IGJhdGNoOworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgZGF0YWdlbmVyYWwKKyNpbmNsdWRlIDxwYWNrZXRzOmNvbW1vbi5oPgorI2RlZmluZSBmZ2V0cyhzdHJpbmdidWYsbWF4LGZkKSBkZ19mZ2V0cyhzdHJpbmdidWYsbWF4LGZkKQorI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisKK2V4dGVybiBpbnQgeGNtZHNyYywgaGludHMsIGNtZmxncywgd2h5Y2xvc2VkOworCitjaGFyICogaGxwdG9rID0gTlVMTDsKKworI2lmZGVmIENLX1RUR1dTSVoJCQkvKiBXaGV0aGVyIHRvIHVzZSBtb3JlLXByb21wdGluZyAqLworaW50IHhhc2ttb3JlID0gMTsJCQkvKiBNb21lbnRhcnkgc2V0dGluZyAqLworaW50IHNhdmVhc2sgID0gMTsJCQkvKiBQZXJtYW5lbnQgc2V0dGluZyAqLworI2Vsc2UKK2ludCB4YXNrbW9yZSA9IDA7CitpbnQgc2F2ZWFzayAgPSAwOworI2VuZGlmIC8qIENLX1RUR1dTSVogKi8KKworI2lmbmRlZiBOT0NTRVRTCitleHRlcm4gaW50IG5maWxjOworZXh0ZXJuIHN0cnVjdCBrZXl0YWIgZmNzdGFiW107CitleHRlcm4gaW50IGZjaGFyc2V0OworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworY2hhciAqIGdfcHN3ZCA9IE5VTEw7CitpbnQgZ19wY3B0ID0gLTE7CitpbnQgZ19wZmxnID0gLTE7CisKK2V4dGVybiBpbnQgY21kX3Jvd3MsIGNtZF9jb2xzOworCisjaWZkZWYgQ0tST09UCitleHRlcm4gaW50IGNrcm9vdGVycjsKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworZXh0ZXJuIGludCBpbnNlcnZlciwgZmlsZXBlZWs7CisKKyNpZmRlZiBDS0xFQVJOCitGSUxFICogbGVhcm5mcCA9IE5VTEw7CitjaGFyICogbGVhcm5maWxlID0gTlVMTDsKK2ludCBsZWFybmluZyA9IDA7CisjZW5kaWYgLyogQ0tMRUFSTiAqLworCisjaWZuZGVmIE5PWEZFUgorZXh0ZXJuIGludCBhdGNhcHIsIGF0ZGlzbywgbmZpbHMsIG1vdmluZywgcHJvdG9jb2wsIHNlbmRtb2RlLCBlcGt0ZmxnLCBzaXplLAorICBzbmRzcmMsIHNlcnZlciwgZGlzcGxhLCBmbmNudiwgZm5zcGF0aCwgZm5ycGF0aCwgeGZlcm1vZGUsIHVycHNpeiwKKyAgc3BzaXpmLCBzcHNpeiwgc3BzaXpyLCBzcG1heCwgd3Nsb3RyLCBwcmVmaXhpbmcsIGZuY2FjdCwgcmVsaWFibGUsCisgIHNldHJlbGlhYmxlOworCisjaWZkZWYgSUtTRENPTkYKK2V4dGVybiBpbnQgaWtzZGNmOworI2VuZGlmIC8qIElLU0RDT05GICovCisKKyNpZmRlZiBDS19MT0dJTgorZXh0ZXJuIGludCBpc2d1ZXN0OworI2VuZGlmIC8qIENLX0xPR0lOICovCisKK2V4dGVybiBsb25nIHNlbmRzdGFydDsKKworZXh0ZXJuIGNoYXIgKmNtYXJnLCAqY21hcmcyLCAqKmNtbGlzdCwgKmRmdHR5OworCitleHRlcm4gc3RydWN0IGtleXRhYiBmbnRhYltdOyBleHRlcm4gaW50IG5mbnRhYjsKK2V4dGVybiBzdHJ1Y3QgY2tfcCBwdGFiW05QUk9UT1NdOworCitpbnQgc25kY21kID0gMDsJCS8qIExhc3QgY29tbWFuZCB3YXMgYSBTRU5ELWNsYXNzIGNvbW1hbmQuICovCisKK2ludCBnX3hmZXJtb2RlID0gLTE7CitpbnQgZ19wcm90byAgPSAtMTsKK2ludCBnX3VycHNpeiA9IC0xOworaW50IGdfc3BzaXpmID0gLTE7CitpbnQgZ19zcHNpeiAgPSAtMTsKK2ludCBnX3Nwc2l6ciA9IC0xOworaW50IGdfc3BtYXggID0gLTE7CitpbnQgZ193c2xvdHIgPSAtMTsKK2ludCBnX3ByZWZpeGluZyA9IC0xOworaW50IGdfZm5jbnYgID0gLTE7CitpbnQgZ19mbnNwYXRoID0gLTE7CitpbnQgZ19mbnJwYXRoID0gLTE7CitpbnQgZ19mbmFjdCAgPSAtMTsKK2ludCBnX2Rpc3BsYSA9IC0xOworaW50IGdfc3BhdGggID0gLTE7CitpbnQgZ19ycGF0aCAgPSAtMTsKK2NoYXIgKiBnX3NmaWx0ZXIgPSBOVUxMOworY2hhciAqIGdfcmZpbHRlciA9IE5VTEw7CisKK2V4dGVybiBpbnQgcGF0dGVybnM7CisjaWZkZWYgUEFUVEVSTlMKK2V4dGVybiBjaGFyICp0eHRwYXR0ZXJuc1tdLCAqYmlucGF0dGVybnNbXTsKK2ludCBnX3BhdHRlcm5zID0gLTE7CisjZW5kaWYgLyogUEFUVEVSTlMgKi8KK2ludCBnX3NraXBidXAgPSAtMTsKKworI2lmZGVmIFBJUEVTRU5ECitleHRlcm4gaW50IHVzZXBpcGVzLCBwaXBlc2VuZDsKK2V4dGVybiBjaGFyICogc25kZmlsdGVyOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyNpZm5kZWYgTk9TUEwKK2V4dGVybiBpbnQgc25keGxvLCBzbmR4aGksIHNuZHhpbjsKKyNlbmRpZiAvKiBOT1NQTCAqLworCitleHRlcm4gY2hhciBmc3BlY1tdOwkJCS8qIE1vc3QgcmVjZW50IGZpbGVzcGVjICovCitleHRlcm4gaW50IGZzcGVjbGVuOwkJCS8qIExlbmd0aCBvZiBmc3BlY1tdIGJ1ZmZlciAqLworCisjaWZuZGVmIE5PRlJJTExTCitleHRlcm4gaW50IHJtYWlsZjsJCQkvKiBNQUlMIGNvbW1hbmQgaXRlbXMgKi8KK2V4dGVybiBjaGFyIG9wdGJ1ZltdOworI2VuZGlmIC8qIE5PRlJJTExTICovCisKK2V4dGVybiBpbnQKKyAgZW5fY3B5LCBlbl9jd2QsIGVuX2RlbCwgZW5fZGlyLCBlbl9maW4sIGVuX2dldCwgZW5fYnllLCBlbl9tYWksIGVuX3ByaSwKKyAgZW5faG9zLCBlbl9yZW4sIGVuX3NlbiwgZW5fc3BhLCBlbl9zZXQsIGVuX3R5cCwgZW5fd2hvLCBlbl9yZXQsIGVuX3hpdCwKKyAgZW5fbWtkLCBlbl9ybWQsIGVuX2FzZzsKKworI2lmbmRlZiBOT01TRU5ECQkJCS8qIE11bHRpcGxlIFNFTkQgKi8KK2V4dGVybiBjaGFyICptc2ZpbGVzW107CitpbnQgZmlsZXNpbmxpc3QgPSAwOwkJCS8qIEFuZCBBREQgLi4uICovCitleHRlcm4gc3RydWN0IGZpbGVsaXN0ICogZmlsZWhlYWQ7CitleHRlcm4gc3RydWN0IGZpbGVsaXN0ICogZmlsZXRhaWw7CitleHRlcm4gc3RydWN0IGZpbGVsaXN0ICogZmlsZW5leHQ7CitleHRlcm4gaW50IGFkZGxpc3Q7CisjZW5kaWYgLyogTk9NU0VORCAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBhZGR0YWJbXSA9IHsKKyNpZmRlZiBQQVRURVJOUworICAgIHsgImJpbmFyeS1wYXR0ZXJucyIsIEFERF9CSU4sIDAgfSwKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworI2lmbmRlZiBOT01TRU5ECisgICAgeyAic2VuZC1saXN0IiwgQUREX1NORCwgMCB9LAorI2VuZGlmIC8qIE5PTVNFTkQgKi8KKyNpZmRlZiBQQVRURVJOUworICAgIHsgInRleHQtcGF0dGVybnMiLCBBRERfVFhULCAwIH0sCisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5hZGR0YWIgPSBzaXplb2YoYWRkdGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYikgLSAxOworCisjaWZuZGVmIE5PQ1NFVFMKK3N0cnVjdCBrZXl0YWIgYXNzb2N0YWJbXSA9IHsKKyAgICB7ICJmaWxlLWNoYXJhY3Rlci1zZXQiLCAgICAgQVNTT0NfRkMsIDAgfSwKKyAgICB7ICJ0cmFuc2Zlci1jaGFyYWN0ZXItc2V0IiwgQVNTT0NfVEMsIDAgfSwKKyAgICB7ICJ4ZmVyLWNoYXJhY3Rlci1zZXQiLCAgICAgQVNTT0NfVEMsIENNX0lOViB9Cit9Oworc3RhdGljIGludCBuYXNzb2MgPSBzaXplb2YoYXNzb2N0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKTsKK2V4dGVybiBpbnQgYWZjc2V0W01BWEZDU0VUUysxXTsJCS8qIENoYXJhY3Rlci1zZXQgYXNzb2NpYXRpb25zICovCitleHRlcm4gaW50IGF4Y3NldFtNQVhUQ1NFVFMrMV07CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisjaWZuZGVmIEFERENNRAorI2lmbmRlZiBOT01TRU5ECisjZGVmaW5lIEFERENNRAorI2VuZGlmIC8qIE5PTVNFTkQgKi8KKyNpZm5kZWYgQUREQ01ECisjaWZkZWYgUEFUVEVSTlMKKyNkZWZpbmUgQUREQ01ECisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyNlbmRpZiAvKiBBRERDTUQgKi8KKyNlbmRpZiAvKiBBRERDTUQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworLyogRXh0ZXJuYWwgS2VybWl0IFZhcmlhYmxlcywgc2VlIGNrbWFpbi5jIGZvciBkZXNjcmlwdGlvbi4gKi8KKworZXh0ZXJuIHh4X3N0cnAgeHhzdHJpbmc7CitleHRlcm4gbG9uZyB4dmVybnVtOworCitleHRlcm4gaW50IGxvY2FsLCB4aXRzdGEsIGJpbmFyeSwgbXNnZmxnLCBlc2NhcGUsIGR1cGxleCwgcXVpZXQsIHRsZXZlbCwKKyAgcGZsYWcsIHppbmNudCwgY2t4ZWNoLCBjYXJyaWVyLCB3aGF0LCBub3B1c2gsIGhhdmVsaW5lLCBieWVfYWN0aXZlOworI2lmZGVmIFROQ09ERQorZXh0ZXJuIGludCBkZWJzZXM7CitleHRlcm4gY2hhciB0bl9tc2dbXTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKworaW50IHNsZWVwY2FuID0gMTsKK2ludCBnX2JpbmFyeSA9IC0xOworaW50IGdfcmVjdXJzaXZlID0gLTE7CitpbnQgZ19tYXRjaGRvdCA9IC0xOworZXh0ZXJuIGludCBub2xpbmtzOworCitleHRlcm4gbG9uZyB2ZXJudW07CitleHRlcm4gY2hhciAqdmVyc2lvLCAqY29weXJpZ2h0W107CitleHRlcm4gY2hhciAqY2t4c3lzOworI2lmbmRlZiBOT0hFTFAKK2V4dGVybiBjaGFyICppbnRyb3R4dFtdOworZXh0ZXJuIGNoYXIgKm5ld3N0eHRbXTsKKyNlbmRpZiAvKiBOT0hFTFAgKi8KKworI2lmbmRlZiBPUzIKKyNpZm5kZWYgVU5JWAorZXh0ZXJuIGNoYXIgKlBXRENNRDsKKyNlbmRpZiAvKiBVTklYICovCitleHRlcm4gY2hhciAqV0hPQ01EOworI2VuZGlmIC8qIE9TMiAqLworCitleHRlcm4gY2hhciB0dG5hbWVbXTsKKworZXh0ZXJuIENIQVIgc3N0YXRlOworCitleHRlcm4gaW50IG5ldHdvcms7CQkJLyogSGF2ZSBhY3RpdmUgbmV0d29yayBjb25uZWN0aW9uICovCitleHRlcm4gaW50IG5ldHR5cGU7CQkJLyogVHlwZSBvZiBuZXR3b3JrICovCitleHRlcm4gaW50IHR0bnByb3RvOyAgICAgICAgICAgICAgICAgICAgLyogTkVUX1RDUEIgcHJvdG9jb2wgKi8KKworI2lmbmRlZiBOT0RJQUwKK2V4dGVybiBpbnQgZGlhbHN0YSwgZGlhbGF0bW8sIGRpYWxjb24sIGRpYWxjcTsgLyogRElBTCBzdGF0dXMsIGV0Yy4gKi8KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworI2lmZGVmIENLX0FQQworZXh0ZXJuIGludCBhcGNhY3RpdmUsIGFwY3N0YXR1czsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKworI2lmbmRlZiBOT1BVU0gKKyNpZm5kZWYgTk9GUklMTFMKK2V4dGVybiBjaGFyIGVkaXRvcltdOworZXh0ZXJuIGNoYXIgZWRpdG9wdHNbXTsKK2V4dGVybiBjaGFyIGVkaXRmaWxlW107CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworI2lmZGVmIEJST1dTRVIKK2V4dGVybiBjaGFyIGJyb3dzZXJbXTsJCQkvKiBXZWIgYnJvd3NlciBhcHBsaWNhdGlvbiAqLworZXh0ZXJuIGNoYXIgYnJvd3NvcHRzW107CQkvKiBXZWIgYnJvd3NlciBvcHRpb25zICovCitleHRlcm4gY2hhciBicm93c3VybFtdOwkJCS8qIE1vc3QgcmVjZW50IFVSTCAqLworI2VuZGlmIC8qIEJST1dTRVIgKi8KKyNpZm5kZWYgTk9GVFAKK2NoYXIgZnRwYXBwW0NLTUFYUEFUSCsxXSA9IHsgTlVMLCBOVUwgfTsgLyogZnRwIGV4ZWN1dGFibGUgKi8KK2NoYXIgZnRwb3B0c1sxMjhdID0geyBOVUwsIE5VTCB9OwkvKiBmdHAgY29tbWFuZC1saW5lIG9wdGlvbnMgKi8KKyNlbmRpZiAvKiBOT0ZUUCAqLworZXh0ZXJuIHN0cnVjdCBrZXl0YWIgb25vZmZbXTsJCS8qIE9uL09mZiBrZXl3b3JkIHRhYmxlICovCisKKyNpZmRlZiBDS19UTVBESVIKK2ludCBmX3RtcGRpciA9IDA7CQkJLyogRGlyZWN0b3J5IGNoYW5nZWQgdGVtcG9yYXJpbHkgKi8KK2NoYXIgc2F2ZGlyW1RNUERJUkxFTl07CQkJLyogRm9yIHNhdmluZyBjdXJyZW50IGRpcmVjdG9yeSAqLworI2VuZGlmIC8qIENLX1RNUERJUiAqLworCitpbnQgYWN0aXZlY21kID0gLTE7CQkJLyogS2V5d29yZCBpbmRleCBvZiBhY3RpdmUgY29tbWFuZCAqLworaW50IGRvY29ueCA9IC0xOwkJCS8qIENPTk5FQ1QtY2xhc3MgY29tbWFuZCBhY3RpdmUgKi8KK2ludCBvb2ZsYWcgPSAwOwkJCQkvKiBVc2VyLXNldHRhYmxlIG9uL29mZiBmbGFnICovCisKK2ludCByY2ZsYWcgPSAwOwkJCQkvKiBQb2ludGVyIHRvIGhvbWUgZGlyZWN0b3J5IHN0cmluZyAqLworaW50IHJlcGFycywJCQkJLyogUmVwYXJzZSBuZWVkZWQgKi8KKyAgICB0ZWNobyA9IDA7CQkJCS8qIFRha2UgZWNobyAqLworaW50IHNlY2hvID0gMTsJCQkJLyogU0NSSVBUIGVjaG8gKi8KKworaW50IHhpdHdhcm4gPQkJCS8qIFdhcm4gYWJvdXQgb3BlbiBjb25uZWN0aW9uIG9uIGV4aXQgKi8KKyNpZmRlZiBOT1dBUk4KKzAKKyNlbHNlCisxCisjZW5kaWYgLyogTk9XQVJOICovCis7CisKK3N0cnVjdCBrZXl0YWIgb25vZmZzd1tdID0geworICAgIHsgIi9vZmYiLCAwLCAwIH0sCisgICAgeyAiL29uIiwgIDEsIDAgfQorfTsKKworI2lmZGVmIENLRVhFQworc3RydWN0IGtleXRhYiByZWRpcnN3W10gPSB7CisgICAgeyAiL3JlZGlyZWN0IiwgMSwgMCB9Cit9OworI2VuZGlmIC8qIENLRVhFQyAqLworCisjaWZuZGVmIE5PWE1JVAorLyogVmFyaWFibGVzIGZvciBUUkFOU01JVCBjb21tYW5kICovCisKK2ludCB4bWl0eCA9IDE7CQkJLyogV2hldGhlciB0byBlY2hvIGR1cmluZyBUUkFOU01JVCAqLworaW50IHhtaXRmID0gMDsJCQkvKiBDaGFyYWN0ZXIgdG8gZmlsbCBlbXB0eSBsaW5lcyAqLworaW50IHhtaXRsID0gMDsJCQkvKiAwID0gRG9uJ3Qgc2VuZCBsaW5lZmVlZCB0b28gKi8KK2ludCB4bWl0cCA9IExGOwkJCS8qIEhvc3QgbGluZSBwcm9tcHQgKi8KK2ludCB4bWl0cyA9IDA7CQkJLyogVXNlIHNoaWZ0LWluL3NoaWZ0LW91dCwgMCA9IG5vICovCitpbnQgeG1pdHcgPSAwOwkJCS8qIE1pbGxpc2Vjb25kcyB0byBwYXVzZSBkdXJpbmcgVFJBTlNNSVQgKi8KK2ludCB4bWl0dCA9IDE7CQkJLyogU2Vjb25kcyB0byB3YWl0IGZvciBlYWNoIGNoYXIgdG8gZWNobyAqLworaW50IHhtaXRhID0gMTsJCQkvKiBBY3Rpb24gdXBvbiB0aW1lb3V0ICovCisKKyNkZWZpbmUgWE1JX0JJTiAxCisjZGVmaW5lIFhNSV9UWFQgMgorI2RlZmluZSBYTUlfQ01EIDMKKyNkZWZpbmUgWE1JX1RSQSA0CisjZGVmaW5lIFhNSV9WUkIgNQorI2RlZmluZSBYTUlfUVVJIDYKKyNkZWZpbmUgWE1JX05PVyA3CisjZGVmaW5lIFhNSV9OT0UgOAorCitzdGF0aWMgc3RydWN0IGtleXRhYiB4bWl0c3dbXSA9IHsJLyogVFJBTlNNSVQgY29tbWFuZCBvcHRpb25zICovCisgICAgeyAiL2JpbmFyeSIsICAgICAgICAgIFhNSV9CSU4sIDAgfSwKKyNpZmRlZiBQSVBFU0VORAorICAgIHsgIi9jb21tYW5kIiwgICAgICAgICBYTUlfQ01ELCBDTV9JTlZ8Q01fUFNIIH0sCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyAgICB7ICIvbm9lY2hvIiwgICAgICAgICAgWE1JX05PRSwgMCB9LAorICAgIHsgIi9ub3dhaXQiLCAgICAgICAgICBYTUlfTk9XLCAwIH0sCisjaWZkZWYgUElQRVNFTkQKKyAgICB7ICIvcGlwZSIsICAgICAgICAgICAgWE1JX0NNRCwgMCB9LAorI2VuZGlmIC8qIFBJUEVTRU5EICovCisjaWZkZWYgQ09NTUVOVAorICAgIHsgIi9xdWlldCIsICAgICAgICAgICBYTUlfUVVJLCAwIH0sCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHsgIi90ZXh0IiwgICAgICAgICAgICBYTUlfVFhULCAwIH0sCisgICAgeyAiL3RyYW5zcGFyZW50IiwgICAgIFhNSV9UUkEsIDAgfSwKKyNpZmRlZiBDT01NRU5UCisgICAgeyAiL3ZlcmJvc2UiLCAgICAgICAgIFhNSV9WUkIsIDAgfSwKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgeyAiIiwgMCwgMCB9Cit9OworI2RlZmluZSBOWE1JVFNXIHNpemVvZih4bWl0c3cpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKSAtIDEKK3N0YXRpYyBpbnQgbnhtaXRzdyA9IE5YTUlUU1c7CisKKyNlbmRpZiAvKiBOT1hNSVQgKi8KKworLyogRGVjbGFyYXRpb25zIGZyb20gY2s/ZmlvLmMgbW9kdWxlICovCisKK2V4dGVybiBjaGFyICpTUEFDTUQsICpTUEFDTTI7CQkvKiBTUEFDRSBjb21tYW5kcyAqLworCisvKiBDb21tYW5kLW9yaWVudGVkIGl0ZW1zICovCisKKyNpZmRlZiBEQ01EQlVGCitleHRlcm4gY2hhciAqY21kYnVmOwkJCS8qIENvbW1hbmQgYnVmZmVycyAqLworZXh0ZXJuIGNoYXIgKmF0bWJ1ZjsKK2V4dGVybiBjaGFyICpsaW5lOwkJCS8qIENoYXJhY3RlciBidWZmZXIgZm9yIGFueXRoaW5nICovCitleHRlcm4gY2hhciAqdG1wYnVmOwkJCS8qIFNob3J0IHRlbXBvcmFyeSBzdHJpbmcgYnVmZmVyICovCitleHRlcm4gaW50ICppZmNtZDsKK2V4dGVybiBpbnQgKmludGltZTsKK2V4dGVybiBpbnQgKmlucGNhczsKKyNlbHNlCitleHRlcm4gY2hhciBjbWRidWZbXTsJCQkvKiBDb21tYW5kIGJ1ZmZlcnMgKi8KK2V4dGVybiBjaGFyIGF0bWJ1ZltdOworZXh0ZXJuIGNoYXIgbGluZVtdOwkJCS8qIENoYXJhY3RlciBidWZmZXIgZm9yIGFueXRoaW5nICovCitleHRlcm4gY2hhciB0bXBidWZbXTsJCQkvKiBUZW1wb3JhcnkgYnVmZmVyICovCitleHRlcm4gaW50IGlmY21kW107CitleHRlcm4gaW50IGludGltZVtdOworZXh0ZXJuIGludCBpbnBjYXNbXTsKKyNlbmRpZiAvKiBEQ01EQlVGICovCisKKyNpZm5kZWYgTk9TUEwKK2V4dGVybiBjaGFyICogcHJzdHJpbmdbXTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCitjaGFyICpscDsJCQkJLyogUG9pbnRlciB0byBsaW5lIGJ1ZmZlciAqLworCisjaWZuZGVmIE5PU1BMCitpbnQgdW5rbWFjcm8gPSAwOwkJCS8qIEZsYWcgZm9yIGluIE9OX1VOS05PV05fQ09NTUFORCAqLworaW50IG9sZGV2YWwgPSAwOworY2hhciBldmFsYnVmWzMzXTsJCQkvKiBFVkFMVUFURSByZXN1bHQgKi8KK2V4dGVybiBjaGFyICogaW5wYnVmOwkJCS8qIEJ1ZmZlciBmb3IgSU5QVVQgYW5kIFJFSU5QVVQgKi8KK2NoYXIgKmlucGJwOwkJCQkvKiBBbmQgcG9pbnRlciB0byBzYW1lICovCitleHRlcm4gY2hhciBsYmxidWZbXTsJCQkvKiBCdWZmZXIgZm9yIGxhYmVscyAqLworaW50IG1fZm91bmQ7CQkJCS8qIE1JTlBVVCByZXN1bHQgKi8KK2ludCBpX2FjdGl2ZSA9IDA7CQkJLyogSU5QVVQgY29tbWFuZCBpcyBhY3RpdmUgKi8KK2NoYXIgKm1zW01JTlBNQVhdOwkJCS8qIFBvaW50ZXJzIHRvIE1JTlBVVCBzdHJpbmdzICovCitzdGF0aWMgaW50IG1wW01JTlBNQVhdOwkJCS8qIGFuZCBmbGFncyAqLworZXh0ZXJuIGludCBmbmRpYWdzLCBmbmVycm9yLCBmbnN1Y2Nlc3M7CS8qIEZ1bmN0aW9uIGRpYWdub3N0aWNzICovCisjaWZuZGVmIE5PU0VYUAorY2hhciAqIGxhc3RzZXhwID0gTlVMTDsJCQkvKiBTLUV4cHJlc3Npb25zICovCitjaGFyICogc2V4cHZhbCA9IE5VTEw7CitpbnQgc2V4cGVjaG8gPSBTRVRfQVVUTzsKKyNlbmRpZiAvKiBOT1NFWFAgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCitjaGFyIHBzYXZlW1BST01QVExdID0geyBOVUwgfTsJCS8qIEZvciBzYXZpbmcgJiByZXN0b3JpbmcgcHJvbXB0ICovCisKK2V4dGVybiBpbnQgc3VjY2VzczsJCQkvKiBDb21tYW5kIHN1Y2Nlc3MvZmFpbHVyZSBmbGFnICovCitleHRlcm4gaW50IGNtZGx2bDsJCQkvKiBDdXJyZW50IHBvc2l0aW9uIGluIGNvbW1hbmQgc3RhY2sgKi8KKworI2lmbmRlZiBOT1NQTAoraW50CQkJCQkvKiBTRVQgSU5QVVQgcGFyYW1ldGVycy4gKi8KKy8qIE5vdGUsIElOUFVUIFRJTUVPVVQsIGludGltZVtdLCBpcyBvbiB0aGUgY29tbWFuZC1sZXZlbCBzdGFjay4gKi8KKyAgaW5idWZzaXplID0gMCwJCQkvKiBJTlBVVCBidWZmZXIgc2l6ZSAqLworICBpbmRlZiA9IDEsCQkJCS8qIGRlZmF1bHQgdGltZW91dCwgc2Vjb25kcyAqLworICBpbmVjaG8gPSAxLAkJCQkvKiAxID0gZWNobyBvbiAqLworICBpbmF1dG9kbCA9IDAsCQkJCS8qIElOUFVUIGF1dG9kb3dubG9hZCAqLworICBpbmludHIgPSAxLAkJCQkvKiBJTlBVVCBpbnRlcnJ1cGlvbiBhbGxvd2VkICovCisgIGlubm9tYXRjaCA9IDAsCQkJLyogSU5QVVQgL05PTUFUQ0ggKi8KKyAgaW5zaWxlbmNlID0gMDsJCQkvKiAwID0gbm8gc2lsZW5jZSBjb25zdHJhaW50ICovCisKKyNpZmRlZiBDS0ZMT0FUCitDS0ZMT0FUIGluc2NhbGUgPSAxLjA7CQkJLyogVGltZW91dCBzY2FsZSBmYWN0b3IgKi8KKyNlbmRpZgkvKiBDS0ZMT0FUICovCisKKyNpZmRlZiBPUzIKK2ludCBpbnRlcm0gPSAxOwkJCQkvKiBUZXJtaW5hbCBlbXVsYXRvciBkaXNwbGF5cyBpbnB1dCAqLworI2VuZGlmIC8qIE9TMiAqLworaW50IG1hY2x2bCA9IC0xOwkJCS8qIE1hY3JvIG5lc3RpbmcgbGV2ZWwgKi8KK2ludCBtZWNobyA9IDA7CQkJCS8qIE1hY3JvIGVjaG8sIDAgPSBkb24ndCAqLworY2hhciB2YXJuYW1bNl07CQkJCS8qIEZvciB2YXJpYWJsZSBuYW1lcyAqLworZXh0ZXJuIGludCBtYWNhcmdjW107CQkJLyogQVJHQyBmcm9tIG1hY3JvIGludm9jYXRpb24gKi8KKworZXh0ZXJuIGNoYXIgKm1fYXJnW01BQ0xFVkVMXVtOQVJHU107CS8qIFN0YWNrIG9mIG1hY3JvIGFyZ3VtZW50cyAqLworZXh0ZXJuIGNoYXIgKm1ydmFsW107CisKK2V4dGVybiBjaGFyICoqYV9wdHJbXTsJCQkvKiBBcnJheSBwb2ludGVycyAqLworZXh0ZXJuIGludCBhX2RpbVtdOwkJCS8qIEFycmF5IGRpbWVuc2lvbnMgKi8KK2V4dGVybiBpbnQgYV9saW5rW107CisKKyNpZmRlZiBEQ01EQlVGCitleHRlcm4gc3RydWN0IGNtZHB0ciAqY21kc3RrOwkJLyogVGhlIGNvbW1hbmQgc3RhY2sgaXRzZWxmICovCisjZWxzZQorZXh0ZXJuIHN0cnVjdCBjbWRwdHIgY21kc3RrW107CQkvKiBUaGUgY29tbWFuZCBzdGFjayBpdHNlbGYgKi8KKyNlbmRpZiAvKiBEQ01EQlVGICovCisKK2xvbmcgY2tfYWxhcm0gPSAwOwkJCS8qIFNFVCBBTEFSTSB2YWx1ZSAqLworY2hhciBhbHJtX2RhdGVbMjRdID0geyAnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJyB9OworY2hhciBhbHJtX3RpbWVbMjRdID0geyAnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcgfTsKKworI2RlZmluZSBJTlBTV19OT00gMQorc3RydWN0IGtleXRhYiBpbnB1dHN3W10gPSB7CisgICAgeyAiL25vbWF0Y2giLCBJTlBTV19OT00sIDAgfQorfTsKK3N0YXRpYyBpbnQgbmlucHV0c3cgPSBzaXplb2YoaW5wdXRzdykvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpOworCisjZW5kaWYgLyogTk9TUEwgKi8KKworc3RhdGljIGludCB4LCB5LCB6ID0gMDsJCQkvKiBMb2NhbCB3b3JrZXJzICovCitzdGF0aWMgY2hhciAqczsKKworI2lmZGVmIENLX01JTlBVVAorc3RhdGljIGNoYXIgYzFjaGFyc1tdID0gewkJLyogQzEgY29udHJvbCBjaGFycyBlc2NlcHQgTlVMICovCisgICAgMDAxLDAwMiwwMDMsMDA0LDAwNSwwMDYsMDA3LDAxMCwwMTEsMDEyLDAxMywwMTQsMDE1LDAxNiwwMTcsMDIwLAorICAgIDAyMSwwMjIsMDIzLDAyNCwwMjUsMDI2LDAyNywwMzAsMDMxLDAzMiwwMzMsMDM0LDAzNSwwMzYsMDM3Cit9OworI2VuZGlmIC8qIENLX01JTlBVVCAqLworCisjZGVmaW5lIHhzeXN0ZW0ocykgenN5c2NtZChzKQorCisvKiBUb3AtTGV2ZWwgSW50ZXJhY3RpdmUgQ29tbWFuZCBLZXl3b3JkIFRhYmxlICovCisvKiBLZXl3b3JkcyBtdXN0IGJlIGluIGxvd2VyY2FzZSBhbmQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLiAqLworCitzdHJ1Y3Qga2V5dGFiIGNtZHRhYltdID0geworI2lmbmRlZiBOT1BVU0gKKyAgICB7ICIhIiwJICAgWFhTSEUsIENNX0lOVnxDTV9QU0ggfSwgLyogU2hlbGwgZXNjYXBlICovCisjZWxzZQorICAgIHsgIiEiLAkgICBYWE5PVEFWLCBDTV9JTlZ8Q01fUFNIIH0sCisjZW5kaWYgLyogTk9QVVNIICovCisgICAgeyAiIyIsICAgIAkgICBYWENPTSwgQ01fSU5WIH0sCS8qIENvbW1lbnQgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICB7ICIoIiwgICAgICAgICAgIFhYU0VYUCxDTV9JTlYgfSwJLyogUy1FeHByZXNzaW9uICovCisgICAgeyAiLiIsICAgICAgICAgICBYWERFRiwgQ01fSU5WIH0sCS8qIEFzc2lnbm1lbnQgKi8KKyAgICB7ICI6IiwgICAgICAgICAgIFhYTEJMLCBDTV9JTlYgfSwJLyogTGFiZWwgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmZGVmIENLX1JFRElSCisjaWZuZGVmIE5PUFVTSAorICAgIHsgIjwiLCAgICAgICAgICAgWFhGVU4sIENNX0lOVnxDTV9QU0ggfSwgLyogUkVESVJFQ1QgKi8KKyNlbHNlCisgICAgeyAiPCIsICAgICAgICAgICBYWE5PVEFWLCBDTV9JTlZ8Q01fUFNIIH0sIC8qIFJFRElSRUNUICovCisjZW5kaWYgLyogTk9QVVNIICovCisjZW5kaWYgLyogQ0tfUkVESVIgKi8KKyNpZm5kZWYgTk9QVVNICisgICAgeyAiQCIsICAgICAgICAgICBYWFNIRSwgQ01fSU5WfENNX1BTSCB9LCAvKiBEQ0wgZXNjYXBlICovCisjZWxzZQorICAgIHsgIkAiLCAgICAgICAgICAgWFhOT1RBViwgQ01fSU5WfENNX1BTSCB9LCAvKiBEQ0wgZXNjYXBlICovCisjZW5kaWYgLyogTk9QVVNIICovCisKKyNpZmRlZiBDS19SRUNBTEwKKyAgICB7ICJeIiwgICAgICAgICAgIFhYUkVETyxDTV9JTlZ8Q01fTk9SIH0sIC8qIFN5bm9ueW0gZm9yIFJFRE8gKi8KKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJfYXNnIiwgICAgICAgIFhYQVNYLCAgIENNX0lOViB9LAkvKiBVc2VkIGludGVybmFsbHkgYnkgRk9SLCBldGMgKi8KKyAgICB7ICJfYXNzaWduIiwgICAgIFhYQVNYLCAgIENNX0lOViB9LAkvKiBVc2VkIGludGVybmFsbHkgYnkgRk9SLCBldGMgKi8KKyAgICB7ICJfZGVjcmVtZW50IiwgIFhYX0RFQ1IsIENNX0lOViB9LAorICAgIHsgIl9kZWZpbmUiLCAgICAgWFhERlgsICAgQ01fSU5WIH0sCS8qIFVzZWQgaW50ZXJuYWxseSBieSBGT1IsIGV0YyAqLworICAgIHsgIl9ldmFsdWF0ZSIsICAgWFhfRVZBTCwgQ01fSU5WIH0sCisgICAgeyAiX2ZvcndhcmQiLCAgICBYWFhGV0QsICBDTV9JTlYgfSwJLyogVXNlZCBpbnRlcm5hbGx5IGJ5IFNXSVRDSCAgICovCisgICAgeyAiX2dldGFyZ3MiLCAgICBYWEdUQSwgICBDTV9JTlYgfSwJLyogVXNlZCBpbnRlcm5hbGx5IGJ5IEZPUiwgZXRjICovCisgICAgeyAiX2luY3JlbWVudCIsICBYWF9JTkNSLCBDTV9JTlYgfSwKKyAgICB7ICJfcHV0YXJncyIsICAgIFhYUFRBLCAgIENNX0lOViB9LAkvKiBVc2VkIGludGVybmFsbHkgYnkgRk9SLCBldGMgKi8KKyAgICB7ICJfdW5kZWZpbmUiLCAgIFhYVU5ERlgsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICB7ICJhYm91dCIsICAgICAgIFhYVkVSLCAgIENNX0lOViB9LAkvKiBTeW5vbnltIGZvciBWRVJTSU9OICovCisjaWZuZGVmIE5PU1BMCisjaWZkZWYgTkVXRlRQCisgICAgeyAiYWNjb3VudCIsICAgICBYWEFDQ1QsICBDTV9JTlYgfSwgLyogKEZUUCkgQWNjb3VudCAqLworI2VuZGlmIC8qIE5FV0ZUUCAqLworI2lmZGVmIEFERENNRAorICAgIHsgImFkZCIsICAgICAgICAgWFhBREQsIDAgfSwJLyogQUREICovCisjZW5kaWYgLyogQUREQ01EICovCisjaWZuZGVmIE5PRElBTAorICAgIHsgImFuc3dlciIsICAgICAgWFhBTlNXLCBDTV9MT0MgfSwJLyogQU5TV0VSIHRoZSBwaG9uZSAqLworI2Vsc2UKKyAgICB7ICJhbnN3ZXIiLCAgICAgIFhYTk9UQVYsIENNX0lOVnxDTV9MT0MgfSwgLyogQU5TV0VSIHRoZSBwaG9uZSAqLworI2VuZGlmIC8qIE5PRElBTCAqLworICAgIHsgImFwYyIsICAgICAgICAgWFhBUEMsIDAgfSwJLyogQXBwbGljYXRpb24gUHJvZ3JhbSBDb21tYW5kICovCisjaWZuZGVmIE5PU1BMCisgICAgeyAiYXJyYXkiLCAgICAgICBYWEFSUkFZLCAwIH0sCS8qIEFycmF5IG9wZXJhdGlvbnMgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHsgImFzY2lpIiwgICAgICAgWFhBU0MsIENNX0lOViB9LAkvKiA9PSBTRVQgRklMRSBUWVBFIFRFWFQgKi8KKyAgICB7ICJhc2ciLCAgICAgICAgIFhYQVNTLCBDTV9JTlYgfSwJLyogSW52aXNpYmxlIHN5bm9ueW0gZm9yIEFTU0lHTiAqLworICAgIHsgImFzayIsICAgICAgICAgWFhBU0ssIDAgfSwJLyogQVNLIGZvciB0ZXh0LCBhc3NpZ24gdG8gdmFyaWFibGUgKi8KKyAgICB7ICJhc2txIiwgICAgICAgIFhYQVNLUSwwIH0sCS8qIEFTSyBxdWlldGx5IChubyBlY2hvKSAqLworI2lmbmRlZiBOT1NQTAorICAgIHsgImFzcyIsICAgICAgICAgWFhBU1MsIENNX0lOVnxDTV9BQlIgfSwgLyogQVNTSUdOICovCisgICAgeyAiYXNzZXJ0IiwgICAgICBYWEFTU0VSLCBDTV9JTlYgfSwJLyogQVNTRVJUICovCisgICAgeyAiYXNzaWduIiwgICAgICBYWEFTUywgMCB9LAkvKiBBU1NJR04gKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBOT1hGRVIKKyNpZm5kZWYgTk9DU0VUUworICAgIHsgImFzc29jaWF0ZSIsICAgWFhBU1NPQywgMCB9LAkvKiBBU1NPQ0lBVEUgKi8KKyNlbHNlCisgICAgeyAiYXNzb2NpYXRlIiwgICBYWE5PVEFWLCBDTV9JTlYgfSwJLyogQVNTT0NJQVRFICovCisjZW5kaWYgLyogTk9DU0VUUyAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICB7ICJhdXRoZW50aWNhdGUiLFhYQVVUSCwgMCB9LAkvKiBBdXRoZW50aWNhdGlvbiAqLworI2Vsc2UKKyAgICB7ICJhdXRoZW50aWNhdGUiLFhYQVVUSCwgQ01fSU5WIH0sCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworI2VuZGlmIC8qIE5PU1BMICovCisjaWZuZGVmIE5PRlJJTExTCisgICAgeyAiYmFjayIsICAgICAgICBYWEJBQ0ssIDAgfSwJLyogQkFDSyB0byBwcmV2aW91cyBkaXJlY3RvcnkgKi8KKyNlbHNlCisgICAgeyAiYmFjayIsICAgICAgICBYWE5PVEFWLENNX0lOViB9LAorI2VuZGlmIC8qIE5PRlJJTExTICovCisgICAgeyAiYmVlcCIsICAgICAgICBYWEJFRVAsQ01fSU5WIH0sCS8qIEJFRVAgKi8KKyNpZm5kZWYgTk9YRkVSCisgICAgeyAiYmluYXJ5IiwgICAgICBYWEJJTiwgQ01fSU5WIH0sCS8qID09IFNFVCBGSUxFIFRZUEUgQklOQVJZICovCisjZW5kaWYgLyogTk9YRkVSICovCisjaWZuZGVmIE5PRlJJTExTCisgICAgeyAiYnVnIiwgICAgICAgICBYWEJVRywgQ01fSU5WIH0sCS8qIEJVRyByZXBvcnQgaW5zdHJ1Y3Rpb25zICovCisjZWxzZQorICAgIHsgImJ1ZyIsICAgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyNpZmRlZiBCUk9XU0VSCisgICAgeyAiYnJvd3NlIiwgICAgICBYWEJST1dTLCBDTV9QU0h8Q01fTE9DIH0sIC8qIEJST1dTRSAoc3RhcnQgYnJvd3NlcikgKi8KKyNlbHNlCisgICAgeyAiYnJvd3NlIiwgICAgICBYWE5PVEFWLCBDTV9JTlZ8Q01fUFNIfENNX0xPQyB9LAorI2VuZGlmIC8qIEJST1dTRVIgKi8KKyNpZm5kZWYgTk9YRkVSCisgICAgeyAiYnllIiwgICAgICAgICBYWEJZRSwgMCB9LAkvKiBCWUUgdG8gcmVtb3RlIHNlcnZlciAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworI2lmbmRlZiBOT0xPQ0FMCisgICAgeyAiYyIsICAgICAgICAgICBYWENPTiwgQ01fSU5WfENNX0FCUnxDTV9MT0MgfSwgLyogKENPTk5FQ1QpICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgImNhdCIsICAgICAgICAgWFhDQVQsIENNX0lOViB9LAkvKiBJbnZpc2libGUgc3lub255bSBmb3IgVFlQRSAqLworI2VuZGlmIC8qIE5PRlJJTExTICovCisjaWZuZGVmIE5PU1BMCisKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAiY2F1dGlvdXMiLCAgICBYWENBVSwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgeyAiY2QiLCAgICAgICAgICBYWENXRCwgMCB9LAkvKiBDaGFuZ2UgRGlyZWN0b3J5ICovCisgICAgeyAiY2R1cCIsICAgICAgICBYWENEVVAsIENNX0lOViB9LAkvKiBDaGFuZ2UgRGlyZWN0b3J5IFVwICovCisKKyNpZm5kZWYgTk9YRkVSCisjaWZkZWYgUElQRVNFTkQKKyAgICB7ICJjZ2V0IiwgICAgICAgIFhYQ0dFVCwgQ01fSU5WfENNX1BTSCB9LCAvKiBDR0VUICovCisjZWxzZQorICAgIHsgImNnZXQiLCAgICAgICAgWFhOT1RBViwgQ01fSU5WfENNX1BTSCB9LCAvKiBDR0VUICovCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICB7ICJjaCIsICAgICAgICAgIFhYQ0hLLCAgIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJjaGVjayIsICAgICAgIFhYQ0hLLCAgIDAgfSwJLyogQ0hFQ0sgZm9yIGEgZmVhdHVyZSAqLworI2lmZGVmIENLX1BFUk1TCisjaWZkZWYgVU5JWAorICAgIHsgImNobW9kIiwgICAgICAgWFhDSE1PRCwgMCB9LAkvKiBDSE1PRCAqLworI2Vsc2UKKyAgICB7ICJjaG1vZCIsICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIFVOSVggKi8KKyNlbHNlCisgICAgeyAiY2htb2QiLCAgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBDS19QRVJNUyAqLworI2lmZGVmIENLUk9PVAorICAgIHsgImNocm9vdCIsICAgICAgWFhDSFJULCAgQ01fSU5WIH0sCS8qIENIUk9PVCAqLworI2VuZGlmIC8qIENLUk9PVCAqLworICAgIHsgImNrZXJtaXQiLCAgICAgWFhLRVJNSSwgQ01fSU5WIH0sCS8qIENLRVJNSVQgKGxpa2UgS0VSTUlUKSAqLworICAgIHsgImNsIiwgICAgICAgICAgWFhDTE8sICAgQ01fQUJSfENNX0lOViB9LAorI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgImNsZWFyIiwgICAgICAgWFhDTEUsIDAgfSwJLyogQ0xFQVIgaW5wdXQgYW5kL29yIGRldmljZSBidWZmZXIgKi8KKyNlbHNlCisgICAgeyAiY2xlYXIiLCAgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworICAgIHsgImNsb3NlIiwJICAgICBYWENMTywgMCB9LAkvKiBDTE9TRSBhIGxvZyBvciBvdGhlciBmaWxlICovCisgICAgeyAiY2xzIiwgICAgICAgICBYWENMUywgQ01fSU5WIH0sCS8qIENsZWFyIFNjcmVlbiAoQ0xTKSAqLworICAgIHsgImNvbW1lbnQiLCAgICAgWFhDT00sIENNX0lOViB9LAkvKiBJbnRyb2R1Y2UgYSBjb21tZW50ICovCisjaWZuZGVmIE5PTE9DQUwKKyAgICB7ICJjb25uZWN0IiwgICAgIFhYQ09OLCBDTV9MT0MgfSwJLyogQmVnaW4gdGVybWluYWwgY29ubmVjdGlvbiAqLworI2Vsc2UKKyAgICB7ICJjb25uZWN0IiwgICAgIFhYTk9UQVYsIENNX0xPQyB9LAorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICB7ICJjb250aW51ZSIsICAgIFhYQ09OVCwgIENNX0lOViB9LAkvKiBDT05USU5VRSAqLworI2lmbmRlZiBOT0ZSSUxMUworI2lmZGVmIFpDT1BZCisgICAgeyAiY28iLCAgICAgICAgICBYWENQWSwgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgImNvcCIsICAgICAgICAgWFhDUFksIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJjb3B5IiwgICAgICAgIFhYQ1BZLCAwIH0sCS8qIENPUFkgYSBmaWxlICovCisjZWxzZQorICAgIHsgImNvcHkiLCAgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogWkNPUFkgKi8KKyAgICB7ICJjb3B5cmlnaHQiLCAgIFhYQ1BSLCBDTV9JTlYgfSwJLyogQ09QWVJJR0hUICovCisjaWZkZWYgWkNPUFkKKyAgICB7ICJjcCIsICAgICAgICAgIFhYQ1BZLCBDTV9JTlYgfSwJLyogQ09QWSBhIGZpbGUgKi8KKyNlbmRpZiAvKiBaQ09QWSAqLworI2lmbmRlZiBOT0xPQ0FMCisjaWZuZGVmIE9TMgorICAgIHsgImNxIiwgICAgICAgICAgWFhDUSwgQ01fSU5WfENNX0xPQyB9LCAvKiBDUSAoY29ubmVjdCBxdWlldGx5KSAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZm5kZWYgTk9YRkVSCisjaWZkZWYgUElQRVNFTkQKKyAgICB7ICJjcmVjZWl2ZSIsICAgIFhYQ1JFQyxDTV9JTlZ8Q01fUFNIIH0sIC8qIFJFQ0VJVkUgdG8gYSBjb21tYW5kICovCisgICAgeyAiY3NlbmQiLCAgICAgICBYWENTRU4sQ01fSU5WfENNX1BTSCB9LCAvKiBTRU5EIGZyb20gY29tbWFuZCAqLworI2Vsc2UKKyAgICB7ICJjcmVjZWl2ZSIsICAgIFhYTk9UQVYsQ01fSU5WfENNX1BTSCB9LAorICAgIHsgImNzZW5kIiwgICAgICAgWFhOT1RBVixDTV9JTlZ8Q01fUFNIIH0sCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisgICAgeyAiY3dkIiwJICAgICBYWENXRCwgICBDTV9JTlYgfSwJLyogVHJhZGl0aW9uYWwgc3lub255bSBmb3IgY2QgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIHsgImRhdGUiLCAgICAgICAgWFhEQVRFLCAgMCB9LAkvKiBEQVRFICovCisgICAgeyAiZGNsIiwgICAgICAgICBYWERDTCwgICBDTV9JTlYgfSwJLyogREVDTEFSRSBhbiBhcnJheSAoc2VlIEFSUkFZKSAqLworICAgIHsgImRlYnVnIiwgICAgICAgWFhERUJVRywgQ01fSU5WIH0sCisgICAgeyAiZGVjbGFyZSIsICAgICBYWERDTCwgICBDTV9JTlYgfSwJLyogREVDTEFSRSBhbiBhcnJheSAoc2VlIEFSUkFZKSAqLworICAgIHsgImRlY3JlbWVudCIsICAgWFhERUMsICAgMCB9LAkvKiBERUNSRU1FTlQgYSBudW1lcmljIHZhcmlhYmxlICovCisgICAgeyAiZGVmaW5lIiwgICAgICBYWERFRiwgICAwIH0sCS8qIERFRklORSBhIG1hY3JvIG9yIHZhcmlhYmxlICovCisjZWxzZQorICAgIHsgImRhdGUiLCAgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisgICAgeyAiZGNsIiwgICAgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyAgICB7ICJkZWNsYXJlIiwgICAgIFhYTk9UQVYsIENNX0lOViB9LAorICAgIHsgImRlY3JlbWVudCIsICAgWFhOT1RBViwgQ01fSU5WIH0sCisgICAgeyAiZGVmaW5lIiwgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PRlJJTExTCisgICAgeyAiZGVsZXRlIiwgICAgICBYWERFTCwgMCB9LAkvKiBERUxFVEUgYSBmaWxlICovCisjZWxzZQorICAgIHsgImRlbGV0ZSIsICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworI2lmbmRlZiBOT0RJQUwKKyAgICB7ICJkaWFsIiwgICAgICAgIFhYRElBTCwgIENNX0xPQyB9LAkvKiBESUFMIGEgcGhvbmUgbnVtYmVyICovCisjZWxzZQorICAgIHsgImRpYWwiLCAgICAgICAgWFhOT1RBViwgQ01fSU5WfENNX0xPQyB9LAorI2VuZGlmIC8qIE5PRElBTCAqLworCisjaWZkZWYgTlQKKyAgICB7ICJkaWFsZXIiLCAgICAgIFhYRElBTEVSLCBDTV9JTlYgfSwgLyogSzk1IERpYWxlciAqLworI2VuZGlmIC8qIE5UICovCisKKyAgICB7ICJkaXJlY3RvcnkiLCAgIFhYRElSLCAwIH0sCS8qIERJUkVDVE9SWSBvZiBmaWxlcyAqLworCisjaWZuZGVmIE5PRlJJTExTCisjaWZuZGVmIE5PU0VSVkVSCisgICAgeyAiZGlzYWJsZSIsICAgICBYWERJUywgMCB9LAkvKiBESVNBQkxFIGEgc2VydmVyIGZ1bmN0aW9uICovCisjZWxzZQorICAgIHsgImRpc2FibGUiLCAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisjaWZuZGVmIE5PU1BMCisgICAgeyAiZG8iLCAgICAgICAgICBYWERPLCAgMCB9LAkvKiBETyAoZXhlY3V0ZSkgYSBtYWNybyAqLworI2Vsc2UKKyAgICB7ICJkbyIsICAgICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICB7ICJlIiwgICAgICAgICAgIFhYRVhJLCBDTV9JTlZ8Q01fQUJSIH0sCisKKyNpZm5kZWYgTk9GUklMTFMKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAiZS1wYWNrZXQiLCAgICBYWEVSUiwgQ01fSU5WIH0sCS8qIFNlbmQgYW4gRXJyb3ItUGFja2V0ICovCisjZW5kaWYgLyogTk9YRkVSICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworICAgIHsgImVjaG8iLCAgICAgICAgWFhFQ0gsIDAgfSwJLyogRUNITyB0ZXh0ICovCisKKyNpZm5kZWYgTk9GUklMTFMKKyNpZm5kZWYgTk9QVVNICisgICAgeyAiZWRpdCIsICAgICAgICBYWEVESVQsIENNX1BTSCB9LAkvKiBFRElUICovCisjZWxzZQorICAgIHsgImVkaXQiLCAgICAgICAgWFhOT1RBViwgQ01fSU5WfENNX1BTSCB9LCAvKiBFRElUICovCisjZW5kaWYgLyogTk9QVVNIICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworICAgIHsgImVpZ2h0Yml0IiwgICAgWFhFSUdIVCwgQ01fSU5WIH0sCS8qIEVJR0hUQklUICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJlbHNlIiwgICAgICAgIFhYRUxTLCBDTV9JTlYgfSwJLyogRUxTRSBwYXJ0IG9mIElGIHN0YXRlbWVudCAqLworI2Vsc2UKKyAgICB7ICJlbHNlIiwgICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAkvKiBFTFNFIHBhcnQgb2YgSUYgc3RhdGVtZW50ICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT1NFUlZFUgorI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgImVuYWJsZSIsICAgICAgWFhFTkEsICAwIH0sCS8qIEVOQUJMRSBhIHNlcnZlciBmdW5jdGlvbiAqLworI2Vsc2UKKyAgICB7ICJlbmFibGUiLCAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PRlJJTExTICovCisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIHsgImVuZCIsICAgICAgICAgWFhFTkQsICAwIH0sCS8qIEVORCBjb21tYW5kIGZpbGUgb3IgbWFjcm8gKi8KKyNlbHNlCisgICAgeyAiZW5kIiwgICAgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgeyAiZXJhc2UiLCAgICAgICBYWERFTCwgQ01fSU5WIH0sCS8qIFN5bm9ueW0gZm9yIERFTEVURSAqLworCisjaWZuZGVmIE5PU1BMCisgICAgeyAiZXZhbHVhdGUiLCAgICBYWEVWQUwsIDAgfSwJLyogRVZBTFVBVEUgKi8KKyNlbHNlCisgICAgeyAiZXZhbHVhdGUiLCAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgeyAiZXgiLCAgICAgICAgICBYWEVYSSwgQ01fSU5WfENNX0FCUiB9LCAvKiBMZXQgImV4IiBzdGlsbCBiZSBFWElUICovCisKKyNpZmRlZiBDS0VYRUMKKyAgICB7ICJleGVjIiwgICAgICAgIFhYRVhFQywgQ01fSU5WfENNX0xPQyB9LCAvKiBleGVjKCkgKi8KKyNlbHNlCisgICAgeyAiZXhlYyIsICAgICAgICBYWE5PVEFWLCBDTV9JTlZ8Q01fTE9DIH0sCisjZW5kaWYgLyogQ0tFWEVDICovCisKKyAgICB7ICJleGl0IiwJICAgWFhFWEksIDAgfSwJCS8qIEVYSVQgZnJvbSBDLUtlcm1pdCAqLworICAgIHsgImV4dGVuZGVkLW9wdGlvbnMiLCBYWFhPUFRTLENNX0lOVnxDTV9ITFAgfSwgLyogRXh0ZW5kZWQtT3B0aW9ucyAqLworCisjaWZkZWYgT1MyCisgICAgeyAiZXh0cHJvYyIsICAgICBYWENPTSwgQ01fSU5WIH0sCS8qIER1bW15IGNvbW1hbmQgZm9yIE9TLzIgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJmIiwgICAgICAgICAgIFhYRklOLCBDTV9JTlZ8Q01fQUJSIH0sIC8qIEludmlzaWJsZSBhYmJyZXYgZm9yIEZJTiAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PU1BMCisgICAgeyAiZmFpbCIsICAgICAgICBYWEZBSUwsIENNX0lOViB9LAkvKiBGQUlMICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAiZmFzdCIsICAgICAgICBYWEZBU1QsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgQ0tDSEFOTkVMSU8KKyAgICB7ICJmY2xvc2UiLCAgICAgIFhYRl9DTCwgQ01fSU5WIH0sCS8qIEZDTE9TRSAqLworICAgIHsgImZjb3VudCIsICAgICAgWFhGX0NPLCBDTV9JTlYgfSwJLyogRkNPVU5UICovCisgICAgeyAiZmZsdXNoIiwgICAgICBYWEZfRkwsIENNX0lOViB9LAkvKiBGRkxVU0ggKi8KKyNlbmRpZiAvKiBDS0NIQU5ORUxJTyAqLworCisjaWZuZGVmIE5PWEZFUgorICAgIHsgImZpIiwgICAgICAgICAgWFhGSU4sIENNX0lOVnxDTV9BQlIgfSwgLyogRklOSVNIICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBDS0NIQU5ORUxJTworICAgIHsgImZpbGUiLCAgICAgICAgWFhGSUxFLCAwIH0sCS8qIEZJTEUgKi8KKyNlbmRpZiAvKiBDS0NIQU5ORUxJTyAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAiZmluIiwgICAgICAgICBYWEZJTiwgQ01fSU5WfENNX0FCUiB9LCAvKiBGSU5JU0ggKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBVTklYT1JPU0sKKyAgICB7ICJmaW5kIiwgICAgICAgIFhYR1JFUCwgMCB9LAkvKiBGSU5EIChncmVwKSAqLworI2Vsc2UKKyAgICB7ICJmaW5kIiwgICAgICAgIFhYR1JFUCxDTV9JTlYgfSwKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJmaW5pc2giLCAgICAgIFhYRklOLCAwIH0sCS8qIEZJTklTSCAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgVENQU09DS0VUCisgICAgeyAiZmlyZXdhbGwiLCAgICBYWEZJUkVXLCBDTV9JTlZ8Q01fSExQIH0sCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZmRlZiBDS0NIQU5ORUxJTworICAgIHsgImZsaXN0IiwgICAgICAgWFhGX0xJLCBDTV9JTlYgfSwJLyogRkxJU1QgKi8KKyAgICB7ICJmb3BlbiIsICAgICAgIFhYRl9PUCwgQ01fSU5WIH0sCS8qIEZPUEVOICovCisjZW5kaWYgLyogQ0tDSEFOTkVMSU8gKi8KKworI2lmbmRlZiBOT1NQTAorICAgIHsgImZvIiwgICAgICAgICAgWFhGT1IsIENNX0lOVnxDTV9BQlIgfSwgLyogSW52aXNpYmxlIGFiYnJldiBmb3IuLi4gKi8KKyAgICB7ICJmb3IiLCAgICAgICAgIFhYRk9SLCAwIH0sCS8qIEZPUiBsb29wICovCisgICAgeyAiZm9yd2FyZCIsICAgICBYWEZXRCwgQ01fSU5WIH0sCS8qIEZPUldBUkQgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgImZvdCIsCSAgIFhYRElSLCBDTV9JTlYgfSwJLyogImZvdCIgPSAiZGlyIiAoZm9yIENocmlzKSAqLworI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyNpZmRlZiBDS0NIQU5ORUxJTworICAgIHsgImZyZWFkIiwgICAgICBYWEZfUkUsIENNX0lOViB9LAkvKiBGUkVBRCAqLworICAgIHsgImZyZXdpbmQiLCAgICBYWEZfUlcsIENNX0lOViB9LAkvKiBGUkVXSU5EICovCisgICAgeyAiZnNlZWsiLCAgICAgIFhYRl9TRSwgQ01fSU5WIH0sCS8qIEZTRUVLICovCisgICAgeyAiZnN0YXR1cyIsICAgIFhYRl9TVCwgQ01fSU5WIH0sCS8qIEZTVEFUVVMgKi8KKyNlbmRpZiAvKiBDS0NIQU5ORUxJTyAqLworCisjaWZkZWYgVENQU09DS0VUCisjaWZuZGVmIE5PRlRQCisjaWZkZWYgU1lTRlRQCisjaWZuZGVmIE5PUFVTSAorICAgIHsgImZ0cCIsCSAgIFhYRlRQLCAgIENNX0lOVnxDTV9QU0h8Q01fTE9DIH0sIC8qIFN5c3RlbSBGVFAgKi8KKyNlbHNlCisgICAgeyAiZnRwIiwJICAgWFhOT1RBViwgQ01fSU5WfENNX1BTSHxDTV9MT0MgfSwKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNlbHNlICAvKiBTWVNGVFAgKi8KKyAgICB7ICJmdHAiLAkgICBYWEZUUCwgICAwIH0sCS8qIEJ1aWx0LWluIEZUUCAqLworI2VuZGlmIC8qIFNZU0ZUUCAqLworI2Vsc2UgIC8qIE5PRlRQICovCisgICAgeyAiZnRwIiwJICAgWFhOT1RBViwgQ01fSU5WIH0sCS8qIE5vIEZUUCAqLworI2VuZGlmIC8qIE5PRlRQICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJmdW5jdGlvbiIsICAgIFhYRlVOQywgQ01fSU5WfENNX0hMUCB9LCAvKiAoZm9yIEhFTFAgRlVOQ1RJT04pICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIENLQ0hBTk5FTElPCisgICAgeyAiZndyaXRlIiwgICAgICBYWEZfV1IsIENNX0lOViB9LAkvKiBGV1JJVEUgKi8KKyNlbmRpZiAvKiBDS0NIQU5ORUxJTyAqLworCisjaWZuZGVmIE5PWEZFUgorICAgIHsgImciLCAgICAgICAgICAgWFhHRVQsIENNX0lOVnxDTV9BQlIgfSwgLyogSW52aXNpYmxlIGFiYnJldiBmb3IgR0VUICovCisjaWZuZGVmIE5PU1BMCisgICAgeyAiZ2UiLCAgICAgICAgICBYWEdFVCwgQ01fSU5WfENNX0FCUiB9LCAvKiBEaXR0byAqLworI2VuZGlmIC8qIE5PU1BMICovCisgICAgeyAiZ2V0IiwgICAgICAgICBYWEdFVCwgMCB9LAkvKiBHRVQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJnZXRjIiwgICAgICAgIFhYR0VUQywgMCB9LAkvKiBHRVRDICovCisjaWZkZWYgT1MyCisgICAgeyAiZ2V0a2V5Y29kZSIsICBYWEdFVEssIDAgfSwJLyogR0VUS0VZQ09ERSAqLworI2VuZGlmIC8qIE9TMiAqLworI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgImdldG9rIiwgICAgICAgWFhHT0ssIDAgfSwJLyogR0VUT0sgKGFzayBmb3IgWWVzL05vL09LKSAqLworI2VuZGlmIC8qIE5PRlJJTExTICovCisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJnb3RvIiwgICAgICAgIFhYR09UTywwIH0sCS8qIEdPVE8gbGFiZWwgaW4gdGFrZSBmaWxlIG9yIG1hY3JvICovCisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZmRlZiBVTklYT1JPU0sKKyAgICB7ICJncmVwIiwgICAgICAgIFhYR1JFUCwwIH0sCS8qIEdSRVAgKGZpbmQpICovCisjZWxzZQorICAgIHsgImdyZXAiLCAgICAgICAgWFhHUkVQLENNX0lOViB9LAkvKiBHUkVQIChmaW5kKSAqLworI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworICAgIHsgImgiLCAgICAgICAgICAgWFhITFAsIENNX0lOVnxDTV9BQlIgfSwgLyogSW52aXNpYmxlIHN5bm9ueW0gZm9yIEhFTFAgKi8KKyAgICB7ICJoZSIsICAgICAgICAgIFhYSExQLCBDTV9JTlZ8Q01fQUJSIH0sIC8qIEludmlzaWJsZSBzeW5vbnltIGZvciBIRUxQICovCisjaWZuZGVmIE5PRlJJTExTCisgICAgeyAiaGVhZCIsICAgICAgICBYWEhFQUQsIDAgfSwKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2lmbmRlZiBOT0xPQ0FMCisgICAgeyAiaGFuZ3VwIiwgICAgICBYWEhBTiwgQ01fTE9DIH0sCS8qIEhBTkdVUCB0aGUgY29ubmVjdGlvbiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICB7ICJIRUxQIiwgICAgICAgIFhYSExQLCAwIH0sCS8qIERpc3BsYXkgSEVMUCB0ZXh0ICovCisjaWZuZGVmIE5PSFRUUAorI2lmZGVmIFRDUFNPQ0tFVAorICAgIHsgImh0dHAiLCAgICAgICAgWFhIVFRQLCAwIH0sCS8qIEhUVFAgb3BlcmF0aW9ucyAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2VuZGlmIC8qIE5PSFRUUCAqLworI2lmbmRlZiBOT1NQTAorICAgIHsgImkiLCAgICAgICAgICAgWFhJTlAsIENNX0lOVnxDTV9BQlIgfSwgLyogSW52aXNpYmxlIHN5bm9ueW0gZm9yIElOUFVUICovCisgICAgeyAiaWYiLCAgICAgICAgICBYWElGLCAgMCB9LAkgICAgIC8qIElGICggY29uZGl0aW9uICkgY29tbWFuZCAqLworI2lmZGVmIFRDUFNPQ0tFVAorICAgIHsgImlrc2QiLCAgICAgICAgWFhJS1NELCBDTV9JTlYgfSwJICAgICAvKiBNYWtlIGNvbm5lY3Rpb24gdG8gSUtTRCAqLworI2Vsc2UKKyAgICB7ICJpa3NkIiwgICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworICAgIHsgImluIiwgICAgICAgICAgWFhJTlAsIENNX0lOVnxDTV9BQlIgfSwgLyogSW52aXNpYmxlIHN5bm9ueW0gZm9yIElOUFVUICovCisgICAgeyAiaW5jcmVtZW50IiwgICBYWElOQywgMCB9LAkvKiBJbmNyZW1lbnQgYSBudW1lcmljIHZhcmlhYmxlICovCisgICAgeyAiaW5wdXQiLCAgICAgICBYWElOUCwgMCB9LAkvKiBJTlBVVCB0ZXh0IGZyb20gY29tbSBkZXZpY2UgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PSEVMUAorICAgIHsgImludCIsICAgICAgICAgWFhJTlQsIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJpbnRyIiwgICAgICAgIFhYSU5ULCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiSU5UUk8iLCAgICAgICBYWElOVCwgMCB9LAorICAgIHsgImludHJvZHVjdGlvbiIsWFhJTlQsIENNX0lOViB9LAkvKiBQcmludCBpbnRyb2R1Y3RvcnkgdGV4dCAqLworI2Vsc2UKKyAgICB7ICJpbnRybyIsICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorICAgIHsgImludHJvZHVjdGlvbiIsWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9IRUxQICovCisKKyNpZmRlZiBPUzIKKyAgICB7ICJrOTUiLCAgICAgICAgIFhYS0VSTUksIENNX0lOViB9LAkvKiBIbW1tIHdoYXQncyB0aGlzLi4uICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJrY2QiLCAgICAgICAgIFhYS0NELCAgIDAgICAgICB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICB7ICJrZXJtaXQiLCAgICAgIFhYS0VSTUksIENNX0lOViB9LAorCisjaWZkZWYgT1MyCisjaWZuZGVmIE5PS1ZFUkJTCisgICAgeyAia3ZlcmIiLCAgICAgICBYWEtWUkIsIENNX0lOVnxDTV9ITFAgfSwgLyogS2V5Ym9hcmQgdmVyYiAqLworI2VuZGlmIC8qIE5PS1ZFUkJTICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgTk9GUklMTFMKKyAgICB7ICJsIiwgICAgICAgICAgIFhYTE9HLCBDTV9JTlZ8Q01fQUJSIH0sIC8qIEludmlzaWJsZSBzeW5vbnltIGZvciBsb2cgKi8KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisgICAgeyAibGNkIiwgICAgICAgICBYWExDV0QsIENNX0lOViB9LAorICAgIHsgImxjZHVwIiwgICAgICAgWFhMQ0RVLCBDTV9JTlYgfSwKKyAgICB7ICJsY3dkIiwgICAgICAgIFhYTENXRCwgQ01fSU5WIH0sCisgICAgeyAibGRlbGV0ZSIsICAgICBYWExERUwsIENNX0lOViB9LAorICAgIHsgImxkaXJlY3RvcnkiLCAgWFhMRElSLCBDTV9JTlYgfSwKKworI2lmZGVmIENLTEVBUk4KKyAgICB7ICJsZWFybiIsICAgICAgIFhYTEVBUk4sIDAgfSwJLyogTEVBUk4gLSBhdXRvbWF0aWMgc2NyaXB0IHdyaXRpbmcgKi8KKyNlbHNlCisgICAgeyAibGVhcm4iLCAgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBDS0xFQVJOICovCisKKyAgICB7ICJsaSIsICAgICAgICAgIFhYTE5PVVQsIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJMSUNFTlNFIiwgICAgIFhYQ1BSLCAwIH0sCS8qIExJQ0VOU0UgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIHsgImxpbmVvdXQiLCAgICAgWFhMTk9VVCwgMCB9LAkvKiBMSU5FT1VUID0gT1VUUFVUICsgZW9sICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIE5UCisgICAgeyAibGluayIsICAgICAgICBYWExJTkssIDAgfSwgICAgICAgLyogTElOSyBzb3VyY2UgZGVzdGluYXRpb24gKi8KKyNlbmRpZiAvKiBOVCAqLworCisgICAgeyAibG1rZGlyIiwgICAgICBYWExNS0QsIENNX0lOViB9LAorCisjaWZuZGVmIE5PRlJJTExTCisgICAgeyAibG8iLCAgICAgICAgICBYWExPRywgIENNX0lOVnxDTV9BQlIgfSwgLyogSW52aXNpYmxlIHN5bm9ueW0gZm9yIGxvZyAqLworI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJsb2NhbCIsICAgICAgIFhYTE9DQUwsIENNX0lOViB9LAkvKiBMT0NBTCB2YXJpYWJsZSBkZWNsYXJhdGlvbiAqLworI2Vsc2UKKyAgICB7ICJsb2NhbCIsICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICB7ICJsb2ciLCAgCSAgICAgWFhMT0csIDAgfSwJLyogT3BlbiBhIGxvZyBmaWxlICovCisKKyAgICB7ICJsb2dpbiIsICAgICAgIFhYTE9HSU4sICAwIH0sCS8qIChSRU1PVEUpIExPR0lOIHRvIHNlcnZlciBvciBJS1NEICovCisgICAgeyAibG9nb3V0IiwgICAgICBYWExPR09VVCwgMCB9LAkvKiBMT0dPVVQgZnJvbSBzZXJ2ZXIgb3IgSUtTRCAqLworCisjaWZuZGVmIE5PRlJJTExTCisjaWZuZGVmIE5PRElBTAorICAgIHsgImxvb2t1cCIsICAgICAgWFhMT09LLCAgMCB9LAkvKiBMT09LVVAgKi8KKyNlbHNlCisgICAgeyAibG9va3VwIiwgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKworICAgIHsgImxwd2QiLCAgICAgICAgWFhMUFdELCBDTV9JTlYgfSwKKyAgICB7ICJscmVuYW1lIiwgICAgIFhYTFJFTiwgQ01fSU5WIH0sCisgICAgeyAibHJtZGlyIiwgICAgICBYWExSTUQsIENNX0lOViB9LAorCisjaWZkZWYgVU5JWE9ST1NLCisgICAgeyAibHMiLCAgICAgICAgICBYWExTLCAgQ01fSU5WfENNX1BTSCB9LCAvKiBVTklYIGxzIGNvbW1hbmQgKi8KKyNlbHNlCisgICAgeyAibHMiLCAgICAgICAgICBYWERJUiwgQ01fSU5WIH0sCS8qIEludmlzaWJsZSBzeW5vbnltIGZvciBESVIgKi8KKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyNpZm5kZWYgTk9YRkVSCisgICAgeyAibWFpbCIsICAgICAgICBYWE1BSSwgMCB9LAkvKiBTZW5kIGEgZmlsZSBhcyBlLW1haWwgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNpZm5kZWYgTk9IRUxQCisgICAgeyAibWFudWFsIiwgICAgICBYWE1BTiwgQ01fUFNIIH0sCS8qIE1BTihVQUwpICovCisjZWxzZQorICAgIHsgIm1hbnVhbCIsICAgICAgWFhOT1RBViwgQ01fSU5WfENNX1BTSCB9LAorI2VuZGlmIC8qIE5PSEVMUCAqLworI2VuZGlmIC8qIE5PRlJJTExTICovCisjaWZkZWYgQ0tfTUtESVIKKyAgICB7ICJtZCIsICAgICAgICAgIFhYTUtESVIsIENNX0lOViB9LAkvKiBTeW5vbnltIGZvciBNS0RJUiAqLworI2VuZGlmIC8qIENLX01LRElSICovCisjaWZkZWYgQ0tfTUlOUFVUCisgICAgeyAibWlucHV0IiwgICAgICBYWE1JTlAsIDAgfSwJLyogTUlOUFVUICovCisjZWxzZQorICAgIHsgIm1pbnB1dCIsICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogQ0tfTUlOUFVUICovCisjaWZuZGVmIE5PTVNFTkQKKyAgICB7ICJtZ2V0IiwgICAgICAgIFhYTUdFVCwgMCB9LAkvKiBNR0VUICovCisjZWxzZQorICAgIHsgIm1nZXQiLCAgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9NU0VORCAqLworI2lmZGVmIENLX01LRElSCisgICAgeyAibWtkaXIiLCAgICAgICBYWE1LRElSLCAwIH0sCS8qIE1LRElSICovCisjZWxzZQorICAgIHsgIm1rZGlyIiwgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogQ0tfTUtESVIgKi8KKworI2lmbmRlZiBOT1hGRVIKKyNpZm5kZWYgTk9NU0VORAorICAgIHsgIm1tb3ZlIiwgICAgICAgWFhNTU9WRSwgMCB9LAkvKiBNTU9WRSAqLworI2Vsc2UKKyAgICB7ICJtbW92ZSIsICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PTVNFTkQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgIm1vcmUiLCAgICAgICAgWFhNT1JFLCBDTV9JTlYgfSwJLyogTU9SRSAqLworI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAibW92ZSIsICAgICAgICBYWE1PVkUsIDAgfSwJLyogTU9WRSAgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIHsgIm1wYXVzZSIsICAgICAgWFhNU0wsIENNX0lOViB9LAkvKiBNaWxsaXNlY29uZCBzbGVlcCAqLworI2Vsc2UKKyAgICB7ICJtcGF1c2UiLCAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9YRkVSCisjaWZuZGVmIE5PTVNFTkQKKyAgICB7ICJtcHV0IiwgICAgICAgIFhYTVNFLCBDTV9JTlYgfSwJLyogTVBVVCA9IE1TRU5EICovCisgICAgeyAibXMiLCAgICAgICAgICBYWE1TRSwgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgIm1zZW5kIiwgICAgICAgWFhNU0UsIDAgfSwJLyogTXVsdGlwbGUgU0VORCAqLworI2Vsc2UKKyAgICB7ICJtcHV0IiwgICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorICAgIHsgIm1zZW5kIiwgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9NU0VORCAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworI2lmbmRlZiBOT1NQTAorICAgIHsgIm1zbGVlcCIsICAgICAgWFhNU0wsIDAgfSwJLyogTWlsbGlzZWNvbmQgc2xlZXAgKi8KKyNlbHNlCisgICAgeyAibXNsZWVwIiwgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgIm12IiwgICAgICAgICAgWFhSRU4sIENNX0lOViB9LAkvKiBTeW5vbnltIGZvciByZW5hbWUgKi8KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2lmbmRlZiBOT0hFTFAKKyAgICB7ICJuZXdzIiwgICAgICAgIFhYTkVXLCBDTV9JTlYgfSwJLyogRGlzcGxheSBORVdTIG9mIG5ldyBmZWF0dXJlcyAqLworI2Vsc2UKKyAgICB7ICJuZXdzIiwgICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PSEVMUCAqLworICAgIHsgIm5vbG9jYWwiLCAgICAgWFhOTENMLCBDTV9JTlYgfSwJLyogRGlzYWJsZSBTRVQgTElORSAvIFNFVCBIT1NUICovCisgICAgeyAibm9wdXNoIiwgICAgICBYWE5QU0gsIENNX0lOViB9LAkvKiBEaXNhYmxlIFBVU0ggY29tbWFuZC9mZWF0dXJlcyAqLworI2lmZGVmIE9TMgorICAgIHsgIm5vc2Nyb2xsIiwgICAgWFhOU0NSLCBDTV9JTlYgfSwgIC8qIERpc2FibGUgc2Nyb2xsIG9wZXJhdGlvbnMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJvIiwgICAgICAgICAgIFhYT1VULCBDTV9JTlZ8Q01fQUJSIH0sIC8qIEludmlzaWJsZSBzeW5vbnltIGZvciBPVVRQVVQgKi8KKyAgICB7ICJvcGVuIiwgICAgICAgIFhYT1BFLCAwIH0sCS8qIE9QRU4gZmlsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nICovCisjZWxzZQorICAgIHsgIm9wZW4iLCAgICAgICAgWFhPUEUsIENNX0lOViB9LAkvKiBPUEVOICovCisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZm5kZWYgTk9IRUxQCisgICAgeyAib3B0aW9ucyIsICAgICBYWE9QVFMsQ01fSU5WfENNX0hMUCB9LCAvKiBPcHRpb25zICovCisjZW5kaWYgLyogTk9IRUxQICovCisgICAgeyAib3JpZW50YXRpb24iLCBYWE9SSUUsIDAgfSwKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJvdXRwdXQiLCAgICAgIFhYT1VULCAwIH0sCS8qIE9VVFBVVCB0ZXh0IHRvIGNvbW0gZGV2aWNlICovCisjZWxzZQorICAgIHsgIm91dHB1dCIsICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZmRlZiBBTllYMjUKKyNpZm5kZWYgSUJNWDI1CisgICAgeyAicGFkIiwgICAgICAgICBYWFBBRCwgQ01fTE9DIH0sCS8qIFguMyBQQUQgY29tbWFuZHMgKi8KKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNlbmRpZiAvKiBBTllYMjUgKi8KKworI2lmZGVmIE5FV0ZUUAorICAgIHsgInBhc3NpdmUiLCAgICAgWFhQQVNWLCBDTV9JTlYgfSwJLyogKEZUUCkgUEFTU0lWRSAqLworI2VuZGlmIC8qIE5FV0ZUUCAqLworCisjaWZuZGVmIE5PSEVMUAorICAgIHsgInBhdHRlcm5zIiwgICAgWFhQQVQsQ01fSU5WfENNX0hMUCB9LCAvKiBQYXR0ZXJuIHN5bnRheCAqLworI2VuZGlmIC8qIE5PSEVMUCAqLworCisjaWZuZGVmIE5PU1BMCisgICAgeyAicGF1c2UiLCAgICAgICBYWFBBVSwgMCB9LAkvKiBTbGVlcCBmb3Igc3BlY2lmaWVkIGludGVydmFsICovCisjZWxzZQorICAgIHsgInBhdXNlIiwgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZm5kZWYgTk9ESUFMCisgICAgeyAicGRpYWwiLCAgICAgICBYWFBESUEsICBDTV9MT0MgfSwJLyogUERJQUwgKHBhcnRpYWwgZGlhbCkgKi8KKyNlbHNlCisgICAgeyAicGRpYWwiLCAgICAgICBYWE5PVEFWLCBDTV9JTlZ8Q01fTE9DIH0sCisjZW5kaWYgLyogTk9ESUFMICovCisjaWZkZWYgVENQU09DS0VUCisjaWZuZGVmIE5PUFVTSAorICAgIHsgInBpbmciLCAgICAgICAgWFhQTkcsIENNX0lOVnxDTV9QU0h8Q01fTE9DIH0sIC8qIFBJTkcgKi8KKyNlbHNlCisgICAgeyAicGluZyIsICAgICAgICBYWE5PVEFWLCBDTV9JTlZ8Q01fUFNIfENNX0xPQyB9LAorI2VuZGlmIC8qIE5PUFVTSCAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2lmZGVmIE5FVENNRAorI2lmbmRlZiBOT1BVU0gKKyAgICB7ICJwaXBlIiwgICAgICAgIFhYUElQRSwgQ01fUFNIIH0sCS8qIFBJUEUgKi8KKyNlbHNlCisgICAgeyAicGlwZSIsICAgICAgICBYWE5PVEFWLCBDTV9JTlZ8Q01fUFNIIH0sIC8qIFBJUEUgKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNlbmRpZiAvKiBORVRDTUQgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIHsgInBvcCIsICAgICAgICAgWFhFTkQsIENNX0lOViB9LAkvKiBJbnZpc2libGUgc3lub255bSBmb3IgRU5EICovCisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZm5kZWYgTk9GUklMTFMKKyAgICB7ICJwcmludCIsICAgICAgIFhYUFJJLCAwIH0sCS8qIFBSSU5UIGEgZmlsZSBsb2NhbGx5ICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworICAgIHsgInByb21wdCIsICAgICAgWFhQUk9NUCwgQ01fSU5WIH0sCS8qIEdvIGludGVyYWN0aXZlIChmcm9tIHNjcmlwdCkgKi8KKworI2lmbmRlZiBOT1hGRVIKKyNpZmRlZiBDS19SRVNFTkQKKyAgICB7ICJwc2VuZCIsICAgICAgIFhYUFNFTiwgQ01fSU5WIH0sCS8qIFBTRU5EICovCisjZWxzZQorICAgIHsgInBzZW5kIiwgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBORVRQVFkKKyAgICB7ICJwdHkiLCAgICAgICAgIFhYUFRZLCBDTV9QU0ggfSwJLyogUFRZICovCisjZWxzZQorICAgIHsgInB0eSIsICAgICAgICAgWFhOT1RBViwgQ01fSU5WfENNX1BTSCB9LAorI2VuZGlmIC8qIE5FVFBUWSAqLworCisjaWZuZGVmIE5PUFVTSAorICAgIHsgInB1IiwgICAgICAgICAgWFhTSEUsIENNX0lOVnxDTV9BQlJ8Q01fUFNIIH0sIC8qIFBVID0gUFVTSCAqLworI2VuZGlmIC8qIE5PUFVTSCAqLworCisjaWZkZWYgQ0tQVVJHRQorICAgIHsgInB1cmdlIiwgICAgICAgWFhQVVJHRSwgMCB9LAkvKiBQVVJHRSAocmVhbCkgKi8KKyNlbHNlCisjaWZkZWYgVk1TCisgICAgeyAicHVyZ2UiLCAgICAgICBYWFBVUkdFLCAwIH0sCS8qIFBVUkdFIChmYWtlKSAqLworI2Vsc2UKKyAgICB7ICJwdXJnZSIsICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIENLUFVSR0UgKi8KKworI2lmbmRlZiBOT1BVU0gKKyAgICB7ICJwdXNoIiwgICAgICAgIFhYU0hFLCBDTV9QU0ggfSwJLyogUFVTSCBjb21tYW5kIChsaWtlIFJVTiwgISkgKi8KKyNlbHNlCisgICAgeyAicHVzaCIsICAgICAgICBYWE5PVEFWLCBDTV9JTlZ8Q01fUFNIIH0sCisjZW5kaWYgLyogTk9QVVNIICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAicHV0IiwgICAgICAgICBYWFNFTiwgQ01fSU5WIH0sCS8qIFBVVCA9IFNFTkQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworICAgIHsgInB3ZCIsICAgICAgICAgWFhQV0QsIDAgfSwJLyogUHJpbnQgV29ya2luZyBEaXJlY3RvcnkgKi8KKyAgICB7ICJxIiwgICAgICAgICAgIFhYUVVJLCBDTV9JTlZ8Q01fQUJSIH0sIC8qIEludmlzaWJsZSBzeW5vbnltIGZvciBRVUlUICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAicXVlcnkiLCAgICAgICBYWFJRVUUsQ01fSU5WIH0sCS8qICg9IFJFTU9URSBRVUVSWSkgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworICAgIHsgInF1aXQiLCAgICAgICAgWFhRVUksIDAgfSwJLyogUVVJVCBmcm9tIHByb2dyYW0gPSBFWElUICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAiciIsICAgICAgICAgICBYWFJFQywgQ01fSU5WfENNX0FCUiB9LCAvKiBJbnYgc3lub255bSBmb3IgUkVDRUlWRSAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PWEZFUgorICAgIHsgInJhc2ciLCAgICAgICAgWFhSQVNHLCBDTV9JTlYgfSwJLyogUkVNT1RFIEFTU0lHTiAqLworICAgIHsgInJhc3NpZ24iLCAgICAgWFhSQVNHLCBDTV9JTlYgfSwJLyogZGl0dG8gKi8KKyAgICB7ICJyY2QiLCAgICAgICAgIFhYUkNXRCwgQ01fSU5WIH0sCS8qIFJFTU9URSBDRCAqLworICAgIHsgInJjZHVwIiwgICAgICAgWFhSQ0RVUCxDTV9JTlYgfSwJLyogUkVNT1RFIENEICovCisgICAgeyAicmNvcHkiLCAgICAgICBYWFJDUFksIENNX0lOViB9LAkvKiBSRU1PVEUgQ09QWSAqLworICAgIHsgInJjd2QiLCAgICAgICAgWFhSQ1dELCBDTV9JTlYgfSwJLyogUkVNT1RFIENXRCAqLworICAgIHsgInJkZWxldGUiLCAgICAgWFhSREVMLCBDTV9JTlYgfSwJLyogUkVNT1RFIERFTEVURSAqLworICAgIHsgInJkaXJlY3RvcnkiLCAgWFhSRElSLCBDTV9JTlYgfSwJLyogUkVNT0RFIERJUkVDVE9SWSAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PU1BMCisgICAgeyAicmVhZCIsICAgICAgICBYWFJFQSwgMCB9LAkvKiBSRUFEIGEgbGluZSBmcm9tIGEgZmlsZSAqLworI2Vsc2UKKyAgICB7ICJyZWFkIiwgICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAicmVjZWl2ZSIsICAgICBYWFJFQywgMCB9LAkvKiBSRUNFSVZFIGZpbGVzICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9ESUFMCisgICAgeyAicmVkIiwgICAgICAgICBYWFJFRCwgQ01fSU5WfENNX0FCUnxDTV9MT0MgfSwgLyogSW52IHN5biBmb3IgUkVESUFMICovCisgICAgeyAicmVkaSIsICAgICAgICBYWFJFRCwgQ01fSU5WfENNX0FCUnxDTV9MT0MgfSwgLyogZGl0dG8gKi8KKyAgICB7ICJyZWRpYWwiLCAgICAgIFhYUkVELCBDTV9MT0MgfSwJLyogUkVESUFMIGxhc3QgRElBTCBudW1iZXIgKi8KKyNlbHNlCisgICAgeyAicmVkIiwgICAgICAgICBYWE5PVEFWLCBDTV9JTlZ8Q01fTE9DIH0sCisgICAgeyAicmVkaSIsICAgICAgICBYWE5PVEFWLCBDTV9JTlZ8Q01fTE9DIH0sCisgICAgeyAicmVkaWFsIiwgICAgICBYWE5PVEFWLCBDTV9JTlZ8Q01fTE9DIH0sCisjZW5kaWYgLyogTk9ESUFMICovCisKKyNpZmRlZiBDS19SRURJUgorI2lmZGVmIE9TMgorI2lmbmRlZiBOT1BVU0gKKyAgICB7ICJyZWRpcmVjdCIsICAgIFhYRlVOLCBDTV9JTlZ8Q01fUFNIIH0sIC8qIFJFRElSRUNUICovCisjZWxzZQorICAgIHsgInJlZGlyZWN0IiwgICAgWFhOT1RBViwgQ01fSU5WfENNX1BTSCB9LAorI2VuZGlmIC8qIE5PUFVTSCAqLworI2Vsc2UgLyogT1MyICovCisjaWZuZGVmIE5PUFVTSAorICAgIHsgInJlZGlyZWN0IiwgICAgWFhGVU4sIENNX1BTSCB9LAkvKiBSRURJUkVDVCAqLworI2Vsc2UKKyAgICB7ICJyZWRpcmVjdCIsICAgIFhYTk9UQVYsIENNX0lOVnxDTV9QU0ggfSwKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDS19SRURJUiAqLworCisjaWZkZWYgQ0tfUkVDQUxMCisgICAgeyAicmVkbyIsICAgICAgICBYWFJFRE8sICBDTV9OT1IgfSwJLyogUkVETyAqLworI2Vsc2UKKyAgICB7ICJyZWRvIiwgICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworCisjaWZuZGVmIE5PWEZFUgorI2lmZGVmIENLX1JFU0VORAorICAgIHsgInJlZ2V0IiwgICAgICAgWFhSRUdFVCwgMCB9LAkvKiBSRUdFVCAqLworI2Vsc2UKKyAgICB7ICJyZWdldCIsICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIENLX1JFU0VORCAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PU1BMCisgICAgeyAicmVpbnB1dCIsICAgICBYWFJFSSwgQ01fSU5WIH0sCS8qIFJFSU5QVVQgKGZyb20gSU5QVVQgYnVmZmVyKSAqLworI2Vsc2UKKyAgICB7ICJyZWlucHV0IiwgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9YRkVSCisjaWZkZWYgQUREQ01ECisgICAgeyAicmVtIiwgICAgICAgICBYWFJFTSwgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgInJlbW8iLCAgICAgICAgWFhSRU0sIENNX0lOVnxDTV9BQlIgfSwKKyNlbmRpZiAvKiBBRERDTUQgKi8KKyAgICB7ICJyZW1vdGUiLAkgICAgIFhYUkVNLCAwIH0sCS8qIFNlbmQgUkVNT1RFIGNvbW1hbmQgdG8gc2VydmVyICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBBRERDTUQKKyAgICB7ICJyZW1vdmUiLCAgICAgIFhYUkVNViwwIH0sCS8qIFJFTU9WRSAoc29tZXRoaW5nIGZyb20gYSBsaXN0KSAqLworI2Vsc2UKKyAgICB7ICJyZW1vdmUiLCAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIEFERENNRCAqLworCisjaWZuZGVmIE5PRlJJTExTCisjaWZuZGVmIE5PUkVOQU1FCisgICAgeyAicmVuYW1lIiwgICAgICBYWFJFTiwgMCB9LAkvKiBSRU5BTUUgYSBsb2NhbCBmaWxlICovCisjZWxzZQorICAgIHsgInJlbmFtZSIsICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9SRU5BTUUgKi8KKyAgICB7ICJyZXBsYXkiLCAgICAgIFhYVFlQLCBDTV9JTlYgfSwJLyogUkVQTEFZIChmb3Igbm93LCBqdXN0IHR5cGUpICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworI2lmbmRlZiBOT1hGRVIKKyNpZmRlZiBDS19SRVNFTkQKKyAgICB7ICJyZXMiLCAgICAgICAgIFhYUlNFTiwgQ01fSU5WfENNX0FCUiB9LCAvKiBSRVNFTkQgKi8KKyAgICB7ICJyZXNlIiwgICAgICAgIFhYUlNFTiwgQ01fSU5WfENNX0FCUiB9LCAvKiBSRVNFTkQgKi8KKyAgICB7ICJyZXNlbmQiLCAgICAgIFhYUlNFTiwgMCB9LAkvKiBSRVNFTkQgKi8KKyNlbHNlCisgICAgeyAicmVzIiwgICAgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyAgICB7ICJyZXNlIiwgICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorICAgIHsgInJlc2VuZCIsICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyAgICB7ICJyZXNldCIsICAgICAgIFhYUkVTRVQsIENNX0lOViB9LAkvKiBSRVNFVCAqLworCisjaWZkZWYgQ0tfUkVTRU5ECisjaWZuZGVmIE5PU1BMCisgICAgeyAicmV0IiwgICAgICAgICBYWFJFVCwgQ01fSU5WfENNX0FCUiB9LAorI2VuZGlmIC8qIE5PU1BMICovCisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAicmV0cmlldmUiLCAgICBYWFJFVFIsIENNX0lOViB9LAkvKiBSRVRSSUVWRSAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PU1BMCisgICAgeyAicmV0dXJuIiwgICAgICBYWFJFVCwgMCB9LAkvKiBSRVRVUk4gZnJvbSBhIGZ1bmN0aW9uICovCisjZWxzZQorICAgIHsgInJldHVybiIsICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJyZXhpdCIsICAgICAgIFhYUlhJVCwgQ01fSU5WIH0sCS8qIFJFTU9URSBFWElUICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBDS19SRVhYCisjaWZuZGVmIE5PUFVTSAorICAgIHsgInJleHgiLCAgICAgICAgWFhSRVhYLCBDTV9QU0ggfSwJLyogRXhlY3V0ZSBhIFJleHggY29tbWFuZCAqLworI2Vsc2UKKyAgICB7ICJyZXh4IiwgICAgICAgIFhYTk9UQVYsIENNX0lOVnxDTV9QU0ggfSwKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNlbmRpZiAvKiBDS19SRVhYICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAicmhlbHAiLCAgICAgICBYWFJITFAsIENNX0lOViB9LAkvKiBSRU1PVEUgSEVMUCAqLworICAgIHsgInJob3N0IiwgICAgICAgWFhSSE9TLCBDTV9JTlYgfSwJLyogUkVNT1RFIEhPU1QgKi8KKyAgICB7ICJya2VybWl0IiwgICAgIFhYUktFUiwgQ01fSU5WIH0sCS8qIFJFTU9URSBLRVJNSVQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIFRDUFNPQ0tFVAorICAgIHsgInJsb2dpbiIsICAgICAgWFhSTE9HLCBDTV9MT0MgfSwJLyogTWFrZSBhbiBSbG9naW4gY29ubmVjdGlvbiAqLworI2Vsc2UKKyAgICB7ICJybG9naW4iLCAgICAgIFhYTk9UQVYsIENNX0lOVnxDTV9MT0MgfSwKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgInJtIiwgICAgICAgICAgWFhERUwsIENNX0lOViB9LAkvKiBJbnZpc2libGUgc3lub255bSBmb3IgZGVsZXRlICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworI2lmZGVmIENLX01LRElSCisgICAgeyAicm1kaXIiLCAgICAgICBYWFJNRElSLCAwIH0sCS8qIFJNRElSICovCisjZWxzZQorICAgIHsgInJtZGlyIiwgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogQ0tfTUtESVIgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJybWtkaXIiLCAgICAgIFhYUk1LRCwgQ01fSU5WIH0sCS8qIFJFTU9URSBNS0RJUiAqLworI2lmbmRlZiBOT1NQTAorICAgIHsgInJvYnVzdCIsICAgICAgWFhST0IsICBDTV9JTlYgfSwKKyNlbHNlCisgICAgeyAicm9idXN0IiwgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHsgInJwcmludCIsICAgICAgWFhSUFJJLCBDTV9JTlYgfSwgIC8qIFJFTU9URSBQUklOVCAqLworICAgIHsgInJwd2QiLCAgICAgICAgWFhSUFdELCBDTV9JTlYgfSwJLyogUkVNT1RFIFBXRCAqLworICAgIHsgInJxdWVyeSIsICAgICAgWFhSUVVFLCBDTV9JTlYgfSwJLyogUkVNT1RFIFFVRVJZICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZmRlZiBDS19SRUNBTEwKKyAgICB7ICJyciIsICAgICAgICAgIFhYUkVETywgQ01fSU5WfENNX05PUiB9LAorI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworCisjaWZuZGVmIE5PWEZFUgorICAgIHsgInJyZW5hbWUiLCAgICBYWFJSRU4sIENNX0lOViB9LAkvKiBSRU1PVEUgUkVOQU1FICovCisgICAgeyAicnJtZGlyIiwgICAgIFhYUlJNRCwgQ01fSU5WIH0sCS8qIFJFTU9URSBSRU1ESVIgKi8KKyAgICB7ICJyc2V0IiwgICAgICAgWFhSU0VULCBDTV9JTlYgfSwJLyogUkVNT1RFIFNFVCAqLworICAgIHsgInJzcGFjZSIsICAgICBYWFJTUEEsIENNX0lOViB9LAkvKiBSRU1PVEUgU1BBQ0UgKi8KKyAgICB7ICJydHlwZSIsICAgICAgWFhSVFlQLCBDTV9JTlYgfSwJLyogUkVNT1RFIFRZUEUgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1BVU0gKKyAgICB7ICJydW4iLCAgICAgICAgIFhYU0hFLCBDTV9QU0ggfSwJLyogUlVOIGEgcHJvZ3JhbSBvciBjb21tYW5kICovCisjZWxzZQorICAgIHsgInJ1biIsICAgICAgICAgWFhOT1RBViwgQ01fSU5WfENNX1BTSCB9LAorI2VuZGlmIC8qIE5PUFVTSCAqLworCisjaWZuZGVmIE5PWEZFUgorICAgIHsgInJ3aG8iLCAgICAgICAgWFhSV0hPLCBDTV9JTlYgfSwJLyogUkVNT1RFIFdITyAqLworICAgIHsgInMiLCAgICAgICAgICAgWFhTRU4sIENNX0lOVnxDTV9BQlIgfSwgLyogSW52aXNpYmxlIHN5bm9ueW0gZm9yIHNlbmQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1NFVEtFWQorI2lmZGVmIE9TMgorICAgIHsgInNhdmUiLAkgICBYWFNBVkUsIDAgfSwJCS8qIFNBVkUgc29tZXRoaW5nICovCisjZWxzZQorICAgIHsgInNhdmUiLAkgICBYWFNBVkUsIENNX0lOViB9LAorI2VuZGlmIC8qIE9TMiAqLworI2Vsc2UKKyAgICB7ICJzYXZlIiwJICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKworI2lmbmRlZiBOT1NDUklQVAorICAgIHsgInNjIiwgCSAgIFhYTE9HSSwgQ01fSU5WfENNX0FCUnxDTV9MT0MgfSwKKyAgICB7ICJzY3IiLAkgICBYWExPR0ksIENNX0lOVnxDTV9BQlJ8Q01fTE9DIH0sCisjZW5kaWYgLyogTk9TQ1JJUFQgKi8KKyAgICB7ICJzY3JlZW4iLCAgICAgIFhYU0NSTiwgMCB9LAkvKiBTQ1JFRU4gYWN0aW9ucyAqLworI2lmbmRlZiBOT1NDUklQVAorICAgIHsgInNjcmlwdCIsCSAgIFhYTE9HSSwgQ01fTE9DIH0sCS8qIEV4cGVjdC1TZW5kLXN0eWxlIHNjcmlwdCBsaW5lICovCisjZWxzZQorICAgIHsgInNjcmlwdCIsCSAgIFhYTk9UQVYsIENNX0lOVnxDTV9MT0MgfSwKKyNlbmRpZiAvKiBOT1NDUklQVCAqLworCisgICAgeyAic2VhcmNoIiwgICAgWFhHUkVQLENNX0lOViB9LAkvKiBTeW5vbnltIGZvciBHUkVQIGFuZCBGSU5EICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgeyAic2VuZCIsCSAgIFhYU0VOLCAwIH0sCQkvKiBTZW5kIChhKSBmaWxlKHMpICovCisjaWZuZGVmIE5PU0VSVkVSCisgICAgeyAic2VydmVyIiwJICAgWFhTRVIsIDAgfSwJCS8qIEJlIGEgU0VSVkVSICovCisjZWxzZQorICAgIHsgInNlcnZlciIsCSAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU0VSVkVSICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyAgICB7ICJzZXQiLAkgICBYWFNFVCwgMCB9LAkJLyogU0VUIHBhcmFtZXRlcnMgKi8KKworI2lmbmRlZiBOT1NQTAorI2lmbmRlZiBOT1NFWFAKKyAgICB7ICJzZXhwcmVzc2lvbiIsIFhYU0VYUCwgQ01fSU5WfENNX0hMUCB9LCAvKiBTRVhQUiAqLworI2VuZGlmIC8qIE5PU0VYUCAqLworCisjaWZkZWYgU0ZUUF9CVUlMVElOCisgICAgeyAic2Z0cCIsICAgICAgICBYWFNGVFAsIDAgfSwgICAvKiBTRlRQICovCisjZW5kaWYgLyogU0ZUUF9CVUlMVElOICovCisKKyNpZm5kZWYgTk9TSE9XCisgICAgeyAic2giLCAgICAgICAgICBYWFNITywgQ01fSU5WfENNX0FCUiB9LCAvKiBTSE9XIHBhcmFtZXRlcnMgKi8KKyNlbmRpZiAvKiBOT1NIT1cgKi8KKyAgICB7ICJzaGlmdCIsICAgICAgIFhYU0hJRlQsIDAgfSwJLyogU0hJRlQgYXJncyAqLworI2Vsc2UKKyAgICB7ICJzaGlmdCIsICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9TSE9XCisgICAgeyAic2hvdyIsIAkgICBYWFNITywgMCB9LAkJLyogU0hPVyBwYXJhbWV0ZXJzICovCisjZWxzZQorICAgIHsgInNob3ciLCAJICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9TSE9XICovCisKKyNpZmRlZiBORVdGVFAKKyAgICB7ICJzaXRlIiwgICAgICAgIFhYU0lURSwgQ01fSU5WIH0sCS8qIChGVFApIFNJVEUgKi8KKyNlbmRpZiAvKiBORVdGVFAgKi8KKworI2lmZGVmIFNTSEJVSUxUSU4KKyAgICB7ICJza2VybWl0IiwgICBYWFNLUk0sIDAgfSwgICAgIC8qIFNLRVJNSVQgKi8KKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisKKyNpZm5kZWYgTk9TUEwKKyNpZm5kZWYgTk9GUklMTFMKKyAgICB7ICJzbGVlcCIsICAgICAgIFhYUEFVLCBDTV9JTlYgfSwJLyogU0xFRVAgZm9yIHNwZWNpZmllZCBpbnRlcnZhbCAqLworI2VuZGlmIC8qIE5PRlJJTExTICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIHsgInNvcnQiLCAgICAgICAgWFhTT1JULCBDTV9JTlYgfSwJLyogKHNlZSBBUlJBWSkgKi8KKyNlbHNlCisgICAgeyAic29ydCIsICAgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE1BQworI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgInNwIiwgICAgICAgICAgWFhTUEEsIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJzcGEiLCAgICAgICAgIFhYU1BBLCBDTV9JTlZ8Q01fQUJSIH0sCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyAgICB7ICJzcGFjZSIsICAgICAgIFhYU1BBLCAwIH0sCS8qIFNob3cgYXZhaWxhYmxlIGRpc2sgU1BBQ0UgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKworI2lmbmRlZiBOT0ZSSUxMUworI2lmbmRlZiBOT1BVU0gKKyAgICB7ICJzcGF3biIsICAgICAgIFhYU0hFLCBDTV9JTlZ8Q01fUFNIIH0sIC8qIFN5bm9ueW0gZm9yIFBVU0gsIFJVTiAqLworI2Vsc2UKKyAgICB7ICJzcGF3biIsICAgICAgIFhYTk9UQVYsIENNX0lOVnxDTV9QU0ggfSwgLyogU3lub255bSBmb3IgUFVTSCwgUlVOICovCisjZW5kaWYgLyogTk9QVVNIICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworI2lmZGVmIEFOWVNTSAorICAgIHsgInNzaCIsICAgICAgICAgWFhTU0gsIDAgfSwKKyNlbmRpZiAvKiBBTllTU0ggKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJzdGEiLCAgICAgICAgIFhYU1RBLCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAic3RhdCIsICAgICAgICBYWFNUQSwgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgInN0YXRpc3RpY3MiLCAgWFhTVEEsIDAgfSwJLyogRGlzcGxheSBmaWxlIHRyYW5zZmVyIHN0YXRzICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyAgICB7ICJzdGF0dXMiLCAgICAgIFhYU1RBVFVTLDAgfSwJLyogU2hvdyBzdGF0dXMgb2YgcHJldmlvdXMgY29tbWFuZCAqLworCisjaWZuZGVmIE5PU1BMCisgICAgeyAic3RvcCIsICAgICAgICBYWFNUTywgICAwIH0sCS8qIFNUT1AgYWxsIHRha2UgZmlsZXMgYW5kIG1hY3JvcyAqLworICAgIHsgInN1Y2NlZWQiLCAgICAgWFhTVUNDLCAgQ01fSU5WIH0sCS8qIFNVQ0NFRUQgKi8KKyNlbHNlCisgICAgeyAic3RvcCIsICAgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyAgICB7ICJzdWNjZWVkIiwgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9GUklMTFMKKyAgICB7ICJTVVBQT1JUIiwgICAgIFhYQlVHLCAwIH0sCS8qIFRlY2ggc3VwcG9ydCBpbnN0cnVjdGlvbnMgKi8KKyNlbHNlCisgICAgeyAic3VwcG9ydCIsICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisjaWZuZGVmIE5PSkMKKyAgICB7ICJzdXNwZW5kIiwgICAgIFhYU1VTLCBDTV9QU0ggfSwJLyogU1VTUEVORCBDLUtlcm1pdCAoVU5JWCBvbmx5KSAqLworI2Vsc2UKKyAgICB7ICJzdXNwZW5kIiwgICAgIFhYTk9UQVYsIENNX0lOVnxDTV9QU0ggfSwKKyNlbmRpZiAvKiBOT0pDICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJzd2l0Y2giLCAgICAgIFhYU1dJVCwgMCB9LAkvKiBTV0lUQ0ggKi8KKyNlbHNlCisgICAgeyAic3dpdGNoIiwgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZkZWYgQ0tfVEFQSQorICAgIHsgInRhIiwJICAgWFhUQUssIENNX0lOVnxDTV9BQlIgfSwgLyogKGJlY2F1c2Ugb2YgVEFQSSkgKi8KKyNlbmRpZiAvKiBDS19UQVBJICovCisKKyNpZm5kZWYgTk9GUklMTFMKKyAgICB7ICJ0YWlsIiwgICAgICAgIFhYVEFJTCwgMCB9LAkvKiBEaXNwbGF5IGVuZCBvZiBhIGxvY2FsIGZpbGUgKi8KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisgICAgeyAidGFrZSIsCSAgIFhYVEFLLCAwIH0sCQkvKiBUQUtFIGNvbW1hbmRzIGZyb20gYSBmaWxlICovCisKKyNpZmRlZiBDS19UQVBJCisgICAgeyAidGFwaSIsCSAgIFhYVEFQSSwgQ01fTE9DIH0sCS8qIE1pY3Jvc29mdCBUQVBJIGNvbW1hbmRzICovCisjZWxzZQorICAgIHsgInRhcGkiLAkgICBYWE5PVEFWLCBDTV9JTlZ8Q01fTE9DIH0sCisjZW5kaWYgLyogQ0tfVEFQSSAqLworCisjaWZuZGVmIE5PRlJJTExTCisjaWZkZWYgVENQU09DS0VUCisgICAgeyAidGVsIiwgICAgICAgICBYWFRFTCwgQ01fSU5WfENNX0FCUnxDTV9MT0MgfSwKKyAgICB7ICJ0ZWxuZXQiLCAgICAgIFhYVEVMLCBDTV9MT0MgfSwJLyogVEVMTkVUIChUQ1AvSVAgb25seSkgKi8KKyAgICB7ICJ0ZWxvcHQiLCAgICAgIFhYVEVMT1AsIENNX0lOViB9LAkvKiBURUxPUFQgKGRpdHRvKSAqLworI2Vsc2UKKyAgICB7ICJ0ZWwiLCAgICAgICAgIFhYTk9UQVYsIENNX0lOVnxDTV9MT0MgfSwKKyAgICB7ICJ0ZWxuZXQiLCAgICAgIFhYTk9UQVYsIENNX0lOVnxDTV9MT0MgfSwKKyAgICB7ICJ0ZWxvcHQiLCAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2lmZGVmIE9TMgorICAgIHsgInRlcm1pbmFsIiwgICAgWFhURVJNLCBDTV9JTlZ8Q01fTE9DIH0sIC8qID09IFNFVCBURVJNSU5BTCBUWVBFICovCisjZWxzZQorICAgIHsgInRlcm1pbmFsIiwgICAgWFhURVJNLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJ0ZXh0IiwgICAgICAgIFhYQVNDLCBDTV9JTlYgfSwJLyogPT0gU0VUIEZJTEUgVFlQRSBURVhUICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJ0cmFjZSIsICAgICAgIFhYVFJBQ0UsIDAgfSwJLyogVFJBQ0UgKi8KKyNlbHNlCisgICAgeyAidHJhY2UiLCAgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICB7ICJ0cmFuc2xhdGUiLCAgIFhYWExBLCAwIH0sCS8qIFRSQU5TTEFURSBsb2NhbCBmaWxlIGNoYXIgc2V0cyAqLworI2Vsc2UKKyAgICB7ICJ0cmFuc2xhdGUiLCAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmbmRlZiBOT1hNSVQKKyAgICB7ICJ0cmFuc21pdCIsICAgIFhYVFJBLCAwIH0sCS8qIFNlbmQgKHVwbG9hZCkgYSBmaWxlLCBubyBwcm90b2NvbCAqLworI2Vsc2UKKyAgICB7ICJ0cmFuc21pdCIsICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PWE1JVCAqLworCisjaWZuZGVmIE5PRlJJTExTCisgICAgeyAidHlwZSIsICAgICAgICBYWFRZUCwgMCB9LAkvKiBEaXNwbGF5IGEgbG9jYWwgZmlsZSAqLworI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJ1bmRjbCIsICAgICAgIFhYVU5EQ0wsIENNX0lOViB9LAorICAgIHsgInVuZGVjbGFyZSIsICAgWFhVTkRDTCwgMCB9LAkvKiBVTkRFQ0xBUkUgYW4gYXJyYXkgKi8KKyAgICB7ICJ1bmRlZmluZSIsICAgIFhYVU5ERUYsIDAgfSwJLyogVU5ERUZJTkUgYSB2YXJpYWJsZSBvciBtYWNybyAqLworI2Vsc2UKKyAgICB7ICJ1bmRjbCIsICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorICAgIHsgInVuZGVjbGFyZSIsICAgWFhOT1RBViwgQ01fSU5WIH0sCisgICAgeyAidW5kZWZpbmUiLCAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZkZWYgTkVXRlRQCisgICAgeyAidXNlciIsICAgICAgICBYWFVTRVIsICBDTV9JTlYgfSwgLyogKEZUUCkgVVNFUiAqLworI2VuZGlmIC8qIE5FV0ZUUCAqLworCisgICAgeyAidmVyc2lvbiIsICAgICBYWFZFUiwgMCB9LAkvKiBWRVJTSU9OLW51bWJlciBkaXNwbGF5ICovCisKKyNpZmRlZiBPUzIKKyAgICB7ICJ2aWV3b25seSIsICAgIFhYVklFVywgQ01fTE9DIH0sCS8qIFZJRVdPTkxZIFRlcm1pbmFsIE1vZGUgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIHsgInZvaWQiLCAgICAgICAgWFhWT0lELCAwIH0sCS8qIFZPSUQgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIHsgIndhaXQiLCAgICAgICAgWFhXQUksIDAgfSwJLyogV0FJVCAqLworI2Vsc2UKKyAgICB7ICJ3YWl0IiwgICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICB7ICJ3ZXJtaXQiLCAgICAgIFhYS0VSTUksIENNX0lOViB9LAorCisjaWZuZGVmIE5PWEZFUgorICAgIHsgIndoZXJlIiwgICAgICAgWFhXSEVSRSwgMCB9LAkvKiBXSEVSRSAoZGlkIG15IGZpbGUgZ28/KSAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PU1BMCisgICAgeyAid2hpbGUiLCAgICAgICBYWFdISSwgMCB9LAkvKiBXSElMRSBsb29wICovCisjZWxzZQorICAgIHsgIndoaWxlIiwgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBPUzIKKyNpZm5kZWYgTUFDCisjaWZuZGVmIE5PRlJJTExTCisgICAgeyAid2hvIiwgICAgICAgICBYWFdITywgQ01fUFNIIH0sCS8qIFdITydzIGxvZ2dlZCBpbj8gKi8KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZuZGVmIE5PSEVMUAorICAgIHsgIndpbGRjYXJkcyIsICAgWFhXSUxELENNX0lOVnxDTV9ITFAgfSwgLyogV2lsZGNhcmQgc3ludGF4ICovCisjZW5kaWYgLyogTk9IRUxQICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJ3ciIsICAgICAgICAgIFhYV1JJLCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAid3JpIiwgICAgICAgICBYWFdSSSwgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgIndyaXQiLCAgICAgICAgWFhXUkksIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJ3cml0ZSIsICAgICAgIFhYV1JJLCAwIH0sCS8qIFdSSVRFIGNoYXJhY3RlcnMgdG8gYSBmaWxlICovCisgICAgeyAid3JpdGUtbGluZSIsICBYWFdSTCwgQ01fSU5WIH0sCS8qIFdSSVRFIGEgbGluZSB0byBhIGZpbGUgKi8KKyAgICB7ICJ3cml0ZWxuIiwgICAgIFhYV1JMLCBDTV9JTlYgfSwJLyogUGFzY2FsaXNjaCBzeW5vbnltIGZvciB3cml0ZS1saW5lICovCisjZWxzZQorICAgIHsgIndyIiwgICAgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisgICAgeyAid3JpIiwgICAgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyAgICB7ICJ3cml0IiwgICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorICAgIHsgIndyaXRlIiwgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisgICAgeyAid3JpdGUtbGluZSIsICBYWE5PVEFWLCBDTV9JTlYgfSwKKyAgICB7ICJ3cml0ZWxuIiwgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9GUklMTFMKKyAgICB7ICJ4ZWNobyIsICAgICAgIFhYWEVDSCwwIH0sCS8qIFhFQ0hPICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIHsgInhpZiIsICAgICAgICAgWFhJRlgsIENNX0lOViB9LAkvKiBFeHRlbmRlZCBJRiBjb21tYW5kIChvYnNvbGV0ZSkgKi8KKyNlbHNlCisgICAgeyAieGlmIiwgICAgICAgICBYWE5PVEFWLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICB7ICJ4bGF0ZSIsICAgICAgIFhYWExBLCBDTV9JTlYgfSwJLyogU3lub255bSBmb3IgVFJBTlNMQVRFICovCisjZWxzZQorICAgIHsgInhsYXRlIiwgICAgICAgWFhOT1RBViwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9DU0VUUyAqLworCisjaWZuZGVmIE5PWE1JVAorICAgIHsgInhtaXQiLCAgICAgICAgWFhUUkEsIENNX0lOViB9LAkvKiBTeW5vbnltIGZvciBUUkFOU01JVCAqLworI2Vsc2UKKyAgICB7ICJ4bWl0IiwgICAgICAgIFhYTk9UQVYsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PWE1JVCAqLworCisjaWZuZGVmIE9TMgorI2lmbmRlZiBOT0pDCisgICAgeyAieiIsICAgICAgICAgICBYWFNVUywgQ01fSU5WfENNX1BTSCB9LCAvKiBTeW5vbnltIGZvciBTVVNQRU5EICovCisjZWxzZQorICAgIHsgInoiLCAgICAgICAgICAgWFhOT1RBViwgQ01fSU5WfENNX1BTSCB9LAorI2VuZGlmIC8qIE5PSkMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIHsgInsiLCAgICAgICAgICAgWFhNQUNSTywgQ01fSU5WIH0sCS8qIEltbWVkaWF0ZSBtYWNybyAqLworI2VuZGlmIC8qIE5PU1BMICovCisgICAgeyAiIiwgMCwgMCB9Cit9OworaW50IG5jbWQgPSAoc2l6ZW9mKGNtZHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworLyogTk9URTogVG9rZW5zIG11c3QgYWxzbyBiZSBlbnRlcmVkIGFib3ZlIGludG8gY21kdGFiW10uICovCisKK2NoYXIgdG9rdGFiW10gPSB7CisjaWZuZGVmIE5PUFVTSAorICAgICchJywJCQkJLyogU2hlbGwgZXNjYXBlICovCisjZW5kaWYgLyogTk9QVVNIICovCisgICAgJyMnLAkJCQkvKiBDb21tZW50ICovCisjaWZuZGVmIE5PU1BMCisgICAgJygnLAkJCQkvKiBTLUV4cHJlc3Npb24gKi8KKyAgICAnLicsCQkJCS8qIEFzc2lnbm1lbnQgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICc7JywJCQkJLyogQ29tbWVudCAqLworI2lmbmRlZiBOT1NQTAorICAgICc6JywJCQkJLyogTGFiZWwgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBOT1BVU0gKKyNpZmRlZiBDS19SRURJUgorICAgICc8JywJCQkJLyogUkVESVJFQ1QgKi8KKyNlbmRpZiAvKiBDS19SRURJUiAqLworICAgICdAJywJCQkJLyogRENMIGVzY2FwZSAqLworI2VuZGlmIC8qIE5PUFVTSCAqLworI2lmZGVmIENLX1JFQ0FMTAorICAgICdeJywJCQkJLyogQ29tbWFuZCByZWNhbGwgKi8KKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAneycsCQkJCS8qIEltbWVkaWF0ZSBtYWNybyAqLworI2VuZGlmIC8qIE5PU1BMICovCisgICAgJ1wwJwkJCQkvKiBFbmQgb2YgdGhpcyBzdHJpbmcgKi8KK307CitpbnQgeHhkb3QgPSAwOwkJCQkvKiBVc2VkIHdpdGggIi4iIHRva2VuICovCisKK3N0cnVjdCBrZXl0YWIgeWVzbm9bXSA9IHsJCS8qIFllcy9ObyBrZXl3b3JkIHRhYmxlICovCisgICAgeyAibm8iLCAgICAwLCAwIH0sCisgICAgeyAib2siLCAgICAxLCAwIH0sCisgICAgeyAieWVzIiwgICAxLCAwIH0KK307CitpbnQgbnllc25vID0gKHNpemVvZih5ZXNubykgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCisvKiBTYXZlIGtleXdvcmQgdGFibGUgKi8KKworc3RydWN0IGtleXRhYiBzYXZ0YWJbXSA9IHsKKyNpZmRlZiBPUzIKKyAgICB7ICJjb21tYW5kIiwgIFhTQ01ELCAwIH0sCisjZWxzZQorI2lmZGVmIENLX1JFQ0FMTAorICAgIHsgImNvbW1hbmQiLCAgWFNDTUQsIDAgfSwKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNpZm5kZWYgTk9TRVRLRVkKKyAgICB7ICJrZXltYXAiLCAgIFhTS0VZLCAwIH0sCisjZW5kaWYgLyogTk9TRVRLRVkgKi8KKyNpZmRlZiBPUzIKKyAgICB7ICJ0ZXJtaW5hbCIsIFhTVEVSTSwgMCB9LAorI2VuZGlmIC8qIE9TMiAqLworICAgIHsgIiIsIDAsIDAgfQorfTsKK2ludCBuc2F2ID0gKHNpemVvZihzYXZ0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKKy8qIFBhcmFtZXRlciBrZXl3b3JkIHRhYmxlICovCisKK3N0cnVjdCBrZXl0YWIgcHJtdGFiW10gPSB7CisgICAgeyAiYWxhcm0iLCAgICAgICAgICAgIFhZQUxSTSwgIDAgfSwKKyNpZmRlZiBDT01NRU5UCQkJCS8qIFNFVCBBTlNXRVIgbm90IGltcGxlbWVudGVkIHlldCAqLworI2lmbmRlZiBOT0RJQUwKKyAgICB7ICJhbnN3ZXIiLCAgICAgICAgICAgWFlBTlNXRVIsMCB9LAorI2VuZGlmIC8qIE5PRElBTCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB7ICJhc2stdGltZXIiLCAgICAgICAgWFlUSU1FUiwgMCB9LAorI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJhdHRyaWJ1dGVzIiwgICAgICAgWFlBVFRSLCAgMCB9LAorI2VuZGlmIC8qIE5PWEZFUiAqLworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCisgICAgeyAiYXV0aGVudGljYXRpb24iLCAgIFhZQVVUSCwgIDAgfSwKKyNlbHNlICAvKiBDS19BVVRIRU5USUNBVElPTiAqLworI2lmZGVmIENLX1NTTAorICAgIHsgImF1dGhlbnRpY2F0aW9uIiwgICBYWUFVVEgsICAwIH0sCisjZW5kaWYgLyogQ0tfU1NMICovCisjZW5kaWYgLyogQ0tfQVVUSEVOVElDQVRJT04gKi8KKyAgICB7ICJiIiwJCSAgWFlCQUNLLCAgQ01fSU5WfENNX0FCUnxDTV9QU0ggfSwKKyAgICB7ICJiYSIsCQkgIFhZQkFDSywgIENNX0lOVnxDTV9BQlJ8Q01fUFNIIH0sCisjaWZkZWYgVk1TCisgICAgeyAiYmFja2dyb3VuZCIsICAgICAgIFhZQkFDSywgIENNX0lOVnxDTV9QU0ggfSwKKyAgICB7ICJiYXRjaCIsICAgICAgICAgICAgWFlCQUNLLCAgQ01fUFNIIH0sCisjZWxzZQorICAgIHsgImJhY2tncm91bmQiLCAgICAgICBYWUJBQ0ssICBDTV9QU0ggfSwKKyAgICB7ICJiYXRjaCIsICAgICAgICAgICAgWFlCQUNLLCAgQ01fSU5WfENNX1BTSCB9LAorI2VuZGlmIC8qIFZNUyAqLworI2lmbmRlZiBOT0xPQ0FMCisgICAgeyAiYmF1ZCIsCSAgICAgICAgICBYWVNQRUUsICBDTV9JTlZ8Q01fTE9DIH0sCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIHsgImJlbGwiLCAgICAgICAgICAgICBYWUJFTEwsICAwIH0sCisjaWZuZGVmIE5PWEZFUgorICAgIHsgImJsb2NrLWNoZWNrIiwgIAkgIFhZQ0hLVCwgIDAgfSwKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNpZmRlZiBPUzIKKyNpZmRlZiBCUFJJTlQKKyAgICB7ICJicHJpbnRlciIsICAgICAgICAgWFlCRENQLCAgQ01fSU5WIH0sCisjZW5kaWYgLyogQlBSSU5UICovCisjZW5kaWYgLyogIE9TMiAqLworI2lmZGVmIEJST1dTRVIKKyAgICB7ICJicm93c2VyIiwgICAgICAgICAgWFlCUk9XU0UsQ01fUFNIfENNX0xPQyB9LAorI2VuZGlmIC8qIEJST1dTRVIgKi8KKyNpZm5kZWYgTk9YRkVSCisjaWZkZWYgRFlOQU1JQworICAgIHsgImJ1ZmZlcnMiLCAgICAgICAgICBYWUJVRiwgICAwIH0sCisjZW5kaWYgLyogRFlOQU1JQyAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworI2lmbmRlZiBOT0xPQ0FMCisjaWZuZGVmIE1BQworICAgIHsgImNhcnJpZXItd2F0Y2giLCAgICBYWUNBUlIsICBDTV9MT0MgfSwKKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZuZGVmIE5PU1BMCisgICAgeyAiY2FzZSIsICAgICAgICAgICAgIFhZQ0FTRSwgIDAgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHsgImNkIiwgICAgICAgICAgICAgICBYWUNELCAgICAwIH0sCisjaWZuZGVmIE5PWEZFUgorICAgIHsgImNsIiwgICAgICAgICAgICAgICBYWUNMRUFSLCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiY2xlIiwgICAgICAgICAgICAgIFhZQ0xFQVIsIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJjbGVhIiwgICAgICAgICAgICAgWFlDTEVBUiwgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgImNsZWFyIiwgICAgICAgICAgICBYWUNMRUFSLCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiY2xlYXItY2hhbm5lbCIsICAgIFhZQ0xFQVIsIDAgfSwKKyAgICB7ICJjbGVhcmNoYW5uZWwiLCAgICAgWFlDTEVBUiwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9YRkVSICovCisjaWZuZGVmIE5PTE9DQUwKKyAgICB7ICJjbG9zZS1vbi1kaXNjb25uZWN0IiwgWFlESVNDLCBDTV9JTlZ8Q01fTE9DIH0sCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIHsgImNtZCIsICAgICAgICAgICAgICBYWUNNRCwgICBDTV9JTlYgfSwKKyAgICB7ICJjb21tYW5kIiwgICAgICAgICAgWFlDTUQsICAgMCB9LAorI2lmZGVmIENLX1NQRUVECisgICAgeyAiY29uIiwgICAgICAgICAgICAgIFhZUUNUTCwgIENNX0lOVnxDTV9BQlIgfSwKKyNlbmRpZiAvKiBDS19TUEVFRCAqLworICAgIHsgImNvbnNvbGUiLCAgICAgICAgICBYWUNNRCwgICBDTV9JTlYgfSwKKyNpZmRlZiBDS19TUEVFRAorICAgIHsgImNvbnRyb2wtY2hhcmFjdGVyIixYWVFDVEwsICAwIH0sCisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJjb3VudCIsICAgICAgICAgICAgWFlDT1VOLCAgMCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisjaWZuZGVmIE5PWEZFUgorICAgIHsgImQiLAkJICBYWURFTEEsICBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiZGUiLAkJICBYWURFTEEsICBDTV9JTlZ8Q01fQUJSIH0sCisjZW5kaWYgLyogTk9YRkVSICovCisgICAgeyAiZGVidWciLCAgICAgICAgICAgIFhZREVCVSwgIDAgfSwKKyNpZmRlZiBWTVMKKyAgICB7ICJkZWZhdWx0IiwgICAgICAgICAgWFlERkxULCAgMCB9LAorI2Vsc2UKKyNpZm5kZWYgTUFDCisgICAgeyAiZGVmYXVsdCIsICAgICAgICAgIFhZREZMVCwgIENNX0lOViB9LAorI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIFZNUyAqLworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJkZWxheSIsCSAgICAJICBYWURFTEEsICAwIH0sCisgICAgeyAiZGVzdGluYXRpb24iLAkgIFhZREVTVCwgIDAgfSwKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNpZm5kZWYgTk9ESUFMCisgICAgeyAiZGkiLAkJICBYWURJQUwsICBDTV9JTlZ8Q01fQUJSfENNX0xPQyB9LAorICAgIHsgImRpYSIsCQkgIFhZRElBTCwgIENNX0lOVnxDTV9BQlJ8Q01fTE9DIH0sCisgICAgeyAiZGlhbCIsICAgICAgICAgICAgIFhZRElBTCwgIENNX0xPQyB9LAorI2VuZGlmIC8qIE5PRElBTCAqLworI2lmZGVmIE9TMgorICAgIHsgImRpYWxlciIsCQkgIFhZRExSLCAgIENNX0lOViB9LAorI2VuZGlmIC8qIE9TMiAqLworI2lmbmRlZiBOT0xPQ0FMCisgICAgeyAiZGlzY29ubmVjdCIsICAgICAgIFhZRElTQywgIENNX0xPQyB9LAorICAgIHsgImR1cGxleCIsCSAgICAJICBYWURVUEwsICBDTV9MT0MgfSwKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZuZGVmIE5PUFVTSAorI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgImVkaXRvciIsICAgICAgICAgICBYWUVESVQsICBDTV9QU0ggfSwKKyNlbmRpZiAvKiAgTk9GUklMTFMgKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNpZmRlZiBDS19DVFJMWgorICAgIHsgImVvZiIsICAgICAgICAgICAgICBYWUVPRiwgICBDTV9JTlYgfSwKKyNlbmRpZiAvKiBDS19DVFJMWiAqLworI2lmbmRlZiBOT0xPQ0FMCisgICAgeyAiZXNjYXBlLWNoYXJhY3RlciIsIFhZRVNDLCAgIENNX0xPQyB9LAorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJldmFsdWF0ZSIsICAgICAgICAgWFlFVkFMLCAgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICB7ICJleGl0IiwJCSAgWFlFWElULCAgMCB9LAorI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJmLWFjay1idWciLCAgICAgICAgWFlGQUNLQiwgQ01fSU5WIH0sCisgICAgeyAiZi1hY2stcGF0aCIsICAgICAgIFhZRkFDS1AsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PWEZFUiAqLworICAgIHsgImZpbGUiLCAJICAJICBYWUZJTEUsICAwIH0sCisgICAgeyAiZmwiLCAgICAgICAgICAgCSAgWFlGTE9XLCAgQ01fSU5WfENNX0FCUiB9LAorI2lmbmRlZiBOT1NQTAorICAgIHsgImZsYWciLCAgICAgICAgICAgICBYWUZMQUcsICAwIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZmRlZiBUQ1BTT0NLRVQKKyNpZm5kZWYgU1lTRlRQCisjaWZuZGVmIE5PRlRQCisgICAgeyAiZnQiLCAgIAkgICAgICAgICAgWFlGVFBYLCAgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgImZ0cCIsICAJICAgICAgICAgIFhZRlRQWCwgIDAgfSwKKyNlbmRpZiAvKiBOT0ZUUCAqLworI2VuZGlmIC8qIFNZU0ZUUCAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2lmZGVmIEJST1dTRVIKKyAgICB7ICJmdHAtY2xpZW50IiwgICAgICAgWFlGVFAsICAgQ01fUFNIIH0sCisjZW5kaWYgLyogQlJPV1NFUiAqLworICAgIHsgImZsb3ctY29udHJvbCIsIAkgIFhZRkxPVywgIDAgfSwKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJmdW5jdGlvbiIsICAgICAgICAgWFlGVU5DLCAgMCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisjaWZkZWYgTkVXRlRQCisgICAgeyAiZ2V0LXB1dC1yZW1vdGUiLCAgIFhZR1BSLCAgIDAgfSwKKyNlbmRpZiAvKiBORVdGVFAgKi8KKyNpZmRlZiBLVUkKKyAgICB7ICJndWkiLCAgICAgICAgICAgICAgWFlHVUksICAgMCB9LAorI2VuZGlmIC8qIEtVSSAqLworICAgIHsgImhhbmRzaGFrZSIsICAgIAkgIFhZSEFORCwgIDAgfSwKKyAgICB7ICJoaW50cyIsICAgICAgICAgICAgWFlISU5UUywgMCB9LAorI2lmZGVmIE5FVENPTk4KKyAgICB7ICJob3N0IiwgICAgICAgICAgICAgWFlIT1NULCAgQ01fTE9DIH0sCisjZW5kaWYgLyogTkVUQ09OTiAqLworI2lmbmRlZiBOT1NQTAorICAgIHsgImkiLAkJICBYWUlOUFUsICBDTV9JTlZ8Q01fQUJSIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZmRlZiBJS1NECisgICAgeyAiaWtzIiwgICAgICAgICAgICAgIFhZSUtTLCAgIDAgfSwKKyNlbHNlCisgICAgeyAiaWtzIiwgICAgICAgICAgICAgIFhZSUtTLCAgIENNX0lOViB9LAorI2VuZGlmIC8qIElLU0QgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJpbiIsCQkgIFhZSU5QVSwgIENNX0lOVnxDTV9BQlIgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJpbmNvbXBsZXRlIiwgICAJICBYWUlGRCwgICBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJpbnB1dCIsICAgICAgICAgICAgWFlJTlBVLCAgMCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisjaWZuZGVmIE5PU0VUS0VZCisgICAgeyAia2V5IiwJCSAgWFlLRVksICAgMCB9LAorI2VuZGlmIC8qIE5PU0VUS0VZICovCisgICAgeyAibCIsICAgICAgICAgICAgICAgIFhZTElORSwgIENNX0lOVnxDTV9BQlIgfSwKKyNpZm5kZWYgTk9DU0VUUworICAgIHsgImxhbmd1YWdlIiwgICAgICAgICBYWUxBTkcsICAwIH0sCisjZW5kaWYgLyogTk9DU0VUUyAqLworI2lmbmRlZiBOT0xPQ0FMCisgICAgeyAibGluZSIsICAgICAgICAgICAgIFhZTElORSwgIENNX0xPQyB9LAorICAgIHsgImxvY2FsLWVjaG8iLAkgIFhZTENMRSwgIENNX0lOVnxDTV9MT0MgfSwKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZkZWYgTE9DVVMKKyAgICB7ICJsb2N1cyIsICAgICAgICAgICAgWFlMT0NVUywgMCB9LAorI2VuZGlmIC8qIExPQ1VTICovCisjaWZuZGVmIE5PU1BMCisgICAgeyAibG9naW4iLAkJICBYWUxPR0lOLCBDTV9MT0MgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBOT1NQTAorICAgIHsgIm1hY3JvIiwgICAgICAgICAgICBYWU1BQ1IsICAwIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICB7ICJtYXRjaCIsICAgICAgICAgICAgWFlNQVRDSCwgMCB9LAorI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBWTVMKKyAgICB7ICJtZXNzYWdlcyIsICAgICAgICAgWFlNU0dTLCAgMCB9LAorI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZm5kZWYgTk9ESUFMCisgICAgeyAibW9kZW0iLAkJICBYWU1PRE0sICBDTV9MT0MgfSwKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMk1PVVNFCisgICAgeyAibW91c2UiLAkJICBYWU1PVVNFLCAwIH0sCisjZW5kaWYgLyogT1MyTU9VU0UgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZkZWYgT1MyCisgICAgeyAibXNrZXJtaXQiLCAgICAgICAgIFhZTVNLLCAgIDAgfSwKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBORVRDT05OCisgICAgeyAibmV0d29yayIsICAgICAgICAgIFhZTkVULCAgIENNX0xPQyB9LAorI2VuZGlmIC8qIE5FVENPTk4gKi8KKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJvdXRwdXQiLCAgICAgICAgICAgWFlPVVRQLCAgMCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisgICAgeyAib3B0aW9ucyIsICAgICAgICAgIFhZT1BUUywgIDAgfSwKKyAgICB7ICJwYXVzZSIsICAgICAgICAgICAgWFlTTEVFUCwgQ01fSU5WIH0sCisjaWZkZWYgQU5ZWDI1CisjaWZuZGVmIElCTVgyNQorICAgIHsgInBhZCIsICAgICAgICAgICAgICBYWVBBRCwgICBDTV9MT0MgfSwKKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNlbmRpZiAvKiBBTllYMjUgKi8KKyAgICB7ICJwYXJpdHkiLAkgICAgCSAgWFlQQVJJLCAgMCB9LAorI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgeyAicG9ydCIsICAgICAgICAgICAgIFhZTElORSwgIENNX0xPQyB9LAorI2Vsc2UKKyAgICB7ICJwb3J0IiwgICAgICAgICAgICAgWFlMSU5FLCAgQ01fSU5WfENNX0xPQyB9LAorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZm5kZWYgTk9GUklMTFMKKyAgICB7ICJwciIsICAgCSAgICAJICBYWVBST00sICBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAicHJpbnRlciIsICAgICAgICAgIFhZUFJUUiwgIDAgfSwKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2lmZGVmIE9TMgorICAgIHsgInByaW9yaXR5IiwgICAgICAgICBYWVBSVFksICAwIH0sCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgQ0tfU1BFRUQKKyAgICB7ICJwcmVmaXhpbmciLCAgICAgICAgWFlQUkVGSVgsIDAgfSwKKyNlbmRpZiAvKiBDS19TUEVFRCAqLworI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgInByb21wdCIsCSAgICAJICBYWVBST00sICAwIH0sCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyNpZm5kZWYgTk9YRkVSCisgICAgeyAicHJvdG9jb2wiLAkgIFhZUFJPVE8sIDAgfSwKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICB7ICJxIiwJCSAgWFlRVUlFLCAgQ01fSU5WfENNX0FCUiB9LAorI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJxOGZsYWciLCAgICAgICAgICAgWFlROEZMRywgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9YRkVSICovCisjaWZkZWYgUU5YCisgICAgeyAicW54LXBvcnQtbG9jayIsICAgIFhZUU5YUEwsIDAgfSwKKyNlbHNlCisgICAgeyAicW54LXBvcnQtbG9jayIsICAgIFhZUU5YUEwsIENNX0lOViB9LAorI2VuZGlmIC8qIFFOWCAqLworICAgIHsgInF1aWV0IiwJCSAgWFlRVUlFLCAgMCB9LAorI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJyZWMiLCAgICAgICAgICAgICAgWFlSRUNWLCAgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgInJlY2VpdmUiLCAgICAgICAgICBYWVJFQ1YsICAwIH0sCisgICAgeyAicmVjdiIsICAgICAgICAgICAgIFhZUkVDViwgIENNX0lOViB9LAorI2VuZGlmIC8qIE5PWEZFUiAqLworICAgIHsgInJlbGlhYmxlIiwgICAgICAgICBYWVJFTFksICAwIH0sCisjaWZuZGVmIE5PWEZFUgorICAgIHsgInJlcGVhdCIsICAgICAgICAgICBYWVJFUFQsICAwIH0sCisgICAgeyAicmV0cnktbGltaXQiLCAgICAgIFhZUkVUUiwgIDAgfSwKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNpZmRlZiBDS1JPT1QKKyAgICB7ICJyb290IiwgICAgICAgICAgICAgWFlST09ULCAgMCB9LAorI2VuZGlmIC8qIENLUk9PVCAqLworI2lmbmRlZiBOT1NDUklQVAorICAgIHsgInNjcmlwdCIsCQkgIFhZU0NSSSwgIENNX0xPQyB9LAorI2VuZGlmIC8qIE5PU0NSSVBUICovCisjaWZuZGVmIE5PWEZFUgorICAgIHsgInNlbmQiLCAgICAgICAgICAgICBYWVNFTkQsICAwIH0sCisjaWZuZGVmIE5PTE9DQUwKKyNpZm5kZWYgTk9TRVJWRVIKKyAgICB7ICJzZXIiLCAgICAgICAgICAgICAgWFlTRVJWLCAgQ01fSU5WfENNX0FCUiB9LAorI2VuZGlmIC8qIE5PU0VSVkVSICovCisjZW5kaWYgLyogTk9YRkVSICovCisgICAgeyAic2VyaWFsIiwgICAgICAgICAgIFhZU0VSSUFMLENNX0xPQyB9LAorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZm5kZWYgTk9TRVJWRVIKKyAgICB7ICJzZXJ2ZXIiLCAgICAgICAgICAgWFlTRVJWLCAgMCB9LAorI2VuZGlmIC8qIE5PU0VSVkVSICovCisjaWZkZWYgU0VTTElNSVQKKyNpZm5kZWYgTk9MT0NBTAorICAgIHsgInNlc3Npb24tbCIsICAgICAgICBYWVNFU1MsICBDTV9JTlZ8Q01fQUJSIH0sCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIHsgInNlc3Npb24tbGltaXQiLCAgICBYWUxJTUlULCBDTV9JTlZ8Q01fTE9DIH0sIC8qIFNlc3Npb24gTGltaXQgKi8KKyNlbmRpZiAvKiBTRVNMSU1JVCAqLworCisjaWZuZGVmIE5PTE9DQUwKKyAgICB7ICJzZXNzaW9uLWxvZyIsICAgICAgWFlTRVNTLCAgQ01fTE9DIH0sCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZuZGVmIE5PU1BMCisjaWZuZGVmIE5PU0VYUAorICAgIHsgInNleHByZXNzaW9uIiwgICAgICBYWVNFWFAsICBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1NFWFAgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgeyAic2xlZXAiLCAgICAgICAgICAgIFhZU0xFRVAsIDAgfSwKKworI2lmbmRlZiBOT0xPQ0FMCisgICAgeyAic3BlZWQiLAkgICAgICAgICAgWFlTUEVFLCAgQ01fTE9DIH0sCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZkZWYgQU5ZU1NICisgICAgeyAic3NoIiwJICAgICAgICAgIFhZU1NILCAgIDAgfSwKKyNlbmRpZiAvKiBBTllTU0ggKi8KKworI2lmbmRlZiBOT1NQTAorICAgIHsgInN0YXJ0dXAtZmlsZSIsICAgICBYWVNUQVJUVVAsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIEhXUEFSSVRZCisgICAgeyAic3RvcC1iaXRzIiwgICAgICAgIFhZU1RPUCwgQ01fTE9DIH0sCisjZWxzZQorI2lmZGVmIFROX0NPTVBPUlQKKyAgICB7ICJzdG9wLWJpdHMiLCAgICAgICAgWFlTVE9QLCBDTV9MT0MgfSwKKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisjZW5kaWYgLyogSFdQQVJJVFkgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZm5kZWYgTk9YRkVSCisjaWZkZWYgU1RSRUFNSU5HCisgICAgeyAic3RyZWFtaW5nIiwgICAgICAgIFhZU1RSRUFNLCAwIH0sCisjZW5kaWYgLyogU1RSRUFNSU5HICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9KQworICAgIHsgInN1c3BlbmQiLCAgICAgICAgICBYWVNVU1AsICBDTV9QU0ggfSwKKyNlbmRpZiAvKiBOT0pDICovCisjaWZkZWYgQ0tTWVNMT0cKKyAgICB7ICJzeXNsb2ciLCAgICAgICAgICAgWFlTWVNMLCAgQ01fSU5WIH0sCisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyAgICB7ICJ0YWtlIiwgICAgICAgICAgICAgWFlUQUtFLCAgMCB9LAorCisjaWZkZWYgQ0tfVEFQSQorICAgIHsgInRhcGkiLCAgICAgICAgICAgICBYWVRBUEksICBDTV9MT0MgfSwKKyNlbmRpZiAvKiBDS19UQVBJICovCisKKyNpZm5kZWYgTk9UQ1BPUFRTCisjaWZkZWYgVENQU09DS0VUCisgICAgeyAidGNwIiwgICAgICAgICAgICAgIFhZVENQLCAgIENNX0xPQyB9LAorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2VuZGlmIC8qIE5PVENQT1BUUyAqLworCisjaWZkZWYgVE5DT0RFCisgICAgeyAidGVsIiwgICAgICAgICAgICAgIFhZVEVMLCAgIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJ0ZWxuZXQiLCAgICAgICAgICAgWFlURUwsICAgMCB9LAorICAgIHsgInRlbG9wdCIsICAgICAgICAgICBYWVRFTE9QLCAwIH0sCisjZW5kaWYgLyogVE5DT0RFICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJ0ZW1wLWRpcmVjdG9yeSIsICAgWFlUTVBESVIsMCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9MT0NBTAorICAgIHsgInRlcm1pbmFsIiwgICAgICAgICBYWVRFUk0sICBDTV9MT0MgfSwKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyNpZmRlZiBPUzIKKyAgICB7ICJ0aXRsZSIsCQkgIFhZVElUTEUsIENNX0xPQyB9LAorI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIFRMT0cKKyAgICB7ICJ0cmFuc2FjdGlvbi1sb2ciLCAgWFlUTE9HLCAgMCB9LAorI2VuZGlmIC8qIFRMT0cgKi8KKyNpZm5kZWYgTk9YRkVSCisgICAgeyAidHJhbnNmZXIiLCAgICAgICAgIFhZWEZFUiwgIDAgfSwKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNpZm5kZWYgTk9YTUlUCisgICAgeyAidHJhbnNtaXQiLCAgICAgICAgIFhZWE1JVCwgIDAgfSwKKyNlbmRpZiAvKiBOT1hNSVQgKi8KKyNpZm5kZWYgTk9YRkVSCisjaWZuZGVmIE5PQ1NFVFMKKyAgICB7ICJ1bmtub3duLWNoYXItc2V0IiwgWFlVTkNTLCAgMCB9LAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICB7ICJ3YWl0IiwgICAgICAgICAgICAgWFlTTEVFUCwgQ01fSU5WIH0sCisjaWZuZGVmIE5PUFVTSAorI2lmZGVmIFVOSVgKKyAgICB7ICJ3aWxkY2FyZC1leHBhbnNpb24iLCBYWVdJTEQsIDAgfSwKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogTk9QVVNIICovCisjaWZkZWYgTlQKKyAgICB7ICJ3IiwgICAgICAgICAgICAgICAgWFlXSU5ELCAgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgIndpIiwgICAgICAgICAgICAgICBYWVdJTkQsICBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAid2luIiwgICAgICAgICAgICAgIFhZV0lORCwgIENNX0lOVnxDTV9BQlIgfSwKKyNlbmRpZiAvKiBOVCAqLworICAgIHsgIndpbmRvdy1zaXplIiwgICAgICBYWVdJTkQsICAwIH0sCisjaWZkZWYgTlQKKyAgICB7ICJ3aW45NSIsICAgICAgICAgICAgWFlXSU45NSwgMCB9LAorI2VuZGlmIC8qIE5UICovCisjaWZkZWYgQU5ZWDI1CisgICAgeyAieC4yNSIsICAgICAgICAgICAgIFhZWDI1LCAgIENNX0xPQyB9LAorICAgIHsgIngyNSIsICAgICAgICAgICAgICBYWVgyNSwgICBDTV9JTlZ8Q01fTE9DIH0sCisjZW5kaWYgLyogQU5ZWDI1ICovCisgICAgeyAieGZlciIsICAgICAgICAgICAgIFhZWEZFUiwgIENNX0lOViB9LAorI2lmbmRlZiBOT1hNSVQKKyAgICB7ICJ4bWl0IiwgICAgICAgICAgICAgWFlYTUlULCAgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9YTUlUICovCisgICAgeyAiIiwgMCwgMCB9Cit9OworaW50IG5wcm0gPSAoc2l6ZW9mKHBybXRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsgLyogSG93IG1hbnkgKi8KKworc3RydWN0IGtleXRhYiBzY250YWJbXSA9IHsJCS8qIFNjcmVlbiBjb21tYW5kcyAqLworICAgIHsgImNsZWFyIiwgICBTQ05fQ0xSLCAwIH0sCisgICAgeyAiY2xlb2wiLCAgIFNDTl9DTEUsIDAgfSwKKyAgICB7ICJtb3ZlLXRvIiwgU0NOX01PViwgMCB9Cit9OworaW50IG5zY250YWIgPSAoc2l6ZW9mKHNjbnRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOyAvKiBIb3cgbWFueSAqLworCisjaWZkZWYgQU5ZU1NICQkJCS8qIFNTSCBjb21tYW5kIHRhYmxlICovCisjaWZkZWYgU1NIQlVJTFRJTgoraW50ICAgIHNzaF9wZl9sY2xfbiA9IDAsCisgICAgICAgc3NoX3BmX3JtdF9uID0gMDsKK3N0cnVjdCBzc2hfcGYgc3NoX3BmX2xjbFszMl0gPSB7IDAsIE5VTEwsIDAgfTsgLyogU1NIIFBvcnQgRm9yd2FyZGluZyAqLworc3RydWN0IHNzaF9wZiBzc2hfcGZfcm10WzMyXSA9IHsgMCwgTlVMTCwgMCB9OyAvKiBzdHJ1Y3RzLi4uICovCitleHRlcm4gY2hhciAqIHNzaF9oc3QsICogc3NoX2NtZCwgKiBzc2hfcHJ0OworZXh0ZXJuIGludCAgICBzc2hfdmVyLCAgIHNzaF94Znc7CitjaGFyICogc3NoX3RtcHVpZCA9IE5VTEwsICpzc2hfdG1wY21kID0gTlVMTCwgKnNzaF90bXBwb3J0ID0gTlVMTCwKKyAgICAgKiBzc2hfdG1wc3RyID0gTlVMTDsKKworaW50Cisgc3Noa190eXBlID0gU1NIS1RfMkQsCQkJLyogU1NIIEtFWSBDUkVBVEUgL1RZUEU6eCAqLworIHNzaGtfYml0cyA9IDEwMjQsCQkJLyogU1NIIEtFWSBDUkVBVEUgL0JJVFM6biAqLworIHNzaGtfZGluICA9IFNLREZfT1NTSCwJCQkvKiBTU0ggS0VZIERJU1BMQVkgL0lOLUZPUk1BVDogKi8KKyBzc2hrX2RvdXQgPSBTS0RGX09TU0g7CQkJLyogU1NIIEtFWSBESVNQTEFZIC9PVVQtRk9STUFUOiAqLworCitjaGFyCisgKiBzc2hrMV9jb21tZW50ID0gTlVMTCwJCS8qIFNTSCBWMSBDT01NRU5UICovCisgKiBzc2hrcF9vbGQgPSBOVUxMLAkJCS8qIE9sZCBrZXkgcGFzc3BocmFzZSAqLworICogc3Noa3BfbmV3ID0gTlVMTCwJCQkvKiBOZXcga2V5IHBhc3NwaHJhc2UgKi8KKyAqIHNzaGtjX3Bhc3MgPSBOVUxMLAkJCS8qIEtFWSBDUkVBVEUgL1BBU1M6eHh4ICovCisgKiBzc2hrY19jb21tID0gTlVMTCwJCQkvKiBLRVkgQ1JFQVRFIC9WMS1SU0EtQ09NTUVOVDp4eHggKi8KKyAqIHNzaGRfZmlsZSA9IE5VTEwsCQkJLyogRElTUExBWSBmaWxlICovCisgKiBzc2hrX2ZpbGUgPSBOVUxMOwkJCS8qIFNTSCBDUkVBVEUgS0VZIGZpbGUgKi8KKworc3RhdGljIHN0cnVjdCBrZXl0YWIgc3NoY2xyW10gPSB7CisgICAgeyAibG9jYWwtcG9ydC1mb3J3YXJkIiwgIFNTSENfTFBGLCAwIH0sCisgICAgeyAicmVtb3RlLXBvcnQtZm9yd2FyZCIsIFNTSENfUlBGLCAwIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuc3NoY2xyID0gKHNpemVvZihzc2hjbHIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKK3N0cnVjdCBrZXl0YWIgc3Nob3Buc3dbXSA9IHsKKyAgICB7ICIvY29tbWFuZCIsICAgICAgICBTU0hTV19DTUQsIENNX0FSRyB9LAorICAgIHsgIi9wYXNzd29yZCIsICAgICAgIFNTSFNXX1BXRCwgQ01fQVJHIH0sCisgICAgeyAiL3N1YnN5c3RlbSIsICAgICAgU1NIU1dfU1VCLCBDTV9BUkcgfSwKKyAgICB7ICIvdXNlciIsICAgICAgICAgICBTU0hTV19VU1IsIENNX0FSRyB9LAorICAgIHsgIi92ZXJzaW9uIiwgICAgICAgIFNTSFNXX1ZFUiwgQ01fQVJHIH0sCisgICAgeyAiL3gxMS1mb3J3YXJkaW5nIiwgU1NIU1dfWDExLCBDTV9BUkcgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitpbnQgbnNzaG9wbnN3ID0gKHNpemVvZihzc2hvcG5zdykgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgc3Noa3d0YWJbXSA9IHsKKyAgICB7ICJhZGQiLCAgICAgICAgICAgICAgICAgWFNTSF9BREQsIDAgfSwKKyAgICB7ICJhZ2VudCIsICAgICAgICAgICAgICAgWFNTSF9BR1QsIDAgfSwKKyAgICB7ICJjbGVhciIsICAgICAgICAgICAgICAgWFNTSF9DTFIsIDAgfSwKKyAgICB7ICJmb3J3YXJkLWxvY2FsLXBvcnQiLCAgWFNTSF9GTFAsIENNX0lOViB9LAorICAgIHsgImZvcndhcmQtcmVtb3RlLXBvcnQiLCBYU1NIX0ZSUCwgQ01fSU5WIH0sCisgICAgeyAia2V5IiwgICAgICAgICAgICAgICAgIFhTU0hfS0VZLCAwIH0sCisgICAgeyAib3BlbiIsICAgICAgICAgICAgICAgIFhTU0hfT1BOLCAwIH0sCisgICAgeyAidjIiLCAgICAgICAgICAgICAgICAgIFhTU0hfVjIsICAwIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuc3NoY21kID0gKHNpemVvZihzc2hrd3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgc3NoMnRhYltdID0geworICAgIHsgInJla2V5IiwgWFNTSDJfUktFLCAwIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuc3NoMnRhYiA9IChzaXplb2Yoc3NoMnRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBhZGRmd2RbXSA9IHsJLyogU0VUIFNTSCBBREQgY29tbWFuZCB0YWJsZSAqLworICAgIHsgImxvY2FsLXBvcnQtZm9yd2FyZCIsICBTU0hGX0xDTCwgMCB9LAorICAgIHsgInJlbW90ZS1wb3J0LWZvcndhcmQiLCBTU0hGX1JNVCwgMCB9LAorICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmFkZGZ3ZCA9IChzaXplb2YoYWRkZndkKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBzc2hhZ2VudFtdID0gewkvKiBTRVQgU1NIIEFHRU5UIGNvbW1hbmQgdGFibGUgKi8KKyAgICB7ICJhZGQiLCAgICBTU0hBX0FERCwgMCB9LAorICAgIHsgImRlbGV0ZSIsIFNTSEFfREVMLCAwIH0sCisgICAgeyAibGlzdCIsICAgU1NIQV9MU1QsIDAgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5zc2hhZ2VudCA9IChzaXplb2Yoc3NoYWdlbnQpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHNzaGFndHN3W10gPSB7CS8qIFNFVCBTU0ggQUdFTlQgTElTVCBzd2l0Y2ggdGFibGUgKi8KKyAgICB7ICIvZmluZ2VycHJpbnQiLCBTU0hBU1dfRlAsIDAgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5zc2hhZ3RzdyA9IChzaXplb2Yoc3NoYWd0c3cpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHNzaGtleVtdID0gewkvKiBTRVQgU1NIIEtFWSBjb21tYW5kIHRhYmxlICovCisgICAgeyAiY2hhbmdlLXBhc3NwaHJhc2UiLCAgU1NIS19QQVNTLCAwIH0sCisgICAgeyAiY3JlYXRlIiwgICAgICAgICAgICAgU1NIS19DUkVBLCAwIH0sCisgICAgeyAiZGlzcGxheSIsICAgICAgICAgICAgU1NIS19ESVNQLCAwIH0sCisgICAgeyAidjEiLCAgICAgICAgICAgICAgICAgU1NIS19WMSwgICAwIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuc3Noa2V5ID0gKHNpemVvZihzc2hrZXkpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHNzaGt2MVtdID0gewkvKiBTRVQgU1NIIEtFWSBWMSBjb21tYW5kIHRhYmxlICovCisgICAgeyAic2V0LWNvbW1lbnQiLCAgMSwgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IGtleXRhYiBzc2hrcHN3W10gPSB7CS8qIFNFVCBTU0ggS0VZIFBBU1NQSFJBU0UgdGFibGUgKi8KKyAgICB7ICIvbmV3LXBhc3NwaHJhc2UiLCAgMiwgQ01fQVJHIH0sCisgICAgeyAiL29sZC1wYXNzcGhyYXNlIiwgIDEsIENNX0FSRyB9Cit9OworCitzdGF0aWMgc3RydWN0IGtleXRhYiBzc2hrY3JlYVtdID0gewkvKiBTU0ggS0VZIENSRUFURSB0YWJsZSAqLworICAgIHsgIi9iaXRzIiwgICAgICAgICAgIFNTSEtDX0JJLCBDTV9BUkcgfSwKKyAgICB7ICIvcGFzc3BocmFzZSIsICAgICBTU0hLQ19QUCwgQ01fQVJHIH0sCisgICAgeyAiL3R5cGUiLCAgICAgICAgICAgU1NIS0NfVFksIENNX0FSRyB9LAorICAgIHsgIi92MS1yc2EtY29tbWVudCIsIFNTSEtDXzFSLCBDTV9BUkcgfQorfTsKK3N0YXRpYyBpbnQgbnNzaGtjcmVhID0gKHNpemVvZihzc2hrY3JlYSkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBzc2hrY3R5W10gPSB7CS8qIFNTSCBLRVkgQ1JFQVRFIC9UWVBFOnh4eCAqLworICAgIHsgInNycCIsICAgIFNTSEtUX1NSUCwgMCB9LAorICAgIHsgInYxLXJzYSIsIFNTSEtUXzFSLCAwIH0sCisgICAgeyAidjItZHNhIiwgU1NIS1RfMkQsIDAgfSwKKyAgICB7ICJ2Mi1yc2EiLCBTU0hLVF8yUiwgMCB9Cit9Oworc3RhdGljIGludCBuc3Noa2N0eSA9IChzaXplb2Yoc3Noa2N0eSkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBzc2hkc3dpW10gPSB7CS8qIFNFVCBTU0ggS0VZIERJU1BMQVkgL3N3aXRjaGVzICovCisgICAgeyAiL2Zvcm1hdCIsIFNTSEtEX09VVCwgQ01fQVJHIH0KK307CitzdGF0aWMgaW50IG5zc2hkc3dpID0gKHNpemVvZihzc2hkc3dpKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKKyNpZmRlZiBDT01NRU5UCitzdGF0aWMgc3RydWN0IGtleXRhYiBzc2hkaWZtdFtdID0gewkvKiBTU0ggS0VZIERJU1BMQVkgL0lOLUZPUk1BVDogKi8KKyAgICB7ICJvcGVuc3NoIiwgU0tERl9PU1NILCAwIH0sCisgICAgeyAic3NoLmNvbSIsIFNLREZfU1NIQywgMCB9Cit9Oworc3RhdGljIGludCBuc3NoZGlmbXQgPSAoc2l6ZW9mKHNzaGRpZm10KSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBzc2hkb2ZtdFtdID0gewkvKiBTU0ggS0VZIERJU1BMQVkgL0lOLUZPUk1BVDogKi8KKyAgICB7ICJmaW5nZXJwcmludCIsIFNLREZfRklORywgMCB9LAorICAgIHsgImlldGYiLCAgICAgICAgU0tERl9JRVRGLCAwIH0sCisgICAgeyAib3BlbnNzaCIsICAgICBTS0RGX09TU0gsIDAgfSwKKyAgICB7ICJzc2guY29tIiwgICAgIFNLREZfU1NIQywgMCB9Cit9Oworc3RhdGljIGludCBuc3NoZG9mbXQgPSAoc2l6ZW9mKHNzaGRvZm10KSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHNzaGtlcm1pdFtdID0geyAvKiBTS0VSTUlUICovCisgICAgeyAib3BlbiIsICAgICAgIFNLUk1fT1BOLCAwIH0KK307CitzdGF0aWMgaW50IG5zc2hrZXJtaXQgPSAoc2l6ZW9mKHNzaGtlcm1pdCkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdHJ1Y3Qga2V5dGFiIHNzaGtybW9wbnN3W10gPSB7CisgICAgeyAiL3Bhc3N3b3JkIiwgICAgICAgU1NIU1dfUFdELCBDTV9BUkcgfSwKKyAgICB7ICIvdXNlciIsICAgICAgICAgICBTU0hTV19VU1IsIENNX0FSRyB9LAorICAgIHsgIi92ZXJzaW9uIiwgICAgICAgIFNTSFNXX1ZFUiwgQ01fQVJHIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9OworaW50IG5zc2hrcm1vcG5zdyA9IChzaXplb2Yoc3Noa3Jtb3Buc3cpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworCisjaWZkZWYgU0ZUUF9CVUlMVElOCitzdGF0aWMgc3RydWN0IGtleXRhYiBzZnRwa3d0YWJbXSA9IHsgICAgLyogU0ZUUCAqLworICAgIHsgICJjZCIsICAgICAgICBTRlRQX0NELCAgICAwIH0sCisgICAgeyAgImNoZ3JwIiwgICAgIFNGVFBfQ0hHUlAsIDAgfSwKKyAgICB7ICAiY2htb2QiLCAgICAgU0ZUUF9DSE1PRCwgMCB9LAorICAgIHsgICJjaG93biIsICAgICBTRlRQX0NIT1dOLCAwIH0sCisgICAgeyAgImRlbGV0ZSIsICAgIFNGVFBfUk0sICAgIDAgfSwKKyAgICB7ICAiZGlyIiwgICAgICAgU0ZUUF9ESVIsICAgMCB9LAorICAgIHsgICJnZXQiLCAgICAgICBTRlRQX0dFVCwgICAwIH0sCisgICAgeyAgIm1rZGlyIiwgICAgIFNGVFBfTUtESVIsIDAgfSwKKyAgICB7ICAib3BlbiIsICAgICAgU0ZUUF9PUE4sICAgMCB9LAorICAgIHsgICJwdXQiLCAgICAgICBTRlRQX1BVVCwgICAwIH0sCisgICAgeyAgInB3ZCIsICAgICAgIFNGVFBfUFdELCAgIDAgfSwKKyAgICB7ICAicmVuYW1lIiwgICAgU0ZUUF9SRU4sICAgMCB9LAorICAgIHsgICJybSIsICAgICAgICBTRlRQX1JNLCAgICBDTV9JTlYgfSwKKyAgICB7ICAicm1kaXIiLCAgICAgU0ZUUF9STURJUiwgMCB9LAorICAgIHsgICJzeW1saW5rIiwgICBTRlRQX0xJTkssICAwIH0sCisgICAgeyAgInZlcnNpb24iLCAgIFNGVFBfVkVSLCAgIDAgfQorfTsKK3N0YXRpYyBpbnQgbnNmdHBrd3RhYiA9IChzaXplb2Yoc2Z0cGt3dGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisjZW5kaWYgLyogU0ZUUF9CVUlMVElOICovCisjZW5kaWYgLyogQU5ZU1NIICovCisKKyNpZmRlZiBORVRDT05OCitzdHJ1Y3Qga2V5dGFiIG5ldGtleVtdID0gewkJLyogU0VUIE5FVFdPUksgdGFibGUgKi8KKyAgICB7ICJkaXJlY3RvcnkiLCBYWU5FVF9ELCAgMCB9LAorICAgIHsgInR5cGUiLCAgICAgIFhZTkVUX1QsICAwIH0KK307CitpbnQgbm5ldGtleSA9IChzaXplb2YobmV0a2V5KSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKK3N0cnVjdCBrZXl0YWIgbmV0Y21kW10gPSB7CisvKgorICBUaGVzZSBhcmUgdGhlIG5ldHdvcmsgdHlwZXMuCisqLworI2lmZGVmIE5FVENNRAorICAgIHsgImNvbW1hbmQiLCAgICAgICBORVRfQ01ELCAgQ01fSU5WIH0sIC8qIENvbW1hbmQgKi8KKyNlbmRpZiAvKiBORVRDTUQgKi8KKworI2lmZGVmIERFQ05FVAkJCQkvKiBERUNuZXQgLyBQQVRIV09SS1MgKi8KKyAgICB7ICJkZWNuZXQiLCAgICAgICAgTkVUX0RFQywgIDAgfSwKKyNlbmRpZiAvKiBERUNORVQgKi8KKworI2lmZGVmIE5FVERMTAorICAgIHsgImRsbCIsICAgICAgICAgICBORVRfRExMLCAgQ01fSU5WIH0sIC8qIERMTCB0byBiZSBsb2FkZWQgKi8KKyNlbmRpZiAvKiBORVRETEwgKi8KKworI2lmZGVmIE5FVEZJTEUKKyAgICB7ICJmaWxlIiwgICAgICAgICAgIE5FVF9GSUxFLCBDTV9JTlYgfSwgLyogRklMRSAocmVhbCBjcnVkZSkgKi8KKyNlbmRpZiAvKiBORVRGSUxFICovCisKKyNpZmRlZiBOUElQRQkJCQkvKiBOYW1lZCBQaXBlcyAqLworICAgIHsgIm5hbWVkLXBpcGUiLCAgICAgTkVUX1BJUEUsICAwIH0sCisjZW5kaWYgLyogTlBJUEUgKi8KKworI2lmZGVmIENLX05FVEJJT1MKKyAgICB7ICJuZXRiaW9zIiwgICAgICAgIE5FVF9CSU9TLCAgMCB9LAkvKiBORVRCSU9TICovCisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworCisjaWZkZWYgREVDTkVUCQkJCS8qIERFQ25ldCAvIFBBVEhXT1JLUyAoYWxpYXMpICovCisgICAgeyAicGF0aHdvcmtzIiwgICAgIE5FVF9ERUMsICBDTV9JTlYgfSwKKyNlbmRpZiAvKiBERUNORVQgKi8KKworI2lmZGVmIE5FVENNRAorICAgIHsgInBpcGUiLCAgICAgICAgICBORVRfQ01ELCAgMCB9LAkvKiBQaXBlICovCisjZW5kaWYgLyogTkVUQ01EICovCisKKyNpZmRlZiBORVRQVFkKKyAgICB7ICJwc2V1ZG90ZXJtaW5hbCIsTkVUX1BUWSwgMCB9LAkvKiBQc2V1ZG90ZXJtaW5hbCAqLworI2VuZGlmIC8qIE5FVFBUWSAqLworCisjaWZkZWYgTkVUUFRZCisgICAgeyAicHR5IiwgICAgICAgICAgTkVUX1BUWSwgIENNX0lOViB9LCAvKiBJbnYgc3luIGZvciBwc2V1ZG90ZXJtICovCisjZW5kaWYgLyogTkVUUFRZICovCisKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgeyAic3NoIiwgICAgICAgICAgTkVUX1NTSCwgIDAgfSwKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisKKyNpZmRlZiBTVVBFUkxBVAorICAgIHsgInN1cGVybGF0IiwgICAgIE5FVF9TTEFULCAwIH0sCS8qIE1lcmlkaWFuIFRlY2hub2xvZ2llcycgU3VwZXJMQVQgKi8KKyNlbmRpZiAvKiBTVVBFUkxBVCAqLworCisjaWZkZWYgVENQU09DS0VUCQkJLyogVENQL0lQIHNvY2tldHMgbGlicmFyeSAqLworICAgIHsgInRjcC9pcCIsICAgICAgIE5FVF9UQ1BCLCAwIH0sCisjZW5kaWYgLyogVENQU09DS0VUICovCisjaWZkZWYgU1VQRVJMQVQKKyAgICB7ICJ0ZXMzMiIsICAgICAgICBORVRfU0xBVCwgMCB9LAkvKiBFbXVsdXggVEVTMzIgKi8KKyNlbmRpZiAvKiBTVVBFUkxBVCAqLworI2lmZGVmIEFOWVgyNQkJCQkvKiBYLjI1ICovCisjaWZkZWYgU1VOWDI1CisgICAgeyAieCIsICAgICAgICAgICAgTkVUX1NYMjUsIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJ4LjI1IiwgICAgICAgICBORVRfU1gyNSwgMCB9LAorICAgIHsgIngyNSIsICAgICAgICAgIE5FVF9TWDI1LCBDTV9JTlYgfSwKKyNlbHNlCisjaWZkZWYgU1RSQVRVU1gyNQorICAgIHsgIngiLCAgICAgICAgICAgIE5FVF9WWDI1LCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAieC4yNSIsICAgICAgICAgTkVUX1ZYMjUsIDAgfSwKKyAgICB7ICJ4MjUiLCAgICAgICAgICBORVRfVlgyNSwgQ01fSU5WIH0sCisjZW5kaWYgLyogU1RSQVRVU1gyNSAqLworI2VuZGlmIC8qIFNVTlgyNSAqLworI2lmZGVmIElCTVgyNQorICAgIHsgIngiLCAgICAgICAgICAgIE5FVF9JWDI1LCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAieC4yNSIsICAgICAgICAgTkVUX0lYMjUsIENNX0lOViB9LAorICAgIHsgIngyNSIsICAgICAgICAgIE5FVF9JWDI1LCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNpZmRlZiBIUFgyNQorICAgIHsgIngiLCAgICAgICAgICAgIE5FVF9JWDI1LCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAieC4yNSIsICAgICAgICAgTkVUX0lYMjUsIDAgfSwKKyAgICB7ICJ4MjUiLCAgICAgICAgICBORVRfSVgyNSwgQ01fSU5WIH0sCisjZW5kaWYgLyogSFBYMjUgKi8KKyNlbmRpZiAvKiBBTllYMjUgKi8KKyAgICB7ICIiLCAwLCAwIH0KK307CitpbnQgbm5ldHMgPSAoc2l6ZW9mKG5ldGNtZCkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCisjaWZuZGVmIE5PVENQT1BUUworI2lmZGVmIFRDUFNPQ0tFVAorCisvKiBUQ1Agb3B0aW9ucyAqLworCitzdHJ1Y3Qga2V5dGFiIHRjcG9wdFtdID0geworICAgIHsgImFkZHJlc3MiLCAgIFhZVENQX0FERFJFU1MsIDAgfSwKKyNpZmRlZiBDS19ETlNfU1JWCisgICAgeyAiZG5zLXNlcnZpY2UtcmVjb3JkcyIsIFhZVENQX0ROU19TUlYsIDAgfSwKKyNlbmRpZiAvKiBDS19ETlNfU1JWICovCisjaWZkZWYgU09fRE9OVFJPVVRFCisgICAgeyAiZG9udHJvdXRlIiwgICBYWVRDUF9ET05UUk9VVEUsIDAgfSwKKyNlbmRpZiAvKiBTT19ET05UUk9VVEUgKi8KKyNpZm5kZWYgTk9IVFRQCisgICAgeyAiaHR0cC1wcm94eSIsIFhZVENQX0hUVFBfUFJPWFksIDAgfSwKKyNlbmRpZiAvKiBOT0hUVFAgKi8KKyNpZmRlZiBTT19LRUVQQUxJVkUKKyAgICB7ICJrZWVwYWxpdmUiLCBYWVRDUF9LRUVQQUxJVkUsIDAgfSwKKyNlbmRpZiAvKiBTT19LRUVQQUxJVkUgKi8KKyNpZmRlZiBTT19MSU5HRVIKKyAgICB7ICJsaW5nZXIiLCBYWVRDUF9MSU5HRVIsIDAgfSwKKyNlbmRpZiAvKiBTT19MSU5HRVIgKi8KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgIHsgIm5hZ2xlIiwgIFhZVENQX05BR0xFLCAgICBDTV9JTlYgfSwKKyAgICB7ICJub2RlbGF5IiwgWFlUQ1BfTk9ERUxBWSwgMCB9LAorI2VuZGlmIC8qIFRDUF9OT0RFTEFZICovCisgICAgeyAicmV2ZXJzZS1kbnMtbG9va3VwIiwgWFlUQ1BfUkROUywgMCB9LAorI2lmZGVmIFNPX1JDVkJVRgorICAgIHsgInJlY3ZidWYiLCBYWVRDUF9SRUNWQlVGLCAwIH0sCisjZW5kaWYgLyogU09fUkNWQlVGICovCisjaWZkZWYgU09fU05EQlVGCisgICAgeyAic2VuZGJ1ZiIsIFhZVENQX1NFTkRCVUYsIDAgfSwKKyNlbmRpZiAvKiBTT19TTkRCVUYgKi8KKyNpZmRlZiBOVAorI2lmZGVmIENLX1NPQ0tTCisgICAgeyAic29ja3Mtc2VydmVyIiwgWFlUQ1BfU09DS1NfU1ZSLCAwIH0sCisjZW5kaWYgLyogQ0tfU09DS1MgKi8KKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIFZNUworI2lmZGVmIERFQ19UQ1BJUAorICAgIHsgInVjeC1wb3J0LWJ1ZyIsIFhZVENQX1VDWCwgMCB9LAorI2VuZGlmIC8qIERFQ19UQ1BJUCAqLworI2VuZGlmIC8qIFZNUyAqLworICAgIHsgIiIsMCwwIH0KK307CitpbnQgbnRjcG9wdCA9IChzaXplb2YodGNwb3B0KSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogTk9UQ1BPUFRTICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworCisjaWZkZWYgT1MyCisvKiBLOTUgTWFudWFsIENoYXB0ZXIgVGFibGUgLS0gS2VlcCB0aGVzZSB0d28gdGFibGVzIGluIHN5bmMhICovCisKK3N0YXRpYyBjaGFyICogbGlua3RibFtdID0gewkJLyogSW50ZXJuYWwgbGlua3MgaW4gazk1Lmh0bSAqLworICAgICIjdG9wIiwJCQkJLyogMDAgKi8KKyAgICAiI3doYXQiLAkJCQkvKiAwMSAqLworICAgICIjaW5zdGFsbCIsCQkJCS8qIDAyICovCisgICAgIiNzdGFydCIsCQkJCS8qIDAzICovCisgICAgIiNkaWFsZXIiLAkJCQkvKiAwNCAqLworICAgICIjZW50cmllcyIsCQkJCS8qIDA1ICovCisgICAgIiNjb21tYW5kIiwJCQkJLyogMDYgKi8KKyAgICAiI3Rlcm1pbmFsIiwJCQkvKiAwNyAqLworICAgICIjdHJhbnNmZXIiLAkJCS8qIDA4ICovCisgICAgIiNob3N0bW9kZSIJCQkJLyogMDkgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGNoYXB0YmxbXSA9IHsKKyAgICB7ICJDb21tYW5kLVNjcmVlbiIsICAgICA2LCAwIH0sCisgICAgeyAiQ29udGVudHMiLCAgICAgICAgICAgMCwgMCB9LAorICAgIHsgIkRpYWxlci1FbnRyaWVzIiwgICAgIDUsIDAgfSwKKyAgICB7ICJGaWxlLVRyYW5zZmVyIiwgICAgICA4LCAwIH0sCisgICAgeyAiR2V0dGluZy1TdGFydGVkIiwgICAgMywgMCB9LAorICAgIHsgIkhvc3QtTW9kZSIsICAgICAgICAgIDksIDAgfSwKKyAgICB7ICJJbnN0YWxsYXRpb24iLCAgICAgICAyLCAwIH0sCisgICAgeyAiVGVybWluYWwtRW11bGF0aW9uIiwgNywgMCB9LAorICAgIHsgIlVzaW5nLVRoZS1EaWFsZXIiLCAgIDQsIDAgfSwKKyAgICB7ICJXaGF0LUlzLUs5NSIsICAgICAgICAxLCAwIH0sCisgICAgeyAiIiwgICAgICAgICAgICAgICAgICAgMCwgMCB9Cit9Oworc3RhdGljIGludCBuY2hhcHRibCA9IChzaXplb2YoY2hhcHRibCkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikgLSAxKTsKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBOT1hGRVIKKy8qIFJlbW90ZSBDb21tYW5kIFRhYmxlICovCisKK3N0cnVjdCBrZXl0YWIgcmVtY21kW10gPSB7CisjaWZuZGVmIE5PU1BMCisgICAgeyAiYXMiLCAgICAgICAgWFpBU0csIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJhc2ciLCAgICAgICBYWkFTRywgQ01fSU5WIH0sCisgICAgeyAiYXNzaWduIiwgICAgWFpBU0csIDAgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHsgImNkIiwgICAgICAgIFhaQ1dELCAwIH0sCisgICAgeyAiY2R1cCIsICAgICAgWFpDRFUsIENNX0lOViB9LAorICAgIHsgImNvcHkiLCAgICAgIFhaQ1BZLCAwIH0sCisgICAgeyAiY3dkIiwgICAgICAgWFpDV0QsIENNX0lOViB9LAorICAgIHsgImRlbGV0ZSIsICAgIFhaREVMLCAwIH0sCisgICAgeyAiZGlyZWN0b3J5IiwgWFpESVIsIDAgfSwKKyAgICB7ICJlIiwgICAgICAgICBYWlhJVCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgImVyYXNlIiwgICAgIFhaREVMLCBDTV9JTlYgfSwKKyAgICB7ICJleGl0IiwgICAgICBYWlhJVCwgMCB9LAorICAgIHsgImhlbHAiLCAgICAgIFhaSExQLCAwIH0sCisjaWZuZGVmIE5PUFVTSAorICAgIHsgImhvc3QiLCAgICAgIFhaSE9TLCAwIH0sCisjZW5kaWYgLyogTk9QVVNIICovCisjaWZuZGVmIE5PRlJJTExTCisgICAgeyAia2VybWl0IiwgICAgWFpLRVIsIDAgfSwKKyAgICB7ICJsIiwgICAgICAgICBYWkxHSSwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgImxvIiwgICAgICAgIFhaTEdJLCBDTV9BQlJ8Q01fSU5WIH0sCisgICAgeyAibG9nIiwgICAgICAgWFpMR0ksIENNX0FCUnxDTV9JTlYgfSwKKyAgICB7ICJsb2dpbiIsICAgICBYWkxHSSwgMCB9LAorICAgIHsgImxvZ291dCIsICAgIFhaTEdPLCAwIH0sCisgICAgeyAibWtkaXIiLCAgICAgWFpNS0QsIDAgfSwKKyAgICB7ICJwcmludCIsICAgICBYWlBSSSwgMCB9LAorI2VuZGlmIC8qIE5PRlJJTExTICovCisgICAgeyAicHdkIiwgICAgICAgWFpQV0QsIDAgfSwKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJxdWVyeSIsCSAgIFhaUVVFLCAwIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICB7ICJyZW5hbWUiLCAgICBYWlJFTiwgMCB9LAorICAgIHsgInJtZGlyIiwgICAgIFhaUk1ELCAwIH0sCisgICAgeyAic2V0IiwgICAgICAgWFpTRVQsIDAgfSwKKyAgICB7ICJzcGFjZSIsCSAgIFhaU1BBLCAwIH0sCisjaWZuZGVmIE5PRlJJTExTCisgICAgeyAidHlwZSIsICAgICAgWFpUWVAsIDAgfSwKKyAgICB7ICJ3aG8iLCAgICAgICBYWldITywgMCB9LAorI2VuZGlmIC8qIE5PRlJJTExTICovCisgICAgeyAiIiwgMCwgMH0KK307CitpbnQgbnJtdCA9IChzaXplb2YocmVtY21kKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworI2VuZGlmIC8qIE5PWEZFUiAqLworCitzdHJ1Y3Qga2V5dGFiIGxvZ3RhYltdID0geworI2lmZGVmIENLTE9HRElBTAorICAgIHsgImNvbm5lY3Rpb25zIiwgIExPR00sIENNX0lOViB9LAorICAgIHsgImN4IiwgICAgICAgICAgIExPR00sIDAgfSwKKyNlbmRpZiAvKiBDS0xPR0RJQUwgKi8KKyNpZmRlZiBERUJVRworICAgIHsgImRlYnVnZ2luZyIsICAgIExPR0QsIDAgfSwKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHsgInBhY2tldHMiLCAgICAgIExPR1AsIDAgfSwKKyNpZm5kZWYgTk9MT0NBTAorICAgIHsgInNlc3Npb24iLCAgICAgIExPR1MsIDAgfSwKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZkZWYgVExPRworICAgIHsgInRyYW5zYWN0aW9ucyIsIExPR1QsIDAgfSwKKyNlbmRpZiAvKiBUTE9HICovCisgICAgeyAiIiwgMCwgMCB9Cit9OworaW50IG5sb2cgPSAoc2l6ZW9mKGxvZ3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RydWN0IGtleXRhYiB3cml0YWJbXSA9IHsKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJhcHBlbmQtZmlsZSIsICAgICBMT0dXLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHsgImRlYnVnLWxvZyIsICAgICAgIExPR0QsIDAgfSwKKyAgICB7ICJlcnJvciIsICAgICAgICAgICBMT0dFLCAwIH0sCisjaWZuZGVmIE5PU1BMCisgICAgeyAiZmlsZSIsICAgICAgICAgICAgTE9HVywgMCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisgICAgeyAicGFja2V0LWxvZyIsICAgICAgTE9HUCwgMCB9LAorICAgIHsgInNjcmVlbiIsICAgICAgICAgIExPR1gsIDAgfSwKKyNpZm5kZWYgTk9MT0NBTAorICAgIHsgInNlc3Npb24tbG9nIiwgICAgIExPR1MsIDAgfSwKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisgICAgeyAic3lzJG91dHB1dCIsICAgICAgTE9HWCwgQ01fSU5WIH0sCisgICAgeyAidCIsICAgICAgICAgICAgICAgTE9HVCwgQ01fQUJSfENNX0lOViB9LCAvKiBCZWNhdXNlIG9mIGEgdHlwbyBpbiAqLworICAgIHsgInRyIiwgICAgICAgICAgICAgIExPR1QsIENNX0FCUnxDTV9JTlYgfSwgLyogdGhlIGJvb2suLi4gKi8KKyAgICB7ICJ0cmEiLCAgICAgICAgICAgICBMT0dULCBDTV9BQlJ8Q01fSU5WIH0sCisgICAgeyAidHJhbiIsICAgICAgICAgICAgTE9HVCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgInRyYW5zIiwgICAgICAgICAgIExPR1QsIENNX0FCUnxDTV9JTlYgfSwKKyAgICB7ICJ0cmFuc2EiLCAgICAgICAgICBMT0dULCBDTV9BQlJ8Q01fSU5WIH0sCisgICAgeyAidHJhbnNhYyIsICAgICAgICAgTE9HVCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgInRyYW5zYWN0IiwgICAgICAgIExPR1QsIENNX0FCUnxDTV9JTlYgfSwKKyAgICB7ICJ0cmFuc2FjdGkiLCAgICAgICBMT0dULCBDTV9BQlJ8Q01fSU5WIH0sCisgICAgeyAidHJhbnNhY3RpbyIsICAgICAgTE9HVCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgInRyYW5zYWN0aW9uIiwgICAgIExPR1QsIENNX0FCUnxDTV9JTlYgfSwKKyAgICB7ICJ0cmFuc2FjdGlvbi1sb2ciLCBMT0dULCAwIH0sCisgICAgeyAidHJhbnNhY3Rpb25zIiwgICAgTE9HVCwgQ01fSU5WIH0KK307CitpbnQgbndyaSA9IChzaXplb2Yod3JpdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSk7CisKKyNpZmRlZiBDT01NRU5UCQkJCS8qIElOUFVUIHN3aXRjaGVzIG5vdCB1c2VkIHlldC4uLiAqLworc3RhdGljIHN0cnVjdCBrZXl0YWIgaW5zd3RhYltdID0geworI2lmZGVmIENPTU1FTlQKKyAgICB7ICIvYXNzaWduIiwgICAgICAgSU5fQVNHLCBDTV9BUkcgfSwKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgeyAiL2F1dG9kb3dubG9hZCIsIElOX0FETCwgQ01fQVJHIH0sCisgICAgeyAiL2Nhc2UiLCAgICAgICAgIElOX0NBUywgQ01fQVJHIH0sCisgICAgeyAiL2VjaG8iLCAgICAgICAgIElOX0VDSCwgQ01fQVJHIH0sCisgICAgeyAiL2ludGVycnVwdHMiLCAgIElOX05PSSwgQ01fQVJHIH0sCisgICAgeyAiL3NpbGVuY2UiLCAgICAgIElOX1NJTCwgQ01fQVJHIH0sCisjaWZkZWYgQ09NTUVOVAorICAgIHsgIi9wYXR0ZXJuIiwgICAgICBJTl9QQVQsIENNX0FSRyB9LAorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5pbnN3dGFiID0gKHNpemVvZihpbnN3dGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworc3RhdGljIHN0cnVjdCBrZXl0YWIgY2xydGFiW10gPSB7CS8qIEtleXdvcmRzIGZvciBDTEVBUiBjb21tYW5kICovCisjaWZuZGVmIE5PU1BMCisgICAgeyAiYWxhcm0iLCAgICAgICAgICAgIENMUl9BTFIsICAgICAgICAgMCB9LAorI2lmZGVmIENLX0FQQworICAgIHsgImFwYyIsICAgICAgICAgICAgICBDTFJfQVBDLCAgICAgICAgIDAgfSwKKyNlbmRpZiAvKiBDS19BUEMgKi8KKyNpZmRlZiBQQVRURVJOUworICAgIHsgImJpbmFyeS1wYXR0ZXJucyIsICBDTFJfQklOLCAgICAgICAgIDAgfSwKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworICAgIHsgImJvdGgiLCAgICAgICAgICAgICBDTFJfREVWfENMUl9JTlAsIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisjaWZkZWYgT1MyCisgICAgeyAiY29tbWFuZC1zY3JlZW4iLCAgIENMUl9DTUQsICAgICAgICAgMCB9LAorI2VuZGlmIC8qIE9TMiAqLworI2lmbmRlZiBOT1NQTAorICAgIHsgImRldmljZSIsICAgICAgICAgICBDTFJfREVWLCAgICAgICAgIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJkZXZpY2UtYW5kLWlucHV0IiwgQ0xSX0RFVnxDTFJfSU5QLCAwIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICB7ICJkZXZpY2UtYnVmZmVyIiwgICAgQ0xSX0RFViwgICAgICAgICAwIH0sCisjaWZuZGVmIE5PRElBTAorICAgIHsgImRpYWwtc3RhdHVzIiwgICAgICBDTFJfRElBLAkgMCB9LAorI2VuZGlmIC8qIE5PRElBTCAqLworI2lmbmRlZiBOT1NQTAorICAgIHsgImlucHV0LWJ1ZmZlciIsICAgICBDTFJfSU5QLCAgICAgICAgIDAgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHsgImtleWJvYXJkLWJ1ZmZlciIsICBDTFJfS0JELCAgICAgICAgIDAgfSwKKyAgICB7ICJzZW5kLWxpc3QiLCAgICAgICAgQ0xSX1NGTCwgICAgICAgICAwIH0sCisjaWZkZWYgT1MyCisgICAgeyAic2NyIiwgICAgICAgICAgICAgIENMUl9TQ0wsICAgICAgICAgQ01fSU5WfENNX0FCUiB9LAorI2VuZGlmIC8qIE9TMiAqLworICAgIHsgInNjcmVlbiIsICAgICAgICAgICBDTFJfU0NSLCAgICAgICAgIDAgfSwKKyNpZmRlZiBPUzIKKyAgICB7ICJzY3JvbGxiYWNrIiwgICAgICAgQ0xSX1NDTCwgICAgICAgICBDTV9JTlYgfSwKKyAgICB7ICJ0ZXJtaW5hbC1zY3JlZW4iLCAgQ0xSX1RSTSwgICAgICAgICAwIH0sCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgUEFUVEVSTlMKKyAgICB7ICJ0ZXh0LXBhdHRlcm5zIiwgICAgQ0xSX1RYVCwgICAgICAgICAwIH0sCisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyAgICB7ICIiLCAwLCAwIH0KK307CitpbnQgbmNsZWFyID0gKHNpemVvZihjbHJ0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKSAtIDE7CisKK3N0cnVjdCBrZXl0YWIgY2xzdGFiW10gPSB7CQkvKiBLZXl3b3JkcyBmb3IgQ0xPU0UgY29tbWFuZCAqLworI2lmbmRlZiBOT1NQTAorICAgIHsgIiFyZWFkIiwgICAgICAgICAgIExPR1IsIENNX0lOViB9LAorICAgIHsgIiF3cml0ZSIsICAgICAgICAgIExPR1csIENNX0lOViB9LAorI2lmbmRlZiBOT1BVU0gKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBOT1NQTAorICAgIHsgImFwcGVuZC1maWxlIiwgICAgIExPR1csIENNX0lOViB9LAorI2VuZGlmIC8qIE5PU1BMICovCisjaWZuZGVmIE5PTE9DQUwKKyAgICB7ICJjb25uZWN0aW9uIiwgICAgICA5OTk5LCAwIH0sCisjZW5kaWYgLyogTk9MT0NBTCAqLworI2lmZGVmIENLTE9HRElBTAorICAgIHsgImN4LWxvZyIsICAgICAgICAgIExPR00sIDAgfSwKKyNlbmRpZiAvKiBDS0xPR0RJQUwgKi8KKyNpZmRlZiBERUJVRworICAgIHsgImRlYnVnLWxvZyIsICAgICAgIExPR0QsIDAgfSwKKyNlbmRpZiAvKiBERUJVRyAqLworICAgIHsgImhvc3QiLCAgICAgICAgICAgIDk5OTksIENNX0lOViB9LCAvKiBTeW5vbnltIGZvciBDTE9TRSBDT05ORUNUSU9OICovCisgICAgeyAibGluZSIsICAgICAgICAgICAgOTk5OSwgQ01fSU5WIH0sIC8qIFN5bm9ueW0gZm9yIENMT1NFIENPTk5FQ1RJT04gKi8KKyAgICB7ICJwIiwgICAgICAgICAgICAgICBMT0dQLCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAicGFja2V0LWxvZyIsICAgICAgTE9HUCwgMCB9LAorICAgIHsgInBvcnQiLCAgICAgICAgICAgIDk5OTksIENNX0lOViB9LCAvKiBTeW5vbnltIGZvciBDTE9TRSBDT05ORUNUSU9OICovCisjaWZuZGVmIE5PU1BMCisgICAgeyAicmVhZC1maWxlIiwgICAgICAgTE9HUiwgMCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisjaWZuZGVmIE5PTE9DQUwKKyAgICB7ICJzZXNzaW9uLWxvZyIsICAgICBMT0dTLCAwIH0sCisjZW5kaWYgLyogTk9MT0NBTCAqLworI2lmZGVmIFRMT0cKKyAgICB7ICJ0IiwgICAgICAgICAgICAgICBMT0dULCBDTV9BQlJ8Q01fSU5WIH0sIC8qIEJlY2F1c2Ugb2YgYSB0eXBvIGluICovCisgICAgeyAidHIiLCAgICAgICAgICAgICAgTE9HVCwgQ01fQUJSfENNX0lOViB9LCAvKiB0aGUgYm9vay4uLiAqLworICAgIHsgInRyYSIsICAgICAgICAgICAgIExPR1QsIENNX0FCUnxDTV9JTlYgfSwKKyAgICB7ICJ0cmFuIiwgICAgICAgICAgICBMT0dULCBDTV9BQlJ8Q01fSU5WIH0sCisgICAgeyAidHJhbnMiLCAgICAgICAgICAgTE9HVCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgInRyYW5zYSIsICAgICAgICAgIExPR1QsIENNX0FCUnxDTV9JTlYgfSwKKyAgICB7ICJ0cmFuc2FjIiwgICAgICAgICBMT0dULCBDTV9BQlJ8Q01fSU5WIH0sCisgICAgeyAidHJhbnNhY3QiLCAgICAgICAgTE9HVCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgInRyYW5zYWN0aSIsICAgICAgIExPR1QsIENNX0FCUnxDTV9JTlYgfSwKKyAgICB7ICJ0cmFuc2FjdGlvIiwgICAgICBMT0dULCBDTV9BQlJ8Q01fSU5WIH0sCisgICAgeyAidHJhbnNhY3Rpb24iLCAgICAgTE9HVCwgQ01fQUJSfENNX0lOViB9LAorICAgIHsgInRyYW5zYWN0aW9uLWxvZyIsIExPR1QsIDAgfSwKKyAgICB7ICJ0cmFuc2FjdGlvbnMiLCAgICBMT0dULCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBUTE9HICovCisjaWZuZGVmIE5PU1BMCisgICAgeyAid3JpdGUtZmlsZSIsICAgICAgTE9HVywgMCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisgICAgeyAiIiwgMCwgMCB9Cit9OworaW50IG5jbHMgPSAoc2l6ZW9mKGNsc3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworLyogU0hPVyBjb21tYW5kIGFyZ3VtZW50cyAqLworCisjaWZuZGVmIE5PU0hPVworc3RydWN0IGtleXRhYiBzaG90YWJbXSA9IHsKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJhbGFybSIsICAgICAgICBTSEFMUk0sIDAgfSwKKyAgICB7ICJhcmciLCAgICAgICAgICBTSEFSRywgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgImFyZ3VtZW50cyIsICAgIFNIQVJHLCAwIH0sCisgICAgeyAiYXJncyIsICAgICAgICAgU0hBUkcsIENNX0lOViB9LAorICAgIHsgImFycmF5cyIsICAgICAgIFNIQVJSLCAwIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT0NTRVRTCisgICAgeyAiYXNzb2NpYXRpb25zIiwgU0hBU1NPQywgMCB9LAorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJhdHRyaWJ1dGVzIiwgICBTSEFUVCwgMCB9LAorI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgQ0tfQVVUSEVOVElDQVRJT04KKyAgICB7ICJhdXRoZW50aWNhdGlvbiIsIFNIT0FVVEgsIENNX0lOViB9LAorI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisKKyNpZm5kZWYgTk9QVVNICisjaWZkZWYgQlJPV1NFUgorICAgIHsgImJyb3dzZXIiLCAgICAgIFNIQlJPV1NFLCBDTV9QU0h8Q01fTE9DIH0sCisjZW5kaWYgLyogIEJST1dTRVIgKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyAgICB7ICJjZCIsICAgICAgICAgICBTSENELCAwIH0sCisgICAgeyAiY2hhcmFjdGVyLXNldHMiLCBTSENTRSwgMCB9LAorICAgIHsgImNtZCIsICAgICAgICAgIFNIQ01ELCBDTV9JTlYgfSwKKyNpZm5kZWYgTk9MT0NBTAorICAgIHsgImNvbSIsICAgICAgICAgIFNIQ09NLCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiY29tbSIsICAgICAgICAgU0hDT00sIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJjb21tdW5pY2F0aW9ucyIsIFNIQ09NLCAwIH0sCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIHsgImNvbW1hbmQiLCAgICAgIFNIQ01ELCAwIH0sCisgICAgeyAiY29ubmVjdGlvbiIsICAgU0hDT05OWCwgMCB9LAorI2lmZGVmIENLX1NQRUVECisgICAgeyAiY29udHJvbC1wcmVmaXhpbmciLCBTSENUTCwgMCB9LAorI2VuZGlmIC8qIENLX1NQRUVEICovCisjaWZkZWYgQ0tMT0dESUFMCisgICAgeyAiY3giLCAgICAgICAgICAgU0hDT05OWCwgQ01fSU5WIH0sCisjZW5kaWYgLyogQ0tMT0dESUFMICovCisjaWZuZGVmIE5PU1BMCisgICAgeyAiY291bnQiLCAgICAgICAgU0hDT1UsIDAgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHsgImQiLCAgICAgICAgICAgIFNIRElBLCBDTV9JTlZ8Q01fQUJSIH0sCisjaWZkZWYgVk1TCisgICAgeyAiZGVmYXVsdCIsICAgICAgU0hERkxULCAwIH0sCisjZWxzZQorICAgIHsgImRlZmF1bHQiLCAgICAgIFNIREZMVCwgQ01fSU5WIH0sCisjZW5kaWYgLyogVk1TICovCisjaWZuZGVmIE5PRElBTAorICAgIHsgImRpYWwiLCAgICAgICAgIFNIRElBLCBDTV9MT0MgfSwKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyAgICB7ICJkb3VibGUvaWdub3JlIixTSERCTCwgMCB9LAorI2lmbmRlZiBOT1BVU0gKKyNpZm5kZWYgTk9GUklMTFMKKyAgICB7ICJlZGl0b3IiLCAgICAgICBTSEVESVQsIENNX1BTSCB9LAorI2VuZGlmIC8qICBOT0ZSSUxMUyAqLworI2VuZGlmIC8qIE5PUFVTSCAqLworI2lmbmRlZiBOT0xPQ0FMCisgICAgeyAiZXNjYXBlIiwgICAgICAgU0hFU0MsIENNX0xPQyB9LAorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICB7ICJleGl0IiwgICAgICAgICBTSEVYSSwgMCB9LAorICAgIHsgImV4dGVuZGVkLW9wdGlvbnMiLCBTSFhPUFQsIENNX0lOViB9LAorICAgIHsgImZlYXR1cmVzIiwgICAgIFNIRkVBLCAwIH0sCisgICAgeyAiZmlsZSIsICAgICAgICAgU0hGSUwsIDAgfSwKKyNpZm5kZWYgTk9MT0NBTAorICAgIHsgImZsb3ctY29udHJvbCIsIFNIT0ZMTywgMCB9LAorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZmRlZiBCUk9XU0VSCisgICAgeyAiZnRwIiwgICAgICAgICAgU0hPRlRQLCBDTV9QU0h8Q01fTE9DIH0sCisjZWxzZQorI2lmbmRlZiBOT0ZUUAorI2lmbmRlZiBTWVNGVFAKKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICB7ICJmdHAiLCAgICAgICAgICBTSE9GVFAsIDAgfSwJLyogKGJ1aWx0LWluIGZ0cCkgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNlbmRpZiAvKiBTWVNGVFAgKi8KKyNlbmRpZiAvKiBOT0ZUUCAqLworI2VuZGlmIC8qIEJST1dTRVIgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJmdW5jdGlvbnMiLCAgICBTSEZVTiwgMCB9LAorICAgIHsgImdsb2JhbHMiLCAgICAgIFNIVkFSLCAwIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZmRlZiBLVUkKKyAgICB7ICJndWkiLCAgICAgICAgICBTSE9HVUksIDAgfSwKKyNlbmRpZiAvKiBLVUkgKi8KKyNpZmRlZiBDS19SRUNBTEwKKyAgICB7ICJoaXN0b3J5IiwgICAgICBTSEhJU1RPUlksIDAgfSwKKyNlbmRpZiAvKiBDS19SRUNBTEwgKi8KKyAgICB7ICJpZ25vcmUvZG91YmxlIixTSERCTCwgQ01fSU5WIH0sCisgICAgeyAiaWtzZCIsICAgICAgICAgU0hPSUtTLCBDTV9JTlYgfSwKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJpbnB1dCIsICAgICAgICBTSElOUCwgMCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisjaWZuZGVmIE5PU0VUS0VZCisgICAgeyAiayIsICAgICAgICAgICAgU0hLRVksIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJrZXkiLCAgICAgICAgICBTSEtFWSwgMCB9LAorI2lmbmRlZiBOT0tWRVJCUworICAgIHsgImt2ZXJicyIsICAgICAgIFNIS1ZCLCAwIH0sCisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworI2lmZGVmIENLX0xBQkVMRUQKKyAgICB7ICJsYWJlbGVkLWZpbGUtaW5mbyIsIFNITEJMLCAwIH0sCisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworI2lmbmRlZiBOT0NTRVRTCisgICAgeyAibGFuZ3VhZ2VzIiwgICAgU0hMTkcsIDAgfSwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgeyAibG9ncyIsICAgICAgICAgU0hMT0csIDAgfSwKKyNpZm5kZWYgTk9TUEwKKyAgICB7ICJtYWNyb3MiLCAgICAgICBTSE1BQywgMCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisjaWZuZGVmIE5PRElBTAorICAgIHsgIm1vZGVtIiwgICAgICAgIFNITU9ELCBDTV9MT0MgfSwKKyNlbHNlCisgICAgeyAibW9kZW0tc2lnbmFscyIsU0hDT00sIENNX0lOVnxDTV9MT0MgfSwKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMk1PVVNFCisgICAgeyAibW91c2UiLCAgICAgICAgU0hNT1UsIENNX0xPQyB9LAorI2VuZGlmIC8qIE9TMk1PVVNFICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworI2lmZGVmIE5FVENPTk4KKyAgICB7ICJuZXR3b3JrIiwgICAgICBTSE5FVCwgQ01fTE9DIH0sCisjZWxzZQorICAgIHsgIm5ldHdvcmsiLCAgICAgIFNITkVULCBDTV9JTlZ8Q01fTE9DIH0sCisjZW5kaWYgLyogTkVUQ09OTiAqLworICAgIHsgIm9wdGlvbnMiLCAgICAgIFNIT1BUUywgMCB9LAorI2lmbmRlZiBOT1NQTAorICAgIHsgIm91dHB1dCIsICAgICAgIFNIT1VUUCwgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZmRlZiBBTllYMjUKKyNpZm5kZWYgSUJNWDI1CisgICAgeyAicGFkIiwgICAgICAgICAgU0hQQUQsICBDTV9MT0MgfSwKKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNlbmRpZiAvKiBBTllYMjUgKi8KKyAgICB7ICJwYXJhbWV0ZXJzIiwgICBTSFBBUiwgIENNX0lOViB9LAorI2lmZGVmIFBBVFRFUk5TCisgICAgeyAicGF0dGVybnMiLCAgICAgU0hPUEFULCAwIH0sCisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyAgICB7ICJwcmludGVyIiwgICAgICBTSFBSVCwgIDAgfSwKKyNpZmRlZiBDS19TUEVFRAorICAgIHsgInByZWZpeGluZyIsICAgIFNIQ1RMLCAgQ01fSU5WIH0sCisjZW5kaWYgLyogQ0tfU1BFRUQgKi8KKyNpZm5kZWYgTk9YRkVSCisgICAgeyAicHJvdG9jb2wiLCAgICAgU0hQUk8sICAwIH0sCisjZW5kaWYgLyogTk9YRkVSICovCisjaWZuZGVmIE5PU1BMCisgICAgeyAic2NyaXB0cyIsICAgICAgU0hTQ1IsICBDTV9MT0MgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHsgInNlbmQtbGlzdCIsICAgIFNIU0ZMLCAgMCB9LAorI2lmbmRlZiBOT1NFUlZFUgorICAgIHsgInNlcnZlciIsICAgICAgIFNIU0VSLCAgMCB9LAorI2VuZGlmIC8qIE5PU0VSVkVSICovCisjaWZuZGVmIE5PU0VYUAorICAgIHsgInNleHByZXNzaW9uIiwgIFNIU0VYUCwgMCB9LAorI2VuZGlmIC8qIE5PU0VYUCAqLworI2lmZGVmIEFOWVNTSAorICAgIHsgInNzaCIsICAgICAgICAgIFNIT1NTSCwgMCB9LAorI2VuZGlmIC8qIEFOWVNTSCAqLworICAgIHsgInN0YWNrIiwgICAgICAgIFNIU1RLLCAgMCB9LAorICAgIHsgInN0YXR1cyIsICAgICAgIFNIU1RBLCAgMCB9LAorI2lmZGVmIFNUUkVBTUlORworICAgIHsgInN0cmVhbWluZyIsICAgIFNIT1NUUiwgMCB9LAorI2VuZGlmIC8qIFNUUkVBTUlORyAqLworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgeyAidGFicyIsICAgICAgICAgIFNIVEFCLCBDTV9JTlZ8Q01fTE9DIH0sCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgQ0tfVEFQSQorICAgIHsgInRhcGkiLCAgICAgICAgICBTSFRBUEksIENNX0xPQyB9LAorICAgIHsgInRhcGktY29tbSIsICAgICBTSFRBUElfQywgQ01fSU5WfENNX0xPQyB9LAorICAgIHsgInRhcGktbG9jYXRpb24iLCBTSFRBUElfTCwgQ01fSU5WfENNX0xPQyB9LAorICAgIHsgInRhcGktbW9kZW0iLCAgICBTSFRBUElfTSwgQ01fSU5WfENNX0xPQyB9LAorI2VuZGlmIC8qIENLX1RBUEkgKi8KKyAgICB7ICJ0Y3AiLCAgICAgICAgICAgU0hUQ1AsICBDTV9MT0MgfSwKKyNpZmRlZiBUTkNPREUKKyAgICB7ICJ0ZWwiLCAgICAgICAgICAgU0hURUwsICBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAidGVsbmV0IiwgICAgICAgIFNIVEVMLCAgMCB9LAorICAgIHsgInRlbG9wdCIsICAgICAgICBTSFRPUFQsIDAgfSwKKyNlbmRpZiAvKiBUTkNPREUgKi8KKyAgICB7ICJ0ZXJtaW5hbCIsICAgICAgU0hURVIsICBDTV9MT0MgfSwKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZuZGVmIE5PWE1JVAorICAgIHsgInRyIiwgICAgICAgICAgICBTSFhNSSwgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgInRyYSIsICAgICAgICAgICBTSFhNSSwgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgInRyYW4iLCAgICAgICAgICBTSFhNSSwgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgInRyYW5zIiwgICAgICAgICBTSFhNSSwgQ01fSU5WfENNX0FCUiB9LAorI2VuZGlmIC8qIE5PWE1JVCAqLworI2lmbmRlZiBOT1hGRVIKKyAgICB7ICJ0cmFuc2ZlciIsICAgICAgU0hPWEZFUiwgMCB9LAorI2VuZGlmIC8qIE5PWEZFUiAqLworI2lmbmRlZiBOT1hNSVQKKyAgICB7ICJ0cmFuc21pdCIsICAgICAgU0hYTUksIDAgfSwKKyNlbmRpZiAvKiBOT1hNSVQgKi8KKyNpZmRlZiBDS19UUklHR0VSCisgICAgeyAidHJpZ2dlciIsICAgICAgIFNIVFJJRywgQ01fTE9DIH0sCisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworI2lmbmRlZiBOT1NFVEtFWQorI2lmbmRlZiBOT0tWRVJCUworI2lmZGVmIE9TMgorICAgIHsgInVkayIsICAgICAgICAgICBTSFVESywgQ01fTE9DIH0sCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9LVkVSQlMgKi8KKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworI2lmbmRlZiBOT1NQTAorICAgIHsgInZhcmlhYmxlcyIsICAgICBTSEJVSSwgMCB9LAorI2VuZGlmIC8qIE5PU1BMICovCisjaWZuZGVmIE5PRlJJTExTCisgICAgeyAidmVyc2lvbnMiLCAgICAgIFNIVkVSLCAwIH0sCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyNpZmRlZiBPUzIKKyAgICB7ICJ2c2NybiIsICAgICAgICAgU0hWU0NSTiwgQ01fSU5WfENNX0xPQyB9LAorI2VuZGlmIC8qIE9TMiAqLworICAgIHsgInhmZXIiLCAgICAgICAgICBTSE9YRkVSLCAgQ01fSU5WIH0sCisjaWZuZGVmIE5PWE1JVAorICAgIHsgInhtaXQiLCAgICAgICAgICBTSFhNSSwgICAgQ01fSU5WIH0sCisjZW5kaWYgLyogTk9YTUlUICovCisgICAgeyAiIiwgMCwgMCB9Cit9OworaW50IG5zaG8gPSAoc2l6ZW9mKHNob3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKyNlbmRpZiAvKiBOT1NIT1cgKi8KKworI2lmZGVmIEFOWVgyNQorI2lmbmRlZiBJQk1YMjUKK3N0cnVjdCBrZXl0YWIgcGFkdGFiW10gPSB7ICAgICAgICAgICAgICAvKiBQQUQgY29tbWFuZHMgKi8KKyAgICB7ICJjbGVhciIsICAgICAgWFlQQURMLCAwIH0sCisgICAgeyAiaW50ZXJydXB0IiwgIFhZUEFESSwgMCB9LAorICAgIHsgInJlc2V0IiwgICAgICBYWVBBRFIsIDAgfSwKKyAgICB7ICJzdGF0dXMiLCAgICAgWFlQQURTLCAwIH0KK307CitpbnQgbnBhZGMgPSAoc2l6ZW9mKHBhZHRhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworI2VuZGlmIC8qIElCTVgyNSAqLworI2VuZGlmIC8qIEFOWVgyNSAqLworCisjaWZuZGVmIE5PU0VSVkVSCitzdGF0aWMgc3RydWN0IGtleXRhYiBrbXN0YWJbXSA9IHsKKyAgICB7ICJib3RoIiwgICAgMywgMCB9LAorICAgIHsgImxvY2FsIiwgICAxLCAwIH0sCisgICAgeyAicmVtb3RlIiwgIDIsIDAgfQorfTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgZW5hdGFiW10gPSB7CS8qIEVOQUJMRSBjb21tYW5kcyAqLworICAgIHsgImFsbCIsICAgICAgICBFTl9BTEwsICAwIH0sCisjaWZuZGVmIE5PU1BMCisgICAgeyAiYXMiLCAgICAgICAgIEVOX0FTRywgIENNX0lOVnxDTV9BQlIgfSwKKyAgICB7ICJhc2ciLCAgICAgICAgRU5fQVNHLCAgQ01fSU5WIH0sCisgICAgeyAiYXNzaWduIiwgICAgIEVOX0FTRywgIDAgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBkYXRhZ2VuZXJhbAorICAgIHsgImJ5ZSIsICAgICAgICBFTl9CWUUsICAwIH0sCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyAgICB7ICJjZCIsICAgICAgICAgRU5fQ1dELCAgMCB9LAorI2lmZGVmIFpDT1BZCisgICAgeyAiY29weSIsICAgICAgIEVOX0NQWSwgIDAgfSwKKyNlbmRpZiAvKiBaQ09QWSAqLworICAgIHsgImN3ZCIsICAgICAgICBFTl9DV0QsICBDTV9JTlYgfSwKKyAgICB7ICJkZWxldGUiLCAgICAgRU5fREVMLCAgMCB9LAorICAgIHsgImRpcmVjdG9yeSIsICBFTl9ESVIsICAwIH0sCisgICAgeyAiZW5hYmxlIiwgICAgIEVOX0VOQSwgIENNX0lOViB9LAorICAgIHsgImV4aXQiLCAgICAgICBFTl9YSVQsICAwIH0sCisgICAgeyAiZmluaXNoIiwgICAgIEVOX0ZJTiwgIDAgfSwKKyAgICB7ICJnZXQiLCAgICAgICAgRU5fR0VULCAgMCB9LAorICAgIHsgImhvc3QiLCAgICAgICBFTl9IT1MsICAwIH0sCisgICAgeyAibWFpbCIsICAgICAgIEVOX01BSSwgIDAgfSwKKyAgICB7ICJta2RpciIsICAgICAgRU5fTUtELCAgMCB9LAorICAgIHsgInByaW50IiwgICAgICBFTl9QUkksICAwIH0sCisjaWZuZGVmIE5PU1BMCisgICAgeyAicXVlcnkiLCAgICAgIEVOX1FVRSwgIDAgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHsgInJlbmFtZSIsICAgICBFTl9SRU4sICAwIH0sCisgICAgeyAicmV0cmlldmUiLCAgIEVOX1JFVCwgIENNX0lOViB9LAorICAgIHsgInJtZGlyIiwgICAgICBFTl9STUQsICAwIH0sCisgICAgeyAic2VuZCIsICAgICAgIEVOX1NFTiwgIDAgfSwKKyAgICB7ICJzZXQiLCAgICAgICAgRU5fU0VULCAgMCB9LAorICAgIHsgInNwYWNlIiwgICAgICBFTl9TUEEsICAwIH0sCisgICAgeyAidHlwZSIsICAgICAgIEVOX1RZUCwgIDAgfSwKKyAgICB7ICJ3aG8iLCAgICAgICAgRU5fV0hPLCAgMCB9Cit9Oworc3RhdGljIGludCBuZW5hID0gKHNpemVvZihlbmF0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpKTsKKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworCitzdHJ1Y3Qga2V5dGFiIHR4dGJpbltdID0geworICAgIHsgImFsbCIsICAgICAgICAyLCAwIH0sCisgICAgeyAiYmluYXJ5IiwgICAgIDEsIDAgfSwKKyAgICB7ICJ0ZXh0IiwgICAgICAgMCwgMCB9Cit9OworCisjaWZuZGVmIE5PWEZFUgorc3RhdGljIHN0cnVjdCBrZXl0YWIgc25kdGFiW10gPSB7CS8qIFNFTkQgY29tbWFuZCBvcHRpb25zICovCisgICAgeyAiL2FmdGVyIiwgICAgICAgICAgIFNORF9BRlQsIENNX0FSRyB9LAorI2lmbmRlZiBOT1NQTAorICAgIHsgIi9hcnJheSIsICAgICAgICAgICBTTkRfQVJSLCBDTV9BUkcgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHsgIi9hcy1uYW1lIiwgICAgICAgICBTTkRfQVNOLCBDTV9BUkcgfSwKKyAgICB7ICIvYiIsICAgICAgICAgICAgICAgU05EX0JJTiwgQ01fSU5WfENNX0FCUiB9LAorICAgIHsgIi9iZWZvcmUiLCAgICAgICAgICBTTkRfQkVGLCBDTV9BUkcgfSwKKyAgICB7ICIvYmluYXJ5IiwgICAgICAgICAgU05EX0JJTiwgMCB9LAorI2lmZGVmIENBTElCUkFURQorICAgIHsgIi9jIiwgICAgICAgICAgICAgICBTTkRfQ01ELCBDTV9JTlZ8Q01fQUJSIH0sCisgICAgeyAiL2NhbGlicmF0ZSIsICAgICAgIFNORF9DQUwsIENNX0lOVnxDTV9BUkcgfSwKKyNlbmRpZiAvKiBDQUxJQlJBVEUgKi8KKyAgICB7ICIvY29tbWFuZCIsICAgICAgICAgU05EX0NNRCwgQ01fUFNIIH0sCisgICAgeyAiL2RlbGV0ZSIsICAgICAgICAgIFNORF9ERUwsIDAgfSwKKyNpZmRlZiBVTklYT1JPU0sKKyAgICB7ICIvZG90ZmlsZXMiLCAgICAgICAgU05EX0RPVCwgMCB9LAorI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworICAgIHsgIi9leGNlcHQiLCAgICAgICAgICBTTkRfRVhDLCBDTV9BUkcgfSwKKyNpZmRlZiBQSVBFU0VORAorICAgIHsgIi9maWx0ZXIiLCAgICAgICAgICBTTkRfRkxULCBDTV9BUkd8Q01fUFNIIH0sCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKyAgICB7ICIvZmlsZW5hbWVzIiwgICAgICAgU05EX05BTSwgQ01fQVJHIH0sCisjaWZkZWYgQ0tTWU1MSU5LCisgICAgeyAiL2ZvbGxvd2xpbmtzIiwJICBTTkRfTE5LLCAwIH0sCisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisjaWZkZWYgVk1TCisgICAgeyAiL2ltYWdlIiwgICAgICAgICAgIFNORF9JTUcsIDAgfSwKKyNlbHNlCisgICAgeyAiL2ltYWdlIiwgICAgICAgICAgIFNORF9CSU4sIENNX0lOViB9LAorI2VuZGlmIC8qIFZNUyAqLworI2lmZGVmIENLX0xBQkVMRUQKKyAgICB7ICIvbGFiZWxlZCIsICAgICAgICAgU05EX0xCTCwgMCB9LAorI2VuZGlmIC8qIENLX0xBQkVMRUQgKi8KKyAgICB7ICIvbGFyZ2VyLXRoYW4iLCAgICAgU05EX0xBUiwgQ01fQVJHIH0sCisgICAgeyAiL2xpc3RmaWxlIiwgICAgICAgIFNORF9GSUwsIENNX0FSRyB9LAorI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgIi9tYWlsIiwgICAgICAgICAgICBTTkRfTUFJLCBDTV9BUkcgfSwKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2lmZGVmIENLX1RNUERJUgorICAgIHsgIi9tb3ZlLXRvIiwgICAgICAgICBTTkRfTU9WLCBDTV9BUkcgfSwKKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKyAgICB7ICIvbm9iYWNrdXBmaWxlcyIsICAgU05EX05PQiwgMCB9LAorI2lmZGVmIFVOSVhPUk9TSworICAgIHsgIi9ub2RvdGZpbGVzIiwgICAgICBTTkRfTk9ELCAwIH0sCisjZW5kaWYgLyogVU5JWE9ST1NLICovCisjaWZkZWYgQ0tTWU1MSU5LCisgICAgeyAiL25vZm9sbG93bGlua3MiLAkgIFNORF9OTEssIDAgfSwKKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKyAgICB7ICIvbm90LWFmdGVyIiwgICAgICAgU05EX05BRiwgQ01fQVJHIH0sCisgICAgeyAiL25vdC1iZWZvcmUiLCAgICAgIFNORF9OQkUsIENNX0FSRyB9LAorICAgIHsgIi9wYXRobmFtZXMiLCAgICAgICBTTkRfUFRILCBDTV9BUkcgfSwKKyAgICB7ICIvcHJpbnQiLCAgICAgICAgICAgU05EX1BSSSwgQ01fQVJHIH0sCisjaWZkZWYgQ0tfWFlaCisgICAgeyAiL3Byb3RvY29sIiwgICAgICAgIFNORF9QUk8sIENNX0FSRyB9LAorI2Vsc2UKKyAgICB7ICIvcHJvdG9jb2wiLCAgICAgICAgU05EX1BSTywgQ01fQVJHfENNX0lOViB9LAorI2VuZGlmIC8qIENLX1hZWiAqLworICAgIHsgIi9xdWlldCIsICAgICAgICAgICBTTkRfU0hILCAwIH0sCisgICAgeyAiL3JlY292ZXIiLCAgICAgICAgIFNORF9SRVMsIDAgfSwKKyNpZmRlZiBSRUNVUlNJVkUKKy8qIFN5c3RlbXMgd2hlcmUgd2UgZG8gcmVjdXJzaW9uICovCisgICAgeyAiL3JlY3Vyc2l2ZSIsICAgICAgIFNORF9SRUMsIDAgfSwKKyNlbHNlCisjaWZkZWYgVk1TCisvKiBTeXN0ZW1zIHRoYXQgZG8gcmVjdXJzaW9uIHRoZW1zZWx2ZXMgd2l0aG91dCBvdXIgYXNzaXN0YW5jZSAqLworLyogaWYgd2UgZ2l2ZSB0aGVtIHRoZSByaWdodCBraW5kIG9mIHdpbGRjYXJkICovCisgICAgeyAiL3JlY3Vyc2l2ZSIsICAgICAgIFNORF9SRUMsIDAgfSwKKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICB7ICIvcmVjdXJzaXZlIiwgICAgICAgU05EX1JFQywgMCB9LAorI2Vsc2UKKyAgICB7ICIvcmVjdXJzaXZlIiwgICAgICAgU05EX1JFQywgQ01fSU5WIH0sCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICB7ICIvcmVuYW1lLXRvIiwgICAgICAgU05EX1JFTiwgQ01fQVJHIH0sCisgICAgeyAiL3NpbmNlIiwgICAgICAgICAgIFNORF9BRlQsIENNX0lOVnxDTV9BUkcgfSwKKyAgICB7ICIvc21hbGxlci10aGFuIiwgICAgU05EX1NNQSwgQ01fQVJHIH0sCisgICAgeyAiL3N0YXJ0aW5nLWF0IiwgICAgIFNORF9TVEEsIENNX0FSRyB9LAorI2lmbmRlZiBOT0ZSSUxMUworICAgIHsgIi9zdSIsICAgICAgICAgICAgICBTTkRfQVNOLCBDTV9BUkd8Q01fSU5WfENNX0FCUiB9LAorICAgIHsgIi9zdWIiLCAgICAgICAgICAgICBTTkRfQVNOLCBDTV9BUkd8Q01fSU5WfENNX0FCUiB9LAorICAgIHsgIi9zdWJqZWN0IiwgICAgICAgICBTTkRfQVNOLCBDTV9BUkcgfSwKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2lmZGVmIFJFQ1VSU0lWRQorICAgIHsgIi9zdWJkaXJlY3RvcmllcyIsICBTTkRfUkVDLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyAgICB7ICIvdGV4dCIsICAgICAgICAgICAgU05EX1RYVCwgMCB9LAorICAgIHsgIi90cmFuc3BhcmVudCIsICAgICBTTkRfWFBBLCAwIH0sCisgICAgeyAiL3R5cGUiLCAgICAgICAgICAgIFNORF9UWVAsIENNX0FSRyB9Cit9OworI2RlZmluZSBOU05EVEFCIHNpemVvZihzbmR0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKQorc3RhdGljIGludCBuc25kdGFiID0gTlNORFRBQjsKKworI2lmbmRlZiBOT01TRU5ECitzdGF0aWMgc3RydWN0IGtleXRhYiBtc25kdGFiW10gPSB7CS8qIE1TRU5EIG9wdGlvbnMgKi8KKyAgICB7ICIvYWZ0ZXIiLCAgICAgICAgICAgU05EX0FGVCwgQ01fQVJHIH0sCisgICAgeyAiL2JlZm9yZSIsICAgICAgICAgIFNORF9CRUYsIENNX0FSRyB9LAorICAgIHsgIi9iaW5hcnkiLCAgICAgICAgICBTTkRfQklOLCAwIH0sCisgICAgeyAiL2RlbGV0ZSIsICAgICAgICAgIFNORF9ERUwsIDAgfSwKKyAgICB7ICIvZXhjZXB0IiwgICAgICAgICAgU05EX0VYQywgQ01fQVJHIH0sCisgICAgeyAiL2ZpbGVuYW1lcyIsICAgICAgIFNORF9OQU0sIENNX0FSRyB9LAorI2lmZGVmIENLU1lNTElOSworICAgIHsgIi9mb2xsb3dsaW5rcyIsCSAgU05EX0xOSywgMCB9LAorI2VuZGlmIC8qIENLU1lNTElOSyAqLworI2lmZGVmIFZNUworICAgIHsgIi9pbWFnZSIsICAgICAgICAgICBTTkRfSU1HLCAwIH0sCisjZWxzZQorICAgIHsgIi9pbWFnZSIsICAgICAgICAgICBTTkRfQklOLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBWTVMgKi8KKyNpZmRlZiBDS19MQUJFTEVECisgICAgeyAiL2xhYmVsZWQiLCAgICAgICAgIFNORF9MQkwsIDAgfSwKKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisgICAgeyAiL2xhcmdlci10aGFuIiwgICAgIFNORF9MQVIsIENNX0FSRyB9LAorICAgIHsgIi9saXN0IiwgICAgICAgICAgICBTTkRfRklMLCBDTV9BUkcgfSwKKyNpZm5kZWYgTk9GUklMTFMKKyAgICB7ICIvbWFpbCIsICAgICAgICAgICAgU05EX01BSSwgQ01fQVJHIH0sCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyNpZmRlZiBDS19UTVBESVIKKyAgICB7ICIvbW92ZS10byIsICAgICAgICAgU05EX01PViwgQ01fQVJHIH0sCisjZW5kaWYgLyogQ0tfVE1QRElSICovCisjaWZkZWYgQ0tTWU1MSU5LCisgICAgeyAiL25vZm9sbG93bGlua3MiLAlTTkRfTkxLLCAwIH0sCisjZW5kaWYgLyogQ0tTWU1MSU5LICovCisgICAgeyAiL25vdC1hZnRlciIsICAgICAgIFNORF9OQUYsIENNX0FSRyB9LAorICAgIHsgIi9ub3QtYmVmb3JlIiwgICAgICBTTkRfTkJFLCBDTV9BUkcgfSwKKyAgICB7ICIvcGF0aG5hbWVzIiwgICAgICAgU05EX1BUSCwgQ01fQVJHIH0sCisgICAgeyAiL3ByaW50IiwgICAgICAgICAgIFNORF9QUkksIENNX0FSRyB9LAorI2lmZGVmIENLX1hZWgorICAgIHsgIi9wcm90b2NvbCIsICAgICAgICBTTkRfUFJPLCBDTV9BUkcgfSwKKyNlbmRpZiAvKiBDS19YWVogKi8KKyAgICB7ICIvcXVpZXQiLCAgICAgICAgICAgU05EX1NISCwgMCB9LAorICAgIHsgIi9yZWNvdmVyIiwgICAgICAgICBTTkRfUkVTLCAwIH0sCisgICAgeyAiL3JlbmFtZS10byIsICAgICAgIFNORF9SRU4sIENNX0FSRyB9LAorICAgIHsgIi9zaW5jZSIsICAgICAgICAgICBTTkRfQUZULCBDTV9JTlZ8Q01fQVJHIH0sCisgICAgeyAiL3NtYWxsZXItdGhhbiIsICAgIFNORF9TTUEsIENNX0FSRyB9LAorICAgIHsgIi9zdGFydGluZy1hdCIsICAgICBTTkRfU1RBLCBDTV9BUkcgfSwKKyNpZm5kZWYgTk9GUklMTFMKKyAgICB7ICIvc3ViamVjdCIsICAgICAgICAgU05EX0FTTiwgQ01fQVJHIH0sCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyAgICB7ICIvdGV4dCIsICAgICAgICAgICAgU05EX1RYVCwgMCB9LAorICAgIHsgIi90cmFuc3BhcmVudCIsICAgICBTTkRfWFBBLCAwIH0sCisgICAgeyAiL3R5cGUiLCAgICAgICAgICAgIFNORF9UWVAsIENNX0FSRyB9Cit9OworI2RlZmluZSBOTVNORFRBQiBzaXplb2YobXNuZHRhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpCitzdGF0aWMgaW50IG5tc25kdGFiID0gTk1TTkRUQUI7CisjZW5kaWYgLyogTk9NU0VORCAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisvKiBDT05ORUNUIGNvbW1hbmQgc3dpdGNoZXMgKi8KKworI2RlZmluZSBDT05OX0lJICAwCS8qIElkbGUgaW50ZXJ2YWwgKi8KKyNkZWZpbmUgQ09OTl9JUyAgMQkvKiBJZGxlIHN0cmluZyAqLworI2RlZmluZSBDT05OX0lMICAyCS8qIElkbGUgbGltaXQgKi8KKyNkZWZpbmUgQ09OTl9OViAgMwkvKiBOb24tVmVyYm9zZSAqLworI2RlZmluZSBDT05OX1RMICA0CS8qIFRpbWUgbGltaXQgKi8KKyNkZWZpbmUgQ09OTl9UUyAgNQkvKiBUcmlnZ2VyIHN0cmluZyAqLworI2RlZmluZSBDT05OX0FTICA2CS8qIEFzeW5jaHJvbm91cyAqLworI2RlZmluZSBDT05OX1NZICA3CS8qIFN5bmNocm9ub3VzICovCisjZGVmaW5lIENPTk5fTUFYIDcJLyogTnVtYmVyIG9mIENPTk5FQ1Qgc3dpdGNoZXMgKi8KKworI2lmbmRlZiBOT0xPQ0FMCitzdGF0aWMgc3RydWN0IGtleXRhYiBjb25udGFiW10gPSB7CisjaWZkZWYgT1MyCisgICAgeyAiL2FzeW5jaHJvbm91cyIsICAgIENPTk5fQVMsIENNX0lOViB9LAorI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIFhMSU1JVFMKKyAgICB7ICIvaWRsZS1pbnRlcnZhbCIsICAgQ09OTl9JSSwgQ01fQVJHIH0sCisgICAgeyAiL2lkbGUtbGltaXQiLCAgICAgIENPTk5fSUwsIENNX0FSRyB9LAorICAgIHsgIi9pZGxlLXN0cmluZyIsICAgICBDT05OX0lTLCBDTV9BUkcgfSwKKyAgICB7ICIvcXVpZXRseSIsICAgICAgICAgQ09OTl9OViwgQ01fSU5WIH0sCisjZWxzZQorICAgIHsgIi9xdWlldGx5IiwgICAgICAgICBDT05OX05WLCAwIH0sCisjZW5kaWYgLyogWExJTUlUUyAqLworI2lmZGVmIE9TMgorICAgIHsgIi9zeW5jaHJvbm91cyIsICAgICBDT05OX1NZLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBYTElNSVRTCisgICAgeyAiL3RpbWUtbGltaXQiLCAgICAgIENPTk5fVEwsIENNX0FSRyB9LAorI2VuZGlmIC8qIFhMSU1JVFMgKi8KKyNpZmRlZiBDS19UUklHR0VSCisgICAgeyAiL3RyaWdnZXIiLCAgICAgICAgIENPTk5fVFMsIENNX0FSRyB9LAorI2VuZGlmIC8qIENLX1RSSUdHRVIgKi8KKyAgICB7ICIiLDAsMCB9Cit9OworI2RlZmluZSBOQ09OTlRBQiBzaXplb2YoY29ubnRhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpCitzdGF0aWMgaW50IG5jb25udGFiID0gTkNPTk5UQUI7CisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZuZGVmIE5PWEZFUgorc3RhdGljIHN0cnVjdCBrZXl0YWIgc3RhdHRhYltdID0gewkvKiBTVEFUSVNUSUNTIGNvbW1hbmQgc3dpdGNoZXMgKi8KKyAgICB7ICIvYnJpZWYiLCAgIDEsIDAgfSwKKyAgICB7ICIvdmVyYm9zZSIsIDAsIDAgfQorfTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1NQTAorI2lmZGVmIENPTU1FTlQKK3N0cnVjdCBtdGFiIG1hY3RhYltNQUNfTUFYXSA9IHsJCS8qIFByZWluaXRpYWxpemVkIG1hY3JvIHRhYmxlICovCisgICAgeyBOVUxMLCBOVUxMLCAwIH0KK307CisjZWxzZQorc3RydWN0IG10YWIgKm1hY3RhYjsJCQkvKiBEeW5hbWljYWxseSBhbGxvY2F0ZWQgbWFjcm8gdGFibGUgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCitpbnQgbm1hYyA9IDA7CisKK3N0cnVjdCBrZXl0YWIgbWFja2V5W01BQ19NQVhdOwkJLyogTWFjcm8gbmFtZXMgYXMgY29tbWFuZCBrZXl3b3JkcyAqLworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9TUEwKKyNpZmRlZiAgT1MyCitzdHJ1Y3Qga2V5dGFiIGJlZXB0YWJbXSA9IHsJCS8qIEJlZXAgb3B0aW9ucyAqLworICAgIHsgImVycm9yIiwgQlBfRkFJTCwgMCB9LAorICAgIHsgImluZm9ybWF0aW9uIiwgQlBfTk9URSwgMCB9LAorICAgIHsgIndhcm5pbmciLCBCUF9XQVJOLCAwIH0KK307CitpbnQgbmJlZXB0YWIgPSBzaXplb2YoYmVlcHRhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpOworCisvKiBDTEVBUiBDT01NTUFORC1TQ1JFRU4gb3B0aW9ucyAqLworCisjZGVmaW5lIENMUl9DX0FMTCAwCisjZGVmaW5lIENMUl9DX0JPTCAxCisjZGVmaW5lIENMUl9DX0JPUyAyCisjZGVmaW5lIENMUl9DX0VPTCAzCisjZGVmaW5lIENMUl9DX0VPUyA0CisjZGVmaW5lIENMUl9DX0xJTiA1CisjZGVmaW5lIENMUl9DX1NDUiA2CisKK3N0cnVjdCBrZXl0YWIgY2xyY21kdGFiW10gPSB7CisgICAgeyAiYWxsIiwgICAgICAgIENMUl9DX0FMTCwgMCB9LAorICAgIHsgImJvbCIsICAgICAgICBDTFJfQ19CT0wsIDAgfSwKKyAgICB7ICJib3MiLCAgICAgICAgQ0xSX0NfQk9TLCAwIH0sCisgICAgeyAiZW9sIiwgICAgICAgIENMUl9DX0VPTCwgMCB9LAorICAgIHsgImVvcyIsICAgICAgICBDTFJfQ19FT1MsIDAgfSwKKyAgICB7ICJsaW5lIiwgICAgICAgQ0xSX0NfTElOLCAwIH0sCisgICAgeyAic2Nyb2xsYmFjayIsIENMUl9DX1NDUiwgMCB9Cit9OworaW50IG5jbHJjbWQgPSBzaXplb2YoY2xyY21kdGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYik7CisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIENPTU1FTlQKKy8qIE5vdCB1c2VkIGF0IHByZXNlbnQgKi8KK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHBhZ2V0YWJbXSA9IHsKKyAgICB7ICIvbW9yZSIsICAgMSwgQ01fSU5WIH0sCisgICAgeyAiL25vcGFnZSIsIDAsIDAgfSwKKyAgICB7ICIvcGFnZSIsICAgMSwgMCB9Cit9OworaW50IG5wYWdldGFiID0gc2l6ZW9mKHBhZ2V0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNkZWZpbmUgVFlQX05PUCAgMAkJCS8qIC9OT1BBR0UgKi8KKyNkZWZpbmUgVFlQX1BBRyAgMQkJCS8qIC9QQUdFICovCisjZGVmaW5lIFRZUF9IRUEgIDIJCQkvKiAvSEVBRDpuICovCisjZGVmaW5lIFRZUF9UQUkgIDMJCQkvKiAvVEFJTDpuICovCisjZGVmaW5lIFRZUF9QQVQgIDQJCQkvKiAvTUFUQ0g6cGF0dGVybiAqLworI2RlZmluZSBUWVBfV0lEICA1CQkJLyogL1dJRFRIOmNvbHMgKi8KKyNkZWZpbmUgVFlQX0NPVSAgNgkJCS8qIC9DT1VOVCAqLworI2RlZmluZSBUWVBfT1VUICA3CQkJLyogL09VVFBVVDpmaWxlICovCisjZGVmaW5lIFRZUF9QRlggIDgJCQkvKiAvUFJFRklYOnN0cmluZyAqLworI2lmZGVmIFVOSUNPREUKKyNkZWZpbmUgVFlQX1hJTiAgOQkJCS8qIC9UUkFOU0xBVEUtRlJPTTpjaGFyc2V0ICovCisjZGVmaW5lIFRZUF9YVVQgMTAJCQkvKiAvVFJBTlNMQVRFLVRPOmNoYXJzZXQgKi8KKyNkZWZpbmUgVFlQX1hQQSAxMQkJCS8qIC9UUkFOU1BBUkVOVCAqLworI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNpZmRlZiBLVUkKKyNkZWZpbmUgVFlQX0dVSSAxMgkJCS8qIC9HVUk6dGl0bGUgKi8KKyNkZWZpbmUgVFlQX0hJRyAxMwkJCS8qIC9IRUlHSFQ6cm93cyAqLworI2VuZGlmIC8qIEtVSSAqLworI2RlZmluZSBUWVBfTlVNIDE0CQkJLyogL05VTUJFUiAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiB0eXBldGFiW10gPSB7CS8qIFRZUEUgY29tbWFuZCBzd2l0Y2hlcyAqLworICAgIHsgIi9jb3VudCIsICAgICAgICAgIFRZUF9DT1UsIDAgfSwKKyNpZmRlZiBVTklDT0RFCisgICAgeyAiL2NoYXJhY3Rlci1zZXQiLCAgVFlQX1hJTiwgQ01fQVJHIH0sCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2lmZGVmIEtVSQorICAgIHsgIi9ndWkiLCAgICAgICAgICAgIFRZUF9HVUksIENNX0FSRyB9LAorI2VuZGlmIC8qIEtVSSAqLworICAgIHsgIi9oZWFkIiwgICAgICAgICAgIFRZUF9IRUEsIENNX0FSRyB9LAorI2lmZGVmIEtVSQorICAgIHsgIi9oZWlnaHQiLCAgICAgICAgIFRZUF9ISUcsIENNX0FSRyB9LAorI2VuZGlmIC8qIEtVSSAqLworICAgIHsgIi9tYXRjaCIsICAgICAgICAgIFRZUF9QQVQsIENNX0FSRyB9LAorI2lmZGVmIENLX1RUR1dTSVoKKyAgICB7ICIvbW9yZSIsICAgICAgICAgICBUWVBfUEFHLCBDTV9JTlYgfSwKKyAgICB7ICIvbm9wYWdlIiwgICAgICAgICBUWVBfTk9QLCAwIH0sCisgICAgeyAiL251bWJlciIsICAgICAgICAgVFlQX05VTSwgMCB9LAorICAgIHsgIi9vdXRwdXQiLCAgICAgICAgIFRZUF9PVVQsIENNX0FSRyB9LAorICAgIHsgIi9wYWdlIiwgICAgICAgICAgIFRZUF9QQUcsIDAgfSwKKyNlbmRpZiAvKiBDS19UVEdXU0laICovCisgICAgeyAiL3ByZWZpeCIsICAgICAgICAgVFlQX1BGWCwgQ01fQVJHIH0sCisgICAgeyAiL3RhaWwiLCAgICAgICAgICAgVFlQX1RBSSwgQ01fQVJHIH0sCisjaWZkZWYgVU5JQ09ERQorICAgIHsgIi90cmFuc2xhdGUtdG8iLCAgIFRZUF9YVVQsIENNX0FSRyB9LAorICAgIHsgIi90cmFuc3BhcmVudCIsICAgIFRZUF9YUEEsIDAgfSwKKyNlbmRpZiAvKiBVTklDT0RFICovCisgICAgeyAiL3dpZHRoIiwgICAgICAgICAgVFlQX1dJRCwgQ01fQVJHIH0sCisjaWZkZWYgVU5JQ09ERQorICAgIHsgIi94bGF0ZS10byIsICAgICAgIFRZUF9YVVQsIENNX0lOVnxDTV9BUkcgfSwKKyNlbmRpZiAvKiBVTklDT0RFICovCisgICAgeyAiIiwgMCwgMCB9Cit9OworaW50IG50eXBldGFiID0gc2l6ZW9mKHR5cGV0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKSAtIDE7CisKK2ludCB0eXBfcGFnZSA9IC0xOwkJCS8qIFRZUEUgL1tOT11QQUdFIGRlZmF1bHQgKi8KK2ludCB0eXBfd2lkICA9IC0xOworCisjaWZuZGVmIE5PU1BMCisjZGVmaW5lIFRSQV9BTEwgOTk5CQkJLyogVFJBQ0UgY29tbWFuZCAqLworI2RlZmluZSBUUkFfQVNHIDAKKyNkZWZpbmUgVFJBX0NNRCAxCisKK2ludCB0cmFfYXNnID0gMDsKK2ludCB0cmFfY21kID0gMDsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgdHJhY2V0YWJbXSA9IHsJLyogVFJBQ0Ugb3B0aW9ucyAqLworICAgIHsgImFsbCIsICAgICAgICAgICAgVFJBX0FMTCwgMCB9LAorICAgIHsgImFzc2lnbm1lbnRzIiwgICAgVFJBX0FTRywgMCB9LAorICAgIHsgImNvbW1hbmQtbGV2ZWwiLCAgVFJBX0NNRCwgMCB9Cit9Oworc3RhdGljIGludCBudHJhY2V0YWIgPSBzaXplb2YodHJhY2V0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PU0hPVworVk9JRAorc2hvd3R5cG9wdHMoKSB7CisgICAgcHJpbnRmKCIgVFlQRSAiKTsKKyAgICBpZiAodHlwX3BhZ2UgPiAtMSkgeworCXBydG9wdCgmb3B0bGluZXMsdHlwX3BhZ2UgPyAiL1BBR0UiIDogIi9OT1BBR0UiKTsKKyAgICB9IGVsc2UKKyAgICAgIHBydG9wdCgmb3B0bGluZXMsIihubyBvcHRpb25zIHNldCkiKTsKKyAgICBpZiAodHlwX3dpZCA+IC0xKSB7CisJY2ttYWttc2codG1wYnVmLFRNUEJVRlNJWiwiL1dJRFRIOiIsY2tpdG9hKHR5cF93aWQpLE5VTEwsTlVMTCk7CisJcHJ0b3B0KCZvcHRsaW5lcyx0bXBidWYpOworICAgIH0KKyAgICBwcnRvcHQoJm9wdGxpbmVzLCIiKTsKK30KKyNlbmRpZiAvKiBOT1NIT1cgKi8KKworI2lmZGVmIExPQ1VTCisvKiBpc2F1dG8gPT0gMSBpZiBsb2N1cyBpcyBiZWluZyBzd2l0Y2hlZCBhdXRvbWF0aWNhbGx5ICovCisKK1ZPSUQKK3NldGxvY3VzKHgsIGlzYXV0bykgaW50IHgsIGlzYXV0bzsgeworICAgIGV4dGVybiBpbnQgcXVpdHRpbmc7CisgICAgaWYgKHgpIHggPSAxOworICAgIGlmICh4ICYmIGxvY3VzKSByZXR1cm47CisgICAgaWYgKCF4ICYmICFsb2N1cykgcmV0dXJuOworICAgIC8qIEdldCBoZXJlIGlmIGl0IGFjdHVhbGx5IG5lZWRzIHRvIGJlIGNoYW5nZWQgKi8KKyNpZmRlZiBPUzIKKyAgICBpZiAoaXNhdXRvICYmCQkJLyogQXV0b21hdGljYWxseSBzd2l0Y2hpbmcgKi8KKwkhcXVpdHRpbmcgJiYJCQkvKiBub3QgZXhpdGluZyAqLworCWF1dG9sb2N1cyA9PSAyKSB7CQkvKiBhbmQgQVVUT0xPQ1VTIGlzIHNldCB0byBBU0sgKi8KKwljaGFyIGxvY21zZ1szMDBdOworCWNrbWFrbXNnKGxvY21zZywzMDAsCisJCSAiU3dpdGNoaW5nIExvY3VzIHRvICIsCisJCSB4ID8gIkxPQ0FMIiA6ICJSRU1PVEUiLAorCQkgIiBmb3IgZmlsZSBtYW5hZ2VtZW50IGNvbW1hbmRzXG4iCisgICAgICAgICAgICAgICAgICJzdWNoIGFzIENELCBESVJFQ1RPUlksIERFTEVURSwgUkVOQU1FLiAgVHlwZSBIRUxQIFNFVFxuIgorICAgICAgICAgICAgICAgICAiTE9DVVMgYXQgdGhlIEstOTU+IHByb21wdCBmb3IgZnVydGhlciBpbmZvLiAgVXNlIHRoZVxuIgorI2lmZGVmIEtVSQorICAgICAgICAgICAgICAgICAgIkFjdGlvbnMgbWVudSBvciBTRVQgTE9DVVMgY29tbWFuZCB0byBkaXNhYmxlIGF1dG9tYXRpY1xuIgorICAgICAgICAgICAgICAgICAgIkxvY3VzIHN3aXRjaGluZyBvciB0byBkaXNhYmxlIHRoZXNlIHF1ZXJpZXMuIiwKKyNlbHNlIC8qIEtVSSAqLworICAgICAgICAgICAgICAgICAgIlNFVCBMT0NVUyBjb21tYW5kIHRvIGRpc2FibGUgYXV0b21hdGljIGxvY3VzIHN3aXRjaGluZ1xuIgorICAgICAgICAgICAgICAgICAgIm9yIHRvIGRpc2FibGUgdGhlc2UgcXVlcmllcy4iLAorI2VuZGlmIC8qIEtVSSAqLworICAgICAgICAgICAgICAgICAgTlVMTCk7CisJaWYgKHVxX29rKGxvY21zZywiT0sgdG8gc3dpdGNoIExvY3VzPyIsMyxOVUxMLDEpKSB7CisJICAgIGxvY3VzID0geDsKKyNpZmRlZiBLVUkKKwkgICAgS3VpU2V0UHJvcGVydHkoS1VJX0xPQ1VTLHgsMCk7CisjZW5kaWYgLyogS1VJICovCisJICAgIHJldHVybjsKKwl9CisgICAgfSBlbHNlIHsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgaWYgKGlzYXV0byAmJiBtc2dmbGcgJiYgIXF1aXR0aW5nKQorICAgICAgICAgIHByaW50ZigiU3dpdGNoaW5nIExPQ1VTIGZvciBmaWxlLW1hbmFnZW1lbnQgY29tbWFuZHMgdG8gJXMuXG4iLAorCQkgeCA/ICJMT0NBTCIgOiAiUkVNT1RFIgorCQkgKTsKKwlsb2N1cyA9IHg7CisjaWZkZWYgT1MyCisjaWZkZWYgS1VJCisJS3VpU2V0UHJvcGVydHkoS1VJX0xPQ1VTLHgsMCk7CisjZW5kaWYgLyogS1VJICovCisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworfQorCitWT0lECitzZXRhdXRvbG9jdXMoeCkgaW50IHg7IHsKKyAgICBhdXRvbG9jdXMgPSB4OworI2lmZGVmIEtVSQorICAgIEt1aVNldFByb3BlcnR5KEtVSV9BVVRPX0xPQ1VTLHgsMCk7CisjZW5kaWYgLyogS1VJICovCit9CisjZW5kaWYgLyogTE9DVVMgKi8KKworaW50CitzZXR0eXBvcHRzKCkgewkJCQkvKiBTZXQgVFlQRSBvcHRpb24gZGVmYXVsdHMgKi8KKyAgICBpbnQgeHAgPSAtMTsKKyAgICBpbnQgYywgZ2V0dmFsOworICAgIHdoaWxlICgxKSB7CisJaWYgKCh5ID0gY21zd2kodHlwZXRhYixudHlwZXRhYiwiU3dpdGNoIiwiIix4eHN0cmluZykpIDwgMCkgeworCSAgICBpZiAoeSA9PSAtMykKKwkgICAgICBicmVhazsKKwkgICAgZWxzZQorCSAgICAgIHJldHVybih5KTsKKwl9CisJYyA9IGNtZ2JyaygpOworCWlmICgoZ2V0dmFsID0gKGMgPT0gJzonIHx8IGMgPT0gJz0nKSkgJiYgIShjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKwkgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCXN3aXRjaCAoeSkgeworCSAgY2FzZSBUWVBfTk9QOiB4cCA9IDA7IGJyZWFrOworCSAgY2FzZSBUWVBfUEFHOiB4cCA9IDE7IGJyZWFrOworCSAgY2FzZSBUWVBfV0lEOgorCSAgICBpZiAoZ2V0dmFsKQorCSAgICAgIGlmICgoeCA9IGNtbnVtKCJDb2x1bW4gYXQgd2hpY2ggdG8gdHJ1bmNhdGUiLAorCQkJICAgICBja2l0b2EoY21kX2NvbHMpLDEwLCZ5LHh4c3RyaW5nKSkgPCAwKQorCQlyZXR1cm4oeCk7CisJICAgIHR5cF93aWQgPSB5OworCSAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisJICAgIHByaW50ZigiP1NvcnJ5LCB0aGlzIG9wdGlvbiBjYW4gbm90IGJlIHNldFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorICAgIH0KKyAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCQkvKiBHZXQgY29uZmlybWF0aW9uICovCisgICAgICByZXR1cm4oeCk7CisgICAgaWYgKHhwID4gLTEpIHR5cF9wYWdlID0geHA7CQkvKiBDb25maXJtZWQsIHNhdmUgZGVmYXVsdHMgKi8KKyAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworfQorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMgbG9jYWwgdG8gdGhpcyBtb2R1bGUgKi8KKworI2lmZGVmIFVOSVgKK19QUk9UT1RZUCAoaW50IGRvdWNobW9kLCAoIHZvaWQgKSApOworI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBDS1BVUkdFCitfUFJPVE9UWVAgKGludCBkb3B1cmdlLCAgKCB2b2lkICkgKTsKKyNlbmRpZiAvKiBDS1BVUkdFICovCisjaWZuZGVmIE5PU1BMCitfUFJPVE9UWVAgKGludCBkb3VuZGVmLCAgKCBpbnQgICkgKTsKK19QUk9UT1RZUCAoaW50IGRvYXNrLCAgICAoIGludCAgKSApOworX1BST1RPVFlQIChpbnQgZG9kZWYsICAgICggaW50ICApICk7CitfUFJPVE9UWVAgKGludCBkb2Vsc2UsICAgKCB2b2lkICkgKTsKK19QUk9UT1RZUCAoaW50IGRvZm9yLCAgICAoIHZvaWQgKSApOworX1BST1RPVFlQIChpbnQgZG9pbmNyLCAgICggaW50ICApICk7CisjZW5kaWYgLyogTk9TUEwgICovCisjaWZuZGVmIE5PRElBTAorX1BST1RPVFlQIChpbnQgZG9kaWFsLCAgICggaW50ICApICk7CisjZW5kaWYgLyogTk9ESUFMICovCitfUFJPVE9UWVAgKGludCBkb2RlbCwgICAgKCB2b2lkICkgKTsKK19QUk9UT1RZUCAoaW50IGRvcGF1cywgICAoIGludCAgKSApOworI2lmbmRlZiBOT1BVU0gKKyNpZmRlZiBUQ1BTT0NLRVQKK19QUk9UT1RZUCAoaW50IGRvcGluZywgICAoIHZvaWQgKSApOworX1BST1RPVFlQIChpbnQgZG9mdHAsICAgICggdm9pZCApICk7CisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogTk9QVVNIICovCisjaWZuZGVmIE5PUkVOQU1FCisjaWZuZGVmIE5PRlJJTExTCitfUFJPVE9UWVAgKGludCBkb3JlbmFtLCAgKCB2b2lkICkgKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworI2VuZGlmIC8qIE5PUkVOQU1FICovCisjaWZkZWYgWkNPUFkKK19QUk9UT1RZUCAoaW50IGRvY29weSwgICAoIHZvaWQgKSApOworI2VuZGlmIC8qIFpDT1BZICovCisjaWZkZWYgTlQKK19QUk9UT1RZUCAoaW50IGRvbGluaywgICAoIHZvaWQgKSk7CisjZW5kaWYgLyogTlQgKi8KKyNpZmRlZiBDS19SRVhYCitfUFJPVE9UWVAgKGludCBkb3JleHgsICAgKCB2b2lkICkgKTsKKyNlbmRpZiAvKiBDS19SRVhYICovCisKKyNpZmRlZiBUTkNPREUKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHRlbGNtZFtdID0geworICAgIHsgImFib3J0IiwgVE5fQUJPUlQsIENNX0lOViB9LAkvKiBFbW90aW9uYWxseSB0b25lZCAtIGRvbid0IHNob3cgKi8KKyAgICB7ICJhbyIsICAgIFROX0FPLCAgICAwIH0sCisgICAgeyAiYXl0IiwgICBUTl9BWVQsICAgMCB9LAorICAgIHsgImJyZWFrIiwgQlJFQUssICAgIDAgfSwKKyAgICB7ICJjYW5jZWwiLFROX0FCT1JULCAwIH0sCisgICAgeyAiZG1hcmsiLCBUTl9ETSwgICAgMCB9LAorICAgIHsgImRvIiwgICAgRE8sICAgICAgIDAgfSwKKyAgICB7ICJkb250IiwgIERPTlQsICAgICAwIH0sCisgICAgeyAiZWMiLCAgICBUTl9FQywgICAgMCB9LAorICAgIHsgImVsIiwgICAgVE5fRUwsICAgIDAgfSwKKyAgICB7ICJlb2YiLCAgIFROX0VPRiwgICAwIH0sCisgICAgeyAiZW9yIiwgICBUTl9FT1IsICAgMCB9LAorI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgS1JCNQorI2RlZmluZSBUTl9GV0QgMQorICAgIHsgImZvcndhcmQiLCBUTl9GV0QsIENNX0lOViB9LAorI2VuZGlmIC8qIEtSQjUgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworICAgIHsgImdhIiwgICAgVE5fR0EsICAgIDAgfSwKKyAgICB7ICJpcCIsICAgIFROX0lQLCAgICAwIH0sCisgICAgeyAibm9wIiwgICBUTl9OT1AsICAgMCB9LAorICAgIHsgInNhayIsICAgVE5fU0FLLCAgIENNX0lOViB9LAorICAgIHsgInNiIiwgICAgU0IsICAgICAgIDAgfSwKKyAgICB7ICJzZSIsICAgIFNFLCAgICAgICAwIH0sCisgICAgeyAic3VzcCIsICBUTl9TVVNQLCAgMCB9LAorICAgIHsgIndpbGwiLCAgV0lMTCwgICAgIDAgfSwKKyAgICB7ICJ3b250IiwgIFdPTlQsICAgICAwIH0KK307CitzdGF0aWMgaW50IG50ZWxjbWQgPSAoc2l6ZW9mKHRlbGNtZCkgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpOworCitzdGF0aWMgc3RydWN0IGtleXRhYiB0bm9wdHNbXSA9IHsKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorICAgIHsgImF1dGgiLCAgIFRFTE9QVF9BVVRIRU5USUNBVElPTiwgICAwIH0sCisjZWxzZQorICAgIHsgImF1dGgiLCAgIFRFTE9QVF9BVVRIRU5USUNBVElPTiwgICBDTV9JTlYgfSwKKyNlbmRpZiAvKiBDS19BVVRIRU5USUNBVElPTiAqLworICAgIHsgImJpbmFyeSIsIFRFTE9QVF9CSU5BUlksIDAgfSwKKyNpZmRlZiBUTl9DT01QT1JUCisgICAgeyAiYyIsICAgICAgVEVMT1BUX0NPTVBPUlQsIENNX0lOVnxDTV9BQlJ9LAorICAgIHsgImNvIiwgICAgIFRFTE9QVF9DT01QT1JULCBDTV9JTlZ8Q01fQUJSfSwKKyAgICB7ICJjb20iLCAgICBURUxPUFRfQ09NUE9SVCwgQ01fSU5WfENNX0FCUn0sCisgICAgeyAiY29tLXBvcnQtY29udHJvbCIsIFRFTE9QVF9DT01QT1JULCAwIH0sCisgICAgeyAiY29tcG9ydC1jb250cm9sIiwgVEVMT1BUX0NPTVBPUlQsIENNX0lOVn0sCisjZWxzZSAgLyogVE5fQ09NUE9SVCAqLworICAgIHsgImNvbS1wb3J0LWNvbnRyb2wiLCBURUxPUFRfQ09NUE9SVCwgQ01fSU5WIH0sCisgICAgeyAiY29tcG9ydC1jb250cm9sIiwgVEVMT1BUX0NPTVBPUlQsIENNX0lOVn0sCisjZW5kaWYgLyogVE5fQ09NUE9SVCAqLworICAgIHsgImVjaG8iLCBURUxPUFRfRUNITywgMCB9LAorI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICB7ICJlbmNyeXB0IiwgVEVMT1BUX0VOQ1JZUFRJT04sIDAgfSwKKyNlbHNlCisgICAgeyAiZW5jcnlwdCIsIFRFTE9QVF9FTkNSWVBUSU9OLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjaWZkZWYgQ0tfRk9SV0FSRF9YCisgICAgeyAiZm9yd2FyZC14IiwgVEVMT1BUX0ZPUldBUkRfWCwgMCB9LAorI2Vsc2UKKyAgICB7ICJmb3J3YXJkLXgiLCBURUxPUFRfRk9SV0FSRF9YLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBDS19GT1JXQVJEX1ggKi8KKyNpZmRlZiBJS1NfT1BUSU9OCisgICAgeyAia2VybWl0IiwgVEVMT1BUX0tFUk1JVCwgMCB9LAorI2Vsc2UKKyAgICB7ICJrZXJtaXQiLCBURUxPUFRfS0VSTUlULCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisgICAgeyAibGZsb3ciLCAgVEVMT1BUX0xGTE9XLCBDTV9JTlYgfSwKKyAgICB7ICJsb2dvdXQiLCBURUxPUFRfTE9HT1VULCBDTV9JTlYgfSwKKyNpZmRlZiBDS19OQVdTCisgICAgeyAibmF3cyIsIFRFTE9QVF9OQVdTLCAwIH0sCisjZWxzZQorICAgIHsgIm5hd3MiLCBURUxPUFRfTkFXUywgQ01fSU5WIH0sCisjZW5kaWYgLyogQ0tfTkFXUyAqLworI2lmZGVmIENLX0VOVklST05NRU5UCisgICAgeyAibmV3LWVudmlyb25tZW50IiwgVEVMT1BUX05FV0VOVklST04sICAwIH0sCisjZWxzZQorICAgIHsgIm5ldy1lbnZpcm9ubWVudCIsIFRFTE9QVF9ORVdFTlZJUk9OLCAgQ01fSU5WIH0sCisjZW5kaWYgLyogQ0tfRU5WSVJPTk1FTlQgKi8KKyAgICB7ICJwcmFnbWEtaGVhcnRiZWF0IixURUxPUFRfUFJBR01BX0hFQVJUQkVBVCwgIENNX0lOViB9LAorICAgIHsgInByYWdtYS1sb2dvbiIsICAgIFRFTE9QVF9QUkFHTUFfTE9HT04sICBDTV9JTlYgfSwKKyAgICB7ICJwcmFnbWEtc3NwaSIsICAgICBURUxPUFRfU1NQSV9MT0dPTiwgIENNX0lOViB9LAorICAgIHsgInNhayIsICAgVEVMT1BUX0lCTV9TQUssIENNX0lOViB9LAorI2lmZGVmIENLX1NORExPQworICAgIHsgInNlbmQtbG9jYXRpb24iLCAgIFRFTE9QVF9TTkRMT0MsICAwIH0sCisjZWxzZQorICAgIHsgInNlbmQtbG9jYXRpb24iLCAgIFRFTE9QVF9TTkRMT0MsICBDTV9JTlYgfSwKKyNlbmRpZiAvKiBDS19TTkRMT0MgKi8KKyAgICB7ICJzZ2EiLCBURUxPUFRfU0dBLCAwIH0sCisjaWZkZWYgQ0tfU1NMCisgICAgeyAic3RhcnQtdGxzIiwgICAgICAgVEVMT1BUX1NUQVJUX1RMUywgIDAgfSwKKyNlbHNlCisgICAgeyAic3RhcnQtdGxzIiwgICAgICAgVEVMT1BUX1NUQVJUX1RMUywgIENNX0lOViB9LAorI2VuZGlmIC8qIENLX1NTTCAqLworICAgIHsgInR0eXBlIiwgVEVMT1BUX1RUWVBFLCAwIH0sCisjaWZkZWYgQ0tfRU5WSVJPTk1FTlQKKyAgICB7ICJ4ZGlzcGxheS1sb2NhdGlvbiIsIFRFTE9QVF9YRElTUExPQywgMCB9LAorI2Vsc2UKKyAgICB7ICJ4ZGlzcGxheS1sb2NhdGlvbiIsIFRFTE9QVF9YRElTUExPQywgQ01fSU5WIH0sCisjZW5kaWYgLyogQ0tfRU5WSVJPTk1FTlQgKi8KKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG50bm9wdHMgPSAoc2l6ZW9mKHRub3B0cykgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgdG5zYm9wdHNbXSA9IHsKKyNpZmRlZiBDS19OQVdTCisgICAgeyAibmF3cyIsIFRFTE9QVF9OQVdTLCAwIH0sCisjZW5kaWYgLyogQ0tfTkFXUyAqLworICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbnRuc2JvcHRzID0gKHNpemVvZih0bnNib3B0cykgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKworI2lmZGVmIFRDUFNPQ0tFVAorI2lmbmRlZiBOT1BVU0gKKyNpZmRlZiBTWVNGVFAKK2ludAorZG9mdHAoKSB7CQkJCS8qIChFeHRlcm5hbCkgRlRQIGNvbW1hbmQgKi8KKyAgICBjaGFyICpwLCAqZjsJCQkvKiAoU2VlIGRveGZ0cCgpIGZvciBpbnRlcm5hbCBvbmUpICovCisgICAgaW50IHg7CisKKyAgICBpZiAobmV0d29yaykJCQkvKiBJZiB3ZSBoYXZlIGEgY3VycmVudCBjb25uZWN0aW9uICovCisgICAgICBja3N0cm5jcHkobGluZSx0dG5hbWUsTElOQlVGU0laKTsJLyogZ2V0IHRoZSBob3N0IG5hbWUgKi8KKyAgICBlbHNlICpsaW5lID0gJ1wwJzsJCQkvKiBhcyBkZWZhdWx0IGhvc3QgKi8KKyAgICBmb3IgKHAgPSBsaW5lOyAqcDsgcCsrKQkJLyogUmVtb3ZlICI6c2VydmljZSIgZnJvbSBlbmQuICovCisgICAgICBpZiAoKnAgPT0gJzonKSB7ICpwID0gJ1wwJzsgYnJlYWs7IH0KKyAgICBpZiAoKHggPSBjbXR4dCgiSVAgaG9zdCBuYW1lIG9yIG51bWJlciIsIGxpbmUsICZzLCB4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih4KTsKKyAgICBpZiAobm9wdXNoKSB7CisgICAgICAgIHByaW50ZigiP1NvcnJ5LCBGVFAgY29tbWFuZCBkaXNhYmxlZFxuIik7CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgfQorLyogQ29uc3RydWN0IEZUUCBjb21tYW5kICovCisjaWZkZWYgVk1TCisjaWZkZWYgTVVMVElORVQJCQkJLyogVEdWIE11bHRpTmV0ICovCisgICAgY2ttYWttc2cobGluZSxMSU5CVUZTSVosIm11bHRpbmV0IGZ0cCAiLHMsTlVMTCxOVUxMKTsKKyNlbHNlCisgICAgY2ttYWttc2cobGluZSxMSU5CVUZTSVosImZ0cCAiLHMsTlVMTCxOVUxMKTsKKyNlbmRpZiAvKiBNVUxUSU5FVCAqLworI2Vsc2UJCQkJCS8qIE5vdCBWTVMgKi8KKyNpZmRlZiBPUzJPUlVOSVgKKyNpZm5kZWYgTk9GVFAKKyAgICBmID0gZnRwYXBwOworICAgIGlmICghZikgZiA9ICIiOworICAgIGlmICghZlswXSkgZiA9ICJmdHAiOworICAgIGNrbWFrbXNnKGxpbmUsTElOQlVGU0laLGYsIiAiLHMsTlVMTCk7CisjaWZkZWYgT1MyCisgICAgcCA9IGxpbmUgKyBzdHJsZW4oZnRwYXBwKTsKKyAgICB3aGlsZSAocCAhPSBsaW5lKSB7CisgICAgICAgIGlmICgqcCA9PSAnLycpICpwID0gJ1xcJzsKKyAgICAgICAgcC0tOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbHNlIC8qIE5PRlRQICovCisgICAgY2ttYWttc2cobGluZSxMSU5CVUZTSVosImZ0cCAiLHMsTlVMTCxOVUxMKTsKKyNlbmRpZiAvKiBOT0ZUUCAqLworI2Vsc2UgLyogT1MyT1JVTklYICovCisgICAgY2ttYWttc2cobGluZSxMSU5CVUZTSVosImZ0cCAiLHMsTlVMTCxOVUxMKTsKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyAgICBjb25yZXMoKTsJCQkJLyogTWFrZSBjb25zb2xlIG5vcm1hbCAgKi8KKyNpZmRlZiBERUNfVENQSVAKKyAgICBwcmludGYoIlxuIik7CQkJLyogUHJldmVudCBwcm9tcHQtc3RvbXBpbmcgKi8KKyNlbmRpZiAvKiBERUNfVENQSVAgKi8KKyAgICB4ID0genNoY21kKGxpbmUpOworICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7CisgICAgcmV0dXJuKHN1Y2Nlc3MgPSB4KTsKK30KKyNlbmRpZiAvKiBTWVNGVFAgKi8KKworaW50Citkb3BpbmcoKSB7CQkJCS8qIFBJTkcgY29tbWFuZCAqLworICAgIGNoYXIgKnA7CQkJCS8qIGp1c3QgcnVucyBwaW5nIHByb2dyYW0gKi8KKyAgICBpbnQgeDsKKworICAgIGlmIChuZXR3b3JrKQkJCS8qIElmIHdlIGhhdmUgYSBjdXJyZW50IGNvbm5lY3Rpb24gKi8KKyAgICAgIGNrc3RybmNweShsaW5lLHR0bmFtZSxMSU5CVUZTSVopOwkvKiBnZXQgdGhlIGhvc3QgbmFtZSAqLworICAgIGVsc2UgKmxpbmUgPSAnXDAnOwkJCS8qIGFzIGRlZmF1bHQgaG9zdCB0byBiZSBwaW5nZWQuICovCisgICAgZm9yIChwID0gbGluZTsgKnA7IHArKykJCS8qIFJlbW92ZSAiOnNlcnZpY2UiIGZyb20gZW5kLiAqLworICAgICAgaWYgKCpwID09ICc6JykgeyAqcCA9ICdcMCc7IGJyZWFrOyB9CisgICAgaWYgKCh4ID0gY210eHQoIklQIGhvc3QgbmFtZSBvciBudW1iZXIiLCBsaW5lLCAmcywgeHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgaWYgKG5vcHVzaCkgeworICAgICAgICBwcmludGYoIj9Tb3JyeSwgUElORyBjb21tYW5kIGRpc2FibGVkXG4iKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICB9CisKKyAgICAvKiBDb25zdHJ1Y3QgUElORyBjb21tYW5kICovCisjaWZkZWYgVk1TCisjaWZkZWYgTVVMVElORVQJCQkJLyogVEdWIE11bHRpTmV0ICovCisgICAgY2ttYWttc2cobGluZSxMSU5CVUZTSVosIm11bHRpbmV0IHBpbmcgIixzLCIgL251bT0xIixOVUxMKTsKKyNlbHNlCisgICAgY2ttYWttc2cobGluZSxMSU5CVUZTSVosInBpbmcgIixzLCIgNTYgMSIsTlVMTCk7IC8qIE90aGVyIFZNUyBUQ1AvSVAncyAqLworI2VuZGlmIC8qIE1VTFRJTkVUICovCisjZWxzZQkJCQkJLyogTm90IFZNUyAqLworICAgIGNrbWFrbXNnKGxpbmUsTElOQlVGU0laLCJwaW5nICIscyxOVUxMLE5VTEwpOworI2VuZGlmIC8qIFZNUyAqLworICAgIGNvbnJlcygpOwkJCQkvKiBNYWtlIGNvbnNvbGUgbm9ybWFsICAqLworI2lmZGVmIERFQ19UQ1BJUAorICAgIHByaW50ZigiXG4iKTsJCQkvKiBQcmV2ZW50IHByb21wdC1zdG9tcGluZyAqLworI2VuZGlmIC8qIERFQ19UQ1BJUCAqLworICAgIHggPSB6c2hjbWQobGluZSk7CisgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsKKyAgICByZXR1cm4oc3VjY2VzcyA9IHgpOworfQorI2VuZGlmIC8qIE5PUFVTSCAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCitzdGF0aWMgVk9JRAorZG9lbmQoeCkgaW50IHg7IHsKKyNpZm5kZWYgTk9TUEwKKyAgICAvKiBQb3AgZnJvbSBhbGwgRk9SL1dISUxFL1hJRi9TV0lUQ0gncyAqLworICAgIGRlYnVnKEYxMDEsImRvZW5kIG1hY2x2bCAxIiwiIixtYWNsdmwpOworICAgIHdoaWxlICgobWFjbHZsID4gMCkgJiYKKwkgICAobV9hcmdbbWFjbHZsLTFdWzBdKSAmJgorCSAgIChjbWRzdGtbY21kbHZsXS5zcmMgPT0gQ01EX01EKSAmJgorCSAgICghc3RybmNtcChtX2FyZ1ttYWNsdmwtMV1bMF0sIl94aWYiLDQpIHx8CisJICAgICFzdHJuY21wKG1fYXJnW21hY2x2bC0xXVswXSwiX2ZvciIsNCkgfHwKKwkgICAgIXN0cm5jbXAobV9hcmdbbWFjbHZsLTFdWzBdLCJfd2hpIiw0KSB8fAorCSAgICAhc3RybmNtcChtX2FyZ1ttYWNsdmwtMV1bMF0sIl9zd2kiLDQpKSkgeworCWRlYnVnKEYxMTAsIkVORCBwb3BwaW5nIixtX2FyZ1ttYWNsdmwtMV1bMF0sMCk7CisJZG9ndGEoWFhQVEEpOwkJCS8qIFB1dCBhcmdzIGJhY2sgKi8KKwlwb3BjbHZsKCk7CQkJLyogUG9wIHVwIHR3byBsZXZlbHMgKi8KKwlwb3BjbHZsKCk7CisJZGVidWcoRjEwMSwiZG9lbmQgbWFjbHZsIDIiLCIiLG1hY2x2bCk7CisgICAgfQorICAgIGlmIChtYWNsdmwgPiAtMSkgeworCWlmIChtcnZhbFttYWNsdmxdKQkJLyogRnJlZSBwcmV2aW91cyByZXR2YWwgaWYgYW55ICovCisJICBmcmVlKG1ydmFsW21hY2x2bF0pOworCW1ydmFsW21hY2x2bF0gPSBtYWxsb2MoMTYpOwkvKiBSb29tIGZvciB1cCB0byAxNSBkaWdpdHMgKi8KKwlpZiAobXJ2YWxbbWFjbHZsXSkJCS8qIFJlY29yZCBjdXJyZW50IHJldHZhbCAqLworCSAgY2ttYWttc2cobXJ2YWxbbWFjbHZsXSwxNixja2l0b2EoeCksTlVMTCxOVUxMLE5VTEwpOworICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHBvcGNsdmwoKTsJCQkJLyogTm93IHBvcCBvdXQgb2YgbWFjcm8gb3IgVEFLRSBmaWxlICovCisjaWZuZGVmIE5PU1BMCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisJZGVidWcoRjEwMSwiRU5EIG1hY2x2bCAzIiwiIixtYWNsdmwpOworCWRlYnVnKEYxMTEsIkVORCBtcnZhbFttYWNsdmxdIixtcnZhbFttYWNsdmxdLG1hY2x2bCk7CisJZGVidWcoRjExMSwiRU5EIG1ydmFsW21hY2x2bCsxXSIsbXJ2YWxbbWFjbHZsKzFdLG1hY2x2bCsxKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworfQorCisjaWZkZWYgQ0tST09UCitpbnQKK2RvY2hyb290KCkgeworICAgIGlmICgoeCA9IGNtZGlyKCJOYW1lIG9mIG5ldyByb290IGRpcmVjdG9yeSIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKwlpZiAoeCA9PSAtMykgeworCSAgICBwcmludGYoIj9EaXJlY3RvcnkgbmFtZSByZXF1aXJlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCXJldHVybih4KTsKKyAgICB9CisgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgIHMgPSBsaW5lOworICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgIHMgPSBicnN0cmlwKHMpOworICAgIHggPSB6c2V0cm9vdChzKTsKKyAgICBpZiAoeCA8IDApIHsKKwljaGFyICogbSA9IE5VTEw7CisJc3dpdGNoICh4KSB7CisJICBjYXNlIC0xOgorCSAgY2FzZSAtMjogbSA9ICJOb3QgYSBkaXJlY3RvcnkiOyBicmVhazsKKwkgIGNhc2UgLTM6IG0gPSAiSW50ZXJuYWwgZXJyb3IiOyBicmVhazsKKwkgIGNhc2UgLTQ6IG0gPSAiQWNjZXNzIGRlbmllZCI7IGJyZWFrOworCSAgY2FzZSAtNTogbSA9ICJPZmYgbGltaXRzIjsgYnJlYWs7CisJfQorCWlmIChtKSBwcmludGYoIiVzOiBcIiVzXCJcbiIsIG0sIHMpOworCXJldHVybihtID8gLTkgOiAtMik7CisgICAgfSBlbHNlIHsKKwlub3B1c2ggPSAxOworCXJldHVybihzdWNjZXNzID0gMSk7CisgICAgfQorfQorI2VuZGlmIC8qIENLUk9PVCAqLworCisjaWZuZGVmIE5PWEZFUgorc3RhdGljIGNoYXIgKiBhc25idWYgPSBOVUxMOwkJLyogQXMtbmFtZSBidWZmZXIgcG9pbnRlciAqLworCitjaGFyIHNuZHhuYW1bXSA9IHsgIl9hcnJheV94XyIgfTsJLyogKHdpdGggcmVwbGFjZWFibGUgeCEpICovCisKKy8qCisgIFRoZSBuZXcgU0VORCBjb21tYW5kLCByZXBsYWNpbmcgQlNFTkQsIENTRU5ELCBQU0VORCwgZXRjIGV0Yy4KKyAgQ2FsbCB3aXRoIGN4ID0gdG9wLWxldmVsIGtleXdvcmQgdmFsdWUuICBSZXR1cm5zOgorICAgIDwgMCAgT24gcGFyc2UgZXJyb3IuCisgICAgMCAgICBPbiBvdGhlciB0eXBlIG9mIGZhaWx1cmUgKGUuZy4gcmVxdWVzdGVkIG9wZXJhdGlvbiBub3QgYWxsb3dlZCkuCisgICAgMSAgICBPbiBzdWNjZXNzIHdpdGggc3N0YXRlIHNldCB0byAncycgc28gcHJvdG9jb2wgd2lsbCBiZWdpbi4KKyovCisKKy8qICBEIE8gWCBTIEUgTiBEICAtLSAgUGFyc2UgU0VORCBhbmQgcmVsYXRlZCBjb21tYW5kcyB3aXRoIHN3aXRjaGVzICAqLworCitpbnQKK2RveHNlbmQoY3gpIGludCBjeDsgeworICAgIGludCBjLCBpLCBuLCB3aWxkLCBjb25maXJtZWQgPSAwOwkvKiBXb3JrZXJzICovCisgICAgaW50IHgsIHk7CQkJCS8qIG9mIHRoZSB3b3JsZC4uLiAqLworICAgIGludCBnZXR2YWwgPSAwOwkJCS8qIFdoZXRoZXIgdG8gZ2V0IHN3aXRjaCB2YWx1ZSAqLworICAgIGV4dGVybiBjaGFyICogc25kX21vdmU7CQkvKiBEaXJlY3RvcnkgdG8gbW92ZSBzZW50IGZpbGVzIHRvICovCisgICAgZXh0ZXJuIGNoYXIgKiBzbmRfcmVuYW1lOwkJLyogV2hhdCB0byByZW5hbWUgc2VudCBmaWxlcyB0byAqLworICAgIGV4dGVybiBjaGFyICogZmlsZWZpbGU7CQkvKiBGaWxlIGNvbnRhaW5pbmcgZmlsZW5hbWVzIHRvIHNlbmQgKi8KKyAgICBleHRlcm4gaW50IHhmaWxldHlwZTsJCS8qIFNlbmQgb25seSB0ZXh0IChvciBiaW5hcnkpIGZpbGVzICovCisgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgcGF0aHRhYltdOwkvKiBQQVRITkFNRVMgb3B0aW9uIGtleXdvcmRzICovCisgICAgZXh0ZXJuIGludCBucGF0aHRhYjsJCS8qIEhvdyBtYW55IG9mIHRoZW0gKi8KKyAgICBleHRlcm4gaW50IHJlY3Vyc2l2ZTsJCS8qIFJlY3Vyc2l2ZSBkaXJlY3RvcnkgdHJhdmVyc2FsICovCisgICAgZXh0ZXJuIGludCBycHJpbnRmOwkJCS8qIFJFTU9URSBQUklOVCBmbGFnICovCisgICAgZXh0ZXJuIGludCBmZGlzcGxhOwkJCS8qIFRSQU5TRkVSIERJU1BMQVkgc2V0dGluZyAqLworICAgIGV4dGVybiBpbnQgc2tpcGJ1cDsJCQkvKiBTa2lwIGJhY2t1cCBmaWxlcyB3aGVuIHNlbmRpbmcgKi8KKyAgICBzdHJ1Y3Qgc3RyaW5naW50IHsJCQkvKiBUZW1wb3JhcnkgYXJyYXkgZm9yIHN3aXRjaCB2YWx1ZXMgKi8KKwljaGFyICogc3ZhbDsKKwlpbnQgaXZhbDsKKyAgICB9IHB2W1NORF9NQVgrMV07CisgICAgc3RydWN0IEZEQiBzZiwgc3csIGZsLCBjbTsJCS8qIEZEQnMgZm9yIGVhY2ggcGFyc2UgZnVuY3Rpb24gKi8KKyAgICBpbnQgbWxpc3QgPSAwOwkJCS8qIEZsYWcgZm9yIE1TRU5EIG9yIE1NT1ZFICovCisgICAgY2hhciAqIG07CQkJCS8qIEZvciBtYWtpbmcgaGVscCBtZXNzYWdlcyAqLworICAgIGV4dGVybiBzdHJ1Y3Qga2V5dGFiIHByb3Rvc1tdOwkvKiBGaWxlIHRyYW5zZmVyIHByb3RvY29scyAqLworICAgIGV4dGVybiBpbnQgeGZyeGxhLCBnX3hmcnhsYSwgbnByb3RvczsKKyAgICBleHRlcm4gY2hhciBzbmRiZWZvcmVbXSwgc25kYWZ0ZXJbXSwgKnNuZGV4Y2VwdFtdOyAvKiBTZWxlY3Rpb24gY3JpdGVyaWEgKi8KKyAgICBleHRlcm4gY2hhciBzbmRuYmVmb3JlW10sIHNuZG5hZnRlcltdOworICAgIGV4dGVybiBsb25nIHNuZHNtYWxsZXIsIHNuZGxhcmdlciwgY2FsaWJyYXRlOworI2lmbmRlZiBOT1NQTAorICAgIGludCByYW5nZVsyXTsJCQkvKiBBcnJheSByYW5nZSAqLworICAgIGNoYXIgKiogYXAgPSBOVUxMOwkJCS8qIEFycmF5IHBvaW50ZXIgKi8KKyAgICBpbnQgYXJyYXl4ID0gLTE7CQkJLyogQXJyYXkgaW5kZXggKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZkZWYgTkVXRlRQCisgICAgaWYgKChmdHBnZXQgPT0gMSkgfHwgKChmdHBnZXQgPT0gMikgJiYgZnRwaXNvcGVuKCkpKSB7CisJaWYgKGN4ID09IFhYTUFJKSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCBObyBNQUlMIHdpdGggRlRQXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisJcmV0dXJuKGRvZnRwcHV0KGN4LDApKTsKKyAgICB9CisjZW5kaWYgLyogTkVXRlRQICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IFNORF9NQVg7IGkrKykgewkvKiBJbml0aWFsaXplIHN3aXRjaCB2YWx1ZXMgKi8KKwlwdltpXS5zdmFsID0gTlVMTDsJCS8qIHRvIG51bGwgcG9pbnRlcnMgKi8KKwlwdltpXS5pdmFsID0gLTE7CQkvKiBhbmQgLTEgaW50IHZhbHVlcyAqLworICAgIH0KKyNpZm5kZWYgTk9TUEwKKyAgICByYW5nZVswXSA9IC0xOworICAgIHJhbmdlWzFdID0gLTE7CisgICAgc25keGluID0gLTE7CQkJLyogQXJyYXkgaW5kZXggKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIHNuZGFycmF5ID0gTlVMTDsJCQkvKiBBcnJheSBwb2ludGVyICovCisKKyNpZmRlZiBVTklYT1JPU0sKKyAgICBnX21hdGNoZG90ID0gbWF0Y2hkb3Q7CQkvKiBNYXRjaCBkb3QgZmlsZXMgKi8KKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyAgICBnX3JlY3Vyc2l2ZSA9IHJlY3Vyc2l2ZTsJCS8qIFJlY3Vyc2l2ZSBzZW5kaW5nICovCisgICAgcmVjdXJzaXZlID0gMDsJCQkvKiBTYXZlIGdsb2JhbCB2YWx1ZSwgc2V0IGxvY2FsICovCisgICAgZGVidWcoRjEwMSwieHNlbmQgZW50cnkgZm5jbnYiLCIiLGZuY252KTsKKworICAgIC8qIFByZXNldCBzd2l0Y2ggdmFsdWVzIGJhc2VkIG9uIHRvcC1sZXZlbCBjb21tYW5kIHRoYXQgY2FsbGVkIHVzICovCisKKyAgICBzd2l0Y2ggKGN4KSB7CisgICAgICBjYXNlIFhYTVNFOgkJCS8qIE1TRU5EICovCisJbWxpc3QgPSAxOyBicmVhazsKKyAgICAgIGNhc2UgWFhDU0VOOgkJCS8qIENTRU5EICovCisJcHZbU05EX0NNRF0uaXZhbCA9IDE7IGJyZWFrOworICAgICAgY2FzZSBYWE1NT1ZFOgkJCS8qIE1NT1ZFICovCisJbWxpc3QgPSAxOworICAgICAgY2FzZSBYWE1PVkU6CQkJLyogTU9WRSAqLworCXB2W1NORF9ERUxdLml2YWwgPSAxOyBicmVhazsKKyAgICAgIGNhc2UgWFhSU0VOOgkJCS8qIFJFU0VORCAqLworCXB2W1NORF9CSU5dLml2YWwgPSAxOwkJLyogSW1wbGllcyAvQklOQVJZICovCisJcHZbU05EX1JFU10uaXZhbCA9IDE7IGJyZWFrOworICAgICAgY2FzZSBYWE1BSToJCQkvKiBNQUlMICovCisJcHZbU05EX01BSV0uaXZhbCA9IDE7IGJyZWFrOworICAgIH0KKworICAgIC8qIFNldCB1cCBjaGFpbmVkIHBhcnNlIGZ1bmN0aW9ucy4uLiAqLworCisgICAgY21mZGJpKCZzdywJCQkJLyogRmlyc3QgRkRCIC0gY29tbWFuZCBzd2l0Y2hlcyAqLworCSAgIF9DTUtFWSwJCQkvKiBmY29kZSAqLworCSAgICJGaWxlbmFtZSwgb3Igc3dpdGNoIiwJLyogaGxwbXNnICovCisJICAgIiIsCQkJCS8qIGRlZmF1bHQgKi8KKwkgICAiIiwJCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyNpZmRlZiBOT01TRU5ECisJICAgbnNuZHRhYiwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKyNlbHNlCisJICAgbWxpc3QgPyBubXNuZHRhYiA6IG5zbmR0YWIsCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworI2VuZGlmIC8qIE5PTVNFTkQgKi8KKwkgICA0LAkJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisJICAgeHhzdHJpbmcsCQkJLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworI2lmZGVmIE5PTVNFTkQKKwkgICBzbmR0YWIsCQkJLyogS2V5d29yZCB0YWJsZSAqLworI2Vsc2UKKwkgICBtbGlzdCA/IG1zbmR0YWIgOiBzbmR0YWIsCisjZW5kaWYgLyogTk9NU0VORCAqLworCSAgICZzZgkJCQkvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisJICAgKTsKKyAgICBjbWZkYmkoJnNmLAkJCQkvKiAybmQgRkRCIC0gZmlsZSB0byBzZW5kICovCisJICAgX0NNSUZJLAkJCS8qIGZjb2RlICovCisJICAgIkZpbGUocykgdG8gc2VuZCIsCQkvKiBobHBtc2cgKi8KKwkgICAiIiwJCQkJLyogZGVmYXVsdCAqLworCSAgICIiLAkJCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCSAgIG5vbGlua3MsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKwkgICAwLAkJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworCSAgIHh4c3RyaW5nLAorCSAgIE5VTEwsCisJICAgbWxpc3QgPyAmY20gOiAmZmwKKwkgICApOworICAgIGNtZmRiaSgmZmwsCQkJCS8qIDNyZCBGREIgLSBjb21tYW5kIHRvIHNlbmQgZnJvbSAqLworCSAgIF9DTUZMRCwJCQkvKiBmY29kZSAqLworCSAgICJDb21tYW5kIiwJCQkvKiBobHBtc2cgKi8KKwkgICAiIiwJCQkJLyogZGVmYXVsdCAqLworCSAgICIiLAkJCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCSAgIDAsCQkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisJICAgMCwJCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKwkgICB4eHN0cmluZywKKwkgICBOVUxMLAorCSAgICZjbQorCSAgICk7CisgICAgY21mZGJpKCZjbSwJCQkJLyogNHRoIEZEQiAtIENvbmZpcm1hdGlvbiAqLworCSAgIF9DTUNGTSwJCQkvKiBmY29kZSAqLworCSAgICIiLAkJCQkvKiBobHBtc2cgKi8KKwkgICAiIiwJCQkJLyogZGVmYXVsdCAqLworCSAgICIiLAkJCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCSAgIDAsCQkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisJICAgMCwJCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKwkgICBOVUxMLAorCSAgIE5VTEwsCisJICAgTlVMTAorCSAgICk7CisKKyAgICB3aGlsZSAoMSkgewkJCQkvKiBQYXJzZSAwIG9yIG1vcmUgc3dpdGNoZXMgKi8KKwl4ID0gY21mZGIoJnN3KTsJCQkvKiBQYXJzZSBzb21ldGhpbmcgKi8KKwlkZWJ1ZyhGMTAxLCJ4c2VuZCBjbWZkYiIsIiIseCk7CisJaWYgKHggPCAwKQkJCS8qIEVycm9yICovCisJICBnb3RvIHhzZW5keDsJCQkvKiBvciByZXBhcnNlIG5lZWRlZCAqLworCWlmIChjbXJlc3VsdC5mY29kZSAhPSBfQ01LRVkpCS8qIEJyZWFrIG91dCBpZiBub3QgYSBzd2l0Y2ggKi8KKwkgIGJyZWFrOworLyoKKyAgVGhleSBnYXZlIGEgc3dpdGNoLCBidXQgbGV0J3Mgc2VlIGhvdyB0aGV5IHRlcm1pbmF0ZWQgaXQuCisgIElmIHRoZXkgZW5kZWQgaXQgd2l0aCA6IG9yID0sIHRoZW4gd2UgbXVzdCBwYXJzZSBhIHZhbHVlLgorICBJZiB0aGV5IGVuZGVkIGl0IHdpdGggYW55dGhpbmcgZWxzZSwgdGhlbiB3ZSBtdXN0IE5PVCBwYXJzZSBhIHZhbHVlLgorKi8KKwljID0gY21nYnJrKCk7CQkJLyogR2V0IGJyZWFrIGNoYXJhY3RlciAqLworCWdldHZhbCA9IChjID09ICc6JyB8fCBjID09ICc9Jyk7IC8qIHRvIHNlZSBob3cgdGhleSBlbmRlZCB0aGUgc3dpdGNoICovCisJaWYgKGdldHZhbCAmJiAhKGNtcmVzdWx0LmtmbGFncyAmIENNX0FSRykpIHsKKwkgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggZG9lcyBub3QgdGFrZSBhcmd1bWVudHNcbiIpOworCSAgICB4ID0gLTk7CisJICAgIGdvdG8geHNlbmR4OworCX0KKwlpZiAoIWdldHZhbCAmJiAoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisJICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkgICAgeCA9IC05OworCSAgICBnb3RvIHhzZW5keDsKKwl9CisJbiA9IGNtcmVzdWx0Lm5yZXN1bHQ7CQkvKiBOdW1lcmljIHJlc3VsdCA9IHN3aXRjaCB2YWx1ZSAqLworCWRlYnVnKEYxMDEsInhzZW5kIHN3aXRjaCIsIiIsbik7CisKKwlzd2l0Y2ggKG4pIHsJCQkvKiBQcm9jZXNzIHRoZSBzd2l0Y2ggKi8KKwkgIGNhc2UgU05EX0NNRDoJCQkvKiBUaGVzZSB0YWtlIG5vIGFyZ3MgKi8KKwkgICAgaWYgKG5vcHVzaCkgeworCQlwcmludGYoIj9Tb3JyeSwgc3lzdGVtIGNvbW1hbmQgYWNjZXNzIGlzIGRpc2FibGVkXG4iKTsKKwkJeCA9IC05OworCQlnb3RvIHhzZW5keDsKKwkgICAgfQorI2lmZGVmIFBJUEVTRU5ECisJICAgIGVsc2UgaWYgKHNuZGZpbHRlcikgeworCQlwcmludGYoCisiP1NvcnJ5LCBubyBTRU5EIC9DT01NQU5EIG9yIENTRU5EIHdoZW4gU0VORCBGSUxURVIgc2VsZWN0ZWRcbiIpOworCQl4ID0gLTk7CisJCWdvdG8geHNlbmR4OworCSAgICB9CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKwkgICAgc3cuaGxwbXNnID0gIkNvbW1hbmQsIG9yIHN3aXRjaCI7IC8qIENoYW5nZSBoZWxwIG1lc3NhZ2UgKi8KKwkgICAgcHZbbl0uaXZhbCA9IDE7CQkvKiBKdXN0IHNldCB0aGUgZmxhZyAqLworCSAgICBwdltTTkRfQVJSXS5pdmFsID0gMDsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU05EX1JFQzoJCQkvKiAvUkVDVVJTSVZFICovCisJICAgIHJlY3Vyc2l2ZSA9IDI7CQkvKiBTZXQgdGhlIHJlYWwgdmFyaWFibGUgKi8KKwkgICAgcHZbU05EX1BUSF0uaXZhbCA9IFBBVEhfUkVMOyAvKiBHaXZlIHRoZW0gcmVsYXRpdmUgcGF0aG5hbWVzICovCisJICAgIHB2W25dLml2YWwgPSAxOwkJLyogSnVzdCBzZXQgdGhlIGZsYWcgKi8KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU05EX1JFUzoJCQkvKiAvUkVDT1ZFUiAocmVzZW5kKSAqLworCSAgICBwdltTTkRfQVJSXS5pdmFsID0gMDsKKwkgICAgcHZbU05EX0JJTl0uaXZhbCA9IDE7CS8qIEltcGxpZXMgL0JJTkFSWSAqLworCSAgY2FzZSBTTkRfTk9COgkJCS8qIC9OT0JBQ0tVUCAqLworCSAgY2FzZSBTTkRfREVMOgkJCS8qIC9ERUxFVEUgKi8KKwkgIGNhc2UgU05EX1NISDoJCQkvKiAvUVVJRVQgKi8KKwkgICAgcHZbbl0uaXZhbCA9IDE7CQkvKiBKdXN0IHNldCB0aGUgZmxhZyAqLworCSAgICBicmVhazsKKworI2lmZGVmIFVOSVhPUk9TSworLyogTGlrZSByZWN1cnNpdmUsIHRoZXNlIGFyZSBzZXQgaW1tZWRpYXRlbHkgYmVjYXVzZSB0aGV5IGFmZmVjdCBjbWlmaSgpICovCisJICBjYXNlIFNORF9ET1Q6CQkJLyogL0RPVEZJTEVTICovCisJICAgIG1hdGNoZG90ID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlIFNORF9OT0Q6CQkJLyogL05PRE9URklMRVMgKi8KKwkgICAgbWF0Y2hkb3QgPSAwOworCSAgICBicmVhazsKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKworCSAgLyogRmlsZSB0cmFuc2ZlciBtb2RlcyAtIGVhY2ggdW5kb2VzIHRoZSBvdGhlcnMgKi8KKworCSAgY2FzZSBTTkRfQklOOgkJCS8qIEJpbmFyeSAqLworCSAgY2FzZSBTTkRfVFhUOgkJCS8qIFRleHQgKi8KKwkgIGNhc2UgU05EX0lNRzoJCQkvKiBJbWFnZSAqLworCSAgY2FzZSBTTkRfTEJMOgkJCS8qIExhYmVsZWQgKi8KKwkgICAgcHZbU05EX0JJTl0uaXZhbCA9IDA7CisJICAgIHB2W1NORF9UWFRdLml2YWwgPSAwOworCSAgICBwdltTTkRfSU1HXS5pdmFsID0gMDsKKwkgICAgcHZbU05EX0xCTF0uaXZhbCA9IDA7CisJICAgIHB2W25dLml2YWwgPSAxOworCSAgICBicmVhazsKKworI2lmZGVmIENLU1lNTElOSworCSAgY2FzZSBTTkRfTE5LOgorCSAgY2FzZSBTTkRfTkxLOgorCSAgICBub2xpbmtzID0gKG4gPT0gU05EX05MSykgPyAyIDogMDsKKwkgICAgY21mZGJpKCZzZiwJCQkvKiBSZWRvIGNtaWZpKCkgKi8KKwkJICAgX0NNSUZJLAkJLyogZmNvZGUgKi8KKwkJICAgIkZpbGUocykgdG8gc2VuZCIsCS8qIGhscG1zZyAqLworCQkgICAiIiwJCQkvKiBkZWZhdWx0ICovCisJCSAgICIiLAkJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJCSAgIG5vbGlua3MsCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworCQkgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisJCSAgIHh4c3RyaW5nLAorCQkgICBOVUxMLAorCQkgICBtbGlzdCA/ICZjbSA6ICZmbAorCQkgICApOworCSAgICBicmVhazsKKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKworCSAgY2FzZSBTTkRfRVhDOgkJCS8qIEV4Y2x1ZGVzICovCisJICAgIGlmICghZ2V0dmFsKSBicmVhazsKKwkgICAgaWYgKCh4ID0gY21mbGQoIlBhdHRlcm4iLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7CisJCWlmICh4ID09IC0zKSB7CisJCSAgICBwcmludGYoIj9QYXR0ZXJuIHJlcXVpcmVkXG4iKTsKKwkJICAgIHggPSAtOTsKKwkJfQorCQlnb3RvIHhzZW5keDsKKwkgICAgfQorCSAgICBpZiAocHZbbl0uc3ZhbCkgZnJlZShwdltuXS5zdmFsKTsKKwkgICAgeSA9IHN0cmxlbihzKTsKKwkgICAgaWYgKHkgPiAyNTYpIHsKKwkJcHJpbnRmKCI/UGF0dGVybiB0b28gbG9uZyAtIDI1NiBtYXhcbiIpOworCQl4ID0gLTk7CisJCWdvdG8geHNlbmR4OworCSAgICB9CisJICAgIHB2W25dLnN2YWwgPSBtYWxsb2MoeSsxKTsKKwkgICAgaWYgKHB2W25dLnN2YWwpIHsKKwkJc3RyY3B5KHB2W25dLnN2YWwscyk7CS8qIHNhZmUgKi8KKwkJcHZbbl0uaXZhbCA9IDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU05EX01PVjoJCQkvKiBNT1ZFIGFmdGVyICovCisJICBjYXNlIFNORF9SRU46CQkJLyogUkVOQU1FIGFmdGVyICovCisJICAgIGlmICghZ2V0dmFsKSBicmVhazsKKwkgICAgaWYgKCh4ID0gY21mbGQobiA9PSBTTkRfTU9WID8KKwkgICAiZGV2aWNlIGFuZC9vciBkaXJlY3RvcnkgZm9yIHNvdXJjZSBmaWxlIGFmdGVyIHNlbmRpbmciIDoKKwkgICAibmV3IG5hbWUgZm9yIHNvdXJjZSBmaWxlIGFmdGVyIHNlbmRpbmciLAorCQkJICAgIiIsCisJCQkgICAmcywKKwkJCSAgIG4gPT0gU05EX01PViA/IHh4c3RyaW5nIDogTlVMTAorCQkJICAgKSkgPCAwKSB7CisJCWlmICh4ID09IC0zKSB7CisJCSAgICBwcmludGYoIiVzXG4iLCBuID09IFNORF9NT1YgPworCQkJICAgIj9EZXN0aW5hdGlvbiByZXF1aXJlZCIgOgorCQkJICAgIj9OZXcgbmFtZSByZXF1aXJlZCIKKwkJCSAgICk7CisJCSAgICB4ID0gLTk7CisJCX0KKwkJZ290byB4c2VuZHg7CisJICAgIH0KKwkgICAgaWYgKHB2W25dLnN2YWwpIGZyZWUocHZbbl0uc3ZhbCk7CisJICAgIHMgPSBicnN0cmlwKHMpOworCSAgICB5ID0gc3RybGVuKHMpOworCSAgICBpZiAoeSA+IDApIHsKKwkJcHZbbl0uc3ZhbCA9IG1hbGxvYyh5KzEpOworCQlpZiAocHZbbl0uc3ZhbCkgeworCQkgICAgc3RyY3B5KHB2W25dLnN2YWwscyk7IC8qIHNhZmUgKi8KKwkJICAgIHB2W25dLml2YWwgPSAxOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU05EX1NNQToJCQkvKiBTbWFsbGVyIC8gbGFyZ2VyIHRoYW4gKi8KKwkgIGNhc2UgU05EX0xBUjoKKwkgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworCSAgICBpZiAoKHggPSBjbW51bSgiU2l6ZSBpbiBieXRlcyIsIjAiLDEwLCZ5LHh4c3RyaW5nKSkgPCAwKQorCSAgICAgIGdvdG8geHNlbmR4OworCSAgICBwdltuXS5pdmFsID0geTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU05EX0FGVDoJCQkvKiBTZW5kIC9BRlRFUjpkYXRlLXRpbWUgKi8KKwkgIGNhc2UgU05EX0JFRjoJCQkvKiBTZW5kIC9CRUZPUkU6ZGF0ZS10aW1lICovCisJICBjYXNlIFNORF9OQUY6CQkJLyogU2VuZCAvTk9ULUFGVEVSOmRhdGUtdGltZSAqLworCSAgY2FzZSBTTkRfTkJFOgkJCS8qIFNlbmQgL05PVC1CRUZPUkU6ZGF0ZS10aW1lICovCisJICAgIGlmICghZ2V0dmFsKSBicmVhazsKKwkgICAgaWYgKCh4ID0gY21kYXRlKCJGaWxlIGRhdGUtdGltZSIsIiIsJnMsMCx4eHN0cmluZykpIDwgMCkgeworCQlpZiAoeCA9PSAtMykgeworCQkgICAgcHJpbnRmKCI/RGF0ZS10aW1lIHJlcXVpcmVkXG4iKTsKKwkJICAgIHggPSAtOTsKKwkJfQorCQlnb3RvIHhzZW5keDsKKwkgICAgfQorCSAgICBpZiAocHZbbl0uc3ZhbCkgZnJlZShwdltuXS5zdmFsKTsKKwkgICAgcHZbbl0uc3ZhbCA9IG1hbGxvYygoaW50KXN0cmxlbihzKSsxKTsKKwkgICAgaWYgKHB2W25dLnN2YWwpIHsKKwkJc3RyY3B5KHB2W25dLnN2YWwscyk7CS8qIHNhZmUgKi8KKwkJcHZbbl0uaXZhbCA9IDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU05EX01BSToJCQkvKiBTZW5kIGFzIG1haWwgKD0gTUFJTCkgKi8KKyNpZmRlZiBJS1NECisJICAgIGlmIChpbnNlcnZlciAmJiAhRU5BQkxFRChlbl9tYWkpKSB7CisJCXByaW50ZigiP1NvcnJ5LCBzZW5kaW5nIGZpbGVzIGFzIG1haWwgaXMgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4oLTkpOworCSAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCSAgICBwdltuXS5pdmFsID0gMTsKKwkgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworCSAgICBpZiAoKHggPSBjbWZsZCgiZS1tYWlsIGFkZHJlc3MiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7CisJCWlmICh4ID09IC0zKSB7CisJCSAgICBwcmludGYoIj9hZGRyZXNzIHJlcXVpcmVkXG4iKTsKKwkJICAgIHggPSAtOTsKKwkJfQorCQlnb3RvIHhzZW5keDsKKwkgICAgfQorCSAgICBzID0gYnJzdHJpcChzKTsKKwkgICAgaWYgKHB2W25dLnN2YWwpIGZyZWUocHZbbl0uc3ZhbCk7CisJICAgIHB2W25dLnN2YWwgPSBtYWxsb2MoKGludClzdHJsZW4ocykrMSk7CisJICAgIGlmIChwdltuXS5zdmFsKQorCSAgICAgIHN0cmNweShwdltuXS5zdmFsLHMpOwkvKiBzYWZlICovCisJICAgIGJyZWFrOworCisJICBjYXNlIFNORF9QUkk6CQkJLyogU2VuZCB0byBiZSBwcmludGVkIChSRU1PVEUgUFJJTlQpICovCisjaWZkZWYgSUtTRAorCSAgICBpZiAoaW5zZXJ2ZXIgJiYgIUVOQUJMRUQoZW5fbWFpKSkgeworCQlwcmludGYoIj9Tb3JyeSwgc2VuZGluZyBmaWxlcyBmb3IgcHJpbnRpbmcgaXMgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4oLTkpOworCSAgICB9CisjZW5kaWYgLyogSUtTRCAqLworCSAgICBwdltuXS5pdmFsID0gMTsKKwkgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworCSAgICBpZiAoKHggPSBjbWZsZCgiUHJpbnQgb3B0aW9ucyIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisJICAgICAgaWYgKHggIT0gLTMpIGdvdG8geHNlbmR4OworCSAgICBzID0gYnJzdHJpcChzKTsKKwkgICAgaWYgKHB2W25dLnN2YWwpIGZyZWUocHZbbl0uc3ZhbCk7CisJICAgIHB2W25dLnN2YWwgPSBtYWxsb2MoKGludClzdHJsZW4ocykrMSk7CisJICAgIGlmIChwdltuXS5zdmFsKQorCSAgICAgIHN0cmNweShwdltuXS5zdmFsLHMpOwkvKiBzYWZlICovCisJICAgIGJyZWFrOworCisJICBjYXNlIFNORF9BU046CQkJLyogQXMtbmFtZSAqLworCSAgICBkZWJ1ZyhGMTAxLCJ4c2VuZCAvYXMtbmFtZSBnZXR2YWwiLCIiLGdldHZhbCk7CisJICAgIGlmICghZ2V0dmFsKSBicmVhazsKKwkgICAgaWYgKCh4ID0gY21mbGQoIk5hbWUgdG8gc2VuZCB1bmRlciIsIiIsJnMsTlVMTCkpIDwgMCkgeworCQlpZiAoeCA9PSAtMykgeworCQkgICAgcHJpbnRmKCI/bmFtZSByZXF1aXJlZFxuIik7CisJCSAgICB4ID0gLTk7CisJCX0KKwkJZ290byB4c2VuZHg7CisJICAgIH0KKwkgICAgcyA9IGJyc3RyaXAocyk7CisJICAgIGlmICgoeSA9IHN0cmxlbihzKSkgPiAwKSB7CisJCWlmIChwdltuXS5zdmFsKSBmcmVlKHB2W25dLnN2YWwpOworCQlwdltuXS5zdmFsID0gbWFsbG9jKHkrMSk7CisJCWlmIChwdltuXS5zdmFsKSB7CisJCSAgICBzdHJjcHkocHZbbl0uc3ZhbCxzKTsgLyogc2FmZSAqLworCQkgICAgcHZbbl0uaXZhbCA9IDE7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKworCSAgY2FzZSBTTkRfU1RBOgkJCS8qIFN0YXJ0aW5nIHBvc2l0aW9uICg9IFBTRU5EKSAqLworCSAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisJICAgIGlmICgoeCA9IGNtbnVtKCIwLWJhc2VkIHBvc2l0aW9uIiwiMCIsMTAsJnkseHhzdHJpbmcpKSA8IDApCisJICAgICAgZ290byB4c2VuZHg7CisJICAgIHB2W25dLml2YWwgPSB5OworCSAgICBicmVhazsKKworCSAgY2FzZSBTTkRfUFJPOgkJCS8qIFByb3RvY29sIHRvIHVzZSAqLworCSAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisJICAgIGlmICgoeCA9IGNta2V5KHByb3RvcyxucHJvdG9zLCJGaWxlLXRyYW5zZmVyIHByb3RvY29sIiwiIiwKKwkJCSAgIHh4c3RyaW5nKSkgPCAwKSB7CisJCWlmICh4ID09IC0zKSB7CisJCSAgICBwcmludGYoIj9uYW1lIG9mIHByb3RvY29sIHJlcXVpcmVkXG4iKTsKKwkJICAgIHggPSAtOTsKKwkJfQorCQlnb3RvIHhzZW5keDsKKwkgICAgfQorCSAgICBwdltuXS5pdmFsID0geDsKKwkgICAgYnJlYWs7CisKKyNpZmRlZiBQSVBFU0VORAorCSAgY2FzZSBTTkRfRkxUOgkJCS8qIEZpbHRlciAqLworCSAgICBkZWJ1ZyhGMTAxLCJ4c2VuZCAvZmlsdGVyIGdldHZhbCIsIiIsZ2V0dmFsKTsKKwkgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworCSAgICBpZiAoKHggPSBjbWZsZCgiRmlsdGVyIHByb2dyYW0gdG8gc2VuZCB0aHJvdWdoIiwiIiwmcyxOVUxMKSkgPCAwKSB7CisJCWlmICh4ID09IC0zKQorCQkgIHMgPSAiIjsKKwkJZWxzZQorCQkgIGdvdG8geHNlbmR4OworCSAgICB9CisJICAgIGlmICgqcykgcyA9IGJyc3RyaXAocyk7CisJICAgIHkgPSBzdHJsZW4ocyk7CisJICAgIGZvciAoeCA9IDA7IHggPCB5OyB4KyspIHsJLyogTWFrZSBzdXJlIHRoZXkgaW5jbHVkZWQgIlx2KC4uLikiICovCisJCWlmIChzW3hdICE9ICdcXCcpIGNvbnRpbnVlOworCQlpZiAoc1t4KzFdID09ICd2JykgYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKHggPT0geSkgeworCQlwcmludGYoCisJCSI/RmlsdGVyIG11c3QgY29udGFpbiBhIHJlcGxhY2VtZW50IHZhcmlhYmxlIGZvciBmaWxlbmFtZS5cbiIKKwkJICAgICAgICk7CisJCXggPSAtOTsKKwkJZ290byB4c2VuZHg7CisJICAgIH0KKwkgICAgcHZbbl0uaXZhbCA9IDE7CisJICAgIGlmIChwdltuXS5zdmFsKSB7CisJCWZyZWUocHZbbl0uc3ZhbCk7CisJCXB2W25dLnN2YWwgPSBOVUxMOworCSAgICB9CisJICAgIGlmICgoeSA9IHN0cmxlbihzKSkgPiAwKSB7CisJCWlmICgocHZbbl0uc3ZhbCA9IG1hbGxvYyh5KzEpKSkKKwkJICBzdHJjcHkocHZbbl0uc3ZhbCxzKTsJLyogc2FmZSAqLworCSAgICB9CisJICAgIGJyZWFrOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKwkgIGNhc2UgU05EX1BUSDoJCQkvKiBQYXRobmFtZXMgKi8KKwkgICAgaWYgKCFnZXR2YWwpIHsKKwkJcHZbbl0uaXZhbCA9IFBBVEhfUkVMOworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoKHggPSBjbWtleShwYXRodGFiLG5wYXRodGFiLCIiLCJhYnNvbHV0ZSIseHhzdHJpbmcpKSA8IDApCisJICAgICAgZ290byB4c2VuZHg7CisJICAgIHB2W25dLml2YWwgPSB4OworCSAgICBicmVhazsKKworCSAgY2FzZSBTTkRfTkFNOgkJCS8qIEZpbGVuYW1lcyAqLworCSAgICBpZiAoIWdldHZhbCkgYnJlYWs7CisJICAgIGlmICgoeCA9IGNta2V5KGZudGFiLG5mbnRhYiwiIiwiY29udmVydGVkIix4eHN0cmluZykpIDwgMCkKKwkgICAgICBnb3RvIHhzZW5keDsKKwkgICAgZGVidWcoRjEwMSwieHNlbmQgL2ZpbGVuYW1lcyIsIiIseCk7CisJICAgIHB2W25dLml2YWwgPSB4OworCSAgICBicmVhazsKKworI2lmZGVmIENBTElCUkFURQorICAgICAgICAgIGNhc2UgU05EX0NBTDoJCQkvKiAvQ0FMSUJSQVRFICovCisJICAgIGlmIChnZXR2YWwpIHsKKwkJaWYgKCh4ID0gY21udW0oIm51bWJlciBvZiBLYnl0ZXMgdG8gc2VuZCIsCisJCQkgICAiMTAyNCIsMTAsJnkseHhzdHJpbmcpKSA8IDApCisJCSAgZ290byB4c2VuZHg7CisJICAgIH0gZWxzZQorCSAgICAgIHkgPSAxMDI0OworCSAgICBwdltuXS5pdmFsID0geTsKKwkgICAgcHZbU05EX0FSUl0uaXZhbCA9IDA7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIENBTElCUkFURSAqLworCisJICBjYXNlIFNORF9GSUw6CQkJLyogTmFtZSBvZiBmaWxlIGNvbnRhaW5pbmcgZmlsbmFtZXMgKi8KKwkgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworCSAgICBpZiAoKHggPSBjbWlmaSgiTmFtZSBvZiBmaWxlIGNvbnRhaW5pbmcgbGlzdCBvZiBmaWxlbmFtZXMiLAorCQkJICAgICAgICIiLCZzLCZ5LHh4c3RyaW5nKSkgPCAwKSB7CisJCWlmICh4ID09IC0zKSB7CisJCSAgICBwcmludGYoIj9GaWxlbmFtZSByZXF1aXJlZFxuIik7CisJCSAgICB4ID0gLTk7CisJCX0KKwkJZ290byB4c2VuZHg7CisJICAgIH0gZWxzZSBpZiAoeSkgeworCQlwcmludGYoIj9XaWxkY2FyZHMgbm90IGFsbG93ZWRcbiIpOworCQl4ID0gLTk7CisJCWdvdG8geHNlbmR4OworCSAgICB9CisJICAgIGlmIChwdltuXS5zdmFsKQorCSAgICAgIGZyZWUocHZbbl0uc3ZhbCk7CisJICAgIGlmIChzKSBpZiAoKnMpIHsKKwkJaWYgKChwdltuXS5zdmFsID0gbWFsbG9jKChpbnQpc3RybGVuKHMpKzEpKSkgeworCQkgICAgc3RyY3B5KHB2W25dLnN2YWwscyk7CisJCSAgICBwdltuXS5pdmFsID0gMTsKKwkJICAgIHB2W1NORF9BUlJdLml2YWwgPSAwOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKyNpZm5kZWYgTk9TUEwKKwkgIGNhc2UgU05EX0FSUjoJCQkvKiBTRU5EIC9BUlJBWTogKi8KKwkgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworCSAgICBhcCA9IE5VTEw7CisJICAgIGlmICgoeCA9IGNtZmxkKCJBcnJheSBuYW1lIChhIHNpbmdsZSBsZXR0ZXIgd2lsbCBkbykiLAorCQkJICAgIiIsCisJCQkgICAmcywKKwkJCSAgIE5VTEwKKwkJCSAgICkpIDwgMCkgeworCQlpZiAoeCA9PSAtMykKKwkJICBicmVhazsKKwkJZWxzZQorCQkgIHJldHVybih4KTsKKwkgICAgfQorCSAgICBpZiAoKHggPSBhcnJheWJvdW5kcyhzLCYocmFuZ2VbMF0pLCYocmFuZ2VbMV0pKSkgPCAwKSB7CisJCXByaW50ZigiP0JhZCBhcnJheTogJXNcbiIscyk7CisJCXJldHVybigtOSk7CisJICAgIH0KKwkgICAgaWYgKCEoYXAgPSBhX3B0clt4XSkpIHsKKwkJcHJpbnRmKCI/Tm8gc3VjaCBhcnJheTogJXNcbiIscyk7CisJCXJldHVybigtOSk7CisJICAgIH0KKwkgICAgcHZbbl0uaXZhbCA9IDE7CisJICAgIHB2W1NORF9DTURdLml2YWwgPSAwOwkvKiBVbmRvIGFueSBjb25mbGljdGluZyBvbmVzLi4uICovCisJICAgIHB2W1NORF9SRVNdLml2YWwgPSAwOworCSAgICBwdltTTkRfQ0FMXS5pdmFsID0gMDsKKwkgICAgcHZbU05EX0ZJTF0uaXZhbCA9IDA7CisJICAgIGFycmF5eCA9IHg7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIE5PU1BMICovCisKKwkgIGNhc2UgU05EX1hQQToJCQkvKiAvVFJBTlNQQVJFTlQgKi8KKwkgICAgcHZbbl0uaXZhbCA9IDE7CisJICAgIGJyZWFrOworCisJICBjYXNlIFNORF9UWVA6CQkJLyogT25seSBmaWxlcyBvZiBnaXZlbiB0eXBlICovCisJICAgIGlmICghZ2V0dmFsKSBicmVhazsKKwkgICAgaWYgKCh4ID0gY21rZXkodHh0YmluLDMsIiIsImFsbCIseHhzdHJpbmcpKSA8IDApCisJICAgICAgZ290byB4c2VuZHg7CisJICAgIHB2W25dLml2YWwgPSAoeCA9PSAyKSA/IC0xIDogeDsKKwkgICAgYnJlYWs7CisKKwkgIGRlZmF1bHQ6CisJICAgIHByaW50ZigiP1VuZXhwZWN0ZWQgc3dpdGNoIHZhbHVlIC0gJWRcbiIsY21yZXN1bHQubnJlc3VsdCk7CisJICAgIHggPSAtOTsKKwkgICAgZ290byB4c2VuZHg7CisJfQorICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJ4c2VuZCBjbXJlc3VsdCBmY29kZSIsIiIsY21yZXN1bHQuZmNvZGUpOworCisjaWZkZWYgQ09NTUVOVAorICAgIC8qIExpc3Qgc3dpdGNoIHBhcnNpbmcgcmVzdWx0cyBpbiBkZWJ1ZyBsb2cgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IFNORF9NQVg7IGkrKykgeworCWNrbWFrbXNnKGxpbmUsTElOQlVGU0laLCJ4c2VuZCBzd2l0Y2ggIixja2l0b2EoaSksTlVMTCxOVUxMKTsKKwlkZWJ1ZyhGMTExLGxpbmUsIHB2W2ldLnN2YWwsIHB2W2ldLml2YWwpOworICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKy8qIE5vdyB3ZSBoYXZlIGFsbCBzd2l0Y2hlcywgcGx1cyBtYXliZSBhIGZpbGVuYW1lIG9yIGNvbW1hbmQsIG9yIG5vdGhpbmcgKi8KKworI2lmZGVmIFBJUEVTRU5ECisgICAgaWYgKHByb3RvY29sICE9IFBST1RPX0sgJiYgcHZbU05EX0NNRF0uaXZhbCA+IDApIHsKKwlwcmludGYoIj9Tb3JyeSwgJXMgd29ya3Mgb25seSB3aXRoIEtlcm1pdCBwcm90b2NvbFxuIiwKKwkgICAgICAgKGN4ID09IFhYQ1NFTikgPyAiQ1NFTkQiIDogIlNFTkQgL0NPTU1BTkQiKTsKKwl4ID0gLTk7CisJZ290byB4c2VuZHg7CisgICAgfQorICAgIGlmIChwdltTTkRfUkVTXS5pdmFsID4gMCB8fAkvKiAvUkVDT1ZFUiAqLworCXB2W1NORF9TVEFdLml2YWwgPiAwKSB7CS8qIG9yIC9TVEFSVElORyAqLworCWlmIChzbmRmaWx0ZXIgfHwgcHZbU05EX0ZMVF0uaXZhbCA+IDApIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIG5vIC9SRUNPVkVSIG9yIC9TVEFSVCBpZiBTRU5EIEZJTFRFUiBzZWxlY3RlZFxuIik7CisJICAgIHggPSAtOTsKKwkgICAgZ290byB4c2VuZHg7CisJfQorICAgIH0KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisgICAgY21hcmcgPSAiIjsKKyAgICBjbWFyZzIgPSAiIjsKKyAgICBsaW5lWzBdID0gTlVMOworICAgIHMgPSBsaW5lOworICAgIHdpbGQgPSAwOworCisgICAgc3dpdGNoIChjbXJlc3VsdC5mY29kZSkgewkJLyogSG93IGRpZCB3ZSBnZXQgb3V0IG9mIHN3aXRjaCBsb29wICovCisgICAgICBjYXNlIF9DTUlGSToJCQkvKiBJbnB1dCBmaWxlbmFtZSAqLworCWNrc3RybmNweShsaW5lLGNtcmVzdWx0LnNyZXN1bHQsTElOQlVGU0laKTsgLyogTmFtZSAqLworCWlmIChwdltTTkRfQVJSXS5pdmFsID4gMCkKKwkgIGNtYXJnMiA9IGxpbmU7CisJZWxzZQorCSAgd2lsZCA9IGNtcmVzdWx0Lm5yZXN1bHQ7CS8qIFdpbGQgZmxhZyAqLworCWlmICghcmVjdXJzaXZlICYmICF3aWxkKQorCSAgbm9saW5rcyA9IDA7CisJYnJlYWs7CisgICAgICBjYXNlIF9DTUZMRDoJCQkvKiBGaWVsZCAqLworCS8qIE9ubHkgYWxsb3dlZCB3aXRoIC9DT01NQU5EIGFuZCAvQVJSQVkgKi8KKwlpZiAocHZbU05EX0NNRF0uaXZhbCA8IDEgJiYgcHZbU05EX0FSUl0uaXZhbCA8IDEpIHsKKyNpZmRlZiBDS1JPT1QKKwkgICAgaWYgKGNrcm9vdGVycikKKwkgICAgICBwcmludGYoIj9PZmYgbGltaXRzOiAlc1xuIixjbXJlc3VsdC5zcmVzdWx0KTsKKwkgICAgZWxzZQorI2VuZGlmIC8qIENLUk9PVCAqLworCSAgICAgIHByaW50ZigiPyVzIC0gXCIlc1wiXG4iLAorCQkgICBpc3dpbGQoY21yZXN1bHQuc3Jlc3VsdCkgPworCQkgICAiTm8gZmlsZXMgbWF0Y2giIDogIkZpbGUgbm90IGZvdW5kIiwKKwkJICAgY21yZXN1bHQuc3Jlc3VsdAorCQkgICApOworCSAgICB4ID0gLTk7CisJICAgIGdvdG8geHNlbmR4OworCX0KKwlja3N0cm5jcHkobGluZSxjbXJlc3VsdC5zcmVzdWx0LExJTkJVRlNJWik7CisJaWYgKHB2W1NORF9BUlJdLml2YWwgPiAwKQorCSAgY21hcmcyID0gbGluZTsKKwlicmVhazsKKyAgICAgIGNhc2UgX0NNQ0ZNOgkJCS8qIENvbmZpcm1hdGlvbiAqLworCS8qIHMgPSAiIjsgKi8KKwljb25maXJtZWQgPSAxOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlwcmludGYoIj9VbmV4cGVjdGVkIGZ1bmN0aW9uIGNvZGU6ICVkXG4iLGNtcmVzdWx0LmZjb2RlKTsKKwl4ID0gLTk7CisJZ290byB4c2VuZHg7CisgICAgfQorICAgIGRlYnVnKEYxMTAsInhzZW5kIHN0cmluZyIscywwKTsKKyAgICBkZWJ1ZyhGMTAxLCJ4c2VuZCBjb25maXJtZWQiLCIiLGNvbmZpcm1lZCk7CisKKyAgICAvKiBTYXZlIGFuZCBjaGFuZ2UgcHJvdG9jb2wgYW5kIHRyYW5zZmVyIG1vZGUgKi8KKyAgICAvKiBHbG9iYWwgdmFsdWVzIGFyZSByZXN0b3JlZCBpbiBtYWluIHBhcnNlIGxvb3AgKi8KKworICAgIGdfcHJvdG8gPSBwcm90b2NvbDsJCQkvKiBTYXZlIGN1cnJlbnQgZ2xvYmFsIHByb3RvY29sICovCisgICAgZ191cnBzaXogPSB1cnBzaXo7CisgICAgZ19zcHNpemYgPSBzcHNpemY7CisgICAgZ19zcHNpeiA9IHNwc2l6OworICAgIGdfc3BzaXpyID0gc3BzaXpyOworICAgIGdfc3BtYXggPSBzcG1heDsKKyAgICBnX3dzbG90ciA9IHdzbG90cjsKKyAgICBnX3ByZWZpeGluZyA9IHByZWZpeGluZzsKKyAgICBnX2ZuY2FjdCA9IGZuY2FjdDsKKyAgICBnX2ZuY252ID0gZm5jbnY7CisgICAgZ19mbnNwYXRoID0gZm5zcGF0aDsKKyAgICBnX2ZucnBhdGggPSBmbnJwYXRoOworICAgIGdfeGZyeGxhID0geGZyeGxhOworCisgICAgaWYgKHB2W1NORF9QUk9dLml2YWwgPiAtMSkgewkvKiBDaGFuZ2UgYWNjb3JkaW5nIHRvIHN3aXRjaCAqLworCXByb3RvY29sID0gcHZbU05EX1BST10uaXZhbDsKKyAgICAgICAgaWYgKHB0YWJbcHJvdG9jb2xdLnJwa3RsZW4gPiAtMSkgLyogY29waWVkIGZyb20gaW5pdHByb3RvKCkgKi8KKyAgICAgICAgICAgIHVycHNpeiA9IHB0YWJbcHJvdG9jb2xdLnJwa3RsZW47CisgICAgICAgIGlmIChwdGFiW3Byb3RvY29sXS5zcGt0ZmxnID4gLTEpCisgICAgICAgICAgICBzcHNpemYgPSBwdGFiW3Byb3RvY29sXS5zcGt0ZmxnOworICAgICAgICBpZiAocHRhYltwcm90b2NvbF0uc3BrdGxlbiA+IC0xKSB7CisgICAgICAgICAgICBzcHNpeiA9IHB0YWJbcHJvdG9jb2xdLnNwa3RsZW47CisgICAgICAgICAgICBpZiAoc3BzaXpmKQorCSAgICAgIHNwc2l6ciA9IHNwbWF4ID0gc3BzaXo7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB0YWJbcHJvdG9jb2xdLndpbnNpemUgPiAtMSkKKyAgICAgICAgICAgIHdzbG90ciA9IHB0YWJbcHJvdG9jb2xdLndpbnNpemU7CisgICAgICAgIGlmIChwdGFiW3Byb3RvY29sXS5wcmVmaXggPiAtMSkKKyAgICAgICAgICAgIHByZWZpeGluZyA9IHB0YWJbcHJvdG9jb2xdLnByZWZpeDsKKyAgICAgICAgaWYgKHB0YWJbcHJvdG9jb2xdLmZuY2EgPiAtMSkKKyAgICAgICAgICAgIGZuY2FjdCAgPSBwdGFiW3Byb3RvY29sXS5mbmNhOworICAgICAgICBpZiAocHRhYltwcm90b2NvbF0uZm5jbiA+IC0xKQorICAgICAgICAgICAgZm5jbnYgICA9IHB0YWJbcHJvdG9jb2xdLmZuY247CisgICAgICAgIGlmIChwdGFiW3Byb3RvY29sXS5mbnNwID4gLTEpCisgICAgICAgICAgICBmbnNwYXRoID0gcHRhYltwcm90b2NvbF0uZm5zcDsKKyAgICAgICAgaWYgKHB0YWJbcHJvdG9jb2xdLmZucnAgPiAtMSkKKyAgICAgICAgICAgIGZucnBhdGggPSBwdGFiW3Byb3RvY29sXS5mbnJwOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJ4c2VuZCBwcm90b2NvbCIsIiIscHJvdG9jb2wpOworCisgICAgaWYgKHB2W1NORF9OT0JdLml2YWwgPiAtMSkgewkvKiAvTk9CQUNLVVAgKHNraXAgYmFja3VwIGZpbGUpICovCisJZ19za2lwYnVwID0gc2tpcGJ1cDsKKwlza2lwYnVwID0gMTsKKyAgICB9CisgICAgaWYgKHB2W1NORF9SRUNdLml2YWwgPiAwKQkJLyogL1JFQ1VSU0lWRSAqLworICAgICAgcmVjdXJzaXZlID0gMjsKKworICAgIGlmIChwdltTTkRfVFlQXS5pdmFsID4gLTEpIHsJLyogL1RZUEUgKi8KKwl4ZmlsZXR5cGUgPSBwdltTTkRfVFlQXS5pdmFsOworCWlmICh4ZmlsZXR5cGUgPT0gMikKKwkgIHhmaWxldHlwZSA9IC0xOworICAgIH0KKyAgICBnX2JpbmFyeSA9IGJpbmFyeTsJCQkvKiBTYXZlIGdsb2JhbCB0cmFuc2ZlciBtb2RlICovCisjaWZkZWYgUEFUVEVSTlMKKyAgICBnX3BhdHRlcm5zID0gcGF0dGVybnM7CQkvKiBTYXZlIEZJTEUgUEFUVEVSTlMgc2V0dGluZyAqLworI2VuZGlmIC8qIFBBVFRFUk5TICovCisgICAgaWYgKHB2W1NORF9CSU5dLml2YWwgPiAwKSB7CQkvKiBDaGFuZ2UgYWNjb3JkaW5nIHRvIHN3aXRjaCAqLworCS8qIElmIHRoZXkgc2FpZCAvQklOQVJZIHRoZXkgbWVhbiAvQklOQVJZICovCisJcGF0dGVybnMgPSAwOwkJCS8qIFNvIG5vIHBhdHRlcm4tYmFzZWQgc3dpdGNoaW5nICovCisJZ194ZmVybW9kZSA9IHhmZXJtb2RlOwkJLyogb3IgYXV0b21hdGljIHRyYW5zZmVyIG1vZGUgKi8KKwl4ZmVybW9kZSA9IFhNT0RFX007CisJYmluYXJ5ID0gWFlGVF9COworCWRlYnVnKEYxMDEsImRveHNlbmQgL0JJTkFSWSB4ZmVybW9kZSIsIiIseGZlcm1vZGUpOworICAgIH0gZWxzZSBpZiAocHZbU05EX1RYVF0uaXZhbCA+IDApIHsJLyogRGl0dG8gZm9yIC9URVhUICovCisJcGF0dGVybnMgPSAwOworCWdfeGZlcm1vZGUgPSB4ZmVybW9kZTsKKwl4ZmVybW9kZSA9IFhNT0RFX007CisJYmluYXJ5ID0gWFlGVF9UOworCWRlYnVnKEYxMDEsImRveHNlbmQgL1RFWFQgeGZlcm1vZGUiLCIiLHhmZXJtb2RlKTsKKyAgICB9IGVsc2UgaWYgKHB2W1NORF9JTUddLml2YWwgPiAwKSB7CisjaWZkZWYgVk1TCisJYmluYXJ5ID0gWFlGVF9JOworI2Vsc2UKKwliaW5hcnkgPSBYWUZUX0I7CisjZW5kaWYgLyogVk1TICovCisgICAgfQorI2lmZGVmIENLX0xBQkVMRUQKKyAgICBlbHNlIGlmIChwdltTTkRfTEJMXS5pdmFsID4gMCkgeworCWJpbmFyeSA9IFhZRlRfTDsKKyAgICB9CisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworICAgIGRlYnVnKEYxMDEsInhzZW5kIGJpbmFyeSIsIiIsYmluYXJ5KTsKKworICAgIGlmIChwdltTTkRfWFBBXS5pdmFsID4gMCkJCS8qIC9UUkFOU1BBUkVOVCAqLworICAgICAgeGZyeGxhID0gMDsJCQkvKiBEb24ndCB0cmFuc2xhdGUgY2hhcmFjdGVyIHNldHMgKi8KKworICAgIC8qIENoZWNrIGZvciBsZWdhbCBjb21iaW5hdGlvbnMgb2Ygc3dpdGNoZXMsIGZpbGVuYW1lcywgZXRjICovCisKKyNpZmRlZiBQSVBFU0VORAorICAgIGlmIChwdltTTkRfQ01EXS5pdmFsID4gMCkgewkvKiBDT01NQU5EIC0gc3RyaXAgYW55IGJyYWNlcyAqLworCWRlYnVnKEYxMTAsIlNFTkQgL0NPTU1BTkQgYmVmb3JlIHN0cmlwcGluZyIscywwKTsKKwlzID0gYnJzdHJpcChzKTsKKwlkZWJ1ZyhGMTEwLCJTRU5EIC9DT01NQU5EIGFmdGVyIHN0cmlwcGluZyIscywwKTsKKwlpZiAoISpzKSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCBhIGNvbW1hbmQgdG8gc2VuZCBmcm9tIGlzIHJlcXVpcmVkXG4iKTsKKwkgICAgeCA9IC05OworCSAgICBnb3RvIHhzZW5keDsKKwl9CisJY21hcmcgPSBzOworICAgIH0KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisvKiBTZXQgdXAgL01PVkUgYW5kIC9SRU5BTUUgKi8KKworICAgIGlmIChwdltTTkRfREVMXS5pdmFsID4gMCAmJgorCShwdltTTkRfTU9WXS5pdmFsID4gMCB8fCBwdltTTkRfUkVOXS5pdmFsID4gMCkpIHsKKwlwcmludGYoIj9Tb3JyeSwgL0RFTEVURSBjb25mbGljdHMgd2l0aCAvTU9WRSBvciAvUkVOQU1FXG4iKTsKKwl4ID0gLTk7CisJZ290byB4c2VuZHg7CisgICAgfQorI2lmZGVmIENLX1RNUERJUgorICAgIGlmIChwdltTTkRfTU9WXS5pdmFsID4gMCkgeworCWludCBsZW47CisJY2hhciAqIHAgPSBwdltTTkRfTU9WXS5zdmFsOworI2lmZGVmIENLX0xPR0lOCisJaWYgKGlzZ3Vlc3QpIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIC9NT1ZFLVRPIG5vdCBhdmFpbGFibGUgdG8gZ3Vlc3RzXG4iKTsKKwkgICAgeCA9IC05OworCSAgICBnb3RvIHhzZW5keDsKKwl9CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKwlsZW4gPSBzdHJsZW4ocCk7CisJaWYgKCFpc2RpcihwKSkgewkJLyogQ2hlY2sgZGlyZWN0b3J5ICovCisjaWZkZWYgQ0tfTUtESVIKKwkgICAgY2hhciAqIHMgPSBOVUxMOworCSAgICBzID0gKGNoYXIgKiltYWxsb2MobGVuICsgNCk7CisJICAgIGlmIChzKSB7CisJCXN0cmNweShzLHApOwkJLyogc2FmZSAqLworI2lmZGVmIGRhdGFnZW5lcmFsCisJCWlmIChzW2xlbi0xXSAhPSAnOicpIHsgc1tsZW4rK10gPSAnOic7IHNbbGVuXSA9IE5VTDsgfQorI2Vsc2UKKwkJaWYgKHNbbGVuLTFdICE9ICcvJykgeyBzW2xlbisrXSA9ICcvJzsgc1tsZW5dID0gTlVMOyB9CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKwkJc1tsZW4rK10gPSAnWCc7CisJCXNbbGVuXSA9IE5VTDsKKwkJeCA9IHpta2RpcihzKTsKKwkJZnJlZShzKTsKKwkJaWYgKHggPCAwKSB7CisJCSAgICBwcmludGYoIj9DYW4ndCBjcmVhdGUgXCIlc1wiXG4iLHApOworCQkgICAgeCA9IC05OworCQkgICAgZ290byB4c2VuZHg7CisJCX0KKwkgICAgfQorI2Vsc2UKKwkgICAgcHJpbnRmKCI/RGlyZWN0b3J5IFwiJXNcIiBub3QgZm91bmRcbiIscCk7CisJICAgIHggPSAtOTsKKwkgICAgZ290byB4c2VuZHg7CisjZW5kaWYgLyogQ0tfTUtESVIgKi8KKwl9CisgICAgICAgIHpmbnFmcChwLExJTkJVRlNJWix0bXBidWYpOworCW1ha2VzdHIoJnNuZF9tb3ZlLHRtcGJ1Zik7CisgICAgfQorI2VuZGlmIC8qIENLX1RNUERJUiAqLworCisgICAgaWYgKHB2W1NORF9SRU5dLml2YWwgPiAwKSB7CQkvKiAvUkVOQU1FICovCisJY2hhciAqIHAgPSBwdltTTkRfUkVOXS5zdmFsOworI2lmZGVmIENLX0xPR0lOCisJaWYgKGlzZ3Vlc3QpIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIC9SRU5BTUUtVE8gbm90IGF2YWlsYWJsZSB0byBndWVzdHNcbiIpOworCSAgICB4ID0gLTk7CisJICAgIGdvdG8geHNlbmR4OworCX0KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCWlmICghcCkgcCA9ICIiOworCWlmICghKnApIHsKKwkgICAgcHJpbnRmKCI/TmV3IG5hbWUgcmVxdWlyZWQgZm9yIC9SRU5BTUVcbiIpOworCSAgICB4ID0gLTk7CisJICAgIGdvdG8geHNlbmR4OworCX0KKwlwID0gYnJzdHJpcChwKTsKKyNpZm5kZWYgTk9TUEwKKyAgICAvKiBJZiBuYW1lIGdpdmVuIGlzIHdpbGQsIHJlbmFtZSBzdHJpbmcgbXVzdCBjb250YWluIHZhcmlhYmxlcyAqLworCWlmICh3aWxkKSB7CisJICAgIGNoYXIgKiBzID0gdG1wYnVmOworCSAgICB4ID0gVE1QQlVGU0laOworCSAgICB6enN0cmluZyhwLCZzLCZ4KTsKKwkgICAgaWYgKCFzdHJjbXAodG1wYnVmLHApKSB7CisJCXByaW50ZigKKyAgICAiPy9SRU5BTUUgZm9yIGZpbGUgZ3JvdXAgbXVzdCBjb250YWluIHZhcmlhYmxlcyBzdWNoIGFzIFxcdihmaWxlbmFtZSlcbiIKKwkJICAgICAgICk7CisJCXggPSAtOTsKKwkJZ290byB4c2VuZHg7CisJICAgIH0KKwl9CisjZW5kaWYgLyogTk9TUEwgKi8KKwltYWtlc3RyKCZzbmRfcmVuYW1lLHApOworICAgIH0KKworLyogSGFuZGxlIC9SRUNPVkVSIGFuZCAvU1RBUlQgKi8KKworI2lmZGVmIENLX1JFU0VORAorICAgIGlmIChwdltTTkRfUkVTXS5pdmFsID4gMCAmJiBiaW5hcnkgIT0gWFlGVF9CICYmICFmaWxlcGVlaworI2lmZGVmIFBBVFRFUk5TCisJJiYgIXBhdHRlcm5zCisjZWxzZQorI2lmZGVmIFZNUworLyogVk1TIHNldHMgdGV4dC9iaW5hcnkgYXV0b21hdGljYWxseSBsYXRlciB3aGVuIGl0IG9wZW5zIHRoZSBmaWxlICovCisJJiYgMAorI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIFBBVFRFUk5TICovCisJKSB7CisJcHJpbnRmKCI/U29ycnksIC9CSU5BUlkgcmVxdWlyZWRcbiIpOworCXggPSAtOTsKKwlnb3RvIHhzZW5keDsKKyAgICB9CisgICAgaWYgKHB2W1NORF9TVEFdLml2YWwgPiAwKSB7CQkvKiAvU1RBUlQgKi8KKwlpZiAod2lsZCkgeworCSAgICBwcmludGYoIj9Tb3JyeSwgd2lsZGNhcmRzIG5vdCBwZXJtaXR0ZWQgd2l0aCAvU1RBUlRcbiIpOworCSAgICB4ID0gLTk7CisJICAgIGdvdG8geHNlbmR4OworCX0KKwlpZiAoc2l6ZW9mKGludCkgPCA0KSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCB0aGlzIGNvbW1hbmQgbmVlZHMgMzItYml0IGludGVnZXJzXG4iKTsKKwkgICAgeCA9IC05OworCSAgICBnb3RvIHhzZW5keDsKKwl9CisjaWZkZWYgQ0tfWFlaCisJaWYgKHByb3RvY29sICE9IFBST1RPX0spIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIFNFTkQgL1NUQVJUIHdvcmtzIG9ubHkgd2l0aCBLZXJtaXQgcHJvdG9jb2xcbiIpOworCSAgICB4ID0gLTk7CisJICAgIGdvdG8geHNlbmR4OworCX0KKyNlbmRpZiAvKiBDS19YWVogKi8KKyAgICB9CisjaWZkZWYgQ0tfWFlaCisgICAgaWYgKHB2W1NORF9SRVNdLml2YWwgPiAwKSB7CisJaWYgKHByb3RvY29sICE9IFBST1RPX0sgJiYgcHJvdG9jb2wgIT0gUFJPVE9fWikgeworCSAgICBwcmludGYoCisgICAgIlNvcnJ5LCAvUkVDT1ZFUiBpcyBwb3NzaWJsZSBvbmx5IHdpdGggS2VybWl0IG9yIFpNT0RFTSBwcm90b2NvbFxuIgorCQkgICApOworCSAgICB4ID0gLTk7CisJICAgIGdvdG8geHNlbmR4OworCX0KKyAgICB9CisjZW5kaWYgLyogQ0tfWFlaICovCisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisKKyAgICBpZiAocHJvdG9jb2wgPT0gUFJPVE9fSykgeworCWlmICgocHZbU05EX01BSV0uaXZhbCA+IDAgfHwJLyogTUFJTCAqLworCSAgICAgcHZbU05EX1BSSV0uaXZhbCA+IDAgfHwJLyogUFJJTlQgKi8KKwkgICAgIHB2W1NORF9SRVNdLml2YWwgPiAwCS8qIFJFU0VORCAqLworCSAgICAgKSAmJgorCSAgICAoIWF0ZGlzbyB8fCAhYXRjYXByKSkgewkvKiBEaXNwb3NpdGlvbiBhdHRyaWJ1dGUgb2ZmPyAqLworCSAgICBwcmludGYoIj9Tb3JyeSwgQVRUUklCVVRFIERJU1BPU0lUSU9OIG11c3QgYmUgT05cbiIpOworCSAgICB4ID0gLTk7CisJICAgIGdvdG8geHNlbmR4OworCX0KKyAgICB9CisKKyNpZmRlZiBDS19YWVoKKyAgICBpZiAod2lsZCAmJiAocHJvdG9jb2wgPT0gUFJPVE9fWCB8fCBwcm90b2NvbCA9PSBQUk9UT19YQykpIHsKKwlwcmludGYoCisiU29ycnksIHlvdSBjYW4gb25seSBzZW5kIG9uZSBmaWxlIGF0IGEgdGltZSB3aXRoIFhNT0RFTSBwcm90b2NvbFxuIgorCSAgICAgICApOworCXggPSAtOTsKKwlnb3RvIHhzZW5keDsKKyAgICB9CisjZW5kaWYgLyogQ0tfWFlaICovCisKKyAgICBpZiAoIWNvbmZpcm1lZCkgewkJCS8qIENSIG5vdCB0eXBlZCB5ZXQsIGdldCBtb3JlIGZpZWxkcyAqLworCWNoYXIgKm07CisJaWYgKG1saXN0KSB7CQkJLyogTVNFTkQgb3IgTU1PVkUgKi8KKwkgICAgbmZpbHMgPSAwOwkJCS8qIFdlIGFscmVhZHkgaGF2ZSB0aGUgZmlyc3Qgb25lICovCisjaWZuZGVmIE5PTVNFTkQKKwkgICAgbXNmaWxlc1tuZmlscysrXSA9IGxpbmU7CS8qIFN0b3JlIHBvaW50ZXIgKi8KKwkgICAgbHAgPSBsaW5lICsgKGludClzdHJsZW4obGluZSkgKyAxOyAvKiBQb2ludCBwYXN0IGl0ICovCisJICAgIGRlYnVnKEYxMTEsInhzZW5kIG1zZW5kIixtc2ZpbGVzW25maWxzLTFdLG5maWxzLTEpOworCSAgICB3aGlsZSAoMSkgewkJCS8qIEdldCBtb3JlIGZpbGVuYW1lcyAqLworCQljaGFyICpwOworCQlpZiAoKHggPSBjbWlmaSgiTmFtZXMgb2YgZmlsZXMgdG8gc2VuZCwgc2VwYXJhdGVkIGJ5IHNwYWNlcyIsCisJCQkgICAgICAgIiIsICZzLCZ5LHh4c3RyaW5nKSkgPCAwKSB7CisJCSAgICBpZiAoeCAhPSAtMykKKwkJICAgICAgZ290byB4c2VuZHg7CisJCSAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisJCSAgICAgIGdvdG8geHNlbmR4OworCQkgICAgYnJlYWs7CisJCX0KKwkJbXNmaWxlc1tuZmlscysrXSA9IGxwOwkvKiBHb3Qgb25lLCBjb3VudCBpdCwgcG9pbnQgdG8gaXQsICovCisJCXAgPSBscDsJCQkvKiByZW1lbWJlciBwb2ludGVyLCAqLworCQl3aGlsZSAoKCpscCsrID0gKnMrKykpCS8qIGFuZCBjb3B5IGl0IGludG8gYnVmZmVyICovCisJCSAgaWYgKGxwID4gKGxpbmUgKyBMSU5CVUZTSVopKSB7IC8qIEF2b2lkIG1lbW9yeSBsZWFrICovCisJCSAgICAgIHByaW50ZigiP01TRU5EIGxpc3QgdG9vIGxvbmdcbiIpOworCQkgICAgICBsaW5lWzBdID0gTlVMOworCQkgICAgICB4ID0gLTk7CisJCSAgICAgIGdvdG8geHNlbmR4OworCQkgIH0KKwkJZGVidWcoRjExMSwieHNlbmQgbXNlbmQiLG1zZmlsZXNbbmZpbHMtMV0sbmZpbHMtMSk7CisJCWlmIChuZmlscyA9PSAxKSBmc3BlY1swXSA9IE5VTDsgLyogVGFrZSBjYXJlIG9mIFx2KGZpbGVzcGVjKSAqLworI2lmZGVmIFpGTlFGUAorCQl6Zm5xZnAocCxUTVBCVUZTSVosdG1wYnVmKTsKKwkJcCA9IHRtcGJ1ZjsKKyNlbmRpZiAvKiBaRk5RRlAgKi8KKwkJaWYgKCgoaW50KXN0cmxlbihmc3BlYykgKyAoaW50KXN0cmxlbihwKSArIDEpIDwgZnNwZWNsZW4pIHsKKwkJICAgIHN0cmNhdChmc3BlYyxwKTsJLyogc2FmZSAqLworCQkgICAgc3RyY2F0KGZzcGVjLCIgIik7CS8qIHNhZmUgKi8KKwkJfSBlbHNlCisjaWZkZWYgQ09NTUVOVAorCQkgIHByaW50ZigiV0FSTklORyAtIFxcdihmaWxlc3BlYykgYnVmZmVyIG92ZXJmbG93XG4iKTsKKyNlbHNlCisJCSAgZGVidWcoRjEwMSwiZG94c2VuZCBmaWxlc3BlYyBidWZmZXIgb3ZlcmZsb3ciLCIiLDApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgICAgfQorI2VuZGlmIC8qIE5PTVNFTkQgKi8KKwl9IGVsc2UgewkJCS8qIFJlZ3VsYXIgU0VORCAqLworCSAgICBjaGFyICpwOyBpbnQgeTsKKwkgICAgbmZpbHMgPSAtMTsKKwkgICAgaWYgKHB2W1NORF9NQUldLml2YWwgPiAwKQorCSAgICAgIG0gPSAocHZbU05EX01BSV0uc3ZhbCkgPworCQkiZS1tYWlsIGFkZHJlc3MgKG9wdGlvbmFsKSIgOgorCQkgICJlLW1haWwgYWRkcmVzcyAocmVxdWlyZWQpIjsKKwkgICAgZWxzZSBpZiAocHZbU05EX1BSSV0uaXZhbCA+IDApCisJICAgICAgbSA9ICJwcmludGVyIG9wdGlvbnMgKG9wdGlvbmFsKSI7CisJICAgIGVsc2UgaWYgKHdpbGQpCisJICAgICAgbSA9CisiXG5PcHRpb25hbCBhcy1uYW1lIHRlbXBsYXRlIGNvbnRhaW5pbmcgcmVwbGFjZW1lbnQgdmFyaWFibGVzIFwKK2xpa2UgXFx2KGZpbGVuYW1lKSI7CisJICAgIGVsc2UKKwkgICAgICBtID0gIk9wdGlvbmFsIG5hbWUgdG8gc2VuZCBpdCB3aXRoIjsKKwkgICAgaWYgKCh4ID0gY210eHQobSwiIiwmcCxOVUxMKSkgPCAwKQorCSAgICAgIGdvdG8geHNlbmR4OworCSAgICBpZiAoIXApIHAgPSAiIjsKKwkgICAgaWYgKCpwKSB7CQkJLyogSWYgc29tZSB0ZXh0IHdhcyBnaXZlbi4uLiAqLworCQlwID0gYnJzdHJpcChwKTsJCS8qIFJlcGxhY2UgL0FTLU5BTUU6IHZhbHVlIGlmIGFueSAqLworCQlpZiAoKHkgPSBzdHJsZW4ocCkpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHZbU05EX01BSV0uaXZhbCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnB2W1NORF9NQUldLnN2YWwsIHApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJaWYgKHB2W1NORF9BU05dLnN2YWwpIGZyZWUocHZbU05EX0FTTl0uc3ZhbCk7CisJCQlwdltTTkRfQVNOXS5zdmFsID0gbWFsbG9jKHkrMSk7CisJCQlpZiAocHZbU05EX0FTTl0uc3ZhbCkgeworCQkJICAgIHN0cmNweShwdltTTkRfQVNOXS5zdmFsLHApOwkvKiBzYWZlICovCisJCQkgICAgcHZbU05EX0FTTl0uaXZhbCA9IDE7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgLyogU2V0IGNtYXJnMiBmcm9tIGFzLW5hbWUsIGhvd2V2ZXIgd2UgZ290IGl0LiAqLworCisgICAgaWYgKHB2W1NORF9BU05dLml2YWwgPiAwICYmIHB2W1NORF9BU05dLnN2YWwgJiYgISpjbWFyZzIpIHsKKwlpbnQgeDsKKwl4ID0gc3RybGVuKGxpbmUpOworCWNrc3RybmNweShsaW5lK3grMixwdltTTkRfQVNOXS5zdmFsLExJTkJVRlNJWi14LTEpOworCWNtYXJnMiA9IGxpbmUreCsyOworCWRlYnVnKEYxMTAsImRveHNlbmQgY21hcmcyIixjbWFyZzIsMCk7CisgICAgfQorCisjaWZuZGVmIE5PRlJJTExTCisgICAgaWYgKChwdltTTkRfTUFJXS5pdmFsID4gMCkgJiYgKHB2W1NORF9QUkldLml2YWwgPiAwKSkgeworCXByaW50ZigiU29ycnksIC9NQUlMIGFuZCAvUFJJTlQgYXJlIGNvbmZsaWN0aW5nIG9wdGlvbnNcbiIpOworCXggPSAtOTsKKwlnb3RvIHhzZW5keDsKKyAgICB9CisgICAgbiA9IDA7CQkJCS8qIC9NQUlMIG9yIC9QUklOVD8gKi8KKyAgICBpZiAocHZbU05EX01BSV0uaXZhbCA+IDApCisgICAgICBuID0gU05EX01BSTsKKyAgICBlbHNlIGlmIChwdltTTkRfUFJJXS5pdmFsID4gMCkKKyAgICAgIG4gPSBTTkRfUFJJOworICAgIGlmIChuKSB7CQkJCS8qIFllcy4uLiAqLworI2lmZGVmIERFQlVHCisJY2hhciAqIHA7CisJaWYgKG4gPT0gU05EX01BSSkKKwkgIHAgPSAiL01BSUwiOworCWVsc2UKKwkgIHAgPSAiL1BSSU5UIjsKKwlkZWJ1ZyhGMTExLCJ4c2VuZCIscCxuKTsKKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIENLX1hZWgorCWlmIChwcm90b2NvbCAhPSBQUk9UT19LKSB7CisJICAgIHByaW50ZigiU29ycnksICVzIGF2YWlsYWJsZSBvbmx5IHdpdGggS2VybWl0IHByb3RvY29sXG4iLAorCQkgICAobiA9PSBTTkRfTUFJKSA/ICIvTUFJTCIgOiAiL1BSSU5UIgorCQkgICApOworCSAgICB4ID0gLTk7CisJICAgIGdvdG8geHNlbmR4OworCX0KKyNlbmRpZiAvKiBDS19YWVogKi8KKwlkZWJ1ZyhGMTAxLCJ4c2VuZCBwcmludC9tYWlsIHdpbGQiLCIiLHdpbGQpOworCSpvcHRidWYgPSBOVUw7CQkJLyogV2lwZSBvdXQgYW55IG9sZCBvcHRpb25zICovCisJcyA9IHB2W25dLnN2YWw7CQkJLyogbWFpbCBhZGRyZXNzIG9yIHByaW50IHN3aXRjaCB2YWwgKi8KKwlpZiAoIXMpIHMgPSAiIjsKKwlkZWJ1ZyhGMTEwLCJkb3hzZW5kIG1haWwgYWRkcmVzcyBvciBwcmludGVyIG9wdGlvbnMiLHMsMCk7CisJaWYgKG4gPT0gU05EX01BSSAmJiAhKnMpIHsKKwkgICAgcHJpbnRmKCI/RS1tYWlsIGFkZHJlc3MgcmVxdWlyZWRcbiIpOworCSAgICB4ID0gLTk7CisJICAgIGdvdG8geHNlbmR4OworCX0gZWxzZSBpZiAoKGludClzdHJsZW4ocykgPiA5NCkgeyAvKiBFbnN1cmUgbGVnYWwgc2l6ZSAqLworCSAgICBwcmludGYoIj8lcyB0b28gbG9uZ1xuIiwKKwkJICAgKG4gPT0gU05EX01BSSkgPworCQkgICAiRS1tYWlsIGFkZHJlc3MiIDoKKwkJICAgIlByaW50IG9wdGlvbiBzdHJpbmciCisJCSAgICk7CisJICAgIHggPSAtOTsKKwkgICAgZ290byB4c2VuZHg7CisJfQorCWNrc3RybmNweShvcHRidWYscyxPUFRCVUZMRU4pOwkvKiBPSywgY29weSB0byBvcHRpb24gYnVmZmVyICovCisJY21hcmcgPSBsaW5lOwkJCS8qIEZpbGUgdG8gc2VuZCAqLworCWlmIChuID09IFNORF9NQUkpIHsKKwkgICAgZGVidWcoRjExMCwieHNlbmQgbWFpbGluZyIsY21hcmcsMCk7CisJICAgIGRlYnVnKEYxMTAsInhzZW5kIGFkZHJlc3M6IixvcHRidWYsMCk7CisJICAgIHJtYWlsZiA9IDE7CisJfSBlbHNlIHsKKwkgICAgZGVidWcoRjExMCwieHNlbmQgcHJpbnRpbmciLGNtYXJnLDApOworCSAgICBkZWJ1ZyhGMTEwLCJ4c2VuZCBvcHRpb25zIixvcHRidWYsMCk7CisJICAgIHJwcmludGYgPSAxOworCX0KKyAgICB9CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworI2lmZGVmIENBTElCUkFURQorICAgIGlmIChwdltTTkRfQ0FMXS5pdmFsID4gMCkgewkJLyogSGFuZGxlIC9DQUxJQlJBVEUgKi8KKwlpZiAoY29uZmlybWVkKSB7CisJICAgIGNhbGlicmF0ZSA9IHB2W1NORF9DQUxdLml2YWwgKiAxMDI0TDsKKwkgICAgc25kc3JjID0gLTk7CisJICAgIG5maWxzID0gMTsKKwkgICAgd2lsZCA9IDA7CisjaWZuZGVmIE5PTVNFTkQKKwkgICAgYWRkbGlzdCA9IDA7CisjZW5kaWYgLyogTk9NU0VORCAqLworCSAgICBja3N0cm5jcHkobGluZSwiQ0FMSUJSQVRJT04iLExJTkJVRlNJWik7CisJICAgIHMgPSBjbWFyZyA9IGxpbmU7CisJICAgIGlmICghY21hcmcyKSBjbWFyZzIgPSAiIjsKKwkgICAgZGVidWcoRjExMCwiZG94c2VuZCBjbWFyZzIgY2FsaWJyYXRlIixjbWFyZzIsMCk7CisJfSBlbHNlIGlmIChsaW5lWzBdKSB7CisJICAgIGNhbGlicmF0ZSA9IDBMOworCSAgICBwdltTTkRfQ0FMXS5pdmFsID0gMEw7CisJfQorICAgIH0KKyNlbmRpZiAvKiBDQUxJQlJBVEUgKi8KKworICAgIGlmIChwdltTTkRfRklMXS5pdmFsID4gMCkgeworCWlmIChjb25maXJtZWQgJiYgIWNhbGlicmF0ZSkgeworCSAgICBpZiAoem9wZW5pKFpNRklMRSxwdltTTkRfRklMXS5zdmFsKSA8IDEpIHsKKwkJZGVidWcoRjExMCwieHNlbmQgY2FuJ3Qgb3BlbiIscHZbU05EX0ZJTF0uc3ZhbCwwKTsKKwkJcHJpbnRmKCI/RmFpbHVyZSB0byBvcGVuICVzXG4iLGZpbGVmaWxlKTsKKwkJeCA9IC05OworCQlnb3RvIHhzZW5keDsKKwkgICAgfQorCSAgICBtYWtlc3RyKCZmaWxlZmlsZSxwdltTTkRfRklMXS5zdmFsKTsgLyogT3BlbiwgcmVtZW1iZXIgbmFtZSAqLworCSAgICBkZWJ1ZyhGMTEwLCJ4c2VuZCBvcGVuZWQiLGZpbGVmaWxlLDApOworCSAgICB3aWxkID0gMTsKKwl9CisgICAgfQorCisgICAgLyogU0VORCBhbG9uZS4uLiAqLworCisjaWZuZGVmIE5PU1BMCisgICAgaWYgKGNvbmZpcm1lZCAmJiBwdltTTkRfQVJSXS5pdmFsID4gMCkgeworCWlmICghKmNtYXJnMikgeworCSAgICBzbmR4bmFtWzddID0gKGNoYXIpKChhcnJheXggPT0gMSkgPyA2NCA6IGFycmF5eCArIEFSUkFZQkFTRSk7CisJICAgIGNtYXJnMiA9IHNuZHhuYW07CisJfQorCWNtYXJnID0gIiI7CisJZ290byBzZW5kZW5kOworICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgaWYgKGNvbmZpcm1lZCAmJiAhbGluZVswXSAmJiAhZmlsZWZpbGUgJiYgIWNhbGlicmF0ZSkgeworI2lmbmRlZiBOT01TRU5ECisJaWYgKGZpbGVoZWFkKSB7CQkJLyogT0sgaWYgd2UgaGF2ZSBhIFNFTkQtTElTVCAqLworCSAgICBuZmlscyA9IGZpbGVzaW5saXN0OworCSAgICBzbmRzcmMgPSBuZmlsczsJCS8qIExpa2UgTVNFTkQgKi8KKwkgICAgYWRkbGlzdCA9IDE7CQkvKiBCdXQgdXNpbmcgYSBkaWZmZXJlbnQgbGlzdC4uLiAqLworCSAgICBmaWxlbmV4dCA9IGZpbGVoZWFkOworCSAgICBnb3RvIHNlbmRlbmQ7CisJfQorI2VuZGlmIC8qIE5PTVNFTkQgKi8KKwlwcmludGYoIj9GaWxlbmFtZSByZXF1aXJlZCBidXQgbm90IGdpdmVuXG4iKTsKKwl4ID0gLTk7CisJZ290byB4c2VuZHg7CisgICAgfQorCisgICAgLyogTm90IHNlbmQtbGlzdCBvciBhcnJheSAqLworCisjaWZuZGVmIE5PTVNFTkQKKyAgICBhZGRsaXN0ID0gMDsJCQkvKiBEb24ndCB1c2UgU0VORC1MSVNULiAqLworICAgIGZpbGVuZXh0ID0gTlVMTDsKKyNlbmRpZiAvKiBOT01TRU5EICovCisKKyAgICBpZiAobWxpc3QpIHsJCQkvKiBNU0VORCBvciBNTU9WRSAqLworI2lmbmRlZiBOT01TRU5ECisJY21saXN0ID0gbXNmaWxlczsJCS8qIExpc3Qgb2YgZmlsZXMgdG8gc2VuZCAqLworCXNuZHNyYyA9IG5maWxzOworCWNtYXJnMiA9ICIiOworCXNlbmRzdGFydCA9IDBMOworI2VuZGlmIC8qIE5PTVNFTkQgKi8KKyNpZmRlZiBQSVBFU0VORAorCXBpcGVzZW5kID0gMDsKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworICAgIH0gZWxzZSBpZiAoZmlsZWZpbGUpIHsJCS8qIEZpbGUgY29udGFpbnMgbGlzdCBvZiBmaWxlbmFtZXMgKi8KKwlzID0gIiI7CisJY21hcmcgPSAiIjsKKwljbWFyZzIgPSAiIjsKKwlsaW5lWzBdID0gTlVMOworCW5maWxzID0gMTsKKwlzbmRzcmMgPSAxOworCisgICAgfSBlbHNlIGlmICghY2FsaWJyYXRlICYmIHB2W1NORF9BUlJdLml2YWwgPCAxICYmIHB2W1NORF9DTURdLml2YWwgPCAxKSB7CisKKwluZmlscyA9IHNuZHNyYyA9IC0xOwkvKiBOb3QgTVNFTkQsIE1NT1ZFLCAvTElTVCwgb3IgL0FSUkFZICovCisJaWYgKAkJCQkvKiBvciAvQ09NTUFORCAqLworCisjaWZuZGVmIE5PRlJJTExTCisJICAgICFybWFpbGYgJiYgIXJwcmludGYJCS8qIE5vdCBNQUlMIG9yIFBSSU5UICovCisjZWxzZQorCSAgICAxCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKwkgICAgKSB7CisJICAgIGludCB5ID0gMTsKKwkgICAgaWYgKCF3aWxkKQorCSAgICAgIHkgPSB6Y2hraShzKTsKKwkgICAgaWYgKHkgPCAwKSB7CisJCXByaW50ZigiP1JlYWQgYWNjZXNzIGRlbmllZCAtIFwiJXNcIlxuIiwgcyk7CisJCXggPSAtOTsKKwkJZ290byB4c2VuZHg7CisJICAgIH0KKwkgICAgaWYgKHMgIT0gbGluZSkJCS8qIFdlIG1pZ2h0IGFscmVhZHkgaGF2ZSBkb25lIHRoaXMuICovCisJICAgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOyAvKiBDb3B5IG9mIHN0cmluZyBqdXN0IHBhcnNlZC4gKi8KKwkgICAgZWxzZQorCSAgICAgIGRlYnVnKEYxMTAsImRveHNlbmQgbGluZT1zIixsaW5lLDApOworCSAgICBjbWFyZyA9IGxpbmU7CQkvKiBGaWxlIHRvIHNlbmQgKi8KKwl9CisJemZucWZwKGNtYXJnLGZzcGVjbGVuLGZzcGVjKTsKKyAgICB9CisgICAgaWYgKCFtbGlzdCkgewkJCS8qIEZvciBhbGwgYnV0IE1TRU5ELi4uICovCisjaWZkZWYgUElQRVNFTkQKKwlpZiAocHZbU05EX0NNRF0uaXZhbCA+IDApCS8qIC9DT01NQU5EIHNldHMgcGlwZXNlbmQgZmxhZyAqLworCSAgcGlwZXNlbmQgPSAxOworCWRlYnVnKEYxMDEsInhzZW5kIC9DT01NQU5EIHBpcGVzZW5kIiwiIixwaXBlc2VuZCk7CisJaWYgKHBpcGVzZW5kICYmIGZpbGVmaWxlKSB7CisJICAgIHByaW50ZigiP0ludmFsaWQgc3dpdGNoIGNvbWJpbmF0aW9uXG4iKTsKKwkgICAgeCA9IC05OworCSAgICBnb3RvIHhzZW5keDsKKwl9CisjZW5kaWYgLyogUElQRVNFTkQgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIC8qIElmIGFzLW5hbWUgZ2l2ZW4gYW5kIGZpbGVzcGVjIGlzIHdpbGQsIGFzLW5hbWUgbXVzdCBjb250YWluIHZhcmlhYmxlcyAqLworCWRlYnVnKEYxMTEsImRveHNlbmQgY21hcmcyIHdpbGQiLGNtYXJnMix3aWxkKTsKKwlpZiAod2lsZCAmJiAqY21hcmcyKSB7CisJICAgIGNoYXIgKiBzID0gdG1wYnVmOworCSAgICB4ID0gVE1QQlVGU0laOworCSAgICB6enN0cmluZyhjbWFyZzIsJnMsJngpOworCSAgICBpZiAoIXN0cmNtcCh0bXBidWYsY21hcmcyKSkgeworCQlwcmludGYoCisgICAgIj9Bcy1uYW1lIGZvciBmaWxlIGdyb3VwIG11c3QgY29udGFpbiB2YXJpYWJsZXMgc3VjaCBhcyBcXHYoZmlsZW5hbWUpXG4iCisJCSAgICAgICApOworCQl4ID0gLTk7CisJCWdvdG8geHNlbmR4OworCSAgICB9CisJfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICAvKiBTdHJpcCBicmFjZXMgZnJvbSBhcy1uYW1lICovCisJZGVidWcoRjExMCwieHNlbmQgY21hcmcyIGJlZm9yZSBzdHJpcHBpbmciLGNtYXJnMiwwKTsKKwljbWFyZzIgPSBicnN0cmlwKGNtYXJnMik7CisJZGVidWcoRjExMCwieHNlbmQgZmlsZW5hbWUiLGNtYXJnLDApOworCWRlYnVnKEYxMTAsInhzZW5kIGFzLW5hbWUiLGNtYXJnMiwwKTsKKworICAgIC8qIENvcHkgYXMtbmFtZSB0byBhIHNhZmUgcGxhY2UgKi8KKworCWlmIChhc25idWYpIHsKKwkgICAgZnJlZShhc25idWYpOworCSAgICBhc25idWYgPSBOVUxMOworCX0KKwlpZiAoKHkgPSBzdHJsZW4oY21hcmcyKSkgPiAwKSB7CisJICAgIGFzbmJ1ZiA9IChjaGFyICopIG1hbGxvYyh5ICsgMSk7CisJICAgIGlmIChhc25idWYpIHsKKwkJc3RyY3B5KGFzbmJ1ZixjbWFyZzIpOwkvKiBzYWZlICovCisJCWNtYXJnMiA9IGFzbmJ1ZjsKKwkgICAgfSBlbHNlIGNtYXJnMiA9ICIiOworCX0KKworI2lmZGVmIENLX1JFU0VORAorCWRlYnVnKEYxMTEsInhzZW5kIHB2W1NORF9TVEFdLml2YWwiLCIiLHB2W1NORF9TVEFdLml2YWwpOworCWlmIChwdltTTkRfU1RBXS5pdmFsID4gLTEpIHsJLyogL1NUQVJUIHBvc2l0aW9uICovCisJICAgIGlmICh3aWxkKSB7CisJCXByaW50ZigiPy9TVEFSVElORy1BVCBtYXkgbm90IGJlIHVzZWQgd2l0aCBtdWx0aXBsZSBmaWxlcy5cbiIpOworCQl4ID0gLTk7CisJCWdvdG8geHNlbmR4OworCSAgICB9IGVsc2UKKwkgICAgICBzZW5kc3RhcnQgPSBwdltTTkRfU1RBXS5pdmFsOworCX0gZWxzZQorCSAgc2VuZHN0YXJ0ID0gMEw7CisJZGVidWcoRjEwMSwieHNlbmQgL1NUQVJUSU5HIiwiIixzZW5kc3RhcnQpOworI2VuZGlmIC8qIENLX1JFU0VORCAqLworICAgIH0KKworc2VuZGVuZDoJCQkJLyogQ29tbW9uIHN1Y2Nlc3NmdWwgZXhpdCAqLworICAgIG1vdmluZyA9IDA7CisgICAgaWYgKHB2W1NORF9TSEhdLml2YWwgPiAwKSB7CQkvKiBTRU5EIC9RVUlFVC4uLiAqLworCWdfZGlzcGxhID0gZmRpc3BsYTsKKwlmZGlzcGxhID0gMDsKKwlkZWJ1ZyhGMTAxLCJ4c2VuZCBkaXNwbGF5IiwiIixmZGlzcGxhKTsKKyAgICB9CisKKyNpZm5kZWYgTk9TUEwJCQkJLyogU0VORCAvQVJSQVkuLi4gKi8KKyAgICBpZiAocHZbU05EX0FSUl0uaXZhbCA+IDApIHsKKwlpZiAoIWFwKSB7IHggPSAtMjsgZ290byB4c2VuZHg7IH0gLyogKHNob3VsZG4ndCBoYXBwZW4pICovCisJaWYgKHJhbmdlWzBdID09IC0xKQkJLyogSWYgbG93IGVuZCBvZiByYW5nZSBub3Qgc3BlY2lmaWVkICovCisJICByYW5nZVswXSA9IDE7CQkJLyogZGVmYXVsdCB0byAxICovCisJaWYgKHJhbmdlWzFdID09IC0xKQkJLyogSWYgaGlnaCBub3Qgc3BlY2lmaWVkICovCisJICByYW5nZVsxXSA9IGFfZGltW2FycmF5eF07CS8qIGRlZmF1bHQgdG8gc2l6ZSBvZiBhcnJheSAqLworCWlmICgocmFuZ2VbMF0gPCAwKSB8fAkJLyogQ2hlY2sgcmFuZ2UgKi8KKwkgICAgKHJhbmdlWzBdID4gYV9kaW1bYXJyYXl4XSkgfHwKKwkgICAgKHJhbmdlWzFdIDwgcmFuZ2VbMF0pIHx8CisJICAgIChyYW5nZVsxXSA+IGFfZGltW2FycmF5eF0pKSB7CisJICAgIHByaW50ZigiP0JhZCBhcnJheSByYW5nZSAtIFslZDolZF1cbiIscmFuZ2VbMF0scmFuZ2VbMV0pOworCSAgICB4ID0gLTk7CisJICAgIGdvdG8geHNlbmR4OworCX0KKwlzbmRhcnJheSA9IGFwOwkJCS8qIEFycmF5IHBvaW50ZXIgKi8KKwlzbmR4aW4gPSBhcnJheXg7CQkvKiBBcnJheSBpbmRleCAqLworCXNuZHhsbyA9IHJhbmdlWzBdOwkJLyogQXJyYXkgcmFuZ2UgKi8KKwlzbmR4aGkgPSByYW5nZVsxXTsKKwlzbmR4bmFtWzddID0gKGNoYXIpKChzbmR4aW4gPT0gMSkgPyA2NCA6IHNuZHhpbiArIEFSUkFZQkFTRSk7CisKKyNpZmRlZiBDT01NRU5UCisJcHJpbnRmKCJTRU5ESU5HIEZST00gQVJSQVk6ICYlY1tdLi4uXG4iLCAvKiBkZWJ1Z2dpbmcgKi8KKwkgICAgICAgKHNuZHhpbiA9PSAxKSA/IDY0IDogc25keGluICsgQVJSQVlCQVNFKTsKKwlwcmludGYoIkxvPSVkXG5IaT0lZFxuIiwgc25keGxvLCBzbmR4aGkpOworCXByaW50ZigiY21hcmc9WyVzXVxuY21hcmcyPVslc11cbiIsIGNtYXJnLCBjbWFyZzIpOworCXdoaWxlICgoeCA9IGFnbmJ5dGUoKSkgPiAtMSkgeworCSAgICBwdXRjaGFyKChjaGFyKXgpOworCX0KKwlyZXR1cm4oMSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgaWYgKHB2W1NORF9BUlJdLml2YWwgPCAxKSB7CQkvKiBGaWxlIHNlbGVjdGlvbiAmIGRpc3Bvc2l0aW9uLi4uICovCisKKwlpZiAocHZbU05EX0RFTF0uaXZhbCA+IDApCS8qIC9ERUxFVEUgd2FzIHNwZWNpZmllZCAqLworCSAgbW92aW5nID0gMTsKKwlkZWJ1ZyhGMTAxLCJ4c2VuZCAvREVMRVRFIiwiIixtb3ZpbmcpOworCWlmIChwdltTTkRfQUZUXS5pdmFsID4gMCkJLyogQ29weSBTRU5EIGNyaXRlcmlhICovCisJICBja3N0cm5jcHkoc25kYWZ0ZXIscHZbU05EX0FGVF0uc3ZhbCwxOSk7CisJaWYgKHB2W1NORF9CRUZdLml2YWwgPiAwKQorCSAgY2tzdHJuY3B5KHNuZGJlZm9yZSxwdltTTkRfQkVGXS5zdmFsLDE5KTsKKwlpZiAocHZbU05EX05BRl0uaXZhbCA+IDApCisJICBja3N0cm5jcHkoc25kbmFmdGVyLHB2W1NORF9OQUZdLnN2YWwsMTkpOworCWlmIChwdltTTkRfTkJFXS5pdmFsID4gMCkKKwkgIGNrc3RybmNweShzbmRuYmVmb3JlLHB2W1NORF9OQkVdLnN2YWwsMTkpOworCWlmIChwdltTTkRfRVhDXS5pdmFsID4gMCkKKwkgIG1ha2VsaXN0KHB2W1NORF9FWENdLnN2YWwsc25kZXhjZXB0LE5TTkRFWENFUFQpOworCWlmIChwdltTTkRfU01BXS5pdmFsID4gLTEpCisJICBzbmRzbWFsbGVyID0gcHZbU05EX1NNQV0uaXZhbDsKKwlpZiAocHZbU05EX0xBUl0uaXZhbCA+IC0xKQorCSAgc25kbGFyZ2VyID0gcHZbU05EX0xBUl0uaXZhbDsKKwlpZiAocHZbU05EX05BTV0uaXZhbCA+IC0xKSB7CisJICAgIGdfZm5jbnYgPSBmbmNudjsJCS8qIFNhdmUgZ2xvYmFsIHZhbHVlICovCisJICAgIGZuY252ID0gcHZbU05EX05BTV0uaXZhbDsKKwkgICAgZGVidWcoRjEwMSwieHNlbmQgZm5jbnYiLCIiLGZuY252KTsKKwl9CisJaWYgKHB2W1NORF9QVEhdLml2YWwgPiAtMSkgeworCSAgICBnX3NwYXRoID0gZm5zcGF0aDsJCS8qIFNhdmUgZ2xvYmFsIHZhbHVlcyAqLworCSAgICBmbnNwYXRoID0gcHZbU05EX1BUSF0uaXZhbDsKKyNpZm5kZWYgTlpMVE9SCisJICAgIGlmIChmbnNwYXRoICE9IFBBVEhfT0ZGKSB7CisJCWdfZm5jbnYgPSBmbmNudjsJLyogQmFkIGJhZC4uLiAqLworCQlmbmNudiA9IFhZRk5fQzsKKwkgICAgfQorI2VuZGlmIC8qIE5aTFRPUiAqLworCSAgICBkZWJ1ZyhGMTAxLCJ4c2VuZCBmbnNwYXRoIiwiIixmbnNwYXRoKTsKKwkgICAgZGVidWcoRjEwMSwieHNlbmQgZm5jbnYiLCIiLGZuY252KTsKKwl9CisgICAgfQorCisjaWZkZWYgUElQRVNFTkQKKyAgICBpZiAocHZbU05EX0ZMVF0uaXZhbCA+IDApIHsKKwltYWtlc3RyKCZzbmRmaWx0ZXIscHZbU05EX0ZMVF0uc3ZhbCk7CisJZGVidWcoRjExMCwieHNlbmQgL0ZJTFRFUiIsIHNuZGZpbHRlciwgMCk7CisgICAgfQorI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyNpZmRlZiBDS19BUEMKKy8qIE1PVkUgbm90IGFsbG93ZWQgaW4gQVBDcyAqLworICAgIGlmIChtb3ZpbmcgJiYKKwkoYXBjYWN0aXZlID09IEFQQ19MT0NBTCB8fCBhcGNhY3RpdmUgPT0gQVBDX1JFTU9URSkKKwkmJiAhKGFwY3N0YXR1cyAmIEFQQ19VTkNIKSkKKyAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogQ0tfQVBDICovCisjaWZkZWYgSUtTX09QVElPTgorICAgIGlmICgKKyNpZmRlZiBDS19YWVoKKyAgICAgICAgcHJvdG9jb2wgPT0gUFJPVE9fSyAmJgorI2VuZGlmIC8qIENLX1hZWiAqLworICAgICAgICAhaWtzX3dhaXQoS0VSTUlUX1JFUV9TVEFSVCwxKSkgeworICAgICAgICBwcmludGYoIj9BIEtlcm1pdCBTZXJ2ZXIgaXMgbm90IGF2YWlsYWJsZSB0byBwcm9jZXNzIHRoaXMgY29tbWFuZC5cbiIpOworICAgICAgICBwcmludGYoIj9TdGFydCBhIFJFQ0VJVkUgY29tbWFuZCB0byBjb21wbGVtZW50IHRoaXMgY29tbWFuZC5cbiIpOworICAgIH0KKyNlbmRpZiAvKiBJS1NfT1BUSU9OICovCisKKyNpZmRlZiBJS1NECisjaWZkZWYgQ0tfTE9HSU4KKyAgICBpZiAobW92aW5nICYmIGluc2VydmVyICYmIGlzZ3Vlc3QpIHsKKyAgICAgICAgcHJpbnRmKCI/RmlsZSBkZWxldGlvbiBub3QgYWxsb3dlZCBmb3IgZ3Vlc3RzLlxuIik7CisJcmV0dXJuKC05KTsKKyAgICB9CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyNlbmRpZiAvKiBJS1NEICovCisKKyAgICBzc3RhdGUgPSAncyc7CQkJLyogU2V0IHN0YXJ0IHN0YXRlIHRvIFNFTkQgKi8KKyAgICBzbmRjbWQgPSAxOworI2lmZGVmIENLX1JFU0VORAorICAgIGlmIChwdltTTkRfUkVTXS5pdmFsID4gMCkJCS8qIFNlbmQgc2VuZG1vZGUgYXBwcm9wcmlhdGVseSAqLworICAgICAgc2VuZG1vZGUgPSBTTV9SRVNFTkQ7CisgICAgZWxzZSBpZiAocHZbU05EX1NUQV0uaXZhbCA+IDApCisgICAgICBzZW5kbW9kZSA9IFNNX1BTRU5EOworICAgIGVsc2UKKyNlbmRpZiAvKiBDS19SRVNFTkQgKi8KKyAgICBpZiAobWxpc3QpCisgICAgICBzZW5kbW9kZSA9IFNNX01TRU5EOworICAgIGVsc2UKKyAgICAgIHNlbmRtb2RlID0gU01fU0VORDsKKyNpZmRlZiBNQUMKKyAgICB3aGF0ID0gV19TRU5EOworICAgIHNjcmNyZWF0ZSgpOworI2VuZGlmIC8qIE1BQyAqLworICAgIGlmIChsb2NhbCAmJiBwdltTTkRfU0hIXS5pdmFsICE9IDApIHsgLyogSWYgaW4gbG9jYWwgbW9kZSwgKi8KKwlkaXNwbGEgPSAxOwkJCS8qIHR1cm4gb24gZmlsZSB0cmFuc2ZlciBkaXNwbGF5ICovCisgICAgfQorICAgIHggPSAwOworCisgIHhzZW5keDoJCQkJLyogQ29tbW9uIGV4aXQsIGluY2x1ZGluZyBmYWlsdXJlICovCisgICAgZGVidWcoRjEwMSwiZG94c2VuZCBzbmRzcmMiLCIiLHNuZHNyYyk7CisgICAgZm9yIChpID0gMDsgaSA8PSBTTkRfTUFYOyBpKyspIHsJLyogRnJlZSBtYWxsb2MnZCBtZW1vcnkgKi8KKwlpZiAocHZbaV0uc3ZhbCkKKwkgIGZyZWUocHZbaV0uc3ZhbCk7CisgICAgfQorICAgIHJldHVybih4KTsKK30KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT0xPQ0FMCisvKiAgRCBPIFggQyBPIE4gTiAgLS0gIENPTk5FQ1QgY29tbWFuZCBwYXJzaW5nIHdpdGggc3dpdGNoZXMgKi8KKworI2lmZGVmIFhMSU1JVFMKKyNkZWZpbmUgWExJTU9SVFJJR0dFUgorI2Vsc2UKKyNpZmRlZiBDS19UUklHR0VSCisjZGVmaW5lIFhMSU1PUlRSSUdHRVIKKyNlbmRpZiAvKiBDS19UUklHR0VSICovCisjZW5kaWYgLyogIFhMSU1JVFMgKi8KKworI2lmZGVmIENLVElETEUKK2ludCB0dF9pZGxlbGltaXQgPSAwOwkJCS8qIFRlcm1pbmFsIGlkbGUgbGltaXQgKi8KK2ludCB0dF9pZGxlYWN0ID0gSURMRV9SRVQ7CQkvKiBUZXJtaW5hbCBpZGxlIGFjdGlvbiAqLworI2VuZGlmIC8qIENLVElETEUgKi8KKworI2lmZGVmIE9TMgkJCQkvKiBLOTUgb25seTogKi8KK2V4dGVybiBpbnQKKyAgdHRfaWRsZXNuZF90bW87CQkJLyogICBJZGxlIGludGVydmFsICovCitpbnQgdHRfdGltZWxpbWl0ID0gMDsJCQkvKiAgIFRpbWUgbGltaXQsIDAgPSBub25lICovCitleHRlcm4gY2hhciAqCQkJCS8qIFBhcnNlIHJlc3VsdHMgLSBzdHJpbmdzOiAqLworICB0dF9pZGxlc25kX3N0cjsJCQkvKiAgIElkbGUgc3RyaW5nICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBDS19UUklHR0VSCitleHRlcm4gY2hhciAqdHRfdHJpZ2dlcltdOworZXh0ZXJuIENIQVIgKnR0X3RybWF0Y2hbXTsKK2V4dGVybiBjaGFyICp0cmlnZ2VydmFsOworc3RhdGljIGNoYXIgKmdfdHRfdHJpZ2dlcltUUklHR0VSU107CisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworCisjaWZkZWYgT1MyCitzdGF0aWMgaW50IGdfdHRfaWRsZXNuZF90bW8sIGdfdHRfdGltZWxpbWl0OyAvKiBGb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgKi8KK3N0YXRpYyBpbnQgZ190dF9pZGxlbGltaXQsIGdfdHRfc2F2ZWQgPSAwOworc3RhdGljIGNoYXIgKiBnX3R0X2lkbGVzbmRfc3RyOwkJLyogZ2xvYmFsIHNldHRpbmdzICovCisjZW5kaWYgLyogT1MyICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3RyaW5naW50IHsJCS8qIFRlbXBvcmFyeSBhcnJheSBmb3Igc3dpdGNoIHZhbHVlcyAqLworICAgIGNoYXIgKiBzdmFsOworICAgIGludCBpdmFsOworfSBwdltDT05OX01BWCsxXTsKKworVk9JRAorcmVzY29ubigpIHsKKyAgICBpbnQgaTsKKworI2lmZGVmIE9TMgorICAgIGlmICggZ190dF9zYXZlZCApIHsKKyAgICAgICAgdHRfaWRsZWxpbWl0ICAgPSBnX3R0X2lkbGVsaW1pdDsKKyAgICAgICAgdHRfaWRsZXNuZF90bW8gPSBnX3R0X2lkbGVzbmRfdG1vOworICAgICAgICB0dF90aW1lbGltaXQgICA9IGdfdHRfdGltZWxpbWl0OworICAgICAgICB0dF9pZGxlc25kX3N0ciA9IGdfdHRfaWRsZXNuZF9zdHI7CisgICAgICAgIGdfdHRfc2F2ZWQgPSAwOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIENLX1RSSUdHRVIKKyAgICBmb3IgKGkgPSAwOyBpIDwgVFJJR0dFUlM7IGkrKykKKyAgICAgIHR0X3RyaWdnZXJbaV0gPSBnX3R0X3RyaWdnZXJbaV07CisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworCisgICAgZm9yIChpID0gMDsgaSA8PSBDT05OX01BWDsgaSsrKSB7CS8qIEZyZWUgbWFsbG9jJ2QgbWVtb3J5ICovCisJaWYgKHB2W2ldLnN2YWwpCisJICBmcmVlKHB2W2ldLnN2YWwpOworICAgICAgICBwdltpXS5zdmFsID0gTlVMTDsKKyAgICB9Cit9CisKK2ludAorZG94Y29ubihjeCkgaW50IGN4OyB7CisgICAgaW50IGMsIGksIG47CQkJLyogV29ya2VycyAqLworICAgIGludCB4LCB5OworICAgIGludCBnZXR2YWwgPSAwOwkJCS8qIFdoZXRoZXIgdG8gZ2V0IHN3aXRjaCB2YWx1ZSAqLworICAgIGludCBhc3luYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIE1ha2UgYW4gYXN5bmMgY29ubmVjdCAqLworICAgIHN0cnVjdCBGREIgc3csIGNtOwkJCS8qIEZEQnMgZm9yIGVhY2ggcGFyc2UgZnVuY3Rpb24gKi8KKyAgICBleHRlcm4gRklMRSAqIHRmaWxlW107CisgICAgZXh0ZXJuIGNoYXIgKiBtYWNwW107CisKKyNpZmRlZiBPUzIKKyAgICBnX3R0X2lkbGVzbmRfdG1vID0gdHRfaWRsZXNuZF90bW87CS8qIFNhdmUgZ2xvYmFsIHNldHRpbmdzICovCisgICAgZ190dF90aW1lbGltaXQgICA9IHR0X3RpbWVsaW1pdDsKKyAgICBnX3R0X2lkbGVsaW1pdCAgID0gdHRfaWRsZWxpbWl0OworICAgIGdfdHRfaWRsZXNuZF9zdHIgPSB0dF9pZGxlc25kX3N0cjsKKyAgICBnX3R0X3NhdmVkID0gMTsKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIENLX1RSSUdHRVIKKyAgICBpZiAoIXR0X3RyaWdnZXJbMF0pIHsJCS8qIEZpcnN0IGluaXRpYWxpemF0aW9uICovCisJZm9yIChpID0gMTsgaSA8IFRSSUdHRVJTOyBpKyspCisJICB0dF90cmlnZ2VyW2ldID0gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFRSSUdHRVJTOyBpKyspCisgICAgICBnX3R0X3RyaWdnZXJbaV0gPSB0dF90cmlnZ2VyW2ldOworICAgIGlmICh0cmlnZ2VydmFsKSB7CisJZnJlZSh0cmlnZ2VydmFsKTsKKwl0cmlnZ2VydmFsID0gTlVMTDsKKyAgICB9CisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworCisgICAgZm9yIChpID0gMDsgaSA8PSBDT05OX01BWDsgaSsrKSB7CS8qIEluaXRpYWxpemUgc3dpdGNoIHZhbHVlcyAqLworCXB2W2ldLnN2YWwgPSBOVUxMOwkJLyogdG8gbnVsbCBwb2ludGVycyAqLworCXB2W2ldLml2YWwgPSAtMTsJCS8qIGFuZCAtMSBpbnQgdmFsdWVzICovCisgICAgfQorICAgIGlmIChjeCA9PSBYWENRKQkJCS8qIENRID09IENPTk5FQ1QgL1FVSUVUTFkgKi8KKyAgICAgIHB2W0NPTk5fTlZdLml2YWwgPSAxOworCisgICAgLyogU2V0IHVwIGNoYWluZWQgcGFyc2UgZnVuY3Rpb25zLi4uICovCisKKyAgICBjbWZkYmkoJnN3LAkJCQkvKiBGaXJzdCBGREIgLSBjb21tYW5kIHN3aXRjaGVzICovCisJICAgX0NNS0VZLAkJCS8qIGZjb2RlICovCisJICAgIlN3aXRjaCIsCQkJLyogaGxwbXNnICovCisJICAgIiIsCQkJCS8qIGRlZmF1bHQgKi8KKwkgICAiIiwJCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkgICBuY29ubnRhYiwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKwkgICA0LAkJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisJICAgeHhzdHJpbmcsCQkJLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworCSAgIGNvbm50YWIsCQkJLyogS2V5d29yZCB0YWJsZSAqLworCSAgICZjbQkJCQkvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisJICAgKTsKKyAgICBjbWZkYmkoJmNtLAkJCQkvKiAybmQgRkRCIC0gQ29uZmlybWF0aW9uICovCisJICAgX0NNQ0ZNLAkJCS8qIGZjb2RlICovCisJICAgIiIsCQkJCS8qIGhscG1zZyAqLworCSAgICIiLAkJCQkvKiBkZWZhdWx0ICovCisJICAgIiIsCQkJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJICAgMCwJCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKwkgICAwLAkJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworCSAgIE5VTEwsCisJICAgTlVMTCwKKwkgICBOVUxMCisJICAgKTsKKworICAgIHdoaWxlICgxKSB7CQkJCS8qIFBhcnNlIDAgb3IgbW9yZSBzd2l0Y2hlcyAqLworCXggPSBjbWZkYigmc3cpOwkJCS8qIFBhcnNlIHN3aXRjaCBvciBjb25maXJtYXRpb24gKi8KKwlkZWJ1ZyhGMTAxLCJkb3hjb25uIGNtZmRiIiwiIix4KTsKKwlpZiAoeCA8IDApIHsJCQkvKiBFcnJvciAqLworCSAgICBpZiAoeCA9PSAtOSB8fCB4ID09IC0yKQorCSAgICAgIHByaW50ZigiP05vIHN3aXRjaGVzIG1hdGNoIC0gXCIlc1wiXG4iLGF0bWJ1Zik7CisJICAgIGdvdG8geGNvbm54OwkJLyogb3IgcmVwYXJzZSBuZWVkZWQgKi8KKwl9CisJaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkJLyogQnJlYWsgb3V0IGlmIG5vdCBhIHN3aXRjaCAqLworCSAgYnJlYWs7CisJYyA9IGNtZ2JyaygpOwkJCS8qIEdldCBicmVhayBjaGFyYWN0ZXIgKi8KKwlnZXR2YWwgPSAoYyA9PSAnOicgfHwgYyA9PSAnPScpOyAvKiB0byBzZWUgaG93IHRoZXkgZW5kZWQgdGhlIHN3aXRjaCAqLworCWlmIChnZXR2YWwgJiYgIShjbXJlc3VsdC5rZmxhZ3MgJiBDTV9BUkcpKSB7CisJICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIGRvZXMgbm90IHRha2UgYXJndW1lbnRzXG4iKTsKKwkgICAgeCA9IC05OworCSAgICBnb3RvIHhjb25ueDsKKwl9CisJaWYgKCFnZXR2YWwgJiYgKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworCSAgICBwcmludGYoIj9UaGlzIHN3aXRjaCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCW4gPSBjbXJlc3VsdC5ucmVzdWx0OwkJLyogTnVtZXJpYyByZXN1bHQgPSBzd2l0Y2ggdmFsdWUgKi8KKwlkZWJ1ZyhGMTAxLCJkb3hjb25uIHN3aXRjaCIsIiIsbik7CisKKwlzd2l0Y2ggKG4pIHsJCQkvKiBQcm9jZXNzIHRoZSBzd2l0Y2ggKi8KKyNpZmRlZiBPUzIKKwkgIGNhc2UgQ09OTl9BUzoJCQkvKiBBc3luY2hyb25vdXMgKi8KKyAgICAgICAgICAgIHB2W0NPTk5fQVNdLml2YWwgPSAxOworICAgICAgICAgICAgcHZbQ09OTl9TWV0uaXZhbCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENPTk5fU1k6ICAgICAgICAgICAgICAgICAvKiBTeW5jaHJvbm91cyAqLworICAgICAgICAgICAgcHZbQ09OTl9TWV0uaXZhbCA9IDE7CisgICAgICAgICAgICBwdltDT05OX0FTXS5pdmFsID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE9TMiAqLworCSAgY2FzZSBDT05OX05WOgkJCS8qIE5vbi12ZXJiYWwgKi8KKwkgICAgcHZbbl0uaXZhbCA9IDE7CisJICAgIGJyZWFrOworI2lmZGVmIFhMSU1JVFMKKwkgIGNhc2UgQ09OTl9JSToJCQkvKiBJZGxlLWludGVydmFsICovCisJICBjYXNlIENPTk5fSUw6CQkJLyogSWRsZS1saW1pdCAqLworCSAgY2FzZSBDT05OX1RMOgkJCS8qIFRpbWUtbGltaXQgKi8KKwkgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworCSAgICBpZiAoKHggPSBjbW51bSgiU2Vjb25kcyIsIjAiLDEwLCZ5LHh4c3RyaW5nKSkgPCAwKQorCSAgICAgIGdvdG8geGNvbm54OworCSAgICBwdltuXS5pdmFsID0geTsKKwkgICAgYnJlYWs7CisJICBjYXNlIENPTk5fSVM6CQkJLyogSWRsZS1zdHJpbmcgKi8KKyNlbmRpZiAvKiBYTElNSVRTICovCisjaWZkZWYgQ0tfVFJJR0dFUgorCSAgY2FzZSBDT05OX1RTOgkJCS8qIFRyaWdnZXItc3RyaW5nICovCisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworI2lmZGVmIFhMSU1PUlRSSUdHRVIKKwkgICAgaWYgKCFnZXR2YWwpIGJyZWFrOworCSAgICBpZiAoKHggPSBjbWZsZCgiU3RyaW5nIChlbmNsb3NlIGluIGJyYWNlcyBpZiBpdCBjb250YWlucyBzcGFjZXMpIiwKKwkJCSAgICIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7CisJCWlmICh4ID09IC0zKSB7CisJCSAgICBwcmludGYoIj9TdHJpbmcgcmVxdWlyZWRcbiIpOworCQkgICAgeCA9IC05OworCQl9CisJCWdvdG8geGNvbm54OworCSAgICB9CisJICAgIGlmIChuICE9IENPTk5fVFMpCisJICAgICAgcyA9IGJyc3RyaXAocyk7CisJICAgIGlmICgoeSA9IHN0cmxlbihzKSkgPiAwKSB7CisJCWlmIChwdltuXS5zdmFsKSBmcmVlKHB2W25dLnN2YWwpOworCQlwdltuXS5zdmFsID0gbWFsbG9jKHkrMSk7CisJCWlmIChwdltuXS5zdmFsKSB7CisJCSAgICBzdHJjcHkocHZbbl0uc3ZhbCxzKTsgLyogc2FmZSAqLworCQkgICAgcHZbbl0uaXZhbCA9IDE7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKyNlbmRpZiAvKiBYTElNT1JUUklHR0VSICovCisJICBkZWZhdWx0OgorCSAgICBwcmludGYoIj9VbmV4cGVjdGVkIHN3aXRjaCB2YWx1ZSAtICVkXG4iLGNtcmVzdWx0Lm5yZXN1bHQpOworCSAgICB4ID0gLTk7CisJICAgIGdvdG8geGNvbm54OworCX0KKyAgICB9CisgICAgZGVidWcoRjEwMSwiZG94Y29ubiBjbXJlc3VsdC5mY29kZSIsIiIsY21yZXN1bHQuZmNvZGUpOworICAgIGlmIChjbXJlc3VsdC5mY29kZSAhPSBfQ01DRk0pIHsKKwlwcmludGYoIj9VbmV4cGVjdGVkIGZ1bmN0aW9uIGNvZGU6ICVkXG4iLGNtcmVzdWx0LmZjb2RlKTsKKwl4ID0gLTk7CisJZ290byB4Y29ubng7CisgICAgfQorCisgICAgLyogQ29tbWFuZCB3YXMgY29uZmlybWVkIHNvIHdlIGNhbiBwcmUtcG9wIGNvbW1hbmQgbGV2ZWwuICovCisgICAgLyogVGhpcyBpcyBzbyBDT05ORUNUIG1vZHVsZSB3b24ndCB0aGluayB3ZSdyZSBleGVjdXRpbmcgYSBzY3JpcHQgKi8KKyAgICAvKiBpZiBDT05ORUNUIHdhcyB0aGUgZmluYWwgY29tbWFuZCBpbiB0aGUgc2NyaXB0LiAqLworCisgICAgaWYgKGNtZGx2bCA+IDApCisgICAgICBwcmVwb3AoKTsKKworI2lmZGVmIE9TMgkJCQkvKiBNYWtlIHJlc3VsdHMgYXZhaWxhYmxlIGdsb2JhbGx5ICovCisgICAgaWYgKHB2W0NPTk5fSUxdLml2YWwgPiAtMSkJCS8qIElkbGUgbGltaXQgKi8KKyAgICAgIHR0X2lkbGVsaW1pdCA9IHB2W0NPTk5fSUxdLml2YWw7CisgICAgaWYgKHB2W0NPTk5fSUldLml2YWwgPiAtMSkJCS8qIElkbGUgbGltaXQgKi8KKyAgICAgIHR0X2lkbGVzbmRfdG1vID0gcHZbQ09OTl9JSV0uaXZhbDsKKyAgICBpZiAocHZbQ09OTl9JU10uc3ZhbCkJCS8qIElkbGUgc3RyaW5nICovCisgICAgICBpZiAodHRfaWRsZXNuZF9zdHIgPSAoY2hhciAqKW1hbGxvYygoaW50KXN0cmxlbihwdltDT05OX0lTXS5zdmFsKSsxKSkKKwlzdHJjcHkodHRfaWRsZXNuZF9zdHIscHZbQ09OTl9JU10uc3ZhbCk7IC8qIHNhZmUgKi8KKyAgICBpZiAocHZbQ09OTl9UTF0uaXZhbCA+IC0xKQkJLyogU2Vzc2lvbiBsaW1pdCAqLworICAgICAgdHRfdGltZWxpbWl0ID0gcHZbQ09OTl9UTF0uaXZhbDsKKyAgICBhc3luYyA9IChwdltDT05OX0FTXS5pdmFsID4gMCB8fAorICAgICAgICAgICAgIHB2W0NPTk5fU1ldLml2YWwgPD0gMCAmJiBjbWRsdmwgPT0gMCkgPyAxIDogMDsKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIENLX1RSSUdHRVIKKyAgICBpZiAocHZbQ09OTl9UU10uc3ZhbCkJCS8qIFRyaWdnZXIgc3RyaW5ncyAqLworICAgICAgbWFrZWxpc3QocHZbQ09OTl9UU10uc3ZhbCx0dF90cmlnZ2VyLFRSSUdHRVJTKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVFJJR0dFUlM7IGkrKykJLyogVHJpZ2dlciBtYXRjaCBwb2ludGVycyAqLworICAgICAgdHRfdHJtYXRjaFtpXSA9IE5VTEw7CisgICAgaWYgKHRyaWdnZXJ2YWwpIHsJCQkvKiBSZXNldCB0cmlnZ2VyIHZhbHVlICovCisJZnJlZSh0cmlnZ2VydmFsKTsKKwl0cmlnZ2VydmFsID0gTlVMTDsKKyAgICB9CisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworCisgICAgeCA9IGRvY29uZWN0KChwdltDT05OX05WXS5pdmFsID4gMCkgPyAxIDogMCwgYXN5bmMpOworICAgIHsKKwlpbnQgeHg7CisJZGVidWcoRjEwMSwiZG94Y29ubiBkb2NvbmVjdCByZXR1cm5zIiwiIix4KTsKKwlpZiAoKHh4ID0gdHRjaGsoKSkgPCAwKSBkb2xvZ2VuZCgpOworCWRlYnVnKEYxMDEsImRveGNvbm4gdHRjaGsgcmV0dXJucyIsIiIseHgpOworICAgIH0KKworI2lmZGVmIENLX1RSSUdHRVIKKyAgICBkZWJ1ZyhGMTExLCJkb3hjb25uIGRvY29uZWN0IHRyaWdnZXJ2YWwiLHRyaWdnZXJ2YWwseCk7CisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworCisgIHhjb25ueDoKKyAgICAvKiBCYWNrIGZyb20gQ09OTkVDVCAtLSBSZXN0b3JlIGdsb2JhbCBzZXR0aW5ncyAqLworCisgICAgaWYgKCFhc3luYykKKyAgICAgIHJlc2Nvbm4oKTsKKworICAgIHN1Y2Nlc3MgPSAoeCA+IDApID8gMSA6IDA7CisgICAgcmV0dXJuKHgpOworfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmZGVmIEFERENNRAorLyogY3ggPT0gWFhBREQgb3IgWFhSRU1WICovCisvKiBmYyA9PSBBRERfQklOIG9yIEFERF9UWFQgKi8KK3N0YXRpYyBpbnQKK2RvYWRkKGN4LGZjKSBpbnQgY3gsIGZjOyB7CisjaWZkZWYgUEFUVEVSTlMKKyAgICBjaGFyICogdG1wW0ZUUEFUVEVSTlNdOworICAgIGNoYXIgKipwID0gTlVMTDsKKyAgICBpbnQgaSwgaiwgaywgbiA9IDAsIHggPSAwLCBsYXN0OworCisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKyAgICBpZiAoY3ggIT0gWFhBREQgJiYgY3ggIT0gWFhSRU1WKSB7CisJcHJpbnRmKCI/VW5leHBlY3RlZCBmdW5jdGlvbiBjb2RlOiAlZFxuIixjeCk7CisJcmV0dXJuKC05KTsKKyAgICB9CisjaWZkZWYgUEFUVEVSTlMKKyAgICB3aGlsZSAobiA8IEZUUEFUVEVSTlMpIHsJCS8qIENvbGxlY3QgbmV3IHBhdHRlcm5zICovCisJdG1wW25dID0gTlVMTDsKKwlpZiAoKHggPSBjbWZsZCgiUGF0dGVybiIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisJICBicmVhazsKKwlja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisJcyA9IGJyc3RyaXAobGluZSk7CisJbWFrZXN0cigmKHRtcFtuKytdKSxzKTsKKyAgICB9CisgICAgaWYgKHggPT0gLTMpCisgICAgICB4ID0gY21jZm0oKTsKKyAgICBpZiAoeCA8IDApCisgICAgICBnb3RvIHhkb2FkZDsKKyAgICBwID0gKGZjID09IEFERF9CSU4pID8gYmlucGF0dGVybnMgOiB0eHRwYXR0ZXJuczsgLyogV2hpY2ggbGlzdCAqLworICAgIGxhc3QgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBGVFBBVFRFUk5TOyBpKyspIHsgLyogRmluZCBsYXN0IG9uZSBpbiBsaXN0ICovCisJaWYgKCFwW2ldKSB7CisJICAgIGxhc3QgPSBpOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIGlmIChjeCA9PSBYWEFERCkgewkJCS8qIEFkZGluZyAqLworCWlmIChsYXN0ICsgbiA+IEZUUEFUVEVSTlMpIHsJLyogQ2hlY2sgaWYgdG9vIG1hbnkgKi8KKwkgICAgcHJpbnRmKCI/VG9vIG1hbnkgcGF0dGVybnMgLSAlZCBpcyB0aGUgbWF4aW11bVxuIiwgRlRQQVRURVJOUyk7CisJICAgIGdvdG8geGRvYWRkOworCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeyAgICAgICAgLyogQ29weSBpbiB0aGUgbmV3IG9uZXMuICovCisgICAgICAgICAgZm9yIChqID0gMCwgeCA9IDA7IHggPT0gMCAmJiBqIDwgbGFzdCA7IGorKyApCisgICAgICAgICAgICB4ID0gIWNrc3RyY21wKHRtcFtpXSxwW2pdLC0xLGZpbGVjYXNlKTsgLyogbWF0Y2ggKi8KKyAgICAgICAgICBpZiAoeCA9PSAwKQorICAgICAgICAgICAgbWFrZXN0cigmKHBbbGFzdCsrXSksdG1wW2ldKTsKKyAgICAgICAgfQorICAgICAgICBtYWtlc3RyKCYocFtsYXN0XSksTlVMTCk7CS8qIE51bGwtdGVybWluYXRlIHRoZSBsaXN0ICovCisgICAgICAgIHggPSAxOworICAgICAgICBnb3RvIHhkb2FkZDsgICAgICAgICAgICAgICAgICAgIC8qIERvbmUgKi8KKyAgICB9IGVsc2UgaWYgKGN4ID09IFhYUkVNVikgewkJLyogUmVtb3ZlIHNvbWV0aGluZyhzKSAqLworCWludCBqLCBrOworCWlmIChsYXN0ID09IDApCQkJICAgICAgICAvKiBMaXN0IGlzIGVtcHR5ICovCisJICBnb3RvIHhkb2FkZDsJCQkgICAgICAgIC8qIE5vdGhpbmcgdG8gcmVtb3ZlICovCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewkgICAgICAgIC8qIGkgPSBQYXR0ZXJucyB0aGV5IHR5cGVkICovCisJICAgIGZvciAoaiA9IDA7IGogPCBsYXN0OyBqKyspIHsgICAgICAgIC8qIGogPSBQYXR0ZXJucyBpbiBsaXN0ICovCisJCS8qIENoYW5nZSB0aGlzIHRvIGNrc3RyY21wKCkuLi4gKi8KKwkJaWYgKGZpbGVjYXNlKQorICAgICAgICAgICAgICAgICAgeCA9ICFja3N0cmNtcCh0bXBbaV0scFtqXSwtMSxmaWxlY2FzZSk7IC8qIG1hdGNoICovCisJCWVsc2UKKwkJICB4ID0gY2tzdHJjbXAodG1wW2ldLHBbal0sLTEsMCk7IC8qIENhc2UtaW5kZXBlbmRlbnQgbWF0Y2ggKi8KKwkJaWYgKHgpIHsJICAgIAkgICAgICAgIC8qIFRoaXMgb25lIG1hdGNoZXMgKi8KKwkJICAgIG1ha2VzdHIoJihwW2pdKSxOVUxMKTsgICAgICAvKiBGcmVlIGl0ICovCisJCSAgICBmb3IgKGsgPSBqOyBrIDwgbGFzdDsgaysrKSAgLyogTW92ZSB0aGUgcmVzdCB1cCAqLworCQkgICAgICBwW2tdID0gcFtrKzFdOworCQkgICAgcFtrXSA9IE5VTEw7CSAgICAgICAgLyogRXJhc2UgbGFzdCBvbmUgKi8KKwkJICAgIGlmICghcFtrXSkKKwkJICAgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIHhkb2FkZDoJCQkJLyogQ29tbW9uIGV4aXQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgaWYgKHRtcFtpXSkKKwlmcmVlKHRtcFtpXSk7CisgICAgcmV0dXJuKHgpOworI2VuZGlmIC8qIFBBVFRFUk5TICovCit9CisKKy8qIEFERCBTRU5ELUxJU1QgKi8KKworc3RhdGljIGludAorYWRkc2VuZChjeCkgaW50IGN4OyB7CisjaWZuZGVmIE5PTVNFTkQKKyAgICBleHRlcm4gc3RydWN0IGtleXRhYiBmdHRhYltdOworICAgIGV4dGVybiBpbnQgbmZ0dHlwOworICAgIHN0cnVjdCBmaWxlbGlzdCAqIGZscDsKKyAgICBjaGFyICogZm1vZGUgPSAiIjsKKyAgICBpbnQgeG1vZGUgPSAwOworICAgIGludCB4YmluYXJ5ID0gMDsKKyNlbmRpZiAvKiBOT01TRU5EICovCisKKyNpZmRlZiBOT01TRU5ECisgICAgcHJpbnRmKCI/U29ycnksIEFERC9SRU1PVkUgU0VORC1MSVNUIG5vdCBhdmFpbGFibGUuXG4iKTsKKyAgICByZXR1cm4oLTkpOworI2VuZGlmIC8qIE5PTVNFTkQgKi8KKyAgICBpZiAoY3ggPT0gWFhSRU1WKSB7CisJcHJpbnRmKCI/U29ycnksIFJFTU9WRSBTRU5ELUxJU1Qgbm90IGltcGxlbWVudGVkIHlldC5cbiIpOworCXJldHVybigtOSk7CisgICAgfQorI2lmbmRlZiBOT01TRU5ECisjaWZuZGVmIFhZWl9JTlRFUk5BTAorICAgIGlmIChwcm90b2NvbCAhPSBQUk9UT19LKSB7CisgICAgICAgcHJpbnRmKCI/U29ycnksIEFERCBTRU5ELUxJU1QgZG9lcyBub3Qgd29yayB3aXRoIGV4dGVybmFsIHByb3RvY29sc1xuIik7CisgICAgICAgcmV0dXJuKC05KTsKKyAgICB9CisjZW5kaWYgLyogWFlaX0lOVEVSTkFMICovCisKKyAgICB4ID0gY21pZmkoIkZpbGUgc3BlY2lmaWNhdGlvbiB0byBhZGQiLCIiLCAmcywmeSx4eHN0cmluZyk7CisgICAgaWYgKHggPCAwKSB7CisJaWYgKHggPT0gLTMpIHsKKwkgICAgcHJpbnRmKCI/QSBmaWxlIHNwZWNpZmljYXRpb24gaXMgcmVxdWlyZWRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0gZWxzZQorCSAgcmV0dXJuKHgpOworICAgIH0KKyAgICBja3N0cm5jcHkodG1wYnVmLHMsVE1QQlVGU0laKTsKKyAgICBzID0gdG1wYnVmOworICAgIGlmIChmaWxlc2lubGlzdCA9PSAwKQkJLyogVGFrZSBjYXJlIG9mIFx2KGZpbGVzcGVjKSAqLworICAgICAgZnNwZWNbMF0gPSBOVUw7CisgICAgemZucWZwKHMsTElOQlVGU0laLGxpbmUpOworICAgIHMgPSBsaW5lOworICAgIGlmICgoKGludClzdHJsZW4oZnNwZWMpICsgKGludClzdHJsZW4ocykgKyAxKSA8IGZzcGVjbGVuKSB7CisJc3RyY2F0KGZzcGVjLHMpOwkJLyogc2FmZSAqLworCXN0cmNhdChmc3BlYywiICIpOwkJLyogc2FmZSAqLworICAgIH0gZWxzZQorICAgICAgcHJpbnRmKCJXQVJOSU5HIC0gXFx2KGZpbGVzcGVjKSBidWZmZXIgb3ZlcmZsb3dcbiIpOworCisKKyAgICB4YmluYXJ5ID0gYmluYXJ5OworICAgIGlmICgocGF0dGVybnMgfHwgZmlsZXBlZWspCQkvKiBGSUxFIFBBVFRFUk5TIG9yIFNDQU4gaXMgT04gKi8KKyNpZmRlZiBDS19MQUJFTEVECisJJiYgYmluYXJ5ICE9IFhZRlRfTAkJLyogQW5kIG5vdCBpZiBGSUxFIFRZUEUgTEFCRUxFRCAqLworI2VuZGlmIC8qIENLX0xBQkVMRUQgKi8KKyNpZmRlZiBWTVMKKwkmJiBiaW5hcnkgIT0gWFlGVF9JCQkvKiBvciBGSUxFIFRZUEUgSU1BR0UgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKwkpIHsKKwlpbnQgaywgeDsKKwl4ID0gLTE7CisJayA9IHNjYW5maWxlKGxpbmUsJngsbnNjYW5maWxlKTsKKwlpZiAoayA+IDApIHhiaW5hcnkgPSAoayA9PSBGVF9CSU4pID8gWFlGVF9CIDogWFlGVF9UOworICAgIH0KKyAgICBmbW9kZSA9IGdmbW9kZSh4YmluYXJ5LDApOworICAgIGlmICgoeCA9IGNta2V5KGZ0dGFiLG5mdHR5cCwKKwkJICAgInR5cGUgb2YgZmlsZSB0cmFuc2ZlciIsIGZtb2RlLCB4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih4KTsKKyAgICB4bW9kZSA9IHg7CisKKyAgICBjbWFyZzIgPSAiIjsKKyAgICBpZiAoKHggPSBjbWZsZCh5ID8KKyAgIlxuQXMtbmFtZSB0ZW1wbGF0ZSBjb250YWluaW5nIHJlcGxhY2VtZW50IHZhcmlhYmxlcyBzdWNoIGFzIFxcdihmaWxlbmFtZSkiIDoKKyAgIk5hbWUgdG8gc2VuZCBpdCB3aXRoIiwgIiIsJnMsTlVMTCkpIDwgMCkKKyAgICAgIGlmICh4ICE9IC0zKQorCXJldHVybih4KTsKKyNpZm5kZWYgTk9TUEwKKyAgICBpZiAoeSAmJiAqcykgeworCWNoYXIgKiBwID0gdG1wYnVmOworCXggPSBUTVBCVUZTSVo7CisJenpzdHJpbmcocywmcCwmeCk7CisJaWYgKCFzdHJjbXAodG1wYnVmLHMpKSB7CisJICAgIHByaW50ZigKKyAgIj9Bcy1uYW1lIGZvciBmaWxlIGdyb3VwIG11c3QgY29udGFpbiB2YXJpYWJsZXMgc3VjaCBhcyBcXHYoZmlsZW5hbWUpXG4iCisJCSAgICk7CisJICAgIHJldHVybigtOSk7CisJfQorICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIGNrc3RybmNweSh0bXBidWYscyxUTVBCVUZTSVopOworICAgIGNtYXJnMiA9IHRtcGJ1ZjsKKworICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgIHJldHVybih4KTsKKyAgICBmbHAgPSAoc3RydWN0IGZpbGVsaXN0ICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGZpbGVsaXN0KSk7CisgICAgaWYgKGZscCkgeworCWlmIChmaWxldGFpbCkKKwkgIGZpbGV0YWlsLT5mbF9uZXh0ID0gZmxwOworCWZpbGV0YWlsID0gZmxwOworCWlmICghZmlsZWhlYWQpCisJICBmaWxlaGVhZCA9IGZscDsKKwl4ID0gKGludCkgc3RybGVuKGxpbmUpOwkvKiBMZW5ndGggb2YgZmlsZW5hbWUgKi8KKwlzID0gKGNoYXIgKikgbWFsbG9jKHggKyAxKTsKKwlpZiAocykgeworCSAgICBzdHJjcHkocyxsaW5lKTsJCS8qIHNhZmUgKi8KKwkgICAgZmxwLT5mbF9uYW1lID0gczsKKwkgICAgZmxwLT5mbF9tb2RlID0geG1vZGU7CisJICAgIHggPSAoaW50KSBzdHJsZW4oY21hcmcyKTsJLyogTGVuZ3RoIG9mIGFzLW5hbWUgKi8KKwkgICAgaWYgKHggPCAxKSB7CisJCWZscC0+ZmxfYWxpYXMgPSBOVUxMOworCSAgICB9IGVsc2UgeworCQlzID0gKGNoYXIgKikgbWFsbG9jKHggKyAxKTsKKwkJaWYgKHMpIHsKKwkJICAgIHN0cmNweShzLGNtYXJnMik7CS8qIHNhZmUgKi8KKwkJICAgIGZscC0+ZmxfYWxpYXMgPSBzOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRmKCJTb3JyeSwgY2FuJ3QgYWxsb2NhdGUgc3BhY2UgZm9yIGFzLW5hbWUiKTsKKwkJICAgIHJldHVybigtOSk7CisJCX0KKwkgICAgfQorCSAgICBmbHAtPmZsX25leHQgPSBOVUxMOworCSAgICBmaWxlc2lubGlzdCsrOwkJLyogQ291bnQgdGhpcyBub2RlICovCisJICAgIHJldHVybihzdWNjZXNzID0gMSk7CS8qIEZpbmlzaGVkIGFkZGluZyB0aGlzIG5vZGUgKi8KKwl9IGVsc2UgeworCSAgICBwcmludGYoIlNvcnJ5LCBjYW4ndCBhbGxvY2F0ZSBzcGFjZSBmb3IgbmFtZSIpOworCSAgICByZXR1cm4oLTkpOworCX0KKyAgICB9IGVsc2UgeworCXByaW50ZigiU29ycnksIGNhbid0IGFsbG9jYXRlIGZpbGUgbGlzdCBub2RlIik7CisJcmV0dXJuKC05KTsKKyAgICB9CisjZW5kaWYgLyogTk9NU0VORCAqLworfQorI2VuZGlmIC8qIEFERENNRCAqLworCisjaWZuZGVmIE5PSFRUUAkJCQkvKiBIVFRQIG9wcy4uLiAqLworI2lmZGVmIFRDUFNPQ0tFVAorI2RlZmluZSBIVFRQX0dFVCAwCQkJLyogR0VUICovCisjZGVmaW5lIEhUVFBfUFVUIDEJCQkvKiBQVVQgKi8KKyNkZWZpbmUgSFRUUF9QT1MgMgkJCS8qIFBPU1QgKi8KKyNkZWZpbmUgSFRUUF9JRFggMwkJCS8qIElOREVYICovCisjZGVmaW5lIEhUVFBfSEVEIDQgICAgICAgICAgICAgICAgICAgICAgLyogSEVBRCAqLworI2RlZmluZSBIVFRQX0RFTCA1ICAgICAgICAgICAgICAgICAgICAgIC8qIERFTEVURSAqLworI2RlZmluZSBIVFRQX0NPTiA2ICAgICAgICAgICAgICAgICAgICAgIC8qIENPTk5FQ1QgKi8KKyNkZWZpbmUgSFRUUF9PUE4gNyAgICAgICAgICAgICAgICAgICAgICAvKiBPUEVOICovCisjZGVmaW5lIEhUVFBfQ0xTIDggICAgICAgICAgICAgICAgICAgICAgLyogQ0xPU0UgKi8KKworc3RhdGljIHN0cnVjdCBrZXl0YWIgaHR0cHRhYltdID0geworICAgIHsgImNsb3NlIiwgICBIVFRQX0NMUywgMCB9LAorICAgIHsgImNvbm5lY3QiLCBIVFRQX0NPTiwgMCB9LAorICAgIHsgImRlbGV0ZSIsICBIVFRQX0RFTCwgMCB9LAorICAgIHsgImdldCIsICAgICBIVFRQX0dFVCwgMCB9LAorICAgIHsgImhlYWQiLCAgICBIVFRQX0hFRCwgMCB9LAorICAgIHsgImluZGV4IiwgICBIVFRQX0lEWCwgMCB9LAorICAgIHsgIm9wZW4iLCAgICBIVFRQX09QTiwgMCB9LAorICAgIHsgInB1dCIsICAgICBIVFRQX1BVVCwgMCB9LAorICAgIHsgInBvc3QiLCAgICBIVFRQX1BPUywgMCB9Cit9Oworc3RhdGljIGludCBuaHR0cHRhYiA9IHNpemVvZihodHRwdGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYik7CisKKy8qIEhUVFAgc3dpdGNoZXMgKi8KKyNkZWZpbmUgSFRfU1dfQUcgMAkJCS8qIC9BR0VOVCAqLworI2RlZmluZSBIVF9TV19IRCAxCQkJLyogL0hFQURFUiAqLworI2RlZmluZSBIVF9TV19VUyAyCQkJLyogL1VTRVIgKi8KKyNkZWZpbmUgSFRfU1dfUFcgMwkJCS8qIC9QQVNTV09SRCAqLworI2RlZmluZSBIVF9TV19BUiA0ICAgICAgICAgICAgICAgICAgICAgIC8qIC9BUlJBWSAqLworI2RlZmluZSBIVF9TV19UUCA1ICAgICAgICAgICAgICAgICAgICAgIC8qIC9UT1NDUkVFTiAqLworCitzdGF0aWMgc3RydWN0IGtleXRhYiBodHRwc3d0YWJbXSA9IHsKKyAgICB7ICIvYWdlbnQiLCAgICBIVF9TV19BRywgQ01fQVJHIH0sCisjaWZuZGVmIE5PU1BMCisgICAgeyAiL2FycmF5IiwgICAgSFRfU1dfQVIsIENNX0FSRyB9LAorI2VuZGlmIC8qIE5PU1BMICovCisgICAgeyAiL2hlYWRlciIsICAgSFRfU1dfSEQsIENNX0FSRyB9LAorICAgIHsgIi9wYXNzd29yZCIsIEhUX1NXX1BXLCBDTV9BUkcgfSwKKyAgICB7ICIvdG9zY3JlZW4iLCBIVF9TV19UUCwgMCB9LAorICAgIHsgIi91c2VyIiwgICAgIEhUX1NXX1VTLCBDTV9BUkcgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5odHRwc3d0YWIgPSBzaXplb2YoaHR0cHN3dGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYikgLSAxOworCisvKiBIVFRQIFBVVC9QT1NUIHN3aXRjaGVzICovCisjZGVmaW5lIEhUX1BQX01UIDAJCQkvKiAvTUlNRS1UWVBFICovCisKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIGh0dHBwdGFiW10gPSB7CisgICAgeyAiL21pbWUtdHlwZSIsIEhUX1BQX01ULCBDTV9BUkcgfSwKKyAgICB7ICIiLCAwLCAwIH0KK307CitzdGF0aWMgaW50IG5odHRwcHRhYiA9IHNpemVvZihodHRwcHRhYikvc2l6ZW9mKHN0cnVjdCBrZXl0YWIpIC0gMTsKKworI2RlZmluZSBIVFRQX01BWEhEUiA4CisKK3N0YXRpYyBpbnQKK3hkb2h0dHAoYWN0aW9uLCBsZmlsZSwgcmYsIGRmaWxlLCBhZ2VudCwgaGRyLCB1c2VyLCBwYXNzLCBtaW1lLCBhcnJheSwgdHlwZSkKKyAgICBpbnQgYWN0aW9uOworICAgIGNoYXIgKmxmaWxlLCAqcmYsICpkZmlsZSwgKmFnZW50LCAqaGRyLCAqdXNlciwgKnBhc3MsICptaW1lLCBhcnJheTsKKyAgICBpbnQgdHlwZTsKKy8qIHhkb2h0dHAgKi8geworICAgIGludCBpLCByYyA9IDA7CisgICAgY2hhciAqIGhkcmxpc3RbSFRUUF9NQVhIRFJdOworICAgIGNoYXIgcmZpbGVbQ0tNQVhQQVRIKzFdOworICAgIGV4dGVybiBpbnQgaHR0cGZkOworCisgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgc3RhdGUgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCAqLworICAgIGlmIChpbnNlcnZlcikgeworICAgICAgICBwcmludGYoIj9UaGUgSFRUUCBjb21tYW5kIG1heSBub3QgYmUgdXNlZCBmcm9tIHRoZSBJS1NcclxuIik7CisgICAgfSBlbHNlIGlmIChodHRwZmQgPT0gLTEpIHsKKyAgICAgICAgaWYgKGh0dHBfcmVvcGVuKCkgPCAwKQorCSAgcHJpbnRmKCI/Tm8gY29ubmVjdGlvblxuIik7CisgICAgICAgIGVsc2UKKwkgIHJjID0gMTsKKyAgICB9IGVsc2UgeworCXJjID0gMTsKKyAgICB9CisKKyAgICAvKiBJZiB0aGUgY29tbWFuZCBpcyBub3QgdmFsaWQsIGV4aXQgd2l0aCBmYWlsdXJlICovCisgICAgaWYgKHJjID09IDApCisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisKKyAgICBpZiAoYWN0aW9uICE9IEhUVFBfQ09OICYmIHJmWzBdICE9ICcvJykgeworICAgICAgICByZmlsZVswXSA9ICcvJzsKKyAgICAgICAgY2tzdHJuY3B5KCZyZmlsZVsxXSxyZixDS01BWFBBVEgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNrc3RybmNweShyZmlsZSxyZixDS01BWFBBVEgpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgSFRUUF9NQVhIRFI7IGkrKykJLyogSW5pdGlhbGl6ZSBoZWFkZXIgbGlzdCAqLworICAgICAgaGRybGlzdFtpXSA9IE5VTEw7CisgICAgbWFrZWxpc3QoaGRyLGhkcmxpc3QsSFRUUF9NQVhIRFIpOwkvKiBNYWtlIGhlYWRlciBsaXN0ICovCisKKyNpZmRlZiBCRVRBREVCVUcKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmh0dHB0YWI7IGkrKykJLyogRmluZCBhY3Rpb24ga2V5d29yZCAqLworICAgICAgaWYgKGh0dHB0YWJbaV0ua3d2YWwgPT0gYWN0aW9uKQorCWJyZWFrOworICAgIGlmIChpID09IG5odHRwdGFiKSB7CQkvKiBTaG91bGRuJ3QgaGFwcGVuLi4uICovCisJcHJpbnRmKCI/SW52YWxpZCBhY3Rpb24gLSAlZFxuIixhY3Rpb24pOworCXJldHVybigwKTsJCQkvKiBGYWlsdXJlICovCisgICAgfQorCisgICAgcHJpbnRmKCJIVFRQIGFjdGlvbjogICVzXG4iLGh0dHB0YWJbaV0ua3dkKTsKKyAgICBwcmludGYoIiBBZ2VudDogICAgICAgJXNcbiIsYWdlbnQgPyBhZ2VudCA6ICIobnVsbCkiKTsKKworICAgIGlmIChoZHJsaXN0WzFdKSB7CisJcHJpbnRmKCIgSGVhZGVyIGxpc3Q6IDEuICVzXG4iLGhkcmxpc3RbMF0pOworCWZvciAoaSA9IDE7IGkgPCBIVFRQX01BWEhEUiAmJiBoZHJsaXN0W2ldOyBpKyspCisJICBwcmludGYoIiUxNWQuICVzXG4iLGkrMSxoZHJsaXN0W2ldKTsKKyAgICB9IGVsc2UKKyAgICAgIHByaW50ZigiIEhlYWRlcjogICAgICAlc1xuIixoZHJsaXN0WzBdID8gaGRybGlzdFswXSA6ICIobnVsbCkiKTsKKworICAgIHByaW50ZigiIFVzZXI6ICAgICAgICAlc1xuIix1c2VyID8gdXNlciA6ICIobnVsbCkiKTsKKyNpZmRlZiBDT01NRU5UCisgICAgcHJpbnRmKCIgUGFzc3dvcmQ6ICAgICVzXG4iLHBhc3MgPyBwYXNzIDogIihudWxsKSIpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIGlmIChhcnJheSkKKyAgICAgIHByaW50ZigiIEFycmF5OiAgICAgICBcXCUlJWNbXVxuIiwgYXJyYXkpOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiIEFycmF5OiAgICAgICAobm9uZSlcbiIpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICBpZiAoYWN0aW9uID09IEhUVFBfUFVUIHx8IGFjdGlvbiA9PSBIVFRQX1BPUykKKyAgICAgIHByaW50ZigiIE1pbWUtdHlwZTogICAlc1xuIixtaW1lID8gbWltZSA6ICIobnVsbCkiKTsKKworICAgIHByaW50ZigiIExvY2FsIGZpbGU6ICAlc1xuIixsZmlsZSA/IGxmaWxlIDogIihudWxsKSIpOworICAgIHByaW50ZigiIFJlbW90ZSBmaWxlOiAlc1xuIixyZmlsZSA/IHJmaWxlIDogIihudWxsKSIpOworICAgIHByaW50ZigiIERlc3RpbmF0aW9uIGZpbGU6ICVzXG4iLGRmaWxlID8gZGZpbGUgOiAiKG51bGwpIik7CisjZW5kaWYgLyogQkVUQURFQlVHICovCisKKyAgICAvKiBUaGUgaHR0cF94eHh4KCkgZnVuY3Rpb25zIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUgKi8KKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgY2FzZSBIVFRQX0NPTjogeworCSAgZXh0ZXJuIGludCB0dHlmZDsKKwkgIHJjID0gaHR0cF9jb25uZWN0KGh0dHBmZCxhZ2VudCxoZHJsaXN0LHVzZXIscGFzcyxhcnJheSxyZmlsZSk7CisJICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgSFRUUF9ERUw6CisgICAgICAgIHJjID0gaHR0cF9kZWxldGUoYWdlbnQsaGRybGlzdCx1c2VyLHBhc3MsYXJyYXkscmZpbGUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSFRUUF9HRVQ6CisgICAgICAgIHJjID0gaHR0cF9nZXQoYWdlbnQsaGRybGlzdCx1c2VyLHBhc3MsYXJyYXksbGZpbGUscmZpbGUsdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIVFRQX0hFRDoKKyAgICAgICAgcmMgPSBodHRwX2hlYWQoYWdlbnQsaGRybGlzdCx1c2VyLHBhc3MsYXJyYXksbGZpbGUscmZpbGUsdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIVFRQX1BVVDoKKyAgICAgICAgcmMgPSBodHRwX3B1dChhZ2VudCxoZHJsaXN0LG1pbWUsdXNlcixwYXNzLGFycmF5LGxmaWxlLHJmaWxlLGRmaWxlLAorCQkgICAgICB0eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhUVFBfUE9TOgorICAgICAgICByYyA9IGh0dHBfcG9zdChhZ2VudCxoZHJsaXN0LG1pbWUsdXNlcixwYXNzLGFycmF5LGxmaWxlLHJmaWxlLGRmaWxlLAorCQkgICAgICAgdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIVFRQX0lEWDoKKyAgICAgICAgcmMgPSBodHRwX2luZGV4KGFnZW50LGhkcmxpc3QsdXNlcixwYXNzLGFycmF5LGxmaWxlLHJmaWxlLHR5cGUpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJjID0gLTE7CisgICAgfQorICAgIHJldHVybihyYyA9PSAwID8gMSA6IDApOwkgICAgICAgIC8qIFN1Y2Nlc3MgaXMgc2V0IGJ5IGNhbGxlciAqLworfQorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2VuZGlmIC8qIE5PSFRUUCAqLworCisjaWZuZGVmIE5PU1BMCQkJCS8qIEFSUkFZIG9wcy4uLiAqLworc3RhdGljIHN0cnVjdCBrZXl0YWIgYXJyYXl0YWJbXSA9IHsKKyAgICB7ICJjbGVhciIsICAgICBBUlJfQ0xSLCAwIH0sCisgICAgeyAiY29weSIsICAgICAgQVJSX0NQWSwgMCB9LAorICAgIHsgImRjbCIsICAgICAgIEFSUl9EQ0wsIENNX0lOViB9LAorICAgIHsgImRlY2xhcmUiLCAgIEFSUl9EQ0wsIDAgfSwKKyAgICB7ICJkZXN0cm95IiwgICBBUlJfRFNULCBDTV9JTlYgfSwKKyAgICB7ICJlcXVhdGUiLCAgICBBUlJfRVFVLCBDTV9JTlYgfSwKKyAgICB7ICJsaW5rIiwgICAgICBBUlJfRVFVLCAwIH0sCisgICAgeyAicmVzaXplIiwgICAgQVJSX1JTWiwgMCB9LAorICAgIHsgInNldCIsICAgICAgIEFSUl9TRVQsIDAgfSwKKyNpZm5kZWYgTk9TSE9XCisgICAgeyAic2hvdyIsICAgICAgQVJSX1NITywgMCB9LAorI2VuZGlmIC8qIE5PU0hPVyAqLworICAgIHsgInNvcnQiLCAgICAgIEFSUl9TUlQsIDAgfSwKKyAgICB7ICJ1bmRlY2xhcmUiLCBBUlJfRFNULCAwIH0sCisgICAgeyAiIiwgMCwgMCB9Cit9Oworc3RhdGljIGludCBuYXJyYXl0YWIgPSBzaXplb2YoYXJyYXl0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKSAtIDE7CisKKyNpZmRlZiBDS0xFQVJOCitzdGF0aWMgc3RydWN0IGtleXRhYiBsZWFybnN3aVtdID0geworICAgIHsgIi9jbG9zZSIsICAgIDIsIDAgfSwKKyAgICB7ICIvb2ZmIiwgICAgICAwLCAwIH0sCisgICAgeyAiL29uIiwgICAgICAgMSwgMCB9Cit9OworI2VuZGlmIC8qIENLTEVBUk4gKi8KKworaW50CithcnJheWl0b2EoeCkgaW50IHg7IHsJCQkvKiBBcnJheSBpbmRleCB0byBhcnJheSBsZXR0ZXIgKi8KKyAgICBpZiAoeCA9PSAxKQorICAgICAgcmV0dXJuKDY0KTsKKyAgICBlbHNlIGlmICh4IDwgMCB8fCB4ID4gKDEyMiAtIEFSUkFZQkFTRSkpCisgICAgICByZXR1cm4oLTEpOworICAgIGVsc2UKKyAgICAgIHJldHVybih4ICsgQVJSQVlCQVNFKTsKK30KKworaW50CithcnJheWF0b2koYykgaW50IGM7IHsJCQkvKiBBcnJheSBsZXR0ZXIgdG8gYXJyYXkgaW5kZXggKi8KKyAgICBpZiAoYyA9PSA2NCkKKyAgICAgIGMgPSA5NjsKKyAgICBpZiAoYyA+IDYzICYmIGMgPCA5MSkKKyAgICAgIGMgKz0gMzI7CisgICAgaWYgKGMgPCBBUlJBWUJBU0UgfHwgYyA+IDEyMikKKyAgICAgIHJldHVybigtMSk7CisgICAgcmV0dXJuKGMgLSBBUlJBWUJBU0UpOworfQorCitzdGF0aWMgaW50CQkJCS8qIERlY2xhcmUgYW4gYXJyYXkgKi8KK2RvZGNsKGN4KSBpbnQgY3g7IHsKKyAgICBpbnQgaSwgbiwgdiwgbG8sIGhpLCByYyA9IDA7CisgICAgaW50IGlzZHluYW1pYyA9IDA7CisgICAgY2hhciB0bXBidWZbNjRdOworICAgIGNoYXIgKiogcCA9IE5VTEw7CisgICAgY2hhciB0bXBbNjRdOwkJCS8qIExvY2FsIHRlbXBvcmFyeSBzdHJpbmcgYnVmZmVyICovCisgICAgaWYgKCh5ID0gY21mbGQoIkFycmF5IG5hbWUiLCIiLCZzLE5VTEwpKSA8IDApIHsgLyogUGFyc2UgYXJyYXkgbmFtZSAqLworCWlmICh5ID09IC0zKSB7CisJICAgIHByaW50ZigiP0FycmF5IG5hbWUgcmVxdWlyZWRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0gZWxzZSByZXR1cm4oeSk7CisgICAgfQorICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKyAgICBzID0gbGluZTsKKyAgICB4ID0gYXJyYXlib3VuZHMocywmbG8sJmhpKTsJCS8qIENoZWNrIHN5bnRheCBhbmQgZ2V0IGJvdW5kcyAqLworICAgIGRlYnVnKEYxMTEsImRvZGNsIGFycmF5Ym91bmRzIixzLHgpOworICAgIGlmICh4IDwgMCkgewkJCS8qIEVycm9yIC0gTWF5YmUgaXQncyBhIHZhcmlhYmxlICovCisJY2hhciAqIHA7CQkJLyogd2hvc2UgdmFsdWUgaXMgYW4gYXJyYXkgbmFtZSAqLworCWludCBuOworCXAgPSB0bXBidWY7CisJbiA9IDYzOworCXBbMF0gPSBOVUw7CisJaWYgKHNbMF0gPT0gQ01EUSAmJiBzWzFdID09ICcmJykKKwkgIHMrKzsKKwlpZiAoenpzdHJpbmcocywmcCwmbikgPiAtMSkgeworCSAgICBzID0gdG1wYnVmOworCSAgICB4ID0gYXJyYXlib3VuZHMocywmbG8sJmhpKTsKKwkgICAgZGVidWcoRjExMSwiZG9kY2wgYXJyYXlib3VuZHMgMiIscyx4KTsKKwl9CisJaWYgKHggPCAwKSB7CisJICAgIHByaW50ZigiP0JhZCBhcnJheSBuYW1lIC0gXCIlc1wiXG4iLHMpOworCSAgICByZXR1cm4oLTkpOworCX0KKyAgICB9CisgICAgZGVidWcoRjEwMSwiZG9kY2wgaGkiLCIiLGhpKTsKKyAgICBkZWJ1ZyhGMTAxLCJkb2RjbCBsbyIsIiIsbG8pOworICAgIGRlYnVnKEYxMDEsImRvZGNsIGxvKzEiLCIiLGxvKzEpOworCisgICAgaWYgKGxvID09IC0xICYmIGhpID09IC0xKSB7CQkvKiBIYXZlIGdvb2QgYXJyYXkgbmFtZSBhbmQgYm91bmRzICovCisJaXNkeW5hbWljID0gMTsKKwluID0gQ01EQkwgLyA1OworICAgIH0gZWxzZSBpZiAoaGkgPiAtMSkgeworCXByaW50ZigiP1NlZ21lbnQgbm90YXRpb24gbm90IGFsbG93ZWQgaW4gYXJyYXkgZGVjbGFyYXRpb25zXG4iKTsKKwlyZXR1cm4oLTkpOworICAgIH0gZWxzZSBpZiAoKGxvKzEpIDwgMCkgeworCWRlYnVnKEYxMDEsImRvZGNsIHVuZGVyZmxvdyIsIiIsbG8rMSk7CisgICAgICAgIHByaW50ZigiP0RpbWVuc2lvbiB1bmRlcmZsb3dcbiIpOworICAgICAgICByZXR1cm4oLTkpOworICAgIH0gZWxzZQorICAgICAgbiA9IGxvOworICAgIHggPSBhcnJheWl0b2EoeCk7CisgICAgaWYgKGN4ID09IFhYVU5EQ0wpIHsKKwluID0gMDsKKwl2ID0gMDsKKwlpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisJICByZXR1cm4oeSk7CisgICAgfSBlbHNlIHsKKwlwID0gKGNoYXIgKiopbWFsbG9jKHNpemVvZihjaGFyICoqKSoobisxKSk7CisJaWYgKCFwKSB7CisJICAgIHByaW50ZigiP01lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisJdiA9IDA7CQkJCS8qIEhpZ2hlc3QgaW5pdGlhbGl6ZWQgbWVtYmVyICovCisJcFswXSA9IE5VTEw7CQkJLyogRWxlbWVudCAwICovCisJa2VlcGFsbGNoYXJzID0gMTsKKwl3aGlsZSAobiA+IDAgJiYgdiA8IG4pIHsJLyogUGFyc2UgaW5pdGlhbGl6ZXJzICovCisJICAgIHBbdisxXSA9IE5VTEw7CisJICAgIGNrbWFreG1zZyh0bXAsCisJCSAgICAgIDY0LAorCQkgICAgICAiSW5pdGlhbCB2YWx1ZSBmb3IgXFwmIiwKKwkJICAgICAgY2tjdG9hKChjaGFyKXgpLAorCQkgICAgICAiWyIsCisJCSAgICAgIGNraXRvYSh2KzEpLAorCQkgICAgICAiXSIsCisJCSAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwKKwkJICAgICAgKTsKKwkgICAgaWYgKChyYyA9IGNtZmxkKChjaGFyICopdG1wLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7IC8qIEdldCBmaWVsZCAqLworCQlpZiAocmMgPT0gLTMpCQkvKiBJZiBhbnN3ZXIgaXMgZW1wdHksIHdlJ3JlIGRvbmUgKi8KKwkJICBicmVhazsKKwkJZWxzZQkJCS8qIFBhcnNlIGVycm9yLCBmcmVlIHRlbXAgcG9pbnRlcnMgKi8KKwkJICBnb3RvIGRjbHg7CisJICAgIH0KKwkgICAgcmMgPSAxOworCSAgICBpZiAodiA9PSAwICYmICFzdHJjbXAocywiPSIpKSAvKiBTa2lwIHRoZSA9IHNpZ24uICovCisJICAgICAgY29udGludWU7CisJICAgIHMgPSBicnN0cmlwKHMpOwkJLyogU3RyaXAgYW55IGJyYWNlcyAqLworCSAgICBtYWtlc3RyKCYocFsrK3ZdKSxzKTsKKwl9CisJa2VlcGFsbGNoYXJzID0gMDsKKwlpZiAoKHkgPSBjbXR4dCgiQ2FycmlhZ2UgcmV0dXJuIHRvIGNvbmZpcm0iLCIiLCZzLE5VTEwpKSA8IDApCisJICByZXR1cm4oeSk7CisJaWYgKGlzZHluYW1pYykKKwkgIG4gPSB2OworICAgIH0KKyAgICBpZiAoZGNsYXJyYXkoKGNoYXIpeCxuKSA8IDApIHsJLyogRGVjbGFyZSB0aGUgYXJyYXkgKi8KKwlwcmludGYoIj9EZWNsYXJlIGZhaWxlZFxuIik7CisJZ290byBkY2x4OworICAgIH0KKyAgICBmb3IgKGkgPSAxOyBpIDw9IHY7IGkrKykgewkJLyogQWRkIGFueSBpbml0aWFsIHZhbHVlcyAqLworCXRtcFswXSA9ICcmJzsKKwlja21ha21zZygmdG1wWzFdLDYzLGNrY3RvYSgoY2hhcil4KSwiWyIsY2tpdG9hKGkpLCJdIik7CisJaWYgKGFkZG1hYyh0bXAscFtpXSkgPCAwKSB7CisJICAgIHByaW50ZigiQXJyYXkgaW5pdGlhbGl6YXRpb24gZXJyb3I6ICVzICVzXG4iLHRtcCxwW2ldKTsKKwkgICAgcmMgPSAtOTsKKwkgICAgZ290byBkY2x4OworCX0KKyAgICB9CisgIGRjbHg6CisgICAgaWYgKHApIHsKKwlmb3IgKGkgPSAxOyBpIDw9IHY7IGkrKykKKwkgIGlmIChwW2ldKSBmcmVlKHBbaV0pOworCWZyZWUoKGNoYXIgKilwKTsKKyAgICB9CisgICAgZGVidWcoRjEwMSwiRENMIHJjIiwiIixyYyk7CisgICAgcmV0dXJuKHN1Y2Nlc3MgPSByYyk7Cit9CisKK3N0YXRpYyBpbnQKK3JzemFycmF5KCkgeworICAgIGludCBpLCB4LCB5LCBuLCBsbywgaGksIGlzbGluayA9IC0xOworICAgIGNoYXIgYywgKiBzLCAqKiBhcCA9IE5VTEw7CisgICAgaWYgKCh4ID0gY21mbGQoIkFycmF5IG5hbWUiLCIiLCZzLE5VTEwpKSA8IDApIHsgLyogUGFyc2UgYXJyYXkgbmFtZSAqLworCWlmICh4ID09IC0zKSB7CisJICAgIHByaW50ZigiP0FycmF5IG5hbWUgcmVxdWlyZWRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0gZWxzZSByZXR1cm4oeCk7CisgICAgfQorICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsJLyogTWFrZSBzYWZlIGNvcHkgb2YgbmFtZSAqLworICAgIHMgPSBsaW5lOworICAgIHggPSBhcnJheWJvdW5kcyhzLCZsbywmaGkpOworICAgIGlmICh4IDwgMCkgewkJCS8qIFBhcnNlIHRoZSBuYW1lLCBnZXQgaW5kZXggKi8KKwlwcmludGYoIj9CYWQgYXJyYXkgcmVmZXJlbmNlIC0gXCIlc1wiXG4iLCBzKTsKKwlyZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAobG8gPCAwICYmIGhpIDwgMCkgeworCXkgPSBjbW51bSgiTmV3IHNpemUiLCIiLDEwLCZsbyx4eHN0cmluZyk7CisJaWYgKHkgPCAwKSB7CisJICAgIGlmICh5ID09IC0zKQorCSAgICAgIHByaW50ZigiP05ldyBzaXplIHJlcXVpcmVkXG4iKTsKKwkgICAgcmV0dXJuKHkpOworCX0KKyAgICB9CisgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHkpOworICAgIGlmIChhX2xpbmtbeF0gPiAtMSkgewkJLyogTGluaz8gKi8KKwlpc2xpbmsgPSB4OwkJCS8qIFllcyBmb2xsb3cgaXQgKi8KKwl4ID0gYV9saW5rW3hdOwkJCS8qIGFuZCByZW1lbWJlciAqLworICAgIH0KKyAgICBpZiAoIWFfcHRyW3hdKSB7CisJcHJpbnRmKCI/QXJyYXkgbm90IGRlY2xhcmVkIC0gXCIlc1wiXG4iLCBzKTsKKwlyZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAobG8gPCAwKSB7CisJcHJpbnRmKCI/TmV3IHNpemUgcmVxdWlyZWRcbiIpOworCXJldHVybigtOSk7CisgICAgfQorICAgIGlmIChoaSA+IC0xKSB7CisJcHJpbnRmKCI/QXJyYXkgc2VnbWVudHMgbm90IGFsbG93ZWQgZm9yIHRoaXMgb3BlcmF0aW9uXG4iKTsKKwlyZXR1cm4oLTkpOworICAgIH0KKyAgICBjID0gYXJyYXlpdG9hKHgpOwkJCS8qIEdldCBhcnJheSBsZXR0ZXIgKi8KKyAgICBpZiAoYyA9PSAnQCcpIHsJCQkvKiBBcmd1bWVudCB2ZWN0b3IgYXJyYXkgb2ZmIGxpbWl0cyAqLworCXByaW50ZigiP1NvcnJ5LCBcXCZAW10gaXMgcmVhZC1vbmx5XG4iKTsKKwlyZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAobG8gPT0gMCkgewkJCS8qIElmIG5ldyBzaXplIGlzIDAuLi4gKi8KKwlkY2xhcnJheShjLDApOwkJCS8qIFVuZGVjbGFyZSB0aGUgYXJyYXkgKi8KKwlyZXR1cm4oc3VjY2VzcyA9IDEpOworICAgIH0KKyAgICBuID0gYV9kaW1beF07CQkJLyogQ3VycmVudCBzaXplICovCisgICAgYXAgPSAoY2hhciAqKikgbWFsbG9jKChsbysxKSAqIHNpemVvZihjaGFyICopKTsgLyogTmV3IGFycmF5ICovCisgICAgeSA9IChuIDwgbG8pID8gbiA6IGxvOworICAgIGZvciAoaSA9IDA7IGkgPD0geTsgaSsrKQkJLyogQ29weSB0aGUgcGFydCB0aGF0IGZpdHMgKi8KKyAgICAgIGFwW2ldID0gYV9wdHJbeF1baV07CisgICAgaWYgKG4gPCBsbykgewkJCS8qIElmIG9yaWdpbmFsIGFycmF5IHNtYWxsZXIgKi8KKwlmb3IgKDsgaSA8PSBsbzsgaSsrKQkJLyogaW5pdGlhbGl6ZSBleHRyYSBlbGVtZW50cyBpbiAqLworCSAgYXBbaV0gPSBOVUxMOwkJCS8qIG5ldyBhcnJheSB0byBOVUxMLiAqLworICAgIH0gZWxzZSBpZiAobiA+IGxvKSB7CQkvKiBJZiBuZXcgYXJyYXkgc21hbGxlciAqLworCWZvciAoOyBpIDw9IGxvOyBpKyspCQkvKiBkZWFsbG9jYXRlIGxlZnRvdmVyIGVsZW1lbnRzICovCisJICBtYWtlc3RyKCYoYV9wdHJbeF1baV0pLE5VTEwpOwkvKiBmcm9tIG9yaWdpbmFsIGFycmF5LiAqLworICAgIH0KKyAgICBmcmVlKChjaGFyICopYV9wdHJbeF0pOwkJLyogRnJlZSBvcmlnaW5hbCBhcnJheSBsaXN0ICovCisgICAgYV9wdHJbeF0gPSBhcDsJCQkvKiBSZXBsYWNlIHdpdGggbmV3IG9uZSAqLworICAgIGFfZGltW3hdID0gbG87CQkJLyogUmVjb3JkIHRoZSBuZXcgZGltZW5zaW9uICovCisgICAgaWYgKGlzbGluayA+IC0xKSB7CQkJLyogV2FzIHRoaXMgYSBsaW5rPyAqLworCWFfcHRyW2lzbGlua10gPSBhcDsJCS8qIElmIHNvIHBvaW50IHRvIHRoZSByZXNpemVkIGFycmF5ICovCisJYV9kaW1baXNsaW5rXSA9IGxvOworICAgIH0gZWxzZSB7CQkJCS8qIElmIG5vdCBhcmUgdGhlcmUgbGlua3MgdG8gaGVyZT8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgKGludCkgJ3onIC0gQVJSQVlCQVNFOyBpKyspIHsgLyogQW55IGxpbmtlZCBhcnJheXM/ICovCisJICAgIGlmIChpICE9IHggJiYgYV9saW5rW2ldID09IHgpIHsgICAgIC8qIEZpbmQgYW5kIHVwZGF0ZSB0aGVtICovCisJCWFfcHRyW2ldID0gYXA7CisJCWFfZGltW2ldID0gbG87CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybihzdWNjZXNzID0gMSk7Cit9CisKK3N0YXRpYyBpbnQKK2NvcHlhcnJheSgpIHsKKyAgICBpbnQgaSwgaiwgeDEsIGxvMSwgaGkxLCB4MiwgbG8yLCBoaTIsIHdob2xlID0gMDsKKyAgICBjaGFyIGMxLCBjMiwgKiBhMSwgKiBhMjsKKyAgICBpZiAoKHkgPSBjbWZsZCgiTmFtZSBvZiBzb3VyY2UgYXJyYXkiLCIiLCZzLE5VTEwpKSA8IDApCisgICAgICByZXR1cm4oeSk7CisgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworICAgIGExID0gbGluZTsKKyAgICBpZiAoKHgxID0gYXJyYXlib3VuZHMoYTEsJmxvMSwmaGkxKSkgPCAwKSB7CisJcHJpbnRmKCI/QmFkIGFycmF5IHJlZmVyZW5jZSAtIFwiJXNcIlxuIiwgYTEpOworCXJldHVybigtOSk7CisgICAgfSBlbHNlIGlmICghYV9wdHJbeDFdKSB7CisJcHJpbnRmKCI/QXJyYXkgbm90IGRlY2xhcmVkIC0gXCIlc1wiXG4iLCBhMSk7CisJcmV0dXJuKC05KTsKKyAgICB9CisgICAgYzEgPSBhcnJheWl0b2EoeDEpOworCisgICAgaWYgKCh5ID0gY21mbGQoIk5hbWUgb2YgZGVzdGluYXRpb24gYXJyYXkiLCIiLCZzLE5VTEwpKSA8IDApCisgICAgICByZXR1cm4oeSk7CisgICAgY2tzdHJuY3B5KHRtcGJ1ZixzLFRNUEJVRlNJWik7CisgICAgYTIgPSB0bXBidWY7CisgICAgaWYgKCh4MiA9IGFycmF5Ym91bmRzKGEyLCZsbzIsJmhpMikpIDwgMCkgeworCXByaW50ZigiP0JhZCBhcnJheSByZWZlcmVuY2UgLSBcIiVzXCJcbiIsIGEyKTsKKwlyZXR1cm4oLTkpOworICAgIH0KKyAgICBjMiA9IGFycmF5aXRvYSh4Mik7CisKKyAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisKKyAgICBpZiAoYzIgPT0gJ0AnKSB7CQkJLyogQXJndW1lbnQgdmVjdG9yIGFycmF5IG9mZiBsaW1pdHMgKi8KKwlwcmludGYoIj9Tb3JyeSwgXFwmQFtdIGlzIHJlYWQtb25seVxuIik7CisJcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKGxvMSA8IDAgJiYgbG8yIDwgMCAmJiBoaTEgPCAwICYmIGhpMiA8IDApIC8qIFNwZWNpYWwgY2FzZSBmb3IgKi8KKyAgICAgIHdob2xlID0gMTsJCQkgICAgICAgICAgLyogd2hvbGUgYXJyYXkuLi4gKi8KKworICAgIGlmIChsbzEgPCAwKSBsbzEgPSB3aG9sZSA/IDAgOiAxOwkvKiBTdXBwbHkgbG93ZXIgYm91bmQgb2Ygc291cmNlICovCisgICAgaWYgKGhpMSA8IDApIGhpMSA9IGFfZGltW3gxXTsJLyogU3VwcGx5IHVwcGVyIGJvdW5kIG9mIHNvdXJjZSAqLworICAgIGlmIChsbzIgPCAwKSBsbzIgPSB3aG9sZSA/IDAgOiAxOwkvKiBMb3dlciBib3VuZCBvZiB0YXJnZXQgKi8KKyAgICBpZiAoaGkyIDwgMCkgaGkyID0gbG8yICsgaGkxIC0gbG8xOwkvKiBVcHBlciBib3VuZCBvZiB0YXJnZXQgKi8KKyAgICBpZiAoYV9wdHJbeDJdKSB7CQkJLyogVGFyZ2V0IGFycmF5IGlzIGFscmVhZHkgZGVjbGFyZWQ/ICovCisJaWYgKGhpMiA+IGFfZGltW3gyXSkJCS8qIElmIHVwcGVyIGJvdW5kIG91dCBvZiByYW5nZSAqLworCSAgaGkyID0gYV9kaW1beDJdOwkJLyogc2hyaW5rIHRvIGZpdCAqLworICAgIH0gZWxzZSB7CQkJCS8qIE90aGVyd2lzZS4uLiAqLworCXgyID0gZGNsYXJyYXkoYzIsIGhpMik7CQkvKiBkZWNsYXJlIHRoZSB0YXJnZXQgYXJyYXkgKi8KKyAgICB9CisgICAgZm9yIChpID0gbG8xLCBqID0gbG8yOyBpIDw9IGhpMSAmJiBqIDw9IGhpMjsgaSsrLGorKykgeyAvKiBDb3B5ICovCisJbWFrZXN0cigmKGFfcHRyW3gyXVtqXSksYV9wdHJbeDFdW2ldKTsKKyAgICB9CisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKK30KKworc3RhdGljIGludAkJCQkvKiBVbmRlY2xhcmUgYW4gYXJyYXkgKi8KK3VuYXJyYXkoKSB7CisgICAgaW50IHgsIHksIG4sIHJjID0gMDsKKyAgICBjaGFyIGMsICogczsKKworICAgIGlmICgoeSA9IGNtZmxkKCJBcnJheSBuYW1lIiwiIiwmcyxOVUxMKSkgPCAwKSB7IC8qIFBhcnNlIGFycmF5IG5hbWUgKi8KKwlpZiAoeSA9PSAtMykgeworCSAgICBwcmludGYoIj9BcnJheSBuYW1lIHJlcXVpcmVkXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9IGVsc2UgcmV0dXJuKHkpOworICAgIH0KKyAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CS8qIE1ha2Ugc2FmZSBjb3B5IG9mIG5hbWUgKi8KKyAgICBzID0gbGluZTsKKyAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApCisgICAgICByZXR1cm4oeSk7CisgICAgaWYgKCh4ID0gYXJyYXlib3VuZHMocywmeSwmbikpIDwgMCkgeyAvKiBQYXJzZSB0aGUgbmFtZSwgZ2V0IGluZGV4ICovCisJcHJpbnRmKCI/QmFkIGFycmF5IHJlZmVyZW5jZSAtIFwiJXNcIlxuIiwgcyk7CisJcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKHkgPiAwIHx8IG4gPiAwKSB7CisJcHJpbnRmKCI/UGFydGlhbCBhcnJheXMgY2FuIG5vdCBiZSBkZXN0cm95ZWRcbiIpOworCXJldHVybigtOSk7CisgICAgfQorICAgIGMgPSBhcnJheWl0b2EoeCk7CQkJLyogR2V0IGFycmF5IGxldHRlciAqLworICAgIGlmIChhX3B0clt4XSkgewkJCS8qIElmIGFycmF5IGlzIGRlY2xhcmVkICovCisJaWYgKGMgPT0gJ0AnKSB7CQkJLyogQXJndW1lbnQgdmVjdG9yIGFycmF5IG9mZiBsaW1pdHMgKi8KKwkgICAgcHJpbnRmKCI/U29ycnksIFxcJkBbXSBpcyByZWFkLW9ubHlcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKwlyYyA9IGRjbGFycmF5KGMsMCk7CQkvKiBVbmRlY2xhcmUgdGhlIGFycmF5ICovCisgICAgfSBlbHNlCQkJCS8qIEl0IHdhc24ndCBkZWNsYXJlZCAqLworICAgICAgcmMgPSAxOworICAgIGlmIChyYyA+IC0xKSB7CQkJLyogU2V0IHJldHVybiBjb2RlIGFuZCBzdWNjZXNzICovCisJc3VjY2VzcyA9IDE7CisJcmMgPSAxOworICAgIH0gZWxzZSB7CisJc3VjY2VzcyA9IDA7CisJcHJpbnRmKCI/RmFpbGVkIC0gZGVzdHJveSBcIlxcJiVjW11cIlxuIiwgYyk7CisJcmMgPSAtOTsKKyAgICB9CisgICAgcmV0dXJuKHJjKTsKK30KKworc3RhdGljIGludAorY2xyYXJyYXkoY3gpIGludCBjeDsgeworICAgIGludCBpLCB4LCBsbywgaGk7CisgICAgY2hhciBjLCAqIHMsICogdmFsID0gTlVMTDsKKworICAgIGlmICgoeCA9IGNtZmxkKCJBcnJheSBuYW1lIiwiIiwmcyxOVUxMKSkgPCAwKSB7IC8qIFBhcnNlIGFycmF5IG5hbWUgKi8KKwlpZiAoeCA9PSAtMykgeworCSAgICBwcmludGYoIj9BcnJheSBuYW1lIHJlcXVpcmVkXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9IGVsc2UgcmV0dXJuKHgpOworICAgIH0KKyAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CS8qIE1ha2Ugc2FmZSBjb3B5IG9mIG5hbWUgKi8KKyAgICBzID0gbGluZTsKKyAgICBpZiAoY3ggPT0gQVJSX1NFVCkgewkJLyogU0VUICovCisJaWYgKCh4ID0gY210eHQoIlZhbHVlIiwiIiwmdmFsLHh4c3RyaW5nKSkgPCAwKQorCSAgcmV0dXJuKHgpOworCWNrc3RybmNweSh0bXBidWYsdmFsLFRNUEJVRlNJWik7IC8qIFZhbHVlIHRvIHNldCAqLworCXZhbCA9IHRtcGJ1ZjsKKwlpZiAoISp2YWwpIHZhbCA9IE5VTEw7CisgICAgfSBlbHNlIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkJLyogQ0xFQVIgKi8KKyAgICAgIHJldHVybih4KTsKKworICAgIGlmICgoeCA9IGFycmF5Ym91bmRzKHMsJmxvLCZoaSkpIDwgMCkgeyAvKiBQYXJzZSB0aGUgbmFtZSAqLworCXByaW50ZigiP0JhZCBhcnJheSByZWZlcmVuY2UgLSBcIiVzXCJcbiIsIHMpOworCXJldHVybigtOSk7CisgICAgfQorICAgIGMgPSBhcnJheWl0b2EoeCk7CQkJLyogR2V0IGFycmF5IGxldHRlciAqLworICAgIGlmICghYV9wdHJbeF0pIHsJCQkvKiBJZiBhcnJheSBpcyBkZWNsYXJlZCAqLworCXByaW50ZigiP0FycmF5ICVzIGlzIG5vdCBkZWNsYXJlZFxuIiwgcyk7CisJcmV0dXJuKC05KTsKKyAgICB9IGVsc2UgaWYgKGMgPT0gJ0AnKSB7CQkvKiBBcmd1bWVudCB2ZWN0b3IgYXJyYXkgb2ZmIGxpbWl0cyAqLworCXByaW50ZigiP1NvcnJ5LCBcXCZAW10gaXMgcmVhZC1vbmx5XG4iKTsKKwlyZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAobG8gPCAwKSBsbyA9IDA7CisgICAgaWYgKGhpIDwgMCkgaGkgPSBhX2RpbVt4XTsKKyAgICBmb3IgKGkgPSBsbzsgaSA8PSBoaTsgaSsrKQkJLyogQ2xlYXIvU2V0IHNlbGVjdGVkIHJhbmdlICovCisgICAgICBtYWtlc3RyKCYoYV9wdHJbeF1baV0pLHZhbCk7CisKKyAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworfQorCitleHRlcm4gY2hhciAqKmFhX3B0cltDTURTVEtMXVsyOF07CitleHRlcm4gaW50IGFhX2RpbVtDTURTVEtMXVsyOF07CisKK3N0YXRpYyBpbnQJCQkJLyogQ3JlYXRlIHN5bWJvbGljIGxpbmsgdG8gYW4gYXJyYXkgKi8KK2xpbmthcnJheSgpIHsKKyAgICBpbnQgaSA9IDAsIHgsIHksIGxvLCBoaSwgZmxhZyA9IDA7CisgICAgY2hhciBjLCAqIHMsICogcDsKKworICAgIGlmICgoeCA9IGNtZmxkKCJBcnJheSBuYW1lIG5vdCBjdXJyZW50bHkgaW4gdXNlIiwiIiwmcyxOVUxMKSkgPCAwKSB7CisJaWYgKHggPT0gLTMpIHsKKwkgICAgcHJpbnRmKCI/QXJyYXkgbmFtZSByZXF1aXJlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfSBlbHNlIHJldHVybih4KTsKKyAgICB9CisgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOwkvKiBNYWtlIHNhZmUgY29weSBvZiBsaW5rIG5hbWUgKi8KKyAgICBzID0gbGluZTsKKyAgICBpZiAoKHggPSBjbWZsZCgiTmFtZSBvZiBleGlzdGluZyBhcnJheSIsIiIsJnAseHhzdHJpbmcpKSA8IDApIHsKKwlpZiAoeCA9PSAtMykgeworCSAgICBwcmludGYoIj9BcnJheSBuYW1lIHJlcXVpcmVkXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9IGVsc2UgcmV0dXJuKHgpOworICAgIH0KKyAgICBja3N0cm5jcHkodG1wYnVmLHAsVE1QQlVGU0laKTsJLyogTWFrZSBzYWZlIGNvcHkgb2YgYXJyYXkgbmFtZSAqLworICAgIHAgPSB0bXBidWY7CisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworCisgICAgaWYgKCh4ID0gYXJyYXlib3VuZHMocywmbG8sJmhpKSkgPCAwKSB7IC8qIFBhcnNlIHRoZSBsaW5rIG5hbWUgKi8KKwlwcmludGYoIj9CYWQgYXJyYXkgcmVmZXJlbmNlIC0gXCIlc1wiXG4iLCBzKTsKKwlyZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAoYV9wdHJbeF0pIHsJCQkvKiBNdXN0IG5vdCBhbHJlYWR5IGV4aXN0ICovCisJYyA9IGFycmF5aXRvYSh4KTsKKwlwcmludGYoIj9BcnJheSBhbHJlYWR5IGV4aXN0czogXFwmJWNbXVxuIiwgYyk7CisJcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKGxvID4gLTEgfHwgaGkgPiAtMSkgeworCXByaW50ZigiP1NvcnJ5LCB3aG9sZSBhcnJheXMgb25seTogJXNcbiIscyk7CisJcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKCh5ID0gYXJyYXlib3VuZHMocCwmbG8sJmhpKSkgPCAwKSB7IC8qIFBhcnNlIHRoZSBhcnJheSBuYW1lICovCisJcHJpbnRmKCI/QmFkIGFycmF5IHJlZmVyZW5jZSAtIFwiJXNcIlxuIiwgcyk7CisJcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKGxvID4gLTEgfHwgaGkgPiAtMSkgeworCXByaW50ZigiP1NvcnJ5LCB3aG9sZSBhcnJheXMgb25seTogJXNcbiIscCk7CisJcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKHggPT0geSkgeworCWZvciAoaSA9IGNtZGx2bDsgaSA+PSAwOyBpLS0pCisJICBpZiAoYWFfcHRyW2ldW3hdKSB7CisJICAgICAgZmxhZysrOworCSAgICAgIGJyZWFrOworCSAgfQorICAgIH0KKyAgICBpZiAoZmxhZykgeworCWFfcHRyW3hdID0gYWFfcHRyW2ldW3ldOwkvKiBMaW5rIHRvIHNhdmVkIGNvcHkgKi8KKwlhX2RpbVt4XSA9IGFhX2RpbVtpXVt5XTsKKyAgICB9IGVsc2UgewkJCQkvKiBPdGhlcndpc2UuLi4gKi8KKwljID0gYXJyYXlpdG9hKHkpOwkJLyogQ2hlY2sgaWYgaXQncyBkZWNsYXJlZCAqLworCWlmICghYV9wdHJbeV0pIHsKKwkgICAgcHJpbnRmKCI/QXJyYXkgaXMgbm90IGRlY2xhcmVkOiBcXCYlY1tdXG4iLCBjKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisJaWYgKGFfbGlua1t5XSA+IC0xKSB7CQkvKiBBbmQgaWYgaXQncyBhIGxpbmsgaXRzZWxmICovCisJICAgIHByaW50ZigiP0xpbmtzIHRvIGxpbmtzIG5vdCBhbGxvd2VkOiBcXCYlY1tdXG4iLCBjKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisJYV9wdHJbeF0gPSBhX3B0clt5XTsJCS8qIEFsbCBPSywgbWFrZSB0aGUgbGluayAqLworCWFfZGltW3hdID0gYV9kaW1beV07CisgICAgfQorICAgIGFfbGlua1t4XSA9IHk7CisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PQ1NFVFMKK3N0YXRpYyBjaGFyICogZGNzZXRuYW1lID0gTlVMTDsKKworLyogR2V0IERpc3BsYXkgQ2hhcmFjdGVyLVNldCBOYW1lICovCisKK2NoYXIgKgorZ2V0ZGNzZXQoKSB7CisgICAgY2hhciAqIHM7CisgICAgaW50IHk7CisjaWZkZWYgUENGT05UUworICAgIGV4dGVybiBpbnQgdHRfZm9udCwgbnRlcm1mb250OworICAgIGV4dGVybiBzdHJ1Y3Qga2V5dGFiIHRlcm1fZm9udFtdOworI2VuZGlmIC8qIFBDRk9OVFMgKi8KKworICAgIHMgPSAiIjsKKyNpZmRlZiBPUzIKKyAgICB5ID0gb3MyZ2V0Y3AoKTsJCQkvKiBEZWZhdWx0IGlzIGN1cnJlbnQgY29kZSBwYWdlICovCisgICAgc3dpdGNoICh5KSB7CisgICAgICBjYXNlIDQzNzogcyA9ICJjcDQzNyI7IGJyZWFrOworICAgICAgY2FzZSA4NTA6IHMgPSAiY3A4NTAiOyBicmVhazsKKyAgICAgIGNhc2UgODUyOiBzID0gImNwODUyIjsgYnJlYWs7CisgICAgICBjYXNlIDg1NzogcyA9ICJjcDg1NyI7IGJyZWFrOworICAgICAgY2FzZSA4NTg6IHMgPSAiY3A4NTgiOyBicmVhazsKKyAgICAgIGNhc2UgODYyOiBzID0gImNwODYyIjsgYnJlYWs7CisgICAgICBjYXNlIDg2NjogcyA9ICJjcDg2NiI7IGJyZWFrOworICAgICAgY2FzZSA4Njk6IHMgPSAiY3A4NjkiOyBicmVhazsKKyAgICAgIGNhc2UgMTI1MDogcyA9ICJjcDEyNTAiOyBicmVhazsKKyAgICAgIGNhc2UgMTI1MTogcyA9ICJjcDEyNTEiOyBicmVhazsKKyAgICAgIGNhc2UgMTI1MjogcyA9ICJjcDEyNTIiOyBicmVhazsKKyAgICAgIGNhc2UgMTI1MzogcyA9ICJjcDEyNTMiOyBicmVhazsKKyAgICAgIGNhc2UgMTI1NDogcyA9ICJjcDEyNTQiOyBicmVhazsKKyAgICAgIGNhc2UgMTI1NTogcyA9ICJjcDEyNTUiOyBicmVhazsKKyAgICAgIGNhc2UgMTI1NjogcyA9ICJjcDEyNTYiOyBicmVhazsKKyAgICAgIGNhc2UgMTI1NzogcyA9ICJjcDEyNTciOyBicmVhazsKKyAgICAgIGNhc2UgMTI1ODogcyA9ICJjcDEyNTgiOyBicmVhazsKKyAgICB9CisjaWZkZWYgUENGT05UUworLyoKKyAgIElmIHRoZSB1c2VyIGhhcyBsb2FkZWQgYSBmb250IHdpdGggU0VUIFRFUk1JTkFMIEZPTlQgdGhlbiB3ZSB3YW50CisgICB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgY29kZSBwYWdlIHRvIHRoZSBmb250IHRoYXQgd2FzIGxvYWRlZC4KKyovCisgICAgaWYgKHR0X2ZvbnQgIT0gVFRGX1JPTSkgeworCWZvciAoeSA9IDA7IHkgPCBudGVybWZvbnQ7IHkrKyApIHsKKwkgICAgaWYgKHRlcm1fZm9udFt5XS5rd3ZhbCA9PSB0dF9mb250KSB7CisJCXMgPSB0ZXJtX2ZvbnRbeV0ua3dkOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYgLyogUENGT05UUyAqLworI2Vsc2UgLyogT1MyICovCisjaWZkZWYgQ09NTUVOVAorICAgIC8qIEhhY2sgbm90IG5lZWRlZCBhcyBvZiBDLUtlcm1pdCA3LjEgKi8KKyAgICBpZiAoZmNoYXJzZXQgPT0gRkNfMUxBVElOKSB7CisJcyA9ICJsYXRpbjEtaXNvIjsJCS8qIEhhY2sgdG8gYXZvaWQgcmVwb3J0aW5nICJjcDEyNTIiICovCisgICAgfSBlbHNlIHsJCQkJLyogUmVwb3J0IGN1cnJlbnQgZmlsZSBjaGFyYWN0ZXIgc2V0ICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCWZvciAoeSA9IDA7IHkgPD0gbmZpbGM7IHkrKykKKwkgIGlmIChmY3N0YWJbeV0ua3d2YWwgPT0gZmNoYXJzZXQpIHsKKwkgICAgICBzID0gZmNzdGFiW3ldLmt3ZDsKKwkgICAgICBicmVhazsKKwkgIH0KKyNpZmRlZiBDT01NRU5UCisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBtYWtlc3RyKCZkY3NldG5hbWUscyk7CQkvKiBSZXR1cm4gc3RhYmxlIHBvaW50ZXIgKi8KKyAgICByZXR1cm4oKGNoYXIgKilkY3NldG5hbWUpOworfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmbmRlZiBOT0ZSSUxMUworc3RhdGljIGludAorZG9jbGVhcigpIHsKKyAgICBpZiAoKHggPSBjbWtleShjbHJ0YWIsbmNsZWFyLCJpdGVtIHRvIGNsZWFyIiwKKyNpZmRlZiBOT1NQTAorCQkgICAiZGV2aWNlLWJ1ZmZlciIKKyNlbHNlCisJCSAgICJkZXZpY2UtYW5kLWlucHV0IgorI2VuZGlmIC8qIE5PU1BMICovCisJCSAgICx4eHN0cmluZykpIDwgMCkgcmV0dXJuKHgpOworI2lmbmRlZiBOT1NQTAorI2lmZGVmIE9TMgorICAgIGlmICh4ID09IENMUl9DTUQgfHwgeCA9PSBDTFJfVFJNKSB7CisJaWYgKCh6ID0gY21rZXkoY2xyY21kdGFiLG5jbHJjbWQsImhvdyBtdWNoIHNjcmVlbiB0byBjbGVhclxuIiwKKwkJICAgICAgICJhbGwiLHh4c3RyaW5nKSkgPCAwKQorCSAgcmV0dXJuKHopOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKyAgICAgIHJldHVybih5KTsKKworICAgIC8qIENsZWFyIGRldmljZSBpbnB1dCBidWZmZXIgaWYgcmVxdWVzdGVkICovCisgICAgeSA9ICh4ICYgQ0xSX0RFVikgPyB0dGZsdWkoKSA6IDA7CisKKyAgICBpZiAoeCAmIENMUl9TQ1IpCQkJLyogQ0xFQVIgU0NSRUVOICovCisgICAgICB5ID0gY2tfY2xzKCk7CQkJLyogKD0gU0NSRUVOIENMRUFSID0gQ0xTKSAqLworCisgICAgaWYgKHggJiBDTFJfS0JEKSB7CQkJLyogQ0xFQVIgS0VZQk9BUkQgKi8KKwlpbnQgbjsKKwluID0gY29uY2hrKCk7CisJeSA9IDA7CisJd2hpbGUgKG4tLSA+IDAgJiYgKHkgPSBjb25pbmMoMCkgPiAtMSkpCisJICA7CisJeSA9ICh5ID4gLTEpID8gMCA6IC0xOworICAgIH0KKworI2lmbmRlZiBOT1NQTAorICAgIC8qIENsZWFyIElOUFVUIGNvbW1hbmQgYnVmZmVyIGlmIHJlcXVlc3RlZCAqLworICAgIGlmICh4ICYgQ0xSX0lOUCkgeworCWZvciAoeiA9IDA7IHogPCBpbmJ1ZnNpemU7IHorKykKKwkgIGlucGJ1Zlt6XSA9IE5VTDsKKwlpbnBicCA9IGlucGJ1ZjsKKwl5ID0gMDsKKyAgICB9CisjaWZkZWYgQ0tfQVBDCisgICAgaWYgKHggJiBDTFJfQVBDKSB7CisJZGVidWcoRjEwMSwiRXhlY3V0aW5nIENMRUFSIEFQQyIsIiIsYXBjYWN0aXZlKTsKKwlhcGNhY3RpdmUgPSAwOworCXkgPSAwOworICAgIH0KKyNlbmRpZiAvKiBDS19BUEMgKi8KKyAgICBpZiAoeCAmIENMUl9BTFIpIHsKKwlzZXRhbGFybSgwTCk7CisJeSA9IDA7CisgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBQQVRURVJOUworICAgIGlmICh4ICYgKENMUl9UWFR8Q0xSX0JJTikpIHsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgRlRQQVRURVJOUzsgaSsrKSB7CisJICAgIGlmICh4ICYgQ0xSX1RYVCkKKwkgICAgICBtYWtlc3RyKCZ0eHRwYXR0ZXJuc1tpXSxOVUxMKTsKKwkgICAgaWYgKHggJiBDTFJfQklOKQorCSAgICAgIG1ha2VzdHIoJmJpbnBhdHRlcm5zW2ldLE5VTEwpOworCX0KKwl5ID0gMDsKKyAgICB9CisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKworI2lmbmRlZiBOT0RJQUwKKyAgICBpZiAoeCAmIENMUl9ESUEpIHsKKwlkaWFsc3RhID0gRElBX1VOSzsKKwl5ID0gMDsKKyAgICB9CisjZW5kaWYgLyogTk9ESUFMICovCisKKyNpZm5kZWYgTk9NU0VORAorICAgIGlmICh4ICYgQ0xSX1NGTCkgewkJCS8qIENMRUFSIFNFTkQtTElTVCAqLworCWlmIChmaWxlaGVhZCkgeworCSAgICBzdHJ1Y3QgZmlsZWxpc3QgKiBmbHAsICogbmV4dDsKKwkgICAgZmxwID0gZmlsZWhlYWQ7CisJICAgIHdoaWxlIChmbHApIHsKKwkJaWYgKGZscC0+ZmxfbmFtZSkKKwkJICBmcmVlKGZscC0+ZmxfbmFtZSk7CisJCWlmIChmbHAtPmZsX2FsaWFzKQorCQkgIGZyZWUoZmxwLT5mbF9hbGlhcyk7CisJCW5leHQgPSBmbHAtPmZsX25leHQ7CisJCWZyZWUoKGNoYXIgKilmbHApOworCQlmbHAgPSBuZXh0OworCSAgICB9CisJfQorCWZpbGVzaW5saXN0ID0gMDsKKwlmaWxlaGVhZCA9IE5VTEw7CisJZmlsZXRhaWwgPSBOVUxMOworCWFkZGxpc3QgPSAwOworCXkgPSAwOworICAgIH0KKyNlbmRpZiAvKiBOT01TRU5EICovCisKKyNpZmRlZiBPUzIKKyNpZm5kZWYgTk9MT0NBTAorICAgIHN3aXRjaCAoeCkgeworICAgICAgY2FzZSBDTFJfU0NMOgorCWNsZWFyc2Nyb2xsYmFjayhWVEVSTSk7CisJYnJlYWs7CisgICAgICBjYXNlIENMUl9DTUQ6CisJc3dpdGNoICggeiApIHsKKwkgIGNhc2UgQ0xSX0NfQUxMOgorCSAgICBjbGVhcigpOworCSAgICBicmVhazsKKwkgIGNhc2UgQ0xSX0NfQk9TOgorCSAgICBjbHJib3Njcl9lc2NhcGUoVkNNRCxTUCk7CisJICAgIGJyZWFrOworCSAgY2FzZSBDTFJfQ19CT0w6CisJICAgIGNscmJvbF9lc2NhcGUoVkNNRCxTUCk7CisJICAgIGJyZWFrOworCSAgY2FzZSBDTFJfQ19FT0w6CisJICAgIGNscnRvZW9sbihWQ01ELFNQKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIENMUl9DX0VPUzoKKwkgICAgY2xyZW9zY3JfZXNjYXBlKFZDTUQsU1ApOworCSAgICBicmVhazsKKwkgIGNhc2UgQ0xSX0NfTElOOgorCSAgICBjbHJsaW5lX2VzY2FwZShWQ01ELFNQKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIENMUl9DX1NDUjoKKwkgICAgY2xlYXJzY3JvbGxiYWNrKFZDTUQpOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBwcmludGYoIk5vdCBpbXBsZW1lbnRlZCB5ZXQsIHNvcnJ5LlxuIik7CisJICAgIGJyZWFrOworCX0KKwlicmVhazsKKworI2lmbmRlZiBOT1RFUk0KKyAgICAgIGNhc2UgQ0xSX1RSTToKKwkgc3dpdGNoICggeiApIHsKKwkgIGNhc2UgQ0xSX0NfQUxMOgorCSAgICAgaWYgKFZzY3JuR2V0QnVmZmVyU2l6ZShWVEVSTSkgPiAwICkgeworCQkgVnNjcm5TY3JvbGwoVlRFUk0sIFVQV0FSRCwgMCwKKwkJCSAgICAgVnNjcm5HZXRIZWlnaHQoVlRFUk0pLSh0dF9zdGF0dXNbVlRFUk1dPzI6MSksCisJCQkgICAgIFZzY3JuR2V0SGVpZ2h0KFZURVJNKSAtCisJCQkgICAgICh0dF9zdGF0dXNbVlRFUk1dPzE6MCksIFRSVUUsIFNQCisJCQkgICAgICk7CisJCSBjbGVhcnRlcm1zY3JlZW4oVlRFUk0pOworCSAgICAgfQorCSAgICAgYnJlYWs7CisJICBjYXNlIENMUl9DX0JPUzoKKwkgICAgY2xyYm9zY3JfZXNjYXBlKFZURVJNLFNQKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIENMUl9DX0JPTDoKKwkgICAgY2xyYm9sX2VzY2FwZShWVEVSTSxTUCk7CisJICAgIGJyZWFrOworCSAgY2FzZSBDTFJfQ19FT0w6CisJICAgIGNscnRvZW9sbihWVEVSTSxTUCk7CisJICAgIGJyZWFrOworCSAgY2FzZSBDTFJfQ19FT1M6CisJICAgIGNscmVvc2NyX2VzY2FwZShWVEVSTSxTUCk7CisJICAgIGJyZWFrOworCSAgY2FzZSBDTFJfQ19MSU46CisJICAgIGNscmxpbmVfZXNjYXBlKFZURVJNLFNQKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgQ0xSX0NfU0NSOgorCSAgICAgY2xlYXJzY3JvbGxiYWNrKFZURVJNKTsKKwkgICAgIGJyZWFrOworCSBkZWZhdWx0OgorCSAgICAgcHJpbnRmKCJOb3QgaW1wbGVtZW50ZWQgeWV0LCBzb3JyeS5cbiIpOworCSAgICAgYnJlYWs7CisJfQorCWJyZWFrOworI2VuZGlmIC8qIE5PVEVSTSAqLworICAgIH0KKyAgICB5ID0gMDsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjZW5kaWYgLyogT1MyICovCisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAoeSA9PSAwKSk7Cit9CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworI2lmbmRlZiBOT1NQTAorc3RhdGljIGludAorZG9ldmFsKGN4KSBpbnQgY3g7IHsKKyAgICBjaGFyICpwOworICAgIGNoYXIgdm5hbWJ1ZltWTkFNTF0sICogdm5wID0gTlVMTDsJLyogVGhlc2UgbXVzdCBiZSBvbiB0aGUgc3RhY2sgKi8KKyAgICBpZiAoIW9sZGV2YWwpIHsKKwlpZiAoKHkgPSBjbWZsZCgiVmFyaWFibGUgbmFtZSIsIiIsJnMsCisJCSAgICAgICAoKGN4ID09IFhYX0VWQUwpID8geHhzdHJpbmcgOiBOVUxMKSkpIDwgMCkgeworCSAgICBpZiAoeSA9PSAtMykgeworCQlwcmludGYoIj9WYXJpYWJsZSBuYW1lIHJlcXVpcmVkXG4iKTsKKwkJcmV0dXJuKC05KTsKKwkgICAgfSBlbHNlIHJldHVybih5KTsKKwl9CisJY2tzdHJuY3B5KHZuYW1idWYscyxWTkFNTCk7CS8qIE1ha2UgYSBjb3B5LiAqLworCXZucCA9IHZuYW1idWY7CisJaWYgKHZuYW1idWZbMF0gPT0gQ01EUSAmJgorCSAgICAodm5hbWJ1ZlsxXSA9PSAnJScgfHwgdm5hbWJ1ZlsxXSA9PSAnJicpKQorCSAgdm5wKys7CisJeSA9IDA7CisJaWYgKCp2bnAgPT0gJyUnIHx8ICp2bnAgPT0gJyYnKSB7CisJICAgIGlmICgoeSA9IHBhcnNldmFyKHZucCwmeCwmeikpIDwgMCkKKwkgICAgICByZXR1cm4oeSk7CisJfQorICAgIH0KKyAgICBpZiAoKHggPSBjbXR4dCgiSW50ZWdlciBhcml0aG1ldGljIGV4cHJlc3Npb24iLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworICAgIHAgPSBldmFsYShzKTsKKyAgICBpZiAoIXApIHAgPSAiIjsKKyAgICBpZiAob2xkZXZhbCAmJiAqcCkKKyAgICAgIHByaW50ZigiJXNcbiIsIHApOworICAgIGNrc3RybmNweShldmFsYnVmLHAsMzIpOworICAgIGlmICghb2xkZXZhbCkKKyAgICAgIHJldHVybihzdWNjZXNzID0gYWRkbWFjKHZuYW1idWYscCkpOworICAgIGVsc2UKKyAgICAgIHJldHVybihzdWNjZXNzID0gKnAgPyAxIDogMCk7Cit9CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIFROQ09ERQorc3RhdGljIGludAorZG90ZWxvcHQoKSB7CisgICAgaWYgKCh4ID0gY21rZXkodGVsY21kLCBudGVsY21kLCAiVEVMTkVUIGNvbW1hbmQiLCAiIiwgeHhzdHJpbmcpKSA8IDAgKQorICAgICAgcmV0dXJuKHgpOworICAgIHN3aXRjaCAoeCkgeworICAgICAgY2FzZSBXSUxMOgorICAgICAgY2FzZSBXT05UOgorICAgICAgY2FzZSBETzoKKyAgICAgIGNhc2UgRE9OVDoKKwlpZiAoKHkgPSBjbWtleSh0bm9wdHMsbnRub3B0cywiVEVMTkVUIG9wdGlvbiIsIiIseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeSk7CisJaWYgKCh6ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeik7CisKKwlzd2l0Y2ggKHgpIHsKKwkgIGNhc2UgV0lMTDoKKwkgICAgaWYgKFRFTE9QVF9VTkFOU1dFUkVEX1dJTEwoeSkpCisJICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIFdPTlQ6CisJICAgIGlmIChURUxPUFRfVU5BTlNXRVJFRF9XT05UKHkpKQorCSAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisJICAgIGJyZWFrOworCSAgY2FzZSBETzoKKwkgICAgaWYgKFRFTE9QVF9VTkFOU1dFUkVEX0RPKHkpKQorCSAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisJICAgIGJyZWFrOworCSAgY2FzZSBET05UOgorCSAgICBpZiAoVEVMT1BUX1VOQU5TV0VSRURfRE9OVCh5KSkKKwkgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworCSAgICBicmVhazsKKwl9CisJaWYgKGxvY2FsKSB7CisJICAgIHN1Y2Nlc3MgPSAoKHRuX3NvcHQoeCx5KSA+IC0xKSA/IDEgOiAwKTsKKwl9IGVsc2UgeworCSAgICBwcmludGYoImZmJTAyeCUwMnhcbiIseCx5KTsKKwkgICAgc3VjY2VzcyA9IDE7CisJfQorCWlmIChzdWNjZXNzKSB7CisJICAgIHN3aXRjaCAoeCkgeworCSAgICAgIGNhc2UgV0lMTDoKKwkJVEVMT1BUX1VOQU5TV0VSRURfV0lMTCh5KSA9IDE7CisJCWJyZWFrOworCSAgICAgIGNhc2UgV09OVDoKKwkJaWYgKCBURUxPUFRfTUUoeSkgKQorCQkgIFRFTE9QVF9VTkFOU1dFUkVEX1dPTlQoeSkgPSAxOworCQlicmVhazsKKwkgICAgICBjYXNlIERPOgorCQlURUxPUFRfVU5BTlNXRVJFRF9ETyh5KSA9IDE7CisJCWJyZWFrOworCSAgICAgIGNhc2UgRE9OVDoKKwkJaWYgKCBURUxPUFRfTUUoeSkgKQorCQkgIFRFTE9QVF9VTkFOU1dFUkVEX0RPTlQoeSkgPSAxOworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAodG5fd2FpdCgiWFhURUxPUCIpIDwgMCkgeworCQl0bl9wdXNoKCk7CisJCXN1Y2Nlc3MgPSAwOworCSAgICB9CisJfQorCXJldHVybihzdWNjZXNzKTsKKyAgICAgIGNhc2UgU0I6CisJaWYgKCh5PWNta2V5KHRuc2JvcHRzLG50bnNib3B0cywiVEVMTkVUIG9wdGlvbiIsIiIseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeSk7CisJc3dpdGNoICh5KSB7CisJICBjYXNlIFRFTE9QVF9OQVdTOgorCSAgICAvKiBTb21lIGNvbXBpbGVycyByZXF1aXJlIHN3aXRjaCgpIHRvIGhhdmUgYXQgbGVhc3QgMSBjYXNlICovCisjaWZkZWYgQ0tfTkFXUworCSAgICBURUxPUFRfU0IoVEVMT1BUX05BV1MpLm5hd3MueCA9IDA7CisJICAgIFRFTE9QVF9TQihURUxPUFRfTkFXUykubmF3cy55ID0gMDsKKwkgICAgaWYgKGxvY2FsKQorCSAgICAgIHJldHVybihzdWNjZXNzID0gKCh0bl9zbmF3cygpID4gLTEpID8gMSA6IDApKTsKKwkgICAgZWxzZQorCSAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisjZWxzZQorCSAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIENLX05BV1MgKi8KKwl9CisgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisKKyNpZmRlZiBDS19LRVJCRVJPUworI2lmZGVmIEtSQjUKKyAgICAgIGNhc2UgVE5fRldEOgorICAgICAgICBzdWNjZXNzID0gKGtlcmJlcm9zNV9mb3J3YXJkKCkgPT0gQVVUSF9TVUNDRVNTKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MpOworI2VuZGlmIC8qIEtSQjUgKi8KKyNlbmRpZiAvKiBDS19LRVJCRVJPUyAqLworCisgICAgICBkZWZhdWx0OgorCWlmICgoeiA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHopOworI2lmbmRlZiBOT0xPQ0FMCisJaWYgKGxvY2FsKSB7CisJICAgIENIQVIgdGVtcFszXTsKKwkgICAgaWYgKG5ldHdvcmsgJiYgSVNfVEVMTkVUKCkpIHsgLyogVEVMTkVUICovCisJCXRlbXBbMF0gPSAoQ0hBUikgSUFDOworCQl0ZW1wWzFdID0geDsKKwkJdGVtcFsyXSA9IE5VTDsKKwkJc3VjY2VzcyA9ICh0dG9sKChDSEFSICopdGVtcCwyKSA+IC0xID8gMSA6IDApOworCQlpZiAodG5fZGViIHx8IGRlYnNlcyB8fCBkZWJsb2cpIHsKKwkJICAgIC8qIFROX01TR19MRU4gaXMgaW4gY2tjdGVsLmggKi8KKwkJICAgIGNrbWFrbXNnKHRuX21zZywyNTYsIlRFTE5FVCBTRU5UICIsVEVMQ01EKHgpLE5VTEwsTlVMTCk7CisJCSAgICBkZWJ1ZyhGMTAxLHRuX21zZywiIix4KTsKKwkJICAgIGlmIChkZWJzZXMgfHwgdG5fZGViKSB0bl9kZWJ1Zyh0bl9tc2cpOworCQl9CisJCXJldHVybihzdWNjZXNzKTsKKwkgICAgfQorICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKwl9IGVsc2UgeworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKwkgICAgcHJpbnRmKCJmZiUwMnhcbiIseCk7CisJICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjaWZuZGVmIE5PTE9DQUwKKwl9CisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIH0KK30KKyNlbmRpZiAvKiBUTkNPREUgKi8KKworCisjaWZuZGVmIE5PUFVTSAorI2lmbmRlZiBOT0ZSSUxMUworc3RhdGljIGludAorZG9lZGl0KCkgeworI2lmZGVmIE9TMgorICAgIGNoYXIgKiBwID0gTlVMTDsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBpZiAoIWVkaXRvclswXSkgeworCXMgPSBnZXRlbnYoIkVESVRPUiIpOworCWlmIChzKSBja3N0cm5jcHkoZWRpdG9yLHMsQ0tNQVhQQVRIKTsKKwllZGl0b3JbQ0tNQVhQQVRIXSA9IE5VTDsKKwlpZiAoIWVkaXRvclswXSkgeworCSAgICBwcmludGYoIj9FZGl0b3Igbm90IGRlZmluZWQgLSB1c2UgU0VUIEVESVRPUiB0byBkZWZpbmVcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKyAgICB9CisgICAgY2tzdHJuY3B5KHRtcGJ1ZixlZGl0ZmlsZSxUTVBCVUZTSVopOworLyoKKyAgY21pb2ZpKCkgbGV0cyB1cyBwYXJzZSB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBmaWxlLCBvciB0aGUgbmFtZSBvZgorICBhIG5vbmV4aXN0ZW50IGZpbGUgdG8gYmUgY3JlYXRlZC4KKyovCisgICAgeCA9IGNtaW9maSgiRmlsZSB0byBlZGl0IiwgKGNoYXIgKil0bXBidWYsICZzLCAmeSwgeHhzdHJpbmcpOworICAgIGlmICh4IDwgMCkgeworCWlmICh4ID09IC05KSB7CisJICAgIGlmICh6Y2hrbyhzKSA8IDApIHsKKwkJcHJpbnRmKCJDYW4ndCBjcmVhdGUgXCIlc1wiXG4iLHMpOworCQlyZXR1cm4oeCk7CisJICAgIH0KKwl9IGVsc2UgaWYgKHggIT0gLTMpCisJICByZXR1cm4oeCk7CisgICAgfQorICAgIGlmICh4ID09IC0zKQorICAgICAgdG1wYnVmWzBdID0gTlVMOworICAgIGVsc2UgeworCWNrc3RybmNweSh0bXBidWYscyxUTVBCVUZTSVopOworCWlmIChpc3dpbGQoKGNoYXIgKil0bXBidWYpKSB7CisJICAgIHByaW50ZigiP0Egc2luZ2xlIGZpbGUgcGxlYXNlXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisgICAgfQorICAgIGlmICgoeiA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHopOworICAgIGlmIChub3B1c2gpIHsKKwlwcmludGYoIj9Tb3JyeSwgZWRpdGluZyBub3QgYWxsb3dlZFxuIik7CisJcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICB9CisgICAgaWYgKHRtcGJ1ZlswXSkgeworICAgIC8qIEdldCBmdWxsIHBhdGggaW4gY2FzZSB3ZSBjaGFuZ2UgZGlyZWN0b3JpZXMgYmV0d2VlbiBFRElUIGNvbW1hbmRzICovCisJemZucWZwKHRtcGJ1ZiwgQ0tNQVhQQVRILCBlZGl0ZmlsZSk7CisJZWRpdGZpbGVbQ0tNQVhQQVRIXSA9IE5VTDsKKyNpZmRlZiBPUzIKKwlwID0gZWRpdGZpbGU7CQkJLyogRmxpcCB0aGUgc3R1cGlkIHNsYXNoZXMgKi8KKwl3aGlsZSAoKnApIHsKKwkgICAgaWYgKCpwID09ICcvJykgKnAgPSAnXFwnOworCSAgICBwKys7CisJfQorI2VuZGlmIC8qIE9TMiAqLworICAgIH0gZWxzZQorICAgICAgZWRpdGZpbGVbMF0gPSBOVUw7CisgICAgeCA9IDA7CisgICAgaWYgKGVkaXRvcHRzWzBdKSB7CisjaWZkZWYgT1MyCisJeCA9IGNraW5kZXgoIiUxIiwoY2hhciAqKWVkaXRvcHRzLDAsMCwxKTsKKwlpZiAoeCA+IDApCisJICBlZGl0b3B0c1t4XSA9ICdzJzsKKwllbHNlCisjZW5kaWYgLyogT1MyICovCisJICB4ID0gY2tpbmRleCgiJXMiLChjaGFyICopZWRpdG9wdHMsMCwwLDEpOworICAgIH0KKyAgICBpZiAoKChpbnQpc3RybGVuKGVkaXRvcHRzKSArIChpbnQpc3RybGVuKGVkaXRmaWxlKSArIDEpIDwgVE1QQlVGU0laKSB7CisJaWYgKHgpCisJICBzcHJpbnRmKHRtcGJ1ZixlZGl0b3B0cyxlZGl0ZmlsZSk7CisJZWxzZQorCSAgc3ByaW50Zih0bXBidWYsIiVzICVzIixlZGl0b3B0cyxlZGl0ZmlsZSk7CisgICAgfQorICAgIHMgPSBsaW5lOworICAgIGNrbWFrbXNnKHMsTElOQlVGU0laLGVkaXRvciwiICIsdG1wYnVmLE5VTEwpOworI2lmZGVmIE9TMgorICAgIHAgPSBzICsgc3RybGVuKGVkaXRvcik7CQkvKiBBbmQgYWdhaW4gd2l0aCB0aGUgc2xhc2hlcyAqLworICAgIHdoaWxlIChwICE9IHMpIHsKKwlpZiAoKnAgPT0gJy8nKSAqcCA9ICdcXCc7CisJcC0tOworICAgIH0KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBjb25yZXMoKTsKKyAgICB4ID0genNoY21kKHMpOworICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7CisgICAgcmV0dXJuKHgpOworfQorI2VuZGlmIC8qIE5PRlJJTExTICovCisjZW5kaWYgLyogTk9QVVNIICovCisKKyNpZmRlZiBCUk9XU0VSCitzdGF0aWMgaW50Citkb2Jyb3dzZSgpIHsKKyNpZmRlZiBPUzIKKyAgICBjaGFyICogcCA9IE5VTEw7CisjZW5kaWYgLyogT1MyICovCisgICAgaWYgKG5vcHVzaCkgeworCXByaW50ZigiP1NvcnJ5LCBicm93c2luZyBub3QgYWxsb3dlZFxuIik7CisJcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICB9CisjaWZuZGVmIE5UCisgICAgLyogV2luZG93cyBsZXRzIHRoZSBTaGVsbCBFeGVjdXRlIHRoZSBVUkwgaWYgbm8gQnJvd3NlciBpcyBkZWZpbmVkICovCisgICAgaWYgKCFicm93c2VyWzBdKSB7CisJcyA9IGdldGVudigiQlJPV1NFUiIpOworCWlmIChzKSBja3N0cm5jcHkoYnJvd3NlcixzLENLTUFYUEFUSCk7CisJYnJvd3NlcltDS01BWFBBVEhdID0gTlVMOworCWlmICghYnJvd3NlclswXSkgeworCSAgICBwcmludGYoIj9Ccm93c2VyIG5vdCBkZWZpbmVkIC0gdXNlIFNFVCBCUk9XU0VSIHRvIGRlZmluZVxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorICAgIH0KKyNlbmRpZiAvKiBOVCAqLworICAgIGNrc3RybmNweSh0bXBidWYsYnJvd3N1cmwsVE1QQlVGU0laKTsKKyAgICBpZiAoKHggPSBjbXR4dCgiVVJMIiwoY2hhciAqKWJyb3dzdXJsLCZzLHh4c3RyaW5nKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworICAgIGNrc3RybmNweShicm93c3VybCxzLDQwOTYpOworICAgIHggPSAwOworICAgIGlmIChicm93c29wdHNbMF0pIHsKKyNpZmRlZiBPUzIKKwl4ID0gY2tpbmRleCgiJTEiLChjaGFyICopYnJvd3NvcHRzLDAsMCwxKTsKKwlpZiAoeCA+IDApCisJICBicm93c29wdHNbeF0gPSAncyc7CisJZWxzZQorI2VuZGlmIC8qIE9TMiAqLworCSAgeCA9IGNraW5kZXgoIiVzIiwoY2hhciAqKWJyb3dzb3B0cywwLDAsMSk7CisgICAgfQorICAgIGlmICgoKGludClzdHJsZW4oYnJvd3NvcHRzKSArIChpbnQpc3RybGVuKGJyb3dzdXJsKSArIDEpIDwgVE1QQlVGU0laKSB7CisJaWYgKHgpCisJICBzcHJpbnRmKHRtcGJ1Zixicm93c29wdHMsYnJvd3N1cmwpOworCWVsc2UKKwkgIHNwcmludGYodG1wYnVmLCIlcyAlcyIsYnJvd3NvcHRzLGJyb3dzdXJsKTsKKyAgICB9CisjaWZkZWYgTlQKKyAgICBpZiAoIWJyb3dzZXJbMF0pCisgICAgICByZXR1cm4oc3VjY2VzcyA9IFdpbjMyU2hlbGxFeGVjdXRlKGJyb3dzdXJsKSk7CisjZW5kaWYgLyogTlQgKi8KKyAgICBzID0gbGluZTsKKyAgICBja21ha21zZyhzLExJTkJVRlNJWixicm93c2VyLCIgIix0bXBidWYsTlVMTCk7CisjaWZkZWYgT1MyCisgICAgcCA9IGxpbmUgKyBzdHJsZW4oYnJvd3Nlcik7CQkvKiBGbGlwIHNsYXNoZXMgKi8KKyAgICB3aGlsZSAocCAhPSBsaW5lKSB7CisJaWYgKCpwID09ICcvJykgKnAgPSAnXFwnOworCXAtLTsKKyAgICB9CisjZW5kaWYgLyogT1MyICovCisgICAgY29ucmVzKCk7CisgICAgeCA9IHpzaGNtZChzKTsKKyAgICBjb25jYigoY2hhcillc2NhcGUpOworICAgIHJldHVybih4KTsKK30KKyNlbmRpZiAvKiBCUk9XU0VSICovCisKKyNpZmRlZiBDS19SRUNBTEwKK3N0YXRpYyBpbnQKK2RvcmVkbygpIHsJCQkvKiBGaW5kIGEgcHJldmlvdXMgY21kIGFuZCByZWRvIGl0ICovCisgICAgZXh0ZXJuIGludCBvbl9yZWNhbGwsIGluX3JlY2FsbDsKKyAgICBpbnQgeDsKKyAgICBjaGFyICogcDsKKworICAgIGlmICgoeCA9IGNtdHh0KAorInBhdHRlcm4sIG9yIGZpcnN0IGZldyBjaGFyYWN0ZXJzIG9mIGEgcHJldmlvdXMgY29tbWFuZCIsCisJCSAgICIqIiwmcyx4eHN0cmluZykpIDwgMCkKKyAgICAgIHJldHVybih4KTsKKyAgICBja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisgICAgeCA9IHN0cmxlbihzKTsKKyAgICBzID0gbGluZTsKKyAgICBpZiAoKnMgPT0gJ3snKSB7CQkJLyogQnJhY2VzIGRpc2FibGUgYWRkaW5nICogdG8gZW5kICovCisJaWYgKHNbeC0xXSA9PSAnfScpIHsKKwkgICAgc1t4LTFdID0gTlVMOworCSAgICBzKys7CisJICAgIHgtLTsKKwl9CisgICAgfSBlbHNlIHsJCQkJLyogTm8gYnJhY2VzLCBhZGQgKiB0byBlbmQuICovCisJc1t4XSA9ICcqJzsKKwlzW3grMV0gPSBOVUw7CisgICAgfQorCisgICAgd2hpbGUgKHggPiAwICYmIHNbeF0gPT0gJyonICYmIHNbeC0xXSA9PSAnKicpIHNbeC0tXSA9IE5VTDsKKworICAgIGlmICghb25fcmVjYWxsIHx8ICFpbl9yZWNhbGwpIHsKKwlwcmludGYoIj9Tb3JyeSwgY29tbWFuZCByZWNhbGwgY2FuJ3QgYmUgdXNlZCBub3cuXG4iKTsKKwlyZXR1cm4oLTkpOworICAgIH0KKyAgICBpZiAoKHAgPSBjbWdldGNtZChzKSkpIHsJCS8qIExvb2sgZm9yIGl0IGhpc3RvcnkgYnVmZmVyICovCisJY2ttYWttc2coY21kYnVmLENNREJMLHAsIlxyIixOVUxMLE5VTEwpOyAvKiBDb3B5IHRvIGNvbW1hbmQgYnVmZmVyICovCisJaWYgKCFxdWlldCkJCQkvKiBFY2hvIGl0ICovCisJICBwcmludGYoIiVzXG4iLGNtZGJ1Zik7CisJY21hZGRuZXh0KCk7CQkJLyogRm9yY2UgcmUtYWRkIHRvIGhpc3RvcnkgYnVmZmVyICovCisJcmV0dXJuKGNtZmxncyA9IC0xKTsJCS8qIEZvcmNlIHJlcGFyc2UgKi8KKyAgICB9IGVsc2UgeworCXByaW50ZigiP1NvcnJ5IC0gXCIlc1wiIG5vdCBmb3VuZFxuIiwgcyk7CisJcmV0dXJuKC05KTsKKyAgICB9Cit9CisjZW5kaWYgLyogQ0tfUkVDQUxMICovCisKKyNpZm5kZWYgTk9YRkVSCisjaWZuZGVmIE5PQ1NFVFMKK3N0YXRpYyBpbnQKK2RvYXNzb2MoKSAgewkJCQkvKiBBU1NPQ0lBVEUgKi8KKyAgICBleHRlcm4gc3RydWN0IGtleXRhYiB0Y3N0YWJbXTsKKyAgICBleHRlcm4gaW50IG50Y3M7CisgICAgaWYgKCh4ID0gY21rZXkoYXNzb2N0YWIsIG5hc3NvYywgIiIsICIiLCB4eHN0cmluZykpIDwgMCApCisgICAgICByZXR1cm4oeCk7CisKKyAgICBzd2l0Y2ggKHgpIHsJCQkvKiBBc3NvY2lhdGUgd2hhdD8gKi8KKworICAgICAgY2FzZSBBU1NPQ19UQzoJCQkvKiBUcmFuc2ZlciBjaGFyYWN0ZXItc2V0Li4uICovCisJaWYgKCh4ID0gY21rZXkodGNzdGFiLCBudGNzLAorCQkgICAgICAgInRyYW5zZmVyIGNoYXJhY3Rlci1zZXQgbmFtZSIsIiIseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeCk7CisJaWYgKCh5ID0gY21rZXkoZmNzdGFiLCBuZmlsYywKKwkJICAgICAgICJ3aXRoIGZpbGUgY2hhcmFjdGVyLXNldCIsIiIsIHh4c3RyaW5nKSkgPCAwKQorCSAgaWYgKHkgIT0gLTMpCisJICAgIHJldHVybih5KTsKKwlpZiAoKHogPSBjbWNmbSgpKSA8IDApCisJICByZXR1cm4oeik7CisJYXhjc2V0W3hdID0geTsKKwlyZXR1cm4oc3VjY2VzcyA9IDEpOworCisgICAgICBjYXNlIEFTU09DX0ZDOgkJCS8qIEZpbGUgY2hhcmFjdGVyLXNldC4uLiAqLworCWlmICgoeCA9IGNta2V5KGZjc3RhYiwgbmZpbGMsCisJCSAgICAgICAiZmlsZSBjaGFyYWN0ZXItc2V0IG5hbWUiLCIiLHh4c3RyaW5nKSkgPCAwKQorCSAgcmV0dXJuKHgpOworCWlmICgoeSA9IGNta2V5KHRjc3RhYiwgbnRjcywKKwkJICAgICAgICJ3aXRoIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQiLCIiLCB4eHN0cmluZykpIDwgMCkKKwkgIGlmICh5ICE9IC0zKQorCSAgICByZXR1cm4oeSk7CisJaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorCSAgcmV0dXJuKHopOworCWFmY3NldFt4XSA9IHk7CisJcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworICAgICAgZGVmYXVsdDoKKwlyZXR1cm4oLTIpOworICAgIH0KK30KKyNlbmRpZiAvKiBOT0NTRVRTICovCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9IRUxQCitzdGF0aWMgaW50Citkb21hbnVhbCgpIHsKKyNpZmRlZiBPUzIKKyAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgaWYgKG5vcHVzaCkgeworCXByaW50ZigiP1NvcnJ5LCBhY2Nlc3MgdG8gc3lzdGVtIGNvbW1hbmRzIGlzIGRpc2FibGVkLlxuIik7CisJcmV0dXJuKC05KTsKKyAgICB9CisgICAgeSA9IG14bG9vayhtYWN0YWIsIm1hbnVhbCIsbm1hYyk7CisgICAgaWYgKHkgPiAtMSkgeworCXogPSBtYWNsdmw7CQkJLyogU2F2ZSB0aGUgY3VycmVudCBtYWNsdmwgKi8KKwlkb2RvKHksTlVMTCxjbWRzdGtbY21kbHZsXS5jY2ZsZ3MpOyAvKiBSdW4gdGhlIG1hY3JvICovCisJd2hpbGUgKG1hY2x2bCA+IHopIHsKKwkgICAgZGVidWcoRjEwMSwiWFhNQU4gbG9vcCBtYWNsdmwgMSIsIiIsbWFjbHZsKTsKKwkgICAgc3N0YXRlID0gKENIQVIpIHBhcnNlcigxKTsKKwkgICAgZGVidWcoRjEwMSwiWFhNQU4gbG9vcCBtYWNsdmwgMiIsIiIsbWFjbHZsKTsKKwkgICAgaWYgKHNzdGF0ZSkgcHJvdG8oKTsKKwl9CisJZGVidWcoRjEwMSwiWFhNQU4gbG9vcCBleGl0IG1hY2x2bCIsIiIsbWFjbHZsKTsKKwlyZXR1cm4oc3VjY2Vzcyk7CisgICAgfQorICAgIHJldHVybihzdWNjZXNzID0gMCk7CisjZWxzZQorICAgIGlmICgoeCA9IGNtdHh0KAorI2lmZGVmIFVOSVgKKwkJICAgIkNhcnJpYWdlIHJldHVybiB0byBjb25maXJtIHRoZSBjb21tYW5kLCBvciBtYW51YWwgdG9waWMiLAorI2Vsc2UKKwkJICAgIkNhcnJpYWdlIHJldHVybiB0byBjb25maXJtIHRoZSBjb21tYW5kLCBvciBoZWxwIHRvcGljIiwKKyNlbmRpZiAvKiBVTklYICovCisJCSAgICJrZXJtaXQiLAorCQkgICAmcywKKwkJICAgeHhzdHJpbmcKKwkJICAgKQorCSApIDwgMCkKKyAgICAgIHJldHVybih4KTsKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIFVOSVgKKyAgICBja21ha21zZyh0bXBidWYsVE1QQlVGU0laLCJtYW4gIixzLE5VTEwsTlVMTCk7CisjZWxzZQorICAgIGNrbWFrbXNnKHRtcGJ1ZixUTVBCVUZTSVosImhlbHAgIixzLE5VTEwsTlVMTCk7CisjZW5kaWYgLyogVU5JWCAqLworICAgIGRlYnVnKEYxMTAsIk1BTlVBTCIsdG1wYnVmLDApOworICAgIGlmIChub3B1c2gpIHsKKwlwcmludGYoIj9Tb3JyeSwgYWNjZXNzIHRvIHN5c3RlbSBjb21tYW5kcyBpcyBkaXNhYmxlZC5cbiIpOworCXJldHVybigtOSk7CisgICAgfSBlbHNlIHsKKwljb25yZXMoKTsJCQkvKiBSZXN0b3JlIHRoZSBjb25zb2xlICovCisJc3VjY2VzcyA9IHpzaGNtZCh0bXBidWYpOworCWNvbmNiKChjaGFyKWVzY2FwZSk7CQkvKiBSZXN0b3JlIENCUkVBSyBtb2RlICovCisJcmV0dXJuKHN1Y2Nlc3MpOworICAgIH0KK30KKyNlbmRpZiAvKiBOT0hFTFAgKi8KKworI2lmbmRlZiBOT0hUVFAKKyNpZmRlZiBUQ1BTT0NLRVQKK3N0YXRpYyBzdHJ1Y3Qga2V5dGFiIHNzbHN3dGFiW10gPSB7CisgICAgeyAiL3NzbCIsIDEsIDAgfSwKKyAgICB7ICIvdGxzIiwgMSwgMCB9Cit9OworCisjaWZuZGVmIE5PVVJMCitzdHJ1Y3QgdXJsZGF0YSBodHRwX3VybCA9IHtOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMfTsKKyNlbmRpZiAvKiBOT1VSTCAqLworCitzdGF0aWMgaW50Citkb2h0dHAoKSB7CQkJCS8qIEhUVFAgKi8KKyAgICBzdHJ1Y3QgRkRCIHN3LCBrdywgZmk7CisgICAgaW50IG4sIGdldHZhbCwgYWxsaW5vbmUgPSAwOworICAgIGNoYXIgYywgKiBwOworICAgIGNoYXIgcmRuc1sxMjhdOworCisgICAgY2hhciAqIGh0dHBfYWdlbnQgPSBOVUxMOwkJLyogUGFyc2UgcmVzdWx0cyAqLworICAgIGNoYXIgKiBodHRwX2hkciAgID0gTlVMTDsKKyAgICBjaGFyICogaHR0cF91c2VyICA9IE5VTEw7CisgICAgY2hhciAqIGh0dHBfcGFzcyAgPSBOVUxMOworICAgIGNoYXIgKiBodHRwX21pbWUgID0gTlVMTDsKKyAgICBjaGFyICogaHR0cF9sZmlsZSA9IE5VTEw7CisgICAgY2hhciAqIGh0dHBfcmZpbGUgPSBOVUxMOworICAgIGNoYXIgKiBodHRwX2RmaWxlID0gTlVMTDsKKyAgICBjaGFyICAgaHR0cF9hcnJheSA9IE5VTDsKKyAgICBpbnQgICAgaHR0cF9hY3Rpb24gPSAtMTsKKworICAgIGNoYXIgKiBodHRwX2hvc3QgPSBOVUxMOworICAgIGNoYXIgKiBodHRwX3NydiAgPSBOVUxMOworICAgIGludCAgICBodHRwX3NzbCAgPSAwOworCisgICAgc3RhdGljIGNoYXIgKiBodHRwX2RfYWdlbnQgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICogaHR0cF9kX3VzZXIgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICogaHR0cF9kX3Bhc3MgPSBOVUxMOworCisgICAgc3RhdGljIGludCAgICBodHRwX2RfdHlwZSA9IDA7CisgICAgaW50ICAgICAgICAgICBodHRwX3R5cGUgPSBodHRwX2RfdHlwZTsKKworI2lmZGVmIE9TMgorICAgIHAgPSAiS2VybWl0IDk1IjsJCQkvKiBEZWZhdWx0IHVzZXIgYWdlbnQgKi8KKyNlbHNlCisgICAgcCA9ICJDLUtlcm1pdCI7CisjZW5kaWYgLyogT1MyICovCisgICAgbWFrZXN0cigmaHR0cF9hZ2VudCxwKTsKKyAgICBtYWtlc3RyKCZodHRwX21pbWUsInRleHQvSFRNTCIpOwkvKiBNSU1FIHR5cGUgZGVmYXVsdCAqLworICAgIHJkbnNbMF0gPSAnXDAnOworCisgICAgY21mZGJpKCZzdywJCQkJLyogMXN0IEZEQiAtIGdlbmVyYWwgc3dpdGNoZXMgKi8KKyAgICAgICBfQ01LRVksCQkJCS8qIGZjb2RlICovCisgICAgICAgIk9QRU4sIENMT1NFLCBHRVQsIEhFQUQsIFBVVCwgSU5ERVgsIG9yIFBPU1QsXG4gb3Igc3dpdGNoIiwgLyogaGxwbXNnICovCisgICAgICAgIiIsCQkJCS8qIGRlZmF1bHQgKi8KKyAgICAgICAiIiwJCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKyAgICAgICBuaHR0cHN3dGFiLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworICAgICAgIDQsCQkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKyAgICAgICB4eHN0cmluZywJCQkvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgICAgICAgaHR0cHN3dGFiLAkJCS8qIEtleXdvcmQgdGFibGUgKi8KKyAgICAgICAma3cJCQkJLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworICAgICAgICk7CisgICAgY21mZGJpKCZrdywJCQkJLyogMm5kIEZEQiAtIGNvbW1hbmRzICovCisgICAgICAgX0NNS0VZLAkJCQkvKiBmY29kZSAqLworICAgICAgICJDb21tYW5kIiwJCQkvKiBobHBtc2cgKi8KKyAgICAgICAiIiwJCQkJLyogZGVmYXVsdCAqLworICAgICAgICIiLAkJCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworICAgICAgIG5odHRwdGFiLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworICAgICAgIDAsCQkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiAwID0ga2V5d29yZCAqLworICAgICAgIHh4c3RyaW5nLAkJCS8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKyAgICAgICBodHRwdGFiLAkJCQkvKiBLZXl3b3JkIHRhYmxlICovCisgICAgICAgTlVMTAkJCQkvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisgICAgICAgKTsKKworICAgIHdoaWxlICgxKSB7CisJeCA9IGNtZmRiKCZzdyk7CQkJLyogUGFyc2Ugc29tZXRoaW5nICovCisJaWYgKHggPCAwKQkJCS8qIEVycm9yICovCisJICBnb3RvIHhodHRwOworCW4gPSBjbXJlc3VsdC5ucmVzdWx0OworCWlmIChjbXJlc3VsdC5mZGJhZGRyID09ICZrdykJLyogQ29tbWFuZCAtIGV4aXQgdGhpcyBsb29wICovCisJICBicmVhazsKKwljID0gY21nYnJrKCk7CQkJLyogU3dpdGNoLi4uICovCisJZ2V0dmFsID0gKGMgPT0gJzonIHx8IGMgPT0gJz0nKTsKKwl4ID0gLTk7CisJaWYgKGdldHZhbCAmJiAhKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworCSAgICBwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50XG4iKTsKKwkgICAgZ290byB4aHR0cDsKKwl9CisJc3dpdGNoIChjbXJlc3VsdC5ucmVzdWx0KSB7CS8qIEhhbmRsZSBlYWNoIHN3aXRjaCAqLworICAgICAgICAgIGNhc2UgSFRfU1dfVFA6ICAgICAgICAgICAgICAgIC8qIC9UT1NDUkVFTiAqLworICAgICAgICAgICAgaHR0cF90eXBlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCSAgY2FzZSBIVF9TV19BRzoJCS8qIC9BR0VOVCAqLworCSAgICBpZiAoZ2V0dmFsKSB7CisJCWlmICgoeCA9IGNtZmxkKCJVc2VyIGFnZW50IixwLCZzLHh4c3RyaW5nKSkgPCAwKQorCQkgIGdvdG8geGh0dHA7CisJICAgIH0gZWxzZSB7CisJCXMgPSBwOworCSAgICB9CisJICAgIG1ha2VzdHIoJmh0dHBfYWdlbnQscyk7CisJICAgIGJyZWFrOworCSAgY2FzZSBIVF9TV19IRDoJCS8qIC9IRUFERVIgKi8KKwkgICAgcyA9IE5VTEw7CisJICAgIGlmIChnZXR2YWwpIHsKKwkJaWYgKCh4ID0gY21mbGQoIkhlYWRlciBsaW5lIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworCQkgICAgaWYgKHggPT0gLTMpCisJCSAgICAgIHMgPSBOVUxMOworCQkgICAgZWxzZQorCQkgICAgICBnb3RvIHhodHRwOworCQl9CisJICAgIH0KKwkgICAgbWFrZXN0cigmaHR0cF9oZHIscyk7CisJICAgIGJyZWFrOworCSAgY2FzZSBIVF9TV19VUzoJCS8qIC9VU0VSICovCisJICAgIHMgPSBOVUxMOworCSAgICBpZiAoZ2V0dmFsKSB7CisJCWlmICgoeCA9IGNtZmxkKCJVc2VyIElEIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgaWYgKHggPT0gLTMpCisgICAgICAgICAgICAgICAgICAgIHMgPSAiIjsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKwkJICAgIGdvdG8geGh0dHA7CisgICAgICAgICAgICAgICAgfQorCSAgICB9CisJICAgIG1ha2VzdHIoJmh0dHBfdXNlcixzKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIEhUX1NXX1BXOgkJLyogL1BBU1NXT1JEICovCisJICAgIGRlYm9rID0gMDsKKwkgICAgcyA9IE5VTEw7CisJICAgIGlmIChnZXR2YWwpIHsKKwkJaWYgKCh4ID0gY21mbGQoIlBhc3N3b3JkIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkJICBnb3RvIHhodHRwOworCSAgICB9CisJICAgIG1ha2VzdHIoJmh0dHBfcGFzcyxzKTsKKwkgICAgYnJlYWs7CisjaWZuZGVmIE5PU1BMCisJICBjYXNlIEhUX1NXX0FSOiB7CQkvKiAvQVJSQVk6ICovCisJICAgICAgY2hhciAqIHMyLCBhcnJheSA9IE5VTDsKKwkgICAgICBpZiAoIWdldHZhbCkgeworCQkgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJICB4ID0gLTk7CisJCSAgZ290byB4aHR0cDsKKwkgICAgICB9CisJICAgICAgaWYgKCh4ID0gY21mbGQoIkFycmF5IG5hbWUgKGEgc2luZ2xlIGxldHRlciB3aWxsIGRvKSIsCisJCQkgICAgICIiLAorCQkJICAgICAmcywKKwkJCSAgICAgTlVMTAorCQkJICAgICApKSA8IDApIHsKKwkJICBpZiAoeCA9PSAtMykgeworCQkgICAgICBwcmludGYoIj9BcnJheSBuYW1lIHJlcXVpcmVkXG4iKTsKKwkJICAgICAgeCA9IC05OworCQkgICAgICBnb3RvIHhodHRwOworCQkgIH0gZWxzZQorCQkgICAgZ290byB4aHR0cDsKKwkgICAgICB9CisJICAgICAgaWYgKCEqcykgeworCQkgIHByaW50ZigiP0FycmF5IG5hbWUgcmVxdWlyZWRcbiIpOworCQkgIHggPSAtOTsKKwkJICBnb3RvIHhodHRwOworCSAgICAgIH0KKwkgICAgICBzMiA9IHM7CisJICAgICAgaWYgKCpzID09IENNRFEpIHMrKzsKKwkgICAgICBpZiAoKnMgPT0gJyYnKSBzKys7CisJICAgICAgaWYgKCFpc2FscGhhKCpzKSkgeworCQkgIHByaW50ZigiP0JhZCBhcnJheSBuYW1lIC0gXCIlc1wiXG4iLHMyKTsKKwkJICB4ID0gLTk7CisJCSAgZ290byB4aHR0cDsKKwkgICAgICB9CisJICAgICAgYXJyYXkgPSAqcysrOworCSAgICAgIGlmIChpc3VwcGVyKGFycmF5KSkKKwkJYXJyYXkgPSB0b2xvd2VyKGFycmF5KTsKKwkgICAgICBpZiAoKnMgJiYgKCpzICE9ICdbJyB8fCAqKHMrMSkgIT0gJ10nKSkgeworCQkgIHByaW50ZigiP0JhZCBhcnJheSBuYW1lIC0gXCIlc1wiXG4iLHMyKTsKKwkJICBodHRwX2FycmF5ID0gTlVMOworCQkgIHggPSAtOTsKKwkJICBnb3RvIHhodHRwOworCSAgICAgIH0KKwkgICAgICBodHRwX2FycmF5ID0gYXJyYXk7CisJICAgICAgYnJlYWs7CisJICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKwkgIGRlZmF1bHQ6CisJICAgIHggPSAtMjsKKwkgICAgZ290byB4aHR0cDsKKwl9CisgICAgfQorICAgIGh0dHBfYWN0aW9uID0gbjsJCQkvKiBTYXZlIHRoZSBhY3Rpb24gKi8KKyAgICBpZiAoaHR0cF9hY3Rpb24gPT0gSFRUUF9QVVQgfHwgaHR0cF9hY3Rpb24gPT0gSFRUUF9QT1MpIHsKKwljbWZkYmkoJnN3LAkJCS8qIDFzdCBGREIgLSBzd2l0Y2ggKi8KKwkgICAgICAgX0NNS0VZLAkJCS8qIGZjb2RlICovCisJICAgICAgICJMb2NhbCBmaWxlbmFtZVxuIE9yIHN3aXRjaCIsIC8qIGhlbHAgKi8KKwkgICAgICAgIiIsCQkJLyogZGVmYXVsdCAqLworCSAgICAgICAiIiwJCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCSAgICAgICBuaHR0cHB0YWIsCQkvKiBrZXl3b3JkIHRhYmxlIHNpemUgKi8KKwkgICAgICAgNCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisJICAgICAgIHh4c3RyaW5nLAkJLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworCSAgICAgICBodHRwcHRhYiwJCS8qIEtleXdvcmQgdGFibGUgKi8KKwkgICAgICAgJmZpCQkJLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworCSAgICAgICApOworCWNtZmRiaSgmZmksCQkJLyogMm5kIEZEQiAtIGZpbGVuYW1lICovCisJICAgICAgIF9DTUlGSSwJCQkvKiBmY29kZSAqLworCSAgICAgICAiTG9jYWwgZmlsZW5hbWUiLAkvKiBobHBtc2cgKi8KKwkgICAgICAgIiIsCQkJLyogZGVmYXVsdCAqLworCSAgICAgICAiIiwJCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCSAgICAgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisJICAgICAgIDAsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKwkgICAgICAgeHhzdHJpbmcsCisJICAgICAgIE5VTEwsCisJICAgICAgIE5VTEwKKwkgICAgICAgKTsKKwl3aGlsZSAoMSkgeworCSAgICB4ID0gY21mZGIoJnN3KTsKKwkgICAgaWYgKHggPCAwKQorCSAgICAgIGdvdG8geGh0dHA7CQkvKiBGcmVlIGFueSBtYWxsb2MnZCB0ZW1wIHN0cmluZ3MgKi8KKwkgICAgbiA9IGNtcmVzdWx0Lm5yZXN1bHQ7CisJICAgIGlmIChjbXJlc3VsdC5mY29kZSAhPSBfQ01LRVkpCisJICAgICAgYnJlYWs7CisJICAgIGMgPSBjbWdicmsoKTsJCS8qIFN3aXRjaC4uLiAqLworCSAgICBnZXR2YWwgPSAoYyA9PSAnOicgfHwgYyA9PSAnPScpOworCSAgICBpZiAoZ2V0dmFsICYmICEoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisJCXByaW50ZigiP1RoaXMgc3dpdGNoIGRvZXMgbm90IHRha2UgYW4gYXJndW1lbnRcbiIpOworCQl4ID0gLTk7CisJCWdvdG8geGh0dHA7CisJICAgIH0KKwkgICAgc3dpdGNoIChuKSB7CisJICAgICAgY2FzZSBIVF9QUF9NVDoKKwkJcyA9ICJ0ZXh0L0hUTUwiOworCQlpZiAoZ2V0dmFsKSB7CisJCSAgICBpZiAoKHggPSBjbWZsZCgiTUlNRSB0eXBlIiwKKwkJCQkgICAidGV4dC9IVE1MIiwmcyx4eHN0cmluZykpIDwgMCkKKwkJICAgICAgZ290byB4aHR0cDsKKwkJfQorCQltYWtlc3RyKCZodHRwX21pbWUscyk7CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CisJCXggPSAtMjsKKwkJZ290byB4aHR0cDsKKwkgICAgfQorCX0KKwltYWtlc3RyKCZodHRwX2xmaWxlLGNtcmVzdWx0LnNyZXN1bHQpOworCW4gPSBja2luZGV4KCIvIixodHRwX2xmaWxlLC0xLDEsMCk7CisJaWYgKG4pCisJICBwID0gJmh0dHBfbGZpbGVbbl07CisJZWxzZQorCSAgcCA9IGh0dHBfbGZpbGU7CisJaWYgKCh4ID0gY21mbGQoIlVSTCBvciByZW1vdGUgZmlsZW5hbWUiLHAsJnMseHhzdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICBpZiAoeCA9PSAtMykgeworICAgICAgICAgICAgcHJpbnRmKCI/JXMgd2hhdD9cbiIsKGh0dHBfYWN0aW9uID09IEhUVFBfUFVUKSA/ICJQdXQiIDogIlBvc3QiKTsKKyAgICAgICAgICAgIHggPSAtOTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ290byB4aHR0cDsKKyAgICAgICAgfQorCWlmICghKnMpIHMgPSBOVUxMOworCW1ha2VzdHIoJmh0dHBfcmZpbGUscyk7CisKKwlpZiAoKHggPSBjbXR4dCgiUmVzcG9uc2UgZmlsZW5hbWUiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgaWYgKHggIT0gLTMpCisgICAgICAgICAgICBnb3RvIHhodHRwOworICAgICAgICB9CisgICAgICAgIGlmICgqcykKKyAgICAgICAgICBtYWtlc3RyKCZodHRwX2RmaWxlLHMpOworICAgIH0KKyAgICBzd2l0Y2ggKGh0dHBfYWN0aW9uKSB7CisgICAgICBjYXNlIEhUVFBfREVMOgkJCS8qIERFTEVURSAqLworCWlmICgoeCA9IGNtZmxkKCJVUkwgb3IgcmVtb3RlIHNvdXJjZSBmaWxlIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICBwcmludGYoIj9EZWxldGUgd2hhdD9cbiIpOworICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgIH0KKyAgICAgICAgICBnb3RvIHhodHRwOworICAgICAgICB9CisJbWFrZXN0cigmaHR0cF9yZmlsZSxzKTsKKwlicmVhazsKKyAgICAgIGNhc2UgSFRUUF9DT046CQkJLyogQ09OTkVDVCAqLworICAgICAgICBpZiAoKHggPSBjbWZsZCgiUmVtb3RlIGhvc3RbOnBvcnRdIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworICAgICAgICAgIGlmICh4ID09IC0zKSB7CisgICAgICAgICAgICBwcmludGYoIj9SZW1vdGUgaG9zdFs6cG9ydF0gaXMgcmVxdWlyZWRcbiIpOworICAgICAgICAgICAgeCA9IC05OworICAgICAgICAgIH0KKyAgICAgICAgICBnb3RvIHhodHRwOworICAgICAgICB9CisJbWFrZXN0cigmaHR0cF9yZmlsZSxzKTsKKwlicmVhazsKKyAgICAgIGNhc2UgSFRUUF9IRUQ6IHsJCQkvKiBIRUFEICovCisJICBjaGFyIGJ1ZltDS01BWFBBVEgrMV07CisJICBpZiAoKHggPSBjbWZsZCgiVVJMIG9yIHJlbW90ZSBzb3VyY2UgZmlsZSIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKwkgICAgICBpZiAoeCA9PSAtMykgeworCQkgIHByaW50ZigiP0hlYWQgb2Ygd2hhdD9cbiIpOworCQkgIHggPSAtOTsKKwkgICAgICB9CisJICAgICAgZ290byB4aHR0cDsKKwkgIH0KKwkgIG1ha2VzdHIoJmh0dHBfcmZpbGUscyk7CisKKwkgIGlmIChodHRwX2FycmF5IHx8IGh0dHBfdHlwZSkgeyAvKiBEZWZhdWx0IHJlc3VsdCBmaWxlbmFtZSAqLworCSAgICAgIHAgPSAiIjsJCQkgLyogTm9uZSBpZiAvQVJSQVkgb3IgL1RPU0NSRUVOICovCisJICB9IGVsc2UgeworCSAgICAgIG4gPSBja2luZGV4KCIvIixodHRwX3JmaWxlLC0xLDEsMCk7IC8qIE90aGVyd2lzZSBzdHJpcCBwYXRoICovCisJICAgICAgaWYgKG4pCQkgICAgICAgICAgICAgICAgICAvKiBhbmQgYWRkICIuaGVhZCIgKi8KKwkJcCA9ICZodHRwX3JmaWxlW25dOworCSAgICAgIGVsc2UKKwkJcCA9IGh0dHBfcmZpbGU7CisJICAgICAgY2ttYWttc2coYnVmLENLTUFYUEFUSCxwLCIuaGVhZCIsTlVMTCxOVUxMKTsKKwkgICAgICBwID0gYnVmOworCSAgfQorCSAgaWYgKCh4ID0gY21vZmkoIkxvY2FsIGZpbGVuYW1lIixwLCZzLHh4c3RyaW5nKSkgPCAwKSB7CisJICAgICAgaWYgKHggIT0gLTMpCisJCWdvdG8geGh0dHA7CisJICB9CisJICBtYWtlc3RyKCZodHRwX2xmaWxlLHMpOworCSAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEhUVFBfR0VUOgkJCS8qIEdFVCAqLworICAgICAgY2FzZSBIVFRQX0lEWDogewkJCS8qIElOREVYICovCisJICBjaGFyICogbGZpbGUgPSAiIjsKKwkgIGlmICgoeCA9IGNtZmxkKCJVUkwgb3IgcmVtb3RlIHNvdXJjZSBmaWxlIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworCSAgICAgIGlmICh4ID09IC0zKSB7CisJCSAgcHJpbnRmKCI/R2V0IHdoYXQ/XG4iKTsKKwkJICB4ID0gLTk7CisJICAgICAgfQorCSAgICAgIGdvdG8geGh0dHA7CisJICB9CisJICBtYWtlc3RyKCZodHRwX3JmaWxlLHMpOworCSAgaWYgKGh0dHBfYWN0aW9uID09IEhUVFBfR0VUICYmICFodHRwX3R5cGUpCisJICAgIHpzdHJpcChodHRwX3JmaWxlLCZsZmlsZSk7CisJICBpZiAoKHggPSBjbW9maSgiTG9jYWwgZmlsZW5hbWUiLGxmaWxlLCZzLHh4c3RyaW5nKSkgPCAwKQorCSAgICBpZiAoeCAhPSAtMykKKwkgICAgICBnb3RvIHhodHRwOworCSAgbWFrZXN0cigmaHR0cF9sZmlsZSxzKTsKKwkgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBIVFRQX09QTjogeworCSAgaW50IHNzbHN3aXRjaCA9IDA7CisjaWZkZWYgQ0tfU1NMCisJICBzdHJ1Y3QgRkRCIHN3LCBmbDsKKwkgIGNtZmRiaSgmc3csCisJCSBfQ01LRVksCQkvKiBmY29kZSAqLworCQkgIklQIGhvc3QgbmFtZSBvciBhZGRyZXNzLCBvciBzd2l0Y2giLCAvKiBobHBtc2cgKi8KKwkJICIiLAkJCS8qIGRlZmF1bHQgKi8KKwkJICIiLAkJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJCSAyLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworCQkgNCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisJCSB4eHN0cmluZywJCS8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKwkJIHNzbHN3dGFiLAkJLyogS2V5d29yZCB0YWJsZSAqLworCQkgJmZsCQkJLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworCQkgKTsKKwkgIGNtZmRiaSgmZmwsCQkJLyogMm5kIEZEQiAtIGhvc3QgKi8KKwkJIF9DTUZMRCwJCS8qIGZjb2RlICovCisJCSAiIiwJCQkvKiBobHBtc2cgKi8KKwkJICIiLAkJCS8qIGRlZmF1bHQgKi8KKwkJICIiLAkJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJCSAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisJCSAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisJCSB4eHN0cmluZywKKwkJIE5VTEwsCisJCSBOVUxMCisJCSApOworCSAgeCA9IGNtZmRiKCZzdyk7CQkvKiBQYXJzZSBzd2l0Y2ggb3IgaG9zdCAqLworCSAgaWYgKHggPCAwKQkJCS8qIEVycm9yICovCisJICAgIGdvdG8geGh0dHA7CisJICBpZiAoY21yZXN1bHQuZmNvZGUgPT0gX0NNRkxEKSB7IC8qIEhvc3QgKi8KKwkgICAgICBzID0gY21yZXN1bHQuc3Jlc3VsdDsJICAvKiBTZXQgdXAgZXhwZWN0ZWQgcG9pbnRlciAqLworCSAgICAgIGdvdG8gaGF2ZWhvc3Q7ICAgICAgICAgICAgICAvKiBHbyBwYXJzZSByZXN0IG9mIGNvbW1hbmQgKi8KKwkgIH0KKwkgIHNzbHN3aXRjaCA9IDE7CQkvKiAvU1NMIG9yIC9UTFMgc3dpdGNoIC0gc2V0IGZsYWcgKi8KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworCSAgLyogUGFyc2UgaG9zdCAqLworCisJICBpZiAoKHggPSBjbWZsZCgiVVJMLCBob3N0bmFtZSwgb3IgaXAtYWRkcmVzcyIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKwkgICAgICBpZiAoeCA9PSAtMykgeworCQkgIHByaW50ZigiP09wZW4gd2hhdD9cbiIpOworCQkgIHggPSAtOTsKKwkgICAgICB9CisJICAgICAgZ290byB4aHR0cDsKKwkgIH0KKworCWhhdmVob3N0OgkJCS8qIENvbWUgaGVyZSB3aXRoIHMgLT4gaG9zdCAqLworI2lmZGVmIENLX1VSTAorCSAgeCA9IHVybHBhcnNlKHMsJmh0dHBfdXJsKTsJLyogV2FzIGEgVVJMIGdpdmVuPyAqLworCSAgaWYgKHggPCAxKSB7CQkJLyogTm90IGEgVVJMICovCisjZW5kaWYgLyogQ0tfVVJMICovCisJICAgICAgbWFrZXN0cigmaHR0cF9ob3N0LHMpOworCSAgICAgIGlmICgoeCA9CisJCSAgIGNtZmxkKCJTZXJ2aWNlIG5hbWUgb3IgcG9ydCBudW1iZXIiLAorCQkJIHNzbHN3aXRjaCA/ICJodHRwcyIgOiAiaHR0cCIsJnMseHhzdHJpbmcpKSA8IDApCisJCWdvdG8geGh0dHA7CisJICAgICAgZWxzZQorCQltYWtlc3RyKCZodHRwX3NydixzKTsKKyNpZmRlZiBDS19VUkwKKwkgIH0gZWxzZSBpZiAoY2tzdHJjbXAoaHR0cF91cmwuc3ZjLCJodHRwIiwtMSwwKSAmJiAvKiBOb24tSFRUUCBVUkwgKi8KKwkJICAgICBja3N0cmNtcChodHRwX3VybC5zdmMsImh0dHBzIiwtMSwwKSkgeworCSAgICAgIHByaW50ZigiP05vbi1IVFRQIFVSTFxuIik7CisJICAgICAgeCA9IC05OworCSAgICAgIGdvdG8geGh0dHA7CisJICB9IGVsc2UgewkJCS8qIEhhdmUgSFRUUCBVUkwgKi8KKwkgICAgICBtYWtlc3RyKCZodHRwX3NydiwgaHR0cF91cmwuc3ZjKTsKKwkgICAgICBtYWtlc3RyKCZodHRwX3VzZXIsaHR0cF91cmwudXNyKTsKKwkgICAgICBtYWtlc3RyKCZodHRwX3Bhc3MsaHR0cF91cmwucHN3KTsKKwkgICAgICBtYWtlc3RyKCZodHRwX2hvc3QsaHR0cF91cmwuaG9zKTsKKwkgICAgICBpZiAoaHR0cF91cmwucG9yKQorCQltYWtlc3RyKCZodHRwX3NydixodHRwX3VybC5wb3IpOworCSAgICAgIG1ha2VzdHIoJmh0dHBfcmZpbGUsaHR0cF91cmwucHRoKTsKKwkgIH0KKwkgIGlmIChodHRwX3JmaWxlKSB7CQkvKiBPcGVuLCBHRVQsIGFuZCBDbG9zZSAqLworCSAgICAgIHByaW50ZigiP0RpcmVjdG9yeS9maWxlIHBhdGggbm90IGFsbG93ZWQgaW4gSFRUUCBPUEVOIFVSTFxuIik7CisJICAgICAgeCA9IC05OworCSAgICAgIGdvdG8geGh0dHA7CisJICB9CisJICBpZiAoIWNrc3RyY21wKCJodHRwcyIsaHR0cF9zcnYsLTEsMCkgfHwgc3Nsc3dpdGNoIHx8CisJICAgICAgIWNrc3RyY21wKCI0NDMiLGh0dHBfc3J2LC0xLDApKQorCSAgICBodHRwX3NzbCA9IDE7CisjZW5kaWYgLyogQ0tfVVJMICovCisJICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgSFRUUF9DTFM6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisgICAgICBnb3RvIHhodHRwOworCisgICAgaWYgKGh0dHBfYWN0aW9uID09IEhUVFBfT1BOKSB7CisgICAgICAgIHggPSAoaHR0cF9vcGVuKGh0dHBfaG9zdCxodHRwX3NydixodHRwX3NzbCxyZG5zLDEyOCxodHRwX2FnZW50KSA9PSAwKTsKKyAgICAgICAgaWYgKHgpIHsKKyAgICAgICAgICAgIGlmICghcXVpZXQpIHsKKyAgICAgICAgICAgICAgaWYgKHJkbnNbMF0pCisgICAgICAgICAgICAgICAgcHJpbnRmKCJDb25uZWN0ZWQgdG8gJXMgWyVzXVxyXG4iLGh0dHBfaG9zdCxyZG5zKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiQ29ubmVjdGVkIHRvICVzXHJcbiIsaHR0cF9ob3N0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChodHRwX2FnZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGh0dHBfZF9hZ2VudCkKKwkJICBmcmVlKGh0dHBfZF9hZ2VudCk7CisgICAgICAgICAgICAgICAgaHR0cF9kX2FnZW50ID0gaHR0cF9hZ2VudDsKKyAgICAgICAgICAgICAgICBodHRwX2FnZW50ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChodHRwX3VzZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoaHR0cF9kX3VzZXIpCisJCSAgZnJlZShodHRwX2RfdXNlcik7CisgICAgICAgICAgICAgICAgaHR0cF9kX3VzZXIgPSBodHRwX3VzZXI7CisgICAgICAgICAgICAgICAgaHR0cF91c2VyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChodHRwX3Bhc3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoaHR0cF9kX3Bhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGh0dHBfZF9wYXNzLDAsc3RybGVuKGh0dHBfZF9wYXNzKSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoaHR0cF9kX3Bhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBodHRwX2RfcGFzcyA9IGh0dHBfcGFzczsKKyAgICAgICAgICAgICAgICBodHRwX3Bhc3MgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHR0cF9kX3R5cGUgPSBodHRwX3R5cGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIXF1aWV0KQorCSAgICAgIHByaW50ZigiP0hUVFAgQ29ubmVjdGlvbiBmYWlsZWQuXHJcbiIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChodHRwX2FjdGlvbiA9PSBIVFRQX0NMUykgeworICAgICAgICBpZiAoaHR0cF9kX2FnZW50KSB7CisgICAgICAgICAgICBmcmVlKGh0dHBfZF9hZ2VudCk7CisgICAgICAgICAgICBodHRwX2RfYWdlbnQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChodHRwX2RfdXNlcikgeworICAgICAgICAgICAgZnJlZShodHRwX2RfdXNlcik7CisgICAgICAgICAgICBodHRwX2RfdXNlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGh0dHBfZF9wYXNzKSB7CisgICAgICAgICAgICBtZW1zZXQoaHR0cF9kX3Bhc3MsMCxzdHJsZW4oaHR0cF9kX3Bhc3MpKTsKKyAgICAgICAgICAgIGZyZWUoaHR0cF9kX3Bhc3MpOworICAgICAgICAgICAgaHR0cF9kX3Bhc3MgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGh0dHBfZF90eXBlID0gMDsKKyAgICAgICAgeCA9IChodHRwX2Nsb3NlKCkgPT0gMCk7CisgICAgfQorICAgIGlmICgoaHR0cF9hY3Rpb24gIT0gSFRUUF9DTFMpICYmCisJKGh0dHBfYWN0aW9uICE9IEhUVFBfQ09OKSAmJiBodHRwX3JmaWxlKSB7IC8qIFJlbW90ZSBmaWxlIGlzIFVSTD8gKi8KKworCS8qIEFsbC1pbi1vbmUgYWN0aW9ucyB3aGVuIGEgVVJMIGlzIGdpdmVuLi4uICovCisKKyNpZmRlZiBDS19VUkwKKwlpZiAodXJscGFyc2UoaHR0cF9yZmlsZSwmaHR0cF91cmwpID4gMCkgeyAvKiBIYXZlIFVSTD8gKi8KKwkgICAgaWYgKGNrc3RyY21wKGh0dHBfdXJsLnN2YywiaHR0cCIsLTEsMCkgJiYgLyogSXQncyBhbiBIVFRQIFVSTD8gKi8KKwkJY2tzdHJjbXAoaHR0cF91cmwuc3ZjLCJodHRwcyIsLTEsMCkpIHsKKwkJcHJpbnRmKCI/Tm9uLUhUVFAgVVJMXG4iKTsKKwkJeCA9IC05OworCQlnb3RvIHhodHRwOworCSAgICB9IGVsc2UgewkJCS8qIFllcywgY29sbGVjdCB0aGUgcGllY2VzICovCisJCW1ha2VzdHIoJmh0dHBfc3J2LCBodHRwX3VybC5zdmMpOworCQltYWtlc3RyKCZodHRwX3VzZXIsaHR0cF91cmwudXNyKTsKKwkJbWFrZXN0cigmaHR0cF9wYXNzLGh0dHBfdXJsLnBzdyk7CisJCW1ha2VzdHIoJmh0dHBfaG9zdCxodHRwX3VybC5ob3MpOworCQlpZiAoaHR0cF91cmwucG9yKQorCQkgIG1ha2VzdHIoJmh0dHBfc3J2LGh0dHBfdXJsLnBvcik7CisJCW1ha2VzdHIoJmh0dHBfcmZpbGUsaHR0cF91cmwucHRoKTsKKwkgICAgfQorCSAgICBpZiAoIWh0dHBfcmZpbGUpIHsJCS8qIFN0aWxsIGhhdmUgYSBwYXRoPyAqLworICAgICAgICAgICAgICAgIG1ha2VzdHIoJmh0dHBfcmZpbGUsIi8iKTsKKwkgICAgfQorCSAgICBpZiAoIWNrc3RyY21wKCJodHRwcyIsaHR0cF9zcnYsLTEsMCkgfHwgLyogQ2hlY2sgZm9yIFNTTC9UTFMgKi8KKwkJIWNrc3RyY21wKCI0NDMiLGh0dHBfc3J2LC0xLDApKQorCSAgICAgIGh0dHBfc3NsID0gMTsKKwkgICAgaWYgKGh0dHBfaXNjb25uZWN0ZWQoKSkJLyogQ2xvc2UgYW55IG9wZW4gSFRUUCBjb25uZWN0aW9uICovCisJICAgICAgaHR0cF9jbG9zZSgpOworCSAgICBpZiAoaHR0cF9wYXNzID09IE5VTEwgJiYgaHR0cF9kX3Bhc3MgIT0gTlVMTCkKKwkgICAgICBtYWtlc3RyKCZodHRwX3Bhc3MsaHR0cF9kX3Bhc3MpOworCSAgICB4ID0gKGh0dHBfb3BlbihodHRwX2hvc3QsCisJCQkgICBodHRwX3NydixodHRwX3NzbCxyZG5zLDEyOCxodHRwX2RfYWdlbnQpID09IDApOworCSAgICBpZiAoeCA8IDApIHsKKwkJeCA9IDA7CisJCWdvdG8geGh0dHA7CisJICAgIH0KKwkgICAgYWxsaW5vbmUgPSAxOworCX0KKyNlbmRpZiAvKiBDS19VUkwgKi8KKyAgICAgICAgaWYgKGh0dHBfcGFzcyA9PSBOVUxMICYmIGh0dHBfZF9wYXNzICE9IE5VTEwpCisJICBtYWtlc3RyKCZodHRwX3Bhc3MsaHR0cF9kX3Bhc3MpOworCisJaWYgKGh0dHBfYWN0aW9uID09IEhUVFBfT1BOICYmIGFsbGlub25lKSB7CisJICAgIGh0dHBfYWN0aW9uID0gSFRUUF9HRVQ7CisJfQorICAgICAgICB4ID0geGRvaHR0cChodHRwX2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgaHR0cF9sZmlsZSwKKwkJICAgIGh0dHBfcmZpbGUsCisgICAgICAgICAgICAgICAgICAgIGh0dHBfZGZpbGUsCisJCSAgICBodHRwX2FnZW50ID8gaHR0cF9hZ2VudCA6IGh0dHBfZF9hZ2VudCwKKwkJICAgIGh0dHBfaGRyLAorCQkgICAgaHR0cF91c2VyICA/IGh0dHBfdXNlciAgOiBodHRwX2RfdXNlciwKKwkJICAgIGh0dHBfcGFzcyAgPyBodHRwX3Bhc3MgIDogaHR0cF9kX3Bhc3MsCisJCSAgICBodHRwX21pbWUsCisJCSAgICBodHRwX2FycmF5LAorCQkgICAgaHR0cF90eXBlCisJCSAgICApOworCWlmIChhbGxpbm9uZSkKKwkgIHggPSAoaHR0cF9jbG9zZSgpID09IDApOworICAgIH0KKworICB4aHR0cDoKKyAgICBpZiAoaHR0cF9hZ2VudCkgZnJlZShodHRwX2FnZW50KTsKKyAgICBpZiAoaHR0cF9oZHIpICAgZnJlZShodHRwX2hkcik7CisgICAgaWYgKGh0dHBfdXNlcikgIGZyZWUoaHR0cF91c2VyKTsKKyAgICBpZiAoaHR0cF9wYXNzKSB7CisgICAgICAgIG1lbXNldChodHRwX3Bhc3MsMCxzdHJsZW4oaHR0cF9wYXNzKSk7CisgICAgICAgIGZyZWUoaHR0cF9wYXNzKTsKKyAgICB9CisgICAgaWYgKGh0dHBfbWltZSkgIGZyZWUoaHR0cF9taW1lKTsKKyAgICBpZiAoaHR0cF9sZmlsZSkgZnJlZShodHRwX2xmaWxlKTsKKyAgICBpZiAoaHR0cF9yZmlsZSkgZnJlZShodHRwX3JmaWxlKTsKKyAgICBpZiAoaHR0cF9kZmlsZSkgZnJlZShodHRwX2RmaWxlKTsKKyAgICBpZiAoaHR0cF9ob3N0KSAgZnJlZShodHRwX2hvc3QpOworICAgIGlmIChodHRwX3NydikgICBmcmVlKGh0dHBfc3J2KTsKKworICAgIGlmICh4ID4gLTEpCisgICAgICBzdWNjZXNzID0geDsKKyAgICByZXR1cm4oeCk7Cit9CisjZW5kaWYgLyogVENQU09DS0VUICovCisjZW5kaWYgLyogTk9IVFRQICovCisKKworI2lmbmRlZiBOT1NQTAorc3RhdGljIGludAorZG90cmFjZSgpIHsKKyAgICBpbnQgb24gPSAxOworICAgIHN0cnVjdCBGREIgc3csIGt3OworICAgIGNtZmRiaSgmc3csCQkJCS8qIDFzdCBGREIgLSBzd2l0Y2ggKi8KKwkgICBfQ01LRVksCQkJLyogZmNvZGUgKi8KKwkgICAiVHJhY2Ugb2JqZWN0O1xuIE9yIHN3aXRjaCIsIC8qIGhlbHAgKi8KKwkgICAiIiwJCQkJLyogZGVmYXVsdCAqLworCSAgICIiLAkJCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCSAgIDIsCQkJCS8qIGtleXdvcmQgdGFibGUgc2l6ZSAqLworCSAgIDQsCQkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKwkgICB4eHN0cmluZywJCQkvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisJICAgb25vZmZzdywJCQkvKiBLZXl3b3JkIHRhYmxlICovCisJICAgJmt3CQkJCS8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKwkgICApOworICAgIGNtZmRiaSgma3csCQkJCS8qIDJuZCBGREIgLSBUcmFjZSBvYmplY3QgKi8KKwkgICBfQ01LRVksCQkJLyogZmNvZGUgKi8KKwkgICAiVHJhY2Ugb2JqZWN0IiwJCS8qIGhlbHAgKi8KKwkgICAiYWxsIiwJCQkvKiBkZWZhdWx0ICovCisJICAgIiIsCQkJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJICAgbnRyYWNldGFiLAkJCS8qIGtleXdvcmQgdGFibGUgc2l6ZSAqLworCSAgIDAsCQkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiAwID0ga2V5d29yZCAqLworCSAgIHh4c3RyaW5nLAkJCS8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKwkgICB0cmFjZXRhYiwJCQkvKiBLZXl3b3JkIHRhYmxlICovCisJICAgTlVMTAkJCQkvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisJICAgKTsKKyAgICBpZiAoKHggPSBjbWZkYigmc3cpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisgICAgaWYgKGNtcmVzdWx0LmZkYmFkZHIgPT0gJnN3KSB7CisJb24gPSBjbXJlc3VsdC5ucmVzdWx0OworCWlmICgoeCA9IGNta2V5KHRyYWNldGFiLCBudHJhY2V0YWIsIiIsImFsbCIseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeCk7CisgICAgfSBlbHNlIHsKKwl4ID0gY21yZXN1bHQubnJlc3VsdDsKKyAgICB9CisgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHkpOworCisgICAgc3dpdGNoICh4KSB7CisgICAgICBjYXNlIFRSQV9BU0c6CisJdHJhX2FzZyA9IG9uOworCWJyZWFrOworICAgICAgY2FzZSBUUkFfQ01EOgorCXRyYV9jbWQgPSBvbjsKKwlicmVhazsKKyAgICAgIGNhc2UgVFJBX0FMTDoKKwl0cmFfYXNnID0gb247CisJdHJhX2NtZCA9IG9uOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlyZXR1cm4oLTIpOworICAgIH0KKyAgICBwcmludGYoIlRSQUNFICVzXG4iLCBvbiA/ICJPTiIgOiAiT0ZGIik7CisgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKK30KKyNlbmRpZiAvKiBOT1NQTCAqLworCisKK3N0YXRpYyBpbnQKK2RvcHJvbXB0KCkgeworICAgIGV4dGVybiBpbnQgeGNtZHNyYzsKKyAgICBpZiAoKHggPSBjbXR4dCgiT3B0aW9uYWwgbWVzc2FnZSIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeCk7CisjaWZkZWYgTk9TUEwKKyAgICBwcmludGYoIj9Tb3JyeSwgUFJPTVBUIHJlcXVpcmVzIHNjcmlwdCBwcm9ncmFtbWluZyBsYW5ndWFnZVxuIik7CisgICAgcmV0dXJuKC05KTsKKyNlbHNlCisgICAgZGVidWcoRjEwMSwiUHJvbXB0IGNtZGx2bCIsIiIsY21kbHZsKTsKKyAgICBjbWRsdmwrKzsKKyAgICBpZiAoY21kbHZsID4gQ01EU1RLTCkgeworCXByaW50ZigiP0NvbW1hbmQgc3RhY2sgb3ZlcmZsb3c6ICVkXG4iLGNtZGx2bCk7CisJY21kbHZsLS07CisJcmV0dXJuKC05KTsKKyAgICB9CisgICAgeGNtZHNyYyA9IENNRF9LQjsKKyAgICBjbWRzdGtbY21kbHZsXS5zcmMgPSBDTURfS0I7CS8qIFNheSB3ZSdyZSBhdCB0aGUgcHJvbXB0ICovCisgICAgY21kc3RrW2NtZGx2bF0ubHZsID0gMDsKKyAgICBjbWRzdGtbY21kbHZsXS5jY2ZsZ3MgPSBjbWRzdGtbY21kbHZsLTFdLmNjZmxnczsKKyAgICBpZiAodHJhX2NtZCkKKyAgICAgIHByaW50ZigiWyVkXSArUDogXCIocHJvbXB0KVwiXG4iLGNtZGx2bCk7CisgICAgY29uY2IoKGNoYXIpZXNjYXBlKTsKKyAgICBpZiAoIXF1aWV0KQorICAgICAgcHJpbnRmKAorIihSZWN1cnNpdmUgY29tbWFuZCBwcm9tcHQ6IFJlc3VtZSBzY3JpcHQgd2l0aCBDT05USU5VRSwgU1RPUCB0byBzdG9wLi4uKVxuIgorICAgICAgICAgICAgKTsKKyAgICBpZiAoKnMpIHsJCQkJLyogSWYgcHJvbXB0IGdpdmVuICovCisJbWFrZXN0cigmKHByc3RyaW5nW2NtZGx2bC0xXSksY21nZXRwKCkpOyAvKiBTYXZlIGN1cnJlbnQgcHJvbXB0ICovCisJY21zZXRwKHMpOwkJCS8qIFNldCBuZXcgb25lICovCisgICAgfQorICAgIHJldHVybihzdWNjZXNzID0gMSk7CisjZW5kaWYgLyogTk9TUEwgKi8KK30KKworI2lmZGVmIENLTEVBUk4KK1ZPSUQKK2xlYXJuY21kKHMpIGNoYXIgKnM7IHsJCQkvKiBSZWNvcmQgY29tbWFuZHMgaW4gbGVhcm5lZCBzY3JpcHQgKi8KKyAgICBjaGFyIGJ1Zls2NF07CisgICAgaW50IGksIGs7CisgICAgaWYgKGxlYXJuZnAgJiYgbGVhcm5pbmcpIHsJCS8qIE9ubHkgaWYgb3BlbiBhbmQgb24gKi8KKwlrID0gY2tzdHJuY3B5KGJ1ZixzLDY0KTsKKwlmb3IgKGkgPSAwOyBpIDwgazsgaSsrKSB7CS8qIEdldCB0b3AtbGV2ZWwgY29tbWFuZCBrZXl3b3JkICovCisJICAgIGlmIChidWZbaV0gPD0gU1ApIHsKKwkJYnVmW2ldID0gTlVMOworCQlicmVhazsKKwkgICAgfQorCX0KKwlrID0gbG9va3VwKGNtZHRhYixidWYsbmNtZCxOVUxMKTsgLyogTG9vayBpdCB1cCAqLworCWlmIChrID09IFhYQ09OIHx8IGsgPT0gWFhMRUFSTikJICAvKiBEb24ndCByZWNvcmQgQ09OTkVDVCBvciBMRUFSTiAqLworCSAgcmV0dXJuOworCWlmIChrID09IFhYVEVMKSB7CisJICAgIGZwdXRzKCJTRVQgSE9TVCAvTkVUV09SSzpUQ1AiLGxlYXJuZnApOworCSAgICBmcHV0cygmc1tpXSxsZWFybmZwKTsKKwkgICAgZnB1dHMoIiBURUxORVQgL1RFTE5FVCIsbGVhcm5mcCk7CisJICAgIGZwdXRzKCJcbklGIEZBSUwgU1RPUCAxIENvbm5lY3Rpb24gZmFpbGVkXG4iLGxlYXJuZnApOworCX0gZWxzZSB7CisJICAgIGZwdXRzKHMsbGVhcm5mcCk7CisJICAgIGZwdXRzKCJcbiIsbGVhcm5mcCk7CisJfQorICAgIH0KK30KKyNlbmRpZiAvKiBDS0xFQVJOICovCisKKworLyogIEQgTyBDIE0gRCAgLS0gIERvIGEgY29tbWFuZCAgKi8KKworLyoKKyBSZXR1cm5zOgorICAgLTI6IHVzZXIgdHlwZWQgYW4gaWxsZWdhbCBjb21tYW5kCisgICAtMTogcmVwYXJzZSBuZWVkZWQKKyAgICAwOiBwYXJzZSB3YXMgc3VjY2Vzc2Z1bCAoZXZlbiB0aG8gY29tbWFuZCBtYXkgaGF2ZSBmYWlsZWQpLgorKi8KKyNpZmRlZiBERUJVRworaW50IGNtZHN0YXRzWzI1Nl0gPSB7IC0xLCAtMSB9OworI2VuZGlmIC8qIERFQlVHICovCisKK2ludAorZG9jbWQoY3gpIGludCBjeDsgeworICAgIGV4dGVybiBpbnQgbm9sb2NhbCwgY21rd2ZsZ3M7CisKKyAgICBkZWJ1ZyhGMTAxLCJkb2NtZCBlbnRyeSwgY3giLCIiLGN4KTsKKyAgICBhY3RpdmVjbWQgPSBjeDsKKyAgICBkb2NvbnggPSAoKGFjdGl2ZWNtZCA9PSBYWENPTikgIHx8IChhY3RpdmVjbWQgPT0gWFhURUwpIHx8CisJICAgICAgKGFjdGl2ZWNtZCA9PSBYWFJMT0cpIHx8IChhY3RpdmVjbWQgPT0gWFhQSVBFKSB8fAorICAgICAgICAgICAgICAoYWN0aXZlY21kID09IFhYSUtTRCkgfHwgKGFjdGl2ZWNtZCA9PSBYWFBUWSkpOworLyoKKyAgT3JpZ2luYWxseSBhbGwgY29tbWFuZHMgd2VyZSBoYW5kbGVkIHdpdGggYSBiaWcgc3dpdGNoKCkgc3RhdGVtZW50LAorICBidXQgZXZlbnR1YWxseSB0aGlzIHN0YXJ0ZWQgYmxvd2luZyB1cCBjb21waWxlcnMuICBOb3cgd2UgaGF2ZSBhIHNlcmllcworICBvZiBzZXBhcmF0ZSBpZiBzdGF0ZW1lbnRzIGFuZCBzbWFsbCBzd2l0Y2hlcywgd2l0aCB0aGUgY29tbWFuZHMgdGhhdCBhcmUKKyAgbW9zdCBjb21tb25seSBleGVjdXRlZCBpbiBzY2lwdHMgYW5kIGxvb3BzIGNvbWluZyBmaXJzdCwgdG8gc3BlZWQgdXAKKyAgY29tcHV0ZS1ib3VuZCBzY3JpcHRzLgorICAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoY21kc3RhdHNbMF0gPT0gLTEpIHsJCS8qIENvdW50IGNvbW1hbmRzICovCisJaW50IGk7CQkJCS8qIGZvciB0dW5pbmcuLi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJICBjbWRzdGF0c1tpXSA9IDA7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyAgICBzd2l0Y2ggKGN4KSB7CisgICAgICBjYXNlIC00OgkJCQkvKiBFT0YgKi8KKyNpZmRlZiBPU0sKKwlpZiAobXNnZmxnKSAgcHJpbnRmKCJcbiIpOworI2Vsc2UKKwlpZiAobXNnZmxnKSAgcHJpbnRmKCJcclxuIik7CisjZW5kaWYgLyogT1NLICovCisJICBkb2V4aXQoR09PRF9FWElULHhpdHN0YSk7CisgICAgICBjYXNlIC0zOgkJCQkvKiBOdWxsIGNvbW1hbmQgKi8KKwlyZXR1cm4oMCk7CisgICAgICBjYXNlIC05OgkJCQkvKiBMaWtlIC0yLCBidXQgZXJybXNnIGFscmVhZHkgZG9uZSAqLworICAgICAgY2FzZSAtMToJCQkJLyogUmVwYXJzZSBuZWVkZWQgKi8KKwlyZXR1cm4oY3gpOworICAgICAgY2FzZSAtNjoJCQkJLyogU3BlY2lhbCAqLworICAgICAgY2FzZSAtMjoJCQkJLyogRXJyb3IsIG1heWJlICovCisKKyNpZm5kZWYgTk9TUEwKKy8qCisgIE1heWJlIHRoZXkgdHlwZWQgYSBtYWNybyBuYW1lLiAgTGV0J3MgbG9vayBpdCB1cCBhbmQgc2VlLgorKi8KKwlpZiAoY3ggPT0gLTYpCQkJLyogSWYgdGhleSB0eXBlZCBDUiAqLworCSAgY2tzdHJuY2F0KGNtZGJ1ZiwiXDAxNSIsQ01EQkwpOyAvKiAgYWRkIGl0IGJhY2sgdG8gY29tbWFuZCBidWZmZXIuICovCisJaWYgKGlmY21kW2NtZGx2bF0gPT0gMikJCS8qIFdhdGNoIG91dCBmb3IgSUYgY29tbWFuZHMuICovCisJICBpZmNtZFtjbWRsdmxdLS07CisJcmVwYXJzID0gMTsJCQkvKiBGb3JjZSByZXBhcnNlICovCisJY21yZXMoKTsKKwljeCA9IFhYRE87CQkJLyogVHJ5IERPIGNvbW1hbmQgKi8KKyNlbHNlCisJcmV0dXJuKGN4KTsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgZGVmYXVsdDoKKwlpZiAoY3ggPCAwKQorCSAgcmV0dXJuKGN4KTsKKwlicmVhazsKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBpZiAoY3ggPCAyNTYpCisgICAgICBjbWRzdGF0c1tjeF0rKzsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgICAgaWYgKChjbWt3ZmxncyAmIENNX1BTSCkKKyNpZm5kZWYgTk9QVVNICisJJiYgbm9wdXNoCisjZW5kaWYgLyogTk9QVVNIICovCisJKSB7CisJcHJpbnRmKCI/QWNjZXNzIHRvIHN5c3RlbSBkaXNhYmxlZFxuIik7CisJcmV0dXJuKC05KTsKKyAgICB9CisgICAgaWYgKChjbWt3ZmxncyAmIENNX0xPQykKKyNpZm5kZWYgTk9MT0NBTAorCSYmIG5vbG9jYWwKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisJKSB7CisJcHJpbnRmKCI/Q29ubmVjdGlvbnMgZGlzYWJsZWRcbiIpOworCXJldHVybigtOSk7CisgICAgfQorCisjaWZuZGVmIE5PU1BMCisgICAgLyogVXNlZCBpbiBGT1IgbG9vcHMgKi8KKworICAgIGlmIChjeCA9PSBYWF9JTkNSIHx8IGN4ID09IFhYSU5DICB8fCAvKiBfSU5DUkVNRU5ULCBJTkNSRU1FTlQgKi8KKwljeCA9PSBYWF9ERUNSIHx8IGN4ID09IFhYREVDKQkgLyogX0RFQ1JFTUVOVCwgREVDUkVNRU5UICovCisgICAgICByZXR1cm4oZG9pbmNyKGN4KSk7CisKKyAgICAvKiBEZWZpbmUgKG9yIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZikgYSBtYWNybyBvciB2YXJpYWJsZSAqLworCisgICAgaWYgKGN4ID09IFhYVU5ERUYgfHwgY3ggPT0gWFhVTkRGWCkgeworI2lmZGVmIElLU0QKKwlpZiAoaW5zZXJ2ZXIgJiYgIUVOQUJMRUQoZW5fYXNnKSkgeworCSAgICBwcmludGYoIj9Tb3JyeSwgREVGSU5FL0FTU0lHTiBkaXNhYmxlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorI2VuZGlmIC8qIElLU0QgKi8KKwlyZXR1cm4oZG91bmRlZihjeCkpOwkJLyogW19dVU5ERUZJTkUgKi8KKyAgICB9CisgICAgaWYgKGN4ID09IFhYREVGIHx8IGN4ID09IFhYQVNTIHx8CisJY3ggPT0gWFhERlggfHwgY3ggPT0gWFhBU1gpIHsKKyNpZmRlZiBJS1NECisJaWYgKGluc2VydmVyICYmICFFTkFCTEVEKGVuX2FzZykpIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIERFRklORS9BU1NJR04gZGlzYWJsZWRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKyNlbmRpZiAvKiBJS1NEICovCisJaWYgKGF0bWJ1ZlswXSA9PSAnLicgJiYgIWF0bWJ1ZlsxXSkgLyogIi4iIGVudGVyZWQgYXMga2V5d29yZCAqLworCSAgeHhkb3QgPSAxOwkJCS8qIGkuZS4gd2l0aCBzcGFjZSBhZnRlciBpdC4uLiAqLworCXJldHVybihkb2RlZihjeCkpOwkJLyogREVGSU5FLCBBU1NJR04sIGV0Yy4uLiAqLworICAgIH0KKworICAgIC8qIElGLCBXSElMRSwgYW5kIGZyaWVuZHMgICovCisKKyAgICBpZiAoY3ggPT0gWFhJRiB8fCBjeCA9PSBYWElGWCB8fCBjeCA9PSBYWFdISSB8fCBjeCA9PSBYWEFTU0VSKSB7CisJcmV0dXJuKGRvaWYoY3gpKTsKKyAgICB9CisgICAgaWYgKGN4ID09IFhYU1dJVCkgewkJCS8qIFNXSVRDSCAqLworCXJldHVybihkb3N3aXRjaCgpKTsKKyAgICB9CisKKyAgICAvKiBHT1RPLCBGT1JXQVJELCBhbmQgX0ZPUldBUkQgKHVzZWQgaW50ZXJuYWxseSBieSBGT1IsIFdISUxFLCBldGMpICovCisKKyAgICBpZiAoY3ggPT0gWFhHT1RPIHx8IGN4ID09IFhYRldEIHx8IGN4ID09IFhYWEZXRCkgeyAvKiBHT1RPIG9yIEZPUldBUkQgKi8KKwkvKiBOb3RlLCBoZXJlIHdlIGRvbid0IHNldCBTVUNDRVNTL0ZBSUxVUkUgZmxhZyAqLworI2lmZGVmIENPTU1FTlQKKwlpZiAoKHkgPSBjbWZsZCgibGFiZWwiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7CisJICAgIGlmICh5ID09IC0zKSB7CisJCWlmIChjeCAhPSBYWFhGV0QpIHsKKwkJICAgIHByaW50ZigiP0xhYmVsIG5hbWUgcmVxdWlyZWRcbiIpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorCSAgICB9IGVsc2UKKwkgICAgICByZXR1cm4oeSk7CisJfQorCWNrc3RybmNweShsYmxidWYscyxMQkxTSVopOworCWlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworI2Vsc2UKKwlpZiAoKHkgPSBjbXR4dCgibGFiZWwiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7CisJICAgIGlmICh5ID09IC0zKSB7CisJCWlmIChjeCAhPSBYWFhGV0QpIHsKKwkJICAgIHByaW50ZigiP0dPVE86IExhYmVsIG5hbWUgcmVxdWlyZWQ6IFwiJXNcIiBcIiVzXCJcbiIsCisJCQkgICBhdG1idWYsCisJCQkgICBjbWRidWYpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorCSAgICB9IGVsc2UKKwkgICAgICByZXR1cm4oeSk7CisJfQorCWNrc3RybmNweShsYmxidWYsYnJzdHJpcChzKSxMQkxTSVopOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwlzID0gbGJsYnVmOworCWRlYnVnKEYxMTEsIkdPVE8gdGFyZ2V0IixzLGN4KTsKKwlyZXR1cm4oZG9nb3RvKHMsY3gpKTsKKyAgICB9CisgICAgaWYgKGN4ID09IFhYRE8gfHwgY3ggPT0gWFhNQUNSTykgewkvKiBETyAoYSBtYWNybykgKi8KKwljaGFyIG1uYW1lYnVmWzE2XTsJCS8qIChidWZmZXIgZm9yIGNvbnRyb2xsZWQgdGVtcCBuYW1lKSAqLworCXN0cnVjdCBGREIga3csIGZsOworCWludCBteDsJCQkJLyogTWFjcm8gaW5kZXggKG9uIHN0YWNrISkgKi8KKworCWRlYnVnKEYxMDEsIlhYTUFDUk8gMCIsbGluZSxjeCk7CisJaWYgKGN4ID09IFhYRE8pIHsKKwkgICAgaWYgKG5tYWMgPT0gMCkgeworCQlwcmludGYoIlxuP05vIG1hY3JvcyBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuKC05KTsKKwkgICAgfQorCSAgICBmb3IgKHkgPSAwOyB5IDwgbm1hYzsgeSsrKSB7IC8qIGNvcHkgdGhlIG1hY3JvIHRhYmxlIGludG8gYSAqLworCQltYWNrZXlbeV0ua3dkID0gbWFjdGFiW3ldLmt3ZDsgLyogcmVndWxhciBrZXl3b3JkIHRhYmxlICovCisJCW1hY2tleVt5XS5rd3ZhbCA9IHk7CS8qIHdpdGggdmFsdWUgPSBwb2ludGVyIHRvIG1hY3JvIHRibCAqLworCQltYWNrZXlbeV0uZmxncyA9IG1hY3RhYlt5XS5mbGdzOworCSAgICB9CisJICAgIGNtZmRiaSgma3csCQkJLyogRmlyc3QgRkRCIC0gbWFjcm8gbmFtZSAqLworCQkgICBfQ01LRVksCQkvKiBmY29kZSAqLworCQkgICAiTWFjcm8iLAkJLyogaGxwbXNnICovCisJCSAgICIiLAkJCS8qIGRlZmF1bHQgKi8KKwkJICAgIiIsCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkJICAgbm1hYywJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworCQkgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiAwID0gY21rZXkgKi8KKwkJICAgeHhzdHJpbmcsCQkvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisJCSAgIG1hY2tleSwJCS8qIEtleXdvcmQgdGFibGUgKi8KKwkJICAgJmZsCQkJLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworCQkgICApOworCSAgICBjbWZkYmkoJmZsLAkJCS8qIDJuZCBGREIgLSBmb3IgInsiICovCisJCSAgIF9DTUZMRCwJCS8qIGZjb2RlICovCisJCSAgICIiLAkJCS8qIGhscG1zZyAqLworCQkgICAiIiwKKwkJICAgIiIsCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkJICAgMCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworCQkgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisJCSAgIHh4c3RyaW5nLAorCQkgICBOVUxMLAorCQkgICBOVUxMCisJCSAgICk7CisJICAgIHggPSBjbWZkYigma3cpOwkJLyogUGFyc2Ugc29tZXRoaW5nICovCisJICAgIGlmICh4IDwgMCkgewkJLyogRXJyb3IgKi8KKwkJaWYgKHggPT0gLTMpIHsKKwkJICAgIHByaW50ZigiP01hY3JvIG5hbWUgcmVxdWlyZWRcbiIpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfSBlbHNlCisJCSAgcmV0dXJuKHgpOworCSAgICB9CisJICAgIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01LRVkpIHsKKwkJZXh0ZXJuIGludCBtdGNoYW5nZWQ7CisJCWNoYXIgKiBtYWNyb25hbWUgPSBOVUxMOworCisJICAgIC8qIEluIGNhc2UgYXJncyBpbmNsdWRlIGFuIFxmZXhlYygpIHRoYXQgY2hhbmdlcyB0aGUgbWFjcm8gdGFibGUgKi8KKworCQlteCA9IHg7CQkJLyogU2F2ZSBtYWNybyBpbmRleCBvbiBzdGFjayAqLworCQltdGNoYW5nZWQgPSAwOwkJLyogTWFyayBzdGF0ZSBvZiBtYWNybyB0YWJsZSAqLworCQltYWtlc3RyKCZtYWNyb25hbWUsbWFjdGFiW214XS5rd2QpOyAvKiBTYXZlIG5hbWUgKi8KKworCQlpZiAoKHkgPSBjbXR4dCgib3B0aW9uYWwgYXJndW1lbnRzIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkJICByZXR1cm4oeSk7CQkvKiBHZXQgbWFjcm8gYXJncyAqLworCisJCWlmIChtdGNoYW5nZWQpIHsJLyogTWFjcm8gdGFibGUgY2hhbmdlZD8gKi8KKwkJICAgIG14ID0gbWxvb2sobWFjdGFiLG1hY3JvbmFtZSxubWFjKTsgLyogTG9vayB1cCBuYW1lIGFnYWluICovCisJCX0KKwkJaWYgKG1hY3JvbmFtZSkKKwkJICBmcmVlKG1hY3JvbmFtZSk7CisKKwkJcmV0dXJuKGRvZG8obXgscyxjbWRzdGtbY21kbHZsXS5jY2ZsZ3MpIDwgMSA/CisJCSAgICAgICAoc3VjY2VzcyA9IDApIDogMSk7CisJICAgIH0KKwkgICAgY2tzdHJuY3B5KGxpbmUsY21yZXN1bHQuc3Jlc3VsdCxMSU5CVUZTSVopOwkvKiBfQ01GTEQgKi8KKwkgICAgaWYgKGF0bWJ1ZlswXSA9PSAneycpIHsKKwkJaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorCQkgIHJldHVybih5KTsKKwkgICAgfQorCX0gZWxzZSB7CQkJLyogWFhNQUNSTyAoImltbWVkaWF0ZSBtYWNybyIpICovCisJICAgIGludCBrID0gMDsKKwkgICAgbGluZVtrKytdID0gJ3snOworCSAgICBsaW5lW2srK10gPSBTUDsKKwkgICAgbGluZVtrXSA9IE5VTDsKKwkgICAgZGVidWcoRjExMSwiWFhNQUNSTyBBIixsaW5lLGspOworCSAgICAvKiBEZWZlciBldmFsdWF0aW9uIG9mIHZhcmlhYmxlcyB1bnRpbCB0aGUgY29tbWFuZHMgYXJlIGV4ZWMnZCAqLworCSAgICBpZiAoKHkgPSBjbXR4dCgiQnJhY2VkIGxpc3Qgb2YgY29tbWFuZHMiLCIiLCZzLE5VTEwpKSA8IDApCisJICAgICAgcmV0dXJuKHkpOworCSAgICBrID0gY2tzdHJuY3B5KGxpbmUrayxzLExJTkJVRlNJWi1rKTsKKwkgICAgZGVidWcoRjExMSwiWFhNQUNSTyBCIixsaW5lLGspOworCX0KKwl4ID0gc3RybGVuKGxpbmUpOworCWlmICgobGluZVswXSA9PSAneycgJiYgbGluZVt4LTFdICE9ICd9JykgfHwgbGluZVswXSA9PSAnfScpCisJICByZXR1cm4oLTIpOworCWlmIChsaW5lWzBdICE9ICd7JyAmJiBsaW5lW3gtMV0gIT0gJ30nKSB7CisJICAgIC8qIFVua25vd24gY29tbWFuZC4gIElmIE9OX1VOS05PV05fQ09NTUFORCBtYWNybyBpcyBkZWZpbmVkLCAqLworCSAgICAvKiBwYXJzZSBhcmdzIGFuZCB0aGVuIGV4ZWN1dGUgaXQsIGJ1dCBvbmx5IGlmIGl0IGlzIG5vdCAqLworCSAgICAvKiBhbHJlYWR5IGFjdGl2ZS4gKi8KKwkgICAgaW50IGsgPSAtMTsKKwkgICAgaWYgKCF1bmttYWNybykgeworCQlrID0gbXhsb29rKG1hY3RhYiwib25fdW5rbm93bl9jb21tYW5kIixubWFjKTsKKwkgICAgfQorCSAgICBpZiAoayA+IC0xKSB7CisJCWNrc3RybmNweSh0bXBidWYsYXRtYnVmLFRNUEJVRlNJWik7CisJCXogPSBtYWNsdmw7CQkvKiBTYXZlIHRoZSBjdXJyZW50IG1hY2x2bCAqLworCQlpZiAoKHkgPSBjbXR4dCgidGV4dCIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisJCSAgcmV0dXJuKHkpOworCQlja3N0cm5jYXQodG1wYnVmLCIgIixUTVBCVUZTSVopOworCQlja3N0cm5jYXQodG1wYnVmLHMsVE1QQlVGU0laKTsKKwkJdW5rbWFjcm8gPSAxOworCQlkZWJ1ZyhGMTEwLCJPTl9VTktOT1dOX0NPTU1BTkQiLHMsMCk7CisJCWRvZG8oayx0bXBidWYsY21kc3RrW2NtZGx2bF0uY2NmbGdzKTsgLyogUnVuIHRoZSBtYWNybyAqLworCQl3aGlsZSAobWFjbHZsID4geikgeworCQkgICAgc3N0YXRlID0gKENIQVIpIHBhcnNlcigxKTsKKwkJICAgIGlmIChzc3RhdGUpIHByb3RvKCk7CisJCX0KKwkJZGVidWcoRjEwMSwiVU5LTUFDIGxvb3AgZXhpdCBtYWNsdmwiLCIiLG1hY2x2bCk7CisJCXVua21hY3JvID0gMDsKKwkJcmV0dXJuKHN1Y2Nlc3MpOworCSAgICB9CisgICAgICAgICAgICBpZiAoeCA+IDApCisJICAgICAgcHJpbnRmKCI/Tm90IGEgY29tbWFuZCBvciBtYWNybyBuYW1lOiBcIiVzXCJcbiIsbGluZSk7CisgICAgICAgICAgICBlbHNlCisJICAgICAgcHJpbnRmKCI/Tm90IGEgY29tbWFuZCBvciBtYWNybyBuYW1lLlxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCXMgPSBicnN0cmlwKGxpbmUpOworCXNwcmludGYobW5hbWVidWYsIiAuLnRtcDolMDNkIixjbWRsdmwpOwkvKiBzYWZlICgxNikgKi8KKwl4ID0gYWRkbWFjKG1uYW1lYnVmLHMpOworCXJldHVybihkb2RvKHgsTlVMTCxjbWRzdGtbY21kbHZsXS5jY2ZsZ3MpIDwgMSA/IChzdWNjZXNzID0gMCkgOiAxKTsKKyAgICB9CisKKyAgICBpZiAoY3ggPT0gWFhMQkwpIHsJCQkvKiBMQUJFTCAqLworCWlmICgoeCA9IGNtZmxkKCJsYWJlbCIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKwkgICAgaWYgKHggPT0gLTMpIHsKKyNpZmRlZiBDT01NRU5UCisJCXByaW50ZigiP0xBQkVMOiBMYWJlbCBuYW1lIHJlcXVpcmVkOiBcIiVzXCJcbiIsIGNtZGJ1Zik7CisJCXJldHVybigtOSk7CisjZWxzZQorCQlzID0gIiI7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCSAgICB9IGVsc2UgcmV0dXJuKHgpOworCisJfQorCWRlYnVnKEYxMTEsIkxBQkVMIixzLHgpOworCWlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworCXJldHVybigwKTsKKyAgICB9CisKKyAgICBpZiAoY3ggPT0gWFhFVkFMIHx8IGN4ID09IFhYX0VWQUwpIC8qIF9FVkFMVUFURSwgIEVWQUxVQVRFICAqLworICAgICAgcmV0dXJuKGRvZXZhbChjeCkpOworCisjaWZuZGVmIE5PU0VYUAorICAgIGlmIChjeCA9PSBYWFNFWFApIHsJCQkvKiBMaXNwLWxpa2UgUy1FeHByZXNzaW9uICovCisJc3RydWN0IHN0cmluZ2FycmF5ICogcTsKKwljaGFyIC8qICpwLCAqciwgKi8gKnRtcCwgKm07CisJaW50IGksIGssIG4sIHF1b3RlID0gMCwgY29udGQgPSAwLCBzaXplID0gMCwgbGVuID0gMDsKKwlleHRlcm4gaW50IHNleHByYywgc2V4cHB2OworCisJdG1wID0gdG1wYnVmOwkJCS8qIEJ1ZmZlciB0byBjb2xsZWN0IFNFWFAgKi8KKwl0bXBidWZbMF0gPSBOVUw7CQkvKiBDbGVhciBpdCAqLworCXNpemUgPSBUTVBCVUZTSVo7CQkvKiBDYXBhY2l0eSBvZiBidWZmZXIgKi8KKwlzZXhwcmMgPSAtMTsJCQkvKiBBc3N1bWUgYmFkIGlucHV0ICovCisJbiA9IDA7CQkJCS8qIFBhcmVuIGJhbGFuY2UgY291bnRlciAqLworCisJd2hpbGUgKDEpIHsJCQkvKiBBbGxvdyBTRVhQIG9uIG11bHRpcGxlIGxpbmVzICovCisJICAgIG0gPSBjb250ZCA/CisJICAgICAgIkNvbnRpbnVhdGlvbiBvZiBTLUV4cHJlc3Npb24iIDoKKwkJIlMtRXhwcmVzc2lvbiAoXCJoZWxwIHNleHBcIiBmb3IgZGV0YWlscykiOworCSAgICB4ID0gY210eHQobSwiIiwmcyx4eHN0cmluZyk7CisJICAgIGlmICh4IDwgMCkKKwkgICAgICByZXR1cm4oeCk7CisJICAgIGlmICghKnMpCQkJLyogTmVlZGVkIGZvciAoPSkgYW5kICg6KSAqLworCSAgICAgIHMgPSBhdG1idWY7CisJICAgIGsgPSBja21ha21zZyh0bXAsIHNpemUsIGNvbnRkID8gIiAiIDogIigiLCBzLCBOVUxMLCBOVUxMKTsKKwkgICAgaWYgKGsgPCAxKSB7CisJCXByaW50ZigiP1NFWFAgdG9vIGxvbmcgLSAlZCBtYXhcbiIsVE1QQlVGU0laKTsKKwkJcmV0dXJuKC05KTsKKwkgICAgfQorCSAgICBkZWJ1ZyhGMTExLGNvbnRkID8gInNleHAgY29udGQiIDogInNleHAiLHMsayk7CisKKwkgICAgZm9yIChpID0gbGVuOyBpIDwgbGVuK2s7IGkrKykgeyAvKiBDaGVjayBiYWxhbmNlICAqLworCQlpZiAoIXF1b3RlICYmIHRtcGJ1ZltpXSA9PSBDTURRKSB7CisJCSAgICBxdW90ZSA9IDE7CisJCSAgICBjb250aW51ZTsKKwkJfQorCQlpZiAocXVvdGUpIHsKKwkJICAgIHF1b3RlID0gMDsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJCWlmICh0bXBidWZbaV0gPT0gJygnKQorCQkgIG4rKzsKKwkJZWxzZSBpZiAodG1wYnVmW2ldID09ICcpJykKKwkJICBuLS07CisJICAgIH0KKwkgICAgaWYgKG4gPT0gMCkgewkJLyogQnJlYWsgd2hlbiBiYWxhbmNlZCAqLworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAobiA8IDApIHsJCS8qIFRvbyBtYW55IHJpZ2h0IHBhcmVucyAqLworCQlwcmludGYoIj9VbmJhbGFuY2VkIFMtRXhwcmVzc2lvbjogXCIlc1wiXG4iLHRtcGJ1Zik7CisJCXJldHVybigtOSk7CisJICAgIH0KKwkgICAgY29udGQrKzsJCQkvKiBOZWVkIG1vcmUgcmlnaHQgcGFyZW5zICovCisJICAgIGNtaW5pKGNreGVjaCk7CQkvKiBzbyBrZWVwIHBhcnNpbmcgKi8KKwkgICAgdG1wICs9IGs7CQkJLyogYWRqdXN0IGJ1ZmZlciBwb2ludGVyICovCisJICAgIHNpemUgLT0gazsJCQkvKiBhbmQgY2FwYWNpdHkgKi8KKwkgICAgbGVuICs9IGs7CQkJLyogYW5kIGxlbmd0aCBzbyBmYXIgKi8KKwl9CisJcyA9IHRtcGJ1ZjsKKwltYWtlc3RyKCZsYXN0c2V4cCxzKTsKKwlxID0gY2tzcGxpdCgxLFNFWFBNQVgscyxOVUxMLE5VTEwsOCwwLDApOyAvKiBQcmVjaGVjayBmb3IgPiAxIFNFWFAgKi8KKwlkZWJ1ZyhGMTAxLCJzZXhwIHNwbGl0IiwiIixxLT5hX3NpemUpOworCisJaWYgKHEtPmFfc2l6ZSA9PSAxKSB7CQkvKiBXZSBzaG91bGQgZ2V0IGV4YWN0bHkgb25lIGJhY2sgKi8KKwkgICAgY2hhciAqIHJlc3VsdCwgKiBkb3NleHAoKTsKKwkgICAgc2V4cHJjID0gMDsJCQkvKiBSZXNldCBvdXQtb2YtYmFuZCByZXR1cm4gY29kZSAqLworCSAgICByZXN1bHQgPSBkb3NleHAocyk7CQkvKiBHZXQgcmVzdWx0ICovCisJICAgIGRlYnVnKEYxMTEsInNleHAgcmVzdWx0IixyZXN1bHQsc2V4cHJjKTsKKwkgICAgaWYgKHNleHByYyA9PSAwKSB7CQkvKiBTdWNjZXNzICovCisJCS8qIEVjaG8gdGhlIHJlc3VsdCBpZiBkZXNpcmVkICovCisJCWlmICgoIXhjbWRzcmMgJiYgc2V4cGVjaG8gIT0gU0VUX09GRikgfHwgc2V4cGVjaG8gPT0gU0VUX09OKQorCQkgIHByaW50ZigiICVzXG4iLHJlc3VsdCA/IHJlc3VsdCA6ICIiKTsKKwkJbWFrZXN0cigmc2V4cHZhbCxyZXN1bHQpOworCQlzdWNjZXNzID0gc2V4cHB2ID4gLTEgPyBzZXhwcHYgOiAxOworCQlyZXR1cm4oc3VjY2Vzcyk7CisJICAgIH0KKwl9CisJaWYgKHNleHByYyA8IDApCisJICBwcmludGYoIj9JbnZhbGlkIFMtRXhwcmVzc2lvbjogXCIlc1wiXG4iLGxhc3RzZXhwKTsKKwlyZXR1cm4oLTkpOworICAgIH0KKyNlbmRpZiAvKiBOT1NFWFAgKi8KKworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICBpZiAoY3ggPT0gWFhFQ0ggfHwgY3ggPT0gWFhYRUNIIHx8IGN4ID09IFhYVk9JRAorI2lmbmRlZiBOT1NQTAorCXx8IGN4ID09IFhYQVBDCisjZW5kaWYgLyogTk9TUEwgKi8KKwkpIHsJCQkJLyogRUNITyBvciBBUEMgKi8KKwlpZiAoKHggPSBjbXR4dCgoY3ggPT0gWFhFQ0ggfHwgY3ggPT0gWFhYRUNIKSA/CisJCSAgICAgICAiVGV4dCB0byBiZSBlY2hvZWQiIDoKKwkJICAgICAgICgoY3ggPT0gWFhWT0lEKSA/ICJUZXh0IiA6CisJCQkiQXBwbGljYXRpb24gUHJvZ3JhbSBDb21tYW5kIHRleHQiKSwKKwkJICAgICAgICIiLAorCQkgICAgICAgJnMsCisJCSAgICAgICB4eHN0cmluZworCQkgICAgICAgKQorCSAgICAgKSA8IDApCisJICByZXR1cm4oeCk7CisJaWYgKCFzKSBzID0gIiI7CisjaWZkZWYgQ09NTUVOVAorLyogVGhpcyBpcyB0byBwcmVzZXJ2ZXIgdGhlIHByZS04LjAgYmVoYXZpb3IgYnV0IGl0J3MgdG9vIGNvbmZ1c2luZyAqLworCXggPSBzdHJsZW4ocyk7CisJeCA9ICh4ID4gMSkgPyAoKHNbMF0gPT0gJyInICYmIHNbeC0xXSA9PSAnIicpID8gMSA6IDApIDogMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJcyA9IGJyc3RyaXAocyk7CQkJLyogU3RyaXAgYnJhY2VzIGFuZCBkb3VibGVxdW90ZXMgKi8KKwlpZiAoY3ggPT0gWFhFQ0gpIHsJCS8qIEVDSE8gKi8KKyNpZm5kZWYgTk9TUEwKKwkgICAgaWYgKCFmbmRpYWdzIHx8IGZuc3VjY2VzcykgeworI2VuZGlmIC8qIE5PU1BMICovCisjaWZkZWYgQ09NTUVOVAorCQkvKiBUaGUgImlmICh4KSIgYnVzaW5lc3MgcHJlc2VydmVzIHByZXZpb3VzIGJlaGF2aW9yICovCisJCS8qIGJ5IHB1dHRpbmcgYmFjayB0aGUgZG91YmxlcXVvdGVzIGlmIHRoZXkgd2VyZSBpbmNsdWRlZC4gKi8KKwkJaWYgKHgpCisJCSAgcHJpbnRmKCJcIiVzXCJcbiIscyk7CisJCWVsc2UKKyNlbmRpZiAvKiBDT01NRU5UICovCisJCSAgcHJpbnRmKCIlc1xuIixzKTsKKyNpZm5kZWYgTk9TUEwKKwkgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisJfSBlbHNlIGlmIChjeCA9PSBYWFhFQ0gpIHsJLyogWEVDSE8gKi8KKwkgICAgaWYgKHgpCisJICAgICAgcHJpbnRmKCJcIiVzXCIiLHMpOworCSAgICBlbHNlCisJICAgICAgcHJpbnRmKCIlcyIscyk7CisjaWZkZWYgVU5JWAorCSAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZiAvKiBVTklYICovCisJfSBlbHNlIGlmIChjeCA9PSBYWEFQQykgewkvKiBBUEMgKi8KKyNpZmRlZiBDS19BUEMKKwkgICAgaWYgKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwgfHwKKwkJKGFwY2FjdGl2ZSA9PSBBUENfUkVNT1RFICYmICEoYXBjc3RhdHVzICYgQVBDX1VOQ0gpKSkKKwkgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIENLX0FQQyAqLworCSAgICBpZiAoIWxvY2FsKSB7CisJCXByaW50ZigiJWNfJXMlY1xcIixFU0MscyxFU0MpOworI2lmZGVmIFVOSVgKKwkJZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogVU5JWCAqLworCisJICAgIH0gZWxzZSB7CQkJLyogTG9jYWwgbW9kZSAtIGhhdmUgY29ubmVjdGlvbiAqLworI2lmbmRlZiBOT1NQTAorCQlpZiAoY2ttYWt4bXNnKHRtcGJ1ZiwJLyogRm9ybSBBUEMgc3RyaW5nIGluIGJ1ZmZlciAqLworCQkJICAgICAgVE1QQlVGU0laLAorCQkJICAgICAgY2tjdG9hKChjaGFyKUVTQyksCisJCQkgICAgICBja2N0b2EoJ18nKSwKKwkJCSAgICAgIHMsCisJCQkgICAgICBja2N0b2EoKGNoYXIpRVNDKSwKKwkJCSAgICAgIGNrY3RvYSgnXFwnKSwKKwkJCSAgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwKKwkJCSAgICAgICkgPiAwKQorCQkgIHJldHVybihzdWNjZXNzID0gZG9vdXRwdXQodG1wYnVmLCBYWE9VVCkpOworCQlwcmludGYoIj9Ub28gbG9uZ1xuIik7CisJCXJldHVybigtOSk7CisjZWxzZQorCQlwcmludGYoIiVjXyVzJWNcXCIsRVNDLHMsRVNDKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCSAgICB9CisJfQorCXJldHVybihzdWNjZXNzID0gMSk7CisgICAgfQorCisjaWZuZGVmIE5PU1BMCisvKiBDb3B5IG1hY3JvIGFyZ3MgZnJvbS90byB0d28gbGV2ZWxzIHVwLCB1c2VkIGludGVybmFsbHkgYnkgX2Zsb29wIGV0IGFsLiAqLworICAgIGlmIChjeCA9PSBYWEdUQSB8fCBjeCA9PSBYWFBUQSkgewkvKiBfR0VUQVJHUywgX1BVVEFSR1MgKi8KKwlpbnQgeDsKKwlkZWJ1ZyhGMTAxLCJkb2NtZCBYWEdUQSIsIiIsWFhHVEEpOworCWRlYnVnKEYxMDEsImRvY21kIGN4IiwiIixjeCk7CisJZGVidWcoRjEwMSwiZG9jbWQgWFhHVEEgbWFjbHZsIiwiIixtYWNsdmwpOworCXggPSBkb2d0YShjeCk7CisJZGVidWcoRjEwMSwiZG9jbWQgZG9ndGEgcmV0dXJucyIsIiIseCk7CisJZGVidWcoRjEwMSwiZG9jbWQgZG9ndGEgbWFjbHZsIiwiIixtYWNsdmwpOworCXJldHVybih4KTsKKyAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT1NQTAorI2lmZGVmIENLQ0hBTk5FTElPCisgICAgaWYgKGN4ID09IFhYRklMRSkKKyAgICAgIHJldHVybihkb2ZpbGUoY3gpKTsKKyAgICBlbHNlIGlmIChjeCA9PSBYWEZfUkUgfHwgY3ggPT0gWFhGX1dSIHx8IGN4ID09IFhYRl9PUCB8fAorCSAgICAgY3ggPT0gWFhGX0NMIHx8IGN4ID09IFhYRl9TRSB8fCBjeCA9PSBYWEZfUlcgfHwKKwkgICAgIGN4ID09IFhYRl9GTCB8fCBjeCA9PSBYWEZfTEkgfHwgY3ggPT0gWFhGX1NUIHx8IGN4ID09IFhYRl9DTykKKyAgICAgIHJldHVybihkb2ZpbGUoY3gpKTsKKyNlbmRpZiAvKiBDS0NIQU5ORUxJTyAqLworCisvKiBBU0ssIEFTS1EsIFJFQUQgKi8KKyAgICBpZiAoY3ggPT0gWFhBU0sgIHx8IGN4ID09IFhYQVNLUSB8fCBjeCA9PSBYWFJFQSB8fAorCWN4ID09IFhYUkRCTCB8fCBjeCA9PSBYWEdFVEMgfHwgY3ggPT0gWFhHRVRLKSB7CisJcmV0dXJuKGRvYXNrKGN4KSk7CisgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9GUklMTFMKKyAgICBpZiAoY3ggPT0gWFhCVUcpIHsJCQkvKiBCVUcgKi8KKwlpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKwlyZXR1cm4oZG9idWcoKSk7CisgICAgfQorI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgaWYgKGN4ID09IFhYQllFKSB7CQkJLyogQllFICovCisJZXh0ZXJuIGludCBmdHBfY21kbGluOworCWlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworCisjaWZkZWYgTkVXRlRQCisJaWYgKChmdHBnZXQgPT0gMSkgfHwgKChmdHBnZXQgPT0gMikgJiYgZnRwaXNvcGVuKCkpKSB7CisJICAgIGV4dGVybiBpbnQgc3RheWZsZywgZnRwX2ZhaTsKKwkgICAgc3VjY2VzcyA9IGZ0cGJ5ZSgpOworCSAgICBpZiAoZnRwX2NtZGxpbiAmJiAhc3RheWZsZyAmJiAhbG9jYWwpCisJICAgICAgZG9leGl0KGZ0cF9mYWkgPyBCQURfRVhJVCA6IEdPT0RfRVhJVCwtMSk7CisJICAgIGVsc2UKKwkgICAgICByZXR1cm4oc3VjY2Vzcyk7CisJfQorI2VuZGlmIC8qIE5FV0ZUUCAqLworCisJaWYgKCFsb2NhbCkgeworCSAgICBwcmludGYoIj9ObyBjb25uZWN0aW9uIC0gdXNlIEVYSVQgdG8gcXVpdC5cbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKworI2lmZGVmIENLX1hZWgorCWlmIChwcm90b2NvbCAhPSBQUk9UT19LKSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCBCWUUgb25seSB3b3JrcyB3aXRoIEtlcm1pdCBwcm90b2NvbFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorI2VuZGlmIC8qIENLX1hZWiAqLworCisjaWZkZWYgSUtTX09QVElPTgorICAgICAgICBpZiAoCisjaWZkZWYgQ0tfWFlaCisgICAgICAgICAgICBwcm90b2NvbCA9PSBQUk9UT19LICYmCisjZW5kaWYgLyogQ0tfWFlaICovCisgICAgICAgICAgICAhaWtzX3dhaXQoS0VSTUlUX1JFUV9TVEFSVCwxKSkgeworCSAgICBwcmludGYoCisJICAgICAiP0EgS2VybWl0IFNlcnZlciBpcyBub3QgYXZhaWxhYmxlIHRvIHByb2Nlc3MgdGhpcyBjb21tYW5kXG4iKTsKKwkgICAgcmV0dXJuKC05KTsJCQkvKiBDb3JyZWN0IHRoZSByZXR1cm4gY29kZSAqLworICAgICAgICB9CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCisJYnllX2FjdGl2ZSA9IDE7CisJc3N0YXRlID0gc2V0Z2VuKCdMJywiIiwiIiwiIik7CisJaWYgKGxvY2FsKSB0dGZsdWkoKTsJCS8qIElmIGxvY2FsLCBmbHVzaCB0dHkgaW5wdXQgYnVmZmVyICovCisJcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworICAgIGlmIChjeCA9PSBYWEJFRVApIHsJCQkvKiBCRUVQICovCisgICAgICAgIGludCB4OworI2lmZGVmIE9TMgorCWludCB5OworICAgICAgICBpZiAoKHkgPSBjbWtleShiZWVwdGFiLCBuYmVlcHRhYiwgIndoaWNoIGtpbmQgb2YgYmVlcCIsICJpbmZvcm1hdGlvbiIsCisJCSAgICAgICB4eHN0cmluZykpIDwgMCApCisJICByZXR1cm4gKHkpOworICAgIAlpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgYmxlZXAoKHNob3J0KXkpOwkJLyogeSBpcyBvbmUgb2YgdGhlIEJQXyB2YWx1ZXMgKi8KKyNlbHNlICAvKiBPUzIgKi8KKyAgICAJaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisjaWZuZGVmIE5PU1BMCisgICAgICAgIGJsZWVwKEJQX05PVEUpOworI2Vsc2UKKwlwdXRjaGFyKCdcMDcnKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisjaWZuZGVmIE5PRlJJTExTCisgICAgaWYgKGN4ID09IFhYQ0xFKQkJCS8qIENMRUFSICovCisgICAgICByZXR1cm4oc3VjY2VzcyA9IGRvY2xlYXIoKSk7CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworICAgIGlmIChjeCA9PSBYWENPTSkgewkJCS8qIENPTU1FTlQgKi8KKwlpZiAoKHggPSBjbXR4dCgiVGV4dCBvZiBjb21tZW50IGxpbmUiLCIiLCZzLE5VTEwpKSA8IDApCisJICByZXR1cm4oeCk7CisJLyogRG9uJ3QgY2hhbmdlIFNVQ0NFU1MgZmxhZyBmb3IgdGhpcyBvbmUgKi8KKwlyZXR1cm4oMCk7CisgICAgfQorCisjaWZuZGVmIE5PTE9DQUwKKyAgICBpZiAoY3ggPT0gWFhDT04gfHwgY3ggPT0gWFhDUSkJLyogQ09OTkVDVCBvciBDT05ORUNUIC9RVUlFVExZICovCisgICAgICByZXR1cm4oZG94Y29ubihjeCkpOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmbmRlZiBOT0ZSSUxMUworI2lmZGVmIFpDT1BZCisgICAgaWYgKGN4ID09IFhYQ1BZKSB7CQkJLyogQ09QWSBhIGZpbGUgKi8KKyNpZmRlZiBJS1NECisJaWYgKGluc2VydmVyICYmICFFTkFCTEVEKGVuX2NweSkpIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIENPUFkgaXMgZGlzYWJsZWRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKyNlbmRpZiAvKiBJS1NEICovCisjaWZkZWYgQ0tfQVBDCisJaWYgKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwgfHwKKwkgICAgKGFwY2FjdGl2ZSA9PSBBUENfUkVNT1RFICYmICEoYXBjc3RhdHVzICYgQVBDX1VOQ0gpKQorCSAgICApCisJICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIENLX0FQQyAqLworCXJldHVybihkb2NvcHkoKSk7CisgICAgfQorI2VuZGlmIC8qIFpDT1BZICovCisjaWZkZWYgTlQKKyAgICBpZiAoIGN4ID09IFhYTElOSyApIHsKKyNpZmRlZiBJS1NECisgICAgICAgIGlmIChpbnNlcnZlciAmJiAhRU5BQkxFRChlbl9jcHkpKSB7CisgICAgICAgICAgICBwcmludGYoIj9Tb3JyeSwgTElOSyAoQ09QWSkgaXMgZGlzYWJsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBDS19BUEMKKyAgICAgICAgaWYgKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwgfHwKKyAgICAgICAgICAgIChhcGNhY3RpdmUgPT0gQVBDX1JFTU9URSAmJiAhKGFwY3N0YXR1cyAmIEFQQ19VTkNIKSkKKyAgICAgICAgICAgICkKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIENLX0FQQyAqLworICAgICAgICByZXR1cm4oZG9saW5rKCkpOworICAgIH0KKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyAgICAvKiBDRCBhbmQgZnJpZW5kcyAqLworICAgIGlmIChjeCA9PSBYWENXRCAgfHwgY3ggPT0gWFhDRFVQIHx8IGN4ID09IFhYQkFDSyB8fAorCWN4ID09IFhYTENXRCB8fCBjeCA9PSBYWExDRFUgfHwgY3ggPT0gWFhLQ0QpIHsKKyNpZmRlZiBMT0NVUworCWlmICghbG9jdXMpIHsKKwkgICAgaWYgKGN4ID09IFhYQ1dEKSB7CisjaWZkZWYgTk9YRkVSCisgICAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuKGRvcm10KFhaQ1dEKSk7CisjZW5kaWYgLyogTk9YRkVSICovCisJICAgIH0gZWxzZSBpZiAoY3ggPT0gWFhDRFVQKSB7CisjaWZkZWYgTk9YRkVSCisgICAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuKGRvcm10KFhaQ0RVKSk7CisjZW5kaWYgLyogTk9YRkVSICovCisgICAgICAgICAgICB9CisJfQorI2VuZGlmIC8qIExPQ1VTICovCisjaWZkZWYgSUtTRAorCWlmIChpbnNlcnZlciAmJiAhRU5BQkxFRChlbl9jd2QpKSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCBjaGFuZ2luZyBkaXJlY3RvcmllcyBpcyBkaXNhYmxlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorI2VuZGlmIC8qIElLU0QgKi8KKwlyZXR1cm4oc3VjY2VzcyA9IGRvY2QoY3gpKTsKKyAgICB9CisKKyAgICBpZiAoY3ggPT0gWFhDSEspCQkJLyogQ0hFQ0sgKi8KKyAgICAgIHJldHVybihzdWNjZXNzID0gZG9jaGsoKSk7CisKKyAgICBpZiAoY3ggPT0gWFhDTE8pIHsJCQkvKiBDTE9TRSAqLworCXggPSBjbWtleShjbHN0YWIsbmNscywiXCJDT05ORUNUSU9OXCIsIG9yIGxvZyBvciBmaWxlIHRvIGNsb3NlIiwKKwkJICAiY29ubmVjdGlvbiIseHhzdHJpbmcpOworCWlmICh4ID09IC0zKSB7CisJICAgIHByaW50ZigiP1lvdSBtdXN0IHNheSB3aGljaCBmaWxlIG9yIGxvZ1xuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCWlmICh4IDwgMCkgcmV0dXJuKHgpOworCWlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHkpOworI2lmbmRlZiBOT0xPQ0FMCisJaWYgKHggPT0gOTk5OSkgewkJLyogQ0xPU0UgQ09OTkVDVElPTiAqLworCSAgICB4ID0gY2xzY29ubngoMCk7CisJICAgIHN3aXRjaCAoeCkgeworCSAgICAgIGNhc2UgMDoKKwkJaWYgKG1zZ2ZsZykgcHJpbnRmKCI/Q29ubmVjdGlvbiB3YXMgbm90IG9wZW5cbiIpOworCSAgICAgIGNhc2UgLTE6CisJCXJldHVybigwKTsKKwkgICAgICBjYXNlIDE6CisJCXdoeWNsb3NlZCA9IFdDX0NMT1M7CisJCXJldHVybigxKTsKKwkgICAgfQorCSAgICByZXR1cm4oMCk7CisJfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKwl5ID0gZG9jbHNsb2coeCk7CisJc3VjY2VzcyA9ICh5ID09IDEpOworCXJldHVybihzdWNjZXNzKTsKKyAgICB9CisKKyNpZm5kZWYgTk9TUEwKKyAgICBpZiAoY3ggPT0gWFhEQ0wgfHwgY3ggPT0gWFhVTkRDTCkgewkvKiBERUNMQVJFIGFuIGFycmF5ICovCisJcmV0dXJuKGRvZGNsKGN4KSk7CisgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9ESUFMCisgICAgaWYgKGN4ID09IFhYUkVEICB8fCBjeCA9PSBYWERJQUwgfHwgY3ggPT0gWFhQRElBIHx8CisJY3ggPT0gWFhBTlNXIHx8IGN4ID09IFhYTE9PSykgeyAvKiBESUFMLCBSRURJQUwgZXRjICovCisjaWZkZWYgVk1TCisJZXh0ZXJuIGludCBiYXRjaDsKKyNlbHNlCisjaWZkZWYgVU5JWE9ST1NLCisJZXh0ZXJuIGludCBiYWNrZ3JkOworI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworI2VuZGlmIC8qIFZNUyAqLworCXggPSBkb2RpYWwoY3gpOworCWRlYnVnKEYxMDEsImRvZGlhbCByZXR1cm5zIiwiIix4KTsKKwlpZiAoKGN4ID09IFhYRElBTCB8fCBjeCA9PSBYWFJFRCB8fCBjeCA9PSBYWEFOU1cpICYmCisJICAgICh4ID4gMCkgJiYJCQkvKiBJZiBESUFMIG9yIFJFRElBTCBzdWNjZWVkZWQgKi8KKwkgICAgKGRpYWxzdGEgIT0gRElBX1BBUlQpICYmCS8qIGFuZCBpdCB3YXNuJ3QgcGFydGlhbCAqLworCSAgICAoZGlhbGNvbiA+IDApKSB7CisJICAgIGlmICgoZGlhbGNvbiA9PSAxIHx8CS8qIEFuZCBESUFMIENPTk5FQ1QgaXMgT04sICovCisJCSgoZGlhbGNvbiA9PSAyKSAmJgkvKiBvciBESUFMIENPTk5FQ1QgaXMgQVVUTyAqLworCQkgIXhjbWRzcmMJCS8qIGFuZCB3ZSdyZSBhdCB0b3AgbGV2ZWwuLi4gKi8KKyNpZmRlZiBWTVMKKwkJICYmICFiYXRjaAkJLyogTm90IGlmIHJ1bm5pbmcgZnJvbSBiYXRjaCAqLworI2Vsc2UKKyNpZmRlZiBVTklYT1JPU0sKKwkJICYmICFiYWNrZ3JkCQkvKiBOb3QgaWYgcnVubmluZyBpbiBiYWNrZ3JvdW5kICovCisjZW5kaWYgLyogVU5JWE9ST1NLICovCisjZW5kaWYgLyogVk1TICovCisJCSApKSkgLyogT3IgQVVUTyAqLworCSAgICAgIHggPSBkb2NvbmVjdChkaWFsY3EsCS8qIFRoZW4gYWxzbyBDT05ORUNUICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRsdmwgPT0gMCA/IDEgOiAwCisJCQkgICApOworCSAgICBpZiAodHRjaGsoKSA8IDApCisJICAgICAgZG9sb2dlbmQoKTsKKwl9CisJcmV0dXJuKHN1Y2Nlc3MgPSB4KTsKKyAgICB9CisjZW5kaWYgLyogTk9ESUFMICovCisKKyNpZm5kZWYgTk9QVVNICisjaWZkZWYgQ0tfUkVYWAorICAgIGlmIChjeCA9PSBYWFJFWFgpIHsJCQkvKiBSRVhYICovCisgICAgICAgIGV4dGVybiBpbnQgbm9wdXNoOworICAgICAgICBpZiAoIG5vcHVzaCApCisgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3M9MCk7CisgICAgICAgIHJldHVybihkb3JleHgoKSk7CisgICAgfQorI2VuZGlmIC8qIENLX1JFWFggKi8KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworI2lmbmRlZiBOT0ZSSUxMUworICAgIGlmIChjeCA9PSBYWERFTCB8fCBjeCA9PSBYWExERUwpIHsJLyogREVMRVRFICovCisjaWZkZWYgTE9DVVMKKwlpZiAoIWxvY3VzICYmIGN4ICE9IFhYTERFTCkgeworI2lmZGVmIE5PWEZFUgorCSAgICByZXR1cm4oLTIpOworI2Vsc2UKKwkgICAgcmV0dXJuKGRvcm10KFhaREVMKSk7CisjZW5kaWYgLyogTk9YRkVSICovCisgICAgICAgIH0KKyNlbmRpZiAvKiBMT0NVUyAqLworI2lmZGVmIElLU0QKKwlpZiAoaW5zZXJ2ZXIgJiYgKCFFTkFCTEVEKGVuX2RlbCkKKyNpZmRlZiBDS19MT0dJTgorCQkJIHx8IGlzZ3Vlc3QKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCQkJICkpIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIERFTEVURSBpcyBkaXNhYmxlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBDS19BUEMKKwlpZiAoKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwpIHx8CisJICAgICgoYXBjYWN0aXZlID09IEFQQ19SRU1PVEUpICYmICghKGFwY3N0YXR1cyAmIEFQQ19VTkNIKSkpKQorCSAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKwlyZXR1cm4oZG9kZWwoKSk7CisgICAgfQorI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyAgICBpZiAoY3ggPT0gWFhESVIgfHwgY3ggPT0gWFhMUyB8fCBjeCA9PSBYWExESVIpIHsgLyogRElSRUNUT1JZIG9yIExTICovCisjaWZkZWYgTE9DVVMKKwlpZiAoIWxvY3VzICYmIGN4ICE9IFhYTERJUikgeworI2lmZGVmIE5PWEZFUgorCSAgICByZXR1cm4oLTIpOworI2Vsc2UKKwkgICAgcmV0dXJuKGRvcm10KFhaRElSKSk7CisjZW5kaWYgLyogTk9YRkVSICovCisgICAgICAgIH0KKyNlbmRpZiAvKiBMT0NVUyAqLworI2lmZGVmIElLU0QKKwlpZiAoaW5zZXJ2ZXIgJiYgIUVOQUJMRUQoZW5fZGlyKSkgeworCSAgICBwcmludGYoIj9Tb3JyeSwgRElSRUNUT1JZIGlzIGRpc2FibGVkXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisjZW5kaWYgLyogSUtTRCAqLworCXJldHVybihkb2RpcihjeCkpOworICAgIH0KKworI2lmbmRlZiBOT1NQTAorICAgIGlmIChjeCA9PSBYWEVMUykJCQkvKiBFTFNFICovCisgICAgICByZXR1cm4oZG9lbHNlKCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9TRVJWRVIKKyNpZm5kZWYgTk9GUklMTFMKKyAgICBpZiAoY3ggPT0gWFhFTkEgfHwgY3ggPT0gWFhESVMpIHsJLyogRU5BQkxFLCBESVNBQkxFICovCisJcyA9IChjeCA9PSBYWEVOQSkgPworCSAgIlNlcnZlciBmdW5jdGlvbiB0byBlbmFibGUiIDoKKwkgICAgIlNlcnZlciBmdW5jdGlvbiB0byBkaXNhYmxlIjsKKworCWlmICgoeCA9IGNta2V5KGVuYXRhYixuZW5hLHMsIiIseHhzdHJpbmcpKSA8IDApIHsKKwkgICAgaWYgKHggPT0gLTMpIHsKKwkJcHJpbnRmKCI/TmFtZSBvZiBzZXJ2ZXIgZnVuY3Rpb24gcmVxdWlyZWRcbiIpOworCQlyZXR1cm4oLTkpOworCSAgICB9IGVsc2UgcmV0dXJuKHgpOworCX0KKwlpZiAoKHkgPSBjbWtleShrbXN0YWIsMywibW9kZSIsImJvdGgiLHh4c3RyaW5nKSkgPCAwKSB7CisJICAgIGlmICh5ID09IC0zKSB7CisJCXByaW50ZigiP1BsZWFzZSBzcGVjaWZ5IHJlbW90ZSwgbG9jYWwsIG9yIGJvdGhcbiIpOworCQlyZXR1cm4oLTkpOworCSAgICB9IGVsc2UgcmV0dXJuKHkpOworCX0KKwlpZiAoY3ggPT0gWFhESVMpCQkvKiBEaXNhYmxpbmcsIG5vdCBlbmFibGluZyAqLworCSAgeSA9IDMgLSB5OworCWlmICgoeiA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHopOworI2lmZGVmIENLX0FQQworCWlmICgoYXBjYWN0aXZlID09IEFQQ19MT0NBTCkgfHwKKwkgICAgKChhcGNhY3RpdmUgPT0gQVBDX1JFTU9URSkgJiYgKCEoYXBjc3RhdHVzICYgQVBDX1VOQ0gpKSkpCisJICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIENLX0FQQyAqLworI2lmZGVmIElLU0QKKyAgICAgICAgLyogVGhpcyBtYXkgc2VlbSBsaWtlIGl0IGR1cGxpY2F0ZXMgdGhlIHdvcmsgaW4gZG9lbmFibGUoKSAgKi8KKyAgICAgICAgLyogYnV0IHRoaXMgY29kZSByZXR1cm5zIGZhaWx1cmUgd2hlcmVhcyBkb2VuYWJsZSgpIHJldHVybnMgKi8KKyAgICAgICAgLyogc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKGluc2VydmVyICYmCisjaWZkZWYgSUtTRENPTkYKKyAgICAgICAgICAgIGlrc2RjZiAmJgorI2VuZGlmIC8qIElLU0RDT05GICovCisgICAgICAgICAgICAoeCA9PSBFTl9IT1MgfHwgeCA9PSBFTl9QUkkgfHwgeCA9PSBFTl9NQUkgfHwgeCA9PSBFTl9XSE8gfHwKKyAgICAgICAgICAgICAgaXNndWVzdCkpCisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIElLU0QgKi8KKwlyZXR1cm4oZG9lbmFibGUoeSx4KSk7CisgICAgfQorI2VuZGlmIC8qIE5PRlJJTExTICovCisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIGlmIChjeCA9PSBYWFJFVCkgewkJCS8qIFJFVFVSTiAqLworCWlmICgoeCA9IGNtdHh0KCJPcHRpb25hbCByZXR1cm4gdmFsdWUiLCIiLCZzLE5VTEwpKSA8IDApCisJICByZXR1cm4oeCk7CisJcyA9IGJyc3RyaXAocyk7CQkJLyogU3RyaXAgYnJhY2VzICovCisJaWYgKGNtZGx2bCA9PSAwKQkJLyogQXQgdG9wIGxldmVsLCBub3RoaW5nIGhhcHBlbnMuLi4gKi8KKwkgIHJldHVybihzdWNjZXNzID0gMSk7CisJc3dpdGNoIChjbWRzdGtbY21kbHZsXS5zcmMpIHsJLyogQWN0aW9uIGRlcGVuZHMgb24gY29tbWFuZCBzb3VyY2UgKi8KKwkgIGNhc2UgQ01EX1RGOgkJCS8qIENvbW1hbmQgZmlsZSAqLworCSAgICBwb3BjbHZsKCk7CQkJLyogUG9wIGNvbW1hbmQgbGV2ZWwgKi8KKwkgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsJLyogYWx3YXlzIHN1Y2NlZWRzICovCisJICBjYXNlIENNRF9NRDoJCQkvKiBNYWNybyAqLworCSAgY2FzZSBDTURfS0I6CQkJLyogUHJvbXB0ICovCisJICAgIHJldHVybihkb3JldHVybihzKSk7CS8qIFRyYWlsaW5nIHRleHQgaXMgcmV0dXJuIHZhbHVlLiAqLworCSAgZGVmYXVsdDoJCQkvKiBTaG91bGRuJ3QgaGFwcGVuICovCisJICAgIHJldHVybigtMik7CisJfQorICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PU1BMCisgICAgaWYgKGN4ID09IFhYT1BFKQkJCS8qIE9QRU4gKi8KKyAgICAgIHJldHVybihkb29wZW4oKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIGlmIChjeCA9PSBYWE9VVCB8fCBjeCA9PSBYWExOT1VUKSB7CS8qIE9VVFBVVCBvciBMSU5FT1VUICovCisJaWYgKCh4ID0gY210eHQoIlRleHQgdG8gYmUgb3V0cHV0IiwiIiwmcyxOVUxMKSkgPCAwKQorCSAgcmV0dXJuKHgpOworI2lmZGVmIENLX0FQQworCWlmICgoYXBjYWN0aXZlID09IEFQQ19MT0NBTCkgfHwKKwkgICAgKChhcGNhY3RpdmUgPT0gQVBDX1JFTU9URSkgJiYgKCEoYXBjc3RhdHVzICYgQVBDX1VOQ0gpKSkpCisJICByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIENLX0FQQyAqLworCWRlYnVnKEYxMTAsIk9VVFBVVCAxIixzLDApOworCXMgPSBicnN0cmlwKHMpOwkJCS8qIFN0cmlwIGVuY2xvc2luZyBicmFjZXMsICovCisJZGVidWcoRjExMCwiT1VUUFVUIDIiLHMsMCk7CisvKgorICBJIGRvbid0IHRoaW5rIEkgY291bGQgZXZlciBmdWxseSBleHBsYWluIHRoaXMgaW4gYSBtaWxsaW9uIHllYXJzLi4uCisgIFdlIGhhdmUgcmVhZCB0aGUgdXNlcidzIHN0cmluZyB3aXRob3V0IGNhbGxpbmcgdGhlIHZhcmlhYmxlLWV4cGFuZGVyCisgIGZ1bmN0aW9uLiAgTm93LCBiZWZvcmUgd2UgY2FsbCBpdCwgd2UgaGF2ZSB0byBkb3VibGUgYmFja3NsYXNoZXMgdGhhdAorICBhcHBlYXIgYmVmb3JlIFxOLCBcQiwgXEwsIGFuZCBcIGl0c2VsZiwgc28gdGhlIGV4cGFuZGVyIGZ1bmN0aW9uIHdpbGwKKyAgcmVkdWNlIHRoZW0gYmFjayB0byBzaW5nbGUgYmFja3NsYXNoZXMsIHNvIHdoZW4gd2UgY2FsbCBkb291dHB1dCgpLi4uCisgIEJ1dCBpdCdzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB0aGF0LgorKi8KKwlpZiAoY21kZ3F1bygpKSB7CQkvKiBPbmx5IGlmIENPTU1BTkQgUVVPVElORyBPTiAuLi4gKi8KKwkgICAgZm9yICh4ID0gMCwgeSA9IDA7IHNbeF07IHgrKywgeSsrKSB7CisJCWlmIChzW3hdID09IENNRFEpIHsKKwkJICAgIGNoYXIgYyA9IHNbeCsxXTsKKwkJICAgIGlmIChjID09ICduJyB8fCBjID09ICdOJyB8fAorCQkJYyA9PSAnYicgfHwgYyA9PSAnQicgfHwKKwkJCWMgPT0gJ2wnIHx8IGMgPT0gJ0wnIHx8CisJCQljID09IENNRFEpCisJCSAgICAgIGxpbmVbeSsrXSA9IENNRFE7CisJCX0KKwkJbGluZVt5XSA9IHNbeF07CisJICAgIH0KKwkgICAgbGluZVt5KytdID0gJ1wwJzsJCS8qIE5vdyBleHBhbmQgdmFyaWFibGVzLCBldGMuICovCisJICAgIGRlYnVnKEYxMTAsIk9VVFBVVCAzIixsaW5lLDApOworCSAgICBzID0gbGluZSt5KzE7CisJICAgIHggPSBMSU5CVUZTSVogLSAoaW50KSBzdHJsZW4obGluZSkgLSAxOworCSAgICBkZWJ1ZyhGMTAxLCJPVVRQVVQgc2l6ZSIsIiIseCk7CisJICAgIGlmICh6enN0cmluZyhsaW5lLCZzLCZ4KSA8IDApCisJICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKwkgICAgcyA9IGxpbmUreSsxOworCSAgICBkZWJ1ZyhGMTEwLCJPVVRQVVQgNCIscywwKTsKKwl9CisJc3VjY2VzcyA9IGRvb3V0cHV0KHMsY3gpOworCXJldHVybihzdWNjZXNzKTsKKyAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIEFOWVgyNQorI2lmbmRlZiBJQk1YMjUKKyAgICBpZiAoY3ggPT0gWFhQQUQpIHsJCQkvKiBQQUQgY29tbWFuZHMgKi8KKwl4ID0gY21rZXkocGFkdGFiLG5wYWRjLCJQQUQgY29tbWFuZCIsIiIseHhzdHJpbmcpOworCWlmICh4ID09IC0zKSB7CisJICAgIHByaW50ZigiP1lvdSBtdXN0IHNwZWNpZnkgYSBQQUQgY29tbWFuZCB0byBleGVjdXRlXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisJaWYgKHggPCAwKSByZXR1cm4oeCk7CisKKwlzd2l0Y2ggKHgpIHsKKwkgIGNhc2UgWFlQQURMOgorCSAgICBpZiAoeDI1c3RhdCgpIDwgMCkKKwkgICAgICBwcmludGYoIlNvcnJ5LCB5b3UgbXVzdCAnc2V0IG5ldHdvcmsnICYgJ3NldCBob3N0JyBmaXJzdFxyXG4iKTsKKwkgICAgZWxzZSB7CisJCXgyNWNsZWFyKCk7CisJCWluaXRwYWQoKTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgWFlQQURTOgorCSAgICBpZiAoeDI1c3RhdCgpIDwgMCkKKwkgICAgICBwcmludGYoIk5vdCBjb25uZWN0ZWRcclxuIik7CisJICAgIGVsc2UgeworCQlleHRlcm4gaW50IGxpbmtpZCwgbGNuOworCQljb25vbCgiQ29ubmVjdGVkIHRocnUgIik7CisJCWNvbm9sKHR0bmFtZSk7CisJCXByaW50ZigiLCBMaW5rIGlkICVkLCBMb2dpY2FsIGNoYW5uZWwgbnVtYmVyICVkXHJcbiIsCisJCSAgICAgICBsaW5raWQsbGNuKTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgWFlQQURSOgorCSAgICBpZiAoeDI1c3RhdCgpIDwgMCkKKwkgICAgICBwcmludGYoIlNvcnJ5LCB5b3UgbXVzdCAnc2V0IG5ldHdvcmsnICYgJ3NldCBob3N0JyBmaXJzdFxyXG4iKTsKKwkgICAgZWxzZQorCSAgICAgIHgyNXJlc2V0KDAsMCk7CisJICAgIGJyZWFrOworCSAgY2FzZSBYWVBBREk6CisJICAgIGlmICh4MjVzdGF0KCkgPCAwKQorCSAgICAgIHByaW50ZigiU29ycnksIHlvdSBtdXN0ICdzZXQgbmV0d29yaycgJiAnc2V0IGhvc3QnIGZpcnN0XHJcbiIpOworCSAgICBlbHNlCisJICAgICAgeDI1aW50cigwKTsKKwl9CisJcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBJQk1YMjUgKi8KKyNlbmRpZiAvKiBBTllYMjUgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIGlmIChjeCA9PSBYWFBBVSB8fCBjeCA9PSBYWFdBSSB8fCBjeCA9PSBYWE1TTCkgLyogUEFVU0UsIFdBSVQsIGV0YyAqLworICAgICAgcmV0dXJuKGRvcGF1cyhjeCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9GUklMTFMKKyAgICBpZiAoY3ggPT0gWFhQUkkpIHsKKyNpZmRlZiBJS1NECisjaWZkZWYgQ0tfTE9HSU4KKwlpZiAoaW5zZXJ2ZXIgJiYgKGlzZ3Vlc3QgfHwgIUVOQUJMRUQoZW5fcHJpKSkpIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIHByaW50aW5nIGlzIGRpc2FibGVkXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyNlbmRpZiAvKiBJS1NEICovCisJaWYgKCh4ID0gY21pZmkoIkZpbGUgdG8gcHJpbnQiLCIiLCZzLCZ5LHh4c3RyaW5nKSkgPCAwKSB7CisJICAgIGlmICh4ID09IC0zKSB7CisJCXByaW50ZigiP0EgZmlsZSBzcGVjaWZpY2F0aW9uIGlzIHJlcXVpcmVkXG4iKTsKKwkJcmV0dXJuKC05KTsKKwkgICAgfSBlbHNlIHJldHVybih4KTsKKwl9CisJaWYgKHkgIT0gMCkgeworCSAgICBwcmludGYoIj9XaWxkY2FyZHMgbm90IGFsbG93ZWRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKwlja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisJcyA9ICIiOworI2lmbmRlZiBOVAorCWlmICgoeCA9IGNtdHh0KCJMb2NhbCBwcmludCBjb21tYW5kIG9wdGlvbnMsIG9yIGNhcnJpYWdlIHJldHVybiIsIiIsJnMsCisJCSAgICAgICB4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih4KTsKKyNlbmRpZiAvKiBOVCAqLworCWlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKwkgIHJldHVybih4KTsKKwlyZXR1cm4oc3VjY2VzcyA9ICh6cHJpbnQocyxsaW5lKSA9PSAwKSA/IDEgOiAwKTsKKyAgICB9CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworI2lmZGVmIFRDUFNPQ0tFVAorI2lmbmRlZiBOT1BVU0gKKyAgICBpZiAoY3ggPT0gWFhQTkcpIAkJCS8qIFBJTkcgYW4gSVAgaG9zdCAqLworICAgICAgcmV0dXJuKGRvcGluZygpKTsKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworI2lmbmRlZiBOT0ZUUAorICAgIGlmIChjeCA9PSBYWEZUUCkJCQkvKiBGVFAgKi8KKyNpZmRlZiBTWVNGVFAKKyNpZm5kZWYgTk9QVVNICisgICAgICByZXR1cm4oZG9mdHAoKSk7CQkJLyogSnVzdCBydW5zIHN5c3RlbSdzIGZ0cCBwcm9ncmFtICovCisjZWxzZQorICAgICAgcmV0dXJuKC0yKTsKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNlbHNlCisgICAgcmV0dXJuKGRveGZ0cCgpKTsKKyNlbmRpZiAvKiBTWVNGVFAgKi8KKyNlbmRpZiAvKiBOT0ZUUCAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCisgICAgaWYgKGN4ID09IFhYUFdEIHx8IGN4ID09IFhYTFBXRCkgewkvKiBQV0QgKi8KKyNpZmRlZiBPUzIKKwljaGFyICpwd3A7CisjZW5kaWYgLyogT1MyICovCisJaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorCSAgcmV0dXJuKHgpOworI2lmZGVmIExPQ1VTCisJaWYgKCFsb2N1cyAmJiBjeCAhPSBYWExQV0QpIHsKKyNpZmRlZiBOT1hGRVIKKwkgICAgcmV0dXJuKC0yKTsKKyNlbHNlCisJICAgIHJldHVybihkb3JtdChYWlBXRCkpOworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgICAgICB9CisjZW5kaWYgLyogTE9DVVMgKi8KKworI2lmbmRlZiBNQUMKKyNpZm5kZWYgT1MyCisjaWZkZWYgVU5JWAorCXByaW50ZigiJXNcbiIsemd0ZGlyKCkpOworI2Vsc2UKKwl4c3lzdGVtKFBXRENNRCk7CisjZW5kaWYgLyogVU5JWCAqLworCXJldHVybihzdWNjZXNzID0gMSk7CQkvKiBCbGluZCBmYWl0aCAqLworI2Vsc2UgIC8qIE9TMiAqLworCWlmIChwd3AgPSB6Z3RkaXIoKSkgeworCSAgICBpZiAoKnB3cCkgeworI2lmZGVmIE5UCisJCWxpbmVbMF0gPSBOVUw7CisJCWNrR2V0TG9uZ1BhdGhOYW1lKHB3cCxsaW5lLExJTkJVRlNJWik7CisJCWxpbmVbTElOQlVGU0laLTFdID0gTlVMOworCQl0bXBidWZbMF0gPSBOVUw7CisJCUdldFNob3J0UGF0aE5hbWUocHdwLHRtcGJ1ZixUTVBCVUZTSVopOworCQl0bXBidWZbVE1QQlVGU0laLTFdID0gTlVMOworCQlwd3AgPSBsaW5lOworCQlpZiAoIXN0cmNtcChsaW5lLHRtcGJ1ZikpIHsKKyNlbmRpZiAvKiBOVCAqLworCQkgICAgcHJpbnRmKCIlc1xuIixwd3ApOworI2lmZGVmIE5UCisJCX0gZWxzZSB7CisJCSAgICBwcmludGYoIiAgTG9uZyBuYW1lOiAgJXNcbiIsbGluZSk7CisJCSAgICBwcmludGYoIiAgU2hvcnQgbmFtZTogJXNcbiIsdG1wYnVmKTsKKwkJfSAgICAgICAgICAgIAorI2VuZGlmIC8qIE5UICovCisJICAgIH0KKwkgICAgcmV0dXJuKHN1Y2Nlc3MgPSAoKGludClzdHJsZW4ocHdwKSA+IDApKTsKKwl9IGVsc2UgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbHNlICAvKiBNQUMgKi8KKwlpZiAocHdwID0gemd0ZGlyKCkpIHsKKwkgICAgcHJpbnRmKCIlc1xuIixwd3ApOworCSAgICByZXR1cm4oc3VjY2VzcyA9ICgoaW50KXN0cmxlbihwd3ApID4gMCkpOworCX0gZWxzZSByZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIE1BQyAqLworICAgIH0KKworICAgIGlmIChjeCA9PSBYWFFVSSB8fCBjeCA9PSBYWEVYSSkgewkvKiBFWElULCBRVUlUICovCisJZXh0ZXJuIGludCBxdWl0dGluZzsKKworCWlmICgoeSA9IGNtbnVtKCJleGl0IHN0YXR1cyBjb2RlIixja2l0b2EoeGl0c3RhKSwxMCwmeCx4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih5KTsKKwlpZiAoKHkgPSBjbXR4dCgiT3B0aW9uYWwgRVhJVCBtZXNzYWdlIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih5KTsKKwlzID0gYnJzdHJpcChzKTsKKwlja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisKKwlpZiAoIWh1cG9rKDApKQkJCS8qIENoZWNrIGlmIGNvbm5lY3Rpb24gc3RpbGwgb3BlbiAqLworCSAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKworCWlmIChsaW5lWzBdKQkJCS8qIFByaW50IEVYSVQgbWVzc2FnZSBpZiBnaXZlbiAqLworCSAgcHJpbnRmKCIlc1xuIiwoY2hhciAqKWxpbmUpOworCisJcXVpdHRpbmcgPSAxOwkJCS8qIEZsYWcgdGhhdCB3ZSBhcmUgcXVpdHRpbmcuICovCisKKyNpZmRlZiBWTVMKKwlkb2V4aXQoR09PRF9FWElULHgpOworI2Vsc2UKKyNpZmRlZiBPU0sKKy8qIFJldHVybmluZyBhbnkgY29kZXMgaGVyZSBtYWtlcyB0aGUgT1MtOSBzaGVsbCBwcmludCBhbiBlcnJvciBtZXNzYWdlLiAqLworCWRvZXhpdChHT09EX0VYSVQsLTEpOworI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgICAgICBkb2V4aXQoR09PRF9FWElULHgpOworI2Vsc2UKKwlkb2V4aXQoeCwtMSk7CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyAgICB9CisKKyNpZm5kZWYgTk9YRkVSCisjaWZuZGVmIE5PRlJJTExTCisgICAgaWYgKGN4ID09IFhYRVJSKSB7CQkJLyogRVJST1IgKi8KKyNpZmRlZiBDS19YWVoKKwlpZiAocHJvdG9jb2wgIT0gUFJPVE9fSykgeworCSAgICBwcmludGYoIlNvcnJ5LCBFLVBBQ0tFVCBvbmx5IHdvcmtzIHdpdGggS2VybWl0IHByb3RvY29sXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisjZW5kaWYgLyogQ0tfWFlaICovCisJaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisJdHRmbHVpKCk7CisJZXBrdGZsZyA9IDE7CisJc3N0YXRlID0gJ2EnOworCXJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworICAgIGlmIChjeCA9PSBYWEZJTikgewkJCS8qIEZJTklTSCAqLworI2lmZGVmIE5FV0ZUUAorCWlmICgoZnRwZ2V0ID09IDEpIHx8ICgoZnRwZ2V0ID09IDIpICYmIGZ0cGlzb3BlbigpKSkKKwkgIHJldHVybihmdHBieWUoKSk7CisjZW5kaWYgLyogTkVXRlRQICovCisjaWZkZWYgQ0tfWFlaCisJaWYgKHByb3RvY29sICE9IFBST1RPX0spIHsKKwkgICAgcHJpbnRmKCJTb3JyeSwgRklOSVNIIG9ubHkgd29ya3Mgd2l0aCBLZXJtaXQgcHJvdG9jb2xcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKyNlbmRpZiAvKiBDS19YWVogKi8KKwlpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKworI2lmZGVmIElLU19PUFRJT04KKyAgICAgICAgaWYgKAorI2lmZGVmIENLX1hZWgorICAgICAgICAgICAgcHJvdG9jb2wgPT0gUFJPVE9fSyAmJgorI2VuZGlmIC8qIENLX1hZWiAqLworICAgICAgICAgICAgIWlrc193YWl0KEtFUk1JVF9SRVFfU1RBUlQsMSkpIHsKKwkgICAgcHJpbnRmKAorICAgICAgICAgICAgICAiP0EgS2VybWl0IFNlcnZlciBpcyBub3QgYXZhaWxhYmxlIHRvIHByb2Nlc3MgdGhpcyBjb21tYW5kXG4iKTsKKwkgICAgcmV0dXJuKC05KTsJCQkvKiBDb3JyZWN0IHRoZSByZXR1cm4gY29kZSAqLworICAgICAgICB9CisjZW5kaWYgLyogSUtTX09QVElPTiAqLworCisJc3N0YXRlID0gc2V0Z2VuKCdGJywiIiwiIiwiIik7CisJaWYgKGxvY2FsKSB0dGZsdWkoKTsJCS8qIElmIGxvY2FsLCBmbHVzaCB0dHkgaW5wdXQgYnVmZmVyICovCisJcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIGlmIChjeCA9PSBYWEZPUikJCQkvKiBGT1IgbG9vcCAqLworICAgICAgcmV0dXJuKGRvZm9yKCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgLyogR0VUIE1HRVQgUkVHRVQgUkVUUklFVkUgZXRjICovCisgICAgaWYgKGN4ID09IFhYR0VUIHx8IGN4ID09IFhYTUdFVCB8fCBjeCA9PSBYWFJFR0VUIHx8IGN4ID09IFhYUkVUUikgeworI2lmZGVmIElLU0QKKwlpZiAoaW5zZXJ2ZXIgJiYgIUVOQUJMRUQoZW5fc2VuKSkgeworCSAgICBwcmludGYoIj9Tb3JyeSwgcmVjZXB0aW9uIG9mIGZpbGVzIGlzIGRpc2FibGVkXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisjZW5kaWYgLyogSUtTRCAqLworCXJldHVybihkb3hnZXQoY3gpKTsKKyAgICB9CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9TUEwKKyNpZm5kZWYgTk9GUklMTFMKKyAgICBpZiAoY3ggPT0gWFhHT0spIHsJCQkvKiBHRVRPSyAqLworCXJldHVybihzdWNjZXNzID0gZG9hc2soY3gpKTsKKyAgICB9CisjZW5kaWYgLyogTk9GUklMTFMgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgaWYgKGN4ID09IFhYSExQKSB7CQkJLyogSEVMUCAqLworI2lmZGVmIE5PSEVMUAorCXJldHVybihkb2hscChYWEhMUCkpOworI2Vsc2UKKwl4ID0gY21rZXkyKGNtZHRhYixuY21kLCJcbkNvbW1hbmQgb3IgdG9waWMiLCJoZWxwIix0b2t0YWIseHhzdHJpbmcsMyk7CisJZGVidWcoRjEwMSwiSEVMUCBjb21tYW5kIHgiLCIiLHgpOworCWlmICh4ID09IC01KSB7CisJICAgIHkgPSBjaGt0b2sodG9rdGFiKTsKKwkgICAgZGVidWcoRjEwMSwiSEVMUCBjbWtleSB0b2tlbiIsIiIseSk7CisJICAgIC8qIHVuZ3dvcmQoKTsgKi8KKwkgICAgc3dpdGNoICh5KSB7CisjaWZuZGVmIE5PUFVTSAorCSAgICAgIGNhc2UgJyEnOiB4ID0gWFhTSEU7IGJyZWFrOworI2VuZGlmIC8qIE5PUFVTSCAqLworCSAgICAgIGNhc2UgJyMnOiB4ID0gWFhDT007IGJyZWFrOworCSAgICAgIGNhc2UgJzsnOiB4ID0gWFhDT007IGJyZWFrOworI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgICBjYXNlICcuJzogeCA9IFhYREVGOyBicmVhazsKKwkgICAgICBjYXNlICc6JzogeCA9IFhYTEJMOyBicmVhazsKKyNpZm5kZWYgTk9TRVhQCisJICAgICAgY2FzZSAnKCc6IHggPSBYWFNFWFA7IGJyZWFrOworI2VuZGlmIC8qIE5PU0VYUCAqLworI2VuZGlmIC8qIE5PU1BMICovCisJICAgICAgY2FzZSAnJic6IHggPSBYWEVDSDsgYnJlYWs7CisJICAgICAgZGVmYXVsdDoKKwkJcHJpbnRmKCJcbj9JbnZhbGlkIC0gJXNcbiIsY21kYnVmKTsKKwkJeCA9IC0yOworCSAgICB9CisJfQorCW1ha2VzdHIoJmhscHRvayxhdG1idWYpOworCWRlYnVnKEYxMTEsIkhFTFAgdG9rZW4iLGhscHRvayx4KTsKKwlyZXR1cm4oZG9obHAoeCkpOworI2VuZGlmIC8qIE5PSEVMUCAqLworICAgIH0KKworI2lmbmRlZiBOT0hFTFAKKyAgICBpZiAoY3ggPT0gWFhJTlQpCQkJLyogSU5UUk8gKi8KKyAgICAgIHJldHVybihobXNnYShpbnRyb3R4dCkpOworICAgIGlmIChjeCA9PSBYWE5FVykgewkJCS8qIE5FV1MgKi8KKwlpbnQgeDsKKwlleHRlcm4gY2hhciAqIGtfaW5mb19kaXI7CisJeCA9IGhtc2dhKG5ld3N0eHQpOworCXJldHVybih4KTsKKyAgICB9CisKKyNpZmRlZiBPUzJPTkxZCisgICAgaWYgKGN4ID09IFhYVVBEKSB7CQkJLyogVmlldyBVUERBVEUgZmlsZSAqLworICAgICAgICBleHRlcm4gY2hhciBleGVkaXJbXTsKKyAgICAgICAgY2hhciAqIHBUb3BpYzsKKyAgICAgICAgY2hhciB1cGRzdHJbMjA0OF07CisgICAgICAgIGlmICgoeCA9IGNtdHh0KCJ0b3BpYyBuYW1lIiwiIiwmcFRvcGljLHh4c3RyaW5nKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHg7CisjaWZkZWYgQ09NTUVOVAorCXNwcmludGYodXBkc3RyLAorCQkic3RhcnQgdmlldyAlc1xcZG9jc1xcazIuaW5mKyVzXFxkb2NzXFx1c2luZ19jay5pbmYrXAorJXNcXGRvY3NcXGRpYWxpbmcuaW5mKyVzXFxkb2NzXFxtb2RlbXMuaW5mICVzIiwKKwkJZXhlZGlyLGV4ZWRpcixleGVkaXIsZXhlZGlyLHBUb3BpYworCQkpOworI2Vsc2UKKwlpZiAoY2ttYWt4bXNnKHVwZHN0ciwKKwkJICAgICAyMDQ4LAorCQkgICAgICJzdGFydCB2aWV3ICIsCisJCSAgICAgZXhlZGlyLAorCQkgICAgICJcXGRvY3NcXGsyLmluZisiLAorCQkgICAgIGV4ZWRpciwKKwkJICAgICAiXFxkb2NzXFx1c2luZ19jay5pbmYrIiwKKwkJICAgICBleGVkaXIsCisJCSAgICAgIlxcZG9jc1xcZGlhbGluZy5pbmYrIiwKKwkJICAgICBleGVkaXIsCisJCSAgICAgIlxcZG9jc1xcbW9kZW1zLmluZiAiLAorCQkgICAgIHBUb3BpYywKKwkJICAgICBOVUxMLAorCQkgICAgIE5VTEwKKwkJICAgICApID4gMCkKKyNlbmRpZiAvKiBDT01NRU5UICovCisJICBzeXN0ZW0odXBkc3RyKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisjZW5kaWYgLyogT1MyT05MWSAqLworI2VuZGlmIC8qIE5PSEVMUCAqLworCisjaWZuZGVmIE5PTE9DQUwKKyAgICBpZiAoY3ggPT0gWFhIQU4pIHsJCQkvKiBIQU5HVVAgKi8KKwlpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyNpZmRlZiBORVdGVFAKKwlpZiAoKGZ0cGdldCA9PSAxKSB8fCAoKGZ0cGdldCA9PSAyKSAmJiAhbG9jYWwgJiYgZnRwaXNvcGVuKCkpKQorCSAgcmV0dXJuKHN1Y2Nlc3MgPSBmdHBieWUoKSk7CisjZW5kaWYgLyogTkVXRlRQICovCisjaWZuZGVmIE5PRElBTAorCWlmICgoeCA9IG1kbWh1cCgpKSA8IDEpIHsKKwkgICAgZGVidWcoRjEwMSwiSEFOR1VQIG1kbXVwIiwiIix4KTsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKwkgICAgeCA9IHR0aGFuZygpOworCSAgICBkZWJ1ZyhGMTAxLCJIQU5HVVAgdHRoYW5nIiwiIix4KTsKKwkgICAgeCA9ICh4ID4gLTEpOworI2lmbmRlZiBOT0RJQUwKKwl9CisJZGlhbHN0YSA9IERJQV9VTks7CisjZW5kaWYgLyogTk9ESUFMICovCisJd2h5Y2xvc2VkID0gV0NfQ0xPUzsKKwl0dGNoaygpOwkJCS8qIEluIGNhc2Ugb2YgQ0xPU0UtT04tRElTQ09OTkVDVCAqLworCWRvbG9nZW5kKCk7CisjaWZkZWYgT1MyCisJaWYgKHgpCisJICBEaWFsZXJTZW5kKE9QVF9LRVJNSVRfSEFOR1VQLCAwKTsKKyNlbmRpZiAvKiBPUzIgKi8KKwlpZiAoeCkgaGF2ZWxpbmUgPSAwOworCXJldHVybihzdWNjZXNzID0geCk7CisgICAgfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIC8qIElOUFVULCBSRUlOUFVULCBhbmQgTUlOUFVUICovCisKKyAgICBpZiAoY3ggPT0gWFhJTlAgfHwgY3ggPT0gWFhSRUkgfHwgY3ggPT0gWFhNSU5QKSB7CisJbG9uZyB6ejsKKwlleHRlcm4gaW50IGlzcGF0dGVybiwgaXNqb2luOworCisJc3RydWN0IEZEQiBzdywgbnUsIGZsOworCWludCBmYywgaGF2ZXRpbWUgPSAwOworCWNoYXIgKiBtOworCisJaWYgKGN4ID09IFhYUkVJKSB7CisJICAgIG0gPSAiVGltZW91dCBpbiBzZWNvbmRzIChpZ25vcmVkKSI7CisJfSBlbHNlIHsKKwkgICAgbSA9ICJTZWNvbmRzIHRvIHdhaXQgZm9yIGlucHV0LFxuIG9yIHRpbWUgb2YgZGF5IGhoOm1tOnNzLCBcCisgb3Igc3dpdGNoIjsKKwl9CisJaW5ub21hdGNoID0gMDsJCQkvKiBJbml0aWFsaXplIHN3aXRjaCB2YWx1ZShzKSAqLworCisJY21mZGJpKCZzdywJCQkvKiBGaXJzdCBGREIgLSBjb21tYW5kIHN3aXRjaGVzICovCisJICAgICAgIF9DTUtFWSwJCQkvKiBmY29kZSAqLworCSAgICAgICBtLAkJCS8qIGhlbHBtc2cgKi8KKwkgICAgICAgY2tpdG9hKGluZGVmKSwJCS8qIGRlZmF1bHQgKi8KKwkgICAgICAgIiIsCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkgICAgICAgbmlucHV0c3csCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKwkgICAgICAgNCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisJICAgICAgIHh4c3RyaW5nLAkJLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworCSAgICAgICBpbnB1dHN3LAkJCS8qIEtleXdvcmQgdGFibGUgKi8KKwkgICAgICAgJm51CQkJLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworCSAgICAgICApOworCWNtZmRiaSgmbnUsCisJICAgICAgIF9DTU5VTSwJCQkvKiBOdW1iZXIgKi8KKwkgICAgICAgbSwJCQkvKiBIZWxwIG1lc3NhZ2UgKi8KKwkgICAgICAgY2tpdG9hKGluZGVmKSwJCS8qIGRlZmF1bHQgKi8KKwkgICAgICAgIiIsCQkJLyogTi9BICovCisJICAgICAgIDEwLAkJCS8qIFJhZGl4ID0gMTAgKi8KKwkgICAgICAgMCwJCQkvKiBOL0EgKi8KKwkgICAgICAgeHhzdHJpbmcsCQkvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisJICAgICAgIE5VTEwsCQkJLyogTi9BICovCisJICAgICAgICZmbAkJCS8qIE5leHQgKi8KKwkgICAgICAgKTsKKwljbWZkYmkoJmZsLAkJCS8qIFRpbWUgb2YgZGF5IGhoOm1tOnNzICovCisJICAgICAgIF9DTUZMRCwJCQkvKiBmY29kZSAqLworCSAgICAgICAiIiwJCQkvKiBobHBtc2cgKi8KKwkgICAgICAgIiIsCisJICAgICAgICIiLAkJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJICAgICAgIDAsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKwkgICAgICAgMCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworCSAgICAgICB4eHN0cmluZywKKwkgICAgICAgTlVMTCwKKwkgICAgICAgTlVMTAorCSAgICAgICApOworCWZjID0gKGN4ID09IFhYUkVJKSA/IGNtZmRiKCZudSkgOiBjbWZkYigmc3cpOyAvKiBQYXJzZSBzb21ldGhpbmcgKi8KKworCXdoaWxlICghaGF2ZXRpbWUpIHsKKwkgICAgaWYgKGZjIDwgMCkgewkJLyogRXJyb3IgKi8KKwkJaWYgKGZjID09IC0zKSB7CisJCSAgICBwcmludGYoIj9TeW50YXggZXJyb3IgaW4gSU5QVVQtY2xhc3MgY29tbWFuZFxuIik7CisJCSAgICByZXR1cm4oLTkpOworCQl9IGVsc2UKKwkJICByZXR1cm4oZmMpOworCSAgICB9CisJICAgIHN3aXRjaCAoY21yZXN1bHQuZmNvZGUpIHsKKwkgICAgICBjYXNlIF9DTUtFWToJCS8qIFN3aXRjaCAqLworCQlpZiAoY21yZXN1bHQubnJlc3VsdCA9PSBJTlBTV19OT00pIC8qIC9OT01BVENIICovCisJCSAgaW5ub21hdGNoID0gMTsKKwkJbSA9ICJTZWNvbmRzIHRvIHdhaXQgZm9yIGlucHV0LFxuIG9yIHRpbWUgb2YgZGF5IGhoOm1tOnNzIjsKKwkJY21mZGJpKCZudSxfQ01OVU0sbSwiIiwiIiwxMCwwLHh4c3RyaW5nLE5VTEwsJmZsKTsKKwkJY21mZGJpKCZmbCxfQ01GTEQsIiIsIiIsIiIsMCwwLHh4c3RyaW5nLE5VTEwsTlVMTCk7CisJCWZjID0gY21mZGIoJm51KTsJLyogUGFyc2Ugc29tZXRoaW5nICovCisJCWNvbnRpbnVlOworCisJICAgICAgY2FzZSBfQ01OVU06CQkvKiBTZWNvbmRzIHRvIHRpbWUgb3V0ICovCisJCXggPSBjbXJlc3VsdC5ucmVzdWx0OworI2lmZGVmIENLRkxPQVQKKwkJaWYgKGluc2NhbGUgIT0gMS4wKQkvKiBTY2FsZSAqLworCQkgIHggKj0gaW5zY2FsZTsJCQorI2VuZGlmCS8qIENLRkxPQVQgKi8KKwkJaGF2ZXRpbWUrKzsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIF9DTUZMRDoKKwkJenogPSB0b2Qyc2VjKGF0bWJ1Zik7CS8qIENvbnZlcnQgdG8gc2VjcyBzaW5jZSBtaWRuaWdodCAqLworCQlpZiAoenogPCAwTCkgeworCQkgICAgcHJpbnRmKCI/TnVtYmVyLCBleHByZXNzaW9uLCBvciB0aW1lIG9mIGRheSByZXF1aXJlZFxuIik7CisJCSAgICByZXR1cm4oLTkpOworCQl9IGVsc2UgeworCQkgICAgY2hhciBub3dbMzJdOwkvKiBDdXJyZW50IHRpbWUgKi8KKwkJICAgIGNoYXIgKnA7CisJCSAgICBsb25nIHRub3c7CisJCSAgICBwID0gbm93OworCQkgICAgenRpbWUoJnApOworCQkgICAgdG5vdyA9IGF0b2wocCsxMSkgKiAzNjAwTCArIGF0b2wocCsxNCkgKiA2MEwgKyBhdG9sKHArMTcpOworCQkgICAgaWYgKHp6IDwgdG5vdykJLyogVXNlcidzIHRpbWUgYmVmb3JlIG5vdyAqLworCQkgICAgICB6eiArPSA4NjQwMEw7CS8qIFNvIG1ha2UgaXQgdG9tb3Jyb3cgKi8KKwkJICAgIHp6IC09IHRub3c7CQkvKiBTZWNvbmRzIGZyb20gbm93LiAqLworCQkgICAgaWYgKHp6ID4gLTFMKSB7CisJCQl4ID0geno7CisJCQlpZiAoenogIT0gKGxvbmcpIHgpIHsKKwkJCSAgICBwcmludGYoCisiU29ycnksIGFyaXRobWV0aWMgb3ZlcmZsb3cgLSBoaDptbTpzcyBub3QgdXNhYmxlIG9uIHRoaXMgcGxhdGZvcm0uXG4iCispOworCQkJICAgIHJldHVybigtOSk7CisJCQl9CisJCSAgICB9CisJCSAgICBoYXZldGltZSsrOworCQl9CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CQkKKwkJcHJpbnRmKCI/SW50ZXJuYWwgZXJyb3JcbiIpOworCQlyZXR1cm4oLTkpOworCSAgICB9CisJfQorCS8qIE5vdyBwYXJzZSB0aGUgc2VhcmNoIHRleHQgKi8KKworI2lmZGVmIENLX01JTlBVVAorCWZvciAoeSA9IDA7IHkgPCBNSU5QTUFYOyB5KyspIHsJLyogSW5pdGlhbGl6ZSBzdHJpbmdzICovCisJICAgIG1wW3ldID0gMDsJCQkvKiBBc3N1bWUgaXQncyBub3QgYSBwYXR0ZXJuICovCisJICAgIGlmIChtc1t5XSkgeworCQlmcmVlKG1zW3ldKTsJCS8qIEZyZWUgb2xkIHN0cmluZ3MsIGlmIGFueSAqLworCQltc1t5XSA9IE5VTEw7CisJICAgIH0KKwl9CisJaWYgKGN4ID09IFhYTUlOUCkgewkJLyogTUlOUFVUICovCisJICAgIGludCBpLCBrID0gMCwgbiA9IDA7CisJICAgIHN0cnVjdCBzdHJpbmdhcnJheSAqIHE7CisJICAgIGtlZXBhbGxjaGFycyA9IDE7CisJICAgIHdoaWxlIChrIDwgTUlOUE1BWCkgeworCQlpZiAoKHkgPSBjbWZsZCgiU3RyaW5nIG9yIHBhdHRlcm4iLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7CisJCSAgICBpZiAoeSA9PSAtMykgeworCQkJaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorCQkJICByZXR1cm4oeSk7CisJCQlicmVhazsKKwkJICAgIH0gZWxzZSB7CisJCQlyZXR1cm4oeSk7CisJCSAgICB9CisJCX0KKwkJZGVidWcoRjExMSwiTUlOUFVUIGZpZWxkIixzLGspOworCQlpZiAoaXNqb2luKSB7CisJCSAgICBpZiAoKHEgPSBja3NwbGl0KDEsMCxzLCIgIiwoY2hhciAqKWMxY2hhcnMsMywwLDApKSkgeworCQkJY2hhciAqKiBhcCA9IHEtPmFfaGVhZDsKKwkJCW4gPSBxLT5hX3NpemU7CisJCQlkZWJ1ZyhGMTAxLCJtaW5wdXQgY2tzcGxpdCBzaXplIiwiIixuKTsKKwkJCWZvciAoaSA9IDE7IGkgPD0gbiAmJiBrIDwgTUlOUE1BWDsgaSsrKSB7CisJCQkgICAgaWYgKCFhcFtpXSkgLyogQWRkIG5vbi1lbXB0eSBlbGVtZW50cyAqLworCQkJICAgICAgY29udGludWU7CisJCQkgICAgaWYgKCEqKGFwW2ldKSkKKwkJCSAgICAgIGNvbnRpbnVlOworCQkJICAgIG1ha2VzdHIoJihtc1trXSksYXBbaV0pOworCQkJICAgIGRlYnVnKEYxMTEsIk1JTlBVVCBKT0lOIixtc1trXSxrKTsKKwkJCSAgICBrKys7CisJCQl9CisJCSAgICB9CisJCX0gZWxzZSB7CisJCSAgICBpZiAocykgaWYgKCpzKSB7CisJCQltYWtlc3RyKCYobXNba10pLGJyc3RyaXAocykpOworCQkJaWYgKGlzcGF0dGVybikgbXBba10gPSAxOworCQkJZGVidWcoRjExMSwiTUlOUFVUIixtc1trXSxpc3BhdHRlcm4pOworCQkJaysrOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAga2VlcGFsbGNoYXJzID0gMDsKKwl9IGVsc2UgeworI2VuZGlmIC8qIENLX01JTlBVVCAqLworCisJICAgIC8qIElOUFVUIG9yIFJFSU5QVVQgKi8KKworCSAgICBpZiAoKHkgPSBjbXR4dCgiTWF0ZXJpYWwgdG8gYmUgaW5wdXQiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorCSAgICAgIHJldHVybih5KTsKKwkgICAgbXBbMF0gPSBpc3BhdHRlcm4gPyAxIDogMDsKKwkgICAgbWFrZXN0cigmKG1zWzBdKSxicnN0cmlwKHMpKTsKKwkgICAgbXNbMV0gPSBOVUxMOworCisjaWZkZWYgQ0tfTUlOUFVUCisJfQorI2VuZGlmIC8qIENLX01JTlBVVCAqLworCisjaWZkZWYgQ09NTUVOVAorCXByaW50ZigiL05PTUFUQ0g9JWRcbiIsaW5ub21hdGNoKTsKKwlwcmludGYoIlRpbWVvdXQ9JWRcbiIseCk7CisJcmV0dXJuKDEpOworI2VuZGlmCS8qIENPTU1FTlQgKi8KKworCWlmIChjeCA9PSBYWElOUCB8fCBjeCA9PSBYWE1JTlApIHsgLyogTm90IFJFSU5QVVQuLi4gKi8KKwkgICAgaV9hY3RpdmUgPSAxOworCSAgICAvKiBHbyB0cnkgdG8gaW5wdXQgdGhlIHNlYXJjaCBzdHJpbmcgKi8KKwkgICAgc3VjY2VzcyA9IGRvaW5wdXQoeCxtcyxtcCxpbm5vbWF0Y2gpOworCSAgICBpX2FjdGl2ZSA9IDA7CisJfSBlbHNlIHsJCQkvKiBSRUlOUFVUICovCisJICAgIHN1Y2Nlc3MgPSBkb3JlaW5wKHgsbXNbMF0saXNwYXR0ZXJuKTsKKwl9CisJaWYgKGludGltZVtjbWRsdmxdICYmICFzdWNjZXNzKSB7IC8qIFRJTUVPVVQtQUNUSU9OID0gUVVJVD8gKi8KKwkgICAgcG9wY2x2bCgpOwkJCS8qIElmIHNvLCBwb3AgY29tbWFuZCBsZXZlbC4gKi8KKwkgICAgaWYgKHBmbGFnICYmIGNtZGx2bCA9PSAwKSB7CisJCWlmIChjeCA9PSBYWElOUCkgIHByaW50ZigiP0lOUFVUIHRpbWVkIG91dFxuIik7CisJCWlmIChjeCA9PSBYWE1JTlApIHByaW50ZigiP01JTlBVVCB0aW1lZCBvdXRcbiIpOworCQlpZiAoY3ggPT0gWFhSRUkpICBwcmludGYoIj9SRUlOUFVUIGZhaWxlZFxuIik7CisJICAgIH0KKwl9CisJcmV0dXJuKHN1Y2Nlc3MpOwkJLyogUmV0dXJuIGRvKHJlKWlucHV0J3MgcmV0dXJuIGNvZGUgKi8KKyAgICB9CisKKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgaWYgKGN4ID09IFhYTE9HKSB7CQkJLyogTE9HICovCisJeCA9IGNta2V5KGxvZ3RhYixubG9nLCJXaGF0IHRvIGxvZyIsIiIseHhzdHJpbmcpOworCWlmICh4ID09IC0zKSB7CisJICAgIHByaW50ZigiP1R5cGUgb2YgbG9nIHJlcXVpcmVkXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisJaWYgKHggPCAwKSByZXR1cm4oeCk7CisJeCA9IGRvbG9nKHgpOworCWlmICh4IDwgMCkKKwkgIHJldHVybih4KTsKKwllbHNlCisJICByZXR1cm4oc3VjY2VzcyA9IHgpOworICAgIH0KKworICAgIGlmIChjeCA9PSBYWExPR0lOKSB7CQkvKiAoUkVNT1RFKSBMT0dJTiAqLworI2lmZGVmIE5FV0ZUUAorCWlmICgoZnRwZ2V0ID09IDEpIHx8ICgoZnRwZ2V0ID09IDIpICYmIGZ0cGlzb3BlbigpKSkKKwkgIHJldHVybihzdWNjZXNzID0gZG9mdHB1c3IoKSk7CisjZW5kaWYgLyogTkVXRlRQICovCisjaWZkZWYgSUtTRAorCWlmIChpbnNlcnZlcikgeworCSAgICBwcmludGYoIj9BbHJlYWR5IGxvZ2dlZCBpblxuIik7CisJICAgIHJldHVybigtOSk7CisJfSBlbHNlCisjZW5kaWYgLyogSUtTRCAqLworCXsKKyNpZmRlZiBOT1hGRVIKKwkgICAgcmV0dXJuKC0yKTsKKyNlbHNlCisJICAgIHJldHVybihkb3JtdChYWkxHSSkpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCX0KKyAgICB9CisgICAgaWYgKGN4ID09IFhYTE9HT1VUKSB7CQkvKiAoUkVNT1RFKSBMT0dPVVQgKi8KKyNpZmRlZiBORVdGVFAKKwlpZiAoKGZ0cGdldCA9PSAxKSB8fCAoKGZ0cGdldCA9PSAyKSAmJiBmdHBpc29wZW4oKSkpCisJICByZXR1cm4oc3VjY2VzcyA9IGRvZnRwcmVzKCkpOworI2VuZGlmIC8qIE5FV0ZUUCAqLworCisjaWZkZWYgSUtTRAorICAgICAgICBpZiAoaW5zZXJ2ZXIpIHsKKwkgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorCSAgICAgIHJldHVybih4KTsKKwkgICAgZG9leGl0KEdPT0RfRVhJVCx4aXRzdGEpOworCX0gZWxzZQorI2VuZGlmIC8qIElLU0QgKi8KKwlpZiAoIWxvY2FsIHx8IChuZXR3b3JrICYmIHR0Y2hrKCkgPCAwKSkgeworCSAgICBwcmludGYoIj9ObyBjb25uZWN0aW9uLlxuIik7CisJICAgIHJldHVybigtOSk7CisJfSBlbHNlIHsKKyNpZmRlZiBOT1hGRVIKKwkgICAgcmV0dXJuKC0yKTsKKyNlbHNlCisJICAgIHJldHVybihkb3JtdChYWkxHTykpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCX0KKyAgICB9CisKKyNpZm5kZWYgTk9TQ1JJUFQKKyAgICBpZiAoY3ggPT0gWFhMT0dJKSB7CQkJLyogVVVDUC1zdHlsZSBzY3JpcHQgKi8KKwlpZiAoKHggPSBjbXR4dCgiZXhwZWN0LXNlbmQgZXhwZWN0LXNlbmQgLi4uIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih4KTsKKyNpZmRlZiBDS19BUEMKKwlpZiAoKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwpIHx8CisJICAgICgoYXBjYWN0aXZlID09IEFQQ19SRU1PVEUpICYmICghKGFwY3N0YXR1cyAmIEFQQ19VTkNIKSkpKQorCSAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKyNpZmRlZiBWTVMKKwljb25yZXMoKTsJCQkvKiBGb3IgQ3RybC1DIHRvIHdvcmsuLi4gKi8KKyNlbmRpZiAvKiBWTVMgKi8KKwlyZXR1cm4oc3VjY2VzcyA9IGRvbG9naW4ocykpOwkvKiBSZXR1cm4gMT1jb21wbGV0ZWQsIDA9ZmFpbGVkICovCisgICAgfQorI2VuZGlmIC8qIE5PU0NSSVBUICovCisKKyNpZm5kZWYgTk9YRkVSCisjaWZkZWYgUElQRVNFTkQKKyAgICBpZiAoY3ggPT0gWFhDUkVDKSB7CQkJLyogQ1JFQ0VJVkUgKi8KKwlpZiAocHJvdG9jb2wgIT0gUFJPVE9fSykgeworCSAgICBwcmludGYoIj9Tb3JyeSwgQ1JFQ0VJVkUgd29ya3Mgb25seSB3aXRoIEtlcm1pdCBwcm90b2NvbFxuIik7CisJICAgIHJldHVybigtOSk7CisJfSBlbHNlCisJICByZXR1cm4oZG94Z2V0KGN4KSk7CisgICAgfQorICAgIGlmIChjeCA9PSBYWENHRVQpIHsJCQkvKiBDR0VUICovCisJcmV0dXJuKGRveGdldChjeCkpOworICAgIH0KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisgICAgaWYgKGN4ID09IFhYUkVDKQkJCS8qIFJFQ0VJVkUgKi8KKyAgICAgIHJldHVybihkb3hnZXQoY3gpKTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICBpZiAoY3ggPT0gWFhSRU0pIHsJCQkvKiBSRU1PVEUgKi8KKyNpZmRlZiBORVdGVFAKKwlpZiAoKGZ0cGdldCA9PSAxKSB8fCAoKGZ0cGdldCA9PSAyKSAmJiBmdHBpc29wZW4oKSkpCisJICByZXR1cm4oZG9mdHBybXQoMCwwKSk7CisjZW5kaWYgLyogTkVXRlRQICovCisjaWZkZWYgQ0tfWFlaCisJaWYgKHByb3RvY29sICE9IFBST1RPX0spIHsKKwkgICAgcHJpbnRmKCJTb3JyeSwgUkVNT1RFIGNvbW1hbmRzIG9ubHkgd29yayB3aXRoIEtlcm1pdCBwcm90b2NvbFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorI2VuZGlmIC8qIENLX1hZWiAqLworCXggPSBjbWtleShyZW1jbWQsbnJtdCwiUmVtb3RlIEtlcm1pdCBzZXJ2ZXIgY29tbWFuZCIsIiIseHhzdHJpbmcpOworCWlmICh4ID09IC0zKSB7CisJICAgIHByaW50ZigiP1lvdSBtdXN0IHNwZWNpZnkgYSBjb21tYW5kIGZvciB0aGUgcmVtb3RlIHNlcnZlclxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCXJldHVybihkb3JtdCh4KSk7CisgICAgfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PUkVOQU1FCisjaWZuZGVmIE5PRlJJTExTCisgICAgaWYgKGN4ID09IFhYUkVOIHx8IGN4ID09IFhYTFJFTikgewkvKiBSRU5BTUUgKi8KKyNpZmRlZiBMT0NVUworCWlmICghbG9jdXMgJiYgY3ggIT0gWFhMUkVOKSB7CisjaWZkZWYgTk9YRkVSCisJICAgIHJldHVybigtMik7CisjZWxzZQorCSAgICByZXR1cm4oZG9ybXQoWFpSRU4pKTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIExPQ1VTICovCisjaWZkZWYgSUtTRAorCWlmIChpbnNlcnZlciAmJiAoIUVOQUJMRUQoZW5fcmVuKQorI2lmZGVmIENLX0xPR0lOCisJCQkgfHwgaXNndWVzdAorI2VuZGlmIC8qIENLX0xPR0lOICovCisJCQkgKSkgeworCSAgICBwcmludGYoIj9Tb3JyeSwgcmVuYW1pbmcgb2YgZmlsZXMgaXMgZGlzYWJsZWRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKyNlbmRpZiAvKiBJS1NEICovCisjaWZkZWYgQ0tfQVBDCisJaWYgKChhcGNhY3RpdmUgPT0gQVBDX0xPQ0FMKSB8fAorCSAgICAoKGFwY2FjdGl2ZSA9PSBBUENfUkVNT1RFKSAmJiAoIShhcGNzdGF0dXMgJiBBUENfVU5DSCkpKSkKKwkgIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogQ0tfQVBDICovCisJcmV0dXJuKGRvcmVuYW0oKSk7CisgICAgfQorI2VuZGlmIC8qIE5PRlJJTExTICovCisjZW5kaWYgLyogTk9SRU5BTUUgKi8KKworICAgIGlmIChjeCA9PSBYWEVJR0hUKSB7CQkvKiBFSUdIVEJJVCAqLworCWV4dGVybiBpbnQgcGFyaXR5LCBjbWFzaywgY21kbXNrOworCWlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKwkgIHJldHVybih4KTsKKwlwYXJpdHkgPSAwOworCWNtYXNrID0gMHhmZjsKKwljbWRtc2sgPSAweGZmOworCXJldHVybihzdWNjZXNzID0gMSk7CisgICAgfQorCisjaWZuZGVmIE5PWEZFUgorLyogU0VORCwgQ1NFTkQsIE1PVkUsIE1BSUwsIGFuZCBSRVNFTkQgdXNlIHRoZSBuZXcgY29tbW9uIGNvZGUgKi8KKworICAgIGlmIChjeCA9PSBYWFNFTgkJCS8qIFNFTkQgKi8KKyNpZmRlZiBQSVBFU0VORAorCXx8IGN4ID09IFhYQ1NFTgkJCS8qIENTRU5EICovCisjZW5kaWYgLyogUElQRVNFTkQgKi8KKwl8fCBjeCA9PSBYWE1PVkUJCQkvKiBNT1ZFICovCisJfHwgY3ggPT0gWFhNQUkJCQkvKiBNQUlMICovCisjaWZkZWYgQ0tfUkVTRU5ECisJfHwgY3ggPT0gWFhSU0VOCQkJLyogUkVTRU5EICovCisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisJKSB7CisjaWZkZWYgSUtTRAorCWlmIChpbnNlcnZlciAmJiAhRU5BQkxFRChlbl9nZXQpKSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCBzZW5kaW5nIGZpbGVzIGlzIGRpc2FibGVkXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisjZW5kaWYgLyogSUtTRCAqLworCXJldHVybihkb3hzZW5kKGN4KSk7CisgICAgfQorCisvKiBQU0VORCwgQURELCBhbmQgUkVNT1ZFIHVzZSBzcGVjaWFsIHBhcnNpbmcgKi8KKworI2lmZGVmIEFERENNRAorICAgIC8qIEFERCBhbmQgUkVNT1ZFICovCisgICAgaWYgKGN4ID09IFhYQUREIHx8IGN4ID09IFhYUkVNVikgeworCWNoYXIgKiBtOworCW0gPSAoY3ggPT0gWFhBREQpID8gIkFkZCB0byB3aGljaCBsaXN0PyIgOiAiUmVtb3ZlIGZyb20gd2hpY2ggbGlzdD8iOworCXggPSBjbWtleShhZGR0YWIsbmFkZHRhYixtLCIiLHh4c3RyaW5nKTsKKwlpZiAoeCA8IDApCisJICByZXR1cm4oeCk7CisjaWZuZGVmIE5PTVNFTkQKKwlpZiAoeCA9PSBBRERfU05EKQorCSAgcmV0dXJuKGFkZHNlbmQoY3gpKTsKKwllbHNlCisjZW5kaWYgLyogTk9NU0VORCAqLworCSAgcmV0dXJuKGRvYWRkKGN4LHgpKTsKKyAgICB9CisjZW5kaWYgLyogQUREQ01EICovCisKKyNpZmRlZiBDS19SRVNFTkQKKyAgICBpZiAoY3ggPT0gWFhQU0VOKSB7CQkJLyogUFNFTkQgKi8KKwlpbnQgc2Vla3RvID0gMDsKKworCWNtYXJnID0gY21hcmcyID0gIiI7CisJeCA9IGNtaWZpKCJGaWxlIHRvIHBhcnRpYWxseSBzZW5kIiwgIiIsICZzLCAmeSwgeHhzdHJpbmcpOworCWlmICh4IDwgMCkgeworCSAgICBpZiAoeCA9PSAtMykgeworCQlwcmludGYoIj9BIGZpbGUgc3BlY2lmaWNhdGlvbiBpcyByZXF1aXJlZFxuIik7CisJCXJldHVybigtOSk7CisJICAgIH0gZWxzZSByZXR1cm4oeCk7CisJfQorCW5maWxzID0gLTE7CQkJLyogRmlsZXMgY29tZSBmcm9tIGludGVybmFsIGxpc3QuICovCisjaWZuZGVmIE5PTVNFTkQKKyAgICAgICAgYWRkbGlzdCA9IDA7CQkJLyogRG9uJ3QgdXNlIFNFTkQtTElTVC4gKi8KKyAgICAgICAgZmlsZW5leHQgPSBOVUxMOworI2VuZGlmIC8qIE5PTVNFTkQgKi8KKwlja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CS8qIFNhdmUgY29weSBvZiBzdHJpbmcganVzdCBwYXJzZWQuICovCisJZGVidWcoRjExMCwiUFNFTkQgbGluZSIsbGluZSwwKTsKKwlpZiAoeSAhPSAwKSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCB3aWxkY2FyZHMgbm90IHBlcm1pdHRlZCBpbiB0aGlzIGNvbW1hbmRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKwlpZiAoc2l6ZW9mKGludCkgPCA0KSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCB0aGlzIGNvbW1hbmQgbmVlZHMgMzItYml0IGludGVnZXJzXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisJeCA9IGNtbnVtKCJzdGFydGluZyBwb3NpdGlvbiAoYnl0ZSBudW1iZXIpIiwKKwkJICAiIiwxMCwmc2Vla3RvLHh4c3RyaW5nKTsKKwlpZiAoeCA8IDApCisJICByZXR1cm4oeCk7CisJemZucWZwKHMsZnNwZWNsZW4sZnNwZWMpOwkvKiBHZXQgZnVsbCBwYXRoICovCisJaWYgKCh4ID0gY210eHQoIk5hbWUgdG8gc2VuZCBpdCB3aXRoIiwiIiwmcyxOVUxMKSkgPCAwKQorCSAgcmV0dXJuKHgpOworCWNrc3RybmNweSh0bXBidWYscyxUTVBCVUZTSVopOworCisjaWZkZWYgSUtTRAorCWlmIChpbnNlcnZlciAmJiAhRU5BQkxFRChlbl9nZXQpKSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCBzZW5kaW5nIGZpbGVzIGlzIGRpc2FibGVkXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisjZW5kaWYgLyogSUtTRCAqLworI2lmZGVmIFBJUEVTRU5ECisJaWYgKHNuZGZpbHRlcikgeworCSAgICBwcmludGYoIj9Tb3JyeSwgbm8gUFNFTkQgd2hpbGUgU0VORCBGSUxURVIgc2VsZWN0ZWRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworI2lmZGVmIENLX1hZWgorCWlmICgocHJvdG9jb2wgPT0gUFJPVE9fWCB8fCBwcm90b2NvbCA9PSBQUk9UT19YQykpIHsKKwkgICAgcHJpbnRmKCJTb3JyeSwgUFNFTkQgd29ya3Mgb25seSB3aXRoIEtlcm1pdCBwcm90b2NvbFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorI2VuZGlmIC8qIENLX1hZWiAqLworCisJY21hcmcyID0gYnJzdHJpcCh0bXBidWYpOwkvKiBTdHJpcCBicmFjZXMgKi8KKwljbWFyZyA9IGxpbmU7CQkJLyogRmlsZSB0byBzZW5kICovCisJZGVidWcoRjExMCwiUFNFTkQgZmlsZW5hbWUiLGNtYXJnLDApOworCWRlYnVnKEYxMTAsIlBTRU5EIGFzLW5hbWUiLGNtYXJnMiwwKTsKKwlzZW5kc3RhcnQgPSBzZWVrdG87CisJc3N0YXRlID0gJ3MnOwkJCS8qIFNldCBzdGFydCBzdGF0ZSB0byBTRU5EICovCisjaWZuZGVmIE5PTVNFTkQKKwlhZGRsaXN0ID0gMDsKKwlmaWxlbmV4dCA9IE5VTEw7CisjZW5kaWYgLyogTk9NU0VORCAqLworCXNlbmRtb2RlID0gU01fUFNFTkQ7CisjaWZkZWYgTUFDCisJd2hhdCA9IFdfU0VORDsKKwlzY3JjcmVhdGUoKTsKKyNlbmRpZiAvKiBNQUMgKi8KKwlpZiAobG9jYWwpIHsJCQkvKiBJZiBpbiBsb2NhbCBtb2RlLCAqLworCSAgICBkaXNwbGEgPSAxOwkJCS8qIGVuYWJsZSBmaWxlIHRyYW5zZmVyIGRpc3BsYXkgKi8KKwl9CisJcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDS19SRVNFTkQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1hGRVIKKyNpZm5kZWYgTk9NU0VORAorICAgIGlmIChjeCA9PSBYWE1TRSB8fCBjeCA9PSBYWE1NT1ZFKSB7CisjaWZkZWYgTkVXRlRQCisJaWYgKChmdHBnZXQgPT0gMSkgfHwgKChmdHBnZXQgPT0gMikgJiYgZnRwaXNvcGVuKCkpKQorCSAgcmV0dXJuKGRvZnRwcHV0KGN4LDApKTsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKyNpZmRlZiBDS19YWVoKKwlpZiAocHJvdG9jb2wgPT0gUFJPVE9fWCB8fCBwcm90b2NvbCA9PSBQUk9UT19YQykgeworCSAgICBwcmludGYoCisiU29ycnksIHlvdSBjYW4gb25seSBzZW5kIG9uZSBmaWxlIGF0IGEgdGltZSB3aXRoIFhNT0RFTSBwcm90b2NvbFxuIgorCQkgICApOworCSAgICByZXR1cm4oLTkpOworCX0KKyNlbmRpZiAvKiBDS19YWVogKi8KKyAgICAgICAgcmV0dXJuKGRveHNlbmQoY3gpKTsKKyAgICB9CisKKyNpZmRlZiBDT01NRU5UCQkJCS8qIChtb3ZlZCB0byBkb3hzZW5kKSAqLworICAgIGlmIChjeCA9PSBYWE1TRSB8fCBjeCA9PSBYWE1NT1ZFKSB7CS8qIE1TRU5EIGFuZCBNTU9WRSBjb21tYW5kcyAqLworCW5maWxzID0gMDsJCQkvKiBMaWtlIGdldHRpbmcgYSBsaXN0IG9mICovCisJbHAgPSBsaW5lOwkJCS8qIGZpbGVzIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KKwlhZGRsaXN0ID0gMDsJCQkvKiBEbyBub3QgdXNlIFNFTkQtTElTVCAqLworCWZpbGVuZXh0ID0gTlVMTDsJCS8qIERpdHRvICEgKi8KKworCXdoaWxlICgxKSB7CisJICAgIGNoYXIgKnA7CisJICAgIGlmICgoeCA9IGNtaWZpKCJOYW1lcyBvZiBmaWxlcyB0byBzZW5kLCBzZXBhcmF0ZWQgYnkgc3BhY2VzIiwiIiwKKwkJCSAgICZzLCZ5LHh4c3RyaW5nKSkgPCAwKSB7CisJCWlmICh4ID09IC0zKSB7CisJCSAgICBpZiAobmZpbHMgPD0gMCkgeworCQkJcHJpbnRmKCI/QSBmaWxlIHNwZWNpZmljYXRpb24gaXMgcmVxdWlyZWRcbiIpOworCQkJcmV0dXJuKC05KTsKKwkJICAgIH0gZWxzZSBicmVhazsKKwkJfQorCQlyZXR1cm4oeCk7CisJICAgIH0KKwkgICAgbXNmaWxlc1tuZmlscysrXSA9IGxwOwkvKiBHb3Qgb25lLCBjb3VudCBpdCwgcG9pbnQgdG8gaXQsICovCisJICAgIHAgPSBscDsJCQkvKiByZW1lbWJlciBwb2ludGVyLCAqLworCSAgICB3aGlsZSAoKmxwKysgPSAqcysrKQkvKiBhbmQgY29weSBpdCBpbnRvIGJ1ZmZlciAqLworCSAgICAgIGlmIChscCA+IChsaW5lICsgTElOQlVGU0laKSkgeyAvKiBBdm9pZCBtZW1vcnkgbGVhayAqLworCQkgIHByaW50ZigiP01TRU5EIGxpc3QgdG9vIGxvbmdcbiIpOworCQkgIGxpbmVbMF0gPSBOVUw7CisJCSAgcmV0dXJuKC05KTsKKwkgICAgICB9CisJICAgIGRlYnVnKEYxMTEsIm1zZmlsZXMiLG1zZmlsZXNbbmZpbHMtMV0sbmZpbHMtMSk7CisJICAgIGlmIChuZmlscyA9PSAxKSAqZnNwZWMgPSBOVUw7IC8qIFRha2UgY2FyZSBvZiBcdihmaWxlc3BlYykgKi8KKyNpZmRlZiBaRk5RRlAKKwkgICAgemZucWZwKHAsVE1QQlVGU0laLHRtcGJ1Zik7CisJICAgIHAgPSB0bXBidWY7CisjZW5kaWYgLyogWkZOUUZQICovCisJICAgIGlmICgoKGludClzdHJsZW4oZnNwZWMpICsgKGludClzdHJsZW4ocCkgKyAxKSA8IGZzcGVjbGVuKSB7CisJCXN0cmNhdChmc3BlYyxwKTsJLyogc2FmZSAqLworCQlzdHJjYXQoZnNwZWMsIiAiKTsJLyogc2FmZSAqLworCSAgICB9IGVsc2UgcHJpbnRmKCJXQVJOSU5HIC0gXFx2KGZpbGVzcGVjKSBidWZmZXIgb3ZlcmZsb3dcbiIpOworCX0KKwljbWxpc3QgPSBtc2ZpbGVzOwkJLyogUG9pbnQgY21saXN0IHRvIHBvaW50ZXIgYXJyYXkgKi8KKwljbWFyZzIgPSAiIjsJCQkvKiBObyBpbnRlcm5hbCBleHBhbnNpb24gbGlzdCAoeWV0KSAqLworCXNuZHNyYyA9IG5maWxzOwkJCS8qIEZpbGVuYW1lcyBjb21lIGZyb20gY21saXN0ICovCisJc2VuZG1vZGUgPSBTTV9NU0VORDsJCS8qIFJlbWVtYmVyIHRoaXMga2luZCBvZiBTRU5EaW5nICovCisJc3N0YXRlID0gJ3MnOwkJCS8qIFNldCBzdGFydCBzdGF0ZSBmb3IgU0VORCAqLworCWlmIChjeCA9PSBYWE1NT1ZFKQkJLyogSWYgTU1PVkUnaW5nLCAqLworCSAgbW92aW5nID0gMTsJCQkvKiAgc2V0IHRoaXMgZmxhZy4gKi8KKyNpZmRlZiBNQUMKKwl3aGF0ID0gV19TRU5EOworCXNjcmNyZWF0ZSgpOworI2VuZGlmIC8qIE1BQyAqLworCWlmIChsb2NhbCkgewkJCS8qIElmIGluIGxvY2FsIG1vZGUsICovCisJICAgIGRpc3BsYSA9IDE7CQkJLyogdHVybiBvbiBmaWxlIHRyYW5zZmVyIGRpc3BsYXkgKi8KKwkgICAgdHRmbHVpKCk7CQkJLyogYW5kIGZsdXNoIHR0eSBpbnB1dCBidWZmZXIuICovCisJfQorCXJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIE5PTVNFTkQgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1NFUlZFUgorICAgIGlmIChjeCA9PSBYWFNFUikgewkJCS8qIFNFUlZFUiAqLworI2lmZGVmIENLX1hZWgorCWlmIChwcm90b2NvbCAhPSBQUk9UT19LKSB7CisJICAgIHByaW50ZigiU29ycnksIFNFUlZFUiBvbmx5IHdvcmtzIHdpdGggS2VybWl0IHByb3RvY29sXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisjZW5kaWYgLyogQ0tfWFlaICovCisjaWZkZWYgQ09NTUVOVAorLyoKKyAgUGFyc2UgZm9yIHRpbWUgbGltaXQsIGJ1dCBzaW5jZSB3ZSBkb24ndCB1c2UgaXQgeWV0LAorICB0aGUgcGFyc2luZyBpcyBjb21tZW50ZWQgb3V0LgorKi8KKwl4X2lmbnVtID0gMTsJCQkvKiBUdXJuIG9mZiBpbnRlcm5hbCBjb21wbGFpbnRzICovCisJeSA9IGNtbnVtKCJvcHRpb25hbCB0aW1lIGxpbWl0LCBzZWNvbmRzLCBvciB0aW1lIG9mIGRheSBhcyBoaDptbTpzcyIsCisJCSAgIjAiLCAxMCwgJngsIHh4c3RyaW5nCisJCSAgKTsKKwl4X2lmbnVtID0gMDsKKwlpZiAoeSA8IDApIHsKKwkgICAgaWYgKHkgPT0gLTIpIHsJCS8qIEludmFsaWQgbnVtYmVyIG9yIGV4cHJlc3Npb24gKi8KKwkJenogPSB0b2Qyc2VjKGF0bWJ1Zik7CS8qIENvbnZlcnQgdG8gc2VjcyBzaW5jZSBtaWRuaWdodCAqLworCQlpZiAoenogPCAwTCkgeworCQkgICAgcHJpbnRmKCI/TnVtYmVyLCBleHByZXNzaW9uLCBvciB0aW1lIG9mIGRheSByZXF1aXJlZFxuIik7CisJCSAgICByZXR1cm4oLTkpOworCQl9IGVsc2UgeworCQkgICAgY2hhciBub3dbMzJdOwkvKiBDdXJyZW50IHRpbWUgKi8KKwkJICAgIGNoYXIgKnA7CisJCSAgICBsb25nIHRub3c7CisJCSAgICBwID0gbm93OworCQkgICAgenRpbWUoJnApOworCQkgICAgdG5vdyA9IGF0b2wocCsxMSkgKiAzNjAwTCArIGF0b2wocCsxNCkgKiA2MEwgKyBhdG9sKHArMTcpOworCQkgICAgaWYgKHp6IDwgdG5vdykJLyogVXNlcidzIHRpbWUgYmVmb3JlIG5vdyAqLworCQkgICAgICB6eiArPSA4NjQwMEw7CS8qIFNvIG1ha2UgaXQgdG9tb3Jyb3cgKi8KKwkJICAgIHp6IC09IHRub3c7CQkvKiBTZWNvbmRzIGZyb20gbm93LiAqLworCQl9CisJICAgIH0gZWxzZQorCSAgICAgIHJldHVybih5KTsKKwl9CisJaWYgKHp6ID4gLTFMKSB7CisJICAgIHggPSB6ejsKKwkgICAgaWYgKHp6ICE9IChsb25nKSB4KSB7CisJCXByaW50ZigKKyJTb3JyeSwgYXJpdGhtZXRpYyBvdmVyZmxvdyAtIGhoOm1tOnNzIG5vdCB1c2FibGUgb24gdGhpcyBwbGF0Zm9ybS5cbiIKKwkJICAgICAgICk7CisJCXJldHVybigtOSk7CisJICAgIH0KKwl9CisJaWYgKHggPCAwKQorCSAgeCA9IDA7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisJaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisJc3N0YXRlID0gJ3gnOworI2lmZGVmIE1BQworCXdoYXQgPSBXX1JFQ1Y7CisJc2NyY3JlYXRlKCk7CisjZW5kaWYgLyogTUFDICovCisJaWYgKGxvY2FsKSBkaXNwbGEgPSAxOworI2lmZGVmIEFNSUdBCisJcmVxb2ZmKCk7CQkJLyogTm8gRE9TIHJlcXVlc3RvcnMgd2hpbGUgc2VydmVyICovCisjZW5kaWYgLyogQU1JR0EgKi8KKwlyZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIE5PU0VSVkVSICovCisKKyAgICBpZiAoY3ggPT0gWFhTQVZFKSB7CQkJLyogU0FWRSBjb21tYW5kICovCisJeCA9IGNta2V5KHNhdnRhYixuc2F2LCJvcHRpb24iLCJrZXltYXAiLHh4c3RyaW5nKTsKKwlpZiAoeCA9PSAtMykgeworCSAgICBwcmludGYoIj9Zb3UgbXVzdCBzcGVjaWZ5IGFuIG9wdGlvbiB0byBzYXZlXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisJaWYgKHggPCAwKSByZXR1cm4oeCk7CisJLyogaGF2ZSB0byBzZXQgc3VjY2VzcyBzZXBhcmF0ZWx5IGZvciBlYWNoIGl0ZW0gaW4gZG9wcm0oKS4uLiAqLworCS8qIGFjdHVhbGx5IG5vdCByZWFsbHksIGNvdWxkIGhhdmUganVzdCBoYWQgZG9wcm0gcmV0dXJuIDAgb3IgMSAqLworCS8qIGFuZCBzZXQgc3VjY2VzcyBoZXJlLi4uICovCisJeSA9IGRvc2F2ZSh4KTsKKwlpZiAoeSA9PSAtMykgeworCSAgICBwcmludGYoIj9Nb3JlIGZpZWxkcyByZXF1aXJlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfSBlbHNlIHJldHVybih5KTsKKyAgICB9CisKKyAgICBpZiAoY3ggPT0gWFhTRVQpIHsJCQkvKiBTRVQgY29tbWFuZCAqLworCXggPSBjbWtleShwcm10YWIsbnBybSwiUGFyYW1ldGVyIiwiIix4eHN0cmluZyk7CisJaWYgKHggPT0gLTMpIHsKKwkgICAgcHJpbnRmKCI/WW91IG11c3Qgc3BlY2lmeSBhIHBhcmFtZXRlciB0byBzZXRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKwlpZiAoeCA8IDApIHJldHVybih4KTsKKwkvKiBoYXZlIHRvIHNldCBzdWNjZXNzIHNlcGFyYXRlbHkgZm9yIGVhY2ggaXRlbSBpbiBkb3BybSgpLi4uICovCisJLyogYWN0dWFsbHkgbm90IHJlYWxseSwgY291bGQgaGF2ZSBqdXN0IGhhZCBkb3BybSByZXR1cm4gMCBvciAxICovCisJLyogYW5kIHNldCBzdWNjZXNzIGhlcmUuLi4gKi8KKwl5ID0gZG9wcm0oeCwwKTsKKwlpZiAoeSA9PSAtMykgeworCSAgICBwcmludGYoIj9Nb3JlIGZpZWxkcyByZXF1aXJlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfSBlbHNlIHJldHVybih5KTsKKyAgICB9CisKKyNpZm5kZWYgTk9QVVNICisgICAgaWYgKGN4ID09IFhYU0hFCQkJLyogU0hFTEwgKHN5c3RlbSkgY29tbWFuZCAqLworCXx8IGN4ID09IFhYRVhFQwkJCS8qIGV4ZWMoKSAqLworCSkgeworCWludCByeCA9IDA7CisJY2hhciAqIHAgPSBOVUxMOworCWludCBpIC8qICxuICovIDsKKyNpZmRlZiBVTklYT1JPU0sKKwljaGFyICogYXJnc1syNTZdOworI2VuZGlmIC8qIFVOSVhPUk9TSyAqLworCisjaWZkZWYgSUtTRAorCWlmIChpbnNlcnZlciAmJiAobm9wdXNoIHx8ICFFTkFCTEVEKGVuX2hvcykpKSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCBob3N0IGNvbW1hbmQgYWNjZXNzIGlzIGRpc2FibGVkXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisjZW5kaWYgLyogSUtTRCAqLworCisjaWZkZWYgQ0tFWEVDCisJaWYgKGN4ID09IFhYRVhFQykgewkJLyogRVhFQyAob3ZlcmxheSBvdXJzZWx2ZXMpICovCisJICAgIHN0cnVjdCBGREIgc3csIGZsOworCSAgICBjbWZkYmkoJnN3LAkJCS8qIEZpcnN0IEZEQiAtIGNvbW1hbmQgc3dpdGNoZXMgKi8KKwkJICAgX0NNS0VZLAkJLyogZmNvZGUgKi8KKwkJICAgIkNvbW1hbmQgdG8gb3ZlcmxheSBDLUtlcm1pdFxuIG9yIHN3aXRjaCIsIC8qIGhscG1zZyAqLworCQkgICAiIiwJCQkvKiBkZWZhdWx0ICovCisJCSAgICIiLAkJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJCSAgIDEsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisJCSAgIDQsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworCQkgICB4eHN0cmluZywJCS8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKwkJICAgcmVkaXJzdywJCS8qIEtleXdvcmQgdGFibGUgKi8KKwkJICAgJmZsCQkJLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworCQkgICApOworCSAgICBjbWZkYmkoJmZsLAkJCS8qIDJuZCBGREIgLSBjb21tYW5kIHRvIGV4ZWMgKi8KKwkJICAgX0NNRkxELAkJLyogZmNvZGUgKi8KKwkJICAgIkNvbW1hbmQgdG8gb3ZlcmxheSBDLUtlcm1pdCIsIC8qIGhscG1zZyAqLworCQkgICAiIiwJCQkvKiBkZWZhdWx0ICovCisJCSAgICIiLAkJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJCSAgIDAsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKwkJICAgMCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworCQkgICB4eHN0cmluZywKKwkJICAgTlVMTCwKKwkJICAgTlVMTAkJCS8qIE5vIG1vcmUgYWZ0ZXIgdGhpcyAqLworCQkgICApOworCSAgICB3aGlsZSAoMSkgeworCQl4ID0gY21mZGIoJnN3KTsJCS8qIFBhcnNlIHNvbWV0aGluZyAqLworCQlkZWJ1ZyhGMTAxLCJleGVjIGNtZmRiIiwiIix4KTsKKwkJaWYgKHggPCAwKQorCQkgIHJldHVybih4KTsKKwkJLyogR2VuZXJhbGl6ZSB0aGlzIGlmIHdlIGFkZCBtb3JlIHN3aXRjaGVzICovCisJCWlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01LRVkpIHsKKwkJICAgIHJ4ID0gMTsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJCWlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01GTEQpCisJCSAgYnJlYWs7CisJCXJldHVybigtMik7CisJICAgIH0KKwkgICAgY2tzdHJuY3B5KHRtcGJ1ZixjbXJlc3VsdC5zcmVzdWx0LFRNUEJVRlNJWik7CisJICAgIGlmICghdG1wYnVmWzBdKSB7CisJCXByaW50ZigiP0NvbW1hbmQgcmVxdWlyZWRcbiIpOworCQlyZXR1cm4oLTkpOworCSAgICB9CisJICAgIHAgPSBicnN0cmlwKHRtcGJ1Zik7CisJICAgIGFyZ3NbMF0gPSBOVUxMOwkJLyogU2V0IGFyZ3ZbMF0gdG8gaXQgKi8KKwkgICAgbWFrZXN0cigmYXJnc1swXSxwKTsKKwkgICAgZm9yIChpID0gMTsgaSA8IDI1NTsgaSsrKSB7CS8qIEdldCBhcmd1bWVudHMgZm9yIGNvbW1hbmQgKi8KKwkJaWYgKCh4ID0gY21mbGQoIkFyZ3VtZW50IiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworCQkgICAgaWYgKHggPT0gLTMpIHsKKwkJCWlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKwkJCSAgcmV0dXJuKHgpOworCQkJYnJlYWs7CisJCSAgICB9IGVsc2UKKwkJICAgICAgcmV0dXJuKHgpOworCQl9CisJCWFyZ3NbaV0gPSBOVUxMOworCQlzID0gYnJzdHJpcChzKTsKKwkJbWFrZXN0cigmYXJnc1tpXSxzKTsKKwkgICAgfQorCSAgICBhcmdzW2ldID0gTlVMTDsKKwl9IGVsc2UgeworI2VuZGlmIC8qIENLRVhFQyAqLworCSAgICBpZiAoKHggPSBjbXR4dCgiU3lzdGVtIGNvbW1hbmQgdG8gZXhlY3V0ZSIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisJICAgICAgcmV0dXJuKHgpOworI2lmZGVmIENLRVhFQworCX0KKyNlbmRpZiAvKiBDS0VYRUMgKi8KKyAgICAgICAgaWYgKG5vcHVzaCkKKyAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworI2lmZGVmIENLX0FQQworCWlmIChhcGNhY3RpdmUgPT0gQVBDX1JFTU9URSAmJiAhKGFwY3N0YXR1cyAmIEFQQ19VTkNIKSkKKwkgIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogQ0tfQVBDICovCisJY29ucmVzKCk7CQkJLyogTWFrZSBjb25zb2xlIG5vcm1hbCAgKi8KKyNpZmRlZiBPUzIKKwlpZiAoIShzICYmICpzKSkgeworCSAgICBvczJwdXNoKCk7CisgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCX0gZWxzZQorI2VuZGlmIC8qIE9TMiAqLworCSAgaWYgKGN4ID09IFhYU0hFKSB7CisJICAgICAgeCA9IHpzaGNtZChzKTsKKwkgICAgICBkZWJ1ZyhGMTAxLCJSVU4genNoY21kIGNvZGUiLCIiLHgpOworCSAgICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7CisJICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSB4KTsKKyNpZmRlZiBDS0VYRUMKKwkgIH0gZWxzZSB7CisjaWZkZWYgREVCVUcKKwkgICAgICBpZiAoZGVibG9nKSB7CisJCSAgZGVidWcoRjExMSwiRVhFQyBjbWQiLHAsMCk7CisJCSAgZm9yIChpID0gMDsgaSA8IDI1NiAmJiBhcmdzW2ldOyBpKyspCisJCSAgICBkZWJ1ZyhGMTExLCJFWEVDIGFyZyIsYXJnc1tpXSxpKTsKKwkgICAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKwkgICAgICBpZiAocCkgeworCQkgIHpfZXhlYyhwLGFyZ3MscngpOwkvKiBPdmVybGF5IG91cnNlbGYgKi8KKwkJICBkZWJ1ZyhGMTAwLCJFWEVDIGZhaWxzIiwiIiwwKTsKKwkJICBjb25jYigoY2hhcillc2NhcGUpOwkvKiBJbiBjYXNlIGl0IHJldHVybnMgKi8KKwkgICAgICB9CisJICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyNlbmRpZiAvKiBDS0VYRUMgKi8KKwkgIH0KKyAgICB9CisKKyNpZmRlZiBDS19SRURJUgorICAgIGlmIChjeCA9PSBYWEZVTikgewkJCS8qIFJFRElSRUNUICovCisjaWZkZWYgQ0tfQVBDCisJaWYgKChhcGNhY3RpdmUgPT0gQVBDX0xPQ0FMKSB8fAorCSAgICAoKGFwY2FjdGl2ZSA9PSBBUENfUkVNT1RFKSAmJiAoIShhcGNzdGF0dXMgJiBBUENfVU5DSCkpKSkKKwkgIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogQ0tfQVBDICovCisJY2ttYWttc2codG1wYnVmLAorCQkgVE1QQlVGU0laLAorCQkgIkxvY2FsIGNvbW1hbmQgdG8gcnVuLFxuIiwKKwkJICJ3aXRoIGl0cyBzdGFuZGFyZCBpbnB1dC9vdXRwdXQgcmVkaXJlY3RlZCB0byAiLAorCQkgbG9jYWwgPyB0dG5hbWUgOiAidGhlIGNvbW11bmljYXRpb25zIGNvbm5lY3Rpb24iLAorCQkgIlxuIgorCQkgKTsKKwlpZiAoKHggPSBjbXR4dCh0bXBidWYsIiIsJnMseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeCk7CisgICAgICAgIGlmIChub3B1c2gpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1JFRElSRUNUIGRpc2FibGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzPTApOworICAgICAgICB9CisJaWYgKCFsb2NhbCkgeworCSAgICBwcmludGYoIj9TRVQgTElORSBvciBTRVQgSE9TVCByZXF1aXJlZCBmaXJzdFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCWlmICghKnMpIHsKKwkgICAgcHJpbnRmKCI/UkVESVJFQ1QgcmVxdWlyZXMgYSBjb21tYW5kIHRvIHJlZGlyZWN0XG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisJcmV0dXJuKHN1Y2Nlc3MgPSB0dHJ1bmNtZChzKSk7CisgICAgfQorI2VuZGlmIC8qIENLX1JFRElSICovCisjZW5kaWYgLyogTk9QVVNIICovCisKKyNpZm5kZWYgTk9TSE9XCisgICAgaWYgKGN4ID09IFhYU0hPKSB7CQkJLyogU0hPVyAqLworCXggPSBjbWtleShzaG90YWIsbnNobywiIiwicGFyYW1ldGVycyIseHhzdHJpbmcpOworCWlmICh4IDwgMCkgcmV0dXJuKHgpOworCXJldHVybihkb3Nob3coeCkpOworICAgIH0KKyNlbmRpZiAvKiBOT1NIT1cgKi8KKworI2lmbmRlZiBNQUMKKyAgICBpZiAoY3ggPT0gWFhTUEEpIHsJCQkvKiBTUEFDRSAqLworI2lmZGVmIElLU0QKKwlpZiAoaW5zZXJ2ZXIgJiYgIUVOQUJMRUQoZW5fc3BhKSkgeworCSAgICBwcmludGYoIj9Tb3JyeSwgU1BBQ0UgY29tbWFuZCBkaXNhYmxlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBkYXRhZ2VuZXJhbAorCS8qIEFPUy9WUyBjYW4gdGFrZSBhbiBhcmd1bWVudCBhZnRlciBpdHMgInNwYWNlIiBjb21tYW5kLiAqLworCWlmICgoeCA9IGNtdHh0KCJDb25maXJtLCBvciBsb2NhbCBkaXJlY3RvcnkgbmFtZSIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeCk7CisJaWYgKG5vcHVzaCkgeworCSAgICBwcmludGYoIj9Tb3JyeSwgU1BBQ0UgY29tbWFuZCBkaXNhYmxlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfSBlbHNlIGlmICgqcyA9PSBOVUwpIHsKKwkgICAgeHN5c3RlbShTUEFDTUQpOworCX0gZWxzZSB7CisJICAgIGNrbWFrbXNnKGxpbmUsTElOQlVGU0laLCJzcGFjZSAiLHMsTlVMTCxOVUxMKTsKKwkgICAgeHN5c3RlbShsaW5lKTsKKwl9CisjZWxzZQorI2lmZGVmIE9TMgorCWlmICgoeCA9IGNtdHh0KCJQcmVzcyBFbnRlciBmb3IgY3VycmVudCBkaXNrLFxuXAorIG9yIHNwZWNpZnkgYSBkaXNrIGxldHRlciBsaWtlIEE6IiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih4KTsKKwlpZiAoKnMgPT0gTlVMKSB7CQkvKiBDdXJyZW50IGRpc2sgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc3BhY2UgPSB6ZHNrc3BhY2UoMCk7CisgICAgICAgICAgICBpZiAoc3BhY2UgPiAwICYmIHNwYWNlIDwgMTAyNCkKKyAgICAgICAgICAgICAgcHJpbnRmKCIgRnJlZSBzcGFjZTogdW5rbm93blxuIik7CisgICAgICAgICAgICBlbHNlCisJICAgICAgcHJpbnRmKCIgRnJlZSBzcGFjZTogJWxkS1xuIiwgc3BhY2UvMTAyNEwpOworCX0gZWxzZSB7CisJICAgIGludCBkcml2ZSA9IHRvdXBwZXIoKnMpOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzcGFjZSA9IHpkc2tzcGFjZShkcml2ZSAtICdBJyArIDEpOworICAgICAgICAgICAgaWYgKHNwYWNlID4gMCAmJiBzcGFjZSA8IDEwMjQpCisgICAgICAgICAgICAgIHByaW50ZigiIERyaXZlICVjOiB1bmtub3duIGZyZWVcbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwcmludGYoIiBEcml2ZSAlYzogJWxkSyBmcmVlXG4iLCBkcml2ZSxzcGFjZSAvIDEwMjRMKTsKKwl9CisjZWxzZQorI2lmZGVmIFVOSVhPUk9TSworCXggPSBjbWRpcigiQ29uZmlybSBmb3IgY3VycmVudCBkaXNrLFxuXAorIG9yIHNwZWNpZnkgYSBkaXNrIGRldmljZSBvciBkaXJlY3RvcnkiLCIiLCZzLHh4c3RyaW5nKTsKKwlpZiAoeCA9PSAtMykKKwkgIHMgPSAiIjsKKwllbHNlIGlmICh4IDwgMCkKKwkgIHJldHVybih4KTsKKyAgICAgICAgY2tzdHJuY3B5KHRtcGJ1ZixzLFRNUEJVRlNJWik7CisgICAgICAgIHMgPSB0bXBidWY7CisJaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisJaWYgKG5vcHVzaCkgeworCSAgICBwcmludGYoIj9Tb3JyeSwgU1BBQ0UgY29tbWFuZCBkaXNhYmxlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCWlmICghKnMpIHsJCQkvKiBDdXJyZW50IGRpc2sgKi8KKwkgICAgeHN5c3RlbShTUEFDTUQpOworCX0gZWxzZSB7CQkJLyogU3BlY2lmaWVkIGRpc2sgKi8KKwkgICAgY2ttYWttc2cobGluZSxMSU5CVUZTSVosU1BBQ00yLCIgIixzLE5VTEwpOworCSAgICB4c3lzdGVtKGxpbmUpOworCX0KKyNlbHNlCisJaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisJaWYgKG5vcHVzaCkgeworCSAgICBwcmludGYoIj9Tb3JyeSwgU1BBQ0UgY29tbWFuZCBkaXNhYmxlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCXhzeXN0ZW0oU1BBQ01EKTsKKyNlbmRpZiAvKiBVTklYT1JPU0sgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworCXJldHVybihzdWNjZXNzID0gMSk7CQkvKiBQcmV0ZW5kIGl0IHdvcmtlZCAqLworICAgIH0KKyNlbmRpZiAvKiBNQUMgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICBpZiAoY3ggPT0gWFhTVEEpIHsJCQkvKiBTVEFUSVNUSUNTICovCisJaWYgKCh4ID0gY21rZXkoc3RhdHRhYiwyLCJDYXJyaWFnZSByZXR1cm4sIG9yIG9wdGlvbiIsCisJCSAgICAgICAiL2JyaWVmIix4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih4KTsKKwlpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKwlyZXR1cm4oc3VjY2VzcyA9IGRvc3RhdCh4KSk7CisgICAgfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisgICAgaWYgKGN4ID09IFhYU1RPIHx8IGN4ID09IFhYRU5EKSB7CS8qIFNUT1AsIEVORCwgb3IgUE9QICovCisJaWYgKCh5ID0gY21udW0oImV4aXQgc3RhdHVzIGNvZGUiLCIwIiwxMCwmeCx4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih5KTsKKwlpZiAoKHkgPSBjbXR4dCgiTWVzc2FnZSB0byBwcmludCIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeSk7CisJcyA9IGJyc3RyaXAocyk7CisJaWYgKCpzKSBwcmludGYoIiVzXG4iLHMpOworCWlmIChjeCA9PSBYWFNUTykgeworCSAgICBkb3N0b3AoKTsKKwl9IGVsc2UgeworCSAgICBkb2VuZCh4KTsKKwl9CisJcmV0dXJuKHN1Y2Nlc3MgPSAoeCA9PSAwKSk7CisgICAgfQorICAgIGlmIChjeCA9PSBYWFNVUykgewkJCS8qIFNVU1BFTkQgKi8KKwlpZiAoKHkgPSBjbWNmbSgpKSA8IDApIHJldHVybih5KTsKKyNpZmRlZiBOT0pDCisJcHJpbnRmKCJTb3JyeSwgdGhpcyB2ZXJzaW9uIG9mIEtlcm1pdCBjYW5ub3QgYmUgc3VzcGVuZGVkXG4iKTsKKyNlbHNlCisjaWZkZWYgSUtTRAorCWlmIChpbnNlcnZlcikgeworCSAgICBwcmludGYoIj9Tb3JyeSwgSUtTRCBjYW4gbm90IGJlIHN1c3BlbmRlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfSBlbHNlCisjZW5kaWYgLyogSUtTRCAqLworCSAgaWYgKG5vcHVzaCkgeworCSAgICBwcmludGYoIj9Tb3JyeSwgYWNjZXNzIHRvIHN5c3RlbSBpcyBkaXNhYmxlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCXN0cHRyYXAoMCk7CisjZW5kaWYgLyogTk9KQyAqLworCXJldHVybigwKTsKKyAgICB9CisKKyAgICBpZiAoY3ggPT0gWFhUQUspIHsJCQkvKiBUQUtFICovCisJY2hhciAqIHNjcmlwdGVudiA9IE5VTEw7CQorI2lmZGVmIE9TMgorICAgICAgICBjaGFyICogR2V0QXBwRGF0YShpbnQpOworCWV4dGVybiBjaGFyIHN0YXJ0dXBkaXJbXSxleGVkaXJbXSxpbmlkaXJbXTsKKwljaGFyICoga2V5bWFwZW52ID0gTlVMTDsKKyAgICAgICAgY2hhciAqIGFwcGRhdGEwID0gTlVMTCwgKmFwcGRhdGExID0gTlVMTDsKKwlpbnQgeHg7CisjZGVmaW5lIFRBS0VQQVRITEVOIDQwOTYKKyNlbHNlIC8qIE9TMiAqLworI2RlZmluZSBUQUtFUEFUSExFTiAxMDI0CisjZW5kaWYgLyogT1MyICovCisJY2hhciB0YWtlcGF0aFtUQUtFUEFUSExFTl07CisKKwlpZiAodGxldmVsID49IE1BWFRBS0UtMSkgeworCSAgICBwcmludGYoIj9UYWtlIGZpbGVzIG5lc3RlZCB0b28gZGVlcGx5XG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisjaWZkZWYgT1MyCisjaWZkZWYgTlQKKwlzY3JpcHRlbnYgPSBnZXRlbnYoIks5NVNDUklQVFMiKTsKKwlrZXltYXBlbnYgPSBnZXRlbnYoIks5NUtFWU1BUFMiKTsKKyAgICAgICAgbWFrZXN0cigmYXBwZGF0YTAsKGNoYXIgKilHZXRBcHBEYXRhKDApKTsKKyAgICAgICAgbWFrZXN0cigmYXBwZGF0YTEsKGNoYXIgKilHZXRBcHBEYXRhKDEpKTsKKyNlbHNlIC8qIE5UICovCisJc2NyaXB0ZW52ID0gZ2V0ZW52KCJLMlNDUklQVFMiKTsKKwlrZXltYXBlbnYgPSBnZXRlbnYoIksyS0VZTUFQUyIpOworI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogT1MyICovCisKKwlpZiAoIXNjcmlwdGVudikJCQkvKiBMZXQgdGhpcyB3b3JrIGZvciBVbml4IGV0YyB0b28gKi8KKwkgIHNjcmlwdGVudiA9IGdldGVudigiQ0tfU0NSSVBUUyIpOyAvKiBVc2UgdGhpcyBpZiBkZWZpbmVkICovCisjaWZuZGVmIE9TMgorCWlmICghc2NyaXB0ZW52KQkJCS8qIE90aGVyd2lzZSB1c2UgaG9tZSBkaXJlY3RvcnkgKi8KKwkgIHNjcmlwdGVudiA9IGhvbWVwYXRoKCk7CisjZW5kaWYgLyogT1MyICovCisJaWYgKCFzY3JpcHRlbnYpCisJICBzY3JpcHRlbnYgPSAiIjsKKwlja3N0cm5jcHkodGFrZXBhdGgsc2NyaXB0ZW52LFRBS0VQQVRITEVOKTsKKwlkZWJ1ZyhGMTEwLCJUQUtFIGluaXRpYWwgdGFrZXBhdGgiLHRha2VwYXRoLDApOworCisjaWZkZWYgT1MyCisJaWYgKCFrZXltYXBlbnYpCisJICBrZXltYXBlbnYgPSBnZXRlbnYoIkNLX0tFWU1BUFMiKTsKKwlpZiAoIWtleW1hcGVudikKKwkgIGtleW1hcGVudiA9ICIiOworCisJY2tzdHJuY2F0KHRha2VwYXRoLAorCQkgIChzY3JpcHRlbnYgJiYgc2NyaXB0ZW52W3N0cmxlbihzY3JpcHRlbnYpLTFdPT0nOycpPyIiOiI7IiwKKwkJICBUQUtFUEFUSExFTgorCQkgICk7CisJY2tzdHJuY2F0KHRha2VwYXRoLGtleW1hcGVudj9rZXltYXBlbnY6IiIsVEFLRVBBVEhMRU4pOworCWNrc3RybmNhdCh0YWtlcGF0aCwKKwkJICAoa2V5bWFwZW52ICYmIGtleW1hcGVudltzdHJsZW4oa2V5bWFwZW52KS0xXT09JzsnKT8iIjoiOyIsCisJCSAgVEFLRVBBVEhMRU4KKwkJICApOworCWNrc3RybmNhdCh0YWtlcGF0aCxzdGFydHVwZGlyLFRBS0VQQVRITEVOKTsKKwlja3N0cm5jYXQodGFrZXBhdGgsIjsiLFRBS0VQQVRITEVOKTsKKwlja3N0cm5jYXQodGFrZXBhdGgsc3RhcnR1cGRpcixUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLCJTQ1JJUFRTLzsiLFRBS0VQQVRITEVOKTsKKwlja3N0cm5jYXQodGFrZXBhdGgsc3RhcnR1cGRpcixUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLCJLRVlNQVBTLzsiLFRBS0VQQVRITEVOKTsKKworCWNrc3RybmNhdCh0YWtlcGF0aCxhcHBkYXRhMSxUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLCJLZXJtaXQgOTUvOyIsVEFLRVBBVEhMRU4pOworCWNrc3RybmNhdCh0YWtlcGF0aCxhcHBkYXRhMSxUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLCJLZXJtaXQgOTUvU0NSSVBUUy87IixUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLGFwcGRhdGExLFRBS0VQQVRITEVOKTsKKwlja3N0cm5jYXQodGFrZXBhdGgsIktlcm1pdCA5NS9LRVlNQVBTLzsiLFRBS0VQQVRITEVOKTsKKworCWNrc3RybmNhdCh0YWtlcGF0aCxhcHBkYXRhMCxUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLCJLZXJtaXQgOTUvOyIsVEFLRVBBVEhMRU4pOworCWNrc3RybmNhdCh0YWtlcGF0aCxhcHBkYXRhMCxUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLCJLZXJtaXQgOTUvU0NSSVBUUy87IixUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLGFwcGRhdGEwLFRBS0VQQVRITEVOKTsKKwlja3N0cm5jYXQodGFrZXBhdGgsIktlcm1pdCA5NS9LRVlNQVBTLzsiLFRBS0VQQVRITEVOKTsKKworCWNrc3RybmNhdCh0YWtlcGF0aCxpbmlkaXIsVEFLRVBBVEhMRU4pOworCWNrc3RybmNhdCh0YWtlcGF0aCwiOyIsVEFLRVBBVEhMRU4pOworCWNrc3RybmNhdCh0YWtlcGF0aCxpbmlkaXIsVEFLRVBBVEhMRU4pOworCWNrc3RybmNhdCh0YWtlcGF0aCwiU0NSSVBUUy87IixUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLGluaWRpcixUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLCJLRVlNQVBTLzsiLFRBS0VQQVRITEVOKTsKKworCWNrc3RybmNhdCh0YWtlcGF0aCx6aG9tZSgpLFRBS0VQQVRITEVOKTsKKwlja3N0cm5jYXQodGFrZXBhdGgsIjsiLFRBS0VQQVRITEVOKTsKKwlja3N0cm5jYXQodGFrZXBhdGgsemhvbWUoKSxUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLCJTQ1JJUFRTLzsiLFRBS0VQQVRITEVOKTsKKwlja3N0cm5jYXQodGFrZXBhdGgsemhvbWUoKSxUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLCJLRVlNQVBTLzsiLFRBS0VQQVRITEVOKTsKKworCWNrc3RybmNhdCh0YWtlcGF0aCxleGVkaXIsVEFLRVBBVEhMRU4pOworCWNrc3RybmNhdCh0YWtlcGF0aCwiOyIsVEFLRVBBVEhMRU4pOworCWNrc3RybmNhdCh0YWtlcGF0aCxleGVkaXIsVEFLRVBBVEhMRU4pOworCWNrc3RybmNhdCh0YWtlcGF0aCwiU0NSSVBUUy87IixUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLGV4ZWRpcixUQUtFUEFUSExFTik7CisJY2tzdHJuY2F0KHRha2VwYXRoLCJLRVlNQVBTLzsiLFRBS0VQQVRITEVOKTsKKyNlbmRpZiAvKiBPUzIgKi8KKwlkZWJ1ZyhGMTEwLCJUQUtFIGZpbmFsIHRha2VwYXRoIix0YWtlcGF0aCwwKTsKKworCWlmICgoeSA9IGNtaWZpcCgiQ29tbWFuZHMgZnJvbSBmaWxlIiwKKwkJCSIiLCZzLCZ4LDAsdGFrZXBhdGgseHhzdHJpbmcpKSA8IDApIHsKKwkgICAgaWYgKHkgPT0gLTMpIHsKKwkJcHJpbnRmKCI/QSBmaWxlIG5hbWUgaXMgcmVxdWlyZWRcbiIpOworCQlyZXR1cm4oLTkpOworCSAgICB9IGVsc2UKKwkgICAgICByZXR1cm4oeSk7CisJfQorCWlmICh4ICE9IDApIHsKKwkgICAgcHJpbnRmKCI/V2lsZGNhcmRzIG5vdCBhbGxvd2VkIGluIGNvbW1hbmQgZmlsZSBuYW1lXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisJY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworCWRlYnVnKEYxMTAsIlRBS0UgZmlsZSIscywwKTsKKwlpZiAoaXNkaXIocykpIHsKKwkgICAgcHJpbnRmKCI/Q2FuJ3QgZXhlY3V0ZSBhIGRpcmVjdG9yeSAtIFwiJXNcIlxuIiwgcyk7CisJICAgIHJldHVybigtOSk7CisJfQorI2lmbmRlZiBOT1RBS0VBUkdTCisJeworCSAgICBjaGFyICogcDsKKwkgICAgeCA9IHN0cmxlbihsaW5lKTsKKwkgICAgZGVidWcoRjExMSwiVEFLRSBhcmdzIixsaW5lLHgpOworCSAgICBwID0gbGluZSArIHggKyAxOworCSAgICBpZiAoKHkgPSBjbXR4dCgiT3B0aW9uYWwgYXJndW1lbnRzIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkgICAgICByZXR1cm4oeSk7CisJICAgIGlmICgqcykgewkJCS8qIEFyZ3MgZ2l2ZW4/ICovCisJCWNrc3RybmNweShwLHMsTElOQlVGU0laLXgtMSk7CisjaWZkZWYgWkZOUUZQCisJCXpmbnFmcChsaW5lLFRNUEJVRlNJWix0bXBidWYpOworCQlzID0gdG1wYnVmOworI2Vsc2UKKwkJcyA9IGxpbmU7CisjZW5kaWYgLyogWkZOUUZQICovCisJCWRlYnVnKEYxMTAsIlRBS0UgZmlsZW5hbWUiLHMsMCk7CisJCXggPSBzdHJsZW4ocyk7CisJCWRlYnVnKEYxMDEsIlRBS0UgbmV3IGxlbiIscyx4KTsKKworI2lmZGVmIENPTU1FTlQKKy8qCisgIFRoaXMgd2FzIGFkZGVkIGluIEMtS2VybWl0IDcuMCB0byBhbGxvdyBhcmdzIHRvIGJlIHBhc3NlZCBmcm9tIHRoZSBUQUtFCisgIGNvbW1hbmQgdG8gdGhlIGNvbW1hbmQgZmlsZS4gIEJ1dCBpdCBvdmVyd3JpdGVzIHRoZSBjdXJyZW50IGFyZ3VtZW50IHZlY3RvciwKKyAgd2hpY2ggaXMgYXQgYmVzdCBzdXJwcmlzaW5nLCBhbmQgYXQgd29yc3QgdW5zYWZlLgorKi8KKwkJYWRkbWFjKCIlMCIscyk7CQkvKiBEZWZpbmUgJTAgPSBuYW1lIG9mIGZpbGUgKi8KKwkJdmFybmFtWzBdID0gJyUnOworCQl2YXJuYW1bMl0gPSAnXDAnOworCQlkZWJ1ZyhGMTEwLCJ0YWtlIGFyZyAwIixzLDApOworCQlkZWJ1ZyhGMTEwLCJ0YWtlIGFyZ3MiLHAsMCk7CisJCWZvciAoeSA9IDE7IHkgPCAxMDsgeSsrKSB7IC8qIENsZWFyIGN1cnJlbnQgYXJncyAlMS4uJTkgKi8KKwkJICAgIHZhcm5hbVsxXSA9IChjaGFyKSAoeSArICcwJyk7CisJCSAgICBkZWxtYWModmFybmFtLDApOworCQl9CisJCXh3b3JkcyhwLE1BWEFSR0xJU1QsTlVMTCwwKTsgLyogQXNzaWduIG5ldyBhcmdzICovCisJCWRlYnVnKEYxMTAsInRha2UgYXJncyIscCwwKTsKKyNlbHNlCisvKgorICBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIDguMC4gIElmIHRoZSBUQUtFIGNvbW1hbmQgaW5jbHVkZXMgYXJndW1lbnRzLCB3ZQorICBpbnNlcnQgYW4gaW50ZXJtZWRpYXRlIHRlbXBvcmFyeSBtYWNybyBiZXR3ZWVuIHRoZSBjdXJyZW50IGxldmVsOyB3ZSBwYXNzCisgIHRoZSBhcmd1bWVudHMgdG8gdGhlIG1hY3JvIGFuZCB0aGVuIHRoZSBtYWNybyBUQUtFcyB0aGUgY29tbWFuZCBmaWxlLgorICBJZiB0aGUgdXNlciBDdHJsLUMncyBvdXQgb2YgdGhlIFRBS0UgZmlsZSwgc29tZSB0ZW1wb3JhcnkgbWFjcm8gZGVmaW5pdGlvbnMKKyAgYW5kIG90aGVyIHNtYWxsIG1hbGxvYydkIGJpdHMgbWlnaHQgYmUgbGVmdCBiZWhpbmQuCisqLworCQl7CisJCSAgICBjaGFyICogcSA9IE5VTEw7CisJCSAgICBjaGFyICogciA9IE5VTEw7CisJCSAgICBpbnQgaywgbTsKKwkJICAgIG0gPSBtYWNsdmw7CisJCSAgICBxID0gKGNoYXIgKiltYWxsb2MoeCsyNCk7CisJCSAgICBpZiAocSkgeworCQkJciA9IChjaGFyICopbWFsbG9jKHgrMjQpOworCQkJaWYgKHIpIHsKKwkJCSAgICBzcHJpbnRmKHEsIl9maWxlWyVzXSglZCkiLHMsY21kbHZsKTsgLyogc2FmZSAqLworCQkJICAgIHNwcmludGYociwidGFrZSAlcyIscyk7IC8qIHNhZmUgKi8KKwkJCSAgICBrID0gYWRkbWFjKHEscik7CisJCQkgICAgaWYgKGsgPiAtMSkgeworCQkJCWRvZG8oayxwLDApOworCQkJCXdoaWxlIChtYWNsdmwgPiBtKSB7CisJCQkJICAgIHNzdGF0ZSA9IChDSEFSKSBwYXJzZXIoMSk7CisJCQkJICAgIGlmIChzc3RhdGUpIHByb3RvKCk7CisJCQkJfQorCQkJICAgIH0KKwkJCSAgICBrID0gZGVsbWFjKHEsMCk7CisJCQkgICAgZnJlZShxKTsKKwkJCSAgICBmcmVlKHIpOworCQkJICAgIHJldHVybihzdWNjZXNzKTsKKwkJCX0KKwkJICAgIH0KKwkJfQorCQlyZXR1cm4oc3VjY2VzcyA9IDApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgICAgfQorCX0KKyNlbHNlCisJaWYgKCh5ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeSk7CisjZW5kaWYgLyogTk9UQUtFQVJHUyAqLworCXJldHVybihzdWNjZXNzID0gZG90YWtlKGxpbmUpKTsKKyAgICB9CisKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgIGlmIChjeCA9PSBYWFZJRVcpIHsJCQkvKiBWSUVXIE9ubHkgVGVybWluYWwgbW9kZSAqLworCXZpZXdvbmx5ID0gVFJVRTsKKwlzdWNjZXNzID0gZG9jb25lY3QoMCwgMCk7CisJdmlld29ubHkgPSBGQUxTRTsKKwlyZXR1cm4gc3VjY2VzczsKKyAgICB9CisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBORVRDT05OCisgICAgaWYgKGN4ID09IFhYVEVMIHx8IGN4ID09IFhYSUtTRCkgewkvKiBURUxORVQgKi8KKwlpbnQgeCx6OworI2lmZGVmIE9TMgorICAgIGlmICghdGNwX2F2YWlsKSB7CisgICAgICAgIHByaW50ZigiP1NvcnJ5LCBlaXRoZXIgVENQL0lQIGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0gb3JcblwKK25lY2Vzc2FyeSBETExzIGRpZCBub3QgbG9hZC4gIFVzZSBTSE9XIE5FVFdPUksgdG8gY2hlY2sgbmV0d29yayBzdGF0dXMuXG4iKTsKKyAgICAgICAgc3VjY2VzcyA9IDA7CisgICAgICAgIHJldHVybigtOSk7CisgICAgfSBlbHNlCisjZW5kaWYgLyogT1MyICovCisgICAgICB7CisJICB4ID0gbmV0dHlwZTsJCQkvKiBTYXZlIG5ldCB0eXBlIGluIGNhc2Ugb2YgZmFpbHVyZSAqLworCSAgeiA9IHR0bnByb3RvOwkJCS8qIFNhdmUgcHJvdG9jb2wgaW4gY2FzZSBvZiBmYWlsdXJlICovCisJICBuZXR0eXBlID0gTkVUX1RDUEI7CisJICB0dG5wcm90byA9IChjeCA9PSBYWFRFTCkgPyBOUF9URUxORVQgOiBOUF9LRVJNSVQ7CisJICBpZiAoKHkgPSBzZXRsaW4oWFlIT1NULDAsMSkpIDw9IDApIHsKKyAgICAgICAgICAgICAgbmV0dHlwZSA9IHg7CQkvKiBGYWlsZWQsIHJlc3RvcmUgbmV0IHR5cGUuICovCisgICAgICAgICAgICAgIHR0bnByb3RvID0gejsJCS8qIGFuZCBwcm90b2NvbCAqLworICAgICAgICAgICAgICBzdWNjZXNzID0gMDsKKwkgIH0KKwkgIGRpZHNldGxpbisrOworICAgICAgICB9CisJcmV0dXJuKHkpOworICAgIH0KKworI2lmbmRlZiBQVFlPUlBJUEUKKyNpZmRlZiBORVRDTUQKKyNkZWZpbmUgUFRZT1JQSVBFCisjZWxzZQorI2lmZGVmIE5FVFBUWQorI2RlZmluZSBQVFlPUlBJUEUKKyNlbmRpZiAvKiBORVRQVFkgKi8KKyNlbmRpZiAvKiBORVRDTUQgKi8KKyNlbmRpZiAvKiBQVFlPUlBJUEUgKi8KKworI2lmZGVmIFBUWU9SUElQRQorICAgIGlmIChjeCA9PSBYWFBJUEUgfHwgY3ggPT0gWFhQVFkpIHsJLyogUElQRSBvciBQVFkgKi8KKwlpbnQgeDsKKwlleHRlcm4gaW50IG5ldHNhdmU7CisJeCA9IG5ldHR5cGU7CQkJLyogU2F2ZSBuZXQgdHlwZSBpbiBjYXNlIG9mIGZhaWx1cmUgKi8KKwluZXR0eXBlID0gKGN4ID09IFhYUElQRSkgPyBORVRfQ01EIDogTkVUX1BUWTsKKwlpZiAoKHkgPSBzZXRsaW4oWFlIT1NULDAsMSkpIDwgMCkgeworCSAgICBuZXR0eXBlID0geDsJCS8qIEZhaWxlZCwgcmVzdG9yZSBuZXQgdHlwZS4gKi8KKwkgICAgdHRucHJvdG8gPSB6OwkJLyogYW5kIHByb3RvY29sICovCisJICAgIHN1Y2Nlc3MgPSAwOworCX0KKwlkaWRzZXRsaW4rKzsKKwluZXRzYXZlID0geDsKKwlyZXR1cm4oeSk7CisgICAgfQorI2VuZGlmIC8qIFBUWU9SUElQRSAqLworCisjaWZkZWYgQU5ZU1NICisgICAgaWYgKGN4ID09IFhYU1NIKSB7CQkJLyogU1NIIChTZWN1cmUgU2hlbGwpICovCisJZXh0ZXJuIGludCBuZXRzYXZlOworI2lmZGVmIFNTSEJVSUxUSU4KKwlpbnQgaywgeCwgaGF2ZWhvc3QgPSAwLCB0cmlwcyA9IDA7CisgICAgICAgIGludCAgICB0bXB2ZXIgPSAtMSwgdG1weGZ3ID0gLTE7CisjaWZuZGVmIFNTSFRFU1QKKyAgICAgICAgZXh0ZXJuIGludCBzbF9zc2hfeGZ3LCBzbF9zc2hfeGZ3X3NhdmVkOworICAgICAgICBleHRlcm4gaW50IHNsX3NzaF92ZXIsIHNsX3NzaF92ZXJfc2F2ZWQ7CisjZW5kaWYgLyogU1NIVEVTVCAqLworICAgICAgICBleHRlcm4gaW50IG1kbXR5cCwgbWRtc2F2LCBjeHR5cGUsIHNsX3VpZF9zYXZlZDsKKyAgICAgICAgZXh0ZXJuIGNoYXIgKiBzbG1zZzsKKwlleHRlcm4gY2hhciB1aWRidWZbXSwgc2xfdWlkYnVmW107CisgICAgICAgIGV4dGVybiBjaGFyIHB3YnVmW10sICogZ19wc3dkOworICAgICAgICBleHRlcm4gaW50IHB3ZmxnLCBwd2NyeXB0LCBnX3BmbGcsIGdfcGNwdCwgbm9sb2NhbDsKKwlzdHJ1Y3QgRkRCIHN3LCBrdywgZmw7CisKKyAgICAgICAgaWYgKHNzaF90bXBzdHIpCisJICBtZW1zZXQoc3NoX3RtcHN0ciwwLHN0cmxlbihzc2hfdG1wc3RyKSk7CisgICAgICAgIG1ha2VzdHIoJnNzaF90bXBzdHIsTlVMTCk7CisgICAgICAgIG1ha2VzdHIoJnNzaF90bXB1aWQsTlVMTCk7CisgICAgICAgIG1ha2VzdHIoJnNzaF90bXBjbWQsTlVMTCk7CisgICAgICAgIG1ha2VzdHIoJnNzaF90bXBwb3J0LE5VTEwpOworCisJY21mZGJpKCZrdywJCQkvKiAxc3QgRkRCIC0gY29tbWFuZHMgKi8KKwkgICAgICAgX0NNS0VZLAkJCS8qIGZjb2RlICovCisJICAgICAgICJob3N0IFsgcG9ydCBdLFxuIG9yIGFjdGlvbiIsCS8qIGhscG1zZyAqLworCSAgICAgICAiIiwJCQkvKiBkZWZhdWx0ICovCisJICAgICAgICIiLAkJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJICAgICAgIG5zc2hjbWQsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisJICAgICAgIDAsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDAgPSBrZXl3b3JkICovCisJICAgICAgIHh4c3RyaW5nLAkJLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworCSAgICAgICBzc2hrd3RhYiwJCS8qIEtleXdvcmQgdGFibGUgKi8KKwkgICAgICAgJmZsCQkJLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworCSAgICAgICApOworCWNtZmRiaSgmZmwsCQkJLyogSG9zdCAqLworCSAgICAgICBfQ01GTEQsCQkJLyogZmNvZGUgKi8KKwkgICAgICAgIiIsCQkJLyogaGxwbXNnICovCisJICAgICAgICIiLAkJCS8qIGRlZmF1bHQgKi8KKwkgICAgICAgIiIsCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkgICAgICAgMCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworCSAgICAgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisJICAgICAgIHh4c3RyaW5nLAorCSAgICAgICBOVUxMLAorCSAgICAgICBOVUxMCisJICAgICAgICk7CisKKwl4ID0gY21mZGIoJmt3KTsKKwlpZiAoeCA9PSAtMykgeworCSAgICBwcmludGYoIj9zc2ggd2hhdD9cbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKwlpZiAoeCA8IDApCisJICByZXR1cm4oeCk7CisJaGF2ZWhvc3QgPSAwOworCWlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01GTEQpIHsKKwkgICAgaGF2ZWhvc3QgPSAxOworCSAgICBja3N0cm5jcHkobGluZSxjbXJlc3VsdC5zcmVzdWx0LExJTkJVRlNJWik7IC8qIEhvc3RuYW1lICovCisJICAgIGNtcmVzdWx0Lm5yZXN1bHQgPSBYU1NIX09QTjsKKwl9CisJc3dpdGNoIChjbXJlc3VsdC5ucmVzdWx0KSB7CS8qIFNTSCBrZXl3b3JkICovCisJICBjYXNlIFhTU0hfT1BOOgkJLyogU1NIIE9QRU4gKi8KKwkgICAgaWYgKCFoYXZlaG9zdCkgeworCQlpZiAoKHggPSBjbWZsZCgiSG9zdCIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisJCSAgcmV0dXJuKHgpOworCQlja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisJICAgIH0KKwkgICAgLyogUGFyc2UgWyBwb3J0IF0gWyBzd2l0Y2hlcyBdICovCisJICAgIGNtZmRiaSgma3csCQkJLyogU3dpdGNoZXMgKi8KKwkJICAgX0NNS0VZLAorCQkgICAiUG9ydCBudW1iZXIgb3Igc2VydmljZSBuYW1lLFxub3Igc3dpdGNoIiwKKwkJICAgIiIsCisJCSAgICIiLAorCQkgICBuc3Nob3Buc3csCisJCSAgIDQsCisJCSAgIHh4c3RyaW5nLAorCQkgICBzc2hvcG5zdywKKwkJICAgJmZsCisJCSAgICk7CisJICAgIGNtZmRiaSgmZmwsCQkJLyogUG9ydCBudW1iZXIgb3Igc2VydmljZSBuYW1lICovCisJCSAgIF9DTUZMRCwKKwkJICAgIiIsCisJCSAgICIiLAorCQkgICAiIiwKKwkJICAgMCwKKwkJICAgMCwKKwkJICAgeHhzdHJpbmcsCisJCSAgIE5VTEwsCisJCSAgIE5VTEwKKwkJICAgKTsKKwkgICAgdHJpcHMgPSAwOwkJCS8qIEV4cGxhaW5lZCBiZWxvdyAqLworCSAgICB3aGlsZSAoMSkgewkJCS8qIFBhcnNlIHBvcnQgYW5kIHN3aXRjaGVzICovCisJCXggPSBjbWZkYigma3cpOwkJLyogR2V0IGEgZmllbGQgKi8KKwkJaWYgKHggPT0gLTMpCQkvKiBVc2VyIHR5cGVkIENSIHNvIHF1aXQgZnJvbSBsb29wICovCisJCSAgYnJlYWs7CisJCWlmICh4IDwgMCkJCS8qIE90aGVyIHBhcnNlIGVycm9yLCBwYXNzIGl0IGJhY2sgKi8KKwkJICByZXR1cm4oeCk7CisJCXN3aXRjaCAoY21yZXN1bHQuZmNvZGUpIHsgLyogRmllbGQgb3IgS2V5d29yZD8gKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgX0NNRkxEOgkJICAvKiBGaWVsZCAqLworICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfdG1wcG9ydCxjbXJlc3VsdC5zcmVzdWx0KTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgX0NNS0VZOgkJLyogS2V5d29yZCAqLworCQkgICAgc3dpdGNoIChjbXJlc3VsdC5ucmVzdWx0KSB7CS8qIFdoaWNoIG9uZT8gKi8KKwkJICAgICAgY2FzZSBTU0hTV19VU1I6CSAgICAgICAgLyogL1VTRVI6ICovCisJCQlpZiAoIWNtZ2JyaygpKSB7CisJCQkgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkJICAgIHJldHVybigtOSk7CisJCQl9CisJCQlpZiAoKHkgPSBjbWZsZCgiVXNlcm5hbWUiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorCQkJICByZXR1cm4oeSk7CisJCQlzID0gYnJzdHJpcChzKTsKKwkJCW1ha2VzdHIoJnNzaF90bXB1aWQscyk7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNTSFNXX1BXRDoKKwkJCWlmICghY21nYnJrKCkpIHsKKwkJCSAgICBwcmludGYoIj9UaGlzIHN3aXRjaCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkgICAgcmV0dXJuKC05KTsKKwkJCX0KKwkJCWRlYm9rID0gMDsKKwkJCWlmICgoeCA9IGNtZmxkKCJQYXNzd29yZCIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKwkJCSAgICBpZiAoeCA9PSAtMykgeworCQkJCW1ha2VzdHIoJnNzaF90bXBzdHIsIiIpOworCQkJICAgIH0gZWxzZSB7CisJCQkJcmV0dXJuKHgpOworCQkJICAgIH0KKwkJCX0gZWxzZSB7CisJCQkgICAgcyA9IGJyc3RyaXAocyk7CisJCQkgICAgaWYgKCh4ID0gKGludClzdHJsZW4ocykpID4gUFdCVUZMKSB7CisJCQkJbWFrZXN0cigmc2xtc2csIkludGVybmFsIGVycm9yIik7CisJCQkJcHJpbnRmKCI/U29ycnksIHRvbyBsb25nIC0gbWF4ID0gJWRcbiIsUFdCVUZMKTsKKwkJCQlyZXR1cm4oLTkpOworCQkJICAgIH0KKwkJCSAgICBtYWtlc3RyKCZzc2hfdG1wc3RyLHMpOworCQkJfQorCQkJYnJlYWs7CisKKwkJICAgICAgY2FzZSBTU0hTV19WRVI6CisJCQlpZiAoKHggPSBjbW51bSgiTnVtYmVyIiwiIiwxMCwmeix4eHN0cmluZykpIDwgMCkKKwkJCSAgcmV0dXJuKHgpOworCQkJaWYgKHogPCAxIHx8IHogPiAyKSB7CisJCQkgICAgcHJpbnRmKCI/T3V0IG9mIHJhbmdlOiAlZFxuIix6KTsKKwkJCSAgICByZXR1cm4oLTkpOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wdmVyID0gejsKKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFNTSFNXX0NNRDoKKwkJICAgICAgY2FzZSBTU0hTV19TVUI6CisJCQlpZiAoKHggPSBjbWZsZCgiVGV4dCIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisJCQkgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF90bXBjbWQscyk7CisJCQlzc2hfY2FzID0gKGNtcmVzdWx0Lm5yZXN1bHQgPT0gU1NIU1dfU1VCKTsKKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFNTSFNXX1gxMToKKwkJCWlmICgoeCA9IGNta2V5KG9ub2ZmLDIsIiIsIm9uIix4eHN0cmluZykpIDwgMCkKKwkJCSAgcmV0dXJuKHgpOworICAgICAgICAgICAgICAgICAgICAgICAgdG1weGZ3ID0geDsKKwkJCWJyZWFrOworCQkgICAgICBkZWZhdWx0OgorCQkgICAgICAgIHJldHVybigtMik7CisJCSAgICB9CisJCX0KKwkJaWYgKHRyaXBzKysgPT0gMCkgewkvKiBBZnRlciBmaXJzdCB0aW1lIHRocm91Z2ggKi8KKwkJICAgIGNtZmRiaSgma3csCQkvKiBvbmx5IHBhcnNlIHN3aXRjaGVzLCBub3QgcG9ydC4gKi8KKwkJCSAgIF9DTUtFWSwKKwkJCSAgICJTd2l0Y2giLAorCQkJICAgIiIsCisJCQkgICAiIiwKKwkJCSAgIG5zc2hvcG5zdywKKwkJCSAgIDQsCisJCQkgICB4eHN0cmluZywKKwkJCSAgIHNzaG9wbnN3LAorCQkJICAgTlVMTAorCQkJICAgKTsKKwkJfQorCSAgICB9CisJICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkJLyogR2V0IGNvbmZpcm1hdGlvbiAqLworCSAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgIGlmIChjbHNrY29ubngoMSkgPCAwKSB7CS8qIENsb3NlIGN1cnJlbnQgS2VybWl0IGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgICAgaWYgKCBzc2hfdG1wc3RyICkgeworICAgICAgICAgICAgICAgICAgbWVtc2V0KHNzaF90bXBzdHIsMCxzdHJsZW4oc3NoX3RtcHN0cikpOworICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NoX3RtcHN0cixOVUxMKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgICAgfQorCSAgICBtYWtlc3RyKCZzc2hfaHN0LGxpbmUpOwkvKiBTdGFzaCBldmVyeXRoaW5nICovCisJICAgIGlmIChzc2hfdG1wdWlkKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzbF91aWRfc2F2ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHNsX3VpZGJ1Zix1aWRidWYsVUlEQlVGTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgc2xfdWlkX3NhdmVkID0gMTsKKyAgICAgICAgICAgICAgICB9CisJCWNrc3RybmNweSh1aWRidWYsc3NoX3RtcHVpZCxVSURCVUZMRU4pOworCQltYWtlc3RyKCZzc2hfdG1wdWlkLE5VTEwpOworCSAgICB9CisgICAgICAgICAgICBpZiAoc3NoX3RtcHBvcnQpIHsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfcHJ0LHNzaF90bXBwb3J0KTsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfdG1wcG9ydCxOVUxMKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF9wcnQsTlVMTCk7CisKKyAgICAgICAgICAgIGlmIChzc2hfdG1wY21kKSB7CisgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NoX2NtZCxicnN0cmlwKHNzaF90bXBjbWQpKTsKKyAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfdG1wY21kLE5VTEwpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NoX2NtZCxOVUxMKTsKKworICAgICAgICAgICAgaWYgKHRtcHZlciA+IC0xKSB7CisjaWZuZGVmIFNTSFRFU1QKKyAgICAgICAgICAgICAgICBpZiAoIXNsX3NzaF92ZXJfc2F2ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2xfc3NoX3ZlciA9IHNzaF92ZXI7CisgICAgICAgICAgICAgICAgICAgIHNsX3NzaF92ZXJfc2F2ZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBTU0hURVNUICovCisgICAgICAgICAgICAgICAgc3NoX3ZlciA9IHRtcHZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0bXB4ZncgPiAtMSkgeworI2lmbmRlZiBTU0hURVNUCisgICAgICAgICAgICAgICAgaWYgKCFzbF9zc2hfeGZ3X3NhdmVkKSB7CisgICAgICAgICAgICAgICAgICAgIHNsX3NzaF94ZncgPSBzc2hfeGZ3OworICAgICAgICAgICAgICAgICAgICBzbF9zc2hfeGZ3X3NhdmVkID0gMTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogU1NIVEVTVCAqLworICAgICAgICAgICAgICAgIHNzaF94ZncgPSB0bXB4Znc7CisgICAgICAgICAgICB9CisJICAgIGlmIChzc2hfdG1wc3RyKSB7CisJCWlmIChzc2hfdG1wc3RyWzBdKSB7CisJCSAgICBja3N0cm5jcHkocHdidWYsc3NoX3RtcHN0cixQV0JVRkwrMSk7CisJCSAgICBwd2ZsZyA9IDE7CisJCSAgICBwd2NyeXB0ID0gMDsKKwkJfSBlbHNlCisJCSAgcHdmbGcgPSAwOworCQltYWtlc3RyKCZzc2hfdG1wc3RyLE5VTEwpOworCSAgICB9CisJICAgIG5ldHR5cGUgPSBORVRfU1NIOworCSAgICBpZiAobWRtc2F2IDwgMCkKKwkgICAgICBtZG1zYXYgPSBtZG10eXA7CisJICAgIG1kbXR5cCA9IC1uZXR0eXBlOworCSAgICB4ID0gMTsKKworI2lmbmRlZiBOT1NQTAorICAgICAgICAgICAgbWFrZXN0cigmZ19wc3dkLHB3YnVmKTsgICAgICAgICAgICAgLyogU2F2ZSBnbG9iYWwgcHdidWYgKi8KKyAgICAgICAgICAgIGdfcGZsZyA9IHB3ZmxnOyAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBmbGFnICovCisgICAgICAgICAgICBnX3BjcHQgPSBwd2NyeXB0OworI2VuZGlmIC8qIE5PU1BMICovCisKKwkgICAgLyogTGluZSBwYXJhbWV0ZXIgdG8gdHRvcGVuKCkgaXMgaWdub3JlZCAqLworCSAgICBrID0gdHRvcGVuKGxpbmUsJngsbWRtdHlwLCAwKTsKKwkgICAgaWYgKGsgPCAwKSB7CisJCXByaW50ZigiP1VuYWJsZSB0byBjb25uZWN0IHRvICVzXG4iLHNzaF9oc3QpOworCQltZG10eXAgPSBtZG1zYXY7CisgICAgICAgICAgICAgICAgc2xyZXN0b3IoKTsKKwkJcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKwkgICAgfQorCSAgICBkdXBsZXggPSAwOyAgICAgICAgICAgICAvKiBSZW1vdGUgZWNobyAqLworCSAgICBja3N0cm5jcHkodHRuYW1lLGxpbmUsVFROQU1MRU4pOyAvKiBSZWNvcmQgdGhlIGNvbW1hbmQgKi8KKwkgICAgZGVidWcoRjExMCwic3NoIHR0bmFtZSIsdHRuYW1lLDApOworCSAgICBtYWtlc3RyKCZzbG1zZyxOVUxMKTsJLyogTm8gU0VUIExJTkUgZXJyb3IgbWVzc2FnZSAqLworCSAgICBjeHR5cGUgPSBDWFRfU1NIOworI2lmbmRlZiBOT0RJQUwKKwkgICAgZGlhbHN0YSA9IERJQV9VTks7CisjZW5kaWYgLyogTk9ESUFMICovCisJICAgIHN1Y2Nlc3MgPSAxOwkJLyogU0VUIExJTkUgc3VjY2VlZGVkICovCisJICAgIG5ldHdvcmsgPSAxOwkJLyogTmV0d29yayBjb25uZWN0aW9uIChub3Qgc2VyaWFsKSAqLworCSAgICBsb2NhbCA9IDE7CQkJLyogTG9jYWwgbW9kZSAobm90IHJlbW90ZSkgKi8KKwkgICAgaWYgKChyZWxpYWJsZSAhPSBTRVRfT0ZGIHx8ICFzZXRyZWxpYWJsZSkpCisJICAgICAgcmVsaWFibGUgPSBTRVRfT047CS8qIFRyYW5zcG9ydCBpcyByZWxpYWJsZSBlbmQgdG8gZW5kICovCisjaWZkZWYgT1MyCisgICAgICAgICAgICBEaWFsZXJTZW5kKE9QVF9LRVJNSVRfQ09OTkVDVCwgMCk7CisjZW5kaWYgLyogT1MyICovCisJICAgIHNldGZsb3coKTsJCQkvKiBTZXQgYXBwcm9wcmlhdGUgZmxvdyBjb250cm9sICovCisKKwkgICAgaGF2ZWxpbmUgPSAxOworI2lmZGVmIENLTE9HRElBTAorI2lmZGVmIE5FVENPTk4KKwkgICAgZG9sb2duZXQoKTsKKyNlbmRpZiAvKiBORVRDT05OICovCisjZW5kaWYgLyogQ0tMT0dESUFMICovCisKKyNpZm5kZWYgTk9TUEwKKwkgICAgaWYgKGxvY2FsKSB7CisJCWlmIChubWFjKSB7CQkvKiBBbnkgbWFjcm9zIGRlZmluZWQ/ICovCisJCSAgICBpbnQgazsJCS8qIFllcyAqLworCQkgICAgayA9IG1sb29rKG1hY3RhYiwib25fb3BlbiIsbm1hYyk7IC8qIExvb2sgdGhpcyB1cCAqLworCQkgICAgaWYgKGsgPj0gMCkgewkgICAgICAgICAgICAgIC8qIElmIGZvdW5kLCAqLworCQkJaWYgKGRvZG8oayxzc2hfaHN0LDApID4gLTEpICAgLyogc2V0IGl0IHVwLCAqLworCQkJICBwYXJzZXIoMSk7CQkgICAgICAvKiBhbmQgZXhlY3V0ZSBpdCAqLworCQkgICAgfQorCQl9CisJICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmZGVmIExPQ1VTCQkKKwkgICAgaWYgKGF1dG9sb2N1cykKKwkJc2V0bG9jdXMoMSwxKTsKKyNlbmRpZiAvKiBMT0NVUyAqLworCisJLyogQ29tbWFuZCB3YXMgY29uZmlybWVkIHNvIHdlIGNhbiBwcmUtcG9wIGNvbW1hbmQgbGV2ZWwuICovCisJLyogVGhpcyBpcyBzbyBDT05ORUNUIG1vZHVsZSB3b24ndCB0aGluayB3ZSdyZSBleGVjdXRpbmcgYSAqLworCS8qIHNjcmlwdCBpZiBDT05ORUNUIHdhcyB0aGUgZmluYWwgY29tbWFuZCBpbiB0aGUgc2NyaXB0LiAqLworCSAgICBpZiAoY21kbHZsID4gMCkKKwkgICAgICBwcmVwb3AoKTsKKwkgICAgc3VjY2VzcyA9IGRvY29uZWN0KDAsY21kbHZsID09IDAgPyAxIDogMCk7CisJICAgIGlmICh0dGNoaygpIDwgMCkKKwkgICAgICBkb2xvZ2VuZCgpOworCSAgICByZXR1cm4oc3VjY2Vzcyk7CisKKwkgIGNhc2UgWFNTSF9DTFI6CisJICAgIGlmICgoeSA9IGNta2V5KHNzaGNscixuc3NoY2xyLCIiLCIiLCB4eHN0cmluZykpIDwgMCkgeworCSAgICAgICAgaWYgKHkgPT0gLTMpIHsKKwkJICAgIHByaW50ZigiP2NsZWFyIHdoYXQ/XG4iKTsKKwkJICAgIHJldHVybigtOSk7CisJCX0KKwkgICAgICAgIHJldHVybih5KTsKKwkgICAgfQorCSAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisJICAgICAgcmV0dXJuKHgpOworCSAgICBzd2l0Y2ggKHkpIHsKKwkgICAgICBjYXNlIFNTSENfTFBGOgorICAgICAgICAgICAgICAgIHNzaF9wZl9sY2xfbiA9IDA7CisJCWJyZWFrOworCSAgICAgIGNhc2UgU1NIQ19SUEY6CisJCXNzaF9wZl9ybXRfbiA9IDA7CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CisJCXJldHVybigtMik7CisJICAgIH0KKyAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CS8qIG9yIHdoYXRldmVyICovCisKKwkgIGNhc2UgWFNTSF9BR1Q6IHsJCS8qIFNTSCBBR0VOVCAqLworCSAgICAgIGludCBkb2VhY2ggPSAwOworCSAgICAgIGlmICgoeSA9IGNta2V5KHNzaGFnZW50LG5zc2hhZ2VudCwiIiwiIix4eHN0cmluZykpIDwgMCkKKwkJcmV0dXJuKHkpOworCSAgICAgIHN3aXRjaCAoeSkgeworCQljYXNlIFNTSEFfQUREOgkJLyogU1NIIEFHRU5UIEFERCAuLi4gKi8KKwkJICBpZiAoKHggPSBjbWlmaSgiSWRlbnRpdHkgZmlsZSIsIiIsJnMsJnkseHhzdHJpbmcpKSA8IDApIHsKKyNpZm5kZWYgU1NIVEVTVAorCQkgICAgICBpZiAoeCA9PSAtMykJLyogTm8gbmFtZSBnaXZlbiAqLworCQkJZG9lYWNoID0gMTsJLyogc28gZG8gdGhlbSBhbGwgKi8KKwkJICAgICAgZWxzZQorI2VuZGlmIC8qIFNTSFRFU1QgKi8KKwkJCXJldHVybih4KTsKKwkJICB9CisJCSAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworCQkgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKwkJICAgIHJldHVybih4KTsKKyNpZmRlZiBTU0hURVNUCisJCSAgeCA9IDA7CisjZWxzZQorCQkgIGlmIChkb2VhY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3NoX2lkZl9uOyBpKyspCisJCQl4ICs9IHNzaF9hZ2VudF9hZGRfZmlsZShzc2hfaWRmW2ldKTsKKwkJICB9IGVsc2UKKwkJICAgIHggPSBzc2hfYWdlbnRfYWRkX2ZpbGUobGluZSk7CisjZW5kaWYgLyogU1NIVEVTVCAqLworCQkgIHJldHVybihzdWNjZXNzID0gKHggPT0gMCkpOworCisJCWNhc2UgU1NIQV9ERUw6IHsJLyogU1NIIEFHRU5UIERFTEVURSAuLi4gKi8KKwkJICAgIGludCBkb2FsbCA9IDA7CisJCSAgICBpZiAoKHggPSBjbWlmaSgiSWRlbnRpdHkgZmlsZSIsIiIsJnMsJnkseHhzdHJpbmcpKSA8IDApIHsKKyNpZm5kZWYgU1NIVEVTVAorCQkJaWYgKHggPT0gLTMpCS8qIE5vIG5hbWUgZ2l2ZW4gKi8KKwkJCSAgZG9hbGwgPSAxOwkvKiBzbyBkbyB0aGVtIGFsbCAqLworCQkJZWxzZQorI2VuZGlmIC8qIFNTSFRFU1QgKi8KKwkJCSAgcmV0dXJuKHgpOworCQkgICAgfQorCQkgICAgY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworCQkgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorCQkgICAgICByZXR1cm4oeCk7CisjaWZkZWYgU1NIVEVTVAorCQkgICAgeCA9IDA7CisjZWxzZQorCQkgICAgaWYgKGRvYWxsKQorCQkgICAgICB4ID0gc3NoX2FnZW50X2RlbGV0ZV9hbGwoKTsKKwkJICAgIGVsc2UKKwkJICAgICAgeCA9IHNzaF9hZ2VudF9kZWxldGVfZmlsZShsaW5lKTsKKyNlbmRpZiAvKiBTU0hURVNUICovCisJCSAgICByZXR1cm4oc3VjY2VzcyA9ICh4ID09IDApKTsKKwkJfQorCQljYXNlIFNTSEFfTFNUOiB7CisJCSAgICBpbnQgZmluZ2VycHJpbnQgPSAwOworCQkgICAgaWYgKCh5ID0gY21zd2koc3NoYWd0c3csbnNzaGFndHN3LCIiLCIiLHh4c3RyaW5nKSkgPCAwKSB7CisJCQlpZiAoeSAhPSAtMykKKwkJCSAgcmV0dXJuKHkpOworCQkgICAgfSBlbHNlIGlmIChjbWdicmsoKSA+IFNQKSB7CisJCQlwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50XG4iKTsKKwkJCXJldHVybigtOSk7CisJCSAgICB9IGVsc2UgaWYgKHkgPT0gU1NIQVNXX0ZQKSB7CisJCQlmaW5nZXJwcmludCA9IDE7CisJCSAgICB9CisJCSAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisJCSAgICAgIHJldHVybih4KTsKKyNpZmRlZiBTU0hURVNUCisJCSAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworI2Vsc2UKKwkJICAgIHJldHVybihzdWNjZXNzID0KKwkJCSAgIChzc2hfYWdlbnRfbGlzdF9pZGVudGl0aWVzKGZpbmdlcnByaW50KSA9PSAwKSk7CisjZW5kaWYgLyogU1NIVEVTVCAqLworCQl9CisJCWRlZmF1bHQ6CisJCSAgcmV0dXJuKC0yKTsKKwkgICAgICB9CisJICB9CisJICBjYXNlIFhTU0hfQUREOiB7CQkvKiBTU0ggQUREICovCisJICAgICAgLyogc3NoIGFkZCB7IGxvY2FsLCByZW1vdGUgfSBwb3J0IGhvc3QgcG9ydCAqLworCSAgICAgIGludCBjeCwgaSwgaiwgazsKKwkgICAgICBjaGFyICogaDsKKwkgICAgICBpZiAoKGN4ID0gY21rZXkoYWRkZndkLG5hZGRmd2QsIiIsIiIsIHh4c3RyaW5nKSkgPCAwKQorCQlyZXR1cm4oY3gpOworCSAgICAgIGlmICgoeCA9IGNtbnVtKChjeCA9PSBTU0hGX0xDTCkgPworCQkJICAgICAiTG9jYWwgcG9ydCBudW1iZXIiIDogIlJlbW90ZSBwb3J0IG51bWJlciIsCisJCQkgICAgICIiLDEwLCZqLHh4c3RyaW5nKSkgPCAwKQorCQlyZXR1cm4oeCk7CisJICAgICAgaWYgKCh4ID0gY21mbGQoIkhvc3QiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorCQlyZXR1cm4oeCk7CisJICAgICAgbWFrZXN0cigmaCxzKTsKKwkgICAgICBpZiAoKHggPSBjbW51bSgiUG9ydCIsIiIsMTAsJmsseHhzdHJpbmcpKSA8IDApCisJCXJldHVybih4KTsKKwkgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisJCXJldHVybih4KTsKKworCSAgICAgIHN3aXRjaChjeCkgeworCQljYXNlIFNTSEZfTENMOgorCQkgICBpZiAoc3NoX3BmX2xjbF9uID09IDMyKSB7CisJCSAgICAgICBwcmludGYoCisiP01heGltdW0gbnVtYmVyIG9mIGxvY2FsIHBvcnQgZm9yd2FyZGluZ3MgYWxyZWFkeSBzcGVjaWZpZWRcbiIKKwkJCSAgICAgKTsKKwkJICAgICAgIGZyZWUoaCk7CisJCSAgICAgICByZXR1cm4oc3VjY2VzcyA9IDApOworCQkgIH0KKwkJICBzc2hfcGZfbGNsW3NzaF9wZl9sY2xfbl0ucDEgPSBqOworCQkgIG1ha2VzdHIoJihzc2hfcGZfbGNsW3NzaF9wZl9sY2xfbl0uaG9zdCksaCk7CisJCSAgbWFrZXN0cigmaCxOVUxMKTsKKwkJICBzc2hfcGZfbGNsW3NzaF9wZl9sY2xfbl0ucDIgPSBrOworCQkgIHNzaF9wZl9sY2xfbisrOworCQkgIGJyZWFrOworCQljYXNlIFNTSEZfUk1UOgorCQkgIGlmIChzc2hfcGZfcm10X24gPT0gMzIpIHsKKwkJICAgICAgcHJpbnRmKAorIj9NYXhpbXVtIG51bWJlciBvZiByZW1vdGUgcG9ydCBmb3J3YXJkaW5ncyBhbHJlYWR5IHNwZWNpZmllZFxuIgorCQkJICAgICk7CisJCSAgICAgIGZyZWUoaCk7CisJCSAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisJCSAgfQorCQkgIHNzaF9wZl9ybXRbc3NoX3BmX3JtdF9uXS5wMSA9IGo7CisJCSAgbWFrZXN0cigmKHNzaF9wZl9ybXRbc3NoX3BmX3JtdF9uXS5ob3N0KSxoKTsKKwkJICBtYWtlc3RyKCZoLE5VTEwpOworCQkgIHNzaF9wZl9ybXRbc3NoX3BmX3JtdF9uXS5wMiA9IGs7CisJCSAgc3NoX3BmX3JtdF9uKys7CisJICAgICAgfQorCSAgICAgIHJldHVybihzdWNjZXNzID0gMSk7CisJICB9CisJICAvKiBOb3Qgc3VwcG9ydGluZyBhcmJpdHJhcnkgZm9yd2FyZGluZyB5ZXQgKi8KKwkgIGNhc2UgWFNTSF9GTFA6CQkvKiBTU0ggRk9SV0FSRC1MT0NBTC1QT1JUICovCisJICBjYXNlIFhTU0hfRlJQOiB7CQkvKiBTU0ggRk9SV0FSRC1SRU1PVEUtUE9SVCAqLworCSAgICAgIGludCBsaV9wb3J0ID0gMDsKKwkgICAgICBpbnQgdG9fcG9ydCA9IDA7CisJICAgICAgY2hhciAqIGZ3X2hvc3QgPSBOVUxMOworCSAgICAgIGludCBuOworICAgICAgICAgICAgICBpZiAoKHggPSBjbW51bShjbXJlc3VsdC5ucmVzdWx0ID09IFhTU0hfRkxQID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbC1wb3J0IjoicmVtb3RlLXBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsMTAsJmxpX3BvcnQseHhzdHJpbmcpKSA8IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgIGlmIChsaV9wb3J0IDwgMSB8fCBsaV9wb3J0ID4gNjU1MzUpIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiP091dCByYW5nZSAtIG1pbjogMSwgbWF4OiA2NTUzNVxuIik7CisgICAgICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgICB9CisJICAgICAgaWYgKCh4ID0gY21mbGQoImhvc3QiLHNzaF9oc3Q/c3NoX2hzdDoiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkJcmV0dXJuKHgpOworICAgICAgICAgICAgICBuID0gY2tzdHJuY3B5KHRtcGJ1ZixzLFRNUEJVRlNJWik7CisgICAgICAgICAgICAgIGZ3X2hvc3QgPSB0bXBidWY7CisgICAgICAgICAgICAgIGlmICgoeCA9IGNtbnVtKCJob3N0LXBvcnQiLGNrdWl0b2EobGlfcG9ydCksMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9fcG9ydCx4eHN0cmluZykpIDwgMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgaWYgKHRvX3BvcnQgPCAxIHx8IHRvX3BvcnQgPiA2NTUzNSkgeworICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/T3V0IHJhbmdlIC0gbWluOiAxLCBtYXg6IDY1NTM1XG4iKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgICAgICAgIH0KKwkgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisJCXJldHVybih4KTsKKwkgICAgICBzd2l0Y2ggKGNtcmVzdWx0Lm5yZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFhTU0hfRkxQOgkvKiBTU0ggRk9SV0FSRC1MT0NBTC1QT1JUICovCisjaWZuZGVmIFNTSFRFU1QKKyAgICAgICAgICAgICAgICAgIHNzaF9md2RfbG9jYWxfcG9ydChsaV9wb3J0LGZ3X2hvc3QsdG9fcG9ydCk7CisjZW5kaWYgLyogU1NIVEVTVCAqLworCQkgIHJldHVybihzdWNjZXNzID0gMSk7CisJCWNhc2UgWFNTSF9GUlA6CS8qIFNTSCBGT1JXQVJELVJFTU9URS1QT1JUICovCisjaWZuZGVmIFNTSFRFU1QKKyAgICAgICAgICAgICAgICAgIHNzaF9md2RfcmVtb3RlX3BvcnQobGlfcG9ydCxmd19ob3N0LHRvX3BvcnQpOworI2VuZGlmIC8qIFNTSFRFU1QgKi8KKwkJICByZXR1cm4oc3VjY2VzcyA9IDEpOworCSAgICAgIH0KKwkgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCSAgfQorCWNhc2UgWFNTSF9WMjoJCS8qIFNTSCBWMiAqLworCSAgaWYgKChjeCA9IGNta2V5KHNzaDJ0YWIsbnNzaDJ0YWIsIiIsIiIsIHh4c3RyaW5nKSkgPCAwKQorCSAgICByZXR1cm4oY3gpOworCSAgc3dpdGNoIChjeCkgeworCSAgICBjYXNlIFhTU0gyX1JLRToKKwkgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCisJCXJldHVybih4KTsKKyNpZm5kZWYgU1NIVEVTVAorCSAgICAgIHNzaF92Ml9yZWtleSgpOworI2VuZGlmIC8qIFNTSFRFU1QgKi8KKwkgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCSAgICBkZWZhdWx0OgorCSAgICAgIHJldHVybigtMik7CisJICB9CisJY2FzZSBYU1NIX0tFWToKKwkgIGlmICgoY3ggPSBjbWtleShzc2hrZXksbnNzaGtleSwiIiwiIiwgeHhzdHJpbmcpKSA8IDApCisJICAgIHJldHVybihjeCk7CisJICBzd2l0Y2ggKGN4KSB7CisJICAgIGNhc2UgU1NIS19QQVNTOiB7CS8qIENoYW5nZSBwYXNzcGhyYXNlICovCisJICAgICAgY2hhciAqIG9sZHAgPSBOVUxMLCAqIG5ld3AgPSBOVUxMOworCSAgICAgIHN0cnVjdCBGREIgZGYsIHN3OworCSAgICAgIGNtZmRiaSgmc3csCisJCSAgICAgX0NNS0VZLAkJLyogZmNvZGUgKi8KKwkJICAgICAiRmlsZW5hbWUsIG9yIHN3aXRjaCIsIC8qIGhscG1zZyAqLworCQkgICAgICIiLAkJLyogZGVmYXVsdCAqLworCQkgICAgICIiLAkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkJICAgICAyLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworCQkgICAgIDQsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDI6IDQgPSBjbXN3aSAqLworCQkgICAgIHh4c3RyaW5nLAkJLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworCQkgICAgIHNzaGtwc3csCQkvKiBLZXl3b3JkIHRhYmxlICovCisJCSAgICAgJmRmCQkvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisJCSAgICAgKTsKKwkgICAgICBjbWZkYmkoJmRmLAkJLyogMm5kIEZEQiAtIGZpbGUgZm9yIGRpc3BsYXkgKi8KKwkJICAgICBfQ01JRkksCQkvKiBvdXRwdXQgZmlsZSAqLworCQkgICAgICIiLAkJLyogaGxwbXNnICovCisJCSAgICAgIiIsCQkvKiBkZWZhdWx0ICovCisJCSAgICAgIiIsCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCQkgICAgIDAsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKwkJICAgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisJCSAgICAgeHhzdHJpbmcsCisJCSAgICAgTlVMTCwKKwkJICAgICBOVUxMCisJCSAgICAgKTsKKwkgICAgICBsaW5lWzBdID0gTlVMOworCisJICAgICAgd2hpbGUgKDEpIHsKKwkJICB4ID0gY21mZGIoJnN3KTsKKwkJICBpZiAoeCA9PSAtMykgYnJlYWs7CisJCSAgaWYgKHggPCAwKQorCQkgICAgcmV0dXJuKHgpOworCQkgIGlmIChjbXJlc3VsdC5mY29kZSAhPSBfQ01LRVkpCisJCSAgICBicmVhazsKKwkJICBpZiAoIWNtZ2JyaygpKSB7CisJCSAgICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJICAgICAgcmV0dXJuKC05KTsKKwkJICB9CisJCSAgaWYgKCh5ID0gY21mbGQoIlBhc3NwaHJhc2UiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorCQkgICAgcmV0dXJuKHkpOworCQkgIHN3aXRjaCAoY21yZXN1bHQubnJlc3VsdCkgeworCQkgICAgY2FzZSAxOgkJLyogT2xkICovCisJCSAgICAgIG1ha2VzdHIoJm9sZHAscyk7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAyOgkJLyogTmV3ICovCisJCSAgICAgIG1ha2VzdHIoJm5ld3Ascyk7CisJCSAgfQorCSAgICAgIH0KKwkgICAgICBpZiAoY21yZXN1bHQuZmNvZGUgPT0gX0NNSUZJKSB7IC8qIEZpbGVuYW1lICovCisJCSAgY2tzdHJuY3B5KGxpbmUsY21yZXN1bHQuc3Jlc3VsdCxMSU5CVUZTSVopOworCQkgIGlmICh6Zm5xZnAobGluZSxUTVBCVUZTSVosdG1wYnVmKSkKKwkJICAgIGNrc3RybmNweShsaW5lLHRtcGJ1ZixMSU5CVUZTSVopOworCSAgICAgIH0KKwkgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKworI2lmbmRlZiBTU0hURVNUCisJICAgICAgeCA9IHNzaGtleV9jaGFuZ2VfcGFzc3BocmFzZShsaW5lWzBdID8gbGluZSA6IE5VTEwsCisJCQkJCSAgICAgb2xkcCwgbmV3cCk7CisjZW5kaWYgLyogU1NIVEVTVCAqLworCSAgICAgIG1ha2VzdHIoJm9sZHAsTlVMTCk7CisJICAgICAgbWFrZXN0cigmbmV3cCxOVUxMKTsKKwkgICAgICBzdWNjZXNzID0gKHggPT0gMCk7CisJICAgICAgcmV0dXJuKHN1Y2Nlc3MpOworCSAgICB9CisJICAgIGNhc2UgU1NIS19DUkVBOiB7CS8qIFNTSCBLRVkgQ1JFQVRFIC9zd2l0Y2hlcy4uLiAqLworCSAgICAgIGludCBiaXRzID0gMTAyNCwga2V5dHlwZSA9IFNTSEtUXzJSOworCSAgICAgIGNoYXIgKiBwYXNzID0gTlVMTCwgKiBjb21tZW50ID0gTlVMTDsKKwkgICAgICBzdHJ1Y3QgRkRCIGRmLCBzdzsKKworICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgKiBjaGFyICogc3Noa2V5X2RlZmF1bHRfZmlsZShpbnQga2V5dHlwZSkgCisgICAgICAgICAgICAgICAqIHdpbGwgcHJvdmlkZSB0aGUgZGVmYXVsdCBmaWxlbmFtZSBmb3IgYSBnaXZlbiBrZXl0eXBlCisgICAgICAgICAgICAgICAqIGlzIGl0IHBvc3NpYmxlIHRvIGhhdmUgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSAybmQKKyAgICAgICAgICAgICAgICogRkRCIHNldCBhbmQgY2hhbmdlZCB3aGVuIGEgL1RZUEUgc3dpdGNoIGlzIHByb3ZpZGVkPworICAgICAgICAgICAgICAgKiBXb3VsZCB0aGlzIGFsbG93IGZvciB0YWIgY29tcGxldGlvbiBvZiB0aGUgZmlsZW5hbWU/CisgICAgICAgICAgICAgICAqLworCSAgICAgIGNtZmRiaSgmc3csCisJCSAgICAgX0NNS0VZLAkJLyogZmNvZGUgKi8KKwkJICAgICAiRmlsZW5hbWUsIG9yIHN3aXRjaCIsIC8qIGhscG1zZyAqLworCQkgICAgICIiLAkJLyogZGVmYXVsdCAqLworCQkgICAgICIiLAkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkJICAgICBuc3Noa2NyZWEsCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKwkJICAgICA0LAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKwkJICAgICB4eHN0cmluZywJCS8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKwkJICAgICBzc2hrY3JlYSwJCS8qIEtleXdvcmQgdGFibGUgKi8KKwkJICAgICAmZGYJCS8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKwkJICAgICApOworCSAgICAgIGNtZmRiaSgmZGYsCQkvKiAybmQgRkRCIC0gZmlsZSBmb3IgZGlzcGxheSAqLworCQkgICAgIF9DTU9GSSwJCS8qIG91dHB1dCBmaWxlICovCisJCSAgICAgIiIsCQkvKiBobHBtc2cgKi8KKwkJICAgICAiIiwJCS8qIGRlZmF1bHQgKi8KKwkJICAgICAiIiwJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJCSAgICAgMCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworCQkgICAgIDAsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKwkJICAgICB4eHN0cmluZywKKwkJICAgICBOVUxMLAorCQkgICAgIE5VTEwKKwkJICAgICApOworCSAgICAgIGxpbmVbMF0gPSBOVUw7CisKKwkgICAgICB3aGlsZSAoMSkgeworCQkgIHggPSBjbWZkYigmc3cpOworCQkgIGlmICh4ID09IC0zKSBicmVhazsKKwkJICBpZiAoeCA8IDApCisJCSAgICByZXR1cm4oeCk7CisJCSAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkKKwkJICAgIGJyZWFrOworCQkgIGlmICghY21nYnJrKCkpIHsKKwkJICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkgICAgICByZXR1cm4oLTkpOworCQkgIH0KKwkJICBzd2l0Y2ggKGNtcmVzdWx0Lm5yZXN1bHQpIHsKKwkJICAgIGNhc2UgU1NIS0NfQkk6CS8qIC9CSVRTOm4gKi8KKwkJICAgICAgaWYgKCh5ID0gY21udW0oIiIsIjEwMjQiLDEwLCZ6LHh4c3RyaW5nKSkgPCAwKQorCQkJcmV0dXJuKHkpOworCQkgICAgICBpZiAoeiA8IDUxMiB8fCB6ID4gNDA5NikgeworCQkJICBwcmludGYoIj9PdXQgcmFuZ2UgLSBtaW46IDUxMiwgbWF4OiA0MDk2XG4iKTsKKwkJCSAgcmV0dXJuKC05KTsKKwkJICAgICAgfQorCQkgICAgICBiaXRzID0gejsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIFNTSEtDX1BQOgkvKiAvUEFTU1BIUkFTRTpibGFoICovCisJCSAgICAgIGlmICgoeSA9IGNtZmxkKCJQYXNzcGhyYXNlIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkJCXJldHVybih5KTsKKwkJICAgICAgbWFrZXN0cigmcGFzcyxzKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIFNTSEtDX1RZOgkvKiAvVFlQRTprZXl3b3JkICovCisJCSAgICAgIGlmICgoeSA9IGNta2V5KHNzaGtjdHksbnNzaGtjdHksIiIsCisJCQkJICAgICAidjItcnNhIix4eHN0cmluZykpIDwgMCkKKwkJCXJldHVybih5KTsKKwkJICAgICAga2V5dHlwZSA9IHk7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBTU0hLQ18xUjoJLyogL0NPTU1FTlQgKi8KKwkJICAgICAgaWYgKCh5ID0gY21mbGQoIlRleHQiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorCQkJcmV0dXJuKHkpOworCQkgICAgICBtYWtlc3RyKCZjb21tZW50LHMpOworCQkgICAgICBicmVhazsKKwkJICB9CisJICAgICAgfQorCSAgICAgIGlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01PRkkpIHsgLyogRmlsZW5hbWUgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChjbXJlc3VsdC5zcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmUsY21yZXN1bHQuc3Jlc3VsdCxMSU5CVUZTSVopOworICAgICAgICAgICAgICAgICAgICAgIGlmICh6Zm5xZnAobGluZSxUTVBCVUZTSVosdG1wYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KGxpbmUsdG1wYnVmLExJTkJVRlNJWik7CisJCSAgfQorCSAgICAgIH0KKwkgICAgICBpZiAoKHkgPSBjbWNmbSgpKSA8IDApIC8qIENvbmZpcm0gKi8KKwkJcmV0dXJuKHkpOworI2lmbmRlZiBTU0hURVNUCisJICAgICAgeCA9IHNzaGtleV9jcmVhdGUobGluZVswXSA/IGxpbmUgOiBOVUxMLAorCQkJCWJpdHMsIHBhc3MsIGtleXR5cGUsIGNvbW1lbnQpOworCSAgICAgIGlmIChwYXNzKQorCQltZW1zZXQocGFzcywwLHN0cmxlbihwYXNzKSk7CisjZW5kaWYgLyogU1NIVEVTVCAqLworCSAgICAgIG1ha2VzdHIoJnBhc3MsTlVMTCk7CisJICAgICAgbWFrZXN0cigmY29tbWVudCxOVUxMKTsKKwkgICAgICByZXR1cm4oc3VjY2VzcyA9ICh4ID09IDApKTsKKwkgICAgfQorCSAgICBjYXNlIFNTSEtfRElTUDogewkvKiBTU0ggS0VZIERJU1BMQVkgL3N3aXRjaGVzLi4uICovCisJICAgICAgY2hhciBjOworCSAgICAgIGludCBpbmZtdCA9IDAsIG91dGZtdCA9IDA7CisJICAgICAgc3RydWN0IEZEQiBkZiwgc3c7CisJICAgICAgY21mZGJpKCZzdywKKwkJICAgICBfQ01LRVksCQkvKiBmY29kZSAqLworCQkgICAgICJGaWxlbmFtZSwgb3Igc3dpdGNoIiwgLyogaGxwbXNnICovCisJCSAgICAgIiIsCQkvKiBkZWZhdWx0ICovCisJCSAgICAgIiIsCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCQkgICAgIG5zc2hkc3dpLAkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDE6IHRibCBzaXplICovCisJCSAgICAgNCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisJCSAgICAgeHhzdHJpbmcsCQkvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisJCSAgICAgc3NoZHN3aSwJCS8qIEtleXdvcmQgdGFibGUgKi8KKwkJICAgICAmZGYJCS8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKwkJICAgICApOworCSAgICAgIGNtZmRiaSgmZGYsCQkvKiAybmQgRkRCIC0gZmlsZSBmb3IgZGlzcGxheSAqLworCQkgICAgIF9DTUlGSSwJCS8qIGZjb2RlICovCisJCSAgICAgIiIsCQkvKiBobHBtc2cgKi8KKwkJICAgICAiIiwJCS8qIGRlZmF1bHQgKi8KKwkJICAgICAiIiwJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJCSAgICAgMCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworCQkgICAgIDAsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKwkJICAgICB4eHN0cmluZywKKwkJICAgICBOVUxMLAorCQkgICAgIE5VTEwKKwkJICAgICApOworCSAgICAgIGxpbmVbMF0gPSBOVUw7CisKKwkgICAgICB3aGlsZSAoMSkgeworCQkgIHggPSBjbWZkYigmc3cpOworCQkgIGlmICh4ID09IC0zKSBicmVhazsKKwkJICBpZiAoeCA8IDApCisJCSAgICByZXR1cm4oeCk7CisJCSAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkKKwkJICAgIGJyZWFrOworCQkgIGlmICghY21nYnJrKCkpIHsKKwkJICAgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkgICAgICByZXR1cm4oLTkpOworCQkgIH0KKwkJICBzd2l0Y2ggKGNtcmVzdWx0Lm5yZXN1bHQpIHsKKyNpZmRlZiBDT01NRU5UCisJCSAgICBjYXNlIFNTSEtEX0lOOgkvKiAvSU4tRk9STUFUOiAqLworCQkgICAgICBpZiAoKHkgPSBjbWtleShzc2hkaWZtdCxuc3NoZGlmbXQsCisJCQkJICAgICAiIiwiIix4eHN0cmluZykpIDwgMCkKKwkJCXJldHVybih5KTsKKwkJICAgICAgaW5mbXQgPSB5OworCQkgICAgICBicmVhazsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJCSAgICBjYXNlIFNTSEtEX09VVDoJLyogL0ZPUk1BVDogKi8KKwkJICAgICAgaWYgKCh5ID0gY21rZXkoc3NoZG9mbXQsbnNzaGRvZm10LAorCQkJCSAgICAgIiIsIiIseHhzdHJpbmcpKSA8IDApCisJCQlyZXR1cm4oeSk7CisJCSAgICAgIG91dGZtdCA9IHk7CisJCSAgICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICAgICAgaWYgKGNtcmVzdWx0LmZjb2RlID09IF9DTUlGSSkgeyAvKiBGaWxlbmFtZSAqLworCQkgIGNrc3RybmNweShsaW5lLGNtcmVzdWx0LnNyZXN1bHQsTElOQlVGU0laKTsKKwkJICBpZiAoemZucWZwKGxpbmUsVE1QQlVGU0laLHRtcGJ1ZikpCisJCSAgICBja3N0cm5jcHkobGluZSx0bXBidWYsTElOQlVGU0laKTsKKwkgICAgICB9CisjaWZkZWYgQ09NTUVOVAorCSAgICAgIGlmICghbGluZVswXSkgeworCQkgIHByaW50ZigiP0tleSBmaWxlbmFtZSByZXF1aXJlZFxuIik7CisJCSAgcmV0dXJuKC05KTsKKwkgICAgICB9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCSAgICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkgLyogQ29uZmlybSAqLworCQlyZXR1cm4oeSk7CisjaWZuZGVmIFNTSFRFU1QKKwkgICAgICBzd2l0Y2ggKG91dGZtdCkgeworCQljYXNlIFNLREZfT1NTSDoKKyAgICAgICAgICAgICAgICAgIC8qIDJuZCBwYXJhbSBpcyBvcHRpb25hbCBwYXNzcGhyYXNlICovCisJCSAgeCA9IHNzaGtleV9kaXNwbGF5X3B1YmxpYyhsaW5lWzBdID8gbGluZSA6IE5VTEwsIE5VTEwpOworCQkgIGJyZWFrOworCQljYXNlIFNLREZfU1NIQzoKKyAgICAgICAgICAgICAgICAgIC8qIDJuZCBwYXJhbSBpcyBvcHRpb25hbCBwYXNzcGhyYXNlICovCisJCSAgeCA9IHNzaGtleV9kaXNwbGF5X3B1YmxpY19hc19zc2gyKGxpbmVbMF0gPyBsaW5lIDogTlVMTCwKKwkJCQkJCSAgICBOVUxMKTsKKwkJICBicmVhazsKKwkJY2FzZSBTS0RGX0lFVEY6CisJCSAgeCA9IHNzaGtleV9kaXNwbGF5X2ZpbmdlcnByaW50KGxpbmVbMF0gPyBsaW5lIDogTlVMTCwgMSk7CisJCSAgYnJlYWs7CisJCWNhc2UgU0tERl9GSU5HOgorCQkgIHggPSBzc2hrZXlfZGlzcGxheV9maW5nZXJwcmludChsaW5lWzBdID8gbGluZSA6IE5VTEwsIDApOworCQkgIGJyZWFrOworCSAgICAgIH0KKyNlbmRpZiAvKiBTU0hURVNUICovCisJICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAoeCA9PSAwKSk7CisJICAgIH0KKwkgICAgY2FzZSBTU0hLX1YxOgkJLyogU1NIIEtFWSBWMSBTRVQtQ09NTUVOVCAqLworCSAgICAgIGlmICgoeCA9IGNta2V5KHNzaGt2MSwxLCIiLCJzZXQtY29tbWVudCIsIHh4c3RyaW5nKSkgPCAwKQorCQlyZXR1cm4oeCk7CisJICAgICAgaWYgKHggIT0gMSkgcmV0dXJuKC0yKTsKKwkgICAgICBpZiAoKHggPSBjbWlmaSgiS2V5IGZpbGUgbmFtZSIsIiIsJnMsJnkseHhzdHJpbmcpKSA8IDApIHsKKwkJICBpZiAoeCA9PSAtMykgeworCQkgICAgICBwcmludGYoIj9OYW1lIG9mIGtleSBmaWxlIHJlcXVpcmVkXG4iKTsKKwkJICAgICAgcmV0dXJuKC05KTsKKwkJICB9CisJICAgICAgfQorCSAgICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKwkgICAgICBpZiAoKHggPSBjbXR4dCgiQ29tbWVudCB0ZXh0IiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkJcmV0dXJuKHgpOworI2lmbmRlZiBTU0hURVNUCisJICAgICAgeCA9IHNzaGtleV92MV9jaGFuZ2VfY29tbWVudChsaW5lLCAgLyogZmlsZW5hbWUgKi8KKwkJCQkJICAgcywgICAgIC8qIG5ldyBjb21tZW50ICovCisJCQkJCSAgIE5VTEwgICAvKiBwYXNzcGhyYXNlICovCisJCQkJCSAgICk7CisjZW5kaWYgLyogU1NIVEVTVCAqLworCSAgICAgIHN1Y2Nlc3MgPSAoeCA9PSAwKTsKKwkgICAgICByZXR1cm4oc3VjY2Vzcyk7CisJICB9CisJICBkZWZhdWx0OgorCSAgICByZXR1cm4oLTIpOworCX0KKyNlbHNlICAvKiBTU0hCVUlMVElOICovCisjaWZkZWYgU1NIQ01ECisJeCA9IG5ldHR5cGU7CisJaWYgKCh5ID0gc2V0bGluKFhYU1NILDAsMSkpIDwgMCkgeworCSAgICBpZiAoZXJybm8pCisJICAgICAgcHJpbnRmKCI/JXNcbiIsY2tfZXJyc3RyKCkpOworICAgICAgICAgICAgZWxzZQorI2lmZGVmIENPTU1FTlQKKwkgICAgLyogVGhpcyBpc24ndCByaWdodCBlaXRoZXIgYmVjYXVzZSBpdCBjYXRjaGVzIGNvbW1hbmQgZWRpdGluZyAqLworCSAgICAgIHByaW50ZigiP1NvcnJ5LCBwc2V1ZG90ZXJtaW5hbCBvcGVuIGZhaWxlZFxuIik7CisgICAgICAgICAgICBpZiAoaGludHMpCisJICAgICAgcHJpbnRmKCJIaW50OiBUcnkgXCJzc2ggLXQgJXNcIlxuIixsaW5lKTsKKyNlbHNlCisJICAgICAgcmV0dXJuKHkpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwkgICAgbmV0dHlwZSA9IHg7CQkvKiBGYWlsZWQsIHJlc3RvcmUgbmV0IHR5cGUuICovCisJICAgIHR0bnByb3RvID0gejsJCS8qIGFuZCBwcm90b2NvbCAqLworCSAgICBzdWNjZXNzID0gMDsKKwl9CisJZGlkc2V0bGluKys7CisJbmV0c2F2ZSA9IHg7CisJcmV0dXJuKHkpOworI2VuZGlmIC8qIFNTSENNRCAqLworI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKyAgICB9CisjZW5kaWYgLyogQU5ZU1NIICovCisKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgaWYgKGN4ID09IFhYU0tSTSkgewkJCS8qIFNLRVJNSVQgKFNlY3VyZSBTaGVsbCBLZXJtaXQpICovCisJZXh0ZXJuIGludCBuZXRzYXZlOworCWludCBrLCB4LCBoYXZlaG9zdCA9IDAsIHRyaXBzID0gMDsKKyAgICAgICAgaW50ICAgIHRtcHZlciA9IC0xLCB0bXB4ZncgPSAtMTsKKyNpZm5kZWYgU1NIVEVTVAorICAgICAgICBleHRlcm4gaW50IHNsX3NzaF94ZncsIHNsX3NzaF94Zndfc2F2ZWQ7CisgICAgICAgIGV4dGVybiBpbnQgc2xfc3NoX3Zlciwgc2xfc3NoX3Zlcl9zYXZlZDsKKyNlbmRpZiAvKiBTU0hURVNUICovCisgICAgICAgIGV4dGVybiBpbnQgbWRtdHlwLCBtZG1zYXYsIGN4dHlwZSwgc2xfdWlkX3NhdmVkOworICAgICAgICBleHRlcm4gY2hhciAqIHNsbXNnOworCWV4dGVybiBjaGFyIHVpZGJ1ZltdLCBzbF91aWRidWZbXTsKKyAgICAgICAgZXh0ZXJuIGNoYXIgcHdidWZbXSwgKiBnX3Bzd2Q7CisgICAgICAgIGV4dGVybiBpbnQgcHdmbGcsIHB3Y3J5cHQsIGdfcGZsZywgZ19wY3B0LCBub2xvY2FsOworCXN0cnVjdCBGREIgc3csIGt3LCBmbDsKKworICAgICAgICBpZiAoc3NoX3RtcHN0cikKKwkgIG1lbXNldChzc2hfdG1wc3RyLDAsc3RybGVuKHNzaF90bXBzdHIpKTsKKyAgICAgICAgbWFrZXN0cigmc3NoX3RtcHN0cixOVUxMKTsKKyAgICAgICAgbWFrZXN0cigmc3NoX3RtcHVpZCxOVUxMKTsKKyAgICAgICAgbWFrZXN0cigmc3NoX3RtcGNtZCxOVUxMKTsKKyAgICAgICAgbWFrZXN0cigmc3NoX3RtcHBvcnQsTlVMTCk7CisKKwljbWZkYmkoJmt3LAkJCS8qIDFzdCBGREIgLSBjb21tYW5kcyAqLworCSAgICAgICBfQ01LRVksCQkJLyogZmNvZGUgKi8KKwkgICAgICAgImhvc3QgWyBwb3J0IF0sXG4gb3IgYWN0aW9uIiwgLyogaGxwbXNnICovCisJICAgICAgICIiLAkJCS8qIGRlZmF1bHQgKi8KKwkgICAgICAgIiIsCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkgICAgICAgbnNzaGtlcm1pdCwJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworCSAgICAgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiAwID0ga2V5d29yZCAqLworCSAgICAgICB4eHN0cmluZywJCS8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKwkgICAgICAgc3Noa2VybWl0LAkJLyogS2V5d29yZCB0YWJsZSAqLworCSAgICAgICAmZmwJCQkvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisJICAgICAgICk7CisJY21mZGJpKCZmbCwJCQkvKiBIb3N0ICovCisJICAgICAgIF9DTUZMRCwJCQkvKiBmY29kZSAqLworCSAgICAgICAiIiwJCQkvKiBobHBtc2cgKi8KKwkgICAgICAgIiIsCQkJLyogZGVmYXVsdCAqLworCSAgICAgICAiIiwJCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCSAgICAgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisJICAgICAgIDAsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKwkgICAgICAgeHhzdHJpbmcsCisJICAgICAgIE5VTEwsCisJICAgICAgIE5VTEwKKwkgICAgICAgKTsKKworCXggPSBjbWZkYigma3cpOworCWlmICh4ID09IC0zKSB7CisJICAgIHByaW50ZigiP3NrZXJtaXQgd2hhdD9cbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKwlpZiAoeCA8IDApCisJICByZXR1cm4oeCk7CisJaGF2ZWhvc3QgPSAwOworCWlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01GTEQpIHsKKwkgICAgaGF2ZWhvc3QgPSAxOworCSAgICBja3N0cm5jcHkobGluZSxjbXJlc3VsdC5zcmVzdWx0LExJTkJVRlNJWik7IC8qIEhvc3RuYW1lICovCisJICAgIGNtcmVzdWx0Lm5yZXN1bHQgPSBTS1JNX09QTjsKKwl9CisJc3dpdGNoIChjbXJlc3VsdC5ucmVzdWx0KSB7CS8qIFNTSCBrZXl3b3JkICovCisJICBjYXNlIFNLUk1fT1BOOgkJLyogU1NIIE9QRU4gKi8KKwkgICAgaWYgKCFoYXZlaG9zdCkgeworCQlpZiAoKHggPSBjbWZsZCgiSG9zdCIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisJCSAgcmV0dXJuKHgpOworCQlja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisJICAgIH0KKwkgICAgLyogUGFyc2UgWyBwb3J0IF0gWyBzd2l0Y2hlcyBdICovCisJICAgIGNtZmRiaSgma3csCQkJLyogU3dpdGNoZXMgKi8KKwkJICAgX0NNS0VZLAorCQkgICAiUG9ydCBudW1iZXIgb3Igc2VydmljZSBuYW1lLFxub3Igc3dpdGNoIiwKKwkJICAgIiIsCisJCSAgICIiLAorCQkgICBuc3Noa3Jtb3Buc3csCisJCSAgIDQsCisJCSAgIHh4c3RyaW5nLAorCQkgICBzc2hrcm1vcG5zdywKKwkJICAgJmZsCisJCSAgICk7CisJICAgIGNtZmRiaSgmZmwsCQkJLyogUG9ydCBudW1iZXIgb3Igc2VydmljZSBuYW1lICovCisJCSAgIF9DTUZMRCwKKwkJICAgIiIsCisJCSAgICIiLAorCQkgICAiIiwKKwkJICAgMCwKKwkJICAgMCwKKwkJICAgeHhzdHJpbmcsCisJCSAgIE5VTEwsCisJCSAgIE5VTEwKKwkJICAgKTsKKwkgICAgdHJpcHMgPSAwOwkJCS8qIEV4cGxhaW5lZCBiZWxvdyAqLworCSAgICB3aGlsZSAoMSkgewkJCS8qIFBhcnNlIHBvcnQgYW5kIHN3aXRjaGVzICovCisJCXggPSBjbWZkYigma3cpOwkJLyogR2V0IGEgZmllbGQgKi8KKwkJaWYgKHggPT0gLTMpCQkvKiBVc2VyIHR5cGVkIENSIHNvIHF1aXQgZnJvbSBsb29wICovCisJCSAgYnJlYWs7CisJCWlmICh4IDwgMCkJCS8qIE90aGVyIHBhcnNlIGVycm9yLCBwYXNzIGl0IGJhY2sgKi8KKwkJICByZXR1cm4oeCk7CisJCXN3aXRjaCAoY21yZXN1bHQuZmNvZGUpIHsgLyogRmllbGQgb3IgS2V5d29yZD8gKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgX0NNRkxEOgkJICAvKiBGaWVsZCAqLworICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfdG1wcG9ydCxjbXJlc3VsdC5zcmVzdWx0KTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgX0NNS0VZOgkJLyogS2V5d29yZCAqLworCQkgICAgc3dpdGNoIChjbXJlc3VsdC5ucmVzdWx0KSB7CS8qIFdoaWNoIG9uZT8gKi8KKwkJICAgICAgY2FzZSBTU0hTV19VU1I6CSAgICAgICAgLyogL1VTRVI6ICovCisJCQlpZiAoIWNtZ2JyaygpKSB7CisJCQkgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkJICAgIHJldHVybigtOSk7CisJCQl9CisJCQlpZiAoKHkgPSBjbWZsZCgiVXNlcm5hbWUiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorCQkJICByZXR1cm4oeSk7CisJCQlzID0gYnJzdHJpcChzKTsKKwkJCW1ha2VzdHIoJnNzaF90bXB1aWQscyk7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNTSFNXX1BXRDoKKwkJCWlmICghY21nYnJrKCkpIHsKKwkJCSAgICBwcmludGYoIj9UaGlzIHN3aXRjaCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkgICAgcmV0dXJuKC05KTsKKwkJCX0KKwkJCWRlYm9rID0gMDsKKwkJCWlmICgoeCA9IGNtZmxkKCJQYXNzd29yZCIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKwkJCSAgICBpZiAoeCA9PSAtMykgeworCQkJCW1ha2VzdHIoJnNzaF90bXBzdHIsIiIpOworCQkJICAgIH0gZWxzZSB7CisJCQkJcmV0dXJuKHgpOworCQkJICAgIH0KKwkJCX0gZWxzZSB7CisJCQkgICAgcyA9IGJyc3RyaXAocyk7CisJCQkgICAgaWYgKCh4ID0gKGludClzdHJsZW4ocykpID4gUFdCVUZMKSB7CisJCQkJbWFrZXN0cigmc2xtc2csIkludGVybmFsIGVycm9yIik7CisJCQkJcHJpbnRmKCI/U29ycnksIHRvbyBsb25nIC0gbWF4ID0gJWRcbiIsUFdCVUZMKTsKKwkJCQlyZXR1cm4oLTkpOworCQkJICAgIH0KKwkJCSAgICBtYWtlc3RyKCZzc2hfdG1wc3RyLHMpOworCQkJfQorCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTU0hTV19WRVI6CisJCQlpZiAoKHggPSBjbW51bSgiTnVtYmVyIiwiIiwxMCwmeix4eHN0cmluZykpIDwgMCkKKwkJCSAgcmV0dXJuKHgpOworCQkJaWYgKHogPCAxIHx8IHogPiAyKSB7CisJCQkgICAgcHJpbnRmKCI/T3V0IG9mIHJhbmdlOiAlZFxuIix6KTsKKwkJCSAgICByZXR1cm4oLTkpOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wdmVyID0gejsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKC0yKTsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKwkJaWYgKHRyaXBzKysgPT0gMCkgewkvKiBBZnRlciBmaXJzdCB0aW1lIHRocm91Z2ggKi8KKwkJICAgIGNtZmRiaSgma3csCQkvKiBvbmx5IHBhcnNlIHN3aXRjaGVzLCBub3QgcG9ydC4gKi8KKwkJCSAgIF9DTUtFWSwKKwkJCSAgICJTd2l0Y2giLAorCQkJICAgIiIsCisJCQkgICAiIiwKKwkJCSAgIG5zc2hrcm1vcG5zdywKKwkJCSAgIDQsCisJCQkgICB4eHN0cmluZywKKwkJCSAgIHNzaGtybW9wbnN3LAorCQkJICAgTlVMTAorCQkJICAgKTsKKwkJfQorCSAgICB9CisJICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkJLyogR2V0IGNvbmZpcm1hdGlvbiAqLworCSAgICAgIHJldHVybih4KTsKKyAgICAgICAgICAgICAgaWYgKGNsc2tjb25ueCgxKSA8IDApIHsJLyogQ2xvc2UgY3VycmVudCBLZXJtaXQgY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgaWYgKCBzc2hfdG1wc3RyICkgeworICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChzc2hfdG1wc3RyLDAsc3RybGVuKHNzaF90bXBzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfdG1wc3RyLE5VTEwpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfaHN0LGxpbmUpOwkvKiBTdGFzaCBldmVyeXRoaW5nICovCisgICAgICAgICAgICAgIGlmIChzc2hfdG1wdWlkKSB7CisgICAgICAgICAgICAgICAgICBpZiAoIXNsX3VpZF9zYXZlZCkgeworICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShzbF91aWRidWYsdWlkYnVmLFVJREJVRkxFTik7CisgICAgICAgICAgICAgICAgICAgICAgc2xfdWlkX3NhdmVkID0gMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh1aWRidWYsc3NoX3RtcHVpZCxVSURCVUZMRU4pOworICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NoX3RtcHVpZCxOVUxMKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoc3NoX3RtcHBvcnQpIHsKKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF9wcnQsc3NoX3RtcHBvcnQpOworICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NoX3RtcHBvcnQsTlVMTCk7CisgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NoX3BydCxOVUxMKTsKKworICAgICAgICAgICAgICAvKiBTZXQgdGhlIFN1YnN5c3RlbSB0byBLZXJtaXQgKi8KKyAgICAgICAgICAgICAgc3NoX2NhcyA9IDE7CisgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF9jbWQsImtlcm1pdCIpOworCisgICAgICAgICAgICAgIGlmICh0bXB2ZXIgPiAtMSkgeworI2lmbmRlZiBTU0hURVNUCisgICAgICAgICAgICAgICAgICBpZiAoIXNsX3NzaF92ZXJfc2F2ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzbF9zc2hfdmVyID0gc3NoX3ZlcjsKKyAgICAgICAgICAgICAgICAgICAgICBzbF9zc2hfdmVyX3NhdmVkID0gMTsKKyAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBTU0hURVNUICovCisgICAgICAgICAgICAgICAgICBzc2hfdmVyID0gdG1wdmVyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8qIERpc2FibGUgWDExIEZvcndhcmRpbmcgKi8KKyNpZm5kZWYgU1NIVEVTVAorICAgICAgICAgICAgICBpZiAoIXNsX3NzaF94Zndfc2F2ZWQpIHsKKyAgICAgICAgICAgICAgICAgIHNsX3NzaF94ZncgPSBzc2hfeGZ3OworICAgICAgICAgICAgICAgICAgc2xfc3NoX3hmd19zYXZlZCA9IDE7CisgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBTU0hURVNUICovCisgICAgICAgICAgICAgIHNzaF94ZncgPSAwOworCisgICAgICAgICAgICAgIGlmIChzc2hfdG1wc3RyKSB7CisgICAgICAgICAgICAgICAgICBpZiAoc3NoX3RtcHN0clswXSkgeworICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweShwd2J1Zixzc2hfdG1wc3RyLFBXQlVGTCsxKTsKKyAgICAgICAgICAgICAgICAgICAgICBwd2ZsZyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgcHdjcnlwdCA9IDA7CisgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBwd2ZsZyA9IDA7CisgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfdG1wc3RyLE5VTEwpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG5ldHR5cGUgPSBORVRfU1NIOworICAgICAgICAgICAgICBpZiAobWRtc2F2IDwgMCkKKyAgICAgICAgICAgICAgICAgIG1kbXNhdiA9IG1kbXR5cDsKKyAgICAgICAgICAgICAgbWRtdHlwID0gLW5ldHR5cGU7CisgICAgICAgICAgICAgIHggPSAxOworCisjaWZuZGVmIE5PU1BMCisgICAgICAgICAgICBtYWtlc3RyKCZnX3Bzd2QscHdidWYpOwkvKiBTYXZlIGdsb2JhbCBwd2J1ZiAqLworICAgICAgICAgICAgZ19wZmxnID0gcHdmbGc7CQkvKiBhbmQgZmxhZyAqLworICAgICAgICAgICAgZ19wY3B0ID0gcHdjcnlwdDsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisJICAgIC8qIExpbmUgcGFyYW1ldGVyIHRvIHR0b3BlbigpIGlzIGlnbm9yZWQgKi8KKwkgICAgayA9IHR0b3BlbihsaW5lLCZ4LG1kbXR5cCwgMCk7CisJICAgIGlmIChrIDwgMCkgeworCQlwcmludGYoIj9VbmFibGUgdG8gY29ubmVjdCB0byAlc1xuIixzc2hfaHN0KTsKKwkJbWRtdHlwID0gbWRtc2F2OworICAgICAgICAgICAgICAgIHNscmVzdG9yKCk7CisJCXJldHVybihzdWNjZXNzID0gMCk7CisJICAgIH0KKwkgICAgZHVwbGV4ID0gMDsgICAgICAgICAgICAgLyogUmVtb3RlIGVjaG8gKi8KKwkgICAgY2tzdHJuY3B5KHR0bmFtZSxsaW5lLFRUTkFNTEVOKTsgLyogUmVjb3JkIHRoZSBjb21tYW5kICovCisJICAgIGRlYnVnKEYxMTAsInNzaCB0dG5hbWUiLHR0bmFtZSwwKTsKKwkgICAgbWFrZXN0cigmc2xtc2csTlVMTCk7CS8qIE5vIFNFVCBMSU5FIGVycm9yIG1lc3NhZ2UgKi8KKwkgICAgY3h0eXBlID0gQ1hUX1NTSDsKKyNpZm5kZWYgTk9ESUFMCisJICAgIGRpYWxzdGEgPSBESUFfVU5LOworI2VuZGlmIC8qIE5PRElBTCAqLworCSAgICBzdWNjZXNzID0gMTsJCS8qIFNFVCBMSU5FIHN1Y2NlZWRlZCAqLworCSAgICBuZXR3b3JrID0gMTsJCS8qIE5ldHdvcmsgY29ubmVjdGlvbiAobm90IHNlcmlhbCkgKi8KKwkgICAgbG9jYWwgPSAxOwkJCS8qIExvY2FsIG1vZGUgKG5vdCByZW1vdGUpICovCisJICAgIGlmICgocmVsaWFibGUgIT0gU0VUX09GRiB8fCAhc2V0cmVsaWFibGUpKQorCSAgICAgIHJlbGlhYmxlID0gU0VUX09OOwkvKiBUcmFuc3BvcnQgaXMgcmVsaWFibGUgZW5kIHRvIGVuZCAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgRGlhbGVyU2VuZChPUFRfS0VSTUlUX0NPTk5FQ1QsIDApOworI2VuZGlmIC8qIE9TMiAqLworCSAgICBzZXRmbG93KCk7CQkJLyogU2V0IGFwcHJvcHJpYXRlIGZsb3cgY29udHJvbCAqLworCisJICAgIGhhdmVsaW5lID0gMTsKKyNpZmRlZiBDS0xPR0RJQUwKKyNpZmRlZiBORVRDT05OCisJICAgIGRvbG9nbmV0KCk7CisjZW5kaWYgLyogTkVUQ09OTiAqLworI2VuZGlmIC8qIENLTE9HRElBTCAqLworCisjaWZuZGVmIE5PU1BMCisJICAgIGlmIChsb2NhbCkgeworCQlpZiAobm1hYykgewkJLyogQW55IG1hY3JvcyBkZWZpbmVkPyAqLworCQkgICAgaW50IGs7CQkvKiBZZXMgKi8KKwkJICAgIGsgPSBtbG9vayhtYWN0YWIsIm9uX29wZW4iLG5tYWMpOyAvKiBMb29rIHRoaXMgdXAgKi8KKwkJICAgIGlmIChrID49IDApIHsJICAgICAgICAgICAgICAvKiBJZiBmb3VuZCwgKi8KKwkJCWlmIChkb2RvKGssc3NoX2hzdCwwKSA+IC0xKSAgIC8qIHNldCBpdCB1cCwgKi8KKwkJCSAgcGFyc2VyKDEpOwkJICAgICAgLyogYW5kIGV4ZWN1dGUgaXQgKi8KKwkJICAgIH0KKwkJfQorCSAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZmRlZiBMT0NVUwkJCisJICAgIGlmIChhdXRvbG9jdXMpCisJCXNldGxvY3VzKDEsMSk7CisjZW5kaWYgLyogTE9DVVMgKi8KKworCS8qIENvbW1hbmQgd2FzIGNvbmZpcm1lZCBzbyB3ZSBjYW4gcHJlLXBvcCBjb21tYW5kIGxldmVsLiAqLworCS8qIFRoaXMgaXMgc28gQ09OTkVDVCBtb2R1bGUgd29uJ3QgdGhpbmsgd2UncmUgZXhlY3V0aW5nIGEgKi8KKwkvKiBzY3JpcHQgaWYgQ09OTkVDVCB3YXMgdGhlIGZpbmFsIGNvbW1hbmQgaW4gdGhlIHNjcmlwdC4gKi8KKwkgICAgaWYgKGNtZGx2bCA+IDApCisJICAgICAgcHJlcG9wKCk7CisJICAgIHJldHVybihzdWNjZXNzID0gMSk7CisKKwkgIGRlZmF1bHQ6CisJICAgIHJldHVybigtMik7CisJfQorICAgIH0KKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisKKyNpZmRlZiBTRlRQX0JVSUxUSU4KKyAgICBpZiAoY3ggPT0gWFhTRlRQKSB7CQkJLyogU0ZUUCAoU2VjdXJlIFNoZWxsIEZpbGUgVHJhbnNmZXIpICovCisJZXh0ZXJuIGludCBuZXRzYXZlOworCWludCBrLCB4LCBoYXZlaG9zdCA9IDAsIHRyaXBzID0gMDsKKyAgICAgICAgaW50ICAgIHRtcHZlciA9IC0xLCB0bXB4ZncgPSAtMTsKKyNpZm5kZWYgU1NIVEVTVAorICAgICAgICBleHRlcm4gaW50IHNsX3NzaF94ZncsIHNsX3NzaF94Zndfc2F2ZWQ7CisgICAgICAgIGV4dGVybiBpbnQgc2xfc3NoX3Zlciwgc2xfc3NoX3Zlcl9zYXZlZDsKKyNlbmRpZiAvKiBTU0hURVNUICovCisgICAgICAgIGV4dGVybiBpbnQgbWRtdHlwLCBtZG1zYXYsIGN4dHlwZSwgc2xfdWlkX3NhdmVkOworICAgICAgICBleHRlcm4gY2hhciAqIHNsbXNnOworCWV4dGVybiBjaGFyIHVpZGJ1ZltdLCBzbF91aWRidWZbXTsKKyAgICAgICAgZXh0ZXJuIGNoYXIgcHdidWZbXSwgKiBnX3Bzd2Q7CisgICAgICAgIGV4dGVybiBpbnQgcHdmbGcsIHB3Y3J5cHQsIGdfcGZsZywgZ19wY3B0LCBub2xvY2FsOworCXN0cnVjdCBGREIgc3csIGt3LCBmbDsKKworICAgICAgICBpZiAoc3NoX3RtcHN0cikKKwkgIG1lbXNldChzc2hfdG1wc3RyLDAsc3RybGVuKHNzaF90bXBzdHIpKTsKKyAgICAgICAgbWFrZXN0cigmc3NoX3RtcHN0cixOVUxMKTsKKyAgICAgICAgbWFrZXN0cigmc3NoX3RtcHVpZCxOVUxMKTsKKyAgICAgICAgbWFrZXN0cigmc3NoX3RtcGNtZCxOVUxMKTsKKyAgICAgICAgbWFrZXN0cigmc3NoX3RtcHBvcnQsTlVMTCk7CisKKwljbWZkYmkoJmt3LAkJCS8qIDFzdCBGREIgLSBjb21tYW5kcyAqLworCSAgICAgICBfQ01LRVksCQkJLyogZmNvZGUgKi8KKwkgICAgICAgImhvc3QgWyBwb3J0IF0sXG4gb3IgYWN0aW9uIiwgLyogaGxwbXNnICovCisJICAgICAgICIiLAkJCS8qIGRlZmF1bHQgKi8KKwkgICAgICAgIiIsCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkgICAgICAgbnNmdHBrd3RhYiwJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworCSAgICAgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiAwID0ga2V5d29yZCAqLworCSAgICAgICB4eHN0cmluZywJCS8qIFByb2Nlc3NpbmcgZnVuY3Rpb24gKi8KKwkgICAgICAgc2Z0cGt3dGFiLAkJLyogS2V5d29yZCB0YWJsZSAqLworCSAgICAgICAmZmwJCQkvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisJICAgICAgICk7CisJY21mZGJpKCZmbCwJCQkvKiBIb3N0ICovCisJICAgICAgIF9DTUZMRCwJCQkvKiBmY29kZSAqLworCSAgICAgICAiIiwJCQkvKiBobHBtc2cgKi8KKwkgICAgICAgIiIsCQkJLyogZGVmYXVsdCAqLworCSAgICAgICAiIiwJCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCSAgICAgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxICovCisJICAgICAgIDAsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDIgKi8KKwkgICAgICAgeHhzdHJpbmcsCisJICAgICAgIE5VTEwsCisJICAgICAgIE5VTEwKKwkgICAgICAgKTsKKworCXggPSBjbWZkYigma3cpOworCWlmICh4ID09IC0zKSB7CisJICAgIHByaW50ZigiP3NmdHAgd2hhdD9cbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKwlpZiAoeCA8IDApCisJICByZXR1cm4oeCk7CisJaGF2ZWhvc3QgPSAwOworCWlmIChjbXJlc3VsdC5mY29kZSA9PSBfQ01GTEQpIHsKKwkgICAgaGF2ZWhvc3QgPSAxOworCSAgICBja3N0cm5jcHkobGluZSxjbXJlc3VsdC5zcmVzdWx0LExJTkJVRlNJWik7IC8qIEhvc3RuYW1lICovCisJICAgIGNtcmVzdWx0Lm5yZXN1bHQgPSBTRlRQX09QTjsKKwl9CisJc3dpdGNoIChjbXJlc3VsdC5ucmVzdWx0KSB7CS8qIFNGVFAga2V5d29yZCAqLworCSAgY2FzZSBTRlRQX09QTjoJCS8qIFNGVFAgT1BFTiAqLworCSAgICBpZiAoIWhhdmVob3N0KSB7CisJCWlmICgoeCA9IGNtZmxkKCJIb3N0IiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkJICByZXR1cm4oeCk7CisJCWNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKwkgICAgfQorCSAgICAvKiBQYXJzZSBbIHBvcnQgXSBbIHN3aXRjaGVzIF0gKi8KKwkgICAgY21mZGJpKCZrdywJCQkvKiBTd2l0Y2hlcyAqLworCQkgICBfQ01LRVksCisJCSAgICJQb3J0IG51bWJlciBvciBzZXJ2aWNlIG5hbWUsXG5vciBzd2l0Y2giLAorCQkgICAiIiwKKwkJICAgIiIsCisJCSAgIG5zc2hrcm1vcG5zdywKKwkJICAgNCwKKwkJICAgeHhzdHJpbmcsCisJCSAgIHNzaGtybW9wbnN3LAorCQkgICAmZmwKKwkJICAgKTsKKwkgICAgY21mZGJpKCZmbCwJCQkvKiBQb3J0IG51bWJlciBvciBzZXJ2aWNlIG5hbWUgKi8KKwkJICAgX0NNRkxELAorCQkgICAiIiwKKwkJICAgIiIsCisJCSAgICIiLAorCQkgICAwLAorCQkgICAwLAorCQkgICB4eHN0cmluZywKKwkJICAgTlVMTCwKKwkJICAgTlVMTAorCQkgICApOworCSAgICB0cmlwcyA9IDA7CQkJLyogRXhwbGFpbmVkIGJlbG93ICovCisJICAgIHdoaWxlICgxKSB7CQkJLyogUGFyc2UgcG9ydCBhbmQgc3dpdGNoZXMgKi8KKwkJeCA9IGNtZmRiKCZrdyk7CQkvKiBHZXQgYSBmaWVsZCAqLworCQlpZiAoeCA9PSAtMykJCS8qIFVzZXIgdHlwZWQgQ1Igc28gcXVpdCBmcm9tIGxvb3AgKi8KKwkJICBicmVhazsKKwkJaWYgKHggPCAwKQkJLyogT3RoZXIgcGFyc2UgZXJyb3IsIHBhc3MgaXQgYmFjayAqLworCQkgIHJldHVybih4KTsKKwkJc3dpdGNoIChjbXJlc3VsdC5mY29kZSkgeyAvKiBGaWVsZCBvciBLZXl3b3JkPyAqLworICAgICAgICAgICAgICAgICAgY2FzZSBfQ01GTEQ6CQkgIC8qIEZpZWxkICovCisgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF90bXBwb3J0LGNtcmVzdWx0LnNyZXN1bHQpOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBfQ01LRVk6CQkvKiBLZXl3b3JkICovCisJCSAgICBzd2l0Y2ggKGNtcmVzdWx0Lm5yZXN1bHQpIHsJLyogV2hpY2ggb25lPyAqLworCQkgICAgICBjYXNlIFNTSFNXX1VTUjoJICAgICAgICAvKiAvVVNFUjogKi8KKwkJCWlmICghY21nYnJrKCkpIHsKKwkJCSAgICBwcmludGYoIj9UaGlzIHN3aXRjaCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkgICAgcmV0dXJuKC05KTsKKwkJCX0KKwkJCWlmICgoeSA9IGNtZmxkKCJVc2VybmFtZSIsIiIsJnMseHhzdHJpbmcpKSA8IDApCisJCQkgIHJldHVybih5KTsKKwkJCXMgPSBicnN0cmlwKHMpOworCQkJbWFrZXN0cigmc3NoX3RtcHVpZCxzKTsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1NIU1dfUFdEOgorCQkJaWYgKCFjbWdicmsoKSkgeworCQkJICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCSAgICByZXR1cm4oLTkpOworCQkJfQorCQkJZGVib2sgPSAwOworCQkJaWYgKCh4ID0gY21mbGQoIlBhc3N3b3JkIiwiIiwmcyx4eHN0cmluZykpIDwgMCkgeworCQkJICAgIGlmICh4ID09IC0zKSB7CisJCQkJbWFrZXN0cigmc3NoX3RtcHN0ciwiIik7CisJCQkgICAgfSBlbHNlIHsKKwkJCQlyZXR1cm4oeCk7CisJCQkgICAgfQorCQkJfSBlbHNlIHsKKwkJCSAgICBzID0gYnJzdHJpcChzKTsKKwkJCSAgICBpZiAoKHggPSAoaW50KXN0cmxlbihzKSkgPiBQV0JVRkwpIHsKKwkJCQltYWtlc3RyKCZzbG1zZywiSW50ZXJuYWwgZXJyb3IiKTsKKwkJCQlwcmludGYoIj9Tb3JyeSwgdG9vIGxvbmcgLSBtYXggPSAlZFxuIixQV0JVRkwpOworCQkJCXJldHVybigtOSk7CisJCQkgICAgfQorCQkJICAgIG1ha2VzdHIoJnNzaF90bXBzdHIscyk7CisJCQl9CisJCQlicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFNTSFNXX1ZFUjoKKwkJCWlmICgoeCA9IGNtbnVtKCJOdW1iZXIiLCIiLDEwLCZ6LHh4c3RyaW5nKSkgPCAwKQorCQkJICByZXR1cm4oeCk7CisJCQlpZiAoeiA8IDEgfHwgeiA+IDIpIHsKKwkJCSAgICBwcmludGYoIj9PdXQgb2YgcmFuZ2U6ICVkXG4iLHopOworCQkJICAgIHJldHVybigtOSk7CisJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICB0bXB2ZXIgPSB6OworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLTIpOworCQkgICAgfQorCQl9CisJCWlmICh0cmlwcysrID09IDApIHsJLyogQWZ0ZXIgZmlyc3QgdGltZSB0aHJvdWdoICovCisJCSAgICBjbWZkYmkoJmt3LAkJLyogb25seSBwYXJzZSBzd2l0Y2hlcywgbm90IHBvcnQuICovCisJCQkgICBfQ01LRVksCisJCQkgICAiU3dpdGNoIiwKKwkJCSAgICIiLAorCQkJICAgIiIsCisJCQkgICBuc3Noa3Jtb3Buc3csCisJCQkgICA0LAorCQkJICAgeHhzdHJpbmcsCisJCQkgICBzc2hrcm1vcG5zdywKKwkJCSAgIE5VTEwKKwkJCSAgICk7CisJCX0KKwkgICAgfQorCSAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApCS8qIEdldCBjb25maXJtYXRpb24gKi8KKwkgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICAgIGlmIChjbHNrY29ubngoMSkgPCAwKSB7CS8qIENsb3NlIGN1cnJlbnQgS2VybWl0IGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgIGlmICggc3NoX3RtcHN0ciApIHsKKyAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoc3NoX3RtcHN0ciwwLHN0cmxlbihzc2hfdG1wc3RyKSk7CisgICAgICAgICAgICAgICAgICAgICAgbWFrZXN0cigmc3NoX3RtcHN0cixOVUxMKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbWFrZXN0cigmc3NoX2hzdCxsaW5lKTsJLyogU3Rhc2ggZXZlcnl0aGluZyAqLworICAgICAgICAgICAgICBpZiAoc3NoX3RtcHVpZCkgeworICAgICAgICAgICAgICAgICAgaWYgKCFzbF91aWRfc2F2ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkoc2xfdWlkYnVmLHVpZGJ1ZixVSURCVUZMRU4pOworICAgICAgICAgICAgICAgICAgICAgIHNsX3VpZF9zYXZlZCA9IDE7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBja3N0cm5jcHkodWlkYnVmLHNzaF90bXB1aWQsVUlEQlVGTEVOKTsKKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF90bXB1aWQsTlVMTCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHNzaF90bXBwb3J0KSB7CisgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfcHJ0LHNzaF90bXBwb3J0KTsKKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF90bXBwb3J0LE5VTEwpOworICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF9wcnQsTlVMTCk7CisKKyAgICAgICAgICAgICAgLyogU2V0IHRoZSBTdWJzeXN0ZW0gdG8gS2VybWl0ICovCisgICAgICAgICAgICAgIHNzaF9jYXMgPSAxOworICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfY21kLCJzZnRwIik7CisKKyAgICAgICAgICAgICAgaWYgKHRtcHZlciA+IC0xKSB7CisjaWZuZGVmIFNTSFRFU1QKKyAgICAgICAgICAgICAgICAgIGlmICghc2xfc3NoX3Zlcl9zYXZlZCkgeworICAgICAgICAgICAgICAgICAgICAgIHNsX3NzaF92ZXIgPSBzc2hfdmVyOworICAgICAgICAgICAgICAgICAgICAgIHNsX3NzaF92ZXJfc2F2ZWQgPSAxOworICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIFNTSFRFU1QgKi8KKyAgICAgICAgICAgICAgICAgIHNzaF92ZXIgPSB0bXB2ZXI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLyogRGlzYWJsZSBYMTEgRm9yd2FyZGluZyAqLworI2lmbmRlZiBTU0hURVNUCisgICAgICAgICAgICAgIGlmICghc2xfc3NoX3hmd19zYXZlZCkgeworICAgICAgICAgICAgICAgICAgc2xfc3NoX3hmdyA9IHNzaF94Znc7CisgICAgICAgICAgICAgICAgICBzbF9zc2hfeGZ3X3NhdmVkID0gMTsKKyAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIFNTSFRFU1QgKi8KKyAgICAgICAgICAgICAgc3NoX3hmdyA9IDA7CisKKyAgICAgICAgICAgICAgaWYgKHNzaF90bXBzdHIpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChzc2hfdG1wc3RyWzBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHB3YnVmLHNzaF90bXBzdHIsUFdCVUZMKzEpOworICAgICAgICAgICAgICAgICAgICAgIHB3ZmxnID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICBwd2NyeXB0ID0gMDsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgIHB3ZmxnID0gMDsKKyAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF90bXBzdHIsTlVMTCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbmV0dHlwZSA9IE5FVF9TU0g7CisgICAgICAgICAgICAgIGlmIChtZG1zYXYgPCAwKQorICAgICAgICAgICAgICAgICAgbWRtc2F2ID0gbWRtdHlwOworICAgICAgICAgICAgICBtZG10eXAgPSAtbmV0dHlwZTsKKyAgICAgICAgICAgICAgeCA9IDE7CisKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgIG1ha2VzdHIoJmdfcHN3ZCxwd2J1Zik7ICAgICAgICAgICAgIC8qIFNhdmUgZ2xvYmFsIHB3YnVmICovCisgICAgICAgICAgICBnX3BmbGcgPSBwd2ZsZzsgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgZmxhZyAqLworICAgICAgICAgICAgZ19wY3B0ID0gcHdjcnlwdDsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisJICAgIC8qIExpbmUgcGFyYW1ldGVyIHRvIHR0b3BlbigpIGlzIGlnbm9yZWQgKi8KKwkgICAgayA9IHR0b3BlbihsaW5lLCZ4LG1kbXR5cCwgMCk7CisJICAgIGlmIChrIDwgMCkgeworCQlwcmludGYoIj9VbmFibGUgdG8gY29ubmVjdCB0byAlc1xuIixzc2hfaHN0KTsKKwkJbWRtdHlwID0gbWRtc2F2OworICAgICAgICAgICAgICAgIHNscmVzdG9yKCk7CisJCXJldHVybihzdWNjZXNzID0gMCk7CisJICAgIH0KKwkgICAgZHVwbGV4ID0gMDsgICAgICAgICAgICAgLyogUmVtb3RlIGVjaG8gKi8KKwkgICAgY2tzdHJuY3B5KHR0bmFtZSxsaW5lLFRUTkFNTEVOKTsgLyogUmVjb3JkIHRoZSBjb21tYW5kICovCisJICAgIGRlYnVnKEYxMTAsInNzaCB0dG5hbWUiLHR0bmFtZSwwKTsKKwkgICAgbWFrZXN0cigmc2xtc2csTlVMTCk7CS8qIE5vIFNFVCBMSU5FIGVycm9yIG1lc3NhZ2UgKi8KKwkgICAgY3h0eXBlID0gQ1hUX1NTSDsKKyNpZm5kZWYgTk9ESUFMCisJICAgIGRpYWxzdGEgPSBESUFfVU5LOworI2VuZGlmIC8qIE5PRElBTCAqLworCSAgICBzdWNjZXNzID0gMTsJCS8qIFNFVCBMSU5FIHN1Y2NlZWRlZCAqLworCSAgICBuZXR3b3JrID0gMTsJCS8qIE5ldHdvcmsgY29ubmVjdGlvbiAobm90IHNlcmlhbCkgKi8KKwkgICAgbG9jYWwgPSAxOwkJCS8qIExvY2FsIG1vZGUgKG5vdCByZW1vdGUpICovCisJICAgIGlmICgocmVsaWFibGUgIT0gU0VUX09GRiB8fCAhc2V0cmVsaWFibGUpKQorCSAgICAgIHJlbGlhYmxlID0gU0VUX09OOwkvKiBUcmFuc3BvcnQgaXMgcmVsaWFibGUgZW5kIHRvIGVuZCAqLworI2lmZGVmIE9TMgorICAgICAgICAgICAgRGlhbGVyU2VuZChPUFRfS0VSTUlUX0NPTk5FQ1QsIDApOworI2VuZGlmIC8qIE9TMiAqLworCSAgICBzZXRmbG93KCk7CQkJLyogU2V0IGFwcHJvcHJpYXRlIGZsb3cgY29udHJvbCAqLworCisJICAgIGhhdmVsaW5lID0gMTsKKyNpZmRlZiBDS0xPR0RJQUwKKyNpZmRlZiBORVRDT05OCisJICAgIGRvbG9nbmV0KCk7CisjZW5kaWYgLyogTkVUQ09OTiAqLworI2VuZGlmIC8qIENLTE9HRElBTCAqLworCisjaWZuZGVmIE5PU1BMCisJICAgIGlmIChsb2NhbCkgeworCQlpZiAobm1hYykgewkJLyogQW55IG1hY3JvcyBkZWZpbmVkPyAqLworCQkgICAgaW50IGs7CQkvKiBZZXMgKi8KKwkJICAgIGsgPSBtbG9vayhtYWN0YWIsIm9uX29wZW4iLG5tYWMpOyAvKiBMb29rIHRoaXMgdXAgKi8KKwkJICAgIGlmIChrID49IDApIHsJICAgICAgICAgICAgICAvKiBJZiBmb3VuZCwgKi8KKwkJCWlmIChkb2RvKGssc3NoX2hzdCwwKSA+IC0xKSAgIC8qIHNldCBpdCB1cCwgKi8KKwkJCSAgcGFyc2VyKDEpOwkJICAgICAgLyogYW5kIGV4ZWN1dGUgaXQgKi8KKwkJICAgIH0KKwkJfQorCSAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyNpZmRlZiBMT0NVUwkJCisJICAgIGlmIChhdXRvbG9jdXMpCisJCXNldGxvY3VzKDEsMSk7CisjZW5kaWYgLyogTE9DVVMgKi8KKworCS8qIENvbW1hbmQgd2FzIGNvbmZpcm1lZCBzbyB3ZSBjYW4gcHJlLXBvcCBjb21tYW5kIGxldmVsLiAqLworCS8qIFRoaXMgaXMgc28gQ09OTkVDVCBtb2R1bGUgd29uJ3QgdGhpbmsgd2UncmUgZXhlY3V0aW5nIGEgKi8KKwkvKiBzY3JpcHQgaWYgQ09OTkVDVCB3YXMgdGhlIGZpbmFsIGNvbW1hbmQgaW4gdGhlIHNjcmlwdC4gKi8KKwkgICAgaWYgKGNtZGx2bCA+IDApCisJICAgICAgcHJlcG9wKCk7CisKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBzZnRwX2RvX2luaXQoKTsKKwkgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKworCSAgY2FzZSBTRlRQX0NEOgorCSAgY2FzZSBTRlRQX0NIR1JQOgorCSAgY2FzZSBTRlRQX0NITU9EOgorCSAgY2FzZSBTRlRQX0NIT1dOOgorCSAgY2FzZSBTRlRQX1JNOgorCSAgY2FzZSBTRlRQX0RJUjoKKwkgIGNhc2UgU0ZUUF9HRVQ6CisJICBjYXNlIFNGVFBfTUtESVI6CisJICBjYXNlIFNGVFBfUFVUOgorCSAgY2FzZSBTRlRQX1BXRDoKKwkgIGNhc2UgU0ZUUF9SRU46CisJICBjYXNlIFNGVFBfUk1ESVI6CisJICBjYXNlIFNGVFBfTElOSzoKKwkgIGNhc2UgU0ZUUF9WRVI6CisJICAgIGlmICgoeSA9IGNtdHh0KCJjb21tYW5kIHBhcmFtZXRlcnMiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSAKKwkgICAgICByZXR1cm4oeSk7CisJICAgIGlmIChzc2hfdGNoaygpIDwgMCB8fCAhc3NoX2NhcyB8fCBzdHJjbXAoc3NoX2NtZCwic2Z0cCIpKSB7CisJCXByaW50ZigiP05vdCBjb25uZWN0ZWQgdG8gU0ZUUCBTZXJ2aWNlXG4iKTsKKwkJcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKwkgICAgfQorCSAgICBzdWNjZXNzID0gc2Z0cF9kb19jbWQoY21yZXN1bHQubnJlc3VsdCxzKTsKKwkgICAgcmV0dXJuKHN1Y2Nlc3MpOworCSAgZGVmYXVsdDoKKwkgICAgcmV0dXJuKC0yKTsKKwl9CisgICAgfQorI2VuZGlmIC8qIFNGVFBfQlVJTFRJTiAqLworCisgICAgaWYgKGN4ID09IFhYUkxPRykgewkJCS8qIFJMT0dJTiAqLworI2lmZGVmIFJMT0dDT0RFCisJaW50IHgsejsKKyNpZmRlZiBPUzIKKwlpZiAoIXRjcF9hdmFpbCkgeworCSAgICBwcmludGYoIj9Tb3JyeSwgZWl0aGVyIFRDUC9JUCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtIG9yXG5cCituZWNlc3NhcnkgRExMcyBkaWQgbm90IGxvYWQuICBVc2UgU0hPVyBORVRXT1JLIHRvIGNoZWNrIG5ldHdvcmsgc3RhdHVzLlxuIgorCQkgICApOworCSAgICBzdWNjZXNzID0gMDsKKwkgICAgcmV0dXJuKC05KTsKKwl9IGVsc2UgeworI2VuZGlmIC8qIE9TMiAqLworCSAgICB4ID0gbmV0dHlwZTsJCS8qIFNhdmUgbmV0IHR5cGUgaW4gY2FzZSBvZiBmYWlsdXJlICovCisJICAgIHogPSB0dG5wcm90bzsJCS8qIFNhdmUgcHJvdG9jb2wgaW4gY2FzZSBvZiBmYWlsdXJlICovCisJICAgIG5ldHR5cGUgPSBORVRfVENQQjsKKwkgICAgdHRucHJvdG8gPSBOUF9STE9HSU47CisJICAgIGlmICgoeSA9IHNldGxpbihYWUhPU1QsMCwxKSkgPD0gMCkgeworCQluZXR0eXBlID0geDsJCS8qIEZhaWxlZCwgcmVzdG9yZSBuZXQgdHlwZS4gKi8KKwkJdHRucHJvdG8gPSB6OwkJLyogYW5kIHByb3RvY29sICovCisJCXN1Y2Nlc3MgPSAwOworCSAgICB9CisJICAgIGRpZHNldGxpbisrOworI2lmZGVmIE9TMgorCX0KKyNlbmRpZiAvKiBPUzIgKi8KKwlyZXR1cm4oeSk7CisjZWxzZQorCXByaW50ZigiP1NvcnJ5LCBSTE9HSU4gaXMgbm90IGNvbmZpZ3VyZWQgaW4gdGhpcyBjb3B5IG9mIEMtS2VybWl0LlxuIik7CisJcmV0dXJuKC05KTsKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworICAgIH0KKyNlbmRpZiAvKiBORVRDT05OICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZuZGVmIE5PWE1JVAorICAgIGlmIChjeCA9PSBYWFRSQSkgewkJCS8qIFRSQU5TTUlUICovCisJZXh0ZXJuIGludCB4ZnJ4bGE7CisJaW50IGksIG4sIHhwaXBlID0gMCwgeGJpbmFyeSA9IDAsIHh4bGF0ZSA9IDEsIHh4bm93YWl0ID0gMCwgZ2V0dmFsOworCWludCB4eGVjaG8gPSAwOworCWludCBzY2FuID0gMTsKKwljaGFyIGM7CisJc3RydWN0IEZEQiBzZiwgc3csIHR4OwkJLyogRkRCcyBmb3IgcGFyc2UgZnVuY3Rpb25zICovCisjaWZuZGVmIE5PQ1NFVFMKKwlleHRlcm4gaW50IHRjc190cmFuc3A7CQkvKiBUZXJtIGNoYXJzZXQgaXMgdHJhbnNwYXJlbnQgKi8KKyNlbHNlCisJaW50IHRjc190cmFuc3AgPSAxOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmZGVmIENPTU1FTlQKKwl4YmluYXJ5ID0gYmluYXJ5OwkJLyogRGVmYXVsdCB0ZXh0L2JpbmFyeSBtb2RlICovCisjZWxzZQorCXhiaW5hcnkgPSAwOwkJCS8qIERlZmF1bHQgaXMgdGV4dCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKwl4eGVjaG8gPSB4bWl0eDsKKworCWNtZmRiaSgmc3csCQkJLyogRmlyc3QgRkRCIC0gY29tbWFuZCBzd2l0Y2hlcyAqLworCSAgICAgICBfQ01LRVksCQkJLyogZmNvZGUgKi8KKwkgICAgICAgIkZpbGVuYW1lLCBvciBzd2l0Y2giLAkvKiBobHBtc2cgKi8KKwkgICAgICAgIiIsCQkJLyogZGVmYXVsdCAqLworCSAgICAgICAiIiwJCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCSAgICAgICBueG1pdHN3LAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworCSAgICAgICA0LAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKwkgICAgICAgeHhzdHJpbmcsCQkvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisJICAgICAgIHhtaXRzdywJCQkvKiBLZXl3b3JkIHRhYmxlICovCisJICAgICAgICZzZgkJCS8qIFBvaW50ZXIgdG8gbmV4dCBGREIgKi8KKwkgICAgICAgKTsKKwljbWZkYmkoJnNmLAkJCS8qIDJuZCBGREIgLSBmaWxlIHRvIHNlbmQgKi8KKwkgICAgICAgX0NNSUZJLAkJCS8qIGZjb2RlICovCisJICAgICAgICJGaWxlIHRvIHRyYW5zbWl0IiwJLyogaGxwbXNnICovCisJICAgICAgICIiLAkJCS8qIGRlZmF1bHQgKi8KKwkgICAgICAgIiIsCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkgICAgICAgMCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworCSAgICAgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisJICAgICAgIHh4c3RyaW5nLAorCSAgICAgICBOVUxMLAorI2lmZGVmIFBJUEVTRU5ECisJICAgICAgICZ0eAorI2Vsc2UKKwkgICAgICAgTlVMTAorI2VuZGlmIC8qIFBJUEVTRU5EICovCisJICAgICAgICk7CisjaWZkZWYgUElQRVNFTkQKKyAgICAgICAgY21mZGJpKCZ0eCwKKwkgICAgICAgX0NNVFhULAkJCS8qIGZjb2RlICovCisJICAgICAgICJDb21tYW5kIiwJCS8qIGhscG1zZyAqLworCSAgICAgICAiIiwJCQkvKiBkZWZhdWx0ICovCisJICAgICAgICIiLAkJCS8qIGFkZHRsIHN0cmluZyBkYXRhICovCisJICAgICAgIDAsCQkJLyogYWRkdGwgbnVtZXJpYyBkYXRhIDEgKi8KKwkgICAgICAgMCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMiAqLworCSAgICAgICB4eHN0cmluZywKKwkgICAgICAgTlVMTCwKKwkgICAgICAgTlVMTAorCSAgICAgICApOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKwl3aGlsZSAoMSkgeworCSAgICB4ID0gY21mZGIoJnN3KTsKKwkgICAgaWYgKHggPCAwKQorCSAgICAgIHJldHVybih4KTsKKwkgICAgaWYgKGNtcmVzdWx0LmZjb2RlICE9IF9DTUtFWSkKKwkgICAgICBicmVhazsKKwkgICAgYyA9IGNtZ2JyaygpOwkJLyogSGF2ZSBzd2l0Y2gsIGdldCBicmVhayBjaGFyYWN0ZXIgKi8KKwkgICAgaWYgKChnZXR2YWwgPSAoYyA9PSAnOicgfHwgYyA9PSAnPScpKSAmJiAhKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworCQlwcmludGYoIj9UaGlzIHN3aXRjaCBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50XG4iKTsKKwkJcmV0dXJuKC05KTsKKwkgICAgfQorCSAgICBpZiAoIWdldHZhbCAmJiAoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisJCXByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJcmV0dXJuKC05KTsKKwkgICAgfQorCSAgICBuID0gY21yZXN1bHQubnJlc3VsdDsJLyogTnVtZXJpYyByZXN1bHQgPSBzd2l0Y2ggSUQgKi8KKwkgICAgc3dpdGNoIChuKSB7CQkvKiBQcm9jZXNzIHRoZSBzd2l0Y2ggKi8KKyNpZmRlZiBQSVBFU0VORAorCSAgICAgIGNhc2UgWE1JX0NNRDoJCS8qIFRyYW5zbWl0IGZyb20gYSBjb21tYW5kICovCisJCWlmIChub3B1c2gpIHsKKwkJICAgIHByaW50ZigiP1NvcnJ5LCBzeXN0ZW0gY29tbWFuZCBhY2Nlc3MgaXMgZGlzYWJsZWRcbiIpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorCQlzdy5obHBtc2cgPSAiQ29tbWFuZCwgb3Igc3dpdGNoIjsgLyogQ2hhbmdlIGhlbHAgbWVzc2FnZSAqLworCQl4cGlwZSA9IDE7CQkvKiAoTm8gd2F5IHRvIHVuZG8gdGhpcyBvbmUpICovCisJCWJyZWFrOworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKwkgICAgICBjYXNlIFhNSV9CSU46CQkvKiBCaW5hcnkgKi8KKwkJeGJpbmFyeSA9IDE7CisJCXh4bGF0ZSA9IDA7CQkvKiBEb24ndCB0cmFuc2xhdGUgY2hhcnNldHMgKi8KKwkJc2NhbiA9IDA7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBYTUlfVFhUOgkJLyogVGV4dCAqLworCQl4YmluYXJ5ID0gMDsKKwkJeHhsYXRlID0gIXRjc190cmFuc3A7CS8qIFRyYW5zbGF0ZSBpZiBURVJNIENIQVIgbm90IFRSQU5TUCAqLworCQlzY2FuID0gMDsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIFhNSV9UUkE6CQkvKiBUcmFuc3BhcmVudCB0ZXh0ICovCisJCXhiaW5hcnkgPSAwOworCQl4eGxhdGUgPSAwOwkJLyogQnV0IGRvbid0IHRyYW5zbGF0ZSBjaGFyc2V0cyAqLworCQlzY2FuID0gMDsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT01NRU5UCisJICAgICAgY2FzZSBYTUlfVlJCOgkJLyogL1ZFUkJPU0UgKi8KKwkgICAgICBjYXNlIFhNSV9RVUk6CQkvKiAvUVVJRVQgKi8KKwkJYnJlYWs7CQkJLyogKG5vdCBpbXBsZW1lbnRlZCB5ZXQpICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisJICAgICAgY2FzZSBYTUlfTk9XOgkJLyogL05PV0FJVCAqLworCQl4eG5vd2FpdCA9IDE7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBYTUlfTk9FOgkJLyogL05PV0FJVCAqLworCQl4eGVjaG8gPSAwOworCQlicmVhazsKKworCSAgICAgIGRlZmF1bHQ6CisJCXJldHVybigtMik7CisJICAgIH0KKworCX0KKwlpZiAoY21yZXN1bHQuZmNvZGUgIT0gX0NNSUZJICYmIGNtcmVzdWx0LmZjb2RlICE9IF9DTVRYVCkKKwkgIHJldHVybigtMik7CisJY2tzdHJuY3B5KGxpbmUsY21yZXN1bHQuc3Jlc3VsdCxMSU5CVUZTSVopOyAvKiBGaWxlbmFtZSAqLworCWlmICh6Zm5xZnAobGluZSxUTVBCVUZTSVosdG1wYnVmKSkKKwkgIGNrc3RybmNweShsaW5lLHRtcGJ1ZixMSU5CVUZTSVopOworCXMgPSBsaW5lOworCWlmICgoeSA9IGNtY2ZtKCkpIDwgMCkJCS8qIENvbmZpcm0gKi8KKwkgIHJldHVybih5KTsKKyNpZmRlZiBDS19BUEMKKwlpZiAoKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwpIHx8CisJICAgICgoYXBjYWN0aXZlID09IEFQQ19SRU1PVEUpICYmICghKGFwY3N0YXR1cyAmIEFQQ19VTkNIKSkpKQorCSAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyNlbmRpZiAvKiBDS19BUEMgKi8KKwlpZiAoY21yZXN1bHQubnJlc3VsdCAhPSAwKSB7CisJICAgIHByaW50ZigiP09ubHkgYSBzaW5nbGUgZmlsZSBtYXkgYmUgdHJhbnNtaXR0ZWRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKyNpZmRlZiBQSVBFU0VORAorCWlmICh4cGlwZSkgeworCSAgICBzID0gYnJzdHJpcChzKTsKKwkgICAgaWYgKCEqcykgeworCQlwcmludGYoIj9Tb3JyeSwgYSBjb21tYW5kIHRvIHNlbmQgZnJvbSBpcyByZXF1aXJlZFxuIik7CisJCXJldHVybigtOSk7CisJICAgIH0KKwkgICAgcGlwZXNlbmQgPSAxOworCX0KKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCisJaWYgKHNjYW4gJiYgKGZpbGVwZWVrCisjaWZuZGVmIE5PWEZFUgorCQkgICAgIHx8IHBhdHRlcm5zCisjZW5kaWYgLyogTk9YRkVSICovCisJCSAgICAgKSkgewkJLyogSWYgdXNlciBkaWRuJ3Qgc3BlY2lmeSB0eXBlICovCisJICAgIGludCBrLCB4OwkJCSAgICAgIC8qIHNjYW4gdGhlIGZpbGUgdG8gc2VlICovCisJICAgIHggPSAtMTsKKwkgICAgayA9IHNjYW5maWxlKHMsJngsbnNjYW5maWxlKTsKKwkgICAgaWYgKGsgPiAwKSB4YmluYXJ5ID0gKGsgPT0gRlRfQklOKSA/IFhZRlRfQiA6IFhZRlRfVDsKKwl9CisJaWYgKCF4ZnJ4bGEpIHh4bGF0ZSA9IDA7CisJc3VjY2VzcyA9IHRyYW5zbWl0KHMsCisJCQkgICAoY2hhcikgKHh4bm93YWl0ID8gJ1wwJyA6IChjaGFyKXhtaXRwKSwKKwkJCSAgIHh4bGF0ZSwKKwkJCSAgIHhiaW5hcnksCisJCQkgICB4eGVjaG8KKwkJCSAgICk7CisJcmV0dXJuKHN1Y2Nlc3MpOworICAgIH0KKyNlbmRpZiAvKiBOT1hNSVQgKi8KKworI2lmbmRlZiBOT0ZSSUxMUworICAgIGlmIChjeCA9PSBYWFRZUCAgfHwgY3ggPT0gWFhDQVQgfHwgY3ggPT0gWFhNT1JFIHx8CisJY3ggPT0gWFhIRUFEIHx8IGN4ID09IFhYVEFJTCkgeworCWludCBwYWdpbmcgPSAwLCBoYXZlbmFtZSA9IDAsIGhlYWQgPSAwLCB3aWR0aCA9IDA7CisJaW50IGhlaWdodCA9IDAsIGNvdW50ID0gMDsKKwljaGFyIHBmeGJ1Zls2NF0sICogcHJlZml4ID0gTlVMTDsKKwljaGFyIG91dGZpbGVbQ0tNQVhQQVRIKzFdOworCXN0cnVjdCBGREIgc2YsIHN3OworCWNoYXIgKiBwYXQgPSBOVUxMOworCWludCBpbmNzID0gMCwgb3V0Y3MgPSAwLCBjc2V0ID0gLTEsIG51bWJlciA9IDA7CisjaWZkZWYgVU5JQ09ERQorICAgICAgICBjaGFyICogdG9jcyA9ICIiOworCWV4dGVybiBpbnQgZmlsZW9yZGVyOworI2lmZGVmIE9TMgorI2lmZGVmIE5UCisJY2hhciBndWlidWZbMTI4XSwgKiBndWlfdGl0bGUgPSBOVUxMOworCWludCAgZ3VpID0gMDsKKyNlbmRpZiAvKiBOVCAqLworI2lmbmRlZiBOT0NTRVRTCisJZXh0ZXJuIGludCB0Y3NyLCB0Y3NsOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBVTklDT0RFICovCisKKwlvdXRmaWxlWzBdID0gTlVMOworCisJaWYgKGN4ID09IFhYTU9SRSkKKwkgIHBhZ2luZyA9IDE7CisJZWxzZSBpZiAoY3ggPT0gWFhDQVQpCisJICBwYWdpbmcgPSAwOworCWVsc2UKKwkgIHBhZ2luZyA9ICh0eXBfcGFnZSA8IDApID8geGFza21vcmUgOiB0eXBfcGFnZTsKKwlpZiAocGFnaW5nIDwgMCkKKwkgIHBhZ2luZyA9IHNhdmVhc2s7CisKKwlpZiAoY3ggPT0gWFhIRUFEKSB7CisJICAgIGhlYWQgPSAxMDsKKwkgICAgY3ggPSBYWFRZUDsKKwl9IGVsc2UgaWYgKGN4ID09IFhYVEFJTCkgeworCSAgICBoZWFkID0gLTEwOworCSAgICBjeCA9IFhYVFlQOworCX0KKworI2lmZGVmIElLU0QKKwlpZiAoaW5zZXJ2ZXIgJiYgIUVOQUJMRUQoZW5fdHlwKSkgeworCSAgICBwcmludGYoIj9Tb3JyeSwgVFlQRSBjb21tYW5kIGRpc2FibGVkXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisjZW5kaWYgLyogSUtTRCAqLworCisJY21mZGJpKCZzdywJCQkvKiAybmQgRkRCIC0gb3B0aW9uYWwgL1BBR0Ugc3dpdGNoICovCisJICAgICAgIF9DTUtFWSwJCQkvKiBmY29kZSAqLworCSAgICAgICAiRmlsZW5hbWUgb3Igc3dpdGNoIiwJLyogaGxwbXNnICovCisJICAgICAgICIiLAkJCS8qIGRlZmF1bHQgKi8KKwkgICAgICAgIiIsCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkgICAgICAgbnR5cGV0YWIsCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMTogdGJsIHNpemUgKi8KKwkgICAgICAgNCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMjogNCA9IGNtc3dpICovCisJICAgICAgIHh4c3RyaW5nLAkJLyogUHJvY2Vzc2luZyBmdW5jdGlvbiAqLworCSAgICAgICB0eXBldGFiLAkJCS8qIEtleXdvcmQgdGFibGUgKi8KKwkgICAgICAgJnNmCQkJLyogUG9pbnRlciB0byBuZXh0IEZEQiAqLworCSAgICAgICApOworCWNtZmRiaSgmc2YsCQkJLyogMXN0IEZEQiAtIGZpbGUgdG8gdHlwZSAqLworCSAgICAgICBfQ01JRkksCQkJLyogZmNvZGUgKi8KKwkgICAgICAgIiIsCQkJLyogaGxwbXNnICovCisJICAgICAgICIiLAkJCS8qIGRlZmF1bHQgKi8KKwkgICAgICAgIiIsCQkJLyogYWRkdGwgc3RyaW5nIGRhdGEgKi8KKwkgICAgICAgMCwJCQkvKiBhZGR0bCBudW1lcmljIGRhdGEgMSAqLworCSAgICAgICAwLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyICovCisJICAgICAgIHh4c3RyaW5nLAorCSAgICAgICBOVUxMLAorCSAgICAgICBOVUxMCisJICAgICAgICk7CisKKwl3aGlsZSAoIWhhdmVuYW1lKSB7CisJICAgIHggPSBjbWZkYigmc3cpOwkJLyogUGFyc2Ugc29tZXRoaW5nICovCisJICAgIGRlYnVnKEYxMDEsInR5cGUgY21mZGIiLCIiLHgpOworCSAgICBkZWJ1ZyhGMTAxLCJ0eXBlIGNtcmVzdWx0LmZjb2RlIiwiIixjbXJlc3VsdC5mY29kZSk7CisJICAgIGRlYnVnKEYxMDEsInR5cGUgY21yZXN1bHQubnJlc3VsdCIsIiIsY21yZXN1bHQubnJlc3VsdCk7CisJICAgIGlmICh4IDwgMCkgewkJCS8qIEVycm9yICovCisJCWlmICh4ID09IC0zKSB7CisJCSAgICB4ID0gLTk7CisJCSAgICBwcmludGYoIj9GaWxlbmFtZSByZXF1aXJlZFxuIik7CisJCX0KKwkJcmV0dXJuKHgpOworCSAgICB9IGVsc2UgaWYgKGNtcmVzdWx0LmZjb2RlID09IF9DTUtFWSkgeworCQljaGFyIGM7IGludCBnZXR2YWw7CisJCWMgPSBjbWdicmsoKTsKKwkJZ2V0dmFsID0gKGMgPT0gJzonIHx8IGMgPT0gJz0nKTsKKwkJaWYgKGdldHZhbCAmJiAhKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworCQkgICAgcHJpbnRmKCI/VGhpcyBzd2l0Y2ggZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudFxuIik7CisJCSAgICByZXR1cm4oLTkpOworCQl9CisjaWZkZWYgQ09NTUVOVAorCQlpZiAoIWdldHZhbCAmJiAoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisJCSAgICBwcmludGYoIj9UaGlzIHN3aXRjaCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCSAgICAvKiBOb3QgaWYgaXQgaGFzIGEgZGVmYXVsdCEgKi8KKwkJICAgIHJldHVybigtOSk7CisJCX0KKyNlbmRpZiAvKiBDT01NRU5UICovCisJCXN3aXRjaCAoY21yZXN1bHQubnJlc3VsdCkgeworI2lmZGVmIENLX1RUR1dTSVoKKwkJICBjYXNlIFRZUF9QQUc6CisJCSAgICBwYWdpbmcgPSAxOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlIFRZUF9OT1A6CisJCSAgICBwYWdpbmcgPSAwOworCQkgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfVFRHV1NJWiAqLworCisJCSAgY2FzZSBUWVBfQ09VOgorCQkgICAgcGFnaW5nID0gMDsKKwkJICAgIGNvdW50ID0gMTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSBUWVBfSEVBOgorCQkgIGNhc2UgVFlQX1RBSToKKwkJICAgIHkgPSAxMDsKKwkJICAgIGlmIChnZXR2YWwpCisJCSAgICAgIGlmICgoeCA9IGNtbnVtKCJOdW1iZXIgb2YgbGluZXMiLAorCQkJCSAgICAgIjEwIiwxMCwmeSx4eHN0cmluZykpIDwgMCkKKwkJCXJldHVybih4KTsKKwkJICAgIGhlYWQgPSAoY21yZXN1bHQubnJlc3VsdCA9PSBUWVBfVEFJKSA/IC15IDogeTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSBUWVBfV0lEOgorCQkgICAgeSA9IHR5cF93aWQgPiAtMSA/IHR5cF93aWQgOiBjbWRfY29sczsKKwkJICAgIGlmIChnZXR2YWwpCisJCSAgICAgIGlmICgoeCA9IGNtbnVtKCJDb2x1bW4gYXQgd2hpY2ggdG8gdHJ1bmNhdGUiLAorCQkJCSAgICAgY2tpdG9hKHkpLDEwLCZ5LHh4c3RyaW5nKSkgPCAwKQorCQkJcmV0dXJuKHgpOworCQkgICAgd2lkdGggPSB5OworCQkgICAgYnJlYWs7CisKKyNpZmRlZiBLVUkKKwkJICBjYXNlIFRZUF9ISUc6CisJCSAgICBpZiAoZ2V0dmFsKQorCQkgICAgICBpZiAoKHggPSBjbW51bSgiSGVpZ2h0IG9mIEdVSSBkaWFsb2ciLAorCQkJCSAgICAgY2tpdG9hKHkpLDEwLCZ5LHh4c3RyaW5nKSkgPCAwKQorCQkJcmV0dXJuKHgpOworCQkgICAgaGVpZ2h0ID0geTsKKwkJICAgIGJyZWFrOworI2VuZGlmIC8qIEtVSSAqLworCisJCSAgY2FzZSBUWVBfUEFUOgorCQkgICAgaWYgKCFnZXR2YWwgJiYgKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworCQkJcHJpbnRmKCI/VGhpcyBzd2l0Y2ggcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkJcmV0dXJuKC05KTsKKwkJICAgIH0KKwkJICAgIGlmICgoeCA9IGNtZmxkKCJwYXR0ZXJuIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkJICAgICAgcmV0dXJuKHgpOworCQkgICAgY2tzdHJuY3B5KHRtcGJ1ZixzLFRNUEJVRlNJWik7CisJCSAgICBwYXQgPSB0bXBidWY7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgVFlQX1BGWDoKKwkJICAgIGlmICghZ2V0dmFsICYmIChjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKwkJCXByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCXJldHVybigtOSk7CisJCSAgICB9CisJCSAgICBpZiAoKHggPSBjbWZsZCgicHJlZml4IGZvciBlYWNoIGxpbmUiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKQorCQkgICAgICByZXR1cm4oeCk7CisJCSAgICBpZiAoKGludClzdHJsZW4ocykgPiA2MykgeworCQkJcHJpbnRmKCI/VG9vIGxvbmcgLSA2MyBtYXhcbiIpOworCQkJcmV0dXJuKC05KTsKKwkJICAgIH0KKwkJICAgIGNrc3RybmNweShwZnhidWYscyw2NCk7CisJCSAgICBwcmVmaXggPSBicnN0cmlwKHBmeGJ1Zik7CisJCSAgICBudW1iZXIgPSAwOworCQkgICAgYnJlYWs7CisKKyNpZmRlZiBLVUkKKwkJICBjYXNlIFRZUF9HVUk6CisJCSAgICBpZiAoIWdldHZhbCAmJiAoY21na3dmbGdzKCkgJiBDTV9BUkcpKSB7CisJCQlwcmludGYoIj9UaGlzIHN3aXRjaCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQlyZXR1cm4oLTkpOworCQkgICAgfQorCQkgICAgaWYgKCh4ID0gY21mbGQoIkRpYWxvZyBib3ggdGl0bGUiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSB7CisJCQlpZiAoeCAhPSAtMykKKwkJCSAgcmV0dXJuKHgpOworCQkgICAgfSBlbHNlIHsKKwkJCWlmICgoaW50KXN0cmxlbihzKSA+IDEyNykgeworCQkJICAgIHByaW50ZigiP1RvbyBsb25nIC0gMTI3IG1heFxuIik7CisJCQkgICAgcmV0dXJuKC05KTsKKwkJCX0KKwkJCWNrc3RybmNweShndWlidWYscywxMjgpOworCQkJZ3VpX3RpdGxlID0gYnJzdHJpcChndWlidWYpOworCQkgICAgfQorCQkgICAgZ3VpID0gMTsKKwkJICAgIGJyZWFrOworI2VuZGlmIC8qIEtVSSAqLworCisJCSAgY2FzZSBUWVBfTlVNOgkJLyogL05VTUJFUiAqLworCQkgICAgbnVtYmVyID0gMTsKKwkJICAgIHByZWZpeCA9IE5VTEw7CisJCSAgICBicmVhazsKKworI2lmZGVmIFVOSUNPREUKKwkJICBjYXNlIFRZUF9YUEE6CQkvKiAvVFJBTlNQQVJFTlQgKi8KKwkJICAgIGluY3MgPSAwOworCQkgICAgY3NldCA9IDA7CisJCSAgICBvdXRjcyA9IC0xOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlIFRZUF9YSU46CQkvKiAvQ0hBUkFDVEVSLVNFVDogKi8KKwkJICAgIGlmICghZ2V0dmFsICYmIChjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKwkJCXByaW50ZigiP1RoaXMgc3dpdGNoIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCXJldHVybigtOSk7CisJCSAgICB9CisJCSAgICBpZiAoKGluY3MgPSBjbWtleShmY3N0YWIsbmZpbGMsCisJCQkJICAgICAgImNoYXJhY3Rlci1zZXQgbmFtZSIsIiIseHhzdHJpbmcpKSA8IDApIHsKKwkJCWlmIChpbmNzID09IC0zKQkvKiBOb3RlOiBObyBkZWZhdWx0ICovCisJCQkgIGluY3MgPSAtMjsKKwkJCXJldHVybihpbmNzKTsKKwkJICAgIH0KKwkJICAgIGNzZXQgPSBpbmNzOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlIFRZUF9YVVQ6CQkvKiAvVFJBTlNMQVRFLVRPOiAqLworCQkgICAgaWYgKCFnZXR2YWwgJiYgKGNtZ2t3ZmxncygpICYgQ01fQVJHKSkgeworCQkJcHJpbnRmKCI/VGhpcyBzd2l0Y2ggcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkJcmV0dXJuKC05KTsKKwkJICAgIH0KKyNpZmRlZiBPUzIKKwkJICAgIGlmICghaW5zZXJ2ZXIgJiYgIWs5NXN0ZG91dCkgeworCQkJdG9jcyA9ICJ1Y3MyIjsKKwkJICAgIH0gZWxzZSB7CisjaWZkZWYgQ0tPVU5JCisJCQl0b2NzID0gcmxvb2t1cCh0eHJ0YWIsbnR4cnRhYix0Y3NsKTsKKyNlbHNlIC8qIENLT1VOSSAqLworCQkJZXh0ZXJuIHN0cnVjdCBrZXl0YWIgdHRjc3RhYltdOworCQkJZXh0ZXJuIGludCBudHhydGFiOworCQkJdG9jcyA9IHJsb29rdXAodHRjc3RhYixudGVybWMsdG9jcyk7CisJCQlpZiAoIXRvY3MpCisJCQkgIHRvY3MgPSBnZXRkY3NldCgpOworI2VuZGlmIC8qIENLT1VOSSAqLworICAgICAgICAgICAgICAgICAgICB9CisjZWxzZSAvKiBPUzIgKi8KKwkJICAgIHRvY3MgPSBnZXRkY3NldCgpOworI2VuZGlmIC8qIE9TMiAqLworCQkgICAgaWYgKChvdXRjcyA9IGNta2V5KGZjc3RhYixuZmlsYywKKwkJCQkgICAgICAgImNoYXJhY3Rlci1zZXQiLHRvY3MseHhzdHJpbmcpKSA8IDApCisJCSAgICAgIHJldHVybihvdXRjcyk7CisJCSAgICBicmVhazsKKyNlbmRpZiAvKiBVTklDT0RFICovCisJCSAgY2FzZSBUWVBfT1VUOgorCQkgICAgaWYgKCh4ID0gY21vZmkoIkZpbGUgZm9yIHJlc3VsdCBsaW5lcyIsIiIsCisJCQkJICAgJnMseHhzdHJpbmcpKSA8IDApCisJCSAgICAgIHJldHVybih4KTsKKwkJICAgIGNrc3RybmNweShvdXRmaWxlLHMsQ0tNQVhQQVRIKTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0gZWxzZSBpZiAoY21yZXN1bHQuZmNvZGUgPT0gX0NNSUZJKQorCSAgICAgIGhhdmVuYW1lID0gMTsKKwkgICAgZWxzZQorCSAgICAgIHJldHVybigtMik7CisJfQorCWlmIChoYXZlbmFtZSkgeworCSAgICBja3N0cm5jcHkobGluZSxjbXJlc3VsdC5zcmVzdWx0LExJTkJVRlNJWik7CisJICAgIHkgPSBjbXJlc3VsdC5ucmVzdWx0OworCX0gZWxzZSB7CisJICAgIGlmICgoeCA9IGNtaWZpKCJGaWxlbmFtZSIsIiIsJnMsJnkseHhzdHJpbmcpKSA8IDApIHsKKwkJaWYgKHggPT0gLTMpIHsKKwkJICAgIHByaW50ZigiP05hbWUgb2YgYW4gZXhpc3RpbmcgZmlsZSByZXF1aXJlZFxuIik7CisJCSAgICByZXR1cm4oLTkpOworCQl9IGVsc2UgcmV0dXJuKHgpOworCSAgICB9CisJICAgIGNrc3RybmNweShsaW5lLHMsTElOQlVGU0laKTsKKwl9CisJaWYgKHkgIT0gMCkgeworCSAgICBwcmludGYoIj9BIHNpbmdsZSBmaWxlIHBsZWFzZVxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorI2lmZGVmIEtVSQorCWlmICggb3V0ZmlsZVswXSAmJiBndWkgKSB7CisJICAgIHByaW50ZigiPy9HVUkgYW5kIC9PVVRQVVQgYXJlIGluY29tcGF0aWJsZVxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorI2VuZGlmIC8qIEtVSSAqLworCisJaWYgKCh5ID0gY21jZm0oKSkgPCAwKQkJLyogQ29uZmlybSB0aGUgY29tbWFuZCAqLworCSAgcmV0dXJuKHkpOworCisjaWZkZWYgVU5JQ09ERQorCWZpbGVvcmRlciA9IC0xOworCWlmIChjc2V0IDwgMCAmJiBmaWxlcGVlaykgewkvKiBJZiBubyBjaGFyc2V0IHN3aXRjaGVzIGdpdmVuICovCisJICAgIGludCBrLCB4ID0gLTE7CisJICAgIGsgPSBzY2FuZmlsZShsaW5lLCZ4LG5zY2FuZmlsZSk7IC8qIENhbGwgZmlsZSBhbmFseXplciAqLworCSAgICBkZWJ1ZyhGMTExLCJ0eXBlIHNjYW5maWxlIixsaW5lLGspOworCSAgICBkZWJ1ZyhGMTAxLCJ0eXBlIHNjYW5maWxlIGZsYWciLCIiLHgpOworCSAgICBzd2l0Y2goaykgeworCSAgICAgIGNhc2UgRlRfVVRGODoJCS8qIHdoaWNoIGNhbiBkZXRlY3QgVVRGLTguLi4gKi8KKwkJY3NldCA9IDA7CisJCWluY3MgPSBGQ19VVEY4OworCQlicmVhazsKKwkgICAgICBjYXNlIEZUX1VDUzI6CQkvKiBhbmQgVUNTLTIuLi4gKi8KKwkJY3NldCA9IDA7CisJCWluY3MgPSBGQ19VQ1MyOworCQlmaWxlb3JkZXIgPSB4OwkJLyogZXZlbiBpZiB0aGVyZSBpcyBubyBCT00uICovCisJCWRlYnVnKEYxMDEsInR5cGUgZmlsZW9yZGVyIiwiIixmaWxlb3JkZXIpOworCQlicmVhazsKKwkgICAgfQorCX0KKyNpZmRlZiBPUzIKKyAgICAgICAgaWYgKGNzZXQgPCAwKSB7CQkJLyogSWYgaW5wdXQgY2hhcnNldCBzdGlsbCBub3Qga25vd24gKi8KKyNpZmRlZiBDS09VTkkKKyAgICAgICAgICAgIHRvY3MgPSBybG9va3VwKHR4cnRhYixudHhydGFiLHRjc2wpOworI2Vsc2UgLyogQ0tPVU5JICovCisgICAgICAgICAgICBleHRlcm4gc3RydWN0IGtleXRhYiB0dGNzdGFiW107CisgICAgICAgICAgICBleHRlcm4gaW50IG50eHJ0YWI7CisgICAgICAgICAgICB0b2NzID0gcmxvb2t1cCh0dGNzdGFiLG50ZXJtYyxpbmNzKTsKKyAgICAgICAgICAgIGlmICghdG9jcykKKwkgICAgICB0b2NzID0gZ2V0ZGNzZXQoKTsKKyNlbmRpZiAvKiBDS09VTkkgKi8KKyAgICAgICAgICAgIGluY3MgPSBsb29rdXAoZmNzdGFiLHRvY3MsbmZpbGMsJngpOworICAgICAgICB9CisjZW5kaWYgLyogT1MyICovCisKKyAgICAgICAgaWYgKG91dGNzID09IDAgJiYgaW5jcyAhPSAwKSB7CS8qIFN1cHBseSBkZWZhdWx0IHRhcmdldCBjaGFyc2V0ICovCisJICAgIGludCB4ID0gMDsJCQkvKiBpZiBzd2l0Y2ggbm90IGdpdmVuLiAqLworCSAgICB0b2NzID0gZ2V0ZGNzZXQoKTsKKwkgICAgb3V0Y3MgPSBsb29rdXAoZmNzdGFiLHRvY3MsbmZpbGMsJngpOworCX0KKyNlbHNlICAvKiAhVU5JQ09ERSAqLworCWlmIChjc2V0IDwgMCkgaW5jcyA9IG91dGNzID0gMDsKKyNlbmRpZiAvKiBVTklDT0RFICovCisKKwlpZiAob3V0ZmlsZVswXSAmJiBwYWdpbmcpCS8qIFRoaXMgY29tYmluYXRpb24gbWFrZXMgbm8gc2Vuc2UgKi8KKwkgIHBhZ2luZyA9IDA7CQkJLyogc28gdHVybiBvZmYgcGFnaW5nICovCisKKyNpZmRlZiBLVUkKKwkvKiBObyBwYWdpbmcgd2hlbiBkaWFsb2cgaXMgdXNlZCAqLworCWlmICggZ3VpICYmIHBhZ2luZyApCisJICBwYWdpbmcgPSAwOworCisJaWYgKCAhZ3VpICYmIGhlaWdodCApIHsKKwkgICAgcHJpbnRmKCI/VGhlIC9IRUlHSFQgc3dpdGNoIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCAvR1VJXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisjZW5kaWYgLyogS1VJICovCisKKwlpZiAoY291bnQpIHBhZ2luZyA9IC0xOworCWRlYnVnKEYxMTEsInR5cGUiLGxpbmUscGFnaW5nKTsKKyNpZmRlZiBLVUkKKwlpZiAoIGd1aSApIHsKKwkgICAgcyA9IChjaGFyICopMTsgICAgLyogb2ssIGl0cyBhbiB1Z2x5IGhhY2sgKi8KKwkgICAgaWYgKGd1aV90ZXh0X3BvcHVwX2NyZWF0ZShndWlfdGl0bGUgPworCQkJCSAgICAgIGd1aV90aXRsZSA6IGxpbmUsIGhlaWdodCx3aWR0aCkgPCAwKSB7CisJCXByaW50ZigiPy9HVUkgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbVxuIik7CisJCWd1aSA9IDA7CisJCXJldHVybigtOSk7CisJICAgIH0KKwkgICAgd2lkdGggPSAwOworCX0gZWxzZQorI2VuZGlmIC8qIEtVSSAqLworCSAgcyA9IG91dGZpbGU7CisJc3VjY2VzcyA9CisJICBkb3R5cGUobGluZSxwYWdpbmcsMCxoZWFkLHBhdCx3aWR0aCxwcmVmaXgsaW5jcyxvdXRjcyxzLG51bWJlcik7CisJcmV0dXJuKHN1Y2Nlc3MpOworICAgIH0KKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICBpZiAoY3ggPT0gWFhYTEEpIHsJCQkvKiBUUkFOU0xBVEUgZmlsZSdzIGNoYXJzZXQgKi8KKwlfUFJPVE9UWVAgKGludCBkb3hsYXRlLCAoIHZvaWQgKSApOworCXJldHVybihkb3hsYXRlKCkpOworICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisKKyAgICBpZiAoY3ggPT0gWFhWRVIpIHsJCQkvKiBWRVJTSU9OICovCisJaW50IG4gPSAwOworCWV4dGVybiBjaGFyICogY2tfcGF0Y2gsICogY2tfc190ZXN0OworI2lmZGVmIENPTU1FTlQKKwlleHRlcm4gaW50IGhtdG9wbGluZTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKworCXByaW50ZigiXG4lcywgZm9yJXNcbiBOdW1lcmljOiAlbGQiLHZlcnNpbyxja3hzeXMsdmVybnVtKTsKKwlwcmludGYoIlxuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJBdXRob3JzOlxuIik7CisJcHJpbnRmKCIgRnJhbmsgZGEgQ3J1eiwgQ29sdW1iaWEgVW5pdmVyc2l0eVxuIik7CisgICAgICAgIHByaW50ZigiIEplZmZyZXkgRXJpYyBBbHRtYW4sIFNlY3VyZSBFbmRwb2ludHMsIEluYy4gJXNcbiIsCisJICAgICAgICI8amFsdG1hbkBzZWN1cmUtZW5kcG9pbnRzLmNvbT4iCisJICAgICAgICk7CisJcHJpbnRmKCIgQ29udHJpYnV0aW9ucyBmcm9tIG1hbnkgb3RoZXJzLlxuIik7CisJbiA9IDc7CisJaWYgKCpja19zX3Rlc3QpIHsKKwkgICAgcHJpbnRmKCJcblRISVMgSVMgQSBURVNUIFZFUlNJT04sIE5PVCBGT1IgUFJPRFVDVElPTiBVU0UuXG4iKTsKKwkgICAgbiArPSAyOworCX0KKwlpZiAoKmNrX3BhdGNoKSB7CisJICAgIHByaW50ZigiIFBhdGNoZXM6ICVzXG4iLCBja19wYXRjaCk7CisJICAgIG4rKzsKKwl9CisJcHJpbnRmKCIgVHlwZSBDT1BZUklHSFQgZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zZS5cblxuIik7CisjaWZkZWYgT1MyCisJc2hvcmVnKCk7CisjZWxzZQorI2lmZGVmIENPTU1FTlQKKwlobXRvcGxpbmUgPSBuKzE7CisJaG1zZ2EoY29weXJpZ2h0KTsKKwlobXRvcGxpbmUgPSAwOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKwlyZXR1cm4oc3VjY2VzcyA9IDEpOworICAgIH0KKworICAgIGlmIChjeCA9PSBYWENQUikgewkJCS8qIENPUFlSSUdIVCBvciBMSUNFTlNFICovCisJaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorICAgICAgICAgIHJldHVybih5KTsKKyNpZmRlZiBPUzIKKwlpZiAoaW5zZXJ2ZXIpIHsJCQkvKiBGcmVlIFdJS1NEICovCisJICAgIGV4dGVybiBjaGFyICogd2lrc2RjcHJbXTsKKwkgICAgaG1zZ2Eod2lrc2RjcHIpOworCX0gZWxzZQorI2VuZGlmIC8qIE9TMiAqLworCSAgaG1zZ2EoY29weXJpZ2h0KTsKKwlyZXR1cm4oc3VjY2VzcyA9IDEpOworICAgIH0KKworI2lmbmRlZiBNQUMJCQkJLyogT25seSBmb3IgbXVsdGl1c2VyIHN5c3RlbXMgKi8KKyNpZm5kZWYgT1MyCisjaWZuZGVmIE5PRlJJTExTCisgICAgaWYgKGN4ID09IFhYV0hPKSB7CQkJLyogV0hPICovCisJY2hhciAqd2M7CisjaWZkZWYgSUtTRAorCWlmIChpbnNlcnZlciAmJiAhRU5BQkxFRChlbl93aG8pKSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCBXSE8gY29tbWFuZCBkaXNhYmxlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBkYXRhZ2VuZXJhbAorCWlmICgoeiA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHopOworCWlmIChub3B1c2gpIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIHdobyBub3QgYWxsb3dlZFxuIik7CisJICAgIHJldHVybihzdWNjZXNzID0gMCk7CisJfQorICAgICAgICB4c3lzdGVtKFdIT0NNRCk7CisjZWxzZQorCWlmICgoeSA9IGNtdHh0KCJ1c2VyIG5hbWUiLCIiLCZzLHh4c3RyaW5nKSkgPCAwKSByZXR1cm4oeSk7CisgICAgICAgIGlmIChub3B1c2gpIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIFdITyBjb21tYW5kIGRpc2FibGVkXG4iKTsKKwkgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKwl9CisJaWYgKCEod2MgPSBnZXRlbnYoIkNLX1dITyIpKSkgd2MgPSBXSE9DTUQ7CisJaWYgKHdjKQorCSAgaWYgKChpbnQpIHN0cmxlbih3YykgPiAwKSB7CisJICAgICAgY2ttYWttc2cobGluZSxMSU5CVUZTSVosd2MsIiAiLHMsTlVMTCk7CisJICAgICAgeHN5c3RlbShsaW5lKTsKKwkgIH0KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworCXJldHVybihzdWNjZXNzID0gMSk7CisgICAgfQorI2VuZGlmIC8qIE5PRlJJTExTICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTUFDICovCisKKyNpZm5kZWYgTk9GUklMTFMKKyAgICBpZiAoY3ggPT0gWFhXUkkgfHwgY3ggPT0gWFhXUkwgfHwgY3ggPT0gWFhXUkJMKSB7IC8qIFdSSVRFICovCisJaW50IHgseTsJCQkvKiBPbiBzdGFjayBpbiBjYXNlIG9mIFxmZXhlYygpICovCisJaWYgKCh4ID0gY21rZXkod3JpdGFiLG53cmksInRvIGZpbGUgb3IgbG9nIiwiIix4eHN0cmluZykpIDwgMCkgeworCSAgICBpZiAoeCA9PSAtMykgcHJpbnRmKCI/V3JpdGUgdG8gd2hhdD9cbiIpOworCSAgICByZXR1cm4oeCk7CisJfQorCWlmICgoeSA9IGNtdHh0KCJ0ZXh0IiwiIiwmcyx4eHN0cmluZykpIDwgMCkgcmV0dXJuKHkpOworCXMgPSBicnN0cmlwKHMpOworCXN3aXRjaCAoeCkgeworCSAgY2FzZSBMT0dEOiB5ID0gWkRGSUxFOyBicmVhazsKKwkgIGNhc2UgTE9HUDogeSA9IFpQRklMRTsgYnJlYWs7CisjaWZuZGVmIE5PTE9DQUwKKwkgIGNhc2UgTE9HUzogeSA9IFpTRklMRTsgYnJlYWs7CisjZW5kaWYgLyogTk9MT0NBTCAqLworCSAgY2FzZSBMT0dUOiB5ID0gWlRGSUxFOyBicmVhazsKKyNpZm5kZWYgTk9TUEwKKwkgIGNhc2UgTE9HVzogeSA9IFpXRklMRTsgYnJlYWs7CisjZW5kaWYgLyogTk9TUEwgKi8KKwkgIGNhc2UgTE9HWDoJCQkvKiBTQ1JFRU4gKHN0ZG91dCkgKi8KKwkgIGNhc2UgTE9HRToJCQkvKiBFUlJPUiAgKHN0ZGVycikgKi8KKwkgICAgaWYgKHggPT0gTE9HRSkgeworCQlkZWJ1ZyhGMTEwLAorCQkgICAgICAoY3ggPT0gWFhXUkwpID8gIldSSVRFTE4gRVJST1IiIDogIldSSVRFIEVSUk9SIiwgcywwKTsKKwkJZnByaW50ZihzdGRlcnIsIiVzJXMiLHMsKGN4ID09IFhYV1JMKSA/ICJcbiIgOiAiIik7CisJICAgIH0gZWxzZSB7CisJCWRlYnVnKEYxMTAsCisJCSAgICAgIChjeCA9PSBYWFdSTCkgPyAiV1JJVEVMTiBTQ1JFRU4iIDogIldSSVRFIFNDUkVFTiIsIHMsMCk7CisJCXByaW50ZigiJXMlcyIscywoY3ggPT0gWFhXUkwpID8gIlxuIiA6ICIiKTsKKwkgICAgfQorCSAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworCSAgZGVmYXVsdDogcmV0dXJuKC0yKTsKKwl9CisJaWYgKGNoa2ZuKHkpID4gMCkgeworCSAgICB4ID0gKGN4ID09IFhYV1JJKSA/IHpzb3V0KHkscykgOiB6c291dGwoeSxzKTsKKwkgICAgaWYgKHggPCAwKSBwcmludGYoIj9Xcml0ZSBlcnJvclxuIik7CisJfSBlbHNlIHsKKwkgICAgeCA9IC0xOworCSAgICBwcmludGYoIj9GaWxlIG9yIGxvZyBub3Qgb3BlblxuIik7CisJfQorCXJldHVybihzdWNjZXNzID0gKHggPT0gMCkgPyAxIDogMCk7CisgICAgfQorI2VuZGlmIC8qIE5PRlJJTExTICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgaWYgKGN4ID09IFhYQVNDIHx8IGN4ID09IFhYQklOKSB7CisJaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisjaWZkZWYgTkVXRlRQCisJaWYgKChmdHBnZXQgPT0gMSkgfHwgKChmdHBnZXQgPT0gMikgJiYgZnRwaXNvcGVuKCkpKQorCSAgcmV0dXJuKHN1Y2Nlc3MgPSBkb2Z0cHR5cCgoY3ggPT0gWFhBU0MpID8gMCA6IDEpKTsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKwliaW5hcnkgPSAoY3ggPT0gWFhBU0MpID8gWFlGVF9UIDogWFlGVF9COworCXJldHVybihzdWNjZXNzID0gMSk7CisgICAgfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisgICAgaWYgKGN4ID09IFhYQ0xTKSB7CisJaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisJeSA9IGNrX2NscygpOworCXJldHVybihzdWNjZXNzID0gKHkgPiAtMSkgPyAxIDogMCk7CisgICAgfQorCisjaWZkZWYgQ0tfTUtESVIKKyAgICBpZiAoY3ggPT0gWFhNS0RJUiB8fCBjeCA9PSBYWExNS0QpIHsKKwljaGFyICpwOworI2lmZGVmIExPQ1VTCisJaWYgKCFsb2N1cyAmJiBjeCAhPSBYWExNS0QpIHsKKyNpZmRlZiBOT1hGRVIKKwkgICAgcmV0dXJuKC0yKTsKKyNlbHNlCisJICAgIHJldHVybihkb3JtdChYWk1LRCkpOworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgICAgICB9CisjZW5kaWYgLyogTE9DVVMgKi8KKyNpZmRlZiBJS1NECisJaWYgKGluc2VydmVyICYmICFFTkFCTEVEKGVuX21rZCkpIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIGRpcmVjdG9yeSBjcmVhdGlvbiBpcyBkaXNhYmxlZFxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorI2VuZGlmIC8qIElLU0QgKi8KKwlpZiAoKHggPSBjbWZsZCgiTmFtZSBmb3IgbmV3IGRpcmVjdG9yeSIsIiIsJnMseHhzdHJpbmcpKSA8IDApIHsKKwkgICAgaWYgKHggIT0gLTMpIHsKKwkJcmV0dXJuKHgpOworCSAgICB9IGVsc2UgeworCQlwcmludGYoIj9EaXJlY3RvcnkgbmFtZSByZXF1aXJlZFxuIik7CisJCXJldHVybigtOSk7CisJICAgIH0KKwl9CisJY2tzdHJuY3B5KGxpbmUscyxMSU5CVUZTSVopOworCXMgPSBsaW5lOworCWlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworCXMgPSBicnN0cmlwKHMpOworCWJnY2hrKCk7CQkJLyogU2V0IG1zZ2ZsZyAqLworCXggPSBja21rZGlyKDAscywmcCxtc2dmbGcsMCk7CisjaWZkZWYgQ09NTUVOVAorCWlmIChtc2dmbGcgJiYgeCA9PSAwKQorCSAgcHJpbnRmKCI/RGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzXG4iKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisJcmV0dXJuKHN1Y2Nlc3MgPSAoeCA8IDApID8gMCA6IDEpOworICAgIH0KKyAgICBpZiAoY3ggPT0gWFhSTURJUiB8fCBjeCA9PSBYWExSTUQpIHsgLyogUk1ESVIgKi8KKwljaGFyICpwOworI2lmZGVmIExPQ1VTCisJaWYgKCFsb2N1cyAmJiBjeCAhPSBYWExSTUQpIHsKKyNpZmRlZiBOT1hGRVIKKwkgICAgcmV0dXJuKC0yKTsKKyNlbHNlCisJICAgIHJldHVybihkb3JtdChYWlJNRCkpOworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgICAgICB9CisjZW5kaWYgLyogTE9DVVMgKi8KKyNpZmRlZiBJS1NECisJaWYgKGluc2VydmVyICYmICFFTkFCTEVEKGVuX3JtZCkpIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIGRpcmVjdG9yeSByZW1vdmFsIGlzIGRpc2FibGVkXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisjZW5kaWYgLyogSUtTRCAqLworCWlmICgoeCA9IGNtZGlyKCJOYW1lIG9mIGRpcmVjdG9yeSB0byBiZSByZW1vdmVkIiwiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih4KTsKKwlja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisJcyA9IGxpbmU7CisJaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisJcyA9IGJyc3RyaXAocyk7CisJeCA9IGNrbWtkaXIoMSxzLCZwLG1zZ2ZsZywwKTsKKwlyZXR1cm4oc3VjY2VzcyA9ICh4IDwgMCkgPyAwIDogMSk7CisgICAgfQorI2VuZGlmIC8qIENLX01LRElSICovCisKKyNpZmRlZiBUTkNPREUKKyAgICBpZiAoY3ggPT0gWFhURUxPUCkKKyAgICAgIHJldHVybihkb3RlbG9wdCgpKTsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKworI2lmbmRlZiBOT1BVU0gKKyAgICBpZiAoY3ggPT0gWFhOUFNIKSB7CisJaWYgKCh6ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeik7CisgICAgICAgIG5vcHVzaCA9IDE7CisjaWZuZGVmIE5PU0VSVkVSCisgICAgICAgIGVuX2hvcyA9IDA7CisjZW5kaWYgLyogTk9TRVJWRVIgKi8KKyNpZmRlZiBQSVBFU0VORAorCXVzZXBpcGVzID0gMDsKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworICAgICAgICByZXR1cm4oc3VjY2VzcyA9IDEpOworICAgIH0KKyNlbmRpZiAvKiBOT1BVU0ggKi8KKworI2lmZGVmIE9TMgorICAgIGlmIChjeCA9PSBYWE5TQ1IpIHsKKwlpZiAoKHogPSBjbWNmbSgpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgdHRfc2Nyb2xsID0gMDsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgTk9TUEwKKyAgICBpZiAoY3ggPT0gWFhMT0NBTCkJCQkvKiBMT0NBTCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgKi8KKyAgICAgIHJldHVybihzdWNjZXNzID0gZG9sb2NhbCgpKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgaWYgKGN4ID09IFhYS0VSTUkpIHsJCS8qIFRoZSBLRVJNSVQgY29tbWFuZCAqLworCWNoYXIgKiBsaXN0WzY1XTsKKwlleHRlcm4gY2hhciAqKnhhcmd2OworCWV4dGVybiBpbnQgeGFyZ2M7CisJaW50IGk7CisJaWYgKCh5ID0gY210eHQoImtlcm1pdCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCAtaCBmb3IgaGVscCIsCisJCSAgICAgICAiIiwmcyx4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih5KTsKKwlja3N0cm5jcHkobGluZSwia2VybWl0ICIsTElOQlVGU0laKTsKKwlja3N0cm5jYXQobGluZSxzLExJTkJVRlNJWi04KTsKKwl4d29yZHMobGluZSw2NCxsaXN0LDApOworCWZvciAoaSA9IDE7IGkgPCA2NDsgaSsrKSB7CisJICAgIGlmICghbGlzdFtpXSkKKwkgICAgICBicmVhazsKKwl9CisJaS0tOworCXhhcmdjID0gaTsKKwl4YXJndiA9IGxpc3Q7CisJeGFyZ3YrKzsKKwlzc3RhdGUgPSBjbWRsaW4oKTsKKwlpZiAoc3N0YXRlKSB7CisJICAgIGV4dGVybiBpbnQganVzdG9uZTsKKwkgICAgZGVidWcoRjAwMCwiS0VSTUlUIHNzdGF0ZSIsIiIsc3N0YXRlKTsKKwkgICAganVzdG9uZSA9IDE7CQkvKiBGb3JjZSByZXR1cm4gdG8gY29tbWFuZCBtb2RlICovCisJICAgIHByb3RvKCk7CQkJLyogYWZ0ZXIgcHJvdG9jb2wgKi8KKwkgICAgcmV0dXJuKHN1Y2Nlc3MpOworCX0gZWxzZSB7CisJICAgIGRlYnVnKEYxMDEsIktFUk1JVCBzc3RhdGUiLCIiLHNzdGF0ZSk7CisJICAgIHJldHVybihzdWNjZXNzID0gMSk7CS8qIE5vdCBleGFjdGx5IHJpZ2h0LCBidXQuLi4gKi8KKwl9CisgICAgfQorICAgIGlmIChjeCA9PSBYWERBVEUpIHsJCQkvKiBEQVRFIGNvbW1hbmQgKi8KKwlleHRlcm4gY2hhciBjbWRhdGVidWZbXSwgKiBjbWRhdGVtc2c7CisKKyNpZm5kZWYgQ09NTUVOVAorCWNoYXIgKiBkcDsKKwlpZiAoKHkgPSBjbXR4dCgiZGF0ZSBhbmQvb3IgdGltZSwgb3IgY2FycmlhZ2UgcmV0dXJuIGZvciBjdXJyZW50IiwKKwkJICAgICAgICIiLCZzLHh4c3RyaW5nKSkgPCAwKQorCSAgcmV0dXJuKHkpOworCXMgPSBicnN0cmlwKHMpOworCWRwID0gY21jdnRkYXRlKHMsMSk7CisJaWYgKCFkcCkgeworCSAgICBwcmludGYoIj8lc1xuIixjbWRhdGVtc2cgPyBjbWRhdGVtc2cgOiAiRGF0ZSBjb252ZXJzaW9uIGVycm9yIik7CisJICAgIHN1Y2Nlc3MgPSAwOworCX0gZWxzZSB7CisJICAgIHByaW50ZigiJXNcbiIsZHApOworCSAgICBzdWNjZXNzID0gMTsKKwl9CisjZWxzZQorCS8qIFRoaXMgd29ya3MgZmluZSBidXQgbWVzc2VzIHVwIG15ICJkYXRlcyIgdG9ydHVyZS10ZXN0IHNjcmlwdCAqLworCisJaWYgKCh4ID0gY21kYXRlKCJEYXRlIGFuZC9vciB0aW1lLCBvciBjYXJyaWFnZSByZXR1cm4gZm9yIGN1cnJlbnQiLAorCQkJIiIsJnMsMCx4eHN0cmluZykpIDwgMCkgeworCSAgICByZXR1cm4oeCk7CisJfSBlbHNlIHsKKwkgICAgcHJpbnRmKCIlc1xuIixjbWRhdGVidWYpOworCSAgICBzdWNjZXNzID0gMTsKKwl9CisjZW5kaWYgLyogQ09NTUVOVCAqLworCXJldHVybihzdWNjZXNzKTsKKyAgICB9CisjaWZuZGVmIE5PUFVTSAorI2lmbmRlZiBOT0ZSSUxMUworICAgIGlmIChjeCA9PSBYWEVESVQpCisgICAgICByZXR1cm4oZG9lZGl0KCkpOworI2VuZGlmIC8qIE5PRlJJTExTICovCisjZW5kaWYgLyogTk9QVVNIICovCisKKyNpZmRlZiBCUk9XU0VSCQkJCS8qIERlZmluZWQgb25seSBpZm5kZWYgTk9QVVNIICovCisgICAgaWYgKGN4ID09IFhYQlJPV1MpCisgICAgICByZXR1cm4oZG9icm93c2UoKSk7CisjZW5kaWYgLyogQlJPV1NFUiAqLworCisjaWZkZWYgQ0tfVEFQSQorICAgIGlmIChjeCA9PSBYWFRBUEkpIHsJCQkvKiBNaWNyb3NvZnQgVEFQSSAqLworCXJldHVybiAoc3VjY2VzcyA9IGRvdGFwaSgpKTsKKyAgICB9CisjZW5kaWYgLyogQ0tfVEFQSSAqLworCisjaWZuZGVmIE5PWEZFUgorICAgIGlmIChjeCA9PSBYWFdIRVJFKSB7CisJZXh0ZXJuIGNoYXIgKiByZnNwZWMsICogc2ZzcGVjLCAqIHNyZnNwZWMsICogcnJmc3BlYzsKKwlpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKwlwcmludGYoIlxuRmlsZSBtb3N0IHJlY2VudGx5Li4uXG5cbiIpOworCXByaW50ZigiICBTZW50OiAgICAgICAlc1xuIiwgICBzZnNwZWMgPyBzZnNwZWMgOiAiKG5vbmUpIik7CisJaWYgKHNmc3BlYyAmJiBzcmZzcGVjKSB7CisJICAgIHByaW50ZigiICBTdG9yZWQgYXM6ICAlc1xuIiwgICBzcmZzcGVjKTsKKwkgICAgcHJpbnRmKCJcbiIpOworCX0KKwlwcmludGYoIiAgUmVjZWl2ZWQ6ICAgJXNcbiIsICAgcnJmc3BlYyA/IHJyZnNwZWMgOiAiKG5vbmUpIik7CisJaWYgKHJmc3BlYyAmJiBycmZzcGVjKQorCXByaW50ZigiICBTdG9yZWQgYXM6ICAlc1xuIiwgICByZnNwZWMpOworCXByaW50ZigKKyJcbklmIHRoZSBmdWxsIHBhdGggaXMgbm90IHNob3duLCB0aGVuIHRoZSBmaWxlIGlzIHByb2JhYmx5IGluIHlvdXIgY3VycmVudFxuIgorCSAgICAgICApOworCXByaW50ZigKKyJkaXJlY3Rvcnkgb3IgeW91ciBkb3dubG9hZCBkaXJlY3RvcnkgKGlmIGFueSAtIFNIT1cgRklMRSB0byBmaW5kIG91dCkuXG5cbiIKKwkgICAgICAgKTsKKwlyZXR1cm4oc3VjY2VzcyA9IDEpOworICAgIH0KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmZGVmIENLX1JFQ0FMTAorICAgIGlmIChjeCA9PSBYWFJFRE8pCisgICAgICByZXR1cm4oZG9yZWRvKCkpOworI2VuZGlmIC8qIENLX1JFQ0FMTCAqLworCisjaWZkZWYgQ0tST09UCisgICAgaWYgKGN4ID09IFhYQ0hSVCkJCQkvKiBDaGFuZ2UgS2VybWl0J3Mgcm9vdCBkaXJlY3RvcnkgKi8KKyAgICAgIHJldHVybihkb2Nocm9vdCgpKTsKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworI2lmZGVmIENLX0tFUkJFUk9TCisgICAgaWYgKGN4ID09IFhYQVVUSCkgewkJCS8qIEtFUkJFUk9TICovCisJeCA9IGNwX2F1dGgoKTsJCQkvKiBQYXJzZSBpdCAqLworI2lmZGVmIElLU0QKKyAgICAgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgICAgICBwcmludGYoIj9Db21tYW5kIGRpc2FibGVkIGluIElLU0QuXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElLU0QgKi8KKwlpZiAoeCA8IDApCQkJLyogUGFzcyBwYXJzZSBlcnJvcnMgYmFjayAqLworCSAgcmV0dXJuKHgpOworCXJldHVybihzdWNjZXNzID0gZG9hdXRoKGN4KSk7CisgICAgfQorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKyNpZm5kZWYgTk9MT0NBTAorICAgIGlmIChjeCA9PSBYWFRFUk0pIHsKKwlyZXR1cm4oc2V0dHJtdHlwKCkpOworICAgIH0KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKyAgICBpZiAoY3ggPT0gWFhTVEFUVVMpIHsKKwlpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKwlwcmludGYoICIgJXNcbiIsIHN1Y2Nlc3MgPyAiU1VDQ0VTUyIgOiAiRkFJTFVSRSIgKTsKKwlyZXR1cm4oMCk7CQkJLyogRG9uJ3QgY2hhbmdlIGl0ICovCisgICAgfQorCisgICAgaWYgKGN4ID09IFhYRkFJTCkgeworCWlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworCXJldHVybihzdWNjZXNzID0gMCk7CisgICAgfQorCisgICAgaWYgKGN4ID09IFhYU1VDQykgeworCWlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworCXJldHVybihzdWNjZXNzID0gMSk7CisgICAgfQorCisgICAgaWYgKGN4ID09IFhYTkxDTCkgeworCWV4dGVybiBpbnQgbm9sb2NhbDsKKwlpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKwlub2xvY2FsID0gMTsKKwlyZXR1cm4oc3VjY2VzcyA9IDEpOworICAgIH0KKworI2lmbmRlZiBOT1hGRVIKKyAgICBpZiAoY3ggPT0gWFhSQVNHKQkJCS8qIFNob3J0Y3V0cyBmb3IgUkVNT1RFIGNvbW1hbmRzICovCisgICAgICByZXR1cm4oZG9ybXQoWFpBU0cpKTsKKyAgICBpZiAoY3ggPT0gWFhSQ1dEKQorICAgICAgcmV0dXJuKGRvcm10KFhaQ1dEKSk7CisgICAgaWYgKGN4ID09IFhYUkNQWSkKKyAgICAgIHJldHVybihkb3JtdChYWkNQWSkpOworICAgIGlmIChjeCA9PSBYWFJERUwpCisgICAgICByZXR1cm4oZG9ybXQoWFpERUwpKTsKKyAgICBpZiAoY3ggPT0gWFhSRElSKQorICAgICAgcmV0dXJuKGRvcm10KFhaRElSKSk7CisgICAgaWYgKGN4ID09IFhYUlhJVCkKKyAgICAgIHJldHVybihkb3JtdChYWlhJVCkpOworICAgIGlmIChjeCA9PSBYWFJITFApCisgICAgICByZXR1cm4oZG9ybXQoWFpITFApKTsKKyAgICBpZiAoY3ggPT0gWFhSSE9TKQorICAgICAgcmV0dXJuKGRvcm10KFhaSE9TKSk7CisgICAgaWYgKGN4ID09IFhYUktFUikKKyAgICAgIHJldHVybihkb3JtdChYWktFUikpOworICAgIGlmIChjeCA9PSBYWFJQV0QpCisgICAgICByZXR1cm4oZG9ybXQoWFpQV0QpKTsKKyAgICBpZiAoY3ggPT0gWFhSUVVFKQorICAgICAgcmV0dXJuKGRvcm10KFhaUVVFKSk7CisgICAgaWYgKGN4ID09IFhYUlJFTikKKyAgICAgIHJldHVybihkb3JtdChYWlJFTikpOworICAgIGlmIChjeCA9PSBYWFJNS0QpCisgICAgICByZXR1cm4oZG9ybXQoWFpNS0QpKTsKKyAgICBpZiAoY3ggPT0gWFhSUk1EKQorICAgICAgcmV0dXJuKGRvcm10KFhaUk1EKSk7CisgICAgaWYgKGN4ID09IFhYUlNFVCkKKyAgICAgIHJldHVybihkb3JtdChYWlNFVCkpOworICAgIGlmIChjeCA9PSBYWFJTUEEpCisgICAgICByZXR1cm4oZG9ybXQoWFpTUEEpKTsKKyAgICBpZiAoY3ggPT0gWFhSVFlQKQorICAgICAgcmV0dXJuKGRvcm10KFhaVFlQKSk7CisgICAgaWYgKGN4ID09IFhYUldITykKKyAgICAgIHJldHVybihkb3JtdChYWldITykpOworICAgIGlmIChjeCA9PSBYWFJDRFVQKQorICAgICAgcmV0dXJuKGRvcm10KFhaQ0RVKSk7CisgICAgaWYgKGN4ID09IFhYUlBSSSkKKyAgICAgIHJldHVybihkb3JtdChYWlBSSSkpOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisgICAgaWYgKGN4ID09IFhYUkVTRVQpIHsJCS8qIFJFU0VUICovCisJaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorCSAgcmV0dXJuKHgpOworCWRvY2xlYW4oMCk7CQkJLyogQ2xvc2UgYWxsIGZpbGVzICovCisJcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisKKyNpZm5kZWYgTk9YRkVSCisjaWZuZGVmIE5PQ1NFVFMKKyAgICBpZiAoY3ggPT0gWFhBU1NPQykJCQkvKiBBU1NPQ0lBVEUgKi8KKyAgICAgIHJldHVybihkb2Fzc29jKCkpOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIGlmIChjeCA9PSBYWFNISUZUKSB7CQkvKiBTSElGVCAqLworCWlmICgoeSA9IGNtbnVtKCJOdW1iZXIgb2YgYXJndW1lbnRzIHRvIHNoaWZ0IiwiMSIsMTAsJngseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeSk7CisJaWYgKCh6ID0gY21jZm0oKSkgPCAwKQorCSAgcmV0dXJuKHopOworCXJldHVybihzdWNjZXNzID0gZG9zaGlmdCh4KSk7CisgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9IRUxQCisgICAgaWYgKGN4ID09IFhYTUFOKQorICAgICAgcmV0dXJuKGRvbWFudWFsKCkpOworI2VuZGlmIC8qIE5PSEVMUCAqLworCisjaWZuZGVmIE5PU1BMCisgICAgaWYgKGN4ID09IFhYU09SVCkJCQkvKiBTT1JUIGFuIGFycmF5ICovCisgICAgICByZXR1cm4oZG9zb3J0KCkpOworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICBpZiAoY3ggPT0gWFhQVVJHRSkgeworI2lmZGVmIElLU0QKKwlpZiAoaW5zZXJ2ZXIgJiYgKCFFTkFCTEVEKGVuX2RlbCkKKyNpZmRlZiBDS19MT0dJTgorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc2d1ZXN0CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKwkJCSApKSB7CisJICAgIHByaW50ZigiP1NvcnJ5LCBERUxFVEUgaXMgZGlzYWJsZWRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKyNlbmRpZiAvKiBJS1NEICovCisjaWZkZWYgQ0tfQVBDCisJaWYgKChhcGNhY3RpdmUgPT0gQVBDX0xPQ0FMKSB8fAorCSAgICAoKGFwY2FjdGl2ZSA9PSBBUENfUkVNT1RFKSAmJiAoIShhcGNzdGF0dXMgJiBBUENfVU5DSCkpKSkKKwkgIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogQ0tfQVBDICovCisjaWZkZWYgQ0tQVVJHRQorICAgICAgICByZXR1cm4oZG9wdXJnZSgpKTsKKyNlbHNlCisjaWZkZWYgVk1TCisJaWYgKCh4ID0gY210eHQoIm9wdGlvbmFsIHN3aXRjaGVzIGZvbGxvd2VkIGJ5IGZpbGVzcGVjIiwKKwkJICAgICAgICIiLCZzLHh4c3RyaW5nKSkgPCAwKQorCSAgcmV0dXJuKHgpOworCWlmIChub3B1c2gpIHsKKwkgICAgcHJpbnRmKCI/U29ycnksIERDTCBhY2Nlc3MgaXMgZGlzYWJsZWRcbiIpOworCSAgICByZXR1cm4oLTkpOworCX0KKwlja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7CisJcyA9IGxpbmU7CisJeCA9IG1sb29rKG1hY3RhYiwicHVyZ2UiLG5tYWMpOworCXJldHVybihzdWNjZXNzID0gZG9kbyh4LHMsY21kc3RrW2NtZGx2bF0uY2NmbGdzKSk7CisjZWxzZQorCXJldHVybigtMik7CisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogQ0tQVVJHRSAqLworICAgIH0KKworI2lmbmRlZiBOT1NQTAorICAgIGlmIChjeCA9PSBYWEZBU1QpIHsKKwlpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKwl4ID0gbWxvb2sobWFjdGFiLCJmYXN0IixubWFjKTsKKwlyZXR1cm4oc3VjY2VzcyA9IGRvZG8oeCxOVUxMLGNtZHN0a1tjbWRsdmxdLmNjZmxncykpOworICAgIH0KKyAgICBpZiAoY3ggPT0gWFhDQVUpIHsKKwlpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKwl4ID0gbWxvb2sobWFjdGFiLCJjYXV0aW91cyIsbm1hYyk7CisJcmV0dXJuKHN1Y2Nlc3MgPSBkb2RvKHgsTlVMTCxjbWRzdGtbY21kbHZsXS5jY2ZsZ3MpKTsKKyAgICB9CisgICAgaWYgKGN4ID09IFhYUk9CKSB7CisJaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisJeCA9IG1sb29rKG1hY3RhYiwicm9idXN0IixubWFjKTsKKwlyZXR1cm4oc3VjY2VzcyA9IGRvZG8oeCxOVUxMLGNtZHN0a1tjbWRsdmxdLmNjZmxncykpOworICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworCisgICAgaWYgKGN4ID09IFhYU0NSTikgewkJCS8qIFNDUkVFTiAqLworCWludCByb3csIGNvbDsKKwlpZiAoKHggPSBjbWtleShzY250YWIsIG5zY250YWIsInNjcmVlbiBhY3Rpb24iLCIiLCB4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih4KTsKKwlzd2l0Y2ggKHgpIHsJCQkvKiBNT1ZFLVRPIChjdXJzb3IgcG9zaXRpb24pICovCisJICBjYXNlIFNDTl9NT1Y6CisJICAgIGlmICgoeSA9IGNtbnVtKCJSb3cgKDEtYmFzZWQpIiwiIiwxMCwmeix4eHN0cmluZykpIDwgMCkKKwkgICAgICByZXR1cm4oeSk7CisJICAgIHJvdyA9IHo7CisJICAgIHkgPSBjbW51bSgiQ29sdW1uICgxLWJhc2VkKSIsIjEiLDEwLCZ6LHh4c3RyaW5nKTsKKwkgICAgaWYgKHkgPCAwKQorCSAgICAgIHJldHVybih5KTsKKwkgICAgY29sID0gejsKKwkgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorCSAgICAgIHJldHVybih5KTsKKwkgICAgaWYgKHJvdyA8IDAgfHwgY29sIDwgMCkgeworCQlwcmludGYoIj9Sb3cgYW5kIENvbHVtbiBtdXN0IGJlIDEgb3IgZ3JlYXRlclxuIik7CisJCXJldHVybigtOSk7CisJICAgIH0KKwkgICAgaWYgKGNtZF9yb3dzID4gMCAmJiByb3cgPiBjbWRfcm93cykKKwkgICAgICByb3cgPSBjbWRfcm93czsKKwkgICAgaWYgKGNtZF9jb2xzID4gMCAmJiBjb2wgPiBjbWRfY29scykKKwkgICAgICBjb2wgPSBjbWRfY29sczsKKwkgICAgeSA9IGNrX2N1cnBvcyhyb3csY29sKTsKKwkgICAgcmV0dXJuKHN1Y2Nlc3MgPSAoeSA+IC0xKSA/IDEgOiAwKTsKKworCSAgY2FzZSBTQ05fQ0xSOgkJCS8qIENMRUFSICovCisJICAgIGlmICgoeSA9IGNtY2ZtKCkpIDwgMCkKKwkgICAgICByZXR1cm4oeSk7CisJICAgIGRlYnVnKEYxMDAsInNjcmVlbiBjYWxsaW5nIGNrX2NscygpIiwiIiwwKTsKKwkgICAgeSA9IGNrX2NscygpOworCSAgICByZXR1cm4oc3VjY2VzcyA9ICh5ID4gLTEpID8gMSA6IDApOworCisJICBjYXNlIFNDTl9DTEU6CQkJLyogQ0xFT0wgKi8KKwkgICAgaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorCSAgICAgIHJldHVybih5KTsKKwkgICAgeSA9IGNrX2NsZW9sKCk7CisJICAgIHJldHVybihzdWNjZXNzID0gKHkgPiAtMSkgPyAxIDogMCk7CisJfQorICAgIH0KKworI2lmbmRlZiBOT0hUVFAKKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICBpZiAoY3ggPT0gWFhIVFRQKQorICAgICAgcmV0dXJuKGRvaHR0cCgpKTsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNlbmRpZiAvKiBOT0hUVFAgKi8KKworI2lmbmRlZiBOT1NQTAorICAgIGlmIChjeCA9PSBYWEFSUkFZKSB7CQkvKiBBUlJBWSAqLworI2lmbmRlZiBOT1NIT1cKKwlleHRlcm4gaW50IHNob3dhcnJheSgpOworI2VuZGlmIC8qIE5PU0hPVyAqLworCWlmICgoeCA9IGNta2V5KGFycmF5dGFiLCBuYXJyYXl0YWIsIkFycmF5IG9wZXJhdGlvbiIsIiIseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeCk7CisJc3dpdGNoICh4KSB7CisJICBjYXNlIEFSUl9EQ0w6CisJICAgIHJldHVybihkb2RjbChYWERDTCkpOworCSAgY2FzZSBBUlJfU1JUOgorCSAgICByZXR1cm4oZG9zb3J0KCkpOworI2lmbmRlZiBOT1NIT1cKKwkgIGNhc2UgQVJSX1NITzoKKwkgICAgcmV0dXJuKHNob3dhcnJheSgpKTsKKyNlbmRpZiAvKiBOT1NIT1cgKi8KKwkgIGNhc2UgQVJSX0NQWToKKwkgICAgcmV0dXJuKGNvcHlhcnJheSgpKTsKKwkgIGNhc2UgQVJSX1NFVDoKKwkgIGNhc2UgQVJSX0NMUjoKKwkgICAgcmV0dXJuKGNscmFycmF5KHgpKTsKKwkgIGNhc2UgQVJSX0RTVDoKKwkgICAgcmV0dXJuKHVuYXJyYXkoKSk7CisJICBjYXNlIEFSUl9SU1o6CisJICAgIHJldHVybihyc3phcnJheSgpKTsKKwkgIGNhc2UgQVJSX0VRVToKKwkgICAgcmV0dXJuKGxpbmthcnJheSgpKTsKKworCSAgZGVmYXVsdDoKKwkgICAgcHJpbnRmKCI/U29ycnksIG5vdCBpbXBsZW1lbnRlZCB5ZXQgLSBcIiVzXCJcbiIsY21kYnVmKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisgICAgfQorICAgIGlmIChjeCA9PSBYWFRSQUNFKQorICAgICAgcmV0dXJuKGRvdHJhY2UoKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIENLX1BFUk1TCisjaWZkZWYgVU5JWAorICAgIGlmIChjeCA9PSBYWENITU9EKQorICAgICAgcmV0dXJuKGRvdWNobW9kKCkpOwkJLyogRG8gVW5peCBjaG1vZCAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBDS19QRVJNUyAqLworCisgICAgaWYgKGN4ID09IFhYUFJPTVApCisgICAgICByZXR1cm4oZG9wcm9tcHQoKSk7CisKKyAgICBpZiAoY3ggPT0gWFhHUkVQKQorICAgICAgcmV0dXJuKGRvZ3JlcCgpKTsKKworICAgIGlmIChjeCA9PSBYWERFQlVHKSB7CQkvKiBERUJVRyAqLworI2lmbmRlZiBERUJVRworCWludCBkdW1teSA9IDA7CisJcmV0dXJuKHNldG9uKCZkdW1teSkpOworI2Vsc2UKKwlyZXR1cm4oc2V0b24oJmRlYmxvZykpOworI2VuZGlmIC8qIERFQlVHICovCisgICAgfQorCisjaWZkZWYgQ0tMRUFSTgorICAgIGlmIChjeCA9PSBYWExFQVJOKSB7CQkvKiBMRUFSTiAqLworCXN0cnVjdCBGREIgb2YsIHN3LCBjbTsKKwlpbnQgY2xvc2luZyA9IDAsIG9mZiA9IDAsIG9uID0gMCwgY29uZmlybWVkID0gMDsKKwljaGFyIGM7CisKKwljbWZkYmkoJnN3LAkJCS8qIDJuZCBGREIgLSBvcHRpb25hbCAvUEFHRSBzd2l0Y2ggKi8KKwkgICAgICAgX0NNS0VZLAkJCS8qIGZjb2RlICovCisJICAgICAgICJTY3JpcHQgZmlsZSBuYW1lLCBvciBzd2l0Y2giLCAvKiBobHBtc2cgKi8KKwkgICAgICAgIiIsCQkJLyogZGVmYXVsdCAqLworCSAgICAgICAiIiwJCQkvKiBhZGR0bCBzdHJpbmcgZGF0YSAqLworCSAgICAgICAzLAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAxOiB0Ymwgc2l6ZSAqLworCSAgICAgICA0LAkJCS8qIGFkZHRsIG51bWVyaWMgZGF0YSAyOiA0ID0gY21zd2kgKi8KKwkgICAgICAgeHhzdHJpbmcsCQkvKiBQcm9jZXNzaW5nIGZ1bmN0aW9uICovCisJICAgICAgIGxlYXJuc3dpLAkJLyogS2V5d29yZCB0YWJsZSAqLworCSAgICAgICAmb2YJCQkvKiBQb2ludGVyIHRvIG5leHQgRkRCICovCisJICAgICAgICk7CisJY21mZGJpKCZvZixfQ01PRkksIiIsIiIsIiIsMCwwLHh4c3RyaW5nLE5VTEwsJmNtKTsKKwljbWZkYmkoJmNtLF9DTUNGTSwiIiwiIiwiIiwwLDAsTlVMTCxOVUxMLE5VTEwpOworCWxpbmVbMF0gPSBOVUw7CisKKwl3aGlsZSAoIWNvbmZpcm1lZCkgeworCSAgICB4ID0gY21mZGIoJnN3KTsJCS8qIFBhcnNlIHNvbWV0aGluZyAqLworCSAgICBpZiAoeCA8IDApCisJICAgICAgcmV0dXJuKHgpOworCSAgICBzd2l0Y2ggKGNtcmVzdWx0LmZjb2RlKSB7CS8qIFdoYXQgd2FzIGl0PyAqLworCSAgICAgIGNhc2UgX0NNT0ZJOgkJLyogT3V0cHV0IGZpbGUgbmFtZSAqLworCQlja3N0cm5jcHkobGluZSxjbXJlc3VsdC5zcmVzdWx0LExJTkJVRlNJWik7CisJCWJyZWFrOworCSAgICAgIGNhc2UgX0NNS0VZOgkJLyogU3dpdGNoICovCisJCWMgPSBjbWdicmsoKTsKKwkJaWYgKChjID09ICc6JyB8fCBjID09ICc9JykgJiYgIShjbWdrd2ZsZ3MoKSAmIENNX0FSRykpIHsKKwkJICAgIHByaW50ZigiP1RoaXMgc3dpdGNoIGRvZXMgbm90IHRha2UgYW4gYXJndW1lbnRcbiIpOworCQkgICAgcmV0dXJuKC05KTsKKwkJfQorCQlzd2l0Y2ggKGNtcmVzdWx0Lm5yZXN1bHQpIHsKKwkJICBjYXNlIDI6CQkvKiAvQ0xPU0UgKi8KKwkJICAgIGNsb3NpbmcgPSAxOwkvKiBGYWxsIHRocnUgb24gcHVycG9zZSAqLworCQkgIGNhc2UgMDoJCS8qIC9PRkYgKi8KKwkJICAgIG9mZiA9IDE7CisJCSAgICBvbiA9IDA7CisJCSAgICBicmVhazsKKwkJICBjYXNlIDE6CQkvKiAvT04gKi8KKwkJICAgIG9uID0gMTsKKwkJICAgIG9mZiA9IDA7CisJCSAgICBicmVhazsKKwkJfQorCQlicmVhazsKKwkgICAgICBjYXNlIF9DTUNGTToJCS8qIENvbmZpcm1hdGlvbiAqLworCQljb25maXJtZWQrKzsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJaWYgKGNsb3NpbmcpIHsKKwkgICAgaWYgKGxlYXJuZnApIHsKKwkJZmNsb3NlKGxlYXJuZnApOworCQlsZWFybmZwID0gTlVMTDsKKwkgICAgfQorCSAgICBtYWtlc3RyKCZsZWFybmZpbGUsTlVMTCk7CisJfQorCWlmIChsaW5lWzBdKSB7CisJICAgIGlmICghb24gJiYgIW9mZikKKwkgICAgICBvbiA9IDE7CisJICAgIGlmIChsZWFybmZwKSB7CisJCWZjbG9zZShsZWFybmZwKTsKKwkJbGVhcm5mcCA9IE5VTEw7CisJICAgIH0KKwkgICAgbWFrZXN0cigmbGVhcm5maWxlLGxpbmUpOworCSAgICBpZiAobGVhcm5maWxlKSB7CisJCWNoYXIgKiBtb2RlcyA9ICJ3IjsKKwkJbGVhcm5mcCA9IGZvcGVuKGxlYXJuZmlsZSxtb2Rlcyk7CisJCWlmICghbGVhcm5mcCkgeworCQkgICAgZGVidWcoRjExMCwiTEVBUk4gZmlsZSBvcGVuIGVycm9yIixsZWFybmZpbGUsMCk7CisJCSAgICBwZXJyb3IobGVhcm5maWxlKTsKKwkJICAgIHJldHVybigtOSk7CisJCX0gZWxzZSB7CisjaWZkZWYgWkZOUUZQCisJCSAgICBpZiAoemZucWZwKGxlYXJuZmlsZSxUTVBCVUZTSVosdG1wYnVmKSkKKwkJICAgICAgbWFrZXN0cigmbGVhcm5maWxlLHRtcGJ1Zik7CisjZW5kaWYgLyogWkZOUUZQICovCisJCSAgICBkZWJ1ZyhGMTEwLCJMRUFSTiBmaWxlIG9wZW4gb2siLGxlYXJuZmlsZSwwKTsKKwkJICAgIGlmICghcXVpZXQpIHsKKwkJCXByaW50ZigiUmVjb3JkaW5nIHRvICVzLi4uXG5cbiIsbGVhcm5maWxlKTsKKwkJCXByaW50ZigKKyIgV0FSTklORzogSWYgeW91IHR5cGUgeW91ciBwYXNzd29yZCBkdXJpbmcgc2NyaXB0IHJlY29yZGluZywgaXQgd2lsbCBhcHBlYXJcblwKKyBpbiB0aGUgZmlsZS4gIEJlIHN1cmUgdG8gZWRpdCBpdCBvciB0YWtlIG90aGVyIGFwcHJvcHJpYXRlIHByZWNhdXRpb25zLlxuXG4iCisJCQkgICAgICAgKTsKKwkJICAgIH0KKwkJICAgIGZwdXRzKCAgIjsgU2NyaXB0ZmlsZTogIixsZWFybmZwKTsKKwkJICAgIGZwdXRzKGxlYXJuZmlsZSxsZWFybmZwKTsKKwkJICAgIGZwdXRzKCJcbjsgRGlyZWN0b3J5OiAgIixsZWFybmZwKTsKKwkJICAgIGZwdXRzKHpndGRpcigpLGxlYXJuZnApOworCQkgICAgZnB1dHMoIlxuOyBSZWNvcmRlZDogICAiLGxlYXJuZnApOworCQkgICAgZnB1dHMoY2tkYXRlKCksbGVhcm5mcCk7CisJCSAgICBmcHV0cygiXG4iLGxlYXJuZnApOworCQl9CisJICAgIH0KKwl9CisJaWYgKG9uKSB7CisJICAgIGxlYXJuaW5nID0gMTsKKwl9IGVsc2UgaWYgKG9mZikgeworCSAgICBsZWFybmluZyA9IDA7CisJfQorCWRlYnVnKEYxMDEsIkxFQVJOIGxlYXJuaW5nIiwiIixsZWFybmluZyk7CisJcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisjZW5kaWYgLyogQ0tMRUFSTiAqLworCisjaWZkZWYgTkVXRlRQCisgICAgaWYgKGN4ID09IFhYVVNFUiB8fCBjeCA9PSBYWEFDQ1QpIHsKKwlpZiAoIWZ0cGlzb3BlbigpKSB7CisJICAgIHByaW50ZigiP0ZUUCBjb25uZWN0aW9uIGlzIG5vdCBvcGVuXG4iKTsKKwkgICAgcmV0dXJuKC05KTsKKwl9CisJcmV0dXJuKHN1Y2Nlc3MgPSAoY3ggPT0gWFhVU0VSKSA/IGRvZnRwdXNyKCkgOiBkb2Z0cGFjY3QoKSk7CisgICAgfQorICAgIGlmIChjeCA9PSBYWFNJVEUgfHwgY3ggPT0gWFhQQVNWKSB7CisJaWYgKCFmdHBpc29wZW4oKSkgeworCSAgICBwcmludGYoIj9GVFAgY29ubmVjdGlvbiBpcyBub3Qgb3BlblxuIik7CisJICAgIHJldHVybigtOSk7CisJfQorCXJldHVybihzdWNjZXNzID0gKGN4ID09IFhYU0lURSkgPyBkb2Z0cHNpdGUoKSA6IGRvc2V0ZnRwcHN2KCkpOworICAgIH0KKyNlbmRpZiAvKiBORVdGVFAgKi8KKworICAgIGlmIChjeCA9PSBYWE9SSUUpIHsJCQkvKiBPUklFTlRBVElPTiAqLworCWV4dGVybiBjaGFyICogbXluYW1lOworCWludCBpLCB5LCBuID0gMDsKKyAgICAgICAgY2hhciAqIHMsICpwLCB2YnVmWzMyXTsKKwljaGFyICogdmFyc1sxNl07ICAgICAgIGNoYXIgKiBsZWdlbmRbMTZdOworCisJaWYgKCh5ID0gY21jZm0oKSkgPCAwKQorCSAgcmV0dXJuKHkpOworCisJcHJpbnRmKCJcblByb2dyYW0gbmFtZTpcbiAgJXNcblxuIixteW5hbWUpOworCW4gKz0gNDsKKworI2lmZGVmIE5UCisJdmFyc1swXSA9ICJob21lIjsgICAgICBsZWdlbmRbMF0gPSAiWW91ciBob21lIGRpcmVjdG9yeSI7CisJdmFyc1sxXSA9ICJkaXJlY3RvcnkiOyBsZWdlbmRbMV0gPSAiSzk1J3MgY3VycmVudCBkaXJlY3RvcnkiOworCXZhcnNbMl0gPSAiZXhlZGlyIjsgICAgbGVnZW5kWzJdID0gIks5NSBQcm9ncmFtIGRpcmVjdG9yeSI7CisJdmFyc1szXSA9ICJpbmlkaXIiOyAgICBsZWdlbmRbM10gPSAiSzk1IEluaXRpYWxpemF0aW9uIGZpbGUgZGlyZWN0b3J5IjsKKwl2YXJzWzRdID0gInN0YXJ0dXAiOyAgIGxlZ2VuZFs0XSA9ICJDdXJyZW50IGRpcmVjdG9yeSB3aGVuIHN0YXJ0ZWQiOworCQorICAgICAgICB2YXJzWzVdID0gImNvbW1vbiI7CisgICAgICAgIGxlZ2VuZFs1XSA9ICJLOTUgZGF0YSBmb3IgYWxsIHVzZXJzIGFuZCBLOTVTSVRFLklOSSBmaWxlIjsKKwkKKyAgICAgICAgdmFyc1s2XSA9ICJwZXJzb25hbCI7ICBsZWdlbmRbNl0gPSAiWW91ciBwZXJzb25hbCBkYXRhIGRpcmVjdG9yeSB0cmVlIjsKKyAgICAgICAgdmFyc1s3XSA9ICJkZXNrdG9wIjsgICBsZWdlbmRbN10gPSAiWW91ciBkZXNrb3AgZGlyZWN0b3J5IHRyZWUiOworCQorICAgICAgICB2YXJzWzhdID0gImFwcGRhdGEiOworICAgICAgICBsZWdlbmRbOF0gPSAiWW91ciBwZXJzb25hbCBLOTUgZGF0YSB0cmVlIGFuZCBLOTVDVVNUT00uSU5JIGZpbGUiOworCQorICAgICAgICB2YXJzWzldID0gImRvd25sb2FkIjsgIGxlZ2VuZFs5XSA9ICJZb3VyIEs5NSBkb3dubG9hZCBkaXJlY3RvcnkiOworICAgICAgICB2YXJzWzEwXSA9ICJ0bXBkaXIiOyAgIGxlZ2VuZFsxMF0gPSAiWW91ciBURU1QIGRpcmVjdG9yeSI7CisJdmFyc1sxMV0gPSBOVUxMOyAgICAgICBsZWdlbmRbMTFdID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCAxNiAmJiB2YXJzW2ldOyBpKyspIHsKKwkgICAgcHJpbnRmKCIlczpcbiIsbGVnZW5kW2ldKTsKKwkgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKwkgICAgY2ttYWttc2codmJ1ZiwzMiwiXFx2KCIsdmFyc1tpXSwiKSIsTlVMTCk7CisJICAgIHByaW50ZigiICBWYXJpYWJsZTogICAlc1xuIix2YnVmKTsKKwkgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKwkgICAgeSA9IFRNUEJVRlNJWjsKKwkgICAgcyA9IHRtcGJ1ZjsKKwkgICAgenpzdHJpbmcodmJ1ZiwmcywmeSk7CisJICAgIGxpbmVbMF0gPSBOVUw7CisJICAgIGNrR2V0TG9uZ1BhdGhOYW1lKHRtcGJ1ZixsaW5lLExJTkJVRlNJWik7CisJICAgIHByaW50ZigiICBMb25nIG5hbWU6ICAlc1xuIixsaW5lKTsKKwkgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKwkgICAgbGluZVswXSA9IE5VTDsKKwkgICAgR2V0U2hvcnRQYXRoTmFtZSh0bXBidWYsbGluZSxMSU5CVUZTSVopOworCSAgICBwcmludGYoIiAgU2hvcnQgbmFtZTogJXNcbiIsbGluZSk7CisJICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisJICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisJfQorI2Vsc2UgIC8qIE5UICovCisKKwl2YXJzWzBdID0gImhvbWUiOyAgICAgIGxlZ2VuZFswXSA9ICJZb3VyIGhvbWUgZGlyZWN0b3J5IjsKKwl2YXJzWzFdID0gImRpcmVjdG9yeSI7IGxlZ2VuZFsxXSA9ICJLZXJtaXQncyBjdXJyZW50IGRpcmVjdG9yeSI7CisJdmFyc1syXSA9ICJleGVkaXIiOyAgICBsZWdlbmRbMl0gPSAiS2VybWl0J3MgcHJvZ3JhbSBkaXJlY3RvcnkiOworCXZhcnNbM10gPSAiaW5pZGlyIjsgICAgbGVnZW5kWzNdID0gIkluaXRpYWxpemF0aW9uIGZpbGUgZGlyZWN0b3J5IjsKKwl2YXJzWzRdID0gInN0YXJ0dXAiOyAgIGxlZ2VuZFs0XSA9ICJDdXJyZW50IGRpcmVjdG9yeSB3aGVuIHN0YXJ0ZWQiOworCXZhcnNbNV0gPSAiZG93bmxvYWQiOyAgbGVnZW5kWzVdID0gIktlcm1pdCBkb3dubG9hZCBkaXJlY3RvcnkiOworCXZhcnNbNl0gPSBOVUxMOwkgICAgICAgbGVnZW5kWzZdID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCAxNiAmJiB2YXJzW2ldOyBpKyspIHsKKwkgICAgcHJpbnRmKCIlczpcbiIsbGVnZW5kW2ldKTsKKwkgICAgaWYgKCsrbiA+IGNtZF9yb3dzIC0gMykgaWYgKCFhc2ttb3JlKCkpIHJldHVybigwKTsgZWxzZSBuID0gMDsKKwkgICAgY2ttYWttc2codmJ1ZiwzMiwiXFx2KCIsdmFyc1tpXSwiKSIsTlVMTCk7CisJICAgIHByaW50ZigiICBWYXJpYWJsZTogJXNcbiIsdmJ1Zik7CisJICAgIGlmICgrK24gPiBjbWRfcm93cyAtIDMpIGlmICghYXNrbW9yZSgpKSByZXR1cm4oMCk7IGVsc2UgbiA9IDA7CisJICAgIHkgPSBUTVBCVUZTSVo7CisJICAgIHMgPSB0bXBidWY7CisJICAgIHp6c3RyaW5nKHZidWYsJnMsJnkpOworICAgICAgICAgICAgcHJpbnRmKCIgIFZhbHVlOiAgICAlc1xuIix0bXBidWYpOworCSAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworCSAgICBpZiAoKytuID4gY21kX3Jvd3MgLSAzKSBpZiAoIWFza21vcmUoKSkgcmV0dXJuKDApOyBlbHNlIG4gPSAwOworCX0KKyNlbmRpZiAvKiBOVCAqLworCXJldHVybihzdWNjZXNzID0gMSk7CisgICAgfQorCisjaWZkZWYgTlQKKyAgICBpZiAoY3ggPT0gWFhESUFMRVIpIHsKKyAgICAgICAgU3RhcnREaWFsZXIoKTsKKyAgICAgICAgcmV0dXJuKHN1Y2Nlc3MgPSAxKTsKKyAgICB9CisjZW5kaWYgLyogTlQgKi8KKworICAgIGlmIChjeCA9PSBYWENPTlQpIHsJCQkvKiBDT05USU5VRSAqLworCWlmICgoeCA9IGNtY2ZtKCkpIDwgMCkKKwkgIHJldHVybih4KTsKKwlpZiAoIXhjbWRzcmMpIHsJCQkvKiBBdCBwcm9tcHQ6IGNvbnRpbnVlIHNjcmlwdCAqLworCSAgICBpZiAoY21kbHZsID4gMCkKKwkgICAgICBwb3BjbHZsKCk7CQkvKiBQb3AgY29tbWFuZCBsZXZlbCAqLworCSAgICByZXR1cm4oc3VjY2VzcyA9IDEpOwkvKiBhbHdheXMgc3VjY2VlZHMgKi8KKyNpZm5kZWYgTk9TUEwKKwl9IGVsc2UgewkJCS8qIEluIHNjcmlwdDogd2hhdGV2ZXIuLi4gKi8KKwkgICAgeCA9IG1sb29rKG1hY3RhYiwiY29udGludWUiLG5tYWMpOworCSAgICAvKiBEb24ndCBzZXQgc3VjY2VzcyAqLworCSAgICByZXR1cm4oZG9kbyh4LE5VTEwsY21kc3RrW2NtZGx2bF0uY2NmbGdzKSk7CisjZW5kaWYgLyogTk9TUEwgKi8KKwl9CisgICAgfQorICAgIGlmIChjeCA9PSBYWE5PVEFWKSB7CQkvKiBDb21tYW5kIGluIHRhYmxlIG5vdCBhdmFpbGFibGUgKi8KKwlja3N0cm5jcHkodG1wYnVmLGF0bWJ1ZixUTVBCVUZTSVopOworCWlmICgoeCA9IGNtdHh0KCJSZXN0IG9mIGNvbW1hbmQiLCIiLCZzLE5VTEwpKSA8IDApCisJICByZXR1cm4oeCk7CisJcHJpbnRmKCJTb3JyeSwgXCIlc1wiIG5vdCBjb25maWd1cmVkIGluIHRoaXMgdmVyc2lvbiBvZiBLZXJtaXQuXG4iLAorCSAgICAgICB0bXBidWYKKwkgICAgICAgKTsKKwlyZXR1cm4oc3VjY2VzcyA9IDApOworICAgIH0KKyAgICByZXR1cm4oLTIpOwkJCQkvKiBOb25lIG9mIHRoZSBhYm92ZSAqLworCit9IC8qIGVuZCBvZiBkb2NtZCgpICovCisKKyNlbmRpZiAvKiBOT0lDUCAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdXVzci5oIGIvY2tlcm1pdC04LjAuMjExL2NrdXVzci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlY2I3OGMKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2t1dXNyLmgKQEAgLTAsMCArMSwyOTc0IEBACisvKiAgQyBLIFUgVSBTIFIgLiBIICAtLSAgU3ltYm9sIGRlZmluaXRpb25zIGZvciBDLUtlcm1pdCBja3V1cyouYyBtb2R1bGVzICAqLworCisvKgorICBBdXRob3I6IEZyYW5rIGRhIENydXogPGZkY0Bjb2x1bWJpYS5lZHU+LAorICBDb2x1bWJpYSBVbml2ZXJzaXR5IEFjYWRlbWljIEluZm9ybWF0aW9uIFN5c3RlbXMsIE5ldyBZb3JrIENpdHkuCisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisjaWZuZGVmIENLVVVTUl9ICisjZGVmaW5lIENLVVVTUl9ICisKKyNpbmNsdWRlICJja3VjbWQuaCIJCQkvKiBHZXQgc3ltYm9scyBmcm9tIGNvbW1hbmQgcGFja2FnZSAqLworCisjaWZuZGVmIE5PTFVDQUNIRQkJCS8qIFVzZSBsb29rdXAoKSBjYWNoZSAqLworI2lmbmRlZiBOT1NQTAkJCQkvKiBUbyBzcGVlZCB1cCBzY3JpcHQgcHJvZ3JhbXMgKi8KKyNpZm5kZWYgVVNFX0xVQ0FDSEUKKyNkZWZpbmUgVVNFX0xVQ0FDSEUKKyNlbmRpZiAvKiBVU0VfTFVDQUNIRSAqLworI2VuZGlmIC8qIE5PU1BMICovCisjZW5kaWYgLyogTk9MVUNBQ0hFICovCisKKyNpZm5kZWYgTk9ET1VCTEVRVU9USU5HCQkJLyogTmV3IHRvIDguMCAqLworI2RlZmluZSBET1VCTEVRVU9USU5HCQkJLyogQWxsb3cgZmllbGRzIHRvIGJlIGVuY2xvc2VkIGluICovCisjZW5kaWYgLyogTk9ET1VCTEVRVU9USU5HICovCQkvKiBkb3VibGVxdW90ZXMuICovCisKKyNpZm5kZWYgTk9MT0NVUwkJCQkvKiBTRVQgTE9DVVMgKi8KKyNkZWZpbmUgTE9DVVMKKyNlbmRpZiAvKiBOT0xPQ1VTICovCisKKy8qIFNpemVzIG9mIHRoaW5ncyAqLworCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgRk5WQUxMIDEwMjM4CQkJLyogRnVuY3Rpb24gcmV0dXJuIHZhbHVlIGxlbmd0aCAqLworI2RlZmluZSBNQVhBUkdMRU4gODE5MQkJCS8qIE1heCBmdW5jIGFyZyBsZW5ndGggYWZ0ZXIgZXZhbCAqLworI2RlZmluZSBNQVhBUkdMSVNUIDEwMjQJCQkvKiBNYXggbnVtYmVyIG9mIGFyZ3MgZm9yIGEgbWFjcm8gKi8KKyNkZWZpbmUgRlNQRUNMIENNREJMCQkJLyogTWF4IGxlbmd0aCBmb3IgTVNFTkQvR0VUIHN0cmluZyAqLworI2RlZmluZSBNU0VORE1BWCAxMDI0CQkJLyogTnVtYmVyIG9mIGZpbGVzcGVjcyBmb3IgTVNFTkQgKi8KKyNkZWZpbmUgTUFDX01BWCAxNjM4NAkJCS8qIE1heGltdW0gbnVtYmVyIG9mIG1hY3JvcyAqLworCisjZWxzZSAgLyogU2FtZSBhcyBhYm92ZSBidXQgZm9yIHNtYWxsZXIgYnVpbGRzLi4uICovCisKKyNkZWZpbmUgRk5WQUxMIDEwMjIKKyNkZWZpbmUgTUFYQVJHTEVOIDEwMjMKKyNkZWZpbmUgTUFYQVJHTElTVCA2NAorI2RlZmluZSBGU1BFQ0wgMzAwCisjZGVmaW5lIE1TRU5ETUFYIDEyOAorI2RlZmluZSBNQUNfTUFYIDEwMjQKKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworCisjZGVmaW5lIEdWQVJTIDEyNwkJCS8qIEhpZ2hlc3QgZ2xvYmFsIHZhciBhbGxvd2VkICovCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgVk5BTUwgNDA5NgkJCS8qIE1heCBsZW5ndGggZm9yIHZhcmlhYmxlIG5hbWUgKi8KKyNkZWZpbmUgQVJSQVlSRUZMRU4gMTAyNAkJLyogTWF4IGxlbmd0aCBmb3IgYXJyYXkgcmVmZXJlbmNlICovCisjZGVmaW5lIEZPUkRFUFRIIDMyCQkJLyogTWF4aW11bSBkZXB0aCBvZiBuZXN0ZWQgRk9SIGxvb3BzICovCisjZGVmaW5lIE1BWFRBS0UgNTQJCQkvKiBNYXhpbXVtIG5lc3Rpbmcgb2YgVEFLRSBmaWxlcyAqLworI2RlZmluZSBNQUNMRVZFTCAxMjgJCQkvKiBNYXhpbXVtIG5lc3RpbmcgZm9yIG1hY3JvcyAqLworI2RlZmluZSBJTlBCVUZTSVogNDA5NgkJCS8qIFNpemUgb2YgSU5QVVQgYnVmZmVyICovCisjZGVmaW5lIFBST01QVEwgMTAyNAkJCS8qIE1heCBsZW5ndGggZm9yIHByb21wdCAqLworI2Vsc2UKKyNkZWZpbmUgVk5BTUwgMjU2CQkJLyogTWF4IGxlbmd0aCBmb3IgdmFyaWFibGUgbmFtZSAqLworI2RlZmluZSBBUlJBWVJFRkxFTiAxMjgJCQkvKiBNYXggbGVuZ3RoIGZvciBhcnJheSByZWZlcmVuY2UgKi8KKyNkZWZpbmUgRk9SREVQVEggMTAJCQkvKiBNYXhpbXVtIGRlcHRoIG9mIG5lc3RlZCBGT1IgbG9vcHMgKi8KKyNkZWZpbmUgTUFYVEFLRSAzMgkJCS8qIE1heGltdW0gbmVzdGluZyBvZiBUQUtFIGZpbGVzICovCisjZGVmaW5lIE1BQ0xFVkVMIDY0CQkJLyogTWF4aW11bSBuZXN0aW5nIGZvciBtYWNyb3MgKi8KKyNkZWZpbmUgSU5QQlVGU0laIDI1NgorI2RlZmluZSBQUk9NUFRMIDI1NgkJCS8qIE1heCBsZW5ndGggZm9yIHByb21wdCAqLworI2VuZGlmIC8qIEJJR0JVRk9LICovCisjZGVmaW5lIE5BUkdTIDEwCQkJLyogTWF4IG51bWJlciBvZiBtYWNybyBhcmd1bWVudHMgKi8KKyNkZWZpbmUgTElOQlVGU0laIChDTURCTCArIDEwKQkJLyogU2l6ZSBvZiBsaW5lW10gYnVmZmVyICovCisjZGVmaW5lIFRNUEJVRlNJWiAoQ01EQkwgKyAxMCkJCS8qIFNpemUgb2YgdGVtcG9yYXJ5IGJ1ZmZlciAqLworI2RlZmluZSBMQkxTSVogNTAJCQkvKiBNYXhpbXVtIGxlbmd0aCBmb3IgYSBHT1RPIGxhYmVsICovCisjZGVmaW5lIENNRFNUS0wgKCBNQUNMRVZFTCArIE1BWFRBS0UgKyAyKSAvKiBDb21tYW5kIHN0YWNrIGRlcHRoICovCisKKyNpZm5kZWYgTk9QVVJHRQkJCQkvKiBQVVJHRSBjb21tYW5kICovCisjaWZkZWYgVU5JWAorI2RlZmluZSBDS1BVUkdFCisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIE5PUFVSR0UgKi8KKworI2lmbmRlZiBOT01JTlBVVAkJCS8qIE1JTlBVVCBjb21tYW5kICovCisjaWZuZGVmIE5PU1BMCisjZGVmaW5lIENLX01JTlBVVAorI2lmbmRlZiBNSU5QTUFYCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgTUlOUE1BWCA5NgkJCS8qIE1heCBudW1iZXIgb2YgTUlOUFVUIHN0cmluZ3MgKi8KKyNlbHNlCisjZGVmaW5lIE1JTlBNQVggMTYKKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworI2VuZGlmIC8qIE1JTlBNQVggKi8KKyNkZWZpbmUgTUlOUEJVRkwgMjU2CQkJLyogU2l6ZSBvZiBNSU5QVVQgdGVtcCBidWZmZXIgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworI2VuZGlmIC8qIE5PTUlOUFVUICovCisKKyNkZWZpbmUgQVJSQVlCQVNFIDk1CQkJLyogTG93ZXN0IGFycmF5LW5hbWUgY2hhcmFjdGVyICovCisKKyNpZm5kZWYgTk9LRVJCQU5HCisjaWZuZGVmIEtFUkJBTkcKKyNkZWZpbmUgS0VSQkFORworI2VuZGlmIC8qIEtFUkJBTkcgKi8KKyNlbmRpZiAvKiBOT0tFUkJBTkcgKi8KKworLyogQml0IHZhbHVlcyAoMSwgMiwgNCwgOCwgLi4uKSBmb3IgdGhlIGNjZmxncyBmaWVsZCAqLworCisjZGVmaW5lIENGX0FQQyAgMQkJCS8qIEV4ZWN1dGluZyBhbiBBUEMgY29tbWFuZCAqLworI2RlZmluZSBDRl9LTUFDIDIJCQkvKiBFeGVjdXRpbmcgYSBcS21hY3JvICovCisjZGVmaW5lIENGX0NNREwgNAkJCS8qIE1hY3JvIGZyb20gLUMgImJsYWgiIGNvbW1hbmQgbGluZSAqLworI2RlZmluZSBDRl9SRVhYIDgJCQkvKiBNYWNybyBmcm9tIFJFWFggaW50ZXJwcmV0ZXIgKi8KKyNkZWZpbmUgQ0ZfSU1BQyAxNgkJCS8qIEludGVybmFsIG1hY3JvIGxpa2UgRk9SLCBXSElMRS4uLiAqLworCitzdHJ1Y3QgY21kcHRyIHsJCQkJLyogQ29tbWFuZCBzdGFjayBzdHJ1Y3R1cmUgKi8KKyAgICBpbnQgc3JjOwkJCQkvKiBDb21tYW5kIFNvdXJjZSAqLworICAgIGludCBsdmw7CQkJCS8qIEN1cnJlbnQgVEFLRSBvciBETyBsZXZlbCAqLworICAgIGludCBjY2ZsZ3M7CQkJCS8qIEZsYWdzICovCit9OworCitzdHJ1Y3QgbXRhYiB7CQkJCS8qIE1hY3JvIHRhYmxlLCBsaWtlIGtleXdvcmQgdGFibGUgKi8KKyAgICBjaGFyICprd2Q7CQkJCS8qIEJ1dCB3aXRoIHBvaW50ZXJzIGZvciB2YWxzICovCisgICAgY2hhciAqbXZhbDsJCQkJLyogaW5zdGVhZCBvZiBpbnRzLiAqLworICAgIHNob3J0IGZsZ3M7Cit9OworCitzdHJ1Y3QgbG9jYWx2YXIgewkJCS8qIExvY2FsIHZhcmlhYmxlIHN0cnVjdHVyZS4gKi8KKyAgICBjaGFyICogbHZfbmFtZTsKKyAgICBjaGFyICogbHZfdmFsdWU7CisgICAgc3RydWN0IGxvY2FsdmFyICogbHZfbmV4dDsKK307CisKK3N0cnVjdCBzdHJpbmdsaXN0IHsJCQkvKiBHZW5lcmFsIHB1cnBvc2Ugc3RyaW5nIGxpc3QgKi8KKyAgICBjaGFyICogc2xfbmFtZTsKKyAgICBzdHJ1Y3Qgc3RyaW5nbGlzdCAqIHNsX25leHQ7Cit9OworCisjaWZuZGVmIE5PSUNQCisvKgorICBDLUtlcm1pdCBJbml0aWFsaXphdGlvbiBmaWxlLi4uCisKKyAgU3lzdGVtLWRlcGVuZGVudCBkZWZhdWx0cyBhcmUgYnVpbHQgaW50byB0aGUgcHJvZ3JhbSwgc2VlIGJlbG93LgorICBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBlaXRoZXIgb2YgdHdvIHdheXM6CisgIDEuIENLX0RTWVNJTkkgaXMgZGVmaW5lZCBhdCBjb21waWxlIHRpbWUsIGluIHdoaWNoIGNhc2UgYSBkZWZhdWx0CisgICAgIHN5c3RlbS13aWRlIGluaXRpYWxpemF0aW9uIGZpbGUgbmFtZSBpcyBjaG9zZW4gZnJvbSBiZWxvdywgb3I6CisgIDI6IENLX1NZU0lOSSBpcyBkZWZpbmVkIHRvIGJlIGEgc3RyaW5nLCB3aGljaCBsZXRzIHRoZSBwcm9ncmFtCisgICAgIGJ1aWxkZXIgY2hvb3NlIHRoZSBpbml0aWFsaXphdGlvbiBmaWxlc3BlYyBhdCBjb21waWxlIHRpbWUuCisgIFRoZXNlIGNhbiBiZSBnaXZlbiBvbiB0aGUgQ0MgY29tbWFuZCBsaW5lLCBzbyB0aGUgc291cmNlIGNvZGUgbmVlZCBub3QgYmUKKyAgY2hhbmdlZC4KKyovCisKKyNpZm5kZWYgQ0tfU1lTSU5JCQkJLyogSWYgbm8gaW5pdGlhbGl6YXRpb24gZmlsZSBnaXZlbiwgKi8KKyNpZmRlZiBDS19EU1lTSU5JCQkJLyogYnV0IENLX0RTWVNJTkkgaXMgZGVmaW5lZC4uLiAqLworCisvKiBTdXBwbHkgc3lzdGVtLWRlcGVuZGVudCAiZGVmYXVsdCBkZWZhdWx0IiBpbml0aWFsaXphdGlvbiBmaWxlICovCisKKyNpZmRlZiBVTklYCQkJCS8qIEZvciBVTklYLCBzeXN0ZW0td2lkZSAqLworLyogVGhpcyBhbGxvd3Mgb25lIGNvcHkgb2YgdGhlIHN0YW5kYXJkIGluaXQgZmlsZSBvbiB0aGUgd2hvbGUgc3lzdGVtLCAqLworLyogcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBjb3B5IGluIGVhY2ggdXNlcidzIGhvbWUgZGlyZWN0b3J5LiAqLworI2lmZGVmIEhQVVgxMAorI2RlZmluZSBDS19TWVNJTkkgIi91c3Ivc2hhcmUvbGliL2tlcm1pdC9ja2VybWl0LmluaSIKKyNlbHNlCisjaWZkZWYgQ1VfQUNJUworI2RlZmluZSBDS19TWVNJTkkgIi91c3Ivc2hhcmUvbGliL2tlcm1pdC9ja2VybWl0LmluaSIKKyNlbHNlCisjaWZkZWYgX19saW51eF9fCisjZGVmaW5lIENLX1NZU0lOSSAiL3Vzci9zaGFyZS9rZXJtaXQvY2tlcm1pdC5pbmkiCisjZWxzZQorI2RlZmluZSBDS19TWVNJTkkgIi91c3IvbG9jYWwvYmluL2NrZXJtaXQuaW5pIgorI2VuZGlmIC8qIGxpbnV4ICovCisjZW5kaWYgLyogQ1VfQUNJUyAqLworI2VuZGlmIC8qIEhQVVgxMCAqLworLyogRmlsbCBpbiAjZWxzZS4uI2lmZGVmJ3MgaGVyZSBmb3IgVk1TLCBPUy8yLCBldGMuICovCisvKiBGaWxsIGluIG1hdGNoaW5nICNlbmRpZidzIGhlcmUuICovCisjZW5kaWYgLyogVU5JWCAqLworCisjZW5kaWYgLyogQ0tfRFNZU0lOSSAqLworI2VuZGlmIC8qIENLX1NZU0lOSSAqLworCisjaWZkZWYgQ0tfU1lTSU5JCQkJLyogSW5pdC1maWxlIHByZWNlZGVuY2UgKi8KKyNpZm5kZWYgQ0tfSU5JX0EJCQkvKiBBIG1lYW5zIHN5c3RlbS13aWRlIGZpbGUgZmlyc3QgKi8KKyNpZm5kZWYgQ0tfSU5JX0IJCQkvKiBCIG1lYW5zIHVzZXIncyBmaXJzdCAqLworI2RlZmluZSBDS19JTklfQQkJCS8qIEEgaXMgZGVmYXVsdCAqLworI2VuZGlmIC8qIENLX0lOSV9CICovCisjZW5kaWYgLyogQ0tfSU5JX0EgKi8KKyNlbHNlCisjaWZkZWYgQ0tfSU5JX0EJCQkJLyogT3RoZXJ3aXNlICovCisjdW5kZWYgQ0tfSU5JX0EJCQkJLyogbWFrZSBzdXJlIHRoZXNlIGFyZW4ndCBkZWZpbmVkICovCisjZW5kaWYgLyogQ0tfSU5JX0EgKi8KKyNpZmRlZiBDS19JTklfQgorI3VuZGVmIENLX0lOSV9CCisjZW5kaWYgLyogQ0tfSU5JX0IgKi8KKyNlbmRpZiAvKiBDS19TWVNJTkkgKi8KKworI2lmZGVmIENLX1NZU0lOSQkJCS8qIE9uZSBtb3JlIGNoZWNrLi4uICovCisjaWZkZWYgQ0tfSU5JX0EJCQkJLyogTWFrZSBzdXJlIHRoZXkncmUgbm90IGJvdGggKi8KKyNpZmRlZiBDS19JTklfQgkJCQkvKiBkZWZpbmVkLiAqLworI3VuZGVmIENLX0lOSV9CCisjZW5kaWYgLyogQ0tfSU5JX0IgKi8KKyNlbmRpZiAvKiBDS19JTklfQSAqLworI2VuZGlmIC8qIENLX1NZU0lOSSAqLworLyoKKyAgSWYgbmVpdGhlciBDS19EU1lTSU5JIG5vciBDS19TWVNJTkkgYXJlIGRlZmluZWQsIHRoZXNlIGFyZSB0aGUKKyAgYnVpbHQtaW4gZGVmYXVsdHMgZm9yIGVhY2ggcGxhdGZvcm0uICBVU0VfQ1VTVE9NIG1lYW5zIHRvIGV4ZWN1dGUgdGhlCisgIGN1c3RvbWl6YXRpb24gZmlsZSBhdXRvbWF0aWNhbGx5IGlmIHRoZSBpbml0aWFsaXphdGlvbiBmaWxlIGlzIG5vdCBmb3VuZC4KKyovCisjaWZuZGVmIE5PQ1VTVE9NCisjaWZuZGVmIFVTRV9DVVNUT00KKyNkZWZpbmUgVVNFX0NVU1RPTQorI2VuZGlmIC8qIFVTRV9DVVNUT00gKi8KKyNlbmRpZiAvKiBOT0NVU1RPTSAqLworCisjaWZuZGVmICBLRVJNUkNMCQkJLyogUGF0aCBsZW5ndGggZm9yIGluaXQgZmlsZSAqLworI2RlZmluZSBLRVJNUkNMIENLTUFYUEFUSAorI2VuZGlmIC8qICBLRVJNUkNMICovCisKKyNpZmRlZiB2bXMKKyNkZWZpbmUgS0VSTVJDICJDS0VSTUlULklOSSIJCS8qIEluaXQgZmlsZSBuYW1lICovCisjZGVmaW5lIE1ZQ1VTVE9NICJDS0VSTU9ELklOSSIJCS8qIEN1c3RvbWl6YXRpb24gZmlsZSBuYW1lICovCisjZWxzZQorI2lmZGVmIE9TMgorI2lmZGVmIE5UCisjZGVmaW5lIEtFUk1SQyAiazk1LmluaSIKKyNkZWZpbmUgTVlDVVNUT00gIms5NWN1c3RvbS5pbmkiCisjZWxzZQorI2RlZmluZSBLRVJNUkMgImsyLmluaSIKKyNkZWZpbmUgTVlDVVNUT00gImsyY3VzdG9tLmluaSIKKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UKKyNpZmRlZiBVTklYT1JPU0sKKyNkZWZpbmUgS0VSTVJDICIua2VybXJjIgorI2RlZmluZSBNWUNVU1RPTSAiLm15a2VybXJjIgorI2Vsc2UKKyNpZmRlZiBTVFJBVFVTCisjZGVmaW5lIEtFUk1SQyAiY2tlcm1pdC5pbmkiCisjZGVmaW5lIE1ZQ1VTVE9NICJja2VybW9kLmluaSIKKyNlbHNlCisjZGVmaW5lIEtFUk1SQyAiQ0tFUk1JVC5JTkkiCisjZGVmaW5lIE1ZQ1VTVE9NICJja2VybW9kLmluaSIKKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogVU5JWE9ST1NLICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogdm1zICovCisKKyNpZm5kZWYgS0VSTVJDTAorI2RlZmluZSBLRVJNUkNMIDI1NgorI2VuZGlmIC8qIEtFUk1SQ0wgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworCisvKiBVc2VyIGludGVyZmFjZSBmZWF0dXJlcyAqLworCisjaWZkZWYgQ0tfQ1VSU0VTCQkJLyogVGhlcm1vbWV0ZXIgKi8KKyNpZm5kZWYgTk9fUENUX0JBUgorI2lmbmRlZiBDS19QQ1RfQkFSCisjZGVmaW5lIENLX1BDVF9CQVIKKyNlbmRpZiAvKiBOT19QQ1RfQkFSICovCisjZW5kaWYgLyogQ0tfUENUX0JBUiAqLworI2VuZGlmIC8qIENLX0NVUlNFUyAqLworCisjaWZkZWYgS1VJCQkJCS8qIEtVSSByZXF1aXJlcyB0aGUgVGhlcm1vbWV0ZXIgY29kZSAqLworI2lmbmRlZiBOT19QQ1RfQkFSCisjaWZuZGVmIENLX1BDVF9CQVIKKyNkZWZpbmUgQ0tfUENUX0JBUgorI2VuZGlmIC8qIE5PX1BDVF9CQVIgKi8KKyNlbmRpZiAvKiBDS19QQ1RfQkFSICovCisjZW5kaWYgLyogS1VJICovCisKKy8qIEluY2x1ZGVzICovCisKKyNpZmRlZiBNSU5JWAorLyogd2h5PyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIC8qIE1JTklYICovCisKKy8qIFN5bWJvbHMgZm9yIGNvbW1hbmQgc291cmNlICovCisKKyNkZWZpbmUgQ01EX0tCIDAJCQkvKiBLZXlCb2FyZCBvciBzdGFuZGFyZCBpbnB1dCAqLworI2RlZmluZSBDTURfVEYgMQkJCS8qIFRBS0UgY29tbWFuZCBGaWxlICovCisjZGVmaW5lIENNRF9NRCAyCQkJLyogTWFjcm8gRGVmaW5pdGlvbiAqLworCisvKgorICBTRVQgVFJBTlNGRVIgQ0FOQ0VMTEFUSU9OIGNvbW1hbmQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBhbGwgdmVyc2lvbnMuCisgIEJ1dCBmb3Igbm93Li4uCisqLworI2lmZGVmIFVOSVgJCQkJLyogVU5JWCBoYXMgaXQgKi8KKyNpZm5kZWYgWEZSQ0FOCisjZGVmaW5lIFhGUkNBTgorI2VuZGlmIC8qIFhGUkNBTiAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBWTVMJCQkJLyogVk1TIGhhcyBpdCAqLworI2lmbmRlZiBYRlJDQU4KKyNkZWZpbmUgWEZSQ0FOCisjZW5kaWYgLyogWEZSQ0FOICovCisjZW5kaWYgLyogVk1TICovCisjaWZkZWYgZGF0YWdlbmVyYWwJCQkvKiBERyBBT1MvVlMgaGFzIGl0ICovCisjaWZuZGVmIFhGUkNBTgorI2RlZmluZSBYRlJDQU4KKyNlbmRpZiAvKiBYRlJDQU4gKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2lmZGVmIFNUUkFUVVMJCQkJLyogU3RyYXR1cyBWT1MgaGFzIGl0ICovCisjaWZuZGVmIFhGUkNBTgorI2RlZmluZSBYRlJDQU4KKyNlbmRpZiAvKiBYRlJDQU4gKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjaWZkZWYgT1NLCQkJCS8qIE9TLTkgKi8KKyNpZm5kZWYgWEZSQ0FOCisjZGVmaW5lIFhGUkNBTgorI2VuZGlmIC8qIFhGUkNBTiAqLworI2VuZGlmIC8qIE9TSyAqLworCisjaWZuZGVmIE5PQ01ETAorLyogRXh0ZW5kZWQgQ29tbWFuZC1MaW5lIE9wdGlvbiBDb2RlcyAoa2VlcCBhbHBoYWJldGljYWwgYnkga2V5d29yZCkgKi8KKworI2RlZmluZSBYQV9BTk9OIDAJCQkvKiAtLWFub255bW91cyAqLworI2RlZmluZSBYQV9CQUZJIDEJCQkvKiAtLWJhbm5lcmZpbGUgKi8KKyNkZWZpbmUgWEFfQ0RGSSAyCQkJLyogLS1jZGZpbGUgKi8KKyNkZWZpbmUgWEFfQ0RNUyAzCQkJLyogLS1jZG1lc3NhZ2UgKi8KKyNkZWZpbmUgWEFfSEVMUCA0CQkJLyogLS1oZWxwICovCisjZGVmaW5lIFhBX0hFRkkgNQkJCS8qIC0taGVscGZpbGUgKi8KKyNkZWZpbmUgWEFfSUtGSSA2CQkJLyogLS14ZmVyZmlsZSAqLworI2RlZmluZSBYQV9JS0xHIDcJCQkvKiAtLXhmZXJsb2cgKi8KKyNkZWZpbmUgWEFfQU5GSSA4CQkJLyogLS1pbml0ZmlsZSAqLworI2RlZmluZSBYQV9QRVJNIDkJCQkvKiAtLXBlcm1pc3Npb25zICovCisjZGVmaW5lIFhBX1JPT1QgMTAJCQkvKiAtLXJvb3QgKi8KKyNkZWZpbmUgWEFfU1lTTCAxMQkJCS8qIC0tc3lzbG9nICovCisjZGVmaW5lIFhBX1VTRkkgMTIJCQkvKiAtLXVzZXJmaWxlICovCisjZGVmaW5lIFhBX1dURkkgMTMJCQkvKiAtLXd0bXBmaWxlICovCisjZGVmaW5lIFhBX1dUTVAgMTQJCQkvKiAtLXd0bXBsb2cgKi8KKyNkZWZpbmUgWEFfVElNTyAxNQkJCS8qIC0tdGltZW91dCAqLworI2RlZmluZSBYQV9OT0lOIDE2CQkJLyogLS1ub2ludGVycnVwdHMgKi8KKyNkZWZpbmUgWEFfREJBUyAxNwkJCS8qIC0tZGF0YWJhc2UgKi8KKyNkZWZpbmUgWEFfREJGSSAxOAkJCS8qIC0tZGJmaWxlICovCisjZGVmaW5lIFhBX1BSSVYgMTkJCQkvKiAtLXByaXZpZCAqLworI2RlZmluZSBYQV9WRVJTIDIwCQkJLyogLS12ZXJzaW9uICovCisjZGVmaW5lIFhBX05QUk0gMjEJCQkvKiAtLW5vcGVybXMgKi8KKyNkZWZpbmUgWEFfWFBPUyAyMgkJCS8qIFdpbmRvdyBwb3NpdGlvbiBYIGNvb3JkaW5hdGUgKi8KKyNkZWZpbmUgWEFfWVBPUyAyMwkJCS8qIFdpbmRvdyBwb3NpdGlvbiBZIGNvb3JkaW5hdGUgKi8KKyNkZWZpbmUgWEFfRk5BTSAyNAkJCS8qIEZvbnQgRmFjZW5hbWUgKi8KKyNkZWZpbmUgWEFfRlNJWiAyNQkJCS8qIEZvbnQgU2l6ZSAqLworI2RlZmluZSBYQV9URVJNIDI2CQkJLyogVGVybWluYWwgdHlwZSAqLworI2RlZmluZSBYQV9DU0VUIDI3CQkJLyogUmVtb3RlIENoYXJhY3RlciBTZXQgKi8KKyNkZWZpbmUgWEFfUk9XUyAyOAkJCS8qIFNjcmVlbiByb3dzIChoZWlnaHQpICovCisjZGVmaW5lIFhBX0NPTFMgMjkJCQkvKiBTY3JlZW4gY29sdW1ucyAod2lkdGgpICovCisjZGVmaW5lIFhBX1RFTCAgMzAJCQkvKiBNYWtlIGEgVGVsbmV0IGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgWEFfRlRQICAzMQkJCS8qIE1ha2UgYW4gRlRQIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgWEFfU1NIICAzMgkJCS8qIE1ha2UgYW4gU1NIIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgWEFfVVNFUiAzMwkJCS8qIFVzZXJuYW1lIGZvciBsb2dpbiAqLworI2RlZmluZSBYQV9QQVNTIDM0CQkJLyogUGFzc3dvcmQgZm9yIGxvZ2luICovCisjZGVmaW5lIFhBX1RJVEwgMzUgICAgICAgICAgICAgICAgICAgICAgLyogV2luZG93IFRpdGxlICovCisjZGVmaW5lIFhBX05PTU4gMzYJCQkvKiBObyBHVUkgTWVudSBCYXIgKi8KKyNkZWZpbmUgWEFfTk9UQiAzNwkJCS8qIE5vIEdVSSBUb29sIEJhciAqLworI2RlZmluZSBYQV9OT1NCIDM4ICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIEdVSSBTdGF0dXMgQmFyICovCisjZGVmaW5lIFhBX05PUFVTSCAzOSAgICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBleHRlcm5hbCBjb21tYW5kcyAqLworI2RlZmluZSBYQV9OT1NDUk9MTCA0MCAgICAgICAgICAgICAgICAgIC8qIERpc2FibGUgc2Nyb2xsYmFjayBvcGVyYXRpb25zICovCisjZGVmaW5lIFhBX05PRVNDQVBFIDQxICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBlc2NhcGUgZnJvbSBjb25uZWN0IG1vZGUgKi8KKyNkZWZpbmUgWEFfTE9DSyA0MiAgICAgICAgICAgICAgICAgICAgICAvKiBBbGwgbG9ja2Rvd24gb3B0aW9ucyAqLworI2RlZmluZSBYQV9OT0JBUiA0MyAgICAgICAgICAgICAgICAgICAgIC8qIE5vIEdVSSBCYXJzICovCisjZGVmaW5lIFhBX1dNQVggIDQ0CisjZGVmaW5lIFhBX1dNSU4gIDQ1CisjZGVmaW5lIFhBX1NDQUxFIDQ2ICAgICAgICAgICAgICAgICAgICAgLyogR1VJIFNjYWxlIEZvbnQgKi8KKyNkZWZpbmUgWEFfQ0hHRCAgNDcgICAgICAgICAgICAgICAgICAgICAvKiBHVUkgQ2hhbmdlIERpbWVuc2lvbnMgKi8KKyNkZWZpbmUgWEFfTUFYICA0NwkJCS8qIEhpZ2hlc3QgZXh0ZW5kZWQgb3B0aW9uIG51bWJlciAqLworI2VuZGlmIC8qIE5PQ01ETCAqLworCisjaWZuZGVmIE5PSUNQCisvKiBUb3AgTGV2ZWwgQ29tbWFuZHMgKi8KKy8qIFZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdG9wLWxldmVsIGNvbW1hbmRzIG11c3QgYmUgMCBvciBncmVhdGVyLiAqLworCisjZGVmaW5lIFhYQllFICAgMAkvKiBCWUUgKi8KKyNkZWZpbmUgWFhDTEUgICAxCS8qIENMRUFSICovCisjZGVmaW5lIFhYQ0xPICAgMgkvKiBDTE9TRSAqLworI2RlZmluZSBYWENPTiAgIDMJLyogQ09OTkVDVCAqLworI2RlZmluZSBYWENQWSAgIDQJLyogQ09QWSAqLworI2RlZmluZSBYWENXRCAgIDUJLyogQ1dEIChDaGFuZ2UgV29ya2luZyBEaXJlY3RvcnkpICovCisjZGVmaW5lIFhYREVGCTYJLyogREVGSU5FIChhIG1hY3JvIG9yIHZhcmlhYmxlKSAqLworI2RlZmluZSBYWERFTCAgIDcJLyogKExvY2FsKSBERUxFVEUgKi8KKyNkZWZpbmUgWFhESVIgICA4CS8qIChMb2NhbCkgRElSRUNUT1JZICovCisKKy8qIERJUkVDVE9SWSBDb21tYW5kIG9wdGlvbnMuLi4gKi8KKyNkZWZpbmUgRElSX0JSRiAxCS8qIEJSSUVGICovCisjZGVmaW5lIERJUl9WUkIgMgkvKiBWRVJCT1NFICovCisjZGVmaW5lIERJUl9QQUcgMwkvKiBQQUdFICovCisjZGVmaW5lIERJUl9OT1AgNAkvKiBOT1BBR0UgKi8KKyNkZWZpbmUgRElSX0lTTyA1CS8qIElTT0RBVEUgKi8KKyNkZWZpbmUgRElSX0RBVCA2CS8qIEVOR0xJU0hEQVRFICovCisjZGVmaW5lIERJUl9IREcgNwkvKiBIRUFESU5HUyAqLworI2RlZmluZSBESVJfTk9IIDgJLyogTk9IRUFESU5HUyAqLworI2RlZmluZSBESVJfU1JUIDkJLyogU09SVCAqLworI2RlZmluZSBESVJfTk9TIDEwICAgICAgLyogTk9TT1JUICovCisjZGVmaW5lIERJUl9BU0MgMTEJLyogQVNDRU5ESU5HICovCisjZGVmaW5lIERJUl9EU0MgMTIgICAgICAvKiBERVNDRU5ESU5HICovCisjZGVmaW5lIERJUl9SRUMgMTMgICAgICAvKiBSRUNVUlNJVkUgKi8KKyNkZWZpbmUgRElSX05PUiAxNAkvKiBOT1JFQ1VSSVZFICovCisjZGVmaW5lIERJUl9ET1QgMTUJLyogRE9URklMRVMgKi8KKyNkZWZpbmUgRElSX05PRCAxNgkvKiBOT0RPVEZJTEVTICovCisjZGVmaW5lIERJUl9ESVIgMTcJLyogRElSRUNUT1JJRVMgKi8KKyNkZWZpbmUgRElSX0ZJTCAxOAkvKiBGSUxFUyAqLworI2RlZmluZSBESVJfQUxMIDE5CS8qIEFMTCAqLworI2RlZmluZSBESVJfTkFNIDIwCS8qIE5BTUVTOiAqLworI2RlZmluZSBESVJfVFlQIDIxCS8qIEZJTEVUWVBFUyAqLworI2RlZmluZSBESVJfTk9UIDIyCS8qIE5PRklMRVRZUEVTICovCisjZGVmaW5lIERJUl9CVVAgMjMJLyogQkFDS1VQICovCisjZGVmaW5lIERJUl9OT0IgMjQJLyogTk9CQUNLVVAgKi8KKyNkZWZpbmUgRElSX01TRyAyNSAgICAgIC8qIE1FU1NBR0UgKi8KKyNkZWZpbmUgRElSX05PTSAyNiAgICAgIC8qIE5PTUVTU0FHRSAqLworI2RlZmluZSBESVJfQVJSIDI3ICAgICAgLyogQVJSQVk6ICovCisjZGVmaW5lIERJUl9OQVIgMjggICAgICAvKiBOT0FSUkFZICovCisjZGVmaW5lIERJUl9FWEMgMjkJLyogRVhDRVBUOiAqLworI2RlZmluZSBESVJfTEFSIDMwCS8qIExBUkdFUi1USEFOOiAqLworI2RlZmluZSBESVJfU01BIDMxCS8qIFNNQUxMRVItVEhBTjogKi8KKyNkZWZpbmUgRElSX0FGVCAzMgkvKiBBRlRFUjogKi8KKyNkZWZpbmUgRElSX05BRiAzMwkvKiBOT1QtQUZURVI6ICovCisjZGVmaW5lIERJUl9CRUYgMzQJLyogQkVGT1JFOiAqLworI2RlZmluZSBESVJfTkJGIDM1CS8qIE5PVC1CRUZPUkU6ICovCisjZGVmaW5lIERJUl9TVU0gMzYJLyogU1VNTUFSWSAqLworI2RlZmluZSBESVJfQklOIDM3CS8qIFRZUEUgKG9ubHkgc2hvdyBiaW5hcnkgb3IgdGV4dCkgKi8KKyNkZWZpbmUgRElSX0xOSyAzOAkvKiBmb2xsb3cgc3ltbGlua3MgKi8KKyNkZWZpbmUgRElSX05MSyAzOQkvKiBkb24ndCBmb2xsb3cgc3ltbGlua3MgKi8KKyNkZWZpbmUgRElSX09VVCA0MAkvKiBPdXRwdXQgZmlsZSBmb3IgbGlzdGluZyAqLworCisjZGVmaW5lIERJUlNfTk0gMCAgICAgICAvKiBTb3J0IGRpcmVjdG9yeSBieSBOQU1FICovCisjZGVmaW5lIERJUlNfRFQgMSAgICAgICAvKiBTb3J0IGRpcmVjdG9yeSBieSBEQVRFICovCisjZGVmaW5lIERJUlNfU1ogMiAgICAgICAvKiBTb3J0IGRpcmVjdG9yeSBieSBTSVpFICovCisKKyNkZWZpbmUgWFhESVMgICA5CS8qIERJU0FCTEUgKi8KKyNkZWZpbmUgWFhFQ0ggIDEwCS8qIEVDSE8gKi8KKyNkZWZpbmUgWFhFWEkgIDExCS8qIEVYSVQgKi8KKyNkZWZpbmUgWFhGSU4gIDEyCS8qIEZJTklTSCAqLworI2RlZmluZSBYWEdFVCAgMTMJLyogR0VUICovCisjZGVmaW5lIFhYSExQICAxNAkvKiBIRUxQICovCisjZGVmaW5lIFhYSU5QICAxNQkvKiBJTlBVVCAqLworI2RlZmluZSBYWExPQyAgMTYJLyogTE9DQUwgKi8KKyNkZWZpbmUgWFhMT0cgIDE3CS8qIExPRyAqLworI2RlZmluZSBYWE1BSSAgMTgJLyogTUFJTCAqLworI2RlZmluZSBYWE1PVSAgMTkJLyogKExvY2FsKSBNT1VOVCAqLworI2RlZmluZSBYWE1TRyAgMjAJLyogKExvY2FsKSBNRVNTQUdFICovCisjZGVmaW5lIFhYT1VUICAyMQkvKiBPVVRQVVQgKi8KKyNkZWZpbmUgWFhQQVUgIDIyCS8qIFBBVVNFICovCisjZGVmaW5lIFhYUFJJICAyMwkvKiAoTG9jYWwpIFBSSU5UICovCisjZGVmaW5lIFhYUVVJICAyNAkvKiBRVUlUICovCisjZGVmaW5lIFhYUkVDICAyNQkvKiBSRUNFSVZFICovCisjZGVmaW5lIFhYUkVNICAyNgkvKiBSRU1PVEUgKi8KKyNkZWZpbmUgWFhSRU4gIDI3CS8qIChMb2NhbCkgUkVOQU1FICovCisjZGVmaW5lIFhYU0VOICAyOAkvKiBTRU5EICovCisKKy8qIFNFTkQgc3dpdGNoZXMgKi8KKworI2RlZmluZSBTTkRfQklOICAwCS8qIEJpbmFyeSBtb2RlICovCisjZGVmaW5lIFNORF9ERUwgIDEJLyogRGVsZXRlIGFmdGVyICovCisjZGVmaW5lIFNORF9FWEMgIDIJLyogRXhjZXB0ICovCisjZGVmaW5lIFNORF9MQVIgIDMJLyogTGFyZ2VyIHRoYW4gKi8KKyNkZWZpbmUgU05EX01BSSAgNAkvKiBNYWlsICovCisjZGVmaW5lIFNORF9CRUYgIDUJLyogQmVmb3JlICovCisjZGVmaW5lIFNORF9BRlQgIDYJLyogQWZ0ZXIgKi8KKyNkZWZpbmUgU05EX1BSSSAgNwkvKiBQcmludCAqLworI2RlZmluZSBTTkRfU0hIICA4CS8qIFF1aWV0ICovCisjZGVmaW5lIFNORF9SRUMgIDkJLyogUmVjdXJzaXZlICovCisjZGVmaW5lIFNORF9TTUEgMTAJLyogU21hbGxlciB0aGFuICovCisjZGVmaW5lIFNORF9TVEEgMTEJLyogU3RhcnRpbmctZnJvbSAqLworI2RlZmluZSBTTkRfVFhUIDEyCS8qIFRleHQgbW9kZSAqLworI2RlZmluZSBTTkRfQ01EIDEzCS8qIEZyb20gY29tbWFuZCAocGlwZSkgICovCisjZGVmaW5lIFNORF9SRVMgMTQJLyogUmVzZW5kL1JlY292ZXIgKi8KKyNkZWZpbmUgU05EX1BSTyAxNQkvKiBQcm90b2NvbCAqLworI2RlZmluZSBTTkRfQVNOIDE2CS8qIEFzLW5hbWUgKi8KKyNkZWZpbmUgU05EX0lNRyAxNwkvKiBJbWFnZSAqLworI2RlZmluZSBTTkRfTEJMIDE4CS8qIExhYmVsZWQgKi8KKyNkZWZpbmUgU05EX05BRiAxOQkvKiBOb3QtQWZ0ZXIgKi8KKyNkZWZpbmUgU05EX05CRSAyMAkvKiBOb3QtQmVmb3JlICovCisjZGVmaW5lIFNORF9GTFQgMjEJLyogRmlsdGVyICovCisjZGVmaW5lIFNORF9QVEggMjIJLyogUGF0aG5hbWVzICovCisjZGVmaW5lIFNORF9OQU0gMjMJLyogRmlsZW5hbWVzICovCisjZGVmaW5lIFNORF9NT1YgMjQgICAgICAvKiBNT1ZFIHRvIGFub3RoZXIgZGlyZWN0b3J5ICovCisjZGVmaW5lIFNORF9SRU4gMjUgICAgICAvKiBSRU5BTUUgYWZ0ZXIgc2VuZGluZyAqLworI2RlZmluZSBTTkRfQ0FMIDI2CS8qIENhbGlicmF0ZSAqLworI2RlZmluZSBTTkRfRklMIDI3CS8qIEZpbGUgY29udGFpbmluZyBsaXN0IG9mIGZpbGVzIHRvIHNlbmQgKi8KKyNkZWZpbmUgU05EX05PQiAyOAkvKiBTa2lwIGJhY2t1cCBmaWxlcyAgKi8KKyNkZWZpbmUgU05EX0RPVCAyOQkvKiBJbmNsdWRlIGRvdC1maWxlcyAqLworI2RlZmluZSBTTkRfTk9EIDMwCS8qIEV4Y2x1ZGUgZG90LWZpbGVzICovCisjZGVmaW5lIFNORF9BUlIgMzEJLyogU2VuZCBmcm9tIGFycmF5ICovCisjZGVmaW5lIFNORF9UWVAgMzIJLyogVFlQRSAob25seSBzZW5kIHRleHQgKG9yIGJpbmFyeSkpICovCisjZGVmaW5lIFNORF9YUEEgMzMJLyogVFJBTlNQQVJFTlQgKi8KKyNkZWZpbmUgU05EX1BJUCAzNAkvKiBQSVBFUyAqLworI2RlZmluZSBTTkRfRVJSIDM1CS8qIEVSUk9SICovCisjZGVmaW5lIFNORF9DU0wgMzYJLyogTG9jYWwgY2hhcmFjdGVyIHNldCAqLworI2RlZmluZSBTTkRfQ1NSIDM3CS8qIFJlbW90ZSBjaGFyYWN0ZXIgc2V0ICovCisjZGVmaW5lIFNORF9VUEQgMzgJLyogVXBkYXRlICovCisjZGVmaW5lIFNORF9DT0wgMzkJLyogQ29sbGlzaW9uICovCisjZGVmaW5lIFNORF9OTUwgNDAJLyogTmFtZWxpc3QgKi8KKyNkZWZpbmUgU05EX1NSTiA0MQkvKiBTZXJ2ZXItUmVuYW1lICovCisjZGVmaW5lIFNORF9MTksgNDIJLyogRm9sbG93IGxpbmtzICovCisjZGVmaW5lIFNORF9OTEsgNDMJLyogRG9uJ3QgZm9sbG93IGxpbmtzICovCisjZGVmaW5lIFNORF9TSU0gNDQJLyogU2ltdWxhdGUgKi8KKyNkZWZpbmUgU05EX0RJRiA0NQkvKiBJZiBkYXRlcyBEaWZmZXIgKi8KKyNkZWZpbmUgU05EX1BBVCA0NgkvKiBQYXR0ZXJuIHRvIHVzZSBsb2NhbGx5IHdoZW4gR0VUJ2luZyAqLworI2RlZmluZSBTTkRfTkxTIDQ3CS8qIChGVFAgb25seSkgTUdFVCBmb3JjZXMgTkxTVCAqLworI2RlZmluZSBTTkRfTUxTIDQ4CS8qIChGVFAgb25seSkgTUdFVCBmb3JjZXMgTUxTRCAqLworCisjZGVmaW5lIFNORF9NQVggNDgJLyogSGlnaGVzdCBTRU5EIHN3aXRjaCAqLworCisjZGVmaW5lIFhYU0VSICAyOSAgIAkvKiBTRVJWRVIgKi8KKyNkZWZpbmUgWFhTRVQgIDMwCS8qIFNFVCAqLworI2RlZmluZSBYWFNIRSAgMzEJLyogQ29tbWFuZCBmb3IgU0hFTEwgKi8KKyNkZWZpbmUgWFhTSE8gIDMyCS8qIFNIT1cgKi8KKyNkZWZpbmUgWFhTUEEgIDMzCS8qIChMb2NhbCkgU1BBQ0UgKi8KKyNkZWZpbmUgWFhTVEEgIDM0CS8qIFNUQVRJU1RJQ1MgKi8KKyNkZWZpbmUgWFhTVUIgIDM1CS8qIChMb2NhbCkgU1VCTUlUICovCisjZGVmaW5lIFhYVEFLICAzNgkvKiBUQUtFICovCisjZGVmaW5lIFhYVFJBICAzNwkvKiBUUkFOU01JVCAqLworI2RlZmluZSBYWFRZUCAgMzgJLyogKExvY2FsKSBUWVBFICovCisjZGVmaW5lIFhYV0hPICAzOQkvKiAoTG9jYWwpIFdITyAqLworI2RlZmluZSBYWERJQUwgNDAJLyogKExvY2FsKSBESUFMICovCisjZGVmaW5lIFhYTE9HSSA0MQkvKiAoTG9jYWwpIFNDUklQVCAqLworI2RlZmluZSBYWENPTSAgNDIJLyogQ29tbWVudCAqLworI2RlZmluZSBYWEhBTiAgNDMgICAgICAgLyogSEFOR1VQICovCisjZGVmaW5lIFhYWExBICA0NAkvKiBUUkFOU0xBVEUgKi8KKyNkZWZpbmUgWFhJRiAgIDQ1CS8qIElGICovCisjZGVmaW5lIFhYTEJMICA0NiAgICAgICAvKiBsYWJlbCAqLworI2RlZmluZSBYWEdPVE8gNDcJLyogR09UTyAqLworI2RlZmluZSBYWEVORCAgNDggICAgICAgLyogRU5EICovCisjZGVmaW5lIFhYU1RPICA0OSAgICAgICAvKiBTVE9QICovCisjZGVmaW5lIFhYRE8gICA1MCAgICAgICAvKiBETyAqLworI2RlZmluZSBYWFBXRCAgNTEgICAgICAgLyogUFdEICovCisjZGVmaW5lIFhYVEVTICA1MiAgICAgICAvKiBURVNUICovCisjZGVmaW5lIFhYQVNLICA1MyAgICAgICAvKiBBU0sgKi8KKyNkZWZpbmUgWFhBU0tRIDU0ICAgICAgIC8qIEFTS1EgKi8KKyNkZWZpbmUgWFhBU1MgIDU1ICAgICAgIC8qIEFTU0lHTiAqLworI2RlZmluZSBYWFJFSSAgNTYgICAgICAgLyogUkVJTlBVVCAqLworI2RlZmluZSBYWElOQyAgNTcgICAgICAgLyogSU5DUkVNRU5UICovCisjZGVmaW5lIFhYREVDICA1OSAgICAgICAvKiBERUNSRU1FTlQgKi8KKyNkZWZpbmUgWFhFTFMgIDYwICAgICAgIC8qIEVMU0UgKi8KKyNkZWZpbmUgWFhFWEUgIDYxCS8qIEVYRUNVVEUgKi8KKyNkZWZpbmUgWFhXQUkgIDYyCS8qIFdBSVQgKi8KKyNkZWZpbmUgWFhWRVIgIDYzICAgICAgIC8qIFZFUlNJT04gKi8KKyNkZWZpbmUgWFhFTkEgIDY0ICAgICAgIC8qIEVOQUJMRSAqLworI2RlZmluZSBYWFdSSSAgNjUgICAgICAgLyogV1JJVEUgKi8KKyNkZWZpbmUgWFhDTFMgIDY2ICAgICAgIC8qIENMUyAoY2xlYXIgc2NyZWVuKSAqLworI2RlZmluZSBYWFJFVCAgNjcJLyogUkVUVVJOICovCisjZGVmaW5lIFhYT1BFICA2OCAgICAgICAvKiBPUEVOICovCisjZGVmaW5lIFhYUkVBICA2OQkvKiBSRUFEICovCisjZGVmaW5lIFhYT04gICA3MCAgICAgICAvKiBPTiAqLworI2RlZmluZSBYWERDTCAgNzEgICAgICAgLyogREVDTEFSRSAqLworI2RlZmluZSBYWEJFRyAgNzIgICAgICAgLyogQkVHSU4gKG5vdCB1c2VkKSAqLworI2RlZmluZSBYWEZPUiAgNzIgICAgICAgLyogRk9SICovCisjZGVmaW5lIFhYV0hJICA3MyAgICAgICAvKiBXSElMRSAqLworI2RlZmluZSBYWElGWCAgNzQgICAgICAgLyogRXh0ZW5kZWQgSUYgKi8KKyNkZWZpbmUgWFhDTVMgIDc1ICAgICAgIC8qIFNFTkQgZnJvbSBjb21tYW5kIG91dHB1dCAobm90IHlldCkgKi8KKyNkZWZpbmUgWFhDTVIgIDc2ICAgICAgIC8qIFJFQ0VJVkUgdG8gYSBjb21tYW5kJ3MgaW5wdXQgKG5vdCB5ZXQpICovCisjZGVmaW5lIFhYQ01HICA3NyAgICAgICAvKiBHRVQgdG8gYSBjb21tYW5kJ3MgaW5wdXQgKG5vdCB5ZXQpICovCisjZGVmaW5lIFhYU1VTICA3OCAgICAgICAvKiBTVVNQRU5EICovCisjZGVmaW5lIFhYRVJSICA3OSAgICAgICAvKiBFUlJPUiAqLworI2RlZmluZSBYWE1TRSAgODAgICAgICAgLyogTVNFTkQgKi8KKyNkZWZpbmUgWFhCVUcgIDgxICAgICAgIC8qIEJVRyAqLworI2RlZmluZSBYWFBBRCAgODIgICAgICAgLyogUEFEIChhcyBpbiBYLjI1IFBBRCkgQU5ZWDI1ICovCisjZGVmaW5lIFhYUkVEICA4MyAgICAgICAvKiBSRURJQUwgKi8KKyNkZWZpbmUgWFhHVEEgIDg0CS8qIF9nZXRhcmdzIChpbnZpc2libGUgaW50ZXJuYWwpICovCisjZGVmaW5lIFhYUFRBICA4NQkvKiBfcHV0YXJncyAoaW52aXNpYmxlIGludGVybmFsKSAqLworI2RlZmluZSBYWEdPSyAgODYgICAgICAgLyogR0VUT0sgLSBBc2sgZm9yIFlFUy9OTyAqLworI2RlZmluZSBYWFRFTCAgODcJLyogVEVMTkVUICovCisjZGVmaW5lIFhYQVNYICA4OAkvKiBfQVNTSUdOIChldmFsdWF0ZXMgdmFyIG5hbWUpICovCisjZGVmaW5lIFhYREZYICA4OQkvKiBfREVGSU5FIChldmFsdWF0ZXMgdmFyIG5hbWUpICovCisjZGVmaW5lIFhYUE5HICA5MAkvKiBQSU5HIChmb3IgVENQL0lQKSAqLworI2RlZmluZSBYWElOVCAgOTEgICAgICAgLyogSU5UUk9EVUNUSU9OICovCisjZGVmaW5lIFhYQ0hLICA5MgkvKiBDSEVDSyAoYSBmZWF0dXJlKSAqLworI2RlZmluZSBYWE1TTCAgOTMgICAgICAgLyogTVNMRUVQLCBNUEFVU0UgKG1pbGxpc2Vjb25kIHNsZWVwKSAqLworI2RlZmluZSBYWE5FVyAgOTQgICAgICAgLyogTkVXUyAqLworI2RlZmluZSBYWEFQQyAgOTUgICAgICAgLyogQVBDICovCisjZGVmaW5lIFhYRlVOICA5NiAgICAgICAvKiBSRURJUkVDVCAqLworI2RlZmluZSBYWFdSTCAgOTcJLyogV1JJVEUtTElORSAqLworI2RlZmluZSBYWFJFWFggOTgJLyogUmV4eCAqLworI2RlZmluZSBYWE1JTlAgMTAwCS8qIE1JTlBVVCAqLworI2RlZmluZSBYWFJTRU4gMTAxCS8qIFJFU0VORCAqLworI2RlZmluZSBYWFBTRU4gMTAyCS8qIFBTRU5EICovCisjZGVmaW5lIFhYR0VUQyAxMDMJLyogR0VUQyAqLworI2RlZmluZSBYWEVWQUwgMTA0CS8qIEVWQUxVQVRFICovCisjZGVmaW5lIFhYRldEICAxMDUJLyogRk9SV0FSRCAqLworI2RlZmluZSBYWFVQRCAgMTA2ICAgICAgLyogVVBEQVRFUyAqLworI2RlZmluZSBYWEJFRVAgMTA3ICAgICAgLyogQkVFUCAqLworI2RlZmluZSBYWE1PVkUgMTA4ICAgICAgLyogTU9WRSAqLworI2RlZmluZSBYWE1NT1ZFIDEwOSAgICAgLyogTU1PVkUgKi8KKyNkZWZpbmUgWFhSRUdFVCAxMTAgICAgIC8qIFJFR0VUICovCisjZGVmaW5lIFhYTE9PSyAgMTExCS8qIExPT0tVUCAqLworI2RlZmluZSBYWFZJRVcgIDExMiAgICAgLyogVklFVyAodGVybWluYWwgYnVmZmVyKSAqLworI2RlZmluZSBYWEFOU1cgIDExMwkvKiBBTlNXRVIgKHRoZSBwaG9uZSkgKi8KKyNkZWZpbmUgWFhQRElBICAxMTQJLyogUERJQUwgKHBhcnRpYWwgZGlhbCkgKi8KKyNkZWZpbmUgWFhBU0MgICAxMTUJLyogQVNDSUkgLyBURVhUICovCisjZGVmaW5lIFhYQklOICAgMTE2CS8qIEJJTkFSWSAqLworI2RlZmluZSBYWEZUUCAgIDExNwkvKiBGVFAgKi8KKyNkZWZpbmUgWFhNS0RJUiAxMTgJLyogTUtESVIgKi8KKyNkZWZpbmUgWFhSTURJUiAxMTkJLyogUk1ESVIgKi8KKyNkZWZpbmUgWFhURUxPUCAxMjAJLyogVEVMT1BUICovCisjZGVmaW5lIFhYUkxPRyAgMTIxCS8qIFJMT0dJTiAqLworI2RlZmluZSBYWFVOREVGIDEyMgkvKiBVTkRFRklORSAqLworI2RlZmluZSBYWE5QU0ggIDEyMwkvKiBOT1BVU0ggKi8KKyNkZWZpbmUgWFhBREQgICAxMjQJLyogQUREICovCisjZGVmaW5lIEFERF9TTkQgICAwICAgICAvKiBBREQgU0VORC1MSVNUICovCisjZGVmaW5lIEFERF9CSU4gICAxICAgICAvKiBBREQgQklOQVJZLVBBVFRFUk5TICovCisjZGVmaW5lIEFERF9UWFQgICAyICAgICAvKiBBREQgVEVYVC1QQVRURVJOUyAqLworI2RlZmluZSBYWExPQ0FMIDEyNQkvKiBMT0NBTCAqLworI2RlZmluZSBYWEtFUk1JIDEyNgkvKiBLRVJNSVQgKi8KKyNkZWZpbmUgWFhEQVRFICAxMjcJLyogREFURSAqLworI2RlZmluZSBYWFNXSVQgIDEyOCAgICAgLyogU1dJVENIICovCisjZGVmaW5lIFhYWEZXRCAgMTI5CS8qIF9GT1JXQVJEICovCisjZGVmaW5lIFhYU0FWRSAgMTMwICAgICAvKiBTQVZFICovCisjZGVmaW5lIFhYWEVDSCAgMTMxICAgICAvKiBYRUNITyAqLworI2RlZmluZSBYWFJEQkwgIDEzMiAgICAgLyogUkVBREJMT0NLICovCisjZGVmaW5lIFhYV1JCTCAgMTMzICAgICAvKiBXUklURUJMT0NLICovCisjZGVmaW5lIFhYUkVUUiAgMTM0ICAgICAvKiBSRVRSSUVWRSAqLworI2RlZmluZSBYWEVJR0hUIDEzNSAgICAgLyogRUlHSFRCSVQgKi8KKyNkZWZpbmUgWFhFRElUICAxMzYJLyogRURJVCAqLworI2RlZmluZSBYWENTRU4gIDEzNwkvKiBDU0VORCAqLworI2RlZmluZSBYWENSRUMgIDEzOAkvKiBDUkVDRUlWRSAqLworI2RlZmluZSBYWENRICAgIDEzOQkvKiBDUSAqLworI2RlZmluZSBYWFRBUEkgIDE0MCAgICAgLyogVEFQSSBhY3Rpb25zIHN1Y2ggYXMgZGlhbG9ncyAqLworI2RlZmluZSBYWFJFUyAgIDE0MSAgICAgLyogUkVTRVQgKi8KKyNkZWZpbmUgWFhDR0VUICAxNDIgICAgIC8qIENHRVQgKi8KKyNkZWZpbmUgWFhGVU5DICAxNDMgICAgIC8qIEZ1bmN0aW9uIChoZWxwLW9ubHkpICovCisjZGVmaW5lIFhYS1ZSQiAgMTQ0ICAgICAvKiBLdmVyYiAoaGVscC1vbmx5KSAqLworI2RlZmluZSBYWEJST1dTIDE0NQkvKiBCUk9XU0UgKi8KKyNkZWZpbmUgWFhNR0VUICAxNDYJLyogTUdFVCAqLworI2RlZmluZSBYWEJBQ0sgIDE0NwkvKiBCQUNLICovCisjZGVmaW5lIFhYV0hFUkUgMTQ4CS8qIFdIRVJFICovCisjZGVmaW5lIFhYUkVETyAgMTQ5ICAgICAvKiBSRURPICovCisjZGVmaW5lIFhYRVhDSCAgMTUwICAgICAvKiBFWENIQU5HRSAqLworI2RlZmluZSBYWFJFTVYgIDE1MSAgICAgLyogUkVNT1ZFICovCisjZGVmaW5lIFhYQ0hSVCAgMTUyCS8qIENIUk9PVCAqLworI2RlZmluZSBYWE9QVFMgIDE1MwkvKiBPcHRpb25zIChoZWxwLW9ubHkpICovCisjZGVmaW5lIFhYQVVUSCAgMTU0CS8qIEFVVEhPUklaRSAqLworI2RlZmluZSBYWFBJUEUgIDE1NQkvKiBQSVBFICovCisjZGVmaW5lIFhYU1NIICAgMTU2CS8qIFNTSCAqLworI2RlZmluZSBYWFRFUk0gIDE1NyAgICAgLyogVEVSTUlOQUwgKi8KKyNkZWZpbmUgWFhTVEFUVVMgMTU4ICAgIC8qIFNUQVRVUyAqLworI2RlZmluZSBYWENQUiAgIDE1OQkvKiBDT1BZUklHSFQgKi8KKyNkZWZpbmUgWFhBU1NFUiAxNjAJLyogQVNTRVJUICovCisjZGVmaW5lIFhYU1VDQyAgMTYxICAgICAvKiBTVUNDRUVEICovCisjZGVmaW5lIFhYRkFJTCAgMTYyICAgICAvKiBGQUlMICovCisjZGVmaW5lIFhYTE9HSU4gMTYzICAgICAvKiBMT0dJTiAqLworI2RlZmluZSBYWExPR09VVCAxNjQgICAgLyogTE9HT1VUICovCisjZGVmaW5lIFhYTkxDTCAgMTY1ICAgICAvKiBOT0xPQ0FMICovCisjZGVmaW5lIFhYV0lMRCAgMTY2ICAgICAvKiBXSUxEQ0FSRFMgKGhlbHAtb25seSkgKi8KKworLyogT25lLXdvcmQgc3lub255bXMgZm9yIFJFTU9URSBjb21tYW5kcyAqLworCisjZGVmaW5lIFhYUkNQWSAgMTY3CS8qIFJFTU9URSBDT1BZICovCisjZGVmaW5lIFhYUkNXRCAgMTY4CS8qIENoYW5nZSBXb3JraW5nIERpcmVjdG9yeSAqLworI2RlZmluZSBYWFJERUwgIDE2OQkvKiBEZWxldGUgKi8KKyNkZWZpbmUgWFhSRElSICAxNzAJLyogRGlyZWN0b3J5ICovCisjZGVmaW5lIFhYUkhMUCAgMTcxCS8qIEhlbHAgKi8KKyNkZWZpbmUgWFhSSE9TICAxNzIJLyogSG9zdCAqLworI2RlZmluZSBYWFJLRVIgIDE3MwkvKiBLZXJtaXQgKi8KKyNkZWZpbmUgWFhSTVNHICAxNzQJLyogTWVzc2FnZSAqLworI2RlZmluZSBYWFJQUkkgIDE3NQkvKiBQcmludCAqLworI2RlZmluZSBYWFJSRU4gIDE3NgkvKiBSZW5hbWUgKi8KKyNkZWZpbmUgWFhSU0VUICAxNzcJLyogU2V0ICovCisjZGVmaW5lIFhYUlNQQSAgMTc4CS8qIFNwYWNlICovCisjZGVmaW5lIFhYUlNVQiAgMTc5CS8qIFN1Ym1pdCAqLworI2RlZmluZSBYWFJUWVAgIDE4MAkvKiBUeXBlICovCisjZGVmaW5lIFhYUldITyAgMTgxCS8qIFdobyAqLworI2RlZmluZSBYWFJQV0QgIDE4MgkvKiBQcmludCBXb3JraW5nIERpcmVjdG9yeSAqLworI2RlZmluZSBYWFJRVUUgIDE4MwkvKiBRdWVyeSAqLworI2RlZmluZSBYWFJBU0cgIDE4NAkvKiBBc3NpZ24gKi8KKyNkZWZpbmUgWFhSTUtEICAxODUJLyogbWtkaXIgKi8KKyNkZWZpbmUgWFhSUk1EICAxODYJLyogcm1kaXIgKi8KKyNkZWZpbmUgWFhSWElUICAxODcJLyogRXhpdCAqLworCisvKiBUb3AtTGV2ZWwgY29tbWFuZHMsIGNvbnQnZC4uLiAqLworCisjZGVmaW5lIFhYR0VUSyAgMTg4CS8qIEdFVEtFWUNPREUgKi8KKyNkZWZpbmUgWFhNT1JFICAxODkJLyogTU9SRSAqLworI2RlZmluZSBYWFhPUFRTIDE5MAkvKiBFeHRlbmRlZC1PcHRpb25zIChoZWxwLW9ubHkpICovCisjZGVmaW5lIFhYSUtTRCAgMTkxCS8qIElLU0QgKi8KKyNkZWZpbmUgWFhSRVNFVCAxOTIJLyogUkVTRVQgKi8KKyNkZWZpbmUgWFhBU1NPQyAxOTMgICAgIC8qIEFTU09DSUFURSAqLworCisjZGVmaW5lIEFTU09DX0ZDICAwICAgICAvKiBBU1NPQ0lBVEUgRklMRS1DSEFSQUNURVItU0VUICovCisjZGVmaW5lIEFTU09DX1RDICAxICAgICAvKiBBU1NPQ0lBVEUgVFJBTlNGRVItQ0hBUkFDVEVSLVNFVCAqLworCisjZGVmaW5lIFhYU0hJRlQgMTk0CS8qIFNISUZUICovCisjZGVmaW5lIFhYTUFOICAgMTk1ICAgICAvKiBNQU5VQUwgKi8KKyNkZWZpbmUgWFhMUyAgICAxOTYgICAgIC8qIExTICovCisjZGVmaW5lIFhYU09SVCAgMTk3CS8qIFNPUlQgKi8KKyNkZWZpbmUgWFhQVVJHRSAxOTgJLyogUFVSR0UgKi8KKyNkZWZpbmUgWFhGQVNUICAxOTkJLyogRkFTVCAqLworI2RlZmluZSBYWENBVSAgIDIwMAkvKiBDQVVUSU9VUyAqLworI2RlZmluZSBYWFJPQiAgIDIwMQkvKiBST0JVU1QgKi8KKyNkZWZpbmUgWFhNQUNSTyAyMDIgICAgIC8qIEltbWVkaWF0ZSBtYWNybyAqLworI2RlZmluZSBYWFNDUk4gIDIwMwkvKiBTQ1JFRU4gKi8KKyNkZWZpbmUgWFhMTk9VVCAyMDQgICAgIC8qIExJTkVPVVQgKi8KKyNkZWZpbmUgWFhfSU5DUiAyMDUJLyogX0lOQ1JFTUVOVCAqLworI2RlZmluZSBYWF9ERUNSIDIwNgkvKiBfREVDUkVNRU5UICovCisjZGVmaW5lIFhYX0VWQUwgMjA3CS8qIF9FVkFMVUFURSAqLworI2RlZmluZSBYWEFSUkFZIDIwOAkvKiBBUlJBWSAqLworI2RlZmluZSBYWFBBUlNFIDIwOQkvKiBQQVJTRSAqLworI2RlZmluZSBYWEhUVFAgIDIxMCAgICAgLyogSFRUUCAqLworCisjaWZkZWYgQ0tDSEFOTkVMSU8KKyNkZWZpbmUgWFhGSUxFICAyMTEJLyogRklMRSAqLworI2RlZmluZSBYWEZfQ0wgIDIxMgkvKiBGQ0xPU0UgKi8KKyNkZWZpbmUgWFhGX0ZMICAyMTMJLyogRkZMVVNIICovCisjZGVmaW5lIFhYRl9MSSAgMjE0CS8qIEZMSVNUICovCisjZGVmaW5lIFhYRl9PUCAgMjE1CS8qIEZPUEVOICovCisjZGVmaW5lIFhYRl9SRSAgMjE2CS8qIEZSRUFEICovCisjZGVmaW5lIFhYRl9TRSAgMjE3CS8qIEZTRUVLICovCisjZGVmaW5lIFhYRl9TVCAgMjE4CS8qIEZTVEFUVVMgKi8KKyNkZWZpbmUgWFhGX1dSICAyMTkJLyogRldSSVRFICovCisjZGVmaW5lIFhYRl9SVyAgMjIwCS8qIEZSRVdJTkQgKi8KKyNkZWZpbmUgWFhGX0NPICAyMjEJLyogRkNPVU5UICovCisjZW5kaWYgLyogQ0tDSEFOTkVMSU8gKi8KKworI2RlZmluZSBYWEVYRUMgIDIyMgkvKiBleGVjKCkgKi8KKyNkZWZpbmUgWFhUUkFDRSAyMjMJLyogVFJBQ0UgKi8KKyNkZWZpbmUgWFhOT1RBViAyMjQJLyogVGhlICJub3QgYXZhaWxhYmxlIiBjb21tYW5kICovCisjZGVmaW5lIFhYUFRZICAgMjI1ICAgICAvKiBQVFkgKGxpa2UgUElQRSkgKi8KKyNkZWZpbmUgWFhDSE1PRCAyMjYgICAgIC8qIENITU9EICovCisjZGVmaW5lIFhYUFJPTVAgMjI3CS8qIFBST01QVCAqLworI2RlZmluZSBYWEZFQUNIIDIyOAkvKiBGT1JFQUNIICovCisjZGVmaW5lIFhYR1JFUCAgMjI5ICAgICAvKiBHUkVQICovCisjZGVmaW5lIFhYU0VYUCAgMjMwCS8qIFMtRXhwcmVzc2lvbiAqLworI2RlZmluZSBYWFVORENMIDIzMQkvKiBVTkRFQ0xBUkUgKi8KKyNkZWZpbmUgWFhWT0lEICAyMzIgICAgIC8qIFZPSUQgKi8KKyNkZWZpbmUgWFhQVVQgICAyMzMJLyogUFVUICovCisjZGVmaW5lIFhYVU5ERlggMjM0CS8qIF9VTkRFRklORSAqLworI2RlZmluZSBYWEhFQUQgIDIzNSAgICAgLyogSEVBRCAqLworI2RlZmluZSBYWFRBSUwgIDIzNiAgICAgLyogVEFJTCAqLworI2RlZmluZSBYWERFQlVHIDIzNyAgICAgLyogREVCVUcgKi8KKyNkZWZpbmUgWFhMRUFSTiAyMzggICAgIC8qIExFQVJOICovCisjZGVmaW5lIFhYUEFUICAgMjM5ICAgICAvKiBQQVRURVJOUyAoaGVscCBvbmx5KSAqLworCisjZGVmaW5lIFhYQ0RVUCAgMjQwICAgICAvKiBDRFVQIChDaGFuZ2Ugd29ya2luZyBkaXJlY3RvcnkgdXB3YXJkcykgKi8KKyNkZWZpbmUgWFhSQ0RVUCAyNDEgICAgIC8qIFJFTU9URSBDRFVQICovCisjZGVmaW5lIFhYQ0FUICAgMjQyCS8qIENBVCAoPSBUWVBFIC9OT1BBR0UpICovCisjZGVmaW5lIFhYRklSRVcgMjQzICAgICAvKiBGSVJFV0FMTCAoaGVscCBvbmx5KSAqLworCisjZGVmaW5lIFhYTENXRCAgMjQ0CS8qIExvY2FsIEMoVylEICovCisjZGVmaW5lIFhYTENEVSAgMjQ1CS8qIExvY2FsIENEVVAgKi8KKyNkZWZpbmUgWFhMUFdEICAyNDYJLyogTG9jYWwgUFdEICovCisjZGVmaW5lIFhYTERFTCAgMjQ3CS8qIExvY2FsIERFTEVURSAqLworI2RlZmluZSBYWExESVIgIDI0OAkvKiBMb2NhbCBESVJFQ1RPUlkgKi8KKyNkZWZpbmUgWFhMUkVOICAyNDkJLyogTG9jYWwgUkVOQU1FICovCisjZGVmaW5lIFhYTE1LRCAgMjUwCS8qIExvY2FsIE1LRElSICovCisjZGVmaW5lIFhYTFJNRCAgMjUxCS8qIExvY2FsIFJNRElSICovCisjZGVmaW5lIFhYVVNFUiAgMjUyCS8qIChGVFApIFVTRVIgKi8KKyNkZWZpbmUgWFhBQ0NUICAyNTMJLyogKEZUUCkgQUNDT1VOVCAqLworI2RlZmluZSBYWExJTksgIDI1NCAgICAgLyogTElOSyBzb3VyY2UgZGVzdGluYXRpb24gKi8KKyNkZWZpbmUgWFhPUklFICAyNTUJLyogT1JJRU5UKEFUSU9OKSAqLworI2RlZmluZSBYWERJQUxFUiAyNTYgICAgLyogRElBTEVSICovCisjZGVmaW5lIFhYS0NEICAgMjU3ICAgICAvKiBLQ0QgKi8KKyNkZWZpbmUgWFhTSVRFICAyNTggICAgIC8qIChGVFApIFNJVEUgKi8KKyNkZWZpbmUgWFhQQVNWICAyNTkgICAgIC8qIChGVFApIFBBU1NJVkUgKi8KKyNkZWZpbmUgWFhDT05UICAyNjAJLyogQ09OVElOVUUgKi8KKyNkZWZpbmUgWFhOU0NSICAyNjEJLyogTk9TQ1JPTEwgKi8KKyNkZWZpbmUgWFhTRlRQICAyNjIJLyogU0ZUUCAqLworI2RlZmluZSBYWFNLUk0gIDI2MwkvKiBTS0VSTUlUICovCisKKy8qIEVuZCBvZiBUb3AtTGV2ZWwgQ29tbWFuZHMgKi8KKworI2RlZmluZSBTQ05fQ0xSICAgMAkJCS8qIFNDUkVFTiBDTEVBUiAqLworI2RlZmluZSBTQ05fQ0xFICAgMQkJCS8qIFNDUkVFTiBDTEVPTCAqLworI2RlZmluZSBTQ05fTU9WICAgMgkJCS8qIFNDUkVFTiBNT1ZFICovCisKKy8qIEFSUkFZIG9wZXJhdGlvbnMgKi8KKworI2RlZmluZSBBUlJfRENMICAgMAkJCS8qIERlY2xhcmUgKi8KKyNkZWZpbmUgQVJSX0NQWSAgIDEJCQkvKiBDb3B5ICovCisjZGVmaW5lIEFSUl9SU1ogICAyCQkJLyogUmVzaXplICovCisjZGVmaW5lIEFSUl9TUlQgICAzCQkJLyogU29ydCAqLworI2RlZmluZSBBUlJfQ0xSICAgNAkJCS8qIENsZWFyICovCisjZGVmaW5lIEFSUl9TRUEgICA1CQkJLyogU2VhcmNoICovCisjZGVmaW5lIEFSUl9EU1QgICA2CQkJLyogRGVzdHJveSAqLworI2RlZmluZSBBUlJfU0hPICAgNwkJCS8qIFNob3cgKi8KKyNkZWZpbmUgQVJSX1NFVCAgIDgJCQkvKiBTZXQgKi8KKyNkZWZpbmUgQVJSX0VRVSAgIDkJCQkvKiBFcXVhdGUgKi8KKworLyogU09SVCBvcHRpb25zICovCisKKyNkZWZpbmUgU1JUX0NBUyAgIDAJCQkvKiAvQ0FTRSAqLworI2RlZmluZSBTUlRfS0VZICAgMQkJCS8qIC9LRVk6biAqLworI2RlZmluZSBTUlRfUkVWICAgMgkJCS8qIC9SRVZFUlNFICovCisjZGVmaW5lIFNSVF9STkcgICAzCQkJLyogL1JBTkdFOm46bSAqLworI2RlZmluZSBTUlRfTlVNICAgNAkJCS8qIC9OVU1FUklDICovCisKKy8qIFBVUkdFIGNvbW1hbmQgb3B0aW9ucyAqLworCisjZGVmaW5lIFBVX0tFRVAgMAkJCS8qIC9LRUVQOiAqLworI2RlZmluZSBQVV9MSVNUIDEJCQkvKiAvTElTVCAqLworI2RlZmluZSBQVV9QQUdFIDIJCQkvKiAvUEFHRSAqLworI2RlZmluZSBQVV9OT1BBIDMJCQkvKiAvTk9QQUdFICovCisjZGVmaW5lIFBVX05PREUgNAkJCS8qIC9TSU1VTEFURSAqLworI2RlZmluZSBQVV9ERUxFIDUJCQkvKiAvREVMRVRFICovCisjZGVmaW5lIFBVX05PTEkgNgkJCS8qIC9OT0xJU1QgKi8KKyNkZWZpbmUgUFVfUVVJRSA3CQkJLyogL1FVSUVUICg9IE5PTElTVCkgKi8KKyNkZWZpbmUgUFVfVkVSQiA4CQkJLyogL1ZFUkJPU0UgKD0gTElTVCkgKi8KKyNkZWZpbmUgUFVfQVNLICA5CQkJLyogL0FTSyAqLworI2RlZmluZSBQVV9OQVNLIDEwCQkJLyogL05PQVNLICovCisjZGVmaW5lIFBVX0xBUiAgMTEJCQkvKiAvTEFSR0VSLVRIQU46ICovCisjZGVmaW5lIFBVX1NNQSAgMTIJCQkvKiAvU01BTExFUi1USEFOOiAqLworI2RlZmluZSBQVV9BRlQgIDEzCQkJLyogL0FGVEVSOiAqLworI2RlZmluZSBQVV9OQUYgIDE0CQkJLyogL05PVC1BRlRFUjogKi8KKyNkZWZpbmUgUFVfQkVGICAxNQkJCS8qIC9CRUZPUkU6ICovCisjZGVmaW5lIFBVX05CRiAgMTYJCQkvKiAvTk9ULUJFRk9SRTogKi8KKyNkZWZpbmUgUFVfRVhDICAxNwkJCS8qIC9FWENFUFQ6ICovCisjZGVmaW5lIFBVX1JFQ1UgMTgJCQkvKiAvUkVDVVJTSVZFICovCisjZGVmaW5lIFBVX0RPVCAgMTkJCQkvKiAvRE9URklMRVMgKi8KKyNkZWZpbmUgUFVfTk9ET1QgMjAJCQkvKiAvTk9ET1RGSUxFUyAqLworI2RlZmluZSBQVV9IREcgIDIxCQkJLyogL0hFQURJTkcgKi8KKyNkZWZpbmUgUFVfTk9IICAyMgkJCS8qIC9OT0hFQURJTkcgKi8KKworLyogREVMRVRFIGNvbW1hbmQgb3B0aW9ucyAqLworCisjZGVmaW5lIERFTF9OT0wgMAkJCS8qIC9OT0xJU1QgKi8KKyNkZWZpbmUgREVMX0xJUyAxCQkJLyogL0xJU1QgKi8KKyNkZWZpbmUgREVMX0hERyAyCQkJLyogL0hFQURJTkdTICovCisjZGVmaW5lIERFTF9OT0ggMgkJCS8qIC9OT0hFQURJTkdTICovCisjZGVmaW5lIERFTF9CRUYgMwkJCS8qIC9CRUZPUkU6ICovCisjZGVmaW5lIERFTF9OQkYgNAkJCS8qIC9OT1QtQkVGT1JFOiAqLworI2RlZmluZSBERUxfQUZUIDUJCQkvKiAvQUZURVI6ICovCisjZGVmaW5lIERFTF9OQUYgNgkJCS8qIC9OT1QtQUZURVI6ICovCisjZGVmaW5lIERFTF9ET1QgNwkJCS8qIC9ET1RGSUxFUyAqLworI2RlZmluZSBERUxfTk9EIDgJCQkvKiAvTk9ET1RGSUxFUyAqLworI2RlZmluZSBERUxfRVhDIDkJCQkvKiAvRVhDRVBUOiovCisjZGVmaW5lIERFTF9QQUcgMTAJCQkvKiAvUEFHRSAqLworI2RlZmluZSBERUxfTk9QIDExCQkJLyogL05PUEFHRSAqLworI2RlZmluZSBERUxfUkVDIDEyCQkJLyogL1JFQ1VSU0lWRSAqLworI2RlZmluZSBERUxfTk9SIDEzCQkJLyogL05PUkVDVVJTSVZFICovCisjZGVmaW5lIERFTF9WUkIgMTQJCQkvKiAvVkVSQk9TRSAqLworI2RlZmluZSBERUxfUVVJIDE1CQkJLyogL1FVSUVUICovCisjZGVmaW5lIERFTF9TTUEgMTYJCQkvKiAvU01BTExFUi1USEFOOiAqLworI2RlZmluZSBERUxfTEFSIDE3CQkJLyogL0xBUkdFUi1USEFOOiAqLworI2RlZmluZSBERUxfU0lNIDE4CQkJLyogL1NJTVVMQVRFICovCisjZGVmaW5lIERFTF9BU0sgMTkJCQkvKiAvQVNLICovCisjZGVmaW5lIERFTF9OQVMgMjAJCQkvKiAvTk9BU0sgKi8KKyNkZWZpbmUgREVMX1NVTSAyMQkJCS8qIC9TVU1NQVJZICovCisjZGVmaW5lIERFTF9ESVIgMjIJCQkvKiAvRElSRUNUT1JZICovCisjZGVmaW5lIERFTF9BTEwgMjMJCQkvKiAvQUxMICovCisjZGVmaW5lIERFTF9UWVAgMjQJCQkvKiAvVFlQRTogKi8KKyNkZWZpbmUgREVMX0xOSyAyNQkJCS8qIC9GT0xMT1dMSU5LUyAqLworI2RlZmluZSBERUxfTkxLIDI2CQkJLyogL05PRk9MTE9XTElOS1MgKi8KKworLyogRklMRSBvcGVyYXRpb25zICovCisKKyNkZWZpbmUgRklMX09QTiAgMAkJCS8qIE9QRU4gKi8KKyNkZWZpbmUgRklMX0NMUyAgMQkJCS8qIENMT1NFICovCisjZGVmaW5lIEZJTF9SRUEgIDIJCQkvKiBSRUFEICovCisjZGVmaW5lIEZJTF9HRVQgIDMJCQkvKiBHRVQgKi8KKyNkZWZpbmUgRklMX1dSSSAgNAkJCS8qIFdSSVRFICovCisjZGVmaW5lIEZJTF9SRVcgIDUJCQkvKiBSRVdJTkQgKi8KKyNkZWZpbmUgRklMX0xJUyAgNgkJCS8qIExJU1QgKi8KKyNkZWZpbmUgRklMX0ZMVSAgNwkJCS8qIEZMVVNIICovCisjZGVmaW5lIEZJTF9TRUUgIDgJCQkvKiBTRUVLICovCisjZGVmaW5lIEZJTF9TVEEgIDkJCQkvKiBTVEFUVVMgKi8KKyNkZWZpbmUgRklMX0NPVSAxMAkJCS8qIENPVU5UICovCisKKy8qIE9QRU4gLyBDTE9TRSBpdGVtcyAqLworCisjZGVmaW5lIE9QTl9GSV9SIDEJCQkvKiBGSUxFIFJFQUQgKi8KKyNkZWZpbmUgT1BOX0ZJX1cgMgkJCS8qIEZJTEUgV1JJVEUgKi8KKyNkZWZpbmUgT1BOX0ZJX0EgMwkJCS8qIEZJTEUgQVBQRU5EICovCisjZGVmaW5lIE9QTl9QSV9SIDQJCQkvKiBQSVBFIFJFQUQgKi8KKyNkZWZpbmUgT1BOX1BJX1cgNQkJCS8qIFBJUEUgV1JJVEUgKi8KKyNkZWZpbmUgT1BOX1BUX1IgNgkJCS8qIFBUWSBSRUFEICovCisjZGVmaW5lIE9QTl9QVF9XIDcJCQkvKiBQVFkgV1JJVEUgKi8KKyNkZWZpbmUgT1BOX1NFUgkgOAkJCS8qIFBPUlQgb3IgTElORSAqLworI2RlZmluZSBPUE5fTkVUCSA5CQkJLyogSE9TVCAqLworCisvKiBLRVJCRVJPUyBjb21tYW5kIHN3aXRjaGVzICovCisKKyNkZWZpbmUgS1JCX1NfVkUgIDAJLyogL1ZFUlNJT04gKi8KKyNkZWZpbmUgS1JCX1NfQ0EgIDEJLyogL0NBQ0hFOiAqLworI2RlZmluZSBLUkJfU19NQVggMQkvKiBIaWdoZXN0IEtFUkJFUk9TIHN3aXRjaCBudW1iZXIgKi8KKworI2lmZGVmIENLX0tFUkJFUk9TCisKKy8qIEtFUkJFUk9TIGFjdGlvbnMgKi8KKworI2RlZmluZSBLUkJfQV9JTiAgMAkvKiBJTklUSUFMSVpFICovCisjZGVmaW5lIEtSQl9BX0RFICAxCS8qIERFU1RST1kgKi8KKyNkZWZpbmUgS1JCX0FfTEMgIDIJLyogTElTVC1DUkVERU5USUFMUyAqLworCisvKiBLRVJCRVJPUyBJTklUIHN3aXRjaGVzICovCisKKyNkZWZpbmUgS1JCX0lfRlcgIDAJLyogL0ZPUldBUkRBQkxFICovCisjZGVmaW5lIEtSQl9JX0xGICAxCS8qIC9MSUZFVElNRTogKi8KKyNkZWZpbmUgS1JCX0lfUEQgIDIJLyogL1BPU1REQVRFOiAqLworI2RlZmluZSBLUkJfSV9QUiAgMwkvKiAvUFJPWElBQkxFICovCisjZGVmaW5lIEtSQl9JX1JCICA0CS8qIC9SRU5FV0FCTEU6ICovCisjZGVmaW5lIEtSQl9JX1JOICA1CS8qIC9SRU5FVyAqLworI2RlZmluZSBLUkJfSV9TUiAgNgkvKiAvU0VSVklDRTogKi8KKyNkZWZpbmUgS1JCX0lfVkEgIDcJLyogL1ZBTElEQVRFICovCisjZGVmaW5lIEtSQl9JX1JMICA4ICAgICAvKiAvUkVBTE06ICovCisjZGVmaW5lIEtSQl9JX0lOICA5ICAgICAvKiAvSU5TVEFOQ0U6ICovCisjZGVmaW5lIEtSQl9JX1BXICAxMCAgICAvKiAvUEFTU1dPUkQ6ICovCisjZGVmaW5lIEtSQl9JX1BBICAxMSAgICAvKiAvUFJFQVVUSCAqLworI2RlZmluZSBLUkJfSV9WQiAgMTIgICAgLyogL1ZFUkJPU0UgKi8KKyNkZWZpbmUgS1JCX0lfQlIgIDEzICAgIC8qIC9CUklFRiAqLworI2RlZmluZSBLUkJfSV9ORlcgMTQJLyogL05PVC1GT1JXQVJEQUJMRSAqLworI2RlZmluZSBLUkJfSV9OUFIgMTUJLyogL05PVC1QUk9YSUFCTEUgKi8KKyNkZWZpbmUgS1JCX0lfTlBBIDE2ICAgIC8qIC9OT1QtUFJFQVVUSCAqLworI2RlZmluZSBLUkJfSV9LNCAgMTcgICAgLyogL0tFUkJFUk9TNCAgICAoc2hvdWxkIGs1IGdldCBrNCBhcyB3ZWxsKSAqLworI2RlZmluZSBLUkJfSV9OSzQgMTggICAgLyogL05PLUtFUkJFUk9TNCAqLworI2RlZmluZSBLUkJfSV9QT1AgMTkgICAgLyogL1BPUFVQICovCisjZGVmaW5lIEtSQl9JX0FEUiAyMCAgICAvKiAvQUREUkVTU0VTOiAqLworI2RlZmluZSBLUkJfSV9OQUQgMjEgICAgLyogL05PLUFERFJFU1NFUyAqLworI2RlZmluZSBLUkJfSV9NQVggMjEgICAgLyogSGlnaGVzdCBLRVJCRVJPUyBJTklUIHN3aXRjaCBudW1iZXIgKi8KKworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKy8qIFNFVCBwYXJhbWV0ZXJzICovCisKKyNkZWZpbmUgWFlCUkVBICAwCS8qIEJSRUFLIHNpbXVsYXRpb24gKi8KKyNkZWZpbmUgWFlDSEtUICAxCS8qIEJsb2NrIGNoZWNrIHR5cGUgKi8KKyNkZWZpbmUgWFlERUJVICAyCS8qIERlYnVnZ2luZyAqLworI2RlZmluZSBYWURFTEEgIDMJLyogRGVsYXkgKi8KKyNkZWZpbmUgWFlEVVBMICA0CS8qIER1cGxleCAqLworI2RlZmluZSBYWUVPTCAgIDUJLyogRW5kLU9mLUxpbmUgKHBhY2tldCB0ZXJtaW5hdG9yKSAqLworI2RlZmluZSBYWUVTQyAgIDYJLyogRXNjYXBlIGNoYXJhY3RlciAqLworI2RlZmluZSBYWUZJTEUgIDcJLyogRmlsZSBQYXJhbWV0ZXJzIChzZWUgY2tja2VyLmggZm9yIHZhbHVlcykgKi8KKwkJCS8qICh0aGlzIHNwYWNlIGF2YWlsYWJsZSkgKi8KKyNkZWZpbmUgWFlGTE9XICA5CS8qIEZsb3cgQ29udHJvbCAqLworI2RlZmluZSBYWUhBTkQgMTAJLyogSGFuZHNoYWtlICovCisjZGVmaW5lIFhZSUZEICAxMQkvKiBJbmNvbXBsZXRlIEZpbGUgRGlzcG9zaXRpb24gKi8KKyNkZWZpbmUgWFlJTUFHIDEyCS8qICJJbWFnZSBNb2RlIiAqLworI2RlZmluZSBYWUlOUFUgMTMJLyogSU5QVVQgY29tbWFuZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFhZTEVOICAxNAkvKiBNYXhpbXVtIHBhY2tldCBsZW5ndGggdG8gc2VuZCAqLworI2RlZmluZSBYWUxJTkUgMTUJLyogQ29tbXVuaWNhdGlvbiBsaW5lIHRvIHVzZSAqLworCisvKiBTRVQgTElORSAvIFNFVCBIT1NUIGNvbW1hbmQgc3dpdGNoZXMgKi8KKworI2RlZmluZSBTTF9DTlggICAwCS8qIC9DT05ORUNUICovCisjZGVmaW5lIFNMX1NSViAgIDEJLyogL1NFUlZFUiAqLworI2RlZmluZSBTTF9TSFIgICAyCS8qIC9TSEFSRSAqLworI2RlZmluZSBTTF9OU0ggICAzCS8qIC9OT1NIQVJFICovCisjZGVmaW5lIFNMX0JFRSAgIDQJLyogL0JFRVAgKi8KKyNkZWZpbmUgU0xfQU5TICAgNQkvKiAvQU5TV0VSICovCisjZGVmaW5lIFNMX0RJQSAgIDYJLyogL0RJQUw6eHh4ICovCisjZGVmaW5lIFNMX1NQRCAgIDcJLyogL1NQRUVEOnh4eCAqLworI2RlZmluZSBTTF9GTE8gICA4CS8qIC9GTE9XOnh4eCAqLworI2RlZmluZSBTTF9UTU8gICA5CS8qIC9USU1FT1VUOnh4eCAqLworI2RlZmluZSBTTF9DTUQgIDEwCS8qIC9DT01NQU5EICovCisjZGVmaW5lIFNMX1BTVyAgMTEJLyogL1BBU1NXT1JEOnh4eCAqLworI2RlZmluZSBTTF9JS1MgIDEyICAgICAgLyogL0tFUk1JVC1TRVJWSUNFICovCisjZGVmaW5lIFNMX05FVCAgMTMgICAgICAvKiAvTkVUV09SSy1UWVBFOnh4eCAqLworI2RlZmluZSBTTF9FTkMgIDE0ICAgICAgLyogL0VOQ1JZUFQ6dHlwZSAodGVsbmV0KSAvRU5DUllQVCAocmxvZ2luKSAqLworI2RlZmluZSBTTF9LUkI0IDE1ICAgICAgLyogL0tFUkJFUk9TIDQgKHJsb2dpbi90ZWxuZXQpICovCisjZGVmaW5lIFNMX0tSQjUgMTYgICAgICAvKiAvS0VSQkVST1MgNSAocmxvZ2luL3RlbG5ldCkgKi8KKyNkZWZpbmUgU0xfU1JQICAxNyAgICAgIC8qIC9TUlAgKHRlbG5ldCkgKi8KKyNkZWZpbmUgU0xfTlRMTSAxOCAgICAgIC8qIC9OVExNICh0ZWxuZXQpICovCisjZGVmaW5lIFNMX1NTTCAgMTkgICAgICAvKiAvU1NMICh0ZWxuZXQpICovCisjZGVmaW5lIFNMX1VJRCAgMjAgICAgICAvKiAvVVNFUklEOnh4eHggKi8KKyNkZWZpbmUgU0xfQVVUSCAyMSAgICAgIC8qIC9BVVRIOnR5cGUgKi8KKyNkZWZpbmUgU0xfV0FJVCAyMgkvKiAvV0FJVCAqLworI2RlZmluZSBTTF9OT1dBSVQgMjMJLyogL05PV0FJVCAqLworI2RlZmluZSBTTF9QVFkgIDI0ICAgICAgLyogL1BUWSAqLworCisjZGVmaW5lIFhZTE9HICAxNgkvKiBMb2cgZmlsZSAqLworI2RlZmluZSBYWU1BUksgMTcJLyogU3RhcnQgb2YgUGFja2V0IG1hcmsgKi8KKyNkZWZpbmUgWFlOUEFEIDE4CS8qIEFtb3VudCBvZiBwYWRkaW5nICovCisjZGVmaW5lIFhZUEFEQyAxOQkvKiBQYWQgY2hhcmFjdGVyICovCisjZGVmaW5lIFhZUEFSSSAyMAkvKiBQYXJpdHkgKi8KKyNkZWZpbmUgWFlQQVVTIDIxCS8qIEludGVycGFja2V0IHBhdXNlICovCisjZGVmaW5lIFhZUFJPTSAyMgkvKiBQcm9ncmFtIHByb21wdCBzdHJpbmcgKi8KKyNkZWZpbmUgWFlRQklOIDIzCS8qIDh0aC1iaXQgcHJlZml4ICovCisjZGVmaW5lIFhZUUNUTCAyNAkvKiBDb250cm9sIGNoYXJhY3RlciBwcmVmaXggKi8KKyNkZWZpbmUgWFlSRVBUIDI1CS8qIFJlcGVhdCBjb3VudCBwcmVmaXggKi8KKyNkZWZpbmUgWFlSRVRSIDI2CS8qIFJldHJ5IGxpbWl0ICovCisjZGVmaW5lIFhZU1BFRSAyNwkvKiBMaW5lIHNwZWVkIChiYXVkIHJhdGUpICovCisjZGVmaW5lIFhZVEFDSCAyOAkvKiBDaGFyYWN0ZXIgdG8gYmUgZG91YmxlZCAqLworI2RlZmluZSBYWVRJTU8gMjkJLyogVGltZW91dCBpbnRlcnZhbCAqLworI2RlZmluZSBYWU1PRE0gMzAJLyogTW9kZW0gLSBhbHNvIHNlZSBYWURJQUwgKi8KKworI2RlZmluZSBYWVNFTkQgMzEJLyogU0VUIFNFTkQgcGFyYW1ldGVycyAqLworI2RlZmluZSBYWVJFQ1YgMzIgICAJLyogU0VUIFJFQ0VJVkUgcGFyYW1ldGVycyAqLworI2RlZmluZSBYWVRFUk0gMzMJLyogU0VUIFRFUk1JTkFMIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgICBYWVRCWVQgMCAgICAgIC8qICBUZXJtaW5hbCBCeXRlc2l6ZSAoNyBvciA4KSAqLworI2RlZmluZSAgIFhZVFRZUCAxICAgICAgLyogIFRlcm1pbmFsIGVtdWxhdGlvbiBUeXBlICovCisjZGVmaW5lICAgICBUVF9OT05FICAwCS8qICAgIE5PTkUsIG5vIGVtdWxhdGlvbiAqLworI2lmZGVmIE9TMgorLyoKKyAgTm90ZSwgdGhlIHN5bWJvbHMgZm9yIFZUIGFuZCBWVC1saWtlIHRlcm1pbmFscyBzaG91bGQgYmUgaW4gYXNjZW5kaW5nCisgIG51bWVyaWNhbCBvcmRlciwgc28gdGhhdCBoaWdoZXIgb25lcyBjYW4gYmUgdHJlYXRlZCBhcyBzdXBlcnNldHMgb2YKKyAgbG93ZXIgb25lcyB3aXRoIHJlc3BlY3QgdG8gY2FwYWJpbGl0aWVzLgorCisgIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlIHdpdGggdGhlIGluZmx1eCBvZiBuZXcgdGVybWluYWwgdHlwZXMuCisgIEp1c3QgbWFrZSBzdXJlIHRoYXQgdGhlIElTWFhYWFgoKSBtYWNyb3MgaW5jbHVkZSB0aGUgcHJvcGVyIGZhbWlseQorICBncm91cHMuCisqLworI2RlZmluZSAgICAgVFRfREcyMDAgICAgMSAJLyogICAgRGF0YSBHZW5lcmFsIDIwMCAqLworI2RlZmluZSAgICAgVFRfREcyMTAgICAgMiAgCS8qICAgIERhdGEgR2VuZXJhbCAyMTAgKi8KKyNkZWZpbmUgICAgIFRUX0RHMjE3ICAgIDMgICAJLyogICAgRGF0YSBHZW5lcmFsIDIxNyAqLworI2RlZmluZSAgICAgVFRfSFAyNjIxICAgNCAJLyogICAgSGV3bGV0dC1QYWNrYXJkIDI2MjFBICovCisjZGVmaW5lICAgICBUVF9IUFRFUk0gICA1CS8qICAgIEhld2xldHQtUGFja2FyZCBDb25zb2xlICovCisjZGVmaW5lICAgICBUVF9IWkwxNTAwICA2IAkvKiAgICBIYXplbHRpbmUgMTUwMCAqLworI2RlZmluZSAgICAgVFRfVkM0NDA0ICAgNyAJLyogICAgVm9sa2VyIENyYWlnIFZDNDQwNC80MDQgKi8KKyNkZWZpbmUgICAgIFRUX1dZMzAgICAgIDgJLyogICAgV1lTRS0zMC8zMCsgKi8KKyNkZWZpbmUgICAgIFRUX1dZNTAgICAgIDkgCS8qICAgIFdZU0UtNTAvNTArICovCisjZGVmaW5lICAgICBUVF9XWTYwICAgIDEwICAgICAgIC8qICAgIFdZU0UtNjAJICovCisjZGVmaW5lICAgICBUVF9XWTE2MCAgIDExICAgICAgIC8qICAgIFdZU0UtMTYwICAgKi8KKyNkZWZpbmUgICAgIFRUX1FOWCAgICAgMTIgICAgICAgLyogICAgUU5YICovCisjZGVmaW5lICAgICBUVF9RQU5TSSAgIDEzICAgICAgIC8qICAgIFFOWCBBbnNpIGVtdWxhdGlvbiAqLworI2RlZmluZSAgICAgVFRfVlQ1MiAgICAxNAkvKiAgICBERUMgVlQtNTIgICovCisjZGVmaW5lICAgICBUVF9IMTkgICAgIDE1CS8qICAgIEhlYXRoLTE5ICovCisjZGVmaW5lICAgICBUVF9JQk0zMSAgIDE2ICAgICAgIC8qICAgIElCTSAzMXh4ICovCisjZGVmaW5lICAgICBUVF9TQ09BTlNJIDE3CS8qICAgIFNDT0FOU0kgKFVuaXggbW9kZSkgKi8KKyNkZWZpbmUgICAgIFRUX0FUMzg2ICAgMTggCS8qICAgIFVuaXh3YXJlIEFUMzg2IChVbml4IG1vZGUpICovCisjZGVmaW5lICAgICBUVF9BTlNJICAgIDE5CS8qICAgIElCTSBBTlNJLlNZUyAoQkJTKSAqLworI2RlZmluZSAgICAgVFRfVklQNzgwOSAyMAkvKiAgICBIb25leXdlbGwgVklQNzgwOSAqLworI2RlZmluZSAgICAgVFRfTElOVVggICAyMSAgICAgICAvKiAgICBMaW51eCBDb25zb2xlICovCisjZGVmaW5lICAgICBUVF9IRlQgICAgIDIyICAgICAgIC8qICAgIElCTSBIaWdoIEZ1bmN0aW9uIFRlcm1pbmFsICovCisjZGVmaW5lICAgICBUVF9BSVhURVJNIDIzICAgICAgIC8qICAgIElCTSBBSVh0ZXJtICovCisjZGVmaW5lICAgICBUVF9TVU4gICAgIDI0ICAgICAgIC8qICAgIFNVTiBDb25zb2xlICovCisjZGVmaW5lICAgICBUVF9CQTgwICAgIDI1ICAgICAgIC8qICAgIE5peGRvcmYgQkE4MCAqLworI2RlZmluZSAgICAgVFRfQkVPUyAgICAyNiAgICAgICAvKiAgICBCZU9TIEFuc2kgKi8KKyNkZWZpbmUgICAgIFRUX1ZUMTAwICAgMjcJLyogICAgREVDIFZULTEwMCAqLworI2RlZmluZSAgICAgVFRfVlQxMDIgICAyOAkvKiAgICBERUMgVlQtMTAyICovCisjZGVmaW5lICAgICBUVF9WVDIyMCAgIDI5CS8qICAgIERFQyBWVC0yMjAgKi8KKyNkZWZpbmUgICAgIFRUX1ZUMjIwUEMgMzAgICAgICAgLyogICAgREVDIFZULTIyMCB3aXRoIFBDIGtleWJvYXJkICovCisjZGVmaW5lICAgICBUVF9WVDMyMCAgIDMxCS8qICAgIERFQyBWVC0zMjAgKi8KKyNkZWZpbmUgICAgIFRUX1ZUMzIwUEMgMzIJLyogICAgREVDIFZULTMyMCB3aXRoIFBDIGtleWJvYXJkICovCisjZGVmaW5lICAgICBUVF9XWTM3MCAgIDMzCS8qICAgIFdZU0UgMzcwIEFOU0kgVGVybWluYWwgKi8KKyNkZWZpbmUgICAgIFRUXzk3ODAxICAgMzQgICAgICAgLyogICAgU2luaXggOTc4MDEtNXh4IHRlcm1pbmFsICovCisjZGVmaW5lICAgICBUVF9BQUEgICAgIDM1ICAgICAgIC8qICAgIEFubiBBcmJvciBBbWJhc3NhZG9yICovCisjZGVmaW5lICAgICBUVF9UVkk5MTAgIDM2CS8qICAgIFRWSSA5MTArICovCisjZGVmaW5lICAgICBUVF9UVkk5MjUgIDM3ICAgICAgIC8qICAgIFRWSSA5MjUgICovCisjZGVmaW5lICAgICBUVF9UVkk5NTAgIDM4ICAgICAgIC8qICAgIFRWSTk1MCAgICovCisjZGVmaW5lICAgICBUVF9BRE0zQSAgIDM5ICAgICAgIC8qICAgIExTSSBBRE0gM0EgKi8KKyNkZWZpbmUgICAgIFRUX0FETTUgICAgNDAJCS8qICAgIExTSSBBRE0gNSAqLworI2RlZmluZSAgICAgVFRfVlROVCAgICA0MSAgICAgICAvKiAgICBNaWNyb3NvZnQgTlQgVmlydHVhbCBUZXJtaW5hbCAqLworI2RlZmluZSAgICAgVFRfTUFYICAgVFRfVlROVAorI2RlZmluZSAgICAgVFRfVlQ0MjAgICA5NgkvKiAgICBERUMgVlQtNDIwICovCisjZGVmaW5lICAgICBUVF9WVDUyMCAgIDk3CS8qICAgIERFQyBWVC01MjAvNTI1ICovCisjZGVmaW5lICAgICBUVF9URUs0MCA5OQkvKiAgICBUZWt0cm9uaXggNDAxeCAqLworI2RlZmluZSAgICAgVFRfS0JNX0VNQUNTICAgVFRfTUFYKzEKKyNkZWZpbmUgICAgIFRUX0tCTV9IRUJSRVcgIFRUX01BWCsyCisjZGVmaW5lICAgICBUVF9LQk1fUlVTU0lBTiBUVF9NQVgrMworI2RlZmluZSAgICAgVFRfS0JNX1dQICAgICAgVFRfTUFYKzQKKworI2RlZmluZSBJU0FBQSh4KSAgICh4ID09IFRUX0FBQSkKKyNkZWZpbmUgSVNBTlNJKHgpICAoeCA+PSBUVF9TQ09BTlNJICYmIHggPD0gVFRfQU5TSSkKKyNkZWZpbmUgSVNCQTgwKHgpICAoeCA9PSBUVF9CQTgwKQorI2RlZmluZSBJU0JFT1MoeCkgICh4ID09IFRUX0JFT1MpCisjZGVmaW5lIElTUU5YKHgpICAgKHggPT0gVFRfUU5YKQorI2RlZmluZSBJU1FBTlNJKHgpICAgKHggPT0gVFRfUUFOU0kpCisjZGVmaW5lIElTTElOVVgoeCkgKHggPT0gVFRfTElOVVgpCisjZGVmaW5lIElTU0NPKHgpICAgKHggPT0gVFRfU0NPQU5TSSkKKyNkZWZpbmUgSVNBVDM4Nih4KSAoeCA9PSBUVF9BVDM4NikKKyNkZWZpbmUgSVNBVkFUQVIoeCkgKHggPT0gVFRfQU5TSSkKKyNkZWZpbmUgSVNTVU4oeCkgICAgKHggPT0gVFRfU1VOKQorI2RlZmluZSBJU1VOSVhDT04oeCkgKHggPT0gVFRfU0NPQU5TSSB8fCB4ID09IFRUX0FUMzg2IHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICB4ID09IFRUX0xJTlVYICAgfHwgeCA9PSBUVF9TVU4pCisjZGVmaW5lIElTREcyMDAoeCkgKHggPj0gVFRfREcyMDAgJiYgeCA8PSBUVF9ERzIxNykKKyNkZWZpbmUgSVNIWkwoeCkgICAoeCA9PSBUVF9IWkwxNTAwKQorI2RlZmluZSBJU0gxOSh4KSAgICh4ID09IFRUX0gxOSkKKyNkZWZpbmUgSVNJQk0zMSh4KSAoeCA9PSBUVF9JQk0zMSkKKyNkZWZpbmUgSVNUVkkoeCkgICAoeCA+PSBUVF9UVkk5MTAgJiYgeCA8PSBUVF9UVkk5NTApCisjZGVmaW5lIElTVFZJOTEwKHgpICh4ID09IFRUX1RWSTkxMCkKKyNkZWZpbmUgSVNUVkk5MjUoeCkgKHggPT0gVFRfVFZJOTI1KQorI2RlZmluZSBJU1RWSTk1MCh4KSAoeCA9PSBUVF9UVkk5NTApCisjZGVmaW5lIElTVlQ1Mih4KSAgKHggPT0gVFRfVlQ1MiB8fCB4ID09IFRUX0gxOSkKKyNpZmRlZiBDT01NRU5UCisjZGVmaW5lIElTVlQ1MjAoeCkgKHggPT0gVFRfVlQ1MjApCisjZGVmaW5lIElTVlQ0MjAoeCkgKHggPj0gVFRfVlQ0MjAgJiYgeCA8PSBUVF9WVDUyMCkKKyNlbHNlIC8qIENPTU1FTlQgKi8KKy8qIFNpbmNlIHdlIGRvIG5vdCB5ZXQgc3VwcG9ydCA0MjAvNTIwIGV4dGVuZCAzMjAgKi8KKyNkZWZpbmUgSVNWVDUyMCh4KSAoSVNWVDMyMCh4KSkKKyNkZWZpbmUgSVNWVDQyMCh4KSAoSVNWVDMyMCh4KSkKKyNlbmRpZiAvKiBDT01NRU5UICovCisjZGVmaW5lIElTVlQzMjAoeCkgKHggPj0gVFRfVlQzMjAgJiYgeCA8PSBUVF9BQUEpCisjZGVmaW5lIElTVlQyMjAoeCkgKHggPj0gVFRfVlQyMjAgJiYgeCA8PSBUVF9BQUEgfHwgXAorICAgICAgICAgICAgICAgICAgICBJU0JFT1MoeCkgfHwgSVNRQU5TSSh4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgIElTTElOVVgoeCkgfHwgSVNTVU4oeCkpCisjZGVmaW5lIElTVlQxMDIoeCkgKHggPj0gVFRfVklQNzgwOSAmJiB4IDw9IFRUX0JBODAgfHwgXAorCQkgICAgeCA9PSBUVF9WVDEwMiB8fCBJU1ZUMjIwKHgpKQorI2RlZmluZSBJU1ZUMTAwKHgpICh4ID09IFRUX1ZUMTAwIHx8IElTVlQxMDIoeCkpCisjZGVmaW5lIElTV1kzMCh4KSAgKHggPT0gVFRfV1kzMCkKKyNkZWZpbmUgSVNXWVNFKHgpICAoeCA+PSBUVF9XWTMwICYmIHggPD0gVFRfV1kxNjApCisjZGVmaW5lIElTV1k1MCh4KSAgKHggPT0gVFRfV1k1MCkKKyNkZWZpbmUgSVNXWTYwKHgpICAoeCA9PSBUVF9XWTYwIHx8IHggPT0gVFRfV1kxNjApCisjZGVmaW5lIElTV1kxNjAoeCkgKHggPT0gVFRfV1kxNjApCisjZGVmaW5lIElTV1kzNzAoeCkgKHggPT0gVFRfV1kzNzApCisjZGVmaW5lIElTVkMoeCkgICAgKHggPT0gVFRfVkM0NDA0KQorI2RlZmluZSBJU0hQKHgpICAgICh4ID09IFRUX0hQVEVSTSB8fCB4ID09IFRUX0hQMjYyMSkKKyNkZWZpbmUgSVNIUFRFUk0oeCkgKHggPT0gVFRfSFBURVJNKQorI2RlZmluZSBJU1ZJUCh4KSAgICh4ID09IFRUX1ZJUDc4MDkpCisjZGVmaW5lIElTOTc4MDEoeCkgKHggPT0gVFRfOTc4MDEpCisjZGVmaW5lIElTSEZUKHgpICAgKHggPT0gVFRfSEZUIHx8IHggPT0gVFRfQUlYVEVSTSkKKyNkZWZpbmUgSVNBSVhURVJNKHgpICh4ID09IFRUX0FJWFRFUk0pCisjZGVmaW5lIElTVEVLKHgpICAgKHggPT0gVFRfVEVLNDApCisjZGVmaW5lIElTVlROVCh4KSAgKHggPT0gVFRfVlROVCkKKyNkZWZpbmUgSVNBRE0zQSh4KSAoeCA9PSBUVF9BRE0zQSkKKyNkZWZpbmUgSVNBRE01KHgpICAoeCA9PSBUVF9BRE01KQorI2VuZGlmIC8qIE9TMiAqLworCisjZGVmaW5lICAgWFlUQ1MgIDIgICAgICAvKiAgVGVybWluYWwgQ2hhcmFjdGVyIFNldCAqLworI2RlZmluZSAgIFhZVFNPICAzCS8qICBUZXJtaW5hbCBTaGlmdC1Jbi9TaGlmdC1PdXQgKi8KKyNkZWZpbmUgICBYWVROTCAgNCAgICAgIC8qICBUZXJtaW5hbCBuZXdsaW5lIG1vZGUgKi8KKyNpZmRlZiBPUzIKKyNkZWZpbmUgICBYWVRDT0wgNSAgICAgIC8qICBUZXJtaW5hbCBjb2xvcnMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNkZWZpbmUgICBYWVRFQyAgNgkvKiAgVGVybWluYWwgZWNobyA9IGR1cGxleCA9IGxvY2FsLWVjaG8gKi8KKyNpZmRlZiBPUzIKKyNkZWZpbmUgICBYWVRDVVIgNwkvKiAgVGVybWluYWwgY3Vyc29yICovCisjZGVmaW5lICAgICBUVENfVUxJTkUgMAorI2RlZmluZSAgICAgVFRDX0hBTEYgIDEKKyNkZWZpbmUgICAgIFRUQ19CTE9DSyAyCisjZGVmaW5lICAgWFlUQVJSIDgJLyogIFRlcm1pbmFsIGFycm93LWtleSBtb2RlICovCisjZGVmaW5lICAgWFlUS1BEIDkgICAgICAvKiAgVGVybWluYWwga2V5cGFkIG1vZGUgKi8KKyNkZWZpbmUgICAgVFRLX05PUk0gMCAgIC8qICAgIE5vcm1hbCBtb2RlIGZvciBhcnJvdyAvIGtleWFkIGtleXMgKi8KKyNkZWZpbmUgICAgVFRLX0FQUEwgMSAgIC8qICAgIEFwcGxpY2F0aW9uIG1vZGUgZm9yIGFycm93IC8ga2V5YWQga2V5cyAqLworI2RlZmluZSAgIFhZVFdSUCAxMCAgICAgLyogIFRlcm1pbmFsIHdyYXAgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNkZWZpbmUgICBYWVRDUkQgMTEJLyogIFRlcm1pbmFsIENSLWRpc3BsYXkgKi8KKyNkZWZpbmUgICBYWVRBTlMgMTIJLyogIFRlcm1pbmFsIGFuc3dlcmJhY2sgKi8KKyNpZmRlZiBPUzIKKyNkZWZpbmUgICBYWVNDUlMgMTMgICAgIC8qICBUZXJtaW5hbCBzY3JvbGxiYWNrIGJ1ZmZlciBzaXplICovCisjZW5kaWYgLyogT1MyICovCisjZGVmaW5lICAgWFlUQVBDIDE0CS8qICBUZXJtaW5hbCBBUEMgKi8KKyNpZmRlZiBPUzIKKyNkZWZpbmUgICBYWVRCRUwgMTUgICAgIC8qICBUZXJtaW5hbCBCZWxsICovCisjZW5kaWYgLyogT1MyICovCisjZGVmaW5lICAgWFlUREVCIDE2CS8qICBUZXJtaW5hbCBEZWJ1ZyAqLworI2lmZGVmIE9TMgorI2RlZmluZSAgIFhZVFJPTCAxNyAgICAgLyogIFRlcm1pbmFsIFJvbGxiYWNrICovCisjZGVmaW5lICAgICBUVFJfT1ZFUiAgIDAgIC8qICBSb2xsYmFjayBPdmVyd3JpdGUgKi8KKyNkZWZpbmUgICAgIFRUUl9JTlNFUlQgMSAgLyogIFJvbGxiYWNrIEluc2VydCAqLworI2RlZmluZSAgICAgVFRSX0tFWVMgICAyICAvKiAgS2V5c3Ryb2tlcyAqLworI2RlZmluZSAgICAgICBUVFJLX0lHTiAwICAvKiAgICBJZ25vcmUgKi8KKyNkZWZpbmUgICAgICAgVFRSS19SU1QgMiAgLyogICAgUmVzdG9yZSBhbmQgU2VuZCAqLworI2RlZmluZSAgICAgICBUVFJLX1NORCAxICAvKiAgICBTZW5kICovCisjZGVmaW5lICAgWFlUQ1RTIDE4ICAgICAvKiAgVGVybWluYWwgVHJhbnNtaXQtVGltZW91dCAqLworI2RlZmluZSAgIFhZVENQRyAxOSAgICAgLyogIFRlcm1pbmFsIENvZGUgUGFnZSAqLworI2lmZGVmIENPTU1FTlQKKyNkZWZpbmUgICBYWVRIQ1UgMjAgICAgIC8qICBUZXJtaW5hbCBIaWRlLUN1cnNvciAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNkZWZpbmUgICBYWVRQQUMgMjEJICAgIC8qICBUZXJtaW5hbCBPdXRwdXQtUGFjaW5nICovCisjZGVmaW5lICAgWFlUTU9VIDIyCSAgICAvKiAgVGVybWluYWwgTW91c2UgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNkZWZpbmUgICBYWVRISUcgMjMgICAgIC8qICBUZXJtaW5hbCBXaWR0aCAqLworI2RlZmluZSAgIFhZVFdJRCAyNCAgICAgLyogIFRlcm1pbmFsIEhlaWdodCAqLworI2lmZGVmIE9TMgorI2RlZmluZSAgIFhZVFVQRCAyNSAgICAgLyogIFRlcm1pbmFsIFNjcmVlbi11cGRhdGUgKi8KKyNkZWZpbmUgICAgVFRVX0ZBU1QgMCAgIC8qICAgICBGQVNUIGJ1dCBqZXJreSAqLworI2RlZmluZSAgICBUVFVfU01PT1RIIDEgLyogICAgIFNNT09USCBidXQgc2xvdyAqLworI2RlZmluZSAgIFhZVEZPTiAyNiAgICAgLyogIFRlcm1pbmFsIEZ1bGwgc2NyZWVuIEZvbnQgKi8KKyNkZWZpbmUgICAgVFRGX1JPTSAgICAwIC8qICAgICBST00gZm9udCAqLworI2RlZmluZSAgICBUVEZfQ1kxICAgIDEgLyogICAgIENZUklMTDEgZm9udCAqLworI2RlZmluZSAgICBUVEZfQ1kyICAgIDIgLyogICAgIENZUklMTDIgZm9udCAqLworI2RlZmluZSAgICBUVEZfQ1kzICAgIDMgLyogICAgIENZUklMTDMgZm9udCAqLworI2RlZmluZSAgICBUVEZfMTExICAxMTEgLyogICAgIENQMTExIGZvbnQgKi8KKyNkZWZpbmUgICAgVFRGXzExMiAgMTEyIC8qICAgICBDUDExMiBmb250ICovCisjZGVmaW5lICAgIFRURl8xMTMgIDExMyAvKiAgICAgQ1AxMTMgZm9udCAqLworI2RlZmluZSAgICBUVEZfNDM3ICA0MzcgLyogICAgIENQNDM3IGZvbnQgKi8KKyNkZWZpbmUgICAgVFRGXzg1MCAgODUwIC8qICAgICBDUDg1MCBmb250ICovCisjZGVmaW5lICAgIFRURl84NTEgIDg1MSAvKiAgICAgQ1A4NTEgZm9udCAqLworI2RlZmluZSAgICBUVEZfODUyICA4NTIgLyogICAgIENQODUyIGZvbnQgKi8KKyNkZWZpbmUgICAgVFRGXzg1MyAgODUzIC8qICAgICBDUDg1MyBmb250ICovCisjZGVmaW5lICAgIFRURl84NjAgIDg2MCAvKiAgICAgQ1A4NjAgZm9udCAqLworI2RlZmluZSAgICBUVEZfODYxICA4NjEgLyogICAgIENQODYxIGZvbnQgKi8KKyNkZWZpbmUgICAgVFRGXzg2MiAgODYyIC8qICAgICBDUDg2MiBmb250ICovCisjZGVmaW5lICAgIFRURl84NjMgIDg2MyAvKiAgICAgQ1A4NjMgZm9udCAqLworI2RlZmluZSAgICBUVEZfODY0ICA4NjQgLyogICAgIENQODY0IGZvbnQgKi8KKyNkZWZpbmUgICAgVFRGXzg2NSAgODY1IC8qICAgICBDUDg2NSBmb250ICovCisjZGVmaW5lICAgIFRURl84NjYgIDg2NiAvKiAgICAgQ1A4NjYgZm9udCAqLworI2RlZmluZSAgICBUVEZfODgwICA4ODAgLyogICAgIENQODgwIGZvbnQgKi8KKyNkZWZpbmUgICAgVFRGXzg4MSAgODgxIC8qICAgICBDUDg4MSBmb250ICovCisjZGVmaW5lICAgIFRURl84ODIgIDg4MiAvKiAgICAgQ1A4ODIgZm9udCAqLworI2RlZmluZSAgICBUVEZfODgzICA4ODMgLyogICAgIENQODgzIGZvbnQgKi8KKyNkZWZpbmUgICAgVFRGXzg4NCAgODg0IC8qICAgICBDUDg4NCBmb250ICovCisjZGVmaW5lICAgIFRURl84ODUgIDg4NSAvKiAgICAgQ1A4ODUgZm9udCAqLworI2RlZmluZSAgIFhZVFZDSCAyNyAgICAgLyogU0VUIFRFUk1JTkFMIFZJREVPLUNIQU5HRSAqLworI2RlZmluZSAgICBUVkNfRElTICAgMCAgLyogICAgIERJU0FCTEVEICovCisjZGVmaW5lICAgIFRWQ19FTkEgICAxICAvKiAgICAgRU5BQkxFRCAgKi8KKyNkZWZpbmUgICAgVFZDX1c5NSAgIDIgIC8qICAgICBXSU45NS1TQUZFICovCisjZW5kaWYgLyogT1MyICovCisjZGVmaW5lICAgWFlUQVVUT0RMIDI4ICAvKiBTRVQgVEVSTUlOQUwgQVVUT0RPV05MT0FEICovCisjZGVmaW5lICAgIFRBRF9PRkYgICAgIDAgLyogICAgT0ZGICovCisjZGVmaW5lICAgIFRBRF9PTiAgICAgIDEgLyogICAgT04gICovCisjZGVmaW5lICAgIFRBRF9LICAgICAgIDIgLyogICAgS0VSTUlUICovCisjZGVmaW5lICAgIFRBRF9aICAgICAgIDMgLyogICAgWk1PREVNICovCisjZGVmaW5lICAgIFRBRF9YX1NUUiAgICAgMCAvKiAgICBTVFJJTkcgKi8KKyNkZWZpbmUgICAgVEFEX1hfREVURUNUICAxIC8qICAgIERFVEVDVElPTiAoIFBBQ0tFVCwgU1RSSU5HICkgKi8KKyNkZWZpbmUgICAgVEFEX1hfQzAgICAgICAyIC8qICAgIEMwIENPTkZMSUNUUyAqLworI2RlZmluZSAgICBUQURfRVJSICAgICA0IC8qICAgIEVSUk9SIHsgU1RPUCwgQ09OVElOVUUgfSAqLworI2RlZmluZSAgICBUQURfQVNLICAgICA1IC8qICAgIEFTSyAoZGlhbG9nKSAqLworI2RlZmluZSAgIFhZVEFVVE9VTCAyOSAgLyogU0VUIFRFUk1JTkFMIEFVVE9VUExPQUQgICAqLworI2lmZGVmIE9TMgorI2RlZmluZSAgIFhZVEFUVEJVRyAzMCAgLyogU0VUIFRFUk0gQVRUUi1CVUcgKi8KKyNkZWZpbmUgICBYWVRTVEFUICAgMzEgIC8qIFNFVCBURVJNIFNUQVRVU0xJTkUgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNkZWZpbmUgICBYWVRFU0MgICAgMzIgIC8qIFNFVCBURVJNIEVTQ0FQRS1DSEFSQUNURVIgKi8KKyNkZWZpbmUgICBYWVRDVFJMICAgMzMgIC8qIFNFVCBURVJNIENPTlRST0xTICovCisjaWZkZWYgT1MyCisjZGVmaW5lICAgWFlUQVRUUiAgIDM0ICAvKiBTRVQgVEVSTSBBVFRSSUJVVEUgcmVwcmVzZW50YXRpb24gKi8KKyNkZWZpbmUgICBYWVRTR1JDICAgMzUgIC8qIFNFVCBURVJNIFNHUkNPTE9SUyAqLworI2VuZGlmIC8qIE9TMiAqLworI2RlZmluZSAgIFhZVExDUyAgICAzNiAgLyogU0VUIFRFUk0gTE9DQUwtQ0hBUkFDVEVSLVNFVCAqLworI2RlZmluZSAgIFhZVFJDUyAgICAzNyAgLyogU0VUIFRFUk0gUkVNT1RFLUNIQVJBQ1RFUi1TRVQgKi8KKyNkZWZpbmUgICBYWVRVTkkgICAgMzggIC8qIFNFVCBURVJNIFVOSUNPREUgKi8KKyNkZWZpbmUgICBYWVRLRVkgICAgMzkgIC8qIFNFVCBURVJNIEtFWSAqLworI2lmZGVmIE9TMgorI2RlZmluZSAgIFhZVFNFTkQgICA0MCAgLyogU0VUIFRFUk0gU0VORC1EQVRBICovCisjZGVmaW5lICAgWFlUU0VPQiAgIDQxICAvKiBTRVQgVEVSTSBTRU5ELUVORC1PRi1CTE9DSyAqLworI2RlZmluZSAgIFhZVE1CRUwgICA0MiAgLyogU0VUIFRFUk0gTUFSR0lOLUJFTEwgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNkZWZpbmUgICBYWVRJRExFICAgNDMgIC8qIFNFVCBURVJNIElETEUtU0VORCAqLworI2lmZGVmIE9TMgorI2RlZmluZSAgIFhZVEtCTU9EICA0NCAgLyogU0VUIFRFUk0gS0VZQk9BUkQtTU9ERSAqLworI2RlZmluZSAgIFhZVFVOWCAgICA0NSAgLyogU0VUIFRFUk0gVU5JWC1NT0RFIChERykgKi8KKyNkZWZpbmUgICBYWVRBU0NSTCAgNDYgIC8qIFNFVCBURVJNIEFVVE9TQ1JPTEwgKi8KKyNkZWZpbmUgICBYWVRBUEFHRSAgNDcgIC8qIFNFVCBURVJNIEFVVE9QQUdFICovCisjZW5kaWYgLyogT1MyICovCisjZGVmaW5lICAgWFlUUklHR0VSIDQ4ICAvKiBTRVQgVEVSTSBUUklHR0VSICovCisjaWZkZWYgT1MyCisjZGVmaW5lICAgWFlUUENURVJNIDQ5ICAvKiBTRVQgVEVSTSBQQ1RFUk0gKi8KKyNkZWZpbmUgICBYWVRPUFRJICAgNTAgIC8qIFNFVCBURVJNIFNDUkVFTi1PUFRJTUlaRSAqLworI2RlZmluZSAgIFhZVFNDTk0gICA1MSAgLyogU0VUIFRFUk0gU0NSRUVOLU1PREUgKERFQ1NDTk0pICovCisjZW5kaWYgLyogT1MyICovCisjZGVmaW5lICAgWFlUUFJOICAgIDUyICAvKiBTRVQgVEVSTSBQUklOVCB7QVVUTywgQ09QWSwgT0ZGfSAqLworI2lmZGVmIE9TMgorI2RlZmluZSAgIFhZVFNBQyAgICA1MyAgLyogU0VUIFRFUk0gU1BBQ0lORy1BVFRSSUJVVEUtQ0hBUkFDVEVSIChpbnYpICovCisjZGVmaW5lICAgWFlUU05JUE0gIDU0ICAvKiBTRVQgVEVSTSBTTkktQVVUT1JPTEwgKi8KKyNkZWZpbmUgICBYWVRTTklTTSAgNTUgIC8qIFNFVCBURVJNIFNOSS1TQ1JPTExNT0RFICovCisjZGVmaW5lICAgWFlUS0JER0wgIDU2ICAvKiBTRVQgVEVSTSBLQkQtRk9MTE9XUy1HTC9HUiAqLworI2RlZmluZSAgIFhZVFZUTE5HICA1NyAgLyogU0VUIFRFUk0gVlQtTEFOR1VBR0UgKi8KKyNkZWZpbmUgICAgIFZUTF9OT1JUSF9BTSAgMQorI2RlZmluZSAgICAgVlRMX0JSSVRJU0ggICAyCisjZGVmaW5lICAgICBWVExfQkVMR0lBTiAgIDMKKyNkZWZpbmUgICAgIFZUTF9GUl9DQU4gICAgNAorI2RlZmluZSAgICAgVlRMX0RBTklTSCAgICA1CisjZGVmaW5lICAgICBWVExfRklOTklTSCAgIDYKKyNkZWZpbmUgICAgIFZUTF9HRVJNQU4gICAgNworI2RlZmluZSAgICAgVlRMX0RVVENIICAgICA4CisjZGVmaW5lICAgICBWVExfSVRBTElBTiAgIDkKKyNkZWZpbmUgICAgIFZUTF9TV19GUiAgICAxMAorI2RlZmluZSAgICAgVlRMX1NXX0dSICAgIDExCisjZGVmaW5lICAgICBWVExfU1dFRElTSCAgMTIKKyNkZWZpbmUgICAgIFZUTF9OT1JXRUdJQSAxMworI2RlZmluZSAgICAgVlRMX0ZSRU5DSCAgIDE0CisjZGVmaW5lICAgICBWVExfU1BBTklTSCAgMTUKKyNkZWZpbmUgICAgIFZUTF9QT1JUVUdFUyAxNgorI2RlZmluZSAgICAgVlRMX0hFQlJFVyAgIDE5CisjZGVmaW5lICAgICBWVExfR1JFRUsgICAgMjIKKyNkZWZpbmUgICAgIFZUTF9DQU5BRElBTiAyOAorI2RlZmluZSAgICAgVlRMX1RVUktfUSAgIDI5CisjZGVmaW5lICAgICBWVExfVFVSS19GICAgMzAKKyNkZWZpbmUgICAgIFZUTF9IVU5HQVJJQSAzMQorI2RlZmluZSAgICAgVlRMX1NMT1ZBSyAgIDMzCisjZGVmaW5lICAgICBWVExfQ1pFQ0ggICAgMzQKKyNkZWZpbmUgICAgIFZUTF9QT0xJU0ggICAzNQorI2RlZmluZSAgICAgVlRMX1JPTUFOSUFOIDM2CisjZGVmaW5lICAgICBWVExfU0NTICAgICAgMzgKKyNkZWZpbmUgICAgIFZUTF9SVVNTSUFOICAzOQorI2RlZmluZSAgICAgVlRMX0xBVElOX0FNIDQwCisjZGVmaW5lICAgWFlUVlROUkMgIDU4ICAvKiBTRVQgVEVSTSBWVC1OUkMtTU9ERSAqLworI2RlZmluZSAgIFhZVFNOSUNDICA1OSAgLyogU0VUIFRFUk0gU05JLUNILkNPREUgKi8KKyNkZWZpbmUgICBYWVRTTklGViAgNjAgIC8qIFNFVCBURVJNIFNOSS1GSVJNV0FSRS1WRVJTSU9OUyAqLworI2RlZmluZSAgIFhZVFVSTEhJICA2MSAgLyogU0VUIFRFUk0gVVJMLUhJR0hMSUdIVCAqLworI2VuZGlmIC8qIE9TMiAqLworI2RlZmluZSAgIFhZVElUTU8gICA2MiAgLyogU0VUIFRFUk0gSURMRS1USU1FT1VUICovCisjZGVmaW5lICAgWFlUSUFDVCAgIDYzICAvKiBTRVQgVEVSTSBJRExFLUFDVElPTiAgKi8KKyNkZWZpbmUgICBYWVRMU1AgICAgNjQgIC8qIFNFVCBURVJNIExJTkUtU1BBQ0lORyAqLworCisjZGVmaW5lIFhZQVRUUiAzNCAgICAgICAvKiBBdHRyaWJ1dGUgcGFja2V0cyAgKi8KKyNkZWZpbmUgWFlTRVJWIDM1CS8qIFNlcnZlciBwYXJhbWV0ZXJzICAqLworI2RlZmluZSAgIFhZU0VSVCAwICAgICAgLyogIFNlcnZlciB0aW1lb3V0ICAgICovCisjZGVmaW5lICAgWFlTRVJEIDEJLyogIFNlcnZlciBkaXNwbGF5ICAgICovCisjZGVmaW5lICAgWFlTRVJJIDIgICAgICAvKiAgU2VydmVyIGlkbGUgICAgICAgKi8KKyNkZWZpbmUgICBYWVNFUlAgMwkvKiAgU2VydmVyIGdldC1wYXRoICAgKi8KKyNkZWZpbmUgICBYWVNFUkwgNAkvKiAgU2VydmVyIGxvZ2luICAgICAgKi8KKyNkZWZpbmUgICBYWVNFUkMgNQkvKiAgU2VydmVyIENELU1lc3NhZ2UgKi8KKyNkZWZpbmUgICBYWVNFUksgNgkvKiAgU2VydmVyIGtlZXBhbGl2ZSAgKi8KKyNkZWZpbmUgWFlXSU5EIDM2ICAgICAgIC8qIFdpbmRvdyBzaXplICovCisjZGVmaW5lIFhZWEZFUiAzNyAgICAgICAvKiBUcmFuc2ZlciAqLworI2RlZmluZSAgIFhZWF9DQU4gMAkvKiAgIENhbmNlbGxhdGlvbiAgKi8KKyNkZWZpbmUgICBYWVhfQ1NFIDEJLyogICBDaGFyYWN0ZXItU2V0ICovCisjZGVmaW5lICAgWFlYX0xTSCAyCS8qICAgTG9ja2luZy1TaGlmdCAqLworI2RlZmluZSAgIFhZWF9QUk8gMwkvKiAgIFByb3RvY29sICAgICAgKi8KKyNkZWZpbmUgICBYWVhfTU9EIDQJLyogICBNb2RlICAgICAgICAgICovCisjZGVmaW5lICAgWFlYX0RJUyA1CS8qICAgRGlzcGxheSAgICAgICAqLworI2RlZmluZSAgIFhZWF9TTE8gNgkvKiAgIFNsb3ctc3RhcnQgICAgKi8KKyNkZWZpbmUgICBYWVhfQ1JDIDcJLyogICBDUkMgY2FsY3VsYXRpb24gKi8KKyNkZWZpbmUgICBYWVhfQkVMIDgJLyogICBCZWxsICovCisjZGVmaW5lICAgWFlYX1BJUCA5CS8qICAgUGlwZXMgKi8KKyNkZWZpbmUgICBYWVhfSU5UIDEwICAgIC8qICAgSW50ZXJydXB0aW9uICovCisjZGVmaW5lICAgWFlYX1hMQSAxMSAgICAvKiAgIChjaGFyYWN0ZXItc2V0KSBUcmFuc2xhdGlvbiBPbi9PZmYgKi8KKyNkZWZpbmUgICBYWVhfTVNHIDEyCS8qICAgTWVzc2FnZSAqLworI2RlZmluZSAgIFhZWF9SUFQgMTMJLyogICBSZXBvcnQgKi8KKyNkZWZpbmUgWFlMQU5HIDM4ICAgICAgIC8qIExhbmd1YWdlICovCisjZGVmaW5lIFhZQ09VTiAzOSAgICAgICAvKiBDb3VudCAqLworI2RlZmluZSBYWVRBS0UgNDAgICAgICAgLyogVGFrZSAqLworI2RlZmluZSBYWVVOQ1MgNDEgICAgICAgLyogVW5rbm93bi1jaGFyYWN0ZXItc2V0ICovCisjZGVmaW5lIFhZS0VZICA0MiAgICAgICAvKiBLZXkgKi8KKyNkZWZpbmUgWFlNQUNSIDQzICAgICAgIC8qIE1hY3JvICovCisjZGVmaW5lIFhZSE9TVCA0NCAgICAgICAvKiBIb3N0bmFtZSBvbiBuZXR3b3JrICovCisjZGVmaW5lIFhZTkVUICA0NSAgICAgICAvKiBTRVQgTkVUV09SSyB0aGluZ3MgKi8KKworI2RlZmluZSBYWU5FVF9EIDk5CS8qIE5FVFdPUksgRElSRUNUT1JZICovCisjZGVmaW5lIFhZTkVUX1QgMTAwCS8qIE5FVFdPUksgVFlQRSAqLworCisjZGVmaW5lIFhZQ0FSUiA0NgkvKiBDYXJyaWVyICovCisjZGVmaW5lIFhZWE1JVCA0NyAgICAgICAvKiBUcmFuc21pdCAqLworCisjZGVmaW5lIFhZRElBTCA0OCAgICAgICAvKiBEaWFsIG9wdGlvbnMgKi8KKworLyogQW5kIG5vdyB3ZSBpbnRlcnJ1cHQgdGhlIGZsb3cgdG8gYnJpbmcgeW91IGxvdHMgb2Ygc3R1ZmYgYWJvdXQgZGlhbGluZyAqLworCisjaWZuZGVmIE1BWFRPTExGUkVFCS8qIE1heGltdW0gbnVtYmVyIG9mIHRvbGwtZnJlZSBhcmVhIGNvZGVzICovCisjZGVmaW5lIE1BWFRPTExGUkVFIDgKKyNlbmRpZiAvKiBNQVhUT0xMRlJFRSAqLworCisjaWZuZGVmIE1BWFRQQ0MJCS8qIE1heGltdW0gVG9uZSBvciBQdWxzZSBkaWFsaW5nIGNvdW50cmllcyAqLworI2RlZmluZSBNQVhUUENDIDE2MAorI2VuZGlmIC8qIE1BWFRQQ0MgKi8KKworI2lmbmRlZiBNQVhQQlhFWENICS8qIE1heGltdW0gbnVtYmVyIG9mIFBCWCBleGNoYW5nZXMgKi8KKyNkZWZpbmUgTUFYUEJYRVhDSCA4CisjZW5kaWYgLyogTUFYUEJYRVhDSCAqLworCisjaWZuZGVmIE1BWExPQ0FMQUMKKyNkZWZpbmUgTUFYTE9DQUxBQyAzMgorI2VuZGlmIC8qIE1BWExPQ0FMQUMgKi8KKworI2lmbmRlZiBNQVhETlVNUworI2lmZGVmIEJJR0JVRk9LCisjZGVmaW5lIE1BWERESVIgMzIJLyogTWF4aW11bSBudW1iZXIgb2YgZGlhbGluZyBkaXJlY3RvcmllcyAqLworI2RlZmluZSBNQVhETlVNUyA0MDk1CS8qIE1heCBudW1iZXJzIHRvIGZldGNoIGZyb20gZGlhbGluZyBkaXJlY3RvcmllcyAqLworI2Vsc2UKKyNkZWZpbmUgTUFYRERJUiAxMgorI2RlZmluZSBNQVhETlVNUyAxMDI0CisjZW5kaWYgLyogQklHQlVGT0sgKi8KKyNlbmRpZiAvKiBNQVhETlVNUyAqLworLyoKKyAgSU1QT1JUQU5UOiBJbiA1QSgxOTIpLCB0aGUgb2xkIFNFVCBESUFMIGNvbW1hbmQgd2FzIHNwbGl0IGludG8gdHdvIGNvbW1hbmRzOgorICBTRVQgTU9ERU0gKGZvciBtb2RlbS1yZWxhdGVkIHBhcmFtZXRlcnMpIGFuZCBTRVQgRElBTCAoZm9yIGRpYWxpbmcgaXRlbXMpLgorICBUbyBwcmVzZXJ2ZSB0aGUgb2xkIGZvcm1hdHMsIGV0YywgaW52aXNpYmx5IHdlIGtlZXAgb25lIHN5bWJvbCBzcGFjZSBmb3IKKyAgYm90aCBjb21tYW5kcy4KKyovCisjZGVmaW5lICBYWURIVVAgIDAJLyogICBEaWFsIEhhbmd1cCAqLworI2RlZmluZSAgWFlESU5JICAxICAgICAgLyogICBNT0RFTSAoZGlhbCkgSW5pdGlhbGl6YXRpb24gc3RyaW5nICovCisjZGVmaW5lICBYWURLU1AgIDIgICAgICAvKiAgIE1PREVNIChkaWFsKSBLZXJtaXQtU3Bvb2YgKi8KKyNkZWZpbmUgIFhZRFRNTyAgMyAgICAgIC8qICAgRGlhbCBUaW1lb3V0ICovCisjZGVmaW5lICBYWUREUFkgIDQgICAgICAvKiAgIERpYWwgRGlzcGxheSAqLworI2RlZmluZSAgWFlEU1BEICA1ICAgICAgLyogICBEaWFsIFNwZWVkIG1hdGNoaW5nICovCisjZGVmaW5lICBYWURNTlAgIDYJLyogICBNT0RFTSAoZGlhbCkgTU5QIG5lZ290aWF0aW9uIGVuYWJsZWQgKG9ic29sZXRlKSAqLworI2RlZmluZSAgWFlERUMgICA3CS8qICAgTU9ERU0gKGRpYWwpIGVycm9yIGNvcnJlY3Rpb24gZW5hYmxlZCAqLworI2RlZmluZSAgWFlEREMgICA4ICAgICAgLyogICBNT0RFTSAoZGlhbCkgY29tcHJlc3Npb24gZW5hYmxlZCAqLworI2RlZmluZSAgWFlESENNICA5ICAgICAgLyogICBNT0RFTSAoZGlhbCkgaGFuZ3VwLXN0cmluZyAobW92ZWQgZWxzZXdoZXJlKSAqLworI2RlZmluZSAgWFlERElSIDEwCS8qICAgRGlhbCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgIFhZRERJQSAxMQkvKiAgIE1PREVNIChkaWFsKSBkaWFsLWNvbW1hbmQgKi8KKyNkZWZpbmUgIFhZRE1IVSAxMgkvKiAgIE1PREVNIEhBTkdVUCAoZGlhbCBtb2RlbS1oYW5ndXApICovCisKKyNpZm5kZWYgREVGTURIVVAJLyogRGVmYXVsdCBNT0RFTSBIQU5HVVAtTUVUSE9EICovCisjZGVmaW5lIERFRk1ETUhVUCAxCS8qIDAgPSBSUzIzMiwgMSA9IG1vZGVtIGNvbW1hbmQgKi8KKyNlbmRpZiAvKiBERUZNRE1IVVAgKi8KKworI2RlZmluZSAgWFlETlBSIDEzICAgICAgLyogICBEaWFsIFBSRUZJWCAqLworI2RlZmluZSAgWFlEU1RSIDE0CS8qICAgTU9ERU0gQ09NTUFORCAoZGlhbCBzdHJpbmcpIC4uLiAqLworCisjZGVmaW5lICAgWFlEU19EQyAwCS8qICAgIERhdGEgY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgICBYWURTX0VDIDEJLyogICAgRXJyb3IgY29ycmVjdGlvbiAqLworI2RlZmluZSAgIFhZRFNfSFUgMiAgICAgLyogICAgSGFuZ3VwIGNvbW1hbmQgKi8KKyNkZWZpbmUgICBYWURTX0hXIDMgICAgIC8qICAgIEhhcmR3YXJlIGZsb3cgY29udHJvbCAqLworI2RlZmluZSAgIFhZRFNfSU4gNCAgICAgLyogICAgSW5pdC1zdHJpbmcgKi8KKyNkZWZpbmUgICBYWURTX05GIDUgICAgIC8qICAgIE5vIGZsb3cgY29udHJvbCAqLworI2RlZmluZSAgIFhZRFNfUFggNiAgICAgLyogICAgUHJlZml4IChubywgdGhpcyBnb2VzIGluIFNFVCBESUFMKSAqLworI2RlZmluZSAgIFhZRFNfU1cgNyAgICAgLyogICAgU29mdHdhcmUgZmxvdyBjb250cm9sICovCisjZGVmaW5lICAgWFlEU19EVCA4ICAgICAvKiAgICBUb25lIGRpYWxpbmcgY29tbWFuZCAqLworI2RlZmluZSAgIFhZRFNfRFAgOSAgICAgLyogICAgUHVsc2UgZGlhbGluZyBjb21tYW5kICovCisjZGVmaW5lICAgWFlEU19BTiAxMCAgICAvKiAgICBBdXRvYW5zd2VyICovCisjZGVmaW5lICAgWFlEU19SUyAxMSAgICAvKiAgICBSZXNldCAqLworI2RlZmluZSAgIFhZRFNfTVMgMTIgICAgLyogICAgRGlhbCBtb2RlIHN0cmluZyAqLworI2RlZmluZSAgIFhZRFNfTVAgMTMgICAgLyogICAgRGlhbCBtb2RlIHByb21wdCAqLworI2RlZmluZSAgIFhZRFNfU1AgMTQJLyogICAgTW9kZW0gc3BlYWtlciAqLworI2RlZmluZSAgIFhZRFNfVk8gMTUJLyogICAgTW9kZW0gc3BlYWtlciB2b2x1bWUgKi8KKyNkZWZpbmUgICBYWURTX0lEIDE2CS8qICAgIElnbm9yZSBkaWFsdG9uZSAqLworI2RlZmluZSAgIFhZRFNfSTIgMTcJLyogICAgSW5pdCBzdHJpbmcgIzIgKi8KKworI2RlZmluZSAgIFhZRE1fQSAgOSAgICAgLyogICAgTWV0aG9kOiBBdXRvICovCisjZGVmaW5lICAgWFlETV9EICAwICAgICAvKiAgICAgIERlZmF1bHQgKi8KKyNkZWZpbmUgICBYWURNX1QgIDIgICAgIC8qICAgICAgVG9uZSAqLworI2RlZmluZSAgIFhZRE1fUCAgMyAgICAgLyogICAgICBQdWxzZSAqLworCisjZGVmaW5lICBYWURGQyAgIDE1CS8qICAgTU9ERU0gKGRpYWwpIGZsb3ctY29udHJvbCAqLworI2RlZmluZSAgWFlETVRIICAxNgkvKiAgIERpYWwgbWV0aG9kICovCisjZGVmaW5lICBYWURFU0MgIDE3ICAgICAvKiAgIE1PREVNIChkaWFsKSBlc2NhcGUtY2hhcmFjdGVyICovCisjZGVmaW5lICBYWURNQVggIDE4CS8qICAgTU9ERU0gKGRpYWwpIG1heGltdW0gaW50ZXJmYWNlIHNwZWVkICovCisjZGVmaW5lICBYWURDQVAgIDE5ICAgICAvKiAgIE1PREVNIChkaWFsKSBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgIFhZRFRZUCAgMjAJLyogICBNT0RFTSBUWVBFICovCisjZGVmaW5lICBYWURJTlQgIDIxCS8qICAgRElBTCByZXRyaWVzICovCisjZGVmaW5lICBYWURSVE0gIDIyCS8qICAgRElBTCB0aW1lIGJldHdlZW4gcmV0cmllcyAqLworI2RlZmluZSAgWFlETkFNICAyMwkvKiAgIE1PREVNIE5BTUUgKi8KKyNkZWZpbmUgIFhZRExBQyAgMjQJLyogICBESUFMIChMT0NBTC0pQVJFQS1DT0RFICovCisjZGVmaW5lICBYWURNQ0QgIDI1CS8qICAgTU9ERU0gQ0FSUklFUiAqLworCisjZGVmaW5lICBYWURDTkYgIDI2CS8qICAgRElBTCBDT05GSVJNQVRJT04gKi8KKyNkZWZpbmUgIFhZRENWVCAgMjcJLyogICBESUFMIENPTlZFUlQtRElSRUNUT1JZICovCisjZGVmaW5lICBYWURJWFAgIDI4CS8qICAgRElBTCBJTlRFUk5BVElPTkFMLVBSRUZJWCAqLworI2RlZmluZSAgWFlESVhTICAyOQkvKiAgIERJQUwgSU5URVJOQVRJT05BTC1TVUZGSVggKi8KKyNkZWZpbmUgIFhZRExDQyAgMzAJLyogICBESUFMIExPQ0FMLUNPVU5UUlktQ09ERSAqLworI2RlZmluZSAgWFlETERQICAzMQkvKiAgIERJQUwgTE9ORy1ESVNUQU5DRS1QUkVGSVggKi8KKyNkZWZpbmUgIFhZRExEUyAgMzIJLyogICBESUFMIExPTkctRElTVEFOQ0UtU1VGRklYICovCisjZGVmaW5lICBYWURQWFggIDMzCS8qICAgRElBTCBQQlgtRVhDSEFOR0UgKi8KKyNkZWZpbmUgIFhZRFBYSSAgMzQJLyogICBESUFMIFBCWC1JTlRFUk5BTC1QUkVGSVggKi8KKyNkZWZpbmUgIFhZRFBYTyAgMzUJLyogICBESUFMIFBCWC1PVVRTSURFLVBSRUZJWCAqLworI2RlZmluZSAgWFlEU0ZYICAzNgkvKiAgIERJQUwgU1VGRklYICovCisjZGVmaW5lICBYWURTUlQgIDM3CS8qICAgRElBTCBTT1JUICovCisjZGVmaW5lICBYWURURkMgIDM4CS8qICAgRElBTCBUT0xMLUZSRUUtQVJFQS1DT0RFICovCisjZGVmaW5lICBYWURURlAgIDM5CS8qICAgRElBTCBUT0xMLUZSRUUtUFJFRklYICovCisjZGVmaW5lICBYWURURlMgIDQwCS8qICAgRElBTCBUT0xMLUZSRUUtU1VGRklYICovCisjZGVmaW5lICBYWURDT04gIDQxICAgICAvKiAgIERJQUwgQ09OTkVDVCAqLworI2RlZmluZSAgWFlEUlNUUiA0MiAgICAgLyogICBESUFMIFJFU1RSSUNUICovCisjZGVmaW5lICBYWURSU0VUIDQzICAgICAvKiAgIE1PREVNIFJFU0VUICovCisjZGVmaW5lICBYWURMQ1AgIDQ0CS8qICAgRElBTCBMT0NBTC1QUkVGSVggKi8KKyNkZWZpbmUgIFhZRExDUyAgNDUJLyogICBESUFMIExPQ0FMLVNVRkZJWCAqLworI2RlZmluZSAgWFlETExBQyA0NiAgICAgLyogICBESUFMIExDLUFSRUEtQ09ERVMgKi8KKyNkZWZpbmUgIFhZREZMRCAgNDcJLyogICBESUFMIEZPUkNFIExPTkctRElTVEFOQ0UgKi8KKyNkZWZpbmUgIFhZRFNQSyAgNDgJLyogICBNT0RFTSBTUEVBS0VSICovCisjZGVmaW5lICBYWURWT0wgIDQ5CS8qICAgTU9ERU0gVk9MVU1FICovCisjZGVmaW5lICBYWURJRFQgIDUwCS8qICAgSUdOT1JFIERJQUxUT05FICovCisjZGVmaW5lICBYWURQQUMgIDUxCS8qICAgUEFDSU5HICovCisjZGVmaW5lICBYWURNQUMgIDUyICAgICAvKiAgIE1BQ1JPICovCisjZGVmaW5lICBYWURQVUNDIDUzCS8qICAgUFVMU0UtQ09VTlRSSUVTICovCisjZGVmaW5lICBYWURUT0NDIDU0CS8qICAgVE9ORS1DT1VOVFJJRVMgKi8KKyNkZWZpbmUgIFhZRFRFU1QgNTUJLyogICBURVNUICovCisKKyNkZWZpbmUgWFlBX0NJRCAgIDEJLyogU0VUIEFOU1dFUiBDQUxMRVItSUQgKi8KKyNkZWZpbmUgWFlBX1JORyAgIDIJLyogU0VUIEFOU1dFUiBSSU5HUyAqLworCisjZGVmaW5lIFhZU0VTUyA0OSAgICAgICAvKiBTRVQgU0VTU0lPTiBvcHRpb25zICovCisjZGVmaW5lIFhZQlVGICA1MCAgICAgICAvKiBCdWZmZXIgbGVuZ3RoICovCisjZGVmaW5lIFhZQkFDSyA1MQkvKiBCYWNrZ3JvdW5kICovCisjZGVmaW5lIFhZREZMVCA1MiAgICAgICAvKiBEZWZhdWx0ICovCisjZGVmaW5lIFhZREJMICA1MwkvKiBEb3VibGUgKi8KKyNkZWZpbmUgWFlDTUQgIDU0ICAgICAgIC8qIENPTU1BTkQgKi8KKyNkZWZpbmUgWFlDQVNFIDU1ICAgICAgIC8qIENhc2UgKi8KKyNkZWZpbmUgWFlDT01QIDU2ICAgICAgIC8qIENvbXByZXNzaW9uICovCisjZGVmaW5lIFhZWDI1ICA1NyAgICAgICAvKiBYLjI1IHBhcmFtZXRlciAoQU5ZWDI1KSAqLworI2RlZmluZSBYWVBBRCAgNTggICAgICAgLyogWC4zIFBBRCBwYXJhbWV0ZXIgKEFOWVgyNSkgKi8KKyNkZWZpbmUgWFlXSUxEIDU5ICAgICAgIC8qIFdpbGRjYXJkIGV4cGFuc2lvbiBtZXRob2QgKi8KKyNkZWZpbmUgWFlTVVNQIDYwICAgICAgIC8qIFN1c3BlbmQgKi8KKyNkZWZpbmUgWFlNQUlMIDYxCS8qIE1haWwtQ29tbWFuZCAqLworI2RlZmluZSBYWVBSSU4gNjIJLyogUHJpbnQtQ29tbWFuZCAqLworI2RlZmluZSBYWVFVSUUgNjMJLyogUXVpZXQgKi8KKyNkZWZpbmUgWFlMQ0xFIDY0CS8qIExvY2FsLWVjaG8gKi8KKyNkZWZpbmUgWFlTQ1JJIDY1CS8qIFNDUklQVCBjb21tYW5kIHBhcmFtYXRlcnMgKi8KKyNkZWZpbmUgWFlNU0dTIDY2ICAgICAgIC8qIE1FU1NBR0VzIE9OL09GRiAqLworI2lmZGVmIFROQ09ERQorI2RlZmluZSBYWVRFTCAgNjcJLyogU0VUIFRFTE5FVCBwYXJhbWV0ZXJzICovCisjZGVmaW5lICBDS19UTl9FQyAwCS8qICBURUxORVQgRUNITyAqLworI2RlZmluZSAgQ0tfVE5fVFQgMQkvKiAgVEVMTkVUIFRFUk1JTkFMLVRZUEUgKi8KKyNkZWZpbmUgIENLX1ROX05MIDIgICAgIC8qICBURUxORVQgTkVXTElORS1NT0RFICovCisjZGVmaW5lICBDS19UTl9CTSAzICAgICAvKiAgVEVMTkVUIEJJTkFSWS1NT0RFICovCisjZGVmaW5lICBDS19UTl9CVUcgNCAgICAvKiAgVEVMTkVUIEJVRyAqLworI2RlZmluZSAgQ0tfVE5fRU5WIDUgICAgLyogIFRFTE5FVCBFTlZJUk9OTUVOVCAqLworI2RlZmluZSAgICBUTl9FTlZfVVNSICAwIC8qICAgIFZBUiBVU0VSICovCisjZGVmaW5lICAgIFROX0VOVl9KT0IgIDEgLyogICAgVkFSIEpPQiAqLworI2RlZmluZSAgICBUTl9FTlZfQUNDVCAyIC8qICAgIFZBUiBBQ0NUICovCisjZGVmaW5lICAgIFROX0VOVl9QUk5UIDMgLyogICAgVkFSIFBSSU5URVIgKi8KKyNkZWZpbmUgICAgVE5fRU5WX1NZUyAgNCAvKiAgICBWQVIgU1lTVEVNVFlQRSAqLworI2RlZmluZSAgICBUTl9FTlZfRElTUCA1IC8qICAgIFZBUiBESVNQTEFZICovCisjZGVmaW5lICAgIFROX0VOVl9VVkFSIDYgLyogICAgVVNFUlZBUiAqLworI2RlZmluZSAgICBUTl9FTlZfTE9DICA3IC8qICAgIFVTRVJWQVIgTE9DQVRJT04gKi8KKyNkZWZpbmUgICAgVE5fRU5WX09OICA5OCAvKiAgICBPTiAoZW5hYmxlZCkgKi8KKyNkZWZpbmUgICAgVE5fRU5WX09GRiA5OSAvKiAgICBPRkYgKGRpc2FibGVkKSAqLworI2RlZmluZSAgQ0tfVE5fTE9DIDYgICAgLyogIFRFTE5FVCBMT0NBVElPTiAqLworI2RlZmluZSAgQ0tfVE5fQVUgIDcgICAgLyogIFRFTE5FVCBBVVRIRU5USUNBVElPTiAqLworI2RlZmluZSAgICBUTl9BVV9GV0QgICA0IC8qICAgIEFVVEggRk9SV0FSRCAqLworI2RlZmluZSAgICBUTl9BVV9UWVAgICA1IC8qICAgIEFVVEggVFlQRSAqLworI2RlZmluZSAgICAgIEFVVEhfTk9ORSAwIC8qICAgICAgQVVUSCBOT05FICovCisjZGVmaW5lICAgICAgQVVUSF9LUkI0IDEgLyogICAgICBBVVRIIEtlcmJlcm9zIElWICovCisjZGVmaW5lICAgICAgQVVUSF9LUkI1IDIgLyogICAgICBBVVRIIEtlcmJlcm9zIFYgKi8KKyNkZWZpbmUgICAgICBBVVRIX1NTTCAgNyAvKiAgICAgIEFVVEggU2VjdXJlIFNvY2tldHMgTGF5ZXIgKi8KKyNkZWZpbmUgICAgICBBVVRIX1RMUyA5OCAvKiAgICAgIEFVVEggVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5ICovCisjZGVmaW5lICAgICAgQVVUSF9TUlAgIDUgLyogICAgICBBVVRIIFNlY3VyZSBSZW1vdGUgUGFzc3dvcmQgKi8KKyNkZWZpbmUgICAgICBBVVRIX05UTE0gMTUgLyogICAgICBBVVRIIE5UIExhbiBNYW5hZ2VyICovCisjZGVmaW5lICAgICAgQVVUSF9BVVRPIDk5IC8qICAgICBBVVRIIEFVVE9NQVRJQyAqLworI2RlZmluZSAgICBUTl9BVV9IT1cgIDggIC8qICAgIEFVVEggSE9XIEZMQUcgKi8KKyNkZWZpbmUgICAgVE5fQVVfRU5DICA5ICAvKiAgICBBVVRIIEVOQ1JZUFQgRkxBRyAqLworI2RlZmluZSAgQ0tfVE5fRU5DIDggICAgLyogIFRFTE5FVCBFTkNSWVBUSU9OICovCisjZGVmaW5lICAgIFROX0VOX1RZUCAgIDQgLyogICAgICBFTkNSWVBUIFRZUEUgKi8KKyNkZWZpbmUgICAgVE5fRU5fU1RBUlQgNSAvKiAgICAgIEVOQ1JZUFQgU1RBUlQgKi8KKyNkZWZpbmUgICAgVE5fRU5fU1RPUCAgNiAvKiAgICAgIEVOQ1JZUFQgU1RPUCAgKi8KKyNkZWZpbmUgIENLX1ROX0lLUyA5ICAgIC8qICBURUxORVQgS0VSTUlULVNFUlZFUiAqLworI2RlZmluZSAgQ0tfVE5fUkUgIDEwICAgLyogIFRFTE5FVCBSRU1PVEUtRUNITyAqLworI2RlZmluZSAgQ0tfVE5fVExTIDExICAgLyogIFRFTE5FVCBTVEFSVF9UTFMgKi8KKyNkZWZpbmUgIENLX1ROX1hEICAxMiAgIC8qICBURUxORVQgWERJU1BMT0MgKi8KKyNkZWZpbmUgIENLX1ROX05BV1MgMTMgIC8qICBURUxORVQgTkFXUyAqLworI2RlZmluZSAgQ0tfVE5fV0FJVCAxNCAgLyogIFRFTE5FVCBXQUlULUZPUi1ORUdPVElBVElPTlMgKi8KKyNkZWZpbmUgIENLX1ROX1NHQSAgMTUgIC8qICBURUxORVQgU0dBICovCisjZGVmaW5lICBDS19UTl9DTElFTlQgMTYgIC8qIFRFTE5FVCBDTElFTlQgKi8KKyNkZWZpbmUgIENLX1ROX1NFUlZFUiAxNyAgLyogVEVMTkVUIFNFUlZFUiAqLworI2RlZmluZSAgQ0tfVE5fUEhSICAgIDE4ICAvKiBURUxORVQgUFJBR01BLUhFQVJUQkVBVCAqLworI2RlZmluZSAgQ0tfVE5fUExHICAgIDE5ICAvKiBURUxORVQgUFJBR01BLUxPR09OICovCisjZGVmaW5lICBDS19UTl9QU1AgICAgMjAgIC8qIFRFTE5FVCBQUkFHTUEtU1NQSSAqLworI2RlZmluZSAgQ0tfVE5fU0FLICAgIDIxICAvKiBURUxORVQgSUJNIFNBSyAqLworI2RlZmluZSAgQ0tfVE5fRkxXICAgIDIyICAvKiBURUxORVQgTEZMT1cgKi8KKyNkZWZpbmUgIENLX1ROX1hGICAgICAyMyAgLyogVEVMTkVUIFRSQU5TRkVSLU1PREUgKi8KKyNkZWZpbmUgIENLX1ROX1BVSUQgICAyNCAgLyogVEVMTkVUIFBST01QVC1GT1ItVVNFUklEICovCisjZGVmaW5lICBDS19UTl9ORSAgICAgMjUgIC8qIFRFTE5FVCBOTy1FTkNSWVBULURVUklORy1YRkVSICovCisjZGVmaW5lICBDS19UTl9DUEMgICAgMjYgIC8qIFRFTE5FVCBDT00tUE9SVC1DT05UUk9MICovCisjZGVmaW5lICBDS19UTl9EQiAgICAgMjcgIC8qIFRFTE5FVCBERUJVRyAqLworI2RlZmluZSAgQ0tfVE5fRlggICAgIDI4ICAvKiBURUxORVQgRk9SV0FSRF9YICovCisjZGVmaW5lICBDS19UTl9ETCAgICAgMjkgIC8qIFRFTE5FVCBERUxBWS1TQiAqLworI2RlZmluZSAgQ0tfVE5fU0ZVICAgIDMwICAvKiBURUxORVQgU0ZVLUNPTVBBVElCSUxJVFkgKi8KKyNkZWZpbmUgIENLX1ROX0xPRyAgICAzMSAgLyogVEVMTkVUIExPR09VVCAqLworI2VuZGlmIC8qIFROQ09ERSAqLworI2RlZmluZSBYWU9VVFAgNjgJLyogT1VUUFVUIGNvbW1hbmQgcGFyYW1ldGVycyAqLworI2RlZmluZSAgIE9VVF9QQUMgMAkvKiAgIE9VVFBVVCBQQUNJTkcgKi8KKyNkZWZpbmUgICBPVVRfRVNDIDEJLyogICBPVVRQVVQgU1BFQ0lBTC1FU0NBUEVTICovCisjZGVmaW5lIFhZRVhJVCAgNjkJLyogU0VUIEVYSVQgKi8KKyNkZWZpbmUgWFlQUlRSICA3MAkvKiBTRVQgUFJJTlRFUiAqLworI2RlZmluZSBYWUZQQVRIIDcxCS8qIFBBVEhOQU1FICovCisKKyNpZmRlZiBPUzIKKyNkZWZpbmUgWFlNT1VTRSA3MgkvKiBNT1VTRSBTVVBQT1JUICovCisjZGVmaW5lICBYWU1fT04gICAgIDAgICAvKiBNb3VzZSBPTi9PRkYgICAgICAgICovCisjZGVmaW5lICBYWU1fQlVUVE9OIDEgICAvKiBEZWZpbmUgTW91c2UgRXZlbnRzICovCisjZGVmaW5lICBYWU1fQ0xFQVIgIDIgICAvKiBDbGVhciBNb3VzZSBFdmVudHMgICovCisjZGVmaW5lICBYWU1fREVCVUcgIDMgICAvKiBEZWJ1ZyBNb2RlIE9OL09GRiAqLworLyogVGhlc2UgbXVzdCBtYXRjaCBzaW1pbGFyIGRlZmluaXRpb25zIGluIGNrb2tleS5oICovCisjZGVmaW5lICAgWFlNX0IxIDAgICAgICAvKiBNb3VzZSBCdXR0b24gT25lICovCisjZGVmaW5lICAgWFlNX0IyIDEgICAgICAvKiBNb3VzZSBCdXR0b24gVHdvICovCisjZGVmaW5lICAgWFlNX0IzIDIgICAgICAvKiBNb3VzZSBCdXR0b24gVGhyZWUgKi8KKyNkZWZpbmUgICBYWU1fQUxUICAgMSAgICAgLyogQWx0ICovCisjZGVmaW5lICAgWFlNX0NUUkwgIDIgICAgIC8qIEN0cmwgKi8KKyNkZWZpbmUgICBYWU1fU0hJRlQgNCAgICAgLyogU2hpZnQgKi8KKyNkZWZpbmUgICBYWU1fQzEgICAgMCAgICAgLyogU2luZ2xlIENsaWNrICovCisjZGVmaW5lICAgWFlNX0MyICAgIDggICAgIC8qIERvdWJsZSBDbGljayAqLworI2RlZmluZSAgIFhZTV9EUkFHICAxNiAgICAvKiBEcmFnIEV2ZW50ICovCisjZW5kaWYgLyogT1MyICovCisKKyNkZWZpbmUgWFlCRUxMIDczICAgLyogQkVMTCAqLworCisjaWZkZWYgT1MyCisjZGVmaW5lIFhZUFJUWSAgICAgNzQgICAvKiBUaHJlYWQgUHJpb3JpdHkgTGV2ZWwgKi8KKyNkZWZpbmUgICBYWVBfSURMRSAgMQorI2RlZmluZSAgIFhZUF9SRUcgICAyCisjZGVmaW5lICAgWFlQX1NSViAgIDQKKyNkZWZpbmUgICBYWVBfUlRQICAgMworI2VuZGlmIC8qIE9TMiAqLworCisjZGVmaW5lIFhZQUxSTSAgICAgNzUJLyogU0VUIEFMQVJNICovCisjZGVmaW5lIFhZUFJPVE8gICAgNzYJLyogU0VUIFBST1RPQ09MICovCisjZGVmaW5lIFhZUFJFRklYICAgNzcgICAvKiBTRVQgUFJFRklYSU5HICovCisjZGVmaW5lIFhZTE9HSU4gICAgNzggICAvKiBMb2dpbiBpbmZvIGZvciBzY3JpcHQgcHJvZ3JhbXMuLi4gKi8KKworI2RlZmluZSAgTE9HSV9VSUQgICAwCS8qIFVzZXIgSUQgICovCisjZGVmaW5lICBMT0dJX1BTVyAgIDEJLyogUGFzc3dvcmQgKi8KKyNkZWZpbmUgIExPR0lfUFJNICAgMgkvKiBQcm9tcHQgICAqLworCisjZGVmaW5lIFhZU1RBUlRVUCAgNzkgICAgLyogU3RhcnR1cCBmaWxlICovCisjZGVmaW5lIFhZVE1QRElSICAgODAgICAgLyogVGVtcG9yYXJ5IGRpcmVjdG9yeSAqLworCisjaWZkZWYgT1MyCisjZGVmaW5lIFhZVEFQSSAgICAgODEgICAgLyogTWljcm9zb2Z0IFRlbGVwaG9uZSBBUEkgb3B0aW9ucyAqLworI2RlZmluZSAgIFhZVEFQSV9DRkcgICAgIDEgIC8qIFRBUEkgQ29uZmlndXJlLUxpbmUgRGlhbG9nICovCisjZGVmaW5lICAgWFlUQVBJX0RJQUwgICAgMiAgLyogVEFQSSBEaWFsaW5nLVByb3BlcnRpZXMgRGlhbG9nICovCisjZGVmaW5lICAgWFlUQVBJX0xJTiAgICAgMyAgLyogVEFQSSBMaW5lICovCisjZGVmaW5lICAgWFlUQVBJX0xPQyAgICAgNCAgLyogVEFQSSBMb2NhdGlvbiAqLworI2RlZmluZSAgIFhZVEFQSV9QQVNTICAgIDUgIC8qIFRBUEkgUGFzc3Rocm91Z2ggKi8KKyNkZWZpbmUgICBYWVRBUElfQ09OICAgICA2ICAvKiBUQVBJIENvbnZlcnNpb25zICovCisjZGVmaW5lICAgWFlUQVBJX0xHSFQgICAgNyAgLyogVEFQSSBNb2RlbSBMaWdodHMgKi8KKyNkZWZpbmUgICBYWVRBUElfUFJFICAgICA4ICAvKiBUQVBJIFByZS1kaWFsaW5nIFRlcm1pbmFsICovCisjZGVmaW5lICAgWFlUQVBJX1BTVCAgICAgOSAgLyogVEFQSSBQb3N0LWRpYWxpbmcgVGVybWluYWwgKi8KKyNkZWZpbmUgICBYWVRBUElfSU5BICAgIDEwICAvKiBUQVBJIEluYWN0aXZpdHkgVGltZW91dCAqLworI2RlZmluZSAgIFhZVEFQSV9CTkcgICAgMTEgIC8qIFRBUEkgV2FpdCBmb3IgQ3JlZGl0IENhcmQgVG9uZSAqLworI2RlZmluZSAgIFhZVEFQSV9NQU4gICAgMTIgIC8qIFRBUEkgTWFudWFsIERpYWxpbmcgKi8KKyNkZWZpbmUgICBYWVRBUElfVVNFICAgIDEzICAvKiBUQVBJIFVzZSBMaW5lIENvbmZpZyBzZXR0aW5ncyAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgVENQU09DS0VUCisjZGVmaW5lIFhZVENQICA4MiAgICAgICAvKiBUQ1Agb3B0aW9ucyAqLworI2RlZmluZSAgWFlUQ1BfTk9ERUxBWSAgIDEgIC8qIE5vIERlbGF5ICovCisjZGVmaW5lICBYWVRDUF9TRU5EQlVGICAgMiAgLyogU2VuZCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSAgWFlUQ1BfTElOR0VSICAgIDMgIC8qIExpbmdlciAqLworI2RlZmluZSAgWFlUQ1BfUkVDVkJVRiAgIDQgIC8qIFJlY2VpdmUgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgIFhZVENQX0tFRVBBTElWRSA1ICAvKiBLZWVwIEFsaXZlIHBhY2tldHMgKi8KKyNkZWZpbmUgIFhZVENQX1VDWCAgICAgICA2ICAvKiBVQ1ggMi4wIHBvcnQgc3dhYmJpbmcgYnVnICovCisjZGVmaW5lICBYWVRDUF9OQUdMRSAgICAgNyAgLyogRGVsYXkgLSBpbnZlcnNlIG9mIDEgKi8KKyNkZWZpbmUgIFhZVENQX1JETlMgICAgICA4ICAvKiBSZXZlcnNlIEROUyBsb29rdXAgKi8KKyNkZWZpbmUgIFhZVENQX0FERFJFU1MgICA5ICAvKiBTZXQgcHJlZmVycmVkIElQIEFkZHJlc3MgKi8KKyNkZWZpbmUgIFhZVENQX0ROU19TUlYgIDEwICAvKiBVc2UgRE5TIFNlcnZpY2UgUmVjb3JkcyAqLworI2RlZmluZSAgWFlUQ1BfRE9OVFJPVVRFIDExIC8qIERvbnQgUm91dGUgKi8KKyNkZWZpbmUgIFhZVENQX1NPQ0tTX1NWUiAxMiAvKiBOYW1lIG9mIFNvY2tzIFNlcnZlciAqLworI2RlZmluZSAgWFlUQ1BfSFRUUF9QUk9YWSAxMyAvKiBOYW1lL1BvcnQgb2YgSFRUUCBQcm94eSBTZXJ2ZXIgKi8KKyNkZWZpbmUgIFhZVENQX1NPQ0tTX05TICAxNCAvKiBOYW1lIG9mIFNvY2tzIE5hbWUgU2VydmVyICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZmRlZiBPUzIKKyNkZWZpbmUgWFlNU0sgIDgzICAgICAgIC8qIE1TLURPUyBLZXJtaXQgY29tcGF0aWJpbGl0eSBvcHRpb25zICovCisjZGVmaW5lICBNU0tfQ09MT1IgMCAgICAvKiAgVGVybWluYWwgY29sb3IgaGFuZGxpbmcgICAqLworI2RlZmluZSAgTVNLX0tFWVMgIDEgICAgLyogIFNFVCBLRVkgdXNlcyBNU0sga2V5Y29kZXMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2RlZmluZSBYWURFU1QgIDg0CS8qIFNFVCBERVNUSU5BVElPTiBhcyBpbiBNUy1ET1MgS2VybWl0ICovCisKKyNpZmRlZiBPUzIKKyNkZWZpbmUgWFlXSU45NSA4NQkvKiBTRVQgV0lOOTUgd29yayBhcm91bmRzICAqLworI2RlZmluZSAgIFhZV0tFWSAwCS8qICAgIEtleWJvYXJkIHRyYW5zbGF0aW9uICovCisjZGVmaW5lICAgWFlXQUdSIDEgICAgICAvKiAgICBBbHQtR3IgICAgICAgICAgICAgICAqLworI2RlZmluZSAgIFhZV09JTyAyICAgICAgLyogICAgT3ZlcmxhcHBlZCBJL08gICAgICAgKi8KKyNkZWZpbmUgICBYWVdMVUMgMwkvKiAgICBMdWNpZGEgQ29uc29sZSBzdWJzdGl0dXRpb25zICovCisjZGVmaW5lICAgWFlXU0VMRUNUIDQgICAvKiAgICBTZWxlY3Qgb24gV3JpdGUgQnVnICovCisjZGVmaW5lICAgWFlXOF8zIDUgICAgICAvKiAgICBVc2UgOC4zIGZpbGVuYW1lcz8gKi8KKyNkZWZpbmUgICBYWVdQT1BVUCA2ICAgIC8qICAgIFVzZSBQb3B1cHM/ICAqLworI2RlZmluZSAgIFhZV0hTTCA3ICAgICAgLyogICAgSG9yeiBTY2FuIExpbmUgc3Vic3RpdHV0aW9ucyAqLworI2RlZmluZSBYWURMUiAgIDg2IAkvKiBTRVQgSzk1IERJQUxFUiB3b3JrIGFyb3VuZHMgKi8KKyNkZWZpbmUgWFlUSVRMRSA4NwkvKiBTRVQgVElUTEUgb2Ygd2luZG93ICovCisjZW5kaWYgLyogT1MyICovCisKKyNkZWZpbmUgWFlJR04gICA4OAkvKiBTRVQgSUdOT1JFLUNIQVJBQ1RFUiAqLworI2RlZmluZSBYWUVESVQgIDg5ICAgICAgLyogU0VUIEVESVRPUiAqLworI2RlZmluZSBYWUZMVFIgIDkwICAgICAgLyogU0VUIHsgU0VORCwgUkVDRUlWRSB9IEZJTFRFUiAqLworI2RlZmluZSBYWUJST1dTRSA5MSAgICAgLyogU0VUIEJST1dTRVIgKi8KKyNkZWZpbmUgWFlFT0YgICAgOTIgICAgIC8qIEVPRiAoPSBGSUxFIEVPRikgKi8KKyNpZmRlZiBPUzIKKyNkZWZpbmUgWFlCRENQICAgOTMgICAgIC8qIEJQUklOVEVSICovCisjZW5kaWYgLyogT1MyICovCisjZGVmaW5lIFhZRkxBRyAgIDk0CS8qIEZMQUcgKi8KKyNkZWZpbmUgWFlMSU1JVCAgOTUgICAgIC8qIFNFU1NJT04tTElNSVQgKi8KKyNkZWZpbmUgWFlJTklMICAgOTYgICAgIC8qIFByb3RvY29sIG5lZ290aWF0aW9uIHN0cmluZyBtYXggbGVuZ3RoICovCisjZGVmaW5lIFhZUkVMWSAgIDk3ICAgICAvKiBSRUxJQUJMRSAqLworI2RlZmluZSBYWVNUUkVBTSA5OCAgICAgLyogU1RSRUFNSU5HICovCisjZGVmaW5lIFhZVExPRyAgIDk5ICAgICAvKiBUUkFOU0FDVElPTi1MT0cgKi8KKyNkZWZpbmUgWFlDTEVBUiAxMDAgICAgIC8qIENMRUFSQ0hBTk5FTCAqLworI2RlZmluZSBYWUFVVEggIDEwMQkvKiBBVVRIRU5USUNBVElPTiAqLworCisjaWZkZWYgVE5DT0RFCisjZGVmaW5lIFhZS1JCUFIgICAwCS8qIEtlcmJlcm9zIFByaW5jaXBhbCAqLworI2RlZmluZSBYWUtSQlJMICAgMQkvKiBLZXJiZXJvcyBSZWFsbSAqLworI2RlZmluZSBYWUtSQkNDICAgMgkvKiBLZXJiZXJvcyA1IENyZWRlbnRpYWxzLUNhY2hlICovCisjZGVmaW5lIFhZS1JCU1JWICAzICAgICAvKiBLZXJiZXJvcyBTZXJ2aWNlIE5hbWUgKi8KKyNkZWZpbmUgWFlLUkJEQkcgIDQgICAgIC8qIEtlcmJlcm9zIERlYnVnZ2luZyAqLworI2RlZmluZSBYWUtSQkxJRiAgNSAgICAgLyogS2VyYmVyb3MgTGlmZXRpbWUgKi8KKyNkZWZpbmUgWFlLUkJQUkUgIDYgICAgIC8qIEtlcmJlcm9zIDQgUHJlYXV0aCAqLworI2RlZmluZSBYWUtSQklOUyAgNyAgICAgLyogS2VyYmVyb3MgNCBJbnN0YW5jZSAqLworI2RlZmluZSBYWUtSQkZXRCAgOCAgICAgLyogS2VyYmVyb3MgNSBGb3J3YXJkYWJsZSAqLworI2RlZmluZSBYWUtSQlBSWCAgOSAgICAgLyogS2VyYmVyb3MgNSBQcm94aWFibGUgKi8KKyNkZWZpbmUgWFlLUkJSTlcgIDEwICAgIC8qIEtlcmJlcm9zIDUgUmVuZXdhYmxlIGxpZmV0aW1lICovCisjZGVmaW5lIFhZS1JCR0VUICAxMSAgICAvKiBLZXJiZXJvcyBBdXRvLUdldC1UR1RzICovCisjZGVmaW5lIFhZS1JCREVMICAxMiAgICAvKiBLZXJiZXJvcyBBdXRvLURlc3Ryb3ktVEdUcyAqLworI2RlZmluZSAgIEtSQl9ERUxfTk8gIDAgLyogICBLZXJiZXJvcyBObyBBdXRvIERlc3Ryb3kgKi8KKyNkZWZpbmUgICBLUkJfREVMX0NMICAxIC8qICAgS2VyYmVyb3MgQXV0byBEZXN0b3J5IG9uIENsb3NlICovCisjZGVmaW5lICAgS1JCX0RFTF9FWCAgMiAvKiAgIEtlcmJlcm9zIEF1dG8gRGVzdHJveSBvbiBFeGl0ICAqLworI2RlZmluZSBYWUtSQks1SzQgMTMgICAgLyogS2VyYmVyb3MgNSBHZXQgSzQgVGlja2V0cyAqLworI2RlZmluZSBYWUtSQlBSTSAgMTQgICAgLyogS2VyYmVyb3MgNC81IFByb21wdCAqLworI2RlZmluZSBYWUtSQkFEUiAgMTUgICAgLyogS2VyYmVyb3MgNC81IENoZWNrQWRkcnMgKi8KKyNkZWZpbmUgWFlLUkJOQUQgIDE2ICAgIC8qIEtlcmJlcm9zIDUgTm8gQWRkcmVzc2VzICovCisjZGVmaW5lIFhZS1JCQUREICAxNyAgICAvKiBLZXJiZXJvcyA1IEFkZHJlc3MgTGlzdCAqLworI2RlZmluZSBYWUtSQktUQiAgMTggICAgLyogS2VyYmVyb3MgNC81IEtleSBUYWJsZSAqLworI2RlZmluZSBYWVNSUFBSTSAgIDAgICAgLyogU1JQIFByb21wdCAqLworI2RlZmluZSBYWVNTTFJDRkwgIDAgICAgLyogU1NML1RMUyBSU0EgQ2VydHMgZmlsZSAqLworI2RlZmluZSBYWVNTTENPSyAgIDEgICAgLyogU1NML1RMUyBDZXJ0cy1PayBmbGFnICovCisjZGVmaW5lIFhZU1NMQ1JRICAgMiAgICAvKiBTU0wvVExTIENlcnRzLVJlcXVpcmVkIGZsYWcgKi8KKyNkZWZpbmUgWFlTU0xDTCAgICAzICAgIC8qIFNTTC9UTFMgQ2lwaGVyIExpc3QgKi8KKyNkZWZpbmUgWFlTU0xEQkcgICA0ICAgIC8qIFNTTC9UTFMgRGVidWcgZmxhZyAqLworI2RlZmluZSBYWVNTTFJLRkwgIDUgICAgLyogU1NML1RMUyBSU0EgS2V5IEZpbGUgKi8KKyNkZWZpbmUgWFlTU0xMRkwgICA2ICAgIC8qIFNTTC9UTFMgTG9nIEZpbGUgKi8KKyNkZWZpbmUgWFlTU0xPTiAgICA3ICAgIC8qIFNTTC9UTFMgT25seSBmbGFnICovCisjZGVmaW5lIFhZU1NMU0VDICAgOCAgICAvKiBTU0wvVExTIFNlY3VyZSBmbGFnICovCisjZGVmaW5lIFhZU1NMVlJCICAgOSAgICAvKiBTU0wvVExTIFZlcmJvc2UgZmxhZyAqLworI2RlZmluZSBYWVNTTFZSRiAgMTAgICAgLyogU1NML1RMUyBWZXJpZnkgZmxhZyAqLworI2RlZmluZSBYWVNTTERVTSAgMTEgICAgLyogU1NML1RMUyBEdW1teSBmbGFnICovCisjZGVmaW5lIFhZU1NMRENGTCAxMiAgICAvKiBTU0wvVExTIERTQSBDZXJ0cyBmaWxlICovCisjZGVmaW5lIFhZU1NMREtGTCAxMyAgICAvKiBTU0wvVExTIERIIENlcnRzIGZpbGUgKi8KKyNkZWZpbmUgWFlTU0xEUEZMIDE0ICAgIC8qIFNTTC9UTFMgREggUGFyYW0gZmlsZSAqLworI2RlZmluZSBYWVNTTENSTCAgMTUgICAgLyogU1NML1RMUyBDUkwgZmlsZSAqLworI2RlZmluZSBYWVNTTENSTEQgMTYgICAgLyogU1NML1RMUyBDUkwgZGlyICovCisjZGVmaW5lIFhZU1NMVlJGRiAxNyAgICAvKiBTU0wvVExTIFZlcmlmeSBmaWxlICovCisjZGVmaW5lIFhZU1NMVlJGRCAxOCAgICAvKiBTU0wvVExTIFZlcmlmeSBkaXIgKi8KKyNkZWZpbmUgWFlTU0xSTkQgIDE5ICAgIC8qIFNTTC9UTFMgUmFuZG9tIGZpbGUgKi8KKyNkZWZpbmUgWFlTU0xEQ0NGIDIwICAgIC8qIFNTTC9UTFMgRFNBIENlcnRzIENoYWluIEZpbGUgKi8KKyNkZWZpbmUgWFlTU0xSQ0NGIDIxICAgIC8qIFNTTC9UTFMgUlNBIENlcnRzIENoYWluIEZpbGUgKi8KKworLyogVGhlIGZvbGxvd2luZyBtdXN0IGJlIHBvd2VycyBvZiAyIGZvciBhIGJpdCBtYXNrICovCisKKyNkZWZpbmUgIFhZS0xDRU4gIDEJLyogS2VyYmVyb3MgTGlzdCBDcmVkZW50aWFsczogRW5jcnlwdGlvbiAqLworI2RlZmluZSAgWFlLTENGTCAgMgkvKiBLZXJiZXJvcyBMaXN0IENyZWRlbnRpYWxzOiBGbGFncyAqLworI2RlZmluZSAgWFlLTENBRCAgNCAgICAgLyogS2VyYmVyb3MgTGlzdCBDcmVkZW50aWFsczogQWRkcmVzc2VzICovCisjZW5kaWYgLyogVE5DT0RFICovCisKKyNkZWZpbmUgWFlGVU5DICAgMTAyCS8qIFNFVCBGVU5DVElPTiAqLworCisjZGVmaW5lICBGVU5DX0RJICAgMAkvKiBGVU5DVElPTiBESUFHTk9TVElDUyAqLworI2RlZmluZSAgRlVOQ19FUiAgIDEgICAgLyogRlVOQ1RJT04gRVJST1IgKi8KKworI2RlZmluZSBYWUZUUCAgICAxMDMJLyogRlRQIGFwcGxpY2F0aW9uICovCisjZGVmaW5lIFhZU0xFRVAgIDEwNAkvKiBTTEVFUCAvIFBBVVNFIG9wdGlvbnMgKi8KKyNkZWZpbmUgWFlTU0ggICAgMTA1CS8qIFNTSCBvcHRpb25zICovCisjZGVmaW5lIFhZVEVMT1AgIDEwNiAgICAvKiBURUxORVQgT1BUSU9OUyAoVEVMT1BUKSAqLworI2RlZmluZSBYWUNEICAgICAxMDcgICAgLyogU0VUIENEICovCisjZGVmaW5lIFhZQ1NFVCAgIDEwOAkvKiBDSEFSQUNURVItU0VUICovCisjZGVmaW5lIFhZU1RPUCAgIDEwOSAgICAvKiBTVE9QLUJJVFMgKi8KKyNkZWZpbmUgWFlTRVJJQUwgMTEwCS8qIFNFUklBTCAqLworI2RlZmluZSBYWURJU0MgICAxMTEgICAgLyogQ0xPU0UtT04tRElTQ09OTkVDVCAqLworI2RlZmluZSBYWU9QVFMgICAxMTIgICAgLyogT1BUSU9OUyAqLworI2RlZmluZSBYWVE4RkxHICAxMTMgICAgLyogUThGTEFHIChpbnZpc2libGUpICovCisjZGVmaW5lIFhZVElNRVIgIDExNCAgICAvKiBUSU1FUiAqLworI2RlZmluZSBYWUZBQ0tCICAxMTUgICAgLyogRi1BQ0stQlVHICovCisjZGVmaW5lIFhZQlVQICAgIDExNiAgICAvKiBTRVQgU0VORC9SRUNFSVZFIEJBQ0tVUCAqLworI2RlZmluZSBYWU1PVkUgICAxMTcJLyogU0VUIFNFTkQvUkVDRUlWRSBNT1ZFLVRPICovCisjZGVmaW5lIFhZUkVOQU1FIDExOAkvKiBTRVQgU0VORC9SRUNFSVZFIFJFTkFNRS1UTyAqLworI2RlZmluZSBYWUhJTlRTICAxMTkgICAgLyogU0VUIEhJTlRTICovCisjZGVmaW5lIFhZRVZBTCAgIDEyMCAgICAvKiBTRVQgRVZBTFVBVEUgKi8KKyNkZWZpbmUgWFlGQUNLUCAgMTIxICAgIC8qIEYtQUNLLVBBVEggKi8KKyNkZWZpbmUgWFlTWVNMICAgMTIyICAgIC8qIFN5c0xvZyAqLworI2RlZmluZSBYWVFOWFBMICAxMjMJLyogUU5YIFBvcnQgTG9jayAqLworI2RlZmluZSBYWUlLUyAgICAxMjQgICAgLyogU0VUIElLUyAuLi4gKi8KKyNkZWZpbmUgWFlST09UICAgMTI1ICAgIC8qIFNFVCBST09UICovCisjZGVmaW5lIFhZRlRQWCAgIDEyNiAgICAvKiBTRVQgRlRQICovCisjZGVmaW5lIFhZU0VYUCAgIDEyNwkvKiBTRVQgU0VYUCAqLworI2RlZmluZSBYWUdQUiAgICAxMjggICAgLyogU0VUIEdFVC1QVVQtUkVNT1RFICovCisjZGVmaW5lIFhZTE9DVVMgIDEyOQkvKiBTRVQgTE9DVVMgKi8KKyNkZWZpbmUgWFlHVUkgICAgMTMwCS8qIFNFVCBHVUkgKi8KKyNkZWZpbmUgWFlBTlNXRVIgMTMxICAgIC8qIFNFVCBBTlNXRVIgKi8KKyNkZWZpbmUgWFlNQVRDSCAgMTMyICAgIC8qIFNFVCBNQVRDSERPVCAqLworI2RlZmluZSBYWVNGVFAgICAxMzMgICAgLyogU0VUIFNGVFAgKi8KKworLyogRW5kIG9mIFNFVCBjb21tYW5kcyAqLworCisvKiBTLUV4cHJlc3Npb25zIC0tIGZsb2F0aW5nLXBvaW50IHN1cHBvcnQgcmVxdWlyZWQgKi8KKworI2lmbmRlZiBDS0ZMT0FUCisjaWZuZGVmIE5PU0VYUAorI2RlZmluZSBOT1NFWFAKKyNlbmRpZiAvKiBOT1NFWFAgKi8KKyNlbmRpZiAvKiBDS0ZMT0FUICovCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFuIFMtRXhwcmVzc2lvbiAqLworCisjaWZuZGVmIE5PU0VYUAorI2lmbmRlZiBTRVhQTUFYCisjaWZkZWYgQklHQlVGT0sKKyNkZWZpbmUgU0VYUE1BWCAxMDI0CisjZWxzZQorI2RlZmluZSBTRVhQTUFYIDMyCisjZW5kaWYgLyogQklHQlVGT0sgKi8KKyNlbmRpZiAvKiBTRVhQTUFYICovCisjZW5kaWYgLyogTk9TRVhQICovCisKKyNpZmRlZiBBTllYMjUKKy8qIFBBRCBjb21tYW5kIHBhcmFtZXRlcnMgKi8KKworI2RlZmluZSBYWVBBREwgMCAgICAgICAgLyogY2xlYXIgdmlydHVhbCBjYWxsICovCisjZGVmaW5lIFhZUEFEUyAxICAgICAgICAvKiBzdGF0dXMgb2YgdmlydHVhbCBjYWxsICovCisjZGVmaW5lIFhZUEFEUiAyICAgICAgICAvKiByZXNldCBvZiB2aXJ0dWFsIGNhbGwgKi8KKyNkZWZpbmUgWFlQQURJIDMgICAgICAgIC8qIHNlbmQgYW4gaW50ZXJydXB0IHBhY2tldCAqLworCisvKiBVc2VkIHdpdGggWFlYMjUuLi4gKi8KKyNkZWZpbmUgWFlVREFUIDAgICAgICAgLyogWC4yNSBjYWxsIHVzZXIgZGF0YSAqLworI2RlZmluZSBYWUNMT1MgMSAgICAgICAvKiBYLjI1IGNsb3NlZCB1c2VyIGdyb3VwIGNhbGwgKi8KKyNkZWZpbmUgWFlSRVZDIDIgICAgICAgLyogWC4yNSByZXZlcnNlIGNoYXJnZSBjYWxsICovCisjZW5kaWYgLyogQU5ZWDI1ICovCisKKyNpZmRlZiBPUzIKKy8qIFNFVCBQUklOVEVSIHN3aXRjaGVzICovCisKKyNkZWZpbmUgUFJOX09VVCAwCQkJLyogT3V0cHV0IG9ubHkgKi8KKyNkZWZpbmUgUFJOX0JJRCAxCQkJLyogQmlkaXJlY3Rpb25hbCAqLworI2RlZmluZSBQUk5fRE9TIDIJCQkvKiBET1MgZGV2aWNlICovCisjZGVmaW5lIFBSTl9XSU4gMwkJCS8qIFdpbmRvd3MgcXVldWUgKi8KKyNkZWZpbmUgUFJOX1RNTyA0CQkJLyogVGltZW91dCAqLworI2RlZmluZSBQUk5fVFJNIDUJCQkvKiBUZXJtaW5hdG9yICovCisjZGVmaW5lIFBSTl9TRVAgNgkJCS8qIFNlcGFyYXRvciAqLworI2RlZmluZSBQUk5fU1BEIDcJCQkvKiBDT00tcG9ydCBzcGVlZCAqLworI2RlZmluZSBQUk5fRkxPIDgJCQkvKiBDT00tcG9ydCBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgUFJOX1BBUiA5CQkJLyogQ09NLXBvcnQgcGFyaXR5ICovCisjZGVmaW5lIFBSTl9OT04gMTAJCQkvKiBObyBwcmludGVyICovCisjZGVmaW5lIFBSTl9GSUwgMTEJCQkvKiBGaWxlbmFtZSAqLworI2RlZmluZSBQUk5fUElQIDEyCQkJLyogUGlwZW5hbWUgKi8KKyNkZWZpbmUgUFJOX1BTICAxMyAgICAgICAgICAgICAgICAgICAgICAvKiBUZXh0IHRvIFBTICovCisjZGVmaW5lIFBSTl9XSUQgMTQgICAgICAgICAgICAgICAgICAgICAgLyogUFMgV2lkdGggKi8KKyNkZWZpbmUgUFJOX0xFTiAxNSAgICAgICAgICAgICAgICAgICAgICAvKiBQUyBMZW5ndGggKi8KKyNkZWZpbmUgUFJOX1JBVyAxNiAgICAgICAgICAgICAgICAgICAgICAvKiBOb24tUFMgKi8KKyNkZWZpbmUgUFJOX0NTICAxNyAgICAgICAgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXIgU2V0ICovCisjZGVmaW5lIFBSTl9NQVggMTcJCQkvKiBOdW1iZXIgb2Ygc3dpdGNoZXMgZGVmaW5lZCAqLworCisvKiBQcmludGVyIHR5cGVzICovCisKKyNkZWZpbmUgUFJUX0RPUyAwCQkJLyogRE9TICovCisjZGVmaW5lIFBSVF9XSU4gMQkJCS8qIFdpbmRvd3MgUXVldWUgKi8KKyNkZWZpbmUgUFJUX0ZJTCAyCQkJLyogRmlsZSAqLworI2RlZmluZSBQUlRfUElQIDMJCQkvKiBQaXBlICovCisjZGVmaW5lIFBSVF9OT04gNAkJCS8qIE5vbmUgKi8KKworI2RlZmluZSBQUklOVFNXSQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PSUNQICovCisKKyNpZm5kZWYgTk9ESUFMCisvKgorICBTeW1ib2xzIGZvciBtb2RlbSB0eXBlcywgbW92ZWQgaGVyZSBmcm9tIGNrdWRpYS5jLCBNYXkgMTk5NywgYmVjYXVzZSBub3cKKyAgdGhleSBhcmUgYWxzbyB1c2VkIGluIHNvbWUgb3RoZXIgbW9kdWxlcy4gIFRoZSBudW1iZXJzIE1VU1QgY29ycmVzcG9uZCB0bworICB0aGUgb3JkZXJpbmcgb2YgZW50cmllcyB3aXRoaW4gdGhlIG1vZGVtcFtdIGFycmF5LgorKi8KKyNpZmRlZiBNSU5JRElBTAkJCQkvKiBNaW5pbXVtIGRpYWxlciBzdXBwb3J0ICovCisKKyNkZWZpbmUgICAgICAgICBuX0RJUkVDVCAgICAgICAgIDAJLyogRGlyZWN0IGNvbm5lY3Rpb24gLS0gbm8gbW9kZW0gKi8KKyNkZWZpbmUJCW5fQ0NJVFQJCSAxCS8qIENDSVRUL0lUVS1UIFYuMjViaXMgKi8KKyNkZWZpbmUJCW5fSEFZRVMJCSAyCS8qIEhheWVzIDI0MDAgKi8KKyNkZWZpbmUJCW5fVU5LTk9XTgkgMwkvKiBVbmtub3duICovCisjZGVmaW5lICAgICAgICAgbl9VREVGICAgICAgICAgICA0CS8qIFVzZXItRGVmaW5lZCAqLworI2RlZmluZSAgICAgICAgIG5fR0VORVJJQyAgICAgICAgNQkvKiBHZW5lcmljIEhpZ2ggU3BlZWQgKi8KKyNkZWZpbmUgICAgICAgICBuX0lUVVRWMjUwICAgICAgIDYJLyogSVRVLVQgVi4yNTAgKi8KKyNkZWZpbmUJCU1BWF9NRE0JCSA2CS8qIE51bWJlciBvZiBtb2RlbSB0eXBlcyAqLworCisjZWxzZQkJCQkJLyogRnVsbC1ibG93biBkaWFsZXIgc3VwcG9ydCAqLworCisjZGVmaW5lICAgICAgICAgbl9ESVJFQ1QgICAgICAgICAwCS8qIERpcmVjdCBjb25uZWN0aW9uIC0tIG5vIG1vZGVtICovCisjZGVmaW5lCQluX0FUVERURE0JIDEKKyNkZWZpbmUgICAgICAgICBuX0FUVElTTiAgICAgICAgIDIKKyNkZWZpbmUJCW5fQVRUTU9ERU0JIDMKKyNkZWZpbmUJCW5fQ0NJVFQJCSA0CisjZGVmaW5lCQluX0NFUk1FVEVLCSA1CisjZGVmaW5lCQluX0RGMDMJCSA2CisjZGVmaW5lCQluX0RGMTAwCQkgNworI2RlZmluZQkJbl9ERjIwMAkJIDgKKyNkZWZpbmUJCW5fR0RDCQkgOQorI2RlZmluZQkJbl9IQVlFUwkJMTAKKyNkZWZpbmUJCW5fUEVOUklMCTExCisjZGVmaW5lCQluX1JBQ0FMCQkxMgorI2RlZmluZQkJbl9VTktOT1dOICAgICAgIDEzCisjZGVmaW5lCQluX1ZFTlRFTAkxNAorI2RlZmluZQkJbl9DT05DT1JECTE1CisjZGVmaW5lCQluX0FUVFVQQwkxNgkvKiBha2EgVU5JWCBQQyBhbmQgQVRUNzMwMCAqLworI2RlZmluZQkJbl9ST0xNICAgICAgICAgIDE3ICAgICAgLyogUm9sbSBDQlggRENNICovCisjZGVmaW5lCQluX01JQ1JPQ09NCTE4CS8qIE1pY3JvY29tcyBpbiBTWCBjb21tYW5kIG1vZGUgKi8KKyNkZWZpbmUgICAgICAgICBuX1VTUiAgICAgICAgICAgMTkJLyogTW9kZXJuIFVTUnMgKi8KKyNkZWZpbmUgICAgICAgICBuX1RFTEVCSVQgICAgICAgMjAgICAgICAvKiBUZWxlYml0cyBvZiBhbGwga2luZHMgKi8KKyNkZWZpbmUgICAgICAgICBuX0RJR0lURUwgICAgICAgMjEJLyogRGlnaXRlbCBEVC0yMiAoQ0NJVFQgdmFyaWFudCkgKi8KKyNkZWZpbmUgICAgICAgICBuX0hfMTIwMCAgICAgICAgMjIJLyogSGF5ZXMgMTIwMCAqLworI2RlZmluZQkJbl9IX1VMVFJBICAgICAgIDIzCS8qIEhheWVzIFVsdHJhIGFuZCBtYXliZSBPcHRpbWEgKi8KKyNkZWZpbmUJCW5fSF9BQ0NVUkEgICAgICAyNAkvKiBIYXllcyBBY2N1cmEgYW5kIG1heWJlIE9wdGltYSAqLworI2RlZmluZSAgICAgICAgIG5fUFBJICAgICAgICAgICAyNQkvKiBQcmFjdGljYWwgUGVyaXBoZXJhbHMgKi8KKyNkZWZpbmUgICAgICAgICBuX0RBVEFQT1JUICAgICAgMjYJLyogQVQmVCBEYXRhcG9ydCAqLworI2RlZmluZSAgICAgICAgIG5fQk9DQSAgICAgICAgICAyNwkvKiBCb2NhICovCisjZGVmaW5lCQluX01PVE9ST0xBICAgICAgMjgJLyogTW90b3JvbGEgRmFzdGFsayBvciBMaWZlc3R5bGUgKi8KKyNkZWZpbmUJCW5fRElHSUNPTU0JMjkJLyogRGlnaWNvbW0gQ29ubmVjdGlvbiAqLworI2RlZmluZQkJbl9EWU5BTElOSyAgICAgIDMwCS8qIER5bmFsaW5rIDE0MTRWRSAqLworI2RlZmluZQkJbl9JTlRFTAkJMzEJLyogSW50ZWwgMTQ0MDAgRmF4bW9kZW0gKi8KKyNkZWZpbmUJCW5fVUNPTV9BVAkzMgkvKiBNaWNyb2NvbXMgaW4gQVQgbW9kZSAqLworI2RlZmluZQkJbl9NVUxUSQkJMzMJLyogTXVsdGl0ZWNoIE1UMTQzMiAqLworI2RlZmluZQkJbl9TVVBSQQkJMzQJLyogU3VwcmFGQVhtb2RlbSAqLworI2RlZmluZQkgICAgICAgIG5fWk9MVFJJWAkzNQkvKiBab2x0cml4ICovCisjZGVmaW5lCQluX1pPT00JCTM2CS8qIFpvb20gKi8KKyNkZWZpbmUJCW5fWllYRUwJCTM3CS8qIFp5WEVMICovCisjZGVmaW5lICAgICAgICAgbl9UQVBJICAgICAgICAgIDM4CS8qIFRBUEkgTGluZSBtb2RlbSAtIHdoYXRldmVyIGl0IGlzICovCisjZGVmaW5lICAgICAgICAgbl9UQk5FVyAgICAgICAgIDM5CS8qIE5ld2VyIFRlbGViaXQgbW9kZWxzICovCisjZGVmaW5lCQluX01BWFRFQ0ggICAgICAgNDAJLyogTWF4VGVjaCBYTTI4OEVBICovCisjZGVmaW5lICAgICAgICAgbl9VREVGICAgICAgICAgIDQxCS8qIFVzZXItRGVmaW5lZCAqLworI2RlZmluZSAgICAgICAgIG5fUldWMzIgICAgICAgICA0MgkvKiBHZW5lcmljIFJvY2t3ZWxsIFYuMzIgKi8KKyNkZWZpbmUgICAgICAgICBuX1JXVjMyQiAgICAgICAgNDMJLyogR2VuZXJpYyBSb2Nrd2VsbCBWLjMyYmlzICovCisjZGVmaW5lICAgICAgICAgbl9SV1YzNCAgICAgICAgIDQ0CS8qIEdlbmVyaWMgUm9ja3dlbGwgVi4zNCAqLworI2RlZmluZQkJbl9NV0FWRQkJNDUJLyogSUJNIE13YXZlIEFkYXB0ZXIgKi8KKyNkZWZpbmUgICAgICAgICBuX1RFTEVQQVRIICAgICAgNDYJLyogR2F0ZXdheSBUZWxlcGF0aCAqLworI2RlZmluZSAgICAgICAgIG5fTUlDUk9MSU5LICAgICA0NwkvKiBNaWNyb0xpbmsgbW9kZW1zICovCisjZGVmaW5lICAgICAgICAgbl9DQVJESU5BTCAgICAgIDQ4CS8qIENhcmRpbmFsIG1vZGVtcyAqLworI2RlZmluZSAgICAgICAgIG5fR0VORVJJQyAgICAgICA0OSAgICAgIC8qIEdlbmVyaWMgaGlnaC1zcGVlZCAqLworI2RlZmluZSAgICAgICAgIG5fWEpBQ0sgICAgICAgICA1MAkvKiBNZWdhaGVydHogWC1KYWNrICovCisjZGVmaW5lICAgICAgICAgbl9TUElSSVRJSSAgICAgIDUxCS8qIFF1aWNrY29tbSBTcGlyaXQgSUkgKi8KKyNkZWZpbmUgICAgICAgICBuX01PTlRBTkEgICAgICAgNTIJLyogTW90b3JvbGEgTW9udGFuYSAqLworI2RlZmluZSAgICAgICAgIG5fQ09NUEFRICAgICAgICA1MwkvKiBDb21wYXEgRGF0YStGYXggTW9kZW0gKi8KKyNkZWZpbmUgICAgICAgICBuX0ZVSklUU1UgICAgICAgNTQJLyogRnVqaXRzdSBGYXgvTW9kZW0gQWRwYXRlciAqLworI2RlZmluZSAgICAgICAgIG5fTUhaQVRUICAgICAgICA1NQkvKiBNZWdhaGVydHogQVQmVCBWLjM0ICovCisjZGVmaW5lICAgICAgICAgbl9TVVBSQVNPTiAgICAgIDU2CS8qIFN1cHJhU29uaWMgKi8KKyNkZWZpbmUgICAgICAgICBuX0JFU1REQVRBICAgICAgNTcJLyogQmVzdCBEYXRhICovCisjZGVmaW5lICAgICAgICAgbl9BVFQxOTAwICAgICAgIDU4ICAgICAgLyogQVQmVCBTVFUgSUlJIE1vZGVsIDE5MDAgKi8KKyNkZWZpbmUgICAgICAgICBuX0FUVDE5MTAgICAgICAgNTkgICAgICAvKiBBVCZUIFNUVSBJSUkgTW9kZWwgMTkxMCAqLworI2RlZmluZSAgICAgICAgIG5fS0VFUElOVE9VQ0ggICA2MAkvKiBBVCZUIEtlZXBpblRvdWNoICovCisjZGVmaW5lICAgICAgICAgbl9VU1JYMiAgICAgICAgIDYxCS8qIFVTUiBYSi0xNTYwIFgyIDU2SyAqLworI2RlZmluZSAgICAgICAgIG5fUk9MTUFUICAgICAgICA2MgkvKiBSb2xtIHdpdGggQVQgY29tbWFuZCBzZXQgKi8KKyNkZWZpbmUJCW5fQVRMQVMgICAgICAgICA2MyAgICAgIC8qIEF0bGFzIC8gTmV3Y29tIGl4ZkMgMzMuNiAqLworI2RlZmluZSAgICAgICAgIG5fQ09ERVggICAgICAgICA2NAkvKiBNb3Rvcm9sYSBDb2RleCAzMjZYIFNlcmllcyAqLworI2RlZmluZSAgICAgICAgIG5fTVQ1NjM0WlBYICAgICA2NQkvKiBNdWx0aXRlY2ggTVQ1NjM0WlBYICovCisjZGVmaW5lICAgICAgICAgbl9VTElOS1YyNTAgICAgIDY2CS8qIE1pY3JvbGluayBJVFUtVCBWLjI1MCA1NksgKi8KKyNkZWZpbmUgICAgICAgICBuX0lUVVRWMjUwICAgICAgNjcJLyogR2VuZXJpYyBJVFUtVCBWLjI1MCAqLworI2RlZmluZSAgICAgICAgIG5fUldWOTAgICAgICAgICA2OAkvKiBHZW5lcmljIFJvY2t3ZWxsIFYuOTAgKi8KKyNkZWZpbmUgICAgICAgICBuX1NVUFJBWCAgICAgICAgNjkgICAgICAvKiBEaWFtb25kIFN1cHJhIEV4cHJlc3MgVi45MCAqLworI2RlZmluZSAgICAgICAgIG5fTFVDRU5UICAgICAgICA3MCAgICAgIC8qIEx1Y2VudCBWZW51cyBjaGlwc2V0ICovCisjZGVmaW5lICAgICAgICAgbl9QQ1RFTCAgICAgICAgIDcxICAgICAgLyogUENUZWwgY2hpcHNldCAqLworI2RlZmluZSAgICAgICAgIG5fQ09ORVhBTlQgICAgICA3MiAgICAgIC8qIENvbmV4YW50IG1vZGVtIGZhbWlseSAqLworI2RlZmluZQkJbl9aT09NVjM0CTczCS8qIFpvb20gKi8KKyNkZWZpbmUJCW5fWk9PTVY5MAk3NAkvKiBab29tICovCisjZGVmaW5lICAgICAgICAgbl9aT09NVjkyICAgICAgIDc1ICAgICAgLyogWk9PTSBWLjkyICovCisjZGVmaW5lICAgICAgICAgbl9NT1RTTTU2ICAgICAgIDc2CS8qIE1vdG9yb2xhIFNNNTYgY2hpcHNldCAqLworI2RlZmluZQkJTUFYX01ETQkJNzYJLyogTnVtYmVyIG9mIG1vZGVtIHR5cGVzICovCisKKyNlbmRpZiAvKiBNSU5JRElBTCAqLworI2VuZGlmIC8qIE5PRElBTCAqLworCisjaWZuZGVmIE5PSUNQCisvKiBTSE9XIGNvbW1hbmQgc3ltYm9scyAqLworCisjZGVmaW5lIFNIUEFSIDAJCQkJLyogUGFyYW1ldGVycyAqLworI2RlZmluZSBTSFZFUiAxCQkJCS8qIFZlcnNpb25zICovCisjZGVmaW5lIFNIQ09NIDIJCQkJLyogQ29tbXVuaWNhdGlvbnMgKi8KKyNkZWZpbmUgU0hQUk8gMwkJCQkvKiBQcm90b2NvbCAqLworI2RlZmluZSBTSEZJTCA0CQkJCS8qIEZpbGUgKi8KKyNkZWZpbmUgU0hMTkcgNQkJCQkvKiBMYW5ndWFnZSAqLworI2RlZmluZSBTSENPVSA2CQkJCS8qIENvdW50ICovCisjZGVmaW5lIFNITUFDIDcJCQkJLyogTWFjcm9zICovCisjZGVmaW5lIFNIS0VZIDgJCQkJLyogS2V5ICovCisjZGVmaW5lIFNIU0NSIDkJCQkJLyogU2NyaXB0cyAqLworI2RlZmluZSBTSFNQRCAxMAkJCS8qIFNwZWVkICovCisjZGVmaW5lIFNIU1RBIDExCQkJLyogU3RhdHVzICovCisjZGVmaW5lIFNIU0VSIDEyCQkJLyogU2VydmVyICovCisjZGVmaW5lIFNIWE1JIDEzCQkJLyogVHJhbnNtaXQgKi8KKyNkZWZpbmUgU0hBVFQgMTQJCQkvKiBBdHRyaWJ1dGVzICovCisjZGVmaW5lIFNITU9EIDE1CQkJLyogTW9kZW0gKi8KKyNkZWZpbmUgU0hERkxUIDE2CQkJLyogRGVmYXVsdCAoYXMgaW4gVk1TKSAqLworI2RlZmluZSBTSFZBUiAxNwkJCS8qIFNob3cgZ2xvYmFsIHZhcmlhYmxlcyAqLworI2RlZmluZSBTSEFSRyAxOAkJCS8qIFNob3cgbWFjcm8gYXJndW1lbnRzICovCisjZGVmaW5lIFNIQVJSIDE5CQkJLyogU2hvdyBhcnJheXMgKi8KKyNkZWZpbmUgU0hCVUkgMjAJCQkvKiBTaG93IGJ1aWx0aW4gdmFyaWFibGVzICovCisjZGVmaW5lIFNIRlVOIDIxCQkJLyogU2hvdyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgU0hQQUQgMjIJCQkvKiBTaG93IChYLjI1KSBQQUQgKi8KKyNkZWZpbmUgU0hURVIgMjMJCQkvKiBTaG93IHRlcm1pbmFsIHNldHRpbmdzICovCisjZGVmaW5lIFNIRVNDIDI0CQkJLyogU2hvdyBlc2NhcGUgY2hhcmFjdGVyICovCisjZGVmaW5lIFNIRElBIDI1CQkJLyogU2hvdyBESUFMIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgU0hORVQgMjYJCQkvKiBTaG93IG5ldHdvcmsgcGFyYW1ldGVycyAqLworI2RlZmluZSBTSExCTCAyNwkJCS8qIFNob3cgVk1TIGxhYmVsZWQgZmlsZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFNIU1RLIDI4CQkJLyogU2hvdyBzdGFjaywgTUFDIGRlYnVnZ2luZyAqLworI2RlZmluZSBTSENTRSAyOQkJCS8qIFNob3cgY2hhcmFjdGVyIHNldHMgKi8KKyNkZWZpbmUgU0hGRUEgMzAJCQkvKiBTaG93IGZlYXR1cmVzICovCisjZGVmaW5lIFNIQ1RMIDMxCQkJLyogU2hvdyBjb250cm9sLXByZWZpeCB0YWJsZSAqLworI2RlZmluZSBTSEVYSSAzMgkJCS8qIFNob3cgRVhJVCBpdGVtcyAqLworI2RlZmluZSBTSFBSVCAzMwkJCS8qIFNob3cgcHJpbnRlciAqLworI2RlZmluZSBTSENNRCAzNAkJCS8qIFNob3cgY29tbWFuZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFNIS1ZCIDM1CQkJLyogU2hvdyBcS3ZlcmJzICovCisjZGVmaW5lIFNITU9VIDM2CQkJLyogU2hvdyBNb3VzZSAobGlrZSBTaG93IEtleSkgKi8KKyNkZWZpbmUgU0hUQUIgMzcJCQkvKiBTaG93IFRhYnMgKE9TLzIpICovCisjZGVmaW5lIFNIVlNDUk4gMzgJCQkvKiBTaG93IFZpcnR1YWwgU2NyZWVuIChPUy8yKSAqLworI2RlZmluZSBTSEFMUk0gIDM5CQkJLyogQUxBUk0gKi8KKyNkZWZpbmUgU0hTRkwgICA0MAkJCS8qIFNFTkQtTElTVCAqLworI2RlZmluZSBTSFVESyAgIDQxICAgICAgICAgICAgICAgICAgICAgIC8qIERFQyBWVCBVREtzIChPUy8yKSAqLworI2RlZmluZSBTSERCTCAgIDQyCQkJLyogRE9VQkxFL0lHTk9SRSBjaGFyYWN0ZXJzICovCisjZGVmaW5lIFNIRURJVCAgICA0MwkJCS8qIEVESVRPUiAqLworI2RlZmluZSBTSEJST1dTRSAgNDQJCQkvKiBCUk9XU0VSICovCisjZGVmaW5lIFNIVEFQSSAgICA0NQkJCS8qIFRBUEkgKi8KKyNkZWZpbmUgU0hUQVBJX0wgIDQ2CQkJLyogVEFQSSBMb2NhdGlvbiAqLworI2RlZmluZSBTSFRBUElfTSAgNDcJCQkvKiBUQVBJIE1vZGVtIFByb3BlcnRpZXMgKi8KKyNkZWZpbmUgU0hUQVBJX0MgIDQ4CQkJLyogVEFQSSBDb21tIFByb3BlcnRpZXMgICovCisjZGVmaW5lIFNIVEVMICAgICA0OQkJCS8qIFNIT1cgVEVMTkVUICovCisjZGVmaW5lIFNISU5QICAgICA1MAkJCS8qIFNIT1cgSU5QVVQgKi8KKyNkZWZpbmUgU0hUUklHICAgIDUxCQkJLyogU0hPVyBUUklHR0VSICovCisjZGVmaW5lIFNITE9HICAgICA1MgkJCS8qIFNIT1cgTE9HUyAqLworI2RlZmluZSBTSE9VVFAgICAgNTMJCQkvKiBTSE9XIE9VVFBVVCAqLworI2RlZmluZSBTSE9QQVQgICAgNTQJCQkvKiBTSE9XIFBBVFRFUk5TICovCisjZGVmaW5lIFNIT1NUUiAgICA1NQkJCS8qIFNIT1cgU1RSRUFNSU5HICovCisjZGVmaW5lIFNIT0FVVEggICA1NgkJCS8qIFNIT1cgQVVUSEVOVElDQVRJT04gKi8KKyNkZWZpbmUgU0hPRlRQICAgIDU3CQkJLyogU0hPVyBGVFAgKi8KKyNkZWZpbmUgU0hUT1BUICAgIDU4ICAgICAgICAgICAgICAgICAgICAvKiBTSE9XIFRFTE9QVCAqLworI2RlZmluZSBTSFhPUFQgICAgNTkJCQkvKiBTSE9XIEVYVEVOREVELU9QVElPTlMgKi8KKyNkZWZpbmUgU0hDRCAgICAgIDYwCQkJLyogU0hPVyBDRCAqLworI2RlZmluZSBTSEFTU09DICAgNjEJCQkvKiBTSE9XIEFTU09DSUFUSU9OUyAqLworI2RlZmluZSBTSENPTk5YICAgNjIJCQkvKiBTSE9XIENPTk5FQ1RJT04gKi8KKyNkZWZpbmUgU0hPUFRTICAgIDYzCQkJLyogU0hPVyBPUFRJT05TICovCisjZGVmaW5lIFNIT0ZMTyAgICA2NAkJCS8qIFNIT1cgRkxPVy1DT05UUk9MICovCisjZGVmaW5lIFNIT1hGRVIgICA2NQkJCS8qIFNIT1cgVFJBTlNGRVIgKi8KKyNkZWZpbmUgU0hUQ1AgICAgIDY2ICAgICAgICAgICAgICAgICAgICAvKiBTSE9XIFRDUCAqLworI2RlZmluZSBTSEhJU1RPUlkgNjcJCQkvKiBTSE9XIChjb21tYW5kKSBISVNUT1JZICovCisjZGVmaW5lIFNIU0VYUCAgICA2OAkJCS8qIFNIT1cgU0VYUFJFU1NJT05TICovCisjZGVmaW5lIFNIT1NTSCAgICA2OQkJCS8qIFNIT1cgU1NIICovCisjZGVmaW5lIFNIT0lLUyAgICA3MCAgICAgICAgICAgICAgICAgICAgLyogU0hPVyBJS1MgKi8KKyNkZWZpbmUgU0hPR1VJICAgIDcxCQkJLyogU0hPVyBSR0IgKi8KKworLyogUkVNT1RFIGNvbW1hbmQgc3ltYm9scyAqLworCisjZGVmaW5lIFhaQ1BZICAwCS8qIENvcHkgKi8KKyNkZWZpbmUgWFpDV0QgIDEJLyogQ2hhbmdlIFdvcmtpbmcgRGlyZWN0b3J5ICovCisjZGVmaW5lIFhaREVMICAyCS8qIERlbGV0ZSAqLworI2RlZmluZSBYWkRJUiAgMwkvKiBEaXJlY3RvcnkgKi8KKyNkZWZpbmUgWFpITFAgIDQJLyogSGVscCAqLworI2RlZmluZSBYWkhPUyAgNQkvKiBIb3N0ICovCisjZGVmaW5lIFhaS0VSICA2CS8qIEtlcm1pdCAqLworI2RlZmluZSBYWkxHSSAgNwkvKiBMb2dpbiAqLworI2RlZmluZSBYWkxHTyAgOAkvKiBMb2dvdXQgKi8KKyNkZWZpbmUgWFpNQUkgIDkJLyogTWFpbCA8LS0gd3JvbmcsIHRoaXMgc2hvdWxkIGJlIHRvcC1sZXZlbCAqLworI2RlZmluZSBYWk1PVSAxMAkvKiBNb3VudCAqLworI2RlZmluZSBYWk1TRyAxMQkvKiBNZXNzYWdlICovCisjZGVmaW5lIFhaUFJJIDEyCS8qIFByaW50ICovCisjZGVmaW5lIFhaUkVOIDEzCS8qIFJlbmFtZSAqLworI2RlZmluZSBYWlNFVCAxNAkvKiBTZXQgKi8KKyNkZWZpbmUgWFpTUEEgMTUJLyogU3BhY2UgKi8KKyNkZWZpbmUgWFpTVUIgMTYJLyogU3VibWl0ICovCisjZGVmaW5lIFhaVFlQIDE3CS8qIFR5cGUgKi8KKyNkZWZpbmUgWFpXSE8gMTgJLyogV2hvICovCisjZGVmaW5lIFhaUFdEIDE5CS8qIFByaW50IFdvcmtpbmcgRGlyZWN0b3J5ICovCisjZGVmaW5lIFhaUVVFIDIwCS8qIFF1ZXJ5ICovCisjZGVmaW5lIFhaQVNHIDIxCS8qIEFzc2lnbiAqLworI2RlZmluZSBYWk1LRCAyMgkvKiBta2RpciAqLworI2RlZmluZSBYWlJNRCAyMwkvKiBybWRpciAqLworI2RlZmluZSBYWlhJVCAyNAkvKiBFeGl0ICovCisjZGVmaW5lIFhaQ0RVIDI1ICAgICAgICAvKiBDRFVQICovCisKKy8qIFNFVCBJTlBVVCBjb21tYW5kIHBhcmFtZXRlcnMgKi8KKworI2RlZmluZSBJTl9ERUYgIDAJCQkvKiBEZWZhdWx0IHRpbWVvdXQgKi8KKyNkZWZpbmUgSU5fVElNICAxCQkJLyogVGltZW91dCBhY3Rpb24gKi8KKyNkZWZpbmUgSU5fQ0FTICAyCQkJLyogQ2FzZSAobWF0Y2hpbmcpICovCisjZGVmaW5lIElOX0VDSCAgMwkJCS8qIEVjaG8gKi8KKyNkZWZpbmUgSU5fU0lMICA0CQkJLyogU2lsZW5jZSAqLworI2RlZmluZSBJTl9CVUYgIDUJCQkvKiBCdWZmZXIgc2l6ZSAqLworI2RlZmluZSBJTl9QQUMgIDYgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IFBhY2luZyAoZGVidWcpICovCisjZGVmaW5lIElOX1RSTSAgNwkJCS8qIElucHV0IFRlcm1pbmFsIERpc3BsYXkgKi8KKyNkZWZpbmUgSU5fQURMICA4CQkJLyogSW5wdXQgYXV0b2Rvd25sb2FkICovCisjZGVmaW5lIElOX1BBVCAgOQkJCS8qIFBhdHRlcm4gdG8gbWF0Y2ggKi8KKyNkZWZpbmUgSU5fQVNHIDEwIAkJCS8qIEFzc2lnbiBtYXRjaGluZyB0ZXh0IHRvIHZhcmlhYmxlICovCisjZGVmaW5lIElOX0NBTiAxMQkJCS8qIEtleWJvYXJkIGNhbmNlbGxhdGlvbiBvZiBJTlBVVCAqLworI2RlZmluZSBJTl9TQ0EgMTIJCQkvKiBUaW1lb3V0IHNjYWxpbmcgKi8KKworLyogRU5BQkxFL0RJU0FCTEUgY29tbWFuZCBwYXJhbWV0ZXJzICovCisKKyNkZWZpbmUgRU5fQUxMICAwCQkJLyogQUxMICovCisjZGVmaW5lIEVOX0NXRCAgMQkJCS8qIENEL0NXRCAqLworI2RlZmluZSBFTl9ESVIgIDIJCQkvKiBESVJFQ1RPUlkgKi8KKyNkZWZpbmUgRU5fRklOICAzCQkJLyogRklOSVNIICovCisjZGVmaW5lIEVOX0dFVCAgNAkJCS8qIEdFVCAqLworI2RlZmluZSBFTl9IT1MgIDUJCQkvKiBIT1NUIGNvbW1hbmQgKi8KKyNkZWZpbmUgRU5fS0VSICA2CQkJLyogS0VSTUlUIGNvbW1hbmQgKi8KKyNkZWZpbmUgRU5fTE9HICA3CQkJLyogTE9HSU4gKi8KKyNkZWZpbmUgRU5fU0VOICA4CQkJLyogU0VORCAqLworI2RlZmluZSBFTl9TRVQgIDkJCQkvKiBTRVQgKi8KKyNkZWZpbmUgRU5fU1BBIDEwCQkJLyogU1BBQ0UgKi8KKyNkZWZpbmUgRU5fVFlQIDExCQkJLyogVFlQRSAqLworI2RlZmluZSBFTl9XSE8gMTIJCQkvKiBXSE8sIGZpbmdlciAqLworI2RlZmluZSBFTl9ERUwgMTMJCQkvKiBEZWxldGUgKi8KKyNkZWZpbmUgRU5fQllFIDE0CQkJLyogQllFIChhcyBvcHBvc2VkIHRvIEZJTklTSCkgKi8KKyNkZWZpbmUgRU5fUVVFIDE1CQkJLyogUVVFUlkgKi8KKyNkZWZpbmUgRU5fQVNHIDE2CQkJLyogQVNTSUdOICovCisjZGVmaW5lIEVOX0NQWSAxNwkJCS8qIENPUFkgKi8KKyNkZWZpbmUgRU5fUkVOIDE4CQkJLyogUkVOQU1FICovCisjZGVmaW5lIEVOX1JFVCAxOQkJCS8qIFJFVFJJRVZFICovCisjZGVmaW5lIEVOX01BSSAyMAkJCS8qIE1BSUwgKi8KKyNkZWZpbmUgRU5fUFJJIDIxCQkJLyogUFJJTlQgKi8KKyNkZWZpbmUgRU5fTUtEIDIyCQkJLyogTUtESVIgKi8KKyNkZWZpbmUgRU5fUk1EIDIzCQkJLyogUk1ESVIgKi8KKyNkZWZpbmUgRU5fWElUIDI0CQkJLyogRVhJVCAqLworI2RlZmluZSBFTl9FTkEgMjUJCQkvKiBFTkFCTEUgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworCisjaWZuZGVmIE5PSUNQCisvKiBDTEVBUiBjb21tYW5kIHN5bWJvbHMgKi8KKyNkZWZpbmUgQ0xSX0RFViAgICAxCQkJLyogQ2xlYXIgRGV2aWNlIEJ1ZmZlcnMgKi8KKyNkZWZpbmUgQ0xSX0lOUCAgICAyCQkJLyogQ2xlYXIgSW5wdXQgQnVmZmVycyAqLworI2RlZmluZSBDTFJfQlRIICAgIENMUl9ERVZ8Q0xSX0lOUAkvKiBDbGVhciBEZXZpY2UgYW5kIElucHV0ICovCisjZGVmaW5lIENMUl9TQ0wgICAgNAkJCS8qIENsZWFyIFNjcm9sbGJhY2sgYnVmZmVyICovCisjZGVmaW5lIENMUl9DTUQgICAgOAkJCS8qIENsZWFyIENvbW1hbmQgU2NyZWVuICovCisjZGVmaW5lIENMUl9UUk0gICAxNgkJCS8qIENsZWFyIFRlcm1pbmFsIFNjcmVlbiAqLworI2RlZmluZSBDTFJfRElBICAgMzIJCQkvKiBDbGVhciBEaWFsIFN0YXR1cyAqLworI2RlZmluZSBDTFJfU0ZMICAgNjQJCQkvKiBDbGVhciBTZW5kLUZpbGUtTGlzdCAqLworI2RlZmluZSBDTFJfQVBDICAxMjgJCQkvKiBDbGVhciBBUEMgKi8KKyNkZWZpbmUgQ0xSX0FMUiAgMjU2CQkJLyogQ2xlYXIgQWxhcm0gKi8KKyNkZWZpbmUgQ0xSX1RYVCAgNTEyCQkJLyogQ2xlYXIgdGV4dC1wYXR0ZXJucyAqLworI2RlZmluZSBDTFJfQklOIDEwMjQJCQkvKiBDbGVhciBiaW5hcnktcGF0dGVybnMgKi8KKyNkZWZpbmUgQ0xSX1NDUiAyMDQ4CQkJLyogQ2xlYXIgc2NyZWVuICovCisjZGVmaW5lIENMUl9LQkQgNDA5NgkJCS8qIENsZWFyIGtleWJvYXJkIGJ1ZmZlciAqLworI2VuZGlmIC8qIE5PSUNQICovCisKKy8qIFN5bWJvbHMgZm9yIGxvZ3MgKi8KKworI2RlZmluZSBMT0dEIDAJCQkJLyogRGVidWdnaW5nICovCisjZGVmaW5lIExPR1AgMQkJCQkvKiBQYWNrZXRzICovCisjZGVmaW5lIExPR1MgMgkJCQkvKiBTZXNzaW9uICovCisjZGVmaW5lIExPR1QgMwkJCQkvKiBUcmFuc2FjdGlvbiAqLworI2RlZmluZSBMT0dYIDQJCQkJLyogU2NyZWVuICovCisjZGVmaW5lIExPR1IgNQkJCQkvKiBUaGUgIm9wZW4gcmVhZCIgZmlsZSAqLworI2RlZmluZSBMT0dXIDYJCQkJLyogVGhlICJvcGVuIHdyaXRlL2FwcGVuZCIgZmlsZSAqLworI2RlZmluZSBMT0dFIDcJCQkJLyogRXJyb3IgKGUuZy4gc3RkZXJyKSAqLworI2RlZmluZSBMT0dNIDgJCQkJLyogVGhlIGRpYWxpbmcgbG9nICovCisKKyNpZm5kZWYgTk9TUEwKKy8qIFN5bWJvbHMgZm9yIGJ1aWx0aW4gdmFyaWFibGVzICovCisKKyNkZWZpbmUgVk5fQVJHQyAwCQkJLyogQVJHQyAqLworI2RlZmluZSBWTl9DT1VOIDEJCQkvKiBDT1VOVCAqLworI2RlZmluZSBWTl9EQVRFIDIJCQkvKiBEQVRFICovCisjZGVmaW5lIFZOX0RJUkUgMwkJCS8qIERJUkVDVE9SWSAqLworI2RlZmluZSBWTl9FUlJPIDQJCQkvKiBFUlJPUkxFVkVMICovCisjZGVmaW5lIFZOX1RJTUUgNQkJCS8qIFRJTUUgKi8KKyNkZWZpbmUgVk5fVkVSUyA2CQkJLyogVkVSU0lPTiAqLworI2RlZmluZSBWTl9JQlVGIDcJCQkvKiBJTlBVVCBidWZmZXIgKi8KKyNkZWZpbmUgVk5fU1VDQyA4CQkJLyogU1VDQ0VTUyBmbGFnICovCisjZGVmaW5lIFZOX0xJTkUgOQkJCS8qIExJTkUgKi8KKyNkZWZpbmUgVk5fQVJHUyAxMAkJCS8qIFByb2dyYW0gY29tbWFuZC1saW5lIGFyZyBjb3VudCAqLworI2RlZmluZSBWTl9TWVNUIDExCQkJLyogU3lzdGVtIHR5cGUgKi8KKyNkZWZpbmUgVk5fU1lTViAxMgkJCS8qIFN5c3RlbSB2ZXJzaW9uICovCisjZGVmaW5lIFZOX1JFVCAgMTMJCQkvKiBSRVRVUk4gdmFsdWUgKi8KKyNkZWZpbmUgVk5fRklMRSAxNAkJCS8qIE1vc3QgcmVjZW50IGZpbGVzcGVjICovCisjZGVmaW5lIFZOX05EQVQgMTUJCQkvKiBOdW1lcmljIGRhdGUgeXl5eS9tbS9kZCAqLworI2RlZmluZSBWTl9IT01FIDE2CQkJLyogSG9tZSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgVk5fU1BFRSAxNwkJCS8qIFRyYW5zbWlzc2lvbiBzcGVlZCAqLworI2RlZmluZSBWTl9IT1NUIDE4CQkJLyogSG9zdCBuYW1lICovCisjZGVmaW5lIFZOX1RUWUYgMTkJCQkvKiBUVFkgZmlsZSBkZXNjcmlwdG9yIChVTklYIG9ubHkpICovCisjZGVmaW5lIFZOX1BST0cgMjAJCQkvKiBQcm9ncmFtIG5hbWUgKi8KKyNkZWZpbmUgVk5fTlRJTSAyMQkJCS8qIE5USU1FICovCisjZGVmaW5lIFZOX0ZGQyAgMjIJCQkvKiBDaGFyYWN0ZXJzIGluIGxhc3QgZmlsZSB4ZmVycmVkICovCisjZGVmaW5lIFZOX1RGQyAgMjMJCQkvKiBDaGFycyBpbiBsYXN0IGZpbGUgZ3JvdXAgeGZlcnJlZCAqLworI2RlZmluZSBWTl9DUFUgIDI0CQkJLyogQ1BVIHR5cGUgKi8KKyNkZWZpbmUgVk5fQ01ETCAyNQkJCS8qIENvbW1hbmQgbGV2ZWwgKi8KKyNkZWZpbmUgVk5fREFZICAyNiAgICAgICAgICAgICAgICAgICAgICAvKiBEYXkgb2Ygd2Vlaywgc3RyaW5nICovCisjZGVmaW5lIFZOX05EQVkgMjcgICAgICAgICAgICAgICAgICAgICAgLyogRGF5IG9mIHdlZWssIG51bWVyaWMgKi8KKyNkZWZpbmUgVk5fTENMICAyOAkJCS8qIExvY2FsICh2cykgcmVtb3RlIG1vZGUgKi8KKyNkZWZpbmUgVk5fQ01EUyAyOQkJCS8qIENvbW1hbmQgc291cmNlICovCisjZGVmaW5lIFZOX0NNREYgMzAJCQkvKiBDb21tYW5kIGZpbGUgbmFtZSAqLworI2RlZmluZSBWTl9NQUMgIDMxCQkJLyogTWFjcm8gbmFtZSAqLworI2RlZmluZSBWTl9FWElUIDMyCQkJLyogRXhpdCBzdGF0dXMgKi8KKyNkZWZpbmUgVk5fSUNIUiAzMwkJCS8qIElOUFVUIGNoYXJhY3RlciAqLworI2RlZmluZSBWTl9JQ05UIDM0CQkJLyogSU5QVVQgY291bnQgKi8KKyNkZWZpbmUgVk5fUFJUWSAzNQkJCS8qIEN1cnJlbnQgcGFyaXR5ICovCisjZGVmaW5lIFZOX0RJQUwgMzYJCQkvKiBESUFMIHN0YXR1cyAqLworI2RlZmluZSBWTl9LRVlCIDM3CQkJLyogS2V5Ym9hcmQgdHlwZSAqLworI2RlZmluZSBWTl9DUFMgIDM4CQkJLyogQ2hhcnMgcGVyIHNlY29uZCwgbGFzdCB0cmFuc2ZlciAqLworI2RlZmluZSBWTl9SUEwgIDM5CQkJLyogUmVjZWl2ZSBwYWNrZXQgbGVuZ3RoICovCisjZGVmaW5lIFZOX1NQTCAgNDAJCQkvKiBTZW5kIHBhY2tldCBsZW5ndGggKi8KKyNkZWZpbmUgVk5fTU9ERSA0MQkJCS8qIFRyYW5zZmVyIG1vZGUgKHRleHQsIGJpbmFyeSkgKi8KKyNkZWZpbmUgVk5fUkVYWCA0MgkJCS8qIFJleHggcmV0dXJuIHZhbHVlICovCisjZGVmaW5lIFZOX05FV0wgNDMJCQkvKiBOZXdsaW5lIGNoYXJhY3RlciBvciBzZXF1ZW5jZSAqLworI2RlZmluZSBWTl9DT0xTIDQ0CQkJLyogQ29sdW1ucyBvbiBjb25zb2xlIHNjcmVlbiAqLworI2RlZmluZSBWTl9ST1dTIDQ1CQkJLyogUm93cyBvbiBjb25zb2xlIHNjcmVlbiAqLworI2RlZmluZSBWTl9UVFlQIDQ2CQkJLyogVGVybWluYWwgdHlwZSAqLworI2RlZmluZSBWTl9NSU5QIDQ3CQkJLyogTUlOUFVUIHJlc3VsdCAqLworI2RlZmluZSBWTl9DT05OIDQ4CQkJLyogQ29ubmVjdGlvbiB0eXBlICovCisjZGVmaW5lIFZOX1NZU0kgNDkJCQkvKiBTeXN0ZW0gSUQgKi8KKyNkZWZpbmUgVk5fVFogICA1MAkJCS8qIFRpbWV6b25lICovCisjZGVmaW5lIFZOX1NQQSAgNTEJCQkvKiBTcGFjZSAqLworI2RlZmluZSBWTl9RVUUgIDUyCQkJLyogUXVlcnkgKi8KKyNkZWZpbmUgVk5fU1RBUiA1MwkJCS8qIFN0YXJ0dXAgZGlyZWN0b3J5ICovCisjZGVmaW5lIFZOX0NTRVQgNTQJCQkvKiBMb2NhbCBjaGFyYWN0ZXIgc2V0ICovCisjZGVmaW5lIFZOX01ETSAgNTUJCQkvKiBNb2RlbSB0eXBlICovCisjZGVmaW5lIFZOX0VWQUwgNTYJCQkvKiBNb3N0IHJlY2VudCBFVkFMVUFURSByZXN1bHQgKi8KKworI2RlZmluZSBWTl9EX0NDIDU3CQkJLyogRElBTCBDT1VOVFJZLUNPREUgKi8KKyNkZWZpbmUgVk5fRF9BQyA1OAkJCS8qIERJQUwgQVJFQS1DT0RFICovCisjZGVmaW5lIFZOX0RfSVAgNTkJCQkvKiBESUFMIElOVEVSTkFUSU9OQUwtUFJFRklYICovCisjZGVmaW5lIFZOX0RfTFAgNjAJCQkvKiBESUFMIExELVBSRUZJWCAqLworCisjZGVmaW5lIFZOX1VJRCAgNjEKKyNkZWZpbmUgVk5fUFdEICA2MgorI2RlZmluZSBWTl9QUk0gIDYzCisKKyNkZWZpbmUgVk5fUFJPVE8gNjQJCQkvKiBQcm90b2NvbCAqLworI2RlZmluZSBWTl9ETERJUiA2NQkJCS8qIERvd25sb2FkIGRpcmVjdG9yeSAqLworCisjZGVmaW5lIFZOX01fQUFBIDY2CQkJLyogRmlyc3QgTU9ERU0gb25lICovCisjZGVmaW5lIFZOX01fSU5JIDY2CQkJLyogTW9kZW0gaW5pdCBzdHJpbmcgKi8KKyNkZWZpbmUgVk5fTV9EQ00gNjcJCQkvKiBNb2RlbSBkaWFsIGNvbW1hbmQgKi8KKyNkZWZpbmUgVk5fTV9EQ08gNjgJCQkvKiBNb2RlbSBkYXRhIGNvbXByZXNzaW9uIG9uICovCisjZGVmaW5lIFZOX01fRENYIDY5CQkJLyogTW9kZW0gZGF0YSBjb21wcmVzc2lvbiBvZmYgKi8KKyNkZWZpbmUgVk5fTV9FQ08gNzAJCQkvKiBNb2RlbSBlcnJvciBjb3JyZWN0aW9uIG9uICovCisjZGVmaW5lIFZOX01fRUNYIDcxCQkJLyogTW9kZW0gZXJyb3IgY29ycmVjdGlvbiBvZmYgKi8KKyNkZWZpbmUgVk5fTV9BQU8gNzIJCQkvKiBNb2RlbSBhdXRvYW5zd2VyIG9uICovCisjZGVmaW5lIFZOX01fQUFYIDczCQkJLyogTW9kZW0gYXV0b2Fuc3dlciBvZmYgKi8KKyNkZWZpbmUgVk5fTV9IVVAgNzQJCQkvKiBNb2RlbSBoYW5ndXAgY29tbWFuZCAqLworI2RlZmluZSBWTl9NX0hXRiA3NQkJCS8qIE1vZGVtIGhhcmR3YXJlIGZsb3cgY29tbWFuZCAqLworI2RlZmluZSBWTl9NX1NXRiA3NgkJCS8qIE1vZGVtIHNvZnR3YXJlIGZsb3cgY29tbWFuZCAqLworI2RlZmluZSBWTl9NX05GQyA3NwkJCS8qIE1vZGVtIG5vIGZsb3ctY29udHJvbCBjb21tYW5kICovCisjZGVmaW5lIFZOX01fUERNIDc4CQkJLyogTW9kZW0gcHVsc2UgZGlhbGluZyBtb2RlICovCisjZGVmaW5lIFZOX01fVERNIDc5CQkJLyogTW9kZW0gdG9uZSBkaWFsaW5nIG1vZGUgKi8KKyNkZWZpbmUgVk5fTV9aWlogNzkJCQkvKiBMYXN0IE1PREVNIG9uZSAqLworCisjZGVmaW5lIFZOX1NFTENUIDgwCQkJLyogU2VsZWN0ZWQgVGV4dCBmcm9tIE1hcmsgTW9kZSAqLworI2RlZmluZSBWTl9URU1QICA4MQkJCS8qIFRlbXBvcmFyeSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgVk5fSVNUQVQgODIJCQkvKiBJTlBVVCBjb21tYW5kIHN0YXR1cyAqLworI2RlZmluZSBWTl9JTkkgICA4MwkJCS8qIElOSSAoa2VybXJjKSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgVk5fRVhFRElSIDg0CQkJLyogRVhFIGRpcmVjdG9yeSAqLworI2RlZmluZSBWTl9FUlJOTyAgODUJCQkvKiBWYWx1ZSBvZiBlcnJubyAqLworI2RlZmluZSBWTl9FUlNUUiAgODYJCQkvKiBDb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2UgKi8KKyNkZWZpbmUgVk5fVEZMTiAgIDg3CQkJLyogVEFLRSBmaWxlIGxpbmUgbnVtYmVyICovCisjZGVmaW5lIFZOX1hWTlVNICA4OAkJCS8qIFByb2R1Y3Qtc3BlY2lmaWMgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgVk5fUlBTSVogIDg5CQkJLyogUmVjZWl2ZSBwYWNrZXQgbGVuZ3RoICovCisjZGVmaW5lIFZOX1dJTkRPICA5MAkJCS8qIFdpbmRvdyBzaXplICovCisjZGVmaW5lIFZOX01ETVNHICA5MQkJCS8qIE1vZGVtIG1lc3NhZ2UgKi8KKyNkZWZpbmUgVk5fRE5VTSAgIDkyCQkJLyogRGlhbCBudW1iZXIgKi8KKyNkZWZpbmUgVk5fQVBDICAgIDkzCQkJLyogQVBDIGFjdGl2ZSAqLworI2RlZmluZSBWTl9JUEFERFIgOTQJCQkvKiBNeSBJUCBhZGRyZXNzICovCisjZGVmaW5lIFZOX0NSQzE2ICA5NQkJCS8qIENSQy0xNiBvZiBtb3N0IHJlY2VudCBmaWxlIGdyb3VwICovCisjZGVmaW5lIFZOX1RSTUsgICA5NiAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gZXhlY3V0ZWQgZnJvbSBUZXJtaW5hbCBNb2RlICovCisjZGVmaW5lIFZOX1BJRCAgICA5NwkJCS8qIFByb2Nlc3MgSUQgKi8KKyNkZWZpbmUgVk5fRk5BTSAgIDk4CQkJLyogTmFtZSBvZiBmaWxlIGJlaW5nIHRyYW5zZmVycmVkICovCisjZGVmaW5lIFZOX0ZOVU0gICA5OQkJCS8qIE51bWJlciBvZiBmaWxlIGJlaW5nIHRyYW5zZmVycmVkICovCisjZGVmaW5lIFZOX1BFWElUICAxMDAJCQkvKiBQcm9jZXNzIGV4aXQgc3RhdHVzICovCisjZGVmaW5lIFZOX1BfQ1RMICAxMDEgCQkJLyogQ29udHJvbCBQcmVmaXggKi8KKyNkZWZpbmUgVk5fUF84QklUIDEwMgkJCS8qIDgtYml0IHByZWZpeCAqLworI2RlZmluZSBWTl9QX1JQVCAgMTAzCQkJLyogUmVwZWF0IGNvdW50IHByZWZpeCAqLworI2RlZmluZSBWTl9EX0xDUCAgMTA0CQkJLyogRElBTCBMT0NBTC1QUkVGSVggKi8KKyNkZWZpbmUgVk5fVVJMICAgIDEwNQkJCS8qIExhc3QgVVJMIHNlbGVjdGVkICovCisjZGVmaW5lIFZOX1JFR04gICAxMDYJCQkvKiBSZWdpc3RyYXRpb24gTmFtZSAqLworI2RlZmluZSBWTl9SRUdPICAgMTA3CQkJLyogUmVnaXN0cmF0aW9uIE9yZ2FuaXphdGlvbiAqLworI2RlZmluZSBWTl9SRUdTICAgMTA4CQkJLyogUmVnaXN0cmF0aW9uIFNlcmlhbCBudW1iZXIgKi8KKyNkZWZpbmUgVk5fWFBST0cgIDEwOQkJCS8qIHhwcm9ncmFtIChsaWtlIHh2ZXJzaW9uKSAqLworI2RlZmluZSBWTl9FRElUT1IgMTEwCQkJLyogRWRpdG9yICovCisjZGVmaW5lIFZOX0VET1BUICAxMTEJCQkvKiBFZGl0b3Igb3B0aW9ucyAqLworI2RlZmluZSBWTl9FREZJTEUgMTEyCQkJLyogRWRpdG9yIGZpbGUgKi8KKyNkZWZpbmUgVk5fQlJPV1NSIDExMwkJCS8qIEJyb3dzZXIgKi8KKyNkZWZpbmUgVk5fQlJPUFQgIDExNAkJCS8qIEJyb3dzZXIgb3B0aW9ucyAqLworI2RlZmluZSBWTl9IRVJBTEQgMTE1CQkJLyogUHJvZ3JhbSBoZXJhbGQgKi8KKyNkZWZpbmUgVk5fVEVTVCAgIDExNgkJCS8qIFByb2dyYW0gdGVzdCBsZXZlbCBvciAiMCIgKi8KKyNkZWZpbmUgVk5fWEZTVEFUIDExNwkJCS8qIEZpbGUtVHJhbnNmZXIgc3RhdHVzICovCisjZGVmaW5lIFZOX1hGTVNHICAxMTkJCQkvKiBGaWxlLVRyYW5zZmVyIG1lc3NhZ2UgKi8KKyNkZWZpbmUgVk5fU05ETCAgIDEyMAkJCS8qIFNlbmQtbGlzdCBzdGF0dXMgKi8KKyNkZWZpbmUgVk5fVFJJRyAgIDEyMQkJCS8qIFRyaWdnZXIgdmFsdWUgKi8KKyNkZWZpbmUgVk5fTU9VX1ggIDEyMiAgICAgICAgICAgICAgICAgICAvKiBPUy8yIE1vdXNlIEN1cnNvciBYICovCisjZGVmaW5lIFZOX01PVV9ZICAxMjMgICAgICAgICAgICAgICAgICAgLyogT1MvMiBNb3VzZSBDdXJzb3IgWSAqLworI2RlZmluZSBWTl9QUklOVCAgMTI0CQkJLyogUHJpbnRlciAqLworI2RlZmluZSBWTl9FU0MgICAgMTI1CQkJLyogRXNjYXBlIGNoYXJhY3RlciAqLworI2RlZmluZSBWTl9JTlRJTUUgMTI2CQkJLyogSU5QVVQgZWxhcHNlZCB0aW1lICovCisjZGVmaW5lIFZOX0s0UkxNICAxMjcJCQkvKiBLZXJiZXJvcyA0IFJlYWxtICovCisjZGVmaW5lIFZOX0s1UkxNICAxMjgJCQkvKiBLZXJiZXJvcyA1IFJlYWxtICovCisjZGVmaW5lIFZOX0s0UFJOICAxMjkJCQkvKiBLZXJiZXJvcyA0IFByaW5jaXBhbCAqLworI2RlZmluZSBWTl9LNVBSTiAgMTMwCQkJLyogS2VyYmVyb3MgNSBQcmluY2lwYWwgKi8KKyNkZWZpbmUgVk5fSzRDQyAgIDEzMQkJCS8qIEtlcmJlcm9zIDQgQ3JlZGVudGlhbHMgQ2FjaGUgKi8KKyNkZWZpbmUgVk5fSzVDQyAgIDEzMgkJCS8qIEtlcmJlcm9zIDUgQ3JlZGVudGlhbHMgQ2FjaGUgKi8KKyNkZWZpbmUgVk5fT1NOQU0gIDEzMwkJCS8qIE9TIG5hbWUgKi8KKyNkZWZpbmUgVk5fT1NWRVIgIDEzNAkJCS8qIE9TIHZlcnNpb24gKi8KKyNkZWZpbmUgVk5fT1NSRUwgIDEzNQkJCS8qIE9TIHJlbGVhc2UgKi8KKyNkZWZpbmUgVk5fTkFNRSAgIDEzNgkJCS8qIE5hbWUgSSB3YXMgY2FsbGVkIGJ5ICovCisjZGVmaW5lIFZOX01PREwgICAxMzcJCQkvKiBDUFUgbW9kZWwgKi8KKyNkZWZpbmUgVk5fWDI1TEEgIDEzOAkJCS8qIFguMjUgbG9jYWwgYWRkcmVzcyAqLworI2RlZmluZSBWTl9YMjVSQSAgMTM5CQkJLyogWC4yNSByZW1vdGUgYWRkcmVzcyAqLworI2RlZmluZSBWTl9LNFNSViAgMTQwICAgICAgICAgICAgICAgICAgIC8qIEtlcmJlcm9zIDQgU2VydmljZSBOYW1lICovCisjZGVmaW5lIFZOX0s1U1JWICAxNDEgICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgNSBTZXJ2aWNlIE5hbWUgKi8KKyNkZWZpbmUgVk5fUERTRlggIDE0MgkJCS8qIFBESUFMIHN1ZmZpeCAqLworI2RlZmluZSBWTl9EVFlQRSAgMTQzCQkJLyogRElBTCB0eXBlICovCisjZGVmaW5lIFZOX0xDS1BJRCAxNDQJCQkvKiBMb2NrZmlsZSBQSUQgKFVOSVgpICovCisjZGVmaW5lIFZOX0JMSyAgICAxNDUJCQkvKiBCbG9jayBjaGVjayAqLworI2RlZmluZSBWTl9URlRJTSAgMTQ2CQkJLyogRmlsZSB0cmFuc2ZlciBlbGFwc2VkIHRpbWUgKi8KKyNkZWZpbmUgVk5fRF9QWFggIDE0NyAJCQkvKiBESUFMIFBCWC1FWENIQU5HRSAqLworI2RlZmluZSBWTl9IV1BBUiAgMTQ4IAkJCS8qIEhhcmR3YXJlIFBhcml0eSAqLworI2RlZmluZSBWTl9TRVJJQUwgMTQ5IAkJCS8qIFNFVCBTRVJJQUwgdmFsdWUgKi8KKyNkZWZpbmUgVk5fTENLRElSIDE1MAkJCS8qIExvY2tmaWxlIGRpcmVjdG9yeSAoVU5JWCkgKi8KKworI2RlZmluZSBWTl9LNEVOTyAgMTUxICAgICAgICAgICAgICAgICAgIC8qIEtlcmJlcm9zIDQgTGFzdCBFcnJubyAqLworI2RlZmluZSBWTl9LNEVNU0cgMTUyICAgICAgICAgICAgICAgICAgIC8qIEtlcmJlcm9zIDQgTGFzdCBFcnIgTXNnICovCisjZGVmaW5lIFZOX0s1RU5PICAxNTMgICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgNSBMYXN0IEVycm5vICovCisjZGVmaW5lIFZOX0s1RU1TRyAxNTQgICAgICAgICAgICAgICAgICAgLyogS2VyYmVyb3MgNSBMYXN0IEVyciBNc2cgKi8KKworI2RlZmluZSBWTl9JTlRNTyAgMTU1CQkJLyogSW5wdXQgdGltZW91dCAqLworI2RlZmluZSBWTl9BVVRIUyAgMTU2ICAgICAgICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIFN0YXRlICovCisKKyNkZWZpbmUgVk5fRE1fTFAgIDE1NwkJCS8qIERpYWwgTW9kaWZpZXI6IExvbmcgUGF1c2UgKi8KKyNkZWZpbmUgVk5fRE1fU1AgIDE1OAkJCS8qIERpYWwgTW9kaWZpZXI6IFNob3J0IFBhdXNlICovCisjZGVmaW5lIFZOX0RNX1BEICAxNTkJCQkvKiBEaWFsIE1vZGlmaWVyOiBQdWxzZSBEaWFsICovCisjZGVmaW5lIFZOX0RNX1REICAxNjAJCQkvKiBEaWFsIE1vZGlmaWVyOiBUb25lIERpYWwgKi8KKyNkZWZpbmUgVk5fRE1fV0EgIDE2MQkJCS8qIERpYWwgTW9kaWZpZXI6IFdhaXQgZm9yIEFuc3dlciAqLworI2RlZmluZSBWTl9ETV9XRCAgMTYyCQkJLyogRGlhbCBNb2RpZmllcjogV2FpdCBmb3IgRGlhbHRvbmUgKi8KKyNkZWZpbmUgVk5fRE1fUkMgIDE2MwkJCS8qIERpYWwgTW9kaWZpZXI6IFJldHVybiB0byBDb21tYW5kICovCisKKy8qIChtb3JlIGJlbG93Li4uKSAqLworCisjZGVmaW5lIFZOX1RZX0xOICAxNjQJCQkvKiBUWVBFIGNvbW1hbmQgbGluZSBudW1iZXIgKi8KKyNkZWZpbmUgVk5fVFlfTEMgIDE2NQkJCS8qIFRZUEUgY29tbWFuZCBsaW5lIGNvdW50ICovCisjZGVmaW5lIFZOX1RZX0xNICAxNjYJCQkvKiBUWVBFIGNvbW1hbmQgbWF0Y2ggY291bnQgKi8KKworI2RlZmluZSBWTl9NQUNMVkwgMTY3CQkJLyogXHYobWFjbGV2ZWwpICovCisKKyNkZWZpbmUgVk5fWEZfQkMgIDE2OAkJCS8qIFRyYW5zZmVyIGJsb2NrY2hlY2sgZXJyb3JzICovCisjZGVmaW5lIFZOX1hGX1RNICAxNjkJCQkvKiBUcmFuc2ZlciB0aW1lb3V0cyAqLworI2RlZmluZSBWTl9YRl9SWCAgMTcwCQkJLyogVHJhbnNmZXIgcmV0cmFuc21pc3Npb25zICovCisKKyNkZWZpbmUgVk5fTV9OQU0gIDE3MQkJCS8qIE1vZGVtIGZ1bGwgbmFtZSAgKi8KKyNkZWZpbmUgVk5fTVNfQ0QgIDE3MgkJCS8qIE1vZGVtIHNpZ25hbCBDRCAgKi8KKyNkZWZpbmUgVk5fTVNfQ1RTIDE3MwkJCS8qIE1vZGVtIHNpZ25hbCBDVFMgKi8KKyNkZWZpbmUgVk5fTVNfRFNSIDE3NAkJCS8qIE1vZGVtIHNpZ25hbCBEU1IgKi8KKyNkZWZpbmUgVk5fTVNfRFRSIDE3NQkJCS8qIE1vZGVtIHNpZ25hbCBEVFIgKi8KKyNkZWZpbmUgVk5fTVNfUkkgIDE3NgkJCS8qIE1vZGVtIHNpZ25hbCBSSSAgKi8KKyNkZWZpbmUgVk5fTVNfUlRTIDE3NwkJCS8qIE1vZGVtIHNpZ25hbCBSVFMgKi8KKworI2RlZmluZSBWTl9NQVRDSCAgMTc4CQkJLyogTW9zdCByZWNlbnQgcGF0dGVybiBtYXRjaCAqLworI2RlZmluZSBWTl9TTE1TRyAgMTc5CQkJLyogU0VUIExJTkUgKGVycm9yKSBtZXNzYWdlICovCisjZGVmaW5lIFZOX1RYVERJUiAxODAJCQkvKiBLZXJtaXQgdGV4dC1maWxlIGRpcmVjdG9yeSAqLworI2RlZmluZSBWTl9NQV9QSSAgMTgxCQkJLyogTWF0aCBjb25zdGFudCBQaSAqLworI2RlZmluZSBWTl9NQV9FICAgMTgyCQkJLyogTWF0aCBjb25zdGFudCBlICovCisjZGVmaW5lIFZOX01BX1BSICAxODMJCQkvKiBNYXRoIHByZWNpc2lvbiAoZGlnaXRzKSAqLworI2RlZmluZSBWTl9DTURCTCAgMTg0CQkJLyogQ29tbWFuZCBidWZmZXIgbGVuZ3RoICovCisKKyNkZWZpbmUgVk5fQVVUSFQgIDE4NSAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBUeXBlICovCisKKyNpZmRlZiBDS0NIQU5ORUxJTworI2RlZmluZSBWTl9GRVJSICAgMTg2CQkJLyogRklMRSBlcnJvciAqLworI2RlZmluZSBWTl9GTUFYICAgMTg3CQkJLyogRklMRSBtYXggKi8KKyNkZWZpbmUgVk5fRkNPVSAgIDE4OAkJCS8qIFJlc3VsdCBvZiBsYXN0IEZJTEUgQ09VTlQgKi8KKyNlbmRpZiAvKiBDS0NIQU5ORUxJTyAqLworCisjZGVmaW5lIFZOX0RSVFIgICAxODkJCQkvKiBESUFMIHJldHJ5IGNvdW50ZXIgKi8KKyNkZWZpbmUgVk5fQ1hUSU1FIDE5MAkJCS8qIEVsYXBzZWQgdGltZSBpbiBzZXNzaW9uICovCisjZGVmaW5lIFZOX0JZVEUgICAxOTEJCQkvKiBCeXRlIG9yZGVyICovCisjZGVmaW5lIFZOX0FVVEhOICAxOTIgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gTmFtZSAqLworI2RlZmluZSBWTl9LQkNIQVIgMTkzCQkJLyoga2JjaGFyICovCisjZGVmaW5lIFZOX1RUWU5BTSAxOTQJCQkvKiBOYW1lIG9mIGNvbnRyb2xsaW5nIHRlcm1pbmFsICovCisKKyNkZWZpbmUgVk5fWDUwOV9TIDE5NSAgICAgICAgICAgICAgICAgICAvKiBYLjUwOSBDZXJ0aWZpY2F0ZSBTdWJqZWN0ICovCisjZGVmaW5lIFZOX1g1MDlfSSAxOTYgICAgICAgICAgICAgICAgICAgLyogWC41MDkgQ2VydGlmaWNhdGUgSXNzdWVyICAqLworCisjZGVmaW5lIFZOX1BST01QVCAxOTcJCQkvKiBDLUtlcm1pdCdzIHByb21wdCAqLworI2RlZmluZSBWTl9CVUlMRCAgMTk4CQkJLyogQnVpbGQgSUQgc3RyaW5nICovCisKKyNkZWZpbmUgVk5fU0VYUCAgIDE5OQkJCS8qIExhc3QgUy1FeHByZXNzaW9uICovCisjZGVmaW5lIFZOX1ZTRVhQICAyMDAJCQkvKiBWYWx1ZSBvZiBsYXN0IFMtRXhwcmVzc2lvbiAqLworI2RlZmluZSBWTl9MU0VYUCAgMjAxCQkJLyogU0VYUCBkZXB0aCAqLworCisjZGVmaW5lIFZOX0ZUSU1FICAyMDIJCQkvKiBUaW1lIGFzIGZsb2F0aW5nLXBvaW5nIG51bWJlciAqLworCisjZGVmaW5lIFZOX0ZUUF9DICAyMDMgICAgICAgICAgICAgICAgICAgLyogRlRQIFJlcGx5IENvZGUgKi8KKyNkZWZpbmUgVk5fRlRQX00gIDIwNCAgICAgICAgICAgICAgICAgICAvKiBGVFAgUmVwbHkgTWVzc2FnZSAqLworI2RlZmluZSBWTl9GVFBfUyAgMjA1CQkJLyogRlRQIFNlcnZlciB0eXBlICovCisjZGVmaW5lIFZOX0ZUUF9IICAyMDYJCQkvKiBGVFAgSG9zdCAqLworI2RlZmluZSBWTl9GVFBfWCAgMjA3CQkJLyogRlRQIENvbm5lY3RlZCAqLworI2RlZmluZSBWTl9GVFBfTCAgMjA4CQkJLyogRlRQIExvZ2dlZCBpbiAqLworI2RlZmluZSBWTl9GVFBfRyAgMjA5CQkJLyogRlRQIEdFVC1QVVQtUkVNT1RFIHNldHRpbmcgKi8KKworI2RlZmluZSBWTl9TRUNVUkUgMjEwICAgICAgICAgICAgICAgICAgIC8qIEVuY3J5cHRlZCBjb25uZWN0aW9uIDAgb3IgMSAqLworCisjZGVmaW5lIFZOX0RNX0hGICAyMTEJCQkvKiBEaWFsIE1vZGlmaWVyOiBIb29rIEZsYXNoICovCisjZGVmaW5lIFZOX0RNX1dCICAyMTIJCQkvKiBEaWFsIE1vZGlmaWVyOiBXYWl0IGZvciBCb25nICovCisjZGVmaW5lIFZOX0NYX1NUQSAyMTMJCQkvKiBDWF9TVEFUVVMgKi8KKworI2RlZmluZSBWTl9GVFBfQiAgMjE0ICAgICAgICAgICAgICAgICAgIC8qIEZUUCBDUEwgKi8KKyNkZWZpbmUgVk5fRlRQX0QgIDIxNSAgICAgICAgICAgICAgICAgICAvKiBGVFAgRFBMICovCisjZGVmaW5lIFZOX0ZUUF9aICAyMTYgICAgICAgICAgICAgICAgICAgLyogRlRQIFNFQ1VSSVRZICovCisjZGVmaW5lIFZOX0hUVFBfQyAyMTcgICAgICAgICAgICAgICAgICAgLyogSFRUUCBDb2RlICovCisjZGVmaW5lIFZOX0hUVFBfTiAyMTggICAgICAgICAgICAgICAgICAgLyogSFRUUCBDb25uZWN0ZWQgKi8KKyNkZWZpbmUgVk5fSFRUUF9IIDIxOSAgICAgICAgICAgICAgICAgICAvKiBIVFRQIEhvc3QgKi8KKyNkZWZpbmUgVk5fSFRUUF9NIDIyMCAgICAgICAgICAgICAgICAgICAvKiBIVFRQIE1lc3NhZ2UgKi8KKyNkZWZpbmUgVk5fSFRUUF9TIDIyMSAgICAgICAgICAgICAgICAgICAvKiBIVFRQIFNlY3VyaXR5ICovCisKKyNkZWZpbmUgVk5fTk9XICAgIDIyMgkJCS8qIFRpbWVzdGFtcCB5eXl5bW1kZCBoaDptbTpzcyAqLworI2RlZmluZSBWTl9IT1VSICAgMjIzCQkJLyogQ3VycmVudCBob3VyIG9mIHRoZSBkYXkgMC0yMyAqLworCisjZGVmaW5lIFZOX0NJX0RBICAyMjQJCQkvKiBDYWxsZXIgSUQgZGF0ZSAqLworI2RlZmluZSBWTl9DSV9USSAgMjI1CQkJLyogQ2FsbGVyIElEIHRpbWUgKi8KKyNkZWZpbmUgVk5fQ0lfTkEgIDIyNgkJCS8qIENhbGxlciBJRCBuYW1lICovCisjZGVmaW5lIFZOX0NJX05VICAyMjcJCQkvKiBDYWxsZXIgSUQgbnVtYmVyICovCisjZGVmaW5lIFZOX0NJX01FICAyMjgJCQkvKiBDYWxsZXIgSUQgbWVzc2FnZSAqLworI2RlZmluZSBWTl9QRVJTT05BTCAyMjkgICAgICAgICAgICAgICAgIC8qIFBlcnNvbmFsIERpcmVjdG9yeSBvbiBXaW5kb3dzICovCisjZGVmaW5lIFZOX0FQUERBVEEgIDIzMCAgICAgICAgICAgICAgICAgLyogVXNlciBBcHBEYXRhIGRpcmVjdG9yeSAqLworI2RlZmluZSBWTl9DT01NT04gICAyMzEgICAgICAgICAgICAgICAgIC8qIENvbW1vbiBBcHBEYXRhIGRpcmVjdG9yeSAqLworI2RlZmluZSBWTl9ERVNLVE9QICAyMzIgICAgICAgICAgICAgICAgIC8qIFVzZXIgRGVza3RvcCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgVk5fVE5DX1NJRyAgMjMzICAgICAgICAgICAgICAgICAvKiBSRkMgMjcxNyBTaWduYXR1cmUgKi8KKworI2lmZGVmIEtVSQorI2RlZmluZSBWTl9HVUlfWFAgICAyMzQgICAgICAgICAgICAgICAgIC8qIEdVSSBXaW5kb3cgWCBwb3NpdGlvbiAqLworI2RlZmluZSBWTl9HVUlfWVAgICAyMzUgICAgICAgICAgICAgICAgIC8qIEdVSSBXaW5kb3cgWSBwb3NpdGlvbiAqLworI2RlZmluZSBWTl9HVUlfWFIgICAyMzYgICAgICAgICAgICAgICAgIC8qIEdVSSBXaW5kb3cgWCByZXNvbHV0aW9uICovCisjZGVmaW5lIFZOX0dVSV9ZUiAgIDIzNyAgICAgICAgICAgICAgICAgLyogR1VJIFdpbmRvdyBZIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgVk5fR1VJX1JVTiAgMjM4ICAgICAgICAgICAgICAgICAvKiBHVUkgV2luZG93IFJ1biBtb2RlICovCisjZGVmaW5lIFZOX0dVSV9GTk0gIDIzOSAgICAgICAgICAgICAgICAgLyogR1VJIFdpbmRvdyBGb250IE5hbWUgKi8KKyNkZWZpbmUgVk5fR1VJX0ZTWiAgMjQwICAgICAgICAgICAgICAgICAvKiBHVUkgV2luZG93IEZvbnQgU2l6ZSAqLworI2VuZGlmIC8qIEtVSSAqLworCisjZGVmaW5lIFZOX0xPR19QS1QgIDI0MSAgICAgICAgICAgICAgICAgLyogUGFja2V0IExvZyBGaWxlbmFtZSAqLworI2RlZmluZSBWTl9MT0dfVFJBICAyNDIgICAgICAgICAgICAgICAgIC8qIFRyYW5zYWN0aW9uIExvZyBGaWxlbmFtZSAqLworI2RlZmluZSBWTl9MT0dfU0VTICAyNDMgICAgICAgICAgICAgICAgIC8qIFNlc3Npb24gTG9nIEZpbGVuYW1lICovCisjZGVmaW5lIFZOX0xPR19ERUIgIDI0NCAgICAgICAgICAgICAgICAgLyogRGVidWcgTG9nIEZpbGVuYW1lICovCisjZGVmaW5lIFZOX0xPR19DT04gIDI0NSAgICAgICAgICAgICAgICAgLyogQ29ubmVjdGlvbiBMb2cgRmlsZW5hbWUgKi8KKworI2RlZmluZSBWTl9JU0NBTEUgICAyNDYJCQkvKiBJTlBVVCBzY2FsZSBmYWN0b3IgKi8KKyNlbmRpZiAvKiBOT1NQTCAqLworCisvKiBJTlBVVCBzdGF0dXMgdmFsdWVzICovCisKKyNkZWZpbmUgSU5QX09LICAwCQkJLyogU3VjY2VlZGVkICovCisjZGVmaW5lIElOUF9UTyAgMQkJCS8qIFRpbWVkIG91dCAqLworI2RlZmluZSBJTlBfVUkgIDIJCQkvKiBVc2VyIGludGVycnVwdGVkICovCisjZGVmaW5lIElOUF9JRSAgMwkJCS8qIEludGVybmFsIGVycm9yICovCisjZGVmaW5lIElOUF9JTyAgNAkJCS8qIEkvTyBlcnJvciBvciBjb25uZWN0aW9uIGxvc3QgKi8KKyNkZWZpbmUgSU5QX0lLUyA1ICAgICAgICAgICAgICAgICAgICAgICAvKiBLZXJtaXQgU2VydmVyIEFjdGl2ZSAqLworCisjaWZuZGVmIE5PU1BMCisvKiBTeW1ib2xzIGZvciBidWlsdGluIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIEZOQVJHUyA2CQkJLyogTWF4aW11bSBudW1iZXIgb2YgZnVuY3Rpb24gYXJncyAqLworCisjZGVmaW5lIEZOX0lORCAgICAgIDAJCQkvKiBJbmRleCAob2Ygc3RyaW5nIDEgaW4gc3RyaW5nIDIpICovCisjZGVmaW5lIEZOX0xFTiAgICAgIDEJCQkvKiBMZW5ndGggKG9mIHN0cmluZykgKi8KKyNkZWZpbmUgRk5fTElUICAgICAgMgkJCS8qIExpdGVyYWwgKGRvbid0IGV4cGFuZCB0aGUgc3RyaW5nKSAqLworI2RlZmluZSBGTl9MT1cgICAgICAzCQkJLyogTG93ZXIgKGNvbnZlcnQgdG8gbG93ZXJjYXNlKSAqLworI2RlZmluZSBGTl9NQVggICAgICA0CQkJLyogTWF4IChtYXhpbXVtKSAqLworI2RlZmluZSBGTl9NSU4gICAgICA1CQkJLyogTWluIChtaW5pbXVtKSAqLworI2RlZmluZSBGTl9NT0QgICAgICA2CQkJLyogTW9kIChtb2R1bHVzKSAqLworI2RlZmluZSBGTl9FVkEgICAgICA3CQkJLyogRXZhbCAoZXZhbHVhdGUgYXJpdGggZXhwcmVzc2lvbikgKi8KKyNkZWZpbmUgRk5fU1VCICAgICAgOAkJCS8qIFN1YnN0ciAoc3Vic3RyaW5nKSAqLworI2RlZmluZSBGTl9VUFAgICAgICA5CQkJLyogVXBwZXIgKGNvbnZlcnQgdG8gdXBwZXJjYXNlKSAqLworI2RlZmluZSBGTl9SRVYgICAgICAxMAkJCS8qIFJldmVyc2UgKGEgc3RyaW5nKSAqLworI2RlZmluZSBGTl9SRVAgICAgICAxMQkJCS8qIFJlcGVhdCAoYSBzdHJpbmcpICovCisjZGVmaW5lIEZOX0VYRSAgICAgIDEyCQkJLyogRXhlY3V0ZSAoYSBtYWNybykgKi8KKyNkZWZpbmUgRk5fVkFMICAgICAgMTMJCQkvKiBSZXR1cm4gdmFsdWUgKG9mIGEgbWFjcm8pICovCisjZGVmaW5lIEZOX0xQQSAgICAgIDE0CQkJLyogTFBBRCAobGVmdCBwYWQpICovCisjZGVmaW5lIEZOX1JQQSAgICAgIDE1CQkJLyogUlBBRCAocmlnaHQgcGFkKSAqLworI2RlZmluZSBGTl9ERUYgICAgICAxNgkJCS8qIERlZmluaXRpb24gb2YgYSBtYWNybywgdW5leHBhbmRlZCAqLworI2RlZmluZSBGTl9DT04gICAgICAxNwkJCS8qIENvbnRlbnRzIG9mIGEgdmFyaWFibGUsIGRpdHRvICovCisjZGVmaW5lIEZOX0ZJTCAgICAgIDE4CQkJLyogRmlsZSBsaXN0ICovCisjZGVmaW5lIEZOX0ZDICAgICAgIDE5CQkJLyogRmlsZSBjb3VudCAqLworI2RlZmluZSBGTl9DSFIgICAgICAyMAkJCS8qIENoYXJhY3RlciAobGlrZSBCQVNJQyBDSFIkKCkpICovCisjZGVmaW5lIEZOX1JJRyAgICAgIDIxCQkJLyogUmlnaHQgKGxpa2UgQkFTSUMgUklHSFQkKCkpICovCisjZGVmaW5lIEZOX0NPRCAgICAgIDIyCQkJLyogQ29kZSB2YWx1ZSBvZiBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgRk5fUlBMICAgICAgMjMJCQkvKiBSZXBsYWNlICovCisjZGVmaW5lIEZOX0ZEICAgICAgIDI0CQkJLyogRmlsZSBkYXRlICovCisjZGVmaW5lIEZOX0ZTICAgICAgIDI1CQkJLyogRmlsZSBzaXplICovCisjZGVmaW5lIEZOX1JJWCAgICAgIDI2CQkJLyogUmluZGV4IChpbmRleCBmcm9tIHJpZ2h0KSAqLworI2RlZmluZSBGTl9WRVIgICAgICAyNwkJCS8qIFZlcmlmeSAqLworI2RlZmluZSBGTl9JUEEgICAgICAyOAkJCS8qIEZpbmQgYW5kIHJldHVybiBJUCBhZGRyZXNzICovCisjZGVmaW5lIEZOX0NSWSAgICAgIDM5CQkJLyogLi4uICovCisjZGVmaW5lIEZOX09PWCAgICAgIDQwCQkJLyogLi4uICovCisjZGVmaW5lIEZOX0hFWCAgICAgIDQxCQkJLyogSGV4aWZ5ICovCisjZGVmaW5lIEZOX1VOSCAgICAgIDQyCQkJLyogVW5oZXhpZnkgKi8KKyNkZWZpbmUgRk5fQlJLICAgICAgNDMJCQkvKiBCcmVhayAqLworI2RlZmluZSBGTl9TUE4gICAgICA0NAkJCS8qIFNwYW4gKi8KKyNkZWZpbmUgRk5fVFJNICAgICAgNDUJCQkvKiBUcmltICovCisjZGVmaW5lIEZOX0xUUiAgICAgIDQ2CQkJLyogTGVmdC1UcmltICovCisjZGVmaW5lIEZOX0NBUCAgICAgIDQ3CQkJLyogQ2FwaXRhbGl6ZSAqLworI2RlZmluZSBGTl9UT0QgICAgICA0OAkJCS8qIFRpbWUtb2YtZGF5LXRvLXNlY3Mtc2luY2UtbWlkbml0ZSAqLworI2RlZmluZSBGTl9TRUMgICAgICA0OQkJCS8qIFNlY3Mtc2luY2UtbWlkbml0ZS10by10aW1lLW9mLWRheSAqLworI2RlZmluZSBGTl9GRk4gICAgICA1MAkJCS8qIEZ1bGwgZmlsZSBuYW1lICovCisjZGVmaW5lIEZOX0NISyAgICAgIDUxCQkJLyogQ2hlY2tzdW0gb2YgdGV4dCAqLworI2RlZmluZSBGTl9DUkMgICAgICA1MgkJCS8qIENSQy0xNiBvZiB0ZXh0ICovCisjZGVmaW5lIEZOX0JTTiAgICAgIDUzCQkJLyogQmFzZW5hbWUgb2YgZmlsZSAqLworI2RlZmluZSBGTl9DTUQgICAgICA1NAkJCS8qIE91dHB1dCBvZiBhIGNvbW1hbmQgKGNvb2tlZCkgKi8KKyNkZWZpbmUgRk5fUkFXICAgICAgNTUJCQkvKiBPdXRwdXQgb2YgYSBjb21tYW5kIChyYXcpICovCisjZGVmaW5lIEZOX1NUWCAgICAgIDU2CQkJLyogU3RyaXAgZnJvbSByaWdodCAqLworI2RlZmluZSBGTl9TVEwgICAgICA1NwkJCS8qIFN0cmlwIGZyb20gbGVmdCAqLworI2RlZmluZSBGTl9TVE4gICAgICA1OAkJCS8qIFN0cmlwIG4gY2hhcnMgKi8KKyNkZWZpbmUgRk5fU0NSTl9DWCAgNTkJCQkvKiBTY3JlZW4gQ3Vyc29yIFggUG9zICovCisjZGVmaW5lIEZOX1NDUk5fQ1kgIDYwCQkJLyogU2NyZWVuIEN1cnNvciBZIFBvcyAqLworI2RlZmluZSBGTl9TQ1JOX1NUUiA2MQkJCS8qIFNjcmVlbiBTdHJpbmcgKi8KKyNkZWZpbmUgRk5fMkhFWCAgICAgNjIJCQkvKiBOdW1iZXIgKG5vdCBzdHJpbmcpIHRvIGhleCAqLworI2RlZmluZSBGTl8yT0NUICAgICA2MwkJCS8qIE51bWJlciAobm90IHN0cmluZykgdG8gb2N0YWwgKi8KKyNkZWZpbmUgRk5fUkZJTCAgICAgNjQJCQkvKiBSZWN1cnNpdmUgZmlsZSBsaXN0ICovCisjZGVmaW5lIEZOX0RJUiAgICAgIDY1CQkJLyogRGlyZWN0b3J5IGxpc3QgKi8KKyNkZWZpbmUgRk5fUkRJUiAgICAgNjYJCQkvKiBSZWN1cnNpdmUgZGlyZWN0b3J5IGxpc3QgKi8KKyNkZWZpbmUgRk5fRE5BTSAgICAgNjcJCQkvKiBEaXJlY3RvcnkgcGFydCBvZiBmaWxlbmFtZSAqLworI2RlZmluZSBGTl9SQU5EICAgICA2OAkJCS8qIFJhbmRvbSBudW1iZXIgKi8KKyNkZWZpbmUgRk5fV09SRCAgICAgNjkJCQkvKiBXb3JkIGV4dHJhY3Rpb24gKi8KKyNkZWZpbmUgRk5fU1BMSVQgICAgNzAJCQkvKiBTcGxpdCBzdHJpbmcgaW50byB3b3JkcyAqLworI2RlZmluZSBGTl9LUkJfVEsgICA3MQkJCS8qIEtlcmJlcm9zIHRpY2tldHMgKi8KKyNkZWZpbmUgRk5fS1JCX05YICAgNzIJCQkvKiBLZXJiZXJvcyBuZXh0IHRpY2tldCAqLworI2RlZmluZSBGTl9LUkJfSVYgICA3MwkJCS8qIEtlcmJlcm9zIHRpY2tldCBpcyB2YWxpZCAqLworI2RlZmluZSBGTl9LUkJfVFQgICA3NAkJCS8qIEtlcmJlcm9zIHRpY2tldCB0aW1lICovCisjZGVmaW5lIEZOX0VSUk1TRyAgIDc1CQkJLyogRXJyb3IgY29kZSB0byBtZXNzYWdlICovCisKKyNpZm5kZWYgVU5JWAorI2lmbmRlZiBWTVMKKyN1bmRlZiBGTl9FUlJNU0cKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBVTklYICovCisKKyNkZWZpbmUgRk5fRElNICAgICAgNzYJCQkvKiBEaW1lbnNpb24gb2YgYXJyYXkgKi8KKyNkZWZpbmUgRk5fRFRJTSAgICAgNzcJCQkvKiBDb252ZXJ0IHRvIHN0YW5kYXJkIGRhdGUvdGltZSAqLworI2RlZmluZSBGTl9KREFURSAgICA3OAkJCS8qIFJlZ3VsYXIgZGF0ZSB0byBkYXkgb2YgeWVhciAqLworI2RlZmluZSBGTl9QTkNWVCAgICA3OQkJCS8qIENvbnZlcnQgcGhvbmUgbnVtYmVyIGZvciBkaWFsaW5nICovCisjZGVmaW5lIEZOX0RBVEVKICAgIDgwCQkJLyogRGF5IG9mIHllYXIgdG8gZGF0ZSAqLworI2RlZmluZSBGTl9NSkQgICAgICA4MQkJCS8qIERhdGUgdG8gbW9kaWZpZWQgSnVsaWFuIGRhdGUgKi8KKyNkZWZpbmUgRk5fTUpEMiAgICAgODIJCQkvKiBNb2RpZmllZCBKdWxpYW4gZGF0ZSB0byBkYXRlICovCisjZGVmaW5lIEZOX0RBWSAgICAgIDgzCQkJLyogRGF5IG9mIHdlZWsgb2YgZ2l2ZW4gZGF0ZSAqLworI2RlZmluZSBGTl9OREFZICAgICA4NAkJCS8qIE51bWVyaWMgZGF5IG9mIHdlZWsgb2YgZ2l2ZW4gZGF0ZSAqLworI2RlZmluZSBGTl9USU1FICAgICA4NQkJCS8qIENvbnZlcnQgdG8gaGg6bW06c3MgKi8KKyNkZWZpbmUgRk5fTlRJTSAgICAgODYJCQkvKiBDb252ZXJ0IHRvIHNlY29uZHMgc2luY2UgbWlkbml0ZSAqLworI2RlZmluZSBGTl9OMlRJTSAgICA4NwkJCS8qIFNlYyBzaW5jZSBtaWRuaXRlIHRvIGhoOm1tOnNzICovCisjZGVmaW5lIEZOX1BFUk0gICAgIDg4CQkJLyogUGVybWlzc2lvbnMgb2YgZmlsZSAqLworI2RlZmluZSBGTl9LUkJfRkcgICA4OQkJCS8qIEtlcmJlcm9zIFRpY2tldCBGbGFncyAqLworI2RlZmluZSBGTl9TRUFSQ0ggICA5MAkJCS8qIFNlYXJjaCBmb3IgcGF0dGVybiBpbiBzdHJpbmcgKi8KKyNkZWZpbmUgRk5fUlNFQVJDSCAgOTEJCQkvKiBEaXR0bywgYnV0IHJpZ2h0IHRvIGxlZnQgKi8KKyNkZWZpbmUgRk5fWExBVEUgICAgOTIJCQkvKiBUcmFuc2xhdGUgc3RyaW5nIGNoYXJzZXQgKi8KKyNkZWZpbmUgRk5fQUxPT0sgICAgOTMJCQkvKiBBcnJheSBsb29rdXAgKi8KKyNkZWZpbmUgRk5fVExPT0sgICAgOTQJCQkvKiBUYWJsZSBsb29rdXAgKi8KKyNkZWZpbmUgRk5fVE9CNjQgICAgOTUJCQkvKiBFbmNvZGUgaW50byBCYXNlNjQgKi8KKyNkZWZpbmUgRk5fRk1CNjQgICAgOTYJCQkvKiBEZWNvZGUgZnJvbSBCYXNlNjQgKi8KKworI2RlZmluZSBGTl9BQlMgICAgICA5NwkJCS8qIEFic29sdXRlIHZhbHVlICovCisKKyNpZmRlZiBDS0ZMT0FUCisjZGVmaW5lIEZOX0ZQQUREICAgIDk4CQkJLyogRmxvYXRpbmctcG9pbnQgYWRkICovCisjZGVmaW5lIEZOX0ZQU1VCICAgIDk5CQkJLyogRmxvYXRpbmctcG9pbnQgc3Vic3RyYWN0ICovCisjZGVmaW5lIEZOX0ZQTVVMICAgMTAwCQkJLyogRmxvYXRpbmctcG9pbnQgbXVsdGlwbHkgKi8KKyNkZWZpbmUgRk5fRlBESVYgICAxMDEJCQkvKiBGbG9hdGluZy1wb2ludCBkaXZpZGUgKi8KKyNkZWZpbmUgRk5fRlBFWFAgICAxMDIJCQkvKiBGbG9hdGluZy1wb2ludCBlIHRvIHRoZSB4ICovCisjZGVmaW5lIEZOX0ZQTE4gICAgMTAzCQkJLyogRmxvYXRpbmctcG9pbnQgbmF0dXJhbCBsb2cgKi8KKyNkZWZpbmUgRk5fRlBMT0cgICAxMDQJCQkvKiBGbG9hdGluZy1wb2ludCBiYXNlLTEwIGxvZyAqLworI2RlZmluZSBGTl9GUFBPVyAgIDEwNQkJCS8qIEZsb2F0aW5nLXBvaW50IHJhaXNlIHRvIHBvd2VyICovCisjZGVmaW5lIEZOX0ZQU1FSICAgMTA2CQkJLyogRmxvYXRpbmctcG9pbnQgc3F1YXJlIHJvb3QgKi8KKyNkZWZpbmUgRk5fRlBBQlMgICAxMDcJCQkvKiBGbG9hdGluZy1wb2ludCBhYnNvbHV0ZSB2YWx1ZSAqLworI2RlZmluZSBGTl9GUE1PRCAgIDEwOAkJCS8qIEZsb2F0aW5nLXBvaW50IG1vZHVsdXMgKi8KKyNkZWZpbmUgRk5fRlBNQVggICAxMDkJCQkvKiBGbG9hdGluZy1wb2ludCBtYXhpbXVtICovCisjZGVmaW5lIEZOX0ZQTUlOICAgMTEwCQkJLyogRmxvYXRpbmctcG9pbnQgbWluaW11bSovCisjZGVmaW5lIEZOX0ZQSU5UICAgMTExCQkJLyogRmxvYXRpbmctcG9pbnQgdG8gaW50ZWdlciAqLworI2RlZmluZSBGTl9GUFJPVSAgIDExMgkJCS8qIEZsb2F0aW5nLXBvaW50IHJvdW5kICovCisjZGVmaW5lIEZOX0ZQU0lOICAgMTEzCQkJLyogRlAgc2luZSAqLworI2RlZmluZSBGTl9GUENPUyAgIDExNAkJCS8qIEZQIGNvc2luZSAqLworI2RlZmluZSBGTl9GUFRBTiAgIDExNQkJCS8qIEZQIHRhbmdlbnQgKi8KKyNlbmRpZiAvKiBDS0ZMT0FUICovCisKKyNpZmRlZiBDS0NIQU5ORUxJTworI2RlZmluZSBGTl9GU1RBVCAgIDExNgkJCS8qIEZpbGUgc3RhdHVzICovCisjZGVmaW5lIEZOX0ZQT1MgICAgMTE3CQkJLyogRmlsZSBwb3NpdGlvbiAqLworI2RlZmluZSBGTl9GRU9GICAgIDExOAkJCS8qIEZpbGUgZW9mICovCisjZGVmaW5lIEZOX0ZJTE5PICAgMTE5CQkJLyogRmlsZSBudW1iZXIgLyBoYW5kbGUgKi8KKyNkZWZpbmUgRk5fRkdDSEFSICAxMjAJCQkvKiBGaWxlIGdldGNoYXIgKi8KKyNkZWZpbmUgRk5fRkdMSU5FICAxMjEJCQkvKiBGaWxlIGdldGxpbmUgKi8KKyNkZWZpbmUgRk5fRkdCTEsgICAxMjIJCQkvKiBGaWxlIGdldGJsb2NrICovCisjZGVmaW5lIEZOX0ZQQ0hBUiAgMTIzCQkJLyogRmlsZSBwdXRjaGFyICovCisjZGVmaW5lIEZOX0ZQTElORSAgMTI0CQkJLyogRmlsZSBwdXRsaW5lICovCisjZGVmaW5lIEZOX0ZQQkxLICAgMTI1CQkJLyogRmlsZSBwdXRibG9jayAqLworI2RlZmluZSBGTl9OTElORSAgIDEyNgkJCS8qIEZpbGUgZ2V0IGN1cnJlbnQgbGluZSBudW1iZXIgKi8KKyNkZWZpbmUgRk5fRkVSTVNHICAxMjcJCQkvKiBGaWxlIGVycm9yIG1lc3NhZ2UgKi8KKyNlbmRpZiAvKiBDS0NIQU5ORUxJTyAqLworCisjZGVmaW5lIEZOX0xFRiAgICAgMTI4CQkJLyogTGVmdCAoPSBzdWJzdHIgc3RhcnRpbmcgb24gbGVmdCkgKi8KKyNkZWZpbmUgRk5fQUFEVU1QICAxMjkJCQkvKiBBc3NvY2lhdGl2ZSBBcnJheSBEdW1wICovCisjZGVmaW5lIEZOX1NUQiAgICAgMTMwCQkJLyogXGZzdHJpcGIoKSAgKi8KKyNkZWZpbmUgRk5fUEFUVEVSTiAxMzEJCQkvKiBcZnBhdHRlcm4oKSAqLworI2RlZmluZSBGTl9IRVgyTiAgIDEzMgkJCS8qIFxmaGV4dG9uKCkgICovCisjZGVmaW5lIEZOX09DVDJOICAgMTMzCQkJLyogXGZvY3R0b24oKSAgKi8KKyNkZWZpbmUgRk5fSEVYMklQICAxMzQJCQkvKiBcZmhleHRvaXAoKSAqLworI2RlZmluZSBGTl9JUDJIRVggIDEzNQkJCS8qIFxmaXB0b2hleCgpICovCisjZGVmaW5lIEZOX1JBRElYICAgMTM2CQkJLyogXGZyYWRpeCgpICAgKi8KKyNkZWZpbmUgRk5fSk9JTiAgICAxMzcJCQkvKiBcZmpvaW4oKSAgICAqLworI2RlZmluZSBGTl9TVUJTVCAgIDEzOAkJCS8qIFxmc3Vic3RpdHV0ZSgpICovCisjZGVmaW5lIEZOX1NFWFAgICAgMTM5CQkJLyogXGZzZXhwcmVzc2lvbigpICovCisjZGVmaW5lIEZOX0NNRFNUSyAgMTQwCQkJLyogXGZjbWRzdGFjaygpICovCisjZGVmaW5lIEZOX1RPR01UICAgMTQxCQkJLyogXGZ0b2dtdCgpICovCisjZGVmaW5lIEZOX0NNUERBVEUgMTQyCQkJLyogXGZjbXBkYXRlcygpICovCisjZGVmaW5lIEZOX0RJRkRBVEUgMTQzCQkJLyogXGZkaWZmZGF0ZXMoKSAqLworI2lmZGVmIFRDUFNPQ0tFVAorI2RlZmluZSBGTl9IU1RBREQgIDE0NAkJCS8qIFxmYWRkcjJuYW1lKCkgKi8KKyNkZWZpbmUgRk5fSFNUTkFNICAxNDUJCQkvKiBcZm5hbWUyYWRkcigpICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisjZGVmaW5lIEZOX0RFTFNFQyAgMTQ2CQkJLyogXGZkZWx0YTJzZWMoKSAqLworI2RlZmluZSBGTl9QQ19EVSAgIDE0NwkJCS8qIFBhdGggY29udmVyc2lvbiBET1MgdG8gVW5peCAqLworI2RlZmluZSBGTl9QQ19WVSAgIDE0OAkJCS8qIFBhdGggY29udmVyc2lvbiBWTVMgdG8gVW5peCAqLworI2RlZmluZSBGTl9QQ19VRCAgIDE0OQkJCS8qIFBhdGggY29udmVyc2lvbiBVbml4IHRvIERPUyAqLworI2RlZmluZSBGTl9QQ19VViAgIDE1MAkJCS8qIFBhdGggY29udmVyc2lvbiBVbml4IHRvIFZNUyAqLworI2RlZmluZSBGTl9LV1ZBTCAgIDE1MQkJCS8qIFxma2V5d29yZHZhbHVlKCkgKi8KKyNkZWZpbmUgRk5fU0xFRVAgICAxNTIJCQkvKiBcZnNsZWVwKCkgKi8KKyNkZWZpbmUgRk5fTVNMRUVQICAxNTMJCQkvKiBcZm1zbGVlcCgpICovCisjZGVmaW5lIEZOX0xOQU1FICAgMTU0CQkJLyogXGZMb25nUGF0aE5hbWUoKSAoV2luZG93cykgKi8KKyNkZWZpbmUgRk5fU05BTUUgICAxNTUJCQkvKiBcZlNob3J0UGF0aE5hbWUoKSAoV2luZG93cykgKi8KKyNkZWZpbmUgRk5fVU5UQUIgICAxNTYJCQkvKiBcZnVudGFiaWZ5KCkgKi8KKworI2VuZGlmIC8qIE5PU1BMICovCisKKy8qIFRpbWUgVW5pdHMgKi8KKworI2RlZmluZSBUVV9EQVlTICAgMAorI2RlZmluZSBUVV9XRUVLUyAgMQorI2RlZmluZSBUVV9NT05USFMgMgorI2RlZmluZSBUVV9ZRUFSUyAgMworCisjaWZkZWYgQ0tfQ1VSU0VTCisvKiBTY3JlZW4gbGluZSBudW1iZXJzIGZvciBmdWxsc2NyZWVuIGZpbGUtdHJhbnNmZXIgZGlzcGxheSAqLworCisjZGVmaW5lIENXX0JBTiAgMAkJCS8qIEN1cnNlcyBXaW5kb3cgQmFubmVyICovCisjZGVmaW5lIENXX0RJUiAgMgkJCS8qIEN1cnJlbnQgZGlyZWN0b3J5ICovCisjZGVmaW5lIENXX0xJTiAgMwkJCS8qIENvbW11bmljYXRpb24gZGV2aWNlICovCisjZGVmaW5lIENXX1NQRCAgNAkJCS8qIENvbW11bmljYXRpb24gc3BlZWQgKi8KKyNkZWZpbmUgQ1dfUEFSICA1CQkJLyogUGFyaXR5ICovCisjZGVmaW5lIENXX1RNTyAgNgorI2RlZmluZSBDV19OQU0gIDcJCQkvKiBGaWxlbmFtZSAqLworI2RlZmluZSBDV19UWVAgIDgJCQkvKiBGaWxlIHR5cGUgKi8KKyNkZWZpbmUgQ1dfU0laICA5CQkJLyogRmlsZSBzaXplICovCisjZGVmaW5lIENXX1BDRCAxMAkJCS8qIFBlcmNlbnQgZG9uZSAqLworCisjaWZuZGVmIENLX1BDVF9CQVIKKyNkZWZpbmUgQ1dfVFIgIDExCQkJLyogVGltZSByZW1haW5pbmcgKi8KKyNkZWZpbmUgQ1dfQ1AgIDEyCQkJLyogQ2hhcmFjdGVycyBwZXIgc2Vjb25kICovCisjZGVmaW5lIENXX1dTICAxMwkJCS8qIFdpbmRvdyBzbG90cyAqLworI2RlZmluZSBDV19QVCAgMTQJCQkvKiBQYWNrZXQgdHlwZSAqLworI2RlZmluZSBDV19QQyAgMTUJCQkvKiBQYWNrZXQgY291bnQgKi8KKyNkZWZpbmUgQ1dfUEwgIDE2CQkJLyogUGFja2V0IGxlbmd0aCAqLworI2RlZmluZSBDV19QUiAgMTcJCQkvKiBQYWNrZXQgcmV0cnkgKi8KKyNpZmRlZiBDT01NRU5UCisjZGVmaW5lIENXX1BCICAxNwkJCS8qIFBhY2tldCBibG9jayBjaGVjayAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbHNlIC8qIENLX1BDVF9CQVIgKi8KKyNkZWZpbmUgQ1dfQkFSIDExCQkJLyogUGVyY2VudCBCYXIgU2NhbGUgKi8KKyNkZWZpbmUgQ1dfVFIgIDEyCQkJLyogVGltZSByZW1haW5pbmcgKi8KKyNkZWZpbmUgQ1dfQ1AgIDEzCQkJLyogQ2hhcnMgcGVyIHNlYyAqLworI2RlZmluZSBDV19XUyAgMTQJCQkvKiBXaW5kb3cgc2xvdHMgKi8KKyNkZWZpbmUgQ1dfUFQgIDE1CQkJLyogUGFja2V0IHR5cGUgKi8KKyNkZWZpbmUgQ1dfUEMgIDE2CQkJLyogUGFja2V0IGNvdW50ICovCisjZGVmaW5lIENXX1BMICAxNwkJCS8qIFBhY2tldCBsZW5ndGggKi8KKyNkZWZpbmUgQ1dfUFIgIDE4CQkJLyogUGFja2V0IHJldHJ5ICovCisjaWZkZWYgQ09NTUVOVAorI2RlZmluZSBDV19QQiAgMTgJCQkvKiBQYWNrZXQgYmxvY2sgY2hlY2sgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisjZW5kaWYgLyogQ0tfUENUX0JBUiAqLworCisjZGVmaW5lIENXX0VSUiAxOQkJCS8qIEVycm9yIG1lc3NhZ2UgKi8KKyNkZWZpbmUgQ1dfTVNHIDIwCQkJLyogSW5mbyBtZXNzYWdlICovCisjZGVmaW5lIENXX0lOVCAyMgkJCS8qIEluc3RydWN0aW9ucyAqLworI2RlZmluZSBDV19GRkMgOTkgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgQ2hhcmFjdGVycyBTZW50L1JlY2VpdmVkICovCisjZW5kaWYgLyogQ0tfQ1VSU0VTICovCisKKyNpZm5kZWYgTk9JQ1AKKy8qIFNhdmUgQ29tbWFuZHMgKi8KKyNkZWZpbmUgWFNLRVkgICAwCQkJLyogS2V5IG1hcCBmaWxlICovCisjZGVmaW5lIFhTQ01EICAgMSAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBtb2RlICovCisjZGVmaW5lIFhTVEVSTSAgMiAgICAgICAgICAgICAgICAgICAgICAgLyogVGVybWluYWwgbW9kZSAqLworI2VuZGlmIC8qIE5PSUNQICovCisKKyNpZm5kZWYgTk9ESUFMCisvKiBEaWFsIHJvdXRpbmUgc29ydCBwcmlvcml0aWVzICovCisjZGVmaW5lIEROX0lOVEVSTiAwCisjZGVmaW5lIEROX0ZSRUUgICAxCisjZGVmaW5lIEROX0xPQ0FMICAyCisjZGVmaW5lIEROX1VOSyAgICAzCisjZGVmaW5lIEROX0xPTkcgICA0CisjZGVmaW5lIEROX0lOVEwgICA1CisjZW5kaWYgLyogTk9ESUFMICovCisKKyNpZmRlZiBTU0hCVUlMVElOCisjZGVmaW5lIFhTU0hfT1BOIDEKKyNkZWZpbmUgWFNTSF9WMiAgMgorI2RlZmluZSBYU1NIX0ZMUCAzCisjZGVmaW5lIFhTU0hfRlJQIDQKKyNkZWZpbmUgWFNTSF9BREQgNQorI2RlZmluZSBYU1NIX0tFWSA2CisjZGVmaW5lIFhTU0hfQ0xSIDcKKyNkZWZpbmUgWFNTSF9BR1QgOAorCisjZGVmaW5lIFNTSEtUXzFSICAgMAkJCS8qIFNTSCBLRVkgVFlQRSBzeW1ib2xzICovCisjZGVmaW5lIFNTSEtUXzJSICAgMSAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBtYXRjaCBzc2gva2V5LmggdmFsdWVzICovCisjZGVmaW5lIFNTSEtUXzJEICAgMgorI2RlZmluZSBTU0hLVF9TUlAgIDMKKworI2RlZmluZSBTU0hLRF9JTiAgIDEJCQkvKiBTU0ggS0VZIERJU1BMQVkgL0lOLUZPUk1BVCAqLworI2RlZmluZSBTU0hLRF9PVVQgIDIJCQkvKiBTU0ggS0VZIERJU1BMQVkgL09VVC1GT1JNQVQgKi8KKworI2RlZmluZSBTS0RGX09TU0ggIDEJCQkvKiBLZXkgZGlzcGxheSBmb3JtYXQgT3BlblNTSCAqLworI2RlZmluZSBTS0RGX1NTSEMgIDIJCQkvKiBLZXkgZGlzcGxheSBmb3JtYXQgU1NILkNPTSAqLworI2RlZmluZSBTS0RGX0lFVEYgIDMJCQkvKiBLZXkgZGlzcGxheSBmb3JtYXQgSUVURiAqLworI2RlZmluZSBTS0RGX0ZJTkcgIDQJCQkvKiBLZXkgZGlzcGxheSBmb3JtYXQgRklOR0VSUFJJTlQgKi8KKworI2RlZmluZSBTU0hTV19VU1IgMQorI2RlZmluZSBTU0hTV19WRVIgMgorI2RlZmluZSBTU0hTV19DTUQgMworI2RlZmluZSBTU0hTV19YMTEgNAorI2RlZmluZSBTU0hTV19QV0QgNQorI2RlZmluZSBTU0hTV19TVUIgNgorCisjZGVmaW5lIFNTSENfTFBGIDEKKyNkZWZpbmUgU1NIQ19SUEYgMgorCisjZGVmaW5lIFhTU0gyX1JLRSAxCisKKyNkZWZpbmUgU1NIRl9MQ0wgICAxCisjZGVmaW5lIFNTSEZfUk1UICAgMgorCisjZGVmaW5lIFNTSEFfQUREICAgMQorI2RlZmluZSBTU0hBX0RFTCAgIDIKKyNkZWZpbmUgU1NIQV9MU1QgICAzCisKKyNkZWZpbmUgU1NIQVNXX0ZQIDEKKworI2RlZmluZSBTU0hLX1BBU1MgIDEKKyNkZWZpbmUgU1NIS19DUkVBICAyCisjZGVmaW5lIFNTSEtfRElTUCAgMworI2RlZmluZSBTU0hLX1YxICAgIDQKKworI2RlZmluZSBTU0hLQ19CSSAgMQorI2RlZmluZSBTU0hLQ19QUCAgMgorI2RlZmluZSBTU0hLQ19UWSAgMworI2RlZmluZSBTU0hLQ18xUiAgNAorCisjZGVmaW5lIFNLUk1fT1BOICAxCisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworCisjaWZkZWYgU0ZUUF9CVUlMVElOCisjZGVmaW5lIFNGVFBfT1BOICAgIDEKKyNkZWZpbmUgU0ZUUF9DRCAgICAgMgorI2RlZmluZSBTRlRQX0NIR1JQICAzCisjZGVmaW5lIFNGVFBfQ0hNT0QgIDQKKyNkZWZpbmUgU0ZUUF9DSE9XTiAgNQorI2RlZmluZSBTRlRQX0RJUiAgICA2CisjZGVmaW5lIFNGVFBfR0VUICAgIDcKKyNkZWZpbmUgU0ZUUF9NS0RJUiAgOAorI2RlZmluZSBTRlRQX1BXRCAgICA5CisjZGVmaW5lIFNGVFBfUFVUICAgIDEwCisjZGVmaW5lIFNGVFBfUkVOICAgIDExCisjZGVmaW5lIFNGVFBfUk0gICAgIDEyCisjZGVmaW5lIFNGVFBfUk1ESVIgIDEzCisjZGVmaW5lIFNGVFBfTElOSyAgIDE0CisjZGVmaW5lIFNGVFBfVkVSICAgIDE1CisKKyNkZWZpbmUgWFlfU0ZUUF9SQ1MgMQorI2RlZmluZSBYWV9TRlRQX0VPTCAyCisjZW5kaWYgLyogU0ZUUF9CVUlMVElOICovCisKKy8qIEFOU0ktQyBwcm90b3R5cGVzIGZvciB1c2VyIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KKworI2lmbmRlZiBOT0lDUAorX1BST1RPVFlQKCBpbnQgbWF0Y2huYW1lLCAoIGNoYXIgKiwgaW50LCBpbnQgKSApOworX1BST1RPVFlQKCBpbnQgY2tfY2xzLCAoIHZvaWQgKSApOworX1BST1RPVFlQKCBpbnQgY2tfY2xlb2wsICggdm9pZCApICk7CitfUFJPVE9UWVAoIGludCBja19jdXJwb3MsICggaW50LCBpbnQgKSApOworX1BST1RPVFlQKCBpbnQgY21kc3JjLCAoIHZvaWQgKSApOworX1BST1RPVFlQKCBpbnQgcGFyc2VyLCAoIGludCApICk7CitfUFJPVE9UWVAoIGludCBjaGt2YXIsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCB6enN0cmluZywgKGNoYXIgKiwgY2hhciAqKiwgaW50ICopICk7CisjaWZuZGVmIE5PRlJJTExTCitfUFJPVE9UWVAoIGludCB5eXN0cmluZywgKGNoYXIgKiwgY2hhciAqKikgKTsKKyNlbmRpZiAvKiBOT0ZSSUxMUyAqLworX1BST1RPVFlQKCBpbnQgZ2V0bmNtLCAoY2hhciAqLCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBnZXRuY3QsIChjaGFyICosIGludCwgRklMRSAqLCBpbnQpICk7CisjZW5kaWYgLyogTk9JQ1AgKi8KK19QUk9UT1RZUCggVk9JRCBiZ2NoaywgKHZvaWQpICk7CitfUFJPVE9UWVAoIGNoYXIgKiBudmxvb2ssIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCB4YXJyYXksIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBhcnJheW5hbSwgKGNoYXIgKiwgaW50ICosIGludCAqKSApOworX1BST1RPVFlQKCBpbnQgYXJyYXlib3VuZHMsIChjaGFyICosIGludCAqLCBpbnQgKikgKTsKK19QUk9UT1RZUCggaW50IGFycmF5aXRvYSwgKGludCkgKTsKK19QUk9UT1RZUCggaW50IGFycmF5YXRvaSwgKGludCkgKTsKK19QUk9UT1RZUCggY2hhciAqIGJsZGxlbiwgKGNoYXIgKiwgY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgY2hrYXJyYXksIChpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IGRjbGFycmF5LCAoY2hhciwgaW50KSApOworX1BST1RPVFlQKCBpbnQgcHVzaGFycmF5LCAoaW50LCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBwYXJzZXZhciwgKGNoYXIgKiwgaW50ICosIGludCAqKSApOworX1BST1RPVFlQKCBpbnQgbWFjaW5pLCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCBpbml0bWFjLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGRlbG1hYywgKGNoYXIgKiwgaW50KSApOworX1BST1RPVFlQKCBpbnQgYWRkbWFjLCAoY2hhciAqLCBjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBkb21hYywgKGNoYXIgKiwgY2hhciAqLCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBhZGRtbWFjLCAoY2hhciAqLCBjaGFyICpbXSkgKTsKK19QUk9UT1RZUCggaW50IGRvYnVnLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGRvY2QsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBkb2Nsc2xvZywgKGludCkgKTsKK19QUk9UT1RZUCggaW50IGRvY21kLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgZG9kaXIsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBkb2RvLCAoaW50LCBjaGFyICosIGludCkgKTsKK19QUk9UT1RZUCggaW50IGRvZW5hYmxlLCAoaW50LCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBkb2dvdG8sIChjaGFyICosIGludCkgKTsKK19QUk9UT1RZUCggaW50IGRvZ3RhLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgZG9obHAsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBkb2hybXQsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBkb2lmLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgZG9pbnB1dCwgKGludCwgY2hhciAqW10sIGludFtdLCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBkb3JlaW5wLCAoaW50LCBjaGFyICosIGludCkgKTsKK19QUk9UT1RZUCggaW50IGRvbG9nLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgZG9sb2dpbiwgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IGRvb3BlbiwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBkb3BybSwgKGludCwgaW50KSApOworX1BST1RPVFlQKCBpbnQgZG9yZXR1cm4sIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBkb3JtdCwgKGludCkgKTsKK19QUk9UT1RZUCggaW50IGRvc29ydCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBkb3N0YXQsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBkb3N0b3AsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgZG90eXBlLCAoY2hhciAqLCBpbnQsIGludCwgaW50LCBjaGFyICosIGludCwgY2hhciAqLCBpbnQsIGludCwKKwkJCWNoYXIgKiwgaW50KSk7CitfUFJPVE9UWVAoIGludCB0cmFuc21pdCwgKGNoYXIgKiwgY2hhciwgaW50LCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IHhsYXRlLCAoY2hhciAqLCBjaGFyICosIGludCwgaW50KSApOworX1BST1RPVFlQKCBpbnQgbGl0Y21kLCAoY2hhciAqKiwgY2hhciAqKiwgaW50KSApOworX1BST1RPVFlQKCBpbnQgaW5jdmFyLCAoY2hhciAqLCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IGNrZGlhbCwgKGNoYXIgKiwgaW50LCBpbnQsIGludCwgaW50KSApOworX1BST1RPVFlQKCBpbnQgaG1zZywgKGNoYXIgKikgKTsKK19QUk9UT1RZUCggaW50IGhtc2dhLCAoY2hhciAqIFtdKSApOworX1BST1RPVFlQKCBpbnQgbWxvb2ssIChzdHJ1Y3QgbXRhYiBbXSwgY2hhciAqLCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBteGxvb2ssIChzdHJ1Y3QgbXRhYiBbXSwgY2hhciAqLCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBteHhsb29rLCAoc3RydWN0IG10YWIgW10sIGNoYXIgKiwgaW50KSApOworX1BST1RPVFlQKCBpbnQgcHJ0b3B0LCAoaW50ICosIGNoYXIgKikgKTsKK19QUk9UT1RZUCggQ0hBUiByZmlsb3AsIChjaGFyICosIGNoYXIpICk7CitfUFJPVE9UWVAoIGludCBzZXRjYywgKGNoYXIgKiwgaW50ICopICk7CitfUFJPVE9UWVAoIGludCBzZXRudW0sIChpbnQgKiwgaW50LCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IHNldG9uLCAoaW50ICopICk7CitfUFJPVE9UWVAoIGludCBzZXRvbmF1dCwgKGludCAqKSApOworX1BST1RPVFlQKCBWT0lEIHNobWRtbGluLCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCBpbml0bWRtLCAoaW50KSApOworX1BST1RPVFlQKCBjaGFyICogc2hvd29mZiwgKGludCkgKTsKK19QUk9UT1RZUCggY2hhciAqIHNob3dvb2EsIChpbnQpICk7CitfUFJPVE9UWVAoIGNoYXIgKiBzaG93c3RyaW5nLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgcGt0b3BuLCAoY2hhciAqLGludCkgKTsKK19QUk9UT1RZUCggaW50IHRyYW9wbiwgKGNoYXIgKixpbnQpICk7CitfUFJPVE9UWVAoIGludCBzZXNvcG4sIChjaGFyICosaW50KSApOworX1BST1RPVFlQKCBpbnQgZGVib3BuLCAoY2hhciAqLGludCkgKTsKK19QUk9UT1RZUCggaW50IGRpYW9wbiwgKGNoYXIgKixpbnQsaW50KSApOworX1BST1RPVFlQKCBpbnQgcHJlcG9wLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHBvcGNsdmwsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgdmFydmFsLCAoY2hhciAqLCBpbnQgKikgKTsKK19QUk9UT1RZUCggY2hhciAqIGV2YWxhLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBjaGFyICogZXZhbHgsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBzZXRhbGFybSwgKGxvbmcpICk7CitfUFJPVE9UWVAoIGludCBzZXRhdCwgKGludCkgKTsKK19QUk9UT1RZUCggaW50IHNldGlucCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgZG9sb2duZXQsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIGRvbG9nbGluZSwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBzZXRsaW4sIChpbnQsIGludCwgaW50KSApOworX1BST1RPVFlQKCBpbnQgc2V0bW9kZW0sICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgc2V0ZmlsLCAoaW50KSApOworX1BST1RPVFlQKCBjaGFyICogaG9tZXBhdGgsICh2b2lkKSApOworI2lmZGVmIE9TMgorX1BST1RPVFlQKCBpbnQgc2V0dGFwaSwgKHZvaWQpICkgOworI2lmZGVmIE9TMk1PVVNFCitfUFJPVE9UWVAoIGludCBzZXRtb3UsICh2b2lkKSApOworI2VuZGlmIC8qIE9TMk1PVVNFICovCisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgTE9DVVMKK19QUk9UT1RZUCggVk9JRCBzZXRsb2N1cywgKGludCxpbnQpICk7CitfUFJPVE9UWVAoIFZPSUQgc2V0YXV0b2xvY3VzLCAoaW50KSApOworI2VuZGlmIC8qIExPQ1VTICovCitfUFJPVE9UWVAoIGludCBzZXRiZWxsLCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCBzZXRjbWFzaywgKGludCkpOworX1BST1RPVFlQKCBWT0lEIHNldGF1dG9kbCwgKGludCxpbnQpKTsKK19QUk9UT1RZUCggVk9JRCBzZXRkZWJzZXMsIChpbnQpKTsKK19QUk9UT1RZUCggVk9JRCBzZXRzZXNsb2csIChpbnQpKTsKK19QUk9UT1RZUCggVk9JRCBzZXRhcHJpbnQsIChpbnQpKTsKK19QUk9UT1RZUCggaW50IHNldHRybSwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBzZXR0cm10eXAsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgc2V0c3IsIChpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IHNldHhtaXQsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgZG9zZXRrZXksICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgZG9jaGssICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgbHVkaWFsLCAoY2hhciAqLCBpbnQpICk7CitfUFJPVE9UWVAoIGNoYXIgKiBnZXRkbnVtLCAoaW50KSApOworX1BST1RPVFlQKCBWT0lEIGdldG5ldGVudiwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBnZXR5ZXNubywgKGNoYXIgKiwgaW50KSApOworX1BST1RPVFlQKCBWT0lEIHh3b3JkcywgKGNoYXIgKiwgaW50LCBjaGFyICpbXSwgaW50KSApOworI2lmZGVmIE9TMgorX1BST1RPVFlQKCBWT0lEIGtleW5hbWluaXQsICh2b2lkKSApOworI2VuZGlmIC8qIE9TMiAqLworX1BST1RPVFlQKCBpbnQgeGxvb2t1cCwgKHN0cnVjdCBrZXl0YWJbXSwgY2hhciAqLCBpbnQsIGludCAqKSApOworX1BST1RPVFlQKCBjaGFyICogcmxvb2t1cCwgKHN0cnVjdCBrZXl0YWJbXSwgaW50LCBpbnQpICk7CitfUFJPVE9UWVAoIGludCBodXBvaywgKGludCkgKTsKK19QUk9UT1RZUCggY2hhciAqIHp6bmRhdGUsICh2b2lkKSApOworX1BST1RPVFlQKCBjaGFyICogempkYXRlLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBjaGFyICoganpkYXRlLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBjaGFyICogY2tkYXRlLCAodm9pZCkgKTsKK19QUk9UT1RZUCggY2hhciAqIGNoa19hYywgKGludCwgY2hhcltdKSApOworX1BST1RPVFlQKCBjaGFyICogZ21kbXR5cCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGNoYXIgKiBnZm1vZGUsIChpbnQsIGludCkgKTsKK19QUk9UT1RZUCggaW50IHNldGRlc3QsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIG5kaW5pdCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBkb3N3aXRjaCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBkb2xvY2FsLCAodm9pZCkgKTsKK19QUk9UT1RZUCggbG9uZyB0b2Qyc2VjLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgbHVuZXQsIChjaGFyICopICk7CitfUFJPVE9UWVAoIGludCBkb3hkaXMsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBkb3NhdmUsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBkb3hzZW5kLCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgZG94Z2V0LCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgZG94Y29ubiwgKGludCkgKTsKK19QUk9UT1RZUCggaW50IGNsc2Nvbm54LCAoaW50KSApOworX1BST1RPVFlQKCBWT0lEIGZ0cmVzZXQsICh2b2lkKSApOworI2lmZGVmIENLX0tFUkJFUk9TCitfUFJPVE9UWVAgKGludCBjcF9hdXRoLCAoIHZvaWQgKSApOworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCitfUFJPVE9UWVAoIGxvbmcgbWpkLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBjaGFyICogbWpkMmRhdGUsIChsb25nKSApOworX1BST1RPVFlQKCBjaGFyICogY2tnZXRwaWQsICh2b2lkKSApOworCitfUFJPVE9UWVAoIGludCBkb2dyZXAsICh2b2lkKSApOworCisjaWZuZGVmIE5PRlRQCisjaWZuZGVmIFNZU0ZUUAorX1BST1RPVFlQKCBpbnQgZG94ZnRwLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGRvZnRwaGxwLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGRvc2V0ZnRwLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGRvc2V0ZnRwaGxwLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IHNob2Z0cCwgKGludCkgKTsKKyNlbmRpZiAvKiBTWVNGVFAgKi8KKyNlbmRpZiAvKiBOT0ZUUCAqLworCitfUFJPVE9UWVAoIFZPSUQgY21oaXN0b3J5LCAodm9pZCkgKTsKK19QUk9UT1RZUCggY2hhciAqIGdldGRjc2V0LCAodm9pZCkgKTsKK19QUk9UT1RZUCggY2hhciAqIHR0Z3RwbiwgKHZvaWQpICk7CisKKyNpZm5kZWYgTk9TSE9XCitfUFJPVE9UWVAoIGludCBkb3Nob3csIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBzaG90Y3AsIChpbnQpICk7CitfUFJPVE9UWVAoIFZPSUQgc2hvcGFyLCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCBzaG9maWwsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIHNob3BhcnAsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgc2hvYXR0LCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCBzaG92ZXIsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIHNob2N0bCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgc2hvZGJsLCAodm9pZCkgKTsKKyNpZm5kZWYgTk9TUEwKK19QUk9UT1RZUCggaW50IHNob21hYywgKGNoYXIgKiwgY2hhciAqKSApOworX1BST1RPVFlQKCBpbnQgZG9zaGlmdCwgKGludCkgKTsKKyNlbmRpZiAvKiBOT1NQTCAqLworI2lmbmRlZiBOT0NTRVRTCitfUFJPVE9UWVAoIFZPSUQgc2hvY2hhcnNldCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgc2hvcGFybCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgc2hvdGNzLCAoaW50LCBpbnQpICk7CisjZW5kaWYgLyogTk9DU0VUUyAqLworI2lmbmRlZiBOT0xPQ0FMCitfUFJPVE9UWVAoIFZPSUQgc2hvcGFyYywgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBzaG9tb2RlbSwgKHZvaWQpICk7CisjaWZuZGVmIE5PRElBTAorX1BST1RPVFlQKCBWT0lEIHNob2RzLCAoY2hhciAqKSApOworX1BST1RPVFlQKCBWT0lEIHNob2RpYWwsICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgZG9zaG9kaWFsLCAodm9pZCkgKTsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyNpZm5kZWYgTk9ORVQKK19QUk9UT1RZUCggaW50IHNob25ldCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIGludCBzaG90b3B0LCAoaW50KSApOworX1BST1RPVFlQKCBpbnQgc2hvdGVsLCAoaW50KSApOworI2lmZGVmIENLX0FVVEhFTlRJQ0FUSU9OCitfUFJPVE9UWVAgKGludCBzaG9fYXV0aCwoIGludCAgKSApOworI2VuZGlmIC8qIENLX0FVVEhFTlRJQ0FUSU9OICovCisjZW5kaWYgLyogTk9ORVQgKi8KK19QUk9UT1RZUCggVk9JRCBzaG9tZG0sICh2b2lkKSApOworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZmRlZiBPUzIKK19QUk9UT1RZUCggVk9JRCBzaG9rZXljb2RlLCAoaW50LGludCkgKTsKKyNlbHNlCitfUFJPVE9UWVAoIFZPSUQgc2hva2V5Y29kZSwgKGludCkgKTsKKyNlbmRpZiAvKiBPUzIgKi8KK19QUk9UT1RZUCggVk9JRCBzaG93YXNzb2MsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIHNob3dkaXJvcHRzLCAodm9pZCkgKTsKK19QUk9UT1RZUCggVk9JRCBzaG93ZGVsb3B0cywgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgc2hvd3R5cG9wdHMsICh2b2lkKSApOworX1BST1RPVFlQKCBWT0lEIHNob3dwdXJnb3B0cywgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgc2hvZmxvdywgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgc2hveGZlciwgKHZvaWQpICk7CisjaWZkZWYgQU5ZU1NICitfUFJPVE9UWVAoIFZPSUQgc2hvc3NoLCAodm9pZCkgKTsKKyNlbmRpZgkvKiBBTllTU0ggKi8KKyNlbmRpZiAvKiBOT1NIT1cgKi8KKworX1BST1RPVFlQKCBWT0lEIHNob3N0cmRlZiwgKENIQVIgKikgKTsKKworI2lmbmRlZiBOT1NQTAorX1BST1RPVFlQKCBpbnQgYWRkbG9jYWwsIChjaGFyICopICk7CisjZW5kaWYgLyogTk9TUEwgKi8KKworX1BST1RPVFlQKCBpbnQgc2V0ZGVsb3B0cywgKHZvaWQpICk7CisKKyNpZmRlZiBWTVMKK19QUk9UT1RZUCggaW50IGN2dGRpciwgKGNoYXIgKiwgY2hhciAqLCBpbnQpICk7CisjZW5kaWYgLyogVk1TICovCisKKyNpZmRlZiBGTkZMT0FUCitfUFJPVE9UWVAoIFZPSUQgaW5pdGZsb2F0LCAodm9pZCkgKTsKKyNlbmRpZiAvKiBGTkZMT0FUICovCisKKyNpZmRlZiBDS0NIQU5ORUxJTworX1BST1RPVFlQKCBpbnQgZG9maWxlLCAoaW50KSApOworI2VuZGlmIC8qIENLQ0hBTk5FTElPICovCisKKyNpZmRlZiBDS1JPT1QKK19QUk9UT1RZUCggaW50IGRvY2hyb290LCAodm9pZCkgKTsKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKworI2lmZGVmIE5FV0ZUUAorX1BST1RPVFlQKCBpbnQgZG9mdHB1c3IsICAgICh2b2lkKSApOworX1BST1RPVFlQKCBpbnQgZG9mdHBwdXQsICAgIChpbnQsaW50KSApOworX1BST1RPVFlQKCBpbnQgZG9mdHBnZXQsICAgIChpbnQsaW50KSApOworX1BST1RPVFlQKCBpbnQgZG9mdHBybXQsICAgIChpbnQsaW50KSApOworX1BST1RPVFlQKCBpbnQgZnRwb3BlbiwgICAgIChjaGFyICosIGNoYXIgKiwgaW50KSApOworX1BST1RPVFlQKCBpbnQgY21kbGluZ2V0LCAgIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBjbWRsaW5wdXQsICAgKGludCkgKTsKK19QUk9UT1RZUCggaW50IGRvZnRwYXJnLCAgICAoY2hhcikgKTsKK19QUk9UT1RZUCggaW50IGRvZnRwYWNjdCwgICAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGRvZnRwc2l0ZSwgICAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGRvc2V0ZnRwcHN2LCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGZ0cGJ5ZSwgICAgICAodm9pZCkgKTsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKworI2lmZGVmIENPTU1FTlQKKy8qIFRoZXNlIHByb3RvdHlwZXMgYXJlIG5vIGxvbmdlciB1c2VkICovCitfUFJPVE9UWVAoIGNoYXIgKiBnZXRkd3MsIChpbnQpICk7CitfUFJPVE9UWVAoIGNoYXIgKiBnZXRkY3MsIChpbnQpICk7CitfUFJPVE9UWVAoIGludCBkb2dldCwgKGludCkgKTsKK19QUk9UT1RZUCggY2hhciAqIGFycmF5dmFsLCAoaW50LCBpbnQpICk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjaWZkZWYgS1VJCitfUFJPVE9UWVAoaW50IEJ1aWxkRm9udFRhYmxlLAorICAgICAgICAgIChzdHJ1Y3Qga2V5dGFiICoqIHBUYWJsZSwgc3RydWN0IGtleXRhYiAqKiBwVGFibGUyLCBpbnQgKiBwTikpOworI2VuZGlmIC8qIEtVSSAqLworCitfUFJPVE9UWVAoaW50IGN4X25ldCwgKGludCBuZXQsIGludCBwcm90b2NvbCwgY2hhciAqIHhob3N0LCBjaGFyICogc3ZjLCAKKyAgICAgICAgY2hhciAqIHVzZXJuYW1lLCBjaGFyICogcGFzc3dvcmQsIGNoYXIgKiBjb21tYW5kLAorICAgICAgICBpbnQgcGFyYW0xLCBpbnQgcGFyYW0yLCBpbnQgcGFyYW0zLCAKKyAgICAgICAgaW50IGN4LCBpbnQgc3gsIGludCBmbGFnLCBpbnQgZ3VpKSk7CitfUFJPVE9UWVAoaW50IGN4X3NlcmlhbCwgKGNoYXIgKmRldmljZSwgCisgICAgICAgIGludCBjeCwgaW50IHN4LCBpbnQgc2hyLCBpbnQgZmxhZywgaW50IGd1aSwgaW50IHNwZWNpYWwpKTsKKworI2VuZGlmIC8qIENLVVVTUl9IICovCisKKy8qIEVuZCBvZiBja3V1c3IuaCAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdXVzeC5jIGIvY2tlcm1pdC04LjAuMjExL2NrdXVzeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzg5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2t1dXN4LmMKQEAgLTAsMCArMSw5Mzg3IEBACisjaW5jbHVkZSAiY2tjc3ltLmgiCisKKy8qICBDIEsgVSBVIFMgWCAtLSAgIlVzZXIgSW50ZXJmYWNlIiBjb21tb24gZnVuY3Rpb25zLiAqLworCisvKgorICBBdXRob3JzOgorICAgIEZyYW5rIGRhIENydXogPGZkY0Bjb2x1bWJpYS5lZHU+LAorICAgICAgVGhlIEtlcm1pdCBQcm9qZWN0LCBDb2x1bWJpYSBVbml2ZXJzaXR5LCBOZXcgWW9yayBDaXR5CisgICAgSmVmZnJleSBFIEFsdG1hbiA8amFsdG1hbkBzZWN1cmUtZW5kcG9pbnRzLmNvbT4KKyAgICAgIFNlY3VyZSBFbmRwb2ludHMgSW5jLiwgTmV3IFlvcmsgQ2l0eQorCisgIENvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisqLworCisvKgorICBUaGlzIG1vZHVsZSBjb250YWlucyB1c2VyIGludGVyZmFjZSBmdW5jdGlvbnMgbmVlZGVkIGJ5IGJvdGggdGhlIGludGVyYWN0aXZlCisgIHVzZXIgaW50ZXJmYWNlIGFuZCB0aGUgY29tbWFuZC1saW5lLW9ubHkgdXNlciBpbnRlcmZhY2UuCisqLworCisvKiBJbmNsdWRlcyAqLworCisjaW5jbHVkZSAiY2tjZGViLmgiCisjaW5jbHVkZSAiY2tjYXNjLmgiCisjaW5jbHVkZSAiY2tja2VyLmgiCisjaW5jbHVkZSAiY2t1dXNyLmgiCisjaW5jbHVkZSAiY2tjeGxhLmgiCisKKyNpZm5kZWYgTk9IVEVSTUNBUAorI2lmZGVmIE5PVEVSTUNBUAorI2RlZmluZSBOT0hURVJNQ0FQCisjZWxzZQorI2lmbmRlZiBCU0Q0NAorI2RlZmluZSBOT0hURVJNQ0FQCisjZWxzZQorI2lmZGVmIF9fYnNkaV9fCisjZGVmaW5lIE5PSFRFUk1DQVAKKyNlbHNlCisjaWZkZWYgT1BFTkJTRAorI2RlZmluZSBOT0hURVJNQ0FQCisjZWxzZQorI2lmZGVmIE1BQ09TWAorI2RlZmluZSBOT0hURVJNQ0FQCisjZW5kaWYgLyogTUFDT1NYICovCisjZW5kaWYgLyogT1BFTkJTRCAqLworI2VuZGlmIC8qIF9fYnNkaV9fICovCisjZW5kaWYgLyogQlNENDQgKi8KKyNlbmRpZiAvKiBOT1RFUk1DQVAgKi8KKyNlbmRpZiAvKiBOT0hURVJNQ0FQICovCisKKyNpZm5kZWYgTk9URVJNQ0FQCisjaWZkZWYgQlNENDQKKyNpZm5kZWYgTk9IVEVSTUNBUAorI2luY2x1ZGUgPHRlcm1jYXAuaD4KKyNlbmRpZiAvKiBOT0hURVJNQ0FQICovCisjZW5kaWYgLyogQlNENDQgKi8KKyNlbHNlICAvKiAhQlNENDQgKi8KKyNpZmRlZiBsaW51eAorI2luY2x1ZGUgPHRlcm0uaD4KKyNlbmRpZiAvKiBsaW51eCAqLworI2VuZGlmIC8qIE5PVEVSTUNBUCAqLworCisjaWZkZWYgT1MyCisjaW5jbHVkZSA8c3RyaW5nLmg+CitfUFJPVE9UWVAoY2hhciAqIG9zMl9nZXRob3N0bmFtZSwgKHZvaWQpKTsKKyNkZWZpbmUgZ2V0cGlkIF9nZXRwaWQKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBCU0Q0NAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYgLyogQlNENDQgKi8KKworZXh0ZXJuIHh4X3N0cnAgeHhzdHJpbmc7CisKKyNpZmRlZiBPUzIKKyNpbmNsdWRlICJja2NuZXQuaCIKKyNlbHNlIC8qIE9TMiAqLworX1BST1RPVFlQKGludCBnZXRsb2NhbGlwYWRkciwgKHZvaWQpKTsKK19QUk9UT1RZUChpbnQgaXN0bmNvbXBvcnQsICh2b2lkKSk7CisjaWZuZGVmIE5PQ0tHRVRGUUhPU1QKK19QUk9UT1RZUCggY2hhciAqIGNrZ2V0ZnFob3N0bmFtZSwoY2hhciAqKSk7CisjZW5kaWYJLyogTk9DS0dFVEZRSE9TVCAqLworI2lmbmRlZiBORVRDT05OCisvKgorICBXZSBzaG91bGQganVzdCBwdWxsIGluIGNrY25ldC5oIGhlcmUsIGJ1dCBpdCBjYXVzZXMgYSBjb25mbGljdCB3aXRoIGN1cnNlcy5oLgorKi8KKyNpZmRlZiBUQ1BTT0NLRVQKKyNkZWZpbmUgTkVUQ09OTgorI2Vsc2UKKyNpZmRlZiBTVU5YMjUKKyNkZWZpbmUgTkVUQ09OTgorI2Vsc2UKKyNpZmRlZiBTVFJBVFVTWDI1CisjZGVmaW5lIE5FVENPTk4KKyNlbHNlCisjaWZkZWYgSUJNWDI1CisjZGVmaW5lIE5FVENPTk4KKyNlbHNlCisjaWZkZWYgSFBYMjUKKyNkZWZpbmUgTkVUQ09OTgorI2Vsc2UKKyNpZmRlZiBERUNORVQKKyNkZWZpbmUgTkVUQ09OTgorI2Vsc2UKKyNpZmRlZiBOUElQRQorI2RlZmluZSBORVRDT05OCisjZWxzZQorI2lmZGVmIENLX05FVEJJT1MKKyNkZWZpbmUgTkVUQ09OTgorI2lmZGVmIFNVUEVSTEFUCisjZGVmaW5lIE5FVENPTk4KKyNlbHNlCisjZW5kaWYgLyogU1VQRVJMQVQgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNlbmRpZiAvKiBTVU5YMjUgKi8KKyNlbmRpZiAvKiBTVFJBVFVTWDI1ICovCisjZW5kaWYgLyogSUJNWDI1ICovCisjZW5kaWYgLyogSFBYMjUgKi8KKyNlbmRpZiAvKiBERUNORVQgKi8KKyNlbmRpZiAvKiBOUElQRSAqLworI2VuZGlmIC8qIENLX05FVEJJT1MgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZm5kZWYgVENQU09DS0VUCisjaWZkZWYgTVVMVElORVQKKyNkZWZpbmUgVENQU09DS0VUCisjZW5kaWYgLyogTVVMVElORVQgKi8KKyNpZmRlZiBERUNfVENQSVAKKyNkZWZpbmUgVENQU09DS0VUCisjZW5kaWYgLyogREVDX1RDUElQICovCisjaWZkZWYgV0lOVENQCisjZGVmaW5lIFRDUFNPQ0tFVAorI2VuZGlmIC8qIFdJTlRDUCAqLworI2lmZGVmIFRDUFdBUkUKKyNkZWZpbmUgVENQU09DS0VUCisjZW5kaWYgLyogVENQV0FSRSAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCisjaWZkZWYgT1MyCisjaWZkZWYgTlQKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8dGFwaS5oPgorI2luY2x1ZGUgImNrbnRhcC5oIgorI2Vsc2UgLyogTlQgKi8KKyNkZWZpbmUgSU5DTF9WSU8KKyNpbmNsdWRlIDxvczIuaD4KKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIENPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdvdWxkIHlvdSBiZWxpZXZlICovCisjdW5kZWYgQ09NTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPG9zMi5oPiBkZWZpbmVzIHRoaXMgPyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBDS19ORVRCSU9TCisjaW5jbHVkZSAiY2tvbmJpLmgiCisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworCisjaW5jbHVkZSAiY2tvY29uLmgiCitleHRlcm4gYXNjcmVlbiBjb21tYW5kc2NyZWVuOworI2lmZGVmIEtVSQorI2luY2x1ZGUgImlrdWkuaCIKKyNlbmRpZiAvKiBLVUkgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIE5UCisjaW5jbHVkZSAiY2tud2luLmgiCisjZW5kaWYgLyogTlQgKi8KKyNpZmRlZiBPUzIKKyNpbmNsdWRlICJja293aW4uaCIKKyNpbmNsdWRlICJja29zeW4uaCIKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIENLX1RBUEkKK2V4dGVybiBpbnQgdHR0YXBpOworZXh0ZXJuIGludCB0YXBpcGFzczsKKyNlbmRpZiAvKiBDS19UQVBJICovCisKKyNpZmRlZiBDS19LRVJCRVJPUworI2luY2x1ZGUgImNrdWF0aC5oIgorI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKyNpZm5kZWYgV0lOVENQCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYgLyogV0lOVENQICovCisKKyNpZmRlZiBWTVMKKyNpbmNsdWRlIDxkZXNjcmlwLmg+CisjaW5jbHVkZSA8c3NkZWYuaD4KKyNpbmNsdWRlIDxzdHNkZWYuaD4KKyNpZm5kZWYgT0xEX1ZNUworI2luY2x1ZGUgPGxpYiRyb3V0aW5lcy5oPiAgLyogTm90IGZvciBWQVggQyAyLjMgKi8KKyNlbHNlCisjaW5jbHVkZSA8bGliZGVmLmg+CisjZW5kaWYgLyogT0xEX1ZNUyAqLworI2lmZGVmIFdJTlRDUAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmIC8qIFdJTlRDUCAqLworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgRENMRkRPUEVOCisvKiBmZG9wZW4oKSBuZWVkcyBkZWNsYXJpbmcgYmVjYXVzZSBpdCdzIG5vdCBkZWNsYXJlZCBpbiA8c3RkaW8uaD4gKi8KK19QUk9UT1RZUCggRklMRSAqIGZkb3BlbiwgKGludCwgY2hhciAqKSApOworI2VuZGlmIC8qIERDTEZET1BFTiAqLworCisjaWZkZWYgRENMUE9QRU4KKy8qIHBvcGVuKCkgbmVlZHMgZGVjbGFyaW5nIGJlY2F1c2UgaXQncyBub3QgZGVjbGFyZWQgaW4gPHN0ZGlvLmg+ICovCitfUFJPVE9UWVAoIEZJTEUgKiBwb3BlbiwgKGNoYXIgKiwgY2hhciAqKSApOworI2VuZGlmIC8qIERDTFBPUEVOICovCisKK2ludCB0dF9jcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYXJyaWFnZSByZXR1cm4gZGlzcGxheSAqLworaW50IGludGVycnVwdGVkID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdGVkIGZyb20ga2V5Ym9hcmQgZmxhZyAqLworc3RhdGljIGludCBmeGRfaW5pdGVkID0gMDsgICAgICAgICAgICAgIC8qIEZ1bGxzY3JlZW4gc3R1ZmYgaW5pdGlhbGl6ZWQgKi8KKworI2lmZGVmIERFQlVHCitjaGFyIGRlYmZpbFtDS01BWFBBVEgrMV07ICAgICAgICAgICAgICAgLyogRGVidWdnaW5nIGxvZyBmaWxlIG5hbWUgKi8KKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgVExPRworY2hhciB0cmFmaWxbQ0tNQVhQQVRIKzFdOyAgICAgICAgICAgICAgIC8qIFRyYW5zYWN0aW9uIGxvZyBmaWxlIG5hbWUgKi8KKyNlbmRpZiAvKiBUTE9HICovCisKK2NoYXIgc2VzZmlsW0NLTUFYUEFUSCsxXTsgICAgICAgICAgICAgICAvKiBTZXNzaW9uIGxvZyBmaWxlIG5hbWUgKi8KKworI2lmZGVmIENLTE9HRElBTAorY2hhciBkaWFmaWxbQ0tNQVhQQVRIKzFdOyAgICAgICAgICAgICAgIC8qIENvbm5lY3Rpb24gbG9nIGZpbGUgbmFtZSAqLworY2hhciBjeGxvZ2J1ZltDWExPR0JVRkwrMV07ICAgICAgICAgICAgIC8qIENvbm5lY3Rpb24gbG9nIHJlY29yZCBidWZmZXIgKi8KK2ludCBjeF9hY3RpdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBDb25uZWN0aW9uIGlzIGFjdGl2ZSAqLworZXh0ZXJuIGludCBkaWFsb2c7CisjZW5kaWYgLyogQ0tMT0dESUFMICovCisKKyNpZmRlZiBEWU5BTUlDCitzdGF0aWMgY2hhciAqY21kc3RyID0gTlVMTDsgICAgICAgICAgICAgLyogUGxhY2UgdG8gYnVpbGQgZ2VuZXJpYyBjb21tYW5kICovCisjZWxzZQorI2lmZGVmIHBkcDExCitzdGF0aWMgY2hhciBjbWRzdHJbMjU2XTsKKyNlbHNlCitzdGF0aWMgY2hhciBjbWRzdHJbNDA5Nl07CisjZW5kaWYgLyogcGRwMTEgKi8KKyNlbmRpZiAvKiBEWU5BTUlDICovCisKKyNpZm5kZWYgTk9NU0VORAorY2hhciBmc3BlY1tDTURCTCs0XTsgICAgICAgICAgICAgICAgICAgIC8qIEZpbGVuYW1lIHN0cmluZyBmb3IgXHYoZmlsZXNwZWMpICovCitpbnQgZnNwZWNsZW4gPSBDTURCTDsKKyNlbHNlCitjaGFyIGZzcGVjW0NLTUFYUEFUSCs0XTsKK2ludCBmc3BlY2xlbiA9IENLTUFYUEFUSDsKKyNlbmRpZiAvKiBOT01TRU5EICovCisKK2NoYXIgKiByZnNwZWMgPSBOVUxMOwkJCS8qIFJlY2VpdmVkIGZpbGVzcGVjOiBsb2NhbCAqLworY2hhciAqIHByZnNwZWMgPSBOVUxMOwkJCS8qIFByZWxpbWluYXJ5IHJmc3BlYyAqLworY2hhciAqIHNmc3BlYyA9IE5VTEw7CQkJLyogU2VudCBmaWxlc3BlYzogbG9jYWwgKi8KK2NoYXIgKiBwc2ZzcGVjID0gTlVMTDsJCQkvKiBQcmVsaW1pbmFyeSBzZnNwZWMgKi8KK2NoYXIgKiBzcmZzcGVjID0gTlVMTDsJCQkvKiBSZWNlaXZlZCBmaWxlc3BlYzogcmVtb3RlICovCitjaGFyICogcHNyZnNwZWMgPSBOVUxMOwkJCS8qIFByZWxpbWluYXJ5IHNyZnNwZWMgKi8KK2NoYXIgKiBycmZzcGVjID0gTlVMTDsJCQkvKiBTZW50IGZpbGVzcGVjOiByZW1vdGUgKi8KK2NoYXIgKiBwcnJmc3BlYyA9IE5VTEw7CQkJLyogUHJlbGltaW5hcnkgcnJmc3BlYyAqLworCitpbnQgc3VjY2VzcyA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBzdWNjZXNzL2ZhaWx1cmUgZmxhZyAqLworICAgIGNtZGx2bCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgbGV2ZWwgKi8KKyAgICBhY3Rpb24gPSAwLAkJCQkvKiBBY3Rpb24gc2VsZWN0ZWQgb24gY29tbWFuZCBsaW5lICovCisgICAgc2xvZ3RzID0gMCwJCQkJLyogU2Vzc2lvbi1sb2cgdGltZXN0YW1wcyBvbi9vZmYgKi8KKyNpZmRlZiBVTklYCisgICAgc2Vzc2Z0ID0gWFlGVF9ULCAgICAgICAgICAgICAgICAgICAgLyogU2Vzc2lvbiBsb2cgZmlsZSB0eXBlICovCisjZWxzZQorICAgIHNlc3NmdCA9IFhZRlRfQiwJCQkvKiAodGV4dCBmb3IgVU5JWCBiaW5hcnkgZm9yIG90aGVycykgKi8KKyNlbmRpZiAvKiBVTklYICovCisgICAgcGZsYWcgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpbnQgcHJvbXB0ICovCisgICAgbXNnZmxnID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyAqLworCitleHRlcm4gaW50IHhhc2ttb3JlLCBzYXZlYXNrOwkJLyogTW9yZS1wcm9tcHRpbmcgKi8KKworI2lmZGVmIENLX0FQQworZXh0ZXJuIGludCBhcGNhY3RpdmU7CisjZW5kaWYgLyogQ0tfQVBDICovCisvKiBFeHRlcm5hbCB2YXJpYWJsZXMgKi8KKworZXh0ZXJuIGludCBsb2NhbCwgcXVpZXQsIGJpbmFyeSwgbmV0d29yaywgd2hhdCwgcGFyaXR5LCB4aXRzdGEsIGVzY2FwZSwKKyAgdGxldmVsLCBiZ3NldCwgYmFja2dyZCwgeHN1c3BlbmQsIGNtZGludCwgbmV0dHlwZSwgc2VzbG9nLCBkZmxvYzsKKworZXh0ZXJuIGludCBjbWRfcm93cywgY21kX2NvbHMsIHhjbWRzcmM7CisKK2V4dGVybiBjaGFyIGNtZGZpbFtdOworCisjaWZkZWYgVk1TCitleHRlcm4gaW50IGJhdGNoOworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgZGF0YWdlbmVyYWwgICAgICAgICAgICAgICAgICAgICAgLyogMi8xMi85MiBFTkggKi8KKyNpbmNsdWRlIDxzeXNpZC5oPgorZXh0ZXJuIGludCBjb25fcmVhZHNfbXQsIGNvbmludF9jaCwgY29uaW50X2F2bDsKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworCitleHRlcm4gbG9uZyBzcGVlZDsKKworZXh0ZXJuIGNoYXIgdHRuYW1lW10sICpkZnR0eSwgKmNtYXJnLCAqKmNtbGlzdCwgKnZlcnNpbywgbXlob3N0W107CisKKyNpZm5kZWYgTk9DU0VUUworZXh0ZXJuIGludCBmY2hhcnNldCwgdGNoYXJzZXQsIHhmcnhsYTsKK2V4dGVybiBzdHJ1Y3QgY3NpbmZvIGZjc2luZm9bXSwgdGNzaW5mb1tdOworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmZGVmIE9TMgorZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY29sb3JjbWQ7CisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBOT1hGRVIKKworaW50IGZkaXNwbGEgPSBYWUZEX047CisKKyNlbHNlICAvKiBOT1hGRVIgaXMgbm90IGRlZmluZWQgKi8KKworI2lmZGVmIE9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgdHJhbnNmZXIgZGlzcGxheSB0eXBlICovCitpbnQgZmRpc3BsYSA9IFhZRkRfQzsgICAgICAgICAgICAgICAgICAgLyogQ3Vyc2VzIChmdWxsc2NyZWVuKSBpZiB3ZSBoYXZlIGl0ICovCisjZWxzZQorI2lmZGVmIENLX0NVUlNFUworaW50IGZkaXNwbGEgPSBYWUZEX0M7CisjZWxzZQoraW50IGZkaXNwbGEgPSBYWUZEX1M7ICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSBDUlQgKi8KKyNlbmRpZiAvKiBDS19DVVJTRVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworZXh0ZXJuIHN0cnVjdCBja19wIHB0YWJbXTsKK2V4dGVybiBpbnQgcHJvdG9jb2wsIHhmcmJlbCwgeGZyaW50OworCisjaWZkZWYgU1RSRUFNSU5HCitleHRlcm4gaW50IHN0cmVhbWluZywgc3RyZWFtb2s7CisjZW5kaWYgLyogU1RSRUFNSU5HICovCisKKy8qIFVzZWQgaW50ZXJuYWxseSAqLworCitfUFJPVE9UWVAoIFZPSUQgc2NyZWVuYywgKGludCwgY2hhciwgbG9uZywgY2hhciAqKSApOworX1BST1RPVFlQKCBWT0lEIHNjcmVlbmcsIChpbnQsIGNoYXIsIGxvbmcsIGNoYXIgKikgKTsKKworI2lmZGVmIENLX0NVUlNFUworI2lmbmRlZiBEWU5BTUlDCitzdGF0aWMgY2hhciB4dHJtYnVmW1RSTUJVRkxdOyAgICAgICAgICAgLyogdGdldGVudCgpIGJ1ZmZlciAqLworY2hhciAqIHRybWJ1ZiA9IHh0cm1idWY7CisjZWxzZQorY2hhciAqIHRybWJ1ZiA9IE5VTEw7CisjZW5kaWYgLyogRFlOQU1JQyAqLworX1BST1RPVFlQKCBzdGF0aWMgVk9JRCBkcHlpbml0LCAodm9pZCkgKTsKK19QUk9UT1RZUCggc3RhdGljIGxvbmcgc2hvY3BzLCAoaW50LCBsb25nLCBsb25nKSApOworX1BST1RPVFlQKCBzdGF0aWMgbG9uZyBzaG9ldGwsIChsb25nLCBsb25nLCBsb25nLCBsb25nKSApOworI2VuZGlmIC8qIENLX0NVUlNFUyAqLworCitzdGF0aWMgaW50IGZ0X3dpbiA9IDA7ICAvKiBGdWxsc2NyZWVuIGZpbGUgdHJhbnNmZXIgZGlzcGxheSB3aW5kb3cgaXMgYWN0aXZlICovCisKKy8qIFZhcmlhYmxlcyBkZWNsYXJlZCBoZXJlICovCisKK3N0YXRpYyBjaGFyICogc2tyZWFzb25bXSA9IHsKKyAgICAiIiwJCQkJCS8qIDAgKi8KKyAgICAiUmVtb3RlIGZpbGUgbm90IG9sZGVyIiwJCS8qIFNLUF9EQVQgKi8KKyAgICAiSWRlbnRpY2FsIG1vZGlmaWNhdGlvbiB0aW1lcyIsCS8qIFNLUF9FUVUgKi8KKyAgICAiVHlwZSIsCQkJCS8qIFNLUF9UWVAgKi8KKyAgICAiU2l6ZSIsCQkJCS8qIFNLUF9TSVogKi8KKyAgICAiTmFtZSBjb2xsaXNpb24iLAkJCS8qIFNLUF9OQU0gKi8KKyAgICAiRXhjZXB0aW9uIExpc3QiLAkJCS8qIFNLUF9FWEwgKi8KKyAgICAiRG90IGZpbGUiLAkJCQkvKiBTS1BfRE9UICovCisgICAgIkJhY2t1cCBmaWxlIiwJCQkvKiBTS1BfQktVICovCisgICAgIlJlY292ZXJ5IG5vdCBuZWVkZWQiLAkJLyogU0tQX1JFUyAqLworICAgICJBY2Nlc3MgZGVuaWVkIiwJCQkvKiBTS1BfQUNDICovCisgICAgIk5vdCBhIHJlZ3VsYXIgZmlsZSIsCQkvKiBTS1BfTlJGICovCisgICAgIlNpbXVsYXRlZCIsCQkJLyogU0tQX1NJTSAqLworICAgICJTaW11bGF0ZWQgLSBSZW1vdGUgZmlsZSBvbGRlciIsCS8qIFNLUF9YVVAgKi8KKyAgICAiU2ltdWxhdGVkIC0gTm8gcmVtb3RlIGZpbGUiLAkvKiBTS1BfWE5YICovCit9Oworc3RhdGljIGludCBuc2tyZWFzb24gPSAoc2l6ZW9mKHNrcmVhc29uKSAvIHNpemVvZihjaGFyICopKTsKKworY2hhciAqCitnc2tyZWFzb24obikgaW50IG47IHsKKyAgICByZXR1cm4oKG4gPiAwICYmIG4gPCBuc2tyZWFzb24pID8gc2tyZWFzb25bbl0gOiAiIik7Cit9CisKK2NoYXIgcGt0ZmlsW0NLTUFYUEFUSCsxXTsgICAgICAgICAgICAgICAvKiBQYWNrZXQgbG9nIGZpbGUgbmFtZSAqLworCisjaWZuZGVmIE5PTVNFTkQgICAgICAgICAgICAgICAgICAgICAgICAgLyogTXVsdGlwbGUgU0VORCAqLworY2hhciAqbXNmaWxlc1tNU0VORE1BWF07CisjZW5kaWYgLyogTk9NU0VORCAqLworCisjaWZkZWYgQ0tfVElNRVJTCitleHRlcm4gbG9uZyBydHRkZWxheTsKK2V4dGVybiBpbnQgIHJ0dGZsZzsKKyNlbmRpZiAvKiBDS19USU1FUlMgKi8KK2V4dGVybiBpbnQgcmN2dGltbzsKKworI2lmZGVmIENLX1JFU0VORAorZXh0ZXJuIGludCBzZW5kbW9kZTsKK2V4dGVybiBsb25nIHNlbmRzdGFydCwgcnNfbGVuOworI2VuZGlmIC8qIENLX1JFU0VORCAqLworCisjaWZkZWYgQ0tfUENUX0JBUiAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSB0cmFuc2ZlciB0aGVybW9tZXRlciAqLworaW50IHRoZXJtb21ldGVyID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIE9OIGJ5IGRlZmF1bHQgKi8KKyNlbmRpZiAvKiBDS19QQ1RfQkFSICovCisKKyNpZmRlZiBHRlRJTUVSCitDS0ZMT0FUIGd0diA9IC0xLjAsIG9sZGd0diA9IC0xLjA7CisjZWxzZQorI2lmbmRlZiBPUzIKK3N0YXRpYworI2VuZGlmIC8qIE9TMiAqLworICBsb25nIGd0diA9IC0xTCwgb2xkZ3R2ID0gLTFMOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKworZXh0ZXJuIGludCBzZXJ2ZXIsIGJjdHUsIHJwdGZsZywgZWJxZmxnLCBzcHNpeiwgdXJwc2l6LCB3bWF4LCBjenNlZW4sIGN4c2VlbiwKKyAgd2lubG8sIGRpc3BsYSwgdGltaW50LCBucGFkLCBlYnEsIGJjdHIsIHJwdHEsIGF0Y2FwdSwgbHBjYXB1LAorICBzd2NhcHUsIHdzbG90biwgd3Nsb3RyLCBydGltbywgbXlwYWRuLCBzcSwgY2FwYXMsIHJwc2l6LCB0c2VjcywKKyAgcGt0bG9nLCBsc2NhcHUsIGRlc3QsIHNydmRpcywgd3Nsb3RzLCBzcGFja2V0cywgc3BrdGwsIHJwa3RsLAorICByZXRyYW5zLCB3Y3VyLCBudW1lcnJzLCBmc2Vjcywgd2hhdHJ1LCBjcnVuY2hlZCwgdGltZW91dHMsCisgIHJwYWNrZXRzLCBmbmNudiwgYnllX2FjdGl2ZSwgZGlzY2FyZCwgaW5zZXJ2ZXIsIGRpcmFjdGl2ZSwgY2RhY3RpdmU7CisKK2V4dGVybiBsb25nIGZpbGNudCwgZmlscmVqLCBmZmMsIHRmYywgcnB0biwgZnNpemUsIGZpbGNwcywgdGZjcHMsIGNwcywgcGVha2NwczsKKworbG9uZyBvbGRjcHMgPSAwTDsKKworZXh0ZXJuIENIQVIgKnJkYXRhcCwgcGFkY2gsIHNlb2wsIGN0bHEsIG15cGFkYywgZW9sLCAqZXBrdG1zZzsKK2V4dGVybiBjaGFyICp4ZnJtc2c7CisKKyNpZmRlZiBJS1NEQgorRklMRSAqIGRiZnAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgcG9pbnRlciB0byBkYXRhYmFzZSBmaWxlICovCisKK2ludCBkYmVuYWJsZWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBkYXRhYmFzZSBpcyBlbmFibGVkICovCitleHRlcm4gaW50IGlrZGJvcGVuOyAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgZGF0YWJhc2UgaXMgb3BlbiAqLworCit1bnNpZ25lZCBsb25nIG15ZGJzZWVrID0gMEw7ICAgICAgICAgICAgLyogU2VlayBwb2ludGVyIHRvIG15IHJlY29yZCAqLworaW50IG15ZGJzbG90ID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIE15IHNsb3QgbnVtYmVyICovCit1bnNpZ25lZCBsb25nIG15ZmxhZ3MgPSAwTDsgICAgICAgICAgICAgLyogTXkgZmxhZ3MgKi8KK3Vuc2lnbmVkIGxvbmcgbXlhdHlwZSA9IDBMOyAgICAgICAgICAgICAvKiBNeSBhdXRob3JpemF0aW9uIHR5cGUgKi8KK3Vuc2lnbmVkIGxvbmcgbXlhbW9kZSA9IDBMOyAgICAgICAgICAgICAvKiBNeSBhdXRob3JpemF0aW9uIG1vZGUgKi8KK3Vuc2lnbmVkIGxvbmcgbXlzdGF0ZSA9IDBMOyAgICAgICAgICAgICAvKiBNeSBzdGF0ZSAoU0VORCwgUkVDRUlWRSwgZXRjKSAqLwordW5zaWduZWQgbG9uZyBteXBpZCA9IDBMOyAgICAgICAgICAgICAgIC8qIE15IFBJRCAqLwordW5zaWduZWQgbG9uZyBteWlwID0gMEw7ICAgICAgICAgICAgICAgIC8qIE15IElQIGFkZHJlc3MgKi8KK3Vuc2lnbmVkIGxvbmcgcGVlcmlwID0gMEw7ICAgICAgICAgICAgICAvKiBNeSBwZWVyJ3MgSVAgYWRkcmVzcyAqLworCit1bnNpZ25lZCBsb25nIGRiaXAgPSAwTDsgICAgICAgICAgICAgICAgLyogSVAgYWRkcmVzcyBpbiBkYiByZWNvcmQgKi8KK3Vuc2lnbmVkIGxvbmcgZGJwaWQgPSAwTDsgICAgICAgICAgICAgICAvKiBQSUQgaW4gZGIgcmVjb3JkICovCit1bnNpZ25lZCBsb25nIGRiZmxhZ3MgPSAwTDsgICAgICAgICAgICAgLyogRmxhZ3MgZmllbGQgaW4gZGIgcmVjb3JkICovCit1bnNpZ25lZCBsb25nIGRibGFzdHVzZWQgPSAwTDsgICAgICAgICAgLyogTGFzdCBpbi11c2UgcmVjb3JkIGluIGRiICovCitjaGFyIGRicmVjW0RCX1JFQ0xdOyAgICAgICAgICAgICAgICAgICAgLyogRGF0YWJhc2UgcmVjb3JkIGJ1ZmZlciAqLworCitjaGFyICogZGJkaXIgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgLyogRGF0YWJhc2UgZGlyZWN0b3J5ICovCitjaGFyICogZGJmaWxlICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgLyogRGF0YWJhc2UgZmlsZSBmdWxsIHBhdGhuYW1lICovCitjaGFyIG15aGV4aXBbMzNdID0geyBOVUwsIE5VTCB9OyAgICAgICAgLyogTXkgSVAgYWRkcmVzcyBpbiBoZXggKi8KK2NoYXIgcGVlcmhleGlwWzMzXSA9IHsgTlVMLCBOVUwgfTsgICAgICAvKiBDbGllbnQncyBJUCBhZGRyZXNzIGluIGhleCAqLworI2VuZGlmIC8qIElLU0RCICovCisKKyNpZmRlZiBHRlRJTUVSCitleHRlcm4gQ0tGTE9BVCBmcGZzZWNzLCBmcHRzZWNzLCBmcHhmc2VjczsKKyNlbHNlCitleHRlcm4gbG9uZyB4ZnNlY3M7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgVENQU09DS0VUCisjaWZkZWYgTkVXRlRQCitleHRlcm4gY2hhciAqIGZ0cF9ob3N0LCBmdHBfc3J2dHlwW107CitleHRlcm4gaW50IGZ0cF9jc3gsIGZ0cF9jc2wsIGZ0cF9kZWI7CisjZW5kaWYgLyogTkVXRlRQICovCitleHRlcm4gY2hhciBteWlwYWRkcltdOworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCisjaWZuZGVmIE5PSUNQCisjaWZuZGVmIE5PU1BMCisgICAgZXh0ZXJuIHN0cnVjdCBtdGFiICptYWN0YWI7ICAgICAgICAgLyogRm9yIE9OX0VYSVQgbWFjcm8uICovCisgICAgZXh0ZXJuIGludCBubWFjOworI2VuZGlmIC8qIE5PU1BMICovCisjaWZkZWYgRENNREJVRgorZXh0ZXJuIGNoYXIgKmNtZGJ1ZjsgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgYnVmZmVyICovCisjZWxzZQorZXh0ZXJuIGNoYXIgY21kYnVmW107ICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgYnVmZmVyICovCisjZW5kaWYgLyogRENNREJVRiAqLworZXh0ZXJuIGludCBjbWRfcXVvdGluZzsKKyNlbmRpZiAvKiBOT0lDUCAqLworCisjaWZuZGVmIE5PQ0NUUkFQCisjaWZkZWYgTlQKKyNpbmNsdWRlIDxzZXRqbXBleC5oPgorI2Vsc2UgLyogTlQgKi8KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNlbmRpZiAvKiBOVCAqLworI2luY2x1ZGUgImNrY3NpZy5oIgorZXh0ZXJuIGNram1wYnVmIGNtamJ1ZjsKKyNlbmRpZiAvKiBOT0NDVFJBUCAqLworCitleHRlcm4gaW50IHhmaWxldHlwZSwgbnNjYW5maWxlOworCitpbnQKK3Nob2VzYyhlc2NhcGUpIGludCBlc2NhcGU7IHsKKyAgICBleHRlcm4gY2hhciAqIGNjbnRhYltdOwkJLyogQzAgY29udHJvbCBjaGFyYWN0ZXIgbmFtZSB0YWJsZSAqLworICAgIGV4dGVybiBpbnQgdHRfZXNjYXBlOworICAgIGlmICgoZXNjYXBlID4gMCAmJiBlc2NhcGUgPCAzMikgfHwgKGVzY2FwZSA9PSAxMjcpKSB7CisJcHJpbnRmKCIgRXNjYXBlIGNoYXJhY3RlcjogQ3RybC0lYyAoQVNDSUkgJWQsICVzKTogJXNcclxuIiwKKwkgICAgICAgY3RsKGVzY2FwZSksCisJICAgICAgIGVzY2FwZSwKKwkgICAgICAgKGVzY2FwZSA9PSAxMjcgPyAiREVMIiA6IGNjbnRhYltlc2NhcGVdKSwKKwkgICAgICAgdHRfZXNjYXBlID8gImVuYWJsZWQiIDogImRpc2FibGVkIgorCSAgICAgICApOworICAgIH0gZWxzZSB7CisJcHJpbnRmKCIgRXNjYXBlIGNoYXJhY3RlcjogQ29kZSAlZCIsZXNjYXBlKTsKKwlpZiAoZXNjYXBlID4gMTYwICYmIGVzY2FwZSA8IDI1NikKKwkgIHByaW50ZigiICglYykiLGVzY2FwZSk7CisJcHJpbnRmKCI6ICVzXHJcbiIsIHR0X2VzY2FwZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwkKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisjaWZuZGVmIE5PWEZFUgorLyogIFAgUiBFIFMgRSBUICAtLSAgUmVzZXQgZ2xvYmFsIHByb3RvY29sIHZhcmlhYmxlcyAgKi8KKworZXh0ZXJuIGludCByZWN1cnNpdmU7CisKKyNpZmRlZiBQQVRURVJOUworaW50IHBhdHRlcm5zID0gU0VUX0FVVE87ICAgICAgICAgICAgICAgIC8qIFdoZXRoZXIgdG8gdXNlIGZpbGVuYW1lIHBhdHRlcm5zICovCitleHRlcm4gaW50IGdfcGF0dGVybnM7CQkJLyogRm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nICovCisjZWxzZQoraW50IHBhdHRlcm5zID0gU0VUX09GRjsKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworCisjaWZuZGVmIE5PSUNQCisjaWZkZWYgQ0tfTEFCRUxFRAorZXh0ZXJuIGludCBnX2xmX29wdHMsIGxmX29wdHM7CisjZW5kaWYgLyogQ0tfTEFCRUxFRCAqLworZXh0ZXJuIGludCBnX21hdGNoZG90LCBnX3VzZXBpcGVzLCB1c2VwaXBlczsKK2V4dGVybiBpbnQgZ19iaW5hcnksIGdfcHJvdG8sIGdfZGlzcGxhLCBnX3NwYXRoLCBnX3JwYXRoLCBnX2ZuY252OworZXh0ZXJuIGludCBnX3JlY3Vyc2l2ZTsKK2V4dGVybiBpbnQgZ194ZmVybW9kZSwgeGZlcm1vZGU7CitleHRlcm4gaW50IGdfdXJwc2l6LCBnX3Nwc2l6ZiwgZ19zcHNpejsKK2V4dGVybiBpbnQgZ19zcHNpenIsIGdfc3BtYXgsIGdfd3Nsb3RyLCBnX3ByZWZpeGluZywgZ19mbmNhY3Q7CitleHRlcm4gaW50IGdfZm5zcGF0aCwgZ19mbnJwYXRoLCBnX3NraXBidXA7CitleHRlcm4gaW50IG5vbGlua3M7CisjaWZkZWYgQ0tTWU1MSU5LCitleHRlcm4gaW50IHpnZnNfbGluazsKKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKyNpZm5kZWYgTk9TUEwKK2V4dGVybiBpbnQgZ19wZmxnLCBwd2ZsZywgZ19wY3B0LCBwd2NyeXB0OworZXh0ZXJuIGNoYXIgKiBnX3Bzd2QsIHB3YnVmW107CisjZW5kaWYgLyogTk9TUEwgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworCitleHRlcm4gaW50IHNwc2l6Ziwgc3BzaXpyLCBzcG1heCwgcHJlZml4aW5nLCBmbmNhY3QsIGZuc3BhdGgsIGZucnBhdGg7CitleHRlcm4gaW50IG1vdmluZzsgICAgICAgICAgICAgICAgICAgICAgLyogU0VORCBjcml0ZXJpYSAqLworZXh0ZXJuIGNoYXIgc25kYWZ0ZXJbXSwgc25kYmVmb3JlW10sICpzbmRleGNlcHRbXSwgKnJjdmV4Y2VwdFtdOworZXh0ZXJuIGxvbmcgc25kbGFyZ2VyLCBzbmRzbWFsbGVyLCBjYWxpYnJhdGUsIHNraXBidXA7CitleHRlcm4gaW50IHJtYWlsZiwgcnByaW50ZjsKK2V4dGVybiBjaGFyIG9wdGJ1ZltdOworCisjaWZkZWYgUElQRVNFTkQKK2V4dGVybiBjaGFyICogZ19zZmlsdGVyLCAqIGdfcmZpbHRlcjsKK2V4dGVybiBjaGFyICogc25kZmlsdGVyLCAqIHJjdmZpbHRlcjsKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworZXh0ZXJuIGNoYXIgKiogc25kYXJyYXk7CisKK1ZPSUQKK2Z0cmVzZXQoKSB7CisjaWZuZGVmIE5PSUNQCisgICAgaW50IGk7CisgICAgZXh0ZXJuIGNoYXIgKiBmaWxlZmlsZTsKKyAgICBleHRlcm4gaW50IHJlbGlhYmxlLCB4cmVsaWFibGUsIGNfc2F2ZSwgc3Nfc2F2ZSwgc2xvc3RhcnQsIHVyY2xlYXI7CisgICAgZXh0ZXJuIGludCBvb3B0cywgb21vZGUsIG9uYW1lLCBvcGF0aCwga2FjdGl2ZSwgYXV0b3BhdGg7CisgICAgZXh0ZXJuIGNoYXIgKiBzbmRfbW92ZTsgICAgICAgICAgICAgLyogRGlyZWN0b3J5IHRvIG1vdmUgc2VudCBmaWxlcyB0byAqLworICAgIGV4dGVybiBjaGFyICogc25kX3JlbmFtZTsgICAgICAgICAgIC8qIFdoYXQgdG8gcmVuYW1lIHNlbnQgZmlsZXMgdG8gKi8KKyAgICBleHRlcm4gY2hhciAqIHJjdl9tb3ZlOworICAgIGV4dGVybiBjaGFyICogcmN2X3JlbmFtZTsKKyAgICBleHRlcm4gY2hhciAqIGdfc25kX21vdmU7CisgICAgZXh0ZXJuIGNoYXIgKiBnX3NuZF9yZW5hbWU7CisgICAgZXh0ZXJuIGNoYXIgKiBnX3Jjdl9tb3ZlOworICAgIGV4dGVybiBjaGFyICogZ19yY3ZfcmVuYW1lOworCisjaWZkZWYgQ0tfVE1QRElSCisgICAgZXh0ZXJuIGludCBmX3RtcGRpcjsKKyAgICBleHRlcm4gY2hhciBzYXZkaXJbXTsKKyNlbmRpZiAvKiBDS19UTVBESVIgKi8KKworI2lmZGVmIENLX1NQRUVECisjaWZkZWYgQ09NTUVOVAorICAgIGV4dGVybiBpbnQgZl9jdGxwOworICAgIGV4dGVybiBzaG9ydCBzX2N0bHBbXSwgY3RscFtdOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBDS19TUEVFRCAqLworCisjaWZuZGVmIE5PQ1NFVFMKKyAgICBleHRlcm4gaW50IGZjc19zYXZlLCB0Y3Nfc2F2ZTsKKyAgICBleHRlcm4gaW50IGdfeGZyeGxhLCB4ZnJ4bGE7CisjZW5kaWYgLyogTk9DU0VUUyAqLworCisvKiBSZXN0b3JlIC8gcmVzZXQgcGVyLWNvbW1hbmQgZmlsZS10cmFuc2ZlciBzd2l0Y2hlcyAqLworCisgICAgbWFrZXN0cigmc25kX21vdmUsZ19zbmRfbW92ZSk7CisgICAgbWFrZXN0cigmcmN2X21vdmUsZ19yY3ZfbW92ZSk7CisgICAgbWFrZXN0cigmc25kX3JlbmFtZSxnX3NuZF9yZW5hbWUpOworICAgIG1ha2VzdHIoJnJjdl9yZW5hbWUsZ19yY3ZfcmVuYW1lKTsKKworICAgIGthY3RpdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtlcm1pdCBwcm90b2NvbCBubyBsb25nZXIgYWN0aXZlICovCisgICAgb29wdHMgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTy1QYWNrZXQgT3B0aW9ucyAqLworICAgIG9tb2RlID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE8tUGFja2V0IFRyYW5zZmVyIE1vZGUgKi8KKyAgICBvbmFtZSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPLVBhY2tldCBGaWxlbmFtZSBPcHRpb25zICovCisgICAgb3BhdGggPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTy1QYWNrZXQgUGF0aG5hbWUgT3B0aW9ucyAqLworCisjaWZkZWYgQ0tfUkVTRU5ECisgICAgcnNfbGVuID0gMEw7CQkJLyogUkVHRVQgcG9zaXRpb24gKi8KKyNlbmRpZiAvKiBDS19SRVNFTkQgKi8KKworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBDS19TUEVFRAorICAgIGlmIChmX2N0bHApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICAgIGN0bHBbaV0gPSBzX2N0bHBbaV07CisgICAgICAgIGZfY3RscCA9IDA7CisgICAgfQorI2VuZGlmIC8qIENLX1NQRUVEICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjaWZkZWYgQ0tfVE1QRElSCisgICAgaWYgKGZfdG1wZGlyKSB7CQkJLyogSWYgd2UgY2hhbmdlZCB0byBkb3dubG9hZCBkaXIgKi8KKwl6Y2hkaXIoKGNoYXIgKikgc2F2ZGlyKTsJLyogR28gYmFjayB3aGVyZSB3ZSBjYW1lIGZyb20gKi8KKwlmX3RtcGRpciA9IDA7CisgICAgfQorI2VuZGlmIC8qIENLX1RNUERJUiAqLworCisgICAgY2FsaWJyYXRlID0gMEw7ICAgICAgICAgICAgICAgICAgICAgLyogQ2FsaWJyYXRpb24gcnVuICovCisgICAgaWYgKHhyZWxpYWJsZSA+IC0xKSB7CisJcmVsaWFibGUgPSB4cmVsaWFibGU7CisJZGVidWcoRjEwMSwiZnRyZXNldCByZWxpYWJsZSIsIiIscmVsaWFibGUpOworICAgIH0KKyAgICB1cmNsZWFyID0gMDsKKworICAgIGlmIChhdXRvcGF0aCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIFNFVCBSRUNFSVZFIFBBVEhOQU1FUyBBVVRPICovCisgICAgICAgIGZucnBhdGggPSBQQVRIX0FVVE87CisgICAgICAgIGF1dG9wYXRoID0gMDsKKyAgICB9CisgICAgaWYgKGZpbGVmaWxlKSB7ICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSBsaXN0ICovCisgICAgICAgIHpjbG9zZShaTUZJTEUpOworICAgICAgICBtYWtlc3RyKCZmaWxlZmlsZSxOVUxMKTsKKyAgICB9CisgICAgaWYgKGNfc2F2ZSA+IC0xKSB7ICAgICAgICAgICAgICAgICAgLyogQmxvY2sgQ2hlY2sgVHlwZSAqLworICAgICAgICBiY3RyID0gY19zYXZlOworICAgICAgICBjX3NhdmUgPSAtMTsKKyAgICB9CisgICAgaWYgKHNzX3NhdmUgPiAtMSkgeyAgICAgICAgICAgICAgICAgLyogU2xvdyBTdGFydCAqLworICAgICAgICBzbG9zdGFydCA9IHNzX3NhdmU7CisgICAgICAgIHNzX3NhdmUgPSAtMTsKKyAgICB9CisjaWZkZWYgQ0tfTEFCRUxFRAorICAgIGlmIChnX2xmX29wdHMgPiAtMSkgeworICAgICAgICBsZl9vcHRzID0gZ19sZl9vcHRzOyAgICAgICAgICAgIC8qIFJlc3RvcmUgbGFiZWxlZCB0cmFuc2ZlciBvcHRpb25zICovCisgICAgICAgIGdfbGZfb3B0cyA9IC0xOworICAgIH0KKyNlbmRpZiAvKiBDS19MQUJFTEVEICovCisKKyNpZm5kZWYgTk9DU0VUUworICAgIGlmICh0Y3Nfc2F2ZSA+IC0xKSB7ICAgICAgICAgICAgICAgIC8qIENoYXJhY3RlciBzZXRzICovCisgICAgICAgIHRjaGFyc2V0ID0gdGNzX3NhdmU7CisgICAgICAgIHRjc19zYXZlID0gLTE7CisgICAgfQorICAgIGlmIChmY3Nfc2F2ZSA+IC0xKSB7CisgICAgICAgIGZjaGFyc2V0ID0gZmNzX3NhdmU7CisgICAgICAgIGZjc19zYXZlID0gLTE7CisgICAgfQorICAgIGlmIChnX3hmcnhsYSA+IC0xKSB7CisJeGZyeGxhID0gZ194ZnJ4bGE7CisJZ194ZnJ4bGEgPSAtMTsKKyAgICB9CisgICAgc2V0eGxhdHlwZSh0Y2hhcnNldCxmY2hhcnNldCk7ICAgICAgLyogVHJhbnNsYXRpb24gdHlwZSAqLworI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKworI2lmZGVmIE5FVENPTk4KKyNpZm5kZWYgTk9TUEwKKyAgICBpZiAoZ19wc3dkKSB7CisgICAgICAgIGNrc3RybmNweShwd2J1ZixnX3Bzd2QsUFdCVUZMKTsKKyAgICAgICAgbWFrZXN0cigmZ19wc3dkLE5VTEwpOworICAgIH0KKyAgICBpZiAoZ19wZmxnID4gLTEpIHsKKyAgICAgICAgcHdmbGcgPSBnX3BmbGc7CisgICAgICAgIGdfcGZsZyA9IC0xOworICAgIH0KKyAgICBpZiAoZ19wY3B0ID4gLTEpIHsKKyAgICAgICAgcHdjcnlwdCA9IGdfcGNwdDsKKyAgICAgICAgZ19wY3B0ID0gLTE7CisgICAgfQorI2VuZGlmIC8qIE5PU1BMICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworCisgICAgaWYgKGdfYmluYXJ5ID4gLTEpIHsgICAgICAgICAgICAgICAgLyogRmlsZSB0eXBlICovCisgICAgICAgIGJpbmFyeSA9IGdfYmluYXJ5OworICAgICAgICBnX2JpbmFyeSA9IC0xOworICAgIH0KKyAgICBpZiAoZ194ZmVybW9kZSA+IC0xKSB7ICAgICAgICAgICAgICAvKiBUcmFuc2ZlciBtb2RlICovCisgICAgICAgIHhmZXJtb2RlID0gZ194ZmVybW9kZTsKKyAgICAgICAgZ194ZmVybW9kZSA9IC0xOworICAgIH0KKyNpZmRlZiBQQVRURVJOUworICAgIGlmIChnX3BhdHRlcm5zID4gLTEpIHsgICAgICAgICAgICAgIC8qIEZpbGVuYW1lIHBhdHRlcm5zICovCisgICAgICAgIHBhdHRlcm5zID0gZ19wYXR0ZXJuczsKKyAgICAgICAgZ19wYXR0ZXJucyA9IC0xOworICAgIH0KKyNlbmRpZiAvKiBQQVRURVJOUyAqLworCisgICAgaWYgKGdfdXNlcGlwZXMgPiAtMSkgeworICAgICAgICB1c2VwaXBlcyA9IGdfdXNlcGlwZXM7CisgICAgICAgIGdfdXNlcGlwZXMgPSAtMTsKKyAgICB9CisgICAgaWYgKGdfbWF0Y2hkb3QgPiAtMSkgeworICAgICAgICBtYXRjaGRvdCA9IGdfbWF0Y2hkb3Q7CisgICAgICAgIGdfbWF0Y2hkb3QgPSAtMTsKKyAgICB9CisgICAgaWYgKGdfcHJvdG8gPiAtMSkgeyAgICAgICAgICAgICAgICAgLyogUHJvdG9jb2wgKi8KKyAgICAgICAgcHJvdG9jb2wgPSBnX3Byb3RvOworICAgICAgICBnX3Byb3RvID0gLTE7CisgICAgfQorICAgIGlmIChnX3VycHNpeiA+IC0xKSB7CisgICAgICAgIHVycHNpeiA9IGdfdXJwc2l6OworICAgICAgICBkZWJ1ZyhGMTAxLCJmdHJlc2V0IHJlc3RvcmluZyB1cnBzaXoiLCIiLHVycHNpeik7CisgICAgICAgIGdfdXJwc2l6ID0gLTE7CisgICAgfQorICAgIGlmIChnX3Nwc2l6ZiA+IC0xKSB7CisgICAgICAgIHNwc2l6ZiA9IGdfc3BzaXpmOworICAgICAgICBkZWJ1ZyhGMTAxLCJmdHJlc2V0IHJlc3RvcmluZyBzcHNpemYiLCIiLHNwc2l6Zik7CisgICAgICAgIGdfc3BzaXpmID0gLTE7CisgICAgfQorICAgIGlmIChnX3Nwc2l6ID4gLTEpIHsKKyAgICAgICAgc3BzaXogPSBnX3Nwc2l6OworICAgICAgICBkZWJ1ZyhGMTAxLCJmdHJlc2V0IHJlc3RvcmluZyBzcHNpeiIsIiIsc3BzaXopOworICAgICAgICBnX3Nwc2l6ID0gLTE7CisgICAgfQorICAgIGlmIChnX3Nwc2l6ciA+IC0xKSB7CisgICAgICAgIHNwc2l6ciA9IGdfc3BzaXpyOworICAgICAgICBkZWJ1ZyhGMTAxLCJmdHJlc2V0IHJlc3RvcmluZyBzcHNpenIiLCIiLHNwc2l6cik7CisgICAgICAgIGdfc3BzaXpyID0gLTE7CisgICAgfQorICAgIGlmIChnX3NwbWF4ID4gLTEpIHsKKyAgICAgICAgc3BtYXggPSBnX3NwbWF4OworICAgICAgICBnX3NwbWF4ID0gLTE7CisgICAgfQorICAgIGlmIChnX3dzbG90ciA+IC0xKSB7CisgICAgICAgIHdzbG90ciA9IGdfd3Nsb3RyOworICAgICAgICBnX3dzbG90ciA9IC0xOworICAgIH0KKyAgICBpZiAoZ19wcmVmaXhpbmcgPiAtMSkgeworICAgICAgICBwcmVmaXhpbmcgPSBnX3ByZWZpeGluZzsKKyAgICAgICAgZ19wcmVmaXhpbmcgPSAtMTsKKyAgICB9CisgICAgaWYgKGdfZm5jYWN0ID4gLTEpIHsKKyAgICAgICAgZm5jYWN0ID0gZ19mbmNhY3Q7CisgICAgICAgIGdfZm5jYWN0ID0gLTE7CisgICAgfQorICAgIGlmIChnX2ZuY252ID4gLTEpIHsKKyAgICAgICAgZm5jbnYgPSBnX2ZuY252OworICAgICAgICBnX2ZuY252ID0gLTE7CisgICAgfQorICAgIGlmIChnX2Zuc3BhdGggPiAtMSkgeworICAgICAgICBmbnNwYXRoID0gZ19mbnNwYXRoOworICAgICAgICBnX2Zuc3BhdGggPSAtMTsKKyAgICB9CisgICAgaWYgKGdfZm5ycGF0aCA+IC0xKSB7CisgICAgICAgIGZucnBhdGggPSBnX2ZucnBhdGg7CisgICAgICAgIGdfZm5ycGF0aCA9IC0xOworICAgIH0KKyAgICBpZiAoZ19za2lwYnVwID4gLTEpIHsKKyAgICAgICAgc2tpcGJ1cCA9IGdfc2tpcGJ1cDsKKyAgICAgICAgZ19za2lwYnVwID0gLTE7CisgICAgfQorICAgIG5vbGlua3MgPSAyOwkJCS8qIC9GT0xMT1dMSU5LUyBpcyBuZXZlciBnbG9iYWwgKi8KKyAgICByZWN1cnNpdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiAvUkVDVVJTSVZFIGNhbiBuZXZlciBiZSBnbG9iYWwgKi8KKyAgICB4ZmlsZXR5cGUgPSAtMTsKKworICAgIGlmIChnX2Rpc3BsYSA+IC0xKSB7ICAgICAgICAgICAgICAgIC8qIEZpbGUgdHJhbnNmZXIgZGlzcGxheSAqLworICAgICAgICBmZGlzcGxhID0gZ19kaXNwbGE7CisgICAgICAgIGdfZGlzcGxhID0gLTE7CisgICAgfQorICAgIGlmIChnX3NwYXRoID4gLTEpIHsgICAgICAgICAgICAgICAgIC8qIFNlbmQgcGF0aG5hbWVzICovCisgICAgICAgIGZuc3BhdGggPSBnX3NwYXRoOworICAgICAgICBnX3NwYXRoID0gLTE7CisgICAgfQorICAgIGlmIChnX3JwYXRoID4gLTEpIHsgICAgICAgICAgICAgICAgIC8qIFJlY2VpdmUgcGF0aG5hbWVzICovCisgICAgICAgIGZucnBhdGggPSBnX3JwYXRoOworICAgICAgICBnX3JwYXRoID0gLTE7CisgICAgfQorICAgIGlmIChnX2ZuY252ID4gLTEpIHsgICAgICAgICAgICAgICAgIC8qIEZpbGVuYW1lIGNvbnZlcnNpb24gKi8KKyAgICAgICAgZm5jbnYgPSBnX2ZuY252OworICAgICAgICBnX2ZuY252ID0gLTE7CisgICAgfQorI2lmZGVmIFBJUEVTRU5ECisgICAgbWFrZXN0cigmc25kZmlsdGVyLGdfc2ZpbHRlcik7ICAgICAgLyogU2VuZCBmaWx0ZXIgKi8KKyAgICBtYWtlc3RyKCZyY3ZmaWx0ZXIsZ19yZmlsdGVyKTsgICAgICAvKiBSZWNlaXZlIGZpbHRlciAqLworI2VuZGlmIC8qIFBJUEVTRU5EICovCisKKyNpZm5kZWYgTk9GUklMTFMKKyAgICBybWFpbGYgPSBycHJpbnRmID0gMDsgICAgICAgICAgICAgICAvKiBNQUlMIGFuZCBQUklOVCBtb2RpZmllcnMgZm9yIFNFTkQgKi8KKyAgICBvcHRidWZbMF0gPSBOVUw7ICAgICAgICAgICAgICAgICAgICAvKiBNQUlMIGFuZCBQUklOVCBvcHRpb25zICovCisjZW5kaWYgLyogTk9GUklMTFMgKi8KKworICAgIG1vdmluZyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IGRlbGV0ZS1hZnRlci1zZW5kIGluZGljYXRvciAqLworICAgIHNuZGFmdGVyWzBdICA9IE5VTDsgICAgICAgICAgICAgICAgIC8qIFJlc2V0IFNFTkQgc2VsZWN0aW9uIHN3aXRjaGVzICovCisgICAgc25kYmVmb3JlWzBdID0gTlVMOworCisgICAgZm9yIChpID0gMDsgaSA8IE5TTkRFWENFUFQ7IGkrKykgeworICAgICAgICBpZiAoc25kZXhjZXB0W2ldKQorICAgICAgICAgIGZyZWUoc25kZXhjZXB0W2ldKTsKKyAgICAgICAgc25kZXhjZXB0W2ldID0gTlVMTDsKKyAgICAgICAgaWYgKHJjdmV4Y2VwdFtpXSkKKyAgICAgICAgICBmcmVlKHJjdmV4Y2VwdFtpXSk7CisgICAgICAgIHJjdmV4Y2VwdFtpXSA9IE5VTEw7CisgICAgfQorICAgIHNuZGxhcmdlciA9ICAtMUw7CisgICAgc25kc21hbGxlciA9IC0xTDsKKyNpZmRlZiBHRlRJTUVSCisgICAgZ3R2ID0gLTEuMDsKKyAgICBvbGRndHYgPSAtMS4wOworI2Vsc2UKKyAgICBndHYgPSAtMUw7CisgICAgb2xkZ3R2ID0gLTFMOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCitjaGFyICoKK3R0Z3RwbigpIHsJCQkJLyogR2V0IHR5cGljYWwgcG9ydCBuYW1lICovCisvKgorICBJZGVhbGx5IHRoaXMgcm91dGluZSB3b3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBlYWNoIG9mIHRoZSBja3U/aW8uKiBtb2R1bGVzLAorICBidXQgdGhhdCByZXF1aXJlcyBjaGFuZ2luZyB0aGUgQVBJIGRlZmluaXRpb24uCisqLworICAgIHJldHVybigKKyNpZmRlZiBPUzIKKyNpZmRlZiBPUzJPTkxZCisiQ09NMSIKKyNlbHNlICAvKiBPUzJPTkxZICovCisiVEFQSSBbIG5hbWUgXSBvciBDT00xIgorI2VuZGlmIC8qIE9TMk9OTFkgKi8KKyNlbHNlICAvKiBPUzIgKi8KKyNpZmRlZiBWTVMKKyJUWEEwOiwgVFRBMDosIG9yIExUQTA6IgorI2Vsc2UgIC8qIFZNUyAqLworI2lmZGVmIFNPTEFSSVMKKyIvZGV2L2N1YS9hIgorI2Vsc2UgIC8qIFNPTEFSSVMgKi8KKyNpZmRlZiBIUFVYMTAKKyIvZGV2L2N1YTBwMCIKKyNlbHNlICAvKiBIUFVYMTAgKi8KKyNpZmRlZiBIUFVYCisiL2Rldi9jdWEwMCIKKyNlbHNlICAvKiBIUFVYICovCisjaWZkZWYgX19GcmVlQlNEX18KKyIvZGV2L2N1YWEwIgorI2Vsc2UgIC8qIF9fRnJlZUJTRF9fICovCisjaWZkZWYgX19saW51eF9fCisiL2Rldi90dHlTMCIKKyNlbHNlICAvKiBfX2xpbnV4X18gKi8KKyNpZmRlZiBCU0Q0NAorIi9kZXYvdHR5MDAiCisjZWxzZSAgLyogQlNENDQgKi8KKyNpZmRlZiBPU0sKKyIvdDEiCisjZWxzZSAgLyogT1NLICovCisjaWZkZWYgUU5YCisiL2Rldi9zZXIxIgorI2Vsc2UgIC8qIFFOWCAqLworI2lmZGVmIFFOWDYKKyIvZGV2L3NlcjEiCisjZWxzZSAgLyogUU5YNiAqLworI2lmZGVmIFVOSVhXQVJFCisiL2Rldi90ZXJtLzAwIG9yIC9kZXYvdHR5MDAiCisjZWxzZSAgLyogVU5JWFdBUkUgKi8KKyNpZmRlZiBDS19TQ09WNQorIi9kZXYvdHR5MUEiCisjZWxzZSAgLyogQ0tfU0NPVjUgKi8KKyNpZmRlZiBDS19TQ08zMlY0CisiL2Rldi90dHkxQSIKKyNlbHNlICAvKiBDS19TQ08zMlY0ICovCisjaWZkZWYgTV9YRU5JWAorIi9kZXYvdHR5MUEiCisjZWxzZSAgLyogTV9YRU5JWCAqLworI2lmZGVmIEFJWFJTCisiL2Rldi90dHkwIgorI2Vsc2UgIC8qIEFJWFJTICovCisjaWZkZWYgREdVWAorIi9kZXYvdHR5MDAiCisjZWxzZSAgLyogREdVWCAqLworI2lmZGVmIGRhdGFnZW5lcmFsCisiQGNvbjEiCisjZWxzZSAgLyogZGF0YWdlbmVyYWwgKi8KKyNpZmRlZiBJUklYCisiL2Rldi90dHltMCIKKyNlbHNlICAvKiBJUklYICovCisjaWZkZWYgU1VOT1M0CisiL2Rldi90dHloMCIKKyNlbHNlICAvKiBTVU5PUzQgKi8KKyNpZmRlZiBTVjY4UjNWNgorIi9kZXYvc2NjMCIKKyNlbHNlICAvKiBTVjY4UjNWNiAqLworI2lmZGVmIE1PVFNWODhSNAorIi9kZXYvY29udHR5MDAiCisjZWxzZSAgLyogTU9UU1Y4OFI0ICovCisjaWZkZWYgTkVYVAorIi9kZXYvY3VmYSIKKyNlbHNlCisjaWZkZWYgT1NGCisiL2Rldi90dHlkMSIKKyNlbHNlCisjaWZkZWYgU0lOSVgKKyIvZGV2L3R0eWMxIgorI2Vsc2UKKyNpZmRlZiBVTklYCisiL2Rldi9jdWEsIC9kZXYvYWN1LCAvZGV2L3R0eTAsIGV0YyIKKyNlbHNlICAvKiBVTklYICovCisiKHNvcnJ5IG5vIGV4YW1wbGUgYXZhaWxhYmxlKSIKKyNlbmRpZiAvKiBVTklYICovCisjZW5kaWYgLyogU0lOSVggKi8KKyNlbmRpZiAvKiBPU0YgKi8KKyNlbmRpZiAvKiBORVhUICovCisjZW5kaWYgLyogTU9UU1Y4OFI0ICovCisjZW5kaWYgLyogU1Y2OFIzVjYgKi8KKyNlbmRpZiAvKiBTVU5PUzQgKi8KKyNlbmRpZiAvKiBJUklYICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKyNlbmRpZiAvKiBER1VYICovCisjZW5kaWYgLyogQUlYICovCisjZW5kaWYgLyogTV9YRU5JWCAqLworI2VuZGlmIC8qIENLX1NDTzMyVjQgKi8KKyNlbmRpZiAvKiBDS19TQ09WNSAqLworI2VuZGlmIC8qIFVOSVhXQVJFICovCisjZW5kaWYgLyogUU5YNiAqLworI2VuZGlmIC8qIFFOWCAqLworI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisjZW5kaWYgLyogX19saW51eF9fICovCisjZW5kaWYgLyogX19GcmVlQlNEX18gKi8KKyNlbmRpZiAvKiBIUFVYICovCisjZW5kaWYgLyogSFBVWDEwICovCisjZW5kaWYgLyogU09MQVJJUyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworCSAgICk7Cit9CisKKy8qICBDIEsgXyBFIFIgUiBTIFQgUiAgLS0gIFJldHVybiBtZXNzYWdlIGZyb20gbW9zdCByZWNlbnQgc3lzdGVtIGVycm9yICovCisKKyNpZmRlZiBDS1JPT1QKK2V4dGVybiBpbnQgY2tyb290ZXJyOworI2VuZGlmIC8qIENLUk9PVCAqLworCitjaGFyICoKK2NrX2VycnN0cigpIHsKKyNpZmRlZiBVU0VfU1RSRVJST1IKKyNpZm5kZWYgQ0tfQU5TSUxJQlMKKyAgICAvKiBTaG91bGQgaGF2ZSBiZWVuIGRlY2xhcmVkIGluIDxzdHJpbmcuaD4gKi8KK19QUk9UT1RZUCggY2hhciAqIHN0cmVycm9yLCAoaW50KSApOworI2VuZGlmIC8qIENLX0FOU0lMSUJTICovCisjaWZkZWYgQ0tST09UCisgICAgaWYgKGNrcm9vdGVycikKKyAgICAgIHJldHVybigiT2ZmIGxpbWl0cyIpOworI2VuZGlmIC8qIENLUk9PVCAqLworICAgIHJldHVybihzdHJlcnJvcihlcnJubykpOworI2Vsc2UgIC8qICFVU0VfU1RSRVJST1IgKi8KKyNpZmRlZiBWTVMKKyAgICBleHRlcm4gY2hhciAqIGNrdm1zZXJyc3RyKHVuc2lnbmVkIGxvbmcpOworI2lmZGVmIENLUk9PVAorICAgIGlmIChja3Jvb3RlcnIpCisgICAgICByZXR1cm4oIk9mZiBsaW1pdHMiKTsKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKyAgICByZXR1cm4oY2t2bXNlcnJzdHIoMEwpKTsKKyNlbHNlICAvKiAhVk1TICovCisjaWZkZWYgQlNENDQKKyNpZmRlZiBfXzM4NkJTRF9fCisjaWZuZGVmIE5EU1lTRVJSTElTVAorICAgIGV4dGVybiBpbnQgc3lzX25lcnI7CisgICAgZXh0ZXJuIGNoYXIgKnN5c19lcnJsaXN0W107CisjZW5kaWYgLyogTkRTWVNFUlJMSVNUICovCisjZWxzZSAgLyogIV9fMzg2QlNEX18gKi8KKyNpZm5kZWYgX19ic2RpX18KKyNpZm5kZWYgTkRTWVNFUlJMSVNUCisgICAgZXh0ZXJuIGludCBzeXNfbmVycjsKKyAgICBleHRlcm4gY29uc3QgY2hhciAqY29uc3Qgc3lzX2Vycmxpc3RbXTsKKyNlbmRpZiAvKiBORFNZU0VSUkxJU1QgKi8KKyNlbmRpZiAvKiBfX2JzZGlfXyAqLworI2VuZGlmIC8qIF9fMzg2QlNEX18gKi8KKyNpZmRlZiBDS1JPT1QKKyAgICBpZiAoY2tyb290ZXJyKQorICAgICAgcmV0dXJuKCJPZmYgbGltaXRzIik7CisgICAgZWxzZQorI2VuZGlmIC8qIENLUk9PVCAqLworICAgIGlmIChlcnJubyA+PSBzeXNfbmVycikKKyAgICAgIHJldHVybigiRXJyb3IgbnVtYmVyIG91dCBvZiByYW5nZSIpOworICAgIGVsc2UKKyAgICAgIHJldHVybigoY2hhciAqKSBzeXNfZXJybGlzdFtlcnJub10pOworI2Vsc2UgLyogIUJTRDQ0ICovCisjaWZkZWYgQVRUU1YKKyNpZm5kZWYgTkRTWVNFUlJMSVNUCisgICAgZXh0ZXJuIGludCBzeXNfbmVycjsKKyAgICBleHRlcm4gY2hhciAqc3lzX2Vycmxpc3RbXTsKKyNlbmRpZiAvKiBORFNZU0VSUkxJU1QgKi8KKyNpZmRlZiBDS1JPT1QKKyAgICBpZiAoY2tyb290ZXJyKQorICAgICAgcmV0dXJuKCJPZmYgbGltaXRzIik7CisgICAgZWxzZQorI2VuZGlmIC8qIENLUk9PVCAqLworICAgIGlmIChlcnJubyA+PSBzeXNfbmVycikKKyAgICAgIHJldHVybigiRXJyb3IgbnVtYmVyIG91dCBvZiByYW5nZSIpOworICAgIGVsc2UKKyAgICAgIHJldHVybigoY2hhciAqKSBzeXNfZXJybGlzdFtlcnJub10pOworI2Vsc2UgLyogIUFUVFNWICovCisjaWZkZWYgQlNENAorI2lmbmRlZiBORFNZU0VSUkxJU1QKKyAgICBleHRlcm4gaW50IHN5c19uZXJyOworICAgIGV4dGVybiBjaGFyICpzeXNfZXJybGlzdFtdOworI2VuZGlmIC8qIE5EU1lTRVJSTElTVCAqLworI2lmZGVmIENLUk9PVAorICAgIGlmIChja3Jvb3RlcnIpCisgICAgICByZXR1cm4oIk9mZiBsaW1pdHMiKTsKKyAgICBlbHNlCisjZW5kaWYgLyogQ0tST09UICovCisgICAgaWYgKGVycm5vID49IHN5c19uZXJyKQorICAgICAgcmV0dXJuKCJFcnJvciBudW1iZXIgb3V0IG9mIHJhbmdlIik7CisgICAgZWxzZQorICAgICAgcmV0dXJuKChjaGFyICopIHN5c19lcnJsaXN0W2Vycm5vXSk7CisjZWxzZQorI2lmZGVmIE9TMgorI2lmbmRlZiBORFNZU0VSUkxJU1QKKyAgICBleHRlcm4gY2hhciAqc3lzX2Vycmxpc3RbXTsKKyNlbmRpZiAvKiBORFNZU0VSUkxJU1QgKi8KKyNpZmRlZiBOVAorICAgIGV4dGVybiBpbnRfc3lzX25lcnI7CisjZW5kaWYgLyogTlQgKi8KKyAgICBjaGFyICplOworI2lmZGVmIENLUk9PVAorICAgIGlmIChja3Jvb3RlcnIpCisgICAgICByZXR1cm4oIk9mZiBsaW1pdHMiKTsKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKyAgICBlID0gKGVycm5vID4gLTEKKyNpZmRlZiBOVAorICAgICAgICAgJiYgZXJybm8gPD0gX3N5c19uZXJyCisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICkgPworI2lmZGVmIE5UCisgICAgICAgICAoY2hhciAqKSBzeXNfZXJybGlzdFtlcnJub10KKyNlbHNlIC8qIE5UICovCisgICAgICAgICAvKiBJIGRvbid0IGtub3cgaG93IHRvIGdldCBhIENMSUIgZXJyb3Igc3RyaW5nIGluIE9TLzIgKi8KKyAgICAgICAgIHN0cmVycm9yKGVycm5vKQorI2VuZGlmIC8qIE5UICovCisgICAgICAgICAgICAgOiAiIjsKKyAgICByZXR1cm4oZSA/IGUgOiAiIik7CisjZWxzZSAvKiBPUzIgKi8KKyAgICByZXR1cm4oIiIpOworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIEJTRDQgKi8KKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogVVNFX1NUUkVSUk9SICovCit9CisKKyNpZmRlZiBQQVRURVJOUworLyoKKyAgRmlsZW5hbWUgcGF0dGVybiByZWNvZ25pdGlvbiBsaXN0cyBmb3IgYXV0b21hdGljIHRleHQvYmluYXJ5IHN3aXRjaGluZy4KKyAgVGhlc2UgYXJlIHNvbWV3aGF0IHBhc3NlIGFmdGVyIHRoZSBhZGRpdGlvbiBvZiBzY2FuZmlsZSgpICAoNy4wKS4KKyAgQnV0IHdpdGggdGhlIGFkZGl0aW9uIG9mIEZUUCBbTV1HRVQsIHRoZXkncmUgYmFjayBpbiBzdHlsZSAoOC4wKS4KKworICBBbHRob3VnaCwgd2l0aCBGVFAgdGhlIGxpc3RzIG5lZWQgdG8gYmUgdXNlZCBpbiB0aGUgcmV2ZXJzZS4gIFdpdGgKKyAgS2VybWl0IHRoZSBsaXN0IGlzIHVzZWQgdG8gaW1wbHkgdGhlIHR5cGVzIG9mIHRoZSBsb2NhbCBzeXN0ZW0uICBXaGVyZWFzCisgIHdpdGggRlRQLCB0aGUgbGlzdCBtdXN0IGJlIHVzZWQgdG8gaW1wbHkgdGhlIHR5cGUgb2YgdGhlIHJlbW90ZSBzeXN0ZW0uCisgIFRoZXJlZm9yZSwgYWxsIHBsYXRmb3JtcyBtdXN0IG5vdyBzdXBwb3J0IGFsbCBvZiB0aGUgbGlzdHMuCisqLworY2hhciAqdHh0cGF0dGVybnNbRlRQQVRURVJOUysxXSA9IHsgTlVMTCwgTlVMTCB9OworY2hhciAqYmlucGF0dGVybnNbRlRQQVRURVJOUysxXSA9IHsgTlVMTCwgTlVMTCB9OworLyoKKyAgRGVmYXVsdCBwYXR0ZXJuIGxpc3RzIGZvciBlYWNoIHBsYXRmb3JtLi4uCisKKyAgTk9URTogSW4gbW9zdCBjYXNlcyB3ZSBsZWF2ZSAiLmhscCIsICIuaW5pIiwgYW5kICIuc2NyIiBhbG9uZTsgYWx0aG91Z2ggdGhleQorICBhcmUgdHJhZGl0aW9uYWxseSB0ZXh0IHR5cGVzLCB0aGV5IGFyZSBiaW5hcnkgaW4gV2luZG93cy4gIFNvIHRoZXkgYXJlCisgIGhhbmRsZWQgYnkgdGhlIHByZXZhaWxpbmcgU0VUIEZJTEUgVFlQRSwgcmF0aGVyIHRoYW4gYXV0b21hdGljYWxseS4KKyAgU2ltaWxhcmx5IGZvciAiLmRhdCIsICIuaW5mIiwgYW5kIHNvIG9uLiAgQWxzbyAiLnBzIiBzaW5jZSBQb3N0U2NyaXB0IGZpbGVzCisgIGFyZSBub3QgYWx3YXlzIHRleHQuICAiLmxvZyIgaXMgb21pdHRlZCBzaW5jZSBsb2dzIGNhbiBiZSB0ZXh0IG9yIGJpbmFyeSwKKyAgZXhjZXB0IGluIFZNUyB0aGV5IGFyZSB1c3VhbGx5IHRleHQsIGV0YyBldGMuCisKKyAgTGF0ZXIgKFNlcCAyMDAzKTogQWRkIFBvc3RTY3JpcHQgdG8gYmluYXJ5IHBhdHRlcm5zLgorKi8KK3N0YXRpYyBjaGFyICp0eHRwW1NZU19NQVhdW0ZUUEFUVEVSTlNdID0geworICAgIC8qIFVOS05PV04gKi8geworCU5VTEwsIE5VTEwKKyAgICB9LAorICAgIHsJCQkJCS8qIFVOSVggKi8KKyAgICAiKi50eHQiLCIqLmMiLCIqLmgiLCIqLnIiLCIqLnciLCIqLmNwcCIsIiouY2MiLCIqLmtzYyIsIiouYndyIiwiKi51cGQiLAorICAgICIqLmh0bWwiLCIqLmh0bSIsIioubXNzIiwiKi50ZXgiLCIqLm5yIiwiW01tXWFrZWZpbGUiLCAiKi5oZXgiLCAiKi5ocXgiLAorICAgICIqLmZvciIsIiouZjc3IiwiKi5mIiwiKi5GIiwiKi5zIiwiKi5wYXMiLCIqLmphdmEiLCIqLmVsIiwiKi5saXNwIiwiKi5zaCIsCisgICAgIioubTQiLCIqLnBlcmwiLCIqLnBsIiwiKi5wb2QiLCIqLnBtIiwiKi5hd2siLCIqLnNubyIsIiouc3B0IiwiKi5zZWQiLAorICAgICIqLmtzYyIsIiouVFhUIiwgIipyZWFkLm1lIiwgIipSRUFELk1FIiwgIi4qIiwgIiovLioiLCAiKi5tZW0iLCIqLm1hYyIsCisgICAgTlVMTAorICAgIH0sCisgICAgewkJCQkJLyogV0lOMzIgKi8KKyAgICAiKi50eHQiLCIqLmtzYyIsIiouaHRtIiwiKi5odG1sIiwiKi5iYXQiLCIqLmNtZCIsIiouamF2IiwiKi5hc20iLCAiKi5oZXgiLAorICAgICIqLmhxeCIsICIqLmMiLCAiKi5oIiwgIiouY3BwIiwgIiouaHBwIiwgIiouY3h4IiwgIiouY3h4IiwgIioudyIsCisgICAgIiouamF2YSIsICIqLmJ3ciIsICIqLnVwZCIsICIqLm1hayIsICJyZWFkLm1lIiwgIioubWFwIiwgIm1ha2VmaWxlIiwKKyAgICAiKi5tZW0iLCIqLm1hYyIsIiouY2MiLCIqLnBsIiwiKi5wb2QiLCIqLnBtIiwiKi5tNCIsTlVMTAorICAgIH0sCisgICAgewkJCQkJLyogVk1TICovCisgICAgIiouY29tIiwiKi50eHQiLCIqLmMiLCAgIiouZm9yIiwiKi5wYXMiLCIqLnJubyIsIioucm5oIiwiKi5tYXIiLCIqLmJsaSIsCisgICAgIiouaGxwIiwiKi5tc3MiLCIqLmRvYyIsIiouYndyIiwiKi5jbGQiLCIqLmhleCIsIiouYmFzIiwiKi5pbmkiLCIqLmxvZyIsCisgICAgIioubW1zIiwiKi5vcHQiLCIqLmtzYyIsIioucGVybCIsIioucGwiLCIqLnBvZCIsIioucG0iLCIqLnNubyIsIiouc3B0IiwKKyAgICAiKi5tZW0iLE5VTEwKKyAgICB9LAorICAgIHsJCQkJCS8qIE9TMiAqLworICAgICIqLnR4dCIsIioua3NjIiwiKi5odG0iLCIqLmh0bWwiLCIqLmJhdCIsIiouY21kIiwiKi5qYXYiLCIqLmFzbSIsICIqLmhleCIsCisgICAgIiouaHF4IiwgIiouYyIsICIqLmgiLCAiKi5jcHAiLCAiKi5ocHAiLCAiKi5jeHgiLCAiKi5jeHgiLCAiKi53IiwKKyAgICAiKi5qYXZhIiwgIiouYndyIiwgIioudXBkIiwgIioubWFrIiwgInJlYWQubWUiLCAiKi5tYXAiLCAibWFrZWZpbGUiLAorICAgIE5VTEwKKyAgICB9LAorICAgIHsJCQkJCS8qIERPUyAqLworICAgICIqLnR4dCIsIioua3NjIiwiKi5odG0iLCIqLmJhdCIsIiouY21kIiwiKi5qYXYiLCIqLmFzbSIsICIqLmhleCIsCisgICAgIiouaHF4IiwgIiouYyIsICIqLmgiLCAiKi5jcHAiLCAiKi5ocHAiLCAiKi5jeHgiLCAiKi5jeHgiLCAiKi53IiwKKyAgICAiKi5id3IiLCAiKi51cGQiLCAiKi5tYWsiLCAicmVhZC5tZSIsICIqLm1hcCIsICJtYWtlZmlsZSIsIE5VTEwKKyAgICB9LAorICAgIHsJCQkJCS8qIFRPUFMtMTAgKi8KKyAgICAiKi5jbWQiLCIqLmhscCIsIiouZG9jIiwiKi5pbmkiLCIqLnR4dCIsIioubWFjIiwiKi5mb3IiLCIqLnNhaSIsIiouYmxpIiwKKyAgICAiKi5wYXMiLCIqLnNubyIsIiouc3B0IiwiKi5wY2wiLCIqLm1zcyIsIioucm5vIiwiKi5iMzYiLCIqLnRleCIsIioucHViIiwKKyAgICAiKi5yZXEiLCIqLnIzNiIsIioubWVtIiwiKi5id3IiLCIqLmNjbCIsIiouY3RsIiwiKi5ybmgiLCIqLmtzYyIsTlVMTAorICAgIH0sCisgICAgewkJCQkJLyogVE9QUy0yMCAqLworICAgICIqLmNtZCIsIiouaGxwIiwiKi5kb2MiLCIqLmluaSIsIioudHh0IiwiKi5tYWMiLCIqLmZvciIsIiouc2FpIiwiKi5ibGkiLAorICAgICIqLnBhcyIsIiouc25vIiwiKi5zcHQiLCIqLnBjbCIsIioubXNzIiwiKi5ybm8iLCIqLmIzNiIsIioudGV4IiwiKi5wdWIiLAorICAgICIqLnJlcSIsIioucjM2IiwiKi5tZW0iLCIqLmJ3ciIsIiouY2NsIiwiKi5jdGwiLCIqLnJuaCIsIioua3NjIixOVUxMCisgICAgfSwKKyAgICB7CQkJCQkvKiBTVFJBVFVTIFZPUyAqLworICAgICIqLnR4dCIsIioua3NjIiwiKi5odG0iLCIqLmh0bWwiLCIqLmJhdCIsICIqLmNtZCIsIiouamF2IiwiKi5hc20iLCIqLmhleCIsCisgICAgIiouaHF4IiwiKi5jIiwgICIqLmgiLCAgIioudyIsICAgIiouamF2YSIsIiouYndyIiwiKi51cGQiLCIqLnR0cCIsIiouY20iLAorICAgICIqLnBsMSIsIiouZW1hY3MiLCAicmVhZC5tZSIsICIqLnBsIiwgIm1ha2VmaWxlIiwgTlVMTAorICAgIH0sCisgICAgewkJCQkJLyogREcgQU9TL1ZTICovCisgICAgIioudHh0IiwgIiouYyIsICIqLmgiLCAiKi53IiwgIiouZXIiLCAiKi5id3IiLCAiKi51cGQiLCAicmVhZC5tZSIsCisgICAgIiouY2xpIiwgIioua3NjIiwgTlVMTAorICAgIH0sCisgICAgewkJCQkJLyogT1NLICovCisgICAgIiouYyIsIiouY3BwIiwiKi5oIiwiKi5hIiwiKmFrZWZpbGUiLCAvKiBwcm9ncmFtIHNvdXJjZXMgKi8KKyAgICAiKi5mb3IiLCIqLmY3NyIsIiouZiIsIiouRiIsIioucyIsIioucGFzIiwiKi5qYXZhIiwiKi5lbCIsIioubGlzcCIsCisgICAgIiouc2giLCIqLnBlcmwiLCIqLmF3ayIsIiouc25vIiwiKi5zcHQiLCIqLnNlZCIsCisgICAgIioudHh0IiwiKi53IiwJCQkvKiBnZW5lcmFsIHRleHQgKi8KKyAgICAiKi5rc2MiLCIqLmJ3ciIsIioudXBkIiwKKyAgICAiKi5odG1sIiwiKi5odG0iLCIqLm1zcyIsIioudGV4IiwiKi5uciIsIiouaGV4IiwgIiouaHF4IiwKKyAgICAiKi5UWFQiLCAiKnJlYWQubWUiLCAiKlJFQUQuTUUiLCAiLioiLCAiKi8uKiIsCisgICAgTlVMTAorICAgIH0KK307CisKKy8qIE5vdGU6IC5ET0MgYWRkZWQgdG8gKHNvbWUpIGJpbmFyeSBwYXR0ZXJucyBKdW5lIDE5OTguLi4gTWljcm9zb2Z0IHdpbnMuICovCisKK3N0YXRpYyBjaGFyICpiaW5wW1NZU19NQVhdW0ZUUEFUVEVSTlNdID0geworICAgIHsJCQkJCS8qIFVOS05PV04gKi8KKyAgICBOVUxMLCBOVUxMCisgICAgfSwKKyAgICB7CQkJCQkvKiBVTklYICovCisgICAgIiouZ3oiLCIqLloiLCIqLnRneiIsIiouZ2lmIiwgIioudGFyIiwiKi56aXAiLCIqLm8iLCIqLnNvIiwiKi5hIiwiKi5vdXQiLAorICAgICIqLmV4ZSIsICIqLmpwZyIsICIqLmpwZWciLCAiKi50aWYiLCIqLnRpZmYiLCAiKi5wZGYiLCAiKi5zby4qIiwgIiouY2xhc3MiLAorICAgICIqLnJwbSIsICIqLmJtcCIsICIqLmJ6MiIsICIqLkJNUCIsICIqLmRsbCIsICIqLmRvYyIsICIqLnZ4ZCIsICIqLmRjeCIsCisgICAgIioueGwqIiwgIioubHpoIiwgIioubGh6IiwgIiouYXUiLCAiKi52b2MiLCAiKi5tcGciLCAiKi5tcGVnIiwiW3drXWVybWl0IiwKKyAgICAiKi5wcyIsIE5VTEwKKyAgICB9LAorICAgIHsJCQkJCS8qIFdJTjMyICovCisgICAgIiouZXhlIiwgIiouemlwIiwgIioub2JqIiwgIiouY29tIiwgIiouZ2lmIiwgIiouanBnIiwgIioud2F2IiwgIioucmFtIiwKKyAgICAiKi5jbGFzcyIsIiouY2xhIiwiKi5kbGwiLCAiKi5kcnYiLCAiKi5vY3giLCAiKi52YngiLCAiKi5saWIiLCAiKi5pY28iLAorICAgICIqLmJtcCIsICIqLnRpZiIsICIqLnRhciIsICIqLmd6IiwgICIqLnRneiIsICIqLnhsKiIsICIqLmRvYyIsICIqLnZ4ZCIsCisgICAgIioucGRmIiwgIioubHpoIiwgIioudnhkIiwgIiouc25kIiwgIiouYXUiLCAiKiAudm9jIiwgIioubXBnIiwgIioubXBlZyIsCisgICAgIioucHMiLCBOVUxMCisgICAgfSwKKyAgICB7CQkJCQkvKiBWTVMgKi8KKyAgICAiKi5leGUiLCIqLm9iaiIsIiouYmFrIiwiKi5iaW4iLCIqLmFkZiIsIiouc3RiIiwiKi5tYWkiLCIqLnN5cyIsIiouZG1wIiwKKyAgICAiKi5wcyIsICIqLmRhdCIsIioucGFyIiwgTlVMTAorICAgIH0sCisgICAgewkJCQkJLyogT1MyICovCisgICAgIiouZXhlIiwgIiouemlwIiwgIioub2JqIiwgIiouY29tIiwgIiouZ2lmIiwgIiouanBnIiwgIioud2F2IiwgIioucmFtIiwKKyAgICAiKi5jbGFzcyIsICIqLmNsYSIsICIqLmRsbCIsICIqLmRydiIsICIqLm9jeCIsICIqLnZieCIsICIqLmxpYiIsICIqLmljbyIsCisgICAgIiouYm1wIiwgIioudGlmIiwgIioudGFyIiwgIiouZ3oiLCAiKi50Z3oiLCAiKi54bCoiLCAiKi5kb2MiLCAiKi52eGQiLAorICAgICIqLnBkZiIsICIqLnBzIiwgIioubHpoIiwgTlVMTAorICAgIH0sCisgICAgewkJCQkJLyogRE9TICovCisgICAgIiouZXhlIiwgIiouemlwIiwgIioub2JqIiwgIiouY29tIiwgIiouZ2lmIiwgIiouanBnIiwgIioud2F2IiwgIioucmFtIiwKKyAgICAiKi5jbGEiLCAiKi5kbGwiLCAiKi5kcnYiLCAiKi5vY3giLCAiKi52YngiLCAiKi5saWIiLCAiKi5pY28iLAorICAgICIqLmJtcCIsICIqLnRpZiIsICIqLnRhciIsICIqLmd6IiwgIioudGd6IiwgIioueGwqIiwgIiouZG9jIiwgIioudnhkIiwKKyAgICAiKi5wZGYiLCAiKi5wcyIsICIqLmx6aCIsIE5VTEwKKyAgICB9LAorICAgIHsJCQkJCS8qIFRPUFMxMCAqLworICAgICIqLmV4ZSIsIiouc2F2IiwiKi5iaW4iLCIqLnJpbSIsIioucmVsIiwiKi51bnYiLCIqLmxpYiIsIioudGFwIiwiKi5kdmkiLAorICAgICIqLnBzIiwgTlVMTAorICAgIH0sCisgICAgewkJCQkJLyogVE9QUzIwICovCisgICAgIiouZXhlIiwiKi5zYXYiLCIqLmJpbiIsIioucmltIiwiKi5yZWwiLCIqLnVudiIsIioubGliIiwiKi50YXAiLCIqLmR2aSIsCisgICAgIioucHMiLCBOVUxMCisgICAgfSwKKyAgICB7CQkJCQkvKiBTVFJBVFVTIFZPUyAqLworICAgICIqLmV4ZSIsICIqLnppcCIsICIqLm9iaiIsICIqLmNvbSIsICIqLmdpZiIsICIqLmpwZyIsICIqLndhdiIsICIqLnJhbSIsCisgICAgIiouY2xhc3MiLCAiKi5jbGEiLCAiKi5kbGwiLCAiKi5kcnYiLCAiKi5vY3giLCAiKi52YngiLCAiKi5saWIiLCAiKi5pY28iLAorICAgICIqLmJtcCIsICIqLnRpZiIsICIqLnRhciIsICIqLmd6IiwgIioudGd6IiwgIioueGwqIiwgIiouZG9jIiwgIioudnhkIiwKKyAgICAiKi5wZGYiLCAiKi5wcyIsICIqLmx6aCIsICIqLnBtIiwgTlVMTAorICAgIH0sCisgICAgewkJCQkJLyogREcgKi8KKyAgICAiKi5vYiIsICIqLnByIiwgIiouZG1wIiwgIioucHMiLCBOVUxMCisgICAgfSwKKyAgICB7IC8qIE9TSyAqLworICAgICIqLmd6IiwiKi5aIiwiKi56IiwiKi50Z3oiLCIqLmxoeiIsIioudGFyIiwJLyogYXJjaGl2ZXJzICovCisgICAgIiouemlwIiwiKi5hciIsIiouem9vIiwiKi5ycG0iLCIqLmx6aCIsCisgICAgLyogb2JqZWN0IGZpbGVzLCBsaWJyYXJpZXMsIGV4ZWN1dGFibGVzICovCisgICAgIiouciIsIioubCIsIiouZXhlIiwgIiouZGxsIiwgIiouc28uKiIsICIqLmNsYXNzIiwKKyAgICAvKiBpbWFnZXMgKi8KKyAgICAiKi5naWYiLCAiKi5qcGciLCAiKi5qcGVnIiwgIioudGlmIiwiKi50aWZmIiwgIioucGRmIiwgIioucHMiLAorICAgICIqLmJtcCIsICIqLmJ6MiIsICIqLkJNUCIsIioucGN4IiwKKyAgICBOVUxMCisgICAgfQorfTsKKworLyoKKyAgU2V0IHVwIGRlZmF1bHQgcGF0dGVybiBsaXN0cyBzbyB0aGV5IGNhbiBiZSBmcmVlZCBhbmQgcmUtbWFsbG9jJ2QuCisgIEVhY2ggcGF0dGVybiBsaXN0IG11c3QgdGVybWluYXRlZCBieSBhIG51bGwgZWxlbWVudC4KKyovCitWT0lECitpbml0cGF0KCkgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBGVFBBVFRFUk5TOyBpKyspIHsKKyAgICAgICAgdHh0cGF0dGVybnNbaV0gPSBOVUxMOworICAgICAgICBiaW5wYXR0ZXJuc1tpXSA9IE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBGVFBBVFRFUk5TOyBpKyspIHsKKyNpZmRlZiBVTklYCisgICAgICAgIG1ha2VzdHIoJih0eHRwYXR0ZXJuc1tpXSksdHh0cFtTWVNfVU5JWF1baV0pOworI2Vsc2UgLyogVU5JWCAqLworI2lmZGVmIE9TMgorI2lmZGVmIE5UCisgICAgICAgIG1ha2VzdHIoJih0eHRwYXR0ZXJuc1tpXSksdHh0cFtTWVNfV0lOMzJdW2ldKTsKKyNlbHNlIC8qIE5UICovCisgICAgICAgIG1ha2VzdHIoJih0eHRwYXR0ZXJuc1tpXSksdHh0cFtTWVNfT1MyXVtpXSk7CisjZW5kaWYgLyogTlQgKi8KKyNlbHNlIC8qIE9TMiAqLworI2lmZGVmIFZNUworICAgICAgICBtYWtlc3RyKCYodHh0cGF0dGVybnNbaV0pLHR4dHBbU1lTX1ZNU11baV0pOworI2Vsc2UgLyogVk1TICovCisjaWZkZWYgU1RSQVRVUworICAgICAgICBtYWtlc3RyKCYodHh0cGF0dGVybnNbaV0pLHR4dHBbU1lTX1ZPU11baV0pOworI2Vsc2UgLyogU1RSQVRVUyAqLworI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgICAgIG1ha2VzdHIoJih0eHRwYXR0ZXJuc1tpXSksdHh0cFtTWVNfREddW2ldKTsKKyNlbHNlIC8qIGRhdGFnZW5lcmFsICovCisjaWZkZWYgT1NLCisgICAgICAgIG1ha2VzdHIoJih0eHRwYXR0ZXJuc1tpXSksdHh0cFtTWVNfT1NLXVtpXSk7CisjZWxzZSAvKiBPU0sgKi8KKyAgICAgICAgbWFrZXN0cigmKHR4dHBhdHRlcm5zW2ldKSx0eHRwW1NZU19VTktdW2ldKTsKKyNlbmRpZiAvKiBPU0sgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBVTklYICovCisgICAgICAgIGlmICghdHh0cFtpXSkKKyAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IEZUUEFUVEVSTlM7IGkrKykgeworI2lmZGVmIFVOSVgKKyAgICAgICAgbWFrZXN0cigmKGJpbnBhdHRlcm5zW2ldKSxiaW5wW1NZU19VTklYXVtpXSk7CisjZWxzZSAvKiBVTklYICovCisjaWZkZWYgT1MyCisjaWZkZWYgTlQKKyAgICAgICAgbWFrZXN0cigmKGJpbnBhdHRlcm5zW2ldKSxiaW5wW1NZU19XSU4zMl1baV0pOworI2Vsc2UgLyogTlQgKi8KKyAgICAgICAgbWFrZXN0cigmKGJpbnBhdHRlcm5zW2ldKSxiaW5wW1NZU19PUzJdW2ldKTsKKyNlbmRpZiAvKiBOVCAqLworI2Vsc2UgLyogT1MyICovCisjaWZkZWYgVk1TCisgICAgICAgIG1ha2VzdHIoJihiaW5wYXR0ZXJuc1tpXSksYmlucFtTWVNfVk1TXVtpXSk7CisjZWxzZSAvKiBWTVMgKi8KKyNpZmRlZiBTVFJBVFVTCisgICAgICAgIG1ha2VzdHIoJihiaW5wYXR0ZXJuc1tpXSksYmlucFtTWVNfVk9TXVtpXSk7CisjZWxzZSAvKiBTVFJBVFVTICovCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICAgICAgbWFrZXN0cigmKGJpbnBhdHRlcm5zW2ldKSxiaW5wW1NZU19ER11baV0pOworI2Vsc2UgLyogZGF0YWdlbmVyYWwgKi8KKyNpZmRlZiBPU0sKKyAgICAgICAgbWFrZXN0cigmKGJpbnBhdHRlcm5zW2ldKSxiaW5wW1NZU19PU0tdW2ldKTsKKyNlbHNlIC8qIE9TSyAqLworICAgICAgICBtYWtlc3RyKCYoYmlucGF0dGVybnNbaV0pLGJpbnBbU1lTX1VOS11baV0pOworI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIFZNUyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFVOSVggKi8KKyAgICAgICAgaWYgKCFiaW5wW2ldKQorICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoKKyAgbSBhIHQgYyBoIG4gYSBtIGUgIC0tICBDb21wYXJlIGZpbGVuYW1lIHdpdGggdGV4dCAmIGJpbmFyeSBuYW1lIHBhdHRlcm5zLgorCisgIFJldHVybnM6CisgICAgMCBpZiBuYW1lIG1hdGNoZXMgYSB0ZXh0IHBhdHRlcm4gYnV0IG5vdCBhIGJpbmFyeSBwYXR0ZXJuLgorICAgIDEgaWYgbmFtZSBtYXRjaGVzIGEgYmluYXJ5IHBhdHRlcm4gYnV0IG5vdCBhIHRleHQgcGF0dGVybi4KKyAgIC0xIGlmIG5hbWUgbWF0Y2hlcyBubyBwYXR0ZXJucy4KKyAgIC0yIGlmIG5hbWUgbWF0Y2hlcyBhIGJpbmFyeSBwYXR0ZXJuIGFuZCBhIHRleHQgcGF0dGVybi4KKyovCitpbnQKK21hdGNobmFtZShmaWxlbmFtZSwgbG9jYWwsIG9zKSBjaGFyICogZmlsZW5hbWU7IGludCBsb2NhbDsgaW50IG9zOyB7CisgICAgaW50IHJjID0gLTE7CQkJLyogUmV0dXJuIGNvZGUgKi8KKyAgICBjaGFyICogbmFtZSwgKiBwOworI2lmZGVmIE9TMk9SVU5JWAorICAgIGNoYXIgdG1wYnVmW0NLTUFYUEFUSCsxXTsKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKworICAgIG5hbWUgPSBmaWxlbmFtZSA/IGZpbGVuYW1lIDogIiI7CS8qIENvcHkgb2Ygb3JpZ2luYWwgYXJnICovCisgICAgaWYgKHBhdHRlcm5zICYmICpuYW1lKSB7CQkvKiBJZiBQQVRURVJOUyBPTi4uLiAqLworCWludCBpOworCisjaWZkZWYgT1MyT1JVTklYCisJaWYgKGNrbWF0Y2goIiouflsxLTldKn4iLG5hbWUsMSwxKSkgeyAvKiBOYW1lIGhhcyBiYWNrdXAgc3VmZml4PyAqLworCSAgICBpbnQgazsKKwkgICAgayA9IGNrc3RybmNweSh0bXBidWYsbmFtZSxDS01BWFBBVEgrMSk7IC8qIFllcywgY29weSBhbmQgc3RyaXAgKi8KKwkgICAgZm9yIChpID0gayAtIDM7IGkgPiA0OyBpLS0pIHsKKwkJaWYgKHRtcGJ1ZltpXSA9PSAnficgJiYgdG1wYnVmW2ktMV0gPT0gJy4nKSB7CisJCSAgICB0bXBidWZbaS0xXSA9IE5VTDsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwkgICAgbmFtZSA9IHRtcGJ1ZjsJCS8qIEFuZCBwb2ludCB0byBzdHJpcHBlZCBjb3B5ICovCisJfQorI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworCXpzdHJpcChuYW1lLCZwKTsJCS8qIFN0cmlwIHBhdGhuYW1lIHRvbyAqLworCW5hbWUgPSBwOworCisgICAgICAgIGlmIChsb2NhbCkgeworICAgICAgICAgICAgaWYgKHR4dHBhdHRlcm5zWzBdKSB7CS8qIFNlYXJjaCB0ZXh0IHBhdHRlcm5zICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEZUUEFUVEVSTlMgJiYgdHh0cGF0dGVybnNbaV07IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2ttYXRjaCh0eHRwYXR0ZXJuc1tpXSxuYW1lLGZpbGVjYXNlLDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiaW5wYXR0ZXJuc1swXSkgewkvKiBBbmQgc2VhcmNoIGJpbmFyeSBwYXR0ZXJucyAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGVFBBVFRFUk5TICYmIGJpbnBhdHRlcm5zW2ldOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNrbWF0Y2goYmlucGF0dGVybnNbaV0sbmFtZSxmaWxlY2FzZSwxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAocmMgPiAtMSkgPyAtMiA6IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwl9IGVsc2UgeworICAgICAgICAgICAgaWYgKG9zID49IDAgJiYgb3MgPCBTWVNfTUFYKSB7CisJCWlmICh0eHRwW29zXVswXSkgeworCQkgICAgZm9yIChpID0gMDsgaSA8IEZUUEFUVEVSTlMgJiYgdHh0cFtvc11baV07IGkrKykgeworCQkJaWYgKGNrbWF0Y2godHh0cFtvc11baV0sbmFtZSxmaWxlY2FzZSwxKSkgeworCQkJICAgIHJjID0gMDsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJfQorCQlpZiAoYmlucFtvc11bMF0pIHsKKwkJICAgIGZvciAoaSA9IDA7IGkgPCBGVFBBVFRFUk5TICYmIGJpbnBbb3NdW2ldOyBpKyspIHsKKwkJCWlmIChja21hdGNoKGJpbnBbb3NdW2ldLG5hbWUsZmlsZWNhc2UsMSkpIHsKKwkJCSAgICByYyA9IChyYyA+IC0xKSA/IC0yIDogMTsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZGVidWcoRjExMSwibWF0Y2huYW1lIixuYW1lLHJjKTsKKyAgICByZXR1cm4ocmMpOworfQorI2VuZGlmIC8qIFBBVFRFUk5TICovCisKKyNpZmRlZiBVTklDT0RFCisjaWZuZGVmIE5PRVZFTk1BWAorI2RlZmluZSBFVkVOTUFYCisjZW5kaWYgLyogTk9FVkVOTUFYICovCisjZW5kaWYgLyogVU5JQ09ERSAqLworCisvKiAgUyBDIEEgTiBGIEkgTCBFICAtLSAgQW5hbHl6ZSBhIGZpbGUncyBjb250ZW50cyAgKi8KKworLyoKKyAgQ2FsbCB3aXRoOgorICAgIG5hbWU6ICAgIFBvaW50ZXIgdG8gbmFtZSBvZiBleGlzdGluZyBmaWxlLgorICAgIGZsYWc6ICAgIFBvaW50ZXIgdG8gaW50IGluIHdoaWNoIHRvIHJldHVybiBhZGRpdGlvbmFsIG51bWVyaWMgZGF0YS4KKworICBSZXR1cm5zOgorICAgIC0xIG9uIGZhaWx1cmUgKHRvIG9wZW4gZmlsZSBvciB0byByZWFkIGZyb20gaXQpLgorICAgIEludGVnZXIsIDAuLjQsIG9uIHN1Y2Nlc3MgaW5kaWNhdGluZyBmaWxlIHR5cGU6CisgICAgIDAgPSA3LWJpdCB0ZXh0IChmbGFnID0gLTEpCisgICAgIDEgPSBVVEYtOCB0ZXh0IChmbGFnID0gLTEpCisgICAgIDIgPSBVQ1MtMiB0ZXh0IChmbGFnID0gIDA6IGJpZy1lbmRpYW47IGZsYWcgPSAxOiBsaXR0bGUtZW5kaWFuKQorICAgICAzID0gOC1iaXQgdGV4dCAoZmxhZyA9ICAwOiBubyBDMSBieXRlczsgZmxhZyA9IDE6IGluY2x1ZGVzIEMxIGJ5dGVzKQorICAgICA0ID0gYmluYXJ5ICAgICAoZmxhZyA9IC0xKQorCisgIElmIFVOSUNPREUgaXMgZGVmaW5lZDoKKworICAgMS4gSWYgZmlsZSBiZWdpbnMgd2l0aCBhIHZhbGlkIEJPTSwgaXQgaXMgYmVsaWV2ZWQuICBPdGhlcndpc2Ugd2UKKyAgICAgIHJlYWQgdGhlIGZpcnN0IDRLIG9mIHRoZSBmaWxlIChzaW5jZSBpdCBtaWdodCBiZSBlbWFpbCB3aXRoIHZlcmJvc2UKKyAgICAgIGhlYWRlcnMpIGFuZCBhbmFseXplIGl0OgorCisgICAyLiBJZiBmaWxlIGNvbnRhaW5zIG9ubHkgdmFsaWQgVVRGLTggc2VxdWVuY2VzLCB3ZSBjYWxsIGl0IFVURi04OworICAgICAgb3RoZXJ3aXNlOgorCisgICAzLiBJZiB0aGUgZmlsZSBjb250YWlucyBsb3RzIG9mIGFsdGVybmF0ZSAwIGJ5dGVzLCB3ZSBjYWxsIGl0IFVDUy0yLCBhbmQKKyAgICAgIHNldCB0aGUgcG9sYXJpdHkgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIHByZXBvbmRlcmFuY2Ugb2YgdGhlbSBhcmUgaW4KKyAgICAgIGV2ZW4gb3Igb2RkIHBvc2l0aW9uczsgb3RoZXJ3aXNlOgorCisgICA0LiBJZiBFVkVOTUFYIGlzIGRlZmluZWQgYW5kIHRoZSBmaWxlIGNvbnRhaW5zIGxvdHMgb2YgYWx0ZXJuYXRlIGJ5dGVzIHRoYXQKKyAgICAgIGFyZSBpZGVudGljYWwsIGV2ZW4gaWYgdGhleSBhcmVuJ3QgemVybywgYW5kIHRoZSBudW1iZXIgb2Ygc3VjaCBieXRlcworICAgICAgaXMgYXQgbGVhc3QgZm91ciB0aW1lcyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXhpbXVtIHJ1biBvZiBhbHRlcm5hdGluZworICAgICAgaWRlbnRpY2FsIGJ5dGVzIG9mIHRoZSBvcHBvc2l0ZSBwb2xhcml0eSwgd2UgY2FsbCBpdCBVQ1MtMjsgb3RoZXJ3aXNlOgorCisgICA1LiBJZiB0aGUgZmlsZSBjb250YWluZWQgbm8gYnl0ZXMgd2l0aCB0aGVpciA4dGggYml0cyBvbiBhbmQgbm8gY29udHJvbHMKKyAgICAgIG90aGVyIHRoYW4gQ1IsIExGLCBIVCwgYW5kIEZGLCB3ZSBjYWxsIGl0IEFTQ0lJOyBvdGhlcndpc2U6CisKKyAgIDYuIElmIGl0IGNvbnRhaW5zIEMwIGNvbnRyb2wgY2hhcmFjdGVycyBvdGhlciB0aGFuIENSLCBMRiwgSFQsIGFuZCBGRiwgd2UKKyAgICAgIGNhbGwgaXQgYmluYXJ5OyBvdGhlcndpc2U6CisKKyAgIDcuIFdlIGNhbGwgaXQgOC1iaXQgdGV4dCwgY2hhcmFjdGVyIHNldCB1bmtub3duIChjb3VsZCBiZSBMYXRpbi0xIG9yCisgICAgICBhbnl0aGluZyBlbHNlKS4KKworICAgTm90ZSB0aGF0IG1hbGZvcm1lZCBVVEYtOCBpcyBub3QgZGlhZ25vc2VkIGFzIFVURi04LgorCisgICBJZiBVTklDT0RFIGlzIG5vdCBkZWZpbmVkOgorCisgICAxLiBJZiB0aGUgZmlsZSBjb250YWlucyBDMCBjb250cm9sIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBDUiwgTEYsIEhULCBhbmQKKyAgICAgIEZGLCB3ZSBjYWxsIGl0IGJpbmFyeTsgb3RoZXJ3aXNlOgorCisgICAyLiBJZiB0aGUgZmlsZSBjb250YWlucyBhbnkgOC1iaXQgYnl0ZXMsIHdlIGNhbGwgaXQgOC1iaXQgdGV4dDsgb3RoZXJ3aXNlOgorCisgICAzLiBXZSBjYWxsIGl0IDctYml0IHRleHQuCisKKyAgIEluIHRoZSBub24tVW5pY29kZSBjYXNlLCBVQ1MtMiBpcyBkaWFnbm9zZWQgYXMgYmluYXJ5LCBidXQgVVRGLTggYXMKKyAgIDgtYml0IHRleHQuCisKKyAgIFRoZXJlIGlzIG5vIHNpZ25pZmljYW50IHNwZWVkIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgVW5pY29kZSBhbmQKKyAgIG5vbi1Vbmljb2RlIGNhc2VzLgorKi8KK2ludAorc2NhbmZpbGUobmFtZSxmbGFnLG5zY2FuZmlsZSkgY2hhciAqIG5hbWU7IGludCAqIGZsYWcsIG5zY2FuZmlsZTsgeworICAgIEZJTEUgKiBmcDsJCQkJLyogRmlsZSBwb2ludGVyICovCisgICAgdW5zaWduZWQgY2hhciBidWZbU0NBTkZJTEVCVUZdOwkvKiBGaWxlIGRhdGEgYnVmZmVyIGZvciBhbmFseXNpcyAqLworICAgIGludCB4LCB2YWwgPSAtMSwgY291bnQgPSAwOwkJLyogV29ya2VycyAqLworICAgIGludCByYyA9IC0xOwkJCS8qIFJldHVybiBjb2RlICovCisgICAgaW50IHB2ID0gLTE7CQkJLyogUGF0dGVybi1tYXRjaCB2YWx1ZSAqLworICAgIGludCBlb2YgPSAwOwkJCS8qIEZsYWcgZm9yIGZpbGUgRU9GIGVuY291bnRlcmVkICovCisgICAgaW50IGJ5dGVzID0gMDsJCQkvKiBUb3RhbCBieXRlIGNvdW50ICovCisjaWZkZWYgVU5JQ09ERQorICAgIHVuc2lnbmVkIGludCBjMCwgYzE7CQkvKiBGaXJzdCAyIGZpbGUgYnl0ZXMgKGZvciBCT00pICovCisjZW5kaWYgLyogVU5JQ09ERSAqLworICAgIGV4dGVybiBpbnQgcGlwZXNlbmQsIGZpbGVwZWVrOworCisgICAgcmVnaXN0ZXIgaW50IGk7CQkJLyogTG9vcCBjb250cm9sICovCisgICAgaW50IHJlYWRzaXplID0gMDsJCQkvKiBIb3cgbXVjaCB0byByZWFkICovCisgICAgaW50IGVpZ2h0Yml0ID0gMDsJCQkvKiBOdW1iZXIgb2YgYnl0ZXMgd2l0aCA4dGggYml0IG9uICovCisgICAgaW50IGMwY29udHJvbHMgPSAwOwkJCS8qIEMwIG5vbi10ZXh0IGNvbnRyb2wtY2hhciBjb3VudGVyICovCisgICAgaW50IGMwbm9uaXNvID0gMDsJCQkvKiBDMCBub24tSVNPIGNvbnRyb2wtY2hhciBjb3VudGVyICovCisgICAgaW50IGMxY29udHJvbHMgPSAwOwkJCS8qIEMxIGNvbnRyb2wtY2hhcmFjdGVyIGNvdW50ZXIgKi8KKyAgICB1bnNpZ25lZCBpbnQgYzsJCQkvKiBDdXJyZW50IGNoYXJhY3RlciAqLworICAgIGludCBydW5tYXggPSAwOwkJCS8qIExvbmdlc3QgcnVuIG9mIDAgYnl0ZXMgKi8KKyAgICBpbnQgcnVuemVybyA9IDA7CQkJLyogUnVuIG9mIDAgYnl0ZXMgKi8KKyAgICBpbnQgcGN0emVybyA9IDA7CQkJLyogUGVyY2VudGFnZSBvZiAwIGJ5dGVzICovCisgICAgaW50IHR4dGN6ID0gMDsKKyNpZmRlZiBDS19DVFJMWgorICAgIGV4dGVybiBpbnQgZW9mbWV0aG9kOworI2VuZGlmIC8qIENLX0NUUkxaICovCisKKyNpZmRlZiBVTklDT0RFCisgICAgaW50IG5vdHV0ZjggPSAwOwkJCS8qIE5vbnplcm8gaWYgZGVmaW5pdGVseSBub3QgVVRGLTggKi8KKyAgICBpbnQgdXRmOHN0YXRlID0gMDsJCQkvKiBVVEYtOCByZWNvZ25pemVyIHN0YXRlICovCisgICAgaW50IG9kZHplcm8gPSAwOwkJCS8qIE51bWJlciBvZiAwIGJ5dGVzIGluIG9kZCBwb3N0aW9ucyAqLworICAgIGludCBldmVuemVybyA9IDA7CQkJLyogYW5kIGluIGV2ZW4gcG9zaXRpb25zICovCisgICAgaW50IGxmbnVsID0gMDsJCQkvKiBOdW1iZXIgb2YgPExGPjxOVUw+IHNlcXVlbmNlcyAqLworICAgIGludCBjcmxmID0gMDsJCQkvKiBOdW1iZXIgb2YgPENSTEY+IHNlcXVlbmNlcyAqLworI2Vsc2UKKyAgICBpbnQgbm90dXRmOCA9IDE7CisjZW5kaWYgLyogVU5JQ09ERSAqLworCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIEVWRU5NQVgKKyAgICBpbnQgb2RkcnVuID0gMCwgb2RkbWF4ID0gMCwgb2RkYnl0ZSA9IDAsIG9kZG1heGJ5dGUgPSAwOworICAgIGludCBldmVucnVuID0gMCwgZXZlbm1heCA9IDAsIGV2ZW5ieXRlID0gMCwgZXZlbm1heGJ5dGUgPSAwOworI2VuZGlmIC8qIEVWRU5NQVggKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZm5kZWYgTk9YRkVSCisgICAgaWYgKHBpcGVzZW5kIHx8IGNhbGlicmF0ZSB8fCBzbmRhcnJheSkgLyogT25seSBmb3IgcmVhbCBmaWxlcyAqLworICAgICAgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICBkZWJ1ZyhGMTExLCJzY2FuZmlsZSIsbmFtZSxuc2NhbmZpbGUpOworI2lmZGVmIFBBVFRFUk5TCisgICAgaWYgKCFmaWxlcGVlaykgeworCXB2ID0gbWF0Y2huYW1lKG5hbWUsMSwtMSk7CisJaWYgKHB2IDwgMCkKKwkgIHJjID0gLTE7CisJZWxzZQorCSAgcmMgPSAocHYgPT0gMSkgPyBGVF9CSU4gOiBGVF9URVhUOworCWRlYnVnKEYxMTEsInNjYW5maWxlICFmaWxlcGVlayByZXN1bHQiLG5hbWUscmMpOworCXJldHVybihyYyk7CisgICAgfQorI2VuZGlmIC8qIFBBVFRFUk5TICovCisKKyNpZmRlZiBWTVMKKy8qIFdlIGRvbid0IHNjYW4gaW4gVk1TIHdoZXJlIHRleHQgZmlsZXMgaGF2ZSB2YXJpb3VzIHJlY29yZCBmb3JtYXRzIGluICAqLworLyogd2hpY2ggcmVjb3JkIGhlYWRlcnMgY29udGFpbiBzZWVtaW5nbHkgbm9uLXRleHQgYnl0ZXMuICBTbyB0aGUgYmVzdCAgICovCisvKiB3ZSBjYW4gZG8gaW4gVk1TIGlzIHRlbGwgd2hldGhlciB0aGUgZmlsZSBpcyB0ZXh0IG9yIGJpbmFyeSwgcGVyaW9kLiAgKi8KKyAgICB7CisJaW50IGIsIHg7CisJYiA9IGJpbmFyeTsJCQkvKiBTYXZlIGN1cnJlbnQgYmluYXJ5IHNldHRpbmcgKi8KKwlpZiAoem9wZW5pKFpJRklMRSxuYW1lKSA+IDApIHsJLyogSW4gVk1TIHRoaXMgc2V0cyBiaW5hcnkgKi8KKwkgICAgeCA9IGJpbmFyeTsJCQkvKiBHZXQgcmVzdWx0ICovCisJICAgIHpjbG9zZShaSUZJTEUpOwkJLyogQ2xvc2UgdGhlIGZpbGUgKi8KKwkgICAgYmluYXJ5ID0gYjsJCQkvKiBSZXN0b3JlIHByZXZpb3VzIGJpbmFyeSBzZXR0aW5nICovCisJICAgIHJjID0geCA/IEZUX0JJTiA6IEZUX1RFWFQ7CisJICAgIHZhbCA9IDA7CisJICAgIGdvdG8geHNjYW5maWxlOworCX0KKyAgICB9CisjZW5kaWYgLyogVk1TICovCisKKyAgICBlb2YgPSAwOwkJCQkvKiBFbmQtb2YtZmlsZSByZWFjaGVkIGluZGljYXRvciAqLworI2lmZGVmIE9TMgorICAgIGZwID0gZm9wZW4obmFtZSwgInJiIik7CQkvKiBPcGVuIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlICovCisjZWxzZQorICAgIGZwID0gZm9wZW4obmFtZSwgInIiKTsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIGlmICghZnApCQkJCS8qIEZhaWxlZD8gKi8KKyAgICAgIHJldHVybigtMSk7CisKKyAgICB3aGlsZSAoMSkgewkJCQkvKiBPbmUgb3IgbW9yZSBndWxwcyBmcm9tIGZpbGUgKi8KKwlpZiAoZW9mKSB7CQkJLyogRU9GIGZyb20gbGFzdCB0aW1lPyAqLworCSAgICBkZWJ1ZyhGMTExLCJzY2FuZmlsZSBhdCBFT0YiLG5hbWUsYnl0ZXMpOworCSAgICBpZiAocnVuemVybyA+IHJ1bm1heCkKKwkgICAgICBydW5tYXggPSBydW56ZXJvOworCSAgICBicmVhazsKKwl9CisJaWYgKG5zY2FuZmlsZSA8IDApIHsJCS8qIFJlYWRpbmcgd2hvbGUgZmlsZSAqLworCSAgICByZWFkc2l6ZSA9IFNDQU5GSUxFQlVGOworCX0gZWxzZSB7CQkJLyogUmVhZGluZyBmaXJzdCBuc2NhbmZpbGVlIGJ5dGVzICovCisJICAgIHJlYWRzaXplID0gbnNjYW5maWxlIC0gYnl0ZXM7CisJICAgIGlmIChyZWFkc2l6ZSA8IDEpCisJICAgICAgYnJlYWs7CisJICAgIGlmIChyZWFkc2l6ZSA+IFNDQU5GSUxFQlVGKQorCSAgICAgIHJlYWRzaXplID0gU0NBTkZJTEVCVUY7CisJfQorCWRlYnVnKEYxMDEsInNjYW5maWxlIHJlYWRzaXplIiwiIixyZWFkc2l6ZSk7CisJY291bnQgPSBmcmVhZChidWYsMSxyZWFkc2l6ZSxmcCk7IC8qIFJlYWQgYSBidWZmZXIgKi8KKwlpZiAoY291bnQgPT0gRU9GIHx8IGNvdW50ID09IDApIHsKKwkgICAgZGVidWcoRjExMSwic2NhbmZpbGUgRU9GIixuYW1lLGNvdW50KTsKKwkgICAgYnJlYWs7CisJfQorCWRlYnVnKEYxMTEsInNjYW5maWxlIGJ1ZmZlciBvayIsbmFtZSxjb3VudCk7CisKKwlpZiAoYnl0ZXMgPT0gMCAmJiBjb3VudCA+IDgpIHsKKwkgICAgLyogUERGIGZpbGVzIGNhbiBsb29rIGxpa2UgdGV4dCBpbiB0aGUgYmVnaW5uaW5nLiAqLworCSAgICBpZiAoIWNrc3RyY21wKChjaGFyICopYnVmLCIlUERGLTEuIiw3LDEpKSB7CisJCWlmIChpc2RpZ2l0KGJ1Zls3XSkpIHsKKwkJICAgIGlmIChidWZbOF0gPT0gJ1wwMTUnIHx8CisJCQljb3VudCA+IDkgJiYgYnVmWzhdID09IFNQICYmIGJ1Zls5XSA9PSAnXDAxNScpIHsKKyNpZmRlZiBERUJVRworCQkJYnVmWzhdID0gTlVMOworCQkJZGVidWcoRjExMCwic2NhbmZpbGUgUERGIixidWYsMCk7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCWJpbmFyeSA9IDE7CS8qIEJ1dCB0aGV5IGFyZSBiaW5hcnkuICovCisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2UgaWYgKCFja3N0cmNtcCgoY2hhciAqKWJ1ZiwiJSFQUy1BZG8iLDgsMSkpIHsKKwkJLyogRGl0dG8gZm9yIFBvc3RTY3JpcHQgKi8KKyNpZmRlZiBERUJVRworCQlpbnQgaTsKKwkJZm9yIChpID0gODsgaSA8IGNvdW50OyBpKyspIHsKKwkJICAgIGlmIChidWZbaV0gPCAnIScpIHsKKwkJCWJ1ZltpXSA9IE5VTDsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJCWRlYnVnKEYxMTAsInNjYW5maWxlIFBvc3RTY3JpcHQiLGJ1ZiwwKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQliaW5hcnkgPSAxOworCQlicmVhazsKKyNpZm5kZWYgTk9QQ0xTQ0FOCisJICAgIH0gZWxzZSBpZiAoIWNrc3RyY21wKChjaGFyICopYnVmLCIpIEhQLVBDTCIsOCwxKSkgeworCQkvKiBIUCBQQ0wgcHJpbnRlciBsYW5ndWFnZSAqLworI2lmZGVmIERFQlVHCisJCWludCBpOworCQlmb3IgKGkgPSA4OyBpIDwgY291bnQ7IGkrKykgeworCQkgICAgaWYgKGJ1ZltpXSA8ICchJykgeworCQkJYnVmW2ldID0gTlVMOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkJZGVidWcoRjExMCwic2NhbmZpbGUgUENMIixidWYsMCk7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJYmluYXJ5ID0gMTsKKwkJYnJlYWs7CisJICAgIH0gCisjZW5kaWYgLyogTk9QQ0xTQ0FOICovCisjaWZuZGVmIE5PUEpMU0NBTgorCSAgICAgIGVsc2UgaWYgKGJ1ZlswXSA9PSAnXDAzMycgJiYgKGJ1ZlsxXSA9PSAnRScgfHwgYnVmWzFdID09ICclJykpIHsKKwkJLyogRGl0dG8gZm9yIFBKTCBKb2IgcHJpbnRlciBoZWFkZXIgKi8KKyNpZmRlZiBERUJVRworCQlpbnQgaTsKKwkJZm9yIChpID0gMjsgaSA8IGNvdW50OyBpKyspIHsKKwkJICAgIGlmIChidWZbaV0gPCAnIScpIHsKKwkJCWJ1ZltpXSA9IE5VTDsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJCWRlYnVnKEYxMTAsInNjYW5maWxlIFBKTCBKb2IgcHJpbnRlciBoZWFkZXIiLGJ1ZiwwKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQliaW5hcnkgPSAxOworCQlicmVhazsKKyNlbmRpZiAvKiBOT1BKTFNDQU4gKi8KKwkgICAgfQorCX0KKworI2lmZGVmIFVOSUNPREUKKwlpZiAoYnl0ZXMgPT0gMCAmJiBjb3VudCA+IDEpIHsKKwkgICAgaW50IGluY2xfY250ID0gMDsKKworCSAgICAvKiBGaXJzdCBsb29rIGZvciBCT00gKi8KKworCSAgICBjMCA9ICh1bnNpZ25lZCkoKHVuc2lnbmVkKWJ1ZlswXSYweEZGKTsgLyogRmlyc3QgZmlsZSBieXRlICovCisJICAgIGMxID0gKHVuc2lnbmVkKSgodW5zaWduZWQpYnVmWzFdJjB4RkYpOyAvKiBTZWNvbmQgYnl0ZSAqLworCisJICAgIGlmIChjMCA9PSAweEZFICYmIGMxID09IDB4RkYpIHsJLyogVUNTLTIgQkUgKi8KKwkJcmMgPSBGVF9VQ1MyOworCQl2YWwgPSAwOworCQlkZWJ1ZyhGMTExLCJzY2FuZmlsZSBVQ1MyIEJPTSBCRSIsY2tpdG9hKHZhbCkscmMpOworCQlpbmNsX2NudCsrOworCSAgICB9IGVsc2UgaWYgKGMwID09IDB4RkYgJiYgYzEgPT0gMHhGRSkgeyAvKiBVQ1MtMiBMRSAqLworCQlyYyA9IEZUX1VDUzI7CisJCXZhbCA9IDE7CisJCWRlYnVnKEYxMTEsInNjYW5maWxlIFVDUzIgQk9NIExFIixja2l0b2EodmFsKSxyYyk7CisJCWluY2xfY250Kys7CisJICAgIH0gZWxzZSBpZiAoY291bnQgPiAyKSBpZiAoYzAgPT0gMHhFRiAmJiBjMSA9PSAweEJCICYmCisJCSAgICAgICAodW5zaWduZWQpKCh1bnNpZ25lZClidWZbMl0mMHhGRikgPT0gMHhCRikgeworCQlyYyA9IEZUX1VURjg7CisJCWRlYnVnKEYxMTEsInNjYW5maWxlIFVURjggQk9NIixja2l0b2EodmFsKSxyYyk7CisJCWluY2xfY250Kys7CisJICAgIH0KKwkgICAgaWYgKGluY2xfY250KSB7CQkvKiBIYXZlIEJPTSAqLworCQlieXRlcyArPSBjb3VudDsKKwkJZ290byB4c2NhbmZpbGU7CisJICAgIH0KKwl9CisjZW5kaWYgLyogVU5JQ09ERSAqLworCisJYnl0ZXMgKz0gY291bnQ7CQkJLyogQ291bnQgYnl0ZXMgcmVhZCAqLworCWVvZiA9IGZlb2YoZnApOwkJCS8qIEZsYWcgZm9yIGF0IEVPRiAgKi8KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CS8qIEZvciBlYWNoIGJ5dGUuLi4gKi8KKwkgICAgYyA9ICh1bnNpZ25lZClidWZbaV07CS8qIEZvciBlYXNlIG9mIHJlZmVyZW5jZSAqLworCSAgICBpZiAoIWMpIHsJCQkvKiBaZXJvIGJ5dGU/ICovCisjaWZkZWYgRVZFTk1BWAorCQlpZiAoaSYxKQkJLyogSW4gb2RkIHBvc2l0aW9uICovCisJCSAgb2RkemVybysrOworCQllbHNlCisJCSAgZXZlbnplcm8rKzsJCS8qIEluIGV2ZW4gcG9zaXRpb24gKi8KKyNlbmRpZiAvKiBFVkVOTUFYICovCisJCXJ1bnplcm8rKzsKKwkgICAgfSBlbHNlIHsJCQkvKiBOb3QgYSB6ZXJvIGJ5dGUgKi8KKwkJaWYgKHJ1bnplcm8gPiBydW5tYXgpCisJCSAgcnVubWF4ID0gcnVuemVybzsKKwkJaWYgKHJ1bm1heCA+IDIpCQkvKiBUaGF0J3MgYWxsIHdlIG5lZWQgdG8gYmUgY2VydGFpbiAqLworCQkgIGJyZWFrOwkJLyogaXQncyBhIGJpbmFyeSBmaWxlLiAqLworCQlydW56ZXJvID0gMDsKKwkgICAgfQorCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIEVWRU5NQVgKKworLyogVGhpcyBpcyB0byBjYXRjaCBVQ1MtMiB3aXRoIGEgbm9uLUFTQ0lJLCBub24tTGF0aW4tMSByZXBlcnRvaXJlICAqLworCisJICAgIGlmIChpID4gMSkgewkgICAgICAvKiBMb29rIGZvciBydW5zIG9mIGFsdGVybmF0aW5nIGNoYXJzICovCisJCWlmIChpJjEpIHsKKwkJICAgIGlmIChjID09IGJ1ZltpLTJdKSB7IC8qIEluIG9kZCBwb3NpdGlvbnMgKi8KKwkJCW9kZHJ1bisrOworCQkJb2RkYnl0ZSA9IGM7CisJCSAgICB9IGVsc2UgeworCQkJb2RkbWF4ID0gb2RkcnVuOworCQkJb2RkbWF4Ynl0ZSA9IG9kZGJ5dGU7CisJCSAgICB9CisJCX0gZWxzZSB7CQkvKiBhbmQgZXZlbiBwb3NpdGlvbnMgKi8KKwkJICAgIGlmIChjID09IGJ1ZltpLTJdKSB7CisJCQlldmVucnVuKys7CisJCQlldmVuYnl0ZSA9IGM7CisJCSAgICB9IGVsc2UgeworCQkJZXZlbm1heCA9IGV2ZW5ydW47CisJCQlldmVubWF4Ynl0ZSA9IGV2ZW5ieXRlOworCQkgICAgfQorCQl9CisJICAgIH0KKyNlbmRpZiAvKiBFVkVOTUFYICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisJICAgIGlmICgoYyAmIDB4ODApID09IDApIHsJLyogV2UgaGF2ZSBhIDctYml0IGJ5dGUgKi8KKyNpZmRlZiBVTklDT0RFCisJCWlmIChpID4gMCAmJiBjID09IDEwKSB7IC8qIExpbmVmZWVkICovCisJCSAgICBpZiAoYnVmW2ktMV0gPT0gMCkgbGZudWwrKzsgLyogUHJlY2VkZWQgYnkgTlVMICovCisJCSAgICBlbHNlIGlmIChidWZbaS0xXSA9PSAxMykgY3JsZisrOyAvKiBvciBieSBDUi4uLiAqLworCQl9CisjZW5kaWYgLyogVU5JQ09ERSAqLworCQlpZiAoYyA8ICcgJykgewkJLyogQ2hlY2sgZm9yIENPIGNvbnRyb2xzICovCisJCSAgICBpZiAoYyAhPSBMRiAmJiBjICE9IENSICYmIGMgIT0gSFQgJiYgYyAhPSBGRikgeworCQkJYzBjb250cm9scysrOworCQkJaWYgKGMgIT0gRVNDICYmIGMgIT0gU08gJiYgYyAhPSBTSSkKKwkJCSAgYzBub25pc28rKzsKKwkJICAgIH0KKwkJICAgIGlmICgoYyA9PSAnXDAzMicpCS8qIEN0cmwtWiAqLworI2lmZGVmIENPTU1FTlQKKwkJCSYmIGVvZiAmJiAoaSA+PSBjb3VudCAtIDIpCisjZW5kaWYgLyogQ09NTUVOVCAqLworCQkJKSB7CisJCQljMGNvbnRyb2xzLS07CisJCQljMG5vbmlzby0tOworI2lmZGVmIENLX0NUUkxaCisJCQlpZiAoZW9mbWV0aG9kID09IFhZRU9GX1ogJiYgdHh0Y3ogPT0gMCkgeworCQkJICAgIGlmIChjMGNvbnRyb2xzID09IDApIC8qIEFsbCB0ZXh0IHByaW9yIHRvIEN0cmwtWiAqLworCQkJICAgICAgdHh0Y3ogPSAxOworCQkJfQorI2VuZGlmIC8qIENLX0NUUkxaICovCisJCSAgICB9CisJCX0KKyNpZmRlZiBVTklDT0RFCisJCWlmICghbm90dXRmOCAmJiB1dGY4c3RhdGUpIHsgLyogSW4gVVRGLTggc2VxdWVuY2U/ICovCisJCSAgICB1dGY4c3RhdGUgPSAwOworCQkgICAgZGVidWcoRjAwMCwic2NhbmZpbGUiLCI3LWJpdCBieXRlIGluIFVURjggc2VxdWVuY2UiLGMpOworCQkgICAgbm90dXRmOCsrOwkJLyogVGhlbiBpdCdzIG5vdCBVVEYtOCAqLworCQkgICAgY29udGludWU7CisJCX0KKyNlbmRpZiAvKiBVTklDT0RFICovCisJICAgIH0gZWxzZSB7CQkJLyogV2UgaGF2ZSBhbiA4LWJpdCBieXRlICovCisJCWVpZ2h0Yml0Kys7CQkvKiBDb3VudCBpdCAqLworCQlpZiAoYyA+PSAweDgwICYmIGMgPCAweEEwKSAvKiBDaGVjayBmb3IgQzEgY29udHJvbHMgKi8KKwkJICBjMWNvbnRyb2xzKys7CisjaWZkZWYgVU5JQ09ERQorCQlpZiAoIW5vdHV0ZjgpIHsJCS8qIElmIGl0IG1pZ2h0IHN0aWxsIGJlIFVURjguLi4gKi8KKwkJICAgIHN3aXRjaCAodXRmOHN0YXRlKSB7IC8qIEVudGVyIHRoZSBVVEYtOCBzdGF0ZSBtYWNoaW5lICovCisJCSAgICAgIGNhc2UgMDoJCSAvKiBGaXJzdCBieXRlLi4uICovCisJCQlpZiAoKGMgJiAweEUwKSA9PSAweEMwKSB7IC8qIFRlbGxzIG51bWJlciBvZiAqLworCQkJICAgIHV0ZjhzdGF0ZSA9IDE7ICAgICAgICAvKiBzdWJzZXF1ZW50IGJ5dGVzICovCisJCQl9IGVsc2UgaWYgKChjICYgMHhGMCkgPT0gMHhFMCkgeworCQkJICAgIHV0ZjhzdGF0ZSA9IDI7CisJCQl9IGVsc2UgaWYgKChjICYgMHhGOCkgPT0gMHhGMCkgeworCQkJICAgIHV0ZjhzdGF0ZSA9IDM7CisJCQl9IGVsc2UgeworCQkJICAgIG5vdHV0ZjgrKzsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIDE6CQkvKiBTdWJzZXF1ZW50IGJ5dGUgKi8KKwkJICAgICAgY2FzZSAyOgorCQkgICAgICBjYXNlIDM6CisJCQlpZiAoKGMgJiAweEMwKSAhPSAweDgwKSB7IC8qIE11c3Qgc3RhcnQgd2l0aCAxMCAqLworCQkJICAgIGRlYnVnKEYwMDAsInNjYW5maWxlIiwKKwkJCQkgICJiYWQgYnl0ZSBpbiBVVEY4IHNlcXVlbmNlIixjKTsKKwkJCSAgICBub3R1dGY4Kys7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCQl1dGY4c3RhdGUtLTsJLyogR29vZCwgb25lIGxlc3MgaW4gdGhpcyBzZXF1ZW5jZSAqLworCQkJYnJlYWs7CisJCSAgICAgIGRlZmF1bHQ6CQkvKiBTaG91bGRuJ3QgaGFwcGVuICovCisJCQlkZWJ1ZyhGMTExLCJzY2FuZmlsZSIsImJhZCBVVEY4IHN0YXRlIix1dGY4c3RhdGUpOworCQkJbm90dXRmOCsrOworCQkgICAgfQorCQl9CisjZW5kaWYgLyogVU5JQ09ERSAqLworCSAgICB9CisJfQorICAgIH0KKyAgICBmY2xvc2UoZnApOwkJCQkvKiBDbG9zZSB0aGUgZmlsZSAqLworICAgIGRlYnVnKEYxMDEsInNjYW5maWxlIGJ5dGVzIiwiIixieXRlcyk7CisKKyAgICBpZiAoYnl0ZXMgPT0gMCkJCQkvKiBJZiBub3RoaW5nIHdhcyByZWFkICovCisgICAgICByZXR1cm4oLTEpOwkJCS8qIHdlJ3JlIGRvbmUuICovCisKKyNpZmRlZiBFVkVOTUFYCisgICAgLyogSW4gY2FzZSB3ZSBoYWQgYSBydW4gdGhhdCBuZXZlciBicm9rZS4uLiAqLworI2lmZGVmIENPTU1FTlQKKyAgICBpZiAob2RkbWF4ID09IDApIHsKKwlvZGRtYXggPSBvZGRydW47CisJb2RkbWF4Ynl0ZSA9IG9kZGJ5dGU7CisgICAgfQorICAgIGlmIChldmVubWF4ID09IDApIHsKKwlldmVubWF4ID0gZXZlbnJ1bjsKKwlldmVubWF4Ynl0ZSA9IGV2ZW5ieXRlOworICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgaWYgKHJ1bm1heCA9PSAwKSB7CisJcnVubWF4ID0gcnVuemVybzsKKyAgICB9CisjZW5kaWYgLyogRVZFTk1BWCAqLworCisjaWZkZWYgVU5JQ09ERQorICAgIGlmIChieXRlcyA+IDEwMCkJCQkvKiBCeXRlcyBpcyBub3QgMCAqLworICAgICAgcGN0emVybyA9IChldmVuemVybyArIG9kZHplcm8pIC8gKGJ5dGVzIC8gMTAwKTsKKyAgICBlbHNlCisgICAgICBwY3R6ZXJvID0gKChldmVuemVybyArIG9kZHplcm8pICogMTAwKSAvIGJ5dGVzOworI2VuZGlmIC8qIFVOSUNPREUgKi8KKworI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgewkJCS8qIElmIGRlYnVnZ2luZywgZHVtcCBzdGF0aXN0aWNzICovCisJZGVidWcoRjEwMSwic2NhbmZpbGUgYzBjb250cm9scyAiLCIiLGMwY29udHJvbHMpOworCWRlYnVnKEYxMDEsInNjYW5maWxlIGMwbm9uaXNvICAgIiwiIixjMG5vbmlzbyk7CisJZGVidWcoRjEwMSwic2NhbmZpbGUgYzFjb250cm9scyAiLCIiLGMxY29udHJvbHMpOworCWRlYnVnKEYxMDEsInNjYW5maWxlIGVpZ2h0Yml0ICAgIiwiIixlaWdodGJpdCk7CisjaWZkZWYgVU5JQ09ERQorCWRlYnVnKEYxMDEsInNjYW5maWxlIGNybGYgICAgICAgIiwiIixjcmxmKTsKKwlkZWJ1ZyhGMTAxLCJzY2FuZmlsZSBsZm51bCAgICAgICIsIiIsbGZudWwpOworCWRlYnVnKEYxMDEsInNjYW5maWxlIG5vdHV0ZjggICAgIiwiIixub3R1dGY4KTsKKwlkZWJ1ZyhGMTAxLCJzY2FuZmlsZSBldmVuemVybyAgICIsIiIsZXZlbnplcm8pOworCWRlYnVnKEYxMDEsInNjYW5maWxlIG9kZHplcm8gICAgIiwiIixvZGR6ZXJvKTsKKwlkZWJ1ZyhGMTAxLCJzY2FuZmlsZSBldmVuL29kZCAgICIsIiIsKGV2ZW56ZXJvIC8gKG9kZHplcm8gKyAxKSkpOworCWRlYnVnKEYxMDEsInNjYW5maWxlIG9kZC9ldmVuICAgIiwiIiwob2RkemVybyAvIChldmVuemVybyArIDEpKSk7CisJZGVidWcoRjEwMSwic2NhbmZpbGUgcGN0emVybyAgICAiLCIiLHBjdHplcm8pOworI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNpZmRlZiBDT01NRU5UCisjaWZkZWYgRVZFTk1BWAorCWRlYnVnKEYxMDEsInNjYW5maWxlIG9kZG1heCAgICAgIiwiIixvZGRtYXgpOworCWRlYnVnKEYxMDEsInNjYW5maWxlIG9kZG1heGJ5dGUgIiwiIixvZGRtYXhieXRlKTsKKwlkZWJ1ZyhGMTAxLCJzY2FuZmlsZSBldmVubWF4ICAgICIsIiIsZXZlbm1heCk7CisJZGVidWcoRjEwMSwic2NhbmZpbGUgZXZlbm1heGJ5dGUiLCIiLGV2ZW5tYXhieXRlKTsKKyNlbmRpZiAvKiBFVkVOTUFYICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCWRlYnVnKEYxMDEsInNjYW5maWxlIHJ1bm1heCAgICAgIiwiIixydW5tYXgpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgVU5JQ09ERQorICAgIHggPSBlaWdodGJpdCA/IGJ5dGVzIC8gMjAgOiBieXRlcyAvIDQ7IC8qIEZvciBVQ1MtMi4uLiAqLworCisgICAgaWYgKHJ1bm1heCA+IDIpIHsJCQkvKiBGaWxlIGhhcyBydW4gb2YgbW9yZSB0aGFuIDIgTlVMcyAqLworCWRlYnVnKEYxMDAsInNjYW5maWxlIEJJTiBydW5tYXgiLCIiLDApOworCXJjID0gRlRfQklOOwkJCS8qIHNvIGl0IGNhbid0IGJlIGFueSBraW5kIG9mIHRleHQuICovCisJZ290byB4c2NhbmZpbGU7CisKKyAgICB9IGVsc2UgaWYgKHJjID09IEZUX1VDUzIgfHwgKHJjID09IEZUX1VURjggJiYgcnVubWF4ID09IDApKSB7CisJZ290byB4c2NhbmZpbGU7CQkJLyogRmlsZSBzdGFydHMgd2l0aCBhIEJPTSAqLworCisgICAgfSBlbHNlIGlmIChlaWdodGJpdCA+IDAgJiYgIW5vdHV0ZjgpIHsgLyogRmlsZSBoYXMgOC1iaXQgZGF0YSAqLworCWlmIChydW5tYXggPiAwKSB7CQkgICAvKiBhbmQgcnVucyBvZiBOVUxzICovCisJICAgIGRlYnVnKEYxMDAsInNjYW5maWxlIEJJTiAobm5VVEY4KSBydW5tYXgiLCIiLDApOworCSAgICByYyA9IEZUX0JJTjsJCSAgIC8qIFVURi04IGRvZXNuJ3QgaGF2ZSBOVUxzICovCisJfSBlbHNlIHsJCQkgICAvKiBObyBOVUxzICovCisJICAgIGRlYnVnKEYxMDAsInNjYW5maWxlIFVURjggKG5uVVRGOCArIHJ1bm1heCA9PSAwKSIsIiIsMCk7CisJICAgIHJjID0gRlRfVVRGODsJCSAgIC8qIGFuZCBub3Qgbm90IFVURi04LCBzbyBpcyBVVEYtOCAqLworCX0KKwlnb3RvIHhzY2FuZmlsZTsKKyAgICB9CisvKgorICBGb3IgVUNTLTIgZGV0ZWN0aW9uLCBzZWUgaWYgdGhlIHRleHQgY29udGFpbnMgbGluZXMgZGVsaW1pdGVkIGJ5CisgIEFTQ0lJIGNvbnRyb2xzIGFuZCBjb250YWluaW5nIHNwYWNlcywgQVNDSUkgZGlnaXRzLCBvciBvdGhlciBBU0NJSQorICBjaGFyYWN0ZXJzLCB0aHVzIGZvcmNpbmcgdGhlIHByZXNlbmNlIG9mIGEgY2VydGFpbiBwZXJjZW50YWdlIG9mIHplcm8gYnl0ZXMuCisgIEZvciB0aGlzIHB1cnBvc2UgcmVxdWlyZSAyMCUgemVybyBieXRlcywgd2l0aCBhdCBsZWFzdCBzaXggdGltZXMgYXMgbWFueQorICBpbiBldmVuIChvZGQpIHBvc2l0aW9ucyBhcyBpbiBvZGQgKGV2ZW4pIHBvc2l0aW9ucy4KKyovCisgICAgaWYgKChldmVuemVybyA+PSB4ICYmIG9kZHplcm8gPT0gMCkgfHwKKwkoKCgoZXZlbnplcm8gLyAob2RkemVybyArIDEpKSA+IDYpICYmIChwY3R6ZXJvID4gMjApKSAmJgorCShjcmxmID09IDApICYmCisJKGxmbnVsID4gMSkpCisJKSB7CisJICAgIGRlYnVnKEYxMDAsInNjYW5maWxlIFVDUzIgbm9CT00gQkUgKGV2ZW4vb2RkemVybykiLCIiLDApOworCXJjID0gRlRfVUNTMjsKKwl2YWwgPSAwOworICAgIH0gZWxzZSBpZiAoKGV2ZW56ZXJvID09IDAgJiYgb2RkemVybyA+PSB4KSB8fAorCSAgICAgICAoKCgob2RkemVybyAvIChldmVuemVybyArIDEpKSA+IDYpICYmIChwY3R6ZXJvID4gMjApKSAmJgorCSAgICAgICAoY3JsZiA9PSAwKSAmJgorCSAgICAgICAobGZudWwgPiAxKSkKKwkgICAgICAgKSB7CisJZGVidWcoRjEwMCwic2NhbmZpbGUgVUNTMiBub0JPTSBMRSAoZXZlbi9vZGR6ZXJvKSIsIiIsMCk7CisJcmMgPSBGVF9VQ1MyOworCXZhbCA9IDE7CisKKyNpZmRlZiBDT01NRU5UCisjaWZkZWYgRVZFTk1BWAorLyoKKyAgSWYgdGhlIHRlc3RzIGFib3ZlIGZhaWwsIHdlIHN0aWxsIG1pZ2h0IGhhdmUgVUNTLTIgaWYgdGhlcmUgYXJlIHNpZ25pZmljYW50CisgIHJ1bnMgb2YgaWRlbnRpY2FsIGJ5dGVzIGluIGFsdGVybmF0aW5nIHBvc2l0aW9ucywgYnV0IG9ubHkgaWYgaXQgYWxzbyBoYXMKKyAgdW51c3VhbCBDMCBjb250cm9scyAob3RoZXJ3aXNlIHdlJ2QgcGljayB1cCBoZXggZmlsZXMgaGVyZSkuICBOT1RFOiBXZQorICBkb24ndCBhY3R1YWxseSBkbyB0aGlzIC0tIEVWRU5NQVggaXMgbm90IGRlZmluZWQgKHNlZSBjb21tZW50cyBhYm92ZSBhdAorICBmaXJzdCBvY2N1cnJlbmNlIG9mIEVWRU5NQVgpLgorKi8KKyAgICB9IGVsc2UgaWYgKGMwbm9uaXNvICYmIGV2ZW5tYXggPiBieXRlcyAvIDQpIHsKKwlkZWJ1ZyhGMTAwLCJzY2FuZmlsZSBVQ1MyIEJFIChldmVubWF4KSIsIiIsMCk7CisJcmMgPSBGVF9VQ1MyOworCXZhbCA9IDA7CisgICAgfSBlbHNlIGlmIChjMG5vbmlzbyAmJiBvZGRtYXggPiBieXRlcyAvIDQpIHsKKwlkZWJ1ZyhGMTAwLCJzY2FuZmlsZSBVQ1MyIExFIChldmVubWF4KSIsIiIsMCk7CisJcmMgPSBGVF9VQ1MyOworCXZhbCA9IDE7CisjZW5kaWYgLyogRVZFTk1BWCAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIH0KKy8qCisgIEl0IHNlZW1zIHRvIGJlIFVDUy0yIGJ1dCBsZXQncyBiZSBtb3JlIGNlcnRhaW4gc2luY2UgdGhlcmUgaXMgbm8gQk9NLi4uCisgIElmIHRoZSBudW1iZXIgb2YgNy0gYW5kIDgtYml0IGNoYXJhY3RlcnMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCwgaXQgbWlnaHQKKyAgYmUgYSBjb21wcmVzc2VkIGZpbGUuICBJbiB0aGlzIGNhc2Ugd2UgZGVjaWRlIGJhc2VkIG9uIHRoZSBuYW1lLgorKi8KKyAgICBpZiAocmMgPT0gRlRfVUNTMikgeworCWlmIChlaWdodGJpdCA+IDApIHsKKwkgICAgaW50IGosIGs7CisJICAgIGogPSAoYzFjb250cm9scyAqIDEwMCkgLyAoYzBjb250cm9scyArIDEpOworCSAgICBkZWJ1ZyhGMTAxLCJzY2FuZmlsZSBjMS9jMCAgICAgICIsIiIsaik7CisJICAgIGsgPSAoYnl0ZXMgKiAxMDApIC8gZWlnaHRiaXQ7CisJICAgIGRlYnVnKEYxMDEsInNjYW5maWxlIHBjdCA4Yml0ICAgIiwiIixrKTsKKwkgICAgaWYgKGsgPiA0MCAmJiBrIDwgNjAgJiYgaiA+IDYwKSB7CisJCWlmIChja21hdGNoKCJ7Ki5aLCouZ3osKi56aXAsKi5aSVB9IixuYW1lLDEsMSkpIHsKKwkJICAgIGRlYnVnKEYxMTAsInNjYW5maWxlIDgtYml0IEJJTiBjb21wcmVzc2VkIixuYW1lLDApOworCQkgICAgcmMgPSBGVF9CSU47CisJCSAgICBnb3RvIHhzY2FuZmlsZTsKKwkJfQorCSAgICB9CisJfQorCS8qIFNtYWxsIGZpbGUgLSBub3QgZW5vdWdoIGV2aWRlbmNlIHVubGVzcyAuLi4gKi8KKworCWlmIChieXRlcyA8IDEwMCkgeworCSAgICBpZiAob2RkemVybyAhPSAwICYmIGV2ZW56ZXJvICE9IDApIHsKKwkJZGVidWcoRjEwMCwic2NhbmZpbGUgc21hbGwgVUNTMiBkb3VidGZ1bCIsIiIsMCk7CisJCXJjID0gRlRfQklOOworCQlnb3RvIHhzY2FuZmlsZTsKKwkgICAgfSBlbHNlIGlmIChvZGR6ZXJvID09IDAgJiYgZXZlbnplcm8gPT0gMCkgeworCQlyYyA9IGVpZ2h0Yml0ID8gRlRfOEJJVCA6IEZUXzdCSVQ7CisJICAgIH0KKwl9CisJZ290byB4c2NhbmZpbGU7CQkJLyogU2VlbXMgdG8gYmUgVUNTLTIgKi8KKyAgICB9CisKKy8qIElmIG5vbmUgb2YgdGhlIGFib3ZlLCBpdCdzIHByb2JhYmx5IG5vdCBVbmljb2RlLiAgKi8KKworICAgIGlmICghZWlnaHRiaXQpIHsJCQkvKiBJdCdzIDctYml0ICovCisJaWYgKGMwY29udHJvbHMpIHsJCS8qIFRoaXMgd291bGQgYmUgc3RyYW5nZSAqLworCSAgICBpZiAoKGMwbm9uaXNvID4gMCkgJiYgKHR4dGN6ID09IDApKSB7CisJCWRlYnVnKEYxMDAsInNjYW5maWxlIDctYml0IEJJTiAoYzBjb25pc28pIiwiIiwwKTsKKwkJcmMgPSBGVF9CSU47CisJICAgIH0gZWxzZSB7CisJCWRlYnVnKEYxMDAsInNjYW5maWxlIDctYml0IElTTzIwMjIgVEVYVCAobm8gYzBub25pc28pIiwiIiwwKTsKKwkJcmMgPSBGVF83QklUOworCSAgICB9CisJfSBlbHNlIHsJCQkvKiA3LWJpdCB0ZXh0ICovCisJICAgIGRlYnVnKEYxMDAsInNjYW5maWxlIDctYml0IFRFWFQgKG5vIGMwY29udHJvbHMpIiwiIiwwKTsKKwkgICAgcmMgPSBGVF83QklUOworCX0KKyAgICB9IGVsc2UgaWYgKCFjMG5vbmlzbyB8fCB0eHRjeikgewkvKiA4LWJpdCB0ZXh0ICovCisJZGVidWcoRjEwMCwic2NhbmZpbGUgOC1iaXQgVEVYVCAobm8gYzBub25pc28pIiwiIiwwKTsKKwlyYyA9IEZUXzhCSVQ7CisJdmFsID0gYzFjb250cm9scyA/IDEgOiAwOworICAgIH0gZWxzZSB7CQkJCS8qIDgtYml0IGJpbmFyeSAqLworCWRlYnVnKEYxMDAsInNjYW5maWxlIDgtYml0IEJJTiAoYzBub25pc28pIiwiIiwwKTsKKwlyYyA9IEZUX0JJTjsKKyAgICB9CisKKyNlbHNlICAvKiAhVU5JQ09ERSAqLworCisgICAgaWYgKGMwbm9uaXNvKSB7CisJZGVidWcoRjEwMCwic2NhbmZpbGUgOC1iaXQgQklOIChjMG5vbmlzbykiLCIiLDApOworCXJjID0gRlRfQklOOworICAgIH0gZWxzZSBpZiAoZWlnaHRiaXQpIHsKKwlkZWJ1ZyhGMTAwLCJzY2FuZmlsZSA4LWJpdCBURVhUIChubyBjMG5vbmlzbykiLCIiLDApOworCXJjID0gRlRfOEJJVDsKKwl2YWwgPSBjMWNvbnRyb2xzID8gMSA6IDA7CisgICAgfSBlbHNlIHsKKwlkZWJ1ZyhGMTAwLCJzY2FuZmlsZSA3LWJpdCBURVhUIChubyBjMG5vbmlzbykiLCIiLDApOworCXJjID0gRlRfN0JJVDsKKyAgICB9CisKKyNlbmRpZiAvKiBVTklDT0RFICovCisKKyAgeHNjYW5maWxlOgorICAgIGlmIChmbGFnKSAqZmxhZyA9IHZhbDsKKyAgICBkZWJ1ZyhGMTAxLCJzY2FuZmlsZSByZXN1bHQgICAgICIsIiIscmMpOworICAgIHJldHVybihyYyk7Cit9CisKKy8qICBGIEkgTCBFIFMgRSBMIEUgQyBUICAtLSAgU2VsZWN0IHRoaXMgZmlsZSBmb3Igc2VuZGluZyAgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2ZpbGVzZWxlY3QoCisgICAgY2hhciAqZiwgY2hhciAqc2EsIGNoYXIgKnNiLCBjaGFyICpzbmEsIGNoYXIgKnNuYiwKKyAgICBsb25nIG1pbnNpeiwgbG9uZyBtYXhzaXosCisgICAgaW50IG5idSwgaW50IG54bGlzdCwKKyAgICBjaGFyICoqIHhsaXN0CispCisjZWxzZQorZmlsZXNlbGVjdChmLHNhLHNiLHNuYSxzbmIsbWluc2l6LG1heHNpeixuYnUsbnhsaXN0LHhsaXN0KQorIGNoYXIgKmYsKnNhLCpzYiwqc25hLCpzbmI7IGxvbmcgbWluc2l6LG1heHNpejsgaW50IG5idSxueGxpc3Q7IGNoYXIgKiogeGxpc3Q7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGZpbGVzZWxlY3QgKi8geworICAgIGNoYXIgKmZkYXRlOworICAgIGludCBuOworICAgIGxvbmcgejsKKworICAgIGlmICghc2EpIHNhID0gIiI7CisgICAgaWYgKCFzYikgc2IgPSAiIjsKKyAgICBpZiAoIXNuYSkgc25hID0gIiI7CisgICAgaWYgKCFzbmIpIHNuYiA9ICIiOworCisjaWZkZWYgQ0tTWU1MSU5LCisjaWZuZGVmIE5PSUNQCisjaWZuZGVmIE5PWEZFUgorICAgIGlmIChub2xpbmtzKSB7CisJbG9uZyB6ejsKKwl6eiA9IHpnZXRmcyhmKTsKKwlkZWJ1ZyhGMTExLCJmaWxlc2VsZWN0IE5PTElOS1MgemdldGZzIixmLHp6KTsKKwlpZiAoenogPCAwTCkKKwkgIHJldHVybigwKTsKKwlkZWJ1ZyhGMTExLCJmaWxlc2VsZWN0IE5PTElOS1Mgemdmc19saW5rIixmLHpnZnNfbGluayk7CisJaWYgKHpnZnNfbGluaykKKwkgIHJldHVybigwKTsKKyAgICB9CisjZW5kaWYgLyogTk9YRkVSICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKyNlbmRpZiAvKiBDS1NZTUxJTksgKi8KKworICAgIGRlYnVnKEYxMTAsImZpbGVzZWxlY3QiLGYsMCk7CisgICAgaWYgKCpzYSB8fCAqc2IgfHwgKnNuYSB8fCAqc25iKSB7CisJZmRhdGUgPSB6ZmNkYXQoZik7CQkvKiBEYXRlL3RpbWUgb2YgdGhpcyBmaWxlICovCisJaWYgKCFmZGF0ZSkgZmRhdGUgPSAiIjsKKwluID0gc3RybGVuKGZkYXRlKTsKKwlkZWJ1ZyhGMTExLCJmaWxlc2VsZWN0IGZkYXRlIixmZGF0ZSxuKTsKKwlpZiAobiAhPSAxNykJCQkvKiBGYWlsZWQgdG8gZ2V0IGl0ICovCisJICByZXR1cm4oMSk7CisJLyogL0FGVEVSOiAqLworCWlmIChzYVswXSAmJiAoc3RyY21wKGZkYXRlLChjaGFyICopc2EpIDw9IDApKSB7CisJICAgIGRlYnVnKEYxMTAsImZpbGVzZWxlY3Qgc2EiLHNhLDApOworCSAgICAvKiB0bG9nKEYxMTAsIlNraXBwaW5nICh0b28gb2xkKSIsZiwwKTsgKi8KKwkgICAgcmV0dXJuKDApOworCX0KKwkvKiAvQkVGT1JFOiAqLworCWlmIChzYlswXSAmJiAoc3RyY21wKGZkYXRlLChjaGFyICopc2IpID49IDApKSB7CisJICAgIGRlYnVnKEYxMTAsImZpbGVzZWxlY3Qgc2IiLHNiLDApOworCSAgICAvKiB0bG9nKEYxMTAsIlNraXBwaW5nICh0b28gbmV3KSIsZiwwKTsgKi8KKwkgICAgcmV0dXJuKDApOworCX0KKwkvKiAvTk9ULUFGVEVSOiAqLworCWlmIChzbmFbMF0gJiYgKHN0cmNtcChmZGF0ZSwoY2hhciAqKXNuYSkgPiAwKSkgeworCSAgICBkZWJ1ZyhGMTEwLCJmaWxlc2VsZWN0IHNuYSIsc25hLDApOworCSAgICAvKiB0bG9nKEYxMTAsIlNraXBwaW5nICh0b28gbmV3KSIsZiwwKTsgKi8KKwkgICAgcmV0dXJuKDApOworCX0KKwkvKiAvTk9ULUJFRk9SRTogKi8KKwlpZiAoc25iWzBdICYmIChzdHJjbXAoZmRhdGUsKGNoYXIgKilzbmIpIDwgMCkpIHsKKwkgICAgZGVidWcoRjExMCwiZmlsZXNlbGVjdCBzbmIiLHNuYiwwKTsKKwkgICAgLyogdGxvZyhGMTEwLCJTa2lwcGluZyAodG9vIG9sZCkiLGYsMCk7ICovCisJICAgIHJldHVybigwKTsKKwl9CisgICAgfQorICAgIGlmIChtaW5zaXogPiAtMUwgfHwgbWF4c2l6ID4gLTFMKSB7IC8qIFNtYWxsZXIgb3IgbGFyZ2VyICovCisJeiA9IHpjaGtpKGYpOwkJCS8qIEdldCBzaXplICovCisJZGVidWcoRjEwMSwiZmlsZXNlbGVjdCBmaWxlc2l6ZSIsIiIseik7CisJaWYgKHogPCAwKQorCSAgcmV0dXJuKDEpOworCWlmICgobWluc2l6ID4gLTFMKSAmJiAoeiA+PSBtaW5zaXopKSB7CisJICAgIGRlYnVnKEYxMTEsImZpbGVzZWxlY3QgbWluc2l6IHNraXBwaW5nIixmLG1pbnNpeik7CisJICAgIC8qIHRsb2coRjExMSwiU2tpcHBpbmcgKHRvbyBiaWcpIixmLHopOyAqLworCSAgICByZXR1cm4oMCk7CisJfQorCWlmICgobWF4c2l6ID4gLTFMKSAmJiAoeiA8PSBtYXhzaXopKSB7CisJICAgIGRlYnVnKEYxMTEsImZpbGVzZWxlY3QgbWF4c2l6IHNraXBwaW5nIixmLG1heHNpeik7CisJICAgIC8qIHRsb2coRjExMCwiU2tpcHBpbmcgKHRvbyBzbWFsbCkiLGYsMCk7ICovCisJICAgIHJldHVybigwKTsKKwl9CisgICAgfQorICAgIGlmIChuYnUpIHsJCQkJLyogU2tpcHBpbmcgYmFja3VwIGZpbGVzPyAqLworCWlmIChja21hdGNoKAorI2lmZGVmIENLUkVHRVgKKwkJICAgICIqLn5bMC05XSp+IgkvKiBOb3QgcGVyZmVjdCBidXQgY2xvc2UgZW5vdWdoLiAqLworI2Vsc2UKKwkJICAgICIqLn4qfiIJCS8qIExlc3MgY2xvc2UuICovCisjZW5kaWYgLyogQ0tSRUdFWCAqLworCQkgICAgLGYsZmlsZWNhc2UsMSkpIHsKKwkgICAgZGVidWcoRjExMCwiZmlsZXNlbGVjdCBza2lwcGluZyBiYWNrdXAiLGYsMCk7CisJICAgIHJldHVybigwKTsKKwl9CisgICAgfQorICAgIGZvciAobiA9IDA7IHhsaXN0ICYmIG4gPCBueGxpc3Q7IG4rKykgeworCWlmICgheGxpc3Rbbl0pIHsKKwkgICAgZGVidWcoRjEwMSwiZmlsZXNlbGVjdCB4bGlzdCBlbXB0eSIsMCxuKTsKKwkgICAgYnJlYWs7CisJfQorCWlmIChja21hdGNoKHhsaXN0W25dLGYsZmlsZWNhc2UsMSkpIHsKKwkgICAgZGVidWcoRjExMSwiZmlsZXNlbGVjdCB4bGlzdCIseGxpc3Rbbl0sbik7CisJICAgIGRlYnVnKEYxMTAsImZpbGVzZWxlY3Qgc2tpcHBpbmciLGYsMCk7CisJICAgIHJldHVybigwKTsKKwl9CisgICAgfQorICAgIGlmICh4ZmlsZXR5cGUgPiAtMSkgeworCW4gPSBzY2FuZmlsZShmLE5VTEwsbnNjYW5maWxlKTsKKwlpZiAobiA8IDApIHsKKwkgICAgbiA9IGJpbmFyeSA/IDEgOiAwOworCX0gZWxzZSB7CisJICAgIG4gPSAobiA9PSBGVF9CSU4pID8gMSA6IDA7CisJfQorCWlmIChuICE9IHhmaWxldHlwZSkKKwkgIHJldHVybigwKTsKKyAgICB9CisgICAgZGVidWcoRjExMCwiZmlsZXNlbGVjdCBzZWxlY3RpbmciLGYsMCk7CisgICAgcmV0dXJuKDEpOworfQorCisKKyNpZmRlZiBUQ1BTT0NLRVQKKyNpZmRlZiBOVAorZXh0ZXJuIGludCBXU0FTYWZlVG9DYW5jZWw7CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworVk9JRAorc2V0ZmxvdygpIHsKKyAgICBleHRlcm4gaW50IGZsb3csIGF1dG9mbG93LCBtZG10eXAsIGN4dHlwZSwgY3hmbG93W107CisjaWZuZGVmIE5PRElBTAorICAgIGV4dGVybiBpbnQgZGlhbGNhcGFzLCBkaWFsZmM7CisgICAgZXh0ZXJuIE1ETUlORiAqIG1vZGVtcFtdOworICAgIE1ETUlORiAqIHAgPSBOVUxMOworICAgIGxvbmcgYml0cyA9IDA7CisjZW5kaWYgLyogTk9ESUFMICovCisKKyAgICBkZWJ1ZyhGMTAxLCJzZXRmbG93IGF1dG9mbG93IiwiIixhdXRvZmxvdyk7CisKKy8qICNpZmRlZiBDT01NRU5UICovCisvKiBXSFkgV0FTIFRISVMgQ09NTUVOVEVEIE9VVD8gKi8KKyAgICBpZiAoIWF1dG9mbG93KSAgICAgICAgICAgICAgICAgICAgICAvKiBPbmx5IGlmIEZMT1cgaXMgQVVUTyAqLworICAgICAgcmV0dXJuOworLyogI2VuZGlmICovIC8qIENPTU1FTlQgKi8KKworICAgIGRlYnVnKEYxMDEsInNldGZsb3cgbG9jYWwiLCIiLGxvY2FsKTsKKyAgICBkZWJ1ZyhGMTAxLCJzZXRmbG93IG5ldHdvcmsiLCIiLG5ldHdvcmspOworICAgIGRlYnVnKEYxMDEsInNldGZsb3cgY3h0eXBlIiwiIixjeHR5cGUpOworCisjaWZkZWYgVE5fQ09NUE9SVAorICAgIGlmIChuZXR3b3JrICYmIGlzdG5jb21wb3J0KCkpIHsKKwlmbG93ID0gY3hmbG93W0NYVF9NT0RFTV07CisgICAgICAgIGRlYnVnKEYxMDEsInNldGZsb3cgVE5fQ09NUE9SVCBmbG93IiwiIixmbG93KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBUTl9DT01QT1JUICovCisKKyAgICBpZiAobmV0d29yayB8fCAhbG9jYWwgfHwgY3h0eXBlID09IENYVF9ESVJFQ1QpIHsKKyAgICAgICAgZmxvdyA9IGN4Zmxvd1tjeHR5cGVdOyAgICAgICAgICAvKiBTZXQgYXBwcm9wcmlhdGUgZmxvdyBjb250cm9sICovCisgICAgICAgIGRlYnVnKEYxMDEsInNldGZsb3cgZmxvdyIsIiIsZmxvdyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGN4dHlwZSAhPSBDWFRfTU9ERU0pICAgICAgICAgICAgLyogQ29ubmVjdGlvbiB0eXBlIHNob3VsZCBiZSBtb2RlbSAqLworICAgICAgcmV0dXJuOworCisjaWZuZGVmIE5PRElBTAorICAgIGJpdHMgPSBkaWFsY2FwYXM7ICAgICAgICAgICAgICAgICAgIC8qIENhcGFiaWxpdHkgYml0cyAqLworICAgIGlmICghYml0cykgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGJpdHM/ICovCisgICAgICAgIHAgPSBtb2RlbXBbbWRtdHlwXTsgICAgICAgICAgICAgLyogTG9vayBpbiBtb2RlbSBpbmZvIHN0cnVjdHVyZSAqLworICAgICAgICBpZiAocCkKKyAgICAgICAgICBiaXRzID0gcC0+Y2FwYXM7CisgICAgfQorICAgIGlmIChkaWFsZmMgPT0gRkxPX0FVVE8pIHsgICAgICAgICAgIC8qIElmIERJQUwgZmxvdyBpcyBBVVRPICovCisjaWZkZWYgQ0tfUlRTQ1RTICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgY2FuIGRvIFJUUy9DVFMgZmxvdyBjb250cm9sICovCisgICAgICAgIGlmIChiaXRzICYgQ0tEX0hXKSAgICAgICAgICAgICAgLyogYW5kIG1vZGVtIGNhbiBkbyBpdCB0b28gKi8KKyAgICAgICAgICBmbG93ID0gRkxPX1JUU0M7ICAgICAgICAgICAgICAvKiB0aGVuIHN3aXRjaCB0byBSVFMvQ1RTICovCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlICovCisgICAgICAgICAgZmxvdyA9IEZMT19YT05YOyAgICAgICAgICAgICAgLyogdXNlIFhvbi9Yb2ZmLiAqLworI2Vsc2UKKyNpZm5kZWYgTkVYVAorI2lmbmRlZiBJUklYCisgICAgICAgIGZsb3cgPSBGTE9fWE9OWDsgICAgICAgICAgICAgICAgLyogVXNlIFhvbi9Yb2ZmLiAqLworI2VuZGlmIC8qIElSSVggKi8KKyNlbmRpZiAvKiBORVhUICovCisjZW5kaWYgLyogQ0tfUlRTQ1RTICovCisgICAgfQorI2VuZGlmIC8qIE5PRElBTCAqLworICAgIGRlYnVnKEYxMDEsInNldGZsb3cgbW9kZW0gZmxvdyIsIiIsZmxvdyk7CisgICAgcmV0dXJuOworfQorCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBDS19UUklHR0VSCisKKy8qICBBIFUgVCBPIEUgWCBJIFQgQyBIIEsgIC0tICBDaGVjayBmb3IgQ09OTkVDVC1tb2RlIHRyaWdnZXIgc3RyaW5nICAqLworLyoKKyAgUmV0dXJucyAtMSBpZiB0cmlnZ2VyIG5vdCBmb3VuZCwgb3IgZWxzZSB0aGUgdHJpZ2dlciBpbmRleCwgMCBvciBncmVhdGVyLgorICAoUmVwbGFjZSB3aXRoIGZhbmNpZXIgYW5kIG1vcmUgZWZmaWNpZW50IG1hdGNoZXIgbGF0ZXIuLi4pCisgIE5PVEU6IHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZCwgY2FsbCB0aGlzIHdheToKKworICAgIHggPSB0dF90cmlnZ2VyWzBdID8gYXV0b2V4aXRjaGsoYykgOiAtMTsKKworKi8KK2ludAorI2lmZGVmIENLX0FOU0lDCithdXRvZXhpdGNoayhDSEFSIGMpCisjZWxzZQorYXV0b2V4aXRjaGsoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBhdXRvZXhpdGNoayAqLyB7CisgICAgZXh0ZXJuIENIQVIgKiB0dF90cm1hdGNoW107CisgICAgZXh0ZXJuIGNoYXIgKiB0dF90cmlnZ2VyW107CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IFRSSUdHRVJTOyBpKyspIHsKKyAgICAgICAgaWYgKCF0dF90cmlnZ2VyW2ldKSB7ICAgICAgICAgICAvKiBObyBtb3JlIHRyaWdnZXJzIGluIGxpc3QgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKCp0dF90cmlnZ2VyW2ldKSB7CisgICAgICAgICAgICBpZiAoIXR0X3RybWF0Y2hbaV0pICAgICAgICAgLyogSnVzdCBzdGFydGluZz8gKi8KKyAgICAgICAgICAgICAgdHRfdHJtYXRjaFtpXSA9IChDSEFSICopdHRfdHJpZ2dlcltpXTsgLyogU2V0IG1hdGNoIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIGlmIChjID09ICp0dF90cm1hdGNoW2ldKSB7ICAvKiBDb21wYXJlIHRoaXMgY2hhcmFjdGVyICovCisgICAgICAgICAgICAgICAgdHRfdHJtYXRjaFtpXSsrOyAgICAgICAgLyogSXQgbWF0Y2hlcyAqLworICAgICAgICAgICAgICAgIGlmICghKnR0X3RybWF0Y2hbaV0pIHsgIC8qIEVuZCBvZiBtYXRjaCBzdHJpbmc/ICovCisgICAgICAgICAgICAgICAgICAgIHR0X3RybWF0Y2hbaV0gPSAoQ0hBUiAqKSB0dF90cmlnZ2VyW2ldOyAvKiBZZXMsIHJld2luZCwgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiYXV0b2V4aXRjaGsiLHR0X3RyaWdnZXJbaV0saSk7IC8qIGxvZywgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGkpOyAgICAgICAgICAvKiBhbmQgcmV0dXJuIHN1Y2Nlc3MgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgLyogTm8gbWF0Y2ggKi8KKyAgICAgICAgICAgICAgdHRfdHJtYXRjaFtpXSA9IChDSEFSICopIHR0X3RyaWdnZXJbaV07IC8qIFJld2luZCBtYXRjaCBzdHJpbmcgKi8KKyAgICAgICAgfSAvKiBhbmQgZ28gb24gdGhlIG5leHQgbWF0Y2ggc3RyaW5nICovCisgICAgfQorICAgIHJldHVybigtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIG1hdGNoIGZvdW5kICovCit9CisjZW5kaWYgLyogQ0tfVFJJR0dFUiAqLworCisjaWZuZGVmIE5PU0hPVworLyogIFMgSCBPIE0gRCBNICAtLSAgU2hvdyBtb2RlbSBzaWduYWxzICAqLworCitWT0lECitzaG9tZG0oKSB7CisvKgorICBOb3RlIHVzZSBvZiAiXHJcbiIgdG8gbWFrZSBzdXJlIHRoaXMgcmVwb3J0IHByaW50cyByaWdodCwgZXZlbiB3aGVuCisgIGNhbGxlZCBkdXJpbmcgQ09OTkVDVCBtb2RlLgorKi8KKyAgICBpbnQgeTsKKyAgICB5ID0gdHRnbWRtKCk7CisgICAgc3dpdGNoICh5KSB7CisgICAgICBjYXNlIC0zOiBwcmludGYoCisgICAgICAgICAgICAgICAgICJNb2RlbSBzaWduYWxzIHVuYXZhaWxhYmxlIGluIHRoaXMgdmVyc2lvbiBvZiBLZXJtaXRcclxuIik7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgLTI6IHByaW50ZigiTm8gbW9kZW0gY29udHJvbCBmb3IgdGhpcyBkZXZpY2VcclxuIik7IGJyZWFrOworICAgICAgY2FzZSAtMTogcHJpbnRmKCJNb2RlbSBzaWduYWxzIHVuYXZhaWxhYmxlXHJcbiIpOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisjaWZuZGVmIE1BQworICAgICAgICBwcmludGYoCisgICAgICAgICAgIiBDYXJyaWVyIERldGVjdCAgICAgIChDRCk6ICAlc1xyXG4iLCh5ICYgQk1fRENEKSA/ICJPbiI6ICJPZmYiKTsKKyAgICAgICAgcHJpbnRmKAorICAgICAgICAgICIgRGF0YXNldCBSZWFkeSAgICAgICAoRFNSKTogJXNcclxuIiwoeSAmIEJNX0RTUikgPyAiT24iOiAiT2ZmIik7CisjZW5kaWYgLyogTUFDICovCisgICAgICAgIHByaW50ZigKKyAgICAgICAgICAiIENsZWFyIFRvIFNlbmQgICAgICAgKENUUyk6ICVzXHJcbiIsKHkgJiBCTV9DVFMpID8gIk9uIjogIk9mZiIpOworI2lmbmRlZiBTVFJBVFVTCisjaWZuZGVmIE1BQworICAgICAgICBwcmludGYoCisgICAgICAgICAgIiBSaW5nIEluZGljYXRvciAgICAgIChSSSk6ICAlc1xyXG4iLCh5ICYgQk1fUk5HKSA/ICJPbiI6ICJPZmYiKTsKKyNlbmRpZiAvKiBNQUMgKi8KKyAgICAgICAgcHJpbnRmKAorICAgICAgICAgICIgRGF0YSBUZXJtaW5hbCBSZWFkeSAoRFRSKTogJXNcclxuIiwKKyNpZmRlZiBOVAorICAgICAgICAgICIodW5rbm93bikiCisjZWxzZSAvKiBOVCAqLworICAgICAgICAgICh5ICYgQk1fRFRSKSA/ICJPbiI6ICJPZmYiCisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICApOworI2lmbmRlZiBNQUMKKyAgICAgICAgcHJpbnRmKAorICAgICAgICAgICIgUmVxdWVzdCBUbyBTZW5kICAgICAoUlRTKTogJXNcclxuIiwKKyNpZmRlZiBOVAorICAgICAgICAgICIodW5rbm93bikiCisjZWxzZSAvKiBOVCAqLworICAgICAgICAgICh5ICYgQk1fUlRTKSA/ICJPbiI6ICJPZmYiCisjZW5kaWYgLyogTlQgKi8KKyAgICAgICAgICApOworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyAgICB9CisjaWZkZWYgQkVUQURFQlVHCisjaWZkZWYgQ0tfVEFQSQorICAgIGlmICh0dHRhcGkgJiYgIXRhcGlwYXNzKSB7CisgICAgICAgIExQREVWQ0ZHICAgICAgICBscERldkNmZyA9IE5VTEw7CisgICAgICAgIExQQ09NTUNPTkZJRyAgICBscENvbW1Db25maWcgPSBOVUxMOworICAgICAgICBMUE1PREVNU0VUVElOR1MgbHBNb2RlbVNldHRpbmdzID0gTlVMTDsKKyAgICAgICAgRENCICogICAgICAgICAgIGxwRENCID0gTlVMTDsKKworICAgICAgICBpZiAoY2t0YXBpR2V0TW9kZW1TZXR0aW5ncygmbHBEZXZDZmcsJmxwTW9kZW1TZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZscENvbW1Db25maWcsJmxwRENCKSkgeworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgY2t0YXBpRGlzcGxheU1vZGVtU2V0dGluZ3MobHBEZXZDZmcsbHBNb2RlbVNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDb21tQ29uZmlnLGxwRENCKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBDS19UQVBJICovCisjZW5kaWYgLyogQkVUQURFQlVHICovCit9CisjZW5kaWYgLyogTk9TSE9XICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworCisjaWZuZGVmIE5PWEZFUgorLyogIFMgRCBFIEIgVSAgLS0gUmVjb3JkIHNwYXIgcmVzdWx0cyBpbiBkZWJ1Z2dpbmcgbG9nICAqLworCitWT0lECitzZGVidShsZW4pIGludCBsZW47IHsKKyAgICBkZWJ1ZyhGMTExLCJzcGFyOiBkYXRhIiwoY2hhciAqKSByZGF0YXAsbGVuKTsKKyAgICBkZWJ1ZyhGMTAxLCIgc3BzaXogIiwiIiwgc3BzaXopOworICAgIGRlYnVnKEYxMDEsIiB0aW1pbnQiLCIiLHRpbWludCk7CisgICAgZGVidWcoRjEwMSwiIG5wYWQgICIsIiIsICBucGFkKTsKKyAgICBkZWJ1ZyhGMTAxLCIgcGFkY2ggIiwiIiwgcGFkY2gpOworICAgIGRlYnVnKEYxMDEsIiBzZW9sICAiLCIiLCAgc2VvbCk7CisgICAgZGVidWcoRjEwMSwiIGN0bHEgICIsIiIsICBjdGxxKTsKKyAgICBkZWJ1ZyhGMTAxLCIgZWJxICAgIiwiIiwgICBlYnEpOworICAgIGRlYnVnKEYxMDEsIiBlYnFmbGciLCIiLGVicWZsZyk7CisgICAgZGVidWcoRjEwMSwiIGJjdHIgICIsIiIsICBiY3RyKTsKKyAgICBkZWJ1ZyhGMTAxLCIgcnB0cSAgIiwiIiwgIHJwdHEpOworICAgIGRlYnVnKEYxMDEsIiBycHRmbGciLCIiLHJwdGZsZyk7CisgICAgZGVidWcoRjEwMSwiIGxzY2FwdSIsIiIsbHNjYXB1KTsKKyAgICBkZWJ1ZyhGMTAxLCIgYXRjYXB1IiwiIixhdGNhcHUpOworICAgIGRlYnVnKEYxMDEsIiBscGNhcHUiLCIiLGxwY2FwdSk7CisgICAgZGVidWcoRjEwMSwiIHN3Y2FwdSIsIiIsc3djYXB1KTsKKyAgICBkZWJ1ZyhGMTAxLCIgd3Nsb3RuIiwiIiwgd3Nsb3RuKTsKKyAgICBkZWJ1ZyhGMTAxLCIgd2hhdHJ1IiwiIiwgd2hhdHJ1KTsKK30KKy8qICBSIEQgRSBCIFUgLS0gRGVidWdnaW5nIGRpc3BsYXkgb2YgcnBhcigpIHZhbHVlcyAgKi8KKworVk9JRAorcmRlYnUoZCxsZW4pIENIQVIgKmQ7IGludCBsZW47IHsKKyAgICBkZWJ1ZyhGMTExLCJycGFyOiBkYXRhIixkLGxlbik7CisgICAgZGVidWcoRjEwMSwiIHJwc2l6ICIsIiIsIHh1bmNoYXIoZFswXSkpOworICAgIGRlYnVnKEYxMDEsIiBydGltbyAiLCIiLCBydGltbyk7CisgICAgZGVidWcoRjEwMSwiIG15cGFkbiIsIiIsbXlwYWRuKTsKKyAgICBkZWJ1ZyhGMTAxLCIgbXlwYWRjIiwiIixteXBhZGMpOworICAgIGRlYnVnKEYxMDEsIiBlb2wgICAiLCIiLCAgIGVvbCk7CisgICAgZGVidWcoRjEwMSwiIGN0bHEgICIsIiIsICBjdGxxKTsKKyAgICBkZWJ1ZyhGMTAxLCIgc3EgICAgIiwiIiwgICAgc3EpOworICAgIGRlYnVnKEYxMDEsIiBlYnEgICAiLCIiLCAgIGVicSk7CisgICAgZGVidWcoRjEwMSwiIGVicWZsZyIsIiIsZWJxZmxnKTsKKyAgICBkZWJ1ZyhGMTAxLCIgYmN0ciAgIiwiIiwgIGJjdHIpOworICAgIGRlYnVnKEYxMDEsIiBycHRxICAiLCIiLCAgZFs4XSk7CisgICAgZGVidWcoRjEwMSwiIHJwdGZsZyIsIiIscnB0ZmxnKTsKKyAgICBkZWJ1ZyhGMTAxLCIgY2FwYXMgIiwiIiwgY2FwYXMpOworICAgIGRlYnVnKEYxMDEsIiBiaXRzICAiLCIiLGRbY2FwYXNdKTsKKyAgICBkZWJ1ZyhGMTAxLCIgbHNjYXB1IiwiIixsc2NhcHUpOworICAgIGRlYnVnKEYxMDEsIiBhdGNhcHUiLCIiLGF0Y2FwdSk7CisgICAgZGVidWcoRjEwMSwiIGxwY2FwdSIsIiIsbHBjYXB1KTsKKyAgICBkZWJ1ZyhGMTAxLCIgc3djYXB1IiwiIixzd2NhcHUpOworICAgIGRlYnVnKEYxMDEsIiB3c2xvdHIiLCIiLCB3c2xvdHIpOworICAgIGRlYnVnKEYxMDEsIiBycHNpeihleHRlbmRlZCkiLCIiLHJwc2l6KTsKK30KKworI2lmZGVmIENPTU1FTlQKKy8qICBDIEggSyBFIFIgUiAgLS0gIERlY2lkZSB3aGV0aGVyIHRvIGV4aXQgdXBvbiBhIHByb3RvY29sIGVycm9yICAqLworCitWT0lECitjaGtlcnIoKSB7CisgICAgaWYgKGJhY2tncmQgJiYgIXNlcnZlcikgZmF0YWwoIlByb3RvY29sIGVycm9yIik7Cit9CisjZW5kaWYgLyogQ09NTUVOVCAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisvKiAgRiBBIFQgQSBMICAtLSAgRmF0YWwgZXJyb3IgbWVzc2FnZSAqLworCitWT0lECitmYXRhbChtc2cpIGNoYXIgKm1zZzsgeworICAgIGV4dGVybiBpbnQgaW5pdGZsZzsKKyAgICBzdGF0aWMgaW50IGluaXRpbmcgPSAwOworICAgIGlmICghbXNnKSBtc2cgPSAiIjsKKyAgICBkZWJ1ZyhGMTExLCJmYXRhbCIsbXNnLGluaXRmbGcpOworCisgICAgaWYgKCFpbml0ZmxnKSB7CQkJLyogSWYgY2FsbGVkIGZyb20gcHJlc2NhbiAqLworCWlmIChpbml0aW5nKQkJCS8qIG9yIGNhbGxlZCBmcm9tIHN5c2luaXQoKSAqLworICAgICAgICAgIGV4aXQoMjUzKTsKKwlpbml0aW5nID0gMTsKKwlzeXNpbml0KCk7CisgICAgfQorCisgICAgZGVidWcoRjExMSwiZmF0YWwiLG1zZyx4aXRzdGEpOworICAgIHRsb2coRjExMCwiRmF0YWw6Iixtc2csMEwpOworI2lmZGVmIFZNUworICAgIGlmIChzdHJuY21wKG1zZywiJUNLRVJNSVQiLDgpKQorICAgICAgY29ub2woIiVDS0VSTUlULUUtRkFUQUwsICIpOworICAgIGNvbm9sbChtc2cpOworI2Vsc2UgLyogIVZNUyAqLworICAgIGNvbm9sbChtc2cpOworI2VuZGlmIC8qIFZNUyAqLworI2lmZGVmIE9TMgorI2lmbmRlZiBOT1hGRVIKKyAgICBpZiAoeGZyYmVsKSB7CisgICAgICAgIGJsZWVwKEJQX0ZBSUwpOworICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgYmxlZXAoQlBfRkFJTCk7CisgICAgfQorI2VuZGlmIC8qIE5PWEZFUiAqLworCisjZW5kaWYgLyogT1MyICovCisgICAgZG9leGl0KEJBRF9FWElULHhpdHN0YSB8IDEpOyAgICAgICAgLyogRXhpdCBpbmRpY2F0aW5nIGZhaWx1cmUgKi8KK30KKworI2lmbmRlZiBOT1hGRVIKKy8qICBCIEwgRCBMIEUgTiAgLS0gIE1ha2UgbGVuZ3RoLWVuY29kZWQgY29weSBvZiBzdHJpbmcgICovCisKK2NoYXIgKgorYmxkbGVuKHN0cixkZXN0KSBjaGFyICpzdHIsICpkZXN0OyB7CisgICAgaW50IGxlbjsKKyAgICBsZW4gPSAoaW50KXN0cmxlbihzdHIpOworICAgIGlmIChsZW4gPiA5NCkKKyAgICAgICpkZXN0ID0gU1A7CisgICAgZWxzZQorICAgICAgKmRlc3QgPSAoY2hhcikgdG9jaGFyKGxlbik7CisgICAgc3RyY3B5KGRlc3QrMSxzdHIpOwkJCS8qIENoZWNrZWQgYmVsb3cgaW4gc2V0Z2VuKCkgKi8KKyAgICByZXR1cm4oZGVzdCtsZW4rMSk7Cit9CisKKworLyogIFMgRSBUIEcgRSBOICAtLSAgQ29uc3RydWN0IGEgZ2VuZXJpYyBjb21tYW5kICAqLworLyoKKyAgQ2FsbCB3aXRoIEdlbmVyaWMgY29tbWFuZCBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgdGhyZWUgc3RyaW5nIGFyZ3VtZW50cy4KKyAgVHJhaWxpbmcgc3RyaW5ncyBhcmUgYWxsb3dlZCB0byBiZSBlbXB0eSAoIiIpLiAgRWFjaCBzdHJpbmcgZXhjZXB0IHRoZSBsYXN0CisgIG5vbi1lbXB0eSBzdHJpbmcgbXVzdCBiZSBsZXNzIHRoYW4gOTUgY2hhcmFjdGVycyBsb25nLiAgVGhlIGZpbmFsIG5vbmVtcHR5CisgIHN0cmluZyBpcyBhbGxvd2VkIHRvIGJlIGxvbmdlci4KKyovCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3NldGdlbihjaGFyIHR5cGUsIGNoYXIgKiBhcmcxLCBjaGFyICogYXJnMiwgY2hhciAqIGFyZzMpCisjZWxzZQorc2V0Z2VuKHR5cGUsYXJnMSxhcmcyLGFyZzMpIGNoYXIgdHlwZSwgKmFyZzEsICphcmcyLCAqYXJnMzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogc2V0Z2VuICovIHsKKyAgICBjaGFyICp1cHN0ciwgKmNwOworI2lmZGVmIERZTkFNSUMKKyAgICBpZiAoIWNtZHN0cikKKyAgICAgIGlmICghKGNtZHN0ciA9IG1hbGxvYyhNQVhTUCArIDEpKSkKKyAgICAgICAgZmF0YWwoInNldGdlbjogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5Iik7CisjZW5kaWYgLyogRFlOQU1JQyAqLworCisgICAgY3AgPSBjbWRzdHI7CisgICAgKmNwKysgPSB0eXBlOworICAgICpjcCA9IE5VTDsKKyAgICBpZiAoIWFyZzEpIGFyZzEgPSAiIjsKKyAgICBpZiAoIWFyZzIpIGFyZzIgPSAiIjsKKyAgICBpZiAoIWFyZzMpIGFyZzMgPSAiIjsKKyAgICBpZiAoKChpbnQpc3RybGVuKGFyZzEpKyhpbnQpc3RybGVuKGFyZzIpKyhpbnQpc3RybGVuKGFyZzMpKzQpIDwgTUFYU1ApIHsKKwlpZiAoKmFyZzEgIT0gTlVMKSB7CisJICAgIHVwc3RyID0gYmxkbGVuKGFyZzEsY3ApOworCSAgICBpZiAoKmFyZzIgIT0gTlVMKSB7CisJCXVwc3RyID0gYmxkbGVuKGFyZzIsdXBzdHIpOworCQlpZiAoKmFyZzMgIT0gTlVMKSBibGRsZW4oYXJnMyx1cHN0cik7CisJICAgIH0KKwl9CisJY21hcmcgPSBjbWRzdHI7CisJZGVidWcoRjExMCwic2V0Z2VuIixjbWFyZywwKTsKKwlyZXR1cm4oJ2cnKTsKKyAgICB9CisgICAgcmV0dXJuKCdFJyk7Cit9CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9NU0VORAorc3RhdGljIGNoYXIgKm1nYnVmcCA9IE5VTEw7CisKKy8qICBGIE4gUCBBIFIgUyBFICAtLSAgKi8KKworLyoKKyAgQXJndW1lbnQgaXMgYSBjaGFyYWN0ZXIgc3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgZmlsZXNwZWNzLgorICBUaGlzIGZ1bmN0aW9uIGJyZWFrcyB0aGUgc3RyaW5nIGFwYXJ0IGludG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMsIG9uZQorICB0byBlYWNoIGZpbGVzcGVjLCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGVzcGVjcy4gIFVzZWQgYnkgc2VydmVyCisgIHdoZW4gaXQgcmVjZWl2ZXMgYSBHRVQgY29tbWFuZCB0byBhbGxvdyBpdCB0byBwcm9jZXNzIG11bHRpcGxlIGZpbGUKKyAgc3BlY2lmaWNhdGlvbnMgaW4gb25lIHRyYW5zYWN0aW9uLiAgU2V0cyBjbWxpc3QgdG8gcG9pbnQgdG8gYSBsaXN0IG9mCisgIGZpbGUgcG9pbnRlcnMsIGV4YWN0bHkgYXMgaWYgdGhleSB3ZXJlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisKKyAgVGhpcyB2ZXJzaW9uIG9mIGZucGFyc2UgdHJlYXRzIHNwYWNlcyBhcyBmaWxlbmFtZSBzZXBhcmF0b3JzLiAgSWYgeW91cgorICBvcGVyYXRpbmcgc3lzdGVtIGFsbG93cyBzcGFjZXMgaW4gZmlsZW5hbWVzLCB5b3UnbGwgbmVlZCBhIGRpZmZlcmVudAorICBzZXBhcmF0b3IuCisKKyAgVGhpcyB2ZXJzaW9uIG9mIGZucGFyc2UgbWFsbG9jcyBhIHN0cmluZyBidWZmZXIgdG8gY29udGFpbiB0aGUgbmFtZXMuICBJdAorICBjYW5ub3QgYXNzdW1lIHRoYXQgdGhlIHN0cmluZyB0aGF0IGlzIHBvaW50ZWQgdG8gYnkgdGhlIGFyZ3VtZW50IGlzIHNhZmUuCisqLworaW50CitmbnBhcnNlKHN0cmluZykgY2hhciAqc3RyaW5nOyB7CisgICAgY2hhciAqcCwgKnMsICpxOworICAgIGludCByID0gMCwgeDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBjb2RlICovCisjaWZkZWYgUkVDVVJTSVZFCisgICAgZGVidWcoRjExMSwiZm5wYXJzZSIsc3RyaW5nLHJlY3Vyc2l2ZSk7CisjZW5kaWYgLyogUkVDVVJTSVZFICovCisKKyAgICBpZiAobWdidWZwKSBmcmVlKG1nYnVmcCk7ICAgICAgICAgICAvKiBGcmVlIHRoaXMgZnJvbSBsYXN0IHRpbWUuICovCisgICAgbWdidWZwID0gbWFsbG9jKChpbnQpc3RybGVuKHN0cmluZykrMik7CisgICAgaWYgKCFtZ2J1ZnApIHsKKyAgICAgICAgZGVidWcoRjEwMCwiZm5wYXJzZSBtYWxsb2MgZXJyb3IiLCIiLDApOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2lmbmRlZiBOT0lDUAorI2lmbmRlZiBOT1NQTAorICAgIGNrc3RybmNweShmc3BlYyxzdHJpbmcsZnNwZWNsZW4pOyAgIC8qIE1ha2UgY29weSBmb3IgXHYoZmlsZXNwZWMpICovCisjZW5kaWYgLyogTk9TUEwgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworICAgIHMgPSBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IHN0cmluZyAqLworICAgIHAgPSBxID0gbWdidWZwOyAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIHRoZSBjb3B5ICovCisgICAgciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBvdXIgcmV0dXJuIGNvZGUgKi8KKyAgICB3aGlsZSAoKnMgPT0gU1AgfHwgKnMgPT0gSFQpICAgICAgICAvKiBTa2lwIGxlYWRpbmcgc3BhY2VzIGFuZCB0YWJzICovCisgICAgICBzKys7CisgICAgZm9yICh4ID0gc3RybGVuKHMpOyAgICAgICAgICAgICAgICAgLyogU3RyaXAgdHJhaWxpbmcgc3BhY2VzICovCisgICAgICAgICAoeCA+IDEpICYmIChzW3gtMV0gPT0gU1AgfHwgc1t4LTFdID09IEhUKTsKKyAgICAgICAgIHgtLSkKKyAgICAgIHNbeC0xXSA9IE5VTDsKKyAgICB3aGlsZSAoMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb29wIHRocm91Z2ggcmVzdCBvZiBzdHJpbmcgKi8KKyAgICAgICAgaWYgKCpzID09IENNRFEpIHsgICAgICAgICAgICAgICAvKiBCYWNrc2xhc2ggKHF1b3RlIGNoYXJhY3Rlcik/ICovCisgICAgICAgICAgICBpZiAoKHggPSB4eGVzYygmcykpID4gLTEpIHsgLyogR28gaW50ZXJwcmV0IGl0LiAqLworICAgICAgICAgICAgICAgICpxKysgPSAoY2hhcikgeDsgICAgICAgIC8qIE51bWVyaWMgYmFja3NsYXNoIGNvZGUsIG9rICovCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogSnVzdCBsZXQgaXQgcXVvdGUgbmV4dCBjaGFyICovCisgICAgICAgICAgICAgICAgcysrOyAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHBhc3QgdGhlIGJhY2tzbGFzaCAqLworICAgICAgICAgICAgICAgICpxKysgPSAqcysrOyAgICAgICAgICAgIC8qIGRlcG9zaXQgbmV4dCBjaGFyICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmICgqcyA9PSBTUCB8fCAqcyA9PSBOVUwpIHsgLyogVW5xdW90ZWQgc3BhY2Ugb3IgTlVMPyAqLworICAgICAgICAgICAgKnErKyA9IE5VTDsgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBvdXRwdXQgZmlsZW5hbWUuICovCisgICAgICAgICAgICBtc2ZpbGVzW3JdID0gcDsgICAgICAgICAgICAgLyogQWRkIHRoaXMgZmlsZW5hbWUgdG8gdGhlIGxpc3QgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImZucGFyc2UiLG1zZmlsZXNbcl0scik7CisgICAgICAgICAgICByKys7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ291bnQgaXQgKi8KKyAgICAgICAgICAgIGlmICgqcyA9PSBOVUwpIGJyZWFrOyAgICAgICAvKiBFbmQgb2Ygc3RyaW5nPyAqLworICAgICAgICAgICAgd2hpbGUgKCpzID09IFNQKSBzKys7ICAgICAgIC8qIFNraXAgcmVwZWF0ZWQgc3BhY2VzICovCisgICAgICAgICAgICBwID0gcTsgICAgICAgICAgICAgICAgICAgICAgLyogU3RhcnQgb2YgbmV4dCBuYW1lICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlICpxKysgPSAqczsgICAgICAgICAgICAgICAvKiBPdGhlcndpc2UgY29weSB0aGUgY2hhcmFjdGVyICovCisgICAgICAgIHMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV4dCBpbnB1dCBjaGFyYWN0ZXIgKi8KKyAgICB9CisgICAgZGVidWcoRjEwMSwiZm5wYXJzZSByIiwiIixyKTsKKyAgICBtc2ZpbGVzW3JdID0gIiI7ICAgICAgICAgICAgICAgICAgICAvKiBQdXQgZW1wdHkgc3RyaW5nIGF0IGVuZCBvZiBsaXN0ICovCisgICAgY21saXN0ID0gbXNmaWxlczsKKyAgICByZXR1cm4ocik7Cit9CisjZW5kaWYgLyogTk9NU0VORCAqLworCitjaGFyICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGJjaHIoKSBmb3IgREVCVUcgU0VTU0lPTiAqLworZGJjaHIoYykgaW50IGM7IHsKKyAgICBzdGF0aWMgY2hhciBzWzhdOworICAgIGNoYXIgKmNwID0gczsKKworICAgIGMgJj0gMHhmZjsKKyAgICBpZiAoYyAmIDB4ODApIHsgICAgICAgICAgICAgICAgICAgICAvKiA4dGggYml0IG9uICovCisgICAgICAgICpjcCsrID0gJ34nOworICAgICAgICBjICY9IDB4N2Y7CisgICAgfQorICAgIGlmIChjIDwgU1ApIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgY2hhcmFjdGVyICovCisgICAgICAgICpjcCsrID0gJ14nOworICAgICAgICAqY3ArKyA9IChjaGFyKSBjdGwoYyk7CisgICAgfSBlbHNlIGlmIChjID09IERFTCkgeworICAgICAgICAqY3ArKyA9ICdeJzsKKyAgICAgICAgKmNwKysgPSAnPyc7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpbnRpbmcgY2hhcmFjdGVyICovCisgICAgICAgICpjcCsrID0gKGNoYXIpIGM7CisgICAgfQorICAgICpjcCA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSBzdHJpbmcgKi8KKyAgICBjcCA9IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gcG9pbnRlciB0byBpdCAqLworICAgIHJldHVybihjcCk7Cit9CisKKy8qICBDIEsgSCBPIFMgVCAgLS0gIEdldCBuYW1lIG9mIGxvY2FsIGhvc3QgKHdoZXJlIEMtS2VybWl0IGlzIHJ1bm5pbmcpICAqLworCisvKgorICBDYWxsIHdpdGggcG9pbnRlciB0byBidWZmZXIgdG8gcHV0IGhvc3RuYW1lIGluLCBhbmQgbGVuZ3RoIG9mIGJ1ZmZlci4KKyAgQ29waWVzIGhvc3RuYW1lIGludG8gYnVmZmVyIG9uIHN1Y2Nlc3MsIHB1dHMgbnVsbCBzdHJpbmcgaW4gYnVmZmVyIG9uCisgIGZhaWx1cmUuCisqLworI2lmZGVmIEJTRDQ0CisjZGVmaW5lIEJTRDQKKyN1bmRlZiBBVFRTVgorI2VuZGlmIC8qIEJTRDQ0ICovCisKKyNpZmRlZiBTVk9SUE9TSVgKKyNpZm5kZWYgQlNENDQKKyNpZm5kZWYgYXBvbGxvCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNlbmRpZiAvKiBhcG9sbG8gKi8KKyNlbmRpZiAvKiBCU0Q0NCAqLworI2Vsc2UKKyNpZmRlZiBCRUxMVjEwCisjaW5jbHVkZSA8dXRzbmFtZS5oPgorI2VuZGlmIC8qIEJFTExWMTAgKi8KKyNlbmRpZiAvKiBTVk9SUE9TSVgqLworCisjaWZkZWYgQ0tTWVNMT0cKK2V4dGVybiBjaGFyIHVpZGJ1ZltdLCAqIGNsaWVudGhvc3Q7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKworVk9JRAorY2tob3N0KHZ2YnVmLHZ2bGVuKSBjaGFyICogdnZidWY7IGludCB2dmxlbjsgeworCisjaWZuZGVmIE5PUFVTSAorICAgIGV4dGVybiBpbnQgbm9wdXNoOworI2lmbmRlZiBOT1NFUlZFUgorICAgIGV4dGVybiBpbnQgZW5faG9zOworI2VuZGlmIC8qIE5PU0VSVkVSICovCisjZW5kaWYgLyogTk9QVVNIICovCisKKyNpZmRlZiBwZHAxMQorICAgICp2dmJ1ZiA9IE5VTDsKKyNlbHNlICAvKiBFdmVyeXRoaW5nIGVsc2UgLSByZXN0IG9mIHRoaXMgcm91dGluZSAqLworCisgICAgY2hhciAqZzsKKyAgICBpbnQgaGF2ZWZ1bGwgPSAwOworI2lmZGVmIFZNUworICAgIGludCB4OworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgU1ZPUlBPU0lYCisjaWZuZGVmIEJTRDQ0CisjaWZuZGVmIF8zODZCU0QKKyNpZm5kZWYgQVBPTExPU1IxMAorICAgIHN0cnVjdCB1dHNuYW1lIGhuYW1lOworI2VuZGlmIC8qIEFQT0xMT1NSMTAgKi8KKyNlbmRpZiAvKiBfMzg2QlNEICovCisjZW5kaWYgLyogQlNENDQgKi8KKyNlbmRpZiAvKiBTVk9SUE9TSVggKi8KKyNpZmRlZiBkYXRhZ2VuZXJhbAorICAgIGludCBhYzAgPSAoY2hhciAqKSB2dmJ1ZiwgYWMxID0gLTEsIGFjMiA9IDA7CisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKworI2lmbmRlZiBOT1BVU0gKKyAgICBpZiAoZ2V0ZW52KCJDS19OT1BVU0giKSkgeyAgICAgICAgICAvKiBObyBzaGVsbCBhY2Nlc3MgYWxsb3dlZCAqLworICAgICAgICBub3B1c2ggPSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIG9uIHRoaXMgaG9zdC4uLiAqLworI2lmbmRlZiBOT1NFUlZFUgorICAgICAgICBlbl9ob3MgPSAwOworI2VuZGlmIC8qIE5PU0VSVkVSICovCisgICAgfQorI2VuZGlmIC8qIE5PUFVTSCAqLworCisgICAgKnZ2YnVmID0gTlVMOyAgICAgICAgICAgICAgICAgICAgICAgLyogSG93IGxldCdzIGdldCBvdXIgaG9zdCBuYW1lIC4uLiAqLworCisjaWZuZGVmIEJFTExWMTAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9lcyBub3QgaGF2ZSBnZXRob3N0bmFtZSgpICovCisjaWZuZGVmIE9YT1MKKyNpZmRlZiBTVk9SUE9TSVgKKyNpZmRlZiBBUE9MTE9TUjEwCisgICAgY2tzdHJuY3B5KHZ2YnVmLCJBcG9sbG8iLHZ2bGVuKTsKKyNlbHNlCisjaWZkZWYgQlNENDQKKyAgICBpZiAoZ2V0aG9zdG5hbWUodnZidWYsdnZsZW4pIDwgMCkKKyAgICAgICp2dmJ1ZiA9IE5VTDsKKyNlbHNlCisjaWZkZWYgXzM4NkJTRAorICAgIGlmIChnZXRob3N0bmFtZSh2dmJ1Zix2dmxlbikgPCAwKSAqdnZidWYgPSBOVUw7CisjZWxzZQorI2lmZGVmIFFOWAorI2lmZGVmIFRDUFNPQ0tFVAorICAgIGlmIChnZXRob3N0bmFtZSh2dmJ1Zix2dmxlbikgPCAwKSAqdnZidWYgPSBOVUw7CisjZWxzZQorICAgIGlmICh1bmFtZSgmaG5hbWUpID4gLTEpIGNrc3RybmNweSh2dmJ1ZixobmFtZS5ub2RlbmFtZSx2dmxlbik7CisjZW5kaWYgLyogVENQU09DS0VUICovCisjZWxzZSAvKiBTVk9SUE9TSVggYnV0IG5vdCBfMzg2QlNEIG9yIEJTRDQ0ICovCisjaWZkZWYgX19pYTY0X18KKyAgICBpZiAodW5hbWUoJmhuYW1lKSA+IC0xKSBja3N0cm5jcHkodnZidWYsaG5hbWUubm9kZW5hbWUsdnZsZW4pOworI2Vsc2UKKyAgICBpZiAodW5hbWUoJmhuYW1lKSA+IC0xKSB7CisJY2hhciAqIHA7CisJcCA9IGhuYW1lLm5vZGVuYW1lOworI2lmZGVmIFRDUFNPQ0tFVAorI2lmbmRlZiBOT0NLR0VURlFIT1NUCisJaWYgKCFja3N0cmNocihwLCcuJykpCisJICBwID0gKGNoYXIgKilja2dldGZxaG9zdG5hbWUocCk7CisjZW5kaWYgLyogTk9DS0dFVEZRSE9TVCAqLworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworCWlmICghcCkgcCA9ICIiOworCWlmICghKnApIHAgPSAiKHVua25vd24pIjsKKwlja3N0cm5jcHkodnZidWYscCx2dmxlbik7CisgICAgfQorI2VuZGlmIC8qIF9faWE2NF9fICovCisjZW5kaWYgLyogUU5YICovCisjZW5kaWYgLyogXzM4NkJTRCAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisjZW5kaWYgLyogQVBPTExPU1IxMCAqLworI2Vsc2UgLyogIVNWT1JQT1NJWCAqLworI2lmZGVmIEJTRDQKKyAgICBpZiAoZ2V0aG9zdG5hbWUodnZidWYsdnZsZW4pIDwgMCkgKnZ2YnVmID0gTlVMOworI2Vsc2UgLyogIUJTRDQgKi8KKyNpZmRlZiBWTVMKKyAgICBnID0gZ2V0ZW52KCJTWVMkTk9ERSIpOworICAgIGlmIChnKSBja3N0cm5jcHkodnZidWYsZyx2dmxlbik7CisgICAgeCA9IChpbnQpc3RybGVuKHZ2YnVmKTsKKyAgICBpZiAoeCA+IDEgJiYgdnZidWZbeC0xXSA9PSAnOicgJiYgdnZidWZbeC0yXSA9PSAnOicpIHZ2YnVmW3gtMl0gPSBOVUw7CisjZWxzZQorI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgaWYgKHN5cygkSE5BTUUsJmFjMCwmYWMxLCZhYzIpID09IDApIC8qIHN1Y2Nlc3NmdWwgKi8KKyAgICAgICAgdnZsZW4gPSBhYzIgKyAxOyAgICAgICAgICAgICAgICAvKiBlbmggLSBoYXZlIHRvIGFkZCBvbmUgKi8KKyNlbHNlCisjaWZkZWYgT1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT1MvMiAqLworICAgIGcgPSBvczJfZ2V0aG9zdG5hbWUoKTsKKyAgICBpZiAoZykgY2tzdHJuY3B5KHZ2YnVmLGcsdnZsZW4pOworI2Vsc2UgLyogT1MyICovCisjaWZkZWYgT1NLCisjaWZkZWYgVENQU09DS0VUCisgICAgICAgIGlmIChnZXRob3N0bmFtZSh2dmJ1ZiwgdnZsZW4pIDwgMCkgKnZ2YnVmID0gTlVMOworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogQlNENCAqLworI2VuZGlmIC8qIFNWT1JQT1NJWCAqLworI2Vsc2UgLyogT1hPUyAqLworICAgIC8qIElmIFRDUC9JUCBpcyBub3QgaW5zdGFsbGVkLCBnZXRob3N0bmFtZSgpIGZhaWxzLCB1c2UgdW5hbWUoKSAqLworICAgIGlmIChnZXRob3N0bmFtZSh2dmJ1Zix2dmxlbikgPCAwKSB7CisgICAgICAgIGlmICh1bmFtZSgmaG5hbWUpID4gLTEpCisgICAgICAgICAgICBja3N0cm5jcHkodnZidWYsaG5hbWUubm9kZW5hbWUsdnZsZW4pOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqdnZidWYgPSBOVUw7CisgICAgfQorI2VuZGlmIC8qIE9YT1MgKi8KKyNlbmRpZiAvKiBCRUxMVjEwICovCisgICAgaWYgKCp2dmJ1ZiA9PSBOVUwpIHsgICAgICAgICAgICAgICAgLyogSWYgaXQncyBzdGlsbCBlbXB0eSAqLworICAgICAgICBnID0gZ2V0ZW52KCJIT1NUIik7ICAgICAgICAgICAgIC8qIHRyeSB0aGlzICovCisgICAgICAgIGlmIChnKSBja3N0cm5jcHkodnZidWYsZyx2dmxlbik7CisgICAgfQorICAgIHZ2YnVmW3Z2bGVuLTFdID0gTlVMOyAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSByZXN1bHQgaXMgdGVybWluYXRlZC4gKi8KKyNlbmRpZiAvKiBwZHAxMSAqLworfQorI2lmZGVmIEJTRDQ0CisjdW5kZWYgQlNENAorI2RlZmluZSBBVFRTVgorI2VuZGlmIC8qIEJTRDQ0ICovCisKKy8qCisgIEEgUyBLIE0gTyBSIEUgIC0tICBQb29yIHBlcnNvbidzICJtb3JlIi4KKyAgUmV0dXJucyAwIGlmIG5vIG1vcmUsIDEgaWYgbW9yZSB3YW50ZWQuCisqLworaW50Cithc2ttb3JlKCkgeworICAgIGNoYXIgYzsKKyAgICBpbnQgcnYsIGN4OworI2lmZGVmIElLU0QKKyAgICBleHRlcm4gaW50IHRpbWVsaW1pdDsKKyNlbmRpZiAvKiBJS1NEICovCisjaWZkZWYgSUtTRENPTkYKKyAgICBleHRlcm4gaW50IGlrc2RjZjsKKyNlbmRpZiAvKiBJS1NEQ09ORiAqLworI2lmZGVmIENLX0FQQworICAgIGV4dGVybiBpbnQgYXBjc3RhdHVzLCBhcGNhY3RpdmU7CisjZW5kaWYgLyogQ0tfQVBDICovCisKKyNpZmRlZiBOT0lDUAorICAgIHJldHVybigxKTsKKyNlbHNlCisgICAgaWYgKCF4YXNrbW9yZSkKKyAgICAgIHJldHVybigxKTsKKyNpZmRlZiBJS1NEQ09ORgorICAgIGlmIChpbnNlcnZlciAmJiAhaWtzZGNmKQorICAgICAgcmV0dXJuKDEpOworI2VuZGlmIC8qIElLU0RDT05GICovCisjaWZkZWYgQ0tfQVBDCisgICAgaWYgKGFwY2FjdGl2ZSA9PSBBUENfTE9DQUwgfHwKKyAgICAgICAgKGFwY2FjdGl2ZSA9PSBBUENfUkVNT1RFICYmIChhcGNzdGF0dXMgJiBBUENfTk9JTlApKSkKKyAgICAgICAgcmV0dXJuKDEpOworI2VuZGlmIC8qIENLX0FQQyAqLworI2lmZGVmIFZNUworICAgIGlmIChiYXRjaCkKKyAgICAgIHJldHVybigxKTsKKyNlbHNlCisjaWZkZWYgVU5JWAorICAgIGlmIChiYWNrZ3JkKQorICAgICAgcmV0dXJuKDEpOworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBWTVMgKi8KKworI2lmbmRlZiBWTVMKKyAgICBjb25jYigoY2hhcillc2NhcGUpOyAgICAgICAgICAgICAgICAvKiBGb3JjZSBDQlJFQUsgbW9kZS4gKi8KKyNlbmRpZiAvKiBWTVMgKi8KKworICAgIHJ2ID0gLTE7CisgICAgd2hpbGUgKHJ2IDwgMCkgeworI2lmbmRlZiBPUzIKKyAgICAgICAgcHJpbnRmKCJtb3JlPyAiKTsKKyNpZmRlZiBVTklYCisjaWZkZWYgTk9TRVRCVUYKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogTk9TRVRCVUYgKi8KKyNlbmRpZiAvKiBVTklYICovCisjZWxzZQorICAgICAgICBwcmludGYoIm1vcmU/ICIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIElLU0QKKyAgICAgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgICAgICBjeCA9IGNtZGdldGModGltZWxpbWl0KTsKKyAgICAgICAgICAgIGlmIChjeCA8IC0xICYmIHRpbWVsaW1pdCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXG4/SUtTIGlkbGUgdGltZW91dCAtIEdvb2RieWUuXG4iKTsKKyAgICAgICAgICAgICAgICBkb2V4aXQoR09PRF9FWElULDApOworICAgICAgICAgICAgfSBlbHNlIGlmIChjeCA9PSAtMSkgewkvKiBDb25uZWN0aW9uIGxvc3QgKi8KKyAgICAgICAgICAgICAgICBkb2V4aXQoQkFEX0VYSVQsMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjID0gKGNoYXIpIGN4OworICAgICAgICB9IGVsc2UgeworI2VuZGlmIC8qIElLU0QgKi8KKyNpZmRlZiBWTVMKKwkgICAgY29uYmluKChjaGFyKWVzY2FwZSk7CS8qIFByb3RlY3QgYWdhaW5zdCBDdHJsLVogKi8KKwkgICAgY3ggPSBjb25pbmMoMCk7CisJICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7CisjZWxzZQorCSAgICBjeCA9IGNtZGdldGMoMCk7CisjZW5kaWYgLyogVk1TICovCisJICAgIGRlYnVnKEYxMDEsImFza21vcmUgY21kZ2V0YyIsIiIsY3gpOworCSAgICBpZiAoY3ggPT0gRU9GKSB7CisJCWRlYnVnKEYxMDAsImFza21vcmUgRU9GIiwiIiwwKTsKKyNpZmRlZiBWTVMKKwkJYyA9ICdcMDMyJzsKKyNlbHNlCisJCWMgPSAnbic7CisjZW5kaWYgLyogVk1TICovCisJICAgIH0gZWxzZSB7CisJCWMgPSAoY2hhciljeDsKKwkgICAgfQorCSAgICBkZWJ1ZyhGMTAxLCJhc2ttb3JlIGMiLCIiLGMpOworCisjaWZkZWYgSUtTRAorCX0KKyNlbmRpZiAvKiBJS1NEICovCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgIC8qIFllcyAqLworCSAgY2FzZSAncCc6IGNhc2UgJ1AnOiBjYXNlICdnJzogY2FzZSAnRyc6IC8qIFByb2NlZWQgb3IgR28gKi8KKwkgICAgeGFza21vcmUgPSAwOworCSAgICAvKiBmYWxsIHRocnUgb24gcHVycG9zZSAqLworCisgICAgICAgICAgY2FzZSBTUDogY2FzZSAneSc6IGNhc2UgJ1knOiBjYXNlIDAxMjogIGNhc2UgMDE1OgorI2lmZGVmIE9TSworICAgICAgICAgICAgd3JpdGUoMSwgIlwwMTUgICAgICBcMDE1Iiwgc2l6ZW9mICJcMDE1ICAgICAgXDAxNSIgLSAxKTsKKyNlbHNlCisgICAgICAgICAgICBwcmludGYoIlwwMTUgICAgICBcMDE1Iik7CisjZW5kaWYgLyogT1NLICovCisgICAgICAgICAgICBydiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAvKiBObyAqLworICAgICAgICAgIGNhc2UgJ24nOiBjYXNlICdOJzogY2FzZSAncSc6IGNhc2UgJ1EnOgorI2lmZGVmIE9TSworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworI2Vsc2UKKyAgICAgICAgICAgIHByaW50ZigiXDAxNVwwMTIiKTsKKyNlbmRpZiAvKiBPU0sgKi8KKyAgICAgICAgICAgIHJ2ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCSAgY2FzZSAnXDAwMyc6CisJICBjYXNlICdcMDA0JzoKKwkgIGNhc2UgJ1wwMzInOgorI2lmZGVmIE9TSworCSAgICBwcmludGYoIl4lYy4uLlxuIiwgKGMgKyAwMTAwKSk7CisjZWxzZQorCSAgICBwcmludGYoIl4lYy4uLlwwMTVcMDEyIiwgKGMgKyAwMTAwKSk7CisjZW5kaWYgLyogT1NLICovCisJICAgIHJ2ID0gMDsKKwkgICAgYnJlYWs7CisgICAgICAgICAgLyogSW52YWxpZCBhbnN3ZXIgKi8KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZGVidWcoRjExMSwiYXNrbW9yZSIsImludmFsaWQgYW5zd2VyIixjKTsKKyAgICAgICAgICAgIHByaW50ZigiWSBvciBzcGFjZS1iYXIgZm9yIHllcywgTiBmb3Igbm8sIEcgdG8gc2hvdyB0aGUgcmVzdFxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2lmZGVmIE9TMgorICAgICAgICBwcmludGYoIlxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHIiKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogT1MyICovCisgICAgfQorICAgIHJldHVybihydik7CisjZW5kaWYgLyogTk9JQ1AgKi8KK30KKworLyogIFQgUiBBIFAgIC0tICBUZXJtaW5hbCBpbnRlcnJ1cHQgaGFuZGxlciAqLworCitTSUdUWVAKKyNpZmRlZiBDS19BTlNJQwordHJhcChpbnQgc2lnKQorI2Vsc2UKK3RyYXAoc2lnKSBpbnQgc2lnOworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiB0cmFwICovIHsKKyAgICBleHRlcm4gaW50IGJfc2F2ZSwgZl9zYXZlOworI2lmbmRlZiBOT0lDUAorICAgIGV4dGVybiBpbnQgdGltZWxpbWl0OworI2VuZGlmIC8qIE5PSUNQICovCisjaWZkZWYgT1MyCisgICAgZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3RhcnRmbGFnczsKKyNpZm5kZWYgTk9TRVRLRVkKKyAgICBleHRlcm4gaW50IG9zMmdrczsKKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworICAgIGludCBpOworI2VuZGlmIC8qIE9TMiAqLworI2lmbmRlZiBOT1NQTAorICAgIGV4dGVybiBpbnQgaV9hY3RpdmUsIGluc3RhdHVzOworI2VuZGlmIC8qIE5PU1BMICovCisjaWZkZWYgVk1TCisgICAgaW50IGk7IEZJTEUgKmY7CisjZW5kaWYgLyogVk1TICovCisgICAgZXh0ZXJuIGludCB6Y2hrb2QsIHpjaGtpZDsKKyNpZm5kZWYgTk9TUEwKKyAgICBleHRlcm4gaW50IHVua21hY3JvOworI2VuZGlmIC8qIE5PU1BMICovCisKKyAgICBkZWJvayA9IDE7CisjaWZkZWYgTlRTSUcKKyAgICBjb25ub2koKTsKKyNlbmRpZiAvKiBOVFNJRyAqLworI2lmZGVmIF9fRU1YX18KKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfQUNLKTsKKyNlbmRpZgorI2lmZGVmIEdFTURPUworLyogR0VNIGlzIG5vdCByZWVudHJhbnQsIG5vIGkvbyBmcm9tIGludGVycnVwdCBsZXZlbCAqLworICAgIGNrbG9uZ2ptcChjbWpidWYsMSk7ICAgICAgICAgICAgICAgIC8qIEp1bXAgYmFjayB0byBwYXJzZXIgbm93ISAqLworI2VuZGlmIC8qIEdFTURPUyAqLworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisJaWYgKHNpZyA9PSBTSUdJTlQpCisJICBkZWJ1ZyhGMTAxLCJ0cmFwIGNhdWdodCBTSUdJTlQiLCIiLHNpZyk7CisJZWxzZQorCSAgZGVidWcoRjEwMSwidHJhcCBjYXVnaHQgc2lnbmFsIiwiIixzaWcpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgT1MyCisgICAgaWYgKCBzaWcgPT0gU0lHQlJFQUsgJiYgKHN0YXJ0ZmxhZ3MgJiAxMjgpICkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJ0cmFwIGlnbm9yaW5nIFNJR0JSRUFLIiwiIixzaWcpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworCisjaWZuZGVmIE5PSUNQCisgICAgdGltZWxpbWl0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogSW4gY2FzZSB0aW1lZCBBU0sgaW50ZXJydXB0ZWQgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICB1bmttYWNybyA9IDA7CQkJLyogT3IgT05fVU5LTk9XTl9NQUNSTyBpbnRlcnJ1cHRlZC4uICovCisjZW5kaWYgLyogTk9TUEwgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworICAgIHpjaGtvZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9yIGZpbGUgZXhwYW5zaW9uIGludGVycnVwdGVkLi4uICovCisgICAgemNoa2lkID0gMDsKKyAgICBpbnRlcnJ1cHRlZCA9IDE7CisKKyAgICBpZiAod2hhdCAmIFdfQ09OTkVDVCkgewkJLyogQXJlIHdlIGluIENPTk5FQ1QgbW9kZT8gKi8KKy8qCisgIFRoZSBIUCB3b3Jrc3RhdGlvbiBSZXNldCBrZXkgc2VuZHMgc29tZSBraW5kIG9mIHVlYmVyLVNJR0lOVCB0aGF0IGNhbiBub3QKKyAgYmUgU0lHX0lHTm9yZWQsIHNvIHdlIHdpbmQgdXAgaGVyZSBzb21laG93IChldmVuIHRob3VnaCB0aGlzIGlzICpub3QqIHRoZQorICBjdXJyZW50IFNJR0lOVCBoYW5kbGVyKS4gIEp1c3QgcmV0dXJuLgorKi8KKyAgICAgICAgZGVidWcoRjEwMSwidHJhcDogU0lHSU5UIGNhdWdodCBkdXJpbmcgQ09OTkVDVCIsIiIsc2lnKTsKKyAgICAgICAgU0lHUkVUVVJOOworICAgIH0KKyNpZm5kZWYgTk9TUEwKKyAgICBpZiAoaV9hY3RpdmUpIHsgICAgICAgICAgICAgICAgICAgICAvKiBJTlBVVCBjb21tYW5kIHdhcyBhY3RpdmU/ICovCisgICAgICAgIGlfYWN0aXZlID0gMDsgICAgICAgICAgICAgICAgICAgLyogTm90IGFueSBtb3JlLi4uICovCisgICAgICAgIGluc3RhdHVzID0gSU5QX1VJOyAgICAgICAgICAgICAgLyogSU5QVVQgc3RhdHVzID0gVXNlciBJbnRlcnJ1cHRlZCAqLworICAgIH0KKyNlbmRpZiAvKiBOT1NQTCAqLworCisjaWZuZGVmIE5PWEZFUgorICAgIGZ0cmVzZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgZ2xvYmFsIHByb3RvY29sIHNldHRpbmdzICovCisgICAgYmluYXJ5ID0gYl9zYXZlOyAgICAgICAgICAgICAgICAgICAgLyogVGhlbiByZXN0b3JlIHRoZXNlICovCisgICAgZm5jbnYgID0gZl9zYXZlOworICAgIGJ5ZV9hY3RpdmUgPSAwOworICAgIGRpcmFjdGl2ZSA9IDA7CisgICAgY2RhY3RpdmUgPSAwOworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgIHpjbG9zZShaSUZJTEUpOyAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIHdlcmUgdHJhbnNmZXJyaW5nIGEgZmlsZSwgKi8KKyAgICB6Y2xvc2UoWk9GSUxFKTsgICAgICAgICAgICAgICAgICAgICAvKiBjbG9zZSBpdC4gKi8KKyNpZm5kZWYgTk9JQ1AKKyAgICBjbWRzcXVvKGNtZF9xdW90aW5nKTsgICAgICAgICAgICAgICAvKiBJZiBjb21tYW5kIHF1b3Rpbmcgd2FzIHR1cm5lZCBvZmYgKi8KKyNpZmRlZiBDS0xFQVJOCisgICAgeworCWV4dGVybiBGSUxFICogbGVhcm5mcDsKKwlleHRlcm4gaW50IGxlYXJuaW5nOworCWlmIChsZWFybmZwKSB7CisJICAgIGZjbG9zZShsZWFybmZwKTsKKwkgICAgbGVhcm5mcCA9IE5VTEw7CisJICAgIGxlYXJuaW5nID0gMDsKKwl9CisgICAgfQorI2VuZGlmIC8qIENLTEVBUk4gKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworI2lmZGVmIENLX0FQQworICAgIGRlbG1hYygiX2FwY19jb21tYW5kcyIsMSk7CisgICAgYXBjYWN0aXZlID0gQVBDX0lOQUNUSVZFOworI2VuZGlmIC8qIENLX0FQQyAqLworCisjaWZkZWYgVk1TCisvKgorICBGaXggdGVybWluYWwuCisqLworICAgIGlmIChmdF93aW4pIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGN1cnNlcyB3aW5kb3cgb3BlbiAqLworICAgICAgICBkZWJ1ZyhGMTAwLCJeQyB0cmFwKCkgY3Vyc2VzIiwiIiwwKTsKKyAgICAgICAgeHhzY3JlZW4oU0NSX0NXLDAsMEwsIiIpOyAgICAgICAvKiBDbG9zZSBpdCAqLworICAgICAgICBjb25yZXMoKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgdGVybWluYWwgKi8KKyAgICAgICAgaSA9IHByaW50ZigiXkMuLi4iKTsgICAgICAgICAgICAvKiBFY2hvIF5DIHRvIHN0YW5kYXJkIG91dHB1dCAqLworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnJlcygpOworICAgICAgICBpID0gcHJpbnRmKCJeQy4uLlxuIik7ICAgICAgICAgIC8qIEVjaG8gXkMgdG8gc3RhbmRhcmQgb3V0cHV0ICovCisgICAgfQorICAgIGlmIChpIDwgMSAmJiBmZXJyb3Ioc3Rkb3V0KSkgeyAgICAgIC8qIElmIHRoZXJlIHdhcyBhbiBlcnJvciAqLworICAgICAgICBkZWJ1ZyhGMTAwLCJeQyB0cmFwKCkgZXJyb3IiLCIiLDApOworICAgICAgICBmY2xvc2Uoc3Rkb3V0KTsgICAgICAgICAgICAgICAgIC8qIGNsb3NlIHN0YW5kYXJkIG91dHB1dCAqLworICAgICAgICBmID0gZm9wZW4oZGZ0dHksICJ3Iik7ICAgICAgICAgIC8qIG9wZW4gdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsICovCisgICAgICAgIGlmIChmKSBzdGRvdXQgPSBmOyAgICAgICAgICAgICAgLyogYW5kIG1ha2UgaXQgc3RhbmRhcmQgb3V0cHV0ICovCisgICAgICAgIHByaW50ZigiXkMuLi5cbiIpOyAgICAgICAgICAgICAgLyogYW5kIGVjaG8gdGhlIF5DIGFnYWluLiAqLworICAgIH0KKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgVk1TICovCisjaWZkZWYgU1RSQVRVUworICAgIGNvbnJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBjb25zb2xlIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjaWZuZGVmIE5PWEZFUgorICAgIGlmIChmdF93aW4pIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGN1cnNlcyB3aW5kb3cgb3BlbiwgKi8KKyAgICAgICAgZGVidWcoRjEwMCwiXkMgdHJhcCgpIGN1cnNlcyIsIiIsMCk7CisgICAgICAgIHh4c2NyZWVuKFNDUl9DVywwLDBMLCIiKTsJLyogY2xvc2UgaXQuICovCisgICAgICAgIHByaW50ZigiXkMuLi4iKTsgICAgICAgICAgICAgICAgLyogRWNobyBeQyB0byBzdGFuZGFyZCBvdXRwdXQgKi8KKyAgICB9IGVsc2UgeworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgICAgICBwcmludGYoIl5DLi4uXG4iKTsKKyNpZm5kZWYgTk9YRkVSCisgICAgfQorI2VuZGlmIC8qIE5PWEZFUiAqLworI2VuZGlmIC8qIFZNUyAqLworI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgY29ubm9pX210KCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogS2lsbCBhc3luY2ggdGFzayB0aGF0IGxpc3RlbnMgdG8gKi8KKyAgICB0dGltb2ZmKCk7CisgICAgY29ucmVzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGtleWJvYXJkICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKworI2lmbmRlZiBOT0NDVFJBUAorLyogIFRoaXMgaXMgc3R1cGlkIC0tIGV2ZXJ5IHZlcnNpb24gc2hvdWxkIGhhdmUgdHRpbW9mZigpLi4uICAqLworI2lmZGVmIFVOSVgKKyAgICB0dGltb2ZmKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUdXJuIG9mZiBhbnkgdGltZXIgaW50ZXJydXB0cyAqLworI2Vsc2UKKyNpZmRlZiBPU0sKKyAgICB0dGltb2ZmKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUdXJuIG9mZiBhbnkgdGltZXIgaW50ZXJydXB0cyAqLworI2Vsc2UKKyNpZmRlZiBTVFJBVFVTCisgICAgdHRpbW9mZigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHVybiBvZmYgYW55IHRpbWVyIGludGVycnVwdHMgKi8KKyNlbHNlCisjaWZkZWYgT1MyCisjaWZuZGVmIE5PU0VUS0VZCisgICAgb3MyZ2tzID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHVybiBiYWNrIG9uIGtleWNvZGUgbWFwcGluZyAgKi8KKyNlbmRpZiAvKiBOT1NFVEtFWSAqLworI2lmbmRlZiBOT0xPQ0FMCisgICAgZm9yIChpID0gMDsgaSA8IFZOVU07IGkrKykKKyAgICAgIFZzY3JuUmVzZXRQb3B1cChpKTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZkZWYgVENQU09DS0VUCisjaWZkZWYgTlQKKyAgICAvKiBXU0FJc0Jsb2NraW5nKCkgcmV0dXJucyBGQUxTRSBpbiBXaW45NSBkdXJpbmcgYSBibG9ja2luZyBhY2NlcHQgY2FsbCAqLworICAgIGlmICggV1NBU2FmZVRvQ2FuY2VsIC8qICYmIFdTQUlzQmxvY2tpbmcoKSAqLyApIHsKKyAgICAgICAgV1NBQ2FuY2VsQmxvY2tpbmdDYWxsKCk7CisgICAgfQorI2VuZGlmIC8qIE5UICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisjaWZkZWYgQ0tfTkVUQklPUworICAgIE5DQkNhbmNlbE91dHN0YW5kaW5nKCk7CisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworICAgIHR0aW1vZmYoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR1cm4gb2ZmIGFueSB0aW1lciBpbnRlcnJ1cHRzICovCisjZWxzZQorI2lmZGVmIFZNUworICAgIHR0aW1vZmYoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR1cm4gb2ZmIGFueSB0aW1lciBpbnRlcnJ1cHRzICovCisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIFVOSVggKi8KKworI2lmZGVmIE9TSworICAgIHNpZ21hc2soLTEpOworLyoKKyAgV2UgYXJlIGluIGFuIGludGVyY2VwdCByb3V0aW5lIGJ1dCBkbyBub3QgcGVyZm9ybSBhIEYkUlRFIChkb25lIGltcGxpY2l0bHkKKyAgYnkgcnRzKS4gIFdlIGhhdmUgdG8gZGVjcmVtZW50IHRoZSBzaWdtYXNrIGFzIEYkUlRFIGRvZXMuICBXYXJuaW5nOiBsb25nanVtcAorICBvbmx5IHJlc3RvcmVzIHRoZSBjcHUgcmVnaXN0ZXJzLCBOT1QgdGhlIGZwdSByZWdpc3RlcnMuICBTbyBkb24ndCB1c2UgZnB1IGF0CisgIGFsbCBvciBhdCBsZWFzdCBkb24ndCB1c2UgY29tbW9uIGZwdSAoZG91YmxlIG9yIGZsb2F0KSByZWdpc3RlciB2YXJpYWJsZXMuCisqLworI2VuZGlmIC8qIE9TSyAqLworCisjaWZkZWYgTlRTSUcKKyAgICBQb3N0Q3RybENTZW0oKTsKKyNlbHNlIC8qIE5UU0lHICovCisgICAgZGVidWcoRjEwMCwidHJhcCBhYm91dCB0byBsb25nam1wIiwiIiwwKTsKKyNpZmRlZiBOVAorICAgIGNrbG9uZ2ptcChja2phZGRyKGNtamJ1ZiksMSk7CisjZWxzZSAvKiBOVCAqLworICAgIGNrbG9uZ2ptcChjbWpidWYsMSk7CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBOVFNJRyAqLworI2Vsc2UgLyogTk9DQ1RSQVAgKi8KKy8qIE5vIEN0cmwtQyB0cmFwLCBqdXN0IGV4aXQuICovCisjaWZkZWYgQ0tfQ1VSU0VTICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3Vyc2VzIHN1cHBvcnQ/ICovCisgICAgeHhzY3JlZW4oU0NSX0NXLDAsMEwsIiIpOyAgICAgICAgICAgLyogQ2xvc2UgY3Vyc2VzIHdpbmRvdyAqLworI2VuZGlmIC8qIENLX0NVUlNFUyAqLworICAgIGRvZXhpdChCQURfRVhJVCx3aGF0KTsgICAgICAgICAgICAgIC8qIEV4aXQgcG9vcmx5ICovCisjZW5kaWYgLyogTk9DQ1RSQVAgKi8KKyAgICBTSUdSRVRVUk47Cit9CisKKworLyogIEMgSyBfIFQgSSBNIEUgIC0tIFJldHVybnMgcG9pbnRlciB0byBjdXJyZW50IHRpbWUuICovCisKK2NoYXIgKgorY2tfdGltZSgpIHsKKyAgICBzdGF0aWMgY2hhciB0YnVmWzEwXTsKKyAgICBjaGFyICpwOworICAgIGludCB4OworCisgICAgenRpbWUoJnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRodSBGZWIgIDggMTI6MDA6MDAgMTk5MCIgKi8KKyAgICBpZiAoIXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaWtlIGFzY3RpbWUoKSEgKi8KKyAgICAgIHJldHVybigiIik7CisgICAgaWYgKCpwKSB7CisgICAgICAgIGZvciAoeCA9IDExOyB4IDwgMTk7IHgrKykgICAgICAgLyogY29weSBoaDptbTpzcyAqLworICAgICAgICAgIHRidWZbeCAtIDExXSA9IHBbeF07ICAgICAgICAgIC8qIHRvIHRidWYgKi8KKyAgICAgICAgdGJ1Zls4XSA9IE5VTDsgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hdGUgKi8KKyAgICB9CisgICAgcmV0dXJuKHRidWYpOyAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHJldHVybiBpdCAqLworfQorCisvKiAgQyBDIF8gQyBMIEUgQSBOICAtLSAgQ2xlYW51cCBhZnRlciB0ZXJtaW5hbCBpbnRlcnJ1cHQgaGFuZGxlciAqLworCisjaWZkZWYgR0VNRE9TCitpbnQKK2NjX2NsZWFuKCkgeworICAgIHpjbG9zZShaSUZJTEUpOyAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIHdlcmUgdHJhbnNmZXJyaW5nIGEgZmlsZSwgKi8KKyAgICB6Y2xvc2UoWk9GSUxFKTsgICAgICAgICAgICAgICAgICAgICAvKiBjbG9zZSBpdC4gKi8KKyAgICBwcmludGYoIl5DLi4uXG4iKTsgICAgICAgICAgICAgICAgICAvKiBOb3QgVk1TLCBubyBwcm9ibGVtLi4uICovCit9CisjZW5kaWYgLyogR0VNRE9TICovCisKKworLyogIFMgVCBQIFQgUiBBIFAgLS0gSGFuZGxlIFNJR1RTVFAgKHN1c3BlbmQpIHNpZ25hbHMgKi8KKworU0lHVFlQCisjaWZkZWYgQ0tfQU5TSUMKK3N0cHRyYXAoaW50IHNpZykKKyNlbHNlCitzdHB0cmFwKHNpZykgaW50IHNpZzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogc3RwdHJhcCAqLyB7CisKKyNpZm5kZWYgTk9KQworICAgIGludCB4OyBleHRlcm4gaW50IGNtZmxnczsKKyAgICBkZWJ1ZyhGMTAxLCJzdHB0cmFwKCkgY2F1Z2h0IHNpZ25hbCIsIiIsc2lnKTsKKyAgICBpZiAoIXhzdXNwZW5kKSB7CisgICAgICAgIHByaW50ZigiXHJcbnN1c3BlbmQgZGlzYWJsZWRcclxuIik7CisjaWZuZGVmIE5PSUNQCisgICAgICAgIGlmICh3aGF0ICYgV19DT01NQU5EKSB7CQkvKiBJZiB3ZSB3ZXJlIHBhcnNpbmcgY29tbWFuZHMgKi8KKyAgICAgICAgICAgIHByb21wdCh4eHN0cmluZyk7ICAgICAgICAgICAvKiByZWlzc3VlIHRoZSBwcm9tcHQgYW5kIHBhcnRpYWwgKi8KKyAgICAgICAgICAgIGlmICghY21mbGdzKSAgICAgICAgICAgICAgICAvKiBjb21tYW5kIChpZiBhbnkpICovCisgICAgICAgICAgICAgIHByaW50ZigiJXMiLGNtZGJ1Zik7CisgICAgICAgIH0KKyNlbmRpZiAvKiBOT0lDUCAqLworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgdGhlIGNvbnNvbGUgKi8KKyNpZm5kZWYgT1MyCisgICAgICAgIC8qIEZsdXNoIHBlbmRpbmcgb3V0cHV0IGZpcnN0LCBpbiBjYXNlIHdlIGFyZSBjb250aW51ZWQgKi8KKyAgICAgICAgLyogaW4gdGhlIGJhY2tncm91bmQsIHdoaWNoIGNvdWxkIG1ha2UgdXMgYmxvY2sgKi8KKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICAgICAgeCA9IHBzdXNwZW5kKHhzdXNwZW5kKTsJCS8qIFRyeSB0byBzdXNwZW5kLiAqLworICAgICAgICBpZiAoeCA8IDApCisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgcHJpbnRmKCJKb2IgY29udHJvbCBub3Qgc3VwcG9ydGVkXHJcbiIpOworICAgICAgICBjb25pbnQodHJhcCxzdHB0cmFwKTsgICAgICAgICAgIC8qIFJlYXJtIHRoZSB0cmFwLiAqLworICAgICAgICBkZWJ1ZyhGMTAwLCJzdHB0cmFwIGJhY2sgZnJvbSBzdXNwZW5kIiwiIiwwKTsKKyAgICAgICAgc3dpdGNoICh3aGF0KSB7CisgICAgICAgICAgY2FzZSBXX0NPTk5FQ1Q6ICAgICAgICAgICAgICAgLyogSWYgc3VzcGVuZGVkIGR1cmluZyBDT05ORUNUPyAqLworICAgICAgICAgICAgY29uYmluKChjaGFyKWVzY2FwZSk7ICAgICAgIC8qIHB1dCBjb25zb2xlIGJhY2sgaW4gYmluYXJ5IG1vZGUgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDAsInN0cHRyYXAgV19DT05ORUNUIiwiIiwwKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmbmRlZiBOT0lDUAorICAgICAgICAgIGNhc2UgV19DT01NQU5EOiAgICAgICAgICAgICAgIC8qIFN1c3BlbmRlZCBpbiBjb21tYW5kIG1vZGUgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInN0cHRyYXAgV19DT01NQU5EIHBmbGFnIiwiIixwZmxhZyk7CisgICAgICAgICAgICBjb25jYigoY2hhcillc2NhcGUpOyAgICAgICAgLyogUHV0IGJhY2sgQ0JSRUFLIHR0eSBtb2RlICovCisgICAgICAgICAgICBpZiAocGZsYWcpIHsgICAgICAgICAgICAgICAgLyogSWYgY29tbWFuZCBwYXJzaW5nIHdhcyAqLworICAgICAgICAgICAgICAgIHByb21wdCh4eHN0cmluZyk7ICAgICAgIC8qIHJlaXNzdWUgdGhlIHByb21wdCBhbmQgcGFydGlhbCAqLworICAgICAgICAgICAgICAgIGlmICghY21mbGdzKSAgICAgICAgICAgIC8qIGNvbW1hbmQgKGlmIGFueSkgKi8KKyAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLGNtZGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT0lDUCAqLworICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBvdGhlciBjYXNlcy4uLiAqLworICAgICAgICAgICAgZGVidWcoRjEwMCwic3RwdHJhcCBkZWZhdWx0IiwiIiwwKTsKKyAgICAgICAgICAgIGNvbmNiKChjaGFyKWVzY2FwZSk7ICAgICAgICAvKiBQdXQgaXQgYmFjayBpbiBDQlJFQUsgbW9kZSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTk9KQyAqLworICAgIFNJR1JFVFVSTjsKK30KKworI2lmZGVmIFRMT0cKKyNkZWZpbmUgVEJVRkwgMzAwCisKKy8qICBUIEwgTyBHICAtLSAgTG9nIGEgcmVjb3JkIGluIHRoZSB0cmFuc2FjdGlvbiBmaWxlICAqLworLyoKKyBDYWxsIHdpdGggYSBmb3JtYXQgYW5kIDMgYXJndW1lbnRzOiB0d28gc3RyaW5ncyBhbmQgYSBudW1iZXI6CisgICBmICAgICAtIEZvcm1hdCwgYSBiaXQgc3RyaW5nIGluIHJhbmdlIDAtNywgYml0IHggaXMgb24sIGFyZyAjeCBpcyBwcmludGVkLgorICAgczEsczIgLSBTdHJpbmcgYXJndW1lbnRzIDAgYW5kIDEuCisgICBuICAgICAtIExvbmcsIGFyZ3VtZW50IDIuCisqLworVk9JRAorI2lmZGVmIENLX0FOU0lDCitkb3Rsb2coaW50IGYsIGNoYXIgKnMxLCBjaGFyICpzMiwgbG9uZyBuKQorI2Vsc2UKK2RvdGxvZyhmLHMxLHMyLG4pIGludCBmOyBsb25nIG47IGNoYXIgKnMxLCAqczI7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGRvdGxvZyAqLyB7CisgICAgc3RhdGljIGNoYXIgc1tUQlVGTF07CisgICAgZXh0ZXJuIGludCB0bG9nZm10OworICAgIGNoYXIgKnNwID0gczsgaW50IHg7CisgICAgaWYgKCFzMSkgczEgPSAiIjsKKyAgICBpZiAoIXMyKSBzMiA9ICIiOworCisgICAgaWYgKCF0cmFsb2cpIHJldHVybjsgICAgICAgICAgICAgICAgLyogSWYgbm8gdHJhbnNhY3Rpb24gbG9nLCBkb24ndCAqLworICAgIGlmICh0bG9nZm10ICE9IDEpIHJldHVybjsKKyAgICBzd2l0Y2ggKGYpIHsKKyAgICAgIGNhc2UgRjAwMDogICAgICAgICAgICAgICAgICAgICAgICAvKiAwIChzcGVjaWFsKSAiczEgbiBzMiIgICovCisgICAgICAgIGlmICgoaW50KXN0cmxlbihzMSkgKyAoaW50KXN0cmxlbihzMikgKyAxNSA+IFRCVUZMKQorICAgICAgICAgIHNwcmludGYoc3AsIj9ULUxvZyBzdHJpbmcgdG9vIGxvbmciKTsKKyAgICAgICAgZWxzZQorCSAgc3ByaW50ZihzcCwiJXMgJWxkICVzIixzMSxuLHMyKTsKKyAgICAgICAgaWYgKHpzb3V0bChaVEZJTEUscykgPCAwKSB0cmFsb2cgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRjAwMTogICAgICAgICAgICAgICAgICAgICAgICAvKiAxLCAiIG4iICovCisgICAgICAgIHNwcmludGYoc3AsIiAlbGQiLG4pOworICAgICAgICBpZiAoenNvdXRsKFpURklMRSxzKSA8IDApIHRyYWxvZyA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGMDEwOiAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIsICJbczJdIiAqLworICAgICAgICB4ID0gKGludClzdHJsZW4oczIpOworICAgICAgICBpZiAoczJbeF0gPT0gJ1xuJykgczJbeF0gPSAnXDAnOworICAgICAgICBpZiAoeCArIDYgPiBUQlVGTCkKKyAgICAgICAgICBzcHJpbnRmKHNwLCI/U3RyaW5nIHRvbyBsb25nIik7CisgICAgICAgIGVsc2Ugc3ByaW50ZihzcCwiWyVzXSIsczIpOworICAgICAgICBpZiAoenNvdXRsKFpURklMRSwiIikgPCAwKSB0cmFsb2cgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRjAxMTogICAgICAgICAgICAgICAgICAgICAgICAvKiAzLCAiW3MyXSBuIiAqLworICAgICAgICB4ID0gKGludClzdHJsZW4oczIpOworICAgICAgICBpZiAoczJbeF0gPT0gJ1xuJykgczJbeF0gPSAnXDAnOworICAgICAgICBpZiAoeCArIDYgPiBUQlVGTCkKKyAgICAgICAgICBzcHJpbnRmKHNwLCI/U3RyaW5nIHRvbyBsb25nIik7CisgICAgICAgIGVsc2Ugc3ByaW50ZihzcCwiWyVzXSAlbGQiLHMyLG4pOworICAgICAgICBpZiAoenNvdXRsKFpURklMRSxzKSA8IDApIHRyYWxvZyA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGMTAwOiAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQsICJzMSIgKi8KKyAgICAgICAgaWYgKHpzb3V0bChaVEZJTEUsczEpIDwgMCkgdHJhbG9nID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEYxMDE6ICAgICAgICAgICAgICAgICAgICAgICAgLyogNSwgInMxOiBuIiAqLworICAgICAgICBpZiAoKGludClzdHJsZW4oczEpICsgMTUgPiBUQlVGTCkKKyAgICAgICAgICBzcHJpbnRmKHNwLCI/U3RyaW5nIHRvbyBsb25nIik7CisgICAgICAgIGVsc2Ugc3ByaW50ZihzcCwiJXM6ICVsZCIsczEsbik7CisgICAgICAgIGlmICh6c291dGwoWlRGSUxFLHMpIDwgMCkgdHJhbG9nID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEYxMTA6ICAgICAgICAgICAgICAgICAgICAgICAgLyogNiwgInMxIHMyIiAqLworICAgICAgICB4ID0gKGludClzdHJsZW4oczIpOworICAgICAgICBpZiAoczJbeF0gPT0gJ1xuJykgczJbeF0gPSAnXDAnOworICAgICAgICBpZiAoKGludClzdHJsZW4oczEpICsgeCArIDQgPiBUQlVGTCkKKyAgICAgICAgICBzcHJpbnRmKHNwLCI/U3RyaW5nIHRvbyBsb25nIik7CisgICAgICAgIGVsc2UKKwkgIHNwcmludGYoc3AsIiVzJXMlcyIsczEsKCgqczIgPT0gJzonKSA/ICIiIDogIiAiKSxzMik7CisgICAgICAgIGlmICh6c291dGwoWlRGSUxFLHMpIDwgMCkgdHJhbG9nID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEYxMTE6ICAgICAgICAgICAgICAgICAgICAgICAgLyogNywgInMxIHMyOiBuIiAqLworICAgICAgICB4ID0gKGludClzdHJsZW4oczIpOworICAgICAgICBpZiAoczJbeF0gPT0gJ1xuJykgczJbeF0gPSAnXDAnOworICAgICAgICBpZiAoKGludClzdHJsZW4oczEpICsgeCArIDE1ID4gVEJVRkwpCisgICAgICAgICAgc3ByaW50ZihzcCwiP1N0cmluZyB0b28gbG9uZyIpOworICAgICAgICBlbHNlCisJICBzcHJpbnRmKHNwLCIlcyVzJXM6ICVsZCIsczEsKCgqczIgPT0gJzonKSA/ICIiIDogIiAiKSxzMixuKTsKKyAgICAgICAgaWYgKHpzb3V0bChaVEZJTEUscykgPCAwKSB0cmFsb2cgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHNwcmludGYoc3AsIj9JbnZhbGlkIGZvcm1hdCBmb3IgdGxvZygpIC0gJWxkIixuKTsKKyAgICAgICAgaWYgKHpzb3V0bChaVEZJTEUscykgPCAwKSB0cmFsb2cgPSAwOworICAgIH0KK30KKworLyoKKyAgRCBPIFggTCBPIEcKKworICBUaGlzIGlzIHRoZSB0cmFuc2FjdGlvbi1sb2cgd3JpdGVyIGZvciBCUklFRiBmb3JtYXQuCisgIFRoZSBpZGVhIGlzIHByb2R1Y2Ugb25lIHJlY29yZCAobGluZSkgcGVyIGZpbGUuICBFYWNoIHJlY29yZAorICBoYXMgdGhlIGZvbGxvd2luZyBkZWxpbWl0ZWQgZmllbGRzOgorICAgIERhdGUgKHl5eXltbWRkKQorICAgIFRpbWUgKGhoOm1tOnNzKQorICAgIEFjdGlvbjogU0VORCBvciBSRUNWCisgICAgRmlsZSBuYW1lCisgICAgRmlsZSBzaXplCisgICAgVHJhbnNmZXIgbW9kZSAodGV4dCwgYmluYXJ5LCBpbWFnZSwgbGFiZWxlZCwgZXRjKS4KKyAgICBTdGF0dXM6IE9LIG9yIEZBSUxFRAorICAgIEZyZWUtZm9ybSBjb21tZW50cyBpbiBkb3VibGVxdW90ZXMKKyAgVGhlIGRlZmF1bHQgc2VwYXJhdG9yIGlzIGNvbW1hLgorICBJZiBhIGZpZWxkIGNvbnRhaW5zIHRoZSBzZXBhcmF0b3IsIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZXF1b3Rlcy4KKyovCitWT0lECisjaWZkZWYgQ0tfQU5TSUMKK2RveGxvZyhpbnQgeCwgY2hhciAqIGZuLCBsb25nIGZzLCBpbnQgZm0sIGludCBzdGF0dXMsIGNoYXIgKiBtc2cpCisjZWxzZQorZG94bG9nKHgsIGZuLCBmcywgZm0sIHN0YXR1cywgbXNnKQorICAgIGludCB4OyBjaGFyICogZm47IGxvbmcgZnM7IGludCBmbTsgaW50IHN0YXR1czsgY2hhciAqIG1zZzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogZG94bG9nICovIHsKKyAgICBleHRlcm4gaW50IHRsb2dzZXA7CisgICAgY2hhciBzZXBbMl07CisgICAgY2hhciBidWZbQ0tNQVhQQVRIKzI1Nl0sICogYnVmcDsKKyAgICBjaGFyIHRtcGJ1ZlszMl07CisgICAgY2hhciAqIHMsICogcDsKKyAgICBpbnQgbGVuLCBsZWZ0LCBmdHAgPSAwLCBrOworCisgICAgaWYgKCF0cmFsb2cpIHJldHVybjsgICAgICAgICAgICAgICAgLyogSWYgbm8gdHJhbnNhY3Rpb24gbG9nLCBkb24ndCAqLworCisgICAgaWYgKCFmbikgZm4gPSAiIjsgICAgICAgICAgICAgICAgICAgLyogUHJvdGVjdCBhZ2FpbnN0IG51bGwgcG9pbnRlcnMgKi8KKyAgICBpZiAoIW1zZykgbXNnID0gIiI7CisgICAgaWYgKHggJiBXX0ZUUCkKKyAgICAgIGZ0cCsrOworCisgICAgc2VwWzBdID0gKGNoYXIpIHRsb2dzZXA7CisgICAgc2VwWzFdID0gTlVMOworICAgIGlmICghc2VwWzBdKSBzZXBbMF0gPSAnLCc7CisKKyAgICBidWZwID0gYnVmOworICAgIGxlZnQgPSBzaXplb2YoYnVmKTsKKyAgICBkZWJ1ZyhGMTAxLCJYWFggZG94bG9nIGxlZnQgMSIsIiIsbGVmdCk7CisKKyAgICBwID0genpuZGF0ZSgpOyAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRlICovCisgICAgY2ttYWttc2coYnVmLCBsZWZ0LCBwID8gcCA6ICIwMDAwMDAwMCIsIHNlcCwgTlVMTCwgTlVMTCk7CisgICAgYnVmcCArPSA5OworICAgIGxlZnQgLT0gOTsKKyAgICBkZWJ1ZyhGMTExLCJYWFggZG94bG9nIGxlZnQgMiIsYnVmLGxlZnQpOworCisgICAgenRpbWUoJnApOworICAgIGNrc3RybmNweShidWZwLHArMTEsbGVmdCk7CisgICAgYnVmcCArPSA4OworICAgIGxlZnQgLT0gODsKKyAgICBkZWJ1ZyhGMTExLCJYWFggZG94bG9nIGxlZnQgMyIsYnVmLGxlZnQpOworCisgICAgaWYgKGZ0cCkgeworCWlmICghKHggJiAoV19TRU5EfFdfUkVDVikpKQorCSAgcmV0dXJuOworCXMgPSAgKHggJiBXX1NFTkQpID8gIlBVVCIgOiAiR0VUIjsKKwlrID0gMzsKKyAgICB9IGVsc2UgeworCXMgPSAgKHggJiBXX1NFTkQpID8gIlNFTkQiIDogIlJFQ1YiOworCWsgPSA0OworICAgIH0KKyAgICBja21ha21zZyhidWZwLGxlZnQsc2VwLHMsc2VwLE5VTEwpOworICAgIGJ1ZnAgKz0gayArIDI7CisgICAgbGVmdCAtPSAoayArIDIpOworICAgIGRlYnVnKEYxMTEsIlhYWCBkb3hsb2cgbGVmdCA0IixidWYsbGVmdCk7CisKKyAgICBzID0gIiI7CisgICAgaWYgKGNrc3RyY2hyKGZuLHNlcFswXSkpCQkvKiBGaWxlbmFtZSAqLworICAgICAgcyA9ICJcIiI7CisgICAgY2ttYWttc2coYnVmcCxsZWZ0LHMsZm4scyxzZXApOworICAgIHNwcmludGYodG1wYnVmLCIlbGQiLGZzKTsgICAgICAgICAgIC8qIFNpemUgKi8KKyAgICBja3N0cm5jYXQoYnVmLHRtcGJ1ZixDS01BWFBBVEgpOworICAgIGNrc3RybmNhdChidWYsc2VwLENLTUFYUEFUSCk7CisgICAgZGVidWcoRjExMCwiZG94bG9nIDQiLGJ1ZiwwKTsKKworI2lmZGVmIE5PSUNQCisgICAgLyogVHJhbnNmZXIgbW9kZSAqLworICAgIGNrc3RybmNweSh0bXBidWYsIChiaW5hcnkgPyAiYmluYXJ5IiA6ICJ0ZXh0IiksIFRNUEJVRlNJWik7CisjZWxzZQorICAgIGNrc3RybmNweSh0bXBidWYsZ2Ztb2RlKGZtLDApLFRNUEJVRlNJWik7CisjZW5kaWYgLyogTk9JQ1AgKi8KKyAgICBpZiAoY2tzdHJjaHIodG1wYnVmLHNlcFswXSkpIHsgICAgICAvKiBNaWdodCBjb250YWluIHNwYWNlcyAqLworICAgICAgICBja3N0cm5jYXQoYnVmLCJcIiIsQ0tNQVhQQVRIKTsKKyAgICAgICAgY2tzdHJuY2F0KGJ1Zix0bXBidWYsQ0tNQVhQQVRIKTsKKyAgICAgICAgY2tzdHJuY2F0KGJ1ZiwiXCIiLENLTUFYUEFUSCk7CisgICAgfSBlbHNlCisgICAgICBja3N0cm5jYXQoYnVmLHRtcGJ1ZixDS01BWFBBVEgpOworICAgIGNrc3RybmNhdChidWYsc2VwLENLTUFYUEFUSCk7CisgICAgZGVidWcoRjExMCwiZG94bG9nIDUiLGJ1ZiwwKTsKKworICAgIGNrc3RybmNhdChidWYsIHN0YXR1cyA/ICJGQUlMRUQiIDogIk9LIixDS01BWFBBVEgpOworICAgIGxlbiA9IHN0cmxlbihidWYpOworICAgIGxlZnQgPSBDS01BWFBBVEgrMjU2IC0gbGVuOworICAgIGlmIChsZWZ0IDwgMikgZmF0YWwoImRveGxvZyBidWZmZXIgb3ZlcmxvdyIpOworCisgICAgZGVidWcoRjExMSwiWFhYIGRveGxvZyBsZWZ0IDUiLGJ1ZixsZWZ0KTsKKworICAgIGRlYnVnKEYxMTAsImRveGxvZyBidWYgMSIsIGJ1ZiwgbGVuKTsKKyAgICBzID0gYnVmICsgbGVuOworICAgIGlmIChzdGF0dXMgPT0gMCAmJiBsZWZ0ID4gMzIpIHsKKyAgICAgICAgbG9uZyBjcHM7CisKKyNpZmRlZiBHRlRJTUVSCisJZGVidWcoRjEwMSwiRE9YTE9HIGZweGZzZWNzIiwiIiwobG9uZykoZnB4ZnNlY3MgKiAxMDAwKSk7CisKKyAgICAgICAgY3BzID0gKGxvbmcpKChDS0ZMT0FUKSBmcyAvIGZweGZzZWNzKTsKKyAgICAgICAgc3ByaW50ZihzLCIlc1wiJTAuM2ZzZWMgJWxkY3BzXCIiLHNlcCxmcHhmc2VjcyxjcHMpOworI2Vsc2UKKyAgICAgICAgY3BzID0gZnMgLyB4ZnNlY3M7CisgICAgICAgIHNwcmludGYocywiJXNcIiVsZHNlYyAlbGRjcHNcIiIsc2VwLHhmc2VjcyxjcHMpOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyAgICB9IGVsc2UgaWYgKChpbnQpc3RybGVuKG1zZykgKyA0IDwgbGVmdCkgeworICAgICAgICBzcHJpbnRmKHMsIiVzXCIlc1wiIixzZXAsbXNnKTsKKyAgICB9CisgICAgZGVidWcoRjExMSwiWFhYIGRveGxvZyBsZWZ0IDUiLGJ1ZixsZWZ0KTsKKworICAgIGRlYnVnKEYxMTAsImRveGxvZyA1IixidWYsMCk7CisgICAgeCA9IHpzb3V0bChaVEZJTEUsYnVmKTsKKyAgICBkZWJ1ZyhGMTAxLCJkb3hsb2cgenNvdXRsIiwiIix4KTsKKyAgICBpZiAoeCA8IDApIHRyYWxvZyA9IDA7Cit9CisjZW5kaWYgLyogVExPRyAqLworCisjaWZuZGVmIE1BQworLyoKKyAgVGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlzIGZvciBhbGwgaW1wbGVtZW50YXRpb25zIGJ1dCB0aGUgTWFjaW50b3NoLgorKi8KKworI2lmZGVmIENLX0NVUlNFUworc3RhdGljIGludCByZXBhaW50ID0gMDsgICAgICAgICAgICAgICAgIC8qIFRyYW5zZmVyIGRpc3BsYXkgbmVlZHMgcmVwYWludGluZyAqLworI2VuZGlmIC8qIENLX0NVUlNFUyAqLworCisjaWZuZGVmIE5PWEZFUgorLyogIEMgSCBLIEkgTiBUICAtLSAgQ2hlY2sgZm9yIGNvbnNvbGUgaW50ZXJydXB0cyAgKi8KKworLyoKKyAgVXNlZCBkdXJpbmcgZmlsZSB0cmFuc2ZlciBpbiBsb2NhbCBtb2RlIG9ubHk6CisgIC4gSWYgdXNlciBoYXMgbm90IHRvdWNoZWQgdGhlIGtleWJvYXJkLCByZXR1cm5zIDAgd2l0aCBubyBzaWRlIGVmZmVjdHMuCisgIC4gSWYgdXNlciB0eXBlZCBTIG9yIEEgKGV0Yywgc2VlIGJlbG93KSBwcmludHMgc3RhdHVzIG1lc3NhZ2UgYW5kIHJldHVybnMgMC4KKyAgLiBJZiB1c2VyIHR5cGVkIFggb3IgRiAoZXRjLCBzZWUgYmVsb3cpIHJldHVybnMgMCB3aXRoIGN4c2VlbiBzZXQgdG8gMS4KKyAgLiBJZiB1c2VyIHR5cGVkIFogb3IgQiAoZXRjLCBzZWUgYmVsb3cpIHJldHVybnMgMCB3aXRoIGN6c2VlbiBzZXQgdG8gMS4KKyAgLiBJZiB1c2VyIHR5cGVkIEUgb3IgQyAoZXRjLCBzZWUgYmVsb3cpIHJldHVybnMgLTEuCisqLworaW50CitjaGtpbnQoKSB7CisgICAgaW50IGNoLCBjbiwgb2ZkOyBsb25nIHp6OworICAgIGlmICgheGZyaW50KQorICAgICAgcmV0dXJuKDApOworICAgIGlmICgoIWxvY2FsKSB8fCAocXVpZXQpKSByZXR1cm4oMCk7IC8qIE9ubHkgZG8gdGhpcyBpZiBsb2NhbCAmIG5vdCBxdWlldCAqLworI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgaWYgKGNvbl9yZWFkc19tdCkgICAgICAgICAgICAgICAgICAgLyogaWYgY29uaW50X210IHRhc2sgaXMgYWN0aXZlICovCisgICAgICBpZiAoY29uaW50X2F2bCkgeyAgICAgICAgICAgICAgICAgLyogYW5kIHRoZXJlJ3MgYW4gaW50ZXJydXB0IHBlbmRpbmcgKi8KKyAgICAgICAgICBjbiA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIGl0ICovCisgICAgICAgICAgY2ggPSBjb25pbnRfY2g7CisgICAgICAgICAgY29uaW50X2F2bCA9IDA7ICAgICAgICAgICAgICAgLyogdHVybiBvZmYgZmxhZyBzbyBjb25pbnRfbXQgY2FuICovCisgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvY2VlZCAqLworICAgICAgICByZXR1cm4oMCk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgY29uaW50X210IG5vdCBhY3RpdmUgKi8KKyAgICAgIGlmICgoY2ggPSBjb25pbmMoMikpIDwgMCkgICAgICAgICAvKiB0cnkgdG8gZ2V0IGNoYXIgbWFudWFsbHkgKi8KKyAgICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgICAvKiBJL08gZXJyb3IsIG9yIG5vIGRhdGEgKi8KKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBzdWNjZXNzZnVsLCBzZXQgY24gc28gd2UgKi8KKyAgICAgICAgY24gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBrbm93IHdlIGdvdCBvbmUgKi8KKyAgICBkZWJ1ZyhGMTAxLCJjaGtpbnQgZ290IGtleWJvYXJkIGNoYXJhY3RlciIsY2gsY24pOworI2Vsc2UgLyogIWRhdGFnZW5lcmFsICovCisjaWZkZWYgTlRTSUcKKyAgICB7CisgICAgICAgIGV4dGVybiBpbnQgVGxzSW5kZXg7CisgICAgICAgIHN0cnVjdCBfdGhyZWFkaW5mbyAqIHRocmVhZGluZm87CisgICAgICAgIHRocmVhZGluZm8gPSAoc3RydWN0IF90aHJlYWRpbmZvICopIFRsc0dldFZhbHVlKFRsc0luZGV4KTsKKyAgICAgICAgaWYgKHRocmVhZGluZm8pIHsKKyAgICAgICAgICAgIGlmICghV2FpdFNlbSh0aHJlYWRpbmZvLT5EaWVTZW0sMCkpCisgICAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgLyogQ2FuY2VsIEltbWVkaWF0ZWx5ICovCisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTlRTSUcgKi8KKyAgICBjbiA9IGNvbmNoaygpOyAgICAgICAgICAgICAgICAgICAgICAvKiBBbnkgaW5wdXQgd2FpdGluZz8gKi8KKyAgICBkZWJ1ZyhGMTAxLCJjb25jaGsiLCIiLGNuKTsKKyAgICBpZiAoY24gPCAxKSByZXR1cm4oMCk7CisgICAgY2ggPSBjb25pbmMoNSkgOworICAgIGRlYnVnKEYxMDEsImNvbmluYyIsIiIsY2gpOworICAgIGlmIChjaCA8IDApIHJldHVybigwKTsKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworCisgICAgY2ggJj0gMDE3NzsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlICdBJzogY2FzZSAnYSc6IGNhc2UgMDAwMTogICAgLyogU3RhdHVzIHJlcG9ydCAqLworICAgICAgY2FzZSAnUyc6IGNhc2UgJ3MnOgorICAgICAgICBpZiAoZmRpc3BsYSAhPSBYWUZEX1IgJiYgZmRpc3BsYSAhPSBYWUZEX1MgJiYgZmRpc3BsYSAhPSBYWUZEX04pCisgICAgICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgLyogT25seSBmb3Igc2VyaWFsLCBzaW1wbGUgb3Igbm9uZSAqLworICAgICAgICBvZmQgPSBmZGlzcGxhOyAgICAgICAgICAgICAgICAgIC8qIFtNRl0gU2F2ZSBmaWxlIGRpc3BsYXkgdHlwZSAqLworICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX04pCisgICAgICAgICAgZmRpc3BsYSA9IFhZRkRfUjsgICAgICAgICAgICAgLyogW01GXSBQcmV0ZW5kIHNlcmlhbCBpZiBubyBkaXNwbGF5ICovCisgICAgICAgIHh4c2NyZWVuKFNDUl9UTiwwLDBsLCJTdGF0dXMgcmVwb3J0OiIpOworICAgICAgICB4eHNjcmVlbihTQ1JfVE4sMCwwbCwiIGZpbGUgdHlwZTogIik7CisgICAgICAgIGlmIChiaW5hcnkpIHsKKyAgICAgICAgICAgIHN3aXRjaChiaW5hcnkpIHsKKyAgICAgICAgICAgICAgY2FzZSBYWUZUX0w6IHh4c2NyZWVuKFNDUl9UWiwwLDBsLCJsYWJlbGVkIik7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFhZRlRfSTogeHhzY3JlZW4oU0NSX1RaLDAsMGwsImltYWdlIik7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFhZRlRfVTogeHhzY3JlZW4oU0NSX1RaLDAsMGwsImJpbmFyeSB1bmRlZmluZWQiKTsgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGNhc2UgWFlGVF9COiB4eHNjcmVlbihTQ1JfVFosMCwwbCwiYmluYXJ5Iik7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworI2lmZGVmIE5PQ1NFVFMKKyAgICAgICAgICAgIHh4c2NyZWVuKFNDUl9UWiwwLDBsLCJ0ZXh0Iik7CisjZWxzZQorICAgICAgICAgICAgeHhzY3JlZW4oU0NSX1RVLDAsMGwsInRleHQsICIpOworICAgICAgICAgICAgaWYgKHRjaGFyc2V0ID09IFRDX1RSQU5TUCB8fCB4ZnJ4bGEgPT0gMCkgeworICAgICAgICAgICAgICAgIHh4c2NyZWVuKFNDUl9UWiwwLDBsLCJ0cmFuc3BhcmVudCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCAmIFdfU0VORCkgeworICAgICAgICAgICAgICAgICAgICB4eHNjcmVlbihTQ1JfVFosMCwwbCx0Y3NpbmZvW3RjaGFyc2V0XS5rZXl3b3JkKTsKKyAgICAgICAgICAgICAgICAgICAgeHhzY3JlZW4oU0NSX1RVLDAsMGwsIiA9PiAiKTsKKyAgICAgICAgICAgICAgICAgICAgeHhzY3JlZW4oU0NSX1RaLDAsMGwsZmNzaW5mb1tmY2hhcnNldF0ua2V5d29yZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeHhzY3JlZW4oU0NSX1RaLDAsMGwsZmNzaW5mb1tmY2hhcnNldF0ua2V5d29yZCk7CisgICAgICAgICAgICAgICAgICAgIHh4c2NyZWVuKFNDUl9UVSwwLDBsLCIgPT4gIik7CisgICAgICAgICAgICAgICAgICAgIHh4c2NyZWVuKFNDUl9UWiwwLDBsLHRjc2luZm9bdGNoYXJzZXRdLmtleXdvcmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgICAgIH0KKyAgICAgICAgeHhzY3JlZW4oU0NSX1FFLDAsZmlsY250LCIgZmlsZSBudW1iZXIiKTsKKyAgICAgICAgaWYgKGZzaXplKSB4eHNjcmVlbihTQ1JfUUUsMCxmc2l6ZSwiIHNpemUiKTsKKyAgICAgICAgeHhzY3JlZW4oU0NSX1FFLDAsZmZjLCIgY2hhcmFjdGVycyBzbyBmYXIiKTsKKyAgICAgICAgaWYgKGZzaXplID4gMEwpIHsKKyNpZmRlZiBDS19SRVNFTkQKKyAgICAgICAgICAgIHp6ID0gd2hhdCAmIFdfU0VORCA/IHNlbmRzdGFydCA6IHdoYXQgJiBXX1JFQ1YgPyByc19sZW4gOiAwOworICAgICAgICAgICAgenogPSAoIChmZmMgKyB6eikgKiAxMDBMICkgLyBmc2l6ZTsKKyNlbHNlCisgICAgICAgICAgICB6eiA9ICggZmZjICogMTAwTCApIC8gZnNpemU7CisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisgICAgICAgICAgICB4eHNjcmVlbihTQ1JfUUUsMCx6eiwgICAgICAiIHBlcmNlbnQgZG9uZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChiY3R1ID09IDQpIHsgICAgICAgICAgICAgICAgLyogQmxvY2sgY2hlY2sgKi8KKyAgICAgICAgICAgIHh4c2NyZWVuKFNDUl9UVSwwLDBMLCIgYmxvY2sgY2hlY2s6ICIpOworICAgICAgICAgICAgeHhzY3JlZW4oU0NSX1RaLDAsMEwsImJsYW5rLWZyZWUtMiIpOworICAgICAgICB9IGVsc2UgeHhzY3JlZW4oU0NSX1FFLDAsKGxvbmcpYmN0dSwgICIgYmxvY2sgY2hlY2siKTsKKyAgICAgICAgeHhzY3JlZW4oU0NSX1FFLDAsKGxvbmcpcnB0ZmxnLCIgY29tcHJlc3Npb24iKTsKKyAgICAgICAgeHhzY3JlZW4oU0NSX1FFLDAsKGxvbmcpZWJxZmxnLCIgOHRoLWJpdCBwcmVmaXhpbmciKTsKKyAgICAgICAgeHhzY3JlZW4oU0NSX1FFLDAsKGxvbmcpbHNjYXB1LCIgbG9ja2luZyBzaGlmdHMiKTsKKyAgICAgICAgaWYgKCFuZXR3b3JrKQorICAgICAgICAgIHh4c2NyZWVuKFNDUl9RRSwwLCBzcGVlZCwgIiBzcGVlZCIpOworICAgICAgICBpZiAod2hhdCAmIFdfU0VORCkKKworICAgICAgICAgIHh4c2NyZWVuKFNDUl9RRSwwLChsb25nKXNwc2l6LCAiIHBhY2tldCBsZW5ndGgiKTsKKyAgICAgICAgZWxzZSBpZiAod2hhdCAmIFdfUkVDViB8fCB3aGF0ICYgV19SRU1PKQorICAgICAgICAgIHh4c2NyZWVuKFNDUl9RRSwwLChsb25nKXVycHNpeiwiIHBhY2tldCBsZW5ndGgiKTsKKyAgICAgICAgeHhzY3JlZW4oU0NSX1FFLDAsKGxvbmcpd3Nsb3RzLCAgIiB3aW5kb3cgc2xvdHMiKTsKKyAgICAgICAgZmRpc3BsYSA9IG9mZDsgLyogW01GXSBSZXN0b3JlIGZpbGUgZGlzcGxheSB0eXBlICovCisgICAgICAgIHJldHVybigwKTsKKworICAgICAgY2FzZSAnQic6IGNhc2UgJ2InOiBjYXNlIDAwMDI6ICAgIC8qIENhbmNlbCBiYXRjaCAqLworICAgICAgY2FzZSAnWic6IGNhc2UgJ3onOiBjYXNlIDAwMzI6CisgICAgICAgIGN6c2VlbiA9IDE7CisgICAgICAgIGludGVycnVwdGVkID0gMTsKKyAgICAgICAgeHhzY3JlZW4oU0NSX1NULFNUX01TRywwbCwKKyAgICAgICAgICAgICAgICAgKCgod2hhdCAmIFdfUkVDVikgJiYgKHdzbG90cyA+IDEpKSA/CisgICAgICAgICAgICAgICAgICAiQ2FuY2VsaW5nIGJhdGNoLCB3YWl0Li4uICIgOgorICAgICAgICAgICAgICAgICAgIkNhbmNlbGluZyBiYXRjaC4uLiAiKQorICAgICAgICAgICAgICAgICApOworICAgICAgICByZXR1cm4oMCk7CisKKyAgICAgIGNhc2UgJ0YnOiBjYXNlICdmJzogY2FzZSAwMDA2OiAgICAvKiBDYW5jZWwgZmlsZSAqLworICAgICAgY2FzZSAnWCc6IGNhc2UgJ3gnOiBjYXNlIDAwMzA6CisgICAgICAgIGN4c2VlbiA9IDE7CisgICAgICAgIGludGVycnVwdGVkID0gMTsKKyAgICAgICAgeHhzY3JlZW4oU0NSX1NULFNUX01TRywwbCwKKyAgICAgICAgICAgICAgICAgKCgod2hhdCAmIFdfUkVDVikgJiYgKHdzbG90cyA+IDEpKSA/CisgICAgICAgICAgICAgICAgICAiQ2FuY2VsaW5nIGZpbGUsIHdhaXQuLi4gIiA6CisgICAgICAgICAgICAgICAgICAiQ2FuY2VsaW5nIGZpbGUuLi4gIikKKyAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuKDApOworCisgICAgICBjYXNlICdSJzogY2FzZSAncic6IGNhc2UgMDAyMjogICAgLyogUmVzZW5kIHBhY2tldCAqLworICAgICAgY2FzZSAwMDE1OiBjYXNlIDAwMTI6CisjaWZkZWYgU1RSRUFNSU5HCisgICAgICAgIGlmIChzdHJlYW1pbmcpCisgICAgICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIFNUUkVBTUlORyAqLworICAgICAgICB4eHNjcmVlbihTQ1JfU1QsU1RfTVNHLDBsLCJSZXNlbmRpbmcgcGFja2V0Li4uICIpOworICAgICAgICBudW1lcnJzKys7CisgICAgICAgIHJlc2VuZCh3aW5sbyk7CisgICAgICAgIHJldHVybigwKTsKKworI2lmZGVmIGRhdGFnZW5lcmFsCisgICAgICBjYXNlICdcMDMnOiAgICAgICAgICAgICAgICAgICAgICAgLyogV2UncmUgbm90IHRyYXBwaW5nIF5DJ3Mgd2l0aCAqLworICAgICAgICB0cmFwKDApOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpZ25hbHMsIHNvIHdlIGNoZWNrIGhlcmUgICAgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworCisgICAgICBjYXNlICdDJzogY2FzZSAnYyc6ICAgICAgICAgICAgICAgLyogQ3RybC1DICovCisjaWZuZGVmIGRhdGFnZW5lcmFsCisgICAgICBjYXNlICdcMDMnOgorI2VuZGlmIC8qIGRhdGFnZW5lcmFsICovCisKKyAgICAgIGNhc2UgJ0UnOiBjYXNlICdlJzogICAgICAgICAgICAgICAvKiBTZW5kIGVycm9yIHBhY2tldCAqLworICAgICAgY2FzZSAwMDA1OgorICAgICAgICBpbnRlcnJ1cHRlZCA9IDE7CisgICAgICAgIHJldHVybigtMSk7CisKKyNpZmRlZiBDS19DVVJTRVMKKyAgICAgIGNhc2UgMDAxNDogICAgICAgICAgICAgICAgICAgICAgICAvKiBDdHJsLUwgdG8gcmVmcmVzaCBzY3JlZW4gKi8KKyAgICAgIGNhc2UgJ0wnOiBjYXNlICdsJzogICAgICAgICAgICAgICAvKiBBbHNvIGFjY2VwdCBMICh1cHBlciwgbG93ZXIpICovCisgICAgICBjYXNlIDAwMjc6ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3RybC1XIHN5bm9ueW0gZm9yIFZNUyAmIEluZ3JlcyAqLworICAgICAgICByZXBhaW50ID0gMTsKKyAgICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIENLX0NVUlNFUyAqLworCisgICAgICBjYXNlICdUJzoKKyAgICAgIGNhc2UgJ3QnOgkJCQkvKiBUdXJuIG9uIGRlYnVnLWxvZyB0aW1lc3RhbXBzICovCisjaWZkZWYgREVCVUcKKwl7CisJICAgIGV4dGVybiBpbnQgZGVidGltOworCSAgICBpZiAoY2ggPT0gJ1QnKSB7CisJCWRlYnRpbSA9IDE7CisJCXh4c2NyZWVuKFNDUl9TVCxTVF9NU0csMGwsCisJCQkgIkRlYnVnIHRpbWVzdGFtcHMgT24uLi4gIik7CisJICAgIH0gZWxzZSB7CisJCWRlYnRpbSA9IDE7CisJCXh4c2NyZWVuKFNDUl9TVCxTVF9NU0csMGwsCisJCQkgIkRlYnVnIHRpbWVzdGFtcHMgT2ZmLi4uICIpOworCSAgICB9CisJfQorI2VuZGlmIC8qIERFQlVHICovCisJcmV0dXJuKDApOworCisgICAgICBjYXNlICdEJzoKKyNpZmRlZiBERUJVRworCWlmICghZGVibG9nKSB7CisJICAgIGRlYm9wbigiZGVidWcubG9nIiwwKTsKKwkgICAgaWYgKGRlYmxvZykgeworCQl4eHNjcmVlbihTQ1JfU1QsU1RfTVNHLDBsLCJkZWJ1Zy5sb2cgb3Blbi4uLiAiKTsKKwkgICAgfSBlbHNlIHsKKwkJeHhzY3JlZW4oU0NSX1NULFNUX01TRywwbCwiZGVidWcubG9nIG9wZW4gRkFJTEVELi4uICIpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgeHhzY3JlZW4oU0NSX1NULFNUX01TRywwbCwiRGVidWcgbG9nIE9uLi4uICIpOworCX0KKwlpZiAoZGVibG9nKQorCSAgZGVib2sgPSAxOworI2VuZGlmIC8qIERFQlVHICovCisJcmV0dXJuKDApOworCisgICAgICBjYXNlICdkJzoJCQkJLyogVHVybiBvZmYgZGVidWdnaW5nICovCisjaWZkZWYgREVCVUcKKwlpZiAoZGVibG9nKQorCSAgeHhzY3JlZW4oU0NSX1NULFNUX01TRywwbCwiRGVidWcgbG9nIE9mZi4uLiAiKTsKKwlkZWJvayA9IDA7CisjZW5kaWYgLyogREVCVUcgKi8KKwlyZXR1cm4oMCk7CisKKyAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbnl0aGluZyBlbHNlLCBwcmludCBtZXNzYWdlICovCisgICAgICAgIGludG1zZygxTCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9Cit9CisKKy8qICBJIE4gVCBNIFMgRyAgLS0gIElzc3VlIG1lc3NhZ2UgYWJvdXQgdGVybWluYWwgaW50ZXJydXB0cyAgKi8KKworVk9JRAorI2lmZGVmIENLX0FOU0lDCitpbnRtc2cobG9uZyBuKQorI2Vsc2UKK2ludG1zZyhuKSBsb25nIG47CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGludG1zZyAqLyB7CisjaWZkZWYgQ0tfTkVFRF9TSUcKKyAgICBjaGFyIGJ1Zls4MF07CisjZW5kaWYgLyogQ0tfTkVFRF9TSUcgKi8KKworICAgIGlmICghZGlzcGxhIHx8IHF1aWV0KSAgICAgICAgICAgICAgIC8qIE5vdCBpZiB3ZSdyZSBiZWluZyBxdWlldCAqLworICAgICAgcmV0dXJuOworICAgIGlmIChzZXJ2ZXIgJiYgKCFzcnZkaXMgfHwgbiA+IC0xTCkpIC8qIFNwZWNpYWwgZm9yIHNlcnZlciAqLworICAgICAgcmV0dXJuOworI2lmZGVmIENLX05FRURfU0lHCisgICAgYnVmWzBdID0gTlVMOyAgICAgICAgICAgICAgICAgICAgICAgLyogS2VlcCBjb21waWxlcnMgaGFwcHkgKi8KKyNlbmRpZiAvKiBDS19ORUVEX1NJRyAqLworI2lmbmRlZiBPWE9TCisjaWZkZWYgU1ZPUlBPU0lYCisgICAgY29uY2hrKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgb3V0IHBlbmRpbmcgZXNjYXBlLXNpZ25hbHMgKi8KKyNlbmRpZiAvKiBTVk9SUE9TSVggKi8KKyNlbmRpZiAvKiAhIE9YT1MgKi8KKyNpZmRlZiBWTVMKKyAgICBjb25yZXMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTbyBDdHJsLUMgd2lsbCB3b3JrICovCisjZW5kaWYgLyogVk1TICovCisgICAgaWYgKCghc2VydmVyICYmIG4gPT0gMUwpIHx8IChzZXJ2ZXIgJiYgbiA8IDBMKSkgeworCisjaWZkZWYgQ0tfTkVFRF9TSUcKKyAgICAgICAgaWYgKHhmcmludCkgeworCSAgICBja21ha21zZyhidWYsCisJCSAgICAgODAsCisJCSAgICAgIlR5cGUgZXNjYXBlIGNoYXJhY3RlciAoIiwKKwkJICAgICBkYmNocihlc2NhcGUpLAorCQkgICAgICIpIGZvbGxvd2VkIGJ5OiIsCisJCSAgICAgTlVMTAorCQkgICAgICk7CisgICAgICAgICAgICB4eHNjcmVlbihTQ1JfVE4sMCwwbCxidWYpOworICAgICAgICB9CisjZW5kaWYgLyogQ0tfTkVFRF9TSUcgKi8KKworICAgICAgICBpZiAoeGZyaW50KSB7CisgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gUFJPVE9fSykgeworIHh4c2NyZWVuKFNDUl9UTiwwLDBsLCJYIHRvIGNhbmNlbCBmaWxlLCAgQ1IgdG8gcmVzZW5kIGN1cnJlbnQgcGFja2V0Iik7CisgeHhzY3JlZW4oU0NSX1ROLDAsMGwsIlogdG8gY2FuY2VsIGdyb3VwLCBBIGZvciBzdGF0dXMgcmVwb3J0Iik7CisgeHhzY3JlZW4oU0NSX1ROLDAsMGwsIkUgdG8gc2VuZCBFcnJvciBwYWNrZXQsIEN0cmwtQyB0byBxdWl0IGltbWVkaWF0ZWx5OiAiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgeHhzY3JlZW4oU0NSX1ROLDAsMGwsIkN0cmwtQyB0byBjYW5jZWwgZmlsZSB0cmFuc2ZlcjogIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4eHNjcmVlbihTQ1JfVE4sMCwwbCwiVHJhbnNmZXIgaW50ZXJydXB0aW9uIGRpc2FibGVkLiAiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHh4c2NyZWVuKFNDUl9UVSwwLDBsLCIgIik7Cit9CisKKyNpZm5kZWYgTk9ESVNQTEFZCitzdGF0aWMgaW50IG5ld2RweSA9IDA7ICAgICAgICAgICAgICAgICAgLyogTmV3IGRpc3BsYXkgZmxhZyAqLworc3RhdGljIGNoYXIgZmJ1Zls4MF07ICAgICAgICAgICAgICAgICAgIC8qIEZpbGVuYW1lIGJ1ZmZlciAqLworc3RhdGljIGNoYXIgYWJ1Zls4MF07ICAgICAgICAgICAgICAgICAgIC8qIEFzLW5hbWUgYnVmZmVyICovCitzdGF0aWMgY2hhciBhMmJ1Zls4MF07ICAgICAgICAgICAgICAgICAgLyogU2Vjb25kIEFzLW5hbWUgYnVmZmVyICovCitzdGF0aWMgbG9uZyBvbGRmZmMgPSAwTDsKK3N0YXRpYyBsb25nIGRvdHMgPSAwTDsKK3N0YXRpYyBpbnQgaHBvcyA9IDA7CisKK3N0YXRpYyBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIFNlcmlhbCBvciBDUlQgZGlzcGxheSAqLworZHB5aW5pdCgpIHsKKyAgICBpbnQgbSA9IDAsIG4gPSAwOworICAgIGNoYXIgKiBzID0gIiI7CisKKyAgICBuZXdkcHkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgRG9uJ3QgZG8gdGhpcyBhZ2FpbiAqLworICAgIG9sZGZmYyA9IDBMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICBSZXNldCB0aGlzICovCisgICAgZG90cyA9IDBMOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGFuZCB0aGlzLi4gKi8KKyAgICBvbGRjcHMgPSBjcHMgPSAwTDsKKworICAgIGNvbm9sbCgiIik7CQkJCS8qIE5ldyBsaW5lICovCisgICAgaWYgKHdoYXQgJiBXX1NFTkQpIHMgPSAiU2VuZGluZzogIjsJLyogQWN0aW9uICovCisgICAgZWxzZSBpZiAod2hhdCAmIFdfUkVDVikgcyA9ICJSZWNlaXZpbmc6ICI7CisgICAgbiA9IChpbnQpc3RybGVuKHMpICsgKGludClzdHJsZW4oZmJ1Zik7CisgICAgY29ub2woZmJ1Zik7CisgICAgbSA9IChpbnQpc3RybGVuKGFidWYpICsgNDsKKyAgICBpZiAobiArIG0gPiBjbWRfY29scykgeworICAgICAgICBjb25vbGwoIiIpOworICAgICAgICBuID0gMDsKKyAgICB9IGVsc2UKKyAgICAgIG4gKz0gbTsKKyAgICBpZiAoKmFidWYpIHsKKyAgICAgICAgY29ub2woIiA9PiAiKTsKKyAgICAgICAgY29ub2woYWJ1Zik7CisgICAgfQorICAgIG0gPSAoaW50KXN0cmxlbihhMmJ1ZikgKyA0OworICAgIGlmIChuICsgbSA+IGNtZF9jb2xzKSB7CisgICAgICAgIGNvbm9sbCgiIik7CisgICAgICAgIG4gPSAwOworICAgIH0gZWxzZQorICAgICAgbiArPSBtOworICAgIGlmICgqYTJidWYpIHsKKyAgICAgICAgY29ub2woIiA9PiAiKTsKKyAgICAgICAgY29ub2woYTJidWYpOworICAgIH0KKyAgICAqZmJ1ZiA9IE5VTDsgKmFidWYgPSBOVUw7ICphMmJ1ZiA9IE5VTDsKKyAgICBjb25vbGwoIiIpOworICAgIGlmIChmc2l6ZSA+IC0xTCkgewkJCS8qIFNpemUgKi8KKyAgICAgICAgc3ByaW50ZihmYnVmLCJTaXplOiAlbGQsIFR5cGU6ICIsZnNpemUpOyAvKiBTQUZFICg4MCkgKi8KKyAgICAgICAgY29ub2woZmJ1Zik7ICpmYnVmID0gTlVMOworICAgIH0gZWxzZSBjb25vbCgiU2l6ZTogdW5rbm93biwgVHlwZTogIik7CisgICAgaWYgKGJpbmFyeSkgewkJCS8qIFR5cGUgKi8KKyAgICAgICAgc3dpdGNoKGJpbmFyeSkgeworICAgICAgICAgICAgICBjYXNlIFhZRlRfTDogY29ub2woImxhYmVsZWQiKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgWFlGVF9JOiBjb25vbCgiaW1hZ2UiKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgWFlGVF9VOiBjb25vbCgiYmluYXJ5IHVuZGVmaW5lZCIpOyBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgY2FzZSBYWUZUX0I6IGNvbm9sKCJiaW5hcnkiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworI2lmZGVmIE5PQ1NFVFMKKyAgICAgICAgY29ub2woInRleHQiKTsKKyNlbHNlCisgICAgICAgIGNvbm9sKCJ0ZXh0LCAiKTsKKyAgICAgICAgaWYgKHRjaGFyc2V0ID09IFRDX1RSQU5TUCB8fCB4ZnJ4bGEgPT0gMCkgeworICAgICAgICAgICAgY29ub2woInRyYW5zcGFyZW50Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAod2hhdCAmIFdfU0VORCkgeworICAgICAgICAgICAgICAgIGNvbm9sKGZjc2luZm9bZmNoYXJzZXRdLmtleXdvcmQpOworICAgICAgICAgICAgICAgIGNvbm9sKCIgPT4gIik7CisgICAgICAgICAgICAgICAgY29ub2wodGNzaW5mb1t0Y2hhcnNldF0ua2V5d29yZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbm9sKHRjc2luZm9bdGNoYXJzZXRdLmtleXdvcmQpOworICAgICAgICAgICAgICAgIGNvbm9sKCIgPT4gIik7CisgICAgICAgICAgICAgICAgY29ub2woZmNzaW5mb1tmY2hhcnNldF0ua2V5d29yZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgfQorI2lmZGVmIFNUUkVBTUlORworICAgIGlmIChzdHJlYW1pbmcpCisgICAgICBjb25vbCgiLCBTVFJFQU1JTkciKTsKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKyAgICBjb25vbGwoIiIpOworCisgICAgaWYgKGZkaXNwbGEgPT0gWFlGRF9TKSB7ICAgICAgICAgICAgLyogQ1JUIGZpZWxkIGhlYWRpbmdzICovCisvKgorICBEZWZpbmUgQ0tfQ1BTIHRvIHNob3cgY3VycmVudCB0cmFuc2ZlciByYXRlLgorICBMZWF2ZSBpdCB1bmRlZmluZWQgdG8gc2hvdyBlc3RpbWF0ZWQgdGltZSByZW1haW5pbmcuCisgIEVzdGltYXRlZC10aW1lLXJlbWFpbmluZyBjb2RlIGZyb20gQW5keSBGeWZlLCBub3QgdGVzdGVkIG9uCisgIHBhdGhvbG9naWNhbCBjYXNlcy4KKyovCisjZGVmaW5lIENLX0NQUworCisjaWZkZWYgQ0tfQ1BTCisgICAgICAgIGNvbm9sbCgiICAgIEZpbGUgICBQZXJjZW50ICAgICAgIFBhY2tldCIpOworICAgICAgICBjb25vbGwoIiAgICBCeXRlcyAgRG9uZSAgICAgQ1BTICBMZW5ndGgiKTsKKyNlbHNlCisgICAgICAgIGNvbm9sbCgiICAgIEZpbGUgICBQZXJjZW50ICBTZWNzIFBhY2tldCIpOworICAgICAgICBjb25vbGwoIiAgICBCeXRlcyAgRG9uZSAgICAgTGVmdCBMZW5ndGgiKTsKKyNlbmRpZiAvKiBDS19DUFMgKi8KKyAgICAgICAgbmV3ZHB5ID0gMDsKKyAgICB9CisgICAgaHBvcyA9IDA7Cit9CisKKy8qCisgIHNob3dwa3QoYykKKyAgYyA9IGNvbXBsZXRpb24gY29kZTogMCBtZWFucyB0cmFuc2ZlciBpbiBwcm9ncmVzcywgbm9uemVybyBtZWFucyBpdCdzIGRvbmUuCisgIFNob3cgdGhlIGZpbGUgdHJhbnNmZXIgcHJvZ3Jlc3MgY291bnRlciBhbmQgcGVyaGFwcyB2ZXJib3NlIHBhY2tldCB0eXBlLgorKi8KK1ZPSUQKKyNpZmRlZiBDS19BTlNJQworc2hvd3BrdChjaGFyIGMpCisjZWxzZQorc2hvd3BrdChjKSBjaGFyIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHNob3dwa3QgKi8geworCisjaWZuZGVmIEdGVElNRVIKKyAgICBsb25nIGV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbGFwc2VkIHRpbWUsIGVudGlyZSBiYXRjaCAgKi8KKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgbG9uZyBob3dmYXI7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSG93IGZhciBpbnRvIGZpbGUgKi8KKyAgICBsb25nIHBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZXJjZW50IGRvbmUsIHRoaXMgZmlsZSAgICAgKi8KKyAgICBsb25nIHRwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2ZlciByYXRlLCBlbnRpcmUgYmF0Y2ggKi8KKyAgICBsb25nIHBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYWNrZXQgc2l6ZSwgY3VycmVudCBwYWNrZXQgKi8KKyAgICBsb25nIG15dGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2NhbCBjb3B5IG9mIGJ5dGUgY291bnRlciAgKi8KKworI2lmZGVmIEdGVElNRVIKKyAgICBDS0ZMT0FUIHRub3c7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisgICAgaWYgKG5ld2RweSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHV0IHVwIGZpbGVuYW1lcywgZXRjLCAqLworICAgICAgZHB5aW5pdCgpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZXkncmUgbm90IHRoZXJlIGFscmVhZHkuICovCisKKyAgICBob3dmYXIgPSBmZmM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBIb3cgZmFyICovCisvKgorICBDYWxjdWxhdGUgQ1BTIHJhdGUgZXZlbiBpZiBub3QgZGlzcGxheWluZyBvbiBzY3JlZW4gZm9yIHVzZSBpbiBmaWxlCisgIHRyYW5zZmVyIHN0YXRpc3RpY3MuCisqLworI2lmZGVmIEdGVElNRVIKKyAgICB0bm93ID0gZ2Z0aW1lcigpOyAgICAgICAgICAgICAgICAgICAvKiBUaW1lIHNpbmNlIHdlIHN0YXJ0ZWQgKi8KKyAgICBwcyA9ICh3aGF0ICYgV19SRUNWKSA/IHJwa3RsIDogc3BrdGw7IC8qIFBhY2tldCBzaXplICovCisjaWZkZWYgQ0tfUkVTRU5ECisgICAgaWYgKHdoYXQgJiBXX1NFTkQpCQkJLyogSW4gY2FzZSB3ZSBkaWRuJ3Qgc3RhcnQgYXQgKi8KKyAgICAgIGhvd2ZhciArPSBzZW5kc3RhcnQ7ICAgICAgICAgICAgICAvKiAgdGhlIGJlZ2lubmluZy4uLiAqLworICAgIGVsc2UgaWYgKHdoYXQgJiBXX1JFQ1YpCisgICAgICBob3dmYXIgKz0gcnNfbGVuOworI2VuZGlmIC8qIENLX1JFU0VORCAqLworICAgIHBkID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmNlbnQgZG9uZS4gKi8KKyAgICBpZiAoYyA9PSBOVUwpIHsgICAgICAgICAgICAgICAgICAgICAvKiBTdGlsbCBnb2luZywgZmlndXJlICUgZG9uZSAqLworICAgICAgICBpZiAoZnNpemUgPT0gMEwpIHJldHVybjsgICAgICAgIC8qIEVtcHR5IGZpbGUsIGRvbid0IGJvdGhlciAqLworICAgICAgICBwZCA9IChmc2l6ZSA+IDk5TCkgPyAoaG93ZmFyIC8gKGZzaXplIC8gMTAwTCkpIDogMEw7CisgICAgICAgIGlmIChwZCA+IDEwMCkgcGQgPSAxMDA7ICAgICAgICAgLyogRXhwYW5zaW9uICovCisgICAgfQorICAgIGlmIChjICE9IE5VTCkKKyAgICAgIGlmICghY3hzZWVuICYmICFkaXNjYXJkICYmICFjenNlZW4pCisgICAgICAgIHBkID0gMTAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSBjb21wbGV0ZSwgc28gMTAwJS4gKi8KKworICAgIG15dGZjID0gKHBkIDwgMTAwKSA/IHRmYyArIGZmYyA6IHRmYzsgICAgLyogQ1BTICovCisgICAgdHAgPSAobG9uZykoKHRub3cgPiAwLjApID8gKENLRkxPQVQpIG15dGZjIC8gdG5vdyA6IDApOworICAgIGlmIChjICYmICh0cCA9PSAwKSkKKyAgICAgIHRwID0gZmZjOworCisgICAgY3BzID0gdHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGdsb2JhbCB2YXJpYWJsZSAqLworICAgIGlmIChjcHMgPiBwZWFrY3BzICYmICAgICAgICAgICAgICAgIC8qIFBlYWsgdHJhbnNmZXIgcmF0ZSAqLworICAgICAgICAgKCh3aGF0ICYgV19TRU5EICYmIHNwYWNrZXRzID4gd3Nsb3RzICsgNCkgfHwKKwkgICghKHdoYXQgJiBXX1NFTkQpICYmIHNwYWNrZXRzID4gMTApKSkgeworICAgICAgICBwZWFrY3BzID0gY3BzOworICAgIH0KKworI2Vsc2UgIC8qIE5vdCBHRlRJTUVSICovCisKKyAgICBldCA9IGd0aW1lcigpOyAgICAgICAgICAgICAgICAgICAgICAvKiBFbGFwc2VkIHRpbWUgICovCisgICAgcHMgPSAod2hhdCAmIFdfUkVDVikgPyBycGt0bCA6IHNwa3RsOyAvKiBQYWNrZXQgbGVuZ3RoICovCisjaWZkZWYgQ0tfUkVTRU5ECisgICAgaWYgKHdoYXQgJiBXX1NFTkQpCQkJLyogQW5kIGlmIHdlIGRpZG4ndCBzdGFydCBhdCAqLworICAgICAgaG93ZmFyICs9IHNlbmRzdGFydDsgICAgICAgICAgICAgIC8qICB0aGUgYmVnaW5uaW5nLi4uICovCisgICAgZWxzZSBpZiAod2hhdCAmIFdfUkVDVikKKyAgICAgIGhvd2ZhciArPSByc19sZW47CisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisgICAgcGQgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGVyY2VudCBkb25lLiAqLworICAgIGlmIChjID09IE5VTCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIFN0aWxsIGdvaW5nLCBmaWd1cmUgJSBkb25lICovCisgICAgICAgIGlmIChmc2l6ZSA9PSAwTCkgcmV0dXJuOyAgICAgICAgLyogRW1wdHkgZmlsZSwgZG9uJ3QgYm90aGVyICovCisgICAgICAgIHBkID0gKGZzaXplID4gOTlMKSA/IChob3dmYXIgLyAoZnNpemUgLyAxMDBMKSkgOiAwTDsKKyAgICAgICAgaWYgKHBkID4gMTAwKSBwZCA9IDEwMDsgICAgICAgICAvKiBFeHBhbnNpb24gKi8KKyAgICB9CisgICAgaWYgKGMgIT0gTlVMKQorICAgICAgaWYgKCFjeHNlZW4gJiYgIWRpc2NhcmQgJiYgIWN6c2VlbikKKyAgICAgICAgcGQgPSAxMDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIGNvbXBsZXRlLCBzbyAxMDAlLiAqLworCisKKyNpZm5kZWYgQ0tfQ1BTCisvKgorICBmc2VjcyA9IHRpbWUgKGZyb20gZ3RpbWVyKSB0aGF0IHRoaXMgZmlsZSBzdGFydGVkIChzZXQgaW4gc2ZpbGUoKSkuCisgIFJhdGUgc28gZmFyIGlzIGZmYyAvIChldCAtIGZzZWNzKSwgIGVzdGltYXRlZCB0aW1lIGZvciByZW1haW5pbmcgYnl0ZXMKKyAgaXMgKGZzaXplIC0gZmZjKSAvIChmZmMgLyAoZXQgLSBmc2VjcykpLgorKi8KKyAgICB0cCA9IChob3dmYXIgPiAwTCkgPyAoZnNpemUgLSBob3dmYXIpICogKGV0IC0gZnNlY3MpIC8gaG93ZmFyIDogMEw7CisjZW5kaWYgLyogQ0tfQ1BTICovCisKKyNpZmRlZiBDS19DUFMKKyAgICBteXRmYyA9IChwZCA8IDEwMCkgPyB0ZmMgKyBmZmMgOiB0ZmM7CisgICAgdHAgPSAoZXQgPiAwKSA/IG15dGZjIC8gZXQgOiAwOwkvKiBUcmFuc2ZlciByYXRlICovCisgICAgaWYgKGMgJiYgKHRwID09IDApKQkJCS8qIFdhdGNoIG91dCBmb3Igc3Vic2Vjb25kIHRpbWVzICovCisgICAgICAgIHRwID0gZmZjOworCisgICAgY3BzID0gdHA7CQkJCS8qIFNldCBnbG9iYWwgdmFyaWFibGUgKi8KKyAgICBpZiAoY3BzID4gcGVha2NwcyAmJiAgICAgICAgICAgICAgICAvKiBQZWFrIHRyYW5zZmVyIHJhdGUgKi8KKyAgICAgICAgICgod2hhdCAmIFdfU0VORCAmJiBzcGFja2V0cyA+IHdzbG90cyArIDQpIHx8CisJICAoISh3aGF0ICYgV19TRU5EKSAmJiBzcGFja2V0cyA+IDEwKSkpIHsKKyAgICAgICAgcGVha2NwcyA9IGNwczsKKyAgICB9CisjZW5kaWYgLyogQ0tfQ1BTICovCisKKyNlbmRpZiAvKiBHRlRJTUVSICovCisKKyAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX1MpIHsgICAgICAgICAgICAvKiBDUlQgZGlzcGxheSAqLworICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworCS8qIFRoZXNlIHNwcmludGZzIHNob3VsZCBiZSBzYWZlIHVudGlsIHdlIGhhdmUgMzItZGlnaXQgbnVtYmVycyAqLworCisgICAgICAgIGlmIChwZCA+IC0xTCkKKyAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVjJTlsZCU1bGQlJSU4bGQlOGxkICIsIENSLCBob3dmYXIsIHBkLCB0cCwgcHMpOworICAgICAgICBlbHNlCisgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlYyU5bGQgICAgICAlOGxkJThsZCAiLCBDUiwgaG93ZmFyLCB0cCwgcHMpOworICAgICAgICBjb25vbChidWZmZXIpOworICAgICAgICBocG9zID0gMzE7CisgICAgfSBlbHNlIGlmIChmZGlzcGxhID09IFhZRkRfUikgeyAgICAgLyogU0VSSUFMICovCisgICAgICAgIGxvbmcgaSwgazsKKyAgICAgICAgaWYgKGhvd2ZhciAtIG9sZGZmYyA8IDEwMjQpICAgICAvKiBVcGRhdGUgZGlzcGxheSBldmVyeSAxSyAqLworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgb2xkZmZjID0gaG93ZmFyOyAgICAgICAgICAgICAgICAvKiBUaW1lIGZvciBuZXcgZGlzcGxheSAqLworICAgICAgICBrID0gKGhvd2ZhciAvIDEwMjRMKSAtIGRvdHM7ICAgIC8qIEhvdyBtYW55IEsgc28gZmFyICovCisgICAgICAgIGZvciAoaSA9IDBMOyBpIDwgazsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaHBvcysrID4gKGNtZF9jb2xzIC0gMykpIHsgLyogVGltZSB0byB3cmFwPyAqLworICAgICAgICAgICAgICAgIGNvbm9sbCgiIik7CisgICAgICAgICAgICAgICAgaHBvcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25vYygnLicpOyAgICAgICAgICAgICAgICAgLyogUHJpbnQgYSBkb3QgZm9yIHRoaXMgSyAqLworICAgICAgICAgICAgZG90cysrOyAgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IGl0ICovCisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyogIEMgSyBTIEMgUiBFIEUgTiAgLS0gIFNjcmVlbiBkaXNwbGF5IGZ1bmN0aW9uICAqLworCisvKgorICBja3NjcmVlbihmLGMsbixzKQorICAgIGYgLSBhcmd1bWVudCBkZXNjcmlwdG9yCisgICAgYyAtIGEgY2hhcmFjdGVyIG9yIHNtYWxsIGludGVnZXIKKyAgICBuIC0gYSBsb25nIGludGVnZXIKKyAgICBzIC0gYSBzdHJpbmcuCisKKyAgYW5kIGdsb2JhbCBmZGlzcGxhID0gU0VUIEZJTEUgRElTUExBWSB2YWx1ZToKKworICAgIFhZRkRfTiA9IE5PTkUKKyAgICBYWUZEX1IgPSBTRVJJQUw6ICAgICBEb3RzLCBldGMsIHdvcmtzIG9uIGFueSB0ZXJtaW5hbCwgZXZlbiBoYXJkY29weS4KKyAgICBYWUZEX1MgPSBDUlQ6ICAgICAgICBXb3JrcyBvbiBhbnkgQ1JULCB3cml0ZXMgb3ZlciBjdXJyZW50IGxpbmUuCisgICAgWFlGRF9DID0gRlVMTFNDUkVFTjogUmVxdWlyZXMgdGVybWluYWwtZGVwZW5kZW50IHNjcmVlbiBjb250cm9sLgorICAgIFhZRkRfQiA9IEJSSUVGOiAgICAgIExpa2UgU0VSSUFMIGJ1dCBvbmx5IGZpbGVuYW1lICYgY29tcGxldGlvbiBzdGF0dXMuCisgICAgWFlGRF9HID0gR1VJOyAgICAgICAgV2luZG93cyBHVUksIHNhbWUgYmVoYXZpb3IgYXMgRlVMTFNDUkVFTgorKi8KK1ZPSUQKKyNpZmRlZiBDS19BTlNJQworY2tzY3JlZW4oaW50IGYsIGNoYXIgYyxsb25nIG4sY2hhciAqcykKKyNlbHNlCitja3NjcmVlbihmLGMsbixzKSBpbnQgZjsgY2hhciBjOyBsb25nIG47IGNoYXIgKnM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHNjcmVlbiAqLyB7CisgICAgY2hhciBidWZbODBdOworICAgIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBzdHJpbmcgKi8KKyNpZmRlZiBVTklYCisjaWZuZGVmIE5PSkMKKyAgICBpbnQgb2JnOworX1BST1RPVFlQKCBWT0lEIGNvbmJndCwgKGludCkgKTsKKyNlbmRpZiAvKiBOT0pDICovCisjZW5kaWYgLyogVU5JWCAqLworICAgIGludCBmdHAgPSAwOworCisgICAgZnRwID0gKHdoYXQgJiBXX0ZUUCkgPyAxIDogMDsJLyogRlRQIG9yIEtlcm1pdD8gKi8KKworICAgIGlmICghbG9jYWwgJiYgIWZ0cCkJCQkvKiBJbiByZW1vdGUgbW9kZSAtIGRvbid0IGRvIHRoaXMgKi8KKyAgICAgIHJldHVybjsKKworICAgIGlmICghcykgcyA9ICIiOworCisgICAgaWYgKCFmeGRfaW5pdGVkKSAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBpZiBuZWNlc3NhcnkgKi8KKyAgICAgIGZ4ZGluaXQoZmRpc3BsYSk7CisKKyNpZmRlZiBVTklYCisjaWZuZGVmIE5PSkMKKyAgICBvYmcgPSBiYWNrZ3JkOyAgICAgICAgICAgICAgICAgICAgICAvKiBQcmV2aW91cyBiYWNrZ3JvdW5kIHN0YXR1cyAqLworICAgIGNvbmJndCgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZSBpZiBydW5uaW5nIGluIGJhY2tncm91bmQgKi8KKyAgICBpZiAoIWJhY2tncmQgJiYgb2JnKSB7ICAgICAgICAgICAgICAvKiBKdXN0IGNhbWUgaW50byBmb3JlZ3JvdW5kPyAqLworICAgICAgICBjb25jYigoY2hhcillc2NhcGUpOyAgICAgICAgICAgIC8qIFB1dCBjb25zb2xlIGJhY2sgaW4gQ0JSRUFLIG1vZGUgKi8KKyAgICAgICAgc2V0aW50KCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIGludGVycnVwdHMgKi8KKyAgICB9CisjZW5kaWYgLyogTk9KQyAqLworI2VuZGlmIC8qIFVOSVggKi8KKworICAgIGlmICgoZiAhPSBTQ1JfV00pICYmIChmICE9IFNDUl9FTSkpIC8qIEFsd2F5cyB1cGRhdGUgd2FybmluZ3MgJiBlcnJvcnMgKi8KKyAgICAgIGlmICghZGlzcGxhIHx8CisgICAgICAgICAgKGJhY2tncmQgJiYgYmdzZXQpIHx8CisgICAgICAgICAgZmRpc3BsYSA9PSBYWUZEX04gfHwKKyAgICAgICAgICAoc2VydmVyICYmICFzcnZkaXMpCisgICAgICAgICAgKQorICAgICAgICByZXR1cm47CisKKyNpZmRlZiBWTVMKKyAgICBpZiAoZiA9PSBTQ1JfRk4pICAgICAgICAgICAgICAgICAgICAvKiBWTVMgLSBzaG9ydGVuIHRoZSBuYW1lICovCisgICAgICBzID0genJlbG5hbWUocyx6Z3RkaXIoKSk7CisjZW5kaWYgLyogVk1TICovCisKKyAgICBpZiAoZGVzdCA9PSBERVNUX1MpICAgICAgICAgICAgICAgICAvKiBTRVQgREVTVElOQVRJT04gU0NSRUVOICovCisgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdvdWxkIGludGVyZmVyZS4uLiAqLworCisjaWZkZWYgS1VJCisgICAgaWYgKGZkaXNwbGEgPT0gWFlGRF9HKSB7ICAgICAgICAgICAgLyogSWYgZ3VpIGRpc3BsYXkgc2VsZWN0ZWQgKi8KKyAgICAgICAgc2NyZWVuZyhmLGMsbixzKTsgICAgICAgICAgICAgICAvKiBjYWxsIHRoZSBndWkgdmVyc2lvbiAqLworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIEtVSSAqLworI2lmZGVmIENLX0NVUlNFUworICAgIGlmIChmZGlzcGxhID09IFhZRkRfQykgeyAgICAgICAgICAgIC8qIElmIGZ1bGxzY3JlZW4gZGlzcGxheSBzZWxlY3RlZCAqLworICAgICAgICBzY3JlZW5jKGYsYyxuLHMpOyAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGZ1bGxzY3JlZW4gdmVyc2lvbiAqLworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIENLX0NVUlNFUyAqLworCisgICAgbGVuID0gKGludClzdHJsZW4ocyk7ICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHN0cmluZyAqLworCisgICAgc3dpdGNoIChmKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSGFuZGxlIG91ciBmdW5jdGlvbiBjb2RlICovCisgICAgICBjYXNlIFNDUl9GTjogICAgICAgICAgICAgICAgICAgICAgLyogRmlsZW5hbWUgKi8KKyAgICAgICAgaWYgKGZkaXNwbGEgPT0gWFlGRF9CKSB7CisjaWZkZWYgTkVXRlRQCisJICAgIGlmIChmdHApCisJICAgICAgcHJpbnRmKCIgJXMgJXMiLCB3aGF0ICYgV19TRU5EID8gIlBVVCIgOiAiR0VUIiwgcyk7CisJICAgIGVsc2UKKyNlbmRpZiAvKiBORVdGVFAgKi8KKwkgICAgICBwcmludGYoIiAlcyAlcyIsIHdoYXQgJiBXX1NFTkQgPyAiU0VORCIgOiAiUkVDViIsIHMpOworI2lmZGVmIFVOSVgKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmIC8qIFVOSVggKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2lmZGVmIE1BQworICAgICAgICBjb25vbGwoIiIpOyBjb25vbChzKTsgY29ub2MoU1ApOyBocG9zID0gbGVuICsgMTsKKyNlbHNlCisgICAgICAgIGNrc3RybmNweShmYnVmLHMsODApOworICAgICAgICBhYnVmWzBdID0gYTJidWZbMF0gPSBOVUw7CisgICAgICAgIG5ld2RweSA9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogTmV3IGZpbGUgc28gcmVmcmVzaCBkaXNwbGF5ICovCisjZW5kaWYgLyogTUFDICovCisgICAgICAgIHJldHVybjsKKworICAgICAgY2FzZSBTQ1JfQU46ICAgICAgICAgICAgICAgICAgICAgIC8qIEFzLW5hbWUgKi8KKyAgICAgICAgaWYgKGZkaXNwbGEgPT0gWFlGRF9CKSB7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgcHJpbnRmKCIoYXMgJXMpICIscyk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjaWZkZWYgTUFDCisgICAgICAgIGlmIChocG9zICsgbGVuID4gNzUpIHsgY29ub2xsKCIiKTsgaHBvcyA9IDA7IH0KKyAgICAgICAgY29ub2woIj0+ICIpOyBjb25vbChzKTsKKyAgICAgICAgaWYgKChocG9zICs9IChsZW4gKyAzKSkgPiA3OCkgeyBjb25vbGwoIiIpOyBocG9zID0gMDsgfQorI2Vsc2UKKyAgICAgICAgaWYgKGFidWZbMF0pIHsKKyAgICAgICAgICAgIGNrc3RybmNweShhMmJ1ZixzLDgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNrc3RybmNweShhYnVmLHMsODApOworICAgICAgICB9CisjZW5kaWYgLyogTUFDICovCisgICAgICAgIHJldHVybjsKKworICAgICAgY2FzZSBTQ1JfRlM6ICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUtc2l6ZSAqLworICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX0IpIHsKKyAgICAgICAgICAgIHByaW50ZigiICglcykgKCVsZCBieXRlJXMpIiwKKyNpZmRlZiBOT0lDUAorICAgICAgICAgICAgICAgICAgIChiaW5hcnkgPyAiYmluYXJ5IiA6ICJ0ZXh0IikKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgZ2Ztb2RlKGJpbmFyeSwwKQorI2VuZGlmIC8qIE5PSUNQICovCisgICAgICAgICAgICAgICAgICAgLCBuLCBuID09IDFMID8gIiIgOiAicyIpOworI2lmZGVmIFVOSVgKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmIC8qIFVOSVggKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2lmZGVmIE1BQworICAgICAgICBzcHJpbnRmKGJ1ZiwiLCBTaXplOiAlbGQiLG4pOyAgY29ub2xsKGJ1Zik7ICBocG9zID0gMDsKKyNlbmRpZiAvKiBNQUMgKi8KKyAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIFNDUl9YRDogICAgICAgICAgICAgICAgICAgICAgLyogWC1wYWNrZXQgZGF0YSAqLworICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX0IpCisgICAgICAgICAgcmV0dXJuOworI2lmZGVmIE1BQworICAgICAgICBjb25vbGwoIiIpOyBjb25vbGwocyk7IGhwb3MgPSAwOworI2Vsc2UKKyAgICAgICAgY2tzdHJuY3B5KGZidWYscyw4MCk7CisgICAgICAgIGFidWZbMF0gPSBhMmJ1ZlswXSA9IE5VTDsKKyNlbmRpZiAvKiBNQUMgKi8KKyAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIFNDUl9TVDogICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSBzdGF0dXMgKi8KKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgY2FzZSBTVF9PSzogICAgICAgICAgICAgICAgICAgLyogVHJhbnNmZXJyZWQgT0sgKi8KKyAgICAgICAgICAgIHNob3dwa3QoJ1onKTsgICAgICAgICAgICAgICAvKiBVcGRhdGUgbnVtYmVycyBvbmUgbGFzdCB0aW1lICovCisgICAgICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX0IpIHsKKyNpZmRlZiBHRlRJTUVSCisgICAgICAgICAgICAgICAgcHJpbnRmKCI6IE9LICglMC4zZiBzZWMsICVsZCBjcHMpXG4iLGZweGZzZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAobG9uZykoKENLRkxPQVQpZmZjIC8gZnB4ZnNlY3MpKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCI6IE9LICglZCBzZWMsICVsZCBjcHMpXG4iLHhmc2VjcyxmZmMveGZzZWNzKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChocG9zICs9IDUpID4gNzgpIGNvbm9sbCgiIik7IC8qIFdyYXAgc2NyZWVuIGxpbmUuICovCisgICAgICAgICAgICBjb25vbGwoIiBbT0tdIik7IGhwb3MgPSAwOyAgLyogUHJpbnQgT0sgbWVzc2FnZS4gKi8KKyAgICAgICAgICAgIGlmIChmZGlzcGxhID09IFhZRkRfUykgeyAgICAvKiBXZSBkaWRuJ3Qgc2hvdyBaIHBhY2tldCB3aGVuICovCisgICAgICAgICAgICAgICAgY29ub2MoJ1onKTsgICAgICAgICAgICAgLyogaXQgY2FtZSwgc28gc2hvdyBpdCBub3cuICovCisgICAgICAgICAgICAgICAgaHBvcyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIFNUX0RJU0M6ICAgICAgICAgICAgICAgICAvKiAgRGlzY2FyZGVkICovCisgICAgICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX0IpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIjogRElTQ0FSREVEXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGhwb3MgKz0gMTIpID4gNzgpIGNvbm9sbCgiIik7CisgICAgICAgICAgICBjb25vbGwoIiBbZGlzY2FyZGVkXSIpOyBocG9zID0gMDsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgU1RfSU5UOiAgICAgICAgICAgICAgICAgIC8qICBJbnRlcnJ1cHRlZCAqLworICAgICAgICAgICAgaWYgKGZkaXNwbGEgPT0gWFlGRF9CKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI6IElOVEVSUlVQVEVEXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGhwb3MgKz0gMTQpID4gNzgpIGNvbm9sbCgiIik7CisgICAgICAgICAgICBjb25vbGwoIiBbaW50ZXJydXB0ZWRdIik7IGhwb3MgPSAwOworICAgICAgICAgICAgcmV0dXJuOworCisJICBjYXNlIFNUX1NJTToKKyAgICAgICAgICAgIGlmIChmZGlzcGxhID09IFhZRkRfQikgeworCQlpZiAobiA9PSBTS1BfWE5YKQorCQkgIHByaW50ZigiOiBXT1VMRCBCRSBUUkFOU0ZFUlJFRCAoTmV3IGZpbGUpXG4iKTsKKwkJZWxzZSBpZiAobiA9PSBTS1BfWFVQKQorCQkgIHByaW50ZigiOiBXT1VMRCBCRSBUUkFOU0ZFUlJFRCAoUmVtb3RlIGZpbGUgb2xkZXIpXG4iKTsKKwkJZWxzZSBpZiAobiA9PSBTS1BfU0lNKQorCQkgIHByaW50ZigiOiBXT1VMRCBCRSBUUkFOU0ZFUlJFRFxuIik7CisJCWVsc2UgaWYgKG4gPiAwICYmIG4gPCBuc2tyZWFzb24pCisJCSAgcHJpbnRmKCI6IFNLSVBQRUQgKCVzKVxuIixza3JlYXNvbltuXSk7CisJCWVsc2UKKwkJICBwcmludGYoIjogU0tJUFBFRFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIGlmIChmZGlzcGxhID09IFhZRkRfUykgeworICAgICAgICAgICAgICAgIGlmIChmZGlzcGxhID09IFhZRkRfUyAmJiBmYnVmWzBdKSB7IC8qIENSVCBkaXNwbGF5ICovCisgICAgICAgICAgICAgICAgICAgIGNvbm9sbCgiIik7ICAgICAgICAgLyogTmV3IGxpbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgJiBXX1NFTkQpIGNvbm9sKCJXb3VsZCBTZW5kOiAiKTsgLyogQWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdoYXQgJiBXX1JFQ1YpIGNvbm9sKCJXb3VsZCBSZWNlaXZlOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgY29ub2woZmJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYWJ1ZikgY29ub2woIiA9PiAiKTsgY29ub2woYWJ1Zik7IC8qIE5hbWVzICovCisgICAgICAgICAgICAgICAgICAgIGlmICgqYTJidWYpIGNvbm9sKCIgPT4gIik7IGNvbm9sKGEyYnVmKTsgLyogTmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgKmZidWYgPSBOVUw7ICphYnVmID0gTlVMOyAqYTJidWYgPSBOVUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbm9sbCgiIFtzaW11bGF0ZWRdIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChocG9zICs9IDEwKSA+IDc4KSBjb25vbGwoIiIpOworICAgICAgICAgICAgY29ub2woIiBbc2ltdWxhdGVkXSIpOyBocG9zID0gMDsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgU1RfU0tJUDogICAgICAgICAgICAgICAgIC8qICBTa2lwcGVkICovCisgICAgICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX0IpIHsKKwkJaWYgKG4gPT0gU0tQX1hOWCkKKwkJICBwcmludGYoIjogV09VTEQgQkUgVFJBTlNGRVJSRUQgKE5ldyBmaWxlKVxuIik7CisJCWVsc2UgaWYgKG4gPT0gU0tQX1hVUCkKKwkJICBwcmludGYoIjogV09VTEQgQkUgVFJBTlNGRVJSRUQgKFJlbW90ZSBmaWxlIG9sZGVyKVxuIik7CisJCWVsc2UgaWYgKG4gPT0gU0tQX1NJTSkKKwkJICBwcmludGYoIjogV09VTEQgQkUgVFJBTlNGRVJSRURcbiIpOworCQllbHNlIGlmIChuID4gMCAmJiBuIDwgbnNrcmVhc29uKQorCQkgIHByaW50ZigiOiBTS0lQUEVEICglcylcbiIsc2tyZWFzb25bbl0pOworCQllbHNlCisJCSAgcHJpbnRmKCI6IFNLSVBQRURcbiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmRpc3BsYSA9PSBYWUZEX1MpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX1MgJiYgZmJ1ZlswXSkgeyAvKiBDUlQgZGlzcGxheSAqLworICAgICAgICAgICAgICAgICAgICBjb25vbGwoIiIpOyAgICAgICAgIC8qIE5ldyBsaW5lICovCisgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ICYgV19TRU5EKSBjb25vbCgiU2VuZGluZzogIik7IC8qIEFjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3aGF0ICYgV19SRUNWKSBjb25vbCgiUmVjZWl2aW5nOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgY29ub2woZmJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYWJ1ZikgY29ub2woIiA9PiAiKTsgY29ub2woYWJ1Zik7IC8qIE5hbWVzICovCisgICAgICAgICAgICAgICAgICAgIGlmICgqYTJidWYpIGNvbm9sKCIgPT4gIik7IGNvbm9sKGEyYnVmKTsgLyogTmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgKmZidWYgPSBOVUw7ICphYnVmID0gTlVMOyAqYTJidWYgPSBOVUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbm9sbCgiIFtza2lwcGVkXSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaHBvcyArPSAxMCkgPiA3OCkgY29ub2xsKCIiKTsKKwkgICAgY29ub2woIiAiKTsgY29ub2woZmJ1Zik7CisgICAgICAgICAgICBjb25vbGwoIiBbc2tpcHBlZF0iKTsgaHBvcyA9IDA7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIFNUX0VSUjogICAgICAgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgaWYgKGZkaXNwbGEgPT0gWFlGRF9CKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI6IEVSUk9SOiAlc1xuIixzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25vbGwoIiIpOworICAgICAgICAgICAgY29ub2woIkVycm9yOiAiKTsgY29ub2xsKHMpOyBocG9zID0gMDsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgU1RfTVNHOiAgICAgICAgICAgICAgICAgIC8qIE1lc3NhZ2UgKi8KKyNpZmRlZiBORVdGVFAKKyAgICAgICAgICAgIGlmIChmZGlzcGxhID09IFhZRkRfQikgeworICAgICAgICAgICAgICAgIGlmIChmdHAgJiYgZnRwX2RlYikKKwkJICBwcmludGYoIjogTUVTU0FHRTogJXNcbiIscyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5FV0ZUUCAqLworICAgICAgICAgICAgY29ub2xsKCIiKTsKKyAgICAgICAgICAgIGNvbm9sKCJNZXNzYWdlOiAiKTsKKyAgICAgICAgICAgIGNvbm9sbChzKTsKKyAgICAgICAgICAgIGhwb3MgPSAwOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgY2FzZSBTVF9SRUZVOiAgICAgICAgICAgICAgICAgLyogUmVmdXNlZCAqLworICAgICAgICAgICAgaWYgKGZkaXNwbGEgPT0gWFlGRF9CKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI6IFJFRlVTRURcbiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmRpc3BsYSA9PSBYWUZEX1MpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX1MgJiYgZmJ1ZlswXSkgeyAvKiBDUlQgZGlzcGxheSAqLworICAgICAgICAgICAgICAgICAgICBjb25vbGwoIiIpOyAgICAgICAgIC8qIE5ldyBsaW5lICovCisgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ICYgV19TRU5EKSBjb25vbCgiU2VuZGluZzogIik7IC8qIEFjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3aGF0ICYgV19SRUNWKSBjb25vbCgiUmVjZWl2aW5nOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgY29ub2woZmJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYWJ1ZikgY29ub2woIiA9PiAiKTsgY29ub2woYWJ1Zik7ICAgICAgLyogTmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCphMmJ1ZikgY29ub2woIiA9PiAiKTsgY29ub2woYTJidWYpOyAgICAvKiBOYW1lcyAqLworICAgICAgICAgICAgICAgICAgICAqZmJ1ZiA9IE5VTDsgKmFidWYgPSBOVUw7ICphMmJ1ZiA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgY29ub2xsKCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29ub2woIlJlZnVzZWQ6ICIpOyBjb25vbGwocyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29ub2xsKCIiKTsKKyAgICAgICAgICAgIGNvbm9sKCJSZWZ1c2VkOiAiKTsgY29ub2xsKHMpOyBocG9zID0gMDsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgU1RfSU5DOiAgICAgICAgICAgICAgICAgIC8qIEluY29tcGxldGUgKi8KKyAgICAgICAgICAgIGlmIChmZGlzcGxhID09IFhZRkRfQikgeworICAgICAgICAgICAgICAgIHByaW50ZigiOiBJTkNPTVBMRVRFXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGhwb3MgKz0gMTIpID4gNzgpIGNvbm9sbCgiIik7CisgICAgICAgICAgICBjb25vbGwoIiBbaW5jb21wbGV0ZV0iKTsgaHBvcyA9IDA7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY29ub2xsKCIqKiogc2NyZWVuKCkgY2FsbGVkIHdpdGggYmFkIHN0YXR1cyAqKioiKTsKKyAgICAgICAgICAgIGhwb3MgPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyNpZmRlZiBNQUMKKyAgICAgIGNhc2UgU0NSX1BOOiAgICAgICAgICAgICAgICAgICAgICAvKiBQYWNrZXQgbnVtYmVyICovCisgICAgICAgIGlmIChmZGlzcGxhID09IFhZRkRfQikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisJY2ttYWttc2coYnVmLDgwLHMsIjogIixja2x0b2EobiksTlVMTCk7CisgICAgICAgIGNvbm9sKGJ1Zik7IGhwb3MgKz0gKGludClzdHJsZW4oYnVmKTsgcmV0dXJuOworI2VuZGlmIC8qIE1BQyAqLworCisgICAgICBjYXNlIFNDUl9QVDogICAgICAgICAgICAgICAgICAgICAgLyogUGFja2V0IHR5cGUgb3IgcHNldWRvdHlwZSAqLworICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX0IpCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoYyA9PSAnWScpIHJldHVybjsgICAgICAgICAgIC8qIERvbid0IGJvdGhlciB3aXRoIEFDS3MgKi8KKyAgICAgICAgaWYgKGMgPT0gJ0QnKSB7ICAgICAgICAgICAgICAgICAvKiBJbiBkYXRhIHRyYW5zZmVyIHBoYXNlLCAqLworICAgICAgICAgICAgc2hvd3BrdChOVUwpOyAgICAgICAgICAgICAgIC8qIHNob3cgcHJvZ3Jlc3MuICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNpZm5kZWYgQU1JR0EKKyAgICAgICAgaWYgKGhwb3MrKyA+IDc3KSB7ICAgICAgICAgICAgICAvKiBJZiBuZWFyIHJpZ2h0IG1hcmdpbiwgKi8KKyAgICAgICAgICAgIGNvbm9sbCgiIik7ICAgICAgICAgICAgICAgICAvKiBTdGFydCBuZXcgbGluZSAqLworICAgICAgICAgICAgaHBvcyA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGFuZCByZXNldCBjb3VudGVyLiAqLworICAgICAgICB9CisjZW5kaWYgLyogQU1JR0EgKi8KKyAgICAgICAgaWYgKGMgPT0gJ1onICYmIGZkaXNwbGEgPT0gWFlGRF9TKQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbm9jKGMpOyAgICAgICAgICAgICAgICAgICAgIC8qIERpc3BsYXkgdGhlIHBhY2tldCB0eXBlLiAqLworI2lmZGVmIEFNSUdBCisgICAgICAgIGlmIChjID09ICdHJykgY29ub2xsKCIiKTsgICAgICAgLyogTmV3IGxpbmUgYWZ0ZXIgRyBwYWNrZXRzICovCisjZW5kaWYgLyogQU1JR0EgKi8KKyAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIFNDUl9UQzogICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNhY3Rpb24gY29tcGxldGUgKi8KKyAgICAgICAgaWYgKHhmcmJlbCkgYmxlZXAoQlBfTk9URSk7CisgICAgICAgIGlmIChmZGlzcGxhID09IFhZRkRfQikgeyAgICAgICAgLyogQnJpZWYgZGlzcGxheS4uLiAqLworICAgICAgICAgICAgaWYgKGZpbGNudCA+IDEpIHsKKyAgICAgICAgICAgICAgICBsb25nIGZ4OworICAgICAgICAgICAgICAgIGZ4ID0gZmlsY250IC0gZmlscmVqOworICAgICAgICAgICAgICAgIHByaW50ZigiIFNVTU1BUlk6ICVsZCBmaWxlJXMiLCBmeCwgKChmeCA9PSAxTCkgPyAiIiA6ICJzIikpOworICAgICAgICAgICAgICAgIHByaW50ZigiLCAlbGQgYnl0ZSVzIiwgdGZjLCAoKHRmYyA9PSAxTCkgPyAiIiA6ICJzIikpOworI2lmZGVmIEdGVElNRVIKKyAgICAgICAgICAgICAgICBwcmludGYoIiwgJTAuM2Ygc2VjLCAlbGQgY3BzIiwgZnB0c2VjcywgdGZjcHMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIiwgJWxkIHNlYywgJWxkIGNwcyIsIHRzZWNzLCB0ZmNwcyk7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworICAgICAgICAgICAgICAgIHByaW50ZigiLlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25vbGwoIiIpOworICAgICAgICB9CisjaWZkZWYgVU5JWAorICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZiAvKiBVTklYICovCisgICAgICAgIHJldHVybjsKKworICAgICAgY2FzZSBTQ1JfRU06ICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yIG1lc3NhZ2UgKi8KKyAgICAgICAgaWYgKGZkaXNwbGEgPT0gWFlGRF9CKSB7CisgICAgICAgICAgICBwcmludGYoIiBFUlJPUjogJXNcbiIscyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29ub2xsKCIiKTsgY29ub2MoJz8nKTsgY29ub2xsKHMpOyBocG9zID0gMDsgcmV0dXJuOworCisgICAgICBjYXNlIFNDUl9XTTogICAgICAgICAgICAgICAgICAgICAgLyogV2FybmluZyBtZXNzYWdlICovCisgICAgICAgIGlmIChmZGlzcGxhID09IFhZRkRfQikgeworICAgICAgICAgICAgcHJpbnRmKCIgV0FSTklORzogJXNcbiIscyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29ub2xsKCIiKTsgY29ub2xsKHMpOyBocG9zID0gMDsgcmV0dXJuOworCisgICAgICBjYXNlIFNDUl9UVTogICAgICAgICAgICAgICAgICAgICAgLyogVW5kZWxpbWl0ZWQgdGV4dCAqLworICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX0IpCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoKGhwb3MgKz0gbGVuKSA+IDc3KSB7IGNvbm9sbCgiIik7IGhwb3MgPSBsZW47IH0KKyAgICAgICAgY29ub2wocyk7IHJldHVybjsKKworICAgICAgY2FzZSBTQ1JfVE46ICAgICAgICAgICAgICAgICAgICAgIC8qIFRleHQgZGVsaW1pdGVkIGF0IGJlZ2lubmluZyAqLworICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX0IpCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBjb25vbGwoIiIpOyBjb25vbChzKTsgaHBvcyA9IGxlbjsgcmV0dXJuOworCisgICAgICBjYXNlIFNDUl9UWjogICAgICAgICAgICAgICAgICAgICAgLyogVGV4dCBkZWxpbWl0ZWQgYXQgZW5kICovCisgICAgICAgIGlmIChmZGlzcGxhID09IFhZRkRfQikKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmICgoaHBvcyArPSBsZW4pID4gNzcpIHsgY29ub2xsKCIiKTsgaHBvcyA9IGxlbjsgfQorICAgICAgICBjb25vbGwocyk7IHJldHVybjsKKworICAgICAgY2FzZSBTQ1JfUUU6ICAgICAgICAgICAgICAgICAgICAgIC8qIFF1YW50aXR5IGVxdWFscyAqLworICAgICAgICBpZiAoZmRpc3BsYSA9PSBYWUZEX0IpCisgICAgICAgICAgcmV0dXJuOworCWNrbWFrbXNnKGJ1Ziw4MCxzLCI6ICIsY2tsdG9hKG4pLE5VTEwpOworICAgICAgICBjb25vbGwoYnVmKTsgaHBvcyA9IDA7IHJldHVybjsKKworICAgICAgY2FzZSBTQ1JfQ1c6ICAgICAgICAgICAgICAgICAgICAgIC8qIENsb3NlIGZ1bGxzY3JlZW4gd2luZG93ICovCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gd2luZG93IHRvIGNsb3NlICovCisKKyAgICAgIGNhc2UgU0NSX0NEOgorICAgICAgICByZXR1cm47CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNvbm9sbCgiKioqIHNjcmVlbigpIGNhbGxlZCB3aXRoIGJhZCBvYmplY3QgKioqIik7CisgICAgICAgIGhwb3MgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorfQorI2VuZGlmIC8qIE5PRElTUExBWSAqLworCisvKiAgRSBSIE0gUyBHICAtLSAgTm9uZmF0YWwgZXJyb3IgbWVzc2FnZSAgKi8KKworLyogU2hvdWxkIGJlIHVzZWQgb25seSBmb3IgcHJpbnRpbmcgdGhlIG1lc3NhZ2UgdGV4dCBmcm9tIGFuIEVycm9yIHBhY2tldC4gKi8KKworVk9JRAorZXJtc2cobXNnKSBjaGFyICptc2c7IHsgICAgICAgICAgICAgICAgIC8qIFByaW50IGVycm9yIG1lc3NhZ2UgKi8KKyAgICBkZWJ1ZyhGMTEwLCJlcm1zZyIsbXNnLDApOworICAgIGlmIChsb2NhbCkKKyAgICAgIHh4c2NyZWVuKFNDUl9FTSwwLDBMLG1zZyk7CisgICAgdGxvZyhGMTEwLCJQcm90b2NvbCBFcnJvcjoiLG1zZywwTCk7Cit9CisjZW5kaWYgLyogTk9YRkVSICovCisKK1ZPSUQKK3NldHNlc2xvZyh4KSBpbnQgeDsgeworICAgIHNlc2xvZyA9IHg7CisjaWZkZWYgS1VJCisgICAgS3VpU2V0UHJvcGVydHkoS1VJX1RFUk1fQ0FQVFVSRSx4LDApOworI2VuZGlmIC8qIEtVSSAqLworfQorCitWT0lECitkb2NsZWFuKGZjKSBpbnQgZmM7IHsgICAgICAgICAgICAgICAgICAgLyogR2VuZXJhbCBjbGVhbnVwICovCisjaWZkZWYgT1MyT1JVTklYCisgICAgZXh0ZXJuIGludCB0dHlmZDsKKyNlbmRpZiAvKiBPUzJPUlVOSVggKi8KKyAgICBleHRlcm4gaW50ICBrZWVwOworICAgIGV4dGVybiBpbnQgZXhpdGhhbmd1cDsKKyNpZm5kZWYgTk9YRkVSCisgICAgZXh0ZXJuIGNoYXIgZmlsbmFtW107CisjZW5kaWYgLyogTk9YRkVSICovCisjaWZuZGVmIE5PSUNQCisgICAgaW50IHg7CisKKyAgICBpZiAoZmMgPiAwKQorICAgICAgZG9zdG9wKCk7ICAgICAgICAgICAgICAgICAvKiBTdG9wIGFsbCBjb21tYW5kIGZpbGVzIGFuZCBlbmQgbWFjcm9zICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICBpZiAocGt0bG9nKSB7CisgICAgICAgICpwa3RmaWwgPSAnXDAnOworICAgICAgICBwa3Rsb2cgPSAwOworICAgICAgICB6Y2xvc2UoWlBGSUxFKTsKKyAgICB9CisjZW5kaWYgLyogTk9YRkVSICovCisgICAgaWYgKHNlc2xvZykgeworICAgICAgICAqc2VzZmlsID0gJ1wwJzsKKyAgICAgICAgc2V0c2VzbG9nKDApOworICAgICAgICB6Y2xvc2UoWlNGSUxFKTsKKyAgICB9CisjaWZkZWYgVExPRworICAgIGlmICh0cmFsb2cpIHsKKyAgICAgICAgdGxvZyhGMTAwLCJUcmFuc2FjdGlvbiBMb2cgQ2xvc2VkIiwiIiwwTCk7CisgICAgICAgICp0cmFmaWwgPSAnXDAnOworICAgICAgICB0cmFsb2cgPSAwOworICAgICAgICB6Y2xvc2UoWlRGSUxFKTsKKyAgICB9CisjZW5kaWYgLyogVExPRyAqLworCisgICAgZGVidWcoRjEwMCwiZG9jbGVhbiBjYWxsaW5nIGRvbG9nZW5kIiwiIiwwKTsKKyAgICBkb2xvZ2VuZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgY3VycmVudCBsb2cgcmVjb3JkIGlmIGFueSAqLworI2lmZGVmIENPTU1FTlQKKyAgICBpZiAoZGlhbG9nKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBjb25uZWN0aW9uIGxvZyBvcGVuICovCisJZGlhbG9nID0gMDsKKyAgICAgICAgKmRpYWZpbCA9ICdcMCc7ICAgICAgICAgICAgICAgICAvKiBjbG9zZSBpdC4gKi8KKyAgICAgICAgemNsb3NlKFpESUZJTCk7CisgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmbmRlZiBOT0lDUAorI2lmbmRlZiBOT1NQTAorICAgIHpjbG9zZShaUkZJTEUpOyAgICAgICAgICAgICAgICAgICAgIC8qIFJFQUQgYW5kIFdSSVRFIGZpbGVzLCBpZiBhbnkuICovCisgICAgemNsb3NlKFpXRklMRSk7CisjaWZuZGVmIE5PWEZFUgorICAgIHpjbG9zZShaSUZJTEUpOyAgICAgICAgICAgICAgICAgICAgIC8qIEFuZCBvdGhlciBmaWxlcyB0b28gKi8KKyAgICB4ID0gY2hrZm4oWk9GSUxFKTsJCQkvKiBEb3dubG9hZCBpbiBwcm9ncmVzcz8gKi8KKyAgICBkZWJ1ZyhGMTExLCJkb2NsZWFuIGNoa2ZuIFpPRklMRSIsZmlsbmFtLHgpOworICAgIGRlYnVnKEYxMTEsImRvY2xlYW4ga2VlcCIsIiIsa2VlcCk7CisgICAgemNsb3NlKFpPRklMRSk7CQkJLyogQ2xvc2Ugb3V0cHV0IGZpbGUgKi8KKyAgICBpZiAoeCA+IDAgJiYgIWtlZXApIHsJCS8qIElmIGl0IHdhcyBiZWluZyBkb3dubG9hZGVkICovCisJaWYgKGZpbG5hbVswXSkKKwkgIHggPSB6ZGVsZXQoZmlsbmFtKTsJCS8qIERlbGV0ZSBpZiBJTkNPTVBMRVRFID0gRElTQ0FSRCAqLworCWRlYnVnKEYxMTEsImRvY2xlYW4gZG93bmxvYWQgZmlsZW5hbWUiLGZpbG5hbSx4KTsKKyAgICB9CisjZW5kaWYgLyogTk9YRkVSICovCisgICAgemNsb3NlKFpTWVNGTik7CisgICAgemNsb3NlKFpNRklMRSk7CisKKyAgICBpZiAoZmMgPCAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBSRVNFVGluZywgbm90IEVYSVRpbmcgKi8KKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoZGVibG9nKSB7ICAgICAgICAgICAgICAgICAgIC8qIENsb3NlIHRoZSBkZWJ1ZyBsb2cuICovCisgICAgICAgICAgICAqZGViZmlsID0gJ1wwJzsKKyAgICAgICAgICAgIGRlYmxvZyA9IDA7CisgICAgICAgICAgICB6Y2xvc2UoWkRGSUxFKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworCisjaWZuZGVmIE5PTE9DQUwKKyAgICBkZWJ1ZyhGMTAxLCJkb2NsZWFuIGV4aXRoYW5ndXAiLCIiLGV4aXRoYW5ndXApOworICAgIGlmIChsb2NhbCAmJiBleGl0aGFuZ3VwKSB7CQkvKiBDbG9zZSBjb21tdW5pY2F0aW9uIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgZXh0ZXJuIGludCBoYXNsb2NrOworCWludCB4OworCQorCXggPSB0dGNoaygpOworCWRlYnVnKEYxMDEsImRvY2xlYW4gdHRjaGsoKSIsIiIseCk7CisjaWZkZWYgT1MyT1JVTklYCisJZGVidWcoRjEwMSwiZG9jbGVhbiB0dHlmZCIsIiIsdHR5ZmQpOworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworICAgICAgICBpZiAoeCA+PSAwCisjaWZkZWYgT1MyCisgICAgICAgICAgICB8fCB0dHlmZCAhPSAtMQorI2Vsc2UKKyNpZmRlZiBVTklYCisgICAgICAgICAgICB8fCBoYXNsb2NrICAgICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIHdlIGdldCBsb2NrZmlsZSEgKi8KKyAgICAgICAgICAgIHx8ICghbmV0d29yayAmJiB0dHlmZCA+IC0xKQorI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgZXh0ZXJuIGludCB3YXNjbG9zZWQsIHdoeWNsb3NlZDsKKwkgICAgZGVidWcoRjEwMCwiZG9jbGVhbiBoYW5naW5nIHVwIGFuZCBjbG9zaW5nIiwiIiwwKTsKKyAgICAgICAgICAgIGlmIChtc2dmbGcpIHsKKyNpZmRlZiBVTklYCisgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogVU5JWCAqLworICAgICAgICAgICAgICAgIHByaW50ZigiQ2xvc2luZyAlcy4uLiIsdHRuYW1lKTsKKyAgICAgICAgICAgIH0KKyNpZm5kZWYgTk9ESUFMCisgICAgICAgICAgICBtZG1odXAoKTsgICAgICAgICAgICAgICAgICAgLyogSGFuZ3VwIHRoZSBtb2RlbT8/PyAqLworI2VuZGlmIC8qIE5PRElBTCAqLworICAgICAgICAgICAgdHRjbG9zKDApOyAgICAgICAgICAgICAgICAgIC8qIENsb3NlIGV4dGVybmFsIGxpbmUsIGlmIGFueSAqLworICAgICAgICAgICAgaWYgKG1zZ2ZsZykgeworICAgICAgICAgICAgICAgIHByaW50ZigiT0tcbiIpOworI2lmZGVmIFVOSVgKKyAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZiAvKiBVTklYICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod2FzY2xvc2VkKSB7CisgICAgICAgICAgICAgICAgd2h5Y2xvc2VkID0gV0NfQ0xPUzsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICBpZiAobm1hYykgeyAgICAgICAgICAgICAvKiBBbnkgbWFjcm9zIGRlZmluZWQ/ICovCisgICAgICAgICAgICAgICAgICAgIGludCBrOyAgICAgICAgICAgICAgLyogWWVzICovCisgICAgICAgICAgICAgICAgICAgIGsgPSBtbG9vayhtYWN0YWIsIm9uX2Nsb3NlIixubWFjKTsgIC8qIExvb2sgdGhpcyB1cCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoayA+PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBmb3VuZCwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdhc2Nsb3NlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmludGYoIk9OX0NMT1NFIERPQ0xFQU5cbiIpOyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKihtYWN0YWJba10ua3dkKSA9IE5VTDsgICAgICAgICAvKiBTZWUgY29tbWVudCBiZWxvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvZG8oayxja2l0b2Eod2h5Y2xvc2VkKSwwKSA+IC0xKSAvKiBzZXQgaXQgdXAsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcigxKTsgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBleGVjdXRlIGl0ICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgICAgICAgICB3YXNjbG9zZWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNrc3RybmNweSh0dG5hbWUsZGZ0dHksVFROQU1MRU4pOyAvKiBSZXN0b3JlIGRlZmF1bHQgdHR5ICovCisgICAgICAgIGxvY2FsID0gZGZsb2M7ICAgICAgICAgICAgICAgICAgLyogQW5kIGRlZmF1bHQgcmVtb3RlL2xvY2FsIHN0YXR1cyAqLworICAgIH0KKyNpZmRlZiBERUJVRworICAgIGVsc2UgaWYgKGxvY2FsKSBkZWJ1ZyhGMTAwLCJkb2NsZWFuIGhhbmd1cC9jbG9zZSBza2lwcGVkIiwiIiwwKTsKKyNlbmRpZiAvKiBERUJVRyAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmZGVmIE5FV0ZUUAorICAgIGZ0cGJ5ZSgpOwkJCQkvKiBJZiBGVFAgY29ubmVjdGlvbiBvcGVuLCBjbG9zZSBpdCAqLworI2VuZGlmIC8qIE5FV0ZUUCAqLworCisjaWZkZWYgSUtTRAorICAgIGlmIChpbnNlcnZlcikKKyAgICAgIHR0Y2xvcygwKTsJCQkvKiBJZiBJS1NELCBjbG9zZSBzb2NrZXQgKi8KKyNlbmRpZiAvKiBJS1NEICovCisKKyNpZm5kZWYgTk9TUEwKKy8qCisgIElmIGEgbWFjcm8gbmFtZWQgIm9uX2V4aXQiIGlzIGRlZmluZWQsIGV4ZWN1dGUgaXQuICBBbHNvIHJlbW92ZSBpdCBmcm9tIHRoZQorICBtYWNybyB0YWJsZSwgaW4gY2FzZSBpdHMgZGVmaW5pdGlvbiBpbmNsdWRlcyBhbiBFWElUIG9yIFFVSVQgY29tbWFuZCwgd2hpY2gKKyAgd291bGQgY2F1c2UgbXVjaCByZWN1cnNpb24gYW5kIHdvdWxkIHByZXZlbnQgdGhlIHByb2dyYW0gZnJvbSBldmVyIGFjdHVhbGx5CisgIEVYSVRpbmcuCisqLworICAgIGlmIChubWFjKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFueSBtYWNyb3MgZGVmaW5lZD8gKi8KKyAgICAgICAgaW50IGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBZZXMgKi8KKyAgICAgICAgY2hhciAqIGNtZCA9ICJvbl9leGl0IjsgICAgICAgICAvKiBNU1ZDIDIueCBjb21waWxlciBlcnJvciAqLworICAgICAgICBrID0gbWxvb2sobWFjdGFiLGNtZCxubWFjKTsgICAgIC8qIExvb2sgdXAgIm9uX2V4aXQiICovCisgICAgICAgIGlmIChrID49IDApIHsgICAgICAgICAgICAgICAgICAgLyogSWYgZm91bmQsICovCisjaWZkZWYgQ09NTUVOVAorCSAgICAvKiBUaGlzIG1ha2VzIGEgbWVzcyBpZiBPTl9FWElUIGl0c2VsZiBleGVjdXRlcyBtYWNyb3MgKi8KKyAgICAgICAgICAgICoobWFjdGFiW2tdLmt3ZCkgPSBOVUw7ICAgICAvKiBwb2tlIGl0cyBuYW1lIGZyb20gdGhlIHRhYmxlLCAqLworI2Vsc2UKKwkgICAgLyogUmVwbGFjZSB0aGUga2V5d29yZCB3aXRoIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3Qgd3JlY2sgdGhlICovCisJICAgIC8qIG9yZGVyIG9mIHRoZSBrZXl3b3JkIHRhYmxlICovCisJICAgIGNrc3RybmNweShtYWN0YWJba10ua3dkLCJvbl9leHh4Iiw4KTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICBpZiAoZG9kbyhrLCIiLDApID4gLTEpICAgICAgLyogc2V0IGl0IHVwLCAqLworICAgICAgICAgICAgICBwYXJzZXIoMSk7ICAgICAgICAgICAgICAgIC8qIGFuZCBleGVjdXRlIGl0ICovCisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKy8qCisgIFB1dCBjb25zb2xlIHRlcm1pbmFsIGJhY2sgdG8gbm9ybWFsLiAgVGhpcyBpcyBkb25lIGhlcmUgYmVjYXVzZSB0aGUKKyAgT05fRVhJVCBtYWNybyBjYWxscyB0aGUgcGFyc2VyLCB3aGljaCBtZWRkbGVzIHdpdGggY29uc29sZSB0ZXJtaW5hbCBtb2Rlcy4KKyovCisgICAgY29ucmVzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBjb25zb2xlIHRlcm1pbmFsLiAqLworCisjaWZkZWYgQ09NTUVOVAorLyogU2hvdWxkIGJlIG5vIG5lZWQgZm9yIHRoaXMsIGFuZCBtYXliZSBpdCdzIHNjcmV3aW5nIHRoaW5ncyB1cD8gKi8KKyAgICBjb25ub2koKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUdXJuIG9mZiBjb25zb2xlIGludGVycnVwdCB0cmFwcyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgIC8qIERlbGV0ZSB0aGUgU3RhcnR1cCBGaWxlIGlmIHdlIGFyZSBzdXBwb3NlZCB0by4gKi8KKyNpZm5kZWYgTk9JQ1AKKyAgICB7CisgICAgICAgIGV4dGVybiBpbnQgRGVsZXRlU3RhcnR1cEZpbGU7CisgICAgICAgIGRlYnVnKEYxMTEsImRvY2xlYW4gRGVsZXRlU3RhcnR1cEZpbGUiLGNtZGZpbCxEZWxldGVTdGFydHVwRmlsZSk7CisgICAgICAgIGlmIChEZWxldGVTdGFydHVwRmlsZSkgeworICAgICAgICAgICAgaW50IHJjID0gemRlbGV0KGNtZGZpbCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJkb2NsZWFuIHpkZWxldCIsY21kZmlsLHJjKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBOT0lDUCAqLworICAgIHN5c2NsZWFudXAoKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFN5c3RlbS1kZXBlbmRlbnQgY2xlYW51cCwgbGFzdCAqLworfQorCisvKiAgRCBPIEUgWCBJIFQgIC0tICBFeGl0IGZyb20gdGhlIHByb2dyYW0uICAqLworCisvKgorICBGaXJzdCBhcmcgaXMgZ2VuZXJhbCwgc3lzdGVtLWluZGVwZW5kZW50IHN5bWJvbDogR09PRF9FWElUIG9yIEJBRF9FWElULgorICBJZiBzZWNvbmQgYXJnIGlzIC0xLCB0YWtlIDFzdCBhcmcgbGl0ZXJhbGx5LgorICBJZiBzZWNvbmQgYXJnIGlzIG5vdCAtMSwgd29yayBpdCBpbnRvIHRoZSBleGl0IGNvZGUuCisqLworVk9JRAorZG9leGl0KGV4aXRzdGF0LGNvZGUpIGludCBleGl0c3RhdCwgY29kZTsgeworICAgIGV4dGVybiBpbnQgeF9sb2dnZWQsIHF1aXR0aW5nOworI2lmZGVmIE9TMgorICAgIGV4dGVybiBpbnQgZGlzcGxheV9kZW1vOworICAgIGV4dGVybiBpbnQgU3lzSW5pdGVkOworI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgS1JCNAorICAgIGV4dGVybiBpbnQga3JiNF9hdXRvZGVsOworI2VuZGlmIC8qIEtSQjQgKi8KKyNpZmRlZiBLUkI1CisgICAgZXh0ZXJuIGludCBrcmI1X2F1dG9kZWw7CisjZW5kaWYgLyogS1JCNSAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisKKyNpZmRlZiBWTVMKKyAgICBjaGFyIGVudnN0cls2NF07CisgICAgc3RhdGljICRERVNDUklQVE9SKHN5bW5hbSwiQ0tFUk1JVF9TVEFUVVMiKTsKKyAgICBzdGF0aWMgc3RydWN0IGRzYyRkZXNjcmlwdG9yX3Mgc3ltdmFsOworI2VuZGlmIC8qIFZNUyAqLworICAgIGludCBpOworCisjaWZkZWYgREVCVUcKKyNpZmRlZiBVU0VfTFVDQUNIRQorICAgIGV4dGVybiBsb25nIGx1Y2FsbHMsIGx1aGl0cywgeHhoaXRzLCBsdWxvb3A7CisgICAgZXh0ZXJuIGludCBsdXNpemU7CisjZW5kaWYgLyogVVNFX0xVQ0FDSEUgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICBleHRlcm4gaW50IGNtZHN0YXRzW107CisjZW5kaWYgLyogTk9TUEwgKi8KKworICAgIHF1aXR0aW5nKys7CisKKyNpZmRlZiBPUzIKKyAgICBpZiAoICFTeXNJbml0ZWQgKSB7CisgICAgICAgIHN0YXRpYyBpbnQgaW5pdGluZyA9IDA7CisgICAgICAgIGlmICggaW5pdGluZyApCisJICBleGl0KDI1Myk7CisgICAgICAgIGluaXRpbmcgPSAxOworICAgICAgICBzeXNpbml0KCk7CisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworCisgICAgaWYgKGRlYmxvZykgeworI2lmZGVmIFVTRV9MVUNBQ0hFCisJZGVidWcoRjEwMSwibG9va3VwIGNhY2hlIHNpemUiLCIiLGx1c2l6ZSk7CisJZGVidWcoRjEwMSwibG9va3VwIGNhbGxzIC4uLi4iLCIiLGx1Y2FsbHMpOworCWRlYnVnKEYxMDEsImxvb2t1cCBjYWNoZSBoaXRzIiwiIixsdWhpdHMpOworCWRlYnVnKEYxMDEsImxvb2t1cCBzdGFydCBoaXRzIiwiIix4eGhpdHMpOworCWRlYnVnKEYxMDEsImxvb2t1cCBsb29wIGl0ZXJhdGlvbnMiLCIiLGx1bG9vcCk7CisjZW5kaWYgLyogVVNFX0xVQ0FDSEUgKi8KKyNpZm5kZWYgTk9TUEwKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkgICAgaWYgKGNtZHN0YXRzW2ldKQorCSAgICAgIGRlYnVnKEYxMTEsIkNNU1RBVFMiLGNraXRvYShpKSxjbWRzdGF0c1tpXSk7CisJfQorI2VuZGlmIC8qIE5PU1BMICovCisJZGVidWcoRjEwMSwiZG9leGl0IGV4aXRzdGF0IiwiIixleGl0c3RhdCk7CisJZGVidWcoRjEwMSwiZG9leGl0IGNvZGUiLCIiLGNvZGUpOworCWRlYnVnKEYxMDEsImRvZXhpdCB4aXRzdGEiLCIiLHhpdHN0YSk7CisgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisKKyNpZmRlZiBDS19LRVJCRVJPUworICAgIC8qIElmIHdlIGFyZSBhdXRvbWF0aWNhbGx5IGRlc3Ryb3lpbmcgS2VyYmVyb3MgY3JlZGVudGlhbHMgb24gRXhpdCAqLworICAgIC8qIGRvIGl0IG5vdy4gKi8KKyNpZmRlZiBLUkI0CisgICAgaWYgKGtyYjRfYXV0b2RlbCA9PSBLUkJfREVMX0VYKSB7CisgICAgICAgIGV4dGVybiBzdHJ1Y3Qga3JiX29wX2RhdGEga3JiX29wOworICAgICAgICBrcmJfb3AudmVyc2lvbiA9IDQ7CisgICAgICAgIGtyYl9vcC5jYWNoZSA9IE5VTEw7CisgICAgICAgIGNrX2tyYjRfZGVzdHJveSgma3JiX29wKTsKKyAgICB9CisjZW5kaWYgLyogS1JCNCAqLworI2lmZGVmIEtSQjUKKyAgICBpZiAoa3JiNV9hdXRvZGVsID09IEtSQl9ERUxfRVgpIHsKKyAgICAgICAgZXh0ZXJuIHN0cnVjdCBrcmJfb3BfZGF0YSBrcmJfb3A7CisgICAgICAgIGV4dGVybiBjaGFyICoga3JiNV9kX2NjOworICAgICAgICBrcmJfb3AudmVyc2lvbiA9IDU7CisgICAgICAgIGtyYl9vcC5jYWNoZSA9IGtyYjVfZF9jYzsKKyAgICAgICAgY2tfa3JiNV9kZXN0cm95KCZrcmJfb3ApOworICAgIH0KKyNlbmRpZiAvKiBLUkI1ICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgaWYgKFN5c0luaXRlZCkKKyAgICB7CisjaWZkZWYgRENNREJVRgorICAgICAgICBleHRlcm4gc3RydWN0IGNtZHB0ciAqY21kc3RrOworI2Vsc2UKKyAgICAgICAgZXh0ZXJuIHN0cnVjdCBjbWRwdHIgY21kc3RrW107CisjZW5kaWYgLyogRENNREJVRiAqLworICAgICAgICBleHRlcm4gaW50IHR0X3N0YXR1c1tdOworICAgICAgICBleHRlcm4gaW50IHZtb2RlOworCisgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgZGVtbyBzY3JlZW4gdG8gYmUgZGlzcGxheWVkLCBkaXNwbGF5IGl0ICovCisgICAgICAgIGlmIChkaXNwbGF5X2RlbW8pIHsKKyAgICAgICAgICAgIGRlbW9zY3JuKFZDTUQpOworICAgICAgICAgICAgZGlzcGxheV9kZW1vID0gMDsKKyAgICAgICAgfQorI2lmbmRlZiBLVUkKKyAgICAgICAgLyogVGhpcyBpcyBnb2luZyB0byBiZSBoaWRlb3VzLiAgSWYgd2UgaGF2ZSBhIHN0YXR1cyBsaW5lICovCisgICAgICAgIC8qIGluIHRoZSBjb21tYW5kIHdpbmRvdyB0dXJuIGl0IG9mZiBiZWZvcmUgd2UgZXhpdC4gICAgICAqLworCisgICAgICAgIGlmICggdHRfc3RhdHVzW1ZDTURdICYmIHZtb2RlID09IFZDTUQgKSB7CisgICAgICAgICAgICBkb21hYygiX2NsZWFyX3N0YXR1c2xpbmUiLCJzZXQgY29tbWFuZCBzdGF0dXNsaW5lIG9mZiIsCisgICAgICAgICAgICAgICAgICAgY21kc3RrW2NtZGx2bF0uY2NmbGdzKTsKKyAgICAgICAgICAgIGRlbG1hYygiX2NsZWFyX3N0YXR1c2xpbmUiLDEpOworICAgICAgICAgICAgUmVxdWVzdFNjcmVlbk11dGV4KC0xKTsKKyAgICAgICAgICAgIFZzY3JuSXNEaXJ0eSh2bW9kZSk7CisgICAgICAgICAgICBSZWxlYXNlU2NyZWVuTXV0ZXgoKTsKKyAgICAgICAgICAgIHdoaWxlICggSXNWc2NybkRpcnR5KHZtb2RlKSApCisgICAgICAgICAgICAgICAgbXNsZWVwKDIwMCk7CisgICAgICAgICAgICBSZXF1ZXN0U2NyZWVuTXV0ZXgoLTEpOworICAgICAgICAgICAgUmVsZWFzZVNjcmVlbk11dGV4KCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgRGlhbGVyU2VuZChPUFRfS0VSTUlUX0VYSVQsZXhpdHN0YXQpOworI2lmbmRlZiBLVUkKKyAgICAgICAgZGVidWcoRjEwMCwiZG9leGl0IGFib3V0IHRvIG1zbGVlcCIsIiIsMCk7CisKKyAgICAgICAgaWYgKCBpc1dpbjk1KCkgKQorICAgICAgICAgICAgbXNsZWVwKDI1MCk7CisjZW5kaWYgLyogS1VJICovCisgICAgfQorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworI2lmZGVmIElLU0QKKyNpZmRlZiBDS19MT0dJTgorICAgIGlmIChpbnNlcnZlciAmJiB4X2xvZ2dlZCkgeworI2lmbmRlZiBOT1NQTAorLyoKKyAgSWYgYSBtYWNybyBuYW1lZCAib25fbG9nb3V0IiBpcyBkZWZpbmVkLCBleGVjdXRlIGl0LiAgQWxzbyByZW1vdmUgaXQgZnJvbSB0aGUKKyAgbWFjcm8gdGFibGUsIGluIGNhc2UgaXRzIGRlZmluaXRpb24gaW5jbHVkZXMgYW4gRVhJVCBvciBRVUlUIGNvbW1hbmQsIHdoaWNoCisgIHdvdWxkIGNhdXNlIG11Y2ggcmVjdXJzaW9uIGFuZCB3b3VsZCBwcmV2ZW50IHRoZSBwcm9ncmFtIGZyb20gZXZlciBhY3R1YWxseQorICBFWElUaW5nLgorKi8KKwlpZiAobm1hYykgewkJCS8qIEFueSBtYWNyb3MgZGVmaW5lZD8gKi8KKwkgICAgaW50IGs7CQkJLyogWWVzICovCisJICAgIGNoYXIgKiBjbWQgPSAib25fbG9nb3V0IjsJLyogTVNWQyAyLnggY29tcGlsZXIgZXJyb3IgKi8KKwkgICAgayA9IG1sb29rKG1hY3RhYixjbWQsbm1hYyk7CS8qIExvb2sgdXAgIm9uX2xvZ291dCIgKi8KKwkgICAgaWYgKGsgPj0gMCkgewkJLyogSWYgZm91bmQsICovCisJCSoobWFjdGFiW2tdLmt3ZCkgPSBOVUw7CS8qIHBva2UgaXRzIG5hbWUgZnJvbSB0aGUgdGFibGUsICovCisJCWlmIChkb2RvKGssIiIsMCkgPiAtMSkJLyogc2V0IGl0IHVwLCAqLworCQkgIHBhcnNlcigxKTsJCS8qIGFuZCBleGVjdXRlIGl0ICovCisJICAgIH0KKwl9CisjZW5kaWYgLyogTk9TUEwgKi8KKwl6dmxvZ291dCgpOworICAgIH0KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2VuZGlmIC8qIElLU0QgKi8KKworICAgIGRlYnVnKEYxMDAsImRvZXhpdCBhYm91dCB0byBkb2NsZWFuIiwiIiwwKTsKKyAgICBkb2NsZWFuKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhbiB1cCBtb3N0IHRoaW5ncyAqLworCisjaWZkZWYgVk1TCisgICAgaWYgKGNvZGUgPT0gLTEpCisgICAgICBjb2RlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2luY2Ugd2Ugc2V0IHR3byBkaWZmZXJlbnQgaXRlbXMgKi8KKyAgICBzcHJpbnRmKGVudnN0ciwiJWQiLCBleGl0c3RhdCB8IGNvZGUpOyAvKiBTQUZFICovCisgICAgc3ltdmFsLmRzYyR3X2xlbmd0aCA9IChpbnQpc3RybGVuKGVudnN0cik7CisgICAgc3ltdmFsLmRzYyRhX3BvaW50ZXIgPSBlbnZzdHI7CisgICAgc3ltdmFsLmRzYyRiX2NsYXNzID0gRFNDJEtfQ0xBU1NfUzsKKyAgICBzeW12YWwuZHNjJGJfZHR5cGUgPSBEU0MkS19EVFlQRV9UOworICAgIGkgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIGluIGdsb2JhbCB0YWJsZSAqLworI2lmZGVmIENPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcnRpbiBaaW5zZXIgKi8KKyAgICBMSUIkU0VUX1NZTUJPTCgmc3ltbmFtLCAmc3ltdmFsLCAmaSk7CisjZWxzZQorICAgIGxpYiRzZXRfc3ltYm9sKCZzeW1uYW0sICZzeW12YWwsICZpKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgaWYgKGV4aXRzdGF0ID09IEJBRF9FWElUKQorICAgICAgZXhpdHN0YXQgPSBTUyRfQUJPUlQgfCBTVFMkTV9JTkhJQl9NU0c7CisgICAgaWYgKGV4aXRzdGF0ID09IEdPT0RfRVhJVCkKKyAgICAgIGV4aXRzdGF0ID0gU1MkX05PUk1BTCB8IFNUUyRNX0lOSElCX01TRzsKKyNlbHNlIC8qIE5vdCBWTVMgKi8KKyAgICBpZiAoY29kZSAhPSAtMSkgICAgICAgICAgICAgICAgICAgICAvKiBUYWtlIDFzdCBhcmcgbGl0ZXJhbGx5ICovCisgICAgICBleGl0c3RhdCB8PSBjb2RlOworI2VuZGlmIC8qIFZNUyAqLworCisjaWZkZWYgSUtTRAorI2lmZGVmIElLU0RCCisgICAgZGVidWcoRjEwMSwiZG9leGl0IGlrZGJvcGVuIiwiIixpa2Rib3Blbik7CisgICAgaWYgKGlrZGJvcGVuICYmIGRiZnApIHsgICAgICAgICAgICAgLyogSWYgSUtTRCBkYXRhYmFzZSBvcGVuICovCisgICAgICAgIGludCB4OworICAgICAgICB4ID0gZnJlZXNsb3QobXlkYnNsb3QpOyAgICAgICAgIC8qIEZyZWUgb3VyIHNsb3QuLi4gKi8KKyAgICAgICAgZGVidWcoRjEwMSwiZG9leGl0IGZyZWVzbG90IiwiIix4KTsKKyAgICAgICAgZmNsb3NlKGRiZnApOyAgICAgICAgICAgICAgICAgICAvKiBhbmQgY2xvc2UgaXQuICovCisgICAgfQorI2VuZGlmIC8qIElLU0RCICovCisjZW5kaWYgLyogSUtTRCAqLworCisvKiBXZSBoYXZlIHB1dCB0aGlzIG9mZiB0aWxsIHRoZSB2ZXJ5IGxhc3QgbW9tZW50Li4uICovCisKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIENsb3NlIHRoZSBkZWJ1ZyBsb2cuICovCisgICAgICAgIGRlYnVnKEYxMDEsIkMtS2VybWl0IEVYSVQgc3RhdHVzIiwiIixleGl0c3RhdCk7CisgICAgICAgICpkZWJmaWwgPSAnXDAnOworICAgICAgICBkZWJsb2cgPSAwOworICAgICAgICB6Y2xvc2UoWkRGSUxFKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKworI2lmZGVmIE9TMgorICAgIF9leGl0KGV4aXRzdGF0KTsgICAgICAgICAgICAvKiBFeGl0IGZyb20gQy1LZXJtaXQgKG5vIG1hdHRlciB3aGF0KSAqLworI2Vsc2UgLyogT1MyICovCisgICAgZXhpdChleGl0c3RhdCk7ICAgICAgICAgICAgICAgICAgICAgLyogRXhpdCBmcm9tIEMtS2VybWl0ICovCisjZW5kaWYgLyogT1MyICovCit9CisKK1ZPSUQKK2JnY2hrKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBiYWNrZ3JvdW5kIHN0YXR1cyAqLworICAgIGlmIChiZ3NldCA8IDApIHsgICAgICAgICAgICAgICAgICAgIC8qIFRoZXkgZGlkbid0IHR5cGUgU0VUIEJBQ0tHUk9VTkQgKi8KKyNpZmRlZiBWTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgcHJvbXB0IGZsYWcgYmFzZWQgb24gKi8KKyAgICAgICAgcGZsYWcgPSAhYmF0Y2g7ICAgICAgICAgICAgICAgICAvKiB3aGF0IHdlIGRldGVjdGVkIGF0IHN0YXJ0dXAuICovCisjZWxzZQorICAgICAgICBwZmxhZyA9ICFiYWNrZ3JkOworI2VuZGlmIC8qIFZNUyAqLworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSBTRVQgQkFDS0dST1VORCB2YWx1ZSAqLworICAgICAgICBwZmxhZyA9IChiZ3NldCA9PSAwID8gMSA6IDApOworICAgIH0KKworI2lmbmRlZiBOT0lDUAorICAgIC8qIE1lc3NhZ2UgZmxhZyBvbiBvbmx5IGlmIGF0IHRvcCBsZXZlbCwgcGZsYWcgaXMgb24sIGFuZCBRVUlFVCBpcyBPRkYgKi8KKyAgICBpZiAoIXhjbWRzcmMpCisgICAgICBtc2dmbGcgPSAocGZsYWcgPT0gMCkgPyAwIDogIXF1aWV0OworICAgIGVsc2UgbXNnZmxnID0gMDsKKyNlbHNlCisgICAgbXNnZmxnID0gMDsKKyNlbmRpZiAvKiBOT0lDUCAqLworfQorCisvKiBTZXQgY29uc29sZSBpbnRlcnJ1cHRzICovCisKK1ZPSUQKK3NldGludCgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY2NvcmRpbmcgdG8gU0VUIENPTU1BTkQgSU5URVJSVVAgKi8KKyAgICBpbnQgeCA9IDA7CisgICAgaWYgKGNtZGludCkgIHggfD0gMTsKKyAgICBpZiAoeHN1c3BlbmQpIHggfD0gMjsKKyAgICBkZWJ1ZyhGMTAxLCJzZXRpbnQiLCIiLHgpOworCisgICAgc3dpdGNoICh4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBkZXNpcmVkIGNvbWJpbmF0aW9uICovCisgICAgICBjYXNlIDA6IGNvbm5vaSgpOyBicmVhazsgICAgICAgICAgLyogTm8gaW50ZXJydXB0cyAqLworICAgICAgY2FzZSAxOiBjb25pbnQodHJhcCxTSUdfSUdOKTsgYnJlYWs7CisgICAgICBjYXNlIDI6IGNvbmludChTSUdfSUdOLHN0cHRyYXApOyBicmVhazsKKyAgICAgIGNhc2UgMzogY29uaW50KHRyYXAsc3RwdHJhcCk7IGJyZWFrOworICAgIH0KKyAgICBiZ2NoaygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBiYWNrZ3JvdW5kIHN0YXR1cyAqLworfQorCisjaWZkZWYgREVCVUcKKy8qICBEIEUgQiBVIEcgIC0tICBFbnRlciBhIHJlY29yZCBpbiB0aGUgZGVidWdnaW5nIGxvZyAgKi8KKworLyoKKyBDYWxsIHdpdGggYSBmb3JtYXQsIHR3byBzdHJpbmdzLCBhbmQgYSBudW1iZXI6CisgICBmICAtIEZvcm1hdCwgYSBiaXQgc3RyaW5nIGluIHJhbmdlIDAtNy4KKyAgICAgICAgSWYgYml0IHggaXMgb24sIHRoZW4gYXJndW1lbnQgbnVtYmVyIHggaXMgcHJpbnRlZC4KKyAgIHMxIC0gU3RyaW5nLCBhcmd1bWVudCBudW1iZXIgMS4gIElmIHNlbGVjdGVkLCBwcmludGVkIGFzIGlzLgorICAgczIgLSBTdHJpbmcsIGFyZ3VtZW50IG51bWJlciAyLiAgSWYgc2VsZWN0ZWQsIHByaW50ZWQgaW4gYnJhY2tldHMuCisgICBuICAtIExvbmcgaW50LCBhcmd1bWVudCAzLiAgSWYgc2VsZWN0ZWQsIHByaW50ZWQgcHJlY2VkZWQgYnkgZXF1YWxzIHNpZ24uCisKKyAgIGY9MCBpcyBzcGVjaWFsOiBwcmludCBzMSxzMiwgYW5kIGludGVycHJldCBuIGFzIGEgY2hhci4KKworICAgZj1GMDExICgzKSBpcyBhbHNvIHNwZWNpYWw7IGluIHRoaXMgY2FzZSBzMiBpcyBpbnRlcnBldGVkIGFzIGEgY291bnRlZAorICAgc3RyaW5nIHRoYXQgbWlnaHQgY29udGFpbiBOVUxzLiAgbiBpcyB0aGUgbGVuZ3RoLiAgSWYgbiBpcyBuZWdhdGl2ZSwgdGhpcworICAgbWVhbnMgdGhlIHN0cmluZyBoYXMgYmVlbiB0cnVuY2F0ZWQgYW5kICIuLiIgc2hvdWxkIGJlIHByaW50ZWQgYWZ0ZXIgdGhlCisgICBmaXJzdCBuIGJ5dGVzLiAgTlVMIGFuZCBMRiBieXRlcyBhcmUgcHJpbnRlZCBhcyAiPE5VTD4iIGFuZCAiPExGPiIuCisKKyAgIEdsb2JhbHM6CisgICAgIGRlYmxvZzogbm9uemVybyBpZiBkZWJ1ZyBsb2cgb3Blbi4KKyAgICAgZGVib2s6ICBub256ZXJvIGlmIG9rIHRvIHdyaXRlIGVudHJpZXMuCisqLworLyoKKyAgV0FSTklORzogRG9uJ3QgY2hhbmdlIERFQlVGTCB3aXRob3V0IGNoYW5naW5nIHNwcmludGYoKSBmb3JtYXRzIGJlbG93LAorICBhY2NvcmRpbmdseS4KKyovCisjZGVmaW5lIERCVUZMIDQwMDAKKy8qCisgIFdBUk5JTkc6IFRoaXMgcm91dGluZSBpcyBub3QgdGhyZWFkLXNhZmUsIGVzcGVjaWFsbHkgd2hlbiBLZXJtaXQgaXMKKyAgZXhlY3V0aW5nIG9uIG11bHRpcGxlIENQVXMgLS0gYXMgZGlmZmVyZW50IHRocmVhZHMgd3JpdGUgdG8gdGhlIHNhbWUKKyAgc3RhdGljIGJ1ZmZlciwgdGhlIGRlYnVnIHN0YXRlbWVudHMgYXJlIGFsbCBpbnRlcmxlYXZlZC4gIFRvIGJlIGZpeGVkCisgIGxhdGVyLi4uCisqLworc3RhdGljIGNoYXIgKmRicHRyID0gKGNoYXIgKikwOworCitpbnQKKyNpZmRlZiBDS19BTlNJQworZG9kZWJ1ZyhpbnQgZiwgY2hhciAqczEsIGNoYXIgKnMyLCBsb25nIG4pCisjZWxzZQorZG9kZWJ1ZyhmLHMxLHMyLG4pIGludCBmOyBjaGFyICpzMSwgKnMyOyBsb25nIG47CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGRvZGVidWcgKi8geworICAgIGNoYXIgKnNwOworICAgIGludCBsZW4xLCBsZW4yOworICAgIGV4dGVybiBpbnQgZGVidGltOworI2lmZGVmIE9TMgorICAgIGV4dGVybiBpbnQgU3lzSW5pdGVkOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgaWYgKCFkZWJsb2cgfHwgIWRlYm9rKQorICAgICAgcmV0dXJuKDApOworCisjaWZkZWYgQ09NTUVOVAorICAgIC8qIGV4cGVuc2l2ZS4uLiAqLworICAgIGlmICghY2hrZm4oWkRGSUxFKSkJCQkvKiBEZWJ1ZyBsb2cgbm90IG9wZW4sIGRvbid0LiAqLworICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICBpZiAoIWRicHRyKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgYnVmZmVyICovCisgICAgICAgIGRicHRyID0gbWFsbG9jKERCVUZMKzQpOyAgICAgICAgLyogVGhpcyBvbmx5IGhhcHBlbnMgb25jZSAqLworICAgICAgICBpZiAoIWRicHRyKSB7CisgICAgICAgICAgICB6Y2xvc2UoWkRGSUxFKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgIH0KKy8qCisgIFRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIGluIGNhc2Ugd2UgYWNjaWRlbnRhbGx5IHB1dCBhIGRlYnVnKCkKKyAgY2FsbCBpbiB0aGlzIHJvdXRpbmUsIG9yIGNhbGwgYW5vdGhlciByb3V0aW5lIHRoYXQgY29udGFpbnMgZGVidWcoKSBjYWxscy4KKyAgRnJvbSB0aGlzIHBvaW50IG9uLCBhbGwgcmV0dXJucyBmcm9tIHRoaXMgcmV0dXJuIG11c3QgYmUgdmlhIGdvdG8geGRlYnVnLAorICB3aGljaCBzZXRzIGRlYmxvZyBiYWNrIHRvIDEuCisqLworI2lmZGVmIE9TMgorICAgIGlmIChTeXNJbml0ZWQpIHsKKwlpZiAoUmVxdWVzdERlYnVnTXV0ZXgoMzAwMDApKQorCSAgICBnb3RvIHhkZWJ1ZzsKKyAgICB9CisjZWxzZSAvKiBPUzIgKi8KKyAgICBkZWJsb2cgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbiAqLworI2VuZGlmIC8qIE9TMiAqLworCisgICAgaWYgKGRlYnRpbSkgeyAgICAgICAgICAgICAgICAgICAgICAgLyogVGltZXN0YW1wICovCisgICAgICAgIGNoYXIgKnRiLCB0c2J1Zls0OF07CisgICAgICAgIHp0aW1lKCZ0Yik7CisgICAgICAgIGNrc3RybmNweSh0c2J1Zix0YiwzMik7CisgICAgICAgIGlmICh6dG1zZWMgPiAtMUwpIHsKKwkgICAgc3ByaW50Zih0c2J1ZisxOSwiLiUwM2xkICIsenRtc2VjKTsgLyogU0FGRSAqLworCX0gZWxzZSB7CisJICAgIHRzYnVmWzE5XSA9ICc6JzsKKwkgICAgdHNidWZbMjBdID0gU1A7CisJICAgIHRzYnVmWzIxXSA9IE5VTDsKKwl9CisgICAgICAgIHpzb3V0KFpERklMRSx0c2J1ZisxMSk7CisgICAgfQorICAgIGlmICghczEpIHMxPSIoTlVMTCkiOworICAgIGlmICghczIpIHMyPSIoTlVMTCkiOworCisgICAgbGVuMSA9IHN0cmxlbihzMSk7CisgICAgbGVuMiA9IHN0cmxlbihzMik7CisKKyNpZmRlZiBDT01NRU5UCisvKgorICBUaGlzIHNob3VsZCB3b3JrLCBidXQgaXQgZG9lc24ndC4KKyAgU28gaW5zdGVhZCB3ZSdsbCBjb3BlIHdpdGggb3ZlcmZsb3cgdmlhIHNwcmludGYgZm9ybWF0cy4KKyAgTi5CLjogVU5GT1JUVU5BVEVMWSwgdGhpcyBtZWFucyB3ZSBoYXZlIHRvIHB1dCBjb25zdGFudHMgaW4gdGhlCisgIHNwcmludGYgZm9ybWF0cy4KKyovCisgICAgaWYgKGYgIT0gRjAxMSAmJiAoIWYgfHwgKGYgJiA2KSkpIHsgLyogU3RyaW5nIGFyZ3VtZW50KHMpIGluY2x1ZGVkPyAqLworICAgICAgICB4ID0gKGludCkgc3RybGVuKHMxKSArIChpbnQpIHN0cmxlbihzMikgKyAxODsKKyAgICAgICAgaWYgKHggPiBkYnVmbCkgeyAgICAgICAgICAgICAgICAvKiBMb25nZXIgdGhhbiBidWZmZXI/ICovCisgICAgICAgICAgICBpZiAoZGJwdHIpICAgICAgICAgICAgICAgICAgLyogWWVzLCBmcmVlIHByZXZpb3VzIGJ1ZmZlciAqLworICAgICAgICAgICAgICBmcmVlKGRicHRyKTsKKyAgICAgICAgICAgIGRicHRyID0gKGNoYXIgKikgbWFsbG9jKHggKyAyKTsgLyogQWxsb2NhdGUgYSBuZXcgb25lICovCisgICAgICAgICAgICBpZiAoIWRicHRyKSB7CisgICAgICAgICAgICAgICAgenNvdXRsKFpERklMRSwiREVCVUc6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiKTsKKyAgICAgICAgICAgICAgICBkZWJsb2cgPSAwOworICAgICAgICAgICAgICAgIHpjbG9zZShaREZJTEUpOworICAgICAgICAgICAgICAgIGdvdG8geGRlYnVnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkYnVmbCA9IHg7CisgICAgICAgICAgICAgICAgc3ByaW50ZihkYnB0ciwiREVCVUc6IEJ1ZmZlciBleHBhbmRlZCB0byAlZFxuIiwgeCArIDE4KTsKKyAgICAgICAgICAgICAgICB6c291dGwoWkRGSUxFLGRicHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNpZmRlZiBDT01NRU5UCisvKiBUaGUgYWZvcmVtZW50aW9uZWQgc3ByaW50ZigpIGZvcm1hdHMgd2VyZSBsaWtlIHRoaXM6ICovCisgICAgICAgIGlmIChuID4gMzEgJiYgbiA8IDEyNykKKyAgICAgICAgICBzcHJpbnRmKHNwLCIlLjEwMHMlLjIwMDBzOiVjXG4iLHMxLHMyLChDSEFSKSBuKTsKKyAgICAgICAgZWxzZSBpZiAobiA8IDMyIHx8IG4gPT0gMTI3KQorICAgICAgICAgIHNwcmludGYoc3AsIiUuMTAwcyUuMjAwMHM6XiVjXG4iLHMxLHMyLChDSEFSKSAoKG4rNjQpICYgMHg3RikpOworICAgICAgICBlbHNlIGlmIChuID4gMTI3ICYmIG4gPCAxNjApCisgICAgICAgICAgc3ByaW50ZihzcCwiJS4xMDBzJS4yMDAwczp+XiVjXG4iLHMxLHMyLChDSEFSKSgobi02NCkgJiAweDdGKSk7CisgICAgICAgIGVsc2UgaWYgKG4gPiAxNTkgJiYgbiA8IDI1NikKKyAgICAgICAgICBzcHJpbnRmKHNwLCIlLjEwMHMlLjIwMDBzOn4lY1xuIixzMSxzMiwoQ0hBUikgKG4gJiAweDdGKSk7CisgICAgICAgIGVsc2Ugc3ByaW50ZihzcCwiJS4xMDBzJS4yMDAwczolbGRcbiIsczEsczIsbik7CisvKgorICBCdXQsIG5hdHVyYWxseSwgaXQgdHVybnMgb3V0IHRoZXNlIGFyZSBub3QgcG9ydGFibGUgZWl0aGVyLCBzbyBub3cKKyAgd2UgZG8gdGhlIHN0dXBpZGVzdCBwb3NzaWJsZSB0aGluZy4KKyovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjaWZkZWYgQklHQlVGT0sKKy8qIE5lZWQgdG8gYWNjZXB0IGxvbmdlciBzdHJpbmdzIHdoZW4gZGVidWdnaW5nIGF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbnMgKi8KKyAgICBpZiAoZiA9PSBGMDEwKSB7CisgICAgICAgIGlmIChsZW4yICsgMiA+PSBEQlVGTCkgczIgPSAiKHN0cmluZyB0b28gbG9uZykiOworICAgIH0gZWxzZSBpZiAoZiAhPSBGMDExICYmIGYgIT0gRjEwMCkgeworICAgICAgICBpZiAobGVuMSA+IDEwMCkgczEgPSAiKHN0cmluZyB0b28gbG9uZykiOworICAgICAgICBpZiAobGVuMiArIDEwMSA+PSBEQlVGTCkgczIgPSAiKHN0cmluZyB0b28gbG9uZykiOworICAgIH0KKyNlbHNlCisgICAgaWYgKGYgIT0gRjAxMSkgeworICAgICAgICBpZiAobGVuMSA+IDEwMCkgczEgPSAiKHN0cmluZyB0b28gbG9uZykiOworICAgICAgICBpZiAobGVuMiArIDEwMSA+PSBEQlVGTCkgczIgPSAiKHN0cmluZyB0b28gbG9uZykiOworICAgIH0KKyNlbmRpZiAvKiBCSUdCVUZPSyAqLworCisgICAgc3AgPSBkYnB0cjsKKworICAgIHN3aXRjaCAoZikgeyAgICAgICAgICAgICAgICAvKiBXcml0ZSBsb2cgcmVjb3JkIGFjY29yZGluZyB0byBmb3JtYXQuICovCisgICAgICBjYXNlIEYwMDA6ICAgICAgICAgICAgICAgIC8qIDAgPSBwcmludCBib3RoIHN0cmluZ3MsIGFuZCBuIGFzIGEgY2hhci4gKi8KKyAgICAgICAgaWYgKGxlbjIgPiAwKSB7CisgICAgICAgICAgICBpZiAoKG4gPiAzMSAmJiBuIDwgMTI3KSB8fCAobiA+IDE1OSAmJiBuIDwgMjU2KSkKKyAgICAgICAgICAgICAgc3ByaW50ZihzcCwiJXNbJXNdPSVjXG4iLHMxLHMyLChDSEFSKSBuKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG4gPCAzMiB8fCBuID09IDEyNykKKyAgICAgICAgICAgICAgc3ByaW50ZihzcCwiJXNbJXNdPV4lY1xuIixzMSxzMiwoQ0hBUikgKChuKzY0KSAmIDB4N0YpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG4gPiAxMjcgJiYgbiA8IDE2MCkKKyAgICAgICAgICAgICAgc3ByaW50ZihzcCwiJXNbJXNdPX5eJWNcbiIsczEsczIsKENIQVIpKChuLTY0KSAmIDB4N0YpKTsKKyAgICAgICAgICAgIGVsc2Ugc3ByaW50ZihzcCwiJXNbJXNdPTB4JWxYXG4iLHMxLHMyLG4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChuID4gMzEgJiYgbiA8IDEyNykgfHwgKG4gPiAxNTkgJiYgbiA8IDI1NikpCisgICAgICAgICAgICAgIHNwcmludGYoc3AsIiVzPSVjXG4iLHMxLChDSEFSKSBuKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG4gPCAzMiB8fCBuID09IDEyNykKKyAgICAgICAgICAgICAgc3ByaW50ZihzcCwiJXM9XiVjXG4iLHMxLChDSEFSKSAoKG4rNjQpICYgMHg3RikpOworICAgICAgICAgICAgZWxzZSBpZiAobiA+IDEyNyAmJiBuIDwgMTYwKQorICAgICAgICAgICAgICBzcHJpbnRmKHNwLCIlcz1+XiVjXG4iLHMxLChDSEFSKSgobi02NCkgJiAweDdGKSk7CisgICAgICAgICAgICBlbHNlIHNwcmludGYoc3AsIiVzPTB4JWxYXG4iLHMxLG4pOworICAgICAgICB9CisgICAgICAgIGlmICh6c291dChaREZJTEUsZGJwdHIpIDwgMCkgeworICAgICAgICAgICAgZGVibG9nID0gMDsKKyAgICAgICAgICAgIHpjbG9zZShaREZJTEUpOworICAgICAgICB9CisjaWZkZWYgQ0tTWVNMT0cKKyAgICAgICAgaWYgKGNreHN5c2xvZyA+PSBTWVNMR19EQiAmJiBja3hsb2dnaW5nKSB7CisgICAgICAgICAgICBja3N5c2xvZyhTWVNMR19EQiwxLCJkZWJ1ZyIsZGJwdHIsTlVMTCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGMDAxOiAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEsICI9biIgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgIC8qIFRoaXMgd2FzIG5ldmVyIHVzZWQgKi8KKyAgICAgICAgc3ByaW50ZihzcCwiPSVsZFxuIixuKTsKKyNlbHNlCisgICAgICAgIC8qIExpa2UgRjExMSwgYnV0IHNob3dzIG51bWJlciBuIGluIGhleCAqLworCWNrbWFreG1zZyhzcCxEQlVGTCwKKwkJICBzMSwKKwkJICAoKnMxID8gIjoiIDogIiIpLAorCQkgIHMyLAorCQkgICgqczIgPyAiOiIgOiAiIiksCisJCSAgY2tsdG94KG4pLAorCQkgICJcbiIsCisJCSAgTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwKKwkJICApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgaWYgKHpzb3V0KFpERklMRSxkYnB0cikgPCAwKSB7CisgICAgICAgICAgICBkZWJsb2cgPSAwOworICAgICAgICAgICAgemNsb3NlKFpERklMRSk7CisgICAgICAgIH0KKyNpZmRlZiBDS1NZU0xPRworICAgICAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX0RCICYmIGNreGxvZ2dpbmcpIHsKKyAgICAgICAgICAgIGNrc3lzbG9nKFNZU0xHX0RCLDEsImRlYnVnIixkYnB0cixOVUxMKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgIGJyZWFrOworCisvKgorICBUaGlzIG9uZSB3YXMgbmV2ZXIgdXNlZCBzbyAoT2N0b2JlciAyMDAwKSB3ZSBub3cgdXNlIGl0IGxpa2UgRjAxMSwKKyAgZXhjZXB0IGluIHRoaXMgY2FzZSB3ZSB0cmVhdCBzMiBhcyBOVUwgdGVybWluYXRlZC4KKyovCisgICAgICBjYXNlIEYwMTA6CisJbiA9IC1kZWJ4bGVuOworLyoKKyAgVGhpcyBvbmUgdHJlYXRzIG4gYXMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHMyLCB3aGljaCBtYXkgY29udGFpbiBOVUxzLgorICBJdCdzIGdvb2QgZm9yIGxvZ2dpbmcgTlVMLWJlYXJpbmcgZGF0YSBpbiB0aGUgZGVidWcgbG9nLgorKi8KKyAgICAgIGNhc2UgRjAxMTogeworCSAgaW50IGksIGosIGNvbnRkID0gMDsKKwkgIGNoYXIgKiBwID0gczIsICpwYnVmID0gTlVMTDsJLyogcCA9IHNvdXJjZSBwb2ludGVyICovCisJICBpbnQgbTsJCQkvKiBwYnVmID0gZGVzdGluYXRpb24gcG9pbnRlciAqLworCisJICBpZiAoZiA9PSBGMDExKSB7CisJICAgICAgaWYgKG4gPCAwKSB7CQkvKiBuID0gc2l6ZSBvZiBzb3VyY2UgKi8KKwkJICBuID0gMCAtIG47CQkvKiBOZWdhdGl2ZSBtZWFucyB0byBhZGQgIi4uLiIgKi8KKwkJICBjb250ZCA9IDE7CisJICAgICAgfQorCSAgfSBlbHNlIHsKKwkgICAgICBpbnQgeCwgZmxhZyA9IDA7CisJICAgICAgeCA9IHN0cmxlbihzMik7CisJICAgICAgaWYgKG4gPCAwKSB7CisJCSAgZmxhZyA9IDE7CisJCSAgbiA9IDAgLSBuOworCSAgICAgIH0KKwkgICAgICBpZiAoeCA8IG4pCisJCW4gPSB4OworCSAgfQorCSAgaWYgKG4gPT0gMCkJCQkvKiAwIG1lYW5zIGRvIG5vdGhpbmcgKi8KKwkgICAgZ290byB4ZGVidWc7CisJICBtID0gREJVRkwgLSA4OwkJLyogR2V0IHNpemUgZm9yIGludGVycHJldGVkIHBhcnQgKi8KKwkgIGlmIChuID4gbSkJCQkvKiBFbnN1cmUgcmVxdWVzdGVkIHNpemUgbm90IHRvbyBiaWcgKi8KKwkgICAgbiA9IG07CisJICBwYnVmID0gZGJwdHI7CQkJLyogQ29uc3RydWN0aW9uIHBvaW50ZXIgKi8KKwkgIGkgPSAwOworCSAgcGJ1ZltpKytdID0gJ1snOwkJLyogSW50ZXJwcmV0IHRoZSBzdHJpbmcgaW50byBpdCAqLworCSAgZm9yIChqID0gMDsgaiA8IG4gJiYgaSA8IG0tNDsgcCsrLGorKykgeyAvKiBjaGFyIGJ5IGNoYXIuLi4gKi8KKwkgICAgICBpZiAoKnAgPT0gTEYpIHsKKwkJICBpZiAoaSA+PSBtLTQpCisJCSAgICBicmVhazsKKwkJICBwYnVmW2krK10gPSAnPCc7CisJCSAgcGJ1ZltpKytdID0gJ0wnOworCQkgIHBidWZbaSsrXSA9ICdGJzsKKwkJICBwYnVmW2krK10gPSAnPic7CisJCSAgY29udGludWU7CisJICAgICAgfSBlbHNlIGlmICgqcCA9PSBDUikgeworCQkgIGlmIChpID49IG0tNCkKKwkJICAgIGJyZWFrOworCQkgIHBidWZbaSsrXSA9ICc8JzsKKwkJICBwYnVmW2krK10gPSAnQyc7CisJCSAgcGJ1ZltpKytdID0gJ1InOworCQkgIHBidWZbaSsrXSA9ICc+JzsKKwkJICBjb250aW51ZTsKKwkgICAgICB9IGVsc2UgaWYgKCpwID09IEhUKSB7CisJCSAgaWYgKGkgPj0gbS01KQorCQkgICAgYnJlYWs7CisJCSAgcGJ1ZltpKytdID0gJzwnOworCQkgIHBidWZbaSsrXSA9ICdUJzsKKwkJICBwYnVmW2krK10gPSAnQSc7CisJCSAgcGJ1ZltpKytdID0gJ0InOworCQkgIHBidWZbaSsrXSA9ICc+JzsKKwkJICBjb250aW51ZTsKKwkgICAgICB9IGVsc2UgaWYgKCpwKSB7CisJCSAgcGJ1ZltpKytdID0gKnA7CisJCSAgY29udGludWU7CisJICAgICAgfSBlbHNlIHsKKwkJICBpZiAoaSA+PSBtLTUpCisJCSAgICBicmVhazsKKwkJICBwYnVmW2krK10gPSAnPCc7CisJCSAgcGJ1ZltpKytdID0gJ04nOworCQkgIHBidWZbaSsrXSA9ICdVJzsKKwkJICBwYnVmW2krK10gPSAnTCc7CisJCSAgcGJ1ZltpKytdID0gJz4nOworCQkgIGNvbnRpbnVlOworCSAgICAgIH0KKwkgIH0KKwkgIGlmIChpIDwgbS0yICYmICgqcCB8fCBjb250ZCkpIHsKKwkgICAgICBwYnVmW2krK10gPSAnLic7CisJICAgICAgcGJ1ZltpKytdID0gJy4nOworCSAgfQorCSAgcGJ1ZltpKytdID0gJ10nOworCSAgcGJ1ZltpXSA9IE5VTDsKKwkgIGlmICh6c291dChaREZJTEUsczEpIDwgMCkgeworCSAgICAgIGRlYmxvZyA9IDA7CisJICAgICAgemNsb3NlKFpERklMRSk7CisJICB9CisJICBpZiAoenNvdXRsKFpERklMRSxwYnVmKSA8IDApIHsKKwkgICAgICBkZWJsb2cgPSAwOworCSAgICAgIHpjbG9zZShaREZJTEUpOworCSAgfQorI2lmZGVmIENLU1lTTE9HCisJICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX0RCICYmIGNreGxvZ2dpbmcpIHsKKwkgICAgICBja3N5c2xvZyhTWVNMR19EQiwxLCJkZWJ1ZyIsczEscGJ1Zik7CisJICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGMTAwOiAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQsICJzMSIgKi8KKyAgICAgICAgaWYgKHpzb3V0bChaREZJTEUsczEpIDwgMCkgeworICAgICAgICAgICAgZGVibG9nID0gMDsKKyAgICAgICAgICAgIHpjbG9zZShaREZJTEUpOworICAgICAgICB9CisjaWZkZWYgQ0tTWVNMT0cKKyAgICAgICAgaWYgKGNreHN5c2xvZyA+PSBTWVNMR19EQiAmJiBja3hsb2dnaW5nKSB7CisgICAgICAgICAgICBja3N5c2xvZyhTWVNMR19EQiwxLCJkZWJ1ZyIsczEsTlVMTCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRjEwMTogICAgICAgICAgICAgICAgICAgICAgICAvKiA1LCAiczE9biIgKi8KKyAgICAgICAgc3ByaW50ZihzcCwiJXM9JWxkXG4iLHMxLG4pOworICAgICAgICBpZiAoenNvdXQoWkRGSUxFLGRicHRyKSA8IDApIHsKKyAgICAgICAgICAgIGRlYmxvZyA9IDA7CisgICAgICAgICAgICB6Y2xvc2UoWkRGSUxFKTsKKyAgICAgICAgfQorI2lmZGVmIENLU1lTTE9HCisgICAgICAgIGlmIChja3hzeXNsb2cgPj0gU1lTTEdfREIgJiYgY2t4bG9nZ2luZykgeworICAgICAgICAgICAgY2tzeXNsb2coU1lTTEdfREIsMSwiZGVidWciLGRicHRyLE5VTEwpOworICAgICAgICB9CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEYxMTA6ICAgICAgICAgICAgICAgICAgICAgICAgLyogNiwgInMxW3MyXSIgKi8KKyAgICAgICAgc3ByaW50ZihzcCwiJXNbJXNdXG4iLHMxLHMyKTsKKyAgICAgICAgaWYgKHpzb3V0KFpERklMRSxkYnB0cikgPCAwKSB7CisgICAgICAgICAgICBkZWJsb2cgPSAwOworICAgICAgICAgICAgemNsb3NlKFpERklMRSk7CisgICAgICAgIH0KKyNpZmRlZiBDS1NZU0xPRworICAgICAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX0RCICYmIGNreGxvZ2dpbmcpIHsKKyAgICAgICAgICAgIGNrc3lzbG9nKFNZU0xHX0RCLDEsImRlYnVnIixkYnB0cixOVUxMKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGMTExOiAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcsICJzMVtzMl09biIgKi8KKyAgICAgICAgc3ByaW50ZihzcCwiJXNbJXNdPSVsZFxuIixzMSxzMixuKTsKKyAgICAgICAgaWYgKHpzb3V0KFpERklMRSxkYnB0cikgPCAwKSB7CisgICAgICAgICAgICBkZWJsb2cgPSAwOworICAgICAgICAgICAgemNsb3NlKFpERklMRSk7CisgICAgICAgIH0KKyNpZmRlZiBDS1NZU0xPRworICAgICAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX0RCICYmIGNreGxvZ2dpbmcpIHsKKyAgICAgICAgICAgIGNrc3lzbG9nKFNZU0xHX0RCLDEsImRlYnVnIixkYnB0cixOVUxMKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3ByaW50ZihzcCwiXG4/SW52YWxpZCBmb3JtYXQgZm9yIGRlYnVnKCkgLSAlZFxuIixmKTsKKyAgICAgICAgaWYgKHpzb3V0KFpERklMRSxkYnB0cikgPCAwKSB7CisgICAgICAgICAgICBkZWJsb2cgPSAwOworICAgICAgICAgICAgemNsb3NlKFpERklMRSk7CisgICAgICAgIH0KKyNpZmRlZiBDS1NZU0xPRworICAgICAgICBpZiAoY2t4c3lzbG9nID49IFNZU0xHX0RCICYmIGNreGxvZ2dpbmcpIHsKKyAgICAgICAgICAgIGNrc3lzbG9nKFNZU0xHX0RCLDEsImRlYnVnIixkYnB0cixOVUxMKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgeGRlYnVnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tb24gZXhpdCBwb2ludCAqLworI2lmZGVmIE9TMgorICAgIGlmIChTeXNJbml0ZWQpCisJUmVsZWFzZURlYnVnTXV0ZXgoKTsKKyNlbHNlIC8qIE9TMiAqLworICAgIGRlYmxvZyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgdGhpcyAqLworI2VuZGlmIC8qIE9TMiAqLworICAgIHJldHVybigwKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2RvaGV4ZHVtcChDSEFSICptc2csIENIQVIgKnN0LCBpbnQgY250KQorI2Vsc2UKK2RvaGV4ZHVtcChtc2csc3QsY250KSBDSEFSICptc2c7IENIQVIgKnN0OyBpbnQgY250OworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBkb2hleGR1bXAgKi8geworICAgIGludCBpID0gMCwgaiA9IDAsIGsgPSAwOworICAgIGNoYXIgdG1wWzhdOworI2lmZGVmIE9TMgorICAgIGV4dGVybiBpbnQgU3lzSW5pdGVkOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgaWYgKCFkZWJsb2cpIHJldHVybigwKTsJCS8qIElmIG5vIGRlYnVnIGxvZywgZG9uJ3QuICovCisgICAgaWYgKCFkYnB0cikgeyAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGJ1ZmZlciAqLworICAgICAgICBkYnB0ciA9IG1hbGxvYyhEQlVGTCsxKTsgICAgICAgIC8qIFRoaXMgb25seSBoYXBwZW5zIG9uY2UgKi8KKyAgICAgICAgaWYgKCFkYnB0cikgeworICAgICAgICAgICAgZGVibG9nID0gMDsKKyAgICAgICAgICAgIHpjbG9zZShaREZJTEUpOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgfQorCisjaWZkZWYgT1MyCisgICAgaWYgKFN5c0luaXRlZCkgeworCWlmIChSZXF1ZXN0RGVidWdNdXRleCgzMDAwMCkpCisJICAgIGdvdG8geGRlYnVnOworICAgIH0KKyNlbHNlIC8qIE9TMiAqLworICAgIGRlYmxvZyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uICovCisjZW5kaWYgLyogT1MyICovCisKKyAgICBpZiAobXNnICE9IE5VTEwpIHsKKwlja21ha3htc2coZGJwdHIsCisJCSAgREJVRkwsCisJCSAgIkhFWERVTVA6ICIsCisJCSAgKGNoYXIgKiltc2csCisJCSAgIiAoIiwKKwkJICBja2l0b2EoY250KSwKKwkJICAiIGJ5dGVzKVxuIiwKKwkJICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMCisJCSApOworICAgICAgICBpZiAoenNvdXQoWkRGSUxFLGRicHRyKSA8IDApIHsKKyAgICAgICAgICAgIGRlYmxvZyA9IDA7CisgICAgICAgICAgICB6Y2xvc2UoWkRGSUxFKTsKKwkgICAgZ290byB4ZGVidWc7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworCWNrbWFrbXNnKGRicHRyLAorCQkgREJVRkwsCisJCSAiSEVYRFVNUDogKCIsCisJCSBja2l0b2EoY250KSwKKwkJICIgYnl0ZXMpXG4iLAorCQkgTlVMTAorCQkgKTsKKyAgICAgICAgenNvdXQoWkRGSUxFLGRicHRyKTsKKyAgICAgICAgaWYgKHpzb3V0KFpERklMRSxkYnB0cikgPCAwKSB7CisgICAgICAgICAgICBkZWJsb2cgPSAwOworICAgICAgICAgICAgemNsb3NlKFpERklMRSk7CisJICAgIGdvdG8geGRlYnVnOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICBkYnB0clswXSA9ICdcMCc7CisgICAgICAgIGZvciAoaiA9IDAgOyAoaiA8IDE2KTsgaisrKSB7CisgICAgICAgICAgICBpZiAoKGkgKyBqKSA8IGNudCkKKwkgICAgICBzcHJpbnRmKHRtcCwKKwkJICAgICAgIiVzJTAyeCAiLAorCQkgICAgICAoaiA9PSA4ID8gInwgIiA6ICIiKSwKKwkJICAgICAgKENIQVIpIHN0W2kgKyBqXQorCQkgICAgICApOworICAgICAgICAgICAgZWxzZQorCSAgICAgIHNwcmludGYodG1wLAorCQkgICAgICAiJXMgICAiLAorCQkgICAgICAoaiA9PSA4ID8gInwgIiA6ICIiKQorCQkgICAgICApOworICAgICAgICAgICAgY2tzdHJuY2F0KGRicHRyLHRtcCxEQlVGTCsxKTsKKyAgICAgICAgfQorICAgICAgICBja3N0cm5jYXQoZGJwdHIsIiAiLERCVUZMKzEpOworICAgICAgICBmb3IgKGsgPSAwOyAoayA8IDE2KSAmJiAoKGkgKyBrKSA8IGNudCk7IGsrKykgeworICAgICAgICAgICAgc3ByaW50Zih0bXAsCisgICAgICAgICAgICAgICAgICAgICIlcyVjIiwKKyAgICAgICAgICAgICAgICAgICAgKGsgPT0gOCA/ICIgIiA6ICIiKSwKKyAgICAgICAgICAgICAgICAgICAgaXNwcmludChzdFtpICsga10pID8gc3RbaSArIGtdIDogJy4nCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBja3N0cm5jYXQoZGJwdHIsdG1wLERCVUZMKzEpOworICAgICAgICB9CisgICAgICAgIGNrc3RybmNhdChkYnB0ciwiXG4iLERCVUZMKzEpOworICAgICAgICBpICs9IGogLSAxOworICAgICAgICBpZiAoenNvdXQoWkRGSUxFLGRicHRyKSA8IDApIHsKKyAgICAgICAgICAgIGRlYmxvZyA9IDA7CisgICAgICAgICAgICB6Y2xvc2UoWkRGSUxFKTsKKwkgICAgZ290byB4ZGVidWc7CisgICAgICAgIH0KKyAgICB9IC8qIGVuZCBmb3IgKi8KKworCisgIHhkZWJ1ZzoKKyNpZmRlZiBPUzIKKyAgICBpZiAoU3lzSW5pdGVkKQorICAgICAgUmVsZWFzZURlYnVnTXV0ZXgoKTsKKyNlbHNlIC8qIE9TMiAqLworICAgIGRlYmxvZyA9IDE7CisjZW5kaWYgLyogT1MyICovCisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIERFQlVHICovCisKKy8qICBTZXNzaW9uIExvZy4uLiAqLworCitleHRlcm4gaW50IHNsb2d0czsJCQkvKiBTZXNzaW9uIExvZyB0aW1lc3RhbXBzICovCitpbnQgdHNzdGF0ZSA9IDA7CisKK1ZPSUQKKyNpZmRlZiBPUzIKK2xvZ2NoYXIodW5zaWduZWQgc2hvcnQgYykKKyNlbHNlIC8qIE9TMiAqLworI2lmZGVmIENLX0FOU0lDCitsb2djaGFyKGNoYXIgYykKKyNlbHNlCitsb2djaGFyKGMpIGNoYXIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworI2VuZGlmIC8qIE9TMiAqLworLyogbG9nY2hhciAqLyB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvZyBjaGFyYWN0ZXIgYyB0byBzZXNzaW9uIGxvZyAqLworICAgIGludCBva3RvbG9nID0gMDsKKyNpZm5kZWYgTk9MT0NBTAorICAgIGlmICghc2VzbG9nKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKChzZXNzZnQgIT0gWFlGVF9UKSB8fAorCShjICE9ICdcMCcgJiYKKyNpZmRlZiBVTklYCisJIGMgIT0gJ1xyJyAmJgorI2Vsc2UKKyNpZmRlZiBkYXRhZ2VuZXJhbAorCSBjICE9ICdccicgJiYKKyNlbHNlCisjaWZkZWYgU1RSQVRVUworCSBjICE9ICdccicgJiYKKyNlbHNlCisjaWZkZWYgQU1JR0EKKwkgYyAhPSAnXHInICYmCisjZWxzZQorI2lmZGVmIEdFTURPUworCSBjICE9ICdccicgJiYKKyNlbmRpZiAvKiBHRU1ET1MgKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNpZmRlZiBPU0sKKwkgYyAhPSAnXG4nICYmCisjZWxzZQorI2lmZGVmIE1BQworCSBjICE9ICdcbicgJiYKKyNlbmRpZiAvKiBNQUMgKi8KKyNlbmRpZiAvKiBPU0sgKi8KKwkgYyAhPSBYT04gJiYKKwkgYyAhPSBYT0ZGKSkKKyAgICAgIG9rdG9sb2cgPSAxOworICAgIGlmICghb2t0b2xvZykKKyAgICAgIHJldHVybjsKKyAgICBpZiAoc2xvZ3RzKSB7CQkJLyogTG9nIGlzIHRpbWVzdGFtcGVkICovCisJaWYgKHRzc3RhdGUgPT0gMCkgewkJLyogU3RhdGUgPSBiZXR3ZWVuLWxpbmVzICovCisJICAgIGNoYXIgKiBwOwkJCS8qIHpzdGltZSgpIHBvaW50ZXIgKi8KKwkgICAgY2hhciB0c1s0OF07CQkvKiB0aW1lc3RhbXAgYnVmZmVyICovCisJICAgIHp0aW1lKCZwKTsJCQkvKiBHZXQgYXNjdGltZSgpIHN0cmluZyAqLworCSAgICBja3N0cm5jcHkodHMscCwzMik7CQkvKiBNYWtlIHNhZmUgY29weSAqLworCSAgICBpZiAoenRtc2VjID4gLTFMKSB7CQkvKiBBZGQgbXNlY3MgaWYgd2UgaGF2ZSB0aGVtICovCisJCXNwcmludGYoJnRzWzE5XSwiLiUwM2xkOiAiLHp0bXNlYyk7IC8qIFNBRkUgKi8KKwkgICAgfSBlbHNlIHsKKwkJdHNbMTldID0gJzonOworCQl0c1syMF0gPSBTUDsKKwkJdHNbMjFdID0gTlVMOworCSAgICB9CisJICAgIGlmICh6c291dChaU0ZJTEUsJnRzWzExXSkgPCAwKQorCSAgICAgIGdvdG8geGxvZ2NoYXI7CisJICAgIGlmIChjICE9ICdcbicpCQkvKiBJZiB0aGlzIGlzIG5vdCBlb2wgKi8KKwkgICAgICB0c3N0YXRlID0gMTsJCS8qIGdvIHRvIGluLWEtbGluZSBzdGF0ZS4gKi8KKwl9IGVsc2UgaWYgKGMgPT0gJ1xuJykgewkJLyogSW4gYSBsaW5lICovCisJICAgIHRzc3RhdGUgPSAwOwkJLyogSWYgZW9sIGdvIHRvIGJldHdlZW4tbGluZXMgc3RhdGUuICovCisJfQorICAgIH0KKyAgICBpZiAoemNob3V0KFpTRklMRSwoQ0hBUikoYyAmIDB4RkYpKSA8IDApIC8qIExvZyB0aGUgY2hhcmFjdGVyICovCisgICAgICBnb3RvIHhsb2djaGFyOworICAgIHJldHVybjsKKworICB4bG9nY2hhcjoKKyAgICBjb25vbGwoIiIpOworICAgIGNvbm9sbCgiRVJST1IgV1JJVElORyBTRVNTSU9OIExPRywgTE9HIENMT1NFRCEiKTsKKyAgICBzZXRzZXNsb2coMCk7CisgICAgemNsb3NlKFpTRklMRSk7CisjZW5kaWYgLyogTk9MT0NBTCAqLworfQorCitWT0lECitsb2dzdHIocywgbGVuKSBjaGFyICogczsgaW50IGxlbjsgeyAgICAgLyogTG9nIHN0cmluZyB0byBzZXNzaW9uIGxvZyAqLworI2lmbmRlZiBOT0xPQ0FMCisgICAgaW50IG4gPSAwOworICAgIGlmICghcykKKyAgICAgIHJldHVybjsKKyAgICB3aGlsZSAoc2VzbG9nICYmIChuIDwgbGVuKSkKKyAgICAgIGxvZ2NoYXIoc1tuKytdKTsKKyNlbmRpZiAvKiBOT0xPQ0FMICovCit9CisKKyNpZmRlZiBDS19DVVJTRVMKK2ludAorY2tfcmVwYWludCgpIHsKKyAgICByZXBhaW50ID0gMTsKKyAgICByZXR1cm4oMCk7Cit9CisKKyNpZmRlZiBTVFJBVFVTCisvKiBWT1MgaGFzIGN1cnNlcyBidXQgbm8gdGdldGVudCgpICovCitpbnQKK3RnZXRlbnQoczEsIHMyKSBjaGFyICogczEsICogczI7IHsKKyAgICByZXR1cm4oMSk7Cit9CisjZW5kaWYgLyogU1RSQVRVUyAqLworCisjaWZkZWYgVk1TCisjaWZkZWYgX19ERUNDCitfUFJPVE9UWVAoaW50IHRnZXRlbnQsKGNoYXIgKiwgY2hhciAqKSk7CisjZW5kaWYgLyogX19ERUNDICovCisjZW5kaWYgLyogVk1TICovCisKKy8qCisgIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgd2F5cyB0byBkbyBmdWxsc2NyZWVuIG9uIFZNUy4KKyAgMS4gVXNlIHRoZSByZWFsIGN1cnNlcyBsaWJyYXJ5LCBWQVhDQ1VSU0UuCisgIDIuIFVzZSBkby1pdC15b3Vyc2VsZiBjb2RlLgorICAzLiBVc2UgdGhlIFNjcmVlbiBNYW5hZ2VyLCBTTUckLgorCisgIE1ldGhvZCAxIGRvZXNuJ3Qgd29yayBxdWl0ZSByaWdodDsgeW91IGNhbid0IGNhbGwgZW5kd2luKCksIHNvIG9uY2UgeW91J3ZlCisgIHN0YXJ0ZWQgY3Vyc2VzIG1vZGUsIHlvdSBjYW4gbmV2ZXIgbGVhdmUuCisKKyAgTWV0aG9kIDIgZG9lc24ndCBvcHRpbWl6ZSB0aGUgc2NyZWVuLCBhbmQgc28gbXVjaCBtb3JlIHRpbWUgaXMgc3BlbnQgaW4KKyAgc2NyZWVuIHdyaXRlcy4gIFRoaXMgYWN0dWFsbHkgY2F1c2VzIGZpbGUgdHJhbnNmZXJzIHRvIGZhaWwgYmVjYXVzZSB0aGUKKyAgdHR5IGRldmljZSBpbnB1dCBidWZmZXIgY2FuIGJlIG92ZXJydW4gd2hpbGUgdGhlIHNjcmVlbiBpcyBiZWluZyB1cGRhdGVkLAorICBlc3BlY2lhbGx5IG9uIGEgc2xvdyBNaWNyb1ZBWCB0aGF0IGhhcyBzbWFsbCB0eXBlYWhlYWQgYnVmZmVycy4KKworICBJbiB0aGUgZm9sbG93aW5nICNpZmRlZiBibG9jaywgI2RlZmluZSBvbmUgb2YgdGhlbSBhbmQgI3VuZGVmIHRoZSBvdGhlciAyLgorCisgIFNvIG5vdyBsZXQncyB0cnkgbWV0aG9kIDMuLi4KKyovCisjaWZkZWYgVk1TCisjZGVmaW5lIENLX1NNRyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2NyZWVuIE1hbmFnZXIgKi8KKyN1bmRlZiBNWUNVUlNFUyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEby1pdC15b3Vyc2VsZiAqLworI3VuZGVmIFZNU0NVUlNFICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZBWENDVVJTRSBsaWJyYXJ5ICovCisjZW5kaWYgLyogVk1TICovCisvKgorICBCdXQganVzdCBiZWZvcmUgTmV3IFllYXJzLCAyMDAwLCB0aGUgU01HIGxpYnJhcnkgc2VlbWVkIHRvIGJyZWFrIG9uCisgIGJvdGggVk1TIHN5c3RlbXMgd2UgaGF2ZSBoZXJlIChhbiBBbHBoYSB3aXRoIFZNUyA3LjEgYW5kIGEgVkFYIHdpdGggNS41KS4KKyAgU28gYmFjayB0byBNWUNVUlNFUywgd2hpY2ggd29ya3MgZmluZS4KKyovCisjaWZkZWYgVk1TCisjdW5kZWYgQ0tfU01HCisjZGVmaW5lIE1ZQ1VSU0VTCisjZW5kaWYgLyogVk1TICovCisKKyNpZmRlZiBNWUNVUlNFUworI2RlZmluZSBzdGRzY3IgMAorI2lmZGVmIENLX1dSRUZSRVNICisjdW5kZWYgQ0tfV1JFRlJFU0gKKyNlbmRpZiAvKiBDS19XUkVGUkVTSCAqLworI2VuZGlmIC8qIE1ZQ1VSU0VTICovCisKKy8qICBTIEMgUiBFIEUgTiBDICAtLSAgU2NyZWVuIGRpc3BsYXkgZnVuY3Rpb24sIHVzZXMgY3Vyc2VzICAqLworCisvKiBJZGVhIGZvciBjdXJzZXMgZGlzcGxheSBjb250cmlidXRlZCBieSBDaHJpcyBQcmF0dCBvZiBBUFYgQmFrZXIsIFVLICovCisKKy8qIEF2b2lkIGNvbmZpY3RzIHdpdGggY3Vyc2VzLmggKi8KKworI2lmZGVmIFFOWAorLyogU2FtZSBhcyBja2Nhc2MuaCwgYnV0IGluIGEgZGlmZmVyZW50IHJhZGl4Li4uICovCisjaWZkZWYgRVNDCisjdW5kZWYgRVNDCisjZW5kaWYgLyogRVNDICovCisjZW5kaWYgLyogUU5YICovCisKKyNpZm5kZWYgTVlDVVJTRVMKKyN1bmRlZiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIHdhcyBkZWZpbmVkIGluIGNrY2RlYi5oICovCisjZW5kaWYgLyogTVlDVVJTRVMgKi8KKworI3VuZGVmIEJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZXNlIHdlcmUgZGVmaW5lZCBpbiBja2Nhc2MuaCAqLworI3VuZGVmIENSCisjdW5kZWYgTkwKKyN1bmRlZiBTTworI3VuZGVmIFVTCisjdW5kZWYgU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlZCBpbiBuY3Vyc2VzICovCisjZGVmaW5lIENIUl9TUCAzMiAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlIHRoaXMgaW5zdGVhZCAqLworCisjaWZkZWYgVk1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVk1TIGZ1bGxzY3JlZW4gZGlzcGxheSAqLworI2lmZGVmIE1ZQ1VSU0VTICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvLWl0LXlvdXJzZWxmIG1ldGhvZCAqLworZXh0ZXJuIGludCBpc3Z0NTI7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gQ0tWVElPLkMgKi8KKyNkZWZpbmUgcHJpbnR3IHByaW50ZgorI2Vsc2UKKyNpZmRlZiBWTVNDVVJTRSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWTVMgY3Vyc2VzIGxpYnJhcnkgVkFYQ0NVUlNFICovCisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisvKiBOb3RlOiBTY3JlZW4gbWFuYWdlciBkb2Vzbid0IG5lZWQgYSBoZWFkZXIgZmlsZSAqLworI2VuZGlmIC8qIFZNU0NVUlNFICovCisjZW5kaWYgLyogTVlDVVJTRVMgKi8KKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgVk1TICovCisjaWZkZWYgTVlDVVJTRVMgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG8taXQteW91cnNlbGYgbWV0aG9kICovCisjZGVmaW5lIGlzdnQ1MiAwICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlZCBieSBPUy8yLCBWVC0xMDAvQU5TSSBhbHdheXMgKi8KKyNpZmRlZiBDS1hQUklOVEYKKyNkZWZpbmUgcHJpbnR3IGNreHByaW50ZgorI2Vsc2UgLyogQ0tYUFJJTlRGICovCisjaWZkZWYgS1VJCisjZGVmaW5lIHByaW50dyBWc2NybnByaW50dworI2Vsc2UgLyogS1VJICovCisjZGVmaW5lIHByaW50dyBwcmludGYKKyNlbmRpZiAvKiBLVUkgKi8KKyNlbmRpZiAvKiBDS1hQUklOVEYgKi8KKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgcmVhbCBjdXJzZXMgKi8KKyNpZmRlZiBDS19OQ1VSU0VTICAgICAgICAgICAgICAgICAgICAgICAvKiBvciBuY3Vyc2VzLi4uICovCisjaWZkZWYgQ0tYUFJJTlRGICAgICAgICAgICAgICAgICAgICAgICAgLyogT3VyIHByaW50ZiBtYWNybyBjb25mbGljdHMgd2l0aCAqLworI3VuZGVmIHByaW50ZiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBvZiAicHJpbnRmIiBpbiBuY3Vyc2VzLmggKi8KKyNlbmRpZiAvKiBDS1hQUklOVEYgKi8KKyNpbmNsdWRlIDxuY3Vyc2VzLmg+CisjaWZkZWYgQ0tYUFJJTlRGCisjZGVmaW5lIHByaW50ZiBja3hwcmludGYKKyNlbmRpZiAvKiBDS1hQUklOVEYgKi8KKyNlbHNlICAvKiBOb3QgbmN1cnNlcyAqLworI2lmZGVmIENLWFBSSU5URiAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91ciBwcmludGYgbWFjcm8gY29uZmxpY3RzIHdpdGggKi8KKyN1bmRlZiBwcmludGYgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2Ugb2YgInByaW50ZiIgaW4gY3Vyc2VzLmggKi8KKyNlbmRpZiAvKiBDS1hQUklOVEYgKi8KKyNpZmRlZiBNX1hFTklYCQkJCS8qIFNDTyBYRU5JWC4uLiAqLworI2lmZGVmIE1fVEVSTUNBUAorI3VuZGVmIE1fVEVSTUNBUAorI2VuZGlmIC8qIE1fVEVSTUNBUCAqLworI2lmbmRlZiBNX1RFUk1JTkZPCisjZGVmaW5lIE1fVEVSTUlORk8KKyNlbmRpZiAvKiBNX1RFUk1JTkZPICovCisjZW5kaWYgLyogTV9YRU5JWCAqLworI2lmZGVmIFJUQUlYCisjdW5kZWYgTkxTCQkJCS8qIEF2b2lkICdyZWRlY2xhcmF0aW9uIG9mIGZyZWUnLiAqLworI2VuZGlmIC8qIFJUQUlYICovCisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisjaWZkZWYgQ0tYUFJJTlRGCisjZGVmaW5lIHByaW50ZiBja3hwcmludGYKKyNlbmRpZiAvKiBDS1hQUklOVEYgKi8KKyNlbmRpZiAvKiBDS19OQ1VSU0VTICovCisjZW5kaWYgLyogTVlDVVJTRVMgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKworI2VuZGlmIC8qIENLX0NVUlNFUyAqLworCisvKiAgRiBYIEQgSSBOIEkgVCAgLS0gIEZpbGUgWGZlciBEaXNwbGF5IEluaXRpYWxpemF0aW9uICAqLworCisjaWZkZWYgQ0tfQ1VSU0VTCisjaWZuZGVmIE1ZQ1VSU0VTCisjaWZuZGVmIENLX1NNRworc3RhdGljCisjaWZkZWYgQ0tfQU5TSUMKKy8qIENhbid0IHVzZSBWT0lEIGJlY2F1c2Ugb2YgY3Vyc2VzLmggKi8KK3ZvaWQKK2NrX3Rlcm1zZXQoaW50KTsKKyNlbHNlCitja190ZXJtc2V0KCk7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyNlbmRpZiAvKiBDS19TTUcgKi8KKyNlbmRpZiAvKiBNWUNVUlNFUyAqLworI2VuZGlmIC8qIENLX0NVUlNFUyAqLworCisjaWZkZWYgTk9URVJNQ0FQCitzdGF0aWMgaW50IG5vdGVybWNhcCA9IDE7CisjZWxzZQorc3RhdGljIGludCBub3Rlcm1jYXAgPSAwOworI2VuZGlmIC8qIE5PVEVSTUNBUCAqLworCisjaWZuZGVmIE5PRElTUExBWQorI2lmZGVmIE9TSworVk9JRAorI2Vsc2UKKyNpZmRlZiBDS19BTlNJQwordm9pZAorI2VuZGlmIC8qIENLQU5TSUMgKi8KKyNlbmRpZiAvKiBPU0sgKi8KK2Z4ZGluaXQoeGRpc3BsYSkgaW50IHhkaXNwbGE7IHsKKyNpZm5kZWYgQ09IRVJFTlQKKyNpZm5kZWYgT1MyCisjaWZuZGVmIFNUUkFUVVMKKyAgICBjaGFyICpzOworICAgIGludCB4LCBkdW1teTsKKworICAgIGRlYnVnKEYxMDEsImZ4ZGluaXQgeGRpc3BsYSIsIiIseGRpc3BsYSk7CisgICAgZGVidWcoRjEwMSwiZnhkaW5pdCBmeGRfaW5pdGVkIiwiIixmeGRfaW5pdGVkKTsKKworI2lmZGVmIElLU0QKKyNpZm5kZWYgTk9YRkVSCisgICAgLyogTm8gY3Vyc2VzIGZvciBJS1NEICovCisgICAgaWYgKGluc2VydmVyKSB7CisgICAgICAgIGZkaXNwbGEgPSBYWUZEX047CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGZ4ZF9pbml0ZWQpICAgICAgICAgICAgICAgICAgICAgLyogT25seSBkbyB0aGlzIG9uY2UgKi8KKyAgICAgIHJldHVybjsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyNlbmRpZiAvKiBJS1NEICovCisKKyAgICBpZiAoeGRpc3BsYSA9PSBYWUZEX1IgfHwgeGRpc3BsYSA9PSBYWUZEX1MgfHwgeGRpc3BsYSA9PSBYWUZEX0IpIHsKKwlpZiAoeGZybXNnKSB7CisJICAgIHByaW50ZigiJXNcbiIseGZybXNnKTsKKwkgICAgbWFrZXN0cigmeGZybXNnLE5VTEwpOworCX0KKyAgICB9CisKKyNpZmRlZiBDS19DVVJTRVMKKyNpZmRlZiBWTVMKKyAgICAvKiBGb3JjZSBCUklFRiBpbiBCYXRjaCBsb2dzICovCisgICAgaWYgKGJhdGNoICYmICh4ZGlzcGxhID09IFhZRkRfQyB8fCB4ZGlzcGxhID09IFhZRkRfUykpCisgICAgICB4ZGlzcGxhID0gWFlGRF9COworI2Vsc2UKKyAgICBpZiAoeGRpc3BsYSA9PSBYWUZEX0MgfHwgeGRpc3BsYSA9PSA5OTk5KSB7CisKKyNpZmRlZiBEWU5BTUlDCisgICAgICAgIGlmICghdHJtYnVmKSB7CisvKgorICBBbGxvY2F0ZSB0Z2V0ZW50KCkgYnVmZmVyLiAgTWFrZSBpdCBiaWcgLS0gc29tZSB0ZXJtY2FwcyBjYW4gYmUgaHVnZTsKKyAgdGdldGVudCgpIG1lcnJpbHkgd3JpdGVzIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBjYXVzaW5nIGNvcmUgZHVtcHMKKyAgb3Igd29yc2UuCisqLworICAgICAgICAgICAgdHJtYnVmID0gKGNoYXIgKiltYWxsb2MoVFJNQlVGTCk7CisgICAgICAgICAgICBpZiAoIXRybWJ1ZikgeworICAgICAgICAgICAgICAgIG5vdGVybWNhcCA9IDE7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiZnhkaW5pdCBtYWxsb2MgdHJtYnVmIiwiRkFJTEVEIixUUk1CVUZMKTsKKyAgICAgICAgICAgICAgICBmZGlzcGxhID0gWFlGRF9TOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImZ4ZGluaXQgbWFsbG9jIHRybWJ1ZiIsIk9LIixUUk1CVUZMKTsKKyAgICAgICAgICAgIGRlYnVnKEYwMDEsImZ4ZGluaXQgdHJtYnVmIiwiIix0cm1idWYpOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIG1lbXNldCh0cm1idWYsJ1wwJywoc2l6ZV90KVRSTUJVRkwpOworICAgICAgICAgICAgZGVidWcoRjEwMCwiZnhkaW5pdCBtZW1zZXQgT0siLCIiLDApOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIERZTkFNSUMgKi8KKworICAgICAgICBkZWJ1ZyhGMTAwLCJmeGRpbml0IGJlZm9yZSBnZXRlbnYoVEVSTSkiLCIiLDApOworICAgICAgICBzID0gZ2V0ZW52KCJURVJNIik7CisgICAgICAgIGRlYnVnKEYxMTAsImZ4ZGluaXQgYWZ0ZXIgZ2V0ZW52KFRFUk0pIixzLDApOworICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgaWYgKCpzKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmeGRpbml0IGJlZm9yZSB0Z2V0ZW50KCkiLHMsMCk7CisgICAgICAgICAgICB4ID0gdGdldGVudCh0cm1idWYscyk7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJmeGRpbml0IHRnZXRlbnQiLHMseCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgIG5vdGVybWNhcCA9IDE7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJmeGRpbml0IFRFUk0gbnVsbCAtIG5vIHRnZXRlbnQiLHMsMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHggPCAxICYmICFxdWlldCAmJiAhYmFja2dyZAorI2lmZGVmIFZNUworICAgICAgICAgICAgJiYgIWJhdGNoCisjZW5kaWYgLyogVk1TICovCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIHByaW50ZigiV2FybmluZzogdGVybWluYWwgdHlwZSB1bmtub3duOiBcIiVzXCJcbiIscyk7CisjaWZkZWYgQ09NTUVOVAorCSAgICAvKiBDb25mdXNpbmcgLSBub2JvZHkga25vd3Mgd2hhdCB0aGlzIG1lYW5zICovCisgICAgICAgICAgICBwcmludGYoIlNDUkVFTiBjb21tYW5kIHdpbGwgdXNlIEFOU0kgc2VxdWVuY2VzLlxuIik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgaWYgKGxvY2FsKQorICAgICAgICAgICAgICBwcmludGYoIkZ1bGxzY3JlZW4gZmlsZSB0cmFuc2ZlciBkaXNwbGF5IGRpc2FibGVkLlxuIik7CisgICAgICAgICAgICBmZGlzcGxhID0gWFlGRF9TOworICAgICAgICB9CisjaWZuZGVmIE1ZQ1VSU0VTCisjaWZuZGVmIENLX1NNRworICAgICAgICBja190ZXJtc2V0KHgpOworI2VuZGlmIC8qIENLX1NNRyAqLworI2VuZGlmIC8qIE1ZQ1VSU0VTICovCisgICAgICAgIGZ4ZF9pbml0ZWQgPSAxOworICAgIH0KKyNlbmRpZiAvKiBDS19DVVJTRVMgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogQ09IRVJFTlQgKi8KK30KKyNlbmRpZiAvKiBOT0RJU1BMQVkgKi8KKworI2lmZGVmIENLX0NVUlNFUworI2lmZGVmIENLX1NNRworLyoKKyAgTG9uZyBzZWN0aW9uIGZvciBTY3JlZW4gTWFuYWdlciBzdGFydHMgaGVyZS4uLgorICBCeSBXaWxsaWFtIEJhZGVyLgorKi8KKyNpbmNsdWRlICJja3Z2bXMuaCIKKyNpZmRlZiBPTERfVk1TCisjaW5jbHVkZSA8c21nZGVmLmg+ICAgICAgICAgICAgICAgICAgICAgLyogdXNlIHRoaXMgb24gVkFYIEMgMi40ICovCisvKiAjaW5jbHVkZSA8c21nbXNnLmg+ICovCisjZWxzZQorI2luY2x1ZGUgPHNtZyRyb3V0aW5lcy5oPiAgICAgICAgICAgICAgIC8qIE1hcnRpbiBaaW5zZXIgKi8KKyNlbmRpZiAvKiBPTERfVk1TICovCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgdm1zX3N0YXR1czsgICAgIC8qIFVzZWQgZm9yIHN5c3RlbSBzZXJ2aWNlIHJldHVybiBzdGF0dXMgKi8KKworc3RhdGljIGxvbmcgc21nX3Bhc3RlYm9hcmRfaWQgPSAtMTsgICAgIC8qIHBhc3RlYm9hcmQgaWRlbnRpZmllciAqLworc3RhdGljIGxvbmcgc21nX2Rpc3BsYXlfaWQgPSAtMTsgICAgICAgIC8qIGRpc3BsYXkgaWRlbnRpZmllciAqLworc3RhdGljIGludCBzbWdfb3BlbiA9IDA7ICAgICAgICAgICAgICAgIC8qIGZsYWcgaWYgc21nIGN1cnJlbnQgb3BlbiAqLworc3RhdGljIGludCBzbWdfaW5pdGVkID0gMDsgICAgICAgICAgICAgIC8qIGZsYWcgaWYgc21nIGluaXRpYWxpemVkICovCisKKyNpZmRlZiBDT01NRU5UCisjZGVmaW5lIGNscnRvZW9sKCkgICAgICBTTUckRVJBU0VfTElORSgmc21nX2Rpc3BsYXlfaWQsIDAsIDApCisKKyNkZWZpbmUgY2xlYXIoKSAgICAgICAgIFNNRyRFUkFTRV9ESVNQTEFZKCZzbWdfZGlzcGxheV9pZCwgMCwgMCwgMCwgMCkKKworI2RlZmluZSB0b3VjaHdpbihzY3IpICAgU01HJFJFUEFJTlRfU0NSRUVOKCZzbWdfcGFzdGVib2FyZF9pZCkKKworI2Vsc2UgIC8qIE5vdCBDT01NRU5UICovCisKKyNkZWZpbmUgY2xydG9lb2woKSAgICAgIHNtZyRlcmFzZV9saW5lKCZzbWdfZGlzcGxheV9pZCwgMCwgMCkKKworI2RlZmluZSBjbGVhcigpICAgICAgICAgc21nJGVyYXNlX2Rpc3BsYXkoJnNtZ19kaXNwbGF5X2lkLCAwLCAwLCAwLCAwKQorCisjZGVmaW5lIHRvdWNod2luKHNjcikgICBzbWckcmVwYWludF9zY3JlZW4oJnNtZ19wYXN0ZWJvYXJkX2lkKQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2RlZmluZSBjbGVhcm9rKGN1cnNjcixvaykgICAgICAgICAgICAgIC8qIExldCB3cmVmcmVzaCgpIGRvIHRoZSB3b3JrICovCisKKyNkZWZpbmUgd3JlZnJlc2goY3Vyc3JjKSB0b3VjaHdpbihzY3IpCisKK3N0YXRpYyB2b2lkCittb3ZlKHJvdywgY29sKSBpbnQgcm93LCBjb2w7IHsKKyAgICAvKiBDaGFuZ2UgZnJvbSAwLWJhc2VkIGZvciBjdXJzZXMgdG8gMS1iYXNlZCBmb3IgU01HICovCisgICAgaWYgKCFzbWdfb3BlbikKKyAgICAgIHJldHVybjsKKyAgICArK3JvdzsgKytjb2w7CisgICAgZGVidWcoRjExMSwiVk1TIHNtZyBtb3ZlIixja2l0b2Eocm93KSxjb2wpOworI2lmZGVmIENPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcnRpbiBaaW5zZXIgKi8KKyAgICBDSEVDS19FUlIoIm1vdmU6IHNtZyRzZXRfY3Vyc29yX2FicyIsCisgICAgICAgICAgICAgIFNNRyRTRVRfQ1VSU09SX0FCUygmc21nX2Rpc3BsYXlfaWQsICZyb3csICZjb2wpKTsKKyNlbHNlCisgICAgQ0hFQ0tfRVJSKCJtb3ZlOiBzbWckc2V0X2N1cnNvcl9hYnMiLAorICAgICAgICAgICAgICBzbWckc2V0X2N1cnNvcl9hYnMoJnNtZ19kaXNwbGF5X2lkLCAmcm93LCAmY29sKSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIGRlYnVnKEYxMDEsIlZNUyBzbWcgbW92ZSB2bXNfc3RhdHVzIiwiIix2bXNfc3RhdHVzKTsKK30KKworI2lmZGVmIFZNU19WNDAKKyNkZWZpbmUgT0xEX1ZNUworI2VuZGlmIC8qIFZNU19WNDAgKi8KKyNpZmRlZiBWTVNfVjQyCisjZGVmaW5lIE9MRF9WTVMKKyNlbmRpZiAvKiBWTVNfVjQyICovCisjaWZkZWYgVk1TX1Y0NAorI2RlZmluZSBPTERfVk1TCisjZW5kaWYgLyogVk1TX1Y0NCAqLworCitzdGF0aWMgaW50Citpbml0c2NyKCkgeworICAgIGludCByb3dzID0gMjQsIGNvbHMgPSA4MDsKKyAgICBpbnQgcm93ID0gMSwgY29sID0gMTsKKworICAgIGRlYnVnKEYxMDEsIlZNUyBpbml0c2NyIHNtZ19wYXN0ZWJvYXJkX2lkIEEiLCIiLHNtZ19wYXN0ZWJvYXJkX2lkKTsKKworICAgIGlmIChzbWdfcGFzdGVib2FyZF9pZCA9PSAtMSkgeyAvKiBPcGVuIHRoZSBzY3JlZW4gKi8KKyNpZmRlZiBPTERfVk1TICAgICAgICAgICAgICAgICAgICAgLyogTm90ZTogUm91dGluZSBjYWxscyBsb3dlcmNhc2VkIDkvOTYgKi8KKyAgICAgICAgQ0hFQ0tfRVJSKCJpbml0c2NyOiBzbWckY3JlYXRlX3Bhc3RlYm9hcmQiLAorICAgICAgICAgICAgICAgICAgc21nJGNyZWF0ZV9wYXN0ZWJvYXJkKCZzbWdfcGFzdGVib2FyZF9pZCwgMCwgMCwgMCwgMCkpOworI2Vsc2UKKyAgICAgICAgLyogRm9yIFZNUyBWNSwgbm90IHRlc3RlZCAqLworICAgICAgICBDSEVDS19FUlIoImluaXRzY3I6IHNtZyRjcmVhdGVfcGFzdGVib2FyZCIsCisgICAgICAgICAgICAgICAgICBzbWckY3JlYXRlX3Bhc3RlYm9hcmQoJnNtZ19wYXN0ZWJvYXJkX2lkLCAwLCAwLCAwLCAwLCAwKSk7CisjZW5kaWYgLyogT0xEX1ZNUyAqLworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJWTVMgaW5pdHNjciBzbWdfcGFzdGVib2FyZF9pZCBCIiwiIixzbWdfcGFzdGVib2FyZF9pZCk7CisgICAgaWYgKHNtZ19wYXN0ZWJvYXJkX2lkID09IC0xKSB7CisJcHJpbnRmKCI/RXJyb3IgaW5pdGlhbGl6aW5nIGZ1bGxzY3JlZW4gZGlzcGxheVxuIik7CisJZmRpc3BsYSA9IFhZRkRfUzsKKwlkcHlpbml0KCk7CisJcmV0dXJuKDApOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJWTVMgaW5pdHNjciBzbWdfZGlzcGxheV9pZCIsIiIsc21nX2Rpc3BsYXlfaWQpOworICAgIGlmIChzbWdfZGlzcGxheV9pZCA9PSAtMSkgeyAgICAgICAgIC8qIENyZWF0ZSBhIGRpc3BsYXkgd2luZG93ICovCisKKyNpZmRlZiBDT01NRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXJ0aW4gWmluc2VyICovCisgICAgICAgIENIRUNLX0VSUigiaW5pdHNjcjogc21nJGNyZWF0ZV92aXJ0dWFsX2Rpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgU01HJENSRUFURV9WSVJUVUFMX0RJU1BMQVkoJnJvd3MsICZjb2xzLCAmc21nX2Rpc3BsYXlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKSk7CisKKyAgICAgICAgLyogQ29ubmVjdCB0aGUgZGlzcGxheSB3aW5kb3cgdG8gdGhlIHNjcmVlbiAqLworICAgICAgICBDSEVDS19FUlIoImluaXRzY3I6IHNtZyRwYXN0ZV92aXJ0dWFsX2Rpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgU01HJFBBU1RFX1ZJUlRVQUxfRElTUExBWSgmc21nX2Rpc3BsYXlfaWQsJnNtZ19wYXN0ZWJvYXJkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93LCZjb2wpKTsKKyNlbHNlCisgICAgICAgIENIRUNLX0VSUigiaW5pdHNjcjogc21nJGNyZWF0ZV92aXJ0dWFsX2Rpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgc21nJGNyZWF0ZV92aXJ0dWFsX2Rpc3BsYXkoJnJvd3MsICZjb2xzLCAmc21nX2Rpc3BsYXlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKSk7CisKKyAgICAgICAgLyogQ29ubmVjdCB0aGUgZGlzcGxheSB3aW5kb3cgdG8gdGhlIHNjcmVlbiAqLworICAgICAgICBDSEVDS19FUlIoImluaXRzY3I6IHNtZyRwYXN0ZV92aXJ0dWFsX2Rpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgc21nJHBhc3RlX3ZpcnR1YWxfZGlzcGxheSgmc21nX2Rpc3BsYXlfaWQsJnNtZ19wYXN0ZWJvYXJkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93LCZjb2wpKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfQorICAgIGRlYnVnKEYxMDEsIlZNUyBpbml0c2NyIHNtZ19vcGVuIEEiLCIiLHNtZ19vcGVuKTsKKyAgICBpZiAoIXNtZ19vcGVuKSB7ICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCBhIGJhdGNoIHVwZGF0ZSAqLworICAgICAgICBzbWdfb3BlbiA9IDE7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICBDSEVDS19FUlIoImluaXRzY3I6IHNtZyRiZWdpbl9wYXN0ZWJvYXJkX3VwZGF0ZSIsCisgICAgICAgICAgICAgICAgICBTTUckQkVHSU5fUEFTVEVCT0FSRF9VUERBVEUoJnNtZ19wYXN0ZWJvYXJkX2lkKSk7CisjZWxzZQorICAgICAgICBDSEVDS19FUlIoImluaXRzY3I6IHNtZyRiZWdpbl9wYXN0ZWJvYXJkX3VwZGF0ZSIsCisgICAgICAgICAgICAgICAgICBzbWckYmVnaW5fcGFzdGVib2FyZF91cGRhdGUoJnNtZ19wYXN0ZWJvYXJkX2lkKSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCWRlYnVnKEYxMDEsIlZNUyBpbml0c2NyIHNtZyRiZWdpbl9wYXN0ZWJvYXJkX3VwZGF0ZSIsIiIsdm1zX3N0YXR1cyk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsIlZNUyBpbml0c2NyIHNtZ19vcGVuIEIiLCIiLHNtZ19vcGVuKTsKKyAgICBzbWdfaW5pdGVkID0gMTsKKyAgICByZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkCityZWZyZXNoKCkgeworICAgIGRlYnVnKEYxMDEsInJlZnJlc2ggc21nX3Bhc3RlYm9hcmRfaWQiLCIiLHNtZ19wYXN0ZWJvYXJkX2lkKTsKKworICAgIGlmIChzbWdfb3BlbiA9PSAwIHx8IHNtZ19wYXN0ZWJvYXJkX2lkID09IC0xKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgQ09NTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFydGluIFppbnNlciAqLworICAgIENIRUNLX0VSUigicmVmcmVzaDogc21nJGVuZF9wYXN0ZWJvYXJkX3VwZGF0ZSIsCisgICAgICAgICAgICAgIFNNRyRFTkRfUEFTVEVCT0FSRF9VUERBVEUoJnNtZ19wYXN0ZWJvYXJkX2lkKSk7CisgICAgQ0hFQ0tfRVJSKCJyZWZyZXNoOiBzbWckYmVnaW5fcGFzdGVib2FyZF91cGRhdGUiLAorICAgICAgICAgICAgICBTTUckQkVHSU5fUEFTVEVCT0FSRF9VUERBVEUoJnNtZ19wYXN0ZWJvYXJkX2lkKSk7CisjZWxzZQorICAgIENIRUNLX0VSUigicmVmcmVzaDogc21nJGVuZF9wYXN0ZWJvYXJkX3VwZGF0ZSIsCisgICAgICAgICAgICAgIHNtZyRlbmRfcGFzdGVib2FyZF91cGRhdGUoJnNtZ19wYXN0ZWJvYXJkX2lkKSk7CisgICAgQ0hFQ0tfRVJSKCJyZWZyZXNoOiBzbWckYmVnaW5fcGFzdGVib2FyZF91cGRhdGUiLAorICAgICAgICAgICAgICBzbWckYmVnaW5fcGFzdGVib2FyZF91cGRhdGUoJnNtZ19wYXN0ZWJvYXJkX2lkKSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworfQorCitzdGF0aWMgdm9pZAorZW5kd2luKCkgeworICAgIGlmICghc21nX29wZW4pCisgICAgICByZXR1cm47CisKKyAgICBzbWdfb3BlbiA9IDA7CisKKyNpZmRlZiBDT01NRU5UCisgICAgQ0hFQ0tfRVJSKCJlbmR3aW46IHNtZyRlbmRfcGFzdGVib2FyZF91cGRhdGUiLAorICAgICAgICAgICAgICBTTUckRU5EX1BBU1RFQk9BUkRfVVBEQVRFKCZzbWdfcGFzdGVib2FyZF9pZCkpOworI2Vsc2UKKyAgICBDSEVDS19FUlIoImVuZHdpbjogc21nJGVuZF9wYXN0ZWJvYXJkX3VwZGF0ZSIsCisgICAgICAgICAgICAgIHNtZyRlbmRfcGFzdGVib2FyZF91cGRhdGUoJnNtZ19wYXN0ZWJvYXJkX2lkKSk7CisjZW5kaWYgLyogQ09NTUVOVCAqLworCisgICAgbW92ZSgyMiwgMCk7CisKKyNpZmRlZiBDT01NRU5UCisvKgorICBUaGVzZSBjYWxscyBjbGVhciB0aGUgc2NyZWVuLgorICAoY29udmVydCByb3V0aW5lIGNhbGxzIHRvIGxvd2VyY2FzZSAtIE1hcnRpbiBaaW5zZXIpCisqLworICAgIENIRUNLX0VSUigiZW5kd2luOiBzbWckZGVsZXRlX3ZpcnR1YWxfZGlzcGxheSIsCisgICAgICAgICAgICAgIFNNRyRERUxFVEVfVklSVFVBTF9ESVNQTEFZKCZzbWdfZGlzcGxheV9pZCkpOworICAgIHNtZ19kaXNwbGF5X2lkID0gLTE7CisKKyAgICBDSEVDS19FUlIoImVuZHdpbjogc21nJGRlbGV0ZV9wYXN0ZWJvYXJkIiwKKyAgICAgICAgICAgICAgU01HJERFTEVURV9QQVNURUJPQVJEKCZzbWdfcGFzdGVib2FyZF9pZCwgMCkpOworICAgIHNtZ19wYXN0ZWJvYXJkX2lkID0gLTE7CisjZW5kaWYgLyogQ09NTUVOVCAqLworfQorCisjaWZkZWYgQ09NTUVOVAorLyogREVDQyA2LjIgc2NyZWFtcyBibG9vZHkgbXVyZGVyIGFib3V0IHByaW50dyAoIm5vdCBlbm91Z2ggYXJncyIpICovCisvKiBidXQgYWRkaW5nIHRoZSBmb2xsb3dpbmcgcHJvdG90eXBlIG9ubHkgbWFrZXMgaXQgaG9sbGVyIGxvdWRlci4gKi8KKyNpZmRlZiBfX0RFQ0MKKy8qICJ2YXJhcmdzIiBwcm90b3R5cGUgZm9yIHByaW50dyAqLworX1BST1RPVFlQKHN0YXRpYyBpbnQgcHJpbnR3LChjaGFyICosIC4uLikpOworI2VuZGlmIC8qIF9fREVDQyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIF9fREVDQworI2luY2x1ZGUgPHN0ZGFyZy5oPgorX1BST1RPVFlQKHN0YXRpYyB2b2lkIHByaW50dywoY2hhciAqLCAuLi4pKTsKK3N0YXRpYyB2b2lkCitwcmludHcoY2hhciAqc3RyLC4uLikgeworICAgIGNoYXIgYnVmWzI1NV07CisgICAgdmFfbGlzdCBhcDsKKyAgICAkREVTQ1JJUFRPUih0ZXh0X2RzYywgMCk7CisgICAgdGV4dF9kc2MuZHNjJGFfcG9pbnRlcj1idWY7CisgICAgaWYgKCFzbWdfb3BlbikKKyAgICAgIHJldHVybjsKKyAgICB2YV9zdGFydChhcCxzdHIpOworICAgIHRleHRfZHNjLmRzYyR3X2xlbmd0aCA9IHZzcHJpbnRmKGJ1Ziwgc3RyLCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyAgICBDSEVDS19FUlIoInByaW50dzogc21nJHB1dF9jaGFycyIsCisgICAgICAgICAgICAgIHNtZyRwdXRfY2hhcnMoJnNtZ19kaXNwbGF5X2lkLCAmdGV4dF9kc2MsIDAsIDAsIDAsIDAsIDApKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZAorcHJpbnR3KHN0ciwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KQorICAgIGNoYXIgKnN0cjsKKyAgICBsb25nIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhODsKKy8qIHByaW50dyAqLyB7CisgICAgY2hhciBidWZbMjU1XTsKKyAgICAkREVTQ1JJUFRPUih0ZXh0X2RzYywgMCk7CisgICAgaWYgKCFzbWdfb3BlbikKKyAgICAgIHJldHVybjsKKyAgICB0ZXh0X2RzYy5kc2MkYV9wb2ludGVyPWJ1ZjsKKyAgICB0ZXh0X2RzYy5kc2Mkd19sZW5ndGggPSBzcHJpbnRmKGJ1Ziwgc3RyLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOworICAgIENIRUNLX0VSUigicHJpbnR3OiBzbWckcHV0X2NoYXJzIiwKKyAgICAgICAgICAgICAgc21nJHB1dF9jaGFycygmc21nX2Rpc3BsYXlfaWQsICZ0ZXh0X2RzYywgMCwgMCwgMCwgMCwgMCkpOworfQorI2VuZGlmIC8qIF9fREVDQyAqLworCisjZGVmaW5lIENLX0NVUlBPUworaW50Citja19jdXJwb3Mocm93LCBjb2wpIHsKKyAgICBkZWJ1ZyhGMTExLCJWTVMgc21nIGNrX2N1cnBvcyIsY2tpdG9hKHJvdyksY29sKTsKKyAgICBpZiAoIXNtZ19pbml0ZWQgfHwgIXNtZ19vcGVuKSB7CisgICAgICAgIGluaXRzY3IoKTsKKyAgICB9CisgICAgZGVidWcoRjEwMSwiVk1TIHNtZyBjdXJwb3Mgc21nX29wZW4iLCIiLHNtZ19vcGVuKTsKKyAgICBpZiAoIXNtZ19vcGVuKQorICAgICAgcmV0dXJuKDApOworICAgIGRlYnVnKEYxMTEsIlZNUyBzbWcgY2tfY3VycG9zIixja2l0b2Eocm93LTEpLGNvbC0xKTsKKyAgICBtb3ZlKHJvdyAtIDEsIGNvbCAtIDEpOyAgICAgICAgICAgICAvKiBTTUcgaXMgMC1iYXNlZCAqLworICAgIHJlZnJlc2goKTsKKyAgICAvKiBlbmR3aW4oKTsgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorY2tfY2xzKCkgeworICAgIGRlYnVnKEYxMDEsIlZNUyBzbWcgY2tfY2xzIHNtZ19pbml0ZWQiLCIiLHNtZ19pbml0ZWQpOworICAgIGlmICghc21nX2luaXRlZCB8fCAhc21nX29wZW4pIHsKKyAgICAgICAgaW5pdHNjcigpOworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJWTVMgc21nIGNrX2NscyBzbWdfb3BlbiIsIiIsc21nX29wZW4pOworICAgIGlmICghc21nX29wZW4pCisgICAgICByZXR1cm4oMCk7CisgICAgY2xlYXIoKTsKKyAgICByZWZyZXNoKCk7CisgICAgLyogZW5kd2luKCk7ICovCisgICAgcmV0dXJuKDApOworfQorCitpbnQKK2NrX2NsZW9sKCkgeworICAgIGRlYnVnKEYxMDEsIlZNUyBzbWcgY2tfY2xlb2wgc21nX2luaXRlZCIsIiIsc21nX2luaXRlZCk7CisgICAgaWYgKCFzbWdfaW5pdGVkIHx8ICFzbWdfb3BlbikgeworICAgICAgICBpbml0c2NyKCk7CisgICAgfQorICAgIGRlYnVnKEYxMDEsIlZNUyBzbWcgY2tfY2xlb2wgc21nX29wZW4iLCIiLHNtZ19vcGVuKTsKKyAgICBpZiAoIXNtZ19vcGVuKQorICAgICAgcmV0dXJuKDApOworICAgIGNscnRvZW9sKCk7CisgICAgcmVmcmVzaCgpOworICAgIC8qIGVuZHdpbigpOyAqLworICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBDS19TTUcgKi8KKworI2lmZGVmIE1ZQ1VSU0VTCisvKgorICBEby1pdC15b3Vyc2VsZiBjdXJzZXMgaW1wbGVtZW50YXRpb24gZm9yIFZNUywgT1MvMiBhbmQgb3RoZXIgQU5TSS9WVC0xMDAncy4KKyAgU3VwcG9ydHMgb25seSB0aGUgVlQ1MiBhbmQgVlQxeHggKGFuZCBsYXRlciBWVDJ4eC8zeHgvNHh4KSB0ZXJtaW5hbHMuCisgIEJ5IFRlcnJ5IEtlbm5lZHksIFN0IFBldGVycyBDb2xsZWdlLgorCisgIEZpcnN0LCBzb21lIHN0dWZmIHdlIGNhbiBqdXN0IGlnbm9yZToKKyovCisKK3N0YXRpYyBpbnQKK3RvdWNod2luKHgpIGludCB4OyB7CisgICAgcmV0dXJuKDApOworfQorc3RhdGljIGludAoraW5pdHNjcigpIHsKKyAgICByZXR1cm4oMCk7Cit9CitzdGF0aWMgaW50CityZWZyZXNoKCkgeworICAgIHJldHVybigwKTsKK30KK3N0YXRpYyBpbnQKK2VuZHdpbigpIHsKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qCisgKiBOb3csIHNvbWUgc3R1ZmYgd2UgbmVlZCB0byBkbzoKKyAqLworCitfUFJPVE9UWVAoIGludCBtb3ZlLCAoaW50LCBpbnQpICk7CisjaWZuZGVmIE9TMgoraW50Cittb3ZlKHJvdywgY29sKSBpbnQgcm93LCBjb2w7IHsKKyAgICBpZiAoaXN2dDUyKQorICAgICAgcHJpbnRmKCJcMDMzWSVjJWMiLCByb3cgKyAwMzcsIGNvbCArIDAzNyk7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJcMDMzWyVkOyVkSCIsIHJvdyArIDEsIGNvbCArIDEpOworICAgIHJldHVybigwKTsKK30KKworaW50CitjbGVhcigpIHsKKyAgICBtb3ZlKDAsMCk7CisgICAgaWYgKGlzdnQ1MikKKyAgICAgIHByaW50ZigiXDAzM0oiKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIlwwMzNbSiIpOworICAgIHJldHVybigwKTsKK30KKworaW50CitjbHJ0b2VvbCgpIHsKKyAgICBpZiAoaXN2dDUyKQorICAgICAgcHJpbnRmKCJcMDMzSyIpOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiXDAzM1tLIik7CisgICAgcmV0dXJuKDApOworfQorCisjZGVmaW5lIENLX0NVUlBPUworaW50Citja19jbHMoKSB7CisgICAgcmV0dXJuKGNsZWFyKCkpOworfQorCitpbnQKK2NrX2NsZW9sKCkgeworICAgIHJldHVybihjbHJ0b2VvbCgpKTsKK30KKworaW50Citja19jdXJwb3Mocm93LCBjb2wpIGludCByb3csIGNvbDsgeworICAgIG1vdmUocm93LCBjb2wpOworICAgIHJldHVybigwKTsKK30KKworI2Vsc2UgLyogT1MyICovCisvKiBXaW5kb3dzIE5UIGFuZCBXaW5kb3dzIDk1IGRvIG5vdCBwcm92aWRlIEFOU0kgZW11bGF0aW9uICovCisvKiBUaGVyZWZvcmUgd2UgbWlnaHQgYXMgd2VsbCBub3QgdXNlIGl0IGZvciBPUy8yIGVpdGhlciAgICovCisKK2ludAorbW92ZShyb3csIGNvbCkgaW50IHJvdywgY29sOyB7CisjaWZuZGVmIE9ORVRFUk1VUEQKKyAgICBTZXRDdXJQb3Mocm93LCBjb2wpOworI2VuZGlmIC8qIE9ORVRFUk1VUEQgKi8KKyAgICBsZ290b3h5KCBWQ01ELCBjb2wrMSwgcm93KzEpOworICAgIFZzY3JuSXNEaXJ0eShWQ01EKTsKKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorY2xlYXIoKSB7CisgICAgdmlvY2VsbCBjZWxsOworICAgIG1vdmUoMCwwKTsKKyNpZmRlZiBPTkVURVJNVVBECisgICAgaWYgKFZzY3JuR2V0QnVmZmVyU2l6ZShWQ01EKSA+IDApIHsKKyAgICAgICAgVnNjcm5TY3JvbGwoVkNNRCwgVVBXQVJELCAwLAorICAgICAgICAgICAgICAgICAgICBWc2NybkdldEhlaWdodChWQ01EKS0oMSksCisgICAgICAgICAgICAgICAgICAgIFZzY3JuR2V0SGVpZ2h0KFZDTUQpLSgwKSwgVFJVRSwgQ0hSX1NQKTsKKyAgICAgICAgY2xlYXJ0ZXJtc2NyZWVuKFZDTUQpOworICAgIH0KKyNlbHNlCisgICAgY2VsbC5jID0gJyAnOworICAgIGNlbGwuYSA9IGNvbG9yY21kOworICAgIFdydE5DZWxsKGNlbGwsIGNtZF9yb3dzICogY21kX2NvbHMsIDAsIDApOworI2VuZGlmIC8qIE9ORVRFUk1VUEQgKi8KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorY2xydG9lb2woKSB7CisgICAgVVNIT1JUIHJvdywgY29sOworICAgIHZpb2NlbGwgY2VsbDsKKworICAgIGNlbGwuYyA9ICcgJzsKKyAgICBjZWxsLmEgPSBjb2xvcmNtZDsKKyNpZm5kZWYgT05FVEVSTVVQRAorICAgIEdldEN1clBvcygmcm93LCAmY29sICk7CisgICAgV3J0TkNlbGwoY2VsbCwgY21kX2NvbHMgLSBjb2wgLTEsIHJvdywgY29sKTsKKyNlbmRpZiAvKiBPTkVURVJNVVBEICovCisgICAgY2xydG9lb2xuKFZDTUQsQ0hSX1NQKTsKKyAgICByZXR1cm4oMCk7Cit9CisKKyNkZWZpbmUgQ0tfQ1VSUE9TCitpbnQKK2NrX2N1cnBvcyhyb3csIGNvbCkgaW50IHJvdywgY29sOyB7CisgICAgbW92ZShyb3csIGNvbCk7CisgICAgcmV0dXJuKDApOworfQorCitpbnQKK2NrX2NscygpIHsKKyAgICByZXR1cm4oY2xlYXIoKSk7Cit9CisKK2ludAorY2tfY2xlb2woKSB7CisgICAgcmV0dXJuKGNscnRvZW9sKCkpOworfQorCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTVlDVVJTRVMgKi8KKworI2lmbmRlZiBOT1RFUk1DQVAKKyNpZm5kZWYgQ0tfQ1VSUE9TCisjZGVmaW5lIENLX0NVUlBPUworCisvKiBUZXJtY2FwL1Rlcm1pbmZvIHNlY3Rpb24gKi8KKworc3RhdGljIGNoYXIgY3VyX2Nsc1szMl0gPSB7IE5VTCwgTlVMIH07CitzdGF0aWMgY2hhciBjdXJfY2xlb2xbMzJdID0geyBOVUwsIE5VTCB9Oworc3RhdGljIGNoYXIgY3VyX2NtWzY0XSA9IHsgTlVMLCBOVUwgfTsKK3N0YXRpYyBjaGFyIHRnc2J1ZlsxMjhdID0geyBOVUwsIE5VTCB9OworCitzdGF0aWMKKyNpZmRlZiBDS19BTlNJQwordm9pZAorI2VuZGlmIC8qIENLX0FOU0lDICovCitja190ZXJtc2V0KHgpIGludCB4OyB7CisgICAgY3VyX2Nsc1swXSA9IE5VTDsKKyAgICBjdXJfY2xlb2xbMF0gPSBOVUw7CisgICAgY3VyX2NtWzBdID0gTlVMOworI2lmZGVmIHRnZXRlbnQKKyAgICBkZWJ1ZyhGMTAwLCJ0Z2V0ZW50IGlzIGEgbWFjcm8iLCIiLDApOworI2VuZGlmIC8qIHRnZXRlbnQgKi8KKyNpZmRlZiB0Z2V0c3RyCisgICAgZGVidWcoRjEwMCwidGdldHN0ciBpcyBhIG1hY3JvIiwiIiwwKTsKKyNlbmRpZiAvKiB0Z2V0c3RyICovCisjaWZkZWYgdHB1dHMKKyAgICBkZWJ1ZyhGMTAwLCJ0cHV0cyBpcyBhIG1hY3JvIiwiIiwwKTsKKyNlbmRpZiAvKiB0cHV0cyAqLworI2lmZGVmIHRnb3RvCisgICAgZGVidWcoRjEwMCwidGdvdG8gaXMgYSBtYWNybyIsIiIsMCk7CisjZW5kaWYgLyogdGdvdG8gKi8KKyNpZmRlZiBOT1RFUk1DQVAKKyAgICAvKiB0Z2V0c3RyKCkgZ2V0cyBhIHNlZ21lbnRhdGlvbiBmYXVsdCBvbiBPU0YvMSAqLworICAgIGRlYnVnKEYxMDAsImNrX3Rlcm1zZXQgTk9URVJNQ0FQIiwiIiwwKTsKKyNlbHNlCisgICAgaWYgKG5vdGVybWNhcCkgeworICAgICAgICBkZWJ1ZyhGMTAwLCJja190ZXJtc2V0IG5vdGVybWNhcCIsIiIsMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVidWcoRjEwMSwiY2tfdGVybXNldCB4IiwiIix4KTsKKyAgICBpZiAoeCA+IDApIHsKKyAgICAgICAgY2hhciAqIGJwOworICAgICAgICBicCA9IHRnc2J1ZjsKKyAgICAgICAgKmJwID0gTlVMOworICAgICAgICBkZWJ1ZyhGMTEwLCJja190ZXJtc2V0IGNhbGxpbmcgdGdldHN0ciIsImNsIiwwKTsKKyAgICAgICAgaWYgKHRnZXRzdHIoImNsIiwgJmJwKSkgeyAgICAgICAvKiBHZXQgY2xlYXItc2NyZWVuIGNvZGUgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX3Rlcm1zZXQgdGdldHN0ciBjbCIsdGdzYnVmLCIiKTsKKyAgICAgICAgICAgIGlmICgoaW50KXN0cmxlbih0Z3NidWYpIDwgMzIpCisgICAgICAgICAgICAgIGNrc3RybmNweShjdXJfY2xzLHRnc2J1ZiwzMik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgYnAgPSB0Z3NidWY7CisgICAgICAgIGlmICh0Z2V0c3RyKCJjZSIsICZicCkpIHsgICAgICAgLyogR2V0IGNsZWFyLXRvLWVuZC1vZi1saW5lIGNvZGUgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX3Rlcm1zZXQgdGdldHN0ciBjZSIsdGdzYnVmLCIiKTsKKyAgICAgICAgICAgIGlmICgoaW50KXN0cmxlbih0Z3NidWYpIDwgMzIpCisgICAgICAgICAgICAgIGNrc3RybmNweShjdXJfY2xlb2wsdGdzYnVmLDMyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBicCA9IHRnc2J1ZjsKKyAgICAgICAgaWYgKHRnZXRzdHIoImNtIiwgJmJwKSkgeyAgICAgICAvKiBHZXQgY3Vyc29yLW1vdmVtZW50IGNvZGUgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImNrX3Rlcm1zZXQgdGdldHN0ciBjbSIsdGdzYnVmLCIiKTsKKyAgICAgICAgICAgIGlmICgoaW50KXN0cmxlbih0Z3NidWYpIDwgNjQpCisgICAgICAgICAgICAgIGNrc3RybmNweShjdXJfY20sdGdzYnVmLDY0KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBOT1RFUk1DQVAgKi8KK30KKworI2lmbmRlZiBUUFVUU0ZOVFlQRQorI2lmZGVmIFRQVVRTSVNWT0lECisjZGVmaW5lIFRQVVRTRk5UWVBFIHZvaWQKKyNlbHNlCisjZGVmaW5lIFRQVVRTRk5UWVBFIGludAorI2VuZGlmIC8qIFRQVVRTSVNWT0lEICovCisjZW5kaWYgLyogVFBVVFNGTlRZUEUgKi8KKworI2lmbmRlZiBUUFVUU0FSR1RZUEUKKyNpZmRlZiBIUFVYOQorI2RlZmluZSBUUFVUU0FSR1RZUEUgY2hhcgorI2Vsc2UKKyNpZmRlZiBIUFVYMTAKKyNkZWZpbmUgVFBVVFNBUkdUWVBFIGNoYXIKKyNlbHNlCisjZGVmaW5lIFRQVVRTQVJHVFlQRSBpbnQKKyNlbmRpZiAvKiBIUFVYMTAgKi8KKyNlbmRpZiAvKiBIUFVYOSAqLworI2VuZGlmIC8qIFRQVVRTQVJHVFlQRSAqLworCitzdGF0aWMgVFBVVFNGTlRZUEUKKyNpZmRlZiBDS19BTlNJQworY2tfb3V0YyhUUFVUU0FSR1RZUEUgeCkKKyNlbHNlCitja19vdXRjKHgpIFRQVVRTQVJHVFlQRSB4OworI2VuZGlmIC8qIENLX0FOU0lDICovCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVG8gc2F0aXNmeSB0cHV0cygpIGFyZzMgcHJvdG90eXBlICovCisgICAgaW50IHJjOworICAgIGNoYXIgYzsKKyAgICBjID0gKGNoYXIpIHg7CisgICAgcmMgPSAoaW5zZXJ2ZXIpID8gdHRvYyhjKSA6IGNvbm9jKGMpOworI2lmbmRlZiBUUFVUU0lTVk9JRAorICAgIHJldHVybihyYyk7CisjZW5kaWYgLyogVFBVVFNJU1ZPSUQgKi8KK30KKworaW50Citja19jdXJwb3Mocm93LCBjb2wpIGludCByb3csIGNvbDsgeworI2lmZGVmIENLX0FOU0lDCisgICAgVFBVVFNGTlRZUEUgKCpmbikoVFBVVFNBUkdUWVBFKTsKKyNlbHNlCisgICAgVFBVVFNGTlRZUEUgKCpmbikoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworICAgIGlmICghZnhkX2luaXRlZCkKKyAgICAgIGZ4ZGluaXQoOTk5OSk7CisgICAgaWYgKCFjdXJfY21bMF0pIHsgICAgICAgICAgICAgICAgICAgLyogV2UgZG9uJ3QgaGF2ZSBlc2NhcGUgc2VxdWVuY2VzICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgKi8KKyNlbHNlCisgICAgICAgIC8qIEJvdGggQy1LZXJtaXQncyBTQ1JFRU4gY29tbWFuZCBhbmQgQU5TSS9WVDEwMCBhcmUgMS1iYXNlZCAqLworICAgICAgICBwcmludGYoIlwwMzNbJWQ7JWRIIiwgcm93LCBjb2wpOyAvKiBPciBkZWZhdWx0IHRvIEFOU0kgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgZm4gPSBja19vdXRjOworICAgICAgICAvKiB0ZXJtY2FwL3Rlcm1pbmZvIGlzIDAtYmFzZWQgKi8KKyAgICAgICAgdHB1dHMoCisjaWZkZWYgVFBVVFNBUkcxQ09OU1QKKyAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikKKyNlbmRpZiAvKiBUUFVUU0FSRzFDT05TVCAqLworICAgICAgICAgICAgICB0Z290byhjdXJfY20sY29sLTEscm93LTEpLDEsZm4pOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorY2tfY2xzKCkgeworI2lmZGVmIENLX0FOU0lDCisgICAgVFBVVFNGTlRZUEUgKCpmbikoVFBVVFNBUkdUWVBFKTsKKyNlbHNlCisgICAgVFBVVFNGTlRZUEUgKCpmbikoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworICAgIGlmICghZnhkX2luaXRlZCkKKyAgICAgIGZ4ZGluaXQoOTk5OSk7CisgICAgaWYgKCFjdXJfY2xzWzBdKSB7ICAgICAgICAgICAgICAgICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBlc2NhcGUgc2VxdWVuY2VzICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICByZXR1cm4oLTEpOyAgICAgICAgICAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgKi8KKyNlbHNlCisgICAgICAgIHByaW50ZigiXDAzM1s7SFwwMzNbMkoiKTsgICAgICAgLyogT3IgZGVmYXVsdCB0byBBTlNJICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIH0gZWxzZSB7CisgICAgICAgIGZuID0gY2tfb3V0YzsKKyAgICAgICAgZGVidWcoRjExMSwiY2tfY2xzIDIiLGN1cl9jbHMsZnhkX2luaXRlZCk7CisgICAgICAgIHRwdXRzKGN1cl9jbHMsY21kX3Jvd3MsZm4pOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorY2tfY2xlb2woKSB7CisjaWZkZWYgQ0tfQU5TSUMKKyAgICBUUFVUU0ZOVFlQRSAoKmZuKShUUFVUU0FSR1RZUEUpOworI2Vsc2UKKyAgICBUUFVUU0ZOVFlQRSAoKmZuKSgpOworI2VuZGlmIC8qIENLX0FOU0lDICovCisgICAgaWYgKCFmeGRfaW5pdGVkKQorICAgICAgZnhkaW5pdCg5OTk5KTsKKyAgICBpZiAoIWN1cl9jbGVvbFswXSkgeyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGVzY2FwZSBzZXF1ZW5jZXMgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgIHJldHVybigtMSk7ICAgICAgICAgICAgICAgICAgICAgLyogRG8gbm90aGluZyAqLworI2Vsc2UKKyAgICAgICAgcHJpbnRmKCJcMDMzW0siKTsgICAgICAgICAgICAgICAvKiBPciB1c2UgQU5TSSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBmbiA9IGNrX291dGM7CisgICAgICAgIHRwdXRzKGN1cl9jbGVvbCwxLGZuKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIENLX0NVUlBPUyAqLworI2Vsc2UKK3N0YXRpYyB2b2lkCitja190ZXJtc2V0KHgpIGludCB4OyB7CisgICAgaWYgKHgpIHJldHVybjsKK30KKyNlbmRpZiAvKiBOT1RFUk1DQVAgKi8KKworI2lmbmRlZiBDS19DVVJQT1MKKyNkZWZpbmUgQ0tfQ1VSUE9TCitpbnQKK2NrX2NscygpIHsKKyAgICBwcmludGYoIlwwMzNbO0hcMDMzWzJKIik7CisgICAgcmV0dXJuKDApOworfQorCitpbnQKK2NrX2NsZW9sKCkgeworICAgIHByaW50ZigiXDAzM1tLIik7CisgICAgcmV0dXJuKDApOworfQorCitpbnQKK2NrX2N1cnBvcyhyb3csIGNvbCkgaW50IHJvdywgY29sOyB7CisgICAgcHJpbnRmKCJcMDMzWyVkOyVkSCIsIHJvdywgY29sKTsKKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogQ0tfQ1VSUE9TICovCisKKworI2lmbmRlZiBOT1hGRVIKK3N0YXRpYyBpbnQgY2luaXQgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBjdXJzZXMgaW5pdCdkICovCitzdGF0aWMgaW50IGNlbmR3ID0gMDsgICAgICAgICAgICAgICAgICAgLyogZW5kd2luKCkgd2FzIGNhbGxlZCAqLworCitzdGF0aWMKKyNpZmRlZiBDS19BTlNJQyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCZWNhdXNlIFZPSUQgdXNlZCBieSBjdXJzZXMuaCAqLwordm9pZAorI2Vsc2UKKyNpZmRlZiBNWUNVUlNFUworVk9JRAorI2Vsc2UKK2ludAorI2VuZGlmIC8qIE1ZQ1VSU0VTICovCisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKyNpZmRlZiBDS19BTlNJQyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgJSB0cmFuc2ZlcmVkIGFuZCAlIGJhciAqLwordXBkcGN0KGxvbmcgb2xkLCBsb25nIG5ldykKKyNlbHNlIC8qIENLX0FOU0lDICovCit1cGRwY3Qob2xkLCBuZXcpIGxvbmcgb2xkLCBuZXc7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIHVwZHBjdCAqLyB7CisjaWZkZWYgQ09NTUVOVAorICAgIGludCBtLCBuOworICAgIG1vdmUoQ1dfUENELDIyKTsKKyAgICBwcmludHcoIiVsZCIsIG5ldyk7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX1BDRCwgKGxvbmcpIG5ldyk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworI2lmZGVmIENLX1BDVF9CQVIKKyAgICBpZiAodGhlcm1vbWV0ZXIpIHsKKyAgICAgICAgaWYgKG9sZCA+IG5ldykgeworICAgICAgICAgICAgb2xkID0gMDsKKyAgICAgICAgICAgIG1vdmUoQ1dfUENELCAyNik7CisgICAgICAgICAgICBjbHJ0b2VvbCgpOworICAgICAgICB9CisgICAgICAgIG0gPSBvbGQvMjsKKyAgICAgICAgbW92ZShDV19QQ0QsIDI2ICsgbSk7CisgICAgICAgIG4gPSBuZXcgLyAyIC0gbTsKKyNpZm5kZWYgT1MyCisgICAgICAgIHdoaWxlIChuID4gMCkgeworICAgICAgICAgICAgaWYgKChtICsgMSkgJSA1ID09IDApCisgICAgICAgICAgICAgIHByaW50dygiKiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwcmludHcoIj0iKTsKKyAgICAgICAgICAgIG0rKzsKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmV3ICUgMiAhPSAwKSBwcmludHcoIi0iKTsKKyAgICAgICAgLyogbW92ZShDV19QQ0QsIDIyKzUzKTsgKi8KKyNlbHNlIC8qIE9TMiAqLworICAgICAgICB3aGlsZSAobiA+IDApIHsKKyAgICAgICAgICAgIHByaW50dygiJWMiLCAnXDMzMycpOworICAgICAgICAgICAgbSsrOyBuLS07CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5ldyAlIDIgIT0gMCkKKyAgICAgICAgICBwcmludHcoIiVjIiwgJ1wyNjEnKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICB9CisjZW5kaWYgLyogQ0tfUENUX0JBUiAqLworICAgIC8qIGNscnRvZW9sKCk7ICovCisjZWxzZSAgLyogIUNPTU1FTlQgKi8KKyNpZmRlZiBPUzIKKyNkZWZpbmUgQ0hBUjEgICAnXDMzMycgICAgICAgICAgLyogT1MyIC0gQ1A0MzcgKi8KKyNkZWZpbmUgQ0hBUjIgICAnXDI2MScKKyNlbHNlCisjZGVmaW5lIENIQVIxICAgJy8nICAgICAgICAgICAgIC8qIERlZmF1bHQgKi8KKyNkZWZpbmUgQ0hBUjIgICAnLScKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICBkZWJ1ZyhGMTAxLCJ1cGRwY3Qgb2xkIiwiIixvbGQpOworICAgIGRlYnVnKEYxMDEsInVwZHBjdCBuZXciLCIiLG5ldyk7CisgICAgbW92ZShDV19QQ0QsMjIpOworICAgIHByaW50dygiJS0zbGQiLCBuZXcpOyAvKiAgKHdhcykgICBwcmludHcoIiVsZCIsIG5ldyk7ICAqLworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfUENELCAobG9uZykgbmV3ICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworI2lmZGVmIENLX1BDVF9CQVIKKyAgICBpZiAodGhlcm1vbWV0ZXIpIHsKKyAgICAgICAgaW50IG0sIG47CisKKyAgICAgICAgaWYgKG9sZCA+IG5ldykgeworICAgICAgICAgICAgb2xkID0gMCA7CisgICAgICAgICAgICBtb3ZlKENXX1BDRCwgMjYpOworICAgICAgICAgICAgY2xydG9lb2woKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmV3IDw9IDEwMEwpIHsKKyAgICAgICAgICAgIG0gPSBvbGQgLyAyOworICAgICAgICAgICAgbiA9IG5ldyAvIDIgLSBtOworICAgICAgICAgICAgbW92ZShDV19QQ0QsIDI2K20pOworICAgICAgICAgICAgd2hpbGUgKG4tLSA+IDApCisgICAgICAgICAgICAgIHByaW50dygiJWMiLCBDSEFSMSk7CisgICAgICAgICAgICBpZiAobmV3ICUgMiAhPSAwKQorICAgICAgICAgICAgICBwcmludHcoIiVjIiwgQ0hBUjIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIENLX1BDVF9CQVIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCit9CisKK3N0YXRpYyBsb25nIG9sZF90ciA9IC0xTDsgICAgICAgICAgICAgICAvKiBUaW1lIHJlbWFpbmluZyBwcmV2aW91c2x5ICovCisKK3N0YXRpYyBsb25nCisjaWZkZWYgQ0tfQU5TSUMKK3Nob2V0bChsb25nIG9sZF90ciwgbG9uZyBjcHMsIGxvbmcgZnNpeiwgbG9uZyBob3dmYXIpCisjZWxzZQorc2hvZXRsKG9sZF90ciwgY3BzLCBmc2l6LCBob3dmYXIpIGxvbmcgb2xkX3RyLCBjcHMsIGZzaXosIGhvd2ZhcjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogc2hvZXRsICovIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVzdGltYXRlZCB0aW1lIGxlZnQgaW4gdHJhbnNmZXIgKi8KKyAgICBsb25nIHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIHJlbWFpbmluZywgc2Vjb25kcyAqLworCisjaWZkZWYgR0ZUSU1FUgorICAgIGlmIChmc2l6ID4gMEwgJiYgY3BzID4gMEwpCisgICAgICB0ciA9IChsb25nKSgoQ0tGTE9BVCkoZnNpeiAtIGhvd2ZhcikgLyAoQ0tGTE9BVCljcHMpOworICAgIGVsc2UKKyAgICAgIHRyID0gLTFMOworI2Vsc2UKKyAgICB0ciA9IChmc2l6ID4gMEwgJiYgY3BzID4gMEwpID8KKyAgICAgICgoZnNpeiAtIGhvd2ZhcikgLyBjcHMpIDoKKyAgICAgICAgLTFMOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyAgICBtb3ZlKENXX1RSLDIyKTsKKyAgICBpZiAodHIgPiAtMUwpIHsKKyAgICAgICAgaWYgKHRyICE9IG9sZF90cikgeworICAgICAgICAgICAgcHJpbnR3KCIlcyIsaGhtbXNzKHRyKSk7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZylDV19UUiwgKGxvbmcpaGhtbXNzKHRyKSk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICAgICAgY2xydG9lb2woKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50dygiKHVua25vd24pIik7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfVFIsIChsb25nKSAiKHVua25vd24pIiApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgY2xydG9lb2woKTsKKyAgICB9CisgICAgcmV0dXJuKHRyKTsKK30KKworc3RhdGljIGxvbmcKKyNpZmRlZiBDS19BTlNJQworc2hvY3BzKGludCBwY3QsIGxvbmcgZnNpeiwgbG9uZyBob3dmYXIpCisjZWxzZQorc2hvY3BzKHBjdCwgZnNpeiwgaG93ZmFyKSBpbnQgcGN0OyBsb25nIGZzaXosIGhvd2ZhcjsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogc2hvY3BzICovIHsKKyNpZmRlZiBDUFNfV0VJR0hURUQKKyAgICBzdGF0aWMgbG9uZyBvbGRmZmMgPSAwTDsKKyNlbmRpZiAvKiBDUFNfV0VJR0hURUQgKi8KKyNpZmRlZiBHRlRJTUVSCisgICAgQ0tGTE9BVCBzZWNzLCB4eDsKKyNlbHNlCisgICAgbG9uZyBzZWNzLCB4eDsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisKKyNpZmRlZiBHRlRJTUVSCisgICAgeHggPSAoZ3R2ID49IDAuMCkgPyBndHYgOiAwLjA7ICAgICAgLyogRmxvYXRpbmctcG9pbnQgdmVyc2lvbiAqLworICAgIGd0diA9IGdmdGltZXIoKTsKKyAgICBpZiAoKGd0diAtIG9sZGd0dikgPCAoQ0tGTE9BVCkgMS4wKSAvKiBPbmx5IGRvIHRoaXMgb25jZSBwZXIgc2Vjb25kICovCisgICAgICByZXR1cm4ob2xkY3BzKTsKKyAgICBvbGRndHYgPSB4eDsKKyNlbHNlCisgICAgeHggPSAoZ3R2ID49IDApID8gZ3R2IDogMDsgICAgICAgICAgLyogV2hvbGUtbnVtYmVyIHZlcnNpb24gKi8KKyAgICBndHYgPSBndGltZXIoKTsKKyAgICBpZiAoKGd0diAtIG9sZGd0dikgPCAxKQorICAgICAgcmV0dXJuKG9sZGNwcyk7CisgICAgb2xkZ3R2ID0geHg7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisjaWZkZWYgQ1BTX1dFSUdIVEVECisgICAgLyogZGVidWcoRjEwMCwiU0hPQ1BTOiBXRUlHSFRFRCIsIiIsMCk7ICovCisgICAgaWYgKGd0diAhPSBvbGRndHYpIHsgICAgICAgICAgICAgICAgLyogVGhlIGZpcnN0IHBhY2tldCBpcyBpZ25vcmVkICovCisgICAgICAgIGlmIChmZmMgPCBvbGRmZmMpCisgICAgICAgICAgb2xkZmZjID0gZmZjOworICAgICAgICBvbGRjcHMgPSBjcHM7CisgICAgICAgIGlmIChvbGRjcHMgJiYgb2xkZ3R2ID4KKyNpZmRlZiBHRlRJTUVSCisgICAgICAgICAgICAxLjAKKyNlbHNlCisgICAgICAgICAgICAxCisjZW5kaWYgLyogR0ZUSU1FUiAqLworICAgICAgICAgICAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmaXJzdCBzZWNvbmQgaXMgaWdub3JlZCAqLworLyoKKyAgVGhpcyB2ZXJzaW9uIG9mIHNob2NwcygpIHByb2R1Y2VzIGEgd2VpZ2h0ZWQgYXZlcmFnZSB0aGF0IHNvbWUKKyAgcGVvcGxlIGxpa2UsIGJ1dCBtb3N0IHBlb3BsZSBmaW5kIGl0IGRpc2NvbmNlcnRpbmcgYW5kIGJvbWJhcmQgdXMKKyAgd2l0aCBxdWVzdGlvbnMgYW5kIGNvbXBsYWludHMgYWJvdXQgd2h5IHRoZSBDUFMgZmlndXJlIGZsdWN0dWF0ZXMgc28KKyAgd2lsZGx5LiAgU28gbm93IHlvdSBvbmx5IGdldCB0aGUgd2VpZ2h0ZWQgYXZlcmFnZSBpZiB5b3UgYnVpbGQgdGhlCisgIHByb2dyYW0geW91cnNlbGYgd2l0aCBDUFNfV0VJR0hURUQgZGVmaW5lZC4KKyovCisjaWZuZGVmIENQU19WSU5DRQorI2lmZGVmIEdGVElNRVIKKyAgICAgICAgICAgIGNwcyA9IChsb25nKSgoKChDS0ZMT0FUKW9sZGNwcyAqIDMuMCkgKworICAgICAgICAgICAgICAgICAgIChDS0ZMT0FUKShmZmMgLSBvbGRmZmMpIC8gKGd0di1vbGRndHYpICkgLyA0LjApOworI2Vsc2UKKyAgICAgICAgICAgIGNwcyA9ICggKG9sZGNwcyAqIDMpICsgKGZmYyAtIG9sZGZmYykgLyAoZ3R2LW9sZGd0dikgKSAvIDQ7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworI2Vsc2UKKy8qIEFuZCBhbiBhbHRlcm5hdGUgd2VpZ2h0aW5nIHNjaGVtZSBmcm9tIFZpbmNlbnQgRmF0aWNhLi4uICovCisgICAgICAgICAgICBjcHMgPSAoMyAqCisgICAgICAgICAgICAgKCgxK3BjdC8zMDApKm9sZGZmYy9vbGRndHYrKDEtcGN0LzEwMCkqKGZmYy1vbGRmZmMpLyhndHYtb2xkZ3R2KSkpCisgICAgICAgICAgICAgIC8gNDsKKyNlbmRpZiAvKiBDUFNfVklOQ0UgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5vIHdlaWdodGVkIGF2ZXJhZ2Ugc2luY2UgdGhlcmUgaXMgbm90aGluZyB0byB3ZWlnaCAqLworI2lmZGVmIEdGVElNRVIKKyAgICAgICAgICAgIGNwcyA9IChsb25nKShndHYgIT0gMC4wID8KKyAgICAgICAgICAgICAgKENLRkxPQVQpKGZmYyAtIG9sZGZmYykgLyAoZ3R2IC0gb2xkZ3R2KSA6CisgICAgICAgICAgICAgICAgKGZmYyAtIG9sZGZmYykpIDsKKyNlbHNlCisgICAgICAgICAgICBjcHMgPSBndHYgPyAoZmZjIC0gb2xkZmZjKSAvIChndHYgLSBvbGRndHYpIDogKGZmYyAtIG9sZGZmYykgOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKyAgICAgICAgfQorI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoZGVibG9nKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJTSE9DUFM6IHBjdCAgICIsIiIscGN0KTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIlNIT0NQUzogZ3R2ICAgIiwiIixndHYpOworICAgICAgICAgICAgZGVidWcoRjEwMSwiU0hPQ1BTOiBvbGRndHYiLCIiLG9sZGd0dik7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJTSE9DUFM6IGRndHYgICIsIiIsKGxvbmcpKGd0di1vbGRndHYpKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsIlNIT0NQUzogZmZjICAgIiwiIixmZmMpOworICAgICAgICAgICAgZGVidWcoRjEwMSwiU0hPQ1BTOiBvbGRmZmMiLCIiLG9sZGZmYyk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJTSE9DUFM6IGRmZmMgICIsIiIsZmZjLW9sZGZmYyk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJTSE9DUFM6IGNwcyAgICIsIiIsY3BzKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBtb3ZlKENXX0NQLDIyKTsKKyAgICAgICAgcHJpbnR3KCIlbGQiLCBjcHMpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0NQLCAobG9uZykgY3BzICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICBjbHJ0b2VvbCgpOworICAgICAgICBvbGRmZmMgPSBmZmM7CisgICAgfQorI2Vsc2UgLyogIUNQU19XRUlHSFRFRCAqLworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBERUJVRworICAgIGlmIChkZWJsb2cpIHsKKwlkZWJ1ZyhGMTAwLCJTSE9DUFM6IE5PVCBXRUlHSFRFRCIsIiIsMCk7CisgICAgICAgIGRlYnVnKEYxMDEsIlNIT0NQUzogcGN0ICAgICIsIiIscGN0KTsKKyAgICAgICAgZGVidWcoRjEwMSwiU0hPQ1BTOiBndHYgICAgIiwiIixndHYpOworICAgICAgICBkZWJ1ZyhGMTAxLCJTSE9DUFM6IG9sZGd0diAiLCIiLG9sZGd0dik7CisgICAgICAgIGRlYnVnKEYxMDEsIlNIT0NQUzogZGd0diAgICIsIiIsKGxvbmcpZ3R2IC0gKGxvbmcpb2xkZ3R2KTsKKyAgICAgICAgZGVidWcoRjEwMSwiU0hPQ1BTOiBmZmMgICAgIiwiIixmZmMpOworICAgICAgICBkZWJ1ZyhGMTAxLCJTSE9DUFM6IG9sZGZmYyAiLCIiLG9sZGZmYyk7CisgICAgICAgIGRlYnVnKEYxMDEsIlNIT0NQUzogZGZmYyAgICIsIiIsZmZjLW9sZGZmYyk7CisgICAgICAgIGRlYnVnKEYxMDEsIlNIT0NQUzogY3BzICAgICIsIiIsY3BzKTsKKyAgICAgICAgZGVidWcoRjEwMSwiU0hPQ1BTOiBmaWxjbnQgIiwiIixmaWxjbnQpOworI2lmZGVmIEdGVElNRVIKKyAgICAgICAgZGVidWcoRjEwMSwiU0hPQ1BTOiBmcGZzZWNzIiwiIixmcGZzZWNzKTsKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgfQorICAgIGRlYnVnKEYxMDEsInNob2NwcyBndHYiLCIiLGd0dik7CisjZW5kaWYgLyogREVCVUcgKi8KKyNpZmRlZiBHRlRJTUVSCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIC8qIGRlYnVnKEYxMDEsInNob2NwcyBmcGZzZWNzIiwiIixmcGZzZWNzKTsgKi8KKyAgICBzZWNzID0gZ3R2IC0gZnBmc2VjczsKKyAgICAvKiBkZWJ1ZyhGMTAxLCJzaG9jcHMgc2VjcyIsIiIsKGxvbmcpc2Vjcyk7ICovCisgICAgaWYgKHNlY3MgPiAwLjApIHsKKyAgICAgICAgY3BzID0gKGxvbmcpKChDS0ZMT0FUKSBmZmMgLyBzZWNzKTsKKyAgICAgICAgLyogZGVidWcoRjEwMSwic2hvY3BzIGNwcyIsIiIsY3BzKTsgKi8KKyAgICAgICAgbW92ZShDV19DUCwyMik7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfQ1AsIChsb25nKSBjcHMgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgIHByaW50dygiJWxkIiwgY3BzKTsKKyAgICAgICAgY2xydG9lb2woKTsKKyAgICB9CisjZWxzZSAgLyogTm90IEdGVElNRVIgKi8KKyAgICBpZiAoKHNlY3MgPSBndHYgLSBmc2VjcykgPiAwKSB7CisgICAgICAgIGNwcyA9IChzZWNzIDwgMUwpID8gZmZjIDogZmZjIC8gc2VjczsKKyAgICAgICAgbW92ZShDV19DUCwyMik7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfQ1AsIChsb25nKSBjcHMgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgIHByaW50dygiJWxkIiwgY3BzKTsKKyAgICAgICAgY2xydG9lb2woKTsKKyAgICB9CisjZW5kaWYgLyogR0ZUSU1FUiAqLworI2VuZGlmIC8qIENQU19XRUlHSFRFRCAqLworCisgICAgaWYgKGNwcyA+IHBlYWtjcHMgJiYgICAgICAgICAgICAgICAgLyogUGVhayB0cmFuc2ZlciByYXRlICovCisgICAgICAgICgod2hhdCAmIFdfU0VORCAmJiBzcGFja2V0cyA+IHdzbG90cyArIDQpIHx8CisJICghKHdoYXQgJiBXX1NFTkQpICYmIHNwYWNrZXRzID4gMTApKSkgeworICAgICAgICBwZWFrY3BzID0gY3BzOworICAgIH0KKyAgICBvbGRfdHIgPSBzaG9ldGwob2xkX3RyLCBjcHMsIGZzaXosIGhvd2Zhcik7CisgICAgcmV0dXJuKGNwcyk7Cit9CisKK3N0YXRpYworI2lmZGVmIENLX0FOU0lDICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJlY2F1c2UgVk9JRCB1c2VkIGJ5IGN1cnNlcy5oICovCit2b2lkCisjZWxzZQorI2lmZGVmIE1ZQ1VSU0VTCitWT0lECisjZWxzZQoraW50CisjZW5kaWYgLyogTVlDVVJTRVMgKi8KKyNlbmRpZiAvKiBDS19BTlNJQyAqLworc2NyZnQoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc3BsYXkgZmlsZSB0eXBlICovCisgICAgY2hhciB4ZmVyc3RyWzI1Nl07CisgICAgeGZlcnN0clswXSA9IE5VTDsKKyAgICBpZiAoYmluYXJ5KSB7CisgICAgICAgIHN3aXRjaChiaW5hcnkpIHsKKyAgICAgICAgICBjYXNlIFhZRlRfTDoKKyAgICAgICAgICAgIGNrc3RybmNweSh4ZmVyc3RyLCJMQUJFTEVEIiwyNTYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBYWUZUX0k6CisgICAgICAgICAgICBja3N0cm5jcHkoeGZlcnN0ciwiSU1BR0UiLDI1Nik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFhZRlRfVToKKyAgICAgICAgICAgIGNrc3RybmNweSh4ZmVyc3RyLCJCSU5BUlkgVU5ERUZJTkVEIiwyNTYpOworICAgICAgICAgICAgYnJlYWs7CisJICBjYXNlIFhZRlRfTToKKyAgICAgICAgICAgIGNrc3RybmNweSh4ZmVyc3RyLCJNQUNCSU5BUlkiLDI1Nik7CisgICAgICAgICAgICBicmVhazsKKwkgIGNhc2UgWFlGVF9YOgorICAgICAgICAgICAgY2tzdHJuY3B5KHhmZXJzdHIsIlRFTkVYIiwyNTYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjYXNlIFhZRlRfQjoKKyAgICAgICAgICAgIGNrc3RybmNweSh4ZmVyc3RyLCJCSU5BUlkiLDI1Nik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2lmZGVmIENLX1JFU0VORAorICAgICAgICBpZiAod2hhdCAmIFdfU0VORCAmJiBzZW5kc3RhcnQgPiAwTCkgeworICAgICAgICAgICAgaWYgKHNlbmRtb2RlID09IFNNX1BTRU5EKSB7CisgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHhmZXJzdHIsICIgLyBwYXJ0aWFsIiwgMjU2KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VuZG1vZGUgPT0gU01fUkVTRU5EKSB7CisgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHhmZXJzdHIsICIgLyByZXNlbmQiLCAyNTYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHdoYXQgJiBXX1JFQ1YgJiYgcnNfbGVuID4gMEwpIHsKKyAgICAgICAgICAgIGNrc3RybmNhdCh4ZmVyc3RyLCAiIC8gcmVzZW5kIiwgMjU2KTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENLX1JFU0VORCAqLworICAgIH0gZWxzZSB7CisKKyNpZm5kZWYgTk9DU0VUUworICAgICAgICBja3N0cm5jcHkoeGZlcnN0ciwiVEVYVCIsMjU2KTsKKyNpZmRlZiBORVdGVFAKKyNpZm5kZWYgTk9VTklDT0RFCisJaWYgKHdoYXQgJiBXX0ZUUCkgeworCSAgICBpZiAoZnRwX2NzeCA8IDApCisJICAgICAgY2tzdHJuY2F0KHhmZXJzdHIsIiAobm8gdHJhbnNsYXRpb24pIiwgMjU2KTsKKwkgICAgZWxzZQorCSAgICAgIGNrbWFreG1zZygmeGZlcnN0cls0XSwyNTIsCisJCSAgICAgICAiICgiLAorCQkgICAgICAgZmNzaW5mb1sod2hhdCAmIFdfU0VORCkgPyBmdHBfY3NsIDogZnRwX2NzeF0ua2V5d29yZCwKKwkJICAgICAgICIgPT4gIiwKKwkJICAgICAgIGZjc2luZm9bKHdoYXQgJiBXX1NFTkQpID8gZnRwX2NzeCA6IGZ0cF9jc2xdLmtleXdvcmQsCisJCSAgICAgICAiKSIsCisJCSAgICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMCisJCSAgICAgICApOworCX0gZWxzZQorI2VuZGlmIC8qIE5PVU5JQ09ERSAqLworI2VuZGlmIC8qIE5FV0ZUUCAqLworCSAgaWYgKHRjaGFyc2V0ID09IFRDX1RSQU5TUCkgeworICAgICAgICAgICAgY2tzdHJuY2F0KHhmZXJzdHIsICIgKG5vIHRyYW5zbGF0aW9uKSIsIDI1Nik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAod2hhdCAmIFdfU0VORCkgeworICAgICAgICAgICAgICAgIHNwcmludGYoICZ4ZmVyc3RyW3N0cmxlbih4ZmVyc3RyKV0sIC8qIHNhZmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICIgKCVzID0+ICVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBmY3NpbmZvW2ZjaGFyc2V0XS5rZXl3b3JkLCAvKiBidWlsdC1pbiBrZXl3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGNzaW5mb1t0Y2hhcnNldF0ua2V5d29yZCAgLyogbGVuZ3RocyBhcmUgY29udHJvbGxlZCAqLworCQkJKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3ByaW50ZiggJnhmZXJzdHJbc3RybGVuKHhmZXJzdHIpXSwgLyogc2FmZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIiAoJXMgPT4gJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjc2luZm9bdGNoYXJzZXRdLmtleXdvcmQsIC8qIGJ1aWx0LWluIGtleXdvcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICBmY3NpbmZvW2ZjaGFyc2V0XS5rZXl3b3JkKTsgLyogbGVuZ3RocyBjb250cm9sbGVkICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBOT0NTRVRTICovCisgICAgfQorICAgIG1vdmUoQ1dfVFlQLDIyKTsKKyAgICBwcmludHcoIiVzIiwgeGZlcnN0cik7CisgICAgY2xydG9lb2woKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX1RZUCwgKGxvbmcpIHhmZXJzdHIgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgcmV0dXJuOworfQorCisjaWZkZWYgQ0tfTkVXVEVSTQorc3RhdGljIEZJTEUgKmNrX3N0ZG91dCA9IE5VTEw7CitzdGF0aWMgaW50IGNrX2ZkID0gLTE7CisjZW5kaWYgLyogQ0tfTkVXVEVSTSAqLworCitzdGF0aWMgbG9uZyBwY3QgPSAwTCwgb2xkcGN0ID0gMEwsIG9sZHJ0dCA9IC0xTDsKK3N0YXRpYyBpbnQgb2xkdHlwID0gMCwgb2xkd2luID0gLTEsIG9sZHRyeSA9IC0xLCBvbGRsZW4gPSAtMSwgb2xkdGltID0gLTE7CisKKyNpZmRlZiBORVRDT05OCitzdGF0aWMgY2hhciAqbmV0bmFtZVtdID0geworICAgICJub25lIiwJCQkJLyogMDAgKi8KKyAgICAiVENQL0lQIiwJCQkJLyogMDEgVENQIChTb2NrZXRzKSAqLworICAgICJUQ1AvSVAiLAkJCQkvKiAwMiBUQ1AgKFN0cmVhbXMpICovCisgICAgIlguMjUiLAkJCQkvKiAwMyBTdW5MaW5rIFguMjQgICovCisgICAgIkRFQ25ldCIsCQkJCS8qIDA0IERFQ25ldCAgKi8KKyAgICAiVkFYIFBTSSIsCQkJCS8qIDA1IFZBWCBQU0kgKi8KKyAgICAiTmFtZWQgUGlwZXMiLAkJCS8qIDA2IExBTiBNYW5hZ2VyIE5hbWVkIFBpcGUgKi8KKyAgICAiWC4yNSIsCQkJCS8qIDA3IFN0cmF0dXMgVk9TIFguMjUgKi8KKyAgICAiTmV0QklPUyIsCQkJCS8qIDA4IElCTSBORVRCSU9TICovCisgICAgIlN1cGVyTEFUIiwJCQkJLyogMDcgTWVyaWRpYW4gU3VwZXJMQVQgKi8KKyAgICAiRmlsZSIsCQkJCS8qIDEwIEZpbGUgKi8KKyAgICAiQ29tbWFuZCIsCQkJCS8qIDExIFN1YnByb2Nlc3MgKHBpcGUpICovCisgICAgIkRMTCIsCQkJCS8qIDEyIERMTCBkb2VzIGkvbyAqLworICAgICJYLjI1IiwJCQkJLyogMTMgSUJNIEFJWExpbmsgWC4yNSAqLworICAgICJYLjI1IiwJCQkJLyogMTQgSFAtVVggWC4yNSAqLworICAgICJQVFkiLAkJCQkvKiAxNSBQc2V1ZG90ZXJtaW5hbCAqLworICAgICJTU0giLAkJCQkvKiAxNiBTU0ggKi8KKyAgICAiPEVSUk9SPiIsCQkJCS8qIDE3IEluIGNhc2UgbmV3IHR5cGVzIGFyZSBhZGRlZCAqLworICAgICI8RVJST1I+IiwJCQkJLyogMTggYnV0IG5vYm9keSByZW1lbWJlcnMgdG8gdXBkYXRlICovCisgICAgIjxFUlJPUj4iLAkJCQkvKiAxOSB0aGlzIHRhYmxlIC4uLiAqLworICAgIE5VTEwJCQkJLyogMjAgKi8KK307CitzdGF0aWMgaW50IG5uZXRuYW1lID0gKHNpemVvZihuZXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsKKworI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmZGVmIENLX0FOU0lDCit2b2lkCitzY3JlZW5jKGludCBmLCBjaGFyIGMsbG9uZyBuLGNoYXIgKnMpCisjZWxzZQorI2lmZGVmIE1ZQ1VSU0VTCitWT0lECisjZWxzZQoraW50CisjZW5kaWYgLyogTVlDVVJTRVMgKi8KK3NjcmVlbmMoZixjLG4scykKK2ludCBmOyAgICAgICAgICAvKiBhcmd1bWVudCBkZXNjcmlwdG9yICovCitjaGFyIGM7ICAgICAgICAgLyogYSBjaGFyYWN0ZXIgb3Igc21hbGwgaW50ZWdlciAqLworbG9uZyBuOyAgICAgICAgIC8qIGEgbG9uZyBpbnRlZ2VyICovCitjaGFyICpzOyAgICAgICAgLyogYSBzdHJpbmcgKi8KKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogc2NyZWVuYygpICovIHsKKyNpZmRlZiBDS19TU0wKKyAgICBleHRlcm4gaW50IHRsc19hY3RpdmVfZmxhZywgc3NsX2FjdGl2ZV9mbGFnOworI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIFJMT0dDT0RFCisgICAgZXh0ZXJuIGludCB0dG5wcm90bzsKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworICAgIHN0YXRpYyBpbnQgcSA9IDA7CisgICAgc3RhdGljIGxvbmcgZnNpeiA9IC0xTDsgICAvKiBDb3B5IG9mIGZpbGUgc2l6ZSAqLworICAgIHN0YXRpYyBsb25nIGZjbnQgPSAwTDsgICAgLyogTnVtYmVyIG9mIGZpbGVzIHRyYW5zZmVycmVkICovCisgICAgc3RhdGljIGxvbmcgZmJ5dCA9IDBMOyAgICAvKiBUb3RhbCBmaWxlIGJ5dGVzIG9mIGFsbCBmaWxlcyB0cmFuc2ZlcnJlZCAqLworICAgIHN0YXRpYyBsb25nIGhvd2ZhciA9IDBMOyAgLyogSG93IG11Y2ggb2YgY3VycmVudCBmaWxlIGhhcyBiZWVuIHhmZXInZC4gKi8KKyAgICBzdGF0aWMgaW50ICBwY3RsYmwgPSAwTDsgIC8qIFBlcmNlbnQgZG9uZSB2cyBCeXRlcyBzbyBmYXIgKi8KKyAgICBsb25nIGNwcyA9IDBMOworCisgICAgaW50IG5ldCA9IDA7CisgICAgaW50IHhuZXQgPSAwOworICAgIGludCBmdHAgPSAwOworICAgIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBzdHJpbmcgKi8KKyAgICBpbnQgZXJyb3JzID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBFcnJvciBjb3VudGVyICovCisgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29ya2VyICovCisKKyAgICBkZWJ1ZyhGMTAxLCJzY3JlZW5jIGNpbml0IiwiIixjaW5pdCk7CisgICAgZGVidWcoRjEwMSwic2NyZWVuYyBjZW5kdyIsIiIsY2VuZHcpOworCisgICAgaWYgKCFzKSBzID0gIiI7ICAgICAgICAgICAgICAgICAgICAgLyogQWx3YXlzIGRvIHRoaXMuICovCisKKyAgICBmdHAgPSAod2hhdCAmIFdfRlRQKSA/IDEgOiAwOwkvKiBGVFAgb3IgS2VybWl0ICovCisgICAgbmV0ID0gbmV0d29yayB8fCBmdHA7CisgICAgeG5ldCA9IGZ0cCA/IDEgOiBuZXR0eXBlOwkJLyogTkVUX1RDUEIgPT0gMSAqLworCisgICAgaWYgKGNpbml0ID09IDAgfHwgY2VuZHcgPiAwKSB7ICAgICAgLyogSGFuZGxlIGJvcmRlcmxpbmUgY2FzZXMuLi4gKi8KKyAgICAgICAgaWYgKGYgPT0gU0NSX0NXKSB7ICAgICAgICAgICAgICAvKiBDbG9zZSB3aW5kb3csIGJ1dCBpdCdzIG5vdCBvcGVuICovCisgICAgICAgICAgICBmdF93aW4gPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTEsInNjcmVlbmMgQSIscyxmKTsKKyAgICAgICAgaWYgKGYgPT0gU0NSX0VNIHx8CisgICAgICAgICAgIChmID09IFNDUl9QVCAmJiBjID09ICdFJykpIHsgLyogRmF0YWwgZXJyb3IgYmVmb3JlIHdpbmRvdyBvcGVuICovCisgICAgICAgICAgICBjb25vbGwoIiIpOyBjb25vYygnPycpOyBjb25vbGwocyk7IHJldHVybjsgLyogUmVndWxhciBkaXNwbGF5ICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNpbml0ID09IDApIHsgICAgICAgICAgICAgICAgICAgLyogT25seSBjYWxsIGluaXRzY3IoKSBvbmNlICovCisJY2hhciAqIHM7CisJLyogQ2hlY2sgdGhlc2Ugbm93IC0tIGlmIHRoZXkgYXJlIGRlZmluZWQgYnV0IG5vdCBudW1lcmljICovCisJLyogdGhleSBjYW4gY3Jhc2ggY3Vyc2VzICovCisJcyA9IGdldGVudigiTElORVMiKTsKKwlpZiAocykgaWYgKCFyZGlnaXRzKHMpKSB7CisJICAgIHByaW50ZigiP0xJTkVTIHZhcmlhYmxlIG5vdCBudW1lcmljOiBcIiVzXCIuXG4iLHMpOworCSAgICBwcmludGYoIihGdWxsc2NyZWVuIGRpc3BsYXkgZGlzYWJsZWQpXG4iKTsKKwkgICAgZmRpc3BsYSA9IFhZRkRfUzsKKwkgICAgcmV0dXJuOworCX0KKwlzID0gZ2V0ZW52KCJDT0xVTU5TIik7CisJaWYgKHMpIGlmICghcmRpZ2l0cyhzKSkgeworCSAgICBwcmludGYoIj9DT0xVTU5TIHZhcmlhYmxlIG5vdCBudW1lcmljOiBcIiVzXCIuXG4iLHMpOworCSAgICBwcmludGYoIihGdWxsc2NyZWVuIGRpc3BsYXkgZGlzYWJsZWQpXG4iKTsKKwkgICAgZmRpc3BsYSA9IFhZRkRfUzsKKwkgICAgcmV0dXJuOworCX0KKyAgICAgICAgY2VuZHcgPSAxOyAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgd2luZG93IG5lZWRzIHJlcGFpbnRpbmcgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgIGlmICghaW5pdHNjcigpKSB7ICAgICAgICAgICAgICAgLyogT29wcywgY2FuJ3QgaW5pdGlhbGl6ZSB3aW5kb3c/ICovCisvKgorICBJbiBmYWN0LCB0aGlzIGRvZXNuJ3QgaGFwcGVuLiAgIm1hbiBjdXJzZXMiIHNheXMgaW5pdHNjcigpIGhhbHRzIHRoZQorICBlbnRpcmUgcHJvZ3JhbSBpZiBpdCBmYWlscywgd2hpY2ggaXMgdHJ1ZSBvbiB0aGUgc3lzdGVtcyB3aGVyZSBJJ3ZlCisgIHRlc3RlZCBpdC4gIEl0IHdpbGwgZmFpbCBpZiB5b3VyIHRlcm1pbmFsIHR5cGUgaXMgbm90IGtub3duIHRvIGl0LgorICBUaGF0J3Mgd2h5IFNFVCBGSUxFIERJU1BMQVkgRlVMTFNDUkVFTiBjYWxscyB0Z2V0ZW50KCkgdG8gbWFrZSBzdXJlIHRoZQorICB0ZXJtaW5hbCB0eXBlIGlzIGtub3duIGJlZm9yZSBhbGxvd2luZyBhIGN1cnNlcyBkaXNwbGF5LgorKi8KKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJDVVJTRVMgSU5JVFNDUiBFUlJPUlxyXG4iKTsKKyAgICAgICAgICAgIGZkaXNwbGEgPSBYWUZEX1M7ICAgICAgICAgICAvKiBGYWxsIGJhY2sgdG8gQ1JUIGRpc3BsYXkgKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNpbml0Kys7ICAgICAgICAgICAgICAgICAgICAvKiBXaW5kb3cgaW5pdGlhbGl6ZWQgb2sgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDAsIkNVUlNFUyBJTklUU0NSIE9LIiwiIiwwKTsKKyAgICAgICAgfQorI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgc29tZSBtZW1vcnkuICovCisjaWZkZWYgQ0tfTkVXVEVSTQorICAgICAgICAvKiAoRnJvbSBBbmR5IEZ5ZmUgPGFuZHlAdmxzaS5jcy5jYWx0ZWNoLmVkdT4pCisgICAgICAgICAgIFN5c3RlbSBWIGN1cnNlcyBzZWVtcyB0byByZXNlcnZlIHRoZSByaWdodCB0byBhbHRlciB0aGUgYnVmZmVyaW5nCisgICAgICAgICAgIG9uIHRoZSBvdXRwdXQgRklMRSogd2l0aG91dCByZXN0b3JpbmcgaXQuICBGb3J0dW5hdGVseSBTeXN0ZW0gVgorICAgICAgICAgICBjdXJzZXMgcHJvdmlkZXMgbmV3dGVybSgpLCBhbiBhbHRlcm5hdGl2ZSB0byBpbml0c2NyKCksIHRoYXQKKyAgICAgICAgICAgYWxsb3dzIHVzIHRvIHNwZWNpZnkgZXhwbGljaXRseSB0aGUgdGVybWluYWwgdHlwZSBhbmQgaW5wdXQgYW5kCisgICAgICAgICAgIG91dHB1dCBGSUxFIHBvaW50ZXJzLiAgVGh1cyB3ZSBkdXBsaWNhdGUgc3Rkb3V0LCBhbmQgbGV0IGN1cnNlcworICAgICAgICAgICBoYXZlIHRoZSBjb3B5LiAgVGhlIG9yaWdpbmFsIHJlbWFpbnMgdW5hbHRlcmVkLiAgVW5mb3J0dW5hdGVseSwKKyAgICAgICAgICAgbmV3dGVybSgpIHNlZW1zIHRvIGJlIHBhcnRpY3VsYXIgdG8gU3lzdGVtIFYuCisgICAgICAgICovCisgICAgICAgIHMgPSBnZXRlbnYoIlRFUk0iKTsKKyAgICAgICAgaWYgKGNrX2ZkIDwgMCkgeworICAgICAgICAgICAgY2tfZmQgPSBkdXAoZmlsZW5vKHN0ZG91dCkpOworICAgICAgICAgICAgY2tfc3Rkb3V0ID0gKGNrX2ZkID49IDApID8gKEZJTEUgKilmZG9wZW4oY2tfZmQsICJ3IikgOiBOVUxMOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMDAsInNjcmVlbmMgbmV3dGVybS4uLiIsIiIsMCk7CisKKy8qIE5PVEU6IEl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBkbyB0aGlzIHdpdGggc3RkaW4gdG9vISAqLworLyogVGhpcyB3b3VsZCBoYXZlIGJlZW4gdGhlIGNhc2UgaW4gRnJlZUJTRCA0LjEgYnV0IHRoZXkgZml4ZWQgdGhlICovCisvKiBwcm9ibGVtIGJ5IHJlc3RvcmluZyB0aGUgYnVmZmVyaW5nIG9mIHN0ZGluIGJlZm9yZSB0aGUgZmluYWwgcmVsZWFzZS4gKi8KKy8qIChCdXQgVC5FLiBEaWNrZXkgc2F5cyBzdGRpbiBpcyBub3QgYnVmZmVyZWQ/KSAqLworCisgICAgICAgIGlmIChja19zdGRvdXQgPT0gTlVMTCB8fCBuZXd0ZXJtKHMsIGNrX3N0ZG91dCwgc3RkaW4pID09IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAiRnVsbHNjcmVlbiBkaXNwbGF5IG5vdCBzdXBwb3J0ZWQgZm9yIHRlcm1pbmFsIHR5cGU6ICVzXHJcbiIscyk7CisgICAgICAgICAgICBmZGlzcGxhID0gWFlGRF9TOyAgICAgICAgICAgLyogVXNlIENSVCBpbnN0ZWFkICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZGVidWcoRjEwMCwic2NyZWVuYyBuZXd0ZXJtIG9rIiwiIiwwKTsKKyNlbHNlCisgICAgICAgIGRlYnVnKEYxMDAsInNjcmVlbiBjYWxsaW5nIGluaXRzY3IiLCIiLDApOworICAgICAgICBpbml0c2NyKCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgY3Vyc2VzLiAqLworICAgICAgICBkZWJ1ZyhGMTAwLCJzY3JlZW4gaW5pdHNjciBvayIsIiIsMCk7CisjZW5kaWYgLyogQ0tfTkVXVEVSTSAqLworICAgICAgICBjaW5pdCsrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIGN1cnNlcyB3YXMgaW5pdGlhbGl6ZWQuICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIH0KKyAgICBmdF93aW4gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaW5kb3cgaXMgb3BlbiAqLworICAgIGlmIChyZXBhaW50KSB7CisjaWZkZWYgQ0tfV1JFRlJFU0gKKy8qCisgIFRoaXMgdG90YWxseSByZXBhaW50cyB0aGUgc2NyZWVuLCBqdXN0IHdoYXQgd2Ugd2FudCwgYnV0IHdlIGNhbiBvbmx5CisgIGRvIHRoaXMgd2l0aCByZWFsIGN1cnNlcywgYW5kIHRoZW4gb25seSBpZiBjbGVhcm9rKCkgYW5kIHdyZWZyZXNoKCkgYXJlCisgIHByb3ZpZGVkIGluIHRoZSBjdXJzZXMgbGlicmFyeS4KKyovCisjaWZkZWYgT1MyCisgICAgICAgIFJlc3RvcmVDbWRNb2RlKCk7CisjZWxzZQorI2lmZGVmIFFOWAorI2lmbmRlZiBRTlgxNgorICAgICAgICBjbGVhcm9rKHN0ZHNjciwgMSk7ICAgICAgICAgICAgIC8qIFFOWCBkb2Vzbid0IGhhdmUgY3Vyc2NyICovCisjZW5kaWYgLyogUU5YMTYgKi8KKyAgICAgICAgd3JlZnJlc2goc3Rkc2NyKTsKKyNlbHNlCisgICAgICAgIHdyZWZyZXNoKGN1cnNjcik7CisjZW5kaWYgLyogUU5YICovCisjZW5kaWYgLyogT1MyICovCisjZWxzZSAgLyogTm8gQ0tfV1JFRlJFU0ggKi8KKy8qCisgIEtlcm1pdCdzIGRvLWl0LXlvdXJzZWxmIG1ldGhvZCwgd29ya3Mgd2l0aCBhbGwgdHlwZXMgb2YgZnVsbHNjcmVlbgorICBzdXBwb3J0LCBidXQgZG9lcyBub3QgcmVwYWludCBhbGwgdGhlIGZpZWxkcy4gIEZvciBleGFtcGxlLCB0aGUgZmlsZW5hbWUKKyAgaXMgbG9zdCwgYmVjYXVzZSBpdCBhcnJpdmVzIGF0IGEgY2VydGFpbiB0aW1lIGFuZCBuZXZlciBjb21lcyBhZ2FpbiwgYW5kCisgIEtlcm1pdCBwcmVzZW50bHkgZG9lcyBub3Qgc2F2ZSBpdCBhbnl3aGVyZS4gIE1ha2luZyB0aGlzIG1ldGhvZCB3b3JrIGZvcgorICBhbGwgZmllbGRzIHdvdWxkIGJlIGEgcmF0aGVyIG1ham9yIHJlY29kaW5nIHRhc2ssIGR1cGxpY2F0aW5nIHdoYXQgY3Vyc2VzCisgIGFscmVhZHkgZG9lcywgYW5kIHdvdWxkIGFkZCBhIGxvdCBvZiBjb21wbGV4aXR5IGFuZCBzdG9yYWdlIHNwYWNlLgorKi8KKyAgICAgICAgY2VuZHcgPSAxOworI2VuZGlmIC8qIENLX1dSRUZSRVNIICovCisgICAgICAgIHJlcGFpbnQgPSAwOworICAgIH0KKyAgICBpZiAoY2VuZHcpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmR3aW4oKSB3YXMgY2FsbGVkIHByZXZpb3VzbHkgKi8KKyNpZmRlZiBWTVMKKyAgICAgICAgaW5pdHNjcigpOyAgICAgICAgICAgICAgICAgICAgICAvKiAob3Igc2hvdWxkIGhhdmUgYmVlbiEpICovCisgICAgICAgIGNsZWFyKCk7CisgICAgICAgIHRvdWNod2luKHN0ZHNjcik7CisgICAgICAgIHJlZnJlc2goKTsKKyNlbHNlCisjaWZkZWYgUU5YCisvKgorICBJbiBRTlgsIGlmIHdlIGRvbid0IGNhbGwgaW5pdHNjcigpIGhlcmUgd2UgY29yZSBkdW1wLgorICBJIGRvbid0IGhhdmUgYW55IFFOWCBjdXJzZXMgZG9jdW1lbnRhdGlvbiwgYnV0IG90aGVyIGN1cnNlcyBtYW51YWxzCisgIHNheSB0aGF0IGluaXRzY3IoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgYXBwbGljYXRpb24sIGFuZAorICBleHBlcmllbmNlIHNob3dzIHRoYXQgb24gb3RoZXIgc3lzdGVtcywgY2FsbGluZyBpbml0c2NyKCkgaGVyZSBnZW5lcmFsbHkKKyAgcmVzdWx0cyBpbiBhIGNvcmUgZHVtcC4KKyovCisgICAgICAgIGRlYnVnKEYxMDAsInNjcmVlbmMgcmUtY2FsbGluZyBpbml0c2NyIFFOWCIsIiIsMCk7CisgICAgICAgIGluaXRzY3IoKTsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgcmVmcmVzaCgpOworI2lmZGVmIENPTU1FTlQKKy8qCisgIEJ1dCBldmVuIHNvLCBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgY3Vyc2VzIGRpc3BsYXlzIGFyZSBtZXNzZWQgdXAuCisgIENhbGxpbmcgdG91Y2h3aW4sIHJlZnJlc2gsIGV0YywgZG9lc24ndCBtYWtlIGFueSBkaWZmZXJlbmNlLgorKi8KKyAgICAgICAgZGVidWcoRjEwMCwic2NyZWVuYyBjYWxsaW5nIHRvdWNod2luIFFOWCIsIiIsMCk7CisgICAgICAgIHRvdWNod2luKHN0ZHNjcik7CisgICAgICAgIGRlYnVnKEYxMDAsInNjcmVlbmMgY2FsbGluZyByZWZyZXNoIFFOWCIsIiIsMCk7CisgICAgICAgIHJlZnJlc2goKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyNlbHNlIC8qIEFsbCBvdGhlcnMuLi4gKi8KKyAgICAgICAgZGVidWcoRjEwMCwic2NyZWVuYyBjYWxsaW5nIGNsZWFyIiwiIiwwKTsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgZGVidWcoRjEwMCwic2NyZWVuYyBjbGVhciBvayIsIiIsMCk7CisjZW5kaWYgLyogUU5YICovCisjZW5kaWYgLyogVk1TICovCisgICAgICAgIGRlYnVnKEYxMDAsInNjcmVlbmMgc2V0dXAgb2siLCIiLDApOworICAgICAgICBkZWJ1ZyhGMTAwLCJzY3JlZW5jIGRvaW5nIGZpcnN0IG1vdmUiLCIiLDApOworICAgICAgICBtb3ZlKENXX0JBTiwwKTsgICAgICAgICAgICAgICAgIC8qIERpc3BsYXkgdGhlIGJhbm5lciAqLworICAgICAgICBkZWJ1ZyhGMTEwLCJzY3JlZW5jIG15aG9zdCIsbXlob3N0LDApOworI2lmZGVmIFRDUFNPQ0tFVAorICAgICAgICBkZWJ1ZyhGMTEwLCJzY3JlZW5jIG15aXBhZGRyIixteWlwYWRkciwwKTsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNpZmRlZiBIUFVYMTAxMAorICAgICAgICBkZWJ1ZyhGMTAwLCJzY3JlZW5jIGNhbGxpbmcgZmlyc3QgcHJpbnR3Li4uIiwiIiwwKTsKKy8qIFJpZ2h0IGhlcmUgaXMgd2hlcmUgSFAtVVggMTAuMTAgbGlieGN1cnNlLjEgUmV2IDc2LjIwIGhhbmdzLi4uICovCisjZW5kaWYgLyogSFBVWDEwMTAgKi8KKyAgICAgICAgaWYgKG15aG9zdFswXSkgeworI2lmZGVmIFRDUFNPQ0tFVAorICAgICAgICAgICAgaWYgKCFteWlwYWRkclswXQorI2lmZGVmIE9TMgorICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHBlcmZvcm0gdGhpcyB0ZXN0IGJlY2F1c2Ugb24gbm9uLVRDUC9JUCAqLworICAgICAgICAgICAgICAgICAvKiBzeXN0ZW1zIHRoZSBjYWxsIHRvIGdldGxvY2FsaXBhZGRyKCkgcmVzdWx0cyBpbiBhICAqLworICAgICAgICAgICAgICAgICAvKiBETlMgTG9va3VwIHdoaWNoIHRha2VzIHNldmVyYWwgbWludXRlcyB0byB0aW1lIG91dCAqLworICAgICAgICAgICAgICAgICAmJiBuZXQgJiYKKyAgICAgICAgICAgICAgICAgKHhuZXQgPT0gTkVUX1RDUEEgfHwgeG5ldCA9PSBORVRfVENQQgorI2lmZGVmIFNTSEJVSUxUSU4KKyAgICAgICAgICAgICAgICAgIHx8IHhuZXQgPT0gTkVUX1NTSAorI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKyAgICAgICAgICAgICAgICAgICkKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICBnZXRsb2NhbGlwYWRkcigpOworICAgICAgICAgICAgaWYgKG15aXBhZGRyWzBdICYmIHN0cmNtcCgoY2hhciAqKW15aG9zdCwoY2hhciAqKW15aXBhZGRyKSkKKyAgICAgICAgICAgICAgcHJpbnR3KCIlcywgJXMgWyVzXSIsdmVyc2lvLChjaGFyICopbXlob3N0LChjaGFyICopbXlpcGFkZHIpOworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworICAgICAgICAgICAgICBwcmludHcoIiVzLCAlcyIsdmVyc2lvLChjaGFyICopbXlob3N0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50dygiJXMiLHZlcnNpbyk7CisgICAgICAgIH0KKyNpZmRlZiBIUFVYMTAxMAorICAgICAgICBkZWJ1ZyhGMTAwLCJzY3JlZW5jIGZpcnN0IHByaW50dyByZXR1cm5zIiwiIiwwKTsKKyNlbmRpZiAvKiBIUFVYMTAxMCAqLworICAgICAgICBtb3ZlKENXX0RJUiwzKTsKKyAgICAgICAgcHJpbnR3KCJDdXJyZW50IERpcmVjdG9yeTogJXMiLHpndGRpcigpKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19ESVIsIChsb25nKSB6Z3RkaXIoKSApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgaWYgKG5ldCkgeworICAgICAgICAgICAgbW92ZShDV19MSU4sOCk7CisgICAgICAgICAgICBwcmludHcoIk5ldHdvcmsgSG9zdDogJXMiLAorI2lmZGVmIE5FV0ZUUAorCQkgICBmdHAgPyAoZnRwX2hvc3QgPyBmdHBfaG9zdCA6ICIodW5rbm93bikiKSA6CisjZW5kaWYgLyogTkVXRlRQICovCisJCSAgIHR0bmFtZQorCQkgICApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbW92ZShDV19MSU4sMCk7CisgICAgICAgICAgICBwcmludHcoIkNvbW11bmljYXRpb24gRGV2aWNlOiAlcyIsdHRuYW1lKTsKKyAgICAgICAgfQorI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0xJTiwgKGxvbmcpIHR0bmFtZSApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKworICAgICAgICBpZiAobmV0KSB7CisgICAgICAgICAgICBtb3ZlKENXX1NQRCw4KTsKKyAgICAgICAgICAgIHByaW50dygiTmV0d29yayBUeXBlOiAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vdmUoQ1dfU1BELDEpOworICAgICAgICAgICAgcHJpbnR3KCJDb21tdW5pY2F0aW9uIFNwZWVkOiAiKTsKKyAgICAgICAgfQorICAgICAgICBtb3ZlKENXX1NQRCwyMik7ICAgICAgICAgICAgICAgIC8qIFNlcmlhbCBzcGVlZCBvciBuZXR3b3JrIHR5cGUgKi8KKyAgICAgICAgaWYgKG5ldCkgeworI2lmZGVmIE5FVENPTk4KKwkgICAgaW50IHNlY3VyZSA9IDA7CisJICAgIGNoYXIgKiB4bmFtZTsKKwkgICAgaWYgKHhuZXQgPiBubmV0bmFtZSkKKwkgICAgICB4bmFtZSA9ICJbRVJST1JdIjsKKwkgICAgZWxzZQorCSAgICAgIHhuYW1lID0gbmV0bmFtZVt4bmV0XTsKKyNpZmRlZiBORVdGVFAKKyAgICAgICAgICAgIGlmIChmdHApIHsKKwkJaWYgKGZ0cGlzc2VjdXJlKCkpCisJCSAgc2VjdXJlID0gMTsKKwkgICAgfSBlbHNlCisjZW5kaWYgLyogTkVXRlRQICovCisJICAgICAgaWYgKDAKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICAgICAgICAgICAgfHwgSVNfU1NIKCkKKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgICAgIHx8IGNrX3RuX2VuY3J5cHRpbmcoKSAmJiBja190bl9kZWNyeXB0aW5nKCkKKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICAgICAgfHwgdGxzX2FjdGl2ZV9mbGFnIHx8IHNzbF9hY3RpdmVfZmxhZworI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIFJMT0dDT0RFCisjaWZkZWYgQ0tfS0VSQkVST1MKKyNpZmRlZiBDS19FTkNSWVBUSU9OCisgICAgICAgICAgICAgICAgfHwgdHRucHJvdG8gPT0gTlBfRUs0TE9HSU4gfHwgdHRucHJvdG8gPT0gTlBfRUs1TE9HSU4KKyNlbmRpZiAvKiBDS19FTkNSWVBUSU9OICovCisjZW5kaWYgLyogQ0tfS0VSQkVST1MgKi8KKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworICAgICAgICAgICAgICAgICApIHsKKwkJc2VjdXJlID0gMTsKKwkgICAgfQorCSAgICBpZiAoc2VjdXJlKSB7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlszMF07CisgICAgICAgICAgICAgICAgc3ByaW50ZihidWYsIiVzIChTRUNVUkUpIix4bmFtZSk7CisgICAgICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX1NQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgYnVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgICAgICAgICAgcHJpbnR3KCIlcyAoU0VDVVJFKSIseG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludHcoIiVzIix4bmFtZSk7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfU1BELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSB4bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIHByaW50dygiKG5ldHdvcmspIik7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX1NQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSAiKG5ldHdvcmspIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHNwZWVkIDwgMEwpCisgICAgICAgICAgICAgIHNwZWVkID0gdHRnc3BkKCk7CisgICAgICAgICAgICBpZiAoc3BlZWQgPiAwTCkgeworICAgICAgICAgICAgICAgIGlmIChzcGVlZCA9PSA4ODgwKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50dygiNzUvMTIwMCIpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfU1BELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgIjc1LzEyMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgc3BlZWRidWZbNjRdIDsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzcGVlZGJ1ZiwgIiVsZCIsIHNwZWVkKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnR3KCIlcyIsc3BlZWRidWYpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfU1BELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgc3BlZWRidWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludHcoInVua25vd24iKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBDV19TUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpICIodW5rbm93bikiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbW92ZShDV19QQVIsMTQpOworICAgICAgICBwcmludHcoIlBhcml0eTogJXMiLGZ0cCA/ICJub25lIiA6IHBhcm5hbSgoY2hhcilwYXJpdHkpKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX1BBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIHBhcm5hbSgoY2hhcilwYXJpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworI2lmZGVmIENLX1RJTUVSUworICAgICAgICBpZiAoLyogcnR0ZmxnICYmICovIHByb3RvY29sID09IFBST1RPX0spIHsKKyAgICAgICAgICAgIG1vdmUoQ1dfVE1PLCA5KTsgcHJpbnR3KCJSVFQvVGltZW91dDoiKTsgfQorI2VuZGlmIC8qIENLX1RJTUVSUyAqLworICAgICAgICBtb3ZlKENXX1RZUCwxMSk7IHByaW50dygiRmlsZSBUeXBlOiIpOworICAgICAgICBtb3ZlKENXX1NJWiwxMSk7IHByaW50dygiRmlsZSBTaXplOiIpOworICAgICAgICBtb3ZlKENXX1BDRCwgOCk7CisgICAgICAgIGNscnRvZW9sKCk7CisgICAgICAgIHBjdGxibCA9ICh3aGF0ICYgV19TRU5EKTsKKyAgICAgICAgcHJpbnR3KCIlczoiLCBwY3RsYmwgPyAiUGVyY2VudCBEb25lIiA6ICJCeXRlcyBTbyBGYXIiKTsKKworI2lmZGVmIFhZWl9JTlRFUk5BTAorICAgICAgICBtb3ZlKENXX0JBUiwgMSk7CisgICAgICAgIHByaW50dygiJTEwcyBQcm90b2NvbDoiLCBmdHAgPyAiRlRQIiA6IHB0YWJbcHJvdG9jb2xdLnBfbmFtZSk7CisjZW5kaWYgLyogWFlaX0lOVEVSTkFMICovCisjaWZkZWYgQ0tfUENUX0JBUgorICAgICAgICBpZiAodGhlcm1vbWV0ZXIpIHsKKyAgICAgICAgICAgIG9sZHBjdCA9IHBjdCA9IDA7CisgICAgICAgICAgICBtb3ZlKENXX0JBUiwyMik7CisgICAgICAgICAgICBwcmludHcoIiAgICAuLi4xMC4uLjIwLi4uMzAuLi40MC4uLjUwLi4uNjAuLi43MC4uLjgwLi4uOTAuLjEwMCIpOworICAgICAgICAgICAgbW92ZShDV19CQVIsMjIrNTYpOworICAgICAgICB9CisjZW5kaWYgLyogQ0tfUENUX0JBUiAqLworICAgICAgICBtb3ZlKENXX1RSLCAgMSk7IHByaW50dygiRXN0aW1hdGVkIFRpbWUgTGVmdDoiKTsKKyAgICAgICAgbW92ZShDV19DUCwgIDIpOyBwcmludHcoIlRyYW5zZmVyIFJhdGUsIENQUzoiKTsKKyAgICAgICAgbW92ZShDV19XUywgIDgpOyBwcmludHcoIldpbmRvdyBTbG90czolcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocHJvdG9jb2wgPT0gUFJPVE9fSykgJiYgIWZ0cCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiA6ICIgTi9BIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBtb3ZlKENXX1BULCAgOSk7IHByaW50dygiUGFja2V0IFR5cGU6Iik7CisgICAgICAgIGlmIChmdHAgfHwgcHJvdG9jb2wgIT0gUFJPVE9fSykgeworCSAgICBtb3ZlKENXX1BULDIyKTsKKyAgICAgICAgICAgIHByaW50dygiJXMiLCAiTi9BIik7CisgICAgICAgICAgICBtb3ZlKENXX1BDLCAgMTEpOyBwcmludHcoIkkvTyBDb3VudDoiKTsKKyAgICAgICAgICAgIG1vdmUoQ1dfUEwsICAxMCk7IHByaW50dygiSS9PIExlbmd0aDoiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vdmUoQ1dfUEMsICA4KTsgcHJpbnR3KCJQYWNrZXQgQ291bnQ6Iik7CisgICAgICAgICAgICBtb3ZlKENXX1BMLCAgNyk7IHByaW50dygiUGFja2V0IExlbmd0aDoiKTsKKyAgICAgICAgfQorI2lmbmRlZiBDT01NRU5UCisgICAgICAgIG1vdmUoQ1dfUFIsICA5KTsgcHJpbnR3KCJFcnJvciBDb3VudDoiKTsKKyNlbHNlCisgICAgICAgIG1vdmUoQ1dfUFIsICAyKTsgcHJpbnR3KCJQYWNrZXQgUmV0cnkgQ291bnQ6Iik7CisjZW5kaWYKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIG1vdmUoQ1dfUEIsICAyKTsgcHJpbnR3KCJQYWNrZXQgQmxvY2sgQ2hlY2s6Iik7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBtb3ZlKENXX0VSUiwxMCk7IHByaW50dygiTGFzdCBFcnJvcjoiKTsKKyAgICAgICAgbW92ZShDV19NU0csIDgpOyBwcmludHcoIkxhc3QgTWVzc2FnZToiKTsKKwlpZiAoeGZybXNnKSB7CisJICAgIG1vdmUoQ1dfTVNHLCAyMik7IHByaW50dygiJXMiLHhmcm1zZyk7CisJICAgIG1ha2VzdHIoJnhmcm1zZyxOVUxMKTsKKwl9CisgICAgICAgIG1vdmUoQ1dfSU5ULCAwKTsKKyAgICAgICAgaWYgKCF4ZnJpbnQpIHsKKyAgICAgICAgICAgIHByaW50dygiKFRyYW5zZmVyIGludGVycnVwdGlvbiBpcyBkaXNhYmxlZCkiKTsKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBDS19ORUVEX1NJRworICAgICAgICAgICAgcHJpbnR3KAorIjwlcz5YIHRvIGNhbmNlbCBmaWxlLCA8JXM+WiB0byBjYW5jZWwgZ3JvdXAsIDwlcz48Q1I+IHRvIHJlc2VuZCBsYXN0IHBhY2tldCIsCisgICAgICAgICAgICAgICAgICAgZGJjaHIoZXNjYXBlKSwgZGJjaHIoZXNjYXBlKSwgZGJjaHIoZXNjYXBlKQorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBtb3ZlKENXX0lOVCArIDEsIDApOworICAgICAgICAgICAgcHJpbnR3KAorIjwlcz5FIHRvIHNlbmQgRXJyb3IgcGFja2V0LCBeQyB0byBxdWl0IGltbWVkaWF0ZWx5LCA8JXM+TCB0byByZWZyZXNoIHNjcmVlbi4iLAorICAgICAgICAgICAgICAgICAgIGRiY2hyKGVzY2FwZSksIGRiY2hyKGVzY2FwZSkKKyAgICAgICAgICAgICAgICAgICApOworI2Vsc2UgLyogIUNLX05FRURfU0lHICovCisgICAgICAgICAgICBtb3ZlKENXX0lOVCwgMCk7CisjaWZkZWYgT1MyCisgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gUFJPVE9fSykgeworICAgICAgICAgICAgICAgIHByaW50dygKKyJYIHRvIGNhbmNlbCBmaWxlLCBaIHRvIGNhbmNlbCBncm91cCwgPEVudGVyPiB0byByZXNlbmQgbGFzdCBwYWNrZXQsIgorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorI2Vsc2UgLyogIU9TMiAqLworI2lmZGVmIFZNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIFZNUyBhdm9pZCBib3R0b20gbGluZSAqLworICAgICAgICAgICAgcHJpbnR3KAorIlg6IENhbmNlbCB0aGlzIGZpbGU7IEU6IENhbmNlbCB0cmFuc2ZlcjsgXkM6IFF1aXQgbm93OyBeVzogUmVmcmVzaCBzY3JlZW4uIgorICAgICAgICAgICAgICAgICAgICk7CisjZWxzZQorICAgICAgICAgICAgcHJpbnR3KAorIlggdG8gY2FuY2VsIGZpbGUsIFogdG8gY2FuY2VsIGdyb3VwLCA8Q1I+IHRvIHJlc2VuZCBsYXN0IHBhY2tldCwiCisgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBWTVMKKyAgICAgICAgICAgIG1vdmUoQ1dfSU5UICsgMSwgMCk7CisgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gUFJPVE9fSykgeworICAgICAgICAgICAgICAgIHByaW50dygKKyJFIHRvIHNlbmQgRXJyb3IgcGFja2V0LCBeQyB0byBxdWl0IGltbWVkaWF0ZWx5LCBeTCB0byByZWZyZXNoIHNjcmVlbi4iCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50dygiXkMgdG8gY2FuY2VsIGZpbGUgdHJhbnNmZXIuIik7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogQ0tfTkVFRF9TSUcgKi8KKyAgICAgICAgfQorICAgICAgICByZWZyZXNoKCk7CisgICAgICAgIGNlbmR3ID0gMDsKKyAgICB9CisgICAgZGVidWcoRjEwMSwiU0NSRUVOQyBzd2l0Y2giLCIiLGYpOworICAgIGRlYnVnKEYwMDAsIlNDUkVFTkMgYyIsIiIsYyk7CisgICAgZGVidWcoRjEwMSwiU0NSRUVOQyBuIiwiIixuKTsKKworICAgIGxlbiA9IHN0cmxlbihzKTsgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBhcmd1bWVudCBzdHJpbmcgKi8KKyAgICBzd2l0Y2ggKGYpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgb3VyIGZ1bmN0aW9uIGNvZGUgKi8KKyAgICAgIGNhc2UgU0NSX0ZOOiAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlbmFtZSAqLworICAgICAgICBvbGRwY3QgPSBwY3QgPSAwTDsgICAgICAgICAgICAgIC8qIFJlc2V0IHBlcmNlbnRzICovCisjaWZkZWYgR0ZUSU1FUgorICAgICAgICBndHYgPSAoQ0tGTE9BVCkgLTEuMDsKKyAgICAgICAgLyogb2xkZ3R2ID0gKENLRkxPQVQpIC0xLjA7ICovCisjZWxzZQorICAgICAgICBndHYgPSAtMUw7CisgICAgICAgIC8qIG9sZGd0diA9IC0xTDsgKi8KKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgICAgIG9sZHdpbiA9IC0xOworICAgICAgICBmc2l6ID0gLTFMOyAgICAgICAgICAgICAgICAgICAgIC8qIEludmFsaWRhdGUgcHJldmlvdXMgZmlsZSBzaXplICovCisgICAgICAgIG1vdmUoQ1dfUENELDIyKTsgICAgICAgICAgICAgICAgLyogRXJhc2UgcGVyY2VudCBkb25lIGZyb20gbGFzdCB0aW1lICovCisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfUENELCAobG9uZykgMCApOworICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19GRkMsIChsb25nKSAwICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICBjbHJ0b2VvbCgpOworICAgICAgICBtb3ZlKENXX1NJWiwyMik7ICAgICAgICAgICAgICAgIC8qIEVyYXNlIGZpbGUgc2l6ZSBmcm9tIGxhc3QgdGltZSAqLworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX1NJWiwgKGxvbmcpIDAgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgIGNscnRvZW9sKCk7CisgICAgICAgIG1vdmUoQ1dfRVJSLDIyKTsgICAgICAgICAgICAgICAgLyogQW5kIGxhc3QgZXJyb3IgbWVzc2FnZSAqLworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0VSUiwgKGxvbmcpICIiICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICBjbHJ0b2VvbCgpOworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBTVFJFQU1JTkcKKyAgICAgICAgaWYgKHByb3RvY29sID09IFBST1RPX0sgJiYgc3RyZWFtb2spIHsKKyAgICAgICAgICAgIG1vdmUoQ1dfQkFSLCAxKTsKKyNpZmRlZiBYWVpfSU5URVJOQUwKKyAgICAgICAgICAgIHByaW50dygiICAgS2VybWl0IFNUUkVBTUlORzoiKTsKKyNlbHNlCisgICAgICAgICAgICBwcmludHcoIiAgICAgICAgICBTVFJFQU1JTkc6Iik7CisjZW5kaWYgLyogWFlaX0lOVEVSTkFMICovCisgICAgICAgIH0KKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAgICAgaWYgKHdoYXQgJiBXX1NFTkQpIHsJCS8qIElmIHdlJ3JlIHNlbmRpbmcuLi4gKi8KKyNpZmRlZiBORVdGVFAKKwkgICAgaWYgKHdoYXQgJiBXX0ZUUCkgewkJLyogRlRQICovCisgICAgICAgICAgICAgICAgbW92ZShDV19OQU0sMTMpOworICAgICAgICAgICAgICAgIHByaW50dygiRlRQIFBVVDoiKTsKKwkgICAgfSBlbHNlCisjZW5kaWYgLyogTkVXRlRQICovCisjaWZkZWYgQ0tfUkVTRU5ECisgICAgICAgICAgICBzd2l0Y2ggKHNlbmRtb2RlKSB7CQkvKiBLZXJtaXQgKi8KKyAgICAgICAgICAgICAgY2FzZSBTTV9SRVNFTkQ6CisgICAgICAgICAgICAgICAgbW92ZShDV19OQU0sMTEpOworICAgICAgICAgICAgICAgIHByaW50dygiUkVTRU5ESU5HOiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG1vdmUoQ1dfTkFNLDEzKTsKKyAgICAgICAgICAgICAgICBwcmludHcoIlNFTkRJTkc6Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgbW92ZShDV19OQU0sMTMpOworICAgICAgICAgICAgcHJpbnR3KCJTRU5ESU5HOiIpOworI2VuZGlmIC8qIENLX1JFU0VORCAqLworCisgICAgICAgIH0gZWxzZSBpZiAod2hhdCAmIFdfUkVDVikgewkvKiBJZiB3ZSdyZSByZWNlaXZpbmcuLi4gKi8KKyNpZmRlZiBORVdGVFAKKwkgICAgaWYgKHdoYXQgJiBXX0ZUUCkgewkJLyogRlRQICovCisgICAgICAgICAgICAgICAgbW92ZShDV19OQU0sMTMpOworICAgICAgICAgICAgICAgIHByaW50dygiRlRQIEdFVDoiKTsKKwkgICAgfSBlbHNlIHsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKwkJbW92ZShDV19OQU0sMTEpOworCQlwcmludHcoIlJFQ0VJVklORzoiKTsKKyNpZmRlZiBORVdGVFAKKwkgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gKFdfRlRQfFdfRlRfREVMRSkpIHsKKwkJbW92ZShDV19OQU0sMTApOworCQlwcmludHcoIkZUUCBERUxFVEU6Iik7CisjZW5kaWYgLyogTkVXRlRQICovCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgZG9uJ3Qga25vdy4uLiAqLworICAgICAgICAgICAgbW92ZShDV19OQU0sMTEpOyAgICAgICAgICAgIC8qIChzaG91bGQgbmV2ZXIgc2VlIHRoaXMpICovCisgICAgICAgICAgICBwcmludHcoIkZpbGUgTmFtZToiKTsKKyAgICAgICAgfQorICAgICAgICBtb3ZlKENXX05BTSwyMik7ICAgICAgICAgICAgICAgIC8qIERpc3BsYXkgdGhlIGZpbGVuYW1lICovCisgICAgICAgIGlmIChsZW4gPiA1NykgeworICAgICAgICAgICAgcHJpbnR3KCIlLjU1cy4uIixzKTsKKyAgICAgICAgICAgIGxlbiA9IDU3OworICAgICAgICB9IGVsc2UgcHJpbnR3KCIlcyIscyk7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfTkFNLCAobG9uZykgcyApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgcSA9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZW1lbWJlciBuYW1lIGxlbmd0aCBmb3IgbGF0ZXIgKi8KKyAgICAgICAgY2xydG9lb2woKTsKKyAgICAgICAgc2NyZnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNwbGF5IGZpbGUgdHlwZSAoY2FuIGNoYW5nZSkgKi8KKyAgICAgICAgcmVmcmVzaCgpOworI2lmZGVmIE9TMgorICAgICAgICBTYXZlQ21kTW9kZSgwLCAwKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIFNDUl9BTjogICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSBhcy1uYW1lICovCisgICAgICAgIGlmIChxICsgbGVuICsgNCA8IDU4KSB7ICAgICAgICAgLyogV2lsbCBmaXQgKi8KKyAgICAgICAgICAgIG1vdmUoQ1dfTkFNLCAyMiArIHEpOworICAgICAgICAgICAgcHJpbnR3KCIgPT4gJXMiLHMpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19OQU0sIChsb25nKSBzICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRvbyBsb25nICovCisgICAgICAgICAgICBtb3ZlKENXX05BTSwgMjIpOyAgICAgICAgICAgLyogT3ZlcndyaXRlIHByZXZpb3VzIG5hbWUgKi8KKyAgICAgICAgICAgIHEgPSAwOworICAgICAgICAgICAgaWYgKGxlbiArIDQgPiA1NykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdnMTUgKi8KKyAgICAgICAgICAgICAgICBwcmludHcoIiA9PiAlLjUxcy4uIixzKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZzE1ICovCisgICAgICAgICAgICAgICAgbGVuID0gNTM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2cxNSAqLworICAgICAgICAgICAgfSBlbHNlIHByaW50dygiID0+ICVzIixzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdnMTUgKi8KKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfTkFNLCAobG9uZykgcyAgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgIH0KKyAgICAgICAgcSArPSBsZW4gKyA0OyAgICAgICAgICAgICAgICAgICAvKiBSZW1lbWJlciBob3Jpem9udGFsIHBvc2l0aW9uICovCisgICAgICAgIGNscnRvZW9sKCk7CisgICAgICAgIHJlZnJlc2goKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgU2F2ZUNtZE1vZGUoMCwgMCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHJldHVybjsKKworICAgICAgY2FzZSBTQ1JfRlM6ICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgc2l6ZSAqLworICAgICAgICBmc2l6ID0gbjsKKyAgICAgICAgbW92ZShDV19TSVosMjIpOworICAgICAgICBpZiAoZnNpeiA+IC0xTCkgeworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19TSVosIChsb25nKSBuICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICAgICAgcHJpbnR3KCIlbGQiLG4pOworICAgICAgICB9CisgICAgICAgIGNscnRvZW9sKCk7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICBtb3ZlKENXX1BDRCwgOCk7CisgICAgICAgIGlmIChmc2l6ID4gLTFMKSB7ICAgICAgICAgICAgICAgLyogUHV0IHVwIHBlcmNlbnQgbGFiZWwgKi8KKyAgICAgICAgICAgIHBjdGxibCA9IDE7CisJICAgIGNscnRvZW9sKCk7CisgICAgICAgICAgICBwcmludHcoIlBlcmNlbnQgRG9uZToiKTsKKyAgICAgICAgfQorI2Vsc2UKKwltb3ZlKENXX1BDRCwgOCk7CisJY2xydG9lb2woKTsKKyAgICAgICAgaWYgKGZzaXogPiAtMUwpIHsgICAgICAgICAgICAgICAvKiBQdXQgdXAgcGVyY2VudCBsYWJlbCAqLworICAgICAgICAgICAgcGN0bGJsID0gMTsKKyAgICAgICAgICAgIHByaW50dygiUGVyY2VudCBEb25lOiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGN0bGJsID0gMDsKKyAgICAgICAgICAgIHByaW50dygiQnl0ZXMgU28gRmFyOiIpOworCX0KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIGNscnRvZW9sKCk7CisgICAgICAgIHNjcmZ0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSB0eXBlICovCisgICAgICAgIHJlZnJlc2goKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgU2F2ZUNtZE1vZGUoMCwgMCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHJldHVybjsKKworICAgICAgY2FzZSBTQ1JfUFQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIFBhY2tldCB0eXBlIG9yIHBzZXVkb3R5cGUgKi8KKyAgICAgICAgaWYgKHNwYWNrZXRzIDwgNSkgeworICAgICAgICAgICAgZXh0ZXJuIGludCBzeXNpbmRleDsKKyAgICAgICAgICAgIGV4dGVybiBzdHJ1Y3Qgc3lzZGF0YSBzeXNpZGxpc3RbXTsKKyAgICAgICAgICAgIC8qIFRoaW5ncyB0aGF0IHdvbid0IGNoYW5nZSBhZnRlciB0aGUgNHRoIHBhY2tldCAqLworICAgICAgICAgICAgbW92ZShDV19QQVIsMjIpOworICAgICAgICAgICAgcHJpbnR3KCIlcyIscGFybmFtKChjaGFyKXBhcml0eSkpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfUEFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIHBhcm5hbSgoY2hhcilwYXJpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgICAgIGNscnRvZW9sKCk7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgbW92ZShDV19QQiwgMjIpOyAgICAgICAgICAgIC8qIEJsb2NrIGNoZWNrIG9uIHRoaXMgcGFja2V0ICovCisgICAgICAgICAgICBpZiAoYmN0dSA9PSA0KQorICAgICAgICAgICAgICBwcmludHcoIkIiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnR3KCIlZCIsYmN0dSk7CisgICAgICAgICAgICBjbHJ0b2VvbCgpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIGlmICgKKyNpZmRlZiBORVdGVFAKKwkJKGZ0cCAmJiAoc3BhY2tldHMgPT0gMSB8fCBycGFja2V0cyA9PSAxKSkgfHwKKyNlbmRpZiAvKiBORVdGVFAgKi8KKwkJc3BhY2tldHMgPT0gNAorCQkpIHsKKyAgICAgICAgICAgICAgICBtb3ZlKENXX0xJTiw4KTsKKyAgICAgICAgICAgICAgICBpZiAoCisjaWZkZWYgTkVXRlRQCisJCSAgICBmdHAgfHwKKyNlbmRpZiAvKiBORVdGVFAgKi8KKwkJICAgICgocHJvdG9jb2wgPT0gUFJPVE9fSykgJiYgKHN5c2luZGV4ID4gLTEpKQorCQkgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUoQ1dfTElOLDgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnR3KCJOZXR3b3JrIEhvc3Q6ICVzICglcykiLAorI2lmZGVmIE5FV0ZUUAorCQkJICAgICAgIGZ0cCA/IChmdHBfaG9zdCA/IGZ0cF9ob3N0IDogIiIpIDoKKyNlbmRpZiAvKiBORVdGVFAgKi8KKwkJCSAgICAgICB0dG5hbWUsCisjaWZkZWYgTkVXRlRQCisJCQkgICAgICAgZnRwID8gZnRwX3NydnR5cCA6CisjZW5kaWYgLyogTkVXRlRQICovCisJCQkgICAgICAgc3lzaWRsaXN0W3N5c2luZGV4XS5zaWRfbmFtZQorCQkJICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlKENXX0xJTiwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50dygiQ29tbXVuaWNhdGlvbiBEZXZpY2U6ICVzIChyZW1vdGUgaG9zdCBpcyAlcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c2lkbGlzdFtzeXNpbmRleF0uc2lkX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjbHJ0b2VvbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmZGVmIENLX1RJTUVSUworICAgICAgICBpZiAoLyogcnR0ZmxnICYmICovIHByb3RvY29sID09IFBST1RPX0spIHsKKyAgICAgICAgICAgIGxvbmcgeHg7CisgICAgICAgICAgICBpZiAoCisjaWZkZWYgU1RSRUFNSU5HCisgICAgICAgICAgICAgICAgc3RyZWFtaW5nICYmIG9sZHdpbiAhPSAtMgorI2Vsc2UKKyAgICAgICAgICAgICAgICAwCisjZW5kaWYgLyogU1RSRUFNSU5HICovCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgbW92ZShDV19UTU8sIDIyKTsKKyAgICAgICAgICAgICAgICBwcmludHcoIjAwIC8gMDAiKTsKKyAgICAgICAgICAgICAgICBjbHJ0b2VvbCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB4eCA9IChydHRkZWxheSArIDUwMCkgLyAxMDAwOworICAgICAgICAgICAgICAgIGlmICh4eCAhPSBvbGRydHQgfHwgcmN2dGltbyAhPSBvbGR0aW0pIHsKKyAgICAgICAgICAgICAgICAgICAgbW92ZShDV19UTU8sIDIyKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnR3KCIlMDJsZCAvICUwMmQiLCB4eCwgcmN2dGltbyk7CisgICAgICAgICAgICAgICAgICAgIG9sZHJ0dCA9IHh4OworICAgICAgICAgICAgICAgICAgICBvbGR0aW0gPSByY3Z0aW1vOworICAgICAgICAgICAgICAgICAgICBjbHJ0b2VvbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIENLX1RJTUVSUyAqLworCisgICAgICAgIHggPSAod2hhdCAmIFdfUkVDVikgPyAgICAgICAgICAvKiBQYWNrZXQgbGVuZ3RoICovCisgICAgICAgICAgcnBrdGwrKHByb3RvY29sPT1QUk9UT19LPzE6MCkgOgorICAgICAgICAgICAgc3BrdGw7CisgICAgICAgIGlmICh4ICE9IG9sZGxlbikgeyAgICAgICAgICAgICAgLyogQnV0IG9ubHkgaWYgaXQgY2hhbmdlZC4gKi8KKyAgICAgICAgICAgIG1vdmUoQ1dfUEwsIDIyKTsKKyAgICAgICAgICAgIHByaW50dygiJWQiLHgpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19QTCwgKGxvbmcpIHggKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgICAgICBjbHJ0b2VvbCgpOworICAgICAgICAgICAgb2xkbGVuID0geDsKKyAgICAgICAgfQorICAgICAgICBtb3ZlKENXX1BDLCAyMik7ICAgICAgICAgICAgICAgIC8qIFBhY2tldCBjb3VudCAoYWx3YXlzKS4gKi8KKworICAgICAgICBwcmludHcoIiVkIiwgKHdoYXQgJiBXX1JFQ1YpID8gcnBhY2tldHMgOiBzcGFja2V0cyk7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfUEMsIChsb25nKSBzcGFja2V0cyApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgY2xydG9lb2woKTsKKworICAgICAgICBpZiAocHJvdG9jb2wgPT0gUFJPVE9fSyAmJiAhZnRwKSB7IC8qIFdpbmRvdyBzbG90cyAqLworICAgICAgICAgICAgY2hhciB3c1sxNl07CisgICAgICAgICAgICBpbnQgZmxhZzsKKyAgICAgICAgICAgIGZsYWcgPSAwOworI2lmZGVmIFNUUkVBTUlORworICAgICAgICAgICAgaWYgKHN0cmVhbWluZykgeworICAgICAgICAgICAgICAgIGlmIChvbGR3aW4gIT0gLTIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50Zih3cywiU1RSRUFNSU5HIik7CisgICAgICAgICAgICAgICAgICAgIGZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICBvbGR3aW4gPSAtMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvKiBTVFJFQU1JTkcgKi8KKyAgICAgICAgICAgICAgaWYgKHdjdXIgIT0gb2xkd2luKSB7CisgICAgICAgICAgICAgICAgICBzcHJpbnRmKHdzLCAiJWQgb2YgJWQiLCB3Y3VyIDwgMSA/IDEgOiB3Y3VyLCB3c2xvdG4pOworICAgICAgICAgICAgICAgICAgZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgICBvbGR3aW4gPSB3Y3VyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmxhZykgeworICAgICAgICAgICAgICAgIG1vdmUoQ1dfV1MsIDIyKTsKKyAgICAgICAgICAgICAgICBwcmludHcoIiVzIiwgd3MpOworICAgICAgICAgICAgICAgIGNscnRvZW9sKCk7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19XUywgKGxvbmcpIHdzICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVycm9ycyA9IHJldHJhbnMgKyBjcnVuY2hlZCArIHRpbWVvdXRzOworICAgICAgICBpZiAoZXJyb3JzICE9IG9sZHRyeSkgeyAgICAgICAgIC8qIFJldHJ5IGNvdW50LCBpZiBjaGFuZ2VkICovCisgICAgICAgICAgICBtb3ZlKENXX1BSLCAyMik7CisgICAgICAgICAgICBwcmludHcoIiVkIixlcnJvcnMpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19QUiwgKGxvbmcpIGVycm9ycyApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgICAgIGNscnRvZW9sKCk7CisgICAgICAgICAgICBvbGR0cnkgPSBlcnJvcnM7CisgICAgICAgIH0KKwkvKiBTZW5kZXIncyBwYWNrZXQgdHlwZSAqLworICAgICAgICBpZiAoIWZ0cCAmJiAoYyAhPSBvbGR0eXAgJiYgYyAhPSAnWScgJiYgYyAhPSAnTicpKSB7CisgICAgICAgICAgICBjaGFyIHR5cGVbMl07CisgICAgICAgICAgICBzcHJpbnRmKHR5cGUsICIlYyIsYyk7CisgICAgICAgICAgICBtb3ZlKENXX1BULDIyKTsKKyAgICAgICAgICAgIHByaW50dygiJXMiLCB0eXBlKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfUFQsIChsb25nKSB0eXBlICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICAgICAgY2xydG9lb2woKTsKKyAgICAgICAgICAgIG9sZHR5cCA9IGM7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjKSB7ICAgICAgICAgICAgICAgICAgICAvKiBOb3cgaGFuZGxlIHNwZWNpZmljIHBhY2tldCB0eXBlcyAqLworICAgICAgICAgIGNhc2UgJ1MnOiAgICAgICAgICAgICAgICAgICAgIC8qIEJlZ2lubmluZyBvZiB0cmFuc2ZlciAqLworICAgICAgICAgICAgZmNudCA9IGZieXQgPSAwTDsgICAgICAgICAgIC8qIENsZWFyIGNvdW50ZXJzICovCisjaWZkZWYgR0ZUSU1FUgorICAgICAgICAgICAgZ3R2ID0gLTEuMDsKKyNlbHNlIC8qIEdGVElNRVIgKi8KKyAgICAgICAgICAgIGd0diA9IC0xTDsgICAgICAgICAgICAgICAgICAvKiBBbmQgb2xkL25ldyB0aGluZ3MuLi4gKi8KKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgICAgICAgICBvbGRwY3QgPSBwY3QgPSAwTDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAnWic6ICAgICAgICAgICAgICAgICAgICAgLyogb3IgRU9GICovCisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJzY3JlZW5jIFNDUl9QVCBaIHBrdG51bSIsIiIsbik7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJzY3JlZW5jIFNDUl9QVCBaIG9sZHBjdCIsIiIsb2xkcGN0KTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsInNjcmVlbmMgU0NSX1BUIFogcGN0IiwiIixwY3QpOworICAgICAgICAgIGNhc2UgJ0QnOiAgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgcGFja2V0ICovCisgICAgICAgICAgICBpZiAoZnNpeiA+IDBMKSB7ICAgICAgICAgICAgLyogU2hvdyBwZXJjZW50IGRvbmUgaWYga25vd24gKi8KKyAgICAgICAgICAgICAgICBvbGRwY3QgPSBwY3Q7ICAgICAgICAgICAvKiBSZW1lbWJlciBwcmV2aW91cyBwZXJjZW50ICovCisgICAgICAgICAgICAgICAgaG93ZmFyID0gZmZjOworI2lmZGVmIENLX1JFU0VORAorICAgICAgICAgICAgICAgIGlmICh3aGF0ICYgV19TRU5EKQkvKiBBY2NvdW50IGZvciBQU0VORCBvciBSRVNFTkQgKi8KKyAgICAgICAgICAgICAgICAgIGhvd2ZhciArPSBzZW5kc3RhcnQ7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAod2hhdCAmIFdfUkVDVikKKyAgICAgICAgICAgICAgICAgIGhvd2ZhciArPSByc19sZW47CisjZW5kaWYgLyogQ0tfUkVTRU5EICovCisgICAgICAgICAgICAgICAgLyogUGVyY2VudCBkb25lLCB0byBiZSBkaXNwbGF5ZWQuLi4gKi8KKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnWicpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkaXNjYXJkICYmICFjeHNlZW4gJiYgIWN6c2VlbikgcGN0ID0gMTAwTDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgIHBjdCA9IChmc2l6ID4gOTlMKSA/IChob3dmYXIgLyAoZnNpeiAvIDEwMEwpKSA6IDBMOworICAgICAgICAgICAgICAgIGlmIChwY3QgPiAxMDBMIHx8ICAgICAgIC8qIEFsbG93IGZvciBleHBhbnNpb24gYW5kICovCisgICAgICAgICAgICAgICAgICAgKG9sZHBjdCA9PSA5OUwgJiYgcGN0IDwgMEwpKSAvKiBvdGhlciBib3VuZGFyeSBjb25kaXRpb25zICovCisgICAgICAgICAgICAgICAgICBwY3QgPSAxMDBMOworICAgICAgICAgICAgICAgIGlmIChwY3QgIT0gb2xkcGN0KSAgICAgIC8qIE9ubHkgZG8gdGhpcyAxMDAgdGltZXMgcGVyIGZpbGUgKi8KKyAgICAgICAgICAgICAgICAgIHVwZHBjdChvbGRwY3QsIHBjdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1vdmUoQ1dfUENELDIyKTsKKyAgICAgICAgICAgICAgICBwcmludHcoIiVsZCIsIGZmYyk7CisgICAgICAgICAgICB9CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfRkZDLCAobG9uZykgaG93ZmFyKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgICAgICBjcHMgPSBzaG9jcHMoKGludCkgcGN0LCBmc2l6LCBob3dmYXIpOworICAgICAgICAgICAgLyogb2xkX3RyID0gc2hvZXRsKG9sZF90ciwgY3BzLCBmc2l6LCBob3dmYXIpOyAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICclJzogICAgICAgICAgICAgICAgICAgICAvKiBUaW1lb3V0cywgcmV0cmFuc21pc3Npb25zICovCisgICAgICAgICAgICBjcHMgPSBzaG9jcHMoKGludCkgcGN0LCBmc2l6LCBob3dmYXIpOworICAgICAgICAgICAgLyogb2xkX3RyID0gc2hvZXRsKG9sZF90ciwgY3BzLCBmc2l6LCBob3dmYXIpOyAqLworCisgICAgICAgICAgICBlcnJvcnMgPSByZXRyYW5zICsgY3J1bmNoZWQgKyB0aW1lb3V0czsKKyAgICAgICAgICAgIGlmIChlcnJvcnMgIT0gb2xkdHJ5KSB7ICAgICAvKiBFcnJvciBjb3VudCwgaWYgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgIG1vdmUoQ1dfUFIsIDIyKTsKKyAgICAgICAgICAgICAgICBwcmludHcoIiVkIixlcnJvcnMpOworICAgICAgICAgICAgICAgIGNscnRvZW9sKCk7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfUFIsIChsb25nKSBlcnJvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2xkdHJ5ID0gZXJyb3JzOworICAgICAgICAgICAgICAgIGlmIChzKSBpZiAoKnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbW92ZShDV19FUlIsMjIpOworICAgICAgICAgICAgICAgICAgICBwcmludHcoIiVzIixzKTsKKyAgICAgICAgICAgICAgICAgICAgY2xydG9lb2woKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICAgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0VSUiwgKGxvbmcpIHMpOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAnRSc6ICAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IgcGFja2V0ICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgbW92ZShDV19FUlIsMjIpOyAgICAgICAgICAgIC8qIFByaW50IGl0cyBkYXRhIGZpZWxkICovCisgICAgICAgICAgICBpZiAoKnMpIHsKKyAgICAgICAgICAgICAgICBwcmludHcoIiVzIixzKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0VSUiwgKGxvbmcpIHMgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbHJ0b2VvbCgpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIGZjbnQgPSBmYnl0ID0gMEw7ICAgICAgICAgICAvKiBTbyBubyBieXRlcyBmb3IgdGhpcyBmaWxlICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdRJzogICAgICAgICAgICAgICAgICAgICAvKiBDcnVuY2hlZCBwYWNrZXQgKi8KKyAgICAgICAgICAgIGNwcyA9IHNob2NwcygoaW50KSBwY3QsIGZzaXosIGhvd2Zhcik7CisgICAgICAgICAgICAvKiBvbGRfdHIgPSBzaG9ldGwob2xkX3RyLCBjcHMsIGZzaXosIGhvd2Zhcik7ICovCisgICAgICAgICAgICBtb3ZlKENXX0VSUiwyMik7CisgICAgICAgICAgICBwcmludHcoIkRhbWFnZWQgUGFja2V0Iik7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX0VSUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSAiRGFtYWdlZCBQYWNrZXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgICAgIGNscnRvZW9sKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdxJzogICAgICAgICAgICAgICAgICAgICAvKiBDdHJsLUMgb3IgY29ubmVjdGlvbiBsb3N0ICovCisgICAgICAgICAgICBtb3ZlKENXX01TRywyMik7CisJICAgIGNscnRvZW9sKCk7CisgICAgICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgICAgIHByaW50dygqcyA/IHMgOiAiVXNlciBpbnRlcnJ1cHRpb24gb3IgY29ubmVjdGlvbiBsb3N0Iik7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX01TRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBzCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ1QnOiAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVvdXQgKi8KKyAgICAgICAgICAgIGNwcyA9IHNob2NwcygoaW50KSBwY3QsIGZzaXosIGhvd2Zhcik7CisgICAgICAgICAgICAvKiBvbGRfdHIgPSBzaG9ldGwob2xkX3RyLCBjcHMsIGZzaXosIGhvd2Zhcik7ICovCisgICAgICAgICAgICBtb3ZlKENXX0VSUiwyMik7CisgICAgICAgICAgICBwcmludHcoIlRpbWVvdXQgJWQgc2VjIixyY3Z0aW1vKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfRVJSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpICJUaW1lb3V0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgICAgICBjbHJ0b2VvbCgpOworICAgICAgICAgICAgZXJyb3JzID0gcmV0cmFucyArIGNydW5jaGVkICsgdGltZW91dHM7CisgICAgICAgICAgICBpZiAoZXJyb3JzICE9IG9sZHRyeSkgeyAgICAgLyogRXJyb3IgY291bnQsIGlmIGNoYW5nZWQgKi8KKyAgICAgICAgICAgICAgICBtb3ZlKENXX1BSLCAyMik7CisgICAgICAgICAgICAgICAgcHJpbnR3KCIlZCIsZXJyb3JzKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBDV19QUiwgKGxvbmcpIGVycm9ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICAgICAgICAgIGNscnRvZW9sKCk7CisgICAgICAgICAgICAgICAgb2xkdHJ5ID0gZXJyb3JzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJzLCBkbyBub3RoaW5nICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZWZyZXNoKCk7CisjaWZkZWYgT1MyCisgICAgICAgIFNhdmVDbWRNb2RlKDAsIDApOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICByZXR1cm47CisKKyAgICAgIGNhc2UgU0NSX1NUOiAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIHRyYW5zZmVyIHN0YXR1cyAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJzY3JlZW5jIFNDUl9TVCBjIiwiIixjKTsKKyAgICAgICAgZGVidWcoRjEwMSwic2NyZWVuYyBTQ1JfU1Qgc3VjY2VzcyIsIiIsc3VjY2Vzcyk7CisgICAgICAgIGRlYnVnKEYxMDEsInNjcmVlbmMgU0NSX1NUIGN4c2VlbiIsIiIsY3hzZWVuKTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIG1vdmUoQ1dfUENELDIyKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHBlcmNlbnQgZG9uZSAqLworICAgICAgICBpZiAoYyA9PSBTVF9PSykgeyAgICAgICAgICAgICAgIC8qIE9LLCBwcmludCAxMDAgJSAqLworICAgICAgICAgICAgaWYgKHBjdGxibCkKKyAgICAgICAgICAgICAgdXBkcGN0KG9sZHBjdCwxMDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwcmludHcoIiVsZCIsIGZmYyk7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfRkZDLCAobG9uZykgZmZjKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgICAgICBwY3QgPSAxMDA7CisgICAgICAgICAgICBvbGRwY3QgPSAwOworICAgICAgICB9IGVsc2UgaWYgKGZzaXogPiAwTCkgICAgICAgICAgIC8qIE5vdCBPSywgdXBkYXRlIGZpbmFsIHBlcmNlbnQgKi8KKy8qCisgIFRoZSBlbHNlIHBhcnQgd3JpdGVzIGFsbCBvdmVyIHRoZSBzY3JlZW4gLS0gaG93ZmFyIGFuZC9vciBmc2l6IGhhdmUKKyAgYmVlbiByZXNldCBhcyBhIGNvbnNlcXVlbmNlIG9mIHRoZSBub3QtT0tuZXNzIG9mIHRoZSB0cmFuc2Zlci4KKyovCisgICAgICAgICAgaWYgKHBjdGxibCkKKyAgICAgICAgICAgIHVwZHBjdChvbGRwY3QsIChob3dmYXIgKiAxMDBMKSAvIGZzaXopOworICAgICAgICBjbHJ0b2VvbCgpOworI2Vsc2UKKyAgICAgICAgaWYgKGMgPT0gU1RfT0spIHsgICAgICAgICAgICAgICAvKiBPSywgcHJpbnQgMTAwICUgKi8KKyAgICAgICAgICAgIG1vdmUoQ1dfUENELDIyKTsgICAgICAgICAgICAvKiBVcGRhdGUgcGVyY2VudCBkb25lICovCisgICAgICAgICAgICBpZiAocGN0bGJsKSB7CisJCWlmIChvbGRwY3QgPT0gMCkJLyogU3dpdGNoaW5nIGZyb20gImJ5dGVzIHNvIGZhciIgKi8KKwkJICBjbHJ0b2VvbCgpOwkJLyogdG8gInBlcmNlbnQgZG9uZSIuLi4gKi8KKwkJdXBkcGN0KG9sZHBjdCwxMDApOworCSAgICB9IGVsc2UKKyAgICAgICAgICAgICAgcHJpbnR3KCIlbGQiLCBmZmMpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0ZGQywgKGxvbmcpIGZmYyk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIHBjdCA9IDEwMDsKKyAgICAgICAgICAgIG9sZHBjdCA9IDA7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgY2xydG9lb2woKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmZGVmIENPTU1FTlQKKy8qIE5vLCBsZWF2ZSBpdCB0aGVyZSBzbyB0aGV5IGNhbiByZWFkIGl0ICovCisgICAgICAgIG1vdmUoQ1dfTVNHLDIyKTsgICAgICAgICAgICAgICAgLyogUmVtb3ZlIGFueSBwcmV2aW91cyBtZXNzYWdlICovCisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfTVNHLCAobG9uZykgIiIgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgIGNscnRvZW9sKCk7IHJlZnJlc2goKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisKKyAgICAgICAgbW92ZShDV19UUiwgMjIpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX1RSLCAobG9uZykgIiIgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgIGNscnRvZW9sKCk7IHJlZnJlc2goKTsKKworICAgICAgICBzd2l0Y2ggKGMpIHsgICAgICAgICAgICAgICAgICAgIC8qIFByaW50IG5ldyBzdGF0dXMgbWVzc2FnZSAqLworICAgICAgICAgIGNhc2UgU1RfT0s6ICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zZmVyIE9LICovCisgICAgICAgICAgICBmY250Kys7ICAgICAgICAgICAgICAgICAgICAgLyogQ291bnQgdGhpcyBmaWxlICovCisJICAgIGlmICh3aGF0ID09IChXX0ZUUHxXX0ZUX0RFTEUpKSB7CisJCW1vdmUoQ1dfTVNHLDIyKTsKKwkJY2xydG9lb2woKTsKKwkJcHJpbnR3KCJEZWxldGUgT0siKTsKKwkgICAgfSBlbHNlIHsKKwkJZmJ5dCArPSBmZmM7CisJCW1vdmUoQ1dfTVNHLDIyKTsKKwkJY2xydG9lb2woKTsKKwkJcHJpbnR3KCJUcmFuc2ZlciBPSyIpOworCSAgICB9CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX01TRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSAiVHJhbnNmZXIgT0siCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgICAgIGNscnRvZW9sKCk7IHJlZnJlc2goKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgU1RfRElTQzogICAgICAgICAgICAgICAgIC8qIERpc2NhcmRlZCAqLworICAgICAgICAgICAgbW92ZShDV19FUlIsMjIpOworICAgICAgICAgICAgcHJpbnR3KCJGaWxlIGRpc2NhcmRlZCIpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBDV19FUlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgIkZpbGUgZGlzY2FyZGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgcGN0ID0gb2xkcGN0ID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICBjbHJ0b2VvbCgpOyByZWZyZXNoKCk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIFNUX0lOVDogICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHRlZCAqLworICAgICAgICAgICAgbW92ZShDV19FUlIsMjIpOworICAgICAgICAgICAgcHJpbnR3KCJUcmFuc2ZlciBpbnRlcnJ1cHRlZCIpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBDV19FUlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgIlRyYW5zZmVyIGludGVycnVwdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgcGN0ID0gb2xkcGN0ID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICBjbHJ0b2VvbCgpOyByZWZyZXNoKCk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIFNUX1NLSVA6ICAgICAgICAgICAgICAgICAvKiBTa2lwcGVkICovCisgICAgICAgICAgICBtb3ZlKENXX0VSUiwyMik7CisJICAgIGlmIChuID4gMCAmJiBuIDwgbnNrcmVhc29uKQorCSAgICAgIHByaW50dygiRmlsZSBza2lwcGVkICglcykiLHNrcmVhc29uW25dKTsKKwkgICAgZWxzZQorCSAgICAgIHByaW50dygiRmlsZSBza2lwcGVkIik7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX0VSUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSAiRmlsZSBza2lwcGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgcGN0ID0gb2xkcGN0ID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICBjbHJ0b2VvbCgpOyByZWZyZXNoKCk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIFNUX0VSUjogICAgICAgICAgICAgICAgICAvKiBFcnJvciBtZXNzYWdlICovCisgICAgICAgICAgICBtb3ZlKENXX0VSUiwyMik7CisgICAgICAgICAgICBpZiAoIXMpIHMgPSAoY2hhciAqKWVwa3Rtc2c7CisgICAgICAgICAgICBwcmludHcoIiVzIixzKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfRVJSLCAobG9uZykgcyApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICBwY3QgPSBvbGRwY3QgPSAwOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIGNscnRvZW9sKCk7IHJlZnJlc2goKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgU1RfUkVGVTogICAgICAgICAgICAgICAgIC8qIFJlZnVzZWQgKi8KKyAgICAgICAgICAgIG1vdmUoQ1dfRVJSLDIyKTsKKyAgICAgICAgICAgIGlmICgqcykgeworICAgICAgICAgICAgICAgIGNoYXIgZXJyYnVmWzY0XSA7CisgICAgICAgICAgICAgICAgc3ByaW50ZiggZXJyYnVmLCAiUmVmdXNlZCwgJXMiLCBzICkgOworICAgICAgICAgICAgICAgIHByaW50dygiJXMiLCBlcnJidWYpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsKGxvbmcpIENXX0VSUiwobG9uZykgZXJyYnVmKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50dygiUmVmdXNlZCIpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsKGxvbmcpQ1dfRVJSLChsb25nKSJSZWZ1c2VkIik7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICAgICAgfQorI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIHBjdCA9IG9sZHBjdCA9IDA7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgY2xydG9lb2woKTsgcmVmcmVzaCgpOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgY2FzZSBTVF9JTkM6CisgICAgICAgICAgICBtb3ZlKENXX0VSUiwyMik7CisgICAgICAgICAgICBwcmludHcoIkluY29tcGxldGUiKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsKGxvbmcpQ1dfRVJSLChsb25nKSJJbmNvbXBsZXRlIik7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICAgIHBjdCA9IG9sZHBjdCA9IDA7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgICAgY2xydG9lb2woKTsgcmVmcmVzaCgpOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgY2FzZSBTVF9NU0c6CisgICAgICAgICAgICBtb3ZlKENXX01TRywyMik7CisgICAgICAgICAgICBwcmludHcoIiVzIixzKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsKGxvbmcpQ1dfTVNHLChsb25nKXMpOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgICAgIGNscnRvZW9sKCk7IHJlZnJlc2goKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIEJhZCBjYWxsICovCisgICAgICAgICAgICBtb3ZlKENXX0VSUiwyMik7CisgICAgICAgICAgICBwcmludHcoIioqKiBzY3JlZW4oKSBjYWxsZWQgd2l0aCBiYWQgc3RhdHVzICoqKiIpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19FUlIsCisgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSAiKioqIHNjcmVlbigpIGNhbGxlZCB3aXRoIGJhZCBzdGF0dXMgKioqIiApOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgICAgIGNscnRvZW9sKCk7IHJlZnJlc2goKTsgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIGNhc2UgU0NSX1RDOiB7ICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2FjdGlvbiBjb21wbGV0ZSAqLworICAgICAgICAgIGNoYXIgbXNnYnVmWzEyOF07CisgICAgICAgICAgbW92ZShDV19DUCwyMik7ICAgICAgICAgICAgICAgLyogT3ZlcmFsbCB0cmFuc2ZlciByYXRlICovCisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19DUCwgdGZjcHMpOworI2VuZGlmIC8qIEs5NUcgKi8KKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgICBwcmludHcoIiVsZCIsIHRmY3BzKTsKKyAgICAgICAgICBjbHJ0b2VvbCgpOworICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgIG1vdmUoQ1dfTVNHLDIyKTsgICAgICAgICAgLyogUHJpbnQgc3RhdGlzdGljcyBpbiBtZXNzYWdlIGxpbmUgKi8KKyAgICAgICAgICAgICAgY2xydG9lb2woKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgc3ByaW50Zihtc2didWYsCisgICAgICAgICAgICAgICAgICAgICAgIlNVQ0NFU1MuICBGaWxlczogJWxkLCBCeXRlczogJWxkLCAlbGQgQ1BTIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxjbnQgLSBmaWxyZWosCisgICAgICAgICAgICAgICAgICAgICAgZmJ5dCwKKyAgICAgICAgICAgICAgICAgICAgICB0ZmNwcworICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgIHByaW50dygiJXMiLCBtc2didWYpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfTVNHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgbXNnYnVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICAgICAgICBjbHJ0b2VvbCgpOworCisgICAgICAgICAgfQorICAgICAgICAgIG1vdmUoQ1dfVFIsIDEpOworICAgICAgICAgIHByaW50dygiICAgICAgIEVsYXBzZWQgVGltZTogJXMiLGhobW1zcygobG9uZykKKyNpZmRlZiBHRlRJTUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcHRzZWNzICsgMC41KQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNlY3MKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKKyNpZmRlZiBLVUkKKyNpZm5kZWYgSzk1RworICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBDV19UUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgaGhtbXNzKChsb25nKQorI2lmZGVmIEdGVElNRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcHRzZWNzICsgMC41KQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzZWNzCisjZW5kaWYgLyogR0ZUSU1FUiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CisjZW5kaWYgLyogSzk1RyAqLworI2VuZGlmIC8qIEtVSSAqLworICAgICAgICAgIGNscnRvZW9sKCk7CisgICAgICAgICAgbW92ZSgyMywwKTsgY2xydG9lb2woKTsgICAgICAgLyogQ2xlYXIgaW5zdHJ1Y3Rpb25zIGxpbmVzICovCisgICAgICAgICAgbW92ZSgyMiwwKTsgY2xydG9lb2woKTsgICAgICAgLyogdG8gbWFrZSByb29tIGZvciBwcm9tcHQuICovCisgICAgICAgICAgcmVmcmVzaCgpOworCisjaWZkZWYgR0ZUSU1FUgorICAgICAgICAgIG9sZGd0diA9IChDS0ZMT0FUKSAtMS4wOworI2Vsc2UKKyAgICAgICAgICBvbGRndHYgPSAtMUw7CisjZW5kaWYgLyogR0ZUSU1FUiAqLworCisjaWZuZGVmIFZNU0NVUlNFCisJICBkZWJ1ZyhGMTAwLCJzY3JlZW5jIGVuZHdpbiBBIiwiIiwwKTsKKyAgICAgICAgICBlbmR3aW4oKTsKKyNpZmRlZiBDT01NRU5UCisvKgorICBXaHkgYW5kIHdoZW4gd2FzIHRoaXMgY2FsbCB0byBjb25yZXMoKSBhZGRlZD8gIEl0IG1ha2VzIG5vIHNlbnNlLAorICBhbmQgaXQgYnJlYWtzIGVjaG9pbmcgb24gU29sYXJpcyA4LgorKi8KKyNpZmRlZiBTT0xBUklTCisgICAgICAgICAgY29ucmVzKCk7CisjZW5kaWYgLyogU09MQVJJUyAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBWTVNDVVJTRSAqLworCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgIHBjdCA9IDEwMDsgb2xkcGN0ID0gMDsgICAgICAgIC8qIFJlc2V0IHRoZXNlIGZvciBuZXh0IHRpbWUuICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICAgIG9sZHR5cCA9IDA7IG9sZHJ0dCA9IC0xTDsgb2xkdHJ5ID0gLTE7IG9sZGxlbiA9IC0xOworICAgICAgICAgIG9sZHRpbSA9IC0xOworICAgICAgICAgIGNlbmR3ID0gMTsKKyAgICAgICAgICBpZiAoeGZyYmVsKSBibGVlcChCUF9OT1RFKTsgICAvKiBDbG9zZSB3aW5kb3csIHRoZW4gYmVlcC4gKi8KKyNpZmRlZiBVTklYCisgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYgLyogVU5JWCAqLworICAgICAgICAgIGZ0X3dpbiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIFdpbmRvdyBjbG9zZWQuICovCisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgY2FzZSBTQ1JfRU06ICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yIHBhY2tldCAoZmF0YWwpICovCisgICAgICAgIG1vdmUgKENXX0VSUiwyMik7CisgICAgICAgIHByaW50dygiRkFJTFVSRTogJXMiLHMpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0VSUiwgKGxvbmcpIHMgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgIGlmICh4ZnJiZWwpIGJsZWVwKEJQX0ZBSUwpOworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgcGN0ID0gb2xkcGN0ID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIGNscnRvZW9sKCk7IHJlZnJlc2goKTsgcmV0dXJuOworCisgICAgICBjYXNlIFNDUl9RRTogICAgICAgICAgICAgICAgICAgICAgLyogUXVhbnRpdHkgZXF1YWxzICovCisgICAgICBjYXNlIFNDUl9UVTogICAgICAgICAgICAgICAgICAgICAgLyogVW5kZWxpbWl0ZWQgdGV4dCAqLworICAgICAgY2FzZSBTQ1JfVE46ICAgICAgICAgICAgICAgICAgICAgIC8qIFRleHQgZGVsaW1pdGVkIGF0IHN0YXJ0ICovCisgICAgICBjYXNlIFNDUl9UWjogICAgICAgICAgICAgICAgICAgICAgLyogVGV4dCBkZWxpbWl0ZWQgYXQgZW5kICovCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGlnbm9yZWQgaW4gZnVsbHNjcmVlbiBkaXNwbGF5KSAqLworCisgICAgICBjYXNlIFNDUl9YRDogICAgICAgICAgICAgICAgICAgICAgLyogWC1wYWNrZXQgZGF0YSAqLworICAgICAgICBwY3QgPSBvbGRwY3QgPSAwOworICAgICAgICBtb3ZlKENXX05BTSwyMik7CisgICAgICAgIHByaW50dygiJXMiLHMpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX05BTSwgKGxvbmcpIHMgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgIGNscnRvZW9sKCk7IHJlZnJlc2goKTsgcmV0dXJuOworCisgICAgICBjYXNlIFNDUl9DVzogICAgICAgICAgICAgICAgICAgICAgLyogQ2xvc2UgV2luZG93ICovCisgICAgICAgIGNscnRvZW9sKCk7IG1vdmUoMjMsMCk7IGNscnRvZW9sKCk7IG1vdmUoMjIsMCk7IGNscnRvZW9sKCk7CisgICAgICAgIHJlZnJlc2goKTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIHBjdCA9IDEwMDsgb2xkcGN0ID0gMDsgICAgICAgICAgLyogUmVzZXQgdGhlc2UgZm9yIG5leHQgdGltZS4gKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgIG9sZHR5cCA9IDA7IG9sZHJ0dCA9IC0xTDsgb2xkdHJ5ID0gLTE7IG9sZGxlbiA9IC0xOworICAgICAgICBvbGR0aW0gPSAtMTsKKworI2lmbmRlZiBWTVNDVVJTRQorCWRlYnVnKEYxMDAsInNjcmVlbmMgZW5kd2luIEIiLCIiLDApOworICAgICAgICBlbmR3aW4oKTsKKyNlbmRpZiAvKiBWTVNDVVJTRSAqLworICAgICAgICBmdF93aW4gPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgdGhhdCB3aW5kb3cgaXMgY2xvc2VkLiAqLworICAgICAgICBjZW5kdyA9IDE7IHJldHVybjsKKworICAgICAgY2FzZSBTQ1JfQ0Q6ICAgICAgICAgICAgICAgICAgICAgIC8qIERpc3BsYXkgY3VycmVudCBkaXJlY3RvcnkgKi8KKyAgICAgICAgbW92ZShDV19ESVIsMjIpOworICAgICAgICAgcHJpbnR3KCIlcyIsIHMpOworI2lmZGVmIEtVSQorI2lmbmRlZiBLOTVHCisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0RJUiwgKGxvbmcpIHMgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgIGNscnRvZW9sKCk7CisgICAgICAgIHJlZnJlc2goKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgU2F2ZUNtZE1vZGUoMCwgMCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHJldHVybjsKKworICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhZCBjYWxsICovCisgICAgICAgIG1vdmUgKENXX0VSUiwyMik7CisjaWZkZWYgS1VJCisjaWZuZGVmIEs5NUcKKyAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBDV19FUlIsCisgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSAiKioqIHNjcmVlbigpIGNhbGxlZCB3aXRoIGJhZCBmdW5jdGlvbiBjb2RlICoqKiIKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyNlbmRpZiAvKiBLOTVHICovCisjZW5kaWYgLyogS1VJICovCisgICAgICAgIHByaW50dygiKioqIHNjcmVlbigpIGNhbGxlZCB3aXRoIGJhZCBmdW5jdGlvbiBjb2RlICoqKiIpOworICAgICAgICBjbHJ0b2VvbCgpOyByZWZyZXNoKCk7IHJldHVybjsKKyAgICB9Cit9CisjZW5kaWYgLyogQ0tfQ1VSU0VTICovCisKKyNpZmRlZiBLVUkKKyNpZmRlZiBDS19BTlNJQwordm9pZAorc2NyZWVuZyhpbnQgZiwgY2hhciBjLGxvbmcgbixjaGFyICpzKQorI2Vsc2UKK1ZPSUQKK3NjcmVlbmcoZixjLG4scykKK2ludCBmOyAgICAgICAgICAvKiBhcmd1bWVudCBkZXNjcmlwdG9yICovCitjaGFyIGM7ICAgICAgICAgLyogYSBjaGFyYWN0ZXIgb3Igc21hbGwgaW50ZWdlciAqLworbG9uZyBuOyAgICAgICAgIC8qIGEgbG9uZyBpbnRlZ2VyICovCitjaGFyICpzOyAgICAgICAgLyogYSBzdHJpbmcgKi8KKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogc2NyZWVuZygpICovIHsKKyNpZmRlZiBDS19TU0wKKyAgICBleHRlcm4gaW50IHRsc19hY3RpdmVfZmxhZywgc3NsX2FjdGl2ZV9mbGFnOworI2VuZGlmIC8qIENLX1NTTCAqLworI2lmZGVmIFJMT0dDT0RFCisgICAgZXh0ZXJuIGludCB0dG5wcm90bzsKKyNlbmRpZiAvKiBSTE9HQ09ERSAqLworICAgIHN0YXRpYyBpbnQgcSA9IDA7CisgICAgc3RhdGljIGxvbmcgZnNpeiA9IC0xTDsgICAvKiBDb3B5IG9mIGZpbGUgc2l6ZSAqLworICAgIHN0YXRpYyBsb25nIGZjbnQgPSAwTDsgICAgLyogTnVtYmVyIG9mIGZpbGVzIHRyYW5zZmVycmVkICovCisgICAgc3RhdGljIGxvbmcgZmJ5dCA9IDBMOyAgICAvKiBUb3RhbCBmaWxlIGJ5dGVzIG9mIGFsbCBmaWxlcyB0cmFuc2ZlcnJlZCAqLworICAgIHN0YXRpYyBsb25nIGhvd2ZhciA9IDBMOyAgLyogSG93IG11Y2ggb2YgY3VycmVudCBmaWxlIGhhcyBiZWVuIHhmZXInZC4gKi8KKyAgICBzdGF0aWMgaW50ICBwY3RsYmwgPSAwTDsgIC8qIFBlcmNlbnQgZG9uZSB2cyBCeXRlcyBzbyBmYXIgKi8KKyAgICBsb25nIGNwcyA9IDBMOworCisgICAgaW50IG5ldCA9IDA7CisgICAgaW50IHhuZXQgPSAwOworICAgIGludCBmdHAgPSAwOworICAgIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBzdHJpbmcgKi8KKyAgICBpbnQgZXJyb3JzID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBFcnJvciBjb3VudGVyICovCisgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29ya2VyICovCisKKyAgICBkZWJ1ZyhGMTAxLCJzY3JlZW5nIGNpbml0IiwiIixjaW5pdCk7CisgICAgZGVidWcoRjEwMSwic2NyZWVuZyBjZW5kdyIsIiIsY2VuZHcpOworCisgICAgaWYgKCFzKSBzID0gIiI7ICAgICAgICAgICAgICAgICAgICAgLyogQWx3YXlzIGRvIHRoaXMuICovCisKKyAgICBmdHAgPSAod2hhdCAmIFdfRlRQKSA/IDEgOiAwOwkvKiBGVFAgb3IgS2VybWl0ICovCisgICAgbmV0ID0gbmV0d29yayB8fCBmdHA7CisgICAgeG5ldCA9IGZ0cCA/IDEgOiBuZXR0eXBlOwkJLyogTkVUX1RDUEIgPT0gMSAqLworCisgICAgaWYgKGNpbml0ID09IDAgfHwgY2VuZHcgPiAwKSB7ICAgICAgLyogSGFuZGxlIGJvcmRlcmxpbmUgY2FzZXMuLi4gKi8KKyAgICAgICAgaWYgKGYgPT0gU0NSX0NXKSB7ICAgICAgICAgICAgICAvKiBDbG9zZSB3aW5kb3csIGJ1dCBpdCdzIG5vdCBvcGVuICovCisgICAgICAgICAgICBmdF93aW4gPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTEsInNjcmVlbmcgQSIscyxmKTsKKyAgICAgICAgaWYgKGYgPT0gU0NSX0VNIHx8CisgICAgICAgICAgIChmID09IFNDUl9QVCAmJiBjID09ICdFJykpIHsgLyogRmF0YWwgZXJyb3IgYmVmb3JlIHdpbmRvdyBvcGVuICovCisgICAgICAgICAgICBjb25vbGwoIiIpOyBjb25vYygnPycpOyBjb25vbGwocyk7IHJldHVybjsgLyogUmVndWxhciBkaXNwbGF5ICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNpbml0ID09IDApIHsgICAgICAgICAgICAgICAgICAgLyogT25seSBjYWxsIGluaXRzY3IoKSBvbmNlICovCisJLyogQ2hlY2sgdGhlc2Ugbm93IC0tIGlmIHRoZXkgYXJlIGRlZmluZWQgYnV0IG5vdCBudW1lcmljICovCisJLyogdGhleSBjYW4gY3Jhc2ggY3Vyc2VzICovCisgICAgICAgIGNlbmR3ID0gMTsgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHdpbmRvdyBuZWVkcyByZXBhaW50aW5nICovCisgICAgICAgIGRlYnVnKEYxMDAsInNjcmVlbmcgY2FsbGluZyBpbml0c2NyIiwiIiwwKTsKKyAgICAgICAgaW5pdHNjcigpOyAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGN1cnNlcy4gKi8KKyAgICAgICAgZGVidWcoRjEwMCwic2NyZWVuZyBpbml0c2NyIG9rIiwiIiwwKTsKKyAgICAgICAgY2luaXQrKzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZW1lbWJlciBjdXJzZXMgd2FzIGluaXRpYWxpemVkLiAqLworICAgIH0KKyAgICBmdF93aW4gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaW5kb3cgaXMgb3BlbiAqLworICAgIGlmIChyZXBhaW50KSB7CisjaWZkZWYgQ0tfV1JFRlJFU0gKKy8qCisgIFRoaXMgdG90YWxseSByZXBhaW50cyB0aGUgc2NyZWVuLCBqdXN0IHdoYXQgd2Ugd2FudCwgYnV0IHdlIGNhbiBvbmx5CisgIGRvIHRoaXMgd2l0aCByZWFsIGN1cnNlcywgYW5kIHRoZW4gb25seSBpZiBjbGVhcm9rKCkgYW5kIHdyZWZyZXNoKCkgYXJlCisgIHByb3ZpZGVkIGluIHRoZSBjdXJzZXMgbGlicmFyeS4KKyovCisgICAgICAgIFJlc3RvcmVDbWRNb2RlKCk7CisjZWxzZSAgLyogTm8gQ0tfV1JFRlJFU0ggKi8KKy8qCisgIEtlcm1pdCdzIGRvLWl0LXlvdXJzZWxmIG1ldGhvZCwgd29ya3Mgd2l0aCBhbGwgdHlwZXMgb2YgZnVsbHNjcmVlbgorICBzdXBwb3J0LCBidXQgZG9lcyBub3QgcmVwYWludCBhbGwgdGhlIGZpZWxkcy4gIEZvciBleGFtcGxlLCB0aGUgZmlsZW5hbWUKKyAgaXMgbG9zdCwgYmVjYXVzZSBpdCBhcnJpdmVzIGF0IGEgY2VydGFpbiB0aW1lIGFuZCBuZXZlciBjb21lcyBhZ2FpbiwgYW5kCisgIEtlcm1pdCBwcmVzZW50bHkgZG9lcyBub3Qgc2F2ZSBpdCBhbnl3aGVyZS4gIE1ha2luZyB0aGlzIG1ldGhvZCB3b3JrIGZvcgorICBhbGwgZmllbGRzIHdvdWxkIGJlIGEgcmF0aGVyIG1ham9yIHJlY29kaW5nIHRhc2ssIGR1cGxpY2F0aW5nIHdoYXQgY3Vyc2VzCisgIGFscmVhZHkgZG9lcywgYW5kIHdvdWxkIGFkZCBhIGxvdCBvZiBjb21wbGV4aXR5IGFuZCBzdG9yYWdlIHNwYWNlLgorKi8KKyAgICAgICAgY2VuZHcgPSAxOworI2VuZGlmIC8qIENLX1dSRUZSRVNIICovCisgICAgICAgIHJlcGFpbnQgPSAwOworICAgIH0KKyAgICBpZiAoY2VuZHcpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmR3aW4oKSB3YXMgY2FsbGVkIHByZXZpb3VzbHkgKi8KKyAgICAgICAgZGVidWcoRjEwMCwic2NyZWVuZyBzZXR1cCBvayIsIiIsMCk7CisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0RJUiwgKGxvbmcpIHpndGRpcigpICk7CisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0xJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSAoCisjaWZkZWYgTkVXRlRQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cCA/IChmdHBfaG9zdCA/IGZ0cF9ob3N0IDogIih1bmtub3duKSIpIDoKKyNlbmRpZiAvKiBORVdGVFAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRuYW1lKSApOworCisgICAgICAgIGlmIChuZXQpIHsKKyNpZmRlZiBORVRDT05OCisJICAgIGludCBzZWN1cmUgPSAwOworCSAgICBjaGFyICogeG5hbWU7CisJICAgIGlmICh4bmV0ID4gbm5ldG5hbWUpCisJICAgICAgeG5hbWUgPSAiW0VSUk9SXSI7CisJICAgIGVsc2UKKwkgICAgICB4bmFtZSA9IG5ldG5hbWVbeG5ldF07CisjaWZkZWYgTkVXRlRQCisgICAgICAgICAgICBpZiAoZnRwKSB7CisJCWlmIChmdHBpc3NlY3VyZSgpKQorCQkgIHNlY3VyZSA9IDE7CisJICAgIH0gZWxzZQorI2VuZGlmIC8qIE5FV0ZUUCAqLworCSAgICAgIGlmICgwCisjaWZkZWYgU1NIQlVJTFRJTgorICAgICAgICAgICAgICAgIHx8IElTX1NTSCgpCisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworI2lmZGVmIENLX0VOQ1JZUFRJT04KKyAgICAgICAgICAgICAgICB8fCBja190bl9lbmNyeXB0aW5nKCkgJiYgY2tfdG5fZGVjcnlwdGluZygpCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2lmZGVmIENLX1NTTAorICAgICAgICAgICAgICAgIHx8IHRsc19hY3RpdmVfZmxhZyB8fCBzc2xfYWN0aXZlX2ZsYWcKKyNlbmRpZiAvKiBDS19TU0wgKi8KKyNpZmRlZiBSTE9HQ09ERQorI2lmZGVmIENLX0tFUkJFUk9TCisjaWZkZWYgQ0tfRU5DUllQVElPTgorICAgICAgICAgICAgICAgIHx8IHR0bnByb3RvID09IE5QX0VLNExPR0lOIHx8IHR0bnByb3RvID09IE5QX0VLNUxPR0lOCisjZW5kaWYgLyogQ0tfRU5DUllQVElPTiAqLworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisjZW5kaWYgLyogUkxPR0NPREUgKi8KKyAgICAgICAgICAgICAgICAgKSB7CisJCXNlY3VyZSA9IDE7CisJICAgIH0KKwkgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgICAgIGNoYXIgYnVmWzMwXTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwiJXMgKFNFQ1VSRSkiLHhuYW1lKTsKKyAgICAgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfU1BELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBidWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfU1BELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSB4bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfU1BELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpICIobmV0d29yaykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2VuZGlmIC8qIE5FVENPTk4gKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzcGVlZCA8IDBMKQorICAgICAgICAgICAgICBzcGVlZCA9IHR0Z3NwZCgpOworICAgICAgICAgICAgaWYgKHNwZWVkID4gMEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3BlZWQgPT0gODg4MCkgeworICAgICAgICAgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX1NQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpICI3NS8xMjAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgc3BlZWRidWZbNjRdIDsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzcGVlZGJ1ZiwgIiVsZCIsIHNwZWVkKTsKKyAgICAgICAgICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBDV19TUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBzcGVlZGJ1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX1NQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgIih1bmtub3duKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfUEFSLAorICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgcGFybmFtKChjaGFyKXBhcml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcGN0bGJsID0gKHdoYXQgJiBXX1NFTkQpOworICAgICAgICBjZW5kdyA9IDA7CisgICAgfQorICAgIGRlYnVnKEYxMDEsIlNDUkVFTkMgc3dpdGNoIiwiIixmKTsKKyAgICBkZWJ1ZyhGMDAwLCJTQ1JFRU5DIGMiLCIiLGMpOworICAgIGRlYnVnKEYxMDEsIlNDUkVFTkMgbiIsIiIsbik7CisKKyAgICBsZW4gPSBzdHJsZW4ocyk7ICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgYXJndW1lbnQgc3RyaW5nICovCisgICAgc3dpdGNoIChmKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSGFuZGxlIG91ciBmdW5jdGlvbiBjb2RlICovCisgICAgICBjYXNlIFNDUl9GTjogICAgICAgICAgICAgICAgICAgICAgLyogRmlsZW5hbWUgKi8KKyAgICAgICAgb2xkcGN0ID0gcGN0ID0gMEw7ICAgICAgICAgICAgICAvKiBSZXNldCBwZXJjZW50cyAqLworI2lmZGVmIEdGVElNRVIKKyAgICAgICAgZ3R2ID0gKENLRkxPQVQpIC0xLjA7CisgICAgICAgIC8qIG9sZGd0diA9IChDS0ZMT0FUKSAtMS4wOyAqLworI2Vsc2UKKyAgICAgICAgZ3R2ID0gLTFMOworICAgICAgICAvKiBvbGRndHYgPSAtMUw7ICovCisjZW5kaWYgLyogR0ZUSU1FUiAqLworICAgICAgICBvbGR3aW4gPSAtMTsKKyAgICAgICAgZnNpeiA9IC0xTDsgICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkYXRlIHByZXZpb3VzIGZpbGUgc2l6ZSAqLworICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19QQ0QsIChsb25nKSAwICk7CisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0ZGQywgKGxvbmcpIDAgKTsKKyAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfU0laLCAobG9uZykgMCApOworICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19FUlIsIChsb25nKSAiIiApOworCisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX05BTSwgKGxvbmcpIHMgKTsKKyAgICAgICAgcSA9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZW1lbWJlciBuYW1lIGxlbmd0aCBmb3IgbGF0ZXIgKi8KKyAgICAgICAgc2NyZnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNwbGF5IGZpbGUgdHlwZSAoY2FuIGNoYW5nZSkgKi8KKyNpZmRlZiBPUzIKKyAgICAgICAgU2F2ZUNtZE1vZGUoMCwgMCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHJldHVybjsKKworICAgICAgY2FzZSBTQ1JfQU46ICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgYXMtbmFtZSAqLworICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19OQU0sIChsb25nKSBzICk7CisjaWZkZWYgT1MyCisgICAgICAgIFNhdmVDbWRNb2RlKDAsIDApOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICByZXR1cm47CisKKyAgICAgIGNhc2UgU0NSX0ZTOiAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIHNpemUgKi8KKyAgICAgICAgZnNpeiA9IG47CisgICAgICAgIGlmIChmc2l6ID4gLTFMKSB7CisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19TSVosIChsb25nKSBuICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZzaXogPiAtMUwpIHsgICAgICAgICAgICAgICAvKiBQdXQgdXAgcGVyY2VudCBsYWJlbCAqLworICAgICAgICAgICAgcGN0bGJsID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBjdGxibCA9IDA7CisJfQorICAgICAgICBzY3JmdCgpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgdHlwZSAqLworI2lmZGVmIE9TMgorICAgICAgICBTYXZlQ21kTW9kZSgwLCAwKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIFNDUl9QVDogICAgICAgICAgICAgICAgICAgICAgLyogUGFja2V0IHR5cGUgb3IgcHNldWRvdHlwZSAqLworICAgICAgICBpZiAoc3BhY2tldHMgPCA1KSB7CisgICAgICAgICAgICBleHRlcm4gaW50IHN5c2luZGV4OworICAgICAgICAgICAgZXh0ZXJuIHN0cnVjdCBzeXNkYXRhIHN5c2lkbGlzdFtdOworICAgICAgICAgICAgLyogVGhpbmdzIHRoYXQgd29uJ3QgY2hhbmdlIGFmdGVyIHRoZSA0dGggcGFja2V0ICovCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfUEFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIHBhcm5hbSgoY2hhcilwYXJpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKAorI2lmZGVmIE5FV0ZUUAorCQkoZnRwICYmIChzcGFja2V0cyA9PSAxIHx8IHJwYWNrZXRzID09IDEpKSB8fAorI2VuZGlmIC8qIE5FV0ZUUCAqLworCQlzcGFja2V0cyA9PSA0CisJCSkgeworICAgICAgICAgICAgICAgIGlmICgKKyNpZmRlZiBORVdGVFAKKwkJICAgIGZ0cCB8fAorI2VuZGlmIC8qIE5FV0ZUUCAqLworCQkgICAgKChwcm90b2NvbCA9PSBQUk9UT19LKSAmJiAoc3lzaW5kZXggPiAtMSkpCisJCSAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBtc2didWZbMTI4XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihtc2didWYsIk5ldHdvcmsgSG9zdDogJXMgKCVzKSIsCisjaWZkZWYgTkVXRlRQCisJCQkgICAgICAgZnRwID8gKGZ0cF9ob3N0ID8gZnRwX2hvc3QgOiAiIikgOgorI2VuZGlmIC8qIE5FV0ZUUCAqLworCQkJICAgICAgIHR0bmFtZSwKKyNpZmRlZiBORVdGVFAKKwkJCSAgICAgICBmdHAgPyBmdHBfc3J2dHlwIDoKKyNlbmRpZiAvKiBORVdGVFAgKi8KKwkJCSAgICAgICBzeXNpZGxpc3Rbc3lzaW5kZXhdLnNpZF9uYW1lCisJCQkgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnYnVmLAorCQkJCSJDb21tdW5pY2F0aW9uIERldmljZTogJXMgKHJlbW90ZSBob3N0IGlzICVzKSIsCisJCQkJdHRuYW1lLAorCQkJCXN5c2lkbGlzdFtzeXNpbmRleF0uc2lkX25hbWUKKwkJCQkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwKKwkJCQkgICAgKGxvbmcpIENXX0xJTiwKKwkJCQkgICAgKGxvbmcpIG1zZ2J1ZgorCQkJCSAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmZGVmIENLX1RJTUVSUworICAgICAgICBpZiAoLyogcnR0ZmxnICYmICovIHByb3RvY29sID09IFBST1RPX0spIHsKKyAgICAgICAgICAgIGxvbmcgeHg7CisgICAgICAgICAgICBpZiAoCisjaWZkZWYgU1RSRUFNSU5HCisgICAgICAgICAgICAgICAgc3RyZWFtaW5nICYmIG9sZHdpbiAhPSAtMgorI2Vsc2UKKyAgICAgICAgICAgICAgICAwCisjZW5kaWYgLyogU1RSRUFNSU5HICovCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgY2hhciBtc2didWZbNjRdOworICAgICAgICAgICAgICAgIHNwcmludGYobXNnYnVmLCIwMCAvIDAwIik7CisgICAgICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLAorCQkJCShsb25nKSBDV19UTU8sCisJCQkJKGxvbmcpIG1zZ2J1ZgorCQkJCSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHh4ID0gKHJ0dGRlbGF5ICsgNTAwKSAvIDEwMDA7CisgICAgICAgICAgICAgICAgaWYgKHh4ICE9IG9sZHJ0dCB8fCByY3Z0aW1vICE9IG9sZHRpbSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyIG1zZ2J1Zls2NF07CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnYnVmLCIlMDJsZCAvICUwMmQiLCB4eCwgcmN2dGltbyk7CisgICAgICAgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwKKwkJCQkgICAgKGxvbmcpIENXX1RNTywKKwkJCQkgICAgKGxvbmcpIG1zZ2J1ZgorCQkJCSAgICApOworICAgICAgICAgICAgICAgICAgICBvbGRydHQgPSB4eDsKKyAgICAgICAgICAgICAgICAgICAgb2xkdGltID0gcmN2dGltbzsKKyAgICAgICAgICAgICAgICAgICAgY2xydG9lb2woKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBDS19USU1FUlMgKi8KKworICAgICAgICB4ID0gKHdoYXQgJiBXX1JFQ1YpID8gICAgICAgICAgLyogUGFja2V0IGxlbmd0aCAqLworICAgICAgICAgIHJwa3RsKyhwcm90b2NvbD09UFJPVE9fSz8xOjApIDoKKyAgICAgICAgICAgIHNwa3RsOworICAgICAgICBpZiAoeCAhPSBvbGRsZW4pIHsgICAgICAgICAgICAgIC8qIEJ1dCBvbmx5IGlmIGl0IGNoYW5nZWQuICovCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19QTCwgKGxvbmcpIHggKTsKKyAgICAgICAgICAgIG9sZGxlbiA9IHg7CisgICAgICAgIH0KKyAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfUEMsIChsb25nKSBzcGFja2V0cyApOworCisgICAgICAgIGlmIChwcm90b2NvbCA9PSBQUk9UT19LICYmICFmdHApIHsgLyogV2luZG93IHNsb3RzICovCisgICAgICAgICAgICBjaGFyIHdzWzE2XTsKKyAgICAgICAgICAgIGludCBmbGFnOworICAgICAgICAgICAgZmxhZyA9IDA7CisjaWZkZWYgU1RSRUFNSU5HCisgICAgICAgICAgICBpZiAoc3RyZWFtaW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKG9sZHdpbiAhPSAtMikgeworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHdzLCJTVFJFQU1JTkciKTsKKyAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgICAgIG9sZHdpbiA9IC0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFNUUkVBTUlORyAqLworICAgICAgICAgICAgICBpZiAod2N1ciAhPSBvbGR3aW4pIHsKKyAgICAgICAgICAgICAgICAgIHNwcmludGYod3MsICIlZCBvZiAlZCIsIHdjdXIgPCAxID8gMSA6IHdjdXIsIHdzbG90bik7CisgICAgICAgICAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgICAgICAgICAgIG9sZHdpbiA9IHdjdXI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmbGFnKSB7CisgICAgICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfV1MsIChsb25nKSB3cyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVycm9ycyA9IHJldHJhbnMgKyBjcnVuY2hlZCArIHRpbWVvdXRzOworICAgICAgICBpZiAoZXJyb3JzICE9IG9sZHRyeSkgeyAgICAgICAgIC8qIFJldHJ5IGNvdW50LCBpZiBjaGFuZ2VkICovCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19QUiwgKGxvbmcpIGVycm9ycyApOworICAgICAgICAgICAgb2xkdHJ5ID0gZXJyb3JzOworICAgICAgICB9CisJLyogU2VuZGVyJ3MgcGFja2V0IHR5cGUgKi8KKyAgICAgICAgaWYgKCFmdHAgJiYgKGMgIT0gb2xkdHlwICYmIGMgIT0gJ1knICYmIGMgIT0gJ04nKSkgeworICAgICAgICAgICAgY2hhciB0eXBlWzJdOworICAgICAgICAgICAgc3ByaW50Zih0eXBlLCAiJWMiLGMpOworICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfUFQsIChsb25nKSB0eXBlICk7CisgICAgICAgICAgICBvbGR0eXAgPSBjOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYykgeyAgICAgICAgICAgICAgICAgICAgLyogTm93IGhhbmRsZSBzcGVjaWZpYyBwYWNrZXQgdHlwZXMgKi8KKyAgICAgICAgICBjYXNlICdTJzogICAgICAgICAgICAgICAgICAgICAvKiBCZWdpbm5pbmcgb2YgdHJhbnNmZXIgKi8KKyAgICAgICAgICAgIGZjbnQgPSBmYnl0ID0gMEw7ICAgICAgICAgICAvKiBDbGVhciBjb3VudGVycyAqLworI2lmZGVmIEdGVElNRVIKKyAgICAgICAgICAgIGd0diA9IC0xLjA7CisjZWxzZSAvKiBHRlRJTUVSICovCisgICAgICAgICAgICBndHYgPSAtMUw7ICAgICAgICAgICAgICAgICAgLyogQW5kIG9sZC9uZXcgdGhpbmdzLi4uICovCisjZW5kaWYgLyogR0ZUSU1FUiAqLworICAgICAgICAgICAgb2xkcGN0ID0gcGN0ID0gMEw7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgJ1onOiAgICAgICAgICAgICAgICAgICAgIC8qIG9yIEVPRiAqLworICAgICAgICAgICAgZGVidWcoRjEwMSwic2NyZWVuZyBTQ1JfUFQgWiBwa3RudW0iLCIiLG4pOworICAgICAgICAgICAgZGVidWcoRjEwMSwic2NyZWVuZyBTQ1JfUFQgWiBvbGRwY3QiLCIiLG9sZHBjdCk7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJzY3JlZW5nIFNDUl9QVCBaIHBjdCIsIiIscGN0KTsKKyAgICAgICAgICBjYXNlICdEJzogICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIHBhY2tldCAqLworICAgICAgICAgICAgaWYgKGZzaXogPiAwTCkgeyAgICAgICAgICAgIC8qIFNob3cgcGVyY2VudCBkb25lIGlmIGtub3duICovCisgICAgICAgICAgICAgICAgb2xkcGN0ID0gcGN0OyAgICAgICAgICAgLyogUmVtZW1iZXIgcHJldmlvdXMgcGVyY2VudCAqLworICAgICAgICAgICAgICAgIGhvd2ZhciA9IGZmYzsKKyNpZmRlZiBDS19SRVNFTkQKKyAgICAgICAgICAgICAgICBpZiAod2hhdCAmIFdfU0VORCkJLyogQWNjb3VudCBmb3IgUFNFTkQgb3IgUkVTRU5EICovCisgICAgICAgICAgICAgICAgICBob3dmYXIgKz0gc2VuZHN0YXJ0OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdoYXQgJiBXX1JFQ1YpCisgICAgICAgICAgICAgICAgICBob3dmYXIgKz0gcnNfbGVuOworI2VuZGlmIC8qIENLX1JFU0VORCAqLworICAgICAgICAgICAgICAgIC8qIFBlcmNlbnQgZG9uZSwgdG8gYmUgZGlzcGxheWVkLi4uICovCisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1onKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGlzY2FyZCAmJiAhY3hzZWVuICYmICFjenNlZW4pIHBjdCA9IDEwMEw7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICBwY3QgPSAoZnNpeiA+IDk5TCkgPyAoaG93ZmFyIC8gKGZzaXogLyAxMDBMKSkgOiAwTDsKKyAgICAgICAgICAgICAgICBpZiAocGN0ID4gMTAwTCB8fCAgICAgICAvKiBBbGxvdyBmb3IgZXhwYW5zaW9uIGFuZCAqLworICAgICAgICAgICAgICAgICAgIChvbGRwY3QgPT0gOTlMICYmIHBjdCA8IDBMKSkgLyogb3RoZXIgYm91bmRhcnkgY29uZGl0aW9ucyAqLworICAgICAgICAgICAgICAgICAgcGN0ID0gMTAwTDsKKyAgICAgICAgICAgICAgICBpZiAocGN0ICE9IG9sZHBjdCkgICAgICAvKiBPbmx5IGRvIHRoaXMgMTAwIHRpbWVzIHBlciBmaWxlICovCisgICAgICAgICAgICAgICAgICB1cGRwY3Qob2xkcGN0LCBwY3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0ZGQywgKGxvbmcpIGZmYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0ZGQywgKGxvbmcpIGhvd2Zhcik7CisgICAgICAgICAgICBjcHMgPSBzaG9jcHMoKGludCkgcGN0LCBmc2l6LCBob3dmYXIpOworICAgICAgICAgICAgLyogb2xkX3RyID0gc2hvZXRsKG9sZF90ciwgY3BzLCBmc2l6LCBob3dmYXIpOyAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICclJzogICAgICAgICAgICAgICAgICAgICAvKiBUaW1lb3V0cywgcmV0cmFuc21pc3Npb25zICovCisgICAgICAgICAgICBjcHMgPSBzaG9jcHMoKGludCkgcGN0LCBmc2l6LCBob3dmYXIpOworICAgICAgICAgICAgLyogb2xkX3RyID0gc2hvZXRsKG9sZF90ciwgY3BzLCBmc2l6LCBob3dmYXIpOyAqLworCisgICAgICAgICAgICBlcnJvcnMgPSByZXRyYW5zICsgY3J1bmNoZWQgKyB0aW1lb3V0czsKKyAgICAgICAgICAgIGlmIChlcnJvcnMgIT0gb2xkdHJ5KSB7ICAgICAvKiBFcnJvciBjb3VudCwgaWYgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBDV19QUiwKKwkJCSAgICAgICAobG9uZykgZXJyb3JzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2xkdHJ5ID0gZXJyb3JzOworICAgICAgICAgICAgICAgIGlmIChzKSBpZiAoKnMpIHsKKyAgICAgICAgICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19FUlIsIChsb25nKSBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAnRSc6ICAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IgcGFja2V0ICovCisgICAgICAgICAgICBpZiAoKnMpIHsKKyAgICAgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19FUlIsIChsb25nKSBzICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmY250ID0gZmJ5dCA9IDBMOyAgICAgICAgICAgLyogU28gbm8gYnl0ZXMgZm9yIHRoaXMgZmlsZSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnUSc6ICAgICAgICAgICAgICAgICAgICAgLyogQ3J1bmNoZWQgcGFja2V0ICovCisgICAgICAgICAgICBjcHMgPSBzaG9jcHMoKGludCkgcGN0LCBmc2l6LCBob3dmYXIpOworICAgICAgICAgICAgLyogb2xkX3RyID0gc2hvZXRsKG9sZF90ciwgY3BzLCBmc2l6LCBob3dmYXIpOyAqLworICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfRVJSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpICJEYW1hZ2VkIFBhY2tldCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdxJzogICAgICAgICAgICAgICAgICAgICAvKiBDdHJsLUMgb3IgY29ubmVjdGlvbiBsb3N0ICovCisgICAgICAgICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgICAgICAgIGlmICghKnMpIHMgPSAiVXNlciBpbnRlcnJ1cHRpb24gb3IgY29ubmVjdGlvbiBsb3N0IjsKKyAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX01TRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBzCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnVCc6ICAgICAgICAgICAgICAgICAgICAgLyogVGltZW91dCAqLworICAgICAgICAgICAgY3BzID0gc2hvY3BzKChpbnQpIHBjdCwgZnNpeiwgaG93ZmFyKTsKKyAgICAgICAgICAgIC8qIG9sZF90ciA9IHNob2V0bChvbGRfdHIsIGNwcywgZnNpeiwgaG93ZmFyKTsgKi8KKyAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX0VSUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSAiVGltZW91dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBlcnJvcnMgPSByZXRyYW5zICsgY3J1bmNoZWQgKyB0aW1lb3V0czsKKyAgICAgICAgICAgIGlmIChlcnJvcnMgIT0gb2xkdHJ5KSB7ICAgICAvKiBFcnJvciBjb3VudCwgaWYgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBDV19QUiwgKGxvbmcpIGVycm9ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgb2xkdHJ5ID0gZXJyb3JzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJzLCBkbyBub3RoaW5nICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2lmZGVmIE9TMgorICAgICAgICBTYXZlQ21kTW9kZSgwLCAwKTsKKyNlbmRpZiAvKiBPUzIgKi8KKyAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIFNDUl9TVDogICAgICAgICAgICAgICAgICAgICAgLyogRmlsZSB0cmFuc2ZlciBzdGF0dXMgKi8KKyAgICAgICAgZGVidWcoRjEwMSwic2NyZWVuZyBTQ1JfU1QgYyIsIiIsYyk7CisgICAgICAgIGRlYnVnKEYxMDEsInNjcmVlbmcgU0NSX1NUIHN1Y2Nlc3MiLCIiLHN1Y2Nlc3MpOworICAgICAgICBkZWJ1ZyhGMTAxLCJzY3JlZW5nIFNDUl9TVCBjeHNlZW4iLCIiLGN4c2Vlbik7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICBpZiAoYyA9PSBTVF9PSykgeyAgICAgICAgICAgICAgIC8qIE9LLCBwcmludCAxMDAgJSAqLworICAgICAgICAgICAgaWYgKHBjdGxibCkKKyAgICAgICAgICAgICAgdXBkcGN0KG9sZHBjdCwxMDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfRkZDLCAobG9uZykgZmZjKTsKKyAgICAgICAgICAgIHBjdCA9IDEwMDsKKyAgICAgICAgICAgIG9sZHBjdCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoZnNpeiA+IDBMKSAgICAgICAgICAgLyogTm90IE9LLCB1cGRhdGUgZmluYWwgcGVyY2VudCAqLworLyoKKyAgVGhlIGVsc2UgcGFydCB3cml0ZXMgYWxsIG92ZXIgdGhlIHNjcmVlbiAtLSBob3dmYXIgYW5kL29yIGZzaXogaGF2ZQorICBiZWVuIHJlc2V0IGFzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIG5vdC1PS25lc3Mgb2YgdGhlIHRyYW5zZmVyLgorKi8KKyAgICAgICAgICBpZiAocGN0bGJsKQorICAgICAgICAgICAgdXBkcGN0KG9sZHBjdCwgKGhvd2ZhciAqIDEwMEwpIC8gZnNpeik7CisjZWxzZQorICAgICAgICBpZiAoYyA9PSBTVF9PSykgeyAgICAgICAgICAgICAgIC8qIE9LLCBwcmludCAxMDAgJSAqLworICAgICAgICAgICAgaWYgKHBjdGxibCkgeworCQl1cGRwY3Qob2xkcGN0LDEwMCk7CisJICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfRkZDLCAobG9uZykgZmZjKTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICBwY3QgPSAxMDA7CisgICAgICAgICAgICBvbGRwY3QgPSAwOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgfQorI2VuZGlmIC8qIENPTU1FTlQgKi8KKworICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19UUiwgKGxvbmcpICIiICk7CisKKyAgICAgICAgc3dpdGNoIChjKSB7ICAgICAgICAgICAgICAgICAgICAvKiBQcmludCBuZXcgc3RhdHVzIG1lc3NhZ2UgKi8KKyAgICAgICAgICBjYXNlIFNUX09LOiAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2ZlciBPSyAqLworICAgICAgICAgICAgZmNudCsrOyAgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IHRoaXMgZmlsZSAqLworCSAgICBpZiAod2hhdCA9PSAoV19GVFB8V19GVF9ERUxFKSkgeworICAgICAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfTVNHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgIkRlbGV0ZSBPSyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKwkgICAgfSBlbHNlIHsKKwkJZmJ5dCArPSBmZmM7CisgICAgICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBDV19NU0csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSAiVHJhbnNmZXIgT0siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisJICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgU1RfRElTQzogICAgICAgICAgICAgICAgIC8qIERpc2NhcmRlZCAqLworICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfRVJSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpICJGaWxlIGRpc2NhcmRlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgcGN0ID0gb2xkcGN0ID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIFNUX0lOVDogICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHRlZCAqLworICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfRVJSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpICJUcmFuc2ZlciBpbnRlcnJ1cHRlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgcGN0ID0gb2xkcGN0ID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY2FzZSBTVF9TS0lQOiB7ICAgICAgICAgICAgICAgIC8qIFNraXBwZWQgKi8KKyAgICAgICAgICAgIGNoYXIgZXJyYnVmWzY0XSA7CisJICAgIGlmIChuID4gMCAmJiBuIDwgbnNrcmVhc29uKQorICAgICAgICAgICAgICAgIHNwcmludGYoIGVycmJ1ZiwgIkZpbGUgc2tpcHBlZCwgKCVzKSIsIHNrcmVhc29uW25dICkgOworCSAgICBlbHNlCisgICAgICAgICAgICAgICAgc3ByaW50ZiggZXJyYnVmLCAiRmlsZSBza2lwcGVkIiApIDsKKyAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX0VSUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBlcnJidWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgcGN0ID0gb2xkcGN0ID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFNUX0VSUjogICAgICAgICAgICAgICAgICAvKiBFcnJvciBtZXNzYWdlICovCisgICAgICAgICAgICBpZiAoIXMpIHMgPSAoY2hhciAqKWVwa3Rtc2c7CisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19FUlIsIChsb25nKSBzICk7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgcGN0ID0gb2xkcGN0ID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIFNUX1JFRlU6ICAgICAgICAgICAgICAgICAvKiBSZWZ1c2VkICovCisgICAgICAgICAgICBpZiAoKnMpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGVycmJ1Zls2NF0gOworICAgICAgICAgICAgICAgIHNwcmludGYoIGVycmJ1ZiwgIlJlZnVzZWQsICVzIiwgcyApIDsKKyAgICAgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwobG9uZykgQ1dfRVJSLChsb25nKSBlcnJidWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eShLVUlfRklMRV9UUkFOU0ZFUiwobG9uZylDV19FUlIsKGxvbmcpIlJlZnVzZWQiKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBDT01NRU5UCisgICAgICAgICAgICBwY3QgPSBvbGRwY3QgPSAwOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgU1RfSU5DOgorICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsKGxvbmcpQ1dfRVJSLChsb25nKSJJbmNvbXBsZXRlIik7CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgcGN0ID0gb2xkcGN0ID0gMDsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIFNUX01TRzoKKyAgICAgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLChsb25nKUNXX01TRywobG9uZylzKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgIC8qIEJhZCBjYWxsICovCisgICAgICAgICAgICBLdWlTZXRQcm9wZXJ0eSggS1VJX0ZJTEVfVFJBTlNGRVIsIChsb25nKSBDV19FUlIsCisgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSAiKioqIHNjcmVlbigpIGNhbGxlZCB3aXRoIGJhZCBzdGF0dXMgKioqIiApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIGNhc2UgU0NSX1RDOiB7ICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2FjdGlvbiBjb21wbGV0ZSAqLworICAgICAgICAgIGNoYXIgbXNnYnVmWzEyOF07CisgICAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfQ1AsIHRmY3BzKTsKKyAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICBzcHJpbnRmKG1zZ2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAiU1VDQ0VTUy4gIEZpbGVzOiAlbGQsIEJ5dGVzOiAlbGQsICVsZCBDUFMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGNudCAtIGZpbHJlaiwKKyAgICAgICAgICAgICAgICAgICAgICBmYnl0LAorICAgICAgICAgICAgICAgICAgICAgIHRmY3BzCisgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBDV19NU0csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBtc2didWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICB9CisgICAgICAgICAgS3VpU2V0UHJvcGVydHkoS1VJX0ZJTEVfVFJBTlNGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIENXX1RSLAorICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBoaG1tc3MoKGxvbmcpCisjaWZkZWYgR0ZUSU1FUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZwdHNlY3MgKyAwLjUpCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNlY3MKKyNlbmRpZiAvKiBHRlRJTUVSICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKKworI2lmZGVmIEdGVElNRVIKKyAgICAgICAgICBvbGRndHYgPSAoQ0tGTE9BVCkgLTEuMDsKKyNlbHNlCisgICAgICAgICAgb2xkZ3R2ID0gLTFMOworI2VuZGlmIC8qIEdGVElNRVIgKi8KKworI2lmZGVmIENPTU1FTlQKKyAgICAgICAgICBwY3QgPSAxMDA7IG9sZHBjdCA9IDA7ICAgICAgICAvKiBSZXNldCB0aGVzZSBmb3IgbmV4dCB0aW1lLiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgICBvbGR0eXAgPSAwOyBvbGRydHQgPSAtMUw7IG9sZHRyeSA9IC0xOyBvbGRsZW4gPSAtMTsKKyAgICAgICAgICBvbGR0aW0gPSAtMTsKKyAgICAgICAgICBjZW5kdyA9IDE7CisgICAgICAgICAgaWYgKHhmcmJlbCkgYmxlZXAoQlBfTk9URSk7ICAgLyogQ2xvc2Ugd2luZG93LCB0aGVuIGJlZXAuICovCisgICAgICAgICAgZnRfd2luID0gMDsgICAgICAgICAgICAgICAgICAgLyogV2luZG93IGNsb3NlZC4gKi8KKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjYXNlIFNDUl9FTTogICAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IgcGFja2V0IChmYXRhbCkgKi8KKyAgICAgICAgS3VpU2V0UHJvcGVydHkoIEtVSV9GSUxFX1RSQU5TRkVSLCAobG9uZykgQ1dfRVJSLCAobG9uZykgcyApOworICAgICAgICBpZiAoeGZyYmVsKSBibGVlcChCUF9GQUlMKTsKKyNpZmRlZiBDT01NRU5UCisgICAgICAgIHBjdCA9IG9sZHBjdCA9IDA7CisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICByZXR1cm47CisKKyAgICAgIGNhc2UgU0NSX1FFOiAgICAgICAgICAgICAgICAgICAgICAvKiBRdWFudGl0eSBlcXVhbHMgKi8KKyAgICAgIGNhc2UgU0NSX1RVOiAgICAgICAgICAgICAgICAgICAgICAvKiBVbmRlbGltaXRlZCB0ZXh0ICovCisgICAgICBjYXNlIFNDUl9UTjogICAgICAgICAgICAgICAgICAgICAgLyogVGV4dCBkZWxpbWl0ZWQgYXQgc3RhcnQgKi8KKyAgICAgIGNhc2UgU0NSX1RaOiAgICAgICAgICAgICAgICAgICAgICAvKiBUZXh0IGRlbGltaXRlZCBhdCBlbmQgKi8KKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaWdub3JlZCBpbiBmdWxsc2NyZWVuIGRpc3BsYXkpICovCisKKyAgICAgIGNhc2UgU0NSX1hEOiAgICAgICAgICAgICAgICAgICAgICAvKiBYLXBhY2tldCBkYXRhICovCisgICAgICAgIHBjdCA9IG9sZHBjdCA9IDA7CisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX05BTSwgKGxvbmcpIHMgKTsKKyAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlIFNDUl9DVzogICAgICAgICAgICAgICAgICAgICAgLyogQ2xvc2UgV2luZG93ICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICBwY3QgPSAxMDA7IG9sZHBjdCA9IDA7ICAgICAgICAgIC8qIFJlc2V0IHRoZXNlIGZvciBuZXh0IHRpbWUuICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBvbGR0eXAgPSAwOyBvbGRydHQgPSAtMUw7IG9sZHRyeSA9IC0xOyBvbGRsZW4gPSAtMTsKKyAgICAgICAgb2xkdGltID0gLTE7CisKKyAgICAgICAgZnRfd2luID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIHRoYXQgd2luZG93IGlzIGNsb3NlZC4gKi8KKyAgICAgICAgY2VuZHcgPSAxOyByZXR1cm47CisKKyAgICAgIGNhc2UgU0NSX0NEOiAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNwbGF5IGN1cnJlbnQgZGlyZWN0b3J5ICovCisgICAgICAgIEt1aVNldFByb3BlcnR5KCBLVUlfRklMRV9UUkFOU0ZFUiwgKGxvbmcpIENXX0RJUiwgKGxvbmcpIHMgKTsKKyNpZmRlZiBPUzIKKyAgICAgICAgU2F2ZUNtZE1vZGUoMCwgMCk7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgIHJldHVybjsKKworICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhZCBjYWxsICovCisgICAgICAgIEt1aVNldFByb3BlcnR5KEtVSV9GSUxFX1RSQU5TRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgQ1dfRVJSLAorICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgIioqKiBzY3JlZW4oKSBjYWxsZWQgd2l0aCBiYWQgZnVuY3Rpb24gY29kZSAqKioiCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisjZW5kaWYgLyogS1VJICovCisjZW5kaWYgLyogTUFDICovCisKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBDS19DVVJQT1MKKy8qIER1bW1pZXMgZm9yIHdoZW4gY3Vyc29yIGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZCAqLworaW50Citja19jdXJwb3Mocm93LCBjb2wpIHsKKyAgICByZXR1cm4oLTEpOworfQorCitpbnQKK2NrX2NscygpIHsKKyAgICByZXR1cm4oLTEpOworfQorCitpbnQKK2NrX2NsZW9sKCkgeworICAgIHJldHVybigtMSk7Cit9CisjZW5kaWYgLyogQ0tfQ1VSUE9TICovCisKKyNpZm5kZWYgTk9JS1NECisjaWZkZWYgSUtTREIKKworc3RydWN0IGlrc2RiZmxkIGRiZmxkW10gPSB7CisgICAvKiBPZmZzZXQgICAgTGVuZ3RoICAgIFR5cGUgICAqLworICAgIHsgREJfRkxBR1MsIGRCX0ZMQUdTLCBEQlRfSEVYIH0sICAgIC8qICAwIGRiX0ZMQUdTIEZsYWdzICovCisgICAgeyBEQl9BVFlQRSwgZEJfQVRZUEUsIERCVF9IRVggfSwgICAgLyogIDEgZGJfQVRZUEUgQXV0aCB0eXBlICovCisgICAgeyBEQl9BTU9ERSwgZEJfQU1PREUsIERCVF9IRVggfSwgICAgLyogIDMgZGJfQU1PREUgQXV0aCBtb2RlICovCisgICAgeyBEQl9TVEFURSwgZEJfU1RBVEUsIERCVF9IRVggfSwgICAgLyogIDIgZGJfU1RBVEUgU3RhdGUgKi8KKyAgICB7IERCX01ZUElELCBkQl9NWVBJRCwgREJUX0hFWCB9LCAgICAvKiAgNSBkYl9NWVBJRCBQSUQgKi8KKyAgICB7IERCX1NBRERSLCBkQl9TQUREUiwgREJUX0hFWCB9LCAgICAvKiAgNCBkYl9TQUREUiBTZXJ2ZXIgYWRkcmVzcyAqLworICAgIHsgREJfQ0FERFIsIGRCX0NBRERSLCBEQlRfSEVYIH0sICAgIC8qICA2IGRiX0NBRERSIENsaWVudCBhZGRyZXNzICovCisgICAgeyBEQl9TVEFSVCwgZEJfU1RBUlQsIERCVF9EQVQgfSwgICAgLyogIDcgZGJfU1RBUlQgU2Vzc2lvbiBzdGFydCAqLworICAgIHsgREJfTEFTVFUsIGRCX0xBU1RVLCBEQlRfREFUIH0sICAgIC8qICA4IGRiX0xBU1RVIExhc3QgdXBkYXRlICovCisgICAgeyBEQl9VTEVOLCAgZEJfVUxFTiwgIERCVF9IRVggfSwgICAgLyogIDkgZGJfVUxFTiAgVXNlcm5hbWUgbGVuZ3RoICovCisgICAgeyBEQl9ETEVOLCAgZEJfRExFTiwgIERCVF9IRVggfSwgICAgLyogMTAgZGJfRExFTiAgRGlyZWN0b3J5IG5hbWUgbGVuZ3RoICovCisgICAgeyBEQl9JTEVOLCAgZEJfSUxFTiwgIERCVF9IRVggfSwgICAgLyogMTEgZGJfSUxFTiAgSW5mbyBsZW5ndGggKi8KKyAgICB7IERCX1BBRDEsICBkQl9QQUQxLCAgREJUX1VORCB9LCAgICAvKiAxMiBkYl9QQUQxICAoUmVzZXJ2ZWQpICovCisgICAgeyBEQl9VU0VSLCAgZEJfVVNFUiwgIERCVF9TVFIgfSwgICAgLyogMTMgZGJfVVNFUiAgVXNlcm5hbWUgKi8KKyAgICB7IERCX0RJUiwgICBkQl9ESVIsICAgREJUX1NUUiB9LCAgICAvKiAxNCBkYl9ESVIgICBDdXJyZW50IERpcmVjdG9yeSAqLworICAgIHsgREJfSU5GTywgIGRCX0lORk8sICBEQlRfU1RSIH0gICAgIC8qIDE1IGRiX0lORk8gIFN0YXRlLXNwZWNpZmljIGluZm8gKi8KK307CisKK3N0YXRpYyBjaGFyIGxja25hbVtDS01BWFBBVEgrMV07ICAgICAgICAvKiBMb2NrZmlsZSBwYXRobmFtZSAqLworc3RhdGljIGNoYXIgdG1wbGNrW0NLTUFYUEFUSCsxXTsgICAgICAgIC8qIFRlbXBvcmFyeSBsb2NrZmlsZSBuYW1lICovCisKK3N0YXRpYyBjaGFyICogdXBkbW9kZSA9ICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgbW9kZSBmb3IgZm9wZW4oKSAqLworI2lmZGVmIE9TMgorICAicitiIgorI2Vsc2UKKyNpZmRlZiBWTVMKKyAgInIrYiIKKyNlbHNlCisgICJyKyIKKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyAgOworCisvKiAgRCBCIEkgTiBJIFQgIC0tICBJbml0aWFsaXplIHRoZSBJS1NEIGRhdGFiYXNlLi4uICAqLworCitpbnQKK2RiaW5pdCgpIHsKKyAgICBleHRlcm4gaW50IGRiaW5pdGVkOworICAgIGludCB4ID0gMDsKKyAgICBkZWJ1ZyhGMTEwLCJkYmluaXQgZGJkaXIgMSIsZGJkaXIsMCk7CisgICAgZGVidWcoRjExMCwiZGJpbml0IGRiZmlsZSAxIixkYmZpbGUsMCk7CisgICAgaWYgKGRiaW5pdGVkKQorICAgICAgcmV0dXJuKDApOworI2lmZGVmIE9TMgorICAgIGlmICghZGJkaXIpIHsKKyNpZmRlZiBOVAorICAgICAgICBjaGFyICogcCA9IE5VTEw7CisgICAgICAgIGlmICghaXNXaW45NSgpKSB7CisgICAgICAgICAgICBwID0gZ2V0ZW52KCJTeXN0ZW1Sb290Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwID0gZ2V0ZW52KCJ3aW5ib290ZGlyIik7CisgICAgICAgICAgICBpZiAoIXApICBwID0gZ2V0ZW52KCJ3aW5kaXIiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXApIHAgPSAiQzovIjsKKyAgICAgICAgZGJkaXIgPSBtYWxsb2Moc3RybGVuKHApKzIpOworICAgICAgICBzdHJjcHkoZGJkaXIscCk7CQkvKiBzYWZlICovCisgICAgICAgIHAgPSBkYmRpcjsKKyAgICAgICAgd2hpbGUgKCpwKSB7CisgICAgICAgICAgICBpZiAoKnAgPT0gJ1xcJykKKyAgICAgICAgICAgICAgKnAgPSAnLyc7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoocC0xKSAhPSAnLycgKSB7CisgICAgICAgICAgICAqcCsrID0gJy8nOworICAgICAgICAgICAgKnAgPSAnXDAnOworICAgICAgICB9CisjZWxzZSAvKiBOVCAqLworICAgICAgICBtYWtlc3RyKCZkYmRpciwiQzovIik7CisjZW5kaWYgLyogTlQgKi8KKyAgICB9CisjZWxzZSAvKiBPUzIgKi8KKyAgICBpZiAoIWRiZGlyKQorICAgICAgbWFrZXN0cigmZGJkaXIsSUtfREJBU0VESVIpOworI2VuZGlmIC8qIE9TMiAqLworCisgICAgaWYgKCFkYmZpbGUpIHsKKyAgICAgICAgY2hhciAqIHMgPSAiIjsKKyAgICAgICAgeCA9IHN0cmxlbihkYmRpcik7CisgICAgICAgIGlmIChkYmRpclt4LTFdICE9ICcvJykgeworICAgICAgICAgICAgcyA9ICIvIjsKKyAgICAgICAgICAgIHgrKzsKKyAgICAgICAgfQorICAgICAgICB4ICs9IChpbnQpc3RybGVuKElLX0RCQVNFRklMKTsKKyAgICAgICAgZGJmaWxlID0gKGNoYXIgKiltYWxsb2MoeCsxKTsKKyAgICAgICAgc3ByaW50ZihkYmZpbGUsIiVzJXMlcyIsZGJkaXIscyxJS19EQkFTRUZJTCk7CisgICAgfQorICAgIGRlYnVnKEYxMTAsImRiaW5pdCBkYmRpciAyIixkYmRpciwwKTsKKyAgICBkZWJ1ZyhGMTEwLCJkYmluaXQgZGJmaWxlIDIiLGRiZmlsZSwwKTsKKyAgICBteXBpZCA9IGdldHBpZCgpOyAgICAgICAgICAgICAgICAgICAvKiBHZXQgbXkgcGlkICovCisgICAgZGVidWcoRjEwMSwiZGJpbml0IG15cGlkIiwiIixteXBpZCk7CisKKyAgICBpZiAoIW15aGV4aXBbMF0pIHsgICAgICAgICAgICAgICAgICAvKiBTZXQgbXkgaGV4IElQIGFkZHJlc3MgKi8KKyNpZmRlZiBUQ1BTT0NLRVQKKyAgICAgICAgZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbXl4aXBhZGRyOworICAgICAgICBpZiAoZ2V0bG9jYWxpcGFkZHIoKSA+IC0xKSB7CisgICAgICAgICAgICBteWlwID0gbXl4aXBhZGRyOworICAgICAgICAgICAgc3ByaW50ZihteWhleGlwLCIlMDhseCIsbXlpcCk7IC8qIChOZWVkcyBmaXhpbmcgZm9yIElQdjYpICovCisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworICAgICAgICAgIGNrc3RybmNweShteWhleGlwLCIwMDAwMDAwMCIsOSk7CisgICAgfQorICAgIGRlYnVnKEYxMTEsImRiaW5pdCBteWlwIixteWhleGlwLG15aXApOworICAgIGlmICghcGVlcmhleGlwWzBdKSB7ICAgICAgICAgICAgICAgIC8qIEdldCBwZWVyJ3MgIGhleCBJUCBhZGRyZXNzICovCisjaWZkZWYgVENQU09DS0VUCisgICAgICAgIGV4dGVybiB1bnNpZ25lZCBsb25nIHBlZXJ4aXBhZGRyOworICAgICAgICBpZiAoY2tnZXRwZWVyKCkpIHsKKyAgICAgICAgICAgIHBlZXJpcCA9IHBlZXJ4aXBhZGRyOworICAgICAgICAgICAgc3ByaW50ZihwZWVyaGV4aXAsIiUwOGx4IixwZWVyaXApOyAvKiAoTmVlZHMgZml4aW5nIGZvciBJUHY2KSAqLworICAgICAgICAgICAgZGVidWcoRjExMSwiZGJpbml0IHBlZXJpcCIscGVlcmhleGlwLHBlZXJpcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJkYmluaXQgY2tnZXRwZWVyIGZhaWx1cmUiLCIiLGVycm5vKTsKKyAgICAgICAgICAgIGNrc3RybmNweShwZWVyaGV4aXAsIjAwMDAwMDAwIiw5KTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgY2tzdHJuY3B5KHBlZXJoZXhpcCwiMDAwMDAwMDAiLDkpOworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJkYmluaXQgcGVlcmlwIixwZWVyaGV4aXAscGVlcmlwKTsKKyAgICBkZWJ1ZyhGMTAxLCJkYmluaXQgZGJlbmFibGVkIiwiIixkYmVuYWJsZWQpOworICAgIGlmIChkYmVuYWJsZWQgJiYgaW5zZXJ2ZXIpIHsKKyAgICAgICAgbXlkYnNsb3QgPSBnZXRzbG90KCk7CisgICAgICAgIGRlYnVnKEYxMTEsImRiaW5pdCBnZXRzbG90Iixja2l0b2EoaWtkYm9wZW4pLHgpOworICAgICAgICBpZiAoaWtkYm9wZW4pIGRiaW5pdGVkID0gMTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisvKiAgVSBQIEQgUyBMIE8gVCAgLS0gIFVwZGF0ZSBzbG90IG4gICovCisKKy8qCisgIE9wZW5zIHRoZSBkYXRhYmFzZSBpZiBuZWNlc3NhcnksIHNlZWtzIHRvIHNsb3Qgbiwgd3JpdGVzIGN1cnJlbnQgcmVjb3JkCisgIGFuZCBhZGRzIGN1cnJlbnQgdGltZSB0byBsYXN0LXVwZGF0ZSBmaWVsZC4gIG4gaXMgdGhlIHJlY29yZCBzZXF1ZW5jZSBudW1iZXIKKyAgKDAsIDEsIDIsIC4uLiksIG5vdCB0aGUgc2VlayBwb2ludGVyLiAgIFJldHVybnMgLTEgb24gZmFpbHVyZSwgMCBvbiBzdWNjZXNzLgorKi8KK2ludAordXBkc2xvdChuKSBpbnQgbjsgeyAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBvdXIgc2xvdCAqLworICAgIGludCByYyA9IDA7CisgICAgbG9uZyBwb3NpdGlvbjsKKworICAgIGRlYnVnKEYxMTEsInVwZHNsb3QiLCJpa2Rib3BlbiIsaWtkYm9wZW4pOworICAgIGlmICghaWtkYm9wZW4pICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBpZiBub3Qgb2sgKi8KKyAgICAgIHJldHVybigwKTsKKyAgICBpZiAoIWRiZnApIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuIGRhdGFiYXNlIGlmIG5vdCBvcGVuICovCisgICAgICAgIGRiZnAgPSBmb3BlbihkYmZpbGUsdXBkbW9kZSk7ICAgLyogSW4gdXBkYXRlIG5vLXRydW5jYXRlIG1vZGUgKi8KKyAgICAgICAgaWYgKCFkYmZwKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJ1cGRzbG90IGZvcGVuIGZhaWxlZCIsZGJmaWxlLDApOworICAgICAgICAgICAgaWtkYm9wZW4gPSAwOworICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWJ1ZyhGMTExLCJ1cGRzbG90IGRiZmlsZSIsZGJmaWxlLGRiZnApOworICAgIHBvc2l0aW9uID0gbiAqIERCX1JFQ0w7CisgICAgaWYgKGZzZWVrKGRiZnAscG9zaXRpb24sMCkgPCAwKSB7ICAgLyogU2VlayB0byBkZXNpcmVkIHNsb3QgKi8KKyAgICAgICAgZGVidWcoRjExMSwidXBkc2xvdCBmc2VlayBmYWlsZWQiLGRiZmlsZSxteWRic2Vlayk7CisgICAgICAgIGlrZGJvcGVuID0gMDsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBVcGRhdGUgdGhlIHVwZGF0ZSB0aW1lICovCisgICAgICAgIHN0cm5jcHkoJmRicmVjW2RiZmxkW2RiX0xBU1RVXS5vZmZdLAorICAgICAgICAgICAgICAgIGNrZGF0ZSgpLAorICAgICAgICAgICAgICAgIGRiZmxkW2RiX0xBU1RVXS5sZW4KKyAgICAgICAgICAgICAgICApOworICAgICAgICBpZiAoZndyaXRlKGRicmVjLDEsREJfUkVDTCxkYmZwKSA8IERCX1JFQ0wpIHsgLyogV3JpdGUgdGhlIHJlY29yZCAqLworICAgICAgICAgICAgZGVidWcoRjExMCwidXBkc2xvdCBmd3JpdGUgZmFpbGVkIixkYmZpbGUsMCk7CisgICAgICAgICAgICBpa2Rib3BlbiA9IDA7CisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsdXNoIHRoZSB3cml0ZSAqLworICAgICAgICAgICAgZmZsdXNoKGRiZnApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybihyYyk7Cit9CisKKy8qICBJIE4gSSBUIFMgTCBPIFQgLS0gIEluaXRpYWxpemUgc2xvdCBuIHdpdGggbXkgaW5mbyAgKi8KKworaW50Citpbml0c2xvdChuKSBpbnQgbjsgeyAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBzbG90ICovCisgICAgaW50IGs7CisjaWZkZWYgVENQU09DS0VUCisgICAgZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGVlcnhpcGFkZHI7CisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyAgICBkZWJ1ZyhGMTAxLCJpbml0c2xvdCIsIiIsbik7CisKKyNpZmRlZiBVU0VfTUVNQ1BZCisgICAgbWVtc2V0KGRicmVjLDMyLERCX1JFQ0wpOworI2Vsc2UKKyAgICBmb3IgKGsgPSAwOyBrIDwgREJfUkVDTDsgaysrKQorICAgICAgZGJyZWNba10gPSAnXDA0MCc7CisjZW5kaWYgLyogVVNFX01FTUNQWSAqLworCisgICAgbXlmbGFncyA9IERCRl9JTlVTRTsgICAgICAgICAgICAgICAgLyogU2V0IGluLXVzZSBmbGFnICovCisgICAgbXlzdGF0ZSA9IFdfTk9USElORzsKKyAgICBteWF0eXBlID0gMEw7CisgICAgbXlhbW9kZSA9IDBMOworCisgICAgayA9IGRiZmxkW2RiX0ZMQUdTXS5sZW47ICAgICAgICAgICAgLyogTGVuZ3RoIG9mIGZsYWdzIGZpZWxkICovCisgICAgc3RybmNweSgmZGJyZWNbZGJmbGRbZGJfRkxBR1NdLm9mZl0sdWxvbmd0b2hleChteWZsYWdzLGspLGspOworCisgICAgayA9IGRiZmxkW2RiX0FUWVBFXS5sZW47CisgICAgc3RybmNweSgmZGJyZWNbZGJmbGRbZGJfQVRZUEVdLm9mZl0sdWxvbmd0b2hleChteWF0eXBlLGspLGspOworCisgICAgayA9IGRiZmxkW2RiX0FNT0RFXS5sZW47CisgICAgc3RybmNweSgmZGJyZWNbZGJmbGRbZGJfQU1PREVdLm9mZl0sdWxvbmd0b2hleChteWFtb2RlLGspLGspOworCisgICAgayA9IGRiZmxkW2RiX1NUQVRFXS5sZW47CisgICAgc3RybmNweSgmZGJyZWNbZGJmbGRbZGJfU1RBVEVdLm9mZl0sdWxvbmd0b2hleChteXN0YXRlLGspLGspOworCisgICAgayA9IGRiZmxkW2RiX1NBRERSXS5sZW47CisgICAgc3RybmNweSgmZGJyZWNbZGJmbGRbZGJfU0FERFJdLm9mZl0sdWxvbmd0b2hleChteWlwLGspLGspOworCisjaWZkZWYgVENQU09DS0VUCisgICAgY2tnZXRwZWVyKCk7CisgICAgayA9IGRiZmxkW2RiX0NBRERSXS5sZW47CisgICAgc3RybmNweSgmZGJyZWNbZGJmbGRbZGJfQ0FERFJdLm9mZl0sdWxvbmd0b2hleChwZWVyeGlwYWRkcixrKSxrKTsKKyNlbHNlCisgICAgayA9IGRiZmxkW2RiX0NBRERSXS5sZW47CisgICAgc3RybmNweSgmZGJyZWNbZGJmbGRbZGJfQ0FERFJdLm9mZl0sdWxvbmd0b2hleCgwTCxrKSxrKTsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKworICAgIGsgPSBkYmZsZFtkYl9NWVBJRF0ubGVuOworICAgIHN0cm5jcHkoJmRicmVjW2RiZmxkW2RiX01ZUElEXS5vZmZdLHVsb25ndG9oZXgobXlwaWQsayksayk7CisKKyAgICBrID0gZGJmbGRbZGJfU1RBUlRdLmxlbjsKKyAgICBzdHJuY3B5KCZkYnJlY1tkYmZsZFtkYl9TVEFSVF0ub2ZmXSxja2RhdGUoKSxrKTsKKworICAgIGsgPSBkYmZsZFtkYl9VTEVOXS5sZW47CisgICAgc3RybmNweSgmZGJyZWNbZGJmbGRbZGJfVUxFTl0ub2ZmXSwiMDAwMCIsNCk7CisKKyAgICBrID0gZGJmbGRbZGJfRExFTl0ubGVuOworICAgIHN0cm5jcHkoJmRicmVjW2RiZmxkW2RiX0RMRU5dLm9mZl0sIjAwMDAiLDQpOworCisgICAgayA9IGRiZmxkW2RiX0lMRU5dLmxlbjsKKyAgICBzdHJuY3B5KCZkYnJlY1tkYmZsZFtkYl9JTEVOXS5vZmZdLCIwMDAwIiw0KTsKKworICAgIHN0cm5jcHkoJmRicmVjW2RiZmxkW2RiX0lORk9dLm9mZl0sIklOSVQiLDQpOworICAgIHJldHVybih1cGRzbG90KG4pKTsKK30KKworaW50CitzbG90c3RhdGUoeCxzMSxzMixzMykgaW50IHg7IGNoYXIgKnMxLCAqczIsICpzMzsgeworICAgIGludCBrLCBsMSwgbDIsIGwzLCB6OworICAgIG15c3RhdGUgPSB4OworICAgIGRlYnVnKEYxMDEsInNsb3RzdGF0ZSBpa2Rib3BlbiIsIiIsaWtkYm9wZW4pOworICAgIGlmICghaWtkYm9wZW4pCisgICAgICByZXR1cm4oLTEpOworICAgIGlmICghczEpIHMxID0gIiI7CisgICAgbDEgPSBzdHJsZW4oczEpOworICAgIGlmICghczIpIHMyID0gIiI7CisgICAgbDIgPSBzdHJsZW4oczIpOworICAgIGlmICghczMpIHMzID0gIiI7CisgICAgbDMgPSBzdHJsZW4oczMpOworICAgIHN0cm5jcHkoJmRicmVjW0RCX1NUQVRFXSx1bG9uZ3RvaGV4KG15c3RhdGUsNCksNCk7CisgICAgayA9IGRiZmxkW2RiX0lMRU5dLmxlbjsKKyAgICB6ID0gbDEgKyBsMiArIGwzICsgMjsKKyAgICBpZiAoeiA+IGRCX0lORk8pCisgICAgICB6ID0gZEJfSU5GTzsKKyAgICBzdHJuY3B5KCZkYnJlY1tEQl9JTEVOXSx1bG9uZ3RvaGV4KCh1bnNpZ25lZCBsb25nKXosayksayk7CisgICAgayA9IGRiZmxkW2RiX0lORk9dLmxlbjsKKyAgICB6ID0gZGJmbGRbZGJfSU5GT10ub2ZmOworICAgIGlmIChsMSA8PSBrKSB7CisgICAgICAgIGxzZXQoJmRicmVjW3pdLHMxLGwxKzEsMzIpOworICAgICAgICB6ICs9IGwxKzE7CisgICAgICAgIGsgLT0gbDErMTsKKyAgICAgICAgaWYgKGwyIDw9IGspIHsKKyAgICAgICAgICAgIGxzZXQoJmRicmVjW3pdLHMyLGwyKzEsMzIpOworICAgICAgICAgICAgeiArPSBsMisxOworICAgICAgICAgICAgayAtPSBsMisxOworICAgICAgICAgICAgaWYgKGwzIDw9IGspCisgICAgICAgICAgICAgIGxzZXQoJmRicmVjW3pdLHMzLGssMzIpOworICAgICAgICB9CisgICAgfQorI2lmZGVmIERFQlVHCisgICAgaWYgKGRlYmxvZykgeworICAgICAgICBjaGFyIGJ1ZlsxMjhdOworICAgICAgICBpbnQgaTsKKyAgICAgICAgc3RybmNweShidWYsJmRicmVjW0RCX0lORk9dLDEyNyk7CisgICAgICAgIGJ1ZlsxMjddID0gTlVMOworICAgICAgICBmb3IgKGkgPSAxMjY7IGkgPiAwICYmIGJ1ZltpXSA9PSAzMjsgaS0tKSBidWZbaV0gPSAwOworICAgICAgICBkZWJ1ZyhGMTExLCJzbG90c3RhdGUiLGJ1ZixteXN0YXRlKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKyAgICB6ID0gdXBkc2xvdChteWRic2xvdCk7CisgICAgZGVidWcoRjEwMSwic2xvdHN0YXRlIHVwZHNsb3QiLCIiLHopOworICAgIHJldHVybih6KTsKK30KKworaW50CitzbG90ZGlyKHMxLHMyKSBjaGFyICogczEsICogczI7IHsgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgZGlyZWN0b3J5ICovCisgICAgaW50IGssIGxlbjEsIGxlbjI7CisgICAgaWYgKCFpa2Rib3BlbikKKyAgICAgIHJldHVybigtMSk7CisgICAgaWYgKCFzMSkgczEgPSAiIjsKKyAgICBpZiAoIXMyKSBzMiA9ICIiOworICAgIGxlbjEgPSBzdHJsZW4oczEpOworICAgIGxlbjIgPSBzdHJsZW4oczIpOworICAgIGsgPSBkYmZsZFtkYl9ETEVOXS5sZW47CisgICAgc3RybmNweSgmZGJyZWNbREJfRExFTl0sdWxvbmd0b2hleCgodW5zaWduZWQgbG9uZykobGVuMStsZW4yKSxrKSxrKTsKKyAgICBrID0gZGJmbGRbZGJfRElSXS5sZW47CisgICAgaWYgKGxlbjEgPiAwKSB7CisgICAgICAgIGxzZXQoJmRicmVjW2RiZmxkW2RiX0RJUl0ub2ZmXSxzMSxsZW4xLDMyKTsKKyAgICAgICAgbHNldCgmZGJyZWNbZGJmbGRbZGJfRElSXS5vZmYrbGVuMV0sczIsay1sZW4xLDMyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsc2V0KCZkYnJlY1tkYmZsZFtkYl9ESVJdLm9mZl0sczIsaywzMik7CisgICAgfQorICAgIHJldHVybih1cGRzbG90KG15ZGJzbG90KSk7Cit9CisKKy8qICBGIFIgRSBFIFMgTCBPIFQgIC0tICBGcmVlIHNsb3QgbiAgKi8KKworaW50CitmcmVlc2xvdChuKSBpbnQgbjsgeworICAgIGludCBrOworICAgIGlmICghaWtkYm9wZW4pCisgICAgICByZXR1cm4oMCk7CisgICAgZGJmbGFncyA9IDBMOworICAgIGlmIChuID09IG15ZGJzbG90KSB7CisgICAgICAgIGRiZmxhZ3MgPSBteWZsYWdzICYgfkRCRl9JTlVTRTsKKyAgICAgICAgZGJmbGFncyAmPSB+REJGX0xPR0dFRDsKKyAgICB9CisgICAgayA9IGRiZmxkW2RiX0ZMQUdTXS5sZW47CisgICAgc3RybmNweSgmZGJyZWNbZGJmbGRbZGJfRkxBR1NdLm9mZl0sdWxvbmd0b2hleChkYmZsYWdzLGspLGspOworICAgIHJldHVybih1cGRzbG90KG4pKTsKK30KKworLyogIEcgRSBUIFMgTCBPIFQgIC0tICBGaW5kIGEgZnJlZSBkYXRhYmFzZSBzbG90OyByZXR1cm5zIHNsb3QgbnVtYmVyICAqLworCitpbnQKK2dldHNsb3QoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaW5kIGEgZnJlZSBzbG90IGZvciB1cyAqLworICAgIEZJTEUgKiByZnAgPSBOVUxMOyAgICAgICAgICAgICAgICAgIC8qIFJldHVybnMgc2xvdCBudW1iZXIgKDAsIDEsIC4uLikgKi8KKyAgICBjaGFyIGlkc3RyaW5nWzY0XTsgICAgICAgICAgICAgICAgICAvKiBQSUQgc3RyaW5nIGJ1ZmZlciAoZGVjaW1hbCkgKi8KKyAgICBjaGFyIHBpZGJ1Zls2NF0sICogczsKKyAgICBpbnQgaiwgaywgbiwgeCwgcmMgPSAtMTsKKyAgICBpbnQgbG9ja2ZkLCB0cmllcywgaGF2ZXNsb3QgPSAwOworICAgIGxvbmcgbG9ja3BpZCwgaTsKKyAgICAvKiBjaGFyIGlwYnVmWzE3XTsgKi8KKworICAgIGlmICghbXloZXhpcFswXSkgICAgICAgICAgICAgICAgICAgIC8qIFNldCBteSBoZXggSVAgYWRkcmVzcyBpZiBub3Qgc2V0ICovCisgICAgICBja3N0cm5jcHkoKGNoYXIgKilteWhleGlwLCI3RjAwMDAwMSIsMzMpOworICAgIHNwcmludGYoaWRzdHJpbmcsIiUwOGx4OiUwMTBsZFxuIixteWlwLG15cGlkKTsKKyAgICBkZWJ1ZyhGMTEwLCJnZXRzbG90IGlkc3RyaW5nIiwgaWRzdHJpbmcsIDApOworCisgICAgLyogTWFrZSB0ZW1wb3JhcnkgbG9ja2ZpbGUgbmFtZSBJUC5QSUQgKGhleC5oZXgpICovCisgICAgLyogVGhpcyBzaG91bGQgZml0IGluIDE0IGNoYXJzIC0tIGh1Z2UgUElEcyBhcmUgdXN1YWxseSBub3QgcG9zc2libGUgKi8KKyAgICAvKiBvbiAxNC1jaGFyIGZpbGVuYW1lIHN5c3RlbXMuICovCisKKyAgICBzcHJpbnRmKHRtcGxjaywiJXMlMDhseC4lbHgiLGRiZGlyLG15aXAsbXlwaWQpOworICAgIGRlYnVnKEYxMTAsImdldHNsb3QgdGVtcGZpbGUiLHRtcGxjaywwKTsKKworICAgIC8qIE1ha2UgYSB0ZW1wb3JhcnkgZmlsZSAqLworCisgICAgbG9ja2ZkID0gY3JlYXQodG1wbGNrLCAwNjAwKTsKKyAgICBpZiAobG9ja2ZkIDwgMCkgeworICAgICAgICBkZWJ1ZyhGMTExLCJnZXRzbG9jayB0ZW1wIGxvY2tmaWxlIGNyZWF0ZSBmYWlsdXJlIiwgdG1wbGNrLCBlcnJubyk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIC8qIFdyaXRlIG15IChkZWNpbWFsKSBQSUQgaW50byB0aGUgdGVtcCBmaWxlICovCisKKyAgICB3cml0ZShsb2NrZmQsaWRzdHJpbmcsKGludClzdHJsZW4oaWRzdHJpbmcpKTsKKyAgICBpZiAoY2xvc2UobG9ja2ZkKSA8IDApIHsgICAgICAgICAgICAvKiBDbG9zZSBsb2NrZmlsZSAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJnZXRzbG90IGVycm9yIGNsb3NpbmcgdGVtcCBsb2NrZmlsZSIsICIiLCBlcnJubyk7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorICAgIHNwcmludGYobGNrbmFtLCIlcyVzIixkYmRpcixJS19MT0NLRklMRSk7IC8qIEJ1aWxkIGxvY2tmaWxlIG5hbWUgKi8KKyAgICBkZWJ1ZyhGMTEwLCJnZXRzbG90IGxvY2tmaWxlIixsY2tuYW0sMCk7CisKKyAgICByZnAgPSBmb3BlbihsY2tuYW0sInIiKTsgICAgICAgICAgICAvKiBTZWUgaWYgbG9ja2ZpbGUgZXhpc3RzICovCisgICAgaWYgKHJmcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgc28uLi4gKi8KKyAgICAgICAgcnNldChwaWRidWYsIiIsNjQsMCk7CisgICAgICAgIHggPSBmcmVhZChwaWRidWYsMSw2MyxyZnApOyAgICAgLyogUmVhZCBJRCBzdHJpbmcgZnJvbSBpdCAqLworICAgICAgICBmY2xvc2UocmZwKTsgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBjbG9zZSBpdCBxdWlja2x5ICovCisgICAgICAgIGRlYnVnKEYxMTAsImdldHNsb3QgbG9jayBleGlzdHMiLHBpZGJ1ZiwwKTsKKyAgICAgICAgaWYgKHggPiAwKSB7ICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgUElELCBjaGVjayBpdCAqLworICAgICAgICAgICAgY2hhciAqIHMgPSBwaWRidWY7CisgICAgICAgICAgICB3aGlsZSAoKnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNsb3dlcigqcykpICpzID0gdG91cHBlcigqcyk7CisgICAgICAgICAgICAgICAgaWYgKCpzID09ICc6JykgeworICAgICAgICAgICAgICAgICAgICAqcyA9IE5VTDsKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiZ2V0c2xvdCBsb2NrIElQIixwaWRidWYsMCk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImd0ZXNsb3QgbXkgICBJUCIsbXloZXhpcCwwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAocGlkYnVmLG15aGV4aXApKSB7IC8qIFNhbWUgSVAgYWRkcmVzcz8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2twaWQgPSBhdG9sKHMrMSk7IC8qIFllcywgbm93IGdldCBQSUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImdldHNsb3QgbG9ja3BpZCIsIiIsbG9ja3BpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIFBJRCBsb2NrcGlkIG9uIHRoaXMgY29tcHV0ZXIgaXMgYWxpdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSB6Y2hrcGlkKGxvY2twaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiZ2V0c2xvdCBQSUQgc3RhbGUscmVtb3ZpbmcgbG9jayIsIiIsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKGxja25hbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJnZXRzbG90IGxvY2tmaWxlIG9wZW4gZmFpbHVyZSIsbGNrbmFtLGVycm5vKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBUcnkgSUtfTENLVFJJRVMgKDE2KSB0aW1lcyB0byByZW5hbWUgdGVtcCBmaWxlIHRvIGxvY2tmaWxlICovCisKKyAgICBmb3IgKHRyaWVzID0gSUtfTENLVFJJRVM7IHRyaWVzID4gMDsgdHJpZXMtLSkgeworICAgICAgICBpZiAoenJlbmFtZSh0bXBsY2ssbGNrbmFtKSA9PSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWJ1ZyhGMTAxLCJnZXRzbG90IGRhdGFiYXNlIGxvY2tlZCBieSBwaWQiLCAiIiwgZGJwaWQpOworICAgICAgICBzbGVlcChJS19MQ0tTTEVFUCk7CisgICAgfQorICAgIGlmICh0cmllcyA8IDEpIHsgICAgICAgICAgICAgICAgICAgIC8qIENvdWxkbid0ICovCisgICAgICAgIGRlYnVnKEYxMTAsImdldHNsb3QgY3JlYXRlIGxvY2sgZmFpbHVyZSIsbGNrbmFtLDApOworICAgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgICAvKiBIYXZlIGxvY2ssIG9wZW4gZGF0YWJhc2UgKi8KKworICAgIGRlYnVnKEYxMTAsImdldHNsb3QgaGFzIGxvY2siLGxja25hbSwwKTsgLyogSGF2ZSBsb2NrICovCisKKyAgICBpZiAoIWRiZmlsZSkKKyAgICAgIHJldHVybigtMSk7CisKKyAgICAvKiBJZiBkYXRhYmFzZSBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgaXQuICovCisKKyAgICBkZWJ1ZyhGMTEwLCJnZXRzbG90IGRiZmlsZSIsZGJmaWxlLDApOworICAgIGlmICh6Y2hraShkYmZpbGUpIDwgMCkgeworICAgICAgICBkZWJ1ZyhGMTEwLCJnZXRzbG90IGNyZWF0aW5nIG5ldyBkYXRhYmFzZSIsZGJmaWxlLDApOworICAgICAgICB4ID0gY3JlYXQoZGJmaWxlLDA2NjApOworICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImdldHNsb3QgY3JlYXQoKSBmYWlsZWQiLCBkYmZpbGUsIGVycm5vKTsKKyAgICAgICAgICAgIGdvdG8geHNsb3Q7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UoeCk7CisgICAgfQorICAgIGRiZnAgPSBmb3BlbihkYmZpbGUsdXBkbW9kZSk7ICAgICAgIC8qIE9wZW4gaXQgaW4gdXBkYXRlIG1vZGUgKi8KKyAgICBpZiAoIWRiZnApIHsKKyAgICAgICAgZGVidWcoRjExMSwiZ2V0c2xvdCBmb3BlbiBmYWlsZWQiLGRiZmlsZSxlcnJubyk7CisgICAgICAgIGdvdG8geHNsb3Q7CisgICAgfQorICAgIC8qIE5vdyBmaW5kIGEgZnJlZSAob3IgbmV3KSBzbG90Li4uICovCisKKyAgICBkYmxhc3R1c2VkID0gMEw7ICAgICAgICAgICAgICAgICAgICAvKiBTZWVrIHBvaW50ZXIgdG8gbGFzdCByZWNvcmQgaW51c2UgKi8KKyAgICBteWRic2VlayA9IDBMOyAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVrIHBvaW50ZXIgZm9yIG15IHJlY29yZCAqLworCisgICAgLyogUXVpY2tseSByZWFkIHRoZSB3aG9sZSBkYXRhYmFzZTsgbiA9IHJlY29yZCBjb3VudGVyLCBpID0gc2VlayBwb2ludGVyICovCisKKyAgICBmb3IgKG4gPSAwLCBpID0gMDsgIWZlb2YoZGJmcCk7IGkgKz0gREJfUkVDTCwgbisrKSB7CisgICAgICAgIHggPSBmcmVhZChkYnJlYywxLERCX1JFQ0wsZGJmcCk7IC8qIFJlYWQgYSByZWNvcmQgKi8KKyAgICAgICAgaWYgKHggPCAxKSAgICAgICAgICAgICAgICAgICAgICAvKiBFT0Ygbm90IGNhdWdodCBieSBmZW9mKCkgKi8KKyAgICAgICAgICBicmVhazsKKyNpZm5kZWYgTk9GVFJVTkNBVEUKKyAgICAgICAgaWYgKHggIT0gREJfUkVDTCkgeyAgICAgICAgICAgICAvKiBXYXRjaCBvdXQgZm9yIHRyYWlsaW5nIGp1bmsgKi8KKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImdldHNsb3QgYmFkIHNpemUiLCIiLHgpOyAgLyogKFNob3VsZG4ndCBoYXBwZW4uLi4pICovCisjaWZkZWYgQ09IRVJFTlQKKyAgICAgICAgICAgIGNoc2l6ZShmaWxlbm8oZGJmcCksaSk7CisjZWxzZQorICAgICAgICAgICAgZnRydW5jYXRlKGZpbGVubyhkYmZwKSxpKTsKKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICBmc2VlayhkYmZwLGksMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2VuZGlmIC8qIE5PRlRSVU5DQVRFICovCisgICAgICAgIGRlYnVnKEYxMDEsImdldHNsb3QgcmVjb3JkIiwiIixuKTsKKyAgICAgICAgayA9IGRiZmxkW2RiX0ZMQUdTXS5vZmY7CisgICAgICAgIGogPSBkYmZsZFtkYl9GTEFHU10ubGVuOworICAgICAgICBkYmZsYWdzID0gaGV4dG91bG9uZygmZGJyZWNba10saik7CisgICAgICAgIGRlYnVnKEYwMDEsImdldHNsb3QgZGJmbGFncyIsIiIsZGJmbGFncyk7CisgICAgICAgIGsgPSBkYmZsZFtkYl9NWVBJRF0ub2ZmOworICAgICAgICBqID0gZGJmbGRbZGJfTVlQSURdLmxlbjsKKyAgICAgICAgZGJwaWQgID0gaGV4dG91bG9uZygmZGJyZWNba10saik7CisgICAgICAgIGRlYnVnKEYwMDEsImdldHNsb3QgZGJwaWQiLCIiLGRicGlkKTsKKyAgICAgICAgayA9IGRiZmxkW2RiX1NBRERSXS5vZmY7CisgICAgICAgIGogPSBkYmZsZFtkYl9TQUREUl0ubGVuOworICAgICAgICBkYmlwID0gaGV4dG91bG9uZygmZGJyZWNba10saik7CisgICAgICAgIGRlYnVnKEYwMDEsImdldHNsb3QgZGJpcCIsIiIsZGJpcCk7CisKKyAgICAgICAgaWYgKGRiZmxhZ3MgJiBEQkZfSU5VU0UpIHsgICAgICAvKiBSZW1lbWJlciBsYXN0IHNsb3QgaW4gdXNlICovCisgICAgICAgICAgICB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIGl0J3MgUkVBTExZIGluIHVzZSAqLworICAgICAgICAgICAgaWYgKGRicGlkID09IG15cGlkICYmIGRiaXAgPT0gbXlpcCkgeyAvKiBDaGVjayBmb3IgUElEID09IG15IFBJRCAqLworICAgICAgICAgICAgICAgIHggPSAxOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImdldHNsb3QgcmVjb3JkIHBpZCIsIiIsZGJwaWQpOworICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIE9yIGZvciBzdGFsZSBQSUQgKi8KKyAgICAgICAgICAgICAgICB4ID0gemNoa3BpZChkYnBpZCk7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiZ2V0c2xvdCB6Y2hrcGlkKCkiLCIiLHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF4KSB7ICAgICAgICAgICAgICAgICAgIC8qIEJvZ3VzIHJlY29yZCAqLworICAgICAgICAgICAgICAgIHggPSBmcmVlc2xvdChuKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJnZXRzbG90IHN0YWxlIHJlY29yZCBwaWQ6IGZyZWVzbG90KCkiLCIiLHgpOworICAgICAgICAgICAgICAgIGlmICh4ID4gLTEgJiYgIWhhdmVzbG90KQorICAgICAgICAgICAgICAgICAgZGJmbGFncyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogSXQncyByZWFsbHkgaW4gdXNlICovCisgICAgICAgICAgICAgICAgZGJsYXN0dXNlZCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXZlc2xvdCkgeyAgICAgICAgICAgICAgICAvKiBJZiBJIGRvbid0IGhhdmUgYSBzbG90IHlldCAqLworICAgICAgICAgICAgaWYgKCEoZGJmbGFncyAmIERCRl9JTlVTRSkpIHsgICAgICAgLyogQ2xhaW0gdGhpcyBvbmUgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJnZXRzbG90IGZyZWUgc2xvdCIsICIiLCBuKTsKKyAgICAgICAgICAgICAgICBoYXZlc2xvdCA9IDE7CisgICAgICAgICAgICAgICAgbXlkYnNlZWsgPSBpOworICAgICAgICAgICAgICAgIG15ZGJzbG90ID0gbjsgICAgICAgICAgIC8qIEJ1dCBrZWVwIGdvaW5nLi4uICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQ29tZSBoZXJlIHdpdGggaSA9PSBzZWVrIHBvaW50ZXIgdG8gZmlyc3QgcmVjb3JkIGFmdGVyIGVvZiAqLworCisgICAgaWYgKCFoYXZlc2xvdCkgeyAgICAgICAgICAgICAgICAgICAgLyogRm91bmQgbm8gZnJlZSBzbG90IHNvIGFkZCB0byBlbmQgKi8KKyAgICAgICAgZGVidWcoRjEwMSwiZ2V0c2xvdCBuZXcgc2xvdCIsIiIsbik7CisgICAgICAgIGhhdmVzbG90ID0gMTsKKyAgICAgICAgbXlkYnNlZWsgPSBpOworICAgICAgICBteWRic2xvdCA9IG47CisgICAgfQorICAgIGlrZGJvcGVuID0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIE9LIHRvIG1ha2UgZGF0YWJhc2UgZW50cmllcyAqLworICAgIGRlYnVnKEYxMDEsImdldHNsb3QgcmVjb3JkcyIsIiIsbik7CisgICAgZGVidWcoRjEwMSwiZ2V0c2xvdCBkYmxhc3R1c2VkIiwiIixkYmxhc3R1c2VkKTsKKyAgICBkZWJ1ZyhGMTAxLCJnZXRzbG90IGkiLCIiLGkpOworCisgICAgLyogVHJpbSBzdGFsZSByZWNvcmRzIGZyb20gZW5kICovCisKKyNpZm5kZWYgTk9GVFJVTkNBVEUKKyAgICBpZiAoaSA+IGRibGFzdHVzZWQrREJfUkVDTCkgeworICAgICAgICBkZWJ1ZyhGMTAxLCJnZXRzbG90IHRydW5jYXRpbmcgYXQiLCIiLGRibGFzdHVzZWQrREJfUkVDTCk7CisjaWZkZWYgQ09IRVJFTlQKKyAgICAgICAgeCA9IGNoc2l6ZShmaWxlbm8oZGJmcCksZGJsYXN0dXNlZCtEQl9SRUNMKTsKKyNlbHNlCisgICAgICAgIHggPSBmdHJ1bmNhdGUoZmlsZW5vKGRiZnApLGRibGFzdHVzZWQrREJfUkVDTCk7CisjZW5kaWYgLyogQ09IRVJFTlQgKi8KKyAgICAgICAgaWYgKHggPCAwKSAgICAgICAgICAgICAgICAgICAgICAvKiAoTm90IGZhdGFsKSAqLworICAgICAgICAgIGRlYnVnKEYxMDEsImdldHNsb3QgZnRydW5jYXRlIGZhaWxlZCIsICIiLCBlcnJubyk7CisgICAgfQorI2VuZGlmIC8qIE5PRlRSVU5DQVRFICovCisKKyAgICAvKiBJbml0aWFsaXplIG15IHJlY29yZCAqLworCisgICAgaWYgKGluaXRzbG90KG15ZGJzbG90KSA8IDApIHsKKyAgICAgICAgZGVidWcoRjEwMSwiZ2V0c2xvdCBpbml0c2xvdCgpIGVycm9yIiwiIixuKTsKKyAgICAgICAgaWtkYm9wZW4gPSAwOworICAgICAgICBnb3RvIHhzbG90OworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJnZXRzbG90IE9LIiwiIixteWRic2xvdCk7CisgICAgcmMgPSBteWRic2xvdDsgICAgICAgICAgICAgICAgICAgICAgLyogT0sgcmV0dXJuIGNvZGUgKi8KKworICB4c2xvdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVubG9jayB0aGUgZGF0YWJhc2UgYW5kIHJldHVybiAqLworICAgIGlmICh1bmxpbmsobGNrbmFtKSA8IDApIHsKKyAgICAgICAgZGVidWcoRjExMSwiZ2V0c2xvdCBsb2NrZmlsZSByZW1vdmFsIGZhaWxlZCIsbGNrbmFtLGVycm5vKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuKHJjKTsKK30KKyNlbmRpZiAvKiBJS1NEQiAqLworI2VuZGlmIC8qIE5PSUtTRCAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdXVzeS5jIGIvY2tlcm1pdC04LjAuMjExL2NrdXVzeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OWVlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2t1dXN5LmMKQEAgLTAsMCArMSw0NjI0IEBACisjaW5jbHVkZSAiY2tjc3ltLmgiCisjZGVmaW5lIFhGQVRBTCBmYXRhbAorCisvKiAgQyBLIFUgVSBTIFkgLS0gICJVc2VyIEludGVyZmFjZSIgZm9yIFVuaXggS2VybWl0LCBwYXJ0IFkgICovCisKKy8qICBDb21tYW5kLUxpbmUgQXJndW1lbnQgUGFyc2VyICovCisKKy8qCisgIEF1dGhvcnM6CisgICAgRnJhbmsgZGEgQ3J1eiA8ZmRjQGNvbHVtYmlhLmVkdT4sCisgICAgICBUaGUgS2VybWl0IFByb2plY3QsIENvbHVtYmlhIFVuaXZlcnNpdHksIE5ldyBZb3JrIENpdHkKKyAgICBKZWZmcmV5IEUgQWx0bWFuIDxqYWx0bWFuQHNlY3VyZS1lbmRwb2ludHMuY29tPgorICAgICAgU2VjdXJlIEVuZHBvaW50cyBJbmMuLCBOZXcgWW9yayBDaXR5CisKKyAgQ29weXJpZ2h0IChDKSAxOTg1LCAyMDA0LAorICAgIFRydXN0ZWVzIG9mIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gdGhlIENpdHkgb2YgTmV3IFlvcmsuCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgQy1LZXJtaXQgQ09QWUlORy5UWFQgZmlsZSBvciB0aGUKKyAgICBjb3B5cmlnaHQgdGV4dCBpbiB0aGUgY2tjbWFpLmMgbW9kdWxlIGZvciBkaXNjbGFpbWVyIGFuZCBwZXJtaXNzaW9ucy4KKyovCisjaW5jbHVkZSAiY2tjZGViLmgiCisKK2NoYXIgKiBiYW5uZXJmaWxlID0gTlVMTDsKK2NoYXIgKiBoZWxwZmlsZSA9IE5VTEw7CitleHRlcm4gaW50IHhmZXJsb2csIGZpbGVwZWVrLCBub2xpbmtzOworZXh0ZXJuIGNoYXIgKiB4ZmVyZmlsZTsKK2V4dGVybiBpbnQgZGVidGltOworCisjaW5jbHVkZSAiY2tjYXNjLmgiCisjaW5jbHVkZSAiY2tja2VyLmgiCisjaW5jbHVkZSAiY2t1Y21kLmgiCisjaW5jbHVkZSAiY2tjbmV0LmgiCisjaW5jbHVkZSAiY2t1dXNyLmgiCisjaW5jbHVkZSAiY2tjeGxhLmgiCisjaWZkZWYgQ0tfU1NMCisjaW5jbHVkZSAiY2tfc3NsLmgiCisjZW5kaWYgLyogQ0tfU1NMICovCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZmRlZiBPUzIKKyNpbmNsdWRlIDxpby5oPgorI2lmZGVmIEtVSQorI2luY2x1ZGUgImlrdWkuaCIKK2V4dGVybiBzdHJ1Y3QgX2t1aV9pbml0IGt1aV9pbml0OworI2VuZGlmIC8qIEtVSSAqLworI2VuZGlmIC8qIE9TMiAqLworCitleHRlcm4gaW50IGluc2VydmVyLCBmbmNudiwgZl9zYXZlLCB4ZmVybW9kZTsKKyNpZmRlZiBQQVRURVJOUworZXh0ZXJuIGludCBwYXR0ZXJuczsKKyNlbmRpZiAvKiBQQVRURVJOUyAqLworCisjaWZuZGVmIE5PSUNQCitleHRlcm4gaW50IGNtZGludDsKKyNlbmRpZiAvKiBOT0lDUCAqLworZXh0ZXJuIGludCB4c3VzcGVuZDsKKworI2lmZGVmIE5FVENPTk4KKyNpZmRlZiBBTllYMjUKK2V4dGVybiBpbnQgcmV2Y2FsbCwgY2xvc2dyLCBjdWRhdGE7CitleHRlcm4gY2hhciB1ZGF0YVtdOworZXh0ZXJuIGludCB4MjVmZDsKKyNlbmRpZiAvKiBBTllYMjUgKi8KKyNpZm5kZWYgVk1TCisjaWZuZGVmIE9TMgorI2lmbmRlZiBPU0sKK2V4dGVybgorI2VuZGlmIC8qIE9TSyAqLworI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIFZNUyAqLworCitpbnQgdGVsbmV0ZmQ7CitleHRlcm4gc3RydWN0IGtleXRhYiBuZXRjbWRbXTsKK2V4dGVybiBpbnQgdG5fZXhpdDsKKyNpZm5kZWYgTk9JQ1AKKyNpZm5kZWYgTk9ESUFMCitleHRlcm4gaW50IG5uZXRzLCBubmV0ZGlyOyAgICAgICAgICAgICAgLyogTmV0d29yayBzZXJ2aWNlcyBkaXJlY3RvcnkgKi8KK2V4dGVybiBjaGFyICpuZXRkaXJbXTsKK2V4dGVybiBjaGFyICpuaF9wW107ICAgICAgICAgICAgICAgICAgICAvKiBOZXR3b3JrIGRpcmVjdG9yeSBlbnRyeSBwb2ludGVycyAqLworZXh0ZXJuIGNoYXIgKm5oX3AyW107ICAgICAgICAgICAgICAgICAgIC8qIE5ldHdvcmsgZGlyZWN0b3J5IGVudHJ5IG5ldHR5cGUgKi8KK2V4dGVybiBjaGFyICpuaF9weFs0XVtNQVhETlVNUyArIDFdOworI2VuZGlmIC8qIE5PRElBTCAqLworZXh0ZXJuIGludCBuaGNvdW50OworZXh0ZXJuIGNoYXIgKiBuX25hbWU7ICAgICAgICAgICAgICAgICAgIC8qIE5ldHdvcmsgbmFtZSBwb2ludGVyICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisKKyNpZm5kZWYgTk9TUEwKK2V4dGVybiBpbnQgbm1hYzsKK2V4dGVybiBzdHJ1Y3QgbXRhYiAqbWFjdGFiOworI2VuZGlmIC8qIE5PU1BMICovCitleHRlcm4gY2hhciB1aWRidWZbXTsKKworI2lmZGVmIENLX0xPR0lOCitleHRlcm4gaW50IGxvZ2ludGltbzsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCitleHRlcm4gY2hhciAqIG15bmFtZSwgKiBkZnR0eTsKK2V4dGVybiBpbnQgaG93Y2FsbGVkOworCitleHRlcm4gY2hhciAqY2t4c3lzLCAqY2t6c3lzLCAqKnhhcmd2LCAqeGFyZzAsICoqY21saXN0LCAqY2xjbWRzOworCitleHRlcm4gaW50IGFjdGlvbiwgY2ZsZywgeGFyZ2MsIGNuZmxnLCBsb2NhbCwgcXVpZXQsIGVzY2FwZSwgbmV0d29yaywgbWRtdHlwLAorICBiZ3NldCwgYmFja2dyZCwgeGFyZ3MsIGJpbmFyeSwgcGFyaXR5LCB0dXJuLCB0dXJuY2gsIGR1cGxleCwgZmxvdywgY2xmaWxzLAorICBub2luaXQsIHN0YXlmbGcsIG5ldHR5cGUsIGNmaWxlZiwgbm9oZXJhbGQsIGNtYXNrLCBjbWRtc2ssIGV4aXRvbmNsb3NlLAorICBoYXZlbGluZSwganVzdG9uZSwgY3h0eXBlLCB4ZmluaXNoLCB0dG5wcm90bzsKKworZXh0ZXJuIGxvbmcgc3BlZWQ7CitleHRlcm4gY2hhciB0dG5hbWVbXTsKK2V4dGVybiBjaGFyICogcGlwZWRhdGEsICogY21kZmlsOworCisjaWZuZGVmIE5PWEZFUgorZXh0ZXJuIGNoYXIgKmNtYXJnLCAqY21hcmcyOworCitleHRlcm4gaW50IG5maWxzLCBzdGRvdWYsIHN0ZGluZiwgZGlzcGxhLCBtYXhycHMsIHJwc2l6LCBja3dhcm4sIHVycHNpeiwKKyAgd3Nsb3RyLCBzd2NhcHIsIGNrZGVsYXksIHJlY3Vyc2l2ZSwgcmVsaWFibGUsIHhyZWxpYWJsZSwgZm5zcGF0aCwgZm5jYWN0LAorICBjbGVhcnJxLCBzZXRyZWxpYWJsZTsKKworI2lmZGVmIFBJUEVTRU5ECitleHRlcm4gaW50IHVzZXBpcGVzLCBwaXBlc2VuZDsKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworZXh0ZXJuIGludCBwcm90b2NvbDsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1BVU0gKK2V4dGVybiBpbnQgbm9wdXNoOworI2VuZGlmIC8qIE5PUFVTSCAqLworCisjaWZkZWYgT1MyCitleHRlcm4gc3RydWN0IGtleXRhYiBvczJkZXZ0YWJbXTsKK2V4dGVybiBpbnQgbm9zMmRldjsKK2V4dGVybiBpbnQgdHRzbGlwOworZXh0ZXJuIGludCB0dF9zY3JvbGwsIHR0X2VzY2FwZTsKKyNpZmRlZiBPUzJQTQorZXh0ZXJuIGludCBvczJwbTsKKyNlbmRpZiAvKiBPUzJQTSAqLworI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgQ0tfTkVUQklPUworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgTmV0Qmlvc0FkYXB0ZXI7CisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworCisjaWZkZWYgWEZBVEFMCisjdW5kZWYgWEZBVEFMCisjZW5kaWYgLyogWEZBVEFMICovCisKKyNpZmRlZiBUTkNPREUKK19QUk9UT1RZUChzdGF0aWMgaW50IGRvdG5hcmcsIChjaGFyIHgpICk7CisjZW5kaWYgLyogVE5DT0RFICovCisjaWZkZWYgUkxPR0NPREUKK19QUk9UT1RZUChzdGF0aWMgaW50IGRvcmxnYXJnLCAoY2hhciB4KSApOworI2VuZGlmIC8qIFJMT0dDT0RFICovCisjaWZkZWYgU1NIQlVJTFRJTgorX1BST1RPVFlQKHN0YXRpYyBpbnQgZG9zc2hhcmcsIChjaGFyIHgpICk7CisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworCitpbnQgaGF2ZWZ0cHVpZCA9IDA7CQkJLyogSGF2ZSBGVFAgdXNlciBJRCAqLworc3RhdGljIGludCBoYXZlX2N4ID0gMDsJCQkvKiBIYXZlIGNvbm5lY3Rpb24gKi8KKworI2lmZGVmIE5FV0ZUUAorZXh0ZXJuIGNoYXIgKiBmdHBfaG9zdDsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKworZXh0ZXJuIGludCB3aGF0OworCisjaWZuZGVmIE5PSUNQCisjaWZuZGVmIE5PRElBTAorZXh0ZXJuIGludCBubWRtLCB0ZWxlcGhvbnk7CitleHRlcm4gc3RydWN0IGtleXRhYiBtZG10YWJbXTsKK2V4dGVybiBpbnQgdXNlcm1kbSwgZGlhbHVkdDsKKyNlbmRpZiAvKiBOT0RJQUwgKi8KK19QUk9UT1RZUChzdGF0aWMgaW50IHBtc2csIChjaGFyICopICk7CitfUFJPVE9UWVAoc3RhdGljIGludCBmbXNnLCAoY2hhciAqKSApOworc3RhdGljIGludCBwbXNnKHMpIGNoYXIgKnM7IHsgcHJpbnRmKCIlc1xuIiwgcyk7IHJldHVybigwKTsgfQorc3RhdGljIGludCBmbXNnKHMpIGNoYXIgKnM7IHsgZmF0YWwocyk7IHJldHVybigwKTsgfQorI2RlZmluZSBYRkFUQUwocykgcmV0dXJuKHdoYXQ9PVdfQ09NTUFORD9wbXNnKHMpOmZtc2cocykpCisjZWxzZQorI2RlZmluZSBYRkFUQUwgZmF0YWwKKyNlbmRpZiAvKiBOT0lDUCAqLworCisjaWZuZGVmIE5PSFRUUAorI2RlZmluZSBIVFRQX0dFVCAxCisjZGVmaW5lIEhUVFBfUFVUIDIKKyNkZWZpbmUgSFRUUF9IRUQgMworI2VuZGlmIC8qIE5PSFRUUCAqLworCisjaWZkZWYgQ0tfVVJMCisvKiBVUkxzIHdlIHJlY29nbml6ZSAqLworCisjZGVmaW5lIFVSTF9GVFAgICAgMQorI2RlZmluZSBVUkxfSFRUUCAgIDIKKyNkZWZpbmUgVVJMX0hUVFBTICAzCisjZGVmaW5lIFVSTF9JS1NEICAgNAorI2RlZmluZSBVUkxfVEVMTkVUIDUKKyNkZWZpbmUgVVJMX0xPR0lOICA2CisKK3N0cnVjdCBrZXl0YWIgdXJsdGFiW10gPSB7CisjaWZkZWYgTkVXRlRQCisgICAgImZ0cCIsICAgIFVSTF9GVFAsICAgIDAsCisjZW5kaWYgLyogTkVXRlRQICovCisjaWZuZGVmIE5PSFRUUAorICAgICJodHRwIiwgICBVUkxfSFRUUCwgICAwLAorICAgICJodHRwcyIsICBVUkxfSFRUUFMsICAwLAorI2VuZGlmIC8qIE5PSFRUUCAqLworICAgICJpa3NkIiwgICBVUkxfSUtTRCwgICAwLAorICAgICJrZXJtaXQiLCBVUkxfSUtTRCwgICAwLAorICAgICJ0ZWxuZXQiLCBVUkxfVEVMTkVULCAwLAorICAgICIiLCAwLCAwCit9OworaW50IG51cmx0YWIgPSBzaXplb2YodXJsdGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYikgLSAxOworCisjaWZuZGVmIFVSTEJVRkxFTgorI2RlZmluZSBVUkxCVUZMRU4gMTAyNAorI2VuZGlmIC8qIFVSTEJVRkxFTiAqLworc3RhdGljIGNoYXIgdXJsYnVmW1VSTEJVRkxFTl07CitzdHJ1Y3QgdXJsZGF0YSBnX3VybCA9IHtOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMfTsKKworLyogdSByIGwgcCBhIHIgcyBlICAtLSAgUGFyc2UgYSBwb3NzaWJsZSBVUkwgKi8KKworLyoKKyAgUmV0dXJucyAwIGlmIHRoZSBjYW5kaWRhdGUgZG9lcyBub3Qgc2VlbSB0byBiZSBhIFVSTC4KKyAgUmV0dXJucyAxIGlmIGl0IG1pZ2h0IGJlIGEgVVJMLCB3aXRoIHRoZSBhYm92ZSBwb2ludGVycyBzZXQgdG8gaXRzIHBpZWNlczoKKyAgICBzZXJ2aWNlIDogWyAvLyBdIFsgdXNlciBbIDogcGFzc3dvcmQgXSBAIF0gaG9zdCBbIDogc2VydmljZSBdIFsgLyBwYXRoIF0KKworICBFeGFtcGxlOiBmdHA6Ly9kcy5pbnRlcm5pYy5uZXQ6MjEvcmZjL3JmYzEyMzQudHh0CisgICAgdXJsLnN2YyA9IFtmdHBdCisgICAgdXJsLnVzciA9IFsoTlVMTCldCisgICAgdXJsLnBzdyA9IFsoTlVMTCldCisgICAgdXJsLmhvcyA9IFtkcy5pbnRlcm5pYy5uZXRdCisgICAgdXJsLnBvciA9IFsyMV0KKyAgICB1cmwucHRoID0gW3JmYy9yZmMxMjM0LnR4dF0KKworICBJdCBtaWdodCBiZSBhIFVSTCBpZiBpdCBjb250YWlucyBhIHBvc3NpYmxlIHNlcnZpY2UgbmFtZSBmb2xsb3dlZCBieSBhCisgIGEgY29sb24gKDopLiAgVGh1cyAidGVsbmV0Onh5emNvcnAuY29tIiBpcyBhIG1pbmltYWwgVVJMLCB3aGVyZWFzIGEKKyAgZnVsbC1ibG93biBleGFtcGxlIHdvdWxkIGJlOgorCisgICAgZnRwOi8vb2xnYTpzZWNyZXRAZnRwLnh5emNvcnAuY29tL3B1YmxpYy9vb2ZhLnR4dAorCisgIFRoZSBjYWxsZXIgbXVzdCB2ZXJpZnkgdGhlIHJlc3VsdHMsIGkuZS4gdGhhdCB0aGUgc2VydmljZSBzdHJpbmcgaXMgYSByZWFsCisgIFRDUCBzZXJ2aWNlLCBldGMuICBUaGlzIHJvdXRpbmUganVzdCBwYXJzZXMgdGhlIGZpZWxkcy4KKworICBzdHJ1Y3QgdXJsZGF0YSBkZWZpbmVkIGluIGNrY2tlci5oCisqLworCitpbnQKK3VybHBhcnNlKHMsdXJsKSBjaGFyICpzOyBzdHJ1Y3QgdXJsZGF0YSAqIHVybDsgeworICAgIGNoYXIgKiBwID0gTlVMTCwgKiB1cmxidWYgPSBOVUxMOworICAgIGludCB4OworCisgICAgaWYgKCFzIHx8ICF1cmwpCisgICAgICAgIHJldHVybigwKTsKKworICAgIGlmICghKnMpCisgICAgICAgIHJldHVybigwKTsKKworICAgIG1ha2VzdHIoJnVybGJ1ZixzKTsKKworICAgIGlmICh1cmwtPnNhdikgewkJCS8qIEluIGNhc2Ugd2Ugd2VyZSBjYWxsZWQgYmVmb3JlLi4uICovCisgICAgICAgIGZyZWUodXJsLT5zYXYpOworICAgICAgICB1cmwtPnNhdiA9IE5VTEw7CisgICAgfQorICAgIGlmICh1cmwtPnN2YykgeworICAgICAgICBmcmVlKHVybC0+c3ZjKTsKKyAgICAgICAgdXJsLT5zdmMgPSBOVUxMOworICAgIH0KKyAgICBpZiAodXJsLT5ob3MpIHsKKyAgICAgICAgZnJlZSh1cmwtPmhvcyk7CisgICAgICAgIHVybC0+aG9zID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHVybC0+cG9yKSB7CisgICAgICAgIGZyZWUodXJsLT5wb3IpOworICAgICAgICB1cmwtPnBvciA9IE5VTEw7CisgICAgfQorICAgIGlmICh1cmwtPnVzcikgeworICAgICAgICBmcmVlKHVybC0+dXNyKTsKKyAgICAgICAgdXJsLT51c3IgPSBOVUxMOworICAgIH0KKyAgICBpZiAodXJsLT5wc3cpIHsKKyAgICAgICAgZnJlZSh1cmwtPnBzdyk7CisgICAgICAgIHVybC0+cHN3ID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHVybC0+cHRoKSB7CisgICAgICAgIGZyZWUodXJsLT5wdGgpOworICAgICAgICB1cmwtPnB0aCA9IE5VTEw7CisgICAgfQorICAgIHAgPSB1cmxidWY7CQkJCS8qIFdhcyBhIHNlcnZpY2UgcmVxdWVzdGVkPyAqLworICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnOicpCQkvKiBMb29rIGZvciBjb2xvbiAqLworICAgICAgcCsrOworICAgIGlmICgqcCA9PSAnOicpIHsgICAgICAgICAgICAgICAgICAgIC8qIEhhdmUgYSBjb2xvbiAqLworICAgICAgICAqcCsrID0gTlVMOwkJCS8qIEdldCBzZXJ2aWNlIG5hbWUgb3IgbnVtYmVyICovCisgICAgICAgIGlmICgqcCA9PSAnOicpCQkJLyogYSBzZWNvbmQgY29sb24gKi8KKyAgICAgICAgICAqcCsrID0gTlVMOwkJCS8qIGdldCByaWQgb2YgdGhhdCBvbmUgdG9vICovCisgICAgICAgIHdoaWxlICgqcCA9PSAnLycpICpwKysgPSBOVUw7CS8qIGFuZCBzbGFzaGVzICovCisjaWZkZWYgQ09NTUVOVAorICAgICAgICAvKiBUcmFpbGluZyBzbGFzaCBpcyBwYXJ0IG9mIHBhdGggLSBsZWF2ZSBpdCAtIGphbHRtYW4gKi8KKyAgICAgICAgeCA9IHN0cmxlbihwKTsgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgcmVtYWluZGVyICovCisgICAgICAgIGlmIChwW3gtMV0gPT0gJy8nKSAgICAgICAgICAgICAgLyogSWYgdGhlcmUgaXMgYSB0cmFpbGluZyBzbGFzaCAqLworICAgICAgICAgIHBbeC0xXSA9IE5VTDsJCQkvKiByZW1vdmUgaXQuICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICAgICBpZiAodXJsYnVmWzBdKSB7CQkvKiBBbnl0aGluZyBsZWZ0PyAqLworICAgICAgICAgICAgY2hhciAqcSA9IHAsICpyID0gcCwgKncgPSBwOworCSAgICBtYWtlc3RyKCZ1cmwtPnN2Yyx1cmxidWYpOworCisgICAgICAgICAgICB3aGlsZSAoKnAgIT0gTlVMICYmICpwICE9ICdAJykgLyogbG9vayBmb3IgQCAqLworCSAgICAgIHArKzsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnQCcpIHsJCS8qIFNpZ25pZmllcyB1c2VyIElELCBtYXliZSBwYXNzd29yZCAqLworICAgICAgICAgICAgICAgICpwKysgPSBOVUw7CisJCXVybC0+aG9zID0gcDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKncgIT0gTlVMICYmICp3ICE9ICc6JykKKyAgICAgICAgICAgICAgICAgIHcrKzsKKyAgICAgICAgICAgICAgICBpZiAoKncgPT0gJzonKQorICAgICAgICAgICAgICAgICAgKncrKyA9IE5VTDsKKwkJdXJsLT51c3IgPSByOwkJLyogVXNlcm5hbWUgKi8KKwkJaWYgKCp3KQorCQkgIHVybC0+cHN3ID0gdzsJCS8qIFBhc3N3b3JkICovCisgICAgICAgICAgICAgICAgcSA9IHA7CisgICAgICAgICAgICB9IGVsc2UgewkJCS8qIE5vIHVzZXJuYW1lIG9yIHBhc3N3b3JkICovCisgICAgICAgICAgICAgICAgcCA9IHE7CisJCXVybC0+aG9zID0gcDsKKyAgICAgICAgICAgIH0KKwkgICAgZGVidWcoRjExMSwidXJscGFyc2UgdXJsLT51c3IiLHVybC0+dXNyLHVybC0+dXNyKTsKKwkgICAgZGVidWcoRjExMSwidXJscGFyc2UgdXJsLT5wc3ciLHVybC0+dXNyLHVybC0+cHN3KTsKKwkgICAgZGVidWcoRjExMSwidXJscGFyc2UgdXJsLT5ob3MiLHVybC0+dXNyLHVybC0+aG9zKTsKKworICAgICAgICAgICAgd2hpbGUgKCpwICE9IE5VTCAmJiAqcCAhPSAnOicgJiYgKnAgIT0gJy8nKQkvKiBQb3J0PyAqLworICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBpZiAoKnAgPT0gJzonKSB7CQkvKiBUQ1AgcG9ydCAqLworICAgICAgICAgICAgICAgICpwKysgPSBOVUw7CisgICAgICAgICAgICAgICAgciA9IHA7CisJCXVybC0+cG9yID0gcjsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKnAgIT0gTlVMICYmICpwICE9ICcvJykKKwkJICBwKys7CisgICAgICAgICAgICAgICAgLyogJy8nIGlzIHBhcnQgb2YgcGF0aCwgbGVhdmUgaXQgdW50aWwgd2UgY2FuIGNvcHkgKi8KKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gJy8nKSB7CisJCSAgICBtYWtlc3RyKCZ1cmwtPnB0aCxwKTsgIC8qIFBhdGggKi8KKwkJICAgICpwID0gTlVMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CQkJLyogTm8gcG9ydCAqLworICAgICAgICAgICAgICAgIC8qICcvJyBpcyBwYXJ0IG9mIHBhdGgsIGxlYXZlIGl0ICovCisgICAgICAgICAgICAgICAgaWYgKCpwID09ICcvJykgeworCQkgICAgbWFrZXN0cigmdXJsLT5wdGgscCk7ICAvKiBQYXRoICovCisJCSAgICAqcCA9IE5VTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkvKiBDb3B5IG5vbi1OVUxMIHJlc3VsdCBzdHJpbmdzICovCisJaWYgKHVybC0+c3ZjKSBpZiAoKnVybC0+c3ZjKSB7CisgICAgICAgICAgICBwID0gdXJsLT5zdmM7CisgICAgICAgICAgICB1cmwtPnN2YyA9IE5VTEw7CisgICAgICAgICAgICBtYWtlc3RyKCZ1cmwtPnN2YyxwKTsKKyAgICAgICAgfQorCWlmICh1cmwtPmhvcykgaWYgKCp1cmwtPmhvcykgeworICAgICAgICAgICAgcCA9IHVybC0+aG9zOworICAgICAgICAgICAgdXJsLT5ob3MgPSBOVUxMOworICAgICAgICAgICAgbWFrZXN0cigmdXJsLT5ob3MscCk7CisgICAgICAgIH0KKwlpZiAodXJsLT5wb3IpIGlmICgqdXJsLT5wb3IpIHsKKyAgICAgICAgICAgIHAgPSB1cmwtPnBvcjsKKyAgICAgICAgICAgIHVybC0+cG9yID0gTlVMTDsKKyAgICAgICAgICAgIG1ha2VzdHIoJnVybC0+cG9yLHApOworICAgICAgICB9CisvKgorICBXQVJOSU5HIChXZWQgT2N0ICA5IDE2OjA5OjAzIDIwMDIpOiBXZSBub3cgYWxsb3cgdGhlIHVzZXJuYW1lIGFuZAorICBwYXNzd29yZCB0byBiZSBlbXB0eSBzdHJpbmdzLiAgVGhlc2UgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgZnJvbSBudWxsCisgIHBvaW50ZXJzOiBhbiBlbXB0eSBzdHJpbmcgbWVhbnMgdGhlIFVSTCBpbmNsdWRlZCB1c2VybmFtZSBhbmQvb3IgcGFzc3dvcmQKKyAgZmllbGRzIHRoYXQgd2VyZSBlbXB0eSwgZS5nLiBmdHA6Ly86QGZ0cC54eXpjb3JwLmNvbS9zb21lcGF0aC9zb21lZmlsZSwKKyAgd2hpY2ggY2F1c2VzIHRoZSBjbGllbnQgdG8gcHJvbXB0IGZvciB0aGUgdXNlcm5hbWUgYW5kL29yIHBhc3N3b3JkLgorKi8KKwlpZiAodXJsLT51c3IpIC8qIGlmICgqdXJsLT51c3IpICovIHsKKyAgICAgICAgICAgIHAgPSB1cmwtPnVzcjsKKyAgICAgICAgICAgIHVybC0+dXNyID0gTlVMTDsKKyAgICAgICAgICAgIG1ha2VzdHIoJnVybC0+dXNyLHApOworICAgICAgICB9CisJaWYgKHVybC0+cHN3KSAvKiBpZiAoKnVybC0+cHN3KSAqLyB7CisgICAgICAgICAgICBwID0gdXJsLT5wc3c7CisgICAgICAgICAgICB1cmwtPnBzdyA9IE5VTEw7CisgICAgICAgICAgICBtYWtlc3RyKCZ1cmwtPnBzdyxwKTsKKyAgICAgICAgfQorICAgICAgICAvKiBTYXZlIGEgY29weSBvZiB0aGUgZnVsbCB1cmwgaWYgb25lIHdhcyBmb3VuZC4gKi8KKwlpZiAodXJsLT5zdmMpIAorCSAgbWFrZXN0cigmdXJsLT5zYXYscyk7CisgICAgICAgIGZyZWUodXJsYnVmKTsKKwlyZXR1cm4odXJsLT5zdmMgPyAxIDogMCk7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBDS19VUkwgKi8KKworI2lmbmRlZiBOT0NNREwKKworY2hhciAqaGxwMVtdID0geworI2lmbmRlZiBOT0lDUAorIiBbZmlsZW5hbWVdIFsteCBhcmcgWy14IGFyZ10uLi5bLXl5eV0uLl0gWyA9IHRleHQgXSBdXG4iLAorI2Vsc2UKKyJbLXggYXJnIFsteCBhcmddLi4uWy15eXldLi5dXG4iLAorI2VuZGlmIC8qIE5PSUNQICovCisiXG4iLAorIiAgLXggaXMgYW4gb3B0aW9uIHJlcXVpcmluZyBhbiBhcmd1bWVudCwgLXkgYW4gb3B0aW9uIHdpdGggbm8gYXJndW1lbnQuXG4iLAorIiAgSWYgdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiBhIGZpbGUsIGludGVyYWN0aXZlLVxuIiwKKyIgIG1vZGUgY29tbWFuZHMgYXJlIGV4ZWN1dGVkIGZyb20gdGhlIGZpbGUuICBUaGUgJz0nIGFyZ3VtZW50IHRlbGxzIEtlcm1pdFxuIiwKKyIgIG5vdCB0byBwYXJzZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBjb21tYW5kIGxpbmUsIGJ1dCB0byBtYWtlIHRoZSB3b3Jkc1xuIiwKKyIgIGZvbGxvd2luZyAnPScgYXZhaWxhYmxlIGFzIFxcJTEsIFxcJTIsIC4uLiBcXCU5LiAgVGhlIGNvbW1hbmQgZmlsZSBcCisoaWYgYW55KVxuIiwKKyIgIGlzIGV4ZWN1dGVkIGJlZm9yZSB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMuXG4iLAorIlxuIiwKKyNpZm5kZWYgTk9JQ1AKKyJJZiBubyBhY3Rpb24gY29tbWFuZCBpcyBpbmNsdWRlZCwgb3IgLVMgaXMsIHRoZW4gYWZ0ZXIgdGhlIGNvbW1hbmQgbGluZSBpc1xuIiwKKyJleGVjdXRlZCwgS2VybWl0IGlzc3VlcyBpdHMgcHJvbXB0IGFuZCB3YWl0cyBmb3IgeW91IHRvIHR5cGUgY29tbWFuZHMuXG4iLAorI2Vsc2UKKyJPcGVyYXRpb24gYnkgY29tbWFuZC1saW5lIG9wdGlvbnMgb25seS5cbiIsCisjZW5kaWYgLyogTk9JQ1AgKi8KKyIiCit9OworCitzdGF0aWMKK2NoYXIgKmhscDJbXSA9IHsKKyIgIFtvcHRpb24tbGlzdF0gaG9zdFs6cG9ydF0gW3BvcnRdXG4iLAorIiAgVGhlIG9wdGlvbi1saXN0IGNvbnNpc3RzIG9mIHplcm8sIG9uZSwgb3IgbW9yZSBvZjpcbiIsCisiICAtOCAgICAgICAgICAgICAgICBOZWdvdGlhdGUgVGVsbmV0IEJpbmFyeSBpbiBib3RoIGRpcmVjdGlvbnNcbiIsCisiICAtYSAgICAgICAgICAgICAgICBSZXF1aXJlIHVzZSBvZiBUZWxuZXQgYXV0aGVudGljYXRpb25cbiIsCisiICAtZCAgICAgICAgICAgICAgICBUdXJuIG9uIGRlYnVnIG1vZGVcbiIsCisiICAtRSAgICAgICAgICAgICAgICBObyBlc2NhcGUgY2hhcmFjdGVyXG4iLAorIiAgLUsgICAgICAgICAgICAgICAgUmVmdXNlIHVzZSBvZiBhdXRoZW50aWNhdGlvbjsgZG8gbm90IHNlbmQgdXNlcm5hbWVcbiIsCisiICAtbCB1c2VyICAgICAgICAgICBTZXQgdXNlcm5hbWUgYW5kIHJlcXVlc3QgVGVsbmV0IGF1dGhlbnRpY2F0aW9uXG4iLAorIiAgLUwgICAgICAgICAgICAgICAgTmVnb3RpYXRlIFRlbG5ldCBCaW5hcnkgT3V0cHV0IG9ubHlcbiIsCisiICAteCAgICAgICAgICAgICAgICBSZXF1aXJlIEVuY3J5cHRpb25cbiIsCisiICAtRCAgICAgICAgICAgICAgICBEaXNhYmxlIGZvcndhcmQtWFxuIiwKKyIgIC1UIGNlcnQ9ZmlsZSAgICAgIFVzZSBjZXJ0aWZpY2F0ZSBpbiBmaWxlXG4iLAorIiAgLVQga2V5PWZpbGUgICAgICAgVXNlIHByaXZhdGUga2V5IGluIGZpbGVcbiIsCisiICAtVCBjcmxmaWxlPWZpbGUgICBVc2UgQ1JMIGluIGZpbGVcbiIsCisiICAtVCBjcmxkaXI9ZGlyICAgICBVc2UgQ1JMcyBpbiBkaXJlY3RvcnlcbiIsCisiICAtVCBjaXBoZXI9c3RyaW5nICBVc2Ugb25seSBjaXBoZXJzIGluIHN0cmluZ1xuIiwKKyIgIC1mICAgICAgICAgICAgICAgIEZvcndhcmQgY3JlZGVudGlhbHMgdG8gaG9zdFxuIiwKKyIgIC1rIHJlYWxtICAgICAgICAgIFNldCBkZWZhdWx0IEtlcmJlcm9zIHJlYWxtXG4iLAorIiIKK307CisKK3N0YXRpYworY2hhciAqaGxwM1tdID0geyAgICAgICAgLyogcmxvZ2luICovCisiICBbb3B0aW9uLWxpc3RdIGhvc3RbOnBvcnRdIFtwb3J0XVxuIiwKKyIgIFRoZSBvcHRpb24tbGlzdCBjb25zaXN0cyBvZiB6ZXJvLCBvbmUsIG9yIG1vcmUgb2Y6XG4iLAorIiAgLWQgICAgICAgICAgICAgICAgVHVybiBvbiBkZWJ1ZyBtb2RlXG4iLAorIiAgLWwgdXNlciAgICAgICAgICAgU2V0IHVzZXJuYW1lXG4iLAorIiIKK307CisKK3N0YXRpYworY2hhciAqaGxwNFtdID0geyAgICAgICAgLyogc3NoICovCisiICBbb3B0aW9uLWxpc3RdIGhvc3RbOnBvcnRdIFtwb3J0XVxuIiwKKyIgIFRoZSBvcHRpb24tbGlzdCBjb25zaXN0cyBvZiB6ZXJvLCBvbmUsIG9yIG1vcmUgb2Y6XG4iLAorIiAgLWQgICAgICAgICAgICAgICAgVHVybiBvbiBkZWJ1ZyBtb2RlXG4iLAorIiAgLWwgdXNlciAgICAgICAgICAgU2V0IHVzZXJuYW1lXG4iLAorIiIKK307CisKKy8qIENvbW1hbmQtbGluZSBvcHRpb24gaGVscCBsaW5lcy4gIFVwZGF0ZSB0aGlzIHdoZW4gYWRkaW5nIG5ldyBvcHRpb25zISAqLworCitjaGFyICogb3B0aGxwWzEyOF07ICAgICAgICAgICAgICAgICAgICAgLyogT3B0aW9uIGhlbHAgKi8KK2NoYXIgKiBhcmdobHBbMTI4XTsgICAgICAgICAgICAgICAgICAgICAvKiBBcmd1bWVudCBmb3Igb3B0aW9uICovCitpbnQgb3B0YWN0WzEyOF07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0aW9uLW9wdGlvbiBmbGFnICovCisKK1ZPSUQKK2ZhdGFsMihtc2cxLG1zZzIpIGNoYXIgKm1zZzEsICptc2cyOyB7CisgICAgY2hhciBidWZbMjU2XTsKKyAgICBpZiAoIW1zZzEpIG1zZzEgPSAiIjsKKyAgICBpZiAoIW1zZzIpIG1zZzIgPSAiIjsKKyAgICBja21ha21zZyhidWYsMjU2LCJcIiIsbXNnMSwiXCIgLSAiLG1zZzIpOworI2lmbmRlZiBOT0lDUAorICAgIGlmICh3aGF0ID09IFdfQ09NTUFORCkKKyAgICAgIHByaW50ZigiJXNcbiIsYnVmKTsKKyAgICBlbHNlCisjZW5kaWYgLyogTk9JQ1AgKi8KKyAgICAgIGZhdGFsKChjaGFyICopYnVmKTsKK30KKworc3RhdGljIFNJR1RZUAorI2lmZGVmIENLX0FOU0kKK2NsX2ludChpbnQgZHVtbXkpCisjZWxzZSAvKiBDS19BTlNJICovCitjbF9pbnQoZHVtbXkpIGludCBkdW1teTsKKyNlbmRpZiAvKiBDS19BTlNJICovCit7CQkJCQkvKiBDb21tYW5kLWxpbmUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKyAgICBkb2V4aXQoQkFEX0VYSVQsMSk7CisgICAgU0lHUkVUVVJOOworfQorCisjaWZkZWYgTkVXRlRQCitleHRlcm4gaW50IGZ0cF9hY3Rpb24sIGZ0cF9jbWRsaW47CisKK3N0YXRpYyBpbnQKK3h4X2Z0cChob3N0LCBwb3J0KSBjaGFyICogaG9zdCwgKiBwb3J0OyB7CisjaWZkZWYgQ0tfVVJMCisgICAgZXh0ZXJuIGludCBoYXZldXJsOworI2VuZGlmIC8qIENLX1VSTCAqLworICAgIGV4dGVybiBjaGFyICogZnRwX2xvZ25hbWU7CisgICAgaW50IHVzZV90bHMgPSAwOworICAgIGNoYXIgKiBwOworCisgICAgaWYgKHBvcnQpIGlmICghKnBvcnQpIHBvcnQgPSBOVUxMOworCisgICAgaWYgKCFob3N0KQorICAgICAgcmV0dXJuKDApOworICAgIGlmICghKmhvc3QpCisgICAgICByZXR1cm4oMCk7CisgICAgZGVidWcoRjExMSwiZnRwIHh4X2Z0cCBob3N0IixmdHBfaG9zdCxoYXZlZnRwdWlkKTsKKyAgICBkZWJ1ZyhGMTExLCJmdHAgeHhfZnRwIHVpZGJ1ZiAxIix1aWRidWYsaGF2ZWZ0cHVpZCk7CisgICAgZnRwX2NtZGxpbiA9IDE7CQkJLyogMSA9IEZUUCBzdGFydGVkIGZyb20gY29tbWFuZCBsaW5lICovCisgICAgaWYgKG5maWxzID4gMCkKKyAgICAgIGZ0cF9jbWRsaW4rKzsJCQkvKiAyID0gc2FtZSBwbHVzIGZpbGUgdHJhbnNmZXIgKi8KKworI2lmbmRlZiBOT1VSTAorICAgIGRlYnVnKEYxMTEsImZ0cCB4eF9mdHAgZ191cmwudXNyIixnX3VybC51c3IsZ191cmwudXNyKTsKKyAgICBpZiAoaGF2ZXVybCAmJiBnX3VybC51c3IpIHsJCS8qIFdlZCBPY3QgIDkgMTU6MTU6MjIgMjAwMiAqLworCWlmICghKihnX3VybC51c3IpKSB7CQkvKiBGb3JjZSB1c2VybmFtZSBwcm9tcHQgaWYgKi8KKwkgICAgaGF2ZWZ0cHVpZCA9IDA7CQkvKiAiZnRwOi8vOkBob3N0IiBnaXZlbi4gKi8KKwkgICAgdWlkYnVmWzBdID0gTlVMOworCSAgICBtYWtlc3RyKCZmdHBfbG9nbmFtZSxOVUxMKTsKKwl9CSAgCisJZGVidWcoRjExMSwiZnRwIHh4X2Z0cCB1aWRidWYgMiIsdWlkYnVmLGhhdmVmdHB1aWQpOworICAgIH0KKyNlbmRpZiAvKiBOT1VSTCAqLworICAgIGRlYnVnKEYxMTEsImZ0cCB4eF9mdHAgdWlkYnVmIDMiLHVpZGJ1ZixoYXZlZnRwdWlkKTsKKyAgICBpZiAoaGF2ZWZ0cHVpZCkgeworCW1ha2VzdHIoJmZ0cF9sb2duYW1lLHVpZGJ1Zik7CisJZGVidWcoRjExMSwiZnRwX2xvZ25hbWUiLGZ0cF9sb2duYW1lLGhhdmVmdHB1aWQpOworICAgIH0KKyAgICBpZiAoIXBvcnQpIHsKKwlpZiAoKHAgPSBja3N0cmNocihmdHBfaG9zdCwnOicpKSkKKwkgICpwKysgPSBOVUw7CisJcG9ydCA9IHA7CisgICAgfQorICAgIGlmICghcG9ydCkgeworI2lmZGVmIENLX1VSTAorICAgICAgICBpZiAoaGF2ZXVybCkgeworCSAgICBpZiAoZ191cmwucG9yKSAKKwkgICAgICBwb3J0ID0gZ191cmwucG9yOworICAgICAgICAgICAgZWxzZSBpZiAoZ191cmwuc3ZjKQorCSAgICAgIHBvcnQgPSBnX3VybC5zdmM7CisgICAgICAgICAgICBlbHNlIAorCSAgICAgIHBvcnQgPSAiZnRwIjsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogQ0tfVVJMICovCisJICBwb3J0ID0gImZ0cCI7CisgICAgfQorCisjaWZkZWYgQ0tfU1NMCisgICAgaWYgKGhhdmV1cmwgJiYgZ191cmwuc3ZjKQorICAgICAgdXNlX3RscyA9ICFja3N0cmNtcCgiZnRwcyIsZ191cmwuc3ZjLC0xLDApOworI2VuZGlmIC8qIENLX1NTTCAqLworCisgICAgaWYgKGZ0cG9wZW4oZnRwX2hvc3QscG9ydCx1c2VfdGxzKSA8IDEpCisgICAgICByZXR1cm4oLTEpOworICAgIGRlYnVnKEYxMTEsImZ0cCB4eF9mdHAgYWN0aW9uIixja2N0b2EoKGNoYXIpZnRwX2FjdGlvbiksbmZpbHMpOworICAgIGlmIChuZmlscyA+IDApIHsKKwlzd2l0Y2ggKGZ0cF9hY3Rpb24pIHsKKwkgIGNhc2UgJ2cnOgorCSAgICByZXR1cm4oY21kbGluZ2V0KHN0YXlmbGcpKTsKKwkgIGNhc2UgJ3AnOgorCSAgY2FzZSAncyc6CisJICAgIHJldHVybihjbWRsaW5wdXQoc3RheWZsZykpOworCX0KKyAgICB9CisgICAgcmV0dXJuKDEpOworfQorI2VuZGlmIC8qIE5FV0ZUUCAqLworCisKKyNpZm5kZWYgTk9IVFRQCitzdGF0aWMKK2NoYXIgKiBodHRwX2hscFtdID0geworICAgICIgLWggICAgICAgICAgICAgVGhpcyBtZXNzYWdlLlxuIiwKKyAgICAiIC1kICAgICAgICAgICAgIERlYnVnIHRvIGRlYnVnLmxvZy5cbiIsCisgICAgIiAtUyAgICAgICAgICAgICBTdGF5IChpc3N1ZSBjb21tYW5kIHByb21wdCB3aGVuIGRvbmUpLlxuIiwKKyAgICAiIC1ZICAgICAgICAgICAgIERvIG5vdCBleGVjdXRlIEtlcm1pdCBpbml0aWFsaXphdGlvbiBmaWxlLlxuIiwKKyAgICAiIC1xICAgICAgICAgICAgIFF1aWV0IChzdXBwcmVzcyBtb3N0IG1lc3NhZ2VzKS5cbiIsCisgICAgIiAtdSBuYW1lICAgICAgICBVc2VybmFtZS5cbiIsCisgICAgIiAtUCBwYXNzd29yZCAgICBQYXNzd29yZC5cbiIsCisgICAgIiAtZyBwYXRobmFtZSAgICBHZXQgcmVtb3RlIHBhdGhuYW1lLlxuIiwKKyAgICAiIC1wIHBhdGhuYW1lICAgIFB1dCByZW1vdGUgcGF0aG5hbWUuXG4iLAorICAgICIgLUggcGF0aG5hbWUgICAgSGVhZCByZW1vdGUgcGF0aG5hbWUuXG4iLAorICAgICIgLWwgcGF0aG5hbWUgICAgTG9jYWwgcGF0aCBmb3IgLWcsIC1wLCBhbmQgLUguXG4iLAorI2lmZGVmIENLX1NTTAorICAgICIgLXogb3B0Wz12YWx1ZV0gU2VjdXJpdHkgb3B0aW9ucy4uLlxuIiwKKyAgICAiICAgIGNlcnQ9ZmlsZSAgIENsaWVudCBjZXJ0aWZpY2F0ZSBmaWxlXG4iLAorICAgICIgICAgY2VydHNvayAgICAgQWNjZXB0IGFsbCBjZXJ0aWZpY2F0ZXNcbiIsCisgICAgIiAgICBrZXk9ZmlsZSAgICBDbGllbnQgcHJpdmF0ZSBrZXkgZmlsZVxuIiwKKyAgICAiICAgIHNlY3VyZSAgICAgIFVzZSBTU0xcbiIsCisgICAgIiAgICB2ZXJpZnk9biAgICAwID0gbm9uZSwgMSA9IHBlZXIgLCAyID0gY2VydGlmaWNhdGUgcmVxdWlyZWRcbiIsCisjZW5kaWYgLyogQ0tfU1NMICovCisgICAgIiIKK307CisKKyNkZWZpbmUgSFRfQ0VSVEZJIDAKKyNkZWZpbmUgSFRfT0tDRVJUIDEKKyNkZWZpbmUgSFRfS0VZICAgIDIKKyNkZWZpbmUgSFRfU0VDVVJFIDMKKyNkZWZpbmUgSFRfVkVSSUZZIDQKKworc3RhdGljIHN0cnVjdCBrZXl0YWIgaHR0cHp0YWJbXSA9IHsKKyAgICB7ICJjZXJ0IiwgICAgSFRfQ0VSVEZJLCBDTV9BUkcgfSwKKyAgICB7ICJjZXJ0c29rIiwgSFRfT0tDRVJULCAwIH0sCisgICAgeyAia2V5IiwgICAgIEhUX0tFWSwgICAgQ01fQVJHIH0sCisgICAgeyAic2VjdXJlIiwgIEhUX1NFQ1VSRSwgMCB9LAorICAgIHsgInZlcmlmeSIsICBIVF9WRVJJRlksIENNX0FSRyB9LAorICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmh0dHB6dGFiID0gc2l6ZW9mKGh0dHB6dGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSAtIDE7CisjZW5kaWYgLyogTk9IVFRQICovCisKKy8qICBVIFMgQSBHIEUgKi8KKworVk9JRAordXNhZ2UoKSB7CisjaWZkZWYgTUlOSVgKKyAgICBjb25vbCgiVXNhZ2U6ICIpOworICAgIGNvbm9sKHhhcmcwKTsKKyAgICBjb25vbCgiIFsteCBhcmcgWy14IGFyZ10uLi5bLXl5eV0uLl0gXVxuIik7CisjZWxzZQorICAgIGNvbm9sKCJVc2FnZTogIik7CisgICAgY29ub2woeGFyZzApOworICAgIGlmIChob3djYWxsZWQgPT0gSV9BTV9LRVJNSVQgfHwgaG93Y2FsbGVkID09IElfQU1fSUtTRCB8fAorICAgICAgICBob3djYWxsZWQgPT0gSV9BTV9TU0hTVUIpCisgICAgICBjb25vbGEoaGxwMSk7CisgICAgZWxzZSBpZiAoaG93Y2FsbGVkID09IElfQU1fVEVMTkVUKQorICAgICAgY29ub2xhKGhscDIpOworICAgIGVsc2UgaWYgKGhvd2NhbGxlZCA9PSBJX0FNX1JMT0dJTikKKyAgICAgIGNvbm9sYShobHAzKTsKKyAgICBlbHNlIGlmIChob3djYWxsZWQgPT0gSV9BTV9TU0gpCisgICAgICBjb25vbGEoaGxwNCk7CisgICAgaWYgKGhvd2NhbGxlZCA9PSBJX0FNX0tFUk1JVCB8fCBob3djYWxsZWQgPT0gSV9BTV9JS1NEIHx8CisgICAgICAgIGhvd2NhbGxlZCA9PSBJX0FNX1NTSFNVQikgeworCWludCBjOworCWNvbm9sbCgiIik7CisJY29ub2xsKCJDb21wbGV0ZSBsaXN0aW5nIG9mIGNvbW1hbmQtbGluZSBvcHRpb25zOiIpOworCWNvbm9sbCgiIik7CisJZm9yIChjID0gMzE7IGMgPCAxMjg7IGMrKykgeworCSAgICBpZiAoIW9wdGhscFtjXSkKKwkgICAgICBjb250aW51ZTsKKwkgICAgaWYgKGFyZ2hscFtjXSkgeworCQlwcmludGYoIiAtJWMgPGFyZz4lc1xuIiwKKwkJICAgICAgIChjaGFyKWMsCisJCSAgICAgICAob3B0YWN0W2NdID8gIiAoYWN0aW9uIG9wdGlvbikiIDogIiIpCisJCSAgICAgICApOworCQlwcmludGYoIiAgICAgJXNcbiIsb3B0aGxwW2NdKTsKKwkJcHJpbnRmKCIgICAgIEFyZ3VtZW50OiAlc1xuXG4iLGFyZ2hscFtjXSk7CisJICAgIH0gZWxzZSB7CQkJLyogT3B0aW9uIHdpdGhvdXQgYXJnICovCisJCXByaW50ZigiIC0lYyAgJXMlc1xuIiwKKwkJICAgICAgIChjaGFyKWMsIG9wdGhscFtjXSwKKwkJICAgICAgIChvcHRhY3RbY10/IiAoYWN0aW9uIG9wdGlvbikiOiIiKQorCQkgICAgICAgKTsKKwkJcHJpbnRmKCIgICAgIEFyZ3VtZW50OiAobm9uZSlcblxuIik7CisJICAgIH0KKwl9CisjaWZkZWYgT1MyT1JVTklYCisJcHJpbnRmKCJUbyBwcmV2ZW50IHRoaXMgbWVzc2FnZSBmcm9tIHNjcm9sbGluZywgdXNlICclcyAtaCB8IG1vcmUnLlxuIiwKKwkgICAgICAgeGFyZzApOworI2VuZGlmIC8qIE9TMk9SVU5JWCAqLworCXByaW50ZigiRm9yIGEgbGlzdCBvZiBleHRlbmRlZCBvcHRpb25zIHVzZSAnJXMgLS1oZWxwJy5cbiIsCisJICAgICAgIHhhcmcwKTsKKyAgICB9CisjZW5kaWYgLyogTUlOSVggKi8KK30KKworCisvKiAgQyBNIEQgTCBJIE4gIC0tICBHZXQgYXJndW1lbnRzIGZyb20gY29tbWFuZCBsaW5lICAqLworCitpbnQKK2NtZGxpbigpIHsKKyAgICBjaGFyIHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2NhbCBnZW5lcmFsLXB1cnBvc2UgY2hhciAqLworICAgIGV4dGVybiBpbnQgaGF2ZXVybDsKKworI2lmZGVmIE5FV0ZUUAorICAgIGNoYXIgKiBwb3J0ID0gTlVMTDsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKworI2lmbmRlZiBOT1hGRVIKKyAgICBjbWFyZyA9ICIiOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGdsb2JhbHMgKi8KKyAgICBjbWFyZzIgPSAiIjsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICBhY3Rpb24gPSAwOworICAgIGNmbGcgPSAwOworCisgICAgc2lnbmFsKFNJR0lOVCxjbF9pbnQpOworCisvKiBIZXJlIHdlIGhhbmRsZSBkaWZmZXJlbnQgIkNvbW1hbmQgTGluZSBQZXJzb25hbGl0aWVzIiAqLworCisjaWZkZWYgVENQU09DS0VUCisjaWZuZGVmIE5PSFRUUAorICAgIGlmIChob3djYWxsZWQgPT0gSV9BTV9IVFRQKSB7ICAgICAgIC8qIElmIEkgd2FzIGNhbGxlZCBhcyBIVFRQLi4uICovCisJY2hhciByZG5zWzEyOF07CisjaWZkZWYgT1MyCisJY2hhciAqIGFnZW50ID0gIktlcm1pdCA5NSI7CisjZWxzZSAgIAorCWNoYXIgKiBhZ2VudCA9ICJDLUtlcm1pdCI7CisjZW5kaWYgLyogT1MyICovCisKKyAgICAgICAgZGVidWcoRjEwMCwiaHR0cCBwZXJzb25hbGl0eSIsIiIsMCk7CisjaWZkZWYgQ0tfVVJMCisgICAgICAgIGlmIChoYXZldXJsKSB7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIGNoYXIgKiBsZmlsZTsKKworCSAgICB0eXBlID0gbG9va3VwKHVybHRhYixnX3VybC5zdmMsbnVybHRhYixOVUxMKTsKKyAgICAgICAgICAgIGlmICghKHR5cGUgPT0gVVJMX0hUVFAgfHwgdHlwZSA9PSBVUkxfSFRUUFMpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCI/SW50ZXJuYWwgRXJyb3I6IEhUVFAgY29tbWFuZCBsaW5lIHByb2Nlc3NpbmdcbiIpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsIkVycm9yOiBIVFRQIGNvbW1hbmQgbGluZSBwcm9jZXNzaW5nIiwiIiwwKTsKKyAgICAgICAgICAgICAgICBkb2V4aXQoQkFEX0VYSVQsMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZG5zWzBdID0gJ1wwJzsKKyAgICAgICAgICAgIGxmaWxlID0gIiI7CisgICAgICAgICAgICB4ID0gKGh0dHBfb3BlbihnX3VybC5ob3MsZ191cmwucG9yID8gZ191cmwucG9yIDogZ191cmwuc3ZjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gVVJMX0hUVFBTLCByZG5zLDEyOCxOVUxMKSA9PSAwKTsKKyAgICAgICAgICAgIGlmICh4KSB7CisjaWZkZWYgS1VJCisJCWNoYXIgYXNuYW1lW0NLTUFYUEFUSCsxXTsKKyNlbmRpZiAvKiBLVUkgKi8KKyAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZG5zWzBdKQorCQkgICAgICBwcmludGYoIkNvbm5lY3RlZCB0byAlcyBbJXNdXHJcbiIsZ191cmwuaG9zLHJkbnMpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisJCSAgICAgIHByaW50ZigiQ29ubmVjdGVkIHRvICVzXHJcbiIsZ191cmwuaG9zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdfdXJsLnB0aCkKKyAgICAgICAgICAgICAgICAgIHpzdHJpcChnX3VybC5wdGgsJmxmaWxlKTsKKyAgICAgICAgICAgICAgICBlbHNlCisJCSAgZ191cmwucHRoID0gIi8iOworCisgICAgICAgICAgICAgICAgaWYgKCEqbGZpbGUpCisgICAgICAgICAgICAgICAgICBsZmlsZSA9ICJpbmRleC5odG1sIjsKKworI2lmZGVmIEtVSQorCQlpZiAodXFfZmlsZShOVUxMLAkvKiBLOTUgR1VJOiBQdXQgdXAgZmlsZSBib3guICovCisJCQkgICAgTlVMTCwJLyogKG5vdCB0ZXN0ZWQuLi4pICovCisJCQkgICAgNCwKKwkJCSAgICBOVUxMLAorCQkJICAgIGxmaWxlLAorCQkJICAgIGFzbmFtZSwKKwkJCSAgICBDS01BWFBBVEgrMQorCQkJICAgICkgPiAwKQorCQkgIGxmaWxlID0gYXNuYW1lOworI2VuZGlmIC8qIEtVSSAqLworCisgICAgICAgICAgICAgICAgeCA9IGh0dHBfZ2V0KGFnZW50LAorCQkJICAgICBOVUxMLAkvKiBoZHJsaXN0ICovCisJCQkgICAgIGdfdXJsLnVzciwKKwkJCSAgICAgZ191cmwucHN3LAorCQkJICAgICAwLAorCQkJICAgICBsZmlsZSwKKwkJCSAgICAgZ191cmwucHRoLAorCQkJICAgICAwCQkvKiBzdGRpbyAqLworCQkJICAgICApOworICAgICAgICAgICAgICAgIHggPSAoaHR0cF9jbG9zZSgpID09IDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KQorCQkgIHByaW50ZigiP0hUVFAgQ29ubmVjdGlvbiBmYWlsZWQuXHJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG9leGl0KHggPyBHT09EX0VYSVQgOiBCQURfRVhJVCwgLTEpOworICAgICAgICB9IGVsc2UgCisjZW5kaWYgLyogQ0tfVVJMICovCisJICB7CisJICAgICAgaW50IGh0dHBfYWN0aW9uID0gMDsKKwkgICAgICBjaGFyICogaG9zdCA9IE5VTEwsICogc3ZjID0gTlVMTCwgKiBscGF0aCA9IE5VTEw7CisJICAgICAgY2hhciAqIHVzZXIgPSBOVUxMLCAqIHBzd2QgPSBOVUxMLCAqIHBhdGggPSBOVUxMOworCSAgICAgIGNoYXIgKiB4cDsKKworCSAgICAgIHdoaWxlICgtLXhhcmdjID4gMCkgewkvKiBHbyB0aHJvdWdoIGNvbW1hbmQgbGluZSB3b3JkcyAqLworCQkgIHhhcmd2Kys7CisJCSAgZGVidWcoRjExMSwiY21kbGluIGh0dHAgeGFyZ3YiLCp4YXJndix4YXJnYyk7CisJCSAgeHAgPSAqeGFyZ3YrMTsKKwkJICBpZiAoKip4YXJndiA9PSAnLScpIHsgLyogR290IGFuIG9wdGlvbiAqLworCQkgICAgICBpbnQgeHg7CisJCSAgICAgIHggPSAqKCp4YXJndisxKTsJLyogR2V0IHRoZSBvcHRpb24gbGV0dGVyICovCisJCSAgICAgIHN3aXRjaCAoeCkgeworCQkJY2FzZSAnZCc6CS8qIERlYnVnICovCisjaWZkZWYgREVCVUcKKwkJCSAgaWYgKGRlYmxvZykgeworCQkJICAgICAgZGVidGltID0gMTsKKwkJCSAgfSBlbHNlIHsKKwkJCSAgICAgIGRlYmxvZyA9IGRlYm9wbigiZGVidWcubG9nIiwwKTsKKwkJCSAgfQorI2VuZGlmIC8qIERFQlVHICovCisJCQkgIGJyZWFrOworCQkJY2FzZSAnUyc6CS8qIFN0YXkgKi8KKwkJCWNhc2UgJ1knOgkvKiBObyBpbml0aWFsaXphdGlvbiBmaWxlICovCisJCQkgIGJyZWFrOwkvKiAoYWxyZWFkeSBkb25lIGluIHByZXNjYW4pICovCisJCQljYXNlICdxJzoJLyogUXVpZXQgKi8KKwkJCSAgcXVpZXQgPSAxOworCQkJICBicmVhazsKKwkJCWNhc2UgJ3UnOgkvKiBPcHRpb25zIHRoYXQgcmVxdWlyZSBhcmd1bWVudHMgKi8KKwkJCWNhc2UgJ1AnOgorCQkJY2FzZSAnZyc6CisJCQljYXNlICdwJzoKKwkJCWNhc2UgJ0gnOgorCQkJY2FzZSAnbCc6CisJCQkgIGlmICgqKHhwKzEpKSB7CisJCQkgICAgICBYRkFUQUwoIkludmFsaWQgYXJndW1lbnQgYnVuZGxpbmciKTsKKwkJCSAgfQorCQkJICB4YXJndisrLCB4YXJnYy0tOworCQkJICBpZiAoKHhhcmdjIDwgMSkgfHwgKCoqeGFyZ3YgPT0gJy0nKSkgeworCQkJICAgICAgWEZBVEFMKCJNaXNzaW5nIGFyZ3VtZW50Iik7CisJCQkgIH0KKwkJCSAgc3dpdGNoICh4KSB7CisJCQkgICAgY2FzZSAndSc6CisJCQkgICAgICB1c2VyID0gKnhhcmd2OworCQkJICAgICAgYnJlYWs7CisJCQkgICAgY2FzZSAnUCc6CisJCQkgICAgICBwc3dkID0gKnhhcmd2OworCQkJICAgICAgYnJlYWs7CisJCQkgICAgY2FzZSAnbCc6CisJCQkgICAgICBpZiAoaHR0cF9hY3Rpb24gIT0gSFRUUF9QVVQpCisJCQkJbHBhdGggPSAqeGFyZ3Y7CisJCQkgICAgICBicmVhazsKKwkJCSAgICBjYXNlICdnJzoKKwkJCSAgICAgIGh0dHBfYWN0aW9uID0gSFRUUF9HRVQ7CisJCQkgICAgICBwYXRoID0gKnhhcmd2OworCQkJICAgICAgZGVidWcoRjExMSwiY21kbGluIGh0dHAgR0VUIixwYXRoLGh0dHBfYWN0aW9uKTsKKwkJCSAgICAgIGJyZWFrOworCQkJICAgIGNhc2UgJ3AnOgorCQkJICAgICAgaHR0cF9hY3Rpb24gPSBIVFRQX1BVVDsKKwkJCSAgICAgIHBhdGggPSAqeGFyZ3Y7CisJCQkgICAgICBicmVhazsKKwkJCSAgICBjYXNlICdIJzoKKwkJCSAgICAgIGh0dHBfYWN0aW9uID0gSFRUUF9IRUQ7CisJCQkgICAgICBwYXRoID0gKnhhcmd2OworCQkJICB9CisJCQkgIGJyZWFrOworCisjaWZkZWYgQ0tfU1NMCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd6JzogeworCQkJICAgIC8qICp4YXJndiBjb250YWlucyBhIHZhbHVlIG9mIHRoZSBmb3JtIHRhZz12YWx1ZSAqLworCQkJICAgIC8qIHdlIG5lZWQgdG8gbG9va3VwIHRoZSB0YWcgYW5kIHNhdmUgdGhlIHZhbHVlICAqLworCQkJICAgIGludCB4LHksejsKKwkJCSAgICBjaGFyICogcCwgKiBxOworCQkJICAgIG1ha2VzdHIoJnAsKnhhcmd2KTsKKwkJCSAgICB5ID0gY2tpbmRleCgiPSIscCwwLDAsMSk7CisJCQkgICAgaWYgKHkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFt5LTFdID0gJ1wwJzsKKwkJCSAgICB4ID0gbG9va3VwKGh0dHB6dGFiLHAsbmh0dHB6dGFiLCZ6KTsKKwkJCSAgICBpZiAoeCA8IDApIHsKKwkJCQlwcmludGYoIj9JbnZhbGlkIHNlY3VyaXR5IG9wdGlvbjogXCIlc1wiXG4iLHApOworCQkJICAgIH0gZWxzZSB7CisJCQkJcHJpbnRmKCJTZWN1cml0eSBvcHRpb246IFwiJXMiLHApOworCQkJCWlmIChodHRwenRhYlt6XS5mbGdzICYgQ01fQVJHKSB7CisJCQkJICAgIHEgPSAmcFt5XTsKKwkJCQkgICAgaWYgKCEqcSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWwoIj9NaXNzaW5nIHJlcXVpcmVkIHZhbHVlIik7CisJCQkJfQorCQkJCS8qIC16IG9wdGlvbnMgdy9hcmdzICovCisJCQkJc3dpdGNoIChodHRwenRhYlt6XS5rd3ZhbCkgeworCQkJCSAgY2FzZSBIVF9DRVJURkk6CisJCQkJICAgIG1ha2VzdHIoJnNzbF9yc2FfY2VydF9maWxlLHEpOworCQkJCSAgICBicmVhazsKKwkJCQkgIGNhc2UgSFRfT0tDRVJUOgorCQkJCSAgICBzc2xfY2VydHNva19mbGFnID0gMTsKKwkJCQkgICAgYnJlYWs7CisJCQkJICBjYXNlIEhUX0tFWToKKwkJCQkgICAgbWFrZXN0cigmc3NsX3JzYV9rZXlfZmlsZSxxKTsKKwkJCQkgICAgYnJlYWs7CisJCQkJICBjYXNlIEhUX1NFQ1VSRToKKwkJCQkgICAgc3ZjPSJodHRwcyI7CisJCQkJICAgIGJyZWFrOworCQkJCSAgY2FzZSBIVF9WRVJJRlk6CisJCQkJICAgIGlmICghcmRpZ2l0cyhxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/QmFkIG51bWJlcjogJXNcbiIscSk7CisJCQkJICAgIHNzbF92ZXJpZnlfZmxhZyA9IGF0b2kocSk7CisJCQkJICAgIGJyZWFrOworCQkJCX0KKwkJCSAgICB9CisJCQkgICAgZnJlZShwKTsKKwkJCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKworCQkJY2FzZSAnaCc6CS8qIEhlbHAgKi8KKwkJCWRlZmF1bHQ6CisJCQkgIHByaW50ZigiVXNhZ2U6ICVzIGhvc3QgWyBvcHRpb25zLi4uIF1cbiIseGFyZzApOworCQkJICBjb25vbGEoaHR0cF9obHApOworCQkJICBkb2V4aXQoR09PRF9FWElULC0xKTsKKwkJICAgICAgfQorCQkgIH0gZWxzZSB7CQkvKiBObyBkYXNoIC0gbXVzdCBiZSBob3N0bmFtZSAqLworCQkgICAgICBob3N0ID0gKnhhcmd2OworCQkgICAgICBpZiAoeGFyZ2MgPiAxKSB7CisJCQkgIHN2YyA9ICooeGFyZ3YrMSk7CisJCQkgIGlmIChzdmMpIGlmICgqc3ZjID09ICctJyB8fCAhKnN2YykKKwkJCSAgICBzdmMgPSBOVUxMOworCQkJICBpZiAoc3ZjKSB7CisJCQkgICAgICB4YXJndisrOworCQkJICAgICAgeGFyZ2MtLTsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgfQorCSAgICAgIH0KKwkgICAgICBpZiAoIXN2Yykgc3ZjID0gIiI7CisJICAgICAgaWYgKCEqc3ZjKSBzdmMgPSAiaHR0cCI7CisJICAgICAgaWYgKCFob3N0KSBYRkFUQUwoIk5vIGh0dHAgaG9zdCBnaXZlbiIpOworCisJICAgICAgLyogQ2hlY2sgYWN0aW9uIGFyZ3MgYmVmb3JlIG9wZW5pbmcgdGhlIGNvbm5lY3Rpb24gKi8KKwkgICAgICBpZiAoaHR0cF9hY3Rpb24pIHsKKwkJICBpZiAoaHR0cF9hY3Rpb24gPT0gSFRUUF9QVVQpIHsKKwkJICAgICAgaWYgKCFscGF0aCkKKwkJCVhGQVRBTCgiTm8gbG9jYWwgcGF0aCBmb3IgaHR0cCBQVVQiKTsKKwkJICB9CisJCSAgaWYgKCFwYXRoKQorCQkgICAgWEZBVEFMKCJObyByZW1vdGUgcGF0aCBmb3IgaHR0cCBhY3Rpb24iKTsKKwkgICAgICB9CisJICAgICAgLyogTm93IGl0J3MgT0sgdG8gb3BlbiB0aGUgY29ubmVjdGlvbiAqLworCSAgICAgIHJkbnNbMF0gPSBOVUw7CisJICAgICAgeCA9IChodHRwX29wZW4oaG9zdCwKKwkJCSAgICAgc3ZjLCFja3N0cmNtcCgiaHR0cHMiLHN2YywtMSwwKSxyZG5zLDEyOCxOVUxMCisJCQkgICAgICkgPT0gMCk7CisJICAgICAgaWYgKCF4KSB7CisJCSAgaWYgKCFxdWlldCkKKwkJICAgIHByaW50ZigiP0hUVFAgQ29ubmVjdGlvbiBmYWlsZWQuXHJcbiIpOworCQkgIGRvZXhpdChCQURfRVhJVCwtMSk7CisJICAgICAgfQorCSAgICAgIGlmICghcXVpZXQpIHsKKwkJICBpZiAocmRuc1swXSkKKwkJICAgIHByaW50ZigiQ29ubmVjdGVkIHRvICVzIFslc11cclxuIixob3N0LHJkbnMpOworCQkgIGVsc2UKKwkJICAgIHByaW50ZigiQ29ubmVjdGVkIHRvICVzXHJcbiIsaG9zdCk7CisJICAgICAgfQorCSAgICAgIGlmIChodHRwX2FjdGlvbikgeworICAgICAgICAgICAgICAgICAgaW50IHBjcHkgPSAwOworCQkgIGlmIChodHRwX2FjdGlvbiAhPSBIVFRQX1BVVCkgeyAvKiBTdXBwbHkgZGVmYXVsdCAqLworCQkgICAgICBpZiAoIWxwYXRoKSB7CQkgLyogbG9jYWwgcGF0aC4uLiAqLworCQkJICB6c3RyaXAocGF0aCwmbHBhdGgpOworCQkJICBpZiAoIWxwYXRoKQorCQkJICAgIGxwYXRoID0gIiI7CisJCQkgIGlmICghKmxwYXRoKQorCQkJICAgIGxwYXRoID0gImluZGV4Lmh0bWwiOworCQkgICAgICB9CisJCSAgfQorICAgICAgICAgICAgICAgICAgaWYgKCpwYXRoICE9ICcvJykgeworICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBwID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihwYXRoKSsyKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIXApIGZhdGFsKCI/TWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgICAgICpwID0gJy8nOworICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmcFsxXSxwYXRoKTsgICAgICAvKiBzYWZlICovCisgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgcGNweSA9IDE7CisgICAgICAgICAgICAgICAgICB9CisJCSAgc3dpdGNoIChodHRwX2FjdGlvbikgeworCQkgICAgY2FzZSBIVFRQX0dFVDoKKwkJICAgICAgeCA9IGh0dHBfZ2V0KGFnZW50LE5VTEwsdXNlcixwc3dkLDAsbHBhdGgscGF0aCwwKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICAgIAorCQkgICAgY2FzZSBIVFRQX1BVVDoKKwkJICAgICAgeCA9IGh0dHBfcHV0KGFnZW50LE5VTEwsInRleHQvSFRNTCIsCisJCQkJICAgdXNlcixwc3dkLDAsbHBhdGgscGF0aCxOVUxMLDApOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSBIVFRQX0hFRDoKKwkJICAgICAgeCA9IGh0dHBfaGVhZChhZ2VudCxOVUxMLHVzZXIscHN3ZCwwLGxwYXRoLHBhdGgsMCk7CisJCSAgICAgIGJyZWFrOworCQkgIH0KKwkJICBkZWJ1ZyhGMTAxLCJjbWRsaW5lIGh0dHAgcmVzdWx0IiwiIix4KTsKKyAgICAgICAgICAgICAgICAgIHggPSAoaHR0cF9jbG9zZSgpID09IDApOworICAgICAgICAgICAgICAgICAgaWYgKHBjcHkpIGZyZWUocGF0aCk7CisgICAgICAgICAgICAgICAgICBkb2V4aXQoeCA/IEdPT0RfRVhJVCA6IEJBRF9FWElULCAtMSk7CisJICAgICAgfQorCSAgICAgIHJldHVybigwKTsKKwkgIH0KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBOT0hUVFAgKi8KKyNpZmRlZiBORVdGVFAKKyAgICAgIGlmIChob3djYWxsZWQgPT0gSV9BTV9GVFApIHsJLyogSWYgSSB3YXMgY2FsbGVkIGFzIEZUUC4uLiAqLworCSAgZGVidWcoRjEwMCwiZnRwIHBlcnNvbmFsaXR5IiwiIiwwKTsKKyNpZmRlZiBDS19VUkwKKwkgIGlmIChoYXZldXJsKQorICAgICAgICAgICAgZG9mdHBhcmcoJ1UnKTsKKwkgIGVsc2UgCisjZW5kaWYgLyogQ0tfVVJMICovCisJICAgIHsKKwkJd2hpbGUgKC0teGFyZ2MgPiAwKSB7CS8qIEdvIHRocm91Z2ggY29tbWFuZCBsaW5lIHdvcmRzICovCisJCSAgICB4YXJndisrOworCQkgICAgZGVidWcoRjExMSwiY21kbGluIGZ0cCB4YXJndiIsKnhhcmd2LHhhcmdjKTsKKwkJICAgIGlmICgqKnhhcmd2ID09ICctJykgeyAvKiBHb3QgYW4gb3B0aW9uICovCisJCQlpbnQgeHg7CisJCQl4ID0gKigqeGFyZ3YrMSk7IC8qIEdldCB0aGUgb3B0aW9uIGxldHRlciAqLworCQkJeHggPSBkb2Z0cGFyZyh4KTsKKwkJCWlmICh4eCA8IDApIHsKKwkJCSAgICBpZiAod2hhdCA9PSBXX0NPTU1BTkQpCisJCQkgICAgICByZXR1cm4oMCk7CisJCQkgICAgZWxzZQorCQkJICAgICAgZG9leGl0KEJBRF9FWElULDEpOworCQkJfQorCQkgICAgfSBlbHNlIHsJCS8qIE5vIGRhc2ggLSBtdXN0IGJlIGhvc3RuYW1lICovCisJCQltYWtlc3RyKCZmdHBfaG9zdCwqeGFyZ3YpOworCQkJaWYgKHhhcmdjID4gMSkgeworCQkJICAgIHBvcnQgPSAqKHhhcmd2KzEpOworCQkJICAgIGlmIChwb3J0KSBpZiAoKnBvcnQgPT0gJy0nIHx8ICEqcG9ydCkKKwkJCSAgICAgIHBvcnQgPSBOVUxMOworCQkJICAgIGlmIChwb3J0KSB7CisJCQkJeGFyZ3YrKzsKKwkJCQl4YXJnYy0tOworCQkJICAgIH0KKwkJCX0KKwkJCWRlYnVnKEYxMTAsImNtZGxpbiBmdHAgaG9zdCIsZnRwX2hvc3QsMCk7CisJCQlkZWJ1ZyhGMTEwLCJjbWRsaW4gZnRwIHBvcnQiLHBvcnQsMCk7CisJCSAgICB9CisJCX0gLyogd2hpbGUgKi8KKwkgICAgfSAvKiBpZiAoaGF2ZXVybCkgKi8KKworCSAgaWYgKGZ0cF9ob3N0KSB7CisJICAgICAgaW50IHh4OworI2lmZGVmIE5PRElBTAorCSAgICAgIHh4ID0geHhfZnRwKGZ0cF9ob3N0LHBvcnQpOworCSAgICAgIGlmICh4eCA8IDAgJiYgKGhhdmV1cmwgfHwgZnRwX2NtZGxpbiA+IDEpKSBkb2V4aXQoQkFEX0VYSVQsLTEpOworI2Vsc2UKKyNpZmRlZiBOT0lDUAorCSAgICAgIHh4ID0geHhfZnRwKGZ0cF9ob3N0LHBvcnQpOworCSAgICAgIGlmICh4eCA8IDAgJiYgKGhhdmV1cmwgfHwgZnRwX2NtZGxpbiA+IDEpKSBkb2V4aXQoQkFEX0VYSVQsLTEpOworI2Vsc2UKKwkgICAgICBpZiAoKmZ0cF9ob3N0ID09ICc9JykgewkvKiBTa2lwIGRpcmVjdG9yeSBsb29rdXAgKi8KKwkJICB4eCA9IHh4X2Z0cCgmZnRwX2hvc3RbMV0scG9ydCk7CisJCSAgaWYgKHh4IDwgMCAmJiAoaGF2ZXVybCB8fCBmdHBfY21kbGluID4gMSkpCisJCSAgICBkb2V4aXQoQkFEX0VYSVQsLTEpOworCSAgICAgIH0gZWxzZSB7CQkJLyogV2FudCBsb29rdXAgKi8KKwkJICBpbnQgaTsKKwkJICBuaGNvdW50ID0gMDsJCS8qIENoZWNrIG5ldHdvcmsgZGlyZWN0b3J5ICovCisJCSAgZGVidWcoRjEwMSwiY21kbGluIG5uZXRkaXIiLCIiLG5uZXRkaXIpOworCQkgIGlmIChubmV0ZGlyID4gMCkJLyogSWYgdGhlcmUgaXMgYSBkaXJlY3RvcnkuLi4gKi8KKwkJICAgIGx1bmV0KGZ0cF9ob3N0KTsJLyogTG9vayB1cCB0aGUgbmFtZSAqLworCQkgIGVsc2UJCQkvKiBJZiBubyBkaXJlY3RvcnkgKi8KKwkJICAgIG5oY291bnQgPSAwOwkvKiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyB0aGVyZSAqLworI2lmZGVmIERFQlVHCisJCSAgaWYgKGRlYmxvZykgeworCQkgICAgICBkZWJ1ZyhGMTAxLCJjbWRsaW4gbHVuZXQgbmhjb3VudCIsIiIsbmhjb3VudCk7CisJCSAgICAgIGlmIChuaGNvdW50ID4gMCkgeworCQkJICBkZWJ1ZyhGMTEwLCJjbWRsaW4gbHVuZXQgbmhfcFswXSIsbmhfcFswXSwwKTsKKwkJCSAgZGVidWcoRjExMCwiY21kbGluIGx1bmV0IG5oX3AyWzBdIixuaF9wMlswXSwwKTsKKwkJCSAgZGVidWcoRjExMCwiY21kbGluIGx1bmV0IG5oX3B4WzBdWzBdIiwKKwkJCQluaF9weFswXVswXSwwKTsKKwkJICAgICAgfQorCQkgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCQkgIGlmIChuaGNvdW50ID09IDApIHsKKwkJICAgICAgeHggPSB4eF9mdHAoZnRwX2hvc3QscG9ydCk7CisJCSAgICAgIGlmICh4eCA8IDAgJiYgKGhhdmV1cmwgfHwgZnRwX2NtZGxpbiA+IDEpKQorCQkJZG9leGl0KEJBRF9FWElULC0xKTsKKwkJICB9IGVsc2UgeworCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgbmhjb3VudDsgaSsrKSB7CisJCQkgIGlmIChja3N0cmNtcChuaF9wMltpXSwidGNwL2lwIiw2LDApKQorCQkJICAgIGNvbnRpbnVlOworCQkJICBtYWtlc3RyKCZmdHBfaG9zdCxuaF9wW2ldKTsKKwkJCSAgZGVidWcoRjExMCwiY21kbGluIGNhbGxpbmcgeHhfZnRwIixmdHBfaG9zdCwwKTsKKwkJCSAgaWYgKCFxdWlldCkKKwkJCSAgICBwcmludGYoIlRyeWluZyAlcy4uLlxuIixmdHBfaG9zdCk7CisJCQkgIGlmICh4eF9mdHAoZnRwX2hvc3QscG9ydCkgPiAtMSkKKwkJCSAgICBicmVhazsKKwkJICAgICAgfQorCQkgIH0KKwkgICAgICB9CisjZW5kaWYgLyogTk9ESUFMICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKwkgICAgICBpZiAoIWZ0cGlzY29ubmVjdGVkKCkpCisJCWRvZXhpdChCQURfRVhJVCwtMSk7CisJICB9CisJICByZXR1cm4oMCk7CisgICAgICB9CisjZW5kaWYgLyogTkVXRlRQICovCisKKyNpZmRlZiBUTkNPREUKKyAgICBpZiAoaG93Y2FsbGVkID09IElfQU1fVEVMTkVUKSB7ICAgICAvKiBJZiBJIHdhcyBjYWxsZWQgYXMgVGVsbmV0Li4uICovCisKKyAgICAgICAgd2hpbGUgKC0teGFyZ2MgPiAwKSB7CQkvKiBHbyB0aHJvdWdoIGNvbW1hbmQgbGluZSB3b3JkcyAqLworICAgICAgICAgICAgeGFyZ3YrKzsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImNtZGxpbiB0ZWxuZXQgeGFyZ3YiLCp4YXJndix4YXJnYyk7CisgICAgICAgICAgICBpZiAoKip4YXJndiA9PSAnPScpCisJICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgaWYgKCFzdHJjbXAoKnhhcmd2LCItLSIpKQkvKiBnZXRvcHQoKSBjb25mb3JtYW5jZSAqLworCSAgICAgIHJldHVybigwKTsKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgIGVsc2UgaWYgKCoqeGFyZ3YgPT0gJy8nKQorCSAgICAgIGNvbnRpbnVlOworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICAgICAgZWxzZSBpZiAoKip4YXJndiA9PSAnLScpIHsJLyogR290IGFuIG9wdGlvbiAoYmVnaW5zIHdpdGggZGFzaCkgKi8KKyAgICAgICAgICAgICAgICBpbnQgeHg7CisgICAgICAgICAgICAgICAgeCA9ICooKnhhcmd2KzEpOwkvKiBHZXQgdGhlIG9wdGlvbiBsZXR0ZXIgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJjbWRsaW4gdGVsbmV0IGFyZ3MgMSIsKnhhcmd2LHhhcmdjKTsKKyAgICAgICAgICAgICAgICB4eCA9IGRvdG5hcmcoeCk7CisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiY21kbGluIHRlbG5ldCBkb2FyZyIsIiIseHgpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMTEsImNtZGxpbiB0ZWxuZXQgYXJncyAyIiwqeGFyZ3YseGFyZ2MpOworICAgICAgICAgICAgICAgIGlmICh4eCA8IDApIHsKKyNpZm5kZWYgTk9JQ1AKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gV19DT01NQU5EKQorCQkgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBOT0lDUCAqLworCQkgICAgICB7CisjaWZkZWYgT1MyCisJCQkgIHNsZWVwKDEpOwkvKiBHaXZlIGl0IGEgY2hhbmNlLi4uICovCisjZW5kaWYgLyogT1MyICovCisJCQkgIGRvZXhpdChCQURfRVhJVCwxKTsgLyogR28gaGFuZGxlIG9wdGlvbiAqLworCQkgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsJCQkvKiBObyBkYXNoIG11c3QgYmUgaG9zdG5hbWUgKi8KKyAgICAgICAgICAgICAgICBja3N0cm5jcHkodHRuYW1lLCp4YXJndixUVE5BTUxFTisxKTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJjbWRsaW4gdGVsbmV0IGhvc3QiLHR0bmFtZSwwKTsKKworI2lmbmRlZiBOT0lDUAorI2lmbmRlZiBOT0RJQUwKKyAgICAgICAgICAgICAgICBuaGNvdW50ID0gMDsJCS8qIENoZWNrIG5ldHdvcmsgZGlyZWN0b3J5ICovCisgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiY21kbGluIHRlbG5ldCBubmV0ZGlyIiwiIixubmV0ZGlyKTsKKyAgICAgICAgICAgICAgICBpZiAobm5ldGRpciA+IDApCS8qIElmIHRoZXJlIGlzIGEgZGlyZWN0b3J5Li4uICovCisJCSAgbHVuZXQoKnhhcmd2KTsJLyogTG9vayB1cCB0aGUgbmFtZSAqLworICAgICAgICAgICAgICAgIGVsc2UJCQkvKiBJZiBubyBkaXJlY3RvcnkgKi8KKwkJICBuaGNvdW50ID0gMDsJCS8qIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nIHRoZXJlICovCisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgICAgICBpZiAoZGVibG9nKSB7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImNtZGxpbiB0ZWxuZXQgbHVuZXQgbmhjb3VudCIsIiIsbmhjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuaGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY21kbGluIHRlbG5ldCBsdW5ldCBuaF9wWzBdIixuaF9wWzBdLDApOworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY21kbGluIHRlbG5ldCBsdW5ldCBuaF9wMlswXSIsbmhfcDJbMF0sMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJjbWRsaW4gdGVsbmV0IGx1bmV0IG5oX3B4WzBdWzBdIiwKKwkJCSAgICAgIG5oX3B4WzBdWzBdLDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisgICAgICAgICAgICAgICAgaWYgKG5oY291bnQgPiAwICYmIG5oX3AyWzBdKSAvKiBJZiBuZXR3b3JrIHR5cGUgc3BlY2lmaWVkICovCisJCSAgaWYgKGNrc3RyY21wKG5oX3AyWzBdLCJ0Y3AvaXAiLDYsMCkpIC8qIGl0IG11c3QgYmUgVENQL0lQICovCisJCSAgICBuaGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAobmhjb3VudCA9PSAxKSB7CS8qIFN0aWxsIE9LLCBzbyBtYWtlIHN1YnN0aXR1dGlvbiAqLworICAgICAgICAgICAgICAgICAgICBja3N0cm5jcHkodHRuYW1lLG5oX3BbMF0sVFROQU1MRU4rMSk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNtZGxpbiB0ZWxuZXQgbHVuZXQgc3Vic3RpdHV0aW9uIix0dG5hbWUsMCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5PRElBTCAqLworI2VuZGlmIC8qIE5PSUNQICovCisKKyAgICAgICAgICAgICAgICBpZiAoLS14YXJnYyA+IDAgJiYgIWhhdmV1cmwpIHsgLyogU2VydmljZSBmcm9tIGNvbW1hbmQgbGluZT8gKi8KKyAgICAgICAgICAgICAgICAgICAgeGFyZ3YrKzsKKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHR0bmFtZSwiOiIsVFROQU1MRU4rMSk7CisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0dG5hbWUsKnhhcmd2LFRUTkFNTEVOKzEpOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJjbWRsaW4gdGVsbmV0IGhvc3QyIix0dG5hbWUsMCk7CisgICAgICAgICAgICAgICAgfQorI2lmbmRlZiBOT0lDUAorI2lmbmRlZiBOT0RJQUwKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuaGNvdW50KSB7CS8qIE5vIC0gaG93IGFib3V0IGluIG5ldCBkaXJlY3Rvcnk/ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChuaF9weFswXVswXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHR0bmFtZSwiOiIsVFROQU1MRU4rMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBja3N0cm5jYXQodHRuYW1lLG5oX3B4WzBdWzBdLFRUTkFNTEVOKzEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5PRElBTCAqLworI2VuZGlmIC8qIE5PSUNQICovCisgICAgICAgICAgICAgICAgbG9jYWwgPSAxOwkJLyogVHJ5IHRvIG9wZW4gdGhlIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgICAgICBuZXR0eXBlID0gTkVUX1RDUEI7CisgICAgICAgICAgICAgICAgbWRtdHlwID0gLW5ldHR5cGU7CisgICAgICAgICAgICAgICAgaWYgKHR0b3Blbih0dG5hbWUsJmxvY2FsLG1kbXR5cCwwKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgWEZBVEFMKCJjYW4ndCBvcGVuIGhvc3QgY29ubmVjdGlvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXR3b3JrID0gMTsJCS8qIEl0J3Mgb3BlbiAqLworI2lmZGVmIENLTE9HRElBTAorICAgICAgICAgICAgICAgIGRvbG9nbmV0KCk7CisjZW5kaWYgLyogQ0tMT0dESUFMICovCisjaWZuZGVmIE5PWEZFUgorICAgICAgICAgICAgICAgIHJlbGlhYmxlID0gMTsJCS8qIEl0J3MgcmVsaWFibGUgKi8KKyAgICAgICAgICAgICAgICB4cmVsaWFibGUgPSAxOwkJLyogLi4uICovCisgICAgICAgICAgICAgICAgc2V0cmVsaWFibGUgPSAxOworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgICAgICAgICAgICAgIGNmbGcgPSAxOwkJLyogQ29ubmVjdCAqLworICAgICAgICAgICAgICAgIHN0YXlmbGcgPSAxOwkJLyogU3RheSAqLworICAgICAgICAgICAgICAgIHRuX2V4aXQgPSAxOwkJLyogVGVsbmV0LWxpa2UgZXhpdCBjb25kaXRpb24gKi8KKyAgICAgICAgICAgICAgICBxdWlldCA9IDE7CisgICAgICAgICAgICAgICAgZXhpdG9uY2xvc2UgPSAxOwkvKiBFeGl0IHdoZW4gY29ubmVjdGlvbiBjbG9zZXMgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICBpZiAobG9jYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5tYWMpIHsJCS8qIEFueSBtYWNyb3MgZGVmaW5lZD8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBrOwkJLyogWWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICBrID0gbWxvb2sobWFjdGFiLCJvbl9vcGVuIixubWFjKTsgLyogTG9vayB0aGlzIHVwICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA+PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogSWYgZm91bmQsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvZG8oayx0dG5hbWUsMCkgPiAtMSkgICAgLyogc2V0IGl0IHVwLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIoMSk7ICAgICAgICAgICAgICAgIC8qIGFuZCBleGVjdXRlIGl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIFROQ09ERSAqLworI2lmZGVmIFJMT0dDT0RFCisgICAgZWxzZSBpZiAoaG93Y2FsbGVkID09IElfQU1fUkxPR0lOKSB7IC8qIElmIEkgd2FzIGNhbGxlZCBhcyBSbG9naW4uLi4gKi8KKyAgICAgICAgd2hpbGUgKC0teGFyZ2MgPiAwKSB7CQkvKiBHbyB0aHJvdWdoIGNvbW1hbmQgbGluZSB3b3JkcyAqLworICAgICAgICAgICAgeGFyZ3YrKzsKKyAgICAgICAgICAgIGRlYnVnKEYxMTEsImNtZGxpbiBybG9naW4geGFyZ3YiLCp4YXJndix4YXJnYyk7CisgICAgICAgICAgICBpZiAoKip4YXJndiA9PSAnPScpCisJICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgaWYgKCFzdHJjbXAoKnhhcmd2LCItLSIpKQkvKiBnZXRvcHQoKSBjb25mb3JtYW5jZSAqLworCSAgICAgIHJldHVybigwKTsKKyNpZmRlZiBWTVMKKyAgICAgICAgICAgIGVsc2UgaWYgKCoqeGFyZ3YgPT0gJy8nKQorCSAgICAgIGNvbnRpbnVlOworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICAgICAgZWxzZSBpZiAoKip4YXJndiA9PSAnLScpIHsJLyogR290IGFuIG9wdGlvbiAoYmVnaW5zIHdpdGggZGFzaCkgKi8KKyAgICAgICAgICAgICAgICBpbnQgeHg7CisgICAgICAgICAgICAgICAgeCA9ICooKnhhcmd2KzEpOwkvKiBHZXQgdGhlIG9wdGlvbiBsZXR0ZXIgKi8KKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJjbWRsaW4gcmxvZ2luIGFyZ3MgMSIsKnhhcmd2LHhhcmdjKTsKKyAgICAgICAgICAgICAgICB4eCA9IGRvcmxnYXJnKHgpOworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImNtZGxpbiBybG9naW4gZG9hcmciLCIiLHh4KTsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJjbWRsaW4gcmxvZ2luIGFyZ3MgMiIsKnhhcmd2LHhhcmdjKTsKKyAgICAgICAgICAgICAgICBpZiAoeHggPCAwKSB7CisjaWZuZGVmIE5PSUNQCisgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IFdfQ09NTUFORCkKKwkJICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYgLyogTk9JQ1AgKi8KKwkJICAgICAgeworI2lmZGVmIE9TMgorCQkJICBzbGVlcCgxKTsJLyogR2l2ZSBpdCBhIGNoYW5jZS4uLiAqLworI2VuZGlmIC8qIE9TMiAqLworCQkJICBkb2V4aXQoQkFEX0VYSVQsMSk7IC8qIEdvIGhhbmRsZSBvcHRpb24gKi8KKwkJICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CQkJLyogTm8gZGFzaCBtdXN0IGJlIGhvc3RuYW1lICovCisgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHR0bmFtZSwqeGFyZ3YsVFROQU1MRU4rMSk7CisgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY21kbGluIHJsb2dpbiBob3N0Iix0dG5hbWUsMCk7CisKKyNpZm5kZWYgTk9JQ1AKKyNpZm5kZWYgTk9ESUFMCisgICAgICAgICAgICAgICAgbmhjb3VudCA9IDA7CQkvKiBDaGVjayBuZXR3b3JrIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImNtZGxpbiBybG9naW4gbm5ldGRpciIsIiIsbm5ldGRpcik7CisgICAgICAgICAgICAgICAgaWYgKG5uZXRkaXIgPiAwKQkvKiBJZiB0aGVyZSBpcyBhIGRpcmVjdG9yeS4uLiAqLworCQkgIGx1bmV0KCp4YXJndik7CS8qIExvb2sgdXAgdGhlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICBlbHNlCQkJLyogSWYgbm8gZGlyZWN0b3J5ICovCisJCSAgbmhjb3VudCA9IDA7CQkvKiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyB0aGVyZSAqLworI2lmZGVmIERFQlVHCisgICAgICAgICAgICAgICAgaWYgKGRlYmxvZykgeworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJjbWRsaW4gcmxvZ2luIGx1bmV0IG5oY291bnQiLCIiLG5oY291bnQpOworICAgICAgICAgICAgICAgICAgICBpZiAobmhjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNtZGxpbiBybG9naW4gbHVuZXQgbmhfcFswXSIsbmhfcFswXSwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNtZGxpbiBybG9naW4gbHVuZXQgbmhfcDJbMF0iLG5oX3AyWzBdLDApOworICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY21kbGluIHJsb2dpbiBsdW5ldCBuaF9weFswXVswXSIsCisJCQkgICAgICBuaF9weFswXVswXSwwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworICAgICAgICAgICAgICAgIGlmIChuaGNvdW50ID4gMCAmJiBuaF9wMlswXSkgLyogSWYgbmV0d29yayB0eXBlIHNwZWNpZmllZCAqLworCQkgIGlmIChja3N0cmNtcChuaF9wMlswXSwidGNwL2lwIiw2LDApKSAvKiBpdCBtdXN0IGJlIFRDUC9JUCAqLworCQkgICAgbmhjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG5oY291bnQgPT0gMSkgewkvKiBTdGlsbCBPSywgc28gbWFrZSBzdWJzdGl0dXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHR0bmFtZSxuaF9wWzBdLFRUTkFNTEVOKzEpOworICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJjbWRsaW4gcmxvZ2luIGx1bmV0IHN1YnN0aXR1dGlvbiIsdHRuYW1lLDApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKyNlbmRpZiAvKiBOT0lDUCAqLworCisgICAgICAgICAgICAgICAgaWYgKCFoYXZldXJsKSB7IC8qIFNlcnZpY2UgZnJvbSBjb21tYW5kIGxpbmU/ICovCisgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0dG5hbWUsIjpsb2dpbiIsVFROQU1MRU4rMSk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNtZGxpbiBybG9naW4gaG9zdDIiLHR0bmFtZSwwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9jYWwgPSAxOwkJLyogVHJ5IHRvIG9wZW4gdGhlIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgICAgICBuZXR0eXBlID0gTkVUX1RDUEI7CisgICAgICAgICAgICAgICAgbWRtdHlwID0gLW5ldHR5cGU7CisgICAgICAgICAgICAgICAgaWYgKHR0b3Blbih0dG5hbWUsJmxvY2FsLG1kbXR5cCwwKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgWEZBVEFMKCJjYW4ndCBvcGVuIGhvc3QgY29ubmVjdGlvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXR3b3JrID0gMTsJCS8qIEl0J3Mgb3BlbiAqLworI2lmZGVmIENLTE9HRElBTAorICAgICAgICAgICAgICAgIGRvbG9nbmV0KCk7CisjZW5kaWYgLyogQ0tMT0dESUFMICovCisjaWZuZGVmIE5PWEZFUgorICAgICAgICAgICAgICAgIHJlbGlhYmxlID0gMTsJCS8qIEl0J3MgcmVsaWFibGUgKi8KKyAgICAgICAgICAgICAgICB4cmVsaWFibGUgPSAxOwkJLyogLi4uICovCisgICAgICAgICAgICAgICAgc2V0cmVsaWFibGUgPSAxOworI2VuZGlmIC8qIE5PWEZFUiAqLworICAgICAgICAgICAgICAgIGNmbGcgPSAxOwkJLyogQ29ubmVjdCAqLworICAgICAgICAgICAgICAgIHN0YXlmbGcgPSAxOwkJLyogU3RheSAqLworICAgICAgICAgICAgICAgIHRuX2V4aXQgPSAxOwkJLyogVGVsbmV0LWxpa2UgZXhpdCBjb25kaXRpb24gKi8KKyAgICAgICAgICAgICAgICBxdWlldCA9IDE7CisgICAgICAgICAgICAgICAgZXhpdG9uY2xvc2UgPSAxOwkvKiBFeGl0IHdoZW4gY29ubmVjdGlvbiBjbG9zZXMgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICAgICAgICBpZiAobG9jYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5tYWMpIHsJCS8qIEFueSBtYWNyb3MgZGVmaW5lZD8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBrOwkJLyogWWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICBrID0gbWxvb2sobWFjdGFiLCJvbl9vcGVuIixubWFjKTsgLyogTG9vayB0aGlzIHVwICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA+PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogSWYgZm91bmQsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvZG8oayx0dG5hbWUsMCkgPiAtMSkgICAgLyogc2V0IGl0IHVwLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIoMSk7ICAgICAgICAgICAgICAgIC8qIGFuZCBleGVjdXRlIGl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4oMCk7CisgICAgfQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisjZW5kaWYgLyogVENQU09DS0VUICovCisKKyNpZmRlZiBTU0hCVUlMVElOCisgICAgICBpZiAoaG93Y2FsbGVkID09IElfQU1fU1NIKSB7CS8qIElmIEkgd2FzIGNhbGxlZCBhcyBTU0guLi4gKi8KKyAgICAgICAgICBleHRlcm4gY2hhciAqIHNzaF9oc3QsICogc3NoX2NtZCwgKiBzc2hfcHJ0OworCSAgZGVidWcoRjEwMCwic3NoIHBlcnNvbmFsaXR5IiwiIiwwKTsKKyNpZmRlZiBDS19VUkwKKwkgIGlmIChoYXZldXJsKSB7CisgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF9oc3QsZ191cmwuaG9zKTsKKyAgICAgICAgICAgICAgbWFrZXN0cigmc3NoX3BydCxnX3VybC5zdmMpOworCSAgICAgIGNrc3RybmNweSh0dG5hbWUsc3NoX2hzdCxUVE5BTUxFTisxKTsKKyAgICAgICAgICAgICAgY2tzdHJuY2F0KHR0bmFtZSwiOiIsVFROQU1MRU4rMSk7CisgICAgICAgICAgICAgIGNrc3RybmNhdCh0dG5hbWUsc3NoX3BydCxUVE5BTUxFTisxKTsKKyAgICAgICAgICB9CisJICBlbHNlIAorI2VuZGlmIC8qIENLX1VSTCAqLworCSAgeworICAgICAgICAgICAgICB3aGlsZSAoLS14YXJnYyA+IDApIHsJLyogR28gdGhyb3VnaCBjb21tYW5kIGxpbmUgd29yZHMgKi8KKyAgICAgICAgICAgICAgICAgIHhhcmd2Kys7CisgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJjbWRsaW4gc3NoIHhhcmd2IiwqeGFyZ3YseGFyZ2MpOworICAgICAgICAgICAgICAgICAgaWYgKCoqeGFyZ3YgPT0gJz0nKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKCp4YXJndiwiLS0iKSkgLyogZ2V0b3B0KCkgY29uZm9ybWFuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisjaWZkZWYgVk1TCisgICAgICAgICAgICAgICAgICBlbHNlIGlmICgqKnhhcmd2ID09ICcvJykKKyAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbmRpZiAvKiBWTVMgKi8KKwkJICAvKiBHb3QgYW4gb3B0aW9uIChiZWdpbnMgd2l0aCBkYXNoKSAqLworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKip4YXJndiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgeHg7CisgICAgICAgICAgICAgICAgICAgICAgeCA9ICooKnhhcmd2KzEpOwkvKiBHZXQgdGhlIG9wdGlvbiBsZXR0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTExLCJjbWRsaW4gYXJncyAxIiwqeGFyZ3YseGFyZ2MpOworICAgICAgICAgICAgICAgICAgICAgIHh4ID0gZG9zc2hhcmcoeCk7CisgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiY21kbGluIGRvYXJnIiwiIix4eCk7CisgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMSwiY21kbGluIGFyZ3MgMiIsKnhhcmd2LHhhcmdjKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoeHggPCAwKSB7CisjaWZuZGVmIE5PSUNQCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IFdfQ09NTUFORCkKKwkJCSAgICByZXR1cm4oMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBOT0lDUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCgxKTsJLyogR2l2ZSBpdCBhIGNoYW5jZS4uLiAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9leGl0KEJBRF9FWElULDEpOyAvKiBHbyBoYW5kbGUgb3B0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9IGVsc2UgewkJCS8qIE5vIGRhc2ggbXVzdCBiZSBob3N0bmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNweSh0dG5hbWUsKnhhcmd2LFRUTkFNTEVOKzEpOworICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF9oc3QsdHRuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhGMTEwLCJjbWRsaW4gc3NoIGhvc3QiLHR0bmFtZSwwKTsKKyNpZm5kZWYgTk9JQ1AKKyNpZm5kZWYgTk9ESUFMCisgICAgICAgICAgICAgICAgICAgICAgbmhjb3VudCA9IDA7CQkvKiBDaGVjayBuZXR3b3JrIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDEsImNtZGxpbiBubmV0ZGlyIiwiIixubmV0ZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAobm5ldGRpciA+IDApCS8qIElmIHRoZXJlIGlzIGEgZGlyZWN0b3J5Li4uICovCisJCQlsdW5ldCgqeGFyZ3YpOwkvKiBMb29rIHVwIHRoZSBuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgZWxzZQkJLyogSWYgbm8gZGlyZWN0b3J5ICovCisJCQluaGNvdW50ID0gMDsJLyogd2UgZGlkbid0IGZpbmQgYW55dGhpbmcgdGhlcmUgKi8KKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJsb2cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMSwiY21kbGluIGx1bmV0IG5oY291bnQiLCIiLG5oY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmhjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNtZGxpbiBsdW5ldCBuaF9wWzBdIixuaF9wWzBdLDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoRjExMCwiY21kbGluIGx1bmV0IG5oX3AyWzBdIixuaF9wMlswXSwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsCisJCQkJICAgICJjbWRsaW4gbHVuZXQgbmhfcHhbMF1bMF0iLG5oX3B4WzBdWzBdLDApOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisJCSAgICAgIC8qIElmIG5ldHdvcmsgdHlwZSBzcGVjaWZpZWQgKi8KKwkJICAgICAgLyogaXQgbXVzdCBiZSBUQ1AvSVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBpZiAobmhjb3VudCA+IDAgJiYgbmhfcDJbMF0pCisJCQlpZiAoY2tzdHJjbXAobmhfcDJbMF0sInRjcC9pcCIsNiwwKSkKKwkJCSAgbmhjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKG5oY291bnQgPT0gMSkgeyAvKiBTdGlsbCBPSywgc28gbWFrZSBzdWJzdGl0dXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY3B5KHR0bmFtZSxuaF9wWzBdLFRUTkFNTEVOKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfaHN0LHR0bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNtZGxpbiBsdW5ldCBzdWJzdGl0dXRpb24iLHR0bmFtZSwwKTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9ESUFMICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKwkJICAgICAgLyogU2VydmljZSBmcm9tIGNvbW1hbmQgbGluZT8gKi8KKyAgICAgICAgICAgICAgICAgICAgICBpZiAoLS14YXJnYyA+IDAgJiYgIWhhdmV1cmwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeGFyZ3YrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHR0bmFtZSwiOiIsVFROQU1MRU4rMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0dG5hbWUsKnhhcmd2LFRUTkFNTEVOKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlc3RyKCZzc2hfcHJ0LCp4YXJndik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMTAsImNtZGxpbiB0ZWxuZXQgaG9zdDIiLHR0bmFtZSwwKTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ09NTUVOVAorICAgICAgICAgICAgICAgICAgICAgIC8qIERvIG5vdCBzdWJzdGl0dXRlIG5ldCBkaXIgc2VydmljZSBmb3Igc3NoIHBvcnQgKi8KKyNpZm5kZWYgTk9JQ1AKKyNpZm5kZWYgTk9ESUFMCisJCSAgICAgIC8qIE5vIC0gaG93IGFib3V0IGluIG5ldCBkaXJlY3Rvcnk/ICovCisgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmhjb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmhfcHhbMF1bMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNrc3RybmNhdCh0dG5hbWUsIjoiLFRUTkFNTEVOKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2tzdHJuY2F0KHR0bmFtZSxuaF9weFswXVswXSxUVE5BTUxFTisxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VzdHIoJnNzaF9wcnQsbmhfcHhbMF1bMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorCisjZW5kaWYgLyogTk9ESUFMICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgbG9jYWwgPSAxOwkJCS8qIFRyeSB0byBvcGVuIHRoZSBjb25uZWN0aW9uICovCisgICAgICAgICAgbmV0dHlwZSA9IE5FVF9TU0g7CisgICAgICAgICAgbWRtdHlwID0gLW5ldHR5cGU7CisgICAgICAgICAgaWYgKHR0b3Blbih0dG5hbWUsJmxvY2FsLG1kbXR5cCwwKSA8IDApIHsKKyAgICAgICAgICAgICAgWEZBVEFMKCJjYW4ndCBvcGVuIGhvc3QgY29ubmVjdGlvbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBuZXR3b3JrID0gMTsJCQkvKiBJdCdzIG9wZW4gKi8KKyNpZmRlZiBDS0xPR0RJQUwKKyAgICAgICAgICBkb2xvZ25ldCgpOworI2VuZGlmIC8qIENLTE9HRElBTCAqLworI2lmbmRlZiBOT1hGRVIKKyAgICAgICAgICByZWxpYWJsZSA9IDE7CQkJLyogSXQncyByZWxpYWJsZSAqLworICAgICAgICAgIHhyZWxpYWJsZSA9IDE7CQkvKiAuLi4gKi8KKyAgICAgICAgICBzZXRyZWxpYWJsZSA9IDE7CisjZW5kaWYgLyogTk9YRkVSICovCisgICAgICAgICAgY2ZsZyA9IDE7CQkJLyogQ29ubmVjdCAqLworICAgICAgICAgIHN0YXlmbGcgPSAxOwkJCS8qIFN0YXkgKi8KKyAgICAgICAgICB0bl9leGl0ID0gMTsJCQkvKiBUZWxuZXQtbGlrZSBleGl0IGNvbmRpdGlvbiAqLworICAgICAgICAgIHF1aWV0ID0gMTsKKyAgICAgICAgICBleGl0b25jbG9zZSA9IDE7CQkvKiBFeGl0IHdoZW4gY29ubmVjdGlvbiBjbG9zZXMgKi8KKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICBpZiAobG9jYWwpIHsKKyAgICAgICAgICAgICAgaWYgKG5tYWMpIHsJCS8qIEFueSBtYWNyb3MgZGVmaW5lZD8gKi8KKyAgICAgICAgICAgICAgICAgIGludCBrOwkJLyogWWVzICovCisgICAgICAgICAgICAgICAgICBrID0gbWxvb2sobWFjdGFiLCJvbl9vcGVuIixubWFjKTsgLyogTG9vayB0aGlzIHVwICovCisgICAgICAgICAgICAgICAgICBpZiAoayA+PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogSWYgZm91bmQsICovCisgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvZG8oayx0dG5hbWUsMCkgPiAtMSkgICAgLyogc2V0IGl0IHVwLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIoMSk7ICAgICAgICAgICAgICAgIC8qIGFuZCBleGVjdXRlIGl0ICovCisgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICB9CisjZW5kaWYgLyogTk9TUEwgKi8KKwkgIHJldHVybigwKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBTU0hCVUlMVElOICovCisKKyAgICBpZiAoaG93Y2FsbGVkID09IElfQU1fU1NIU1VCKQorICAgICAgcmV0dXJuKDApOworCisvKgorICBGcm9tIGhlcmUgZG93bjogV2Ugd2VyZSBjYWxsZWQgYXMgImtlcm1pdCIgb3IgImlrc2QiLgorCisgIElmIHdlIHdlcmUgc3RhcnRlZCBkaXJlY3RseSBmcm9tIGEgS2VybWl0IHNjcmlwdCBmaWxlLAorICB0aGUgZmlsZW5hbWUgb2YgdGhlIHNjcmlwdCBpcyBpbiBhcmd2WzFdLCBzbyBza2lwIHBhc3QgaXQuCisqLworICAgIGlmICh4YXJnYyA+IDEpIHsKKyAgICAgICAgaW50IG4gPSAxOworICAgICAgICBpZiAoKnhhcmd2WzFdICE9ICctJykgeworCisjaWZkZWYgS0VSQkFORworICAgICAgICAgICAgLyogSWYgd2Ugd2VyZSBzdGFydGVkIHdpdGggYSBLZXJiYW5nIHNjcmlwdCwgdGhlIHNjcmlwdCAqLworICAgICAgICAgICAgLyogYXJndW1lbnRzIHdlcmUgYWxyZWFkeSBwaWNrZWQgdXAgaW4gcHJlc2NhbiAvIGNtZGluaSgpICovCisgICAgICAgICAgICAvKiBhbmQgdGhlcmUgaXMgbm90aGluZyBoZXJlIGZvciB1cyBhbnl3YXkuICovCisgICAgICAgICAgICBpZiAoIXN0cmNtcCh4YXJndlsxXSwiKyIpKQorICAgICAgICAgICAgICByZXR1cm4oMCk7CisjZW5kaWYgLyogS0VSQkFORyAqLworCisgICAgICAgICAgICBpZiAoY2ZpbGVmKSB7ICAgICAgICAgICAgICAgLyogQ29tbWFuZCBmaWxlIGZvdW5kIGluIHByZXNjYW4oKSAqLworICAgICAgICAgICAgICAgIHhhcmdjIC09IG47ICAgICAgICAgICAgIC8qIFNraXAgcGFzdCBpdCAqLworICAgICAgICAgICAgICAgIHhhcmd2ICs9IG47CisgICAgICAgICAgICAgICAgY2ZpbGVmID0gMDsKKyAgICAgICAgICAgICAgICBkZWJ1ZyhGMTAxLCJjbWRsaW4gY2ZpbGVmIHNldCB0byAwIiwiIixjZmlsZWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorLyoKKyAgUmVndWxhciBVbml4LXN0eWxlIGNvbW1hbmQgbGluZSBwYXJzZXIsIG1vc3RseSBjb25mb3JtaW5nIHdpdGggJ0EgUHJvcG9zZWQKKyAgQ29tbWFuZCBTeW50YXggU3RhbmRhcmQgZm9yIFVuaXggU3lzdGVtcycsIEhlbWVud2F5ICYgQXJtaXRhZ2UsIFVuaXgvV29ybGQsCisgIFZvbC4xLCBOby4zLCAxOTg0LgorKi8KKyAgICB3aGlsZSAoLS14YXJnYyA+IDApIHsgICAgICAgICAgICAgICAvKiBHbyB0aHJvdWdoIGNvbW1hbmQgbGluZSB3b3JkcyAqLworICAgICAgICB4YXJndisrOworICAgICAgICBkZWJ1ZyhGMTExLCJjbWRsaW4geGFyZ3YiLCp4YXJndix4YXJnYyk7CisgICAgICAgIGlmICgqKnhhcmd2ID09ICc9JykKKyAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIGlmICghc3RyY21wKCp4YXJndiwiLS0iKSkgICAgICAgLyogZ2V0b3B0KCkgY29uZm9ybWFuY2UgKi8KKyAgICAgICAgICByZXR1cm4oMCk7CisjaWZkZWYgVk1TCisgICAgICAgIGVsc2UgaWYgKCoqeGFyZ3YgPT0gJy8nKQorICAgICAgICAgIGNvbnRpbnVlOworI2VuZGlmIC8qIFZNUyAqLworICAgICAgICBlbHNlIGlmICgqKnhhcmd2ID09ICctJykgeyAgICAgIC8qIEdvdCBhbiBvcHRpb24gKGJlZ2lucyB3aXRoIGRhc2gpICovCisgICAgICAgICAgICBpbnQgeHg7CisgICAgICAgICAgICB4ID0gKigqeGFyZ3YrMSk7ICAgICAgICAgICAgLyogR2V0IHRoZSBvcHRpb24gbGV0dGVyICovCisgICAgICAgICAgICBkZWJ1ZyhGMTExLCJjbWRsaW4gYXJncyAxIiwqeGFyZ3YseGFyZ2MpOworICAgICAgICAgICAgeHggPSBkb2FyZyh4KTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDEsImNtZGxpbiBkb2FyZyIsIiIseHgpOworICAgICAgICAgICAgZGVidWcoRjExMSwiY21kbGluIGFyZ3MgMiIsKnhhcmd2LHhhcmdjKTsKKyAgICAgICAgICAgIGlmICh4eCA8IDApIHsKKyNpZm5kZWYgTk9JQ1AKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBXX0NPTU1BTkQpCisgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8qIE5PSUNQICovCisgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSk7ICAgICAgICAgLyogR2l2ZSBpdCBhIGNoYW5jZS4uLiAqLworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICAgICAgICAgICAgICAgIGRvZXhpdChCQURfRVhJVCwxKTsgLyogR28gaGFuZGxlIG9wdGlvbiAqLworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFoYXZldXJsKSB7CQkvKiBObyBkYXNoIHdoZXJlIGV4cGVjdGVkICovCisJICAgIGNoYXIgeGJ1ZlszMl07CisgICAgICAgICAgICBjaGFyIGJ1ZlsxMjhdOworCSAgICBpbnQgazsKKwkgICAgayA9IGNrc3RybmNweSh4YnVmLCp4YXJndiw0MCk7CisJICAgIGlmIChrID4gMzApIHsKKwkJeGJ1ZlszMF0gPSAnLic7CisJCXhidWZbMjldID0gJy4nOworCQl4YnVmWzI4XSA9ICcuJzsKKwkgICAgfQorCSAgICB4YnVmWzMxXSA9IE5VTDsKKyAgICAgICAgICAgIGNrbWFrbXNnKGJ1ZiwKKwkJICAgICAxMjgsCisJCSAgICAgImludmFsaWQgY29tbWFuZC1saW5lIG9wdGlvbiwgdHlwZSBcIiIsCisJCSAgICAgbXluYW1lLAorCQkgICAgICIgLWhcIiBmb3IgaGVscCIsCisJCSAgICAgTlVMTAorCQkgICAgICk7CisJICAgIGZhdGFsMih4YnVmLGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVibG9nKSB7CisjaWZuZGVmIE5PSUNQCisgICAgICAgIGRlYnVnKEYxMDEsImNtZGxpbiB3aGF0IiwiIix3aGF0KTsKKyNlbmRpZiAvKiBOT0lDUCAqLworICAgICAgICBkZWJ1ZyhGMTAxLCJjbWRsaW4gYWN0aW9uIiwiIixhY3Rpb24pOworI2lmbmRlZiBOT1hGRVIKKyAgICAgICAgZGVidWcoRjEwMSwiY21kbGluIHN0ZG91ZiIsIiIsc3Rkb3VmKTsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKworI2lmZGVmIE5PSUNQCisgICAgaWYgKCFhY3Rpb24gJiYgIWNmbGcgJiYgIWNuZmxnKSB7CisgICAgICAgIGRlYnVnKEYxMDAsImNtZGxpbiBOT0lDUCBmYXRhbCBubyBhY3Rpb24iLCIiLDApOworICAgICAgICBYRkFUQUwoIj9ObyBhY3Rpb25zIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUiKTsKKyAgICB9CisjZWxzZQorICAgIGlmIChpbnNlcnZlciAmJiB3aGF0ID09IDApIHsgICAgICAgIC8qIEludGVybmV0IEtlcm1pdCBzZXJ2ZXIgY2hlY2tzICovCisgICAgICAgIGlmIChsb2NhbCB8fCAoYWN0aW9uICE9IDAgJiYgYWN0aW9uICE9ICd4JykpIHsKKyAgICAgICAgICAgIGlmIChsb2NhbCkKKyAgICAgICAgICAgICAgcHJpbnRmKCJsb2NhbFxyXG4iKTsKKyAgICAgICAgICAgIGlmIChhY3Rpb24pCisgICAgICAgICAgICAgIHByaW50ZigiYWN0aW9uPSVjXHJcbiIsYWN0aW9uKTsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsImNtZGxpbiBmYXRhbCAxIiwiIiwwKTsKKyAgICAgICAgICAgIFhGQVRBTCgiTm8gYWN0aW9ucyBvciBjb25uZWN0aW9ucyBhbGxvd2VkIHdpdGggLUEiKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBOT0lDUCAqLworCisjaWZuZGVmIE5PTE9DQUwKKyAgICBpZiAoIWxvY2FsKSB7CisgICAgICAgIGlmICgoYWN0aW9uID09ICdjJykgfHwgKGNmbGcgIT0gMCkpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMDAsImNtZGxpbiBmYXRhbCAyIiwiIiwwKTsKKyAgICAgICAgICAgIFhGQVRBTCgiLWwgb3IgLWogb3IgLVggcmVxdWlyZWQiKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZuZGVmIE5PWEZFUgorICAgIGlmICgqY21hcmcyICE9IDApIHsKKyAgICAgICAgaWYgKChhY3Rpb24gIT0gJ3MnKSAmJiAoYWN0aW9uICE9ICdyJykgJiYgKGFjdGlvbiAhPSAndicpKSB7CisgICAgICAgICAgICBkZWJ1ZyhGMTAwLCJjbWRsaW4gZmF0YWwgMyIsIiIsMCk7CisgICAgICAgICAgICBYRkFUQUwoIi1hIHdpdGhvdXQgLXMsIC1yLCBvciAtZyIpOworICAgICAgICB9CisgICAgICAgIGlmIChhY3Rpb24gPT0gJ3InIHx8IGFjdGlvbiA9PSAndicpIHsKKyNpZmRlZiBDS19UTVBESVIKKyAgICAgICAgICAgIGlmIChpc2RpcihjbWFyZzIpKSB7ICAgICAgICAvKiAtYSBpcyBhIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgICAgIGlmICghemNoZGlyKGNtYXJnMikpIHsgIC8qIHRyeSB0byBjaGFuZ2UgdG8gaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVidWcoRjEwMCwiY21kbGluIGZhdGFsIDQiLCIiLDApOworICAgICAgICAgICAgICAgICAgICBYRkFUQUwoImNhbid0IGNoYW5nZSB0byAnLWEnIGRpcmVjdG9yeSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBjbWFyZzIgPSAiIjsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIENLX1RNUERJUiAqLworICAgICAgICAgICAgICBpZiAoemNoa28oY21hcmcyKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgIGRlYnVnKEYxMDAsImNtZGxpbiBmYXRhbCA1IiwiIiwwKTsKKyAgICAgICAgICAgICAgICAgIFhGQVRBTCgid3JpdGUgYWNjZXNzIHRvIC1hIGZpbGUgZGVuaWVkIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKGFjdGlvbiA9PSAndicpICYmIChzdGRvdWYpICYmICghbG9jYWwpKSB7CisgICAgICAgIGlmIChpc19hX3R0eSgxKSkgeworICAgICAgICAgICAgZGVidWcoRjEwMCwiY21kbGluIGZhdGFsIDYiLCIiLDApOworICAgICAgICAgICAgWEZBVEFMKCJ1bnJlZGlyZWN0ZWQgLWsgY2FuIG9ubHkgYmUgdXNlZCBpbiBsb2NhbCBtb2RlIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChhY3Rpb24gPT0gJ3MnKSB8fCAoYWN0aW9uID09ICd2JykgfHwKKyAgICAgICAgKGFjdGlvbiA9PSAncicpIHx8IChhY3Rpb24gPT0gJ3gnKSkgeworICAgICAgICBpZiAobG9jYWwpCisgICAgICAgICAgZGlzcGxhID0gMTsKKyAgICAgICAgaWYgKHN0ZG91ZikgeworICAgICAgICAgICAgZGlzcGxhID0gMDsKKyAgICAgICAgICAgIHF1aWV0ID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocXVpZXQpIGRpc3BsYSA9IDA7ICAgICAgICAgICAgICAvKiBObyBkaXNwbGF5IGlmIHF1aWV0IHJlcXVlc3RlZCAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworI2lmZGVmIERFQlVHCisgICAgaWYgKGFjdGlvbikKKyAgICAgIGRlYnVnKEYwMDAsImNtZGxpbiByZXR1cm5zIGFjdGlvbiIsIiIsYWN0aW9uKTsKKyAgICBlbHNlCisgICAgICBkZWJ1ZyhGMTAxLCJjbWRsaW4gcmV0dXJucyBhY3Rpb24iLCIiLGFjdGlvbik7CisjZW5kaWYgLyogREVCVUcgKi8KKworICAgIHJldHVybihhY3Rpb24pOyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZW4gZG8gYW55IHJlcXVlc3RlZCBwcm90b2NvbCAqLworfQorCisvKiBFeHRlbmRlZCBhcmd1bWVudCBwYXJzaW5nOiAtLWtleXdvcmRbOnZhbHVlXSAob3IgPXZhbHVlKSAqLworCisvKgorICBYQV94eHh4IHN5bWJvbHMgYXJlIGRlZmluZWQgaW4gY2t1dXNyLmguCisgIElmIHlvdSBhZGQgYSBuZXcgb25lLCBhbHNvIHJlbWVtYmVyIHRvIHVwZGF0ZSBkb3Nob3coKSwKKyAgU0hYT1BUIHNlY3Rpb24sIGluIGNrdXVzNS5jLgorKi8KK3N0cnVjdCBrZXl0YWIgeGFyZ3RhYltdID0geworI2lmZGVmIENLX0xPR0lOCisgICAgeyAiYW5vbnltb3VzIiwgICBYQV9BTk9OLCBDTV9BUkd8Q01fUFJFIH0sCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICB7ICJiYW5uZXJmaWxlIiwgIFhBX0JBRkksIENNX0FSRyB9LAorICAgIHsgImNkZmlsZSIsICAgICAgWEFfQ0RGSSwgQ01fQVJHIH0sCisgICAgeyAiY2RtZXNzYWdlIiwgICBYQV9DRE1TLCBDTV9BUkcgfSwKKyAgICB7ICJjZG1zZyIsICAgICAgIFhBX0NETVMsIENNX0FSR3xDTV9JTlYgfSwKKyNpZmRlZiBLVUkKKyAgICB7ICJjaGFuZ2VkaW0iLCAgIFhBX0NIR0QsIENNX1BSRSB9LAorI2VuZGlmIC8qIEtVSSAqLworI2lmbmRlZiBOT0NTRVRTCisgICAgeyAiY2hhcnNldCIsICAgICBYQV9DU0VULCBDTV9BUkd8Q01fUFJFIH0sCisjZW5kaWYgLyogTk9DU0VUUyAqLworI2lmZGVmIElLU0RCCisgICAgeyAiZGF0YWJhc2UiLCAgICBYQV9EQkFTLCBDTV9BUkd8Q01fUFJFIH0sCisgICAgeyAiZGJmaWxlIiwgICAgICBYQV9EQkZJLCBDTV9BUkd8Q01fUFJFIH0sCisjZW5kaWYgLyogSUtTREIgKi8KKyNpZmRlZiBLVUkKKyAgICB7ICJmYWNlbmFtZSIsICAgIFhBX0ZOQU0sIENNX0FSR3xDTV9QUkV8Q01fSU5WIH0sCisgICAgeyAiZm9udG5hbWUiLCAgICBYQV9GTkFNLCBDTV9BUkd8Q01fUFJFIH0sCisgICAgeyAiZm9udHNpemUiLCAgICBYQV9GU0laLCBDTV9BUkd8Q01fUFJFIH0sCisjZW5kaWYgLyogS1VJICovCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIE5FV0ZUUAorICAgIHsgImZ0cCIsICAgICAgICAgWEFfRlRQLCAgQ01fQVJHIH0sCisjZW5kaWYgLyogTkVXRlRQICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgT1MyCisgICAgeyAiaGVpZ2h0IiwgICAgICBYQV9ST1dTLCBDTV9BUkd8Q01fUFJFIH0sCisjZW5kaWYgLyogT1MyICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIHsgImhlbHAiLCAgICAgICAgWEFfSEVMUCwgMCB9LAorI2lmbmRlZiBOT0hFTFAKKyAgICB7ICJoZWxwZmlsZSIsICAgIFhBX0hFRkksIENNX0FSRyB9LAorI2VuZGlmIC8qIE5PSEVMUCAqLworI2lmZGVmIENLX0xPR0lOCisgICAgeyAiaW5pdGZpbGUiLCAgICBYQV9BTkZJLCBDTV9BUkd8Q01fUFJFIH0sCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyNpZmRlZiBPUzIKKyAgICB7ICJsb2NrZG93biIsICAgIFhBX0xPQ0ssIENNX1BSRSB9LAorI2lmZGVmIEtVSQorICAgIHsgIm1heGltaXplIiwgICAgWEFfV01BWCwgIENNX1BSRSB9LAorICAgIHsgIm1pbmltaXplIiwgICAgWEFfV01JTiwgIENNX1BSRSB9LAorICAgIHsgIm5vYmFycyIsICAgICAgWEFfTk9CQVIsIENNX1BSRSB9LAorI2VuZGlmIC8qIEtVSSAqLworICAgIHsgIm5vZXNjYXBlIiwgICAgWEFfTk9FU0NBUEUsIENNX1BSRSB9LAorI2VuZGlmIC8qIE9TMiAqLworICAgIHsgIm5vaW50ZXJydXB0cyIsWEFfTk9JTiwgQ01fUFJFIH0sCisjaWZkZWYgS1VJCisgICAgeyAibm9tZW51YmFyIiwgICBYQV9OT01OLCBDTV9QUkUgfSwKKyNlbmRpZiAvKiBLVUkgKi8KKyAgICB7ICJub3Blcm1zIiwgICAgIFhBX05QUk0sIDAgfSwKKyNpZm5kZWYgTk9QVVNICisgICAgeyAibm9wdXNoIiwgICAgICBYQV9OT1BVU0gsIENNX1BSRSB9LAorI2VuZGlmIC8qIE5PUFVTSCAqLworI2lmZGVmIE9TMgorICAgIHsgIm5vc2Nyb2xsIiwgICAgWEFfTk9TQ1JPTEwsIENNX1BSRSB9LAorI2VuZGlmIC8qIE9TMiAqLworI2lmZGVmIEtVSQorICAgIHsgIm5vc3RhdHVzYmFyIiwgWEFfTk9TQiwgQ01fUFJFIH0sCisgICAgeyAibm90b29sYmFyIiwgICBYQV9OT1RCLCBDTV9QUkUgfSwKKyNlbmRpZiAvKiBLVUkgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgeyAicGFzc3dvcmQiLCAgICBYQV9QQVNTLCBDTV9BUkd8Q01fSU5WIH0sCisjZW5kaWYgLyogQ09NTUVOVCAqLworI2lmZGVmIENLX0xPR0lOCisjaWZuZGVmIE5PWEZFUgorI2lmZGVmIENLX1BFUk0KKyAgICB7ICJwZXJtaXNzaW9ucyIsIFhBX1BFUk0sIENNX0FSR3xDTV9QUkUgfSwKKyAgICB7ICJwZXJtcyIsICAgICAgIFhBX1BFUk0sIENNX0FSR3xDTV9QUkV8Q01fSU5WIH0sCisjZW5kaWYgLyogQ0tfUEVSTSAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworI2lmZGVmIFVOSVgKKyAgICB7ICJwcml2aWQiLCAgICAgIFhBX1BSSVYsIENNX0FSR3xDTV9QUkUgfSwKKyNlbmRpZiAvKiBVTklYICovCisjaWZuZGVmIE5PTE9DQUwKKyNpZm5kZWYgTk9DU0VUUworICAgIHsgInJjaGFyc2V0IiwgICAgWEFfQ1NFVCwgQ01fQVJHfENNX1BSRXxDTV9JTlYgfSwKKyNlbmRpZiAvKiBOT0NTRVRTICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworI2lmZGVmIFVOSVgKKyAgICB7ICJyb290IiwgICAgICAgIFhBX1JPT1QsIENNX0FSR3xDTV9QUkUgfSwKKyNlbHNlIC8qIFVOSVggKi8KKyNpZmRlZiBDS1JPT1QKKyAgICB7ICJyb290IiwgICAgICAgIFhBX1JPT1QsIENNX0FSR3xDTV9QUkUgfSwKKyNlbmRpZiAvKiBDS1JPT1QgKi8KKyNlbmRpZiAvKiBVTklYICovCisjaWZkZWYgS1VJCisgICAgeyAic2NhbGVmb250IiwgICBYQV9TQ0FMRSwgQ01fUFJFIH0sCisjZW5kaWYgLyogS1VJICovCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIFNTSEJVSUxUSU4KKyAgICB7ICJzc2giLCAgICAgICAgIFhBX1NTSCwgIENNX0FSRyB9LAorI2VuZGlmIC8qIFNTSEJVSUxUSU4gKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisjaWZkZWYgQ0tTWVNMT0cKKyAgICB7ICJzeXNsb2ciLCAgICAgIFhBX1NZU0wsIENNX0FSR3xDTV9QUkUgfSwKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIFROQ09ERQorICAgIHsgInRlbG5ldCIsICAgICAgWEFfVEVMLCAgQ01fQVJHIH0sCisjZW5kaWYgLyogVE5DT0RFICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgIHsgInRlcm10eXBlIiwgICAgWEFfVEVSTSwgQ01fQVJHfENNX1BSRSB9LAorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICB7ICJ0aW1lb3V0IiwgICAgIFhBX1RJTU8sIENNX0FSR3xDTV9QUkUgfSwKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgIHsgInRpdGxlIiwgICAgICAgWEFfVElUTCwgQ01fQVJHIH0sCisjZW5kaWYgLyogT1MyICovCisjaWZuZGVmIE5PU1BMCisgICAgeyAidXNlciIsICAgICAgICBYQV9VU0VSLCBDTV9BUkcgfSwKKyNlbmRpZiAvKiBOT1NQTCAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyAgICB7ICJ1c2VyZmlsZSIsICAgIFhBX1VTRkksIENNX0FSR3xDTV9QUkUgfSwKKyAgICB7ICJ2ZXJzaW9uIiwgICAgIFhBX1ZFUlMsIDAgfSwKKyNpZm5kZWYgTk9MT0NBTAorI2lmZGVmIE9TMgorICAgIHsgIndpZHRoIiwgICAgICAgWEFfQ09MUywgQ01fQVJHfENNX1BSRSB9LAorI2VuZGlmIC8qIE9TMiAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKyNpZmRlZiBDS1dUTVAKKyAgICB7ICJ3dG1wZmlsZSIsICAgIFhBX1dURkksIENNX0FSR3xDTV9QUkUgfSwKKyAgICB7ICJ3dG1wbG9nIiwgICAgIFhBX1dUTVAsIENNX0FSR3xDTV9QUkUgfSwKKyNlbmRpZiAvKiBDS1dUTVAgKi8KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgIHsgInhmZXJmaWxlIiwgICAgWEFfSUtGSSwgQ01fQVJHfENNX1BSRSB9LAorICAgIHsgInhmZXJsb2ciLCAgICAgWEFfSUtMRywgQ01fQVJHfENNX1BSRSB9LAorI2lmbmRlZiBOT0xPQ0FMCisjaWZkZWYgS1VJCisgICAgeyAieHBvcyIsICAgICAgICBYQV9YUE9TLCBDTV9BUkd8Q01fUFJFIH0sCisgICAgeyAieXBvcyIsICAgICAgICBYQV9ZUE9TLCBDTV9BUkd8Q01fUFJFIH0sCisjZW5kaWYgLyogS1VJICovCisjZW5kaWYgLyogTk9MT0NBTCAqLworICAgIHsiIiwgMCwgMCB9Cit9OworaW50IG54YXJncyA9IHNpemVvZih4YXJndGFiKS9zaXplb2Yoc3RydWN0IGtleXRhYikgLSAxOworCitzdGF0aWMgc3RydWN0IGtleXRhYiBva3RhYltdID0geworICAgIHsgIjAiLCAgICAgMCwgMCB9LAorICAgIHsgIjEiLCAgICAgMSwgMCB9LAorICAgIHsgIjIiLCAgICAgMiwgMCB9LAorICAgIHsgIjMiLCAgICAgMywgMCB9LAorICAgIHsgIjQiLCAgICAgNCwgMCB9LAorICAgIHsgIjUiLCAgICAgNSwgMCB9LAorICAgIHsgIjYiLCAgICAgNiwgMCB9LAorICAgIHsgIjciLCAgICAgNywgMCB9LAorICAgIHsgIjgiLCAgICAgOCwgMCB9LAorICAgIHsgIjkiLCAgICAgOSwgMCB9LAorICAgIHsgImZhbHNlIiwgMCwgMCB9LAorICAgIHsgIm5vIiwgICAgMCwgMCB9LAorICAgIHsgIm9mZiIsICAgMCwgMCB9LAorICAgIHsgIm9rIiwgICAgMSwgMCB9LAorICAgIHsgIm9uIiwgICAgMSwgMCB9LAorICAgIHsgInRydWUiLCAgMSwgMCB9LAorICAgIHsgInllcyIsICAgMSwgMCB9Cit9Oworc3RhdGljIGludCBub2t0YWIgPSBzaXplb2Yob2t0YWIpL3NpemVvZihzdHJ1Y3Qga2V5dGFiKTsKKworI2RlZmluZSBYQVJHQlVGTCAzMgorCitjaGFyICogeG9wdGhscFtYQV9NQVgrMV07ICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgb3B0aW9uIGhlbHAgKi8KK2NoYXIgKiB4YXJnaGxwW1hBX01BWCsxXTsgICAgICAgICAgICAgICAvKiBFeHRlbmRlZCBhcmd1bWVudCBmb3Igb3B0aW9uICovCisKK3N0YXRpYyBWT0lECitpbml4b3B0aGxwKCkgeworICAgIGludCBpLCBqOworICAgIGZvciAoaSA9IDA7IGkgPD0gWEFfTUFYOyBpKyspIHsgICAgIC8qIEluaXRpYWxpemUgYWxsIHRvIG51bGwgKi8KKyAgICAgICAgeG9wdGhscFtpXSA9IE5VTEw7CisgICAgICAgIHhhcmdobHBbaV0gPSBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnhhcmdzOyBpKyspIHsgICAgICAvKiBUaGVuIGZvciBlYWNoIGRlZmluZWQga2V5d29yZCAqLworICAgICAgICBqID0geGFyZ3RhYltpXS5rd3ZhbDsgICAgICAgICAgIC8qIGluZGV4IGJ5IGFzc29jaWF0ZWQgdmFsdWUgKi8KKyAgICAgICAgaWYgKGogPCAwIHx8IGogPiBYQV9NQVgpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIHN3aXRjaCAoaikgeworI2lmZGVmIENLX0xPR0lOCisgICAgICAgICAgY2FzZSBYQV9BTk9OOiAgICAgICAgICAgICAgICAgLyogIi0tYW5vbnltb3VzIiAqLworICAgICAgICAgICAgeG9wdGhscFtqXSA9ICItLWFub255bW91czp7b24sb2ZmfSBbSUtTRCBvbmx5XSI7CisgICAgICAgICAgICB4YXJnaGxwW2pdID0gIldoZXRoZXIgdG8gYWxsb3cgYW5vbnltb3VzIElLU0QgbG9naW5zIjsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFVOSVgKKwkgIGNhc2UgWEFfUFJJVjoKKyAgICAgICAgICAgIHhvcHRobHBbal0gPSAiLS1wcml2aWQ6e29uLG9mZn0gW0lLU0Qgb25seV0iOworICAgICAgICAgICAgeGFyZ2hscFtqXSA9ICJXaGV0aGVyIHRvIGFsbG93IHByaXZpbGVnZWQgSURzIHRvIGxvZ2luIHRvIElLU0QiOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogVU5JWCAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisgICAgICAgICAgY2FzZSBYQV9CQUZJOiAgICAgICAgICAgICAgICAgLyogIi0tYmFubmVyZmlsZSIgKi8KKyAgICAgICAgICAgIHhvcHRobHBbal0gPSAiLS1iYW5uZXJmaWxlOjxmaWxlbmFtZT4iOworICAgICAgICAgICAgeGFyZ2hscFtqXSA9ICJGaWxlIHRvIGRpc3BsYXkgdXBvbiBzdGFydHVwIG9yIElLU0QgbG9naW4iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBYQV9DREZJOiAgICAgICAgICAgICAgICAgLyogIi0tY2RmaWxlIiAqLworICAgICAgICAgICAgeG9wdGhscFtqXSA9ICItLWNkZmlsZTo8ZmlsZW5hbWU+IjsKKyAgICAgICAgICAgIHhhcmdobHBbal0gPSAiRmlsZSB0byBkaXNwbGF5IHdoZW4gc2VydmVyIGNoYW5nZXMgZGlyZWN0b3J5IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgWEFfQ0RNUzogICAgICAgICAgICAgICAgIC8qICItLWNkbWVzc2FnZSIgKi8KKyAgICAgICAgICAgIHhvcHRobHBbal0gPSAiLS1jZG1lc3NhZ2U6e29uLG9mZn0iOworICAgICAgICAgICAgeGFyZ2hscFtqXSA9ICJXaGV0aGVyIHRvIGRpc3BsYXkgQ0QgbWVzc2FnZSBmaWxlIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgWEFfSEVMUDogICAgICAgICAgICAgICAgIC8qICItLWhlbHAiICovCisgICAgICAgICAgICB4b3B0aGxwW2pdID0gIi0taGVscCI7CisgICAgICAgICAgICB4YXJnaGxwW2pdID0gIlByaW50IHRoaXMgaGVscCB0ZXh0IGFib3V0IGV4dGVuZGVkIG9wdGlvbnMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBYQV9IRUZJOiAgICAgICAgICAgICAgICAgLyogIi0taGVscCIgKi8KKyAgICAgICAgICAgIHhvcHRobHBbal0gPSAiLS1oZWxwZmlsZTo8ZmlsZW5hbWU+IjsKKyAgICAgICAgICAgIHhhcmdobHBbal0gPSAiRmlsZSBjb250YWluaW5nIGN1c3RvbSBpbmZvIGZvciBIRUxQIGNvbW1hbmQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBYQV9JS0ZJOiAgICAgICAgICAgICAgICAgLyogIi0teGZlcmZpbGUiICovCisgICAgICAgICAgICB4b3B0aGxwW2pdID0gIi0teGZlcmZpbGU6PGZpbGVuYW1lPiBbSUtTRCBvbmx5XSI7CisgICAgICAgICAgICB4YXJnaGxwW2pdID0gIk5hbWUgb2YgZnRwZC1saWtlIGxvZ2ZpbGUuIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgWEFfSUtMRzogICAgICAgICAgICAgICAgIC8qICItLXhmZXJsb2ciICovCisgICAgICAgICAgICB4b3B0aGxwW2pdID0gIi0teGZlcmxvZzp7b24sb2ZmfSBbSUtTRCBvbmx5XSI7CisgICAgICAgICAgICB4YXJnaGxwW2pdID0gIldoZXRoZXIgdG8ga2VlcCBhbiBmdHBkLWxpa2UgbG9nZmlsZS4iOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgICAgICBjYXNlIFhBX0FORkk6ICAgICAgICAgICAgICAgICAvKiAiLS1pbml0ZmlsZSIgKi8KKyAgICAgICAgICAgIHhvcHRobHBbal0gPSAiLS1pbml0ZmlsZTo8ZmlsZW5hbWU+IFtJS1NEIG9ubHldIjsKKyAgICAgICAgICAgIHhhcmdobHBbal0gPSAiSW5pdGlhbGl6YXRpb24gZmlsZSBmb3IgYW5vbnltb3VzIHVzZXJzLiI7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBDS19QRVJNCisgICAgICAgICAgY2FzZSBYQV9QRVJNOiAgICAgICAgICAgICAgICAgLyogIi0tcGVybWlzc2lvbnMiICovCisgICAgICAgICAgICB4b3B0aGxwW2pdID0gIi0tcGVybWlzc2lvbnM6PG9jdGFsbnVtPiBbSUtTRCBvbmx5XSI7CisgICAgICAgICAgICB4YXJnaGxwW2pdID0gIlBlcm1pc3Npb25zIGZvciBmaWxlcyB1cGxvYWRlZCBieSBhbm9ueW1vdXMgdXNlcnMuIjsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX1BFUk0gKi8KKyNpZmRlZiBVTklYCisgICAgICAgICAgY2FzZSBYQV9ST09UOiAgICAgICAgICAgICAgICAgLyogIi0tcm9vdCIgKi8KKyAgICAgICAgICAgIHhvcHRobHBbal0gPSAiLS1yb290OjxkaXJlY3Rvcnk+IFtJS1NEIG9ubHldIjsKKyAgICAgICAgICAgIHhhcmdobHBbal0gPSAiRmlsZS1zeXN0ZW0gcm9vdCBmb3IgYW5vbnltb3VzIHVzZXJzLiI7CisgICAgICAgICAgICBicmVhazsKKyNlbHNlIC8qIFVOSVggKi8KKyNpZmRlZiBDS1JPT1QKKyAgICAgICAgICBjYXNlIFhBX1JPT1Q6ICAgICAgICAgICAgICAgICAvKiAiLS1yb290IiAqLworICAgICAgICAgICAgeG9wdGhscFtqXSA9ICItLXJvb3Q6PGRpcmVjdG9yeT4gW0lLU0Qgb25seV0iOworICAgICAgICAgICAgeGFyZ2hscFtqXSA9ICJGaWxlLXN5c3RlbSByb290IGZvciBhbm9ueW1vdXMgdXNlcnMuIjsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLUk9PVCAqLworI2VuZGlmIC8qIFVOSVggKi8KKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2lmZGVmIENLU1lTTE9HCisgICAgICAgICAgY2FzZSBYQV9TWVNMOiAgICAgICAgICAgICAgICAgLyogIi0tc3lzbG9nIiAqLworICAgICAgICAgICAgeG9wdGhscFtqXSA9ICItLXN5c2xvZzo8ZGlnaXQ+IFtJS1NEIG9ubHldIjsKKyAgICAgICAgICAgIHhhcmdobHBbal0gPSAiU3lzbG9nIHJlY29yZGluZyBsZXZlbCwgMC02LiI7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS1NZU0xPRyAqLworICAgICAgICAgIGNhc2UgWEFfVVNGSTogICAgICAgICAgICAgICAgIC8qICItLXVzZXJmaWxlIiAqLworICAgICAgICAgICAgeG9wdGhscFtqXSA9ICItLXVzZXJmaWxlOjxmaWxlbmFtZT4gW0lLU0Qgb25seV0iOworICAgICAgICAgICAgeGFyZ2hscFtqXSA9ICJGb3JiaWRkZW4gdXNlciBmaWxlLiI7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBDS1dUTVAKKyAgICAgICAgICBjYXNlIFhBX1dURkk6ICAgICAgICAgICAgICAgICAvKiAiLS13dG1wZmlsZSIgKi8KKyAgICAgICAgICAgIHhvcHRobHBbal0gPSAiLS13dG1wZmlsZTo8ZmlsZW5hbWU+IFtJS1NEIG9ubHldIjsKKyAgICAgICAgICAgIHhhcmdobHBbal0gPSAiTmFtZSBvZiB3dG1wIGxvZ2ZpbGUuIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgWEFfV1RNUDogICAgICAgICAgICAgICAgIC8qICItLXd0bXBsb2ciICovCisgICAgICAgICAgICB4b3B0aGxwW2pdID0gIi0td3RtcGxvZzp7b24sb2ZmfSBbSUtTRCBvbmx5XSI7CisgICAgICAgICAgICB4YXJnaGxwW2pdID0gIldoZXRoZXIgdG8ga2VlcCBhIHd0bXAgbG9nZmlsZS4iOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tXVE1QICovCisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgICAgICBjYXNlIFhBX1RJTU86ICAgICAgICAgICAgICAgICAvKiAiLS10aW1lb3V0IiAqLworICAgICAgICAgICAgeG9wdGhscFtqXSA9ICItLXRpbWVvdXQ6PHNlY29uZHM+IFtJS1NEIG9ubHldIjsKKyAgICAgICAgICAgIHhhcmdobHBbal0gPQorICJIb3cgbG9uZyB0byB3YWl0IGZvciBsb2dpbiBiZWZvcmUgY2xvc2luZyB0aGUgY29ubmVjdGlvbi4iOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICAgICAgICBjYXNlIFhBX05PSU46CisgICAgICAgICAgICB4b3B0aGxwW2pdID0gIi0tbm9pbnRlcnJ1cHRzIjsKKyAgICAgICAgICAgIHhhcmdobHBbal0gPSAiRGlzYWJsZSBrZXlib2FyZCBpbnRlcnJ1cHRzLiI7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBJS1NEQgorICAgICAgICAgIGNhc2UgWEFfREJBUzoKKyAgICAgICAgICAgIHhvcHRobHBbal0gPSAiLS1kYXRhYmFzZTp7b24sb2ZmfSI7CisgICAgICAgICAgICB4YXJnaGxwW2pdID0gIkVuYWJsZS9EaXNhYmxlIElLU0QgZGF0YWJhc2UgKElLU0Qgb25seSkiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBYQV9EQkZJOgorICAgICAgICAgICAgeG9wdGhscFtqXSA9ICItLWRiZmlsZTo8ZmlsZW5hbWU+IjsKKyAgICAgICAgICAgIHhhcmdobHBbal0gPSAiU3BlY2lmeSBJS1NEIGRhdGFiYXNlIGZpbGUgKElLU0Qgb25seSkiOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogSUtTREIgKi8KKyNpZmRlZiBDS19QRVJNUworCSAgY2FzZSBYQV9OUFJNOgorICAgICAgICAgICAgeG9wdGhscFtqXSA9ICItLW5vcGVybXMiOworICAgICAgICAgICAgeGFyZ2hscFtqXSA9ICJEaXNhYmxlIGZpbGUtdHJhbnNmZXIgUGVybWlzc2lvbnMgYXR0cmlidXRlLiI7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19QRVJNUyAqLworI2lmZGVmIEtVSQorICAgICAgICAgIGNhc2UgWEFfQ0hHRDoKKwkgICAgeG9wdGhscFtqXSA9ICItLWNoYW5nZWRpbSI7CisJICAgIHhhcmdobHBbal0gPSAiQ2hhbmdlIERpbWVuc2lvbiBvbiBXaW5kb3cgUmVzaXplIjsKKyAgICAgICAgICBjYXNlIFhBX1NDQUxFOgorCSAgICB4b3B0aGxwW2pdID0gIi0tc2NhbGVmb250IjsKKwkgICAgeGFyZ2hscFtqXSA9ICJTY2FsZSBGb250IG9uIFdpbmRvdyBSZXNpemUiOworICAgICAgICAgIGNhc2UgWEFfV01BWDoKKwkgICAgeG9wdGhscFtqXSA9ICItLW1heGltaXplIjsKKwkgICAgeGFyZ2hscFtqXSA9ICJzdGFydCBLOTVHIHdpbmRvdyBtYXhpbWl6ZWQuIjsKKwkgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBYQV9XTUlOOgorCSAgICB4b3B0aGxwW2pdID0gIi0tbWluaW1pemUiOworCSAgICB4YXJnaGxwW2pdID0gInN0YXJ0IEs5NUcgd2luZG93IG1pbmltaXplZC4iOworCSAgICBicmVhazsKKwkgIGNhc2UgWEFfWFBPUzoKKwkgICAgeG9wdGhscFtqXSA9ICItLXhwb3M6biI7CisJICAgIHhhcmdobHBbal0gPSAiWC1jb29yZGluYXRlIG9mIHdpbmRvdyBwb3NpdGlvbiAobnVtYmVyKS4iOworCSAgICBicmVhazsKKwkgIGNhc2UgWEFfWVBPUzoKKwkgICAgeG9wdGhscFtqXSA9ICItLXlwb3M6biI7CisJICAgIHhhcmdobHBbal0gPSAiWS1jb29yZGluYXRlIG9mIHdpbmRvdyBwb3NpdGlvbiAobnVtYmVyKS4iOworCSAgICBicmVhazsKKwkgIGNhc2UgWEFfRk5BTToKKwkgICAgeG9wdGhscFtqXSA9ICItLWZvbnRuYW1lOnMgKG9yIC0tZmFjZW5hbWU6cykiOworCSAgICB4YXJnaGxwW2pdID0gIkZvbnQvdHlwZWZhY2UgbmFtZTogc3RyaW5nIHdpdGggXyByZXBsYWNpbmcgYmxhbmsuIjsKKwkgICAgYnJlYWs7CisJICBjYXNlIFhBX0ZTSVo6CisJICAgIHhvcHRobHBbal0gPSAiLS1mb250c2l6ZTpuIjsKKwkgICAgeGFyZ2hscFtqXSA9ICJGb250IHBvaW50IHNpemUgKG51bWJlcikuIjsKKwkgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBYQV9OT01OOgorICAgICAgICAgICAgeG9wdGhscFtqXSA9ICItLW5vbWVudWJhciI7CisgICAgICAgICAgICB4YXJnaGxwW2pdID0gIk5vIE1lbnUgQmFyIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgWEFfTk9UQjoKKyAgICAgICAgICAgIHhvcHRobHBbal0gPSAiLS1ub3Rvb2xiYXIiOworICAgICAgICAgICAgeGFyZ2hscFtqXSA9ICJObyBUb29sIEJhciI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFhBX05PU0I6CisgICAgICAgICAgICB4b3B0aGxwW2pdID0gIi0tbm9zdGF0dXNiYXIiOworICAgICAgICAgICAgeGFyZ2hscFtqXSA9ICJObyBTdGF0dXMgQmFyIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgWEFfTk9CQVI6CisgICAgICAgICAgICB4b3B0aGxwW2pdID0gIi0tbm9iYXJzIjsKKyAgICAgICAgICAgIHhhcmdobHBbal0gPSAiTm8gTWVudSwgU3RhdHVzLCBvciBUb29sIEJhcnMiOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogS1VJICovCisjaWZuZGVmIE5PUFVTSAorICAgICAgICAgIGNhc2UgWEFfTk9QVVNIOgorCSAgICB4b3B0aGxwW2pdID0gIi0tbm9wdXNoIjsKKwkgICAgeGFyZ2hscFtqXSA9ICJEaXNhYmxlIGV4dGVybmFsIGNvbW1hbmQgZXhlY3V0aW9uLiI7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIE5PUFVTSCAqLworI2lmZGVmIE9TMgorICAgICAgICAgIGNhc2UgWEFfTE9DSzoKKwkgICAgeG9wdGhscFtqXSA9ICItLWxvY2tkb3duIjsKKwkgICAgeGFyZ2hscFtqXSA9ICJFbmFibGUgYWxsIGxvY2tkb3duIG9wdGlvbnMuIjsKKwkgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBYQV9OT1NDUk9MTDoKKwkgICAgeG9wdGhscFtqXSA9ICItLW5vc2Nyb2xsIjsKKwkgICAgeGFyZ2hscFtqXSA9ICJEaXNhYmxlIHNjcm9sbGJhY2sgb3BlcmF0aW9ucy4iOworCSAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFhBX05PRVNDQVBFOgorCSAgICB4b3B0aGxwW2pdID0gIi0tbm9lc2NhcGUiOworCSAgICB4YXJnaGxwW2pdID0gIkRpc2FibGUgZXNjYXBlIGZyb20gY29ubmVjdCBtb2RlLiI7CisJICAgIGJyZWFrOworCSAgY2FzZSBYQV9ST1dTOgorCSAgICB4b3B0aGxwW2pdID0gIi0taGVpZ2h0Om4iOworCSAgICB4YXJnaGxwW2pdID0gIlNjcmVlbiBoZWlnaHQgKG51bWJlciBvZiByb3dzKS4iOworCSAgICBicmVhazsKKwkgIGNhc2UgWEFfQ09MUzoKKwkgICAgeG9wdGhscFtqXSA9ICItLXdpZHRoOm4iOworCSAgICB4YXJnaGxwW2pdID0gIlNjcmVlbiB3aWR0aCAobnVtYmVyIG9mIGNvbHVtbnMpLiI7CisJICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgWEFfVElUTDoKKyAgICAgICAgICAgIHhvcHRobHBbal0gPSAiLS10aXRsZTpzdHJpbmciOworICAgICAgICAgICAgeGFyZ2hscFtqXSA9ICJXaW5kb3cgVGl0bGUuIjsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE9TMiAqLworCSAgY2FzZSBYQV9DU0VUOgorCSAgICB4b3B0aGxwW2pdID0gIi0tcmNoYXJzZXQ6bmFtZSI7CisJICAgIHhhcmdobHBbal0gPSAiTmFtZSBvZiByZW1vdGUgdGVybWluYWwgY2hhcmFjdGVyIHNldC4iOworCSAgICBicmVhazsKKwkgIGNhc2UgWEFfVEVSTToKKwkgICAgeG9wdGhscFtqXSA9ICItLXRlcm10eXBlOm5hbWUiOworI2lmZGVmIE9TMgorCSAgICB4YXJnaGxwW2pdID0gIkNob29zZSB0ZXJtaW5hbCBlbXVsYXRpb24uIjsKKyNlbHNlCisJICAgIHhhcmdobHBbal0gPSAiQ2hvb3NlIHRlcm1pbmFsIHR5cGUuIjsKKyNlbmRpZiAvKiBPUzIgKi8KKwkgICAgYnJlYWs7CisJICBjYXNlIFhBX1VTRVI6CisJICAgIHhvcHRobHBbal0gPSAiLS11c2VyOm5hbWUiOworI2lmbmRlZiBORVRDT05OCisJICAgIHhhcmdobHBbal0gPSAiVXNlcm5hbWUgKGZvciBuZXR3b3JrIGxvZ2luKSI7CisjZWxzZQorCSAgICB4YXJnaGxwW2pdID0gIlVzZXJuYW1lLiI7CisjZW5kaWYgLyogTkVUQ09OTiAqLworCSAgICBicmVhazsKKyAgICAgICB9CisgICAgfQorfQorCitWT0lECitpbmlvcHRobHAoKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgIG9wdGFjdFtpXSA9IDA7CisgICAgICAgIHN3aXRjaChpKSB7CisjaWZkZWYgT1MyCisgICAgICAgICAgY2FzZSAnIyc6ICAgICAgICAgICAgICAgICAgICAgLyogSzk1IFN0YXJ0dXAgRmxhZ3MgKi8KKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJLZXJtaXQgOTUgU3RhcnR1cCBGbGFncyI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSAiXG4iXAorICAgICAgICAgICAgICAiICAgMSAtIHR1cm4gb2ZmIFdpbjk1IHNwZWNpYWwgZml4ZXNcbiJcCisgICAgICAgICAgICAgICIgICAyIC0gZG8gbm90IGxvYWQgb3B0aW9uYWwgbmV0d29yayBkbGxzXG4iXAorICAgICAgICAgICAgICAiICAgNCAtIGRvIG5vdCBsb2FkIG9wdGlvbmFsIHRhcGkgZGxsc1xuIlwKKyAgICAgICAgICAgICAgIiAgIDggLSBkbyBub3QgbG9hZCBvcHRpb25hbCBrZXJiZXJvcyBkbGxzXG4iXAorICAgICAgICAgICAgICAiICAxNiAtIGRvIG5vdCBsb2FkIG9wdGlvbmFsIHptb2RlbSBkbGxzXG4iXAorICAgICAgICAgICAgICAiICAzMiAtIHVzZSBzdGRpbiBmb3IgaW5wdXQgaW5zdGVhZCBvZiB0aGUgY29uc29sZVxuIlwKKyAgICAgICAgICAgICAgIiAgNjQgLSB1c2Ugc3Rkb3V0IGZvciBvdXRwdXQgaW5zdGVhZCBvZiB0aGUgY29uc29sZVxuIlwKKyAgICAgICAgICAgICAgIiAxMjggLSBkbyBub3QgdGVybWluYXRlIHByb2Nlc3MgaW4gcmVzcG9uc2UgdG8gU2Vzc2lvbiBMb2dvZmYiOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogT1MyICovCisgICAgICAgICAgY2FzZSAnMCc6ICAgICAgICAgICAgICAgICAgICAgLyogSW4gdGhlIG1pZGRsZSAqLworICAgICAgICAgICAgb3B0aGxwW2ldID0KKyAgICAgICAgICAgICAgIjEwMCUgdHJhbnNwYXJlbnQgQ09OTkVDVCBtb2RlIGZvciBcImluLXRoZS1taWRkbGVcIiBvcGVyYXRpb24iOworICAgICAgICAgICAgYXJnaGxwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICBvcHRobHBbaV0gPSAiQ29ubmVjdGlvbiBpcyA4LWJpdCBjbGVhbiI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBORVdGVFAKKyAgICAgICAgICBjYXNlICc5JzoKKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJNYWtlIGEgY29ubmVjdGlvbiB0byBhbiBGVFAgc2VydmVyIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJJUC1hZGRyZXNzLW9yLWhvc3RuYW1lWzpvcHRpb25hbC1UQ1AtcG9ydF0iOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTkVXRlRQICovCisKKyNpZmRlZiBJS1NECisgICAgICAgICAgY2FzZSAnQSc6CisgICAgICAgICAgICBvcHRobHBbaV0gPSAiS2VybWl0IGlzIHRvIGJlIHN0YXJ0ZWQgYXMgYW4gSW50ZXJuZXQgc2VydmljZSI7CisjaWZkZWYgTlQKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICIgIHNvY2tldCBoYW5kbGUgb2YgaW5jb21pbmcgY29ubmVjdGlvbiI7CisjZWxzZSAvKiBOVCAqLworICAgICAgICAgICAgYXJnaGxwW2ldID0gTlVMTDsKKyNlbmRpZiAvKiBOVCAqLworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogSUtTRCAqLworICAgICAgICAgIGNhc2UgJ0InOiBvcHRobHBbaV0gPQorCSAgIktlcm1pdCBpcyBydW5uaW5nIGluIEJhdGNoIG9yIEJhY2tncm91bmQgKG5vIGNvbnRyb2xsaW5nIHRlcm1pbmFsKSI7CisgICAgICAgICAgICBicmVhazsKKyNpZm5kZWYgTk9TUEwKKyAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJJbnRlcmFjdGl2ZS1tb2RlIENvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJDb21tYW5kcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBsaXN0IGluIGRvdWJsZXF1b3RlcyI7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1NQTCAqLworICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgb3B0aGxwW2ldID0gIkRlbGF5IGJlZm9yZSBzdGFydGluZyB0byBzZW5kIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJOdW1iZXIgb2Ygc2Vjb25kcyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJFeGl0IGF1dG9tYXRpY2FsbHkgd2hlbiBjb25uZWN0aW9uIGNsb3NlcyI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgVENQU09DS0VUCisgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICBvcHRobHBbaV0gPSAiTWFrZSBhIFRDUCBjb25uZWN0aW9uIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJOdW1lcmljIGZpbGUgZGVzY3JpcHRvciBvZiBvcGVuIFRDUCBjb25uZWN0aW9uIjsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFRDUFNPQ0tFVCAqLworICAgICAgICAgIGNhc2UgJ0cnOgorICAgICAgICAgICAgb3B0aGxwW2ldID0gIkdFVCBmcm9tIHNlcnZlciwgc2VuZCB0byBzdGFuZGFyZCBvdXRwdXQiOworICAgICAgICAgICAgYXJnaGxwW2ldID0gIlJlbW90ZSBmaWxlIHNwZWNpZmljYXRpb24iOworICAgICAgICAgICAgb3B0YWN0W2ldID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICAgICAgb3B0aGxwW2ldID0gIlN1cHByZXNzIHByb2dyYW0gc3RhcnR1cCBIZXJhbGQgYW5kIGdyZWV0aW5nIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJDb25uZWN0aW9uIGlzIHJlbGlhYmxlLCBzdHJlYW1pbmcgaXMgYWxsb3dlZCI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgVENQU09DS0VUCisgICAgICAgICAgY2FzZSAnSic6CisgICAgICAgICAgICBvcHRobHBbaV0gPSAiJ0JlIGxpa2UgVGVsbmV0JyI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSAiSVAgaG9zdG5hbWUvYWRkcmVzcyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IHNlcnZpY2UiOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogVENQU09DS0VUICovCisgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICBvcHRobHBbaV0gPSAiUmVjdXJzaXZlIGRpcmVjdG9yeSBkZXNjZW50IGZvciBmaWxlcyBpbiAtcyBvcHRpb24iOworICAgICAgICAgICAgYXJnaGxwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ00nOgorICAgICAgICAgICAgb3B0aGxwW2ldID0gIk15IHVzZXIgbmFtZSAoZm9yIHVzZSB3aXRoIFRlbG5ldCwgUmxvZ2luLCBldGMpIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJVc2VybmFtZSBzdHJpbmciOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgTkVUQklPUworICAgICAgICAgIGNhc2UgJ04nOgorICAgICAgICAgICAgb3B0aGxwW2ldID0gIk5FVEJJT1MgYWRhcHRlciBudW1iZXIiOworICAgICAgICAgICAgYXJnaGxwW2ldID0gIk51bWJlciI7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBORVRCSU9TICovCisgICAgICAgICAgY2FzZSAnTyc6ICAgICAgICAgICAgICAgICAgICAgLyogQmUgYSBzZXJ2ZXIgZm9yIE9uZSBjb21tYW5kIG9ubHkgKi8KKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJCZSBhIHNlcnZlciBmb3IgT25lIGNvbW1hbmQgb25seSI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSBOVUxMOworICAgICAgICAgICAgb3B0YWN0W2ldID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgb3B0aGxwW2ldID0gIkRvbid0IGNvbnZlcnQgZmlsZSAoUGF0aCkgbmFtZXMiOworICAgICAgICAgICAgYXJnaGxwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ1EnOgorICAgICAgICAgICAgb3B0aGxwW2ldID0gIlF1aWNrIChGQVNUKSBLZXJtaXQgcHJvdG9jb2wgc2V0dGluZ3MiOworICAgICAgICAgICAgYXJnaGxwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ1InOiAgICAgICAgICAgICAgICAgICAgIC8qIFJlbW90ZS1Pbmx5ICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSAiUmVtb3RlLW9ubHkgKG1ha2VzIElGIFJFTU9URSB0cnVlKSI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnUyc6ICAgICAgICAgICAgICAgICAgICAgLyogIlN0YXkiIC0gZW50ZXIgaW50ZXJhY3RpdmUgKi8KKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJTdGF5IChlbnRlciBjb21tYW5kIHBhcnNlciBhZnRlciBhY3Rpb24gb3B0aW9ucykiOworICAgICAgICAgICAgYXJnaGxwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ1QnOiAgICAgICAgICAgICAgICAgICAgIC8qIFRleHQgZmlsZSB0cmFuc2ZlciBtb2RlICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSAiVHJhbnNmZXIgZmlsZXMgaW4gVGV4dCBtb2RlIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBBTllYMjUKKyAgICAgICAgICBjYXNlICdVJzogICAgICAgICAgICAgICAgICAgICAvKiBYLjI1IGNhbGwgdXNlciBkYXRhICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSAiWC4yNSBjYWxsIFVzZXIgZGF0YSI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSAiQ2FsbC11c2VyLWRhdGEgc3RyaW5nIjsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEFOWVgyNSAqLworICAgICAgICAgIGNhc2UgJ1YnOiAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGF1dG9tYXRpYyBmaWxldHlwZSBzd2l0Y2hpbmcgKi8KKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJEaXNhYmxlIGF1dG9tYXRpYyBwZXItZmlsZSB0ZXh0L2JpbmFyeSBzd2l0Y2hpbmciOworICAgICAgICAgICAgYXJnaGxwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBPUzIKKyAgICAgICAgICBjYXNlICdXJzogICAgICAgICAgICAgICAgICAgICAvKiBXaW4zMiBXaW5kb3cgSGFuZGxlICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSAiIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisjaWZkZWYgQU5ZWDI1CisgICAgICAgICAgY2FzZSAnWCc6ICAgICAgICAgICAgICAgICAgICAgLyogU0VUIEhPU1QgdG8gWC4yNSBhZGRyZXNzICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSAiTWFrZSBhbiBYLjI1IGNvbm5lY3Rpb24iOworICAgICAgICAgICAgYXJnaGxwW2ldID0gIlguMjUgb3IgWC4xMjEgYWRkcmVzcyI7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBBTllYMjUgKi8KKyAgICAgICAgICBjYXNlICdZJzogICAgICAgICAgICAgICAgICAgICAvKiBObyBpbml0aWFsaXphdGlvbiBmaWxlICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSAiU2tpcCBpbml0aWFsaXphdGlvbiBmaWxlIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBBTllYMjUKKyAgICAgICAgICBjYXNlICdaJzogICAgICAgICAgICAgICAgICAgICAvKiBTRVQgSE9TVCB0byBYLjI1IGZpbGUgZGVzY3JpcHRvciAqLworICAgICAgICAgICAgb3B0aGxwW2ldID0gIk1ha2UgYW4gWC4yNSBjb25uZWN0aW9uIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJOdW1lcmljIGZpbGUgZGVzY3JpcHRvciBvZiBvcGVuIFguMjUgY29ubmVjdGlvbiI7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBBTllYMjUgKi8KKyAgICAgICAgICBjYXNlICdhJzogICAgICAgICAgICAgICAgICAgICAvKiBhcy1uYW1lICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSAiQXMtbmFtZSBmb3IgZmlsZShzKSBpbiAtcywgLXIsIG9yIC1nIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJBcy1uYW1lIHN0cmluZyAoYWx0ZXJuYXRpdmUgZmlsZW5hbWUpIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ2InOiAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBiaXRzLXBlci1zZWNvbmQgZm9yIHNlcmlhbCAqLworICAgICAgICAgICAgb3B0aGxwW2ldID0gIlNwZWVkIGZvciBzZXJpYWwgZGV2aWNlIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJOdW1lcmljIEJpdHMgcGVyIHNlY29uZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdjJzogICAgICAgICAgICAgICAgICAgICAvKiBDb25uZWN0IGJlZm9yZSAqLworICAgICAgICAgICAgb3B0YWN0W2ldID0gMTsKKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJDT05ORUNUIGJlZm9yZSB0cmFuc2ZlcnJpbmcgZmlsZXMiOworICAgICAgICAgICAgYXJnaGxwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ2QnOiAgICAgICAgICAgICAgICAgICAgIC8qIERFQlVHICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSAiQ3JlYXRlIGRlYnVnLmxvZyBmaWxlIChhIHNlY29uZCAtZCBhZGRzIHRpbWVzdGFtcHMpIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdlJzogICAgICAgICAgICAgICAgICAgICAvKiBFeHRlbmRlZCBwYWNrZXQgbGVuZ3RoICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSAiTWF4aW11bSBsZW5ndGggZm9yIGluY29taW5nIGZpbGUtdHJhbnNmZXIgcGFja2V0cyI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSAiTGVuZ3RoIGluIGJ5dGVzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ2YnOiAgICAgICAgICAgICAgICAgICAgIC8qIGZpbmlzaCAqLworICAgICAgICAgICAgb3B0YWN0W2ldID0gMTsKKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJTZW5kIEZpbmlzaCBjb21tYW5kIHRvIGEgS2VybWl0IHNlcnZlciI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnZyc6ICAgICAgICAgICAgICAgICAgICAgLyogZ2V0ICovCisgICAgICAgICAgICBvcHRhY3RbaV0gPSAxOworICAgICAgICAgICAgb3B0aGxwW2ldID0gIkdFVCBmaWxlKHMpIGZyb20gYSBLZXJtaXQgc2VydmVyIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJSZW1vdGUgZmlsZSBzcGVjaWZpY2F0aW9uIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ2gnOiAgICAgICAgICAgICAgICAgICAgIC8qIGhlbHAgKi8KKyAgICAgICAgICAgIG9wdGFjdFtpXSA9IDE7CisjaWZkZWYgT1MyT1JVTklYCisgICAgICAgICAgICBvcHRobHBbaV0gPQorCSAgICAgICJQcmludCB0aGlzIG1lc3NhZ2UgKHBpcGUgdGhydSAnbW9yZScgdG8gcHJldmVudCBzY3JvbGxpbmcpIjsKKyNlbHNlCisJICAgICAgIlByaW50IHRoaXMgbWVzc2FnZSI7CisjZW5kaWYgLyogT1MyT1JVTklYICovCisgICAgICAgICAgICBhcmdobHBbaV0gPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnaSc6ICAgICAgICAgICAgICAgICAgICAgLyogVHJlYXQgZmlsZXMgYXMgYmluYXJ5ICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSJUcmFuc2ZlciBmaWxlcyBpbiBiaW5hcnkgbW9kZSI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgVENQU09DS0VUCisgICAgICAgICAgY2FzZSAnaic6ICAgICAgICAgICAgICAgICAgICAgLyogU0VUIEhPU1QgKFRDUC9JUCBzb2NrZXQpICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSAiTWFrZSBhIFRDUCBjb25uZWN0aW9uIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9CisJICAgICAgIlRDUCBob3N0IG5hbWUvYWRkcmVzcyBhbmQgb3B0aW9uYWwgc2VydmljZSBuYW1lIG9yIG51bWJlciI7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyAgICAgICAgICBjYXNlICdrJzogICAgICAgICAgICAgICAgICAgICAvKiByZWNlaXZlIHRvIHN0ZG91dCAqLworICAgICAgICAgICAgb3B0YWN0W2ldID0gMTsKKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJSRUNFSVZFIGZpbGUocykgdG8gc3RhbmRhcmQgb3V0cHV0IjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdsJzogICAgICAgICAgICAgICAgICAgICAvKiBTRVQgTElORSAqLworICAgICAgICAgICAgb3B0aGxwW2ldID0gIk1ha2UgY29ubmVjdGlvbiBvbiBzZXJpYWwgY29tbXVuaWNhdGlvbnMgZGV2aWNlIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJTZXJpYWwgZGV2aWNlIG5hbWUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnbSc6ICAgICAgICAgICAgICAgICAgICAgLyogTW9kZW0gdHlwZSAqLworICAgICAgICAgICAgb3B0aGxwW2ldID0gIk1vZGVtIHR5cGUgZm9yIHVzZSB3aXRoIC1sIGRldmljZSI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSAiTW9kZW0gbmFtZSBhcyBpbiBTRVQgTU9ERU0gVFlQRSBjb21tYW5kIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ24nOiAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3QgYWZ0ZXIgKi8KKyAgICAgICAgICAgIG9wdGFjdFtpXSA9IDE7CisgICAgICAgICAgICBvcHRobHBbaV0gPSAiQ09OTkVDVCBhZnRlciB0cmFuc2ZlcnJpbmcgZmlsZXMiOworICAgICAgICAgICAgYXJnaGxwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIEFOWVgyNQorICAgICAgICAgIGNhc2UgJ28nOiAgICAgICAgICAgICAgICAgICAgIC8qIFguMjUgY2xvc2VkIHVzZXIgZ3JvdXAgKi8KKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJYLjI1IGNsb3NlZCB1c2VyIGdyb3VwIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJVc2VyIGdyb3VwIHN0cmluZyI7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBBTllYMjUgKi8KKyAgICAgICAgICBjYXNlICdwJzogICAgICAgICAgICAgICAgICAgICAvKiBTRVQgUEFSSVRZICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSAiUGFyaXR5IjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJPbmUgb2YgdGhlIGZvbGxvd2luZzogZXZlbiwgb2RkLCBtYXJrLCBub25lLCBzcGFjZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdxJzogICAgICAgICAgICAgICAgICAgICAvKiBRdWlldCAqLworICAgICAgICAgICAgb3B0aGxwW2ldID0gIlF1aWV0IChzdXBwcmVzcyBtb3N0IG1lc3NhZ2VzKSI7CisgICAgICAgICAgICBhcmdobHBbaV0gPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAncic6ICAgICAgICAgICAgICAgICAgICAgLyogcmVjZWl2ZSAqLworICAgICAgICAgICAgb3B0YWN0W2ldID0gMTsKKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJSRUNFSVZFIGZpbGUocykiOworICAgICAgICAgICAgYXJnaGxwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ3MnOiAgICAgICAgICAgICAgICAgICAgIC8qIHNlbmQgKi8KKyAgICAgICAgICAgIG9wdGFjdFtpXSA9IDE7CisgICAgICAgICAgICBvcHRobHBbaV0gPSAiU0VORCBmaWxlKHMpIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJPbmUgb3IgbW9yZSBmaWxlIHNwZWNpZmljYXRpb25zIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ3QnOiAgICAgICAgICAgICAgICAgICAgIC8qIExpbmUgdHVybmFyb3VuZCBoYW5kc2hha2UgKi8KKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJYT04gVHVybmFyb3VuZCBjaGFyYWN0ZXIgZm9yIGhhbGYtZHVwbGV4IGNvbm5lY3Rpb25zIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBBTllYMjUKKyAgICAgICAgICBjYXNlICd1JzogICAgICAgICAgICAgICAgICAgICAvKiBYLjI1IHJldmVyc2UgY2hhcmdlIGNhbGwgKi8KKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJYLjI1IHJldmVyc2UgY2hhcmdlIGNhbGwiOworICAgICAgICAgICAgYXJnaGxwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEFOWVgyNSAqLworICAgICAgICAgIGNhc2UgJ3YnOiAgICAgICAgICAgICAgICAgICAgIC8qIFZpbmRvdyBzaXplICovCisgICAgICAgICAgICBvcHRobHBbaV0gPSAiV2luZG93IHNpemUiOworICAgICAgICAgICAgYXJnaGxwW2ldID0gIk51bWJlciwgMSB0byAzMiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICd3JzogICAgICAgICAgICAgICAgICAgICAvKiBXcml0ZW92ZXIgKi8KKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJJbmNvbWluZyBmaWxlcyBXcml0ZSBvdmVyIGV4aXN0aW5nIGZpbGVzIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICd4JzogICAgICAgICAgICAgICAgICAgICAvKiBTZXJ2ZXIgKi8KKyAgICAgICAgICAgIG9wdGFjdFtpXSA9IDE7CisgICAgICAgICAgICBvcHRobHBbaV0gPSAiQmUgYSBLZXJtaXQgU0VSVkVSIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICd5JzogICAgICAgICAgICAgICAgICAgICAvKiBBbHRlcm5hdGUgaW5pdC1maWxlIG5hbWUgKi8KKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJBbHRlcm5hdGl2ZSBpbml0aWFsaXphdGlvbiBmaWxlIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9ICJGaWxlIHNwZWNpZmljYXRpb24iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAneic6ICAgICAgICAgICAgICAgICAgICAgLyogTm90IGJhY2tncm91bmQgKi8KKyAgICAgICAgICAgIG9wdGhscFtpXSA9ICJGb3JjZSBmb3JlZ3JvdW5kIGJlaGF2aW9yIjsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb3B0aGxwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIGFyZ2hscFtpXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaW5peG9wdGhscCgpOworfQorCitpbnQKK2RveGFyZyhzLHByZSkgY2hhciAqKiBzOyBpbnQgcHJlOyB7CisjaWZkZWYgSUtTRAorI2lmZGVmIENLX0xPR0lOCisgICAgZXh0ZXJuIGludCBja3hzeXNsb2csIGNreHd0bXAsIGNreGFub247CisjaWZkZWYgVU5JWAorICAgIGV4dGVybiBpbnQgY2t4cHJpdjsKKyNlbmRpZiAvKiBVTklYICovCisjaWZkZWYgQ0tfUEVSTVMKKyAgICBleHRlcm4gaW50IGNreHBlcm1zOworI2VuZGlmIC8qIENLX1BFUk1TICovCisgICAgZXh0ZXJuIGNoYXIgKiBhbm9uZmlsZSwgKiB1c2VyZmlsZSwgKiBhbm9ucm9vdDsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworI2lmZGVmIENLV1RNUAorICAgIGV4dGVybiBjaGFyICogd3RtcGZpbGU7CisjZW5kaWYgLyogQ0tXVE1QICovCisjZW5kaWYgLyogSUtTRCAqLworICAgIGV4dGVybiBpbnQgc3J2Y2Rtc2c7CisgICAgZXh0ZXJuIGNoYXIgKiBjZG1zZ2ZpbGVbXSwgKiBjZG1zZ3N0cjsKKyAgICBjaGFyIHRtcGJ1ZltDS01BWFBBVEgrMV07CisKKyAgICBpbnQgaSwgeCwgeSwgeiwgaGF2ZWFyZyA9IDA7CisgICAgY2hhciBidWZbWEFSR0JVRkxdLCBjLCAqIHA7CisKKyAgICBpZiAobnhhcmdzIDwgMSkKKyAgICAgIHJldHVybigtMSk7CisKKyAgICBjID0gKigqcyArIDEpOyAgICAgICAgICAgICAgICAgICAgICAvKiBIeXBoZW4gb3IgUGx1cyBzaWduICovCisKKyAgICBwID0gKnMgKyAyOworICAgIGZvciAoaSA9IDA7ICpwICYmIGkgPCBYQVJHQlVGTDsgaSsrKSB7CisgICAgICAgIGJ1ZltpXSA9ICpwKys7CisgICAgICAgIGlmIChidWZbaV0gPT0gJz0nIHx8IGJ1ZltpXSA9PSAnOicpIHsKKyAgICAgICAgICAgIGhhdmVhcmcgPSAxOworICAgICAgICAgICAgYnVmW2ldID0gTlVMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoYnVmW2ldIDwgJyAnKSB7CisgICAgICAgICAgICBidWZbaV0gPSBOVUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA+IFhBUkdCVUZMIC0gMSkKKyAgICAgIHJldHVybigtMSk7CisgICAgYnVmW2ldID0gTlVMOworCisgICAgeCA9IGxvb2t1cCh4YXJndGFiLGJ1ZixueGFyZ3MsJnopOyAgLyogTG9va3VwIHRoZSBvcHRpb24ga2V5d29yZCAqLworCisgICAgaWYgKHggPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT24gYW55IGtpbmQgb2YgZXJyb3IgKi8KKyAgICAgIHJldHVybigtMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBmYWlsLiAqLworCisgICAgLyogSGFuZGxlIHByZXNjYW4gdmVyc3VzIHBvc3QtaW5pdGlhbGl6YXRpb24gZmlsZSAqLworCisgICAgaWYgKCgoeGFyZ3RhYlt6XS5mbGdzICYgQ01fUFJFKSB8fCAoYyA9PSAnKycpKSAmJiAhcHJlKQorICAgICAgcmV0dXJuKDApOworICAgIGVsc2UgaWYgKHByZSAmJiAhKHhhcmd0YWJbel0uZmxncyAmIENNX1BSRSkgJiYgKGMgIT0gJysnKSkKKyAgICAgIHJldHVybigwKTsKKworICAgIC8qIEVuc3VyZSB0aGF0IGFyZ3VtZW50IGlzIGdpdmVuIGlmIGFuZCBvbmx5IGlmIHJlcXVpcmVkICovCisKKyAgICBwID0gaGF2ZWFyZyA/ICpzICsgaSArIDMgOiBOVUxMOworCisgICAgaWYgKCh4YXJndGFiW3pdLmZsZ3MgJiBDTV9BUkcpICYmICFoYXZlYXJnKQorICAgICAgcmV0dXJuKC0xKTsKKyAgICBlbHNlIGlmICgoISh4YXJndGFiW3pdLmZsZ3MgJiBDTV9BUkcpKSAmJiBoYXZlYXJnKQorICAgICAgcmV0dXJuKC0xKTsKKworICAgIHN3aXRjaCAoeCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9LIHRvIHByb2Nlc3MgdGhpcyBvcHRpb24uLi4gKi8KKyNpZmRlZiBDS1NZU0xPRworICAgICAgY2FzZSBYQV9TWVNMOiAgICAgICAgICAgICAgICAgICAgIC8qIElLUzogU3lzbG9nIGxldmVsICovCisgICAgICAgIHkgPSAwOworICAgICAgICBpZiAoaXNkaWdpdCgqcCkpIHsKKyAgICAgICAgICAgIHdoaWxlICgqcCkgeworICAgICAgICAgICAgICAgIGlmICgqcCA8ICcwJyB8fCAqcCA+ICc5JykKKyAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgeSA9IHkgKiAxMCArICgqcCsrIC0gJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHkgPSBsb29rdXAob2t0YWIscCxub2t0YWIsJnopOworICAgICAgICAgICAgaWYgKHkgPiAwKSB5ID0gU1lTTEdfREY7ICAgIC8qIFllcyA9IGRlZmF1bHQgbG9nZ2luZyBsZXZlbCAqLworICAgICAgICB9CisjaWZuZGVmIFNZU0xPR0xFVkVMCisgICAgICAgIC8qIElmIHNwZWNpZmllZCBvbiBjYyBjb21tYW5kIGxpbmUsIHVzZXIgY2FuJ3QgY2hhbmdlIGl0LiAqLworICAgICAgICBpZiAoIWluc2VydmVyKSAgICAgICAgICAgICAgICAgIC8qIERvbid0IGFsbG93IHZvbHVtaW5vdXMgc3lzbG9nZ2luZyAqLworICAgICAgICAgIGlmICh5ID4gU1lTTEdfRkEpICAgICAgICAgICAgIC8qIGJ5IG9yZGluYXJ5IHVzZXJzLiAqLworICAgICAgICAgICAgeSA9IFNZU0xHX0ZBOworI2VuZGlmIC8qIFNZU0xPR0xFVkVMICovCisgICAgICAgIGlmICh5IDwgMCkgcmV0dXJuKC0xKTsKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoeSA+PSBTWVNMR19EQikKKyAgICAgICAgICBpZiAoIWRlYmxvZykKKyAgICAgICAgICAgIGRlYmxvZyA9IGRlYm9wbigiZGVidWcubG9nIiwwKTsKKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIFNZU0xPR0xFVkVMCisgICAgICAgIC8qIElmIHNwZWNpZmllZCBvbiBjYyBjb21tYW5kIGxpbmUsIHVzZXIgY2FuJ3QgY2hhbmdlIGl0LiAqLworICAgICAgICB5ID0gU1lTTE9HTEVWRUw7CisjZW5kaWYgLyogU1lTTE9HTEVWRUwgKi8KKyAgICAgICAgY2t4c3lzbG9nID0geTsKKyAgICAgICAgLyogcHJpbnRmKCJja3hzeXNsb2c9JWRcbiIsY2t4c3lzbG9nKTsgKi8KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKworI2lmZGVmIENLX0xPR0lOCisjaWZkZWYgQ0tXVE1QCisgICAgICBjYXNlIFhBX1dUTVA6ICAgICAgICAgICAgICAgICAgICAgLyogSUtTOiB3dG1wIGxvZyAqLworICAgICAgICB5ID0gbG9va3VwKG9rdGFiLHAsbm9rdGFiLCZ6KTsKKyAgICAgICAgaWYgKHkgPCAwKSByZXR1cm4oLTEpOworICAgICAgICBja3h3dG1wID0geTsKKyAgICAgICAgLyogcHJpbnRmKCJja3h3dG1wPSVkXG4iLGNreHd0bXApOyAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYQV9XVEZJOiAgICAgICAgICAgICAgICAgICAgIC8qIElLUzogd3RtcCBsb2dmaWxlICovCisgICAgICAgIGlmICh6Zm5xZnAocCxDS01BWFBBVEgsdG1wYnVmKSkKKyAgICAgICAgICBwID0gdG1wYnVmOworICAgICAgICBtYWtlc3RyKCZ3dG1wZmlsZSxwKTsKKyAgICAgICAgLyogcHJpbnRmKCJ3dG1wZmlsZT0lc1xuIix3dG1wZmlsZSk7ICovCisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLV1RNUCAqLworCisgICAgICBjYXNlIFhBX0FOT046ICAgICAgICAgICAgICAgICAgICAgLyogSUtTOiBBbm9ueW1vdXMgbG9naW4gYWxsb3dlZCAqLworICAgICAgICB5ID0gbG9va3VwKG9rdGFiLHAsbm9rdGFiLCZ6KTsKKyAgICAgICAgaWYgKHkgPCAwKSByZXR1cm4oLTEpOworICAgICAgICBja3hhbm9uID0geTsKKyAgICAgICAgLyogcHJpbnRmKCJja3hhbm9uPSVkXG4iLGNreGFub24pOyAqLworICAgICAgICBicmVhazsKKworI2lmZGVmIFVOSVgKKyAgICAgIGNhc2UgWEFfUFJJVjogICAgICAgICAgICAgICAgICAgICAvKiBJS1M6IFByaXYnZCBsb2dpbiBhbGxvd2VkICovCisgICAgICAgIHkgPSBsb29rdXAob2t0YWIscCxub2t0YWIsJnopOworICAgICAgICBpZiAoeSA8IDApIHJldHVybigtMSk7CisgICAgICAgIGNreHByaXYgPSB5OworICAgICAgICAvKiBwcmludGYoImNreHByaXY9JWRcbiIsY2t4cHJpdik7ICovCisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFVOSVggKi8KKworI2lmZGVmIENLX1BFUk1TCisgICAgICBjYXNlIFhBX1BFUk06ICAgICAgICAgICAgICAgICAgICAgLyogSUtTOiBBbm9ueW1vdXMgVXBsb2FkIFBlcm1pc3Npb25zICovCisgICAgICAgIHkgPSAwOworICAgICAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgICAgIGlmICgqcCA8ICcwJyB8fCAqcCA+ICc3JykKKyAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIHkgPSB5ICogOCArICgqcCsrIC0gJzAnKTsKKyAgICAgICAgfQorICAgICAgICBja3hwZXJtcyA9IHk7CisgICAgICAgIC8qIHByaW50ZigiY2t4cGVybXM9JTA0b1xuIixja3hwZXJtcyk7ICovCisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENLX1BFUk1TICovCisKKyAgICAgIGNhc2UgWEFfQU5GSTogICAgICAgICAgICAgICAgICAgICAvKiBBbm9ueW1vdXMgaW5pdCBmaWxlICovCisJaWYgKCFpc2Fic29sdXRlKHApKQorCSAgaWYgKHpmbnFmcChwLENLTUFYUEFUSCx0bXBidWYpKQorCSAgICBwID0gdG1wYnVmOworICAgICAgICBtYWtlc3RyKCZhbm9uZmlsZSxwKTsKKyAgICAgICAgLyogcHJpbnRmKCJhbm9uZmlsZT0lc1xuIixhbm9uZmlsZSk7ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhBX1VTRkk6ICAgICAgICAgICAgICAgICAgICAgLyogSUtTOiBGb3JiaWRkZW4gdXNlciBmaWxlICovCisJaWYgKCFpc2Fic29sdXRlKHApKQorCSAgaWYgKHpmbnFmcChwLENLTUFYUEFUSCx0bXBidWYpKQorCSAgICBwID0gdG1wYnVmOworICAgICAgICBtYWtlc3RyKCZ1c2VyZmlsZSxwKTsKKyAgICAgICAgLyogcHJpbnRmKCJ1c2VyZmlsZT0lc1xuIix1c2VyZmlsZSk7ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhBX1JPT1Q6ICAgICAgICAgICAgICAgICAgICAgLyogSUtTOiBBbm9ueW1vdXMgcm9vdCAqLworCWlmICghaXNhYnNvbHV0ZShwKSkKKwkgIGlmICh6Zm5xZnAocCxDS01BWFBBVEgsdG1wYnVmKSkKKwkgICAgcCA9IHRtcGJ1ZjsKKyAgICAgICAgbWFrZXN0cigmYW5vbnJvb3QscCk7CisgICAgICAgIC8qIHByaW50ZigiYW5vbnJvb3Q9JXNcbiIsYW5vbnJvb3QpOyAqLworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCisgICAgICBjYXNlIFhBX0NERkk6ICAgICAgICAgICAgICAgICAgICAgLyogQ0QgZmlsZW5hbWUgKi8KKyNpZmRlZiBDT01NRU5UCisgICAgICAgIC8qIERvIE5PVCBleHBhbmQgdGhpcyBvbmUhICovCisgICAgICAgIGlmICh6Zm5xZnAocCxDS01BWFBBVEgsdG1wYnVmKSkKKyAgICAgICAgICBwID0gdG1wYnVmOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyAgICAgICAgbWFrZWxpc3QocCxjZG1zZ2ZpbGUsMTYpOworICAgICAgICBtYWtlc3RyKCZjZG1zZ3N0cixwKTsKKyAgICAgICAgLyogcHJpbnRmKCJjZG1zZ3N0cj0lc1xuIixjZG1zZ3N0cik7ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhBX0NETVM6ICAgICAgICAgICAgICAgICAgICAgLyogQ0QgbWVzc2FnZXMgKi8KKyAgICAgICAgeSA9IGxvb2t1cChva3RhYixwLG5va3RhYiwmeik7CisgICAgICAgIGlmICh5IDwgMCkgcmV0dXJuKC0xKTsKKyAgICAgICAgc3J2Y2Rtc2cgPSB5OworICAgICAgICAvKiBwcmludGYoInNydmNkbXNnPSVkXG4iLHNydmNkbXNnKTsgKi8KKyAgICAgICAgYnJlYWs7CisKKyNpZm5kZWYgTk9YRkVSCisgICAgICBjYXNlIFhBX0lLTEc6ICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNmZXIgbG9nIG9uL29mZiAqLworICAgICAgICB5ID0gbG9va3VwKG9rdGFiLHAsbm9rdGFiLCZ6KTsKKyAgICAgICAgaWYgKHkgPCAwKSByZXR1cm4oLTEpOworICAgICAgICB4ZmVybG9nID0geTsKKyAgICAgICAgLyogcHJpbnRmKCJ4ZmVybG9nPSVkXG4iLHhmZXJsb2cpOyAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYQV9JS0ZJOiAgICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zZmVyIGxvZyBmaWxlICovCisJaWYgKCFpc2Fic29sdXRlKHApKQorCSAgaWYgKHpmbnFmcChwLENLTUFYUEFUSCx0bXBidWYpKQorCSAgICBwID0gdG1wYnVmOworICAgICAgICBtYWtlc3RyKCZ4ZmVyZmlsZSxwKTsKKyAgICAgICAgeGZlcmxvZyA9IDE7CisgICAgICAgIC8qIHByaW50ZigieGZlcmZpbGU9JXNcbiIseGZlcmZpbGUpOyAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYQV9CQUZJOiAgICAgICAgICAgICAgICAgICAgIC8qIElLUzogYmFubmVyIChncmVldGluZykgZmlsZSAqLworCWlmICghaXNhYnNvbHV0ZShwKSkKKwkgIGlmICh6Zm5xZnAocCxDS01BWFBBVEgsdG1wYnVmKSkKKwkgICAgcCA9IHRtcGJ1ZjsKKyAgICAgICAgbWFrZXN0cigmYmFubmVyZmlsZSxwKTsKKyAgICAgICAgLyogcHJpbnRmKCJiYW5uZXJmaWxlPSVzXG4iLGJhbm5lcmZpbGUpOyAqLworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT0hFTFAKKyAgICAgIGNhc2UgWEFfSEVMUDogICAgICAgICAgICAgICAgICAgICAvKiBIZWxwICovCisgICAgICAgIC8qIHByaW50ZigiaGVscFxuIik7ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gWEFfTUFYOyBpKyspCisgICAgICAgICAgaWYgKHhvcHRobHBbaV0pCisgICAgICAgICAgICBwcmludGYoIiVzXG4gICAlc1xuXG4iLHhvcHRobHBbaV0seGFyZ2hscFtpXSk7CisgICAgICAgIGlmIChzdGF5ZmxnIHx8IHdoYXQgPT0gV19DT01NQU5EKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlCisgICAgICAgICAgZG9leGl0KEdPT0RfRVhJVCwtMSk7CisjZW5kaWYgLyogTk9IRUxQICovCisKKyNpZm5kZWYgTk9IRUxQCisgICAgICBjYXNlIFhBX0hFRkk6ICAgICAgICAgICAgICAgICAgICAgLyogSUtTOiBjdXN0b20gaGVscCBmaWxlICovCisJaWYgKCFpc2Fic29sdXRlKHApKQorCSAgaWYgKHpmbnFmcChwLENLTUFYUEFUSCx0bXBidWYpKQorCSAgICBwID0gdG1wYnVmOworICAgICAgICBtYWtlc3RyKCZoZWxwZmlsZSxwKTsKKyAgICAgICAgLyogcHJpbnRmKCJoZWxwZmlsZT0lc1xuIixoZWxwZmlsZSk7ICovCisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIE5PSEVMUCAqLworCisjaWZkZWYgQ0tfTE9HSU4KKyAgICAgIGNhc2UgWEFfVElNTzoKKyAgICAgICAgaWYgKCFyZGlnaXRzKHApKQorICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGxvZ2ludGltbyA9IGF0b2kocCk7CisgICAgICAgIC8qIHByaW50ZigibG9naW50aW1vPSVkXG4iLHApOyAqLworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworCisgICAgICBjYXNlIFhBX05PSU46ICAgICAgICAgICAgICAgICAgICAgLyogTm8gaW50ZXJydXB0cyAqLworI2lmbmRlZiBOT0lDUAorICAgICAgICBjbWRpbnQgPSAwOworI2VuZGlmIC8qIE5PSUNQICovCisJeHN1c3BlbmQgPSAwOworICAgICAgICBicmVhazsKKworI2lmZGVmIElLU0RCCisgICAgICBjYXNlIFhBX0RCRkk6IHsKKyAgICAgICAgICBleHRlcm4gY2hhciAqIGRiZGlyLCAqIGRiZmlsZTsKKyAgICAgICAgICBleHRlcm4gaW50IGRiZW5hYmxlZDsKKyAgICAgICAgICBzdHJ1Y3QgemZuZnAgKiB6ejsKKyAgICAgICAgICBpZiAoKHp6ID0gemZucWZwKHAsQ0tNQVhQQVRILHRtcGJ1ZikpKSB7CisJICAgICAgY2hhciAqcywgKnMyID0gTlVMTDsKKyAgICAgICAgICAgICAgbWFrZXN0cigmZGJkaXIsenotPmZwYXRoKTsKKyAgICAgICAgICAgICAgbWFrZXN0cigmZGJmaWxlLHp6LT5mcGF0aCk7CisJICAgICAgZm9yIChzID0gZGJkaXI7ICpzOyBzKyspIHsKKwkJICBpZiAoSVNESVJTRVAoKnMpKQorCQkgICAgczIgPSBzKzE7CisJICAgICAgfQorCSAgICAgIGlmIChzMikgKnMyID0gTlVMOworCSAgICAgIGRlYnVnKEYxMTAsIlhBX0RCRkkgZGJkaXIiLGRiZGlyLDApOworCSAgICAgIGRlYnVnKEYxMTAsIlhBX0RCRkkgZGJmaWxlIixkYmZpbGUsMCk7CisgICAgICAgICAgICAgIGRiZW5hYmxlZCA9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBYQV9EQkFTOiB7CisgICAgICAgICAgZXh0ZXJuIGludCBkYmVuYWJsZWQ7CisgICAgICAgICAgeSA9IGxvb2t1cChva3RhYixwLG5va3RhYiwmeik7CisgICAgICAgICAgaWYgKHkgPCAwKSByZXR1cm4oLTEpOworICAgICAgICAgIGRiZW5hYmxlZCA9IHk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYgLyogSUtTREIgKi8KKworICAgICAgY2FzZSBYQV9WRVJTOiB7CisJICBleHRlcm4gY2hhciAqIGNrX3NfdmVyLCAqIGNrX3NfeHZlcjsKKwkgIHByaW50ZigiJXMiLGNrX3NfdmVyKTsKKwkgIGlmICgqY2tfc194dmVyKQorCSAgICBwcmludGYoIiBbJXNdXG4iLGNrX3NfeHZlcik7CisJICBwcmludGYoIlxuIik7CisJICBpZiAoc3RheWZsZyB8fCB3aGF0ID09IFdfQ09NTUFORCkKKwkgICAgYnJlYWs7CisJICBlbHNlCisJICAgIGRvZXhpdChHT09EX0VYSVQsLTEpOworICAgICAgfQorI2lmbmRlZiBOT1hGRVIKKyNpZmRlZiBDS19QRVJNUworICAgICAgY2FzZSBYQV9OUFJNOiB7CisJICBleHRlcm4gaW50IGF0bHByaSwgYXRscHJvLCBhdGdwcmksIGF0Z3BybzsKKwkgIGF0bHByaSA9IDA7CisJICBhdGxwcm8gPSAwOworCSAgYXRncHJpID0gMDsKKwkgIGF0Z3BybyA9IDA7CisJICBicmVhazsKKyAgICAgIH0KKyNlbmRpZiAvKiBDS19QRVJNUyAqLworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZkZWYgS1VJCisgICAgICBjYXNlIFhBX1NDQUxFOgorICAgICAgICBrdWlfaW5pdC5yZXNpemVNb2RlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhBX0NIR0Q6CisgICAgICAgIGt1aV9pbml0LnJlc2l6ZU1vZGUgPSAyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWEFfV01BWDoKKyAgICAgICAga3VpX2luaXQubkNtZFNob3cgPSBTV19NQVhJTUlaRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhBX1dNSU46CisgICAgICAgIGt1aV9pbml0Lm5DbWRTaG93ID0gU1dfTUlOSU1JWkU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFhBX1hQT1M6CisgICAgICAgIGlmICghcmRpZ2l0cyhwKSkKKyAgICAgICAgICByZXR1cm4oLTEpOworCWt1aV9pbml0LnBvc19pbml0Kys7CisJa3VpX2luaXQucG9zX3ggPSBhdG9pKHApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBYQV9ZUE9TOgorICAgICAgICBpZiAoIXJkaWdpdHMocCkpCisgICAgICAgICAgcmV0dXJuKC0xKTsKKwlrdWlfaW5pdC5wb3NfaW5pdCsrOworCWt1aV9pbml0LnBvc195ID0gYXRvaShwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgWEFfRk5BTTogeworCSAgZXh0ZXJuIHN0cnVjdCBfa3VpX2luaXQga3VpX2luaXQ7CisJICBleHRlcm4gc3RydWN0IGtleXRhYiAqIHRlcm1fZm9udDsKKwkgIGV4dGVybiBzdHJ1Y3Qga2V5dGFiICogX3Rlcm1fZm9udDsKKwkgIGV4dGVybiBpbnQgdHRfZm9udCwgbnRlcm1mb250OworCSAgaW50IHgsIHo7CisJICBpZiAobnRlcm1mb250ID09IDApCisJICAgIEJ1aWxkRm9udFRhYmxlKCZ0ZXJtX2ZvbnQsICZfdGVybV9mb250LCAmbnRlcm1mb250KTsKKwkgIGlmICghKHRlcm1fZm9udCAmJiBfdGVybV9mb250ICYmIG50ZXJtZm9udCA+IDApKSB7CisgICAgICAgICAgICBwcmludGYoIj9VbmFibGUgdG8gY29uc3RydWN0IEZvbnQgRmFjZW5hbWUgVGFibGVcbiIpOworCSAgICByZXR1cm4oMCk7CisgICAgICAgICAgfQorCSAgeCA9IGxvb2t1cCh0ZXJtX2ZvbnQscCxudGVybWZvbnQsJnopOworCSAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICAgIHggPSBsb29rdXAoX3Rlcm1fZm9udCxwLG50ZXJtZm9udCwmeik7CisgICAgICAgICAgICAgIGlmICh4IDwgMCkgeworICAgICAgICAgICAgICAgICAgcHJpbnRmKCI/SW52YWxpZCBGb250IEZhY2VuYW1lOiAlc1xuIixwKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwkgIHR0X2ZvbnQgPSB4OworCSAga3VpX2luaXQuZmFjZV9pbml0Kys7CisJICBtYWtlc3RyKCZrdWlfaW5pdC5mYWNlbmFtZSx0ZXJtX2ZvbnRbel0ua3dkKTsKKwkgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBYQV9GU0laOiB7CisJICBleHRlcm4gc3RydWN0IF9rdWlfaW5pdCBrdWlfaW5pdDsKKwkgIGV4dGVybiBpbnQgdHRfZm9udF9zaXplOworICAgICAgICAgIGNoYXIgKiBxOworICAgICAgICAgIGludCBoYWxmcG9pbnQgPSAwOworCisJICBrdWlfaW5pdC5mb250X2luaXQrKzsKKyAgICAgICAgICBmb3IgKCBxPXAgOyAqcSA7IHErKyApIHsKKyAgICAgICAgICAgICAgaWYgKCAqcSA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICpxKysgPSAnXDAnOworICAgICAgICAgICAgICAgICAgaWYgKCFyZGlnaXRzKHEpKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgICAgICAgICAgICBpZiAoISpxIHx8IGF0b2kocSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgLyogbm8gaGFsZnBvaW50ICovCisgICAgICAgICAgICAgICAgICBoYWxmcG9pbnQgPSAxOworICAgICAgICAgICAgICAgICAgaWYgKGF0b2kocSkgIT0gNSkKKyAgICAgICAgICAgICAgICBwcmludGYoIj8gRm9udCBzaXplcyBhcmUgdHJlYXRlZCBpbiBoYWxmLXBvaW50IGluY3JlbWVudHNcbiIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJICBpZiAoIXJkaWdpdHMocCkpCisJICAgIHJldHVybigtMSk7CisJICB0dF9mb250X3NpemUgPSBrdWlfaW5pdC5mb250X3NpemUgPSAyICogYXRvaShwKSArIGhhbGZwb2ludDsKKwkgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBYQV9OT01OOgorICAgICAgICBrdWlfaW5pdC5ub21lbnViYXIgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWEFfTk9UQjoKKyAgICAgICAga3VpX2luaXQubm90b29sYmFyID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhBX05PU0I6CisgICAgICAgIGt1aV9pbml0Lm5vc3RhdHVzYmFyID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhBX05PQkFSOgorICAgICAgICBrdWlfaW5pdC5ub21lbnViYXIgPSAxOworICAgICAgICBrdWlfaW5pdC5ub3Rvb2xiYXIgPSAxOworICAgICAgICBrdWlfaW5pdC5ub3N0YXR1c2JhciA9IDE7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEtVSSAqLworCisjaWZuZGVmIE5PUFVTSAorICAgIGNhc2UgWEFfTk9QVVNIOgorICAgICAgICBub3B1c2ggPSAxOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOT1BVU0ggKi8KKyNpZmRlZiBPUzIKKyAgICBjYXNlIFhBX0xPQ0s6CisgICAgICAgIHR0X3Njcm9sbCA9IDA7CisgICAgICAgIHR0X2VzY2FwZSA9IDA7CisjaWZuZGVmIE5PUFVTSAorICAgICAgICBub3B1c2ggPSAxOworI2VuZGlmCisjaWZkZWYgS1VJCisgICAgICAgIGt1aV9pbml0Lm5vbWVudWJhciA9IDE7CisgICAgICAgIGt1aV9pbml0Lm5vdG9vbGJhciA9IDE7CisgICAgICAgIGt1aV9pbml0Lm5vc3RhdHVzYmFyID0gMTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIFhBX05PU0NST0xMOgorICAgICAgICB0dF9zY3JvbGwgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFhBX05PRVNDQVBFOgorICAgICAgICB0dF9lc2NhcGUgPSAwOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmbmRlZiBOT0xPQ0FMCisgICAgICBjYXNlIFhBX1RFUk06IHsJCQkvKiBUZXJtaW5hbCB0eXBlICovCisgICAgICAgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgdHR5cHRhYltdOworICAgICAgICAgIGV4dGVybiBpbnQgbnR0eXA7CisjaWZkZWYgVE5DT0RFCisJICBleHRlcm4gY2hhciAqIHRuX3Rlcm07CisjZW5kaWYgLyogVE5DT0RFICovCisjaWZkZWYgT1MyCisJICBpbnQgeCwgejsKKwkgIGV4dGVybiBpbnQgdHRfdHlwZSwgdHRfdHlwZV9tb2RlOworCSAgeCA9IGxvb2t1cCh0dHlwdGFiLHAsbnR0eXAsJnopOworCSAgaWYgKHggPCAwKQorCSAgICByZXR1cm4oLTEpOworCSAgdHRfdHlwZV9tb2RlID0gdHRfdHlwZSA9IHg7CisjZW5kaWYgLyogT1MyICovCisjaWZkZWYgVE5DT0RFCisJICBtYWtlc3RyKCZ0bl90ZXJtLHApOworI2VuZGlmIC8qIFROQ09ERSAqLworCSAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFhBX0NTRVQ6IHsJCQkvKiBSZW1vdGUgQ2hhcmFjdGVyIFNldCAqLworI2lmbmRlZiBOT0NTRVRTCisjaWZkZWYgQ0tPVU5JCisgICAgICAgICAgZXh0ZXJuIHN0cnVjdCBrZXl0YWIgdHhydGFiW107CisgICAgICAgICAgZXh0ZXJuIGludCBudHhydGFiOworICAgICAgICAgIHggPSBsb29rdXAodHhydGFiLHAsbnR4cnRhYiwmeik7CisjZWxzZSAvKiBDS09VTkkgKi8KKyAgICAgICAgICBleHRlcm4gc3RydWN0IGtleXRhYiB0dGNzdGFiW107CisgICAgICAgICAgZXh0ZXJuIGludCBudGVybWM7CisgICAgICAgICAgeCA9IGxvb2t1cCh0dGNzdGFiLHAsbnRlcm1jLCZ6KTsKKyNlbmRpZiAvKiBDS09VTkkgKi8KKwkgIGlmICh4IDwgMCkKKwkgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICBzZXRyZW1jaGFyc2V0KHosNCAvKiBUVF9HUl9BTEwgKGluIGNrdXVzNy5jKSAqLyk7CisjZWxzZSAvKiBOT0NTRVRTICovCisgICAgICAgICAgcmV0dXJuKC0xKTsKKyNlbmRpZiAvKiBOT0NTRVRTICovCisJICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgWEFfUk9XUzogewkJCS8qIFNjcmVlbiByb3dzIChoZWlnaHQpICovCisjaWZkZWYgT1MyCisgICAgICAgICAgZXh0ZXJuIGludCByb3dfaW5pdDsKKyNlbHNlIC8qIE9TMiAqLworCSAgZXh0ZXJuIGludCB0dF9yb3dzOworI2VuZGlmIC8qIE9TMiAqLworCSAgaWYgKCFyZGlnaXRzKHApKQorCSAgICByZXR1cm4oLTEpOworI2lmZGVmIE9TMgorCSAgaWYgKCFvczJfc2V0dGVybWhlaWdodChhdG9pKHApKSkKKwkgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICByb3dfaW5pdCsrOworI2Vsc2UgIC8qIE5vdCBPUy8yICovCisJICB0dF9yb3dzID0gYXRvaShwKTsKKyNlbmRpZiAvKiBPUzIgKi8KKwkgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBYQV9DT0xTOiB7CQkJLyogU2NyZWVuIGNvbHVtbnMgKHdpZHRoKSAqLworI2lmZGVmIE9TMgorICAgICAgICAgIGV4dGVybiBpbnQgY29sX2luaXQ7CisjZWxzZSAvKiBPUzIgKi8KKwkgIGV4dGVybiBpbnQgdHRfY29sczsKKyNlbmRpZiAvKiBPUzIgKi8KKwkgIGlmICghcmRpZ2l0cyhwKSkKKwkgICAgcmV0dXJuKC0xKTsKKyNpZmRlZiBPUzIKKwkgIGlmICghb3MyX3NldHRlcm13aWR0aChhdG9pKHApKSkKKwkgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICBjb2xfaW5pdCsrOworI2Vsc2UgIC8qIE5vdCBPUy8yICovCisJICB0dF9jb2xzID0gYXRvaShwKTsKKyNlbmRpZiAvKiBPUzIgKi8KKwkgIGJyZWFrOworICAgICAgfQorI2lmZGVmIE9TMgorICAgIGNhc2UgWEFfVElUTDoKKyAgICAgICAgb3Myc2V0dGl0bGUocCwxKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBDT01NRU5UCQkJCS8qIFRPIEJFIEZJTExFRCBJTiAuLi4gKi8KKyAgICAgIGNhc2UgWEFfVEVMOgkJCS8qIE1ha2UgYSBUZWxuZXQgY29ubmVjdGlvbiAqLworICAgICAgY2FzZSBYQV9GVFA6CQkJLyogTWFrZSBhbiBGVFAgY29ubmVjdGlvbiAqLworICAgICAgY2FzZSBYQV9TU0g6CQkJLyogTWFrZSBhbiBTU0ggY29ubmVjdGlvbiAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmbmRlZiBOT1NQTAorICAgICAgY2FzZSBYQV9VU0VSOgkJCS8qIFVzZXJuYW1lIGZvciBsb2dpbiAqLworI2lmZGVmIElLU0QKKwlpZiAoIWluc2VydmVyKQorI2VuZGlmIC8qIElLU0QgKi8KKwl7CisJICAgIGNrc3RybmNweSh1aWRidWYsKnhhcmd2LFVJREJVRkxFTik7CisJICAgIGhhdmVmdHB1aWQgPSAxOworCX0KKwlicmVhazsKKyNlbmRpZiAvKiBOT1NQTCAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisjaWZkZWYgSUtTRAorI2lmZGVmIElLU0RDT05GCisjZGVmaW5lIElLU19BTk9OIDAKKyNkZWZpbmUgSUtTX0JBRkkgMQorI2RlZmluZSBJS1NfQ0RGSSAyCisjZGVmaW5lIElLU19DRE1TIDMKKyNkZWZpbmUgSUtTX0hFRkkgNAorI2RlZmluZSBJS1NfQU5GSSA1CisjZGVmaW5lIElLU19VU0ZJIDYKKyNkZWZpbmUgSUtTX0lLTEcgNworI2RlZmluZSBJS1NfSUtGSSA4CisjZGVmaW5lIElLU19EQkFTIDkKKyNkZWZpbmUgSUtTX0RCRkkgMTAKKyNkZWZpbmUgSUtTX1BFUk0gMTEKKyNkZWZpbmUgSUtTX1BSSVYgMTIKKyNkZWZpbmUgSUtTX1JPT1QgMTMKKyNkZWZpbmUgSUtTX1RJTU8gMTQKKyNkZWZpbmUgSUtTX1dURkkgMTUKKyNkZWZpbmUgSUtTX1dUTVAgMTYKKyNkZWZpbmUgSUtTX1NSVlIgMTcKKyNkZWZpbmUgSUtTX05PSU4gMTgKKyNkZWZpbmUgSUtTX0lOSVQgMTkKKyNkZWZpbmUgSUtTX0FOTEcgMjAKKyNkZWZpbmUgSUtTX0FDQ1QgMjEKKyNkZWZpbmUgSUtTX05URE9NIDIyCisjZGVmaW5lIElLU19TWVNMIDIzCisKKyNpZmRlZiBDS19MT0dJTgorc3RhdGljIHN0cnVjdCBrZXl0YWIgaWtzYW50YWJbXSA9IHsKKyNpZmRlZiBPUzIKKyAgICB7ICJhY2NvdW50IiwgICAgIElLU19BQ0NULCAwIH0sCisjZW5kaWYgLyogT1MyICovCisgICAgeyAiaW5pdGZpbGUiLCAgICBJS1NfQU5GSSwgMCB9LAorICAgIHsgImxvZ2luIiwgICAgICAgSUtTX0FOTEcsIDAgfSwKKyNpZmRlZiBVTklYCisgICAgeyAicm9vdCIsICAgICAgICBJS1NfUk9PVCwgMCB9LAorI2Vsc2UKKyNpZmRlZiBDS1JPT1QKKyAgICB7ICJyb290IiwgICAgICAgIElLU19ST09ULCAwIH0sCisjZW5kaWYgLyogQ0tST09UICovCisjZW5kaWYgLyogVU5JWCAqLworICAgIHsgIiIsIDAsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmlrc2FudGFiID0gc2l6ZW9mKGlrc2FudGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSAtIDE7CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKworc3RhdGljIHN0cnVjdCBrZXl0YWIgaWtzdGFiW10gPSB7CisjaWZkZWYgQ0tfTE9HSU4KKyAgICB7ICJhbm9ueW1vdXMiLCAgIElLU19BTk9OLCAwIH0sCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyAgICB7ICJiYW5uZXJmaWxlIiwgIElLU19CQUZJLCAwIH0sCisgICAgeyAiY2RmaWxlIiwgICAgICBJS1NfQ0RGSSwgMCB9LAorICAgIHsgImNkbWVzc2FnZSIsICAgSUtTX0NETVMsIDAgfSwKKyAgICB7ICJjZG1zZyIsICAgICAgIElLU19DRE1TLCBDTV9JTlYgfSwKKyNpZmRlZiBJS1NEQgorICAgIHsgImRhdGFiYXNlIiwgICAgSUtTX0RCQVMsIDAgfSwKKyAgICB7ICJkYmZpbGUiLCAgICAgIElLU19EQkZJLCAwIH0sCisjZW5kaWYgLyogSUtTREIgKi8KKyNpZmRlZiBDS19MT0dJTgorI2lmZGVmIE5UCisgICAgeyAiZGVmYXVsdC1kb21haW4iLCBJS1NfTlRET00sIDAgfSwKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisjaWZuZGVmIE5PSEVMUAorICAgIHsgImhlbHBmaWxlIiwgICAgSUtTX0hFRkksIDAgfSwKKyNlbmRpZiAvKiBOT0hFTFAgKi8KKyAgICB7ICJpbml0ZmlsZSIsICAgIElLU19JTklULCAwIH0sCisgICAgeyAibm8taW5pdGZpbGUiLCBJS1NfTk9JTiwgMCB9LAorI2lmZGVmIENLX0xPR0lOCisjaWZkZWYgQ0tfUEVSTQorICAgIHsgInBlcm1pc3Npb25zIiwgSUtTX1BFUk0sIDAgfSwKKyAgICB7ICJwZXJtcyIsICAgICAgIElLU19QRVJNLCBDTV9JTlYgfSwKKyNlbmRpZiAvKiBDS19QRVJNICovCisjaWZkZWYgVU5JWAorICAgIHsgInByaXZpZCIsICAgICAgSUtTX1BSSVYsIDAgfSwKKyNlbmRpZiAvKiBVTklYICovCisgICAgeyAic2VydmVyLW9ubHkiLCBJS1NfU1JWUiwgMCB9LAorI2lmZGVmIENLU1lTTE9HCisgICAgeyAic3lzbG9nIiwgICAgICBJS1NfU1lTTCwgMCB9LAorI2VuZGlmIC8qIENLU1lTTE9HICovCisgICAgeyAidGltZW91dCIsICAgICBJS1NfVElNTywgMCB9LAorICAgIHsgInVzZXJmaWxlIiwgICAgSUtTX1VTRkksIDAgfSwKKyNpZmRlZiBDS1dUTVAKKyAgICB7ICJ3dG1wZmlsZSIsICAgIElLU19XVEZJLCAwIH0sCisgICAgeyAid3RtcGxvZyIsICAgICBJS1NfV1RNUCwgMCB9LAorI2VuZGlmIC8qIENLV1RNUCAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisgICAgeyAieGZlcmZpbGUiLCAgICBJS1NfSUtGSSwgMCB9LAorICAgIHsgInhmZXJsb2ciLCAgICAgSUtTX0lLTEcsIDAgfQorfTsKK3N0YXRpYyBpbnQgbmlrc3RhYiA9IHNpemVvZihpa3N0YWIpIC8gc2l6ZW9mKHN0cnVjdCBrZXl0YWIpOworI2VuZGlmIC8qIElLU0RDT05GICovCisKKyNpZm5kZWYgTk9JQ1AKK2ludAorc2V0aWtzKCkgewkJCQkvKiBTRVQgSUtTICovCisjaWZkZWYgSUtTRENPTkYKKyNpZmRlZiBDS19MT0dJTgorICAgIGV4dGVybiBpbnQgY2t4c3lzbG9nLCBja3h3dG1wLCBja3hhbm9uOworI2lmZGVmIFVOSVgKKyAgICBleHRlcm4gaW50IGNreHByaXY7CisjZW5kaWYgLyogVU5JWCAqLworI2lmZGVmIENLX1BFUk1TCisgICAgZXh0ZXJuIGludCBja3hwZXJtczsKKyNlbmRpZiAvKiBDS19QRVJNUyAqLworICAgIGV4dGVybiBjaGFyICogYW5vbmZpbGUsICogdXNlcmZpbGUsICogYW5vbnJvb3Q7CisjaWZkZWYgT1MyCisgICAgZXh0ZXJuIGNoYXIgKiBhbm9uYWNjdDsKKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBOVAorICAgIGV4dGVybiBjaGFyICogaWtzX2RvbWFpbjsKKyNlbmRpZiAvKiBOVCAqLworI2VuZGlmIC8qIENLX0xPR0lOICovCisjaWZkZWYgQ0tXVE1QCisgICAgZXh0ZXJuIGNoYXIgKiB3dG1wZmlsZTsKKyNlbmRpZiAvKiBDS1dUTVAgKi8KKyAgICBleHRlcm4gaW50IHNydmNkbXNnLCBzdWNjZXNzLCBpa3NkY2YsIHJjZmxhZywgbm9pbml0LCBhcmdfeDsKKyAgICBleHRlcm4gY2hhciAqIGNkbXNnZmlsZVtdLCAqIGNkbXNnc3RyLCAqa2VybXJjOworICAgIGV4dGVybiB4eF9zdHJwIHh4c3RyaW5nOworICAgIGludCB4LCB5LCB6OworICAgIGNoYXIgKnM7CisgICAgY2hhciB0bXBidWZbQ0tNQVhQQVRIKzFdOworCisgICAgaWYgKCh5ID0gY21rZXkoaWtzdGFiLG5pa3N0YWIsIiIsIiIseHhzdHJpbmcpKSA8IDApCisgICAgICByZXR1cm4oeSk7CisKKyNpZmRlZiBDS19MT0dJTgorICAgIGlmICh5ID09IElLU19BTk9OKSB7CisgICAgICAgIGlmICgoeSA9IGNta2V5KGlrc2FudGFiLG5pa3NhbnRhYiwiIiwiIix4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih5KTsKKyAgICB9CisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKworICAgIHN3aXRjaCAoeSkgeworI2lmZGVmIENLU1lTTE9HCisgICAgICBjYXNlIElLU19TWVNMOiAgICAgICAgICAgICAgICAgICAgIC8qIElLUzogU3lzbG9nIGxldmVsICovCisgICAgICAgIGlmICgoeiA9IGNta2V5KG9rdGFiLG5va3RhYiwiIiwiIix4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih6KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisjaWZuZGVmIFNZU0xPR0xFVkVMCisgICAgICAgIC8qIElmIHNwZWNpZmllZCBvbiBjYyBjb21tYW5kIGxpbmUsIHVzZXIgY2FuJ3QgY2hhbmdlIGl0LiAqLworICAgICAgICBpZiAoIWluc2VydmVyKSAgICAgICAgICAgICAgICAgIC8qIERvbid0IGFsbG93IHZvbHVtaW5vdXMgc3lzbG9nZ2luZyAqLworICAgICAgICAgIGlmICh5ID4gU1lTTEdfRkEpICAgICAgICAgICAgIC8qIGJ5IG9yZGluYXJ5IHVzZXJzLiAqLworICAgICAgICAgICAgeSA9IFNZU0xHX0ZBOworI2VuZGlmIC8qIFNZU0xPR0xFVkVMICovCisgICAgICAgIGlmICh5IDwgMCkgcmV0dXJuKC0xKTsKKyNpZmRlZiBERUJVRworICAgICAgICBpZiAoeSA+PSBTWVNMR19EQikKKyAgICAgICAgICBpZiAoIWRlYmxvZykKKyAgICAgICAgICAgIGRlYmxvZyA9IGRlYm9wbigiZGVidWcubG9nIiwwKTsKKyNlbmRpZiAvKiBERUJVRyAqLworI2lmZGVmIFNZU0xPR0xFVkVMCisgICAgICAgIC8qIElmIHNwZWNpZmllZCBvbiBjYyBjb21tYW5kIGxpbmUsIHVzZXIgY2FuJ3QgY2hhbmdlIGl0LiAqLworICAgICAgICB5ID0gU1lTTE9HTEVWRUw7CisjZW5kaWYgLyogU1lTTE9HTEVWRUwgKi8KKyAgICAgICAgY2t4c3lzbG9nID0geTsKKyAgICAgICAgLyogcHJpbnRmKCJja3hzeXNsb2c9JWRcbiIsY2t4c3lzbG9nKTsgKi8KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tTWVNMT0cgKi8KKworI2lmZGVmIENLX0xPR0lOCisjaWZkZWYgTlQKKyAgICAgIGNhc2UgSUtTX05URE9NOgorICAgICAgICBpZiAoKHogPSBjbXR4dCgKKyAiRE9NQUlOIHRvIGJlIHVzZWQgZm9yIHVzZXIgYXV0aGVudGljYXRpb24gd2hlbiBub25lIGlzIHNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgICAgICAgICIiLCAmcyx4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih6KTsKKyAgICAgICAgaWYgKGlrc2RjZikgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgaWYgKCEqcykgcz0gTlVMTDsKKyAgICAgICAgICBtYWtlc3RyKCZpa3NfZG9tYWluLHMpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBOVCAqLworI2lmZGVmIE9TMgorICAgICAgY2FzZSBJS1NfQUNDVDoKKyAgICAgICAgaWYgKCh6ID0gY210eHQoIk5hbWUgb2YgbG9jYWwgYWNjb3VudCB0byB1c2UgZm9yIGFub255bW91cyBsb2dpbnMiLAorCQkJIkdVRVNUIiwgJnMseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeik7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGlmICgqcykgeworICAgICAgICAgICAgbWFrZXN0cigmYW5vbmFjY3Qscyk7CisgICAgICAgIH0gZWxzZSBpZiAoIGFub25hY2N0ICkgeworCSAgICBmcmVlKGFub25hY2N0KTsKKwkgICAgYW5vbmFjY3QgPSBOVUxMOworCX0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogT1MyICovCisgICAgICBjYXNlIElLU19BTkxHOgorICAgICAgICBpZiAoKHogPSBjbWtleShva3RhYixub2t0YWIsIiIsIm5vIix4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih6KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGNreGFub24gPSB6OworI2lmZGVmIE9TMgorCWlmIChja3hhbm9uICYmICFhbm9uYWNjdCkKKwkgIG1ha2VzdHIoJmFub25hY2N0LCJHVUVTVCIpOworI2VuZGlmIC8qIE9TMiAqLworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDS19MT0dJTiAqLworICAgICAgY2FzZSBJS1NfQkFGSToKKyAgICAgICAgaWYgKCh6ID0gY21pZmkoIkZpbGVuYW1lIiwiIiwmcywmeCx4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih6KTsKKyAgICAgICAgaWYgKHgpIHsKKyAgICAgICAgICAgIHByaW50ZigiP1dpbGRjYXJkcyBub3QgYWxsb3dlZFxuIik7CisgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICB9CisgICAgICAgIGRlYnVnKEYxMTAsImJhbm5lcmZpbGUgYmVmb3JlIHpmbnFmcCgpIixzLDApOworICAgICAgICBpZiAoemZucWZwKHMsQ0tNQVhQQVRILHRtcGJ1ZikpIHsKKyAgICAgICAgICAgIGRlYnVnKEYxMTAsImJhbm5lcmZpbGUgYWZ0ZXIgemZucWZwKCkiLHRtcGJ1ZiwwKTsKKyAgICAgICAgICAgIHMgPSB0bXBidWY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGlmICgqcykKKwkgIG1ha2VzdHIoJmJhbm5lcmZpbGUscyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJS1NfQ0RGSToKKyAgICAgICAgaWYgKCh6ID0gY210eHQoImxpc3Qgb2YgY2QgbWVzc2FnZSBmaWxlIG5hbWVzIiwiUkVBRC5NRSIsCisJCSAgICAgICAmcyx4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih6KTsKKyAgICAgICAgaWYgKGlrc2RjZikgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgaWYgKCpzKSB7CisgICAgICAgICAgICBtYWtlbGlzdChzLGNkbXNnZmlsZSwxNik7CisgICAgICAgICAgICBtYWtlc3RyKCZjZG1zZ3N0cixzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUtTX0NETVM6CisgICAgICAgIGlmICgoeiA9IGNta2V5KG9rdGFiLG5va3RhYiwiIiwibm8iLHh4c3RyaW5nKSkgPCAwKQorCSAgcmV0dXJuKHopOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgaWYgKGlrc2RjZikgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgc3J2Y2Rtc2cgPSB6OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUtTX0hFRkk6CisgICAgICAgIGlmICgoeiA9IGNtaWZpKCJGaWxlbmFtZSIsIiIsJnMsJngseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeik7CisgICAgICAgIGlmICh4KSB7CisgICAgICAgICAgICBwcmludGYoIj9XaWxkY2FyZHMgbm90IGFsbG93ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoemZucWZwKHMsQ0tNQVhQQVRILHRtcGJ1ZikpCisgICAgICAgICAgcyA9IHRtcGJ1ZjsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGlmICgqcykKKwkgIG1ha2VzdHIoJmhlbHBmaWxlLHMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUtTX0FORkk6CisgICAgICAgIGlmICgoeiA9IGNtaWZpKCJGaWxlbmFtZSIsIiIsJnMsJngseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeik7CisgICAgICAgIGlmICh4KSB7CisgICAgICAgICAgICBwcmludGYoIj9XaWxkY2FyZHMgbm90IGFsbG93ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoemZucWZwKHMsQ0tNQVhQQVRILHRtcGJ1ZikpCisgICAgICAgICAgcyA9IHRtcGJ1ZjsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGlmICgqcykKKwkgIG1ha2VzdHIoJmFub25maWxlLHMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUtTX1VTRkk6CisgICAgICAgIGlmICgoeiA9IGNtaWZpKCJGaWxlbmFtZSIsIiIsJnMsJngseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeik7CisgICAgICAgIGlmICh4KSB7CisgICAgICAgICAgICBwcmludGYoIj9XaWxkY2FyZHMgbm90IGFsbG93ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoemZucWZwKHMsQ0tNQVhQQVRILHRtcGJ1ZikpCisgICAgICAgICAgcyA9IHRtcGJ1ZjsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGlmICgqcykKKwkgIG1ha2VzdHIoJnVzZXJmaWxlLHMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUtTX0lLRkk6CisgICAgICAgIGlmICgoeiA9IGNtaWZpKCJGaWxlbmFtZSIsIiIsJnMsJngseHhzdHJpbmcpKSA8IDApCisJICByZXR1cm4oeik7CisgICAgICAgIGlmICh4KSB7CisgICAgICAgICAgICBwcmludGYoIj9XaWxkY2FyZHMgbm90IGFsbG93ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoemZucWZwKHMsQ0tNQVhQQVRILHRtcGJ1ZikpCisgICAgICAgICAgcyA9IHRtcGJ1ZjsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGlmICgqcykgeworICAgICAgICAgICAgbWFrZXN0cigmeGZlcmZpbGUscyk7CisgICAgICAgICAgICB4ZmVybG9nID0gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUtTX0lLTEc6CisgICAgICAgIGlmICgoeiA9IGNta2V5KG9rdGFiLG5va3RhYiwiIiwibm8iLHh4c3RyaW5nKSkgPCAwKQorCSAgcmV0dXJuKHopOworICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgaWYgKGlrc2RjZikgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgeGZlcmxvZyA9IHo7CisgICAgICAgIGJyZWFrOworCisjaWZkZWYgQ0tfTE9HSU4KKyNpZmRlZiBDS19QRVJNCisgICAgICBjYXNlIElLU19QRVJNOgorICAgICAgICBpZiAoKHogPSBjbXR4dCgiT2N0YWwgZmlsZSBwZXJtc3Npb24gY29kZSIsIjAwMCIsCisJCSAgICAgICAmcyx4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih6KTsKKwlpZiAoeiA8IDApIHJldHVybih6KTsKKyAgICAgICAgaWYgKGlrc2RjZikgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgeSA9IDA7CisgICAgICAgIHdoaWxlICgqcykgeworICAgICAgICAgICAgaWYgKCpzIDwgJzAnIHx8ICpzID4gJzcnKQorICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgICAgeSA9IHkgKiA4ICsgKCpzKysgLSAnMCcpOworICAgICAgICB9CisgICAgICAgIGNreHBlcm1zID0geTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfUEVSTSAqLworI2lmZGVmIFVOSVgKKyAgICAgIGNhc2UgSUtTX1BSSVY6ICAgICAgICAgICAgICAgICAgICAgLyogSUtTOiBQcml2J2QgbG9naW4gYWxsb3dlZCAqLworICAgICAgICBpZiAoKHogPSBjbWtleShva3RhYixub2t0YWIsIiIsIm5vIix4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih6KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGNreHByaXYgPSB6OworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBVTklYICovCisKKyAgICAgIGNhc2UgSUtTX1JPT1Q6ICAgICAgICAgICAgICAgICAgICAgLyogSUtTOiBBbm9ueW1vdXMgcm9vdCAqLworCWlmICgoeiA9IGNtZGlyKCJOYW1lIG9mIGRpc2sgYW5kL29yIGRpcmVjdG9yeSIsIiIsJnMsCisJCSAgICAgICB4eHN0cmluZykpIDwgMCApIHsKKwkgICAgaWYgKHogIT0gLTMpCisJICAgICAgcmV0dXJuKHopOworCX0KKyAgICAgICAgaWYgKCpzKSB7CisJICAgIGlmICh6Zm5xZnAocyxDS01BWFBBVEgsdG1wYnVmKSkKKwkgICAgICBzID0gdG1wYnVmOworICAgICAgICB9IGVsc2UKKwkgIHMgPSAiIjsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGlmICgqcykKKwkgIG1ha2VzdHIoJmFub25yb290LHMpOworICAgICAgICAvKiBwcmludGYoImFub25yb290PSVzXG4iLGFub25yb290KTsgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSUtTX1RJTU86CisJeiA9IGNtbnVtKCJsb2dpbiB0aW1lb3V0LCBzZWNvbmRzIiwiMCIsMTAsJngseHhzdHJpbmcpOworCWlmICh6IDwgMCkgcmV0dXJuKHopOworICAgICAgICBpZiAoeCA8IDAgfHwgeCA+IDcyMDApIHsKKyAgICAgICAgICAgIHByaW50ZigiP1ZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA3MjAwXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuKC05KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHogPSBjbWNmbSgpKSA8IDApIHJldHVybih6KTsKKyAgICAgICAgaWYgKGlrc2RjZikgcmV0dXJuKHN1Y2Nlc3MgPSAwKTsKKyAgICAgICAgbG9naW50aW1vID0geDsKKyAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBDS1dUTVAKKyAgICAgIGNhc2UgSUtTX1dUTVA6ICAgICAgICAgICAgICAgICAgICAgLyogSUtTOiB3dG1wIGxvZyAqLworICAgICAgICBpZiAoKHogPSBjbWtleShva3RhYixub2t0YWIsIiIsIm5vIix4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih6KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGNreHd0bXAgPSB6OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJS1NfV1RGSTogICAgICAgICAgICAgICAgICAgICAvKiBJS1M6IHd0bXAgbG9nZmlsZSAqLworICAgICAgICBpZiAoKHogPSBjbWlmaSgiRmlsZW5hbWUiLCIiLCZzLCZ4LHh4c3RyaW5nKSkgPCAwKQorCSAgcmV0dXJuKHopOworICAgICAgICBpZiAoeCkgeworICAgICAgICAgICAgcHJpbnRmKCI/V2lsZGNhcmRzIG5vdCBhbGxvd2VkXG4iKTsKKyAgICAgICAgICAgIHJldHVybigtOSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHpmbnFmcChzLENLTUFYUEFUSCx0bXBidWYpKQorICAgICAgICAgIHMgPSB0bXBidWY7CisgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICBpZiAoaWtzZGNmKSByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICBpZiAoKnMpCisJICBtYWtlc3RyKCZ3dG1wZmlsZSxzKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tXVE1QICovCisjZW5kaWYgLyogQ0tfTE9HSU4gKi8KKyNpZmRlZiBJS1NEQgorICAgICAgY2FzZSBJS1NfREJGSTogeworICAgICAgICAgIGV4dGVybiBjaGFyICogZGJkaXIsICogZGJmaWxlOworICAgICAgICAgIGV4dGVybiBpbnQgZGJlbmFibGVkOworICAgICAgICAgIHN0cnVjdCB6Zm5mcCAqIHp6OworICAgICAgICAgIGlmICgoeiA9IGNtaWZpKCJGaWxlbmFtZSIsIiIsJnMsJngseHhzdHJpbmcpKSA8IDApCisJICAgIHJldHVybih6KTsKKyAgICAgICAgICBpZiAoeCkgeworICAgICAgICAgICAgICBwcmludGYoIj9XaWxkY2FyZHMgbm90IGFsbG93ZWRcbiIpOworICAgICAgICAgICAgICByZXR1cm4oLTkpOworICAgICAgICAgIH0KKyAgICAgICAgICB6eiA9IHpmbnFmcChzLENLTUFYUEFUSCx0bXBidWYpOworICAgICAgICAgIGlmICgoeCA9IGNtY2ZtKCkpIDwgMCkgcmV0dXJuKHgpOworICAgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgaWYgKHp6KSB7CisgICAgICAgICAgICAgIG1ha2VzdHIoJmRiZGlyLHp6LT5mcGF0aCk7CisgICAgICAgICAgICAgIG1ha2VzdHIoJmRiZmlsZSwoY2hhciAqKXRtcGJ1Zik7CisgICAgICAgICAgICAgIGRiZW5hYmxlZCA9IDE7CisgICAgICAgICAgfSBlbHNlCisJICAgIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIElLU19EQkFTOiB7CisgICAgICAgICAgZXh0ZXJuIGludCBkYmVuYWJsZWQ7CisgICAgICAgICAgaWYgKCh6ID0gY21rZXkob2t0YWIsbm9rdGFiLCIiLCJubyIseHhzdHJpbmcpKSA8IDApCisJICAgIHJldHVybih6KTsKKyAgICAgICAgICBpZiAoKHggPSBjbWNmbSgpKSA8IDApIHJldHVybih4KTsKKyAgICAgICAgICBpZiAoaWtzZGNmKSByZXR1cm4oc3VjY2VzcyA9IDApOworICAgICAgICAgIGRiZW5hYmxlZCA9IHo7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYgLyogSUtTREIgKi8KKworICAgICAgY2FzZSBJS1NfSU5JVDoKKyAgICAgICAgaWYgKCh6ID0gY210eHQoIkFsdGVybmF0ZSBpbml0IGZpbGUgc3BlY2lmaWNhdGlvbiIsIiIsCisJCSAgICAgICAmcyx4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih6KTsKKyAgICAgICAgaWYgKHogPCAwKSByZXR1cm4oeik7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGNrc3RybmNweShrZXJtcmMscyxLRVJNUkNMKTsKKyAgICAgICAgcmNmbGFnID0gMTsJCQkvKiBGbGFnIHRoYXQgdGhpcyBoYXMgYmVlbiBkb25lICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElLU19OT0lOOgorICAgICAgICBpZiAoKHogPSBjbWtleShva3RhYixub2t0YWIsIiIsIm5vIix4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih6KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIG5vaW5pdCA9IHo7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElLU19TUlZSOgorICAgICAgICBpZiAoKHogPSBjbWtleShva3RhYixub2t0YWIsIiIsIm5vIix4eHN0cmluZykpIDwgMCkKKwkgIHJldHVybih6KTsKKyAgICAgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKSByZXR1cm4oeCk7CisgICAgICAgIGlmIChpa3NkY2YpIHJldHVybihzdWNjZXNzID0gMCk7CisgICAgICAgIGFyZ194ID0gejsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybigtOSk7CisgICAgfQorICAgIHJldHVybihzdWNjZXNzID0gKGluc2VydmVyID8gMSA6IDApKTsKKyNlbHNlIC8qIElLU0RDT05GICovCisgICAgaWYgKCh4ID0gY21jZm0oKSkgPCAwKQorICAgICAgcmV0dXJuKHgpOworICAgIHJldHVybihzdWNjZXNzID0gMCk7CisjZW5kaWYgLyogSUtTRENPTkYgKi8KK30KKyNlbmRpZiAvKiBOT0lDUCAqLworI2VuZGlmIC8qIElLU0QgKi8KKworLyogIEQgTyBBIFIgRyAgLS0gIERvIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50LiAgKi8KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK2RvYXJnKGNoYXIgeCkKKyNlbHNlCitkb2FyZyh4KSBjaGFyIHg7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGRvYXJnICovIHsKKyAgICBpbnQgaSwgbiwgeSwgeiwgeHg7IGxvbmcgeno7IGNoYXIgKnhwOworCisjaWZkZWYgTkVUQ09OTgorZXh0ZXJuIGNoYXIgKmxpbmUsICp0bXBidWY7ICAgICAgICAgICAgIC8qIENoYXJhY3RlciBidWZmZXJzIGZvciBhbnl0aGluZyAqLworI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmZGVmIElLU0QKKyAgICAvKiBJbnRlcm5ldCBLZXJtaXQgU2VydmVyIHNldCBzb21lIHdheSBiZXNpZGVzIC1BLi4uICovCisgICAgaWYgKGluc2VydmVyKQorICAgICAgZG9mYXN0KCk7CisjZW5kaWYgLyogSUtTRCAqLworCisgICAgeHAgPSAqeGFyZ3YrMTsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciBmb3IgYnVuZGxlZCBhcmdzICovCisgICAgZGVidWcoRjExMSwiZG9hcmcgZW50cnkiLHhwLHhhcmdjKTsKKyAgICB3aGlsZSAoeCkgeworICAgICAgICBkZWJ1ZyhGMDAwLCJkb2FyZyBhcmciLCIiLHgpOworICAgICAgICBzd2l0Y2ggKHgpIHsgICAgICAgICAgICAgICAgICAgIC8qIEJpZyBzd2l0Y2ggb24gYXJnICovCisKKyNpZm5kZWYgQ09NTUVOVAorCSAgY2FzZSAnLSc6CQkJLyogRXh0ZW5kZWQgY29tbWFuZHMuLi4gKi8KKwkgICAgaWYgKGRveGFyZyh4YXJndiwwKSA8IDApIHsKKwkJWEZBVEFMKCJFeHRlbmRlZCBvcHRpb24gZXJyb3IiKTsKKwkgICAgfSAvKiBGdWxsIHRocnUuLi4gKi8KKwkgIGNhc2UgJysnOgkJCS8qIEV4dGVuZGVkIGNvbW1hbmQgZm9yIHByZXNjYW4oKSAqLworCSAgICByZXR1cm4oMCk7CisjZWxzZSAgLyogTk9JQ1AgKi8KKwkgIGNhc2UgJy0nOgorCSAgY2FzZSAnKyc6CisJICAgIFhGQVRBTCgiRXh0ZW5kZWQgb3B0aW9ucyBub3QgY29uZmlndXJlZCIpOworI2VuZGlmIC8qIE5PSUNQICovCisKKyNpZm5kZWYgTk9TUEwKKwkgIGNhc2UgJ0MnOiB7CQkJLyogQ29tbWFuZHMgZm9yIHBhcnNlciAqLworCSAgICAgIGNoYXIgKiBzOworCSAgICAgIHhhcmd2KyssIHhhcmdjLS07CisJICAgICAgaWYgKCh4YXJnYyA8IDEpIHx8ICgqKnhhcmd2ID09ICctJykpIHsKKwkJICBYRkFUQUwoIk5vIGNvbW1hbmRzIGdpdmVuIGZvciAtQyIpOworCSAgICAgIH0KKwkgICAgICBzID0gKnhhcmd2OwkJLyogR2V0IHRoZSBhcmd1bWVudCAobXVzdCBiZSBxdW90ZWQpICovCisJICAgICAgaWYgKCEqcykJCQkvKiBJZiBlbXB0eSBxdW90ZXMgKi8KKwkJcyA9IE5VTEw7CQkvKiBpZ25vcmUgdGhpcyBvcHRpb24gKi8KKwkgICAgICBpZiAocykgeworCQkgIG1ha2VzdHIoJmNsY21kcyxzKTsJLyogTWFrZSBwb2tlYWJsZSBjb3B5ICovCisJCSAgcyA9IGNsY21kczsJCS8qIENoYW5nZSB0YWJzIHRvIHNwYWNlcyAqLworCQkgIHdoaWxlICgqcykgeworCQkgICAgICBpZiAoKnMgPT0gJ1x0JykgKnMgPSAnICc7CisJCSAgICAgIHMrKzsKKwkJICB9CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgfQorI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZm5kZWYgTk9YRkVSCisJICBjYXNlICdEJzoJCQkvKiBEZWxheSAqLworCSAgICBpZiAoKih4cCsxKSkgeworCQlYRkFUQUwoImludmFsaWQgYXJndW1lbnQgYnVuZGxpbmciKTsKKwkgICAgfQorCSAgICB4YXJndisrLCB4YXJnYy0tOworCSAgICBpZiAoKHhhcmdjIDwgMSkgfHwgKCoqeGFyZ3YgPT0gJy0nKSkgeworCQlYRkFUQUwoIm1pc3NpbmcgZGVsYXkgdmFsdWUiKTsKKwkgICAgfQorCSAgICB6ID0gYXRvaSgqeGFyZ3YpOwkJLyogQ29udmVydCB0byBudW1iZXIgKi8KKwkgICAgaWYgKHogPiAtMSkJCQkvKiBJZiBpbiByYW5nZSAqLworCSAgICAgIGNrZGVsYXkgPSB6OwkJLyogc2V0IGl0ICovCisJICAgIGVsc2UgeworCQlYRkFUQUwoImJhZCBkZWxheSB2YWx1ZSIpOworCSAgICB9CisJICAgIGJyZWFrOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisJICBjYXNlICdFJzoJCQkvKiBFeGl0IG9uIGNsb3NlICovCisjaWZkZWYgTkVUQ09OTgorCSAgICB0bl9leGl0ID0gMTsKKyNlbmRpZiAvKiBORVRDT05OICovCisJICAgIGV4aXRvbmNsb3NlID0gMTsKKwkgICAgYnJlYWs7CisKKyNpZm5kZWYgTk9JQ1AKKwkgIGNhc2UgJ1MnOgkJCS8qICJTdGF5IiAtIGVudGVyIGludGVyYWN0aXZlICovCisJICAgIHN0YXlmbGcgPSAxOwkJLyogY29tbWFuZCBwYXJzZXIgYWZ0ZXIgZXhlY3V0aW5nICovCisJICAgIHhmaW5pc2ggPSAwOwkJLyogY29tbWFuZC1saW5lIGFjdGlvbnMuICovCisJICAgIGJyZWFrOworI2VuZGlmIC8qIE5PSUNQICovCisKKwkgIGNhc2UgJ1QnOgkJCS8qIEZpbGUgdHJhbnNmZXIgbW9kZSA9IHRleHQgKi8KKwkgICAgYmluYXJ5ID0gWFlGVF9UOworCSAgICB4ZmVybW9kZSA9IFhNT0RFX007CQkvKiBUcmFuc2ZlciBtb2RlIG1hbnVhbCAqLworCSAgICBmaWxlcGVlayA9IDA7CisjaWZkZWYgUEFUVEVSTlMKKwkgICAgcGF0dGVybnMgPSAwOworI2VuZGlmIC8qIFBBVFRFUk5TICovCisJICAgIGJyZWFrOworCisJICBjYXNlICc3JzoKKwkgICAgYnJlYWs7CisKKyNpZmRlZiBJS1NECisJICBjYXNlICdBJzogewkJCS8qIEludGVybmV0IHNlcnZlciAqLworCSAgICAgIC8qIEFscmVhZHkgZG9uZSBpbiBwcmVzY2FuKCkgKi8KKwkgICAgICAvKiBidXQgaW1wbGllcyAneCcgJiYgICdRJyAgICovCisjaWZkZWYgT1MyCisJICAgICAgY2hhciAqIHA7CisJICAgICAgaWYgKCooeHArMSkpIHsKKwkJICBYRkFUQUwoImludmFsaWQgYXJndW1lbnQgYnVuZGxpbmciKTsKKwkgICAgICB9CisjaWZkZWYgTlQKKwkgICAgICAvKiBTdXBwb3J0IGZvciBQcmFnbWEgU3lzdGVtcyBUZWxuZXQvVGVybWluYWwgU2VydmVycyAqLworCSAgICAgIHAgPSBnZXRlbnYoIlBSQUdNQVNZU19JTkVURF9TT0NLIik7CisJICAgICAgaWYgKCEocCAmJiBhdG9pKHApICE9IDApKSB7CisJCSAgeGFyZ3YrKywgeGFyZ2MtLTsKKwkJICBpZiAoeGFyZ2MgPCAxIHx8ICoqeGFyZ3YgPT0gJy0nKSB7CisJCSAgICAgIFhGQVRBTCgibWlzc2luZyBzb2NrZXQgaGFuZGxlIik7CisJCSAgfQorCSAgICAgIH0KKyNlbHNlIC8qIE5UICovCisJICAgICAgeGFyZ3YrKywgeGFyZ2MtLTsKKwkgICAgICBpZiAoeGFyZ2MgPCAxIHx8ICoqeGFyZ3YgPT0gJy0nKSB7CisJCSAgWEZBVEFMKCJtaXNzaW5nIHNvY2tldCBoYW5kbGUiKTsKKwkgICAgICB9CisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBPUzIgKi8KKyNpZmRlZiBOT0lDUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBubyBJbnRlcmFjdGl2ZSBDb21tYW5kIFBhcnNlciAqLworCSAgICAgIGFjdGlvbiA9ICd4JzsJCS8qIC1BIGltcGxpZXMgLXguICovCisjZW5kaWYgLyogTk9JQ1AgKi8KKyNpZm5kZWYgTk9YRkVSCisJICAgICAgZG9mYXN0KCk7CisjZW5kaWYgLyogTk9YRkVSICovCisJICAgICAgYnJlYWs7CisJICB9CisjZW5kaWYgLyogSUtTRCAqLworCisjaWZuZGVmIE5PWEZFUgorCSAgY2FzZSAnUSc6CQkJLyogUXVpY2sgKGkuZS4gRkFTVCkgKi8KKwkgICAgZG9mYXN0KCk7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisJICBjYXNlICdSJzoJCQkvKiBSZW1vdGUtT25seSAqLworCSAgICBicmVhazsJCQkvKiBUaGlzIGlzIGhhbmRsZWQgaW4gcHJlc2NhbigpLiAqLworCisjaWZuZGVmIE5PU0VSVkVSCisJICBjYXNlICd4JzoJCQkvKiBzZXJ2ZXIgKi8KKwkgIGNhc2UgJ08nOgkJCS8qIChmb3IgT25lIGNvbW1hbmQgb25seSkgKi8KKwkgICAgaWYgKGFjdGlvbikgeworCQlYRkFUQUwoImNvbmZsaWN0aW5nIGFjdGlvbnMiKTsKKwkgICAgfQorCSAgICBpZiAoeCA9PSAnTycpIGp1c3RvbmUgPSAxOworCSAgICB4ZmluaXNoID0gMTsKKwkgICAgYWN0aW9uID0gJ3gnOworCSAgICBicmVhazsKKyNlbmRpZiAvKiBOT1NFUlZFUiAqLworCisjaWZuZGVmIE5PWEZFUgorCSAgY2FzZSAnZic6CQkJLyogZmluaXNoICovCisJICAgIGlmIChhY3Rpb24pIHsKKwkJWEZBVEFMKCJjb25mbGljdGluZyBhY3Rpb25zIik7CisJICAgIH0KKwkgICAgYWN0aW9uID0gc2V0Z2VuKCdGJywiIiwiIiwiIik7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisJICBjYXNlICdyJzogewkJCS8qIHJlY2VpdmUgKi8KKwkgICAgICBpZiAoYWN0aW9uKSB7CisJCSAgWEZBVEFMKCJjb25mbGljdGluZyBhY3Rpb25zIik7CisJICAgICAgfQorCSAgICAgIGFjdGlvbiA9ICd2JzsKKwkgICAgICBicmVhazsKKwkgIH0KKworI2lmbmRlZiBOT1hGRVIKKwkgIGNhc2UgJ2snOgkJCS8qIHJlY2VpdmUgdG8gc3Rkb3V0ICovCisJICAgIGlmIChhY3Rpb24pIHsKKwkJWEZBVEFMKCJjb25mbGljdGluZyBhY3Rpb25zIik7CisJICAgIH0KKwkgICAgc3Rkb3VmID0gMTsKKwkgICAgYWN0aW9uID0gJ3YnOworCSAgICBicmVhazsKKworCSAgY2FzZSAncyc6IHsJCQkvKiBzZW5kICovCisJICAgICAgaW50IGZpbDJzbmQsIHJjOworCSAgICAgIGlmICghcmVjdXJzaXZlKQorCSAgICAgIG5vbGlua3MgPSAwOwkJLyogRm9sbG93IGxpbmtzIGJ5IGRlZmF1bHQgKi8KKworCSAgICAgIGlmIChhY3Rpb24pIHsKKwkJICBYRkFUQUwoImNvbmZsaWN0aW5nIGFjdGlvbnMiKTsKKwkgICAgICB9CisJICAgICAgaWYgKCooeHArMSkpIHsKKwkJICBYRkFUQUwoImludmFsaWQgYXJndW1lbnQgYnVuZGxpbmcgYWZ0ZXIgLXMiKTsKKwkgICAgICB9CisJICAgICAgbmZpbHMgPSAwOwkJLyogSW5pdGlhbGl6ZSBmaWxlIGNvdW50ZXIgKi8KKwkgICAgICBmaWwyc25kID0gMDsJCS8qIEFzc3VtZSBub3RoaW5nIHRvIHNlbmQgICovCisJICAgICAgeiA9IDA7CQkJLyogRmxhZyBmb3Igc3RkaW4gKi8KKwkgICAgICBjbWxpc3QgPSB4YXJndiArIDE7CS8qIFJlbWVtYmVyIHRoaXMgcG9pbnRlciAqLworCSAgICAgIHdoaWxlICgrK3hhcmd2LCAtLXhhcmdjID4gMCkgeyAvKiBUcmF2ZXJzZSB0aGUgbGlzdCAqLworI2lmZGVmIFBJUEVTRU5ECisJCSAgaWYgKHVzZXBpcGVzICYmIHByb3RvY29sID09IFBST1RPX0sgJiYgKip4YXJndiA9PSAnIScpIHsKKwkJICAgICAgY21hcmcgPSAqeGFyZ3Y7CisJCSAgICAgIGNtYXJnKys7CisJCSAgICAgIGRlYnVnKEYxMTAsImRvYXJnIHBpcGVzZW5kIixjbWFyZywwKTsKKwkJICAgICAgbmZpbHMgPSAtMTsKKwkJICAgICAgeiA9IDE7CisJCSAgICAgIHBpcGVzZW5kID0gMTsKKwkJICB9IGVsc2UKKyNlbmRpZiAvKiBQSVBFU0VORCAqLworCQkgICAgaWYgKCoqeGFyZ3YgPT0gJy0nKSB7IC8qIENoZWNrIGZvciBzZW5kaW5nIHN0ZGluICovCisJCQlpZiAoc3RyY21wKCp4YXJndiwiLSIpICE9IDApIC8qIG5leHQgb3B0aW9uPyAqLworCQkJICBicmVhazsKKwkJCXorKzsJCS8qICItIiBhbG9uZSBtZWFucyBzZW5kIGZyb20gc3RkaW4uICovCisjaWZkZWYgUkVDVVJTSVZFCisJCSAgICB9IGVsc2UgaWYgKCFzdHJjbXAoKnhhcmd2LCIuIikpIHsKKwkJCWZpbDJzbmQgPSAxOworCQkJbmZpbHMrKzsKKwkJCXJlY3Vyc2l2ZSA9IDE7CisJCQlub2xpbmtzID0gMjsKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKwkJICAgIH0gZWxzZSAvKiBDaGVjayBpZiBmaWxlIGV4aXN0cyAqLworCQkgICAgICBpZiAoKHJjID0gemNoa2koKnhhcmd2KSkgPiAtMSB8fCAocmMgPT0gLTIpKSB7CisJCQkgIGlmICAocmMgIT0gLTIpCisJCQkgICAgZmlsMnNuZCA9IDE7CisJCQkgIG5maWxzKys7CS8qIEJ1bXAgZmlsZSBjb3VudGVyICovCisJCSAgICAgIH0gZWxzZSBpZiAoaXN3aWxkKCp4YXJndikgJiYgbnp4cGFuZCgqeGFyZ3YsMCkgPiAwKSB7CisJCSAgICAgIC8qIG9yIGNvbnRhaW5zIHdpbGRjYXJkIGNoYXJhY3RlcnMgbWF0Y2hpbmcgcmVhbCBmaWxlcyAqLworCQkJICBmaWwyc25kID0gMTsKKwkJCSAgbmZpbHMrKzsKKwkJICAgICAgfQorCSAgICAgIH0KKwkgICAgICB4YXJnYysrLCB4YXJndi0tOwkJLyogQWRqdXN0IGFyZ3YvYXJnYyAqLworCSAgICAgIGlmICghZmlsMnNuZCAmJiB6ID09IDApIHsKKyNpZmRlZiBWTVMKKwkJICBYRkFUQUwoIiVDS0VSTUlULUUtU0VBUkNIRkFJTCwgbm8gZmlsZXMgZm9yIC1zIik7CisjZWxzZQorCQkgIFhGQVRBTCgiTm8gZmlsZXMgZm9yIC1zIik7CisjZW5kaWYgLyogVk1TICovCisJICAgICAgfQorCSAgICAgIGlmICh6ID4gMSkgeworCQkgIFhGQVRBTCgiLXM6IHRvbyBtYW55IC0ncyIpOworCSAgICAgIH0KKwkgICAgICBpZiAoeiA9PSAxICYmIGZpbDJzbmQpIHsKKwkJICBYRkFUQUwoImludmFsaWQgbWl4dHVyZSBvZiBmaWxlbmFtZXMgYW5kICctJyBpbiAtcyIpOworCSAgICAgIH0KKwkgICAgICBkZWJ1ZyhGMTAxLCJkb2FyZyBzIG5maWxzIiwiIixuZmlscyk7CisJICAgICAgZGVidWcoRjEwMSwiZG9hcmcgcyB6IiwiIix6KTsKKwkgICAgICBpZiAobmZpbHMgPT0gMCkgewkJLyogbm8gZmlsZSBwYXJhbWV0ZXJzIHdlcmUgc3BlY2lmaWVkICovCisJCSAgaWYgKGlzX2FfdHR5KDApKSB7CS8qICh1c2VkIHRvIGJlIGlzX2FfdHR5KDEpIC0gd2h5PykgKi8KKwkJICAgICAgWEZBVEFMKCJzZW5kaW5nIGZyb20gdGVybWluYWwgbm90IGFsbG93ZWQiKTsKKwkJICB9IGVsc2Ugc3RkaW5mID0gMTsKKwkgICAgICB9CisJICAgICAgZGVidWcoRjEwMSwiZG9hcmcgcyBzdGRpbmYiLCIiLHN0ZGluZik7CisJICAgICAgZGVidWcoRjExMSwiZG9hcmciLCp4YXJndixuZmlscyk7CisJICAgICAgYWN0aW9uID0gJ3MnOworCSAgICAgIGJyZWFrOworCSAgfQorCisJICBjYXNlICdnJzoJCQkvKiBnZXQgKi8KKwkgIGNhc2UgJ0cnOgkJCS8qIGdldCB0byBzdGRvdXQgKi8KKwkgICAgaWYgKGFjdGlvbikgeworCQlYRkFUQUwoImNvbmZsaWN0aW5nIGFjdGlvbnMiKTsKKwkgICAgfQorCSAgICBpZiAoKih4cCsxKSkgeworCQlYRkFUQUwoImludmFsaWQgYXJndW1lbnQgYnVuZGxpbmcgYWZ0ZXIgLWciKTsKKwkgICAgfQorCSAgICB4YXJndisrLCB4YXJnYy0tOworCSAgICBpZiAoKHhhcmdjID09IDApIHx8ICgqKnhhcmd2ID09ICctJykpIHsKKwkJWEZBVEFMKCJtaXNzaW5nIGZpbGVuYW1lIGZvciAtZyIpOworCSAgICB9CisJICAgIGlmICh4ID09ICdHJykgc3Rkb3VmID0gMTsKKwkgICAgY21hcmcgPSAqeGFyZ3Y7CisJICAgIGFjdGlvbiA9ICdyJzsKKwkgICAgYnJlYWs7CisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9MT0NBTAorCSAgY2FzZSAnYyc6CQkJLyogY29ubmVjdCBiZWZvcmUgKi8KKwkgICAgY2ZsZyA9IDE7CisJICAgIGJyZWFrOworCisJICBjYXNlICduJzoJCQkvKiBjb25uZWN0IGFmdGVyICovCisJICAgIGNuZmxnID0gMTsKKwkgICAgYnJlYWs7CisjZW5kaWYgLyogTk9MT0NBTCAqLworCisJICBjYXNlICdoJzoJCQkvKiBoZWxwICovCisJICAgIHVzYWdlKCk7CisjaWZuZGVmIE5PSUNQCisJICAgIGlmIChzdGF5ZmxnIHx8IHdoYXQgPT0gV19DT01NQU5EKQorCSAgICAgIGJyZWFrOworCSAgICBlbHNlCisjZW5kaWYgLyogTk9JQ1AgKi8KKwkgICAgICBkb2V4aXQoR09PRF9FWElULC0xKTsKKworI2lmbmRlZiBOT1hGRVIKKwkgIGNhc2UgJ2EnOgkJCS8qICJhcyIgKi8KKwkgICAgaWYgKCooeHArMSkpIHsKKwkJWEZBVEFMKCJpbnZhbGlkIGFyZ3VtZW50IGJ1bmRsaW5nIGFmdGVyIC1hIik7CisJICAgIH0KKwkgICAgeGFyZ3YrKywgeGFyZ2MtLTsKKwkgICAgaWYgKCh4YXJnYyA8IDEpIHx8ICgqKnhhcmd2ID09ICctJykpIHsKKwkJWEZBVEFMKCJtaXNzaW5nIG5hbWUgaW4gLWEiKTsKKwkgICAgfQorCSAgICBjbWFyZzIgPSAqeGFyZ3Y7CisJICAgIGRlYnVnKEYxMTEsImRvYXJnIGEiLGNtYXJnMix4YXJnYyk7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PSUNQCisJICBjYXNlICdZJzoJCQkvKiBObyBpbml0aWFsaXphdGlvbiBmaWxlICovCisJICAgIG5vaW5pdCA9IDE7CisJICAgIGJyZWFrOworCisJICBjYXNlICd5JzoJCQkvKiBBbHRlcm5hdGUgaW5pdC1maWxlIG5hbWUgKi8KKwkgICAgbm9pbml0ID0gMDsKKwkgICAgaWYgKCooeHArMSkpIHsKKwkJWEZBVEFMKCJpbnZhbGlkIGFyZ3VtZW50IGJ1bmRsaW5nIGFmdGVyIC15Iik7CisJICAgIH0KKwkgICAgeGFyZ3YrKywgeGFyZ2MtLTsKKwkgICAgaWYgKHhhcmdjIDwgMSkgeworCQlYRkFUQUwoIm1pc3NpbmcgZmlsZW5hbWUgaW4gLXkiKTsKKwkgICAgfQorCSAgICAvKiBzdHJjcHkoa2VybXJjLCp4YXJndik7IC4uLiBhbHJlYWR5IGRvbmUgaW4gcHJlc2NhbigpLi4uICovCisJICAgIGJyZWFrOworI2VuZGlmIC8qIE5PSUNQICovCisKKyNpZm5kZWYgTk9YRkVSCisJICBjYXNlICdJJzoJCQkvKiBBc3N1bWUgd2UgaGF2ZSBhbiAiSW50ZXJuZXQiICovCisJICAgIHJlbGlhYmxlID0gMTsJCS8qIG9yIG90aGVyIHJlbGlhYmxlIGNvbm5lY3Rpb24gKi8KKwkgICAgeHJlbGlhYmxlID0gMTsKKwkgICAgc2V0cmVsaWFibGUgPSAxOworCisJICAgIC8qIEknbSBub3Qgc28gc3VyZSBhYm91dCB0aGlzIC0tIHdoYXQgYWJvdXQgVk1TPyAobmV4dCBjb21tZW50KSAqLworCSAgICBjbGVhcnJxID0gMTsJCS8qIHRoZXJlZm9yZSB0aGUgY2hhbm5lbCBpcyBjbGVhciAqLworCisjaWZuZGVmIFZNUworLyoKKyAgU2luY2UgdGhpcyBjYW4gdHJpZ2dlciBmdWxsIGNvbnRyb2wtY2hhcmFjdGVyIHVucHJlZml4aW5nLCB3ZSBuZWVkIHRvCisgIGVuc3VyZSB0aGF0IG91ciB0ZXJtaW5hbCBvciBwdHkgZHJpdmVyIGlzIG5vdCBkb2luZyBYb24vWG9mZjsgb3RoZXJ3aXNlCisgIHdlIGNhbiBiZWNvbWUgZGVhZGxvY2tlZCB0aGUgZmlyc3QgdGltZSB3ZSByZWNlaXZlIGEgZmlsZSB0aGF0IGNvbnRhaW5zCisgIFhvZmYuCisqLworCSAgICBmbG93ID0gRkxPX05PTkU7CisjZW5kaWYgLyogVk1TICovCisJICAgIGJyZWFrOworI2VuZGlmIC8qIE5PWEZFUiAqLworCisjaWZuZGVmIE5PTE9DQUwKKwkgIGNhc2UgJ2wnOgkJCS8qIFNFVCBMSU5FICovCisjaWZkZWYgTkVUQ09OTgorI2lmZGVmIEFOWVgyNQorCSAgY2FzZSAnWCc6CQkJLyogU0VUIEhPU1QgdG8gWC4yNSBhZGRyZXNzICovCisjaWZkZWYgU1VOWDI1CisJICBjYXNlICdaJzoJCQkvKiBTRVQgSE9TVCB0byBYLjI1IGZpbGUgZGVzY3JpcHRvciAqLworI2VuZGlmIC8qIFNVTlgyNSAqLworI2VuZGlmIC8qIEFOWVgyNSAqLworI2lmZGVmIFRDUFNPQ0tFVAorCSAgY2FzZSAnSic6CisJICBjYXNlICdqJzoJCQkvKiBTRVQgSE9TVCAoVENQL0lQIHNvY2tldCkgKi8KKyNlbmRpZiAvKiBUQ1BTT0NLRVQgKi8KKyNlbmRpZiAvKiBORVRDT05OICovCisjaWZuZGVmIE5PWEZFUgorCSAgICBpZiAoeCA9PSAnaicgfHwgeCA9PSAnSicgfHwgeCA9PSAnWCcgfHwgeCA9PSAnWicpIHsKKwkJcmVsaWFibGUgPSAxOwkJLyogb3Igb3RoZXIgcmVsaWFibGUgY29ubmVjdGlvbiAqLworCQl4cmVsaWFibGUgPSAxOworCQlzZXRyZWxpYWJsZSA9IDE7CisJICAgIH0KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKwkgICAgbmV0d29yayA9IDA7CisJICAgIGlmICgqKHhwKzEpKSB7CisJCVhGQVRBTCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyBhZnRlciAtbCBvciAtaiIpOworCSAgICB9CisJICAgIHhhcmd2KyssIHhhcmdjLS07CisJICAgIGlmICgoeGFyZ2MgPCAxKSB8fCAoKip4YXJndiA9PSAnLScpKSB7CisJCVhGQVRBTCgiY29tbXVuaWNhdGlvbiBsaW5lIGRldmljZSBuYW1lIG1pc3NpbmciKTsKKwkgICAgfQorCisjaWZkZWYgTkVUQ09OTgorCSAgICBpZiAoeCA9PSAnSicpIHsKKwkJY2ZsZyAgICA9IDE7CQkvKiBDb25uZWN0ICovCisJCXN0YXlmbGcgPSAxOwkJLyogU3RheSAqLworCQl0bl9leGl0ID0gMTsJCS8qIFRlbG5ldC1saWtlIGV4aXQgY29uZGl0aW9uICovCisJCWV4aXRvbmNsb3NlID0gMTsKKwkgICAgfQorI2VuZGlmIC8qIE5FVENPTk4gKi8KKwkgICAgY2tzdHJuY3B5KHR0bmFtZSwqeGFyZ3YsVFROQU1MRU4rMSk7CisJICAgIGxvY2FsID0gKHN0cmNtcCh0dG5hbWUsQ1RUTkFNKSAhPSAwKTsKKwkgICAgaWYgKGxvY2FsICYmIHN0cmNtcCh0dG5hbWUsIjAiKSA9PSAwKQorCSAgICAgIGxvY2FsID0gMDsKKy8qCisgIE5PVEU6IFdlIHJlYWxseSBkbyBub3QgbmVlZCB0byBjYWxsIHR0b3BlbiBoZXJlLCBzaW5jZSBpdCBzaG91bGQgYmUgY2FsbGVkCisgIGFnYWluIGxhdGVyLCBhdXRvbWF0aWNhbGx5LCB3aGVuIHdlIGZpcnN0IHRyeSB0byBjb25kaXRpb24gdGhlIGRldmljZSB2aWEKKyAgdHRwa3Qgb3IgdHR2dC4gIENhbGxpbmcgdHRvcGVuIGhlcmUgaGFzIHRoZSBiYWQgc2lkZSBlZmZlY3Qgb2YgbWFraW5nIHRoZQorICBvcmRlciBvZiB0aGUgLWIgYW5kIC1sIG9wdGlvbnMgc2lnbmlmaWNhbnQgd2hlbiB0aGUgb3JkZXIgb2YgY29tbWFuZC1saW5lCisgIG9wdGlvbnMgc2hvdWxkIG5vdCBtYXR0ZXIuICBIb3dldmVyLCB0aGUgbmV0d29yayBjYXNlcyBpbW1lZGlhdGVseSBiZWxvdworICBjb21wbGljYXRlIG1hdHRlcnMgYSBiaXQsIHNvIHdlJ2xsIHNldHRsZSB0aGlzIGluIGEgZnV0dXJlIGVkaXQuCisqLworCSAgICBpZiAoeCA9PSAnbCcpIHsKKwkJaWYgKHR0b3Blbih0dG5hbWUsJmxvY2FsLG1kbXR5cCwwKSA8IDApIHsKKwkJICAgIFhGQVRBTCgiY2FuJ3Qgb3BlbiBkZXZpY2UiKTsKKwkJfQorI2lmZGVmIENLTE9HRElBTAorCQlkb2xvZ2xpbmUoKTsKKyNlbmRpZiAvKiBDS0xPR0RJQUwgKi8KKwkJZGVidWcoRjEwMSwiZG9hcmcgc3BlZWQiLCIiLHNwZWVkKTsKKwkJY3h0eXBlID0gKG1kbXR5cCA+IDApID8gQ1hUX01PREVNIDogQ1hUX0RJUkVDVDsKKwkJc3BlZWQgPSB0dGdzcGQoKTsJLyogR2V0IHRoZSBzcGVlZC4gKi8KKwkJc2V0ZmxvdygpOwkJLyogRG8gc29tZXRoaW5nIGFib3V0IGZsb3cgY29udHJvbC4gKi8KKyNpZm5kZWYgTk9TUEwKKwkJaWYgKGxvY2FsKSB7CisJCSAgICBpZiAobm1hYykgewkJLyogQW55IG1hY3JvcyBkZWZpbmVkPyAqLworCQkJaW50IGs7CQkvKiBZZXMgKi8KKwkJCWsgPSBtbG9vayhtYWN0YWIsIm9uX29wZW4iLG5tYWMpOyAvKiBMb29rIHRoaXMgdXAgKi8KKwkJCWlmIChrID49IDApIHsJLyogSWYgZm91bmQsICovCisJCQkgICAgaWYgKGRvZG8oayx0dG5hbWUsMCkgPiAtMSkgLyogc2V0IGl0IHVwLCAqLworCQkJICAgICAgcGFyc2VyKDEpOyAvKiBhbmQgZXhlY3V0ZSBpdCAqLworCQkJfQorCQkgICAgfQorCQl9CisjZW5kaWYgLyogTk9TUEwgKi8KKworI2lmZGVmIE5FVENPTk4KKwkgICAgfSBlbHNlIHsKKwkJaWYgKHggPT0gJ2onIHx8IHggPT0gJ0onKSB7IC8qIElQIG5ldHdvcmsgaG9zdCBuYW1lICovCisJCSAgICBjaGFyICogcyA9IGxpbmU7CisJCSAgICBjaGFyICogc2VydmljZSA9IHRtcGJ1ZjsKKwkJICAgIGlmICh4YXJnYyA+IDApIHsJLyogQ2hlY2sgaWYgaXQncyBmb2xsb3dlZCBieSAqLworCQkJLyogQSBzZXJ2aWNlIG5hbWUgb3IgbnVtYmVyICovCisJCQlpZiAoKih4YXJndisxKSAmJiAqKCooeGFyZ3YrMSkpICE9ICctJykgeworCQkJICAgIHhhcmd2KyssIHhhcmdjLS07CisJCQkgICAgY2tzdHJuY2F0KHR0bmFtZSwiOiIsVFROQU1MRU4rMSk7CisJCQkgICAgY2tzdHJuY2F0KHR0bmFtZSwqeGFyZ3YsVFROQU1MRU4rMSk7CisJCQl9CisJCSAgICB9CisJCSAgICBuZXR0eXBlID0gTkVUX1RDUEI7CisJCSAgICBtZG10eXAgPSAtbmV0dHlwZTsJLyogUGVyaGFwcyBhbHJlYWR5IHNldCBpbiBpbml0IGZpbGUgKi8KKwkJICAgIHRlbG5ldGZkID0gMTsJLyogT3IgbWF5YmUgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgKi8KKwkJICAgIGNrc3RybmNweShsaW5lLCB0dG5hbWUsIExJTkJVRlNJWik7IC8qIFdvcmtpbmcgY29weSAqLworCQkgICAgZm9yIChzID0gbGluZTsgKnMgIT0gTlVMICYmICpzICE9ICc6JzsgcysrKTsKKwkJICAgIGlmICgqcykgeworCQkJKnMrKyA9IE5VTDsKKwkJCWNrc3RybmNweShzZXJ2aWNlLCBzLCBUTVBCVUZTSVopOworCQkgICAgfSBlbHNlICpzZXJ2aWNlID0gTlVMOworCQkgICAgcyA9IGxpbmU7CisjaWZuZGVmIE5PRElBTAorI2lmbmRlZiBOT0lDUAorCQkgICAgLyogTG9vayB1cCBpbiBuZXR3b3JrIGRpcmVjdG9yeSAqLworCQkgICAgeCA9IDA7CisJCSAgICBpZiAoKnMgPT0gJz0nKSB7CS8qIElmIG51bWJlciBzdGFydHMgd2l0aCA9IHNpZ24gKi8KKwkJCXMrKzsJCS8qIHN0cmlwIGl0ICovCisJCQl3aGlsZSAoKnMgPT0gU1ApIC8qIGFuZCBhbHNvIGFueSBsZWFkaW5nIHNwYWNlcyAqLworCQkJICBzKys7CisJCQlja3N0cm5jcHkobGluZSxzLExJTkJVRlNJWik7IC8qIERvIHRoaXMgYWdhaW4uICovCisJCQluaGNvdW50ID0gMDsKKwkJICAgIH0gZWxzZSBpZiAoIWlzZGlnaXQobGluZVswXSkpIHsKKy8qCisgIG5uZXRkaXIgd2lsbCBiZSBncmVhdGVyIHRoYW4gMCBpZiB0aGUgaW5pdCBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCBhbmQgaXQKKyAgY29udGFpbmVkIGEgU0VUIE5FVFdPUksgRElSRUNUT1JZIGNvbW1hbmQuCisqLworCQkJeHggPSAwOwkJLyogSW5pdGlhbGl6ZSB0aGlzICovCisJCQlpZiAobm5ldGRpciA+IDApIC8qIElmIHRoZXJlIGlzIGEgZGlyZWN0b3J5Li4uICovCisJCQkgIHh4ID0gbHVuZXQobGluZSk7IC8qIExvb2sgdXAgdGhlIG5hbWUgKi8KKwkJCWVsc2UJCS8qIElmIG5vIGRpcmVjdG9yeSAqLworCQkJICBuaGNvdW50ID0gMDsJLyogd2UgZGlkbid0IGZpbmQgYW55dGhpbmcgdGhlcmUgKi8KKwkJCWlmICh4eCA8IDApIHsJLyogTG9va3VwIGVycm9yOiAqLworCQkJICAgIGNrbWFrbXNnKHRtcGJ1ZiwKKwkJCQkgICAgIFRNUEJVRlNJWiwKKwkJCQkgICAgIj9GYXRhbCBuZXR3b3JrIGRpcmVjdG9yeSBsb29rdXAgZXJyb3IgLSAiLAorCQkJCSAgICAgbGluZSwKKwkJCQkgICAgICJcbiIsCisJCQkJICAgICBOVUxMCisJCQkJICAgICApOworCQkJICAgIFhGQVRBTCh0bXBidWYpOworCQkJfQorCQkgICAgfQorI2VuZGlmIC8qIE5PSUNQICovCisjZW5kaWYgLyogTk9ESUFMICovCisJCSAgICAvKiBBZGQgc2VydmljZSB0byBsaW5lIHNwZWNpZmljYXRpb24gZm9yIHR0b3BlbigpICovCisJCSAgICBpZiAoKnNlcnZpY2UpIHsJLyogVGhlcmUgaXMgYSBzZXJ2aWNlIHNwZWNpZmllZCAqLworCQkJY2tzdHJuY2F0KGxpbmUsICI6IixMSU5CVUZTSVopOworCQkJY2tzdHJuY2F0KGxpbmUsIHNlcnZpY2UsTElOQlVGU0laKTsKKwkJCXR0bnByb3RvID0gTlBfREVGQVVMVDsKKwkJICAgIH0gZWxzZSB7CisJCQlja3N0cm5jYXQobGluZSwgIjp0ZWxuZXQiLExJTkJVRlNJWik7CisJCQl0dG5wcm90byA9IE5QX1RFTE5FVDsKKwkJICAgIH0KKworI2lmbmRlZiBOT0lDUAorI2lmbmRlZiBOT0RJQUwKKwkJICAgIGlmICgobmhjb3VudCA+IDEpICYmICFxdWlldCAmJiAhYmFja2dyZCkgeworCQkJcHJpbnRmKCIlZCBlbnRyJXMgZm91bmQgZm9yIFwiJXNcIiVzXG4iLAorCQkJICAgICAgIG5oY291bnQsCisJCQkgICAgICAgKG5oY291bnQgPT0gMSkgPyAieSIgOiAiaWVzIiwKKwkJCSAgICAgICBzLAorCQkJICAgICAgIChuaGNvdW50ID4gMCkgPyAiOiIgOiAiLiIKKwkJCSAgICAgICApOworCQkJZm9yIChpID0gMDsgaSA8IG5oY291bnQ7IGkrKykKKwkJCSAgcHJpbnRmKCIlM2QuICVzICUtMTJzID0+ICVzXG4iLAorCQkJCSBpKzEsIG5fbmFtZSwgbmhfcDJbaV0sIG5oX3BbaV0KKwkJCQkgKTsKKwkJICAgIH0KKwkJICAgIGlmIChuaGNvdW50ID09IDApCisJCSAgICAgIG4gPSAxOworCQkgICAgZWxzZQorCQkgICAgICBuID0gbmhjb3VudDsKKyNlbHNlCisJCSAgICBuID0gMTsKKwkJICAgIG5oY291bnQgPSAwOworI2VuZGlmIC8qIE5PRElBTCAqLworCQkgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworI2lmbmRlZiBOT0RJQUwKKwkJCWlmIChuaGNvdW50ID49IDEpIHsKKwkJCSAgICAvKiBDb3B5IHRoZSBjdXJyZW50IGVudHJ5IHRvIGxpbmUgKi8KKwkJCSAgICBja3N0cm5jcHkobGluZSxuaF9wW2ldLExJTkJVRlNJWik7CisgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgbmV0d29yayBlbnRyeSBjb250YWlucyBhIHNlcnZpY2UgKi8KKwkJCSAgICBmb3IgKHMgPSBsaW5lIDsgKCpzICE9IE5VTCkgJiYgKCpzICE9ICc6Jyk7IHMrKykKKwkJCSAgICAgIDsKKwkJCSAgICAvKiBJZiBkaXJlY3RvcnkgZG9lcyBub3QgaGF2ZSBhIHNlcnZpY2UgLi4uICovCisJCQkgICAgLyogYW5kIHRoZSB1c2VyIHNwZWNpZmllZCBvbmUgKi8KKwkJCSAgICBpZiAoISpzICYmICpzZXJ2aWNlKSB7CisJCQkJY2tzdHJuY2F0KGxpbmUsICI6IixMSU5CVUZTSVopOworCQkJCWNrc3RybmNhdChsaW5lLCBzZXJ2aWNlLExJTkJVRlNJWik7CisJCQkgICAgfQorCQkJICAgIGlmIChsb29rdXAobmV0Y21kLG5oX3AyW2ldLG5uZXRzLCZ6KSA+IC0xKSB7CisJCQkJbWRtdHlwID0gMCAtIG5ldGNtZFt6XS5rd3ZhbDsKKwkJCSAgICB9IGVsc2UgeworCQkJCXByaW50ZigKKwkJCQkgIkVycm9yIC0gbmV0d29yayB0eXBlIFwiJXNcIiBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCSAgICAgICBuaF9wMltpXQorCQkJCSAgICAgICApOworCQkJCWNvbnRpbnVlOworCQkJICAgIH0KKwkJCX0KKyNlbmRpZiAvKiBOT0RJQUwgKi8KKwkJICAgIH0KKyNlbmRpZiAvKiBOT0lDUCAqLworCQkgICAgY2tzdHJuY3B5KHR0bmFtZSwgbGluZSxUVE5BTUxFTisxKTsKKwkJICAgIGN4dHlwZSA9IENYVF9UQ1BJUDsJLyogU2V0IGNvbm5lY3Rpb24gdHlwZSAqLworCQkgICAgc2V0ZmxvdygpOwkJLyogU2V0IGFwcHJvcHJpYXRlIGZsb3cgY29udHJvbC4gKi8KKyNpZmRlZiBTVU5YMjUKKwkJfSBlbHNlIGlmICh4ID09ICdYJykgewkvKiBYLjI1IGFkZHJlc3MgKi8KKwkJICAgIG5ldHR5cGUgPSBORVRfU1gyNTsKKwkJICAgIG1kbXR5cCA9IC1uZXR0eXBlOworCQl9IGVsc2UgaWYgKHggPT0gJ1onKSB7CS8qIE9wZW4gWC4yNSBmaWxlIGRlc2NyaXB0b3IgKi8KKwkJICAgIG5ldHR5cGUgPSBORVRfU1gyNTsKKwkJICAgIG1kbXR5cCA9IC1uZXR0eXBlOworCQkgICAgeDI1ZmQgPSAxOworI2VuZGlmIC8qIFNVTlgyNSAqLworI2lmZGVmIFNUUkFUVVNYMjUKKwkJfSBlbHNlIGlmICh4ID09ICdYJykgewkvKiBYLjI1IGFkZHJlc3MgKi8KKwkJICAgIG5ldHR5cGUgPSBORVRfVlgyNTsKKwkJICAgIG1kbXR5cCA9IC1uZXR0eXBlOworI2VuZGlmIC8qIFNUUkFUVVNYMjUgKi8KKyNpZmRlZiBJQk1YMjUKKwkJfSBlbHNlIGlmICh4ID09ICdYJykgewkvKiBYLjI1IGFkZHJlc3MgKi8KKwkJICAgIG5ldHR5cGUgPSBORVRfSVgyNTsKKwkJICAgIG1kbXR5cCA9IC1uZXR0eXBlOworI2VuZGlmIC8qIElCTVgyNSAqLworI2lmZGVmIEhQWDI1CisJCX0gZWxzZSBpZiAoeCA9PSAnWCcpIHsJLyogWC4yNSBhZGRyZXNzICovCisJCSAgICBuZXR0eXBlID0gTkVUX0hYMjU7CisJCSAgICBtZG10eXAgPSAtbmV0dHlwZTsKKyNlbmRpZiAvKiBIUFgyNSAqLworCQl9CisJCWlmICh0dG9wZW4odHRuYW1lLCZsb2NhbCxtZG10eXAsMCkgPCAwKSB7CisJCSAgICBYRkFUQUwoImNhbid0IG9wZW4gaG9zdCBjb25uZWN0aW9uIik7CisJCX0KKwkJbmV0d29yayA9IDE7CisjaWZkZWYgQ0tMT0dESUFMCisJCWRvbG9nbmV0KCk7CisjZW5kaWYgLyogQ0tMT0dESUFMICovCisJCWN4dHlwZSA9IENYVF9YMjU7CS8qIFNldCBjb25uZWN0aW9uIHR5cGUgKi8KKwkJc2V0ZmxvdygpOwkJLyogU2V0IGFwcHJvcHJpYXRlIGZsb3cgY29udHJvbC4gKi8KKyNpZm5kZWYgTk9TUEwKKwkJaWYgKGxvY2FsKSB7CisJCSAgICBpZiAobm1hYykgewkJLyogQW55IG1hY3JvcyBkZWZpbmVkPyAqLworCQkJaW50IGs7CQkvKiBZZXMgKi8KKwkJCWsgPSBtbG9vayhtYWN0YWIsIm9uX29wZW4iLG5tYWMpOyAvKiBMb29rIHRoaXMgdXAgKi8KKwkJCWlmIChrID49IDApIHsJLyogSWYgZm91bmQsICovCisJCQkgICAgaWYgKGRvZG8oayx0dG5hbWUsMCkgPiAtMSkgLyogc2V0IGl0IHVwLCAqLworCQkJICAgICAgcGFyc2VyKDEpOyAgICAgICAgLyogYW5kIGV4ZWN1dGUgaXQgKi8KKwkJCX0KKwkJICAgIH0KKwkJfQorI2VuZGlmIC8qIE5PU1BMICovCisjZW5kaWYgLyogTkVUQ09OTiAqLworCSAgICB9CisJICAgIC8qIGFkZCBtb3JlIGhlcmUgLS0gZGVjbmV0LCBldGMuLi4gKi8KKwkgICAgaGF2ZWxpbmUgPSAxOworCSAgICBicmVhazsKKworI2lmZGVmIEFOWVgyNQorCSAgY2FzZSAnVSc6CQkJLyogWC4yNSBjYWxsIHVzZXIgZGF0YSAqLworCSAgICBpZiAoKih4cCsxKSkgeworCQlYRkFUQUwoImludmFsaWQgYXJndW1lbnQgYnVuZGxpbmciKTsKKwkgICAgfQorCSAgICB4YXJndisrLCB4YXJnYy0tOworCSAgICBpZiAoKHhhcmdjIDwgMSkgfHwgKCoqeGFyZ3YgPT0gJy0nKSkgeworCQlYRkFUQUwoIm1pc3NpbmcgY2FsbCB1c2VyIGRhdGEgc3RyaW5nIik7CisJICAgIH0KKwkgICAgY2tzdHJuY3B5KHVkYXRhLCp4YXJndixNQVhDVURBVEEpOworCSAgICBpZiAoKGludClzdHJsZW4odWRhdGEpIDw9IE1BWENVREFUQSkgeworCQljdWRhdGEgPSAxOworCSAgICB9IGVsc2UgeworCQlYRkFUQUwoIkludmFsaWQgY2FsbCB1c2VyIGRhdGEiKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgY2FzZSAnbyc6CQkJLyogWC4yNSBjbG9zZWQgdXNlciBncm91cCAqLworCSAgICBpZiAoKih4cCsxKSkgeworCQlYRkFUQUwoImludmFsaWQgYXJndW1lbnQgYnVuZGxpbmciKTsKKwkgICAgfQorCSAgICB4YXJndisrLCB4YXJnYy0tOworCSAgICBpZiAoKHhhcmdjIDwgMSkgfHwgKCoqeGFyZ3YgPT0gJy0nKSkgeworCQlYRkFUQUwoIm1pc3NpbmcgY2xvc2VkIHVzZXIgZ3JvdXAgaW5kZXgiKTsKKwkgICAgfQorCSAgICB6ID0gYXRvaSgqeGFyZ3YpOwkJLyogQ29udmVydCB0byBudW1iZXIgKi8KKwkgICAgaWYgKHogPj0gMCAmJiB6IDw9IDk5KSB7CisJCWNsb3NnciA9IHo7CisJICAgIH0gZWxzZSB7CisJCVhGQVRBTCgiSW52YWxpZCBjbG9zZWQgdXNlciBncm91cCBpbmRleCIpOworCSAgICB9CisJICAgIGJyZWFrOworCisJICBjYXNlICd1JzoJCQkvKiBYLjI1IHJldmVyc2UgY2hhcmdlIGNhbGwgKi8KKwkgICAgcmV2Y2FsbCA9IDE7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIEFOWVgyNSAqLworI2VuZGlmIC8qIE5PTE9DQUwgKi8KKworCSAgY2FzZSAnYic6CQkJLyogQml0cy1wZXItc2Vjb25kIGZvciBzZXJpYWwgZGV2aWNlICovCisJICAgIGlmICgqKHhwKzEpKSB7CisJCVhGQVRBTCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyIpOworCSAgICB9CisJICAgIHhhcmd2KyssIHhhcmdjLS07CisJICAgIGlmICgoeGFyZ2MgPCAxKSB8fCAoKip4YXJndiA9PSAnLScpKSB7CisJCVhGQVRBTCgibWlzc2luZyBicHMiKTsKKwkgICAgfQorCSAgICB6eiA9IGF0b2woKnhhcmd2KTsJCS8qIENvbnZlcnQgdG8gbG9uZyBpbnQgKi8KKwkgICAgaSA9IHp6IC8gMTBMOworI2lmbmRlZiBOT0xPQ0FMCisJICAgIGlmICh0dHNzcGQoaSkgPiAtMSkJCS8qIENoZWNrIGFuZCBzZXQgaXQgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisJICAgICAgc3BlZWQgPSB0dGdzcGQoKTsJCS8qIGFuZCByZWFkIGl0IGJhY2suICovCisjaWZuZGVmIE5PTE9DQUwKKwkgICAgZWxzZSB7CisJCVhGQVRBTCgidW5zdXBwb3J0ZWQgdHJhbnNtaXNzaW9uIHJhdGUiKTsKKwkgICAgfQorI2VuZGlmIC8qIE5PTE9DQUwgKi8KKwkgICAgYnJlYWs7CisKKyNpZm5kZWYgTk9ESUFMCisjaWZuZGVmIE5PSUNQCisJICBjYXNlICdtJzoJCQkvKiBNb2RlbSB0eXBlICovCisJICAgIGlmICgqKHhwKzEpKSB7CisJCVhGQVRBTCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyBhZnRlciAtbSIpOworCSAgICB9CisJICAgIHhhcmd2KyssIHhhcmdjLS07CisJICAgIGlmICgoeGFyZ2MgPCAxKSB8fCAoKip4YXJndiA9PSAnLScpKSB7CisJCVhGQVRBTCgibW9kZW0gdHlwZSBtaXNzaW5nIik7CisJICAgIH0KKwkgICAgeSA9IGxvb2t1cChtZG10YWIsKnhhcmd2LG5tZG0sJnopOworCSAgICBpZiAoeSA8IDApIHsKKwkJWEZBVEFMKCJ1bmtub3duIG1vZGVtIHR5cGUiKTsKKwkgICAgfQorCSAgICB1c2VybWRtID0gMDsKKwkgICAgdXNlcm1kbSA9ICh5ID09IGRpYWx1ZHQpID8geCA6IDA7CisJICAgIGluaXRtZG0oeSk7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIE5PSUNQICovCisjZW5kaWYgLyogTk9ESUFMICovCisKKyNpZm5kZWYgTk9YRkVSCisJICBjYXNlICdlJzoJCQkvKiBFeHRlbmRlZCBwYWNrZXQgbGVuZ3RoICovCisJICAgIGlmICgqKHhwKzEpKSB7CisJCVhGQVRBTCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyBhZnRlciAtZSIpOworCSAgICB9CisJICAgIHhhcmd2KyssIHhhcmdjLS07CisJICAgIGlmICgoeGFyZ2MgPCAxKSB8fCAoKip4YXJndiA9PSAnLScpKSB7CisJCVhGQVRBTCgibWlzc2luZyBsZW5ndGgiKTsKKwkgICAgfQorCSAgICB6ID0gYXRvaSgqeGFyZ3YpOwkJLyogQ29udmVydCB0byBudW1iZXIgKi8KKwkgICAgaWYgKHogPiAxMCAmJiB6IDw9IG1heHJwcykgeworCQlycHNpeiA9IHVycHNpeiA9IHo7CisJCWlmICh6ID4gOTQpIHJwc2l6ID0gOTQ7CS8qIEZhbGxiYWNrIGlmIG90aGVyIEtlcm1pdCBjYW4ndCAqLworCSAgICB9IGVsc2UgeworCQlYRkFUQUwoIlVuc3VwcG9ydGVkIHBhY2tldCBsZW5ndGgiKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgY2FzZSAndic6CQkJLyogVmluZG93IHNpemUgKi8KKwkgICAgaWYgKCooeHArMSkpIHsKKwkJWEZBVEFMKCJpbnZhbGlkIGFyZ3VtZW50IGJ1bmRsaW5nIik7CisJICAgIH0KKwkgICAgeGFyZ3YrKywgeGFyZ2MtLTsKKwkgICAgaWYgKCh4YXJnYyA8IDEpIHx8ICgqKnhhcmd2ID09ICctJykpIHsKKwkJWEZBVEFMKCJtaXNzaW5nIG9yIGJhZCB3aW5kb3cgc2l6ZSIpOworCSAgICB9CisJICAgIHogPSBhdG9pKCp4YXJndik7CQkvKiBDb252ZXJ0IHRvIG51bWJlciAqLworCSAgICBpZiAoeiA8IDMyKSB7CQkvKiBJZiBpbiByYW5nZSAqLworCQl3c2xvdHIgPSB6OwkJLyogc2V0IGl0ICovCisJCWlmICh6ID4gMSkgc3djYXByID0gMTsJLyogU2V0IGNhcGFzIGJpdCBpZiB3aW5kb3dpbmcgKi8KKwkgICAgfSBlbHNlIHsKKwkJWEZBVEFMKCJVbnN1cHBvcnRlZCBwYWNrZXQgbGVuZ3RoIik7CisJICAgIH0KKwkgICAgYnJlYWs7CisjZW5kaWYgLyogTk9YRkVSICovCisKKwkgIGNhc2UgJ2knOgkJCS8qIFRyZWF0IGZpbGVzIGFzIGJpbmFyeSAqLworCSAgICBiaW5hcnkgPSBYWUZUX0I7CisJICAgIHhmZXJtb2RlID0gWE1PREVfTTsJCS8qIFRyYW5zZmVyIG1vZGUgbWFudWFsICovCisJICAgIGZpbGVwZWVrID0gMDsKKyNpZmRlZiBQQVRURVJOUworCSAgICBwYXR0ZXJucyA9IDA7CisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKwkgICAgYnJlYWs7CisKKyNpZm5kZWYgTk9YRkVSCisJICBjYXNlICd3JzoJCQkvKiBXcml0ZW92ZXIgKi8KKwkgICAgY2t3YXJuID0gMDsKKwkgICAgZm5jYWN0ID0gWFlGWF9YOworCSAgICBicmVhazsKKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworCSAgY2FzZSAncSc6CQkJLyogUXVpZXQgKi8KKwkgICAgcXVpZXQgPSAxOworCSAgICBicmVhazsKKworI2lmZGVmIERFQlVHCisJICBjYXNlICdkJzoJCQkvKiBERUJVRyAqLworCSAgICBicmVhazsJCQkvKiBIYW5kbGVkIGluIHByZXNjYW4oKSAqLworI2VuZGlmIC8qIERFQlVHICovCisKKwkgIGNhc2UgJzAnOiB7CQkJLyogSW4gdGhlIG1pZGRsZSAqLworCSAgICAgIGV4dGVybiBpbnQgdHRfZXNjYXBlLCBsc2NhcHI7CisJICAgICAgdHRfZXNjYXBlID0gMDsJCS8qIE5vIGVzY2FwZSBjaGFyYWN0ZXIgKi8KKwkgICAgICBmbG93ID0gMDsJCQkvKiBObyBYb24vWG9mZiAod2hhdCBhYm91dCBod2ZjPykgKi8KKyNpZm5kZWYgTk9YRkVSCisJICAgICAgbHNjYXByID0gMDsJCS8qIE5vIGxvY2tpbmcgc2hpZnRzICovCisjZW5kaWYgLyogTk9YRkVSICovCisjaWZkZWYgQ0tfQVBDCisJICAgICAgeworCQkgIGV4dGVybiBpbnQgYXBjc3RhdHVzOwkvKiBObyBBUENzICovCisJCSAgYXBjc3RhdHVzID0gQVBDX09GRjsKKwkgICAgICB9CisjZW5kaWYgLyogQ0tfQVBDICovCisjaWZuZGVmIE5PTE9DQUwKKyNpZmRlZiBDS19BVVRPREwKKyAgICAgICAgICAgICAgc2V0YXV0b2RsKDAsMCk7CQkvKiBObyBhdXRvZG93bmxvYWQgKi8KKyNlbmRpZiAvKiBDS19BVVRPREwgKi8KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisjaWZuZGVmIE5PQ1NFVFMKKwkgICAgICB7CisJCSAgZXh0ZXJuIGludCB0Y3NyLCB0Y3NsOyAvKiBObyBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uICovCisJCSAgdGNzciA9IDA7CisJCSAgdGNzbCA9IHRjc3I7CQkvKiBNYWtlIHRoZXNlIGVxdWFsICovCisJICAgICAgfQorI2VuZGlmIC8qIE5PQ1NFVFMgKi8KKyNpZmRlZiBUTkNPREUKKwkgICAgICBURUxPUFRfREVGX0NfVV9NT0RFKFRFTE9QVF9LRVJNSVQpID0gVE5fTkdfUkY7CisJICAgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0tFUk1JVCkgPSBUTl9OR19SRjsKKwkgICAgICBURUxPUFRfREVGX1NfVV9NT0RFKFRFTE9QVF9LRVJNSVQpID0gVE5fTkdfUkY7CisJICAgICAgVEVMT1BUX0RFRl9TX01FX01PREUoVEVMT1BUX0tFUk1JVCkgPSBUTl9OR19SRjsKKyNlbmRpZiAvKiBUTkNPREUgKi8KKwkgIH0KKy8qIEZhbGwgdGhydS4uLiAqLworCisJICBjYXNlICc4JzoJCQkvKiA4LWJpdCBjbGVhbiAqLworCSAgICBwYXJpdHkgPSAwOworCSAgICBjbWRtc2sgPSAweGZmOworCSAgICBjbWFzayA9IDB4ZmY7CisJICAgIGJyZWFrOworCisJICBjYXNlICdWJzogeworCSAgICAgIGV4dGVybiBpbnQgeGZlcm1vZGU7CisjaWZkZWYgUEFUVEVSTlMKKwkgICAgICBleHRlcm4gaW50IHBhdHRlcm5zOworCSAgICAgIHBhdHRlcm5zID0gMDsJCS8qIE5vIHBhdHRlcm5zICovCisjZW5kaWYgLyogUEFUVEVSTlMgKi8KKwkgICAgICB4ZmVybW9kZSA9IFhNT0RFX007CS8qIE1hbnVhbCB0cmFuc2ZlciBtb2RlICovCisJICAgICAgZmlsZXBlZWsgPSAwOworCSAgICAgIGJyZWFrOworCSAgfQorCisJICBjYXNlICdwJzoJCQkvKiBTRVQgUEFSSVRZICovCisJICAgIGlmICgqKHhwKzEpKSB7CisJCVhGQVRBTCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyIpOworCSAgICB9CisJICAgIHhhcmd2KyssIHhhcmdjLS07CisJICAgIGlmICgoeGFyZ2MgPCAxKSB8fCAoKip4YXJndiA9PSAnLScpKSB7CisJCVhGQVRBTCgibWlzc2luZyBwYXJpdHkiKTsKKwkgICAgfQorCSAgICBzd2l0Y2goeCA9ICoqeGFyZ3YpIHsKKwkgICAgICBjYXNlICdlJzoKKwkgICAgICBjYXNlICdvJzoKKwkgICAgICBjYXNlICdtJzoKKwkgICAgICBjYXNlICdzJzogcGFyaXR5ID0geDsgYnJlYWs7CisJICAgICAgY2FzZSAnbic6IHBhcml0eSA9IDA7IGJyZWFrOworCSAgICAgIGRlZmF1bHQ6ICB7IFhGQVRBTCgiaW52YWxpZCBwYXJpdHkiKTsgfQorCSAgICB9CisJICAgIGJyZWFrOworCisJICBjYXNlICd0JzoJCQkvKiBMaW5lIHR1cm5hcm91bmQgaGFuZHNoYWtlICovCisJICAgIHR1cm4gPSAxOworCSAgICB0dXJuY2ggPSBYT047CQkvKiBYT04gaXMgdHVybmFyb3VuZCBjaGFyYWN0ZXIgKi8KKwkgICAgZHVwbGV4ID0gMTsJCQkvKiBIYWxmIGR1cGxleCAqLworCSAgICBmbG93ID0gMDsJCQkvKiBObyBmbG93IGNvbnRyb2wgKi8KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJ0InOgorCSAgICBiZ3NldCA9IDE7CQkJLyogRm9yY2UgYmFja2dyb3VuZCAoYmF0Y2gpICovCisJICAgIGJhY2tncmQgPSAxOworCSAgICBicmVhazsKKworCSAgY2FzZSAneic6CQkJLyogRm9yY2UgZm9yZWdyb3VuZCAqLworCSAgICBiZ3NldCA9IDA7CisJICAgIGJhY2tncmQgPSAwOworCSAgICBicmVhazsKKworI2lmbmRlZiBOT1hGRVIKKyNpZmRlZiBSRUNVUlNJVkUKKwkgIGNhc2UgJ0wnOgorCSAgICByZWN1cnNpdmUgPSAyOworCSAgICBub2xpbmtzID0gMjsKKwkgICAgZm5zcGF0aCA9IFBBVEhfUkVMOworCSAgICBicmVhazsKKyNlbmRpZiAvKiBSRUNVUlNJVkUgKi8KKyNlbmRpZiAvKiBOT1hGRVIgKi8KKworI2lmbmRlZiBOT1NQTAorCSAgY2FzZSAnTSc6CQkJLyogTXkgVXNlciBOYW1lICovCisJICAgIGlmICgqKHhwKzEpKSB7CisJCVhGQVRBTCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyIpOworCSAgICB9CisJICAgIHhhcmd2KyssIHhhcmdjLS07CisJICAgIGlmICgoeGFyZ2MgPCAxKSB8fCAoKip4YXJndiA9PSAnLScpKSB7CisJCVhGQVRBTCgibWlzc2luZyB1c2VybmFtZSIpOworCSAgICB9CisJICAgIGlmICgoaW50KXN0cmxlbigqeGFyZ3YpID4gNjMpIHsKKwkJWEZBVEFMKCJ1c2VybmFtZSB0b28gbG9uZyIpOworCSAgICB9CisjaWZkZWYgSUtTRAorCSAgICBpZiAoIWluc2VydmVyKQorI2VuZGlmIC8qIElLU0QgKi8KKwkgICAgICB7CisJCSAgY2tzdHJuY3B5KHVpZGJ1ZiwqeGFyZ3YsVUlEQlVGTEVOKTsKKwkJICBoYXZlZnRwdWlkID0gMTsKKwkgICAgICB9CisJICAgIGJyZWFrOworI2VuZGlmIC8qIE5PU1BMICovCisKKyNpZmRlZiBDS19ORVRCSU9TCisJICBjYXNlICdOJzoJCQkvKiBOZXRCaW9zIEFkYXB0ZXIgTnVtYmVyIGZvbGxvd3MgKi8KKwkgICAgaWYgKCooeHArMSkpIHsKKwkJWEZBVEFMKCJpbnZhbGlkIGFyZ3VtZW50IGJ1bmRsaW5nIGFmdGVyIC1OIik7CisJICAgIH0KKwkgICAgeGFyZ3YrKywgeGFyZ2MtLTsKKwkgICAgaWYgKCh4YXJnYyA8IDEpIHx8ICgqKnhhcmd2ID09ICctJykpIHsKKwkJWEZBVEFMKCJtaXNzaW5nIE5ldEJpb3MgQWRhcHRlciBudW1iZXIiKTsKKwkgICAgfQorCSAgICBpZiAoKHN0cmxlbigqeGFyZ3YpICE9IDEpIHx8CisJCSgqeGFyZ3YpWzBdICE9ICdYJyAmJgorCQkoYXRvaSgqeGFyZ3YpIDwgMCkgJiYKKwkJKGF0b2koKnhhcmd2KSA+IDkpKSB7CisJCVhGQVRBTCgiSW52YWxpZCBOZXRCaW9zIEFkYXB0ZXIgLSBBZGFwdGVycyAwIHRvIDkgYXJlIHZhbGlkIik7CisJICAgIH0KKwkgICAgYnJlYWs7CisjZW5kaWYgLyogQ0tfTkVUQklPUyAqLworCisjaWZkZWYgTkVUQ09OTgorCSAgY2FzZSAnRic6CisJICAgIG5ldHdvcmsgPSAxOworCSAgICBpZiAoKih4cCsxKSkgeworCQlYRkFUQUwoImludmFsaWQgYXJndW1lbnQgYnVuZGxpbmcgYWZ0ZXIgLUYiKTsKKwkgICAgfQorCSAgICB4YXJndisrLCB4YXJnYy0tOworCSAgICBpZiAoKHhhcmdjIDwgMSkgfHwgKCoqeGFyZ3YgPT0gJy0nKSkgeworCQlYRkFUQUwoIm5ldHdvcmsgZmlsZSBkZXNjcmlwdG9yIG1pc3NpbmciKTsKKwkgICAgfQorCSAgICBja3N0cm5jcHkodHRuYW1lLCp4YXJndixUVE5BTUxFTisxKTsKKwkgICAgbmV0dHlwZSA9IE5FVF9UQ1BCOworCSAgICBtZG10eXAgPSAtbmV0dHlwZTsKKwkgICAgdGVsbmV0ZmQgPSAxOworCSAgICBsb2NhbCA9IDE7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIE5FVENPTk4gKi8KKworI2lmZGVmIENPTU1FTlQKKyNpZmRlZiBPUzJQTQorCSAgY2FzZSAnUCc6CQkJLyogT1MvMiBQcmVzZW50YXRpb24gTWFuYWdlciAqLworCSAgICBpZiAoKih4cCsxKSkgeworCQlYRkFUQUwoImludmFsaWQgYXJndW1lbnQgYnVuZGxpbmcgYWZ0ZXIgLVAiKTsKKwkgICAgfQorCSAgICB4YXJndisrLCB4YXJnYy0tOworCSAgICBpZiAoKHhhcmdjIDwgMSkgfHwgKCoqeGFyZ3YgPT0gJy0nKSkgeworCQlYRkFUQUwoInBpcGUgZGF0YSBtaXNzaW5nIik7CisJICAgIH0KKwkgICAgcGlwZWRhdGEgPSAqeGFyZ3Y7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIE9TMlBNICovCisjZWxzZQorCSAgY2FzZSAnUCc6CQkJLyogRmlsZW5hbWVzIGxpdGVyYWwgKi8KKwkgICAgZm5jbnYgID0gWFlGTl9MOworCSAgICBmX3NhdmUgPSBYWUZOX0w7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworI2lmbmRlZiBOT0lDUAorCSAgY2FzZSAnSCc6CisJICAgIG5vaGVyYWxkID0gMTsKKwkgICAgYnJlYWs7CisjZW5kaWYgLyogTk9JQ1AgKi8KKworI2lmZGVmIE9TMgorCSAgY2FzZSAnVyc6CisJICAgIGlmICgqKHhwKzEpKSB7CisJCVhGQVRBTCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyBhZnRlciAtVyIpOworCSAgICB9CisJICAgIHhhcmd2KyssIHhhcmdjLS07CisJICAgIGlmICgoeGFyZ2MgPCAxKSkgeyAvKiBjb3VsZCBiZSBuZWdhdGl2ZSAqLworCQlYRkFUQUwoIldpbmRvdyBoYW5kbGUgbWlzc2luZyIpOworCSAgICB9CisJICAgIHhhcmd2KyssIHhhcmdjLS07CisJICAgIGlmICgoeGFyZ2MgPCAxKSB8fCAoKip4YXJndiA9PSAnLScpKSB7CisJCVhGQVRBTCgiS2VybWl0IEluc3RhbmNlIG1pc3NpbmciKTsKKwkgICAgfQorCSAgICAvKiBBY3Rpb24gZG9uZSBpbiBwcmVzY2FuICovCisJICAgIGJyZWFrOworCisJICBjYXNlICcjJzoJCQkvKiBLOTUgc3RkaW8gdGhyZWFkcyAqLworCSAgICB4YXJndisrLCB4YXJnYy0tOwkJLyogU2tpcCBwYXN0IGFyZ3VtZW50ICovCisJICAgIGJyZWFrOwkJCS8qIEFjdGlvbiBkb25lIGluIHByZXNjYW4gKi8KKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIE5FV0ZUUAorCSAgY2FzZSAnOSc6CQkJLyogRlRQICovCisJICAgIGlmICgqKHhwKzEpKSB7CisJCVhGQVRBTCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyBhZnRlciAtOSIpOworCSAgICB9CisJICAgIHhhcmd2KyssIHhhcmdjLS07CisJICAgIGlmICgoeGFyZ2MgPCAxKSB8fCAoKip4YXJndiA9PSAnLScpKSB7CisJCVhGQVRBTCgiRlRQIHNlcnZlciBhZGRyZXNzIG1pc3NpbmciKTsKKwkgICAgfQorCSAgICBtYWtlc3RyKCZmdHBfaG9zdCwqeGFyZ3YpOworCSAgICBicmVhazsKKyNlbmRpZiAvKiBORVdGVFAgKi8KKworCSAgZGVmYXVsdDoKKwkgICAgZmF0YWwyKCp4YXJndiwKKyNpZmRlZiBOVAorICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGNvbW1hbmQtbGluZSBvcHRpb24sIHR5cGUgXCJrOTUgLWhcIiBmb3IgaGVscCIKKyNlbHNlCisjaWZkZWYgT1MyCisgICAgICAgICAgICAgICAgICAgImludmFsaWQgY29tbWFuZC1saW5lIG9wdGlvbiwgdHlwZSBcImsyIC1oXCIgZm9yIGhlbHAiCisjZWxzZQorICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGNvbW1hbmQtbGluZSBvcHRpb24sIHR5cGUgXCJrZXJtaXQgLWhcIiBmb3IgaGVscCIKKyNlbmRpZiAvKiBPUzIgKi8KKyNlbmRpZiAvKiBOVCAqLworCQkgICApOworICAgICAgICB9CisJaWYgKCF4cCkgYnJlYWs7CisJeCA9ICorK3hwOwkJCS8qIFNlZSBpZiBvcHRpb25zIGFyZSBidW5kbGVkICovCisgICAgfQorICAgIHJldHVybigwKTsKK30KKworI2lmZGVmIFROQ09ERQorLyogIEQgTyBUIE4gQSBSIEcgIC0tICBEbyBhIHRlbG5ldCBjb21tYW5kLWxpbmUgYXJndW1lbnQuICAqLworCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK2RvdG5hcmcoY2hhciB4KQorI2Vsc2UKK2RvdG5hcmcoeCkgY2hhciB4OworI2VuZGlmIC8qIENLX0FOU0lDICovCisvKiBkb3RuYXJnICovIHsKKyAgICBjaGFyICp4cDsKKworICAgIHhwID0gKnhhcmd2KzE7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgZm9yIGJ1bmRsZWQgYXJncyAqLworICAgIGRlYnVnKEYxMTEsImRvdG5hcmcgZW50cnkiLHhwLHhhcmdjKTsKKyAgICB3aGlsZSAoeCkgeworICAgICAgICBkZWJ1ZyhGMDAwLCJkb3RuYXJnIGFyZyIsIiIseCk7CisgICAgICAgIHN3aXRjaCAoeCkgeyAgICAgICAgICAgICAgICAgICAgLyogQmlnIHN3aXRjaCBvbiBhcmcgKi8KKworI2lmbmRlZiBDT01NRU5UCisJICBjYXNlICctJzoJCQkvKiBFeHRlbmRlZCBjb21tYW5kcy4uLiAqLworICAgICAgICAgICAgaWYgKGRveGFyZyh4YXJndiwwKSA8IDApIHsKKyAgICAgICAgICAgICAgICBYRkFUQUwoIkV4dGVuZGVkIG9wdGlvbiBlcnJvciIpOworICAgICAgICAgICAgfSAvKiBGdWxsIHRocnUuLi4gKi8KKwkgIGNhc2UgJysnOgkJCS8qIEV4dGVuZGVkIGNvbW1hbmQgZm9yIHByZXNjYW4oKSAqLworICAgICAgICAgICAgcmV0dXJuKDApOworI2Vsc2UgIC8qIENPTU1FTlQgKi8KKwkgIGNhc2UgJy0nOgorCSAgY2FzZSAnKyc6CisJICAgIFhGQVRBTCgiRXh0ZW5kZWQgb3B0aW9ucyBub3QgY29uZmlndXJlZCIpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworLyoKKyAqIC04ICAgICAgICAgICAgICAgIE5lZ290aWF0ZSBUZWxuZXQgQmluYXJ5IGluIGJvdGggZGlyZWN0aW9ucworICogLWEgICAgICAgICAgICAgICAgUmVxdWlyZSB1c2Ugb2YgVGVsbmV0IGF1dGhlbnRpY2F0aW9uCisgKiAtYyAgICAgICAgICAgICAgICBEbyBub3QgcmVhZCB0aGUgLnRlbG5ldHJjIGZpbGUKKyAqIC1kICAgICAgICAgICAgICAgIFR1cm4gb24gZGVidWcgbW9kZQorICogLUUgICAgICAgICAgICAgICAgTm8gZXNjYXBlIGNoYXJhY3RlcgorICogLUsgICAgICAgICAgICAgICAgUmVmdXNlIHVzZSBvZiBhdXRoZW50aWNhdGlvbjsgZG8gbm90IHNlbmQgdXNlcm5hbWUKKyAqIC1sIHVzZXIgICAgICAgICAgIFNldCB1c2VybmFtZSBhbmQgcmVxdWVzdCBUZWxuZXQgYXV0aGVudGljYXRpb24KKyAqIC1MICAgICAgICAgICAgICAgIE5lZ290aWF0ZSBUZWxuZXQgQmluYXJ5IE91dHB1dCBvbmx5CisgKiAtUyB0b3MgICAgICAgICAgICBVc2UgdGhlIElQIHR5cGUtb2Ytc2VydmljZSB0b3MKKyAqIC14ICAgICAgICAgICAgICAgIFJlcXVpcmUgRW5jcnlwdGlvbgorICogLUQgICAgICAgICAgICAgICAgRGlzYWJsZSBmb3J3YXJkLVgKKyAqIC1UIGNlcnQ9ZmlsZSAgICAgIFVzZSBjZXJ0aWZpY2F0ZSBpbiBmaWxlCisgKiAtVCBrZXk9ZmlsZSAgICAgICBVc2UgcHJpdmF0ZSBrZXkgaW4gZmlsZQorICogLVQgY3JsZmlsZT1maWxlICAgVXNlIENSTCBpbiBmaWxlCisgKiAtVCBjcmxkaXI9ZGlyICAgICBVc2UgQ1JMcyBpbiBkaXJlY3RvcnkKKyAqIC1UIGNpcGhlcj1zdHJpbmcgIFVzZSBvbmx5IGNpcGhlcnMgaW4gc3RyaW5nCisgKiAtWCBhdHlwZSAgICAgICAgICBEaXNhYmxlIHVzZSBvZiBhdHlwZSBhdXRoZW50aWNhdGlvbgorICogLWYgICAgICAgICAgICAgICAgRm9yd2FyZCBjcmVkZW50aWFscyB0byBob3N0CisgKiAtayByZWFsbSAgICAgICAgICBTZXQgZGVmYXVsdCByZWFsbQorICoKKyAqLworCSAgY2FzZSAnaCc6CQkJLyogaGVscCAqLworCSAgICB1c2FnZSgpOworCSAgICBkb2V4aXQoR09PRF9FWElULC0xKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJzgnOgkJCS8qIFRlbG5ldCBCaW5hcnkgaW4gYm90aCBkaXJlY3Rpb25zICovCisJICAgIFRFTE9QVF9ERUZfQ19VX01PREUoVEVMT1BUX0JJTkFSWSkgPSBUTl9OR19NVTsKKwkgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0JJTkFSWSkgPSBUTl9OR19NVTsKKwkgICAgcGFyaXR5ID0gMDsKKwkgICAgY21kbXNrID0gMHhmZjsKKwkgICAgY21hc2sgPSAweGZmOworCSAgICBicmVhazsKKworCSAgY2FzZSAnYSc6CQkJLyogUmVxdWlyZSBUZWxuZXQgQXV0aCAqLworCSAgICBURUxPUFRfREVGX0NfTUVfTU9ERShURUxPUFRfQVVUSEVOVElDQVRJT04pID0gVE5fTkdfTVU7CisJICAgIGJyZWFrOworCisJICBjYXNlICdkJzoKKyNpZmRlZiBERUJVRworCSAgICBpZiAoZGVibG9nKSB7CisJCWRlYnRpbSA9IDE7CisJICAgIH0gZWxzZSB7CisJCWRlYmxvZyA9IGRlYm9wbigiZGVidWcubG9nIiwwKTsKKwkgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisJICAgIGJyZWFrOworCisJICBjYXNlICdFJzogewkJCS8qIE5vIEVzY2FwZSBjaGFyYWN0ZXIgKi8KKwkgICAgICBleHRlcm4gaW50IHR0X2VzY2FwZTsKKwkgICAgICB0dF9lc2NhcGUgPSAwOworCSAgfQorCSAgICBicmVhazsKKworCSAgY2FzZSAnSyc6CisJICAgIFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9BVVRIRU5USUNBVElPTikgPSBUTl9OR19SRjsKKwkgICAgdWlkYnVmWzBdID0gTlVMOworCSAgICBicmVhazsKKworCSAgY2FzZSAnbCc6IC8qIFNldCB1c2VybmFtZSBhbmQgcmVxdWVzdCB0ZWxuZXQgYXV0aGVudGljYXRpb24gKi8KKwkgICAgaWYgKCooeHArMSkpIHsKKwkJWEZBVEFMKCJpbnZhbGlkIGFyZ3VtZW50IGJ1bmRsaW5nIik7CisJICAgIH0KKwkgICAgeGFyZ3YrKywgeGFyZ2MtLTsKKwkgICAgaWYgKCh4YXJnYyA8IDEpIHx8ICgqKnhhcmd2ID09ICctJykpIHsKKwkJWEZBVEFMKCJtaXNzaW5nIHVzZXJuYW1lIik7CisJICAgIH0KKwkgICAgaWYgKChpbnQpc3RybGVuKCp4YXJndikgPiA2MykgeworCQlYRkFUQUwoInVzZXJuYW1lIHRvbyBsb25nIik7CisJICAgIH0KKwkgICAgY2tzdHJuY3B5KHVpZGJ1ZiwqeGFyZ3YsVUlEQlVGTEVOKTsKKwkgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0FVVEhFTlRJQ0FUSU9OKSA9IFROX05HX01VOworCSAgICBicmVhazsKKworCSAgY2FzZSAnTCc6CQkJLyogUmVxdWlyZSBCSU5BUlkgbW9kZSBvdXRib3VuZCBvbmx5ICovCisJICAgIFRFTE9QVF9ERUZfQ19NRV9NT0RFKFRFTE9QVF9CSU5BUlkpID0gVE5fTkdfTVU7CisJICAgIGJyZWFrOworCisJICBjYXNlICd4JzoJCQkvKiBSZXF1aXJlIEVuY3J5cHRpb24gKi8KKwkgICAgVEVMT1BUX0RFRl9DX1VfTU9ERShURUxPUFRfRU5DUllQVElPTikgPSBUTl9OR19NVTsKKwkgICAgVEVMT1BUX0RFRl9DX01FX01PREUoVEVMT1BUX0VOQ1JZUFRJT04pID0gVE5fTkdfTVU7CisJICAgIGJyZWFrOworCisJICBjYXNlICdEJzoJCQkvKiBEaXNhYmxlIHVzZSBvZiBGb3J3YXJkIFggKi8KKwkgICAgVEVMT1BUX0RFRl9DX1VfTU9ERShURUxPUFRfRk9SV0FSRF9YKSA9IFROX05HX1JGOworCSAgICBicmVhazsKKworCSAgY2FzZSAnZic6CQkJLyogRm9yd2FyZCBjcmVkZW50aWFscyB0byBob3N0ICovCisJICAgIHsKKyNpZmRlZiBDS19BVVRIRU5USUNBVElPTgorCQlleHRlcm4gaW50IGZvcndhcmRfZmxhZzsKKwkJZm9yd2FyZF9mbGFnID0gMTsKKyNlbmRpZgorCQlicmVhazsKKwkgICAgfQorCisJICBjYXNlICdrJzogeworI2lmZGVmIENLX0tFUkJFUk9TCisJICAgICAgZXh0ZXJuIGNoYXIgKiBrcmI1X2RfcmVhbG0sICoga3JiNF9kX3JlYWxtOworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisJICAgICAgaWYgKCooeHArMSkpIHsKKwkJICBYRkFUQUwoImludmFsaWQgYXJndW1lbnQgYnVuZGxpbmciKTsKKwkgICAgICB9CisJICAgICAgeGFyZ3YrKywgeGFyZ2MtLTsKKwkgICAgICBpZiAoKHhhcmdjIDwgMSkgfHwgKCoqeGFyZ3YgPT0gJy0nKSkgeworCQkgIFhGQVRBTCgibWlzc2luZyByZWFsbSIpOworCSAgICAgIH0KKyNpZmRlZiBDS19LRVJCRVJPUworCSAgICAgIGlmICgoaW50KXN0cmxlbigqeGFyZ3YpID4gNjMpIHsKKwkJICBYRkFUQUwoInJlYWxtIHRvbyBsb25nIik7CisJICAgICAgfQorCSAgICAgIG1ha2VzdHIoJmtyYjVfZF9yZWFsbSwqeGFyZ3YpOworCSAgICAgIG1ha2VzdHIoJmtyYjRfZF9yZWFsbSwqeGFyZ3YpOworI2VuZGlmIC8qIENLX0tFUkJFUk9TICovCisJICAgICAgYnJlYWs7CisJICB9CisKKwkgIGNhc2UgJ1QnOiB7CisJICAgICAgaWYgKCooeHArMSkpIHsKKwkJICBYRkFUQUwoImludmFsaWQgYXJndW1lbnQgYnVuZGxpbmciKTsKKwkgICAgICB9CisJICAgICAgeGFyZ3YrKywgeGFyZ2MtLTsKKwkgICAgICBpZiAoKHhhcmdjIDwgMSkgfHwgKCoqeGFyZ3YgPT0gJy0nKSkgeworCQkgIFhGQVRBTCgibWlzc2luZyBjZXJ0PSwga2V5PSwgY3JsZmlsZT0sIGNybGRpcj0sIG9yIGNpcGhlcj0iKTsKKwkgICAgICB9CisjaWZkZWYgQ0tfU1NMCisJICAgICAgaWYgKCFzdHJuY21wKCp4YXJndiwiY2VydD0iLDUpKSB7CisJCSAgZXh0ZXJuIGNoYXIgKiBzc2xfcnNhX2NlcnRfZmlsZTsKKwkJICBtYWtlc3RyKCZzc2xfcnNhX2NlcnRfZmlsZSwmKCp4YXJndls1XSkpOworCSAgICAgIH0gZWxzZSBpZiAoICFzdHJuY21wKCp4YXJndiwia2V5PSIsNCkgKSB7CisJCSAgZXh0ZXJuIGNoYXIgKiBzc2xfcnNhX2tleV9maWxlOworCQkgIG1ha2VzdHIoJnNzbF9yc2Ffa2V5X2ZpbGUsJigqeGFyZ3ZbNF0pKTsKKwkgICAgICB9IGVsc2UgaWYgKCAhc3RybmNtcCgqeGFyZ3YsImNybGZpbGU9Iiw4KSApIHsKKwkJICBleHRlcm4gY2hhciAqIHNzbF9jcmxfZmlsZTsKKwkJICBtYWtlc3RyKCZzc2xfY3JsX2ZpbGUsJigqeGFyZ3ZbOF0pKTsKKwkgICAgICB9IGVsc2UgaWYgKCAhc3RybmNtcCgqeGFyZ3YsImNybGRpcj0iLDcpICkgeworCQkgIGV4dGVybiBjaGFyICogc3NsX2NybF9kaXI7CisJCSAgbWFrZXN0cigmc3NsX2NybF9kaXIsJigqeGFyZ3ZbN10pKTsKKwkgICAgICB9IGVsc2UgaWYgKCAhc3RybmNtcCgqeGFyZ3YsImNpcGhlcj0iLDcpICkgeworCQkgIGV4dGVybiBjaGFyICogc3NsX2NpcGhlcl9saXN0OworCQkgIG1ha2VzdHIoJnNzbF9jaXBoZXJfbGlzdCwmKCp4YXJndls3XSkpOworCSAgICAgIH0gZWxzZSB7CisJCSAgWEZBVEFMKCJpbnZhbGlkIHBhcmFtZXRlciIpOworCSAgICAgIH0KKyNlbmRpZiAvKiBDS19TU0wgKi8KKwkgICAgICBicmVhazsKKwkgIH0KKworCSAgZGVmYXVsdDoKKwkgICAgZmF0YWwyKCp4YXJndiwKKwkJICAgImludmFsaWQgY29tbWFuZC1saW5lIG9wdGlvbiwgdHlwZSBcInRlbG5ldCAtaFwiIGZvciBoZWxwIgorCQkgICApOworICAgICAgICB9CisKKwlpZiAoIXhwKSBicmVhazsKKwl4ID0gKisreHA7CQkJLyogU2VlIGlmIG9wdGlvbnMgYXJlIGJ1bmRsZWQgKi8KKyAgICB9CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIFROQ09ERSAqLworCisjaWZkZWYgUkxPR0NPREUKKworLyogIEQgTyBSIEwgRyBBIFIgRyAgLS0gIERvIGEgcmxvZ2luIGNvbW1hbmQtbGluZSBhcmd1bWVudC4gICovCisKK3N0YXRpYyBpbnQKKyNpZmRlZiBDS19BTlNJQworZG9ybGdhcmcoY2hhciB4KQorI2Vsc2UKK2RvcmxnYXJnKHgpIGNoYXIgeDsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworLyogZG9ybGdhcmcgKi8geworICAgIGNoYXIgKnhwOworCisgICAgeHAgPSAqeGFyZ3YrMTsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciBmb3IgYnVuZGxlZCBhcmdzICovCisgICAgZGVidWcoRjExMSwiZG9ybGdhcmcgZW50cnkiLHhwLHhhcmdjKTsKKyAgICB3aGlsZSAoeCkgeworICAgICAgICBkZWJ1ZyhGMDAwLCJkb3JsZ2FyZyBhcmciLCIiLHgpOworICAgICAgICBzd2l0Y2ggKHgpIHsgICAgICAgICAgICAgICAgICAgIC8qIEJpZyBzd2l0Y2ggb24gYXJnICovCisKKyNpZm5kZWYgQ09NTUVOVAorCSAgY2FzZSAnLSc6CQkJLyogRXh0ZW5kZWQgY29tbWFuZHMuLi4gKi8KKyAgICAgICAgICAgIGlmIChkb3hhcmcoeGFyZ3YsMCkgPCAwKSB7CisgICAgICAgICAgICBYRkFUQUwoIkV4dGVuZGVkIG9wdGlvbiBlcnJvciIpOworICAgICAgICAgICAgfSAvKiBGdWxsIHRocnUuLi4gKi8KKwkgIGNhc2UgJysnOgkJCS8qIEV4dGVuZGVkIGNvbW1hbmQgZm9yIHByZXNjYW4oKSAqLworICAgICAgICAgICAgcmV0dXJuKDApOworI2Vsc2UgIC8qIENPTU1FTlQgKi8KKwkgIGNhc2UgJy0nOgorCSAgY2FzZSAnKyc6CisJICAgIFhGQVRBTCgiRXh0ZW5kZWQgb3B0aW9ucyBub3QgY29uZmlndXJlZCIpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworLyoKKyAqIC1kICAgICAgICAgICAgICAgIERlYnVnCisgKiAtbCB1c2VyICAgICAgICAgICBTZXQgdXNlcm5hbWUKKyAqCisgKi8KKwkgIGNhc2UgJ2gnOgkJCS8qIGhlbHAgKi8KKwkgICAgdXNhZ2UoKTsKKwkgICAgZG9leGl0KEdPT0RfRVhJVCwtMSk7CisJICAgIGJyZWFrOworCisJICBjYXNlICdkJzoKKyNpZmRlZiBERUJVRworCSAgICBpZiAoZGVibG9nKSB7CisJCWRlYnRpbSA9IDE7CisJICAgIH0gZWxzZSB7CisJCWRlYmxvZyA9IGRlYm9wbigiZGVidWcubG9nIiwwKTsKKwkgICAgfQorI2VuZGlmIC8qIERFQlVHICovCisJICAgIGJyZWFrOworCisJICBjYXNlICdsJzogLyogU2V0IHVzZXJuYW1lIGFuZCByZXF1ZXN0IHRlbG5ldCBhdXRoZW50aWNhdGlvbiAqLworCSAgICBpZiAoKih4cCsxKSkgeworCQlYRkFUQUwoImludmFsaWQgYXJndW1lbnQgYnVuZGxpbmciKTsKKwkgICAgfQorCSAgICB4YXJndisrLCB4YXJnYy0tOworCSAgICBpZiAoKHhhcmdjIDwgMSkgfHwgKCoqeGFyZ3YgPT0gJy0nKSkgeworCQlYRkFUQUwoIm1pc3NpbmcgdXNlcm5hbWUiKTsKKwkgICAgfQorCSAgICBpZiAoKGludClzdHJsZW4oKnhhcmd2KSA+IDYzKSB7CisJCVhGQVRBTCgidXNlcm5hbWUgdG9vIGxvbmciKTsKKwkgICAgfQorCSAgICBja3N0cm5jcHkodWlkYnVmLCp4YXJndixVSURCVUZMRU4pOworCSAgICBicmVhazsKKworCSAgZGVmYXVsdDoKKwkgICAgZmF0YWwyKCp4YXJndiwKKwkJICAgImludmFsaWQgY29tbWFuZC1saW5lIG9wdGlvbiwgdHlwZSBcInJsb2dpbiAtaFwiIGZvciBoZWxwIgorCQkgICApOworICAgICAgICB9CisKKwlpZiAoIXhwKSBicmVhazsKKwl4ID0gKisreHA7CQkJLyogU2VlIGlmIG9wdGlvbnMgYXJlIGJ1bmRsZWQgKi8KKyAgICB9CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmIC8qIFJMT0dDT0RFICovCisKKyNpZmRlZiBTU0hCVUlMVElOCisKKy8qICBEIE8gUyBTIEggQSBSIEcgIC0tICBEbyBhIHNzaCBjb21tYW5kLWxpbmUgYXJndW1lbnQuICAqLworCitzdGF0aWMgaW50CisjaWZkZWYgQ0tfQU5TSUMKK2Rvc3NoYXJnKGNoYXIgeCkKKyNlbHNlCitkb3NzaGFyZyh4KSBjaGFyIHg7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KKy8qIGRvc3NoYXJnICovIHsKKyAgICBjaGFyICp4cDsKKworICAgIHhwID0gKnhhcmd2KzE7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgZm9yIGJ1bmRsZWQgYXJncyAqLworICAgIGRlYnVnKEYxMTEsImRvc3NoYXJnIGVudHJ5Iix4cCx4YXJnYyk7CisgICAgd2hpbGUgKHgpIHsKKyAgICAgICAgZGVidWcoRjAwMCwiZG9zc2hhcmcgYXJnIiwiIix4KTsKKyAgICAgICAgc3dpdGNoICh4KSB7ICAgICAgICAgICAgICAgICAgICAvKiBCaWcgc3dpdGNoIG9uIGFyZyAqLworCisjaWZuZGVmIENPTU1FTlQKKwkgIGNhc2UgJy0nOgkJCS8qIEV4dGVuZGVkIGNvbW1hbmRzLi4uICovCisgICAgICAgICAgICBpZiAoZG94YXJnKHhhcmd2LDApIDwgMCkgeworICAgICAgICAgICAgICAgIFhGQVRBTCgiRXh0ZW5kZWQgb3B0aW9uIGVycm9yIik7CisgICAgICAgICAgICB9IC8qIEZ1bGwgdGhydS4uLiAqLworCSAgY2FzZSAnKyc6CQkJLyogRXh0ZW5kZWQgY29tbWFuZCBmb3IgcHJlc2NhbigpICovCisgICAgICAgICAgICByZXR1cm4oMCk7CisjZWxzZSAgLyogQ09NTUVOVFAgKi8KKwkgIGNhc2UgJy0nOgorCSAgY2FzZSAnKyc6CisJICAgIFhGQVRBTCgiRXh0ZW5kZWQgb3B0aW9ucyBub3QgY29uZmlndXJlZCIpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworLyoKKyAqIC1kICAgICAgICAgICAgICAgIERlYnVnCisgKiAtbCB1c2VyICAgICAgICAgICBTZXQgdXNlcm5hbWUKKyAqCisgKi8KKwkgIGNhc2UgJ2gnOgkJCS8qIGhlbHAgKi8KKwkgICAgdXNhZ2UoKTsKKwkgICAgZG9leGl0KEdPT0RfRVhJVCwtMSk7CisJICAgIGJyZWFrOworCisJICBjYXNlICdkJzoKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICBpZiAoZGVibG9nKSB7CisgICAgICAgICAgICAgICAgICBkZWJ0aW0gPSAxOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgZGVibG9nID0gZGVib3BuKCJkZWJ1Zy5sb2ciLDApOworICAgICAgICAgICAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJ2wnOiAvKiBTZXQgdXNlcm5hbWUgYW5kIHJlcXVlc3QgdGVsbmV0IGF1dGhlbnRpY2F0aW9uICovCisJICAgIGlmICgqKHhwKzEpKSB7CisJCVhGQVRBTCgiaW52YWxpZCBhcmd1bWVudCBidW5kbGluZyIpOworCSAgICB9CisJICAgIHhhcmd2KyssIHhhcmdjLS07CisJICAgIGlmICgoeGFyZ2MgPCAxKSB8fCAoKip4YXJndiA9PSAnLScpKSB7CisJCVhGQVRBTCgibWlzc2luZyB1c2VybmFtZSIpOworCSAgICB9CisJICAgIGlmICgoaW50KXN0cmxlbigqeGFyZ3YpID4gNjMpIHsKKwkJWEZBVEFMKCJ1c2VybmFtZSB0b28gbG9uZyIpOworCSAgICB9CisJICAgIGNrc3RybmNweSh1aWRidWYsKnhhcmd2LFVJREJVRkxFTik7CisJICAgIGJyZWFrOworCisJICBkZWZhdWx0OgorCSAgICBmYXRhbDIoKnhhcmd2LAorCQkgICAiaW52YWxpZCBjb21tYW5kLWxpbmUgb3B0aW9uLCB0eXBlIFwicmxvZ2luIC1oXCIgZm9yIGhlbHAiCisJCSAgICk7CisgICAgICAgIH0KKworCWlmICgheHApIGJyZWFrOworCXggPSAqKyt4cDsJCQkvKiBTZWUgaWYgb3B0aW9ucyBhcmUgYnVuZGxlZCAqLworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisjZW5kaWYgLyogU1NIQlVJTFRJTiAqLworCisjZWxzZSAvKiBObyBjb21tYW5kLWxpbmUgaW50ZXJmYWNlLi4uICovCisKK2V4dGVybiBpbnQgeGFyZ2M7CitpbnQKK2NtZGxpbigpIHsKKyAgICBpZiAoeGFyZ2MgPiAxKSB7CisgICAgICAgIFhGQVRBTCgiU29ycnksIGNvbW1hbmQtbGluZSBvcHRpb25zIGRpc2FibGVkLiIpOworICAgIH0KK30KKyNlbmRpZiAvKiBOT0NNREwgKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja3V2ZXIuaCBiL2NrZXJtaXQtOC4wLjIxMS9ja3V2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDAxMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrdXZlci5oCkBAIC0wLDAgKzEsMTIyOSBAQAorLyogY2t1dmVyLmggLS0gQy1LZXJtaXQgVU5JWCBWZXJzaW9uIGhlcmFsZHMgKi8KKy8qCisgIEF1dGhvcjogRnJhbmsgZGEgQ3J1eiA8ZmRjQGNvbHVtYmlhLmVkdT4sCisgIENvbHVtYmlhIFVuaXZlcnNpdHkgQWNhZGVtaWMgSW5mb3JtYXRpb24gU3lzdGVtcywgTmV3IFlvcmsgQ2l0eS4KKworICBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisgICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorICAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorKi8KKworI2lmbmRlZiBDS1VWRVJfSAorI2RlZmluZSBDS1VWRVJfSAorCisvKiBBcnJhbmdlZCBtb3JlIG9yIGxlc3MgYWxwaGFiZXRpY2FsbHkgYnkgY29tcGlsZXIgc3ltYm9sICovCisvKiBNdXN0IGJlIGluY2x1ZGVkIEFGVEVSIGNrY2RlYi5oLiAqLworCisjaWZkZWYgQkVPUworI2lmZGVmIEJFT1M0NQorI2RlZmluZSBIRVJBTEQgIiBCZU9TIDQuNSIKKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIEJlT1MiCisjZW5kaWYgLyogQkVPUzQ1ICovCisjZWxzZQorI2lmZGVmIEJFQk9YCisjaWZkZWYgQkVfRFJfNworI2RlZmluZSBIRVJBTEQgIiBCZUJveCBEUjciCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBCZUJveCIKKyNlbmRpZiAvKiBCRV9EUl83ICovCisjZW5kaWYgLyogQkVCT1ggKi8KKyNlbmRpZiAvKiBCRU9TICovCisKKyNpZmRlZiBCRUxMVjEwCisjZGVmaW5lIEhFUkFMRCAiIEJlbGwgTGFicyBSZXNlYXJjaCBVTklYIFYxMCIKKyNlbmRpZiAvKiBCRUxMVjEwICovCisKKyNpZmRlZiBBUE9MTE9TUjEwCisjZGVmaW5lIEhFUkFMRCAiIEFwb2xsbyBTUjEwIgorI2VuZGlmIC8qIEFQT0xMT1NSMTAgKi8KKworI2lmZGVmIE1BQworI2RlZmluZSBIRVJBTEQgIiBBcHBsZSBNYWNpbnRvc2giCisjZW5kaWYgLyogTUFDICovCisKKyNpZmRlZiBBOTg2CisjZGVmaW5lIEhFUkFMRCAiIEFsdG9zIDk4NiAvIFhlbml4IDMuMCIKKyNlbmRpZiAvKiBBOTg2ICovCisKKyNpZmRlZiBBUzQwMAorI2RlZmluZSBIRVJBTEQgIiBBUy80MDAiCisjZW5kaWYgLyogQVM0MDAgKi8KKworI2lmZGVmIGFlZ2lzCisjaWZkZWYgQlNENAorI2RlZmluZSBIRVJBTEQgIiBBcG9sbG8gRE9NQUlOL0lYIDQuMiBCU0QiCisjZWxzZQorI2lmZGVmIEFUVFNWCisjZGVmaW5lIEhFUkFMRCAiIEFwb2xsbyBET01BSU4vSVggU3lzdGVtIFYiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBBcG9sbG8gQWVnaXMiCisjZW5kaWYgLyogQlNENCAgKi8KKyNlbmRpZiAvKiBBVFRTViAqLworI2VuZGlmIC8qIGFlZ2lzICovCisKKyNpZm5kZWYgSEVSQUxECisKKyNpZmRlZiBBSVhSUworCisjaWZkZWYgQUlYNTMKKyNkZWZpbmUgSEVSQUxEICIgSUJNIEFJWCA1LjMiCisjZWxzZQorI2lmZGVmIEFJWDUyCisjZGVmaW5lIEhFUkFMRCAiIElCTSBBSVggNS4yIgorI2Vsc2UKKyNpZmRlZiBBSVg1MQorI2RlZmluZSBIRVJBTEQgIiBJQk0gQUlYIDUuMSIKKyNlbHNlCisjaWZkZWYgQUlYNDUKKyNkZWZpbmUgSEVSQUxEICIgSUJNIEFJWCA1LjAiCisjZWxzZQorI2lmZGVmIEFJWDQ1CisjZGVmaW5lIEhFUkFMRCAiIElCTSBBSVggNC41IgorI2Vsc2UKKyNpZmRlZiBBSVg0NAorI2RlZmluZSBIRVJBTEQgIiBJQk0gQUlYIDQuNCIKKyNlbHNlCisjaWZkZWYgQUlYNDMKKyNkZWZpbmUgSEVSQUxEICIgSUJNIEFJWCA0LjMiCisjZWxzZQorI2lmZGVmIEFJWDQyCisjZGVmaW5lIEhFUkFMRCAiIElCTSBBSVggNC4yIgorI2Vsc2UKKyNpZmRlZiBTVlI0CisjaWZkZWYgQUlYNDEKKyNkZWZpbmUgSEVSQUxEICIgSUJNIEFJWCA0LjEiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBJQk0gUlMvNjAwMCBBSVggMy4yIgorI2VuZGlmIC8qIEFJWDQxICovCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBJQk0gUlMvNjAwMCBBSVggMy4wLzMuMSIKKyNlbmRpZiAvKiBTVlI0ICovCisjZW5kaWYgLyogQUlYNDIgKi8KKyNlbmRpZiAvKiBBSVg0MyAqLworI2VuZGlmIC8qIEFJWDQ0ICovCisjZW5kaWYgLyogQUlYNDUgKi8KKyNlbmRpZiAvKiBBSVg1MCAqLworI2VuZGlmIC8qIEFJWDUxICovCisjZW5kaWYgLyogQUlYNTIgKi8KKyNlbmRpZiAvKiBBSVg1MyAqLworI2VuZGlmIC8qIEFJWFJTICovCisKKyNpZmRlZiBQUzJBSVgxMAorI2RlZmluZSBIRVJBTEQgIiBJQk0gUFMvMiBBSVggMS54IgorI2VuZGlmIC8qIFBTMkFJWDEwICovCisKKyNpZmRlZiBBSVhQUzIKKyNkZWZpbmUgSEVSQUxEICIgSUJNIFBTLzIgQUlYIDMueCIKKyNlbmRpZiAvKiBBSVhQUzIgKi8KKworI2lmZGVmIEFJWDM3MAorI2lmbmRlZiBIRVJBTEQKKyNkZWZpbmUgSEVSQUxEICIgSUJNIFN5c3RlbS8zNzAgQUlYLzM3MCIKKyNlbmRpZgorI2VuZGlmIC8qIEFJWDM3MCAqLworCisjaWZkZWYgQUlYRVNBCisjaWZuZGVmIEhFUkFMRAorI2RlZmluZSBIRVJBTEQgIiBJQk0gQUlYL0VTQSB2ZXJzaW9uIDIuMSIKKyNlbmRpZgorI2VuZGlmIC8qIEFJWEVTQSAqLworCisjaWZkZWYgQVRUNjMwMAorI2RlZmluZSBIRVJBTEQgIiBBVCZUIDYzMDAiCisjZW5kaWYgLyogQVRUNjMwMCAqLworCisjaWZkZWYgQVRUNzMwMAorI2lmZGVmIFVOSVgzNTFNCisjZGVmaW5lIEhFUkFMRCAiIEFUJlQgNzMwMCBVTklYIFBDIFVOSVggMy41MW0iCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBBVCZUIDczMDAgVU5JWCBQQyIKKyNlbmRpZiAvKiBVTklYMzUxTSAqLworI2VuZGlmIC8qIEFUVDczMDAgKi8KKworI2lmZGVmIEFVWAorI2RlZmluZSBIRVJBTEQgIiBBcHBsZSBNYWNpbnRvc2ggQVVYIgorI2VuZGlmIC8qIEFVWCAqLworCisjaWZkZWYgQlNENDQKKyNpZmRlZiBNQUNPU1gKKyNpZmRlZiBNQUNPU1gxMDMKKyNkZWZpbmUgSEVSQUxEICIgTWFjIE9TIFggMTAuMyIKKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIE1hYyBPUyBYIgorI2VuZGlmIC8qIE1BQ09TWDEwMyAqLworI2Vsc2UKKyNpZmRlZiBfX09wZW5CU0RfXworI2RlZmluZSBIRVJBTEQgIiBPcGVuQlNEIgorI2Vsc2UKKyNpZmRlZiBfX2JzZGlfXworI2lmZGVmIEJTREk0CisjZGVmaW5lIEhFUkFMRCAiIEJTREkgQlNEL09TIDQuMCIKKyNlbHNlCisjaWZkZWYgQlNESTMKKyNkZWZpbmUgSEVSQUxEICIgQlNESSBCU0QvT1MgMy4wIgorI2Vsc2UKKyNpZmRlZiBCU0RJMgorI2RlZmluZSBIRVJBTEQgIiBCU0RJIEJTRC9PUyAyLjAiCS8qIDEuMSsrIG5hbWUuLi4gKi8KKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIEJTREkgQlNELzM4NiIJCS8qIE9yaWdpbmFsIDEuMCBuYW1lICovCisjZW5kaWYgLyogQlNESTIgKi8KKyNlbmRpZiAvKiBCU0RJMyAqLworI2VuZGlmIC8qIEJTREk0ICovCisjZWxzZSAgLyogX19ic2RpX18gKi8KKyNpZmRlZiBfX05ldEJTRF9fCisjaWZkZWYgTkVUQlNEMTYKKyNkZWZpbmUgSEVSQUxEICIgTmV0QlNEIDEuNiIKKyNlbHNlCisjaWZkZWYgTkVUQlNEMTUKKyNkZWZpbmUgSEVSQUxEICIgTmV0QlNEIDEuNSIKKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIE5ldEJTRCIKKyNlbmRpZiAvKiBORVRCU0QxNSAqLworI2VuZGlmIC8qIE5FVEJTRDE2ICovCisjZWxzZSAgLyogX19OZXRCU0RfXyAqLworI2lmZGVmIF9fRnJlZUJTRF9fCisjaWZkZWYgRlJFRUJTRDUxCisjZGVmaW5lIEhFUkFMRCAiIEZyZWVCU0QgNS4xIgorI2Vsc2UKKyNpZmRlZiBGUkVFQlNENTAKKyNkZWZpbmUgSEVSQUxEICIgRnJlZUJTRCA1LjAiCisjZWxzZQorI2lmZGVmIEZSRUVCU0Q0OQorI2RlZmluZSBIRVJBTEQgIiBGcmVlQlNEIDQuOSIKKyNlbHNlCisjaWZkZWYgRlJFRUJTRDQ4CisjZGVmaW5lIEhFUkFMRCAiIEZyZWVCU0QgNC44IgorI2Vsc2UKKyNpZmRlZiBGUkVFQlNENDcKKyNkZWZpbmUgSEVSQUxEICIgRnJlZUJTRCA0LjciCisjZWxzZQorI2lmZGVmIEZSRUVCU0Q0NgorI2RlZmluZSBIRVJBTEQgIiBGcmVlQlNEIDQuNiIKKyNlbHNlCisjaWZkZWYgRlJFRUJTRDQ1CisjZGVmaW5lIEhFUkFMRCAiIEZyZWVCU0QgNC41IgorI2Vsc2UKKyNpZmRlZiBGUkVFQlNENDQKKyNkZWZpbmUgSEVSQUxEICIgRnJlZUJTRCA0LjQiCisjZWxzZQorI2lmZGVmIEZSRUVCU0Q0MworI2RlZmluZSBIRVJBTEQgIiBGcmVlQlNEIDQuMyIKKyNlbHNlCisjaWZkZWYgRlJFRUJTRDQyCisjZGVmaW5lIEhFUkFMRCAiIEZyZWVCU0QgNC4yIgorI2Vsc2UKKyNpZmRlZiBGUkVFQlNENDEKKyNkZWZpbmUgSEVSQUxEICIgRnJlZUJTRCA0LjEiCisjZWxzZQorI2lmZGVmIEZSRUVCU0Q0CisjZGVmaW5lIEhFUkFMRCAiIEZyZWVCU0QgNC4wIgorI2Vsc2UKKyNpZmRlZiBGUkVFQlNEMworI2RlZmluZSBIRVJBTEQgIiBGcmVlQlNEIDMuMCIKKyNlbHNlCisjaWZkZWYgRlJFRUJTRDIKKyNkZWZpbmUgSEVSQUxEICIgRnJlZUJTRCAyLjAiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBGcmVlQlNEIgorI2VuZGlmIC8qIEZSRUVCU0QyICovCisjZW5kaWYgLyogRlJFRUJTRDMgKi8KKyNlbmRpZiAvKiBGUkVFQlNENCAqLworI2VuZGlmIC8qIEZSRUVCU0Q0MSAqLworI2VuZGlmIC8qIEZSRUVCU0Q0MiAqLworI2VuZGlmIC8qIEZSRUVCU0Q0MyAqLworI2VuZGlmIC8qIEZSRUVCU0Q0NCAqLworI2VuZGlmIC8qIEZSRUVCU0Q0NSAqLworI2VuZGlmIC8qIEZSRUVCU0Q0NiAqLworI2VuZGlmIC8qIEZSRUVCU0Q0NyAqLworI2VuZGlmIC8qIEZSRUVCU0Q0OCAqLworI2VuZGlmIC8qIEZSRUVCU0Q0OSAqLworI2VuZGlmIC8qIEZSRUVCU0Q1MCAqLworI2VuZGlmIC8qIEZSRUVCU0Q1MSAqLworI2Vsc2UKKyNpZmRlZiBfXzM4NkJTRF9fCisjZGVmaW5lIEhFUkFMRCAiIDM4NkJTRCIKKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIDQuNEJTRCIKKyNlbmRpZiAvKiBfXzM4NkJTRF9fICovCisjZW5kaWYgLyogX19GcmVlQlNEX18gKi8KKyNlbmRpZiAvKiBfX05ldEJTRF9fICovCisjZW5kaWYgLyogX19ic2RpX18gKi8KKyNlbmRpZiAvKiBfX09wZW5CU0RfXyAqLworI2VuZGlmIC8qIE1BQ09TWCAqLworI2VuZGlmIC8qIEJTRDQ0ICovCisKKyNpZmRlZiBFTkNPUkUKKyNpZmRlZiBCU0Q0MworI2RlZmluZSBIRVJBTEQgIiBFbmNvcmUgTXVsdGltYXggVU1BWCA0LjMiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBFbmNvcmUgTXVsdGltYXggVU1BWCA0LjIiCisjZW5kaWYKKyNlbmRpZiAvKiBFTkNPUkUgKi8KKworI2lmZGVmIEJTRDI5CisjZGVmaW5lIEhFUkFMRCAiIDIuOSBCU0QiCisjZW5kaWYgLyogQlNEMjkgKi8KKworI2lmZGVmIEJTRDQxCisjZGVmaW5lIEhFUkFMRCAiIDQuMSBCU0QiCisjZW5kaWYgLyogQlNENDEgKi8KKworI2lmZGVmIEM3MAorI2RlZmluZSBIRVJBTEQgIiBCQk4gQy83MCIKKyNlbmRpZiAvKiBjNzAgKi8KKworI2lmZGVmIENJRQorI2RlZmluZSBIRVJBTEQgIiBDSUUgU3lzdGVtcyA2ODAvMjAgUmVndWx1cyIKKyNlbmRpZiAvKiBDSUUgKi8KKworI2lmZGVmIENPSEVSRU5UCisjaWZkZWYgX0kzODYKKyNkZWZpbmUgSEVSQUxEICIgTVdDIENvaGVyZW50IDM4NiA0LngiCisjaWZuZGVmIGkzODYKKyNkZWZpbmUgaTM4NgorI2VuZGlmIC8qIGkzODYgKi8KKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIFBDL0FUIE1XQyBDb2hlcmVudCAyODYgMy54IgorI2lmbmRlZiBpMjg2CisjZGVmaW5lIGkyODYKKyNlbmRpZiAvKiBpMjg2ICovCisjZW5kaWYgLyogX0kzODYgKi8KKyNlbmRpZiAvKiBDT0hFUkVOVCAqLworCisjaWZkZWYgQ09OVkVYOQorI2RlZmluZSBIRVJBTEQgIiBDb252ZXgvT1MiCisjZW5kaWYgLyogQ09OVkVYOSAqLworCisjaWZkZWYgQ09OVkVYMTAKKyNkZWZpbmUgSEVSQUxEICIgQ29udmV4L09TIDEwLjEiCisjZW5kaWYgLyogQ09OVkVYMTAgKi8KKworI2lmZGVmIF9DUkFZCisjaWZkZWYgX0NSQVlDT00KKyNkZWZpbmUgSEVSQUxEICIgQ3JheSBDU09TIgorI2Vsc2UgLyogX0NSQVlDT00gKi8KKyNkZWZpbmUgSEVSQUxEICIgQ3JheSBVTklDT1MiCisjZW5kaWYgLyogX0NSQVlDT00gKi8KKyNlbmRpZiAvKiBfQ1JBWSAqLworCisjaWZkZWYgREdVWAorI2lmZGVmIERHVVg1NDQyMAorI2RlZmluZSBIRVJBTEQgIiBEYXRhIEdlbmVyYWwgREcvVVggUjQuMjAiCisjZWxzZQorI2lmZGVmIERHVVg1NDQxMQorI2RlZmluZSBIRVJBTEQgIiBEYXRhIEdlbmVyYWwgREcvVVggUjQuMTEiCisjZWxzZQorI2lmZGVmIERHVVg1NDQxMAorI2RlZmluZSBIRVJBTEQgIiBEYXRhIEdlbmVyYWwgREcvVVggUjQuMTAiCisjZWxzZQorI2lmZGVmIERHVVg1NDMxMAorI2RlZmluZSBIRVJBTEQgIiBEYXRhIEdlbmVyYWwgREcvVVggNS40UjMuMTAiCisjZWxzZQorI2lmZGVmIERHVVg1NDMKKyNkZWZpbmUgSEVSQUxEICIgRGF0YSBHZW5lcmFsIERHL1VYIDUuNFIzLjAwIgorI2Vsc2UKKyNpZmRlZiBER1VYNTQwCisjZGVmaW5lIEhFUkFMRCAiIERhdGEgR2VuZXJhbCBERy9VWCA1LjQiCisjZWxzZQorI2lmZGVmIERHVVg0MzAKKyNkZWZpbmUgSEVSQUxEICIgRGF0YSBHZW5lcmFsIERHL1VYIDQuMzAiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBEYXRhIEdlbmVyYWwgREcvVVgiCisjZW5kaWYgLyogREdVWDQzMCAqLworI2VuZGlmIC8qIERHVVg1NDAgKi8KKyNlbmRpZiAvKiBER1VYNTQzICovCisjZW5kaWYgLyogREdVWDU0MzEwICovCisjZW5kaWYgLyogREdVWDU0NDEwICovCisjZW5kaWYgLyogREdVWDU0NDExICovCisjZW5kaWYgLyogREdVWDU0NDIwICovCisjZW5kaWYgLyogREdVWCAqLworCisjaWZkZWYgZGF0YWdlbmVyYWwKKyNpZm5kZWYgSEVSQUxECisjZGVmaW5lIEhFUkFMRCAiIERhdGEgR2VuZXJhbCBBT1MvVlMiCisjZW5kaWYgLyogSEVSQUxEICovCisjZW5kaWYgLyogZGF0YWdlbmVyYWwgKi8KKworI2lmZGVmIFNJTklYCisjaWZkZWYgU05JNTQ0CisjZGVmaW5lIEhFUkFMRCAiIFNpZW1lbnMgTml4ZG9yZiBSZWxpYW50IFVOSVggVjUuNDQiCisjZWxzZQorI2lmZGVmIFNOSTU0MworI2RlZmluZSBIRVJBTEQgIiBTaWVtZW5zIE5peGRvcmYgUmVsaWFudCBVTklYIFY1LjQzIgorI2Vsc2UKKyNpZmRlZiBTTkk1NDEKKyNkZWZpbmUgSEVSQUxEICIgU2llbWVucyBOaXhkb3JmIFNJTklYIFY1LjQxIgorI2Vsc2UKKyNkZWZpbmUgSEVSQUxEICIgU2llbWVucyBOaXhkb3JmIFNJTklYIFY1LjQyIgorI2VuZGlmIC8qIFNOSTU0MSAqLworI2VuZGlmIC8qIFNOSTU0MyAqLworI2VuZGlmIC8qIFNOSTU0NCAqLworI2VuZGlmIC8qIFNJTklYICovCisKKyNpZmRlZiBQT1dFUk1BWAorI2RlZmluZSBIRVJBTEQgIiBDb25jdXJyZW50IFBvd2VyTUFYIE9TIgorI2VuZGlmIC8qIFBPV0VSTUFYICovCisKKyNpZmRlZiBERUxMX1NWUjQKKyNkZWZpbmUgSEVSQUxEICIgRGVsbCBTeXN0ZW0gViBSNCIKKyNlbmRpZiAvKiBERUxMX1NWUjQgKi8KKworI2lmZGVmIE5DUk1QUkFTCisjZGVmaW5lIEhFUkFMRCAiIE5DUiBNUC1SQVMiCisjZW5kaWYgLyogTkNSTVBSQVMgKi8KKworI2lmZGVmIFVOSVhXQVJFCisjZGVmaW5lIEhFUkFMRCAiIFVuaXhXYXJlIgorI2Vsc2UKKyNpZmRlZiBPTERfVU5JWFdBUkUKKyNkZWZpbmUgSEVSQUxEICIgVW5peFdhcmUiCisjZW5kaWYgLyogT0xEX1VOSVhXQVJFICovCisjZW5kaWYgLyogVU5JWFdBUkUgKi8KKworI2lmZGVmIElDTF9TVlI0CisjZGVmaW5lIEhFUkFMRCAiIElDTCBTeXN0ZW0gViBSNCBEUlMgTi9YIgorI2VuZGlmIC8qIElDTF9TVlI0ICovCisKKyNpZmRlZiBGVDE4CisjaWZkZWYgRlQyMQorI2RlZmluZSBIRVJBTEQgIiBGb3J0dW5lIEZvcjpQcm8gMi4xIgorI2Vsc2UKKyNkZWZpbmUgSEVSQUxEICIgRm9ydHVuZSBGb3I6UHJvIDEuOCIKKyNlbmRpZiAvKiBGVDIxICovCisjZW5kaWYgLyogRlQxOCAqLworCisjaWZkZWYgR0VNRE9TCisjZGVmaW5lIEhFUkFMRCAiIEF0YXJpIFNUIEdFTSAxLjAiCisjZW5kaWYgLyogR0VNRE9TICovCisKKyNpZmRlZiBYRjY4UjNWNgorI2RlZmluZSBIRVJBTEQgIiBNb3Rvcm9sYSBVTklYIFN5c3RlbSBWLzY4IFIzVjYiCisjZW5kaWYgLyogWEY2OFIzVjYgKi8KKworI2lmZGVmIFhGODhSMzIKKyNkZWZpbmUgSEVSQUxEICIgTW90b3JvbGEgVU5JWCBTeXN0ZW0gVi84OCBSMzIiCisjZW5kaWYgLyogWEY4OFIzMiAqLworCisjaWZkZWYgSTM4NklYCisjaWZkZWYgU1ZSM0pDCisjZGVmaW5lIEhFUkFMRCAiIEludGVyYWN0aXZlIFVOSVggU3lzdGVtIFYvMzg2IFIzLjIiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBJbnRlcmFjdGl2ZSBTeXN0ZW1zIENvcnAgMzg2L2l4IgorI2VuZGlmIC8qIFNWUjNKQyAqLworI2VuZGlmIC8qIEkzODZJWCAqLworCisjaWZkZWYgSVJJWDY1CisjZGVmaW5lIEhFUkFMRCAiIFNpbGljb24gR3JhcGhpY3MgSVJJWCA2LjUiCisjZWxzZQorI2lmZGVmIElSSVg2NAorI2RlZmluZSBIRVJBTEQgIiBTaWxpY29uIEdyYXBoaWNzIElSSVggNi40IgorI2Vsc2UKKyNpZmRlZiBJUklYNjMKKyNkZWZpbmUgSEVSQUxEICIgU2lsaWNvbiBHcmFwaGljcyBJUklYIDYuMyIKKyNlbHNlCisjaWZkZWYgSVJJWDYyCisjZGVmaW5lIEhFUkFMRCAiIFNpbGljb24gR3JhcGhpY3MgSVJJWCA2LjIiCisjZWxzZQorI2lmZGVmIElSSVg2MAorI2RlZmluZSBIRVJBTEQgIiBTaWxpY29uIEdyYXBoaWNzIElSSVggNi4wIgorI2Vsc2UKKyNpZmRlZiBJUklYNTMKKyNkZWZpbmUgSEVSQUxEICIgU2lsaWNvbiBHcmFwaGljcyBJUklYIDUuMyIKKyNlbHNlCisjaWZkZWYgSVJJWDUyCisjZGVmaW5lIEhFUkFMRCAiIFNpbGljb24gR3JhcGhpY3MgSVJJWCA1LjIiCisjZWxzZQorI2lmZGVmIElSSVg1MQorI2RlZmluZSBIRVJBTEQgIiBTaWxpY29uIEdyYXBoaWNzIElSSVggNS4xIgorI2Vsc2UKKyNpZmRlZiBJUklYNDAKKyNkZWZpbmUgSEVSQUxEICIgU2lsaWNvbiBHcmFwaGljcyBJUklYIDQuMCIKKyNlbmRpZiAvKiBJUklYNDAgKi8KKyNlbmRpZiAvKiBJUklYNTEgKi8KKyNlbmRpZiAvKiBJUklYNTIgKi8KKyNlbmRpZiAvKiBJUklYNTMgKi8KKyNlbmRpZiAvKiBJUklYNjAgKi8KKyNlbmRpZiAvKiBJUklYNjIgKi8KKyNlbmRpZiAvKiBJUklYNjMgKi8KKyNlbmRpZiAvKiBJUklYNjQgKi8KKyNlbmRpZiAvKiBJUklYNjUgKi8KKworI2lmZGVmIElTSUlJCisjZGVmaW5lIEhFUkFMRCAiIEludGVyYWN0aXZlIFN5c3RlbXMgQ29ycCBTeXN0ZW0gSUlJIgorI2VuZGlmIC8qIElTSUlJICovCisKKyNpZmRlZiBJWDM3MAorI2RlZmluZSBIRVJBTEQgIiBJQk0gSVgvMzcwIgorI2VuZGlmIC8qIElYMzcwICovCisKKyNpZmRlZiBIUFVYCisjaWZkZWYgSFBVWDUKKyNkZWZpbmUgSEVSQUxEICIgSFAtVVggNS4wMCIKKyNlbHNlCisjaWZkZWYgSFBVWDYKKyNkZWZpbmUgSEVSQUxEICIgSFAtVVggNi4wMCIKKyNlbHNlCisjaWZkZWYgSFBVWDcKKyNkZWZpbmUgSEVSQUxEICIgSFAtVVggNy4wMCIKKyNlbHNlCisjaWZkZWYgSFBVWDgKKyNkZWZpbmUgSEVSQUxEICIgSFAtVVggOC4wMCIKKyNlbHNlCisjaWZkZWYgSFBVWDkKKyNkZWZpbmUgSEVSQUxEICIgSFAtVVggOS4wMCIKKyNlbHNlCisjaWZkZWYgSFBVWDExMDAKKyNkZWZpbmUgSEVSQUxEICIgSFAtVVggMTEuMDAiCisjZWxzZQorI2lmZGVmIEhQVVgxMAorI2lmZGVmIEhQVVgxMDMwCisjZGVmaW5lIEhFUkFMRCAiIEhQLVVYIDEwLjMwIgorI2Vsc2UKKyNpZmRlZiBIUFVYMTAyMAorI2RlZmluZSBIRVJBTEQgIiBIUC1VWCAxMC4yMCIKKyNlbHNlCisjaWZkZWYgSFBVWDEwMTAKKyNkZWZpbmUgSEVSQUxEICIgSFAtVVggMTAuMTAiCisjZWxzZQorI2lmZGVmIEhQVVgxMHh4CisjZGVmaW5lIEhFUkFMRCAiIEhQLVVYIDEwLnh4IgorI2Vsc2UKKyNkZWZpbmUgSEVSQUxEICIgSFAtVVggMTAuMDAiCisjZW5kaWYgLyogSFBVWDEwWFggKi8KKyNlbmRpZiAvKiBIUFVYMTAxMCAqLworI2VuZGlmIC8qIEhQVVgxMDIwICovCisjZW5kaWYgLyogSFBVWDEwMzAgKi8KKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIEhQLVVYIgorI2VuZGlmIC8qIEhQVVgxMCAqLworI2VuZGlmIC8qIEhQVVgxMTAwICovCisjZW5kaWYgLyogSFBVWDkgICovCisjZW5kaWYgLyogSFBVWDggICovCisjZW5kaWYgLyogSFBVWDcgICovCisjZW5kaWYgLyogSFBVWDYgICovCisjZW5kaWYgLyogSFBVWDUgICovCisjZW5kaWYgLyogSFBVWCAgICovCisKKyNpZmRlZiBNSU5JWAorI2lmZGVmIE1JTklYMgorI2RlZmluZSBIRVJBTEQgIiBNaW5peCAyLjAiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBNaW5peCAxLngiCisjZW5kaWYgLyogTUlOSVgyICovCisjZW5kaWYgLyogTUlOSVggKi8KKworI2lmZGVmIE1JUFMKKyNkZWZpbmUgSEVSQUxEICIgTUlQUyBSSVNDL09TIFNWUjMiCisjZW5kaWYgLyogTUlQUyAqLworCisjaWZkZWYgTkVYVAorI2lmZGVmIE9QRU5TVEVQNDIKKyNkZWZpbmUgSEVSQUxEICIgT1BFTlNURVAgNC4yIgorI2Vsc2UKKyNpZmRlZiBORVhUMzMKKyNkZWZpbmUgSEVSQUxEICIgTmVYVFNURVAgMy4zIgorI2Vsc2UKKyNkZWZpbmUgSEVSQUxEICIgTmVYVFNURVAiCisjZW5kaWYgLyogTkVYVDMzICovCisjZW5kaWYgLyogT1BFTlNURVA0MiAqLworI2VuZGlmIC8qIE5FWFQgKi8KKworI2lmZGVmIE9TRgorI2lmZGVmIGkzODYKKyNkZWZpbmUgSEVSQUxEICIgREVDcGMgT1NGLzEiCisjaWZkZWYgX19HTlVDCisjZGVmaW5lIE9TRlBDCisjZW5kaWYgLyogX19HTlVDICovCisjZWxzZSAgLyogTm90IGkzODYgc28gQWxwaGEgKi8KKworI2lmZGVmIFRSVTY0CisKKyNpZmRlZiBPU0Y1MUIKKyNkZWZpbmUgSEVSQUxEICIgQ29tcGFxIFRydTY0IFVOSVggNS4xQiIKKyNlbHNlCisjaWZkZWYgT1NGNTFBCisjZGVmaW5lIEhFUkFMRCAiIENvbXBhcSBUcnU2NCBVTklYIDUuMUEiCisjZWxzZQorI2lmZGVmIE9TRjUwCisjZGVmaW5lIEhFUkFMRCAiIENvbXBhcSBUcnU2NCBVTklYIDUuMEEiCisjZWxzZQorI2lmZGVmIE9TRjQwRworI2RlZmluZSBIRVJBTEQgIiBDb21wYXEgVHJ1NjQgVU5JWCA0LjBHIgorI2Vsc2UKKyNpZmRlZiBPU0Y0MEYKKyNkZWZpbmUgSEVSQUxEICIgQ29tcGFxIFRydTY0IFVOSVggNC4wRiIKKyNlbHNlCisjaWZkZWYgT1NGNDBFCisjZGVmaW5lIEhFUkFMRCAiIENvbXBhcSBUcnU2NCBVTklYIDQuMEUiCisjZW5kaWYgLyogT1NGNDBFICovCisjZW5kaWYgLyogT1NGNDBGICovCisjZW5kaWYgLyogT1NGNDBHICovCisjZW5kaWYgLyogT1NGNTAgKi8KKyNlbmRpZiAvKiBPU0Y1MUEgKi8KKyNlbmRpZiAvKiBPU0Y1MUIgKi8KKworI2Vsc2UgIC8qIE5vdCBUUlU2NCAqLworCisjaWZkZWYgT1NGNDAKKyNkZWZpbmUgSEVSQUxEICIgRGlnaXRhbCBVTklYIDQuMCIKKyNlbHNlCisjaWZkZWYgT1NGMzIKKyNkZWZpbmUgSEVSQUxEICIgRGlnaXRhbCBVTklYIDMuMiIKKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIERFQyBPU0YvMSBBbHBoYSIKKyNlbmRpZiAvKiBPU0Y0MCAqLworI2VuZGlmIC8qIE9TRjMyICovCisKKyNlbmRpZiAvKiBUUlU2NCAqLworI2VuZGlmIC8qIGkzODYgKi8KKyNlbmRpZiAvKiBPU0YgKi8KKworI2lmZGVmIFBDSVgKKyNkZWZpbmUgSEVSQUxEICIgUEMvSVgiCisjZW5kaWYgLyogUENJWCAqLworCisjaWZkZWYgc3hhRTUwCisjZGVmaW5lIEhFUkFMRCAiIFBGVSBTWC9BIFYxMC9MNTAiCisjZW5kaWYgLyogc3hhRTUwICovCisKKyNpZmRlZiBQUk9WWDEKKyNkZWZpbmUgSEVSQUxEICIgREVDIFByb2Zlc3Npb25hbCAzMDAgKFZlbml4IDEuMCkiCisjZW5kaWYgLyogUFJPVlgxICovCisKKyNpZmRlZiBQWVJBTUlECisjaWZkZWYgU1ZSNAorI2RlZmluZSBIRVJBTEQgIiBQeXJhbWlkIERDL09TeCIKKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIFB5cmFtaWQgRHVhbCBQb3J0IE9TeCIKKyNlbmRpZiAvKiBTVlI0ICovCisjZW5kaWYgLyogUFlSQU1JRCAqLworCisjaWZkZWYgUlRBSVgKKyNkZWZpbmUgSEVSQUxEICIgSUJNIFJUIFBDIChBSVggMi4yKSIKKyNlbmRpZiAvKiBSVEFJWCAqLworCisjaWZkZWYgUlRVCisjZGVmaW5lIEhFUkFMRCAiIE1hc3Njb21wL0NvbmN1cnJlbnQgUlRVIgorI2VuZGlmIC8qIFJUVSAqLworCisjaWZkZWYgc29ueV9uZXdzCisjZGVmaW5lIEhFUkFMRCAiIFNPTlkgTkVXUyIKKyNlbmRpZiAvKiBzb255X25ld3MgKi8KKworI2lmZGVmIFNPTEFSSVMyNAorI2RlZmluZSBIRVJBTEQgIiBTb2xhcmlzIDIuNCIKKyNlbHNlCisjaWZkZWYgU09MQVJJUzIzCisjZGVmaW5lIEhFUkFMRCAiIFNvbGFyaXMgMi4zIgorI2Vsc2UKKyNpZmRlZiBTT0xBUklTCisjZGVmaW5lIEhFUkFMRCAiIFNvbGFyaXMgMi54IgorI2VuZGlmIC8qIFNPTEFSSVMgKi8KKyNlbmRpZiAvKiBTT0xBUklTMjMgKi8KKyNlbmRpZiAvKiBTT0xBUklTMjQgKi8KKworI2lmZGVmIFNVTk9TNAorI2lmZGVmIEJTRDQKKyNpZmRlZiBTVU5PUzQxCisjZGVmaW5lIEhFUkFMRCAiIFN1bk9TIDQuMSIKKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIFN1bk9TIDQuMCIKKyNlbmRpZiAvKiBTVU5PUzQxICovCisjZW5kaWYgLyogQlNENCAqLworI2VuZGlmIC8qIFNVTk9TNCAqLworCisjaWZkZWYgU1VONFM1CisjaWZkZWYgSERCVVVDUAorI2RlZmluZSBIRVJBTEQgIiBTdW5PUyA0LjEgKFNWUjMpIgorI2Vsc2UKKyNkZWZpbmUgSEVSQUxEICIgU3VuT1MgNC4wIChTVlIzKSIKKyNlbmRpZiAvKiBIREJVVUNQICovCisjZW5kaWYgLyogU1VONFM1ICovCisKKyNpZmRlZiBTVFJBVFVTCisjZGVmaW5lIEhFUkFMRCAiIFN0cmF0dXMgVk9TIgorI2VuZGlmIC8qIFNUUkFUVVMgKi8KKworI2lmZGVmIFRPV0VSMQorI2RlZmluZSBIRVJBTEQgIiBOQ1IgVG93ZXIgMTYzMiBPUyAxLjAyIgorI2VuZGlmIC8qIFRPV0VSMSAqLworCisjaWZkZWYgVFJTMTYKKyNkZWZpbmUgSEVSQUxEICIgVGFuZHkgMTYvNjAwMCBYZW5peCAzLjAiCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJtYzY4MDAwIgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogVFJTMTYgKi8KKworI2lmZGVmIHUzYjIKKyNpZm5kZWYgSEVSQUxECisjaWZkZWYgU1ZSMworI2RlZmluZSBIRVJBTEQgIiBBVCZUIDNCMiBTeXN0ZW0gViBSMyIKKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIEFUJlQgM0IyIFN5c3RlbSBWIgorI2VuZGlmIC8qIFNWUjMgKi8KKyNlbmRpZiAvKiBIRVJBTEQgKi8KKyNlbmRpZiAvKiB1M2IyICovCisKKyNpZmRlZiB1bHRyaXgKKyNpZmRlZiB2YXgKKyNpZmRlZiBVTFRSSVgzCisjZGVmaW5lIEhFUkFMRCAiIFZBWC9VTFRSSVggMy4wIgorI2Vsc2UKKyNkZWZpbmUgSEVSQUxEICIgVkFYL1VMVFJJWCIKKyNlbmRpZiAvKiBVTFRSSVgzICovCisjZWxzZQorI2lmZGVmIG1pcHMKKyNpZmRlZiBVTFRSSVg0MworI2RlZmluZSBIRVJBTEQgIiBERUNzdGF0aW9uL1VMVFJJWCA0LjMiCisjZWxzZQorI2lmZGVmIFVMVFJJWDQ0CisjZGVmaW5lIEhFUkFMRCAiIERFQ3N0YXRpb24vVUxUUklYIDQuNCIKKyNlbHNlCisjaWZkZWYgVUxUUklYNDUKKyNkZWZpbmUgSEVSQUxEICIgREVDc3RhdGlvbi9VTFRSSVggNC41IgorI2Vsc2UKKyNkZWZpbmUgSEVSQUxEICIgREVDc3RhdGlvbi9VTFRSSVgiCisjZW5kaWYgLyogVUxUUklYNDUgKi8KKyNlbmRpZiAvKiBVTFRSSVg0NCAqLworI2VuZGlmIC8qIFVMVFJJWDQzICovCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBVTFRSSVgiCisjZW5kaWYgLyogbWlwcyAqLworI2VuZGlmIC8qIHZheCAqLworI2VuZGlmIC8qIHVsdHJpeCAqLworCisjaWZkZWYgT1hPUworI2RlZmluZSBIRVJBTEQgIiBPbGl2ZXR0aSBYL09TIgorI2VuZGlmIC8qIE9YT1MgKi8KKworI2lmZGVmIF8zODZCU0QKKyNkZWZpbmUgSEVSQUxEICIgMzg2QlNEIgorI2VuZGlmIC8qIF8zODZCU0QgKi8KKworI2lmZGVmIFBPU0lYCisjaWZkZWYgUFRYCisjaWZkZWYgUFRYNAorI2RlZmluZSBIRVJBTEQgIiBEWU5JWC9wdHggVjQiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBEWU5JWC9wdHgiCisjZW5kaWYgLyogUFRYNCAqLworI2Vsc2UgIC8qIFBUWCAqLworI2lmbmRlZiBPU0YJCS8qIExldCBPU0YgLURQT1NJWCBrZWVwIHByZXZpb3VzbHkgZGVmaW5lZCBIRVJBTEQgKi8KKyNpZmRlZiBIRVJBTEQKKyN1bmRlZiBIRVJBTEQKKyNlbmRpZiAvKiBIRVJBTEQgKi8KKyNlbmRpZiAvKiBPU0YgKi8KKyNpZmRlZiBPVTgKKyNkZWZpbmUgSEVSQUxEICIgT3BlblVOSVggOCIKKyNlbHNlCisjaWZkZWYgVVc3CisjZGVmaW5lIEhFUkFMRCAiIFVuaXh3YXJlIDciCisjZWxzZQorI2lmZGVmIFFOWAorI2lmZGVmIFFOWDE2CisjZGVmaW5lIEhFUkFMRCAiIFFOWCAxNi1iaXQiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBRTlggMzItYml0IgorI2VuZGlmIC8qIFFOWDE2ICovCisjZWxzZQorI2lmZGVmIE5FVVRSSU5PCisjZGVmaW5lIEhFUkFMRCAiIFFOWCBOZXV0cmlubyAyIgorI2Vsc2UgIC8qIE5FVVRSSU5PICovCisjaWZkZWYgUU5YNgorI2RlZmluZSBIRVJBTEQgIiBRTlg2IgorI2Vsc2UgIC8qIFFOWDYgKi8KKyNpZmRlZiBfX2xpbnV4X18KKyNpZmRlZiBaU0w1NTAwCisjZGVmaW5lIEhFUkFMRCAiIFNoYXJwIFphdXJ1cyBTTC01NTAwIgorI2Vsc2UKKyNpZmRlZiBSSDkwCisjZGVmaW5lIEhFUkFMRCAiIFJlZCBIYXQgTGludXggOS4wIgorI2Vsc2UKKyNpZmRlZiBSSDgwCisjZGVmaW5lIEhFUkFMRCAiIFJlZCBIYXQgTGludXggOC4wIgorI2Vsc2UKKyNpZmRlZiBSSDczCisjZGVmaW5lIEhFUkFMRCAiIFJlZCBIYXQgTGludXggNy4zIgorI2Vsc2UKKyNpZmRlZiBSSDcyCisjZGVmaW5lIEhFUkFMRCAiIFJlZCBIYXQgTGludXggNy4yIgorI2Vsc2UKKyNpZmRlZiBSSDcxCisjZGVmaW5lIEhFUkFMRCAiIFJlZCBIYXQgTGludXggNy4xIgorI2Vsc2UKKyNkZWZpbmUgSEVSQUxEICIgTGludXgiCisjZW5kaWYgLyogUkg3MSAqLworI2VuZGlmIC8qIFJINzIgKi8KKyNlbmRpZiAvKiBSSDczICovCisjZW5kaWYgLyogUkg4MCAqLworI2VuZGlmIC8qIFJIOTAgKi8KKyNlbmRpZiAvKiBaU0w1NTAwICovCisjZWxzZSAgLyogX19saW51eF9fICovCisjaWZkZWYgXzM4NkJTRAkJCQkvKiAzODZCU0QgSm9saXggKi8KKyNkZWZpbmUgSEVSQUxEICIgMzg2QlNEIgorI2Vsc2UKKyNpZmRlZiBMWU5YT1MJCQkJLyogTHlueCBPUyAyLjIgKi8KKyNkZWZpbmUgSEVSQUxEICIgTHlueCBPUyIKKyNlbHNlCisjaWZkZWYgUGxhbjkKKyNkZWZpbmUgSEVSQUxEICIgUGxhbiA5IGZyb20gQmVsbCBMYWJzIgorI2Vsc2UKKyNpZmRlZiBTT0xBUklTOQorI2RlZmluZSBIRVJBTEQgIiBTb2xhcmlzIDkiCisjZWxzZQorI2lmZGVmIFNPTEFSSVM4CisjZGVmaW5lIEhFUkFMRCAiIFNvbGFyaXMgOCIKKyNlbHNlCisjaWZkZWYgU09MQVJJUzcKKyNkZWZpbmUgSEVSQUxEICIgU29sYXJpcyA3IgorI2Vsc2UKKyNpZmRlZiBTT0xBUklTMjYKKyNkZWZpbmUgSEVSQUxEICIgU29sYXJpcyAyLjYiCisjZWxzZQorI2lmZGVmIFNPTEFSSVMyNQorI2RlZmluZSBIRVJBTEQgIiBTb2xhcmlzIDIuNSIKKyNlbHNlCisjaWZkZWYgU09MQVJJUzI0CisjZGVmaW5lIEhFUkFMRCAiIFNvbGFyaXMgMi40IgorI2Vsc2UKKyNpZmRlZiBTT0xBUklTCisjZGVmaW5lIEhFUkFMRCAiIFNvbGFyaXMgMi54IgorI2VuZGlmIC8qIFNPTEFSSVMgKi8KKyNlbmRpZiAvKiBTT0xBUklTMjQgKi8KKyNlbmRpZiAvKiBTT0xBUklTMjUgKi8KKyNlbmRpZiAvKiBTT0xBUklTMjYgKi8KKyNlbmRpZiAvKiBTT0xBUklTNyAqLworI2VuZGlmIC8qIFNPTEFSSVM4ICovCisjZW5kaWYgLyogU09MQVJJUzkgKi8KKyNlbmRpZiAvKiBQbGFuOSAqLworI2VuZGlmIC8qIExZTlhPUyAqLworI2VuZGlmIC8qIF8zODZCU0QgKi8KKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKyNlbmRpZiAvKiBRTlg2ICovCisjZW5kaWYgLyogTkVVVFJJTk8gKi8KKyNlbmRpZiAvKiBRTlggKi8KKyNlbmRpZiAvKiBVVzcgKi8KKyNlbmRpZiAvKiBPVTggKi8KKyNlbmRpZiAvKiBQVFggKi8KKyNlbmRpZiAvKiBQT1NJWCAqLworCisjaWZkZWYgVVRTMjQKKyNkZWZpbmUgSEVSQUxEICIgQW1kYWhsIFVUUyAyLjQiCisjZW5kaWYgLyogVVRTMjQgKi8KKworI2lmZGVmIFVUU1YKKyNkZWZpbmUgSEVSQUxEICIgQW1kYWhsIFVUUyBWIgorI2VuZGlmIC8qIFVUU1YgKi8KKworI2lmZGVmIFZYVkUKKyNkZWZpbmUgSEVSQUxEICIgQ0RDIFZYL1ZFIDUuMi4xIFN5c3RlbSBWIgorI2VuZGlmIC8qIFZYVkUgKi8KKworI2lmZGVmIFNDTzIzNAorI2lmZGVmIEhFUkFMRAorI3VuZGVmIEhFUkFMRAorI2VuZGlmIC8qIEhFUkFMRCAqLworI2RlZmluZSBIRVJBTEQgIiBTQ08gWEVOSVggMi4zLjQiCisjZWxzZQorI2lmZGVmIENLX1NDTzMyVjQKKyNpZmRlZiBIRVJBTEQKKyN1bmRlZiBIRVJBTEQKKyNlbmRpZiAvKiBIRVJBTEQgKi8KKyNpZmRlZiBPRFQzMAorI2RlZmluZSBIRVJBTEQgIiBTQ08gT0RUIDMuMCIKKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIFNDTyBVTklYLzM4NiBWNCIKKyNlbmRpZiAvKiBPRFQzMCAqLworI2Vsc2UKKyNpZmRlZiBDS19TQ09WNQorI2lmZGVmIEhFUkFMRAorI3VuZGVmIEhFUkFMRAorI2VuZGlmIC8qIEhFUkFMRCAqLworI2lmZGVmIFNDT19PU1I1MDcKKyNkZWZpbmUgSEVSQUxEICIgU0NPIE9wZW5TZXJ2ZXIgUjUuMC43IgorI2Vsc2UKKyNpZmRlZiBTQ09fT1NSNTA2QQorI2RlZmluZSBIRVJBTEQgIiBTQ08gT3BlblNlcnZlciBSNS4wLjZhIgorI2Vsc2UKKyNpZmRlZiBTQ09fT1NSNTA2CisjZGVmaW5lIEhFUkFMRCAiIFNDTyBPcGVuU2VydmVyIFI1LjAuNiIKKyNlbHNlCisjaWZkZWYgU0NPX09TUjUwNQorI2RlZmluZSBIRVJBTEQgIiBTQ08gT3BlblNlcnZlciBSNS4wLjUiCisjZWxzZQorI2lmZGVmIFNDT19PU1I1MDQKKyNkZWZpbmUgSEVSQUxEICIgU0NPIE9wZW5TZXJ2ZXIgUjUuMC40IgorI2Vsc2UKKyNpZmRlZiBTQ09fT1NSNTAyCisjZGVmaW5lIEhFUkFMRCAiIFNDTyBPcGVuU2VydmVyIFI1LjAuMiIKKyNlbHNlCisjZGVmaW5lIEhFUkFMRCAiIFNDTyBPcGVuU2VydmVyIFI1LjAiCisjZW5kaWYgLyogU0NPX09TUjUwMiAqLworI2VuZGlmIC8qIFNDT19PU1I1MDQgKi8KKyNlbmRpZiAvKiBTQ09fT1NSNTA1ICovCisjZW5kaWYgLyogU0NPX09TUjUwNiAqLworI2VuZGlmIC8qIFNDT19PU1I1MDZBICovCisjZW5kaWYgLyogU0NPX09TUjUwNyAqLworI2Vsc2UKKyNpZmRlZiBYRU5JWAorI2lmZGVmIEhFUkFMRAorI3VuZGVmIEhFUkFMRAorI2VuZGlmIC8qIEhFUkFMRCAqLworI2lmZGVmIE1fVU5JWAorI2RlZmluZSBIRVJBTEQgIiBTQ08gVU5JWC8zODYiCisjZWxzZQorI2lmZGVmIE1fSTM4NgorI2RlZmluZSBIRVJBTEQgIiBYZW5peC8zODYiCisjZWxzZQorI2lmZGVmIE1fSTI4NgorI2RlZmluZSBIRVJBTEQgIiBYZW5peC8yODYiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBYZW5peCIKKyNlbmRpZiAvKiBNX0kyODYgKi8KKyNlbmRpZiAvKiBNX0kzODYgKi8KKyNlbmRpZiAvKiBNX1VOSVggKi8KKyNlbmRpZiAvKiBYRU5JWCAgKi8KKyNlbmRpZiAvKiBDS19TQ09WNSAqLworI2VuZGlmIC8qIENLX1NDT1YzMlY0ICovCisjZW5kaWYgLyogU0NPMjM0ICovCisKKyNpZmRlZiBaSUxPRworI2RlZmluZSBIRVJBTEQgIiBaaWxvZyBTODAwMCBaZXVzIDMuMjErIgorI2VuZGlmIC8qIFpJTE9HICovCisKKyNpZmRlZiBVVEVLCisjZGVmaW5lIEhFUkFMRCAiIFVUZWsiCisjZW5kaWYgLyogVVRFSyAqLworCisvKiBDYXRjaC1hbGxzIGZvciBhbnl0aGluZyBub3QgZGVmaW5lZCBleHBsaWNpdGx5IGFib3ZlICovCisKKyNpZm5kZWYgSEVSQUxECisjaWZkZWYgU1ZSNAorI2lmZGVmIGkzODYKKyNkZWZpbmUgSEVSQUxEICIgQVQmVCBTeXN0ZW0gVi8zODYgUjQiCisjZWxzZQorI2lmZGVmIEFNSVgKKyNkZWZpbmUgSEVSQUxEICIgQ29tbW9kb3JlIEFtaWdhIFN5c3RlbSBWL202OGsgUjQiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiBBVCZUIFN5c3RlbSBWIFI0IgorI2VuZGlmIC8qIEFNSVggKi8KKyNlbmRpZiAvKiBpMzg2ICovCisjZWxzZQorI2lmZGVmIFNWUjMKKyNkZWZpbmUgSEVSQUxEICIgQVQmVCBTeXN0ZW0gViBSMyIKKyNlbHNlCisjaWZkZWYgQVRUU1YKKyNkZWZpbmUgSEVSQUxEICIgQVQmVCBTeXN0ZW0gSUlJIC8gU3lzdGVtIFYiCisjZWxzZQorI2lmZGVmIEJTRDQzCisjaWZkZWYgcGRwMTEKKyNkZWZpbmUgSEVSQUxEICIgMi4xMCBCU0QgUERQLTExIgorI2Vsc2UKKyNpZmRlZiB2YXgKKyNkZWZpbmUgSEVSQUxEICIgNC4zIEJTRCBWQVgiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiA0LjMgQlNEIgorI2VuZGlmIC8qIHZheCAqLworI2VuZGlmIC8qIHBkcDExICovCisjZWxzZQorI2lmZGVmIEJTRDQKKyNpZmRlZiB2YXgKKyNkZWZpbmUgSEVSQUxEICIgNC4yIEJTRCBWQVgiCisjZWxzZQorI2RlZmluZSBIRVJBTEQgIiA0LjIgQlNEIgorI2VuZGlmIC8qIHZheCAqLworI2Vsc2UKKyNpZmRlZiBWNworI2RlZmluZSBIRVJBTEQgIiBVTklYIFZlcnNpb24gNyIKKyNlbmRpZiAvKiBWNyAqLworI2VuZGlmIC8qIEJTRDQgKi8KKyNlbmRpZiAvKiBCU0Q0MyAqLworI2VuZGlmIC8qIEFUVFNWICovCisjZW5kaWYgLyogU1ZSMyAqLworI2VuZGlmIC8qIFNWUjQgKi8KKyNlbmRpZiAvKiBIRVJBTEQgKi8KKyNlbmRpZiAvKiBIRVJBTEQgKi8KKworI2lmZGVmIE9TMgorI2lmZGVmIEhFUkFMRAorI3VuZGVmIEhFUkFMRAorI2VuZGlmIC8qIEhFUkFMRCAqLworI2lmZGVmIE5UCisjZGVmaW5lIEhFUkFMRCAiIDMyLWJpdCBXaW5kb3dzIgorI2Vsc2UgLyogTlQgKi8KKyNkZWZpbmUgSEVSQUxEICIgMzItYml0IE9TLzIiCisjZW5kaWYgLyogTlQgKi8KKyNlbmRpZiAvKiBPUy8yICovCisKKyNpZm5kZWYgSEVSQUxECisjZGVmaW5lIEhFUkFMRCAiIFVua25vd24gVmVyc2lvbiIKKyNlbmRpZiAvKiBIRVJBTEQgKi8KKworLyogSGFyZHdhcmUgdHlwZSAqLworCisjaWZkZWYgdmF4CQkJCS8qIERFQyBWQVggKi8KKyNpZm5kZWYgQ0tDUFUKKyNkZWZpbmUgQ0tDUFUgInZheCIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qICB2YXggKi8KKyNpZmRlZiBwZHAxMQkJCQkvKiBERUMgUERQLTExICovCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJwZHAxMSIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIHBkcDExICovCisKKyNpZmRlZiBfX0FMUEhBCQkJCS8qIERFQyBBbHBoYSAqLworI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAiQWxwaGEiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiBfX0FMUEhBICovCisKKyNpZmRlZiBfX2FscGhhCQkJCS8qIE9TRi8xIHVzZXMgbG93ZXJjYXNlLi4uICovCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJBbHBoYSIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIF9fYWxwaGEgKi8KKworI2lmZGVmIERHVVgJCQkJLyogT3ZlcnJpZGUgTW90b3JvbGEgODhrIGFzc3VtcHRpb24gKi8KKyNpZm5kZWYgQ0tDUFUJCQkJLyogTmV3IEFWaWlPTnMgYXJlIEludGVsIGJhc2VkLi4uICovCisjaWZkZWYgaTU4NgorI2RlZmluZSBDS0NQVSAiaTU4NiIKKyNlbHNlCisjaWZkZWYgaTQ4NgorI2RlZmluZSBDS0NQVSAiaTQ4NiIKKyNlbHNlCisjaWZkZWYgaTM4NgorI2RlZmluZSBDS0NQVSAiaTM4NiIKKyNlbmRpZiAvKiBpMzg2ICovCisjZW5kaWYgLyogaTQ4NiAqLworI2VuZGlmIC8qIGk1ODYgKi8KKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIERHVVggKi8KKworLyogSFAgOTAwMCAqLworCisjaWZkZWYgX19ocDkwMDBzNzAwCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJocDkwMDBzNzAwIgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogX19ocDkwMDBzNzAwICovCisKKyNpZmRlZiBfX2hwOTAwMHM4MDAKKyNpZm5kZWYgQ0tDUFUKKyNkZWZpbmUgQ0tDUFUgImhwOTAwMHM4MDAiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiBfX2hwOTAwMHM4MDAgKi8KKworI2lmZGVmIF9faHA5MDAwczUwMAorI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAiaHA5MDAwczUwMCIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIF9faHA5MDAwczUwMCAqLworCisjaWZkZWYgX19ocDkwMDBzNDAwCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJocDkwMDBzNDAwIgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogX19ocDkwMDBzNDAwICovCisKKyNpZmRlZiBfX2hwOTAwMHMzMDAKKyNpZm5kZWYgQ0tDUFUKKyNkZWZpbmUgQ0tDUFUgImhwOTAwMHMzMDAiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiBfX2hwOTAwMHMzMDAgKi8KKworI2lmZGVmIF9faHA5MDAwczIwMAorI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAiaHA5MDAwczIwMCIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIF9faHA5MDAwczIwMCAqLworCisjaWZkZWYgbTg4MDAwCQkJCS8qIE1vdG9yb2xhIDg4MDAwICovCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJtYzg4MDAwIgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogbTg4MDAwICovCisjaWZkZWYgX191c2luZ19NODhLQkNTCQkJLyogREcgc3ltYm9sIGZvciBNb3Rvcm9sYSA4ODAwMCAqLworI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAibWM4ODAwMCIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIF9fdXNpbmdfTTg4S0JDUyAqLworI2lmZGVmIG04OGsJCQkJLyogTW90b3JvbGEgc3ltYm9sIGZvciA4ODAwMCAqLworI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAibWM4ODAwMCIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIG04OGsgKi8KKyNpZmRlZiBtYzY4MDQwCQkJCS8qIE1vdG9yb2xhIDY4MDQwICovCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJtYzY4MDQwIgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogbWM2ODA0MCAqLworI2lmZGVmIG1jNjgwMzAJCQkJLyogTW90b3JvbGEgNjgwMzAgKi8KKyNpZm5kZWYgQ0tDUFUKKyNkZWZpbmUgQ0tDUFUgIm1jNjgwMzAiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiBtYzY4MDMwICovCisjaWZkZWYgbWM2ODAyMAkJCQkvKiBNb3Rvcm9sYSA2ODAyMCAqLworI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAibWM2ODAyMCIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIG1jNjgwMjAgKi8KKyNpZmRlZiBtYzY4MDEwCQkJCS8qIE1vdG9yb2xhIDY4MDEwICovCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJtYzY4MDEwIgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogbWM2ODAxMCAqLworI2lmZGVmIG1jNjgwMDAJCQkJLyogTW90b3JvbGEgNjgwMDAgKi8KKyNpZm5kZWYgQ0tDUFUKKyNkZWZpbmUgQ0tDUFUgIm1jNjgwMDAiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiBtYzY4MDAwICovCisjaWZkZWYgbWM2OGsJCQkJLyogRGl0dG8gKHVzZWQgYnkgRElBQiBEUzkwKSAqLworI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAibWM2ODAwMCIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIG1jNjhrICovCisjaWZkZWYgbTY4CQkJCS8qIERpdHRvICovCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJtYzY4MDAwIgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogbTY4ICovCisjaWZkZWYgbTY4awkJCQkvKiBEaXR0byAqLworI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAibWM2ODAwMCIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIG02OGsgKi8KKworI2lmZGVmIGlhNjQJCQkJLyogSUE2NCAvIEl0YW5pdW0gKi8KKyNpZm5kZWYgQ0tDUFUKKyNkZWZpbmUgQ0tDUFUgImlhNjQiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiBpNjg2ICovCisKKyNpZmRlZiBpNjg2CQkJCS8qIEludGVsIDgwNjg2ICovCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJpNjg2IgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogaTY4NiAqLworCisjaWZkZWYgaTU4NgkJCQkvKiBJbnRlbCA4MDU4NiAqLworI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAiaTU4NiIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIGk1ODYgKi8KKworI2lmZGVmIGk0ODYJCQkJLyogSW50ZWwgODA0ODYgKi8KKyNpZm5kZWYgQ0tDUFUKKyNkZWZpbmUgQ0tDUFUgImk0ODYiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiBpODA0ODYgKi8KKyNpZmRlZiBpMzg2CQkJCS8qIEludGVsIDgwMzg2ICovCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJpMzg2IgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogaTgwMzg2ICovCisjaWZkZWYgaTI4NgkJCQkvKiBJbnRlbCA4MDI4NiAqLworI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAiaTI4NiIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIGkyODYgKi8KKyNpZmRlZiBpMTg2CQkJCS8qIEludGVsIDgwMTg2ICovCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJpMTg2IgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogaTE4NiAqLworI2lmZGVmIE1fSTU4NgkJCQkvKiBJbnRlbCA4MDU4NiAqLworI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAiaTU4NiIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIE1fSTU4NiAqLworI2lmZGVmIE1fSTQ4NgkJCQkvKiBJbnRlbCA4MDQ4NiAqLworI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAiaTQ4NiIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIE1fSTQ4NiAqLworI2lmZGVmIF9NX0kzODYJCQkJLyogSW50ZWwgODAzODYgKi8KKyNpZm5kZWYgQ0tDUFUKKyNkZWZpbmUgQ0tDUFUgImkzODYiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiBfTV9JMzg2ICovCisjaWZkZWYgTV9JMjg2CQkJCS8qIEludGVsIDgwMjg2ICovCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJpMjg2IgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogTV9JMjg2ICovCisjaWZkZWYgTV9JODYJCQkJLyogSW50ZWwgODB4ODYgKi8KKyNpZm5kZWYgQ0tDUFUKKyNkZWZpbmUgQ0tDUFUgIml4ODYiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiBNX0k4NiAqLworI2lmZGVmIHNwYXJjCQkJCS8qIFNVTiBTUEFSQyAqLworI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAic3BhcmMiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiBzcGFyYyAqLworI2lmZGVmIG1pcHMJCQkJLyogTUlQUyBSSVNDIHByb2Nlc3NvciAqLworI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAibWlwcyIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIG1pcHMgKi8KKyNpZmRlZiBfSUJNUjIJCQkJLyogSUJNIFJTLzYwMDAgKi8KKyNpZm5kZWYgQ0tDUFUJCQkJLyogKHdoYXQgZG8gdGhleSBjYWxsIHRoZSBjaGlwPykgKi8KKyNkZWZpbmUgQ0tDUFUgInJzNjAwMCIKKyNlbmRpZiAvKiBDS0NQVSAqLworI2VuZGlmIC8qIHJzNjAwMCAqLworI2lmZGVmIHUzYjUJCQkJLyogV0UzMjAwMCBNQUMtMzIsIEFUJlQgM0J4ICovCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJ1M2I1IgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogdTNiNSAqLworI2lmZGVmIG4zYgorI2lmbmRlZiBDS0NQVQorI2RlZmluZSBDS0NQVSAibjNiIgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogbjNiICovCisjaWZkZWYgdTNiCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJ1M2IiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiB1M2IgKi8KKyNpZmRlZiBuMTYJCQkJLyogRW5jb3JlIE11bHRpbWF4ICovCisjaWZuZGVmIENLQ1BVCisjZGVmaW5lIENLQ1BVICJuMTYiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiBuMTYgKi8KKyNpZmRlZiB1MzcwCQkJCS8qIElCTSAzNzAgKi8KKyNpZm5kZWYgQ0tDUFUKKyNkZWZpbmUgQ0tDUFUgInUzNzAiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiB1MzcwICovCisjaWZkZWYgTUFDCQkJCS8qIE1hY2ludG9zaCBjYXRjaC1hbGwgKi8KKyNpZm5kZWYgQ0tDUFUKKyNkZWZpbmUgQ0tDUFUgIm1jNjgwMDAiCisjZW5kaWYgLyogQ0tDUFUgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKworI2lmZGVmIFNUUkFUVVMKKyNpZm5kZWYgQ0tDUFUKKyNpZmRlZiBfX0k4NjBfXworI2RlZmluZSBDS0NQVSAiSTg2MCBGYW1pbHkiCisjZWxzZQorI2lmZGVmIF9fTUM2OEtfXworI2RlZmluZSBDS0NQVSAiTUM2ODB4MCBGYW1pbHkiCisjZWxzZQorI2RlZmluZSBDS0NQVSAiU3RyYXR1cyB1bmtub3duIHByb2Nlc3NvciIKKyNlbmRpZiAvKiBfX01DNjhLX18gKi8KKyNlbmRpZiAvKiBfX0k4NjBfXyAqLworI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogU1RSQVRVUyAqLworCisjaWZkZWYgQ09NTUVOVAorI2lmbmRlZiBDS0NQVQkJCQkvKiBBbGwgb3RoZXJzICovCisjZGVmaW5lIENLQ1BVICJ1bmtub3duIgorI2VuZGlmIC8qIENLQ1BVICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworCisjZW5kaWYgLyogQ0tVVkVSX0ggKi8KZGlmZiAtLWdpdCBhL2NrZXJtaXQtOC4wLjIxMS9ja3V4bGEuYyBiL2NrZXJtaXQtOC4wLjIxMS9ja3V4bGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWY3OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC04LjAuMjExL2NrdXhsYS5jCkBAIC0wLDAgKzEsNzQ0NiBAQAorI2luY2x1ZGUgImNrY3N5bS5oIgorCisjaW5jbHVkZSAiY2tjZGViLmgiCQkJLyogSW5jbHVkZXMuLi4gKi8KKyNpbmNsdWRlICJja2NrZXIuaCIKKyNpbmNsdWRlICJja3VjbWQuaCIKKyNpbmNsdWRlICJja2N4bGEuaCIKKworI2lmZGVmIE5PWEZFUgorI2RlZmluZSB6ZHN0dWZmKGEpCisjZW5kaWYgLyogTk9YRkVSICovCisKKyNpZm5kZWYgTk9DU0VUUworY2hhciAqeGxhdiA9ICJDaGFyYWN0ZXIgU2V0IFRyYW5zbGF0aW9uIDguMC4wNDIsIDMgSnVsIDIwMDAiOworCisvKiAgQyBLIFUgWCBMIEEgICovCisKKy8qICBDLUtlcm1pdCB0YWJsZXMgYW5kIGZ1bmN0aW9ucyBzdXBwb3J0aW5nIGNoYXJhY3RlciBzZXQgdHJhbnNsYXRpb24uICAqLworLyoKKyAgQXV0aG9yOiBGcmFuayBkYSBDcnV6IDxmZGNAY29sdW1iaWEuZWR1PiwKKyAgQ29sdW1iaWEgVW5pdmVyc2l0eSBBY2FkZW1pYyBJbmZvcm1hdGlvbiBTeXN0ZW1zLCBOZXcgWW9yayBDaXR5LgorCisgIENvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisqLworCisvKiBDaGFyYWN0ZXIgc2V0IHRyYW5zbGF0aW9uIGRhdGEgYW5kIGZ1bmN0aW9ucyAqLworCitleHRlcm4gaW50IHppbmNudDsJCQkvKiBGaWxlIGkvbyBtYWNyb3MgYW5kIHZhcmlhYmxlcyAqLworZXh0ZXJuIGNoYXIgKnppbnB0cjsKK2V4dGVybiBpbnQgem91dGNudDsKK2V4dGVybiBjaGFyICp6b3V0cHRyOworZXh0ZXJuIGludCBieXRlb3JkZXI7CitleHRlcm4gaW50IHhmcnhsYTsKKworaW50IHRzbGV2ZWwgID0gVFNfTDA7CQkJLyogVHJhbnNmZXIgc3ludGF4IGxldmVsICgwLDEsMikgKi8KK2ludCB0Y2hhcnNldCA9IFRDX1RSQU5TUDsJCS8qIFRyYW5zZmVyIHN5bnRheCBjaGFyYWN0ZXIgc2V0ICovCitpbnQgdGNzX3NhdmUgPSAtMTsJCQkvKiBGb3Igc2F2ZS9yZXN0b3JlIHRlcm0gY2hhcnNldCAqLworaW50IHRjc190cmFuc3AgPSAwOwkJCS8qIFRlcm0gY2hhcnNldCBpcyBUUkFOU1BBUkVOVCBmbGFnICovCisKKyNpZmRlZiBDS09VTkkKK2ludCB0Y3NyICAgICA9IFRYXzg4NTlfMTsJCS8qIFJlbW90ZSB0ZXJtaW5hbCBjaGFyYWN0ZXIgc2V0ICovCisjZWxzZSAvKiBDS09VTkkgKi8KK2ludCB0Y3NyICAgICA9IEZDX1VTQVNDSUk7CisjZW5kaWYgLyogQ0tPVU5JICovCitpbnQgbGFuZ3VhZ2UgPSBMX1VTQVNDSUk7CQkvKiBMYW5ndWFnZSAqLworCisjaWZkZWYgVU5JQ09ERQoraW50IHVjc2JvbSA9IDE7CQkJCS8qIEFkZCBCT00gdG8gbmV3IFVDUyBmaWxlcz8gKi8KK2ludCB1Y3NvcmRlciA9IC0xOwkJCS8qIERlZmF1bHQgYnl0ZSBvcmRlciBmb3IgVUNTIGZpbGVzICovCitpbnQgZmlsZW9yZGVyID0gLTE7CQkJLyogQnl0ZSBvcmRlciBvZiBjdXJyZW50IGZpbGUgKi8KKwkJCQkJLyogMCA9IEJFLCAxID0gTEUgKi8KKyNlbmRpZiAvKiBVTklDT0RFICovCisvKgorICBEZWZhdWx0IGxvY2FsIGZpbGUgYW5kIHRlcm1pbmFsIGNoYXJhY3RlciBzZXQuCisgIE5vcm1hbGx5IEFTQ0lJLCBidXQgZm9yIHNvbWUgc3lzdGVtcyB3ZSBrbm93IG90aGVyd2lzZS4KKyovCitpbnQgZmNzX3NhdmUgPSAtMTsKKyNpZmRlZiBkYXRhZ2VuZXJhbAkJCS8qIERhdGEgR2VuZXJhbCBBT1MvVlMgKi8KK2ludCBmY2hhcnNldCA9IEZDX0RHTUNTOwkJLyogdXNlcyB0aGUgREcgSW50ZXJuYXRpb25hbCBzZXQgKi8KK2ludCBkY3NldDggICA9IEZDX0RHTUNTOworaW50IGRjc2V0NyAgID0gRkNfVVNBU0NJSTsKK2ludCB0Y3NsICAgICA9IEZDX0RHTUNTOworI2Vsc2UKKyNpZmRlZiBORVhUCQkJCS8qIFRoZSBOZVhUIHdvcmtzdGF0aW9uICovCitpbnQgZmNoYXJzZXQgPSBGQ19ORVhUOwkJCS8qIHVzZXMgaXRzIG93biA4LWJpdCBzZXQgKi8KK2ludCBkY3NldDggICA9IEZDX05FWFQ7CitpbnQgZGNzZXQ3ICAgPSBGQ19VU0FTQ0lJOworaW50IHRjc2wgICAgID0gRkNfTkVYVDsKKyNlbHNlCisjaWZkZWYgTUFDCQkJCS8qIFRoZSBNYWNpbnRvc2ggKi8KK2ludCBmY2hhcnNldCA9IEZDX0FQUFFEOwkJLyogdXNlcyBhbiBleHRlbmRlZCB2ZXJzaW9uIG9mICovCitpbnQgZGNzZXQ4ICAgPSBGQ19BUFBRRDsKK2ludCBkY3NldDcgICA9IEZDX1VTQVNDSUk7CitpbnQgdGNzbCAgICAgPSBGQ19BUFBRRDsJCS8qIEFwcGxlIFF1aWNrZHJhdyAqLworI2Vsc2UKKyNpZmRlZiBBVVgKK2ludCBmY2hhcnNldCA9IEZDX0FQUFFEOwkJLyogRGl0dG8gZm9yIEFwcGxlIEEvVVggKi8KK2ludCBkY3NldDggICA9IEZDX0FQUFFEOworaW50IGRjc2V0NyAgID0gRkNfVVNBU0NJSTsKK2ludCB0Y3NsICAgICA9IEZDX0FQUFFEOworI2Vsc2UKKyNpZmRlZiBBTUlHQQkJCQkvKiBUaGUgQ29tbW9kb3JlIEFtaWdhICovCitpbnQgZmNoYXJzZXQgPSBGQ18xTEFUSU47CQkvKiB1c2VzIExhdGluLTEgKi8KK2ludCBkY3NldDggICA9IEZDXzFMQVRJTjsKK2ludCBkY3NldDcgICA9IEZDX1VTQVNDSUk7CitpbnQgdGNzbCAgICAgPSBGQ18xTEFUSU47CisjZWxzZQkJCQkJLyogQWxsIG90aGVycyAqLworI2lmZGVmIENLT1VOSSAJCQkJLyogT1MvMiBVbmljb2RlICovCitpbnQgZmNoYXJzZXQgPSBGQ18xTEFUSU47CitpbnQgZGNzZXQ4ICAgPSBGQ18xTEFUSU47CitpbnQgZGNzZXQ3ICAgPSBGQ19VU0FTQ0lJOworaW50IHRjc2wgICAgID0gVFhfODg1OV8xOworaW50IHBybmNzICAgID0gVFhfQ1A0Mzc7CisjZWxzZQkJCQkJLyogQWxsIG90aGVycyAqLworaW50IGZjaGFyc2V0ID0gRkNfVVNBU0NJSTsJCS8qIHVzZSBBU0NJSSBieSBkZWZhdWx0ICovCitpbnQgZGNzZXQ4ICAgPSBGQ18xTEFUSU47CQkvKiBCdXQgZGVmYXVsdCA4LWJpdCBzZXQgaXMgTGF0aW4tMSAqLworaW50IGRjc2V0NyAgID0gRkNfVVNBU0NJSTsKK2ludCB0Y3NsICAgICA9IEZDX1VTQVNDSUk7CitpbnQgcHJuY3MgICAgPSBGQ19DUDQzNzsKKyNlbmRpZiAvKiBDS09VTkkgKi8KKyNlbmRpZiAvKiBBTUlHQSAqLworI2VuZGlmIC8qIEFVWCAqLworI2VuZGlmIC8qIE1BQyAqLworI2VuZGlmIC8qIE5FWFQgKi8KKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworCitpbnQgc19jc2V0ID0gWE1PREVfQTsJCQkvKiBTRU5EIGNoYXJzZXQgc2VsZWN0aW9uID0gQVVUTyAqLworaW50IHJfY3NldCA9IFhNT0RFX0E7CQkJLyogUkVDViBjaGFyc2V0IHNlbGVjdGlvbiA9IEFVVE8gKi8KK2ludCBhZmNzZXRbTUFYRkNTRVRTKzFdOwkJLyogQ2hhcmFjdGVyLXNldCBhc3NvY2lhdGlvbnMgKi8KK2ludCBheGNzZXRbTUFYVENTRVRTKzFdOworaW50IHhsYXR5cGUgPSBYTEFfTk9ORTsJCQkvKiBUcmFuc2xhdGlvbiB0eXBlICovCisKKyNpZmRlZiBVTklDT0RFCisjaWZkZWYgQ0tfQU5TSUMKK2V4dGVybiBpbnQgKCp4bF91dGNbTUFYVENTRVRTKzFdKShVU0hPUlQpOyAgLyogVW5pY29kZSB0byBUQ1MgKi8KK2V4dGVybiBpbnQgKCp4bF91ZmNbTUFYRkNTRVRTKzFdKShVU0hPUlQpOyAgLyogVW5pY29kZSB0byBGQ1MgKi8KK2V4dGVybiBVU0hPUlQgKCp4bF90Y3VbTUFYVENTRVRTKzFdKShDSEFSKTsgLyogVENTIHRvIFVuaWNvZGUgKi8KK2V4dGVybiBVU0hPUlQgKCp4bF9mY3VbTUFYRkNTRVRTKzFdKShDSEFSKTsgLyogRkNTIHRvIFVuaWNvZGUgKi8KKyNlbHNlCitleHRlcm4gaW50ICgqeGxfdXRjW01BWFRDU0VUUysxXSkoKTsKK2V4dGVybiBpbnQgKCp4bF91ZmNbTUFYRkNTRVRTKzFdKSgpOworZXh0ZXJuIFVTSE9SVCAoKnhsX3RjdVtNQVhUQ1NFVFMrMV0pKCk7CitleHRlcm4gVVNIT1JUICgqeGxfZmN1W01BWEZDU0VUUysxXSkoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworI2VuZGlmIC8qIFVOSUNPREUgKi8KKworLyogQnVyZWF1Y3JhY3kgc2VjdGlvbiAqLworCitfUFJPVE9UWVAoIENIQVIgeG5lbDEsIChDSEFSIGMpICk7CS8qIE5lWFQgdG8gTGF0aW4tMSAqLworX1BST1RPVFlQKCBDSEFSIHhsMTQzLCAoQ0hBUiBjKSApOwkvKiBMYXRpbi0xIHRvIElCTSBDUDQzNyAqLworX1BST1RPVFlQKCBDSEFSIHhsMWFzLCAoQ0hBUiBjKSApOwkvKiBMYXRpbi0xIHRvIFVTIEFTQ0lJICovCitfUFJPVE9UWVAoIENIQVIgemwxYXMsIChDSEFSIGMpICk7CS8qIExhdGluLTEgdG8gVVMgQVNDSUkgKi8KKworI2lmZGVmIENZUklMTElDCitfUFJPVE9UWVAoIENIQVIgeGFzc2ssIChDSEFSIGMpICk7CS8qIEFTQ0lJIHRvIFNob3J0IEtPSSAqLworX1BST1RPVFlQKCBDSEFSIHhza2N5LCAoQ0hBUiBjKSApOwkvKiBTaG9ydCBLT0kgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyNlbmRpZiAvKiBDWVJJTExJQyAqLworCisjaWZkZWYgTEFUSU4yCitfUFJPVE9UWVAoIENIQVIgeG5lbDIsIChDSEFSIGMpICk7CS8qIE5lWFQgdG8gTGF0aW4tMiAqLworX1BST1RPVFlQKCBDSEFSIHhsMjQzLCAoQ0hBUiBjKSApOwkvKiBMYXRpbi0yIHRvIElCTSBDUDQzNyAqLworX1BST1RPVFlQKCBDSEFSIHhsMmFzLCAoQ0hBUiBjKSApOwkvKiBMYXRpbi0yIHRvIFVTIEFTQ0lJICovCitfUFJPVE9UWVAoIENIQVIgemwyYXMsIChDSEFSIGMpICk7CS8qIExhdGluLTIgdG8gVVMgQVNDSUkgKi8KK19QUk9UT1RZUCggQ0hBUiB4bDJyOCwgKENIQVIgYykgKTsJLyogTGF0aW4tMiB0byBIUCAqLworX1BST1RPVFlQKCBDSEFSIHhsMmw5LCAoQ0hBUiBjKSApOwkvKiBMYXRpbi0yIHRvIExhdGluLTkgKi8KK19QUk9UT1RZUCggQ0hBUiB4bDlsMiwgKENIQVIgYykgKTsJLyogTGF0aW4tOSB0byBMYXRpbi0yICovCitfUFJPVE9UWVAoIENIQVIgeGwybXosIChDSEFSIGMpICk7CS8qIExhdGluLTIgdG8gTWF6b3ZpYSAqLworX1BST1RPVFlQKCBDSEFSIHhtemwyLCAoQ0hBUiBjKSApOwkvKiBNYXpvdmlhIHRvIExhdGluLTIgKi8KK19QUk9UT1RZUCggQ0hBUiB4bDFteiwgKENIQVIgYykgKTsJLyogTGF0aW4tMSB0byBNYXpvdmlhICovCitfUFJPVE9UWVAoIENIQVIgeG16bDEsIChDSEFSIGMpICk7CS8qIE1hem92aWEgdG8gTGF0aW4tMSAqLworX1BST1RPVFlQKCBDSEFSIHhtemw5LCAoQ0hBUiBjKSApOwkvKiBMYXRpbi05IHRvIE1hem92aWEgKi8KK19QUk9UT1RZUCggQ0hBUiB4bDlteiwgKENIQVIgYykgKTsJLyogTWF6b3ZpYSB0byBMYXRpbi05ICovCisjZW5kaWYgLyogTEFUSU4yICovCisKKy8qIFRyYW5zZmVyIGNoYXJhY3Rlci1zZXQgaW5mbyAqLworCitzdHJ1Y3QgY3NpbmZvIHRjc2luZm9bXSA9IHsKKy8qICBOYW1lICAgICAgICAgICAgICBzaXplIGNvZGUgICAgICBkZXNpZ25hdG9yIGFscGhhYmV0IGtleXdvcmQgICAgICAgICAgICAqLworICAiVFJBTlNQQVJFTlQiLCAgICAgICAyNTYsVENfVFJBTlNQLCAiIiwgICAgICBBTF9VTkssICAidHJhbnNwYXJlbnQiLCAgLyogMCAqLworICAiQVNDSUkiLCAgICAgICAgICAgICAxMjgsVENfVVNBU0NJSSwiIiwgICAgICBBTF9ST01BTiwiYXNjaWkiLCAgICAgICAgLyogMSAqLworICAiSVNPIDg4NTktMSBMYXRpbi0xIiwyNTYsVENfMUxBVElOLCAiSTYvMTAwIixBTF9ST01BTiwibGF0aW4xLWlzbyIsICAgLyogMiAqLworI2lmZGVmIExBVElOMgorICAiSVNPIDg4NTktMiBMYXRpbi0yIiwyNTYsVENfMkxBVElOLCAiSTYvMTAxIixBTF9ST01BTiwibGF0aW4yLWlzbyIsICAgLyogMyAqLworI2VuZGlmIC8qIExBVElOMiAqLworI2lmZGVmIENZUklMTElDCisgIC8qIDQgKi8KKyAgIklTTyA4ODU5LTUgTGF0aW4vQ3lyaWxsaWMiLDI1NixUQ19DWVJJTEwsIkk2LzE0NCIsQUxfQ1lSSUwsImN5cmlsbGljLWlzbyIsCisjZW5kaWYgLyogQ1lSSUxMSUMgKi8KKyNpZmRlZiBLQU5KSQorICAiSmFwYW5lc2UgRVVDIiwxNjM4NCxUQ19KRVVDLCAgIkkxNC84Ny8xMyIsIEFMX0pBUEFOLCAiZXVjLWpwIiwgICAgICAgLyogNSAqLworI2VuZGlmIC8qIEtBTkpJICovCisjaWZkZWYgSEVCUkVXCisgIC8qIDYgKi8KKyAgIklTTyA4ODU5LTggTGF0aW4vSGVicmV3IiwyNTYsVENfSEVCUkVXLCJJNi8xMzgiLEFMX0hFQlJFVywiaGVicmV3LWlzbyIsCisjZW5kaWYgLyogSEVCUkVXICovCisjaWZkZWYgR1JFRUsKKyAgIklTTyA4ODU5LTcgTGF0aW4vR3JlZWsiLDI1NixUQ19HUkVFSywiSTYvMTI2IixBTF9HUkVFSywiZ3JlZWstaXNvIiwgLyogIDcgKi8KKyNlbmRpZiAvKiBHUkVFSyAqLworICAiSVNPIDg4NTktMTUgTGF0aW4tOSIsMjU2LFRDXzlMQVRJTiwiSTYvMjAzIixBTF9ST01BTiwibGF0aW45LWlzbyIsICAvKiAgOCAqLworICAiSVNPIDEwNjQ2IC8gVW5pY29kZSBVQ1MtMiIsNjQwMDAsVENfVUNTMiwiSTE2MiIsQUxfVU5JViwidWNzMiIsICAgICAvKiAgOSAqLworICAiSVNPIDEwNjQ2IC8gVW5pY29kZSBVVEYtOCIsNjQwMDAsVENfVVRGOCwiSTE5MCIsQUxfVU5JViwidXRmOCIsICAgICAvKiAxMCAqLworICAiIiwwLDAsIiIsMCwiIgorfTsKK2ludCBudGNzZXRzID0gKHNpemVvZih0Y3NpbmZvKSAvIHNpemVvZihzdHJ1Y3QgY3NpbmZvKSkgLSAxOworCitzdHJ1Y3Qga2V5dGFiIHRjc3RhYltdID0gewkJLyogS2V5d29yZCB0YWJsZSBmb3IgKi8KKyAgICAiYXNjaWkiLCAgICAgICAgIFRDX1VTQVNDSUksIDAsCS8qIFNFVCBUUkFOU0ZFUiBDSEFSQUNURVItU0VUICovCisjaWZkZWYgQ1lSSUxMSUMKKyAgICAiY3lyaWxsaWMtaXNvIiwgIFRDX0NZUklMTCwgIDAsCisjZW5kaWYgLyogQ1lSSUxMSUMgKi8KKyNpZmRlZiBHUkVFSworICAgICJlbG90OTI4LWdyZWVrIiwgVENfR1JFRUssICAgQ01fSU5WLAorI2VuZGlmIC8qIEdSRUVLICovCisjaWZkZWYgS0FOSkkKKyAgICAiZXVjLWpwIiwgICAgICAgIFRDX0pFVUMsICAgIDAsCisjZW5kaWYgLyogS0FOSkkgKi8KKyNpZmRlZiBHUkVFSworICAgICJncmVlay1pc28iLCAgICAgVENfR1JFRUssICAgMCwKKyNlbmRpZiAvKiBHUkVFSyAqLworI2lmZGVmIEhFQlJFVworICAgICJoZWJyZXctaXNvIiwgICAgVENfSEVCUkVXLCAgMCwKKyNlbmRpZiAvKiBIRUJSRVcgKi8KKyNpZmRlZiBLQU5KSQorICAgICJqYXBhbmVzZS1ldWMiLCAgVENfSkVVQywgICAgQ01fSU5WLAorI2VuZGlmIC8qIEtBTkpJICovCisgICAgImwiLCAgICAgICAgICAgICBUQ18xTEFUSU4sICBDTV9BQlJ8Q01fSU5WLAorICAgICJsYSIsICAgICAgICAgICAgVENfMUxBVElOLCAgQ01fQUJSfENNX0lOViwKKyAgICAibGF0IiwgICAgICAgICAgIFRDXzFMQVRJTiwgIENNX0FCUnxDTV9JTlYsCisgICAgImxhdGkiLCAgICAgICAgICBUQ18xTEFUSU4sICBDTV9BQlJ8Q01fSU5WLAorICAgICJsYXRpbiIsICAgICAgICAgVENfMUxBVElOLCAgQ01fQUJSfENNX0lOViwKKyAgICAibGF0aW4xLWlzbyIsICAgIFRDXzFMQVRJTiwgIDAsCisjaWZkZWYgTEFUSU4yCisgICAgImxhdGluMi1pc28iLCAgICBUQ18yTEFUSU4sICAwLAorI2VuZGlmIC8qIExBVElOMiAqLworICAgICJsYXRpbjktaXNvIiwgICAgVENfOUxBVElOLCAgMCwKKyAgICAidHJhbnNwYXJlbnQiLCAgIFRDX1RSQU5TUCwgIDAsCisjaWZkZWYgVU5JQ09ERQorICAgICJ1Y3MyIiwgICAgICAgICAgVENfVUNTMiwgICAgMCwKKyAgICAidXRmOCIsICAgICAgICAgIFRDX1VURjgsICAgIDAsCisjZW5kaWYgLyogVU5JQ09ERSAqLworICAgICIiLCAwLCAwCit9OworaW50IG50Y3MgPSAoc2l6ZW9mKHRjc3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsKKworLyogRmlsZSBjaGFyYWN0ZXIgc2V0IGluZm9ybWF0aW9uIHN0cnVjdHVyZSwgaW5kZXhlZCBieSBjaGFyYWN0ZXIgc2V0IGNvZGUsICovCisvKiBhcyBkZWZpbmVkIGluIGNrdXhsYS5oLiAgVGhpcyB0YWJsZSBtdXN0IGJlIGluIG9yZGVyIG9mIGZpbGUgY2hhcmFjdGVyICovCisvKiBzZXQgbnVtYmVyISAqLworCitzdHJ1Y3QgY3NpbmZvIGZjc2luZm9bXSA9IHsgLyogRmlsZSBjaGFyYWN0ZXIgc2V0IGluZm9ybWF0aW9uLi4uICovCisgIC8qIERlc2NyaXB0aXZlIE5hbWUgICAgICAgICAgICAgIFNpemUgIERlc2lnbmF0b3IgKi8KKyAgIlVTIEFTQ0lJIiwgICAgICAgICAgICAgICAgICAgICAxMjgsIEZDX1VTQVNDSUksIE5VTEwsIEFMX1JPTUFOLCAiYXNjaWkiLAorICAiQnJpdGlzaC9VSyBJU08tNjQ2IiwgICAgICAgICAgIDEyOCwgRkNfVUtBU0NJSSwgTlVMTCwgQUxfUk9NQU4sICJicml0aXNoIiwKKyAgIkR1dGNoIElTTy02NDYiLCAgICAgICAgICAgICAgICAxMjgsIEZDX0RVQVNDSUksIE5VTEwsIEFMX1JPTUFOLCAiZHV0Y2giLAorICAiRmlubmlzaCBJU08tNjQ2IiwgICAgICAgICAgICAgIDEyOCwgRkNfRklBU0NJSSwgTlVMTCwgQUxfUk9NQU4sICJmaW5uaXNoIiwKKyAgIkZyZW5jaCBJU08tNjQ2IiwgICAgICAgICAgICAgICAxMjgsIEZDX0ZSQVNDSUksIE5VTEwsIEFMX1JPTUFOLCAiZnJlbmNoIiwKKyAgIkNhbmFkaWFuLUZyZW5jaCBOUkMiLCAxMjgsIEZDX0ZDQVNDSUksIE5VTEwsIEFMX1JPTUFOLCAiY2FuYWRpYW4tZnJlbmNoIiwKKyAgIkdlcm1hbiBJU08tNjQ2IiwgICAgICAgICAgICAgICAxMjgsIEZDX0dFQVNDSUksIE5VTEwsIEFMX1JPTUFOLCAiZ2VybWFuIiwKKyAgIkh1bmdhcmlhbiBJU08tNjQ2IiwgICAgICAgICAgICAxMjgsIEZDX0hVQVNDSUksIE5VTEwsIEFMX1JPTUFOLCAiaHVuZ2FyaWFuIiwKKyAgIkl0YWxpYW4gSVNPLTY0NiIsICAgICAgICAgICAgICAxMjgsIEZDX0lUQVNDSUksIE5VTEwsIEFMX1JPTUFOLCAiaXRhbGlhbiIsCisgICJOb3J3ZWdpYW4vRGFuaXNoIElTTy02NDYiLDEyOCxGQ19OT0FTQ0lJLE5VTEwsQUxfUk9NQU4sIm5vcndlZ2lhbi9kYW5pc2giLAorICAiUG9ydHVndWVzZSBJU08tNjQ2IiwgICAgICAgICAgIDEyOCwgRkNfUE9BU0NJSSwgTlVMTCwgQUxfUk9NQU4sInBvcnR1Z3Vlc2UiLAorICAiU3BhbmlzaCBJU08tNjQ2IiwgICAgICAgICAgICAgIDEyOCwgRkNfU1BBU0NJSSwgTlVMTCwgQUxfUk9NQU4sICJzcGFuaXNoIiwKKyAgIlN3ZWRpc2ggSVNPLTY0NiIsICAgICAgICAgICAgICAxMjgsIEZDX1NXQVNDSUksIE5VTEwsIEFMX1JPTUFOLCAic3dlZGlzaCIsCisgICJTd2lzcyBOUkMiLCAgICAgICAgICAgICAgICAgICAgMTI4LCBGQ19DSEFTQ0lJLCBOVUxMLCBBTF9ST01BTiwgInN3aXNzIiwKKyAgIklTTyA4ODU5LTEgTGF0aW4tMSIsICAgICAgICAgICAyNTYsIEZDXzFMQVRJTiwgIE5VTEwsIEFMX1JPTUFOLCJsYXRpbjEtaXNvIiwKKyAgIklTTyA4ODU5LTIgTGF0aW4tMiIsICAgICAgICAgICAyNTYsIEZDXzJMQVRJTiwgIE5VTEwsIEFMX1JPTUFOLCJsYXRpbjItaXNvIiwKKyAgIkRFQyBNdWx0aW5hdGlvbmFsIiwgMjU2LCAgRkNfREVDTUNTLCBOVUxMLEFMX1JPTUFOLCJkZWMtbXVsdGluYXRpb25hbCIsCisgICJOZVhUIE11bHRpbmF0aW9uYWwiLCAyNTYsIEZDX05FWFQsICAgTlVMTCxBTF9ST01BTiwibmV4dC1tdWx0aW5hdGlvbmFsIiwKKyAgIlBDIENvZGUgUGFnZSA0MzciLCAgICAgICAgICAgIDI1NiwgRkNfQ1A0MzcsICAgTlVMTCwgQUxfUk9NQU4sImNwNDM3IiwKKyAgIlBDIENvZGUgUGFnZSA4NTAiLCAgICAgICAgICAgIDI1NiwgRkNfQ1A4NTAsICAgTlVMTCwgQUxfUk9NQU4sImNwODUwIiwKKyAgIlBDIENvZGUgUGFnZSA4NTIiLCAgICAgICAgICAgIDI1NiwgRkNfQ1A4NTIsICAgTlVMTCwgQUxfUk9NQU4sImNwODUyIiwKKyAgIkFwcGxlIE1hY2ludG9zaCBMYXRpbiIsIDI1NiwgRkNfQVBQUUQsICAgTlVMTCwgQUxfUk9NQU4sIm1hY2ludG9zaC1sYXRpbiIsCisgICJEYXRhIEdlbmVyYWwgSW50ZXJuYXRpb25hbCIsMjU2LEZDX0RHTUNTLE5VTEwsQUxfUk9NQU4sImRnLWludGVybmF0aW9uYWwiLAorICAiSGV3bGV0dCBQYWNrYXJkIFJvbWFuOCIsICAgIDI1NiwgRkNfSFBSOCwgICAgTlVMTCwgQUxfUk9NQU4sICJocC1yb21hbjgiLAorICAiSVNPIDg4NTktNSBMYXRpbi9DeXJpbGxpYyIsIDI1NiwgRkNfQ1lSSUxMLCAgTlVMTCwgQUxfQ1lSSUwsImN5cmlsbGljLWlzbyIsCisgICJDUDg2NiBDeXJpbGxpYyIsCSAgICAgICAyNTYsIEZDX0NQODY2LCAgIE5VTEwsIEFMX0NZUklMLCJjcDg2NiIsCisgICJTaG9ydCBLT0kiLCAgICAgICAgICAgICAgICAgMTI4LCBGQ19LT0k3LCAgICBOVUxMLCBBTF9DWVJJTCwic2hvcnQta29pIiwKKyAgIk9sZCBLT0ktOCBDeXJpbGxpYyIsICAgICAgICAyNTYsIEZDX0tPSTgsICAgIE5VTEwsIEFMX0NZUklMLCJrb2k4LWN5cmlsbGljIiwKKyAgIkphcGFuZXNlIEpJUzciLAkgIDE2Mzg0LCBGQ19KSVM3LCAgICBOVUxMLCBBTF9KQVBBTiwgImppczcta2FuamkiLAorICAiSmFwYW5lc2UgU2hpZnQgSklTIiwJICAxNjM4NCwgRkNfU0hKSVMsICAgTlVMTCwgQUxfSkFQQU4sICJzaGlmdC1qaXMta2FuamkiLAorICAiSmFwYW5lc2UgRVVDIiwJICAxNjM4NCwgRkNfSkVVQywgICAgTlVMTCwgQUxfSkFQQU4sICJldWMtanAiLAorICAiSmFwYW5lc2UgREVDIEthbmppIiwJICAxNjM4NCwgRkNfSkRFQywgICAgTlVMTCwgQUxfSkFQQU4sICJkZWMta2FuamkiLAorICAiSGVicmV3LTcgREVDIiwgICAgICAgICAgIDEyOCwgRkNfSEU3LCAgICAgTlVMTCwgQUxfSEVCUkVXLCAiaGVicmV3LTciLAorICAiSVNPIDg4NTktOCBMYXRpbi9IZWJyZXciLDI1NiwgRkNfSEVCUkVXLCAgTlVMTCwgQUxfSEVCUkVXLCAiaGVicmV3LWlzbyIsCisgICJDUDg2MiBIZWJyZXciLCAgICAgICAgICAgMjU2LCBGQ19DUDg2MiwgICBOVUxMLCBBTF9IRUJSRVcsICJjcDg2Mi1oZWJyZXciLAorICAiRUxPVCA5MjcgR3JlZWsiLCAgICAgICAgIDEyOCwgRkNfRUxPVCwgICAgTlVMTCwgQUxfR1JFRUssICJlbG90OTI3LWdyZWVrIiwKKyAgIklTTyA4ODU5LTcgTGF0aW4vR3JlZWsiLCAyNTYsIEZDX0dSRUVLLCAgIE5VTEwsIEFMX0dSRUVLLCAiZ3JlZWstaXNvIiwKKyAgIkNQODY5IEdyZWVrIiwgICAgICAgICAgICAyNTYsIEZDX0NQODY5LCAgIE5VTEwsIEFMX0dSRUVLLCAiY3A4NjktZ3JlZWsiLAorICAiSVNPIDg4NTktMTUgTGF0aW4tOSIsICAgIDI1NiwgRkNfOUxBVElOLCAgTlVMTCwgQUxfUk9NQU4sICJsYXRpbjktaXNvIiwKKyAgIlBDIENvZGUgUGFnZSA4NTgiLCAgICAgICAyNTYsIEZDX0NQODUwLCAgIE5VTEwsIEFMX1JPTUFOLCAiY3A4NTgiLAorICAiUEMgQ29kZSBQYWdlIDg1NSIsICAgICAgIDI1NiwgRkNfQ1A4NTUsICAgTlVMTCwgQUxfQ1lSSUwsICJjcDg1NS1jeXJpbGxpYyIsCisgICJXaW5kb3dzIENvZGUgUGFnZSAxMjUxIiwgMjU2LCBGQ19DUDEyNTEsICBOVUxMLCBBTF9DWVJJTCwgImNwMTI1MS1jeXJpbGxpYyIsCisgICJCdWxnYXJpYW4gUEMgQ29kZSBQYWdlIiwgMjU2LCBGQ19CVUxHQVIsICBOVUxMLCBBTF9DWVJJTCwgImJ1bGdhcmlhLXBjIiwKKyAgIldpbmRvd3MgQ29kZSBQYWdlIDEyNTAiLCAyNTYsIEZDX0NQMTI1MCwgIE5VTEwsIEFMX1JPTUFOLCAiY3AxMjUwIiwKKyAgIlBvbGlzaCBNYXpvdmlhIFBDIENvZGUgUGFnZSIsIDI1NiwgRkNfTUFaT1ZJQSwgTlVMTCwgQUxfUk9NQU4sICJtYXpvdmlhLXBjIiwKKyAgIklTTyAxMDY0NiAvIFVuaWNvZGUgVUNTLTIiLCA2NDAwMCwgRkNfVUNTMiwgTlVMTCwgQUxfVU5JViwgInVjczIiLAorICAiSVNPIDEwNjQ2IC8gVW5pY29kZSBVVEYtOCIsIDY0MDAwLCBGQ19VQ1MyLCBOVUxMLCBBTF9VTklWLCAidXRmOCIsCisgICJLT0k4LVIgUnVzc2lhbitCb3hkcmF3aW5nIiwyNTYsICBGQ19LT0k4UiwgTlVMTCwgQUxfQ1lSSUwsImtvaThyIiwKKyAgIktPSTgtVSBVa3JhaW5pYW4rQm94ZHJhd2luZyIsMjU2LEZDX0tPSThVLCBOVUxMLCBBTF9DWVJJTCwia29pOHUiLAorICAiV2luZG93cyBDb2RlIFBhZ2UgMTI1MiIsIDI1NiwgRkNfQ1AxMjUyLCAgTlVMTCwgQUxfUk9NQU4sICJjcDEyNTIiLAorICAiIiwwLDAsTlVMTCwwLE5VTEwKK307CisKKy8qIExvY2FsIGZpbGUgY2hhcmFjdGVyIHNldHMgKi8KKy8qIEluY2x1ZGVzIDctYml0IE5hdGlvbmFsIFJlcGxhY2VtZW50IENoYXJhY3RlciBTZXRzIG9mIElTTyA2NDYgKi8KKy8qIFBsdXMgSVNPIExhdGluLTEsIERFQyBNdWx0aW5hdGlvbmFsIENoYXJhY3RlciBTZXQgKE1DUyksIE5lWFQgY2hhciBzZXQsICovCisvKiBWYXJpb3VzIFBDIGFuZCBXaW5kb3dzIGNvZGUgcGFnZXMsIGV0Yy4gKi8KKworc3RydWN0IGtleXRhYiBmY3N0YWJbXSA9IHsgLyogS2V5d29yZCB0YWJsZSBmb3IgJ3NldCBmaWxlIGNoYXJhY3Rlci1zZXQnICovCisvKgorICBJTVBPUlRBTlQ6IFRoaXMgdGFibGUgaXMgcmVwbGljYXRlZCBiZWxvdyBhcyB0dGNzdGFiICh0ZXJtaW5hbCBjaGFyYWN0ZXIKKyAgc2V0IHRhYmxlKS4gIFRoZSBvbmx5IGRpZmZlcmVuY2VzIGFyZSB0aGUgYWRkaXRpb24gb2YgVFJBTlNQQVJFTlQKKyAgYW5kIHRoZSByZW1vdmFsIG9mIHRoZSBLYW5qaSBzZXRzLCB3aGljaCBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCisgIElmIHlvdSBtYWtlIGNoYW5nZXMgdG8gdGhpcyB0YWJsZSwgYWxzbyBjaGFuZ2UgdHRjc3RhYi4KKyovCisKKy8qIEtleXdvcmQgICAgICAgICAgICAgVmFsdWUgICAgICAgRmxhZ3MgKi8KKyAgICAiYXBwbGUtcXVpY2tkcmF3IiwgICAgRkNfQVBQUUQsICAgQ01fSU5WLCAvKiBBcHBsZSBRdWlja2RyYXcgKi8KKyAgICAiYXNjaWkiLCAgICAgICAgICAgICAgRkNfVVNBU0NJSSwgMCwgLyogQVNDSUkgKi8KKyAgICAiYnJpdGlzaCIsICAgICAgICAgICAgRkNfVUtBU0NJSSwgMCwgLyogQnJpdGlzaCBOUkMgKi8KKyAgICAiYnVsZ2FyaWEtcGMiLCAgICAgICAgRkNfQlVMR0FSLCAgMCwgLyogQnVsZ2FyaWFuIFBDIENvZGUgUGFnZSAqLworICAgICJjYW5hZGlhbi1mcmVuY2giLCAgICBGQ19GQ0FTQ0lJLCAwLCAvKiBGcmVuY2ggQ2FuYWRpYW4gTlJDICovCisjaWZkZWYgTEFUSU4yCisgICAgImNwMTI1MCIsICAgICAgICAgICAgIEZDX0NQMTI1MCwgIDAsIC8qIFdpbmRvd3MgQ1AgMTI1MCAqLworI2VuZGlmIC8qIExBVElOMiAqLworI2lmZGVmIENZUklMTElDCisgICAgImNwMTI1MS1jeXJpbGxpYyIsICAgIEZDX0NQMTI1MSwgIDAsIC8qIFdpbmRvd3MgQ1AgMTI1MSAqLworI2VuZGlmIC8qIENZUklMTElDICovCisgICAgImNwMTI1MiIsICAgICAgICAgICAgIEZDX0NQMTI1MiwgIDAsIC8qIFdpbmRvd3MgQ1AgMTI1MiAqLworICAgICJjcDQzNyIsICAgICAgICAgICAgICBGQ19DUDQzNywgICAwLCAvKiBQQyBDUDQzNyAqLworICAgICJjcDg1MCIsICAgICAgICAgICAgICBGQ19DUDg1MCwgICAwLCAvKiBQQyBDUDg1MCAqLworI2lmZGVmIExBVElOMgorICAgICJjcDg1MiIsICAgICAgICAgICAgICBGQ19DUDg1MiwgICAwLCAvKiBQQyBDUDg1MiAqLworI2VuZGlmIC8qIExBVElOMiAqLworI2lmZGVmIENZUklMTElDCisgICAgImNwODU1LWN5cmlsbGljIiwgICAgIEZDX0NQODU1LCAgIDAsIC8qIFBDIENQODU1ICovCisjZW5kaWYgLyogQ1lSSUxMSUMgKi8KKyAgICAiY3A4NTgiLCAgICAgICAgICAgICAgRkNfQ1A4NTgsICAgMCwgLyogUEMgQ1A4NTggKi8KKyNpZmRlZiBIRUJSRVcKKyAgICAiY3A4NjItaGVicmV3IiwgICAgICAgRkNfQ1A4NjIsICAgMCwgLyogUEMgQ1A4NjIgKi8KKyNlbmRpZiAvKiBIRUJSRVcgKi8KKyNpZmRlZiBDWVJJTExJQworICAgICJjcDg2Ni1jeXJpbGxpYyIsICAgICBGQ19DUDg2NiwgICAwLCAvKiBDUDg2NiBDeXJpbGxpYyAqLworI2VuZGlmIC8qIENZUklMTElDICovCisjaWZkZWYgR1JFRUsKKyAgICAiY3A4NjktZ3JlZWsiLCAgICAgICAgRkNfQ1A4NjksICAgMCwgLyogQ1A4NjkgR3JlZWsgKi8KKyNlbmRpZiAvKiBHUkVFSyAqLworI2lmZGVmIENZUklMTElDCisgICAgImN5cmlsbGljLWlzbyIsICAgICAgIEZDX0NZUklMTCwgIDAsIC8qIElTTyBMYXRpbi9DeXJpbGxpYyBBbHBoYWJldCAqLworI2VuZGlmIC8qIENZUklMTElDICovCisgICAgImRhbmlzaCIsICAgICAgICAgICAgIEZDX05PQVNDSUksIDAsIC8qIE5vcndlZ2lhbiBhbmQgRGFuaXNoIE5SQyAqLworI2lmZGVmIEtBTkpJCisgICAgImRlYy1rYW5qaSIsICAgICAgICAgIEZDX0pERUMsICAgIDAsIC8qIEphcGFuZXNlIERFQyBLYW5qaSAqLworI2VuZGlmIC8qIEtBTkpJICovCisgICAgImRlYy1tdWx0aW5hdGlvbmFsIiwgIEZDX0RFQ01DUywgIDAsIC8qIERFQyBtdWx0aW5hdGlvbmFsIGNoYXJhY3RlciBzZXQgKi8KKyAgICAiZGctaW50ZXJuYXRpb25hbCIsICAgRkNfREdNQ1MsICAgMCwgLyogRGF0YSBHZW5lcmFsIG11bHRpbmF0aW9uYWwgKi8KKyAgICAiZHV0Y2giLCAgICAgICAgICAgICAgRkNfRFVBU0NJSSwgMCwgLyogRHV0Y2ggTlJDICovCisjaWZkZWYgR1JFRUsKKyAgICAiZWxvdDkyNy1ncmVlayIsICAgICAgRkNfRUxPVCwgICAgMCwgLyogRUxPVCA5MjcgR3JlZWsgKi8KKyAgICAiZWxvdDkyOC1ncmVlayIsICAgICAgRkNfR1JFRUssICAgMCwgLyogU2FtZSBhcyBJU08gODg1OS03IExhdGluL0dyZWVrICovCisjZW5kaWYgLyogR1JFRUsgKi8KKyNpZmRlZiBLQU5KSQorICAgICJldWMtanAiLCAgICAgICAgICAgICBGQ19KRVVDLCAgICAwLCAvKiBKYXBhbmVzZSBFVUMgKi8KKyNlbmRpZiAvKiBLQU5KSSAqLworICAgICJmaW5uaXNoIiwgICAgICAgICAgICBGQ19GSUFTQ0lJLCAwLCAvKiBGaW5uaXNoIE5SQyAqLworICAgICJmcmVuY2giLCAgICAgICAgICAgICBGQ19GUkFTQ0lJLCAwLCAvKiBGcmVuY2ggTlJDICovCisgICAgImZyLWNhbmFkaWFuIiwgICAgICAgIEZDX0ZDQVNDSUksIENNX0lOViwgLyogRnJlbmNoIENhbmFkaWFuIE5SQyAqLworICAgICJnZXJtYW4iLCAgICAgICAgICAgICBGQ19HRUFTQ0lJLCAwLCAvKiBHZXJtYW4gTlJDICovCisjaWZkZWYgR1JFRUsKKyAgICAiZ3JlZWstaXNvIiwgICAgICAgICAgRkNfR1JFRUssICAgMCwgLyogSVNPIDg4NTktNyBMYXRpbi9HcmVlayAqLworI2VuZGlmIC8qIEdSRUVLICovCisjaWZkZWYgSEVCUkVXCisgICAgImhlIiwgICAgICAgICAgICAgICAgIEZDX0hFQlJFVywgIENNX0FCUnxDTV9JTlYsCisgICAgImhlYiIsICAgICAgICAgICAgICAgIEZDX0hFQlJFVywgIENNX0FCUnxDTV9JTlYsCisgICAgImhlYnIiLCAgICAgICAgICAgICAgIEZDX0hFQlJFVywgIENNX0FCUnxDTV9JTlYsCisgICAgImhlYnJlIiwgICAgICAgICAgICAgIEZDX0hFQlJFVywgIENNX0FCUnxDTV9JTlYsCisgICAgImhlYnJldyIsICAgICAgICAgICAgIEZDX0hFQlJFVywgIENNX0FCUnxDTV9JTlYsCisgICAgImhlYnJldy03IiwgICAgICAgICAgIEZDX0hFNywgICAgIDAsIC8qIERFQyA3LUJpdCBIZWJyZXcgKi8KKyAgICAiaGVicmV3LWlzbyIsICAgICAgICAgRkNfSEVCUkVXLCAgMCwgLyogSVNPIExhdGluL0hlYnJldyAqLworI2VuZGlmIC8qIEhFQlJFVyAqLworICAgICJocC1yb21hbjgiLCAgICAgICAgICBGQ19IUFI4LCAgICAwLCAvKiBIZXdsZXR0IFBhY2thcmQgUm9tYW44ICovCisgICAgImh1bmdhcmlhbiIsICAgICAgICAgIEZDX0hVQVNDSUksIDAsIC8qIEh1bmdhcmlhbiBOUkMgKi8KKyNpZmRlZiBLQU5KSQorICAgICJpc28yMDIyanAta2FuamkiLCAgICBGQ19KSVM3LCAgICAwLCAvKiBTeW5vbnltIGZvciBKSVMtNyAqLworI2VuZGlmIC8qIEtBTkpJICovCisgICAgIml0YWxpYW4iLCAgICAgICAgICAgIEZDX0lUQVNDSUksIDAsIC8qIEl0YWxpYW4gTlJDICovCisjaWZkZWYgS0FOSkkKKyAgICAiamFwYW5lc2UtZXVjIiwgICAgICAgRkNfSkVVQywgICAgQ01fSU5WLCAvKiBKYXBhbmVzZSBFVUMgKi8KKyAgICAiamlzNy1rYW5qaSIsICAgICAgICAgRkNfSklTNywgICAgMCwgLyogSmFwYW5lc2UgSklTNyA3Yml0IGNvZGUgKi8KKyNlbmRpZiAvKiBLQU5KSSAqLworI2lmZGVmIENZUklMTElDCisgICAgImsiLCAgICAgICAgICAgICAgICAgIEZDX0tPSTgsICAgIENNX0FCUnxDTV9JTlYsCisgICAgImtvIiwgICAgICAgICAgICAgICAgIEZDX0tPSTgsICAgIENNX0FCUnxDTV9JTlYsCisgICAgImtvaSIsICAgICAgICAgICAgICAgIEZDX0tPSTgsICAgIENNX0FCUnxDTV9JTlYsCisgICAgImtvaTgiLCAgICAgICAgICAgICAgIEZDX0tPSTgsICAgIDAsIC8qIE9sZCBLT0ktOCBDeXJpbGxpYyAqLworICAgICJrb2k4LWN5cmlsbGljIiwgICAgICBGQ19LT0k4LCAgICBDTV9JTlYsCisgICAgImtvaThyIiwgICAgICAgICAgICAgIEZDX0tPSThSLCAgIDAsIC8qIEtPSTgtUiBSRkMxNDg5ICovCisgICAgImtvaTh1IiwgICAgICAgICAgICAgIEZDX0tPSThVLCAgIDAsIC8qIEtPSTgtVSBSRkMyMzE5ICovCisjZW5kaWYgLyogQ1lSSUxMSUMgKi8KKyAgICAibCIsICAgICAgICAgICAgICAgICAgRkNfMUxBVElOLCAgQ01fQUJSfENNX0lOViwKKyAgICAibGEiLCAgICAgICAgICAgICAgICAgRkNfMUxBVElOLCAgQ01fQUJSfENNX0lOViwKKyAgICAibGF0IiwgICAgICAgICAgICAgICAgRkNfMUxBVElOLCAgQ01fQUJSfENNX0lOViwKKyAgICAibGF0aSIsICAgICAgICAgICAgICAgRkNfMUxBVElOLCAgQ01fQUJSfENNX0lOViwKKyAgICAibGF0aW4iLCAgICAgICAgICAgICAgRkNfMUxBVElOLCAgQ01fQUJSfENNX0lOViwKKyAgICAibGF0aW4xLWlzbyIsICAgICAgICAgRkNfMUxBVElOLCAgMCwgLyogSVNPIExhdGluIEFscGhhYmV0IDEgKi8KKyNpZmRlZiBMQVRJTjIKKyAgICAibGF0aW4yLWlzbyIsICAgICAgICAgRkNfMkxBVElOLCAgMCwgLyogSVNPIExhdGluIEFscGhhYmV0IDIgKi8KKyNlbmRpZiAvKiBMQVRJTjIgKi8KKyAgICAibGF0aW45LWlzbyIsICAgICAgICAgRkNfOUxBVElOLCAgMCwgLyogSVNPIExhdGluIEFscGhhYmV0IDkgKi8KKyAgICAibWFjaW50b3NoLWxhdGluIiwgICAgRkNfQVBQUUQsICAgMCwgLyogIkV4dGVuZGVkIE1hYyBMYXRpbiIgKi8KKyNpZmRlZiBMQVRJTjIKKyAgICAibWF6b3ZpYS1wYyIsICAgICAgICAgRkNfTUFaT1ZJQSwgMCwgLyogUG9saXNoIE1hem92aWEgUEMgY29kZSBwYWdlICovCisjZW5kaWYgLyogTEFUSU4yICovCisgICAgIm5leHQtbXVsdGluYXRpb25hbCIsIEZDX05FWFQsICAgIDAsIC8qIE5lWFQgd29ya3N0YXRpb24gKi8KKyAgICAibm9yd2VnaWFuIiwgICAgICAgICAgRkNfTk9BU0NJSSwgMCwgLyogTm9yd2VnaWFuIGFuZCBEYW5pc2ggTlJDICovCisgICAgInBvcnR1Z3Vlc2UiLCAgICAgICAgIEZDX1BPQVNDSUksIDAsIC8qIFBvcnR1Z3Vlc2UgTlJDICovCisjaWZkZWYgS0FOSkkKKyAgICAic2hpZnQtamlzLWthbmppIiwgICAgRkNfU0hKSVMsICAgMCwgLyogSmFwYW5lc2UgS2FuamkgU2hpZnQtSklTICovCisjZW5kaWYgLyogS0FOSkkgKi8KKyNpZmRlZiBDWVJJTExJQworICAgICJzaG9ydC1rb2kiLCAgICAgICAgICBGQ19LT0k3LCAgICAwLCAvKiBTaG9ydCBLT0kgQ3lyaWxsaWMgKi8KKyNlbmRpZiAvKiBDWVJJTExJQyAqLworICAgICJzcGFuaXNoIiwgICAgICAgICAgICBGQ19TUEFTQ0lJLCAwLCAvKiBTcGFuaXNoIE5SQyAqLworICAgICJzd2VkaXNoIiwgICAgICAgICAgICBGQ19TV0FTQ0lJLCAwLCAvKiBTd2VkaXNoIE5SQyAqLworICAgICJzd2lzcyIsICAgICAgICAgICAgICBGQ19DSEFTQ0lJLCAwLCAvKiBTd2lzcyBOUkMgKi8KKyNpZmRlZiBVTklDT0RFCisgICAgInVjczIiLCAgICAgICAgICAgICAgIEZDX1VDUzIsICAgIDAsIC8qIElTTyAxMDY0NiAvIFVuaWNvZGUgVUNTLTIgKi8KKyAgICAidXRmOCIsICAgICAgICAgICAgICAgRkNfVVRGOCwgICAgMCwgLyogSVNPIDEwNjQ2IC8gVW5pY29kZSBVVEYtOCAqLworI2VuZGlmIC8qIFVOSUNPREUgKi8KKyAgICAiIiwgMCwgMAorfTsKK2ludCBuZmlsYyA9IChzaXplb2YoZmNzdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCitzdHJ1Y3Qga2V5dGFiIHR0Y3N0YWJbXSA9IHsgLyogS2V5d29yZCB0YWJsZSBmb3IgU0VUIFRFUk1JTkFMIENIQVJBQ1RFUi1TRVQgKi8KKy8qCisgIElNUE9SVEFOVDogVGhpcyB0YWJsZSBpcyBhIHJlcGxpY2Egb2YgZmNzdGFiLCBpbW1lZGlhdGVseSBhYm92ZSwgd2l0aCB0aGUKKyAgYWRkaXRpb24gb2YgVFJBTlNQQVJFTlQgYW5kIGRlbGV0aW9uIG9mIHRoZSBKYXBhbmVzZSBzZXRzLiAgSWYgeW91IG1ha2UKKyAgY2hhbmdlcyB0byB0aGlzIHRhYmxlLCBtYWtlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdG8gZmNzdGFiLgorKi8KKy8qIEtleXdvcmQgICAgICAgICAgICAgICBWYWx1ZSAgICAgICBGbGFncyAqLworICAgICJhcHBsZS1xdWlja2RyYXciLCAgICBGQ19BUFBRRCwgICBDTV9JTlYsIC8qIEFwcGxlIFF1aWNrZHJhdyAqLworICAgICJhc2NpaSIsICAgICAgICAgICAgICBGQ19VU0FTQ0lJLCAwLCAvKiBBU0NJSSAqLworICAgICJicml0aXNoIiwgICAgICAgICAgICBGQ19VS0FTQ0lJLCAwLCAvKiBCcml0aXNoIE5SQyAqLworICAgICJidWxnYXJpYS1wYyIsICAgICAgICBGQ19CVUxHQVIsICAwLCAvKiBCdWxnYXJpYW4gUEMgQ29kZSBQYWdlICovCisgICAgImNhbmFkaWFuLWZyZW5jaCIsICAgIEZDX0ZDQVNDSUksIDAsIC8qIEZyZW5jaCBDYW5hZGlhbiBOUkMgKi8KKyNpZmRlZiBMQVRJTjIKKyAgICAiY3AxMjUwIiwgICAgICAgICAgICAgRkNfQ1AxMjUwLCAgMCwgLyogV2luZG93cyBDUCAxMjUwICovCisjZW5kaWYgLyogTEFUSU4yICovCisjaWZkZWYgQ1lSSUxMSUMKKyAgICAiY3AxMjUxLWN5cmlsbGljIiwgICAgRkNfQ1AxMjUxLCAgMCwgLyogV2luZG93cyBDUCAxMjUxICovCisjZW5kaWYgLyogQ1lSSUxMSUMgKi8KKyAgICAiY3AxMjUyIiwgICAgICAgICAgICAgRkNfQ1AxMjUyLCAgMCwgLyogV2luZG93cyBDUCAxMjUyICovCisgICAgImNwNDM3IiwgICAgICAgICAgICAgIEZDX0NQNDM3LCAgIDAsIC8qIElCTSBDUDQzNyAqLworICAgICJjcDg1MCIsICAgICAgICAgICAgICBGQ19DUDg1MCwgICAwLCAvKiBJQk0gQ1A4NTAgKi8KKyNpZmRlZiBMQVRJTjIKKyAgICAiY3A4NTIiLCAgICAgICAgICAgICAgRkNfQ1A4NTIsICAgMCwgLyogSUJNIENQODUyICovCisjZW5kaWYgLyogTEFUSU4yICovCisjaWZkZWYgQ1lSSUxMSUMKKyAgICAiY3A4NTUtY3lyaWxsaWMiLCAgICAgRkNfQ1A4NTUsICAgMCwgLyogUEMgQ1A4NTUgKi8KKyNlbmRpZiAvKiBDWVJJTExJQyAqLworICAgICJjcDg1OCIsICAgICAgICAgICAgICBGQ19DUDg1OCwgICAwLCAvKiBQQyBDUDg1OCAqLworI2lmZGVmIEhFQlJFVworICAgICJjcDg2Mi1oZWJyZXciLCAgICAgICBGQ19DUDg2MiwgICAwLCAvKiBQQyBDUDg2MiAqLworI2VuZGlmIC8qIEhFQlJFVyAqLworI2lmZGVmIENZUklMTElDCisgICAgImNwODY2LWN5cmlsbGljIiwgICAgIEZDX0NQODY2LCAgIDAsIC8qIENQODY2IEN5cmlsbGljICovCisjZW5kaWYgLyogQ1lSSUxMSUMgKi8KKyNpZmRlZiBHUkVFSworICAgICJjcDg2OS1ncmVlayIsICAgICAgICBGQ19DUDg2OSwgICAwLCAvKiBDUDg2OSBHcmVlayAqLworI2VuZGlmIC8qIEdSRUVLICovCisjaWZkZWYgQ1lSSUxMSUMKKyAgICAiY3lyaWxsaWMtaXNvIiwgICAgICAgRkNfQ1lSSUxMLCAgMCwgLyogSVNPIExhdGluL0N5cmlsbGljIEFscGhhYmV0ICovCisjZW5kaWYgLyogQ1lSSUxMSUMgKi8KKyAgICAiZGFuaXNoIiwgICAgICAgICAgICAgRkNfTk9BU0NJSSwgMCwgLyogTm9yd2VnaWFuIGFuZCBEYW5pc2ggTlJDICovCisjaWZkZWYgQ09NTUVOVAorI2lmZGVmIEtBTkpJCisgICAgImRlYy1rYW5qaSIsICAgICAgICAgIEZDX0pERUMsICAgIDAsIC8qIEphcGFuZXNlIERFQyBLYW5qaSAqLworI2VuZGlmIC8qIEtBTkpJICovCisjZW5kaWYgLyogQ09NTUVOVCAqLworICAgICJkZWMtbXVsdGluYXRpb25hbCIsICBGQ19ERUNNQ1MsICAwLCAvKiBERUMgbXVsdGluYXRpb25hbCBjaGFyYWN0ZXIgc2V0ICovCisgICAgImRnLWludGVybmF0aW9uYWwiLCAgIEZDX0RHTUNTLCAgIDAsIC8qIERhdGEgR2VuZXJhbCBtdWx0aW5hdGlvbmFsICovCisgICAgImR1dGNoIiwgICAgICAgICAgICAgIEZDX0RVQVNDSUksIDAsIC8qIER1dGNoIE5SQyAqLworI2lmZGVmIEdSRUVLCisgICAgImVsb3Q5MjctZ3JlZWsiLCAgICAgIEZDX0VMT1QsICAgIDAsIC8qIEVMT1QgOTI3IEdyZWVrICovCisgICAgImVsb3Q5MjgtZ3JlZWsiLCAgICAgIEZDX0dSRUVLLCAgIDAsIC8qIFNhbWUgYXMgSVNPIDg4NTktNyBMYXRpbi9HcmVlayAqLworI2VuZGlmIC8qIEdSRUVLICovCisgICAgImZpbm5pc2giLCAgICAgICAgICAgIEZDX0ZJQVNDSUksIDAsIC8qIEZpbm5pc2ggTlJDICovCisgICAgImZyZW5jaCIsICAgICAgICAgICAgIEZDX0ZSQVNDSUksIDAsIC8qIEZyZW5jaCBOUkMgKi8KKyAgICAiZnItY2FuYWRpYW4iLCAgICAgICAgRkNfRkNBU0NJSSwgQ01fSU5WLCAvKiBGcmVuY2ggQ2FuYWRpYW4gTlJDICovCisgICAgImdlcm1hbiIsICAgICAgICAgICAgIEZDX0dFQVNDSUksIDAsIC8qIEdlcm1hbiBOUkMgKi8KKyNpZmRlZiBHUkVFSworICAgICJncmVlay1pc28iLCAgICAgICAgICBGQ19HUkVFSywgICAwLCAvKiBJU08gODg1OS03IExhdGluL0dyZWVrICovCisjZW5kaWYgLyogR1JFRUsgKi8KKyNpZmRlZiBIRUJSRVcKKyAgICAiaGUiLCAgICAgICAgICAgICAgICAgRkNfSEVCUkVXLCAgQ01fQUJSfENNX0lOViwKKyAgICAiaGViIiwgICAgICAgICAgICAgICAgRkNfSEVCUkVXLCAgQ01fQUJSfENNX0lOViwKKyAgICAiaGViciIsICAgICAgICAgICAgICAgRkNfSEVCUkVXLCAgQ01fQUJSfENNX0lOViwKKyAgICAiaGVicmUiLCAgICAgICAgICAgICAgRkNfSEVCUkVXLCAgQ01fQUJSfENNX0lOViwKKyAgICAiaGVicmV3IiwgICAgICAgICAgICAgRkNfSEVCUkVXLCAgQ01fQUJSfENNX0lOViwKKyAgICAiaGVicmV3LTciLCAgICAgICAgICAgRkNfSEU3LCAgICAgMCwgLyogREVDIDctQml0IEhlYnJldyAqLworICAgICJoZWJyZXctaXNvIiwgICAgICAgICBGQ19IRUJSRVcsICAwLCAvKiBJU08gTGF0aW4vSGVicmV3ICovCisjZW5kaWYgLyogSEVCUkVXICovCisgICAgImhwLXJvbWFuOCIsICAgICAgICAgIEZDX0hQUjgsICAgIDAsIC8qIEhld2xldHQgUGFja2FyZCBSb21hbjggKi8KKyAgICAiaHVuZ2FyaWFuIiwgICAgICAgICAgRkNfSFVBU0NJSSwgMCwgLyogSHVuZ2FyaWFuIE5SQyAqLworICAgICJpdGFsaWFuIiwgICAgICAgICAgICBGQ19JVEFTQ0lJLCAwLCAvKiBJdGFsaWFuIE5SQyAqLworI2lmZGVmIENPTU1FTlQKKy8qIEthbmppIHRlcm1pbmFsIGNoYXJhY3RlciBzZXRzIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKyNpZmRlZiBLQU5KSQorICAgICJqYXBhbmVzZS1ldWMiLCAgICAgICBGQ19KRVVDLCAgICAwLCAvKiBKYXBhbmVzZSBFVUMgKi8KKyAgICAiamlzNy1rYW5qaSIsICAgICAgICAgRkNfSklTNywgICAgMCwgLyogSmFwYW5lc2UgSklTNyA3Yml0IGNvZGUgKi8KKyNlbmRpZiAvKiBLQU5KSSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBDWVJJTExJQworICAgICJrIiwgICAgICAgICAgICAgICAgICBGQ19LT0k4LCAgICBDTV9BQlJ8Q01fSU5WLAorICAgICJrbyIsICAgICAgICAgICAgICAgICBGQ19LT0k4LCAgICBDTV9BQlJ8Q01fSU5WLAorICAgICJrb2kiLCAgICAgICAgICAgICAgICBGQ19LT0k4LCAgICBDTV9BQlJ8Q01fSU5WLAorICAgICJrb2k4IiwgICAgICAgICAgICAgICBGQ19LT0k4LCAgICAwLCAvKiBPbGQgS09JLTggQ3lyaWxsaWMgKi8KKyAgICAia29pOC1jeXJpbGxpYyIsICAgICAgRkNfS09JOCwgICAgQ01fSU5WLAorICAgICJrb2k4ciIsICAgICAgICAgICAgICBGQ19LT0k4UiwgICAwLCAvKiBLT0k4LVIgUkZDMTQ4OSAqLworICAgICJrb2k4dSIsICAgICAgICAgICAgICBGQ19LT0k4VSwgICAwLCAvKiBLT0k4LVUgUkZDMjMxOSAqLworI2VuZGlmIC8qIENZUklMTElDICovCisgICAgImwiLCAgICAgICAgICAgICAgICAgIEZDXzFMQVRJTiwgIENNX0FCUnxDTV9JTlYsCisgICAgImxhIiwgICAgICAgICAgICAgICAgIEZDXzFMQVRJTiwgIENNX0FCUnxDTV9JTlYsCisgICAgImxhdCIsICAgICAgICAgICAgICAgIEZDXzFMQVRJTiwgIENNX0FCUnxDTV9JTlYsCisgICAgImxhdGkiLCAgICAgICAgICAgICAgIEZDXzFMQVRJTiwgIENNX0FCUnxDTV9JTlYsCisgICAgImxhdGluIiwgICAgICAgICAgICAgIEZDXzFMQVRJTiwgIENNX0FCUnxDTV9JTlYsCisgICAgImxhdGluMS1pc28iLCAgICAgICAgIEZDXzFMQVRJTiwgIDAsIC8qIElTTyBMYXRpbiBBbHBoYWJldCAxICovCisjaWZkZWYgTEFUSU4yCisgICAgImxhdGluMi1pc28iLCAgICAgICAgIEZDXzJMQVRJTiwgIDAsIC8qIElTTyBMYXRpbiBBbHBoYWJldCAyICovCisjZW5kaWYgLyogTEFUSU4yICovCisgICAgImxhdGluOS1pc28iLCAgICAgICAgIEZDXzlMQVRJTiwgIDAsIC8qIElTTyBMYXRpbiBBbHBoYWJldCA5ICovCisgICAgIm1hY2ludG9zaC1sYXRpbiIsICAgIEZDX0FQUFFELCAgIDAsIC8qICJFeHRlbmRlZCBNYWMgTGF0aW4gKi8KKyNpZmRlZiBMQVRJTjIKKyAgICAibWF6b3ZpYS1wYyIsICAgICAgICAgRkNfTUFaT1ZJQSwgMCwgLyogUG9saXNoIE1hem92aWEgUEMgY29kZSBwYWdlICovCisjZW5kaWYgLyogTEFUSU4yICovCisgICAgIm5leHQtbXVsdGluYXRpb25hbCIsIEZDX05FWFQsICAgIDAsIC8qIE5lWFQgd29ya3N0YXRpb24gKi8KKyAgICAibm9yd2VnaWFuIiwgICAgICAgICAgRkNfTk9BU0NJSSwgMCwgLyogTm9yd2VnaWFuIGFuZCBEYW5pc2ggTlJDICovCisgICAgInBvcnR1Z3Vlc2UiLCAgICAgICAgIEZDX1BPQVNDSUksIDAsIC8qIFBvcnR1Z3Vlc2UgTlJDICovCisjaWZkZWYgQ09NTUVOVAorLyogS2FuamkgdGVybWluYWwgY2hhcmFjdGVyIHNldHMgbm90IGltcGxlbWVudGVkIHlldC4gKi8KKyNpZmRlZiBLQU5KSQorICAgICJzaGlmdC1qaXMta2FuamkiLCAgICBGQ19TSEpJUywgICAwLCAvKiBKYXBhbmVzZSBLYW5qaSBTaGlmdC1KSVMgKi8KKyNlbmRpZiAvKiBLQU5KSSAqLworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNpZmRlZiBDWVJJTExJQworICAgICJzaG9ydC1rb2kiLCAgICAgICAgICBGQ19LT0k3LCAgICAwLCAvKiBTaG9ydCBLT0kgQ3lyaWxsaWMgKi8KKyNlbmRpZiAvKiBDWVJJTExJQyAqLworICAgICJzcGFuaXNoIiwgICAgICAgICAgICBGQ19TUEFTQ0lJLCAwLCAvKiBTcGFuaXNoIE5SQyAqLworICAgICJzd2VkaXNoIiwgICAgICAgICAgICBGQ19TV0FTQ0lJLCAwLCAvKiBTd2VkaXNoIE5SQyAqLworICAgICJzd2lzcyIsICAgICAgICAgICAgICBGQ19DSEFTQ0lJLCAwLCAvKiBTd2lzcyBOUkMgKi8KKyAgICAidHJhbnNwYXJlbnQiLCAgICAgICAgRkNfVFJBTlNQLCAgMCwgLyogVHJhbnNwYXJlbnQgKi8KKyNpZmRlZiBVTklDT0RFCisgICAgInV0ZjgiLCAgICAgICAgICAgICAgIEZDX1VURjgsICAgIDAsIC8qIElTTyAxMDY0NiAvIFVuaWNvZGUgVVRGLTggKi8KKyNlbmRpZiAvKiBVTklDT0RFICovCisgICAgIiIsIDAsIDAKK307CitpbnQgbnRlcm1jID0gKHNpemVvZih0dGNzdGFiKSAvIHNpemVvZihzdHJ1Y3Qga2V5dGFiKSkgLSAxOworCisvKiBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBlcXVpdmFsZW50IEZDUyBudW1iZXIgZm9yIGVhY2ggVENTLiAqLworLyogSWYgdGhlIFRDX3h4eCBzeW1ib2wgZGVmaW5pdGlvbnMgYXJlIGV2ZXIgY2hhbmdlZCwgZml4IHRoaXMgdGFibGUuICovCisvKiBEaXR0byBpZiBhbm90aGVyIFRDUyBpcyBhZGRlZC4gKi8KKworaW50Citjc2VxdGFiW01BWFRDU0VUUysxXSA9IHsJCS8qIFRDUy9GQ1MgZXF1aXZhbGVuY3kgdGFibGUgKi8KKyAgICAtMSwJCQkJCS8qICAwID0gVHJhbnNwYXJlbnQgKi8KKyAgICBGQ19VU0FTQ0lJLAkJCQkvKiAgMSA9IEFTQ0lJICovCisgICAgRkNfMUxBVElOLAkJCQkvKiAgMiA9IExhdGluLTEgKi8KKyAgICBGQ18yTEFUSU4sCQkJCS8qICAzID0gTGF0aW4tMiAqLworICAgIEZDX0NZUklMTCwJCQkJLyogIDQgPSBMYXRpbi9DeXJpbGxpYyAqLworICAgIEZDX0pFVUMsCQkJCS8qICA1ID0gSmFwYW5lc2UgRVVDICovCisgICAgRkNfSEVCUkVXLAkJCQkvKiAgNiA9IExhdGluL0hlYnJldyAqLworICAgIEZDX0dSRUVLLAkJCQkvKiAgNyA9IExhdGluL0dyZWVrICovCisgICAgRkNfOUxBVElOLAkJCQkvKiAgOCA9IExhdGluLTkgKi8KKyAgICBGQ19VQ1MyLAkJCQkvKiAgOSA9IFVDUy0yICovCisgICAgRkNfVVRGOAkJCQkvKiAxMCA9IFVURi04ICovCit9OworCisvKgorIExhbmd1YWdlczoKKworIFRoaXMgdGFibGUgYWxsb3dzIEMtS2VybWl0IHRvIGhhdmUgYSBTRVQgTEFOR1VBR0UgY29tbWFuZCB0byBhcHBseSBzcGVjaWFsCisgbGFuZ3VhZ2Utc3BlY2lmaWMgcnVsZXMgd2hlbiB0cmFuc2xhdGluZyBmcm9tIGEgY2hhcmFjdGVyIHNldCB0aGF0IGNvbnRhaW5zCisgbmF0aW9uYWwgY2hhcmFjdGVycyBpbnRvIHBsYWluIEFTQ0lJLCBsaWtlIEdlcm1hbiB1bWxhdXQtYSBiZWNvbWVzIGFlLgorCisgT3JpZ2luYWxseSwgSSB0aG91Z2h0IGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIGxldCBTRVQgTEFOR1VBR0UgYWxzbyBzZWxlY3QKKyBhbiBhcHByb3ByaWF0ZSBGSUxFIENIQVJBQ1RFUi1TRVQgYW5kIFRSQU5TRkVSIENIQVJBQ1RFUi1TRVQgYXV0b21hdGljYWxseSwKKyBhbmQgdGhlc2UgYXJlIGluY2x1ZGVkIGluIHRoZSBsYW5naW5mbyBzdHJ1Y3R1cmUuICBMYXRlciBJIHJlYWxpemVkIHRoYXQgdGhpcworIHdhcyBhIGJhZCBpZGVhLiAgQW55IHBhcnRpY3VsYXIgbGFuZ3VhZ2UgKGUuZy4gRHV0Y2gpIGNhbiBiZSByZXByZXNlbnRlZCBieQorIG1hbnkgZGlmZmVyZW50IGFuZCBpbmNvbXBhdGlibGUgY2hhcmFjdGVyIHNldHMuCisKKyAoQnV0IHdlIGNvdWxkIHVzZSB0aGUgbmV3ICgxOTk4KSBBU1NPQ0lBVEUgY29tbWFuZCBmb3IgdGhpcy4uLikKKyovCisKK3N0cnVjdCBsYW5naW5mbyBsYW5nc1tdID0geworLyogIExhbmd1YWdlIGNvZGUgICBGaWxlIENoYXJzZXQgWGZlciBDaGFyc2V0IE5hbWUgKi8KKyAgICBMX1VTQVNDSUksICAgICAgRkNfVVNBU0NJSSwgIFRDX1VTQVNDSUksICAiQVNDSUkgKEFtZXJpY2FuIEVuZ2xpc2gpIiwKKyAgICBMX0RBTklTSCwgICAgICAgRkNfTk9BU0NJSSwgIFRDXzFMQVRJTiwgICAiRGFuaXNoIiwKKyAgICBMX0RVVENILCAgICAgICAgRkNfRFVBU0NJSSwgIFRDXzFMQVRJTiwgICAiRHV0Y2giLAorICAgIExfRklOTklTSCwgICAgICBGQ19GSUFTQ0lJLCAgVENfMUxBVElOLCAgICJGaW5uaXNoIiwKKyAgICBMX0ZSRU5DSCwgICAgICAgRkNfRlJBU0NJSSwgIFRDXzFMQVRJTiwgICAiRnJlbmNoIiwKKyAgICBMX0dFUk1BTiwgICAgICAgRkNfR0VBU0NJSSwgIFRDXzFMQVRJTiwgICAiR2VybWFuIiwKKyNpZmRlZiBHUkVFSworICAgIExfR1JFRUssICAgICAgICBGQ19HUkVFSywgICAgVENfR1JFRUssICAgICJHcmVlayIsCisjZW5kaWYgLyogR1JFRUsgKi8KKyNpZmRlZiBIRUJSRVcKKyAgICBMX0hFQlJFVywgICAgICAgRkNfSEVCUkVXLCAgIFRDX0hFQlJFVywgICAiSGVicmV3IiwKKyNlbmRpZiAvKiBIRUJSRVcgKi8KKyAgICBMX0hVTkdBUklBTiwgICAgRkNfSFVBU0NJSSwgIFRDXzJMQVRJTiwgICAiSHVuZ2FyaWFuIiwKKyAgICBMX0lDRUxBTkRJQywgICAgRkNfVVNBU0NJSSwgIFRDXzFMQVRJTiwgICAiSWNlbGFuZGljIiwKKyAgICBMX0lUQUxJQU4sICAgICAgRkNfSVRBU0NJSSwgIFRDXzFMQVRJTiwgICAiSXRhbGlhbiIsCisjaWZkZWYgS0FOSkkKKyAgICBMX0pBUEFORVNFLCAgICAgRkNfSkVVQywgICAgIFRDX0pFVUMsICAgICAiSmFwYW5lc2UiLAorI2VuZGlmIC8qIEtBTkpJICovCisgICAgTF9OT1JXRUdJQU4sICAgIEZDX05PQVNDSUksICBUQ18xTEFUSU4sICAgIk5vcndlZ2lhbiIsCisgICAgTF9QT1JUVUdVRVNFLCAgIEZDX1BPQVNDSUksICBUQ18xTEFUSU4sICAgIlBvcnR1Z3Vlc2UiLAorI2lmZGVmIENZUklMTElDCisgICAgTF9SVVNTSUFOLCAgICAgIEZDX0NQODY2LCAgICBUQ19DWVJJTEwsICAgIlJ1c3NpYW4iLAorI2VuZGlmIC8qIENZUklMTElDICovCisgICAgTF9TUEFOSVNILCAgICAgIEZDX1NQQVNDSUksICBUQ18xTEFUSU4sICAgIlNwYW5pc2giLAorICAgIExfU1dFRElTSCwgICAgICBGQ19TV0FTQ0lJLCAgVENfMUxBVElOLCAgICJTd2VkaXNoIiwKKyAgICBMX1NXSVNTLCAgICAgICAgRkNfQ0hBU0NJSSwgIFRDXzFMQVRJTiwgICAiU3dpc3MiCit9OworaW50IG5sYW5ncyA9IChzaXplb2YobGFuZ3MpIC8gc2l6ZW9mKHN0cnVjdCBsYW5naW5mbykpOworCisvKgorICBLZXl3b3JkIHRhYmxlIGZvciB0aGUgU0VUIExBTkdVQUdFIGNvbW1hbmQuCisgIE9ubHkgYSBmZXcgb2YgdGhlc2UgKEdlcm1hbiwgU2NhbmRpbmF2aWFuLCBldGMpIGFjdHVhbGx5IGRvIGFueXRoaW5nLgorICBUaGUgbGFuZ3VhZ2UgaXMgdXNlZCB0byBpbnZva2Ugc3BlY2lhbCB0cmFuc2xhdGlvbiBydWxlcyB3aGVuIGNvbnZlcnRpbmcKKyAgZnJvbSBhbiA4LWJpdCBjaGFyYWN0ZXIgc2V0IHRvIEFTQ0lJOyBmb3IgZXhhbXBsZSwgR2VybWFuIHUtZGlhZXJlc2lzCisgIGJlY29tZXMgInVlIiwgRHV0Y2ggeS1kaWFlcmVzaXMgYmVjb21lcyAiaWoiLiAgTGFuZ3VhZ2VzIHdpdGhvdXQgYXNzb2NpYXRlZAorICBydWxlcyBhcmUgaW52aXNpYmxlIChDTV9JTlYpLgorKi8KK3N0cnVjdCBrZXl0YWIgbG5ndGFiW10gPSB7CisgICAgImFzY2lpIiwgICAgICAgICAgICBMX1VTQVNDSUksICAgIENNX0lOViwKKyAgICAiZGFuaXNoIiwgICAgICAgICAgIExfREFOSVNILCAgICAgMCwKKyAgICAiZHV0Y2giLCAgICAgICAgICAgIExfRFVUQ0gsICAgICAgMCwKKyAgICAiZW5nbGlzaCIsICAgICAgICAgIExfVVNBU0NJSSwgICAgQ01fSU5WLAorICAgICJmaW5uaXNoIiwgICAgICAgICAgTF9GSU5OSVNILCAgICAwLAorICAgICJmcmVuY2giLCAgICAgICAgICAgTF9GUkVOQ0gsICAgICAwLAorICAgICJnZXJtYW4iLCAgICAgICAgICAgTF9HRVJNQU4sICAgICAwLAorI2lmZGVmIEdSRUVLCisgICAgImdyZWVrIiwgICAgICAgICAgICBMX0dSRUVLLCAgICAgIENNX0lOViwKKyNlbmRpZiAvKiBHUkVFSyAqLworI2lmZGVmIEhFQlJFVworICAgICJoZWJyZXciLCAgICAgICAgICAgTF9IRUJSRVcsICAgICBDTV9JTlYsCisjZW5kaWYgLyogSEVCUkVXICovCisgICAgImh1bmdhcmlhbiIsICAgICAgICBMX0hVTkdBUklBTiwgIENNX0lOViwKKyAgICAiaWNlbGFuZGljIiwgICAgICAgIExfSUNFTEFORElDLCAgMCwKKyAgICAiaXRhbGlhbiIsICAgICAgICAgIExfSVRBTElBTiwgICAgQ01fSU5WLAorI2lmZGVmIEtBTkpJCisgICAgImphcGFuZXNlIiwgICAgICAgICBMX0pBUEFORVNFLCAgIENNX0lOViwKKyNlbmRpZiAvKiBLQU5KSSAqLworICAgICJub3J3ZWdpYW4iLCAgICAgICAgTF9OT1JXRUdJQU4sICAwLAorICAgICJub25lIiwgICAgICAgICAgICAgTF9VU0FTQ0lJLCAgICAwLAorICAgICJwb3J0dWd1ZXNlIiwgICAgICAgTF9QT1JUVUdVRVNFLCBDTV9JTlYsCisjaWZkZWYgQ1lSSUxMSUMKKyAgICAicnVzc2lhbiIsICAgICAgICAgIExfUlVTU0lBTiwgICAgMCwKKyNlbmRpZiAvKiBDWVJJTExJQyAqLworICAgICJzcGFuaXNoIiwgICAgICAgICAgTF9TUEFOSVNILCAgICBDTV9JTlYsCisgICAgInN3ZWRpc2giLCAgICAgICAgICBMX1NXRURJU0gsICAgIDAsCisjaWZkZWYgQ1lSSUxMSUMKKyAgICAidWtyYWluaWFuIiwgICAgICAgIExfUlVTU0lBTiwgICAgMCwKKyNlbmRpZiAvKiBDWVJJTExJQyAqLworICAgICIiLCAwLCAwCit9OworaW50IG5sbmcgPSAoc2l6ZW9mKGxuZ3RhYikgLyBzaXplb2Yoc3RydWN0IGtleXRhYikpIC0gMTsgLyogaG93IG1hbnkgKi8KKworCisvKiBUcmFuc2xhdGlvbiB0YWJsZXMgLi4uICovCisKKy8qCisgIEZvciBlYWNoIHBhaXIgb2YgKHRyYW5zZmVyLGZpbGUpIGNoYXJhY3RlciBzZXRzLCB3ZSBuZWVkIHR3byB0cmFuc2xhdGlvbgorICBmdW5jdGlvbnMsIG9uZSBmb3Igc2VuZGluZywgb25lIGZvciByZWNlaXZpbmcuCisqLworCisvKgorICBIZXJlIGlzIHRoZSBmaXJzdCB0YWJsZSwgTGF0aW4tMSB0byBBU0NJSSwgZnVsbHkgYW5ub3RhdGVkLi4uCisgIFRoaXMgb25lIGlzIGFic29sdXRlbHkgTk9UIGludmVydGlibGUsIHNpbmNlIHdlJ3JlIGdvaW5nIGZyb20gYW4gOC1iaXQKKyAgc2V0IHRvIGEgNy1iaXQgc2V0LiAgQWNjZW50ZWQgbGV0dGVycyBhcmUgbWFwcGVkIHRvIHVuYWNjZW50ZWQKKyAgZXF1aXZhbGVudHMsIEMxIGNvbnRyb2wgY2hhcmFjdGVycyBhcmUgYWxsIHRyYW5zbGF0ZWQgdG8gIj8iLCBldGMuCisqLworQ09OU1QgQ0hBUgoreWwxYXNbXSA9IHsgIC8qIElTTyA4ODU5LTEgTGF0aW4gQWxwaGFiZXQgMSB0byBVUyBBU0NJSSAqLworICAgICAgLyogIFNvdXJjZSBjaGFyYWN0ZXIgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICA9PiBUcmFuc2xhdGlvbiAqLworICAgICAgLyogIERlYyByb3cvY29sIFNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAwLCAgLyogIDAwMCAgMDAvMDAgIEMwIE5VTCAgQ3RybC1AICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworICAxLCAgLyogIDAwMSAgMDAvMDEgIEMwIFNPSCAgQ3RybC1BICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworICAyLCAgLyogIDAwMiAgMDAvMDIgIEMwIFNUWCAgQ3RybC1CICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworICAzLCAgLyogIDAwMyAgMDAvMDMgIEMwIEVUWCAgQ3RybC1DICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworICA0LCAgLyogIDAwNCAgMDAvMDQgIEMwIEVPVCAgQ3RybC1EICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworICA1LCAgLyogIDAwNSAgMDAvMDUgIEMwIEVOUSAgQ3RybC1FICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworICA2LCAgLyogIDAwNiAgMDAvMDYgIEMwIEFDSyAgQ3RybC1GICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworICA3LCAgLyogIDAwNyAgMDAvMDcgIEMwIEJFTCAgQ3RybC1HICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworICA4LCAgLyogIDAwOCAgMDAvMDggIEMwIEJTICAgQ3RybC1IICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworICA5LCAgLyogIDAwOSAgMDAvMDkgIEMwIEhUICAgQ3RybC1JICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDEwLCAgLyogIDAxMCAgMDAvMTAgIEMwIExGICAgQ3RybC1KICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDExLCAgLyogIDAxMSAgMDAvMTEgIEMwIFZUICAgQ3RybC1LICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDEyLCAgLyogIDAxMiAgMDAvMTIgIEMwIEZGICAgQ3RybC1MICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDEzLCAgLyogIDAxMyAgMDAvMTMgIEMwIENSICAgQ3RybC1NICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDE0LCAgLyogIDAxNCAgMDAvMTQgIEMwIFNPICAgQ3RybC1OICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDE1LCAgLyogIDAxNSAgMDAvMTUgIEMwIFNJICAgQ3RybC1PICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDE2LCAgLyogIDAxNiAgMDEvMDAgIEMwIERMRSAgQ3RybC1QICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDE3LCAgLyogIDAxNyAgMDEvMDEgIEMwIERDMSAgQ3RybC1RICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDE4LCAgLyogIDAxOCAgMDEvMDIgIEMwIERDMiAgQ3RybC1SICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDE5LCAgLyogIDAxOSAgMDEvMDMgIEMwIERDMyAgQ3RybC1TICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDIwLCAgLyogIDAyMCAgMDEvMDQgIEMwIERDNCAgQ3RybC1UICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDIxLCAgLyogIDAyMSAgMDEvMDUgIEMwIE5BSyAgQ3RybC1VICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDIyLCAgLyogIDAyMiAgMDEvMDYgIEMwIFNZTiAgQ3RybC1WICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDIzLCAgLyogIDAyMyAgMDEvMDcgIEMwIEVUQiAgQ3RybC1XICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDI0LCAgLyogIDAyNCAgMDEvMDggIEMwIENBTiAgQ3RybC1YICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDI1LCAgLyogIDAyNSAgMDEvMDkgIEMwIEVNICAgQ3RybC1ZICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDI2LCAgLyogIDAyNiAgMDEvMTAgIEMwIFNVQiAgQ3RybC1aICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDI3LCAgLyogIDAyNyAgMDEvMTEgIEMwIEVTQyAgQ3RybC1bICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDI4LCAgLyogIDAyOCAgMDEvMTIgIEMwIEZTICAgQ3RybC1cICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDI5LCAgLyogIDAyOSAgMDEvMTMgIEMwIEdTICAgQ3RybC1dICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDMwLCAgLyogIDAzMCAgMDEvMTQgIEMwIFJTICAgQ3RybC1eICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDMxLCAgLyogIDAzMSAgMDEvMTUgIEMwIFVTICAgQ3RybC1fICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDMyLCAgLyogIDAzMiAgMDIvMDAgICAgIFNQICAgU3BhY2UgICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDMzLCAgLyogIDAzMyAgMDIvMDEgIEcwICEgICAgRXhjbGFtYXRpb24gbWFyayAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDM0LCAgLyogIDAzNCAgMDIvMDIgIEcwICIgICAgRG91YmxlcXVvdGUgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDM1LCAgLyogIDAzNSAgMDIvMDMgIEcwICMgICAgTnVtYmVyIHNpZ24gICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDM2LCAgLyogIDAzNiAgMDIvMDQgIEcwICQgICAgRG9sbGFyIHNpZ24gICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDM3LCAgLyogIDAzNyAgMDIvMDUgIEcwICUgICAgUGVyY2VudCBzaWduICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDM4LCAgLyogIDAzOCAgMDIvMDYgIEcwICYgICAgQW1wZXJzYW5kICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDM5LCAgLyogIDAzOSAgMDIvMDcgIEcwICcgICAgQXBvc3Ryb3BoZSAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDQwLCAgLyogIDA0MCAgMDIvMDggIEcwICggICAgTGVmdCBwYXJlbnRoZXNpcyAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDQxLCAgLyogIDA0MSAgMDIvMDkgIEcwICkgICAgUmlnaHQgcGFyZW50aGVzaXMgICAgICAgICA9PiAgKHNlbGYpICAqLworIDQyLCAgLyogIDA0MiAgMDIvMTAgIEcwICogICAgQXN0ZXJpc2sgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDQzLCAgLyogIDA0MyAgMDIvMTEgIEcwICsgICAgUGx1cyBzaWduICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDQ0LCAgLyogIDA0NCAgMDIvMTIgIEcwICwgICAgQ29tbWEgICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDQ1LCAgLyogIDA0NSAgMDIvMTMgIEcwIC0gICAgSHlwaGVuLCBtaW51cyBzaWduICAgICAgICA9PiAgKHNlbGYpICAqLworIDQ2LCAgLyogIDA0NiAgMDIvMTQgIEcwIC4gICAgUGVyaW9kLCBmdWxsIHN0b3AgICAgICAgICA9PiAgKHNlbGYpICAqLworIDQ3LCAgLyogIDA0NyAgMDIvMTUgIEcwIC8gICAgU2xhc2gsIHNvbGlkdXMgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDQ4LCAgLyogIDA0OCAgMDMvMDAgIEcwIDAgICAgRGlnaXQgMCAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDQ5LCAgLyogIDA0OSAgMDMvMDEgIEcwIDEgICAgRGlnaXQgMSAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDUwLCAgLyogIDA1MCAgMDMvMDIgIEcwIDIgICAgRGlnaXQgMiAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDUxLCAgLyogIDA1MSAgMDMvMDMgIEcwIDMgICAgRGlnaXQgMyAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDUyLCAgLyogIDA1MiAgMDMvMDQgIEcwIDQgICAgRGlnaXQgNCAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDUzLCAgLyogIDA1MyAgMDMvMDUgIEcwIDUgICAgRGlnaXQgNSAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDU0LCAgLyogIDA1NCAgMDMvMDYgIEcwIDYgICAgRGlnaXQgNiAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDU1LCAgLyogIDA1NSAgMDMvMDcgIEcwIDcgICAgRGlnaXQgNyAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDU2LCAgLyogIDA1NiAgMDMvMDggIEcwIDggICAgRGlnaXQgOCAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDU3LCAgLyogIDA1NyAgMDMvMDkgIEcwIDkgICAgRGlnaXQgOSAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDU4LCAgLyogIDA1OCAgMDMvMTAgIEcwIDogICAgQ29sb24gICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDU5LCAgLyogIDA1OSAgMDMvMTEgIEcwIDsgICAgU2VtaWNvbG9uICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDYwLCAgLyogIDA2MCAgMDMvMTIgIEcwIDwgICAgTGVzcy10aGFuIHNpZ24gICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDYxLCAgLyogIDA2MSAgMDMvMTMgIEcwID0gICAgRXF1YWxzIHNpZ24gICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDYyLCAgLyogIDA2MiAgMDMvMTQgIEcwID4gICAgR3JlYXRlci10aGFuIHNpZ24gICAgICAgICA9PiAgKHNlbGYpICAqLworIDYzLCAgLyogIDA2MyAgMDMvMTUgIEcwID8gICAgUXVlc3Rpb24gbWFyayAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDY0LCAgLyogIDA2NCAgMDQvMDAgIEcwIEAgICAgQ29tbWVyY2lhbCBhdCBzaWduICAgICAgICA9PiAgKHNlbGYpICAqLworIDY1LCAgLyogIDA2NSAgMDQvMDEgIEcwIEEgICAgTGV0dGVyIEEgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDY2LCAgLyogIDA2NiAgMDQvMDIgIEcwIEIgICAgTGV0dGVyIEIgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDY3LCAgLyogIDA2NyAgMDQvMDMgIEcwIEMgICAgTGV0dGVyIEMgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDY4LCAgLyogIDA2OCAgMDQvMDQgIEcwIEQgICAgTGV0dGVyIEQgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDY5LCAgLyogIDA2OSAgMDQvMDUgIEcwIEUgICAgTGV0dGVyIEUgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDcwLCAgLyogIDA3MCAgMDQvMDYgIEcwIEYgICAgTGV0dGVyIEYgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDcxLCAgLyogIDA3MSAgMDQvMDcgIEcwIEcgICAgTGV0dGVyIEcgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDcyLCAgLyogIDA3MiAgMDQvMDggIEcwIEggICAgTGV0dGVyIEggICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDczLCAgLyogIDA3MyAgMDQvMDkgIEcwIEkgICAgTGV0dGVyIEkgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDc0LCAgLyogIDA3NCAgMDQvMTAgIEcwIEogICAgTGV0dGVyIEogICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDc1LCAgLyogIDA3NSAgMDQvMTEgIEcwIEsgICAgTGV0dGVyIEsgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDc2LCAgLyogIDA3NiAgMDQvMTIgIEcwIEwgICAgTGV0dGVyIEwgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDc3LCAgLyogIDA3NyAgMDQvMTMgIEcwIE0gICAgTGV0dGVyIE0gICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDc4LCAgLyogIDA3OCAgMDQvMTQgIEcwIE4gICAgTGV0dGVyIE4gICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDc5LCAgLyogIDA3OSAgMDQvMTUgIEcwIE8gICAgTGV0dGVyIE8gICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDgwLCAgLyogIDA4MCAgMDUvMDAgIEcwIFAgICAgTGV0dGVyIFAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDgxLCAgLyogIDA4MSAgMDUvMDEgIEcwIFEgICAgTGV0dGVyIFEgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDgyLCAgLyogIDA4MiAgMDUvMDIgIEcwIFIgICAgTGV0dGVyIFIgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDgzLCAgLyogIDA4MyAgMDUvMDMgIEcwIFMgICAgTGV0dGVyIFMgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDg0LCAgLyogIDA4NCAgMDUvMDQgIEcwIFQgICAgTGV0dGVyIFQgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDg1LCAgLyogIDA4NSAgMDUvMDUgIEcwIFUgICAgTGV0dGVyIFUgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDg2LCAgLyogIDA4NiAgMDUvMDYgIEcwIFYgICAgTGV0dGVyIFYgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDg3LCAgLyogIDA4NyAgMDUvMDcgIEcwIFcgICAgTGV0dGVyIFcgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDg4LCAgLyogIDA4OCAgMDUvMDggIEcwIFggICAgTGV0dGVyIFggICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDg5LCAgLyogIDA4OSAgMDUvMDkgIEcwIFkgICAgTGV0dGVyIFkgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDkwLCAgLyogIDA5MCAgMDUvMTAgIEcwIFogICAgTGV0dGVyIFogICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDkxLCAgLyogIDA5MSAgMDUvMTEgIEcwIFsgICAgTGVmdCBzcXVhcmUgYnJhY2tldCAgICAgICA9PiAgKHNlbGYpICAqLworIDkyLCAgLyogIDA5MiAgMDUvMTIgIEcwIFwgICAgUmV2ZXJzZSBzbGFzaCAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDkzLCAgLyogIDA5MyAgMDUvMTMgIEcwIF0gICAgUmlnaHQgc3F1YXJlIGJyYWNrZXQgICAgICA9PiAgKHNlbGYpICAqLworIDk0LCAgLyogIDA5NCAgMDUvMTQgIEcwIF4gICAgQ2lyY3VtZmxleCBhY2NlbnQgICAgICAgICA9PiAgKHNlbGYpICAqLworIDk1LCAgLyogIDA5NSAgMDUvMTUgIEcwIF8gICAgVW5kZXJsaW5lLCBsb3cgbGluZSAgICAgICA9PiAgKHNlbGYpICAqLworIDk2LCAgLyogIDA5NiAgMDYvMDAgIEcwIGAgICAgR3JhdmUgYWNjZW50ICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDk3LCAgLyogIDA5NyAgMDYvMDEgIEcwIGEgICAgTGV0dGVyIGEgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDk4LCAgLyogIDA5OCAgMDYvMDIgIEcwIGIgICAgTGV0dGVyIGIgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworIDk5LCAgLyogIDA5OSAgMDYvMDMgIEcwIGMgICAgTGV0dGVyIGMgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTAwLCAgLyogIDEwMCAgMDYvMDQgIEcwIGQgICAgTGV0dGVyIGQgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTAxLCAgLyogIDEwMSAgMDYvMDUgIEcwIGUgICAgTGV0dGVyIGUgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTAyLCAgLyogIDEwMiAgMDYvMDYgIEcwIGYgICAgTGV0dGVyIGYgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTAzLCAgLyogIDEwMyAgMDYvMDcgIEcwIGcgICAgTGV0dGVyIGcgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTA0LCAgLyogIDEwNCAgMDYvMDggIEcwIGggICAgTGV0dGVyIGggICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTA1LCAgLyogIDEwNSAgMDYvMDkgIEcwIGkgICAgTGV0dGVyIGkgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTA2LCAgLyogIDEwNiAgMDYvMTAgIEcwIGogICAgTGV0dGVyIGogICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTA3LCAgLyogIDEwNyAgMDYvMTEgIEcwIGsgICAgTGV0dGVyIGsgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTA4LCAgLyogIDEwOCAgMDYvMTIgIEcwIGwgICAgTGV0dGVyIGwgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTA5LCAgLyogIDEwOSAgMDYvMTMgIEcwIG0gICAgTGV0dGVyIG0gICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTEwLCAgLyogIDExMCAgMDYvMTQgIEcwIG4gICAgTGV0dGVyIG4gICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTExLCAgLyogIDExMSAgMDYvMTUgIEcwIG8gICAgTGV0dGVyIG8gICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTEyLCAgLyogIDExMiAgMDcvMDAgIEcwIHAgICAgTGV0dGVyIHAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTEzLCAgLyogIDExMyAgMDcvMDEgIEcwIHEgICAgTGV0dGVyIHEgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTE0LCAgLyogIDExNCAgMDcvMDIgIEcwIHIgICAgTGV0dGVyIHIgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTE1LCAgLyogIDExNSAgMDcvMDMgIEcwIHMgICAgTGV0dGVyIHMgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTE2LCAgLyogIDExNiAgMDcvMDQgIEcwIHQgICAgTGV0dGVyIHQgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTE3LCAgLyogIDExNyAgMDcvMDUgIEcwIHUgICAgTGV0dGVyIHUgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTE4LCAgLyogIDExOCAgMDcvMDYgIEcwIHYgICAgTGV0dGVyIHYgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTE5LCAgLyogIDExOSAgMDcvMDcgIEcwIHcgICAgTGV0dGVyIHcgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTIwLCAgLyogIDEyMCAgMDcvMDggIEcwIHggICAgTGV0dGVyIHggICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTIxLCAgLyogIDEyMSAgMDcvMDkgIEcwIHkgICAgTGV0dGVyIHkgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTIyLCAgLyogIDEyMiAgMDcvMTAgIEcwIHogICAgTGV0dGVyIHogICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTIzLCAgLyogIDEyMyAgMDcvMTEgIEcwIHsgICAgTGVmdCBjdXJseSBicmFja2V0ICAgICAgICA9PiAgKHNlbGYpICAqLworMTI0LCAgLyogIDEyNCAgMDcvMTIgIEcwIHwgICAgVmVydGljYWwgYmFyICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTI1LCAgLyogIDEyNSAgMDcvMTMgIEcwIH0gICAgUmlnaHQgY3VybHkgYnJhY2tldCAgICAgICA9PiAgKHNlbGYpICAqLworMTI2LCAgLyogIDEyNiAgMDcvMTQgIEcwIH4gICAgVGlsZGUgICAgICAgICAgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworMTI3LCAgLyogIDEyNyAgMDcvMTUgICAgIERFTCAgRGVsZXRlLCBSdWJvdXQgICAgICAgICAgICA9PiAgKHNlbGYpICAqLworVU5LLCAgLyogIDEyOCAgMDgvMDAgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDEyOSAgMDgvMDEgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDEzMCAgMDgvMDIgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDEzMSAgMDgvMDMgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDEzMiAgMDgvMDQgIEMxIElORCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDEzMyAgMDgvMDUgIEMxIE5FTCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDEzNCAgMDgvMDYgIEMxIFNTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDEzNSAgMDgvMDcgIEMxIEVTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDEzNiAgMDgvMDggIEMxIEhUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDEzNyAgMDgvMDkgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDEzOCAgMDgvMTAgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDEzOSAgMDgvMTEgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE0MCAgMDgvMTIgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE0MSAgMDgvMTMgIEMxIFJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE0MiAgMDgvMTQgIEMxIFNTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE0MyAgMDgvMTUgIEMxIFNTMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE0NCAgMDkvMDAgIEMxIERDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE0NSAgMDkvMDEgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE0NiAgMDkvMDIgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE0NyAgMDkvMDMgIEMxIFNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE0OCAgMDkvMDQgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE0OSAgMDkvMDUgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE1MCAgMDkvMDYgIEMxIFNQQSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE1MSAgMDkvMDcgIEMxIEVQQSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE1MiAgMDkvMDggIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE1MyAgMDkvMDkgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE1NCAgMDkvMTAgIEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE1NSAgMDkvMTEgIEMxIENTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE1NiAgMDkvMTIgIEMxIFNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE1NyAgMDkvMTMgIEMxIE9TQyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE1OCAgMDkvMTQgIEMxIFBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE1OSAgMDkvMTUgIEMxIEFQQyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworIDMyLCAgLyogIDE2MCAgMTAvMDAgIEcxICAgICAgTm8tYnJlYWsgc3BhY2UgICAgICAgICAgICA9PiAgU1AgICAgICAqLworIDMzLCAgLyogIDE2MSAgMTAvMDEgIEcxICAgICAgSW52ZXJ0ZWQgZXhjbGFtYXRpb24gICAgICA9PiAgISAgICAgICAqLworIDk5LCAgLyogIDE2MiAgMTAvMDIgIEcxICAgICAgQ2VudCBzaWduICAgICAgICAgICAgICAgICA9PiAgYyAgICAgICAqLworIDM1LCAgLyogIDE2MyAgMTAvMDMgIEcxICAgICAgUG91bmQgc2lnbiAgICAgICAgICAgICAgICA9PiAgIyAgICAgICAqLworIDM2LCAgLyogIDE2NCAgMTAvMDQgIEcxICAgICAgQ3VycmVuY3kgc2lnbiAgICAgICAgICAgICA9PiAgJCAgICAgICAqLworIDg5LCAgLyogIDE2NSAgMTAvMDUgIEcxICAgICAgWWVuIHNpZ24gICAgICAgICAgICAgICAgICA9PiAgWSAgICAgICAqLworMTI0LCAgLyogIDE2NiAgMTAvMDYgIEcxICAgICAgQnJva2VuIGJhciAgICAgICAgICAgICAgICA9PiAgfCAgICAgICAqLworIDgwLCAgLyogIDE2NyAgMTAvMDcgIEcxICAgICAgUGFyYWdyYXBoIHNpZ24gICAgICAgICAgICA9PiAgUCAgICAgICAqLworIDM0LCAgLyogIDE2OCAgMTAvMDggIEcxICAgICAgRGlhZXJlc2lzICAgICAgICAgICAgICAgICA9PiAgIiAgICAgICAqLworIDY3LCAgLyogIDE2OSAgMTAvMDkgIEcxICAgICAgQ29weXJpZ2h0IHNpZ24gICAgICAgICAgICA9PiAgQyAgICAgICAqLworIDk3LCAgLyogIDE3MCAgMTAvMTAgIEcxICAgICAgRmVtaW5pbmUgb3JkaW5hbCAgICAgICAgICA9PiAgYSAgICAgICAqLworIDM0LCAgLyogIDE3MSAgMTAvMTEgIEcxICAgICAgTGVmdCBhbmdsZSBxdW90YXRpb24gICAgICA9PiAgIiAgICAgICAqLworMTI2LCAgLyogIDE3MiAgMTAvMTIgIEcxICAgICAgTm90IHNpZ24gICAgICAgICAgICAgICAgICA9PiAgfiAgICAgICAqLworIDQ1LCAgLyogIDE3MyAgMTAvMTMgIEcxICAgICAgU29mdCBoeXBoZW4gICAgICAgICAgICAgICA9PiAgLSAgICAgICAqLworIDgyLCAgLyogIDE3NCAgMTAvMTQgIEcxICAgICAgUmVnaXN0ZXJlZCB0cmFkZSBtYXJrICAgICA9PiAgUiAgICAgICAqLworIDk1LCAgLyogIDE3NSAgMTAvMTUgIEcxICAgICAgTWFjcm9uICAgICAgICAgICAgICAgICAgICA9PiAgXyAgICAgICAqLworMTExLCAgLyogIDE3NiAgMTEvMDAgIEcxICAgICAgRGVncmVlIHNpZ24sIHJpbmcgYWJvdmUgICA9PiAgbyAgICAgICAqLworVU5LLCAgLyogIDE3NyAgMTEvMDEgIEcxICAgICAgUGx1cy1taW51cyBzaWduICAgICAgICAgICA9PiAgVU5LICAgICAqLworIDUwLCAgLyogIDE3OCAgMTEvMDIgIEcxICAgICAgU3VwZXJzY3JpcHQgdHdvICAgICAgICAgICA9PiAgMiAgICAgICAqLworIDUxLCAgLyogIDE3OSAgMTEvMDMgIEcxICAgICAgU3VwZXJzY3JpcHQgdGhyZWUgICAgICAgICA9PiAgMyAgICAgICAqLworIDM5LCAgLyogIDE4MCAgMTEvMDQgIEcxICAgICAgQWN1dGUgYWNjZW50ICAgICAgICAgICAgICA9PiAgJyAgICAgICAqLworMTE3LCAgLyogIDE4MSAgMTEvMDUgIEcxICAgICAgTWljcm8gc2lnbiAgICAgICAgICAgICAgICA9PiAgdSAgICAgICAqLworIDQ1LCAgLyogIDE4MiAgMTEvMDYgIEcxICAgICAgUGlsY3JvdyBzaWduICAgICAgICAgICAgICA9PiAgLSAgICAgICAqLworIDQ1LCAgLyogIDE4MyAgMTEvMDcgIEcxICAgICAgTWlkZGxlIGRvdCAgICAgICAgICAgICAgICA9PiAgLSAgICAgICAqLworIDQ0LCAgLyogIDE4NCAgMTEvMDggIEcxICAgICAgQ2VkaWxsYSAgICAgICAgICAgICAgICAgICA9PiAgLCAgICAgICAqLworIDQ5LCAgLyogIDE4NSAgMTEvMDkgIEcxICAgICAgU3VwZXJzY3JpcHQgb25lICAgICAgICAgICA9PiAgMSAgICAgICAqLworMTExLCAgLyogIDE4NiAgMTEvMTAgIEcxICAgICAgTWFzY3VsaW5lIG9yZGluYWwgICAgICAgICA9PiAgbyAgICAgICAqLworIDM0LCAgLyogIDE4NyAgMTEvMTEgIEcxICAgICAgUmlnaHQgYW5nbGUgcXVvdGF0aW9uICAgICA9PiAgIiAgICAgICAqLworVU5LLCAgLyogIDE4OCAgMTEvMTIgIEcxICAgICAgT25lIHF1YXJ0ZXIgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE4OSAgMTEvMTMgIEcxICAgICAgT25lIGhhbGYgICAgICAgICAgICAgICAgICA9PiAgVU5LICAgICAqLworVU5LLCAgLyogIDE5MCAgMTEvMTQgIEcxICAgICAgVGhyZWUgcXVhcnRlcnMgICAgICAgICAgICA9PiAgVU5LICAgICAqLworIDYzLCAgLyogIDE5MSAgMTEvMTUgIEcxICAgICAgSW52ZXJ0ZWQgcXVlc3Rpb24gbWFyayAgICA9PiAgPyAgICAgICAqLworIDY1LCAgLyogIDE5MiAgMTIvMDAgIEcxICAgICAgQSBncmF2ZSAgICAgICAgICAgICAgICAgICA9PiAgQSAgICAgICAqLworIDY1LCAgLyogIDE5MyAgMTIvMDEgIEcxICAgICAgQSBhY3V0ZSAgICAgICAgICAgICAgICAgICA9PiAgQSAgICAgICAqLworIDY1LCAgLyogIDE5NCAgMTIvMDIgIEcxICAgICAgQSBjaXJjdW1mbGV4ICAgICAgICAgICAgICA9PiAgQSAgICAgICAqLworIDY1LCAgLyogIDE5NSAgMTIvMDMgIEcxICAgICAgQSB0aWxkZSAgICAgICAgICAgICAgICAgICA9PiAgQSAgICAgICAqLworIDY1LCAgLyogIDE5NiAgMTIvMDQgIEcxICAgICAgQSBkaWFlcmVzaXMgICAgICAgICAgICAgICA9PiAgQSAgICAgICAqLworIDY1LCAgLyogIDE5NyAgMTIvMDUgIEcxICAgICAgQSByaW5nIGFib3ZlICAgICAgICAgICAgICA9PiAgQSAgICAgICAqLworIDY1LCAgLyogIDE5OCAgMTIvMDYgIEcxICAgICAgQSB3aXRoIEUgICAgICAgICAgICAgICAgICA9PiAgQSAgICAgICAqLworIDY3LCAgLyogIDE5OSAgMTIvMDcgIEcxICAgICAgQyBDZWRpbGxhICAgICAgICAgICAgICAgICA9PiAgQyAgICAgICAqLworIDY5LCAgLyogIDIwMCAgMTIvMDggIEcxICAgICAgRSBncmF2ZSAgICAgICAgICAgICAgICAgICA9PiAgRSAgICAgICAqLworIDY5LCAgLyogIDIwMSAgMTIvMDkgIEcxICAgICAgRSBhY3V0ZSAgICAgICAgICAgICAgICAgICA9PiAgRSAgICAgICAqLworIDY5LCAgLyogIDIwMiAgMTIvMTAgIEcxICAgICAgRSBjaXJjdW1mbGV4ICAgICAgICAgICAgICA9PiAgRSAgICAgICAqLworIDY5LCAgLyogIDIwMyAgMTIvMTEgIEcxICAgICAgRSBkaWFlcmVzaXMgICAgICAgICAgICAgICA9PiAgRSAgICAgICAqLworIDczLCAgLyogIDIwNCAgMTIvMTIgIEcxICAgICAgSSBncmF2ZSAgICAgICAgICAgICAgICAgICA9PiAgSSAgICAgICAqLworIDczLCAgLyogIDIwNSAgMTIvMTMgIEcxICAgICAgSSBhY3V0ZSAgICAgICAgICAgICAgICAgICA9PiAgSSAgICAgICAqLworIDczLCAgLyogIDIwNiAgMTIvMTQgIEcxICAgICAgSSBjaXJjdW1mbGV4ICAgICAgICAgICAgICA9PiAgSSAgICAgICAqLworIDczLCAgLyogIDIwNyAgMTIvMTUgIEcxICAgICAgSSBkaWFlcmVzaXMgICAgICAgICAgICAgICA9PiAgSSAgICAgICAqLworIDY4LCAgLyogIDIwOCAgMTMvMDAgIEcxICAgICAgSWNlbGFuZGljIEV0aCAgICAgICAgICAgICA9PiAgRCAgICAgICAqLworIDc4LCAgLyogIDIwOSAgMTMvMDEgIEcxICAgICAgTiB0aWxkZSAgICAgICAgICAgICAgICAgICA9PiAgTiAgICAgICAqLworIDc5LCAgLyogIDIxMCAgMTMvMDIgIEcxICAgICAgTyBncmF2ZSAgICAgICAgICAgICAgICAgICA9PiAgTyAgICAgICAqLworIDc5LCAgLyogIDIxMSAgMTMvMDMgIEcxICAgICAgTyBhY3V0ZSAgICAgICAgICAgICAgICAgICA9PiAgTyAgICAgICAqLworIDc5LCAgLyogIDIxMiAgMTMvMDQgIEcxICAgICAgTyBjaXJjdW1mbGV4ICAgICAgICAgICAgICA9PiAgTyAgICAgICAqLworIDc5LCAgLyogIDIxMyAgMTMvMDUgIEcxICAgICAgTyB0aWxkZSAgICAgICAgICAgICAgICAgICA9PiAgTyAgICAgICAqLworIDc5LCAgLyogIDIxNCAgMTMvMDYgIEcxICAgICAgTyBkaWFlcmVzaXMgICAgICAgICAgICAgICA9PiAgTyAgICAgICAqLworMTIwLCAgLyogIDIxNSAgMTMvMDcgIEcxICAgICAgTXVsdGlwbGljYXRpb24gc2lnbiAgICAgICA9PiAgeCAgICAgICAqLworIDc5LCAgLyogIDIxNiAgMTMvMDggIEcxICAgICAgTyBvYmxpcXVlIHN0cm9rZSAgICAgICAgICA9PiAgTyAgICAgICAqLworIDg1LCAgLyogIDIxNyAgMTMvMDkgIEcxICAgICAgVSBncmF2ZSAgICAgICAgICAgICAgICAgICA9PiAgVSAgICAgICAqLworIDg1LCAgLyogIDIxOCAgMTMvMTAgIEcxICAgICAgVSBhY3V0ZSAgICAgICAgICAgICAgICAgICA9PiAgVSAgICAgICAqLworIDg1LCAgLyogIDIxOSAgMTMvMTEgIEcxICAgICAgVSBjaXJjdW1mbGV4ICAgICAgICAgICAgICA9PiAgVSAgICAgICAqLworIDg1LCAgLyogIDIyMCAgMTMvMTIgIEcxICAgICAgVSBkaWFlcmVzaXMgICAgICAgICAgICAgICA9PiAgVSAgICAgICAqLworIDg5LCAgLyogIDIyMSAgMTMvMTMgIEcxICAgICAgWSBhY3V0ZSAgICAgICAgICAgICAgICAgICA9PiAgWSAgICAgICAqLworIDg0LCAgLyogIDIyMiAgMTMvMTQgIEcxICAgICAgSWNlbGFuZGljIFRob3JuICAgICAgICAgICA9PiAgVCAgICAgICAqLworMTE1LCAgLyogIDIyMyAgMTMvMTUgIEcxICAgICAgR2VybWFuIHNoYXJwIHMgICAgICAgICAgICA9PiAgcyAgICAgICAqLworIDk3LCAgLyogIDIyNCAgMTQvMDAgIEcxICAgICAgYSBncmF2ZSAgICAgICAgICAgICAgICAgICA9PiAgYSAgICAgICAqLworIDk3LCAgLyogIDIyNSAgMTQvMDEgIEcxICAgICAgYSBhY3V0ZSAgICAgICAgICAgICAgICAgICA9PiAgYSAgICAgICAqLworIDk3LCAgLyogIDIyNiAgMTQvMDIgIEcxICAgICAgYSBjaXJjdW1mbGV4ICAgICAgICAgICAgICA9PiAgYSAgICAgICAqLworIDk3LCAgLyogIDIyNyAgMTQvMDMgIEcxICAgICAgYSB0aWxkZSAgICAgICAgICAgICAgICAgICA9PiAgYSAgICAgICAqLworIDk3LCAgLyogIDIyOCAgMTQvMDQgIEcxICAgICAgYSBkaWFlcmVzaXMgICAgICAgICAgICAgICA9PiAgYSAgICAgICAqLworIDk3LCAgLyogIDIyOSAgMTQvMDUgIEcxICAgICAgYSByaW5nIGFib3ZlICAgICAgICAgICAgICA9PiAgYSAgICAgICAqLworIDk3LCAgLyogIDIzMCAgMTQvMDYgIEcxICAgICAgYSB3aXRoIGUgICAgICAgICAgICAgICAgICA9PiAgYSAgICAgICAqLworIDk5LCAgLyogIDIzMSAgMTQvMDcgIEcxICAgICAgYyBjZWRpbGxhICAgICAgICAgICAgICAgICA9PiAgYyAgICAgICAqLworMTAxLCAgLyogIDIzMiAgMTQvMDggIEcxICAgICAgZSBncmF2ZSAgICAgICAgICAgICAgICAgICA9PiAgZSAgICAgICAqLworMTAxLCAgLyogIDIzMyAgMTQvMDkgIEcxICAgICAgZSBhY3V0ZSAgICAgICAgICAgICAgICAgICA9PiAgZSAgICAgICAqLworMTAxLCAgLyogIDIzNCAgMTQvMTAgIEcxICAgICAgZSBjaXJjdW1mbGV4ICAgICAgICAgICAgICA9PiAgZSAgICAgICAqLworMTAxLCAgLyogIDIzNSAgMTQvMTEgIEcxICAgICAgZSBkaWFlcmVzaXMgICAgICAgICAgICAgICA9PiAgZSAgICAgICAqLworMTA1LCAgLyogIDIzNiAgMTQvMTIgIEcxICAgICAgaSBncmF2ZSAgICAgICAgICAgICAgICAgICA9PiAgaSAgICAgICAqLworMTA1LCAgLyogIDIzNyAgMTQvMTMgIEcxICAgICAgaSBhY3V0ZSAgICAgICAgICAgICAgICAgICA9PiAgaSAgICAgICAqLworMTA1LCAgLyogIDIzOCAgMTQvMTQgIEcxICAgICAgaSBjaXJjdW1mbGV4ICAgICAgICAgICAgICA9PiAgaSAgICAgICAqLworMTA1LCAgLyogIDIzOSAgMTQvMTUgIEcxICAgICAgaSBkaWFlcmVzaXMgICAgICAgICAgICAgICA9PiAgaSAgICAgICAqLworMTAwLCAgLyogIDI0MCAgMTUvMDAgIEcxICAgICAgSWNlbGFuZGljIGV0aCAgICAgICAgICAgICA9PiAgZCAgICAgICAqLworMTEwLCAgLyogIDI0MSAgMTUvMDEgIEcxICAgICAgbiB0aWxkZSAgICAgICAgICAgICAgICAgICA9PiAgbiAgICAgICAqLworMTExLCAgLyogIDI0MiAgMTUvMDIgIEcxICAgICAgbyBncmF2ZSAgICAgICAgICAgICAgICAgICA9PiAgbyAgICAgICAqLworMTExLCAgLyogIDI0MyAgMTUvMDMgIEcxICAgICAgbyBhY3V0ZSAgICAgICAgICAgICAgICAgICA9PiAgbyAgICAgICAqLworMTExLCAgLyogIDI0NCAgMTUvMDQgIEcxICAgICAgbyBjaXJjdW1mbGV4ICAgICAgICAgICAgICA9PiAgbyAgICAgICAqLworMTExLCAgLyogIDI0NSAgMTUvMDUgIEcxICAgICAgbyB0aWxkZSAgICAgICAgICAgICAgICAgICA9PiAgbyAgICAgICAqLworMTExLCAgLyogIDI0NiAgMTUvMDYgIEcxICAgICAgbyBkaWFlcmVzaXMgICAgICAgICAgICAgICA9PiAgbyAgICAgICAqLworIDQ3LCAgLyogIDI0NyAgMTUvMDcgIEcxICAgICAgRGl2aXNpb24gc2lnbiAgICAgICAgICAgICA9PiAgLyAgICAgICAqLworMTExLCAgLyogIDI0OCAgMTUvMDggIEcxICAgICAgbyBvYmxpcXVlIHN0cm9rZSAgICAgICAgICA9PiAgbyAgICAgICAqLworMTE3LCAgLyogIDI0OSAgMTUvMDkgIEcxICAgICAgdSBncmF2ZSAgICAgICAgICAgICAgICAgICA9PiAgdSAgICAgICAqLworMTE3LCAgLyogIDI1MCAgMTUvMTAgIEcxICAgICAgdSBhY3V0ZSAgICAgICAgICAgICAgICAgICA9PiAgdSAgICAgICAqLworMTE3LCAgLyogIDI1MSAgMTUvMTEgIEcxICAgICAgdSBjaXJjdW1mbGV4ICAgICAgICAgICAgICA9PiAgdSAgICAgICAqLworMTE3LCAgLyogIDI1MiAgMTUvMTIgIEcxICAgICAgdSBkaWFlcmVzaXMgICAgICAgICAgICAgICA9PiAgdSAgICAgICAqLworMTIxLCAgLyogIDI1MyAgMTUvMTMgIEcxICAgICAgeSBhY3V0ZSAgICAgICAgICAgICAgICAgICA9PiAgeSAgICAgICAqLworMTE2LCAgLyogIDI1NCAgMTUvMTQgIEcxICAgICAgSWNlbGFuZGljIHRob3JuICAgICAgICAgICA9PiAgdCAgICAgICAqLworMTIxICAgLyogIDI1NSAgMTUvMTUgIEcxICAgICAgeSBkaWFlcmVzaXMgICAgICAgICAgICAgICA9PiAgeSAgICAgICAqLworfTsKKworCisvKiBUcmFuc2xhdGlvbiB0YWJsZXMgZm9yIElTTyBMYXRpbiBBbHBoYWJldCAxIHRvIGxvY2FsIGZpbGUgY2hhcmFjdGVyIHNldHMgKi8KKworLyoKKyAgTW9zdCBvZiB0aGUgcmVtYWluaW5nIHRhYmxlcyBhcmUgbm90IGFubm90YXRlZCBsaWtlIHRoZSBvbmUgYWJvdmUsIGJlY2F1c2UKKyAgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBzb3VyY2UgZmlsZSB3b3VsZCBiZSByaWRpY3Vsb3VzLiAgRWFjaCByb3cgaW4gdGhlCisgIGZvbGxvd2luZyB0YWJsZXMgY29ycmVzcG9uZHMgdG8gYSBjb2x1bW4gb2YgSVNPIDg4NTktMS4KKyovCisKK0NPTlNUIENIQVIKK3lsMTg1W10gPSB7ICAvKiBJU08gODg1OS0xIExhdGluIEFscGhhYmV0IDEgKExhdGluLTEpIHRvIElCTSBDb2RlIFBhZ2UgODUwICovCisvKgorICBUaGlzIGlzIGJhc2VkIG9uIElCTSdzIG9mZmljaWFsIGludmVydGlibGUgdHJhbnNsYXRpb24uICBSZWZlcmVuY2U6IElCTQorICBDaGFyYWN0ZXIgRGF0YSBSZXByZXNlbnRhdGlvbiBBcmNoaXRlY3R1cmUgKENEUkEpLCBMZXZlbCAxLCBSZWdpc3RyeSwKKyAgU0MwOS0xMjkxLTAwICgxOTkwKSwgcC4xNTIuICAoTm90ZTogTGF0aW4tMSBpcyBJQk0gQ29kZSBQYWdlIDAwODE5LikgIE5vdGU6CisgIElCTSdzIGJpemFycmUgcmVhcnJhbmdlbWVudCBvZiBDMCBjb250cm9scyBhbmQgREVMIGhhcyBiZWVuIHVuZG9uZSBpbiB0aGlzCisgIHRhYmxlLgorKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKzE4NiwgMjA1LCAyMDEsIDE4NywgMjAwLCAxODgsIDIwNCwgMTg1LCAyMDMsIDIwMiwgMjA2LCAyMjMsIDIyMCwgMjE5LCAyNTQsIDI0MiwKKzE3OSwgMTk2LCAyMTgsIDE5MSwgMTkyLCAyMTcsIDE5NSwgMTgwLCAxOTQsIDE5MywgMTk3LCAxNzYsIDE3NywgMTc4LCAyMTMsIDE1OSwKKzI1NSwgMTczLCAxODksIDE1NiwgMjA3LCAxOTAsIDIyMSwgMjQ1LCAyNDksIDE4NCwgMTY2LCAxNzQsIDE3MCwgMjQwLCAxNjksIDIzOCwKKzI0OCwgMjQxLCAyNTMsIDI1MiwgMjM5LCAyMzAsIDI0NCwgMjUwLCAyNDcsIDI1MSwgMTY3LCAxNzUsIDE3MiwgMTcxLCAyNDMsIDE2OCwKKzE4MywgMTgxLCAxODIsIDE5OSwgMTQyLCAxNDMsIDE0NiwgMTI4LCAyMTIsIDE0NCwgMjEwLCAyMTEsIDIyMiwgMjE0LCAyMTUsIDIxNiwKKzIwOSwgMTY1LCAyMjcsIDIyNCwgMjI2LCAyMjksIDE1MywgMTU4LCAxNTcsIDIzNSwgMjMzLCAyMzQsIDE1NCwgMjM3LCAyMzIsIDIyNSwKKzEzMywgMTYwLCAxMzEsIDE5OCwgMTMyLCAxMzQsIDE0NSwgMTM1LCAxMzgsIDEzMCwgMTM2LCAxMzcsIDE0MSwgMTYxLCAxNDAsIDEzOSwKKzIwOCwgMTY0LCAxNDksIDE2MiwgMTQ3LCAyMjgsIDE0OCwgMjQ2LCAxNTUsIDE1MSwgMTYzLCAxNTAsIDEyOSwgMjM2LCAyMzEsIDE1MgorfTsKKworQ09OU1QgQ0hBUgoreTg1bDFbXSA9IHsgIC8qIElCTSBDb2RlIFBhZ2UgODUwIHRvIExhdGluLTEgKi8KKy8qCisgIFRoaXMgaXMgZnJvbSBJQk0gQ0RSQSBwYWdlIDE1My4gIEl0IGlzIHRoZSBpbnZlcnNlIG9mIHlsMTg1W10uCisgIEFzIG9mIGVkaXQgMTgzLCB0aGlzIHRhYmxlIGlzIG5vIGxvbmdlciBwdXJlIENEUkEuICBUaGUgdHJhbnNsYXRpb25zCisgIGludm9sdmluZyBDMCBjb250cm9scyBhbmQgREVMIGhhdmUgYmVlbiByZW1vdmVkLgorKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKzE5OSwgMjUyLCAyMzMsIDIyNiwgMjI4LCAyMjQsIDIyOSwgMjMxLCAyMzQsIDIzNSwgMjMyLCAyMzksIDIzOCwgMjM2LCAxOTYsIDE5NywKKzIwMSwgMjMwLCAxOTgsIDI0NCwgMjQ2LCAyNDIsIDI1MSwgMjQ5LCAyNTUsIDIxNCwgMjIwLCAyNDgsIDE2MywgMjE2LCAyMTUsIDE1OSwKKzIyNSwgMjM3LCAyNDMsIDI1MCwgMjQxLCAyMDksIDE3MCwgMTg2LCAxOTEsIDE3NCwgMTcyLCAxODksIDE4OCwgMTYxLCAxNzEsIDE4NywKKzE1NSwgMTU2LCAxNTcsIDE0NCwgMTUxLCAxOTMsIDE5NCwgMTkyLCAxNjksIDEzNSwgMTI4LCAxMzEsIDEzMywgMTYyLCAxNjUsIDE0NywKKzE0OCwgMTUzLCAxNTIsIDE1MCwgMTQ1LCAxNTQsIDIyNywgMTk1LCAxMzIsIDEzMCwgMTM3LCAxMzYsIDEzNCwgMTI5LCAxMzgsIDE2NCwKKzI0MCwgMjA4LCAyMDIsIDIwMywgMjAwLCAxNTgsIDIwNSwgMjA2LCAyMDcsIDE0OSwgMTQ2LCAxNDEsIDE0MCwgMTY2LCAyMDQsIDEzOSwKKzIxMSwgMjIzLCAyMTIsIDIxMCwgMjQ1LCAyMTMsIDE4MSwgMjU0LCAyMjIsIDIxOCwgMjE5LCAyMTcsIDI1MywgMjIxLCAxNzUsIDE4MCwKKzE3MywgMTc3LCAxNDMsIDE5MCwgMTgyLCAxNjcsIDI0NywgMTg0LCAxNzYsIDE2OCwgMTgzLCAxODUsIDE3OSwgMTc4LCAxNDIsIDE2MAorfTsKKworI2lmZGVmIENPTU1FTlQKK0NPTlNUIENIQVIKK3lsMXI4W10gPSB7ICAvKiBMYXRpbi0xIHRvIEhld2xldHQgUGFja2FyZCBSb21hbjggKi8KKy8qIFRoaXMgaXMgSFAncyBvZmZpY2lhbCB0cmFuc2xhdGlvbiwgc3RyYWlnaHQgZnJvbSBpY29udiAqLworLyogSXQgaXMgTk9UIGludmVydGlibGUuICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsCisxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksCisxNjAsIDE4NCwgMTkxLCAxODcsIDE4NiwgMTg4LCAxMjQsIDE4OSwgMTcxLCAgOTksIDI0OSwgMjUxLCAxMjYsICA0NSwgIDgyLCAxNzYsCisxNzksIDI1NCwgIDUwLCAgNTEsIDE2OCwgMjQzLCAyNDQsIDI0MiwgIDQ0LCAgNDksIDI1MCwgMjUzLCAyNDcsIDI0OCwgMjQ1LCAxODUsCisxNjEsIDIyNCwgMTYyLCAyMjUsIDIxNiwgMjA4LCAyMTEsIDE4MCwgMTYzLCAyMjAsIDE2NCwgMTY1LCAyMzAsIDIyOSwgMTY2LCAxNjcsCisyMjcsIDE4MiwgMjMyLCAyMzEsIDIyMywgMjMzLCAyMTgsIDEyMCwgMjEwLCAxNzMsIDIzNywgMTc0LCAyMTksIDE3NywgMjQwLCAyMjIsCisyMDAsIDE5NiwgMTkyLCAyMjYsIDIwNCwgMjEyLCAyMTUsIDE4MSwgMjAxLCAxOTcsIDE5MywgMjA1LCAyMTcsIDIxMywgMjA5LCAyMjEsCisyMjgsIDE4MywgMjAyLCAxOTgsIDE5NCwgMjM0LCAyMDYsICA0NywgMjE0LCAyMDMsIDE5OSwgMTk1LCAyMDcsIDE3OCwgMjQxLCAyMzkKK307CitDT05TVCBDSEFSCit5cjhsMVtdID0geyAgLyogSGV3bGV0dCBQYWNrYXJkIFJvbWFuOCB0byBMYXRpbi0xICovCisvKiBUaGlzIGlzIEhQJ3Mgb2ZmaWNpYWwgdHJhbnNsYXRpb24sIHN0cmFpZ2h0IGZyb20gaWNvbnYgKi8KKy8qIEl0IGlzIE5PVCBpbnZlcnRpYmxlLiAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAorMTYwLCAxOTIsIDE5NCwgMjAwLCAyMDIsIDIwMywgMjA2LCAyMDcsIDE4MCwgIDk2LCAgOTQsIDE2OCwgMTI2LCAyMTcsIDIxOSwgMTYzLAorMTc1LCAyMjEsIDI1MywgMTc2LCAxOTksIDIzMSwgMjA5LCAyNDEsIDE2MSwgMTkxLCAxNjQsIDE2MywgMTY1LCAxNjcsIDEwMiwgMTYyLAorMjI2LCAyMzQsIDI0NCwgMjUxLCAyMjUsIDIzMywgMjQzLCAyNTAsIDIyNCwgMjMyLCAyNDIsIDI0OSwgMjI4LCAyMzUsIDI0NiwgMjUyLAorMTk3LCAyMzgsIDIxNiwgMTk4LCAyMjksIDIzNywgMjQ4LCAyMzAsIDE5NiwgMjM2LCAyMTQsIDIyMCwgMjAxLCAyMzksIDIyMywgMjEyLAorMTkzLCAxOTUsIDIyNywgMjA4LCAyNDAsIDIwNSwgMjA0LCAyMTEsIDIxMCwgMjEzLCAyNDUsICA4MywgMTE1LCAyMTgsICA4OSwgMjU1LAorMjIyLCAyNTQsIDE4MywgMTgxLCAxODIsIDE5MCwgIDQ1LCAxODgsIDE4OSwgMTcwLCAxODYsIDE3MSwgIDQyLCAxODcsIDE3NywgMTYwCit9OworI2Vsc2UgLyogIUNPTU1FTlQgKi8KKy8qIFRoaXMgaXMgYW4gaW52ZXJ0aWJsZSBtYXBwaW5nLCBhcHByb3ZlZCBieSBIUCBpbiBKYW51YXJ5IDE5OTQuICovCitDT05TVCBDSEFSCit5bDFyOFtdID0geyAgLyogSVNPIExhdGluLTEgdG8gSFAgUm9tYW44LCBJbnZlcnRpYmxlICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsCisxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksCisxNjAsIDE4NCwgMTkxLCAxODcsIDE4NiwgMTg4LCAxNjksIDE4OSwgMTcxLCAxNzAsIDI0OSwgMjUxLCAxNzIsIDE3NSwgMTkwLCAxNzYsCisxNzksIDI1NCwgMjM1LCAyMzYsIDE2OCwgMjQzLCAyNDQsIDI0MiwgMjM4LCAyNDYsIDI1MCwgMjUzLCAyNDcsIDI0OCwgMjQ1LCAxODUsCisxNjEsIDIyNCwgMTYyLCAyMjUsIDIxNiwgMjA4LCAyMTEsIDE4MCwgMTYzLCAyMjAsIDE2NCwgMTY1LCAyMzAsIDIyOSwgMTY2LCAxNjcsCisyMjcsIDE4MiwgMjMyLCAyMzEsIDIyMywgMjMzLCAyMTgsIDI1MiwgMjEwLCAxNzMsIDIzNywgMTc0LCAyMTksIDE3NywgMjQwLCAyMjIsCisyMDAsIDE5NiwgMTkyLCAyMjYsIDIwNCwgMjEyLCAyMTUsIDE4MSwgMjAxLCAxOTcsIDE5MywgMjA1LCAyMTcsIDIxMywgMjA5LCAyMjEsCisyMjgsIDE4MywgMjAyLCAxOTgsIDE5NCwgMjM0LCAyMDYsIDI1NSwgMjE0LCAyMDMsIDE5OSwgMTk1LCAyMDcsIDE3OCwgMjQxLCAyMzkKK307CisKK0NPTlNUIENIQVIKK3lyOGwxW10gPSB7IC8qIEhQIFJvbWFuOCB0byBJU08gTGF0aW4tMSwgSW52ZXJ0aWJsZSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAorMTYwLCAxOTIsIDE5NCwgMjAwLCAyMDIsIDIwMywgMjA2LCAyMDcsIDE4MCwgMTY2LCAxNjksIDE2OCwgMTcyLCAyMTcsIDIxOSwgMTczLAorMTc1LCAyMjEsIDI1MywgMTc2LCAxOTksIDIzMSwgMjA5LCAyNDEsIDE2MSwgMTkxLCAxNjQsIDE2MywgMTY1LCAxNjcsIDE3NCwgMTYyLAorMjI2LCAyMzQsIDI0NCwgMjUxLCAyMjUsIDIzMywgMjQzLCAyNTAsIDIyNCwgMjMyLCAyNDIsIDI0OSwgMjI4LCAyMzUsIDI0NiwgMjUyLAorMTk3LCAyMzgsIDIxNiwgMTk4LCAyMjksIDIzNywgMjQ4LCAyMzAsIDE5NiwgMjM2LCAyMTQsIDIyMCwgMjAxLCAyMzksIDIyMywgMjEyLAorMTkzLCAxOTUsIDIyNywgMjA4LCAyNDAsIDIwNSwgMjA0LCAyMTEsIDIxMCwgMjEzLCAyNDUsIDE3OCwgMTc5LCAyMTgsIDE4NCwgMjU1LAorMjIyLCAyNTQsIDE4MywgMTgxLCAxODIsIDE5MCwgMTg1LCAxODgsIDE4OSwgMTcwLCAxODYsIDE3MSwgMjE1LCAxODcsIDE3NywgMjQ3Cit9OworI2VuZGlmIC8qIENPTU1FTlQgKi8KKworQ09OU1QgQ0hBUgoreWwxNDNbXSA9IHsgIC8qIExhdGluLTEgdG8gSUJNIENvZGUgUGFnZSA0MzcgKi8KKy8qCisgIEFsdGhvdWdoIHRoZSBJQk0gQ0RSQSBkb2VzIG5vdCBpbmNsdWRlIGFuIG9mZmljaWFsIHRyYW5zbGF0aW9uIGJldHdlZW4gQ1A0MzcKKyAgYW5kIElTTyBMYXRpbiBBbHBoYWJldCAxLCBpdCBkb2VzIGluY2x1ZGUgYW4gb2ZmaWNpYWwsIGludmVydGlibGUKKyAgdHJhbnNsYXRpb24gYmV0d2VlbiBDUDQzNyBhbmQgQ1A4NTAgKHBhZ2UgMTk2KSwgYW5kIGFub3RoZXIgZnJvbSBDUDg1MCB0bworICBMYXRpbi0xIChDUDgxOSkgKHBhZ2UgMTUzKS4gIFRoaXMgdHJhbnNsYXRpb24gd2FzIG9idGFpbmVkIHdpdGggYSB0d28tc3RlcAorICBwcm9jZXNzIGJhc2VkIG9uIHRob3NlIHRhYmxlcy4KKyAgQXMgb2YgZWRpdCAxODMsIHRoZSB0cmFuc2xhdGlvbiBpcyBtb2RpZmllZCB0byBsZWF2ZSBDMCBjb250cm9scyBhbG9uZS4KKyovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxODYsIDIwNSwgMjAxLCAxODcsIDIwMCwgMTg4LCAyMDQsIDE4NSwgMjAzLCAyMDIsIDIwNiwgMjIzLCAyMjAsIDIxOSwgMjU0LCAyNDIsCisxNzksIDE5NiwgMjE4LCAxOTEsIDE5MiwgMjE3LCAxOTUsIDE4MCwgMTk0LCAxOTMsIDE5NywgMTc2LCAxNzcsIDE3OCwgMjEzLCAxNTksCisyNTUsIDE3MywgMTU1LCAxNTYsIDIwNywgMTU3LCAyMjEsIDI0NSwgMjQ5LCAxODQsIDE2NiwgMTc0LCAxNzAsIDI0MCwgMTY5LCAyMzgsCisyNDgsIDI0MSwgMjUzLCAyNTIsIDIzOSwgMjMwLCAyNDQsIDI1MCwgMjQ3LCAyNTEsIDE2NywgMTc1LCAxNzIsIDE3MSwgMjQzLCAxNjgsCisxODMsIDE4MSwgMTgyLCAxOTksIDE0MiwgMTQzLCAxNDYsIDEyOCwgMjEyLCAxNDQsIDIxMCwgMjExLCAyMjIsIDIxNCwgMjE1LCAyMTYsCisyMDksIDE2NSwgMjI3LCAyMjQsIDIyNiwgMjI5LCAxNTMsIDE1OCwgMTkwLCAyMzUsIDIzMywgMjM0LCAxNTQsIDIzNywgMjMyLCAyMjUsCisxMzMsIDE2MCwgMTMxLCAxOTgsIDEzMiwgMTM0LCAxNDUsIDEzNSwgMTM4LCAxMzAsIDEzNiwgMTM3LCAxNDEsIDE2MSwgMTQwLCAxMzksCisyMDgsIDE2NCwgMTQ5LCAxNjIsIDE0NywgMjI4LCAxNDgsIDI0NiwgMTg5LCAxNTEsIDE2MywgMTUwLCAxMjksIDIzNiwgMjMxLCAxNTIKK307CisKK0NPTlNUIENIQVIKK3k0M2wxW10gPSB7ICAvKiBJQk0gQ29kZSBQYWdlIDQzNyB0byBMYXRpbi0xICovCisvKgorICBUaGlzIHRhYmxlIGlzIHRoZSBpbnZlcnNlIG9mIHlsMTQzW10uCisqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorMTk5LCAyNTIsIDIzMywgMjI2LCAyMjgsIDIyNCwgMjI5LCAyMzEsIDIzNCwgMjM1LCAyMzIsIDIzOSwgMjM4LCAyMzYsIDE5NiwgMTk3LAorMjAxLCAyMzAsIDE5OCwgMjQ0LCAyNDYsIDI0MiwgMjUxLCAyNDksIDI1NSwgMjE0LCAyMjAsIDE2MiwgMTYzLCAxNjUsIDIxNSwgMTU5LAorMjI1LCAyMzcsIDI0MywgMjUwLCAyNDEsIDIwOSwgMTcwLCAxODYsIDE5MSwgMTc0LCAxNzIsIDE4OSwgMTg4LCAxNjEsIDE3MSwgMTg3LAorMTU1LCAxNTYsIDE1NywgMTQ0LCAxNTEsIDE5MywgMTk0LCAxOTIsIDE2OSwgMTM1LCAxMjgsIDEzMSwgMTMzLCAyNDgsIDIxNiwgMTQ3LAorMTQ4LCAxNTMsIDE1MiwgMTUwLCAxNDUsIDE1NCwgMjI3LCAxOTUsIDEzMiwgMTMwLCAxMzcsIDEzNiwgMTM0LCAxMjksIDEzOCwgMTY0LAorMjQwLCAyMDgsIDIwMiwgMjAzLCAyMDAsIDE1OCwgMjA1LCAyMDYsIDIwNywgMTQ5LCAxNDYsIDE0MSwgMTQwLCAxNjYsIDIwNCwgMTM5LAorMjExLCAyMjMsIDIxMiwgMjEwLCAyNDUsIDIxMywgMTgxLCAyNTQsIDIyMiwgMjE4LCAyMTksIDIxNywgMjUzLCAyMjEsIDE3NSwgMTgwLAorMTczLCAxNzcsIDE0MywgMTkwLCAxODIsIDE2NywgMjQ3LCAxODQsIDE3NiwgMTY4LCAxODMsIDE4NSwgMTc5LCAxNzgsIDE0MiwgMTYwCit9OworCitDT05TVCBDSEFSCit5bDFhcVtdID0geyAgLyogTGF0aW4tMSB0byBFeHRlbmRlZCBNYWMgTGF0aW4gKGJhc2VkIG9uIEFwcGxlIFF1aWNrRHJhdykgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKzE4MiwgMTgzLCAxODQsIDE4NSwgMTg5LCAxOTYsIDE5NywgMTk4LCAyMDYsIDIwNywgMjEwLCAyMTEsIDIxNywgMjE4LCAxOTUsIDIxMiwKKzIwOSwgMjE1LCAyMTMsIDIyNiwgMjI3LCAyMjgsIDI0MCwgMjQ1LCAyNDYsIDI0NywgMjQ5LCAyNTAsIDI1MSwgMjUzLCAyNTQsIDI1NSwKKzIwMiwgMTkzLCAxNjIsIDE2MywgMjE5LCAxODAsIDIwMSwgMTY0LCAxNzIsIDE2OSwgMTg3LCAxOTksIDE5NCwgMjA4LCAxNjgsIDI0OCwKKzE2MSwgMTc3LCAxNzAsIDE3MywgMTcxLCAxODEsIDE2NiwgMjI1LCAyNTIsIDE3NiwgMTg4LCAyMDAsIDE3OCwgMTc5LCAxODYsIDE5MiwKKzIwMywgMjMxLCAyMjksIDIwNCwgMTI4LCAxMjksIDE3NCwgMTMwLCAyMzMsIDEzMSwgMjMwLCAyMzIsIDIzNywgMjM0LCAyMzUsIDIzNiwKKzIyMCwgMTMyLCAyNDEsIDIzOCwgMjM5LCAyMDUsIDEzMywgMTY1LCAxNzUsIDI0NCwgMjQyLCAyNDMsIDEzNCwgMTYwLCAyMjIsIDE2NywKKzEzNiwgMTM1LCAxMzcsIDEzOSwgMTM4LCAxNDAsIDE5MCwgMTQxLCAxNDMsIDE0MiwgMTQ0LCAxNDUsIDE0NywgMTQ2LCAxNDgsIDE0OSwKKzIyMSwgMTUwLCAxNTIsIDE1MSwgMTUzLCAxNTUsIDE1NCwgMjE0LCAxOTEsIDE1NywgMTU2LCAxNTgsIDE1OSwgMjI0LCAyMjMsIDIxNgorfTsKKworQ09OU1QgQ0hBUgoreWwxZHVbXSA9IHsgIC8qIExhdGluLTEgdG8gRHV0Y2ggSVNPIDY0NiAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgVU5LLCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorVU5LLCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsIFVOSywgVU5LLCBVTkssICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIFVOSywgVU5LLCBVTkssICAzOSwgMTI3LAorMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAorIDMyLCAgMzMsIFVOSywgIDM1LCAxMjQsIFVOSywgVU5LLCAgOTMsIDEyMywgIDY3LCBVTkssICAzNCwgVU5LLCAgNDUsICA4MiwgVU5LLAorIDkxLCBVTkssIFVOSywgVU5LLCAxMjYsIDExNywgVU5LLCBVTkssICA0NCwgVU5LLCBVTkssICAzNCwgMTI1LCAgOTIsICA2NCwgIDYzLAorIDY1LCAgNjUsICA2NSwgIDY1LCAgOTEsICA2NSwgIDY1LCAgNjcsICA2OSwgIDY5LCAgNjksICA2OSwgIDczLCAgNzMsICA3MywgIDczLAorVU5LLCAgNzgsICA3OSwgIDc5LCAgNzksICA3OSwgIDc5LCAxMjAsICA3OSwgIDg1LCAgODUsICA4NSwgIDg1LCAgODksIFVOSywgMTE1LAorIDk3LCAgOTcsICA5NywgIDk3LCAgOTcsICA5NywgIDk3LCAgOTksIDEwMSwgMTAxLCAxMDEsIDEwMSwgMTA1LCAxMDUsIDEwNSwgMTA1LAorVU5LLCAxMTAsIDExMSwgMTExLCAxMTEsIDExMSwgMTExLCAgNDcsIDExMSwgMTE3LCAxMTcsIDExNywgMTE3LCAxMjEsIFVOSywgIDkxCit9OworCitDT05TVCBDSEFSCit5bDFmaVtdID0geyAgLyogTGF0aW4tMSB0byBGaW5uaXNoIElTTyBOUkMgKCpub3QqIElTTyA2NDYpICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgVU5LLCBVTkssIFVOSywgVU5LLCAgOTUsCitVTkssICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgVU5LLCBVTkssIFVOSywgVU5LLCAxMjcsCisxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsCisxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksCisgMzIsICAzMywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgIDM0LCAgNjcsIFVOSywgIDM0LCBVTkssICA0NSwgIDgyLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssICAzOSwgMTE3LCBVTkssIFVOSywgIDQ0LCBVTkssIFVOSywgIDM0LCBVTkssIFVOSywgVU5LLCAgNjMsCisgNjUsICA2NSwgIDY1LCAgNjUsICA5MSwgIDkzLCAgNjUsICA2NywgIDY5LCAgNjksICA2OSwgIDY5LCAgNzMsICA3MywgIDczLCAgNzMsCitVTkssICA3OCwgIDc5LCAgNzksICA3OSwgIDc5LCAgOTIsIDEyMCwgIDc5LCAgODUsICA4NSwgIDg1LCAgOTQsICA4OSwgVU5LLCAxMTUsCisgOTcsICA5NywgIDk3LCAgOTcsIDEyMywgMTI1LCAgOTcsICA5OSwgMTAxLCAgOTYsIDEwMSwgMTAxLCAxMDUsIDEwNSwgMTA1LCAxMDUsCitVTkssIDExMCwgMTExLCAxMTEsIDExMSwgMTExLCAxMjQsICA0NywgMTExLCAxMTcsIDExNywgMTE3LCAxMjYsIDEyMSwgVU5LLCAxMjEKK307CisKK0NPTlNUIENIQVIKK3lsMWZyW10gPSB7ICAvKiBMYXRpbi0xIHRvIEZyZW5jaCBJU08gNjQ2ICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCBVTkssICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCitVTkssICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgVU5LLCBVTkssIFVOSywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgVU5LLCBVTkssIFVOSywgVU5LLCAxMjcsCisxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsCisxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksCisgMzIsICAzMywgVU5LLCAgMzUsIFVOSywgVU5LLCBVTkssICA5MywgIDM0LCAgNjcsIFVOSywgIDM0LCBVTkssICA0NSwgIDgyLCBVTkssCisgOTEsIFVOSywgVU5LLCBVTkssICAzOSwgMTE3LCBVTkssIFVOSywgIDQ0LCBVTkssIFVOSywgIDM0LCBVTkssIFVOSywgVU5LLCAgNjMsCisgNjUsICA2NSwgIDY1LCAgNjUsICA2NSwgIDY1LCAgNjUsICA2NywgIDY5LCAgNjksICA2OSwgIDY5LCAgNzMsICA3MywgIDczLCAgNzMsCitVTkssICA3OCwgIDc5LCAgNzksICA3OSwgIDc5LCAgNzksIDEyMCwgIDc5LCAgODUsICA4NSwgIDg1LCAgODUsICA4OSwgVU5LLCAxMTUsCisgNjQsICA5NywgIDk3LCAgOTcsICA5NywgIDk3LCAgOTcsICA5MiwgMTI1LCAxMjMsIDEwMSwgMTAxLCAxMDUsIDEwNSwgMTA1LCAxMDUsCitVTkssIDExMCwgMTExLCAxMTEsIDExMSwgMTExLCAxMTEsICA0NywgMTExLCAxMjQsIDExNywgMTE3LCAxMTcsIDEyMSwgVU5LLCAxMjEKK307CisKK0NPTlNUIENIQVIKK3lsMWZjW10gPSB7ICAvKiBMYXRpbi0xIHRvIEZyZW5jaC1DYW5hZGlhbiBJU08gNjQ2ICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCitVTkssICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgVU5LLCBVTkssIFVOSywgVU5LLCAgOTUsCitVTkssICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgVU5LLCBVTkssIFVOSywgVU5LLCAxMjcsCisxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsCisxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksCisgMzIsICAzMywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgIDM0LCAgNjcsIFVOSywgIDM0LCBVTkssICA0NSwgIDgyLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssICAzOSwgMTE3LCBVTkssIFVOSywgIDQ0LCBVTkssIFVOSywgIDM0LCBVTkssIFVOSywgVU5LLCAgNjMsCisgNjUsICA2NSwgIDY1LCAgNjUsICA2NSwgIDY1LCAgNjUsICA2NywgIDY5LCAgNjksICA2OSwgIDY5LCAgNzMsICA3MywgIDczLCAgNzMsCitVTkssICA3OCwgIDc5LCAgNzksICA3OSwgIDc5LCAgNzksIDEyMCwgIDc5LCAgODUsICA4NSwgIDg1LCAgODUsICA4OSwgVU5LLCAxMTUsCisgNjQsICA5NywgIDkxLCAgOTcsICA5NywgIDk3LCAgOTcsICA5MiwgMTI1LCAxMjMsICA5MywgMTAxLCAxMDUsIDEwNSwgIDk0LCAxMDUsCitVTkssIDExMCwgMTExLCAxMTEsICA5NiwgMTExLCAxMTEsICA0NywgMTExLCAxMjQsIDExNywgMTI2LCAxMTcsIDEyMSwgVU5LLCAxMjEKK307CisKK0NPTlNUIENIQVIKK3lsMWdlW10gPSB7ICAvKiBMYXRpbi0xIHRvIEdlcm1hbiBJU08gNjQ2ICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCitVTkssICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgVU5LLCBVTkssIFVOSywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgVU5LLCBVTkssIFVOSywgVU5LLCAxMjcsCisxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsCisxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksCisgMzIsICAzMywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssICA2NCwgIDM0LCAgNjcsIFVOSywgIDM0LCBVTkssICA0NSwgIDgyLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssICAzOSwgMTE3LCBVTkssIFVOSywgIDQ0LCBVTkssIFVOSywgIDM0LCBVTkssIFVOSywgVU5LLCAgNjMsCisgNjUsICA2NSwgIDY1LCAgNjUsICA5MSwgIDY1LCAgNjUsICA2NywgIDY5LCAgNjksICA2OSwgIDY5LCAgNzMsICA3MywgIDczLCAgNzMsCitVTkssICA3OCwgIDc5LCAgNzksICA3OSwgIDc5LCAgOTIsIDEyMCwgIDc5LCAgODUsICA4NSwgIDg1LCAgOTMsICA4OSwgVU5LLCAxMjYsCisgOTcsICA5NywgIDk3LCAgOTcsIDEyMywgIDk3LCAgOTcsICA5OSwgMTAxLCAxMDEsIDEwMSwgMTAxLCAxMDUsIDEwNSwgMTA1LCAxMDUsCitVTkssIDExMCwgMTExLCAxMTEsIDExMSwgMTExLCAxMjQsICA0NywgMTExLCAxMTcsIDExNywgMTE3LCAxMjUsIDEyMSwgVU5LLCAxMjEKK307CisKK0NPTlNUIENIQVIKK3lsMWh1W10gPSB7ICAvKiBMYXRpbi0xIHRvIEh1bmdhcmlhbiBJU08tNjQ2ICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsCisxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksCisgMzIsICAzMywgVU5LLCBVTkssICAzNiwgVU5LLCBVTkssIFVOSywgIDM0LCAgNjcsIFVOSywgIDM0LCBVTkssICA0NSwgIDgyLCBVTkssCitVTkssICA2NCwgVU5LLCBVTkssICAzOSwgMTE3LCBVTkssIFVOSywgIDQ0LCBVTkssIFVOSywgIDM0LCBVTkssIFVOSywgVU5LLCAgNjMsCisgNjUsICA2NSwgIDY1LCAgNjUsICA2NSwgIDY1LCAgNjUsICA2NywgIDY5LCAgOTEsICA2OSwgIDY5LCAgNzMsICA3MywgIDczLCAgNzMsCitVTkssICA3OCwgIDc5LCAgNzksICA3OSwgIDc5LCAgOTIsIDEyMCwgIDc5LCAgODUsICA4NSwgIDg1LCAgOTMsICA4OSwgVU5LLCAxMTUsCisgOTcsICA5NiwgIDk3LCAgOTcsICA5NywgIDk3LCAgOTcsICA5OSwgMTAxLCAxMjMsIDEwMSwgMTAxLCAxMDUsIDEwNSwgMTA1LCAxMDUsCitVTkssIDExMCwgMTExLCAxMTEsIDExMSwgMTExLCAxMjQsICA0NywgMTExLCAxMTcsIDExNywgMTE3LCAxMjUsIDEyMSwgVU5LLCAxMjEKK307CisKK0NPTlNUIENIQVIKK3lsMWl0W10gPSB7ICAvKiBMYXRpbi0xIHRvIEl0YWxpYW4gSVNPIDY0NiAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgVU5LLCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorVU5LLCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsIFVOSywgVU5LLCBVTkssICA5NCwgIDk1LAorVU5LLCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIFVOSywgVU5LLCBVTkssIFVOSywgMTI3LAorMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAorIDMyLCAgMzMsIFVOSywgIDM1LCBVTkssIFVOSywgVU5LLCAgNjQsICAzNCwgIDY3LCBVTkssICAzNCwgVU5LLCAgNDUsICA4MiwgVU5LLAorIDkxLCBVTkssIFVOSywgVU5LLCAgMzksIDExNywgVU5LLCBVTkssICA0NCwgVU5LLCBVTkssICAzNCwgVU5LLCBVTkssIFVOSywgIDYzLAorIDY1LCAgNjUsICA2NSwgIDY1LCAgNjUsICA2NSwgIDY1LCAgNjcsICA2OSwgIDY5LCAgNjksICA2OSwgIDczLCAgNzMsICA3MywgIDczLAorVU5LLCAgNzgsICA3OSwgIDc5LCAgNzksICA3OSwgIDc5LCAxMjAsICA3OSwgIDg1LCAgODUsICA4NSwgIDg1LCAgODksIFVOSywgMTE1LAorMTIzLCAgOTcsICA5NywgIDk3LCAgOTcsICA5NywgIDk3LCAgOTIsIDEyNSwgIDkzLCAxMDEsIDEwMSwgMTI2LCAxMDUsIDEwNSwgMTA1LAorVU5LLCAxMTAsIDEyNCwgMTExLCAxMTEsIDExMSwgMTExLCAgNDcsIDExMSwgIDk2LCAxMTcsIDExNywgMTE3LCAxMjEsIFVOSywgMTIxCit9OworCitDT05TVCBDSEFSCit5bDFuZVtdID0geyAgLyogTGF0aW4tMSB0byBOZVhUICovCisvKiBORUVEIFRPIE1BS0UgVEhJUyBPTkUgSU5WRVJUSUJMRSwgTElLRSBDUDg1MCAqLworLyoKKyAgV2hpY2ggbWVhbnMgZmluZGluZyBhbGwgdGhlIGdyYXBoaWMgY2hhcmFjdGVycyBpbiB0aGUgTmVYVCBzZXQgdGhhdCBoYXZlCisgIG5vIGVxdWl2YWxlbnQgaW4gTGF0aW4tMSBhbmQgYXNzaWduaW5nIHRoZW0gdG8gdGhlIFVOSyBwb3NpdGlvbnMgKG1vc3RseQorICBMYXRpbi0xIEMxIGNvbnRyb2xzKS4gIFRoZW4gbWFrZSB0aGUgeW5lbDFbXSB0YWJsZSBiZSB0aGUgaW52ZXJzZSBvZiB0aGlzCisgIG9uZS4gIEJ1dCBmaXJzdCB3ZSBzaG91bGQgdHJ5IHRvIGdldCBhbiBvZmZpY2lhbCBMYXRpbi0xL05lWFQgdHJhbnNsYXRpb24KKyAgdGFibGUgZnJvbSBOZVhULCBJbmMuCisqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLAorVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLAorIDMyLCAxNjEsIDE2MiwgMTYzLCAxNjgsIDE2NSwgMTgxLCAxNjcsIDIwMCwgMTYwLCAyMjcsIDE3MSwgMTkwLCBVTkssIDE3NiwgMTk3LAorMjAyLCAyMDksIDIwMSwgMjA0LCAxOTQsIDE1NywgMTgyLCAxODMsIDIwMywgMTkyLCAyMzUsIDE4NywgMjEwLCAyMTEsIDIxMiwgMTkxLAorMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMjI1LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTgsIDIzMywgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMjUxLAorMjEzLCAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjQxLCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjYsIDIyOCwgMjI5LAorMjMwLCAyMzEsIDIzNiwgMjM3LCAyMzgsIDIzOSwgMjQwLCAxNTksIDI0OSwgMjQyLCAyNDMsIDI0NCwgMjQ2LCAyNDcsIDI1MiwgMjUzCit9OworCitDT05TVCBDSEFSCit5bDFub1tdID0geyAgLyogTGF0aW4tMSB0byBOb3J3ZWdpYW4vRGFuaXNoIElTTyA2NDYgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCBVTkssIFVOSywgVU5LLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCBVTkssIFVOSywgVU5LLCAxMjYsIDEyNywKKzEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywKKzE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwKKyAzMiwgIDMzLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCAgMzQsICA2NywgVU5LLCAgMzQsIFVOSywgIDQ1LCAgODIsIFVOSywKK1VOSywgVU5LLCBVTkssIFVOSywgIDM5LCAxMTcsIFVOSywgVU5LLCAgNDQsIFVOSywgVU5LLCAgMzQsIFVOSywgVU5LLCBVTkssICA2MywKKyA2NSwgIDY1LCAgNjUsICA2NSwgIDY1LCAgOTMsICA5MSwgIDY3LCAgNjksICA2OSwgIDY5LCAgNjksICA3MywgIDczLCAgNzMsICA3MywKK1VOSywgIDc4LCAgNzksICA3OSwgIDc5LCAgNzksICA3OSwgMTIwLCAgOTIsICA4NSwgIDg1LCAgODUsICA4NSwgIDg5LCBVTkssIDExNSwKKyA5NywgIDk3LCAgOTcsICA5NywgIDk3LCAxMjUsIDEyMywgIDk5LCAxMDEsIDEwMSwgMTAxLCAxMDEsIDEwNSwgMTA1LCAxMDUsIDEwNSwKK1VOSywgMTEwLCAxMTEsIDExMSwgMTExLCAxMTEsIDExMSwgIDQ3LCAxMjQsIDExNywgMTE3LCAxMTcsIDExNywgMTIxLCBVTkssIDEyMQorfTsKKworQ09OU1QgQ0hBUgoreWwxcG9bXSA9IHsgIC8qIExhdGluLTEgdG8gUG9ydHVndWVzZSBJU08gNjQ2ICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgVU5LLCBVTkssIFVOSywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgVU5LLCBVTkssIFVOSywgMTI2LCAxMjcsCisxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsCisxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksCisgMzIsICAzMywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgIDM0LCAgNjcsIFVOSywgIDM0LCBVTkssICA0NSwgIDgyLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssICAzOSwgMTE3LCBVTkssIFVOSywgIDQ0LCBVTkssIFVOSywgIDM0LCBVTkssIFVOSywgVU5LLCAgNjMsCisgNjUsICA2NSwgIDY1LCAgOTEsICA2NSwgIDY1LCAgNjUsICA5MiwgIDY5LCAgNjksICA2OSwgIDY5LCAgNzMsICA3MywgIDczLCAgNzMsCitVTkssICA3OCwgIDc5LCAgNzksICA3OSwgIDkzLCAgNzksIDEyMCwgIDc5LCAgODUsICA4NSwgIDg1LCAgODUsICA4OSwgVU5LLCAxMTUsCisgOTcsICA5NywgIDk3LCAxMjMsICA5NywgIDk3LCAgOTcsIDEyNCwgMTAxLCAxMDEsIDEwMSwgMTAxLCAxMDUsIDEwNSwgMTA1LCAxMDUsCitVTkssIDExMCwgMTExLCAxMTEsIDExMSwgMTI1LCAxMTEsICA0NywgMTExLCAxMTcsIDExNywgMTE3LCAxMTcsIDEyMSwgVU5LLCAxMjEKK307CisKK0NPTlNUIENIQVIKK3lsMXNwW10gPSB7ICAvKiBMYXRpbi0xIHRvIFNwYW5pc2ggSVNPIDY0NiAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgVU5LLCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorVU5LLCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsIFVOSywgVU5LLCBVTkssICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsICA5NiwgVU5LLCBVTkssIDEyNiwgMTI3LAorMTI2LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAorIDMyLCAgOTEsIFVOSywgIDM1LCBVTkssIFVOSywgVU5LLCAgNjQsICAzNCwgIDY3LCBVTkssICAzNCwgVU5LLCAgNDUsICA4MiwgVU5LLAorMTIzLCBVTkssIFVOSywgVU5LLCAgMzksIDExNywgVU5LLCBVTkssICA0NCwgVU5LLCBVTkssICAzNCwgVU5LLCBVTkssIFVOSywgIDkzLAorIDY1LCAgNjUsICA2NSwgIDY1LCAgNjUsICA2NSwgIDY1LCAgNjcsICA2OSwgIDY5LCAgNjksICA2OSwgIDczLCAgNzMsICA3MywgIDczLAorVU5LLCAgOTIsICA3OSwgIDc5LCAgNzksICA3OSwgIDc5LCAxMjAsICA3OSwgIDg1LCAgODUsICA4NSwgIDg1LCAgODksIFVOSywgMTE1LAorMTI0LCAgOTcsICA5NywgIDk3LCAgOTcsICA5NywgIDk3LCAxMjUsIDEwMSwgMTAxLCAxMDEsIDEwMSwgMTA1LCAxMDUsIDEwNSwgMTA1LAorVU5LLCAxMjQsIDExMSwgMTExLCAxMTEsIDExMSwgMTExLCAgNDcsIDExMSwgMTE3LCAxMTcsIDExNywgMTE3LCAxMjEsIFVOSywgMTIxCit9OworCitDT05TVCBDSEFSCit5bDFzd1tdID0geyAgLyogTGF0aW4tMSB0byBTd2VkaXNoIElTTyA2NDYgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKK1VOSywgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCBVTkssIFVOSywgVU5LLCBVTkssICA5NSwKK1VOSywgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCBVTkssIFVOSywgVU5LLCBVTkssIDEyNywKKzEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywKKzE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwKKyAzMiwgIDMzLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCAgMzQsICA2NywgVU5LLCAgMzQsIFVOSywgIDQ1LCAgODIsIFVOSywKK1VOSywgVU5LLCBVTkssIFVOSywgIDM5LCAxMTcsIFVOSywgVU5LLCAgNDQsIFVOSywgVU5LLCAgMzQsIFVOSywgVU5LLCBVTkssICA2MywKKyA2NSwgIDY1LCAgNjUsICA2NSwgIDkxLCAgOTMsICA2NSwgIDY3LCAgNjksICA2NCwgIDY5LCAgNjksICA3MywgIDczLCAgNzMsICA3MywKK1VOSywgIDc4LCAgNzksICA3OSwgIDc5LCAgNzksICA5MiwgMTIwLCAgNzksICA4NSwgIDg1LCAgODUsICA5NCwgIDg5LCBVTkssIDExNSwKKyA5NywgIDk3LCAgOTcsICA5NywgMTIzLCAxMjUsICA5NywgIDk5LCAxMDEsICA5NiwgMTAxLCAxMDEsIDEwNSwgMTA1LCAxMDUsIDEwNSwKK1VOSywgMTEwLCAxMTEsIDExMSwgMTExLCAxMTEsIDEyNCwgIDQ3LCAxMTEsIDExNywgMTE3LCAxMTcsIDEyNiwgMTIxLCBVTkssIDEyMQorfTsKKworQ09OU1QgQ0hBUgoreWwxY2hbXSA9IHsgIC8qIExhdGluLTEgdG8gU3dpc3MgSVNPIDY0NiAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgVU5LLCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorVU5LLCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIFVOSywgVU5LLCBVTkssIFVOSywgMTI3LAorMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAorIDMyLCAgMzMsIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssICAzNCwgIDY3LCBVTkssICAzNCwgVU5LLCAgNDUsICA4MiwgVU5LLAorVU5LLCBVTkssIFVOSywgVU5LLCAgMzksIDExNywgVU5LLCBVTkssICA0NCwgVU5LLCBVTkssICAzNCwgVU5LLCBVTkssIFVOSywgIDYzLAorIDY1LCAgNjUsICA2NSwgIDY1LCAgNjUsICA2NSwgIDY1LCAgNjcsICA2OSwgIDY5LCAgNjksICA2OSwgIDczLCAgNzMsICA3MywgIDczLAorVU5LLCAgNzgsICA3OSwgIDc5LCAgNzksICA3OSwgIDc5LCAxMjAsICA3OSwgIDg1LCAgODUsICA4NSwgIDg1LCAgODksIFVOSywgMTE1LAorIDY0LCAgOTcsICA5NywgIDk3LCAxMjMsICA5NywgIDk3LCAgOTIsICA5NSwgIDkxLCAgOTMsIDEwMSwgMTA1LCAxMDUsICA5NCwgMTA1LAorVU5LLCAxMTAsIDExMSwgMTExLCAgOTYsIDExMSwgMTI0LCAgNDcsIDExMSwgIDM1LCAxMTcsIDEyNiwgMTI1LCAxMjEsIFVOSywgMTIxCit9OworCitDT05TVCBDSEFSCit5bDFkbVtdID0geyAgLyogTGF0aW4tMSB0byBERUMgTXVsdGluYXRpb25hbCBDaGFyYWN0ZXIgU2V0ICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsCisxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksCisgMzIsIDE2MSwgMTYyLCAxNjMsIDE2OCwgMTY1LCAxMjQsIDE2NywgIDM0LCAxNjksIDE3MCwgMTcxLCAxMjYsIFVOSywgIDgyLCBVTkssCisxNzYsIDE3NywgMTc4LCAxNzksICAzOSwgMTgxLCAxODIsIDE4MywgIDQ0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgVU5LLCAxOTEsCisxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsCitVTkssIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDEyMCwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgVU5LLCAyMjMsCisyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksCitVTkssIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsICA0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIFVOSywgVU5LLCAyNTMKK307CisKK0NPTlNUIENIQVIKK3lsMWRnW10gPSB7ICAvKiBMYXRpbi0xIHRvIERhdGEgR2VuZXJhbCBJbnRlcm5hdGlvbmFsIENoYXJhY3RlciBTZXQgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKzEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywKKzE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwKKzE2MCwgMTcxLCAxNjcsIDE2OCwgMTY2LCAxODEsIDE5MSwgMTg3LCAxODksIDE3MywgMTY5LCAxNzcsIDE2MSwgMjU1LCAxNzQsIDE3NSwKKzE4OCwgMTgyLCAxNjQsIDE2NSwgMTkwLCAxNjMsIDE3OCwgMTg1LCAxODYsIDE3OSwgMTcwLCAxNzYsIDIyMywgMTYyLCAyMjAsIDE3MiwKKzE5MywgMTkyLCAxOTQsIDE5NiwgMTk1LCAxOTcsIDE5OCwgMTk5LCAyMDEsIDIwMCwgMjAyLCAyMDMsIDIwNSwgMjA0LCAyMDYsIDIwNywKKzE4NCwgMjA4LCAyMTAsIDIwOSwgMjExLCAyMTMsIDIxMiwgMjE1LCAyMTQsIDIxNywgMjE2LCAyMTgsIDIxOSwgMjIxLCAyMjIsIDI1MiwKKzIyNSwgMjI0LCAyMjYsIDIyOCwgMjI3LCAyMjksIDIzMCwgMjMxLCAyMzMsIDIzMiwgMjM0LCAyMzUsIDIzNywgMjM2LCAyMzgsIDIzOSwKKzE4MywgMjQwLCAyNDIsIDI0MSwgMjQzLCAyNDUsIDI0NCwgMjQ3LCAyNDYsIDI0OSwgMjQ4LCAyNTAsIDI1MSwgMTgwLCAyNTQsIDI1MworfTsKKworCisvKiBMb2NhbCBmaWxlIGNoYXJhY3RlciBzZXRzIHRvIElTTyBMYXRpbiBBbHBoYWJldCAxICovCisKKyNpZmRlZiBOT1RVU0VECitDT05TVCBDSEFSCit5YXNsMVtdID0geyAgLyogQVNDSUkgdG8gTGF0aW4tMSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3Cit9OworI2VuZGlmIC8qIE5PVFVTRUQgKi8KKworQ09OU1QgQ0hBUgoreWFxbDFbXSA9IHsgIC8qIEV4dGVuZGVkIE1hYyBMYXRpbiAoYmFzZWQgb24gQXBwbGUgUXVpY2tkcmF3KSB0byBMYXRpbi0xICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxOTYsIDE5NywgMTk5LCAyMDEsIDIwOSwgMjE0LCAyMjAsIDIyNSwgMjI0LCAyMjYsIDIyOCwgMjI3LCAyMjksIDIzMSwgMjMzLCAyMzIsCisyMzQsIDIzNSwgMjM3LCAyMzYsIDIzOCwgMjM5LCAyNDEsIDI0MywgMjQyLCAyNDQsIDI0NiwgMjQ1LCAyNTAsIDI0OSwgMjUxLCAyNTIsCisyMjEsIDE3NiwgMTYyLCAxNjMsIDE2NywgMjE1LCAxODIsIDIyMywgMTc0LCAxNjksIDE3OCwgMTgwLCAxNjgsIDE3OSwgMTk4LCAyMTYsCisxODUsIDE3NywgMTg4LCAxODksIDE2NSwgMTgxLCAxMjgsIDEyOSwgMTMwLCAxMzEsIDE5MCwgMTcwLCAxODYsIDEzMiwgMjMwLCAyNDgsCisxOTEsIDE2MSwgMTcyLCAxNDIsIDEzMywgMTM0LCAxMzUsIDE3MSwgMTg3LCAxNjYsIDE2MCwgMTkyLCAxOTUsIDIxMywgMTM2LCAxMzcsCisxNzMsIDE0NCwgMTM4LCAxMzksIDE0MywgMTQ2LCAyNDcsIDE0NSwgMjU1LCAxNDAsIDE0MSwgMTY0LCAyMDgsIDI0MCwgMjIyLCAyNTQsCisyNTMsIDE4MywgMTQ3LCAxNDgsIDE0OSwgMTk0LCAyMDIsIDE5MywgMjAzLCAyMDAsIDIwNSwgMjA2LCAyMDcsIDIwNCwgMjExLCAyMTIsCisxNTAsIDIxMCwgMjE4LCAyMTksIDIxNywgMTUxLCAxNTIsIDE1MywgMTc1LCAxNTQsIDE1NSwgMTU2LCAxODQsIDE1NywgMTU4LCAxNTkKK307CisKK0NPTlNUIENIQVIKK3lkdWwxW10gPSB7ICAvKiBEdXRjaCBJU08gNjQ2IHRvIExhdGluLTEgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsIDE2MywgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKzE5MCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAyNTUsIDE4OSwgMTI0LCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxNjgsIDE2NCwgMTg4LCAgMzksIDEyNworfTsKKworQ09OU1QgQ0hBUgoreWZpbDFbXSA9IHsgIC8qIEZpbm5pc2ggTlJDICgqbm90KiBJU08tNjQ2KSB0byBMYXRpbi0xICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgMTk2LCAyMTQsIDE5NywgMjIwLCAgOTUsCisyMzMsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMjI4LCAyNDYsIDIyOSwgMjUyLCAxMjcKK307CisKK0NPTlNUIENIQVIKK3lmcmwxW10gPSB7ICAvKiBGcmVuY2ggSVNPIDY0NiB0byBMYXRpbi0xICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAxNjMsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisyMjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgMTc2LCAyMzEsIDE2NywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMjMzLCAyNDksIDIzMiwgMTY4LCAxMjcKK307CisKK0NPTlNUIENIQVIKK3lmY2wxW10gPSB7ICAvKiBGcmVuY2gtQ2FuYWRpYW4gSVNPIDY0NiB0byBMYXRpbi0xICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisyMjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgMjI2LCAyMzEsIDIzNCwgMjM4LCAgOTUsCisyNDQsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMjMzLCAyNDksIDIzMiwgMjUxLCAxMjcKK307CisKK0NPTlNUIENIQVIKK3lnZWwxW10gPSB7ICAvKiBHZXJtYW4gSVNPIDY0NiB0byBMYXRpbi0xICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisxNjcsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgMTk2LCAyMTQsIDIyMCwgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMjI4LCAyNDYsIDI1MiwgMjIzLCAxMjcKK307CisKK0NPTlNUIENIQVIKK3lpdGwxW10gPSB7ICAvKiBJdGFsaWFuIElTTyA2NDYgdG8gTGF0aW4tMSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgMTYzLCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorMTY3LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsIDE3NiwgMjMxLCAyMzMsICA5NCwgIDk1LAorMjQ5LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDIyNCwgMjQyLCAyMzIsIDIzNiwgMTI3Cit9OworCitDT05TVCBDSEFSCit5bmVsMVtdID0geyAgLyogTmVYVCB0byBMYXRpbi0xICovCisvKiBORUVEIFRPIE1BS0UgVEhJUyBPTkUgSU5WRVJUSUJMRSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorMTYwLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTksIDIwMCwgMjAxLCAyMDIsIDIwMywgMjA0LCAyMDUsIDIwNiwgMjA3LAorMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAxODEsIDIxNSwgMjQ3LAorMTY5LCAxNjEsIDE2MiwgMTYzLCBVTkssIDE2NSwgVU5LLCAxNjcsIDE2NCwgVU5LLCBVTkssIDE3MSwgVU5LLCBVTkssIFVOSywgVU5LLAorMTc0LCBVTkssIFVOSywgVU5LLCAxODMsIDE2NiwgMTgyLCBVTkssIFVOSywgVU5LLCBVTkssIDE4NywgVU5LLCBVTkssIDE3MiwgMTkxLAorMTg1LCAgOTYsIDE4MCwgIDk0LCAxMjYsIDE3NSwgVU5LLCBVTkssIDE2OCwgMTc4LCAxNzYsIDE4NCwgMTc5LCBVTkssIFVOSywgVU5LLAorVU5LLCAxNzcsIDE4OCwgMTg5LCAxOTAsIDIyNCwgMjI1LCAyMjYsIDIyNywgMjI4LCAyMjksIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LAorMjM2LCAxOTgsIDIzNywgMTcwLCAyMzgsIDIzOSwgMjQwLCAyNDEsIFVOSywgMjE2LCBVTkssIDE4NiwgMjQyLCAyNDMsIDI0NCwgMjQ1LAorMjQ2LCAyMzAsIDI0OSwgMjUwLCAyNTEsIFVOSywgMjUyLCAyNTMsIFVOSywgMjQ4LCBVTkssIDIyMywgMjU0LCAyNTUsIFVOSywgVU5LCit9OworCitDT05TVCBDSEFSCit5bm9sMVtdID0geyAgLyogTm9yd2VnaWFuL0RhbmlzaCBJU08gNjQ2IHRvIExhdGluLTEgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAxOTgsIDIxNiwgMTk3LCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAyMzAsIDI0OCwgMjI5LCAxMjYsIDEyNworfTsKKworQ09OU1QgQ0hBUgoreXBvbDFbXSA9IHsgIC8qIFBvcnR1Z3Vlc2UgSVNPIDY0NiB0byBMYXRpbi0xICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgMTk1LCAxOTksIDIxMywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMjI3LCAyMzEsIDI0NSwgMTI2LCAxMjcKK307CisKK0NPTlNUIENIQVIKK3lzcGwxW10gPSB7ICAvKiBTcGFuaXNoIElTTyA2NDYgdG8gTGF0aW4tMSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgMTYzLCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorMTY3LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsIDE2MSwgMjA5LCAxOTEsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDE3NiwgMjQxLCAyMzEsIDEyNiwgMTI3Cit9OworCitDT05TVCBDSEFSCit5c3dsMVtdID0geyAgLyogU3dlZGlzaCBJU08gNjQ2IHRvIExhdGluLTEgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKzIwMSwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAxOTYsIDIxNCwgMTk3LCAyMjAsICA5NSwKKzIzMywgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAyMjgsIDI0NiwgMjI5LCAyNTIsIDEyNworfTsKKworQ09OU1QgQ0hBUgoreWNobDFbXSA9IHsgIC8qIFN3aXNzIElTTyA2NDYgdG8gTGF0aW4tMSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgMjQ5LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorMjI0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsIDIzMywgMjMxLCAyMzQsIDIzOCwgMjMyLAorMjQ0LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDIyOCwgMjQ2LCAyNTIsIDI1MSwgMTI3Cit9OworCitDT05TVCBDSEFSCit5aHVsMVtdID0geyAgLyogSHVuZ2FyaWFuIElTTyA2NDYgdG8gTGF0aW4tMSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAxNjQsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorMTkzLCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsIDIwMSwgMjE0LCAyMjAsICA5NCwgIDk1LAorMjI1LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDIzMywgMjQ2LCAyNTIsICAzNCwgMTI3Cit9OworCitDT05TVCBDSEFSCit5ZG1sMVtdID0geyAgLyogREVDIE11bHRpbmF0aW9uYWwgQ2hhcmFjdGVyIFNldCB0byBMYXRpbi0xICovCisvKiBOb3RlOiBUaGlzIGlzIGEgbnVsbCB0cmFuc2xhdGlvbiAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAorMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMsIDE3NCwgMTc1LAorMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLAorMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksIDIwMCwgMjAxLCAyMDIsIDIwMywgMjA0LCAyMDUsIDIwNiwgMjA3LAorMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLAorMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LAorMjQwLCAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1Cit9OworCitDT05TVCBDSEFSCit5ZGdsMVtdID0geyAgLyogRGF0YSBHZW5lcmFsIEludGVybmF0aW9uYWwgdG8gTGF0aW4tMSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAorMTYwLCAxNzIsIDE4OSwgMTgxLCAxNzgsIDE3OSwgMTY0LCAxNjIsIDE2MywgMTcwLCAxODYsIDE2MSwgMTkxLCAxNjksIDE3NCwgMTc1LAorMTg3LCAxNzEsIDE4MiwgMTg1LCAyNTMsIDE2NSwgMTc3LCAyNDAsIDIwOCwgMTgzLCAxODQsIDE2NywgMTc2LCAxNjgsIDE4MCwgMTY2LAorMTkzLCAxOTIsIDE5NCwgMTk2LCAxOTUsIDE5NywgMTk4LCAxOTksIDIwMSwgMjAwLCAyMDIsIDIwMywgMjA1LCAyMDQsIDIwNiwgMjA3LAorMjA5LCAyMTEsIDIxMCwgMjEyLCAyMTQsIDIxMywgMjE2LCAyMTUsIDIxOCwgMjE3LCAyMTksIDIyMCwgMTkwLCAyMjEsIDIyMiwgMTg4LAorMjI1LCAyMjQsIDIyNiwgMjI4LCAyMjcsIDIyOSwgMjMwLCAyMzEsIDIzMywgMjMyLCAyMzQsIDIzNSwgMjM3LCAyMzYsIDIzOCwgMjM5LAorMjQxLCAyNDMsIDI0MiwgMjQ0LCAyNDYsIDI0NSwgMjQ4LCAyNDcsIDI1MCwgMjQ5LCAyNTEsIDI1MiwgMjIzLCAyNTUsIDI1NCwgMTczCit9OworCisKKy8qIFRyYW5zbGF0aW9uIHRhYmxlcyBmb3IgQ3lyaWxsaWMgY2hhcmFjdGVyIHNldHMgKi8KKworI2lmZGVmIENZUklMTElDCitDT05TVCBDSEFSCit5bGNhY1tdID0geyAgLyogTGF0aW4vQ3lyaWxsaWMgdG8gQ1A4NjYgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgMjA4LCAyMDksICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKzE5NiwgMTc5LCAxOTIsIDIxNywgMTkxLCAyMTgsIDE5NSwgMTkzLCAxODAsIDE5NCwgMTk3LCAxNzYsIDE3NywgMTc4LCAyMTEsIDIxNiwKKzIwNSwgMTg2LCAyMDAsIDE4OCwgMTg3LCAyMDEsIDIwNCwgMjAyLCAxODUsIDIwMywgMjA2LCAyMjMsIDIyMCwgMjE5LCAyNTQsIFVOSywKKzI1NSwgMjQwLCAxMzIsIDEzMSwgMjQyLCAgODMsICA3MywgMjQ0LCAgNzQsIDEzOSwgMTQxLCAxNTEsIDEzOCwgIDQ1LCAyNDYsIDEzNSwKKzEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywKKzE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwKKzE2MCwgMTYxLCAxNjIsIDE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LCAxNjgsIDE2OSwgMTcwLCAxNzEsIDE3MiwgMTczLCAxNzQsIDE3NSwKKzIyNCwgMjI1LCAyMjYsIDIyNywgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwKKzI1MiwgMjQxLCAxNjQsIDE2MywgMjQzLCAxMTUsIDEwNSwgMjQ1LCAxMDYsIDE3MSwgMTczLCAyMzEsIDE3MCwgIDIxLCAyNDcsIDE2NworfTsKKworQ09OU1QgQ0hBUgoreWxjNTVbXSA9IHsgIC8qIExhdGluL0N5cmlsbGljIHRvIENQODU1IChpbnZlcnNlIG9mIHk1NWxjKSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorMTc0LCAxNzUsIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODUsIDE4NiwgMTg3LCAxODgsIDE5MSwgMTkyLCAxOTMsIDE5NCwgMTk1LAorMTk2LCAxOTcsIDIwMCwgMjAxLCAyMDIsIDIwMywgMjA0LCAyMDUsIDIwNiwgMjA3LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMywgMjU0LAorMjU1LCAxMzMsIDEyOSwgMTMxLCAxMzUsIDEzNywgMTM5LCAxNDEsIDE0MywgMTQ1LCAxNDcsIDE0OSwgMTUxLCAyNDAsIDE1MywgMTU1LAorMTYxLCAxNjMsIDIzNiwgMTczLCAxNjcsIDE2OSwgMjM0LCAyNDQsIDE4NCwgMTkwLCAxOTksIDIwOSwgMjExLCAyMTMsIDIxNSwgMjIxLAorMjI2LCAyMjgsIDIzMCwgMjMyLCAxNzEsIDE4MiwgMTY1LCAyNTIsIDI0NiwgMjUwLCAxNTksIDI0MiwgMjM4LCAyNDgsIDE1NywgMjI0LAorMTYwLCAxNjIsIDIzNSwgMTcyLCAxNjYsIDE2OCwgMjMzLCAyNDMsIDE4MywgMTg5LCAxOTgsIDIwOCwgMjEwLCAyMTIsIDIxNCwgMjE2LAorMjI1LCAyMjcsIDIyOSwgMjMxLCAxNzAsIDE4MSwgMTY0LCAyNTEsIDI0NSwgMjQ5LCAxNTgsIDI0MSwgMjM3LCAyNDcsIDE1NiwgMjIyLAorMjM5LCAxMzIsIDEyOCwgMTMwLCAxMzQsIDEzNiwgMTM4LCAxNDAsIDE0MiwgMTQ0LCAxNDYsIDE0OCwgMTUwLCAyNTMsIDE1MiwgMTU0Cit9OworCitDT05TVCBDSEFSCit5bGMxMjUxW10gPSB7ICAvKiBMYXRpbi9DeXJpbGxpYyB0byBDUDEyNTEgKGludmVyc2Ugb2YgeTEyNTFsYykgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKzEzMCwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM5LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwKKzE1MywgMTU1LCAxNjQsIDE2NSwgMTY2LCAxNjksIDE3MSwgMTcyLCAxNzQsIDE3NiwgMTc3LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NywKKzE2MCwgMTY4LCAxMjgsIDEyOSwgMTcwLCAxODksIDE3OCwgMTc1LCAxNjMsIDEzOCwgMTQwLCAxNDIsIDE0MSwgMTczLCAxNjEsIDE0MywKKzE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywKKzIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywKKzIyNCwgMjI1LCAyMjYsIDIyNywgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwKKzI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwKKzE4NSwgMTg0LCAxNDQsIDEzMSwgMTg2LCAxOTAsIDE3OSwgMTkxLCAxODgsIDE1NCwgMTU2LCAxNTgsIDE1NywgMTY3LCAxNjIsIDE1OQorfTsKKworQ09OU1QgQ0hBUgoreWxjYnVbXSA9IHsgIC8qIExhdGluL0N5cmlsbGljIHRvIEJ1bGdhcmlhbiBQQyBDb2RlIFBhZ2UgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKzI1NSwgMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksIDIwMCwgMjAxLCAyMDIsIDIwMywgMjA0LCAyMDUsIDIwNiwKKzEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywKKzE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwKKzE2MCwgMTYxLCAxNjIsIDE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LCAxNjgsIDE2OSwgMTcwLCAxNzEsIDE3MiwgMTczLCAxNzQsIDE3NSwKKzE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5LCAxOTAsIDE5MSwKKzIxMywgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywKKzIyNCwgMjI1LCAyMjYsIDIyNywgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwKKzI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjE0LCAyNTMsIDI1NAorfTsKKworQ09OU1QgQ0hBUgoreWxjazhbXSA9IHsgIC8qIExhdGluL0N5cmlsbGljIHRvIE9sZCBLT0ktOCBDeXJpbGxpYyAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAorVU5LLCAyMjksIFVOSywgVU5LLCBVTkssICA4MywgIDczLCAgNzMsICA3NCwgVU5LLCBVTkssIFVOSywgMjM1LCBVTkssIDI0NSwgVU5LLAorMjI1LCAyMjYsIDI0NywgMjMxLCAyMjgsIDIyOSwgMjQ2LCAyNTAsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwgMjQwLAorMjQyLCAyNDMsIDI0NCwgMjQ1LCAyMzAsIDIzMiwgMjI3LCAyNTQsIDI1MSwgMjUzLCAyNTUsIDI0OSwgMjQ4LCAyNTIsIDIyNCwgMjQxLAorMTkzLCAxOTQsIDIxNSwgMTk5LCAxOTYsIDE5NywgMjE0LCAyMTgsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LAorMjEwLCAyMTEsIDIxMiwgMjEzLCAxOTgsIDIwMCwgMTk1LCAyMjIsIDIxOSwgMjIxLCAyMjMsIDIxNywgMjE2LCAyMjAsIDE5MiwgMjA5LAorVU5LLCAxOTcsIFVOSywgVU5LLCBVTkssIDExNSwgMTA1LCAxMDUsIDEwNiwgVU5LLCBVTkssIFVOSywgMjAzLCBVTkssIDIxMywgVU5LCit9OworCitDT05TVCBDSEFSCit5YWNsY1tdID0geyAgLyogQ1A4NjYgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKy8qIE5FRUQgVE8gTUFLRSBUSElTIE9ORSBJTlZFUlRJQkxFICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsCisxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsCisyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCisyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksCisxNjEsIDI0MSwgMTY0LCAyNDQsIDE2NywgMjQ3LCAxNzQsIDI1NCwgVU5LLCBVTkssIFVOSywgVU5LLCAyNDAsIFVOSywgVU5LLCBVTksKK307CisKK0NPTlNUIENIQVIKK3k1NWxjW10gPSB7ICAvKiBDUDg1NSB0byBMYXRpbi9DeXJpbGxpYyAoaW52ZXJzZSBvZiB5bGM1NSkgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKzI0MiwgMTYyLCAyNDMsIDE2MywgMjQxLCAxNjEsIDI0NCwgMTY0LCAyNDUsIDE2NSwgMjQ2LCAxNjYsIDI0NywgMTY3LCAyNDgsIDE2OCwKKzI0OSwgMTY5LCAyNTAsIDE3MCwgMjUxLCAxNzEsIDI1MiwgMTcyLCAyNTQsIDE3NCwgMjU1LCAxNzUsIDIzOCwgMjA2LCAyMzQsIDIwMiwKKzIwOCwgMTc2LCAyMDksIDE3NywgMjMwLCAxOTgsIDIxMiwgMTgwLCAyMTMsIDE4MSwgMjI4LCAxOTYsIDIxMSwgMTc5LCAxMjgsIDEyOSwKKzEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAyMjksIDE5NywgMjE2LCAxODQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMjE3LCAxODUsIDEzOSwKKzE0MCwgMTQxLCAxNDIsIDE0MywgMTQ0LCAxNDUsIDIxOCwgMTg2LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywKKzIxOSwgMTg3LCAyMjAsIDE4OCwgMjIxLCAxODksIDIyMiwgMTkwLCAyMjMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTkxLCAyMzksIDE1OCwKKzIwNywgMjI0LCAxOTIsIDIyNSwgMTkzLCAyMjYsIDE5NCwgMjI3LCAxOTUsIDIxNCwgMTgyLCAyMTAsIDE3OCwgMjM2LCAyMDQsIDI0MCwKKzE3MywgMjM1LCAyMDMsIDIxNSwgMTgzLCAyMzIsIDIwMCwgMjM3LCAyMDUsIDIzMywgMjAxLCAyMzEsIDE5OSwgMjUzLCAxNTksIDE2MAorfTsKKworQ09OU1QgQ0hBUgoreTEyNTFsY1tdID0geyAgLyogQ1AxMjUxIHRvIExhdGluL0N5cmlsbGljIChpbnZlcnNlIG9mIHlsYzEyNTEpICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxNjIsIDE2MywgMTI4LCAyNDMsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDE2OSwgMTM1LCAxNzAsIDE3MiwgMTcxLCAxNzUsCisyNDIsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLCAxNDQsIDI0OSwgMTQ1LCAyNTAsIDI1MiwgMjUxLCAyNTUsCisxNjAsIDE3NCwgMjU0LCAxNjgsIDE0NiwgMTQ3LCAxNDgsIDI1MywgMTYxLCAxNDksIDE2NCwgMTUwLCAxNTEsIDE3MywgMTUyLCAxNjcsCisxNTMsIDE1NCwgMTY2LCAyNDYsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMjQxLCAyNDAsIDI0NCwgMTU5LCAyNDgsIDE2NSwgMjQ1LCAyNDcsCisxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsCisxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsCisyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsCisyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzkKK307CisKK0NPTlNUIENIQVIKK3lidWxjW10gPSB7ICAvKiBCdWxnYXJpYW4gUEMgQ29kZSBQYWdlIHRvIExhdGluL0N5cmlsbGljICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksCisxNjAsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3MywgMTc0LCAxNzUsCisxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsCisxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsCisxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLCAyMDksCisyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjA4LCAyNTMsIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsCisyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksCisyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1NCwgMjU1LCAxMjgKK307CisKK0NPTlNUIENIQVIKK3lrOGxjW10gPSB7ICAvKiBPbGQgS09JLTggQ3lyaWxsaWMgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKzEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywKKzE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwKK1VOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywKK1VOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywKKzIzOCwgMjA4LCAyMDksIDIzMCwgMjEyLCAyMTMsIDIyOCwgMjExLCAyMjksIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwKKzIyMywgMjM5LCAyMjQsIDIyNSwgMjI2LCAyMjcsIDIxNCwgMjEwLCAyMzYsIDIzNSwgMjE1LCAyMzIsIDIzNywgMjMzLCAyMzEsIDIzNCwKKzIwNiwgMTc2LCAxNzcsIDE5OCwgMTgwLCAxODEsIDE5NiwgMTc5LCAxOTcsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwKKzE5MSwgMjA3LCAxOTIsIDE5MywgMTk0LCAxOTUsIDE4MiwgMTc4LCAyMDQsIDIwMywgMTgzLCAyMDAsIDIwNSwgMjAxLCAxOTksIDEyNworfTsKKworQ09OU1QgQ0hBUgoreWxjc2tbXSA9IHsgIC8qIExhdGluL0N5cmlsbGljIHRvIFNob3J0IEtPSSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgMTI3LAorICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAxMDEsIFVOSywgVU5LLCBVTkssICA4MywgIDczLCAgNzMsICA3NCwgVU5LLCBVTkssIFVOSywgMTA3LCAgNDUsIDExNywgVU5LLAorIDk3LCAgOTgsIDExOSwgMTAzLCAxMDAsIDEwMSwgMTE4LCAxMjIsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLAorMTE0LCAxMTUsIDExNiwgMTE3LCAxMDIsIDEwNCwgIDk5LCAxMjYsIDEyMywgMTI1LCAgMzksIDEyMSwgMTIwLCAxMjQsICA5NiwgMTEzLAorIDk3LCAgOTgsIDExOSwgMTAzLCAxMDAsIDEwMSwgMTE4LCAxMjIsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLAorMTE0LCAxMTUsIDExNiwgMTE3LCAxMDIsIDEwNCwgIDk5LCAxMjYsIDEyMywgMTI1LCAgMzksIDEyMSwgMTIwLCAxMjQsICA5NiwgMTEzLAorVU5LLCAxMDEsIFVOSywgVU5LLCBVTkssICA4MywgIDczLCAgNzMsICA3NCwgVU5LLCBVTkssIFVOSywgMTA3LCBVTkssIDExNywgVU5LCit9OworCitDT05TVCBDSEFSIHlza2N5W10gPSB7ICAvKiBTaG9ydCBLT0kgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKzIwNiwgMTc2LCAxNzcsIDE5OCwgMTgwLCAxODEsIDE5NiwgMTc5LCAxOTcsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwKKzE5MSwgMjA3LCAxOTIsIDE5MywgMTk0LCAxOTUsIDE4MiwgMTc4LCAyMDQsIDIwMywgMTgzLCAyMDAsIDIwNSwgMjAxLCAxOTksIDEyNworfTsKKyNlbmRpZiAvKiBDWVJJTExJQyAqLworCisjaWZkZWYgTEFUSU4yCisKKy8qIExhdGluLTIgdGFibGVzICovCisKK0NPTlNUIENIQVIKK3lsMjUyW10gPSB7CQkJCS8qIExhdGluLTIgdG8gQ29kZSBQYWdlIDg1MiAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorMTc0LCAxNzUsIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODUsIDE4NiwgMTg3LCAxODgsIDE5MSwgMTkyLCAxOTMsIDE5NCwgMTk1LAorMTk2LCAxOTcsIDIwMCwgMjAxLCAyMDIsIDIwMywgMjA0LCAyMDUsIDIwNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjMsIDI0MCwgMjU0LAorMjU1LCAxNjQsIDI0NCwgMTU3LCAyMDcsIDE0OSwgMTUxLCAyNDUsIDI0OSwgMjMwLCAxODQsIDE1NSwgMTQxLCAxNzAsIDE2NiwgMTg5LAorMjQ4LCAxNjUsIDI0MiwgMTM2LCAyMzksIDE1MCwgMTUyLCAyNDMsIDI0NywgMjMxLCAxNzMsIDE1NiwgMTcxLCAyNDEsIDE2NywgMTkwLAorMjMyLCAxODEsIDE4MiwgMTk4LCAxNDIsIDE0NSwgMTQzLCAxMjgsIDE3MiwgMTQ0LCAxNjgsIDIxMSwgMTgzLCAyMTQsIDIxNSwgMjEwLAorMjA5LCAyMjcsIDIxMywgMjI0LCAyMjYsIDEzOCwgMTUzLCAxNTgsIDI1MiwgMjIyLCAyMzMsIDIzNSwgMTU0LCAyMzcsIDIyMSwgMjI1LAorMjM0LCAxNjAsIDEzMSwgMTk5LCAxMzIsIDE0NiwgMTM0LCAxMzUsIDE1OSwgMTMwLCAxNjksIDEzNywgMjE2LCAxNjEsIDE0MCwgMjEyLAorMjA4LCAyMjgsIDIyOSwgMTYyLCAxNDcsIDEzOSwgMTQ4LCAyNDYsIDI1MywgMTMzLCAxNjMsIDI1MSwgMTI5LCAyMzYsIDIzOCwgMjUwCit9OworCitDT05TVCBDSEFSCit5NTJsMltdID0gewkJCQkvKiBDb2RlIFBhZ2UgODUyIHRvIExhdGluLTIgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKzE5OSwgMjUyLCAyMzMsIDIyNiwgMjI4LCAyNDksIDIzMCwgMjMxLCAxNzksIDIzNSwgMjEzLCAyNDUsIDIzOCwgMTcyLCAxOTYsIDE5OCwKKzIwMSwgMTk3LCAyMjksIDI0NCwgMjQ2LCAxNjUsIDE4MSwgMTY2LCAxODIsIDIxNCwgMjIwLCAxNzEsIDE4NywgMTYzLCAyMTUsIDIzMiwKKzIyNSwgMjM3LCAyNDMsIDI1MCwgMTYxLCAxNzcsIDE3NCwgMTkwLCAyMDIsIDIzNCwgMTczLCAxODgsIDIwMCwgMTg2LCAxMjgsIDEyOSwKKzEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxOTMsIDE5NCwgMjA0LCAxNzAsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTc1LCAxOTEsIDEzOSwKKzE0MCwgMTQxLCAxNDIsIDE0MywgMTQ0LCAxNDUsIDE5NSwgMjI3LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE2NCwKKzI0MCwgMjA4LCAyMDcsIDIwMywgMjM5LCAyMTAsIDIwNSwgMjA2LCAyMzYsIDE1MywgMTU0LCAxNTUsIDE1NiwgMjIyLCAyMTcsIDE1NywKKzIxMSwgMjIzLCAyMTIsIDIwOSwgMjQxLCAyNDIsIDE2OSwgMTg1LCAxOTIsIDIxOCwgMjI0LCAyMTksIDI1MywgMjIxLCAyNTQsIDE4MCwKKzE1OCwgMTg5LCAxNzgsIDE4MywgMTYyLCAxNjcsIDI0NywgMTg0LCAxNzYsIDE2OCwgMjU1LCAyNTEsIDIxNiwgMjQ4LCAxNTksIDE2MAorfTsKKworQ09OU1QgQ0hBUgoreWwyMTI1MFtdID0gewkJCQkvKiBMYXRpbi0yIHRvIENvZGUgUGFnZSAxMjUwICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOSwgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsCisxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU1LCAxNjYsIDE2OSwgMTcxLCAxNzIsIDE3NCwgMTc3LCAxODEsIDE4MiwgMTgzLCAxODcsCisxNjAsIDE2NSwgMTYyLCAxNjMsIDE2NCwgMTg4LCAxNDAsIDE2NywgMTY4LCAxMzgsIDE3MCwgMTQxLCAxNDMsIDE3MywgMTQyLCAxNzUsCisxNzYsIDE4NSwgMTc4LCAxNzksIDE4MCwgMTkwLCAxNTYsIDE2MSwgMTg0LCAxNTQsIDE4NiwgMTU3LCAxNTksIDE4OSwgMTU4LCAxOTEsCisxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsCisyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsCisyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksCisyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUKK307CisKK0NPTlNUIENIQVIKK3kxMjUwbDJbXSA9IHsJCQkJLyogQ29kZSBQYWdlIDEyNTAgdG8gTGF0aW4tMiAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxNjksIDEzOCwgMTY2LCAxNzEsIDE3NCwgMTcyLAorMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsIDE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxODUsIDE0OSwgMTgyLCAxODcsIDE5MCwgMTg4LAorMTYwLCAxODMsIDE2MiwgMTYzLCAxNjQsIDE2MSwgMTUwLCAxNjcsIDE2OCwgMTUxLCAxNzAsIDE1MiwgMTUzLCAxNzMsIDE1NCwgMTc1LAorMTc2LCAxNTUsIDE3OCwgMTc5LCAxODAsIDE1NiwgMTU3LCAxNTgsIDE4NCwgMTc3LCAxODYsIDE1OSwgMTY1LCAxODksIDE4MSwgMTkxLAorMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksIDIwMCwgMjAxLCAyMDIsIDIwMywgMjA0LCAyMDUsIDIwNiwgMjA3LAorMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLAorMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LAorMjQwLCAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1Cit9OworCitDT05TVCBDSEFSCit5bDJteltdID0gewkJCSAgICAgLyogTGF0aW4tMiB0byBNYXpvdmlhIChOT1QgaW52ZXJ0aWJsZSkgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKzEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywKKzE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwKKzI1NSwgMTQzLCBVTkssIDE1NiwgMTU1LCAgNzYsIDE1MiwgIDIxLCAgMzQsICA4MywgIDgzLCAgODQsIDE2MCwgIDQ1LCAgOTAsIDE2MSwKKzI0OCwgMTM0LCAgNDQsIDE0NiwgIDM5LCAxMDgsIDE1OCwgVU5LLCAgNDQsIDExNSwgMTE1LCAxMTYsIDE2NiwgIDM0LCAxMjIsIDE2NywKKyA4MiwgIDY1LCAgNjUsICA2NSwgMTQyLCAgNzYsIDE0OSwgMTI4LCAgNjcsICA2OSwgMTQ0LCAgNjksICA2OSwgIDczLCAgNzMsICA2OCwKKyA2OCwgMTY1LCAgNzgsIDE2MywgIDc5LCAxNTMsIDE1MywgMjUwLCAgODIsICA4NSwgIDg1LCAxNTQsIDE1NCwgIDg5LCAgODQsIDIyNSwKKzExNCwgIDk3LCAxMzEsICA5NywgMTMyLCAxMDgsIDE0MSwgMTM1LCAgOTksIDEzMCwgMTQ1LCAxMzcsIDEwMSwgMTA1LCAxNDAsIDEwMSwKKzEwMCwgMTY0LCAxMTAsIDE2MiwgMTQ3LCAxNDgsIDE0OCwgMjQ2LCAxMTQsIDExNywgMTE3LCAxMjksIDEyOSwgMTIxLCAxMTYsIDI0OQorfTsKKworQ09OU1QgQ0hBUgoreW16bDJbXSA9IHsJCQkgICAgIC8qIE1hem92aWEgdG8gTGF0aW4tMiAoTk9UIElOVkVSVElCTEUpICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxMjgsIDI1MiwgMjMzLCAyMjYsIDIyOCwgIDk3LCAxNzcsIDIzMSwgMTAxLCAyMzUsIDEwMSwgMTA1LCAyMzgsIDIzMCwgMTk2LCAxNjEsCisyMDIsIDIzNCwgMTc5LCAyNDQsIDI0NiwgMTk4LCAxMTcsIDExNywgMTY2LCAyMTQsIDIyMCwgMTY0LCAxNjMsICA4OSwgMTgyLCAxMDIsCisxNzIsIDE3NSwgMjQzLCAyMTEsIDI0MiwgMjEwLCAxODgsIDE5MSwgIDYzLCBVTkssIFVOSywgVU5LLCBVTkssICAzMywgIDM0LCAgMzQsCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCAyNDcsIFVOSywgMTc2LCAyNTUsIDIxNSwgVU5LLCBVTkssIFVOSywgVU5LLCAxNjAKK307CisKK0NPTlNUIENIQVIKK3lsMmwxW10gPSB7CQkJCS8qIExhdGluLTIgdG8gTGF0aW4tMSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLAorMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAorMTYwLCAnQScsIFVOSywgJ0wnLCAxNjQsICdMJywgJ1MnLCAxNjcsIDE2OCwgJ1MnLCAnUycsICdUJywgJ1onLCAxNzMsICdaJywgJ1onLAorMTc2LCAnYScsIFVOSywgJ2wnLCAxODAsICdsJywgJ3MnLCBVTkssIDE4NCwgJ3MnLCAncycsICd0JywgJ3onLCBVTkssICd6JywgJ3onLAorJ1InLCAxOTMsIDE5NCwgJ0EnLCAxOTYsICdMJywgJ0MnLCAxOTksICdDJywgMjAxLCAnRScsIDIwMywgJ0UnLCAyMDUsICdJJywgJ0QnLAorMjA4LCAnTicsICdOJywgMjExLCAyMTIsICdPJywgMjE0LCAyMTUsICdSJywgJ1UnLCAyMTgsICdVJywgMjIwLCAyMjEsICdUJywgMjIzLAorJ3InLCAyMjUsIDIyNiwgJ2EnLCAyMjgsICdsJywgJ2MnLCAyMzEsICdjJywgMjMzLCAnZScsIDIzNSwgJ2UnLCAyMzcsICdpJywgJ2QnLAorMjQwLCAnbicsICduJywgMjQzLCAyNDQsICdvJywgMjQ2LCAyNDcsICdyJywgJ3UnLCAyNTAsICd1JywgMjUyLCAyNTMsICd0JywgJy4nCit9OworCitDT05TVCBDSEFSCit5bDFsMltdID0gewkJCQkvKiBMYXRpbi0xIHRvIExhdGluLTIgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKzEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywKKzE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwKKzE2MCwgJ0EnLCBVTkssICdMJywgMTY0LCBVTkssIFVOSywgMTY3LCAxNjgsICdDJywgJ2EnLCAnPCcsICc+JywgMTczLCAnUicsIFVOSywKKzE3NiwgVU5LLCBVTkssIFVOSywgMTgwLCBVTkssIFVOSywgVU5LLCAxODQsIFVOSywgJ28nLCAnPicsIFVOSywgVU5LLCBVTkssIFVOSywKKydBJywgMTkzLCAxOTQsICdBJywgMTk2LCAnQScsICdBJywgMTk5LCAnRScsIDIwMSwgJ0UnLCAyMDMsICdJJywgMjA1LCAnSScsICdJJywKKzIwOCwgJ04nLCAnTycsIDIxMSwgMjEyLCAnTycsIDIxNCwgMjE1LCAnTycsICdVJywgMjE4LCAnVScsIDIyMCwgMjIxLCBVTkssIDIyMywKKydhJywgMjI1LCAyMjYsICdhJywgMjI4LCAnYScsICdhJywgMjMxLCAnZScsIDIzMywgJ2UnLCAyMzUsICdpJywgMjM3LCAnaScsICdpJywKKzI0MCwgJ24nLCAnbycsIDI0MywgMjQ0LCAnbycsIDI0NiwgMjQ3LCAnbycsICd1JywgMjUwLCAndScsIDI1MiwgMjUzLCBVTkssICd5JworfTsKKworQ09OU1QgQ0hBUgoreWwyYXNbXSA9IHsJCQkJLyogTGF0aW4tMiB0byBBU0NJSSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLAorVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLAorIDMyLCAnQScsIFVOSywgJ0wnLCBVTkssICdMJywgJ1MnLCBVTkssICAzNCwgJ1MnLCAnUycsICdUJywgJ1onLCAnLScsICdaJywgJ1onLAorVU5LLCAnYScsIFVOSywgJ2wnLCAgMzksICdsJywgJ3MnLCBVTkssICA0NCwgJ3MnLCAncycsICd0JywgJ3onLCBVTkssICd6JywgJ3onLAorJ1InLCAnQScsICdBJywgJ0EnLCAnQScsICdMJywgJ0MnLCAnQycsICdDJywgJ0UnLCAnRScsICdFJywgJ0UnLCAnSScsICdJJywgJ0QnLAorJ0QnLCAnTicsICdOJywgJ08nLCAnTycsICdPJywgJ08nLCAneCcsICdSJywgJ1UnLCAnVScsICdVJywgJ1UnLCAnWScsICdUJywgJ3MnLAorJ3InLCAnYScsICdhJywgJ2EnLCAnYScsICdsJywgJ2MnLCAnYycsICdjJywgJ2UnLCAnZScsICdlJywgJ2UnLCAnaScsICdpJywgJ2QnLAorJ2QnLCAnbicsICduJywgJ28nLCAnbycsICdvJywgJ28nLCAnLycsICdyJywgJ3UnLCAndScsICd1JywgJ3UnLCAneScsICd0JywgJy4nCit9OworI2VuZGlmIC8qIExBVElOMiAqLworCisjaWZkZWYgSEVCUkVXCisvKgorICA4LWJpdCBUYWJsZXMgcHJvdmlkaW5nIGludmVydGlibGUgdHJhbnNsYXRpb24gYmV0d2VlbiBMYXRpbi9IZWJyZXcgYW5kIENQODYyLgorKi8KK0NPTlNUIENIQVIKK3k2MmxoW10gPSB7ICAvKiBQQyBDb2RlIFBhZ2UgODYyIHRvIElTTyA4ODU5LTggTGF0aW4vSGVicmV3ICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksCisyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMTYyLCAxNjMsIDE2NSwgMTI4LCAxMjksCisxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE3MiwgMTg5LCAxODgsIDE0MCwgMTcxLCAxODcsCisxNDEsIDE0MiwgMTQzLCAxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsCisxNTcsIDE1OCwgMTU5LCAxNjEsIDE2NCwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MywgMTc0LCAxNzUsIDIyMywgMTc5LCAxODAsCisxODIsIDE4NCwgMTg1LCAxOTAsIDE5MSwgMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksIDIwMCwgMjAxLCAyMDIsCisyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAxODEsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNSwgMjE2LCAyMTcsCisyMTgsIDE3NywgMjE5LCAyMjAsIDIyMSwgMjIyLCAxODYsIDI1MSwgMTc2LCAxODMsIDI1MiwgMjUzLCAyNTQsIDE3OCwgMjU1LCAxNjAKK307CisKK0NPTlNUIENIQVIKK3lsaDYyW10gPSB7ICAvKiBJU08gODg1OS04IExhdGluL0hlYnJldyB0byBQQyBDb2RlIFBhZ2UgODYyICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxNTgsIDE1OSwgMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzMsIDE3NiwgMTc3LCAxNzgsCisxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsCisyNTUsIDE5NSwgMTU1LCAxNTYsIDE5NiwgMTU3LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMTc0LCAxNzAsIDIwMiwgMjAzLCAyMDQsCisyNDgsIDI0MSwgMjUzLCAyMDYsIDIwNywgMjMwLCAyMDgsIDI0OSwgMjA5LCAyMTAsIDI0NiwgMTc1LCAxNzIsIDE3MSwgMjExLCAyMTIsCisyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsCisyMjksIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyMDUsCisxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsCisxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMjQ3LCAyNTAsIDI1MSwgMjUyLCAyNTQKK307CisvKgorICA3LWJpdCB0YWJsZSBwcm92aWRpbmcgcmVhZGFibGUgdHJhbnNsYXRpb24gZnJvbSBERUMgSGVicmV3LTcgdG8gQ1A4NjIuCisqLworQ09OU1QgQ0hBUgoreWg3NjJbXSA9IHsKKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKK1VOSywgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNworfTsKKy8qCisgIDgtYml0IHRhYmxlIHByb3ZpZGluZyByZWFkYWJsZSB0cmFuc2xhdGlvbiBmcm9tIENQODYyIHRvIEhlYnJldy03LgorKi8KK0NPTlNUIENIQVIKK3k2Mmg3W10gPSB7ICAvKiBQQyBDb2RlIFBhZ2UgODYyIHRvIEhlYnJldy03ICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTksKK307CisvKgorICA3LWJpdCB0YWJsZSBwcm92aWRpbmcgcmVhZGFibGUgdHJhbnNsYXRpb24gZnJvbSBIZWJyZXctNyB0byBJU08gTGF0aW4vSGVicmV3LgorKi8KK0NPTlNUIENIQVIKK3loN2xoW10gPSB7CisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsCisyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcKK307CisvKgorICA4LWJpdCB0YWJsZSBwcm92aWRpbmcgcmVhZGFibGUgdHJhbnNsYXRpb24gZnJvbSBJU08gTGF0aW4vSGVicmV3IHRvIEhlYnJldy03LgorKi8KK0NPTlNUIENIQVIKK3lsaGg3W10gPSB7ICAvKiBMYXRpbi9IZWJyZXcgdG8gSGVicmV3LTcgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKK1VOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywKK1VOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywKK1VOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywKK1VOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywKK1VOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywKK1VOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywKKyA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKzExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSworfTsKKyNlbmRpZiAvKiBIRUJSRVcgKi8KKworI2lmZGVmIEdSRUVLCisvKgorICA4LWJpdCBUYWJsZXMgcHJvdmlkaW5nIGludmVydGlibGUgdHJhbnNsYXRpb24gYmV0d2VlbiBMYXRpbi9HcmVlayBhbmQgQ1A4NjkuCisqLworQ09OU1QgQ0hBUgoreWxnNjlbXSA9IHsgIC8qIElTTyA4ODU5LTcgTGF0aW4vR3JlZWsgdG8gUEMgQ29kZSBQYWdlIDg2OSAqLworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorMTM1LCAxNDcsIDE0OCwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTkxLCAxOTIsIDE5MywgMTk0LAorMTk1LCAxOTYsIDE5NywgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMywgMjU0LAorMjU1LCAxMzksIDE0MCwgMTU2LCAxMjgsIDEyOSwgMTM4LCAyNDUsIDI0OSwgMTUxLCAxMzAsIDE3NCwgMTM3LCAyNDAsIDEzMSwgMTQyLAorMjQ4LCAyNDEsIDE1MywgMTU0LCAyMzksIDI0NywgMTM0LCAxMzYsIDE0MSwgMTQzLCAxNDQsIDE3NSwgMTQ2LCAxNzEsIDE0OSwgMTUyLAorMTYxLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MiwgMTczLCAxODEsIDE4MiwgMTgzLCAxODQsIDE4OSwgMTkwLAorMTk4LCAxOTksIDEzMiwgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAxNDUsIDE1MCwgMTU1LCAxNTcsIDE1OCwgMTU5LAorMjUyLCAyMTQsIDIxNSwgMjE2LCAyMjEsIDIyMiwgMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLAorMjM0LCAyMzUsIDIzNywgMjM2LCAyMzgsIDI0MiwgMjQzLCAyNDQsIDI0NiwgMjUwLCAxNjAsIDI1MSwgMTYyLCAxNjMsIDI1MywgMTMzCit9OworCitDT05TVCBDSEFSCit5NjlsZ1tdID0geyAgLyogUEMgQ29kZSBQYWdlIDg2OSB0byBJU08gODg1OS03IExhdGluL0dyZWVrICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCisxNjQsIDE2NSwgMTcwLCAxNzQsIDIxMCwgMjU1LCAxODIsIDEyOCwgMTgzLCAxNzIsIDE2NiwgMTYxLCAxNjIsIDE4NCwgMTc1LCAxODUsCisxODYsIDIxOCwgMTg4LCAxMjksIDEzMCwgMTkwLCAyMTksIDE2OSwgMTkxLCAxNzgsIDE3OSwgMjIwLCAxNjMsIDIyMSwgMjIyLCAyMjMsCisyNTAsIDE5MiwgMjUyLCAyNTMsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMTg5LCAyMDAsIDIwMSwgMTcxLCAxODcsCisxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAxMzYsIDEzNywgMTM4LCAxMzksIDIwNiwgMjA3LCAxNDAsCisxNDEsIDE0MiwgMTQzLCAxNDQsIDE0NSwgMTQ2LCAyMDgsIDIwOSwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAyMTEsCisyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMjUsIDIyNiwgMjI3LCAxNTQsIDE1NSwgMTU2LCAxNTcsIDIyOCwgMjI5LCAxNTgsCisyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQxLCAyNDMsIDI0MiwgMjQ0LCAxODAsCisxNzMsIDE3NywgMjQ1LCAyNDYsIDI0NywgMTY3LCAyNDgsIDE4MSwgMTc2LCAxNjgsIDI0OSwgMjUxLCAyMjQsIDI1NCwgMTU5LCAxNjAKK307CisvKgorICA3LWJpdCB0YWJsZSBwcm92aWRpbmcgcmVhZGFibGUgdHJhbnNsYXRpb24gZnJvbSBFTE9UIDkyNyB0byBDUDg2OS4KKyovCitDT05TVCBDSEFSCit5ZWc2OVtdID0geworICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LAorIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LAorIDk2LCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MiwgMTczLCAxODEsIDE4MiwgMTgzLCAxODQsIDE4OSwgMTkwLAorMTk4LCAxOTksIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgIDMyLCAgMzIsICAyMywgMTI0LCAxMjUsIDEyNiwgMTI3Cit9OworLyoKKyAgOC1iaXQgdGFibGUgcHJvdmlkaW5nIHJlYWRhYmxlIHRyYW5zbGF0aW9uIGZyb20gQ1A4NjkgdG8gRUxPVCA5MjcuCisqLworQ09OU1QgQ0hBUgoreTY5ZWdbXSA9IHsgIC8qIFBDIENvZGUgUGFnZSA4NjkgdG8gRUxPVCA5MjcgKi8KKyAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKKyAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKKyA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyA5NiwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKK1VOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssICA5NywgVU5LLCAgNDYsIFVOSywgMTI0LCAgMzksICAzOSwgMTAxLCAgNDUsIDEwMywKKzEwNSwgMTA1LCAxMTEsIFVOSywgVU5LLCAxMTYsIDExNiwgVU5LLCAxMjAsICA1MCwgIDUxLCAgOTcsIFVOSywgMTAxLCAxMDMsIDEwNSwKKzEwNSwgMTA1LCAxMTEsIDExNiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCBVTkssIDEwNCwgMTA1LCAgMzQsICAzNCwKK1VOSywgVU5LLCBVTkssIFVOSywgVU5LLCAxMDYsIDEwNywgMTA4LCAxMDksIFVOSywgVU5LLCBVTkssIFVOSywgMTEwLCAxMTEsIFVOSywKK1VOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIDExMiwgMTEzLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIDExNCwKKzExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsICA5NywgIDk4LCAgOTksIFVOSywgVU5LLCBVTkssIFVOSywgMTAwLCAxMDEsIFVOSywKKzEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwgMTE0LCAxMTUsICAzOSwKKyA0NSwgVU5LLCAxMTYsIDExNywgMTE4LCBVTkssIDExOSwgVU5LLCBVTkssIFVOSywgMTIwLCAxMTYsIDExNiwgMTIwLCBVTkssICAzMgorCit9OworLyoKKyAgNy1iaXQgdGFibGUgcHJvdmlkaW5nIHJlYWRhYmxlIHRyYW5zbGF0aW9uIGZyb20gRUxPVCA5MjcgdG8gSVNPIExhdGluL0dyZWVrLgorKi8KK0NPTlNUIENIQVIKK3llZ2xnW10gPSB7CisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsCisyMDgsIDIwOSwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAgMzIsICAzMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcKK307CisvKgorICA4LWJpdCB0YWJsZSBwcm92aWRpbmcgcmVhZGFibGUgdHJhbnNsYXRpb24gZnJvbSBJU08gTGF0aW4vR3JlZWsgdG8gRUxPVCA5MjcuCisqLworQ09OU1QgQ0hBUgoreWxnZWdbXSA9IHsgIC8qIExhdGluL0dyZWVrIHRvIEVMT1QgOTI3ICovCisgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCisgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgOTYsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCisgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCitVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssIFVOSywgVU5LLCBVTkssCisgMzIsICAzOSwgIDM5LCBVTkssIFVOSywgVU5LLCAxMjQsIFVOSywgIDM0LCBVTkssIFVOSywgIDM0LCBVTkssICA0NSwgVU5LLCAgNDUsCitVTkssIFVOSywgIDUwLCAgNTEsICAzOSwgVU5LLCAgOTcsICA0NiwgMTAxLCAxMDMsIDEwNSwgIDM0LCAxMTEsIFVOSywgMTE2LCAxMjAsCitVTkssICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgVU5LLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEwNSwgMTE2LCAgOTcsIDEwMSwgMTAzLCAxMDUsCisxMTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEwNSwgMTE2LCAxMTEsIDExNiwgMTIwLCBVTksKK307CisjZW5kaWYgLyogR1JFRUsgKi8KKworLyogVHJhbnNsYXRpb24gZnVuY3Rpb25zIC4uLiAqLworCitDSEFSCQkJCQkvKiBUaGUgaWRlbnRpdHkgZnVuY3Rpb24uLi4gKi8KKyNpZmRlZiBDS19BTlNJQworaWRlbnQoQ0hBUiBjKQkJCQkvKiAobm8gbG9uZ2VyIHVzZWQpICovCisjZWxzZQoraWRlbnQoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIGlkZW50ICovCisgICAgcmV0dXJuKGMpOwkJCQkvKiBJbnN0ZWFkLCBlbnRlciBOVUxMIGluIHRoZSAgKi8KK30JCQkJCS8qIHRhYmxlIG9mIGZ1bmN0aW9ucyB0byBhdm9pZCAqLworCQkJCQkvKiBuZWVkbGVzcyBmdW5jdGlvbiBjYWxscy4gICAgKi8KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bGVmdDEyOChDSEFSIGMpCisjZWxzZQoreGxlZnQxMjgoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsZWZ0MTI4ICovCisgICAgcmV0dXJuKChjIDwgMTI4KSA/IGMgOiAnPycpOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsZWZ0MTYwKENIQVIgYykKKyNlbHNlCit4bGVmdDE2MChjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxlZnQxNjAgKi8KKyAgICByZXR1cm4oKGMgPCAxNjApID8gYyA6ICc/Jyk7Cit9CisKKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDFhcyhDSEFSIGMpCisjZWxzZQoreGwxYXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMWFzICovIAkJCQkvKiBMYXRpbi0xIHRvIFVTIEFTQ0lJLi4uICovCisgICAgc3dpdGNoKGxhbmdzW2xhbmd1YWdlXS5pZCkgeworCisgICAgICBjYXNlIExfRFVUQ0g6CisJaWYgKGMgPT0gMjU1KSB7CQkJLyogRHV0Y2ggdW1sYXV0LXkgKi8KKwkgICAgem1zdHVmZignaicpOwkJLyogYmVjb21lcyBpaiAqLworCSAgICByZXR1cm4oJ2knKTsKKwl9IGVsc2UgcmV0dXJuKHlsMWFzW2NdKTsJLyogYWxsIG90aGVycyBieSB0aGUgYm9vayAqLworCisgICAgICBjYXNlIExfR0VSTUFOOgorCXN3aXRjaCAoYykgewkJCS8qIEdlcm1hbiwgc3BlY2lhbCBydWxlcy4gKi8KKwkgIGNhc2UgMTk2OgkJCS8qIHVtbGF1dC1BIC0+IEFlICovCisJICAgIHptc3R1ZmYoJ2UnKTsKKwkgICAgcmV0dXJuKCdBJyk7CisJICBjYXNlIDIxNDoJCQkvKiB1bWxhdXQtTyAtPiBPZSAqLworCSAgICB6bXN0dWZmKCdlJyk7CisJICAgIHJldHVybignTycpOworCSAgY2FzZSAyMjA6CQkJLyogdW1sYXV0LVUgLT4gVWUgKi8KKwkgICAgem1zdHVmZignZScpOworCSAgICByZXR1cm4oJ1UnKTsKKwkgIGNhc2UgMjI4OgkJCS8qIHVtbGF1dC1hIC0+IGFlICovCisJICAgIHptc3R1ZmYoJ2UnKTsKKwkgICAgcmV0dXJuKCdhJyk7CisJICBjYXNlIDI0NjoJCQkvKiB1bWxhdXQtbyAtPiBvZSAqLworCSAgICB6bXN0dWZmKCdlJyk7CisJICAgIHJldHVybignbycpOworCSAgY2FzZSAyNTI6CQkJLyogdW1sYXV0LXUgLT4gdWUgKi8KKwkgICAgem1zdHVmZignZScpOworCSAgICByZXR1cm4oJ3UnKTsKKwkgIGNhc2UgMjIzOgkJCS8qIGVzcy16ZXQgLT4gc3MgKi8KKwkgICAgem1zdHVmZigncycpOworCSAgICByZXR1cm4oJ3MnKTsKKwkgIGRlZmF1bHQ6IHJldHVybih5bDFhc1tjXSk7CS8qIGFsbCBvdGhlcnMgYnkgdGhlIGJvb2sgKi8KKwl9CisgICAgICBjYXNlIExfREFOSVNIOgorICAgICAgY2FzZSBMX0ZJTk5JU0g6CisgICAgICBjYXNlIExfTk9SV0VHSUFOOgorICAgICAgY2FzZSBMX1NXRURJU0g6CisJc3dpdGNoIChjKSB7CQkJLyogU2NhbmRhbmF2aWFuIGxhbmd1YWdlcy4gKi8KKwkgIGNhc2UgMTk2OgkJCS8qIHVtbGF1dC1BIC0+IEFlICovCisgICAgICAgICAgY2FzZSAxOTg6CQkJLyogQUUgbGlnYXR1cmUgYWxzbyAtPiBBZSAqLworCSAgICB6bXN0dWZmKCdlJyk7CisJICAgIHJldHVybignQScpOworCSAgY2FzZSAyMTQ6CQkJLyogdW1sYXV0LU8gLT4gT2UgKi8KKwkgIGNhc2UgMjE2OgkJCS8qIE8tc2xhc2ggLT4gT2UgKi8KKwkgICAgem1zdHVmZignZScpOworCSAgICByZXR1cm4oJ08nKTsKKwkgIGNhc2UgMjIwOgkJCS8qIHVtbGF1dC1VIC0+IFVlICovCisJICAvKiAgcmV0dXJuKCdZJyk7IHJlcGxhY2VkIGJ5ICJVZSIgYnkgcG9wdWxhciBkZW1hbmQuICovCisgICAgICAgICAgLyogIFkgZm9yIFVtbGF1dC1VIGlzIG9ubHkgdXNlZCBpbiBHZXJtYW4gbmFtZXMuICovCisJICAgIHptc3R1ZmYoJ2UnKTsKKwkgICAgcmV0dXJuKCdVJyk7CisJICBjYXNlIDIyODoJCQkvKiB1bWxhdXQtYSAtPiBhZSAqLworICAgICAgICAgIGNhc2UgMjMwOgkJCS8qIGRpdHRvIGZvciBhZSBsaWdhdHVyZSAqLworCSAgICB6bXN0dWZmKCdlJyk7CisJICAgIHJldHVybignYScpOworCSAgY2FzZSAyNDY6CQkJLyogdW1sYXV0LW8gLT4gb2UgKi8KKwkgIGNhc2UgMjQ4OgkJCS8qIG8tc2xhc2ggLT4gb2UgKi8KKwkgICAgem1zdHVmZignZScpOworCSAgICByZXR1cm4oJ28nKTsKKwkgIGNhc2UgMjUyOgkJCS8qIHVtbGF1dC11IC0+IHVlICovCisJICAvKiAgcmV0dXJuKCd5Jyk7IHJlcGxhY2VkIGJ5ICJ1ZSIgYnkgcG9wdWxhciBkZW1hbmQuICovCisJICAgIHptc3R1ZmYoJ2UnKTsKKwkgICAgcmV0dXJuKCd1Jyk7CisJICBjYXNlIDE5NzoJCQkvKiBBLXJpbmcgLT4gQWEgKi8KKwkgICAgem1zdHVmZignYScpOworCSAgICByZXR1cm4oJ0EnKTsKKyAgICAgICAgICBjYXNlIDIyOToJCQkvKiBhLXJpbmcgLT4gYWEgKi8KKwkgICAgem1zdHVmZignYScpOworCSAgICByZXR1cm4oJ2EnKTsKKwkgIGRlZmF1bHQ6IHJldHVybih5bDFhc1tjXSk7CS8qIEFsbCBvdGhlcnMgYnkgdGhlIGJvb2sgKi8KKwl9CisgICAgICBjYXNlIExfSUNFTEFORElDOgkJCS8qIEljZWxhbmRpYy4gKi8KKwlzd2l0Y2ggKGMpIHsKKwkgIGNhc2UgMTk4OgkJCS8qIHVwcGVyY2FzZSBBRSAtPiBBRSAqLworCSAgICB6bXN0dWZmKCdlJyk7CisJICAgIHJldHVybignQScpOworCSAgY2FzZSAyMDg6CQkJLyogdXBwZXJjYXNlIEV0aCAtPiBEICovCisJICAgIHJldHVybignRCcpOworCSAgY2FzZSAyMTQ6CQkJLyogdXBwZXJjYXNlIE8tZGlhZXJlc2lzIC0+IE9lICovCisJICAgIHptc3R1ZmYoJ2UnKTsKKwkgICAgcmV0dXJuKCdPJyk7CisJICBjYXNlIDIyMjoJCQkvKiB1cHBlcmNhc2UgVGhvcm4gLT4gVGggKi8KKwkgICAgem1zdHVmZignaCcpOworCSAgICByZXR1cm4oJ1QnKTsKKwkgIGNhc2UgMjMwOgkJCS8qIGxvd2VyY2FzZSBhZSAtPiBhZSAqLworCSAgICB6bXN0dWZmKCdlJyk7CisJICAgIHJldHVybignYScpOworCSAgY2FzZSAyNDA6CQkJLyogbG93ZXJjYXNlIEV0aCAtPiBkICovCisJICAgIHJldHVybignZCcpOworCSAgY2FzZSAyNDY6CQkJLyogbG93ZXJjYXNlIE8tZGlhZXJlc2lzIC0+IG9lICovCisJICAgIHptc3R1ZmYoJ2UnKTsKKwkgICAgcmV0dXJuKCdvJyk7CisJICBjYXNlIDI1NDoJCQkvKiBsb3dlcmNhc2UgVGhvcm4gLT4gdGggKi8KKwkgICAgem1zdHVmZignaCcpOworCSAgICByZXR1cm4oJ3QnKTsKKwkgIGRlZmF1bHQ6IHJldHVybih5bDFhc1tjXSk7CS8qIEFsbCBvdGhlcnMgYnkgdGhlIGJvb2sgKi8KKwl9CisgICAgICBkZWZhdWx0OgorCXJldHVybih5bDFhc1tjXSk7CQkvKiBOb25lIG9mIHRoZSBhYm92ZSwgYnkgdGhlIHRhYmxlLiAqLworICAgIH0KK30KKworQ0hBUgkJCQkJLyogQ1AxMjUyIHRvIEFTQ0lJICovCisjaWZkZWYgQ0tfQU5TSUMKK3h3MWFzKENIQVIgYykKKyNlbHNlCit4dzFhcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeHcxYXMgKi8KKyAgICBzd2l0Y2goYykgewkJCQkvKiBNaWNyb3NvZnQgbmFtZS4uLiAqLworICAgICAgY2FzZSAweDgwOiByZXR1cm4oJz8nKTsJCS8qIEV1cm8gU2lnbiAqLworICAgICAgY2FzZSAweDgyOiByZXR1cm4oJ1wwNDcnKTsJLyogU2luZ2xlIExvdy05IFF1b3RhdGlvbiBNYXJrICovCisgICAgICBjYXNlIDB4ODM6IHJldHVybignZicpOwkJLyogTGF0aW4gU21hbGwgTGV0dGVyIGYgd2l0aCBIb29rICovCisgICAgICBjYXNlIDB4ODQ6IHJldHVybignIicpOwkJLyogRG91YmxlIGxvdy05IFF1b3RhdGlvbiBNYXJrICovCisgICAgICBjYXNlIDB4ODU6IHJldHVybignLScpOwkJLyogSG9yaXpvbnRhbCBFbGxpcHNpcyAqLworICAgICAgY2FzZSAweDg2OiByZXR1cm4oJysnKTsJCS8qIERhZ2dlciAqLworICAgICAgY2FzZSAweDg3OiByZXR1cm4oJysnKTsJCS8qIERvdWJsZSBEYWdnZXIgKi8KKyAgICAgIGNhc2UgMHg4ODogcmV0dXJuKCdeJyk7CQkvKiBNb2RpZmllciBMZXR0ZXIgQ2lyY3VtZmxleCBBY2NlbnQgKi8KKyAgICAgIGNhc2UgMHg4OTogcmV0dXJuKCc/Jyk7CQkvKiBQZXIgTWlsbGUgU2lnbiAqLworICAgICAgY2FzZSAweDhBOiByZXR1cm4oJ1MnKTsJCS8qIExhdGluIENhcGl0YWwgTGV0dGVyIFMgd2l0aCBDYXJvbiAqLworICAgICAgY2FzZSAweDhCOiByZXR1cm4oJzwnKTsJCS8qIFNpbmdsZSBMZWZ0IEFuZ2xlIFF1b3RhdGlvbiBNYXJrICovCisgICAgICBjYXNlIDB4OEM6IHJldHVybignTycpOwkJLyogTGF0aW4gQ2FwaXRhbCBMaWdhdHVyZSBPRSAqLworICAgICAgY2FzZSAweDhFOiByZXR1cm4oJ1onKTsJCS8qIExhdGluIENhcGl0YWwgTGV0dGVyIFogd2l0aCBDYXJvbiAqLworICAgICAgY2FzZSAweDkxOiByZXR1cm4oJ1wwNDcnKTsJLyogTGVmdCBTaW5nbGUgUXVvdGF0aW9uIE1hcmsgKi8KKyAgICAgIGNhc2UgMHg5MjogcmV0dXJuKCdcMDQ3Jyk7CS8qIFJpZ2h0IFNpbmdsZSBRdW90YXRpb24gTWFyayAqLworICAgICAgY2FzZSAweDkzOiByZXR1cm4oJyInKTsJCS8qIExlZnQgRG91YmxlIFF1b3RhdGlvbiBNYXJrICovCisgICAgICBjYXNlIDB4OTQ6IHJldHVybignIicpOwkJLyogUmlnaHQgRG91YmxlIFF1b3RhdGlvbiBNYXJrICovCisgICAgICBjYXNlIDB4OTU6IHJldHVybignLicpOwkJLyogQnVsbGV0ICovCisgICAgICBjYXNlIDB4OTY6IHJldHVybignLScpOwkJLyogRW4gRGFzaCAqLworICAgICAgY2FzZSAweDk3OiByZXR1cm4oJy0nKTsJCS8qIEVtIERhc2ggKi8KKyAgICAgIGNhc2UgMHg5ODogcmV0dXJuKCd+Jyk7CQkvKiBTbWFsbCBUaWxkZSAqLworICAgICAgY2FzZSAweDk5OiByZXR1cm4oJ1QnKTsJCS8qIFRyYWRlIE1hcmsgU2lnbiAqLworICAgICAgY2FzZSAweDlBOiByZXR1cm4oJ3MnKTsJCS8qIExhdGluIFNtYWxsIExldHRlciBzIHdpdGggQ2Fyb24gKi8KKyAgICAgIGNhc2UgMHg5QjogcmV0dXJuKCc+Jyk7CQkvKiBTaW5nbGUgUmlnaHQgQW5nbGUgUXVvdGF0aW9uIE1hcmsgKi8KKyAgICAgIGNhc2UgMHg5QzogcmV0dXJuKCdvJyk7CQkvKiBMYXRpbiBTbWFsbCBMaWdhdHVyZSBPRSAqLworICAgICAgY2FzZSAweDlFOiByZXR1cm4oJ3onKTsJCS8qIExhdGluIFNtYWxsIExldHRlciB6IHdpdGggQ2Fyb24gKi8KKyAgICAgIGNhc2UgMHg5RjogcmV0dXJuKCdZJyk7CQkvKiBMYXRpbiBDYXBpdGFsIExldHRlciBZIERpYWVyZXNpcyAqLworICAgICAgZGVmYXVsdDoKKwlpZiAoYyA+IDB4ODAgJiYgYyA8IDB4YTApCisJICByZXR1cm4oJz8nKTsKKwllbHNlCisJICByZXR1cm4oeWwxYXNbY10pOworICAgIH0KK30KKworQ0hBUgkJCQkJLyogQ1AxMjUyIHRvIExhdGluLTEgKi8KKyNpZmRlZiBDS19BTlNJQworeHcxbDEoQ0hBUiBjKQorI2Vsc2UKK3h3MWwxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4dzFsMSAqLworICAgIGlmIChjID09IDB4OTUpIHJldHVybigweGI3KTsJLyogTWlkZGxlIGRvdCAqLworICAgIHJldHVybigoYyA8IDE2MCkgPyB4dzFhcyhjKSA6IGMpOworfQorCitDSEFSCQkJCQkvKiBMYXRpbi0xIHRvIEdlcm1hbiAqLworI2lmZGVmIENLX0FOU0lDCit4bDFnZShDSEFSIGMpCisjZWxzZQoreGwxZ2UoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMWdlICovCisgICAgcmV0dXJuKHlsMWdlW2NdKTsKK30KKworQ0hBUgkJCQkJLyogR2VybWFuIHRvIExhdGluLTEgKi8KKyNpZmRlZiBDS19BTlNJQworeGdlbDEoQ0hBUiBjKQorI2Vsc2UKK3hnZWwxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4Z2VsMSAqLworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIHJldHVybih5Z2VsMVtjXSk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGdlYXMoQ0hBUiBjKQorI2Vsc2UKK3hnZWFzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4Z2VhcyAqLwkJCQkvKiBHZXJtYW4gSVNPIDY0NiB0byBBU0NJSSAqLworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSA5MToJCQkJLyogdW1sYXV0LUEgLT4gQWUgKi8KKwl6bXN0dWZmKCdlJyk7CisJcmV0dXJuKCdBJyk7CisgICAgICBjYXNlIDkyOgkJCQkvKiB1bWxhdXQtTyAtPiBPZSAqLworCXptc3R1ZmYoJ2UnKTsKKwlyZXR1cm4oJ08nKTsKKyAgICAgIGNhc2UgOTM6CQkJCS8qIHVtbGF1dC1VIC0+IFVlICovCisJem1zdHVmZignZScpOworCXJldHVybignVScpOworICAgICAgY2FzZSAxMjM6CQkJCS8qIHVtbGF1dC1hIC0+IGFlICovCisJem1zdHVmZignZScpOworCXJldHVybignYScpOworICAgICAgY2FzZSAxMjQ6CQkJCS8qIHVtbGF1dC1vIC0+IG9lICovCisJem1zdHVmZignZScpOworCXJldHVybignbycpOworICAgICAgY2FzZSAxMjU6CQkJCS8qIHVtbGF1dC11IC0+IHVlICovCisJem1zdHVmZignZScpOworCXJldHVybigndScpOworICAgICAgY2FzZSAxMjY6CQkJCS8qIGVzcy16ZXQgLT4gc3MgKi8KKwl6bXN0dWZmKCdzJyk7CisJcmV0dXJuKCdzJyk7CisgICAgICBkZWZhdWx0OiAgcmV0dXJuKGMpOwkJLyogYWxsIG90aGVycyBzdGF5IHRoZSBzYW1lICovCisgICAgfQorfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsMXcxKENIQVIgYykKKyNlbHNlCit4bDF3MShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwxdzEgKi8JCQkJLyogTGF0aW4tMSB0byBDUDEyNTIgKFdpbmRvd3MgTDEpICovCisgICAgaWYgKGMgPiAxMjcgJiYgYyA8IDE2MCkKKyAgICAgIHJldHVybihVTkspOworICAgIGVsc2UKKyAgICAgIHJldHVybihjKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4ZHVhcyhDSEFSIGMpCisjZWxzZQoreGR1YXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhkdWFzICovCQkJCS8qIER1dGNoIElTTyA2NDYgdG8gVVMgQVNDSUkgKi8KKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgNjQ6ICByZXR1cm4oVU5LKTsJCS8qIDMvNCAqLworICAgICAgY2FzZSA5MToJCQkJLyogeS1kaWFlcmVzaXMgKi8KKwl6bXN0dWZmKCdqJyk7CisJcmV0dXJuKCdpJyk7CisgICAgICBjYXNlIDkyOiAgcmV0dXJuKFVOSyk7CQkvKiAxLzIgKi8KKyAgICAgIGNhc2UgOTM6ICByZXR1cm4oMTI0KTsJCS8qIHZlcnRpY2FsIGJhciAqLworICAgICAgY2FzZSAxMjM6IHJldHVybigzNCk7CQkvKiBkaWFlcmVzaXMgKi8KKyAgICAgIGNhc2UgMTI0OiByZXR1cm4oVU5LKTsJCS8qIEZsb3JpbiAqLworICAgICAgY2FzZSAxMjU6IHJldHVybihVTkspOwkJLyogMS80ICovCisgICAgICBjYXNlIDEyNjogcmV0dXJuKDM5KTsJCS8qIEFwb3N0cm9waGUgKi8KKyAgICAgIGRlZmF1bHQ6ICByZXR1cm4oYyk7CisgICAgfQorfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hmaWFzKENIQVIgYykKKyNlbHNlCit4ZmlhcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGZpYXMgKi8JCQkJLyogRmlubmlzaCBJU08gNjQ2IHRvIFVTIEFTQ0lJICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDkxOgkJCQkvKiBBLWRpYWVyZXNpcyAqLworCXptc3R1ZmYoJ2UnKTsKKwlyZXR1cm4oJ0EnKTsKKyAgICAgIGNhc2UgOTI6CQkJCS8qIE8tZGlhZXJlc2lzICovCisJem1zdHVmZignZScpOworCXJldHVybignTycpOworICAgICAgY2FzZSA5MzoJCQkJLyogQS1yaW5nICovCisJem1zdHVmZignYScpOworCXJldHVybignQScpOworICAgICAgY2FzZSA5NDoJCQkJLyogVS1kaWFlcmVzaXMgKi8KKwkvKiByZXR1cm4oJ1knKTsgKi8KKwl6bXN0dWZmKCdlJyk7CisJcmV0dXJuKCdVJyk7CisgICAgICBjYXNlIDk2OgkJCQkvKiBlLWFjdXRlICovCisJcmV0dXJuKCdlJyk7CisgICAgICBjYXNlIDEyMzoJCQkJLyogYS1kaWFlcmVzaXMgKi8KKwl6bXN0dWZmKCdlJyk7CisJcmV0dXJuKCdhJyk7CisgICAgICBjYXNlIDEyNDoJCQkJLyogby1kaWFlcmVzaXMgKi8KKwl6bXN0dWZmKCdlJyk7CisJcmV0dXJuKCdvJyk7CisgICAgICBjYXNlIDEyNToJCQkJLyogYS1yaW5nICovCisJem1zdHVmZignYScpOworCXJldHVybignYScpOworICAgICAgY2FzZSAxMjY6CQkJCS8qIHUtZGlhZXJlc2lzICovCisJLyogcmV0dXJuKCd5Jyk7ICovCisJem1zdHVmZignZScpOworCXJldHVybignVScpOworICAgICAgZGVmYXVsdDoKKwlyZXR1cm4oYyk7CisgICAgfQorfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hmcmFzKENIQVIgYykKKyNlbHNlCit4ZnJhcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGZyYXMgKi8JCQkJLyogRnJlbmNoIElTTyA2NDYgdG8gVVMgQVNDSUkgKi8KKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgNjQ6ICByZXR1cm4oOTcpOwkJLyogYSBncmF2ZSAqLworICAgICAgY2FzZSA5MTogIHJldHVybihVTkspOwkJLyogZGVncmVlIHNpZ24gKi8KKyAgICAgIGNhc2UgOTI6ICByZXR1cm4oOTkpOwkJLyogYyBjZWRpbGxhICovCisgICAgICBjYXNlIDkzOiAgcmV0dXJuKFVOSyk7CQkvKiBwYXJhZ3JhcGggc2lnbiAqLworICAgICAgY2FzZSAxMjM6IHJldHVybigxMDEpOwkJLyogZSBhY3V0ZSAqLworICAgICAgY2FzZSAxMjQ6IHJldHVybigxMTcpOwkJLyogdSBncmF2ZSAqLworICAgICAgY2FzZSAxMjU6IHJldHVybigxMDEpOwkJLyogZSBncmF2ZSAqLworICAgICAgY2FzZSAxMjY6IHJldHVybigzNCk7CQkvKiBkaWFlcmVzaXMgKi8KKyAgICAgIGRlZmF1bHQ6ICByZXR1cm4oYyk7CisgICAgfQorfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hmY2FzKENIQVIgYykKKyNlbHNlCit4ZmNhcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGZjYXMgKi8JCQkJLyogRnJlbmNoIENhbmFkaWFuIElTTyA2NDYgdG8gQVNDSUkgKi8KKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgNjQ6ICByZXR1cm4oJ2EnKTsJCS8qIGEgZ3JhdmUgKi8KKyAgICAgIGNhc2UgOTE6ICByZXR1cm4oJ2EnKTsJCS8qIGEgY2lyY3VtZmxleCAqLworICAgICAgY2FzZSA5MjogIHJldHVybignYycpOwkJLyogYyBjZWRpbGxhICovCisgICAgICBjYXNlIDkzOiAgcmV0dXJuKCdlJyk7CQkvKiBlIGNpcmN1bWZsZXggKi8KKyAgICAgIGNhc2UgOTQ6ICByZXR1cm4oJ2knKTsJCS8qIGkgY2lyY3VtZmxleCAqLworICAgICAgY2FzZSA5NjogIHJldHVybignbycpOwkJLyogbyBjaXJjdW1mbGV4ICovCisgICAgICBjYXNlIDEyMzogcmV0dXJuKCdlJyk7CQkvKiBlIGFjdXRlICovCisgICAgICBjYXNlIDEyNDogcmV0dXJuKCd1Jyk7CQkvKiB1IGdyYXZlICovCisgICAgICBjYXNlIDEyNTogcmV0dXJuKCdlJyk7CQkvKiBlIGdyYXZlICovCisgICAgICBjYXNlIDEyNjogcmV0dXJuKCd1Jyk7CQkvKiB1IGNpcmN1bWZsZXggKi8KKyAgICAgIGRlZmF1bHQ6ICByZXR1cm4oYyk7CisgICAgfQorfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hpdGFzKENIQVIgYykKKyNlbHNlCit4aXRhcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGl0YXMgKi8JCQkJLyogSXRhbGlhbiBJU08gNjQ2IHRvIEFTQ0lJICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDkxOiAgcmV0dXJuKFVOSyk7CQkvKiBkZWdyZWUgKi8KKyAgICAgIGNhc2UgOTI6ICByZXR1cm4oJ2MnKTsJCS8qIGMgY2VkaWxsYSAqLworICAgICAgY2FzZSA5MzogIHJldHVybignZScpOwkJLyogZSBhY3V0ZSAqLworICAgICAgY2FzZSA5NjogIHJldHVybigndScpOwkJLyogdSBncmF2ZSAqLworICAgICAgY2FzZSAxMjM6IHJldHVybignYScpOwkJLyogYSBncmF2ZSAqLworICAgICAgY2FzZSAxMjQ6IHJldHVybignbycpOwkJLyogbyBncmF2ZSAqLworICAgICAgY2FzZSAxMjU6IHJldHVybignZScpOwkJLyogZSBncmF2ZSAqLworICAgICAgY2FzZSAxMjY6IHJldHVybignaScpOwkJLyogaSBncmF2ZSAqLworICAgICAgZGVmYXVsdDogIHJldHVybihjKTsKKyAgICB9Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeG5lYXMoQ0hBUiBjKQorI2Vsc2UKK3huZWFzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bmVhcyAqLwkJCQkvKiBOZVhUIHRvIEFTQ0lJICovCisgICAgaWYgKGxhbmdzW2xhbmd1YWdlXS5pZCA9PSBMX0ZSRU5DSCkgeyAvKiBJZiBTRVQgTEFOR1VBR0UgRlJFTkNIICovCisJaWYgKGMgPT0gMjM0KSB7CQkJLyogaGFuZGxlIE9FIGRpZ3JhcGguICovCisJICAgIHptc3R1ZmYoJ0UnKTsKKwkgICAgcmV0dXJuKCdPJyk7CisJfSBlbHNlIGlmIChjID09IDI1MCkgewkJLyogQWxzbyBsb3dlcmNhc2Ugb2UuICovCisJICAgIHptc3R1ZmYoJ2UnKTsKKwkgICAgcmV0dXJuKCdvJyk7CisJfQorICAgIH0KKyAgICBjID0geG5lbDEoYyk7CQkJLyogQ29udmVydCB0byBMYXRpbi0xICovCisgICAgcmV0dXJuKHlsMWFzW2NdKTsJCQkvKiBDb252ZXJ0IExhdGluLTEgdG8gQVNDSUkgKi8KK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bm9hcyhDSEFSIGMpCisjZWxzZQoreG5vYXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhub2FzICovCQkJCS8qIE5vcmdlL0RhbmlzaCBJU08gNjQ2IHRvIEFTQ0lJICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDkxOgorCXptc3R1ZmYoJ0UnKTsJCQkvKiBBRSBkaWdyYXBoICovCisJcmV0dXJuKCdBJyk7CisgICAgICBjYXNlIDkyOiByZXR1cm4oJ08nKTsJCS8qIE8gc2xhc2ggKi8KKyAgICAgIGNhc2UgOTM6CQkJCS8qIEEgcmluZyAqLworCXptc3R1ZmYoJ2EnKTsKKwlyZXR1cm4oJ0EnKTsKKyAgICAgIGNhc2UgMTIzOgkJCQkvKiBhZSBkaWdyYXBoICovCisJem1zdHVmZignZScpOworCXJldHVybignYScpOworICAgICAgY2FzZSAxMjQ6IHJldHVybignbycpOwkJLyogbyBzbGFzaCAqLworICAgICAgY2FzZSAxMjU6CQkJCS8qIGEgcmluZyAqLworCXptc3R1ZmYoJ2EnKTsKKwlyZXR1cm4oJ2EnKTsKKyAgICAgIGRlZmF1bHQ6ICByZXR1cm4oYyk7CisgICAgfQorfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hwb2FzKENIQVIgYykKKyNlbHNlCit4cG9hcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeHBvYXMgKi8JCQkJLyogUG9ydHVndWVzZSBJU08gNjQ2IHRvIEFTQ0lJICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDkxOiAgcmV0dXJuKCdBJyk7CQkvKiBBIHRpbGRlICovCisgICAgICBjYXNlIDkyOiAgcmV0dXJuKCdDJyk7CQkvKiBDIGNlZGlsbGEgKi8KKyAgICAgIGNhc2UgOTM6ICByZXR1cm4oJ08nKTsJCS8qIE8gdGlsZGUgKi8KKyAgICAgIGNhc2UgMTIzOiByZXR1cm4oJ2EnKTsJCS8qIGEgdGlsZGUgKi8KKyAgICAgIGNhc2UgMTI0OiByZXR1cm4oJ2MnKTsJCS8qIGMgY2VkaWxsYSAqLworICAgICAgY2FzZSAxMjU6IHJldHVybignbycpOwkJLyogbyB0aWxkZSAqLworICAgICAgZGVmYXVsdDogIHJldHVybihjKTsKKyAgICB9Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeHNwYXMoQ0hBUiBjKQorI2Vsc2UKK3hzcGFzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4c3BhcyAqLwkJCQkvKiBTcGFuaXNoIElTTyA2NDYgdG8gQVNDSUkgKi8KKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgOTE6ICByZXR1cm4oMzMpOwkJLyogSW52ZXJ0ZWQgZXhjbGFtYXRpb24gKi8KKyAgICAgIGNhc2UgOTI6ICByZXR1cm4oJ04nKTsJCS8qIE4gdGlsZGUgKi8KKyAgICAgIGNhc2UgOTM6ICByZXR1cm4oNjMpOwkJLyogSW52ZXJ0ZWQgcXVlc3Rpb24gbWFyayAqLworICAgICAgY2FzZSAxMjM6IHJldHVybihVTkspOwkJLyogZGVncmVlICovCisgICAgICBjYXNlIDEyNDogcmV0dXJuKCduJyk7CQkvKiBuIHRpbGRlICovCisgICAgICBjYXNlIDEyNTogcmV0dXJuKCdjJyk7CQkvKiBjIGNlZGlsbGEgKi8KKyAgICAgIGRlZmF1bHQ6ICByZXR1cm4oYyk7CisgICAgfQorfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hzd2FzKENIQVIgYykKKyNlbHNlCit4c3dhcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeHN3YXMgKi8JCQkJLyogU3dlZGlzaCBJU08gNjQ2IHRvIEFTQ0lJICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDY0OiAgcmV0dXJuKCdFJyk7CQkvKiBFIGFjdXRlICovCisgICAgICBjYXNlIDkxOgkJCQkvKiBBIGRpYWVyZXNpcyAqLworCXptc3R1ZmYoJ2UnKTsKKwlyZXR1cm4oJ0EnKTsKKyAgICAgIGNhc2UgOTI6CQkJCS8qIE8gZGlhZXJlc2lzICovCisJem1zdHVmZignZScpOworCXJldHVybignTycpOworICAgICAgY2FzZSA5MzoJCQkJLyogQSByaW5nICovCisJem1zdHVmZignYScpOworCXJldHVybignQScpOworICAgICAgY2FzZSA5NDoJCQkJLyogVSBkaWFlcmVzaXMgKi8KKwkvKiByZXR1cm4oJ1knKTsgKi8KKwl6bXN0dWZmKCdlJyk7CisJcmV0dXJuKCdVJyk7CisgICAgICBjYXNlIDk2OiAgcmV0dXJuKCdlJyk7CQkvKiBlIGFjdXRlICovCisgICAgICBjYXNlIDEyMzoJCQkJLyogYSBkaWFlcmVzaXMgKi8KKwl6bXN0dWZmKCdlJyk7CisJcmV0dXJuKCdhJyk7CisgICAgICBjYXNlIDEyNDoJCQkJLyogbyBkaWFlcmVzaXMgKi8KKwl6bXN0dWZmKCdlJyk7CisJcmV0dXJuKCdvJyk7CisgICAgICBjYXNlIDEyNToJCQkJLyogYSByaW5nICovCisJem1zdHVmZignYScpOworCXJldHVybignYScpOworICAgICAgY2FzZSAxMjY6CQkJCS8qIHUgZGlhZXJlc2lzICovCisJLyogcmV0dXJuKCd5Jyk7ICovCisJem1zdHVmZignZScpOworCXJldHVybigndScpOworICAgICAgZGVmYXVsdDogIHJldHVybihjKTsKKyAgICB9Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGNoYXMoQ0hBUiBjKQorI2Vsc2UKK3hjaGFzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4Y2hhcyAqLwkJCQkvKiBTd2lzcyBJU08gNjQ2IHRvIEFTQ0lJICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDM1OiAgcmV0dXJuKCd1Jyk7CQkvKiB1IGdyYXZlICovCisgICAgICBjYXNlIDY0OiAgcmV0dXJuKCdhJyk7CQkvKiBhIGdyYXZlICovCisgICAgICBjYXNlIDkxOiAgcmV0dXJuKCdlJyk7CQkvKiBlIGFjdXRlICovCisgICAgICBjYXNlIDkyOiAgcmV0dXJuKCdjJyk7CQkvKiBjIGNlZGlsbGEgKi8KKyAgICAgIGNhc2UgOTM6ICByZXR1cm4oJ2UnKTsJCS8qIGUgY2lyY3VtZmxleCAqLworICAgICAgY2FzZSA5NDogIHJldHVybignaScpOwkJLyogaSBjaXJjdW1mbGV4ICovCisgICAgICBjYXNlIDk1OiAgcmV0dXJuKCdlJyk7CQkvKiBlIGdyYXZlICovCisgICAgICBjYXNlIDk2OiAgcmV0dXJuKCdvJyk7CQkvKiBvIGNpcmN1bWZsZXggKi8KKyAgICAgIGNhc2UgMTIzOgkJCQkvKiBhIGRpYWVyZXNpcyAqLworCXptc3R1ZmYoJ2UnKTsKKwlyZXR1cm4oJ2EnKTsKKyAgICAgIGNhc2UgMTI0OgkJCQkvKiBvIGRpYWVyZXNpcyAqLworCXptc3R1ZmYoJ2UnKTsKKwlyZXR1cm4oJ28nKTsKKyAgICAgIGNhc2UgMTI1OgkJCQkvKiB1IGRpYWVyZXNpcyAqLworCXptc3R1ZmYoJ2UnKTsKKwlyZXR1cm4oJ3UnKTsKKyAgICAgIGNhc2UgMTI2OiByZXR1cm4oJ3UnKTsJCS8qIHUgY2lyY3VtZmxleCAqLworICAgICAgZGVmYXVsdDogIHJldHVybihjKTsKKyAgICB9Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGh1YXMoQ0hBUiBjKQorI2Vsc2UKK3hodWFzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4aHVhcyAqLwkJCQkvKiBIdW5nYXJpYW4gSVNPIDY0NiB0byBBU0NJSSAqLworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSA2NDogIHJldHVybignQScpOwkJLyogQSBhY3V0ZSAqLworICAgICAgY2FzZSA5MTogIHJldHVybignRScpOwkJLyogRSBhY3V0ZSAqLworICAgICAgY2FzZSA5MjogIHJldHVybignTycpOwkJLyogTyBkaWFlcmVzaXMgKi8KKyAgICAgIGNhc2UgOTM6ICByZXR1cm4oJ1UnKTsJCS8qIFUgZGlhZXJlc2lzICovCisgICAgICBjYXNlIDk2OiAgcmV0dXJuKCdhJyk7CQkvKiBhIGFjdXRlICovCisgICAgICBjYXNlIDEyMzogcmV0dXJuKCdlJyk7CQkvKiBlIGFjdXRlICovCisgICAgICBjYXNlIDEyNDogcmV0dXJuKCdvJyk7CQkvKiBvIGFjdXRlICovCisgICAgICBjYXNlIDEyNTogcmV0dXJuKCd1Jyk7CQkvKiB1IGFjdXRlICovCisgICAgICBjYXNlIDEyNjogcmV0dXJuKDM0KTsJCS8qIGRvdWJsZSBhY3V0ZSBhY2NlbnQgKi8KKyAgICAgIGRlZmF1bHQ6ICByZXR1cm4oYyk7CisgICAgfQorfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hkbWFzKENIQVIgYykKKyNlbHNlCit4ZG1hcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGRtYXMgKi8JCQkJLyogREVDIE1DUyB0byBBU0NJSSAqLworICAgIGlmIChsYW5nc1tsYW5ndWFnZV0uaWQgPT0gTF9GUkVOQ0gpIHsgLyogSWYgU0VUIExBTkdVQUdFIEZSRU5DSCAqLworCWlmIChjID09IDIxNSkgewkJCS8qIGhhbmRsZSBPRSBkaWdyYXBoLiAqLworCSAgICB6bXN0dWZmKCdFJyk7CisJICAgIHJldHVybignTycpOworCX0gZWxzZSBpZiAoYyA9PSAyNDcpIHsJCS8qIEFsc28gbG93ZXJjYXNlIG9lLiAqLworCSAgICB6bXN0dWZmKCdlJyk7CisJICAgIHJldHVybignbycpOworCX0KKyAgICB9CisgICAgcmV0dXJuKHlsMWFzW2NdKTsJCQkvKiBPdGhlcndpc2UgdHJlYXQgbGlrZSBMYXRpbi0xICovCit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGRnYXMoQ0hBUiBjKQorI2Vsc2UKK3hkZ2FzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiAgeGRnYXMgKi8JCQkJLyogRGF0YSBHZW5lcmFsIHRvIEFTQ0lJICovCisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMTgwOiByZXR1cm4oJ2YnKTsJCS8qIEZsb3JpbiAqLworICAgICAgY2FzZSAxODM6IHJldHVybignPCcpOwkJLyogTGVzcy1lcXVhbCAqLworICAgICAgY2FzZSAxODQ6IHJldHVybignPicpOwkJLyogR3JlYXRlci1lcXVhbCAqLworICAgICAgY2FzZSAxODY6IHJldHVybig5Nik7CQkvKiBHcmF2ZSBhY2NlbnQgKi8KKyAgICAgIGNhc2UgMTkxOiByZXR1cm4oJ14nKTsJCS8qIFVwYXJyb3cgKi8KKyAgICAgIGNhc2UgMjE1OgorCWlmIChsYW5nc1tsYW5ndWFnZV0uaWQgPT0gTF9GUkVOQ0gpIHsgLyogT0UgZGlncmFwaCAqLworCSAgICB6bXN0dWZmKCdFJyk7CisJICAgIHJldHVybignTycpOworCX0gZWxzZSByZXR1cm4oJ08nKTsKKyAgICAgIGNhc2UgMjQ3OgorCWlmIChsYW5nc1tsYW5ndWFnZV0uaWQgPT0gTF9GUkVOQ0gpIHsgLyogb2UgZGlncmFwaCAqLworCSAgICB6bXN0dWZmKCdlJyk7CisJICAgIHJldHVybignbycpOworCX0gZWxzZSByZXR1cm4oJ28nKTsKKyAgICAgIGNhc2UgMTc1OiBjYXNlIDE3OTogY2FzZSAyMjA6IGNhc2UgMjIyOgorICAgICAgY2FzZSAyMjM6IGNhc2UgMjU0OiBjYXNlIDI1NToKKwlyZXR1cm4oVU5LKTsKKyAgICAgIGRlZmF1bHQ6CQkJCS8qIFRoZSByZXN0LCBjb252ZXJ0IHRvIExhdGluLTEgKi8KKwlyZXR1cm4oeWwxYXNbeWRnbDFbY11dKTsJLyogYW5kIGZyb20gdGhlcmUgdG8gQVNDSUkgKi8KKyAgICB9Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeHI4YXMoQ0hBUiBjKQorI2Vsc2UKK3hyOGFzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiAgeHI4YXMgKi8JCQkJLyogSGV3bGV0dCBQYWNrYXJkIFJvbWFuOCB0byBBU0NJSSAqLworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDE3NTogcmV0dXJuKCdMJyk7CQkvKiBMaXJhICovCisgICAgICBjYXNlIDE5MDogcmV0dXJuKCdmJyk7CQkvKiBGbG9yaW4gKi8KKyAgICAgIGNhc2UgMjM1OiByZXR1cm4oJ1MnKTsJCS8qIFMgY2Fyb24gKi8KKyAgICAgIGNhc2UgMjM2OiByZXR1cm4oJ3MnKTsJCS8qIHMgY2Fyb24gKi8KKyAgICAgIGNhc2UgMjQ2OiByZXR1cm4oJy0nKTsJCS8qIEhvcml6b250YWwgYmFyICovCisgICAgICBjYXNlIDI1MjogcmV0dXJuKCcqJyk7CQkvKiBTb2xpZCBib3ggKi8KKyAgICAgIGRlZmF1bHQ6CQkJCS8qIFRoZSByZXN0LCBjb252ZXJ0IHRvIExhdGluLTEgKi8KKwlyZXR1cm4oeWwxYXNbeXI4bDFbY11dKTsJLyogYW5kIGZyb20gdGhlcmUgdG8gQVNDSUkgKi8KKyAgICB9Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeHVrbDEoQ0hBUiBjKQorI2Vsc2UKK3h1a2wxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4dWtsMSAqLwkJCQkvKiBVSyBBU0NJSSB0byBMYXRpbi0xICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgaWYgKGMgPT0gMzUpCisgICAgICByZXR1cm4oMTYzKTsKKyAgICBlbHNlIHJldHVybihjKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDF1ayhDSEFSIGMpCisjZWxzZQoreGwxdWsoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMXVrICovCQkJCS8qIExhdGluLTEgdG8gVUsgQVNDSUkgKi8KKyAgICBpZiAoYyA9PSAxNjMpCisgICAgICByZXR1cm4oMzUpOworICAgIGVsc2UgcmV0dXJuKHlsMWFzW2NdKTsKK30KKworQ0hBUgkJCQkJLyogTGF0aW4tMSB0byBGcmVuY2ggSVNPIDY0NiAqLworI2lmZGVmIENLX0FOU0lDCit4bDFmcihDSEFSIGMpCisjZWxzZQoreGwxZnIoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMWZyICovCisgICAgcmV0dXJuKHlsMWZyW2NdKTsKK30KKworCitDSEFSCQkJCQkvKiBGcmVuY2ggSVNPIDY0NiB0byBMYXRpbi0xICovCisjaWZkZWYgQ0tfQU5TSUMKK3hmcmwxKENIQVIgYykKKyNlbHNlCit4ZnJsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGZybDEgKi8KKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICByZXR1cm4oeWZybDFbY10pOworfQorCitDSEFSCQkJCQkvKiBMYXRpbi0xIHRvIER1dGNoIEFTQ0lJICovCisjaWZkZWYgQ0tfQU5TSUMKK3hsMWR1KENIQVIgYykKKyNlbHNlCit4bDFkdShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwxZHUgKi8KKyAgICByZXR1cm4oeWwxZHVbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hkdWwxKENIQVIgYykKKyNlbHNlCit4ZHVsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGR1bDEgKi8JCQkJLyogRHV0Y2ggSVNPIDY0NiB0byBMYXRpbi0xICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgcmV0dXJuKHlkdWwxW2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4ZmlsMShDSEFSIGMpCisjZWxzZQoreGZpbDEoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhmaWwxICovCQkJCS8qIEZpbm5pc2ggSVNPIDY0NiB0byBMYXRpbi0xICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgcmV0dXJuKHlmaWwxW2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDFmaShDSEFSIGMpCisjZWxzZQoreGwxZmkoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMWZpICovCQkJCS8qIExhdGluLTEgdG8gRmlubmlzaCBJU08gNjQ2ICovCisgICAgcmV0dXJuKHlsMWZpW2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4ZmNsMShDSEFSIGMpCisjZWxzZQoreGZjbDEoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhmY2wxICovCQkJCS8qIEZyZW5jaCBDYW5hZGlhbiBJU082NDYgdG8gTGF0aW4tMSAqLworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIHJldHVybih5ZmNsMVtjXSk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGwxZmMoQ0hBUiBjKQorI2Vsc2UKK3hsMWZjKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bDFmYyAqLwkJCQkvKiBMYXRpbi0xIHRvIEZyZW5jaCBDYW5hZGlhbiBJU082NDYgKi8KKyAgICByZXR1cm4oeWwxZmNbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hpdGwxKENIQVIgYykKKyNlbHNlCit4aXRsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGl0bDEgKi8JCQkJLyogSXRhbGlhbiBJU08gNjQ2IHRvIExhdGluLTEgKi8KKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICByZXR1cm4oeWl0bDFbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsMWl0KENIQVIgYykKKyNlbHNlCit4bDFpdChjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwxaXQgKi8JCQkJLyogTGF0aW4tMSB0byBJdGFsaWFuIElTTyA2NDYgKi8KKyAgICByZXR1cm4oeWwxaXRbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3huZWwxKENIQVIgYykKKyNlbHNlCit4bmVsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeG5lbDEgKi8JCSAJCS8qIE5lWFQgdG8gTGF0aW4tMSAqLworICAgIGlmIChsYW5nc1tsYW5ndWFnZV0uaWQgPT0gTF9GUkVOQ0gpIHsgLyogSWYgU0VUIExBTkdVQUdFIEZSRU5DSCAqLworCWlmIChjID09IDIzNCkgewkJCS8qIGhhbmRsZSBPRSBkaWdyYXBoLiAqLworCSAgICB6bXN0dWZmKCdFJyk7CisJICAgIHJldHVybignTycpOworCX0gZWxzZSBpZiAoYyA9PSAyNTApIHsJCS8qIEFsc28gbG93ZXJjYXNlIG9lLiAqLworCSAgICB6bXN0dWZmKCdlJyk7CisJICAgIHJldHVybignbycpOworCX0KKyAgICB9CisgICAgcmV0dXJuKHluZWwxW2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bmVsOShDSEFSIGMpCisjZWxzZQoreG5lbDkoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhuZWw5ICovCQkgCQkvKiBOZVhUIHRvIExhdGluLTkgKi8KKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMjM0OiByZXR1cm4oMTg4KTsJCS8qIE9FICovCisgICAgICBjYXNlIDI1MDogcmV0dXJuKDE4OSk7CQkvKiBvZSAqLworICAgICAgY2FzZSAxODg6IHJldHVybigyMzQpOwkJLyoga2VlcCBpdCBpbnZlcnRpYmxlLi4uICovCisgICAgICBjYXNlIDE4OTogcmV0dXJuKDI1MCk7CQkvKiBvZSAqLworICAgICAgZGVmYXVsdDoKKwlyZXR1cm4oeW5lbDFbY10pOworICAgIH0KK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDFuZShDSEFSIGMpCisjZWxzZQoreGwxbmUoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMW5lICovCQkgCQkvKiBMYXRpbi0xIHRvIE5lWFQgKi8KKyAgICByZXR1cm4oeWwxbmVbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsOW5lKENIQVIgYykKKyNlbHNlCit4bDluZShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGw5bmUgKi8JCSAJCS8qIExhdGluLTkgdG8gTmVYVCAqLworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAxODg6IHJldHVybigyMzQpOwkJLyogT0UgKi8KKyAgICAgIGNhc2UgMTg5OiByZXR1cm4oMjUwKTsJCS8qIG9lICovCisgICAgICBjYXNlIDIzNDogcmV0dXJuKDE4OCk7CQkvKiBPRSAqLworICAgICAgY2FzZSAyNTA6IHJldHVybigxODkpOwkJLyogb2UgKi8KKyAgICAgIGRlZmF1bHQ6CisJcmV0dXJuKHlsMW5lW2NdKTsKKyAgICB9Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeG5vbDEoQ0hBUiBjKQorI2Vsc2UKK3hub2wxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bm9sMSAqLwkJIAkJLyogTm9yd2F5L0Rlbm1hcmsgSVNPIDY0NiB0byBMYXRpbi0xICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgcmV0dXJuKHlub2wxW2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDFubyhDSEFSIGMpCisjZWxzZQoreGwxbm8oYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMW5vICovCQkgCQkvKiBMYXRpbi0xIHRvIE5vcndheS9EZW5tYXJrIElTTyA2NDYgKi8KKyAgICByZXR1cm4oeWwxbm9bY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hwb2wxKENIQVIgYykKKyNlbHNlCit4cG9sMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeHBvbDEgKi8JCQkJLyogUG9ydHVndWVzZSBJU08gNjQ2IHRvIExhdGluLTEgKi8KKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICByZXR1cm4oeXBvbDFbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsMXBvKENIQVIgYykKKyNlbHNlCit4bDFwbyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwxcG8gKi8JCQkJLyogTGF0aW4tMSB0byBQb3J0dWd1ZXNlIElTTyA2NDYgKi8KKyAgICByZXR1cm4oeWwxcG9bY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hzcGwxKENIQVIgYykKKyNlbHNlCit4c3BsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeHNwbDEgKi8JCQkJLyogU3BhbmlzaCBJU08gNjQ2IHRvIExhdGluLTEgKi8KKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICByZXR1cm4oeXNwbDFbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsMXNwKENIQVIgYykKKyNlbHNlCit4bDFzcChjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwxc3AgKi8JCQkJLyogTGF0aW4tMSB0byBTcGFuaXNoIElTTyA2NDYgKi8KKyAgICByZXR1cm4oeWwxc3BbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hzd2wxKENIQVIgYykKKyNlbHNlCit4c3dsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeHN3bDEgKi8JCQkJLyogU3dlZGlzaCBJU08gNjQ2IHRvIExhdGluLTEgKi8KKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICByZXR1cm4oeXN3bDFbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsMXN3KENIQVIgYykKKyNlbHNlCit4bDFzdyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwxc3cgKi8JCQkJLyogTGF0aW4tMSB0byBTd2VkaXNoIElTTyA2NDYgKi8KKyAgICByZXR1cm4oeWwxc3dbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hjaGwxKENIQVIgYykKKyNlbHNlCit4Y2hsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGNobDEgKi8JCQkJLyogU3dpc3MgSVNPIDY0NiB0byBMYXRpbi0xICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgcmV0dXJuKHljaGwxW2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDFjaChDSEFSIGMpCisjZWxzZQoreGwxY2goYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMWNoICovCQkJCS8qIExhdGluLTEgdG8gU3dpc3MgSVNPIDY0NiAqLworICAgIHJldHVybih5bDFjaFtjXSk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGh1bDEoQ0hBUiBjKQorI2Vsc2UKK3hodWwxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4aHVsMSAqLwkJCQkvKiBIdW5nYXJpYW4gSVNPIDY0NiB0byBMYXRpbi0xICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgcmV0dXJuKHlodWwxW2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDFodShDSEFSIGMpCisjZWxzZQoreGwxaHUoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMWh1ICovCQkJCS8qIExhdGluLTEgdG8gSHVuZ2FyaWFuIElTTyA2NDYgKi8KKyAgICByZXR1cm4oeWwxaHVbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsMWRtKENIQVIgYykKKyNlbHNlCit4bDFkbShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwxZG0gKi8JCQkJLyogTGF0aW4tMSB0byBERUMgTUNTICovCisgICAgcmV0dXJuKHlsMWRtW2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDlkbShDSEFSIGMpCisjZWxzZQoreGw5ZG0oYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsOWRtICovCQkJCS8qIExhdGluLTkgdG8gREVDIE1DUyAqLworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAxODg6IHJldHVybigyMTUpOworICAgICAgY2FzZSAxODk6IHJldHVybigyNDcpOworICAgICAgY2FzZSAyMTU6IHJldHVybigxODgpOworICAgICAgY2FzZSAyNDc6IHJldHVybigxODkpOworICAgICAgZGVmYXVsdDoKKwlyZXR1cm4oeWwxZG1bY10pOworICAgIH0KK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDl3MShDSEFSIGMpCisjZWxzZQoreGw5dzEoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsOXcxICovCQkJCS8qIExhdGluLTkgdG8gQ1AxMjUyICovCisgICAgaWYgKGMgPCAxMjgpCisgICAgICByZXR1cm4oYyk7CisgICAgZWxzZSBpZiAoYyA8IDE2MCkKKyAgICAgIHJldHVybignPycpOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweGE0OiByZXR1cm4oMHg4MCk7CQkvKiBFdXJvICovCisgICAgICBjYXNlIDB4YTY6IHJldHVybigweDhhKTsJCS8qIFMtY2Fyb24gKi8KKyAgICAgIGNhc2UgMHhhODogcmV0dXJuKDB4OWEpOwkJLyogcy1jYXJvbiAqLworICAgICAgY2FzZSAweGI0OiByZXR1cm4oMHg4ZSk7CQkvKiBaLWNhcm9uICovCisgICAgICBjYXNlIDB4Yjg6IHJldHVybigweDllKTsJCS8qIHotY2Fyb24gKi8KKyAgICAgIGNhc2UgMHhiYzogcmV0dXJuKDB4OGMpOwkJLyogT0UgKi8KKyAgICAgIGNhc2UgMHhiZDogcmV0dXJuKDB4OWMpOwkJLyogb2UgKi8KKyAgICAgIGNhc2UgMHhiZTogcmV0dXJuKDB4OWYpOwkJLyogWS1kaWFlcmVzaXMgKi8KKyAgICAgIGRlZmF1bHQ6CisJcmV0dXJuKGMpOworICAgIH0KK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDFkZyhDSEFSIGMpCisjZWxzZQoreGwxZGcoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMWRnICovCQkJCS8qIExhdGluLTEgdG8gREcgSUNTICovCisgICAgcmV0dXJuKHlsMWRnW2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4ZG1sMShDSEFSIGMpCisjZWxzZQoreGRtbDEoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhkbWwxICovCQkJCS8qIERFQyBNQ1MgdG8gTGF0aW4tMSAqLworICAgIGlmIChsYW5nc1tsYW5ndWFnZV0uaWQgPT0gTF9GUkVOQ0gpIHsgLyogSWYgU0VUIExBTkdVQUdFIEZSRU5DSCAqLworCWlmIChjID09IDIxNSkgewkJCS8qIGhhbmRsZSBPRSBkaWdyYXBoLiAqLworCSAgICB6bXN0dWZmKCdFJyk7CisJICAgIHJldHVybignTycpOworCX0gZWxzZSBpZiAoYyA9PSAyNDcpIHsJCS8qIEFsc28gbG93ZXJjYXNlIG9lLiAqLworCSAgICB6bXN0dWZmKCdlJyk7CisJICAgIHJldHVybignbycpOworCX0KKyAgICB9CisgICAgcmV0dXJuKHlkbWwxW2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4ZG1sOShDSEFSIGMpCisjZWxzZQoreGRtbDkoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhkbWw5ICovCQkJCS8qIERFQyBNQ1MgdG8gTGF0aW4tOSAqLworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAyMTU6IHJldHVybigxODgpOwkJLyogT0UgKi8KKyAgICAgIGNhc2UgMjQ3OiByZXR1cm4oMTg5KTsJCS8qIG9lICovCisgICAgICBjYXNlIDE4ODogcmV0dXJuKDIxNSk7CQkvKiBhbmQgc3dhcCB0aGUgb3RoZXIgdHdvLi4uICovCisgICAgICBjYXNlIDE4OTogcmV0dXJuKDI0Nyk7CQkvKiAoMS80IGFuZCAxLzIpICovCisgICAgICBkZWZhdWx0OgkJCQkvKiB0byBrZWVwIGl0IGludmVydGlibGUgKi8KKwlyZXR1cm4oeWRtbDFbY10pOworICAgIH0KK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4ZGdsMShDSEFSIGMpCisjZWxzZQoreGRnbDEoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhkZ2wxICovCQkJCS8qIERHIEludGVybmF0aW9uYWwgQ1MgdG8gTGF0aW4tMSAqLworICAgIGlmIChsYW5nc1tsYW5ndWFnZV0uaWQgPT0gTF9GUkVOQ0gpIHsgLyogSWYgU0VUIExBTkdVQUdFIEZSRU5DSCAqLworCWlmIChjID09IDIxNSkgewkJCS8qIGhhbmRsZSBPRSBkaWdyYXBoLiAqLworCSAgICB6bXN0dWZmKCdFJyk7CisJICAgIHJldHVybignTycpOworCX0gZWxzZSBpZiAoYyA9PSAyNDcpIHsJCS8qIEFsc28gbG93ZXJjYXNlIG9lLiAqLworCSAgICB6bXN0dWZmKCdlJyk7CisJICAgIHJldHVybignbycpOworCX0KKyAgICB9CisgICAgcmV0dXJuKHlkZ2wxW2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4cjhsMShDSEFSIGMpCisjZWxzZQoreHI4bDEoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhyOGwxICovCQkJCS8qIEhld2xldHQgUGFja2FyZCBSb21hbjggdG8gTGF0aW4tMSAqLworICAgIHJldHVybih5cjhsMVtjXSk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGwxcjgoQ0hBUiBjKQorI2Vsc2UKK3hsMXI4KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bDFyOCAqLwkJCQkvKiBMYXRpbi0xIHRvIEhld2xldHQgUGFja2FyZCBSb21hbjggKi8KKyAgICByZXR1cm4oeWwxcjhbY10pOworfQorCisvKiBUcmFuc2xhdGlvbiBmdW5jdGlvbnMgZm9yIHJlY2VpdmluZyBmaWxlcyBhbmQgdHJhbnNsYXRpbmcgdGhlbSBpbnRvIEFTQ0lJICovCisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworemwxYXMoQ0hBUiBjKQorI2Vsc2UKK3psMWFzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB6bDFhcyAqLworICAgIHN3aXRjaChsYW5nc1tsYW5ndWFnZV0uaWQpIHsKKworICAgICAgY2FzZSBMX0RVVENIOgorCWlmIChjID09IDI1NSkgewkJCS8qIER1dGNoIHVtbGF1dC15ICovCisJICAgIHpkc3R1ZmYoJ2onKTsJCS8qIGJlY29tZXMgaWogKi8KKwkgICAgcmV0dXJuKCdpJyk7CisJfSBlbHNlIHJldHVybih5bDFhc1tjXSk7CS8qIGFsbCBvdGhlcnMgYnkgdGhlIGJvb2sgKi8KKworICAgICAgY2FzZSBMX0dFUk1BTjoKKwlzd2l0Y2ggKGMpIHsJCQkvKiBHZXJtYW4sIHNwZWNpYWwgcnVsZXMuICovCisJICBjYXNlIDE5NjoJCQkvKiB1bWxhdXQtQSAtPiBBZSAqLworCSAgICB6ZHN0dWZmKCdlJyk7CisJICAgIHJldHVybignQScpOworCSAgY2FzZSAyMTQ6CQkJLyogdW1sYXV0LU8gLT4gT2UgKi8KKwkgICAgemRzdHVmZignZScpOworCSAgICByZXR1cm4oJ08nKTsKKwkgIGNhc2UgMjIwOgkJCS8qIHVtbGF1dC1VIC0+IFVlICovCisJICAgIHpkc3R1ZmYoJ2UnKTsKKwkgICAgcmV0dXJuKCdVJyk7CisJICBjYXNlIDIyODoJCQkvKiB1bWxhdXQtYSAtPiBhZSAqLworCSAgICB6ZHN0dWZmKCdlJyk7CisJICAgIHJldHVybignYScpOworCSAgY2FzZSAyNDY6CQkJLyogdW1sYXV0LW8gLT4gb2UgKi8KKwkgICAgemRzdHVmZignZScpOworCSAgICByZXR1cm4oJ28nKTsKKwkgIGNhc2UgMjUyOgkJCS8qIHVtbGF1dC11IC0+IHVlICovCisJICAgIHpkc3R1ZmYoJ2UnKTsKKwkgICAgcmV0dXJuKCd1Jyk7CisJICBjYXNlIDIyMzoJCQkvKiBlc3MtemV0IC0+IHNzICovCisJICAgIHpkc3R1ZmYoJ3MnKTsKKwkgICAgcmV0dXJuKCdzJyk7CisJICBkZWZhdWx0OiByZXR1cm4oeWwxYXNbY10pOwkvKiBhbGwgb3RoZXJzIGJ5IHRoZSBib29rICovCisJfQorICAgICAgY2FzZSBMX0RBTklTSDoKKyAgICAgIGNhc2UgTF9GSU5OSVNIOgorICAgICAgY2FzZSBMX05PUldFR0lBTjoKKyAgICAgIGNhc2UgTF9TV0VESVNIOgorCXN3aXRjaCAoYykgewkJCS8qIFNjYW5kYW5hdmlhbiBsYW5ndWFnZXMuICovCisJICBjYXNlIDE5NjoJCQkvKiB1bWxhdXQtQSAtPiBBZSAqLworCSAgICB6ZHN0dWZmKCdlJyk7CisJICAgIHJldHVybignQScpOworCSAgY2FzZSAyMTQ6CQkJLyogdW1sYXV0LU8gLT4gT2UgKi8KKwkgIGNhc2UgMjE2OgkJCS8qIE8tc2xhc2ggLT4gT2UgKi8KKwkgICAgemRzdHVmZignZScpOworCSAgICByZXR1cm4oJ08nKTsKKwkgIGNhc2UgMjIwOgkJCS8qIHVtbGF1dC1VIC0+IFkgKi8KKwkgICAgLyogcmV0dXJuKCdZJyk7ICovCisJICAgIHpkc3R1ZmYoJ2UnKTsKKwkgICAgcmV0dXJuKCdVJyk7CisJICBjYXNlIDIyODoJCQkvKiB1bWxhdXQtYSAtPiBhZSAqLworCSAgICB6ZHN0dWZmKCdlJyk7CisJICAgIHJldHVybignYScpOworCSAgY2FzZSAyNDY6CQkJLyogdW1sYXV0LW8gLT4gb2UgKi8KKwkgIGNhc2UgMjQ4OgkJCS8qIG8tc2xhc2ggLT4gb2UgKi8KKwkgICAgemRzdHVmZignZScpOworCSAgICByZXR1cm4oJ28nKTsKKwkgIGNhc2UgMjUyOgkJCS8qIHVtbGF1dC11IC0+IHkgKi8KKwkgICAgLyogcmV0dXJuKCd5Jyk7ICovCisJICAgIHpkc3R1ZmYoJ2UnKTsKKwkgICAgcmV0dXJuKCd1Jyk7CisJICBjYXNlIDE5NzoJCQkvKiBBLXJpbmcgLT4gQWEgKi8KKwkgICAgemRzdHVmZignYScpOworCSAgICByZXR1cm4oJ0EnKTsKKyAgICAgICAgICBjYXNlIDIyOToJCQkvKiBhLXJpbmcgLT4gYWEgKi8KKwkgICAgemRzdHVmZignYScpOworCSAgICByZXR1cm4oJ2EnKTsKKwkgIGRlZmF1bHQ6IHJldHVybih5bDFhc1tjXSk7CS8qIEFsbCBvdGhlcnMgYnkgdGhlIGJvb2sgKi8KKwl9CisgICAgICBkZWZhdWx0OgorCXJldHVybih5bDFhc1tjXSk7CQkvKiBObyBsYW5ndWFnZSwgZ28gYnkgdGhlIHRhYmxlLiAqLworICAgIH0KK30KKworQ0hBUgkJCQkJLyogSUJNIENQNDM3IHRvIExhdGluLTEgKi8KKyNpZmRlZiBDS19BTlNJQworeDQzbDEoQ0hBUiBjKQorI2Vsc2UKK3g0M2wxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4NDNsMSAqLworICAgIHJldHVybih5NDNsMVtjXSk7Cit9CisKK0NIQVIJCQkJCS8qIElCTSBDUDg1MCB0byBMYXRpbi0xICovCisjaWZkZWYgQ0tfQU5TSUMKK3g4NWwxKENIQVIgYykKKyNlbHNlCit4ODVsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeDg1bDEgKi8KKyAgICByZXR1cm4oeTg1bDFbY10pOworfQorCitDSEFSCQkJCQkvKiBMYXRpbi0xIHRvIElCTSBDUDQzNyAqLworI2lmZGVmIENLX0FOU0lDCit4bDE0MyhDSEFSIGMpCisjZWxzZQoreGwxNDMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMTQzICovCisgICAgcmV0dXJuKHlsMTQzW2NdKTsKK30KKworQ0hBUgkJCQkJLyogTGF0aW4tMSB0byBDUDg1MCAqLworI2lmZGVmIENLX0FOU0lDCit4bDE4NShDSEFSIGMpCisjZWxzZQoreGwxODUoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMTg1ICovCisgICAgcmV0dXJuKHlsMTg1W2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4NDNhcyhDSEFSIGMpCisjZWxzZQoreDQzYXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHg0M2FzICovCQkJCS8qIENQNDM3IHRvIEFTQ0lJICovCisgICAgYyA9IHk0M2wxW2NdOwkJCS8qIFRyYW5zbGF0ZSB0byBMYXRpbi0xICovCisgICAgcmV0dXJuKHhsMTQzKGMpKTsJCQkvKiBhbmQgZnJvbSBMYXRpbi0xIHRvIEFTQ0lJLiAqLworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3g4NWFzKENIQVIgYykKKyNlbHNlCit4ODVhcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeDg1YXMgKi8JCQkJLyogQ1A4NTAgdG8gQVNDSUkgKi8KKyAgICBjID0geTg1bDFbY107CQkJLyogVHJhbnNsYXRlIHRvIExhdGluLTEgKi8KKyAgICByZXR1cm4oeGwxYXMoYykpOwkJCS8qIGFuZCBmcm9tIExhdGluLTEgdG8gQVNDSUkuICovCit9CisKK0NIQVIJCQkJCS8qIE1hY2ludG9zaCBMYXRpbiB0byBMYXRpbi0xICovCisjaWZkZWYgQ0tfQU5TSUMKK3hhcWwxKENIQVIgYykKKyNlbHNlCit4YXFsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGFxbDEgKi8KKyAgICBpZiAobGFuZ3NbbGFuZ3VhZ2VdLmlkID09IExfRlJFTkNIKSB7IC8qIElmIFNFVCBMQU5HVUFHRSBGUkVOQ0ggKi8KKwlpZiAoYyA9PSAyMDYpIHsJCQkvKiBoYW5kbGUgT0UgZGlncmFwaC4gKi8KKwkgICAgem1zdHVmZignRScpOworCSAgICByZXR1cm4oJ08nKTsKKwl9IGVsc2UgaWYgKGMgPT0gMjA3KSB7CQkvKiBBbHNvIGxvd2VyY2FzZSBvZS4gKi8KKwkgICAgem1zdHVmZignZScpOworCSAgICByZXR1cm4oJ28nKTsKKwl9CisgICAgfQorICAgIHJldHVybih5YXFsMVtjXSk7Cit9CisKK0NIQVIJCQkJCS8qIE1hY2ludG9zaCBMYXRpbiB0byBBU0NJSSAqLworI2lmZGVmIENLX0FOU0lDCit4YXFhcyhDSEFSIGMpCisjZWxzZQoreGFxYXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhhcWFzICovCisgICAgaWYgKGxhbmdzW2xhbmd1YWdlXS5pZCA9PSBMX0ZSRU5DSCkgeyAvKiBJZiBTRVQgTEFOR1VBR0UgRlJFTkNIICovCisJaWYgKGMgPT0gMjA2KSB7CQkJLyogaGFuZGxlIE9FIGRpZ3JhcGguICovCisJICAgIHptc3R1ZmYoJ0UnKTsKKwkgICAgcmV0dXJuKCdPJyk7CisJfSBlbHNlIGlmIChjID09IDIwNykgewkJLyogQWxzbyBsb3dlcmNhc2Ugb2UuICovCisJICAgIHptc3R1ZmYoJ2UnKTsKKwkgICAgcmV0dXJuKCdvJyk7CisJfQorICAgIH0KKyAgICBjID0geWFxbDFbY107CQkJLyogVHJhbnNsYXRlIHRvIExhdGluLTEgKi8KKyAgICByZXR1cm4oeGwxYXMoYykpOwkJCS8qIHRoZW4gdG8gQVNDSUkuICovCit9CisKK0NIQVIJCQkJCS8qIExhdGluLTEgdG8gTWFjaW50b3NoIExhdGluICovCisjaWZkZWYgQ0tfQU5TSUMKK3hsMWFxKENIQVIgYykKKyNlbHNlCit4bDFhcShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwxYXEgKi8KKyAgICByZXR1cm4oeWwxYXFbY10pOworfQorCisjaWZkZWYgTEFUSU4yCisKKy8qIFRyYW5zbGF0aW9uIGZ1bmN0aW9ucyBmb3IgTGF0aW4gQWxwaGFiZXQgMiAqLworCitDSEFSCQkJCQkvKiBMYXRpbi0yIHRvIExhdGluLTEgKi8KKyNpZmRlZiBDS19BTlNJQworeGwybDEoQ0hBUiBjKQorI2Vsc2UKK3hsMmwxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGwybDEgKi8KKyAgICByZXR1cm4oeWwybDFbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsMncxKENIQVIgYykKKyNlbHNlCit4bDJ3MShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwydzEgKi8JCQkJLyogTGF0aW4tMiB0byBDUDEyNTIgKFdpbmRvd3MgTDEpICovCisgICAgaWYgKGMgPiAxMjcgJiYgYyA8IDE2MCkKKyAgICAgIHJldHVybihVTkspOworICAgIGVsc2UKKyAgICAgIHJldHVybih5bDJsMVtjXSk7Cit9CisKK0NIQVIJCQkJCS8qIExhdGluLTEgdG8gTGF0aW4tMiAqLworI2lmZGVmIENLX0FOU0lDCit4bDFsMihDSEFSIGMpCisjZWxzZQoreGwxbDIoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsbDFsMiAqLworICAgIHJldHVybih5bDFsMltjXSk7Cit9CisKK0NIQVIJCQkJCS8qIENQMTI1MiB0byBMYXRpbi0xICovCisjaWZkZWYgQ0tfQU5TSUMKK3h3MWwyKENIQVIgYykKKyNlbHNlCit4dzFsMihjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeHcxbDIgKi8KKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMHg4YTogcmV0dXJuKDB4YTkpOwkJLyogUyBjYXJvbiAqLworICAgICAgY2FzZSAweDhlOiByZXR1cm4oMHhhZSk7CQkvKiBaIGNhcm9uICovCisgICAgICBjYXNlIDB4OWE6IHJldHVybigweGI5KTsJCS8qIHMgY2Fyb24gKi8KKyAgICAgIGNhc2UgMHg5ZTogcmV0dXJuKDB4YmUpOwkJLyogeiBjYXJvbiAqLworICAgICAgZGVmYXVsdDoKKwlyZXR1cm4oKGMgPCAxNjApID8geHcxYXMoYykgOiB4bDFsMihjKSk7CisgICAgfQorfQorCisKK0NIQVIJCQkJCS8qIExhdGluLTIgdG8gQVNDSUkgKi8KKyNpZmRlZiBDS19BTlNJQworeGwyYXMoQ0hBUiBjKQorI2Vsc2UKK3hsMmFzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGwyYXMgKi8KKyAgICByZXR1cm4oeWwyYXNbY10pOworfQorCitDSEFSCQkJCQkvKiBMYXRpbi0yIHRvIENQODUyICovCisjaWZkZWYgQ0tfQU5TSUMKK3hsMjUyKENIQVIgYykKKyNlbHNlCit4bDI1MihjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxsMjUyICovCisgICAgcmV0dXJuKHlsMjUyW2NdKTsKK30KKworQ0hBUgkJCQkJLyogTGF0aW4tMiB0byBNYXpvdmlhICovCisjaWZkZWYgQ0tfQU5TSUMKK3hsMm16KENIQVIgYykKKyNlbHNlCit4bDJteihjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxsMm16ICovCisgICAgcmV0dXJuKHlsMm16W2NdKTsKK30KKworQ0hBUgkJCQkJLyogTGF0aW4tMSB0byBNYXpvdmlhICovCisjaWZkZWYgQ0tfQU5TSUMKK3hsMW16KENIQVIgYykKKyNlbHNlCit4bDFteihjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxsMW16ICovCisgICAgcmV0dXJuKHlsMm16W3lsMWwyW2NdXSk7Cit9CisKK0NIQVIJCQkJCS8qIE1hem92aWEgdG8gTGF0aW4tMSAqLworI2lmZGVmIENLX0FOU0lDCit4bXpsMShDSEFSIGMpCisjZWxzZQoreG16bDEoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhtemwxICovCisgICAgcmV0dXJuKHlsMmwxW3ltemwyW2NdXSk7Cit9CisKK0NIQVIJCQkJCS8qIE1hem92aWEgdG8gTGF0aW4tOSAqLworI2lmZGVmIENLX0FOU0lDCit4bXpsOShDSEFSIGMpCisjZWxzZQoreG16bDkoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhtemw5ICovCisgICAgcmV0dXJuKHhsMmw5KHltemwyW2NdKSk7Cit9CisKK0NIQVIJCQkJCS8qIENQODUyIHRvIExhdGluLTIgKi8KKyNpZmRlZiBDS19BTlNJQworeDUybDIoQ0hBUiBjKQorI2Vsc2UKK3g1MmwyKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4NTJsMiAqLworICAgIHJldHVybih5NTJsMltjXSk7Cit9CisKK0NIQVIJCQkJCS8qIE1hem92aWEgdG8gTGF0aW4tMiAqLworI2lmZGVmIENLX0FOU0lDCit4bXpsMihDSEFSIGMpCisjZWxzZQoreG16bDIoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhtemwyICovCisgICAgcmV0dXJuKHltemwyW2NdKTsKK30KKworQ0hBUgkJCQkJLyogTGF0aW4tMiB0byBDUDEyNTAgKi8KKyNpZmRlZiBDS19BTlNJQworeGwyMTI1MChDSEFSIGMpCisjZWxzZQoreGwyMTI1MChjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxsMjEyNTAgKi8KKyAgICByZXR1cm4oeWwyMTI1MFtjXSk7Cit9CisKK0NIQVIJCQkJCS8qIENQMTI1MCB0byBMYXRpbi0yICovCisjaWZkZWYgQ0tfQU5TSUMKK3gxMjUwbDIoQ0hBUiBjKQorI2Vsc2UKK3gxMjUwbDIoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHgxMjUwbDIgKi8KKyAgICByZXR1cm4oeTEyNTBsMltjXSk7Cit9CisKK0NIQVIJCQkJCS8qIENQODUyIHRvIEFTQ0lJICovCisjaWZkZWYgQ0tfQU5TSUMKK3g1MmFzKENIQVIgYykKKyNlbHNlCit4NTJhcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGw1MmFzICovCisgICAgcmV0dXJuKHlsMmFzW3k1MmwyW2NdXSk7CQkvKiBDUDg1MiAtPiBMYXRpbi0yIC0+IEFTQ0lJICovCit9CisKK0NIQVIJCQkJCS8qIENQMTI1MCB0byBBU0NJSSAqLworI2lmZGVmIENLX0FOU0lDCit4MTI1MGFzKENIQVIgYykKKyNlbHNlCit4MTI1MGFzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bDEyNTBhcyAqLworICAgIHJldHVybih5bDJhc1t5MTI1MGwyW2NdXSk7CQkvKiBDUDgxMjUwIC0+IExhdGluLTIgLT4gQVNDSUkgKi8KK30KKworCitDSEFSCQkJCQkvKiBDUDg1MiB0byBMYXRpbi0xICovCisjaWZkZWYgQ0tfQU5TSUMKK3g1MmwxKENIQVIgYykKKyNlbHNlCit4NTJsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGw1MmwxICovCisgICAgcmV0dXJuKHlsMmwxW3k1MmwyW2NdXSk7CQkvKiBDUDg1MiAtPiBMYXRpbi0yIC0+IExhdGluLTEgKi8KK30KKworQ0hBUgkJCQkJLyogQ1AxMjUwIHRvIExhdGluLTEgKi8KKyNpZmRlZiBDS19BTlNJQworeDEyNTBsMShDSEFSIGMpCisjZWxzZQoreDEyNTBsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwxMjUwbDEgKi8KKyAgICByZXR1cm4oeWwybDFbeTEyNTBsMltjXV0pOwkJLyogQ1AxMjUwIC0+IExhdGluLTIgLT4gTGF0aW4tMSAqLworfQorCitDSEFSCQkJCQkvKiBDUDEyNTAgdG8gTGF0aW4tOSAqLworI2lmZGVmIENLX0FOU0lDCit4MTI1MGw5KENIQVIgYykKKyNlbHNlCit4MTI1MGw5KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4MTI1MGw5ICovCisgICAgaWYgKGMgPT0gKENIQVIpMTI4KQkJCS8qIEV1cm8gKi8KKyAgICAgIHJldHVybigoQ0hBUikxNjQpOworICAgIGVsc2UKKyAgICAgIHJldHVybih4bDJsOSh5MTI1MGwyW2NdKSk7CS8qIENQMTI1MCAtPiBMYXRpbi0yIC0+IExhdGluLTkgKi8KK30KKworQ0hBUgkJCQkJLyogTGF0aW4tMSB0byBDUDg1MiAqLworI2lmZGVmIENLX0FOU0lDCit4bDE1MihDSEFSIGMpCisjZWxzZQoreGwxNTIoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsbDE1MiAqLworICAgIHJldHVybih5bDI1Mlt5bDFsMltjXV0pOwkJLyogTGF0aW4tMSAtPiBMYXRpbi0yIC0+IENQODUyICovCit9CisKK0NIQVIJCQkJCS8qIExhdGluLTEgdG8gQ1AxMjUwICovCisjaWZkZWYgQ0tfQU5TSUMKK3hsMTEyNTAoQ0hBUiBjKQorI2Vsc2UKK3hsMTEyNTAoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsbDExMjUwICovCisgICAgcmV0dXJuKHlsMjEyNTBbeWwxbDJbY11dKTsJCS8qIExhdGluLTEgLT4gTGF0aW4tMiAtPiBDUDEyNTAgKi8KK30KKworQ0hBUgkJCQkJLyogTGF0aW4tOSB0byBDUDEyNTAgKi8KKyNpZmRlZiBDS19BTlNJQworeGw5MTI1MChDSEFSIGMpCisjZWxzZQoreGw5MTI1MChjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxsOTEyNTAgKi8KKyAgICBpZiAoYyA9PSAoQ0hBUikxNjQpCQkJLyogRXVybyAqLworICAgICAgcmV0dXJuKChDSEFSKTEyOCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHlsMjEyNTBbeGw5bDIoYyldKTsJLyogTGF0aW4tOSAtPiBMYXRpbi0yIC0+IENQMTI1MCAqLworfQorCitDSEFSCQkJCQkvKiBMYXRpbi05IHRvIE1hem92aWEgKi8KKyNpZmRlZiBDS19BTlNJQworeGw5bXooQ0hBUiBjKQorI2Vsc2UKK3hsOW16KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGw5bXogKi8KKyAgICByZXR1cm4oeWwybXpbeGw5bDIoYyldKTsJCS8qIExhdGluLTkgLT4gTGF0aW4tMiAtPiBNYXpvdmlhICovCit9CisKK0NIQVIJCQkJCS8qIExhdGluLTkgdG8gTWF6b3ZpYSAqLworI2lmZGVmIENLX0FOU0lDCit4bXphcyhDSEFSIGMpCisjZWxzZQoreG16YXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhtemFzICovCisgICAgcmV0dXJuKHlsMmFzW3htemwyKGMpXSk7CQkvKiBNYXpvdmlhIC0+IExhdGluLTIgLT4gQVNDSUkgKi8KK30KKworQ0hBUgkJCQkJLyogTGF0aW4tMiB0byBOZVhUICovCisjaWZkZWYgQ0tfQU5TSUMKK3hsMm5lKENIQVIgYykKKyNlbHNlCit4bDJuZShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxsMm5lICovCisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMTYyOiByZXR1cm4oMTk4KTsJCS8qIEJyZXZlICovCisgICAgICBjYXNlIDE2MzogcmV0dXJuKDIzMik7CQkvKiBMIHdpdGggc3Ryb2tlICovCisgICAgICBjYXNlIDE3ODogcmV0dXJuKDIwNik7CQkvKiBPZ29uZWsgKi8KKyAgICAgIGNhc2UgMTc5OiByZXR1cm4oMjQ4KTsJCS8qIGwgd2l0aCBzdHJva2UgKi8KKyAgICAgIGNhc2UgMTgzOiByZXR1cm4oMjA3KTsJCS8qIENhcm9uICovCisgICAgICBjYXNlIDE4OTogcmV0dXJuKDIwNSk7CQkvKiBEb3VibGUgYWN1dGUgKi8KKyAgICAgIGNhc2UgMjA4OiByZXR1cm4oMTQ0KTsJCS8qIEQgc3Ryb2tlID0gRXRoICovCisgICAgICBjYXNlIDI0MDogcmV0dXJuKDIzMCk7CQkvKiBkIHN0cm9rZSA9IGV0aCAqLworICAgICAgY2FzZSAyNTU6IHJldHVybigxOTkpOwkJLyogRG90IGFib3ZlICovCisgICAgICBkZWZhdWx0OiAgcmV0dXJuKHlsMW5lW3lsMmwxW2NdXSk7CisgICAgfQorfQorCitDSEFSCQkJCQkvKiBMYXRpbi0yIHRvIENQNDM3ICovCisjaWZkZWYgQ0tfQU5TSUMKK3hsMjQzKENIQVIgYykKKyNlbHNlCit4bDI0MyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxsMjQzICovCisgICAgcmV0dXJuKHlsMWwyW3k0M2wxW2NdXSk7Cit9CisKK0NIQVIJCQkJCS8qIExhdGluLTIgdG8gQ1A4NTAgKi8KKyNpZmRlZiBDS19BTlNJQworeGwyODUoQ0hBUiBjKQorI2Vsc2UKK3hsMjg1KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGwyODUgKi8KKyAgICByZXR1cm4oeWwxbDJbeTg1bDFbY11dKTsKK30KKworQ0hBUgkJCQkJLyogTGF0aW4tMiB0byBBcHBsZSAqLworI2lmZGVmIENLX0FOU0lDCit4bDJhcShDSEFSIGMpCisjZWxzZQoreGwyYXEoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMmFxICovCisgICAgcmV0dXJuKHlsMWFxW3lsMmwxW2NdXSk7CQkvKiBDb3VsZCBkbyBtb3JlLi4uICovCit9CisKK0NIQVIJCQkJCS8qIExhdGluLTIgdG8gREdJICovCisjaWZkZWYgQ0tfQU5TSUMKK3hsMmRnKENIQVIgYykKKyNlbHNlCit4bDJkZyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxsMmRnICovCisgICAgcmV0dXJuKHlkZ2wxW3lsMWwyW2NdXSk7Cit9CisKK0NIQVIJCQkJCS8qIExhdGluLTIgdG8gU2hvcnQgS09JICovCisjaWZkZWYgQ0tfQU5TSUMKK3hsMnNrKENIQVIgYykKKyNlbHNlCit4bDJzayhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxsMnNrICovCisgICAgcmV0dXJuKGlzbG93ZXIoYykgPyB0b3VwcGVyKGMpIDogYyk7Cit9CisKK0NIQVIJCQkJCS8qIE5lWFQgdG8gTGF0aW4tMiAqLworI2lmZGVmIENLX0FOU0lDCit4bmVsMihDSEFSIGMpCisjZWxzZQoreG5lbDIoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhuZWwyICovCisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDE0NDogcmV0dXJuKDIwOCk7CQkvKiBEIHN0cm9rZSA9IEV0aCAqLworICAgICAgY2FzZSAxOTg6IHJldHVybigxNjIpOwkJLyogQnJldmUgKi8KKyAgICAgIGNhc2UgMTk5OiByZXR1cm4oMjU1KTsJCS8qIERvdCBhYm92ZSAqLworICAgICAgY2FzZSAyMDU6IHJldHVybigxODkpOwkJLyogRG91YmxlIGFjdXRlICovCisgICAgICBjYXNlIDIwNjogcmV0dXJuKDE3OCk7CQkvKiBPZ29uZWsgKi8KKyAgICAgIGNhc2UgMjA3OiByZXR1cm4oMTgzKTsJCS8qIENhcm9uICovCisgICAgICBjYXNlIDIzMDogcmV0dXJuKDI0MCk7CQkvKiBkIHN0cm9rZSA9IGV0aCAqLworICAgICAgY2FzZSAyMzI6IHJldHVybigxNjMpOwkJLyogTCB3aXRoIHN0cm9rZSAqLworICAgICAgY2FzZSAyNDg6IHJldHVybigxNzkpOwkJLyogbCB3aXRoIHN0cm9rZSAqLworICAgICAgZGVmYXVsdDogIHJldHVybih5bDFsMlt5bmVsMVtjXV0pOyAvKiBPdGhlcnMsIGdvIHRocnUgTGF0aW4tMSAqLworICAgIH0KK30KKworQ0hBUgkJCQkJLyogQ1A0MzcgdG8gTGF0aW4tMiAqLworI2lmZGVmIENLX0FOU0lDCit4NDNsMihDSEFSIGMpCisjZWxzZQoreDQzbDIoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsNDNsMiAqLworICAgIHJldHVybih5bDFsMlt5NDNsMVtjXV0pOworfQorCitDSEFSCQkJCQkvKiBDUDg1MCB0byBMYXRpbi0yICovCisjaWZkZWYgQ0tfQU5TSUMKK3g4NWwyKENIQVIgYykKKyNlbHNlCit4ODVsMihjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGw4NWwyICovCisgICAgcmV0dXJuKHlsMWwyW3k4NWwxW2NdXSk7Cit9CisKK0NIQVIJCQkJCS8qIEFwcGxlIHRvIExhdGluLTIgKi8KKyNpZmRlZiBDS19BTlNJQworeGFxbDIoQ0hBUiBjKQorI2Vsc2UKK3hhcWwyKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGFxbDIgKi8KKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMjQ5OiByZXR1cm4oMTYyKTsJCS8qIEJyZXZlIGFjY2VudCAqLworICAgICAgY2FzZSAyNTA6IHJldHVybigyNTUpOwkJLyogRG90IGFjY2VudCAqLworICAgICAgY2FzZSAyNTM6IHJldHVybigxODkpOwkJLyogRG91YmxlIGFjdXRlICovCisgICAgICBkZWZhdWx0OiByZXR1cm4oeWwxbDJbeWFxbDFbY11dKTsKKyAgICB9Cit9CisKK0NIQVIJCQkJCS8qIERHSSB0byBMYXRpbi0yICovCisjaWZkZWYgQ0tfQU5TSUMKK3hkZ2wyKENIQVIgYykKKyNlbHNlCit4ZGdsMihjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxkZ2wyICovCisgICAgcmV0dXJuKHlsMWwyW3lkZ2wxW2NdXSk7CQkvKiAoZm9yIG5vdykgKi8KK30KKworQ0hBUgkJCQkJLyogU2hvcnQgS09JIHRvIExhdGluLTIgKi8KKyNpZmRlZiBDS19BTlNJQworeHNrbDIoQ0hBUiBjKQorI2Vsc2UKK3hza2wyKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bHNrbDIgKi8KKyAgICByZXR1cm4oaXNsb3dlcihjKSA/IHRvdXBwZXIoYykgOiBjKTsKK30KKworQ0hBUgkJCQkJLyogTGF0aW4tMiB0byBHZXJtYW4gKi8KKyNpZmRlZiBDS19BTlNJQworeGwyZ2UoQ0hBUiBjKQorI2Vsc2UKK3hsMmdlKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGwyZ2UgKi8KKyAgICBzd2l0Y2goYykgeworICAgICAgY2FzZSAxNjc6IHJldHVybig2NCk7CQkvKiBQYXJhZ3JhcGggc2lnbiAqLworICAgICAgY2FzZSAxOTY6IHJldHVybig5MSk7CQkvKiBBLWRpYWVyZXNpcyAqLworICAgICAgY2FzZSAyMTQ6IHJldHVybig5Mik7CQkvKiBPLWRpYWVyZXNpcyAqLworICAgICAgY2FzZSAyMjA6IHJldHVybig5Myk7CQkvKiBVLWRpYWVyZXNpcyAqLworICAgICAgY2FzZSAyMjM6IHJldHVybigxMjYpOwkJLyogZG91YmxlLXMgKi8KKyAgICAgIGNhc2UgMjI4OiByZXR1cm4oMTIzKTsJCS8qIGEtZGlhZXJlc2lzICovCisgICAgICBjYXNlIDI0NjogcmV0dXJuKDEyNCk7CQkvKiBvLWRpYWVyZXNpcyAqLworICAgICAgY2FzZSAyNTI6IHJldHVybigxMjUpOwkJLyogdS1kaWFlcmVzaXMgKi8KKyAgICAgIGRlZmF1bHQ6ICByZXR1cm4oeWwyYXNbY10pOwkvKiBPdGhlcnMgKi8KKyAgICB9Cit9CisKK0NIQVIJCQkJCS8qIEdlcm1hbiB0byBMYXRpbi0yICovCisjaWZkZWYgQ0tfQU5TSUMKK3hnZWwyKENIQVIgYykKKyNlbHNlCit4Z2VsMihjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxnZWwyICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgNjQ6ICByZXR1cm4oMTY3KTsJCS8qIFBhcmFncmFwaCBzaWduICovCisgICAgICBjYXNlIDkxOiAgcmV0dXJuKDE5Nik7CQkvKiBBLWRpYWVyZXNpcyAqLworICAgICAgY2FzZSA5MjogIHJldHVybigyMTQpOwkJLyogTy1kaWFlcmVzaXMgKi8KKyAgICAgIGNhc2UgOTM6ICByZXR1cm4oMjIwKTsJCS8qIFUtZGlhZXJlc2lzICovCisgICAgICBjYXNlIDEyMzogcmV0dXJuKDIyOCk7CQkvKiBhLWRpYWVyZXNpcyAqLworICAgICAgY2FzZSAxMjY6IHJldHVybigyMjMpOwkJLyogZG91YmxlLXMgKi8KKyAgICAgIGNhc2UgMTI0OiByZXR1cm4oMjQ2KTsJCS8qIG8tZGlhZXJlc2lzICovCisgICAgICBjYXNlIDEyNTogcmV0dXJuKDI1Mik7CQkvKiB1LWRpYWVyZXNpcyAqLworICAgICAgZGVmYXVsdDogIHJldHVybihjKTsJCS8qIE90aGVycyAqLworICAgIH0KK30KKworQ0hBUgkJCQkJLyogTGF0aW4tMiB0byBIdW5nYXJpYW4gKi8KKyNpZmRlZiBDS19BTlNJQworeGwyaHUoQ0hBUiBjKQorI2Vsc2UKK3hsMmh1KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGwyaHUgKi8KKyAgICBzd2l0Y2goYykgeworICAgICAgY2FzZSAxNjQ6IHJldHVybigzNik7CQkvKiBDdXJyZW5jeSBzeW1ib2wgKi8KKyAgICAgIGNhc2UgMTg5OiByZXR1cm4oMTI2KTsJCS8qIERvdWJsZSBhY3V0ZSBhY2NlbnQgKi8KKyAgICAgIGNhc2UgMTkzOiByZXR1cm4oNjQpOwkJLyogQS1hY3V0ZSAqLworICAgICAgY2FzZSAyMDE6IHJldHVybig5MSk7CQkvKiBFLWFjdXRlICovCisgICAgICBjYXNlIDIxNDogcmV0dXJuKDkyKTsJCS8qIE8tZGlhZXJlc2lzICovCisgICAgICBjYXNlIDIyMDogcmV0dXJuKDkzKTsJCS8qIFUtZGlhZXJlc2lzICovCisgICAgICBjYXNlIDIyNTogcmV0dXJuKDk2KTsJCS8qIGEtYWN1dGUgKi8KKyAgICAgIGNhc2UgMjMzOiByZXR1cm4oMTIzKTsJCS8qIGUtYWN1dGUgKi8KKyAgICAgIGNhc2UgMjQ2OiByZXR1cm4oMTI0KTsJCS8qIG8tZGlhZXJlc2lzICovCisgICAgICBjYXNlIDI1MjogcmV0dXJuKDEyNSk7CQkvKiB1LWRpYWVyZXNpcyAqLworICAgICAgZGVmYXVsdDogIHJldHVybih5bDJhc1tjXSk7CS8qIE90aGVycyAqLworICAgIH0KK30KKworQ0hBUgkJCQkJLyogSHVuZ2FyaWFuIHRvIExhdGluLTIgKi8KKyNpZmRlZiBDS19BTlNJQworeGh1bDIoQ0hBUiBjKQorI2Vsc2UKK3hodWwyKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGh1bDIgKi8KKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBzd2l0Y2goYykgeworICAgICAgY2FzZSAzNjogIHJldHVybigxNjQpOwkJLyogQ3VycmVuY3kgc3ltYm9sICovCisgICAgICBjYXNlIDY0OiAgcmV0dXJuKDE5Myk7CQkvKiBBLWFjdXRlICovCisgICAgICBjYXNlIDkxOiAgcmV0dXJuKDIwMSk7CQkvKiBFLWFjdXRlICovCisgICAgICBjYXNlIDkyOiAgcmV0dXJuKDIxNCk7CQkvKiBPLWRpYWVyZXNpcyAqLworICAgICAgY2FzZSA5MzogIHJldHVybigyMjApOwkJLyogVS1kaWFlcmVzaXMgKi8KKyAgICAgIGNhc2UgOTY6ICByZXR1cm4oMjI1KTsJCS8qIGEtYWN1dGUgKi8KKyAgICAgIGNhc2UgMTIzOiByZXR1cm4oMjMzKTsJCS8qIGUtYWN1dGUgKi8KKyAgICAgIGNhc2UgMTI0OiByZXR1cm4oMjQ2KTsJCS8qIG8tZGlhZXJlc2lzICovCisgICAgICBjYXNlIDEyNTogcmV0dXJuKDI1Mik7CQkvKiB1LWRpYWVyZXNpcyAqLworICAgICAgY2FzZSAxMjY6IHJldHVybigxODkpOwkJLyogRG91YmxlIGFjdXRlIGFjY2VudCAqLworICAgICAgZGVmYXVsdDogIHJldHVybihjKTsJCS8qIE90aGVycyAqLworICAgIH0KK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4cjhsMihDSEFSIGMpCisjZWxzZQoreHI4bDIoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhyOGwyICovIC8qIEhld2xldHQgUGFja2FyZCBSb21hbjggdG8gTGF0aW4tMiAqLworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAyMzU6IHJldHVybigxNjkpOwkJLyogUyBjYXJvbiAqLworICAgICAgY2FzZSAyMzY6IHJldHVybigxODUpOwkJLyogcyBjYXJvbiAqLworICAgICAgZGVmYXVsdDogIHJldHVybih5bDFsMlt5cjhsMVtjXV0pOworICAgIH0KK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDJyOChDSEFSIGMpCisjZWxzZQoreGwycjgoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMnI4ICovIC8qIExhdGluLTIgdG8gSGV3bGV0dCBQYWNrYXJkIFJvbWFuOCBDaGFyYWN0ZXIgU2V0ICovCisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDE2OTogcmV0dXJuKDIzNSk7CQkvKiBTIGNhcm9uICovCisgICAgICBjYXNlIDE4NTogcmV0dXJuKDIzNik7CQkvKiBzIGNhcm9uICovCisgICAgICBkZWZhdWx0OiAgcmV0dXJuKHlyOGwxW3lsMWwyW2NdXSk7CisgICAgfQorfQorCisjZWxzZSAvKiBOT0xBVElOMiAqLworCisjZGVmaW5lIHhsMW16IE5VTEwKKyNkZWZpbmUgeG16bDEgTlVMTAorI2RlZmluZSB4bDJteiBOVUxMCisjZGVmaW5lIHhtemwyIE5VTEwKKyNkZWZpbmUgeGw5bXogTlVMTAorI2RlZmluZSB4bXpsOSBOVUxMCisjZGVmaW5lIHhtemFzIE5VTEwKKworI2RlZmluZSB4bDExMjUwIE5VTEwKKyNkZWZpbmUgeGwyMTI1MCBOVUxMCisjZGVmaW5lIHhsOTEyNTAgTlVMTAorCisjZGVmaW5lIHgxMjUwYXMgTlVMTAorI2RlZmluZSB4MTI1MGwxIE5VTEwKKyNkZWZpbmUgeDEyNTBsMiBOVUxMCisjZGVmaW5lIHgxMjUwbDkgTlVMTAorCisjZGVmaW5lIHhsMmwxIE5VTEwKKyNkZWZpbmUgeGwydzEgTlVMTAorI2RlZmluZSB4bDFsMiBOVUxMCisjZGVmaW5lIHh3MWwyIE5VTEwKKyNkZWZpbmUgeGwyYXMgTlVMTAorI2RlZmluZSB4bDI1MiBOVUxMCisjZGVmaW5lIHg1MmwyIE5VTEwKKyNkZWZpbmUgeDUyYXMgTlVMTAorI2RlZmluZSB4NTJsMSBOVUxMCisjZGVmaW5lIHhsMTUyIE5VTEwKKyNkZWZpbmUgeGwybmUgTlVMTAorI2RlZmluZSB4bDI0MyBOVUxMCisjZGVmaW5lIHhsMjg1IE5VTEwKKyNkZWZpbmUgeGwyYXEgTlVMTAorI2RlZmluZSB4bDJkZyBOVUxMCisjZGVmaW5lIHhsMnNrIE5VTEwKKyNkZWZpbmUgeG5lbDIgTlVMTAorI2RlZmluZSB4NDNsMiBOVUxMCisjZGVmaW5lIHg4NWwyIE5VTEwKKyNkZWZpbmUgeGFxbDIgTlVMTAorI2RlZmluZSB4ZGdsMiBOVUxMCisjZGVmaW5lIHhza2wyIE5VTEwKKyNkZWZpbmUgeGwyZ2UgTlVMTAorI2RlZmluZSB4Z2VsMiBOVUxMCisjZGVmaW5lIHhsMmh1IE5VTEwKKyNkZWZpbmUgeGh1bDIgTlVMTAorI2RlZmluZSB4bDJyOCBOVUxMCisjZGVmaW5lIHhyOGwyIE5VTEwKKyNlbmRpZiAvKiBMQVRJTjIgKi8KKworLyogVGhpcyBvbmUgY2FuIGFsc28gYmUgdXNlZCBmb3IgRUxPVCA5MjcsIEhlYnJldyA3LCBldGMgKi8KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4YXNzayhDSEFSIGMpCisjZWxzZQoreGFzc2soYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhhc3NrICovCQkJCS8qIEFTQ0lJIHRvIFNob3J0IEtPSSAqLworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIHJldHVybigoYyA+IDk1KSA/IChjIC0gMzIpIDogYyk7CS8qIEZvbGQgY29sdW1ucyA2LTcgdG8gNC01ICovCit9CisKKyNpZmRlZiBDWVJJTExJQworLyogVHJhbnNsYXRpb24gZnVuY3Rpb25zIGZvciBDeXJpbGxpYyBjaGFyYWN0ZXIgc2V0cyAqLworCitDSEFSCQkJCQkvKiBMYXRpbi9DeXJpbGxpYyB0byBDUDg2NiAqLworI2lmZGVmIENLX0FOU0lDCit4bGNhYyhDSEFSIGMpCisjZWxzZQoreGxjYWMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsY2FjICovCQkJCS8qIFBDIENvZGUgUGFnZSA4NjYgKi8KKyAgICByZXR1cm4oeWxjYWNbY10pOworfQorCitDSEFSCQkJCQkvKiBMYXRpbi9DeXJpbGxpYyB0byAqLworI2lmZGVmIENLX0FOU0lDCit4bGM1NShDSEFSIGMpCisjZWxzZQoreGxjNTUoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsYzU1ICovCQkJCS8qIFBDIENvZGUgUGFnZSA4NTUgKi8KKyAgICByZXR1cm4oeWxjNTVbY10pOworfQorCitDSEFSCQkJCQkvKiBMYXRpbi9DeXJpbGxpYyB0byAqLworI2lmZGVmIENLX0FOU0lDCit4bGMxMjUxKENIQVIgYykKKyNlbHNlCit4bGMxMjUxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGMxMjUxICovCQkJCS8qIFBDIENvZGUgUGFnZSAxMjUxICovCisgICAgcmV0dXJuKHlsYzEyNTFbY10pOworfQorCitDSEFSCQkJCQkvKiBMYXRpbi9DeXJpbGxpYyB0by4uLiAqLworI2lmZGVmIENLX0FOU0lDCit4bGNidShDSEFSIGMpCisjZWxzZQoreGxjYnUoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsY2J1ICovCQkJCS8qIEJ1bGdhcmlhbiBQQyBDb2RlIFBhZ2UgKi8KKyAgICByZXR1cm4oeWxjYnVbY10pOworfQorCitDSEFSCQkJCQkvKiBMYXRpbi9DeXJpbGxpYyB0byBPbGQgS09JLTggKi8KKyNpZmRlZiBDS19BTlNJQworeGxjazgoQ0hBUiBjKQorI2Vsc2UKK3hsY2s4KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGNrOCAqLworICAgIHJldHVybih5bGNrOFtjXSk7Cit9CisKK0NIQVIJCQkJCS8qIExhdGluL0N5cmlsbGljIHRvIEtPSTgtUiAqLworI2lmZGVmIENLX0FOU0lDCit4bGNrcihDSEFSIGMpCisjZWxzZQoreGxja3IoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsY2tyICovCisgICAgc3dpdGNoKGMpIHsKKyAgICAgIGNhc2UgMHhhMTogcmV0dXJuKDB4YjMpOwkJLyogSW8gKi8KKyAgICAgIGNhc2UgMHhmMTogcmV0dXJuKDB4YTMpOwkJLyogaW8gKi8KKyAgICAgIGRlZmF1bHQ6CisJaWYgKGMgPiAweDdmICYmIGMgPCAweGMwKQorCSAgcmV0dXJuKFVOSyk7CisJcmV0dXJuKHlsY2s4W2NdKTsKKyAgICB9Cit9CisKK0NIQVIJCQkJCS8qIExhdGluL0N5cmlsbGljIHRvICBLT0k4LVUgKi8KKyNpZmRlZiBDS19BTlNJQworeGxja3UoQ0hBUiBjKQorI2Vsc2UKK3hsY2t1KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGNrdSAqLworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDB4YTE6IHJldHVybigweGIzKTsJCS8qIElvICovCisgICAgICBjYXNlIDB4ZjE6IHJldHVybigweGEzKTsJCS8qIGlvICovCisgICAgICBjYXNlIDB4ZjQ6IHJldHVybigweGE0KTsJCS8qIFVrcmFpbmlhbiBpZSAqLworICAgICAgY2FzZSAweGY2OiByZXR1cm4oMHhhNik7CQkvKiBVa3JhaW5pYW4gaSAqLworICAgICAgY2FzZSAweGY3OiByZXR1cm4oMHhhNyk7CQkvKiBVa3JhaW5pYW4geWkgKi8KKyAgICAgIGNhc2UgMHhmMzogcmV0dXJuKDB4YWQpOwkJLyogVWtyYWluaWFuIGdoZSB3aXRoIHVwdHVybiAqLworICAgICAgY2FzZSAweGE0OiByZXR1cm4oMHhiNCk7CQkvKiBVa3JhaW5pYW4gSWUgKi8KKyAgICAgIGNhc2UgMHhhNjogcmV0dXJuKDB4YjYpOwkJLyogVWtyYWluaWFuIEkgKi8KKyAgICAgIGNhc2UgMHhhNzogcmV0dXJuKDB4YjcpOwkJLyogVWtyYWluaWFuIFlpICovCisgICAgICBjYXNlIDB4YTM6IHJldHVybigweGJkKTsJCS8qIFVrcmFpbmlhbiBHaGUgd2l0aCB1cHR1cm4gKi8KKyAgICAgIGRlZmF1bHQ6CisJaWYgKGMgPiAweDdmICYmIGMgPCAweGMwKQorCSAgcmV0dXJuKFVOSyk7CisJcmV0dXJuKHlsY2s4W2NdKTsKKyAgICB9Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGxjc2soQ0hBUiBjKQorI2Vsc2UKK3hsY3NrKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGNzayAqLwkJCQkvKiBMYXRpbi9DeXJpbGxpYyB0byBTaG9ydCBLT0kgKi8KKyAgICByZXR1cm4oeWxjc2tbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsY2FzKENIQVIgYykKKyNlbHNlCit4bGNhcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxjYXMgKi8JCQkJLyogTGF0aW4vQ3lyaWxsaWMgdG8gQVNDSUkgKi8KKyAgICBpZiAobGFuZ3NbbGFuZ3VhZ2VdLmlkID09IExfUlVTU0lBTikKKyAgICAgIHJldHVybih5bGNza1tjXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKChjID4gMTI3KSA/ICc/JyA6IGMpOworfQorCitDSEFSCQkJCQkvKiBDUDg2NiAqLworI2lmZGVmIENLX0FOU0lDCit4YWNsYyhDSEFSIGMpCisjZWxzZQoreGFjbGMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhhY2xjICovCQkJCS8qIHRvIExhdGluL0N5cmlsbGljICovCisgICAgcmV0dXJuKHlhY2xjW2NdKTsKK30KKworQ0hBUgkJCQkJLyogQ1A4NTUgKi8KKyNpZmRlZiBDS19BTlNJQworeDU1bGMoQ0hBUiBjKQorI2Vsc2UKK3g1NWxjKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4NTVsYyAqLwkJCQkvKiB0byBMYXRpbi9DeXJpbGxpYyAqLworICAgIHJldHVybih5NTVsY1tjXSk7Cit9CisKK0NIQVIJCQkJCS8qIEJ1bGdhcmlhbiBQQyBDb2RlIFBhZ2UgLi4uICovCisjaWZkZWYgQ0tfQU5TSUMKK3hidWxjKENIQVIgYykKKyNlbHNlCit4YnVsYyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGJ1bGMgKi8JCQkJLyogdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgICByZXR1cm4oeWJ1bGNbY10pOworfQorCitDSEFSCQkJCQkvKiBDUDEyNTEgKi8KKyNpZmRlZiBDS19BTlNJQworeDEyNTFsYyhDSEFSIGMpCisjZWxzZQoreDEyNTFsYyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeDEyNTFsYyAqLwkJCQkvKiB0byBMYXRpbi9DeXJpbGxpYyAqLworICAgIHJldHVybih5MTI1MWxjW2NdKTsKK30KKworQ0hBUgkJCQkJLyogT2xkIEtPSS04IHRvIExhdGluL0N5cmlsbGljICovCisjaWZkZWYgQ0tfQU5TSUMKK3hrOGxjKENIQVIgYykKKyNlbHNlCit4azhsYyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGs4bGMgKi8KKyAgICByZXR1cm4oeWs4bGNbY10pOworfQorCitDSEFSCQkJCQkvKiBLT0k4LVIgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyNpZmRlZiBDS19BTlNJQworeGtybGMoQ0hBUiBjKQorI2Vsc2UKK3hrcmxjKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4a3JsYyAqLworICAgIGlmIChjID09IDB4YjMpIHJldHVybigweGExKTsKKyAgICBlbHNlIGlmIChjID09IDB4YTMpIHJldHVybigweGYxKTsKKyAgICBlbHNlIGlmIChjID4gMHg3ZiAmJiBjIDwgMHhjMCkKKyAgICAgIHJldHVybihVTkspOworICAgIHJldHVybih5azhsY1tjXSk7Cit9CisKK0NIQVIJCQkJCS8qIEtPSTgtVSB0byBMYXRpbi9DeXJpbGxpYyAqLworI2lmZGVmIENLX0FOU0lDCit4a3VsYyhDSEFSIGMpCisjZWxzZQoreGt1bGMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhrdWxjICovCisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDB4YjM6IHJldHVybigweGExKTsJCS8qIElvICovCisgICAgICBjYXNlIDB4YTM6IHJldHVybigweGYxKTsJCS8qIGlvICovCisgICAgICBjYXNlIDB4YTQ6IHJldHVybigweGY0KTsJCS8qIFVrcmFpbmlhbiBpZSAqLworICAgICAgY2FzZSAweGE2OiByZXR1cm4oMHhmNik7CQkvKiBVa3JhaW5pYW4gaSAqLworICAgICAgY2FzZSAweGE3OiByZXR1cm4oMHhmNyk7CQkvKiBVa3JhaW5pYW4geWkgKi8KKyAgICAgIGNhc2UgMHhhZDogcmV0dXJuKDB4ZjMpOwkJLyogVWtyYWluaWFuIGdoZSB3aXRoIHVwdHVybiAqLworICAgICAgY2FzZSAweGI0OiByZXR1cm4oMHhhNCk7CQkvKiBVa3JhaW5pYW4gSWUgKi8KKyAgICAgIGNhc2UgMHhiNjogcmV0dXJuKDB4YTYpOwkJLyogVWtyYWluaWFuIEkgKi8KKyAgICAgIGNhc2UgMHhiNzogcmV0dXJuKDB4YTcpOwkJLyogVWtyYWluaWFuIFlpICovCisgICAgICBjYXNlIDB4YmQ6IHJldHVybigweGEzKTsJCS8qIFVrcmFpbmlhbiBHaGUgd2l0aCB1cHR1cm4gKi8KKyAgICAgIC8qIE5vdGUgc3Vic3RpdHV0aW9uIG9mIEdqZSBmb3IgR2hlLVVwdHVybiwgd2hpY2ggaXMgbm90IGluIDg4NTktNSAqLworICAgICAgZGVmYXVsdDoKKwlpZiAoYyA+IDB4N2YgJiYgYyA8IDB4YzApCisJICByZXR1cm4oVU5LKTsKKwlyZXR1cm4oeWs4bGNbY10pOworICAgIH0KK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4c2tjeShDSEFSIGMpCisjZWxzZQoreHNrY3koYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhza2N5ICovCQkJLyogU2hvcnQgS09JIHRvIExhdGluL0N5cmlsbGljICovCisgICAgcmV0dXJuKHlza2N5W2MgJiAweDdmXSk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGFzY3koQ0hBUiBjKQorI2Vsc2UKK3hhc2N5KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4YXNjeSAqLwkJCS8qIEFTQ0lJIHRvIExhdGluL0N5cmlsbGljICovCisgICAgaWYgKGxhbmdzW2xhbmd1YWdlXS5pZCA9PSBMX1JVU1NJQU4pIHsgLyogSWYgTEFOR1VBR0UgPT0gUlVTU0lBTiAgKi8KKwlyZXR1cm4oeXNrY3lbYyAmIDB4N2ZdKTsJLyogdHJlYXQgQVNDSUkgYXMgU2hvcnQgS09JICovCisgICAgfSBlbHNlIHJldHVybigoYyA+IDEyNykgPyAnPycgOiBjKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4YWNhcyhDSEFSIGMpCisjZWxzZQoreGFjYXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhhY2FzICovCQkJLyogQ1A4NjYgdG8gQVNDSUkgKi8KKyAgICBpZiAobGFuZ3NbbGFuZ3VhZ2VdLmlkID09IExfUlVTU0lBTikgeworCWMgPSB5YWNsY1tjXTsJCQkvKiBGaXJzdCB0byBMYXRpbi9DeXJpbGxpYyAqLworCXJldHVybih5bGNza1tjXSk7CQkvKiBUaGVuIHRvIFNob3J0IEtPSSAqLworICAgIH0gZWxzZSByZXR1cm4oKGMgPiAxMjcpID8gJz8nIDogYyk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeDU1YXMoQ0hBUiBjKQorI2Vsc2UKK3g1NWFzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4NTVhcyAqLwkJCS8qIENQODU1IHRvIEFTQ0lJICovCisgICAgaWYgKGxhbmdzW2xhbmd1YWdlXS5pZCA9PSBMX1JVU1NJQU4pIHsKKwljID0geTU1bGNbY107CQkJLyogRmlyc3QgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKwlyZXR1cm4oeWxjc2tbY10pOwkJLyogVGhlbiB0byBTaG9ydCBLT0kgKi8KKyAgICB9IGVsc2UgcmV0dXJuKChjID4gMTI3KSA/ICc/JyA6IGMpOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3gxMjUxYXMoQ0hBUiBjKQorI2Vsc2UKK3gxMjUxYXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHgxMjUxYXMgKi8JCQkvKiBDUDgxMjUxIHRvIEFTQ0lJICovCisgICAgaWYgKGxhbmdzW2xhbmd1YWdlXS5pZCA9PSBMX1JVU1NJQU4pIHsKKwljID0geTEyNTFsY1tjXTsJCQkvKiBGaXJzdCB0byBMYXRpbi9DeXJpbGxpYyAqLworCXJldHVybih5bGNza1tjXSk7CQkvKiBUaGVuIHRvIFNob3J0IEtPSSAqLworICAgIH0gZWxzZSByZXR1cm4oKGMgPiAxMjcpID8gJz8nIDogYyk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeHNrYXMoQ0hBUiBjKQorI2Vsc2UKK3hza2FzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4c2thcyAqLwkJCQkvKiBTaG9ydCBLT0kgdG8gQVNDSUkgKi8KKyAgICByZXR1cm4oKGMgPiA5NSkgPyAnPycgOiBjKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4azhhcyhDSEFSIGMpCisjZWxzZQoreGs4YXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhrOGFzICovCQkJCS8qIE9sZCBLT0ktOCBDeXJpbGxpYyB0byBBU0NJSSAqLworICAgIGlmIChsYW5nc1tsYW5ndWFnZV0uaWQgPT0gTF9SVVNTSUFOKSB7CisJYyA9IHlrOGxjW2NdOwkJCS8qIEZpcnN0IHRvIExhdGluL0N5cmlsbGljICovCisJcmV0dXJuKHlsY3NrW2NdKTsJCS8qIFRoZW4gdG8gU2hvcnQgS09JICovCisgICAgfSBlbHNlIHJldHVybigoYyA+IDEyNykgPyAnPycgOiBjKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDFzayhDSEFSIGMpCisjZWxzZQoreGwxc2soYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMXNrICovCQkJCS8qIExhdGluLTEgdG8gU2hvcnQgS09JICovCisgICAgYyA9IHpsMWFzKGMpOwkJCS8qIENvbnZlcnQgdG8gQVNDSUkgKi8KKyAgICByZXR1cm4oYyA9IHhhc3NrKGMpKTsJCS8qIENvbnZlcnQgQVNDSUkgdG8gU2hvcnQgS09JICovCit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeHcxbGMoQ0hBUiBjKQorI2Vsc2UKK3h3MWxjKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4dzFsYyAqLwkJCQkvKiBDUDEyNTIgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgICByZXR1cm4oKGMgPCAxNjApID8geHcxYXMoYykgOiB6bDFhcyhjKSk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGFzbGMoQ0hBUiBjKQorI2Vsc2UKK3hhc2xjKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4YXNsYyAqLwkJCS8qIEFTQ0lJIHRvIExhdGluL0N5cmlsbGljICovCisgICAgaWYgKGxhbmdzW2xhbmd1YWdlXS5pZCA9PSBMX1JVU1NJQU4pCisgICAgICByZXR1cm4oeXNrY3lbYyAmIDB4N2ZdKTsKKyAgICBlbHNlIHJldHVybihjICYgMHg3Zik7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGFzYWMoQ0hBUiBjKQorI2Vsc2UKK3hhc2FjKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4YXNhYyAqLwkJCS8qIEFTQ0lJIHRvIENQODY2ICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgaWYgKGxhbmdzW2xhbmd1YWdlXS5pZCA9PSBMX1JVU1NJQU4pIHsgLyogVXNlIFNob3J0IEtPSSAqLworCWMgPSB4c2tjeShjKTsJCQkvKiBUcmFuc2xhdGUgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKwlyZXR1cm4oeWxjYWNbY10pOwkJLyogVGhlbiB0byBDUDg2NiAqLworICAgIH0gZWxzZSByZXR1cm4oYyAmIDB4N2YpOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hhczU1KENIQVIgYykKKyNlbHNlCit4YXM1NShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGFzNTUgKi8JCQkvKiBBU0NJSSB0byBDUDg1NSAqLworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIGlmIChsYW5nc1tsYW5ndWFnZV0uaWQgPT0gTF9SVVNTSUFOKSB7IC8qIFVzZSBTaG9ydCBLT0kgKi8KKwljID0geHNrY3koYyk7CQkJLyogVHJhbnNsYXRlIHRvIExhdGluL0N5cmlsbGljICovCisJcmV0dXJuKHlsYzU1W2NdKTsJCS8qIFRoZW4gdG8gQ1A4NjYgKi8KKyAgICB9IGVsc2UgcmV0dXJuKGMgJiAweDdmKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4YXMxMjUxKENIQVIgYykKKyNlbHNlCit4YXMxMjUxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4YXMxMjUxICovCQkJLyogQVNDSUkgdG8gQ1A4MTI1MSAqLworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIGlmIChsYW5nc1tsYW5ndWFnZV0uaWQgPT0gTF9SVVNTSUFOKSB7IC8qIFVzZSBTaG9ydCBLT0kgKi8KKwljID0geHNrY3koYyk7CQkJLyogVHJhbnNsYXRlIHRvIExhdGluL0N5cmlsbGljICovCisJcmV0dXJuKHlsYzEyNTFbY10pOwkJLyogVGhlbiB0byBDUDg2NiAqLworICAgIH0gZWxzZSByZXR1cm4oYyAmIDB4N2YpOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hhc2s4KENIQVIgYykKKyNlbHNlCit4YXNrOChjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGFzazggKi8JCQkvKiBBU0NJSSB0byBLT0ktOCAqLworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIGlmIChsYW5nc1tsYW5ndWFnZV0uaWQgPT0gTF9SVVNTSUFOKSB7IC8qIFVzZSBTaG9ydCBLT0kgKi8KKwljID0geHNrY3koYyk7CQkJLyogVHJhbnNsYXRlIHRvIExhdGluL0N5cmlsbGljICovCisJcmV0dXJuKHlsY2s4W2NdKTsJCS8qIFRoZW4gdG8gS09JLTggKi8KKyAgICB9IGVsc2UgcmV0dXJuKGMgJiAweDdmKTsKK30KKyNlbHNlIC8qIE5vIEN5cmlsbGljICovCisjZGVmaW5lIHhhY2FzIE5VTEwKKyNkZWZpbmUgeDU1YXMgTlVMTAorI2RlZmluZSB4MTI1MWFzIE5VTEwKKyNkZWZpbmUgeGFjbGMgTlVMTAorI2RlZmluZSB4NTVsYyBOVUxMCisjZGVmaW5lIHgxMjUxbGMgTlVMTAorI2RlZmluZSB4YXNhYyBOVUxMCisjZGVmaW5lIHhhczU1IE5VTEwKKyNkZWZpbmUgeGFzMTI1MSBOVUxMCisjZGVmaW5lIHhhc2N5IE5VTEwKKyNkZWZpbmUgeGFzazggTlVMTAorI2RlZmluZSB4YXNsYyBOVUxMCisjZGVmaW5lIHhhc3NrIE5VTEwKKyNkZWZpbmUgeGs4YXMgTlVMTAorI2RlZmluZSB4azhsYyBOVUxMCisjZGVmaW5lIHhrcmxjIE5VTEwKKyNkZWZpbmUgeGt1bGMgTlVMTAorI2RlZmluZSB4bDFzayBOVUxMCisjZGVmaW5lIHh3MWxjIE5VTEwKKyNkZWZpbmUgeGxjYWMgTlVMTAorI2RlZmluZSB4bGM1NSBOVUxMCisjZGVmaW5lIHhsYzEyNTEgTlVMTAorI2RlZmluZSB4bGNhcyBOVUxMCisjZGVmaW5lIHhsY2s4IE5VTEwKKyNkZWZpbmUgeGxja3IgTlVMTAorI2RlZmluZSB4bGNrdSBOVUxMCisjZGVmaW5lIHhsY2g3IE5VTEwKKyNkZWZpbmUgeGxjc2sgTlVMTAorI2RlZmluZSB4c2thcyBOVUxMCisjZGVmaW5lIHhza2N5IE5VTEwKKyNkZWZpbmUgeGJ1bGMgTlVMTAorI2RlZmluZSB4bGNidSBOVUxMCisjZW5kaWYgLyogQ1lSSUxMSUMgKi8KKworLyogVHJhbnNsYXRpb24gZnVuY3Rpb25zIGZvciBIZWJyZXcgY2hhcmFjdGVyIHNldHMgKi8KKworI2lmZGVmIEhFQlJFVworCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hhc2g3KENIQVIgYykKKyNlbHNlCit4YXNoNyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGFzaDcgKi8JCQkvKiBBU0NJSSB0byBIZWJyZXctNyAqLworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIGlmIChjID09IDk2KSByZXR1cm4oJz8nKTsKKyAgICBpZiAoYyA+IDk2ICYmIGMgPCAxMjMpIHJldHVybihjIC0gMzIpOworICAgIGVsc2UgcmV0dXJuKGMpOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsMWg3KENIQVIgYykKKyNlbHNlCit4bDFoNyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwxaDcgKi8JCQkvKiBMYXRpbi0xIHRvIEhlYnJldy03ICovCisgICAgcmV0dXJuKHhhc2g3KHhsMWFzKGMpKSk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGwxbGgoQ0hBUiBjKQorI2Vsc2UKK3hsMWxoKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bDFsaCAqLwkJCQkvKiBMYXRpbi0xIHRvIExhdGluL0hlYnJldyAqLworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDE3MDogcmV0dXJuKCdhJyk7CQkvKiBGZW1pbmluZSBvcmRpbmFsICovCisgICAgICBjYXNlIDE4NjogcmV0dXJuKCdvJyk7CQkvKiBNYXNjdWxpbmUgb3JkaW5hbCAqLworICAgICAgY2FzZSAyMTU6IHJldHVybigxNzApOwkJLyogVGltZXMgKi8KKyAgICAgIGNhc2UgMjQ3OiByZXR1cm4oMTg2KTsJCS8qIERpdmlkZSAqLworICAgICAgZGVmYXVsdDogIHJldHVybiggKGMgPiAxOTApID8geGwxYXMoYykgOiBjICk7CisgICAgfQorfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3h3MWxoKENIQVIgYykKKyNlbHNlCit4dzFsaChjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeHcxbGggKi8JCQkJLyogQ1AxMjUyIHRvIExhdGluL0hlYnJldyAqLworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDE3MDogcmV0dXJuKCdhJyk7CQkvKiBGZW1pbmluZSBvcmRpbmFsICovCisgICAgICBjYXNlIDE4NjogcmV0dXJuKCdvJyk7CQkvKiBNYXNjdWxpbmUgb3JkaW5hbCAqLworICAgICAgY2FzZSAyMTU6IHJldHVybigxNzApOwkJLyogVGltZXMgKi8KKyAgICAgIGNhc2UgMjQ3OiByZXR1cm4oMTg2KTsJCS8qIERpdmlkZSAqLworICAgICAgZGVmYXVsdDoKKwlpZiAoYyA8IDE2MCkKKwkgIHJldHVybih4dzFhcyhjKSk7CisJZWxzZQorCSAgcmV0dXJuKChjID4gMTkwKSA/IHhsMWFzKGMpIDogYyk7CisgICAgfQorfQorCisjaWZkZWYgTEFUSU4yCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsMmg3KENIQVIgYykKKyNlbHNlCit4bDJoNyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwyaDcgKi8JCQkJLyogTGF0aW4tMiB0byBIZWJyZXctNyAqLworICAgIHJldHVybih4YXNoNyh4bDJhcyhjKSkpOworfQorI2Vsc2UKKyNkZWZpbmUgeGwyaDcgTlVMTAorI2VuZGlmIC8qIExBVElOMiAqLworCisjaWZuZGVmIE5PQ1lSSUwKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGxjaDcoQ0hBUiBjKQorI2Vsc2UKK3hsY2g3KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGNoNyAqLwkJCQkvKiBMYXRpbi9DeXJpbGxpYyB0byBIZWJyZXctNyAqLworICAgIHJldHVybih4YXNoNyh4bGNhcyhjKSkpOworfQorI2VuZGlmIC8qIE5PQ1lSSUwgKi8KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bGhhcyhDSEFSIGMpCisjZWxzZQoreGxoYXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsaGFzICovCQkJLyogTGF0aW4vSGVicmV3IHRvIEFTQ0lJICovCisgICAgcmV0dXJuKCAoYyA+IDEyNykgPyAnPycgOiBjICk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGxobDEoQ0hBUiBjKQorI2Vsc2UKK3hsaGwxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGhsMSAqLwkJCS8qIExhdGluL0hlYnJldyB0byBMYXRpbi0xICovCisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDE3MDogcmV0dXJuKDIxNSk7CisgICAgICBjYXNlIDE4NjogcmV0dXJuKDI0Nyk7CisgICAgICBkZWZhdWx0OiByZXR1cm4oIChjID4gMTkwKSA/ICc/JyA6IGMgKTsKKyAgICB9Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGxodzEoQ0hBUiBjKQorI2Vsc2UKK3hsaHcxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGh3MSAqLwkJCS8qIExhdGluL0hlYnJldyB0byBDUDEyNTIgKi8KKyAgICBpZiAoYyA+IDEyNyAmJiBjIDwgMTYwKQorICAgICAgcmV0dXJuKCc/Jyk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDE3MDogcmV0dXJuKDIxNSk7CisgICAgICBjYXNlIDE4NjogcmV0dXJuKDI0Nyk7CisgICAgICBkZWZhdWx0OiByZXR1cm4oIChjID4gMTkwKSA/ICc/JyA6IGMgKTsKKyAgICB9Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGxoNjIoQ0hBUiBjKQorI2Vsc2UKK3hsaDYyKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGg2MiAqLwkJCS8qIExhdGluL0hlYnJldyB0byBDUDg2MiAqLworICAgIHJldHVybih5bGg2MltjXSk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGwxNjIoQ0hBUiBjKQorI2Vsc2UKK3hsMTYyKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bDE2MiAqLwkJCS8qIExhdGluLTEgdG8gQ1A4NjIgKi8KKyAgICByZXR1cm4oeGxoNjIoeGwxbGgoYykpKTsJLyogVmlhIExhdGluL0hlYnJldyAqLworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsaGg3KENIQVIgYykKKyNlbHNlCit4bGhoNyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxoaDcgKi8JCQkvKiBMYXRpbi9IZWJyZXcgdG8gSGVicmV3LTcgKi8KKyAgICByZXR1cm4oeWxoaDdbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hoN2FzKENIQVIgYykKKyNlbHNlCit4aDdhcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGg3YXMgKi8JCQkvKiBIZWJyZXctNyB0byBBU0NJSSAqLworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIHJldHVybiggKGMgPiA5NSAmJiBjIDwgMTIzKSA/ICc/JyA6IGMgKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4NjJsaChDSEFSIGMpCisjZWxzZQoreDYybGgoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHg2MmxoICovCQkJLyogQ1A4NjIgdG8gTGF0aW4vSGVicmV3ICovCisgICAgcmV0dXJuKHk2MmxoW2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4NjJhcyhDSEFSIGMpCisjZWxzZQoreDYyYXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHg2MmFzICovCQkJLyogQ1A4NjIgdG8gQVNDSUkgKi8KKyAgICByZXR1cm4oIHhsaGFzKHg2MmxoKGMpKSApOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3g2MmwxKENIQVIgYykKKyNlbHNlCit4NjJsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeDYybDEgKi8JCQkvKiBDUDg2MiB0byBMYXRpbi0xICovCisgICAgcmV0dXJuKCB4bGhsMSh4NjJsaChjKSkgKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4aDdsaChDSEFSIGMpCisjZWxzZQoreGg3bGgoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhoN2xoICovCQkJLyogSGVicmV3LTcgdG8gTGF0aW4vSGVicmV3ICovCisgICAgaWYgKGMgJiAweDgwKQorICAgICAgcmV0dXJuKFVOSyk7CisgICAgcmV0dXJuKHloN2xoW2NdKTsKK30KKworI2Vsc2UgLyogTm8gSGVicmV3ICovCisKKyNkZWZpbmUgeGFzaDcgTlVMTAorI2RlZmluZSB4bDFoNyBOVUxMCisjZGVmaW5lIHhsMmg3IE5VTEwKKyNkZWZpbmUgeGxjaDcgTlVMTAorI2RlZmluZSB4bDFsaCBOVUxMCisjZGVmaW5lIHh3MWxoIE5VTEwKKyNkZWZpbmUgeGxoYXMgTlVMTAorI2RlZmluZSB4bGhsMSBOVUxMCisjZGVmaW5lIHhsaHcxIE5VTEwKKyNkZWZpbmUgeGwxNjIgTlVMTAorI2RlZmluZSB4bGhoNyBOVUxMCisjZGVmaW5lIHhsaDYyIE5VTEwKKyNkZWZpbmUgeGg3YXMgTlVMTAorI2RlZmluZSB4NjJhcyBOVUxMCisjZGVmaW5lIHg2MmwxIE5VTEwKKyNkZWZpbmUgeGg3bGggTlVMTAorI2RlZmluZSB4NjJsaCBOVUxMCisKKyNlbmRpZiAvKiBIRUJSRVcgKi8KKworLyogVHJhbnNsYXRpb24gZnVuY3Rpb25zIGZvciBHcmVlayBjaGFyYWN0ZXIgc2V0cyAqLworCisjaWZkZWYgR1JFRUsKKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4YXNlZyhDSEFSIGMpCisjZWxzZQoreGFzZWcoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhhc2VnICovCQkJLyogQVNDSUkgdG8gRUxPVCA5MjcgKi8KKyAgICBpZiAoYyAmIDB4ODApCisgICAgICByZXR1cm4oVU5LKTsKKyAgICBpZiAoYyA+IDk2ICYmIGMgPCAxMjMpIHJldHVybihjIC0gMzIpOworICAgIGVsc2UgcmV0dXJuKGMpOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsMWVnKENIQVIgYykKKyNlbHNlCit4bDFlZyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGwxZ2UgKi8JCQkvKiBMYXRpbi0xIHRvIEVMT1QgOTI3ICovCisgICAgcmV0dXJuKHhhc2VnKHhsMWFzKGMpKSk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGwybGcoQ0hBUiBjKQorI2Vsc2UKK3hsMmxnKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bDJsZyAqLwkJCS8qIExhdGluLTEgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICBpZiAoYyA8IDE2MCkgcmV0dXJuKGMpOworICAgIGVsc2UgaWYgKGMgPT0gMTYwIHx8IGMgPT0gMTY4IHx8IGMgPT0gMTczIHx8IGMgPT0gMTc0KQorICAgICAgcmV0dXJuKGMpOworICAgIGVsc2UgcmV0dXJuKCc/Jyk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGwxbGcoQ0hBUiBjKQorI2Vsc2UKK3hsMWxnKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bDFsZyAqLwkJCS8qIExhdGluLTEgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICBpZiAoYyA8IDE2MCkgcmV0dXJuKGMpOworICAgIHN3aXRjaChjKSB7CisgICAgICBjYXNlIDE2MDoJCQkJLyogVGhlbXNlbHZlcyAqLworICAgICAgY2FzZSAxNjQ6CisgICAgICBjYXNlIDE2NjoKKyAgICAgIGNhc2UgMTY3OgorICAgICAgY2FzZSAxNjg6CisgICAgICBjYXNlIDE2OToKKyAgICAgIGNhc2UgMTcxOgorICAgICAgY2FzZSAxNzI6CisgICAgICBjYXNlIDE3MzoKKyAgICAgIGNhc2UgMTc2OgorICAgICAgY2FzZSAxNzc6CisgICAgICBjYXNlIDE3ODoKKyAgICAgIGNhc2UgMTc5OgorICAgICAgY2FzZSAxODA6CisgICAgICBjYXNlIDE4NzoKKyAgICAgIGNhc2UgMTg5OgorCXJldHVybihjKTsKKyAgICAgIGNhc2UgMTgxOgkJCQkvKiBMb3dlcmNhc2UgbXUgKi8KKwlyZXR1cm4oMjM2KTsKKyAgICAgIGRlZmF1bHQ6CisJcmV0dXJuKFVOSyk7CisgICAgfQorfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3h3MWxnKENIQVIgYykKKyNlbHNlCit4dzFsZyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeHcxbGcgKi8JCQkJLyogQ1AxMjUyIHRvIExhdGluL0dyZWVrICovCisgICAgcmV0dXJuKChjIDwgMTYwKSA/IHh3MWFzKGMpIDogeGwxbGcoYykpOworfQorCisKKyNpZmRlZiBMQVRJTjIKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGwyZWcoQ0hBUiBjKQorI2Vsc2UKK3hsMmVnKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bDJlZyAqLwkJCQkvKiBMYXRpbi0yIHRvIEVMT1QgOTI3ICovCisgICAgcmV0dXJuKHhhc2VnKHhsMmFzKGMpKSk7Cit9CisjZWxzZQorI2RlZmluZSB4bDJlZyBOVUxMCisjZW5kaWYgLyogTEFUSU4yICovCisKKyNpZm5kZWYgTk9DWVJJTAorQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bGNlZyhDSEFSIGMpCisjZWxzZQoreGxjZWcoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsY2VnICovCQkJLyogTGF0aW4vQ3lyaWxsaWMgdG8gRUxPVCA5MjcgKi8KKyAgICByZXR1cm4oeGFzZWcoeGxjYXMoYykpKTsKK30KKyNlbmRpZiAvKiBOT0NZUklMICovCisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGxnYXMoQ0hBUiBjKQorI2Vsc2UKK3hsZ2FzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGdhcyAqLwkJCS8qIExhdGluL0dyZWVrIHRvIEFTQ0lJICovCisgICAgcmV0dXJuKCAoYyA+IDEyNykgPyAnPycgOiBjICk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGxnbDEoQ0hBUiBjKQorI2Vsc2UKK3hsZ2wxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGdsMSAqLwkJCS8qIExhdGluL0dyZWVrIHRvIExhdGluLTEgKi8KKyAgICBpZiAoYyA9PSAyMzYpCisgICAgICByZXR1cm4oMTgxKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oeGwxbGcoYykpOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsZ3cxKENIQVIgYykKKyNlbHNlCit4bGd3MShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGxndzEgKi8JCQkvKiBMYXRpbi9HcmVlayB0byBMYXRpbi0xICovCisgICAgaWYgKGMgPiAxMjcgJiYgYyA8IDE2MCkKKyAgICAgIHJldHVybignPycpOworICAgIHJldHVybih4bGdsMShjKSk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGxnNjkoQ0hBUiBjKQorI2Vsc2UKK3hsZzY5KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bGc2OSAqLwkJCS8qIExhdGluL0dyZWVrIHRvIENQODY5ICovCisgICAgcmV0dXJuKHlsZzY5W2NdKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDE2OShDSEFSIGMpCisjZWxzZQoreGwxNjkoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMTY5ICovCQkJLyogTGF0aW4tMSB0byBDUDg2OSAqLworICAgIHJldHVybih4bGc2OSh4bDFsZyhjKSkpOwkvKiBWaWEgTGF0aW4vR3JlZWsgKi8KK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bGdlZyhDSEFSIGMpCisjZWxzZQoreGxnZWcoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsZ2VnICovCQkJLyogTGF0aW4vR3JlZWsgdG8gRUxPVCA5MjcgKi8KKyAgICByZXR1cm4oeWxnZWdbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hlZ2FzKENIQVIgYykKKyNlbHNlCit4ZWdhcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGVnYXMgKi8JCQkvKiBFTE9UIDkyNyB0byBBU0NJSSAqLworICAgIGlmIChjICYgMHg4MCkKKyAgICAgIHJldHVybihVTkspOworICAgIHJldHVybiggKGMgPiA5NiAmJiBjIDwgMTIzKSA/ICc/JyA6IGMgKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4NjlsZyhDSEFSIGMpCisjZWxzZQoreDY5bGcoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHg2OWxnICovCQkJLyogQ1A4NjkgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICByZXR1cm4oeTY5bGdbY10pOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3g2OWFzKENIQVIgYykKKyNlbHNlCit4NjlhcyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeDY5YXMgKi8JCQkvKiBDUDg2OSB0byBBU0NJSSAqLworICAgIHJldHVybiggeGxnYXMoeDY5bGcoYykpICk7Cit9CisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeDY5bDEoQ0hBUiBjKQorI2Vsc2UKK3g2OWwxKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4NjlsMSAqLwkJCS8qIENQODY5IHRvIExhdGluLTEgKi8KKyAgICByZXR1cm4oIHhsZ2wxKHg2OWxnKGMpKSApOworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hlZ2xnKENIQVIgYykKKyNlbHNlCit4ZWdsZyhjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGVnbGcgKi8JCQkvKiBFTE9UIDkyNyB0byBMYXRpbi9HcmVlayAqLworICAgIHJldHVybih5ZWdsZ1tjXSk7Cit9CisKKyNlbHNlIC8qIE5vIEdyZWVrICovCisKKyNkZWZpbmUgeDY5YXMgTlVMTAorI2RlZmluZSB4NjlsMSBOVUxMCisjZGVmaW5lIHg2OWxnIE5VTEwKKyNkZWZpbmUgeGFzZWcgTlVMTAorI2RlZmluZSB4ZWdhcyBOVUxMCisjZGVmaW5lIHhlZ2xnIE5VTEwKKyNkZWZpbmUgeGwxNjkgTlVMTAorI2RlZmluZSB4bDFlZyBOVUxMCisjZGVmaW5lIHhsMWxnIE5VTEwKKyNkZWZpbmUgeHcxbGcgTlVMTAorI2RlZmluZSB4bDJnZSBOVUxMCisjZGVmaW5lIHhsMmxnIE5VTEwKKyNkZWZpbmUgeGxjZ2UgTlVMTAorI2RlZmluZSB4bGc2OSBOVUxMCisjZGVmaW5lIHhsZ2FzIE5VTEwKKyNkZWZpbmUgeGxnZWcgTlVMTAorI2RlZmluZSB4bGdnZSBOVUxMCisjZGVmaW5lIHhsZ2wxIE5VTEwKKyNkZWZpbmUgeGxndzEgTlVMTAorCisjZW5kaWYgLyogR1JFRUsgKi8KKworCisvKiBUcmFuc2xhdGlvbiBmdW5jdGlvbnMgZm9yIEphcGFuZXNlIEthbmppIGNoYXJhY3RlciBzZXRzICovCisKKyNpZmRlZiBLQU5KSQorLyoKKyAgVHJhbnNsYXRlIEthbmppIFRyYW5zZmVyIENoYXJhY3RlciBTZXQgKEVVQykgdG8gbG9jYWwgZmlsZSBjaGFyYWN0ZXIgc2V0LAorICBjb250cmlidXRlZCBieSBEci4gSGlyb2Z1bWkgRnVqaWksIEphcGFuIEhpZ2ggRW5lcmd5IFJlc2VhcmNoIExhYm9yYXRvcnkKKyAgKEtFSyksIFRva3lvLCBKYXBhbi4KKworICBhIGlzIGEgYnl0ZSB0byBiZSB0cmFuc2xhdGVkLCB3aGljaCBtYXkgYmUgYSBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXIsCisgIHRoZSBLYXRha2FuYSBwcmVmaXgsIHRoZSBmaXJzdCBieXRlIG9mIGEgdHdvLWJ5dGUgS2FuamkgY2hhcmFjdGVyLCBvciB0aGUKKyAgc2Vjb25kIGJ5dGUgb2YgMi1ieXRlIEthbmppIGNoYXJhY3Rlci4KKworICBmbiBpcyB0aGUgb3V0cHV0IGZ1bmN0aW9uLgorCisgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorKi8KKworX1BST1RPVFlQKHN0YXRpYyBpbnQganBueGFzLCAoaW50LCBpbnRbXSkgKTsKK19QUk9UT1RZUChzdGF0aWMgaW50IGpwbnhrdCwgKGludCwgaW50W10pICk7CitfUFJPVE9UWVAoc3RhdGljIGludCBqcG54a24sIChpbnRbXSwgaW50W10pICk7CisKK3N0YXRpYyBpbnQganBuY250OwkJCS8qIEJ5dGUgY291bnQgZm9yIEphcGFuZXNlICovCitzdGF0aWMgaW50IGpwbmxzdDsJCQkvKiBMYXN0IHN0YXR1cyAoZm9yIEpJUzcpICovCisKK3N0YXRpYyBpbnQKK2pwbnhhcyhhLCBvYnVmKSBpbnQgYTsgaW50IG9idWZbXTsgeyAvKiBUcmFuc2xhdGUgQVNDSUkgdG8gbG9jYWwgZmlsZSBjb2RlICovCisgICAgaW50IHI7CisKKyAgICByID0gMDsKKyAgICBpZiAoZmNoYXJzZXQgPT0gRkNfSklTNykgeworCXN3aXRjaCAoanBubHN0KSB7CisJICBjYXNlIDE6CisJICAgIG9idWZbMF0gPSAweDBmOworCSAgICBvYnVmWzFdID0gYTsKKwkgICAgciA9IDI7CisJICAgIGJyZWFrOworCSAgY2FzZSAyOgorCSAgICBvYnVmWzBdID0gMHgxYjsKKwkgICAgb2J1ZlsxXSA9IDB4Mjg7CisJICAgIG9idWZbMl0gPSAweDRhOworCSAgICBvYnVmWzNdID0gYTsKKwkgICAgciA9IDQ7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgb2J1ZlswXSA9IGE7CisJICAgIHIgPSAxOworCSAgICBicmVhazsKKwl9CisgICAgfSBlbHNlIHsKKwlvYnVmWzBdID0gYTsKKwlyID0gMTsKKyAgICB9CisgICAgcmV0dXJuKHIpOworfQorCitzdGF0aWMgaW50CitqcG54a3QoYSwgb2J1ZikgaW50IGE7IGludCBvYnVmW107IHsKKy8qIFRyYW5zbGF0ZSBKSVMgWCAyMDEgS2F0YWthbmEgdG8gbG9jYWwgY29kZSAqLworCisgICAgaW50IHI7CisKKyAgICByID0gMDsKKyAgICBpZiAoZmNoYXJzZXQgPT0gRkNfSklTNykgeworCXN3aXRjaCAoanBubHN0KSB7CisJICBjYXNlIDI6CQkJCS8qIGZyb20gS2FuamkgKi8KKwkgICAgb2J1ZltyKytdID0gMHgxYjsKKwkgICAgb2J1ZltyKytdID0gMHgyODsKKwkgICAgb2J1ZltyKytdID0gMHg0YTsKKwkgIGNhc2UgMDoJCQkJLyogZnJvbSBSb21hbiAqLworCSAgICBvYnVmW3IrK10gPSAweDBlOworCSAgZGVmYXVsdDoKKwkgICAgb2J1ZltyKytdID0gKGEgJiAweDdmKTsKKwkgIGJyZWFrOworCX0KKyAgICB9IGVsc2UgeworCWlmIChmY2hhcnNldCA9PSBGQ19KRVVDKQorCSAgb2J1ZltyKytdID0gMHg4ZTsKKwlvYnVmW3IrK10gPSAoYSB8IDB4ODApOworICAgIH0KKyAgICByZXR1cm4ocik7Cit9CisKK3N0YXRpYyBpbnQKK2pwbnhrbihpYnVmLCBvYnVmKSBpbnQgaWJ1ZltdLCBvYnVmW107IHsKKyAgICAvKiBUcmFuc2xhdGUgSklTIFggMDIwOCBLYW5qaSB0byBsb2NhbCBjb2RlICovCisgICAgaW50IGMxLCBjMjsKKyAgICBpbnQgcjsKKworICAgIGMxID0gaWJ1ZlswXSAmIDB4N2Y7CisgICAgYzIgPSBpYnVmWzFdICYgMHg3ZjsKKworICAgIGlmIChmY2hhcnNldCA9PSBGQ19TSEpJUykgeworCWlmIChjMSAmIDEpCisJICBjMiArPSAweDFmOworCWVsc2UKKwkgIGMyICs9IDB4N2Q7CisKKyAgICAgICAgaWYgKGMyID49IDB4N2YpIGMyKys7CisKKyAgICAgICAgYzEgPSAoKGMxIC0gMHgyMSkgPj4gMSkgKyAweDgxOworICAgICAgICBpZiAoYzEgPiAweDlmKSBjMSArPSAweDQwOworCisgICAgICAgIG9idWZbMF0gPSBjMTsKKyAgICAgICAgb2J1ZlsxXSA9IGMyOworICAgICAgICByID0gMjsKKyAgICB9IGVsc2UgaWYgKGZjaGFyc2V0ID09IEZDX0pJUzcpIHsKKyAgICAgICAgciA9IDA7CisgICAgICAgIHN3aXRjaCAoanBubHN0KSB7CisgIAkgIGNhc2UgMToKKwkgICAgb2J1ZltyKytdID0gMHgwZjsgLyogRnJvbSBLYXRha2FuYSAqLworICAJICBjYXNlIDA6CisJICAgIG9idWZbcisrXSA9IDB4MWI7CisJICAgIG9idWZbcisrXSA9IDB4MjQ7CisJICAgIG9idWZbcisrXSA9IDB4NDI7CisJICBkZWZhdWx0OgorCSAgICBvYnVmW3IrK10gPSBjMTsKKwkgICAgb2J1ZltyKytdID0gYzI7CisJICAgIGJyZWFrOworCX0KKyAgICB9IGVsc2UgeworICAgICAgICBvYnVmWzBdID0gKGMxIHwgMHg4MCk7CisgICAgICAgIG9idWZbMV0gPSAoYzIgfCAweDgwKTsKKyAgICAgICAgciA9IDI7CisgICAgfQorICAgIHJldHVybihyKTsKK30KKworaW50Cit4a2FuamYoKSB7CisvKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgZm9yIHhrYW5qaSAqLworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gRi9YLXBhY2tldCBpcyByZWNlaXZlZCAqLworICAgIGpwbmNudCA9IGpwbmxzdCA9IDA7CisgICAgcmV0dXJuKDApOworfQorCitpbnQKKyNpZmRlZiBDS19BTlNJQworeGthbmp6KGludCAoKmZuKShjaGFyKSkKKyNlbHNlCit4a2FuanooZm4pIGludCAoKmZuKSgpOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhrYW5qeiAqLworLyoKKyAgVGVybWluYXRlIHhrYW5qaQorICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gWi1wYWNrZXQgaXMgcmVjZWl2ZWQKKyAgKGJlZm9yZSBjbG9zaW5nIHRoZSBmaWxlKS4KKyovCisgICAgc3RhdGljIGludCBvYnVmWzZdOworICAgIGludCByLCBpLCBjOworCisgICAgaWYgKGZjaGFyc2V0ID09IEZDX0pJUzcpIHsKKyAgICAgICAgYyA9ICdBJzsJCQkvKiBEdW1teSBSb21hbiBjaGFyYWN0ZXIgKi8KKyAgICAgICAgciA9IGpwbnhhcyhjLCBvYnVmKSAtIDE7CS8qIC0xIHJlbW92ZXMgRHVtbXkgY2hhcmFjdGVyICovCisgICAgICAgIGlmIChyID4gMCkgeworCSAgICBmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKQorCSAgICAgIGlmICgoKCpmbikoKGNoYXIpIG9idWZbaV0pKSA8IDApCisJCXJldHVybigtMSk7CisJfQorICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAorI2lmZGVmIENLX0FOU0lDCit4a2FuamkoaW50IGEsIGludCAoKmZuKShjaGFyKSkKKyNlbHNlCit4a2FuamkoYSwgZm4pIGludCBhOyBpbnQgKCpmbikoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4a2FuamkgKi8KKyAgICBzdGF0aWMgaW50IHhidWZbMl07CisgICAgc3RhdGljIGludCBvYnVmWzhdOworCisgICAgaW50IGksIHI7CisgICAgaW50IGM3OworICAgIGludCBzdGF0ZT0wOworCisgICAgciA9IDA7CisgICAgaWYgKGpwbmNudCA9PSAwKSB7CisJLyogMXN0IGJ5dGUgKi8KKwlpZiAoKGEgJiAweDgwKSA9PSAwKSB7CisJICAgIC8qIDh0aCBiaXQgaXMgMCwgaS5lLiwgc2luZ2xlLWJ5dGUgY29kZSAqLworCSAgICByID0ganBueGFzKGEsIG9idWYpOworCSAgICBzdGF0ZSA9IDA7CisJfSBlbHNlIHsKKwkgICAgLyogOHRoIGJpdCBpcyAxLCBjaGVjayB0aGUgcmFuZ2UgKi8KKwkgICAgYzcgPSBhICYgMHg3ZjsKKwkgICAgaWYgKCgoYzcgPiAweDIwKSAmJiAoYzcgPCAweDdmKSkgfHwgKGM3ID09IDB4MGUpKSB7CisJICAgICAgICAvKiBkb3VibGUgYnl0ZSBjb2RlICovCisJICAgICAgICB4YnVmW2pwbmNudCsrXSA9IGE7CisJICAgIH0gZWxzZSB7CisJICAgICAgICAvKiBzaW5nbGUgYnl0ZSBjb2RlICovCisJICAgICAgICByID0ganBueGFzKGEsIG9idWYpOworCSAgICAgICAgc3RhdGUgPSAwOworCSAgICB9CisJfQorICAgIH0gZWxzZSB7CisJLyogbm90IHRoZSAxc3QgYnl0ZSAqLworCXhidWZbanBuY250KytdID0gYTsKKwlpZiAoeGJ1ZlswXSA9PSAweDhlKSB7CisJICAgIHIgPSBqcG54a3QoeGJ1ZlsxXSwgb2J1Zik7CisJICAgIHN0YXRlID0gMTsKKwl9IGVsc2UgeworCSAgICByID0ganBueGtuKHhidWYsIG9idWYpOworCSAgICBzdGF0ZSA9IDI7CisJfQorICAgIH0KKyAgICBpZiAociA+IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHI7IGkrKyApCisJICBpZiAoKCgqZm4pKChjaGFyKSBvYnVmW2ldKSkgPCAwKQorCSAgICByZXR1cm4oLTEpOworICAgICAgICBqcG5sc3QgPSBzdGF0ZTsKKyAgICAgICAganBuY250ID0gMDsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCisvKgorICBGdW5jdGlvbiBmb3IgdHJhbnNsYXRpbmcgZnJvbSBKYXBhbmVzZSBmaWxlIGNoYXJhY3RlciBzZXQKKyAgdG8gSmFwYW5lc2UgRVVDIHRyYW5zZmVyIGNoYXJhY3RlciBzZXQuCisgIFJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgMCwgMSwgb3IgMiBieXRlcy4KKyovCisKKy8qIHprYW5qaSAqLworc3RhdGljIGludCBqcG5zdHo7CQkJLyogc3RhdHVzIGZvciBKSVMtNyAqLworc3RhdGljIGludCBqcG5wbmQ7CQkJLyogbnVtYmVyIG9mIHBlbmRpbmcgYnl0ZXMgKi8KK3N0YXRpYyBpbnQganBucG50OwkJCS8qIHBlbmRpbmcgYnVmZmVyIGluZGV4ICovCitzdGF0aWMgaW50IGpwbnBiZls4XTsJCQkvKiBwZW5kaW5nIGJ1ZmZlciAqLworCisvKiBUaGVyZSBpcyBzb21lIGR1cGxpY2F0aW9uIGhlcmUgYmV0d2VlbiB0aGUgb2xkIGFuZCBuZXcgSklTLTcgcGFyc2VycyAqLworLyogdG8gYmUgY2xlYW5lZCB1cCBsYXRlci4uLiAqLworCitWT0lECitqN2luaXQoKSB7CQkJCS8qIEluaXRpYWxpemUgSklTLTcgcGFyc2VyICovCisgICAganBuc3R6ID0gMDsKKyAgICBqcG5wbmQgPSAwOworICAgIGpwbnBudCA9IDA7Cit9CisKK2ludAorZ2V0ajcoKSB7CQkJCS8qIFJlYWRzIEpJUy03IHJldHVybnMgbmV4dCBFVUMgYnl0ZSAqLworICAgIGludCB4OworCisgICAgaWYgKGpwbnBuZCA+IDApIHsJCQkvKiBJZiBzb21ldGhpbmcgaXMgcGVuZGluZyAqLworCXggPSAodW5zaWduZWQpIGpwbnBiZltqcG5wbnQrK107IC8qIEdldCBpdCAqLworCWpwbnBuZC0tOworCWlmIChqcG5wbmQgPCAwKSBqcG5wbmQgPSAwOworCXJldHVybigodW5zaWduZWQpeCk7CisgICAgfQorICAgIGpwbnBudCA9IDA7CisKKyAgICBpZiAoKHggPSB6bWluY2hhcigpKSA8IDApIHJldHVybih4KTsKKyAgICB3aGlsZSAoanBucG5kID09IDApIHsJCS8qIFdoaWxlIHNvbWV0aGluZyBpcyBwZW5kaW5nLi4uICovCisJaWYgKCh4ID4gMHgyMCkgJiYgKHggPCAweDdmKSkgewkvKiA3LWJpdCBncmFwaGljIGNoYXJhY3RlciAqLworCSAgICBzd2l0Y2ggKGpwbnN0eikgeworCSAgICAgIGNhc2UgMToJCQkgLyogS2F0YWthbmEgKi8KKyNpZmRlZiBDT01NRU5UCisJCS8qIFRoaXMgY2FuJ3QgYmUgcmlnaHQuLi4gKi8KKwkJanBucGJmW2pwbnBuZCsrXSA9IDB4ODA7IC8qIEluc2VydCBmbGFnIChOT1QgU1MyPz8/KSAqLworI2Vsc2UKKwkJanBucGJmW2pwbnBuZCsrXSA9IDB4OGU7IC8qIEluc2VydCBTUzIgKi8KKyNlbmRpZiAvKiBDT01NRU5UICovCisJCWpwbnBiZltqcG5wbmQrK10gPSAoeCB8IDB4ODApOyAvKiBJbnNlcnQgS2FuYSArIDh0aCBiaXQgKi8KKwkJYnJlYWs7CisJICAgICAgY2FzZSAyOgkJCS8qIEthbmppICovCisJCWpwbnBiZltqcG5wbmQrK10gPSAoeCB8IDB4ODApOyAvKiBHZXQgYW5vdGhlciBieXRlICovCisJCWlmICgoeCA9IHptaW5jaGFyKCkpIDwgMCkgcmV0dXJuKHgpOworCQlqcG5wYmZbanBucG5kKytdID0gKHggfCAweDgwKTsKKwkJYnJlYWs7CisJICAgICAgZGVmYXVsdDoJCQkvKiBBU0NJSSAvIEpJUyBSb21hbiAqLworCQlqcG5wYmZbanBucG5kKytdID0geDsKKwkJYnJlYWs7CisJICAgIH0KKwl9IGVsc2UgaWYgKHggPT0gMHgwZSkgewkJLyogXk4gPSBTTyAqLworCSAgICBqcG5zdHogPSAxOwkJCS8qIEthdGFrYW5hICovCisJICAgIGlmICgoeCA9IHptaW5jaGFyKCkpIDwgMCkgcmV0dXJuKHgpOworCX0gZWxzZSBpZiAoeCA9PSAweDBmKSB7CQkvKiBeTyA9IFNJICovCisJICAgIGpwbnN0eiA9IDA7CQkJLyogQVNDSUkgLyBKSVMgUm9tYW4gKi8KKwkgICAgaWYgKCh4ID0gem1pbmNoYXIoKSkgPCAwKSByZXR1cm4oeCk7CisJfSBlbHNlIGlmICh4ID09IDB4MWIpIHsJCS8qIEVzY2FwZSAqLworCSAgICBqcG5wYmZbanBucG5kKytdID0geDsJLyogU2F2ZSBpbiBidWZmZXIgKi8KKwkgICAgaWYgKCh4ID0gem1pbmNoYXIoKSkgPCAwKSByZXR1cm4oeCk7CisJICAgIGpwbnBiZltqcG5wbmQrK10gPSB4OwkvKiBTYXZlIGluIGJ1ZmZlciAqLworCSAgICBpZiAoeCA9PSAnJCcpIHsJCS8qIDxFU0M+JCAqLworCQlpZiAoKHggPSB6bWluY2hhcigpKSA8IDApIHJldHVybih4KTsKKwkJanBucGJmW2pwbnBuZCsrXSA9IHg7CisJCWlmICgoeCA9PSAnQCcpIHx8ICh4ID09ICdCJykpIHsJLyogS2FuamkgKi8KKwkJICAgIGpwbnN0eiA9IDI7CisJCSAgICBqcG5wbnQgPSBqcG5wbmQgPSAwOworCQkgICAgaWYgKCh4ID0gem1pbmNoYXIoKSkgPCAwKSByZXR1cm4oeCk7CisJCX0KKwkgICAgfSBlbHNlIGlmICh4ID09ICcoJykgewkvKiA8RVNDPiggPT0gOTQtYnl0ZSBzaW5nbGUtYnl0ZSBzZXQgKi8KKwkJaWYgKCh4ID0gem1pbmNoYXIoKSkgPCAwKSByZXR1cm4oeCk7CisJCWpwbnBiZltqcG5wbmQrK10gPSB4OworCQlpZiAoKHggPT0gJ0InKSB8fCAoeCA9PSAnSicpKSB7CS8qIEFTQ0lJIG9yIEpJUyBSb21hbiAqLworCQkgICAganBuc3R6ID0gMDsJCSAgICAgICAgLyogU2V0IHN0YXRlICovCisJCSAgICBqcG5wbnQgPSBqcG5wbmQgPSAwOyAgICAgICAgLyogUmVzZXQgcG9pbnRlcnMgKi8KKwkJICAgIGlmICgoeCA9IHptaW5jaGFyKCkpIDwgMCkgcmV0dXJuKHgpOworCQl9CisJICAgIH0gZWxzZSBpZiAoeCA9PSAweDFiKSB7CS8qIDxFU0M+PEVTQz4gKi8KKwkJanBucG50ID0ganBucG5kID0gMDsJLyogUmVzZXQgcG9pbnRlcnMsIHN0YXkgaW4gc3RhdGUgKi8KKwkJaWYgKCh4ID0gem1pbmNoYXIoKSkgPCAwKSByZXR1cm4oeCk7CisJICAgIH0KKwl9IGVsc2UgewkJCS8qIE5vdCA8RVNDPiAtIGp1c3Qgc2F2ZSBpdCAqLworCSAgICBqcG5wYmZbanBucG5kKytdID0geDsKKwl9CisgICAgfQorICAgIGpwbnBudCA9IDA7CisgICAgeCA9ICh1bnNpZ25lZClqcG5wYmZbanBucG50KytdOworICAgIGpwbnBuZC0tOworICAgIHJldHVybigodW5zaWduZWQpeCk7Cit9CisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitldV90b19zaihVU0hPUlQgZXUpCQkJLyogRVVDLUpQIHRvIFNoaWZ0LUpJUyAqLworI2Vsc2UKK2V1X3RvX3NqKGV1KSBVU0hPUlQgZXU7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBpbnQgYzEsIGMyOworICAgIHVuaW9uIGNrX3Nob3J0IGpjb2RlLHNjb2RlOworCisgICAgamNvZGUueF9zaG9ydCA9IGV1OworICAgIGMxID0gKGpjb2RlLnhfY2hhcltieXRlb3JkZXJdICYgMHg3Zik7CisgICAgYzIgPSAoamNvZGUueF9jaGFyWzEtYnl0ZW9yZGVyXSAmIDB4N2YpOworCisgICAgaWYgKGMxICYgMSkKKyAgICAgIGMyICs9IDB4MWY7CisgICAgZWxzZQorICAgICAgYzIgKz0gMHg3ZDsKKyAgICBpZiAoYzIgPj0gMHg3ZikKKyAgICAgIGMyKys7CisgICAgYzEgPSAoKGMxIC0gMHgyMSkgPj4gMSkgKyAweDgxOworICAgIGlmIChjMSA+IDB4OWYpCisgICAgICBjMSArPSAweDQwOworCisgICAgc2NvZGUueF9jaGFyW2J5dGVvcmRlcl0gPSBjMTsKKyAgICBzY29kZS54X2NoYXJbMS1ieXRlb3JkZXJdID0gYzI7CisgICAgcmV0dXJuKHNjb2RlLnhfc2hvcnQpOworfQorCisKK1VTSE9SVAorI2lmZGVmIENLX0FOU0lDCitzal90b19ldShVU0hPUlQgc2opCQkJLyogU2hpZnQtSklTIHRvIEVVQy1KUCAqLworI2Vsc2UKK3NqX3RvX2V1KHNqKSBVU0hPUlQgc2o7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICB1bmlvbiBja19zaG9ydCBqY29kZSwgc2NvZGU7CisgICAgaW50IGMwLCBjMTsKKworICAgIHNjb2RlLnhfc2hvcnQgPSBzajsKKyAgICBjMCA9IHNjb2RlLnhfY2hhcltieXRlb3JkZXJdOwkvKiBMZWZ0IChoaSBvcmRlcikgYnl0ZSAqLworICAgIGMxID0gc2NvZGUueF9jaGFyWzEtYnl0ZW9yZGVyXTsJLyogUmlnaHQgKGxvIG9yZGVyKSBieXRlICovCisKKyAgICBpZiAoKChjMCA+PSAweDgxKSAmJiAoYzAgPD0gMHg5ZikpIHx8IC8qIEhpZ2ggb3JkZXIgYnl0ZSBoYXMgOHRoIGJpdCBzZXQgKi8KKyAgICAgICAgKChjMCA+PSAweGUwKSAmJiAoYzAgPD0gMHhmYykpKSB7IC8qIEthbmppICovCisJaWYgKGMwIDw9IDB4OWYpCQkJICAvKiBUd28gYnl0ZXMgaW4gKi8KKwkgIGMwIC09IDB4NzE7CQkJICAvKiBEbyB0aGUgc2hpZnRpbmcuLi4gKi8KKwllbHNlCisJICBjMCAtPSAweGIxOworCWMwID0gYzAgKiAyICsgMTsKKwlpZiAoYzEgPiAweDdmKSBjMSAtPSAxOworCWlmIChjMSA+PSAweDllKSB7CisJICAgIGMxIC09IDB4N2Q7CisJICAgIGMwICs9IDE7CisJfSBlbHNlIHsKKwkgICAgYzEgLT0gMHgxZjsKKwl9CisJamNvZGUueF9jaGFyW2J5dGVvcmRlcl0gPSAoYzAgfCAweDgwKTsgLyogVHdvIGJ5dGVzIG91dCAqLworCWpjb2RlLnhfY2hhclsxLWJ5dGVvcmRlcl0gPSAoYzEgfCAweDgwKTsKKworICAgIH0gZWxzZSBpZiAoYzAgPT0gMCkgewkJLyogU2luZ2xlIGJ5dGUgKi8KKwlpZiAoYzEgPj0gMHhhMSAmJiBjMSA8PSAweGRmKSB7CS8qIEthdGFrYW5hICovCisJICAgIGpjb2RlLnhfY2hhcltieXRlb3JkZXJdID0gMHg4ZTsgLyogU1MyICovCisJICAgIGpjb2RlLnhfY2hhclsxLWJ5dGVvcmRlcl0gPSBjMTsgLyogS2FuYSBjb2RlICovCisJfSBlbHNlIHsJCQkvKiBBU0NJSSBvciBDMCAqLworCSAgICBqY29kZS54X3Nob3J0ID0gYzE7CisJfQorICAgIH0gZWxzZSB7CQkJCS8qIFNvbWV0aGluZyBiYWQgKi8KKwlkZWJ1ZyhGMDAxLCJzal90b19ldSBiYWQgc2oiLCIiLHNqKTsKKwlqY29kZS54X3Nob3J0ID0gMHhmZmZmOworICAgIH0KKyAgICByZXR1cm4oamNvZGUueF9zaG9ydCk7Cit9CisKK2ludAoremthbmpmKCkgewkJCQkvKiBJbml0aWFsaXplICovCisgICAganBuc3R6ID0ganBucG5kID0ganBucG50ID0gMDsKKyAgICByZXR1cm4oMCk7Cit9CisKK2ludAoremthbmp6KCkgeworICAgIHJldHVybigwKTsKK30KKworaW50CisjaWZkZWYgQ0tfQU5TSUMKK3prYW5qaShpbnQgKCpmbikodm9pZCkpCisjZWxzZQoremthbmppKGZuKSBpbnQgKCpmbikoKTsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB6a2FuamkgKi8KKyAgICAvKiBSZWFkIEphcGFuZXNlIGxvY2FsIGNvZGUgYW5kIHRyYW5zbGF0ZSB0byBKYXBhbmVzZSBFVUMgKi8KKyAgICBpbnQgYTsKKyAgICBpbnQgc2NbM107CisKKyAgICAvKiBObyBwZW5kaW5nIGNoYXJhY3RlcnMgKi8KKyAgICBpZiAoZmNoYXJzZXQgPT0gRkNfU0hKSVMpIHsJCS8qIFRyYW5zbGF0aW5nIGZyb20gU2hpZnQtSklTICovCisgICAgICAgIGlmIChqcG5wbmQpIHsKKyAgICAgICAgICAgIGpwbnBuZC0tOworICAgICAgICAgICAgcmV0dXJuKGpwbnBiZltqcG5wbnQrK10pOworICAgICAgICB9CisgICAgICAgIGEgPSAoKmZuKSgpOworCWpwbnBuZCA9IGpwbnBudCA9IDA7CisJaWYgKCgoYSA+PSAweDgxKSAmJiAoYSA8PSAweDlmKSkgfHwKKwkgICAgKChhID49IDB4ZTApICYmIChhIDw9IDB4ZmMpKSkgeyAvKiAyLWJ5dGUgS2FuamkgY29kZSAqLworCSAgICBzY1swXSA9IGE7CisJICAgIGlmICgoc2NbMV0gPSAoKmZuKSgpKSA8IDApCS8qIEdldCBzZWNvbmQgYnl0ZSAqLworCSAgICAgIHJldHVybihzY1sxXSk7CisJICAgIGlmIChzY1swXSA8PSAweDlmKQorCSAgICAgIHNjWzBdIC09IDB4NzE7CisJICAgIGVsc2UKKwkgICAgICBzY1swXSAtPSAweGIxOworCSAgICBzY1swXSA9IHNjWzBdICogMiArIDE7CisJICAgIGlmIChzY1sxXSA+IDB4N2YpCisJICAgICAgc2NbMV0tLTsKKwkgICAgaWYgKHNjWzFdID49IDB4OWUpIHsKKwkgICAgICAgIHNjWzFdIC09IDB4N2Q7CisJICAgICAgICBzY1swXSsrOworCSAgICB9IGVsc2UgeworCSAgICAgICAgc2NbMV0gLT0gMHgxZjsKKwkgICAgfQorCSAgICBhID0gKHNjWzBdIHwgMHg4MCk7CisJICAgIGpwbnBiZlswXSA9IChzY1sxXSB8IDB4ODApOworCSAgICBqcG5wbmQgPSAxOworCSAgICBqcG5wbnQgPSAwOworCX0gZWxzZSBpZiAoKGEgPj0gMHhhMSkgJiYgKGEgPD0gMHhkZikpIHsgLyogS2F0YWthbmEgKi8KKwkgICAganBucGJmWzBdID0gYTsKKwkgICAganBucG5kID0gMTsKKwkgICAganBucG50ID0gMDsKKwkgICAgYSA9IDB4OGU7CisJfQorCXJldHVybihhKTsKKyAgICB9IGVsc2UgaWYgKGZjaGFyc2V0ID09IEZDX0pJUzcgKSB7CS8qIDctYml0IEpJUyBYIDAyMDggKi8KKyAgICAgICAgaWYgKGpwbnBuZCkgeworICAgICAgICAgICAgYSA9IGpwbnBiZltqcG5wbnQrK107CisJICAgIGpwbnBuZC0tOworICAgICAgICAgICAgcmV0dXJuKGEpOworICAgICAgICB9CisgICAgICAgIGpwbnBudCA9IDA7CisgICAgICAgIGlmICgoYSA9ICgqZm4pKCkpIDwgMCkKKwkgIHJldHVybihhKTsKKyAgICAgICAgd2hpbGUgKGpwbnBuZCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKGEgPiAweDIwKSAmJiAoYSA8IDB4N2YpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChqcG5zdHopIHsKKwkJICBjYXNlIDE6CisJCSAgICBqcG5wYmZbanBucG5kKytdID0gMHg4MDsgLyogS2F0YWthbmEgKi8KKwkJICAgIGpwbnBiZltqcG5wbmQrK10gPSAoYSB8IDB4ODApOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSAyOgorCQkgICAganBucGJmW2pwbnBuZCsrXSA9IChhIHwgMHg4MCk7IC8qIEthbmppICovCisJCSAgICBpZiAoKGEgPSAoKmZuKSgpKSA8IDApCisJCSAgICAgIHJldHVybihhKTsKKwkJICAgIGpwbnBiZltqcG5wbmQrK10gPSAoYSB8IDB4ODApOworCQkgICAgYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJICAgIGpwbnBiZltqcG5wbmQrK10gPSBhOyAvKiBTaW5nbGUgYnl0ZSAqLworCQkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDB4MGUpIHsKKyAgICAgICAgICAgICAgICBqcG5zdHogPSAxOworICAgICAgICAgICAgICAgIGlmICgoYSA9ICgqZm4pKCkpIDwgMCkKKwkJICByZXR1cm4oYSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMHgwZikgeworICAgICAgICAgICAgICAgIGpwbnN0eiA9IDA7CisgICAgICAgICAgICAgICAgaWYgKChhID0gKCpmbikoKSkgPCAwKQorCQkgIHJldHVybihhKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAweDFiKSB7CisgICAgICAgICAgICAgICAganBucGJmW2pwbnBuZCsrXSA9IGE7CS8qIEVzY2FwZSAqLworICAgICAgICAgICAgICAgIGlmICgoYSA9ICgqZm4pKCkpIDwgMCkKKwkJICByZXR1cm4oYSk7CisgICAgICAgICAgICAgICAganBucGJmW2pwbnBuZCsrXSA9IGE7CisgICAgICAgICAgICAgICAgaWYgKGEgPT0gJyQnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYSA9ICgqZm4pKCkpIDwgMCkKKwkJICAgICAgcmV0dXJuKGEpOworICAgICAgICAgICAgICAgICAgICBqcG5wYmZbanBucG5kKytdID0gYTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChhID09ICdAJykgfHwgKGEgPT0gJ0InKSkgeworICAgICAgICAgICAgICAgICAgICAgICAganBuc3R6ID0gMjsKKwkJCWpwbnBudCA9IGpwbnBuZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEgPSAoKmZuKSgpKSA8IDApCisJCQkgIHJldHVybihhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAnKCcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChhID0gKCpmbikoKSkgPCAwKQorCQkgICAgICByZXR1cm4oYSk7CisgICAgICAgICAgICAgICAgICAgIGpwbnBiZltqcG5wbmQrK10gPSBhOworICAgICAgICAgICAgICAgICAgICBpZiAoKGEgPT0gJ0InKSB8fCAoYSA9PSAnSicpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBqcG5zdHogPSAwOworCQkJanBucG50ID0ganBucG5kID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYSA9ICgqZm4pKCkpIDwgMCkKKwkJCSAgcmV0dXJuKGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDB4MWIpIHsKKyAgICAgICAgICAgICAgICAgICAganBucG50ID0ganBucG5kID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChhID0gKCpmbikoKSkgPCAwKQorCQkgICAgICByZXR1cm4oYSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBqcG5wYmZbanBucG5kKytdID0gYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBqcG5wbnQgPSAwOworICAgICAgICBhID0ganBucGJmW2pwbnBudCsrXTsKKwlqcG5wbmQtLTsKKyAgICAgICAgcmV0dXJuKGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGEgPSAoKmZuKSgpOworICAgICAgICByZXR1cm4oYSk7CisgICAgfQorfQorI2VuZGlmIC8qIEtBTkpJICovCisKKy8qIEV1cm8gZnVuY3Rpb25zICovCisKKyNpZmRlZiBMQVRJTjIKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGwybDkoQ0hBUiBjKQorI2Vsc2UKK3hsMmw5KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bDJsOSAqLyAJCQkJLyogTGF0aW4tMiB0byBMYXRpbi05Li4uICovCisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDE2OTogcmV0dXJuKChDSEFSKTE2Nik7CS8qIFMgY2Fyb24gKi8KKyAgICAgIGNhc2UgMTg1OiByZXR1cm4oKENIQVIpMTY4KTsJLyogcyBjYXJvbiAqLworICAgICAgY2FzZSAxNzQ6IHJldHVybigoQ0hBUikxODApOwkvKiBaIGNhcm9uICovCisgICAgICBjYXNlIDE5MDogcmV0dXJuKChDSEFSKTE4NCk7CS8qIHogY2Fyb24gKi8KKyAgICAgIGRlZmF1bHQ6CisJcmV0dXJuKHlsMmwxW2NdKTsKKyAgICB9CisKK30KKworX1BST1RPVFlQKCBDSEFSIHhsMjU4LCAoIENIQVIgKSApOworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDI1OChDSEFSIGMpCisjZWxzZQoreGwyNTgoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsMjU4ICovIAkJCQkvKiBMYXRpbi0yIHRvIENQODU4Li4uICovCisgICAgcmV0dXJuKGMpOworfQorI2Vsc2UKKyNkZWZpbmUgeGwybDkgTlVMTAorI2RlZmluZSB4bDI1OCBOVUxMCisjZW5kaWYgLyogTEFUSU4yICovCisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworemw5YXMoQ0hBUiBjKQorI2Vsc2UKK3psOWFzKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB6bDlhcyAqLyAJCQkJLyogTGF0aW4tOSB0byBVUyBBU0NJSS4uLiAqLworICAgIGlmIChjIDwgKENIQVIpMHg4MCkgcmV0dXJuKGMpOwkvKiBTYXZlIGEgZnVuY3Rpb24gY2FsbCAqLworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweGE0OiByZXR1cm4oVU5LKTsJCS8qIEV1cm8gKi8KKyAgICAgIGNhc2UgMHhhNjogcmV0dXJuKCdTJyk7CQkvKiBTIENhcm9uICovCisgICAgICBjYXNlIDB4YTg6IHJldHVybigncycpOwkJLyogcyBDYXJvbiAqLworICAgICAgY2FzZSAweGI0OiByZXR1cm4oJ1onKTsJCS8qIFogQ2Fyb24gKi8KKyAgICAgIGNhc2UgMHhiYzogcmV0dXJuKCdPJyk7CQkvKiBPRSBkaWdyYXBoICovCisgICAgICBjYXNlIDB4YmQ6IHJldHVybignbycpOwkJLyogb2UgZGlncmFwaCAqLworICAgICAgY2FzZSAweGJlOiByZXR1cm4oJ1knKTsJCS8qIFkgZGlhZXJlc2lzICovCisgICAgICBkZWZhdWx0OiAgIHJldHVybih6bDFhcyhjKSk7CS8qIFRoZSByZXN0IGlzIGxpa2UgTGF0aW4tMSAqLworICAgIH0KK30KKworX1BST1RPVFlQKCBDSEFSIHhsOWFzLCAoIENIQVIgKSApOworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4bDlhcyhDSEFSIGMpCisjZWxzZQoreGw5YXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHhsOWFzICovIAkJCQkvKiBMYXRpbi05IHRvIFVTIEFTQ0lJLi4uICovCisgICAgaWYgKGMgPCAoQ0hBUikweDgwKSByZXR1cm4oYyk7CS8qIFNhdmUgYSBmdW5jdGlvbiBjYWxsICovCisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDB4YTQ6IHJldHVybihVTkspOwkJLyogRXVybyAqLworICAgICAgY2FzZSAweGE2OiByZXR1cm4oJ1MnKTsJCS8qIFMgQ2Fyb24gKi8KKyAgICAgIGNhc2UgMHhhODogcmV0dXJuKCdzJyk7CQkvKiBzIENhcm9uICovCisgICAgICBjYXNlIDB4YjQ6IHJldHVybignWicpOwkJLyogWiBDYXJvbiAqLworICAgICAgY2FzZSAweGI4OiByZXR1cm4oJ3onKTsJCS8qIHogQ2Fyb24gKi8KKyAgICAgIGNhc2UgMHhiYzogcmV0dXJuKCdPJyk7CQkvKiBPRSBkaWdyYXBoICovCisgICAgICBjYXNlIDB4YmQ6IHJldHVybignbycpOwkJLyogb2UgZGlncmFwaCAqLworICAgICAgY2FzZSAweGJlOiByZXR1cm4oJ1knKTsJCS8qIFkgZGlhZXJlc2lzICovCisgICAgICBkZWZhdWx0OiAgIHJldHVybih4bDFhcyhjKSk7CS8qIFRoZSByZXN0IGlzIGxpa2UgTGF0aW4tMSAqLworICAgIH0KK30KKworQ0hBUgkJCQkJLyogQ1AxMjUyIHRvIExhdGluLTkgKi8KKyNpZmRlZiBDS19BTlNJQworeHcxbDkoQ0hBUiBjKQorI2Vsc2UKK3h3MWw5KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4dzFsOSAqLworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweDgwOiByZXR1cm4oMHhhNCk7CQkvKiBFdXJvIHNpZ24gKi8KKyAgICAgIGNhc2UgMHg4YTogcmV0dXJuKDB4YTYpOwkJLyogUyBjYXJvbiAqLworICAgICAgY2FzZSAweDhjOiByZXR1cm4oMHhiYyk7CQkvKiBPRSAqLworICAgICAgY2FzZSAweDhlOiByZXR1cm4oMHhiNCk7CQkvKiBaIGNhcm9uICovCisgICAgICBjYXNlIDB4OWE6IHJldHVybigweGE4KTsJCS8qIHMgY2Fyb24gKi8KKyAgICAgIGNhc2UgMHg5YzogcmV0dXJuKDB4YmQpOwkJLyogb2UgKi8KKyAgICAgIGNhc2UgMHg5ZTogcmV0dXJuKDB4YjgpOwkJLyogeiBjYXJvbiAqLworICAgICAgY2FzZSAweDlmOiByZXR1cm4oMHhiZSk7CQkvKiBZIGRpYWVyZXNpcyAqLworICAgICAgY2FzZSAweGE0OgkJCS8qIEN1cnJlbmN5IHNpZ24gKi8KKyAgICAgIGNhc2UgMHhhNjoJCQkvKiBCcm9rZW4gdmVydGljYWwgYmFyICovCisgICAgICBjYXNlIDB4YTg6CQkJLyogRGlhZXJlc2lzICovCisgICAgICBjYXNlIDB4YjQ6CQkJLyogQWN1dGUgYWNjZW50ICovCisgICAgICBjYXNlIDB4Yjg6CQkJLyogQ2VkaWxsYSAqLworICAgICAgY2FzZSAweGJjOgkJCS8qIDEvNCAqLworICAgICAgY2FzZSAweGJkOgkJCS8qIDEvMiAqLworICAgICAgY2FzZSAweGJlOiByZXR1cm4oJz8nKTsJCS8qIDMvNCAqLworICAgICAgZGVmYXVsdDogcmV0dXJuKChjIDwgMTYwKSA/IHh3MWFzKGMpIDogYyk7CisgICAgfQorfQorCisjaWZkZWYgTEFUSU4yCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3hsOWwyKENIQVIgYykKKyNlbHNlCit4bDlsMihjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeGw5bDIgKi8gCQkJCS8qIExhdGluLTkgdG8gTGF0aW4tMi4uLiAqLworICAgIGlmIChjIDwgKENIQVIpMHg4MCkgcmV0dXJuKGMpOwkvKiBTYXZlIGEgZnVuY3Rpb24gY2FsbCAqLworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAweGE0OiByZXR1cm4oVU5LKTsJCS8qIEV1cm8gKi8KKyAgICAgIGNhc2UgMHhhNjogcmV0dXJuKChDSEFSKTB4YTkpOwkvKiBTIENhcm9uICovCisgICAgICBjYXNlIDB4YTg6IHJldHVybigoQ0hBUikweGI5KTsJLyogcyBDYXJvbiAqLworICAgICAgY2FzZSAweGI0OiByZXR1cm4oKENIQVIpMHhhZSk7CS8qIFogQ2Fyb24gKi8KKyAgICAgIGNhc2UgMHhiODogcmV0dXJuKChDSEFSKTB4YWYpOwkvKiB6IENhcm9uICovCisgICAgICBjYXNlIDB4YmM6IHJldHVybignTycpOwkJLyogT0UgZGlncmFwaCAqLworICAgICAgY2FzZSAweGJkOiByZXR1cm4oJ28nKTsJCS8qIG9lIGRpZ3JhcGggKi8KKyAgICAgIGNhc2UgMHhiZTogcmV0dXJuKCdZJyk7CQkvKiBZIGRpYWVyZXNpcyAqLworICAgICAgZGVmYXVsdDogICByZXR1cm4oeGwxbDIoYykpOwkvKiBUaGUgcmVzdCBpcyBsaWtlIExhdGluLTEgKi8KKyAgICB9Cit9CisjZWxzZQorI2RlZmluZSB4bDlsMiBOVUxMCisjZW5kaWYgLyogTEFUSU4yICovCisKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeGw5NTgoQ0hBUiBjKQorI2Vsc2UKK3hsOTU4KGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4bDk1OCAqLyAJCQkJLyogTGF0aW4tOSB0byBDUDg1OC4uLiAqLworICAgIGlmIChjID09IDB4YTQpCQkJLyogRXVybyBTeW1ib2wgKi8KKyAgICAgIHJldHVybigoQ0hBUikweGQ1KTsKKyAgICBlbHNlIGlmIChjID09IDB4OWUpCQkJLyogVGhpcyB3YXMgY3VycmVuY3kgc3ltYm9sICovCisgICAgICByZXR1cm4oKENIQVIpMHhjZik7CisgICAgYyA9IHlsMTg1W2NdOworICAgIHJldHVybihjKTsKK30KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4NThhcyhDSEFSIGMpCisjZWxzZQoreDU4YXMoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHg1OGFzICovIAkJCQkvKiBDUDg1OCB0byBVUyBBU0NJSS4uLiAqLworICAgIGlmIChjID09IDB4ZDUpCQkJLyogRXVybyByYXRoZXIgdGhhbiBkb3RsZXNzIGkgKi8KKyAgICAgIHJldHVybihVTkspOworICAgIGVsc2UKKyAgICAgIHJldHVybih4ODVhcyhjKSk7CQkJLyogVGhlIHJlc3QgaXMgbGlrZSBDUDg1MCAqLworfQorCitDSEFSCisjaWZkZWYgQ0tfQU5TSUMKK3g1OGwxKENIQVIgYykKKyNlbHNlCit4NThsMShjKSBDSEFSIGM7CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sgLyogeDU4bDEgKi8gCQkJCS8qIENQODU4IHRvIExhdGluLTEuLi4gKi8KKyAgICBpZiAoYyA9PSAweGQ1KQkJCS8qIEV1cm8gcmF0aGVyIHRoYW4gZG90bGVzcyBpICovCisgICAgICByZXR1cm4oKENIQVIpMHhhNCk7CQkvKiBSZXR1cm4gY3VycmVuY3kgc3ltYm9sICovCisgICAgZWxzZSBpZiAoYyA9PSAweGNmKQkJCS8qIFRoaXMga2VlcHMgaXQgaW52ZXJ0aWJsZSAqLworICAgICAgcmV0dXJuKChDSEFSKTB4OWUpOworICAgIGVsc2UKKyAgICAgIHJldHVybih4ODVsMShjKSk7Cit9CisKKyNpZmRlZiBMQVRJTjIKK0NIQVIKKyNpZmRlZiBDS19BTlNJQworeDU4bDIoQ0hBUiBjKQorI2Vsc2UKK3g1OGwyKGMpIENIQVIgYzsKKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeyAvKiB4NThsMiAqLyAJCQkJLyogQ1A4NTggdG8gTGF0aW4tMi4uLiAqLworICAgIGlmIChjID09IDB4ZDUpCQkJLyogRXVybyByYXRoZXIgdGhhbiBkb3RsZXNzIGkgKi8KKyAgICAgIHJldHVybigoQ0hBUikweGE0KTsJCS8qIFJldHVybiBjdXJyZW5jeSBzeW1ib2wgKi8KKyAgICBlbHNlIGlmIChjID09IDB4Y2YpCQkJLyogVGhpcyBrZWVwcyBpdCBpbnZlcnRpYmxlICovCisgICAgICByZXR1cm4oKENIQVIpMHg5ZSk7CQkvKiAoaWYgaXQgZXZlciB3YXMuLi4pICovCisgICAgZWxzZQkJCQkvKiBPdGhlcndpc2UgbGlrZSBDUDg1MCAqLworICAgICAgcmV0dXJuKHg4NWwyKGMpKTsKK30KKyNlbHNlCisjZGVmaW5lIHg1OGwyIE5VTEwKKyNlbmRpZiAvKiBMQVRJTjIgKi8KKworQ0hBUgorI2lmZGVmIENLX0FOU0lDCit4NThsOShDSEFSIGMpCisjZWxzZQoreDU4bDkoYykgQ0hBUiBjOworI2VuZGlmIC8qIENLX0FOU0lDICovCit7IC8qIHg1OGw5ICovIAkJCQkvKiBDUC04NTggdG8gTGF0aW4tOS4uLiAqLworICAgIGlmIChjID09IDB4ZDUpCQkJLyogRXVybyByYXRoZXIgdGhhbiBkb3RsZXNzIGkgKi8KKyAgICAgIHJldHVybigoQ0hBUikweGE0KTsJCS8qIFJldHVybiBjdXJyZW5jeSBzeW1ib2wgKi8KKyAgICBlbHNlIGlmIChjID09IDB4Y2YpCQkJLyogVGhpcyBrZWVwcyBpdCBpbnZlcnRpYmxlICovCisgICAgICByZXR1cm4oKENIQVIpMHg5ZSk7CQkvKiAoaWYgaXQgZXZlciB3YXMuLi4pICovCisgICAgZWxzZQkJCQkvKiBPdGhlcndpc2UgbGlrZSBDUDg1MCAqLworICAgICAgcmV0dXJuKHg4NWwxKGMpKTsJCQkvKiB0byBMYXRpbi0xICovCit9CisKKy8qIEVuZCBFdXJvIGZ1bmN0aW9ucyAqLworCisKKy8qICBUQUJMRVMgT0YgVFJBTlNMQVRJT04gRlVOQ1RJT05TICovCisKKy8qCisgIEZpcnN0LCB0aGUgdGFibGUgb2YgdHJhbnNsYXRpb24gZnVuY3Rpb25zIGZvciBSRUNFSVZJTkcgZmlsZXMuICBUaGF0IGlzLAorICAqZnJvbSogdGhlIFRSQU5TRkVSIGNoYXJhY3RlciBzZXQgKnRvKiB0aGUgRklMRSBjaGFyYWN0ZXIgc2V0LCBhbiBhcnJheSBvZgorICBwb2ludGVycyB0byBmdW5jdGlvbnMuICBUaGUgZmlyc3QgaW5kZXggaXMgdGhlIFRSQU5TRkVSIENIQVJBQ1RFUi1TRVQKKyAgbnVtYmVyLCB0aGUgc2Vjb25kIGluZGV4IGlzIHRoZSBGSUxFIENIQVJBQ1RFUi1TRVQgbnVtYmVyLgorCisgIFRoZXNlIGFycmF5cyBtdXN0IGJlIGZ1bGx5IHBvcHVsYXRlZCwgZXZlbiBpZiAoYXMgaXMgdGhlIGNhc2Ugd2l0aCBLYW5qaQorICBjaGFyYWN0ZXIgc2V0cyksIGFsbCB0aGUgZW50cmllcyBhcmUgTlVMTC4gIE90aGVyd2lzZSwgc3Vic2NyaXB0CisgIGNhbGN1bGF0aW9ucyB3aWxsIGJlIHdyb25nIGFuZCB3ZSdsbCB1c2UgdGhlIHdyb25nIGZ1bmN0aW9ucy4KKyovCisKKy8qIFBvaW50ZXJzIHRvIGJ5dGUtZm9yLWJ5dGUgdHJhbnNsYXRpb24gZnVuY3Rpb25zICovCisKK19QUk9UT1RZUCggQ0hBUiAoKnJ4KSwgKENIQVIpICk7CitfUFJPVE9UWVAoIENIQVIgKCpzeCksIChDSEFSKSApOworCisjaWZkZWYgVU5JQ09ERQorX1BST1RPVFlQKCBpbnQgKCp4dXQpLCAoVVNIT1JUKSApOwkvKiBUcmFuc2xhdGlvbiBmdW5jdGlvbiBVQ1MgdG8gVENTICovCitfUFJPVE9UWVAoIGludCAoKnh1ZiksIChVU0hPUlQpICk7CS8qIFRyYW5zbGF0aW9uIGZ1bmN0aW9uIFVDUyB0byBGQ1MgKi8KK19QUk9UT1RZUCggVVNIT1JUICgqeHR1KSwgKENIQVIpICk7CS8qIFRyYW5zbGF0aW9uIGZ1bmN0aW9uIFRDUyB0byBVQ1MgKi8KK19QUk9UT1RZUCggVVNIT1JUICgqeGZ1KSwgKENIQVIpICk7CS8qIFRyYW5zbGF0aW9uIGZ1bmN0aW9uIEZDUyB0byBVQ1MgKi8KKyNlbmRpZiAvKiBVTklDT0RFICovCisKKyNpZmRlZiBDS19BTlNJQworQ0hBUiAoKnhscltNQVhUQ1NFVFMrMV1bTUFYRkNTRVRTKzFdKShDSEFSKSA9CisjZWxzZQorQ0hBUiAoKnhscltNQVhUQ1NFVFMrMV1bTUFYRkNTRVRTKzFdKSgpID0KKyNlbmRpZiAvKiBDS19BTlNJQyAqLworeworICAgIE5VTEwsCQkJLyogMCwwIHRyYW5zcGFyZW50IHRvIHVzIGFzY2lpICovCisgICAgTlVMTCwJCQkvKiAwLDEgdHJhbnNwYXJlbnQgdG8gdWsgYXNjaWkgKi8KKyAgICBOVUxMLAkJCS8qIDAsMiB0cmFuc3BhcmVudCB0byBkdXRjaCBucmMgKi8KKyAgICBOVUxMLAkJCS8qIDAsMyB0cmFuc3BhcmVudCB0byBmaW5uaXNoIG5yYyAqLworICAgIE5VTEwsCQkJLyogMCw0IHRyYW5zcGFyZW50IHRvIGZyZW5jaCBucmMgKi8KKyAgICBOVUxMLAkJCS8qIDAsNSB0cmFuc3BhcmVudCB0byBmci1jYW5hZGlhbiBucmMgKi8KKyAgICBOVUxMLAkJCS8qIDAsNiB0cmFuc3BhcmVudCB0byBnZXJtYW4gbnJjICovCisgICAgTlVMTCwJCQkvKiAwLDcgdHJhbnNwYXJlbnQgdG8gaHVuZ2FyaWFuIG5yYyAqLworICAgIE5VTEwsCQkJLyogMCw4IHRyYW5zcGFyZW50IHRvIGl0YWxpYW4gbnJjICovCisgICAgTlVMTCwJCQkvKiAwLDkgdHJhbnNwYXJlbnQgdG8gbm9yZ2UvZGFuaXNoIG5yYyAqLworICAgIE5VTEwsCQkJLyogMCwxMCB0cmFuc3BhcmVudCB0byBwb3J0dWd1ZXNlIG5yYyAqLworICAgIE5VTEwsCQkJLyogMCwxMSB0cmFuc3BhcmVudCB0byBzcGFuaXNoIG5yYyAqLworICAgIE5VTEwsCQkJLyogMCwxMiB0cmFuc3BhcmVudCB0byBzd2VkaXNoIG5yYyAqLworICAgIE5VTEwsCQkJLyogMCwxMyB0cmFuc3BhcmVudCB0byBzd2lzcyBucmMgKi8KKyAgICBOVUxMLAkJCS8qIDAsMTQgdHJhbnNwYXJlbnQgdG8gbGF0aW4tMSAqLworICAgIE5VTEwsCQkJLyogMCwxNSB0cmFuc3BhcmVudCB0byBsYXRpbi0yICovCisgICAgTlVMTCwJCQkvKiAwLDE2IHRyYW5zcGFyZW50IHRvIERFQyBNQ1MgKi8KKyAgICBOVUxMLAkJCS8qIDAsMTcgdHJhbnNwYXJlbnQgdG8gTmVYVCAqLworICAgIE5VTEwsCQkJLyogMCwxOCB0cmFuc3BhcmVudCB0byBDUDQzNyAqLworICAgIE5VTEwsCQkJLyogMCwxOSB0cmFuc3BhcmVudCB0byBDUDg1MCAqLworICAgIE5VTEwsCQkJLyogMCwyMCB0cmFuc3BhcmVudCB0byBDUDg1MiAqLworICAgIE5VTEwsCQkJLyogMCwyMSB0cmFuc3BhcmVudCB0byBNYWNpbnRvc2ggTGF0aW4gKi8KKyAgICBOVUxMLAkJCS8qIDAsMjIgdHJhbnNwYXJlbnQgdG8gREdJICovCisgICAgTlVMTCwJCQkvKiAwLDIzIHRyYW5zcGFyZW50IHRvIEhQICovCisgICAgTlVMTCwJCQkvKiAwLDI0IHRyYW5zcGFyZW50IHRvIExhdGluL0N5cmlsbGljICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIDAsMjUgdHJhbnNwYXJlbnQgdG8gQ1A4NjYgKi8KKyAgICBOVUxMLAkJCS8qIDAsMjYgdHJhbnNwYXJlbnQgdG8gU2hvcnQgS09JLTcgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogMCwyNyB0cmFuc3BhcmVudCB0byBPbGQgS09JLTggQ3lyaWxsaWMgKi8KKyAgICBOVUxMLAkJCS8qIDAsMjggdHJhbnNwYXJlbnQgdG8gSklTLTcgKi8KKyAgICBOVUxMLAkJCS8qIDAsMjkgdHJhbnNwYXJlbnQgdG8gU2hpZnQtSklTICovCisgICAgTlVMTCwJCQkvKiAwLDMwIHRyYW5zcGFyZW50IHRvIEotRVVDICovCisgICAgTlVMTCwJCQkvKiAwLDMxIHRyYW5zcGFyZW50IHRvIERFQyBLYW5qaSAqLworICAgIE5VTEwsCQkJLyogMCwzMiB0cmFuc3BhcmVudCB0byBIZWJyZXctNyAqLworICAgIE5VTEwsCQkJLyogMCwzMyB0cmFuc3BhcmVudCB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICBOVUxMLAkJCS8qIDAsMzQgdHJhbnNwYXJlbnQgdG8gQ1A4NjIgSGVicmV3ICovCisgICAgTlVMTCwJCQkvKiAwLDM1IHRyYW5zcGFyZW50IHRvIEVMT1QgOTI3IEdyZWVrICovCisgICAgTlVMTCwJCQkvKiAwLDM2IHRyYW5zcGFyZW50IHRvIExhdGluL0dyZWVrICovCisgICAgTlVMTCwJCQkvKiAwLDM3IHRyYW5zcGFyZW50IHRvIENQODY5ICovCisgICAgTlVMTCwJCQkvKiAwLDM4IHRyYW5zcGFyZW50IHRvIExhdGluLTkgKi8KKyAgICBOVUxMLAkJCS8qIDAsMzkgdHJhbnNwYXJlbnQgdG8gQ1A4NTggKi8KKyAgICBOVUxMLAkJCS8qIDAsNDAgdHJhbnNwYXJlbnQgdG8gQ1A4NTUgKi8KKyAgICBOVUxMLAkJCS8qIDAsNDEgdHJhbnNwYXJlbnQgdG8gQ1AxMjUxICovCisgICAgTlVMTCwJCQkvKiAwLDQyIHRyYW5zcGFyZW50IHRvIEJ1bGdhcmlhbiAqLworICAgIE5VTEwsCQkJLyogMCw0MyB0cmFuc3BhcmVudCB0byBDUDEyNTAgKi8KKyAgICBOVUxMLAkJCS8qIDAsNDQgdHJhbnNwYXJlbnQgdG8gTWF6b3ZpYSAqLworICAgIE5VTEwsCQkJLyogMCw0NSB0cmFuc3BhcmVudCB0byBVQ1MtMiAqLworICAgIE5VTEwsCQkJLyogMCw0NiB0cmFuc3BhcmVudCB0byBVVEYtOCAqLworICAgIE5VTEwsCQkJLyogMCw0NyB0cmFuc3BhcmVudCB0byBLT0k4UiAqLworICAgIE5VTEwsCQkJLyogMCw0OCB0cmFuc3BhcmVudCB0byBLT0k4VSAqLworICAgIE5VTEwsCQkJLyogMCw0OSB0cmFuc3BhcmVudCB0byBDUDEyNTIgKi8KKyAgICBOVUxMLAkJCS8qIDEsMCBhc2NpaSB0byB1cyBhc2NpaSAqLworICAgIE5VTEwsCQkJLyogMSwxIGFzY2lpIHRvIHVrIGFzY2lpICovCisgICAgTlVMTCwJCQkvKiAxLDIgYXNjaWkgdG8gZHV0Y2ggbnJjICovCisgICAgTlVMTCwJCQkvKiAxLDMgYXNjaWkgdG8gZmlubmlzaCBucmMgKi8KKyAgICBOVUxMLAkJCS8qIDEsNCBhc2NpaSB0byBmcmVuY2ggbnJjICovCisgICAgTlVMTCwJCQkvKiAxLDUgYXNjaWkgdG8gZnItY2FuYWRpYW4gbnJjICovCisgICAgTlVMTCwJCQkvKiAxLDYgYXNjaWkgdG8gZ2VybWFuIG5yYyAqLworICAgIE5VTEwsCQkJLyogMSw3IGFzY2lpIHRvIGh1bmdhcmlhbiBucmMgKi8KKyAgICBOVUxMLAkJCS8qIDEsOCBhc2NpaSB0byBpdGFsaWFuIG5yYyAqLworICAgIE5VTEwsCQkJLyogMSw5IGFzY2lpIHRvIG5vcmdlL2RhbmlzaCBucmMgKi8KKyAgICBOVUxMLAkJCS8qIDEsMTAgYXNjaWkgdG8gcG9ydHVndWVzZSBucmMgKi8KKyAgICBOVUxMLAkJCS8qIDEsMTEgYXNjaWkgdG8gc3BhbmlzaCBucmMgKi8KKyAgICBOVUxMLAkJCS8qIDEsMTIgYXNjaWkgdG8gc3dlZGlzaCBucmMgKi8KKyAgICBOVUxMLAkJCS8qIDEsMTMgYXNjaWkgdG8gc3dpc3MgbnJjICovCisgICAgTlVMTCwJCQkvKiAxLDE0IGFzY2lpIHRvIGxhdGluLTEgKi8KKyAgICBOVUxMLAkJCS8qIDEsMTUgYXNjaWkgdG8gbGF0aW4tMiAqLworICAgIE5VTEwsCQkJLyogMSwxNiBhc2NpaSB0byBERUMgTUNTICovCisgICAgTlVMTCwJCQkvKiAxLDE3IGFzY2lpIHRvIE5lWFQgKi8KKyAgICBOVUxMLAkJCS8qIDEsMTggYXNjaWkgdG8gQ1A0MzcgKi8KKyAgICBOVUxMLAkJCS8qIDEsMTkgYXNjaWkgdG8gQ1A4NTAgKi8KKyAgICBOVUxMLAkJCS8qIDEsMjAgYXNjaWkgdG8gQ1A4NTIgKi8KKyAgICBOVUxMLAkJCS8qIDEsMjEgYXNjaWkgdG8gTWFjaW50b3NoIExhdGluICovCisgICAgTlVMTCwJCQkvKiAxLDIyIGFzY2lpIHRvIERHSSAqLworICAgIE5VTEwsCQkJLyogMSwyMyBhc2NpaSB0byBIUCAqLworICAgIHhhc2xjLCAgICAgICAgICAgICAgICAgICAgICAvKiAxLDI0IGFzY2lpIHRvIExhdGluL0N5cmlsbGljICovCisgICAgeGFzYWMsICAgICAgICAgICAgICAgICAgICAgIC8qIDEsMjUgYXNjaWkgdG8gQ1A4NjYgKi8KKyAgICB4YXNzaywgICAgICAgICAgICAgICAgICAgICAgLyogMSwyNiBhc2NpaSB0byBTaG9ydCBLT0kgKi8KKyAgICB4YXNrOCwgICAgICAgICAgICAgICAgICAgICAgLyogMSwyNyBhc2NpaSB0byBPbGQgS09JLTggQ3lyaWxsaWMgKi8KKyAgICBOVUxMLAkJCS8qIDEsMjggYXNjaWkgdG8gSklTLTcgKi8KKyAgICBOVUxMLAkJCS8qIDEsMjkgYXNjaWkgdG8gU2hpZnQtSklTICovCisgICAgTlVMTCwJCQkvKiAxLDMwIGFzY2lpIHRvIEotRVVDICovCisgICAgTlVMTCwJCQkvKiAxLDMxIGFzY2lpIHRvIERFQyBLYW5qaSAqLworICAgIHhhc2g3LAkJCS8qIDEsMzIgYXNjaWkgdG8gSGVicmV3LTcgKi8KKyAgICBOVUxMLAkJCS8qIDEsMzMgYXNjaWkgdG8gTGF0aW4vSGVicmV3ICovCisgICAgTlVMTCwJCQkvKiAxLDM0IGFzY2lpIHRvIENQODYyIEhlYnJldyAqLworICAgIHhhc2VnLAkJCS8qIDEsMzUgYXNjaWkgdG8gRUxPVCA5MjcgR3JlZWsgKi8KKyAgICBOVUxMLAkJCS8qIDEsMzYgYXNjaWkgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICBOVUxMLAkJCS8qIDEsMzcgYXNjaWkgdG8gQ1A4NjkgKi8KKyAgICBOVUxMLAkJCS8qIDEsMzggYXNjaWkgdG8gTGF0aW4tOSAqLworICAgIE5VTEwsCQkJLyogMSwzOSBhc2NpaSB0byBDUDg1OCAqLworICAgIHhhczU1LAkJCS8qIDEsNDAgYXNjaWkgdG8gQ1A4NTUgKi8KKyAgICB4YXMxMjUxLAkJCS8qIDEsNDEgYXNjaWkgdG8gQ1AxMjUxICovCisgICAgeGxlZnQxMjgsCQkJLyogMSw0MiBhc2NpaSB0byBidWxnYXJpYW4gKi8KKyAgICB4bGVmdDEyOCwJCQkvKiAxLDQzIGFzY2lpIHRvIENQMTI1MCAqLworICAgIHhsZWZ0MTI4LAkJCS8qIDEsNDQgYXNjaWkgdG8gTWF6b3ZpYSAqLworICAgIE5VTEwsCQkJLyogMSw0NSBhc2NpaSB0byBVQ1MtMiAqLworICAgIE5VTEwsCQkJLyogMSw0NiBhc2NpaSB0byBVVEYtOCAqLworICAgIE5VTEwsCQkJLyogMSw0NyBhc2NpaSB0byBLT0k4LVIgKi8KKyAgICBOVUxMLAkJCS8qIDEsNDggYXNjaWkgdG8gS09JOC1VICovCisgICAgTlVMTCwJCQkvKiAxLDQ5IGFzY2lpIHRvIENQMTI1MiAqLworICAgIHpsMWFzLAkJCS8qIDIsMCBsYXRpbi0xIHRvIHVzIGFzY2lpICovCisgICAgeGwxdWssCQkJLyogMiwxIGxhdGluLTEgdG8gdWsgYXNjaWkgKi8KKyAgICB4bDFkdSwJCQkvKiAyLDIgbGF0aW4tMSB0byBkdXRjaCBucmMgKi8KKyAgICB4bDFmaSwJCQkvKiAyLDMgbGF0aW4tMSB0byBmaW5uaXNoIG5yYyAqLworICAgIHhsMWZyLAkJCS8qIDIsNCBsYXRpbi0xIHRvIGZyZW5jaCBucmMgKi8KKyAgICB4bDFmYywJCQkvKiAyLDUgbGF0aW4tMSB0byBmci1jYW5hZGlhbiBucmMgKi8KKyAgICB4bDFnZSwJCQkvKiAyLDYgbGF0aW4tMSB0byBnZXJtYW4gbnJjICovCisgICAgeGwxaXQsCQkJLyogMiw3IGxhdGluLTEgdG8gaXRhbGlhbiBucmMgKi8KKyAgICB4bDFodSwJCQkvKiAyLDggbGF0aW4tMSB0byBodW5nYXJpYW4gbnJjICovCisgICAgeGwxbm8sCQkJLyogMiw5IGxhdGluLTEgdG8gbm9yZ2UvZGFuaXNoIG5yYyAqLworICAgIHhsMXBvLAkJCS8qIDIsMTAgbGF0aW4tMSB0byBwb3J0dWd1ZXNlIG5yYyAqLworICAgIHhsMXNwLAkJCS8qIDIsMTEgbGF0aW4tMSB0byBzcGFuaXNoIG5yYyAqLworICAgIHhsMXN3LAkJCS8qIDIsMTIgbGF0aW4tMSB0byBzd2VkaXNoIG5yYyAqLworICAgIHhsMWNoLAkJCS8qIDIsMTMgbGF0aW4tMSB0byBzd2lzcyBucmMgKi8KKyAgICBOVUxMLAkJCS8qIDIsMTQgbGF0aW4tMSB0byBsYXRpbi0xICovCisgICAgeGwxbDIsCQkJLyogMiwxNSBsYXRpbi0xIHRvIGxhdGluLTIgKi8KKyAgICB4bDFkbSwJCQkvKiAyLDE2IGxhdGluLTEgdG8gREVDIE1DUyAqLworICAgIHhsMW5lLAkJCS8qIDIsMTcgbGF0aW4tMSB0byBOZVhUICovCisgICAgeGwxNDMsCQkJLyogMiwxOCBsYXRpbi0xIHRvIENQNDM3ICovCisgICAgeGwxODUsCQkJLyogMiwxOSBsYXRpbi0xIHRvIENQODUwICovCisgICAgeGwxNTIsCQkJLyogMiwyMCBsYXRpbi0xIHRvIENQODUyICovCisgICAgeGwxYXEsCQkJLyogMiwyMSBsYXRpbi0xIHRvIE1hY2ludG9zaCBMYXRpbiAqLworICAgIHhsMWRnLAkJCS8qIDIsMjIgbGF0aW4tMSB0byBER0kgKi8KKyAgICB4bDFyOCwJCQkvKiAyLDIzIGxhdGluLTEgdG8gSFAgUm9tYW44ICovCisgICAgemwxYXMsCQkJLyogMiwyNCBsYXRpbi0xIHRvIExhdGluL0N5cmlsbGljICovCisgICAgemwxYXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDIsMjUgbGF0aW4tMSB0byBDUDg2NiAqLworICAgIHhsMXNrLCAgICAgICAgICAgICAgICAgICAgICAvKiAyLDI2IGxhdGluLTEgdG8gU2hvcnQgS09JICovCisgICAgemwxYXMsCQkgICAgICAgCS8qIDIsMjcgbGF0aW4tMSB0byBPbGQgS09JLTggQ3lyaWxsaWMgKi8KKyAgICBOVUxMLAkJCS8qIDIsMjggbGF0aW4tMSB0byBKSVMtNyAqLworICAgIE5VTEwsCQkJLyogMiwyOSBsYXRpbi0xIHRvIFNoaWZ0LUpJUyAqLworICAgIE5VTEwsCQkJLyogMiwzMCBsYXRpbi0xIHRvIEotRVVDICovCisgICAgTlVMTCwJCQkvKiAyLDMxIGxhdGluLTEgdG8gREVDIEthbmppICovCisgICAgeGwxaDcsCQkJLyogMiwzMiBsYXRpbi0xIHRvIEhlYnJldy03ICovCisgICAgeGwxbGgsCQkJLyogMiwzMyBsYXRpbi0xIHRvIExhdGluL0hlYnJldyAqLworICAgIHhsMTYyLAkJCS8qIDIsMzQgbGF0aW4tMSB0byBDUDg2MiBIZWJyZXcgKi8KKyAgICB4bDFlZywJCQkvKiAyLDM1IGxhdGluLTEgdG8gRUxPVCA5MjcgR3JlZWsgKi8KKyAgICB4bDFsZywJCQkvKiAyLDM2IGxhdGluLTEgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4bDE2OSwJCQkvKiAyLDM3IGxhdGluLTEgdG8gQ1A4NjkgKi8KKyAgICBOVUxMLAkJCS8qIDIsMzggbGF0aW4tMSB0byBMYXRpbjkgKi8KKyAgICB4bDE4NSwJCQkvKiAyLDM5IGxhdGluLTEgdG8gQ1A4NTggKi8KKyAgICB6bDFhcywJCQkvKiAyLDQwIGxhdGluLTEgdG8gQ1A4NTUgKi8KKyAgICB6bDFhcywJCQkvKiAyLDQxIGxhdGluLTEgdG8gQ1AxMjUxICovCisgICAgemwxYXMsCQkJLyogMiw0MiBsYXRpbi0xIHRvIEJ1bGdhcmlhbiAqLworICAgIHhsMTEyNTAsCQkJLyogMiw0MyBsYXRpbi0xIHRvIENQMTI1MCAqLworICAgIHhsMW16LAkJCS8qIDIsNDQgbGF0aW4tMSB0byBNYXpvdmlhICovCisgICAgTlVMTCwJCQkvKiAyLDQ1IGxhdGluLTEgdG8gVUNTLTIgKi8KKyAgICBOVUxMLAkJCS8qIDIsNDYgbGF0aW4tMSB0byBVVEYtOCAqLworICAgIHpsMWFzLAkJCS8qIDIsNDcgbGF0aW4tMSB0byBLT0k4UiAqLworICAgIHpsMWFzLAkJCS8qIDIsNDggbGF0aW4tMSB0byBLT0k4VSAqLworICAgIHhsMXcxLAkJCS8qIDIsNDkgbGF0aW4tMSB0byBDUDEyNTIgKi8KKyAgICB4bDJhcywJCQkvKiAzLDAgbGF0aW4tMiB0byB1cyBhc2NpaSAqLworICAgIHhsMmFzLAkJCS8qIDMsMSBsYXRpbi0yIHRvIHVrIGFzY2lpICovCisgICAgeGwyYXMsCQkJLyogMywyIGxhdGluLTIgdG8gZHV0Y2ggbnJjICovCisgICAgeGwyYXMsCQkJLyogMywzIGxhdGluLTIgdG8gZmlubmlzaCBucmMgKi8KKyAgICB4bDJhcywJCQkvKiAzLDQgbGF0aW4tMiB0byBmcmVuY2ggbnJjICovCisgICAgeGwyYXMsCQkJLyogMyw1IGxhdGluLTIgdG8gZnItY2FuYWRpYW4gbnJjICovCisgICAgeGwyYXMsCQkJLyogMyw2IGxhdGluLTIgdG8gZ2VybWFuIG5yYyAqLworICAgIHhsMmFzLAkJCS8qIDMsNyBsYXRpbi0yIHRvIGl0YWxpYW4gbnJjICovCisgICAgeGwyYXMsCQkJLyogMyw4IGxhdGluLTIgdG8gaHVuZ2FyaWFuIG5yYyAqLworICAgIHhsMmFzLAkJCS8qIDMsOSBsYXRpbi0yIHRvIG5vcmdlL2RhbmlzaCBucmMgKi8KKyAgICB4bDJhcywJCQkvKiAzLDEwIGxhdGluLTIgdG8gcG9ydHVndWVzZSBucmMgKi8KKyAgICB4bDJhcywJCQkvKiAzLDExIGxhdGluLTIgdG8gc3BhbmlzaCBucmMgKi8KKyAgICB4bDJhcywJCQkvKiAzLDEyIGxhdGluLTIgdG8gc3dlZGlzaCBucmMgKi8KKyAgICB4bDJhcywJCQkvKiAzLDEzIGxhdGluLTIgdG8gc3dpc3MgbnJjICovCisgICAgeGwybDEsCQkJLyogMywxNCBsYXRpbi0yIHRvIGxhdGluLTEgKi8KKyAgICBOVUxMLAkJCS8qIDMsMTUgbGF0aW4tMiB0byBsYXRpbi0yICovCisgICAgeGwybDEsCQkJLyogMywxNiBsYXRpbi0yIHRvIERFQyBNQ1MgKi8KKyAgICB4bDJuZSwJCQkvKiAzLDE3IGxhdGluLTIgdG8gTmVYVCAqLworICAgIHhsMjQzLAkJCS8qIDMsMTggbGF0aW4tMiB0byBDUDQzNyAqLworICAgIHhsMjg1LAkJCS8qIDMsMTkgbGF0aW4tMiB0byBDUDg1MCAqLworICAgIHhsMjUyLAkJCS8qIDMsMjAgbGF0aW4tMiB0byBDUDg1MiAqLworICAgIHhsMmFxLAkJCS8qIDMsMjEgbGF0aW4tMiB0byBNYWNpbnRvc2ggTGF0aW4gKi8KKyAgICB4bDJkZywJCQkvKiAzLDIyIGxhdGluLTIgdG8gREdJICovCisgICAgeGwycjgsCQkJLyogMywyMyBsYXRpbi0yIHRvIEhQICovCisgICAgeGwyYXMsCQkJLyogMywyNCBsYXRpbi0yIHRvIExhdGluL0N5cmlsbGljICovCisgICAgeGwyYXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDMsMjUgbGF0aW4tMiB0byBDUDg2NiAqLworICAgIHhsMnNrLCAgICAgICAgICAgICAgICAgICAgICAvKiAzLDI2IGxhdGluLTIgdG8gU2hvcnQgS09JICovCisgICAgeGwyYXMsCQkgICAgICAgCS8qIDMsMjcgbGF0aW4tMiB0byBPbGQgS09JLTggQ3lyaWxsaWMgKi8KKyAgICBOVUxMLAkJCS8qIDMsMjggbGF0aW4tMiB0byBKSVMtNyAqLworICAgIE5VTEwsCQkJLyogMywyOSBsYXRpbi0yIHRvIFNoaWZ0LUpJUyAqLworICAgIE5VTEwsCQkJLyogMywzMCBsYXRpbi0yIHRvIEotRVVDICovCisgICAgTlVMTCwJCQkvKiAzLDMxIGxhdGluLTIgdG8gREVDIEthbmppICovCisgICAgeGwyaDcsCQkJLyogMywzMiBsYXRpbi0yIHRvIEhlYnJldy03ICovCisgICAgeGwyYXMsCQkJLyogMywzMyBsYXRpbi0yIHRvIExhdGluL0hlYnJldyAqLworICAgIHhsMmFzLAkJCS8qIDMsMzQgbGF0aW4tMiB0byBDUDg2MiBIZWJyZXcgKi8KKyAgICB4YXNzaywJCQkvKiAzLDM1IGxhdGluLTIgdG8gRUxPVCA5MjcgR3JlZWsgKi8KKyAgICB4bDJhcywJCQkvKiAzLDM2IGxhdGluLTIgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4bDJhcywJCQkvKiAzLDM3IGxhdGluLTIgdG8gQ1A4NjkgKi8KKyAgICB4bDJsOSwJCQkvKiAzLDM4IGxhdGluLTIgdG8gTGF0aW4tOSAqLworICAgIHhsMjU4LAkJCS8qIDMsMzkgbGF0aW4tMiB0byBDUDg1OCAqLworICAgIHhsMmFzLAkJCS8qIDMsNDAgbGF0aW4tMiB0byBDUDg1NSAqLworICAgIHhsMmFzLAkJCS8qIDMsNDEgbGF0aW4tMiB0byBDUDEyNTEgKi8KKyAgICB4bDJhcywJCQkvKiAzLDQyIGxhdGluLTIgdG8gQnVsZ2FyaWFuICovCisgICAgeGwyMTI1MCwJCQkvKiAzLDQzIGxhdGluLTIgdG8gQ1AxMjUwICovCisgICAgeGwybXosCQkJLyogMyw0NCBsYXRpbi0yIHRvIE1hem92aWEgKi8KKyAgICBOVUxMLAkJCS8qIDMsNDUgbGF0aW4tMiB0byBVQ1MtMiAqLworICAgIE5VTEwsCQkJLyogMyw0NiBsYXRpbi0yIHRvIFVURi04ICovCisgICAgeGwyYXMsCQkJLyogMyw0NyBsYXRpbi0yIHRvIEtPSThSICovCisgICAgeGwyYXMsCQkJLyogMyw0OCBsYXRpbi0yIHRvIEtPSThVICovCisgICAgeGwydzEsCQkJLyogMyw0OSBsYXRpbi0yIHRvIENQMTI1MiAqLworICAgIHhsY2FzLAkJCS8qIDQsMCBsYXRpbi9jeXJpbGxpYyB0byB1cyBhc2NpaSAqLworICAgIHhsY2FzLAkJCS8qIDQsMSBsYXRpbi9jeXJpbGxpYyB0byB1ayBhc2NpaSAqLworICAgIHhsY2FzLCAJCSAgICAgICAgLyogNCwyIGxhdGluL2N5cmlsbGljIHRvIGR1dGNoIG5yYyAqLworICAgIHhsY2FzLAkJCS8qIDQsMyBsYXRpbi9jeXJpbGxpYyB0byBmaW5uaXNoIGFzY2lpICovCisgICAgeGxjYXMsCQkJLyogNCw0IGxhdGluL2N5cmlsbGljIHRvIGZyZW5jaCBucmMgKi8KKyAgICB4bGNhcywJCQkvKiA0LDUgbGF0aW4vY3lyaWxsaWMgdG8gZnItY2FuYWRpYW4gbnJjICovCisgICAgeGxjYXMsCQkJLyogNCw2IGxhdGluL2N5cmlsbGljIHRvIGdlcm1hbiBucmMgKi8KKyAgICB4bGNhcywJCQkvKiA0LDcgbGF0aW4vY3lyaWxsaWMgdG8gaXRhbGlhbiBucmMgKi8KKyAgICB4bGNhcywJCQkvKiA0LDggbGF0aW4vY3lyaWxsaWMgdG8gaHVuZ2FyaWFuIG5yYyAqLworICAgIHhsY2FzLAkJCS8qIDQsOSBsYXRpbi9jeXJpbGxpYyB0byBub3JnZS9kYW5pc2ggbnJjICovCisgICAgeGxjYXMsCQkJLyogNCwxMCBsYXRpbi9jeXJpbGxpYyB0byBwb3J0dWd1ZXNlIG5yYyAqLworICAgIHhsY2FzLAkJCS8qIDQsMTEgbGF0aW4vY3lyaWxsaWMgdG8gc3BhbmlzaCBucmMgKi8KKyAgICB4bGNhcywJCQkvKiA0LDEyIGxhdGluL2N5cmlsbGljIHRvIHN3ZWRpc2ggbnJjICovCisgICAgeGxjYXMsCQkJLyogNCwxMyBsYXRpbi9jeXJpbGxpYyB0byBzd2lzcyBucmMgKi8KKyAgICB4bGNhcywJCQkvKiA0LDE0IGxhdGluL2N5cmlsbGljIHRvIGxhdGluLTEgKi8KKyAgICB4bGNhcywJCQkvKiA0LDE1IGxhdGluL2N5cmlsbGljIHRvIGxhdGluLTIgKi8KKyAgICB4bGNhcywJCQkvKiA0LDE2IGxhdGluL2N5cmlsbGljIHRvIERFQyBNQ1MgKi8KKyAgICB4bGNhcywJCQkvKiA0LDE3IGxhdGluL2N5cmlsbGljIHRvIE5lWFQgKi8KKyAgICB4bGNhcywJCQkvKiA0LDE4IGxhdGluL2N5cmlsbGljIHRvIENQNDM3ICovCisgICAgeGxjYXMsCQkJLyogNCwxOSBsYXRpbi9jeXJpbGxpYyB0byBDUDg1MCAqLworICAgIHhsY2FzLAkJCS8qIDQsMjAgbGF0aW4vY3lyaWxsaWMgdG8gQ1A4NTIgKi8KKyAgICB4bGNhcywJCQkvKiA0LDIxIGxhdGluL2N5cmlsbGljIHRvIE1hY2ludG9zaCBMYXRpbiAqLworICAgIHhsY2FzLAkJCS8qIDQsMjIgbGF0aW4vY3lyaWxsaWMgdG8gREdJICovCisgICAgeGxjYXMsCQkJLyogNCwyMyBsYXRpbi9jeXJpbGxpYyB0byBIUCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiA0LDI0IGxhdGluL2N5cmlsbGljIHRvIExhdGluL0N5cmlsbGljICovCisgICAgeGxjYWMsICAgICAgICAgICAgICAgICAgICAgIC8qIDQsMjUgbGF0aW4vY3lyaWxsaWMgdG8gQ1A4NjYgKi8KKyAgICB4bGNzaywgICAgICAgICAgICAgICAgICAgICAgLyogNCwyNiBsYXRpbi9jeXJpbGxpYyB0byBTaG9ydCBLT0kgKi8KKyAgICB4bGNrOCwJCSAgICAgICAJLyogNCwyNyBsYXRpbi9jeXJpbGxpYyB0byBPbGQgS09JLTggQ3lyaWxsaWMgKi8KKyAgICBOVUxMLAkJCS8qIDQsMjggbGF0aW4vY3lyaWwgdG8gSklTLTcgKi8KKyAgICBOVUxMLAkJCS8qIDQsMjkgbGF0aW4vY3lyaWwgdG8gU2hpZnQtSklTICovCisgICAgTlVMTCwJCQkvKiA0LDMwIGxhdGluL2N5cmlsIHRvIEotRVVDICovCisgICAgTlVMTCwJCQkvKiA0LDMxIGxhdGluL2N5cmlsIHRvIERFQyBLYW5qaSAqLworICAgIHhsY2g3LAkJCS8qIDQsMzIgbGF0aW4vY3lyaWwgdG8gSGVicmV3LTcgKi8KKyAgICB4bGNhcywJCQkvKiA0LDMzIGxhdGluL2N5cmlsIHRvIExhdGluL0hlYnJldyAqLworICAgIHhsY2FzLAkJCS8qIDQsMzQgbGF0aW4vY3lyaWwgdG8gQ1A4NjIgSGVicmV3ICovCisgICAgeGFzc2ssCQkJLyogNCwzNSBsYXRpbi9jeXJpbCB0byBFTE9UIDkyNyBHcmVlayAqLworICAgIHhsZWZ0MTYwLAkJCS8qIDQsMzYgbGF0aW4vY3lyaWwgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4bGVmdDEyOCwJCQkvKiA0LDM3IGxhdGluL2N5cmlsIHRvIENQODY5ICovCisgICAgeGxjYXMsCQkJLyogNCwzOCBsYXRpbi9jeXJpbCB0byBsYXRpbi05ICovCisgICAgeGxjYXMsCQkJLyogNCwzOSBsYXRpbi9jeXJpbCB0byBDUDg1OCAqLworICAgIHhsYzU1LAkJCS8qIDQsNDAgbGF0aW4vY3lyaWwgdG8gQ1A4NTUgKi8KKyAgICB4bGMxMjUxLAkJCS8qIDQsNDEgbGF0aW4vY3lyaWwgdG8gQ1AxMjUxICovCisgICAgeGxjYnUsCQkJLyogNCw0MiBsYXRpbi9jeXJpbCB0byBCdWxnYXJpYW4gKi8KKyAgICB4bGNhcywJCQkvKiA0LDQzIGxhdGluL2N5cmlsIHRvIENQMTI1MCAqLworICAgIHhsY2FzLAkJCS8qIDQsNDQgbGF0aW4vY3lyaWwgdG8gTWF6b3ZpYSAqLworICAgIE5VTEwsCQkJLyogNCw0NSBsYXRpbi9jeXJpbCB0byBVQ1MtMiAqLworICAgIE5VTEwsCQkJLyogNCw0NiBsYXRpbi9jeXJpbCB0byBVVEYtOCAqLworICAgIHhsY2tyLAkJCS8qIDQsNDcgbGF0aW4vY3lyaWwgdG8gS09JOFIgKi8KKyAgICB4bGNrdSwJCQkvKiA0LDQ4IGxhdGluL2N5cmlsIHRvIEtPSThVICovCisgICAgeGxjYXMsCQkJLyogNCw0OSBsYXRpbi9jeXJpbCB0byBDUDEyNTIgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDAgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDEgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDIgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDMgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDQgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDUgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDYgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDcgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDggKi8KKyAgICBOVUxMLAkJCS8qIDUsMDkgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTAgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTEgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTIgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTMgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTQgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTUgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTYgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTcgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTggKi8KKyAgICBOVUxMLAkJCS8qIDUsMTkgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjAgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjEgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjIgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjMgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjQgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjUgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjYgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjcgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjggKi8KKyAgICBOVUxMLAkJCS8qIDUsMjkgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzAgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzEgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzIgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzMgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzQgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzUgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzYgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzcgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzggKi8KKyAgICBOVUxMLAkJCS8qIDUsMzkgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDAgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDEgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDIgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDMgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDQgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDUgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDYgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDcgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDggKi8KKyAgICBOVUxMLAkJCS8qIDUsNDkgKi8KKyAgICB4bGhhcywJCQkvKiA2LDAgbGF0aW4vaGVicmV3IHRvIHVzIGFzY2lpICovCisgICAgeGxoYXMsCQkJLyogNiwxIGxhdGluL2hlYnJldyB0byB1ayBhc2NpaSAqLworICAgIHhsaGFzLCAJCSAgICAgICAgLyogNiwyIGxhdGluL2hlYnJldyB0byBkdXRjaCBucmMgKi8KKyAgICB4bGhhcywJCQkvKiA2LDMgbGF0aW4vaGVicmV3IHRvIGZpbm5pc2ggYXNjaWkgKi8KKyAgICB4bGhhcywJCQkvKiA2LDQgbGF0aW4vaGVicmV3IHRvIGZyZW5jaCBucmMgKi8KKyAgICB4bGhhcywJCQkvKiA2LDUgbGF0aW4vaGVicmV3IHRvIGZyLWNhbmFkaWFuIG5yYyAqLworICAgIHhsaGFzLAkJCS8qIDYsNiBsYXRpbi9oZWJyZXcgdG8gZ2VybWFuIG5yYyAqLworICAgIHhsaGFzLAkJCS8qIDYsNyBsYXRpbi9oZWJyZXcgdG8gaXRhbGlhbiBucmMgKi8KKyAgICB4bGhhcywJCQkvKiA2LDggbGF0aW4vaGVicmV3IHRvIGh1bmdhcmlhbiBucmMgKi8KKyAgICB4bGhhcywJCQkvKiA2LDkgbGF0aW4vaGVicmV3IHRvIG5vcmdlL2RhbmlzaCBucmMgKi8KKyAgICB4bGhhcywJCQkvKiA2LDEwIGxhdGluL2hlYnJldyB0byBwb3J0dWd1ZXNlIG5yYyAqLworICAgIHhsaGFzLAkJCS8qIDYsMTEgbGF0aW4vaGVicmV3IHRvIHNwYW5pc2ggbnJjICovCisgICAgeGxoYXMsCQkJLyogNiwxMiBsYXRpbi9oZWJyZXcgdG8gc3dlZGlzaCBucmMgKi8KKyAgICB4bGhhcywJCQkvKiA2LDEzIGxhdGluL2hlYnJldyB0byBzd2lzcyBucmMgKi8KKyAgICB4bGhsMSwJCQkvKiA2LDE0IGxhdGluL2hlYnJldyB0byBsYXRpbi0xICovCisgICAgeGxoYXMsCQkJLyogNiwxNSBsYXRpbi9oZWJyZXcgdG8gbGF0aW4tMiAqLworICAgIHhsaGwxLAkJCS8qIDYsMTYgbGF0aW4vaGVicmV3IHRvIERFQyBNQ1MgKi8KKyAgICB4bGhhcywJCQkvKiA2LDE3IGxhdGluL2hlYnJldyB0byBOZVhUICovCisgICAgeGxoYXMsCQkJLyogNiwxOCBsYXRpbi9oZWJyZXcgdG8gQ1A0MzcgKi8KKyAgICB4bGhhcywJCQkvKiA2LDE5IGxhdGluL2hlYnJldyB0byBDUDg1MCAqLworICAgIHhsaGFzLAkJCS8qIDYsMjAgbGF0aW4vaGVicmV3IHRvIENQODUyICovCisgICAgeGxoYXMsCQkJLyogNiwyMSBsYXRpbi9oZWJyZXcgdG8gTWFjaW50b3NoIExhdGluICovCisgICAgeGxoYXMsCQkJLyogNiwyMiBsYXRpbi9oZWJyZXcgdG8gREdJICovCisgICAgeGxoYXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDYsMjMgbGF0aW4vaGVicmV3IHRvIEhQICovCisgICAgeGxoYXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDYsMjQgbGF0aW4vaGVicmV3IHRvIExhdGluL0N5cmlsbGljICovCisgICAgeGxoYXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDYsMjUgbGF0aW4vaGVicmV3IHRvIENQODY2ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIDYsMjYgbGF0aW4vaGVicmV3IHRvIFNob3J0IEtPSSAqLworICAgIHhsaGFzLAkJICAgICAgIAkvKiA2LDI3IGxhdGluL2hlYnJldyB0byBPbGQgS09JLTggQ3lyaWxsaWMgKi8KKyAgICBOVUxMLAkJCS8qIDYsMjggbGF0aW4vaGVicmV3IHRvIEpJUy03ICovCisgICAgTlVMTCwJCQkvKiA2LDI5IGxhdGluL2hlYnJldyB0byBTaGlmdC1KSVMgKi8KKyAgICBOVUxMLAkJCS8qIDYsMzAgbGF0aW4vaGVicmV3IHRvIEotRVVDICovCisgICAgTlVMTCwJCQkvKiA2LDMxIGxhdGluL2hlYnJldyB0byBERUMgS2FuamkgKi8KKyAgICB4bGhoNywJCQkvKiA2LDMyIGxhdGluL2hlYnJldyB0byBIZWJyZXctNyAqLworICAgIE5VTEwsCQkJLyogNiwzMyBsYXRpbi9oZWJyZXcgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeGxoNjIsCQkJLyogNiwzNCBsYXRpbi9oZWJyZXcgdG8gQ1A4NjIgSGVicmV3ICovCisgICAgTlVMTCwJCQkvKiA2LDM1IGxhdGluL2hlYnJldyB0byBFTE9UIDkyNyBHcmVlayAqLworICAgIHhsaGFzLAkJCS8qIDYsMzYgbGF0aW4vaGVicmV3IHRvIExhdGluL0dyZWVrICovCisgICAgeGxoYXMsCQkJLyogNiwzNyBsYXRpbi9oZWJyZXcgdG8gQ1A4NjkgKi8KKyAgICB4bGhhcywJCQkvKiA2LDM4IGxhdGluL2hlYnJldyB0byBMYXRpbi05ICovCisgICAgeGxoYXMsCQkJLyogNiwzOSBsYXRpbi9oZWJyZXcgdG8gQ1A4NTggKi8KKyAgICB4bGhhcywJCQkvKiA2LDQwIGxhdGluL2hlYnJldyB0byBDUDg1NSAqLworICAgIHhsaGFzLAkJCS8qIDYsNDEgbGF0aW4vaGVicmV3IHRvIENQMTI1MSAqLworICAgIHhsaGFzLAkJCS8qIDYsNDIgbGF0aW4vaGVicmV3IHRvIEJ1bGdhcmlhbiAqLworICAgIHhsaGFzLAkJCS8qIDYsNDMgbGF0aW4vaGVicmV3IHRvIENQMTI1MCAqLworICAgIHhsaGFzLAkJCS8qIDYsNDQgbGF0aW4vaGVicmV3IHRvIE1hem92aWEgKi8KKyAgICBOVUxMLAkJCS8qIDYsNDUgbGF0aW4vaGVicmV3IHRvIFVDUy0yICovCisgICAgTlVMTCwJCQkvKiA2LDQ2IGxhdGluL2hlYnJldyB0byBVVEYtOCAqLworICAgIE5VTEwsCQkJLyogNiw0NyBsYXRpbi9oZWJyZXcgdG8gS09JOFIgKi8KKyAgICBOVUxMLAkJCS8qIDYsNDggbGF0aW4vaGVicmV3IHRvIEtPSThVICovCisgICAgeGxodzEsCQkJLyogNiw0OSBsYXRpbi9oZWJyZXcgdG8gQ1AxMjUyICovCisgICAgeGxnYXMsCQkJLyogNywwIGxhdGluL2dyZWVrIHRvIHVzIGFzY2lpICovCisgICAgeGxnYXMsCQkJLyogNywxIGxhdGluL2dyZWVrIHRvIHVrIGFzY2lpICovCisgICAgeGxnYXMsIAkJICAgICAgICAvKiA3LDIgbGF0aW4vZ3JlZWsgdG8gZHV0Y2ggbnJjICovCisgICAgeGxnYXMsCQkJLyogNywzIGxhdGluL2dyZWVrIHRvIGZpbm5pc2ggYXNjaWkgKi8KKyAgICB4bGdhcywJCQkvKiA3LDQgbGF0aW4vZ3JlZWsgdG8gZnJlbmNoIG5yYyAqLworICAgIHhsZ2FzLAkJCS8qIDcsNSBsYXRpbi9ncmVlayB0byBmci1jYW5hZGlhbiBucmMgKi8KKyAgICB4bGdhcywJCQkvKiA3LDYgbGF0aW4vZ3JlZWsgdG8gZ2VybWFuIG5yYyAqLworICAgIHhsZ2FzLAkJCS8qIDcsNyBsYXRpbi9ncmVlayB0byBpdGFsaWFuIG5yYyAqLworICAgIHhsZ2FzLAkJCS8qIDcsOCBsYXRpbi9ncmVlayB0byBodW5nYXJpYW4gbnJjICovCisgICAgeGxnYXMsCQkJLyogNyw5IGxhdGluL2dyZWVrIHRvIG5vcmdlL2RhbmlzaCBucmMgKi8KKyAgICB4bGdhcywJCQkvKiA3LDEwIGxhdGluL2dyZWVrIHRvIHBvcnR1Z3Vlc2UgbnJjICovCisgICAgeGxnYXMsCQkJLyogNywxMSBsYXRpbi9ncmVlayB0byBzcGFuaXNoIG5yYyAqLworICAgIHhsZ2FzLAkJCS8qIDcsMTIgbGF0aW4vZ3JlZWsgdG8gc3dlZGlzaCBucmMgKi8KKyAgICB4bGdhcywJCQkvKiA3LDEzIGxhdGluL2dyZWVrIHRvIHN3aXNzIG5yYyAqLworICAgIHhsZ2FzLAkJCS8qIDcsMTQgbGF0aW4vZ3JlZWsgdG8gbGF0aW4tMSAqLworICAgIHhsZ2FzLAkJCS8qIDcsMTUgbGF0aW4vZ3JlZWsgdG8gbGF0aW4tMiAqLworICAgIHhsZ2FzLAkJCS8qIDcsMTYgbGF0aW4vZ3JlZWsgdG8gREVDIE1DUyAqLworICAgIHhsZ2FzLAkJCS8qIDcsMTcgbGF0aW4vZ3JlZWsgdG8gTmVYVCAqLworICAgIHhsZ2FzLAkJCS8qIDcsMTggbGF0aW4vZ3JlZWsgdG8gQ1A0MzcgKi8KKyAgICB4bGdhcywJCQkvKiA3LDE5IGxhdGluL2dyZWVrIHRvIENQODUwICovCisgICAgeGxnYXMsCQkJLyogNywyMCBsYXRpbi9ncmVlayB0byBDUDg1MiAqLworICAgIHhsZ2FzLAkJCS8qIDcsMjEgbGF0aW4vZ3JlZWsgdG8gTWFjaW50b3NoIExhdGluICovCisgICAgeGxnYXMsCQkJLyogNywyMiBsYXRpbi9ncmVlayB0byBER0kgKi8KKyAgICB4bGdhcywJCQkvKiA3LDIzIGxhdGluL2dyZWVrIHRvIEhQICovCisgICAgeGxlZnQxNjAsICAgICAgICAgICAgICAgICAgIC8qIDcsMjQgbGF0aW4vZ3JlZWsgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgICB4bGVmdDEyOCwgICAgICAgICAgICAgICAgICAgLyogNywyNSBsYXRpbi9ncmVlayB0byBDUDg2NiAqLworICAgIHhhc3NrLCAgICAgICAgICAgICAgICAgICAgICAvKiA3LDI2IGxhdGluL2dyZWVrIHRvIFNob3J0IEtPSSAqLworICAgIHhsZWZ0MTYwLAkJICAgICAgIAkvKiA3LDI3IGxhdGluL2dyZWVrIHRvIE9sZCBLT0ktOCBHcmVlayAqLworICAgIE5VTEwsCQkJLyogNywyOCBsYXRpbi9ncmVlayB0byBKSVMtNyAqLworICAgIE5VTEwsCQkJLyogNywyOSBsYXRpbi9ncmVlayB0byBTaGlmdC1KSVMgKi8KKyAgICBOVUxMLAkJCS8qIDcsMzAgbGF0aW4vZ3JlZWsgdG8gSi1FVUMgKi8KKyAgICBOVUxMLAkJCS8qIDcsMzEgbGF0aW4vZ3JlZWsgdG8gREVDIEthbmppICovCisgICAgTlVMTCwJCQkvKiA3LDMyIGxhdGluL2dyZWVrIHRvIEhlYnJldy03ICovCisgICAgeGxnYXMsCQkJLyogNywzMyBsYXRpbi9ncmVlayB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4bGdhcywJCQkvKiA3LDM0IGxhdGluL2dyZWVrIHRvIENQODYyIEhlYnJldyAqLworICAgIHhsZ2VnLAkJCS8qIDcsMzUgbGF0aW4vZ3JlZWsgdG8gRUxPVCA5MjcgR3JlZWsgKi8KKyAgICBOVUxMLAkJCS8qIDcsMzYgbGF0aW4vZ3JlZWsgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4bGc2OSwJCQkvKiA3LDM3IGxhdGluL2dyZWVrIHRvIENQODY5ICovCisgICAgeGxnYXMsCQkJLyogNywzOCBsYXRpbi9ncmVlayB0byBMYXRpbi05ICovCisgICAgeGxnYXMsCQkJLyogNywzOSBsYXRpbi9ncmVlayB0byBDUDg1OCAqLworICAgIHhsZWZ0MTI4LAkJCS8qIDcsNDAgbGF0aW4vZ3JlZWsgdG8gQ1A4NTUgKi8KKyAgICB4bGVmdDEyOCwJCQkvKiA3LDQxIGxhdGluL2dyZWVrIHRvIENQMTI1MSAqLworICAgIHhsZWZ0MTI4LAkJCS8qIDcsNDIgbGF0aW4vZ3JlZWsgdG8gQnVsZ2FyaWFuICovCisgICAgeGxlZnQxMjgsCQkJLyogNyw0MyBsYXRpbi9ncmVlayB0byBDUDEyNTAgKi8KKyAgICB4bGVmdDEyOCwJCQkvKiA3LDQ0IGxhdGluL2dyZWVrIHRvIE1hem92aWEgKi8KKyAgICBOVUxMLAkJCS8qIDcsNDUgbGF0aW4vZ3JlZWsgdG8gVUNTLTIgKi8KKyAgICBOVUxMLAkJCS8qIDcsNDYgbGF0aW4vZ3JlZWsgdG8gVVRGLTggKi8KKyAgICBOVUxMLAkJCS8qIDcsNDcgbGF0aW4vZ3JlZWsgdG8gS09JOFIgKi8KKyAgICBOVUxMLAkJCS8qIDcsNDggbGF0aW4vZ3JlZWsgdG8gS09JOFUgKi8KKyAgICB4bGd3MSwJCQkvKiA3LDQ5IGxhdGluL2dyZWVrIHRvIENQMTI1MiAqLworICAgIHpsOWFzLAkJCS8qIDgsMCBsYXRpbi05IHRvIHVzIGFzY2lpICovCisgICAgeGwxdWssCQkJLyogOCwxIGxhdGluLTkgdG8gdWsgYXNjaWkgKi8KKyAgICB4bDFkdSwJCQkvKiA4LDIgbGF0aW4tOSB0byBkdXRjaCBucmMgKi8KKyAgICB4bDFmaSwJCQkvKiA4LDMgbGF0aW4tOSB0byBmaW5uaXNoIG5yYyAqLworICAgIHhsMWZyLAkJCS8qIDgsNCBsYXRpbi05IHRvIGZyZW5jaCBucmMgKi8KKyAgICB4bDFmYywJCQkvKiA4LDUgbGF0aW4tOSB0byBmci1jYW5hZGlhbiBucmMgKi8KKyAgICB4bDFnZSwJCQkvKiA4LDYgbGF0aW4tOSB0byBnZXJtYW4gbnJjICovCisgICAgeGwxaXQsCQkJLyogOCw3IGxhdGluLTkgdG8gaXRhbGlhbiBucmMgKi8KKyAgICB4bDFodSwJCQkvKiA4LDggbGF0aW4tOSB0byBodW5nYXJpYW4gbnJjICovCisgICAgeGwxbm8sCQkJLyogOCw5IGxhdGluLTkgdG8gbm9yZ2UvZGFuaXNoIG5yYyAqLworICAgIHhsMXBvLAkJCS8qIDgsMTAgbGF0aW4tOSB0byBwb3J0dWd1ZXNlIG5yYyAqLworICAgIHhsMXNwLAkJCS8qIDgsMTEgbGF0aW4tOSB0byBzcGFuaXNoIG5yYyAqLworICAgIHhsMXN3LAkJCS8qIDgsMTIgbGF0aW4tOSB0byBzd2VkaXNoIG5yYyAqLworICAgIHhsMWNoLAkJCS8qIDgsMTMgbGF0aW4tOSB0byBzd2lzcyBucmMgKi8KKyAgICBOVUxMLAkJCS8qIDgsMTQgbGF0aW4tOSB0byBsYXRpbi0xICovCisgICAgeGwxbDIsCQkJLyogOCwxNSBsYXRpbi05IHRvIGxhdGluLTIgKi8KKyAgICB4bDlkbSwJCQkvKiA4LDE2IGxhdGluLTkgdG8gREVDIE1DUyAqLworICAgIHhsOW5lLAkJCS8qIDgsMTcgbGF0aW4tOSB0byBOZVhUICovCisgICAgeGwxNDMsCQkJLyogOCwxOCBsYXRpbi05IHRvIENQNDM3ICovCisgICAgeGwxODUsCQkJLyogOCwxOSBsYXRpbi05IHRvIENQODUwICovCisgICAgeGwxNTIsCQkJLyogOCwyMCBsYXRpbi05IHRvIENQODUyICovCisgICAgeGwxYXEsCQkJLyogOCwyMSBsYXRpbi05IHRvIE1hY2ludG9zaCBMYXRpbiAqLworICAgIHhsMWRnLAkJCS8qIDgsMjIgbGF0aW4tOSB0byBER0kgKi8KKyAgICB4bDFyOCwJCQkvKiA4LDIzIGxhdGluLTkgdG8gSFAgUm9tYW44ICovCisgICAgemwxYXMsCQkJLyogOCwyNCBsYXRpbi05IHRvIExhdGluL0N5cmlsbGljICovCisgICAgemwxYXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDgsMjUgbGF0aW4tOSB0byBDUDg2NiAqLworICAgIHhsMXNrLCAgICAgICAgICAgICAgICAgICAgICAvKiA4LDI2IGxhdGluLTkgdG8gU2hvcnQgS09JICovCisgICAgemwxYXMsCQkgICAgICAgCS8qIDgsMjcgbGF0aW4tOSB0byBPbGQgS09JLTggQ3lyaWxsaWMgKi8KKyAgICBOVUxMLAkJCS8qIDgsMjggbGF0aW4tOSB0byBKSVMtNyAqLworICAgIE5VTEwsCQkJLyogOCwyOSBsYXRpbi05IHRvIFNoaWZ0LUpJUyAqLworICAgIE5VTEwsCQkJLyogOCwzMCBsYXRpbi05IHRvIEotRVVDICovCisgICAgTlVMTCwJCQkvKiA4LDMxIGxhdGluLTkgdG8gREVDIEthbmppICovCisgICAgeGwxaDcsCQkJLyogOCwzMiBsYXRpbi05IHRvIEhlYnJldy03ICovCisgICAgeGwxbGgsCQkJLyogOCwzMyBsYXRpbi05IHRvIExhdGluL0hlYnJldyAqLworICAgIHhsMTYyLAkJCS8qIDgsMzQgbGF0aW4tOSB0byBDUDg2MiBIZWJyZXcgKi8KKyAgICB4bDFlZywJCQkvKiA4LDM1IGxhdGluLTkgdG8gRUxPVCA5MjcgR3JlZWsgKi8KKyAgICB4bDFsZywJCQkvKiA4LDM2IGxhdGluLTkgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4bDE2OSwJCQkvKiA4LDM3IGxhdGluLTkgdG8gQ1A4NjkgKi8KKyAgICBOVUxMLAkJCS8qIDgsMzggbGF0aW4tOSB0byBMYXRpbjkgKi8KKyAgICB4bDk1OCwJCQkvKiA4LDM5IGxhdGluLTkgdG8gQ1A4NTggKi8KKyAgICB6bDFhcywJCQkvKiA4LDQwIGxhdGluLTkgdG8gQ1A4NTUgKi8KKyAgICB6bDFhcywJCQkvKiA4LDQxIGxhdGluLTkgdG8gQ1AxMjUxICovCisgICAgeGwxYXMsCQkJLyogOCw0MiBsYXRpbi05IHRvIEJ1bGdhcmlhbiAqLworICAgIHhsOTEyNTAsCQkJLyogOCw0MyBsYXRpbi05IHRvIENQMTI1MCAqLworICAgIHhsOW16LAkJCS8qIDgsNDQgbGF0aW4tOSB0byBNYXpvdmlhICovCisgICAgTlVMTCwJCQkvKiA4LDQ1IGxhdGluLTkgdG8gVUNTLTIgKi8KKyAgICBOVUxMLAkJCS8qIDgsNDYgbGF0aW4tOSB0byBVVEYtOCAqLworICAgIHpsMWFzLAkJCS8qIDgsNDcgbGF0aW4tOSB0byBLT0k4LVIgKi8KKyAgICB6bDFhcywJCQkvKiA4LDQ4IGxhdGluLTkgdG8gS09JOC1VICovCisgICAgeGw5dzEsCQkJLyogOCw0OSBsYXRpbi05IHRvIENQMTI1MiAqLworICAgIE5VTEwsCQkJLyogOSwwMCBVbmljb2RlLi4uICovCisgICAgTlVMTCwJCQkvKiA5LDAxICovCisgICAgTlVMTCwJCQkvKiA5LDAyICovCisgICAgTlVMTCwJCQkvKiA5LDAzICovCisgICAgTlVMTCwJCQkvKiA5LDA0ICovCisgICAgTlVMTCwJCQkvKiA5LDA1ICovCisgICAgTlVMTCwJCQkvKiA5LDA2ICovCisgICAgTlVMTCwJCQkvKiA5LDA3ICovCisgICAgTlVMTCwJCQkvKiA5LDA4ICovCisgICAgTlVMTCwJCQkvKiA5LDA5ICovCisgICAgTlVMTCwJCQkvKiA5LDEwICovCisgICAgTlVMTCwJCQkvKiA5LDExICovCisgICAgTlVMTCwJCQkvKiA5LDEyICovCisgICAgTlVMTCwJCQkvKiA5LDEzICovCisgICAgTlVMTCwJCQkvKiA5LDE0ICovCisgICAgTlVMTCwJCQkvKiA5LDE1ICovCisgICAgTlVMTCwJCQkvKiA5LDE2ICovCisgICAgTlVMTCwJCQkvKiA5LDE3ICovCisgICAgTlVMTCwJCQkvKiA5LDE4ICovCisgICAgTlVMTCwJCQkvKiA5LDE5ICovCisgICAgTlVMTCwJCQkvKiA5LDIwICovCisgICAgTlVMTCwJCQkvKiA5LDIxICovCisgICAgTlVMTCwJCQkvKiA5LDIyICovCisgICAgTlVMTCwJCQkvKiA5LDIzICovCisgICAgTlVMTCwJCQkvKiA5LDI0ICovCisgICAgTlVMTCwJCQkvKiA5LDI1ICovCisgICAgTlVMTCwJCQkvKiA5LDI2ICovCisgICAgTlVMTCwJCQkvKiA5LDI3ICovCisgICAgTlVMTCwJCQkvKiA5LDI4ICovCisgICAgTlVMTCwJCQkvKiA5LDI5ICovCisgICAgTlVMTCwJCQkvKiA5LDMwICovCisgICAgTlVMTCwJCQkvKiA5LDMxICovCisgICAgTlVMTCwJCQkvKiA5LDMyICovCisgICAgTlVMTCwJCQkvKiA5LDMzICovCisgICAgTlVMTCwJCQkvKiA5LDM0ICovCisgICAgTlVMTCwJCQkvKiA5LDM1ICovCisgICAgTlVMTCwJCQkvKiA5LDM2ICovCisgICAgTlVMTCwJCQkvKiA5LDM3ICovCisgICAgTlVMTCwJCQkvKiA5LDM4ICovCisgICAgTlVMTCwJCQkvKiA5LDM5ICovCisgICAgTlVMTCwJCQkvKiA5LDQwICovCisgICAgTlVMTCwJCQkvKiA5LDQxICovCisgICAgTlVMTCwJCQkvKiA5LDQyICovCisgICAgTlVMTCwJCQkvKiA5LDQzICovCisgICAgTlVMTCwJCQkvKiA5LDQ0ICovCisgICAgTlVMTCwJCQkvKiA5LDQ1ICovCisgICAgTlVMTCwJCQkvKiA5LDQ2ICovCisgICAgTlVMTCwJCQkvKiA5LDQ3ICovCisgICAgTlVMTCwJCQkvKiA5LDQ4ICovCisgICAgTlVMTCwJCQkvKiA5LDQ5ICovCisgICAgTlVMTCwJCQkvKiAxMCwwMCAqLworICAgIE5VTEwsCQkJLyogMTAsMDEgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDAyICovCisgICAgTlVMTCwJCQkvKiAxMCwwMyAqLworICAgIE5VTEwsCQkJLyogMTAsMDQgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDA1ICovCisgICAgTlVMTCwJCQkvKiAxMCwwNiAqLworICAgIE5VTEwsCQkJLyogMTAsMDcgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDA4ICovCisgICAgTlVMTCwJCQkvKiAxMCwwOSAqLworICAgIE5VTEwsCQkJLyogMTAsMTAgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDExICovCisgICAgTlVMTCwJCQkvKiAxMCwxMiAqLworICAgIE5VTEwsCQkJLyogMTAsMTMgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDE0ICovCisgICAgTlVMTCwJCQkvKiAxMCwxNSAqLworICAgIE5VTEwsCQkJLyogMTAsMTYgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDE3ICovCisgICAgTlVMTCwJCQkvKiAxMCwxOCAqLworICAgIE5VTEwsCQkJLyogMTAsMTkgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDIwICovCisgICAgTlVMTCwJCQkvKiAxMCwyMSAqLworICAgIE5VTEwsCQkJLyogMTAsMjIgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDIzICovCisgICAgTlVMTCwJCQkvKiAxMCwyNCAqLworICAgIE5VTEwsCQkJLyogMTAsMjUgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDI2ICovCisgICAgTlVMTCwJCQkvKiAxMCwyNyAqLworICAgIE5VTEwsCQkJLyogMTAsMjggKi8KKyAgICBOVUxMLAkJCS8qIDEwLDI5ICovCisgICAgTlVMTCwJCQkvKiAxMCwzMCAqLworICAgIE5VTEwsCQkJLyogMTAsMzEgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDMyICovCisgICAgTlVMTCwJCQkvKiAxMCwzMyAqLworICAgIE5VTEwsCQkJLyogMTAsMzQgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDM1ICovCisgICAgTlVMTCwJCQkvKiAxMCwzNiAqLworICAgIE5VTEwsCQkJLyogMTAsMzcgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDM4ICovCisgICAgTlVMTCwJCQkvKiAxMCwzOSAqLworICAgIE5VTEwsCQkJLyogMTAsNDAgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDQxICovCisgICAgTlVMTCwJCQkvKiAxMCw0MiAqLworICAgIE5VTEwsCQkJLyogMTAsNDMgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDQ0ICovCisgICAgTlVMTCwJCQkvKiAxMCw0NSAqLworICAgIE5VTEwsCQkJLyogMTAsNDYgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDQ3ICovCisgICAgTlVMTCwJCQkvKiAxMCw0OCAqLworICAgIE5VTEwJCQkvKiAxMCw0OSAqLworfTsKK2ludCBueGxyID0gKHNpemVvZih4bHIpIC8gc2l6ZW9mKENIQVIgKikpOworCisvKgorICBUcmFuc2xhdGlvbiBmdW5jdGlvbiB0YWJsZSBmb3Igc2VuZGluZyBmaWxlcy4KKyAgQXJyYXkgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGZvciB0cmFuc2xhdGluZyBmcm9tIHRoZSBsb2NhbCBmaWxlCisgIGNoYXJhY3RlciBzZXQgdG8gdGhlIHRyYW5zZmVyIGNoYXJhY3RlciBzZXQuICBJbmRleGVkIGluIHRoZSBzYW1lCisgIHdheSBhcyB0aGUgeGxyIGFycmF5IGFib3ZlLCBidXQgd2l0aCB0aGUgaW5kaWNlcyByZXZlcnNlZC4KKyovCisjaWZkZWYgQ0tfQU5TSUMKK0NIQVIgKCp4bHNbTUFYVENTRVRTKzFdW01BWEZDU0VUUysxXSkoQ0hBUikgPQorI2Vsc2UKK0NIQVIgKCp4bHNbTUFYVENTRVRTKzFdW01BWEZDU0VUUysxXSkoKSA9CisjZW5kaWYgLyogQ0tfQU5TSUMgKi8KK3sKKyAgICBOVUxMLAkJCS8qIDAsMCB1cyBhc2NpaSB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMCwxIHVrIGFzY2lpIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDIgZHV0Y2ggbnJjIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDMgZmlubmlzaCBucmMgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsNCBmcmVuY2ggbnJjIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDUgZnItY2FuYWRpYW4gbnJjIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDYgZ2VybWFuIG5yYyB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMCw3IGh1bmdhcmlhbiBucmMgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsOCBpdGFsaWFuIG5yYyB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMCw5IG5vcmdlL2RhbmlzaCBucmMgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMTAgcG9ydHVndWVzZSBucmMgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMTEgc3BhbmlzaCBucmMgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMTIgc3dlZGlzaCBucmMgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMTMgc3dpc3MgbnJjIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDE0IGxhdGluLTEgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMTUgbGF0aW4tMiB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMCwxNiBERUMgTUNTIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDE3IE5lWFQgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMTggQ1A0MzcgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMTkgQ1A4NTAgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMjAgQ1A4NTIgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMjEgTWFjaW50b3NoIExhdGluIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDIyIERHSSB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMCwyMyBIUCB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMCwyNCBMYXRpbi9DeXJpbGxpYyB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiAwLDI1IENQODY2IHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIDAsMjYgU2hvcnQgS09JIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIDAsMjcgT2xkIEtPSS04IHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDI4IEpJUy03IHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDI5IFNoaWZ0IEpJUyB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMCwzMCBKYXBhbmVzZSBFVUMgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMzEgREVDIEthbmppIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDMyIEhlYnJldy03IHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDMzIExhdGluL0hlYnJldyB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMCwzNCBDUDg2MiBIZWJyZXcgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMzUgRUxPVCA5MjcgR3JlZWsgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMzYgTGF0aW4vR3JlZWsgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMzcgQ1A4NjkgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsMzggTGF0aW4tOSB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMCwzOSBDUDg1OCB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMCw0MCBDUDg1NSB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMCw0MSBDUDEyNTEgdG8gdHJhbnNwYXJlbnQgKi8KKyAgICBOVUxMLAkJCS8qIDAsNDIgQnVsZ2FyaWFuIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDQzIENQMTI1MCB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMCw0NCBNYXpvdmlhIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDQ1IFVDUy0yIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDQ2IFVURi04IHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDQ3IEtPSThSIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDQ4IEtPSThVIHRvIHRyYW5zcGFyZW50ICovCisgICAgTlVMTCwJCQkvKiAwLDQ5IENQMTI1MiB0byB0cmFuc3BhcmVudCAqLworICAgIE5VTEwsCQkJLyogMSwwIHVzIGFzY2lpIHRvIGFzY2lpICovCisgICAgTlVMTCwJCQkvKiAxLDEgdWsgYXNjaWkgdG8gYXNjaWkgKi8KKyAgICB4ZHVhcywJCQkvKiAxLDIgZHV0Y2ggbnJjIHRvIGFzY2lpICovCisgICAgeGZpYXMsCQkJLyogMSwzIGZpbm5pc2ggbnJjIHRvIGFzY2lpICovCisgICAgeGZyYXMsCQkJLyogMSw0IGZyZW5jaCBucmMgdG8gYXNjaWkgKi8KKyAgICB4ZmNhcywJCQkvKiAxLDUgZnJlbmNoIGNhbmFkaWFuIG5yYyB0byBhc2NpaSAqLworICAgIHhnZWFzLAkJCS8qIDEsNiBnZXJtYW4gbnJjIHRvIGFzY2lpICovCisgICAgeGh1YXMsCQkJLyogMSw3IGh1bmdhcmlhbiBucmMgdG8gYXNjaWkgKi8KKyAgICB4aXRhcywJCQkvKiAxLDggaXRhbGlhbiBucmMgdG8gYXNjaWkgKi8KKyAgICB4bm9hcywJCQkvKiAxLDkgbm9yd2VnaWFuL2RhbmlzaCBucmMgdG8gYXNjaWkgKi8KKyAgICB4cG9hcywJCQkvKiAxLDEwIHBvcnR1Z3Vlc2UgbnJjIHRvIGFzY2lpICovCisgICAgeHNwYXMsCQkJLyogMSwxMSBzcGFuaXNoIG5yYyB0byBhc2NpaSAqLworICAgIHhzd2FzLAkJCS8qIDEsMTIgc3dlZGlzaCBucmMgdG8gYXNjaWkgKi8KKyAgICB4Y2hhcywJCQkvKiAxLDEzIHN3aXNzIG5yYyB0byBhc2NpaSAqLworICAgIHhsMWFzLAkJCS8qIDEsMTQgbGF0aW4tMSB0byBhc2NpaSAqLworICAgIHhsMmFzLAkJCS8qIDEsMTUgbGF0aW4tMiB0byBhc2NpaSAqLworICAgIHhkbWFzLAkJCS8qIDEsMTYgZGVjIG1jcyB0byBhc2NpaSAqLworICAgIHhuZWFzLAkJCS8qIDEsMTcgTmVYVCB0byBhc2NpaSAqLworICAgIHg0M2FzLAkJCS8qIDEsMTggQ1A0MzcgdG8gYXNjaWkgKi8KKyAgICB4ODVhcywJCQkvKiAxLDE5IENQODUwIHRvIGFzY2lpICovCisgICAgeDUyYXMsCQkJLyogMSwyMCBDUDg1MCB0byBhc2NpaSAqLworICAgIHhhcWFzLAkJCS8qIDEsMjEgTWFjaW50b3NoIExhdGluIHRvIGFzY2lpICovCisgICAgeGRnYXMsCQkJLyogMSwyMiBER0kgdG8gYXNjaWkgKi8KKyAgICB4cjhhcywJCQkvKiAxLDIzIEhQIHRvIEFTQ0lJICovCisgICAgeGxjYXMsCQkJLyogMSwyNCBMYXRpbi9DeXJpbGxpYyB0byBBU0NJSSAqLworICAgIHhhY2FzLCAgICAgICAgICAgICAgICAgICAgICAvKiAxLDI1IENQODY2IHRvIEFTQ0lJICovCisgICAgeHNrYXMsCQkJLyogMSwyNiBTaG9ydCBLT0kgdG8gQVNDSUkgKi8KKyAgICB4azhhcywgICAgICAgICAgICAgICAgICAgICAgLyogMSwyNyBPbGQgS09JLTggQ3lyaWxsaWMgdG8gQVNDSUkgKi8KKyAgICBOVUxMLAkJCS8qIDEsMjggKi8KKyAgICBOVUxMLAkJCS8qIDEsMjkgKi8KKyAgICBOVUxMLAkJCS8qIDEsMzAgKi8KKyAgICBOVUxMLAkJCS8qIDEsMzEgKi8KKyAgICB4aDdhcywJCQkvKiAxLDMyIEhlYnJldy03IHRvIEFTQ0lJICovCisgICAgeGxoYXMsCQkJLyogMSwzMyBMYXRpbi9IZWJyZXcgdG8gQVNDSUkgKi8KKyAgICB4NjJhcywJCQkvKiAxLDM0IENQODYyIEhlYnJldyB0byBBU0NJSSAqLworICAgIHhlZ2FzLAkJCS8qIDEsMzUgRUxPVCA5MjcgR3JlZWsgdG8gQVNDSUkgKi8KKyAgICB4bGdhcywJCQkvKiAxLDM2IExhdGluL0dyZWVrIHRvIEFTQ0lJICovCisgICAgeDY5YXMsCQkJLyogMSwzNyBDUDg2OSB0byBBU0NJSSAqLworICAgIHhsOWFzLAkJCS8qIDEsMzggTGF0aW4tOSB0byBBU0NJSSAqLworICAgIHg1OGFzLAkJCS8qIDEsMzkgQ1A4NTggdG8gQVNDSUkgKi8KKyAgICB4NTVhcywJCQkvKiAxLDQwIENQODU1IHRvIEFTQ0lJICovCisgICAgeDEyNTFhcywJCQkvKiAxLDQxIENQMTI1MSB0byBBU0NJSSAqLworICAgIHhsZWZ0MTI4LAkJCS8qIDEsNDIgQnVsZ2FyaWFuIHRvIEFTQ0lJICovCisgICAgeDEyNTBhcywJCQkvKiAxLDQzIENQMTI1MCB0byBBU0NJSSAqLworICAgIHhtemFzLAkJCS8qIDEsNDQgTWF6b3ZpYSB0byBBU0NJSSAqLworICAgIE5VTEwsCQkJLyogMSw0NSBVQ1MtMiB0byBBU0NJSSAqLworICAgIE5VTEwsCQkJLyogMSw0NiBVVEYtOCB0byBBU0NJSSAqLworICAgIHhrOGFzLAkJCS8qIDEsNDcgS09JOFIgdG8gQVNDSUkgKi8KKyAgICB4azhhcywJCQkvKiAxLDQ4IEtPSThVIHRvIEFTQ0lJICovCisgICAgeHcxYXMsCQkJLyogMSw0OSBDUDEyNTIgdG8gQVNDSUkgKi8KKyAgICBOVUxMLAkJCS8qIDIsMCB1cyBhc2NpaSB0byBsYXRpbi0xICovCisgICAgeHVrbDEsCQkJLyogMiwxIHVrIGFzY2lpIHRvIGxhdGluLTEgKi8KKyAgICB4ZHVsMSwJCQkvKiAyLDIgZHV0Y2ggbnJjIHRvIGxhdGluLTEgKi8KKyAgICB4ZmlsMSwJCQkvKiAyLDMgZmlubmlzaCBucmMgdG8gbGF0aW4tMSAqLworICAgIHhmcmwxLAkJCS8qIDIsNCBmcmVuY2ggbnJjIHRvIGxhdGluLTEgKi8KKyAgICB4ZmNsMSwJCQkvKiAyLDUgZnJlbmNoIGNhbmFkaWFuIG5yYyB0byBsYXRpbi0xICovCisgICAgeGdlbDEsCQkJLyogMiw2IGdlcm1hbiBucmMgdG8gbGF0aW4tMSAqLworICAgIHhodWwxLAkJCS8qIDIsNyBodW5nYXJpYW4gbnJjIHRvIGxhdGluLTEgKi8KKyAgICB4aXRsMSwJCQkvKiAyLDggaXRhbGlhbiBucmMgdG8gbGF0aW4tMSAqLworICAgIHhub2wxLAkJCS8qIDIsOSBub3J3ZWdpYW4vZGFuaXNoIG5yYyB0byBsYXRpbi0xICovCisgICAgeHBvbDEsCQkJLyogMiwxMCBwb3J0dWd1ZXNlIG5yYyB0byBsYXRpbi0xICovCisgICAgeHNwbDEsCQkJLyogMiwxMSBzcGFuaXNoIG5yYyB0byBsYXRpbi0xICovCisgICAgeHN3bDEsCQkJLyogMiwxMiBzd2VkaXNoIG5yYyB0byBsYXRpbi0xICovCisgICAgeGNobDEsCQkJLyogMiwxMyBzd2lzcyBucmMgdG8gbGF0aW4tMSAqLworICAgIE5VTEwsCQkJLyogMiwxNCBsYXRpbi0xIHRvIGxhdGluLTEgKi8KKyAgICB4bDJsMSwJCQkvKiAyLDE1IGxhdGluLTIgdG8gbGF0aW4tMSAqLworICAgIHhkbWwxLAkJCS8qIDIsMTYgZGVjIG1jcyB0byBsYXRpbi0xICovCisgICAgeG5lbDEsICAgICAgICAgICAgICAgICAgICAgIC8qIDIsMTcgTmVYVCB0byBMYXRpbi0xICovCisgICAgeDQzbDEsICAgICAgICAgICAgICAgICAgICAgIC8qIDIsMTggQ1A0MzcgdG8gTGF0aW4tMSAqLworICAgIHg4NWwxLCAgICAgICAgICAgICAgICAgICAgICAvKiAyLDE5IENQODUwIHRvIExhdGluLTEgKi8KKyAgICB4NTJsMSwgICAgICAgICAgICAgICAgICAgICAgLyogMiwyMCBDUDg1MiB0byBMYXRpbi0xICovCisgICAgeGFxbDEsICAgICAgICAgICAgICAgICAgICAgIC8qIDIsMjEgTWFjaW50b3NoIExhdGluIHRvIExhdGluLTEgKi8KKyAgICB4ZGdsMSwgICAgICAgICAgICAgICAgICAgICAgLyogMiwyMiBER0kgdG8gTGF0aW4tMSAqLworICAgIHhyOGwxLCAgICAgICAgICAgICAgICAgICAgICAvKiAyLDIzIEhQIHRvIExhdGluLTEgKi8KKyAgICB4bGNhcywgICAgICAgICAgICAgICAgICAgICAgLyogMiwyNCBMYXRpbi9DeXJpbGxpYyB0byBMYXRpbi0xICovCisgICAgeGFjYXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDIsMjUgQ1A4NjYgdG8gTGF0aW4tMSAqLworICAgIHhza2FzLCAgICAgICAgICAgICAgICAgICAgICAvKiAyLDI2IFNob3J0IEtPSSB0byBMYXRpbi0xICovCisgICAgeGs4YXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDIsMjcgT2xkIEtPSS04IEN5cmlsbGljIHRvIExhdGluLTEgKi8KKyAgICBOVUxMLAkJCS8qIDIsMjggS2FuamkgLi4uICovCisgICAgTlVMTCwJCQkvKiAyLDI5ICovCisgICAgTlVMTCwJCQkvKiAyLDMwICovCisgICAgTlVMTCwJCQkvKiAyLDMxICovCisgICAgeGg3YXMsCQkJLyogMiwzMiBIZWJyZXctNyB0byBMYXRpbi0xICovCisgICAgeGxobDEsCQkJLyogMiwzMyBMYXRpbi9IZWJyZXcgdG8gTGF0aW4tMSAqLworICAgIHg2MmwxLAkJCS8qIDIsMzQgQ1A4NjIgSGVicmV3IHRvIExhdGluLTEgKi8KKyAgICB4ZWdhcywJCQkvKiAyLDM1IEVMT1QgOTI3IEdyZWVrIHRvIExhdGluLTEgKi8KKyAgICB4bGdsMSwJCQkvKiAyLDM2IExhdGluL0dyZWVrIHRvIExhdGluLTEgKi8KKyAgICBOVUxMLAkJCS8qIDIsMzcgQ1A4NjkgdG8gTGF0aW4tMSAqLworICAgIE5VTEwsCQkJLyogMiwzOCBMYXRpbi05IHRvIExhdGluLTEgKi8KKyAgICB4NThsMSwJCQkvKiAyLDM5IENQODU4IHRvIExhdGluLTEgKi8KKyAgICB4NTVhcywJCQkvKiAyLDQwIENQODU1IHRvIExhdGluLTEgKi8KKyAgICB4MTI1MWFzLAkJCS8qIDIsNDEgQ1AxMjUxIHRvIExhdGluLTEgKi8KKyAgICB4bGVmdDEyOCwJCQkvKiAyLDQyIEJ1bGdhcmlhbiB0byBMYXRpbi0xICovCisgICAgeDEyNTBsMSwJCQkvKiAyLDQzIENQMTI1MCB0byBMYXRpbi0xICovCisgICAgeG16bDEsCQkJLyogMiw0NCBNYXpvdmlhIHRvIExhdGluLTEgKi8KKyAgICBOVUxMLAkJCS8qIDIsNDUgVUNTLTIgdG8gTGF0aW4tMSAqLworICAgIE5VTEwsCQkJLyogMiw0NiBVVEYtOCB0byBMYXRpbi0xICovCisgICAgeGs4YXMsCQkJLyogMiw0NyBLT0k4UiB0byBMYXRpbi0xICovCisgICAgeGs4YXMsCQkJLyogMiw0OCBLT0k4VSB0byBMYXRpbi0xICovCisgICAgeHcxbDEsCQkJLyogMiw0OSBDUDEyNTIgdG8gTGF0aW4tMSAqLworICAgIE5VTEwsCQkJLyogMywwIHVzIGFzY2lpIHRvIGxhdGluLTIgKi8KKyAgICBOVUxMLAkJCS8qIDMsMSB1ayBhc2NpaSB0byBsYXRpbi0yICovCisgICAgeGR1YXMsCQkJLyogMywyIGR1dGNoIG5yYyB0byBsYXRpbi0yICovCisgICAgeGZpYXMsCQkJLyogMywzIGZpbm5pc2ggbnJjIHRvIGxhdGluLTIgKi8KKyAgICB4ZnJhcywJCQkvKiAzLDQgZnJlbmNoIG5yYyB0byBsYXRpbi0yICovCisgICAgeGZjYXMsCQkJLyogMyw1IGZyZW5jaCBjYW5hZGlhbiBucmMgdG8gbGF0aW4tMiAqLworICAgIHhnZWwyLAkJCS8qIDMsNiBnZXJtYW4gbnJjIHRvIGxhdGluLTIgKi8KKyAgICB4aHVsMiwJCQkvKiAzLDcgaHVuZ2FyaWFuIG5yYyB0byBsYXRpbi0yICovCisgICAgeGl0YXMsCQkJLyogMyw4IGl0YWxpYW4gbnJjIHRvIGxhdGluLTIgKi8KKyAgICB4bm9hcywJCQkvKiAzLDkgbm9yd2VnaWFuL2RhbmlzaCBucmMgdG8gbGF0aW4tMiAqLworICAgIHhwb2FzLAkJCS8qIDMsMTAgcG9ydHVndWVzZSBucmMgdG8gbGF0aW4tMiAqLworICAgIHhzcGFzLAkJCS8qIDMsMTEgc3BhbmlzaCBucmMgdG8gbGF0aW4tMiAqLworICAgIHhzd2FzLAkJCS8qIDMsMTIgc3dlZGlzaCBucmMgdG8gbGF0aW4tMiAqLworICAgIHhjaGFzLAkJCS8qIDMsMTMgc3dpc3MgbnJjIHRvIGxhdGluLTIgKi8KKyAgICB4bDFsMiwJCQkvKiAzLDE0IGxhdGluLTEgdG8gbGF0aW4tMiAqLworICAgIE5VTEwsCQkJLyogMywxNSBsYXRpbi0yIHRvIGxhdGluLTIgKi8KKyAgICB4bDFsMiwJCQkvKiAzLDE2IGRlYyBtY3MgdG8gbGF0aW4tMiAqLworICAgIHhuZWwyLCAgICAgICAgICAgICAgICAgICAgICAvKiAzLDE3IE5lWFQgdG8gTGF0aW4tMiAqLworICAgIHg0M2wyLCAgICAgICAgICAgICAgICAgICAgICAvKiAzLDE4IENQNDM3IHRvIExhdGluLTIgKi8KKyAgICB4ODVsMiwgICAgICAgICAgICAgICAgICAgICAgLyogMywxOSBDUDg1MCB0byBMYXRpbi0yICovCisgICAgeDUybDIsICAgICAgICAgICAgICAgICAgICAgIC8qIDMsMjAgQ1A4NTIgdG8gTGF0aW4tMiAqLworICAgIHhhcWwyLCAgICAgICAgICAgICAgICAgICAgICAvKiAzLDIxIE1hY2ludG9zaCBMYXRpbiB0byBMYXRpbi0yICovCisgICAgeGRnbDIsICAgICAgICAgICAgICAgICAgICAgIC8qIDMsMjIgREdJIHRvIExhdGluLTIgKi8KKyAgICB4cjhsMiwgICAgICAgICAgICAgICAgICAgICAgLyogMywyMyBIUCB0byBMYXRpbi0yICovCisgICAgeGxjYXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDMsMjQgTGF0aW4vQ3lyaWxsaWMgdG8gTGF0aW4tMiAqLworICAgIHhhY2FzLCAgICAgICAgICAgICAgICAgICAgICAvKiAzLDI1IENQODY2IHRvIExhdGluLTIgKi8KKyAgICB4c2thcywgICAgICAgICAgICAgICAgICAgICAgLyogMywyNiBTaG9ydCBLT0kgdG8gTGF0aW4tMiAqLworICAgIHhrOGFzLCAgICAgICAgICAgICAgICAgICAgICAvKiAzLDI3IE9sZCBLT0ktOCBDeXJpbGxpYyB0byBMYXRpbi0yICovCisgICAgTlVMTCwJCQkvKiAzLDI4IEthbmppIC4uLiAqLworICAgIE5VTEwsCQkJLyogMywyOSAqLworICAgIE5VTEwsCQkJLyogMywzMCAqLworICAgIE5VTEwsCQkJLyogMywzMSAqLworICAgIHhoN2FzLAkJCS8qIDMsMzIgSGVicmV3LTcgdG8gTGF0aW4tMiAqLworICAgIHhsaGFzLAkJCS8qIDMsMzMgTGF0aW4vSGVicmV3IHRvIExhdGluLTIgKi8KKyAgICB4NjJhcywJCQkvKiAzLDM0IENQODYyIEhlYnJldyB0byBMYXRpbi0yICovCisgICAgeGVnYXMsCQkJLyogMywzNSBFTE9UIDkyNyBHcmVlayB0byBMYXRpbi0yICovCisgICAgeGwybGcsCQkJLyogMywzNiBMYXRpbi9HcmVlayB0byBMYXRpbi0yICovCisgICAgeGxlZnQxMjgsCQkJLyogMywzNyBDUDg2OSB0byBMYXRpbi0yICovCisgICAgeGw5bDIsCQkJLyogMywzOCBMYXRpbi05IHRvIExhdGluLTIgKi8KKyAgICB4NThsMiwJCQkvKiAzLDM5IENQODU4IHRvIExhdGluLTIgKi8KKyAgICB4NTVhcywJCQkvKiAzLDQwIENQODU1IHRvIExhdGluLTIgKi8KKyAgICB4MTI1MWFzLAkJCS8qIDMsNDEgQ1AxMjUxIHRvIExhdGluLTIgKi8KKyAgICB4bGVmdDEyOCwJCQkvKiAzLDQyIEJ1bGdhcmlhbiB0byBMYXRpbi0yICovCisgICAgeDEyNTBsMiwJCQkvKiAzLDQzIENQMTI1MCB0byBMYXRpbi0yICovCisgICAgeG16bDIsCQkJLyogMyw0NCBNYXpvdmlhIHRvIExhdGluLTIgKi8KKyAgICBOVUxMLAkJCS8qIDMsNDUgVUNTLTIgdG8gTGF0aW4tMiAqLworICAgIE5VTEwsCQkJLyogMyw0NiBVVEYtOCB0byBMYXRpbi0yICovCisgICAgeGs4YXMsCQkJLyogMyw0NyBLT0k4UiB0byBMYXRpbi0yICovCisgICAgeGs4YXMsCQkJLyogMyw0OCBLT0k4VSB0byBMYXRpbi0yICovCisgICAgeHcxbDIsCQkJLyogMyw0OSBDUDEyNTIgdG8gbGF0aW4tMiAqLworICAgIHhhc2xjLAkJCS8qIDQsMCB1cyBhc2NpaSB0byBsYXRpbi9jeXJpbGxpYyAqLworICAgIHhhc2xjLAkJCS8qIDQsMSB1ayBhc2NpaSB0byBsYXRpbi9jeXJpbGxpYyAqLworICAgIHhkdWFzLAkJCS8qIDQsMiBkdXRjaCBucmMgdG8gbGF0aW4vY3lyaWxsaWMgKi8KKyAgICB4ZmlhcywJCQkvKiA0LDMgZmlubmlzaCBucmMgdG8gbGF0aW4vY3lyaWxsaWMgKi8KKyAgICB4ZnJhcywJCQkvKiA0LDQgZnJlbmNoIG5yYyB0byBsYXRpbi9jeXJpbGxpYyAqLworICAgIHhmY2FzLAkJCS8qIDQsNSBmcmVuY2ggY2FuYWRpYW4gbnJjIHRvIGxhdGluL2N5cmlsbGljICovCisgICAgeGdlYXMsCQkJLyogNCw2IGdlcm1hbiBucmMgdG8gbGF0aW4vY3lyaWxsaWMgKi8KKyAgICB4aHVhcywJCQkvKiA0LDcgaHVuZ2FyaWFuIG5yYyB0byBsYXRpbi9jeXJpbGxpYyAqLworICAgIHhpdGFzLAkJCS8qIDQsOCBpdGFsaWFuIG5yYyB0byBsYXRpbi9jeXJpbGxpYyAqLworICAgIHhub2FzLAkJCS8qIDQsOSBub3JnZS9kYW5pc2ggbnJjIHRvIGxhdGluL2N5cmlsbGljICovCisgICAgeHBvYXMsCQkJLyogNCwxMCBwb3J0dWd1ZXNlIG5yYyB0byBsYXRpbi9jeXJpbGxpYyAqLworICAgIHhzcGFzLAkJCS8qIDQsMTEgc3BhbmlzaCBucmMgdG8gbGF0aW4vY3lyaWxsaWMgKi8KKyAgICB4c3dhcywJCQkvKiA0LDEyIHN3ZWRpc2ggbnJjIHRvIGxhdGluL2N5cmlsbGljICovCisgICAgeGNoYXMsCQkJLyogNCwxMyBzd2lzcyBucmMgdG8gbGF0aW4vY3lyaWxsaWMgKi8KKyAgICB4bDFhcywJCQkvKiA0LDE0IGxhdGluLTEgdG8gbGF0aW4vY3lyaWxsaWMgKi8KKyAgICB4bDJhcywJCQkvKiA0LDE1IGxhdGluLTIgdG8gbGF0aW4vY3lyaWxsaWMgKi8KKyAgICB4ZG1hcywJCQkvKiA0LDE2IGRlYyBtY3MgdG8gbGF0aW4vY3lyaWxsaWMgKi8KKyAgICB4bmVhcywJCQkvKiA0LDE3IE5lWFQgdG8gbGF0aW4vY3lyaWxsaWMgKi8KKyAgICB4NDNhcywJCQkvKiA0LDE4IENQNDM3IHRvIGxhdGluL2N5cmlsbGljICovCisgICAgeDg1YXMsCQkJLyogNCwxOSBDUDg1MCB0byBsYXRpbi9jeXJpbGxpYyAqLworICAgIHg1MmFzLAkJCS8qIDQsMjAgQ1A4NTIgdG8gbGF0aW4vY3lyaWxsaWMgKi8KKyAgICB4YXFhcywJCQkvKiA0LDIxIE1hY2ludG9zaCBMYXRpbiB0byBsYXRpbi9jeXJpbGxpYyAqLworICAgIHhkZ2FzLAkJCS8qIDQsMjIgREdJIHRvIExhdGluL0N5cmlsbGljICovCisgICAgeHI4YXMsCQkJLyogNCwyMyBIUCB0byBMYXRpbi9DeXJpbGxpYyAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiA0LDI0IExhdGluL0N5cmlsbGljIHRvIExhdGluL0N5cmlsbGljICovCisgICAgeGFjbGMsICAgICAgICAgICAgICAgICAgICAgIC8qIDQsMjUgQ1A4NjYgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgICB4c2tjeSwgICAgICAgICAgICAgICAgICAgICAgLyogNCwyNiBTaG9ydCBLT0kgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgICB4azhsYywgICAgICAgICAgICAgICAgICAgICAgLyogNCwyNyBPbGQgS09JLTggQ3lyaWxsaWMgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgICBOVUxMLAkJCS8qIDQsMjggS2FuamkuLi4gKi8KKyAgICBOVUxMLAkJCS8qIDQsMjkgKi8KKyAgICBOVUxMLAkJCS8qIDQsMzAgKi8KKyAgICBOVUxMLAkJCS8qIDQsMzEgKi8KKyAgICB4aDdhcywJCQkvKiA0LDMyIEhlYnJldy03IHRvIExhdGluL0N5cmlsbGljICovCisgICAgeGxoYXMsCQkJLyogNCwzMyBMYXRpbi9IZWJyZXcgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgICB4NjJhcywJCQkvKiA0LDM0IENQODYyIEhlYnJldyB0byBMYXRpbi9DeXJpbGxpYyAqLworICAgIHhlZ2FzLAkJCS8qIDQsMzUgRUxPVCA5MjcgR3JlZWsgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgICB4bGVmdDE2MCwJCQkvKiA0LDM2IExhdGluL0dyZWVrIHRvIExhdGluL0N5cmlsbGljICovCisgICAgeGxlZnQxMjgsCQkJLyogNCwzNyBDUDg2OSB0byBMYXRpbi9DeXJpbGxpYyAqLworICAgIHhsMWFzLAkJCS8qIDQsMzggbGF0aW4tOSB0byBsYXRpbi9jeXJpbGxpYyAqLworICAgIHhsZWZ0MTI4LAkJCS8qIDQsMzkgQ1A4NTggdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgICB4NTVsYywJCQkvKiA0LDQwIENQODU1IHRvIExhdGluL0N5cmlsbGljICovCisgICAgeDEyNTFsYywJCQkvKiA0LDQxIENQMTI1MSB0byBMYXRpbi9DeXJpbGxpYyAqLworICAgIHhidWxjLAkJCS8qIDQsNDIgQnVsZ2FyaWFuIHRvIExhdGluL0N5cmlsbGljICovCisgICAgeDEyNTBhcywJCQkvKiA0LDQzIENQMTI1MCB0byBMYXRpbi9DeXJpbGxpYyAqLworICAgIHhtemFzLAkJCS8qIDQsNDQgTWF6b3ZpYSB0byBMYXRpbi9DeXJpbGxpYyAqLworICAgIE5VTEwsCQkJLyogNCw0NSBVQ1MtMiB0byBMYXRpbi9DeXJpbGxpYyAqLworICAgIE5VTEwsCQkJLyogNCw0NiBVVEYtOCB0byBMYXRpbi9DeXJpbGxpYyAqLworICAgIHhrcmxjLAkJCS8qIDQsNDcgS09JOFIgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgICB4a3VsYywJCQkvKiA0LDQ4IEtPSThVIHRvIExhdGluL0N5cmlsbGljICovCisgICAgeHcxbGMsCQkJLyogNCw0OSBDUDEyNTIgdG8gTGF0aW4vQ3lyaWxsaWMgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDAgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDEgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDIgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDMgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDQgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDUgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDYgKi8KKyAgICBOVUxMLAkJCS8qIDQuMDcgKi8KKyAgICBOVUxMLAkJCS8qIDUsMDggKi8KKyAgICBOVUxMLAkJCS8qIDUsMDkgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTAgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTEgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTIgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTMgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTQgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTUgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTYgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTcgKi8KKyAgICBOVUxMLAkJCS8qIDUsMTggKi8KKyAgICBOVUxMLAkJCS8qIDUsMTkgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjAgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjEgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjIgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjMgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjQgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjUgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjYgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjcgKi8KKyAgICBOVUxMLAkJCS8qIDUsMjggKi8KKyAgICBOVUxMLAkJCS8qIDUsMjkgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzAgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzEgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzIgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzMgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzQgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzUgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzYgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzcgKi8KKyAgICBOVUxMLAkJCS8qIDUsMzggKi8KKyAgICBOVUxMLAkJCS8qIDUsMzkgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDAgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDEgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDIgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDMgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDQgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDUgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDYgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDcgKi8KKyAgICBOVUxMLAkJCS8qIDUsNDggKi8KKyAgICBOVUxMLAkJCS8qIDUsNDkgKi8KKyAgICBOVUxMLAkJCS8qIDYsMCB1cyBhc2NpaSB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICBOVUxMLAkJCS8qIDYsMSB1ayBhc2NpaSB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4ZHVhcywJCQkvKiA2LDIgZHV0Y2ggbnJjIHRvIExhdGluL0hlYnJldyAqLworICAgIHhmaWFzLAkJCS8qIDYsMyBmaW5uaXNoIG5yYyB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4ZnJhcywJCQkvKiA2LDQgZnJlbmNoIG5yYyB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4ZmNhcywJCQkvKiA2LDUgZnJlbmNoIGNhbmFkaWFuIG5yYyB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4Z2VhcywJCQkvKiA2LDYgZ2VybWFuIG5yYyB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4aHVhcywJCQkvKiA2LDcgaHVuZ2FyaWFuIG5yYyB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4aXRhcywJCQkvKiA2LDggaXRhbGlhbiBucmMgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeG5vYXMsCQkJLyogNiw5IG5vcmdlL2RhbmlzaCBucmMgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeHBvYXMsCQkJLyogNiwxMCBwb3J0dWd1ZXNlIG5yYyB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4c3BhcywJCQkvKiA2LDExIHNwYW5pc2ggbnJjIHRvIExhdGluL0hlYnJldyAqLworICAgIHhzd2FzLAkJCS8qIDYsMTIgc3dlZGlzaCBucmMgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeGNoYXMsCQkJLyogNiwxMyBzd2lzcyBucmMgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeGwxbGgsCQkJLyogNiwxNCBsYXRpbi0xIHRvIExhdGluL0hlYnJldyAqLworICAgIHhsMmFzLAkJCS8qIDYsMTUgbGF0aW4tMiB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4ZG1hcywJCQkvKiA2LDE2IGRlYyBtY3MgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeG5lYXMsCQkJLyogNiwxNyBOZVhUIHRvIExhdGluL0hlYnJldyAqLworICAgIHg0M2FzLAkJCS8qIDYsMTggQ1A0MzcgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeDg1YXMsCQkJLyogNiwxOSBDUDg1MCB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4NTJhcywJCQkvKiA2LDIwIENQODUyIHRvIExhdGluL0hlYnJldyAqLworICAgIHhhcWFzLAkJCS8qIDYsMjEgTWFjaW50b3NoIExhdGluIHRvIExhdGluL0hlYnJldyAqLworICAgIHhkZ2FzLAkJCS8qIDYsMjIgREdJIHRvIExhdGluL0hlYnJldyAqLworICAgIHhyOGFzLAkJCS8qIDYsMjMgSFAgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeGxjYXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDYsMjQgTGF0aW4vQ3lyaWxsaWMgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeGFjYXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDYsMjUgQ1A4NjYgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeHNrYXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDYsMjYgU2hvcnQgS09JIHRvIExhdGluL0hlYnJldyAqLworICAgIHhrOGFzLCAgICAgICAgICAgICAgICAgICAgICAvKiA2LDI3IE9sZCBLT0ktOCBDeXJpbGxpYyB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICBOVUxMLAkJCS8qIDYsMjggS2FuamkuLi4gKi8KKyAgICBOVUxMLAkJCS8qIDYsMjkgKi8KKyAgICBOVUxMLAkJCS8qIDYsMzAgKi8KKyAgICBOVUxMLAkJCS8qIDYsMzEgKi8KKyAgICB4aDdsaCwJCQkvKiA2LDMyIEhlYnJldy03IHRvIExhdGluL0hlYnJldyAqLworICAgIE5VTEwsCQkJLyogNiwzMyBMYXRpbi9IZWJyZXcgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeDYybGgsCQkJLyogNiwzNCBDUDg2MiBIZWJyZXcgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeGVnYXMsCQkJLyogNiwzNSBFTE9UIDkyNyBHcmVlayB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4bGdhcywJCQkvKiA2LDM2IExhdGluL0dyZWVrIHRvIExhdGluL0hlYnJldyAqLworICAgIHg2OWFzLAkJCS8qIDYsMzcgQ1A4NjkgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeGwxYXMsCQkJLyogNiwzOCBsYXRpbi05IHRvIExhdGluL0hlYnJldyAqLworICAgIHg1OGFzLAkJCS8qIDYsMzkgQ1A4NTggdG8gTGF0aW4vSGVicmV3ICovCisgICAgeDU1YXMsCQkJLyogNiw0MCBDUDg1NSB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4MTI1MWFzLAkJCS8qIDYsNDEgQ1AxMjUxIHRvIExhdGluL0hlYnJldyAqLworICAgIHhsZWZ0MTI4LAkJCS8qIDYsNDIgQnVsZ2FyaWFuIHRvIExhdGluL0hlYnJldyAqLworICAgIHgxMjUwYXMsCQkJLyogNiw0MyBDUDEyNTAgdG8gTGF0aW4vSGVicmV3ICovCisgICAgeG16YXMsCQkJLyogNiw0NCBNYXpvdmlhIHRvIExhdGluL0hlYnJldyAqLworICAgIE5VTEwsCQkJLyogNiw0NSBVQ1MtMiB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICBOVUxMLAkJCS8qIDYsNDYgVVRGLTggdG8gTGF0aW4vSGVicmV3ICovCisgICAgTlVMTCwJCQkvKiA2LDQ3IEtPSThSIHRvIExhdGluL0hlYnJldyAqLworICAgIE5VTEwsCQkJLyogNiw0OCBLT0k4VSB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICB4dzFsaCwJCQkvKiA2LDQ5IENQMTI1MiB0byBMYXRpbi9IZWJyZXcgKi8KKyAgICBOVUxMLAkJCS8qIDcsMCB1cyBhc2NpaSB0byBMYXRpbi9HcmVlayAqLworICAgIE5VTEwsCQkJLyogNywxIHVrIGFzY2lpIHRvIExhdGluL0dyZWVrICovCisgICAgeGR1YXMsCQkJLyogNywyIGR1dGNoIG5yYyB0byBMYXRpbi9HcmVlayAqLworICAgIHhmaWFzLAkJCS8qIDcsMyBmaW5uaXNoIG5yYyB0byBMYXRpbi9HcmVlayAqLworICAgIHhmcmFzLAkJCS8qIDcsNCBmcmVuY2ggbnJjIHRvIExhdGluL0dyZWVrICovCisgICAgeGZjYXMsCQkJLyogNyw1IGZyZW5jaCBjYW5hZGlhbiBucmMgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4Z2VhcywJCQkvKiA3LDYgZ2VybWFuIG5yYyB0byBMYXRpbi9HcmVlayAqLworICAgIHhodWFzLAkJCS8qIDcsNyBodW5nYXJpYW4gbnJjIHRvIExhdGluL0dyZWVrICovCisgICAgeGl0YXMsCQkJLyogNyw4IGl0YWxpYW4gbnJjIHRvIExhdGluL0dyZWVrICovCisgICAgeG5vYXMsCQkJLyogNyw5IG5vcmdlL2RhbmlzaCBucmMgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4cG9hcywJCQkvKiA3LDEwIHBvcnR1Z3Vlc2UgbnJjIHRvIExhdGluL0dyZWVrICovCisgICAgeHNwYXMsCQkJLyogNywxMSBzcGFuaXNoIG5yYyB0byBMYXRpbi9HcmVlayAqLworICAgIHhzd2FzLAkJCS8qIDcsMTIgc3dlZGlzaCBucmMgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4Y2hhcywJCQkvKiA3LDEzIHN3aXNzIG5yYyB0byBMYXRpbi9HcmVlayAqLworICAgIHhsMWxnLAkJCS8qIDcsMTQgbGF0aW4tMSB0byBMYXRpbi9HcmVlayAqLworICAgIHhsMmxnLAkJCS8qIDcsMTUgbGF0aW4tMiB0byBMYXRpbi9HcmVlayAqLworICAgIHhsMWxnLAkJCS8qIDcsMTYgZGVjIG1jcyB0byBMYXRpbi9HcmVlayAqLworICAgIHhuZWFzLAkJCS8qIDcsMTcgTmVYVCB0byBMYXRpbi9HcmVlayAqLworICAgIHhsZWZ0MTI4LAkJCS8qIDcsMTggQ1A0MzcgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4ODVhcywJCQkvKiA3LDE5IENQODUwIHRvIExhdGluL0dyZWVrICovCisgICAgeDUyYXMsCQkJLyogNywyMCBDUDg1MiB0byBMYXRpbi9HcmVlayAqLworICAgIHhhcWFzLAkJCS8qIDcsMjEgTWFjaW50b3NoIExhdGluIHRvIExhdGluL0dyZWVrICovCisgICAgeGRnYXMsCQkJLyogNywyMiBER0kgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4cjhhcywJCQkvKiA3LDIzIEhQIHRvIExhdGluL0dyZWVrICovCisgICAgeGxlZnQxNjAsICAgICAgICAgICAgICAgICAgIC8qIDcsMjQgTGF0aW4vQ3lyaWxsaWMgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4bGVmdDEyOCwgICAgICAgICAgICAgICAgICAgLyogNywyNSBDUDg2NiB0byBMYXRpbi9HcmVlayAqLworICAgIHhza2FzLCAgICAgICAgICAgICAgICAgICAgICAvKiA3LDI2IFNob3J0IEtPSSB0byBMYXRpbi9HcmVlayAqLworICAgIHhrOGFzLCAgICAgICAgICAgICAgICAgICAgICAvKiA3LDI3IE9sZCBLT0ktOCBDeXJpbGxpYyB0byBMYXRpbi9HcmVlayAqLworICAgIE5VTEwsCQkJLyogNywyOCBLYW5qaS4uLiAqLworICAgIE5VTEwsCQkJLyogNywyOSAqLworICAgIE5VTEwsCQkJLyogNywzMCAqLworICAgIE5VTEwsCQkJLyogNywzMSAqLworICAgIHhoN2FzLAkJCS8qIDcsMzIgSGVicmV3LTcgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICBOVUxMLAkJCS8qIDcsMzMgTGF0aW4vSGVicmV3IHRvIExhdGluL0dyZWVrICovCisgICAgeDYyYXMsCQkJLyogNywzNCBDUDg2MiBIZWJyZXcgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4ZWdsZywJCQkvKiA3LDM1IEVMT1QgOTI3IEdyZWVrIHRvIExhdGluL0dyZWVrICovCisgICAgTlVMTCwJCQkvKiA3LDM2IExhdGluL0dyZWVrIHRvIExhdGluL0dyZWVrICovCisgICAgeDY5bGcsCQkJLyogNywzNyBDUDg2OSB0byBMYXRpbi9HcmVlayAqLworICAgIHhsMWFzLAkJCS8qIDcsMzggbGF0aW4tOSB0byBMYXRpbi9HcmVlayAqLworICAgIHhsMWFzLAkJCS8qIDcsMzkgbGF0aW4tOSB0byBMYXRpbi9IZWJyZXcqLworICAgIHhsZWZ0MTI4LAkJCS8qIDcsNDAgQ1A4NTUgdG8gTGF0aW4vR3JlZWsgKi8KKyAgICB4bGVmdDEyOCwJCQkvKiA3LDQxIENQMTI1MSB0byBMYXRpbi9HcmVlayAqLworICAgIHhsZWZ0MTI4LAkJCS8qIDcsNDIgQnVsZ2FyaWFuIHRvIExhdGluL0dyZWVrICovCisgICAgeDEyNTBhcywJCQkvKiA3LDQzIENQMTI1MCB0byBMYXRpbi9HcmVlayAqLworICAgIHhtemFzLAkJCS8qIDcsNDQgTWF6b3ZpYSB0byBMYXRpbi9HcmVlayAqLworICAgIE5VTEwsCQkJLyogNyw0NSBVQ1MtMiB0byBMYXRpbi9HcmVlayAqLworICAgIE5VTEwsCQkJLyogNyw0NiBVVEYtOCB0byBMYXRpbi9HcmVlayAqLworICAgIE5VTEwsCQkJLyogNyw0NyBLT0k4UiB0byBMYXRpbi9HcmVlayAqLworICAgIE5VTEwsCQkJLyogNyw0OCBLT0k4VSB0byBMYXRpbi9HcmVlayAqLworICAgIHh3MWxnLAkJCS8qIDcsNDkgQ1AxMjUyIHRvIExhdGluL0dyZWVrICovCisgICAgTlVMTCwJCQkvKiA4LDAgdXMgYXNjaWkgdG8gbGF0aW4tOSAqLworICAgIHh1a2wxLAkJCS8qIDgsMSB1ayBhc2NpaSB0byBsYXRpbi05ICovCisgICAgeGR1bDEsCQkJLyogOCwyIGR1dGNoIG5yYyB0byBsYXRpbi05ICovCisgICAgeGZpbDEsCQkJLyogOCwzIGZpbm5pc2ggbnJjIHRvIGxhdGluLTkgKi8KKyAgICB4ZnJsMSwJCQkvKiA4LDQgZnJlbmNoIG5yYyB0byBsYXRpbi05ICovCisgICAgeGZjbDEsCQkJLyogOCw1IGZyZW5jaCBjYW5hZGlhbiBucmMgdG8gbGF0aW4tOSAqLworICAgIHhnZWwxLAkJCS8qIDgsNiBnZXJtYW4gbnJjIHRvIGxhdGluLTkgKi8KKyAgICB4aHVsMSwJCQkvKiA4LDcgaHVuZ2FyaWFuIG5yYyB0byBsYXRpbi05ICovCisgICAgeGl0bDEsCQkJLyogOCw4IGl0YWxpYW4gbnJjIHRvIGxhdGluLTkgKi8KKyAgICB4bm9sMSwJCQkvKiA4LDkgbm9yd2VnaWFuL2RhbmlzaCBucmMgdG8gbGF0aW4tOSAqLworICAgIHhwb2wxLAkJCS8qIDgsMTAgcG9ydHVndWVzZSBucmMgdG8gbGF0aW4tOSAqLworICAgIHhzcGwxLAkJCS8qIDgsMTEgc3BhbmlzaCBucmMgdG8gbGF0aW4tOSAqLworICAgIHhzd2wxLAkJCS8qIDgsMTIgc3dlZGlzaCBucmMgdG8gbGF0aW4tOSAqLworICAgIHhjaGwxLAkJCS8qIDgsMTMgc3dpc3MgbnJjIHRvIGxhdGluLTkgKi8KKyAgICBOVUxMLAkJCS8qIDgsMTQgbGF0aW4tMSB0byBsYXRpbi05ICovCisgICAgeGwybDksCQkJLyogOCwxNSBsYXRpbi0yIHRvIGxhdGluLTkgKi8KKyAgICB4ZG1sOSwJCQkvKiA4LDE2IGRlYyBtY3MgdG8gbGF0aW4tOSAqLworICAgIHhuZWw5LCAgICAgICAgICAgICAgICAgICAgICAvKiA4LDE3IE5lWFQgVG8gTGF0aW4tOSAqLworICAgIHg0M2wxLCAgICAgICAgICAgICAgICAgICAgICAvKiA4LDE4IENQNDM3IFRvIExhdGluLTkgKi8KKyAgICB4ODVsMSwgICAgICAgICAgICAgICAgICAgICAgLyogOCwxOSBDUDg1MCBUbyBMYXRpbi05ICovCisgICAgeDUybDEsICAgICAgICAgICAgICAgICAgICAgIC8qIDgsMjAgQ1A4NTIgVG8gTGF0aW4tOSAqLworICAgIHhhcWwxLCAgICAgICAgICAgICAgICAgICAgICAvKiA4LDIxIE1hY2ludG9zaCBMYXRpbiBUbyBMYXRpbi05ICovCisgICAgeGRnbDEsICAgICAgICAgICAgICAgICAgICAgIC8qIDgsMjIgREdJIFRvIExhdGluLTkgKi8KKyAgICB4cjhsMSwgICAgICAgICAgICAgICAgICAgICAgLyogOCwyMyBIUCBUbyBMYXRpbi05ICovCisgICAgeGxjYXMsICAgICAgICAgICAgICAgICAgICAgIC8qIDgsMjQgTGF0aW4vQ3lyaWxsaWMgVG8gTGF0aW4tOSAqLworICAgIHhhY2FzLCAgICAgICAgICAgICAgICAgICAgICAvKiA4LDI1IENQODY2IFRvIExhdGluLTkgKi8KKyAgICB4c2thcywgICAgICAgICAgICAgICAgICAgICAgLyogOCwyNiBTaG9ydCBLT0kgVG8gTGF0aW4tOSAqLworICAgIHhrOGFzLCAgICAgICAgICAgICAgICAgICAgICAvKiA4LDI3IE9sZCBLT0ktOCBDeXJpbGxpYyBUbyBMYXRpbi05ICovCisgICAgTlVMTCwJCQkvKiA4LDI4IEthbmppIC4uLiAqLworICAgIE5VTEwsCQkJLyogOCwyOSAqLworICAgIE5VTEwsCQkJLyogOCwzMCAqLworICAgIE5VTEwsCQkJLyogOCwzMSAqLworICAgIHhoN2FzLAkJCS8qIDgsMzIgSGVicmV3LTcgVG8gTGF0aW4tOSAqLworICAgIHhsaGwxLAkJCS8qIDgsMzMgTGF0aW4vSGVicmV3IFRvIExhdGluLTkgKi8KKyAgICB4NjJsMSwJCQkvKiA4LDM0IENQODYyIEhlYnJldyBUbyBMYXRpbi05ICovCisgICAgeGVnYXMsCQkJLyogOCwzNSBFTE9UIDkyNyBHcmVlayBUbyBMYXRpbi05ICovCisgICAgeGxnbDEsCQkJLyogOCwzNiBMYXRpbi9HcmVlayBUbyBMYXRpbi05ICovCisgICAgeGwxNjksCQkJLyogOCwzNyBDUDg2OSBUbyBMYXRpbi05ICovCisgICAgTlVMTCwJCQkvKiA4LDM4IExhdGluLTkgVG8gTGF0aW4tOSAqLworICAgIHg1OGw5LAkJCS8qIDgsMzkgY3A4NTggVG8gTGF0aW4tOSAqLworICAgIHg1NWFzLAkJCS8qIDgsNDAgY3A4NTUgVG8gTGF0aW4tOSAqLworICAgIHg1NWFzLAkJCS8qIDgsNDEgY3AxMjUxIFRvIExhdGluLTkgKi8KKyAgICB4bGVmdDEyOCwJCQkvKiA4LDQyIEJ1bGdhcmlhbiBUbyBMYXRpbi05ICovCisgICAgeDEyNTBsOSwJCQkvKiA4LDQzIENQMTI1MCBUbyBMYXRpbi05ICovCisgICAgeG16bDksCQkJLyogOCw0NCBNYXpvdmlhIFRvIExhdGluLTkgKi8KKyAgICBOVUxMLAkJCS8qIDgsNDUgVUNTLTIgdG8gTGF0aW4tOSAqLworICAgIE5VTEwsCQkJLyogOCw0NiBVVEYtOCB0byBMYXRpbi05ICovCisgICAgTlVMTCwJCQkvKiA4LDQ3IEtPSThSIHRvIExhdGluLTkgKi8KKyAgICBOVUxMLAkJCS8qIDgsNDggS09JOFUgdG8gTGF0aW4tOSAqLworICAgIHh3MWw5LAkJCS8qIDgsNDkgQ1AxMjUyIHRvIExhdGluLTkgKi8KKyAgICBOVUxMLAkJCS8qIDksMDAgVW5pY29kZS4uLiAqLworICAgIE5VTEwsCQkJLyogOSwwMSAqLworICAgIE5VTEwsCQkJLyogOSwwMiAqLworICAgIE5VTEwsCQkJLyogOSwwMyAqLworICAgIE5VTEwsCQkJLyogOSwwNCAqLworICAgIE5VTEwsCQkJLyogOSwwNSAqLworICAgIE5VTEwsCQkJLyogOSwwNiAqLworICAgIE5VTEwsCQkJLyogOSwwNyAqLworICAgIE5VTEwsCQkJLyogOSwwOCAqLworICAgIE5VTEwsCQkJLyogOSwwOSAqLworICAgIE5VTEwsCQkJLyogOSwxMCAqLworICAgIE5VTEwsCQkJLyogOSwxMSAqLworICAgIE5VTEwsCQkJLyogOSwxMiAqLworICAgIE5VTEwsCQkJLyogOSwxMyAqLworICAgIE5VTEwsCQkJLyogOSwxNCAqLworICAgIE5VTEwsCQkJLyogOSwxNSAqLworICAgIE5VTEwsCQkJLyogOSwxNiAqLworICAgIE5VTEwsCQkJLyogOSwxNyAqLworICAgIE5VTEwsCQkJLyogOSwxOCAqLworICAgIE5VTEwsCQkJLyogOSwxOSAqLworICAgIE5VTEwsCQkJLyogOSwyMCAqLworICAgIE5VTEwsCQkJLyogOSwyMSAqLworICAgIE5VTEwsCQkJLyogOSwyMiAqLworICAgIE5VTEwsCQkJLyogOSwyMyAqLworICAgIE5VTEwsCQkJLyogOSwyNCAqLworICAgIE5VTEwsCQkJLyogOSwyNSAqLworICAgIE5VTEwsCQkJLyogOSwyNiAqLworICAgIE5VTEwsCQkJLyogOSwyNyAqLworICAgIE5VTEwsCQkJLyogOSwyOCAqLworICAgIE5VTEwsCQkJLyogOSwyOSAqLworICAgIE5VTEwsCQkJLyogOSwzMCAqLworICAgIE5VTEwsCQkJLyogOSwzMSAqLworICAgIE5VTEwsCQkJLyogOSwzMiAqLworICAgIE5VTEwsCQkJLyogOSwzMyAqLworICAgIE5VTEwsCQkJLyogOSwzNCAqLworICAgIE5VTEwsCQkJLyogOSwzNSAqLworICAgIE5VTEwsCQkJLyogOSwzNiAqLworICAgIE5VTEwsCQkJLyogOSwzNyAqLworICAgIE5VTEwsCQkJLyogOSwzOCAqLworICAgIE5VTEwsCQkJLyogOSwzOSAqLworICAgIE5VTEwsCQkJLyogOSw0MCAqLworICAgIE5VTEwsCQkJLyogOSw0MSAqLworICAgIE5VTEwsCQkJLyogOSw0MiAqLworICAgIE5VTEwsCQkJLyogOSw0MyAqLworICAgIE5VTEwsCQkJLyogOSw0NCAqLworICAgIE5VTEwsCQkJLyogOSw0NSAqLworICAgIE5VTEwsCQkJLyogOSw0NiAqLworICAgIE5VTEwsCQkJLyogOSw0NyAqLworICAgIE5VTEwsCQkJLyogOSw0OCAqLworICAgIE5VTEwsCQkJLyogOSw0OSAqLworICAgIE5VTEwsCQkJLyogMTAsMDAgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDAxICovCisgICAgTlVMTCwJCQkvKiAxMCwwMiAqLworICAgIE5VTEwsCQkJLyogMTAsMDMgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDA0ICovCisgICAgTlVMTCwJCQkvKiAxMCwwNSAqLworICAgIE5VTEwsCQkJLyogMTAsMDYgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDA3ICovCisgICAgTlVMTCwJCQkvKiAxMCwwOCAqLworICAgIE5VTEwsCQkJLyogMTAsMDkgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDEwICovCisgICAgTlVMTCwJCQkvKiAxMCwxMSAqLworICAgIE5VTEwsCQkJLyogMTAsMTIgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDEzICovCisgICAgTlVMTCwJCQkvKiAxMCwxNCAqLworICAgIE5VTEwsCQkJLyogMTAsMTUgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDE2ICovCisgICAgTlVMTCwJCQkvKiAxMCwxNyAqLworICAgIE5VTEwsCQkJLyogMTAsMTggKi8KKyAgICBOVUxMLAkJCS8qIDEwLDE5ICovCisgICAgTlVMTCwJCQkvKiAxMCwyMCAqLworICAgIE5VTEwsCQkJLyogMTAsMjEgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDIyICovCisgICAgTlVMTCwJCQkvKiAxMCwyMyAqLworICAgIE5VTEwsCQkJLyogMTAsMjQgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDI1ICovCisgICAgTlVMTCwJCQkvKiAxMCwyNiAqLworICAgIE5VTEwsCQkJLyogMTAsMjcgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDI4ICovCisgICAgTlVMTCwJCQkvKiAxMCwyOSAqLworICAgIE5VTEwsCQkJLyogMTAsMzAgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDMxICovCisgICAgTlVMTCwJCQkvKiAxMCwzMiAqLworICAgIE5VTEwsCQkJLyogMTAsMzMgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDM0ICovCisgICAgTlVMTCwJCQkvKiAxMCwzNSAqLworICAgIE5VTEwsCQkJLyogMTAsMzYgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDM3ICovCisgICAgTlVMTCwJCQkvKiAxMCwzOCAqLworICAgIE5VTEwsCQkJLyogMTAsMzkgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDQwICovCisgICAgTlVMTCwJCQkvKiAxMCw0MSAqLworICAgIE5VTEwsCQkJLyogMTAsNDIgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDQzICovCisgICAgTlVMTCwJCQkvKiAxMCw0NCAqLworICAgIE5VTEwsCQkJLyogMTAsNDUgKi8KKyAgICBOVUxMLAkJCS8qIDEwLDQ2ICovCisgICAgTlVMTCwJCQkvKiAxMCw0NyAqLworICAgIE5VTEwsCQkJLyogMTAsNDggKi8KKyAgICBOVUxMCQkJLyogMTAsNDkgKi8KK307CitpbnQgbnhscyA9IChzaXplb2YoeGxzKSAvIHNpemVvZihDSEFSICopKTsKKworI2lmbmRlZiBOT0xPQ0FMCisvKgorICBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFyZSB1c2VmdWwgb25seSBmb3IgdGVybWluYWwgY2hhcmFjdGVyIHNldHMsIGFuZCBzbworICBpZmRlZidkIG91dCBmb3IgTk9MT0NBTCBjb21waWxhdGlvbnMuCisqLworCisvKgorICBDIFMgXyBJIFMgXyBOIFIgQworCisgIFJldHVybnMgbm9uemVybyBpZiBhcmd1bWVudCBpbmRpY2F0ZXMgYSA3LWJpdCBuYXRpb25hbCBjaGFyYWN0ZXIgc2V0LAorICB6ZXJvIG90aGVyd2lzZS4KKyovCitpbnQKK2NzX2lzX25yYyh4KSBpbnQgeDsgeworI2lmZGVmIFVOSUNPREUKKyAgICBpZiAoeCA9PSBUWF9KMjAxUiB8fCB4ID09IFRYX0RFQ1NQRUMgfHwgeCA9PSBUWF9ERUNURUNICisgICAgICAgIHx8IHR4cmluZm9beF0gPT0gTlVMTCkKKyAgICAgIHJldHVybigwKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odHhyaW5mb1t4XS0+ZmxhZ3MgJiBYMlVfU1REICYmIHR4cmluZm9beF0tPnNpemUgPT0gOTQpOworI2Vsc2UgLyogVU5JQ09ERSAqLworICAgIGlmICgoY3Nfc2l6ZSh4KSA9PSA5NCkpCisgICAgICByZXR1cm4oMSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKDApOworI2VuZGlmIC8qIFVOSUNPREUgKi8KK30KKworLyoKKyAgQyBTIF8gSSBTIF8gUyBUIEQKKworICBSZXR1cm5zIG5vbnplcm8gaWYgYXJndW1lbnQgaW5kaWNhdGVzIGFuIElTTyA0ODczLXN0YW5kYXJkLWZvcm1hdAorICBjaGFyYWN0ZXIgc2V0LCBpLmUuIG9uZSBpbiB3aGljaCB0aGUgY29udHJvbCByZWdpb24gaXMgTk9UIHVzZWQgZm9yCisgIGdyYXBoaWNzOyB6ZXJvIG90aGVyd2lzZS4KKyovCitpbnQKK2NzX2lzX3N0ZCh4KSBpbnQgeDsgeworI2lmZGVmIFVOSUNPREUKKyAgICBpZiAoIXR4cmluZm9beF0pCQkJLyogRXZlbiBtb3JlIHNhZmV0eSAqLworICAgICAgcmV0dXJuKDApOworICAgIGVsc2UgaWYgKHR4cmluZm9beF0tPnNpemUgPT0gMTI4KQkvKiBKdXN0IGZvciBzYWZldHkgKi8KKyAgICAgIHJldHVybigwKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4odHhyaW5mb1t4XS0+ZmxhZ3MgJiBYMlVfU1REKTsgLyogT25seSB0aGlzIHNob3VsZCBiZSBuZWVkZWQgKi8KKyNlbHNlCisgICAgc3dpdGNoICh4KSB7CisgICAgICBjYXNlIEZDX0NQNDM3OgkJCS8qIENvZGUgcGFnZXMgdXNlIEMxIGdyYXBoaWNzICovCisgICAgICBjYXNlIEZDX0NQODUwOgorICAgICAgY2FzZSBGQ19DUDg1MjoKKyAgICAgIGNhc2UgRkNfQ1A4NjI6CisgICAgICBjYXNlIEZDX0NQODY2OgorICAgICAgY2FzZSBGQ19DUDg2OToKKyAgICAgIGNhc2UgRkNfQ1A4NTg6CisgICAgICBjYXNlIEZDX0FQUFFEOgkJCS8qIFNvIGRvIEFwcGxlIGFuZCBOZVhUU1RFUCAqLworICAgICAgY2FzZSBGQ19ORVhUOgorCXJldHVybigwKTsKKyAgICAgIGRlZmF1bHQ6CQkJCS8qIE90aGVycyBiZWhhdmUgKi8KKwlyZXR1cm4oMSk7CisgICAgfQorI2VuZGlmIC8qIENLT1VJTkkgKi8KK30KKworaW50Citjc19zaXplKHgpIGludCB4OyB7CisjaWZkZWYgVU5JQ09ERQorICAgIGlmICghdHhyaW5mb1t4XSkKKyAgICAgIHJldHVybigxMjgpOworICAgIHJldHVybih0eHJpbmZvW3hdLT5zaXplKTsKKyNlbHNlCisgICAgc3dpdGNoKHgpIHsKKyAgICAgIGNhc2UgRkNfVVNBU0NJSToKKyAgICAgIGNhc2UgRkNfVUtBU0NJSToKKyAgICAgIGNhc2UgRkNfRFVBU0NJSToKKyAgICAgIGNhc2UgRkNfRklBU0NJSToKKyAgICAgIGNhc2UgRkNfRlJBU0NJSToKKyAgICAgIGNhc2UgRkNfRkNBU0NJSToKKyAgICAgIGNhc2UgRkNfR0VBU0NJSToKKyAgICAgIGNhc2UgRkNfSFVBU0NJSToKKyAgICAgIGNhc2UgRkNfSVRBU0NJSToKKyAgICAgIGNhc2UgRkNfTk9BU0NJSToKKyAgICAgIGNhc2UgRkNfUE9BU0NJSToKKyAgICAgIGNhc2UgRkNfU1BBU0NJSToKKyAgICAgIGNhc2UgRkNfU1dBU0NJSToKKyAgICAgIGNhc2UgRkNfQ0hBU0NJSToKKyAgICAgIGNhc2UgRkNfS09JNzoKKyAgICAgIGNhc2UgRkNfSEU3OgorICAgICAgY2FzZSBGQ19FTE9UOgorCXJldHVybig5NCk7CisKKyAgICAgIGNhc2UgRkNfMUxBVElOOgorICAgICAgY2FzZSBGQ18yTEFUSU46CisgICAgICBjYXNlIEZDX0RFQ01DUzoKKyAgICAgIGNhc2UgRkNfREdNQ1M6CisgICAgICBjYXNlIEZDX0hQUjg6CisgICAgICBjYXNlIEZDX0NZUklMTDoKKyAgICAgIGNhc2UgRkNfS09JODoKKyAgICAgIGNhc2UgRkNfSEVCUkVXOgorICAgICAgY2FzZSBGQ19HUkVFSzoKKyAgICAgIGNhc2UgRkNfOUxBVElOOgorCXJldHVybig5Nik7CisKKyAgICAgIGNhc2UgRkNfTkVYVDoKKyAgICAgIGNhc2UgRkNfQ1A0Mzc6CisgICAgICBjYXNlIEZDX0NQODUwOgorICAgICAgY2FzZSBGQ19DUDg1MjoKKyAgICAgIGNhc2UgRkNfQ1A4NTU6CisgICAgICBjYXNlIEZDX0NQODYyOgorICAgICAgY2FzZSBGQ19DUDg2NjoKKyAgICAgIGNhc2UgRkNfQ1AxMjUxOgorICAgICAgY2FzZSBGQ19BUFBRRDoKKwlyZXR1cm4oMTI4KTsKKyNpZmRlZiBLQU5KSQorICAgICAgY2FzZSBGQ19KSVM3OgorCXJldHVybigtOTQpOworICAgICAgY2FzZSBGQ19TSEpJUzoKKwlyZXR1cm4oLTEyOCk7CisgICAgICBjYXNlIEZDX0pFVUM6CisgICAgICBjYXNlIEZDX0pERUM6CisJcmV0dXJuKC05Nik7CisjZW5kaWYgLyogS0FOSkkgKi8KKyAgICAgIGNhc2UgRkNfQ1A4NTg6CisgICAgICBkZWZhdWx0OgorCXJldHVybigtMSk7CisgICAgfQorI2VuZGlmIC8qIFVOSUNPREUgKi8KK30KKyNlbmRpZiAvKiBOT0xPQ0FMICovCisKKy8qCisgIFMgRSBUIFggTCBBIFQgWSBQIEUgIC0tICBTZXQgVHJhbnNsYXRpb24gVHlwZQorCisgIFNldHMgZ2xvYmFsIHhsYXR5cGUgdG8gaW5kaWNhdGUgd2hpY2gga2luZCBvZiB0cmFuc2xhdGlvbjoKKworICAgIFhMQV9OT05FICAgICAgTm8gdHJhbnNsYXRpb24KKyAgICBYTEFfQllURSAgICAgIEJ5dGUtZm9yLUJ5dGUgdHJhbnNsYXRpb24KKyAgICBYTEFfSkFQQU4gICAgIEphcGFuZXNlIEthbmppIHRyYW5zbGF0aW9uCisgICAgWExBX1VOSUNPREUgICBVbmljb2RlIHRyYW5zbGF0aW9ucworCisgIEFuZCBzZXRzIHVwIHRoZSBhcHByb3ByaWF0ZSB0cmFuc2xhdGlvbiBmdW5jdGlvbiBwb2ludGVycyBhcyBmb2xsb3dzOgorCisgIEZvciBubyB0cmFuc2xhdGlvbjoKKyAgICBBbGwgZnVuY3Rpb24gcG9pbnRlcnMgYXJlIE5VTEwuCisKKyAgRm9yIEJ5dGUtZm9yLUJ5dGUgdHJhbnNhdGlvbjoKKyAgICByeCAgPSBUQ1MgdG8gRkNTICh0aGVzZSBmdW5jdGlvbnMgYXJlIGluIHRoaXMgbW9kdWxlLi4uKQorICAgIHN4ICA9IEZDUyB0byBUQ1MKKworICBGb3IgVW5pY29kZSB0cmFuc2xhdGlvbnM6CisgICAgeGZ1ID0gRkNTIHRvIFVDUyAodGhlc2UgZnVuY3Rpb25zIGFyZSBpbiBja2N1bmkuYy4uLikKKyAgICB4dHUgPSBUQ1MgdG8gVUNTCisgICAgeHVmID0gVUNTIHRvIEZDUworICAgIHh1dCA9IFVDUyB0byBUQ1MKKyovCitWT0lECitzZXR4bGF0eXBlKHRjcywgZmNzKSBpbnQgdGNzLCBmY3M7IHsKKyNpZmRlZiBVTklDT0RFCisgICAgeGZ1ID0gTlVMTDsJCQkJLyogVW5pY29kZSA8LT4gVENTL0ZDUyBmdW5jdGlvbnMgKi8KKyAgICB4dHUgPSBOVUxMOworICAgIHh1ZiA9IE5VTEw7CisgICAgeHV0ID0gTlVMTDsKKyNlbmRpZiAvKiBVTklDT0RFICovCisgICAgcnggPSBzeCA9IE5VTEw7CisgICAgZGVidWcoRjEwMSwic2V0eGxhdHlwZSBmY3MiLCIiLGZjcyk7CisgICAgZGVidWcoRjEwMSwic2V0eGxhdHlwZSB0Y3MiLCIiLHRjcyk7CisKKyAgICBpZiAodGNzIDwgMCB8fCB0Y3MgPiBNQVhUQ1NFVFMpIHsKKwlkZWJ1ZyhGMTAxLCJzZXR4bGF0eXBlIGJhZCB0Y3MiLCIiLHRjcyk7CisJcmV0dXJuOworICAgIH0KKyAgICBpZiAoZmNzIDwgMCB8fCBmY3MgPiBNQVhGQ1NFVFMpIHsKKwlkZWJ1ZyhGMTAxLCJzZXR4bGF0eXBlIGJhZCBmY3MiLCIiLGZjcyk7CisJcmV0dXJuOworICAgIH0KKyAgICBpZiAodGNzID09IFRDX1RSQU5TUCB8fCB4ZnJ4bGEgPT0gMCkgeyAvKiBUcmFuc2ZlciBjaGFyc2V0IFRSQU5TUEFSRU5UICovCisJZGVidWcoRjEwMSwic2V0eGxhdHlwZSB0cmFuc3BhcmVudCBiZWNhdXNlIFRDUz09VHJhbnNwYXJlbnQiLCIiLHRjcyk7CisJeGxhdHlwZSA9IFhMQV9OT05FOwkJLyogVHJhbnNsYXRpb24gdHlwZSBpcyBOb25lICovCisjaWZkZWYgVU5JQ09ERQorICAgIC8qIElmIGFueSBvZiBvdXIgY2hhcnNldHMgaXMgVW5pY29kZSB3ZSB1c2UgVW5pY29kZSBmdW5jdGlvbnMgKi8KKyAgICAvKiBldmVuIGlmIFRDUyBhbmQgRkNTIGFyZSB0aGUgc2FtZSBiZWNhdXNlIG9mIEJPTSBhbmQgYnl0ZSBzd2FwcGluZyAqLworICAgIH0gZWxzZSBpZiAodGNzID09IFRDX1VDUzIgfHwgdGNzID09IFRDX1VURjggfHwKKwkgICAgICAgZmNzID09IEZDX1VDUzIgfHwgZmNzID09IEZDX1VURjgpIHsKKwlkZWJ1ZyhGMTAxLCJzZXR4bGF0eXBlIFVuaWNvZGUgdGNzIiwiIix0Y3MpOworCWRlYnVnKEYxMDEsInNldHhsYXR5cGUgVW5pY29kZSBmY3MiLCIiLGZjcyk7CisJLyogVW5pY29kZSA8LT4gVENTL0ZDUyBmdW5jdGlvbnMgKi8KKwl4ZnUgPSB4bF9mY3VbZmNzXTsJCS8qIEZDUyAtPiBVQ1MgKi8KKwl4dHUgPSB4bF90Y3VbdGNzXTsJCS8qIFRDUyAtPiBVQ1MgKi8KKwl4dWYgPSB4bF91ZmNbZmNzXTsJCS8qIFVDUyAtPiBGQ1MgKi8KKwl4dXQgPSB4bF91dGNbdGNzXTsJCS8qIFVDUyAtPiBUQ1MgKi8KKyAgICAgICAgeGxhdHlwZSA9IFhMQV9VTklDT0RFOwkJLyogVHJhbnNsYXRpb24gdHlwZSBpcyBVbmljb2RlICovCisjaWZkZWYgQ09NTUVOVAorCS8qIFRoZXNlIG1ha2UgdHJvdWJsZSBpbiA2NC1iaXQgbGFuZCAqLworCWRlYnVnKEYwMDEsInNldHhsYXR5cGUgVW5pY29kZSB4ZnUiLCIiLCh1bnNpZ25lZCl4ZnUpOworCWRlYnVnKEYwMDEsInNldHhsYXR5cGUgVW5pY29kZSB4dWYiLCIiLCh1bnNpZ25lZCl4dWYpOworI2VuZGlmIC8qIENPTU1FTlQgKi8KKyNlbmRpZiAvKiBVTklDT0RFICovCisgICAgfSBlbHNlIGlmIChjc2VxdGFiW3Rjc10gPT0gZmNzKSB7CS8qIE9yIGlmIFRDUyA9PSBGQ1MgKi8KKwlkZWJ1ZyhGMTAxLCJzZXR4bGF0eXBlIHRyYW5zcGFyZW50IGJlY2F1c2UgVENTPT1GQ1MiLCIiLHRjcyk7CisJeGxhdHlwZSA9IFhMQV9OT05FOwkJLyogdHJhbnNsYXRpb24gdHlwZSBpcyBhbHNvIE5vbmUgKi8KKyNpZmRlZiBLQU5KSQorICAgIC8qIE90aGVyd2lzZSBpZiBhbnkgb2YgdGhlbSBpcyBKYXBhbmVzZSwgd2UgdXNlIEthbmppIGZ1bmN0aW9ucyAqLworICAgIH0gZWxzZSBpZiAodGNzID09IFRDX0pFVUMgfHwgZmNzaW5mb1tmY3NdLmFscGhhYmV0ID09IEFMX0pBUEFOKSB7CisJZGVidWcoRjEwMSwic2V0eGxhdHlwZSBKYXBhbmVzZSB0Y3MiLCIiLHRjcyk7CisJZGVidWcoRjEwMSwic2V0eGxhdHlwZSBKYXBhbmVzZSBmY3MiLCIiLGZjcyk7CisgICAgICAgIHhsYXR5cGUgPSBYTEFfSkFQQU47CQkvKiBUcmFuc2xhdGlvbiB0eXBlIGlzIEphcGFuZXNlICovCisjZW5kaWYgLyogS0FOSkkgKi8KKyAgICAvKiBPdGhlcndpc2Ugd2UgdXNlIGJ5dGUgZnVuY3Rpb25zICovCisgICAgfSBlbHNlIHsJCQkJLyogT3RoZXJ3aXNlLi4uICovCisJcnggPSB4bHJbdGNzXVtmY3NdOwkJLyogSW5wdXQgdHJhbnNsYXRpb24gZnVuY3Rpb24gKi8KKwlzeCA9IHhsc1t0Y3NdW2Zjc107CQkvKiBPdXRwdXQgdHJhbnNsYXRpb24gZnVuY3Rpb24gKi8KKwlkZWJ1ZyhGMTAxLCJzZXR4bGF0eXBlIEJ5dGUgdGNzIiwiIix0Y3MpOworCWRlYnVnKEYxMDEsInNldHhsYXR5cGUgQnl0ZSBmY3MiLCIiLGZjcyk7CisgICAgICAgIHhsYXR5cGUgPSBYTEFfQllURTsJCS8qIFRyYW5zbGF0aW9uIHR5cGUgaXMgQnl0ZSAqLworICAgIH0KKyAgICBkZWJ1ZyhGMTAxLCJzZXR4bGF0eXBlIHhsYXR5cGUiLCIiLHhsYXR5cGUpOworfQorCisvKiBTZXQgdXAgdHJhbnNsYXRpb24gYmV0d2VlbiB0d28gZmlsZSBjaGFyYWN0ZXIgc2V0cyB3aXRoIFVDUyBpbnRlcm1lZGlhdGUgKi8KKworI2lmZGVmIFVOSUNPREUKK1ZPSUQKK2luaXR4bGF0ZShjc2luLCBjc291dCkgaW50IGNzaW4sIGNzb3V0OyB7CisgICAgeGZ1ID0gTlVMTDsKKyAgICB4dHUgPSBOVUxMOworICAgIHh1ZiA9IE5VTEw7CisgICAgeHV0ID0gTlVMTDsKKworICAgIGRlYnVnKEYxMDEsImluaXR4bGF0ZSBjc2luIiwiIixjc2luKTsKKyAgICBkZWJ1ZyhGMTAxLCJpbml0eGxhdGUgY3NvdXQiLCIiLGNzb3V0KTsKKworICAgIGlmIChjc2luIDwgMCB8fCBjc2luID4gTUFYRkNTRVRTKSB7CisJZGVidWcoRjEwMSwiaW5pdHhsYXRlIGJhZCBjc2luIiwiIixjc2luKTsKKwlyZXR1cm47CisgICAgfQorICAgIGlmIChjc291dCA8IDAgfHwgY3NvdXQgPiBNQVhGQ1NFVFMpIHsKKwlkZWJ1ZyhGMTAxLCJpbml0eGxhdGUgYmFkIGNzb3V0IiwiIixjc291dCk7CisJcmV0dXJuOworICAgIH0KKyAgICBpZiAoY3NpbiA9PSBjc291dCAmJiBjc2luICE9IEZDX1VDUzIpIHsKKwl4bGF0eXBlID0gWExBX05PTkU7CQkvKiBUcmFuc2xhdGlvbiB0eXBlIGlzIE5vbmUgKi8KKwlyZXR1cm47CisgICAgfQorICAgIHhsYXR5cGUgPSBYTEFfVU5JQ09ERTsJCS8qIFRyYW5zbGF0aW9uIHR5cGUgaXMgVW5pY29kZSAqLworICAgIHhmdSA9IHhsX2ZjdVtjc2luXTsJCQkvKiBGQ1MgLT4gVUNTICovCisgICAgeHVmID0geGxfdWZjW2Nzb3V0XTsJCS8qIFVDUyAtPiBGQ1MgKi8KKyAgICB4cG5ieXRlKC0xLDAsMCxOVUxMKTsJCS8qIFJlc2V0IFVDUy0yICovCisjaWZkZWYgQ09NTUVOVAorICAgIGRlYnVnKEYwMDEsImluaXR4bGF0ZSBVbmljb2RlIHhmdSIsIiIsKHVuc2lnbmVkKXhmdSk7CisgICAgZGVidWcoRjAwMSwiaW5pdHhsYXRlIFVuaWNvZGUgeHVmIiwiIiwodW5zaWduZWQpeHVmKTsKKyNlbmRpZiAvKiBDT01NRU5UICovCisgICAgZGVidWcoRjEwMSwiaW5pdHhsYXRlIHhsYXR5cGUiLCIiLHhsYXR5cGUpOworfQorI2VuZGlmIC8qIFVOSUNPREUgKi8KKworaW50IGNzZXRzaW5pdGVkID0gMDsKKworVk9JRAoraW5pdGNzZXRzKCkgewkJCQkvKiBSb3V0aW5lIHRvIHJlc2V0IG9yIGluaXRpYWxpemUgKi8KKyAgICBpbnQgaTsJCQkJLyogY2hhcmFjdGVyLXNldCBhc3NvY2lhdGlvbnMuICovCisKKyNpZmRlZiBVTklDT0RFCisgICAgaWYgKHVjc29yZGVyIDwgMCkJCQkvKiBGb3IgY3JlYXRpbmcgVUNTLTIgZmlsZXMuICovCisgICAgICB1Y3NvcmRlciA9IGJ5dGVvcmRlcjsKKyAgICBpZiAodWNzb3JkZXIgPCAwKQorICAgICAgdWNzb3JkZXIgPSAwOworICAgIGlmIChmaWxlb3JkZXIgPCAwKQkJCS8qIEZvciByZWFkaW5nIFVDUy0yIGZpbGVzLiAqLworICAgICAgZmlsZW9yZGVyID0gdWNzb3JkZXI7CisjZW5kaWYgLyogVU5JQ09ERSAqLworCisgICAgZGVidWcoRjEwMSwiaW5pdGNzZXRzIG54bHMiLCIiLG54bHMpOworICAgIGRlYnVnKEYxMDEsImluaXRjc2V0cyBueGxyIiwiIixueGxyKTsKKworICAgIGRlYnVnKEYxMDEsImluaXRjc2V0cyBURVJNIExPQ0FMIENTRVQiLCIiLHRjc2wpOworICAgIGRlYnVnKEYxMDEsImluaXRjc2V0cyBURVJNIFJFTU9URSBDU0VUIiwiIix0Y3NyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYRkNTRVRTOyBpKyspCS8qIEZpcnN0IGNsZWFyIHRoZW0gYWxsLi4uICovCisgICAgICBhZmNzZXRbaV0gPSAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IE1BWFRDU0VUUzsgaSsrKQorICAgICAgYXhjc2V0W2ldID0gLTE7CisKKyAgICAvKiBOb3cgc2V0IHNwZWNpZmljIGRlZmF1bHRzIGZvciBpbmNvbWluZyBmaWxlcyAqLworCisgICAgeGxhdHlwZSA9IFhMQV9OT05FOworCisgICAgYXhjc2V0W1RDX1RSQU5TUF0gID0gRkNfVFJBTlNQOworICAgIGF4Y3NldFtUQ19VU0FTQ0lJXSA9IEZDX1VTQVNDSUk7CisKKyNpZmRlZiBPUzIKKyAgICBzd2l0Y2ggKGZjaGFyc2V0KSB7CisgICAgICBjYXNlIEZDX0NQODUwOgorICAgICAgY2FzZSBGQ19DUDg1ODoKKyAgICAgIGNhc2UgRkNfQ1A0Mzc6CisgICAgICBjYXNlIEZDXzFMQVRJTjoKKwlheGNzZXRbVENfMUxBVElOXSAgPSBmY2hhcnNldDsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJYXhjc2V0W1RDXzFMQVRJTl0gID0gRkNfQ1A4NTA7CisgICAgfQorI2Vsc2UKKyNpZmRlZiBIUFVYCisgICAgYXhjc2V0W1RDXzFMQVRJTl0gID0gRkNfSFBSODsKKyNlbHNlCisjaWZkZWYgVk1TCisgICAgYXhjc2V0W1RDXzFMQVRJTl0gID0gRkNfREVDTUNTOworI2Vsc2UKKyNpZmRlZiBORVhUCisgICAgYXhjc2V0W1RDXzFMQVRJTl0gID0gRkNfTkVYVDsKKyNlbHNlCisjaWZkZWYgZGF0YWdlbmVyYWwKKyAgICBheGNzZXRbVENfMUxBVElOXSAgPSBGQ19ER01DUzsKKyNlbHNlCisgICAgLyogU2hvdWxkIHdlIHVzZSBjb2RlIHBhZ2VzIG9uIHNvbWUgUEMgYmFzZWQgVU5JWGVzPyAqLworICAgIGF4Y3NldFtUQ18xTEFUSU5dICA9IEZDXzFMQVRJTjsKKyNlbmRpZiAvKiBkYXRhZ2VuZXJhbCAqLworI2VuZGlmIC8qIE5FWFQgKi8KKyNlbmRpZiAvKiBWTVMgKi8KKyNlbmRpZiAvKiBIUFVYICovCisjZW5kaWYgLyogT1MyICovCisKKyNpZmRlZiBPUzIKKyAgICBheGNzZXRbVENfMkxBVElOXSAgPSBGQ19DUDg1MjsKKyAgICBheGNzZXRbVENfQ1lSSUxMXSAgPSBGQ19DUDg2NjsKKyAgICBheGNzZXRbVENfSkVVQ10gICAgPSBGQ19TSEpJUzsKKyAgICBheGNzZXRbVENfSEVCUkVXXSAgPSBGQ19DUDg2MjsKKyAgICBheGNzZXRbVENfR1JFRUtdICAgPSBGQ19DUDg2OTsKKyAgICBheGNzZXRbVENfOUxBVElOXSAgPSBGQ19DUDg1ODsKKyAgICBheGNzZXRbVENfVUNTMl0gICAgPSBGQ19VQ1MyOworICAgIGF4Y3NldFtUQ19VVEY4XSAgICA9IEZDX1VDUzI7CisjZWxzZQorICAgIGF4Y3NldFtUQ18yTEFUSU5dICA9IEZDXzJMQVRJTjsKKyAgICBheGNzZXRbVENfQ1lSSUxMXSAgPSBGQ19DWVJJTEw7CisgICAgYXhjc2V0W1RDX0pFVUNdICAgID0gRkNfSkVVQzsKKyAgICBheGNzZXRbVENfSEVCUkVXXSAgPSBGQ19IRUJSRVc7CisgICAgYXhjc2V0W1RDX0dSRUVLXSAgID0gRkNfR1JFRUs7CisgICAgYXhjc2V0W1RDXzlMQVRJTl0gID0gRkNfOUxBVElOOworICAgIGF4Y3NldFtUQ19VQ1MyXSAgICA9IEZDX1VURjg7CisgICAgYXhjc2V0W1RDX1VURjhdICAgID0gRkNfVVRGODsKKyNlbmRpZiAvKiBPUzIgKi8KKworICAgIC8qIEFuZCBmb3Igb3V0Ym91bmQgZmlsZXMgKi8KKworICAgIGFmY3NldFtGQ19VU0FTQ0lJXSA9IFRDX1VTQVNDSUk7CisgICAgYWZjc2V0W0ZDX1VLQVNDSUldID0gVENfMUxBVElOOworICAgIGFmY3NldFtGQ19EVUFTQ0lJXSA9IFRDXzFMQVRJTjsKKyAgICBhZmNzZXRbRkNfRklBU0NJSV0gPSBUQ18xTEFUSU47CisgICAgYWZjc2V0W0ZDX0ZSQVNDSUldID0gVENfMUxBVElOOworICAgIGFmY3NldFtGQ19GQ0FTQ0lJXSA9IFRDXzFMQVRJTjsKKyAgICBhZmNzZXRbRkNfR0VBU0NJSV0gPSBUQ18xTEFUSU47CisgICAgYWZjc2V0W0ZDX0hVQVNDSUldID0gVENfMkxBVElOOworICAgIGFmY3NldFtGQ19JVEFTQ0lJXSA9IFRDXzFMQVRJTjsKKyAgICBhZmNzZXRbRkNfTk9BU0NJSV0gPSBUQ18xTEFUSU47CisgICAgYWZjc2V0W0ZDX1BPQVNDSUldID0gVENfMUxBVElOOworICAgIGFmY3NldFtGQ19TUEFTQ0lJXSA9IFRDXzFMQVRJTjsKKyAgICBhZmNzZXRbRkNfU1dBU0NJSV0gPSBUQ18xTEFUSU47CisgICAgYWZjc2V0W0ZDX0NIQVNDSUldID0gVENfMUxBVElOOworICAgIGFmY3NldFtGQ18xTEFUSU5dICA9IFRDXzFMQVRJTjsKKyAgICBhZmNzZXRbRkNfMkxBVElOXSAgPSBUQ18yTEFUSU47CisgICAgYWZjc2V0W0ZDX0RFQ01DU10gID0gVENfMUxBVElOOworICAgIGFmY3NldFtGQ19ORVhUXSAgICA9IFRDXzFMQVRJTjsKKyAgICBhZmNzZXRbRkNfQ1A0MzddICAgPSBUQ18xTEFUSU47CisgICAgYWZjc2V0W0ZDX0NQODUwXSAgID0gVENfMUxBVElOOworICAgIGFmY3NldFtGQ19DUDg1Ml0gICA9IFRDXzJMQVRJTjsKKyAgICBhZmNzZXRbRkNfQVBQUURdICAgPSBUQ18xTEFUSU47CisgICAgYWZjc2V0W0ZDX0RHTUNTXSAgID0gVENfMUxBVElOOworICAgIGFmY3NldFtGQ19IUFI4XSAgICA9IFRDXzFMQVRJTjsKKyAgICBhZmNzZXRbRkNfQ1lSSUxMXSAgPSBUQ19DWVJJTEw7CisgICAgYWZjc2V0W0ZDX0NQODY2XSAgID0gVENfQ1lSSUxMOworICAgIGFmY3NldFtGQ19LT0k3XSAgICA9IFRDX0NZUklMTDsKKyAgICBhZmNzZXRbRkNfS09JOF0gICAgPSBUQ19DWVJJTEw7CisgICAgYWZjc2V0W0ZDX0pJUzddICAgID0gVENfSkVVQzsKKyAgICBhZmNzZXRbRkNfU0hKSVNdICAgPSBUQ19KRVVDOworICAgIGFmY3NldFtGQ19KRVVDXSAgICA9IFRDX0pFVUM7CisgICAgYWZjc2V0W0ZDX0pERUNdICAgID0gVENfSkVVQzsKKyAgICBhZmNzZXRbRkNfSEU3XSAgICAgPSBUQ19IRUJSRVc7CisgICAgYWZjc2V0W0ZDX0hFQlJFV10gID0gVENfSEVCUkVXOworICAgIGFmY3NldFtGQ19DUDg2Ml0gICA9IFRDX0hFQlJFVzsKKyAgICBhZmNzZXRbRkNfRUxPVF0gICAgPSBUQ19HUkVFSzsKKyAgICBhZmNzZXRbRkNfR1JFRUtdICAgPSBUQ19HUkVFSzsKKyAgICBhZmNzZXRbRkNfQ1A4NjldICAgPSBUQ19HUkVFSzsKKyAgICBhZmNzZXRbRkNfOUxBVElOXSAgPSBUQ185TEFUSU47CisgICAgYWZjc2V0W0ZDX0NQOTIzXSAgID0gVENfOUxBVElOOworICAgIGFmY3NldFtGQ19DUDg1OF0gICA9IFRDXzlMQVRJTjsKKyAgICBhZmNzZXRbRkNfQ1A4NTVdICAgPSBUQ19DWVJJTEw7CisgICAgYWZjc2V0W0ZDX0NQMTI1MV0gID0gVENfQ1lSSUxMOworICAgIGFmY3NldFtGQ19CVUxHQVJdICA9IFRDX0NZUklMTDsKKyAgICBhZmNzZXRbRkNfQ1AxMjUwXSAgPSBUQ18yTEFUSU47CisgICAgYWZjc2V0W0ZDX01BWk9WSUFdID0gVENfMkxBVElOOworICAgIGFmY3NldFtGQ19VQ1MyXSAgICA9IFRDX1VURjg7CisgICAgYWZjc2V0W0ZDX1VURjhdICAgID0gVENfVVRGODsKKworICAgIGFmY3NldFtGQ19LT0k4Ul0gICA9IFRDX0NZUklMTDsKKyAgICBhZmNzZXRbRkNfS09JOFVdICAgPSBUQ19DWVJJTEw7CisgICAgYWZjc2V0W0ZDX0NQMTI1Ml0gID0gVENfMUxBVElOOworCisgICAgY3NldHNpbml0ZWQrKzsKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLyogTk9DU0VUUyAqLwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC04LjAuMjExL2NrdXhsYS5oIGIvY2tlcm1pdC04LjAuMjExL2NrdXhsYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZDMxNzEKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LTguMC4yMTEvY2t1eGxhLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgIEZpbGUgQ0tVWExBLkgKKworICBDLUtlcm1pdCBsYW5ndWFnZSBhbmQgY2hhcmFjdGVyLXNldCBzdXBwb3J0IGZvciBVTklYLCBWTVMsIE9TLzIsCisgIEFPUy9WUywgYW5kIG90aGVyIHN5c3RlbXMuCisKKyAgVGhpcyBmaWxlIHNob3VsZCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHRoZSBsYW5ndWFnZSBzdXBwb3J0IGZpbGVzCisgIGZvciBvdGhlciBDLUtlcm1pdCBpbXBsZW1lbnRhdGlvbnMgLS0gTWFjaW50b3NoLCBldGMuCisqLworLyoKKyAgQXV0aG9yOiBGcmFuayBkYSBDcnV6IDxmZGNAY29sdW1iaWEuZWR1PiwKKyAgQ29sdW1iaWEgVW5pdmVyc2l0eSBBY2FkZW1pYyBJbmZvcm1hdGlvbiBTeXN0ZW1zLCBOZXcgWW9yayBDaXR5LgorCisgIENvcHlyaWdodCAoQykgMTk4NSwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisKKyovCisKKyNpZm5kZWYgQ0tVWExBX0gKKyNkZWZpbmUgQ0tVWExBX0gKKworLyogQ29kZXMgZm9yIGZpbGUgY2hhcmFjdGVyIHNldHMgKi8KKworLyogSVNPIDY0NiBhbmQgb3RoZXIgSVNPLTY0Ni1saWtlIDctYml0IHNldHMgKi8KKworI2RlZmluZSBGQ19VU0FTQ0lJIDAgICAvKiBVUyBBU0NJSSAqLworI2RlZmluZSBGQ19VS0FTQ0lJIDEgICAvKiBVbml0ZWQgS2luZ2RvbSBBU0NJSSAqLworI2RlZmluZSBGQ19EVUFTQ0lJIDIgICAvKiBEdXRjaCBJU08gNjQ2IE5SQyAqLworI2RlZmluZSBGQ19GSUFTQ0lJIDMgICAvKiBGaW5uaXNoIElTTyA2NDYgTlJDICovCisjZGVmaW5lIEZDX0ZSQVNDSUkgNCAgIC8qIEZyZW5jaCBJU08gNjQ2IE5SQyAqLworI2RlZmluZSBGQ19GQ0FTQ0lJIDUgICAvKiBGcmVuY2ggQ2FuYWRpYW4gSVNPIDY0NiBOUkMgKi8KKyNkZWZpbmUgRkNfR0VBU0NJSSA2ICAgLyogR2VybWFuIElTTyA2NDYgTlJDICovCisjZGVmaW5lIEZDX0hVQVNDSUkgNyAgIC8qIEh1bmdhcmlhbiBJU08gNjQ2IE5SQyAqLworI2RlZmluZSBGQ19JVEFTQ0lJIDggICAvKiBJdGFsaWFuICpJU08gNjQ2IE5SQyAqLworI2RlZmluZSBGQ19OT0FTQ0lJIDkgICAvKiBOb3J3ZWdpYW4gYW5kIERhbmlzaCBJU08gNjQ2IE5SQyAqLworI2RlZmluZSBGQ19QT0FTQ0lJIDEwICAvKiBQb3J0dWd1ZXNlIElTTyA2NDYgTlJDICovCisjZGVmaW5lIEZDX1NQQVNDSUkgMTEgIC8qIFNwYW5pc2ggSVNPIDY0NiBOUkMgKi8KKyNkZWZpbmUgRkNfU1dBU0NJSSAxMiAgLyogU3dlZGlzaCBJU08gNjQ2IE5SQyAqLworI2RlZmluZSBGQ19DSEFTQ0lJIDEzICAvKiBTd2lzcyBJU08gNjQ2IE5SQyAqLworCisvKiA4LWJpdCBSb21hbiBjaGFyYWN0ZXIgc2V0cyAqLworCisjZGVmaW5lIEZDXzFMQVRJTiAgMTQgIC8qIElTTyA4ODU5LTEgTGF0aW4gQWxwaGFiZXQgMSAqLworI2RlZmluZSBGQ18yTEFUSU4gIDE1ICAvKiBJU08gODg1OS0yIExhdGluIEFscGhhYmV0IDIgKi8KKyNkZWZpbmUgRkNfREVDTUNTICAxNiAgLyogREVDIE11bHRpbmF0aW9uYWwgQ2hhcmFjdGVyIFNldCAqLworI2RlZmluZSBGQ19ORVhUICAgIDE3ICAvKiBOZVhUIHdvcmtzdGF0aW9uIGNoYXJhY3RlciBzZXQgKi8KKyNkZWZpbmUgRkNfQ1A0MzcgICAxOCAgLyogSUJNIFBDIENvZGUgUGFnZSA0MzcgKi8KKyNkZWZpbmUgRkNfQ1A4NTAgICAxOSAgLyogSUJNIFBDIENvZGUgUGFnZSA4NTAgKi8KKyNkZWZpbmUgRkNfQ1A4NTIgICAyMCAgLyogSUJNIFBDIENvZGUgUGFnZSA4NTIgKi8KKyNkZWZpbmUgRkNfQVBQUUQgICAyMSAgLyogQXBwbGUgUXVpY2tkcmF3ICovCisjZGVmaW5lIEZDX0RHTUNTICAgMjIgIC8qIERhdGEgR2VuZXJhbCBJbnRlcm5hdGlvbmFsIENoYXJhY3RlciBTZXQgKi8KKyNkZWZpbmUgRkNfSFBSOCAgICAyMyAgLyogSFAgUm9tYW44ICovCisKKy8qIEN5cmlsbGljIHNldHMgKi8KKworI2RlZmluZSBGQ19DWVJJTEwgIDI0ICAvKiBJU08gODg1OS01IExhdGluL0N5cmlsbGljICovCisjZGVmaW5lIEZDX0NQODY2ICAgMjUgIC8qIFBDIENvZGUgUGFnZSA4NjYgQ3lyaWxsaWMgKi8KKyNkZWZpbmUgRkNfS09JNyAgICAyNiAgLyogS09JLTcgPSBTaG9ydCBLT0kgKi8KKyNkZWZpbmUgRkNfS09JOCAgICAyNyAgLyogS09JLTggKi8KKworLyogSmFwYW5lc2Ugc2V0cyAqLworCisjZGVmaW5lIEZDX0pJUzcgICAgMjggIC8qIEpJUy03ICovCisjZGVmaW5lIEZDX1NISklTICAgMjkgIC8qIFNoaWZ0ZWQgSklTID0gQ1A5MzIgKi8KKyNkZWZpbmUgRkNfSkVVQyAgICAzMCAgLyogSmFwYW5lc2UgRVVDIChKQUUpICovCisjZGVmaW5lIEZDX0pERUMgICAgMzEgIC8qIEphcGFuZXNlIERFQyBLYW5qaSAqLworCisvKiBIZWJyZXcgc2V0cyAqLworCisjZGVmaW5lIEZDX0hFNyAgICAgMzIgIC8qIDctQml0IERFQyBIZWJyZXcgKi8KKyNkZWZpbmUgRkNfSEVCUkVXICAzMyAgLyogOC1CaXQgSVNPIDg4NTktOCBMYXRpbi9IZWJyZXcgKi8KKyNkZWZpbmUgRkNfQ1A4NjIgICAzNCAgLyogSGVicmV3IFBDIENvZGUgUGFnZSAqLworCisvKiBHcmVlayBzZXRzICovCisKKyNkZWZpbmUgRkNfRUxPVCAgICAzNSAgLyogNy1CaXQgRUxPVCA5MjcgR3JlZWsgKi8KKyNkZWZpbmUgRkNfR1JFRUsgICAzNiAgLyogOC1CaXQgSVNPIDg4NTktNyBMYXRpbi9HcmVlayAqLworI2RlZmluZSBGQ19DUDg2OSAgIDM3ICAvKiBHcmVlayBQQyBDb2RlIFBhZ2UgKi8KKworLyogTmV3IFJvbWFuIHNldHMgd2l0aCBFdXJvIHN5bWJvbCAqLworCisjZGVmaW5lIEZDXzlMQVRJTiAgMzggIC8qIElTTyA4ODU5LTE1IExhdGluIEFscGhhYmV0IDkgKi8KKyNkZWZpbmUgRkNfQ1A5MjMgICAzOCAgLyogU2FtZSBhcyBMYXRpbi05ICovCisjZGVmaW5lIEZDX0NQODU4ICAgMzkgIC8qIFdlc3Rlcm4gRXVyb3BlIHdpdGggRXVybyAqLworCisvKiBPdGhlciBuZXcgYWRkaXRpb25zICovCisKKyNkZWZpbmUgRkNfQ1A4NTUgICA0MCAgLyogQ3lyaWxsaWMgUEMgQ29kZSBQYWdlICovCisjZGVmaW5lIEZDX0NQMTI1MSAgNDEgIC8qIEN5cmlsbGljIFdpbmRvd3MgKi8KKyNkZWZpbmUgRkNfQlVMR0FSICA0MiAgLyogQnVsZ2FyaWFuIFBDIGNvZGUgcGFnZSAqLworI2RlZmluZSBGQ19DUDEyNTAgIDQzICAvKiBMYXRpbiAyIFdpbmRvd3MgKGRpZmZlcmVudCBmcm9tIExhdGluLTIpKi8KKyNkZWZpbmUgRkNfTUFaT1ZJQSA0NCAgLyogUG9saXNoIE1hem92aWEgUEMgY29kZSBwYWdlICovCisKKy8qIFVuaWNvZGUgKi8KKworI2RlZmluZSBGQ19VQ1MyICAgIDQ1ICAvKiBJU08tMTA2NDYgLyBVbmljb2RlIFVDUy0yICovCisjZGVmaW5lIEZDX1VURjggICAgNDYgIC8qIElTTy0xMDY0NiAvIFVuaWNvZGUgVVRGLTggKi8KKworLyogUmVjZW50IGFkZGl0aW9ucyAqLworCisjZGVmaW5lIEZDX0tPSThSICAgNDcgIC8qIEtPSTgtUiAoUkZDMTQ4OSkgLSBSdXNzaWFuICsgYm94ZHJhd2luZyAqLworI2RlZmluZSBGQ19LT0k4VSAgIDQ4ICAvKiBLT0k4LVUgKFJGQzIzMTkpIC0gVWtyYWluaWFuICsgYm94ZHJhd2luZyAqLworI2RlZmluZSBGQ19DUDEyNTIgIDQ5ICAvKiBMYXRpbiAxIFdpbmRvd3MgKi8KKworI2RlZmluZSBNQVhGQ1NFVFMgIDQ5ICAvKiBIaWdoZXN0IGZpbGUgY2hhcmFjdGVyIHNldCBudW1iZXIgKi8KKworI2lmZGVmIE9TMgorI2RlZmluZSBGQ19ERUNTUEVDIDI1MyAvKiBOb3QgcmVhbCBjaGFyYWN0ZXItc2V0cyAqLworI2RlZmluZSBGQ19ERUNURUNIIDI1MgorI2VuZGlmIC8qIE9TMiAqLworCisjaWZkZWYgVU5JQ09ERQorX1BST1RPVFlQKCBWT0lEIGluaXR4bGF0ZSwgKGludCwgaW50KSApOworI2VuZGlmIC8qIFVOSUNPREUgKi8KKworI2VuZGlmIC8qIENLVVhMQV9IICovCmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvY2t3YXJ0LmMgYi9ja2VybWl0LTguMC4yMTEvY2t3YXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjODhiZgotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9ja3dhcnQuYwpAQCAtMCwwICsxLDc0NiBAQAorI2luY2x1ZGUgImNrY3N5bS5oIgorY2hhciAqd2FydHYgPSAiV2FydCBWZXJzaW9uIDIuMTQsIDEwIE5vdiAxOTk5IjsKKworI2RlZmluZSBDS1dBUlRfQworCisjaWZkZWYgTURFQlVHCisvKiBVc2UgdGhlIHJlYWwgb25lcyBpbiB0aGlzIG1vZHVsZSBvbmx5ICovCisjaWZkZWYgbWFsbG9jCisjdW5kZWYgbWFsbG9jCisjZW5kaWYgLyogbWFsbG9jICovCisjaWZkZWYgY2FsbG9jCisjdW5kZWYgY2FsbG9jCisjZW5kaWYgLyogY2FsbG9jICovCisjaWZkZWYgcmVhbGxvYworI3VuZGVmIHJlYWxsb2MKKyNlbmRpZiAvKiByZWFsbG9jICovCisjaWZkZWYgZnJlZQorI3VuZGVmIGZyZWUKKyNlbmRpZiAvKiBmcmVlICovCisjZW5kaWYgLyogTURFQlVHICovCisKKyNpZmRlZiBNQUMKKyNkZWZpbmUgVk9JRCB2b2lkCisjZW5kaWYgLyogTUFDICovCisKKy8qIFcgQSBSIFQgKi8KKworLyoKKyAgQSBzbWFsbCBzdWJzZXQgb2YgImxleCIuCisKKyAgQXV0aG9yczogSmVmZiBEYW1lbnMsIEZyYW5rIGRhIENydXoKKyAgQ29sdW1iaWEgVW5pdmVyc2l0eSBDZW50ZXIgZm9yIENvbXB1dGluZyBBY3Rpdml0ZXMuCisgIEZpcnN0IHJlbGVhc2VkIE5vdmVtYmVyIDE5ODQuCisgIENvcHlyaWdodCAoQykgMTk4NCwgMjAwNCwKKyAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLgorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIEMtS2VybWl0IENPUFlJTkcuVFhUIGZpbGUgb3IgdGhlCisgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIGNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQgcGVybWlzc2lvbnMuCisqLworCisvKgorICogaW5wdXQgZm9ybWF0IGlzOgorICogIGxpbmVzIHRvIGJlIGNvcGllZCB8ICVzdGF0ZSA8c3RhdGUgbmFtZXMuLi4+CisgKiAgJSUKKyAqIDxzdGF0ZT4gfCA8c3RhdGUsc3RhdGUsLi4uPiBDSEFSICB7IGFjdGlvbnMgfQorICogLi4uCisgKiAgJSUKKyAqICBtb3JlIGxpbmVzIHRvIGJlIGNvcGllZAorICovCisKKyNpbmNsdWRlICJja2NkZWIuaCIJCQkvKiBJbmNsdWRlcyAqLworCisjaWZkZWYgU1RSQVRVUworLyogQWN0dWFsbHkgY2FsbCBwcmludGYsIG5vdCBvdXIgcHJpbnRmLWNhdGNoZXIgZm9yIEtlcm1pdCAqLworI2lmZGVmIHByaW50ZgorI3VuZGVmIHByaW50ZgorI2VuZGlmIC8qIHByaW50ZiAqLworI2lmZGVmIGZwcmludGYKKyN1bmRlZiBmcHJpbnRmCisjZW5kaWYgLyogZnByaW50ZiAqLworI2VuZGlmIC8qIFNUUkFUVVMgKi8KKworI2lmZGVmIE1BQworLyogU2FtZSBkZWFsIGZvciBNYWNpbnRvc2ggKi8KKyNpZmRlZiBwcmludGYKKyN1bmRlZiBwcmludGYKKyNlbmRpZiAvKiBwcmludGYgKi8KKyNpZmRlZiBmcHJpbnRmCisjdW5kZWYgZnByaW50ZgorI2VuZGlmIC8qIGZwcmludGYgKi8KKyNlbmRpZiAvKiBNQUMgKi8KKworI2lmZGVmIFVOSVgKKy8qIEFuZCBVTklYICovCisjaWZkZWYgcHJpbnRmCisjdW5kZWYgcHJpbnRmCisjZW5kaWYgLyogcHJpbnRmICovCisjaWZkZWYgZnByaW50ZgorI3VuZGVmIGZwcmludGYKKyNlbmRpZiAvKiBmcHJpbnRmICovCisjZW5kaWYgLyogVU5JWCAqLworLyoKKyAgVGhlIGZvbGxvd2luZyAiY2hhciIgc2hvdWxkIGJlIGNoYW5nZWQgdG8gInNob3J0IiwgImludCIsIG9yICJsb25nIiBpZiB5b3VyCisgIHdhcnQgcHJvZ3JhbSB3aWxsIGdlbmVyYXRlIG1vcmUgdGhhbiAxMjcgc3RhdGVzLiAgU2luY2Ugd2FydCBpcyB1c2VkIG1haW5seQorICB3aXRoIEMtS2VybWl0LCB3aGljaCBoYXMgYWJvdXQgODAgc3RhdGVzLCAiY2hhciIgaXMgYWRlcXVhdGUuICBUaGlzIGtlZXBzCisgIHRoZSBwcm9ncmFtIGFib3V0IDNLLTRLIHNtYWxsZXIsIHdoaWNoIGNhbiBiZSBjcml0aWNhbCBvbiAxNi1iaXQKKyAgYXJjaGl0ZWN0dXJlcy4KKyovCisjaWZkZWYgSVJJWDYwCisvKgorICBBbHNvIHVzZSBzaG9ydCBvciBpbnQgaWYgeW91ciBjb21waWxlciBjb21wbGFpbnMgaW5vcmRpbmF0ZWx5IGFib3V0CisgICJpbnRlZ2VyIGNvbnZlcnNpb24gcmVzdWx0ZWQgaW4gYSBjaGFuZ2Ugb2Ygc2lnbiIuLi4KKyovCisjZGVmaW5lIFRCTF9UWVBFICJzaG9ydCIJCS8qIEMgZGF0YSB0eXBlIG9mIHN0YXRlIHRhYmxlICovCisjZWxzZQorI2RlZmluZSBUQkxfVFlQRSAiY2hhciIJCQkvKiBDIGRhdGEgdHlwZSBvZiBzdGF0ZSB0YWJsZSAqLworI2VuZGlmIC8qIElSSVg2MCAqLworCisjZGVmaW5lIENfTCAwMTQJCQkJLyogRm9ybWZlZWQgKi8KKworI2RlZmluZSBTRVAgMQkJCQkvKiBUb2tlbiB0eXBlcyAqLworI2RlZmluZSBMQlJBQ0sgMgorI2RlZmluZSBSQlJBQ0sgMworI2RlZmluZSBXT1JEIDQKKyNkZWZpbmUgQ09NTUEgNQorCisvKiBTdG9yYWdlIHNpemVzICovCisKKyNkZWZpbmUgTUFYU1RBVEVTIDUwCQkJLyogbWF4IG51bWJlciBvZiBzdGF0ZXMgKi8KKyNkZWZpbmUgTUFYV09SRCA1MAkJCS8qIG1heCAjIG9mIGNoYXJzL3dvcmQgKi8KKyNkZWZpbmUgU0JZVEVTICgoTUFYU1RBVEVTKzYpLzgpCS8qICMgb2YgYnl0ZXMgZm9yIHN0YXRlIGJpdG1hc2sgKi8KKworLyogTmFtZSBvZiB3YXJ0IGZ1bmN0aW9uIGluIGdlbmVyYXRlZCBwcm9ncmFtICovCisKKyNpZm5kZWYgRk5BTUUKKyNkZWZpbmUgRk5BTUUgIndhcnQiCisjZW5kaWYgLyogRk5BTUUgKi8KKworLyogU3RydWN0dXJlIGZvciBzdGF0ZSBpbmZvcm1hdGlvbiAqLworCitzdHJ1Y3QgdHJhbnN4IHsKKyAgICBDSEFSIHN0YXRlc1tTQllURVNdOwkJLyogaW5jbHVkZWQgc3RhdGVzICovCisgICAgaW50IGFueXN0OwkJCQkvKiB0cnVlIGlmIHRoaXMgZ29vZCBmcm9tIGFueSBzdGF0ZSAqLworICAgIENIQVIgaW5jaHI7CQkJCS8qIGlucHV0IGNoYXJhY3RlciAqLworICAgIGludCBhY3RubzsJCQkJLyogYXNzb2NpYXRlZCBhY3Rpb24gKi8KKyAgICBzdHJ1Y3QgdHJhbnN4ICpueHQ7Cit9OwkJCQkJLyogbmV4dCB0cmFuc2l0aW9uICovCit0eXBlZGVmIHN0cnVjdCB0cmFuc3ggKnRyYW5zOworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCisKK19QUk9UT1RZUCggVk9JRCBzZXR3c3RhdGUsIChpbnQsIHRyYW5zKSApOworX1BST1RPVFlQKCBpbnQgdGVzdHN0YXRlLCAoaW50LCB0cmFucykgKTsKK19QUk9UT1RZUCggdHJhbnMgcmRpbnB1dCwgKEZJTEUgKiwgRklMRSAqKSApOworX1BST1RPVFlQKCBWT0lEIGluaXRpYWwsIChGSUxFICosIEZJTEUgKikgKTsKK19QUk9UT1RZUCggaW50IGlzaW4sIChjaGFyICosIGludCkgKTsKK19QUk9UT1RZUCggaW50IGlzd29yZCwgKGludCkgKTsKK19QUk9UT1RZUCggVk9JRCByZHdvcmQsIChGSUxFICosIGNoYXIgKikgKTsKK19QUk9UT1RZUCggVk9JRCByZHN0YXRlcywgKEZJTEUgKiwgRklMRSAqKSApOworX1BST1RPVFlQKCB0cmFucyBuZXd0cmFucywgKHZvaWQpICk7CitfUFJPVE9UWVAoIHRyYW5zIHJkcnVsZXMsIChGSUxFICosIEZJTEUgKikgKTsKK19QUk9UT1RZUCggVk9JRCBzdGF0ZWxpc3QsIChGSUxFICosIHRyYW5zKSApOworX1BST1RPVFlQKCBWT0lEIGNvcHlhY3QsIChGSUxFICosIEZJTEUgKiwgaW50KSApOworX1BST1RPVFlQKCBpbnQgZmFjdGlvbiwgKHRyYW5zLCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggVk9JRCBlbXB0eXRibCwgKHZvaWQpICk7CitfUFJPVE9UWVAoIFZPSUQgYWRkYWN0aW9uLCAoaW50LCBpbnQsIGludCkgKTsKK19QUk9UT1RZUCggVk9JRCB3cml0ZXRibCwgKEZJTEUgKikgKTsKK19QUk9UT1RZUCggVk9JRCB3YXJyYXksIChGSUxFICosIGNoYXIgKiwgaW50IFtdLCBpbnQsIGNoYXIgKikgKTsKK19QUk9UT1RZUCggVk9JRCBwcm9sb2csIChGSUxFICopICk7CitfUFJPVE9UWVAoIFZPSUQgZXBpbG9ndWUsIChGSUxFICopICk7CitfUFJPVE9UWVAoIFZPSUQgY29weXJlc3QsIChGSUxFICosIEZJTEUgKikgKTsKK19QUk9UT1RZUCggaW50IGdldHRva2VuLCAoRklMRSAqKSApOworX1BST1RPVFlQKCBWT0lEIHJkY21udCwgKEZJTEUgKikgKTsKK19QUk9UT1RZUCggVk9JRCBjbHJoYXNoLCAodm9pZCkgKTsKK19QUk9UT1RZUCggaW50IGhhc2gsIChjaGFyICopICk7CitfUFJPVE9UWVAoIFZPSUQgZW50ZXIsIChjaGFyICosIGludCkgKTsKK19QUk9UT1RZUCggaW50IGxrdXAsIChjaGFyICopICk7CitfUFJPVE9UWVAoIHN0YXRpYyBjaGFyKiBjb3B5LCAoY2hhciAqcykgKTsKKworLyogVmFyaWFibGVzIGFuZCB0YWJsZXMgKi8KKworLyogbHQgMTk5Mi0xMC0wOCBCZWdpbgorICogcHJvdmlkZSBkZWZpbml0aW9uIGZvciBkZWJsb2cgdmFyaWFibGUKKyAqIGNrY2RlYi5oIGRlY2xhcmVzIGFzIGV4dGVybi4gREVDQyBBWFAgaXMgc3RyaWN0IGFib3V0IHJlZi9kZWYgbW9kZWwKKyAqIFZhcmlhYmxlIGlzIHVudXNlZCBoZXJlaW4sIHRvIHRoZSBiZXN0IG9mIG15IGtub3dsZWRnZS4KKyAqLworI2lmZGVmIFZNUworaW50IGRlYmxvZzsKKyNlbmRpZiAvKiBWTVMgKi8KKy8qIGx0IDE5OTItMTAtMDggRW5kCisgKi8KKworc3RhdGljIGludCBsaW5lcywgbnN0YXRlcywgbmFjdHM7CisKK3N0YXRpYyBjaGFyIHRva3ZhbFtNQVhXT1JEXTsKKworc3RhdGljIGludCB0YmxbTUFYU1RBVEVTKjk2XTsKKworY2hhciAqdGJsX3R5cGUgPSBUQkxfVFlQRTsKKworY2hhciAqdHh0MSA9ICJcbiNkZWZpbmUgQkVHSU4gc3RhdGUgPVxuXG5pbnQgc3RhdGUgPSAwO1xuXG5pbnRcbiI7CisKK2NoYXIgKmZuYW1lID0gRk5BTUU7CQkJLyogR2VuZXJhdGVkIGZ1bmN0aW9uIG5hbWUgZ29lcyBoZXJlICovCisKKy8qIHJlc3Qgb2YgcHJvZ3JhbS4uLiAqLworCitjaGFyICp0eHQyID0gIigpXG5cCit7XG5cCisgICAgaW50IGMsYWN0bm87XG5cCisgICAgZXh0ZXJuICI7CisKKy8qIERhdGEgdHlwZSBvZiBzdGF0ZSB0YWJsZSBpcyBpbnNlcnRlZCBoZXJlIChzaG9ydCBvciBpbnQpICovCisKK2NoYXIgKnR4dDJhID0KKyIgdGJsW107XG5cCisgICAgd2hpbGUgKDEpIHtcblwKKwljID0gaW5wdXQoKSAtIDMyO1xuXAorCWRlYnVnKEYwMDAsXCJQUk9UTyBpbnB1dFwiLGNraXRvYShzdGF0ZSksYyszMik7XG5cCisJaWYgKGMgPCAwIHx8IGMgPiA5NSkgYyA9IDA7XG4iOworCitjaGFyICp0eHQyYiA9ICIJaWYgKChhY3RubyA9IHRibFtjICsgc3RhdGUqOTZdKSAhPSAtMSlcblwKKwkgICAgc3dpdGNoKGFjdG5vKSB7XG4iOworCisvKiB0aGlzIHByb2dyYW0ncyBvdXRwdXQgZ29lcyBoZXJlLCBmb2xsb3dlZCBieSBmaW5hbCB0ZXh0Li4uICovCisKK2NoYXIgKnR4dDMgPSAiXG4JICAgIH1cbiAgICB9XG59XG5cbiI7CisKKworLyoKKyAqIHR1cm4gb24gdGhlIGJpdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHN0YXRlCisgKgorICovCitWT0lECitzZXR3c3RhdGUoc3RhdGUsdCkgaW50IHN0YXRlOyB0cmFucyB0OyB7CisgICAgaW50IGlkeCxtc2s7CisgICAgaWR4ID0gc3RhdGUvODsJCQkvKiBieXRlIGFzc29jaWF0ZWQgd2l0aCBzdGF0ZSAqLworICAgIG1zayA9IDB4ODAgPj4gKHN0YXRlICUgOCk7CQkvKiBiaXQgbWFzayBmb3Igc3RhdGUgKi8KKyAgICB0LT5zdGF0ZXNbaWR4XSB8PSBtc2s7Cit9CisKKy8qCisgKiBzZWUgaWYgdGhlIHN0YXRlIGlzIGludm9sdmVkIGluIHRoZSB0cmFuc2l0aW9uCisgKgorICovCitpbnQKK3Rlc3RzdGF0ZShzdGF0ZSx0KSBpbnQgc3RhdGU7IHRyYW5zIHQ7IHsKKyAgICBpbnQgaWR4LG1zazsKKyAgICBpZHggPSBzdGF0ZS84OworICAgIG1zayA9IDB4ODAgPj4gKHN0YXRlICUgOCk7CisgICAgcmV0dXJuKHQtPnN0YXRlc1tpZHhdICYgbXNrKTsKK30KKworCisvKgorICogcmVhZCBpbnB1dCBmcm9tIGhlcmUuLi4KKyAqCisgKi8KKwordHJhbnMKK3JkaW5wdXQoaW5mcCxvdXRmcCkgRklMRSAqaW5mcCwqb3V0ZnA7IHsKKyAgICB0cmFucyB4OworICAgIGxpbmVzID0gMTsJCQkJLyogbGluZSBjb3VudGVyICovCisgICAgbnN0YXRlcyA9IDA7CQkJLyogbm8gc3RhdGVzICovCisgICAgbmFjdHMgPSAwOwkJCQkvKiBubyBhY3Rpb25zIHlldCAqLworICAgIGZwcmludGYob3V0ZnAsIlxuJWMqIFdBUk5JTkcgLS0gVGhpcyBDIHNvdXJjZSBwcm9ncmFtIGdlbmVyYXRlZCBieSAiLCcvJyk7CisgICAgZnByaW50ZihvdXRmcCwiV2FydCBwcmVwcm9jZXNzb3IuICovXG4iKTsKKyAgICBmcHJpbnRmKG91dGZwLCIlYyogRG8gbm90IGVkaXQgdGhpcyBmaWxlOyBlZGl0IHRoZSBXYXJ0LWZvcm1hdCAiLCcvJyk7CisgICAgZnByaW50ZihvdXRmcCwic291cmNlIGZpbGUgaW5zdGVhZCwgKi9cbiIpOworICAgIGZwcmludGYob3V0ZnAsIiVjKiBhbmQgdGhlbiBydW4gaXQgdGhyb3VnaCBXYXJ0IHRvIHByb2R1Y2UgYSBuZXcgIiwnLycpOworICAgIGZwcmludGYob3V0ZnAsIkMgc291cmNlIGZpbGUuICAgICAqL1xuXG4iKTsKKyAgICBmcHJpbnRmKG91dGZwLCIlYyogV2FydCBWZXJzaW9uIEluZm86ICovXG4iLCcvJyk7CisgICAgZnByaW50ZihvdXRmcCwiY2hhciAqd2FydHYgPSBcIiVzXCI7XG5cbiIsd2FydHYpOworCisgICAgaW5pdGlhbChpbmZwLG91dGZwKTsJCS8qIHJlYWQgc3RhdGUgbmFtZXMsIGluaXRpYWwgZGVmcyAqLworICAgIHByb2xvZyhvdXRmcCk7CQkJLyogd3JpdGUgb3V0IG91ciBpbml0aWFsIGNvZGUgKi8KKyAgICB4ID0gcmRydWxlcyhpbmZwLG91dGZwKTsJCS8qIHJlYWQgcnVsZXMgKi8KKyAgICBlcGlsb2d1ZShvdXRmcCk7CQkJLyogd3JpdGUgb3V0IGVwaWxvZ3VlIGNvZGUgKi8KKyAgICByZXR1cm4oeCk7Cit9CisKKworLyoKKyAqIGluaXRpYWwgLSByZWFkIGluaXRpYWwgZGVmaW5pdGlvbnMgYW5kIHN0YXRlIG5hbWVzLiAgUmV0dXJucworICogb24gRU9GIG9yICUlLgorICoKKyAqLworVk9JRAoraW5pdGlhbChpbmZwLG91dGZwKSBGSUxFICppbmZwLCAqb3V0ZnA7IHsKKyAgICBpbnQgYzsKKyAgICBjaGFyIHdvcmRidWZbTUFYV09SRF07CisgICAgd2hpbGUgKChjID0gZ2V0YyhpbmZwKSkgIT0gRU9GKSB7CisJaWYgKGMgPT0gJyUnKSB7CisJICAgIHJkd29yZChpbmZwLHdvcmRidWYpOworCSAgICBpZiAoc3RyY21wKHdvcmRidWYsInN0YXRlcyIpID09IDApCisJICAgICAgcmRzdGF0ZXMoaW5mcCxvdXRmcCk7CisJICAgIGVsc2UgaWYgKHN0cmNtcCh3b3JkYnVmLCIlIikgPT0gMCkgcmV0dXJuOworCSAgICBlbHNlIGZwcmludGYob3V0ZnAsIiUlJXMiLHdvcmRidWYpOworCX0KKwllbHNlIHB1dGMoYyxvdXRmcCk7CisJaWYgKGMgPT0gJ1xuJykgbGluZXMrKzsKKyAgICB9Cit9CisKKy8qCisgKiBib29sZWFuIGZ1bmN0aW9uIHRvIHRlbGwgaWYgdGhlIGdpdmVuIGNoYXJhY3RlciBjYW4gYmUgcGFydCBvZgorICogYSB3b3JkLgorICoKKyAqLworaW50Citpc2luKHMsYykgY2hhciAqczsgaW50IGM7IHsKKyAgICBmb3IgKDsgKnMgIT0gJ1wwJzsgcysrKQorICAgICAgaWYgKCpzID09IChjaGFyKSBjKSByZXR1cm4oMSk7CisgICAgcmV0dXJuKDApOworfQoraW50Citpc3dvcmQoYykgaW50IGM7IHsKKyAgICBzdGF0aWMgY2hhciBzcGVjaWFsW10gPSAiLiVfLSRAIjsJLyogdGhlc2UgYXJlIGFsbG93YWJsZSAqLworICAgIHJldHVybihpc2FsbnVtKGMpIHx8IGlzaW4oc3BlY2lhbCxjKSk7Cit9CisKKy8qCisgKiByZWFkIHRoZSBuZXh0IHdvcmQgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLgorICoKKyAqLworVk9JRAorcmR3b3JkKGZwLGJ1ZikgRklMRSAqZnA7IGNoYXIgKmJ1ZjsgeworICAgIGludCBsZW4gPSAwLGM7CisgICAgd2hpbGUgKGlzd29yZChjID0gZ2V0YyhmcCkpICYmICsrbGVuIDwgTUFYV09SRCkgKmJ1ZisrID0gKGNoYXIpIGM7CisgICAgKmJ1ZisrID0gJ1wwJzsJCQkvKiB0aWUgb2ZmIHdvcmQgKi8KKyAgICB1bmdldGMoYyxmcCk7CQkJLyogcHV0IGJyZWFrIGNoYXIgYmFjayAqLworfQorCisvKgorICogcmVhZCBzdGF0ZSBuYW1lcywgdXAgdG8gYSBuZXdsaW5lLgorICoKKyAqLworVk9JRAorcmRzdGF0ZXMoZnAsb2ZwKSBGSUxFICpmcCwqb2ZwOyB7CisgICAgaW50IGM7CisgICAgY2hhciB3b3JkYnVmW01BWFdPUkRdOworICAgIHdoaWxlICgoYyA9IGdldGMoZnApKSAhPSBFT0YgJiYgYyAhPSAnXG4nKSB7CisJaWYgKGlzc3BhY2UoYykgfHwgYyA9PSBDX0wpIGNvbnRpbnVlOwkvKiBza2lwIHdoaXRlc3BhY2UgKi8KKwl1bmdldGMoYyxmcCk7CQkJLyogcHV0IGNoYXIgYmFjayAqLworCXJkd29yZChmcCx3b3JkYnVmKTsJCS8qIHJlYWQgdGhlIHdob2xlIHdvcmQgKi8KKwllbnRlcih3b3JkYnVmLCsrbnN0YXRlcyk7CS8qIHB1dCBpbnRvIHN5bWJvbCB0YmwgKi8KKwlmcHJpbnRmKG9mcCwiI2RlZmluZSAlcyAlZFxuIix3b3JkYnVmLG5zdGF0ZXMpOworICAgIH0KKyAgICBsaW5lcysrOworfQorCisvKgorICogYWxsb2NhdGUgYSBuZXcsIGVtcHR5IHRyYW5zaXRpb24gbm9kZQorICoKKyAqLwordHJhbnMKK25ld3RyYW5zKCkgeworICAgIHRyYW5zIG5ldzsKKyAgICBpbnQgaTsKKyAgICBuZXcgPSAodHJhbnMpIG1hbGxvYyhzaXplb2YgKHN0cnVjdCB0cmFuc3gpKTsKKyAgICBmb3IgKGk9MDsgaTxTQllURVM7IGkrKykgbmV3LT5zdGF0ZXNbaV0gPSAwOworICAgIG5ldy0+YW55c3QgPSAwOworICAgIG5ldy0+bnh0ID0gTlVMTDsKKyAgICByZXR1cm4obmV3KTsKK30KKworCisvKgorICogcmVhZCBhbGwgdGhlIHJ1bGVzLgorICoKKyAqLworCit0cmFucworcmRydWxlcyhmcCxvdXQpIEZJTEUgKmZwLCpvdXQ7IHsKKyAgICB0cmFucyBoZWFkLGN1cixwcmV2OworICAgIGludCBjdXJ0b2s7CisgICAgaGVhZCA9IGN1ciA9IHByZXYgPSBOVUxMOworICAgIHdoaWxlICgoY3VydG9rID0gZ2V0dG9rZW4oZnApKSAhPSBTRVApCisKKyAgICAgIHN3aXRjaChjdXJ0b2spIHsKKwljYXNlIExCUkFDSzoKKwkgIGlmIChjdXIgPT0gTlVMTCkKKwkgICAgY3VyID0gbmV3dHJhbnMoKTsKKwkgIGVsc2UKKwkgICAgZmF0YWwoImR1cGxpY2F0ZSBzdGF0ZSBsaXN0Iik7CisJICBzdGF0ZWxpc3QoZnAsY3VyKTsJCS8qIHNldCBzdGF0ZXMgKi8KKwkgIGNvbnRpbnVlOwkJCS8qIHByZXBhcmUgdG8gcmVhZCBjaGFyICovCisKKwljYXNlIFdPUkQ6CisJICBpZiAoKGludClzdHJsZW4odG9rdmFsKSAhPSAxKQorCSAgICBmYXRhbCgibXVsdGlwbGUgY2hhcnMgaW4gc3RhdGUiKTsKKwkgIGlmIChjdXIgPT0gTlVMTCkgeworCSAgICAgIGN1ciA9IG5ld3RyYW5zKCk7CisJICAgICAgY3VyLT5hbnlzdCA9IDE7CisJICB9CisJICBjdXItPmFjdG5vID0gKytuYWN0czsKKwkgIGN1ci0+aW5jaHIgPSAoY2hhcikgKHRva3ZhbFswXSAtIDMyKTsKKwkgIGlmIChoZWFkID09IE5VTEwpCisJICAgIGhlYWQgPSBjdXI7CisJICBlbHNlCisJICAgIHByZXYtPm54dCA9IGN1cjsKKwkgIHByZXYgPSBjdXI7CisJICBjdXIgPSBOVUxMOworCSAgY29weWFjdChmcCxvdXQsbmFjdHMpOworCSAgYnJlYWs7CisJZGVmYXVsdDogZmF0YWwoImJhZCBpbnB1dCBmb3JtYXQiKTsKKyAgICAgIH0KKyAgICByZXR1cm4oaGVhZCk7Cit9CisKKy8qCisgKiByZWFkIGEgbGlzdCBvZiAoY29tbWEtc2VwYXJhdGVkKSBzdGF0ZXMsIHNldCB0aGVtIGluIHRoZQorICogZ2l2ZW4gdHJhbnNpdGlvbi4KKyAqCisgKi8KK1ZPSUQKK3N0YXRlbGlzdChmcCx0KSBGSUxFICpmcDsgdHJhbnMgdDsgeworICAgIGludCBjdXJ0b2ssc3ZhbDsKKyAgICBjdXJ0b2sgPSBDT01NQTsKKyAgICB3aGlsZSAoY3VydG9rICE9IFJCUkFDSykgeworCWlmIChjdXJ0b2sgIT0gQ09NTUEpIGZhdGFsKCJtaXNzaW5nIGNvbW1hIik7CisJaWYgKChjdXJ0b2sgPSBnZXR0b2tlbihmcCkpICE9IFdPUkQpIGZhdGFsKCJtaXNzaW5nIHN0YXRlIG5hbWUiKTsKKwlpZiAoKHN2YWwgPSBsa3VwKHRva3ZhbCkpID09IC0xKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCJzdGF0ZSAlcyB1bmRlZmluZWRcbiIsdG9rdmFsKTsKKwkgICAgZmF0YWwoInVuZGVmaW5lZCBzdGF0ZSIpOworCX0KKwlzZXR3c3RhdGUoc3ZhbCx0KTsKKwljdXJ0b2sgPSBnZXR0b2tlbihmcCk7CisgICAgfQorfQorCisvKgorICogY29weSBhbiBhY3Rpb24gZnJvbSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dCBmaWxlCisgKgorICovCitWT0lECitjb3B5YWN0KGlucCxvdXRwLGFjdG5vKSBGSUxFICppbnAsKm91dHA7IGludCBhY3RubzsgeworICAgIGludCBjLGJjbnQ7CisgICAgZnByaW50ZihvdXRwLCJjYXNlICVkOlxuIixhY3Rubyk7CisgICAgd2hpbGUgKGMgPSBnZXRjKGlucCksIChpc3NwYWNlKGMpIHx8IGMgPT0gQ19MKSkKKyAgICAgIGlmIChjID09ICdcbicpIGxpbmVzKys7CisgICAgaWYgKGMgPT0gJ3snKSB7CisJYmNudCA9IDE7CisJZnB1dHMoIiAgICB7IixvdXRwKTsKKwl3aGlsZSAoYmNudCA+IDAgJiYgKGMgPSBnZXRjKGlucCkpICE9IEVPRikgeworCSAgICBpZiAoYyA9PSAneycpIGJjbnQrKzsKKwkgICAgZWxzZSBpZiAoYyA9PSAnfScpIGJjbnQtLTsKKwkgICAgZWxzZSBpZiAoYyA9PSAnXG4nKSBsaW5lcysrOworCSAgICBwdXRjKGMsb3V0cCk7CisJfQorCWlmIChiY250ID4gMCkgZmF0YWwoImFjdGlvbiBkb2Vzbid0IGVuZCIpOworICAgIH0gZWxzZSB7CisJd2hpbGUgKGMgIT0gJ1xuJyAmJiBjICE9IEVPRikgeworCSAgICBwdXRjKGMsb3V0cCk7CisJICAgIGMgPSBnZXRjKGlucCk7CisJfQorCWxpbmVzKys7CisgICAgfQorICAgIGZwcmludGYob3V0cCwiXG4gICAgYnJlYWs7XG4iKTsKK30KKworLyoKKyAqIGZpbmQgdGhlIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBjaGFyYWN0ZXIgYW5kIHN0YXRlLgorICogcmV0dXJucyAtMSBpZiBvbmUgY2FuJ3QgYmUgZm91bmQuCisgKgorICovCitpbnQKK2ZhY3Rpb24oaGQsc3RhdGUsY2hyKSB0cmFucyBoZDsgaW50IHN0YXRlLGNocjsgeworICAgIHdoaWxlIChoZCAhPSBOVUxMKSB7CisJaWYgKGhkLT5hbnlzdCB8fCB0ZXN0c3RhdGUoc3RhdGUsaGQpKQorCSAgaWYgKGhkLT5pbmNociA9PSAoJy4nIC0gMzIpIHx8IGhkLT5pbmNociA9PSAoY2hhcikgY2hyKQorCSAgICByZXR1cm4oaGQtPmFjdG5vKTsKKwloZCA9IGhkLT5ueHQ7CisgICAgfQorICAgIHJldHVybigtMSk7Cit9CisKKy8qCisgKiBlbXB0eSB0aGUgdGFibGUuLi4KKyAqCisgKi8KK1ZPSUQKK2VtcHR5dGJsKCkgeworICAgIGludCBpOworICAgIGZvciAoaT0wOyBpPG5zdGF0ZXMqOTY7IGkrKykgdGJsW2ldID0gLTE7Cit9CisKKy8qCisgKiBhZGQgdGhlIHNwZWNpZmllZCBhY3Rpb24gdG8gdGhlIG91dHB1dCBmb3IgdGhlIGdpdmVuIHN0YXRlIGFuZCBjaHIuCisgKgorICovCitWT0lECithZGRhY3Rpb24oYWN0LHN0YXRlLGNocikgaW50IGFjdCxzdGF0ZSxjaHI7IHsKKyAgICB0Ymxbc3RhdGUqOTYgKyBjaHJdID0gYWN0OworfQorCitWT0lECit3cml0ZXRibChmcCkgRklMRSAqZnA7IHsKKyAgICB3YXJyYXkoZnAsInRibCIsdGJsLDk2Kihuc3RhdGVzKzEpLFRCTF9UWVBFKTsKK30KKworCisvKgorICogd3JpdGUgYW4gYXJyYXkgdG8gdGhlIG91dHB1dCBmaWxlLCBnaXZlbiBpdHMgbmFtZSBhbmQgc2l6ZS4KKyAqCisgKi8KK1ZPSUQKK3dhcnJheShmcCxuYW0sY29udCxzaXosdHlwKSBGSUxFICpmcDsgY2hhciAqbmFtOyBpbnQgY29udFtdLHNpejsgY2hhciAqdHlwOyB7CisgICAgaW50IGk7CisgICAgZnByaW50ZihmcCwiJXMgJXNbXSA9IHtcbiIsdHlwLG5hbSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpeiAtIDE7ICkgeworCWZwcmludGYoZnAsIiAlMmQsIixjb250W2ldKTsKKwlpZiAoKCsraSAlIDE2KSA9PSAwKSBwdXRjKCdcbicsZnApOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCIlMmRcbn07XG4iLGNvbnRbc2l6LTFdKTsKK30KKworI2lmbmRlZiBTVFJBVFVTCisjaWZkZWYgTUFJTlRZUEUKKy8qCisgIElmIHlvdSBnZXQgY29tcGxhaW50cyBhYm91dCAibWFpbjogcmV0dXJuIHR5cGUgaXMgbm90IGJsYWgiLAorICBkZWZpbmUgTUFJTlRZUEUgb24gdGhlIENDIGNvbW1hbmQgbGluZSwgZS5nLiAiQ0ZMQUdTPS1ETUFJTlRZUEU9aW50Ii4KKyovCitNQUlOVFlQRQorI2Vsc2UKKyNpZmRlZiBDS19TQ09WNQoraW50CisjZWxzZQorI2lmZGVmIF9fREVDQworI2lmZGVmIF9fQUxQSEEKK2ludAorI2Vsc2UKK1ZPSUQKKyNlbmRpZiAvKiBfX0FMUEhBICovCisjZWxzZQorI2lmZGVmIFNUUkFUVVMKK2ludAorI2lmZGVmIF9fR05VQ19fCitpbnQKKyNlbHNlCisvKgorICBUaGUgZGVmYXVsdCBjYXNlIHNob3VsZCBiZSBpbnQsIG5vdCBWT0lELCBidXQgaXQncyBiZWVuIHRoaXMgd2F5IGZvcgorICB5ZWFycyAobm8gZG91YnQgZm9yIGEgcmVhc29uKSBhbmQgd2hvIGtub3dzIGhvdyBtYW55IGJ1aWxkcyB3b3VsZCBicmVhaworICBpZiBJIGNoYW5nZWQgaXQuCisqLworVk9JRAorI2VuZGlmIC8qIF9fR05VQ19fICovCisjZW5kaWYgLyogU1RSQVRVUyAqLworI2VuZGlmIC8qIF9fREVDQyAqLworI2VuZGlmIC8qIENLX1NDT1Y1ICovCisjZW5kaWYgLyogTUFJTlRZUEUgKi8KKyNlbmRpZiAvKiBTVFJBVFVTICovCittYWluKGFyZ2MsYXJndikgaW50IGFyZ2M7IGNoYXIgKiphcmd2OyB7CisgICAgdHJhbnMgaGVhZDsKKyAgICBpbnQgc3RhdGUsYzsKKyAgICBGSUxFICppbmZpbGUsKm91dGZpbGU7CisKKyAgICBpZiAoYXJnYyA+IDEpIHsKKwlpZiAoKGluZmlsZSA9IGZvcGVuKGFyZ3ZbMV0sInIiKSkgPT0gTlVMTCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwiQ2FuJ3Qgb3BlbiAlc1xuIixhcmd2WzFdKTsKKwkgICAgZmF0YWwoInVucmVhZGFibGUgaW5wdXQgZmlsZSIpOworCX0KKyAgICB9IGVsc2UgaW5maWxlID0gc3RkaW47CisKKyAgICBpZiAoYXJnYyA+IDIpIHsKKwlpZiAoKG91dGZpbGUgPSBmb3Blbihhcmd2WzJdLCJ3IikpID09IE5VTEwpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsIkNhbid0IHdyaXRlIHRvICVzXG4iLGFyZ3ZbMl0pOworCSAgICBmYXRhbCgiYmFkIG91dHB1dCBmaWxlIik7CisJfQorICAgIH0gZWxzZSBvdXRmaWxlID0gc3Rkb3V0OworCisgICAgY2xyaGFzaCgpOwkJCQkvKiBlbXB0eSBoYXNoIHRhYmxlICovCisgICAgaGVhZCA9IHJkaW5wdXQoaW5maWxlLG91dGZpbGUpOwkvKiByZWFkIGlucHV0IGZpbGUgKi8KKyAgICBlbXB0eXRibCgpOwkJCQkvKiBlbXB0eSBvdXIgdGFibGVzICovCisgICAgZm9yIChzdGF0ZSA9IDA7IHN0YXRlIDw9IG5zdGF0ZXM7IHN0YXRlKyspCisgICAgICBmb3IgKGMgPSAxOyBjIDwgOTY7IGMrKykJCS8qIGZpbmQgYWN0aW9ucywgKi8KKwlhZGRhY3Rpb24oZmFjdGlvbihoZWFkLHN0YXRlLGMpLHN0YXRlLGMpOyAvKiBhZGQgdG8gdGJsICovCisgICAgd3JpdGV0Ymwob3V0ZmlsZSk7CisgICAgY29weXJlc3QoaW5maWxlLG91dGZpbGUpOworICAgIHByaW50ZigiJWQgc3RhdGVzLCAlZCBhY3Rpb25zXG4iLG5zdGF0ZXMsbmFjdHMpOworICAgIGV4aXQoR09PRF9FWElUKTsKK30KKworCisvKgorICogZmF0YWwgZXJyb3IgaGFuZGxlcgorICoKKyAqLworCitWT0lECitmYXRhbChtc2cpIGNoYXIgKm1zZzsgeworICAgIGZwcmludGYoc3RkZXJyLCJlcnJvciBpbiBsaW5lICVkOiAlc1xuIixsaW5lcyxtc2cpOworICAgIGV4aXQoQkFEX0VYSVQpOworfQorCitWT0lECitwcm9sb2cob3V0ZnApIEZJTEUgKm91dGZwOyB7CisgICAgaW50IGM7CisgICAgd2hpbGUgKChjID0gKnR4dDErKykgICAgICE9ICdcMCcpIHB1dGMoYyxvdXRmcCk7CisgICAgd2hpbGUgKChjID0gKmZuYW1lKyspICAgICE9ICdcMCcpIHB1dGMoYyxvdXRmcCk7CisgICAgd2hpbGUgKChjID0gKnR4dDIrKykgICAgICE9ICdcMCcpIHB1dGMoYyxvdXRmcCk7CisgICAgd2hpbGUgKChjID0gKnRibF90eXBlKyspICE9ICdcMCcpIHB1dGMoYyxvdXRmcCk7CisgICAgd2hpbGUgKChjID0gKnR4dDJhKyspICAgICE9ICdcMCcpIHB1dGMoYyxvdXRmcCk7CisgICAgd2hpbGUgKChjID0gKnR4dDJiKyspICAgICE9ICdcMCcpIHB1dGMoYyxvdXRmcCk7Cit9CisKK1ZPSUQKK2VwaWxvZ3VlKG91dGZwKSBGSUxFICpvdXRmcDsgeworICAgIGludCBjOworICAgIHdoaWxlICgoYyA9ICp0eHQzKyspICE9ICdcMCcpIHB1dGMoYyxvdXRmcCk7Cit9CisKK1ZPSUQKK2NvcHlyZXN0KGluLG91dCkgRklMRSAqaW4sKm91dDsgeworICAgIGludCBjOworICAgIHdoaWxlICgoYyA9IGdldGMoaW4pKSAhPSBFT0YpIHB1dGMoYyxvdXQpOworfQorCisvKgorICogZ2V0dG9rZW4gLSByZXR1cm5zIHRva2VuIHR5cGUgb2YgbmV4dCB0b2tlbiwgc2V0cyB0b2t2YWwKKyAqIHRvIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHRva2VuIGlmIGFwcHJvcHJpYXRlLgorICoKKyAqLworCitpbnQKK2dldHRva2VuKGZwKSBGSUxFICpmcDsgeworICAgIGludCBjOworICAgIHdoaWxlICgxKSB7CQkJCS8qIGxvb3AgaWYgcmVhZGluZyBjb21tZW50cy4uLiAqLworCWRvIHsKKwkgICAgYyA9IGdldGMoZnApOworCSAgICBpZiAoYyA9PSAnXG4nKSBsaW5lcysrOworCX0gd2hpbGUgKChpc3NwYWNlKGMpIHx8IGMgPT0gQ19MKSk7IC8qIHNraXAgd2hpdGVzcGFjZSAqLworCXN3aXRjaChjKSB7CisJICBjYXNlIEVPRjoKKwkgICAgcmV0dXJuKFNFUCk7CisJICBjYXNlICclJzoKKwkgICAgaWYgKChjID0gZ2V0YyhmcCkpID09ICclJykgcmV0dXJuKFNFUCk7CisJICAgIHRva3ZhbFswXSA9ICclJzsKKwkgICAgdG9rdmFsWzFdID0gKGNoYXIpIGM7CisJICAgIHJkd29yZChmcCx0b2t2YWwrMik7CisJICAgIHJldHVybihXT1JEKTsKKwkgIGNhc2UgJzwnOgorCSAgICByZXR1cm4oTEJSQUNLKTsKKwkgIGNhc2UgJz4nOgorCSAgICByZXR1cm4oUkJSQUNLKTsKKwkgIGNhc2UgJywnOgorCSAgICByZXR1cm4oQ09NTUEpOworCSAgY2FzZSAnLyc6CisJICAgIGlmICgoYyA9IGdldGMoZnApKSA9PSAnKicpIHsKKwkJcmRjbW50KGZwKTsJCS8qIHNraXAgb3ZlciB0aGUgY29tbWVudCAqLworCQljb250aW51ZTsKKwkgICAgfSBlbHNlIHsJCQkvKiBhbmQga2VlcCBsb29waW5nICovCisJCXVuZ2V0YyhjLGZwKTsJCS8qIHB1dCB0aGlzIGJhY2sgaW50byBpbnB1dCAqLworCQljID0gJy8nOwkJLyogcHV0IGNoYXJhY3RlciBiYWNrLCBmYWxsIHRocnUgKi8KKwkgICAgfQorCisJICBkZWZhdWx0OgorCSAgICBpZiAoaXN3b3JkKGMpKSB7CisJCXVuZ2V0YyhjLGZwKTsKKwkJcmR3b3JkKGZwLHRva3ZhbCk7CisJCXJldHVybihXT1JEKTsKKwkgICAgfSBlbHNlIGZhdGFsKCJJbnZhbGlkIGNoYXJhY3RlciBpbiBpbnB1dCIpOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBza2lwIG92ZXIgYSBjb21tZW50CisgKgorICovCisKK1ZPSUQKK3JkY21udChmcCkgRklMRSAqZnA7IHsKKyAgICBpbnQgYyxzdGFyLHByY250OworICAgIHByY250ID0gc3RhciA9IDA7CQkJLyogbm8gc3RhciBzZWVuIHlldCAqLworICAgIHdoaWxlICghKChjID0gZ2V0YyhmcCkpID09ICcvJyAmJiBzdGFyKSkgeworCWlmIChjID09IEVPRiB8fCAocHJjbnQgJiYgYyA9PSAnJScpKSBmYXRhbCgiVW50ZXJtaW5hdGVkIGNvbW1lbnQiKTsKKwlwcmNudCA9IChjID09ICclJyk7CisJc3RhciA9IChjID09ICcqJyk7CisJaWYgKGMgPT0gJ1xuJykgbGluZXMrKzsKKyAgICB9Cit9CisKKy8qCisgKiBzeW1ib2wgdGFibGUgbWFuYWdlbWVudCBmb3Igd2FydAorICoKKyAqIGVudHJ5IHBvaW50czoKKyAqICAgY2xyaGFzaCAtIGVtcHR5IGhhc2ggdGFibGUuCisgKiAgIGVudGVyIC0gZW50ZXIgYSBuYW1lIGludG8gdGhlIHN5bWJvbCB0YWJsZQorICogICBsa3VwIC0gZmluZCBhIG5hbWUncyB2YWx1ZSBpbiB0aGUgc3ltYm9sIHRhYmxlLgorICoKKyAqLworCisjZGVmaW5lIEhBU0hTSVpFIDEwMQkJCS8qICMgb2YgZW50cmllcyBpbiBoYXNoIHRhYmxlICovCisKK3N0cnVjdCBzeW0geworICAgIGNoYXIgKm5hbWU7CQkJCS8qIHN5bWJvbCBuYW1lICovCisgICAgaW50IHZhbDsJCQkJLyogdmFsdWUgKi8KKyAgICBzdHJ1Y3Qgc3ltICpobnh0OwkJCS8qIG5leHQgb24gY29sbGlzaW9uIGNoYWluICovCit9ICpodGFiW0hBU0hTSVpFXTsJCQkvKiB0aGUgaGFzaCB0YWJsZSAqLworCisvKgorICogZW1wdHkgdGhlIGhhc2ggdGFibGUgYmVmb3JlIHVzaW5nIGl0Li4uCisgKgorICovCitWT0lECitjbHJoYXNoKCkgeworICAgIGludCBpOworICAgIGZvciAoaT0wOyBpPEhBU0hTSVpFOyBpKyspIGh0YWJbaV0gPSBOVUxMOworfQorCisvKgorICogY29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIGhhc2ggZm9yIGEgc3ltYm9sCisgKgorICovCitpbnQKK2hhc2gobmFtZSkgY2hhciAqbmFtZTsgeworICAgIGludCBzdW07CisgICAgZm9yIChzdW0gPSAwOyAqbmFtZSAhPSAnXDAnOyBuYW1lKyspIHN1bSArPSAoc3VtICsgKm5hbWUpOworICAgIHN1bSAlPSBIQVNIU0laRTsJCQkvKiB0YWtlIHN1bSBtb2QgaGFzaHNpemUgKi8KKyAgICBpZiAoc3VtIDwgMCkgc3VtICs9IEhBU0hTSVpFOwkvKiBkaXNhbGxvdyBuZWdhdGl2ZSBoYXNoIHZhbHVlICovCisgICAgcmV0dXJuKHN1bSk7Cit9CisKKy8qCisgKiBtYWtlIGEgcHJpdmF0ZSBjb3B5IG9mIGEgc3RyaW5nLi4uCisgKgorICovCitzdGF0aWMgY2hhcioKK2NvcHkocykgY2hhciAqczsgeworICAgIGNoYXIgKm5ldzsKKyAgICBuZXcgPSAoY2hhciAqKSBtYWxsb2MoKGludClzdHJsZW4ocykgKyAxKTsKKyAgICBzdHJjcHkobmV3LHMpOworICAgIHJldHVybihuZXcpOworfQorCisvKgorICogZW50ZXIgc3RhdGUgbmFtZSBpbnRvIHRoZSBoYXNoIHRhYmxlCisgKgorICovCitWT0lECitlbnRlcihuYW1lLHN2YWx1ZSkgY2hhciAqbmFtZTsgaW50IHN2YWx1ZTsgeworICAgIGludCBoOworICAgIHN0cnVjdCBzeW0gKmN1cjsKKyAgICBpZiAobGt1cChuYW1lKSAhPSAtMSkgeworCWZwcmludGYoc3RkZXJyLCJzdGF0ZSBcIiVzXCIgYXBwZWFycyB0d2ljZS4uLlxuIiwgbmFtZSk7CisJZXhpdChCQURfRVhJVCk7CisgICAgfQorICAgIGggPSBoYXNoKG5hbWUpOworICAgIGN1ciA9IChzdHJ1Y3Qgc3ltICopbWFsbG9jKHNpemVvZiAoc3RydWN0IHN5bSkpOworICAgIGN1ci0+bmFtZSA9IGNvcHkobmFtZSk7CisgICAgY3VyLT52YWwgPSBzdmFsdWU7CisgICAgY3VyLT5obnh0ID0gaHRhYltoXTsKKyAgICBodGFiW2hdID0gY3VyOworfQorCisvKgorICogZmluZCBuYW1lIGluIHRoZSBzeW1ib2wgdGFibGUsIHJldHVybiBpdHMgdmFsdWUuICBSZXR1cm5zIC0xCisgKiBpZiBub3QgZm91bmQuCisgKgorICovCitpbnQKK2xrdXAobmFtZSkgY2hhciAqbmFtZTsgeworICAgIHN0cnVjdCBzeW0gKmN1cjsKKyAgICBmb3IgKGN1ciA9IGh0YWJbaGFzaChuYW1lKV07IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPmhueHQpCisgICAgICBpZiAoc3RyY21wKGN1ci0+bmFtZSxuYW1lKSA9PSAwKSByZXR1cm4oY3VyLT52YWwpOworICAgIHJldHVybigtMSk7Cit9CmRpZmYgLS1naXQgYS9ja2VybWl0LTguMC4yMTEvbWFrZWZpbGUgYi9ja2VybWl0LTguMC4yMTEvbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxMDMzMQotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQtOC4wLjIxMS9tYWtlZmlsZQpAQCAtMCwwICsxLDc4NTEgQEAKKyMgbWFrZWZpbGUgLyBNYWtlZmlsZSAvIGNrdWtlci5tYWsgLyBDS1VLRVIuTUFLCisjCisjIFNhdCBBcHIgMTcgMTQ6NDk6MTggMjAwNAorQlVJTERJRD0yMDA0MDQxNworIworQ0tWRVI9ICI4LjAuMjExIgorIworIyAtLSBNYWtlZmlsZSB0byBidWlsZCBDLUtlcm1pdCBmb3IgVU5JWCBhbmQgVU5JWC1saWtlIHBsYXRmb3JtcyAtLQorIworIyBDb3B5cmlnaHQgKEMpIDE5ODUsIDIwMDQsCisjICAgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUgQ2l0eSBvZiBOZXcgWW9yay4KKyMgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBDLUtlcm1pdCBDT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQorIyAgIGNvcHlyaWdodCB0ZXh0IGluIHRoZSBja2NtYWkuYyBtb2R1bGUgZm9yIGRpc2NsYWltZXIgYW5kIHBlcm1pc3Npb25zLgorIworIyBBdXRob3I6IEZyYW5rIGRhIENydXosIENvbHVtYmlhIFVuaXZlcnNpdHkKKyMgNjEyIFdlc3QgMTE1dGggU3RyZWV0LCBOZXcgWW9yayBOWSAxMDAyNS03Nzk5LCBVU0EKKyMgRS1tYWlsOiBmZGNAY29sdW1iaWEuZWR1CisjIEZheDogICAgKzEgMjEyIDY2Mi02NDQyCisjIFdlYjogICAgaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0LworIworIyBDb250cmlidXRpb25zIGZyb20gbWFueSBvdGhlcnMuICBTcGVjaWFsIHRoYW5rcyB0byBKZWZmIEFsdG1hbiBmb3IgdGhlCisjIHNlY3VyZS10YXJnZXQgZW50cmllcywgUGV0ZXIgRWljaGhvcm4sIGFzc3lzdCBHbWJILCBmb3IgdGhlIGNvbnNvbGlkYXRlZAorIyBIUC1VWCBlbnRyaWVzIGFuZCB0aGUgInVuaW5zdGFsbCIgdGFyZ2V0LCB0byBSb2JlcnQgTGlwZSBmb3IgdGhlIHVwZGF0ZWQKKyMgYW5kIGNvbnNvbGlkYXRlZCBTQ08gVU5JWCAvIE9EVCAvIE9TUjUgZW50cmllcywgdG8gUmljIEFuZGVyc29uIGZvciB0aGUKKyMgSVJJWCA2LnggZW50cmllcy4KKyMKKyMgTW9zdCBlbnRyaWVzIHVzZSB0aGUgInhlcm1pdCIgdGFyZ2V0LCB3aGljaCB1c2VzIHRoZSBzZWxlY3QoKS1iYXNlZCBDT05ORUNUCisjIG1vZHVsZSwgY2t1Y25zLmMuICBUaGUgIndlcm1pdCIgdGFyZ2V0IHVzZXMgdGhlIG9sZGVyIGZvcmsoKS1iYXNlIENPTk5FQ1QKKyMgbW9kdWxlLCBja3Vjb24uYywgd2hpY2ggaGFzIHNvbWUgZHJhd2JhY2tzIChidXQgaXMgbW9yZSBwb3J0YWJsZSkuICBJZiB5b3VyCisjIGVudHJ5IHN0aWxsIHVzZXMgdGhlICJ3ZXJtaXQiIHRhcmdldCwgcGxlYXNlIHRyeSBzdWJzdGl0dXRpbmcgdGhlICJ4ZXJtaXQiCisjIG9uZSBhbmQgaWYgaXQgd29ya3MsIGxldCB1cyBrbm93IChtYWlsdG86a2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1KS4KKyMgV2hlbiBjaGFuZ2luZyBhIHRhcmdldCBvdmVyIGZyb20gd2VybWl0IHRvIHhlcm1pdCwgYWxzbyByZW1vdmUgLUROT0xPRUFSTi4KKyMKKyMgQ0FSRUZVTDogRG9uJ3QgcHV0IHRoZSBsb3dlcmNhc2Ugd29yZCAiaWYiLCAiZGVmaW5lIiwgb3IgImVuZCIgYXMgdGhlIGZpcnN0CisjIHdvcmQgYWZ0ZXIgdGhlICIjIiBjb21tZW50IGludHJvZHVjZXIgaW4gdGhlIG1ha2VmaWxlLCBldmVuIGlmIGl0IGlzCisjIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLiAgU29tZSB2ZXJzaW9ucyBvZiAibWFrZSIgdW5kZXJzdGFuZCB0aGVzZSBhcworIyBkaXJlY3RpdmVzLiAgVXBwZXJjYXNlIGxldHRlcnMgcmVtb3ZlIHRoZSBkYW5nZXIsIGUuZy4gIiMgSWYgeW91IGhhdmUuLi4iCisjCisjIFdBUk5JTkc6IFRoaXMgaXMgYSBodWdlIG1ha2VmaWxlIGFuZCBpdCBjb250YWlucyBuZXN0ZWQgbWFrZXMuICBTb21lICJtYWtlIgorIyBwcm9ncmFtcyBtaWdodCBydW4gb3V0IG9mIG1lbW9yeS4gIElmIHRoaXMgaGFwcGVucyB0byB5b3UsIGVkaXQgYXdheSB0aGUKKyMgcGFydHMgdGhhdCBkbyBub3QgYXBwbHkgdG8geW91ciBwbGF0Zm9ybSBhbmQgdHJ5IGFnYWluLgorIworIyBDZXJ0YWluIFVOSVggdmFyaWF0aW9ucyBoYXZlIHRoZWlyIG93biBzZXBhcmF0ZSBtYWtlZmlsZXM6CisjICAuIEZvciAyLjEwIG9yIDIuMTEgQlNEIG9uIERFQyBQRFAtMTFzLCB1c2UgY2t1YnMyLm1hay4KKyMgIC4gRm9yIFBsYW4gOSwgdXNlIGNrcGtlci5tay4KKyMKKyMgU2VwYXJhdGUgYnVpbGQgcHJvY2VkdXJlcyBhcmUgcHJvdmlkZWQgbm9uLVVOSVggcGxhdGZvcm1zOiBWTVMsIFZPUywKKyMgQU9TL1ZTLCBldGMuICBTZWUgdGhlIGNrYWFhYS50eHQgZmlsZSBmb3IgZGV0YWlscy4KKyMKKyMKKyMgRElSRUNUSU9OUworIworIyBSZW5hbWUgdGhpcyBmaWxlIHRvICJtYWtlZmlsZSIgb3IgIk1ha2VmaWxlIiBpZiBuZWNlc3NhcnkuICBQaWNrIG91dCB0aGUKKyMgZW50cnkgbW9zdCBhcHByb3ByaWF0ZSBmb3IgeW91ciBVTklYIHZlcnNpb24gZnJvbSB0aGUgbGlzdCBiZWxvdyBhbmQgdGhlbgorIyBnaXZlIHRoZSBhcHByb3ByaWF0ZSAibWFrZSIgY29tbWFuZCwgZm9yIGV4YW1wbGUgIm1ha2UgYWl4NDMiLCAibWFrZSBzeXM1cjQiLAorIyAibWFrZSBsaW51eCIuICBJZiB5b3UgZXhwZXJpZW5jZSBhbnkgZGlmZmljdWx0aWVzIHdpdGggdGhlIGJ1aWxkIHByb2NlZHVyZSwKKyMgdGhlbiBwbGVhc2UgYWxzbyByZWFkIGFueSBjb21tZW50cyB0aGF0IGFjY29tcGFueSB0aGUgbWFrZSBlbnRyeSBpdHNlbGYKKyMgKHNlYXJjaCBmb3IgdGhlIG1ha2UgZW50cnkgbmFtZSBvbiB0aGUgbGVmdCBtYXJnaW4pLgorIworIyBPdGhlciBlbnRyaWVzOgorIyAgJ21ha2UgaW5zdGFsbCcgaXMgYW4gaW5zdGFsbGF0aW9uIHNjcmlwdCAocmVhZCBhY2NvbXBhbnlpbmcgY29tbWVudHMhKS4KKyMgICdtYWtlIGNsZWFuJyByZW1vdmVzIGludGVybWVkaWF0ZSBhbmQgb2JqZWN0IGZpbGVzLgorIworIyBJTVBPUlRBTlQ6CisjICAgRm9yIG1vcmUgZGV0YWlsZWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucywgcmVhZCB0aGUgZmlsZXMgY2t1aW5zLnR4dAorIyAgIGFuZCBja2NjZmcudHh0LCBhbHNvIGF2YWlsYWJsZSBhdCB0aGUgS2VybWl0IHdlYnNpdGUgaW4gSFRNTCBmb3JtOgorIyAgIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja3VpbnMuaHRtbAorIyAgIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2NjZmcuaHRtbAorIworIyAgRm9yIGRlc2NyaXB0aW9ucyBvZiBrbm93biBwcm9ibGVtcyBhbmQgbGltaXRhdGlvbnMsCisjICAgcmVhZCB0aGUgZmlsZXMgY2tjYndyLnR4dCBhbmQgY2t1YndyLnR4dCAodGhlICJiZXdhcmUgZmlsZXMiKSBvcjoKKyMgICBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tjYndyLmh0bWwKKyMgICBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2t1YndyLmh0bWwKKyMKKyMgTW9zdCBlbnRyaWVzIGJ1aWxkIEMtS2VybWl0IHdpdGggaXRzIHN5bWJvbCB0YWJsZSBpbmNsdWRlZC4gIFRvIHJlZHVjZSB0aGUKKyMgc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtLCBhZGQgIkxOS0ZMQUdTPS1zIiB0byB0aGUgZW5kIG9mIHlvdXIgJ21ha2UnCisjIGNvbW1hbmQgb3IgdG8gdGhlIG1ha2VmaWxlIGVudHJ5LCBvciAnc3RyaXAnIHRoZSBleGVjdXRhYmxlIGFmdGVyCisjIGJ1aWxkaW5nLiAgVG8gZnVydGhlciByZWR1Y2UgdGhlIHNpemUgYWZ0ZXIgYnVpbGRpbmcsIHVzZSAnbWNzIC1kJyBpZiB5b3VyCisjIFVuaXggdmVyc2lvbiBoYXMgc3VjaCBhIGNvbW1hbmQuICBGb3IgZnVydGhlciBkZXRhaWxzIG9uIHNpemUgcmVkdWN0aW9uLCByZWFkCisjIGNrY2NmZy50eHQgdG8gZmluZCBvdXQgaG93IHRvIHJlbW92ZSBmZWF0dXJlcyB0aGF0IHlvdSBkb24ndCBuZWVkLgorIworIyBUQ1AvSVAgbmV0d29ya2luZyBzdXBwb3J0OiBJZiB5b3VyIEMtS2VybWl0IHZlcnNpb24gZG9lcyBub3QgaW5jbHVkZSBUQ1AvSVAKKyMgbmV0d29ya2luZywgYnV0IHlvdXIgVU5JWCBzeXN0ZW0gZG9lcywgdHJ5IGFkZGluZyAtRFRDUFNPQ0tFVCB0byB0aGUgQ0ZMQUdTCisjIG9mIHlvdXIgbWFrZWZpbGUgZW50cnkuICBJZiB0aGF0IGRvZXNuJ3Qgd29yaywgbG9vayBhdCBzb21lIG9mIHRoZSBvdGhlcgorIyBlbnRyaWVzIHRoYXQgaW5jbHVkZSB0aGlzIGZsYWcgZm9yIGlkZWFzIGFib3V0IHdoYXQgbGlicmFyaWVzIG1pZ2h0IG5lZWQgdG8KKyMgYmUgaW5jbHVkZWQgKHR5cGljYWxseSAtbHNvY2tldCBhbmQvb3IgLWxCU0QgYW5kL29yIC1sbnNsIGFuZC9vciAtbGluZXQpLgorIyBOT1RFOiBJbiBzb21lIGNhc2VzIChvbGQgdmVyc2lvbnMgb2YgU0NPIG9yIEhQLVVYKSwgeW91IG1pZ2h0IG5lZWQgbm90IG9ubHkKKyMgYSBDIGNvbXBpbGVyLCBidXQgYWxzbyBhICJUQ1AvSVAgZGV2ZWxvcGVycyBraXQiIGZvciB0aGUgcmVxdWlyZWQgb2JqZWN0CisjIGxpYnJhcmllcyBhbmQgaGVhZGVyIGZpbGVzLgorIworIyBGdWxsc2NyZWVuIGZpbGUgdHJhbnNmZXIgZGlzcGxheSBzdXBwb3J0OiBJZiB5b3UgYXJlIGdvaW5nIHRvIHVzZSBDLUtlcm1pdAorIyBmb3IgZXN0YWJsaXNoaW5nIGNvbm5lY3Rpb25zIChkaWFsZWQsIG5ldHdvcmssIGV0YyksIHlvdSBjYW4gY29uZmlndXJlIGl0IHRvCisjIHByb2R1Y2UgYSBmb3JtYXR0ZWQgZmlsZSB0cmFuc2ZlciBkaXNwbGF5IGJ5IGluY2x1ZGluZyB0aGUgY3Vyc2VzIGxpYnJhcnkKKyMgYW5kIGFkZGluZyAtRENLX0NVUlNFUyB0byB0aGUgQ0ZMQUdTIGZvciB5b3VyIG9wdGlvbiwgYW5kIGxpbmtpbmcgd2l0aCB0aGUKKyMgYXBwcm9wcmlhdGUgbGlicmFyaWVzLiAgVGhlcmUgYXJlIG1hbnkgZXhhbXBsZXMgYmVsb3csIHVzdWFsbHkgZW5kaW5nIGluCisjICJjIiwgbGlrZSBzdW5vczQxYy4gIEFsc28gYWRkIC1EQ0tfV1JFRlJFU0ggaWYgeW91ciBjdXJzZXMgbGlicmFyeSBpbmNsdWRlcworIyBjbGVhcm9rKCkgYW5kIHdyZWZyZXNoKCkgZnVuY3Rpb25zIChvciByZW1vdmUgLUROT1dSRUZSRVNIIGlmIHRoZSBsaW5rZXIKKyMgY29tcGxhaW5zIHRoYXQgaXQgY2FuJ3QgZmluZCB0aGVzZSBmdW5jdGlvbnMpLgorIworIyBQbGVhc2UgcmVwb3J0IG1vZGlmaWNhdGlvbnMsIGZhaWx1cmVzIChwcmVmZXJhYmx5IHdpdGggZml4ZXMpIG9yIHN1Y2Nlc3NlcworIyB0byB0aGUgYXV0aG9yLgorIworIyBTRUNVUkUgVEFSR0VUUworIyAgVGhlc2UgYXJlIGRlc2NyaWJlZCBhZnRlciB0aGUgbmV4dCBzZWN0aW9uLiAgU2VhcmNoIGZvciAqKioqKioqIGJlbG93LgorIworIyBUQVJHRVRTIEZPUiBESUZGRVJFTlQgVU5JWCBQTEFURk9STVMgQU5EIFZFUlNJT05TOgorIworIyArIE1hcmtzIHRob3NlIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0IHN1Y2Nlc3NmdWxseSBmb3IgQy1LZXJtaXQgOC4wIG9yIGxhdGVyLgorIyAtIFRob3NlIHRoYXQgb25jZSBidWlsdCBPSyBidXQgbm8gbG9uZ2VyIGRvIChlLmcuIHRvbyBiaWcpLgorIyA/IFRob3NlIHRoYXQgd29ya2VkIGluIGEgcHJldmlvdXMgdmVyc2lvbiBidXQgaGF2ZSBub3QgYmVlbiB0ZXN0ZWQgcmVjZW50bHkuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjID8gZm9yIDM4NkJTRCAoSm9saXgpIDAuMCwgMC4xLCAibWFrZSAzODZic2QiIChzZWUgY29tbWVudHMgaW4gZW50cnkpLAorIyAgICAgb3IgKHByZWZlcmFibHksIGlmIGl0IHdvcmtzKSAibWFrZSBic2Q0NCIgb3IgIm1ha2UgYnNkNDRjIi4KKyMgPyBmb3IgQWNvcm4gUklTQ2lYLCAibWFrZSByaXNjaXgiIG9yICJtYWtlIHJpc2NpeC1nY2MiCisjID8gZm9yIEFsbGlhbnQgRlgvOCB3aXRoIENvbmNlbnRyaXggNC4xIG9yIGxhdGVyLCAibWFrZSBic2RsY2siCisjID8gZm9yIEFsdG9zIDQ4NiwgNTg2LCA5ODYgd2l0aCBYZW5peCAzLjAsICJtYWtlIGFsdG9zIgorIyA/IGZvciBBbHRvcyBBQ1M2ODAwMCwgOE1oeiA2ODAwMCwgVU5JWCBTeXN0ZW0gMyBSZWwgMiwgNTEySywgIm1ha2UgYWx0b3MzIgorIyA/IGZvciBBbWRhaGwgVVRTIDIuNCBvbiBJQk0gMzcwIHNlcmllcyAmIGNvbXBhdGlibGUgbWFpbmZyYW1lcywgIm1ha2UgdXRzMjQiCisjID8gZm9yIEFtZGFobCBVVFNWIElCTSAzNzAgc2VyaWVzICYgY29tcGF0aWJsZSBtYWluZnJhbWVzLCAibWFrZSB1dHN2IgorIyA/IGZvciBBbWRhaGwgVVRTViBJQk0gMzcwIHNlcmllcyBtYWluZnJhbWVzIHdpdGggVENQL0lQLCAibWFrZSB1dHN2dGNwIgorIyA/IGZvciBBbWRhaGwgbWFpbmZyYW1lcyB3aXRoIFVOSVggU3lzdGVtIFYgUiA1LjIuNmIgNTgwLCAibWFrZSBzeXMzIgorIyA/IGZvciBBcG9sbG8gQWVnaXMgOS54LCBET01BSU4vSVggOS54LCAibWFrZSBhZWdpcyIKKyMgICAgKExhc3QgdGVzdGVkIGluIEMtS2VybWl0IDVBKDE4OSkpCisjID8gZm9yIEFwb2xsbyBET01BSU4vSVgsIGlmIHRoZSBhYm92ZSBmYWlscywgdHJ5ICJtYWtlIGFwb2xsb2JzZCIKKyMgPyBmb3IgQXBvbGxvIHdpdGggU1IxMC4wIG9yIGxhdGVyLCBCU0QgZW52aXJvbm1lbnQsICJtYWtlIHNyMTAtYnNkIgorIyA/IGZvciBBcG9sbG8gd2l0aCBTUjEwLjAgb3IgbGF0ZXIsIFN5c3RlbSBWIGVudmlyb25tZW50LCAibWFrZSBzcjEwLXM1cjMiCisjID8gZm9yIEFwcGxlIE1hY2ludG9zaCBJSSB3aXRoIEEvVVggcHJlLTMuMCwgIm1ha2UgYXV4IiwgImF1eGdjYyIgb3IgImF1eHVmcyIKKyMgPyBmb3IgQXBwbGUgTWFjaW50b3NoIHdpdGggQS9VWCAzLjAgYW5kIGdjYywgIm1ha2UgYXV4M2djYyIgb3IgYXV4M2djY2MKKyMgPyBmb3IgQXBwbGUgUG93ZXJNYWMgd2l0aCBNa0xpbnV4LCAibWFrZSBta2xpbnV4IiAocmVhZCBMaW51eCBlbnRyeSBmaXJzdCkKKyMgKyBmb3IgQXBwbGUgUG93ZXJNYWMgd2l0aCBMaW51eFBQQywgIm1ha2UgbGludXhwcGMiCisjID8gZm9yIEFwcGxlIE1hY2ludG9zaCB3aXRoIE1pbml4IDEuNS4xMCwgIm1ha2UgbWluaXg2OGsiIG9yICJtYWtlIG1pbml4YzY4IgorIyArIGZvciBBcHBsZSBNYWNpbnRvc2ggd2l0aCBNYWMgT1MgWCAxLjAgKFJoYXBzb2R5KSwgIm1ha2UgbWFjb3N4MTAiCisjICAgICAobm8gY3Vyc2VzKSwgIm1ha2UgbWFjb3N4MTBjIiAoY3Vyc2VzKSwgb3IgIm1ha2UgbWFjb3N4MTBuYyIgKG5jdXJzZXMpLgorIyAgICAgT3IgIm1ha2UgbWFjb3N4MTBuY3giIChuY3Vyc2VzIGJ1dCAibWFrZSBtYWNvc3gxMG5jIiBkb2Vzbid0IHdvcmspLgorIyArIGZvciBBcHBsZSBNYWNpbnRvc2ggd2l0aCBNYWMgT1MgWCAxMC4yLCAibWFrZSBtYWNvc3gxMDJuYyIgKG5jdXJzZXMpLgorIyArIGZvciBBcHBsZSBNYWNpbnRvc2ggd2l0aCBNYWMgT1MgWCAxMC4zLCAibWFrZSBtYWNvc3gxMDMiCisjID8gZm9yIEFyaXggU3lzdGVtIDkwIHdpdGggQVQmVCBTVlIzLCAibWFrZSBzeXM1cjNuYSIKKyMgLSBmb3IgQVQmVCA2MzAwIHdpdGggSU4vaXgsICJtYWtlIHN5czUiCisjIC0gZm9yIEFUJlQgNjMwMCBQTFVTLCAibWFrZSBhdHQ2MzAwIiBvciAod2l0aCBubyBkZWJ1Z2dpbmcpICJtYWtlIGF0dDYzMDBuZCIKKyMgPyBmb3IgQVQmVCA2Mzg2IFdHUyBVTklYIFBDLCAibWFrZSBzeXM1cjMiCisjICsgZm9yIEFUJlQgM0IyLCAzQjIwIHN5c3RlbXMsICJtYWtlIGF0dDNiMiIuCisjICAgZm9yIEFUJlQgM0IxLCA3MzAwIFVOSVggUEMgKHNlZSBub3RlcyB3aXRoIHRoZSBlbnRyaWVzKToKKyMgICAgIEluIEMtS2VybWl0IDcuMCwgb25seSB0aGUgZ2NjIGVudHJpZXMgd29yazoKKyMgKyAgICJtYWtlIHN5czN1cGNnIiwgIm1ha2Ugc3lzM3VwY2djIiwgIm1ha2UgYXR0MzUxZ20iCisjICAgIFRoZSBvdGhlcnMgZmFpbCB3aXRoICJ0b28gbWFueSBkZWZpbmVzIiAodXN1YWxseSBpbiBja3V1c3IuaCk6CisjIC0gICAibWFrZSBzeXMzdXBjIiwgIm1ha2Ugc3lzM3VwY29sZCIsICJtYWtlIHN5czN1cGNjIiwgIm1ha2Ugc3lzM3VwY3giLAorIyAgICAgICAibWFrZSBzeXMzdXBjbSIsICJtYWtlIGF0dDM1MW0iCisjID8gZm9yIEFUJlQgU3lzdGVtIElJSS9TeXN0ZW0gViBSMiBvciBlYXJsaWVyLCAibWFrZSBzeXMzIiBvciAibWFrZSBzeXMzbmlkIgorIyA/IGZvciBBVCZUIFN5c3RlbSBJSUkvU3lzdGVtIFYgd2l0aCBIb25leSBEYW5CZXIgVVVDUCwgIm1ha2Ugc3lzM2hkYiIKKyMgPyBmb3IgQVQmVCBTeXN0ZW0gViBvbiBERUMgVkFYLCAibWFrZSBzeXMzIiBvciAibWFrZSBzeXM1cjMiCisjICsgZm9yIEFUJlQgU3lzdGVtIFYgUjMsIHVzZSAibWFrZSBzeXM1cjMiIG9yICJtYWtlIHN5czVyM2MiCisjICsgZm9yIEFUJlQgU3lzdGVtIFYvMzg2IFIzLjIgYnVpbHQgb24gSW50ZXJhY3RpdmUgNC4xLjEsICJtYWtlIHN5czVyMzJpcyIuCisjID8gZm9yIEFUJlQgU3lzdGVtIFYvMzg2IFIzMjAuMCBWZXJzeXNzIFN5c3RlbXMsIHVzZSAibWFrZSBzeXM1cjMiCisjICAgICBvciAibWFrZSBzeXM1cjNjIi4KKyMgKyBmb3IgQVQmVCBTeXN0ZW0gViBSNCwgIm1ha2Ugc3lzNXI0IiwgIm1ha2Ugc3lzNXI0c3giLCBvciAibWFrZSBzeXM1cjRueCIsCisjICAgICBvciBpZiB0aGUgQU5TSSBDIGZ1bmN0aW9uIHByb3RvdHlwaW5nIG1ha2VzIHRyb3VibGUsIGFkZCAtRE5PQU5TSSwKKyMgICAgIGFzIGluICJzeXM1cjRzeG5hIiBlbnRyeQorIyArIGZvciBBVCZUIChVU0wpIFN5c3RlbSBWIFI0LjIgdXNlIHRoZSBzeXM1cjQqIGVudHJpZXMuCisjID8gZm9yIEF0YXJpIEZhbGNvbiB3aXRoIE1pTlQsICJtYWtlIHBvc2l4IgorIyA/IGZvciBBdGFyaSBTVCB3aXRoIE1pbml4IFNUIDEuNS4xMC4zLCAibWFrZSBtaW5peDY4ayIgb3IgIm1ha2UgbWluaXhjNjgiCisjID8gZm9yIEJCTiBDLzcwIHdpdGggSU9TIDIuMCwgIm1ha2UgYzcwIgorIyA/IGZvciBCZUJveCB3aXRoIEJlIE9TIDEueCBEUjcsICJtYWtlIGJlYm94ZHI3IgorIyAgICAgQ29tcGlsZXMgT0sgYnV0IGRvZXNuJ3QgbGluayB3aXRoIGRlZmF1bHQgbGlua2VyIHdoaWNoIGlzIGxpbWl0ZWQgdG8gNjRLLgorIyAgICAgTGlua3MgT0sgd2l0aCAiQ29kZSBXYXJyaW9yIEdvbGQiLiAgTWFueSBoYWNrcyBpbiB0aGUgc291cmNlIGNvZGUgbmVlZAorIyAgICAgdG8gYmUgcmVtb3ZlZCB3aGVuIERSOCBhbmQgbGF0ZXIgY29tZSBvdXQuCisjICAgICAoTGFzdCB0ZXN0ZWQgaW4gQy1LZXJtaXQgNi4wKQorIyAtIGZvciBCZUJveCB3aXRoIEJlIE9TIDEueCBEUjgsICJtYWtlIGJlYm94IgorIyAgICAgKE5lZWRlZCBmdW5jdGlvbnMgbWlzc2luZyBmcm9tIG9wZXJhdGluZyBzeXN0ZW0gYW5kL29yIG5vdCB3b3JraW5nLikKKyMgLSBmb3IgQmVsbCBMYWJzIFVOSVggVmVyc2lvbiA2ICg2dGggRWRpdGlvbiksIHRoZXJlIGlzIG5vIG1ha2VmaWxlIGVudHJ5LgorIyA/IGZvciBCZWxsIExhYnMgVU5JWCBWZXJzaW9uIDcgKDd0aCBFZGl0aW9uKSwgIm1ha2UgdjciIChidXQgc2VlIG5vdGVzIGJlbG93KQorIyAgICAobGFzdCBidWlsdCBzdWNjZXNzZnVsbHkgaW4gQy1LZXJtaXQgNUExODgpCisjID8gZm9yIEJlbGwgTGFicyBSZXNlYXJjaCBVTklYIFZlcnNpb24gMTAsICJtYWtlIGJlbGx2MTAiCisjICAgIChsYXN0IGJ1aWx0IHN1Y2Nlc3NmdWxseSBpbiBDLUtlcm1pdCA2LjApCisjID8gZm9yIEJlbGwgTGFicyAvIEx1Y2VudCBQbGFuIDksIHVzZSBzZXBhcmF0ZSBtYWtlZmlsZSBja3BrZXIubWs6CisjICAgIGNhbiBiZSBidWlsdCBmb3IgSW50ZWwsIE1JUFMsIDY4MHgwLCBhbmQgUG93ZXJQQyAobGFzdCBidWlsdCBDLUtlcm1pdCA3LjApCisjICsgZm9yIEJTREkgQlNELzM4NiAxLngsICJtYWtlIGJzZGkiCisjICsgZm9yIEJTREkgQlNEL09TIDIueCwgIm1ha2UgYnNkaTIiCisjICsgZm9yIEJTREkgQlNEL09TIDMuMCBvciAzLjEsICJtYWtlIGJzZGkzIgorIyArIGZvciBCU0RJIEJTRC9PUyA0LngsICJtYWtlIGJzZGk0IgorIyArIGZvciBCU0RJIEJTRC9PUyA0LngsIHRvIGJ1aWxkIGEgYmluYXJ5IHRoYXQgYWxzbyB3b3JrcyBvbiBGcmVlQlNELAorIyAgICAgIm1ha2UgYnNkaXgiLgorIyA/IGZvciBCZXJrZWxleSBVbml4IDIuNCwgIm1ha2UgdjciIChidXQgcmVhZCB2NyBtYXRlcmlhbCBiZWxvdykKKyMgPyBmb3IgQmVya2VsZXkgVW5peCAyLjkgKERFQyBQRFAtMTEgb3IgUHJvLTN4eCksICJtYWtlIGJzZDI5IgorIyAtIGZvciBCZXJrZWxleSBVbml4IDIuMTAsIHVzZSBja3ViczIubWFrIChhIHNlcGFyYXRlIG1ha2VmaWxlKQorIyAtIGZvciBCZXJrZWxleSBVbml4IDIuMTEsIHVzZSBja3ViczIubWFrIChhIHNlcGFyYXRlIG1ha2VmaWxlKQorIyAgICAgVGhpcyBtYWtlZmlsZSBpcyB0b28gYmlnLiAgUmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGluIGNrdWJzMi5tYWsuCisjICAgICAibWFrZSAtZiBja3ViczIubWFrIGJzZDIxMCIgb3IgIm1ha2UgLWYgY2t1YnMyLm1hayBic2QyMTEiLgorIyAgICAgKGxhc3QgYnVpbHQgc3VjY2Vzc2Z1bGx5IGluIEMtS2VybWl0IDYuMCAtIGxhdGVyIHZlcnNpb25zIHRvbyBiaWcpCisjICsgZm9yIEJlcmtlbGV5IFVuaXggMi4xMSAibWFrZSAtZiBja3ViczIubWFrIGJzZDIxMG5vaWNwIiAobm8gY29tbWFuZCBwYXJzZXIpCisjID8gZm9yIEJlcmtlbGV5IFVuaXggNC4xLCAibWFrZSBic2Q0MSIKKyMgKyBmb3IgQmVya2VsZXkgVW5peCA0LjIgb24gVkFYLCAibWFrZSBic2Q0MiIgb3IgIm1ha2UgYnNkNDJjIgorIyA/IGZvciBCZXJrZWxleSBVbml4IDQuMiBvciA0LjMgd2l0aCBIb25leURhbkJlciBVVUNQLCAibWFrZSBic2RoZGIiCisjICsgZm9yIEJlcmtlbGV5IFVuaXggNC4zIG9uIFZBWCwgIm1ha2UgYnNkNDMiLCAibWFrZSBic2Q0M25jIi4KKyMgKyBmb3IgQmVya2VsZXkgVW5peCA0LjMgb24gVkFYLCBubyBuZXR3b3JraW5nICJtYWtlIGJzZDQzbm9uZXQuCisjICsgZm9yIEJlcmtlbGV5IFVuaXggNC4zIHdpdGhvdXQgYWN1Y250cmwgcHJvZ3JhbSwgIm1ha2UgYnNkNDIiIG9yICJic2Q0MmMiCisjICAgICBOT1RFOiBhbGwgdGhlIEMtS2VybWl0IDcuMCBmdWxsIGJ1aWxkcyBmb3Igb2xkIEJTRHMgZmFpbCB3aXRoCisjICAgICAidG9vIG1hbnkgZGVmaW5lcyIgaW4gQ1BQLCBldmVuIG9uIGJpZyBhcmNoaXRlY3R1cmVzIGxpa2UgVkFYLiAgVGhpcworIyAgICAgY2FuIGJlIHdvcmtlZCBhcm91bmQgd2l0aCBhIGNsZXZlciBydXNlLiAgU2VlIGNvbW1lbnRzIGF0IHRhcmdldC4KKyMgKyBmb3IgQmVya2VsZXkgVW5peCA0LjMsIGNvbW1hbmQtbGluZSBvbmx5LCAibWFrZSBic2RtIi4KKyMgKyBmb3IgQmVya2VsZXkgVW5peCA0LjMtVGFob2UsIHNhbWUgYXMgNC4zIEJTRAorIyArIGZvciBCZXJrZWxleSBVbml4IDQuMy1SZW5vLCAibWFrZSBic2Q0MyIgb3IgIm1ha2UgYnNkNDQiIG9yICJtYWtlIGJzZDQ0YyIKKyMgKyBmb3IgQmVya2VsZXkgVW5peCA0LjMtQ2Fyc29uIENpdHksICJtYWtlIGJzZDQ0IiBvciAibWFrZSBic2Q0NGMiCisjICsgZm9yIEJlcmtlbGV5IFVuaXggNC40LU5ldHdvcmtpbmcvMiBvciAtQWxwaGEsICJtYWtlIGJzZDQ0IiBvciAibWFrZSBic2Q0NGMiCisjICsgZm9yIEJlcmtlbGV5IFVuaXggNC40LCAibWFrZSBic2Q0NCIgb3IgIm1ha2UgYnNkNDRjIgorIyArIGZvciBCZXJrZWxleSBVbml4IDQuNC1MaXRlLCAibWFrZSBic2Q0NCIgb3IgIm1ha2UgYnNkNDRjIgorIyA/IGZvciBCdWxsIERQWC8yIHdpdGggQk9TL1gsICJtYWtlIGJ1bGxkcHgyIgorIyA/IGZvciBDYWRtdXMsICJtYWtlIHN5czMiCisjICAgZm9yIENhbGRlcmEsIHNlZSBTQ08sIExpbnV4LgorIyA/IGZvciBDYWxsYW4gVW5pc3RhciwgIm1ha2Ugc3lzMyIKKyMgPyBmb3IgQ0RDIFZYL1ZFIDUuMi4xIFN5c3RlbSBWIGVtdWxhdGlvbiwgIm1ha2Ugdnh2ZSIKKyMgPyBmb3IgQ2hhcmxlcyBSaXZlciBEYXRhIFN5c3RlbXMgVW5pdmVyc2UgNjgweDAgd2l0aCBVTk9TIDkuMiwgbWF5YmUKKyMgICAgIGFsc28gb3RoZXIgVU5PUyB2ZXJzaW9ucywgIm1ha2UgY3JkcyIKKyMgPyBmb3IgQ0lFIFN5c3RlbXMgNjgwLzIwIHdpdGggUmVndWx1cywgIm1ha2UgY2llIgorIyArIGZvciBDb21tb2RvcmUgQW1pZ2EgMzAwMFVYIFN5cyBWIFI0LCAibWFrZSBzeXM1cjRzeCIKKyMgKyBmb3IgQ29tbW9kb3JlIEFtaWdhIDMwMDBVWCBTeXMgViBSNCBhbmQgVENQL0lQLCAibWFrZSBzdnI0YW1pZ2FuZXQiCisjID8gZm9yIENvbW1vZG9yZSBBbWlnYSB3aXRoIE1pbml4IDEuNS4xMCwgIm1ha2UgbWluaXg2OGsiIG9mICJtYWtlIG1pbml4YzY4IgorIyA/IGZvciBDb25jdXJyZW50L01hc3Njb21wIHdpdGggUlRVIDQuMCBvciBsYXRlciwgQlNEIGVudmlyb25tZW50LCAibWFrZQorIyAgICAgcnR1YnNkIiwgIm1ha2UgcnR1YnNkMiIsICJtYWtlIHJ0dWJzZDMiIChkZXBlbmRpbmcgb24gd2hlcmUgbmRpci5oCisjICAgICBpcyBzdG9yZWQsIHNlZSBlbnRyaWVzIGJlbG93KS4KKyMgPyBmb3IgQ29uY3VycmVudC9NYXNzY29tcCB3aXRoIFJUVSA0LjAgb3IgbGF0ZXIsIFN5c3RlbSBWIFIyLCAibWFrZSBydHVzNSIKKyMgPyBmb3IgQ29uY3VycmVudCAoUGVya2luLUVsbWVyKSAzMjAwIHNlcmllcywgIm1ha2Ugc3lzNSIuCisjID8gZm9yIENvbmN1cnJlbnQgKFBlcmtpbi1FbG1lcikgMzIwMCBzZXJpZXMgd2l0aCA8ZGlyZW50Lmg+LCAibWFrZSBjY29wMSIKKyMgKyBmb3IgQ29uY3VycmVudCBQb3dlck1BWCBPUyBTVlI0LCAibWFrZSBwb3dlcm1heCIKKyMgPyBmb3IgQ29uc2Vuc3lzIFVOSVggU1YvMzg2IFI0VjMsICJtYWtlIHN5czVyNHN4dGNwYyIgb3IgIm1ha2Ugc3lzNXI0c3giCisjID8gZm9yIENvbnZlcmdlbnQgd2l0aCBDVElYIFN5cyBWIFIyLCAibWFrZSBzeXM1IgorIyA/IGZvciBDb252ZXJnZW50IHdpdGggQ1RJWCA2LjQuMSwgIm1ha2UgY3RpeCIKKyMgPyBmb3IgQ29udmV4IEMxLCAibWFrZSBjb252ZXgiCisjID8gZm9yIENvbnZleCBDMjEwIHdpdGggQ29udmV4L09TIDgsICJtYWtlIGNvbnZleDgiCisjID8gZm9yIENvbnZleCBDMiB3aXRoIENvbnZleC9PUyA5LjEsICJtYWtlIGNvbnZleDkiCisjID8gZm9yIENvbnZleCBDMiB3aXRoIENvbnZleC9PUyAxMC4xIGFuZCBnY2MgMi54LCAibWFrZSBjb252ZXgxMGdjYyIKKyMgPyBmb3IgQ3JheSBSZXNlYXJjaCBYL01QIG9yIFlNUCBvciBDOTAgd2l0aCBVTklDT1MgNi54IChTeXN0ZW0gViBSMyksCisjCSJtYWtlIGNyYXkiCisjID8gZm9yIENyYXkgUmVzZWFyY2ggWC9NUCBvciBZTVAgb3IgQzkwIHdpdGggVU5JQ09TIDcueCAoU3lzdGVtIFYgUjQpLAorIwkibWFrZSBjcmF5IgorIyA/IGZvciBDcmF5IFJlc2VhcmNoIFgvTVAgb3IgWU1QIG9yIEM5MCB3aXRoIFVOSUNPUyA4LjAgQWxwaGEsICJtYWtlIGNyYXk4IgorIyA/IGZvciBDcmF5IFJlc2VhcmNoIFgvTVAgb3IgWS1NUCBvciBDOTAgd2l0aCBVTklDT1MgOS4wLCAibWFrZSBjcmF5OSIKKyMgPyBmb3IgQ3JheSBDb21wdXRlciBDcmF5LTIgb3IgQ3JheTMgd2l0aCBDU09TLCAibWFrZSBjcmF5Y3NvcyIKKyMgPyBmb3IgQ3liZXIgOTEwIChTaWxpY29uLUdyYXBoaWNzIElyaXMpIHdpdGggSXJpeCAzLjMsICJpcml4MzMiCisjID8gZm9yIERhdGEgR2VuZXJhbCBBVmlpT04gd2l0aCBERy9VWCA1LjQgYmVmb3JlIFIzLjAwLCAibWFrZSBkZ3V4NTQwIgorIyAgICAgb3IgIm1ha2UgZGd1eDU0MGMiIChjb21waWxlIGNrd2FydCBzZXBhcmF0ZWx5IGlmIG5lY2Vzc2FyeSkKKyMgKyBmb3IgREcvVVggNS40IG9uIEFWaWlPTiBJbnRlbCBtb2RlbHMsICJtYWtlIGRndXg1NDBpIiBvciBkZ3V4NTQwaWMuCisjID8gZm9yIERHL1VYIDUuNFI0LjExIG9uIEFWaWlPTiwgYWxsIG1vZGVscywgIm1ha2UgZGd1eDU0NDExIgorIyArIGZvciBERy9VWCA1LjRSNC4yMCBvbiBBVmlpT04sIGFsbCBtb2RlbHMsICJtYWtlIGRndXg1NDQyMCIKKyMgKyBmb3IgRGF0YSBHZW5lcmFsIEFWaWlPTiB3aXRoIERHL1VYIDQuM3ggdXNpbmcgU3lzIFYtaXNtcywgIm1ha2UgZGd1eDQzMCIKKyMgPyBmb3IgRGF0YSBHZW5lcmFsIEFWaWlPTiB3aXRoIERHL1VYIDQuM3ggdXNpbmcgQlNELWlzbXMsICJtYWtlIGRndXg0MzBic2QiCisjID8gZm9yIERhdGEgR2VuZXJhbCBBVmlpT04sIGVhcmxpZXIgVU5JWCB2ZXJzaW9ucywKKyMgICAgICJtYWtlIHN5czVyMyIgKG1heWJlIGNvbXBpbGUgY2t3YXJ0IHNlcGFyYXRlbHksIG9yICJ0b3VjaCBja2Nwcm8uYyIpCisjID8gZm9yIERhdGEgR2VuZXJhbCBNViBzeXN0ZW1zIHdpdGggREcvVVgsID8/PworIyA/IGZvciBEYXRhIEdlbmVyYWwgTVYgc3lzdGVtcyB3aXRoIE1WL1VYLCB1c2UgQU9TL1ZTIEMtS2VybWl0IChDS0RLRVIuTUFLKQorIyA/IGZvciBEYXRhIEdlbmVyYWwgTVYgc3lzdGVtcyB3aXRoIEFPUy9WUywgdXNlIENLREtFUi5NQUsgKGxhc3QgPSBDLUsgNy4wKQorIyAgIGZvciBERUMgUERQLTExIHdpdGggQmVya2VsZXkgVU5JWCAyLngsIHNlZSBCZXJrZWxleSBVTklYIDIueC4KKyMgPyBmb3IgREVDIFBEUC0xMSB3aXRoIE1pbmktVU5JWCAoQmVsbCA2dGggRWRpdGlvbiBmb3IgUERQLTExIHdpdGggbm8gTU1VKSwKKyMgICAgIHByb2JhYmx5IG5vIHdheSB0byBmaXQgQy1LZXJtaXQgd2l0aG91dCBJJkQgc3BhY2UuCisjID8gZm9yIERFQyBQRFAtMTEgd2l0aCBVbHRyaXgtMTEgMy54LCA/Pz8gKHByb2JhYmx5IG5lZWRzIG92ZXJsYXlzKQorIyA/IGZvciBERUMgVkFYIHdpdGggVWx0cml4IDEueCAibWFrZSBic2QiCisjID8gZm9yIERFQyBWQVggd2l0aCBVbHRyaXggMi54ICJtYWtlIHVsdHJpeDJ4IgorIyA/IGZvciBERUMgVkFYIG9yIERFQ3N0YXRpb24gd2l0aCBVbHRyaXggMy4wLCAzLjEsICJtYWtlIHVsdHJpeDN4IgorIyA/IGZvciBERUNzdGF0aW9uIG9yIFZBWCB3aXRoIFVsdHJpeCA0LjAgb3IgNC4xLCAibWFrZSB1bHRyaXg0MCIKKyMgPyBmb3IgREVDc3RhdGlvbiBvciBWQVggd2l0aCBVbHRyaXggNC4yLCAibWFrZSB1bHRyaXg0MiIgb3IgIm1ha2UgdWx0cml4NDJjIgorIyA/IGZvciBERUNzdGF0aW9uIG9yIFZBWCB3aXRoIFVsdHJpeCA0LngsIFBPU0lYIHdvcmxkLCAibWFrZSBwb3NpeCIKKyMgKyBmb3IgREVDc3RhdGlvbiBvciBWQVggd2l0aCBVbHRyaXggNC4zLCAibWFrZSB1bHRyaXg0MyIuCisjICsgZm9yIERFQ3N0YXRpb24gb3IgVkFYIHdpdGggVWx0cml4IDQuNCwgIm1ha2UgdWx0cml4NDQiLgorIyA/IGZvciBERUNzdGF0aW9uIDUwMDAvNTAsIC8xNTAgb3IgLzI2MCAoUjR4MDAgTUlQUyBDUFUpLCBVbHRyaXggNC4zQSBvciBsYXRlcgorIyAgICAgIm1ha2UgdWx0cml4NDMtbWlwczMiIG9yICJtYWtlIHVsdHJpeDQzYy1taXBzMyIKKyMgPyBmb3IgREVDc3RhdGlvbiAoTUlQUykgd2l0aCBCZXJrZWxleSBTcHJpdGUsICJtYWtlIGJzZDQ0Ij8KKyMgPyBmb3IgREVDc3RhdGlvbiAoTUlQUykgd2l0aCBPU0YvMSBWMS4wIHRvIDEuMywgIm1ha2UgZGVjLW9zZiIKKyMgPyBmb3IgREVDIEFscGhhIHdpdGggT1NGLzEgMS4wIHRvIDEuMywgIm1ha2UgZGVjLW9zZiIKKyMgPyBmb3IgREVDIFBDIDQ4NiB3aXRoIE9TRi8xLCAibWFrZSBkZWMtb3NmIgorIyA/IGZvciBERUMgQWxwaGEgd2l0aCBPU0YvMSAyLngsICJtYWtlIGRlYy1vc2YyMCIKKyMgKyBmb3IgREVDIEFscGhhIHdpdGggT1NGLzEgMy4wLCAibWFrZSBkZWMtb3NmMzAiCisjICsgZm9yIERFQyBBbHBoYSB3aXRoIERpZ2l0YWwgVU5JWCAzLjIsICJtYWtlIGR1MzIiCisjICsgZm9yIERFQyBBbHBoYSB3aXRoIERpZ2l0YWwgVU5JWCA0LjAtNC4wRCwgIm1ha2UgZHU0MCIgb3IgIm1ha2UgZHU0MGdjYyIKKyMgKyBmb3IgREVDIEFscGhhIHdpdGggRGlnaXRhbCBVTklYIDQuMEUgb3IgaGlnaGVyLCBzZWUgVHJ1NjQuCisjIC0gZm9yIERFQyBQcm8tMzUwIHdpdGggUHJvL1Zlbml4IFYxLngsICJtYWtlIHByb3Z4MSIgKHZlcnNpb24gNUEgaXMgdG9vIGJpZykKKyMgPyBmb3IgREVDIFByby0zODAgd2l0aCBQcm8vVmVuaXggVjIuMCAoU3lzIFYpLCAibWFrZSBzeXMzIiBvciAibWFrZSBzeXMzbmlkIgorIyA/IGZvciBERUMgUHJvLTM4MCB3aXRoIDIuOSwgMi4xMCwgb3IgMi4xMSBCU0QsICJtYWtlIGJzZDI5IiBvciAibWFrZSBic2QyMTAiCisjICAgZm9yIERFQyBQRFAtMTEgd2l0aCAyLnhCU0QgKHVzZSBzZXBhcmF0ZSBtYWtlZmlsZSBja3ViczIubWFrKQorIyA/IGZvciBEZWxsIFVOSVggSXNzdWUgMi54ICg9IFVTTCBTeXMgVi8zODYgUjQueCArIGZpeGVzKSwgIm1ha2UgZGVsbHN5czVyNCIKKyMgICAgIG9yICJtYWtlIGRlbGxzeXM1cjRjIiAobGFzdCB0ZXN0ZWQgaW4gQy1LZXJtaXQgNUEpLgorIyA/IGZvciBESUFCIERTOTAgd2l0aCBETklYIChhbnkgdmVyc2lvbikgY3JlYXRlIGFuIGVtcHR5IDxzeXMvZmlsZS5oPiBpZgorIyAgICAgdGhpcyBmaWxlIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgKG9yIGFkZCAtRE5PRklMRUggdG8gdGhlIG1ha2UgZW50cnkpLgorIyA/IGZvciBESUFCIERTOTAgd2l0aCBETklYIDUuMiAoU3lzIFYuMikgb3IgZWFybGllciwgIm1ha2UgZG5peCIsCisjICAgICAibWFrZSBkbml4bmQiLCBvciAodG8gYWRkIGN1cnNlcyBhbmQgVENQL0lQKSAibWFrZSBkbml4bmV0YyIsCisjID8gZm9yIERJQUIgRFM5MCB3aXRoIEROSVggNS4zIChTeXMgVi4zKSwgIm1ha2UgZG5peDVyMyIKKyMgPyBmb3IgRElBQiBEUzkwIHdpdGggRE5JWCA1LjMgKFN5cyBWLjMpIGFuZCBUQ1AvSVAsICJtYWtlIGRuaXg1cjNuZXQiCisjID8gZm9yIERJQUIgRFM5MCB3aXRoIEROSVggNS4zIDIuMiAoU3lzIFYuMyksIEFOU0kgQywgIm1ha2UgZG5peDVyM2Fuc2kiCisjICAgICBvciwgdG8gaW5jbHVkZSBUQ1AvSVAsICJtYWtlIGRuaXg1cjNhbnNpbmV0IiwKKyMgICAgIGJ1dCB5b3UgaGF2ZSB0byBmaXggYSBidWcgaW4gL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIGZpcnN0OgorIyAgICAgY2hhbmdlICJleHRlcm4gdm9pZCBmcmVlKGNoYXIgKnN0cik7IiB0byAiZXh0ZXJuIHZvaWQgZnJlZSh2b2lkICpzdHIpOyIKKyMgPyBmb3IgRG9scGhpbiBTZXJ2ZXIgVGVjaG5vbG9neSBUcml0b24gODgvMTcgd2l0aCBTVi84OCBSMy4yLCAibWFrZSBzdjg4cjMyIgorIyA/IGZvciBFbmNvcmUgTXVsdGltYXggMzEwLCA1MTAgd2l0aCBVbWF4IDQuMiwgIm1ha2UgdW1heDQyIgorIyA/IGZvciBFbmNvcmUgTXVsdGltYXggMzEwLCA1MTAgd2l0aCBVbWF4IDQuMywgIm1ha2UgdW1heDQzIgorIyA/IGZvciBFbmNvcmUgTXVsdGltYXggMzEwLCA1MTAgd2l0aCBVbWF4IFYgMi4yLCB1c2UgQmVya2VsZXkgY2MsICJtYWtlIGJzZCIKKyMgPyBmb3IgRW5jb3JlIDg4SyB3aXRoIFVtYXggViA1LjIsICJtYWtlIGVuY29yZTg4ayIKKyMgPyBmb3IgRVNJWCBTeXN0ZW0gViBSNC4wLjMgb3IgNC4wNCB3aXRoIFRDUC9JUCBzdXBwb3J0LCAibWFrZSBlc2l4cjQiCisjICAgICBOT1RFOiBZb3UgY2FuIGFsc28gYnVpbGQgb24gVW5peHdhcmUgMi54IHdpdGggIm1ha2UgZXNpeHI0IiwgYW5kIHJ1bgorIyAgICAgb24gRVNJWCwgYnV0IHRoZXJlIHlvdSBtdXN0IGZpcnN0OgorIyAgICAgICBsbiAvdXNyL2xpYi9saWJzb2NrZXQuc28gL3Vzci9saWIvbGlic29ja2V0LnNvLjEKKyMgICAgICAgbG4gL3Vzci9saWIvbGlibnNsLnNvIC91c3IvbGliL2xpYm5zbC5zby4xCisjICAgICAoVGhpcyB3b3JrZWQgZm9yIEMtS2VybWl0IDYuMCBidXQgZG9lcyBub3Qgd29yayBmb3IgNy4wKQorIyAgICAgKEJ1dCB5b3UgY2FuIHByb2JhYmx5IHN0aWxsIGJ1aWxkIGEgbm9uLW5ldHdvcmtpbmcgdmVyc2lvbiB0aGlzIHdheSkKKyMgPyBmb3IgRXZlcmV4IFNURVAgMzg2LzI1IFJldiBHIHdpdGggRVNJWCBTeXMgViBSMy4yRCwgIm1ha2Ugc3lzNXIzIgorIyA/IGZvciBGb3J0dW5lIDMyOjE2LCBGb3I6UHJvIDEuOCwgIm1ha2UgZnQxOCIKKyMgPyBmb3IgRm9ydHVuZSAzMjoxNiwgRm9yOlBybyAyLjEsICJtYWtlIGZ0MjEiCisjID8gZm9yIEZQUyA1MDAgd2l0aCBGUFggNC4xLCAibWFkZSBic2QiCisjICsgZm9yIEZyZWVCU0QgMS4wLCAibWFrZSBmcmVlYnNkMSIKKyMgKyBmb3IgRnJlZUJTRCAyLngsICJtYWtlIGZyZWVic2QyIiAobmN1cnNlcykgb3IgIm1ha2UgZnJlZWJzZDJjIiAoY3Vyc2VzKQorIyArIGZvciBGcmVlQlNEIDMueCwgIm1ha2UgZnJlZWJzZDMiIChuY3Vyc2VzKSBvciAibWFrZSBmcmVlYnNkM2MiIChjdXJzZXMpCisjICsgZm9yIEZyZWVCU0QgNC4wLCAibWFrZSBmcmVlYnNkNCIKKyMgKyBmb3IgRnJlZUJTRCA0LjEsICJtYWtlIGZyZWVic2Q0MSIKKyMgKyBmb3IgRnJlZUJTRCA0LjIsICJtYWtlIGZyZWVic2Q0MiIKKyMgKyBmb3IgRnJlZUJTRCA0LjMsICJtYWtlIGZyZWVic2Q0MyIKKyMgKyBmb3IgRnJlZUJTRCA0LjQsICJtYWtlIGZyZWVic2Q0NCIKKyMgKyBmb3IgRnJlZUJTRCA0LjUsICJtYWtlIGZyZWVic2Q0NSIKKyMgKyBmb3IgRnJlZUJTRCA0LjYsICJtYWtlIGZyZWVic2Q0NiIKKyMgKyBmb3IgRnJlZUJTRCA0LjcsICJtYWtlIGZyZWVic2Q0NyIKKyMgKyBmb3IgRnJlZUJTRCA0LjgsICJtYWtlIGZyZWVic2Q0OCIKKyMgKyBmb3IgRnJlZUJTRCA0LjksICJtYWtlIGZyZWVic2Q0OSIKKyMgPyBmb3IgRnJlZUJTRCA1LjAsICJtYWtlIGZyZWVic2Q1MCIKKyMgPyBmb3IgRnJlZUJTRCA1LjEsICJtYWtlIGZyZWVic2Q1MSIKKyMgPyBmb3IgSGFycmlzIEhDWC0yOTAwLCAibWFrZSBzeXM1cjMiCisjID8gZm9yIEhhcnJpcyBOaWdodCBIYXdrIDg4SyBvciA2OEsgd2l0aCBDWC9VWCBwcmUtNi4xLCAibWFrZSBzeXM1cjMiCisjID8gZm9yIEhhcnJpcyBOaWdodCBIYXdrIDg4SyBvciA2OEsgd2l0aCBDWC9VWCA2LjEgb3IgbGF0ZXIsICJtYWtlIGN4X3V4IgorIyA/IGZvciBIZXVyaWtvbiwgIm1ha2Ugc3lzMyIKKyMgPyBmb3IgSFAtMzAwMCwgTVBFL2l4LCAibWFrZSBwb3NpeCI/CisjICsgZm9yIEhQLTkwMDAgU2VyaWVzIDMwMCB3aXRoIDQuNEJTRCwgIm1ha2UgYnNkNDQiCisjICsgZm9yIEhQLTkwMDAgU2VyaWVzIDUwMCwgSFAtVVggNS4yMSBhbmQgbm8gbmV0d29ya2luZyAibWFrZSBocHV4MDUwMCIKKyMgKyBmb3IgSFAtOTAwMCBTZXJpZXMgNTAwLCBIUC1VWCA1LjIxIHdpdGggV0lOL1RDUCAxLjIgIm1ha2UgaHB1eDA1MDB3aW50Y3AiCisjICsgZm9yIEhQLTkwMDAgU2VyaWVzLCBIUC1VWCA2LjUsIHdpdGhvdXQgbG9uZyBmaWxlbmFtZXMsCisjICAgICAibWFrZSBocHV4MDY1MCIgb3IgIm1ha2UgaHB1eDA2NTBjIgorIyArIGZvciBIUC05MDAwIFNlcmllcywgSFAtVVggNy4wIG9yIGxhdGVyIG5vIGxvbmcgZmlsZW5hbWVzLCAibWFrZSBocHV4MDcwMHNmIgorIyAgICAgb3IgKHRvIGluY2x1ZGUgdGNwL2lwLCBjdXJzZXMsIGV0YykgIm1ha2UgaHB1eDA3MDBzZnRjcGMiCisjICsgZm9yIEhQLTkwMDAgU2VyaWVzIHdpdGggSFAtVVggNy4wLCBUQ1AvSVAsbG9uZyBmaWxlbmFtZXMsIm1ha2UgaHB1eDA3MDBsZm4iCisjICsgZm9yIEhQLTkwMDAgMzAwLzQwMCBTZXJpZXMgKDY4MHgwKSB3aXRoIEhQLVVYIDguMCwgVENQL0lQLCAibWFrZSBocHV4MDgwMCIKKyMgICAgICBvciAibWFrZSBocHV4MDgwMGMiCisjICsgZm9yIEhQLTkwMDAgNzAwLzgwMCBTZXJpZXMgKFBBLVJJU0MpLCBIUC1VWCA4LjAsIFRDUC9JUCwgIm1ha2UgaHB1eDA4MDBwYSIKKyMgICAgICBvciAibWFrZSBocHV4MDgwMHBhYyIKKyMgKyBmb3IgSFAtOTAwMCBTZXJpZXMgd2l0aCBIUC1VWCA4LjAsIG5vIFRDUC9JUCwgbG9uZyBmaWxlbmFtZXMsCisjICAgICAgIm1ha2UgaHB1eDA4MDBub3RjcCIKKyMgKyBmb3IgSFAtOTAwMCBTZXJpZXMsIEhQLVVYIDkuMCAtIDkuMTAsIFRDUC9JUCwgY3Vyc2VzLCByZXN0cmljdGVkIGNvbXBpbGVyCisjICAgICAobm8gb3B0aW1pemF0aW9uLCBubyBBTlNJKSwgYWxsIG1vZGVscywgIm1ha2UgaHB1eDA5MDAiLiAgUmVhZCB0aGUKKyMgICAgIGhwdXgwOTAwIGVudHJ5IGJlbG93IGZvciBtb3JlIGluZm8uCisjICsgZm9yIEhQLTkwMDAgNzAwIGFuZCA4MDAgU2VyaWVzLCBIUC1VWCA5LngsIFRDUC9JUCwgY3Vyc2VzLAorIyAgICAgSFAgb3B0aW1pemluZyBBTlNJIEMgY29tcGlsZXIsICJtYWtlIGhwdXgwOTAwbzcwMCIuCisjICsgZm9yIEhQLTkwMDAgd2l0aCBNb3Rvcm9sYSBDUFVzLCBIUC1VWCA5LngsIFRDUC9JUCwgY3Vyc2VzLAorIyAgICAgSFAgb3B0aW1pemluZyBBTlNJIEMgY29tcGlsZXIsICJtYWtlIGhwdXgwOTAwbW90Ii4KKyMgKyBmb3IgSFAtOTAwMCBvbiBvdGhlciBDUFVzLCBIUC1VWCA5LngsIFRDUC9JUCwgY3Vyc2VzLAorIyAgICAgSFAgb3B0aW1pemluZyBBTlNJIEMgY29tcGlsZXIsICJtYWtlIGhwdXgwOTAwbyIuCisjICsgZm9yIEhQLTkwMDAgc2VyaWVzLCBIUC1VWCA5LngsIFRDUC9JUCwgY3Vyc2VzLCBnY2MsIGFsbCBtb2RlbHMsCisjICAgICAibWFrZSBocHV4MDkwMGdjYyIKKyMgKyBmb3IgSFAtOTAwMCA3MDAvODAwIFNlcmllcywgSFAtVVggMTAuMDAsMTAuMDEsMTAuMTAsMTAuMjAsMTAuMzAsIFRDUC9JUCwKKyMgICAgIGN1cnNlcywgcmVzdHJpY3RlZCBjb21waWxlciAobm8gb3B0aW1pemF0aW9uLCBubyBBTlNJKSAibWFrZSBocHV4MTAwMCIuCisjICsgZm9yIEhQLTkwMDAgNzAwLzgwMCBTZXJpZXMsIEhQLVVYIDEwLjAwLDEwLjAxLDEwLjEwLDEwLjIwLDEwLjMwLCBUQ1AvSVAsCisjICAgICBjdXJzZXMsIEhQIEFOU0kvb3B0aW1pemluZyBjb21waWxlciAibWFrZSBocHV4MTAwMG8iIG9yICJtYWtlIGhwdXgxMDAwbysiCisjICsgZm9yIEhQLTkwMDAgSFAtVVggMTAuMDAgb3IgbGF0ZXIgd2l0aCBnY2MsICJtYWtlIGhwdXgxMDAwZ2NjIgorIyArIGZvciBUcnVzdGVkIEhQLVVYIDEwLnh4ICJtYWtlIGhwdXgxMDAwdCIsICJtYWtlIGhwdXgxMDAwdG8iLAorIyAgICAgb3IgbWFrZSBocHV4MTAwMHRvKyIKKyMgKyBmb3IgSFAtOTAwMCA3MDAvODAwIFNlcmllcywgSFAtVVggMTEuMDAsVENQL0lQLGN1cnNlcywgcmVzdHJpY3RlZCBjb21waWxlcgorIyAgICAgKG5vIG9wdGltaXphdGlvbiwgbm8gQU5TSSkgIm1ha2UgaHB1eDExMDAiLgorIyArIGZvciBIUC05MDAwIDcwMC84MDAgU2VyaWVzLCBIUC1VWCAxMS4wMCxUQ1AvSVAsY3Vyc2VzLCByZXN0cmljdGVkIGNvbXBpbGVyCisjICAgICBIUCBBTlNJL29wdGltaXppbmcgY29tcGlsZXIgIm1ha2UgaHB1eDExMDBvIiBvciAibWFrZSBocHV4MTEwMG8rIgorIyArIGZvciBUcnVzdGVkIEhQLVVYIDExLnh4ICJtYWtlIGhwdXgxMTAwdCIsICJtYWtlIGhwdXgxMTAwdG8iLAorIyAgICAgbWFrZSBocHV4MTEwMHRvKyIKKyMgKyBmb3IgSFAtOTAwMCBQQS1SSVNDIG1vZGVscyB3aXRoIE5lWFRTVEVQIDMuMywgIm1ha2UgbmV4dHF1YWRmYXQiLgorIyArIGZvciBIUC05MDAwIFBBLVJJU0MgbW9kZWxzIHdpdGggT1BFTlNURVAvTWFjaCA0LjEsICJtYWtlIG5leHRxdWFkZmF0Ii4KKyMgPyBmb3IgSUJNIDM3MCBTZXJpZXMgd2l0aCBJWC8zNzAsICJtYWtlIGl4MzcwIgorIyA/IGZvciBJQk0gMzcwIFNlcmllcyB3aXRoIEFJWC8zNzAgMS4yLCAibWFrZSBhaXgzNzAiCisjID8gZm9yIElCTSAzNzAgU2VyaWVzIHdpdGggQUlYLzM3MCAzLjAsICJtYWtlIGFpeDM3MCIKKyMgPyBmb3IgSUJNIDM3MCBTZXJpZXMgd2l0aCBBSVgvRVNBIDIuMSwgIm1ha2UgYWl4ZXNhIgorIyAtIGZvciBJQk0gUEMvQVQgMjg2ICYgY29tcGF0aWJsZXMgd2l0aCBNYXJrIFdpbGxpYW1zIENvaGVyZW50IE9TLAorIyAgICAgY29tbWFuZC1saW5lLW9ubHkgdmVyc2lvbiwgIm1ha2UgY29oZXJlbnQiICh2ZXJzaW9uIDVBICYgbGF0ZXIgdG9vIGJpZykKKyMgPyBmb3IgSUJNIFBDIDM4NiAmIGNvbXBhdGlibGVzIHdpdGggTWFyayBXaWxsaWFtcyBDb2hlcmVudCBPUywKKyMgICAgIG1pbmltdW0gaW50ZXJhY3RpdmUgdmVyc2lvbiwgIm1ha2UgY29oZXJlbnRtaSIKKyMgPyBmb3IgSUJNIFBDIDM4NiAmIGNvbXBhdGlibGVzIHdpdGggTWFyayBXaWxsaWFtcyBDb2hlcmVudCBPUywKKyMgICAgIGZ1bGwgaW50ZXJhY3RpdmUgdmVyc2lvbiwgcHJpb3IgdG8gdjQuMiwgIm1ha2UgY29oZXJlbnRtYXgiCisjICsgZm9yIElCTSBQQyAzODYgJiBjb21wYXRpYmxlcyB3aXRoIE1hcmsgV2lsbGlhbXMgQ29oZXJlbnQgT1MgNC4yLAorIyAgICAgIm1ha2UgY29oZXJlbnQ0MiIKKyMgPyBmb3IgSUJNIFBDIDM4NiAmIGNvbXBhdGlibGVzIHdpdGggTHlueE9TIDIuMCBvciAyLjEsICJtYWtlIGx5bngyMSIKKyMgPyBmb3IgSUJNIFBDIDM4NiAmIGNvbXBhdGlibGVzIHdpdGggTHlueE9TIDIuMiwgIm1ha2UgbHlueCIKKyMgLSBmb3IgSUJNIFBDL0FUICYgY29tcGF0aWJsZXMgd2l0aCBvcmlnaW5hbCBNSU5JWCwgIm1ha2UgbWluaXgiICh0b28gYmlnKQorIyA/IGZvciBJQk0gUEMgZmFtaWx5LCAzODYtYmFzZWQsIHdpdGggTUlOSVgvMzg2IDEuNSwgIm1ha2UgbWluaXgzODYiCisjICAgICBvciBpZiB5b3UgaGF2ZSBHTlUgQ0MsICJtYWtlIG1pbml4Mzg2Z2NjIgorIyArIGZvciBJQk0gUEMgZmFtaWx5LCAzODYtYmFzZWQsIHdpdGggTUlOSVggMi4wLCAibWFrZSBtaW5peDIwIgorIyArIGZvciBJQk0gUFMvMiB3aXRoIFBTLzIgQUlYIDEuMCwgMS4xLCBvciAxLjIsICJtYWtlIHBzMmFpeCIgb3IgcHMyYWl4bmV0Yy4KKyMgPyBmb3IgSUJNIFBTLzIgd2l0aCBQUy8yIEFJWCAxLjMsICJtYWtlIHBzMmFpeDMiCisjID8gZm9yIElCTSBSSVNDIFN5c3RlbS82MDAwIHdpdGggQUlYIDMuMCwgIm1ha2UgYWl4MzAiCisjID8gZm9yIElCTSBSSVNDIFN5c3RlbS82MDAwIHdpdGggQUlYIDMuMS54LCAibWFrZSBhaXgzMSIKKyMgKyBmb3IgSUJNIFJJU0MgU3lzdGVtLzYwMDAgd2l0aCBBSVggMy4yLjAgdGhydSAzLjIuNSwgIm1ha2UgYWl4MzIiCisjICsgZm9yIElCTSBSUy82MDAwIG9yIFBvd2VyIFNlcmllcyB3aXRoIEFJWCA0LjEueCwgIm1ha2UgYWl4NDEiCisjICsgZm9yIElCTSBSUy82MDAwIG9yIFBvd2VyIFNlcmllcyB3aXRoIEFJWCA0LjEueCB3aXRoIGdjYywgIm1ha2UgYWl4NDFnIgorIyArIGZvciBJQk0gUlMvNjAwMCBvciBQb3dlciBTZXJpZXMgd2l0aCBBSVggNC4xIHdpdGggWC4yNSwgIm1ha2UgYWl4NDF4MjUiCisjICsgZm9yIElCTSBSUy82MDAwIG9yIFBvd2VyIFNlcmllcyB3aXRoIEFJWCA0LjIsICJtYWtlIGFpeDQyIgorIyArIGZvciBJQk0gUlMvNjAwMCBvciBQb3dlciBTZXJpZXMgd2l0aCBBSVggNC4zLCAibWFrZSBhaXg0MyIgKG9yIGFpeDQzZ2NjKQorIyArIGZvciBJQk0gUlMvNjAwMCBvciBQb3dlciBTZXJpZXMgd2l0aCBBSVggNC40LCAibWFrZSBhaXg0NCIgKG9yIGFpeDQ0Z2NjKQorIyArIGZvciBJQk0gUlMvNjAwMCBvciBQb3dlciBTZXJpZXMgd2l0aCBBSVggNC41LCAibWFrZSBhaXg0NSIgKG9yIGFpeDQ1Z2NjKQorIyArIGZvciBJQk0gUlMvNjAwMCBvciBQb3dlciBTZXJpZXMgd2l0aCBBSVggNS4wLCAibWFrZSBhaXg1MCIgKG9yIGFpeDUwZ2NjKQorIyArIGZvciBJQk0gUlMvNjAwMCBvciBQb3dlciBTZXJpZXMgd2l0aCBBSVggNS4xLCAibWFrZSBhaXg1MSIgKG9yIGFpeDUxZ2NjKQorIyA/IGZvciBJQk0gUlMvNjAwMCBvciBQb3dlciBTZXJpZXMgd2l0aCBBSVggNS4yLCAibWFrZSBhaXg1MiIgKG9yIGFpeDUyZ2NjKQorIyA/IGZvciBJQk0gUlMvNjAwMCBvciBQb3dlciBTZXJpZXMgd2l0aCBBSVggNS4zLCAibWFrZSBhaXg1MyIgKG9yIGFpeDUzZ2NjKQorIyA/IGZvciBJQk0gUlQgUEMgd2l0aCBBSVggMi4xLCAibWFrZSBzeXMzIgorIyArIGZvciBJQk0gUlQgUEMgd2l0aCBBSVggMi4yLjEsICJtYWtlIHJ0YWl4IiBvciAibWFrZSBydGFpeGMiCisjID8gZm9yIElCTSBSVCBQQyB3aXRoIEFDSVMgNC4yLCAibWFrZSBic2QiCisjID8gZm9yIElCTSBSVCBQQyB3aXRoIEFDSVMgNC4zLCAibWFrZSBydGFjaXMiIG9yICJtYWtlIGJzZCBLRkxBR1M9LUROT0FOU0kiCisjID8gZm9yIElCTSBSVCBQQyB3aXRoIDQuM0JTRC9SZW5vLCAibWFrZSBic2Q0NCIgb3IgIm1ha2UgYnNkNDRjIgorIyA/IGZvciBJQ0wgRFJTNDAwIG9yIDQwMEUsICJtYWtlIGljbHN5czVyMyIKKyMgPyBmb3IgSUNMIERSUzMwMDAgKDgwNDg2KSB3aXRoIERSUy9OWCwgIm1ha2UgaWNsc3lzNXI0XzQ4NiIKKyMgPyBmb3IgSUNMIERSUzYwMDAgKFNQQVJDKSB3aXRoIERSUy9OWCwgIm1ha2UgaWNsc3lzNXI0IgorIyArIGZvciBJQ0wgRFJTNjAwMCAoU1BBUkMpIHdpdGggRFJTL05YIDQuMk1QIDdNUGx1cywgIm1ha2UgaWNsc3lzNXI0bSsiCisjID8gICAgIERpdHRvIGJ1dCB3aXRoIElLU0Qgc3VwcG9ydCBpbmNsdWRlZCwgIm1ha2UgaWNsc3lzNXI0bStpa3NkIgorIyA/IGZvciBJbnRlZ3JhdGVkIFNvbHV0aW9ucyBJbmMgVjhTIFZNRSA2ODAyMCwgIm1ha2UgaXNpIgorIyA/IGZvciBJbnRlbCAzMDIgd2l0aCBCZWxsIFRlY2ggU3lzIFYvMzg2IFIzLjIsICJtYWtlIHN5czVyMyIKKyMgPyBmb3IgSW50ZWwgWGVuaXgvMjg2LCAibWFrZSBzY28yODYiCisjID8gZm9yIEludGVyYWN0aXZlIFN5c3RlbSBJSUkgKFBDL0lYKSwgIm1ha2UgcGNpeCIgb3IgIm1ha2UgaXMzIgorIyA/IGZvciBJbnRlcmFjdGl2ZSBTeXN0ZW0gSUlJIChQQy9JWCkgd2l0aCBnY2MsICJtYWtlIGlzM2djYyIKKyMgPyBmb3IgSW50ZXJhY3RpdmUgMzg2L2l4IDEuMC42IHdpdGggVENQL0lQIG5ldHdvcmtpbmcsICJtYWtlIGlzNXIzbmV0MiIKKyMgPyBmb3IgSW50ZXJhY3RpdmUgMzg2L2l4IDIuMC54LCAibWFrZSBpczVyMyIgb3IgKFBPU0lYKSAibWFrZSBpczVyM3AiCisjID8gZm9yIEludGVyYWN0aXZlIDM4Ni9peCAyLjAueCB3aXRoIFRDUC9JUCBuZXR3b3JraW5nLCAibWFrZSBpczVyM25ldCIKKyMgICAgIG9yICJtYWtlIGlzNXIzbmV0MiIKKyMgPyBmb3IgSW50ZXJhY3RpdmUgMzg2L2l4IDIuMi4xLCBqb2IgY29udHJvbCwgY3Vyc2VzLCBubyBuZXQsIGdjYywKKyMgICAgICJtYWtlIGlzNXIzZ2NjIgorIyArIGZvciBJbnRlcmFjdGl2ZSBVTklYIFN5cyBWIFIzLjIgVjIuMiAtIDQuMCB3aXRob3V0IFRDUC9JUCwgIm1ha2UgaXM1cjNqYyIKKyMgKyBmb3IgSW50ZXJhY3RpdmUgVU5JWCBTeXMgViBSMy4yIFYyLjIgLSA0LjAgd2l0aCBUQ1AvSVAsICJtYWtlIGlzNXIzbmV0amMiCisjICsgZm9yIEludGVyZ3JhcGggQ2xpcHBlciwgIm1ha2UgY2xpeCIgb3IgIm1ha2UgY2xpeG5ldCIKKyMgPyBmb3IgSm9saXggKHNlZSAzODZCU0QpCisjICsgZm9yIFJlZCBIYXQgTGludXggNy4xIChhbmQgaGlnaGVyKSBmdWxseSBjb25maWd1cmVkIChrcmI1LCBTU0wsIGV0Yyk6CisjICAgICAibWFrZSByZWRoYXQ3MSIsICJtYWtlIHJlZGhhdDcyIiwgIm1ha2UgcmVkaGF0NzMiLCAibWFrZSByZWRoYXQ4MCIKKyMgICAgICJtYWtlIHJlZGhhdDkiCisjICAgICBOT1RFOiBZb3UgbXVzdCB1c2UgdGhpcyB0YXJnZXQgZm9yIFJlZCBIYXQgNy4xIHNpbmNlIGl0CisjICAgICBhbHNvIGluY2x1ZGVzIGEgd29ya2Fyb3VuZCBmb3IgaXRzIGJyb2tlbiBjdXJzZXMgbGlicmFyeS4KKyMgICAgIFdBUk5JTkc6IFRoZXNlIHRhcmdldHMgY3JlYXRlIGJpbmFyaWVzIHRoYXQgaW5jbHVkZSBjb2RlIGZvcgorIyAgICAgc3Ryb25nIGVuY3J5cHRpb24gYW5kIGFyZSB0aGVyZWZvcmUgbm90IGV4cG9ydGFibGUuIERPIE5PVCBQVVQKKyMgICAgIFRIRVNFIEJJTkFSSUVTIE9OIFVTIE9SIENBTkFESUFOIFdFQiBPUiBGVFAgU0lURVMuCisjICsgZm9yIExpbnV4IDEuMiBhbmQgbGF0ZXIsICJtYWtlIGxpbnV4Ii4gIFVzZXMgbmN1cnNlcy4gIFRoaXMgdmVyc2lvbgorIyAgICAgaGFuZGxlcyBzZXJpYWwgc3BlZWRzIHVwIHRvIDQ2MDgwMCBicHMsIExpbnV4IEZTU1REIDEuMiwgVENQL0lQLCBhbmQKKyMgICAgIHNob3VsZCB3b3JrIG9uIGJvdGggbGliYyBhbmQgZ2xpYmMgc3lzdGVtcy4gIEZvciBzdGF0aWMgbGlua2luZywgdXNlCisjICAgICAibWFrZSBsaW51eCBMTktGTEFHUz0tc3RhdGljIi4gIFBsZWFzZSByZWFkIHRoZSBjb21tZW50cyB0aGF0IGFjY29tcGFueQorIyAgICAgdGhlIGxpbnV4IGVudHJ5LgorIyArIGZvciBMaW51eCBidWlsZHMgdGhhdCBmYWlsIHdpdGggInN5cy9zZWxlY3QuaDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIsCisjICAgICAibWFrZSBsaW51eG5zIgorIyArIGZvciBMaW51eCAxLjIgYW5kIGxhdGVyIGJ1dCB3aXRoIGN1cnNlcy5oIGFuZCBsaWJjdXJzZXMgKHJhdGhlciB0aGFuCisjICAgICBuY3Vyc2VzLmggYW5kIGxpYm5jdXJzZXMpLCB1c2UgIm1ha2UgbGludXhjIi4KKyMgKyBmb3IgTGludXggMS4yIGFuZCBsYXRlciB3aXRoIG5vIGN1cnNlcyBzdXBwb3J0IGF0IGFsbCwgIm1ha2UgbGludXhuYyIuCisjICsgZm9yIExpbnV4IG9uIFBvd2VyTWFjIChNa2xpbnV4IERSMyksICJtYWtlIG1rbGludXgiLgorIyArIGZvciBMaW51eCAxLjIgYW5kIGxhdGVyLCB0byBidWlsZCB3aXRoIGVnY3MsICJtYWtlIGxpbnV4ZWdjcyIuCisjICsgZm9yIExpbnV4IHdpdGggbm8gVENQL0lQLCAibWFrZSBsaW51eG5vdGNwIgorIyArIGZvciBMaW51eCB3aXRoIGxjYyBjb21waWxlciwgbm8gVENQL0lQLCAibWFrZSBsaW51eG5vdGNwLWxjYyIKKyMgPyBmb3IgTGludXggMS4wIG9yIGVhcmxpZXIsICJtYWtlIGxpbnV4MTAiLCBvciAodG8gcmVtb3ZlIFRDUC9JUCkKKyMgICAgICJtYWtlIGxpbnV4bm90Y3AiLgorIyAgICAgSU1QT1JUQU5UOiBSZWFkIHRoZSBjb21tZW50cyB0aGF0IGFjY29tcGFueSB0aGUgImxpbnV4OiIgZW50cnkuCisjID8gZm9yIE1hY2ggMi42IG9uIChhbnl0aGluZywgZS5nLiBERUNzdGF0aW9uKSwgIm1ha2UgYnNkNDIiIG9yICJtYWtlIGJzZDQzIi4KKyMgPyBmb3IgTWFjaFRlbiAoVGVub24pIDIuMS4xLkQgb24gKGUuZy4pIEFwcGxlIFBvd2VyYm9vaywgIm1ha2UgbWFjaHRlbiIuCisjID8gZm9yIE1hc3Njb21wIFJUVSBBVCZUIFN5c3RlbSBJSUksICJtYWtlIHJ0dSIKKyMgICBmb3Igb3RoZXIgTWFzc2NvbXAsIHNlZSBDb25jdXJyZW50LgorIyA/IGZvciBNaWNyb3BvcnQgU1YvQVQgKFN5c3RlbSBWIFIyKSwgIm1ha2UgbXBzeXN2IiAobGFzdCBlZGl0IHRlc3RlZDogMTQ0KQorIyA/IGZvciBNaWNyb3BvcnQgU1ZSNCAyLjIsIDMuMSwgb3IgNC4xICJtYWtlIHN5czVyNHN4IgorIyA/IGZvciBNaWNyb3NvZnQsSUJNIFhlbml4ICgvMjg2LCBQQy9BVCwgZXRjKSwgIm1ha2UgeGVuaXgiIG9yICJtYWtlIHNjbzI4NiIKKyMgPyBmb3IgTUlQUyBTeXN0ZW0gd2l0aCBSSVNDL29zIChVTUlQUykgNC41MiA9IEFUJlQgU1ZSMywgIm1ha2UgbWlwcyIKKyMgICAgIG9yICJtYWtlIG1pcHN0Y3BjIgorIyArIGZvciBNa0xpbnV4IG9uIFBvd2VyIE1hY2ludG9zaCwgIm1ha2UgbWtsaW51eCIKKyMgPyBmb3IgTW9kY29tcCA5NzMwLCBSZWFsL0lYLCAibWFrZSBzeXM1cjMiIChvciBtb2RpZnkgdG8gdXNlIGdjYyA9IEdMUyBjYykKKyMgPyBmb3IgTW9kY29tcCBSZWFsc3RhciAxMDAwIHdpdGggUkVBTC9JWCBELjEsICJtYWtlIHN2ODhyMzIiCisjID8gZm9yIE1vdG9yb2xhIEZvdXIgUGhhc2UsICJtYWtlIHN5czMiIG9yICJtYWtlIHN5czNuaWQiCisjICsgZm9yIE1vdG9yb2xhIERlbHRhIFN5c3RlbSBWLzY4IFIzLCAibWFrZSBzdjY4cjMiCisjICsgZm9yIE1vdG9yb2xhIERlbHRhIFN5c3RlbSBWLzY4IFIzVjUsICJtYWtlIHN2NjhyM3Y1IgorIyArIGZvciBNb3Rvcm9sYSBEZWx0YSBTeXN0ZW0gVi82OCBSM1Y1LjEsICJtYWtlIHN2NjhyM3Y1MSIKKyMgKyBmb3IgTW90b3JvbGEgRGVsdGEgU3lzdGVtIFYvNjggUjNWNiB3aXRoIE5TRSBUQ1AvSVAsICJtYWtlIHN2NjhyM3Y2IgorIyArIGZvciBNb3Rvcm9sYSBEZWx0YSBTeXN0ZW0gVi84OCBSMzIsICJtYWtlIHN2ODhyMzIiCisjICsgZm9yIE1vdG9yb2xhIERlbHRhIFN5c3RlbSBWLzg4IFI0MCwgIm1ha2Ugc3Y4OHI0MCIKKyMgPyBmb3IgTXQgWGludSBNYWNoMzg2IG9uIDM4Ni80ODYtYmFzZWQgUENzLCAibWFrZSBic2Q0MyIKKyMgPyBmb3IgTkNSIFRvd2VyIDE2MzIsIE9TIDEuMDIsICJtYWtlIHRvd2VyMSIKKyMgPyBmb3IgTkNSIFRvd2VyIDE2MzIgb3IgTWluaXRvd2VyIHdpdGggU3lzdGVtIFYgUjIsICJtYWtlIHN5czMiCisjICAgICBvciAibWFrZSBzeXMzbnYiCisjID8gZm9yIE5DUiBUb3dlciAzMiwgT1MgUmVsZWFzZSAxLnh4Lnh4LCAibWFrZSB0b3dlcjMyLTEiCisjID8gZm9yIE5DUiBUb3dlciAzMiwgT1MgUmVsZWFzZSAyLnh4Lnh4LCAibWFrZSB0b3dlcjMyLTIiCisjID8gZm9yIE5DUiBUb3dlciAzMiwgT1MgUmVsZWFzZXMgYmFzZWQgb24gU3lzIFYgUjMsICJtYWtlIHRvd2VyMzIiCisjID8gZm9yIE5DUiBUb3dlciAzMiwgT1MgUmVsZWFzZXMgYmFzZWQgb24gU3lzIFYgUjMgd2l0aCBnY2MgIm1ha2UgdG93ZXIzMmciCisjID8gZm9yIE5DUiBTeXN0ZW0gMzAwMCwgQVQmVCBVTklYIFN5c3RlbSBWIFI0IDIuMCwgIm1ha2Ugc3lzNXI0c3huYSIKKyMgPyBmb3IgTkNSIFN5c3RlbSAzMDAwLCBBVCZUIFVOSVggU3lzdGVtIFYgUjQgMi4wIHdpdGggV29sbG9uZ29uZyBUQ1AvSVAsCisjICAgICAibWFrZSBzeXM1cjRuZXQyIiBvciAibWFrZSBzeXM1cjRuZXQyYyIuCisjICAgICAgU29tZSBoZWFkZXIgZmlsZXMgbWlnaHQgYmUgbWlzcGxhY2VkOyB0cnkgdGhpczoKKyMgICAgICAgbG4gL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaCAvdXNyL2luY2x1ZGUvc3lzL2luLmgKKyMgICAgICAgbG4gL3Vzci9pbmNsdWRlL2FycGEvaW5ldC5oIC91c3IvaW5jbHVkZS9zeXMvaW5ldC5oCisjICAgICAgIGxuIC91c3IvaW5jbHVkZS9zeXMvdGVybWlveC5oIC91c3IvaW5jbHVkZS90ZXJtaW94LmgKKyMgPyBmb3IgTkNSIFN5c3RlbSAzMDAwLCBOQ1IgVU5JWCAwMi4wMi4wMSwgc2FtZSBhcyBhYm92ZS4KKyMgKyBmb3IgTkNSIE1QLVJBUyBTeXN0ZW0gViBSNCBWMi4wMyBvciAzLjAyLCAibWFrZSBtcHJhcyIgb3IgIm1ha2UgbXByYXN0Y3BjIgorIyArIGZvciBOZXRCU0QgdGhyb3VnaCAxLjQueCBvbiBhbnkgYXJjaGl0ZWN0dXJlLCAibWFrZSBuZXRic2QiCisjICsgZm9yIE5ldEJTRCAxLjUuMCBhbmQgbGF0ZXIsICJtYWtlIG5ldGJzZDE1IgorIyArIGZvciBOZVhUIHdpdGggTmVYVFNURVAgMS4wIHRocm91Z2ggMy4yLCAibWFrZSBuZXh0IiAob24gYSBOZVhUKQorIyArIGZvciBOZVhUIHdpdGggTmVYVFNURVAgMy4zLCAibWFrZSBuZXh0MzMiCisjID8gZm9yIE5lWFQgd2l0aCBPUEVOU1RFUC9NYWNoIDQuMSwgIm1ha2UgbmV4dHF1YWRmYXQiLgorIyArIGZvciBOZVhUIHdpdGggT1BFTlNURVAvTWFjaCA0LjIsICJtYWtlIG9wZW5zdGVwNDIiLgorIyA/IGZvciBOZVhUU1RFUC80ODYsICJtYWtlIG5leHQiIChvbiBhIFBDKQorIyA/IGZvciBOZVhUU1RFUCBwb3J0YWJsZSBiaW5hcnkgKHJ1bnMgb24gSW50ZWwgb3IgTW90b3JvbGEpLCAibWFrZSBuZXh0ZmF0IgorIyA/IGZvciBOZVhUU1RFUCBwb3J0YWJsZSBiaW5hcnkgKEludGVsLCBNb3Rvcm9sYSwgSFAgUEEtUklTQywgb3IgU1BBUkMpLAorIyAgICAgIm1ha2UgbmV4dHF1YWRmYXQiCisjID8gZm9yIE5peGRvcmYgVGFyZ29uLzMxLCAibWFrZSB0MzF0b3M0MHgiCisjID8gZm9yIE5vcnNrIERhdGEgVW5pbGluZSA4OC8xNyB3aXRoIFNWLzg4IFIzLjIsICJtYWtlIHN2ODhyMzIiCisjICAgZm9yIE5vdmVsbCBVbml4V2FyZSAtIHNlZSBVbml4V2FyZQorIyA/IGZvciBPU0YvMSAodmFuaWxsYSwgZnJvbSBPUy9GKSwgIm1ha2UgcG9zaXgiCisjID8gZm9yIE9raVN0YXRpb24gNzMwMCBTZXJpZXMsICJtYWtlIHN5czVyNHN4dGNwIgorIyA/IGZvciBPbGl2ZXR0aSBMU1gtMzAyMCB3aXRoIFgvT1MgUi4yLjMsICJtYWtlIHhvczIzIiBvciAibWFrZSB4b3MyM2MiCisjICsgZm9yIE9wZW5CU0QsICJtYWtlIG9wZW5ic2QiIChhbHNvIHNlZSBzZWN1cmUgdGFyZ2V0cyBsaXN0ZWQgYmVsb3cpLgorIyA/IGZvciBPUEVOU1RFUC9NYWNoIDQuMSwgIm1ha2UgbmV4dHF1YWRmYXQiIChOZVhULCBJbnRlbCwgUEEtUklTQywgU1BBUkMpCisjICsgZm9yIE9QRU5TVEVQL01hY2ggNC4yLCAibWFrZSBvcGVuc3RlcDQyIiAodGVzdGVkIG9uIE5lWFQpCisjID8gZm9yIFBlcmtpbi1FbG1lciAoQ29uY3VycmVudCkgMzIwMCBzZXJpZXMsICJtYWtlIHN5czUiLgorIyA/IGZvciBQZXJraW4tRWxtZXIgKENvbmN1cnJlbnQpIDMyMDAgc2VyaWVzIHdpdGggPGRpcmVudC5oPiwgIm1ha2UgY2NvcDEiCisjID8gZm9yIFBlcmtpbi1FbG1lci9Db25jdXJyZW50IDMyMDAgd2l0aCBYZWxvcyBSMDIsICJtYWtlIGNjb3AxIgorIyA/IGZvciBQRlUgQ29tcGFjdCBBIFNlcmllcyBTWC9BIFRJU1AgVjEwL0U1MCAoSmFwYW4pLCAibWFrZSBzeGFlNTAiCisjID8gZm9yIFBsZXh1cywgIm1ha2Ugc3lzMyIKKyMgKyBmb3IgUHlyYW1pZCA5WFhYIChlLmcuIDk4NDUpIG9yIE1JU2VydmVyIFQgc2VyaWVzLCBPU3ggNC40YiB0aHJ1IDUuMSwKKyMgICAgICJ1Y2IgbWFrZSBweXJhbWlkIiBvciBmb3IgSERCIFVVQ1AsICJ1Y2IgbWFrZSBweXJhbWlkLWhkYiIgb3I6CisjICsgZm9yIFB5cmFtaWQgTUlTZXJ2ZXIgUyBvciBFUyBTZXJpZXMsIERhdGFDZW50ZXIvT1N4LCAibWFrZSBweXJkY29zeCIKKyMgKyBmb3IgUHlyYW1pZCBNSVMtUyBNSVBTIFIzMDAwLCBEYXRhQ2VudGVyIE9TeCBTeXN0ZW0gViBSNCwgIm1ha2UgcHlyZGNvc3giCisjICsgZm9yIFBPU0lYIG9uIGFueXRoaW5nLCAibWFrZSBwb3NpeCIgKGJ1dCBhZGp1c3RtZW50cyBtaWdodCBiZSBuZWNlc3NhcnkpLgorIyA/IGZvciBQcmltZSA4MDAwIE1JUFMsIFNWUjMsICJtYWtlIG1pcHMiIG9yICJtYWtlIG1pcHN0Y3BjIgorIyAtIGZvciBRTlggMi54IChzb3JyeSB3ZSBkb24ndCBoYXZlIGEgdmVyc2lvbiBvZiBDLUtlcm1pdCBmb3IgUU5YIDIueCkKKyMgPyBmb3IgUU5YIDQuMCBvciA0LjEsIDE2LWJpdCwgb24gMjg2IFBDLCBXYXRjb20gQyA4LjUsICJtYWtlIHFueDE2XzQxIgorIyArIGZvciBRTlggNC4yMSAtIDQuMjJBICgyODYrKSwgYW5kIDQuMjMgKDM4NispLCBvciBoaWdoZXIsIDE2LWJpdCwKKyMgICAgIFdhdGNvbSBDIDkuNXggb3IgaGlnaGVyLCAibWFrZSBxbngxNiIKKyMgKyBmb3IgUU5YIDQuMjEtNC4yNSwgMzItYml0LCAzODYgb3IgYWJvdmUsIFdhdGNvbSBDIDEwLjYsICJtYWtlIHFueDMyIgorIyAgICAgTk9URTogKCJtYWtlIHFueCIgPT0gIm1ha2UgcW54MzIiKQorIyA/IGZvciBRTlggTmV1dHJpbm8gMissICJtYWtlIHFueF9udG8yKyIgKGNyb3NzY29tcGlsZWQgb24gUU5YNCB3aXRoIFdhdGNvbSBDKQorIyArIGZvciBRTlggNiA9IE5ldXRyaW5vIDIueHgsICJtYWtlIHFueDYiCisjID8gZm9yIFJpZGdlIDMyIChST1MzLjIpLCAibWFrZSByaWRnZTMyIgorIyA/IGZvciBTYW1zdW5nIE1hZ2ljU3RhdGlvbiwgIm1ha2Ugc3lzNXI0IgorIyA/IGZvciBTQ08gWGVuaXggMi4yLjEgd2l0aCBkZXZlbG9wbWVudCBzeXN0ZW0gMi4yIG9uIDgwODYvOCAibWFrZSBzY284NiIKKyMgPyBmb3IgU0NPIFhlbml4LzI4NiAyLjIuMSB3aXRoIGRldmVsb3BtZW50IHN5c3RlbSAyLjIgb24gODAyODYsICJtYWtlIHNjbzI4NiIKKyMgICAgIE5PVEU6IHJlcG9ydGVkbHkgdGhpcyBtYWtlZmlsZSBpcyB0b28gbG9uZyBmb3IgU0NPIFhlbml4LzI4NiBtYWtlLCBidXQgaXQKKyMgICAgIHdvcmtzIHdpdGggIm1ha2VMIiwgb3IgaWYgc29tZSBvZiB0aGUgb3RoZXIgbWFrZSBlbnRyaWVzIGFyZSBlZGl0ZWQgb3V0LgorIyA/IGZvciBTQ08gWGVuaXgvMzg2IDIuMi4yLCAibWFrZSBzY28zODYiCisjID8gZm9yIFNDTyBYZW5peC8zODYgMi4zLngsICJtYWtlIHNjbzNyMiIKKyMgPyBmb3IgU0NPIFhlbml4LzM4NiBTQ08gMi4zLjMgb3IgMi4zLjQgd2l0aCBnY2MgMS4zNyBvciBsYXRlciwKKyMgICAgICJtYWtlIHNjbzM4NmdjYyIgb3IgKHRvIGFkZCBjdXJzZXMpICJtYWtlIHNjbzM4NmdjY2MiLgorIyA/IGZvciBTQ08gWGVuaXgvMzg2IG9yIFVOSVgvMzg2IHdpdGggRXhjZWxhbiBUQ1AvSVAsICJtYWtlIHNjbzNyMm5ldCIKKyMgICAgIG9yICh0byBhZGQgY3Vyc2VzIHN1cHBvcnQpICJtYWtlIHNjbzNyMm5ldGMiIG9yICJzY28zODZuZXRjIgorIyArIGZvciBTQ08gWEVOSVggMi4zLjQsICJtYWtlIHNjbzIzNCIgb3IgIm1ha2Ugc2NvMjM0YyIgdG8gYWRkIGN1cnNlcy4KKyMgKyBmb3IgU0NPIFhFTklYIDIuMy40IHdpdGggU0NPIFRDUC9JUCAmIGN1cnNlcywgIm1ha2Ugc2NvMjM0bmV0YyIuCisjID8gZm9yIFNDTyBYZW5peCAyLjMueCB3aXRoIFJhY2FsLUludGVyTGFuIFRDUC9JUCwgIm1ha2Ugc2NvM3IybmV0cmkiCisjICAgZm9yIG90aGVyIFVOSVggdmFyaWV0aWVzIHdpdGggUmFjYWwgSW50ZXJsYW4gVENQL0lQLCByZWFkIHNjbzNyMm5ldHJpIGVudHJ5CisjID8gZm9yIFNDTyBYZW5peCAyLjMueCB3aXRoIFNDTyAoTGFjaG1hbikgVENQL0lQLCAibWFrZSBzY28zcjJsYWkiCisjICAgICBvciAodG8gYWRkIGN1cnNlcykgIm1ha2Ugc2NvM3IybGFpYyIKKyMgICBmb3IgU0NPIFVOSVguLi4gIEFMU08gUkVBRCBDT01NRU5UUyBpbiB0aGUgU0NPIFVOSVggZW50cmllcyBmb3IgbW9yZSBpbmZvIQorIyA/IGZvciBTQ08gVU5JWC8zODYgMy4yLjAgb3IgMy4yLjEsICJtYWtlIHNjbzNyMiIgb3IgIm1ha2Ugc2NvM3IyeCIKKyMgPyBmb3IgU0NPIFVOSVgvMzg2IDMuMi4yLCAibWFrZSBzY28zcjIyIiBvciAibWFrZSBzY28zcjIyZ2NjIgorIyAgICAgb3IgIm1ha2Ugc2NvM3IyMmMiCisjID8gZm9yIFNDTyBVTklYLzM4NiAzLjIuMiB3aXRoIFNDTyBUQ1AvSVAsICJtYWtlIHNjbzNyMjJuZXQiCisjICAgICBvciAibWFrZSBzY28zcjIybmV0YyIgKGN1cnNlcykKKyMgPyBmb3IgU0NPIE9EVCAxLjEsICJtYWtlIHNjbzNyMjJuZXQiIG9yICJtYWtlIHNjbzNyMjJuZXRjIiAoY3Vyc2VzKQorIyArIGZvciBTQ08gVU5JWC8zODYgMy4yIFY0LngsIG5vIG5ldHdvcmsgc3VwcG9ydCwgIm1ha2Ugc2NvMzJ2NCIKKyMgKyAgIG9yICJtYWtlIHNjbzMydjRucyIgKHRoaXMgb25lIHVzZXMgbm8gc2VsZWN0KCkgb3Igc29ja2V0cyBsaWJyYXJ5KQorIyArIGZvciBTQ08gVU5JWC8zODYgMy4yIFY0Lnggd2l0aCBUQ1AvSVAsICJtYWtlIHNjbzMydjRuZXQiCisjICAgICAoYWxzbyBzY28zMnY0Z2NjLCBzY28zMnY0bmV0Z2NjKQorIyArIGZvciBTQ08gVU5JWC8zODYgMy4yIFY1LjAgLSBzZWUgU0NPIE9wZW5TZXJ2ZXIuCisjICsgZm9yIFNDTyBVTklYIDMuMnY0Lnggd2l0aCBUQ1AvSVAsIDxkaXJlbnQuaD4gZm9yIEV4dGVuZGVkIEFjZXIgRmlsZQorIyAgICAgU3lzdGVtIChFQUZTKSwgY3Vyc2VzLCBBTlNJIEMgY29tcGlsYXRpb24sICJtYWtlIHNjbzMydjRuZXQiCisjICsgICBvciAodG8gdXNlIHNlbGVjdCgpLWJhc2VkIENPTk5FQ1QgbW9kdWxlKSAibWFrZSBzY28zMnY0bmV0eCIuCisjICsgZm9yIFNDTyBVTklYIDMuMnY0LjIsICJtYWtlIHNjby1vZHQzMCIgKGluY2x1ZGVzIFRDUC9JUCkuCisjICsgZm9yIFNDTyBNUFggMy4wIC0gVGhlIFNDTyBVTklYIGJpbmFyeSBydW5zIG9uIHRoZSBjb3JyZXNwb25kaW5nIE1QWCBzeXN0ZW0uCisjCisjIE5PVEU6IEFsc28gc2VlIGJlbG93IGZvciBvdGhlciBlbnRyaWVzIHRoYXQgYXJlIHZhcmlhdGlvbnMgb24gdGhlc2UuCisjIEFsc28gYmUgc3VyZSB0byByZWFkIHRoZSBjb21tZW50cyBhY2NvbXBhbnlpbmcgZWFjaCBTQ08gZW50cnkuCisjIEFsc28gc2VlIFVuaXh3YXJlIHNlY3Rpb24uCisjCisjICsgZm9yIFNDTyBPRFQgMi4wLCAibWFrZSBzY28zMnY0bmV0IgorIyArIGZvciBTQ08gT0RUIDMuMCwgIm1ha2Ugc2NvLW9kdDMwIgorIyArIGZvciBTQ08gT3BlblNlcnZlciA1LjAgKE9TUjUpLCAibWFrZSBzY28zMnY1MDAiCisjICsgZm9yIFNDTyBPcGVuU2VydmVyIDUuMCAoT1NSNSkgd2l0aCBuZXR3b3JraW5nLCAibWFrZSBzY28zMnY1MDBuZXQiCisjICsgZm9yIFNDTyBPcGVuU2VydmVyIDUuMCAoT1NSNSksIGdjYywgIm1ha2Ugc2NvMzJ2NTAwZ2NjIgorIyArIGZvciBTQ08gT3BlblNlcnZlciA1LjAgKE9TUjUpLCBnY2MsIHdpdGggbmV0d29ya2luZywgIm1ha2Ugc2NvMzJ2NTAwbmV0Z2NjIgorIyArIGZvciBTQ08gT3BlblNlcnZlciA1LjAgKE9TUjUpLCBhcyBhYm92ZSwgRUxGLCAibWFrZSBzY28zMnY1MDBuZXRnY2NlbGYiCisjICsgZm9yIFNDTyBPcGVuU2VydmVyIDUuMC4yLCB1c2UgIm1ha2Ugc2NvMzJ2NTAyeHh4IiBlbnRyaWVzIGFzIGFib3ZlLgorIyArIGZvciBTQ08gT3BlblNlcnZlciA1LjAuNCwgdXNlICJtYWtlIHNjbzMydjUwNHh4eCIgZW50cmllcyBhcyBhYm92ZS4KKyMgKyBmb3IgU0NPIE9wZW5TZXJ2ZXIgNS4wLjUsIHVzZSAibWFrZSBzY28zMnY1MDV4eHgiIGVudHJpZXMgYXMgYWJvdmUuCisjICAgICBVc2UgdGhlIHNjbzMydjUwNXVka3h4eCBlbnRyaWVzIGlmIHlvdSBoYXZlIHRoZSBVREsgcmF0aGVyIHRoYW4gL2Jpbi9jYy4KKyMgKyBmb3IgU0NPIE9wZW5TZXJ2ZXIgNS4wLjYsIHVzZSAibWFrZSBzY28zMnY1MDZ4eHgiIGVudHJpZXMgYXMgYWJvdmUuCisjICsgZm9yIFNDTyBPcGVuU2VydmVyIDUuMC42YSx1c2UgIm1ha2Ugc2NvMzJ2NTA2YXh4eCIgZW50cmllcyBhcyBhYm92ZS4KKyMgKyBmb3IgU0NPIE9wZW5TZXJ2ZXIgNS4wLjcsIHVzZSAibWFrZSBzY28zMnY1MDciLCAibWFrZSBzY28zMnY1MDduZXQiCisjID8gZm9yIFNDTyAoVW5pdmVsKSBVbml4V2FyZSAxLngsICJtYWtlIHVuaXh3YXJlIiBvciAibWFrZSB1bml4d2FyZW5ldGMiLgorIyAgICAgSWYgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhpcyBpbiBDLUsgNysgc2VlIG5vdGVzIGF0IHVuaXh3YXJlIGVudHJ5LgorIyArIGZvciBTQ08gVW5peFdhcmUgMi4wLngsICJtYWtlIHV3MjAiCisjICsgZm9yIFNDTyBVbml4V2FyZSAyLjEuMCwgIm1ha2UgdXcyMSIKKyMgKyBmb3IgU0NPIFVuaXhXYXJlIDIuMS4zLCAibWFrZSB1dzIxMyIKKyMgKyBmb3IgU0NPIFVuaXhXYXJlIDcsICJtYWtlIHV3NyIKKyMgKyBmb3IgU0NPIFVuaXhXYXJlIDcgd2l0aCBJS1NEIHN1cHBvcnQsICJtYWtlIHV3N2lrc2QiIG9yICJtYWtlIHV3N2lrc2R1ZGsiCisjICsgZm9yIFNDTyBVbml4V2FyZSA3IHdpdGggT3BlblNTTCwgIm1ha2UgdXc3c3NsIgorIyArIGZvciBTQ08gKENhbGRlcmEpIE9wZW4gVU5JWCA4LCAibWFrZSBvdTgiCisjICsgZm9yIFNoYXJwIFphdXJ1cyBTTDU1MDAgUERBLCAibWFrZSB6c2w1NTAwIi4KKyMgPyBmb3IgU2VxdWVudCB3aXRoIERZTklYL3B0eCAxLjIuMSwgIm1ha2UgZHluaXhwdHgxMiIKKyMgPyBmb3IgU2VxdWVudCB3aXRoIERZTklYL3B0eCAxLjMgb3IgMS40IHdpdGggVENQL0lQLCAibWFrZSBkeW5peHB0eDEzIgorIyA/IGZvciBTZXF1ZW50IHdpdGggRFlOSVgvcHR4IDIuMCBvciAyLjEgd2l0aCBUQ1AvSVAsICJtYWtlIGR5bml4cHR4MjAiCisjICAgICBvciAiZHluaXhwdHgyMGMiCisjICsgZm9yIFNlcXVlbnQgd2l0aCBEWU5JWC9wdHggMi4xLjYgb24gaTQ4NiwgImR5bml4cHR4MjE2YyIKKyMgPyBmb3IgU2VxdWVudCB3aXRoIERZTklYL3B0eCBWNC4xLjMgd2l0aCBUQ1AvSVAsICJtYWtlIGR5bml4cHR4NDFjIgorIyArIGZvciBTZXF1ZW50IHdpdGggRFlOSVgvcHR4IFY0LjQuMiB3aXRoIFRDUC9JUCwgIm1ha2UgZHluaXhwdHg0NCIKKyMgPyBmb3IgU2VxdWVudCBCYWxhbmNlIDgwMDAgb3IgQjggd2l0aCBEWU5JWCAzLjAueHgsICJtYWtlIGR5bml4MyIKKyMgICAgb3IgIm1ha2UgZHluaXgzbm9hY3UiCisjID8gZm9yIFNlcXVlbnQgU3ltbWV0cnkgUzgxIHdpdGggRFlOSVggMy4wLnh4LCAibWFrZSBkeW5peDMiCisjID8gZm9yIFNlcXVlbnQgRFlOSVggMy4xLnh4LCAibWFrZSBkeW5peDMxIiBvciAibWFrZSBkeW5peDMxYyIKKyMgKyBmb3IgU2llbWVucy9OaXhkb3JmIFNJTklYLUwgSW50ZWwgVjUuNDEsICJtYWtlIHNpbml4NTQxaSIKKyMgKyBmb3IgU2llbWVucy9OaXhkb3JmIFNJTklYLU4gTUlQUyBWNS40MiwgIm1ha2Ugc2luaXg1NDIiCisjICsgZm9yIFNpZW1lbnMvTml4ZG9yZiBTSU5JWC1QIE1JUFMgVjUuNDIgd2l0aCBnY2MsICJtYWtlIHNpbml4NTQyZyIKKyMgKyBmb3IgU2llbWVucy9OaXhkb3JmIFNJTklYLVogSW50ZWwgVjUuNDIsICJtYWtlIHNpbml4NTQyaSIKKyMgKyBmb3IgU2llbWVucy9OaXhkb3JmIFJlbGlhbnQgVU5JWCBWNS40MywgIm1ha2Ugc25pNTQzIgorIyArIGZvciBTaWVtZW5zL05peGRvcmYgUmVsaWFudCBVTklYIFY1LjQ0LCAibWFrZSBzbmk1NDQiCisjID8gZm9yIFNpbGljb24gR3JhcGhpY3MgSXJpcyBTeXN0ZW0gViBJUklYIDMuMiBvciBlYXJsaWVyLCAibWFrZSBpcmlzIgorIyA/IGZvciBTaWxpY29uIEdyYXBoaWNzIFN5cyBWIFIzIHdpdGggSVJJWCAzLjMgb3IgbGF0ZXIsICJtYWtlIHN5czVyMyIKKyMgPyBmb3IgU2lsaWNvbiBHcmFwaGljcyBJcmlzIEluZGlnbyB3aXRoIElSSVggNC4wIG9yIDUuMCwgIm1ha2UgaXJpeDQwIiBvcgorIyAgICAgKHRvIGluY2x1ZGUgWWVsbG93IFBhZ2VzIGFuZCBDdXJzZXMpICJtYWtlIGlyaXg0MHlwYyIKKyMgPyBmb3IgU2lsaWNvbiBHcmFwaGljcyBJcmlzIEluZGlnbyBvciBFbGFuIHdpdGggSVJJWCA0LjAueCB3aXRoIG1pY3JvY29kZQorIyAgICAgb3B0aW1pemF0aW9uIGFuZCAtTzQsICJtYWtlIGlyaXg0MHUiIG9yICJpcml4NDB1YyIgKGFuZCByZWFkIG5vdGVzCisjICAgICBhY2NvbXBhbnlpbmcgdGhlc2UgZW50cmllcykuCisjICsgZm9yIFNpbGljb24gR3JhcGhpY3MgSVJJWCA1LjEsICJtYWtlIGlyaXg1MSIgb3IgImlyaXg1MXgiIChubyBvcHRpbWl6ZSkKKyMgKyBmb3IgU2lsaWNvbiBHcmFwaGljcyBJUklYIDUuMiwgIm1ha2UgaXJpeDUyIgorIyArIGZvciBTaWxpY29uIEdyYXBoaWNzIElSSVggNS4zLCAibWFrZSBpcml4NTMiIG9yICJpcml4NTN4IiAobm8gb3B0aW1pemUpCisjICsgZm9yIFNpbGljb24gR3JhcGhpY3MgSVJJWCA2LjAsICJtYWtlIGlyaXg2MCIuCisjICsgZm9yIFNpbGljb24gR3JhcGhpY3MgSVJJWCA2LjIsICJtYWtlIGlyaXg2MiIuCisjICsgZm9yIFNpbGljb24gR3JhcGhpY3MgSVJJWCA2LjMsICJtYWtlIGlyaXg2MyIuCisjICsgZm9yIFNpbGljb24gR3JhcGhpY3MgSVJJWCA2LjQsICJtYWtlIGlyaXg2NCIgb3IgIm1ha2UgaXJpeDY0Z2NjIi4KKyMgKyBmb3IgU2lsaWNvbiBHcmFwaGljcyAoU0dJKSBJUklYIDYuNSwgIm1ha2UgaXJpeDY1IiBvciAibWFrZSBpcml4NjVtaXBzMiIKKyMgPyBmb3IgU29sYXJpcyAyLjAtMi4zIG9uIFNQQVJDIG9yIEludGVsLCBTdW5Qcm8gQ0MsICJtYWtlIHNvbGFyaXMyeCIsCisjID8gICBvciB0byBhZGQgU3VuTGluayBYLjI1IDguMHggc3VwcG9ydCwgIm1ha2Ugc29sYXJpczJ4MjUiLgorIyArIGZvciBTb2xhcmlzIDIuNCBidWlsdCB3aXRoIGdjYywgIm1ha2Ugc29sYXJpczI0ZyIuCisjICsgZm9yIFNvbGFyaXMgMi4wLTIuMyBvbiBTUEFSQyBvciBJbnRlbCwgR05VIENDLCAibWFrZSBzb2xhcmlzMnhnIi4KKyMgKyBmb3IgU29sYXJpcyAyLjQgd2l0aCBYLjI1LCAibWFrZSBzb2xhcmlzMjR4MjUiLgorIyArIGZvciBTb2xhcmlzIDIuNSBvbiBTUEFSQyBvciBJbnRlbCwgU3VuUHJvIENDLCAibWFrZSBzb2xhcmlzMjUiLgorIyArICAgb3IgdG8gYWRkIFN1bkxpbmsgWC4yNSA4LjB4IHN1cHBvcnQsICJtYWtlIHNvbGFyaXMyNXgyNSIuCisjICsgZm9yIFNvbGFyaXMgMi41IG9uIFNQQVJDIG9yIEludGVsLCBHTlUgQ0MsICJtYWtlIHNvbGFyaXMyNWciLgorIyArIGZvciBTb2xhcmlzIDIuNiBvbiBTUEFSQyBvciBJbnRlbCwgIm1ha2Ugc29sYXJpczI2Ii4KKyMgKyBmb3IgU29sYXJpcyA3IG9uIFNQQVJDIG9yIEludGVsLCBTdW5Qcm8gQ0MsICJtYWtlIHNvbGFyaXM3Ii4KKyMgKyBmb3IgU29sYXJpcyA3IG9uIFNQQVJDIG9yIEludGVsLCBHTlUgQ0MsICJtYWtlIHNvbGFyaXM3ZyIuCisjICsgZm9yIFNvbGFyaXMgOCBvbiBTUEFSQyBvciBJbnRlbCwgU3VuUHJvIENDLCAibWFrZSBzb2xhcmlzOCIuCisjICsgZm9yIFNvbGFyaXMgOCBvbiBTUEFSQyBvciBJbnRlbCwgR05VIENDLCAibWFrZSBzb2xhcmlzOGciLgorIyArIGZvciBTb2xhcmlzIDkgb24gU1BBUkMgKG9yIEludGVsPyksIDMyLWJpdCwgU3VuUHJvIENDLCAibWFrZSBzb2xhcmlzOSIuCisjICsgZm9yIFNvbGFyaXMgOSBvbiBTUEFSQyAob3IgSW50ZWw/KSwgMzItYml0LCBHTlUgQ0MsICJtYWtlIHNvbGFyaXM5ZyIuCisjICsgZm9yIFNvbGFyaXMgOSBvbiBTUEFSQyAob3IgSW50ZWw/KSwgNjQtYml0LCBHTlUgQ0MsICJtYWtlIHNvbGFyaXM5ZzY0Ii4KKyMgKyBmb3IgU29sYm91cm5lIDQvNTAwIHdpdGggT1MvTVAgNCAibWFrZSBzdW5vczQiCisjICsgZm9yIFNvbGJvdXJuZSA0LzUwMCB3aXRoIE9TL01QIDQuMSAibWFrZSBzdW5vczQxIiBvciAibWFrZSBzdW5vczQxYyIKKyMgPyBmb3IgU09OWSBORVdTIHdpdGggTkVXUy1PUyA0LjAuMUMsICJtYWtlIHNvbnluZXdzIgorIyA/IGZvciBTT05ZIE5FV1Mgd2l0aCBORVdTLU9TIDQuMS4yQywgIm1ha2Ugc29ueW5ld3MiCisjID8gZm9yIFNwZXJyeS9VTklTWVMgNTAwMC8yMCwgVVRTIFYgNS4yIDNSMSwgIm1ha2Ugc3lzNSIKKyMgPyBmb3IgU3BlcnJ5L1VOSVNZUyA1MDAwLzMwLzM1LzUwLzU1LCBVVFMgViA1LjIgMi4wMSwgIm1ha2UgdW5pc3lzNXIyIgorIyA/IGZvciBTcGVycnkvVU5JU1lTIDUwMDAvODAgd2l0aCBTeXN0ZW0gViBSMywgIm1ha2Ugc3lzNXIzIgorIyA/IGZvciBTcGVycnkvVU5JU1lTIDUwMDAvOTUgd2l0aCBTeXN0ZW0gViBSMywgIm1ha2Ugc3lzNXIzIgorIyAgICAgRm9yIFVOSVNZUyBTVlIzIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byAibWFrZSBzeXM1cjMgS0ZMQUdTPS1VRFlOQU1JQyIKKyMgPyBmb3IgU3RhcmRlbnQgMTUyMCwgIm1ha2Ugc3lzNXIzIgorIyA/IGZvciBTdHJhdHVzIEZUWCAyLngsIHRyeSAibWFrZSBmdHgiIG9yIGVsc2UgIm1ha2Ugc3lzNXI0IiBvciAic3lzNXI0c3giCisjICsgZm9yIFN0cmF0dXMgRlRYIDMueCwgUEEtUklTQyAxLjAgb3IgMi4wLCAibWFrZSBmdHgiIG9yICJtYWtlIGZ0eHRjcCIKKyMgPyBmb3IgU3VuIHdpdGggU3VuIFVOSVggMy41IGFuZCBnY2MsICJtYWtlIHN1bm9zM2djYyIKKyMgPyBmb3IgU3VuIHdpdGggcHJlLTQuMCBTdW5PUyB2ZXJzaW9ucywgIm1ha2UgYnNkIiAob3IgYXBwcm9wcmlhdGUgdmFyaWFudCkKKyMgPyBmb3IgU3VuIHdpdGggU3VuT1MgNC4wLCBCU0QgZW52aXJvbm1lbnQsICJtYWtlIHN1bm9zNCIKKyMgPyBmb3IgU3VuIHdpdGggU3VuT1MgNC4wLCBCU0QsIHdpdGggU3VuTGluayBYLjI1LCBtYWtlIHN1bm9zNHgyNQorIyArIGZvciBTdW4gd2l0aCBTdW5PUyA0LjEgb3IgNC4xLjEsIEJTRCBlbnZpcm9ubWVudCwgIm1ha2Ugc3Vub3M0MSIKKyMgICAgIG9yICJtYWtlIHN1bm9zNDFjIiAoY3Vyc2VzKSBvciAibWFrZSBzdW5vczQxZ2NjIiAoY29tcGlsZSB3aXRoIGdjYykKKyMgKyBmb3IgU3VuIHdpdGggU3VuT1MgNC4xLngsIEJTRCwgd2l0aCBTdW5MaW5rIFguMjUgNy4wMCBvciBlYXJsaWVyLAorIyAgICAgIm1ha2Ugc3Vub3M0MXgyNSIgb3IgIm1ha2Ugc3Vub3M0MXgyNWMiIChjdXJzZXMpCisjICsgZm9yIFN1biB3aXRoIFN1bk9TIDQuMSwgNC4xLjEsIEFUJlQgU3lzIFYgUjMgZW52aXJvbm1lbnQsICJtYWtlIHN1bm9zNDFzNSIKKyMgKyBmb3IgU3VuIHdpdGggU3VuT1MgNC4xLjIsICJtYWtlIHN1bm9zNDEiIG9yIGFueSBvZiBpdHMgdmFyaWF0aW9ucy4KKyMgICAgIE5PVEU6ICBBbGwgU3VuT1MgNC54IHN5c3RlbXMgLS0gU2hhcmVkIGxpYnJhcmllcyBhcmUgdXNlZCBieSBkZWZhdWx0LgorIyAgICAgICBJZiB0aGlzIGNhdXNlcyBwcm9ibGVtcywgYWRkIC1Cc3RhdGljIHRvIENGTEFHUy4KKyMgICAgIE5PVEUyOiBXaGVuIGJ1aWxkaW5nIEMtS2VybWl0IHVuZGVyIFN1bk9TIGZvciB0aGUgQlNEIHVuaXZlcnNlLAorIyAgICAgICBidXQgL3Vzci81YmluL2NjIGlzIGFoZWFkIG9mIC91c3IvdWNiL2NjIGluIHlvdXIgUEFUSCwgYWRkCisjICAgICAgICJDQz0vdXNyL3VjYi9jYyBDQzI9L3Vzci91Y2IvY2MiIHRvIHRoZSBtYWtlIGVudHJ5LgorIyAgICAgTk9URTM6IElmIGFuIGV4ZWN1dGFibGUgYnVpbHQgb24gb25lIHR5cGUgb2YgU3VuIGhhcmR3YXJlIGRvZXMgbm90IHdvcmsKKyMgICAgICAgb24gYW5vdGhlciB0eXBlLCByZWJ1aWxkIHRoZSBwcm9ncmFtIGZyb20gc291cmNlIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4KKyMgICBmb3IgU3VuIHdpdGggU29sYXJpcyAxLnggdXNlIFN1bk9TIDQuMSBlbnRyaWVzLgorIyAgIGZvciBTdW4gd2l0aCBTb2xhcmlzIDIuMCBhbmQgaGlnaGVyIHVzZSBTb2xhcmlzIGVudHJpZXMuCisjICsgZm9yIFN1biBTUEFSQyB3aXRoIExpbnV4LCAibWFrZSBsaW51eCIKKyMgPyBmb3IgU3VuIFNQQVJDIHdpdGggT1BFTlNURVAvTWFjaCA0LjEsICJtYWtlIG5leHRxdWFkZmF0IgorIyA/IGZvciBTdW4gU1BBUkMgd2l0aCBPUEVOU1RFUC9NYWNoIDQuMiwgIm1ha2Ugb3BlbnN0ZXA0MiIKKyMgLSBmb3IgVGFuZHkgMTYvNjAwMCB3aXRoIFhlbml4IDMuMCwgIm1ha2UgdHJzMTYiIChDLUtlcm1pdCA3LjAgaXMgdG9vIGJpZykKKyMgPyBmb3IgVGVrdHJvbml4IDYxMzAvNDEzMi80M3h4IChlLmcuNDMwMSkgd2l0aCBVVGVrIE9TLCAibWFrZSB1dGVrIgorIyAgICAgb3IgKGZvciBtb2RlbHMgd2l0aG91dCBoYXJkd2FyZSBmbG93IGNvbnRyb2wpLCAibWFrZSB1dGVrbm9od2ZjIgorIyA/IGZvciBUZWt0cm9uaXggWEQ4OCBzZXJpZXMgd2l0aCBVVGVrViBPUywgIm1ha2UgdXRla3ZyMyIKKyMgPyBmb3IgVHJpIFN0YXIgRmxhc2ggQ2FjaGUgd2l0aCBFc2l4IFNWUjMuMiwgIm1ha2Ugc3lzNXIzIgorIyArIGZvciBUcnUtNjQgVU5JWCA0LjBFLCAibWFrZSB0cnU2NC00MGUiCisjICsgZm9yIFRydS02NCBVTklYIDQuMEYsICJtYWtlIHRydTY0LTQwZiIKKyMgKyBmb3IgVHJ1LTY0IFVOSVggNC4wRywgIm1ha2UgdHJ1NjQtNDBnIgorIyArIGZvciBUcnUtNjQgVU5JWCA1LjBBLCAibWFrZSB0cnU2NC01MGEiCisjICsgZm9yIFRydS02NCBVTklYIDUuMUEsICJtYWtlIHRydTY0LTUxYSIKKyMgPyBmb3IgVW5pc3RhciwgIm1ha2Ugc3lzNSIKKyMgPyBmb3IgVW5pc3lzIFMvNDA0MCA2ODA0MCBDVElYIFNWUjMuMiA2LjQuMSwgIm1ha2UgY3RpeCIgb3IgIm1ha2Ugc3lzNXIzIgorIyA/IGZvciBVbmlzeXMgVTUwMDAgVU5JWCBTVlIzIDYueCwgIm1ha2Ugc3lzNXIzIiBvciAibWFrZSBzeXM1cjNjIgorIyA/IGZvciBVbmlzeXMgVTYwMDAgVU5JWCBTVlI0IDEueCwgIm1ha2Ugc3lzNXI0bngiIG9yICJtYWtlIHN5czVyNG54bmV0YyIKKyMgICBmb3IgVW5pc3lzIC4uLiAoYWxzbyBzZWUgU3BlcnJ5KQorIyAgIGZvciBVbml2ZWwgLSBzZWUgVW5peFdhcmUKKyMgICBmb3IgVW5peHdhcmUgLSBzZWUgU0NPCisjID8gZm9yIFZhbGlkIFNjYWxkc3RhciwgIm1ha2UgdmFsaWQiCisjID8gZm9yIFdoaXRlY2hhcGVsIE1HMDEgR2VuaXggMS4zLCAibWFrZSB3aGl0ZSIKKyMgPyBmb3IgWmlsb2cgWkVVUyAzLjIxLCAibWFrZSB6aWxvZyIKKyMKKyMgVGhlIHJlc3VsdCBzaG91bGQgYmUgYSBydW5uYWJsZSBwcm9ncmFtIGNhbGxlZCAid2VybWl0IiBpbiB0aGUgY3VycmVudAorIyBkaXJlY3RvcnkuICBBZnRlciBzYXRpc2ZhY3RvcnkgdGVzdGluZywgeW91IGNhbiByZW5hbWUgd2VybWl0IHRvICJrZXJtaXQiCisjIGFuZCBwdXQgaXQgd2hlcmUgdXNlcnMgY2FuIGZpbmQgaXQuCisjCisjIFRvIHJlbW92ZSBpbnRlcm1lZGlhdGUgYW5kIG9iamVjdCBmaWxlcywgIm1ha2UgY2xlYW4iLgorIyBJZiB5b3VyIEMgY29tcGlsZXIgcHJvZHVjZXMgZmlsZXMgd2l0aCBhbiBleHRlbnNpb24gb3RoZXIgdGhhbiAibyIsCisjIHRoZW4gIm1ha2UgY2xlYW4gRVhUPXUiLCAibWFrZSBjbGVhbiBFWFQ9cyIsIG9yIHdoYXRldmVyLgorIworIyBUbyBydW4gbGludCBvbiB0aGUgc291cmNlIGZpbGVzLCAibWFrZSBsaW50c3VuIiwgIm1ha2UgbGludGJzZCIsCisjICJtYWtlIGxpbnRzNSIsIGFzIGFwcHJvcHJpYXRlLgorIworIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgU0VDVVJFIFRBUkdFVFMKKyMKKyMgQmVnaW5uaW5nIHdpdGggQy1LZXJtaXQgNy4wLCBzZWN1cmUgdGFyZ2V0cyBhcmUgaW5jbHVkZWQsIGFzIGFyZSB0aGUKKyMgc291cmNlIG1vZHVsZXMgKGNrdWF0Ki5bY2hdLCBja18qLltjaF0pIG5lZWRlZCB0byBidWlsZCB0aGVtLiAgU2VjdXJlCisjIHRhcmdldCBuYW1lcyBhcmUgbGlrZSB0aGUgcmVndWxhciBuYW1lcywgYnV0IHdpdGggc2VjdXJpdHkgZmVhdHVyZXMKKyMgaW5kaWNhdGVkIGJ5IHBsdXMgKCspIHNpZ25zLiAgVGhlIGZlYXR1cmVzIGFyZToKKyMKKyMga3JiNCAgICAgTUlUIEtlcmJlcm9zIElWCisjIGtyYjUgICAgIE1JVCBLZXJiZXJvcyBWCisjIG9wZW5zc2wgIE9wZW5TU0wgKFNTTC9UTFMpCisjIHpsaWIgICAgIFpMSUIgY29tcHJlc3Npb24gZm9yIFNTTC9UTFMKKyMgc3JwICAgICAgU3RhbmZvcmQgU2VjdXJlIFJlbW90ZSBQYXNzd29yZAorIyBwYW0gICAgICBQQU0gKHBsdWdnYWJsZSBhdXRoZW50aWNhdGlvbiBtb2R1bGUpCisjIHNoYWRvdyAgIFNoYWRvdyBQYXNzd29yZCBGaWxlCisjCisjIFlvdSBjYW4gYnVpbGQgdGhlc2UgdGFyZ2V0cyBpZiB5b3UgaGF2ZSB0aGUgS2VybWl0IHNvdXJjZSBmaWxlcyBhbmQgdGhlCisjIHJlcXVpcmVkIGxpYnJhcmllcyAoS2VyYmVyb3MsIE9wZW5TU0wsIFNSUCwgZXRjKSBhbmQgaGVhZGVyIGZpbGVzLiAgU2VlOgorIyAgIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zZWN1cml0eS5odG1sCisjIGZvciBzcGVjaWZpYyBkZXRhaWxzIHJlZ2FyZGluZyBzdXBwb3J0ZWQgdmVyc2lvbnMuCisjCisjIE5PVEU6IE9wZW5TU0wgMC45LjYgYW5kIGVhcmxpZXIgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggMC45LjcgYW5kIGxhdGVyLgorIyBDLUtlcm1pdCBjb2RlIGlzIGRlc2lnbmVkIGZvciAwLjkuNi4gIFRvIGJ1aWxkIHdpdGggMC45LjcgeW91IG11c3QgYWRkCisjIC1ET1BFTlNTTF8wOTcgdG8gYXZvaWQgbWlzc2luZyBzeW1ib2xzIGluIHRoZSBERVMgbGlicmFyeSBhbmQgdG8gdXNlIHRoZQorIyBlbnRyeSBwb2ludHMgdGhhdCB3ZXJlIHJlbmFtZWQgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBLZXJiZXJvcyA0LgorIworIyBJbiBPcGVuU1NMIGJ1aWxkcyBhZGQgLWxkbCBpZiB5b3UgZ2V0IHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBmb3IKKyMgZGxvcGVuLCBkbGNsb3NlLCBkbHN5bSwgYW5kL29yIGRsZXJyb3IuCisjCisjIFRoZSBmb2xsb3dpbmcgc3ltYm9scyBhcmUgdXNlZCB0byBzcGVjaWZ5IGxpYnJhcnkgYW5kIGhlYWRlciBmaWxlIGxvY2F0aW9ucworIyBSZWRlZmluZSB0aGVtIHRvIHRoZSB2YWx1ZXMgdXNlZCBvbiB5b3VyIHN5c3RlbSBieToKKyMgLiBlZGl0aW5nIHRoaXMgZmlsZQorIyAuIGRlZmluaW5nIHRoZSB2YWx1ZXMgb24gdGhlIGNvbW1hbmQgbGluZQorIyAuIGRlZmluaW5nIHRoZSB2YWx1ZXMgaW4gdGhlIGVudmlyb25tZW50IGFuZCB1c2UgdGhlIC1lIG9wdGlvbgorIworcHJlZml4ICA9IC91c3IvbG9jYWwKK3NycHJvb3QgPSAkKHByZWZpeCkKK3NzbHJvb3QgPSAkKHByZWZpeCkKK21hbnJvb3QgPSAkKHByZWZpeCkKKworSzRMSUI9LUwvdXNyL2tlcmJlcm9zL2xpYgorSzRJTkM9LUkvdXNyL2tlcmJlcm9zL2luY2x1ZGUKK0s1TElCPS1ML3Vzci9rZXJiZXJvcy9saWIKK0s1SU5DPS1JL3Vzci9rZXJiZXJvcy9pbmNsdWRlCitTUlBMSUI9LUwkKHNycHJvb3QpL2xpYgorU1JQSU5DPS1JJChzcnByb290KS9pbmNsdWRlCitTU0xMSUI9LUwkKHNzbHJvb3QpL3NzbC9saWIKK1NTTElOQz0tSSQoc3Nscm9vdCkvc3NsL2luY2x1ZGUKKyMKKyMgYWl4NDEra3JiNStrcmI0OiAgICAgICAgICAgICAgICAgICAgSUJNIEFJWCA0LjEgd2l0aCBLZXJiZXJvcyBJViBhbmQgVgorIyBhaXg0M2djYytrcmI1K2tyYjQ6ICAgICAgICAgICAgICAgICBJQk0gQUlYIDQuMyBidWlsdCB3aXRoIGdjYywgZGl0dG8KKyMgYWl4NDNnY2Mra3JiNStrcmI0K29wZW5zc2w6ICAgICAgICAgRGl0dG8sIHBsdXMgT3BlblNTTCAoU1NML1RMUykKKyMgYWl4NDNnY2Mrb3BlbnNzbDogICAgICAgICAgICAgICAgICAgSUJNIEFJWCA0LjMgd2l0aCBPcGVuU1NMCisjIGZyZWVic2Q0NCtzcnArb3BlbnNzbCAgICAgICAgICAgICAgIEZyZWVCU0QgNC40IHdpdGggU1JQIGFuZCBPcGVuU1NMCisjIGZyZWVic2Q1MCtvcGVuc3NsICAgICAgICAgICAgICAgICAgIEZyZWVCU0QgNS4wIHdpdGggT3BlblNTTAorIyBocHV4MTEwMG8rb3BlbnNzbDogICAgICAgICAgICAgICAgICBIUC1VWCAxMS54eCB3aXRoIE9wZW5TU0wKKyMgaHB1eDEwMDBnY2Mrb3BlbnNzbDogICAgICAgICAgICAgICAgSFAtVVggMTAueHggd2l0aCBPcGVuU1NMIChidWlsZCB3aXRoIGdjYykKKyMgaHB1eDExMDBnY2Mrb3BlbnNzbDogICAgICAgICAgICAgICAgSFAtVVggMTEueHggd2l0aCBPcGVuU1NMIChidWlsZCB3aXRoIGdjYykKKyMgaXJpeDZ4K2tyYjU6ICAgICAgICAgICAgICAgICAgICAgICAgSVJJWCA2Lnggd2l0aCBLZXJiZXJvcyBWCisjIGlyaXg2NStrcmI1OiAgICAgICAgICAgICAgICAgICAgICAgIGV0YyBldGMuLi4KKyMgbGludXgra3JiNToKKyMgbGludXgra3JiNStrcmI0OgorIyBsaW51eCtzcnA6CisjIGxpbnV4K3NycCtwYW06CisjIGxpbnV4K3NycCtnbXA6CisjIGxpbnV4K3NycCtnbXArbm8tZGVzOgorIyBsaW51eCtzcnArZ21wLWV4cG9ydDoKKyMgbGludXgrc3JwK2dtcCtwYW06CisjIGxpbnV4K3NoYWRvdytwYW06CisjIGxpbnV4K29wZW5zc2w6CisjIGxpbnV4K29wZW5zc2wrc2hhZG93OgorIyBsaW51eCtvcGVuc3NsK3psaWIrc2hhZG93K3BhbToKKyMgbGludXgrc3JwK29wZW5zc2w6CisjIGxpbnV4K2tyYjUra3JiNCtzcnA6CisjIGxpbnV4K2tyYjUra3JiNCtzcnArb3BlbnNzbDoKKyMgbGludXgra3JiNStrcmI0K29wZW5zc2w6CisjIGxpbnV4K2tyYjUra3JiNCtvcGVuc3NsK3NoYWRvdzoKKyMgbGludXgra3JiNStrcmI0K29wZW5zc2wremxpYitzaGFkb3c6CisjIGxpbnV4K2tyYjUra3JiNCtzcnAtZXhwb3J0OgorIyBsaW51eCtrcmI1K2tyYjQrc3JwK3BhbToKKyMgbGludXgra3JiNStrcmI0K3NycCtvcGVuc3NsK3BhbS1kZWJ1ZzoKKyMgbGludXgra3JiNStrcmI0K3NycCtvcGVuc3NsK3BhbToKKyMgbGludXgra3JiNStrcmI0K3NycCtvcGVuc3NsK3psaWIrcGFtOgorIyBsaW51eCtrcmI1K2tyYjQrb3BlbnNzbCtzaGFkb3crcGFtOgorIyBsaW51eCtrcmI1K29wZW5zc2wremxpYitzaGFkb3crcGFtOgorIyBvcGVuYnNkMzArc3NsIChpbmNsdWRlcyBPcGVuU1NMKToKKyMgcmVkaGF0NzEsIHJlZGhhdDcyLCByZWRoYXQ3MywgcmVkaGF0ODAsIHJlZGhhdDkKKyMgIChLcmI1LCBPcGVuU1NMLCBTaG93ZG93LCBQQU0sIFpsaWIpCisjIHNjbzMydjUwMG5ldCtzc2w6CisjIHNjbzMydjUwNW5ldCtzc2w6CisjIHNvbGFyaXMyeCtrcmI0OgorIyBzb2xhcmlzMnhnK2tyYjQ6CisjIHNvbGFyaXMyeGcrb3BlbnNzbCtwYW0rc2hhZG93OgorIyBzb2xhcmlzMnhnK29wZW5zc2wremxpYitwYW0rc2hhZG93OgorIyBzb2xhcmlzMnhnK2tyYjUra3JiNCtvcGVuc3NsK3NoYWRvdzoKKyMgc29sYXJpczI1K2tyYjQ6CisjIHNvbGFyaXMyNWcra3JiNDoKKyMgc29sYXJpczI2ZytvcGVuc3NsOgorIyBzb2xhcmlzOGcrb3BlbnNzbCt6bGliK3BhbStzaGFkb3c6CisjIHNvbGFyaXM4ZytrcmI0OgorIyBzb2xhcmlzOWcrb3BlbnNzbCt6bGliK3BhbStzaGFkb3c6CisjIHNvbGFyaXM5ZytvcGVuc3NsK3NoYWRvdytwYW0remxpYgorIyBzdW5vczQxZ2NjK2tyYjQ6ICAgICAgICAgICAgICAgICAgICBTdW5PUyA0LjEgYnVpbHQgd2l0aCBnY2Mgd2l0aCBLZXJiZXJvcyBJVgorIyBzdW5vczQxZ2NjK29wZW5zc2w6ICAgICAgICAgICAgICAgICBTdW5PUyA0LjEgYnVpbHQgd2l0aCBnY2Mgd2l0aCBPcGVuU1NMCisjIHN1bm9zNDFnY2Mra3JiNCtvcGVuc3NsOiAgICAgICAgICAgIC4uLndpdGggS2VyYmVyb3MgSVYgYW5kIE9wZW5TU0wKKyMgc3Vub3M0MWdjYytrcmI0K29wZW5zc2wremxpYjogICAgICAgZGl0dG8sIHBsdXMgWkxJQiBjb21wcmVzc2lvbgorIyBzdW5vczQxZ2NjK2tyYjQrc3JwK29wZW5zc2wremxpYjogICBkaXR0bywgcGx1cyBTUlAKKyMgc3Vub3M0MWdjYytzcnArb3BlbnNzbCt6bGliOgorIyB1dzdzc2wKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBOT1RFUyBGT1IgVjcgQU5EIDIuWCBCU0QgKEJBU0VEIE9OIFZFUlNJT04gNEUgT0YgQy1LRVJNSVQsIDE5ODcpOgorIworIyBGb3IgVW5peCBWZXJzaW9uIDcsIHNldmVyYWwgdmFyaWFibGVzIG11c3QgYmUgZGVmaW5lZCB0byB0aGUgdmFsdWVzCisjIGFzc29jaWF0ZWQgd2l0aCB5b3VyIHN5c3RlbS4gIEJPT1ROQU1FPS9lZGl0aW9uNyBpcyB0aGUga2VybmVsIGltYWdlIG9uCisjIG9rc3RhdGUncyBQZXJraW4tRWxtZXIgMzIzMC4gIE90aGVycyB3aWxsIHByb2JhYmx5IGJlIC91bml4LiAgUFJPQ05BTUU9cHJvYworIyBpcyB0aGUgbmFtZSBvZiB0aGUgc3RydWN0dXJlIGFzc2lnbmVkIHRvIGVhY2ggcHJvY2VzcyBvbiBva3N0YXRlJ3Mgc3lzdGVtLgorIyBUaGlzIG1heSBiZSAiX3Byb2MiIG9yIHNvbWUgb3RoZXIgdmFyaWF0aW9uLiAgU2VlIDxzeXMvcHJvYy5oPiBmb3IgbW9yZQorIyBpbmZvIG9uIHlvdXIgc3lzdGVtcyBuYW1lIGNvbnZlbnRpb25zLiAgTlBST0NOQU1FPW5wcm9jIGlzIHRoZSBuYW1lIG9mIGEKKyMga2VybmVsIHZhcmlhYmxlIHRoYXQgdGVsbHMgaG93IG1hbnkgInByb2MiIHN0cnVjdHVyZXMgdGhlcmUgYXJlLiAgQWdhaW4KKyMgdGhpcyBtYXkgYmUgZGlmZmVyZW50IG9uIHlvdXIgc3lzdGVtLCBidXQgbnByb2Mgd2lsbCBwcm9iYWJseSBiZSBzb21ld2hlcmUuCisjIFRoZSB2YXJpYWJsZSBOUFRZUEUgaXMgdGhlIHR5cGUgb2YgdGhlIG5wcm9jIHZhcmlhYmxlIC0tIGludCwgc2hvcnQsIGV0Yy4KKyMgd2hpY2ggY2FuIHByb2JhYmx5IGJlIGdsZWFuZWQgZnJvbSA8c3lzL3BhcmFtLmg+LiAgVGhlIGRlZmluaXRpb24gb2YgRElSRUNUCisjIGlzIGEgbGl0dGxlIG1vcmUgY29tcGxpY2F0ZWQuICBJZiBubGlzdCgpIHJldHVybnMsIGZvciAicHJvYyIgb25seSwgdGhlCisjIGFkZHJlc3Mgb2YgdGhlIGFycmF5LCB0aGVuIHlvdSBzaG91bGQgZGVmaW5lIERJUkVDVCBhcyBpdCBpcyBiZWxvdy4gIElmCisjIGhvd2V2ZXIsIG5saXN0KCkgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiBhIHBvaW50ZXIgdG8gdGhlIGFycmF5LCB0aGVuIHlvdQorIyBzaG91bGQgZ2l2ZSBESVJFQ1QgYSBudWxsIGRlZmluaXRpb24gKERJUkVDVD0gKS4gIFRoZSBleHRlcm4gZGVjbGFyYXRpb24gaW4KKyMgPHN5cy9wcm9jLmg+IHNob3VsZCBjbGFyaWZ5IHRoaXMgZm9yIHlvdS4gIElmIGl0IGlzICJleHRlcm4gc3RydWN0IHByb2MKKyMgKnByb2MiLCB0aGVuIHlvdSBzaG91bGQgTk9UIGRlZmluZSBESVJFQ1QuICBJZiBpdCBpcyAiZXh0ZXJuIHN0cnVjdCBwcm9jCisjIHByb2NbXSIsIHRoZW4geW91IHNob3VsZCBwcm9iYWJseSBkZWZpbmUgRElSRUNUIGFzIGl0IGlzIGJlbG93LiAgU2VlCisjIGNrdXY3LmhscCBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKyMKKyMgRm9yIDIuOSBCU0QsIHRoZSBtYWtlZmlsZSBtYXkgdXNlIHBjYyByYXRoZXIgdGhhbiBjYyBmb3IgY29tcGlsZXM7IHRoYXQncworIyB3aGF0IHRoZSBDQyBhbmQgQ0MyIGRlZmluaXRpb25zIGFyZSBmb3IgKHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlCisjIG1ha2VmaWxlIHVzZXMgY2MgZm9yIGJvdGg7IHRoaXMgd2FzIHRlc3RlZCBpbiB2ZXJzaW9uIDRFIG9mIEMtS2VybWl0IGFuZAorIyB3b3JrZWQgT0sgb24gdGhlIERFQyBQcm8gMzgwLCBidXQgYWxsIGJldHMgYXJlIG9mZiBmb3IgdmVyc2lvbiA1QSkuICAyLjkKKyMgc3VwcG9ydCBiYXNpY2FsbHkgZm9sbG93cyB0aGUgNC4xIHBhdGguICBTb21lIDIuOSBzeXN0ZW1zIHVzZSAiZGlyLmgiIGZvcgorIyB0aGUgZGlyZWN0b3J5IGhlYWRlciBmaWxlLCBvdGhlcnMgd2lsbCBuZWVkIHRvIGNoYW5nZSB0aGlzIHRvICJuZGlyLmgiLgorIworIyBUaGUgdjcgYW5kIDIuOWJzZCB2ZXJzaW9ucyBhc3N1bWUgSSZEIHNwYWNlIG9uIGEgUERQLTExLiAgV2hlbiBidWlsZGluZworIyBDLUtlcm1pdCBmb3Igdjcgb24gYSBQRFAtMTEsIHlvdSBzaG91bGQgcHJvYmFibHkgYWRkIHRoZSAtaSBvcHRpb24gdG8gdGhlCisjIGxpbmsgZmxhZ3MuICBXaXRob3V0IEkmRCBzcGFjZSwgb3ZlcmxheXMgd2lsbCBiZSBuZWNlc3NhcnkgKGlmIGF2YWlsYWJsZSksCisjIG9yIGNvZGUgc2VnbWVudCBtYXBwaW5nIChhYGxhIFByby9WZW5peCkgaWYgdGhhdCdzIGF2YWlsYWJsZS4KKyMKKyMgQy1LZXJtaXQgNUEgKGFuZCA2LjA/KSBjYW4gYmUgYnVpbHQgZm9yIDIuMTAgYW5kIDIuMTFCU0QsIHVzaW5nIG92ZXJsYXlzLAorIyBidXQgYSBzZXBhcmF0ZSBtYWtlZmlsZSBpcyB1c2VkIGJlY2F1c2UgdGhpcyBvbmUgaXMgdG9vIGJpZy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBWNy1zcGVjaWZpYyB2YXJpYWJsZXMuCisjIFRoZXNlIGFyZSBzZXQgdXAgZm9yIFBlcmtpbi1FbG1lciAzMjMwIFY3IFVuaXg6CisjCitQUk9DPXByb2MKK0RJUkVDVD0KK05QUk9DPW5wcm9jCitOUFRZUEU9aW50CitCT09URklMRT0vZWRpdGlvbjcKKyMKKyMgKCBGb3Igb2xkIFRhbmR5IFRSUy04MCBNb2RlbCAxNkEgb3IgNjAwMCBWNy1iYXNlZCBYZW5peCwgdXNlIFBST0M9X3Byb2MsCisjICAgRElSRUNUPS1ERElSRUNULCBOUFJPQz1fTnByb2MsIE5QVFlQRT1zaG9ydCwgQk9PVEZJTEU9L3hlbml4ICkKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ29tcGlsZSBhbmQgTGluayB2YXJpYWJsZXM6CisjCisjICBFWFQgaXMgdGhlIGV4dGVuc2lvbiAoZmlsZSB0eXBlKSBmb3Igb2JqZWN0IGZpbGVzLCBub3JtYWxseSBvLgorIyAgU2VlIE1JTklYIGVudHJ5IGZvciB3aGF0IHRvIGRvIGlmIGFub3RoZXIgZmlsZXR5cGUgbXVzdCBiZSB1c2VkLgorIworRVhUPW8KKyNMTktGTEFHUz0KK1NIQVJFRExJQj0KK0NDPSBjYworQ0MyPSBjYworTUFLRT0gbWFrZQorU0hFTEw9L2Jpbi9zaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU0FNUExFIElOU1RBTExBVElPTiBTQ1JJUFQKKyMKKyMgTW9kaWZ5IHRvIHN1aXQgeW91ciBvd24gY29tcHV0ZXIncyBmaWxlIG9yZ2FuaXphdGlvbiBhbmQgcGVybWlzc2lvbnMuICBJZgorIyB5b3UgZG9uJ3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yaWVzLCAibWFrZSBpbnN0YWxsIgorIyBmYWlscy4gIEluIG1vc3QgY2FzZXMsIGEgcmVhbCBpbnN0YWxsYXRpb24gYWxzbyByZXF1aXJlcyB5b3UgdG8gY2hvd24gLworIyBjaGdycCB0aGUgS2VybWl0IGJpbmFyeSBmb3IgdGhlIFVVQ1AgbG9ja2ZpbGUgYW5kL29yIHR0eSBkZXZpY2VzLCBhbmQKKyMgcGVyaGFwcyBhbHNvIHRvIGNobW9kICtzIHRoZSBjb3JyZXNwb25kaW5nIHBlcm1pc3Npb24gZmllbGRzLgorIworIyBEZWZhdWx0IGJpbmFyeSwgbWFuLCBhbmQgZG9jIGRpcmVjdG9yaWVzIGFyZSBzdXBwbGllZCBiZWxvdy4gIFlvdSBjYW4KKyMgb3ZlcnJpZGUgdGhlbSBpbiB5b3VyICdtYWtlJyBjb21tYW5kLiAgRXhhbXBsZXM6CisjCisjICAgbWFrZSBpbnN0YWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFjY2VwdCBkZWZhdWx0cy4KKyMgICBtYWtlICJJTkZPRElSPS91c3Ivc2hhcmUvbGliL2tlcm1pdCIgaW5zdGFsbCAgICMgT3ZlcnJpZGUgSU5GT0RJUiBkZWZhdWx0LgorIworIyBZb3UgY2FuIGFsc28gYnVpbGQgYW5kIGluc3RhbGwgaW4gb25lIHN0ZXAsIGUuZy46CisjCisjICAgbWFrZSBzb2xhcmlzOCBpbnN0YWxsCisjCisjIElmIHlvdSB1c2UgdGhlICdpbnN0YWxsJyB0YXJnZXQgdG8gaW5zdGFsbCBDLUtlcm1pdCwgaXQgY3JlYXRlcyBhbgorIyBVTklOU1RBTEwgc2NyaXB0IHRoYXQgY2FuIGJlIHVzZWQgdG8gdW5pbnN0YWxsIGl0LgorIworV0VSTUlUID0gbWFrZXdoYXQKK0JJTkFSWSA9IHdlcm1pdAorREVTVERJUiA9CitCSU5ESVIgPSAkKHByZWZpeCkvYmluCitNQU5ESVIgPSAkKG1hbnJvb3QpL21hbi9tYW4xCitNQU5FWFQgPSAxCitTUkNESVIgPQorSU5GT0RJUiA9CitDRVJURElSID0KKworVEVYVEZJTEVTID0gQ09QWUlORy5UWFQgY2tjYndyLnR4dCBja3Vid3IudHh0IGNrdWlucy50eHQgY2tjY2ZnLnR4dCBcCisJCWNrY3BsbS50eHQgY2tlcm1pdC5pbmkgY2tlcm1vZC5pbmkgY2tlcm1pdDcwLnR4dCBja2VybWl0ODAudHh0CisKK0FMTCA9ICQoV0VSTUlUKQorCithbGw6ICQoQUxMKQorCisuYy5vOgorCSQoQ0MpICQoQ0ZMQUdTKSAtREtUQVJHRVQ9XCIkKEtUQVJHRVQpXCIgLWMgJDwKKworI0NsZWFuIHVwIGludGVybWVkaWF0ZSBhbmQgb2JqZWN0IGZpbGVzCitjbGVhbjoKKwlAZWNobyAnUmVtb3Zpbmcgb2JqZWN0IGZpbGVzLi4uJworCS1ybSAtZiBja2NtYWkuJChFWFQpIGNrdWNtZC4kKEVYVCkgY2t1dXNyLiQoRVhUKSBja3V1czIuJChFWFQpIFwKK2NrdXVzMy4kKEVYVCkgY2t1dXM0LiQoRVhUKSBja3V1czUuJChFWFQpIGNrY3Byby4kKEVYVCkgY2tjZm5zLiQoRVhUKSBcCitja2NmbjIuJChFWFQpIGNrY2ZuMy4kKEVYVCkgY2t1eGxhLiQoRVhUKSBja3Vjb24uJChFWFQpIGNrdXRpby4kKEVYVCkgXAorY2t1ZmlvLiQoRVhUKSBja3VkaWEuJChFWFQpIGNrdXNjci4kKEVYVCkgY2t3YXJ0LiQoRVhUKSBja3V1c3guJChFWFQpIFwKK2NrdXVzeS4kKEVYVCkgY2tjbmV0LiQoRVhUKSBja3V1czYuJChFWFQpIGNrdXVzNy4kKEVYVCkgY2t1c2lnLiQoRVhUKSBcCitja3VjbnMuJChFWFQpIGNrY21kYi4kKEVYVCkgY2t1YXRoLiQoRVhUKSBja2N0ZWwuJChFWFQpIGNrY2xpYi4kKEVYVCkgXAorY2tjdW5pLiQoRVhUKSBja19jcnAuJChFWFQpIGNrX3NzbC4kKEVYVCkgY2t1cHR5LiQoRVhUKSBja2NmdHAuJChFWFQpIFwKK2NrY3Byby5jIHdhcnQKKworIyBJbnN0YWxsIEMtS2VybWl0IGFmdGVyIGJ1aWxkaW5nIC0tIElNUE9SVEFOVDogUmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGFib3ZlCisjIChTQU1QTEUgSU5TVEFMTEFUSU9OIFNDUklQVCkuICBGb3IgU1NML1RMUyB2ZXJzaW9ucywgY2FfY2VydHMucGVtIGZpbGUKKyMgc2hvdWxkIGJlIGluc3RhbGxlZCBpbiB0aGUgYXBwcm9wcmlhdGUgcGxhY2UgZm9yIHlvdXIgT3BlblNTTCBsaWJyYXJ5LCBlLmcuOgorIworIyAgIGNwIGNhX2NlcnRzLnBlbSAvdXNyL2xvY2FsL3NzbC8KKyMgICBjcCBjYV9jZXJ0cy5wZW0gL3Vzci9zaGFyZS9zc2wvCisjCisjIFRvIG1ha2Ugc3VyZSAnbWFuJyBub3RpY2VzIHRoZSBuZXcgc291cmNlIGZpbGUgYW5kIGRvZXNuJ3Qga2VlcAorIyBzaG93aW5nIHRoZSBvbGQgZm9ybWF0dGVkIHZlcnNpb24sIHJlbW92ZSB0aGUgb2xkIGZvcm1hdHRlZCB2ZXJzaW9uLAorIyBzb21ldGhpbmcgbGlrZSB0aGlzOgorIwkJcm0gLWYgJChNQU5ESVIpLy4uL2NhdCQoTUFORVhUKS9rZXJtaXQuJChNQU5FWFQpCisjIG9yIHRoaXMgKHdoaWNoIHJlcXVpcmVzIENBVERJUiB0byBiZSBkZWZpbmVkKToKKyMJCXJtIC1mICQoQ0FURElSKS9rZXJtaXQuJChNQU5FWFQpCisjCisjIEFzIG9mIEMtS2VybWl0IDguMC4yMDUgdGhpcyB0YXJnZXQgYWxzbyBidWlsZHMgYW4gVU5JTlNUQUxMIHNjcmlwdCwgYW5kCisjIHNvIGl0IG1pZ2h0IGJlIHRvbyBsb25nIGZvciBzb21lIG9sZCBCb3VybmUgc2hlbGxzLCBpbiB3aGljaCBjYXNlIHlvdSBjYW4KKyMgdXNlIGEgZGlmZmVyZW50IHNoZWxsOgorIworIyAgIG1ha2UgU0hFTEw9a3NoIGluc3RhbGwKKyMgICBtYWtlIFNIRUxMPS9iaW4vcG9zaXgvc2ggaW5zdGFsbAorIworaW5zdGFsbDoKKwlAZWNobyBJbnN0YWxsaW5nIEMtS2VybWl0IHZlcnNpb24gJChDS1ZFUikuLi47XAorCXJtIC1mIFVOSU5TVEFMTDtcCisJZXhlYyAzPi4vVU5JTlNUQUxMO1wKKwllY2hvICIjIEMtS2VybWl0IFVOSU5TVEFMTCBzY3JpcHQiID4mMztcCisJZWNobyAiIyBgZGF0ZWBcbiIgPiYzO1wKKwllY2hvICJDS1ZFUj0kKENLVkVSKSIgPiYzO1wKKwllY2hvICJQck4gVW5pbnN0YWxsaW5nIEMtS2VybWl0IHZlcnNpb24gJChDS1ZFUikuLi4iID4mMztcCisJZWNobyBERVNURElSPSQoREVTVERJUik7XAorCWlmIHRlc3QgLW4gIiQoREVTVERJUikiOyB0aGVuXAorCQlpZiB0ZXN0IC1kICQoREVTVERJUik7IHRoZW5cCisJCQllY2hvICAiJChERVNURElSKSBleGlzdHMuLi5cbiI7XAorCQllbHNlXAorCQkJZWNobyAiQ3JlYXRpbmcgJChERVNURElSKS4uLiI7XAorCQkJREVTVERJUj1gZWNobyAkKERFU1RESVIpIHwgc2VkICdzIS8qJCQhISdgO1wKKwkJCW1rZGlyIC1wICQkREVTVERJUiAgfHwgZXhpdCAxO1wKKwkJZmk7XAorCQljaG1vZCA3NTUgJChERVNURElSKSB8fCBleGl0IDE7XAorCWZpO1wKKwllY2hvIEJJTkFSWT0kKEJJTkFSWSk7XAorCWlmIHRlc3QgLWYgJChCSU5BUlkpOyB0aGVuXAorCQlscyAtbCAkKEJJTkFSWSk7XAorCWVsc2VcCisJCWVjaG8gIj8kKEJJTkFSWSkgbm90IGZvdW5kIjtcCisJCWV4aXQgMTtcCisJZmk7XAorCWlmIHRlc3QgLXogIiQoREVTVERJUikkKEJJTkRJUikiOyB0aGVuXAorCQllY2hvICJCaW5hcnkgZGlyZWN0b3J5IG5vdCBzcGVjaWZpZWQiO1wKKwkJZXhpdCAxO1wKKwlmaTtcCisJaWYgdGVzdCAtZCAkKERFU1RESVIpJChCSU5ESVIpOyB0aGVuXAorCQllY2hvICAiJChERVNURElSKSQoQklORElSKSBleGlzdHMuLi4iO1wKKwllbHNlXAorCQllY2hvICJDcmVhdGluZyAkKERFU1RESVIpJChCSU5ESVIpLy4uLiI7XAorCQlta2RpciAtcCAgJChERVNURElSKSQoQklORElSKSB8fCBleGl0IDE7XAorCQljaG1vZCA3NTUgJChERVNURElSKSQoQklORElSKTtcCisJZmk7XAorCXJtIC1mICQoREVTVERJUikkKEJJTkRJUikva2VybWl0O1wKKwljcCAkKEJJTkFSWSkgJChERVNURElSKSQoQklORElSKS9rZXJtaXQgfHwgZXhpdCAxO1wKKwljaG1vZCA3NTUgICAgJChERVNURElSKSQoQklORElSKS9rZXJtaXQgfHwgZXhpdCAxO1wKKwlybSAtZiAgICAgICAgJChERVNURElSKSQoQklORElSKS9rZXJtaXQtc3Noc3ViO1wKKwlsbiAtcyAgICAgICAga2VybWl0XAorCQkgICAgICQoREVTVERJUikkKEJJTkRJUikva2VybWl0LXNzaHN1YiB8fCBleGl0IDE7XAorCWVjaG8gJ3NldCBmbGFnPWZcblByQyBSZW1vdmluZyBiaW5hcmllcycgPiYzO1wKKwllY2hvICJSbUYgJChERVNURElSKSQoQklORElSKS9rZXJtaXQtc3Noc3ViIiA+JjM7XAorCWVjaG8gIlJtRiAkKERFU1RESVIpJChCSU5ESVIpL2tlcm1pdCIgPiYzO1wKKwlpZiB0ZXN0IC1mIGNrZXJtaXQuaW5pOyB0aGVuXAorCQllY2hvICIjISQoREVTVERJUikkKEJJTkRJUikva2VybWl0IiA+XAorCQkJJChERVNURElSKSQoQklORElSKS9fdG1wLmluaTtcCisJCWNhdCBja2VybWl0LmluaSA+PiAkKERFU1RESVIpJChCSU5ESVIpL190bXAuaW5pO1wKKwkJbXYgJChERVNURElSKSQoQklORElSKS9fdG1wLmluaVwKKwkJICAgJChERVNURElSKSQoQklORElSKS9ja2VybWl0LmluaTtcCisJCWNobW9kIDc1NSAkKERFU1RESVIpJChCSU5ESVIpL2NrZXJtaXQuaW5pO1wKKwkJZWNobyAiUm1GICQoREVTVERJUikkKEJJTkRJUikvY2tlcm1pdC5pbmkiID4mMztcCisJZmk7XAorCWVjaG87XAorCWVjaG8gJ0VmTScgPiYzO1wKKwllY2hvICJLZXJtaXQgYmluYXJ5IGluc3RhbGxlZDoiO1wKKwlscyAtbCAkKERFU1RESVIpJChCSU5ESVIpL2tlcm1pdFwKKwkgICAgICAkKERFU1RESVIpJChCSU5ESVIpL2tlcm1pdC1zc2hzdWJcCisJICAgICAgJChERVNURElSKSQoQklORElSKS9ja2VybWl0LmluaTtcCisJZWNobztcCisJZWNobyAiIFdBUk5JTkc6IElmIEMtS2VybWl0IGlzIHRvIGJlIHVzZWQgZm9yIGRpYWxpbmcgb3V0LCI7XAorCWVjaG8gIiB5b3UgbXVzdCBjaGFuZ2UgaXRzIG93bmVyIGFuZCBncm91cCBhbmQgcGVybWlzc2lvbnMiO1wKKwllY2hvICIgdG8gbWF0Y2ggdGhlICdjdScgcHJvZ3JhbS4gIFNlZSB0aGUgY2t1aW5zLnR4dCBmaWxlIjtcCisJZWNobyAiIGZvciBkZXRhaWxzLiI7XAorCWVjaG87XAorCWVjaG8gTUFORElSPSQoTUFORElSKTtcCisJaWYgdGVzdCAtbiAiJChNQU5ESVIpIjsgdGhlblwKKwkJaWYgdGVzdCAtZCAkKE1BTkRJUik7IHRoZW5cCisJCQllY2hvICAiJChNQU5ESVIpIGV4aXN0cy4uLiI7XAorCQllbHNlXAorCQkJZWNobyAiQ3JlYXRpbmcgJChNQU5ESVIpLi4uIjtcCisJCQlta2RpciAkKE1BTkRJUikgfHwgZXhpdCAxO1wKKwkJCWNobW9kIDc1NSAkKE1BTkRJUikgfHwgZXhpdCAxO1wKKwkJZmk7XAorCQllY2hvICJJbnN0YWxsaW5nIG1hbiBwYWdlLi4uIjtcCisJCXJtIC1mICQoTUFORElSKS9rZXJtaXQuJChNQU5FWFQpO1wKKwkJY3AgICAgY2t1a2VyLm5yICQoTUFORElSKS9rZXJtaXQuJChNQU5FWFQpIHx8IGV4aXQgMTtcCisJCWNobW9kIDY0NCAgICAgICAkKE1BTkRJUikva2VybWl0LiQoTUFORVhUKSB8fCBleGl0IDE7XAorCQllY2hvICdzZXQgZmxhZz1mXG5QckMgUmVtb3ZpbmcgbWFuIHBhZ2VzJyA+JjM7XAorCQllY2hvICJSbUYgJChNQU5ESVIpL2tlcm1pdC4kKE1BTkVYVCkiID4mMztcCisJCWVjaG8gJ0VmTScgPiYzO1wKKwkJZWNobztcCisJZWxzZVwKKwkJZWNobyAiTm90IGluc3RhbGxpbmcgbWFuIHBhZ2UhXG4iO1wKKwlmaTtcCisJZWNobyBDRVJURElSPSQoQ0VSVERJUik7XAorCWlmIHRlc3QgLW4gIiQoQ0VSVERJUikiOyB0aGVuXAorCQlpZiB0ZXN0IC1mIGNhX2NlcnRzLnBlbTsgdGhlblwKKwkJCWlmIHRlc3QgLWQgJChDRVJURElSKTsgdGhlblwKKwkJCQllY2hvICAiJChDRVJURElSKSBleGlzdHMuLi4iO1wKKwkJCWVsc2VcCisJCQkJZWNobyAiQ3JlYXRpbmcgJChDRVJURElSKS4uLiI7XAorCQkJCW1rZGlyICQoQ0VSVERJUikgfHwgZXhpdCAxO1wKKwkJCQljaG1vZCA3NTUgJChDRVJURElSKSB8fCBleGl0IDE7XAorCQkJZmk7XAorCQkJZWNobyAiSW5zdGFsbGluZyBjZXJ0aWZpY2F0ZXMgZmlsZS4uLiI7XAorCQkJY3AgY2FfY2VydHMucGVtICQoQ0VSVERJUikgfHwgZXhpdCAxO1wKKwkJCWVjaG8gJ3NldCBmbGFnPWYnID4mMztcCisJCQllY2hvICdQckMgUmVtb3ZpbmcgY2VydGlmaWNhdGVzIGZpbGUnID4mMztcCisJCQllY2hvICJSbUYgJChDRVJURElSKS9jYV9jZXJ0cy5wZW0iID4mMztcCisJCQllY2hvICdFZk0nID4mMztcCisJCQllY2hvO1wKKwkJZmk7XAorCWVsc2VcCisJCWVjaG8gIk5vdCBpbnN0YWxsaW5nIGNlcnRpZmljYXRlcyBmaWxlIVxuIjtcCisJZmk7XAorCWVjaG8gU1JDRElSPSQoREVTVERJUikkKFNSQ0RJUik7XAorCWlmIHRlc3QgLW4gIiQoU1JDRElSKSI7IHRoZW5cCisJCWVjaG8gIkluc3RhbGxpbmcgc291cmNlIGZpbGVzLi4uIjtcCisJCWlmIHRlc3QgLWQgJChERVNURElSKSQoU1JDRElSKTsgdGhlblwKKwkJCWVjaG8gICIkKERFU1RESVIpJChTUkNESVIpIGV4aXN0cy4uLiI7XAorCQllbHNlXAorCQkJZWNobyAiQ3JlYXRpbmcgJChERVNURElSKSQoU1JDRElSKS8uLi4iO1wKKwkJCW1rZGlyICAgICAkKERFU1RESVIpJChTUkNESVIpIHx8IGV4aXQgMTtcCisJCQljaG1vZCA3NTUgJChERVNURElSKSQoU1JDRElSKTtcCisJCWZpO1wKKwkJZWNobyAiQ29weWluZyBzb3VyY2UgZmlsZXMgdG8gJChERVNURElSKSQoU1JDRElSKS4uLiI7XAorCQllY2hvICdzZXQgZmxhZz1mXG5QckMgUmVtb3Zpbmcgc291cmNlIGZpbGVzJyA+JjM7XAorCQlmb3IgVGV4dEZpbGUgaW4gQ09QWUlORy5UWFQgY2tbY3V3X10qLltjd2hdIG1ha2VmaWxlOyBkb1wKKwkJCWNwICQkVGV4dEZpbGUgJChERVNURElSKSQoU1JDRElSKS8gJiYgZWNobyAiLlxjIjtcCisJCQllY2hvICJSbUYgJChERVNURElSKSQoU1JDRElSKS8kJFRleHRGaWxlIiA+JjM7XAorCQlkb25lOyBlY2hvO1wKKwkJZWNobyAnRWZNJyA+JjM7XAorCQkoIGNkICQoREVTVERJUikkKFNSQ0RJUikvICYmXAorCQlscyAtbCBDT1BZSU5HLlRYVCBja1tjdXdfXSouW2N3aF0gbWFrZWZpbGUgKTtlY2hvO1wKKwllbHNlXAorCQllY2hvICJOb3QgaW5zdGFsbGluZyBzb3VyY2UgY29kZSFcbiI7XAorCWZpO1wKKwllY2hvIElORk9ESVI9JChERVNURElSKSQoSU5GT0RJUik7XAorCWlmIHRlc3QgLW4gIiQoSU5GT0RJUikiOyB0aGVuXAorCQllY2hvICJJbnN0YWxsaW5nIGluZm8gZmlsZXMuLi4iO1wKKwkJaWYgdGVzdCAtZCAkKERFU1RESVIpJChJTkZPRElSKTsgdGhlblwKKwkJCWVjaG8gICIkKERFU1RESVIpJChJTkZPRElSKSBleGlzdHMuLi4iO1wKKwkJZWxzZVwKKwkJCWVjaG8gIkNyZWF0aW5nICQoREVTVERJUikkKElORk9ESVIpLy4uLiI7XAorCQkJbWtkaXIgICAgICQoREVTVERJUikkKElORk9ESVIpIHx8IGV4aXQgMTtcCisJCQljaG1vZCA3NTUgJChERVNURElSKSQoSU5GT0RJUik7XAorCQlmaTtcCisJCWVjaG8gIkNvcHlpbmcgdGV4dCBmaWxlcyB0byAkKERFU1RESVIpJChJTkZPRElSKS4uLiI7XAorCQllY2hvICdzZXQgZmxhZz1mXG5QckMgUmVtb3ZpbmcgdGV4dCBmaWxlcycgPiYzO1wKKwkJRmlsZUNvcHlMaXN0PScnO1wKKwkJZm9yIFRleHRGaWxlIGluICQoVEVYVEZJTEVTKTsgZG9cCisJCQl0ZXN0IC1mICQkVGV4dEZpbGUgfHwgY29udGludWU7XAorCQkJY3AgJCRUZXh0RmlsZSAkKERFU1RESVIpJChJTkZPRElSKSAmJiBlY2hvICIuXGMiICYmXAorCQkJRmlsZUNvcHlMaXN0PSIkJEZpbGVDb3B5TGlzdCAkJFRleHRGaWxlIjtcCisJCQllY2hvICJSbUYgJChERVNURElSKSQoSU5GT0RJUikvJCRUZXh0RmlsZSIgPiYzO1wKKwkJZG9uZTsgZWNobztcCisJCWVjaG8gJ0VmTScgPiYzO1wKKwkJKCBjZCAkKERFU1RESVIpJChJTkZPRElSKS8gJiYgY2htb2QgIDY0NCAgICQkRmlsZUNvcHlMaXN0ICk7XAorCQkoIGNkICQoREVTVERJUikkKElORk9ESVIpLyAmJiBwd2QgJiYgbHMgLWwgJCRGaWxlQ29weUxpc3QgKTtcCisJZWxzZVwKKwkJZWNobyAiTm90IGluc3RhbGxpbmcgdGV4dCBmaWxlcyFcbiI7XAorCWZpO1wKKwllY2hvICJzZXQgZmxhZz1kXG5Qck4gUmVtb3ZpbmcgZW1wdHkgZGlycy4uLiIgPiYzO1wKKwllY2hvICJSbUQgJChERVNURElSKSQoQklORElSKSIgPiYzO1wKKwllY2hvICJSbUQgJChERVNURElSKSQoU1JDRElSKSIgPiYzO1wKKwllY2hvICJSbUQgJChERVNURElSKSQoSU5GT0RJUikiID4mMztcCisJZWNobyAiUm1EICQoQ0VSVERJUikiID4mMztcCisJZWNobyAiUm1EICQoTUFORElSKSIgPiYzO1wKKwllY2hvICJSbUQgJChERVNURElSKSIgPiYzO1wKKwllY2hvICJFZk0iID4mMztcCisJZWNobyAiUHJOIEMtS2VybWl0IHZlcnNpb24gJChDS1ZFUikgaXMgdW5pbnN0YWxsZWQhIiA+JjM7XAorCWVjaG8gQy1LZXJtaXQgdmVyc2lvbiAkKENLVkVSKSBpbnN0YWxsZWQhCisKKyMgVU4tSW5zdGFsbCBDLUtlcm1pdCBhZnRlciBidWlsZGluZworIyBQbGVhc2UgdG8gbm90IHJlbW92ZSB0aGUgZXh0cmEgYmxhbmtzIGJlZm9yZSBhbmQgYWZ0ZXIgJ3t9JyB3aXRoaW4gdGhlCisjIGZ1bmN0aW9ucy4gWW91IHdvdWxkIGdldCBzeW50YXggZXJyb3JzIGZvciBzb21lIG9sZGVyIEJvdXJuZSBzaGVsbHMhIEJlc3QgaXMgCisjIHlvdSBkb24ndCBjaGFuZ2Ugb3IgcmVtb3ZlIGFueXRoaW5nLgorIwordW5pbnN0YWxsOgorCUBpZiB0ZXN0ICEgLWYgVU5JTlNUQUxMOyB0aGVuXAorCQllY2hvICI/Qy1LZXJtaXQgVU5JTlNUQUxMIGRhdGEgZmlsZSBub3QgZm91bmQhIjtcCisJCWV4aXQgMTtcCisJZmk7IFwKKwlYPWBncmVwICdeQ0tWRVI9JyQoQ0tWRVIpJyQkJyAuL1VOSU5TVEFMTCB8fCA6YDtcCisJaWYgdGVzdCAteiAiJCRYIjsgdGhlblwKKwkJZWNobyAiP1VOSU5TVEFMTCBmaWxlIGlzIG5vdCBmb3IgQy1LZXJtaXQgdmVyc2lvbiAkKENLVkVSKSI7XAorCQlleGl0IDI7XAorCWZpO1wKKwlQck4gKCkgeyBlY2hvICIkJCoiOyB9O1wKKwlQckMgKCkgeyBlY2hvICIkJCogXGMiOyB9O1wKKwlSbUYgKCkgeyB0ZXN0IC1mICIkJDEiICYmIHJtIC1mICIkJDEiICYmIGVjaG8gIi5cYyIgJiYgZmxhZz1GIDsgfTtcCisJUm1EICgpIHsgXAorCWRpcj0kJDE7XAorCXdoaWxlIHRlc3QgLWQgIiQkZGlyIjsgZG9cCisJCXJtZGlyICIkJGRpciIgMj4mLSB8fCByZXR1cm4gJiYgZWNobyAiJCRkaXIiICYmIGZsYWc9RDtcCisJCWRpcj1gZWNobyAiJCRkaXIiIHwgc2VkICdzIS9bXi9dKi8qJCQhISdgO1wKKwlkb25lOyBcCisJfTtcCisJRWZNICgpIHsgXAorCWNhc2UgIiQkZmxhZyIgaW5cCisJCWYpIGVjaG8gIi0gTm90aGluZyB0byByZW1vdmUhIjs7XAorCQlkKSBlY2hvICJOb3RoaW5nIHRvIHJlbW92ZSEiOztcCisJCUYpIGVjaG8gIiBkb25lIjs7XAorCQlEKSBlY2hvICJkb25lIjs7XAorCWVzYWM7IFwKKwl9O1wKKwl3aGlsZSByZWFkIEFjdCBBcmdzOyBkb1wKKwkJY2FzZSAkJEFjdCBpblwKKwkJCUVmTSkgRWZNOztcCisJCQlSbUQpIFJtRCAkJEFyZ3M7O1wKKwkJCVJtRikgUm1GICQkQXJnczs7XAorCQkJUHJOKSBQck4gJCRBcmdzOztcCisJCQlQckMpIFByQyAkJEFyZ3M7O1wKKwkJCXNldCkgZXZhbCAkJEFyZ3M7O1wKKwkJZXNhYztcCisJZG9uZSA8IC4vVU5JTlNUQUxMCisKK21ha2V3aGF0OgorCUBlY2hvICdtYWtlIHdoYXQ/ICBZb3UgbXVzdCB0ZWxsIHdoaWNoIHBsYXRmb3JtIHRvIG1ha2UgQy1LZXJtaXQgZm9yLicKKwlAZWNobyBFeGFtcGxlczogbWFrZSBsaW51eCwgbWFrZSBocHV4MTEwMCwgbWFrZSBhaXg0MywgbWFrZSBzb2xhcmlzOC4KKwlAZWNobyBQbGVhc2UgcmVhZCB0aGUgY29tbWVudHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFrZWZpbGUuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBEZXBlbmRlbmNpZXMgU2VjdGlvbjoKKworIyBOb3JtYWwgdmVyc2lvbgorCit3ZXJtaXQ6CWNrY21haS4kKEVYVCkgY2tjbGliLiQoRVhUKSBja3VjbWQuJChFWFQpIGNrdXVzci4kKEVYVCkgY2t1dXMyLiQoRVhUKSBcCisJCWNrdXVzMy4kKEVYVCkgY2t1dXM0LiQoRVhUKSBja3V1czUuJChFWFQpIGNrdXVzNi4kKEVYVCkgXAorCQlja3V1czcuJChFWFQpIGNrdXVzeC4kKEVYVCkgY2t1dXN5LiQoRVhUKSBja2Nwcm8uJChFWFQpIFwKKwkJY2tjZm5zLiQoRVhUKSBja2NmbjIuJChFWFQpIGNrY2ZuMy4kKEVYVCkgY2t1eGxhLiQoRVhUKSBcCisJCWNrdWNvbi4kKEVYVCkgY2t1dGlvLiQoRVhUKSBja3VmaW8uJChFWFQpIGNrdWRpYS4kKEVYVCkgXAorCQlja3VzY3IuJChFWFQpIGNrY25ldC4kKEVYVCkgY2tjdGVsLiQoRVhUKSBja3VzaWcuJChFWFQpIFwKKwkJY2tjdW5pLiQoRVhUKSBja3VwdHkuJChFWFQpIGNrY2Z0cC4kKEVYVCkKKwkkKENDMikgJChMTktGTEFHUykgLW8gd2VybWl0IFwKKwkJY2tjbWFpLiQoRVhUKSBja2NsaWIuJChFWFQpIGNrdXRpby4kKEVYVCkgY2t1ZmlvLiQoRVhUKSBcCisJCWNrY2Zucy4kKEVYVCkgY2tjZm4yLiQoRVhUKSBja2NmbjMuJChFWFQpIGNrdXhsYS4kKEVYVCkgXAorCQlja2Nwcm8uJChFWFQpIGNrdWNtZC4kKEVYVCkgY2t1dXMyLiQoRVhUKSBja3V1czMuJChFWFQpIFwKKwkJY2t1dXM0LiQoRVhUKSBja3V1czUuJChFWFQpIGNrdXVzNi4kKEVYVCkgY2t1dXM3LiQoRVhUKSBcCisJCWNrdXVzeC4kKEVYVCkgY2t1dXN5LiQoRVhUKSBja3V1c3IuJChFWFQpIGNrdWNvbi4kKEVYVCkgXAorCQlja3VkaWEuJChFWFQpIGNrdXNjci4kKEVYVCkgY2tjbmV0LiQoRVhUKSBja2N0ZWwuJChFWFQpIFwKKwkJY2t1c2lnLiQoRVhUKSBja2N1bmkuJChFWFQpIGNrdXB0eS4kKEVYVCkgY2tjZnRwLiQoRVhUKSBcCisJCSQoTElCUykKKworIyBWZXJzaW9uIHdpdGggQ09OTkVDVCBtb2R1bGUgdGhhdCB1c2VzIHNlbGVjdCgpIGluc3RlYWQgb2YgZm9yaygpCisKK3hlcm1pdDoJY2tjbWFpLiQoRVhUKSBja2NsaWIuJChFWFQpIGNrdWNtZC4kKEVYVCkgY2t1dXNyLiQoRVhUKSBja3V1czIuJChFWFQpIFwKKwkJY2t1dXMzLiQoRVhUKSBja3V1czQuJChFWFQpIGNrdXVzNS4kKEVYVCkgY2t1dXM2LiQoRVhUKSBcCisJCWNrdXVzNy4kKEVYVCkgY2t1dXN4LiQoRVhUKSBja3V1c3kuJChFWFQpIGNrY3Byby4kKEVYVCkgXAorCQlja2NmbnMuJChFWFQpIGNrY2ZuMi4kKEVYVCkgY2tjZm4zLiQoRVhUKSBja3V4bGEuJChFWFQpIFwKKwkJY2t1Y25zLiQoRVhUKSBja3V0aW8uJChFWFQpIGNrdWZpby4kKEVYVCkgY2t1ZGlhLiQoRVhUKSBcCisJCWNrdXNjci4kKEVYVCkgY2tjbmV0LiQoRVhUKSBja2N0ZWwuJChFWFQpIGNrdXNpZy4kKEVYVCkgXAorCQlja2N1bmkuJChFWFQpIGNrdXB0eS4kKEVYVCkgY2tjZnRwLiQoRVhUKSBja3VhdGguJChFWFQpIFwKKwkJY2tfY3JwLiQoRVhUKSBja19zc2wuJChFWFQpCisJJChDQzIpICQoTE5LRkxBR1MpIC1vIHdlcm1pdCBcCisJCWNrY21haS4kKEVYVCkgY2tjbGliLiQoRVhUKSBja3V0aW8uJChFWFQpIGNrdWZpby4kKEVYVCkgXAorCQlja2NmbnMuJChFWFQpIGNrY2ZuMi4kKEVYVCkgY2tjZm4zLiQoRVhUKSBja3V4bGEuJChFWFQpIFwKKwkJY2tjcHJvLiQoRVhUKSBja3VjbWQuJChFWFQpIGNrdXVzMi4kKEVYVCkgY2t1dXMzLiQoRVhUKSBcCisJCWNrdXVzNC4kKEVYVCkgY2t1dXM1LiQoRVhUKSBja3V1czYuJChFWFQpIGNrdXVzNy4kKEVYVCkgXAorCQlja3V1c3guJChFWFQpIGNrdXVzeS4kKEVYVCkgY2t1dXNyLiQoRVhUKSBja3VjbnMuJChFWFQpIFwKKwkJY2t1ZGlhLiQoRVhUKSBja3VzY3IuJChFWFQpIGNrY25ldC4kKEVYVCkgY2t1c2lnLiQoRVhUKSBcCisJCWNrY3RlbC4kKEVYVCkgY2tjdW5pLiQoRVhUKSBja3VwdHkuJChFWFQpIGNrY2Z0cC4kKEVYVCkgXAorCQlja3VhdGguJChFWFQpIGNrX2NycC4kKEVYVCkgY2tfc3NsLiQoRVhUKSAkKExJQlMpCisKKyMgTWFsbG9jIERlYnVnZ2luZyB2ZXJzaW9uCisKK21lcm1pdDoJY2tjbWRiLiQoRVhUKSBja2NtYWkuJChFWFQpIGNrY2xpYi4kKEVYVCkgY2t1Y21kLiQoRVhUKSBja3V1c3IuJChFWFQpIFwKKwkJY2t1dXMyLiQoRVhUKSBja3V1czMuJChFWFQpIGNrdXVzNC4kKEVYVCkgY2t1dXM1LiQoRVhUKSBcCisJCWNrdXVzNi4kKEVYVCkgY2t1dXM3LiQoRVhUKSBja3V1c3guJChFWFQpIGNrdXVzeS4kKEVYVCkgXAorCQlja2Nwcm8uJChFWFQpIGNrY2Zucy4kKEVYVCkgY2tjZm4yLiQoRVhUKSBja2NmbjMuJChFWFQpIFwKKwkJY2t1eGxhLiQoRVhUKSBja3Vjb24uJChFWFQpIGNrdXRpby4kKEVYVCkgY2t1ZmlvLiQoRVhUKSBcCisJCWNrdWRpYS4kKEVYVCkgY2t1c2NyLiQoRVhUKSBja2NuZXQuJChFWFQpIGNrY3RlbC4kKEVYVCkgXAorCQlja3VzaWcuJChFWFQpIGNrY3VuaS4kKEVYVCkgY2t1cHR5LiQoRVhUKSBja2NmdHAuJChFWFQpCisJJChDQzIpICQoTE5LRkxBR1MpIC1vIG1lcm1pdCBja2NtZGIuJChFWFQpIGNrY2xpYi4kKEVYVCkgY2tjbWFpLiQoRVhUKVwKKwkJY2t1dGlvLiQoRVhUKSBja3VmaW8uJChFWFQpIGNrY2Zucy4kKEVYVCkgY2tjZm4yLiQoRVhUKSBcCisJCWNrY2ZuMy4kKEVYVCkgY2t1eGxhLiQoRVhUKSBja2Nwcm8uJChFWFQpIGNrdWNtZC4kKEVYVCkgXAorCQlja3V1czIuJChFWFQpIGNrdXVzMy4kKEVYVCkgY2t1dXM0LiQoRVhUKSBja3V1czUuJChFWFQpIFwKKwkJY2t1dXM2LiQoRVhUKSBja3V1czcuJChFWFQpIGNrdXVzeC4kKEVYVCkgY2t1dXN5LiQoRVhUKSBcCisJCWNrdXVzci4kKEVYVCkgY2t1Y29uLiQoRVhUKSBja3VkaWEuJChFWFQpIGNrdXNjci4kKEVYVCkgXAorCQlja2NuZXQuJChFWFQpIGNrY3RlbC4kKEVYVCkgY2t1c2lnLiQoRVhUKSBja2N1bmkuJChFWFQpIFwKKwkJY2t1cHR5LiQoRVhUKSBja2NmdHAuJChFWFQpICQoTElCUykKKworIyBLZXJiZXJpemVkIFZlcnNpb24gLSBTdWJqZWN0IHRvIFVTQSBleHBvcnQgcmVzdHJpY3Rpb25zLgorCisjIE5PVEU6IFdlIGRvbid0IHVzZSB0aGlzIGFueSBtb3JlIC0tIEFzIG9mIDE1IEZlYiAyMDAzLCB0aGUgInhlcm1pdCIKKyMgdGFyZ2V0IGlzIHVzZWQgZm9yIGJvdGggc2VjdXJlIGFuZCByZWd1bGFyIHZlcnNpb24uCisKK2tyYm1pdDoJY2tjbWFpLiQoRVhUKSBja2NsaWIuJChFWFQpIGNrdWNtZC4kKEVYVCkgY2t1dXNyLiQoRVhUKSBja3V1czIuJChFWFQpIFwKKwkJY2t1dXMzLiQoRVhUKSBja3V1czQuJChFWFQpIGNrdXVzNS4kKEVYVCkgY2t1dXM2LiQoRVhUKSBcCisJCWNrdXVzNy4kKEVYVCkgY2t1dXN4LiQoRVhUKSBja3V1c3kuJChFWFQpIGNrY3Byby4kKEVYVCkgXAorCQlja2NmbnMuJChFWFQpIGNrY2ZuMi4kKEVYVCkgY2tjZm4zLiQoRVhUKSBja3V4bGEuJChFWFQpIFwKKwkJY2t1Y25zLiQoRVhUKSBja3V0aW8uJChFWFQpIGNrdWZpby4kKEVYVCkgY2t1ZGlhLiQoRVhUKSBcCisJCWNrdXNjci4kKEVYVCkgY2tjbmV0LiQoRVhUKSBja2N0ZWwuJChFWFQpIGNrdXNpZy4kKEVYVCkgXAorCQlja3VhdGguJChFWFQpIGNrX2NycC4kKEVYVCkgY2tjdW5pLiQoRVhUKSBja3VwdHkuJChFWFQpIFwKKwkJY2tjZnRwLiQoRVhUKSBja19zc2wuJChFWFQpCisJJChDQzIpICQoTE5LRkxBR1MpIC1vIGtyYm1pdCBja2NtYWkuJChFWFQpIGNrY2xpYi4kKEVYVCkgXAorCQlja3V0aW8uJChFWFQpIGNrdWZpby4kKEVYVCkgY2tjZm5zLiQoRVhUKSBja2NmbjIuJChFWFQpIFwKKwkJY2tjZm4zLiQoRVhUKSBja3V4bGEuJChFWFQpIGNrY3Byby4kKEVYVCkgY2t1Y21kLiQoRVhUKSBcCisJCWNrdXVzMi4kKEVYVCkgY2t1dXMzLiQoRVhUKSBja3V1czQuJChFWFQpIGNrdXVzNS4kKEVYVCkgXAorCQlja3V1czYuJChFWFQpIGNrdXVzNy4kKEVYVCkgY2t1dXN4LiQoRVhUKSBja3V1c3kuJChFWFQpIFwKKwkJY2t1dXNyLiQoRVhUKSBja3VjbnMuJChFWFQpIGNrdWRpYS4kKEVYVCkgY2t1c2NyLiQoRVhUKSBcCisJCWNrY25ldC4kKEVYVCkgY2tjdGVsLiQoRVhUKSBja3VzaWcuJChFWFQpIGNrdWF0aC4kKEVYVCkgXAorCQlja19jcnAuJChFWFQpIGNrY3VuaS4kKEVYVCkgY2t1cHR5LiQoRVhUKSBja2NmdHAuJChFWFQpIFwKKwkJY2tfc3NsLiQoRVhUKSAkKExJQlMpCisKK2tyYm1pdC1kZWJ1ZzoJY2tjbWFpLiQoRVhUKSBja2NsaWIuJChFWFQpIGNrdWNtZC4kKEVYVCkgY2t1dXNyLiQoRVhUKSBcCisJCWNrdXVzMi4kKEVYVCkgY2t1dXMzLiQoRVhUKSBja3V1czQuJChFWFQpIGNrdXVzNS4kKEVYVCkgXAorCQlja3V1czYuJChFWFQpIGNrdXVzNy4kKEVYVCkgY2t1dXN4LiQoRVhUKSBja3V1c3kuJChFWFQpIFwKKwkJY2tjcHJvLiQoRVhUKSBja2NmbnMuJChFWFQpIGNrY2ZuMi4kKEVYVCkgY2tjZm4zLiQoRVhUKSBcCisJCWNrdXhsYS4kKEVYVCkgY2t1Y25zLiQoRVhUKSBja3V0aW8uJChFWFQpIGNrdWZpby4kKEVYVCkgXAorCQlja3VkaWEuJChFWFQpIGNrdXNjci4kKEVYVCkgY2tjbmV0LiQoRVhUKSBja2N0ZWwuJChFWFQpIFwKKwkJY2t1c2lnLiQoRVhUKSBja3VhdGguJChFWFQpIGNrX2NycC4kKEVYVCkgY2tjdW5pLiQoRVhUKSBcCisJCWNrdXB0eS4kKEVYVCkgY2tfc3NsLiQoRVhUKSBja2NtZGIuJChFWFQpIGNrY2Z0cC4kKEVYVCkKKwkkKENDMikgJChMTktGTEFHUykgLW8ga3JibWl0IGNrY21kYi4kKEVYVCkgY2tjbWFpLiQoRVhUKSBcCisJCWNrY2xpYi4kKEVYVCkgY2t1dGlvLiQoRVhUKSBja3VmaW8uJChFWFQpIGNrY2Zucy4kKEVYVCkgXAorCQlja2NmbjIuJChFWFQpIGNrY2ZuMy4kKEVYVCkgY2t1eGxhLiQoRVhUKSBja2Nwcm8uJChFWFQpIFwKKwkJY2t1Y21kLiQoRVhUKSBja3V1czIuJChFWFQpIGNrdXVzMy4kKEVYVCkgY2t1dXM0LiQoRVhUKSBcCisJCWNrdXVzNS4kKEVYVCkgY2t1dXM2LiQoRVhUKSBja3V1czcuJChFWFQpIGNrdXVzeC4kKEVYVCkgXAorCQlja3V1c3kuJChFWFQpIGNrdXVzci4kKEVYVCkgY2t1Y25zLiQoRVhUKSBja3VkaWEuJChFWFQpIFwKKwkJY2t1c2NyLiQoRVhUKSBja2NuZXQuJChFWFQpIGNrY3RlbC4kKEVYVCkgY2t1c2lnLiQoRVhUKSBcCisJCWNrdWF0aC4kKEVYVCkgY2tfY3JwLiQoRVhUKSBja2N1bmkuJChFWFQpIGNrdXB0eS4kKEVYVCkgXAorCQlja2NmdHAuJChFWFQpIGNrX3NzbC4kKEVYVCkgJChMSUJTKQorCisjIFNSUChUTSkgVmVyc2lvbiAtIFN1YmplY3QgdG8gVVNBIGV4cG9ydCByZXN0cmljdGlvbnMuCisKK3NycG1pdDoJY2tjbWFpLiQoRVhUKSBja2NsaWIuJChFWFQpIGNrdWNtZC4kKEVYVCkgY2t1dXNyLiQoRVhUKSBja3V1czIuJChFWFQpIFwKKwkJY2t1dXMzLiQoRVhUKSBja3V1czQuJChFWFQpIGNrdXVzNS4kKEVYVCkgY2t1dXM2LiQoRVhUKSBcCisJCWNrdXVzNy4kKEVYVCkgY2t1dXN4LiQoRVhUKSBja3V1c3kuJChFWFQpIGNrY3Byby4kKEVYVCkgXAorCQlja2NmbnMuJChFWFQpIGNrY2ZuMi4kKEVYVCkgY2tjZm4zLiQoRVhUKSBja3V4bGEuJChFWFQpIFwKKwkJY2t1Y25zLiQoRVhUKSBja3V0aW8uJChFWFQpIGNrdWZpby4kKEVYVCkgY2t1ZGlhLiQoRVhUKSBcCisJCWNrdXNjci4kKEVYVCkgY2tjbmV0LiQoRVhUKSBja2N0ZWwuJChFWFQpIGNrdXNpZy4kKEVYVCkgXAorCQlja3VhdGguJChFWFQpIGNrX2NycC4kKEVYVCkgY2tjdW5pLiQoRVhUKSBja3VwdHkuJChFWFQpIFwKKwkJY2tjZnRwLiQoRVhUKSBja19zc2wuJChFWFQpCisJJChDQzIpICQoTE5LRkxBR1MpIC1vIHNycG1pdCBja2NtYWkuJChFWFQpIGNrY2xpYi4kKEVYVCkgXAorCQlja3V0aW8uJChFWFQpIGNrdWZpby4kKEVYVCkgY2tjZm5zLiQoRVhUKSBja2NmbjIuJChFWFQpIFwKKwkJY2tjZm4zLiQoRVhUKSBja3V4bGEuJChFWFQpIGNrY3Byby4kKEVYVCkgY2t1Y21kLiQoRVhUKSBcCisJCWNrdXVzMi4kKEVYVCkgY2t1dXMzLiQoRVhUKSBja3V1czQuJChFWFQpIGNrdXVzNS4kKEVYVCkgXAorCQlja3V1czYuJChFWFQpIGNrdXVzNy4kKEVYVCkgY2t1dXN4LiQoRVhUKSBja3V1c3kuJChFWFQpIFwKKwkJY2t1dXNyLiQoRVhUKSBja3VjbnMuJChFWFQpIGNrdWRpYS4kKEVYVCkgY2t1c2NyLiQoRVhUKSBcCisJCWNrY25ldC4kKEVYVCkgY2tjdGVsLiQoRVhUKSBja3VzaWcuJChFWFQpIGNrdWF0aC4kKEVYVCkgXAorCQlja19jcnAuJChFWFQpIGNrY3VuaS4kKEVYVCkgY2t1cHR5LiQoRVhUKSBja19zc2wuJChFWFQpIFwKKwkJY2tjZnRwLiQoRVhUKSAkKExJQlMpCisKKyMgS2VyYmVyaXplZCBWZXJzaW9uIC0gTm90IHN1YmplY3QgdG8gVVNBIGV4cG9ydCByZXN0cmljdGlvbnMuCisKK2tyYm1pdC1leHBvcnQ6CWNrY21haS4kKEVYVCkgXAorCQlja2NsaWIuJChFWFQpIGNrdWNtZC4kKEVYVCkgY2t1dXNyLiQoRVhUKSBja3V1czIuJChFWFQpIFwKKwkJY2t1dXMzLiQoRVhUKSBja3V1czQuJChFWFQpIGNrdXVzNS4kKEVYVCkgY2t1dXM2LiQoRVhUKSBcCisJCWNrdXVzNy4kKEVYVCkgY2t1dXN4LiQoRVhUKSBja3V1c3kuJChFWFQpIGNrY3Byby4kKEVYVCkgXAorCQlja2NmbnMuJChFWFQpIGNrY2ZuMi4kKEVYVCkgY2tjZm4zLiQoRVhUKSBja3V4bGEuJChFWFQpIFwKKwkJY2t1Y25zLiQoRVhUKSBja3V0aW8uJChFWFQpIGNrdWZpby4kKEVYVCkgY2t1ZGlhLiQoRVhUKSBcCisJCWNrdXNjci4kKEVYVCkgY2tjbmV0LiQoRVhUKSBja2N0ZWwuJChFWFQpIGNrdXNpZy4kKEVYVCkgXAorCQlja3VhdGguJChFWFQpIGNrY3VuaS4kKEVYVCkgY2t1cHR5LiQoRVhUKSBja2NmdHAuJChFWFQpCisJJChDQzIpICQoTE5LRkxBR1MpIC1vIGtyYm1pdC1leHBvcnQgY2tjbWFpLiQoRVhUKSBja2NsaWIuJChFWFQpIFwKKwkJY2t1dGlvLiQoRVhUKSBja3VmaW8uJChFWFQpIGNrY2Zucy4kKEVYVCkgY2tjZm4yLiQoRVhUKSBcCisJCWNrY2ZuMy4kKEVYVCkgY2t1eGxhLiQoRVhUKSBja2Nwcm8uJChFWFQpIGNrdWNtZC4kKEVYVCkgXAorCQlja3V1czIuJChFWFQpIGNrdXVzMy4kKEVYVCkgY2t1dXM0LiQoRVhUKSBja3V1czUuJChFWFQpIFwKKwkJY2t1dXM2LiQoRVhUKSBja3V1czcuJChFWFQpIGNrdXVzeC4kKEVYVCkgY2t1dXN5LiQoRVhUKSBcCisJCWNrdXVzci4kKEVYVCkgY2t1Y25zLiQoRVhUKSBja3VkaWEuJChFWFQpIGNrdXNjci4kKEVYVCkgXAorCQlja2NuZXQuJChFWFQpIGNrY3RlbC4kKEVYVCkgY2t1c2lnLiQoRVhUKSBja3VhdGguJChFWFQpIFwKKwkJY2tjdW5pLiQoRVhUKSBja3VwdHkuJChFWFQpIGNrY2Z0cC4kKEVYVCkgJChMSUJTKQorCisjIFNSUChUTSkgVmVyc2lvbiAtIE5vdCBzdWJqZWN0IHRvIFVTQSBleHBvcnQgcmVzdHJpY3Rpb25zLgorCitzcnBtaXQtZXhwb3J0Oglja2NtYWkuJChFWFQpIFwKKwkJY2tjbGliLiQoRVhUKSBja3VjbWQuJChFWFQpIGNrdXVzci4kKEVYVCkgY2t1dXMyLiQoRVhUKSBcCisJCWNrdXVzMy4kKEVYVCkgY2t1dXM0LiQoRVhUKSBja3V1czUuJChFWFQpIGNrdXVzNi4kKEVYVCkgXAorCQlja3V1czcuJChFWFQpIGNrdXVzeC4kKEVYVCkgY2t1dXN5LiQoRVhUKSBja2Nwcm8uJChFWFQpIFwKKwkJY2tjZm5zLiQoRVhUKSBja2NmbjIuJChFWFQpIGNrY2ZuMy4kKEVYVCkgY2t1eGxhLiQoRVhUKSBcCisJCWNrdWNucy4kKEVYVCkgY2t1dGlvLiQoRVhUKSBja3VmaW8uJChFWFQpIGNrdWRpYS4kKEVYVCkgXAorCQlja3VzY3IuJChFWFQpIGNrY25ldC4kKEVYVCkgY2tjdGVsLiQoRVhUKSBja3VzaWcuJChFWFQpIFwKKwkJY2t1YXRoLiQoRVhUKSBja2N1bmkuJChFWFQpIGNrdXB0eS4kKEVYVCkgY2tjZnRwLiQoRVhUKQorCSQoQ0MyKSAkKExOS0ZMQUdTKSAtbyBzcnBtaXQtZXhwb3J0IGNrY21haS4kKEVYVCkgY2tjbGliLiQoRVhUKSBcCisJCWNrdXRpby4kKEVYVCkgY2t1ZmlvLiQoRVhUKSBja2NmbnMuJChFWFQpIGNrY2ZuMi4kKEVYVCkgXAorCQlja2NmbjMuJChFWFQpIGNrdXhsYS4kKEVYVCkgY2tjcHJvLiQoRVhUKSBja3VjbWQuJChFWFQpIFwKKwkJY2t1dXMyLiQoRVhUKSBja3V1czMuJChFWFQpIGNrdXVzNC4kKEVYVCkgY2t1dXM1LiQoRVhUKSBcCisJCWNrdXVzNi4kKEVYVCkgY2t1dXM3LiQoRVhUKSBja3V1c3guJChFWFQpIGNrdXVzeS4kKEVYVCkgXAorCQlja3V1c3IuJChFWFQpIGNrdWNucy4kKEVYVCkgY2t1ZGlhLiQoRVhUKSBja3VzY3IuJChFWFQpIFwKKwkJY2tjbmV0LiQoRVhUKSBja2N0ZWwuJChFWFQpIGNrdXNpZy4kKEVYVCkgY2t1YXRoLiQoRVhUKSBcCisJCWNrY3VuaS4kKEVYVCkgY2t1cHR5LiQoRVhUKSBja2NmdHAuJChFWFQpICQoTElCUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIG1hbiBwYWdlLi4uCisjCitja3VrZXIubnI6CisJQGVjaG8gVGhpcyB0YXJnZXQgaXMgb2Jzb2xldGUuCisJQGVjaG8gVGhlIGNrdWtlci5uciBmaWxlIG5vIGxvbmdlciBuZWVkcyBhbnkgcHJlcHJvY2Vzc2luZy4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERlcGVuZGVuY2llcyBmb3IgZWFjaCBtb2R1bGUuLi4KKyMKK2NrY21haS4kKEVYVCk6IGNrY21haS5jIGNrY2tlci5oIGNrY2RlYi5oIGNrY3N5bS5oIGNrY2FzYy5oIGNrY25ldC5oIGNrY3NpZy5oIFwKKwkJY2t1dXNyLmggY2tjdGVsLmggY2tjbGliLmgKKworY2tjbGliLiQoRVhUKTogY2tjbGliLmMgY2tjbGliLmggY2tjZGViLmggY2tjYXNjLmggY2tjc3ltLmgKKworY2tjcHJvLiQoRVhUKTogY2tjcHJvLmMgY2tja2VyLmggY2tjZGViLmggY2tjc3ltLmggY2tjYXNjLmggY2tjbGliLmgKKworY2tjcHJvLmM6IGNrY3Byby53IHdhcnQgY2tjZGViLmggY2tjc3ltLmggY2tjYXNjLmggY2tja2VyLmggY2tjbmV0LmggY2tjdGVsLmggXAorCSBja2NsaWIuaAorCS4vd2FydCBja2Nwcm8udyBja2Nwcm8uYworCitja2NmbnMuJChFWFQpOiBja2NmbnMuYyBja2NrZXIuaCBja2NkZWIuaCBja2NzeW0uaCBja2Nhc2MuaCBja2N4bGEuaCBja2N1bmkuaCBcCisJCWNrdXhsYS5oIGNrY2xpYi5oIGNrY25ldC5oCisKK2NrY2ZuMi4kKEVYVCk6IGNrY2ZuMi5jIGNrY2tlci5oIGNrY2RlYi5oIGNrY3N5bS5oIGNrY2FzYy5oIGNrY3hsYS5oIFwKKwkJY2t1eGxhLmggY2tjdGVsLmggY2tjbGliLmggY2tjbmV0LmggY2tjdW5pLmgKKworY2tjZm4zLiQoRVhUKTogY2tjZm4zLmMgY2tja2VyLmggY2tjZGViLmggY2tjc3ltLmggY2tjYXNjLmggY2tjeGxhLmggXAorCQlja3V4bGEuaCBja2NsaWIuaCBja2N1bmkuaAorCitja3V4bGEuJChFWFQpOiBja3V4bGEuYyBja2NrZXIuaCBja2NzeW0uaCBja2NkZWIuaCBja2N4bGEuaCBja3V4bGEuaCBja2NsaWIuaCBcCisJCSBja2N1bmkuaAorCitja2N1bmkuJChFWFQpOiBja2N1bmkuYyBja2NkZWIuaCBja2NrZXIuaCBja3VjbWQuaCBja2N1bmkuaCBja2N4bGEuaCBja3V4bGEuaAorCitja3V1c3IuJChFWFQpOiBja3V1c3IuYyBja3VjbWQuaCBja2NrZXIuaCBja3V1c3IuaCBja2NzeW0uaCBja2NkZWIuaCBja2N4bGEuaCBcCisJCWNrdXhsYS5oIGNrY2FzYy5oIGNrY25ldC5oIGNrY3RlbC5oIGNrY2xpYi5oIGNrY3VuaS5oCisKK2NrdXVzMi4kKEVYVCk6IGNrdXVzMi5jIGNrdWNtZC5oIGNrY2tlci5oIGNrdXVzci5oIGNrY2RlYi5oIGNrY3hsYS5oIGNrdXhsYS5oIFwKKwkJY2tjYXNjLmggY2tjbmV0LmggY2tjc3ltLmggY2tjdGVsLmggY2tjbGliLmggY2tjdW5pLmgKKworY2t1dXMzLiQoRVhUKTogY2t1dXMzLmMgY2t1Y21kLmggY2tja2VyLmggY2t1dXNyLmggY2tjZGViLmggY2tjeGxhLmggY2t1eGxhLmggXAorCQlja2Nhc2MuaCBja2NuZXQuaCBja2NzeW0uaCBja2N0ZWwuaCBja2NsaWIuaCBja2N1bmkuaAorCitja3V1czQuJChFWFQpOiBja3V1czQuYyBja3VjbWQuaCBja2NrZXIuaCBja3V1c3IuaCBja2NkZWIuaCBja2N4bGEuaCBja3V4bGEuaCBcCisJCWNrY2FzYy5oIGNrY25ldC5oIGNrdXZlci5oIGNrY3N5bS5oIGNrY3RlbC5oIGNrY2xpYi5oIGNrY3VuaS5oCisKK2NrdXVzNS4kKEVYVCk6IGNrdXVzNS5jIGNrdWNtZC5oIGNrY2tlci5oIGNrdXVzci5oIGNrY2RlYi5oIGNrY2FzYy5oIGNrY25ldC5oIFwKKwkJIGNrY3N5bS5oIGNrY3RlbC5oIGNrY2xpYi5oIGNrY3hsYS5oIGNrdXhsYS5oIGNrY3VuaS5oCisKK2NrdXVzNi4kKEVYVCk6IGNrdXVzNi5jIGNrdWNtZC5oIGNrY2tlci5oIGNrdXVzci5oIGNrY2RlYi5oIGNrY2FzYy5oIGNrY25ldC5oIFwKKwkJIGNrY3N5bS5oIGNrY3RlbC5oIGNrY2xpYi5oCisKK2NrdXVzNy4kKEVYVCk6IGNrdXVzNy5jIGNrdWNtZC5oIGNrY2tlci5oIGNrdXVzci5oIGNrY2RlYi5oIGNrY3hsYS5oIGNrdXhsYS5oIFwKKwkJY2tjYXNjLmggY2tjbmV0LmggY2tjc3ltLmggY2tjdGVsLmggY2tjbGliLmggY2tjdW5pLmgKKworY2t1dXN4LiQoRVhUKTogY2t1dXN4LmMgY2tja2VyLmggY2t1dXNyLmggY2tjZGViLmggY2tjYXNjLmggY2tjc3ltLmggXAorCQlja2NzaWcuaCBja2NuZXQuaCBja2N0ZWwuaCBja2NsaWIuaCBja2N4bGEuaCBja3V4bGEuaCBja2N1bmkuaAorCitja3V1c3kuJChFWFQpOiBja3V1c3kuYyBja2NrZXIuaCBja2NkZWIuaCBja2Nhc2MuaCBja2NuZXQuaCBja2NzeW0uaCBja2N0ZWwuaCBcCisJCSBja2NsaWIuaAorCitja3VjbWQuJChFWFQpOiBja3VjbWQuYyBja2Nhc2MuaCBja3VjbWQuaCBja2NkZWIuaCBja2NzeW0uaCBja2N0ZWwuaCBja2NsaWIuaAorCitja3VmaW8uJChFWFQpOiBja3VmaW8uYyBja2NkZWIuaCBja3V2ZXIuaCBja2NzeW0uaCBja2NsaWIuaCBcCisJCWNrY3hsYS5oIGNrdXhsYS5oIGNrY3VuaS5oCisKK2NrdXRpby4kKEVYVCk6IGNrdXRpby5jIGNrY2RlYi5oIGNrY25ldC5oIGNrdXZlci5oIGNrY3N5bS5oIGNrY3RlbC5oIGNrY2xpYi5oCisKK2NrdWNvbi4kKEVYVCk6IGNrdWNvbi5jIGNrY2tlci5oIGNrY2RlYi5oIGNrY2FzYy5oIGNrY25ldC5oIGNrY3N5bS5oIGNrY3RlbC5oIFwKKwkJIGNrY2xpYi5oCisKK2NrdWNucy4kKEVYVCk6IGNrdWNucy5jIGNrY2tlci5oIGNrY2RlYi5oIGNrY2FzYy5oIGNrY25ldC5oIGNrY3N5bS5oIGNrY3RlbC5oIFwKKwkJIGNrY2xpYi5oIGNrY3hsYS5oIGNrdXhsYS5oIGNrY3VuaS5oCisKK2NrY25ldC4kKEVYVCk6IGNrY25ldC5jIGNrY2RlYi5oIGNrY2tlci5oIGNrY25ldC5oIGNrY3N5bS5oIGNrY3NpZy5oIGNrY3RlbC5oIFwKKwkJIGNrY2xpYi5oCisKK2NrY3RlbC4kKEVYVCk6IGNrY3N5bS5oIGNrY2RlYi5oIGNrY2tlci5oIGNrY25ldC5oIGNrY3RlbC5oIGNrY2xpYi5oCisKK3dhcnQ6IGNrd2FydC4kKEVYVCkKKwkkKENDKSAkKExOS0ZMQUdTKSAtbyB3YXJ0IGNrd2FydC4kKEVYVCkgJChMSUJTKQorCitja2NtZGIuJChFWFQpOiBja2NtZGIuYyBja2NkZWIuaCBja2NzeW0uaCBja2NsaWIuaAorCitja3dhcnQuJChFWFQpOiBja3dhcnQuYworCitja3VkaWEuJChFWFQpOiBja3VkaWEuYyBja2NrZXIuaCBja2NkZWIuaCBja3VjbWQuaCBja2Nhc2MuaCBja2NzeW0uaCBja2NzaWcuaCBcCisJCWNrY25ldC5oIGNrY3RlbC5oIGNrY2xpYi5oCisKK2NrdXNjci4kKEVYVCk6IGNrdXNjci5jIGNrY2tlci5oIGNrY2RlYi5oIGNrY2FzYy5oIGNrY3N5bS5oIGNrY3NpZy5oIFwKKwkJY2tjbmV0LmggY2tjdGVsLmggY2tjbGliLmgKKworY2t1c2lnLiQoRVhUKTogY2t1c2lnLmMgY2tjYXNjLmggY2tjZGViLmggY2tja2VyLmggY2tjbmV0LmggY2t1dXNyLmggXAorCQlja2NzaWcuaCBja2N0ZWwuaCBja2NsaWIuaAorCitja2NmdHAuJChFWFQpOiBja2NmdHAuYyBja2NkZWIuaCBja2Nhc2MuaCBja2NrZXIuaCBja3VjbWQuaCBja3V1c3IuaCBcCisJCWNrY25ldC5oIGNrY3RlbC5oIGNrY3hsYS5oIGNrdXhsYS5oIGNrY3VuaS5oCisKK2NrdXB0eS4kKEVYVCk6IGNrdXB0eS5jIGNrdXB0eS5oIGNrY2RlYi5oCisKK2NrdWF0aC4kKEVYVCk6IGNrdWF0aC5jIGNrY2RlYi5oIGNrdWNtZC5oIGNrdWF0aC5oIGNrdWF0Mi5oIGNrY3RlbC5oIFwKKwkJIGNrY2xpYi5oIGNrY25ldC5oCisKK2NrX2NycC4kKEVYVCk6IGNrX2NycC5jIGNrY2RlYi5oIGNrY25ldC5oIGNrdWF0aC5oIGNrY2xpYi5oCisKK2NrX3NzbC4kKEVYVCk6IGNrX3NzbC5jIGNrY2RlYi5oIGNrdWNtZC5oIGNrdWF0aC5oIGNrdWF0Mi5oIGNrY3RlbC5oIFwKKwkJIGNrY2xpYi5oIGNrX3NzbC5oCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBFbnRyaWVzIHRvIG1ha2UgQy1LZXJtaXQgZm9yIHNwZWNpZmljIHN5c3RlbXMuCisjCisjIFB1dCB0aGUgb25lcyB0aGF0IG5lZWQgc2hvcnQgbWFrZWZpbGVzIGZpcnN0LgorCisjQXBvbGxvIEFlZ2lzIDkueC4gIEluY2x1ZGVzIFRDUC9JUCBzdXBwb3J0LgorI1lvdSBjYW4gYWxzbyBhZGQgcHJvY2Vzc29yLWRlcGVuZGVudCBvcHRpbWl6YXRpb24gc3dpdGNoZXMgbGlrZSAtTTU3MC4KK2FlZ2lzOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQXBvbGxvIEFlZ2lzIDkueC4uLgorCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENCAtRFRDUFNPQ0tFVCAtRE5PQ1NFVFMgLURDS19DVVJTRVMgLU8gJChLRkxBR1MpIiBcCisJIkxJQlMgPSAtbGN1cnNlcyAtbHRlcm1jYXAiCisKKyNBcHBsZSBNYWMgSUksIEEvVVggcHJlLTMuMAorI1dhcm5pbmcsIGlmICJzZW5kICoiIGRvZXNuJ3Qgd29yaywgdHJ5IHRoZSBhdXh1ZnMgbWFrZWZpbGUgZW50cnkgYmVsb3cuCithdXg6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBNYWNpbnRvc2ggQS9VWC4uLgorCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFVWCAtRFRDUFNPQ0tFVCAkKEtGTEFHUykgLWkgLU8iICJMTktGTEFHUyA9IC1pIgorCisjQXBwbGUgTWFjIElJLCBBL1VYIHByZS0zLjAsIGNvbXBpbGVkIHdpdGggZ2NjCithdXhnY2M6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBNYWNpbnRvc2ggQS9VWC4uLgorCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFVWCAtRFRDUFNPQ0tFVCAtdHJhZGl0aW9uYWwgJChLRkxBR1MpIC1pIC1PIiBcCisJIkxOS0ZMQUdTID0gIiAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiCisKKyNBcHBsZSBNYWMgSUksIEEvVVgsIHByZS0zLjAsIGJ1dCB3aXRoIHVmcyBmaWxlIHZvbHVtZXMsIHVzZXMgPGRpcmVudC5oPi4KK2F1eHVmczoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE1hY2ludG9zaCBBL1VYLi4uCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EQVVYIC1EVENQU09DS0VUIC1ERElSRU5UICQoS0ZMQUdTKSAtaSAtTyIgIkxOS0ZMQUdTID0gLWkiCisKKyNBcHBsZSBNYWMgSUksIEEvVVggMy4wLCBjb21waWxlZCB3aXRoIGdjYworYXV4M2djYzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE1hY2ludG9zaCBBL1VYIDMuMC4uLgorCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFVWCAtREhEQlVVQ1AgLURMRkRFVk5PIC1EVENQU09DS0VUIC1ERElSRU5UICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1zIiAiTElCUyA9ICQoTElCUykiIFwKKwkiQ0M9Z2NjIC1waXBlIC10cmFkaXRpb25hbCIgIkNDMj1nY2MgLXBpcGUgLXRyYWRpdGlvbmFsIgorCisjQXBwbGUgTWFjIElJLCBBL1VYIDMuMCwgY29tcGlsZWQgd2l0aCBnY2MsIHVzZXMgY3Vyc2VzCithdXgzY2djYzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE1hY2ludG9zaCBBL1VYIDMuMC4uLgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgQ0M9JChDQykgQ0MyPSQoQ0MyKSBhdXgzZ2NjIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPSQoS0ZMQUdTKSAtRENLX0NVUlNFUyIgIkxJQlMgPSAtbGN1cnNlcyAkKExJQlMpIgorCisjIFRlbm9uIE1hY2hUZW4sIHRlc3RlZCBvbiBBcHBsZSBQb3dlcmJvb2sgd2l0aCBNYWNoVGVuIDIuMS4xLkQuCisjIE5PVEU6IFRoaXMgZG9lc24ndCBkbyBhbnl0aGluZyBhYm91dCBVVUNQLiAgSXQgb25seSB3b3JrcyBpZiAvdXNyL3Nwb29sL3V1Y3AKKyMgaGFzIHBlcm1pc3Npb24gb2YgNzc3LCBhbmQgZGlhbG91dCBkZXZpY2UgaXMgd29ybGQgcmVhZC93cml0ZWFibGUuCittYWNodGVuOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTWFjaFRlbi4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDMgLURUQ1BTT0NLRVQgLURTSUdfViAtRE5ER1BXTkFNIC1EQ0tfQ1VSU0VTIC1PIFwKKwkkKEtGTEFHUykiICAiTElCUz0tbGN1cnNlcyAtbHRlcm1jYXAiCisKKyNCZWxsIExhYnMgUmVzZWFyY2ggVU5JWCBWMTAKKyNDYW4ndCBhZGQgVENQL0lQIGJlY2F1c2UgdGhlcmUgaXMgbm8gc29ja2V0cyBsaWJyYXJ5LiAgSXQgd291bGQgaGF2ZSB0bworI2JlIGRvbmUgdXNpbmcgc3RyZWFtcywgYnV0IHRoZXJlIGlzIG5vIGNvZGUgaW4gQy1LZXJtaXQgZm9yIHRoYXQuCisjUmVtb3ZlIC1ETk9KQyBpZiBkZXNpcmVkIChpZiB5b3VyIHN5c3RlbSBoYXMgY3NoLCBrc2gsIG9yIGJhc2gpLgorYmVsbHYxMDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEJlbGwgTGFicyBSZXNlYXJjaCBVTklYIFYxMC4uLgorCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSBcCisJIkNGTEFHUz0gLURCRUxMVjEwIC1EQlNENCAtRE5ESVIgLUROT0pDIC1ETk9TWVNJT0NUTEggLUROT1NFVFJFVSBcCisJLUROT0NTRVRTIC1NSU5JRElBTCAkKEtGTEFHUykiCisKKyMgV0FSTklORzogVGhlIGVhcmx5IEJTRCBlbnRyaWVzIGRvIG5vdCBidWlsZCBpbiB2ZXJzaW9uIDcuMCB3aXRoIHRoZSBzdG9jaworIyBCU0QgY29tcGlsZXI6ICJUb28gbWFueSBkZWZpbmVzIi4gIFVubGVzcyB5b3UgY2FuIHJlYnVpbGQgY3BwIHRvIGhhdmUgbW9yZQorIyBzcGFjZSBmb3IgZGVmaW5lcywgdGhlc2UgYnVpbGRzIG11c3QgYmUgYWNjb21wbGlzaGVkIGJ5OgorIyBjb3B5aW5nIHRoZSAvdXNyL2luY2x1ZGUgdHJlZSB0byBzb21lcGxhY2UgZWxzZSwgcHJlcHJvY2Vzc2luZyB0aGVyZSB3aXRoIGNjCisjIC1FIC1JLi9pbmNsdWRlIG9yIHdoYXRldmVyIChwbHVzIGFsbCB0aGUgc2FtZSAtRCdzLCBhZGRpbmcgYW55IG5lY2Vzc2FyeQorIyAtVS8tRCB0byBvdmVycmlkZSB0aGUgYXJjaGl0ZWN0dXJlKSksIHJlbmFtaW5nIHRoZSB0aGUgcmVzdWx0aW5nIGZpbGVzIGJhY2sKKyMgdG8gdGhlaXIgb3JpZ2luYWwgbmFtZXMsIGJyaW5naW5nIHRoZW0gYmFjayB0byB0aGUgb3JpZ2luYWwgQlNEIHN5c3RlbSwgYW5kCisjIHJ1bm5pbmcgdGhlIG1ha2UgdGFyZ2V0IHRoZXJlLiAgVGhpcyB0ZWNobmlxdWUgd2FzIHVzZWQgZm9yIDQuMiBhbmQgNC4zIEJTRAorIyBvbiBhIFZBWCBpbiBDLUtlcm1pdCA3LjAgKGxhdGVyLCBjcHAgb24gdGhhdCBtYWNoaW5lIHdhcyByZWJ1aWx0IHRvIGFsbG93CisjIG1vcmUgc3ltYm9scywgc28gdGhlIEMtS2VybWl0IDguMCBidWlsZCBwcm9jZWVkcyBub3JtYWxseSkuCisKKyNCZXJrZWxleSBVbml4IDQuMQorYnNkNDE6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciA0LjFCU0QuLi4KKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQtJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDEiICJMSUJTID0gLWxqb2JzIgorCisjQmVya2VsZXkgNC4yLCA0LjMsIGFsc28gVWx0cml4LTMyIDEueCwgMi54LCAzLngsIG1hbnkgb3RoZXJzCisjIEFkZCAtTywgLXMsIGV0YywgaWYgdGhleSB3b3JrLgorIyBJZiB5b3UgaGF2ZSBhIHZlcnNpb24gb2YgQlNEIGJ1dCBzaWduYWwoKSBpcyB2b2lkIHJhdGhlciB0aGFuIGludCwKKyMgIm1ha2UgYnNkIEtGTEFHUz0tRFNJR19WIi4KK2JzZDQyOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgNC4yQlNELi4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VULSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQgLURUQ1BTT0NLRVQgLUROT1JFQUxQQVRIIC1ETk9USU1FSCAtRE5PSUtTRCBcCisJLURDS19DVVJTRVMgLURTWVNUSU1FQkggLUROT1BVVEVOViAtRE5PQU5TSSAtREJJR0JVRk9LIC1EQlNENDJIQUNLIFwKKwkkKEtGTEFHUykiICJMSUJTPS1sY3Vyc2VzIC1sdGVybWNhcCAkKExJQlMpIgorCitic2Q6CisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIGJzZDQyIEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfQorCisjQmVya2VsZXkgVW5peCA0LjIgb3IgNC4zIHdpdGggSG9uZXlEYW5CZXIgVVVDUAorYnNkaGRiOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgNC4yQlNEIHdpdGggSERCIFVVQ1AuLi4KKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgYnNkIEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSBcCisJIktGTEFHUz0gLURIREJVVUNQICQoS0ZMQUdTKSIKKworI0JlcmtlbGV5IFVuaXggNC4zIHdpdGggYWN1Y250cmwgcHJvZ3JhbSwgY3Vyc2VzLCBUQ1AvSVAgaW5jbHVkZWQuCitic2Q0MzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIDQuM0JTRC4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0IC1EQlNENDMgLURUQ1BTT0NLRVQgLUROT1JFQUxQQVRIIC1ETk9USU1FSCAtRE5PSUtTRCBcCisJLURDS19DVVJTRVMgLURBQ1VDTlRSTCAtRFNZU1RJTUVCSCAtRE5PUFVURU5WIC1ETk9BTlNJIC1EQklHQlVGT0sgXAorCS1EQlNENDJIQUNLICQoS0ZMQUdTKSIgIkxJQlM9LWxjdXJzZXMgLWx0ZXJtY2FwICQoTElCUykiCisKKyM0LjNCU0QsIGN1cnNlcyBleGNsdWRlZAorYnNkNDNuYzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIDQuM0JTRC4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0IC1EQlNENDMgLURUQ1BTT0NLRVQgLUROT1JFQUxQQVRIIC1ETk9USU1FSCBcCisJLURBQ1VDTlRSTCAtRFNZU1RJTUVCSCAtRE5PSUtTRCAtRE5PUFVURU5WIC1ETk9BTlNJIC1EQklHQlVGT0sgXAorCS1EQlNENDJIQUNLICQoS0ZMQUdTKSIgIkxJQlM9JChMSUJTKSIKKworIzQuM0JTRCwgVENQL0lQIGV4Y2x1ZGVkLgorYnNkNDNub25ldDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIDQuM0JTRCArIGN1cnNlcy4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0IC1EQlNENDMgLURUQ1BTT0NLRVQgLUROT1JFQUxQQVRIIC1ETk9USU1FSCAtRE5PSUtTRCBcCisJLURDS19DVVJTRVMgLURBQ1VDTlRSTCAtRFNZU1RJTUVCSCAtRE5PUFVURU5WIC1ETk9BTlNJIC1EQklHQlVGT0sgXAorCS1EQlNENDJIQUNLIC1ETk9ORVQgJChLRkxBR1MpIiAiTElCUz0tbGN1cnNlcyAtbHRlcm1jYXAgJChMSUJTKSIKKworI0JlcmtlbGV5IFVuaXggNC4yIG9yIDQuMyB3aXRoIGxvY2sgZGlyZWN0b3J5IC91c3Ivc3Bvb2wvdXVjcC9MQ0svTENLLi50dHl4eCwKKyNidXQgd2l0aG91dCBhY3VjbnRybCBwcm9ncmFtCitic2RsY2s6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciA0LjJCU0QsIC91c3Ivc3Bvb2wvdXVjcC9MQ0svLi4uCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIGJzZCBLVEFSR0VUPSQke0tUQVJHRVQtJChAKX0gXAorCSJLRkxBR1M9IC1ETENLRElSICQoS0ZMQUdTKSIKKworI0JlcmtlbGV5IFVOSVggNC40LUxpdGUsIDQuNC1FbmN1bWJlcmVkLCBOZXQvMiwgZXRjIChQb3N0LVJlbm8pLAorI3dpdGggVENQL0lQIG5ldHdvcmtpbmcuICBUaGlzIHdhcyB0aGUgYmFzaXMgZm9yIEZyZWVCU0QsIE5ldEJTRCwgT3BlbkJTRCwKKyNCU0RJLCBCU0QvT1MsIGFuZCBNYWMgT1MgWCAoZWFjaCBvZiB3aGljaCBoYXMgaXRzIG93biBzZXQgb2YgdGFyZ2V0cyB0aGF0CisjYXJlIG5ld2VyIHRoYW4gdGhpcyBvbmUpLgorIworI05PVEU6IFRoaXMgaXMgbm90IGEgcHVyZSBQT1NJWCBjb25maWd1cmF0aW9uLiAgVXNpbmcgLURQT1NJWCBpbnN0ZWFkIG9mCisjIC1EQlNENDQgcHJldmVudHMgYW55IGtpbmQgb2YgZGlyZWN0b3J5LXJlYWRpbmcgKGZvciB3aWxkY2FyZCBleHBhbnNpb24pLAorI2FuZCBkaXNhbGxvd3MgdXNlIG9mIEVOT1RDT05OIHN5bWJvbCBmb3IgZGV0ZWN0aW5nIGJyb2tlbiBuZXR3b3JrCisjY29ubmVjdGlvbnMsIGFuZCBkaXNhbGxvd3MgUlRTL0NUUyBmbG93IGNvbnRyb2wsIGFuZCB3b3VsZCBhbHNvIHJlcXVpcmUKKyNkZWZpbml0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZSBVVUNQIGxvY2tmaWxlIGNvbnZlbnRpb24uCisjRG8gbm90IGFkZCAtRENLX1BPU0lYX1NJRyB3aXRob3V0IHJlYWRpbmcgPHNpZ25hbC5oPiBmaXJzdCEgIEZvciBleGFtcGxlLAorI3NpZ3NldGptcCgpLCBldGMsIHRlbmQgdG8gYmUgZGVmaW5lZCBidXQgbm90IGltcGxlbWVudGVkLgorIworI05PVEU6IG9yaWdpbmFsbHkgY3J5cHQgd2FzIGluIGxpYmMgLSBsYXRlciBpdCB3YXMgdW5idW5kbGVkLgorI1JlbW92ZSB0aGUgTElCUyBjbGF1c2UgdG8gYnVpbGQgb24gYW4gZWFybHkgNC40QlNEIHBsYXRmb3JtLgorIworYnNkNDQ6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciA0LjRCU0QuLi4KKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDQgLURUQ1BTT0NLRVQgJChLRkxBR1MpIC1PIiAiTElCUz0tbGNyeXB0IgorCisjQmVya2VsZXkgVU5JWCA0LjQsIGFzIGFib3ZlLCBidXQgd2l0aCBjdXJzZXMgZm9yIGZ1bGxzY3JlZW4gZGlzcGxheQorI1BsZWFzZSByZWFkIG5vdGVzIGZvciBic2Q0NCBlbnRyeSBqdXN0IGFib3ZlLgorIyBOT1RFOiBUaGlzIG9uZSBkdW1wZWQgY29yZSBvbiB0aGUgcmVhbCA0LjRCU0QgZGV2ZWxvcG1lbnQgc3lzdGVtIGF0CisjIFVDIEJlcmtlbGV5IChhbiBIUC05MDAwLzMwMCksIHNvIHRoZSBuby1jdXJzZXMgdmVyc2lvbiB3YXMgdXNlZAorIyBmb3IgdGhhdCBvbmUsIHdoaWNoIHdhcyB1bnBsdWdnZWQgeWVhcnMgYWdvLgorYnNkNDRjOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgNC40QlNEIHdpdGggY3Vyc2VzLi4uCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQ0IC1EQ0tfQ1VSU0VTIC1EVENQU09DS0VUICQoS0ZMQUdTKSAtTyIgXAorCSJMSUJTPSAtbGN1cnNlcyAtbHRlcm1jYXAgLWxjcnlwdCAkKExJQlMpIgorCisjRm9yIEZyZWVCU0QgMS54LgorZnJlZWJzZDE6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRnJlZUJTRC4uLicKKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDQgLURDS19DVVJTRVMgLURUQ1BTT0NLRVQgLUROT0NPVEZNQyAtZnVuc2lnbmVkLWNoYXIgXAorCS1ERk5GTE9BVCAtRE5PSFRFUk1DQVAgLUROT1JFQUxQQVRIIC1ETk9TWVNDT05GICQoS0ZMQUdTKSAtTyAtcGlwZSIgXAorCSJMSUJTPSAtbGN1cnNlcyAtbHRlcm1jYXAgLWxtICQoTElCUykiCisKKyNGcmVlQlNEIDIueCB3aXRoIG5jdXJzZXMKK2ZyZWVic2QyOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEZyZWVCU0QgMi54IHdpdGggbmN1cnNlcy4uLicKKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDQgLURDS19OQ1VSU0VTIC1EVENQU09DS0VUIC1ETk9DT1RGTUMgLURVU0VfU1RSRVJST1IgXAorCS1EVFBVVFNBUkdUWVBFPWludCAtRFRQVVRTQVJHMUNPTlNUIC1ERlJFRUJTRDIgLWZ1bnNpZ25lZC1jaGFyIFwKKwktREZORkxPQVQgJChLRkxBR1MpIC1PIC1waXBlIiBcCisJIkxJQlM9IC1sbmN1cnNlcyAtbHRlcm1saWIgLWxjcnlwdCAtbG0gJChMSUJTKSIKKworI0ZvciBGcmVlQlNEIDIueCAtLSBVc2VzIGN1cnNlcyByYXRoZXIgdGhhbiBuY3Vyc2VzCitmcmVlYnNkMmM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRnJlZUJTRCAyLnggd2l0aCBjdXJzZXMuLi4nCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQ0IC1EQ0tfQ1VSU0VTIC1EVENQU09DS0VUIC1ETk9DT1RGTUMgLURVU0VfU1RSRVJST1IgXAorCS1EVFBVVFNBUkdUWVBFPWludCAtRFRQVVRTQVJHMUNPTlNUIC1ERlJFRUJTRDIgLURGTkZMT0FUIFwKKwktZnVuc2lnbmVkLWNoYXIgJChLRkxBR1MpIC1PIC1waXBlIiBcCisJIkxJQlM9IC1sY3Vyc2VzIC1sdGVybWxpYiAtbGNyeXB0IC1sbSAkKExJQlMpIgorCisjRnJlZUJTRCAzLnggd2l0aCBuY3Vyc2VzIGFuZCB1dV9sb2NrKCkKKyMoTm90ZTogdXVfbG9jaygpIGdvZXMgYmFjayB0byAyLjIuMiwgYnV0IG5vdCBuZWNlc3NhcmlseSAyLjApCitmcmVlYnNkMzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBGcmVlQlNEIDMueCB3aXRoIG5jdXJzZXMuLi4nCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQ0IC1EQ0tfTkNVUlNFUyAtRFRDUFNPQ0tFVCAtRE5PQ09URk1DIC1mdW5zaWduZWQtY2hhciBcCisJLURUUFVUU0FSR1RZUEU9aW50IC1EVVNFX1NUUkVSUk9SIC1ERlJFRUJTRDMgLURVU0VfVVVfTE9DSyAtREZORkxPQVQgXAorCSQoS0ZMQUdTKSAtTyAtcGlwZSIgXAorCSJMSUJTPSAtbG5jdXJzZXMgLWxjcnlwdCAtbHV0aWwgLWxtICQoTElCUykiCisKKyNBcyBhYm92ZSBidXQgd2l0aCBjdXJzZXMgcmF0aGVyIHRoYW4gbmN1cnNlcy4KK2ZyZWVic2QzYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBGcmVlQlNEIDMueCB3aXRoIGN1cnNlcy4uLicKKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDQgLURDS19DVVJTRVMgLURUQ1BTT0NLRVQgLUROT0NPVEZNQyAtRFVTRV9VVV9MT0NLIFwKKwktRFRQVVRTQVJHVFlQRT1pbnQgLURVU0VfU1RSRVJST1IgLURGUkVFQlNEMyAkKEtGTEFHUykgLURGTkZMT0FUIFwKKwktZnVuc2lnbmVkLWNoYXIgLXBpcGUgLU8iIFwKKwkiTElCUz0gLWxjdXJzZXMgLWxjcnlwdCAtbHV0aWwgLWxtICQoTElCUykiCisKKyNGcmVlQlNEIDQuMCB3aXRoIG5jdXJzZXMgYW5kIHV1X2xvY2soKS4gIE5vdGUgLSB0aGVyZSBpcyBubyBjdXJzZXMgaW4gNC4wLgorI25jdXJzZXMgNS4wIGlzIGJyb2tlbiByZXF1aXJpbmcgdXMgdG8gd29yayBhcm91bmQgd2l0aCBzZXRidWYoKS4KK2ZyZWVic2Q0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEZyZWVCU0QgNC54IHdpdGggbmN1cnNlcy4uLicKKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDQgLURDS19OQ1VSU0VTIC1EVENQU09DS0VUIC1ETk9DT1RGTUMgLURGTkZMT0FUIFwKKwktZnVuc2lnbmVkLWNoYXIgLURUUFVUU0FSR1RZUEU9aW50IC1EVVNFX1NUUkVSUk9SIC1ERlJFRUJTRDQgXAorCS1ETk9OT1NFVEJVRiAtRFVTRV9VVV9MT0NLICQoS0ZMQUdTKSAtTyAtcGlwZSIgXAorCSJMSUJTPSAtbG5jdXJzZXMgLWxjcnlwdCAtbHV0aWwgLWxtICQoTElCUykiCisKKyNGcmVlQlNEIDQuMSwgYXMgYWJvdmUgYnV0IHdpdGhvdXQgdGhlIE5PTk9TRVRCVUYgaGFjayBhbmQgd2l0aCBDS19ORVdURVJNLgorI1RoaXMgd29ya3Mgd2l0aCBuY3Vyc2VzIDUuMS4KK2ZyZWVic2Q0MToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBGcmVlQlNEIDQuMSB3aXRoIG5jdXJzZXMuLi4nCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQ0IC1EQ0tfTkNVUlNFUyAtRENLX05FV1RFUk0gLURUQ1BTT0NLRVQgLUROT0NPVEZNQyBcCisJLURGUkVFQlNENCAtREZSRUVCU0Q0MSAtRFVTRV9VVV9MT0NLIC1ERk5GTE9BVCBcCisJLWZ1bnNpZ25lZC1jaGFyIC1EVFBVVFNBUkdUWVBFPWludCAtRFVTRV9TVFJFUlJPUiAkKEtGTEFHUykgLU8gLXBpcGUiIFwKKwkiTElCUz0gLWxuY3Vyc2VzIC1sY3J5cHQgLWx1dGlsIC1sbSAkKExJQlMpIgorCisjRGVmYXVsdCBGcmVlQlNEIG1ha2UgZm9yIEMtS2VybWl0IDguMC4uLgorZnJlZWJzZDoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIENDPSQoQ0MpIENDMj0kKENDMikgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSBmcmVlYnNkNDUKKworI0ZyZWVCU0QgNC4yLCBsaWtlIDQuMS4KK2ZyZWVic2Q0MjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBGcmVlQlNEIDQuMi4uLicKKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDQgLURDS19OQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRFRDUFNPQ0tFVCAtRE5PQ09URk1DIFwKKwktREZSRUVCU0Q0IC1ERlJFRUJTRDQxIC1ERlJFRUJTRDQyIC1EVVNFX1VVX0xPQ0sgLURGTkZMT0FUIFwKKwktZnVuc2lnbmVkLWNoYXIgLURUUFVUU0FSR1RZUEU9aW50IC1EVVNFX1NUUkVSUk9SICQoS0ZMQUdTKSAtTyAtcGlwZSIgXAorCSJMSUJTPSAtbG5jdXJzZXMgLWxjcnlwdCAtbHV0aWwgLWxtICQoTElCUykiCisKKyNGcmVlQlNEIDQuMywgbGlrZSA0LjIuCitmcmVlYnNkNDM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRnJlZUJTRCA0LjMuLi4nCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQ0IC1EQ0tfTkNVUlNFUyAtRENLX05FV1RFUk0gLURUQ1BTT0NLRVQgLUROT0NPVEZNQyBcCisJLURGUkVFQlNENCAtREZSRUVCU0Q0MSAtREZSRUVCU0Q0MiAtREZSRUVCU0Q0MyAtRFVTRV9VVV9MT0NLIFwKKwktREZORkxPQVQgLWZ1bnNpZ25lZC1jaGFyIC1EVFBVVFNBUkdUWVBFPWludCAtRFVTRV9TVFJFUlJPUiAkKEtGTEFHUykgXAorCS1PIC1waXBlIiAiTElCUz0gLWxuY3Vyc2VzIC1sY3J5cHQgLWx1dGlsIC1sbSAkKExJQlMpIgorCisjRnJlZUJTRCA0LjQsIGxpa2UgNC4zLgorZnJlZWJzZDQ0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEZyZWVCU0QgNC40Li4uJworCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0NCAtRENLX05DVVJTRVMgLURDS19ORVdURVJNIC1EVENQU09DS0VUIC1ETk9DT1RGTUMgXAorCS1ERlJFRUJTRDQgLURGUkVFQlNENDEgLURGUkVFQlNENDIgLURGUkVFQlNENDMgLURGUkVFQlNENDQgXAorCS1EVVNFX1VVX0xPQ0sgLURGTkZMT0FUIC1mdW5zaWduZWQtY2hhciAtRFRQVVRTQVJHVFlQRT1pbnQgXAorCS1EVVNFX1NUUkVSUk9SICQoS0ZMQUdTKSAtTyAtcGlwZSIgXAorCSJMSUJTPSAtbG5jdXJzZXMgLWxjcnlwdCAtbHV0aWwgLWxtICQoTElCUykiCisKKyNGcmVlQlNEIDQuNSwgbGlrZSA0LjMgYW5kIDQuNC4KK2ZyZWVic2Q0NToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBGcmVlQlNEIDQuNS4uLicKKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDQgLURDS19OQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRFRDUFNPQ0tFVCAtRE5PQ09URk1DIFwKKwktREZSRUVCU0Q0IC1EVVNFX1VVX0xPQ0sgLURGTkZMT0FUIC1mdW5zaWduZWQtY2hhciAtRFRQVVRTQVJHVFlQRT1pbnQgXAorCS1ERlJFRUJTRDQxIC1ERlJFRUJTRDQyIC1ERlJFRUJTRDQzIC1ERlJFRUJTRDQ0IC1ERlJFRUJTRDQ1IFwKKwktRFVTRV9TVFJFUlJPUiAkKEtGTEFHUykgLU8gLXBpcGUiIFwKKwkiTElCUz0gLWxuY3Vyc2VzIC1sY3J5cHQgLWx1dGlsIC1sbSAkKExJQlMpIgorCisjRnJlZUJTRCA0LjYsIGxpa2UgNC41CitmcmVlYnNkNDY6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRnJlZUJTRCA0LjYuLi4nCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQ0IC1EQ0tfTkNVUlNFUyAtRENLX05FV1RFUk0gLURUQ1BTT0NLRVQgLUROT0NPVEZNQyBcCisJLURGUkVFQlNENCAtRFVTRV9VVV9MT0NLIC1ERk5GTE9BVCAtZnVuc2lnbmVkLWNoYXIgLURUUFVUU0FSR1RZUEU9aW50IFwKKwktREZSRUVCU0Q0MSAtREZSRUVCU0Q0MiAtREZSRUVCU0Q0MyAtREZSRUVCU0Q0NCAtREZSRUVCU0Q0NSBcCisJLURGUkVFQlNENDYgLURVU0VfU1RSRVJST1IgJChLRkxBR1MpIC1PIC1waXBlIiBcCisJIkxJQlM9IC1sbmN1cnNlcyAtbGNyeXB0IC1sdXRpbCAtbG0gJChMSUJTKSIKKworI0ZyZWVCU0QgNC43LCBsaWtlIDQuNgorZnJlZWJzZDQ3OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEZyZWVCU0QgNC43Li4uJworCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0NCAtRENLX05DVVJTRVMgLURDS19ORVdURVJNIC1EVENQU09DS0VUIC1ETk9DT1RGTUMgXAorCS1ERlJFRUJTRDQgLURVU0VfVVVfTE9DSyAtREZORkxPQVQgLWZ1bnNpZ25lZC1jaGFyIC1EVFBVVFNBUkdUWVBFPWludCBcCisJLURGUkVFQlNENDEgLURGUkVFQlNENDIgLURGUkVFQlNENDMgLURGUkVFQlNENDQgLURGUkVFQlNENDUgXAorCS1ERlJFRUJTRDQ2IC1ERlJFRUJTRDQ3IC1EVVNFX1NUUkVSUk9SICQoS0ZMQUdTKSAtTyAtcGlwZSIgXAorCSJMSUJTPSAtbG5jdXJzZXMgLWxjcnlwdCAtbHV0aWwgLWxtICQoTElCUykiCisKKyNGcmVlQlNEIDQuOCwgbGlrZSA0LjcKK2ZyZWVic2Q0ODoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBGcmVlQlNEIDQuNy4uLicKKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDQgLURDS19OQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRFRDUFNPQ0tFVCAtRE5PQ09URk1DIFwKKwktREZSRUVCU0Q0IC1EVVNFX1VVX0xPQ0sgLURGTkZMT0FUIC1mdW5zaWduZWQtY2hhciAtRFRQVVRTQVJHVFlQRT1pbnQgXAorCS1ERlJFRUJTRDQxIC1ERlJFRUJTRDQyIC1ERlJFRUJTRDQzIC1ERlJFRUJTRDQ0IC1ERlJFRUJTRDQ1IFwKKwktREZSRUVCU0Q0NiAtREZSRUVCU0Q0NyAtREZSRUVCU0Q0OCBcCisJLURVU0VfU1RSRVJST1IgJChLRkxBR1MpIC1PIC1waXBlIiBcCisJIkxJQlM9IC1sbmN1cnNlcyAtbGNyeXB0IC1sdXRpbCAtbG0gJChMSUJTKSIKKworI0ZyZWVCU0QgNC45CitmcmVlYnNkNDk6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRnJlZUJTRCA0LjcuLi4nCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQ0IC1EQ0tfTkNVUlNFUyAtRENLX05FV1RFUk0gLURUQ1BTT0NLRVQgLUROT0NPVEZNQyBcCisJLURGUkVFQlNENCAtRFVTRV9VVV9MT0NLIC1ERk5GTE9BVCAtZnVuc2lnbmVkLWNoYXIgLURUUFVUU0FSR1RZUEU9aW50IFwKKwktREZSRUVCU0Q0MSAtREZSRUVCU0Q0MiAtREZSRUVCU0Q0MyAtREZSRUVCU0Q0NCAtREZSRUVCU0Q0NSBcCisJLURGUkVFQlNENDYgLURGUkVFQlNENDcgLURGUkVFQlNENDggLURGUkVFQlNENDkgXAorCS1EVVNFX1NUUkVSUk9SICQoS0ZMQUdTKSAtTyAtcGlwZSIgXAorCSJMSUJTPSAtbG5jdXJzZXMgLWxjcnlwdCAtbHV0aWwgLWxtICQoTElCUykiCisKKyNGcmVlQlNEIDUuMCwgbGlrZSA0LjYKK2ZyZWVic2Q1MDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBGcmVlQlNEIDUuMCB3aXRoIG5jdXJzZXMuLi4nCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQ0IC1EQ0tfTkNVUlNFUyAtRENLX05FV1RFUk0gLURUQ1BTT0NLRVQgLUROT0NPVEZNQyBcCisJLURGUkVFQlNENCAtRFVTRV9VVV9MT0NLIC1ERk5GTE9BVCAtZnVuc2lnbmVkLWNoYXIgLURUUFVUU0FSR1RZUEU9aW50IFwKKwktREZSRUVCU0Q0MSAtREZSRUVCU0Q0MiAtREZSRUVCU0Q0MyAtREZSRUVCU0Q0NCAtREZSRUVCU0Q0NSBcCisJLURGUkVFQlNENDYgLURGUkVFQlNENTAgLURVU0VfU1RSRVJST1IgJChLRkxBR1MpIC1PIC1waXBlIiBcCisJIkxJQlM9IC1sbmN1cnNlcyAtbGNyeXB0IC1sdXRpbCAtbG0gJChMSUJTKSIKKworI0ZyZWVCU0QgNS4xCitmcmVlYnNkNTE6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRnJlZUJTRCA1LjAgd2l0aCBuY3Vyc2VzLi4uJworCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0NCAtRENLX05DVVJTRVMgLURDS19ORVdURVJNIC1EVENQU09DS0VUIC1ETk9DT1RGTUMgXAorCS1ERlJFRUJTRDQgLURVU0VfVVVfTE9DSyAtREZORkxPQVQgLWZ1bnNpZ25lZC1jaGFyIC1EVFBVVFNBUkdUWVBFPWludCBcCisJLURGUkVFQlNENDEgLURGUkVFQlNENDIgLURGUkVFQlNENDMgLURGUkVFQlNENDQgLURGUkVFQlNENDUgXAorCS1ERlJFRUJTRDQ2IC1ERlJFRUJTRDUwIC1ERlJFRUJTRDUxIFwKKwktRFVTRV9TVFJFUlJPUiAkKEtGTEFHUykgLU8gLXBpcGUiIFwKKwkiTElCUz0gLWxuY3Vyc2VzIC1sY3J5cHQgLWx1dGlsIC1sbSAkKExJQlMpIgorCisjU2VjdXJlIGJ1aWxkcyBmb3IgRnJlZUJTRC4uLiAgZ2NjIHJlcXVpcmVkLgorCitmcmVlYnNkNDQrc3JwK29wZW5zc2w6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRnJlZUJTRCA0LjMgd2l0aCBTUlAsU1NMLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiBcCisJIkNGTEFHUz0gLURCU0Q0NCAtRENLX05DVVJTRVMgLURDS19ORVdURVJNIC1EVENQU09DS0VUIC1ETk9DT1RGTUMgXAorCS1ERlJFRUJTRDQgLURGUkVFQlNENDEgLURGUkVFQlNENDIgLURGUkVFQlNENDMgLURGUkVFQlNENDQgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19TUlAgXAorCS1EQ0tfRU5DUllQVElPTiAtRENLX0NBU1QgLURDS19ERVMgLURMSUJERVMgLURDS19TU0wgXAorCS1EQ0tfQ1VSU0VTIC1EVENQU09DS0VUICBcCisJJChTUlBJTkMpICQoU1NMSU5DKSAkKEtGTEFHUykiICJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiBcCisJIkxJQlMgPSAkKFNSUExJQikgJChTU0xMSUIpIFwKKwktbG5jdXJzZXMgLWx0ZXJtY2FwIC1sc3JwIC1sc3NsIC1sa3J5cHRvIC1sY3J5cHRvIFwKKwktbGNyeXB0ICIKKworIyBUaGUgZm9sbG93aW5nIGZyYWdtZW50YXJ5IEZyZWVCU0QrU0xMIHRhcmdldCB3YXMgc3VnZ2VzdGVkLCBidXQgaXQncyBub3QKKyMgY2xlYXIgd2hpY2ggdmVyc2lvbiBvZiBGcmVlQlNEIGl0IGFwcGxpZXMgdG8uCisjCisjIEFMTF9UQVJHRVQ9CXhlcm1pdAorIyBNQUtFX0FSR1M9CUtUQVJHRVQ9ZnJlZWJzZCBcCisjCQlDRkxBR1M9IiR7Q0ZMQUdTfSAtREJTRDQ0IC1EQ0tfTkNVUlNFUyAtRENLX05FV1RFUk0gXAorIwkJLURUQ1BTT0NLRVQgLUROT0NPVEZNQyAtREZSRUVCU0Q0IC1EVVNFX1VVX0xPQ0sgLURGTkZMT0FUIFwKKyMJCS1mdW5zaWduZWQtY2hhciAtRFRQVVRTQVJHVFlQRT1pbnQgLURVU0VfU1RSRVJST1IgLURDS0hUVFAgXAorIwkJLURDS19TU0wgLURDS19BVVRIRU5USUNBVElPTiAtRENLX0VOQ1JZUFRJT04gLURDS19ERVMiIFwKKyMJCUxJQlM9Ii1sc3NsIC1sY3J5cHRvIC1sZGVzIC1sbmN1cnNlcyAtbGNyeXB0IC1sdXRpbCAtbG0iCisKKyNGcmVlQlNEIDUuMCB3aXRoIE9wZW5TU0wgMC45LjcuCitmcmVlYnNkNTArb3BlbnNzbDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBGcmVlQlNEIDUuMCwgbmN1cnNlcywgb3BlbnNzbCcKKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDQgLURDS19OQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRFRDUFNPQ0tFVCAtRE5PQ09URk1DIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfU1NMICQoU1NMSU5DKSAtRFpMSUIgXAorCS1ERlJFRUJTRDQgLURVU0VfVVVfTE9DSyAtREZORkxPQVQgLWZ1bnNpZ25lZC1jaGFyIC1EVFBVVFNBUkdUWVBFPWludCBcCisJLURGUkVFQlNENDEgLURGUkVFQlNENDIgLURGUkVFQlNENDMgLURGUkVFQlNENDQgLURGUkVFQlNENDUgXAorCS1ERlJFRUJTRDQ2IC1ERlJFRUJTRDUwIC1EVVNFX1NUUkVSUk9SICQoS0ZMQUdTKSAtTyAtcGlwZSIgXAorCSJMSUJTPSAtbG5jdXJzZXMgLWxjcnlwdCAtbHNzbCAtbGNyeXB0byAtbHV0aWwgLWxtICQoU1NMTElCKSAkKExJQlMpIgorCisjTmV0QlNEIC0gYWxsIHZlcnNpb25zIC0gd2l0aCBjdXJzZXMsIG5vdCBuY3Vyc2VzLgorI1NvbWUgYnVpbGRzIHNlZW0gdG8gbmVlZCBLRkxBR1M9LURUUFVUU0ZOVFlQRT1pbnQsIG90aGVycyBkb24ndC4KKyMoT25seSB0byBnZXQgcmlkIG9mIGEgd2FybmluZyAtLSB0aGUgYmluYXJpZXMgYXJlIGlkZW50aWNhbC4pCituZXRic2Q6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBOZXRCU0Qgd2l0aCBjdXJzZXMuLi4KKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDQgLURDS19DVVJTRVMgLURUQ1BTT0NLRVQgLURVU0VfU1RSRVJST1IgLURUUFVUU0lTVk9JRCBcCisJLURDS19EVFJDRCAtRENLX0RUUkNUUyAtRFRQVVRTQVJHVFlQRT1pbnQgLURGTkZMT0FUICQoS0ZMQUdTKSAtTyIgXAorCSJMSUJTPSAtbGN1cnNlcyAtbGNyeXB0IC1sbSAkKExJQlMpIgorCisjTmV0QlNEIDEuNS54IGluIHdoaWNoIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gcG9pbnRlciB0aGF0IGlzIHRoZQorI3RoaXJkIGFyZ3VtZW50IG9mIHRwdXRzKCkgd2FzIGNoYW5nZWQgZnJvbSB2b2lkIHRvIGludC4uLiAgVGhlIHJlZ3VsYXIgTmV0QlNECisjdGFyZ2V0IGJ1aWxkcyBPSyBoZXJlIGJ1dCB0aGlzIG9uZSBlbGltaW5hdGVzIHRoZSAoaGFybWxlc3MpIHdhcm5pbmcuCituZXRic2QxNToKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE5ldEJTRCB3aXRoIGN1cnNlcy4uLgorCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0NCAtRENLX0NVUlNFUyAtRFRDUFNPQ0tFVCAtRFVTRV9TVFJFUlJPUiAtRE5FVEJTRDE1IFwKKwktRENLX0RUUkNEIC1EQ0tfRFRSQ1RTIC1EVFBVVFNBUkdUWVBFPWludCAtREZORkxPQVQgJChLRkxBR1MpIC1PIiBcCisJIkxJQlM9IC1sY3Vyc2VzIC1sY3J5cHQgLWxtICQoTElCUykiCisKKyNOZXRCU0QgMS42IC0gbGlrZSAxLjUueCBidXQgd2l0aCB2YW5pdHkgYmFubmVyIHNheWluZyAxLjYuCituZXRic2QxNjoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE5ldEJTRCB3aXRoIGN1cnNlcy4uLgorCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0NCAtRENLX0NVUlNFUyAtRFRDUFNPQ0tFVCAtRFVTRV9TVFJFUlJPUiBcCisJLURORVRCU0QxNSAtRE5FVEJTRDE2IFwKKwktRENLX0RUUkNEIC1EQ0tfRFRSQ1RTIC1EVFBVVFNBUkdUWVBFPWludCAtREZORkxPQVQgJChLRkxBR1MpIC1PIiBcCisJIkxJQlM9IC1sY3Vyc2VzIC1sY3J5cHQgLWxtICQoTElCUykiCisKKyNOZXRCU0Qgd2l0aCBuY3Vyc2VzIHJlcXVlc3RlZCBleHBsaWNpdGx5IHJhdGhlciB0aGFuIGN1cnNlcy13aGljaC1pcy1uY3Vyc2VzCituZXRic2RuOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTmV0QlNEIHdpdGggbmN1cnNlcy4uLgorCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0NCAtRENLX0NVUlNFUyAtRFRDUFNPQ0tFVCAtRE5PQ09URk1DIC1EQ0tfRFRSQ0QgXAorCS1EQ0tfRFRSQ1RTIC1ERk5GTE9BVCAtRFVTRV9TVFJFUlJPUiAtRFRQVVRTSVNWT0lEIC1EVFBVVFNBUkdUWVBFPWludCBcCisJJChLRkxBR1MpIC1PIiBcCisJIkxJQlM9IC1ML3Vzci9wa2cvbGliIC1sbmN1cnNlcyAtbGNyeXB0IC1sbSAkKExJQlMpIgorCisjT3BlbkJTRCAtIEFsbCB2ZXJzaW9ucy4KKyNVc2VzIG5jdXJzZXMgYXMgaXRzIGN1cnNlcyBzbyB1c2UgLWx0ZXJtbGliLCBub3QgLWx0ZXJtY2FwCisjQnV0IGl0IGRvZXNuJ3QgdXNlIHV1X2xvY2soKSB3aGljaCB3YXMgaW50cm9kdWNlZCBpbiBPcGVuQlNEIDIuMy4KKyNGb3IgdGhhdCB1c2UgdGhlIG5leHQgZW50cnkuCisjQWRkIC1ETUFJTlRZUEU9aW50IGlmIHlvdSBnZXQgY29tcGxhaW50cyBhYm91dCBtYWluOiByZXR1cm4gdHlwZSBpcyBub3QgaW50Lgorb3BlbmJzZG9sZDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE9wZW5CU0QuLi4KKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDQgLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1EVENQU09DS0VUIC1ET1BFTkJTRCBcCisJLURGTkZMT0FUIC1ETkRTWVNFUlJMSVNUICQoS0ZMQUdTKSAtTyIgIkxJQlM9IC1sY3Vyc2VzIC1sdGVybWxpYiAtbG0iCisKKyNPcGVuQlNEIDIuMyBvciBsYXRlcgorI0FkZCAtRE1BSU5UWVBFPWludCBpZiB5b3UgZ2V0IGNvbXBsYWludHMgYWJvdXQgbWFpbjogcmV0dXJuIHR5cGUgaXMgbm90IGludC4KKyNGb3IgQy1LZXJtaXQgOC4wIChDaHJpc3RpYW4gV2Vpc2dlcmJlcik6CisjIC1sdGVybWxpYiByZW1vdmVkIChwcmVzdW1hYmx5IGJlY2F1c2UgLWxjdXJzZXM9PW5jdXJzZXMgYWxyZWFkeSBpbmNsdWRlcyBpdCkKKyMgLURVU0VfVVVfTE9DSyBhbmQgLWx1dGlsIGFkZGVkIGZvciB1dV9sb2NrKCkKKyMgLURORFNZU0VSUkxJU1QgY2hhbmdlZCB0byAtRFVTRV9TVFJFUlJPUgorI0lmIHRoaXMgZ2l2ZXMgeW91IHRyb3VibGUgdXNlIHRoZSBwcmV2aW91cyBlbnRyeS4KK29wZW5ic2Q6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBPcGVuQlNEIDIuMyBvciBsYXRlci4uLgorCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0NCAtRENLX0NVUlNFUyAtRENLX05FV1RFUk0gLURUQ1BTT0NLRVQgLURPUEVOQlNEIFwKKwktRFVTRV9VVV9MT0NLIC1ERk5GTE9BVCAtRFVTRV9TVFJFUlJPUiAkKEtGTEFHUykgLU8iIFwKKwkiTElCUz0gLWxjdXJzZXMgLWx1dGlsIC1sbSIKKworI09wZW5CU0QgMy4wIG9yIGxhdGVyIGluY2x1ZGVzIE9wZW5TU0wKKyNBZGQgLURNQUlOVFlQRT1pbnQgaWYgeW91IGdldCBjb21wbGFpbnRzIGFib3V0IG1haW46IHJldHVybiB0eXBlIGlzIG5vdCBpbnQuCisjRm9yIEMtS2VybWl0IDguMCAoQ2hyaXN0aWFuIFdlaXNnZXJiZXIpOgorIyAtbHRlcm1saWIgcmVtb3ZlZCAocHJlc3VtYWJseSBiZWNhdXNlIC1sY3Vyc2VzPT1uY3Vyc2VzIGFscmVhZHkgaW5jbHVkZXMgaXQpCisjIC1EVVNFX1VVX0xPQ0sgYW5kIC1sdXRpbCBhZGRlZCBmb3IgdXVfbG9jaygpCisjIC1ETkRTWVNFUlJMSVNUIGNoYW5nZWQgdG8gLURVU0VfU1RSRVJST1IKKyNJZiB0aGlzIGdpdmVzIHlvdSB0cm91YmxlIHVzZSB0aGUgcHJldmlvdXMgZW50cnkuCitvcGVuYnNkMzArc3NsOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgT3BlbkJTRCAzLjAgb3IgbGF0ZXIuLi4KKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDQgLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1EVENQU09DS0VUIC1ET1BFTkJTRCBcCisJLURVU0VfVVVfTE9DSyAtREZORkxPQVQgLURVU0VfU1RSRVJST1IgLURDS19BVVRIRU5USUNBVElPTiBcCisJLURDS19TU0wgJChLRkxBR1MpIC1PIiBcCisJIkxJQlM9IC1sY3Vyc2VzIC1sdXRpbCAtbG0gLWxzc2wgLWxjcnlwdG8iCisKKyMgbWFrZSAzODZic2QgMC4wbmV3LCBwb3NpeAorIyBmb3IgIDM4NmJzZCAwLjEuMjQsIGNoYW5nZSAvdXNyL2luY2x1ZGUvdGVybWlvcy5oIHRvICNkZWZpbmUgTkNDUyBpZgorIyAgX1BPU0lYX1NPVVJDRSBpcyAjZGVmaW5lZC4gKHNvdXJjZTogbGV3aW5lLCBwb3NpeCBwcmdtcnMgZ3VpZGUsIG9gcmVpbGx5KQorI05PVEU6IExvY2sgZGlyZWN0b3J5IGlzIC92YXIvc3Bvb2wvbG9jay4gIEZvcm1lcmx5LCBpdCB3YXMgL3Zhci9zcG9vbC91dWNwLAorI2J1dCByZXBvcnRlZGx5IDx3am9uZXNAaGFsY3lvbi5jb20+IHRoYXQgd2FzIGR1ZSB0byBhIHR5cG8gaW4gJ21hbiB0aXAnLgorMzg2YnNkOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIGpvbGl4IDM4NkJTRCAwLjBuZXcgYW5kIDAuMS4yNC4uLicKKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EUE9TSVggLURTRVRSRVVJRCAtRFBJRFNUUklORyAtRFVTTEVFUCBcCisJLURfMzg2QlNEIC1EQ0tfQ1VSU0VTIC1EVENQU09DS0VUIFwKKwktRExPQ0tfRElSPVxcXCIvdmFyL3Nwb29sL2xvY2tcXFwiIFwKKwkkKEtGTEFHUykgLU8iICJMTktGTEFHUyA9IC1zIiAiTElCUyA9IC1sY3Vyc2VzIC1sdGVybWNhcCIKKworI01hYyBPUyBYIDEuMCAoUmhhcHNvZHksIERhcndpbikgLS0gVENQL0lQIGJ1dCBubyBjdXJzZXMuCittYWNvc3gxMDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIGB1bmFtZSAtc2AuLi4KKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1ETUFDT1NYMTAgLURUQ1BTT0NLRVQgLURVU0VfU1RSRVJST1IgLU8gJChLRkxBR1MpIgorCisjTWFjIE9TIFggMS4wIChSaGFwc29keSwgRGFyd2luKSAtLSBUQ1AvSVAgYW5kIGN1cnNlcy4KKyNOb3RlOiBjdXJzZXMgbXVzdCBiZSBvYnRhaW5lZCBzZXBhcmF0ZWx5LiAgU2VlIG5leHQgZW50cnkgZm9yIG5jdXJzZXMuCisjQWRkICJMSUJTID0gLWxjdXJzZXMgLWx0ZXJtY2FwIiBpZiBuZWNlc3NhcnkgKGJ1dCByZXBvcnRlZGx5IGl0IGlzIG5vdCkuCittYWNvc3gxMGM6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBgdW5hbWUgLXNgICsgY3Vyc2VzLi4uCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRE1BQ09TWDEwIC1EQ0tfQ1VSU0VTIC1EVFBVVFNGTlRZUEU9dm9pZCAtRFRQVVRTSVNWT0lEIFwKKwktRFRDUFNPQ0tFVCAtRFVTRV9TVFJFUlJPUiAtTyAkKEtGTEFHUykiCisKKyNNYWMgT1MgWCAxLjAgKFJoYXBzb2R5LCBEYXJ3aW4pIC0tIFRDUC9JUCBhbmQgbmN1cnNlcy4KKyNOb3RlOiBuY3Vyc2VzIG11c3QgYmUgb2J0YWluZWQgc2VwYXJhdGVseS4KKyNJbiB0aGUgZXZlbnQgb2YgdHJvdWJsZSB3aXRoIHRoaXMgb25lIHRyeSB0aGUgbmV4dCBvbmUuCittYWNvc3gxMG5jOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgYHVuYW1lIC1zYCArIG5jdXJzZXMuLi4KKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1ETUFDT1NYMTAgLURDS19OQ1VSU0VTIC1EVENQU09DS0VUIC1EVVNFX1NUUkVSUk9SIC1PIFwKKwkkKEtGTEFHUykiICJMSUJTPSAtbG5jdXJzZXMgJChMSUJTKSIKKworI01hYyBPUyBYIDEwLjIgKEphZ3VhcikgbmN1cnNlcy4KK21hY29zeDEwMm5jOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgYHVuYW1lIC1zYCArIG5jdXJzZXMuLi4KKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1ETUFDT1NYMTAgLURDS19OQ1VSU0VTIC1EVENQU09DS0VUIC1EVVNFX1NUUkVSUk9SIC1PIFwKKwkkKEtGTEFHUykgIiAiTElCUz0gLWxuY3Vyc2VzICQoTElCUykiCisKKyNUaGUgcHJvYmxlbSBoZXJlIGlzIHRoYXQgaWYgY3Vyc2VzLmggYWxzbyBleGlzdHMsIGl0IGNvbmZsaWN0cyB3aXRoCisjbmN1cnNlcy5oIGFuZCBhbmQgd2UgaGF2ZSBmYXRhbCBlcnJvcnMuICBJZiB0aGlzIGhhcHBlbnMgdG8geW91LCB0aGVuCisjdHJ5IHRoaXMgZW50cnkuCittYWNvc3gxMG5jeDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIGB1bmFtZSAtc2AgKyBuY3Vyc2VzLi4uCisJQHJtIC1mIC4vY3Vyc2VzLmg7IHRvdWNoIC4vY3Vyc2VzLmgKKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1ETUFDT1NYMTAgLURDS19OQ1VSU0VTIC1EVENQU09DS0VUIC1EVVNFX1NUUkVSUk9SIFwKKwktSS4gLU8gJChLRkxBR1MpICIgXAorCSJMSUJTPSAtbG5jdXJzZXMgJChMSUJTKSIKKwlAcm0gLWYgLi9jdXJzZXMuaAorCisjTWFjIE9TIFggMTAuMyAoUGFudGhlcikgLSBBc3N1bWVzIG5jdXJzZXMgaXMgaW5zdGFsbGVkLgorbWFjb3N4MTAzOiAKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIGB1bmFtZSAtc2AgKyBuY3Vyc2VzLi4uCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRE1BQ09TWDEwIC1ETUFDT1NYMTAzIC1EQ0tfTkNVUlNFUyAtRFRDUFNPQ0tFVCBcCisJLURVU0VfU1RSRVJST1IgLURVU0VfTkFNRVNFUl9DT01QQVQgLU8gXAorCSQoS0ZMQUdTKSAiICJMSUJTPSAtbG5jdXJzZXMgLWxyZXNvbHYgJChMSUJTKSIKKworbWFjb3N4MTAzbmM6CisJJChNQUtFKSBNQUtFPSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSBtYWNvc3gxMDMKKworI0Fjb3JuIFJJU0NpWCwgYmFzZWQgb24gLi4uCisjQmVya2VsZXkgVW5peCA0LjIgb3IgNC4zIHdpdGggbG9jayBkaXJlY3RvcnkgL3Vzci9zcG9vbC91dWNwL0xDSy9MQ0suLnR0eXh4LAorI2J1dCB3aXRob3V0IGFjdWNudHJsIHByb2dyYW0KK3Jpc2NpeDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFJJU0NpWCwgL3Vzci9zcG9vbC91dWNwL0xDSy4udHR5eHgKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkJIkNGTEFHUz0gLURCU0Q0MiAtREJTRDQgLURSSVNDSVggLUROT0NTRVRTIFwKKwkJLURMT0NLX0RJUj1cXFwiL3Vzci9zcG9vbC91dWNwXFxcIiAtRERJUkVOVCAtRENLX0NVUlNFUyBcCisJCS1ETUFYU1A9OTAyNCAtRE1BWFJEPTkwMjQgLURTQlNJWj05MDUwIC1EUkJTSVo9OTA1MCBcCisJCS1EREZUVFk9XFxcIi9kZXYvc2VyaWFsXFxcIiAtRE5PQ1NFVFMgLUROT0NZUklMIFwKKwkJLUROT0FOU0kgLXcgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIiBcCisJCSJMSUJTPSAtbGN1cnNlcyAtbHRlcm1jYXAgIiBcCisJCSJDQz0gL3Vzci91Y2IvY2MiIFwKKwkJIkNDMj0gL3Vzci91Y2IvY2MiCisKKyNBY29ybiBSSVNDaVgsIGFzIGFib3ZlLCBidXQgdXNpbmcgZ2NjCityaXNjaXgtZ2NjOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgUklTQ2lYLCAvdXNyL3Nwb29sL3V1Y3AvTENLLi50dHl4eAorCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCQkiQ0ZMQUdTPSAtREJTRDQyIC1EQlNENCAtRFJJU0NJWCAtRE5PQ1NFVFMgXAorCQktRExPQ0tfRElSPVxcXCIvdXNyL3Nwb29sL3V1Y3BcXFwiIC1ERElSRU5UIC1EQ0tfQ1VSU0VTIFwKKwkJLURNQVhTUD05MDI0IC1ETUFYUkQ9OTAyNCAtRFNCU0laPTkwNTAgLURSQlNJWj05MDUwIFwKKwkJLURERlRUWT1cXFwiL2Rldi9zZXJpYWxcXFwiIC1ETk9DU0VUUyAtRE5PQ1lSSUwgXAorCQktRE5PQU5TSSAtdyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIiIFwKKwkJIkxJQlM9IC1sY3Vyc2VzIC1sdGVybWNhcCAiIFwKKwkJIkNDPSBnY2MgLW1ic2QiIFwKKwkJIkNDMj0gZ2NjIC1tYnNkIgorCisjQ29udmVyZ2VudCBDVElYIDYuNC4xCitjdGl4OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIENvbnZlcmdlbnQgQ1RJWCA2LjQuMScKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRFNWUjMgLURESVJFTlQgLURUQ1BTT0NLRVQgLURIREJVVUNQIC1EQ0tfQ1VSU0VTIFwKKwktRE5PTkFXUyAtRE5PTEVBUk4gJChLRkxBR1MpIC1YTyIgXAorCSJMTktGTEFHUz0tcyIgIkxJQlM9LWxzb2NrZXQgLWxjdXJzZXMgLWxjX3MiCisJbWNzIC1kIHdlcm1pdAorCisjIFRoZSBmb2xsb3dpbmcgbWFrZWZpbGUgZW50cnkgc2hvdWxkIHdvcmsgZm9yIGFueSBIYXJyaXMgTmlnaHQgSGF3ayBzeXN0ZW0KKyMgKGVpdGhlciA4OGsgb3IgNjhrIGJhc2VkKSBydW5uaW5nIHJlbGVhc2UgNi4xIG9yIGxhdGVyIG9mIHRoZSBDWC9VWAorIyBvcGVyYXRpbmcgc3lzdGVtLiBUaGlzIGlzIGEgUE9TSVggYW5kIEFOU0ktQyBjb21wbGlhbnQgc3lzdGVtIHdoaWNoIGFsc28KKyMgc3VwcG9ydHMgQlNEIG5ldHdvcmtpbmcuIChFYXJsaWVyIENYL1VYIHJlbGVhc2VzIHdpbGwgcHJvYmFibHkgd29yayB3aXRoCisjIHN5czVyMywgYnV0IHRoaXMgaGFzIG5vdCBiZWVuIHZlcmlmaWVkKS4KKyMKK2N4X3V4OgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSGFycmlzIE5pZ2h0IEhhd2sgQ1gvVVggNi4xIG9yIGxhdGVyCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0tRFBPU0lYIC1EVENQU09DS0VUIC1ESERCVVVDUCAtRFBJRF9UPXBpZF90IC1EV0FJVF9UPWludCBcCisJLURkX2lubz1kX2ZpbGVubyAtRFVJRF9UPXVpZF90IC1ER0lEX1Q9Z2lkX3QgJChLRkxBR1MpIC1YYSBcCisJLU8zIC1nIiAiTE5LRkxBR1M9LU8zIgorCisjSW50ZXJncmFwaCBDbGlwcGVyLCBDTElYLCBqb2IgY29udHJvbCwgSERCIFVVQ1AuCitjbGl4OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEludGVyZ3JhcGggQ0xJWC4uLicKKwkkKE1BS0UpIHdlcm1pdCAiQ0M9YWNjIiAiQ0MyPWFjYyIgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLXcgLURTVlIzIC1EQ0xJWCAtRERJUkVOVCAtREhEQlVVQ1AgLUROT1NZU0xPRyAtRFVTRV9NRU1DUFkgXAorCS1ETk9HRVRVU0VSU0hFTEwgLUROT1JFQUxQQVRIIC1ETk9MRUFSTiAkKEtGTEFHUykgLU8iIFwKKwkiTE5LRkxBR1M9IiAiTElCUz0gLWxic2QiCisKKyNBcyBhYm92ZSArIFRDUC9JUC4uLgorY2xpeG5ldDoKKwlAZWNobyAnTWFraW5nIG5ldHdvcmtlZCBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSW50ZXJncmFwaCBDTElYLi4uJworCSQoTUFLRSkgd2VybWl0ICJDQz1hY2MiICJDQzI9YWNjIiBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtdyAtRFNWUjMgLURDTElYIC1ERElSRU5UIC1ESERCVVVDUCAtRE5PU1lTTE9HIC1EVVNFX01FTUNQWSBcCisJLURUQ1BTT0NLRVQgLUROT0dFVFVTRVJTSEVMTCAtRE5PTEVBUk4gLUROT1JFQUxQQVRIICQoS0ZMQUdTKSAtTyIgXAorCSJMTktGTEFHUz0iICJMSUJTPSAtbGJzZCIKKworI01hcmsgV2lsbGlhbXMgQ29oZXJlbnQgMjg2IG9yIDM4NiBvbiBJQk0gUEMgZmFtaWx5LgorI1RoZXJlIGlzIGEgNjRLIGxpbWl0IG9uIHByb2dyYW0gc2l6ZSwgc28gdGhpcyBpcyBhIGNvbW1hbmQtbGluZSBvbmx5IHZlcnNpb24uCitjb2hlcmVudDoKKwkkKE1BS0UpICJDRkxBR1MgPSAtTyAtRENPSEVSRU5UIC1ETk9BTlNJIC1ETk9JQ1AgLUROT1NFVEtFWSAtRE5PTEVBUk4gXAorCS1ETk9DU0VUUyAtRE5PSEVMUCAtRE5PRElBTCAtRE5PU0NSSVBUIC1ETk9ERUJVRyAtRE5PVExPRyAtRE5PWE1JVCBcCisJLUROT01TRU5EIC1ETk9GUklMTFMgLUROT1NZU0lPQ1RMSCAtRFNFTEVDVF9IICQoS0ZMQUdTKSAtVlNVVkFSIiBcCisJLUROT0ZMT0FUIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gd2VybWl0CisKKyNNYXJrIFdpbGxpYW1zIENvaGVyZW50IDM4NiBvbiBJQk0gUEMgZmFtaWx5LgorI1RoaXMgd2lsbCBtYWtlIGEgIm1pbmltdW0gaW50ZXJhY3RpdmUiIHZlcnNpb24gLSBubyBzY3JpcHRzLAorI25vIGNoYXJhY3RlciBzZXRzLCBubyBoZWxwLCBubyBkaWFsLCBubyBkZWJ1Zy90cmFuc2FjdGlvbiBsb2dnaW5nLCBubworI3RyYW5zbWl0LCBtc2VuZCwgbWFpbCwgdHlwZSwgZXRjLgorY29oZXJlbnRtaToKKwkkKE1BS0UpICJDRkxBR1MgPSAtTyAtRENPSEVSRU5UIC1ETk9BTlNJIC1ETk9TRVRLRVkgLUROT0xFQVJOIFwKKwktRE5PU0hPVyAtRE5PQ1NFVFMgLUROT0hFTFAgLUROT0RJQUwgLUROT1NDUklQVCAtRE5PREVCVUcgLUROT1RMT0cgXAorCS1ETk9YTUlUIC1ETk9NU0VORCAtRE5PRlJJTExTIC1ETk9TWVNJT0NUTEggLUROT1NFUlZFUiAtRE5PVVVDUCBcCisJLUROT1NQTCAtRE5PUFVTSCAtRE5PTURNSFVQIC1ETk9KQyAtRE5PRkRaRVJPIC1ETk9FU0NTRVEgLUROT0ZMT0FUIFwKKwktRE5PQ01ETCAkKEtGTEFHUykgLVZTVVZBUiAtRFNFTEVDVF9IIiBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwl3ZXJtaXQKKworI01hcmsgV2lsbGlhbXMgQ29oZXJlbnQgMzg2IG9uIElCTSBQQy9BVCBmYW1pbHkuCitjb2hlcmVudG1heDoKKwkkKE1BS0UpICJDRkxBR1MgPSAtTyAtRENPSEVSRU5UIC1ETk9BTlNJIC1EU0VMRUNUX0ggLUROT0xFQVJOIFwKKwktRE5PRkxPQVQgLUROT1NZU0lPQ1RMSCAkKEtGTEFHUykgLVZTVVZBUiIgIkxOS0ZMQUdTID0gLU8gLXMiIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IHdlcm1pdAorCisjTWFyayBXaWxsaWFtcyBDb2hlcmVudCAzODYgNC4yLiAgSW5jbHVkZXMgY3Vyc2VzIGJ1dCBub3QgVENQL0lQLgorI1JlcXVpcmVzIHVwZGF0ZXMgdG8gdGhlIDQuMi4xMCBjb21waWxlcjsgdGhlIHJlZ3VsYXIgY29tcGlsZXIgZmFpbHMgdG8KKyN0byBoYW5kbGUgImNvbXBsZXggZXhwcmVzc2lvbnMiLiAgTk9GTE9BVCBpcyBzbyBpdCBjYW4gd29yayBvbiBvbGQgUENzCisjd2l0aG91dCBmbG9hdGluZy1wb2ludCBoYXJkd2FyZS4KK2NvaGVyZW50NDI6CisJJChNQUtFKSAiQ0ZMQUdTID0gLVQ1MDAwMDAgLUROT0ZMT0FUIC1EQ09IRVJFTlQgLUROT0FOU0kgLURTRUxFQ1QgXAorCS1ETk9TWVNMT0cgLURESVJFTlQgLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1EQ0tfV1JFRlJFU0ggLVZTVVZBUiBcCisJLUREQ0xHRVRDV0QgLUROT1NZU0lPQ1RMSCAtRE5PSU5JVEdST1VQUyAtRE5PU1lNTElOSyAtRFNFTEVDVF9IIFwKKwktRERDTEdFVENXRCAtTyAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtTyAtcyIgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkxJQlMgID0gLWxzb2NrZXQgLWxjdXJzZXMiIHdlcm1pdAorCisjREVDIFVsdHJpeCAyLngKKyMgQWRkIC1PLCAtRERZTkFNSUMsIC1zLCBldGMsIGlmIHRoZXkgd29yay4KK3VsdHJpeDJ4OgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgVWx0cml4IDIueCAuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQtJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENCAtRFRDUFNPQ0tFVCAtRERVMiAtRE5PR0VUVVNFUlNIRUxMICQoS0ZMQUdTKSIKKworZHUyOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgS1RBUkdFVD0kJHtLVEFSR0VULSQoQCl9IHVsdHJpeDJ4CisKKyNERUMgVWx0cml4IDMuMCBhbmQgMy4xCit1bHRyaXgzMDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFVsdHJpeCAzLjAuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQtJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENCAtRFRDUFNPQ0tFVCAtRERJUkVOVCAtRFNJR19WIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1EVUxUUklYMyAtRENLX0NVUlNFUyAkKEtGTEFHUykgLU8iICJMSUJTPSAtbGN1cnNlcyAtbHRlcm1jYXAiCisKK2R1MzoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSB1bHRyaXgzMAorCit1bHRyaXgzeDoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSB1bHRyaXgzMAorCisjREVDIFVsdHJpeCA0LjAgb3IgNC4xIG9uIERFQ3N0YXRpb24sIFZBWHN0YXRpb24sIFZBWCwgZXRjLgordWx0cml4NDA6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBVbHRyaXggNC4wIG9yIDQuMS4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0IC1EVENQU09DS0VUIC1EU0lHX1YgLUREVTQgLUROT0dFVFVTRVJTSEVMTCBcCisJJChLRkxBR1MpIC1PbGltaXQgMTQ1MCIgIkxOS0ZMQUdTID0gLXMiCisKKyNERUMgVWx0cml4IDQuMi00LjUgb24gREVDc3RhdGlvbiwgREVDc3lzdGVtLCBWQVhzdGF0aW9uLCBWQVgsIGV0Yy4KKyNMaWtlIHVsdHJpeDQwLCBleGNlcHQgbm93IEMgY29tcGlsZXIgc3VwcG9ydHMgLU8yIG9wdGltaXphdGlvbi4KK3VsdHJpeDQyOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgVWx0cml4IDQuMiBvciBsYXRlci4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0IC1EVENQU09DS0VUIC1EU0lHX1YgLUROT0dFVFVTRVJTSEVMTCAkKEtGTEFHUykgXAorCS1PMiAtT2xpbWl0IDE3NTAiICJMTktGTEFHUyA9IC1zIgorCitkdTQyOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgS1RBUkdFVD0kJHtLVEFSR0VULSQoQCl9IHVsdHJpeDQyCisKKyNERUMgVWx0cml4IDQuMi00LjUgb24gREVDc3RhdGlvbiwgREVDc3lzdGVtLCBWQVhzdGF0aW9uLCBWQVgsIGV0Yy4KKyNMaWtlIGR1NDIsIGJ1dCB3aXRoIGN1cnNlcyBzdXBwb3J0IGFkZGVkIGFuZCBhIGNvdXBsZSBmZWF0dXJlcy4KK3VsdHJpeDQyYzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFVsdHJpeCA0LjIgb3IgbGF0ZXIuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQtJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENCAtRFRDUFNPQ0tFVCAtRFNJR19WIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1EQ0tfQ1VSU0VTIC1ETk9JS1NEICQoS0ZMQUdTKS1HNiAtTzIgLU9saW1pdCAzMDAwICIgXAorCSJMTktGTEFHUyA9IC1zIiAiTElCUz0gLWxjdXJzZXMgLWx0ZXJtY2FwIgorCit1bHRyaXg0MzoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIENDPSQoQ0MpIENDMj0kKENDMikgXAorCSJLRkxBR1M9LURVTFRSSVg0MyAkKEtGTEFHUykiIEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSB1bHRyaXg0MmMKKwordWx0cml4NDNub3RjcDoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIENDPSQoQ0MpIENDMj0kKENDMikgXAorCSJLRkxBR1M9LURVTFRSSVg0MyAtRE5PTkVUICQoS0ZMQUdTKSIgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSB1bHRyaXg0MmMKKworIyBOT1RFOiBuZWVkIC1ETk9ERUJVRyBvbiBNSVBTIHRvIGF2b2lkIHJlbG9jYXRpb24gZXJyb3JzIGF0IGxpbmsgdGltZS4KKyMgQWN0dWFsbHkgbm93ICg4LjApIHRoYXQgd2UgaGF2ZSBkaXNjb3ZlcmVkIHRoZSAtRyBvcHRpb24gbWF5YmUgZGVidWdnaW5nCisjIGNhbiBiZSBwdXQgYmFjay4KK3VsdHJpeDQ0OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgQ0M9JChDQykgQ0MyPSQoQ0MyKSBcCisJIktGTEFHUz0tRFVMVFJJWDQ0IC1HNyAtRE5PREVCVUcgLURORVRQVFkgLUROT19ERVZUVFkgJChLRkxBR1MpIiBcCisJS1RBUkdFVD0kJHtLVEFSR0VULSQoQCl9IHVsdHJpeDQyYworCit1bHRyaXg0NToKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIENDPSQoQ0MpIENDMj0kKENDMikgXAorCSJLRkxBR1M9LURVTFRSSVg0NSAkKEtGTEFHUyktRE5FVFBUWSAtRE5PX0RFVlRUWSAkKEtGTEFHUykiIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQtJChAKX0gdWx0cml4NDJjCisKK2R1NDJjOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgQ0M9JChDQykgQ0MyPSQoQ0MyKSBcCisJS1RBUkdFVD0kJHtLVEFSR0VULSQoQCl9IHVsdHJpeDQyYworCisjREVDIFVsdHJpeCA0LjNBIG9yIGxhdGVyIG9uIERFQ3N5c3RlbSBhbmQgREVDc3RhdGlvbiA1MDAwLzUwLCAvMTUwIG9yIC8yNjAKKyN3aXRoIE1JUFMgUjR4MDAgcHJvY2Vzc29yLiAgVGhlICItbWlwczMiIHN3aXRjaCBnZW5lcmF0ZXMgUjQwMDAtc3BlY2lmaWMKKyNjb2RlLCB3aGljaCBpcyBmYXN0ZXIgYW5kIG1vcmUgY29tcGFjdCwgYnV0ICp3b24ndCogcnVuIG9uIGVhcmxpZXIKKyNERUNzeXN0ZW1zIGFuZCBERUNzdGF0aW9ucy4KK3VsdHJpeDQzLW1pcHMzOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgVWx0cml4IDQuM0Egb3IgbGF0ZXIsIFI0MDAwIGNwdS4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0IC1EVENQU09DS0VUIC1EU0lHX1YgLUROT0dFVFVTRVJTSEVMTCBcCisJJChLRkxBR1MpIC1PMiAtT2xpbWl0IDE3NTAgLW1pcHMzIiAiTE5LRkxBR1MgPSAtcyAtbWlwczMiCisKK2R1NDMtbWlwczM6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBDQz0kKENDKSBDQzI9JChDQzIpIHVsdHJpeDQzLW1pcHMzCisKKyNERUMgVWx0cml4IDQuM0Egb3IgbGF0ZXIgb24gTUlQUyBSNHgwMDAgYmFzZWQgc3lzdGVtcy4KKyNMaWtlIHVsdHJpeDQzLW1pcHMzIGJ1dCB3aXRoIGN1cnNlcyBzdXBwb3J0IGFkZGVkCit1bHRyaXg0M2MtbWlwczM6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBVbHRyaXggNC4zQSBvciBsYXRlciwgUjQwMDAgY3B1Li4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VULSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQgLURUQ1BTT0NLRVQgLURTSUdfViAtRE5PR0VUVVNFUlNIRUxMIC1EQ0tfQ1VSU0VTIFwKKwkkKEtGTEFHUykgLU8yIC1PbGltaXQgMzAwMCAtbWlwczMiICJMTktGTEFHUyA9IC1zIC1taXBzMyIgXAorCSJMSUJTPSAtbGN1cnNlcyAtbHRlcm1jYXAiCisKK2R1NDNjLW1pcHMzOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgQ0M9JChDQykgQ0MyPSQoQ0MyKSBcCisJS1RBUkdFVD0kJHtLVEFSR0VULSQoQCl9IHVsdHJpeDQzYy1taXBzMworCisjREVDIFVsdHJpeCA0LjQgb24gREVDc3RhdGlvbiA1MDAwLzUwIG9yIC8xNTAgd2l0aCBSNDAwMCBNSVBTIHByb2Nlc3NvciwKKyNvciA1MDAwLzI2MCB3aXRoIFI0NDAwLiAgVGhlICItbWlwczMiIHN3aXRjaCBnZW5lcmF0ZXMgUjQwMDAtc3BlY2lmaWMgY29kZSwKKyN3aGljaCBpcyBmYXN0ZXIgYW5kIG1vcmUgY29tcGFjdCBidXQgKndvbid0KiBydW4gb24gZWFybGllciBERUNzdGF0aW9ucy4KK3VsdHJpeDQ0LW1pcHMzOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgVWx0cml4IDQuNCwgUjQwMDAgY3B1IC4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0IC1EVENQU09DS0VUIC1EU0lHX1YgLUROT0dFVFVTRVJTSEVMTCBcCisJJChLRkxBR1MpIC1PMiAtT2xpbWl0IDE0NTAgLW1pcHMzIiAiTE5LRkxBR1MgPSAtcyAtbWlwczMiCisKK2R1NDQtbWlwczM6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBDQz0kKENDKSBDQzI9JChDQzIpIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQtJChAKX0gdWx0cml4NDRjLW1pcHMzCisKKyNERUMgVWx0cml4IDQuMiBvbiBERUNzdGF0aW9uLCBWQVhzdGF0aW9uLCBWQVgsIGV0YywgU3lzdGVtIFYgUjQgZW52aXJvbm1lbnQKK3VsdHJpeDQyczVyNDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIFVOSVggU3lzdGVtIFYgUjQgb24gVWx0cml4Li4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSBcCisJIkNGTEFHUyA9IC1PMiAtT2xpbWl0IDE1MDAgLURTVlI0IC1ERElSRU5UIC1ESERCVVVDUCAtRE5PR0VUVVNFUlNIRUxMIFwKKwktRFRDUFNPQ0tFVCAkKEtGTEFHUykiICJMTktGTEFHUyA9IC1zIgorCisjT1NGLzEKK29zZjoKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQgLURPU0YgLURfQlNEIC1EVENQU09DS0VUIC1EQ0tfQU5TSUMgLURTSUdfViBcCisJLURDS19DVVJTRVMgLURDS19SVFNDVFMgLURGTkZMT0FUICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1zIiAiTElCUyA9IC1sYnNkIC1sY3Vyc2VzIC1sdGVybWNhcCAtbG0iCisKKyNERUMgT1NGLzEgVjEuMC0xLjMgb24gREVDc3RhdGlvbiwgVkFYLCBBbHBoYSwgb3IgUEMuCitkZWMtb3NmOgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENCAtRE9TRiAtRE9TRjEzIC1EX0JTRCAtRFRDUFNPQ0tFVCAtRENLX0FOU0lDIC1EU0lHX1YgXAorCS1ETk9SRUFMUEFUSCAtRE5PSUtTRCAtRENLX0NVUlNFUyAtRENLX1JUU0NUUyAtREZORkxPQVQgLUROT0RFQlVHIFwKKwktRE5PVU5JQ09ERSAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtbm9uX3NoYXJlZCIgIkxJQlMgPSAtbGJzZCAtbGN1cnNlcyAtbHRlcm1jYXAgLWxtIgorCisjIFRoaXMgb25lIGNhdXNlcyAicmVsb2NhdGlvbiBvdXQtb2YtcmFuZ2UiIGVycm9ycyBpbiB0aGUgbGlua2VyLgorb2xkLWRlYy1vc2Y6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBERUMgT1NGLzEgVjEueC4uLgorCUBlY2hvIElmIHlvdSBhcmUgYnVpbGRpbmcgZm9yIERFQyBPU0YvMSAyLjAsIHBsZWFzZSB1c2UgZGVjLW9zZjIwLgorCUBlY2hvIFJlbW92ZSBvciBhZGp1c3QgLU8yIGFuZC9vciAtT2xpbWl0IGlmIHRoZXkgY2F1c2UgdHJvdWJsZS4KKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgb3NmIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9IC1PMiAtT2xpbWl0IDI0MDAgJChLRkxBR1MpIgorCisjREVDIE9TRi8xIDIuMCBvbiBBbHBoYSBhbmQgcHJvYmFibHkgbm93aGVyZSBlbHNlLgorI1RoZSBvbmx5IGRpZmZlcmVuY2UgZnJvbSBPU0YvMSBpcyB0aGF0IG9wdGltaXphdGlvbiBpcyBvbWl0dGVkLgorI1RoZSBvcHRpbWl6ZWQgdmVyc2lvbiBnZXRzIHN0cmFuZ2UgcnVudGltZSBlcnJvcnMsIGxpa2UgdGhlIFBBVVNFIGNvbW1hbmQKKyNub3Qgd29ya2luZy4gIEFkZCAiLXVuc2lnbmVkIiB0byBtYWtlIGFsbCBjaGFycyB1bnNpZ25lZC4KK2RlYy1vc2YyMDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIERFQyBPU0YvMSBWMi4wLi4uCisJQGVjaG8gT3B0aW1pemF0aW9uIG9taXR0ZWQgYmVjYXVzZSBpdCBjYXVzZXMgcnVudGltZSBlcnJvcnMuCisJQGVjaG8gU2VlIGNvbW1lbnRzIGluIG1ha2VmaWxlLgorCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSBvc2YgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0gLURPU0YyMCAkKEtGTEFHUykiCisKK2RlYy1vc2YzMDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIERFQyBPU0YvMSBWMy4wLi4uCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIG9zZiBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPSAtRE9TRjMwIC1PMiAtT2xpbWl0IDI0MDAgJChLRkxBR1MpIgorCisjRGlnaXRhbCBVTklYIDMuMgorIyBNdXN0IGNvbXBpbGUgY2t1dXNbNnhdLmMgc2VwYXJhdGVseSB3aXRob3V0IG9wdGltaXphdGlvbiBvdGhlcndpc2UKKyMgdGhlIG9wdGltaXplciBkdW1wcyBjb3JlIC0ga2VlcCBDRkxBR1MgaGVyZSBpbiBzeW5jIHdpdGggdGhvc2UgZnJvbSBvc2YuCitkdTMyOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRGlnaXRhbCBVTklYIDMuMi4uLgorCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSBja3V1czYuJChFWFQpIFwKKwkiQ0ZMQUdTPSAtREJTRDQgLURPU0YgLURfQlNEIC1EVENQU09DS0VUIC1EQ0tfQU5TSUMgLURTSUdfViBcCisJLURDS19DVVJTRVMgLURDS19SVFNDVFMgLURGTkZMT0FUIC1ET1NGMzIgLURIREJVVUNQICQoS0ZMQUdTKSIKKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgY2t1dXN4LiQoRVhUKSBcCisJIkNGTEFHUz0gLURCU0Q0IC1ET1NGIC1EX0JTRCAtRFRDUFNPQ0tFVCAtRENLX0FOU0lDIC1EU0lHX1YgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUlRTQ1RTIC1ERk5GTE9BVCAtRE9TRjMyIC1ESERCVVVDUCAkKEtGTEFHUykiCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIG9zZiBcCisJIktGTEFHUz0gLURPU0YzMiAtREhEQlVVQ1AgLU8yIC1PbGltaXQgMzIwMCAkKEtGTEFHUykiCisKK2RlYy1vc2YzMjoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIENDPSQoQ0MpIENDMj0kKENDMikgZHUzMiBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCisjRGlnaXRhbCBVTklYIDQuMCB0aHJvdWdoIDQuMEQgKHVzZSB0cnU2NCB0YXJnZXRzIGZvciA0LjBFIGFuZCBhYm92ZSkuLi4KK2R1NDA6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBEaWdpdGFsIFVOSVggNC4wLi4uCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIG9zZiBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPSAtRE9TRjQwIC1ESERCVVVDUCAtREZORkxPQVQgXAorCS11bnNpZ25lZCAtc3RkMSAtTzMgLU9saW1pdCAyNDAwICQoS0ZMQUdTKSIgIkxJQlM9LWxtIgorCitkdTQwZ2NjOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRGlnaXRhbCBVTklYIDQuMCB3aXRoIGdjYyAuLi4KKwkkKE1BS0UpIG9zZiBDQz1nY2MgQ0MyPWdjYyBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPSAtRE9TRjQwIC1ESERCVVVDUCAkKEtGTEFHUykiCisKKyNUcnU2NCBVbml4IDQuMEUKK3RydTY0LTQwZToKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFRydTY0IFVOSVggNC4wRS4uLgorCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSBvc2YgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0gLURPU0Y0MCAtRE9TRjQwRSAtRFRSVTY0IC1ESERCVVVDUCAtREZORkxPQVQgLUROT0NPVEZNQyBcCisJLXVuc2lnbmVkIC1zdGQxIC1PMyAtT2xpbWl0IDI0MDAgJChLRkxBR1MpIiAiTElCUz0tbG0iCisKK3RydTY0LTQwZjoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFRydTY0IFVOSVggNC4wRi4uLgorCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSBvc2YgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0gLURPU0Y0MCAtRE9TRjQwRiAtRFRSVTY0IC1ESERCVVVDUCAtREZORkxPQVQgLUROT0NPVEZNQyBcCisJLXVuc2lnbmVkIC1zdGQxIC1PMyAtT2xpbWl0IDI0MDAgJChLRkxBR1MpIiAiTElCUz0tbG0iCisKK3RydTY0LTQwZzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFRydTY0IFVOSVggNC4wRy4uLgorCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSBvc2YgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0gLURPU0Y0MCAtRE9TRjQwRyAtRFRSVTY0IC1ESERCVVVDUCAtREZORkxPQVQgLUROT0NPVEZNQyBcCisJLXVuc2lnbmVkIC1zdGQxIC1PMyAtT2xpbWl0IDI0MDAgJChLRkxBR1MpIiAiTElCUz0tbG0iCisKK3RydTY0LTUwYToKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFRydTY0IFVOSVggNS4wQS4uLgorCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSBvc2YgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0gLURUUlU2NCAtRE9TRjUwIC1ESERCVVVDUCBcCisJLXVuc2lnbmVkIC1zdGQxIC1PMyAtT2xpbWl0IDI0MDAgJChLRkxBR1MpIgorCit0cnU2NC01MWE6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBUcnU2NCBVTklYIDUuMUEuLi4KKwkkKE1BS0UpIENDPSQoQ0MpIENDMj0kKENDMikgb3NmIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9IC1EVFJVNjQgLURPU0Y1MCAtRE9TRjUxQSAtREhEQlVVQ1AgXAorCS11bnNpZ25lZCAtc3RkMSAtTzMgLU9saW1pdCAyNDAwICQoS0ZMQUdTKSIKKwordHJ1NjQtNTFiOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgVHJ1NjQgVU5JWCA1LjFBLi4uCisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIG9zZiBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPSAtRFRSVTY0IC1ET1NGNTAgLURPU0Y1MUEgLURPU0Y1MUIgLURIREJVVUNQIFwKKwktdW5zaWduZWQgLXN0ZDEgLU8zIC1PbGltaXQgMjQwMCAkKEtGTEFHUykiCisKK2R1NTA6CisJJChNQUtFKSBDQz0kKENDKSBDQzI9JChDQzIpIHRydTY0LTUwYSBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2R1NDAtcmlkaWN1bG91cy1jaGVja2luZzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIERpZ2l0YWwgVU5JWCA0LjAuCisJQGVjaG8gQ2hlY2tpbmcgZXZlcnl0aGluZyAtIGFzc3VtZXMgREVDQy4uLgorCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSBvc2YgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0gLURPU0Y0MCAtREhEQlVVQ1AgLXcwIC13YXJucHJvdG9zIC1jaGVjayAtcG9ydGFibGUgXAorCS11bnNpZ25lZCAtc3RkMSAtTzMgLU9saW1pdCAxNzYwICQoS0ZMQUdTKSIKKworI1NlcXVlbnQgRFlOSVgvcHR4IDEuMi4xCitkeW5peHB0eDEyOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU2VxdWVudCBEWU5JWC9wdHggMS4yLjEuLi4KKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIC1EUFRYIC1ETk9HRVRVU0VSU0hFTEwgLUROT0xFQVJOIFwKKwktRFBJRF9UPXBpZF90IC1EVUlEX1Q9dWlkX3QgLURHSURfVD1naWRfdCAkKEtGTEFHUykgLWkgLU8iIFwKKwkiTE5LRkxBR1MgPSAtaSIKKworI1NlcXVlbnQgRFlOSVgvcHR4IDEuMyBvciAxLjQKK2R5bml4cHR4MTM6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTZXF1ZW50IERZTklYL3B0eCAxLjMgVENQL0lQLi4uCisJJChNQUtFKSB4ZXJtaXQgIkNGTEFHUz0gLU8gS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJLURTVlIzIC1ERElSRU5UIC1ESERCVVVDUCAtRFBUWCAtRENLX1BPTEwgLUROT0dFVFVTRVJTSEVMTCBcCisJLURQSURfVD1waWRfdCAtRFVJRF9UPXVpZF90IC1ER0lEX1Q9Z2lkX3QgLURUQ1BTT0NLRVQgJChLRkxBR1MpIC1pIiBcCisJIkxOS0ZMQUdTID0gLWkiICJMSUJTID0gLWxzb2NrZXQgLWxpbmV0IC1sbnNsIgorCisjU2VxdWVudCBEWU5JWC9wdHggMi4wLCBBTlNJIEMgY29tcGlsYXRpb24KKyNTaG91bGQgd29yayBvbiBhbnkgaGFyZHdhcmUgcGxhdGZvcm0gd2hlbiBEWU5JWC9wdHggcnVucywgaW5jbHVkaW5nCisjMzg2LCA0ODYsIFBlbnRpdW0uCitkeW5peHB0eDIwOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFBPU0lYLCBTZXF1ZW50IERZTklYL3B0eCAyLjAuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURQT1NJWCAtREhEQlVVQ1AgLURUQ1BTT0NLRVQgXAorCS1EV0FJVF9UPWludCAtRFBUWCAtRE5PR0VUVVNFUlNIRUxMICQoS0ZMQUdTKSAtTyIgXAorCSJMSUJTID0gLWxzb2NrZXQgLWxpbmV0IC1sbnNsIgorCisjU2VxdWVudCBEWU5JWC9wdHggMi4wLCBBTlNJIEMgY29tcGlsYXRpb24sIHdpdGggY3Vyc2VzCitkeW5peHB0eDIwYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBQT1NJWCwgU2VxdWVudCBEWU5JWC9wdHggMi4wLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EUE9TSVggLURIREJVVUNQIC1EVENQU09DS0VUIC1EV0FJVF9UPWludCAtRFBUWCAtRENLX0NVUlNFUyBcCisJLURDS19ORVdURVJNIC1ETk9HRVRVU0VSU0hFTEwgJChLRkxBR1MpIC1PIiBcCisJIkxJQlMgPSAtbHNvY2tldCAtbGluZXQgLWxuc2wgLWxjdXJzZXMgLWx0ZXJtY2FwIgorCisjU2VxdWVudCBEWU5JWC9wdHggMi4xLjYsIDgwNDg2LCBBTlNJIEMgY29tcGlsYXRpb24sIHdpdGggY3Vyc2VzOgorIyAtWGEgLS0gdXNlIEFOU0kgY29tcGlsZXIuCisjIC1XYywtcHcgLS0gc3VwcHJlc3MgcG9ydGFiaWxpdHkgd2FybmluZ3MuCisjIC1XYywtaTM4NiAtLSA4MDM4NiBjcHUuCisjIC1XYywtaTQ4NiAtLSA4MDQ4NiBjcHUuCisjIC1XYywtUDUgLS0gUGVudGl1bSAoZGVmYXVsdCkuCisjIC1XYywtTzMgLS0gaGlnaGVzdCBvcHRpbWl6YXRpb24uCisjIC1XYSwtTjE3MDYxIC0tIGluY3JlYXNlIHN5bWJvbCB0YWJsZSBmcm9tIGRlZmF1bHQgb2YgMTUwMTMgZm9yIGNrY3VuaS5jLgorIyBFYXJseSB2ZXJzaW9ucyBvZiBEWU5JWC9wdHggMi4xLnggbWF5IG5lZWQgLURDS19QT0xMIGluc3RlYWQgb2YgLURTRUxFQ1QuCisjIEFkZCAiJCYiIGFmdGVyIHRoZSBjb2xvbiBpbiB0aGUgInhlcm1pdCIgdGFyZ2V0IGZvciBwYXJhbGxlbCBtYWtlcy4KK2R5bml4cHR4MjE2YzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBQT1NJWCwgU2VxdWVudCBEWU5JWC9wdHggMi4xLjYnCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURQT1NJWCAtREhEQlVVQ1AgLUREWU5BTUlDIC1EVENQU09DS0VUIFwKKwktRFNFTEVDVCAtRENLX1JFRElSIC1EQ0tfTkFXUyAtRENLX1dSRUZSRVNIIC1EU1dfQUNDX0lEIFwKKwktRFRDUF9OT0RFTEFZPTEgLURUUk1CVUZMPTIwNDggLURCSUdCVUZPSyAtREhBRERSTElTVCBcCisJLURQVFggIC1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRE5PR0VUVVNFUlNIRUxMIC1ETk9SRUFMUEFUSCBcCisJJChLRkxBR1MpIC1YYSAtV2MsLXB3IC1XYywtaTQ4NiAtV2MsLU8zIC1XYSwtTjE3MDYxIiBcCisJIkxJQlMgPSAtbFhic2QgLWxzZXEgLWxzb2NrZXQgLWxpbmV0IC1sbnNsIC1sbWFsbG9jIC1sbSAtbGN1cnNlcyIgXAorCSJMTktGTEFHUyA9IC1zIgorCisjU2VxdWVudCBEWU5JWC9wdHggMi4xLjYsIGdjYyAyLjcuMi4yLCB3aXRoIGN1cnNlczoKK2R5bml4cHR4MjE2Y2djYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBQT1NJWCwgU2VxdWVudCBEWU5JWC9wdHggMi4xLjYgZ2NjJworCSQoTUFLRSkgeGVybWl0ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURQT1NJWCAtREhEQlVVQ1AgLUREWU5BTUlDIC1EVENQU09DS0VUIFwKKwktRFNFTEVDVCAtRENLX1JFRElSIC1EQ0tfTkFXUyAtRENLX1dSRUZSRVNIIC1EU1dfQUNDX0lEIFwKKwktRFRDUF9OT0RFTEFZPTEgLURUUk1CVUZMPTIwNDggLURCSUdCVUZPSyAtREhBRERSTElTVCBcCisJLURQVFggIC1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRE5PR0VUVVNFUlNIRUxMIC1ETk9SRUFMUEFUSCBcCisJJChLRkxBR1MpIC1PMyAtcGlwZSAtZnVuc2lnbmVkLWNoYXIiIFwKKwkiTElCUyA9IC1sWGJzZCAtbHNlcSAtbHNvY2tldCAtbGluZXQgLWxuc2wgLWxtYWxsb2MgLWxtIC1sY3Vyc2VzIiBcCisJIkxOS0ZMQUdTID0gLXMiCisKKyNTZXF1ZW50IERZTklYL3B0eCA0LjAsIEFOU0kgQyBjb21waWxhdGlvbiwgd2l0aCBjdXJzZXMKK2R5bml4cHR4NDFjOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFBPU0lYLCBTZXF1ZW50IERZTklYL3B0eCA0LjAuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURQT1NJWCAtREhEQlVVQ1AgLURUQ1BTT0NLRVQgXAorCS1EV0FJVF9UPWludCAtRFBUWCAtRFBUWDQgLURDS19DVVJTRVMgLURDS19ORVdURVJNIFwKKwktRE5PR0VUVVNFUlNIRUxMICQoS0ZMQUdTKSAtTyIgXAorCSJMSUJTID0gLWxzb2NrZXQgLWxuc2wgLWxjdXJzZXMgLWx0ZXJtY2FwIgorCisjU2VxdWVudCBEWU5JWC9wdHggNC40LCBBTlNJIEMgY29tcGlsYXRpb24sIHdpdGggY3Vyc2VzCitkeW5peHB0eDQ0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFBPU0lYLCBTZXF1ZW50IERZTklYL3B0eCA0LjQuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURQVFggLURQVFg0IC1EUE9TSVggLURIREJVVUNQIC1EVENQU09DS0VUIC1EV0FJVF9UPWludCBcCisJLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1EQklHQlVGT0sgLURTRUxFQ1QgLUROT0dFVFVTRVJTSEVMTCBcCisJJChLRkxBR1MpIC1PIiAiTElCUyA9IC1sc29ja2V0IC1sbnNsIC1sY3Vyc2VzIC1sdGVybWNhcCIKKworI1NlcXVlbnQgRFlOSVggMy4wLngKK2R5bml4MzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNlcXVlbnQgRFlOSVggMy4wLnguLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQzIC1EQUNVQ05UUkwgLURUQ1BTT0NLRVQgLU8gXAorCS1EUFdVSURfVD1pbnQgLURHSURfVD1pbnQgJChLRkxBR1MpIgorCisjU2VxdWVudCBEWU5JWCAzLjAueCwgbm8gQUNVQ05UUkwKK2R5bml4M25vYWN1OgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU2VxdWVudCBEWU5JWCAzLjAueC4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDMgLURMQ0tESVIgLURUQ1BTT0NLRVQgLU8gXAorCS1EVUlEX1Q9aW50IC1ER0lEX1Q9aW50ICQoS0ZMQUdTKSIKKworI1NlcXVlbnQgRFlOSVggMy4xLngKK2R5bml4MzE6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTZXF1ZW50IERZTklYIDMuMS54Li4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLU8gLUREQ0xQT1BFTiAtRExDS0RJUiAtREJTRDQgLURUQ1BTT0NLRVQgJChLRkxBR1MpIgorCisjU2VxdWVudCBEWU5JWCAzLjEuMiwgYXMgYWJvdmUgYnV0IHdpdGggY3Vyc2VzLCB0byBiZSBjb21waWxlZCBieSBnY2MgMi4zLjMuCitkeW5peDMxYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTZXF1ZW50IERZTklYIDMuMS4yLCBjdXJzZXMuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLU8yIC1ERENMUE9QRU4gLURBQ1VDTlRSTCBcCisJLURCU0Q0MyAtRFRDUFNPQ0tFVCAtRENLX0NVUlNFUyAtRFVJRF9UPWludCBcCisJJChLRkxBR1MpIiAiTElCUz0gLWxjdXJzZXMgLWx0ZXJtY2FwIgorCisjQ29udmV4IEMxIHdpdGggQmVya2VsZXkgVW5peAorY29udmV4OgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQ29udmV4IEMxIC8gQlNELi4uCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0IC1ETk9MRUFSTiAkKEtGTEFHUykgLURtc2xlZXA9bW5hcCIKKworI0NvbnZleCBDMjEwIHdpdGggQ29udmV4L09TIDgKK2NvbnZleDg6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBDb252ZXggQzIxMCB3aXRoIE9TIDgKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJTRDQgLURUQ1BTT0NLRVQgLUROT0RFQlVHIC1ERElSRU5UIC1ETk9GSUxFSCBcCisJJChLRkxBR1MpIC1EU0lHX1YgLURtc2xlZXA9bW5hcCIKKworI0NvbnZleCBDMiB3aXRoIENvbnZleCBPUyA5LjEgKHNob3VsZCBhbHNvIHdvcmsgd2l0aCA4LjEgb3IgbGF0ZXIpCisjd2l0aCBBTlNJIEMgY29tcGlsZXIsIHVzZXMgQlNEIDQuMyB1dWNwIGxvY2tmaWxlIGNvbnZlbnRpb24uCitjb252ZXg5OgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQ29udmV4IEMyMTAgd2l0aCBPUyA5LjEKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRFBPU0lYIC1EQ09OVkVYOSAtRE5PSUVYVEVOIC1ERElSRU5UIC1ETk9GSUxFSCAtRFRDUFNPQ0tFVCBcCisJLURfX1NURENfXyAtRExDS0RJUiAtRG1zbGVlcD1tbmFwIC1PIC1leHQgLXRtIGMxICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1leHQiCisKKyNDb252ZXggQzIgd2l0aCBDb252ZXggT1MgMTAuMSBvciBsYXRlcgorI3dpdGggZ2NjIDIueCBDIGNvbXBpbGVyCitjb252ZXgxMGdjYzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIENvbnZleCBDMiB3aXRoIE9TIDEwLjEgdXNpbmcgZ2NjCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURQT1NJWCAtRENPTlZFWDkgLUROT0lFWFRFTiAtRERJUkVOVCAtRE5PRklMRUggLURUQ1BTT0NLRVQgXAorCS1EX19TVERDX18gIC1EbXNsZWVwPW1uYXAgLU8yICQoS0ZMQUdTKSIgQ0M9Z2NjIENDMj1nY2MKKworI0NyYXkgWC1NUCBvciBZLU1QIFVOSUNPUyA2Lnggb3IgNy54LgorI05PVEU6IE5QUk9DIHRlbGxzIGhvdyBtYW55IHBhcmFsbGVsIG1ha2VzIHRvIHJ1bi4gIElmIHlvdXIgQ3JheSBoYXMgbXVsdGlwbGUKKyNwcm9jZXNzb3JzLCB5b3UgY2FuIHNldCBOUFJPQyB1cCB0byB0aGUgbnVtYmVyIG9mIENQVXMsIGUuZy4gTlBST0M9MTYuCitjcmF5OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIENyYXkgWC9ZLU1QIFVOSUNPUyA2Lnggb3IgNy4wLi4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBOUFJPQz0xIFwKKwkiQ0ZMQUdTPSAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIC1EVENQU09DS0VUICQoS0ZMQUdTKSAtTzEiCisKKyNDcmF5IFgtTVAgb3IgWS1NUCBVTklDT1MgOC4wIEFscGhhLgorY3JheTg6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQ3JheSBYL1ktTVAgVU5JQ09TIDguMCBBbHBoYS4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gTlBST0M9MSBcCisJIkNGTEFHUz0gLURTVlI0IC1ERElSRU5UIC1ESERCVVVDUCAtRFRDUFNPQ0tFVCAkKEtGTEFHUykgLU8xIgorCisjQ3JheSBYLU1QIG9yIFktTVAgVU5JQ09TIDkuMC4KKyNUaGlzIG9uZSB3YXMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IGZvciBDLUtlcm1pdCA4LjAuMjA5LgorI0VhcmxpZXIgdmVyc2lvbnMgb2YgVW5pY29zIHdpbGwgcHJvYmFibHkgbmVlZCB0aGUgc2FtZSBmbGFncy4KK2NyYXk5OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIENyYXkgWC9ZLU1QIFVOSUNPUyA5LjAuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IE5QUk9DPTEgXAorCSJDRkxBR1M9IC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgLUROT0xGREVWTk8gXAorCS1EVENQU09DS0VUICQoS0ZMQUdTKSAtTzEiCisKKyNDcmF5LTIgb3IgQ3JheSAzLUNTT1MKKyNOT1RFOiBOUFJPQyB0ZWxscyBob3cgbWFueSBwYXJhbGxlbCBtYWtlcyB0byBydW4uICBJZiB5b3VyIENyYXkgaGFzIG11bHRpcGxlCisjcHJvY2Vzc29ycywgeW91IGNhbiBzZXQgTlBST0MgdXAgdG8gdGhlIG51bWJlciBvZiBDUFVzLCBlLmcuIE5QUk9DPTE2LgorY3JheWNzb3M6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQ3JheS0yLzMgQ1NPUworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gTlBST0M9MSBcCisJIkNGTEFHUz0gLURTVlIzIC1ERElSRU5UIC1ESERCVVVDUCAtRFRDUFNPQ0tFVCBcCisJJChLRkxBR1MpIC1EQ0tfQU5TSUMgLURDS19DVVJTRVMiICJMSUJTPS1sbmV0IgorCisjTmVYVFNURVAgMS4wIHRocm91Z2ggMy4yLgorI0luY2x1ZGVzIGZ1bGxzY3JlZW4gZmlsZSB0cmFuc2ZlciBkaXNwbGF5IChjdXJzZXMpIGFuZCBUQ1AvSVAgc3VwcG9ydC4KKyNVc2VzIHNoYXJlZCBsaWJyYXJ5IHRvIG1ha2UgZXhlY3V0YWJsZSBwcm9ncmFtIGFib3V0IDgwSyBzbWFsbGVyLgorI1JlbW92ZSAiTElCUyA9IC1sc3lzX3MiIGlmIHRoaXMgY2F1c2VzIHRyb3VibGUuCituZXh0OgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTmVYVFNURVAuLi4KKwlAZWNobyAnSWYgeW91IGdldCBlcnJvcnMgaW4gY2t1dGlvLmMgYWJvdXQgd19TLCB3X1QsIGV0YywnCisJQGVjaG8gJ2FkZCBLRkdMQUdTPS1ETk9SRURJUkVDVCB0byB5b3VyIG1ha2UgY29tbWFuZC4nCisJJChNQUtFKSB4ZXJtaXQgQ0M9JChDQykgQ0MyPSQoQ0MyKSBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRE5FWFQgLURUQ1BTT0NLRVQgLURMQ0tESVIgLUROT1BVVEVOViAtREZORkxPQVQgXAorCS1waXBlIC1EQ0tfQ1VSU0VTICQoS0ZMQUdTKSAtTyAtdyIgIkxJQlMgPSAtbHN5c19zIC1sY3Vyc2VzIC1sdGVybWNhcCIKKworbmV4dGM6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBDQz0kKENDKSBDQzI9JChDQzIpIG5leHQgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworbmV4dGc6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBDQz0kKENDKSBDQzI9JChDQzIpIG5leHQgXAorCUtGTEFHUz0tV2FsbCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK25leHRnYzoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIENDPSQoQ0MpIENDMj0kKENDMikgbmV4dCBcCisJS0ZMQUdTPS1XYWxsIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworI05lWFRTVEVQIDMuMy4KKyNJbmNsdWRlcyBmdWxsc2NyZWVuIGZpbGUgdHJhbnNmZXIgZGlzcGxheSBhbmQgVENQL0lQLgorbmV4dDMzOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTmVYVFNURVAgMy4zLi4uCisJJChNQUtFKSB4ZXJtaXQgQ0M9JChDQykgQ0MyPSQoQ0MyKSBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRE5FWFQzMyAtRFRDUFNPQ0tFVCAtRExDS0RJUiAtRE5PUFVURU5WIC1ERk5GTE9BVCBcCisJLXBpcGUgLURDS19DVVJTRVMgJChLRkxBR1MpIC1PIC13IiAiTElCUyA9IC1sc3lzX3MgLWxjdXJzZXMgLWx0ZXJtY2FwIgorCisjT1BFTlNURVAgNC4yIGZvciBTcGFyYywgbTY4MHgwLCBIUCBQQS1SSVNDLCBhbmQgSW50ZWwuCisjSW5jbHVkZXMgZnVsbHNjcmVlbiBmaWxlIHRyYW5zZmVyIGRpc3BsYXkgYW5kIFRDUC9JUC4KKyNja2Nwcm8uYyBjb21waWxlZCB3aXRob3V0IG9wdGltaXphdGlvbiBiZWNhdXNlIGl0IGNyYXNoZXMgdGhlIGNvbXBpbGVyLgorb3BlbnN0ZXA0MjoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE9QRU5TVEVQIDQuMi4uLgorCSQoTUFLRSkgY2tjcHJvLiQoRVhUKSBcCisJIkNGTEFHUz0gLURPUEVOU1RFUDQyIC1ETkVYVDMzIC1EVENQU09DS0VUIC1ETENLRElSIC1ETk9QVVRFTlYgXAorCS1ERk5GTE9BVCAtcGlwZSAtRENLX0NVUlNFUyAkKEtGTEFHUykgLXciCisJJChNQUtFKSB4ZXJtaXQgQ0M9JChDQykgQ0MyPSQoQ0MyKSBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRE9QRU5TVEVQNDIgLURORVhUMzMgLURUQ1BTT0NLRVQgLURMQ0tESVIgLUROT1BVVEVOViBcCisJLURGTkZMT0FUIC1waXBlIC1EQ0tfQ1VSU0VTICQoS0ZMQUdTKSAtTyAtdyIgXAorCSJMSUJTID0gLWxzeXNfcyAtbGN1cnNlcyAtbHRlcm1jYXAiCisKKyNOZVhUIHdpdGggbWFsbG9jIGRlYnVnZ2VyCituZXh0bWQ6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBOZVhUIHdpdGggbWFsbG9jIGRlYnVnZ2luZy4uLgorCSQoTUFLRSkgbWVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1ETkVYVCAtRFRDUFNPQ0tFVCAtRExDS0RJUiAtRE5PUFVURU5WIC1ERk5GTE9BVCBcCisJLURDS19DVVJTRVMgJChLRkxBR1MpIC1PIC13IC1EbWFsbG9jPWRtYWxsb2MgLURmcmVlPWRmcmVlIC1ETURFQlVHIiBcCisJIkxJQlMgPSAtbHN5c19zIC1sY3Vyc2VzIC1sdGVybWNhcCIKKworI0J1aWxkIGZvciBOZVhUU1RFUCB3aXRoICJmYXQiIGJpbmFyaWVzIChNQUJzKSB0aGF0IHJ1biBvbiBib3RoIE1vdG9yb2xhCisjYW5kIEludGVsIHBsYXRmb3Jtcy4KK25leHRmYXQ6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBDQz0kKENDKSBDQzI9JChDQzIpIFwKKwluZXh0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LVdhbGwgLWFyY2ggbTY4ayAtYXJjaCBpMzg2IiAiTE5LRkxBR1MgPSAtYXJjaCBtNjhrIC1hcmNoIGkzODYiCisKKyNOZVhUU1RFUCBvbiBJbnRlbCBQbGF0Zm9ybXMuCituZXh0NDg2OgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTmVYVFNURVAgb24gSW50ZWwgUGxhdGZvcm1zLi4uCisJQGVjaG8gJ0lmIHlvdSBnZXQgZXJyb3JzIGluIGNrdXRpby5jIGFib3V0IHdfUywgd19ULCBldGMsJworCUBlY2hvICdhZGQgS0ZHTEFHUz1ELUROT1JFRElSRUNUIHRvIHlvdXIgbWFrZSBjb21tYW5kLicKKwkkKE1BS0UpIHhlcm1pdCBDQz0kKENDKSBDQzI9JChDQzIpIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1ETkVYVCAtRFRDUFNPQ0tFVCAtRExDS0RJUiAtRE5PUFVURU5WIC1ERk5GTE9BVCBcCisJLUROT0RFQlVHIC1PMyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZnNjaGVkdWxlLWluc25zMiAtcGlwZSBcCisJLURDS19DVVJTRVMgJChLRkxBR1MpIC13IiAiTElCUyA9IC1sc3lzX3MgLWxjdXJzZXMgLWx0ZXJtY2FwIgorCisjU2luZ2xlIGJpbmFyeSB0aGF0IHJ1bnMgb24gTmVYVCA2ODAzMCBhbmQgNjgwNDAsIEludGVsLCBIUCwgYW5kIFNwYXJjLAorI2FzIHdlbGwgYXMgb24gT3BlblN0ZXAvTWFjaC4KK25leHRxdWFkZmF0OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgQ0M9JChDQykgQ0MyPSQoQ0MyKSBuZXh0IFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1XYWxsIC1hcmNoIG02OGsgLWFyY2ggaTM4NiAtYXJjaCBocHBhIC1hcmNoIHNwYXJjIiBcCisJIkxOS0ZMQUdTID0gLWFyY2ggbTY4ayAtYXJjaCBpMzg2IC1hcmNoIGhwcGEgLWFyY2ggc3BhcmMiCisKKyNCZUJveAorYmVib3hkcjc6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgdGhlIEJlQm94Li4uJworCUBlY2hvICdMaW5rIHN0ZXAgd2lsbCBmYWlsIHdpdGggZGVmYXVsdCBNZXRyb3dvcmtzIGxpbmtlciA2NEsgbGltaXQuJworCUBlY2hvICdDb2RlIFdhcnJpb3IgR29sZCByZXF1aXJlZCB0byBsaW5rIGJpZyBwcm9ncmFtcy4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNDPS9ib290L2RldmVsb3AvdG9vbHMvbXdjYyIgIkNDMj0vYm9vdC9kZXZlbG9wL3Rvb2xzL213bGQiIFwKKwkiQ0ZMQUdTPSAtREJFQk9YIC1EQkVfRFJfNyAtRFBPU0lYIC1ETk9VVUNQIC1ETk9MRUFSTiAkKEtGTEFHUykgLU8iCisKKyNCZUJveCBCZU9TIERSNyBvbmx5CitiZWJveDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBCZUJveC4uLicKKwlAZWNobyAnTGluayBzdGVwIHdpbGwgZmFpbCB3aXRoIGRlZmF1bHQgTWV0cm93b3JrcyBsaW5rZXIgNjRLIGxpbWl0LicKKwlAZWNobyAnQ29kZSBXYXJyaW9yIFBybyAzLjAgZm9yIEJlQm94IHJlcXVpcmVkIHRvIGxpbmsgYmlnIHByb2dyYW1zLicKKwkkKE1BS0UpIHdlcm1pdCAiQ0M9bXdjYyIgIkNDMj1td2xkIiBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREJFQk9YIC1EUE9TSVggLUROT0xFQVJOIC1ETk9VVUNQICQoS0ZMQUdTKSAtTyIKKworI0JlT1MgNC41CisjV2UgaGF2ZSB0byB1c2UgdGhlIHdlcm1pdCB0YXJnZXQgYmVjYXVzZSAnZmRfc2V0JyBpcyB1bmtub3duLgorYmVvczQ1OgorCSQoTUFLRSkgd2VybWl0ICJDQz0kKENDKSIgIkNDMj0kKENDMikiIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQkVPUyAtREJFT1M0NSAtRFBPU0lYIC1ETk9JS1NEIC1ETk9SRUFMUEFUSCAtRFNZU1RJTUVIIFwKKwktRE5PQ09URk1DIC1ETk9VVUNQIC1ETk9MRUFSTiAkKEtGTEFHUykgLU8iIFwKKwkiTElCUyA9ICQoTElCUykiCisKKyNCZU9TIDQuNQorYmVvczQ1bmV0OgorCSQoTUFLRSkgQ0M9JChDQykgQ0MyPSQoQ0MyKSBiZW9zNDUgXAorCSJLRkxBR1M9LURUQ1BTT0NLRVQgLUROT19ETlNfU1JWICQoS0ZMQUdTKSIgIkxJQlM9LWxuZXQgLWxuZXRhcGkiCisKKyNQbGFuIDkgZnJvbSBCZWxsIExhYnMKK3BsYW45OgorCUBlY2hvICdDLUtlcm1pdCBmb3IgUGxhbiA5IGZyb20gQmVsbCBMYWJzIC0gY2FsbGluZyBja3BrZXIubWsuLi4nCisJbWFrZSAtZiBja3BrZXIubWsKKworI1BPU0lYCitwb3NpeDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBwdXJlIFBPU0lYLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EUE9TSVggLUROT1VVQ1AgLUROT0xFQVJOICQoS0ZMQUdTKSAtTyIKKworIyBQb3dlck1BWCBPUyAoU1ZSNCkgZnJvbSBDb25jdXJyZW50ICh0ZXN0ZWQgb24gUG93ZXJNQVggNS4xKQorcG93ZXJtYXg6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQ29uY3VycmVudCBQb3dlck1BWCBPUy4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURTVlI0IC1ERElSRU5UIC1ESERCVVVDUCAtRFBPV0VSTUFYIFwKKwktRE5FVFBUWSAtREhBVkVfU1RSRUFNUyAtREhBVkVfR1JBTlRQVCAtREhBVkVfUFRTTkFNRSAtRFBVU0hfUFRFTSBcCisJLURQVVNIX0xEVEVSTSAtRFBVU0hfVFRDT01QQVQgXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgLURDS19DVVJTRVMgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sc29ja2V0IC1sbnNsIC1scmVzb2x2IC1sY3Vyc2VzIC1sZ2VuIC1sYyAtbHVjYmMiCisKKyNCZXJrZWxleSBTb2Z0d2FyZSBEZXNpZ24gSW5jLiBCU0RJCisjIFN1YnN0aXR1dGUgIkxJQlM9IC1sbmV3Y3Vyc2VzIC1sdGVybWNhcCIgaWYgZGVzaXJlZC4KK2JzZGk6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQlNESSAuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0NCAtRFNFVFJFVUlEIC1EU1dfQUNDX0lEIC1EQklHQlVGT0sgLURGSVhDUlRTQ1RTIFwKKwktRFRDUFNPQ0tFVCAtRENLX0NVUlNFUyAtREZORkxPQVQgJChLRkxBR1MpIC1PIiBcCisJIkxJQlM9IC1sY3Vyc2VzIC1sdGVybWNhcCAtbG0iCisKKyNCZXJrZWxleSBTb2Z0d2FyZSBEZXNpZ24gSW5jLiBCU0RJIC0gaGFzIGhpZ2hlciBzZXJpYWwgc3BlZWRzIHRoYW4gMS54LgorYnNkaTI6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBDQz0kKENDKSBDQzI9JChDQzIpIGJzZGkgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUz0tREJTREkyICQoS0ZMQUdTKSIKKworYnNkaTM6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBDQz0kKENDKSBDQzI9JChDQzIpIGJzZGkgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUz0tREJTREkyIC1EQlNESTMgJChLRkxBR1MpIgorCitic2RpNDoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIENDPSQoQ0MpIENDMj0kKENDMikgYnNkaSBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tREJTREkyIC1EQlNESTMgLURCU0RJNCAtRFRQVVRTRk5UWVBFPXZvaWQgLURUUFVUU0lTVk9JRCBcCisJLW00ODYgJChLRkxBR1MpIgorCisjIChvbGQgbmFtZSBmb3IgdGhlIGFib3ZlKQorYnNkaXBvc2l4OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgQ0M9JChDQykgQ0MyPSQoQ0MyKSBic2RpCisKKworI0J1aWxkIGEgQlNESSA0LnggYmluYXJ5IHRoYXQgYWxzbyBydW5zIHVuZGVyIEZyZWVCU0QgKFRlcnJ5IEtlbm5lZHkpLgorI0J1dCB3YXRjaCBvdXQgZm9yIGRldGFpbHMgbGlrZSBzZXJpYWwtcG9ydCBsb2NraW5nLgorYnNkaXg6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBDQz0kKENDKSBDQzI9JChDQzIpIGJzZGkgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURCU0RJMiAtREJTREkzIC1EQlNESTQgLURUUFVUU0ZOVFlQRT12b2lkIC1EVFBVVFNJU1ZPSUQgXAorCS1tNDg2ICQoS0ZMQUdTKSIgIkxOS0ZMQUdTPS1zdGF0aWMgLVdsLC1tLGkzODZic2RpIC1XbCwtZSxfc3RhcnQiCisKKyNQeXJhbWlkIDlYWFggKGUuZy4gOTg0NSkgb3IgTUlTZXJ2ZXIgVCBzZXJpZXMsIE9TeCA0LjRiIHRocnUgNS4xCitweXJhbWlkOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgUHlyYW1pZCBEdWFsIFBvcnQgT1N4CisJdWNiICQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDMgLURUQ1BTT0NLRVQgLURQWVJBTUlEIC1PICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gLXMiCisKKyNQeXJhbWlkIER1YWwgUG9ydCBPU3ggdXNpbmcgSG9uZXlEYW5CZXIgVVVDUCwgY3Vyc2VzIGFuZCBUQ1AKK3B5cmFtaWQtaGRiOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgUHlyYW1pZCBEdWFsIFBvcnQgT1N4CisJdWNiICQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQlNENDMgLURUQ1BTT0NLRVQgLURIQkRVVUNQIC1EQ0tfQ1VSU0VTIC1PICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1zIiAiTElCUyA9IC1sY3Vyc2VzIC1sdGVybWNhcCIKKworI1B5cmFtaWQgREMvT1N4IChVTklYIFN5c3RlbSBWIFI0KS4KKyNIYXMgPHN5cy90ZXJtaW94Lmg+LCByZWd1bGFyIEJlcmtlbGV5IHNvY2tldHMgbGlicmFyeSwgaS5lLiBpbi5oIGFuZCBpbmV0LmgKKyNhcmUgbm90IG1pc3BsYWNlZCBpbiBzeXMgKHJhdGhlciB0aGFuIG5ldGluZXQgYW5kIGFycGEsIHJlc3BlY3RpdmVseSkuCisjVXNlcyBBTlNJIEMuCisjTk9URTogUmVtb3ZlIC1PIGFuZCBPbGltaXQ6MjUwMCBmcm9tIENGTEFHUyBpZiBURUxORVQgY29ubmVjdGlvbnMgZG8gbm90IHdvcmsuCitweXJkY29zeDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBQeXJhbWlkIERDL09TeC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLVhhIC1PIC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgLURTRUxFQ1QgLUROT0dFVFVTRVJTSEVMTCBcCisJLURDS19DVVJTRVMgLURTVEVSTUlPWCAtRFRDUFNPQ0tFVCAtRFBZUkFNSUQgLUsgT2xpbWl0OjMxMDAgXAorCS1ETk9fRE5TX1NSViAkKEtGTEFHUykiICJMSUJTPSAtbGN1cnNlcyAtbHNvY2tldCAtbG5zbCIgIkxOS0ZMQUdTID0gLXMiCisKKyNJQk0ncyBBSVggMy4wIG9uIElCTSAzNzAgbWFpbmZyYW1lLCB0ZXN0ZWQgb24gQUlYIEY0NCB0aHJ1IEY1MC4KK2FpeDM3MDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIElCTSBTeXN0ZW0vMzcwIEFJWCAzLjAuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREFJWDM3MCAtRFRDUFNPQ0tFVCAtRExDS0RJUiAtRERJUkVOVCAkKEtGTEFHUykiIFwKKwkiTElCUyA9IC1sYnNkIgorCisjSUJNJ3MgQUlYL0VTQSAyLjEgKE9TRi8xKSBvbiBJQk0gbWFpbmZyYW1lCithaXhlc2E6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBJQk0gQUlYL0VTQS4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQUlYRVNBIC1EVENQU09DS0VUICQoS0ZMQUdTKSAtTyIKKworI0lCTSBQUy8yIHdpdGggQUlYIDEuMCB0aHJ1IDEuMy4KKyMgIFJlcG9ydHMgaW5kaWNhdGUgdGhhdCAtTyBzd2l0Y2ggbXVzdCBiZSBvbWl0dGVkLgorIyAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0ICJtYWtlIGJzZCIgd2lsbCB3b3JrIChyZXBvcnRzIHdlbGNvbWUpLgorIyAgT25lIHJlcG9ydCBzYWlkICJtYWtlIExJQlM9LWxic2QgYnNkIiBkaWQgdGhlIHRyaWNrLgorIyAgTk9UTE9HIGlzIHRvIGdldCBhcm91bmQgYSAndGxvZycgc3ltYm9sIGRlZmluZWQgaW4gb25lIG9mIHRoZSBoZWFkZXJzLgorcHMyYWl4OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIElCTSBBSVggMS54IFBTLzIuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EQVRUU1YgLUROT1JFQUxQQVRIIC1EUFMyQUlYMTAgLURTSUdfViBcCisJLUROT1VOSUNPREUgLUROT1RMT0cgLUROT0xFQVJOICQoS0ZMQUdTKSAtaSIgXAorCSJMTktGTEFHUyA9IC1pIgorCitwczJhaXhuZXRjOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIElCTSBBSVggMS54IFBTLzIuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EQVRUU1YgLUROT1JFQUxQQVRIIC1EUFMyQUlYMTAgLURUQ1BTT0NLRVQgLURDS19DVVJTRVMgXAorCS1EU0lHX1YgLUROT1VOSUNPREUgLUROT1RMT0cgLUROT0xFQVJOICQoS0ZMQUdTKSAtaSIgXAorCSJMSUJTID0gLWxjdXJzZXMiICJMTktGTEFHUyA9IC1pIgorCitwczJhaXgzOgorCSQoTUFLRSkgcHMyYWl4IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworI0lCTSBSVCBQQyB3aXRoIEFJWCAyLjIuMSwgdmFsaWQgYXMgb2YgQy1LZXJtaXQgOC4wLgorI05PVExPRyBiZWNhdXNlIG9mIGEgY29uZmxpY3QgaW4gPHN5cy90ZXJtaW8uaD4uCisjVGhpcyBvbmUgaGFzIHVuaXF1ZSBhbmQgc3RyYW5nZSBsb2NrZmlsZXMuCisjICAtTyByZW1vdmVkIG9uIHB1cnBvc2UgKDguMCkuCisjICBJbiBjYXNlIG9mICJjb21waWxlciBlcnJvcjogc3ltYm9sIHRhYmxlIGZ1bGwiLCBpbmNyZWFzZSB0aGUgLU5uIG51bWJlci4KKyMgIEluIGNhc2Ugb2YgImNvbXBpbGVyIGVycm9yOiBDb25zdGFudCBwb29sIHRvbyBiaWciLCBib29zdCB0aGUgLU5wIG51bWJlci4KKyMgIEFkZCAtRE5PUFVURU5WIGlmIHB1dGVudigpIGNhdXNlcyB0cm91YmxlLgorIyAgUHV0IC1ETk9JS1NEIGJhY2sgaWYgSUtTRC1yZWxhdGVkIHByb2JsZW1zIG9jY3VyLgorcnRhaXg6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSUJNIFJUIFBDLCBBSVggMi4yLjEuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VULSQoQCl9IFwKKwkiQ0ZMQUdTID0gLURBVFRTViAtRFJUQUlYIC1ESERCVVVDUCAtRERJUkVOVCAtRE5PVExPRyAtRFRDUFNPQ0tFVCBcCisJLUROT0dFVFVTRVJTSEVMTCAtRENMU09QTiAtRE5PUkVBTFBBVEggLUROT1VOSUNPREUgLURCU0RfSU5DTFVERVMgXAorCS1EVVNFX0xTVEFUIC1ERk5GTE9BVCAtTm4yNTAwIC1OcDEwMDAgLVdxLC1TSjIgLWEgLXcgJChLRkxBR1MpIiBcCisJIkxJQlMgPSAtbG0gJChMSUJTKSIgIkxOS0ZMQUdTID0gLXMiCisKKyNJQk0gUlQgUEMgd2l0aCBBSVggMi4yLjEgKyBjdXJzZXMKK3J0YWl4YzoKKwkkKE1BS0UpIHJ0YWl4IENDPSQoQ0MpIENDMj0kKENDMikgIktGTEFHUz0tRENLX0NVUlNFUyIgIkxJQlM9LWxjdXJzZXMiCisKKyNJQk0gUlQgUEMgd2l0aCBBSVggKEFDSVMpIDIuMi4xIChCU0QgNC4zKQorIyBBZGQgLU8sIC1ERFlOQU1JQywgLXMsIGV0YywgaWYgdGhleSB3b3JrLgorcnRhY2lzOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgUlQgUEMgd2l0aCBBQ0lTIDIuMi4xID0gQlNEIDQuMy4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVC0kKEApfSBcCisJIkNGTEFHUz0gLURCU0Q0IC1EVENQU09DS0VUIC1ETk9SRUFMUEFUSCAtRE5PSUtTRCAtRE5PUFVURU5WIFwKKwkkKEtGTEFHUykgLVVfX1NURENfXyIgIkxOS0ZMQUdTID0gLXMiCisKKyNJQk0gQUlYIDMuMCwgMy4xLCBvciAzLjIgZm9yIFJJU0MgU3lzdGVtLzYwMDAuCityczYwMDA6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBJQk0gQUlYIDMuMCBvciAzLjEsIFJTLzYwMDAuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREFJWFJTIC1EVENQU09DS0VUIC1EU1ZSMyAtRERJUkVOVCAtRENLX0FOU0lDIFwKKwktRENLX1BPTEwgLURDTFNPUE4gLURTRUxFQ1RfSCAtRE5PVFRZTE9DSyAtTyAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtcyIKKworI0lCTSBBSVggMy4wLCAzLjEsIG9yIDMuMiBmb3IgUklTQyBTeXN0ZW0vNjAwMCwgd2l0aCBjdXJzZXMuCityczYwMDBjOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSUJNIEFJWCAzLjAgb3IgMy4xLCBSUy82MDAwLi4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURBSVhSUyAtRFRDUFNPQ0tFVCAtRFNWUjMgLURESVJFTlQgLURDS19BTlNJQyBcCisJLURDS19QT0xMIC1EQ0xTT1BOIC1EQ0tfQ1VSU0VTIC1EU0VMRUNUX0ggLUROT1RUWUxPQ0sgLUROT1JFQUxQQVRIIFwKKwktTyAkKEtGTEFHUykiICJMSUJTPSAtbGN1cnNlcyAtbHRlcm1jYXAiICJMTktGTEFHUyA9IC1zIgorCithaXgzMDoKKwkkKE1BS0UpIHJzNjAwMCBDQz0kKENDKSBDQzI9JChDQzIpIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworYWl4MzE6CisJJChNQUtFKSByczYwMDAgQ0M9JChDQykgQ0MyPSQoQ0MyKSBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKKyNJQk0gQUlYIDMuMiBmb3IgUklTQyBTeXN0ZW0vNjAwMC4KKyNJbiBjYXNlIG9mICJzdWJwcm9ncmFtIHRvbyBjb21wbGV4IiB3YXJuaW5ncywgYWRkICItcW1heG1lbT0xNjAwMCIgdG8gQ0ZMQUdTLgorcnM2YWl4MzI6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBJQk0gQUlYIDMuMiwgUlMvNjAwMC4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQUlYUlMgLURUQ1BTT0NLRVQgLURTVlI0IC1ERElSRU5UIC1EQ0tfQU5TSUMgLUROT1JFQUxQQVRIIFwKKwktRFNFTEVDVF9IIC1EQ0xTT1BOIC1ETk9UVFlMT0NLIC1PICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gLXMiCisKKyNJQk0gQUlYIDMuMiBmb3IgUklTQyBTeXN0ZW0vNjAwMC4KK3JzNmFpeDMyYzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIElCTSBBSVggMy4yLCBSUy82MDAwLCBUQ1ArY3Vyc2VzLi4uCisJQGVjaG8gSW4gY2FzZSBvZiBTdWJwcm9ncmFtIFRvbyBDb21wbGV4IHdhcm5pbmdzLAorCUBlY2hvIGFkZCAtcW1heG1lbT0xNjAwMCB0byBDRkxBR1MuCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURBSVhSUyAtRFRDUFNPQ0tFVCAtRFNWUjQgLURESVJFTlQgLURDS19BTlNJQyAtRE5PUkVBTFBBVEggXAorCS1EQ0xTT1BOIC1EQ0tfQ1VSU0VTIC1EU0VMRUNUX0ggLUROT1RUWUxPQ0sgLU8gJChLRkxBR1MpIiBcCisJIkxOS0ZMQUdTID0gLXMiICJMSUJTPS1sY3Vyc2VzIgorCithaXgzMjoKKwkkKE1BS0UpIHJzNmFpeDMyYyBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKKyNJQk0gQUlYIDQuMSwgNC4xLnggb24gUklTQyBTeXN0ZW0vNjAwMCBvciBQb3dlciBTZXJpZXMuCisjR2VuZXJhdGVzIGNvbW1vbiBiaW5hcnkgZm9yIGFsbCBwbGF0Zm9ybXMgaWYgdXNpbmcgeGxjIChJQk0gQyBjb21waWxlcikuCisjV2hlbiB1c2luZyBnY2MsIGFkZCAtbWNwdT1jb21tb24gdG8gZ2VuZXJhdGUgY29tbW9uIGJpbmFyeS4KKyNOb3RlIHRoYXQgdGhpcyBvbmUgbmVlZHMgQ0tfTkVXVEVSTS4KKyMgQWRkIC1iYmlndG9jIGluIGNhc2UgbGQgZmFpbHMgd2l0aCBUT0Mgb3ZlcmZsb3cuCithaXg0MToKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIElCTSBBSVggNC4xLjEgUlMvNjAwMCBvciBQb3dlclBDLi4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURBSVhSUyAtREFJWDQxIC1EU1ZSNCAtRFNURVJNSU9YIC1EVENQU09DS0VUIC1ERElSRU5UIFwKKwktRENLX0FOU0lDIC1EQ0xTT1BOIC1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRFNFTEVDVCAtRFNFTEVDVF9IIFwKKwktRE5PR0VUVVNFUlNIRUxMIC1xbWF4bWVtPTE2MDAwIC1PICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1zIiAiTElCUz0tbGN1cnNlcyIKKworI0RpdHRvIGJ1dCB3aXRoIGdjYy4KKyNSZW1vdmUgIkNDPWdjYyBDQzI9Z2NjIiBpZiB5b3UgaGF2ZSBnY2MgaW5zdGFsbGVkIGFzIGNjLgorYWl4NDFnOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSUJNIEFJWCA0LjEuMSBSUy82MDAwIG9yIFBvd2VyUEMuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQz1nY2MiICJDQzI9Z2NjIiBcCisJIkNGTEFHUz0gLURBSVhSUyAtREFJWDQxIC1EU1ZSNCAtRFNURVJNSU9YIC1EVENQU09DS0VUIC1ERElSRU5UIFwKKwktRENLX0FOU0lDIC1EQ0xTT1BOIC1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRFNFTEVDVCAtRFNFTEVDVF9IIFwKKwktRE5PR0VUVVNFUlNIRUxMIC1PICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1zIC1YbGlua2VyIC1iYmlndG9jIiAiTElCUz0tbGN1cnNlcyIKKworIyBBZGQgLWJiaWd0b2MgaW4gY2FzZSBsZCBmYWlscyB3aXRoIFRPQyBvdmVyZmxvdy4KK2FpeDQxK2tyYjUra3JiNDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIElCTSBBSVggNC4xLjEgUlMvNjAwMCBvciBQb3dlclBDLi4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURBSVhSUyAtREFJWDQxIC1EU1ZSNCAtRFNURVJNSU9YIC1EVENQU09DS0VUIC1ERElSRU5UIFwKKwktRENLX0FOU0lDIC1EQ0xTT1BOIC1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRFNFTEVDVCAtRFNFTEVDVF9IIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfS0VSQkVST1MgLURLUkI1IC1ES1JCNCAtREtSQjUyNCBcCisJLURDS19FTkNSWVBUSU9OIC1EQ0tfREVTICQoSzVJTkMpICQoSzVJTkMpL2tyYjUgIFwKKwktRE5PR0VUVVNFUlNIRUxMIC1xbWF4bWVtPTE2MDAwIC1PICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1zIiBcCisJIkxJQlMgPSAkKEs1TElCKSAtbGN1cnNlcyAtbGtyYjQgLWxkZXM0MjUgLWxrcmI1IFwKKwktbGNvbV9lcnIgLWxrNWNyeXB0byAtbGdzc2FwaV9rcmI1IgorCisjT2xkIG5hbWUgZm9yICJhaXg0MSIuCityczZhaXg0MWM6CisJJChNQUtFKSBhaXg0MSBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKKyNJQk0gQUlYIDQuMSwgNC4xLngsIG9yIDQuMiBvbiBSSVNDIFN5c3RlbS82MDAwIG9yIFBvd2VyIFNlcmllcywKKyMgd2l0aCBYLjI1IHN1cHBvcnQKKyNHZW5lcmF0ZXMgY29tbW9uIGJpbmFyeSBmb3IgYWxsIHBsYXRmb3JtcyBpZiB1c2luZyB4bGMgKElCTSBDIGNvbXBpbGVyKS4KKyNXaGVuIHVzaW5nIGdjYywgYWRkIC1tY3B1PWNvbW1vbiB0byBnZW5lcmF0ZSBjb21tb24gYmluYXJ5LgorIyBBZGQgLWJiaWd0b2MgaW4gY2FzZSBsZCBmYWlscyB3aXRoIFRPQyBvdmVyZmxvdy4KK2FpeDQxeDI1OgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSUJNIEFJWCA0LjEuMSBSUy82MDAwIG9yIFBvd2VyUEMuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREFJWFJTIC1EQUlYNDEgLURTVlI0IC1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgLURESVJFTlQgXAorCS1EQ0tfQU5TSUMgLURDTFNPUE4gLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1EU0VMRUNUIC1EU0VMRUNUX0ggXAorCS1ESUJNWDI1IC1EREVCVUcgLUROT0dFVFVTRVJTSEVMTCAtcW1heG1lbT0xNjAwMCAtZyAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtZyAtYkk6L2xpYi9wc2UuZXhwIiAiTElCUz0tbGN1cnNlcyAtbG9kbSAtbGNmZyIKKwktQGVjaG8gIhtdMDtrZXJtaXQgZG9uZQdcYyIKKworI0FzIGFib3ZlIGJ1dCB3aXRob3V0IC1nIGluIExOS0ZMQUdTLgorIyBBZGQgLWJiaWd0b2MgaW4gY2FzZSBsZCBmYWlscyB3aXRoIFRPQyBvdmVyZmxvdy4KK2FpeDQxeDI1bzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIElCTSBBSVggNC4xLjEgUlMvNjAwMCBvciBQb3dlclBDLi4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURBSVhSUyAtREFJWDQxIC1EU1ZSNCAtRFNURVJNSU9YIC1EVENQU09DS0VUIC1ERElSRU5UIFwKKwktRENLX0FOU0lDIC1EQ0xTT1BOIC1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRFNFTEVDVCAtRFNFTEVDVF9IIFwKKwktRElCTVgyNSAtRE5PREVCVUcgLUROT0dFVFVTRVJTSEVMTCAtcW1heG1lbT0xNjAwMCAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtYkk6L2xpYi9wc2UuZXhwIiAiTElCUz0tbGN1cnNlcyAtbG9kbSAtbGNmZyIKKwktQGVjaG8gIhtdMDtrZXJtaXQgZG9uZQdcYyIKKworI0FJWCA0LjIgLS0gTXVzdCBoYXZlIENLX05FV1RFUk0gb3IgZWNob2luZyBpcyBsb3N0IGFmdGVyIGN1cnNlcy4KKyMgQWRkIC1iYmlndG9jIGluIGNhc2UgbGQgZmFpbHMgd2l0aCBUT0Mgb3ZlcmZsb3cuCithaXg0MjoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIElCTSBBSVggNC4yIG9yIGhpZ2hlci4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQUlYUlMgLURBSVg0MSAtREFJWDQyIC1EU1ZSNCAtRFNURVJNSU9YIC1EVENQU09DS0VUIFwKKwktRERJUkVOVCAtRENLX0FOU0lDIC1EQ0xTT1BOIC1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtREZORkxPQVQgXAorCS1EU0VMRUNUIC1EU0VMRUNUX0ggLUROT0dFVFVTRVJTSEVMTCAtcW1heG1lbT0xNjAwMCAtTyAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtcyIgIkxJQlM9LWxjdXJzZXMgLWxtIgorCisjQUlYIDQuMyAtLSBNdXN0IE5PVCBoYXZlIENLX05FV1RFUk0gb3IgZWxzZSBDLUtlcm1pdCBoYW5ncyBhZnRlciBjdXJzZXMuCisjIC1iYmlndG9jIG5lZWRlZCBvbiBzb21lIHN5c3RlbXMgYnV0IG5vdCBvdGhlcnMgdG8gYXZvaWQgVE9DIG92ZXJmbG93LgorIyAibWFuIGxkIiBzYXlzIC1iYmlndG9jIG1ha2VzIHByb2dyYW0gcnVuIHNsb3dlci4KK2FpeDQzOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSUJNIEFJWCA0LjMgb3IgaGlnaGVyLi4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURBSVhSUyAtREFJWDQxIC1EQUlYNDMgLURTVlI0IC1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgXAorCS1ERElSRU5UIC1EQ0tfQU5TSUMgLURDTFNPUE4gLURDS19DVVJTRVMgLURTRUxFQ1QgLURTRUxFQ1RfSCBcCisJLURGTkZMT0FUIC1ETk9HRVRVU0VSU0hFTEwgLXFtYXhtZW09MTYwMDAgLWJiaWd0b2MgLU8gJChLRkxBR1MpIiBcCisJIkxOS0ZMQUdTID0gLXMiICJMSUJTPS1sY3Vyc2VzIC1sbSIKKworI0FJWCA0LjMgd2l0aCBJQk0gWC4yNS4KK2FpeDQzeDI1OgorCUBlY2hvICJNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIElCTSBBSVggNC4zIHdpdGggWC4yNS4uLiIKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtREFJWFJTIC1EQUlYNDEgLURBSVg0MyAtRFNWUjQgLURTVEVSTUlPWCAtRFRDUFNPQ0tFVCBcCisJLURESVJFTlQgLURDS19BTlNJQyAtRENMU09QTiAtRENLX0NVUlNFUyAtRFNFTEVDVCAtRFNFTEVDVF9IIFwKKwktREZORkxPQVQgLUROT0dFVFVTRVJTSEVMTCAtRElCTVgyNSBcCisJLXFtYXhtZW09MTYwMDAgLWJiaWd0b2MgLU8gJChLRkxBR1MpIiBcCisJIkxOS0ZMQUdTID0gLWJJOi9saWIvcHNlLmV4cCIgIkxJQlM9LWxjdXJzZXMgLWxvZG0gLWxjZmcgLWxtIgorCisjQUlYIDQuMyAtLSBNdXN0IE5PVCBoYXZlIENLX05FV1RFUk0gb3IgZWxzZSBDLUtlcm1pdCBoYW5ncyBhZnRlciBjdXJzZXMuCisjIC1tbWluaW1hbC10b2MgbmVlZGVkIG9uIHNvbWUgc3lzdGVtcyBidXQgbm90IG90aGVycyB0byBhdm9pZCBUT0Mgb3ZlcmZsb3cuCisjICJtYW4gbGQiIHNheXMgLWJiaWd0b2MgbWFrZXMgcHJvZ3JhbSBydW4gc2xvd2VyLgorYWl4NDNnOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSUJNIEFJWCA0LjMgZ2NjLi4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBDQz1nY2MgQ0MyPWdjYyBcCisJIkNGTEFHUz0gLW1taW5pbWFsLXRvYyAtZyAtTyAtREFJWFJTIC1EQUlYNDEgLURBSVg0MyAtRFNWUjQgXAorCS1ERElSRU5UIC1EQ0tfQU5TSUMgLURDTFNPUE4gLURDS19DVVJTRVMgLURTRUxFQ1QgLURTRUxFQ1RfSCBcCisJLURTVEVSTUlPWCAtRFRDUFNPQ0tFVCAtREZORkxPQVQgLUROT0dFVFVTRVJTSEVMTCAkKEtGTEFHUykiIFwKKwkiTElCUz0tbGN1cnNlcyAtbG0iCisKK2FpeDQzZ2NjOgorCSQoTUFLRSkgYWl4NDNnCisKKyMgTm9uZSBvZiB0aGUgZm9sbG93aW5nIGFpeDQzZ2NjIGF0dGVtcHRzIHdvcmsgb24gYSBnY2Mtb25seSBBSVggNC4zLjMgYm94LgorIyBJdCBqdXN0IHBsYWluIGNhbid0IGZpbmQgdGhlIG1hdGggcm91dGluZXMgKGZtb2QsIHBvdywgZXhwLCBzcXJ0LCBsb2cxMCwuLi4pCisjIFdoaWNoIGlzIG9kZCBiZWNhdXNlIG5tIC91c3IvbGliL2xpYkMuYSBmaW5kcyB0aGVtLi4uCisKKyNpbiBjYXNlIGFpeDQzZ2NjIGNhbid0IGZpbmQgaXRzIG1hdGggbGlicmFyeS4uLgorYWl4NDNnY2N4OgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSUJNIEFJWCA0LjMgZ2NjLi4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBDQz1nY2MgQ0MyPWdjYyBcCisJIkNGTEFHUz0gLW1taW5pbWFsLXRvYyAtZyAtTyAtREFJWFJTIC1EQUlYNDEgLURBSVg0MyAtRFNWUjQgXAorCS1ERElSRU5UIC1EQ0tfQU5TSUMgLURDTFNPUE4gLURDS19DVVJTRVMgLURTRUxFQ1QgLURTRUxFQ1RfSCBcCisJLURTVEVSTUlPWCAtRFRDUFNPQ0tFVCAtREZORkxPQVQgLUROT0dFVFVTRVJTSEVMTCAkKEtGTEFHUykiIFwKKwkiTElCUz0gLUwvdXNyL2xvY2FsL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMy4xLjAvMi45NS4yIFwKKwktbGN1cnNlcyAtYmxvYWRtYXAgLWJub3F1aWV0IgorCisjaW4gY2FzZSBhaXg0M2djY3ggY2FuJ3QgZmluZCBpdHMgbWF0aCBsaWJyYXJ5Li4uCithaXg0M2djY3k6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBJQk0gQUlYIDQuMyBnY2MuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IENDPWdjYyBDQzI9Z2NjIFwKKwkiQ0ZMQUdTPSAtbW1pbmltYWwtdG9jIC1nIC1PIC1EQUlYUlMgLURBSVg0MSAtREFJWDQzIC1EU1ZSNCBcCisJLURESVJFTlQgLURDS19BTlNJQyAtRENMU09QTiAtRENLX0NVUlNFUyAtRFNFTEVDVCAtRFNFTEVDVF9IIFwKKwktRFNURVJNSU9YIC1EVENQU09DS0VUIC1ERk5GTE9BVCAtRE5PR0VUVVNFUlNIRUxMICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbGN1cnNlcyAtYmxvYWRtYXAgLWJub3F1aWV0IgorCisjaW4gY2FzZSBhaXg0M2djY3ggY2FuJ3QgZmluZCBpdHMgbWF0aCBsaWJyYXJ5Li4uCithaXg0M2djY3o6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBJQk0gQUlYIDQuMyBnY2MuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IENDPWdjYyBDQzI9Z2NjIFwKKwkiQ0ZMQUdTPSAtbW1pbmltYWwtdG9jIC1nIC1PIC1EQUlYUlMgLURBSVg0MSAtREFJWDQzIC1EU1ZSNCBcCisJLURESVJFTlQgLURDS19BTlNJQyAtRENMU09QTiAtRENLX0NVUlNFUyAtRFNFTEVDVCAtRFNFTEVDVF9IIFwKKwktRFNURVJNSU9YIC1EVENQU09DS0VUIC1ERk5GTE9BVCAtRE5PR0VUVVNFUlNIRUxMICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtTC4gLWxjdXJzZXMgLWJsb2FkbWFwIC1ibm9xdWlldCIKKworCisjQUlYIDQuMyB3aXRoIE1JVCBLZXJiZXJvcyA1IGFuZCBLZXJiZXJvcyA0IGNvbXBhdGliaWxpdHkgbW9kZQorIyBNdXN0IE5PVCBoYXZlIENLX05FV1RFUk0gb3IgZWxzZSBDLUtlcm1pdCBoYW5ncyBhZnRlciBjdXJzZXMuCisjIC1tbWluaW1hbC10b2MgbmVlZGVkIG9uIHNvbWUgc3lzdGVtcyBidXQgbm90IG90aGVycyB0byBhdm9pZCBUT0Mgb3ZlcmZsb3cuCisjICJtYW4gbGQiIHNheXMgLWJiaWd0b2MgbWFrZXMgcHJvZ3JhbSBydW4gc2xvd2VyLgorYWl4NDNnY2Mra3JiNStrcmI0OgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSUJNIEFJWCA0LjMgb3IgaGlnaGVyIHcvS2VyYmVyb3MuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IENDPWdjYyBDQzI9Z2NjIFwKKwkiQ0ZMQUdTPSAtbW1pbmltYWwtdG9jIC1nIC1PIC1EQUlYUlMgLURBSVg0MSAtREFJWDQzIC1EU1ZSNCBcCisJLURESVJFTlQgLURDS19BTlNJQyAtRENMU09QTiAtRENLX0NVUlNFUyAtRFNFTEVDVCAtRFNFTEVDVF9IIFwKKwktRFNURVJNSU9YIC1EVENQU09DS0VUIC1ERk5GTE9BVCAtRE5PR0VUVVNFUlNIRUxMIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfS0VSQkVST1MgLURLUkI1IC1ES1JCNCAtREtSQjUyNCBcCisJLURDS19FTkNSWVBUSU9OIC1EQ0tfREVTIC1mdW5zaWduZWQtY2hhciAkKEs1SU5DKSAkKEs1SU5DKS9rcmI1IFwKKwkkKEtGTEFHUykiIFwKKwkiTElCUz0kKEs1TElCKSAtbGN1cnNlcyAtbG0gLWxrcmI0IC1sZGVzNDI1IC1sa3JiNSBcCisJLWxjb21fZXJyIC1sazVjcnlwdG8gLWxjcnlwdCAtbGdzc2FwaV9rcmI1IgorCisjQUlYIDQuMyB3aXRoIE1JVCBLZXJiZXJvcyA1LCBLZXJiZXJvcyA0IGNvbXBhdGliaWxpdHkgbW9kZSBhbmQgT3BlblNTTAorIyBNdXN0IE5PVCBoYXZlIENLX05FV1RFUk0gb3IgZWxzZSBDLUtlcm1pdCBoYW5ncyBhZnRlciBjdXJzZXMuCisjIC1tbWluaW1hbC10b2MgbmVlZGVkIG9uIHNvbWUgc3lzdGVtcyBidXQgbm90IG90aGVycyB0byBhdm9pZCBUT0Mgb3ZlcmZsb3cuCisjICJtYW4gbGQiIHNheXMgLWJiaWd0b2MgbWFrZXMgcHJvZ3JhbSBydW4gc2xvd2VyLgorYWl4NDNnY2Mra3JiNStrcmI0K29wZW5zc2w6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBJQk0gQUlYIDQuMyBvciBoaWdoZXIgdy9LZXJiZXJvcy4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gQ0M9Z2NjIENDMj1nY2MgXAorCSJDRkxBR1M9IC1tbWluaW1hbC10b2MgLWcgLU8gLURBSVhSUyAtREFJWDQxIC1EQUlYNDMgLURTVlI0IFwKKwktRERJUkVOVCAtRENLX0FOU0lDIC1EQ0xTT1BOIC1EQ0tfQ1VSU0VTIC1EU0VMRUNUIC1EU0VMRUNUX0ggXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgLURGTkZMT0FUIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19LRVJCRVJPUyAtREtSQjUgLURLUkI0IC1ES1JCNTI0IFwKKwktRENLX0VOQ1JZUFRJT04gLURDS19ERVMgLURDS19DQVNUIC1ETElCREVTIC1EQ0tfU1NMIFwKKwktZnVuc2lnbmVkLWNoYXIgJChLNUlOQykgJChLNUlOQykva3JiNSAkKFNTTElOQykgJChLRkxBR1MpIiBcCisJIkxJQlM9JChLNUxJQikgJChTU0xMSUIpIC1sc3NsIC1sY3J5cHRvIFwKKwktbGN1cnNlcyAtbG0gLWxrcmI0IC1sZGVzNDI1IC1sa3JiNSAtbGNvbV9lcnIgLWxrNWNyeXB0byAtbGNyeXB0IFwKKwktbGdzc2FwaV9rcmI1IgorCithaXg0M2djYytvcGVuc3NsOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSUJNIEFJWCA0LjMgb3IgaGlnaGVyIHcvT3BlblNTTC4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gQ0M9Z2NjIENDMj1nY2MgXAorCSJDRkxBR1M9IC1tbWluaW1hbC10b2MgLWcgLU8gLURBSVhSUyAtREFJWDQxIC1EQUlYNDMgLURTVlI0IFwKKwktRERJUkVOVCAtRENLX0FOU0lDIC1EQ0xTT1BOIC1EQ0tfQ1VSU0VTIC1EU0VMRUNUIC1EU0VMRUNUX0ggXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgLURGTkZMT0FUIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19TU0wgLWZ1bnNpZ25lZC1jaGFyICQoU1NMSU5DKSAkKEtGTEFHUykiIFwKKwkiTElCUz0kKFNTTExJQikgLWxzc2wgLWxjcnlwdG8gLWxjdXJzZXMgLWxtIC1sY3J5cHQiCisKK2FpeDQ0OgorCSQoTUFLRSkgYWl4NDIgIktGTEFHUz0tREFJWDQ0IC1xbWF4bWVtPTIwMDAwICQoS0ZMQUdTKSIgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworYWl4NDU6CisJJChNQUtFKSBhaXg0MiAiS0ZMQUdTPS1EQUlYNDUgLXFtYXhtZW09MjAwMDAgJChLRkxBR1MpIiBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCithaXg1MDoKKwkkKE1BS0UpIGFpeDQyICJLRkxBR1M9LURBSVg1MCAtcW1heG1lbT0yMDAwMCAkKEtGTEFHUykiIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2FpeDUxOgorCSQoTUFLRSkgYWl4NDIgIktGTEFHUz0tREFJWDUxIC1xbWF4bWVtPTIwMDAwICQoS0ZMQUdTKSIgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworYWl4NTI6CisJJChNQUtFKSBhaXg0MiAiS0ZMQUdTPS1EQUlYNTIgLXFtYXhtZW09MjAwMDAgJChLRkxBR1MpIiBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCithaXg1MzoKKwkkKE1BS0UpIGFpeDQyICJLRkxBR1M9LURBSVg1MyAtcW1heG1lbT0yMDAwMCAkKEtGTEFHUykiIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2FpeDQ0Z2NjOgorCSQoTUFLRSkgYWl4NDNnICJLRkxBR1M9LURBSVg0NCAkKEtGTEFHUykiIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2FpeDQ1Z2NjOgorCSQoTUFLRSkgYWl4NDNnICJLRkxBR1M9LURBSVg0NSAkKEtGTEFHUykiIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2FpeDUwZ2NjOgorCSQoTUFLRSkgYWl4NDNnICJLRkxBR1M9LURBSVg1MCAkKEtGTEFHUykiIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2FpeDUxZ2NjOgorCSQoTUFLRSkgYWl4NDNnICJLRkxBR1M9LURBSVg1MSAkKEtGTEFHUykiIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2FpeDUyZ2NjOgorCSQoTUFLRSkgYWl4NDNnICJLRkxBR1M9LURBSVg1MiAkKEtGTEFHUykiIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2FpeDUzZ2NjOgorCSQoTUFLRSkgYWl4NDNnICJLRkxBR1M9LURBSVg1MyAkKEtGTEFHUykiIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKKyNCdWxsIERQWC8yIHdpdGggQk9TL1gsIGxpa2UgQUlYL1JTNjAwMAorYnVsbGRweDI6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBCdWxsIERQWC8yIHdpdGggQk9TL1guLi4KKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRFNWUjMgLURESVJFTlQgLURDS19BTlNJQyAtRENLVFlQX0g9PHN5cy90eXBlcy5oPiBcCisJLURDS19QT0xMIC1ETk9HRVRVU0VSU0hFTEwgLURDTFNPUE4gLUROT0xFQVJOIC1PICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1zIgorCisjU3VuIFVOSVggMy41IHdpdGggZ2NjIDIuMy4zLgorc3Vub3MzZ2NjOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU3VuIFVOSVggMy41IGFuZCBnY2MuLi4KKwkkKE1BS0UpIHhlcm1pdCBDQz1nY2MgQ0MyPWdjYyBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwlDRkxBR1M9Ii1nIC1PIC1EQlNENCAtRFRDUFNPQ0tFVCAkKEtGTEFHUykiCisKKyNTdW5PUyB2ZXJzaW9uIDQuMCwgQlNEIGVudmlyb25tZW50LCBoYXMgc2F2ZWQgb3JpZ2luYWwgZXVpZCBmZWF0dXJlLgorIyBBZGQgIkNDPS91c3IvdWNiL2NjIENDMj0vdXNyL3VjYi9jYyIgaWYgbmVjZXNzYXJ5LgorIyBOb3RlOiBJbmNsdWRpbmcgVW5pY29kZSBjcmFzaGVzIHRoZSBhc3NlbWJsZXIgaW4gY2tjdW5pLmMuCitzdW5vczQ6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTdW5PUyA0LjAsIEJTRCBlbnZpcm9ubWVudC4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1PIC1EU1VOT1M0IC1ERk5GTE9BVCAtRE5PVU5JQ09ERSAkKEtGTEFHUykiIFwKKwkiTElCUz0tbG0iCisKKyNBcyBhYm92ZSwgYnV0IHdpdGggU3VuTGluayBYLjI1IHN1cHBvcnQKK3N1bm9zNHgyNToKKwlAZWNobyBTdW5MaW5rIFguMjUgc3VwcG9ydAorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc3Vub3M0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9JChLRkxBR1MpIC1ERk5GTE9BVCAtRFNVTlgyNSIgXAorCSJMSUJTPS1sbSIKKworI1NVTiBPUyB2ZXJzaW9uIDQuMSAtIDQuMS4zLCBCU0QgZW52aXJvbm1lbnQsIGhhcyBzYXZlZCBvcmlnaW5hbCBldWlkIGZlYXR1cmUuCisjVXNlcyBIb25leSBEYW5CZXIgVVVDUC4gIFJlcXVpcmVzIHByZXNlbmNlIG9mIC91c3Ivc3Bvb2wvbG9ja3MgZGlyZWN0b3J5LgorIyAvdmFyL3Nwb29sLyBzaG91bGQgYmUgYSBzeW1ib2xpYyBsaW5rIHRvICAvdXNyL3Nwb29sLy4KKyMgLi4uIG9yICdtYWtlIHhlcm1pdCAiQ0M9IC91c3IvdWNiL2NjICIgXCcKKyMgTm90ZTogInhlcm1pdCIgbWVhbnMgdXNlIHRoZSBzZWxlY3QoKSB2ZXJzaW9uIG9mIHRoZSBDT05ORUNUIG1vZHVsZS4KK3N1bm9zNDE6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTdW5PUyA0LjEgLyBCU0QuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtTyAtRFNVTk9TNDEgLURIREJVVUNQIC1ETk9VTklDT0RFICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAkKExJQlMpIC1scmVzb2x2IC1sbSIKKworI0FzIGFib3ZlLCBidXQgY29tcGlsZWQgd2l0aCBnY2MuICBHaXZlcyAyNC0zMksgc2l6ZSByZWR1Y3Rpb24KKyN3aXRoIGdjYyAyLjEgb3IgMi4yLjIuICBDQVVUSU9OOiBtYWtlIHN1cmUgImZpeGluY2x1ZGVzIiBoYXMgYmVlbiBydW4gb24KKyN0aGUgaW5jbHVkZSBmaWxlcywgc28gZ2NjJ3MgYXJlIGluIHN5bmMgd2l0aCB0aGUgcmVndWxhciBTdW4gb25lcyEKKyNUaGlzIGluY2x1ZGVzIHRoZSBjdXJzZXMgbGlicmFyeSBmb3IgZnVsbHNjcmVlbiBmaWxlIHRyYW5zZmVyIGRpc3BsYXkuCisjTkRHUFdOQU0gbmVlZGVkIGZvciBHQ0MgMi41LjYsIG5vdCBuZWVkZWQgZm9yIDIuNC4wLCBidXQgaXQncyB1bmNlcnRhaW4KKyN3aGV0aGVyIGl0IHdpbGwgZG8gYW55IGhhcm0gZm9yIDIuNC4wIGNvbXBpbGF0aW9uIC0tIGlmIHNvLCByZW1vdmUgaXQuCitzdW5vczQxZ2NjOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU3VuT1MgNC4xIHdpdGggZ2NjIGFuZCBjdXJzZXMuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQz0gZ2NjIiAiQ0MyPSBnY2MiIFwKKwkiQ0ZMQUdTPSAtTyAtRFNVTk9TNDEgLURIREJVVUNQIC1ETkRHUFdOQU0gLURDS19DVVJTRVMgLURGTkZMT0FUIFwKKwktZnVuc2lnbmVkLWNoYXIgJChLRkxBR1MpIiAiTElCUz0gLWxjdXJzZXMgLWx0ZXJtY2FwIC1scmVzb2x2IC1sbSIKKworIyBBcyBhYm92ZSwgYnV0IHdpdGhvdXQgLWZ1bnNpZ25lZC1jaGFyIHNvIEkgY2FuIHNlZSB0aGUgd2FybmluZ3MgdGhhdAorIyBldmVyeWJvZHkgZWxzZSB3aWxsIGdldCB3aGVuIHRoZXkgdXNlIEFOU0kgY29tcGlsZXJzIHRoYXQgZG9uJ3QgaGF2ZSB0aGlzCisjIG9wdGlvbiAoZ3NjID0gZ2NjIHNpZ25lZCBjaGFyKS4KK3N1bm9zNDFnc2M6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTdW5PUyA0LjEgd2l0aCBnY2MgYW5kIGN1cnNlcy4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDPSBnY2MiICJDQzI9IGdjYyIgXAorCSJDRkxBR1M9IC1PIC1EU1VOT1M0MSAtREhEQlVVQ1AgLUROREdQV05BTSAtRENLX0NVUlNFUyAtREZORkxPQVQgXAorCSQoS0ZMQUdTKSIgIkxJQlM9IC1sY3Vyc2VzIC1sdGVybWNhcCAtbHJlc29sdiAtbG0iCisKKyNBcyBhYm92ZSBidXQgd2l0aCBja3Vjb24uYyByYXRoZXIgdGhhbiBja3VjbnMuYyAoZm9yIHRlc3Rpbmcgb25seSkKK3N1bm9zNDFnY2Nmb3JrOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU3VuT1MgNC4xIHdpdGggZ2NjIGFuZCBjdXJzZXMuLi4KKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQz0gZ2NjIiAiQ0MyPSBnY2MiIFwKKwkiQ0ZMQUdTPSAtTyAtRFNVTk9TNDEgLURIREJVVUNQIC1ETkRHUFdOQU0gLURDS19DVVJTRVMgLURGTkZMT0FUIFwKKwktRE5PTEVBUk4gLWZ1bnNpZ25lZC1jaGFyICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbGN1cnNlcyAtbHRlcm1jYXAgLWxyZXNvbHYgLWxtIgorCisjYXMgYWJvdmUgYnV0IGNvbmZpZ3VyZWQgZm9yIEtlcmJlcm9zIElWCitzdW5vczQxZ2NjK2tyYjQ6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTdW5PUyA0LjEsIGdjYywgY3Vyc2VzLCBrcmI0Li4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0M9IGdjYyIgIkNDMj0gZ2NjIiBcCisJIkNGTEFHUz0gLU8gLURTVU5PUzQxIC1ESERCVVVDUCAtRE5ER1BXTkFNIC1EQ0tfQ1VSU0VTIC1ERk5GTE9BVCBcCisJLURUQ1BTT0NLRVQgLURDS19BVVRIRU5USUNBVElPTiAtRENLX0tFUkJFUk9TICAtREtSQjQgXAorCS1EQ0tfRU5DUllQVElPTiAtRENLX0RFUyAtRENLX0NBU1QgLURCSUdCVUZPSyAtZnVuc2lnbmVkLWNoYXIgXAorCSQoSzRJTkMpICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAkKEs0TElCKSAtbGN1cnNlcyAtbHRlcm1jYXAgLWxyZXNvbHYgLWxtIC1sa3JiIC1sZGVzIgorCisjYXMgYWJvdmUgYnV0IGNvbmZpZ3VyZWQgZm9yIFNTTC9UTFMKK3N1bm9zNDFnY2Mrb3BlbnNzbDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFN1bk9TIDQuMSwgZ2NjLCBjdXJzZXMsIHNzbC4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDPSBnY2MiICJDQzI9IGdjYyIgXAorCSJDRkxBR1M9IC1PIC1EU1VOT1M0MSAtREhEQlVVQ1AgLUROREdQV05BTSAtRENLX0NVUlNFUyAtREZORkxPQVQgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLWZ1bnNpZ25lZC1jaGFyIFwKKwktRENLX1NTTCAtRFRDUFNPQ0tFVCAtREJJR0JVRk9LICQoU1NMSU5DKSAkKEtGTEFHUykiIFwKKwkiTElCUz0gJChTU0xMSUIpIC1sY3Vyc2VzIC1sdGVybWNhcCAtbHJlc29sdiAtbG0gLWxzc2wgLWxjcnlwdG8iCisKKyNhcyBhYm92ZSBidXQgY29uZmlndXJlZCBmb3IgS2VyYmVyb3MgSVYgYW5kIFNTTC9UTFMKK3N1bm9zNDFnY2Mra3JiNCtvcGVuc3NsOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU3VuT1MgNC4xLCBnY2MsIGN1cnNlcywga3JiNC4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDPSBnY2MiICJDQzI9IGdjYyIgXAorCSJDRkxBR1M9IC1PIC1EU1VOT1M0MSAtREhEQlVVQ1AgLUROREdQV05BTSAtRENLX0NVUlNFUyAtREZORkxPQVQgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19LRVJCRVJPUyAtREtSQjQgLURDS19FTkNSWVBUSU9OIC1EQ0tfREVTIFwKKwktRENLX0NBU1QgLURDS19TU0wgLURMSUJERVMgLURUQ1BTT0NLRVQgLURCSUdCVUZPSyAtZnVuc2lnbmVkLWNoYXIgXAorCSQoSzRJTkMpICQoU1NMSU5DKSAkKEtGTEFHUykiIFwKKwkiTElCUz0gJChLNExJQikgJChTU0xMSUIpIFwKKwktbGN1cnNlcyAtbHRlcm1jYXAgLWxyZXNvbHYgLWxtIC1sa3JiIC1sc3NsIC1sY3J5cHRvIgorCisjYXMgYWJvdmUgYnV0IGNvbmZpZ3VyZWQgZm9yIEtlcmJlcm9zIElWIGFuZCBaTElCIGVuYWJsZWQgU1NML1RMUworc3Vub3M0MWdjYytrcmI0K29wZW5zc2wremxpYjoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFN1bk9TIDQuMSwgZ2NjLCBjdXJzZXMsIGtyYjQuLi4KKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQz0gZ2NjIiAiQ0MyPSBnY2MiIFwKKwkiQ0ZMQUdTPSAtTyAtRFNVTk9TNDEgLURIREJVVUNQIC1ETkRHUFdOQU0gLURDS19DVVJTRVMgLURGTkZMT0FUIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfS0VSQkVST1MgLURLUkI0IC1EQ0tfRU5DUllQVElPTiAtRENLX0RFUyBcCisJLURDS19DQVNUIC1EQ0tfU1NMIC1ETElCREVTIC1EVENQU09DS0VUIC1EQklHQlVGT0sgLWZ1bnNpZ25lZC1jaGFyIFwKKwktRFpMSUIgJChLNElOQykgJChTU0xJTkMpIFwKKwkkKEtGTEFHUykiIFwKKwkiTElCUz0gJChLNExJQikgJChTU0xMSUIpIFwKKwktbGN1cnNlcyAtbHRlcm1jYXAgLWxyZXNvbHYgLWxtIC1sa3JiIC1sc3NsIC1sY3J5cHRvIC1seiIKKworI2FzIGFib3ZlIGJ1dCBjb25maWd1cmVkIGZvciBLZXJiZXJvcyBJViBhbmQgU1JQIGFuZCBaTElCIGVuYWJsZWQgU1NML1RMUworc3Vub3M0MWdjYytrcmI0K3NycCtvcGVuc3NsK3psaWI6CisJQGVjaG8gIkMtS2VybWl0ICQoQ0tWRVIpIFN1bk9TIDQuMTogZ2NjLGN1cnNlcyxrcmI0LHNycCxzc2wsemxpYi4uLiIKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQz0gZ2NjIiAiQ0MyPSBnY2MiIFwKKwkiQ0ZMQUdTPSAtTyAtRFNVTk9TNDEgLURIREJVVUNQIC1ETkRHUFdOQU0gLURDS19DVVJTRVMgLURGTkZMT0FUIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfS0VSQkVST1MgLURLUkI0IC1EQ0tfRU5DUllQVElPTiAtRENLX0RFUyBcCisJLURDS19DQVNUIC1EQ0tfU1NMIC1ETElCREVTIC1EVENQU09DS0VUIC1EQklHQlVGT0sgLWZ1bnNpZ25lZC1jaGFyIFwKKwktRFpMSUIgLURDS19TUlAgJChLNElOQykgJChTUlBJTkMpICQoU1NMSU5DKSAkKEtGTEFHUykiIFwKKwkiTElCUz0gJChLNExJQikgJChTUlBMSUIpICQoU1NMTElCKSBcCisJLWxjdXJzZXMgLWx0ZXJtY2FwIC1scmVzb2x2IC1sbSAtbGtyYiAtbGtyeXB0byBcCisJLWxzcnAgLWxzc2wgLWxjcnlwdG8gLWx6IgorCisjYXMgYWJvdmUgYnV0IGNvbmZpZ3VyZWQgZm9yIEtlcmJlcm9zIElWIGFuZCBTUlAgYW5kIFpMSUIgZW5hYmxlZCBTU0wvVExTCitzdW5vczQxZ2NjK3NycCtvcGVuc3NsK3psaWI6CisJQGVjaG8gIkMtS2VybWl0ICQoQ0tWRVIpIFN1bk9TIDQuMTogZ2NjLGN1cnNlcyxzcnAsc3NsLHpsaWIuLi4iCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0M9IGdjYyIgIkNDMj0gZ2NjIiBcCisJIkNGTEFHUz0gLU8gLURTVU5PUzQxIC1ESERCVVVDUCAtRE5ER1BXTkFNIC1EQ0tfQ1VSU0VTIC1ERk5GTE9BVCBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX0VOQ1JZUFRJT04gLURDS19ERVMgXAorCS1EQ0tfQ0FTVCAtRENLX1NTTCAtRExJQkRFUyAtRFRDUFNPQ0tFVCAtREJJR0JVRk9LIC1mdW5zaWduZWQtY2hhciBcCisJLURaTElCIC1EQ0tfU1JQICQoU1JQSU5DKSAkKFNTTElOQykgXAorCSQoS0ZMQUdTKSIgXAorCSJMSUJTPSAkKFNSUExJQikgJChTU0xMSUIpIFwKKwktbGN1cnNlcyAtbHRlcm1jYXAgLWxyZXNvbHYgLWxtIC1sa3J5cHRvIC1sc3JwIC1sc3NsIC1sY3J5cHRvIC1seiAiCisKKyNTVU5PUyA0LjEgYXMgc3Vub3M0MSBhYm92ZSwgYnV0IGFsc28gd2l0aCBjdXJzZXMgc3VwcG9ydAorc3Vub3M0MWM6CisJQGVjaG8gQ3Vyc2VzIHN1cHBvcnQKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHN1bm9zNDEgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0kKEtGTEFHUykgLURDS19DVVJTRVMgLURGTkZMT0FUICIgXAorCSJMSUJTPSAtbGN1cnNlcyAtbHRlcm1jYXAiCisKKyNBcyBTdW5PUyA0LjEueCwgZ2NjLCBjb25maWd1cmVkIGFzIEludGVybmV0IEtlcm1pdCBTZXJ2ZXIuCisjIC4gTk9MT0NBTCByZW1vdmVzIGNhcGFiaWxpdHkgdG8gbWFrZSBjb25uZWN0aW9ucworIyAuIFROQ09ERSBhbGxvd3Mgc2VydmVyLXNpZGUgVGVsbmV0IG5lZ290aWF0aW9uLgorIyAuIHVzZWQgdG8gaW5jbHVkZSAtbHB3ZW50LCB3aHk/CisjIC4gdXNlZCB0byBpbmNsdWRlIC1ML3Vzci9sb2NhbC9saWIgLWxtLCB3aHk/CitzdW5vczQxZ2lrczoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFN1bk9TIDQuMSB3aXRoIGdjYyBmb3IgSUtTLi4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0M9IGdjYyIgIkNDMj0gZ2NjIiBcCisJIkNGTEFHUz0gLU8gLURTVU5PUzQxIC1ETkRHUFdOQU0gLURGTkZMT0FUIFwKKwktRE5PTE9DQUwgLURUQ1BTT0NLRVQgLURUTkNPREUgLUROT1BVU0ggJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sbSAtbHJlc29sdiIKKworI1NVTk9TIDQuMSB3aXRoIFN1bkxpbmsgWC4yNSBzdXBwb3J0CitzdW5vczQxeDI1OgorCUBlY2hvIFN1bkxpbmsgWC4yNSBzdXBwb3J0CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLU8gLURTVU5PUzQxIC1ESERCVVVDUCAtRE5PVU5JQ09ERSAtREZORkxPQVQgLURTVU5YMjUgXAorCS1ETk9MRUFSTiAkKEtGTEFHUykiICJMSUJTPSAkKExJQlMpIC1scmVzb2x2IC1sbSIKKworI1NVTk9TIDQuMSB3aXRoIFN1bkxpbmsgWC4yNSBzdXBwb3J0IGFuZCBjdXJzZXMKK3N1bm9zNDF4MjVjOgorCUBlY2hvIFN1bkxpbmsgWC4yNSBzdXBwb3J0ICsgY3Vyc2VzCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLU8gLURTVU5PUzQxIC1ESERCVVVDUCAtRE5PVU5JQ09ERSAtREZORkxPQVQgLURTVU5YMjUgXAorCS1EQ0tfQ1VSU0VTIC1ETk9MRUFSTiAkKEtGTEFHUykiIFwKKwkiTElCUz0gJChMSUJTKSAtbGN1cnNlcyAtbHRlcm1jYXAgLWxyZXNvbHYgLWxtIgorCisjU1VOIHdpdGggU29sYXJpcyAyLjAgPSBTdW5PUyA1LjAuCisjTW9zdGx5IHRoZSBzYW1lIGFzIFN5c3RlbSBWIFI0LiAgRG9uJ3QgdXNlIHRoaXMgd2l0aCBsYXRlciBTb2xhcmlzIHZlcnNpb25zLgorc29sYXJpczIwOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFN1biB3aXRoIFNvbGFyaXMgMi4wIGFuZCBjdXJzZXMuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EU1ZSNCAtRFNPTEFSSVMgLURESVJFTlQgLURIREJVVUNQIC1EU1RFUk1JT1ggXAorCS1EVENQU09DS0VUIC1EQ0tfQ1VSU0VTIC1ERk5GTE9BVCAtRENLX1BPTEwgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sc29ja2V0IC1sbnNsIC1sY3Vyc2VzIC1sdGVybWxpYiAtbG0iICJMTktGTEFHUyA9IC1zIgorCisjU1VOIHdpdGggU29sYXJpcyAyLjAuCisjQXMgYWJvdmUsIGJ1dCBidWlsdCB3aXRoIHRoZSBnY2MgY29tcGlsZXIgZnJvbSB0aGUgQ3lnbnVzIENELVJPTS4KK3NvbGFyaXMyMGc6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU3VuIFNvbGFyaXMgMi4wLCBnY2MsIGFuZCBjdXJzZXMuLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURTVlI0IC1EU09MQVJJUyAtRERJUkVOVCAtREhEQlVVQ1AgLURTVEVSTUlPWCBcCisJLURUQ1BTT0NLRVQgLURDS19DVVJTRVMgLURDS19QT0xMIC1ERk5GTE9BVCAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxzb2NrZXQgLWxuc2wgLWxjdXJzZXMgLWx0ZXJtbGliIC1sbSIgIkxOS0ZMQUdTID0gLXMiIFwKKwlDQz0vb3B0L2N5Z251cy1zb2wyLTEuMS9iaW4vZ2NjIENDMj0vb3B0L2N5Z251cy1zb2wyLTEuMS9iaW4vZ2NjCisKKyNTdW5PUyA1LjEgPSBTb2xhcmlzIDIuMS4KKyNOT1RFOiBBIEMgY29tcGlsZXIgaXMgbm8gbG9uZ2VyIGJ1bmRsZWQgd2l0aCBTdW5PUyA1LjEsIHNvIHRvIGNvbXBpbGUgQworI3Byb2dyYW1zLCB5b3UgbWlnaHQgaGF2ZSB0byBjaGFuZ2UgeW91ciBQQVRIIHRvIGluY2x1ZGUgdGhlIGRpcmVjdG9yeQorIy91c3IvY2NzL2JpbiBBRlRFUiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNvbXBpbGVyLiAgU3VuUFJPIEMgaXMKKyNpbnN0YWxsZWQgYnkgZGVmYXVsdCBpbiAvb3B0L1NVTldzcHJvL2Jpbi4gIFNvIGEgc2FtcGxlIFBBVEggbWlnaHQgYmU6CisjCisjIC91c3IvbG9jYWwvYmluOi91c3IvYmluOi9vcHQvU1VOV3Nwcm8vYmluOi91c3IvY2NzL2JpbjpcCisjIC91c3IvdWNiOi91c3Ivc2Jpbjovc2JpbjouCisjCisjIG9yOgorIworIyAvdXNyL29wZW53aW4vYmluOi9leHBvcnQvaG9tZS9TVU5Xc3Byby9iaW46L3Vzci9jY3MvYmluOi91c3Ivc2JpbjovdXNyL2Jpbi4KKyMKKyNOT1RFIDI6IENvbXBpbGF0aW9uIHdpdGggdGhlIEFwb2dlZSBDIGNvbXBpbGVyIChhcGNjKSBtaWdodCBub3Qgd29yaywKKyNiZWNhdXNlIGl0IHJlZnVzZXMgdG8gYWxsb3cgIi1Vc3VuIi4gIFJlcG9ydGVkbHksIG5ld2VyIHJlbGVhc2VzIG9mIGFwY2MKKyMoc3VjaCBhcyAxLjIuMTcpIHdvcmsgT0ssIHVzZTogIm1ha2UgLWUgc3Vub3M1MSBDQz1hcGNjIENDMj1hcGNjIi4KK3NvbGFyaXMyMToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTdW5PUyA1LnguLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtVXN1biAtRFNWUjQgLURTT0xBUklTIC1ERElSRU5UIC1ESERCVVVDUCAtREZORkxPQVQgXAorCS1EU0VMRUNUIC1ETk9ERUJVRyAtRFNURVJNSU9YICQoS0ZMQUdTKSIgIkxJQlMgPSAtbG0iICJMTktGTEFHUyA9IC1zIgorCisjQy1LZXJtaXQgZm9yIFNvbGFyaXMgMi4wLTIuNCBjb21waWxlZCB3aXRoIGdjYywgaW5jbHVkZXMgY3Vyc2VzIGFuZCBUQ1AvSVAuCisjQ2hhbmdlIC1PMiB0byAtTyBpZiAtTzIgZ2l2ZXMgdHJvdWJsZS4KKyNSZW1vdmUgLVVzdW4gaWYgaXQgY2F1c2VzIHRyb3VibGUuCisjWW91ciBQQVRIIHNob3VsZCBzdGFydCB3aXRoIHNvbWV0aGluZyBsaWtlOgorIyAgL3Vzci9sb2NhbC9nbnUvYmluOi91c3IvY2NzL2JpbjoKKyNQcm9kdWNlcyBhIGh1Z2UgZXhlY3V0YWJsZSAtLSBzdHJpcCB3aXRoIC91c3IvY2NzL2Jpbi9zdHJpcCAobm90IEdudSBzdHJpcCkuCisjQWxzbyBkb24ndCBhZGQgIkxOS0ZMQUdTID0gLXMiIC0tIHN0cmlwIG1hbnVhbGx5IGluc3RlYWQuCisjQWxzbyBub3RlOiB0aGlzIGNhbiBOT1QgYmUgbGlua2VkIHN0YXRpY2FsbHkgLSBTdW4gbWFrZXMgaXQgaW1wb3NzaWJsZS4KKyNBbmQgZm9yIFNvbGFyaXMgMi40LCB5b3UgbWlnaHQgaGF2ZSB0byByZXBsYWNlOgorIyAvdXNyL2xvY2FsL2xpYi9nY2MtbGliL2k0ODYtc3VuLXNvbGFyaXMyLzIuNC41L2luY2x1ZGUvc3lzL3N0YXQuaAorI3dpdGggL3Vzci9pbmNsdWRlL3N5cy9zdGF0LmguCitzb2xhcmlzMnhnOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNvbGFyaXMgMi54IHdpdGggR05VIGNjLi4uJworCUBlY2hvICdQbGVhc2UgcmVhZCB0aGUgY29tbWVudHMgdGhhdCBhY2NvbXBhbnkgdGhlIHNvbGFyaXMyeGcgdGFyZ2V0LicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IENDPWdjYyBDQzI9Z2NjIFwKKwkiQ0ZMQUdTID0gLWcgLU8gLVVzdW4gLURTVlI0IC1EU09MQVJJUyAtRFNURVJNSU9YIC1EU0VMRUNUIC1ERk5GTE9BVCBcCisJLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1ERElSRU5UIC1ESERCVVVDUCAtRFRDUFNPQ0tFVCAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWx0ZXJtbGliIC1sc29ja2V0IC1sbnNsIC1sbSAtbHJlc29sdiAkKExJQlMpIgorCisjZGl0dG8gYnV0IG5vIGN1cnNlcy4KK3NvbGFyaXMyeGduYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTb2xhcmlzIDIueCB3aXRoIEdOVSBjYy4uLicKKwlAZWNobyAnUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnRzIHRoYXQgYWNjb21wYW55IHRoZSBzb2xhcmlzMnhnIHRhcmdldC4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBDQz1nY2MgQ0MyPWdjYyBcCisJIkNGTEFHUyA9IC1nIC1PIC1Vc3VuIC1EU1ZSNCAtRFNPTEFSSVMgLURTVEVSTUlPWCAtRFNFTEVDVCAtREZORkxPQVQgXAorCS1ERElSRU5UIC1ESERCVVVDUCAtRFRDUFNPQ0tFVCAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxzb2NrZXQgLWxuc2wgLWxtIC1scmVzb2x2ICQoTElCUykiCisKKyNhbmQgd2l0aCBLZXJiZXJvcyBJVgorc29sYXJpczJ4ZytrcmI0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNvbGFyaXMgMi54IHdpdGggR05VIGNjLCBrcmI0Li4uJworCUBlY2hvICdQbGVhc2UgcmVhZCB0aGUgY29tbWVudHMgdGhhdCBhY2NvbXBhbnkgdGhlIHNvbGFyaXMyeGcgdGFyZ2V0LicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IENDPWdjYyBDQzI9Z2NjIFwKKwkiQ0ZMQUdTID0gLWcgLU8gLVVzdW4gLURTVlI0IC1EU09MQVJJUyAtRFNURVJNSU9YIC1EU0VMRUNUIC1ERk5GTE9BVCBcCisJLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1ERElSRU5UIC1ESERCVVVDUCAtRFRDUFNPQ0tFVCBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX0tFUkJFUk9TICAtREtSQjQgLURDS19FTkNSWVBUSU9OIFwKKwktRENLX0RFUyAtRENLX0NBU1QgLURCSUdCVUZPSyAkKEs0SU5DKSAkKEtGTEFHUykiIFwKKwkiTElCUz0gJChLNExJQikgLWx0ZXJtbGliIC1sc29ja2V0IC1sbnNsIC1sbSAtbHJlc29sdiAtbGtyYiAtbGRlcyBcCisJJChMSUJTKSIKKworI2FuZCB3aXRoIE9wZW5TU0wsWkxJQixQQU0sU0hBRE9XCitzb2xhcmlzMnhnK29wZW5zc2wremxpYitwYW0rc2hhZG93OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNvbGFyaXMgMi54IHdpdGggZ2NjLCBPcGVuU1NMLi4uJworCUBlY2hvICdQbGVhc2UgcmVhZCB0aGUgY29tbWVudHMgdGhhdCBhY2NvbXBhbnkgdGhlIHNvbGFyaXMyeGcgdGFyZ2V0LicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IENDPWdjYyBDQzI9Z2NjIFwKKwkiQ0ZMQUdTID0gLWcgLU8gLVVzdW4gLURTVlI0IC1EU09MQVJJUyAtRFNURVJNSU9YIC1EU0VMRUNUIC1ERk5GTE9BVCBcCisJLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1ERElSRU5UIC1ESERCVVVDUCAtRFRDUFNPQ0tFVCBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX1NTTCAtRENLX1BBTSAtRENLX1NIQURPVyAgLURaTElCIFwKKwktREJJR0JVRk9LICQoU1NMSU5DKSAkKEtGTEFHUykiIFwKKwkiTElCUz0gJChTU0xMSUIpIC1sdGVybWxpYiBcCisJLWxzb2NrZXQgLWxuc2wgLWxtIC1scmVzb2x2IC1sc3NsIC1sY3J5cHRvIC1scGFtIC1seiIKKworI0RpdHRvIGJ1dCB3aXRoIEdDQyAzLjEgaW4gd2hpY2ggeW91IGhhdmUgdG8gc3BlY2lmeSAzMi1iaXQgd2l0aCAtbTMyLgorI0luIFNvbGFyaXMgOSAoYW5kIG1heWJlIDgpIHlvdSdsbCBhbHNvIG5lZWQgc3BlY2lmaXkgdGhlIExpYnJhcnkgcGF0aC4KKyNSZXBvcnRlZGx5IHRoaXMgY2FuJ3QgYmUgZG9uZSBoZXJlLCBidXQgb25seSB3aXRoOgorIyBjcmxlIC1sIC91c3IvbGliOi91c3IvbG9jYWwvc3NsL2xpYgorI3ByaW9yIHRvIGJ1aWxkaW5nLiAgTm90ZTogNjQtYml0IG5vdCB0ZXN0ZWQgd2l0aCBTU0wuCisjRm9yIG5vLWNyeXB0byA2NC1iaXQgYnVpbGRzIHNlZSB0aGUgc29sYXJpczlnNjQgdGFyZ2V0Lgorc29sYXJpczJ4ZzMyK29wZW5zc2wremxpYitwYW0rc2hhZG93OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNvbGFyaXMgMi54IHdpdGggZ2NjLCBPcGVuU1NMLi4uJworCUBlY2hvICdQbGVhc2UgcmVhZCB0aGUgY29tbWVudHMgdGhhdCBhY2NvbXBhbnkgdGhlIHNvbGFyaXMyeGcgdGFyZ2V0LicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IENDPSJnY2MgLW0zMiIgQ0MyPSJnY2MgLW0zMiIgXAorCSJDRkxBR1MgPSAtZyAtTyAtVXN1biAtRFNWUjQgLURTT0xBUklTIC1EU1RFUk1JT1ggLURTRUxFQ1QgLURGTkZMT0FUIFwKKwktRENLX0NVUlNFUyAtRENLX05FV1RFUk0gLURESVJFTlQgLURIREJVVUNQIC1EVENQU09DS0VUIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfU1NMIC1EQ0tfUEFNIC1EQ0tfU0hBRE9XICAtRFpMSUIgXAorCS1EQklHQlVGT0sgJChTU0xJTkMpICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAkKFNTTExJQikgLWx0ZXJtbGliIFwKKwktbHNvY2tldCAtbG5zbCAtbG0gLWxyZXNvbHYgLWxzc2wgLWxjcnlwdG8gLWxwYW0gLWx6IgorCisjYW5kIHdpdGggS3JiNSxLcmI0LE9wZW5TU0wsU0hBRE9XCitzb2xhcmlzMnhnK2tyYjUra3JiNCtvcGVuc3NsK3NoYWRvdzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTb2xhcmlzIDIueCB3aXRoIGdjYyxrNSxrNCxzc2wuLi4nCisJQGVjaG8gJ1BsZWFzZSByZWFkIHRoZSBjb21tZW50cyB0aGF0IGFjY29tcGFueSB0aGUgc29sYXJpczJ4ZyB0YXJnZXQuJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gQ0M9Z2NjIENDMj1nY2MgXAorCSJDRkxBR1MgPSAtTyAtVXN1biAtRFNWUjQgLURTT0xBUklTIC1EU1RFUk1JT1ggLURTRUxFQ1QgLURGTkZMT0FUIFwKKwktRENLX0NVUlNFUyAtRENLX05FV1RFUk0gLURESVJFTlQgLURIREJVVUNQIC1EVENQU09DS0VUIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfS0VSQkVST1MgLURLUkI1IC1ES1JCNCAtREtSQjUyNCBcCisJLURDS19FTkNSWVBUSU9OIC1EQ0tfU1NMIC1EQ0tfREVTIC1EQ0tfQ0FTVCAtREJJR0JVRk9LIFwKKwkkKEs1SU5DKSAkKEs1SU5DKS9rcmI1ICQoU1NMSU5DKSAkKEtGTEFHUykiIFwKKwkiTElCUz0gJChLNUxJQikgJChTU0xMSUIpIC1sdGVybWxpYiAtbHNvY2tldCAtbG5zbCAtbG0gLWxyZXNvbHYgXAorCS1sa3JiNCAtbHNzbCAtbGNyeXB0byAtbGdzc2FwaV9rcmI1IC1sa3JiNSAtbGNvbV9lcnIgLWxrNWNyeXB0byBcCisJLWxkZXMgJChMSUJTKSIKKworI2FuZCB3aXRoIE9wZW5TU0wKK3NvbGFyaXMyeGcrb3BlbnNzbCtwYW0rc2hhZG93OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNvbGFyaXMgMi54IHdpdGggZ2NjLCBPcGVuU1NMLi4uJworCUBlY2hvICdQbGVhc2UgcmVhZCB0aGUgY29tbWVudHMgdGhhdCBhY2NvbXBhbnkgdGhlIHNvbGFyaXMyeGcgdGFyZ2V0LicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IENDPWdjYyBDQzI9Z2NjIFwKKwkiQ0ZMQUdTID0gLWcgLU8gLVVzdW4gLURTVlI0IC1EU09MQVJJUyAtRFNURVJNSU9YIC1EU0VMRUNUIC1ERk5GTE9BVCBcCisJLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1ERElSRU5UIC1ESERCVVVDUCAtRFRDUFNPQ0tFVCBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX1NTTCAtRENLX1BBTSAtRENLX1NIQURPVyBcCisJLURCSUdCVUZPSyAkKFNTTElOQykgJChLRkxBR1MpIiBcCisJIkxJQlM9ICQoU1NMTElCKSAtbHRlcm1saWIgXAorCS1sc29ja2V0IC1sbnNsIC1sbSAtbHJlc29sdiAtbHNzbCAtbGNyeXB0byAtbHBhbSIKKworc29sYXJpczJ4ZytvcGVuc3NsK3psaWIrc3JwK3BhbStzaGFkb3c6CQorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNvbGFyaXMgMi54IHdpdGggZ2NjLCBPcGVuU1NMLi4uJworCUBlY2hvICdQbGVhc2UgcmVhZCB0aGUgY29tbWVudHMgdGhhdCBhY2NvbXBhbnkgdGhlIHNvbGFyaXMyeGcgdGFyZ2V0LicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IENDPWdjYyBDQzI9Z2NjIFwKKwkiQ0ZMQUdTID0gLWcgLU8gLVVzdW4gLURTVlI0IC1EU09MQVJJUyAtRFNURVJNSU9YIC1EU0VMRUNUIC1ERk5GTE9BVCBcCisJLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1ERElSRU5UIC1ESERCVVVDUCAtRFRDUFNPQ0tFVCAtREJJR0JVRk9LIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfRU5DUllQVElPTiAtRENLX0RFUyAtRExJQkRFUyAtRENLX0NBU1QgXAorCS1EQ0tfU1NMIC1EQ0tfUEFNIC1EQ0tfU0hBRE9XIC1EWkxJQiAtRENLX1NSUCAkKFNTTElOQykgJChLRkxBR1MpIiBcCisJIkxJQlM9ICQoU1NMTElCKSAtbHRlcm1saWIgLWxzb2NrZXQgLWxuc2wgLWxtIC1scmVzb2x2IC1sc3JwIC1sc3NsIFwKKwktbGRlcyAtbGtyeXB0byAtbGNyeXB0byAtbHBhbSAtbHoiCisKK3NvbGFyaXMyMmc6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiAiS0ZMQUdTPS1EUE9TSVhfQ1JUU0NUUyAkKEtGTEFHUykiIHNvbGFyaXMyeGcgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworc29sYXJpczIzZzoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiICJLRkxBR1M9LURQT1NJWF9DUlRTQ1RTICQoS0ZMQUdTKSIgc29sYXJpczJ4ZyBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCisjU29sYXJpcyAyLjQgYnVpbHQgd2l0aCBnY2MKK3NvbGFyaXMyNGc6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwlzb2xhcmlzMnhnICJLRkxBR1M9LURTT0xBUklTMjQgLURQT1NJWF9DUlRTQ1RTICQoS0ZMQUdTKSIKKworI1NvbGFyaXMgMi41IGJ1aWx0IHdpdGggZ2NjCitzb2xhcmlzMjVnOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc29sYXJpczJ4ZyBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1mdW5zaWduZWQtY2hhciAtRFNPTEFSSVMyNSAkKEtGTEFHUykiCisKKyNTb2xhcmlzIDIuNSBidWlsdCB3aXRoIGdjYyBhbmQgS2VyYmVyb3MgSVYKK3NvbGFyaXMyNWcra3JiNDoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNvbGFyaXMyeGcra3JiNCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1mdW5zaWduZWQtY2hhciAtRFNPTEFSSVMyNSAkKEtGTEFHUykiCisKKyNTb2xhcmlzIDIuNSBidWlsdCB3aXRoIGdjYyBhbmQgS2VyYmVyb3MgVi9JViwgU1NMLCAuLi4KK3NvbGFyaXMyNWcra3JiNStrcmI0K29wZW5zc2wrc2hhZG93OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc29sYXJpczJ4ZytrcmI1K2tyYjQrb3BlbnNzbCtzaGFkb3cgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LWZ1bnNpZ25lZC1jaGFyIC1EU09MQVJJUzI1ICQoS0ZMQUdTKSIKKworI1NvbGFyaXMgMi42IHdpdGggZ2NjCitzb2xhcmlzMjZnOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBzb2xhcmlzMnhnIFwKKwkiS0ZMQUdTPSAtRFNPTEFSSVMyNiAtRENLX1BBTSAtRENLX1NIQURPVyAkKEtGTEFHUykiIFwKKwkiTElCUyA9IC1scGFtIgorCisjU29sYXJpcyAyLjYgd2l0aCBnY2MgYW5kIFNTTAorc29sYXJpczI2ZytvcGVuc3NsOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgIHNvbGFyaXMyeGcrb3BlbnNzbCtwYW0rc2hhZG93IFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJLRkxBR1M9IC1EU09MQVJJUzI2ICQoS0ZMQUdTKSIKKworI1NvbGFyaXMgMi42IHdpdGggZ2NjLCBubyBjdXJzZXMgKGUuZy4gYmVjYXVzZSBsaWJ0ZXJtbGliIGlzIG1pc3NpbmcpLgorc29sYXJpczI2Z25jOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBzb2xhcmlzMnhnbmMgXAorCSJLRkxBR1M9IC1EU09MQVJJUzI2IC1EQ0tfUEFNIC1EQ0tfU0hBRE9XICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbHBhbSIKKworI1NvbGFyaXMgNyB3aXRoIGdjYyAoMzItYml0KQorc29sYXJpczdnOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc29sYXJpczJ4ZyBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1EU09MQVJJUzcgLURDS19QQU0gLURDS19TSEFET1cgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1scGFtIgorCisjU29sYXJpcyA3IHdpdGggZ2NjICsgS2VyYmVyb3MgSVYgKDMyLWJpdCkKK3NvbGFyaXM3ZytrcmI0OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc29sYXJpczJ4ZytrcmI0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURTT0xBUklTNyAtRENLX1BBTSAtRENLX1NIQURPVyAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxwYW0iCisKK3NvbGFyaXM3ZytvcGVuc3NsK3psaWIrcGFtK3NoYWRvdzoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNvbGFyaXMyeGcrb3BlbnNzbCt6bGliK3BhbStzaGFkb3cgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURTT0xBUklTNyAtRENLX1BBTSAtRENLX1NIQURPVyAkKEtGTEFHUykiCisKKyNTb2xhcmlzIDcgd2l0aCBnY2MgKyBPcGVuU1NMICgzMi1iaXQpCitzb2xhcmlzN2crb3BlbnNzbCt6bGliK3NycCtwYW0rc2hhZG93OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc29sYXJpczJ4ZytvcGVuc3NsK3psaWIrc3JwK3BhbStzaGFkb3cgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURTT0xBUklTNyAtRENLX1BBTSAtRENLX1NIQURPVyAkKEtGTEFHUykiCisKKyNTb2xhcmlzIDggd2l0aCBnY2MgKDMyLWJpdCkKK3NvbGFyaXM4ZzoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNvbGFyaXMyeGcgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFNPTEFSSVM4IC1EQ0tfUEFNIC1EQ0tfU0hBRE9XICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbHBhbSIKKworI1NvbGFyaXMgOSB3aXRoIGdjYyArIE9wZW5TU0wgKyBTaGFkb3cgKDMyLWJpdCkKK3NvbGFyaXM5ZytvcGVuc3NsK3NoYWRvdytwYW0remxpYjoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNvbGFyaXMyeGcrb3BlbnNzbCt6bGliK3BhbStzaGFkb3cgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURTT0xBUklTOSAtREhEQlVVQ1AgLURESVJFTlQgLURaTElCIC1EQ0tfUEFNIC1EQ0tfU0hBRE9XIFwKKwktRExJQkRFUyAkKEtGTEFHUykiICJMSUJTPSAtbHBhbSAtbGRlczQyNSAtbHogJChMSUJTKSIKKworI1NvbGFyaXMgOSB3aXRoIGdjYyArIE9wZW5TU0wgKyBLZXJiZXJvcyA1ICsgS3JiNCArIFNoYWRvdyAoMzItYml0KQorc29sYXJpczlnK2tyYjUra3JiNCtvcGVuc3NsK3NoYWRvdytwYW0remxpYjoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNvbGFyaXMyeGcra3JiNStrcmI0K29wZW5zc2wrc2hhZG93IFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1EU09MQVJJUzkgLURIREJVVUNQIC1ERElSRU5UIC1EWkxJQiAtRENLX1BBTSAtRENLX1NIQURPVyBcCisJLURMSUJERVMgJChLRkxBR1MpIiAiTElCUz0gLWxwYW0gLWxkZXM0MjUgLWx6ICQoTElCUykiCisKKyNTb2xhcmlzIDkgd2l0aCBnY2MgMy4xICgzMi1iaXQpCitzb2xhcmlzOWc6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU29sYXJpcyA5IHdpdGggZ2NjJworCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgQ0M9ImdjYyAtbTMyIiBDQzI9ImdjYyAtbTMyIiB4ZXJtaXQgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtZyAtTyAtVXN1biAtRFNWUjQgLURTT0xBUklTIC1EU09MQVJJUzkgLURVU0VfU1RSRVJST1IgXAorCS1EU1RFUk1JT1ggLURTRUxFQ1QgLURGTkZMT0FUIC1EQ0tfUEFNIC1EQ0tfU0hBRE9XIC1mdW5zaWduZWQtY2hhciBcCisJLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1ERElSRU5UIC1ESERCVVVDUCAtRFRDUFNPQ0tFVCAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWx0ZXJtbGliIC1sc29ja2V0IC1sbnNsIC1sbSAtbHJlc29sdiAtbHBhbSIKKworI1NvbGFyaXMgOSB3aXRoIGdjYyAzLjEgKDY0LWJpdCkKKyNQZWVraW5nIGluc2lkZSBzdHJ1Y3QgRklMRSBhdCBpdHMgbWVtYmVycyBpc3Qgc3RyZW5nc3QgdmVyYm90ZW4uCitzb2xhcmlzOWc2NDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTb2xhcmlzIDkgd2l0aCBnY2MnCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBDQz0iZ2NjIC1tNjQiIENDMj0iZ2NjIC1tNjQiIHhlcm1pdCBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1nIC1PIC1Vc3VuIC1EU1ZSNCAtRFNPTEFSSVMgCS1EU09MQVJJUzkgLUROT0FSUk9XS0VZUyBcCisJLURTVEVSTUlPWCAtRFNFTEVDVCAtREZORkxPQVQgLURVU0VfU1RSRVJST1IgLURDS19QQU0gLURDS19TSEFET1cgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRERJUkVOVCAtREhEQlVVQ1AgLURUQ1BTT0NLRVQgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sdGVybWxpYiAtbHNvY2tldCAtbG5zbCAtbG0gLWxyZXNvbHYgLWxwYW0iCisKKyMgSW4gT3BlblNTTCBidWlsZHMgYWRkIC1sZGwgaWYgeW91IGdldCB1bnJlc29sdmVkIHJlZmVyZW5jZXMgZm9yCisjIGRsY2xvc2UsIGRsc3ltLCBkbG9wZW4sIGRsZXJyb3IuCisKKyNTb2xhcmlzIDggd2l0aCBnY2MgKyBPcGVuU1NMICgzMi1iaXQpCitzb2xhcmlzOGcrb3BlbnNzbCt6bGliK3BhbStzaGFkb3c6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzb2xhcmlzMnhnK29wZW5zc2wremxpYitwYW0rc2hhZG93IFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJLRkxBR1M9LURTT0xBUklTOCAkKEtGTEFHUykiCisKKyNTb2xhcmlzIDkgd2l0aCBnY2MgMy4xICsgT3BlblNTTCAoMzItYml0KQorc29sYXJpczlnK29wZW5zc2wremxpYitwYW0rc2hhZG93OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc29sYXJpczJ4ZzMyK29wZW5zc2wremxpYitwYW0rc2hhZG93IFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1EU09MQVJJUzkgLURVU0VfU1RSRVJST1IgJChLRkxBR1MpIgorCisjU29sYXJpcyA4IHdpdGggZ2NjICsgS2VyYmVyb3MgSVYgKDMyLWJpdCkKK3NvbGFyaXM4ZytrcmI0OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc29sYXJpczJ4ZytrcmI0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURTT0xBUklTOCAtRENLX1BBTSAtRENLX1NIQURPVyAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxwYW0iCisKKyNTb2xhcmlzIDIuMC0yLjQsIGdjYywgU3VuTGluayBYLjI1IGFkZGVkLgorI05PVEU6IENhbid0IHVzZSB4ZXJtaXQgdGFyZ2V0IHdpdGggWC4yNS4KK3NvbGFyaXMyeGd4MjU6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU29sYXJpcyAyLnggKyBYLjI1IHdpdGggR05VIGNjLi4uJworCUBlY2hvICdQbGVhc2UgcmVhZCB0aGUgY29tbWVudHMgdGhhdCBhY2NvbXBhbnkgdGhlIHNvbGFyaXMyeGcgZW50cnkuJworCSQoTUFLRSkgd2VybWl0IENDPWdjYyBDQzI9Z2NjIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtZyAtTyAtVXN1biAtRFNWUjQgLURTT0xBUklTIC1EU1RFUk1JT1ggLURTRUxFQ1QgLURTVU5YMjUgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRERJUkVOVCAtREhEQlVVQ1AgLURUQ1BTT0NLRVQgLURGTkZMT0FUIFwKKwktRE5PTEVBUk4gJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sdGVybWxpYiAtbG0gLUwvb3B0L1NVTldjb25uL2xpYiAtUi9vcHQvU1VOV2Nvbm4vbGliIFwKKwktbHNvY2t4MjUgLWxzb2NrZXQgLWxuc2wiCisKKyNTb2xhcmlzIDIuNSwgZ2NjLCBTdW5MaW5rIFguMjUgYWRkZWQuCitzb2xhcmlzMjVneDI1OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBzb2xhcmlzMnhneDI1IFwKKwkiS0ZMQUdTPS1EU09MQVJJUzI1ICQoS0ZMQUdTKSIKKworI1NvbGFyaXMgMi42LCBnY2MsIFN1bkxpbmsgWC4yNSBhZGRlZC4KK3NvbGFyaXMyNmd4MjU6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IHNvbGFyaXMyeGd4MjUgXAorCSJLRkxBR1M9LURTT0xBUklTMjYgLURDS19QQU0gLURDS19TSEFET1cgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1scGFtIgorCisjU29sYXJpcyAyLjAgLSAyLjQsIFN1blBybyBjb21waWxlciwgaW5jbHVkZXMgY3Vyc2VzIGFuZCBUQ1AvSVAuCisjV2hlbiB1c2luZyBTVU5Xc3BybyBDQyAyLjAuMSB1bmRlciBTb2xhcmlzIDIuMywgYmUgc3VyZSBhbGwgY2MgcGF0Y2hlcworI2FyZSBhcHBsaWVkLCBvdGhlcndpc2UgY29ycnVwdCBvciB0cnVuY2F0ZWQgb2JqZWN0IGZpbGVzIGNhbiByZXN1bHQuCisjVG8gYnVpbGQsIHNldCB5b3VyIFBBVEggYXMgZm9sbG93czoKKyMgIC91c3IvbG9jYWwvYmluOi91c3IvYmluOi9vcHQvU1VOV3Nwcm8vYmluOi91c3IvY2NzL2JpbjpcCisjICAvdXNyL3VjYjovdXNyL3NiaW46L3NiaW46LgorIyBvciAoZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBjb21waWxlciBoYXMgYmVlbiBpbnN0YWxsZWQpOgorIyAgL3Vzci9vcGVud2luL2JpbjovZXhwb3J0L2hvbWUvU1VOV3Nwcm8vYmluOi91c3IvY2NzL2JpbjovdXNyL3NiaW46L3Vzci9iaW4uCisjRm9yIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9uIHRyeSB1c2luZyAiLWZhc3QgLXhPNCAteGRlcGVuZCIuCitzb2xhcmlzMng6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU29sYXJpcyAyLnggd2l0aCBTdW5Qcm8gY2MuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1Vc3VuIC1pIC1EU1ZSNCAtRERJUkVOVCAtRFNPTEFSSVMgLURIREJVVUNQIC1ERk5GTE9BVCBcCisJLURTRUxFQ1QgLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgJChLRkxBR1MpIiBcCisJIkxOS0ZMQUdTID0gLXMiICJMSUJTPSAtbHRlcm1saWIgLWxzb2NrZXQgLWxuc2wgLWxtIC1scmVzb2x2IgorCisjYXMgYWJvdmUgYnV0IGNvbmZpZ3VyZWQgZm9yIEtlcmJlcm9zIElWCitzb2xhcmlzMngra3JiNDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTb2xhcmlzIDIueCwgU3VuUHJvIGNjLCBrcmI0Li4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtVXN1biAtaSAtRFNWUjQgLURESVJFTlQgLURTT0xBUklTIC1ESERCVVVDUCAtREZORkxPQVQgXAorCS1EU0VMRUNUIC1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRFNURVJNSU9YIC1EVENQU09DS0VUICBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX0tFUkJFUk9TICAtREtSQjQgXAorCS1EQ0tfRU5DUllQVElPTiAtRENLX0RFUyAtRENLX0NBU1QgJChLNElOQykgJChLRkxBR1MpIiBcCisJIkxOS0ZMQUdTID0gLXMiIFwKKwkiTElCUz0gJChLNExJQikgLWx0ZXJtbGliIC1sc29ja2V0IC1sbnNsIC1sbSAtbHJlc29sdiAtbGtyYiAtbGRlcyIKKworc29sYXJpczIzOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc29sYXJpczJ4IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9JChLRkxBR1MpIgorCitzb2xhcmlzMjQ6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzb2xhcmlzMnggS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFNPTEFSSVMyNCAtRFBPU0lYX0NSVFNDVFMgJChLRkxBR1MpIgorCisjIHRlbXBsYXRlIGZvciBTb2xhcmlzIDIuNSBhbmQgYWJvdmUuCitzb2xhcmlzMjV4OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNvbGFyaXMgMi54IHdpdGggU3VuUHJvIGNjLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREZORkxPQVQgLU8gLVVzdW4gLWkgJChLRkxBR1MpIiBcCisJIkxOS0ZMQUdTID0gLXMiIFwKKwkiTElCUz0gLWx0ZXJtbGliIC1sc29ja2V0IC1sbnNsIC1sbSAtbHJlc29sdiAkKExJQlMpIgorCisjU29sYXJpcyAyLjUsIFN1blBybyBjb21waWxlciwgY3Vyc2VzLCBUQ1AvSVAKK3NvbGFyaXMyNToKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNvbGFyaXMyNXggS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFNPTEFSSVMyNSAkKEtGTEFHUykiCisKKyNTb2xhcmlzIDIuNSwgU3VuUHJvIGNvbXBpbGVyLCBjdXJzZXMsIFRDUC9JUCwgS2VyYmVyb3MgSVYKK3NvbGFyaXMyNStrcmI0OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc29sYXJpczI1eCtrcmI0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURTT0xBUklTMjUgJChLRkxBR1MpIgorCisjU29sYXJpcyAyLjYsIFN1blBybyBjb21waWxlciwgY3Vyc2VzLCBUQ1AvSVAKK3NvbGFyaXMyNjoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNvbGFyaXMyNXggS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFNPTEFSSVMyNiAtRENLX1BBTSAtRENLX1NIQURPVyAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxwYW0iCisKKyNTb2xhcmlzIDcgKGFrYSAyLjcpCitzb2xhcmlzNzoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNvbGFyaXMyNXggS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFNPTEFSSVM3IC1EQ0tfUEFNIC1EQ0tfU0hBRE9XICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbHBhbSIKKworI1NvbGFyaXMgOAorc29sYXJpczg6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzb2xhcmlzMjV4IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURTT0xBUklTOCAtRENLX1BBTSAtRENLX1NIQURPVyAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxwYW0iCisKKyNTb2xhcmlzIDkKK3NvbGFyaXM5OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc29sYXJpczI1eCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1EU09MQVJJUzkgLURDS19QQU0gLURDS19TSEFET1cgLURVU0VfU1RSRVJST1IgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1scGFtIgorCisjU29sYXJpcyA5IHdpdGggbWFsbG9jIGRlYnVnZ2luZworc29sYXJpczltZDoKKwkkKE1BS0UpIG1lcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLURGTkZMT0FUIC1PIC1Vc3VuIC1pIFwKKwktRFNPTEFSSVM5IC1EbWFsbG9jPWRtYWxsb2MgLURmcmVlPWRmcmVlIC1ETURFQlVHIFwKKwktRENLX1BBTSAtRENLX1NIQURPVyAtRFVTRV9TVFJFUlJPUiAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxwYW0gLWx0ZXJtbGliIC1sc29ja2V0IC1sbnNsIC1sbSAtbHJlc29sdiIKKworI1NvbGFyaXMgMi4wLTIuMywgU3VuUHJvIGNvbXBpbGVyLCB3aXRoIFN1bkxpbmsgWC4yNSBzdXBwb3J0LgorI1RoaXMgd2lsbCBvbmx5IHJ1biBpZiB1c2VyIGhhcyAvb3B0L1NVTldjb25uL2xpYi9saWJzb2NreDI1LnNvLjEKKyNleGlzdHMgYW5kIGNhbiBiZSBkeW5hbWljYWxseSBsaW5rZWQuCisjTk9URTogRG8gbm90IGNoYW5nZSB0YXJnZXQgdG8geGVybWl0IC0tIGl0IGRvZXNuJ3Qgc3VwcG9ydCBYLjI1Lgorc29sYXJpczJ4MjU6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU29sYXJpcyAyLngrWC4yNSB3aXRoIFN1blBybyBjYy4uLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLWkgLVVzdW4gLURTVlI0IC1EU09MQVJJUyAtRERJUkVOVCBcCisJLURTVU5YMjUgLURUQ1BTT0NLRVQgLURIREJVVUNQIC1ERk5GTE9BVCAtRE5PTEVBUk4gXAorCS1EU0VMRUNUIC1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRFNURVJNSU9YICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1zIiBcCisJIkxJQlM9IC1sdGVybWxpYiAtTC9vcHQvU1VOV2Nvbm4vbGliIC1SL29wdC9TVU5XY29ubi9saWIgXAorCS1sc29ja3gyNSAtbHNvY2tldCAtbG5zbCAtbG0gLWxyZXNvbHYiCisKKyNTb2xhcmlzIDIuNCwgU3VuUHJvIGNvbXBpbGVyLCB3aXRoIFN1bkxpbmsgWC4yNSBzdXBwb3J0LgorI1RoaXMgd2lsbCBvbmx5IHJ1biBpZiB1c2VyIGhhcyAvb3B0L1NVTldjb25uL2xpYi9saWJzb2NreDI1LnNvLjEKKyNleGlzdHMgYW5kIGNhbiBiZSBkeW5hbWljYWxseSBsaW5rZWQuCitzb2xhcmlzMjR4MjU6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU29sYXJpcyAyLjQrWC4yNSB3aXRoIFN1blBybyBjYy4uLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLWkgLVVzdW4gLURTVlI0IC1EU09MQVJJUyAtRFNPTEFSSVMyNCAtRERJUkVOVCAtRE5PTEVBUk4gXAorCS1EU1VOWDI1IC1EVENQU09DS0VUIC1ESERCVVVDUCAtREZORkxPQVQgLURQT1NJWF9DUlRTQ1RTIFwKKwktRFNFTEVDVCAtRENLX0NVUlNFUyAtRENLX05FV1RFUk0gLURTVEVSTUlPWCAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtcyIgXAorCSJMSUJTPSAtbHRlcm1saWIgLUwvb3B0L1NVTldjb25uL2xpYiAtUi9vcHQvU1VOV2Nvbm4vbGliIFwKKwktbHNvY2t4MjUgLWxzb2NrZXQgLWxuc2wgLWxtIC1scmVzb2x2IgorCisjU29sYXJpcyAyLjUsIFN1blBybyBjb21waWxlciwgd2l0aCBTdW5MaW5rIFguMjUgc3VwcG9ydC4KK3NvbGFyaXMyNXgyNToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTb2xhcmlzIDIuNStYLjI1IHdpdGggU3VuUHJvIGNjLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtaSAtVXN1biAtRFNWUjQgLURTT0xBUklTMjUgLURESVJFTlQgLURTVU5YMjUgXAorCS1EVENQU09DS0VUIC1ESERCVVVDUCAtRFNFTEVDVCAtRENLX0NVUlNFUyBcCisJLURDS19ORVdURVJNIC1EU1RFUk1JT1ggLURGTkZMT0FUIC1EUE9TSVhfQ1JUU0NUUyAtRE5PTEVBUk4gXAorCS1JL29wdC9TVU5XY29ubi9pbmNsdWRlICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbHRlcm1saWIgLUwvb3B0L1NVTldjb25uL2xpYiAtUi9vcHQvU1VOV2Nvbm4vbGliIFwKKwktbHNvY2t4MjUgLWxzb2NrZXQgLWxuc2wgLWxtIC1scmVzb2x2IgorCisjU29sYXJpcyAyLjYsIFN1blBybyBjb21waWxlciwgd2l0aCBTdW5MaW5rIFguMjUgc3VwcG9ydC4KK3NvbGFyaXMyNngyNToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTb2xhcmlzIDIuNitYLjI1IHdpdGggU3VuUHJvIGNjLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtaSAtVXN1biAtRFNWUjQgLURTT0xBUklTMjYgLURESVJFTlQgLURTVU5YMjUgXAorCS1EVENQU09DS0VUIC1ESERCVVVDUCAtRFNFTEVDVCAtRENLX0NVUlNFUyAtRENLX1BBTSAtRENLX1NIQURPVyBcCisJLURDS19ORVdURVJNIC1EU1RFUk1JT1ggLURGTkZMT0FUIC1EUE9TSVhfQ1JUU0NUUyAtRE5PTEVBUk4gXAorCS1JL29wdC9TVU5XY29ubi9pbmNsdWRlICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbHRlcm1saWIgLUwvb3B0L1NVTldjb25uL2xpYiAtUi9vcHQvU1VOV2Nvbm4vbGliIFwKKwktbHNvY2t4MjUgLWxzb2NrZXQgLWxuc2wgLWxtIC1scmVzb2x2IC1scGFtIgorCisjVGhlIGZvbGxvd2luZyBzdW5vc3h4eCBlbnRyaWVzIGFyZSBmb3IgZGVidWdnaW5nIGFuZCB0ZXN0aW5nIG9ubHkuCisKK3N1bm9zNDF4OgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1PIC1EU1VOT1M0MSAtRERJUkVOVCAtRE5PVExPRyAtRE5PTVNFTkQgXAorCS1ETk9VVUNQIC1ETk9TSUdXSU5DSCAtRE5PUkVESVJFQ1QgLUROT1BVU0ggLUROT0NDVFJBUCBcCisJLUROT0lDUCAtRE5PTE9DQUwgJChLRkxBR1MpIgorCisjU3VuT1MgNC4xLngsIGRlYnVnZ2luZyB3aXRoIFB1cmUgU29mdHdhcmUsIEluYy4sIFB1cmlmeSAyIChjb21tZXJjaWFsIHJ1bnRpbWUKKyNlcnJvci1kZXRlY3Rpb24gc29mdHdhcmUgZm9yIGNhdGNoaW5nIHdpbGQgYXJyYXkgcmVmZXJlbmNlcywgZXRjKS4KKyNCZWZvcmUgcnVubmluZyB0aGUgcmVzdWx0aW5nIHdlcm1pdCwgeW91J2xsIGFsc28gbmVlZCB0byBkZWZpbmUgYW5kIGV4cG9ydAorI3RoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIChhcyBpbiB0aGlzIGV4YW1wbGUpOgorI1BVUklGWUhPTUU9L3Vzci9sb2NhbC9wdXJpZnkgOyBleHBvcnQgUFVSSUZZSE9NRQorI1BVUklGWUNBQ0hFRElSPS90bXAgOyBleHBvcnQgUFVSSUZZQ0FDSEVESVIKK3N1bm9zNDFjcDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFN1bk9TIDQuMSAvIEJTRCAvIEN1cnNlcyAvIFB1cmlmeS4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDQzI9IHB1cmlmeSAtY2FjaGVfZGlyPS91c3IvdG1wIGNjIiBcCisJIkNGTEFHUz0gLWcgLURTVU5PUzQxIC1ESERCVVVDUCAtRERJUkVOVCAtRFRDUFNPQ0tFVCBcCisJLURTQVZFRFVJRCAtRENLX0NVUlNFUyAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxjdXJzZXMgLWx0ZXJtY2FwIgorCisjU3VuT1MgNC4xIHdpdGggbWFsbG9jIGRlYnVnZ2VyCitzdW5vczQxbWQ6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTdW5PUyA0LjEgbWFsbG9jIGRlYnVnLi4uCisJJChNQUtFKSBtZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLU8gLURTVU5PUzQxIC1ESERCVVVDUCAtRERJUkVOVCAtRFRDUFNPQ0tFVCBcCisJLURTQVZFRFVJRCAkKEtGTEFHUykgLURtYWxsb2M9ZG1hbGxvYyAtRGZyZWU9ZGZyZWUgLURNREVCVUciCisKK3N1bm9zNDFnbWQ6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTdW5PUyA0LjEgd2l0aCBnY2MgYW5kIGN1cnNlcy4uLgorCSQoTUFLRSkgbWVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDPSBnY2MgIiAiQ0MyPSBnY2MiIFwKKwkiQ0ZMQUdTPSAtZyAtRFNVTk9TNDEgLURIREJVVUNQIC1ERElSRU5UIC1EVENQU09DS0VUIFwKKwktRE5ER1BXTkFNIC1EU0FWRURVSUQgLURDS19DVVJTRVMgLURSTE9HQ09ERSBcCisJJChLRkxBR1MpIC1EbWFsbG9jPWRtYWxsb2MgLURmcmVlPWRmcmVlIC1ETURFQlVHIiBcCisJIkxJQlM9IC1sY3Vyc2VzIC1sdGVybWNhcCIKKworI1N1bk9TIHZlcnNpb24gNC4xLCBnY2MsIHByb2ZpbGluZyB3aXRoIGdwcm9mLCBubyBkZWJ1Z2dpbmcuCisjVG8gZ2V0IHByb2ZpbGUsICJtYWtlIHN1bm9zNDFwIiAob24gU3VuKSwgdGhlbiAiLi93ZXJtaXQiLiAgQWZ0ZXIgcnVubmluZworI3dlcm1pdCwgImdwcm9mIC4vd2VybWl0IHwgbHByIiAob3Igd2hhdGV2ZXIpIHRvIGdldCBleGVjdXRpb24gcHJvZmlsZS4KK3N1bm9zNDFwOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU3VuT1MgNC54IHdpdGggcHJvZmlsaW5nLi4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0M9IGdjYyAiICJDQzI9IGdjYyIgXAorCSJDRkxBR1M9IC1EU1VOT1M0MSAtRE5PREVCVUcgLURTQVZFRFVJRCAtRERJUkVOVCAtRFRDUFNPQ0tFVCBcCisJLUROREdQV05BTSAkKEtGTEFHUykgLXBnIiAiTE5LRkxBR1MgPSAtcGciCisKKyNTdW5PUyB2ZXJzaW9uIDQuMSBvciBsYXRlciwgQlNEIGVudmlyb25tZW50LCBtaW5pbXVtIGZlYXR1cmVzLgorc3Vub3M0MW1pbjoKKwlAZWNobyBNaW5pbXVtIGludGVyYWN0aXZlCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzdW5vczQxIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LUROT1NQTCAtRE5PWE1JVCAtRE5PTVNFTkQgLUROT0ZSSUxMUyAtRE5PUkVUUlkgXAorCS1ETk9ESUFMIC1ETk9IRUxQIC1ETk9ERUJVRyAtRE5PVExPRyAtRE5PU0NSSVBUIC1ETk9DU0VUUyBcCisJLUROT1NIT1cgLUROT1NFVEtFWSAtRE5PVVVDUCAtRE5PUkVDQUxMIC1ETk9SRURJUkVDVCBcCisJLUROT1BVU0ggLUROT01ETUhVUCAtRE5PSkMgLUROT0ZEWkVSTyAtRE5PRVNDU0VRIFwKKwktRE5PTkVUIC1EQ0tfU01BTEwgLUROT0NLU1BFRUQgLUROT0NLVElNRVJTIC1ETk9MT0dJTiBcCisJLUROT0NLWFlaIC1ETk9LRVJCRVJPUyAtRE5PTUtESVIgLUROT1BBVFRFUk5TIC1ETk9QRVJNUyAtRE5PUElQRVNFTkQgXAorCS1ETk9SRUNVUlNJVkUgLUROT1JFTkFNRSAtRE5PUkVTRU5EIC1ETk9TRVRLRVkgXAorCS1ETk9UUklHR0VSIC1ETk9UVU5JTkcgJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAtcyIKKworI1N1bk9TIHZlcnNpb24gNC4xLCBCU0QgZW52aXJvbm1lbnQsIG1pbiBzaXplLCBjb21tYW5kLWxpbmUgb25seS4uLgorc3Vub3M0MW06CisJQGVjaG8gTWluaW11bSBzaXplCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzdW5vczQxbWluIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LUROT0lDUCAkKEtGTEFHUykiCisKKyNTdW5PUyB2ZXJzaW9uIDQuMSwgQlNEIGVudmlyb25tZW50LCBtaW4gc2l6ZSwgY21kLWxpbmUgb25seSwgcmVtb3RlIG9ubHkuLi4KKyMKK3N1bm9zNDFtcjoKKwlAZWNobyBNaW5pbXVtIHNpemUKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHN1bm9zNDFtaW4gS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRE5PSUNQIC1ETk9MT0NBTCAkKEtGTEFHUykiCisKKyNTdW5PUyB2ZXJzaW9uIDQuMSwgQlNEIGVudmlyb25tZW50LCBtaW4gc2l6ZSwgaW50ZXJhY3RpdmUuLi4KK3N1bm9zNDFtaToKKwlAZWNobyBNaW5pbXVtIHNpemUKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHN1bm9zNDFtaW4gS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRE5PQ01ETCAkKEtGTEFHUykiCisKKyNTdW5PUyB2ZXJzaW9uIDQuMSwgQlNEIGVudmlyb25tZW50LCBtaW4gc2l6ZSwgaW50ZXJhY3RpdmUsIHJlbW90ZSBvbmx5Li4uCitzdW5vczQxbWlyOgorCUBlY2hvIE1pbmltdW0gc2l6ZQorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc3Vub3M0MW1pbiBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1ETk9DTURMIC1ETk9MT0NBTCAkKEtGTEFHUykiCisKKyNTdW5PUyA0LjEsIFN5c3RlbSBWIFIzIGVudmlyb25tZW50ICgtaSBvcHRpb24gb21pdHRlZCkuCitzdW5vczQxczU6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTdW5PUyA0LjEgU3lzdGVtIFYgUjMuLi4KKwlAZWNobyBGb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5IC0gTk9UIGZvciBwcm9kdWN0aW9uIHVzZS4KKwlAZWNobyBGb3IgYSB1c2VhYmxlIHZlcnNpb24sIG1ha2Ugc3Vub3M0MSBpbnN0ZWFkLgorCSQoTUFLRSkgd2VybWl0ICJDQz0gL3Vzci81YmluL2NjICIgIkNDMj0vdXNyLzViaW4vY2MgIiBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EU1VONFM1IC1ERElSRU5UIC1ESERCVVVDUCAtRE5PTEVBUk4gLURDS19QT0xMICQoS0ZMQUdTKSAtTyIKKworI0FzIGFib3ZlLCBidXQgd2l0aCBjdXJzZXMgc3VwcG9ydAorc3Vub3M0MXM1YzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFN1bk9TIDQuMSBTeXN0ZW0gViBSMy4uLgorCUBlY2hvIEN1cnNlcyBpbmNsdWRlZC4KKwlAZWNobyBGb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5IC0gTk9UIGZvciBwcm9kdWN0aW9uIHVzZS4KKwlAZWNobyBGb3IgYSB1c2VhYmxlIHZlcnNpb24sIG1ha2Ugc3Vub3M0MSBpbnN0ZWFkLgorCSQoTUFLRSkgd2VybWl0ICJDQz0gL3Vzci81YmluL2NjICIgIkNDMj0vdXNyLzViaW4vY2MgIiBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EU1VONFM1IC1ERElSRU5UIC1ESERCVVVDUCAtRE5PTEVBUk4gXAorCS1EQ0tfUE9MTCAtRENLX0NVUlNFUyAtRENLX05FV1RFUk0gJChLRkxBR1MpIC1PIiAiTElCUz0gLWxjdXJzZXMiCisKKyNBcyBhYm92ZSwgYnV0IHdpdGggY3Vyc2VzIHN1cHBvcnQgQU5EIG5ldCBzdXBwb3J0CitzdW5vczQxczV0Y3BjOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU3VuT1MgNC4xIFN5c3RlbSBWIFIzLi4uCisJQGVjaG8gVENQL0lQIGFuZCBjdXJzZXMgaW5jbHVkZWQuICBObyBkZWJ1ZyBsb2cuCisJQGVjaG8gRm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSAtIE5PVCBmb3IgcHJvZHVjdGlvbiB1c2UuCisJQGVjaG8gRm9yIGEgdXNlYWJsZSB2ZXJzaW9uLCBtYWtlIHN1bm9zNDEgaW5zdGVhZC4KKwkkKE1BS0UpIHhlcm1pdCAiQ0M9IC91c3IvNWJpbi9jYyAiICJDQzI9L3Vzci81YmluL2NjICIgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtRFNVTjRTNSAtRERJUkVOVCAtREhEQlVVQ1AgLURDS19QT0xMIFwKKwktRE5PREVCVUcgLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1EVENQU09DS0VUICQoS0ZMQUdTKSAtTyIgXAorCSJMSUJTPSAtbGN1cnNlcyAtbHJlc29sdiIKKworIyAoRW5kIG9mIFN1bk9TIHRlc3QgZW50cmllcy4uLikKKworI0Fwb2xsbyB3aXRoIERvbWFpbiBTUjEwLjAgb3IgbGF0ZXIsIEJTRCBlbnZpcm9ubWVudAorI1JlcG9ydGVkbHksIGl0IG1pZ2h0IGFsc28gaGVscCB0byBhZGQgJy1BLHN5c3R5cGU9YnNkNC4zJyB0byBDRkxBR1MuCisjUmVwb3J0ZWRseSwgdGhlcmUgaXMgYWxzbyBhIHByb2JsZW0gd2l0aCBnZXRjICYgcHV0YyBtYWNyb3MgdGhhdCBjYW4KKyNiZSBoYW5kbGVkIGJ5IHVzaW5nICcjaWZkZWYgYXBvbGxvJyBzb21ld2hlcmUgdG8gcmVkZWZpbmUgdGhlbT8/PworI09uIHRoZSBvdGhlciBoYW5kLCBvdGhlciByZXBvcnRzIGluZGljYXRlIHRoYXQgaXQgd29ya3MgZmluZSBhcy1pcy4KKyNOT1RFOiBUaGlzIGVudHJ5IHdhcyBwcmV2aW91c2x5IGxpa2UgdGhpczoKKyMJJChNQUtFKSB3ZXJtaXQgIkNGTEFHUz0gLUROT0ZJTEVIIC1EQlNENCAkKEtGTEFHUykgLVVhZWdpcyBcCisjCS1EVENQU09DS0VUIC1VX19TVERDX18iCisjUmVwb3J0cyAoRGVjIDkxKSBpbmRpY2F0ZSBTUjEwIGhhcyBhbiBBTlNJLWNvbXBsaWFudCBDIGNvbXBpbGVyLAorI2luIGFkZGl0aW9uIHRvIGFuIG9sZGVyIG9uZSB0aGF0IGNsYWltZWQgdG8gYmUgQU5TSS1jb21wbGlhbnQgYnV0IHdhc24ndC4KKyNUaGUgZm9sbG93aW5nIG1ha2UgZW50cnkgKHBsdXMgY2hlY2tzIHRoYXQgYXJlIG1hZGUgaW4gY2tjZGViLmgpIGRldGVjdAorI3doaWNoIGNvbXBpbGVyIGlzIHVzZWQgYW5kIGRlZmluZSB0aGUgQ0tfQU5TSUMgb3IgTk9BTlNJIGZsYWdzIGFjY29yZGluZ2x5Lgorc3IxMC1ic2Q6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBcG9sbG8gU1IxMC4wIC8gQlNEIC4uLgorCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1PIC1EQVBPTExPU1IxMCAtREJTRDQzIC1EVENQU09DS0VUIC1EQ0tfQ1VSU0VTIC1ETk9MRUFSTiBcCisJLVVhZWdpcyAkKEtGTEFHUykiICJMSUJTPSAtbGN1cnNlcyAtbHRlcm1jYXAiCisKKyNBcG9sbG8gd2l0aCBEb21haW4gU1IxMC4wIG9yIGxhdGVyLCBTeXN0ZW0gViBSMyBlbnZpcm9ubWVudC4KKyNEb24ndCB1c2UgdGhlIG9wdGltaXplciAoLU8pLCBpdCBjYXVzZXMgcHJvYmxlbXMgYXQgcnVudGltZS4KK3NyMTAtczVyMzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFwb2xsbyBTUjEwLjAgLyBTeXMgViBSMyAuLi4KKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRE5PRklMRUggLURTVlIzIC1EQVBPTExPU1IxMCAtRE5PTEVBUk4gJChLRkxBR1MpIFwKKwktVWFlZ2lzIC1VX19TVERDX18iCisKKyNBcG9sbG8gRG9tYWluL0lYICh1bnRlc3RlZCwgdHJ5IHRoaXMgaWYgc3IxMC1ic2QgZG9lc24ndCB3b3JrKQorIyAtRFRDUFNPQ0tFVCBjYW4gcHJvYmFibHkgYmUgYWRkZWQgaGVyZS4KK2Fwb2xsb2JzZDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFwb2xsbyBEb21haW4vSVguLi4KKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0M9IC9iaW4vY2MgIiAiQ0MyPSAvYmluL2NjICIgXAorCSJDRkxBR1M9IC1ETk9GSUxFSCAtREJTRDQgLURBUE9MTE9CU0QgLUROT0xFQVJOICQoS0ZMQUdTKSAtVWFlZ2lzIgorCisjVmVyc2lvbiA3IFVuaXggKHNlZSBjb21tZW50cyBuZWFyIHRvcCBvZiBtYWtlZmlsZSkKK3Y3OgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgVU5JWCBWZXJzaW9uIDcuCisJQGVjaG8gUmVhZCB0aGUgbWFrZWZpbGUgaWYgeW91IGhhdmUgdHJvdWJsZSB3aXRoIHRoaXMuLi4KKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPS1EVjcgLURQUk9DTkFNRT1cXFwiJChQUk9DKVxcXCIgXAorCS1EQk9PVE5BTUU9XFxcIiQoQk9PVEZJTEUpXFxcIiAtRE5QUk9DTkFNRT1cXFwiJChOUFJPQylcXFwiIFwKKwktRE5QVFlQRT0kKE5QVFlQRSkgJChESVJFQ1QpIC1ET19SRFdSPTIgLURPX05ERUxBWT0wIC1ET19TQ0NTX0lEIFwKKwktRE5PTEVBUk4gJChLRkxBR1MpIgorCisjQVQmVCBVTklYIFN5c3RlbSBWIFIzLCBzaWduYWwoKSBpcyB2b2lkIHJhdGhlciB0aGFuIGludC4KKyNVc2VzIGRpcmVudC5oIGFuZCBIb25leSBEYW5CZXIgVVVDUC4KKyNBZGQgdGhlIC1pIGxpbmsgb3B0aW9uIGlmIG5lY2Vzc2FyeS4KKyNJZiB5b3UgZ2V0IGVycm9ycyBsaWtlICJ3c19yb3cgdW5kZWZpbmVkIiBpbiBja3V0aW8uYywgYWRkIC1ETk9OQVdTLgorc3lzNXIzOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFUJlQgVU5JWCBTeXN0ZW0gViBSMy4uLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIC1ETk9MRUFSTiAkKEtGTEFHUykgLU8iIFwKKwkiTE5LRkxBR1M9IgorCisjQXMgYWJvdmUsIHBsdXMgY3Vyc2VzLgorc3lzNXIzYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIFVOSVggU3lzdGVtIFYgUjMgKyBjdXJzZXMuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURTVlIzIC1ERElSRU5UIC1ESERCVVVDUCAtRENLX0NVUlNFUyAtRE5PTkFXUyAtRE5PTEVBUk4gXAorCSQoS0ZMQUdTKSAtTyIgIkxOS0ZMQUdTPSIgIkxJQlMgPSAtbHRlcm1saWIiCisKKyNTeXN0ZW0gViBSMy4yIGZvciBQQ3MgYnVpbHQgb24gSW50ZXJhY3RpdmUgVU5JWCBTVi8zODYgUjQueAorI2J1dCB3aXRoIGFsbCBjYWxscyB0byBkdXAyKCkgZGlzYWJsZWQgYmVjYXVzZSBnZW5lcmljIFNWUjMgZG9lcyBub3QgaGF2ZSBkdXAyLgorIyAoVGhlIC1saW5ldCBsaWJyYXJ5IG1pZ2h0IG5vdCBuZWVkIHRvIGJlIGluIHRoaXMgb25lLikKK3N5czVyMzJpczoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTeXN0ZW0gVi8zODYgUjMyCisJJChNQUtFKSB3ZXJtaXQgQ0M9IiQoQ0MpIiBDQzI9IiQoQ0MyKSIgXAorCSJDRkxBR1MgPSAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIC1PIC1ETk9DU0VUUyAtRE5PUkVBTFBBVEggXAorCS1EVUlEX1Q9dXNob3J0IC1ER0lEX1Q9dXNob3J0IC1ESTM4NklYIC1EU1ZSM0pDIC1EQ0tfQ1VSU0VTIC1ETk9OQVdTIFwKKwktRFBPU0lYX0pDIC1EQ0tfUkVESVIgLURDS19QT0xMIC1ERENMR0VUQ1dEIC1ETk9GRFpFUk8gLUROT1JFRElSRUNUIFwKKwktRE5PWkVYRUMgLUROT0xFQVJOICQoS0ZMQUdTKSIgIkxJQlM9LWxjdXJzZXMgLWxjX3MgLWxpbmV0IgorCisjU3lzdGVtIFYgUjMuMiBmb3IgUENzIGJ1aWx0IG9uIEludGVyYWN0aXZlIFVOSVggU1YvMzg2IFI0LngKKyNidXQgd2l0aCBhbGwgY2FsbHMgdG8gZHVwMigpIGRpc2FibGVkIGJlY2F1c2UgZ2VuZXJpYyBTVlIzIGRvZXMgbm90IGhhdmUgZHVwMi4KKyNXaXRoIFRDUC9JUCBhZGRlZC4KK3N5czVyMzJpc25ldDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTeXN0ZW0gVi8zODYgUjMyICsgVENQL0lQCisJJChNQUtFKSB3ZXJtaXQgQ0M9IiQoQ0MpIiBDQzI9IiQoQ0MyKSIgXAorCSJDRkxBR1MgPSAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIC1PIC1ETk9DU0VUUyAtRE5PUkVBTFBBVEggXAorCS1EVUlEX1Q9dXNob3J0IC1ER0lEX1Q9dXNob3J0IC1ESTM4NklYIC1EU1ZSM0pDIC1EQ0tfQ1VSU0VTIC1ETk9OQVdTIFwKKwktRFBPU0lYX0pDIC1EQ0tfUkVESVIgLURDS19QT0xMIC1ERENMR0VUQ1dEIC1ETk9GRFpFUk8gLUROT1JFRElSRUNUIFwKKwktRE5PTEVBUk4gLUROT1pFWEVDIC1EVENQU09DS0VUICQoS0ZMQUdTKSIgIkxJQlM9LWxjdXJzZXMgLWxjX3MgLWxpbmV0IgorCitpY2xzeXM1cjM6CisJbWFrZSBzeXM1cjMgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBLRkxBR1M9LURJQ0xTVlIzCisKKyNBVCZUIFVOSVggU3lzdGVtIFYgUjMuICBBcyBhYm92ZSwgYnV0IG5vIEFOU0kgcHJvdG90eXBpbmcuCitzeXM1cjNuYToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIFVOSVggU3lzdGVtIFYgUjMuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURTVlIzIC1ERElSRU5UIC1ESERCVVVDUCAtRE5PQU5TSSAtRE5PTEVBUk4gJChLRkxBR1MpIC1PIiBcCisJIkxOS0ZMQUdTPSIKKworI0FUJlQgVU5JWCBTeXN0ZW0gViBSMywgZm9yIDNCIGNvbXB1dGVycyB3aXRoIFdvbGxvbmdvbmcgVENQL0lQLgorc3lzNXIzbmV0M2I6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQVQmVCBVTklYIFNWUjMvM0IvV29sbG9uZ29uZy4uLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLURTVlIzIC1ERElSRU5UIC1ESERCVVVDUCAtRFdPTExPTkdPTkcgLUROT0xFQVJOICQoS0ZMQUdTKSBcCisJLU8iICJMSUJTPSAtbG5ldCAtbG5zbF9zIiAiTE5LRkxBR1MgPSIKKworI0FUJlQgVU5JWCBTeXN0ZW0gViBSMywgc2lnbmFsKCkgaXMgdm9pZCByYXRoZXIgdGhhbiBpbnQuCisjVXNlcyBkaXJlbnQuaCBhbmQgSG9uZXkgRGFuQmVyIHV1Y3AsIGhhcyA8dGVybWlveC5oPi4KKyNIYXMgPHRlcm1pb3guaD4gZm9yIFJUUy9DVFMgZmxvdyBjb250cm9sLgorc3lzNXIzdHg6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQVQmVCBVTklYIFN5c3RlbSBWIFIzLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIC1EVEVSTUlPWCAtRE5PTEVBUk4gXAorCSQoS0ZMQUdTKSAtaSAtTyIgIkxOS0ZMQUdTID0iCisKKyNBVCZUIFVOSVggU3lzdGVtIFYgUjMsIHNpZ25hbCgpIGlzIHZvaWQgcmF0aGVyIHRoYW4gaW50LgorI1VzZXMgZGlyZW50LmggYW5kIEhvbmV5IERhbkJlciB1dWNwLCBoYXMgPHRlcm1pb3guaD4uCisjSGFzIDxzeXMvdGVybWlveC5oPiBmb3IgUlRTL0NUUyBmbG93IGNvbnRyb2wuCitzeXM1cjNzeDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIFVOSVggU3lzdGVtIFYgUjMuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EU1ZSMyAtRERJUkVOVCAtREhEQlVVQ1AgLURTVEVSTUlPWCAtRE5PTEVBUk4gXAorCSQoS0ZMQUdTKSAtaSAtTyIgIkxOS0ZMQUdTID0iCisKKyNBVCZUIFVOSVggU3lzdGVtIFYgUjQuCisjSGFzIDx0ZXJtaW94Lmg+Lgorc3lzNXI0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFUJlQgVU5JWCBTeXN0ZW0gViBSNC4uLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURTVlI0IC1ERElSRU5UIC1ESERCVVVDUCAtRFRFUk1JT1ggLUROT0xFQVJOICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1zIgorCisjQVQmVCBVTklYIFN5c3RlbSBWIFI0IHdpdGggV29sbG9uZ29uZyBUQ1AvSVAuCisjSGFzIDx0ZXJtaW94Lmg+Lgorc3lzNXI0bmV0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFN5c3RlbSBWIFI0ICsgV29sbG9uZ29uZyBUQ1AvSVAuLi4nCisJQGVjaG8gJyBJZiBzb2NrZXRzLWxpYnJhcnkgcm91dGluZXMgYXJlIG1pc3NpbmcgYXQgbGluayB0aW1lLCB0aGVuJworCUBlY2hvICcgdHJ5IHRoZSBzeXM1cjRuZXQyIGVudHJ5LicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURTVlI0IC1ERElSRU5UIC1ESERCVVVDUCAtRE5PTEVBUk4gXAorCS1EVEVSTUlPWCAtRFdPTExPTkdPTkcgJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAtcyIKKworI0FzIGFib3ZlLCBidXQgbmVlZHMgbGlicyBpbmNsdWRlZC4KK3N5czVyNG5ldDI6CisJQGVjaG8gJyBQTEVBU0UgUkVBRCBja3VpbnMudHh0IElGIFlPVSBHRVQgTUlTU0lORyBIRUFERVIgRklMRVMuJworCUBlY2hvICcgKFNlYXJjaCBmb3IgV09MTE9OR09ORy4uLiknCisJJChNQUtFKSBzeXM1cjRuZXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiTElCUz0gLWxzb2NrZXQgLWxuc2wiCisKKyNBcyBhYm92ZSBwbHVzIGN1cnNlcy4KK3N5czVyNG5ldDJjOgorCWVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU3lzdGVtIFYgUjQgKyBXb2xsb25nb25nIFRDUC9JUC4uLicKKwlAZWNobyAnIFBMRUFTRSBSRUFEIGNrdWlucy50eHQgSUYgWU9VIEdFVCBNSVNTSU5HIEhFQURFUiBGSUxFUy4nCisJQGVjaG8gJyAoU2VhcmNoIGZvciBXT0xMT05HT05HLi4uKScKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURTVlI0IC1ERElSRU5UIC1ESERCVVVDUCAtRE5PTEVBUk4gXAorCS1EVEVSTUlPWCAtRFdPTExPTkdPTkcgLURDS19DVVJTRVMgJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAtcyIgXAorCSJMSUJTPSAtbHNvY2tldCAtbG5zbCAtbGN1cnNlcyIKKworI0RFTEwgVU5JWCBTeXN0ZW0gViBSNC4KKyNIYXMgPHN5cy90ZXJtaW94Lmg+LCByZWd1bGFyIEJlcmtlbGV5IHNvY2tldHMgbGlicmFyeSwgaS5lLiBpbi5oIGFuZCBpbmV0LmgKKyNhcmUgbm90IG1pc3BsYWNlZCBpbiBzeXMgKHJhdGhlciB0aGFuIG5ldGluZXQgYW5kIGFycGEsIHJlc3BlY3RpdmVseSkuCisjVXNlcyBBTlNJIEMgY29uc3RydWN0cywgYWR2aXNvcnkgZmlsZSBsb2NraW5nIG9uIGRldmljZXMsIGV0Yy4KKyNXYXJuaW5nOiAtRFNURVJNSU9YIGVuYWJsZXMgaGFyZHdhcmUgZmxvdyBjb250cm9sIChSVFMvQ1RTKSwgYnV0IHJlcG9ydGVkbHkKKyN0aGlzIGRvZXMgbm90IHdvcmsgd2l0aCB0aGUgbm9ybWFsIGRyaXZlcnMuICBIb3dldmVyLCBpdCBtaWdodCBzdGlsbCB3b3JrCisjb24gbm9uLURlbGwgc3lzdGVtcywgb3IgZXZlbiBEZWxsIHN5c3RlbXMgd2l0aCBkaWZmZXJlbnQgZHJpdmVycyBpbnN0YWxsZWQuCitkZWxsc3lzNXI0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIERFTEwgVU5JWCBTeXN0ZW0gViBSNC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURTVlI0IC1EREVMTF9TVlI0IC1ERElSRU5UIC1ESERCVVVDUCBcCisJLURUQ1BTT0NLRVQgLURTVEVSTUlPWCAtRENLX1BPTEwgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sc29ja2V0IC1sbnNsIiAiTE5LRkxBR1MgPSAtcyIKKworI0FzIGFib3ZlLCBjdXJzZXMgc3VwcG9ydCBhZGRlZC4uLgorZGVsbHN5czVyNGM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgREVMTCBVTklYIFN5c3RlbSBWIFI0Li4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtRFNWUjQgLURERUxMX1NWUjQgLURESVJFTlQgLURIREJVVUNQIFwKKwktRFRDUFNPQ0tFVCAtRFNURVJNSU9YIC1EQ0tfQ1VSU0VTIC1EQ0tfUE9MTCBcCisJJChLRkxBR1MpIiAiTElCUz0gLWxzb2NrZXQgLWxuc2wgLWxjdXJzZXMgLWx0ZXJtY2FwIiAiTE5LRkxBR1MgPSAtcyIKKworI01pbmltdW0gaW50ZXJhY3RpdmU6IEFzIGFib3ZlLCBidXQgd2l0aCBldmVyeSBjb25jZWl2YWJsZSBvcHRpb24gcmVtb3ZlZC4KK2RlbGxzeXM1cjRtaToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBERUxMIFVOSVggU3lzdGVtIFYgUjQuLi4nCisJQGVjaG8gJ01pbmltdW0tc2l6ZSBpbnRlcmFjdGl2ZScKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURTVlI0IC1EREVMTF9TVlI0IC1ERElSRU5UIFwKKwktVVRDUFNPQ0tFVCAtRE5PQ01ETCAtRE5PU1BMIC1ETk9YTUlUIC1EQ0tfUE9MTCBcCisJLUROT01TRU5EIC1ETk9GUklMTFMgLUROT0RJQUwgLUROT0hFTFAgLUROT0RFQlVHIC1ETk9UTE9HIFwKKwktRE5PU0NSSVBUIC1ETk9DU0VUUyAtRE5PU0hPVyAtRE5PU0VUS0VZIC1ETk9TRVJWRVIgLUROT1VVQ1AgXAorCS1ETk9QVVNIIC1ETk9NRE1IVVAgLUROT0pDIC1ETk9GRFpFUk8gLUROT0VTQ1NFUSAgXAorCSQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gLXMiCisKKyNDb21tYW5kLWxpbmUgb25seSB2ZXJzaW9uLgorZGVsbHN5czVyNG06CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgREVMTCBVTklYIFN5c3RlbSBWIFI0Li4uJworCUBlY2hvICdDb21tYW5kLWxpbmUgb25seScKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURTVlI0IC1EREVMTF9TVlI0IC1ERElSRU5UIFwKKwktVVRDUFNPQ0tFVCAtRE5PSUNQIC1ETk9GUklMTFMgLUROT0RJQUwgLUROT0RFQlVHIC1ETk9UTE9HIC1ETk9DU0VUUyBcCisJLUROT1NFVEtFWSAtRE5PRVNDU0VRIC1ETk9KQyAtRE5PRkRaRVJPIC1EQ0tfUE9MTCBcCisJJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAtcyIKKworI0FUJlQgVU5JWCBTeXN0ZW0gViBSNC4KKyNIYXMgPHN5cy90ZXJtaW94Lmg+Lgorc3lzNXI0c3g6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQVQmVCBVTklYIFN5c3RlbSBWIFI0Li4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtRFNWUjQgLURESVJFTlQgLURIREJVVUNQIC1EU1RFUk1JT1ggLUROT0xFQVJOIFwKKwkkKEtGTEFHUykiICJMTktGTEFHUyA9IC1zIiAiTElCUz0kKExJQlMpIgorCisjQVQmVCBVTklYIFN5c3RlbSBWIFI0LgorI0hhcyA8c3lzL3Rlcm1pb3guaD4sIHJlZ3VsYXIgQmVya2VsZXkgc29ja2V0cyBsaWJyYXJ5LCBpLmUuIGluLmggYW5kIGluZXQuaAorI2FyZSBub3QgbWlzcGxhY2VkIGluIHN5cyAocmF0aGVyIHRoYW4gbmV0aW5ldCBhbmQgYXJwYSwgcmVzcGVjdGl2ZWx5KS4KKyNVc2VzIEFOU0kgQyBjb25zdHJ1Y3RzLCA8c3lzL3Rlcm1pb3guaD4sIGV0YyBldGMuCitzeXM1cjRzeHRjcDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIFVOSVggU3lzdGVtIFYgUjQuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sc29ja2V0IC1sbnNsICQoTElCUykiICJMTktGTEFHUz0gLXMiCisKKyNBVCZUIFVOSVggU3lzdGVtIFYgUjQuCisjQXMgYWJvdmUgKyBjdXJzZXMuCitzeXM1cjRzeHRjcGM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQVQmVCBVTklYIFN5c3RlbSBWIFI0Li4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtRFNWUjQgLURESVJFTlQgLURIREJVVUNQIFwKKwktRFNURVJNSU9YICAtRENLX0NVUlNFUyAtRFRDUFNPQ0tFVCAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxzb2NrZXQgLWxuc2wgLWxjdXJzZXMgLWx0ZXJtY2FwICQoTElCUykiICJMTktGTEFHUyA9IC1zIgorCisjQVQmVCBVTklYIFN5c3RlbSBWIFI0LiAgQ09OU0VOU1lTIFNWUjQuMi0xLgorI0hhcyA8c3lzL3Rlcm1pb3guaD4sIHJlZ3VsYXIgQmVya2VsZXkgc29ja2V0cyBsaWJyYXJ5LCBpLmUuIGluLmggYW5kIGluZXQuaAorI2FyZSBub3QgbWlzcGxhY2VkIGluIHN5cyAocmF0aGVyIHRoYW4gbmV0aW5ldCBhbmQgYXJwYSwgcmVzcGVjdGl2ZWx5KS4KKyNVc2VzIEFOU0kgQyBjb25zdHJ1Y3RzLCA8c3lzL3Rlcm1pb3guaD4sIGV0Yy4KKyMgRnVsbHNjcmVlbiAtRENLX0NVUlNFUyBhZGRlZCAod2l0aCBjdXJzZXMgJiB0ZXJtY2FwIGxpYnMpCisjIFN1Ym1pc3Npb24gYnkgUm9iZXJ0IFdlaW5lci9Qcm9ncmFtbWluZyBQbHVzLCByd2VpbmVyQHdhdHN1bi5jYy5jb2x1bWJpYS5lZHUKK3N5czVyNHN4dGNwZjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIFVOSVggU3lzdGVtIFYgUjQuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgLURDS19DVVJTRVMgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sc29ja2V0IC1sbnNsIC1ML3Vzci9jY3MvbGliIC1sY3Vyc2VzIC1sdGVybWNhcCIgXAorCSJMSUJTPSQoTElCUykiICJMTktGTEFHUyA9IC1zIgorCisjU21hbGxlc3QgcG9zc2libGUgdmVyc2lvbiBmb3IgU3lzdGVtIFYgUjQKK3M1cjRtOgorCUBlY2hvIE1pbmltdW0gc2l6ZQorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc3lzNXI0c3ggS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0kKEtGTEFHUykgLUROT0RJQUwgLUROT0hFTFAgLUROT0RFQlVHIC1ETk9UTE9HIFwKKwktRE5PU0NSSVBUIC1ETk9DU0VUUyAtRE5PSUNQIC1ETk9NU0VORCAtVVRDUFNPQ0tFVCIgIkxOS0ZMQUdTID0gLXMiCisKKyNTbWFsbGVzdCBwb3NzaWJsZSBpbnRlcmFjdGl2ZSB2ZXJzaW9uIG9mIGFib3ZlCitzNXI0bWk6CisJQGVjaG8gTWluaW11bSBpbnRlcmFjdGl2ZQorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc3lzNXI0c3ggXAorCSJLRkxBR1M9LUROT1NQTCAtRE5PWE1JVCAtRE5PTVNFTkQgLUROT0ZSSUxMUyAtRE5PU0hPVyBcCisJLUROT0RJQUwgLUROT0hFTFAgLUROT0RFQlVHIC1ETk9UTE9HIC1ETk9TQ1JJUFQgLUROT0NTRVRTIC1ETk9TRVRLRVkgXAorCS1VVENQU09DS0VUICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gLXMiCisKKyNBVCZUIFVOSVggU3lzdGVtIFYgUjQsIGhhcyA8c3lzL3Rlcm1pb3guaD4KKyNBTlNJIEMgZnVuY3Rpb24gcHJvdG90eXBpbmcgZGlzYWJsZWQuCitzeXM1cjRzeG5hOgorCUBlY2hvIE5vIEFOU0kgQyBwcm90b3R5cGluZy4uLgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc3lzNXI0c3ggS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0kKEtGTEFHUykgLUROT0FOU0kiCisKKyNTdHJhdHVzIEZUWC4KK2Z0eDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTdHJhdHVzIEZUWCAzLnguLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EU1ZSNCAtREZUWCAtRERJUkVOVCAtREhEQlVVQ1AgLURTVEVSTUlPWCBcCisJLUROT0dFVFVTRVJTSEVMTCAtRE5PTEVBUk4gK0RBMS4xICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1zIiAiTElCUz0kKExJQlMpIgorCisjU3RyYXR1cyBGVFggKyBUQ1AvSVAuCitmdHh0Y3A6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU3RyYXR1cyBGVFggMy54Li4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtRFNWUjQgLURGVFggLURESVJFTlQgLURIREJVVUNQIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgLUROT19ETlNfU1JWICtEQTEuMSAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxzb2NrZXQgLWxuc2wgJChMSUJTKSIgIkxOS0ZMQUdTPSAtcyIKKworI05DUiBNUC1SQVMgMi4wMyBvciAzLjAyCittcHJhczoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBOQ1IgTVAtUkFTLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtRFNWUjQgLUROQ1JNUFJBUyAtRERJUkVOVCAtREhEQlVVQ1AgLURTVEVSTUlPWCBcCisJLUROT0dFVFVTRVJTSEVMTCAtRFVTRV9GSUxFX19DTlQgLUROT0xFQVJOIC1ETk9fRE5TX1NSViAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtcyIgIkxJQlM9JChMSUJTKSIKKworI05DUiBNUC1SQVMgMi4wMyBvciAzLjAyIHdpdGggVENQL0lQIGFuZCBjdXJzZXMKK21wcmFzdGNwYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBOQ1IgTVAtUkFTICsgVENQL0lQICsgY3Vyc2VzLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNGTEFHUz0tRFRDUFNPQ0tFVCBcCisJLURDS19DVVJTRVMgLURTVlI0IC1ETkNSTVBSQVMgLURESVJFTlQgLURIREJVVUNQIC1EU1RFUk1JT1ggLUROT0xFQVJOIFwKKwktRE5PR0VUVVNFUlNIRUxMIC1ETk9fRE5TX1NSViBEVVNFX0ZJTEVfX0NOVCAtTyAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtcyIgIkxJQlM9IC1sc29ja2V0IC1sbnNsIC1sY3Vyc2VzIC1sdGVybWNhcCAkKExJQlMpIgorCisjU0lOSVgtTCBWNS40MSAtIGluY2x1ZGVzIGN1cnNlcywgdGNwL2lwIC0gVXNlIHRoaXMgb25lIGZvciBpMzg2LgorI1RoaXMgdmVyc2lvbiBvZiBTSU5JWCBkb2Vzbid0IGxpa2UgZmRvcGVuKCkgb3IgcG9wZW4oKS4KK3Npbml4NTQxOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNpZW1lbnMvTml4ZG9yZiBTSU5JWCBWNS40MS9pMzg2JworCSQoTUFLRSkgY2tjcHJvLiQoRVhUKSAiQ0ZMQUdTID0gLURTSU5JWCAtRFNWUjQgLURESVJFTlQgLURIREJVVUNQIFwKKwktRFNURVJNSU9YIC1EQ0tfQ1VSU0VTIC1EVENQU09DS0VUIC1EU0VMRUNUIC1EQ0tfQU5TSUMgLUROT19ETlNfU1JWIFwKKwktRFNOSTU0MSAtRE5PR0VUVVNFUlNIRUxMIC1ETk9ORVRDTUQgLUROT1BPUEVOIC1rYW5zaSAtVzAgJChLRkxBR1MpIgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtRFNJTklYIC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgLUROT19ETlNfU1JWIC1ETk9QT1BFTiBcCisJLURGTkZMT0FUIC1EU1RFUk1JT1ggLURDS19DVVJTRVMgLURUQ1BTT0NLRVQgLURTRUxFQ1QgLURDS19BTlNJQyBcCisJLURTTkk1NDEgLUROT0dFVFVTRVJTSEVMTCAtRE5PTkVUQ01EIC1rYW5zaSAtVzAgLU8gJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sc29ja2V0IC1sbnNsIC1sY3Vyc2VzIC1sdGVybWNhcCAtbG0iICJMTktGTEFHUyA9IC1zIgorCitzaW5peDU0MWk6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiAiS0ZMQUdTPSQoS0ZMQUdTKSIgc2luaXg1NDEKKworI1NJTklYIFY1LjQyIC0gaW5jbHVkZXMgY3Vyc2VzLCB0Y3AvaXAsIGV2ZXJ5dGhpbmcgLSBVc2UgdGhpcyBvbmUgZm9yIE1JUFMuCisjIEFzIG9mIEMtS2VybWl0IDcuMSwgb3B0aW1pemF0aW9uIHJlbW92ZWQgLS0gdGFrZXMgKGxpdGVyYWxseSkgZm9yZXZlci4KK3Npbml4NTQyOgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtRFNJTklYIC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgLUROT19ETlNfU1JWIFwKKwktREZORkxPQVQgLURTVEVSTUlPWCAtRENLX0NVUlNFUyAtRFRDUFNPQ0tFVCAtRFNFTEVDVCAtRENLX0FOU0lDIFwKKwktRFNOSTU0MiAtRE5PR0VUVVNFUlNIRUxMIC1rYW5zaSAtVzAgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sc29ja2V0IC1sbnNsIC1sY3Vyc2VzIC1sdGVybWNhcCAtbG0iICJMTktGTEFHUyA9IC1zIgorCisjU0lOSVggVjUuNDIgZ2NjIC0gaW5jbHVkZXMgY3Vyc2VzLCB0Y3AvaXAsIGV2ZXJ5dGhpbmcuCisjVGhpcyBvbmUgd2FzIHVzZWQgdG8gYnVpbGQgdGhlIFB5cmFtaWQtYXJjaGl0ZWN0dXJlIFJNNjAwIHZlcnNpb24KKyNvbiBTSU5JWC1QIDUuNDIgQTEwIHdpdGggZ2NjIGJ1dCBzaG91bGQgd29yayBmb3IgU0lOSVggNS40MiBvbiBhbnkgb3RoZXIKKyNhcmNoaXRlY3R1cmUgd2l0aCBnY2MuCitzaW5peDU0Mmc6CisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0M9Z2NjIiAiQ0MyPWdjYyIgXAorCSJDRkxBR1MgPSAtRFNJTklYIC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgLUROT19ETlNfU1JWIFwKKwktREZORkxPQVQgLURTVEVSTUlPWCAtRENLX0NVUlNFUyAtRFRDUFNPQ0tFVCAtRFNFTEVDVCAtRENLX0FOU0lDIFwKKwktRFNOSTU0MiAtRE5PR0VUVVNFUlNIRUxMICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbHNvY2tldCAtbG5zbCAtbGN1cnNlcyAtbHRlcm1jYXAgLWxtIiBcCisJIkxOS0ZMQUdTID0gLXMiCisKKyNTSU5JWCBWNS40MiAtIGluY2x1ZGVzIGN1cnNlcywgdGNwL2lwLCBldmVyeXRoaW5nIC0gVXNlIHRoaXMgb25lIGZvciBJbnRlbC4KKyMgKE5vdGU6IFNOSSBkaXNjb250aW51ZWQgSW50ZWwgc3VwcG9ydCBhZnRlciA1LjQyLikKK3Npbml4NTQyaToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTaWVtZW5zL05peGRvcmYgU0lOSVgtWiBWNS40Mi4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLURTSU5JWCAtRFNWUjQgLURESVJFTlQgLURIREJVVUNQIC1ERk5GTE9BVCAtRFNURVJNSU9YIFwKKwktRENLX0NVUlNFUyAtRFRDUFNPQ0tFVCAtRFNFTEVDVCAtRENLX0FOU0lDIC1ETk9fRE5TX1NSViAta2Fuc2kgXAorCS1EU05JNTQyICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbHNvY2tldCAtbG5zbCAtbGN1cnNlcyAtbHRlcm1jYXAgLWxtIiBcCisJIkxOS0ZMQUdTID0gLXMiCisKKyNTaWVtZW5zIE5peGRvcmYgUmVsaWFudCBVTklYIFY1LjQzIC0gaW5jbHVkZXMgY3Vyc2VzLCB0Y3AvaXAsIGV2ZXJ5dGhpbmc6CisjIC4gZ2V0dGltZW9mZGF5KCkgc3VkZGVubHkgaGFzIG9ubHkgb25lIGFyZyBpbnN0ZWFkIG9mIHR3byAoR1RPRE9ORUFSRykuCisjIC4gVGhlIHN5bnRheCBvZiB0aGUgT2xpbWl0IHNwZWNpZmllciBjaGFuZ2VkLgorIyAuIFRoZSBuYW1lIHdhcyBjaGFuZ2VkIGZyb20gU0lOSVggdG8gUmVsaWFudCBVTklYIGluIHZlcnNpb24gNS40M0MuCitzbmk1NDM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU2llbWVucy9OaXhkb3JmIFJlbGlhbnQgVU5JWCBWNS40MycKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLURTSU5JWCAtRFNOSTU0MyAtRFNWUjQgLURESVJFTlQgLURIREJVVUNQIFwKKwktRFNURVJNSU9YIC1EQ0tfQ1VSU0VTIC1EVENQU09DS0VUIC1EU0VMRUNUIC1EQ0tfQU5TSUMgLURHVE9ET05FQVJHIFwKKwktRE5PX0ROU19TUlYgLWthbnNpIC1XMCAtTyAtRiBPbGltaXQsMzEwMCAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxzb2NrZXQgLWxuc2wgLWxjdXJzZXMgLWx0ZXJtY2FwIiAiTE5LRkxBR1MgPSAtcyIKKworI1NpZW1lbnMgTml4ZG9yZiBSZWxpYW50IFVOSVggVjUuNDQgLSBMaWtlIDUuNDMgYnV0IHdpdGggZGlmZmVyZW50IGJhbm5lci4KK3NuaTU0NDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTaWVtZW5zL05peGRvcmYgUmVsaWFudCBVTklYIFY1LjQ0JworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtRFNJTklYIC1EU05JNTQ0IC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgXAorCS1EU1RFUk1JT1ggLURDS19DVVJTRVMgLURUQ1BTT0NLRVQgLURTRUxFQ1QgLURDS19BTlNJQyAtREdUT0RPTkVBUkcgXAorCS1ETk9fRE5TX1NSViAta2Fuc2kgLVcwIC1PIC1LIE9saW1pdCwzMTAwICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbHNvY2tldCAtbG5zbCAtbGN1cnNlcyAtbHRlcm1jYXAiICJMTktGTEFHUyA9IC1zIgorCisjQ29tbW9kb3JlIEFtaWdhIHdpdGggQVQmVCBVTklYIFN5c3RlbSBWIFI0IGFuZCBUQ1AvSVAgc3VwcG9ydC4KKyNIYXMgPHN5cy90ZXJtaW94Lmg+Lgorc3ZyNGFtaWdhbmV0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFtaWdhIFNWUjQgKyBUQ1AvSVAuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0M9Z2NjIiAiQ0MyPWdjYyIgXAorCSJDRkxBR1MgPSAtTyAtRFNWUjQgLURESVJFTlQgLURIREJVVUNQIC1EU1RFUk1JT1ggXAorCS1EVENQU09DS0VUIC1EQ0tfQ1VSU0VTICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gLXMiIFwKKwkiTElCUyA9IC1sc29ja2V0IC1sbnNsIC1sdGVybWxpYiIKKworI1NDTyAoTm92ZWxsIChVbml2ZWwpKSBVbml4V2FyZSAxLnggb3IgMi4wLCBubyBUQ1AvSVAuCisjVGhpcyBhc3N1bWVzIHRoZSBOb3ZlbGwgU0RLIDEuMCwgd2hpY2ggaGFzIDxzeXMvdGVybWlveC5oPi4KKyNVbml4V2FyZSB1c2VycyB3aXRoIHRoZSAiUHJpbWUgVGltZSBGcmVld2FyZSIgQ0QtUk9NIFNESyB3aWxsIHByb2JhYmx5IGhhdmUKKyN0byB1c2UgdGhlIHN5czVyNCBlbnRyeSAobm8gdGVybWlveC5oIGZpbGUsIHNvIG5vIGhhcmR3YXJlIGZsb3cgY29udHJvbCkuCisjQ2hhbmdlIC1EU0VMRUNUIHRvIC1EQ0tfUE9MTCBpZiAtRFNFTEVDVCBjYXVzZXMgcHJvYmxlbXMuCisjIE5PVEU6IFVuaXh3YXJlIDEueCBidWlsZHMgaGF2ZSBub3QgYmVlbiB0cmllZCBpbiBDLUtlcm1pdCA3LjAuCit1bml4d2FyZToKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHN5czVyNHN4IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURPTERfVU5JWFdBUkUgLURDS19ORVdURVJNIC1EU0VMRUNUIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1ETk9TWVNMT0cgJChLRkxBR1MpIiAiTElCUz0tbGNyeXB0IgorCisjVW5peFdhcmUgMS54IG9yIDIuMCB3aXRoIFRDUC9JUCBhbmQgY3Vyc2VzLgorI2ZvcmsoKS1iYXNlZCBDT05ORUNUIC0gbm8gaGlnaCBzZXJpYWwgc3BlZWRzLgordW5peHdhcmVuZXRjOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc3lzNXI0c3h0Y3BjIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURPTERfVU5JWFdBUkUgLURDS19ORVdURVJNIC1EU0VMRUNUIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1ETk9TWVNMT0cgJChLRkxBR1MpIiAiTElCUz0tbGNyeXB0IC1scmVzb2x2IgorCit1dzEwOgorCSQoTUFLRSkgdW5peHdhcmVuZXRjIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUz0kKEtGTEFHUykiCisKKyNUaGlzIGlzIGZvciBVbml4d2FyZSAyLjAueCBvbmx5IC0gdXNlIHVuaXh3YXJlMjEgZm9yIFVXIDIuMS54LgorI0hhcyBzcGVjaWFsIGxpYnJhcnkgc2VhcmNoIGFuZCBlbmFibGVzIHNwZWNpYWwga2x1ZGdlIGFyb3VuZCBsaWJyYXJ5CisjZm91bHVwIHJlZ2FyZGluZyB2Zm9yaygpICh3aGljaCBLZXJtaXQgZG9lc24ndCB1c2UpLiAgRm9yY2VzIFBPU0lYLXN0eWxlCisjaGFuZ3VwLgordW5peHdhcmUyMDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBVbml4V2FyZSAyLjAueC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURPTERfVU5JWFdBUkUgLURVTklYV0FSRTIgLURTRUxFQ1QgLURTVlI0IC1ERElSRU5UIFwKKwktREhEQlVVQ1AgLURCSUdCVUZPSyAtRE5PR0VUVVNFUlNIRUxMIC1EU1RFUk1JT1ggIC1EQ0tfQ1VSU0VTIFwKKwktRFRDUFNPQ0tFVCAtRFVXMjAwIC1ERk5GTE9BVCAtRENLX05FV1RFUk0gLUROT1NZU0xPRyAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxzb2NrZXQgLWxuc2wgLWxjdXJzZXMgLWx0ZXJtY2FwIC1sY3J5cHQgLWxnZW4gLWxtIC1scmVzb2x2IiBcCisJIkxOS0ZMQUdTID0gLXMiCisKK3V3MjA6CisJJChNQUtFKSB1bml4d2FyZTIwIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUz0kKEtGTEFHUykiCisKKyNBZGRzIGJpZyBidWZmZXJzICgibGFyZ2UgbWVtb3J5IG1vZGVsIikgLSBvdGhlcndpc2UgdGhlIHNhbWUgYXMgVW5peFdhcmUgMS54LgordW5peHdhcmUyMToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBVbml4V2FyZSAyLjEueC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURVTklYV0FSRSAtRFNFTEVDVCAtRFNWUjQgLURESVJFTlQgLURIREJVVUNQIC1EQklHQlVGT0sgXAorCS1ETk9TWVNMT0cgLURTVEVSTUlPWCAgLURDS19DVVJTRVMgLURUQ1BTT0NLRVQgXAorCS1EQ0tfTkVXVEVSTSAtREZORkxPQVQgLURVTklYV0FSRTIgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sc29ja2V0IC1sbnNsIC1sY3Vyc2VzIC1sdGVybWNhcCAtbGNyeXB0IC1sbSAtbHJlc29sdiBcCisJJChMSUJTKSIgIkxOS0ZMQUdTID0gLXMiCisKKyNVbml4d2FyZSAyLjEuMAordXcyMToKKwkkKE1BS0UpIHVuaXh3YXJlMjEgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiS0ZMQUdTPSQoS0ZMQUdTKSIKKworI1VuaXh3YXJlIDIuMS4zCit1dzIxMzoKKwkkKE1BS0UpIHVuaXh3YXJlMjEgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFVTRV9GSUxFX19DTlQgJChLRkxBR1MpIgorCisjVW5peHdhcmUgMi4xIHdpdGggSUtTRCBzdXBwb3J0Cit1dzIxaWtzZDoKKwkkKE1BS0UpIHVuaXh3YXJlMjEgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRENLX1NIQURPVyAkKEtGTEFHUykiICJMSUJTPSAtbGdlbiIKKworI1VuaXhXYXJlIDcgd2l0aCB0Y1tnc11ldHNwZWVkKCkgaGlnaCBzZXJpYWwgc3BlZWRzICYgc2VsZWN0KCktYmFzZWQgQ09OTkVDVAorI05PVEU6IFRoaXMgaXMgdGhlIG9uZSB3ZSB1c2UuCit1bml4d2FyZTd0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFVuaXhXYXJlIDcgd2l0aCBQT1NJWCBpL28uLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EVU5JWFdBUkUgLURTRUxFQ1QgLURTVlI0IC1ERElSRU5UIC1ESERCVVVDUCAtREJJR0JVRk9LIFwKKwktREZORkxPQVQgLUROT0dFVFVTRVJTSEVMTCAtRFNURVJNSU9YIC1EQ0tfQ1VSU0VTIC1EVENQU09DS0VUIC1EUE9TSVggXAorCS1EVVc3IC1EVVNFVENTRVRTUEVFRCAtRENLX05FV1RFUk0gLUROT0xTVEFUIC1ERENMVElNRVZBTCBcCisJLURORUVETURNREVGUyAkKEtGTEFHUykiIFwKKwkiTElCUz0tbHNvY2tldCAtbG5zbCAtbGN1cnNlcyAtbHRlcm1jYXAgLWxjcnlwdCAtbG0gLWxyZXNvbHYgJChMSUJTKSIgXAorCSJMTktGTEFHUyA9IC1zIgorCisjVW5peFdhcmUgNyAtIHNlbGVjdCgpLWJhc2VkIENPTk5FQ1QgLSBubyBQT1NJWCBpL28gLSBubyBoaWdoIHNlcmlhbCBzcGVlZHMuCisjSW4gb3RoZXIgd29yZHMsIGp1c3QgbGlrZSB0aGUgVW5peFdhcmUgMSBhbmQgMiBidWlsZHMuCit1bml4d2FyZTd4OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFVuaXhXYXJlIDcuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EVU5JWFdBUkUgLURTRUxFQ1QgLURTVlI0IC1ERElSRU5UIC1ESERCVVVDUCAtREJJR0JVRk9LIFwKKwktRFVXNyAtRE5PR0VUVVNFUlNIRUxMIC1EU1RFUk1JT1ggLURDS19DVVJTRVMgLURUQ1BTT0NLRVQgLUROT0xTVEFUIFwKKwktREZORkxPQVQgLURDS19ORVdURVJNICQoS0ZMQUdTKSIgXAorCSJMSUJTPS1sc29ja2V0IC1sbnNsIC1sY3Vyc2VzIC1sdGVybWNhcCAtbGNyeXB0IC1sbSAtbHJlc29sdiAkKExJQlMpIiBcCisJIkxOS0ZMQUdTID0gLXMiCisKKyNVbml4V2FyZSA3IHdpdGggUE9TSVggY2ZzZXRbb2ldc3BlZWQoKSB0byBhbGxvdyBoaWdoIHNlcmlhbCBzcGVlZHMuCisjKGJ1dCB0aGUgaGlnaCBzcGVlZHMgZG9uJ3Qgd29yaykKK3VuaXh3YXJlN3A6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgVW5peFdhcmUgNyB3aXRoIFBPU0lYIGkvby4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURVTklYV0FSRSAtRFNFTEVDVCAtRFNWUjQgLURESVJFTlQgLURIREJVVUNQIC1EQklHQlVGT0sgXAorCS1EVVc3IC1ETk9HRVRVU0VSU0hFTEwgLURTVEVSTUlPWCAtRENLX0NVUlNFUyAtRFRDUFNPQ0tFVCAtRFBPU0lYIFwKKwktREZORkxPQVQgLURDS19ORVdURVJNIC1ETk9MU1RBVCAkKEtGTEFHUykiIFwKKwkiTElCUz0tbHNvY2tldCAtbG5zbCAtbGN1cnNlcyAtbHRlcm1jYXAgLWxjcnlwdCAtbG0gLWxyZXNvbHYgJChMSUJTKSIgXAorCSJMTktGTEFHUyA9IC1zIgorCisjIFVuaXhXYXJlIDcgYnVpbHQgd2l0aCBnY2MgLSBUaGlzIGRvZXMgbm90IHdvcmsgYXQgYWxsLi4uCisjIFJlcG9ydGVkbHkgZ2NjIDIuOC4xIGlzIGJyb2tlbiBvbiBVbml4d2FyZSA3LiAgVHJ5IGVnY3M/Cit1bml4d2FyZTdnOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFVuaXhXYXJlIDcgd2l0aCBnY2MuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiAiTE5LRkxBR1MgPSAtcyAtc2hsaWIiCisJIkNGTEFHUyA9IC1PIC1EVU5JWFdBUkUgLURTRUxFQ1QgLURTVlI0IC1ERElSRU5UIC1ESERCVVVDUCAtREJJR0JVRk9LIFwKKwktRFVXNyAtRE5PR0VUVVNFUlNIRUxMIC1EU1RFUk1JT1ggIC1EQ0tfQ1VSU0VTIC1EVENQU09DS0VUIC1ETk9MU1RBVCBcCisJLURGTkZMT0FUIC1EQ0tfTkVXVEVSTSAkKEtGTEFHUykiIFwKKwkiTElCUz0tbHNvY2tldCAtbG5zbCAtbGN1cnNlcyAtbHRlcm1jYXAgLWxjcnlwdCAtbG0gLWxyZXNvbHYgJChMSUJTKSIgXAorCSJMTktGTEFHUyA9IC1zIgorCit1bml4d2FyZTc6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiAiS0ZMQUdTPSQoS0ZMQUdTKSIgdW5peHdhcmU3dCBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCit1dzc6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiAiS0ZMQUdTPSQoS0ZMQUdTKSIgdW5peHdhcmU3dCBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCisjU0NPIE9wZW5VTklYIDguMAorb3U4OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE9wZW4gVU5JWCA4Li4uJworCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgIktGTEFHUz0tRE9VOCAkKEtGTEFHUykiIHVuaXh3YXJlN3QgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworI1VuaXhXYXJlIDcgd2l0aCBPcGVuU1NMCit1dzdzc2w6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgVW5peFdhcmUgNyBhbmQgT3BlblNTTC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURDS19BVVRIRU5USUNBVElPTiAtRENLX1NTTCAtRENLX1NIQURPVyBcCisJLURVTklYV0FSRSAtRFNFTEVDVCAtRFNWUjQgLURESVJFTlQgLURIREJVVUNQIC1EQklHQlVGT0sgXAorCS1ERk5GTE9BVCAtRE5PR0VUVVNFUlNIRUxMIC1EU1RFUk1JT1ggLURDS19DVVJTRVMgLURUQ1BTT0NLRVQgLURQT1NJWCBcCisJLURVVzcgLURVU0VUQ1NFVFNQRUVEIC1EQ0tfTkVXVEVSTSAtRE5PTFNUQVQgLUREQ0xUSU1FVkFMIFwKKwkkKFNTTElOQykgJChLRkxBR1MpIiBcCisJIkxJQlM9LWxzb2NrZXQgLWxuc2wgLWxjdXJzZXMgLWx0ZXJtY2FwIC1sY3J5cHQgLWxtIC1scmVzb2x2IFwKKwktbGdlbiAtbGN1ZGs3MCAkKFNTTExJQikgLWxzc2wgLWxjcnlwdG8gJChMSUJTKSIgXAorCSJMTktGTEFHUyA9IC1zIgorCisjQXMgYWJvdmUgYnV0IGluY2x1ZGVzIFNoYWRvdyBwYXNzd29yZCBzdXBwb3J0IG5lZWRlZCBmb3IgSUtTRC4KK3V3N2lrc2Q6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiAiS0ZMQUdTPS1EQ0tfU0hBRE9XICQoS0ZMQUdTKSIgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkxJQlM9IC1sZ2VuIiB1bml4d2FyZTd0CisKKyNBcyBhYm92ZSBidXQgbGlua3Mgd2l0aCBzdGF0aWMgQVBJIGZvciByZWFscGF0aCgpIHNvIGEgYmluYXJ5IGJ1aWx0Cisjd2l0aCB0aGlzIHRhcmdldCBvbiBVVzcuMSB3aWxsIGFsc28gd29yayBvbiA3LjAuICBSZXF1aXJlcyBTQ08gVURLCisjcmF0aGVyIHRoYW4gdGhlIHN0b2NrIGNvbXBpbGVyLgordXc3aWtzZHVkazoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiICJLRkxBR1M9LURDS19TSEFET1cgJChLRkxBR1MpIiBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiTElCUz0gLWxnZW4gLWxjdWRrNzAiIHVuaXh3YXJlN3QKKworI0VTSVggU1ZSNC4wLjMgb3IgNC4wNCB3aXRoIFRDUC9JUCBzdXBwb3J0LgorI0hhcyA8c3lzL3Rlcm1pb3guaD4sIEFOU0kgQyBmdW5jdGlvbiBwcm90b3R5cGluZyBkaXNhYmxlZC4KKyNBZGQgLW00ODYgdG8gQ0ZMQUdTIGlmIGRlc2lyZWQuCitlc2l4cjQ6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRVNJWCBTVlI0ICsgVENQL0lQLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtRFNWUjQgLURESVJFTlQgLURIREJVVUNQIC1ETk9BTlNJIFwKKwktRFNURVJNSU9YIC1EVENQU09DS0VUICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gLXMiIFwKKwkiTElCUyA9IC1sc29ja2V0IC1sbnNsIgorCisjQVQmVCBVTklYIFN5c3RlbSBWIFI0LgorI0hhcyA8c3lzL3Rlcm1pb3guaD4sIFdvbGxvbmdvbmcgV0lOL1RDUCBUQ1AvSVAuCitzeXM1cjRzeG5ldDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIFVOSVggU3lzdGVtIFYgUjQuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgXAorCS1EU1RFUk1JT1ggLURXT0xMT05HT05HICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gLXMiCisKKyNBVCZUIFVOSVggU3lzdGVtIFYgUjQsIG5vIDx0ZXJtaW8ueD4gb3IgPHN5cy90ZXJtaW8ueD4uCitzeXM1cjRueDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIFVOSVggU3lzdGVtIFYgUjQuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgLUROT0xFQVJOICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1zIgorCisjQVQmVCBVTklYIFN5c3RlbSBWIFI0LCBubyA8dGVybWlvLng+IG9yIDxzeXMvdGVybWlvLng+LCBjdXJzZXMsIFRDUC9JUC4KK3N5czVyNG54bmV0YzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIFVOSVggU3lzdGVtIFYgUjQuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgXAorCS1EQ0tfQ1VSU0VTIC1EVENQU09DS0VUICQoS0ZMQUdTKSIgXAorCSJMSUJTID0gLWxjdXJzZXMgLWxzb2NrZXQgLWxuc2wgLWx0Y3BpcCIgXAorCSJMTktGTEFHUyA9IC1zIgorCisjQVQmVCBVTklYIFN5c3RlbSBWIFI0LCBubyA8dGVybWlvLng+IG9yIDxzeXMvdGVybWlvLng+LCBXb2xsb25nb25nIFRDUC9JUC4KK3N5czVyNG54dHdnOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFUJlQgVU5JWCBTeXN0ZW0gViBSNC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURTVlI0IC1ERElSRU5UIC1ESERCVVVDUCAtRFdPTExPTkdPTkcgJChLRkxBR1MpIgorCSJMTktGTEFHUyA9IC1zIgorCisjSUNMIFVOSVggU3lzdGVtIFYgUjQuKERSUyBOL1gpIHZlcnNpb24gOi0KKyNVTklYIFN5c3RlbSBWIFJlbGVhc2UgNC4wIElDTCBEUlMgNjAwMCAoU1BBUkMpCisjRFJTL05YIDYwMDAgU1ZSNCBWZXJzaW9uIDUgIExldmVsIDEgIEluY3JlbWVudCA0CisjSGFzIDxzeXMvdGVybWlveC5oPiwgcmVndWxhciBCZXJrZWxleSBzb2NrZXRzIGxpYnJhcnksIGkuZS4gaW4uaCBhbmQgaW5ldC5oCisjYXJlIG5vdCBtaXNwbGFjZWQgaW4gc3lzIChyYXRoZXIgdGhhbiBuZXRpbmV0IGFuZCBhcnBhLCByZXNwZWN0aXZlbHkpLgorI1VzZXMgQU5TSSBDIGNvbnN0cnVjdHMsIGFkdmlzb3J5IGZpbGUgbG9ja2luZyBvbiBkZXZpY2VzLCBldGMuCisjUmVtb3ZlIC1sbnNsIGlmIGl0IGNhdXNlcyB0cm91YmxlLgoraWNsc3lzNXI0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIElDTCBVTklYIFN5c3RlbSBWIFI0IChEUlMgTi9YKScKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURTVlI0IC1ESUNMX1NWUjQgLURESVJFTlQgLURIREJVVUNQIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sc29ja2V0IC1sbnNsIC1scmVzb2x2ICIgIkxOS0ZMQUdTID0gLXMiCisKKyNBcyBhYm92ZSBidXQgZm9yIERSUy9OWCA0LjJNUCA3TVBsdXMuCitpY2xzeXM1cjRtKzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBJQ0wgVU5JWCBTeXN0ZW0gViBSNCBEUlMvTlggNC4yTVArJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtRFNWUjQgLURJQ0xfU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgLUROT0lLU0QgXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sc29ja2V0IC1sbnNsIC1sbSAtbGMgLWcgLWxnZW4gIiAiTE5LRkxBR1MgPSAtcyIKKworI0FzIGFib3ZlIGJ1dCBmb3IgRFJTL05YIDQuMk1QIDdNUGx1cyB3aXRoIElLU0Qgc3VwcG9ydC4KK2ljbHN5czVyNG0raWtzZDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBJQ0wgVU5JWCBTeXN0ZW0gViBSNCBEUlMvTlggNC4yTVArJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtRFNWUjQgLURJQ0xfU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgLUROT0dFVFVTRVJTSEVMTCBcCisJLURTVEVSTUlPWCAtRFRDUFNPQ0tFVCAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxzb2NrZXQgLWxuc2wgLWxtIC1sYyAtZyAtbGdlbiAtbHJlc29sdiAiICJMTktGTEFHUyA9IC1zIgorCitpY2xzeXM1cjRfNDg2OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgaWNsc3lzNXI0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworI0RhdGEgR2VuZXJhbCBERy9VWCA0LjMwIChTeXN0ZW0gViBSMykgZm9yIERHIEFWaWlPTiwgd2l0aCBUQ1AvSVAgc3VwcG9ydC4KK2RndXg0MzA6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgREcgQVZpaU9OIERHL1VYIDQuMzAuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EREdVWDQzMCAtRFNWUjMgLURESVJFTlQgLURUQ1BTT0NLRVQgXAorCS1ETk9JTkFERFJYIC1ETk9HRVRVU0VSU0hFTEwgJChLRkxBR1MpIgorCisjRGF0YSBHZW5lcmFsIERHL1VYIDQuMzAgZm9yIERHIEFWaWlPTiwgd2l0aCBUQ1AvSVAgc3VwcG9ydCB3aXRoIEJTRGlzbXMuCitkZ3V4NDMwYnNkOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIERHIEFWaWlPTiBERy9VWCA0LjMwLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtRERHVVg0MzAgLURfQlNEX1NPVVJDRSAtREJTRDQgXAorCS1ETk9JTkFERFJYIC1EVENQU09DS0VUIC1ETk9HRVRVU0VSU0hFTEwgJChLRkxBR1MpIgorCisjRGF0YSBHZW5lcmFsIERHL1VYIDUuNCAoU3lzdGVtIFYgUjQpIGZvciBERyBBVmlpT04sIHdpdGggVENQL0lQIHN1cHBvcnQuCisjQWRkIC1sc29ja2V0IC1sbnNsIGlmIGluZXRfYWRkciBjb21lcyB1cCBtaXNzaW5nLi4uCisjSG1tbSAtIEkgcmVhbGx5IHRoaW5rIENLX1BPTEwgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGlzIG9uZSBpbiB3aGljaCBjYXNlCisjdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGRndXg1NDAgYW5kIGRndXg1NDBpLgorZGd1eDU0MDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBERyBBVmlpT04gREcvVVggNS40MC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURER1VYNTQwIC1ERElSRU5UIC1ESERCVVVDUCAtRE5PSU5BRERSWCBcCisJLURTVEVSTUlPWCAtRFRDUFNPQ0tFVCAtRENLX1BPTEwgLUROT0dFVFVTRVJTSEVMTCAkKEtGTEFHUykiCisKKyNEYXRhIEdlbmVyYWwgREcvVVggNS40MCAoU3lzdGVtIFYgUjQpIGZvciBJbnRlbCBBVmlpT04sIHdpdGggVENQL0lQIHN1cHBvcnQuCitkZ3V4NTQwaToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBERyBBVmlpT04gREcvVVggNS40MC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURER1VYNTQwIC1ERElSRU5UIC1ESERCVVVDUCAtRE5PSU5BRERSWCBcCisJLURTVEVSTUlPWCAtRFRDUFNPQ0tFVCAtRE5PR0VUVVNFUlNIRUxMICQoS0ZMQUdTKSIgXAorCSJMSUJTID0gLWxzb2NrZXQgLWxuc2wiCisKK2RndXg1NDoKKwltYWtlIGRndXg1NDAgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCisjRGF0YSBHZW5lcmFsIERHL1VYIDUuNCAoPSBTeXN0ZW0gViBSNCkgZm9yIERHIEFWaWlPTiwgd2l0aCBUQ1AvSVAgc3VwcG9ydC4KKyMgQW5kIGN1cnNlcy4KK2RndXg1NDBjOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIERHIEFWaWlPTiBERy9VWCA1LjQuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EREdVWDU0MCAtRERJUkVOVCAtREhEQlVVQ1AgLUROT0lOQUREUlggXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1ETk9HRVRVU0VSU0hFTEwgXAorCSQoS0ZMQUdTKSIgIkxJQlM9IC1sY3Vyc2VzOCAtbHRlcm1jYXAiICJMTktGTEFHUyA9IC1zIgorCisjQXMgYWJvdmUgYnV0IGZvciBJbnRlbCAtIG9ubHkgZGlmZmVyZW5jZSBpcyBuYW1lIGxpYnJhcnkgbmFtZXMuCitkZ3V4NTQwaWM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgREcgQVZpaU9OIERHL1VYIDUuNDAuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EREdVWDU0MCAtRERJUkVOVCAtREhEQlVVQ1AgLUROT0lOQUREUlggXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1ETk9HRVRVU0VSU0hFTEwgXAorCSQoS0ZMQUdTKSIgIkxJQlMgPSAtbHNvY2tldCAtbG5zbCAtbGN1cnNlcyAtbHRlcm1jYXAiCisKK2RndXg1NGM6CisJbWFrZSBkZ3V4NTQwYyBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKKyNERy9VWCA1LjRSMy4xMAorZGd1eDU0MzEwOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIERHIEFWaWlPTiBERy9VWCA1LjRSMy4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLURER1VYNTQwIC1EREdVWDU0MzEwIC1ERElSRU5UIC1ESERCVVVDUCAtRFNFTEVDVCBcCisJLURTVEVSTUlPWCAtRFRDUFNPQ0tFVCAtRENLX0NVUlNFUyAtRENLX05FV1RFUk0JLUROT0dFVFVTRVJTSEVMTCBcCisJLUROT0lOQUREUlggJChLRkxBR1MpIiAiTElCUz0gLWxjdXJzZXM4IC1sdGVybWNhcCIgIkxOS0ZMQUdTID0gLXMiCisKKyNERy9VWCA1LjRSNC4xMCAtIEluY2x1ZGVzIGV2ZXJ5dGhpbmcuCitkZ3V4NTQ0MTA6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgREcvVVggNS40UjQuMTAuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EREdVWDU0MCAtRERHVVg1NDQxMCAtRERJUkVOVCAtREhEQlVVQ1AgLURTRUxFQ1QgXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1ETk9JTkFERFJYICQoS0ZMQUdTKSIgIkxJQlMgPSAtbHNvY2tldCAtbG5zbCAtbGN1cnNlcyAtbHRlcm1jYXAiCisKKyNERy9VWCA1LjRSNC4xMSAtIEluY2x1ZGVzIGV2ZXJ5dGhpbmcuCitkZ3V4NTQ0MTE6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgREcvVVggNS40UjQuMTEuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EREdVWDU0MCAtRERHVVg1NDQxMSAtRERJUkVOVCAtREhEQlVVQ1AgLURTRUxFQ1QgXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1ETk9JTkFERFJYICQoS0ZMQUdTKSIgIkxJQlMgPSAtbHNvY2tldCAtbG5zbCAtbGN1cnNlcyAtbHRlcm1jYXAiCisKKyNERy9VWCA1LjRSNC4yMCAtIEluY2x1ZGVzIGV2ZXJ5dGhpbmcuCitkZ3V4NTQ0MjA6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgREcvVVggNS40UjQuMjAuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EREdVWDU0MCAtRERHVVg1NDQyMCAtRERJUkVOVCAtREhEQlVVQ1AgLURTRUxFQ1QgXAorCS1EU1RFUk1JT1ggLURUQ1BTT0NLRVQgLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1ETk9JTkFERFJYICQoS0ZMQUdTKSIgXAorCSJMSUJTID0gLWxzb2NrZXQgLWxyZXNvbHYgLWxuc2wgLWxjdXJzZXMgLWx0ZXJtY2FwIgorCisjU2lsaWNvbiBHcmFwaGljcyBTeXN0ZW0gViBSMyB3aXRoIEJTRCBmaWxlIHN5c3RlbSAoSVJJUykKK2lyaXM6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTaWxpY29uIEdyYXBoaWNzIElSSVggcHJlLTMuMy4uLgorCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtRFNWUjMgLURMT05HRk4gLUROT0xFQVJOICQoS0ZMQUdTKSAtSS91c3IvaW5jbHVkZS9ic2QiIFwKKwkiTElCUyA9IC1sYnNkIgorCisjU2lsaWNvbiBHcmFwaGljcyBJUklTIFN5c3RlbSBWIFIzCitpcml4MzM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU2lsaWNvbiBHcmFwaGljcyBJUklYIDMuMy4uLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLURTVlIzIC1ERElSRU5UIC1ESERCVVVDUCAtRE5PTEVBUk4gJChLRkxBR1MpIC1PIiBcCisJIkxOS0ZMQUdTID0gLXMiCisKKyNTaWxpY29uIEdyYXBoaWNzIElyaXMgSW5kaWdvIHdpdGggSVJJWCA0LjAuMCBvciA1LjAuLi4KKyNTdHJpY3QgQU5TSSBDIGNvbXBpbGF0aW9uLCBUQ1AvSVAgc3VwcG9ydCBpbmNsdWRlZAoraXJpeDQwOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNpbGljb24gR3JhcGhpY3MgSVJJWCA0LjAuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1ESVJJWDQwIC1EU1ZSMyAtRERJUkVOVCAtREhEQlVVQ1AgLURQV0lEX1Q9dWlkX3QgXAorCS1EQ0tfQU5TSUMgLURUQ1BTT0NLRVQgJChLRkxBR1MpIC1PIC1PbGltaXQgMTYwMCAtSS91c3IvaW5jbHVkZS9ic2QiIFwKKwkiTE5LRkxBR1MgPSAtcyIKKworI0FzIGFib3ZlLCBidXQgd2l0aCBmdWxsc2NyZWVuIGRpc3BsYXkgKGN1cnNlcykgYW5kIFN1biBZZWxsb3cgUGFnZXMgc3VwcG9ydC4KKyNOT1RFOiBJUklYIHZlcnNpb25zIHByaW9yIHRvIDUgcnVuIENPRkYgYmluYXJpZXMuCitpcml4NDB5cGM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU2lsaWNvbiBHcmFwaGljcyBJUklYIDQuMC4nCisJQGVjaG8gJ0luY2x1ZGVzIGZ1bGxzY3JlZW4gZmlsZSBkaXNwbGF5IGFuZCBTdW4gWWVsbG93IFBhZ2VzLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtRElSSVg0MCAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIC1EQ0tfQ1VSU0VTIFwKKwktRFBXSURfVD11aWRfdCAtRENLX0FOU0lDIC1EVENQU09DS0VUICQoS0ZMQUdTKSBcCisJLU8gLU9saW1pdCAxNjAwIC1JL3Vzci9pbmNsdWRlL2JzZCIgXAorCSJMSUJTID0gLWxjdXJzZXMgLWxzdW4iICJMTktGTEFHUyA9IC1zIgorCisjIFNpbGljb24gR3JhcGhpY3MgSXJpcyBTZXJpZXMgNEQvKiwgSVJJWCA0LjAueCwgLU80IHVjb2RlIG9wdGltaXplZC4KKyMgSHVnZSB0ZW1wb3JhcnkgZmlsZSBzcGFjZSBuZWVkZWQgZm9yIHVjb2RlIG9wdGltaXplci4gIElmIHlvdSBnZXQgYW4gZXJyb3IKKyMgbGlrZSAidWdlbjogaW50ZXJuYWwgZXJyb3Igd3JpdGluZyB0byAvdG1wL2N0bWNhMDg3Nzc6IEVycm9yIDAiLCBkZWZpbmUgdGhlCisjIHRoZSBUTVBESVIgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQgdG8gYSBmaWxlIHN5c3RlbSB0aGF0IGhhcyBtb3JlCisjIHNwYWNlIGF2YWlsYWJsZSwgZS5nLiAic2V0ZW52IFRNUERJUiAvdXNyL3RtcCIuCitpcml4NDB1OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNpbGljb24gR3JhcGhpY3MgSVJJWCA0LjAuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1ESVJJWDQwIC1EU1ZSMyAtRERJUkVOVCAtREhEQlVVQ1AgLURQV0lEX1Q9dWlkX3QgXAorCS1EQ0tfQU5TSUMgLURUQ1BTT0NLRVQgJChLRkxBR1MpIC1PNCAtT2xpbWl0IDE2MDAiIFwKKwkiTE5LRkxBR1M9LU80IC1PbGltaXQgMTYwMCAtcyIgIkVYVD11IgorCisjIEFzIGFib3ZlLCB3aXRoIEN1cnNlcyBTdXBwb3J0IGFkZGVkCitpcml4NDB1YzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTaWxpY29uIEdyYXBoaWNzIElSSVggNC4wLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtRElSSVg0MCAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIC1EUFdJRF9UPXVpZF90IFwKKwktRENLX0FOU0lDIC1EQ0tfQ1VSU0VTIC1EVENQU09DS0VUICQoS0ZMQUdTKSAtTzQgLU9saW1pdCAxNjAwIiBcCisJIkxOS0ZMQUdTPS1PNCAtT2xpbWl0IDE2MDAgLXMiICJFWFQ9dSIgIkxJQlM9IC1sY3Vyc2VzIC1sdGVybWNhcCIKKworI1NpbGljb24gR3JhcGhpY3MgSVJJWCA1LnguCisjWWVsbG93IFBhZ2VzIGFuZCBDdXJzZXMgc3VwcG9ydCBpbmNsdWRlZC4KKyNJUklYIHZlcnNpb24gNS54IGNhbiBydW4gQ09GRiBvciBFTEYgYmluYXJpZXMuCitpcml4NTE6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU2lsaWNvbiBHcmFwaGljcyBJUklYIDUueCcKKwlAZWNobyAnSW5jbHVkZXMgZnVsbHNjcmVlbiBmaWxlIGRpc3BsYXkgYW5kIFllbGxvdyBQYWdlcy4uLicKKwlAZWNobyAnQWRkIC1taXBzPG4+IHRvIENGTEFHUyBzcGVjaWZ5IGEgcGFydGljdWxhciBoYXJkd2FyZSB0YXJnZXQuJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtRElSSVg1MSAtRFNWUjQgLURESVJFTlQgLURIREJVVUNQIC1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSBcCisJLURQV0lEX1Q9dWlkX3QgLURDS19BTlNJQyAtRFRDUFNPQ0tFVCAtRFNFTEVDVCAtRE5PR0VUVVNFUlNIRUxMIFwKKwktRFNZU1RJTUVIIC1ERENMUE9QRU4gLUREQ0xGRE9QRU4gJChLRkxBR1MpIC1hbnNpIC1PIC1PbGltaXQgMzAwMCIgXAorCSJMSUJTID0gLWxjdXJzZXMiICJMTktGTEFHUyA9IC1zIgorCisjVXNlIHRoaXMgb25lIGlmIGlyaXg1MSBibG93cyB1cCBkdWUgdG8gbGFjayBvZiBzd2FwIHNwYWNlIG9yIHdoYXRldmVyLgoraXJpeDUxeDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTaWxpY29uIEdyYXBoaWNzIElSSVggNS54JworCUBlY2hvICdJbmNsdWRlcyBmdWxsc2NyZWVuIGZpbGUgZGlzcGxheSBhbmQgWWVsbG93IFBhZ2VzLi4uJworCUBlY2hvICdBZGQgLW1pcHM8bj4gdG8gQ0ZMQUdTIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIGhhcmR3YXJlIHRhcmdldC4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1ESVJJWDUxIC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgLURDS19DVVJTRVMgLURDS19ORVdURVJNIFwKKwktRFBXSURfVD11aWRfdCAtRENLX0FOU0lDIC1EVENQU09DS0VUIC1EU0VMRUNUIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1EU1lTVElNRUggLUREQ0xQT1BFTiAtRERDTEZET1BFTiAkKEtGTEFHUykiIFwKKwkiTElCUyA9IC1sY3Vyc2VzIiAiTE5LRkxBR1MgPSAtcyIKKworaXJpeDUxeXBjOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgaXJpeDUxIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9ICQoS0ZMQUdTKSIKKworI0lSSVggNS4yIGFkZHMgUlRTL0NUUworaXJpeDUyOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgaXJpeDUxIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURJUklYNTIgLURDS19SVFNDVFMgJChLRkxBR1MpIgorCitpcml4NTM6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBpcml4NTEgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRElSSVg1MiAtRElSSVg1MyAtRENLX1JUU0NUUyAkKEtGTEFHUykiCisKK2lyaXg1M3g6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBpcml4NTF4IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURJUklYNTIgLURJUklYNTMgLURDS19SVFNDVFMgJChLRkxBR1MpIgorCisjU2lsaWNvbiBHcmFwaGljcyBJUklYIDYuWzAyNF0gY29tbW9uIHN0dWZmLgorI1llbGxvdyBQYWdlcyBhbmQgQ3Vyc2VzIHN1cHBvcnQgaW5jbHVkZWQuCisjSVJJWCB2ZXJzaW9uIDYuMCBhbmQgbGF0ZXIgcnVucyBvbmx5IEVMRiBiaW5hcmllcy4KKyNEZXBlbmRzIG9uIGNvZGUgY2hhbmdlcyBpbiBja3VkZWIuaCB0aGF0IG1ha2UgLURJUklYNnggZGVmaW5lIGFsbAorI2xvd2VyIElSSVg2eCB2YWx1ZXMgYW5kIElSSVg1MS4KK2lyaXg2eDoKKwlAZWNobyAnSW5jbHVkZXMgZnVsbHNjcmVlbiBmaWxlIGRpc3BsYXkgYW5kIFllbGxvdyBQYWdlcy4uLicKKwlAZWNobyAnQWRkIC1taXBzPG4+IHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIGhhcmR3YXJlIHRhcmdldC4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgLUROT0dFVFVTRVJTSEVMTCBcCisJLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1EUFdJRF9UPXVpZF90IC1EQ0tfQU5TSUMgLURUQ1BTT0NLRVQgXAorCS1EU0VMRUNUIC1EQ0tfUlRTQ1RTIC1PICQoS0ZMQUdTKSIgXAorCSJMSUJTID0gLWxjdXJzZXMiICJMTktGTEFHUyA9IC1zICQoTE5LRkxBR1MpIgorCisjU2lsaWNvbiBHcmFwaGljcyBJUklYIDYuMC4KK2lyaXg2MDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTaWxpY29uIEdyYXBoaWNzIElSSVggNi4wJworCUAkKE1BS0UpICJNQUtFPSQoTUFLRSkiIFwKKwkiS0ZMQUdTPS1ESVJJWDYwIC1PbGltaXQgMjEzOCAkKEtGTEFHUykiIFwKKwlpcml4NnggS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCisjU2lsaWNvbiBHcmFwaGljcyBJUklYIDYuMi4KKyNTZXJpYWwgc3BlZWRzID4gMzg0MDAgYXJlIGF2YWlsYWJsZSBpbiBJUklYIDYuMiBvbiBPLWNsYXNzIG1hY2hpbmVzIG9ubHkuCisjTm90ZTogT2xpbWl0IG11c3QgYmUgYSBudW1iZXIgPiAwLgoraXJpeDYyOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNpbGljb24gR3JhcGhpY3MgSVJJWCA2LjInCisJQCQoTUFLRSkgIk1BS0U9JChNQUtFKSIgXAorCUxOS0ZMQUdTPSItV2wsLXdvZmYsODQiIFwKKwkiS0ZMQUdTPS1ESVJJWDYyIC1PbGltaXQgNDcwMCAkKEtGTEFHUykiIFwKKwlpcml4NnggS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCisjU2lsaWNvbiBHcmFwaGljcyBJUklYIDYuMy4KK2lyaXg2MzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTaWxpY29uIEdyYXBoaWNzIElSSVggNi4zJworCUAkKE1BS0UpICJNQUtFPSQoTUFLRSkiIGlyaXg2MiBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1ESVJJWDYzIgorCisjU2lsaWNvbiBHcmFwaGljcyBJUklYIDYuNC4KKyMgLXdvZmYsODQgdG8gbGlua2VyIHN0b3BzIGNvbXBsYWludHMgYWJvdXQgbm8gc3ltYm9scyBsb2FkZWQgZnJvbQorIyBjdXJzZXMsIGFuZCAtd29mZiAxMTEwIHN0b3BzIGNvbXBsYWludHMgYWJvdXQgdW5yZWFjaGFibGUgImJyZWFrOyIKKyMgc3RhdGVtZW50cyBpbiBja2Nwcm8uYyBhbW9uZyBvdGhlcnMuCisjIHRlc3RlZCBvbiBTR0kgT2N0YW5lLCBydW5uaW5nIElSSVggNi40IHVwIHRvIDExNTIwMCBicHMuCisjIC1PbGltaXQgMCBtZWFucyBpbmZpbml0ZS4KK2lyaXg2NDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTaWxpY29uIEdyYXBoaWNzIElSSVggNi40JworCUAkKE1BS0UpICJNQUtFPSQoTUFLRSkiIFwKKwlMTktGTEFHUz0iLVdsLC13b2ZmLDg0IiBcCisJIktGTEFHUz0tRElSSVg2NCAtRENLX1JUU0NUUyAtT2xpbWl0IDMwMDAgLXdvZmYgMTExMCAkKEtGTEFHUykiIFwKKwlpcml4NnggS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCitpcml4NjRnY2M6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU2lsaWNvbiBHcmFwaGljcyBJUklYIDYuNCBnY2MnCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTPSAtRFNWUjQgLURJUklYNjQgLURDS19DVVJTRVMgLURUQ1BTT0NLRVQgLUROT0NPVEZNQyBcCisJJChLRkxBR1MpIC1PIiAiTElCUz0gLWxjdXJzZXMgLWx0ZXJtY2FwIC1sY3J5cHQiCisKKyNOb3RlIHRoZSBuZXcgT3B0aW1pemF0aW9uIG9wdGlvbiBzeW50YXggZm9yIE1JUFNwcm8gQ0MgNy4yLjEuMm0uCitpcml4NjU6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0dJIElSSVggNi41JworCUAkKE1BS0UpICJNQUtFPSQoTUFLRSkiIExOS0ZMQUdTPSItV2wsLXdvZmYsODQiIFwKKwkiS0ZMQUdTPS1ESVJJWDY1IC1EQ0tfUlRTQ1RTIC1PUFQ6T2xpbWl0PTAgLXdvZmYgMTExMCwxNTUyLDExNzQgXAorCSQoS0ZMQUdTKSIgXAorCWlyaXg2eCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKKyNEdW1iIGRvd24gdG8gTUlQUy0yIGlmIGJ1aWxkaW5nIG9uIFI1MDAwIG9yIGhpZ2hlci4uLgoraXJpeDY1bWlwczI6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0dJIElSSVggNi41IE1JUFMtMicKKwlAJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBMTktGTEFHUz0iLW8zMiAtbWlwczIgLVdsLC13b2ZmLDg0IiBcCisJIktGTEFHUz0tRElSSVg2NSAtRENLX1JUU0NUUyAtT1BUOk9saW1pdD0wIC1vMzIgLW1pcHMyIFwKKwktd29mZiAxMTEwLDE1NTIsMTE3NCAkKEtGTEFHUykiIFwKKwlpcml4NnggS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCitpcml4Nngra3JiNToKKwlAZWNobyAnSW5jbHVkZXMgZnVsbHNjcmVlbiBmaWxlIGRpc3BsYXkgYW5kIFllbGxvdyBQYWdlcy4uLicKKwlAZWNobyAnQWRkIC1taXBzPG4+IHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIGhhcmR3YXJlIHRhcmdldC4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EU1ZSNCAtRERJUkVOVCAtREhEQlVVQ1AgLUROT0dFVFVTRVJTSEVMTCBcCisJLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1EUFdJRF9UPXVpZF90IC1EQ0tfQU5TSUMgLURUQ1BTT0NLRVRcCisJLURTRUxFQ1QgLURDS19SVFNDVFMgLU8gXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19LRVJCRVJPUyAtREtSQjUgLURDS19FTkNSWVBUSU9OIC1EQ0tfREVTIFwKKwkkKEs1SU5DKSAkKEs1SU5DKS9rcmI1ICQoS0ZMQUdTKSIgXAorCSJMSUJTID0gLWxjdXJzZXMgJChLNUxJQikgLWxkZXM0MjUgLWxrcmI1IFwKKwktbGNvbV9lcnIgLWxjcnlwdG8gLWxjcnlwdCAtbGdzc2FwaV9rcmI1IiBcCisJIkxOS0ZMQUdTID0gLXMgJChMTktGTEFHUykiCisKK2lyaXg2NStrcmI1OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNHSSBJUklYIDYuNScKKwlAJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBcCisJTE5LRkxBR1M9Ii1XbCwtd29mZiw4NCIgXAorCSJLRkxBR1M9LURJUklYNjUgLURDS19SVFNDVFMgLU9QVDpPbGltaXQ9MCAtd29mZiAxMTEwLDE1NTIsMTE3NCBcCisJJChLRkxBR1MpIiBcCisJaXJpeDZ4K2tyYjUgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCisjSW4gY2FzZSB0aGV5IHR5cGUgIm1ha2Ugc3lzNSIuLi4KK3N5czU6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzeXMzIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworI0dlbmVyaWMgQVRUIFN5c3RlbSBJSUkgb3IgU3lzdGVtIFYgKHdpdGggSSZEIHNwYWNlKQorc3lzMzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIFVOSVggU3lzdGVtIElJSScKKwlAZWNobyAnb3IgU3lzdGVtIFYgUjIgb3IgZWFybGllci4uLicKKwlAZWNobyAnYWRkIC1ETk9NS0RJUiBpZiBta2RpciBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLURBVFRTViAtRE5PVU5JQ09ERSAtRE5PU1lTTE9HIC1ETk9TWU1MSU5LIC1ETk9HRVRVU0VSU0hFTEwgXAorCS1ETk9JTklUR1JPVVBTIC1ETk9GVFJVTkNBVEUgLUROT1JFQUxQQVRIIC1ETk9MRUFSTiAkKEtGTEFHUykgLWkgLU8iIFwKKwkiTE5LRkxBR1MgPSAtaSIKKworI0dlbmVyaWMgQVRUIFN5c3RlbSBJSUkgb3IgU3lzdGVtIFYgKG5vIEkmRCBzcGFjZSkKK3N5czNuaWQ6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQVQmVCBVTklYIFN5c3RlbSBJSUknCisJQGVjaG8gJ29yIFN5c3RlbSBWIFIyIG9yIGVhcmxpZXIsIG5vIEkmRCBzcGFjZS4uLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLURBVFRTViAtRE5PUkVBTFBBVEggLUROT1VOSUNPREUgLUROT1NZU0xPRyAtRE5PU1lNTElOSyBcCisJLUROT0dFVFVTRVJTSEVMTCAtRE5PSU5JVEdST1VQUyAtRE5PRlRSVU5DQVRFIC1ETk9MRUFSTiAkKEtGTEFHUykgLU8iIFwKKwkiTE5LRkxBR1MgPSIKKworI0dlbmVyaWMgQVRUIFN5c3RlbSBJSUkgb3IgU3lzdGVtIFYgUjIgb3IgZWFybGllciwgIm5vIHZvaWQiOgorI3NwZWNpYWwgZW50cnkgdG8gcmVtb3ZlICJJbGxlZ2FsIHBvaW50ZXIgY29tYmluYXRpb24iIHdhcm5pbmdzLgorc3lzM252OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFUJlQgVU5JWCBTeXN0ZW0gSUlJJworCUBlY2hvICdvciBTeXN0ZW0gViBSMiBvciBlYXJsaWVyLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQVRUU1YgLUROT1JFQUxQQVRIIC1ETk9VTklDT0RFIC1ETk9TWVNMT0cgLUROT0dFVFVTRVJTSEVMTCBcCisJLUROT1NZTUxJTksgLUROT0ZUUlVOQ0FURSAtRE5PSU5JVEdST1VQUyAtRE5PTEVBUk4gXAorCS1Edm9pZD1pbnQgJChLRkxBR1MpIC1pIC1PIiBcCisJIkxOS0ZMQUdTID0gLWkiCisKKyMgQVQmVCA3MzAwIFVOSVggUEMuICBBcyBvZiBDLUtlcm1pdCA2LjEsIG1hbnkgb2YgdGhlc2UgZW50cmllcyBkb24ndCB3b3JrCisjIGFueSBtb3JlIGR1ZSB0byAiT3V0IG9mIG1lbW9yeSIgb3IgIlRvbyBtYW55IGRlZmluZXMiIGVycm9ycyBkdXJpbmcKKyMgY29tcGlsYXRpb24sIGF0IGxlYXN0IG5vdCBvbiBzeXN0ZW1zIHdpdGhvdXQgbG90cyBvZiBtZW1vcnkuICBUaGUgc3lzM3VwY2djCisjIGVudHJ5IHdvcmtzICh1c2luZyBnY2MpIHdpdGggb3B0aW1pemF0aW9uIHJlbW92ZWQsIGFuZCBtaWdodCBhbHNvIHdvcmsKKyMgd2l0aCBvcHRpbWl6YXRpb24gZW5hYmxlZCBvbiBtYWNoaW5lcyB3aXRoIGxhcmdlciBtZW1vcmllcy4KKworI0FUJlQgNzMwMC9VTklYIFBDICgzQjEpIHN5c3RlbXMsIHN5czMgYnV0IHNwZWNpYWwgaGFuZGxpbmcgZm9yIGludGVybmFsIG1vZGVtLgorI0xpbmsgd2l0aCB0aGUgc2hhcmVkIGxpYnJhcnkgLS0gdGhlIGNvbmZsaWN0IHdpdGggb3BlbmkgaW4gc2hhcmVkIGxpYnJhcnkKKyNpcyBzb2x2ZWQgd2l0aCAtRG9wZW5pPXhvcGVuaS4gIE5vdGUgdGhhdCB0aGUgeGVybWl0IHRhcmdldCBjYW4ndCBiZSB1c2VkCisjZm9yIHRoZSBVbml4IFBDOyB0aGVyZSBpcyBubyBzZWxlY3QoKS4KK3N5czN1cGM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQVQmVCA3MzAwIFVOSVggUEMsIHNoYXJlZCBsaWIuLi4nCisJQGVjaG8gJ0lmIHNoYXJlZCBsaWIgY2F1c2VzIHRyb3VibGUsIHVzZSBtYWtlIHN5czN1cGNvbGQuJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtREFUVDczMDAgLUROT01LRElSIC1EVVNFX01FTUNQWSAtRE5PUkVBTFBBVEggLUROT0xFQVJOIFwKKwktRE5PU1lTTE9HIC1ETk9TWU1MSU5LIC1ETk9HRVRVU0VSU0hFTEwgLUROT0lOSVRHUk9VUFMgLUROT0ZUUlVOQ0FURSBcCisJLUROT1JFRElSRUNUIC1ETk9HRlRJTUVSIC1ETk9VTklDT0RFICQoS0ZMQUdTKSAtRG9wZW5pPXhvcGVuaSIgXAorCSJDQzIgPSBsZCAvbGliL2NydDBzLm8gL2xpYi9zaGxpYi5pZmlsZSIgIkxOS0ZMQUdTID0gLXMiCisKKyNBVCZUIDczMDAvVW5peCBQQyBzeXN0ZW1zLCBtaW5pbXVtIGtlcm1pdCBmb3IgdGhvc2Ugd2l0aCBzbWFsbGVyIGFtb3VudHMKKyNvZiBtZW1vcnkuCitzeXMzdXBjbToKKwlAZWNobyBNaW5pbXVtIGludGVyYWN0aXZlCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzeXMzdXBjIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LUROT1NQTCAtRE5PRlJJTExTIC1ETk9IRUxQIC1ETk9ERUJVRyAtRE5PVExPRyAtRE5PQ1NFVFMgXAorCS1ETk9TWVNMT0cgLUROT1NFVEtFWSAtRE5PUkVBTFBBVEgiCisKKyNBVCZUIDczMDAvVU5JWCBQQyAoM0IxKSBzeXN0ZW1zLCB3aXRoIGN1cnNlcyBzdXBwb3J0LgorI0N1cnNlcyBhbmQgdGhlIHNoYXJlZCBsaWJyYXJ5IGRvbid0IGdldCBhbG9uZywgc28gd2UgZG9uJ3QgdXNlIHRoZQorI3NoYXJlZCBsaWJyYXJ5LiAgV2UgbmVlZCB0byBpbmNsdWRlIENLX05FV1RFUk0gdG8gYXZvaWQgYSBjb25mbGljdAorI3dpdGggY3Vyc2VzIGFuZCBidWZmZXJpbmcgb24gc3Rkb3V0LiAgTWVyZ2VkIHdpdGggc3VibWlzc2lvbiBieQorI1JvYmVydCBXZWluZXIvUHJvZ3JhbW1pbmcgUGx1cywgcndlaW5lckB3YXRzdW4uY2MuY29sdW1iaWEuZWR1LgorI1dlIGRvbid0IG5lZWQgLURvcGVuaT14b3Blbmkgc2luY2Ugd2UncmUgbm90IHVzaW5nIHRoZSBzaGFyZWQgbGlicmFyeSwKKyNidXQgd2Uga2VlcCBpdCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIG90aGVyIGVudHJpZXMuCitzeXMzdXBjYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIDczMDAgVU5JWCBQQywgY3Vyc2VzLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtREFUVDczMDAgLUROT1JFQUxQQVRIIFwKKwktRENLX0NVUlNFUyAtRENLX05FV1RFUk0gLUROT01LRElSIC1ETk9SRURJUkVDVCAtRE5PR0ZUSU1FUiAtRE5PTEVBUk4gXAorCS1ETk9TWVNMT0cgLUROT1NZTUxJTksgLUROT0dFVFVTRVJTSEVMTCAtRE5PSU5JVEdST1VQUyAtRE5PRlRSVU5DQVRFIFwKKwktRFVTRV9NRU1DUFkgLUROT1VOSUNPREUgJChLRkxBR1MpIC1Eb3Blbmk9eG9wZW5pIiBcCisJIkxJQlMgPSAtbGN1cnNlcyIgIkxOS0ZMQUdTID0gLXMiCisKKyNMaWtlIHN5czN1cGNjIGJ1dCBmb3IgQVQmVCBVTklYIDMuNTFtIChyZWxlYXNlZCBhcyBhIHBhdGNoIG9uIEZpeCBEaXNrIDIpLAorI2FkZHMgaGFyZHdhcmUgZmxvdyBjb250cm9sLgorYXR0MzUxbToKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHN5czN1cGNjIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURDS19SVFNDVFMgLURVTklYMzUxTSIKKworI0FzIGFib3ZlIGJ1dCB3aXRoIGdjYy4KK2F0dDM1MWdtOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc3lzM3VwY2djIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURDS19SVFNDVFMgLURVTklYMzUxTSIKKworI0FUJlQgNzMwMCBVTklYIFBDICgzQjEpLCBhcyBhYm92ZSwgYnV0IG5vIG5ld3Rlcm0oKS4KK3N5czN1cGN4OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFUJlQgNzMwMCBVTklYIFBDLCBjdXJzZXMuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1PIC1EQVRUNzMwMCAtRE5PUkVBTFBBVEggLUROT1VOSUNPREUgLUROT0xFQVJOIFwKKwktRE5PU1lTTE9HIC1ETk9TWU1MSU5LIC1ETk9HRVRVU0VSU0hFTEwgLUROT0lOSVRHUk9VUFMgLUROT0ZUUlVOQ0FURSBcCisJLURDS19DVVJTRVMgLUROT01LRElSIC1ETk9SRURJUkVDVCAtRE5PR0ZUSU1FUiAtRFVTRV9NRU1DUFkgJChLRkxBR1MpIFwKKwktRG9wZW5pPXhvcGVuaSIgIkxJQlMgPSAtbGN1cnNlcyAtbHRlcm1jYXAiICJMTktGTEFHUyA9IC1zIgorCisjQVQmVCA3MzAwL1VOSVggUEMgKDNCMSkgc3lzdGVtcywgd2l0aCBjdXJzZXMgYW5kIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuCitzeXMzdXBjc2hjYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIDczMDAgVU5JWCBQQywgc2hhcmVkIGxpYi4uLicKKwlAZWNobyAnV2l0aCBjdXJzZXMuICBSZXF1aXJlcyBzaGNjLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURBVFQ3MzAwIC1ETk9NS0RJUiAtRE5PUkVBTFBBVEggLUROT0xFQVJOIFwKKwktRE5PU1lTTE9HIC1ETk9TWU1MSU5LIC1ETk9HRVRVU0VSU0hFTEwgLUROT0lOSVRHUk9VUFMgLUROT0ZUUlVOQ0FURSBcCisJLURDS19ORVdURVJNIC1EQ0tfQ1VSU0VTICAtRE5PUkVESVJFQ1QgLUROT0dGVElNRVIgXAorCS1EVVNFX01FTUNQWSAtRE5PVU5JQ09ERSAkKEtGTEFHUykgLURvcGVuaT14b3BlbmkiIFwKKwkiTE5LRkxBR1MgPSAtaSAtcyIgIkNDID0gc2hjYyIgIkNDMiA9IHNoY2MiICJMSUJTID0gLWxjdXJzZXMiCisKKyNBVCZUIDczMDAvVU5JWCBQQyAoM0IxKSBzeXN0ZW1zLCBhcyBhYm92ZSwgbm8gY3Vyc2VzLCBidXQgdXNlIGdjYy4KK3N5czN1cGNnOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFUJlQgNzMwMCBVTklYIFBDLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFUVDczMDAgLUROT1JFRElSRUNUIC1EVVNFX01FTUNQWSAtRE5PVU5JQ09ERSAtRE5PTEVBUk4gXAorCS1ETk9TWVNMT0cgLUROT1NZTUxJTksgLUROT0dFVFVTRVJTSEVMTCAtRE5PSU5JVEdST1VQUyAtRE5PRlRSVU5DQVRFIFwKKwktRE5PR0ZUSU1FUiAtRE5PTUtESVIgLUROT1JFQUxQQVRIICQoS0ZMQUdTKSAtRG9wZW5pPXhvcGVuaSIgXAorCSJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgIkxOS0ZMQUdTID0gLXMgLXNobGliIgorCisjQVQmVCA3MzAwL1VOSVggUEMgKDNCMSkgc3lzdGVtcywgY3Vyc2VzIGFuZCBnY2MuCisjT3B0aW1pemF0aW9uIG9taXR0ZWQgLS0gYWRkIGl0IGJhY2sgaW4gaWYgeW91ciBtYWNoaW5lIGhhcyBsb3RzIG9mIG1lbW9yeS4KK3N5czN1cGNnYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIDczMDAgVU5JWCBQQywgY3Vyc2VzLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFUVDczMDAgLUROT1JFRElSRUNUIC1EVVNFX01FTUNQWSAtRE5PR0ZUSU1FUiAtRE5PVU5JQ09ERSBcCisJLUROT1NZU0xPRyAtRE5PU1lNTElOSyAtRE5PR0VUVVNFUlNIRUxMIC1ETk9JTklUR1JPVVBTIC1ETk9GVFJVTkNBVEUgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtRE5PTUtESVIgLUROT1JFQUxQQVRIIC1ETk9MRUFSTiAkKEtGTEFHUykiIFwKKwkiQ0MgPSBnY2MiICJDQzIgPSBnY2MiICJMSUJTID0gLWxjdXJzZXMiICJMTktGTEFHUyA9IC1zIgorCisjQVQmVCA3MzAwL1VOSVggUEMgKDNCMSkgc3lzdGVtcywgc3BlY2lhbCBoYW5kbGluZyBmb3IgaW50ZXJuYWwgbW9kZW0uCisjTm8gRlVMTFNDUkVFTiBmaWxlIHRyYW5zZmVyIGRpc3BsYXkgKGN1cnNlcykuCitzeXMzdXBjb2xkOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFUJlQgNzMwMCBVTklYIFBDLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFUVDczMDAgLUROT01LRElSIC1EVVNFX01FTUNQWSAtRE5PVU5JQ09ERSAtRE5PTEVBUk4gXAorCS1ETk9TWVNMT0cgLUROT1NZTUxJTksgLUROT0dFVFVTRVJTSEVMTCAtRE5PSU5JVEdST1VQUyAtRE5PRlRSVU5DQVRFIFwKKwktRE5PR0ZUSU1FUiAtRE5PUkVESVJFQ1QgLUROT1JFQUxQQVRIICQoS0ZMQUdTKSAtTyIgIkxOS0ZMQUdTID0gLWkiCisKKyNBcyBhYm92ZSwgYnV0IHdpdGggZ2NjLiBtaW5pbnVtIGZlYXR1cmVzIC0gZml0cyBvbiBhIDQwMEsgVU5JWCBQQyBmbG9wcHkKKyNhZnRlciBjb21wcmVzc2lvbiB3aXRoIHJvb20gdG8gc3BhcmU7IGFkZCAtRE5PU0hPVyBvciBvdGhlciAtRE5PeHh4eCBpdGVtcworI3RvIHJlZHVjZSBzaXplIGV2ZW4gZnVydGhlci4KK3N5czN1cGNnbToKKwlAZWNobyBNaW5pbXVtIGludGVyYWN0aXZlCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzeXMzdXBjZyBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1ETk9TUEwgLUROT0ZSSUxMUyAtRE5PSEVMUCAtRE5PREVCVUcgLUROT1RMT0cgLUROT0NTRVRTIFwKKwktRE5PU0VUS0VZICQoS0ZMQUdTKSIKKworI1RoaXMgdGFyZ2V0IGlzIGRlc2lnbmVkIHRvIGNyZWF0ZSBhIHZlcnNpb24gd2l0aCB0aGUgbW9zdCBmZWF0dXJlcyBwb3NzaWJsZQorI3RoYXQsIGFmdGVyIGNvbXByZXNzaW9uLCBzdGlsbCBmaXRzIG9uIGEgNDAwSyBVTklYIFBDIGZsb3BweS4KK3N5czN1cGNnZmQ6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQVQmVCA3MzAwIFVOSVggUEMgZmxvcHB5Li4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFUVDczMDAgLUROT1JFRElSRUNUIC1EVVNFX01FTUNQWSAtRE5PU1BMIC1ETk9MRUFSTiBcCisJLUROT1NZU0xPRyAtRE5PU1lNTElOSyAtRE5PR0VUVVNFUlNIRUxMIC1ETk9JTklUR1JPVVBTIC1ETk9GVFJVTkNBVEUgXAorCS1ETk9HRlRJTUVSIC1ETk9SRUFMUEFUSCAtRG9wZW5pPXhvcGVuaSBcCisJLUROT0hFTFAgLUROT0RFQlVHIC1ETk9UTE9HIC1ETk9DU0VUUyAtRE5PU0VUS0VZIC1ETk9NS0RJUiAkKEtGTEFHUykiIFwKKwkiQ0MgPSBnY2MiICJDQzIgPSBnY2MiICJMTktGTEFHUyA9IC1zIgorCisjQVQmVCA2MzAwIFBMVVMgKHdhcm5pbmcsIC1PIG1pZ2h0IG1ha2UgaXQgcnVuIG91dCBvZiBzcGFjZSkuCisjTk9URTogUmVtb3ZlIC1ESERCVVVDUCBpZiBub3QgdXNpbmcgSG9uZXkgRGFuQmVyIFVVQ1AuCithdHQ2MzAwOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFUJlQgNjMwMCBQTFVTLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFUVDYzMDAgLURIREJVVUNQIC1ETk9GSUxFSCAtRE5PUkVBTFBBVEggLUROT0xFQVJOIFwKKwktRE5PU1lTTE9HIC1ETk9TWU1MSU5LIC1ETk9HRVRVU0VSU0hFTEwgLUROT0lOSVRHUk9VUFMgLUROT0ZUUlVOQ0FURSBcCisJLUROT1VOSUNPREUgJChLRkxBR1MpIC1PIC1NbCAtaSIgIkxOS0ZMQUdTID0gLWkgLU1sIgorCisjQXMgYWJvdmUsIGJ1dCB3aXRoIGN1cnNlcyBzdXBwb3J0LiAgRGVidWdnaW5nIGRpc2FibGVkIHRvIHByZXZlbnQgdGhyYXNoaW5nLgorYXR0NjMwMGM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQVQmVCA2MzAwIFBMVVMuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EQVRUNjMwMCAtREhEQlVVQ1AgLUROT0ZJTEVIIC1ETk9DU0VUUyAtRE5PUkVBTFBBVEggXAorCS1ETk9TWVNMT0cgLUROT1NZTUxJTksgLUROT0dFVFVTRVJTSEVMTCAtRE5PSU5JVEdST1VQUyAtRE5PRlRSVU5DQVRFIFwKKwktRENLX0NVUlNFUyAtRE5PREVCVUcgLUROT1VOSUNPREUgLUROT0xFQVJOICQoS0ZMQUdTKSAtTyAtTWwgLWkiIFwKKwkiTE5LRkxBR1MgPSAtaSAtTWwiICJMSUJTID0gLWxjdXJzZXMiCisKKyNBVCZUIDYzMDAgUExVUyB3aXRoIG5vIGN1cnNlcywgbm8gZGVidWdnaW5nIChhYm91dCAzNEsgc21hbGxlcikKKyMgLU9wdGltaXphdGlvbiBzYXZlcyBhYm91dCAyMEsgdG9vLgorYXR0NjMwMG5kOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFUJlQgNjMwMCBQTFVTLCBubyBkZWJ1Z2dpbmcuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EQVRUNjMwMCAtREhEQlVVQ1AgLUROT0RFQlVHIC1ETk9GSUxFSCAtRE5PUkVBTFBBVEggXAorCS1ETk9TWVNMT0cgLUROT1NZTUxJTksgLUROT0dFVFVTRVJTSEVMTCAtRE5PSU5JVEdST1VQUyAtRE5PRlRSVU5DQVRFIFwKKwktRE5PVU5JQ09ERSAtRE5PTEVBUk4gJChLRkxBR1MpIC1PIC1pIC1NbCIgIkxOS0ZMQUdTID0gLWkgLU1sIgorCisjQVQmVCAzQjIgYW5kIG1heWJlIDNCMjAtc2VyaWVzIGNvbXB1dGVycyBydW5uaW5nIEFUJlQgVU5JWCBTeXN0ZW0gViBSMy4KKyNUaGlzIG9uZSB3YXMgYWN0dWFsbHkgdXNlZCB0byBidWlsZCBDLUtlcm1pdCA3LjAgc3VjY2Vzc2Z1bGx5IG9uIGEgM0IyLzMwMC4KK2F0dDNiMjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIDNCMicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLURBVFRTViAtRE5PUkVESVJFQ1QgLURVU0VfTUVNQ1BZIFwKKwktRE5PVElNRVZBTCAtRE5PVElNRVpPTkUgLURNSU5JRElBTCAtRE5PQ0hBTk5FTElPIC1ETk9CSUdCVUYgXAorCS1ETk9TWVNMT0cgLUROT1NZTUxJTksgLUROT0dFVFVTRVJTSEVMTCAtRE5PSU5JVEdST1VQUyAtRE5PRlRSVU5DQVRFIFwKKwktRE5PR0ZUSU1FUiAtRE5PUkVBTFBBVEggLURvcGVuaT14b3BlbmkgLUROT0ZSSUxMUyAtRE5PTEVBUk4gXAorCS1ETk9IRUxQIC1ETk9ERUJVRyAtRE5PVExPRyAtRE5PQ1NFVFMgLUROT1NFVEtFWSAtRE5PTUtESVIgJChLRkxBR1MpIiBcCisJIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiAiTE5LRkxBR1MgPSAtcyIKKworIyBUaGUgbmV4dCB0d28gYXJlIGxpa2VseSBub3QgdG8gd29yayBhcy1pcy4KKworI0FUJlQgM0IyLCAzQjIwLXNlcmllcyBjb21wdXRlcnMgcnVubmluZyBBVCZUIFVOSVggU3lzdGVtIFYuCisjVGhpcyBpcyBqdXN0IGdlbmVyaWMgU3lzdGVtIFYgd2l0aCBIb25leSBEYW5CZXIgVVVDUCwgc28gcmVmZXIgdG8gc3lzM2hkYi4KKyNSZW1vdmUgLUROT05BV1MgaWYgeW91IGNhbiBnZXQgYXdheSB3aXRoIGl0LgorYXR0M2J4OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc3lzM2hkYiBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPSQoS0ZMQUdTKSAtRE5PTkFXUyAtRE5PVElNRVZBTCIKKworIyAzQnggd2l0aCBjaGFyc2V0cyAoZXhjZXB0IFVuaWNvZGUpIGJ1dCBubyBjdXJzZXMuCithdHQzYngxOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFUJlQgM0IyIG9yIDNCMjAnCisJQGVjaG8gJ3dpdGggSG9uZXkgRGFuQmVyIFVVQ1AgIG5vIGN1cnNlcy4uLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLURBVFRTViAtREhEQlVVQ1AgJChLRkxBR1MpIC1ETk9SRURJUkVDVCBcCisJLUROT1RJTUVWQUwgLUROT1RJTUVaT05FIC1ETUlOSURJQUwgLUROT0NIQU5ORUxJTyAtRE5PQklHQlVGIFwKKwktRE5PSEVMUCAtRE5PREVCVUcgLUROT0dGVElNRVIgLUROT0xFQVJOIFwKKwktRE5PU1lTTE9HIC1ETk9TWU1MSU5LIC1ETk9HRVRVU0VSU0hFTEwgLUROT0lOSVRHUk9VUFMgLUROT0ZUUlVOQ0FURSBcCisJLUROT1JFQUxQQVRIIC1ETk9VTklDT0RFIC1pIiBcCisJIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiAiTE5LRkxBR1MgPSAtaSAtcyIKKworI0FUJlQgM0IyLCAzQjIwLXNlcmllcyBjb21wdXRlcnMgcnVubmluZyBBVCZUIFVOSVggU3lzdGVtIFYsCisjd2l0aCBmdWxsc2NyZWVuIGZpbGUgdHJhbnNmZXIgZGlzcGxheS4KK2F0dDNieGM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQVQmVCAzQjIgb3IgM0IyMCcKKwlAZWNobyAnd2l0aCBIb25leSBEYW5CZXIgVVVDUCBhbmQgY3Vyc2VzLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFUVFNWIC1ESERCVVVDUCAtRE5PTkFXUyAtRE5PVElNRVZBTCAkKEtGTEFHUykgXAorCS1ETk9TWVNMT0cgLUROT1NZTUxJTksgLUROT0dFVFVTRVJTSEVMTCAtRE5PSU5JVEdST1VQUyAtRE5PRlRSVU5DQVRFIFwKKwktRE5PUkVBTFBBVEggLURDS19DVVJTRVMgLURDS19ORVdURVJNIC1ETk9VTklDT0RFIC1ETk9MRUFSTiAtaSAtTyIgXAorCSJMTktGTEFHUyA9IC1pIiAiTElCUz0tbGN1cnNlcyIKKworIzNieCB3aXRoIGN1cnNlcyBidXQgbm8gY2hhcnNldHMKK2F0dDNieGMzOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFUJlQgM0IyIG9yIDNCMjAnCisJQGVjaG8gJ3dpdGggSG9uZXkgRGFuQmVyIFVVQ1Agd2l0aCBjdXJzZXMuLi4gIG5vIENTRVRTJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFUVFNWIC1ESERCVVVDUCAkKEtGTEFHUykgLUROT1JFRElSRUNUIFwKKwktRE5PVElNRVZBTCAtRE5PVElNRVpPTkUgLURNSU5JRElBTCAtRE5PQ0hBTk5FTElPIC1ETk9CSUdCVUYgXAorCS1ETk9IRUxQIC1ETk9ERUJVRyAtRE5PR0ZUSU1FUiAtRE5PTEVBUk4gXAorCS1ETk9TWVNMT0cgLUROT1NZTUxJTksgLUROT0dFVFVTRVJTSEVMTCAtRE5PSU5JVEdST1VQUyAtRE5PRlRSVU5DQVRFIFwKKwktRE5PUkVBTFBBVEggLUROT0NTRVRTIC1EQ0tfQ1VSU0VTIC1EQ0tfTkVXVEVSTSAtaSIgXAorCSJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgIkxOS0ZMQUdTID0gLWkgLXMiICJMSUJTID0gLWxjdXJzZXMiCisKKyNBbnkgU3lzdGVtIFYgUjIgb3IgZWFybGllciB3aXRoIEhvbmV5IERhbkJlciBVVUNQIChzYW1lIGFzIGFib3ZlKQorc3lzM2hkYjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBVCZUIFVOSVggU3lzdGVtIElJSScKKwlAZWNobyAnb3IgU3lzdGVtIFYgUjIgb3IgZWFybGllciB3aXRoIEhvbmV5IERhbkJlciBVVUNQLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFUVFNWIC1ESERCVVVDUCAtRE5PUkVBTFBBVEggLUROT1VOSUNPREUgLUROT0xFQVJOIFwKKwktRE5PU1lTTE9HIC1ETk9TWU1MSU5LIC1ETk9HRVRVU0VSU0hFTEwgLUROT0lOSVRHUk9VUFMgLUROT0ZUUlVOQ0FURSBcCisJJChLRkxBR1MpIC1pIC1PIiAiTE5LRkxBR1MgPSAtaSIKKworI1NwZXJyeS9VTklTWVMgNTAwMCBVVFMgViA1LjIgKFN5c3RlbSBWIFIyKSwgSG9uZXkgRGFuQmVyIFVVQ1AKK3VuaXN5czVyMjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTcGVycnkvVU5JU1lTIDUwMDAgVVRTIFYgNS4yLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFUVFNWIC1EVU5JU1lTNTIgLURIREJVVUNQIC1ETk9SRUFMUEFUSCAtRE5PVU5JQ09ERSBcCisJLUROT1NZU0xPRyAtRE5PU1lNTElOSyAtRE5PR0VUVVNFUlNIRUxMIC1ETk9JTklUR1JPVVBTIC1ETk9GVFJVTkNBVEUgXAorCS1ETk9MRUFSTiAkKEtGTEFHUykgLWkgLU8iICJMTktGTEFHUyA9IC1pIgorCisjSW4gY2FzZSB0aGV5IHNheSAibWFrZSBzeXM1aGRiIiBpbnN0ZWFkIG9mICJtYWtlIHN5czNoZGIiLi4uCitzeXM1aGRiOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc3lzM2hkYgorCisjQ3JlYXRlIHRoZSBjb21tb24gaGVhZGVyIGxpbmUgZm9yIGFsbCBocHV4WzUtMTBdKiBlbnRyaWVzLiBUaGlzIGV4dHJhIGVudHJ5IGlzCisjaGVyZSBiZWNhdXNlIG91ciBoZWFkZXIgbWVzc2FnZSBsZW5ndGggbWF5IGRpZmZlciBmb3IgZWFjaCBDLUtlcm1pdCB2ZXJzaW9uLgorI0Rvbid0IHVzZSAnZm9sZCAtcycgZm9yIEhQLVVYIDUueCAtIDcueCEgVGhpcyBvcHRpb24gaXMgdGhlcmUgb25seSBzaW5jZQorI0hQLVVYIDguMCEKK2hwdXgtaGVhZGVyOgorCUBIUFVYPWB1bmFtZSAtciB8IHNlZCAtZSAncy9eW14xLTldKi8vJyAtZSAncy9cLjAwJCQvLjAvJ2AgOyBcCisJWyAiJChNRVNTQUdFMCkiIF0gJiYgTUVTU0FHRTE9IiQoTUVTU0FHRTApIiA7IFwKKwlNZXNzYWdlMD0nTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBIUDkwMDAgSFAtVVgnIDsgXAorCU1lc3NhZ2UxPSQke01FU1NBR0UxOj0nd2l0aG91dCBhbnkgZXh0cmEgY29tcGlsZXIgb3B0aW1pemF0aW9uJ30gOyBcCisJTWVzc2FnZUg9IiQkTWVzc2FnZTAgJCRIUFVYIiA7IFwKKwljYXNlICQkSFBVWCBpbiBcCisJICBbNTY3XS4qKSBlY2hvICIkJE1lc3NhZ2VIXG4kJE1lc3NhZ2UxIiA7OyBcCisJICAgICAgKi4qKSBlY2hvICIkJE1lc3NhZ2VIICQke01lc3NhZ2UxfSQoTUVTU0FHRTFBKSIgfCBmb2xkIC1zIDs7IFwKKwllc2FjIHwgc2VkIC1lICdzL14gLy8nIC1lICdzLyAqJCQvLycKKworIyBQZXRlciBFJ3MgdXBkYXRlZCBIUC1VWCA1Lnh4IGVudHJpZXMgT2N0IDIwMDEuCisKKyNIUC05MDAwIDUwMCBIUC1VWCA1Lnh4LCBubyBUQ1AvSVAuCitocHV4MDUwMDoKKwlATUVTU0FHRTA9Im5vIFRDUC9JUCBhbmQgbm8gY29tcGlsZXIgb3B0aW1pemF0aW9uIjtcCisJTUVTU0FHRTA9JCR7TUVTU0FHRTE6LSQkTUVTU0FHRTB9IFwKKwkkKE1BS0UpIGhwdXgtaGVhZGVyCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1ESFBVWCAtREhQVVg1IC1ESFBVWFBSRTY1IC1ETk9SRURJUkVDVCAtRERDTEdFVENXRCBcCisJLUROT0dFVFVTRVJTSEVMTCAtRE5PR0ZUSU1FUiAtRE5PU1lTTE9HIC1ETk9UT01BQ1JPUyAtRE5PTFNUQVQgXAorCS1ETk9TWU1MSU5LIC1ETk9JTklUR1JPVVBTIC1ETk9VTklDT0RFIC1ETk9MRUFSTiAkKEtGTEFHUykiIFwKKwkiTElCUyA9ICQoTElCUykiICJMTktGTEFHUyA9ICIKKworI0hQLTkwMDAgNTAwIEhQLVVYIDUuMjEgd2l0aCBXb2xsb25nb25nIFdJTi9UQ1AgMS4yIFRDUC9JUC4KKyNSZXF1aXJlcyAvdXNyL3dpbnMvdXNyL2luY2x1ZGUgYW5kIC91c3IvbGliL2xpYm5ldC5hIGZyb20gV29sbG9uZ29uZy4KKyNPcHRpbWl6YXRpb24gc2tpcHBlZCAtIHRha2VzIGZvcmV2ZXIuCVJlYWxseS4KKyMgV0FSTklORzogdGhpcyBkb2Vzbid0IHdvcmsgaWYgYSBmaWxlIGNhbGxlZCAiaHB1eDA1MDAiIGlzIG9uIHRoZSBkaXNrLgoraHB1eDA1MDB3aW50Y3A6CisJQE1FU1NBR0UxPSJ3aXRoIFdJTi9UQ1AgYnV0IHdpdGhvdXQgYW55IGV4dHJhIGNvbXBpbGVyIG9wdGltaXphdGlvbiIgXAorCSQoTUFLRSkgaHB1eDA1MDAgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUyA9IC1EVENQU09DS0VUIC1ESFBVWDVXSU5UQ1AgLURJTkFERFJYIC1ETk9fRE5TX1NSViAtRE5PTUhIT1NUIFwKKwktRE5PSEFERFJMSVNUIC1JL3Vzci93aW5zL3Vzci9pbmNsdWRlICQoS0ZMQUdTKSIgXAorCSJMSUJTID0gL3Vzci9saWIvbGlibmV0LmEiCisKKyNIUC1VWCA2LjUsIHNob3J0IGZpbGVuYW1lcywgbm8gbmV0d29yayBhbmQgbm8gY3Vyc2VzIHN1cHBvcnQuCisjY2tjcHJvLCBja3V1c3IsIGNrdXVzMyBhbmQgb3RoZXJzIGFyZSBicm9rZW4gb3V0IGJlY2F1c2UgdGhleSBtYWtlIHRoZQorI29wdGltaXplciBydW4gYXdheS4gIE5vdGUgdGhhdCB4ZXJtaXQgdGFyZ2V0IGRvZXMgbm90IHdvcmsgd2l0aCB0aGlzIG9uZSEKKyNJZiB5b3UgZ2V0IGNvbXBpbGVyIHdhcm5pbmdzIGxpa2UgJ1N3aXRjaCB0YWJsZSBvdmVyZmxvdycgaW5jcmVhc2UgdGhlICcuLi4nCisjdmFsdWUgaW4gJy1XYywtTncuLi4nIQoraHB1eDA2NTA6CisJQCQoTUFLRSkgaHB1eC1oZWFkZXIKKwlAZWNobyAnc3VwcG9ydGluZzogTk8gbG9uZyBmaWxlbmFtZXMsIE5PIG5ldHdvcmske01FU1NBR0UyfS4nCisKKwkkKE1BS0UpIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCQlja3V1c3IuJChFWFQpIGNrdXVzMy4kKEVYVCkgY2t1dXM0LiQoRVhUKSBja3V1czUuJChFWFQpIFwKKwkgICAgICAgIGNrdXVzNi4kKEVYVCkgY2t1eGxhLiQoRVhUKSBja2Nwcm8uJChFWFQpIFwKKwkiQ0ZMQUdTID0gLURIUFVYIC1ESFBVWDYgLURTSUdfViAtRE5PU1lTTE9HIC1ETk9TRUxFQ1QgLURGTkZMT0FUIFwKKwktRERDTEdFVENXRCAtRE5PR0VUVVNFUlNIRUxMIC1ETk9fRE5TX1NSViAtRE5PTEVBUk4gJChLRkxBR1MpIFwKKwktV2MsLU53MjYwIgorCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1ESFBVWCAtREhQVVg2IC1EU0lHX1YgLUROT1NZU0xPRyAtRE5PU0VMRUNUIC1ERk5GTE9BVCBcCisJLUREQ0xHRVRDV0QgLUROT0dFVFVTRVJTSEVMTCAtRE5PX0ROU19TUlYgLUROT0xFQVJOICQoS0ZMQUdTKSBcCisJLVdjLC1OdzI2MCAkKE9GTEFHUykiICJMTktGTEFHUyA9IC1zIiAiTElCUyA9IC1sbSAkKExJQlMpIgorCisjRXhhY3RseSBhcyBhYm92ZSwgcGx1cyBjdXJzZXM6CitocHV4MDY1MGM6CisJQE1FU1NBR0UyPSIsIGJ1dCB3aXRoIGN1cnNlcyIgXAorCSQoTUFLRSkgaHB1eDA2NTAgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0gLURDS19DVVJTRVMgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sY3Vyc2VzIgorCisjRXhhY3RseSBhcyBhYm92ZSwgcGx1cyBjdXJzZXMgKyBuZXR3b3JrOgorIyhkb2Vzbid0IHdvcmsgLS0gSFAtVVggNiBsYWNrcyB0aGUgRkRfU0VUIG1hY3JvcyAtLSB0aGlzIGNhbiBiZSBhZGRyZXNzZWQKKworaHB1eDA2NTB0Y3BjOgorCUBNRVNTQUdFMj0iLCBidXQgd2l0aCBjdXJzZXMgYW5kIHdpdGggdGNwL2lwIiBcCisJJChNQUtFKSBocHV4MDY1MCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPSAtRENLX0NVUlNFUyAtRFRDUFNPQ0tFVCAtRE5PSEFERFJMSVNUICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbGN1cnNlcyIKKworI0V4YWN0bHkgYXMgaHB1eDA2NTAgYnV0IHdpdGggY29tcGlsZXIgb3B0aW1pemF0aW9uOgoraHB1eDA2NTBvOgorCUBNRVNTQUdFMT0id2l0aCBjb21waWxlciBvcHRpbWl6YXRpb24iIFwKKwkkKE1BS0UpIGhwdXgwNjUwIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9ICQoS0ZMQUdTKSIgIk9GTEFHUyA9IC1PIgorCisjRXhhY3RseSBhcyBocHV4MDY1MGMgYnV0IHdpdGggY29tcGlsZXIgb3B0aW1pemF0aW9uOgoraHB1eDA2NTBvYzoKKwlATUVTU0FHRTE9IndpdGggY29tcGlsZXIgb3B0aW1pemF0aW9uIiBcCisJJChNQUtFKSBocHV4MDY1MGMgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0gJChLRkxBR1MpIiAiT0ZMQUdTID0gLU8iCisKKyNUYWtlIHRoaXMgYXMgc3RhcnR1cCBlbnRyeSBmb3IgYWxsICdub25lIG9wdGltaXplZCcgZmlsZXMgdW5kZXIgSFAtVVggNy54IQorI01ha2Ugc3VyZSB3ZSBkb2Vzbid0IGNhbGwgaXQgd2l0aCB0aGUgJy1PJyBvcHRpb24gYmVjYXVzZSB0aGlzIHdpbGwgYmxvdyB1cAorI3RoZSBjb21waWxlciEKK2hwdXgwNzAwbm9vcHQ6CisJQGNhc2UgIiQoQ0ZMQUdTKSIgaW4gXAorCSotTyopIGVjaG8gIkRvbid0IHVzZSBDRkxBR1M9IC1PIGhlcmUhIiA7OyBcCisJICAgKikgJChNQUtFKSBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkgICAgICBja3V1c3IuJChFWFQpIGNrdXVzMy4kKEVYVCkgY2t1dXM0LiQoRVhUKSBja3V1czUuJChFWFQpIFwKKwkgICAgICBja3V1czYuJChFWFQpIGNrdXVzNy4kKEVYVCkgY2t1eGxhLiQoRVhUKSBcCisJICAgICAgY2tjdW5pLiQoRVhUKSBja2NmdHAuJChFWFQpIGNrY3Byby4kKEVYVCkgXAorCSAgICAgIDs7IFwKKwllc2FjCisKKyNIUC1VWCA3LjAsIG5vIGxvbmcgZmlsZW5hbWVzLCBubyBuZXR3b3JrIHN1cHBvcnQsIG5vIGN1cnNlcy4KKyNJZiB5b3UgZ2V0IGNvbXBpbGVyIHdhcm5pbmdzIGxpa2UgJ1N3aXRjaCB0YWJsZSBvdmVyZmxvdycgaW5jcmVhc2UgdGhlICcuLi4nCisjdmFsdWUgaW4gJy1XYywtTncuLi4nIQoraHB1eDA3MDBzZjoKKwlAJChNQUtFKSBocHV4LWhlYWRlcgorCUBlY2hvICdzdXBwb3J0aW5nOiBOTyBsb25nIGZpbGVuYW1lcywgTk8gbmV0d29yaywgTk8gY3Vyc2VzLicKKwkkKE1BS0UpIGhwdXgwNzAwbm9vcHQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1ESFBVWCAtREhQVVg3IC1EU0lHX1YgLUROT0dFVFVTRVJTSEVMTCAtREZORkxPQVQgXAorCS1ETk9fRE5TX1NSViAkKEtGTEFHUykgLVdjLC1OdzI2MCIKKworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREhQVVggLURIUFVYNyAtRFNJR19WIC1ETk9HRVRVU0VSU0hFTEwgLURGTkZMT0FUIFwKKwktRE5PX0ROU19TUlYgJChLRkxBR1MpIC1XYywtTncyNjAgJChPRkxBR1MpIiBcCisJIkxOS0ZMQUdTID0gLXMiICJMSUJTID0gLWxtICQoTElCUykiCisKKyNFeGFjdGx5IGFzIGhwdXgwNzAwc2YgYnV0IHdpdGggY29tcGlsZXIgb3B0aW1pemF0aW9uOgoraHB1eDA3MDBvc2Y6CisJQE1FU1NBR0UxPSJ3aXRoIGNvbXBpbGVyIG9wdGltaXphdGlvbiIgXAorCSQoTUFLRSkgaHB1eDA3MDBzZiBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPSAkKEtGTEFHUykiICJPRkxBR1MgPSAtTyIKKworI0hQLVVYIDcuMCwgc2hvcnQgZmlsZW5hbWVzLCBidXQgd2l0aCB0Y3AvaXAgYW5kIGN1cnNlcy4KKyNUbyB1c2UgdGhpcywgeW91IG11c3QgaGF2ZSBib3VnaHQgdGhlIEFSUEEgU2VydmljZXMgUHJvZHVjdCBmcm9tIEhQLCBhbmQgeW91CisjbXVzdCBoYXZlIC91c3IvbGliL2xpYkJTRC5hLgoraHB1eDA3MDBzZnRjcGM6CisJQCQoTUFLRSkgaHB1eC1oZWFkZXIKKwlAZWNobyAnc3VwcG9ydGluZzogTk8gbG9uZyBmaWxlbmFtZXMsIFxjJworCUBlY2hvICdidXQgd2l0aCBuZXR3b3JraW5nLCBjdXJzZXMsIEhEQiB1dWNwLi4uJworCSQoTUFLRSkgaHB1eDA3MDBub29wdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gIC1ESFBVWERFQlVHIC1ESFBVWCAtREhQVVg3IC1EVENQU09DS0VUIC1EU0lHX1YgXAorCS1EQ0tfUkVESVIgLURDS19SVFNDVFMgLURDS19DVVJTRVMgLUROT0dFVFVTRVJTSEVMTCAtREZORkxPQVQgXAorCS1ETk9fRE5TX1NSViAtREhEQlVVQ1AgLURMT0NLX0RJUj1cXFwiL3Vzci9zcG9vbC91dWNwXFxcIiAkKEtGTEFHUykgXAorCS1XYywtTncyNjAiCisKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gIC1ESFBVWERFQlVHIC1ESFBVWCAtREhQVVg3IC1EVENQU09DS0VUIC1EU0lHX1YgXAorCS1EQ0tfUkVESVIgLURDS19SVFNDVFMgLURDS19DVVJTRVMgLUROT0dFVFVTRVJTSEVMTCAtREZORkxPQVQgXAorCS1ETk9fRE5TX1NSViAtREhEQlVVQ1AgIC1ETE9DS19ESVI9XFxcIi91c3Ivc3Bvb2wvdXVjcFxcXCIgJChLRkxBR1MpIFwKKwktV2MsLU53MjYwICQoT0ZMQUdTKSIgIkxOS0ZMQUdTID0gLXMiICJMSUJTPSAtbG0gLWxCU0QgLWxjdXJzZXMiCisKKyNFeGFjdGx5IGFzIGFib3ZlIGJ1dCB3aXRoIGNvbXBpbGVyIG9wdGltaXphdGlvbjoKK2hwdXgwNzAwb3NmdGNwYzoKKwlATUVTU0FHRTE9IndpdGggY29tcGlsZXIgb3B0aW1pemF0aW9uIiBcCisJJChNQUtFKSBocHV4MDcwMHNmdGNwYyBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPSAkKEtGTEFHUykiICJPRkxBR1MgPSAtTyIKKworI0hQIDkwMDAgc2VyaWVzIDMwMC84MDAgSFAtVVggNy4wLCBsb25nIGZpbGVuYW1lcywgbmV0d29yayBzdXBwb3J0LCBIREIgdXVjcCwKKyNidXQgTk8gY3Vyc2VzLiBTZWUgY29tbWVudHMgaW4gaHB1eDA3MDBzZnRjcGMgYWJvdXQgVENQL0lQIHN1cHBvcnQuCitocHV4MDcwMGxmbjoKKwlAJChNQUtFKSBocHV4LWhlYWRlcgorCUBlY2hvICdzdXBwb3J0aW5nOiBsb25nIGZpbGVuYW1lcywgbmV0d29ya2luZywgSERCIHV1Y3AkKE1FU1NBR0UyKS4uLicKKwkkKE1BS0UpIGhwdXgwNzAwbm9vcHQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9ICAtREhQVVhERUJVRyAtREhQVVggLURIUFVYNyAtRFRDUFNPQ0tFVCAtRFNJR19WIC1ERk5GTE9BVCBcCisJLUROT0dFVFVTRVJTSEVMTCAtRE5PU0VUQlVGIC1EQ0tfUkVESVIgLURDS19SVFNDVFMgLURMT05HRk4gXAorCS1ETk9fRE5TX1NSViAtRERJUkVOVCAtREhEQlVVQ1AgLURMT0NLX0RJUj1cXFwiL3Vzci9zcG9vbC91dWNwXFxcIiBcCisJJChLRkxBR1MpIC1XYywtTncyNjAiCisKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gIC1ESFBVWERFQlVHIC1ESFBVWCAtREhQVVg3IC1EVENQU09DS0VUIC1EU0lHX1YgLURGTkZMT0FUIFwKKwktRE5PR0VUVVNFUlNIRUxMIC1ETk9TRVRCVUYgLURDS19SRURJUiAtRENLX1JUU0NUUyAtRExPTkdGTiBcCisJLUROT19ETlNfU1JWIC1ERElSRU5UIC1ESERCVVVDUCAtRExPQ0tfRElSPVxcXCIvdXNyL3Nwb29sL3V1Y3BcXFwiIFwKKwkkKEtGTEFHUykgLVdjLC1OdzI2MCBcCisJJChPRkxBR1MpIiAiTE5LRkxBR1MgPSAtcyIgIkxJQlMgPSAtbG0gLWxCU0QgJChMSUJTKSIKKworI0V4YWN0bHkgYXMgYWJvdmUgKyBjdXJzZXMuCitocHV4MDcwMGxmbmM6CisJQE1FU1NBR0UyPScsIGN1cnNlcycgXAorCSQoTUFLRSkgaHB1eDA3MDBsZm4gS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0gLURDS19DVVJTRVMgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sY3Vyc2VzIgorCisjRXhhY3RseSBhcyBhYm92ZSBocHV4MDcwMGxmbiBidXQgd2l0aCBjb21waWxlciBvcHRpbWl6YXRpb246CitocHV4MDcwMG9sZm46CisJQE1FU1NBR0UxPSJ3aXRoIGNvbXBpbGVyIG9wdGltaXphdGlvbiIgXAorCSQoTUFLRSkgaHB1eDA3MDBsZm4gS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0gJChLRkxBR1MpIiAiT0ZMQUdTID0gLU8iCisKKyNFeGFjdGx5IGFzIGFib3ZlIGhwdXgwNzAwbGZuYyBidXQgd2l0aCBjb21waWxlciBvcHRpbWl6YXRpb246CitocHV4MDcwMG9sZm5jOgorCUBNRVNTQUdFMT0id2l0aCBjb21waWxlciBvcHRpbWl6YXRpb24iIFwKKwkkKE1BS0UpIGhwdXgwNzAwbGZuYyBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPSAkKEtGTEFHUykiICJPRkxBR1MgPSAtTyIKKworI0hQIDkwMDAgU2VyaWVzIDMwMCBvciA0MDAsIEhQLVVYIDguMCwgbG9uZyBmaWxlbmFtZXMgYW5kIFRDUC9JUCBzdXBwb3J0LgorI1RoaXMgb25lIHNob3VsZCBhbHNvIHdvcmsgb24gNzAwLzgwMCwgYnV0IHdpdGhvdXQgUEEtc3BlY2lmaWMgb3B0aW1pemF0aW9uLgorI0luIGNhc2UgLURDS19SVFNDVFMgYW5kIC1EQ0tfUkVESVIgbWFrZSB0cm91YmxlLCByZW1vdmUgdGhlbS4KKyNOT1RFOiBja2Nwcm8uYywgY2t1dXNyLmMgYW5kIGNrdXVzMy5jIGJsb3cgdXAgdGhlIG9wdGltaXplciwgc28gZG9uJ3Qgb3B0aW1pemUKKyN0aGVtLgorI0ZvciBIUC1VWCA4LjAgb24gTW90b3JvbGEgQ1BVcywgeW91IG1pZ2h0IGhhdmUgdG8gcmVpbnN0YWxsIHlvdXIga2VybmVsIHdpdGgKKyNtYXhkc2l6ID49IDB4MDMwMDAwMDAuICBCdXQgaWYgcGh5c2ljYWwgbWVtb3J5IGlzIHNtYWxsLCB0aGF0IHN0aWxsIHdpbGwgbm90CisjaGVscCBtdWNoLgoraHB1eDA4MDA6CisJQCQoTUFLRSkgaHB1eC1oZWFkZXIKKwlATUVTU0FHRTM9JCR7TUVTU0FHRTM6PSdUQ1AvSVAnfTsgXAorCWVjaG8gInN1cHBvcnRpbmc6IGxvbmcgZmlsZW5hbWVzLCAkJE1FU1NBR0UzLCBIREIgVVVDUCQoTUVTU0FHRTIpLi4uIgorCSQoTUFLRSkgLUIgIkNDPSQoQ0MpIiAiQ0MyPSQoQ0MyKSIgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJY2tjcHJvLiQoRVhUKSBja3V1c3IuJChFWFQpIGNrdXVzMy4kKEVYVCkgXAorCSJDRkxBR1MgPSAgLURDS19SRURJUiAtREhQVVhERUJVRyAtREhQVVggLURIUFVYOCAtRFJFTkFNRSAtRFNJR19WIFwKKwktRE5PU0VUQlVGIC1ERElSRU5UIC1EQ0tfUlRTQ1RTIC1EU1RFUk1JT1ggLURMT05HRk4gLURUQ1BTT0NLRVQgXAorCS1ESERCVVVDUCAgLUROT19ETlNfU1JWIC1ETE9DS19ESVI9XFxcIi91c3Ivc3Bvb2wvdXVjcFxcXCIgLURGTkZMT0FUIFwKKwkkKEtGTEFHUykiCisKKwkkKE1BS0UpIC1CICJDQz0kKENDKSIgIkNDMj0kKENDMikiIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gIC1EQ0tfUkVESVIgLURIUFVYREVCVUcgLURIUFVYIC1ESFBVWDggLURSRU5BTUUgLURTSUdfViBcCisJLUROT1NFVEJVRiAtRERJUkVOVCAtRENLX1JUU0NUUyAtRFNURVJNSU9YIC1ETE9OR0ZOIC1EVENQU09DS0VUIFwKKwktREhEQlVVQ1AgIC1ETk9fRE5TX1NSViAtRExPQ0tfRElSPVxcXCIvdXNyL3Nwb29sL3V1Y3BcXFwiIC1ERk5GTE9BVCBcCisJJChLRkxBR1MpICQoT0ZMQUdTKSIgIkxOS0ZMQUdTID0gLXMiICJMSUJTID0gLWxtIC1sQlNEICQoTElCUykiCisKKyNFeGFjdGx5IGFzIGFib3ZlIGhwdXgwODAwICsgY3Vyc2VzLgoraHB1eDA4MDBjOgorCUBNRVNTQUdFMj0nLCBjdXJzZXMnIFwKKwkkKE1BS0UpIGhwdXgwODAwICBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTID0gJChLRkxBR1MpIC1EQ0tfQ1VSU0VTIiAiTElCUyA9IC1sY3Vyc2VzIgorCisjSFAgOTAwMCBIUC1VWCA4LjAsIG5vIFRDUC9JUCBiZWNhdXNlIC91c3IvbGliL2xpYkJTRC5hIGNhbid0IGJlIGZvdW5kLAorI29yIFRDUC9JUCBoZWFkZXIgZmlsZXMgbWlzc2luZy4KK2hwdXgwODAwbm90Y3A6CisJQE1FU1NBR0UzPSdOTyBuZXR3b3JrLCBOTyBjdXJzZXMnIFwKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIGhwdXgwODAwIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1MgPSAkKEtGTEFHUykgLVVUQ1BTT0NLRVQiCisKKyNOb3cgdGhlIHNhbWUgYXMgYWJvdmUgaHB1eDA4MDAgYnV0IHdpdGggY29tcGlsZXIgb3B0aW1pemF0aW9uCitocHV4MDgwMG86CisJQE1FU1NBR0UxPSJ3aXRoIGNvbXBpbGVyIG9wdGltaXphdGlvbiIgXAorCSQoTUFLRSkgaHB1eDA4MDAgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUyA9ICQoS0ZMQUdTKSIgIk9GTEFHUyA9IC1PIgorCisjRXhhY3RseSBhcyBhYm92ZSBocHV4MDgwMCArIGN1cnNlcyBhbmQgd2l0aCBjb21waWxlciBvcHRpbWl6YXRpb24uCitocHV4MDgwMG9jOgorCUBNRVNTQUdFMT0id2l0aCBjb21waWxlciBvcHRpbWl6YXRpb24iIFwKKwkkKE1BS0UpIGhwdXgwODAwYyBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTID0gJChLRkxBR1MpIiAiT0ZMQUdTID0gLU8iICJMSUJTID0gLWxjdXJzZXMiCisKKyNFeGFjdGx5IGFzIGFib3ZlIGhwdXgwODAwbm90Y3AgYnV0IHdpdGggY29tcGlsZXIgb3B0aW1pemF0aW9uCitocHV4MDgwMG9ub3RjcDoKKwlATUVTU0FHRTE9IndpdGggY29tcGlsZXIgb3B0aW1pemF0aW9uIiBcCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBocHV4MDgwMG5vdGNwIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1MgPSAkKEtGTEFHUykiICJPRkxBR1MgPSAtTyIKKworI0hQIDkwMDAgU2VyaWVzIDcwMCBvciA4MDAsIEhQLVVYIDguMCwgbG9uZyBmaWxlbmFtZXMgYW5kIFRDUC9JUCBzdXBwb3J0LgorIyBMaWtlIHRoZSBwcmV2aW91cyBlbnRyaWVzLCBidXQgd2l0aCBQQS1SSVNDLXNwZWNpZmljIG9wdGltaXphdGlvbi4KK2hwdXgwODAwcGE6CisJQE1FU1NBR0UxPSJ3aXRoIFBBLVJJU0Mtc3BlY2lmaWMgb3B0aW1pemF0aW9uIiBcCisJJChNQUtFKSBocHV4MDgwMCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTID0gJChLRkxBR1MpICtPYmIxMTAwIgorCisjQXMgYWJvdmUsIGJ1dCB3aXRoIGN1cnNlcy4KK2hwdXgwODAwcGFjOgorCUBNRVNTQUdFMT0id2l0aCBQQS1SSVNDLXNwZWNpZmljIG9wdGltaXphdGlvbiIgXAorCSQoTUFLRSkgaHB1eDA4MDBjIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1MgPSAkKEtGTEFHUykgK09iYjExMDAiCisKKyNBcyBhYm92ZSwgYnV0IGNvbXBpbGVkIHdpdGggR0NDIDIuMy4zLgoraHB1eDA4MDBwYWdjYzoKKwlATUVTU0FHRTE9J3VzaW5nIHRoZSBnY2MgY29tcGlsZXInIFwKKwkkKE1BS0UpIGhwdXgwODAwIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDQz1nY2MiICJDQzI9Z2NjIiAiS0ZMQUdTPSAtZnVuc2lnbmVkLWNoYXIgJChLRkxBR1MpIgorCisjSFAtVVggOS4wLCA5LjAxLCA5LjAzLCA5LjA0LCA5LjA1LCA5LjA3LCA5LjEwIC4uLiwgKyBUQ1AvSVAgKyBjdXJzZXMsIGZ1bGx5CisjY29uZmlndXJlZC4gIFVzZSB0aGlzIGVudHJ5IHdpdGggdGhlIHJlc3RyaWN0ZWQgY29tcGlsZXI6IG5vIG9wdGltaXphdGlvbiwgbm8KKyNBTlNJIHN1cHBvcnQuICBJZiB5b3UgZ2V0IHVucmVzb2x2ZWQgc29ja2V0cyBsaWJyYXJ5IHJlZmVyZW5jZXMgYXQgbGluayB0aW1lLAorI3RoZW4gdHJ5IGFkZGluZyAtbEJTRCB0byBMSUJTLCBvciBlbHNlIHJlbW92ZSAtRFRDUFNPQ0tFVCB0byBidWlsZCBhIHZlcnNpb24KKyN3aXRob3V0IFRDUC9JUCBzdXBwb3J0LgoraHB1eDA5MDA6CisJQE1FU1NBR0UxQT0nLiBSZWFkIGhwdXgwOTAwIGVudHJ5IGNvbW1lbnRzIGlmIHlvdSBoYXZlIHRyb3VibGUuJyBcCisJJChNQUtFKSBocHV4LWhlYWRlcgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREhQVVhERUJVRyAtREhQVVg5IC1EU1RFUk1JT1ggLURESVJFTlQgLURVVElNRUggXAorCS1ETk9TRVRCVUYgLURDS19DVVJTRVMgLURUQ1BTT0NLRVQgLURSRU5BTUUgLURDS19SRURJUiAtRExPTkdGTiBcCisJLURIREJVVUNQIC1ETE9DS19ESVI9XFxcIi91c3Ivc3Bvb2wvdXVjcFxcXCIgLURGTkZMT0FUICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IC1zIiAiTElCUyA9IC1sbSAtbGN1cnNlcyIgIkNDPSQoQ0MpIiAiQ0MyPSQoQ0MyKSIKKworI0xpa2UgaHB1eDA5MDAsIGJ1dCBmb3IgdGhlICJ2YWx1ZS1hZGRlZCIgY29tcGlsZXIgb24gYWxsIEhQIDkwMDAgbW9kZWxzLgorI0FkZHMgb3B0aW1pemF0aW9uIGFuZCBBTlNJIGNvbXBpbGF0aW9uOgorIyArTzIgbWFrZXMgc21hbGxlciBleGVjdXRhYmxlICg9IC1PID0gTGV2ZWwtMSBhbmQgZ2xvYmFsIG9wdGltaXphdGlvbikKKyMgK08zIGFkZHMgaW50ZXJwcm9jZWR1cmFsIGdsb2JhbCBvcHRpbWl6YXRpb24sIG1ha2VzIGJpZ2dlciBleGVjdXRhYmxlLgorIyBJZiBvcHRpbWl6YXRpb24gZmFpbHMgb24gc29tZSBtb2R1bGVzLCB5b3UgY2FuIGFkZDoKKyMgICtPYmI8bj4sICtPbGltaXQgPG4+LCBvciArT25vbGltaXQsIGRlcGVuZGluZyBvbiB5b3VyIGNjIHZlcnNpb24sCisjIHdoZXJlIDxuPiBpcyBhIG51bWJlciwgZS5nLiArT2JiMTIwMC4gIEluIG90aGVyIHdvcmRzLCBpZiB5b3UgZ2V0IG9wdGltaXplcgorIyB3YXJuaW5ncywgYWRkIChmb3IgZXhhbXBsZSkgK09iYjEyMDA7IGlmIHlvdSBzdGlsbCBnZXQgb3B0aW1pemVyIHdhcm5pbmdzLAorIyBpbmNyZWFzZSB0aGUgbnVtYmVyLiAgUmVwZWF0IHVudGlsIHdhcm5pbmdzIGdvIGF3YXkuICBJZiB5b3VyIGNvbXBpbGVyCisjIHBlcm1pdHMgaXQsIHVzZSArT25vbGltaXQuIElmIG9wdGltaXplciBibG93cyB1cCBvbiBja2Nwcm8uYywgc2VlIG5leHQgZW50cnkuCisjIFJlcG9ydGVkbHksIG9uIHNvbWUgY29uZmlndXJhdGlvbnMsIHN1Y2ggYXMgSFA5MDAwLzQyNWUgb3IgLzM0MCwgcGVyaGFwcworIyBkZXBlbmRpbmcgb24gdGhlIGFtb3VudCBvZiBtYWluIG1lbW9yeSwgdGhpcyBlbnRyeSBtaWdodCBmYWlsIG5vIG1hdHRlciB3aGF0CisjIHlvdSBkbyAoIk91dCBvZiBNZW1vcnkiLCAiY2M6IEZhdGFsIGVycm9yIGluIC9saWIvYy5jMSIsIGV0YykuICBJbiB0aGF0IGNhc2UKKyMgdXNlICJtYWtlIGhwdXgwOTAwIiAobm8gIm8iKS4KK2hwdXgwOTAwbzoKKwlATUVTU0FHRTE9JCR7TUVTU0FHRTE6LSJ3aXRoIGNvbXBpbGVyIG9wdGltaXphdGlvbiJ9IFwKKwkkKE1BS0UpIGhwdXgwOTAwIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1MgPSAkKEtGTEFHUykgLUFhIC1EQ0tfQU5TSUMgLURfSFBVWF9TT1VSQ0UgK08yIgorCisjIEZvciBIUC1VWCA5LjAgb24gTW90b3JvbGEgQ1BVcywgb3B0aW1pemF0aW9uIG9mIGNrY3Byby5jIHRlbmRzIHRvIGJsb3cgdXAKKyMgdGhlIGNvbXBpbGVyLiAgWW91IG1pZ2h0IGhhdmUgdG8gcmVpbnN0YWxsIHlvdXIga2VybmVsIHdpdGggbWF4ZHNpeiA+PQorIyAweDAzMDAwMDAwLiAgQnV0IGlmIHBoeXNpY2FsIG1lbW9yeSBpcyBzbWFsbCwgdGhhdCBzdGlsbCB3aWxsIG5vdCBoZWxwIG11Y2guCisjIEluIHRoYXQgY2FzZSwgdXNlIHRoaXMgZW50cnkgdG8gc2tpcCBvcHRpbWl6YXRpb24gb2YgY2tjcHJvLmMuICBCdXQgZm9yCisjIEMtS2VybWl0IDguMC4yMDggeW91IG5lZWQgYSBrZXJuZWwgd2l0aCBtYXhkc2l6ID49IDB4MDIwMDAwMDAgdG8gY29tcGlsZSBhbgorIyBvcHRpbWl6ZWQgY2tjZnRwLmMuCitocHV4MDkwMG02OGtvOgorCUBNRVNTQUdFMT0nd2l0aG91dCBjb21waWxlciBvcHRpbWl6YXRpb24gZm9yIGNrY3Byby4kKEVYVCkgLi4uJyBcCisJJChNQUtFKSBocHV4LWhlYWRlcgorCSQoTUFLRSkgY2t1dXNyLiQoRVhUKSBja3V1czMuJChFWFQpIGNrY3Byby4kKEVYVCkgXAorCSJDRkxBR1MgPSAtREhQVVhERUJVRyAtREhQVVg5IC1EU1RFUk1JT1ggLURESVJFTlQgXAorCS1ETk9TRVRCVUYgLURDS19DVVJTRVMgLURUQ1BTT0NLRVQgLURSRU5BTUUgIC1EQ0tfUkVESVIgLURMT05HRk4gXAorCS1ESERCVVVDUCAtRExPQ0tfRElSPVxcXCIvdXNyL3Nwb29sL3V1Y3BcXFwiIC1ERk5GTE9BVCAkKEtGTEFHUykiCisJQGVjaG8KKwlATUVTU0FHRTE9IndpdGggY29tcGlsZXIgb3B0aW1pemF0aW9uIGZvciB0aGUgcmVzdCIgXAorCSQoTUFLRSkgaHB1eDA5MDAgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUyA9ICQoS0ZMQUdTKSAtQWEgLURDS19BTlNJQyAtRF9IUFVYX1NPVVJDRSArTzIiCisKKyMgT2xkIG5hbWUgZm9yIGhwdXgwOTAwbTY4a28uCitocHV4MDkwMG1vdDoKKwkkKE1BS0UpIGhwdXgwOTAwbTY4a28gS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiS0ZMQUdTID0gJChLRkxBR1MpIgorCisjTGlrZSBocHV4MDkwMG8gYnV0IHdpdGggYWRkaXRpb25hbCBtb2RlbC03MDAvODAwLXNwZWNpZmljIG9wdGltaXphdGlvbnMuCisjICtFU2xpdCA9IGNvbnNvbGlkYXRlIHN0cmluZ3MgaW4gcmVhZC1vbmx5IG1lbW9yeS4KKyMgK0VTZnNjID0gaW5saW5lIG1pbGxpY29kZSBjYWxscyB3aGVuIGNvbXBhcmluZyBwb2ludGVycy4KK2hwdXgwOTAwbzcwMDoKKwlAZWNobyAnSWYgeW91IGdldCBvcHRpbWl6ZXIgd2FybmluZ3MgXGMnCisJQGVjaG8gJ3RyeSAibWFrZSBocHV4MDkwMG83MDAgS0ZMQUdTPStPYmIxMjAwIicKKwlATUVTU0FHRTE9IndpdGggUEEtUklTQy1zcGVjaWZpYyBvcHRpbWl6YXRpb25zIiBcCisJJChNQUtFKSBocHV4MDkwMG8gS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUyA9ICQoS0ZMQUdTKSArRVNsaXQgK0VTc2ZjIgorCisjSFAtVVggOS4wLCA5LjAxLCA5LjAzLCA5LjA0LCA5LjA1LCA5LjA3LCA5LjEwIC4uLiwgKyBUQ1AvSVAgKyBjdXJzZXMsIGZ1bGx5CisjY29uZmlndXJlZCwgYnVpbHQgd2l0aCBnY2MsIGFsbCBtb2RlbHMgZXhjZXB0IDgwMCBzZXJpZXMuCisjWW91IG1pZ2h0IG5lZWQgdG8gYWRkIHRoZSBpbmNsdWRlIHBhdGggZm9yIGdjYyBoZWFkZXJzLCBmb3IgZXhhbXBsZToKKyMgJ0tGTEFHUz0tSS91c3IvZ251L2xpYi9nY2MtbGliL2hwcGExLjEtaHAtaHB1eC8yLjQuNS9pbmNsdWRlLycKK2hwdXgwOTAwZ2NjOgorCUBNRVNTQUdFMT0ndXNpbmcgdGhlIGdjYyBjb21waWxlcicgXAorCSQoTUFLRSkgaHB1eDA5MDAgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBDQz1nY2MgQ0MyPWdjYyBcCisJIktGTEFHUyA9ICQoS0ZMQUdTKSAtRENLX0FOU0lDIC1mdW5zaWduZWQtY2hhciAtTzIiCisKKyNIUC05MDAwIEhQLVVYIDEwLjAgKyBUQ1AvSVAgKyBjdXJzZXMsIGZ1bGx5IGNvbmZpZ3VyZWQuCisjVXNlIHdpdGggcmVzdHJpY3RlZCAoYnVuZGxlZCkgY29tcGlsZXI6IG5vIG9wdGltaXphdGlvbiwgbm8gQU5TSSBzdXBwb3J0LgorI2xpYmN1cnNlcyBuZWVkZWQgZm9yIGZ1bGxzY3JlZW4gZmlsZSB4ZmVyIGRpc3BsYXkgaW4gSFAtVVggMTAuMDAgYW5kIDEwLjAxLgorI2xpYkhjdXJzZXMgKE5PVCBsaWJjdXJzZXMhKSBmb3IgZnVsbHNjcmVlbiBkaXNwbGF5LCB0byB3b3JrIGFyb3VuZCBmYXRhbCBidWdzCisjaW4gSFAtVVggMTAuMTAgYW5kIDEwLjIwIGN1cnNlcy4gTWF5YmUgd2UgY291bGQgdXNlIGxjdXJzZXMgZm9yIDEwLjMwLCBzaW5jZQorI3RoZSAxMC4xMCBjdXJzZXMgcHJvYmxlbSBpcyBzdXBwb3NlZGx5IGZpeGVkIGluIDEwLjMwLgorIyArREExLjAgPSBHZW5lcmF0ZSBQQS1SSVNDIDEuMCBjb2RlIHRoYXQgcnVucyBvbiBib3RoIDcwMCBhbmQgODAwIG1vZGVscy4KKyMgK0RBMS4xID0gR2VuZXJhdGUgUEEtUklTQyAxLjEgY29kZSB0aGF0IHJ1bnMgb24gYm90aCA3MDAgYW5kIDgwMCBtb2RlbHMuCisjIE5vdGUgdGhhdCBIUC1VWCAxMC4yMCBhbmQgdXB3YXJkcyAgbm90IHN1cHBvcnQgUEEtUklTQyAxLjAgc3lzdGVtcy4KKyMgQW5kIHRoYXQgYXMgb2YgRGVjIDIwMDEsIDExLjAwIGFuZCAxMS4xMSBhcmUgUEEtb25seSBhbmQgMTEuMjAgaXMgSUE2NC1vbmx5LgorIyBMYXRlciAxMS4yeCByZWxlYXNlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgZm9yIGJvdGguICBBcmNoaXRlY3R1cmUgY2FuIGJlCisjIGRldGVybWluZWQgd2l0aCB0aGUgbW9kZWwgY29tbWFuZCwgYXQgbGVhc3QgaW4gMTAuMjAgYW5kIGxhdGVyLi4uCisjRm9yIGZ1dHVyZSByZWxlYXNlcywgd2UgbmVlZCB0byBpbmNsdWRlICtEQTEuMSBmb3IgUEEgYnVpbGRzLCBzbyB0aGF0IGEKKyNiaW5hcnkgYnVpbHQgb24gUEEgMi4wIHdpbGwgc3RpbGwgd29yayBvbiBQQSAxLjEgbWFjaGluZXMsIHdoZXJlYXMgK0RBMS4xCisjbXVzdCBOT1QgYmUgaW5jbHVkZWQgZm9yIElBNjQgYnVpbGRzLgorIworaHB1eDEwMDA6CisJQCQoTUFLRSkgaHB1eC1oZWFkZXIKKwlATElCUz0nLWxIY3Vyc2VzJyA7IFwKKwlBRkxBR1M9JytEQTEuMScgOyBcCisJY2FzZSBgdW5hbWUgLXJgIGluIFwKKwkgICBbQUJdLjEwLjAqKSAgS0ZMQUdTPSctREhQVVgxMDAwICQoS0ZMQUdTKScgOyBcCisJICAgICAgICAgICAgICAgIEFGTEFHUz0nK0RBMS4wJyA7IExJQlM9Jy1sY3Vyc2VzJyAgOzsgXAorCSAgIFtBQl0uMTAuMSopICBLRkxBR1M9Jy1ESFBVWDEwMTAgLURfX0hQX0NVUlNFUyAkKEtGTEFHUyknIDsgXAorCSAgICAgICAgICAgICAgICA7OyBcCisJICAgW0FCXS4xMC4yKikgIEtGTEFHUz0nLURIUFVYMTAyMCAtRF9fSFBfQ1VSU0VTICQoS0ZMQUdTKScgOyBcCisJICAgICAgICAgICAgICAgIDs7IFwKKwkgICBbQUJdLjEwLjMqKSAgS0ZMQUdTPSctREhQVVgxMDMwIC1EX19IUF9DVVJTRVMgJChLRkxBR1MpJyA7IFwKKwkgICAgICAgICAgICAgICAgOzsgXAorCSAgIFtBQl0uMTAuPyopICBLRkxBR1M9Jy1ESFBVWDEwWFggLURfX0hQX0NVUlNFUyAkKEtGTEFHUyknIDsgXAorCSAgICAgICAgICAgICAgICA7OyBcCisJICAgW0FCXS4xMS4wKikgIEtGTEFHUz0nLURIUFVYMTEwMCAtRF9fSFBfQ1VSU0VTICQoS0ZMQUdTKScgOyBcCisJICAgICAgICAgICAgICAgIDs7IFwKKwkgICBbQUJdLjExLjEqKSAgS0ZMQUdTPSctREhQVVgxMTAwIC1EX19IUF9DVVJTRVMgJChLRkxBR1MpJyA7IFwKKwkgICAgICAgICAgICAgICAgOzsgXAorCSAgIFtBQl0uMTEuPyopICBLRkxBR1M9Jy1ESFBVWDExMDAgLURfX0hQX0NVUlNFUyAkKEtGTEFHUyknIDsgXAorCSAgICAgICAgICAgICAgICBBRkxBR1M9JycgOyBMSUJTPSctbGN1cnNlcycgOzsgXAorCWVzYWMgOyBcCisJT0ZMQUdTPSQke09GTEFHUzotJCRBRkxBR1N9IDsgXAorCSQoTUFLRSkgIlNIRUxMPS91c3IvYmluL3NoIiB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNDPSQoQ0MpIiAiQ0MyPSQoQ0MyKSIgXAorCSJDRkxBR1MgPSAtREhQVVgxMCAtRERJUkVOVCAtRFNURVJNSU9YIC1EQ0tfRFNZU0lOSSAtREhEQlVVQ1AgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfV1JFRlJFU0ggLURUQ1BTT0NLRVQgLURDS19SRURJUiAtRFJFTkFNRSAtREZORkxPQVQgXAorCSQkS0ZMQUdTICQkT0ZMQUdTIiBcCisJIkxOS0ZMQUdTPS1zICQoTE5LRkxBR1MpIiAiTElCUyA9IC1sbSAkJExJQlMgJChLTElCUykiCisKKyMgVGhpcyBpcyBhIGtsdWRnZSwgY29weWluZyBocHV4MDkwMGdjYyBhbmQgYWRhcHRpbmcgaHB1eDEwMDAKKyMgKGFkZCBDQyBhbmQgQ0MyLCBkcm9wIHRoZSBBMS5bMHx8MV0pCisjIEJ1aWxkcyB3LyBubyBjb21waWxlciB3YXJuaW5ncyBidXQgbWluaW1hbGx5IHRlc3RlZC4KKyMKK2hwdXgxMDAwZ2NjOgorCUBNRVNTQUdFMT0idXNpbmcgdGhlIGdjYyBjb21waWxlciAkKE1FU1NBR0UxKSIgXAorCSQoTUFLRSkgaHB1eDEwMDAgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBDQz1nY2MgQ0MyPWdjYyBcCisJIktGTEFHUyA9ICQoS0ZMQUdTKSIgT0ZMQUdTPSIgLURDS19BTlNJQyAtZnVuc2lnbmVkLWNoYXIgLU8yIgorCisjIFRydXN0ZWQgSFAtVVggMTAKKyMgZWNobyBLRkxBR1M9JChLRkxBR1MpIFlUQVJHRVQgWVRBUkdFVD0kKFlUQVJHRVQpICQoWFRBUkdFVCkgOworaHB1eDEwMDB0OgorCUBjYXNlICIkKEtUQVJHRVQpIiBpbiBcCisJICAgKitvcGVuc3NsKSBcCisJCUtFTlRSWT1ocHV4MTAwMG8rb3BlbnNzbCA7OyBcCisJICAgKmdjYykgXAorCQlLRU5UUlk9aHB1eDEwMDBnY2MgOzsgXAorCSAgICpvKykgS0VOVFJZPWhwdXgxMDAwbysgOzsgXAorCSAgICpvKQlLRU5UUlk9aHB1eDEwMDBvIDs7IFwKKwkgICAqKQlLRU5UUlk9aHB1eDEwMDAgOzsgXAorCWVzYWMgOyBcCisJTUVTU0FHRTE9ImFuZCBzdXBwb3J0IGZvciAnVHJ1c3RlZCBIUC1VWCciIFwKKwkkKE1BS0UpICQkS0VOVFJZIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9ICQoS0ZMQUdTKSAtREhQVVgxMF9UUlVTVEVEIiAiS0xJQlM9LWxzZWMiCisKK2hwdXgxMDAwdG86CisJJChNQUtFKSBocHV4MTAwMHQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCitocHV4MTAwMHRvKzoKKwkkKE1BS0UpIGhwdXgxMDAwdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2hwdXgxMDAwdGdjYzoKKwkkKE1BS0UpIGhwdXgxMDAwdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2hwdXgxMDAwdG8rb3BlbnNzbDoKKwkkKE1BS0UpIGhwdXgxMDAwdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2hwdXgxMDAwdGdjYytvcGVuc3NsOgorCSQoTUFLRSkgaHB1eDEwMDB0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworI0hQLTkwMDAgSFAtVVggMTAuMDAgYW5kIGhpZ2hlciB3aXRoIEFOU0kgcHJvdG90eXBpbmcgYW5kIG9wdGltaXphdGlvbi4KKyNQQS1SSVNDIG9ubHksIG5vIE1vdG9yb2xhIG9yIG90aGVyIGhhcmR3YXJlIGlzIHN1cHBvcnQgaW4gSFAtVVggMTAuMDArKy4KKyNUaGUgdW5idW5kbGVkIG9wdGlvbmFsIGNvbXBpbGVyIGlzIHJlcXVpcmVkLgorI1lvdXIgcGF0aCBzaG91bGQgc3RhcnQgd2l0aCAvb3B0L2Fuc2ljL2Jpbi4KKyMgLVdsLC1GdyA9IFJlbW92ZSBzdGFjayB1bndpbmQgdGFibGUgKGluZm8gdXNlZCBieSBkZWJ1Z2dlcnMpLgorIyArTzIgbWFrZXMgYSBzbWFsbGVyIGV4ZWN1dGFibGUgKD0gLU8gPSBMZXZlbC0xIGFuZCBnbG9iYWwgb3B0aW1pemF0aW9uKS4KKyMgK08zIGFkZHMgaW50ZXJwcm9jZWR1cmFsIGdsb2JhbCBvcHRpbWl6YXRpb24sIG1ha2VzIGEgYmlnZ2VyIGV4ZWN1dGFibGUuCisjICtPbm9saW1pdCBhbGxvd3MgYWxsIG1vZHVsZXMgdG8gYmUgb3B0aW1pemVkLCBubyBtYXR0ZXIgaG93IGNvbXBsZXguICBCdXQ6CisjICAoYSkgK09ub2xpbWl0IGRvZXMgbm90IHNlZW0gdG8gYWx3YXlzIGJlIHRoZXJlIGluIEhQLVVYIDEwLjAwLCBhbmQ6CisjICAoYikgc29tZSBtb2R1bGVzIG1pZ2h0IHRha2UgaG91cnMgb24gbG93LW1lbW9yeSBhbmQvb3Igc2xvdyBzeXN0ZW1zLgorIyBUaGUgZm9sbG93aW5nIGFyZSBQQS1SSVNDLXNwZWNpZmljIG9wdGltaXphdGlvbnM6CisjICtFU2xpdCA9IENvbnNvbGlkYXRlIHN0cmluZ3MgaW4gcmVhZC1vbmx5IG1lbW9yeS4KKyMgK0VTZnNjID0gSW5saW5lIG1pbGxpY29kZSBjYWxscyB3aGVuIGNvbXBhcmluZyBwb2ludGVycy4KKyMgWW91IG1pZ2h0IG5lZWQgdG8gY29uZmlndXJlIHlvdXIga2VybmVsIGZvciBhIG1heGRzaXogb2YgMHgwQjAwMDAwMCAoMTc2TUIpCisjIG9yIGdyZWF0ZXIgdG8gcHJldmVudCB0aGUgb3B0aW1pemVyIGZyb20gcnVubmluZyBvdXQgb2Ygc3BhY2UuCisjIERlY2VtYmVyIDIwMDE6ICtFU2xpdCArRVNzZmMgcmVtb3ZlZCBiZWNhdXNlIG5vdCBzdXBwb3J0ZWQgb24gSUE2NC4KKyMgU29tZWJvZHkgd2hvIGNhcmVzIGNhbiB1c2UgJ21vZGVsJyB0byBzZWUgd2hldGhlciBpdCdzIFBBLVJJU0Mgb3IgSUE2NAorIyBhbmQgaW5jbHVkZSB0aGUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIG9wdGltaXphdGlvbiBmbGFncy4gIEFsc28gbm90ZToKKyMgK0RBMS4xIGlzIFBBLW9ubHkuICBJZiB0aGlzIGlzIGluY2x1ZGVkIGluIGluIEhQLVVYIDExLjAwIG9yIGxhdGVyLAorIyB0aGVuICtEUzIuMCBzaG91bGQgYmUgaW5jbHVkZWQgdG9vIChidXQgZG9uJ3QgdXNlICtEUzIuMCB3aXRob3V0ICtEQTEuMSwKKyMgb3IgZWxzZSB0aGUgYmluYXJ5IHdvbid0IHJ1biBvbiBvbGRlciBQQSBoYXJkd2FyZSkuCitocHV4MTAwMG86CisJQGNhc2UgYHVuYW1lIC1tYCBpbiBcCisJICBpYTY0KSA7OyBcCisJICAqKSBNRkxBR1M9JytFU2xpdCArRVNzZmMnIDs7IFwKKwllc2FjIDsgXAorCU1FU1NBR0UxPSJ3aXRoIFBBLVJJU0Mtc3BlY2lmaWMgb3B0aW1pemF0aW9ucyAkKE1FU1NBR0UxKSIgXAorCSQoTUFLRSkgIlNIRUxMPS91c3IvYmluL3NoIiAiUEFUSD0vb3B0L2Fuc2ljL2JpbjokJFBBVEgiIGhwdXgxMDAwIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJLRkxBR1MgPSAkKEtGTEFHUykgXAorCS1BYSAtRF9IUFVYX1NPVVJDRSAtRENLX0FOU0lDIC1EVVRJTUVIIFwKKwkrTzIgLVdsLC1GdyAkJE1GTEFHUyIKKworI0xpa2UgaHB1eDEwMDBvIGJ1dCB3aXRoICIrT25vbGltaXQiLgorI09uIDcwMCBzZXJpZXMgc2V0IGtlcm5lbCBwYXJhbWV0ZXIgbWF4ZHNpeiA+PSAweDBEMDAwMDAwICg9MjA4TUIpLgorI1Rha2VzIGEgbG9uZyB0aW1lLgoraHB1eDEwMDBvKzoKKwlATUVTU0FHRTE9ImFuZCArT25vbGltaXQgJChNRVNTQUdFMSkiIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSQoTUFLRSkgaHB1eDEwMDBvIFwKKwkiS0ZMQUdTID0gJChLRkxBR1MpICtPbm9saW1pdCIKKworI0hQLVVYIDEwLnh4ICsgMTEueHggd2l0aCBvcHRpbWl6aW5nIEFOU0kgY29tcGlsZXIgYW5kIE9wZW5TU0wuCisjRGVmaW5lIFNTTExJQiBhbmQgU1NMSU5DIGFwcHJvcHJpYXRlbHkgZm9yIHlvdXIgT3BlblNTTCBpbnN0YWxsYXRpb24uCisjRG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0IFNTTExJQiBhbmQgU1NMSU5DIHNldHRpbmdzIHlvdSBjYW4gYWxzbyB1c2UgdGhlCisjY29tbWFuZC1saW5lIHZhcmlhYmxlIEtTU0xMSUIgYW5kIEtTU0xJTkMgbGlrZTogCisjbWFrZSBocHV4MTAwMG8rb3BlbnNzbCBLU1NMTElCPS1ML29wdC9vcGVuc3NsL2xpYiBLU1NMSU5DPS1JLy4uLgorI0RpdHRvIGZvciB0aGUgWmxpYiBsb2NhdGlvbi4KKyNUaGlzIGVudHJ5IHdvcmtzIGZvciBDLUtlcm1pdCA4LjAuMjA2IG9uIEhQLVVYIDEwLjIwICsgMTEuMTEKKyN3aXRoIE9wZW5TU0wgMC45LjYgKyAwLjkuNworI05PVEU6IGFuIEFOU0kgQyBjb21waWxlciBpcyByZXF1aXJlZCBmb3IgdGhlIFNTTCBpbnRlcmZhY2UuICBJZiB5b3UgZG9uJ3QKKyNoYXZlIHRoZSBIUCBPcHRpbWl6aW5nIEFOU0kgY29tcGlsZXIsIHNlZSB0aGUgaHB1eDEwMDBnY2Mrb3BlbnNzbCB0YXJnZXQKKyNiZWxvdy4KK2hwdXgxMDAwbytvcGVuc3NsOgorCUBjYXNlICIkKEtUQVJHRVQpIiBpbiBcCisJICAgKmdjYysqKSBLRU5UUlk9aHB1eDEwMDBnY2MgOzsgXAorCSAgICopICAgICAgS0VOVFJZPWhwdXgxMDAwbyA7OyBcCisJZXNhYyA7IFwKKwlTU0xJTkM9JCR7S1NTTElOQzotJChTU0xJTkMpfTsgXAorCVNTTExJQj0kJHtLU1NMTElCOi0kKFNTTExJQil9OyBcCisJTUVTU0FHRTE9ImFuZCB3aXRoIE9wZW5TU0wgJChNRVNTQUdFMSkiIFwKKwkkKE1BS0UpICQkS0VOVFJZIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCUtGTEFHUz0iLURDS19BVVRIRU5USUNBVElPTiAtRENLX1NTTCAtRE9QRU5TU0xfMDk3IC1EWkxJQiBcCisJJCRTU0xJTkMgJChLRkxBR1MpIiBcCisJS0xJQlM9IiQoS0xJQlMpIFwKKwkkJFNTTExJQiAtbHNzbCAtbGNyeXB0byBcCisJLUwvb3B0L3psaWIvbGliIC1seiBcCisJIiAKKworI0hQLVVYIDEwLjAwIG9yIGhpZ2hlciB3aXRoIE9wZW5TU0wgMC45LjcuICBDb21waWxlZCB3aXRoIGdjYy4KKyNGcm9tIENocmlzIENoYW5leSwgTkVDIEFtZXJpY2EgSW5jLiAgSGlzIGluc3RydWN0aW9uczoKKyMgKDEpIEluc3RhbGwgZ2NjIHZlcnNpb24gMy4yLjMgJiBiaW51dGlscyB2ZXJzaW9uIDIuMTMuMgorIyAgICAgKHVzZWQgYmluYXJ5IGRlcG90IGZyb20gaHR0cDovL2hwdXguY3MudXRhaC5lZHUvKQorIyAoMikgSW5zdGFsbCBnY2MgbWFrZSB2ZXJzaW9uIDMuODAgZnJvbSBodHRwOi8vaHB1eC5jcy51dGFoLmVkdS8KKyMKKyMgb3I6IGdjYyAyLjkuMjAwMC0xMi0xIGZyb20gIkxpbnV4IHRvIGhwLXV4IDExLjAvMTFpIHBvcnRpbmcga2l0IHZlcnNpb24gMS4wCisjICAgICAoMkNEKSIgZnJlZSBmcm9tOiAgaHR0cDovL3d3dy5zb2Z0d2FyZS5ocC5jb20KKyMKKyMgKDMpIEluc3RhbGwgb3BlblNTTCB2ZXJzaW9uIDAuOS43YiBmcm9tIGh0dHA6Ly93d3cuc29mdHdhcmUuaHAuY29tCisjICg0KSBJbnN0YWxsIGZsZXggdmVyc2lvbiAyLjUuNCBmcm9tIGh0dHA6Ly9ocHV4LmNzLnV0YWguZWR1LworIyAoNSkgSW5zdGFsbCBnbXAgdmVyc2lvbiAzLjEuMSBmcm9tIGh0dHA6Ly9ocHV4LmNzLnV0YWguZWR1LworIworI05vdGUgZnJvbSBQZXRlciBFaWNoaG9ybiwgYXNzeXN0IE11bmljaC4gSXQgd29ya3MgYWxzbyB3aXRob3V0IGdjYyBtYWtlIQoraHB1eDEwMDBnY2Mrb3BlbnNzbDoKKwkkKE1BS0UpIGhwdXgxMDAwbytvcGVuc3NsIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworIyBTYW1lIGZvciBIUC1VWCAxMQoraHB1eDExMDBvK29wZW5zc2w6CisJJChNQUtFKSBocHV4MTAwMG8rb3BlbnNzbCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2hwdXgxMTAwZ2NjK29wZW5zc2w6CisJJChNQUtFKSBocHV4MTAwMGdjYytvcGVuc3NsIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworIyBIUC1VWCAxMQoraHB1eDExMDA6CisJJChNQUtFKSBocHV4MTAwMCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2hwdXgxMTAwbzoKKwkkKE1BS0UpIGhwdXgxMDAwbyBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKK2hwdXgxMTAwbys6CisJJChNQUtFKSBocHV4MTAwMG8rIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworaHB1eDExMDBnY2M6CisJJChNQUtFKSBocHV4MTAwMGdjYyBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKKyMgVHJ1c3RlZCBIUC1VWCAxMQoraHB1eDExMDB0OgorCSQoTUFLRSkgaHB1eDEwMDB0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworaHB1eDExMDB0bzoKKwkkKE1BS0UpIGhwdXgxMDAwdG8gS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCitocHV4MTEwMHRvKzoKKwkkKE1BS0UpIGhwdXgxMDAwdG8rIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworaHB1eDExMDB0Z2NjOgorCSQoTUFLRSkgaHB1eDEwMDB0Z2NjIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworaHB1eDExMDB0bytvcGVuc3NsOgorCSQoTUFLRSkgaHB1eDEwMDB0bytvcGVuc3NsIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0KKworaHB1eDExMDB0Z2NjK29wZW5zc2w6CisJJChNQUtFKSBocHV4MTAwMHRnY2Mrb3BlbnNzbCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9CisKKyNSZWd1bHVzIG9uIENJRSBTeXN0ZW1zIDY4MC8yMAorY2llOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIENJRSBTeXN0ZW1zIDY4MC8yMCBSZWd1bHVzLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtREFUVFNWIC1ETk9GSUxFSCAtRENJRSAtRE5PTEVBUk4gJChLRkxBR1MpIC1PIiAiTE5LRkxBR1MgPSIKKworIyBMaW51eCAxLjIgb3IgbGF0ZXIgd2l0aCBnY2MsIGR5bmFtaWMgbGlicmFyaWVzLCBuY3Vyc2VzLCBUQ1AvSVAuCisjCisjIElmIHlvdXIgTGludXggc3lzdGVtIGhhcyBjdXJzZXMgcmF0aGVyIHRoYW4gbmN1cnNlcywgdXNlIHRoZSBsaW51eGMKKyMgZW50cnksIG9yIGlmIHRoYXQgZG9lc24ndCB3b3JrLCBsaW51eG5jLgorIworIyBUaGUgS2VybWl0ICJsYXJnZSBtZW1vcnkgbW9kZWwiIGlzIHVzZWQgYnkgZGVmYXVsdCB0byBjb25maWd1cmUgYmlnIHBhY2tldAorIyBhbmQgc2NyaXB0IGJ1ZmZlcnMsIGV0Yy4gIEZvciBzbWFsbC1tZW1vcnkgb3IgbGltaXRlZC1yZXNvdXJjZSBzeXN0ZW1zLAorIyAibWFrZSBsaW51eCBLRkxBR1M9LUROT0JJR0JVRiIuCisjCisjIC1ETElOVVhGU1NUTkQgKExpbnV4IEZpbGUgU3lzdGVtIFN0YW5kYXJkIDEuMikgZ2l2ZXMgVVVDUCBsb2NrZmlsZSAvdmFyL2xvY2sKKyMgd2l0aCBzdHJpbmcgcGlkLiAgUmVtb3ZlIHRoaXMgdG8gZ2V0IC91c3Ivc3Bvb2wvdXVjcCB3aXRoIGludCBwaWQsIHVzZWQgaW4KKyMgdmVyeSBlYXJseSBMaW51eCB2ZXJzaW9ucy4gIEZTU1RORCAxLjIgYWxzbyBzYXlzIHRoYXQgdGhlIFBJRCBzdHJpbmcgaW4gdGhlCisjIFVVQ1AgbG9jayBmaWxlIGhhcyBsZWFkaW5nIHNwYWNlcy4gIFRoaXMgaXMgYSBjaGFuZ2UgZnJvbSBGU1NUTkQgMS4wLCB3aGljaAorIyB1c2VkIGxlYWRpbmcgemVyb3MuICBBZGQgLURGU1NUTkQxMCB0byBzdXBwb3J0IEZTU1RORCAxLjAgaW5zdGVhZCBvZiAxLjIuCisjIEkgaG9wZSBzdWJzZXF1ZW50IGVkaXRpb25zIG9mIHRoZSBmaWxlLXN5c3RlbSBzdGFuZGFyZCBkaWQgbm90IGNoYW5nZSB0aGVzZQorIyBhZ2Fpbi4KKyMKKyMgQWRkIC1ET0xJTlVYSElTUEVFRCAoT2xkIExpbnV4IEhpZ2ggU3BlZWQgc3VwcG9ydCkgdG8gdHVybiBvbiBhbiB1Z2x5IGtsdWRnZQorIyBpbiBMaW51eCAxLjAgYW5kIGVhcmxpZXIgdG8gc3VwcG9ydCBzcGVlZHMgb2YgNTc2MDAgYW5kIDExNTIwMC4gIEV4dHJlbWVseQorIyBvbGQgTGludXggc3lzdGVtcyAocHJlLTAuOTlwbDE1KSB3aWxsIG5vdCBzdXBwb3J0IHRoaXMuICBJZiBPTElOVVhISVNQRUVEIGlzCisjIG5vdCBkZWZpbmVkLCB0aGVuIG9ubHkgdGhlIHN0YW5kYXJkIFBPU0lYIHRlcm1pb3MgbWV0aG9kcyBvZiBzZXR0aW5nIHRoZSBwb3J0CisjIHNwZWVkIHdpbGwgYmUgdXNlZCwgYW5kIGluIHRoaXMgY2FzZSBzcGVlZHMgY2FuIGJlIGFzIGhpZ2ggYXMgNDYwODAwIGluIG1vc3QKKyMgbW9kZXJuIExpbnV4IHZlcnNpb25zLgorIworIyAtRENLX1BPU0lYX1NJRyAoUE9TSVggc2lnbmFsIGhhbmRsaW5nKSBpcyBnb29kIGZvciBMaW51eCByZWxlYXNlcyBiYWNrIHRvIGF0CisjIGxlYXN0IDAuOTkuMTQ7IGlmIGl0IGNhdXNlcyB0cm91YmxlIGZvciB5b3UsIHJlbW92ZSBpdCBmcm9tIHRoZSBDRkxBR1MuCisjCisjIC1waXBlIHJlbW92ZXMgdGhlIG5lZWQgZm9yIHRlbXAgZmlsZXMgLSByZW1vdmUgaXQgaWYgaXQgY2F1c2VzIHRyb3VibGUuCisjCisjIC1mdW5zaWduZWQtY2hhciBtYWtlcyBhbGwgY2hhcmFjdGVycyB1bnNpZ25lZCwgYXMgdGhleSBzaG91bGQgaGF2ZSBiZWVuCisjICBpbiB0aGUgZmlyc3QgcGxhY2UuCisjCisjIEFkZCAtRENLX0RTWVNJTkkgaWYgeW91IHdhbnQgYSBzaGFyZWQgc3lzdGVtLXdpZGUgaW5pdCBmaWxlLgorIworIyBTZWUgY2t1YndyLnR4dCBhYm91dCAtRE5PQ09URk1DLiAgSW4gZmFjdCwgeW91IHJlYWxseSBzaG91bGQgcmVhZCB0aGUKKyMgZW50aXJlIExpbnV4IHNlY3Rpb24gb2YgY2t1YndyLnR4dC4KKyMKKyMgVGhlICJsaW51eGEiIGVudHJ5IGNhbiBiZSByZWZlcmVuY2VkIGRpcmVjdGx5IG9uIExJQkMgc3lzdGVtcywgYnV0IG5vdAorIyBHTElCQywgd2hlcmUgLWxjcnlwdCBpcyByZXF1aXJlZC4gIFRoZSAibWFrZSBsaW51eCIgZW50cnkgc2hvdWxkIG5vcm1hbGx5CisjIGJlIHVzZWQgZm9yIGFsbCBidWlsZHMgb24gYWxsIExpbnV4IGRpc3RyaWJ1dGlvbnMgdW5sZXNzIHlvdSBoYXZlIHNwZWNpYWwKKyMgcmVxdWlyZW1lbnRzLCBpbiB3aGljaCBjYXNlIGtlZXAgcmVhZGluZy4gIENLX05FV1RFUk0gYWRkZWQgYWZ0ZXIgNy4wQjA0CisjIGR1ZSB0byBuZXcgY29tcGxhaW50cyBhYm91dCBuY3Vyc2VzIGNoYW5naW5nIGJ1ZmZlcmluZyBvZiB0dHkuCisKK2xpbnV4YToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBMaW51eCAxLjIgb3IgbGF0ZXIuLi4nCisJQGVjaG8gJ0lNUE9SVEFOVDogUmVhZCB0aGUgY29tbWVudHMgaW4gdGhlIGxpbnV4IHNlY3Rpb24gb2YgdGhlJworCUBlY2hvICdtYWtlZmlsZSBpZiB5b3UgaGF2ZSB0cm91YmxlLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtTyAtRExJTlVYIC1waXBlIC1mdW5zaWduZWQtY2hhciAtREZORkxPQVQgLURDS19QT1NJWF9TSUcgXAorCS1EQ0tfTkVXVEVSTSAtRFRDUFNPQ0tFVCAtRExJTlVYRlNTVE5EIC1ETk9DT1RGTUMgLURQT1NJWCBcCisJLURVU0VfU1RSRVJST1IgJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSIgIkxJQlMgPSAkKExJQlMpIC1sbSIKKworbGludXgtY3Jvc3M6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTGludXggKGNyb3NzLWNvbXBpbGVkKS4uLicKKwlnY2MgLW8gY2t3YXJ0Lm8gLWMgY2t3YXJ0LmMKKwlnY2MgLW8gd2FydCBja3dhcnQubworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDQyA9ICQoQ0MpIiAiQ0MyID0gJChDQykiICJIT1NUQ0MgPSBnY2MiIFwKKwkiQ0ZMQUdTID0gLU8gLURMSU5VWCAtcGlwZSAtZnVuc2lnbmVkLWNoYXIgLURGTkZMT0FUIC1EQ0tfUE9TSVhfU0lHIFwKKwktRENLX05DVVJTRVMgLURIQVZFX1BUTVggXAorCS1EQ0tfTkVXVEVSTSAtRFRDUFNPQ0tFVCAtRExJTlVYRlNTVE5EIC1ETk9DT1RGTUMgLURQT1NJWCBcCisJLURVU0VfU1RSRVJST1IgJChOQ1VSU0VTX0NQUEZMQUdTKSAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAkKE5DVVJTRVNfTERGTEFHUykgJChMTktGTEFHUykiIFwKKwkiTElCUyA9ICQoTElCUykgLWxuY3Vyc2VzIC1scmVzb2x2IC1sY3J5cHQgLWxtIgorCisjIEFzIGFib3ZlIGJ1dCB3aXRoIHByb2ZpbGluZworbGludXhwOgorCSQoTUFLRSkgbGludXhhIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUz0kKEtGTEFHUykgLXBnIiBcCisJIkxJQlM9LXBnIC1sY3J5cHQgLWxyZXNvbHYiCisKKyNOZXcgcHJpbWFyeSBMaW51eCBlbnRyeSBmb3IgQy1LZXJtaXQgOC4wLCByZXBsYWNpbmcgYmlnIG5lc3RlZAorI2lmLXRoZW4tZWxzZSBjb25zdHJ1Y3Rpb24gZnVsbCBvZiByZXBlYXRlZCBjbGF1c2VzIHdpdGggYSBzaW1wbGVyIHNjaGVtZQorI2ZvciBhdXRvbWF0aWNhbGx5IGRldGVjdGluZzoKKyMgLiBPbGQgdmVyc3VzIG5ldyBwdHkgaGFuZGxpbmcgKG5ldyA9PSBnbGliYyAyLjErKykKKyMgLiBQcmVzZW5jZSBvciBhYnNlbmNlIG9mIGxpYnJ5cHQuYSBhbmQgPGNyeXB0Lmg+CisjIC4gUHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBsaWJyZXNvbHYuYQorI1VubGlrZSB0aGUgcHJldmlvdXMgc2NoZW1lLCB0aGlzIG9uZSBpcyBlYXNpbHkgZXh0ZW5kZWQgdG8gaW5jbHVkZSBtb3JlIHRlc3RzLgorI05vdGU6IFRoZSBIQVZFX1BUTVggdGVzdCB3YXMgcHJldmlvdXNseSAiaWYgdGVzdCAtYyAvZGV2L3B0bXgiIGJ1dCB0aGlzIHdhcworI25vdCBzdWZmaWNpZW50IGZvciBEZWJpYW4gMi4xLCBiZWNhdXNlIGFsdGhvdWdoIGl0IGhhZCAvZGV2L3B0bXgsIGl0IGRpZCBub3QKKyNoYXZlIGdyYW50cHQoKSwgdW5sb2NrcHQoKSwgb3IgcHRzbmFtZSgpLCBzbyBoYXMgYmVlbiBjaGFuZ2VkIHRvIGxvb2sgZm9yIGEKKyNncmFudHB0KCkgcHJvdG90eXBlIGluIHRoZSBoZWFkZXIgZmlsZXMuICBXYXJuaW5nOiB1c2VzIGEgdGVtcG9yYXJ5IGZpbGUgaW4KKyN0aGUgY3VycmVudCBkaXJlY3RvcnkuICBNb2RpZmllZCBpbiA4LjAuMjA2IHRvIGFsbG93IGZvciBsaWJyYXJpZXMgdGhhdAorI2NvbnRhaW4gLnNvJ3MgYnV0IG5vIC5hJ3MsIGUuZy4gTWFuZHJha2UgOS4wLgorI0hBVkVfQkFVREJPWSBhZGRlZCBpbiA4LjAuMjEwIGZvciBSZWQgSGF0IC0tIGl0J3MgbGlrZSBBSVggdHR5bG9jaygpLgorbGludXg6CisJQGlmIHRlc3QgXAorCWBncmVwIGdyYW50cHQgL3Vzci9pbmNsdWRlLyouaCAvdXNyL2luY2x1ZGUvc3lzLyouaCB8IHdjIC1sYCAtZ3QgMDsgXAorCXRoZW4gaWYgdGVzdCAtYyAvZGV2L3B0bXg7IHRoZW4gSEFWRV9QVE1YPSctREhBVkVfUFRNWCc7IFwKKwllbHNlIEhBVkVfUFRNWD0nJzsgZmk7IGZpIDsgXAorCWlmIHRlc3QgLWYgL3Vzci9pbmNsdWRlL2JhdWRib3kuaCA7IFwKKwl0aGVuIEhBVkVfQkFVREJPWT0nLURIQVZFX0JBVURCT1knIDsgXAorCWVsc2UgSEFWRV9CQVVEQk9ZPScnIDsgZmkgOyBcCisJJChNQUtFKSBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1EQ0tfTkNVUlNFUyAtSS91c3IvaW5jbHVkZS9uY3Vyc2VzIFwKKwkkJEhBVkVfUFRNWCAkJEhBVkVfQkFVREJPWSBcCisJYGlmIHRlc3QgLWYgL3Vzci9pbmNsdWRlL2NyeXB0Lmg7IHRoZW4gZWNobyAtREhBVkVfQ1JZUFRfSDsgZmlgIFwKKwkkKEtGTEFHUykiIFwKKwkiTElCUz0tbG5jdXJzZXMgXAorCWBpZiB0ZXN0IC1mIC91c3IvbGliL2xpYnJlc29sdi5hIHx8IHRlc3QgLWYgL3Vzci9saWIvbGlicmVzb2x2LnNvOyBcCisJdGhlbiBlY2hvIC1scmVzb2x2OyBmaWAgXAorCWBpZiB0ZXN0IC1mIC91c3IvbGliL2xpYmNyeXB0LmEgfHwgdGVzdCAtZiAvdXNyL2xpYi9saWJjcnlwdC5zbzsgXAorCXRoZW4gZWNobyAtbGNyeXB0OyBmaWAiIFwKKwlsaW51eGEKKworIyBBcyBhYm92ZSBidXQgZm9yIExpbnV4IHN5c3RlbXMgdGhhdCBoYXZlIG5vIDxzeXMvc2VsZWN0Lmg+LgorbGludXhuczoKKwkkKE1BS0UpIGxpbnV4IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gS0ZMQUdTPS1ETk9fU1lTX1NFTEVDVF9ICisKKyMgQXMgYWJvdmUsIGJ1dCBmb3JjZXMgdXNlIG9mIGN1cnNlcyByYXRoZXIgdGhhbiBuY3Vyc2VzLgorIyBBZGQgLWx0ZXJtY2FwIHRvIExJQlMgaWYgbmVjZXNzYXJ5LgorIyBBbHNvIHdhdGNoIG91dCBmb3IgbGliY3Vyc2VzIGFuZC9vciBsaWJ0ZXJtY2FwIGhhdmluZyBiZWVuIG1vdmVkLgorIyBJbiB0aGF0IGNhc2UgeW91IG1pZ2h0IG5lZWQgc29tZXRoaW5nIGxpa2U6CisjICAiTElCUyA9IC1ML3Vzci9saWIvY3Vyc2VzIC1sY3Vyc2VzIC1ML3Vzci9saWIvdGVybWNhcCAtbHRlcm1jYXAiCisKK2xpbnV4YzoKKwlAaWYgdGVzdCBcCisJYGdyZXAgZ3JhbnRwdCAvdXNyL2luY2x1ZGUvKi5oIC91c3IvaW5jbHVkZS9zeXMvKi5oIHwgd2MgLWxgIC1ndCAwOyBcCisJdGhlbiBpZiB0ZXN0IC1jIC9kZXYvcHRteDsgdGhlbiBIQVZFX1BUTVg9Jy1ESEFWRV9QVE1YJzsgXAorCWVsc2UgSEFWRV9QVE1YPScnOyBmaTsgZmkgOyBcCisJJChNQUtFKSBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1EQ0tfQ1VSU0VTICQkSEFWRV9QVE1YIFwKKwlgaWYgdGVzdCAtZiAvdXNyL2xpYi9saWJjcnlwdC5hOyB0aGVuIGVjaG8gLURIQVZFX0NSWVBUSDsgZmlgIFwKKwkkKEtGTEFHUykiIFwKKwkiTElCUz0tbGN1cnNlcyBcCisJYGlmIHRlc3QgLWYgL3Vzci9saWIvbGlicmVzb2x2LmE7IHRoZW4gZWNobyAtbHJlc29sdjsgZmlgIFwKKwlgaWYgdGVzdCAtZiAvdXNyL2xpYi9saWJjcnlwdC5hOyB0aGVuIGVjaG8gLWxjcnlwdDsgZmlgIiBcCisJbGludXhhCisKKyMgQXMgYWJvdmUgYnV0IHdpdGggd2l0aCBubyBjdXJzZXMgc3VwcG9ydCwgZm9yIGV4YW1wbGUgYmVjYXVzZSB5b3UgaW5zdGFsbGVkCisjIHRoZSBkZXZlbG9wZXIgdG9vbHMgYnV0IGRpZCBub3QgaW5zdGFsbCAobiljdXJzZXMuCitsaW51eG5jOgorCUBpZiB0ZXN0IFwKKwlgZ3JlcCBncmFudHB0IC91c3IvaW5jbHVkZS8qLmggL3Vzci9pbmNsdWRlL3N5cy8qLmggfCB3YyAtbGAgLWd0IDA7IFwKKwl0aGVuIGlmIHRlc3QgLWMgL2Rldi9wdG14OyB0aGVuIEhBVkVfUFRNWD0nLURIQVZFX1BUTVgnOyBcCisJZWxzZSBIQVZFX1BUTVg9Jyc7IGZpOyBmaSA7IFwKKwkkKE1BS0UpIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9ICQkSEFWRV9QVE1YIFwKKwlgaWYgdGVzdCAtZiAvdXNyL2xpYi9saWJjcnlwdC5hOyB0aGVuIGVjaG8gLURIQVZFX0NSWVBUSDsgZmlgIFwKKwkkKEtGTEFHUykiICJMSUJTPSBcCisJYGlmIHRlc3QgLWYgL3Vzci9saWIvbGlicmVzb2x2LmE7IHRoZW4gZWNobyAtbHJlc29sdjsgZmlgIFwKKwlgaWYgdGVzdCAtZiAvdXNyL2xpYi9saWJjcnlwdC5hOyB0aGVuIGVjaG8gLWxjcnlwdDsgZmlgIiBcCisJbGludXhhCisKKyNTaGFycCBaYXVydXMgU0wtNTUwMCAtIExpbnV4IGJhc2VkCit6c2w1NTAwOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNoYXJwIFphdXJ1cyBTTC01NTAwLi4uJworCUB0b3VjaCBja2Nwcm8uYworCUB0b3VjaCB3YXJ0CisJJChNQUtFKSBsaW51eG5jIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUz0tRFpTTDU1MDAiIFwKKwkiQ0MgPSBnY2MiICJDQzIgPSBnY2MiCisKKyMgQSBtaW5pbXVtLXNpemUgdmVyc2lvbiBmb3IgTGludXggdGhhdCBkb2VzIG9ubHkgc2NyaXB0aW5nIGFuZAorIyBzZXJpYWwgY29tbXVuaWNhdGlvbiAtLSBubyBuZXR3b3Jrcywgbm8gZmlsZSB0cmFuc2Zlci4KK2xpbnV4c286CisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTID0gLU8gLURMSU5VWCAtcGlwZSAtZnVuc2lnbmVkLWNoYXIgLURQT1NJWCAtRENLX1BPU0lYX1NJRyBcCisJLURMSU5VWEZTU1RORCAtRE5PQ09URk1DIC1ETk9YRkVSIC1ETk9ERUJVRyAtRE5PQ1NFVFMgLUROT0hFTFAgXAorCS1ETk9ORVQgLURNSU5JRElBTCAtRE5PU0NSSVBUIC1ETk9JS1NEIC1ETk9QVVNIICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiAiTElCUyA9ICIKKworI01rbGludXggRFIzIGhhcyBob3JyaWJsZSBidWcgaW4gPHV0bXBiaXRzLmg+IC0gc2VlIGNrdWZpby5jLgorbWtsaW51eDoKKwkkKE1BS0UpIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUz0tRFVUTVBCVUciIFwKKwkiTElCUz0tbGNyeXB0IC1scmVzb2x2IiBsaW51eGEKKworI0xpbnV4UFBDIDE5OTkKK2xpbnV4cHBjOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4UFBDIDE5OTkuLi4nCisJQGlmIHRlc3QgLWYgL3Vzci9saWIvbGliY3J5cHQuYTsgdGhlbiBcCisJICAgIGlmIHRlc3QgLWYgL3Vzci9saWIvbGlicmVzb2x2LmE7IHRoZW4gXAorCSAgICAgICAgJChNQUtFKSBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkJIktGTEFHUz0kKE5DVVJTRVNfQ1BQKSAtREhBVkVfQ1JZUFRfSCBcCisJCS1ETE9DS19ESVI9XFxcXFxcIlwiL3Zhci9sb2NrL21vZGVtXFxcXFxcIlwiICQoS0ZMQUdTKSIgXAorCSAgICAgICAgIkxJQlM9LWxuY3Vyc2VzIC1scmVzb2x2IC1sY3J5cHQiIGxpbnV4YSA7IFwKKwkgICAgZWxzZSBcCisJICAgICAgICAkKE1BS0UpIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCQkiS0ZMQUdTPSQoTkNVUlNFU19DUFApIC1ESEFWRV9DUllQVF9IIFwKKwkJLURMT0NLX0RJUj1cXFxcXFwiXCIvdmFyL2xvY2svbW9kZW1cXFxcXFwiXCIgJChLRkxBR1MpIiBcCisJICAgICAgICAiTElCUz0tbG5jdXJzZXMgLWxjcnlwdCIgbGludXhhIDsgXAorCSAgICBmaSBcCisJZWxzZSBcCisJICAgIGlmIHRlc3QgLWYgL3Vzci9saWIvbGlicmVzb2x2LmE7IHRoZW4gXAorCSAgICAgICAgJChNQUtFKSBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkJIktGTEFHUz0kKE5DVVJTRVNfQ1BQKSBcCisJCS1ETE9DS19ESVI9XFxcXFxcIlwiL3Zhci9sb2NrL21vZGVtXFxcXFxcIlwiICQoS0ZMQUdTKSIgXAorCSAgICAgICAgIkxJQlM9LWxuY3Vyc2VzIC1scmVzb2x2IiBsaW51eGEgOyBcCisJICAgIGVsc2UgXAorCSAgICAgICAgJChNQUtFKSBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkJIktGTEFHUz0kKE5DVVJTRVNfQ1BQKSBcCisJCS1ETE9DS19ESVI9XFxcXFxcIlwiL3Zhci9sb2NrL21vZGVtXFxcXFxcIlwiICQoS0ZMQUdTKSIgXAorCSAgICAgICAgIkxJQlM9LWxuY3Vyc2VzIiBsaW51eGEgOyBcCisJICAgIGZpIFwKKwlmaQorCisKKyMgVGhlIHJlbWFpbmluZyBMaW51eCBlbnRyaWVzIGFyZSBmb3Igc3BlY2lhbCBvciBjdXN0b21pemVkIGJ1aWxkcy4gIFRoZXkKKyMgaGF2ZSBub3QgYmVlbiBnZW5lcmFsaXplZCBsaWtlIHRoZSBvbmVzIGFib3ZlLiAgSWRlYWxseSwgd2Ugc2hvdWxkIGFsbG93CisjIGZvciBldmVyeSBjb21iaW5hdGlvbiBvZiBsaWJjIHZzIGdsaWJjLCBnY2MgdnMgZWdjcywgY3Vyc2VzIHZzIG5jdXJzZXMsCisjIEtlcmJlcm9zIElWIHZzIEtlcmJlcm9zIFYgdnMgU1JQIChpbiBhbnkgY29tYmluYXRpb24pLCBhbmQgc28gb24gLS0KKyMgdm9sdW50ZWVycyB3ZWxjb21lLgorCisjIElmIHlvdSBnZXQgIkludGVybmFsIGNvbXBpbGVyIGVycm9yIHh4eCwgb3V0cHV0IHBpcGUgaGFzIGJlZW4gY2xvc2VkIiwKKyMgdHJ5IHJlbW92aW5nIC1waXBlLgorCisjIExpa2UgIm1ha2UgbGludXgiIGJ1dCBidWlsdCB3aXRoIGVnY3MgcmF0aGVyIHRoYW4gZ2NjLgorbGludXhlZ2NzOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4IDEuMiBvciBsYXRlciB3aXRoIGVnY3MuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBlZ2NzIiAiQ0MyID0gZWdjcyIgXAorCSJDRkxBR1MgPSAtTyAtRExJTlVYIC1waXBlIC1mdW5zaWduZWQtY2hhciBcCisJLURQT1NJWCAtRENLX1BPU0lYX1NJRyAtRENLX05DVVJTRVMgLUROT0NPVEZNQyBcCisJLURUQ1BTT0NLRVQgLURMSU5VWEZTU1RORCAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSIgIkxJQlMgPSAtbG5jdXJzZXMgLWxjcnlwdCAtbHJlc29sdiIKKworI0xpbnV4IG9uIEludGVsIFBDIHdpdGggQ3lnbnVzIG9yIE1JVCBLZXJiZXJvcyA1IDEuMi4xIChubyBLNCBjb21wYXRpYmlsaXR5KS4KK2xpbnV4K2tyYjU6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTGludXggb24gSW50ZWwgd2l0aCBLZXJiZXJvcy4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtTyAtZnVuc2lnbmVkLWNoYXIgLXBpcGUgLURQT1NJWCAtRExJTlVYIC1ETk9DT1RGTUMgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19LRVJCRVJPUyAtREtSQjUgXAorCS1EQ0tfRU5DUllQVElPTiAtRENLX0RFUyAtRENLX0NVUlNFUyAtRENLX1BPU0lYX1NJRyBcCisJLURUQ1BTT0NLRVQgLURMSU5VWEZTU1RORCAtREhBVkVfQ1JZUFRfSCAkKEs1SU5DKSAkKEs1SU5DKS9rcmI1IFwKKwkkKEtGTEFHUykiICJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiBcCisJIkxJQlMgPSAkKEs1TElCKSAtbG5jdXJzZXMgLWx0ZXJtY2FwIC1sZGVzNDI1IC1sa3JiNSBcCisJLWxjb21fZXJyIC1sazVjcnlwdG8gLWxnc3NhcGlfa3JiNSAtbGNyeXB0IC1scmVzb2x2IgorCisjTGludXggb24gSW50ZWwgUEMgd2l0aCBDeWdudXMgb3IgTUlUIEtlcmJlcm9zIDUgMS4yLjEgd2l0aCBLNCBjb21wYXRpYmlsaXR5LgorIworIyBSZXF1aXJlcyB0aGUgS2VyYmVyb3MgMS4yLjEgYmUgY29tcGlsZWQgd2l0aCBLUkI0IGNvbXBhdGliaWxpdHkuCitsaW51eCtrcmI1K2tyYjQ6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTGludXggb24gSW50ZWwgd2l0aCBLZXJiZXJvcy4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtTyAtZnVuc2lnbmVkLWNoYXIgLXBpcGUgLURQT1NJWCAtRExJTlVYIC1ETk9DT1RGTUMgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19LRVJCRVJPUyAtREtSQjUgLURLUkI0IC1ES1JCNTI0IFwKKwktRENLX0VOQ1JZUFRJT04gLURDS19ERVMgLURDS19DVVJTRVMgLURDS19QT1NJWF9TSUcgXAorCS1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggJChLNUlOQykgJChLNUlOQykva3JiNSBcCisJJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSIgXAorCSJMSUJTID0gJChLNUxJQikgLWxuY3Vyc2VzIC1sdGVybWNhcCAtbGtyYjQgLWxkZXM0MjUgLWxrcmI1IFwKKwktbGNvbV9lcnIgLWxrNWNyeXB0byAtbGNyeXB0IC1sZ3NzYXBpX2tyYjUgLWxyZXNvbHYiCisKKyMgTGludXggb24gSW50ZWwgUEMgd2l0aCBTUlAgMS43LjQgdXNpbmcgR05VIE1QLCBLcnlwdG8sIGFuZCBFcmljIFlvdW5nJ3MKKyMgREVTIGxpYnJhcnkuICBSZW1vdmUgdGhlIC1EQ0tfREVTLCAtRExJQkRFUyBhbmQgLWxkZXMgaWYgeW91IGRvIG5vdCBoYXZlCisjIEVyaWMgWW91bmcncyMgbGliZGVzLmEgaW5zdGFsbGVkLgorIworbGludXgrc3JwK2dtcDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBMaW51eCBvbiBpMzg2IHdpdGggU1JQLi4uJworCSQoTUFLRSkgc3JwbWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiBcCisJIkNGTEFHUyA9IC1PIC1mdW5zaWduZWQtY2hhciAtcGlwZSAtRFBPU0lYIC1ETElOVVggLUROT0NPVEZNQyBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX1NSUCBcCisJLURDS19FTkNSWVBUSU9OIC1EQ0tfQ0FTVCAtRENLX0RFUyAtRExJQkRFUyBcCisJLURDS19DVVJTRVMgLURDS19QT1NJWF9TSUcgLURUQ1BTT0NLRVQgLURMSU5VWEZTU1RORCAtREhBVkVfQ1JZUFRfSCBcCisJJChTUlBJTkMpICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gJChMTktGTEFHUykiIFwKKwkiTElCUyA9ICQoU1JQTElCKSBcCisJLWxuY3Vyc2VzIC1sdGVybWNhcCAtbHNycCAtbGdtcCAtbGRlcyAtbGtyeXB0byAtbGNyeXB0IC1scmVzb2x2IgorCitsaW51eCtzcnArZ21wK25vLWRlczoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBMaW51eCBvbiBpMzg2IHdpdGggU1JQIC4uLicKKwkkKE1BS0UpIHNycG1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtTyAtZnVuc2lnbmVkLWNoYXIgLXBpcGUgLURQT1NJWCAtRExJTlVYIC1ETk9DT1RGTUMgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19TUlAgXAorCS1EQ0tfRU5DUllQVElPTiAtRENLX0NBU1QgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggXAorCSQoU1JQSU5DKSAkKEtGTEFHUykiICJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiBcCisJIkxJQlMgPSAkKFNSUExJQikgXAorCS1sbmN1cnNlcyAtbHRlcm1jYXAgLWxzcnAgLWxnbXAgLWxrcnlwdG8gLWxjcnlwdCAtbHJlc29sdiIKKworbGludXgrc3JwK2dtcC1leHBvcnQ6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTGludXggb24gaTM4NiB3aXRoIFNSUC4uLicKKwkkKE1BS0UpIHNycG1pdC1leHBvcnQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiBcCisJIkNGTEFHUyA9IC1PIC1mdW5zaWduZWQtY2hhciAtcGlwZSAtRFBPU0lYIC1ETElOVVggLUROT0NPVEZNQyBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX1NSUCAtREZORkxPQVQgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggXAorCSQoU1JQSU5DKSAkKEtGTEFHUykiICJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiBcCisJIkxJQlMgPSAkKFNSUExJQikgXAorCS1sbmN1cnNlcyAtbHRlcm1jYXAgLWxzcnAgLWxnbXAgLWxrcnlwdG8gLWxjcnlwdCAtbG0gLWxyZXNvbHYiCisKK2xpbnV4K3NycCtnbXArcGFtOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4IG9uIGkzODYgd2l0aCBTUlAuLi4nCisJJChNQUtFKSBzcnBtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTID0gLU8gLWZ1bnNpZ25lZC1jaGFyIC1waXBlIC1EUE9TSVggLURMSU5VWCAtRE5PQ09URk1DIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfU1JQIFwKKwktRENLX0VOQ1JZUFRJT04gLURDS19DQVNUIC1EQ0tfREVTIC1ETElCREVTIFwKKwktRENLX0NVUlNFUyAtRENLX1BPU0lYX1NJRyAtRFRDUFNPQ0tFVCAtRExJTlVYRlNTVE5EIC1ESEFWRV9DUllQVF9IIFwKKwktRENLX1BBTSAtREZORkxPQVQgJChTUlBJTkMpICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gJChMTktGTEFHUykiIFwKKwkiTElCUyA9ICQoU1JQTElCKSAtbG5jdXJzZXMgLWx0ZXJtY2FwIC1sc3JwIC1sZ21wIC1sZGVzIC1sa3J5cHRvIFwKKwktbGNyeXB0IC1scGFtIC1sZGwgLWxtIC1scmVzb2x2IgorCisjTGludXggb24gSW50ZWwgUEMgd2l0aCBTUlAgMS43LjQgYnVpbHQgd2l0aCBPcGVuU1NMIGZvciBCaWcgTnVtYmVyIE1hdGgKKyNhbmQgQ3J5cHRvZ3JhcGhpYyBmdW5jdGlvbmFsaXR5LgorIworbGludXgrc3JwOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4IG9uIGkzODYgd2l0aCBTUlAuLi4nCisJJChNQUtFKSBzcnBtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTID0gLU8gLWZ1bnNpZ25lZC1jaGFyIC1waXBlIC1EUE9TSVggLURMSU5VWCAtRE5PQ09URk1DIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfU1JQIFwKKwktRENLX0VOQ1JZUFRJT04gLURDS19DQVNUIC1EQ0tfREVTIC1ETElCREVTIFwKKwktRENLX0NVUlNFUyAtRENLX1BPU0lYX1NJRyAtRFRDUFNPQ0tFVCAtRExJTlVYRlNTVE5EIC1ESEFWRV9DUllQVF9IIFwKKwkkKFNSUElOQykgJChTU0xJTkMpICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gJChMTktGTEFHUykiIFwKKwkiTElCUyA9ICQoU1JQTElCKSAkKFNTTExJQikgXAorCS1sbmN1cnNlcyAtbHRlcm1jYXAgLWxzcnAgLWxrcnlwdG8gLWxjcnlwdG8gLWxjcnlwdCAtbHJlc29sdiIKKworbGludXgrc3JwK3BhbToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBMaW51eCBvbiBpMzg2IHdpdGggU1JQLi4uJworCSQoTUFLRSkgc3JwbWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiBcCisJIkNGTEFHUyA9IC1PIC1mdW5zaWduZWQtY2hhciAtcGlwZSAtRFBPU0lYIC1ETElOVVggLUROT0NPVEZNQyBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX1NSUCBcCisJLURDS19FTkNSWVBUSU9OIC1EQ0tfQ0FTVCAtRENLX0RFUyAtRExJQkRFUyBcCisJLURDS19DVVJTRVMgLURDS19QT1NJWF9TSUcgLURUQ1BTT0NLRVQgLURMSU5VWEZTU1RORCAtREhBVkVfQ1JZUFRfSCBcCisJLURDS19QQU0gLURGTkZMT0FUICQoU1JQSU5DKSAkKFNTTElOQykgJChLRkxBR1MpIiBcCisJIkxOS0ZMQUdTID0gJChMTktGTEFHUykiIFwKKwkiTElCUyA9ICQoU1JQTElCKSAkKFNTTExJQikgLWxuY3Vyc2VzIC1sdGVybWNhcCAtbHNycCAtbGtyeXB0byBcCisJLWxjcnlwdG8gLWxjcnlwdCAtbHBhbSAtbGRsIC1sbSAtbHJlc29sdiIKKworbGludXgrc2hhZG93K3BhbToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBMaW51eCBvbiBpMzg2IHdpdGggU2hhZG93K1BBTS4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtTyAtZnVuc2lnbmVkLWNoYXIgLXBpcGUgLURQT1NJWCAtRExJTlVYIC1ETk9DT1RGTUMgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggXAorCS1EQ0tfU0hBRE9XIC1EQ0tfUEFNIC1ERk5GTE9BVCBcCisJJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSIgXAorCSJMSUJTID0gLWxuY3Vyc2VzIC1sdGVybWNhcCAtbGNyeXB0IC1scGFtIC1sZGwgLWxtIC1scmVzb2x2IgorCisjTGludXggY29uZmlndXJlZCBmb3IgU1NML1RMUy4KKyNSZW1vdmUgLWx0ZXJtY2FwIGlmIGl0IGNhdXNlcyB0cm91YmxlIGUuZy4gaW4gRGViaWFuIDIuMi4KKyNJZiB5b3UgaGF2ZSBPcGVuU1NMIDAuOS43IG9yIGxhdGVyLCBhZGQgLURPUEVOU1NMXzA5NyB0byBLRkxBR1MuCitsaW51eCtvcGVuc3NsOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4IG9uIGkzODYgd2l0aCBTU0wvVExTLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiBcCisJIkNGTEFHUyA9IC1PIC1mdW5zaWduZWQtY2hhciAtcGlwZSAtRFBPU0lYIC1ETElOVVggLUROT0NPVEZNQyBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX1NTTCBcCisJLURDS19DVVJTRVMgLURDS19QT1NJWF9TSUcgLURUQ1BTT0NLRVQgLURMSU5VWEZTU1RORCAtREhBVkVfQ1JZUFRfSCBcCisJLURGTkZMT0FUICQoU1NMSU5DKSAkKEtGTEFHUykiICJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiBcCisJIkxJQlM9ICQoU1NMTElCKSBcCisJLWxuY3Vyc2VzIC1sdGVybWNhcCAtbHNzbCAtbGNyeXB0byAtbG0gLWxyZXNvbHYgLWxjcnlwdCIKKworI0xpbnV4IGNvbmZpZ3VyZWQgZm9yIFNTTC9UTFMgYW5kIFNoYWRvdyBQYXNzd29yZHMKKyNSZW1vdmUgLWx0ZXJtY2FwIGlmIGl0IGNhdXNlcyB0cm91YmxlIGUuZy4gaW4gRGViaWFuIDIuMi4KKyNJZiB5b3UgaGF2ZSBPcGVuU1NMIDAuOS43IG9yIGxhdGVyLCBhZGQgLURPUEVOU1NMXzA5NyB0byBLRkxBR1MuCitsaW51eCtvcGVuc3NsK3NoYWRvdzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBMaW51eCBvbiBpMzg2IHdpdGggU1NML1RMUy4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtTyAtZnVuc2lnbmVkLWNoYXIgLXBpcGUgLURQT1NJWCAtRExJTlVYIC1ETk9DT1RGTUMgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19TU0wgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggXAorCS1ERk5GTE9BVCAtRENLX1NIQURPVyAkKFNTTElOQykgJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSIgXAorCSJMSUJTPSAkKFNTTExJQikgXAorCS1sbmN1cnNlcyAtbHRlcm1jYXAgLWxzc2wgLWxjcnlwdG8gLWxtIC1scmVzb2x2IC1sY3J5cHQiCisKKyNMaW51eCBjb25maWd1cmVkIGZvciBTU0wvVExTLCBaTElCLCBQQU0gYW5kIFNoYWRvdyBQYXNzd29yZHMKKyNSZW1vdmUgLWx0ZXJtY2FwIGlmIGl0IGNhdXNlcyB0cm91YmxlIGUuZy4gaW4gRGViaWFuIDIuMi4KKyNJZiB5b3UgaGF2ZSBPcGVuU1NMIDAuOS43IG9yIGxhdGVyLCBhZGQgLURPUEVOU1NMXzA5NyB0byBLRkxBR1MuCitsaW51eCtvcGVuc3NsK3psaWIrc2hhZG93K3BhbToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBMaW51eCBvbiBpMzg2IHdpdGggU1NML1RMUy4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtTyAtZnVuc2lnbmVkLWNoYXIgLXBpcGUgLURQT1NJWCAtRExJTlVYIC1ETk9DT1RGTUMgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19TU0wgLURDS19QQU0gLURaTElCIFwKKwktRENLX0NVUlNFUyAtRENLX1BPU0lYX1NJRyAtRFRDUFNPQ0tFVCAtRExJTlVYRlNTVE5EIC1ESEFWRV9DUllQVF9IIFwKKwktREZORkxPQVQgLURDS19TSEFET1cgJChTU0xJTkMpICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gJChMTktGTEFHUykiIFwKKwkiTElCUz0gJChTU0xMSUIpIFwKKwktbG5jdXJzZXMgLWx0ZXJtY2FwIC1sc3NsIC1sY3J5cHRvIC1sbSAtbHJlc29sdiAtbGNyeXB0IC1seiAtbHBhbSAtbGRsIgorCisjTGludXggb24gSW50ZWwgUEMgd2l0aCBTUlAgYW5kIFNTTC9UTFMuCisjCisjIGxpYnNycC5hIHNob3VsZCBiZSBidWlsZCB3aXRoIE9wZW5TU0wKKyMgUmVxdWlyZXMgdGhlIEtlcmJlcm9zIDEuMi4yIG9yIGhpZ2hlciB0byBiZSBjb21waWxlZCB3aXRoIEtSQjQgY29tcGF0aWJpbGl0eS4KKyNSZW1vdmUgLWx0ZXJtY2FwIGlmIGl0IGNhdXNlcyB0cm91YmxlIGUuZy4gaW4gRGViaWFuIDIuMi4KKyNJZiB5b3UgaGF2ZSBPcGVuU1NMIDAuOS43IG9yIGxhdGVyLCBhZGQgLURPUEVOU1NMXzA5NyB0byBLRkxBR1MuCitsaW51eCtzcnArb3BlbnNzbDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBMaW51eCBvbiBpMzg2IHdpdGggS1JCLFNSUCxTU0wuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTID0gLU8gLWZ1bnNpZ25lZC1jaGFyIC1waXBlIC1EUE9TSVggLURMSU5VWCAtRE5PQ09URk1DIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfU1JQIFwKKwktRENLX0VOQ1JZUFRJT04gLURDS19DQVNUIC1EQ0tfREVTIC1ETElCREVTIC1EQ0tfU1NMIFwKKwktRENLX0NVUlNFUyAtRENLX1BPU0lYX1NJRyAtRFRDUFNPQ0tFVCAtRExJTlVYRlNTVE5EIC1ESEFWRV9DUllQVF9IIFwKKwkkKFNSUElOQykgJChTU0xJTkMpICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gJChMTktGTEFHUykiIFwKKwkiTElCUyA9ICQoU1JQTElCKSAkKFNTTExJQikgXAorCS1sbmN1cnNlcyAtbHRlcm1jYXAgLWxzcnAgLWxzc2wgLWxrcnlwdG8gLWxjcnlwdG8gXAorCS1sY3J5cHQgLWxyZXNvbHYiCisKKyNMaW51eCBvbiBJbnRlbCBQQyB3aXRoIEN5Z251cyBvciBNSVQgS2VyYmVyb3MgNSAxLjIuMiBhbmQgU1JQLgorIworIyBsaWJzcnAuYSBzaG91bGQgYmUgYnVpbGQgd2l0aCBHTlUgTVAgKGxpYmdtcC5hKQorIyBpbnN0ZWFkIG9mIEFUJlQgQ3J5cHRvTGliIChsaWJjcnlwdC5hKSBkdWUgdG8gbmFtaW5nIGNvbmZsaWN0cyB3aXRoCisjIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBMaW51eCBsaWJyYXJpZXMuCisjIFJlcXVpcmVzIHRoZSBLZXJiZXJvcyAxLjIuMiBvciBoaWdoZXIgdG8gYmUgY29tcGlsZWQgd2l0aCBLUkI0IGNvbXBhdGliaWxpdHkuCitsaW51eCtrcmI1K2tyYjQrc3JwOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4IG9uIGkzODYgd2l0aCBLUkI1NCtTUlAuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTID0gLU8gLWZ1bnNpZ25lZC1jaGFyIC1waXBlIC1EUE9TSVggLURMSU5VWCAtRE5PQ09URk1DIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfU1JQIC1EQ0tfS0VSQkVST1MgIC1ES1JCNSAtREtSQjQgLURLUkI1MjQgXAorCS1EQ0tfRU5DUllQVElPTiAtRENLX0NBU1QgLURDS19ERVMgLURMSUJERVMgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggXAorCSQoSzVJTkMpICQoSzVJTkMpL2tyYjUgJChTUlBJTkMpIFwKKwkkKEtGTEFHUykiICJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiBcCisJIkxJQlMgPSAkKEs1TElCKSAkKFNSUExJQikgXAorCS1sbmN1cnNlcyAtbHRlcm1jYXAgLWxzcnAgLWxnbXAgLWxnc3NhcGlfa3JiNSAtbGtyeXB0byBcCisJLWxkZXMgLWxrcmI0IC1sZGVzNDI1IC1sa3JiNSAtbGNvbV9lcnIgLWxrNWNyeXB0byAtbGNyeXB0IC1scmVzb2x2IgorCisjTGludXggb24gSW50ZWwgUEMgd2l0aCBDeWdudXMgb3IgTUlUIEtlcmJlcm9zIDUgMS4yLjIsIFNSUCBhbmQgU1NML1RMUy4KKyMKKyMgbGlic3JwLmEgc2hvdWxkIGJlIGJ1aWxkIHdpdGggT3BlblNTTAorIyBSZXF1aXJlcyB0aGUgS2VyYmVyb3MgMS4yLjIgb3IgaGlnaGVyIHRvIGJlIGNvbXBpbGVkIHdpdGggS1JCNCBjb21wYXRpYmlsaXR5LgorIyBSZXF1aXJlcyBPcGVuU1NMIDAuOS42YSBvciBoaWdoZXIKKyNJZiB5b3UgaGF2ZSBPcGVuU1NMIDAuOS43IG9yIGxhdGVyLCBhZGQgLURPUEVOU1NMXzA5NyB0byBLRkxBR1MuCitsaW51eCtrcmI1K2tyYjQrc3JwK29wZW5zc2w6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTGludXggb24gaTM4NiB3aXRoIEtSQixTUlAsU1NMLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiBcCisJIkNGTEFHUyA9IC1PIC1mdW5zaWduZWQtY2hhciAtcGlwZSAtRFBPU0lYIC1ETElOVVggLUROT0NPVEZNQyBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX1NSUCAtRENLX0tFUkJFUk9TICAtREtSQjUgLURLUkI0IC1ES1JCNTI0IFwKKwktRENLX0VOQ1JZUFRJT04gLURDS19DQVNUIC1EQ0tfREVTIC1ETElCREVTIC1EQ0tfU1NMIFwKKwktRENLX0NVUlNFUyAtRENLX1BPU0lYX1NJRyAtRFRDUFNPQ0tFVCAtRExJTlVYRlNTVE5EIC1ESEFWRV9DUllQVF9IIFwKKwkkKEs1SU5DKSAkKEs1SU5DKS9rcmI1ICQoU1JQSU5DKSAkKFNTTElOQykgXAorCSQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gJChMTktGTEFHUykiIFwKKwkiTElCUyA9ICQoSzVMSUIpICQoU1JQTElCKSAkKFNTTExJQikgXAorCS1sbmN1cnNlcyAtbHRlcm1jYXAgLWxzcnAgXAorCS1sa3JiNCAtbHNzbCAtbGtyeXB0byAtbGNyeXB0byBcCisJLWxrcmI1IC1sY29tX2VyciAtbGs1Y3J5cHRvIC1sZ3NzYXBpX2tyYjUgLWxjcnlwdCAtbHJlc29sdiIKKworI0xpbnV4IG9uIEludGVsIFBDIHdpdGggQ3lnbnVzIG9yIE1JVCBLZXJiZXJvcyA1IDEuMi4yLCBTU0wvVExTLgorIworIyBsaWJzcnAuYSBzaG91bGQgYmUgYnVpbGQgd2l0aCBPcGVuU1NMCisjIFJlcXVpcmVzIHRoZSBLZXJiZXJvcyAxLjIuMiBiZSBjb21waWxlZCB3aXRoIEtSQjQgY29tcGF0aWJpbGl0eS4KKyNJZiB5b3UgaGF2ZSBPcGVuU1NMIDAuOS43IG9yIGxhdGVyLCBhZGQgLURPUEVOU1NMXzA5NyB0byBLRkxBR1MuCitsaW51eCtrcmI1K2tyYjQrb3BlbnNzbDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBMaW51eCBvbiBpMzg2IHdpdGggS1JCLFNTTC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtTyAtZnVuc2lnbmVkLWNoYXIgLXBpcGUgLURQT1NJWCAtRExJTlVYIC1ETk9DT1RGTUMgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19LRVJCRVJPUyAgLURLUkI1IC1ES1JCNCAtREtSQjUyNCBcCisJLURDS19FTkNSWVBUSU9OIC1EQ0tfQ0FTVCAtRENLX0RFUyAtRExJQkRFUyAtRENLX1NTTCBcCisJLURDS19DVVJTRVMgLURDS19QT1NJWF9TSUcgLURUQ1BTT0NLRVQgLURMSU5VWEZTU1RORCAtREhBVkVfQ1JZUFRfSCBcCisJJChLNUlOQykgJChLNUlOQykva3JiNSAkKFNTTElOQykgXAorCSQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gJChMTktGTEFHUykiIFwKKwkiTElCUyA9ICQoSzVMSUIpICQoU1NMTElCKSBcCisJLWxuY3Vyc2VzIC1sdGVybWNhcCBcCisJLWxrcmI0IC1sc3NsIC1sY3J5cHRvIC1sa3JiNSAtbGNvbV9lcnIgXAorCS1sazVjcnlwdG8gLWxnc3NhcGlfa3JiNSAtbGNyeXB0IC1scmVzb2x2IgorCisjTGludXggb24gSW50ZWwgUEMgd2l0aCBDeWdudXMgb3IgTUlUIEtlcmJlcm9zIDUgMS4yLjEsIFNTTC9UTFMuCisjCisjIGxpYnNycC5hIHNob3VsZCBiZSBidWlsZCB3aXRoIE9wZW5TU0wKKyMgUmVxdWlyZXMgdGhlIEtlcmJlcm9zIDEuMi4yIGJlIGNvbXBpbGVkIHdpdGggS1JCNCBjb21wYXRpYmlsaXR5LgorIyBJZiB5b3UgaGF2ZSBPcGVuU1NMIDAuOS43IG9yIGxhdGVyLCBhZGQgLURPUEVOU1NMXzA5NyB0byBLRkxBR1MuCitsaW51eCtrcmI1K2tyYjQrb3BlbnNzbCtzaGFkb3c6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTGludXggb24gaTM4NiB3aXRoIEtSQixTU0wuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTID0gLU8gLWZ1bnNpZ25lZC1jaGFyIC1waXBlIC1EUE9TSVggLURMSU5VWCAtRE5PQ09URk1DIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfS0VSQkVST1MgIC1ES1JCNSAtREtSQjQgLURLUkI1MjQgXAorCS1EQ0tfRU5DUllQVElPTiAtRENLX0NBU1QgLURDS19ERVMgLURMSUJERVMgLURDS19TU0wgLURDS19TSEFET1cgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggXAorCSQoSzVJTkMpICQoSzVJTkMpL2tyYjUgJChTU0xJTkMpIFwKKwkkKEtGTEFHUykiICJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiBcCisJIkxJQlMgPSAkKEs1TElCKSAkKFNTTExJQikgIFwKKwktbG5jdXJzZXMgLWx0ZXJtY2FwIFwKKwktbGtyYjQgLWxzc2wgLWxjcnlwdG8gLWxrcmI1IC1sY29tX2VyciBcCisJLWxrNWNyeXB0byAtbGdzc2FwaV9rcmI1IC1sY3J5cHQgLWxyZXNvbHYiCisKKyNMaW51eCBvbiBJbnRlbCBQQyB3aXRoIEN5Z251cyBvciBNSVQgS2VyYmVyb3MgNSAxLjIsIFNTTC9UTFMuCisjCisjIGxpYnNycC5hIHNob3VsZCBiZSBidWlsZCB3aXRoIE9wZW5TU0wKKyMgUmVxdWlyZXMgdGhlIEtlcmJlcm9zIDEuMi4yIGJlIGNvbXBpbGVkIHdpdGggS1JCNCBjb21wYXRpYmlsaXR5LgorIyBJZiB5b3UgaGF2ZSBPcGVuU1NMIDAuOS43IG9yIGxhdGVyLCBhZGQgLURPUEVOU1NMXzA5NyB0byBLRkxBR1MuCitsaW51eCtrcmI1K2tyYjQrb3BlbnNzbCt6bGliK3NoYWRvdzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBMaW51eCBvbiBpMzg2IHdpdGggS1JCLFNTTC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtTyAtZnVuc2lnbmVkLWNoYXIgLXBpcGUgLURQT1NJWCAtRExJTlVYIC1ETk9DT1RGTUMgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19LRVJCRVJPUyAgLURLUkI1IC1ES1JCNCAtREtSQjUyNCAtRFpMSUIgXAorCS1EQ0tfRU5DUllQVElPTiAtRENLX0NBU1QgLURDS19ERVMgLURMSUJERVMgLURDS19TU0wgLURDS19TSEFET1cgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggXAorCSQoSzVJTkMpICQoSzVJTkMpL2tyYjUgJChTU0xJTkMpIFwKKwkkKEtGTEFHUykiICJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiBcCisJIkxJQlMgPSAkKEs1TElCKSAkKFNTTExJQikgXAorCS1sbmN1cnNlcyAtbHRlcm1jYXAgXAorCS1sa3JiNCAtbHNzbCAtbGNyeXB0byAtbGtyYjUgLWxjb21fZXJyIFwKKwktbGs1Y3J5cHRvIC1sZ3NzYXBpX2tyYjUgLWxjcnlwdCAtbHJlc29sdiAtbHoiCisKK2xpbnV4K2tyYjUra3JiNCtzcnAtZXhwb3J0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4IG9uIGkzODYgd2l0aCBTUlAuLi4nCisJJChNQUtFKSB4ZXJtaXQtZXhwb3J0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtTyAtZnVuc2lnbmVkLWNoYXIgLXBpcGUgLURQT1NJWCAtRExJTlVYIC1ETk9DT1RGTUMgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19TUlAgLURDS19LRVJCRVJPUyAgLURLUkI1IC1ES1JCNCAtREtSQjUyNCBcCisJLURDS19DVVJTRVMgLURDS19QT1NJWF9TSUcgLURUQ1BTT0NLRVQgLURMSU5VWEZTU1RORCAtREhBVkVfQ1JZUFRfSCBcCisJJChLNUlOQykgJChLNUlOQykva3JiNSAkKFNSUElOQykgXAorCSQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gJChMTktGTEFHUykiIFwKKwkiTElCUyA9ICQoU1JQTElCKSAkKEs1TElCKSBcCisJLWxuY3Vyc2VzIC1sdGVybWNhcCAtbHNycCAtbGdtcCAtbGtyYjQgLWxkZXM0MjUgLWxrcmI1IC1sZ3NzYXBpX2tyYjUgXAorCS1sY29tX2VyciAtbGs1Y3J5cHRvIC1sa3J5cHRvIC1sY3J5cHQgLWxyZXNvbHYiCisKK2xpbnV4K2tyYjUra3JiNCtzcnArcGFtOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4IG9uIGkzODYgd2l0aCBTUlAuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTID0gLU8gLWZ1bnNpZ25lZC1jaGFyIC1waXBlIC1EUE9TSVggLURMSU5VWCAtRE5PQ09URk1DIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfU1JQIC1EQ0tfS0VSQkVST1MgIC1ES1JCNSAtREtSQjQgLURLUkI1MjQgXAorCS1EQ0tfRU5DUllQVElPTiAtRENLX0NBU1QgLURDS19ERVMgLURMSUJERVMgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggXAorCS1EQ0tfUEFNICQoSzVJTkMpICQoSzVJTkMpL2tyYjUgJChTUlBJTkMpIFwKKwkkKEtGTEFHUykiICJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiBcCisJIkxJQlMgPSAkKFNSUExJQikgJChLNUxJQikgXAorCS1sbmN1cnNlcyAtbHRlcm1jYXAgLWxzcnAgLWxnbXAgLWxkZXMgLWxrcmI0IC1sZGVzNDI1IC1sa3JiNSBcCisJLWxjb21fZXJyIC1sazVjcnlwdG8gLWxnc3NhcGlfa3JiNSAtbGtyeXB0byAtbGNyeXB0IC1scGFtIC1sZGwgXAorCS1scmVzb2x2IgorCisjTGludXggb24gSW50ZWwgUEMgd2l0aCBDeWdudXMgb3IgTUlUIEtlcmJlcm9zIDUgMS4yLjIsIFNSUCBhbmQgU1NML1RMUy4KKyMgYW5kIFBBTS4KKyMKKyMgbGlic3JwLmEgc2hvdWxkIGJlIGJ1aWxkIHdpdGggT3BlblNTTAorIyBSZXF1aXJlcyB0aGUgS2VyYmVyb3MgMS4yLjIgYmUgY29tcGlsZWQgd2l0aCBLUkI0IGNvbXBhdGliaWxpdHkuCisjIElmIHlvdSBoYXZlIE9wZW5TU0wgMC45Ljcgb3IgbGF0ZXIsIGFkZCAtRE9QRU5TU0xfMDk3IHRvIEtGTEFHUy4KK2xpbnV4K2tyYjUra3JiNCtzcnArb3BlbnNzbCtwYW0tZGVidWc6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTGludXggb24gaTM4NiB3aXRoIEtSQixTUlAsU1NMLi4uJworCSQoTUFLRSkgeGVybWl0LWRlYnVnIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiBcCisJIkNGTEFHUyA9IC1nIC1PIC1mdW5zaWduZWQtY2hhciAtcGlwZSAtRFBPU0lYIC1ETElOVVggLUROT0NPVEZNQyBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX1NSUCAtRENLX0tFUkJFUk9TICAtREtSQjUgLURLUkI0IC1ES1JCNTI0IFwKKwktRENLX0VOQ1JZUFRJT04gLURDS19DQVNUIC1EQ0tfREVTIC1ETElCREVTIC1EQ0tfU1NMIC1EQ0tfUEFNIFwKKwktRENLX0NVUlNFUyAtRENLX1BPU0lYX1NJRyAtRFRDUFNPQ0tFVCAtRExJTlVYRlNTVE5EIC1ESEFWRV9DUllQVF9IIFwKKwktdyAtRG1hbGxvYz1kbWFsbG9jIC1EZnJlZT1kZnJlZSAtRE1ERUJVRyAkKEs1SU5DKSAkKEs1SU5DKS9rcmI1IFwKKwkkKFNSUElOQykgJChTU0xJTkMpICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gJChMTktGTEFHUykiIFwKKwkiTElCUyA9ICQoU1JQTElCKSAkKEs1TElCKSAkKFNTTExJQikgXAorCS1sbmN1cnNlcyAtbHRlcm1jYXAgLWxzcnAgLWxrcmI0IC1sc3NsIC1sa3J5cHRvIC1sY3J5cHRvIFwKKwktbGtyYjUgLWxjb21fZXJyIC1sazVjcnlwdG8gLWxnc3NhcGlfa3JiNSAtbGNyeXB0IC1scmVzb2x2IC1scGFtIC1sZGwiCisKKyNMaW51eCBvbiBJbnRlbCBQQyB3aXRoIEN5Z251cyBvciBNSVQgS2VyYmVyb3MgNSAxLjIuMSwgU1JQIGFuZCBTU0wvVExTLgorIyBhbmQgUEFNLgorIworIyBsaWJzcnAuYSBzaG91bGQgYmUgYnVpbGQgd2l0aCBPcGVuU1NMCisjIFJlcXVpcmVzIHRoZSBLZXJiZXJvcyAxLjIuMiBiZSBjb21waWxlZCB3aXRoIEtSQjQgY29tcGF0aWJpbGl0eS4KKyMgSWYgeW91IGhhdmUgT3BlblNTTCAwLjkuNyBvciBsYXRlciwgYWRkIC1ET1BFTlNTTF8wOTcgdG8gS0ZMQUdTLgorbGludXgra3JiNStrcmI0K3NycCtvcGVuc3NsK3BhbToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBMaW51eCBvbiBpMzg2IHdpdGggS1JCLFNSUCxTU0wuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTID0gLWcgLU8gLWZ1bnNpZ25lZC1jaGFyIC1waXBlIC1EUE9TSVggLURMSU5VWCAtRE5PQ09URk1DIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfU1JQIC1EQ0tfS0VSQkVST1MgIC1ES1JCNSAtREtSQjQgLURLUkI1MjQgXAorCS1EQ0tfRU5DUllQVElPTiAtRENLX0NBU1QgLURDS19ERVMgLURMSUJERVMgLURDS19TU0wgLURDS19QQU0gXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggXAorCSQoSzVJTkMpICQoSzVJTkMpL2tyYjUgJChTUlBJTkMpICQoU1NMSU5DKSBcCisJJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSIgXAorCSJMSUJTID0gJChTUlBMSUIpICQoSzVMSUIpICQoU1NMTElCKSAgXAorCS1sbSAtbG5jdXJzZXMgLWx0ZXJtY2FwIC1sc3JwIFwKKwktbGtyYjQgLWxzc2wgLWxrcnlwdG8gIC1sY3J5cHRvIC1sZ3NzYXBpX2tyYjUgXAorCS1sa3JiNSAtbGNvbV9lcnIgLWxrNWNyeXB0byAtbGNyeXB0IC1scmVzb2x2IC1scGFtIC1sZGwiCisKKyNMaW51eCBvbiBJbnRlbCBQQyB3aXRoIEN5Z251cyBvciBNSVQgS2VyYmVyb3MgNSAxLjIuMiwgU1JQLCBPcGVuU1NMCisjIHdpdGggWkxJQiBhbmQgUEFNCisjCisjIGxpYnNycC5hIHNob3VsZCBiZSBidWlsZCB3aXRoIE9wZW5TU0wKKyMgUmVxdWlyZXMgdGhlIEtlcmJlcm9zIDEuMi4yIGJlIGNvbXBpbGVkIHdpdGggS1JCNCBjb21wYXRpYmlsaXR5LgorIyBJZiB5b3UgaGF2ZSBPcGVuU1NMIDAuOS43IG9yIGxhdGVyLCBhZGQgLURPUEVOU1NMXzA5NyB0byBLRkxBR1MuCitsaW51eCtrcmI1K2tyYjQrc3JwK29wZW5zc2wremxpYitwYW06CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTGludXggb24gaTM4NiB3aXRoIEtSQixTUlAsU1NMLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiBcCisJIkNGTEFHUyA9IC1nIC1PIC1mdW5zaWduZWQtY2hhciAtcGlwZSAtRFBPU0lYIC1ETElOVVggLUROT0NPVEZNQyBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX1NSUCAtRENLX0tFUkJFUk9TICAtREtSQjUgLURLUkI0IC1ES1JCNTI0IFwKKwktRENLX0VOQ1JZUFRJT04gLURDS19DQVNUIC1EQ0tfREVTIC1ETElCREVTIC1EQ0tfU1NMIC1EQ0tfUEFNIC1EWkxJQiBcCisJLURDS19DVVJTRVMgLURDS19QT1NJWF9TSUcgLURUQ1BTT0NLRVQgLURMSU5VWEZTU1RORCAtREhBVkVfQ1JZUFRfSCBcCisJJChLNUlOQykgJChLNUlOQykva3JiNSAkKFNSUElOQykgJChTU0xJTkMpIFwKKwkkKEtGTEFHUykiICJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiBcCisJIkxJQlMgPSAkKFNSUExJQikgJChLNUxJQikgJChTU0xMSUIpIFwKKwktbG0gLWxuY3Vyc2VzIC1sdGVybWNhcCAtbHNycCBcCisJLWxrcmI0IC1sc3NsIC1sa3J5cHRvICAtbGNyeXB0byAtbGdzc2FwaV9rcmI1IFwKKwktbGtyYjUgLWxjb21fZXJyIC1sazVjcnlwdG8gLWxjcnlwdCAtbHJlc29sdiAtbHBhbSAtbGRsIC1seiIKKworI0xpbnV4IG9uIEludGVsIFBDIHdpdGggQ3lnbnVzIG9yIE1JVCBLZXJiZXJvcyA1IDEuMi4yLCBTUlAsIE9wZW5TU0wKKyMgd2l0aCBaTElCLCBTaGFkb3cgUGFzc3dvcmRzLCBhbmQgUEFNCisjCisjIGxpYnNycC5hIHNob3VsZCBiZSBidWlsZCB3aXRoIE9wZW5TU0wKKyMgUmVxdWlyZXMgdGhlIEtlcmJlcm9zIDEuMi4yIGJlIGNvbXBpbGVkIHdpdGggS1JCNCBjb21wYXRpYmlsaXR5LgorIyBJZiB5b3UgaGF2ZSBPcGVuU1NMIDAuOS43IG9yIGxhdGVyLCBhZGQgLURPUEVOU1NMXzA5NyB0byBLRkxBR1MuCitsaW51eCtrcmI1K2tyYjQrc3JwK29wZW5zc2wremxpYitzaGFkb3crcGFtOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4IG9uIGkzODYgd2l0aCBLUkIsU1JQLFNTTC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtZyAtTyAtZnVuc2lnbmVkLWNoYXIgLXBpcGUgLURQT1NJWCAtRExJTlVYIC1ETk9DT1RGTUMgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19TUlAgLURDS19LRVJCRVJPUyAgLURLUkI1IC1ES1JCNCAtREtSQjUyNCBcCisJLURDS19FTkNSWVBUSU9OIC1EQ0tfQ0FTVCAtRENLX0RFUyAtRExJQkRFUyAtRENLX1NTTCAtRENLX1BBTSAtRFpMSUIgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggXAorCS1EQ0tfU0hBRE9XICQoSzVJTkMpICQoSzVJTkMpL2tyYjUgJChTUlBJTkMpICQoU1NMSU5DKSBcCisJJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSIgXAorCSJMSUJTID0gJChTUlBMSUIpICQoSzVMSUIpICQoU1NMTElCKSBcCisJLWxtIC1sbmN1cnNlcyAtbHRlcm1jYXAgLWxzcnAgLWxrcnlwdG8gXAorCS1sa3JiNCAtbHNzbCAtbGNyeXB0byAtbGdzc2FwaV9rcmI1IFwKKwktbGtyYjUgLWxjb21fZXJyIC1sazVjcnlwdG8gLWxjcnlwdCAtbHJlc29sdiAtbHBhbSAtbGRsIC1seiIKKworI0xpbnV4IG9uIEludGVsIFBDIHdpdGggQ3lnbnVzIG9yIE1JVCBLZXJiZXJvcyA1IDEuMi4yLCBPcGVuU1NMCisjIHdpdGggU2hhZG93IFBhc3N3b3JkcywgUEFNCisjCisjIFJlcXVpcmVzIHRoZSBLZXJiZXJvcyAxLjIuMiBiZSBjb21waWxlZCB3aXRoIEtSQjQgY29tcGF0aWJpbGl0eS4KK2xpbnV4K2tyYjUra3JiNCtvcGVuc3NsK3NoYWRvdytwYW06CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTGludXggb24gaTM4NiB3aXRoIEtSQixTU0wsLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiBcCisJIkNGTEFHUyA9IC1nIC1PIC1mdW5zaWduZWQtY2hhciAtcGlwZSAtRFBPU0lYIC1ETElOVVggLUROT0NPVEZNQyBcCisJLURDS19BVVRIRU5USUNBVElPTiAtRENLX0tFUkJFUk9TICAtREtSQjUgLURLUkI0IC1ES1JCNTI0IFwKKwktRENLX0VOQ1JZUFRJT04gLURDS19DQVNUIC1EQ0tfREVTIC1ETElCREVTIC1EQ0tfU1NMIC1EQ0tfUEFNIFwKKwktRENLX0NVUlNFUyAtRENLX1BPU0lYX1NJRyAtRFRDUFNPQ0tFVCAtRExJTlVYRlNTVE5EIC1ESEFWRV9DUllQVF9IIFwKKwktRENLX1NIQURPVyAkKEs1SU5DKSAkKEs1SU5DKS9rcmI1ICQoU1NMSU5DKSBcCisJJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSIgXAorCSJMSUJTID0gJChLNUxJQikgJChTU0xMSUIpIFwKKwktbG0gLWxuY3Vyc2VzIC1sdGVybWNhcCBcCisJLWxrcmI0IC1sc3NsIC1sY3J5cHRvIC1sZ3NzYXBpX2tyYjUgXAorCS1sa3JiNSAtbGNvbV9lcnIgLWxrNWNyeXB0byAtbGNyeXB0IC1scmVzb2x2IC1scGFtIC1sZGwiCisKKyNMaW51eCBvbiBJbnRlbCBQQyB3aXRoIEN5Z251cyBvciBNSVQgS2VyYmVyb3MgNSAxLjIuMiwgT3BlblNTTAorIyB3aXRoIFpMSUIsIFNoYWRvdyBQYXNzd29yZHMsIFBBTQorIworIyBsaWJzcnAuYSBzaG91bGQgYmUgYnVpbGQgd2l0aCBPcGVuU1NMCisjIFJlcXVpcmVzIHRoZSBLZXJiZXJvcyAxLjIuMiBiZSBjb21waWxlZCB3aXRoIEtSQjQgY29tcGF0aWJpbGl0eS4KKyMgSWYgeW91IGhhdmUgT3BlblNTTCAwLjkuNyBvciBsYXRlciwgYWRkIC1ET1BFTlNTTF8wOTcgdG8gS0ZMQUdTLgorbGludXgra3JiNStrcmI0K29wZW5zc2wremxpYitzaGFkb3crcGFtOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4IG9uIGkzODYgd2l0aCBLUkIsU1JQLFNTTC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtZyAtTyAtZnVuc2lnbmVkLWNoYXIgLXBpcGUgLURQT1NJWCAtRExJTlVYIC1ETk9DT1RGTUMgXAorCS1EQ0tfQVVUSEVOVElDQVRJT04gLURDS19LRVJCRVJPUyAgLURLUkI1IC1ES1JCNCAtREtSQjUyNCBcCisJLURDS19FTkNSWVBUSU9OIC1EQ0tfQ0FTVCAtRENLX0RFUyAtRExJQkRFUyAtRENLX1NTTCAtRENLX1BBTSAtRFpMSUIgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggXAorCS1EQ0tfU0hBRE9XICQoSzVJTkMpICQoSzVJTkMpL2tyYjUgJChTU0xJTkMpIFwKKwkkKEtGTEFHUykiICJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiBcCisJIkxJQlMgPSAkKEs1TElCKSAkKFNTTExJQikgXAorCS1sbSAtbG5jdXJzZXMgLWx0ZXJtY2FwIFwKKwktbGtyYjQgLWxzc2wgLWxjcnlwdG8gLWxnc3NhcGlfa3JiNSBcCisJLWxrcmI1IC1sY29tX2VyciAtbGs1Y3J5cHRvIC1sY3J5cHQgLWxyZXNvbHYgLWxwYW0gLWxkbCAtbHoiCisKKyNSZWQgSGF0IDkgLSBmdWxsIGluc3RhbGwgaW5jbHVkZXMgS2VyYmVyb3MgNSAoNCBjb21wYXQpLCBQQU0sIFNTTC4KKyNBbHNvIHdvcmtzIGFyb3VuZCBidWcgaW4gY3Vyc2VzIGluIHdoaWNoIHRlcm1pbmFsIGdvZXMgZGVhZCBhZnRlcgorI3JldHVybmluZyBmcm9tIGZpbGUtdHJhbnNmZXIgZGlzcGxheS4gIEFzc3VtZXMgT3BlblNTTCAwLjkuNyBvciBsYXRlci4KK3JlZGhhdDk6CisJQGVjaG8gIkJ1aWxkaW5nIFNFQ1VSRSBLZXJtaXQgZm9yIFJlZCBIYXQgOS4wLi4uIgorCSQoTUFLRSkgbGludXgra3JiNStrcmI0K29wZW5zc2wremxpYitzaGFkb3crcGFtIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJLRkxBR1MgPSAtRFJIOTAgLURPUEVOU1NMXzA5NyAkKEtGTEFHUykiCisKKyNEaXR0byBwbHVzIFNSUCAod2hpY2ggaXMgbm90IG5vcm1hbGx5IGluY2x1ZGVkIHdpdGggUkggTGludXgpLgorcmVkaGF0OStzcnA6CisJQGVjaG8gIkJ1aWxkaW5nIFNFQ1VSRSBLZXJtaXQgZm9yIFJlZCBIYXQgOS4wLi4uIgorCSQoTUFLRSkgbGludXgra3JiNStrcmI0K3NycCtvcGVuc3NsK3psaWIrc2hhZG93K3BhbSBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiS0ZMQUdTID0gLURSSDkwIC1ET1BFTlNTTF8wOTcgJChLRkxBR1MpIgorCisjUmVkIEhhdCBMaW51eCA4LjAgLSBmdWxsIGluc3RhbGwgaW5jbHVkZXMgS2VyYmVyb3MgNSAoNCBjb21wYXQpLCBQQU0sIFNTTC4KKyNBbHNvIHdvcmtzIGFyb3VuZCBidWcgaW4gY3Vyc2VzIGluIHdoaWNoIHRlcm1pbmFsIGdvZXMgZGVhZCBhZnRlcgorI3JldHVybmluZyBmcm9tIGZpbGUtdHJhbnNmZXIgZGlzcGxheS4KK3JlZGhhdDgwOgorCUBlY2hvICJCdWlsZGluZyBTRUNVUkUgS2VybWl0IGZvciBSZWQgSGF0IDguMC4uLiIKKwkkKE1BS0UpIGxpbnV4K2tyYjUra3JiNCtvcGVuc3NsK3psaWIrc2hhZG93K3BhbSBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiS0ZMQUdTID0gLURSSDgwICQoS0ZMQUdTKSIKKworcmVkaGF0ODArc3JwOgorCUBlY2hvICJCdWlsZGluZyBTRUNVUkUgS2VybWl0IGZvciBSZWQgSGF0IDguMC4uLiIKKwkkKE1BS0UpIGxpbnV4K2tyYjUra3JiNCtzcnArb3BlbnNzbCt6bGliK3NoYWRvdytwYW0gXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUyA9IC1EUkg4MCAkKEtGTEFHUykiCisKKyNSZWQgSGF0IExpbnV4IDcuMyAtIGZ1bGwgaW5zdGFsbCBpbmNsdWRlcyBLZXJiZXJvcyA1ICg0IGNvbXBhdCksIFBBTSwgU1NMLgorI0Fsc28gd29ya3MgYXJvdW5kIGJ1ZyBpbiBjdXJzZXMgaW4gd2hpY2ggdGVybWluYWwgZ29lcyBkZWFkIGFmdGVyCisjcmV0dXJuaW5nIGZyb20gZmlsZS10cmFuc2ZlciBkaXNwbGF5LgorcmVkaGF0NzM6CisJQGVjaG8gIkJ1aWxkaW5nIFNFQ1VSRSBLZXJtaXQgZm9yIFJlZCBIYXQgNy4zLi4uIgorCSQoTUFLRSkgbGludXgra3JiNStrcmI0K29wZW5zc2wremxpYitzaGFkb3crcGFtIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJLRkxBR1MgPSAtRFJINzMgJChLRkxBR1MpIgorCityZWRoYXQ3MytzcnA6CisJQGVjaG8gIkJ1aWxkaW5nIFNFQ1VSRSBLZXJtaXQgZm9yIFJlZCBIYXQgNy4zLi4uIgorCSQoTUFLRSkgbGludXgra3JiNStrcmI0K3NycCtvcGVuc3NsK3psaWIrc2hhZG93K3BhbSBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiS0ZMQUdTID0gLURSSDczICQoS0ZMQUdTKSIKKworI1JlZCBIYXQgTGludXggNy4yIC0gZnVsbCBpbnN0YWxsIGluY2x1ZGVzIEtlcmJlcm9zIDUgKDQgY29tcGF0KSwgUEFNLCBTU0wuCisjQWxzbyB3b3JrcyBhcm91bmQgYnVnIGluIGN1cnNlcyBpbiB3aGljaCB0ZXJtaW5hbCBnb2VzIGRlYWQgYWZ0ZXIKKyNyZXR1cm5pbmcgZnJvbSBmaWxlLXRyYW5zZmVyIGRpc3BsYXkuCityZWRoYXQ3MjoKKwlAZWNobyAiQnVpbGRpbmcgU0VDVVJFIEtlcm1pdCBmb3IgUmVkIEhhdCA3LjIuLi4iCisJJChNQUtFKSBsaW51eCtrcmI1K2tyYjQrb3BlbnNzbCt6bGliK3NoYWRvdytwYW0gXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUyA9IC1EUkg3MiAkKEtGTEFHUykiCisKK3JlZGhhdDcyK3NycDoKKwlAZWNobyAiQnVpbGRpbmcgU0VDVVJFIEtlcm1pdCBmb3IgUmVkIEhhdCA3LjIuLi4iCisJJChNQUtFKSBsaW51eCtrcmI1K2tyYjQrc3JwK29wZW5zc2wremxpYitzaGFkb3crcGFtIFwKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJLRkxBR1MgPSAtRFJINzIgJChLRkxBR1MpIgorCisjUmVkIEhhdCBMaW51eCA3LjEgLSBmdWxsIGluc3RhbGwgaW5jbHVkZXMgS2VyYmVyb3MgNSAoNCBjb21wYXQpLCBQQU0sIFNTTC4KKyNBbHNvIHdvcmtzIGFyb3VuZCBidWcgaW4gY3Vyc2VzIGluIHdoaWNoIHRlcm1pbmFsIGdvZXMgZGVhZCBhZnRlcgorI3JldHVybmluZyBmcm9tIGZpbGUtdHJhbnNmZXIgZGlzcGxheS4KK3JlZGhhdDcxOgorCUBlY2hvICJCdWlsZGluZyBTRUNVUkUgS2VybWl0IGZvciBSZWQgSGF0IDcuMS4uLiIKKwkkKE1BS0UpIGxpbnV4K2tyYjUra3JiNCtvcGVuc3NsK3psaWIrc2hhZG93K3BhbSBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiS0ZMQUdTID0gLURSSDcxICQoS0ZMQUdTKSIKKworcmVkaGF0NzErc3JwOgorCUBlY2hvICJCdWlsZGluZyBTRUNVUkUgS2VybWl0IGZvciBSZWQgSGF0IDcuMS4uLiIKKwkkKE1BS0UpIGxpbnV4K2tyYjUra3JiNCtzcnArb3BlbnNzbCt6bGliK3NoYWRvdytwYW0gXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUyA9IC1EUkg3MSAkKEtGTEFHUykiCisKKyNMaW51eCBvbiBJbnRlbCBQQyB3aXRoIEN5Z251cyBvciBNSVQgS2VyYmVyb3MgNSAxLjIuMiwgT3BlblNTTAorIyB3aXRoIFpMSUIgYW5kIFBBTSBhbmQgU2hhZG93IHBhc3N3b3JkcworbGludXgra3JiNStvcGVuc3NsK3psaWIrc2hhZG93K3BhbToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBMaW51eCBvbiBpMzg2IHdpdGggS1JCNSxTU0wuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTID0gLWcgLU8gLWZ1bnNpZ25lZC1jaGFyIC1waXBlIC1EUE9TSVggLURMSU5VWCAtRE5PQ09URk1DIFwKKwktRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfS0VSQkVST1MgIC1ES1JCNSAtRENLX1NIQURPVyBcCisJLURDS19FTkNSWVBUSU9OIC1EQ0tfQ0FTVCAtRENLX0RFUyAtRExJQkRFUyAtRENLX1NTTCAtRENLX1BBTSAtRFpMSUIgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURIQVZFX0NSWVBUX0ggXAorCSQoSzVJTkMpICQoSzVJTkMpL2tyYjUgJChTU0xJTkMpIFwKKwkkKEtGTEFHUykiICJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIiBcCisJIkxJQlMgPSAkKEs1TElCKSAkKFNTTExJQikgXAorCS1sbSAtbG5jdXJzZXMgLWx0ZXJtY2FwIC1sc3NsIC1sY3J5cHRvIC1sZ3NzYXBpX2tyYjUgXAorCS1sa3JiNSAtbGNvbV9lcnIgLWxrNWNyeXB0byAtbGNyeXB0IC1scmVzb2x2IC1scGFtIC1sZGwgLWx6IgorCitsaW51eG5vdGNwOgorCSQoTUFLRSkgbGludXggS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiS0ZMQUdTID0gLUROT05FVCAkKEtGTEFHUykiCisKKyMgIm1ha2UgbGludXhub3RjcCIgd2l0aCBsY2MgKHNlZSBodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvc29mdHdhcmUvbGNjKQorIyBsY2MgZG9lcyBub3QgdW5kZXJzdGFuZCB2YXJpb3VzIGdjYyBleHRlbnNpb25zOgorIyAgIl9faW5saW5lX18iIC0tIGNhbiBiZSBlbGltaW5hdGVkIGJ5IGFkZGluZyAiLURfX2lubGluZV9fPSIKKyMgICJfX2FzbV9fIGFuZCAibG9uZyBsb25nIiAtLSBpbiBoZWFkZXIgZmlsZXMsIHNob3VsZCBiZSBzdXJyb3VuZGVkIGJ5CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNpZm5kZWYoX19TVFJJQ1RfQU5TSV9fKSIvIiNlbmRpZiIKKyMgIGhvd2V2ZXIsIFRDUCByZXF1aXJlcyBzb21lIF9fYXNtX18gZnVuY3Rpb25zLCBzbyBjYW5ub3QgYmUgY29tcGlsZWQKK2xpbnV4bm90Y3AtbGNjOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4IHdpdGggbGNjIC4uLicKKwlAZWNobyAnUmVhZCBjb21tZW50cyBpbiBtYWtlZmlsZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBsY2MiICJDQzIgPSBsY2MiIFwKKwkiQ0ZMQUdTID0gLURMSU5VWCAtRFBPU0lYIC1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIFwKKwktVVRDUFNPQ0tFVCAtRExJTlVYRlNTVE5EIC1ETk9MRUFSTiAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSIgIkxJQlMgPSAtbGN1cnNlcyAtbHRlcm1jYXAiCisKKyMgTGludXggMC45OS4xNCB0aHJ1IDEuMCB3aXRoIGdjYywgZHluYW1pYyBsaWJyYXJpZXMsIGN1cnNlcywgVENQL0lQLgorIyBGb3IgTGludXggMS4yIG9yIGxhdGVyLCB1c2UgIm1ha2UgbGludXgiIChhYm92ZSkuCisjCisjIC1ETElOVVhGU1NUTkQgKExpbnV4IEZpbGUgU3lzdGVtIFN0YW5kYXJkKSBnaXZlcyBVVUNQIGxvY2tmaWxlIC92YXIvbG9jayB3aXRoCisjIHN0cmluZyBwaWQuICBSZW1vdmUgdGhpcyBhbmQgZ2V0IC91c3Ivc3Bvb2wvdXVjcCB3aXRoIGludCBwaWQsIHdoaWNoIHdhcyB1c2VkCisjIGluIGVhcmx5IExpbnV4IHZlcnNpb25zLgorIworIyBJZiB5b3UgZ2V0IGNvbXBpbGVyIGVycm9ycyByZWdhcmRpbmcgPGxpbnV4L3NlcmlhbC5oPiwgYWRkIC1ETk9ISVNQRUVELgorIworIyAtRENLX1BPU0lYX1NJRyAoUE9TSVggc2lnbmFsIGhhbmRsaW5nKSBpcyBnb29kIGZvciBMaW51eCByZWxlYXNlcyBiYWNrIHRvIGF0CisjIGxlYXN0IDAuOTkuMTQ7IGlmIGl0IGNhdXNlcyB0cm91YmxlIGZvciB5b3UsIGp1c3QgcmVtb3ZlIGl0LgorIworIyAtRENLX0NVUlNFUzogSGVyZSB3ZSBsaW5rIHdpdGggdGhlIHJlZ3VsYXIgY3Vyc2VzIGxpYnJhcnkuICBCdXQgeW91IHNob3VsZAorIyBiZSB1c2luZyBuY3Vyc2VzLiAgSW50ZXJuYWxseSwgdGhlIGNrdXVzeC5jIG1vZHVsZSBpbmNsdWRlcyA8Y3Vyc2VzLmg+LCBidXQKKyMgdGhpcyByZWFsbHkgc2hvdWxkIGJlIDxuY3Vyc2VzLmg+LiAgVGh1cyBpZiB5b3UgaGF2ZSB0aGUgbmV3IGN1cnNlcworIyBtYXRlcmlhbCwgeW91IHNob3VsZCBlaXRoZXIgaW5zdGFsbCBpdCB3aXRoIHRoZSBzdGFuZGFyZCBuYW1lcywgb3IgZWxzZQorIyBjcmVhdGUgc3ltYm9saWMgbGlua3MgZnJvbSB0aGUgc3RhbmRhcmQgbmFtZXMgdG8gdGhlIG5ldyBvbmVzLiAgSWYgeW91IGdldAorIyBjb21waWxlLXRpbWUgZXJyb3JzIGNvbXBsYWluaW5nIGFib3V0IGRhdGEgZGVmaW5pdGlvbnMgaW4gdGVybWNhcC5oLCBpdAorIyBtZWFucyB5b3UgaGF2ZSBuZXcga2VybmVsIG1hdGVyaWFsIG1peGVkIHdpdGggb2xkZXIgbGliYyBoZWFkZXIgZmlsZXMuICBUbworIyBmaXgsIGFkZCAiI2luY2x1ZGUgPHRlcm1pb3MuaD4iIHRvIHRoZSA8dGVybWNhcC5oPiBmaWxlLiAgT3IgaWYgYWxsIHRoaXMgaXMKKyMgdG9vIGNvbmZ1c2luZywgY3JlYXRlIGEgbmV3IG1ha2VmaWxlIGVudHJ5IGJhc2VkIG9uIHRoaXMgb25lLCBidXQgd2l0aAorIyAtRENLX0NVUlNFUyByZW1vdmVkIGZyb20gQ0ZMQUdTIGFuZCB0aGUgZW50aXJlIExJQlM9IGNsYXVzZSByZW1vdmVkLgorIworIyBCdXQgd2FpdCwgdGhlcmUncyBtb3JlLiAgT24gbW9zdCBMaW51eCBzeXN0ZW1zLCAtbHRlcm1jYXAgbXVzdCBiZSBpbmNsdWRlZAorIyBpbiBMSUJTLiAgQnV0IG9uIG90aGVycywgdGhlIGxpbmtlciBjb21wbGFpbnMgdGhhdCBsaWJ0ZXJtY2FwIGNhbid0IGJlCisjIGZvdW5kLiAgSW4gdGhhdCBjYXNlLCB0cnkgcmVtb3ZpbmcgLWx0ZXJtY2FwIGZyb20gTElCUz0uCisjCisjIEJ1dCB3YWl0LCB0aGVyZSdzIG1vcmUuICBUaGUgZm9ybWF0IG9mIHRoZSBQSUQgc3RyaW5nIGluIHRoZSBVVUNQIGxvY2tmaWxlCisjIGNoYW5nZWQgYmV0d2VlbiBMaW51eCBGU1NUTkQgMS4wIGFuZCAxLjIuICBJbiB0aGUgZWFybGllciBzdGFuZGFyZCwgaXQgaGFkCisjIGxlYWRpbmcgemVyb3M7IGluIHRoZSBzZWNvbmQsIGl0IGhhcyBsZWFkaW5nIHNwYWNlcy4gIEJ5IGRlZmF1bHQgdGhpcyBlbnRyeQorIyB1c2VzIHRoZSBuZXdlciBzdGFuZGFyZC4gIFRvIGZvcmNlIHRoZSBvbGRlciBvbmUsIGFkZCAtREZTU1RORDEwLgorIworIyAiVGhlIG5pY2UgdGhpbmcgYWJvdXQgdGhlIExpbnV4IHN0YW5kYXJkIGlzIHRoZXJlIGFyZSBzbyBtYW55IHRvIGNob29zZSBmcm9tIgorIworIyBOT1RFOiBSZW1vdmUgLURCSUdCVUZPSyBmb3Igc21hbGwtbWVtb3J5IG9yIGxpbWl0ZWQtcmVzb3VyY2Ugc3lzdGVtcy4KK2xpbnV4MTA6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTGludXggMS4wIG9yIGVhcmxpZXIuLi4nCisJQGVjaG8gJ0lNUE9SVEFOVDogUmVhZCB0aGUgY29tbWVudHMgaW4gdGhlIGxpbnV4IHNlY3Rpb24gb2YgdGhlJworCUBlY2hvICdtYWtlZmlsZSBpZiB5b3UgZ2V0IGNvbXBpbGF0aW9uIG9yIGxpbmsgZXJyb3JzLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1MgPSAtTyAtRFBPU0lYIC1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1ETElOVVggXAorCS1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLURPTElOVVhISVNQRUVEIC1ETk9MRUFSTiAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSIgIkxJQlMgPSAtbGN1cnNlcyAtbHRlcm1jYXAiCisKKyNUaGlzIHZlcnNpb24gd2FzIHVzZWQgZm9yIExpbnV4IHByaW9yIHRvIEMtS2VybWl0IDYuMC4xOTIuCisjTm93IHRoZSAiTGludXggRmlsZSBTeXN0ZW0gU3RhbmRhcmQiIGlzIGNvbnNpZGVyZWQgc3RhbmRhcmQsIGRpdHRvIFRDUC9JUC4KK2xpbnV4b2xkOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4Li4uJworCUBlY2hvICdGb3IgRlNTVE5ELXJlY29tbWVuZGVkIFVVQ1AgbG9ja2ZpbGVzLCB1c2U6JworCUBlY2hvICcgIG1ha2UgbGludXggIktGTEFHUz0tRExJTlVYRlNTVE5EIi4nCisJQGVjaG8gJ1JlYWQgY29tbWVudHMgaW4gbWFrZWZpbGUgZm9yIGFkZGl0aW9uYWwgb3B0aW9ucy4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTID0gLU8gLURMSU5VWCAtRFBPU0lYIC1EQ0tfQ1VSU0VTIC1EQ0tfUE9TSVhfU0lHIC1ETk9MRUFSTiBcCisJJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSIgIkxJQlMgPSAtbGN1cnNlcyAtbHRlcm1jYXAiCisKKyMgTHlueE9TIDIuMiB3aXRoIEdDQyBjb21waWxlciwgVENQL0lQIGFuZCBmdWxsc2NyZWVuIGRpc3BsYXkuCisjIFByb2JhYmx5IGFsc28gd29ya3Mgd2l0aCBMeW54IDIuMSwgYW5kIG1heWJlIGV2ZW4gTHlueCAyLjAuCisjIC1YIG1lYW5zIHVzZSB0ZXJtaW9zIHNlcmlhbCBkcml2ZXJzIHJhdGhlciB0aGFuIEJTRDQuMy1zdHlsZSBzZ3R0eSBkcml2ZXJzLgorIyBJZiB5b3UgaGF2ZSB0cm91YmxlIHdpdGggdGhpcywgdHJ5ICJtYWtlIGJzZCBLRkxBR1M9LUROT0ZEWkVSTyIuCitseW54OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEx5bnhPUyAyLjIgd2l0aCBUQ1AvSVAnCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTPSAtTyAtRFBPU0lYIC1ERElSRU5UIC1EU0VUUkVVSUQgLURDS19DVVJTRVMgLURUQ1BTT0NLRVQgXAorCS1EQ0tfQU5TSUMgLURMWU5YT1MgLUROT0xFQVJOIiAiTE5LRkxBR1MgPSAtWCIgIkxJQlMgPSAtbGN1cnNlcyAtbGJzZCIKKworbHlueDIyOgorCSQoTUFLRSkgbHlueCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJLRkxBR1M9JChLRkxBR1MpIgorCisjIEx5bnhPUyAyLjEgd2l0aCBHQ0MgY29tcGlsZXIgMS40MCBhbmQgVENQL0lQLgorbHlueDIxOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEx5bnhPUyAyLjEgd2l0aCBUQ1AvSVAnCisJJChNQUtFKSBrZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiQ0MgPSBnY2MiICJDQzIgPSBnY2MiIFwKKwkiQ0ZMQUdTPSAtTyAtRFNFVFJFVUlEIC1EVENQU09DS0VUIC1EQ0tfQU5TSUMgLURCU0Q0IC1ETFlOWE9TIiBcCisJIkxJQlMgPSAtbGJzZCIKKworI1NDTyBYZW5peCAyLjIuMSBmb3IgSUJNIFBDLCBYVCwgUFMyLzMwLCBvciBvdGhlciA4MDg4IG9yIDgwODYgbWFjaGluZQorI1Nob3VsZCB0aGlzIG5vdCB3b3JrLCB0cnkgc29tZSBvZiB0aGUgdHJpY2tzIGZyb20gc2NvMjg2LgorI05PVEU6IC1EUkVOQU1FIGlzIG9taXR0ZWQgZm9yIGVhcmx5IFNDTyBYZW5peCByZWxlYXNlcyBiZWNhdXNlIGl0IGRpZG4ndAorI2V4aXN0LCBvciBpdHMgc2VtYW50aWNzIHdlcmUgZGlmZmVyZW50IGZyb20gdGhlIGxhdGVyIFBPU0lYLWNvbXBsaWFudAorI3ZlcnNpb24gb2YgcmVuYW1lKCkuCitzY284NjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gWGVuaXgvODYuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURYRU5JWCAtRE5PRklMRUggLUROT0lLU0QgLUROT1VOSUNPREUgLUROT0xFQVJOIFwKKwkkKEtGTEFHUykgLUR1bml4IC1GIDMwMDAgLWkgLU0wbWUiIFwKKwkiTE5LRkxBR1MgPSAtRiAzMDAwIC1pIC1zIC1NMG1lIiAiTElCUyA9IC1seCIKKworI1NDTyBYZW5peC8yODYgMi4yLjEsIGUuZy4gZm9yIElCTSBQQy9BVCwgUFMvMiBNb2RlbCA1MCwgZXRjLgorI1JlcG9ydGVkbHksIHRoaXMgIm1ha2UiIGNhbiBmYWlsIHNpbXBseSBiZWNhdXNlIG9mIHRoZSBzaXplIG9mIHRoaXMKKyNtYWtlZmlsZS4gIElmIHRoYXQgaGFwcGVucywgdXNlICJtYWtlTCIsIG9yIGVkaXQgb3V0IHNvbWUgb2YgdGhlCisjb3RoZXIgZW50cmllcy4gIE5vIGRlYnVnZ2luZyBvciBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uLgorc2NvMjg2OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNDTyBYZW5peC8yODYuLi4nCisJQGVjaG8gJ0lmIG1ha2UgZmFpbHMsIHRyeSB1c2luZyBtYWtlTC4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLXhlbml4IC1zIC1PIC1MQVJHRSAtRFhFTklYIC1ETk9GSUxFSCAtRHVuaXggLURSRENISyAtRE5BUCBcCisJLUROT0lLU0QgLUROT0RFQlVHIC1ETk9UTE9HIC1ETk9DU0VUUyAtRE5PTEVBUk4gXAorCSQoS0ZMQUdTKSAtRiAzMDAwIC1pIC1NMmxldDE2IiBcCisJIkxJQlMgPSAtbHgiICJMTktGTEFHUyA9IC14ZW5peCAtcyAtTyAtTEFSR0UgLUYgMzAwMCAtaSAtTTJsZXQxNiIKKworI1NDTyBYZW5peC8yODYgMi4yLjEsIGUuZy4gZm9yIElCTSBQQy9BVCwgUFMvMiBNb2RlbCA1MCwgZXRjLgorI0FzIGFib3ZlLCBidXQgd2l0aCBIREJVVUNQIChUaGlzIG9uZSBtaWdodCBuZWVkIGZpeGluZyAtLSBzZWUgc2NvMjg2KS4KK3NjbzI4NmhkYjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gWGVuaXgvMjg2IHdpdGggSERCIFVVQ1AuLi4nCisJQGVjaG8gJ0lmIG1ha2UgZmFpbHMsIHRyeSB1c2luZyBtYWtlTC4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLXMgLU8gLUxBUkdFIC1EWEVOSVggLUROT0ZJTEVIIC1EdW5peCAtRFJEQ0hLIC1ETkFQIFwKKwktREhEQlVVQ1AgLUROT0lLU0QgLUROT1VOSUNPREUgLUROT0xFQVJOIFwKKwkkKEtGTEFHUykgLUYgMzAwMCAtaSAtTTJsZXQzMiIgXAorCSJMSUJTID0gLWx4IiAiTE5LRkxBR1MgPSAtcyAtTyAtTEFSR0UgLUYgMzAwMCAtaSAtTTJsZXQzMiIKKworI1NDTyBYZW5peC8zODYgMi4yLjIgYW5kIDIuMi4zCitzY28zODY6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0NPIFhlbml4LzM4NiAyLjIuMi4uLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRFhFTklYIC1ETk9GSUxFSCAtRE5PSUtTRCAtRE5PUkVESVJFQ1QgLUROT0xFQVJOIFwKKwktRHVuaXggLURSRENISyAtRE5BUCAtRE5PVU5JQ09ERSAkKEtGTEFHUykgLU90Y2wgLU0zZSIgXAorCSJMTktGTEFHUyA9IC1zIiAiTElCUyA9IC1seCIKKworI1NDTyBYRU5JWC8zODYgMi4yLjMgd2l0aCBFeGNlbGFuIFRDUC9JUCArIGN1cnNlcy4KKyMgTk9URTogVGhpcyBvbmUgbWlnaHQgbmVlZCBzb21lIHdvcmsgaW4gQy1LZXJtaXQgNi4wLgorIyBZb3UgbWlnaHQgbmVlZCB0byBpbmNsdWRlIC91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaAorIyBjb250YWluaW5nICJ0eXBlZGVmIGNoYXIgKmNhZGRyX3Q7Ii4gIFRoZW4gYXQgbGVhc3QgaXQgY29tcGlsZXMuCitzY28zODZuZXRjOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNDTyBYZW5peC8zODYgMi4yLjMgKyBFeGNlbGFuIFRDUCcKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtSS91c3IvaW5jbHVkZS9leG9zIC1EWEVOSVggLURDS19DVVJTRVMgLUROT1VOSUNPREUgXAorCS1EdW5peCAtRFJEQ0hLIC1ETkFQIC1EVENQU09DS0VUIC1ERVhDRUxBTiAtRE5PSkMgLUROT01LRElSIC1ETk9GSUxFSCBcCisJLUROT0xFQVJOIC1ETk9SRURJUkVDVCAtRE5PSUtTRCAtRE5PX0ROU19TUlYgJChLRkxBR1MpIC1PdGNsIC1NM2UiIFwKKwkiTE5LRkxBR1MgPSAtcyIgIkxJQlMgPSAtbGMgLWx4IC1sc29ja2V0IC1sY3Vyc2VzIC1sdGVybWNhcCIKKworI1NDTyBYRU5JWC8zODYgMi4zLjMgd2l0aCBnY2MgMS4zNyBvciBsYXRlci4uLgorc2NvMzg2Z2NjOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNDTyBYZW5peC8zODYgMi4zLjMsIGdjYy4uLicKKwlAZWNobyAnQWRkIC1EX05PX1BST1RPVFlQRSBpZiB5b3UgaGF2ZSB0cm91YmxlIHdpdGggWGVuaXggaGVhZGVyIGZpbGVzJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDID0gZ2NjIiAiQ0MyID0gZ2NjIiBcCisJIkNGTEFHUz0gLU8gLURYRU5JWCAtRFNWUjMgLUROT0ZJTEVIIC1ESERCVVVDUCAtRFJEQ0hLIC1ETkFQIFwKKwktRE5PSkMgLUROT0RFQlVHIC1ETk9VTklDT0RFIC1ETk9MRUFSTiAkKEtGTEFHUykgXAorCS10cmFkaXRpb25hbCAtZnBjYy1zdHJ1Y3QtcmV0dXJuIC1mc3RyZW5ndGgtcmVkdWNlIFwKKwktRE1fQklURklFTERTIC1ETV9DT0ZGIC1ETV9JMzg2IC1ETV9JODYgLURNX0k4NlNNIFwKKwktRE1fSU5URVJOQVQgLURNX1NEQVRBIC1ETV9TVEVYVCAtRE1fU1lTMyAtRE1fU1lTNSBcCisJLURNX1NZU0lJSSAtRE1fU1lTViAtRE1fV09SRFNXQVAgLURNX1hFTklYIC1ETk9JS1NEIC1ETk9SRURJUkVDVCBcCisJLURQV0lEX1Q9aW50ICIgIkxOS0ZMQUdTID0gLXMiICJMSUJTID0gLWx4IgorCisjQXMgYWJvdmUsIGJ1dCB3aXRoIGN1cnNlcy4uLgorc2NvMzg2Z2NjYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gWGVuaXgvMzg2IDIuMy4zLCBnY2MuLi4nCisJQGVjaG8gJ0FkZCAtRF9OT19QUk9UT1RZUEUgaWYgeW91IGhhdmUgdHJvdWJsZSB3aXRoIFhlbml4IGhlYWRlciBmaWxlcycKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9ICJDQyA9IGdjYyIgIkNDMiA9IGdjYyIgXAorCSJDRkxBR1M9IC1PIC1EWEVOSVggLURTVlIzIC1ETk9GSUxFSCAtREhEQlVVQ1AgLURSRENISyAtRE5BUCBcCisJLUROT0pDIC1ETk9ERUJVRyAtRENLX0NVUlNFUyAtRE5PVU5JQ09ERSAtRE5PTEVBUk4gJChLRkxBR1MpIFwKKwktdHJhZGl0aW9uYWwgLWZwY2Mtc3RydWN0LXJldHVybiAtZnN0cmVuZ3RoLXJlZHVjZSBcCisJLURNX0JJVEZJRUxEUyAtRE1fQ09GRiAtRE1fSTM4NiAtRE1fSTg2IC1ETV9JODZTTSAtRE5PUkVESVJFQ1QgXAorCS1ETV9JTlRFUk5BVCAtRE1fU0RBVEEgLURNX1NURVhUIC1ETV9TWVMzIC1ETV9TWVM1IFwKKwktRE1fU1lTSUlJIC1ETV9TWVNWIC1ETV9XT1JEU1dBUCAtRE1fWEVOSVggLUROT0lLU0QgXAorCS1EUFdJRF9UPWludCAiICJMTktGTEFHUyA9IC1zIiAiTElCUyA9IC1seCAtbGN1cnNlcyAtbHRlcm1saWIiCisKKyNTQ08gVU5JWCAoYW5kIE9EVCkgZW50cmllcy4uLgorIworI05PVEU6IEFsbCBTQ08gVU5JWCBlbnRyeSBMSUJTIHNob3VsZCBoYXZlICItbGNfcyAtbGMgLWx4IiBJTiBUSEFUIE9SREVSIChpZgorI3NoYXJlZCBDIGxpYnJhcnkgaXMgZGVzaXJlZCksIG9yIGVsc2UgIi1sYyAtbHgiIElOIFRIQVQgT1JERVIuICBVc2Ugc2hhcmVkIEMKKyNsaWJyYXJpZXMgdG8gc2F2ZSBtZW1vcnksIGJ1dCB0aGVuIGRvbid0IGV4cGVjdCB0byBydW4gdGhlIHJlc3VsdGluZyBiaW5hcnkKKyNvbiBhIGRpZmZlcmVudCBtYWNoaW5lLiAgV2hlbiB1c2luZyAtbGNfcywgeW91IG11c3QgYWxzbyB1c2UgLWxjLCBiZWNhdXNlIHRoZQorI3NoYXJlZCBDIGxpYnJhcnkgZG9lcyBub3QgY29udGFpbiBhbGwgb2YgbGliYy5hLiAgQW5kIGluIGFsbCBjYXNlcywgLWxjIG11c3QKKyNBTFdBWVMgcHJlY2VkZSAtbHguCisjCisjQU5PVEhFUiBOT1RFOiAtRFJFTkFNRSBpcyBpbmNsdWRlZCBpbiBhbGwgU0NPIFVOSVggZW50cmllcy4gIFJlbW92ZSBpdCBpZiBpdAorI2NhdXNlcyB0cm91YmxlLiAgTm8gaGFybSBpcyBkb25lIGJ5IHJlbW92aW5nIGl0IChzZWUgY2t1aW5zLnR4dCkuCisjCisjQU5EIEFOT1RIRVI6IEluIHRoZW9yeSwgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHJ1biBTQ08gVU5JWCBiaW5hcmllcyBvbgorI1NDTyBYZW5peCAyLjMgYW5kIGxhdGVyLiAgSW4gcHJhY3RpY2UsIHRoaXMgbWlnaHQgbm90IHdvcmsgYmVjYXVzZSBvZiB0aGUKKyNsaWJyYXJpZXMsIGV0Yy4gIEFsc28sIGRvbid0IGFkZCB0aGUgLWxpbmsgLXogc3dpdGNoICh3aGljaCBpcyBzdXBwb3NlZCB0bworI3Jvb3Qgb3V0IHJlZmVyZW5jZXMgdG8gbnVsbCBwb2ludGVycykgYmVjYXVzZSBpdCBtYWtlcyBVTklYIGJpbmFyaWVzIGNvcmUKKyNkdW1wIHdoZW4gdGhleSBhcmUgcnVuIHVuZGVyIFhlbml4LgorCisjTk9URTogLU90Y2wgcmVtb3ZlZCBhbmQgcmVwbGFjZWQgYnkgLU8sIHNpbmNlIC1PdGNsIHByb2R1Y2VkIGluY29ycmVjdCBjb2RlLgorI1NDTyBVTklYLzM4NiAzLjIuMCwgMy4yLjEsIGFuZCBTQ08gWGVuaXggMi4zLngKK3NjbzNyMjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gVU5JWC8zODYgMy4yLjAgb3IgMy4yLjEgLi4uJworCUBlY2hvICdXYXJuaW5nOiBJZiBtYWtlIGJsb3dzIHVwLCBlZGl0IHRoZSBtYWtlZmlsZSB0byBqb2luJworCUBlY2hvICd0aGUgZm9sbG93aW5nIHRocmVlIGNvbnRpbnVlZCBsaW5lcyBpbnRvIG9uZSBsaW5lLicKKwlAZWNobyAnQWxzbywgcmVtb3ZlIC1EUkVOQU1FIGlmIF9yZW5hbWUgdW5yZXNvbHZlZCBhdCBsaW5rIHRpbWUuJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EWEVOSVggLURTVlIzIC1ETk9GSUxFSCAtREhEQlVVQ1AgLURSRENISyAtRE5BUCAtRE5PTEVBUk4gXAorCS1EUkVOQU1FIC1ETk9JS1NEIC1ETk9KQyAkKEtGTEFHUykgLU8iIFwKKwkiTE5LRkxBR1MgPSAtcyIgIkxJQlMgPSAtbGMgLWx4IgorCisjU0NPIFVOSVgvMzg2IDMuMi4wIGFuZCBTQ08gWGVuaXggMi4zLnggd2l0aCBFeGNlbGFuIFRDUC9JUCBzdXBwb3J0LgorI0luIGNhc2Ugb2YgY29tcGlsYXRpb24gb3IgcnVudGltZSBwcm9ibGVtcywgdHJ5IGFkZGluZworIyItRFVJRF9UPWludCAtREdJRF9UPWludCIgdG8gdGhlIENGTEFHUy4gIElmIHRoYXQgZG9lc24ndCB3b3JrLCB0cnkKKyMiLURVSURfVD11aWRfdCAtREdJRF9UPWdpZF90Ii4KK3NjbzNyMm5ldDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gVU5JWC8zODYgLyBFeGNlbGFuLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1JL3Vzci9pbmNsdWRlL2V4b3MgLURYRU5JWCAtRFNWUjMgLUROT0ZJTEVIIC1ETk9MRUFSTiBcCisJLURIREJVVUNQIC1EUkRDSEsgLUROQVAgLURSRU5BTUUgLURUQ1BTT0NLRVQgLURFWENFTEFOIC1ETk9KQyBcCisJLUROT0lLU0QgLUROT1JFRElSRUNUICQoS0ZMQUdTKSAtTyIgXAorCSJMTktGTEFHUyA9IC1zIiAiTElCUyA9IC1sYyAtbHggLWxzb2NrZXQiCisKKyNTQ08gVU5JWC8zODYgMy4yLjAgYW5kIFNDTyBYZW5peCAyLjMueCB3aXRoIEV4Y2VsYW4gVENQL0lQIHN1cHBvcnQuCisjQXMgYWJvdmUsIHdpdGggY3Vyc2VzIGFkZGVkLgorc2NvM3IybmV0YzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gVU5JWC8zODYgLyBFeGNlbGFuIC8gY3Vyc2VzLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1JL3Vzci9pbmNsdWRlL2V4b3MgLURYRU5JWCAtRFNWUjMgLUROT0ZJTEVIIC1ETk9MRUFSTiBcCisJLURIREJVVUNQIC1EUkRDSEsgLUROQVAgLURUQ1BTT0NLRVQgLURFWENFTEFOIC1ETk9KQyAkKEtGTEFHUykgXAorCS1EUkVOQU1FIC1EQ0tfQ1VSU0VTIC1ETk9SRURJUkVDVCAtRE5PSUtTRCAtTyIgIkxOS0ZMQUdTID0gLXMiIFwKKwkiTElCUyA9IC1sYyAtbHggLWxzb2NrZXQgLWxjdXJzZXMgLWx0ZXJtY2FwIgorCisjU0NPIFVOSVggMy4yLnggb3IgU0NPIFhlbml4IDIuMy54IHdpdGggUmFjYWwgSW50ZXJMYW4gVENQL0lQIHN1cHBvcnQKKyMgRXh0cmEgY29tcGlsZSBmbGFncyBmb3Igb3RoZXIgdmVyc2lvbiBvZiBSYWNhbCBJbnRlckxhbiBUQ1AvSVA6CisjIFhlbml4Mjg2L05QNjIxLTI4NiwgdXNlIC1NbCAtRFBBUkFNSCAtRElOVEVSTEFOIC1EaTI4NiAtRFNZU1YKKyMgWGVuaXgzODYvTlA2MjEtMzg2LCB1c2UgLURQQVJBTUggLURJTlRFUkxBTiAtRGkzODYgLURTWVNWCisjIElTQzM4Nml4L05QNjIySSwgdXNlIC1EU1lTViAtRGkzODYKKyMgU0NPIFVuaXgzLjIvTlA2MjJTLCB1c2UgLURTWVNWIC1EaTM4NiAtRFNDT19VTklYCisjIEFUJlQgU1ZSMy4yL05QNjIyQSwgdXNlIC1EU1lTViAtRGkzODYgLURBVFQKK3NjbzNyMm5ldHJpOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNDTyBVTklYLzM4NiAvIFJhY2FsIEludGVyTGFuLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1JL3Vzci9pbmNsdWRlL2ludGVybGFuIC1EWEVOSVggLUROT0ZJTEVIIC1ESERCVVVDUCBcCisJLURTVlIzIC1EUkRDSEsgLUROQVAgLURUQ1BTT0NLRVQgLURQQVJBTUggLURJTlRFUkxBTiAtRGkzODYgLURTWVNWIFwKKwktRFJFTkFNRSAtRE5PUkVESVJFQ1QgLUROT0lLU0QgLUROT0pDIC1ETk9MRUFSTiAkKEtGTEFHUykgLU90Y2wgLU0zZSIgXAorCSJMTktGTEFHUyA9IC1zIiAiTElCUyA9IC1sYyAtbHggLWx0Y3AiCisKKyMgU0NPIFhFTklYLzM4NiAyLjMuMyBTeXNWIHdpdGggU0NPIFRDUC9JUAorIyBTeXN0ZW0gViBTVFJFQU1TIFRDUCBkZXZlbG9wZWQgYnkgTGFjaG1hbiBBc3NvY2lhdGVzIEluYyBhbmQKKyMgQ29udmVyZ2VudCBUZWNobm9sb2dpZXMuCisjIC1EUkVOQU1FIHJlbW92ZWQgc2luY2Ugc29tZSByZXBvcnRzIGluZGljYXRlIGl0IGlzIG5vdCBzdXBwb3J0ZWQKKyMgKHdoZXJlYXMgb3RoZXJzIHNheSBpdCBpcy4pCitzY28zcjJsYWk6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0NPIFhFTklYLzM4NiAyLjMuMyArIFRDUC9JUC4uLicKKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRExBSV9UQ1AgLURpMzg2IC1EWEVOSVggLURTVlIzIC1ETk9GSUxFSCAtREhEQlVVQ1AgLURSRENISyBcCisJLUROQVAgLURUQ1BTT0NLRVQgLURQV0lEX1Q9aW50IC1ETk9SRURJUkVDVCAtRE5PSUtTRCAtRE5PTEVBUk4gXAorCSQoS0ZMQUdTKSAtT3RjbCAtaSAtTTNlIiBcCisJIkxOS0ZMQUdTID0gLWkgLXMiICJMSUJTID0gLWxjIC1seCAtbHNvY2tldCIKKworc2NvM3IybGFpYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gWEVOSVgvMzg2IDIuMy4zICsgVENQL0lQLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1ETEFJX1RDUCAtRGkzODYgLURYRU5JWCAtRFNWUjMgLUROT0ZJTEVIIC1ESERCVVVDUCAtRFJEQ0hLIFwKKwktRE5BUCAtRFRDUFNPQ0tFVCAtRENLX0FOU0lDIC1EQ0tfQ1VSU0VTIC1ETV9URVJNSU5GTyAtRE5PTEVBUk4gXAorCS1EUFdJRF9UPWludCAtRE5PUkVESVJFQ1QgLUROT0lLU0QgJChLRkxBR1MpIC1PdGNsIC1pIC1NM2UiIFwKKwkiTE5LRkxBR1MgPSAtaSAtcyIgIkxJQlMgPSAtbHRpbmZvIC1sYyAtbHggLWxzb2NrZXQiCisKKyNTQ08gVU5JWC8zODYgMy4ydjIgKFBPU0lYIGpvYiBjb250cm9sKSwgc2hhcmVkIGxpYnJhcmllcy4KK3NjbzNyMjI6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0NPIFVOSVgvMzg2IDMuMnYyIC4uLicKKwltYWtlIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRFhFTklYIC1EU1ZSMyAtRE5PRklMRUggLURIREJVVUNQIC1EUkRDSEsgLUROT0xFQVJOIFwKKwktRE5BUCAtRFJFTkFNRSAtRFBJRF9UPXBpZF90IC1EUFdJRF9UPWludCAtRERJUkVOVCAtRE5PSUtTRCBcCisJLUROT1JFRElSRUNUICQoS0ZMQUdTKSAtTyIgXAorCSJMTktGTEFHUyA9IC1zIiAiTElCUyA9IC1sY19zIC1sYyAtbHgiCisKKyNTQ08gVU5JWC8zODYgMy4ydjIsIFBPU0lYIGpvYiBjb250cm9sLCBmdWxsc2NyZWVuIGZpbGUgdHJhbnNmZXIgZGlzcGxheSwKKyNkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLCBzaGFyZWQgQyBsaWJyYXJ5CitzY28zcjIyYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gVU5JWC8zODYgMy4ydjIgLi4uJworCUBlY2hvICdXYXJuaW5nOiBJZiBtYWtlIGJsb3dzIHVwLCBlZGl0IHRoZSBtYWtlZmlsZSB0byBqb2luJworCUBlY2hvICd0aGUgZm9sbG93aW5nIGZvdXIgY29udGludWVkIGxpbmVzIGludG8gb25lIGxpbmUuJworCW1ha2Ugd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EWEVOSVggLURTVlIzIC1ETk9GSUxFSCAtREhEQlVVQ1AgLURSRENISyAtRE5BUCAtRE5PTEVBUk4gXAorCS1EQ0tfQ1VSU0VTIC1ERElSRU5UIC1EUkVOQU1FIC1ETk9SRURJUkVDVCAtRE5PSUtTRCBcCisJLURQSURfVD1waWRfdCAtRFBXSURfVD1pbnQgJChLRkxBR1MpIC1PIiBcCisJIkxOS0ZMQUdTID0gLXMiICJMSUJTID0gLWxjdXJzZXMgLWxjX3MgLWxjIC1seCIKKworI1NDTyBVTklYLzM4NiAzLjJ2MiB3aXRoIGdjYyAxLjQwIG9yIGxhdGVyIChQT1NJWCBqb2IgY29udHJvbCkKK3NjbzNyMjJnY2M6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0NPIFVOSVgvMzg2IDMuMnYyLCBnY2MnCisJQGVjaG8gJ1dhcm5pbmc6IElmIG1ha2UgYmxvd3MgdXAsIGVkaXQgdGhlIG1ha2VmaWxlIHRvIGpvaW4nCisJQGVjaG8gJ3RoZSBmb2xsb3dpbmcgc2V2ZW4gY29udGludWVkIGxpbmVzIGludG8gb25lIGxpbmUuJworCW1ha2Ugd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDID0gZ2NjIiBcCisJIkNGTEFHUz0gLU8gLURQT1NJWCAtRFhFTklYIC1EU1ZSMyAtRE5PRklMRUggLURIREJVVUNQIC1EUkRDSEsgLUROQVAgXAorCS1ETk9MRUFSTiAtRFJFTkFNRSAtdHJhZGl0aW9uYWwgLWZwY2Mtc3RydWN0LXJldHVybiAtZnN0cmVuZ3RoLXJlZHVjZSBcCisJLURNX0JJVEZJRUxEUyAtRE1fQ09GRiAtRE1fSTM4NiAtRE1fSTg2IC1ETV9JODZTTSBcCisJLURNX0lOVEVSTkFUIC1ETV9TREFUQSAtRE1fU1RFWFQgLURNX1NZUzMgLURNX1NZUzUgXAorCS1ETV9TWVNJSUkgLURNX1NZU1YgLURNX1VOSVggLURNX1dPUkRTV0FQIC1ETV9YRU5JWCAtRHVuaXggXAorCS1EUElEX1Q9cGlkX3QgLURQV0lEX1Q9aW50IC1ETk9SRURJUkVDVCAtRE5PSUtTRCAkKEtGTEFHUykgIiBcCisJIkxOS0ZMQUdTID0gLXMiICJMSUJTID0gLWxjX3MgLWxjIC1seCIKKworI1NDTyBVTklYLzM4NiAzLjJ2MiAoT0RUIDEuMSkgKFBPU0lYIGpvYiBjb250cm9sKSB3aXRoIFNDTyBUQ1AvSVAsIHNoYXJlZCBsaWJzCisjUmVxdWlyZXMgU0NPIFRDUC9JUCBvciBPRFQgZGV2ZWxvcG1lbnQgc3lzdGVtIGZvciB0ZWxuZXQuaCwgZXRjLgorc2NvM3IyMm5ldDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gVU5JWC8zODYgMy4yLjIgKyBUQ1AvSVAuLi4nCisJQGVjaG8gJ1dhcm5pbmc6IElmIG1ha2UgYmxvd3MgdXAsIGVkaXQgdGhlIG1ha2VmaWxlIHRvIGpvaW4nCisJQGVjaG8gJ3RoZSBmb2xsb3dpbmcgdGhyZWUgY29udGludWVkIGxpbmVzIGludG8gb25lIGxpbmUuJworCW1ha2UgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EWEVOSVggLURTVlIzIC1ETk9GSUxFSCAtREhEQlVVQ1AgLURSRENISyAtRE5BUCAtRFRDUFNPQ0tFVCBcCisJLURSRU5BTUUgLURQSURfVD1waWRfdCAtRFBXSURfVD1pbnQgLURESVJFTlQgLUROT1JFRElSRUNUIC1ETk9JS1NEIFwKKwkkKEtGTEFHUykgLU8iICJMTktGTEFHUyA9IC1zIiAiTElCUyA9IC1sc29ja2V0IC1sY19zIC1sYyAtbHgiCisKKyNBcyBhYm92ZSwgYnV0IHdpdGggY3Vyc2VzIGZvciBmdWxsc2NyZWVuIGZpbGUgdHJhbnNmZXIgZGlzcGxheS4KKyNSZXF1aXJlcyBTQ08gVENQL0lQIG9yIE9EVCBkZXZlbG9wbWVudCBzeXN0ZW0gZm9yIHRlbG5ldC5oLCBldGMuCitzY28zcjIybmV0YzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gVU5JWC8zODYgMy4ydjIgKyBUQ1AvSVAuLi4nCisJQGVjaG8gJ1dhcm5pbmc6IElmIG1ha2UgYmxvd3MgdXAsIGVkaXQgdGhlIG1ha2VmaWxlIHRvIGpvaW4nCisJQGVjaG8gJ3RoZSBmb2xsb3dpbmcgdGhyZWUgY29udGludWVkIGxpbmVzIGludG8gb25lIGxpbmUuJworCW1ha2UgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNGTEFHUz0gXAorCS1EWEVOSVggLURTVlIzIC1ETk9GSUxFSCAtREhEQlVVQ1AgLURSRENISyAtRE5BUCAtRFRDUFNPQ0tFVCAtRFJFTkFNRSBcCisJLURDS19DVVJTRVMgLURESVJFTlQgLUROT0lLU0QgLUROT1JFRElSRUNUIFwKKwktRFBJRF9UPXBpZF90IC1EUFdJRF9UPWludCAtTyAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtcyIgIkxJQlMgPSAtbGN1cnNlcyAtbHNvY2tldCAtbGNfcyAtbGMgLWx4IgorCisjU0NPIFhFTklYIDIuMy40LCBubyBjdXJzZXMsIG5vIFRDUC9JUCwgbm8gSUtTRC4KKyNUaGlzIG9uZSBidWlsdCBhbmQgdGVzdGVkIGluIEMtS2VybWl0IDcuMC4KKyNsY2ZwIGlzIEMgbGlicmFyeSBmbG9hdGluZy1wb2ludCBzdXBwb3J0LgorI1VzZSAtTTMgdG8gZ2VuZXJhdGUgMzItYml0IGkzODYgY29kZSBpbnN0ZWFkIG9mIDE2LWJpdCBzZWdtZW50ZWQgaTI4NiBjb2RlLgorI1VzZSAtTWUgdG8gZW5hYmxlIE1TIG5vbnN0YW5kYXJkIGtleXdvcmRzIGluIHN5c3RlbSBoZWFkZXJzLgorI1VzZSAtVzIgb3IgVzMgdG8gaW5jcmVhc2UgdGhlIHdhcm5pbmcgbGV2ZWwuCitzY28yMzQ6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0NPIFhFTklYIDIuMy40Li4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EU0NPMzIgLURYRU5JWCAtRE5PRklMRUggLURIREJVVUNQIC1EUkRDSEsgLUROT0xFQVJOIFwKKwktRE5BUCAtRE5PSkMgLUROT0NPVEZNQyAtRE5PSUtTRCAtRE5PUkVESVJFQ1QgLUROT1ROQ09ERSAtRE5PR0ZUSU1FUiBcCisJLUROT1RJTUVWQUwgLUROT1RJTUVaT05FIC1ETk9TWU1MSU5LIC1EU0NPMjM0IC1ERENMR0VUQ1dEICQoS0ZMQUdTKSBcCisJLU90Y2wiICJMTktGTEFHUyA9IC1zIiAiTElCUyA9IC1sY2ZwIC1sYyAtbHgiCisKKyNTQ08gWEVOSVggMi4zLjQsIG5vIFRDUC9JUCwgbm8gSUtTRCwgYnV0IHdpdGggY3Vyc2VzLgorIyBCdWlsdCBhbmQgdGVzdGVkIGluIEMtS2VybWl0IDcuMC4KKyMgTm90ZTogWEVOSVggMi4zLjQgZG9lcyBub3QgaGF2ZSBuZXd0ZXJtKCkgc28gbm8gcG9pbnQgaW4gYWRkaW5nIC1EQ0tfTkVXVEVSTS4KK3NjbzIzNGM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0NPIFhFTklYIDIuMy40ICsgY3Vyc2VzLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EU0NPMzIgLURYRU5JWCAtRE5PRklMRUggLURIREJVVUNQIC1EUkRDSEsgLUROT0xFQVJOIFwKKwktRE5BUCAtRE5PSkMgLUROT0NPVEZNQyAtRE5PSUtTRCAtRE5PUkVESVJFQ1QgLUROT1ROQ09ERSAtRE5PR0ZUSU1FUiBcCisJLUROT1RJTUVWQUwgLUROT1RJTUVaT05FIC1ETk9TWU1MSU5LIC1EQ0tfQ1VSU0VTIC1EU0NPMjM0IFwKKwktRERDTEdFVENXRCAkKEtGTEFHUykgLU90Y2wiIFwKKwkiTE5LRkxBR1MgPSAtcyIgIkxJQlMgPSAtbGNmcCAtbGMgLWx0aW5mbyAtbHgiCisKKyNTQ08gWEVOSVggMi4zLjQgd2l0aCBTQ08gVENQL0lQIGFuZCBjdXJzZXMsIG5vIElLU0QuCisjIEJ1aWx0IGFuZCB0ZXN0ZWQgaW4gQy1LZXJtaXQgNy4wLiAgVENQL0lQIHdvcmtzIGFuZCBjdXJzZXMgd29ya3MuCisjIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgdGFyZ2V0IGluY2x1ZGVkIC1sbWFsbG9jLCBidXQgdGhpcyBjYXVzZWQgImVycm9yOgorIyAiIF9jYWxsb2MgOiBzeW1ib2wgZGVmaW5lZCBtb3JlIHRoYW4gb25jZSIgYXQgbGluayB0aW1lIHNvIEkgcmVtb3ZlZCBpdC4KKyMgUmVzdWx0cyBhcmUgbGlrZWx5IHRvIHZhcnkgZGVwZW5kaW5nIG9uIGV4YWN0bHkgd2hpY2ggdmVyc2lvbiBvZiB0aGUgU0RLCisjIGFuZCBUQ1AvSVAgU0RLIHlvdSBoYXZlLgorc2NvMjM0bmV0YzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gWEVOSVggMi4zLjQgKyBUQ1AgKyBjdXJzZXMuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURTQ08zMiAtRFhFTklYIC1ETk9GSUxFSCAtREhEQlVVQ1AgLURSRENISyAtRE5PTEVBUk4gXAorCS1ETkFQIC1ETk9KQyAtRE5PQ09URk1DIC1ETk9JS1NEIC1ETk9SRURJUkVDVCAtRE5PVE5DT0RFIC1ETk9HRlRJTUVSIFwKKwktRE5PVElNRVZBTCAtRE5PVElNRVpPTkUgLUROT1NZTUxJTksgLURDS19DVVJTRVMgLURTQ08yMzQgXAorCS1ERENMR0VUQ1dEIC1EVENQU09DS0VUIC1ETk9fRE5TX1NSViAkKEtGTEFHUykgLU90Y2wiIFwKKwkiTE5LRkxBR1MgPSAtcyIgIkxJQlMgPSAtbHRpbmZvIC1sc29ja2V0IC1sY2ZwIC1sYyAtbHgiCisKKyMgU0NPIDMuMnY0LnggdGFyZ2V0cy4uLgorCisjICBOT1RFOiBBZGQgLUREQ0xQT1BFTiBhbmQvb3IgLUREQ0xGRE9QRU4gdG8gYW55U0NPIDMuMnY0Lnggbm9uLWdjYyBlbnRyaWVzCisjICB0aGF0IGNvbXBsYWluIGFib3V0IGZkb3BlbigpIG9yIHBvcGVuKCkgYXQgY29tcGlsZSB0aW1lLiAgVGhleSBjb21waWxlIE9LCisjICB3aXRob3V0IHRoZXNlIGZsYWdzIGFzIG9mIEp1bHkgMTk5OS4gIEhvd2V2ZXIsIHRoZSBnY2MgZW50cmllcyBzZWVtIHRvCisjICBuZWVkIHRoZW0sIGF0IGxlYXN0IGZvciBnY2MgMi43LjIuMi4KKworIyAgTk9URSAyOiBUbyBlbmFibGUgSUtTRCBzdXBwb3J0LCBhZGQ6CisjICAtRENLX0xPR0lOIC1ETk9HRVRVU0VSU0hFTEwgLUROT0lOSVRHUk9VUFMKKyMgIHRvIENGTEFHUyAobm90IHRlc3RlZCkuCisKKyNTQ08gVU5JWC8zODYgMy4ydjQgKFBPU0lYIGpvYiBjb250cm9sKSwgY3Vyc2VzLCBBTlNJIEMgY29tcGlsYXRpb24sCisjPGRpcmVudC5oPiAoRUFGUykgZmlsZSBzeXN0ZW0uICBSZW1vdmUgLWxtYWxsb2MgaWYgaXQgY2F1c2VzIHRyb3VibGUuICBJdCB3YXMKKyNwdXQgdGhlcmUgdG8gYXZvaWQgY29yZSBkdW1wcyBjYXVzZWQgYnkgcmVndWxhciBsaWJjLmEgbWFsbG9jLiAgQWRkIC1KIHRvIG1ha2UKKyNhbGwgY2hhcnMgdW5zaWduZWQuICBUaGlzIHZlcnNpb24gdXNlcyBzZWxlY3QoKSBmb3IgQ09OTkVDVCBhbmQgYWxzbyBoYXMKKyNoaWdoLXByZWNpc2lvbiB0aW1lcnMgYW5kIHNvIG1pZ2h0IG5vdCB3b3JrIG9uIG5vbi1UQ1Agc3lzdGVtcywgaW4gd2hpY2ggY2FzZQorI3NjbzMydjRucyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorIyBJZiB5b3UgZ2V0IF9mdGltZSByZWRlZmluaXRpb25fIGNvbXBsYWludCwgdHJ5IGFkZGluZyAtRE9EVDMwIHRvIENGTEFHUy4KK3NjbzMydjQ6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0NPIFVOSVgvMzg2IDMuMnY0Li4uJworCW1ha2UgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQ0tfU0NPMzJWNCAtRE5PRklMRUggLURIREJVVUNQIC1EQ0tfQ1VSU0VTIC1ETV9URVJNSU5GTyBcCisJLUROT0FOU0kgLURTRUxFQ1QgLUROT0lLU0QgLUREQ0xHRVRDV0QgLU5PTFNUQVQgXAorCS1ETk9MSU5LQklUUyAtRERDTEdFVENXRCAkKEtGTEFHUykgLU8iIFwKKwkiTE5LRkxBR1MgPSAtcyIgIkxJQlMgPSAtbGN1cnNlcyAtbG1hbGxvYyAtbHNvY2tldCAtbGNfcyAtbGMgLWx4IgorCisjIEFzIGFib3ZlLCBidXQgd2l0aCBubyBkZXBlbmRlbmNlIG9uIHNvY2tldHMgbGlicmFyeSBvciBzZWxlY3QoKS4KK3NjbzMydjRuczoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gVU5JWC8zODYgMy4ydjQuLi4nCisJQGVjaG8gJ05vIHNlbGVjdCgpIGFuZCBubyBzb2NrZXRzIGxpYnJhcnkuJworCW1ha2Ugd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EQ0tfU0NPMzJWNCAtRE5PRklMRUggLURIREJVVUNQIC1EQ0tfQ1VSU0VTIC1ETV9URVJNSU5GTyBcCisJLUROT0FOU0kgLUROT0lLU0QgLUROT0dGVElNRVIgLURDS19QT0xMIC1ETkFQIC1ERENMR0VUQ1dEIC1ETk9MU1RBVCBcCisJLUROT0xJTktCSVRTIC1ERENMR0VUQ1dEIC1ETk9MRUFSTiAtTyAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtcyIgIkxJQlMgPSAtbGN1cnNlcyAtbG1hbGxvYyAtbGNfcyAtbGMgLWx4IgorCisjU0NPIFVOSVgvMzg2IDMuMnY0IChQT1NJWCBqb2IgY29udHJvbCksIFRDUC9JUCwgY3Vyc2VzLCBBTlNJIEMgY29tcGlsYXRpb24sCisjPGRpcmVudC5oPiAoRUFGUykgZmlsZSBzeXN0ZW0uICBXaXRoIERJUkVOVCwgLWxjIG11c3QgY29tZSBiZWZvcmUgLWx4LgorI1JlcG9ydGVkbHkgaXQncyBPSyB0byBhZGQgLURDS19SRURJUiBhbmQgLURDS19XUkVGUkVTSCwgYW5kIHRvIHJlbW92ZSAtbGNfcy4KKyNSZXF1aXJlcyBTQ08gVENQL0lQIGRldmVsb3BtZW50IHN5c3RlbSBvciBPRFQgZm9yIHRlbG5ldC5oLCBldGMuCisjU2VlIHNjbzMydjQgYWJvdmUgZm9yIGFkZGl0aW9uYWwgY29tbWVudHMuCisjTk9URTogTm8gbW9yZSByb29tIGZvciAtRHh4eCAtLSAyNSBzZWVtcyB0byBiZSB0aGUgbGltaXQuICBNb3ZlIHNvbWUgdG8KKyNja2NkZWIuaCBvciBzb21ld2hlcmUuLi4KK3NjbzMydjRuZXQ6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0NPIFVOSVgvMzg2IDMuMnY0Li4uJworCUBlY2hvICdJZiB5b3UgZ2V0IF9mdGltZSByZWRlZmluaXRpb25fIGNvbXBsYWludCwnCisJQGVjaG8gJ3VzZSBtYWtlIHNjby1vZHQzMC4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLUROT0ZJTEVIIC1ESERCVVVDUCAtRFRDUFNPQ0tFVCAtRENLX0FOU0lDIC1EQ0tfQ1VSU0VTIFwKKwktRE5BUCAtRENLX1dSRUZSRVNIIC1ETk9MSU5LQklUUyAtRF9JQkNTMiAtRFNFTEVDVCAtRE5PTFNUQVQgXAorCS1ERENMR0VUQ1dEIC1EQ0tfU0NPMzJWNCAtRE5PSUtTRCAtTyBcCisJJChLRkxBR1MpIiAiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSAtcyIgXAorCSJMSUJTID0gJChMSUJTKSAtbGN1cnNlcyAtbHNvY2tldCAtbG1hbGxvYyAtbHNvY2tldCAtbGNfcyAtbGMgLWx4IgorCisjU0NPIFVOSVgvMzg2IDMuMnY0IHdpdGggZ2NjIDEuNDAgb3IgbGF0ZXIsIFBPU0lYIGpvYiBjb250cm9sLgorI0Fsc28gc2VlIGNvbW1lbnRzIGluIHNjbzMycjQgZW50cnkuCitzY28zMnY0Z2NjOgorCW1ha2UgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDID0gZ2NjIiBcCisJIkNGTEFHUz0gLU8gLUROT0ZJTEVIIC1ESERCVVVDUCAtRE5PQU5TSSAtRENLX0NVUlNFUyAtRE1fVEVSTUlORk8gXAorCS10cmFkaXRpb25hbCAtZnBjYy1zdHJ1Y3QtcmV0dXJuIC1mc3RyZW5ndGgtcmVkdWNlIC1mdW5zaWduZWQtY2hhciBcCisJLURfS1IgLURfTk9fUFJPVE9UWVBFIC1EX1NWSUQgLUROT0lLU0QgLURDS19TQ08zMlY0IC1ETk9MSU5LQklUUyBcCisJLURNX0JJVEZJRUxEUyAtRE1fQ09GRiAtRE1fSTM4NiAtRE1fSTg2IC1ETV9JODZTTSAtRFNFTEVDVCAtRE5PTFNUQVQgXAorCS1ETV9JTlRFUk5BVCAtRE1fU0RBVEEgLURNX1NURVhUIC1ETV9TWVMzIC1ETV9TWVM1IC1ERENMR0VUQ1dEIFwKKwktRE1fU1lTSUlJIC1ETV9TWVNWIC1ETV9VTklYIC1ETV9XT1JEU1dBUCAtRE1fWEVOSVggLUR1bml4IFwKKwktRERDTFBPUEVOIC1ERENMRkRPUEVOICQoS0ZMQUdTKSAiIFwKKwkiTE5LRkxBR1MgPSAtcyIgIkxJQlMgPSAtbGN1cnNlcyAtbHNvY2tldCAtbGNfcyAtbGMgLWx4IgorCisjU0NPIFVOSVgvMzg2IDMuMnY0IChQT1NJWCBqb2IgY29udHJvbCksIFRDUC9JUCwgY3Vyc2VzLCBBTlNJIEMgY29tcGlsYXRpb24sCisjUmVxdWlyZXMgU0NPIFRDUC9JUCBvciBPRFQgZGV2ZWxvcG1lbnQgc3lzdGVtIGZvciB0ZWxuZXQuaCwgZXRjLgorIzxkaXJlbnQuaD4gKEVBRlMpIGZpbGUgc3lzdGVtLiAgV2l0aCBESVJFTlQsIC1sYyBtdXN0IGNvbWUgYmVmb3JlIC1seC4KKyNnY2MgMS40MCBvciBsYXRlci4gIEFsc28gc2VlIGNvbW1lbnRzIGluIHNjbzMycjQgZW50cnkuCitzY28zMnY0bmV0Z2NjOgorCW1ha2UgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDID0gZ2NjIiAiQ0MyPWdjYyIgXAorCSJDRkxBR1M9IC1PMiAtRE5PRklMRUggLURIREJVVUNQIC1EU0VMRUNUIC1ETk9MU1RBVCBcCisJLUROT0FOU0kgLURUQ1BTT0NLRVQgLURDS19DVVJTRVMgLURNX1RFUk1JTkZPIFwKKwktRF9LUiAtRF9OT19QUk9UT1RZUEUgLURfU1ZJRCAtRE5PSUtTRCAtRENLX1NDTzMyVjQgLUROT0xJTktCSVRTIFwKKwktRE1fQklURklFTERTIC1ETV9DT0ZGIC1ETV9JMzg2IC1ETV9JODYgLURNX0k4NlNNIC1ERENMR0VUQ1dEIFwKKwktRE1fSU5URVJOQVQgLURNX1NEQVRBIC1ETV9TVEVYVCAtRE1fU1lTMyAtRE1fU1lTNSBcCisJLURNX1NZU0lJSSAtRE1fU1lTViAtRE1fVU5JWCAtRE1fV09SRFNXQVAgLURNX1hFTklYIC1EdW5peCBcCisJLUREQ0xQT1BFTiAtRERDTEZET1BFTiAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtcyIgIkxJQlMgPSAtbGN1cnNlcyAtbHNvY2tldCAtbGNfcyAtbGMgLWx4IgorCisjQXMgYWJvdmUgYnV0IHdpdGggYmdjYyBCT1VORFMgQ0hFQ0tJTkcgKGZvciBkZXZlbG9wZXJzIG9ubHkpLiAgLWxjaGVjayBoYXMKKyNib3VuZHMtY2hlY2tpbmcgcmVwbGFjZW1lbnRzIGZvciBtYWxsb2MsIG1lbWNweSwgYmNvcHksIGV0Yywgc28gbXVzdCBjb21lCisjYmVmb3JlIC1sc29ja2V0IGFuZCAtbGMuCitzY28zMnY0bmV0YmdjYzoKKwltYWtlIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0MgPSBiZ2NjIC1waXBlIC1tMzg2IiAiQ0MyPWJnY2MgLXBpcGUgLW0zODYiIFwKKwkiQ0ZMQUdTPSAtTzEgLWcgLUROT0ZJTEVIIC1ESERCVVVDUCAtRFNFTEVDVCBcCisJLUROT0FOU0kgLURUQ1BTT0NLRVQgLURDS19DVVJTRVMgLURNX1RFUk1JTkZPIFwKKwktRF9LUiAtRF9OT19QUk9UT1RZUEUgLURfU1ZJRCAtRE5PSUtTRCAtRENLX1NDTzMyVjQgLUROT0xTVEFUIFwKKwktRE1fQklURklFTERTIC1ETV9DT0ZGIC1ETV9JMzg2IC1ETV9JODYgLURNX0k4NlNNIC1ETk9MSU5LQklUUyBcCisJLURNX0lOVEVSTkFUIC1ETV9TREFUQSAtRE1fU1RFWFQgLURNX1NZUzMgLURNX1NZUzUgLUREQ0xHRVRDV0QgXAorCS1ETV9TWVNJSUkgLURNX1NZU1YgLURNX1VOSVggLURNX1dPUkRTV0FQIC1ETV9YRU5JWCAtRHVuaXggXAorCS1ERENMUE9QRU4gLUREQ0xGRE9QRU4gJChLRkxBR1MpICIgXAorCSJMTktGTEFHUyA9IC1nIiAiTElCUyA9IC1sY3Vyc2VzIC1sY2hlY2sgLWxzb2NrZXQgLWx4IgorCitzY28zMnY0bmV0bmQ6CisJQGVjaG8gc2NvMzJ2NG5ldCB3aXRoIG5vIGRlYnVnCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzY28zMnY0bmV0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9JChLRkxBR1MpIC1ETk9ERUJVRyAtRE5PVExPRyIgIkxJQlM9JChMSUJTKSIKKworc2NvM3IybmV0bmQ6CisJQGVjaG8gc2NvMzJ2NG5ldG5kIGJ1aWx0IGZvciBTQ08gWEVOSVggMi4zIHVuZGVyIFNDTyBVTklYLi4uCisJQGVjaG8gICByZXF1aXJlcyBjb3B5aW5nIC9saWIvMzg2L1NsaWJjLmEgdG8gL2xpYi8zODYvU2xpYmNfcy5hIGFuZAorCUBlY2hvICAgZ2V0dGluZyAvbGliLzM4Ni9TbGlic29ja2V0LmEgZnJvbSBhIFhFTklYIGRldmtpdC4KKwlAZWNobyAgIFdBUk5JTkc6IHBvbGwvQ0tfUE9MTCBzdXBwb3J0ZWQgb25seSBvbiBYRU5JWCAyLjMuNAorCWVjaG8gICAgRm9yIGVhcmxpZXIgWEVOSVggc3lzdGVtcywgcmVwbGFjZSBDS19QT0xMIHdpdGggUkRDSEsuCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzY28zMnY0bmV0bmQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0kKEtGTEFHUykgLXgyLjMgLUROT1JFTkFNRSAtRE5PU1lNTElOSyIgXAorCSJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIC14Mi4zIiBcCisJIkxJQlM9LWxkaXIgLWxjZnAgJChMSUJTKSIKKworI1NDTyBVTklYLzM4NiAzLjJ2NCAoUE9TSVggam9iIGNvbnRyb2wpLCBUQ1AvSVAsIGN1cnNlcywgQU5TSSBDIGNvbXBpbGF0aW9uLAorIzxkaXJlbnQuaD4gKEVBRlMpIGZpbGUgc3lzdGVtLiAgV2l0aCBESVJFTlQsIC1sYyBtdXN0IGNvbWUgYmVmb3JlIC1seC4KKyNSZXBvcnRlZGx5IGl0J3MgT0sgdG8gYWRkIC1EQ0tfUkVESVIgYW5kIC1EQ0tfV1JFRlJFU0gsIGFuZCB0byByZW1vdmUgLWxjX3MuCisjUmVxdWlyZXMgU0NPIFRDUC9JUCBkZXZlbG9wbWVudCBzeXN0ZW0gb3IgT0RUIGZvciB0ZWxuZXQuaCwgZXRjLgorI1NlZSBzY28zMnY0IGFib3ZlIGZvciBhZGRpdGlvbmFsIGNvbW1lbnRzLgorIyBOb3RlOiAieGVybWl0IiBtZWFucyB1c2UgdGhlIHNlbGVjdCgpIHZlcnNpb24gb2YgdGhlIENPTk5FQ1QgbW9kdWxlLgorc2NvMzJ2NG5ldHg6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0NPIFVOSVgvMzg2IDMuMnY0Li4uJworCUBlY2hvICdJZiB5b3UgZ2V0IF9mdGltZSByZWRlZmluaXRpb25fIGNvbXBsYWludCwnCisJQGVjaG8gJ3VzZSBtYWtlIHNjby1vZHQzMC4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLUROT0ZJTEVIIC1ESERCVVVDUCAtRFRDUFNPQ0tFVCAtRENLX0FOU0lDIC1EQ0tfQ1VSU0VTIC1ETkFQIFwKKwktRENLX1dSRUZSRVNIIC1ETk9MSU5LQklUUyAtRF9JQkNTMiAtRFNFTEVDVCAtRERDTEdFVENXRCBcCisJLURDS19TQ08zMlY0IC1ETk9JS1NEIC1ETk9MU1RBVCAtTyAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAkKExOS0ZMQUdTKSAtcyIgXAorCSJMSUJTID0gJChMSUJTKSAtbGN1cnNlcyAtbHNvY2tldCAtbG1hbGxvYyAtbHNvY2tldCAtbGNfcyAtbGMgLWx4IgorCitzY28zMnY0bmV0bmR4OgorCUBlY2hvIHNjbzMydjRuZXR4IHdpdGggbm8gZGVidWcKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNjbzMydjRuZXR4IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9JChLRkxBR1MpIC1ETk9ERUJVRyAtRE5PVExPRyIgIkxJQlM9JChMSUJTKSIKKworc2NvM3IybmV0bmR4OgorCUBlY2hvIHNjbzMydjRuZXRuZHggYnVpbHQgZm9yIFNDTyBYRU5JWCAyLjMgdW5kZXIgU0NPIFVOSVguLi4KKwlAZWNobyAgIHJlcXVpcmVzIGNvcHlpbmcgL2xpYi8zODYvU2xpYmMuYSB0byAvbGliLzM4Ni9TbGliY19zLmEgYW5kCisJQGVjaG8gICBnZXR0aW5nIC9saWIvMzg2L1NsaWJzb2NrZXQuYSBmcm9tIGEgWEVOSVggZGV2a2l0LgorCUBlY2hvICAgV0FSTklORzogcG9sbC9DS19QT0xMIHN1cHBvcnRlZCBvbmx5IG9uIFhFTklYIDIuMy40CisJZWNobyAgICBGb3IgZWFybGllciBYRU5JWCBzeXN0ZW1zLCByZXBsYWNlIENLX1BPTEwgd2l0aCBSRENISy4KKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNjbzMydjRuZXRuZHggS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0kKEtGTEFHUykgLXgyLjMgLUROT1JFTkFNRSAtRE5PU1lNTElOSyIgXAorCSJMTktGTEFHUyA9ICQoTE5LRkxBR1MpIC14Mi4zIiBcCisJIkxJQlM9LWxkaXIgLWxjZnAgJChMSUJTKSIKKworc2NvLW9kdDMwOgorCUBlY2hvIFNDTyBPRFQgMy4wCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzY28zMnY0bmV0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9JChLRkxBR1MpIC1ET0RUMzAiCisKKyNTQ08gT3BlblNlcnZlciA1LjAgKFNDTyBVTklYIDMuMnY1LjApIHdpdGggU0NPIGRldmVsb3BtZW50IHRvb2xzLCBubyBUQ1AvSVAuCisjU0NPIE9TUjUgaXMgbXVjaCBtb3JlIGxpa2Ugc3RhbmRhcmQgU3lzdGVtIFYgdGhhbiBwcmV2aW91cyBTQ08gcmVsZWFzZXMuCisjVGhlIFNDTyBkZXZlbG9wbWVudCB0b29scyBpbmNsdWRlIFRDUC9JUCwgc28gdGhpcyB0YXJnZXQgaXMgb25seSBmb3IgY3JlYXRpbmcKKyNhcnRpZmljaWFsbHkgbGltaXRlZCB2ZXJzaW9ucyBvZiBrZXJtaXQgcmVxdWlyZWQgYnkgc2l0ZSBwb2xpY3kgcmF0aGVyIHRoYW4KKyN0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIE5PU1lTTE9HIGlzIGluY2x1ZGVkIGJlY2F1c2Ugc3lzbG9nKCkgcmVxdWlyZXMgdGhlCisjc29ja2V0cyBsaWJyYXJ5Lgorc2NvMzJ2NTAwOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0NPIE9wZW5TZXJ2ZXIgUmVsZWFzZSA1Li4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLU8gLURESVJFTlQgLURIREJVVUNQIC1EU1ZSNCAtRENLX1NDT1Y1IC1EQ0tfUlRTQ1RTIFwKKwktRENLX0NVUlNFUyAtRENLX1dSRUZSRVNIIC1EQ0tfTkVXVEVSTSAtRFNFTEVDVCAtRFNFTEVDVF9IIFwKKwktRE5PR0VUVVNFUlNIRUxMIC1ETk9MU1RBVCAtRE5PTElOS0JJVFMgLUROT1NZU0xPRyBcCisJJChLRkxBR1MpIiBcCisJIkxJQlM9LWxjdXJzZXMgJChMSUJTKSIgIkxOS0ZMQUdTPSQoTE5LRkxBR1MpIgorCitzY28zMnY1OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgIktGTEFHUz0kKEtGTEFHUykiIHNjbzMydjUwMAorCisKKyNTQ08gT3BlblNlcnZlciA1LjAgd2l0aCBuZXR3b3JraW5nLCBTQ08gZGV2ZWxvcG1lbnQgdG9vbHMuCisjTmV0d29ya2luZyBsaWJyYXJpZXMgYXJlIG5vdyBwcm92aWRlZCB3aXRoIHRoZSBPUy4KK3NjbzMydjUwMG5ldDoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFNDTyBPcGVuU2VydmVyIFJlbGVhc2UgNS4uLgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1PIC1ERElSRU5UIC1ESERCVVVDUCAtRFNWUjQgLURDS19TQ09WNSAtRENLX1JUU0NUUyBcCisJLURDS19DVVJTRVMgLURDS19XUkVGUkVTSCAtRENLX05FV1RFUk0gLURTRUxFQ1QgLURTRUxFQ1RfSCBcCisJLUROT0dFVFVTRVJTSEVMTCAtRE5PTFNUQVQgLUROT0xJTktCSVRTIC1EVENQU09DS0VUIFwKKwktRE5PX0ROU19TUlYgJChLRkxBR1MpIiBcCisJIkxJQlM9LWxjdXJzZXMgLWxzb2NrZXQgJChMSUJTKSIgIkxOS0ZMQUdTPSQoTE5LRkxBR1MpIgorCitzY28zMnY1bmV0OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgIktGTEFHUz0kKEtGTEFHUykiIHNjbzMydjUwMG5ldAorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wIHdpdGggbmV0d29ya2luZyBhbmQgT3BlblNTTCwgU0NPIGRldmVsb3BtZW50IHRvb2xzLgorI05ldHdvcmtpbmcgbGlicmFyaWVzIGFyZSBub3cgcHJvdmlkZWQgd2l0aCB0aGUgT1MuCitzY28zMnY1MDBuZXQrc3NsOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgU0NPIE9TUjUgd2l0aCBPcGVuU1NMLi4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLU8gLURESVJFTlQgLURIREJVVUNQIC1EU1ZSNCAtRENLX1NDT1Y1IC1EQ0tfUlRTQ1RTIFwKKwktRENLX0NVUlNFUyAtRENLX1dSRUZSRVNIIC1EQ0tfTkVXVEVSTSAtRFNFTEVDVCAtRFNFTEVDVF9IIFwKKwktRE5PR0VUVVNFUlNIRUxMIC1ETk9MU1RBVCAtRE5PTElOS0JJVFMgLURUQ1BTT0NLRVQgXAorCS1ETk9fRE5TX1NSViAtRENLX0FVVEhFTlRJQ0FUSU9OIC1EQ0tfU1NMIC1EQ0tfVFJJR0dFUiBcCisJJChTU0xJTkMpICQoU1NMTElCKSAkKEtGTEFHUykiIFwKKwkiTElCUz0kKFNTTExJQikgLWxjdXJzZXMgLWxzb2NrZXQgLWxzc2wgLWxjcnlwdG8gJChMSUJTKSIgXAorCSJMTktGTEFHUz0kKExOS0ZMQUdTKSIKKworI1NDTyBPcGVuU2VydmVyIDUuMCB3aXRoIGdjYywgbm8gbmV0d29ya2luZy4KKyNOb3RlOiBOT1NZU0xPRyByZXF1aXJlZCBmb3Igbm9uLW5ldCBlbnRyaWVzIGJlY2F1c2UgaXQgcmVxdWlyZXMgPHNvY2tldC5oPgorc2NvMzJ2NTAwZ2NjOgorCUBlY2hvIFVzaW5nIGdjYy4uLgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc2NvMzJ2NTAwQ0M9Z2NjIENDMj1nY2MgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUz0gJChLRkxBR1MpIgorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wIHdpdGggbmV0d29ya2luZywgZ2NjLgorc2NvMzJ2NTAwbmV0Z2NjOgorCUBlY2hvIFRDUC9JUCBuZXR3b3JraW5nIGFkZGVkIC0gdXNpbmcgZ2NjLi4uCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzY28zMnY1MDBuZXQgQ0M9Z2NjIENDMj1nY2MgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUz0kKEtGTEFHUykiCisKKyNTQ08gT3BlblNlcnZlciA1LjAgd2l0aCBuZXR3b3JraW5nLCBnY2MsIGVsZi4KK3NjbzMydjUwMG5ldGdjY2VsZjoKKwlAZWNobyBUQ1AvSVAgbmV0d29ya2luZyBhZGRlZCAtIHVzaW5nIGdjYywgZHluYW1pYyBlbGYgbGlicmFyeQorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc2NvMzJ2NTAwbmV0ICJDQz1nY2MiICJDQzI9Z2NjIiBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiS0ZMQUdTPS1PMyAtYmVsZiIgIkxOS0ZMQUdTPS1iZWxmIgorCitzY28zMnY1MDI6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzY28zMnY1MDAgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFNDT19PU1I1MDIgJChLRkxBR1MpIgorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wLjIgd2l0aCBuZXR3b3JraW5nLCBTQ08gZGV2ZWxvcG1lbnQgdG9vbHMuCitzY28zMnY1MDJuZXQ6CisJQGVjaG8gVENQL0lQIG5ldHdvcmtpbmcgYWRkZWQuLi4KKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNjbzMydjUwMG5ldCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1iIGVsZiAtRFNDT19PU1I1MDIgJChLRkxBR1MpIgorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wLjQgKFNDTyBVTklYIDMuMnY1LjAuNCkgd2l0aCBTQ08gZGV2ZWxvcG1lbnQgdG9vbHMuCisjTGlrZSA1LjAsIGJ1dCBhZGRzIGhpZ2ggc2VyaWFsIHNwZWVkcy4gIEZpcnN0IFBPU0lYLWJhc2VkIFNDTyB2ZXJzaW9uLgorI05vdGU6IHRoZSAtTyBmbGFnIGlzIGRlbGliZXJhdGVseSBvbWl0dGVkIGZvciAvYmluL2NjICg9IC91c3IvY2NzL2Jpbi9jYykuCitzY28zMnY1MDQ6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gT3BlblNlcnZlciBSZWxlYXNlIDUuMC40Li4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURESVJFTlQgLURIREJVVUNQIC1EU1ZSNCAtRENLX1NDT1Y1IC1EQ0tfUlRTQ1RTIFwKKwktRFNDT19PU1I1MDQgLWIgZWxmIC1EUE9TSVggXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfV1JFRlJFU0ggLURDS19ORVdURVJNIC1EU0VMRUNUIC1EU0VMRUNUX0ggXAorCS1ETk9HRVRVU0VSU0hFTEwgLUROT0xTVEFUIC1ETk9MSU5LQklUUyAtRE5PU1lTTE9HICQoS0ZMQUdTKSIgXAorCSJMSUJTPS1sY3Vyc2VzICQoTElCUykiICJMTktGTEFHUz0kKExOS0ZMQUdTKSIKKworI1NDTyBPcGVuU2VydmVyIDUuMC40IHdpdGggZ2NjLCBubyBuZXR3b3JraW5nLgorc2NvMzJ2NTA0Z2NjOgorCUBlY2hvIFVzaW5nIGdjYy4uLgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc2NvMzJ2NTA0ICJDQz1nY2MiICJDQzI9Z2NjIiBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiS0ZMQUdTPSAkKEtGTEFHUykiCisKKyNTQ08gT3BlblNlcnZlciA1LjAuNCB3aXRoIG5ldHdvcmtpbmcuCisjU0NPIGRldmVsb3BtZW50IHRvb2xzICgvYmluL2NjID0gL3Vzci9jY3MvYmluL2NjKS4KKyNPcHRpbWl6YXRpb24gZGVsaWJlcmF0ZWx5IHN1cHByZXNzZWQuCitzY28zMnY1MDRuZXQ6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTQ08gT3BlblNlcnZlciBSZWxlYXNlIDUuMC40Li4uCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUz0gLURESVJFTlQgLURIREJVVUNQIC1EU1ZSNCAtRENLX1NDT1Y1IC1EQ0tfUlRTQ1RTIFwKKwktRENLX0NVUlNFUyAtRENLX1dSRUZSRVNIIC1EQ0tfTkVXVEVSTSAtRFNFTEVDVCAtRFNFTEVDVF9IIFwKKwktRE5PR0VUVVNFUlNIRUxMIC1ETk9MU1RBVCAtRE5PTElOS0JJVFMgLURUQ1BTT0NLRVQgXAorCS1iIGVsZiAtRFNDT19PU1I1MDQgLURQT1NJWCAtRE5PX0ROU19TUlYgJChLRkxBR1MpIiBcCisJIkxJQlM9LWxjdXJzZXMgLWxzb2NrZXQgJChMSUJTKSIgIkxOS0ZMQUdTPSQoTE5LRkxBR1MpIgorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wLjQgd2l0aCBuZXR3b3JraW5nLCBnY2MuCitzY28zMnY1MDRuZXRnY2M6CisJQGVjaG8gVENQL0lQIG5ldHdvcmtpbmcgYWRkZWQgLSB1c2luZyBnY2MuLi4KKwlAZWNobyBJZiBnY2MgY3Jhc2hlcyBvbiBja3dhcnQuYyB0aGVuIGJ1aWxkIGl0IGJ5IGhhbmQ6CisJQGVjaG8gIiBnY2MgLW8gd2FydCAtRENLX1NDT1Y1IGNrd2FydC5jIgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc2NvMzJ2NTAwbmV0ICJDQz1nY2MiICJDQzI9Z2NjIiBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSAiS0ZMQUdTPS1EU0NPX09TUjUwNCAtRFBPU0lYICQoS0ZMQUdTKSIKKworI1NDTyBPcGVuU2VydmVyIDUuMC40IHdpdGggbmV0d29ya2luZywgZ2NjLCBlbGYuCitzY28zMnY1MDRuZXRnY2NlbGY6CisJQGVjaG8gVENQL0lQIG5ldHdvcmtpbmcgYWRkZWQgLSB1c2luZyBnY2MsIGR5bmFtaWMgZWxmIGxpYnJhcnkKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNjbzMydjUwMG5ldCAiQ0M9Z2NjIiAiQ0MyPWdjYyIKKwlLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1EU0NPX09TUjUwNCAtRFBPU0lYIC1PMyAtYmVsZiAkKEtGTEFHUykiIFwKKwlMTktGTEFHUz0iLWJlbGYiCisKKyNTQ08gT3BlblNlcnZlciA1LjAuNSAoU0NPIFVOSVggMy4ydjUuMC41KSB3aXRoIFNDTyAvYmluL2NjLgorI0xpa2UgNS4wLCBidXQgYWRkcyBoaWdoIHNlcmlhbCBzcGVlZHMuICBGaXJzdCBQT1NJWC1iYXNlZCBTQ08gdmVyc2lvbi4KKyNZb3UgbWlnaHQgaGF2ZSB0byBhZGQgIkxJQlM9LWx0aW5mbyIgKHNvbWUgZG8sIHNvbWUgZG9uJ3QpLgorc2NvMzJ2NTA1OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc2NvMzJ2NTAwIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURTQ09fT1NSNTA1IC1ETk9TSEFET1cgLWIgZWxmIC1EUE9TSVggJChLRkxBR1MpIgorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wLjUgKFNDTyBVTklYIDMuMnY1LjAuNSkgd2l0aCBTQ08gVURLLgorI1RoaXMgb25lIGNhbid0IHNlZSB0aGUgaGlnaCBzZXJpYWwgc3BlZWRzIGFuZCBhbnl0aGluZyB0byBkbyB3aXRoIG1vZGVtCisjc2lnbmFscyBkb2Vzbid0IHdvcmsgYmVjYXVzZSBVS0QgY2MgaGFzIGl0cyBvd24gYWx0ZXJuYXRpdmUgdW5pdmVyc2Ugb2YKKyNoZWFkZXIgZmlsZXMuCitzY28zMnY1MDV1ZGs6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzY28zMnY1MDAgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFNDT19PU1I1MDUgLUREQ0xUSU1FVkFMIC1ETk9TSEFET1cgLWIgZWxmIC1EUE9TSVggJChLRkxBR1MpIgorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wLjUgd2l0aCBuZXR3b3JraW5nLCBTQ08gL2Jpbi9jYy4KKyNTZWUgY29tbWVudHMgd2l0aCBzY28zMnY1MDUgdGFyZ2V0cy4KK3NjbzMydjUwNW5ldDoKKwlAZWNobyBUQ1AvSVAgbmV0d29ya2luZyBhZGRlZC4uLgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc2NvMzJ2NTAwbmV0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURTQ09fT1NSNTA1IC1ETk9TSEFET1cgLWIgZWxmIC1EUE9TSVggJChLRkxBR1MpIgorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wLjUgd2l0aCBuZXR3b3JraW5nIGFuZCBPcGVuU1NMLCBTQ08gL2Jpbi9jYy4KKyNTZWUgY29tbWVudHMgd2l0aCBzY28zMnY1MDUgdGFyZ2V0cy4KK3NjbzMydjUwNW5ldCtzc2w6CisJQGVjaG8gVENQL0lQIG5ldHdvcmtpbmcgYW5kIE9wZW5TU0wgYWRkZWQuLi4KKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNjbzMydjUwMG5ldCtzc2wgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFNDT19PU1I1MDUgLUROT1NIQURPVyAtYiBlbGYgLURQT1NJWCAkKEtGTEFHUykgIiBcCisKKyNTQ08gT3BlblNlcnZlciA1LjAuNSB3aXRoIG5ldHdvcmtpbmcsIFNDTyBVREsuCisjU2VlIGNvbW1lbnRzIHdpdGggYWJvdmUgc2NvMzJ2NTA1IHRhcmdldHMuCitzY28zMnY1MDV1ZGtuZXQ6CisJQGVjaG8gVENQL0lQIG5ldHdvcmtpbmcgYWRkZWQuLi4KKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNjbzMydjUwMG5ldCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1EU0NPX09TUjUwNSAtRERDTFRJTUVWQUwgLUROT1NIQURPVyAtYiBlbGYgLURQT1NJWCAkKEtGTEFHUykiCisKKyNTQ08gT3BlblNlcnZlciA1LjAuNSB3aXRoIGdjYywgbm8gbmV0d29ya2luZy4KK3NjbzMydjUwNWdjYzoKKwlAZWNobyBVc2luZyBnY2MuLi4KKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNjbzMydjUwMCAiQ0M9Z2NjIiAiQ0MyPWdjYyIgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURTQ09fT1NSNTA1IC1EUE9TSVggLWZ1bnNpZ25lZC1jaGFyICQoS0ZMQUdTKSIKKworI1NDTyBPcGVuU2VydmVyIDUuMC41IHdpdGggZ2NjLCBubyBuZXR3b3JraW5nLCBubyBzaGFkb3cgcGFzc3dvcmRzLgorc2NvMzJ2NTA1eGdjYzoKKwlAZWNobyBVc2luZyBnY2MuLi4KKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNjbzMydjUwMCAiQ0M9Z2NjIiAiQ0MyPWdjYyIgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURTQ09fT1NSNTA1IC1ETk9TSEFET1cgLURQT1NJWCAtZnVuc2lnbmVkLWNoYXIgJChLRkxBR1MpIgorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wLjUgd2l0aCBuZXR3b3JraW5nLCBnY2MuCitzY28zMnY1MDVuZXRnY2M6CisJQGVjaG8gVENQL0lQIG5ldHdvcmtpbmcgYWRkZWQgLSB1c2luZyBnY2MuLi4KKwlAZWNobyBJZiBnY2MgY3Jhc2hlcyBvbiBja3dhcnQuYyB0aGVuIGJ1aWxkIGl0IGJ5IGhhbmQ6CisJQGVjaG8gIiBnY2MgLW8gd2FydCAtRENLX1NDT1Y1IGNrd2FydC5jIgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc2NvMzJ2NTAwbmV0ICJDQz1nY2MiICJDQzI9Z2NjIiBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFNDT19PU1I1MDUgLUROT1NIQURPVyAtRFBPU0lYIC1mdW5zaWduZWQtY2hhciAkKEtGTEFHUykiCisKKyNlZ2NzIGlzIGp1c3QgbGlrZSBnY2MgYnV0IGdlbmVyYXRlcyBFTEYgYnkgZGVmYXVsdC4KKyNPciB5b3UgY2FuIGluY2x1ZGUgLW1lbGYgKG5vdCAtYmVsZikgdG8gZm9yY2UgaXQuCitzY28zMnY1MDVuZXRlZ2NzOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgIktGTEFHUz0kKEtGTEFHUykiIHNjbzMydjUwNW5ldGdjYyBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfQorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wLjUgd2l0aCBuZXR3b3JraW5nLCBnY2MsIGVsZi4KK3NjbzMydjUwNW5ldGdjY2VsZjoKKwlAZWNobyBUQ1AvSVAgbmV0d29ya2luZyBhZGRlZCAtIHVzaW5nIGdjYywgZHluYW1pYyBlbGYgbGlicmFyeQorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc2NvMzJ2NTAwbmV0ICJDQz1nY2MiICJDQzI9Z2NjIiBcCisJIktGTEFHUz0tRFNDT19PU1I1MDUgLURQT1NJWCAtZnVuc2lnbmVkLWNoYXIgLU8zIC1iZWxmICQoS0ZMQUdTKSIgXAorCUtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gTE5LRkxBR1M9Ii1iZWxmIgorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wLjYgd2l0aCBTQ08gL2Jpbi9jYy4KKyMgQWRkIC1ERENMVElNRVZBTCB3aGVuIGJ1aWxkaW5nIHdpdGggVURLLgorI0xpa2UgNS4wLjUuICAgSU1QT1JUQU5UOiBVc2Ugc2NvMzJ2NTA2YSB0YXJnZXQgZm9yIDUuMC42YS4KK3NjbzMydjUwNjoKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNjbzMydjUwMCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1EU0NPX09TUjUwNSAtRFNDT19PU1I1MDYgLWIgZWxmIC1EUE9TSVggJChLRkxBR1MpIgorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wLjYgd2l0aCBuZXR3b3JraW5nLCBTQ08gL2Jpbi9jYy4KKyMgQWRkIC1ERENMVElNRVZBTCB3aGVuIGJ1aWxkaW5nIHdpdGggVURLLgorIyBJTVBPUlRBTlQ6IFVzZSBzY28zMnY1MDZhIHRhcmdldCBmb3IgNS4wLjZhLgorc2NvMzJ2NTA2bmV0OgorCUBlY2hvIFRDUC9JUCBuZXR3b3JraW5nIGFkZGVkLi4uCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzY28zMnY1MDBuZXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFNDT19PU1I1MDUgLURTQ09fT1NSNTA2IC1iIGVsZiAtRFBPU0lYICQoS0ZMQUdTKSIKKworI1NDTyBPcGVuU2VydmVyIDUuMC42YSwgbm8gbmV0d29ya2luZywgU0NPIGRldmVsb3BtZW50IHRvb2xzLgorI1RoaXMgb25lIGhhcyBwYXRjaGVkIHNpbyBkcml2ZXJzIHRoYXQsIGZvciB0aGUgZmlyc3QgdGltZSwKKyNhY3R1YWxseSBoYW5kbGUgbW9kZW0gc2lnbmFscyBjb3JyZWN0bHkuCisjIEFkZCAtRERDTFRJTUVWQUwgd2hlbiBidWlsZGluZyB3aXRoIFVESy4KK3NjbzMydjUwNmE6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzY28zMnY1MDAgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFNDT19PU1I1MDUgLURTQ09fT1NSNTA2IC1EU0NPX09TUjUwNkEgLURORUVETURNREVGUyBcCisJLWIgZWxmIC1EUE9TSVggJChLRkxBR1MpIgorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wLjZhIHdpdGggbmV0d29ya2luZywgU0NPIGRldmVsb3BtZW50IHRvb2xzLgorIyBBZGQgLUREQ0xUSU1FVkFMIHdoZW4gYnVpbGRpbmcgd2l0aCBVREsuCitzY28zMnY1MDZhbmV0OgorCUBlY2hvIFRDUC9JUCBuZXR3b3JraW5nIGFkZGVkLi4uCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBzY28zMnY1MDBuZXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIktGTEFHUz0tRFNDT19PU1I1MDUgLURTQ09fT1NSNTA2IC1EU0NPX09TUjUwNkEgLURORUVETURNREVGUyBcCisJLWIgZWxmIC1EUE9TSVggJChLRkxBR1MpIgorCisjU0NPIE9wZW5TZXJ2ZXIgNS4wLjcsIG5vIG5ldHdvcmtpbmcsIFNDTyBkZXZlbG9wbWVudCB0b29scy4KKyNBZGRzIGZsYWdzIHRvIG1ha2UgUFRZIGFuZCBTU0ggY29tbWFuZHMgd29yay4gIFRoZXNlIGhhdmUgYmVlbiB0ZXN0ZWQKKyNvbmx5IGluIDUuMC43IGJ1dCBwcm9iYWJseSB0aGV5IGNhbiBhbHNvIGJlIGFkZGVkIHRvIGVhcmxpZXIgT1NSNSB0YXJnZXRzLgorc2NvMzJ2NTA3OgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgc2NvMzJ2NTAwIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJLRkxBR1M9LURTQ09fT1NSNTA1IC1EU0NPX09TUjUwNiAtRFNDT19PU1I1MDcgLURORUVETURNREVGUyBcCisJLURIQVZFX1BUU05BTUUgLURIQVZFX1BUTVggLURIQVZFX0dSQU5UUFQgXAorCS1iIGVsZiAtRFBPU0lYICQoS0ZMQUdTKSIKKworI1NDTyBPcGVuU2VydmVyIDUuMC43IGFzIGFib3ZlIGJ1dCB3aXRoIG5ldHdvcmtpbmcuCitzY28zMnY1MDduZXQ6CisJQGVjaG8gVENQL0lQIG5ldHdvcmtpbmcgYWRkZWQuLi4KKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHNjbzMydjUwMG5ldCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiS0ZMQUdTPS1EU0NPX09TUjUwNSAtRFNDT19PU1I1MDYgLURTQ09fT1NSNTA3IC1ETkVFRE1ETURFRlMgXAorCS1ESEFWRV9QVFNOQU1FIC1ESEFWRV9QVE1YIC1ESEFWRV9HUkFOVFBUIFwKKwktYiBlbGYgLURQT1NJWCAkKEtGTEFHUykiCisKKyNUYW5keSAxNi82MDAwIHdpdGggWGVuaXggMy4wCisjQWRkIG1vcmUgLUROT3h4eCBvcHRpb25zIHRvIHJlbW92ZSBmZWF0dXJlcyBpZiBwcm9ncmFtIHdvbid0IGxvYWQuCisjU3VjY2Vzc2Z1bCBvcGVyYXRpb24gaXMgYSBmdW5jdGlvbiBvZiBwcm9ncmFtIHNpemUsIHBoeXNpY2FsIG1lbW9yeSwKKyNhdmFpbGFibGUgc3dhcCBzcGFjZSwgZXRjLiAgVGhlIGZvbGxvd2luZyBzdHJpcHBlZC1kb3duIGNvbmZpZ3VyYXRpb24KKyNzZWVtcyB0byB3b3JrIG9uIG1vc3QgVGFuZHkgNjAwMHMuICBOT1RFOiAiLSsiIG1lYW5zIGFsbG93IGxvbmcgdmFyaWFibGUKKyNuYW1lcywgbmVlZGVkIGZvciBDLUtlcm1pdCA2LjAgYmVjYXVzZSBzb21lIGlkZW50aWZpZXJzIGFyZSBub3QgdW5pcXVlCisjd2l0aGluIHRoZSBmaXJzdCBzaXggY2hhcmFjdGVycy4KKyNDLUtlcm1pdCA3LjAgZG9lcyBub3QgYnVpbGQgaGVyZTsgInRvbyBtYW55IGRlZmluZXMiLgordHJzMTY6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgVGFuZHkgMTYvNjAwMCwgWGVuaXggMy4wLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtKyAtREFUVFNWIC1EVFJTMTYgLUROT01LRElSIC1ERENMUE9QRU4gLURDS19DVVJTRVMgXAorCS1ETk9ERUJVRyAtRE5PVExPRyAtRE5PSEVMUCAtRE5PU0NSSVBUIC1ETk9DU0VUUyAtRE5PSUtTRCBcCisJLUROT1JFRElSRUNUIC1ETk9TWVNMT0cgLUROT1BVVEVOViAtRE5PUkVBTFBBVEggLUROT0xFQVJOIFwKKwkkKEtGTEFHUykgLU8iICJMSUJTPSAtbGN1cnNlcyAtbHRlcm1jYXAiICJMTktGTEFHUyA9IC0rIC1uIC1zIgorCisjTUlOSVgvMi4wIDMyIEJpdCB2ZXJzaW9uIGZvciBpbnRlbCAzODYrIHJ1bm5pbmcgdGhlIFBPU0lYLWNvbXBsaWFudCBNSU5JWAorIyB2ZXJzaW9uIDIuMCAoVGhlIGRlZmluaXRpb24gb2YgZmF0YWwgYXZvaWRzIGEgY29uZmxpY3Qgd2l0aCBhIHN5bWJvbCBieQorIyB0aGUgc2FtZSBuYW1lIGluIHRoZSBjdXJzZXMgbGlicmFyeS4pIEl0IGlzIGltcG9zc2libGUgdG8gY29tcGlsZSB3aXRoCisjIG5ldHdvcmsgc3VwcG9ydCBzaW5jZSBNaW5peCBkb2VzIG5vdCBzdXBwb3J0IEJlcmtlbGV5IHNvY2tldHMuCisjIE5vdGU6IHVzZSBjaG1lbSBsaWJlcmFsbHkgb24gdGhlIGNvbXBpbGVyIHBhc3NlcywgbWFrZSwgYW5kIHRoZSBmaW5hbAorIyBrZXJtaXQgZXhlY3V0YWJsZS4gKDMgbWVnYWJ5dGVzIG9mIG1lbW9yeSBmb3IgZWFjaCBpcyBzdWZmaWNpZW50LikKKyMgRnJvbSBUZXJyeSBNY0Nvbm5lbGwsIFN5cmFjdXNlIFUsIGFuZCBXaWxsIFJvc2UuICBXaWxsIHNheXM6CisjIFRoZSBzdGFja3MgZm9yIG1ha2UgYW5kIHNvbWUgY29tcGlsZXIgcGFzc2VzIG5lZWRlZCB0byBiZSBpbmNyZWFzZWQKKyMgd2l0aCBjaG1lbSBhcyBmb2xsb3dzOgorIyAgIG1ha2UgMU1CCisjICAgL3Vzci9saWIvZW1fY2VtY29tLmFuc2kgM01CCisjICAgL3Vzci9saWIvZW1fb3B0IDFNQgorIyAgIC91c3IvbGliL2kzODYvY2cgMU1CCisjICAgL3Vzci9saWIvaTM4Ni9hcyAxTUIKKyMgVGhlIGNvbXBpbGVyIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2FzIHNldCB0byAvdXNyL3RtcCB2aWEgdGhlIFRNUERJUgorIyBlbnZpcm9ubWVudCB2YXJpYWJsZTsgbW9yZSB0aGFuIDFNQiBvZiB0ZW1wb3Jhcnkgc3BhY2Ugd2FzIG5lZWRlZC4KKyMgS2VybWl0IGl0c2VsZiBuZWVkcyBhdCBsZWFzdCAxTUIgb2Ygc3RhY2suCittaW5peDIwOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE1JTklYIDIuMC8zODYuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBFWFQ9byBcCisJIkNGTEFHUz0gIC13byAtRFY3IC1ETUlOSVgyIC1ETUlOSVggLURTSUdfViAtRF9QT1NJWF9TT1VSQ0UgXAorCS1EQ0tDUFU9XFxcImktMzg2XFxcIiAtRE5PSUtTRCAtRGZhdGFsPW15ZmF0YWwgLURDS19DVVJTRVMgLUROT0xFQVJOIFwKKwktRE5PU1lTTE9HIC1EVVNFX01FTUNQWSAtRE5PUkVBTFBBVEggJChLRkxBR1MpIiAiTElCUz0gLWxjdXJzZXMiCisKKyNNSU5JWC8zODYgKFBDIE1pbml4IG1vZGlmaWVkIGJ5IEJydWNlIEV2YW5zIGluIEF1c3RyYWxpYSBmb3IgMzg2IGFkZHJlc3NpbmcpCisjIEZvciBNSU5JWCAxLjUrIChidXQgPCAyLjApCittaW5peDM4NjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBNSU5JWC8zODYuLi4nCisJQGVjaG8gJ1RPVEFMTFkgVU5URVNURUQhJworCSQoTUFLRSkgd2VybWl0IEVYVD1zIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EVjcgLURNSU5JWCAtRF9QT1NJWF9TT1VSQ0UgLUROT0xFQVJOICQoS0ZMQUdTKSIKKworI01JTklYLzM4NiBNaW5peCBtb2RpZmllZCBieSBCcnVjZSBFdmFucyBpbiBBdXN0cmFsaWEgdG8gdXNlIDM4NiBhZGRyZXNzaW5nCittaW5peDM4NmdjYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBNSU5JWC8zODYgd2l0aCBnY2MuLi4nCisJQGVjaG8gJ1RPVEFMTFkgVU5URVNURUQhJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIkNDPWdjYyAtZyAtTyIgIkNDMj1nY2MgLWciIFwKKwkiQ0ZMQUdTPSAtRFY3IC1ETUlOSVggLURfUE9TSVhfU09VUkNFIC1ETk9MRUFSTiAkKEtGTEFHUykiCisKKyNNSU5JWCAtIDY4ayB2ZXJzaW9uIHdpdGggQUNLIGNvbXBpbGVyLgorIyBJZiB5b3UgaGF2ZSB0cm91YmxlIGNvbXBpbGluZyBvciBydW5uaW5nIHdhcnQsICJ0b3VjaCB3YXJ0Ii4KKyMgSWYgaXQgc3RpbGwgZG9lc24ndCB3b3JrLCAidG91Y2ggY2tjcHJvLmMiLgorIyBUaGUgdmVyc2lvbiBjb25maWd1cmVkIGJlbG93IGhhcyBtYW55IGZlYXR1cmVzIHJlbW92ZWQsIGluY2x1ZGluZworIyB0aGUgVFJBTlNNSVQsIE1TRU5ELCBIRUxQLCBhbmQgU0NSSVBUIGNvbW1hbmRzLCBpbnRlcm5hdGlvbmFsCisjIGNoYXJhY3RlciBzZXQgc3VwcG9ydCwgYW5kIHRoZSBlbnRpcmUgc2NyaXB0IHByb2dyYW1taW5nIGxhbmd1YWdlLgorIyBCdXQgaXQgZG9lcyBoYXZlIGFuIGludGVyYWN0aXZlIGNvbW1hbmQgcGFyc2VyLgorIyBNYWtlIHN1cmUgbWFrZSgxKSBoYXMgKGF0IGxlYXN0KSAxMDAwMDAgY2htZW1vcnkhCisjIElmIHlvdSBhcmUgdXNpbmcgdGhlIEFtc3RlcmRhbSBDIGNvbXBpbGVyLCB5b3UgbWlnaHQgaGF2ZSB0byBhZGQgIi1EX19BQ0tfXyIuCittaW5peDY4azoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBNSU5JWCA2OGsgd2l0aCBBQ0suLi4KKwkkKE1BS0UpIHdlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTPSAtRFY3IC1ETUlOSVggLURfTUlOSVggLURfUE9TSVhfU09VUkNFIC1ETk9MRUFSTiBcCisJLUROT0RJQUwgLUROT0hFTFAgLUROT0RFQlVHIC1ETk9UTE9HIFwKKwktRE5PU0NSSVBUIC1ETk9DU0VUUyAtRE5PU1BMICQoS0ZMQUdTKSBcCisJLURQSURfVD1waWRfdCAtRFVJRF9UPXVpZF90IC1ER0lEX1Q9Z2lkX3QgLURTSUdfViIKKworI01JTklYIC0gNjhrIHZlcnNpb24gd2l0aCBjNjggY29tcGlsZXIuCisjIElmIHlvdSBoYXZlIHRyb3VibGUgY29tcGlsaW5nIG9yIHJ1bm5pbmcgd2FydCwgInRvdWNoIHdhcnQiIG9yCisjICJ0b3VjaCBja2Nwcm8uYyIuIENvbXBpbGluZyBja3VkaWEuYyAobm8gLUROT0RJQUwhKSBtaWdodCBmYWlsLiA6LSgKKyMgR2l2ZSBjNjggMjUwMDAwIGJ5dGVzIG9mIHN0YWNrK2hlYXA7IG1ha2Ugc3VyZSBtYWtlKDEpIGhhcyBhdCBsZWFzdAorIyAxMDAwMDAgY2htZW1vcnkuICBPbiBhIDFNQiBBdGFyaSBTVCB0aGlzIG1lYW5zIHRoYXQgdGhlIHJlY3Vyc2l2ZQorIyBjYWxsIG9mIG1ha2UgZmFpbHMgZHVlIHRvIG1lbW9yeSBzaG9ydGFnZS4gIFRyeSAibWFrZSAtbiBtaW5peGM2OCA+bWFrZWl0IiwKKyMgZm9sbG93ZWQgYnkgIi4gbWFrZWl0Ii4gIE90aGVyd2lzZSwgYXMgYWJvdmUuCittaW5peGM2ODoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBNSU5JWCA2OGsgd2l0aCBjNjguLi4KKwkkKE1BS0UpIHdlcm1pdCAiQ0M9IGNjIC1jNjgiIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EVjcgLURNSU5JWCAtRF9NSU5JWCAtRF9QT1NJWF9TT1VSQ0UgLUROT0xFQVJOIFwKKwktRE5PRElBTCAtRE5PSEVMUCAtRE5PREVCVUcgLUROT1RMT0cgXAorCS1ETk9TQ1JJUFQgLUROT0NTRVRTIC1ETk9TUEwgJChLRkxBR1MpIFwKKwktRFBJRF9UPXBpZF90IC1EVUlEX1Q9dWlkX3QgLURHSURfVD1naWRfdCAtRFNJR19WIgorCisjTUlOSVggLSA2OGsgdmVyc2lvbiB3aXRoIGM2OCBjb21waWxlci4KKyNBIHZhcmlhdGlvbiBvbiB0aGUgYWJvdmUgdGhhdCB3YXMgcmVjZW50bHkgKFNlcCA5NSkgcmVwb3J0ZWQgdG8gd29yay4KK21pbml4YzY4YToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBNSU5JWCA2OGsgd2l0aCBjNjguLi4KKwkkKE1BS0UpIHdlcm1pdCAiQ0M9IGNjIC1jNjgiIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1M9IC1EVjcgLURNSU5JWCAtRF9NSU5JWCAtRF9QT1NJWF9TT1VSQ0UgXAorCS1EQ0tfQU5TSUMgLUROT0RFQlVHIC1ETk9UTE9HIC1ETUlOSURJQUwgLURFWFRFTiAtRE1ZQ1VSU0VTIFwKKwktRE5PU0NSSVBUIC1ETk9DU0VUUyAtRE5PU1BMIC1ETk9KQyAtRERJUkVOVCAtRE5PTEVBUk4gXAorCS1ETk9TRVRLRVkgLUROT0VTQ1NFUSAkKEtGTEFHUykgXAorCS1EUElEX1Q9cGlkX3QgLURVSURfVD11aWRfdCAtREdJRF9UPWdpZF90IC1EU0lHX1YiCisKKyNNSVBTIENvbXB1dGVyIFN5c3RlbXMgd2l0aCBVTUlQUyBSSVNDL09TIDQuNTIgPSBBVCZUIFVOSVggU3lzdGVtIFYgUjMuMC4KKyNSZW1vdmUgLUROT0pDIGlmIGpvYiBjb250cm9sIGNhbiBiZSBzYWZlbHkgdXNlZC4KK21pcHM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTUlQUyBSSVNDL09TLi4uJworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtRE1JUFMgLURESVJFTlQgLURDS19QT0xMIC1ETk9KQyAtRE5PTEVBUk4gLURQSURfVD1pbnQgXAorCS1ER0lEX1Q9Z2lkX3QgLURVSURfVD11aWRfdCAtaSAtTzE1MDAgJChLRkxBR1MpIgorCisjQXMgYWJvdmUsIGJ1dCB3aXRoIFRDUC9JUCBhbmQgZnVsbHNjcmVlbiBzdXBwb3J0LgorbWlwc3RjcGM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTUlQUyBSSVNDL09TLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtRE1JUFMgLURESVJFTlQgLURDS19QT0xMIC1ETk9KQyBcCisJLURUQ1BTT0NLRVQgLURDS19DVVJTRVMgLUkvdXNyL2luY2x1ZGUvYnNkIFwKKwktRFBJRF9UPWludCAtREdJRF9UPWdpZF90IC1EVUlEX1Q9dWlkX3QgLWkgLU8xNTAwICQoS0ZMQUdTKSIgXAorCSJMSUJTID0gLWxjdXJzZXMgLWxic2QiCisKKyNNb3Rvcm9sYSBEZWx0YSBTeXN0ZW0gVi82OCBSMywgc2lnbmFsKCkgaXMgdm9pZCByYXRoZXIgdGhhbiBpbnQuCisjVXNlcyBkaXJlbnQuaCBhbmQgSG9uZXkgRGFuQmVyIHV1Y3AuICBTdXBwb3J0cyBUQ1AvSVAuCisjQWZ0ZXIgYnVpbGRpbmcsIHVzZSAibWNzIC1kIiB0byByZWR1Y2Ugc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtLgorc3Y2OHIzOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE1vdG9yb2xhIFVOSVggU3lzdGVtIFYvNjggUjMuLi4nCisJJChNQUtFKSB3ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EU1ZSMyAtRFNWNjggLURESVJFTlQgLURIREJVVUNQIC1ETk9fRE5TX1NSViAtRFRDUFNPQ0tFVCBcCisJLUROT1VOSUNPREUgLUROT0xFQVJOIC1EVVNFX01FTUNQWSAkKEtGTEFHUykgLU8iICJMTktGTEFHUyA9IgorCisjTW90b3JvbGEgRGVsdGEgU3lzdGVtIFYvNjggUjNWNSwgc2lnbmFsKCkgaXMgdm9pZCByYXRoZXIgdGhhbiBpbnQuCisjVXNlcyBkaXJlbnQuaCBhbmQgSG9uZXkgRGFuQmVyIFVVQ1AuICBTdXBwb3J0cyBUQ1AvSVAuCisjQWZ0ZXIgYnVpbGRpbmcsIHVzZSAibWNzIC1kIiB0byByZWR1Y2Ugc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtLgorc3Y2OHIzdjU6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTW90b3JvbGEgVU5JWCBTeXN0ZW0gVi82OCBSM1Y1JworCSQoTUFLRSkgd2VybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtRFNWUjMgLURTVjY4IC1ERElSRU5UIC1ESERCVVVDUCAtRE5PX0ROU19TUlYgLURVU0VfTUVNQ1BZIFwKKwktRFRDUFNPQ0tFVCAtRElOQUREUlggLUROT1VOSUNPREUgLURGTkZMT0FUIC1ETk9MRUFSTiAkKEtGTEFHUykgLU8iIFwKKwkiTE5LRkxBR1MgPSIgIkxJQlMgPSAtbGluZXQgLWxtIgorCisjTW90b3JvbGEgTVZNRTE0NyBTeXN0ZW0gVi82OCBSMyBWNS4xLiBSZXF1aXJlcyBnY2MgMi4xIHRvIGNvbXBpbGUuCisjQWZ0ZXIgYnVpbGRpbmcsIHVzZSAibWNzIC1kIiB0byByZWR1Y2Ugc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtLgorc3Y2OHIzdjUxOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE1vdG9yb2xhIFVOSVggU3lzdGVtIFYvNjggUjNWNS4xJworCSQoTUFLRSkgd2VybWl0ICJDQz1nY2MtZGVsdGEiICJDQzI9Z2NjLWRlbHRhIiBcCisJS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EU1ZSMyAtRERJUkVOVCAtREhEQlVVQ1AgLUROT0RFQlVHIC1ETk9fRE5TX1NSViAtRE5PTEVBUk4gXAorCS1ETk9VTklDT0RFIC1ERk5GTE9BVCAtRFNWNjggLURVU0VfTUVNQ1BZICQoS0ZMQUdTKSBcCisJLU8yIC12IC1mdHJhZGl0aW9uYWwiIFwKKwkiTE5LRkxBR1MgPSAtcyAtdiIgIkxJQlMgPSAtbG04ODEgLWxtIgorCisjTW90b3JvbGEgTVZNRTE0NyBTeXN0ZW0gVi82OCBSM1Y2LiBkZXJpdmVkIGZyb20gTW90b3JvbGEgRGVsdGEgU3lzdGVtIFIzVjUuCisjQ2hlY2tlZCBvbiBsYXJnZXIgTW90b3JvbGEgU3lzdGVtIFYvNjggUjNWNiAod2l0aCBOU0UgTmV0d29yayBTZXJ2aWNlcyBFeHQuKQorI0FmdGVyIGJ1aWxkaW5nLCB1c2UgInN0cmlwIiB0byByZWR1Y2Ugc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtLgorIyAiTElCUyA9IC1sbnNsIiByZW1vdmVkIGluIEMtS2VybWl0IDYuMSAtIHB1dCBiYWNrIGlmIG5lZWRlZC4KKyMgIkxJQlMgPSBsbSIgYWRkZWQgaW4gNy4xLzguMCBmb3IgZmxvYXRpbmctcG9pbnQgbWF0aC4KKyMgY2t1dXNyLmMgY2xvYmJlcnMgdGhlIG9wdGltaXplci4KK3N2NjhyM3Y2OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE1vdG9yb2xhIFVOSVggU3lzdGVtIFYvNjggUjNWNicKKwkkKE1BS0UpIGNrdXVzci4kKEVYVCkgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJIkNGTEFHUyA9IC1EU1Y2OFIzVjYgLURESVJFTlQgLURIREJVVUNQIC1ETk9MT0dJTiAtRE5PSU5JVEdST1VQUyBcCisJLUROT1NZTUxJTksgLUROT1JFRElSRUNUIC1ETk9HRlRJTUVSIC1EVENQU09DS0VUIC1ERENMR0VUQ1dEIC1EU1Y2OCBcCisJLUROT19ETlNfU1JWIC1ETk9VTklDT0RFIC1ERk5GTE9BVCAtRFNFTEVDVCAtRFVTRV9NRU1DUFkgJChLRkxBR1MpIgorCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtTyAtRFNWNjhSM1Y2IC1ERElSRU5UIC1ESERCVVVDUCAtRE5PTE9HSU4gLUROT0lOSVRHUk9VUFMgXAorCS1ETk9TWU1MSU5LIC1ETk9SRURJUkVDVCAtRE5PR0ZUSU1FUiAtRFRDUFNPQ0tFVCAtRERDTEdFVENXRCAtRFNWNjggXAorCS1ETk9fRE5TX1NSViAtRE5PVU5JQ09ERSAtREZORkxPQVQgLURTRUxFQ1QgLURVU0VfTUVNQ1BZICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUyA9IiAiTElCUyA9IC1sbSIKKworI01vdG9yb2xhIERlbHRhIFN5c3RlbSBWLzg4IFIzMiwgc2lnbmFsKCkgaXMgdm9pZCByYXRoZXIgdGhhbiBpbnQuCisjVXNlcyBkaXJlbnQuaCBhbmQgSG9uZXkgRGFuQmVyIHV1Y3AuICBOZWVkcyA8c3lzL3V0aW1lLmg+IGZvciBzZXR0aW5nCisjZmlsZSBkYXRlcy4gIFN1cHBvcnRzIFRDUC9JUC4KKyNBZnRlciBidWlsZGluZywgdXNlICJtY3MgLWQiIHRvIHJlZHVjZSBzaXplIG9mIHRoZSBleGVjdXRhYmxlIHByb2dyYW0uCitzdjg4cjMyOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE1vdG9yb2xhIFVOSVggU3lzdGVtIFYvODggUjMyLi4uJworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gXAorCSJDRkxBR1MgPSAtRFNWODhSMzIgLURESVJFTlQgLURIREJVVUNQIC1EVENQU09DS0VUIFwKKwktRFNZU1VUSU1FSCAtRENLX0NVUlNFUyAtRE5PR0VUVVNFUlNIRUxMIC1ER1RPRE9ORUFSRyAkKEtGTEFHUykgLU8iIFwKKwkiTElCUz0gLWxjdXJzZXMgLWxyZXNvbHYiICJMTktGTEFHUyA9IC1zIgorCisjTW90b3JvbGEgRGVsdGEgU3lzdGVtIFYvODggUjQwLiAgSGFzIDxzeXMvdGVybWlveC5oPiwgcmVndWxhciBCZXJrZWxleQorI3NvY2tldHMgbGlicmFyeSwgaS5lLiBpbi5oIGFuZCBpbmV0LmggYXJlIG5vdCBtaXNwbGFjZWQgaW4gc3lzIChyYXRoZXIgdGhhbgorI25ldGluZXQgYW5kIGFycGEsIHJlc3BlY3RpdmVseSkuICBVc2VzIEFOU0kgQyBjb25zdHJ1Y3RzLCBhZHZpc29yeSBmaWxlCisjbG9ja2luZyBvbiBkZXZpY2VzLCBldGMuICBjdXJzZXMgc3VwcG9ydCBhZGRlZC4gIFJlcG9ydGVkbHksIHRoZQorIy91c3IvaW5jbHVkZS9zeXMvdm5vZGUuaCBmaWxlIGhhcyBhIGJ1ZyB3aGljaCBtdXN0IGJlIGZpeGVkIGJlZm9yZSB0aGlzCisjbWFrZWZpbGUgZW50cnkgY2FuIHdvcmsgY29ycmVjdGx5LiAgVGhlICJpZiBERUJVRyIgZGlyZWN0aXZlIGF0IGFib3V0IGxpbmUKKyMzMjAgbXVzdCBiZSBjaGFuZ2VkIHRvICJpZmRlZiBERUJVRyIgKFJlcG9ydGVkbHksIHRoaXMgd2FzIGZpeGVkIGluCisjaW4gU3lzdGVtIFYvODggUjQuMykuCisjQWZ0ZXIgYnVpbGRpbmcsIHVzZSAibWNzIC1kIiB0byByZWR1Y2Ugc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtLgorc3Y4OHI0MDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBNb3Rvcm9sYSBVTklYIFN5c3RlbSBWLzg4IFI0MC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURTVlI0IC1ETU9UU1Y4OFI0IC1ERElSRU5UIC1ESERCVVVDUCAtRFNURVJNSU9YIFwKKwktRFRDUFNPQ0tFVCAtRENLX0NVUlNFUyAtRE5PR0VUVVNFUlNIRUxMIC1ER1RPRE9ORUFSRyAtREZORkxPQVQgXAorCSQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbHNvY2tldCAtbG5zbCAtbGN1cnNlcyAtbHJlc29sdiAtbG0iICJMTktGTEFHUyA9IC1zIgorCisjQXMgYWJvdmUgYnV0IHdpdGhvdXQgdGhlIGZsb2F0aW5nLXBvaW50IG1hdGggbGlicmFyeS4KK3N2ODhyNDBubToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBNb3Rvcm9sYSBVTklYIFN5c3RlbSBWLzg4IFI0MC4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwkiQ0ZMQUdTID0gLU8gLURTVlI0IC1ETU9UU1Y4OFI0IC1ERElSRU5UIC1ESERCVVVDUCAtRFNURVJNSU9YIFwKKwktRFRDUFNPQ0tFVCAtRENLX0NVUlNFUyAtRE5PR0VUVVNFUlNIRUxMIC1ER1RPRE9ORUFSRyAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxzb2NrZXQgLWxuc2wgLWxjdXJzZXMgLWxyZXNvbHYiICJMTktGTEFHUyA9IC1zIgorCisjQXMgYWJvdmUgYnV0IHdpdGggZmxvYXRpbmctcG9pbnQgbWF0aCBsaWJyYXJ5IHN1cHBvcnQgXGZmcC4uLigpIGZ1bmN0aW9ucworI2FuZCBTLUV4cHJlc3Npb25zLgorCisjT2xpdmV0dGkgWC9PUyBSMi4zLCAzLnguCisjTk9URVM6CisjIC4gSWYgeW91IGJ1aWxkIHRoZSBleGVjdXRhYmxlIG9uIDIueCBYL09TLCBpdCB3aWxsIGFsc28gcnVuIG9uIDMueC4KKyMgLiBJZiB5b3UgYnVpbGQgaXQgb24gMy54IFgvT1MsIGl0IHdpbGwgTk9UIHJ1biBvbiAyLnguCisjIC4gS2VybWl0IGNhbiBydW4gd2l0aCBubyBwcml2aWxlZ2VzIHVubGVzcyB0aGUgdXVjcCBsaW5lcyBhcmUgcHJvdGVjdGVkLAorIyAgIGluIHdoaWNoIGNhc2Uga2VybWl0IG11c3QgYmUgb3duZWQgYnkgdXVjcCB3aXRoIHN1aWQgYml0IHNldDoKKyMgICBjaG93biB1dWNwIGtlcm1pdCA7IGNobW9kIDQxMTEga2VybWl0LgoreG9zMjM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgT2xpdmV0dGkgWC9PUy4uLicKKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKwknQ0ZMQUdTPS1PTE0gLURPWE9TIC1EVENQU09DS0VUIC1ESERCVVVDUCAkKEtGTEFHUyknIFwKKwkiTElCUz0iICJMTktGTEFHUz0iCisKKyNBcyBhYm92ZSwgYnV0IHdpdGggY3Vyc2VzLgoreG9zMjNjOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE9saXZldHRpIFgvT1Mgd2l0aCBjdXJzZXMuLi4nCisJJChNQUtFKSB4ZXJtaXQgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBcCisJJ0NGTEFHUz0tT0xNIC1ET1hPUyAtRFRDUFNPQ0tFVCAtREhEQlVVQ1AgLURDS19DVVJTRVMgJChLRkxBR1MpJyBcCisJIkxJQlM9LWxjdXJzZXMiICJMTktGTEFHUz0iCisKK2NrdXVpZDoKKwlAZWNobyAnYnVpbGRpbmcgQy1LZXJtaXQgJChDS1ZFUikgc2V0LVVJRC9zZXQtR0lEIHRlc3QgcHJvZ3JhbXMnCisJJChDQykgLURBTllCU0QgLURTQVZFRFVJRCAtbyBja3V1aWQxIGNrdXVpZC5jCisJJChDQykgLURBTllCU0QgLW8gY2t1dWlkMiBja3V1aWQuYworCSQoQ0MpIC1EQU5ZQlNEIC1ETk9TRVRSRVUgLW8gY2t1dWlkMyBja3V1aWQuYworCSQoQ0MpIC1EQU5ZQlNEIC1EU0VURVVJRCAtRE5PU0VUUkVVIC1vIGNrdXVpZDQgY2t1dWlkLmMKKwkkKENDKSAtbyBja3V1aWQ1IGNrdXVpZC5jCisJQGVjaG8gJ1JlYWQgdGhlIHRvcCBvZiBja3V1aWQuYyBmb3IgZGlyZWN0aW9ucy4uLmZvciB0ZXN0aW5nJworCUBlY2hvICd5b3UgbXVzdCBtYWtlIHRoZXNlIHByb2dyYW1zIHNldHVpZCBhbmQgc2V0Z2lkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEEgTiBUIEkgUSBVIEkgVCBJIEUgUworIworIyBUaGUgZm9sbG93aW5nIGFyZSBhbnRpcXVlIHRhcmdldHMgZnJvbSBDLUtlcm1pdCA1QSBvciBlYXJsaWVyLiAgVGhleSBoYXZlCisjIG5vdCBiZWVuIHVwZGF0ZWQgb3IgdGVzdGVkIGluIHllYXJzLiAgTW9zdCBvZiB0aGVtIHdpbGwgbmVlZCByZWNlbnQgZmVhdHVyZXMKKyMgZGlzYWJsZWQsIHVzdWFsbHkgd2l0aCBzb21lIGNvbWJpbmF0aW9uIG9mIC1ETk9VTklDT0RFLCAtRE5PSUtTRCwgLUROT0FOU0ksCisjIC1ETk9DS0dITkxIT1NULCAtRE5PX0ROU19TUlYsIC1ETk9SRURJUkVDVCwgLUROT1JFQUxQQVRILCAtRE5PQ1VSU0VTLCBldGMuCisjIFRoZXkgYXJlIGFsc28gbWlzc2luZyB0aGUgS1RBUkdFVD0kJHtLVEFSR0VUOi0kKEApfSBidXNpbmVzcy4KKyMgRm9yIGRldGFpbHMgc2VlIGNrdWlucy50eHQgYW5kIGNrY2NmZy50eHQuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyNCZXJrZWxleSBVbml4IDIuOCwgMi45IGZvciBQRFAtMTFzIHdpdGggSSZEIHNwYWNlLCBtYXliZSBhbHNvIFVsdHJpeC0xMT8/PworI0MtS2VybWl0KDVBKSBpcyBzaW1wbHkgdG9vIGxhcmdlIChldmVuIHR1cm5pbmcgb2ZmIGFsbW9zdCBldmVyeSBmZWF0dXJlCisjYXZhaWxhYmxlKSB0byBydW4gd2l0aG91dCBib3RoIEkmRCBzcGFjZSBwbHVzIG92ZXJsYXlzLiAgVGhlIG9sZCBjb21tZW50Cisjc3VnZ2VzdGVkIHJ1bm5pbmcgJ3BjYycgYnV0IHRoYXQgd29uJ3QgaGVscC4gIENoYW5naW5nICdjYycgdG8gJ2NrdXN0ci5zZWQnCisjd2lsbCBjYXVzZSBhIHN0cmluZyBleHRyYWN0aW9uIHRvIGJlIGRvbmUsIHNhdmluZyBEIHNwYWNlIGJ5IG1vdmluZyBzdHJpbmdzCisjdG8gYSBmaWxlLgorYnNkMjk6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciAyLjggb3IgMi45QlNELgorCUBlY2hvIFJlYWQgdGhlIG1ha2VmaWxlIGlmIHlvdSBoYXZlIHRyb3VibGUgd2l0aCB0aGlzLi4uCisJJChNQUtFKSBvdndlcm1pdCBcCisJIkNGTEFHUz0gLURCU0QyOSAtRE5PREVCVUcgLUROT1RMT0cgLUROT0NTRVRTIC1ETk9IRUxQIFwKKwktRE5PU0NSSVBUIC1ETk9TUEwgLUROT1hNSVQgLUROT0RJQUwgJChLRkxBR1MpIiBcCisJIkxOS0ZMQUdTPSAtaSAtbG5kaXIiICJDQz0gY2MgIiAiQ0MyPSBjYyIKKworYnNkMjEwOgorCUBlY2hvIFBsZWFzZSB1c2UgY2t1YnMyLm1hayB0byBidWlsZCBDLUtlcm1pdCAkKENLVkVSKSBmb3IgMi4xMEJTRC4KKworYnNkMjExOgorCUBlY2hvIFBsZWFzZSB1c2UgY2t1YnMyLm1hayB0byBidWlsZCBDLUtlcm1pdCAkKENLVkVSKSBmb3IgMi4xMUJTRC4KKworI0NoYXJsZXMgUml2ZXIgRGF0YSBTeXN0ZW1zIFVuaXZlcnNlIHdpdGggVU5PUyBWZXJzaW9uIDkuMgorY3JkczoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBDaGFybGVzIFJpdmVyIERhdGEgU3lzdGVtcy4uLicKKwltYWtlIHhlcm1pdCBcCisJIkNGTEFHUyA9IC1EQVRUU1YgLUROT0FOU0kgLURESVJFTlQgLURMT05HRk4gLURUQ1BTT0NLRVQgXAorCS1ETE9DS19ESVI9XFxcIi91c3Ivc3Bvb2wvdXVjcFxcXCIgLUROT1NFVFJFVSBcCisJLURzdXNwZW5kPWtzdXNwZW5kICQoS0ZMQUdTKSAtTyIgIkxOS0ZMQUdTID0iCisKKyNNaWNyb3BvcnQgU1YvQVQgZm9yIElCTSBQQy9BVCAyODYgYW5kIGNsb25lcywgU3lzdGVtIFYgUjIuCisjVGhlIC1PIGZsYWcgbWF5IGZhaWwgb24gc29tZSBtb2R1bGVzIChsaWtlIGNrdXVzMi5jKSwgaW4gd2hpY2ggY2FzZSB5b3UKKyNzaG91bGQgY29tcGlsZSB0aGVtIGJ5IGhhbmQsIG9taXR0aW5nIHRoZSAtTy4gIElmIHlvdSBnZXQgImhhc2ggdGFibGUKKyNvdmVyZmxvdyIsIHRyeSBhZGRpbmcgLUROT0RFQlVHLgorI0Fsc28sIHJlcG9ydGVkbHkgdGhpcyBjb21waWxlcyBiZXR0ZXIgd2l0aCBnY2MgdGhhbiB3aXRoIGNjLgorbXBzeXN2OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE1pY3JvcG9ydCBTVi9BVCAyODYuLi4nCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1M9IC1EQVRUU1YgLUROT0xFQVJOICQoS0ZMQUdTKSAtTyAtTWwiICJMTktGTEFHUyA9IC1NbCIKKworI01pY3Jvc29mdCAiWGVuaXgvMjg2IiBlLmcuIGZvciBJQk0gUEMvQVQKK3hlbml4OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFhlbml4LzI4NicKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUz0gLURYRU5JWCAtRE5PRklMRUggLUROT0xFQVJOICQoS0ZMQUdTKSAtRHVuaXggLUYgMzAwMCAtaSIgXAorCSJMTktGTEFHUyA9IC1GIDMwMDAgLWkiCisKKyNQQy9JWCwgSW50ZXJhY3RpdmUgQ29ycCBTeXN0ZW0gSUlJIGZvciBJQk0gUEMvWFQKK3BjaXg6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgUEMvSVguLi4nCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1M9IC1EUENJWCAtRElTSUlJIC1ETk9MRUFSTiAkKEtGTEFHUykgXAorCS1Ec2RhdGE9c2RhdGF4IC1PIC1pIiAiTE5LRkxBR1MgPSAtaSIKKworI0ludGVncmF0ZWQgU29sdXRpb25zIEluYyBWOFMgVk1FIDY4MDIwCitpc2k6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciA0LjJCU0Qgb24gSVNJLi4uCisJJChNQUtFKSB3ZXJtaXQgIkNDID0gY2MiIFwKKwkiQ0ZMQUdTPSAtREJTRDQgLURUQ1BTT0NLRVQgLURJTkFERFJYIC1ERENMUE9QRU4gLURERUJVRyAtRE5PU0VUUkVVIFwKKwktRENLX0NVUlNFUyAtRE5PTEVBUk4gJChLRkxBR1MpIiAiTElCUyA9IC1sY3Vyc2VzIC1sdGVybWNhcCIKKworI0ludGVyYWN0aXZlIENvcnAgdmVyc2lvbiBvZiBBVCZUIFN5c3RlbSBJSUkKKyNpczM6ICh2ZXJ5IG9sZCwgcHJvYmFibHkgbm90IHN1ZmZpY2llbnQgZm9yIDVBIG9yIGxhdGVyKQorIwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBJbnRlcmFjdGl2ZSBTeXN0ZW0gSUlJLi4uJworIwltYWtlIHdlcm1pdCAiQ0ZMQUdTID0gLURJU0lJSSAtRGRhdGE9ZGF0YXggLU8gLWkiICJMTktGTEFHUyA9IC1pIgorI1RoZSBmb2xsb3dpbmcgc2hvdWxkIHdvcmssIHVzZSBpdCBpZiB5b3UgZG9uJ3QgaGF2ZSBnY2MuCisjVXNlIGlzM2djYyBpZiB5b3UgaGF2ZSBnY2MuCitpczM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSW50ZXJhY3RpdmUgU3lzdGVtIElJSS4uLicKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUz0gLURJU0lJSSAkKEtGTEFHUykgLURkYXRhPWRhdGF4IC1ETkFQIC1ESERCVVVDUAorCS1ETE9DS19ESVI9XCIvdXNyL3Nwb29sL3V1Y3BcIiAtRFNJR1RZUD12b2lkIC1PIC1pIiAiTE5LRkxBR1MgPSAtaSIKKworI0ludGVyYWN0aXZlIFVOSVggU3lzdGVtIFYgUjMsIG5vIG5ldHdvcmsgc3VwcG9ydC4gIFVzZXMgPGRpcmVudC5oPiBhbmQgSG9uZXkKKyNEYW5CZXIgVVVDUC4gIElmIHRoaXMgZW50cnkgZG9lcyBub3QgY29tcGlsZSBjb3JyZWN0bHksIHRyeSBhbnkgb3IgYWxsIG9mIHRoZQorI2ZvbGxvd2luZy4gIFRoZXNlIHN1Z2dlc3Rpb25zIGFsc28gYXBwbHkgbW9yZSBvciBsZXNzIHRvIHRoZSBvdGhlciBpczVyM3h4eAorI2VudHJpZXMgdGhhdCBmb2xsb3cgdGhpcyBvbmUuCisjIC4gUmVtb3ZlIHRoZSBVSURfVCBhbmQgR0lEX1QgZGVmaW5pdGlvbnMsIG9yIGNoYW5nZSB0aGVtIGFzIHJlcXVpcmVkLgorIyAuIENoYW5nZSAtRERJUkVOVCB0byAtRFNESVJFTlQuCisjIC4gQWRkIC1EU0lHVFlQPXZvaWQuCisjIC4gUmVtb3ZlIC1nIGZyb20gTE5LRkxBR1MuCisjIC4gQWRkIC1ETk9BTlNJIHRvIHJlbW92ZSBjb21waWxlciBjb21wbGFpbnRzIGFib3V0IEFOU0kgQyBjb25zdHJ1Y3Rpb25zCisjIC4gQWRkIG90aGVyIC1ETk94eHgncyB0byBzYXZlIHNwYWNlIChlLmcuIC1ETk9DU0VUUykKKyMgU2VlIHRoZSBuZXh0IGZldyBtYWtlZmlsZSBlbnRyaWVzIGZvciByZWxhdGVkIGV4YW1wbGVzLgorIyBBbHNvIHNlZSBzeXM1cjMyaXMgZm9yIG1ha2luZyBhIHBvcnRhYmxlIGkzODYgU1ZSMyBiaW5hcnkuCitpczVyMzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBJbnRlcmFjdGl2ZSAzODYvaXggb3IgbGF0ZXIuLi4nCisJQGVjaG8gJ0lmIHRoaXMgZG9lcyBub3Qgd29yayBwbGVhc2UgcmVhZCB0aGUgbWFrZWZpbGUgZW50cnkuJworCSQoTUFLRSkgd2VybWl0IFwKKwkiQ0ZMQUdTID0gLURTVlIzIC1ERElSRU5UIC1ESERCVVVDUCAtZyAtRE5PQ1NFVFMgLUROT1JFQUxQQVRIIFwKKwktRFVJRF9UPXVzaG9ydCAtREdJRF9UPXVzaG9ydCAtREkzODZJWCAkKEtGTEFHUykiIFwKKwkiTE5LRkxBR1MgPSAtZyIKKworI0ludGVyYWN0aXZlIENvcnAgU3lzdGVtIFN5c3RlbSBWIFIzIHdpdGggZ2NjCitpczNnY2M6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSW50ZXJhY3RpdmUgU3lzdGVtIFYgUjMgLyBnY2MuLi4nCisJJChNQUtFKSB3ZXJtaXQgQ0M9Z2NjIENDMj1nY2MgXAorCSdDRkxBR1MgPSAtRF9TWVNWMyAtRElTSUlJIC1EZGF0YT1kYXRheCAtRE5BUCAtREhEQlVVQ1AgLUROT1JFQUxQQVRIIFwKKwktRExPQ0tfRElSPVwiL3Vzci9zcG9vbC91dWNwXCIgLURTSUdUWVA9dm9pZCAtTycgIkxOS0ZMQUdTID0iCisKKyNJbnRlcmFjdGl2ZSBVTklYIFN5c3RlbSBWIFIzLCBQT1NJWCB2YXJpYW50LiAgVW50ZXN0ZWQuCisjVXNlcyBkaXJlbnQuaCBhbmQgSG9uZXkgRGFuQmVyIHV1Y3AuICBSZWFkIGNvbW1lbnRzIGluIGlzNXIzIGVudHJ5LgoraXM1cjNwOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEludGVyYWN0aXZlIDM4Ni9peCBvciBsYXRlci4uLicKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUz0gLURTVlIzIC1ERElSRU5UIC1ESERCVVVDUCAtZyAtRE5PQ1NFVFMgLUROT1JFQUxQQVRIIFwKKwktREkzODZJWCAtRFBPU0lYICQoS0ZMQUdTKSIgIkxOS0ZMQUdTPSIgIkxJQlM9LWxjcG9zaXgiCisKKyNJbnRlcmFjdGl2ZSBVTklYIFNWUjMgMi4yLjEsIGpvYiBjb250cm9sLCBjdXJzZXMsIG5vIG5ldCwgZ2NjLgoraXM1cjNnY2M6CisJJChNQUtFKSB3ZXJtaXQgQ0M9Z2NjIENDMj1nY2MgXAorCSJDRkxBR1M9LWcgLXBvc2l4IC1EU1ZSMyAtRERJUkVOVCAtRE5PUkVBTFBBVEggXAorCS1ESERCVVVDUCAtTyAtRE5PQ1NFVFMgLURJMzg2SVggLURTVlIzSkMgLURDS19DVVJTRVMgXAorCSQoS0ZMQUdTKSIgTE5LRkxBR1M9Ii1wb3NpeCIgTElCUz0iLWxjdXJzZXMgLWxjX3MiCisKKyNJbnRlcmFjdGl2ZSBVTklYIFN5c3RlbSBWIFIzIHdpdGggVENQL0lQIG5ldHdvcmsgc3VwcG9ydC4KKyNOZWVkcyAtbGluZXQgZm9yIG5ldCBmdW5jdGlvbnMuICBzaWduYWwoKSBpcyB2b2lkIHJhdGhlciB0aGFuIGludC4KKyNVc2VzIGRpcmVudC5oIGFuZCBIb25leSBEYW5CZXIgdXVjcC4gUmVhZCBjb21tZW50cyBpbiBpczVyMyBlbnRyeS4KKyNBbHNvIHNlZSBpczVyM25ldDIgaWYgeW91IGhhdmUgdHJvdWJsZSB3aXRoIHRoaXMgZW50cnkuCitpczVyM25ldDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBJbnRlcmFjdGl2ZSAzODYvaXguLi4nCisJQGVjaG8gJ0lmIHRoaXMgZG9lcyBub3Qgd29yayBwbGVhc2UgcmVhZCB0aGUgbWFrZWZpbGUgZW50cnkuJworCSQoTUFLRSkgd2VybWl0IENDPSIkKENDKSIgQ0MyPSIkKENDMikiIFwKKwkiQ0ZMQUdTID0gLURTVlIzIC1ERElSRU5UIC1ESERCVVVDUCAtRFRDUFNPQ0tFVCAtRE5PUkVBTFBBVEggXAorCS1ESTM4NklYICQoS0ZMQUdTKSAtTyIgIkxJQlMgPSAtbGluZXQiCisKK2lzNXIzbmV0Z2NjOgorCSQoTUFLRSkgaXM1cjNuZXQgQ0M9Z2NjIENDMj1nY2MKKworI0ludGVyYWN0aXZlIFVOSVggU3lzdGVtIFYgUjMsIG5vIGpvYiBjb250cm9sLCBzaWduYWwoKSB2b2lkIHJhdGhlciB0aGFuIGludC4KKyNVc2VzIGRpcmVudC5oIGFuZCBIb25leSBEYW5CZXIgdXVjcC4gIE5lZWRzIC1saW5ldCBmb3IgbmV0IGZ1bmN0aW9ucy4KKyNSZWFkIGNvbW1lbnRzIGluIGlzNXIzIGVudHJ5LiAgVXNlIHRoaXMgZW50cnkgaWYgaXM1cjNuZXQgZmFpbHMuCisjU2F2ZXMgc29tZSBzcGFjZSBieSBzdHJpcHBpbmcgKC1zKSBhbmQgdXNpbmcgc2hhcmVkIGxpYnJhcnkgKC1sY19zKS4KK2lzNXIzbmV0MjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBJbnRlcmFjdGl2ZSAzODYvaXguLi4nCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1MgPSAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIC1EVENQU09DS0VUIC1ETk9KQyAtRE5PUkVBTFBBVEggXAorCS1EU0lHVFlQPXZvaWQgLUROT0FOU0kgLURJMzg2SVggJChLRkxBR1MpIC1PIiBcCisJIkxOS0ZMQUdTPSAtcyIgIkxJQlMgPSAtbGluZXQgLWxjX3MiCisKKyNJbnRlcmFjdGl2ZSBVTklYIFN5c3RlbSBWIFIzICh2ZXJzaW9uIDIuMiBvciBsYXRlcikgd2l0aCBqb2IgY29udHJvbCAmIGN1cnNlcy4KKyNVc2VzIGRpcmVudC5oIGFuZCBIb25leSBEYW5CZXIgVVVDUC4KK2lzNXIzamM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSW50ZXJhY3RpdmUgVW5peCAyLjIgb3IgbGF0ZXIuLi4nCisJJChNQUtFKSB3ZXJtaXQgQ0M9IiQoQ0MpIiBDQzI9IiQoQ0MyKSIgXAorCSJDRkxBR1MgPSAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIC1PIC1ETk9DU0VUUyAtRE5PUkVBTFBBVEggXAorCS1EVUlEX1Q9dXNob3J0IC1ER0lEX1Q9dXNob3J0IC1ESTM4NklYIC1EU1ZSM0pDIC1EQ0tfQ1VSU0VTIFwKKwktRFBPU0lYX0pDIC1EQ0tfUkVESVIgLURDS19QT0xMIC1ERENMR0VUQ1dEIFwKKwkkKEtGTEFHUykiICJMSUJTPS1sY3Vyc2VzIC1sY19zIC1saW5ldCIKKworaXM1cjNqY2djYzoKKwkkKE1BS0UpIGlzNXIzamMgQ0M9ImdjYyAtRENLX0FOU0lMSUJTIC1ERENHUFdOQU0gLU80IiBDQzI9Z2NjIFwKKwlLRkxBR1M9IiQoS0ZMQUdTKSIgTE5LRkxBR1M9IiQoTE5LRkxBR1MpIgorCisjU3Vuc29mdC9JbnRlcmFjdGl2ZSBVTklYIFN5c3RlbSBWIFIzICh2ZXJzaW9uIDIuMiBvciBsYXRlcikKKyN3aXRoIGpvYiBjb250cm9sLCBjdXJzZXMsIGFuZCBUQ1AvSVAgbmV0d29ya2luZy4KKyNVc2VzIGRpcmVudC5oIGFuZCBIb25leSBEYW5CZXIgVVVDUC4KK2lzNXIzbmV0amM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgSW50ZXJhY3RpdmUgVW5peCAyLjIgb3IgbGF0ZXIuLi4nCisJJChNQUtFKSB3ZXJtaXQgQ0M9IiQoQ0MpIiBDQzI9IiQoQ0MyKSIgXAorCSJDRkxBR1MgPSAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIC1PIC1ETk9DU0VUUyAtRE5PUkVBTFBBVEggXAorCS1EVUlEX1Q9dXNob3J0IC1ER0lEX1Q9dXNob3J0IC1ESTM4NklYIC1EU1ZSM0pDIC1EQ0tfQ1VSU0VTIFwKKwktRFBPU0lYX0pDIC1EQ0tfUkVESVIgLURUQ1BTT0NLRVQgLURTRUxFQ1QgXAorCSQoS0ZMQUdTKSIgIkxJQlM9LWxpbmV0IC1sY3Vyc2VzIC1sY19zIgorCitpczVyM25ldGpjZ2NjOgorCSQoTUFLRSkgaXM1cjNuZXRqYyBDQz0iZ2NjIC1EQ0tfQU5TSUxJQlMgLUREQ0dQV05BTSAtTzQiIENDMj1nY2MgXAorCUtGTEFHUz0iJChLRkxBR1MpIiBMTktGTEFHUz0iJChMTktGTEFHUykiCisKKyNNYXNzY29tcCBTeXN0ZW0gSUlJCitydHU6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTWFzc2NvbXAgUlRVIFN5c3RlbSBJSUkuLi4nCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1M9IC1VRklPTlJFQUQgLURBVFRTViAkKEtGTEFHUykgLU8iICJMTktGTEFHUyA9IiAiTElCUz0gLWxqb2JzIgorCisjTWFzc2NvbXAvQ29uY3VycmVudCBSVFUgNC4wIG9yIGxhdGVyLCBCZXJrZWxleSBlbnZpcm9ubWVudC4KKyNJbmNsdWRlcyA8bmRpci5oPiA9IC91c3IvaW5jbHVkZS9uZGlyLmgKKyNOb3RlICJMSUJTID0gLWxuZGlyIiBtaWdodCBub3QgYmUgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgInVjYiBtYWtlIi4KK3J0dWJzZDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBNYXNzY29tcCBSVFUgNC4xQS4uLicKKwl1Y2IgbWFrZSB3ZXJtaXQgXAorCSJDRkxBR1M9IC1EQlNENCAtRFJUVSAtRE5ESVIgLURIREJVVUNQIC1EVENQU09DS0VUICQoS0ZMQUdTKSIgXAorCSJMSUJTID0gLWxuZGlyIgorCisjTWFzc2NvbXAvQ29uY3VycmVudCBSVFUgNC4wIG9yIGxhdGVyLCBzYW1lIGFzIGFib3ZlLAorI0luY2x1ZGVzICJ1c3IvbGliL25kaXIuaCIKKyNOb3RlICJMSUJTID0gLWxuZGlyIiBtaWdodCBub3QgYmUgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgInVjYiBtYWtlIi4KK3J0dWJzZDI6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTWFzc2NvbXAgUlRVIDQuMUEuLi4nCisJdWNiIG1ha2Ugd2VybWl0IFwKKwkiQ0ZMQUdTPSAtREJTRDQgLURSVFUgLURYTkRJUiAtREhEQlVVQ1AgJChLRkxBR1MpIiBcCisJIkxJQlMgPSAtbG5kaXIiCisKKyNNYXNzY29tcC9Db25jdXJyZW50IFJUVSA0LjAgb3IgbGF0ZXIsIHNhbWUgYXMgYWJvdmUsCisjSW5jbHVkZXMgPHN5cy9uZGlyLmg+CisjTm90ZSAiTElCUyA9IC1sbmRpciIgbWlnaHQgbm90IGJlIG5lY2Vzc2FyeSBiZWNhdXNlIG9mICJ1Y2IgbWFrZSIuCitydHVic2QzOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE1hc3Njb21wIFJUVSA0LnggQlNELi4uJworCXVjYiBtYWtlIHdlcm1pdCAiQ0ZMQUdTPSAtREJTRDQgLURSVFUgLURIREJVVUNQICQoS0ZMQUdTKSIgXAorCSJMSUJTID0gLWxuZGlyIgorCisjTWFzc2NvbXAvQ29uY3VycmVudCBSVFUgNC4wIG9yIGxhdGVyLCBTeXN0ZW0gViBSMiwgdXNpbmcgPGRpcmVudC5oPi4KKyNJbiBjYXNlIG9mIHByb2JsZW1zLCBhZGQgYmFjayB0aGUgLURSVFUgc3dpdGNoLgorI0luIGNhc2UgLURUQ1BTT0NLRVQgZ2l2ZXMgdHJvdWJsZSwgcmVtb3ZlIGl0LgorcnR1czU6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTWFzc2NvbXAgUlRVIDQueC4uLicKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUz0gLURBVFRTViAtREhEQlVVQ1AgLURESVJFTlQgLURUQ1BTT0NLRVQgJChLRkxBR1MpIgorCisjTWFzc2NvbXAvQ29uY3VycmVudCBSVFUgNC54LCBTeXN0ZW0gViBSMywgdXNpbmcgPGRpcmVudC5oPi4KKyNVc2UgdGhpcyBvbmUgaWYgcnR1czUgZ2l2ZXMgd2FybmluZ3MgYWJvdXQgcG9pbnRlciB0eXBlIG1pc21hdGNoZXMuCisjSW4gY2FzZSBvZiBwcm9ibGVtcywgYWRkIGJhY2sgdGhlIC1EUlRVIHN3aXRjaC4KK3J0dXM1cjM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTWFzc2NvbXAgUlRVIFN5cyBWIFIzLi4uJworCSQoTUFLRSkgd2VybWl0ICJDRkxBR1M9IC1EU1ZSMyAtREhEQlVVQ1AgLURESVJFTlQgJChLRkxBR1MpIgorCisjREVDIFByby0zeHggd2l0aCBQcm8vVmVuaXggVjEuMCBvciBWMS4xCisjIFJlcXVpcmVzIGNvZGUtbWFwcGluZyBvbiBub24tSSZELXNwYWNlIDExLzIzIHByb2Nlc3NvciwgcGx1cyBzb21lCisjIGZpZGRsaW5nIHRvIGdldCBpbnRlcnJ1cHQgdGFyZ2V0cyBpbnRvIHJlc2lkZW50IGNvZGUgc2VjdGlvbi4KKyMgVGhpcyBhbG1vc3QgY2VydGFpbmx5IGRvZXNuJ3Qgd29yayBhbnkgbW9yZS4KK3Byb3Z4MToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBERUMgUHJvLTN4eCwgUHJvL1Zlbml4IDEueC4uLicKKwkkKE1BS0UpIHdhcnQgIkNGTEFHUz0gLURQUk9WWDEgJChLRkxBR1MpIiAiTE5LRkxBR1M9ICIKKwkkKE1BS0UpIHdlcm1pdCAiQ0ZMQUdTID0gLURQUk9WWDEgLUROT0ZJTEVIIC1tZDc4MCIgXAorCQkiTE5LRkxBR1M9IC11IF9zbGVlcCAtbGMgLW1kNzgwIgorCisjTml4ZG9yZiBUYXJnb24vMzEuCisjQVQmVCBVTklYIFN5c3RlbSBWIFIzLCBzaWduYWwoKSBpcyB2b2lkIHJhdGhlciB0aGFuIGludC4KKyNVc2VzIGRpcmVudC5oIHdpdGhvdXQgSG9uZXkgRGFuQmVyIHV1Y3AuCit0MzF0b3M0MHg6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgVGFyZ29uLzMxIHdpdGggVE9TIDQuMC54eC4uLicKKwkJJChNQUtFKSB3ZXJtaXQgXAorCQkiQ0ZMQUdTPSAtRFNWUjMgLURESVJFTlQgJChLRkxBR1MpIC1PIiBcCisJCSJMTktGTEFHUz0iCisKKyNOQ1IgVG93ZXIgMTYzMiwgT1MgMS4wMgordG93ZXIxOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE5DUiBUb3dlciAxNjMyLCBPUyAxLjAyLi4uJworCSQoTUFLRSkgd2VybWl0ICJDRkxBR1M9IC1EVE9XRVIxICQoS0ZMQUdTKSIKKworI05DUiBUb3dlciAzMiwgT1MgUmVsZWFzZSAxLnh4Lnh4Cit0b3dlcjMyLTE6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTkNSIFRvd2VyIDMyIFJlbCAxIFN5c3RlbSBWIFIyLi4uJworCUBlY2hvICdBZGQgS0ZMQUdTPS1ESVNESVJCVUcgaWYgeW91IGdldCBlcnJvcnMgYWJvdXQgU19JU1JFRy9TX0lTRElSLicKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUyA9IC1EQVRUU1YgJChLRkxBR1MpIC1PIiAiTE5LRkxBR1MgPSAtbiIKKworI05DUiBUb3dlciAzMiwgT1MgUmVsZWFzZSAyLnh4Lnh4Cit0b3dlcjMyLTI6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgTkNSIFRvd2VyIDMyIFJlbCAyIFN5c3RlbSBWIFIyLi4uJworCSQoTUFLRSkgd2VybWl0IFwKKwkiQ0ZMQUdTID0gLURBVFRTViAtREhEQlVVQ1AgJChLRkxBR1MpIC1PMiIgXAorCSJMTktGTEFHUyA9IC1uIgorCisjTkNSIFRvd2VyIDMyLCBPUyBSZWxlYXNlcyBiYXNlZCBvbiBTeXN0ZW0gViBSMworI0Rvbid0IGFkZCAtRE5BUCAoZG9lc24ndCB3b3JrIHJpZ2h0KSBvciAtRFJEQ0hLIChub3QgYXZhaWxhYmxlIGluIGxpYmMpLgordG93ZXIzMjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBOQ1IgVG93ZXIgMzIgU3lzdGVtIFYgUjMuLi4nCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1MgPSAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIC1ETk9TWVNJT0NUTEggJChLRkxBR1MpIFwKKwktRFVJRF9UPXVzaG9ydCAtREdJRF9UPXVzaG9ydCAtTzEiCisKKyNOQ1IgVG93ZXIgMzIsIE9TIFJlbGVhc2VzIGJhc2VkIG9uIFN5c3RlbSBWIFIzCit0b3dlcjMyZzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBOQ1IgVG93ZXIgMzIgU3lzdGVtIFYgUjMsIGdjYy4uLicKKwkkKE1BS0UpIHdlcm1pdCAiQ0MgPSBnY2MiIFwKKwkiQ0ZMQUdTID0gLURTVlIzIC1ERElSRU5UIC1ESERCVVVDUCAtRE5PU1lTSU9DVExIICQoS0ZMQUdTKSBcCisJRFVJRF9UPXVzaG9ydCAtREdJRF9UPXVzaG9ydCAtTyAtZnN0cmVuZ3RoLXJlZHVjZSAtZm9taXQtZnJhbWUtcG9pbnRlciIKKworI0ZvcnR1bmUgMzI6MTYsIEZvcjpQcm8gMS44IChtb3N0bHkgbGlrZSA0LjFic2QpCitmdDE4OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEZvcnR1bmUgMzI6MTYgRm9yOlBybyAxLjguLi4nCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1M9IC1ETk9ERUJVRyAtREJTRDQgLURGVDE4IC1ETk9GSUxFSCAkKEtGTEFHUykgXAorCS1EUElEX1Q9c2hvcnQiCisKKyNGb3J0dW5lIDMyOjE2LCBGb3I6UHJvIDIuMSAobW9zdGx5IGxpa2UgNC4xYnNkKS4KKyNUaGUgbW9kdWxlcyB0aGF0IGJyZWFrIHRoZSBvcHRpbWl6ZXIgYXJlIGNvbXBpbGVkIHNlcGFyYXRlbHkuCitmdDIxOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEZvcnR1bmUgMzI6MTYgRm9yOlBybyAyLjEuLi4nCisJJChNQUtFKSBja3V1c3guJChFWFQpICJDRkxBR1M9IC1ETk9ERUJVRyAtREJTRDQgLURGVDIxIC1ETk9GSUxFSCBcCisJLVNZTSA4MDAgIC1EQ0tfQ1VSU0VTICQoS0ZMQUdTKSAtRFBJRF9UPXNob3J0IiBcCisJIkxOS0ZMQUdTPSAtbiAtcyIgIkxJQlM9IC1sY3Vyc2VzIC1sdGVybWNhcCAtbHYgLWxuZXQiCisJJChNQUtFKSBja3V4bGEuJChFWFQpICJDRkxBR1M9IC1ETk9ERUJVRyAtREJTRDQgLURGVDIxIC1ETk9GSUxFSCBcCisJLVNZTSA4MDAgIC1EQ0tfQ1VSU0VTICQoS0ZMQUdTKSAtRFBJRF9UPXNob3J0IiBcCisJIkxOS0ZMQUdTPSAtbiAtcyIgIkxJQlM9IC1sY3Vyc2VzIC1sdGVybWNhcCAtbHYgLWxuZXQiCisJJChNQUtFKSBja3VkaWEuJChFWFQpICJDRkxBR1M9IC1ETk9ERUJVRyAtREJTRDQgLURGVDIxIC1ETk9GSUxFSCBcCisJLVNZTSA4MDAgIC1EQ0tfQ1VSU0VTICQoS0ZMQUdTKSAtRFBJRF9UPXNob3J0IiBcCisJIkxOS0ZMQUdTPSAtbiAtcyIgIkxJQlM9IC1sY3Vyc2VzIC1sdGVybWNhcCAtbHYgLWxuZXQiCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1M9IC1PIC1ETk9ERUJVRyAtREJTRDQgLURGVDIxIC1ETk9GSUxFSCAtU1lNIDgwMCBcCisJLURDS19DVVJTRVMgJChLRkxBR1MpIC1EUElEX1Q9c2hvcnQiIFwKKwkiTE5LRkxBR1M9IC1uIC1zIiAiTElCUz0gLWxjdXJzZXMgLWx0ZXJtY2FwIC1sdiAtbG5ldCIKKworI1ZhbGlkIFNjYWxkc3RhcgorI0JlcmtlbGV5aXNoLCBidXQgbmVlZCB0byBjaGFuZ2Ugc29tZSB2YXJpYWJsZSBuYW1lcy4KK3ZhbGlkOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFZhbGlkIFNjYWxkc3Rhci4uLicKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUz0gLURCU0Q0IC1ETk9ERUJVRyAtRE5PVExPRyAtRGNjPWNjeCAtREZSRUFEPTEgJChLRkxBR1MpIgorCisjSUJNIElYLzM3MCBvbiBJQk0gMzcwIFNlcmllcyBtYWluZnJhbWVzCisjTW9zdGx5IGxpa2Ugc3lzMywgYnV0IHNob3VsZCBidWZmZXIgcGFja2V0cy4KK2l4MzcwOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIElCTSBJWC8zNzAuLi4nCisJJChNQUtFKSB3ZXJtaXQgIkNGTEFHUyA9IC1ESVgzNzAgLURBVFRTViAkKEtGTEFHUykgLWkgLU8iIFwKKwkiTE5LRkxBR1MgPSAtaSIKKworI0FtZGFobCBVVFMgMi40IG9uIElCTSAzNzAgc2VyaWVzIGNvbXBhdGlibGUgbWFpbmZyYW1lcy4KKyNNb3N0bHkgbGlrZSBWNywgYnV0IGNhbid0IGRvIGluaXRyYXdxKCkgYnVmZmVyIHBlZWtpbmcuCit1dHMyNDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBbWRhaGwgVVRTIDIuNC4uLicKKwkkKE1BS0UpIHdlcm1pdCAiQ0ZMQUdTPS1EVjcgLURQUk9DTkFNRT1cXFwiJChQUk9DKVxcXCIgXAorCS1EVVRTMjQgLURCT09UTkFNRT1cXFwiJChCT09URklMRSlcXFwiIC1ETlBST0NOQU1FPVxcXCIkKE5QUk9DKVxcXCIgXAorCS1ETlBUWVBFPSQoTlBUWVBFKSAkKERJUkVDVCkgJChLRkxBR1MpIgorCisjQW1kYWhsIFVUU1YgVU5JWCBTeXN0ZW0gViA9IFN5c3RlbSBWIFIyIG9yIGVhcmxpZXIuCit1dHN2OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFtZGFobCBVVFNWLi4uJworCSQoTUFLRSkgd2VybWl0IFwKKwkiQ0ZMQUdTID0gLURVVFNWICQoS0ZMQUdTKSAtaSAtTyIgIkxOS0ZMQUdTID0gLWkiCisKKyNBbWRhaGwgVVRTViBVTklYIFN5c3RlbSBWID0gU3lzdGVtIFYgUjIgb3IgZWFybGllciwgd2l0aCBUQ1Agc29ja2V0cyBsaWJyYXJ5LgordXRzdnRjcDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBbWRhaGwgVVRTViB3L3RjcC4uLicKKwkkKE1BS0UpIHdlcm1pdCAiQ0ZMQUdTID0gXAorCS1EVENQU09DS0VUIC1EVVRTViAkKEtGTEFHUykgLWkgLU8iICJMTktGTEFHUyA9IC1pIiBcCisJIkxJQlMgPSAtbHNvY2tldCIKKworI0JCTiBDLzcwIHdpdGggSU9TIDIuMAorI01vc3RseSBCZXJrZWxleS1saWtlLCBidXQgd2l0aCBzb21lIEFUVGlzbXMKK2M3MDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBCQk4gQy83MCBJT1MgMi4wLi4uJworCSQoTUFLRSkgd2VybWl0ICJDRkxBR1M9IC1EQlNENCAtREM3MCAkKEtGTEFHUykiCisKKyNaaWxvZyBaRVVTIDMuMjEKK3ppbG9nOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFppbG9nIFpldXMgMy4yMS4uLicKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUyA9IC1EQVRUU1YgLURaSUxPRyAtRE5PREVCVUcgJChLRkxBR1MpIC1pIC1PIiBcCisJIkxOS0ZMQUdTID0gLWkgLWxwdyIKKworI1doaXRlY2hhcGVsIE1HLTEgR2VuaXggMS4zCit3aGl0ZToKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBXaGl0ZWNoYXBlbCBNRy0xIEdlbml4IDEuMy4uLicKKwlAdG91Y2ggY2tjcHJvLmMKKwkkKE1BS0UpIHdlcm1pdCAiQ0ZMQUdTPSAtREJTRDQgLUR6a3NlbGYoKT0wICAkKEtGTEFHUykiCisKKyNQaXhlbCAxMDAwCitwaXhlbDoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBQaXhlbCAxMDAwLi4uJworCSQoTUFLRSkgd2VybWl0ICJDRkxBR1M9IC1EQlNENCAtRHprc2VsZigpPTAgJChLRkxBR1MpIgorCitwdHg6CisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBkeW5peHB0eDEyCisKKyNDREMgVlgvVkUgNS4yLjEKK3Z4dmU6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQ0RDIFZYL1ZFIDUuMi4xLi4uJworCSQoTUFLRSkgd2VybWl0IFwKKwkiQ0ZMQUdTID0gLURBVFRTViAtRFZYVkUgLUROT0RFQlVHIC1ETk9UTE9HICQoS0ZMQUdTKSAtaSAtTyIgXAorCSJMTktGTEFHUyA9IC1pIgorCisjRElBQiBEUzkwIG9yIExVWE9SIEFCQy05MDAwIHdpdGggcHJlLTUuMiBETklYLiAgU3lzIFYgd2l0aCBuYXAoKSBhbmQgcmRjaGsoKS4KKyMgbmQgPSBubyBvcGVuZGlyKCksIHJlYWRkaXIoKSwgY2xvc2VkaXIoKSwgZXRjLgorIyBTb21lIG9mIHRoZSBtb2R1bGVzIGZhaWwgdG8gY29tcGlsZSB3aXRoIC1PLgorZG5peG5kOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIERJQUIgRFM5MCB3aXRoIHZlcnkgb2xkIEROSVggNS4yLicKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUyA9IC1EQVRUU1YgLUROQVAgLURSRENISyAtRERDTFBPUEVOIFwKKwktVV9fU1REQ19fICQoS0ZMQUdTKSIKKworI0RJQUIgRFM5MCB3aXRoIEROSVggNS4yLiAgU3lzIFYgd2l0aCBuYXAoKSBhbmQgcmRjaGsoKS4KKyMgVGhpcyBvbmUgaGFzIG9wZW5kaXIoKSwgcmVhZGRpcigpLCBjbG9zZWRpcigpLCBldGMuCisjIFNvbWUgb2YgdGhlIG1vZHVsZXMgZmFpbCB0byBjb21waWxlIHdpdGggLU8uCitkbml4OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIERJQUIgRFM5MCB3aXRoIG9sZCBETklYIDUuMi4uLicKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUyA9IC1EQVRUU1YgLUROQVAgLURSRENISyAtRERJUkVOVCAgXAorCS1VX19TVERDX18gJChLRkxBR1MpIgorCisjRElBQiBEUzkwIHdpdGggRE5JWCA1LjIuICBTeXMgViB3aXRoIG5hcCgpIGFuZCByZGNoaygpLgorIyBBcyBhYm92ZSwgYnV0IHdpdGggY3Vyc2VzIGFuZCBUQ1AvSVAuCisjIFlvdSBtaWdodCBnZXQgY29tcGxhaW50cyBhYm91dCByZWRlZmluaXRpb24gb2YgT19SRE9OTFksIGV0YywgYmVjYXVzZQorIyBvZiBidWdzIGluIHRoZSBETklYIGhlYWRlciBmaWxlcywgd2hpY2ggY2FuIGJlIGZpeGVkIGJ5IGFkZGluZyAjaWZuZGVmLi4uCisjIGFyb3VuZCB0aGUgb2ZmZW5kaW5nIGRlZmluaXRpb25zIGluIHRoZSBoZWFkZXIgZmlsZXMuCitkbml4bmV0YzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBESUFCIERTOTAgd2l0aCBvbGQgRE5JWCA1LjIuLi4nCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1MgPSAtREFUVFNWIC1ETkFQIC1EUkRDSEsgLURESVJFTlQgIFwKKwktRFRDUFNPQ0tFVCAtRENLX0NVUlNFUyAtSS91c3IvaW5jbHVkZS9ic2QgLVVfX1NURENfXyAkKEtGTEFHUykiIFwKKwkiTElCUyA9IC1sbiAtbGN1cnNlcyIKKworI0RJQUIgRFM5MCB3aXRoIEROSVggNS4zIG9yIGxhdGVyLCB3aXRoIEhEQiBVVUNQLCBuYXAoKSBhbmQgcmRjaGsoKS4KK2RuaXg1cjM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRElBQiBEUzkwIHdpdGggRE5JWCA1LjMuLi4nCisJQGVjaG8gJ3dpdGggSG9uZXkgRGFuQmVyIFVVQ1AnCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1MgPSAtRFNWUjMgLURIREJVVUNQIC1ETkFQIC1EUkRDSEsgLURESVJFTlQgXAorCS1EQ0tfQ1VSU0VTIC1EUkVOQU1FICQoS0ZMQUdTKSAtTyIgIkxJQlM9IC1sY3Vyc2VzIgorCisjRElBQiBEUzkwIHdpdGggRE5JWCA1LjMgb3IgbGF0ZXIsIHdpdGggSERCIFVVQ1AsIG5hcCgpIGFuZCByZGNoaygpICsgVENQL0lQCitkbml4NXIzbmV0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIERJQUIgRFM5MCB3aXRoIEROSVggNS4zLi4uJworCUBlY2hvICd3aXRoIEhvbmV5IERhbkJlciBVVUNQIGFuZCBUQ1AvSVAnCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1MgPSAtRFNWUjMgLURIREJVVUNQIC1ETkFQIC1EUkRDSEsgLURESVJFTlQgXAorCS1EVENQU09DS0VUIC1EQ0tfQ1VSU0VTIC1EUkVOQU1FICQoS0ZMQUdTKSAtTyBcCisJLUkvdXNyL2luY2x1ZGUvYnNkIiAiTElCUyA9IC1sbiAtbGN1cnNlcyIKKworI0RJQUIgRFM5MCB3aXRoIEROSVggNS4zIDIuMiBvciBsYXRlciwgd2l0aCBIREIgVVVDUCwgbmFwKCkgYW5kIHJkY2hrKCksCisjQU5TSSBDIGNvbXBpbGF0aW9uIGFuZCBsaWJyYXJpZXMuCisjTm90ZSB0aGF0IGZvciBETklYIDUuMyAyLjIgeW91IGhhdmUgdG8gY29ycmVjdCBhIGJ1ZyBpbiAvdXNyL2luY2x1ZGUvc3RkbGliLmg6CisjY2hhbmdlICJleHRlcm4Jdm9pZCBmcmVlKGNoYXIgKnN0cik7IgorI3RvICAgICAiZXh0ZXJuIHZvaWQgZnJlZSh2b2lkICpzdHIpOyIKKyNOT1RFOiBUaGlzIGJ1ZyBpcyByZXBvcnRlZGx5IGZpeGVkIGluIEROSVggNS4zIDIuMi4xLgorI1Nob3VsZCB5b3UgZ2V0IGZhdGFsIGVycm9ycyBjYXVzZWQgYnkgaGFybWxlc3MgcG9pbnRlci10eXBlIG1pc21hdGNoZXMsCisjbGlrZSBiZXR3ZWVuIHNpZ25lZCBhbmQgdW5zaWduZWQgY2hhciwganVzdCByZW1vdmUgLVg3LgorZG5peDVyM2Fuc2k6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRElBQiBEUzkwIHdpdGggRE5JWCA1LjMuLi4nCisJQGVjaG8gJ3dpdGggQU5TSSBDIEhvbmV5IERhbkJlciBVVUNQJworCSQoTUFLRSkgd2VybWl0IFwKKwkiQ0ZMQUdTID0gLURTVlIzIC1ERElBQiAtREhEQlVVQ1AgLUROQVAgLURSRENISyAtRERJUkVOVCBcCisJLURDS19BTlNJTElCUyAtRENLX0NVUlNFUyAtRFJFTkFNRSAtTyAtWDcgLVg5ICQoS0ZMQUdTKSIgXAorCSJMSUJTPSAtbGN1cnNlcyIKKworI0RJQUIgRFM5MCB3aXRoIEROSVggNS4zIDIuMiBvciBsYXRlciwgd2l0aCBIREIgVVVDUCwgbmFwKCkgYW5kIHJkY2hrKCksCisjICsgVENQL0lQLCBBTlNJIEMgY29tcGlsYXRpb24gYW5kIGxpYnJhcmllcy4KKyNTaG91bGQgeW91IGdldCBmYXRhbCBlcnJvcnMgY2F1c2VkIGJ5IGhhcm1sZXNzIHBvaW50ZXItdHlwZSBtaXNtYXRjaGVzLAorI2xpa2UgYmV0d2VlbiBzaWduZWQgYW5kIHVuc2lnbmVkIGNoYXIsIGp1c3QgcmVtb3ZlIC1YNy4KK2RuaXg1cjNhbnNpbmV0OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIERJQUIgRFM5MCB3aXRoIEROSVggNS4zLi4uJworCUBlY2hvICd3aXRoIEFOU0kgQyBIb25leSBEYW5CZXIgVVVDUCcKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUyA9IC1EU1ZSMyAtRERJQUIgLURIREJVVUNQIC1ETkFQIC1EUkRDSEsgLURESVJFTlQgXAorCS1EVENQU09DS0VUIC1EQ0tfQU5TSUxJQlMgLURDS19DVVJTRVMgLURSRU5BTUUgLU8gLVg3IC1YOSAkKEtGTEFHUykgXAorCS1JL3Vzci9pbmNsdWRlL2JzZCIgIkxJQlM9IC1sbiAtbGN1cnNlcyIKKworIyBRTlggNC4yMSBhbmQgYWJvdmUsIDMyLWJpdCB2ZXJzaW9uLCBXYXRjb20gQzMyIDEwLjYsIGZ1bGx5IGNvbmZpZ3VyZWQsCisjIGV4Y2VwdCBubyBqb2IgY29udHJvbCBiZWNhdXNlIFFOWCA0LnggZG9lcyBub3Qgc3VwcG9ydCBpdC4gIE5ldyBOQ1VSU0VTCisjIGxpYnJhcnkgdXNlZCBpbnN0ZWFkIG9mIENVUlNFUy4KKyMKKyMgLU9hdHggb3B0aW1pemVzIHRvIGZhdm9yIHNwZWVkIG92ZXIgc2l6ZTogbG9vcCBvcHRpbWl6YXRpb24sIGlubGluZSBmbidzLgorIyAtT3MgZmF2b3JzIHNpemUgb3ZlciBzcGVlZC4gIFNhdmVzIDMwLTQwSyBvdXQgb2YgYWJvdXQgMS43NU0uCisjIC0zciA9IGdlbmVyYXRlIDM4NiBjb2RlIHdpdGggcmVnaXN0ZXItYmFzZWQgYXJnIHBhc3NpbmcuCisjIC0zcyA9IGdlbmVyYXRlIDM4NiBjb2RlIHdpdGggc3RhY2stYmFzZWQgYXJnIHBhc3NpbmcuCisjIC1tcyA9IHNlcGFyYXRlIGNvZGUgJiBkYXRhIDRHQiBzZWdtZW50cyAoMzItYml0IGJ1aWxkcyBvbmx5KS4KKyMgLW1mID0gZmxhdCBtZW1vcnkgbW9kZWwgY29kZStkYXRhIGluIG9uZSA0R0Igc2VnbWVudCAoZGl0dG8pLgorIyAtemMgPSBwbGFjZSBsaXRlcmFsIHN0cmluZ3MgaW4gY29kZSBzZWdtZW50LgorIyAtTjRNID0gQmlnIHN0YWNrIChpbmNyZWFzZSB0aGUgZGlnaXQgdXBvbiBTSUdTRUdWcyBhdCBydW50aW1lKS4KKyMgY2hhcnMgYXJlIHVuc2lnbmVkIGJ5IGRlZmF1bHQgKC1qIG1ha2VzIHRoZW0gc2lnbmVkIGJ5IGRlZmF1bHQpLgorIyAtTk9VVUNQIGlzIGluY2x1ZGVkIGJlY2F1c2UgUU5YIGRvZXNuJ3QgdXNlIGl0LgorIyBBZGQgdGhlc2UgdG8gdGhlIGVuZCBpZiB5b3UgbGlrZSBidXQgdGhleSBkdW1wIGNvcmUgb24gbXkgUU5YIDQuMjUgc3lzdGVtOgorIworIwlAd2VybWl0IC1oID51c2UucW54CisjCUB1c2Vtc2cgd2VybWl0IHVzZS5xbngKKyMJQHJtIHVzZS5xbngKKyMKKyMgSWYgeW91IGdldCB3YXJuaW5ncyBhYm91dCBIRUFERVIgb3IgQ19JTiBhZGQgLUROT19ETlNfU1JWLgorcW54MzI6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgUU5YIDQuMngsIDMyLWJpdC4uLicKKwkkKE1BS0UpIHhlcm1pdCBcCisJIkxOS0ZMQUdTID0gLU40TSAtM3IiIFwKKwkiQ0ZMQUdTID0gLW1zIC0zciAtRFFOWCAtRFRDUFNPQ0tFVCAtRENLX0NVUlNFUyAtRE5PR0VUVVNFUlNIRUxMIFwKKwktRENLX1dSRUZSRVNIIC1EQ0tfUkVESVIgLURTRUxFQ1QgLURTRUxFQ1RfSCAtRENLX1JUU0NUUyAtRE5PSkMgXAorCS1ETk9JTklUR1JPVVBTIC1ETk9VVUNQIC1EQ0tfQU5TSUMgLURQSURfVD1waWRfdCAtT2F0eCAtemMgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sc29ja2V0IC1sbmN1cnNlcyAtbHRlcm1jYXAiCisKKyMgQXMgYWJvdmUgYnV0IG5vIG5ldHdvcmtpbmcgc2luY2Ugc29tZSBRTlggc3lzdGVtcyBkbyBub3QgaGF2ZSBUQ1AvSVAKKyMgaW5zdGFsbGVkLCBvciB0aGUgVENQL0lQIGRldmVsb3BlcnMga2l0LCB3aGljaCBpbmNsdWRlcyBhbGwgdGhlIG5lZWRlZAorIyBoZWFkZXIgZmlsZXMuICBUaGlzIGVudHJ5IGhhcyBub3QgYmVlbiB0ZXN0ZWQgb24gYSBRTlggc3lzdGVtIHRoYXQsIGluCisjIGZhY3QsIGRvZXMgbm90IGhhdmUgVENQL0lQIGluc3RhbGxlZDsgc29tZSBhZGp1c3RtZW50cyBtaWdodCBiZSBuZWNlc3NhcnksCisjIGluIHBhcnRpY3VsYXIgcmVnYXJkaW5nIHRoZSB1c2Ugb2Ygc2VsZWN0KCk6IGlzIC1sc29ja2V0IG5lZWRlZCwgY2FuIHdlCisjIGdldCB0aGUgbmVlZGVkIGRlZmluaXRpb25zIGZyb20gbm9uLVRDUC9JUCBoZWFkZXIgZmlsZXMgKEZEX1NFVCwgZXRjKT8KK3FueDMybm9uZXQ6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgUU5YIDQuMngsIDMyLWJpdCwgbm8gbmV0Li4uJworCSQoTUFLRSkgeGVybWl0IFwKKwkiTE5LRkxBR1MgPSAtTjRNIC0zciIgXAorCSJDRkxBR1MgPSAtM3IgLW1zIC1EUU5YIC1ETk9ORVQgLUROT0lLU0QgLURDS19DVVJTRVMgXAorCS1EQ0tfV1JFRlJFU0ggLURDS19SRURJUiAtRFNFTEVDVCAtRFNFTEVDVF9IIC1EQ0tfUlRTQ1RTIC1ETk9KQyBcCisJLUROT1VVQ1AgLURDS19BTlNJQyAtRFBJRF9UPXBpZF90IC1PYXR4IC16YyAkKEtGTEFHUykiIFwKKwkiTElCUz0gLWxzb2NrZXQgLWxuY3Vyc2VzIC1sdGVybWNhcCIKKwlAd2VybWl0IC1oID51c2UucW54CisJQHVzZW1zZyB3ZXJtaXQgdXNlLnFueAorCUBybSB1c2UucW54CisKKyMgU3lub255bSBmb3IgcW54MzIuCitxbng6CisJJChNQUtFKSBxbngzMiAiS0ZMQUdTPSQoS0ZMQUdTKSIKKworIyBRTlggNC4yMSBhbmQgYWJvdmUsIDE2LWJpdCB2ZXJzaW9uLCBXYXRjb20gQyA4LjUgLSBhbmQgaGlnaGVyIG9uIGkyODYgUENzCisjIGFuZCBhYm92ZS4KKyMKKyMJSU1QT1JUQU5UOiBEbyBub3QgdXNlIFdhdGNvbSBDIDEwLjYhISEKKyMJSWYgeW91IGhhdmUgaXQgaW5zdGFsbGVkLCBhZGQgIi12OS41MiB0byBDRkxBR1MiCisjCisjIE5PVEU6IFFOWCA0LjIzIG9ud2FyZCBkb2VzIG5vdCB3b3JrIG9uIDI4NidzIGFueXdheS4KKyMgU3RhY2tzaXplIDI2MDAwLCBvYmplY3RzIGxhcmdlciB0aGFuIDEwMCBieXRlcyBpbiB0aGVpciBvd24gc2VnbWVudHMsCisjIHN0cmluZyBjb25zdGFudHMgdG8gdGhlIGNvZGVzZWdtZW50LCBldGMuICBGdWxseSBjb25maWd1cmVkIGV4Y2VwdCBqb2IgY3RybC4KKyMgVGhpcyBlbnRyeSB3b3JrcyBmb3IgYnVpbGRpbmcgYSAxNi1iaXQgZXhlY3V0YWJsZSBvbiBhIDMyLWJpdCBzeXN0ZW0sIGJ1dAorIyBoYXMgbm90IGJlZW4gdGVzdGVkIG9uIGEgMTYtYml0IHN5c3RlbS4gIFVzZXMgbGFyZ2UgbWVtb3J5IG1vZGVsLCBsaW5rcworIyBleHBsaWNpdGx5IHdpdGggbGFyZ2UtbW9kZWwgc29ja2V0cyBsaWJyYXJ5LiAgQ29ycmVjdC1tb2RlbCBjdXJzZXMgbGlicmFyeQorIyBpcyBjaG9zZW4gYXV0b21hdGljYWxseS4gIFNlZSBjb21tZW50IGluIHFueDMyIGVudHJ5IGFib3V0IC1ETk9VVUNQLgorIworIyBXQVJOSU5HOgorIworIyBXYXRjb20gQyBwcmlvciB0byAxMC42IG5ldmVyIGhhZCByZWxlYXNlZCBjdXJzZXMgbGlicmFyeS4gVG8gbGluayBhZ2FpbnN0IGl0LAorIyB5b3UgbXVzdCBvYnRhaW4gcG9ydGVkIGZyZWUgY3Vyc2VzIHNvdXJjZSBmcm9tIGZ0cDovL2Z0cC5xbnguY29tL3Vzci9mcmVlLAorIyB0aGVuIGNvbXBpbGUgYW5kIGJ1aWxkIGxpYnJhcnkgKGN1cnNlc2wubGliKSBhbmQgcGxhY2UgaXQgaW4gL3Vzci9saWIuICBZb3UKKyMgbXVzdCBhbHNvIGNvcHkgY3Vyc2VzLmggdG8gL3Vzci9pbmNsdWRlLiAgQmUgYXdhcmUgdGhhdCBpZiB5b3UgaGF2ZSBXYXRjb20KKyMgMTAuNiBpbnN0YWxsZWQsIHlvdSBzaG91bGQgYWxyZWFkeSBoYXZlIGN1cnNlcy5oLCB3aGljaCBpcyB0aGUgbmV3IG5jdXJzZXMKKyMgbGlicmFyeS4gWW91IG11c3QgYmFjayBpdCB1cCBhbmQgdXNlIGZyZWUgY3Vyc2VzLmggaW5zdGVhZCwgc2luY2UgbmN1cnNlcyBpcworIyBvbmx5IGZvciAzMi1iaXQgYXBwbGljYXRpb25zIGFuZCBzb21lIGRlZmluaXRpb25zIGluIHRoZXNlIGZpbGVzIGFyZQorIyBkaWZmZXJlbnQgKGUuZy4sIGNsZWFyb2soKSkuICBGb3Igc2FmZXR5LCBjdXJzZXMgaXMgbm90IGRlZmluZWQgaW4gYnVpbGQuCisjCisjIEluIDcuMCAtRE5PSEVMUCBhZGRlZCB0byBrZWVwIGNrdXVzMi5jIGZyb20gYmxvd2luZyB1cDsgTk9DU0VUUyBhbmQgTk9TUEwKKyMgYWRkZWQgYmVjYXVzZSBja3V1czQgd2FzIGJsb3dpbmcgdXAsIGFuZCBOT0ZMT0FUIGp1c3QgYmVjYXVzZSBpdCBzZWVtZWQKKyMgZGFuZ2Vyb3VzIChyZW1vdmUgLUROT0ZMT0FUIGlmIHlvdSB3YW50IHRvIHRyeSBpdCksIFRoZSByZXN1bHQgd29ya3MgT0sKKyMgZXhjZXB0IGZvciBzb21lIG15c3RlcmlvdXMgYmVlcHMgdXBvbiB0ZXJtaW5hdGlvbiBvZiB0aGUgdG9wLWxldmVsIGtleXdvcmQuCisjCisjIFRoaW5ncyB0byB0cnkgbmV4dCB0aW1lIHdlIGdldCBpbiB0cm91YmxlOgorIyAgLiBDaGFuZ2UgLXp0MTAwIHRvIHNvbWV0aGluZyBzbWFsbGVyIGxpa2UgLXp0MjUKKyMgIC4gQ2hhbmdlIC1PYXR4IHRvIC1PbWlsZXJhdCAoZW5hYmxlIHN0YWNrIGNoZWNraW5nKQorIyAgLiBNYXliZSBnZXQgcmlkIG9mIC12OS41MiAtLSBpdCdzIG9ubHkgdGhlcmUgYmVjYXVzZSB3ZSB3ZXJlIHdhcm5lZC4KKyMKK3FueDE2OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFFOWCA0LjIxLCAxNi1iaXQuLi4nCisJJChNQUtFKSB4ZXJtaXQgXAorCSJMTktGTEFHUyA9IC0yIC1tbCAtTiAyNjAwMCIgXAorCSJDRkxBR1MgPSAtMiAtT2F0eCAtemMgLXp0MTAwIC1tbCAtRFFOWCAtRFFOWDE2IC1ETk9VVUNQIC1ETk9IRUxQIFwKKwktRENLX1JFRElSIC1EU0VMRUNUIC1EU0VMRUNUX0ggLUROT0pDIC1ETk9HRVRVU0VSU0hFTEwgLUROT0NTRVRTIFwKKwktdjkuNTIgLURUQ1BTT0NLRVQgLURDS19SVFNDVFMgLURDS19BTlNJQyAtRE5PSU5JVEdST1VQUyAtRE5PS1ZFUkJTIFwKKwktRE5PUkFORE9NIC1ETk9DU0VUUyAtRE5PU1BMIC1ETk9GTE9BVCAtRFBJRF9UPXBpZF90ICQoS0ZMQUdTKSIKKworIyBRTlggNC4xLCAxNi1iaXQgdmVyc2lvbiwgd2l0aCBXYXRjb20gQyA4LjUgb24gaTI4NiBQQ3MgYW5kIGFib3ZlLgorIyBzdGFja3NpemUgMjYwMDAsIG9iamVjdHMgbGFyZ2VyIHRoYW4gMTAwIGJ5dGVzIGluIHRoZWlyIG93biBzZWdtZW50cywKKyMgc3RyaW5nIGNvbnN0YW50cyB0byB0aGUgY29kZXNlZ21lbnQsIGV0Yy4gIEFkZCAtRE5PVVVDUCBpZiBkZXNpcmVkLgorcW54MTZfNDE6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgUU5YIDQuMSwgMTYtYml0Li4uJworCSQoTUFLRSkgeGVybWl0IFwKKwkiTE5LRkxBR1MgPSAtbWggLU4gMjYwMDAiICJDRkxBR1MgPSAtV2MsLWZwYyAtV2MsLWogLUROT0dFVFVTRVJTSEVMTCBcCisJLVdjLC1PbHMgLVdjLC16ZGYgLVdjLC16YyAtV2MsLXp0MTAwIC1taCAtRFBPU0lYIC1EUU5YIC1ERElSRU5UIFwKKwktRE5PQ1lSSUwgLUROT0RFQlVHIC1ETk9NU0VORCAtRE1JTklESUFMIC1ETk9YTUlUIC1ETk9TQ1JJUFQgLUROT1NQTCBcCisJLUROT1NFVEtFWSAtRE5PSU5JVEdST1VQUyAtRFFOWDE2IC1EUElEX1Q9cGlkX3QgJChLRkxBR1MpIgorCisjIFFOWCBOZXV0cmlubyAyIChwd2FlY2h0bGVyQHFueC5kZSkgY3Jvc3Njb21waWxlZCBvbiBRTlggNC4yNS4KKyMgR2V0cyBsb3RzIG9mIGNvbXBpbGVyIHdhcm5pbmdzLgorcW54X250bzIrOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFFOWCBOZXV0cmlubyAyKyAnCisJY2MgLW8gd2FydCBja3dhcnQuYworCSQoTUFLRSkgeGVybWl0IFwKKwkiQ0MgPSBxY2MgLVZnY2NfbnRveDg2IiBcCisJIkNDMiA9IHFjYyAtVmdjY19udG94ODYiIFwKKwkiTE5LRkxBR1MgPSAiIFwKKwkiQ0ZMQUdTID0gLURORVVUUklOTyAtRFRDUFNPQ0tFVCAtRENLX0NVUlNFUyAtRE5PR0VUVVNFUlNIRUxMIFwKKwktRE5PVVVDUCAtRENLX1dSRUZSRVNIIC1EQ0tfUkVESVIgLURTRUxFQ1QgLURTRUxFQ1RfSCAtRENLX1JUU0NUUyBcCisJLUROT0pDIC1ETk9JTklUR1JPVVBTIC1EQ0tfQU5TSUMgLURQSURfVD1waWRfdCAtRFVOSVggLURESVJFTlQgXAorCS1ETVlSRUFEIC1EQlNENDRPUlBPU0lYIC1EU1ZPUlBPU0lYIC1ETkRHUFdOQU0gJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sc29ja2V0IC1sbmN1cnNlcyAiCisKKyMgUU5YIDYgKD0gTmV1dHJpbm8gMi54eCkgbmF0aXZlIGJ1aWxkIChraXJ1c3NlbEBjaXNjby5jb20pLgorcW54NjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBRTlg2JworCSQoTUFLRSkgeGVybWl0IEtUQVJHRVQ9UU5YNiBcCisJIkNGTEFHUyA9IC1EUE9TSVggLURDS19QT1NJWF9TSUcgLURORVRQVFkgLUROT0FSUk9XS0VZUyBcCisJLURVU0VfVElPQ1NEVFIgLURCSUdCVUZPSyAtRENLTUFYT1BFTj0xMDAgLURSTE9HQ09ERSAtRE5PUkVBTFBBVEggXAorCS1ETUFYTkFNTEVOPTQ4IC1EUU5YNiAtRFVTRV9URVJNSU8gLURJTklUX1NQVFkgXAorCS1EQ0tfQ1VSU0VTIC1EQ0tfV1JFRlJFU0ggLURDS19ORVdURVJNIC1ERFlOQU1JQyBcCisJLURUQ1BTT0NLRVQgLUROT0dFVFVTRVJTSEVMTCAtRENLX1JFRElSIC1EU0VMRUNUIC1EU0VMRUNUX0ggXAorCS1EQ0tfUlRTQ1RTIC1ETk9KQyAtRFNWT1JQT1NJWCAtREJTRDQ0T1JQT1NJWCAtRE5PVVVDUCAtRENLX0FOU0lDIFwKKwkkKEtGTEFHUykgLU8iIFwKKwkiTElCUz0gLWxzb2NrZXQgIC1sbmN1cnNlcyIKKworI1JpZGdlIDMyIHdpdGggUk9TIDMuMgorcmlkZ2UzMjoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIFJpZGdlIDMyIFJPUyAzLjInCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1MgPSAtREFUVFNWIC1ETk9GSUxFSCAtRE5PREVCVUcgLUROT1RMT0cgJChLRkxBR1MpIC1pIC1PIiBcCisJIkxOS0ZMQUdTID0gLWkiCisKKyNBbHRvcyA0ODYsIDU4Niwgb3IgOTg2IHdpdGggWGVuaXggMy4wCithbHRvczoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBBbHRvcyB4ODYgd2l0aCBYZW5peCAzLjAuLi4nCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1M9IC1EQVRUU1YgLURBOTg2IC1ETk9ERUJVRyAtRE5PVExPRyAkKEtGTEFHUykgLWkgLU8iIFwKKwkiTE5LRkxBR1M9IC1pIgorCisjQWx0b3MgOTg2IHdpdGggWGVuaXggMy4wLCBhcyBhYm92ZSwgYnV0IGNvbW1hbmQtbGluZSBvbmx5LCBtaW5pbWFsIHNpemUuCisjRm9yIHN5c3RlbXMgd2l0aCBzbWFsbCBtZW1vcmllcy4gIEl0IG1pZ2h0IGFsc28gYmUgbmVjZXNzYXJ5IHRvIGNob3AgY2VydGFpbgorI21vZHVsZXMgdXAgaW50byBzbWFsbGVyIHBpZWNlcywgZS5nLiBja3V1czMtNiwgYmVjYXVzZSBvZiBzeW1ib2wgdGFibGUKKyNvdmVyZmxvdy4gICBJZiB0aGlzIG1ha2VmaWxlIGlzIHRvbyBiaWcgb3IgY29tcGxleCBmb3IgdGhlIEFsdG9zLCBjb21waWxlCisjYW5kIGxpbmsgYnkgaGFuZCBvciB3cml0ZSBzaGVsbCBzY3JpcHRzLgorYWx0b3NjOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEFsdG9zIHg4NiBYZW5peCAzLjAsIHJlbW90ZS4uLicKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUz0gLURBVFRTViAtREE5ODYgLUROT0RFQlVHIC1ETk9UTE9HIC1ETk9TQ1JJUFQgLUROT0RJQUwgXAorCS1ETk9DU0VUUyAtRE5PQU5TSSAtRE5PTVNFTkQgLUROT1NQTCAtRE5PSUNQICQoS0ZMQUdTKSAtTW0gLU8iIFwKKwkiTE5LRkxBR1M9IC1NbSAtcyIKKworI0FsdG9zIDk4NiB3aXRoIFhlbml4IDMuMCwgYXMgYWJvdmUsIGJ1dCBpbnRlcmFjdGl2ZSBvbmx5LCBtaW5pbWFsIHNpemUuCithbHRvc2k6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQWx0b3MgeDg2IFhlbml4IDMuMCwgbG9jYWwuLi4nCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1M9IC1EQVRUU1YgLURBOTg2IC1ETk9ERUJVRyAtRE5PVExPRyAtRE5PU0NSSVBUIC1ETk9ESUFMIFwKKwktRE5PQ1NFVFMgLUROT0FOU0kgLUROT01TRU5EIC1ETk9TUEwgLUROT0NNREwgLUROT0ZSSUxMUyAtRE5PSEVMUCBcCisJLUROT1NFVEtFWSAkKEtGTEFHUykgLU1tIC1PIiAiTE5LRkxBR1M9IC1NbSAtcyIKKworIyBBbHRvcyBBQ1M2ODAwMCA2ODAwMCBTeXN0ZW0sIFVOSVggU3lzdGVtIDMgUmVsZWFzZSAyLCA1MTJrIG1lbW9yeS4KKyMgYWxzbyBuZWVkcyBnZXRjd2QoKSBleHRlcm5hbCBmdW5jdGlvbjsgc2VlIGNrdWlucy50eHQgZmlsZS4KKyMgYWxzbywgc3lzL3R5cGVzLmggbmVlZGVkIG1vZGlmeWluZzoKKyMgICAjaWZkZWYgX19TWVNfVFlQRVNfSF9fLCAjZGVmaW5lIC4uLiwgI2VuZGlmCisjIGFsc28sIGNrdXVzMi5jIE1VU1QgYmUgY29tcGlsZWQgTk9PUFQgZWxzZSBzeW1ib2wgdGFibGUgaXMgZGVzdHJveWVkIQorIyBTdWJtaXNzaW9uIGJ5IFJvYmVydCBXZWluZXIvUHJvZ3JhbW1pbmcgUGx1cywgcndlaW5lckBwcm9ncGx1cy5jb20uCisjCithbHRvczM6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgQWx0b3MgQUNTNjhrIFVOSVggU3lzdGVtIElJSScKKwkkKE1BS0UpIGNrdXVzMi4kKEVYVCkgIkNGTEFHUyA9IC1EQVRUU1YgLUROT0NTRVRTIC1ETk9TRVRLRVkgLUROT0pDIFwKKwktRE5PRElBTCAtRERDTFBPUEVOIC1ETk9TQ1JJUFQgLUROT0hFTFAgJChLRkxBR1MpIC1pIgorCSQoTUFLRSkgd2VybWl0IFwKKwkiQ0ZMQUdTID0gLURBVFRTViAtRE5PQ1NFVFMgLUROT1NFVEtFWSAtRE5PSkMgXAorCS1ETk9ESUFMIC1ERENMUE9QRU4gLUROT1NDUklQVCAtRE5PSEVMUCAkKEtGTEFHUykgLWkgLU8iIFwKKwkiTE5LRkxBR1MgPSAtaSIgIkxJQlMgPSBnZXRjd2QuJChFWFQpIgorCisjTUlOSVggLSBPcmlnaW5hbCBQQyB2ZXJzaW9uIHdpdGggNjRLKzY0SyBsaW1pdC4KKyMgUmVwb3J0ZWRseSwgdGhlIGxpbmtlciAoYXNsZCkgY2FuIHJ1biBvdXQgb2Ygc3BhY2Ugd2hpbGUgbGlua2luZy4gIFRoZSBvbmx5CisjIHdheSBhcm91bmQgdGhpcyBpcyB0byBtYWtlIGEgY29weSBvZiBsaWJjLmEgZnJvbSB3aGljaCBhbGwgbW9kdWxlcyB0aGF0IGFyZQorIyBub3QgdXNlZCBieSBLZXJtaXQgYXJlIHJlbW92ZWQuICBJZiB5b3UgaGF2ZSB0cm91YmxlIGNvbXBpbGluZyBvciBydW5uaW5nCisjIHdhcnQsICJ0b3VjaCB3YXJ0Ii4gIElmIHRoYXQgZG9lc24ndCBoZWxwLCAidG91Y2ggY2tjcHJvLmMiLgorIyBUaGUgdmVyc2lvbiBjb25maWd1cmVkIGJlbG93IGhhcyBubyBpbnRlcmFjdGl2ZSBjb21tYW5kIHBhcnNlci4KKyMgSWYgeW91IGNhbiBidWlsZCB0aGlzIHZlcnNpb24gc3VjY2Vzc2Z1bGx5LCBtYXliZSB0aGVyZSB3aWxsIGJlIHJvb20gZm9yCisjIGEgbWluaW1hbCBpbnRlcmFjdGl2ZSBjb21tYW5kIHBhcnNlciB0b287IHRyeSByZXBsYWNpbmcgLUROT0lDUCB3aXRoCisjIC1ETk9TUEwsIHBsdXMgZXZlcnkgb3RoZXIgLUROT3h4eCBmbGFnIHRoZXJlIGlzLCBleGNlcHQgZm9yIC1ETk9JQ1AKKyMgKHNlZSBja2NjZmcudHh0KS4KK21pbml4OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE1JTklYLCBubyBjb21tYW5kIHBhcnNlci4uLgorCUBlY2hvICdUT1RBTExZIFVOVEVTVEVEIScKKwkkKE1BS0UpIHdlcm1pdCBFWFQ9cyBcCisJIkNGTEFHUz0gLURWNyAtRE1JTklYIC1pIC1EX01JTklYIC1EX1BPU0lYX1NPVVJDRSBcCisJLURQSURfVD1waWRfdCAtRFVJRF9UPXVpZF90IC1ER0lEX1Q9Z2lkX3QgLURTSUdfViBcCisJLUROT1hNSVQgLUROT01TRU5EIC1ETk9GUklMTFMgLUROT0RJQUwgLUROT0hFTFAgLUROT0RFQlVHIC1ETk9UTE9HIFwKKwktRE5PU0NSSVBUIC1ETk9DU0VUUyAtRE5PSUNQIC1ETk9TRVRLRVkgJChLRkxBR1MpIiBcCisJIkxOS0ZMQUdTPSAtaSAtVCIKKworI01JTklYIC0gUEMgdmVyc2lvbiB3aXRoIDY0Sys2NEsgbGltaXQsIG5ldyAoYXMgeWV0IHVucmVsZWFzZWQpIEFDSyAyLjAgYmV0YSBDCisjY29tcGlsZXIsIHdoaWNoIG91dHB1dHMgLm8gb2JqZWN0IGZpbGVzLCByYXRoZXIgdGhhbiAucy4gIEJ1dCAnbWFrZScgc3RpbGwKKyNleHBlY3RzIC5zIGZpbGVzLCBzbyBtdXN0IGJlIHBhdGNoZWQgdG8gdXNlIC5vLiAgVGVzdGVkIG9uIE1pbml4IDEuNS4xMC4KK21pbml4bmV3OgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIE1JTklYIChuZXcgQUNLIDIuMCBjb21waWxlciksJworCUBlY2hvICdubyBjb21tYW5kIHBhcnNlci4uLiAgVE9UQUxMWSBVTlRFU1RFRCEnCisJJChNQUtFKSB3ZXJtaXQgXAorCSJDRkxBR1M9IC1EVjcgLURNSU5JWCAtaSAtRF9NSU5JWCAtRF9QT1NJWF9TT1VSQ0UgXAorCS1EUElEX1Q9cGlkX3QgLURVSURfVD11aWRfdCAtREdJRF9UPWdpZF90IC1EU0lHX1YgLUROT0RJQUwgXAorCS1ETk9IRUxQIC1ETk9ERUJVRyAtRE5PVExPRyAtRE5PU0NSSVBUIC1ETk9DU0VUUyAtRE5PSUNQICQoS0ZMQUdTKSIgXAorCSJMTktGTEFHUz0gLWkgLVQiCisKKyNQRlUgQ29tcGFjdCBBIFNlcmllcyBVTklYIFN5c3RlbSBWIFIzLCBTWC9BIFRJU1AgVjEwL0w1MCAoSmFwYW4pCisjTWF5YmUgdGhlIC1pIGxpbmsgb3B0aW9uIHNob3VsZCBiZSByZW1vdmVkPworc3hhZTUwOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFBGVSBTWC9BIFYxMC9MNTAuLi4nCisJJChNQUtFKSB4ZXJtaXQgXAorCSJDRkxBR1M9IC1EU1ZSMyAtRERJUkVOVCAtRHN4YUU1MCAtRFRDUFNPQ0tFVCAkKEtGTEFHUykgLWkgLU8iIFwKKwkiTE5LRkxBR1M9ICIKKworI1Rla3Ryb25peCA2MTMwLCA0MzE5LCA0MzAxLCBldGMsIHdpdGggVVRlayBPUywgL3Vzci9zcG9vbC91dWNwL0xDSy4vLi4uCisjVGhlIG1vZGVscyB0aGF0IHN1cHBvcnQgaGFyZHdhcmUgZmxvdyBjb250cm9sLgordXRlazoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciA0LjJCU0QvVVRlaywgaGFyZHdhcmUgZmxvdyBjb250cm9sJworCSQoTUFLRSkgd2VybWl0IFwKKwkiQ0ZMQUdTPSAtTyAtRExDS0RJUiAtREJTRDQgLURUQ1BTT0NLRVQgXAorCS1EVVRFSyAtRERDTFBPUEVOIC1ETE9DS19ESVI9XFxcIi91c3Ivc3Bvb2wvdXVjcC9MQ0suXFxcIiBcCisJLURUUk1CVUZMPTIwNDggLURDS19EVFJDVFMgJChLRkxBR1MpIgorCisjVGVrdHJvbml4IDQzMTUsIDQzMTYsIDQzMTcgd2l0aCBVVGVrIE9TLCAvdXNyL3Nwb29sL3V1Y3AvTENLLi8uLi4KKyNUaGUgbW9kZWxzIHRoYXQgZG8gbm90IGZ1bGx5IHN1cHBvcnQgaGFyZHdhcmUgZmxvdyBjb250cm9sLgordXRla25vaHdmYzoKKwlAZWNobyAnTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciA0LjJCU0QvVVRlaywgbm8gaC93IGZsb3cgY29udHJvbCcKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUz0gLU8gLURMQ0tESVIgLURCU0Q0IC1EVENQU09DS0VUIFwKKwktRFVURUsgLUREQ0xQT1BFTiAtRExPQ0tfRElSPVxcXCIvdXNyL3Nwb29sL3V1Y3AvTENLLlxcXCIgXAorCS1EVFJNQlVGTD0yMDQ4ICQoS0ZMQUdTKSIKKworI1Rla3Ryb25peCBYRDg4IHdpdGggIFVUZWtWIE9TCit1dGVrdnIzOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIFRla3Ryb25peCBYRDg4IFVUZWtWIFIzLi4uJworCSQoTUFLRSkgd2VybWl0IFwKKwkiQ0ZMQUdTPSAtRFNWUjMgLURESVJFTlQgLURIREJVVUNQIFwKKwktRFRDUFNPQ0tFVCAtRFNZU1VUSU1FSCAtRENLX0NVUlNFUyAkKEtGTEFHUykgLU8iIFwKKwkiTElCUz0gLWxjdXJzZXMiICJMTktGTEFHUz0gLXMiCisKKyNQZXJraW4tRWxtZXIgMzIwMCBYZWxvcyBSMDIgb3IgZWFybGllcgorY2NvcDE6CisJQGVjaG8gJ01ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgWGVsb3MgJiBQdWJsaWMgRG9tYWluIERpcmVudCBjYWxscycKKwlAZWNobyAnb3IgU3lzdGVtIFYgUjIgb3IgZWFybGllci4uLicKKwkkKE1BS0UpIHdlcm1pdCBcCisJIkNGTEFHUyA9IC1EQVRUU1YgLUR2b2lkPWludCAtRERJUkVOVCAtRENLX0NVUlNFUyBcCisJJChLRkxBR1MpIC1PIiAiTE5LRkxBR1MgPSIgIkxJQlM9IC1sY3Vyc2VzIC1sdGVybWxpYiIKKworI0VuY29yZSwgVU1BWCA0LjMgKEJTRCkgYnV0IHdpdGhvdXQgYWN1Y250cmwgcHJvZ3JhbS4KK2VuY29yZToKKwkkKE1BS0UpICJNQUtFPSQoTUFLRSkiIHVtYXg0MyAiS0ZMQUdTPSQoS0ZMQUdTKSIKKworI0VuY29yZSwgYXMgYWJvdmUsIGJ1dCB3aXRoIGN1cnNlcyBmaWxlIHRyYW5zZmVyIGRpc3BsYXkgaW5jbHVkZWQuCitlbmNvcmVjOgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgdW1heDQzICJLRkxBR1M9LURDS19DVVJTRVMgJChLRkxBR1MpIiBcCisJIkxJQlM9IC1sY3Vyc2VzIC1sdGVybWNhcCIKKworI0VuY29yZSwgVU1BWCA0LjMgKEJTRCkgYnV0IHdpdGhvdXQgYWN1Y250cmwgcHJvZ3JhbS4KK3VtYXg0MzoKKwlAZWNobyBNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEVuY29yZSBVTUFYIDQuMy4uLgorCSQoTUFLRSkgIk1BS0U9JChNQUtFKSIgUEFSQUxMRUw9NCB4ZXJtaXQgXAorCSJDRkxBR1M9IC1EQlNENDMgLURFTkNPUkUgLURUQ1BTT0NLRVQgJChLRkxBR1MpIC1PIgorCisjRW5jb3JlLCBVTUFYIDQuMiAoQlNEKQordW1heDQyOgorCUBlY2hvIE1ha2luZyBDLUtlcm1pdCAkKENLVkVSKSBmb3IgRW5jb3JlIFVNQVggNC4yLi4uCisJJChNQUtFKSAiTUFLRT0kKE1BS0UpIiBQQVJBTExFTD00IHhlcm1pdCBcCisJIkNGTEFHUz0gLURCU0Q0IC1ERU5DT1JFIC1EVENQU09DS0VUICQoS0ZMQUdTKSAtTyIKKworI0VuY29yZSA4OEsgVU1BWCA1LjMgd2l0aCBUQ1AvSVAgc3VwcG9ydAorZW5jb3JlODhrOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEVuY29yZSA4OEsgVU1BWCBWLCBUQ1AvSVAuLi4nCisJJChNQUtFKSB4ZXJtaXQgXAorCSJDRkxBR1MgPSAtcSBleHQ9cGNjIC1EU1ZSMyAtRFRDUFNPQ0tFVCAtRERJUkVOVCBcCisJLUROT0dFVElEX1BST1RPUyAtREhEQlVVQ1AgJChLRkxBR1MpIC1PIiAiTE5LRkxBR1MgPSIKKworI0VuY29yZSA4OEsgVU1BWCA1LjMgd2l0aCBUQ1AvSVAgc3VwcG9ydAorZW5jb3JlODhrZ2NjOgorCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIEVuY29yZSA4OEsgVU1BWCBWLCBUQ1AvSVAsIGdjYy4uLicKKwkkKE1BS0UpIHhlcm1pdCBDQz1nY2MgQ0MyPWdjYyBcCisJIkNGTEFHUyA9IC1EU1ZSMyAtRFRDUFNPQ0tFVCAtRERJUkVOVCBcCisJLUROT0dFVElEX1BST1RPUyAtREhEQlVVQ1AgJChLRkxBR1MpIC1PIiAiTE5LRkxBR1MgPSIKKworI1NPTlkgTkVXUywgTkVXUy1PUyA0LjAxQworc29ueW5ld3M6CisJQGVjaG8gTWFraW5nIEMtS2VybWl0ICQoQ0tWRVIpIGZvciBTT05ZIE5FV1MtT1MgNC4wMUMuLi4KKwkkKE1BS0UpIHhlcm1pdCAiQ0ZMQUdTPSAtREJTRDQzIC1EQUNVQ05UUkwgLURUQ1BTT0NLRVQgLU8iCisKKyNSdW4gTGludCBvbiB0aGlzIG1lc3MgZm9yIHNlbGVjdGVkIHZlcnNpb25zLgorI1RoZXNlIGFyZSBwcmV0dHkgbXVjaCBvYnNvbGV0ZSBzaW5jZSBBTlNJIEMgLyBnY2MuCitsaW50c3VuOgorCUBlY2hvICdSdW5uaW5nIExpbnQgb24gQy1LZXJtaXQgJChDS1ZFUikgc291cmNlcyBmb3IgU3VuT1MgdmVyc2lvbi4uLicKKwlsaW50IC14IC1EU1VOT1M0IC1ERElSRU5UIC1EVENQU09DS0VUIC1EU0FWRURVSUQgXAorCWNrW2N1XSouYyA+IGNrdWtlci5saW50LnN1bgorCitsaW50YnNkOgorCUBlY2hvICdSdW5uaW5nIExpbnQgb24gQy1LZXJtaXQgJChDS1ZFUikgc291cmNlcyBmb3IgQlNEIDQuMiB2ZXJzaW9uLi4nCisJbGludCAteCAtREJTRDQgLURUQ1BTT0NLRVQgY2tbY3VdKi5jID4gY2t1a2VyLmxpbnQuYnNkNDIKKworbGludHM1OgorCUBlY2hvICdSdW5uaW5nIExpbnQgb24gQy1LZXJtaXQgJChDS1ZFUikgc291cmNlcyBmb3IgU3lzIFYgdmVyc2lvbi4uLicKKwlsaW50IC14IC1EQVRUU1YgY2tbY3VdKi5jID4gY2t1a2VyLmxpbnQuczUKKworI1dobyByZW1lbWJlcnMgVEVDTz8KK2xvdmU6CisJQGVjaG8gJ05vdCB3YXI/JwpkaWZmIC0tZ2l0IGEvY2tlcm1pdC5wYXRjaGVzL2NrZXJtaXQtNTAuZGVzY3JpcHRpb24gYi9ja2VybWl0LnBhdGNoZXMvY2tlcm1pdC01MC5kZXNjcmlwdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDQ3NzJiCi0tLSAvZGV2L251bGwKKysrIGIvY2tlcm1pdC5wYXRjaGVzL2NrZXJtaXQtNTAuZGVzY3JpcHRpb24KQEAgLTAsMCArMSBAQAorVGhpcyBwYXRjaCBjcmVhdGVzIGEgdGFyZ2V0IHRoYXQgYWxsb3dzIGMta2VybWl0IHRvIGJlIGNyb3NzLWNvbXBpbGVkIGZvciBhIGxpbnV4IHRhcmdldCBvbiBhIGxpbnV4IGhvc3QuCmRpZmYgLS1naXQgYS9ja2VybWl0LnBhdGNoZXMvY2tlcm1pdC01MC5wYXRjaCBiL2NrZXJtaXQucGF0Y2hlcy9ja2VybWl0LTUwLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNjk4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LnBhdGNoZXMvY2tlcm1pdC01MC5wYXRjaApAQCAtMCwwICsxLDQ4IEBACistLS0gYS9tYWtlZmlsZQkyMDA0LTA0LTE3IDExOjUyOjAwLjAwMDAwMDAwMCAtMDcwMAorKysrIGIvbWFrZWZpbGUJMjAxMi0wNS0yNCAxMTozMjo1OC42NTY2MTg5MzYgLTA3MDAKK0BAIC05NjYsNyArOTY2LDcgQEAKKyAJCWVsc2VcCisgCQkJZWNobyAiQ3JlYXRpbmcgJChERVNURElSKS4uLiI7XAorIAkJCURFU1RESVI9YGVjaG8gJChERVNURElSKSB8IHNlZCAncyEvKiQkISEnYDtcCistCQkJbWtkaXIgJCRERVNURElSICB8fCBleGl0IDE7XAorKwkJCW1rZGlyIC1wICQkREVTVERJUiAgfHwgZXhpdCAxO1wKKyAJCWZpO1wKKyAJCWNobW9kIDc1NSAkKERFU1RESVIpIHx8IGV4aXQgMTtcCisgCWZpO1wKK0BAIC05ODUsMTQgKzk4NSwxNCBAQAorIAkJZWNobyAgIiQoREVTVERJUikkKEJJTkRJUikgZXhpc3RzLi4uIjtcCisgCWVsc2VcCisgCQllY2hvICJDcmVhdGluZyAkKERFU1RESVIpJChCSU5ESVIpLy4uLiI7XAorLQkJbWtkaXIgICAgICQoREVTVERJUikkKEJJTkRJUikgfHwgZXhpdCAxO1wKKysJCW1rZGlyIC1wICAkKERFU1RESVIpJChCSU5ESVIpIHx8IGV4aXQgMTtcCisgCQljaG1vZCA3NTUgJChERVNURElSKSQoQklORElSKTtcCisgCWZpO1wKKyAJcm0gLWYgJChERVNURElSKSQoQklORElSKS9rZXJtaXQ7XAorIAljcCAkKEJJTkFSWSkgJChERVNURElSKSQoQklORElSKS9rZXJtaXQgfHwgZXhpdCAxO1wKKyAJY2htb2QgNzU1ICAgICQoREVTVERJUikkKEJJTkRJUikva2VybWl0IHx8IGV4aXQgMTtcCisgCXJtIC1mICAgICAgICAkKERFU1RESVIpJChCSU5ESVIpL2tlcm1pdC1zc2hzdWI7XAorLQlsbiAtcyAgICAgICAgJChERVNURElSKSQoQklORElSKS9rZXJtaXRcCisrCWxuIC1zICAgICAgICBrZXJtaXRcCisgCQkgICAgICQoREVTVERJUikkKEJJTkRJUikva2VybWl0LXNzaHN1YiB8fCBleGl0IDE7XAorIAllY2hvICdzZXQgZmxhZz1mXG5QckMgUmVtb3ZpbmcgYmluYXJpZXMnID4mMztcCisgCWVjaG8gIlJtRiAkKERFU1RESVIpJChCSU5ESVIpL2tlcm1pdC1zc2hzdWIiID4mMztcCitAQCAtNTQ1MCw2ICs1NDUwLDE5IEBACisgCS1EQ0tfTkVXVEVSTSAtRFRDUFNPQ0tFVCAtRExJTlVYRlNTVE5EIC1ETk9DT1RGTUMgLURQT1NJWCBcCisgCS1EVVNFX1NUUkVSUk9SICQoS0ZMQUdTKSIgIkxOS0ZMQUdTID0gJChMTktGTEFHUykiICJMSUJTID0gJChMSUJTKSAtbG0iCisgCisrbGludXgtY3Jvc3M6CisrCUBlY2hvICdNYWtpbmcgQy1LZXJtaXQgJChDS1ZFUikgZm9yIExpbnV4IChjcm9zcy1jb21waWxlZCkuLi4nCisrCWdjYyAtbyBja3dhcnQubyAtYyBja3dhcnQuYworKwlnY2MgLW8gd2FydCBja3dhcnQubworKwkkKE1BS0UpIHhlcm1pdCBLVEFSR0VUPSQke0tUQVJHRVQ6LSQoQCl9IFwKKysJIkNDID0gJChDQykiICJDQzIgPSAkKENDKSIgIkhPU1RDQyA9IGdjYyIgXAorKwkiQ0ZMQUdTID0gLU8gLURMSU5VWCAtcGlwZSAtZnVuc2lnbmVkLWNoYXIgLURGTkZMT0FUIC1EQ0tfUE9TSVhfU0lHIFwKKysJLURDS19OQ1VSU0VTIC1ESEFWRV9QVE1YIFwKKysJLURDS19ORVdURVJNIC1EVENQU09DS0VUIC1ETElOVVhGU1NUTkQgLUROT0NPVEZNQyAtRFBPU0lYIFwKKysJLURVU0VfU1RSRVJST1IgJChOQ1VSU0VTX0NQUEZMQUdTKSAkKEtGTEFHUykiIFwKKysJIkxOS0ZMQUdTID0gJChOQ1VSU0VTX0xERkxBR1MpICQoTE5LRkxBR1MpIiBcCisrCSJMSUJTID0gJChMSUJTKSAtbG5jdXJzZXMgLWxyZXNvbHYgLWxjcnlwdCAtbG0iCisrCisgIyBBcyBhYm92ZSBidXQgd2l0aCBwcm9maWxpbmcKKyBsaW51eHA6CisgCSQoTUFLRSkgbGludXhhIEtUQVJHRVQ9JCR7S1RBUkdFVDotJChAKX0gIktGTEFHUz0kKEtGTEFHUykgLXBnIiBcCmRpZmYgLS1naXQgYS9ja2VybWl0LnRhci5neiBiL2NrZXJtaXQudGFyLmd6Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OWRlNzcKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LnRhci5negpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ja2VybWl0LnVybCBiL2NrZXJtaXQudXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNTFjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9ja2VybWl0LnVybApAQCAtMCwwICsxIEBACitmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9hcmNoaXZlcy9ja3UyMTEudGFyLmd6CmRpZmYgLS1naXQgYS9ja2VybWl0LnZlcnNpb24gYi9ja2VybWl0LnZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjOTkyMAotLS0gL2Rldi9udWxsCisrKyBiL2NrZXJtaXQudmVyc2lvbgpAQCAtMCwwICsxIEBACis4LjAuMjExCg==